From 38be0d13830efd2d98281c645c3a60afe05ffece Mon Sep 17 00:00:00 2001 From: Qt by Nokia Date: Wed, 27 Apr 2011 12:05:43 +0200 Subject: Initial import from the monolithic Qt. This is the beginning of revision history for this module. If you want to look at revision history older than this, please refer to the Qt Git wiki for how to use Git history grafting. At the time of writing, this wiki is located here: http://qt.gitorious.org/qt/pages/GitIntroductionWithQt If you have already performed the grafting and you don't see any history beyond this commit, try running "git log" with the "--follow" argument. Branched from the monolithic repo, Qt master branch, at commit 896db169ea224deb96c59ce8af800d019de63f12 --- src/3rdparty/.gitattributes | 19 + src/3rdparty/Makefile | 9 + src/3rdparty/README | 23 + src/3rdparty/ce-compat/ce_time.c | 677 + src/3rdparty/ce-compat/ce_time.h | 25 + src/3rdparty/des/des.cpp | 602 + src/3rdparty/easing/easing.cpp | 670 + src/3rdparty/easing/legal.qdoc | 35 + src/3rdparty/fonts/5x7.bdf | 24999 + src/3rdparty/fonts/6x13.bdf | 75535 ++ src/3rdparty/fonts/COPYING.Cursor | 1 + src/3rdparty/fonts/COPYING.Helvetica | 19 + src/3rdparty/fonts/COPYING.Utopia | 16 + src/3rdparty/fonts/COPYRIGHT.BH | 42 + src/3rdparty/fonts/COPYRIGHT.Charter | 11 + src/3rdparty/fonts/COPYRIGHT.Courier | 11 + src/3rdparty/fonts/COPYRIGHT.DejaVu | 98 + src/3rdparty/fonts/COPYRIGHT.IBM | 9 + src/3rdparty/fonts/COPYRIGHT.Unifont | 7 + src/3rdparty/fonts/COPYRIGHT.Vera | 124 + src/3rdparty/fonts/README.DejaVu | 59 + src/3rdparty/fonts/helvB08.bdf | 2604 + src/3rdparty/fonts/helvB10.bdf | 2867 + src/3rdparty/fonts/helvB12.bdf | 3057 + src/3rdparty/fonts/helvB14.bdf | 3319 + src/3rdparty/fonts/helvB18.bdf | 3864 + src/3rdparty/fonts/helvB24.bdf | 4718 + src/3rdparty/fonts/helvBO08.bdf | 2597 + src/3rdparty/fonts/helvBO10.bdf | 2863 + src/3rdparty/fonts/helvBO12.bdf | 3056 + src/3rdparty/fonts/helvBO14.bdf | 3325 + src/3rdparty/fonts/helvBO18.bdf | 3853 + src/3rdparty/fonts/helvBO24.bdf | 4709 + src/3rdparty/fonts/helvO08.bdf | 2601 + src/3rdparty/fonts/helvO10.bdf | 2869 + src/3rdparty/fonts/helvO12.bdf | 3042 + src/3rdparty/fonts/helvO14.bdf | 3310 + src/3rdparty/fonts/helvO18.bdf | 3837 + src/3rdparty/fonts/helvO24.bdf | 4713 + src/3rdparty/fonts/helvR08.bdf | 2595 + src/3rdparty/fonts/helvR10.bdf | 2864 + src/3rdparty/fonts/helvR12.bdf | 3046 + src/3rdparty/fonts/helvR14.bdf | 3313 + src/3rdparty/fonts/helvR18.bdf | 3861 + src/3rdparty/fonts/helvR24.bdf | 4715 + src/3rdparty/fonts/micro.bdf | 1548 + src/3rdparty/fonts/unifont.bdf | 801998 ++++++++++++++++++ src/3rdparty/freetype/ChangeLog | 4956 + src/3rdparty/freetype/ChangeLog.20 | 2613 + src/3rdparty/freetype/ChangeLog.21 | 9439 + src/3rdparty/freetype/ChangeLog.22 | 2837 + src/3rdparty/freetype/Jamfile | 203 + src/3rdparty/freetype/Jamrules | 71 + src/3rdparty/freetype/Makefile | 34 + src/3rdparty/freetype/README | 64 + src/3rdparty/freetype/README.CVS | 46 + src/3rdparty/freetype/autogen.sh | 162 + src/3rdparty/freetype/builds/amiga/README | 110 + .../amiga/include/freetype/config/ftconfig.h | 55 + .../amiga/include/freetype/config/ftmodule.h | 160 + src/3rdparty/freetype/builds/amiga/makefile | 294 + src/3rdparty/freetype/builds/amiga/makefile.os4 | 297 + src/3rdparty/freetype/builds/amiga/smakefile | 297 + .../freetype/builds/amiga/src/base/ftdebug.c | 279 + .../freetype/builds/amiga/src/base/ftsystem.c | 522 + src/3rdparty/freetype/builds/ansi/ansi-def.mk | 74 + src/3rdparty/freetype/builds/ansi/ansi.mk | 21 + src/3rdparty/freetype/builds/atari/ATARI.H | 16 + src/3rdparty/freetype/builds/atari/FNames.SIC | 37 + src/3rdparty/freetype/builds/atari/FREETYPE.PRJ | 32 + src/3rdparty/freetype/builds/atari/README.TXT | 51 + src/3rdparty/freetype/builds/beos/beos-def.mk | 76 + src/3rdparty/freetype/builds/beos/beos.mk | 19 + src/3rdparty/freetype/builds/beos/detect.mk | 41 + src/3rdparty/freetype/builds/compiler/ansi-cc.mk | 80 + src/3rdparty/freetype/builds/compiler/bcc-dev.mk | 78 + src/3rdparty/freetype/builds/compiler/bcc.mk | 78 + src/3rdparty/freetype/builds/compiler/emx.mk | 77 + src/3rdparty/freetype/builds/compiler/gcc-dev.mk | 95 + src/3rdparty/freetype/builds/compiler/gcc.mk | 77 + src/3rdparty/freetype/builds/compiler/intelc.mk | 85 + src/3rdparty/freetype/builds/compiler/unix-lcc.mk | 83 + src/3rdparty/freetype/builds/compiler/visualage.mk | 76 + src/3rdparty/freetype/builds/compiler/visualc.mk | 82 + src/3rdparty/freetype/builds/compiler/watcom.mk | 81 + src/3rdparty/freetype/builds/compiler/win-lcc.mk | 81 + src/3rdparty/freetype/builds/detect.mk | 154 + src/3rdparty/freetype/builds/dos/detect.mk | 142 + src/3rdparty/freetype/builds/dos/dos-def.mk | 45 + src/3rdparty/freetype/builds/dos/dos-emx.mk | 21 + src/3rdparty/freetype/builds/dos/dos-gcc.mk | 21 + src/3rdparty/freetype/builds/dos/dos-wat.mk | 20 + src/3rdparty/freetype/builds/exports.mk | 76 + src/3rdparty/freetype/builds/freetype.mk | 361 + src/3rdparty/freetype/builds/link_dos.mk | 42 + src/3rdparty/freetype/builds/link_std.mk | 42 + .../freetype/builds/mac/FreeType.m68k_cfm.make.txt | 208 + .../freetype/builds/mac/FreeType.m68k_far.make.txt | 207 + .../builds/mac/FreeType.ppc_carbon.make.txt | 211 + .../builds/mac/FreeType.ppc_classic.make.txt | 212 + src/3rdparty/freetype/builds/mac/README | 403 + src/3rdparty/freetype/builds/mac/ascii2mpw.py | 24 + src/3rdparty/freetype/builds/mac/ftlib.prj.xml | 1194 + src/3rdparty/freetype/builds/mac/ftmac.c | 1531 + src/3rdparty/freetype/builds/modules.mk | 79 + src/3rdparty/freetype/builds/newline | 1 + src/3rdparty/freetype/builds/os2/detect.mk | 73 + src/3rdparty/freetype/builds/os2/os2-def.mk | 44 + src/3rdparty/freetype/builds/os2/os2-dev.mk | 30 + src/3rdparty/freetype/builds/os2/os2-gcc.mk | 26 + src/3rdparty/freetype/builds/symbian/bld.inf | 65 + src/3rdparty/freetype/builds/symbian/freetype.mmp | 142 + src/3rdparty/freetype/builds/toplevel.mk | 255 + src/3rdparty/freetype/builds/unix/aclocal.m4 | 7960 + src/3rdparty/freetype/builds/unix/config.guess | 1555 + src/3rdparty/freetype/builds/unix/config.sub | 1685 + src/3rdparty/freetype/builds/unix/configure | 16014 + src/3rdparty/freetype/builds/unix/configure.ac | 669 + src/3rdparty/freetype/builds/unix/configure.raw | 669 + src/3rdparty/freetype/builds/unix/detect.mk | 91 + .../freetype/builds/unix/freetype-config.in | 160 + src/3rdparty/freetype/builds/unix/freetype2.in | 12 + src/3rdparty/freetype/builds/unix/freetype2.m4 | 192 + src/3rdparty/freetype/builds/unix/ft-munmap.m4 | 32 + src/3rdparty/freetype/builds/unix/ft2unix.h | 61 + src/3rdparty/freetype/builds/unix/ftconfig.h | 262 + src/3rdparty/freetype/builds/unix/ftconfig.in | 476 + src/3rdparty/freetype/builds/unix/ftsystem.c | 426 + src/3rdparty/freetype/builds/unix/install-sh | 519 + src/3rdparty/freetype/builds/unix/install.mk | 97 + src/3rdparty/freetype/builds/unix/ltmain.sh | 8406 + src/3rdparty/freetype/builds/unix/mkinstalldirs | 161 + src/3rdparty/freetype/builds/unix/unix-cc.in | 113 + src/3rdparty/freetype/builds/unix/unix-def.in | 85 + src/3rdparty/freetype/builds/unix/unix-dev.mk | 26 + src/3rdparty/freetype/builds/unix/unix-lcc.mk | 24 + src/3rdparty/freetype/builds/unix/unix.mk | 62 + src/3rdparty/freetype/builds/unix/unixddef.mk | 45 + src/3rdparty/freetype/builds/vms/ftconfig.h | 346 + src/3rdparty/freetype/builds/vms/ftsystem.c | 321 + src/3rdparty/freetype/builds/win32/detect.mk | 183 + src/3rdparty/freetype/builds/win32/ftdebug.c | 248 + .../freetype/builds/win32/vc2005/freetype.sln | 31 + .../freetype/builds/win32/vc2005/freetype.vcproj | 636 + .../freetype/builds/win32/vc2005/index.html | 37 + .../freetype/builds/win32/vc2008/freetype.sln | 31 + .../freetype/builds/win32/vc2008/freetype.vcproj | 2160 + .../freetype/builds/win32/vc2008/index.html | 37 + .../freetype/builds/win32/visualc/freetype.dsp | 400 + .../freetype/builds/win32/visualc/freetype.dsw | 29 + .../freetype/builds/win32/visualc/index.html | 37 + src/3rdparty/freetype/builds/win32/w32-bcc.mk | 28 + src/3rdparty/freetype/builds/win32/w32-bccd.mk | 26 + src/3rdparty/freetype/builds/win32/w32-dev.mk | 32 + src/3rdparty/freetype/builds/win32/w32-gcc.mk | 31 + src/3rdparty/freetype/builds/win32/w32-icc.mk | 28 + src/3rdparty/freetype/builds/win32/w32-intl.mk | 28 + src/3rdparty/freetype/builds/win32/w32-lcc.mk | 24 + src/3rdparty/freetype/builds/win32/w32-mingw32.mk | 33 + src/3rdparty/freetype/builds/win32/w32-vcc.mk | 28 + src/3rdparty/freetype/builds/win32/w32-wat.mk | 28 + src/3rdparty/freetype/builds/win32/win32-def.mk | 46 + src/3rdparty/freetype/builds/wince/ftdebug.c | 248 + .../freetype/builds/wince/vc2005-ce/freetype.sln | 158 + .../builds/wince/vc2005-ce/freetype.vcproj | 3825 + .../freetype/builds/wince/vc2005-ce/index.html | 47 + .../freetype/builds/wince/vc2008-ce/freetype.sln | 158 + .../builds/wince/vc2008-ce/freetype.vcproj | 13467 + .../freetype/builds/wince/vc2008-ce/index.html | 47 + src/3rdparty/freetype/configure | 104 + src/3rdparty/freetype/devel/ft2build.h | 41 + src/3rdparty/freetype/devel/ftoption.h | 694 + src/3rdparty/freetype/docs/CHANGES | 3317 + src/3rdparty/freetype/docs/CUSTOMIZE | 150 + src/3rdparty/freetype/docs/DEBUG | 199 + src/3rdparty/freetype/docs/FTL.TXT | 169 + src/3rdparty/freetype/docs/GPL.TXT | 340 + src/3rdparty/freetype/docs/INSTALL | 91 + src/3rdparty/freetype/docs/INSTALL.ANY | 151 + src/3rdparty/freetype/docs/INSTALL.CROSS | 135 + src/3rdparty/freetype/docs/INSTALL.GNU | 159 + src/3rdparty/freetype/docs/INSTALL.MAC | 32 + src/3rdparty/freetype/docs/INSTALL.UNIX | 96 + src/3rdparty/freetype/docs/INSTALL.VMS | 62 + src/3rdparty/freetype/docs/LICENSE.TXT | 28 + src/3rdparty/freetype/docs/MAKEPP | 5 + src/3rdparty/freetype/docs/PATENTS | 27 + src/3rdparty/freetype/docs/PROBLEMS | 77 + src/3rdparty/freetype/docs/TODO | 40 + src/3rdparty/freetype/docs/TRUETYPE | 40 + src/3rdparty/freetype/docs/UPGRADE.UNIX | 137 + src/3rdparty/freetype/docs/VERSION.DLL | 135 + src/3rdparty/freetype/docs/formats.txt | 164 + src/3rdparty/freetype/docs/raster.txt | 635 + src/3rdparty/freetype/docs/reference/README | 5 + .../docs/reference/ft2-base_interface.html | 3409 + .../freetype/docs/reference/ft2-basic_types.html | 948 + .../freetype/docs/reference/ft2-bdf_fonts.html | 252 + .../docs/reference/ft2-bitmap_handling.html | 302 + .../docs/reference/ft2-cache_subsystem.html | 1098 + .../freetype/docs/reference/ft2-cid_fonts.html | 204 + .../freetype/docs/reference/ft2-computations.html | 792 + .../freetype/docs/reference/ft2-font_formats.html | 83 + .../freetype/docs/reference/ft2-gasp_table.html | 141 + .../docs/reference/ft2-glyph_management.html | 648 + .../freetype/docs/reference/ft2-glyph_stroker.html | 920 + .../docs/reference/ft2-glyph_variants.html | 267 + .../freetype/docs/reference/ft2-gx_validation.html | 348 + src/3rdparty/freetype/docs/reference/ft2-gzip.html | 94 + .../docs/reference/ft2-header_file_macros.html | 626 + .../freetype/docs/reference/ft2-incremental.html | 365 + .../freetype/docs/reference/ft2-index.html | 290 + .../freetype/docs/reference/ft2-lcd_filtering.html | 149 + .../docs/reference/ft2-list_processing.html | 467 + src/3rdparty/freetype/docs/reference/ft2-lzw.html | 94 + .../freetype/docs/reference/ft2-mac_specific.html | 368 + .../docs/reference/ft2-module_management.html | 626 + .../docs/reference/ft2-multiple_masters.html | 511 + .../freetype/docs/reference/ft2-ot_validation.html | 208 + .../docs/reference/ft2-outline_processing.html | 1106 + .../freetype/docs/reference/ft2-pfr_fonts.html | 206 + .../freetype/docs/reference/ft2-quick_advance.html | 177 + .../freetype/docs/reference/ft2-raster.html | 598 + .../freetype/docs/reference/ft2-sfnt_names.html | 190 + .../docs/reference/ft2-sizes_management.html | 164 + .../docs/reference/ft2-system_interface.html | 399 + src/3rdparty/freetype/docs/reference/ft2-toc.html | 215 + .../docs/reference/ft2-truetype_engine.html | 132 + .../docs/reference/ft2-truetype_tables.html | 1209 + .../freetype/docs/reference/ft2-type1_tables.html | 466 + .../docs/reference/ft2-user_allocation.html | 47 + .../freetype/docs/reference/ft2-version.html | 213 + .../freetype/docs/reference/ft2-winfnt_fonts.html | 270 + src/3rdparty/freetype/docs/release | 166 + .../freetype/include/freetype/config/ftconfig.h | 500 + .../freetype/include/freetype/config/ftheader.h | 780 + .../freetype/include/freetype/config/ftmodule.h | 32 + .../freetype/include/freetype/config/ftoption.h | 693 + .../freetype/include/freetype/config/ftstdlib.h | 172 + src/3rdparty/freetype/include/freetype/freetype.h | 3862 + src/3rdparty/freetype/include/freetype/ftadvanc.h | 179 + src/3rdparty/freetype/include/freetype/ftbbox.h | 94 + src/3rdparty/freetype/include/freetype/ftbdf.h | 209 + src/3rdparty/freetype/include/freetype/ftbitmap.h | 227 + src/3rdparty/freetype/include/freetype/ftcache.h | 1125 + .../freetype/include/freetype/ftchapters.h | 103 + src/3rdparty/freetype/include/freetype/ftcid.h | 166 + src/3rdparty/freetype/include/freetype/fterrdef.h | 239 + src/3rdparty/freetype/include/freetype/fterrors.h | 206 + src/3rdparty/freetype/include/freetype/ftgasp.h | 120 + src/3rdparty/freetype/include/freetype/ftglyph.h | 613 + src/3rdparty/freetype/include/freetype/ftgxval.h | 358 + src/3rdparty/freetype/include/freetype/ftgzip.h | 102 + src/3rdparty/freetype/include/freetype/ftimage.h | 1254 + src/3rdparty/freetype/include/freetype/ftincrem.h | 349 + src/3rdparty/freetype/include/freetype/ftlcdfil.h | 172 + src/3rdparty/freetype/include/freetype/ftlist.h | 273 + src/3rdparty/freetype/include/freetype/ftlzw.h | 99 + src/3rdparty/freetype/include/freetype/ftmac.h | 274 + src/3rdparty/freetype/include/freetype/ftmm.h | 378 + src/3rdparty/freetype/include/freetype/ftmodapi.h | 441 + src/3rdparty/freetype/include/freetype/ftmoderr.h | 155 + src/3rdparty/freetype/include/freetype/ftotval.h | 203 + src/3rdparty/freetype/include/freetype/ftoutln.h | 538 + src/3rdparty/freetype/include/freetype/ftpfr.h | 172 + src/3rdparty/freetype/include/freetype/ftrender.h | 234 + src/3rdparty/freetype/include/freetype/ftsizes.h | 159 + src/3rdparty/freetype/include/freetype/ftsnames.h | 170 + src/3rdparty/freetype/include/freetype/ftstroke.h | 716 + src/3rdparty/freetype/include/freetype/ftsynth.h | 80 + src/3rdparty/freetype/include/freetype/ftsystem.h | 346 + src/3rdparty/freetype/include/freetype/fttrigon.h | 350 + src/3rdparty/freetype/include/freetype/fttypes.h | 587 + src/3rdparty/freetype/include/freetype/ftwinfnt.h | 274 + src/3rdparty/freetype/include/freetype/ftxf86.h | 80 + .../freetype/include/freetype/internal/autohint.h | 205 + .../freetype/include/freetype/internal/ftcalc.h | 178 + .../freetype/include/freetype/internal/ftdebug.h | 250 + .../freetype/include/freetype/internal/ftdriver.h | 249 + .../freetype/include/freetype/internal/ftgloadr.h | 168 + .../freetype/include/freetype/internal/ftmemory.h | 368 + .../freetype/include/freetype/internal/ftobjs.h | 875 + .../freetype/include/freetype/internal/ftrfork.h | 196 + .../freetype/include/freetype/internal/ftserv.h | 328 + .../freetype/include/freetype/internal/ftstream.h | 539 + .../freetype/include/freetype/internal/fttrace.h | 134 + .../freetype/include/freetype/internal/ftvalid.h | 150 + .../freetype/include/freetype/internal/internal.h | 50 + .../freetype/include/freetype/internal/pcftypes.h | 56 + .../freetype/include/freetype/internal/psaux.h | 876 + .../freetype/include/freetype/internal/pshints.h | 687 + .../include/freetype/internal/services/svbdf.h | 57 + .../include/freetype/internal/services/svcid.h | 58 + .../include/freetype/internal/services/svgldict.h | 60 + .../include/freetype/internal/services/svgxval.h | 72 + .../include/freetype/internal/services/svkern.h | 51 + .../include/freetype/internal/services/svmm.h | 79 + .../include/freetype/internal/services/svotval.h | 55 + .../include/freetype/internal/services/svpfr.h | 66 + .../include/freetype/internal/services/svpostnm.h | 58 + .../include/freetype/internal/services/svpscmap.h | 129 + .../include/freetype/internal/services/svpsinfo.h | 65 + .../include/freetype/internal/services/svsfnt.h | 80 + .../include/freetype/internal/services/svttcmap.h | 85 + .../include/freetype/internal/services/svtteng.h | 53 + .../include/freetype/internal/services/svttglyf.h | 48 + .../include/freetype/internal/services/svwinfnt.h | 50 + .../include/freetype/internal/services/svxf86nm.h | 55 + .../freetype/include/freetype/internal/sfnt.h | 762 + .../freetype/include/freetype/internal/t1types.h | 268 + .../freetype/include/freetype/internal/tttypes.h | 1543 + src/3rdparty/freetype/include/freetype/t1tables.h | 504 + src/3rdparty/freetype/include/freetype/ttnameid.h | 1247 + src/3rdparty/freetype/include/freetype/tttables.h | 756 + src/3rdparty/freetype/include/freetype/tttags.h | 107 + src/3rdparty/freetype/include/freetype/ttunpat.h | 59 + src/3rdparty/freetype/include/ft2build.h | 39 + src/3rdparty/freetype/modules.cfg | 250 + src/3rdparty/freetype/objs/README | 2 + src/3rdparty/freetype/src/Jamfile | 25 + src/3rdparty/freetype/src/autofit/Jamfile | 39 + src/3rdparty/freetype/src/autofit/afangles.c | 292 + src/3rdparty/freetype/src/autofit/afangles.h | 7 + src/3rdparty/freetype/src/autofit/afcjk.c | 1513 + src/3rdparty/freetype/src/autofit/afcjk.h | 58 + src/3rdparty/freetype/src/autofit/afdummy.c | 62 + src/3rdparty/freetype/src/autofit/afdummy.h | 43 + src/3rdparty/freetype/src/autofit/aferrors.h | 40 + src/3rdparty/freetype/src/autofit/afglobal.c | 289 + src/3rdparty/freetype/src/autofit/afglobal.h | 67 + src/3rdparty/freetype/src/autofit/afhints.c | 1264 + src/3rdparty/freetype/src/autofit/afhints.h | 333 + src/3rdparty/freetype/src/autofit/afindic.c | 134 + src/3rdparty/freetype/src/autofit/afindic.h | 41 + src/3rdparty/freetype/src/autofit/aflatin.c | 2177 + src/3rdparty/freetype/src/autofit/aflatin.h | 209 + src/3rdparty/freetype/src/autofit/aflatin2.c | 2292 + src/3rdparty/freetype/src/autofit/aflatin2.h | 40 + src/3rdparty/freetype/src/autofit/afloader.c | 535 + src/3rdparty/freetype/src/autofit/afloader.h | 73 + src/3rdparty/freetype/src/autofit/afmodule.c | 97 + src/3rdparty/freetype/src/autofit/afmodule.h | 37 + src/3rdparty/freetype/src/autofit/aftypes.h | 350 + src/3rdparty/freetype/src/autofit/afwarp.c | 338 + src/3rdparty/freetype/src/autofit/afwarp.h | 64 + src/3rdparty/freetype/src/autofit/autofit.c | 40 + src/3rdparty/freetype/src/autofit/module.mk | 23 + src/3rdparty/freetype/src/autofit/rules.mk | 78 + src/3rdparty/freetype/src/base/Jamfile | 59 + src/3rdparty/freetype/src/base/ftadvanc.c | 163 + src/3rdparty/freetype/src/base/ftapi.c | 121 + src/3rdparty/freetype/src/base/ftbase.c | 39 + src/3rdparty/freetype/src/base/ftbase.h | 57 + src/3rdparty/freetype/src/base/ftbbox.c | 659 + src/3rdparty/freetype/src/base/ftbdf.c | 88 + src/3rdparty/freetype/src/base/ftbitmap.c | 659 + src/3rdparty/freetype/src/base/ftcalc.c | 953 + src/3rdparty/freetype/src/base/ftcid.c | 117 + src/3rdparty/freetype/src/base/ftdbgmem.c | 997 + src/3rdparty/freetype/src/base/ftdebug.c | 246 + src/3rdparty/freetype/src/base/ftfstype.c | 62 + src/3rdparty/freetype/src/base/ftgasp.c | 61 + src/3rdparty/freetype/src/base/ftgloadr.c | 394 + src/3rdparty/freetype/src/base/ftglyph.c | 626 + src/3rdparty/freetype/src/base/ftgxval.c | 129 + src/3rdparty/freetype/src/base/ftinit.c | 163 + src/3rdparty/freetype/src/base/ftlcdfil.c | 351 + src/3rdparty/freetype/src/base/ftmac.c | 1057 + src/3rdparty/freetype/src/base/ftmm.c | 202 + src/3rdparty/freetype/src/base/ftnames.c | 94 + src/3rdparty/freetype/src/base/ftobjs.c | 4402 + src/3rdparty/freetype/src/base/ftotval.c | 84 + src/3rdparty/freetype/src/base/ftoutln.c | 1128 + src/3rdparty/freetype/src/base/ftpatent.c | 281 + src/3rdparty/freetype/src/base/ftpfr.c | 143 + src/3rdparty/freetype/src/base/ftrfork.c | 821 + src/3rdparty/freetype/src/base/ftstream.c | 846 + src/3rdparty/freetype/src/base/ftstroke.c | 2009 + src/3rdparty/freetype/src/base/ftsynth.c | 137 + src/3rdparty/freetype/src/base/ftsystem.c | 301 + src/3rdparty/freetype/src/base/fttrigon.c | 546 + src/3rdparty/freetype/src/base/fttype1.c | 94 + src/3rdparty/freetype/src/base/ftutil.c | 501 + src/3rdparty/freetype/src/base/ftwinfnt.c | 51 + src/3rdparty/freetype/src/base/ftxf86.c | 40 + src/3rdparty/freetype/src/base/rules.mk | 96 + src/3rdparty/freetype/src/bdf/Jamfile | 29 + src/3rdparty/freetype/src/bdf/README | 148 + src/3rdparty/freetype/src/bdf/bdf.c | 34 + src/3rdparty/freetype/src/bdf/bdf.h | 295 + src/3rdparty/freetype/src/bdf/bdfdrivr.c | 855 + src/3rdparty/freetype/src/bdf/bdfdrivr.h | 76 + src/3rdparty/freetype/src/bdf/bdferror.h | 44 + src/3rdparty/freetype/src/bdf/bdflib.c | 2479 + src/3rdparty/freetype/src/bdf/module.mk | 34 + src/3rdparty/freetype/src/bdf/rules.mk | 81 + src/3rdparty/freetype/src/cache/Jamfile | 43 + src/3rdparty/freetype/src/cache/ftcache.c | 31 + src/3rdparty/freetype/src/cache/ftcbasic.c | 811 + src/3rdparty/freetype/src/cache/ftccache.c | 592 + src/3rdparty/freetype/src/cache/ftccache.h | 317 + src/3rdparty/freetype/src/cache/ftccback.h | 90 + src/3rdparty/freetype/src/cache/ftccmap.c | 425 + src/3rdparty/freetype/src/cache/ftcerror.h | 40 + src/3rdparty/freetype/src/cache/ftcglyph.c | 211 + src/3rdparty/freetype/src/cache/ftcglyph.h | 322 + src/3rdparty/freetype/src/cache/ftcimage.c | 163 + src/3rdparty/freetype/src/cache/ftcimage.h | 107 + src/3rdparty/freetype/src/cache/ftcmanag.c | 733 + src/3rdparty/freetype/src/cache/ftcmanag.h | 175 + src/3rdparty/freetype/src/cache/ftcmru.c | 357 + src/3rdparty/freetype/src/cache/ftcmru.h | 247 + src/3rdparty/freetype/src/cache/ftcsbits.c | 401 + src/3rdparty/freetype/src/cache/ftcsbits.h | 98 + src/3rdparty/freetype/src/cache/rules.mk | 80 + src/3rdparty/freetype/src/cff/Jamfile | 29 + src/3rdparty/freetype/src/cff/cff.c | 29 + src/3rdparty/freetype/src/cff/cffcmap.c | 224 + src/3rdparty/freetype/src/cff/cffcmap.h | 69 + src/3rdparty/freetype/src/cff/cffdrivr.c | 682 + src/3rdparty/freetype/src/cff/cffdrivr.h | 39 + src/3rdparty/freetype/src/cff/cfferrs.h | 41 + src/3rdparty/freetype/src/cff/cffgload.c | 2818 + src/3rdparty/freetype/src/cff/cffgload.h | 203 + src/3rdparty/freetype/src/cff/cffload.c | 1604 + src/3rdparty/freetype/src/cff/cffload.h | 80 + src/3rdparty/freetype/src/cff/cffobjs.c | 965 + src/3rdparty/freetype/src/cff/cffobjs.h | 181 + src/3rdparty/freetype/src/cff/cffparse.c | 848 + src/3rdparty/freetype/src/cff/cffparse.h | 69 + src/3rdparty/freetype/src/cff/cfftoken.h | 97 + src/3rdparty/freetype/src/cff/cfftypes.h | 274 + src/3rdparty/freetype/src/cff/module.mk | 23 + src/3rdparty/freetype/src/cff/rules.mk | 72 + src/3rdparty/freetype/src/cid/Jamfile | 29 + src/3rdparty/freetype/src/cid/ciderrs.h | 40 + src/3rdparty/freetype/src/cid/cidgload.c | 433 + src/3rdparty/freetype/src/cid/cidgload.h | 51 + src/3rdparty/freetype/src/cid/cidload.c | 672 + src/3rdparty/freetype/src/cid/cidload.h | 53 + src/3rdparty/freetype/src/cid/cidobjs.c | 481 + src/3rdparty/freetype/src/cid/cidobjs.h | 154 + src/3rdparty/freetype/src/cid/cidparse.c | 226 + src/3rdparty/freetype/src/cid/cidparse.h | 123 + src/3rdparty/freetype/src/cid/cidriver.c | 241 + src/3rdparty/freetype/src/cid/cidriver.h | 39 + src/3rdparty/freetype/src/cid/cidtoken.h | 112 + src/3rdparty/freetype/src/cid/module.mk | 23 + src/3rdparty/freetype/src/cid/rules.mk | 70 + src/3rdparty/freetype/src/cid/type1cid.c | 29 + src/3rdparty/freetype/src/gxvalid/Jamfile | 33 + src/3rdparty/freetype/src/gxvalid/README | 532 + src/3rdparty/freetype/src/gxvalid/gxvalid.c | 46 + src/3rdparty/freetype/src/gxvalid/gxvalid.h | 107 + src/3rdparty/freetype/src/gxvalid/gxvbsln.c | 333 + src/3rdparty/freetype/src/gxvalid/gxvcommn.c | 1758 + src/3rdparty/freetype/src/gxvalid/gxvcommn.h | 560 + src/3rdparty/freetype/src/gxvalid/gxverror.h | 51 + src/3rdparty/freetype/src/gxvalid/gxvfeat.c | 344 + src/3rdparty/freetype/src/gxvalid/gxvfeat.h | 172 + src/3rdparty/freetype/src/gxvalid/gxvfgen.c | 482 + src/3rdparty/freetype/src/gxvalid/gxvjust.c | 630 + src/3rdparty/freetype/src/gxvalid/gxvkern.c | 876 + src/3rdparty/freetype/src/gxvalid/gxvlcar.c | 223 + src/3rdparty/freetype/src/gxvalid/gxvmod.c | 285 + src/3rdparty/freetype/src/gxvalid/gxvmod.h | 46 + src/3rdparty/freetype/src/gxvalid/gxvmort.c | 285 + src/3rdparty/freetype/src/gxvalid/gxvmort.h | 93 + src/3rdparty/freetype/src/gxvalid/gxvmort0.c | 137 + src/3rdparty/freetype/src/gxvalid/gxvmort1.c | 258 + src/3rdparty/freetype/src/gxvalid/gxvmort2.c | 282 + src/3rdparty/freetype/src/gxvalid/gxvmort4.c | 125 + src/3rdparty/freetype/src/gxvalid/gxvmort5.c | 226 + src/3rdparty/freetype/src/gxvalid/gxvmorx.c | 184 + src/3rdparty/freetype/src/gxvalid/gxvmorx.h | 67 + src/3rdparty/freetype/src/gxvalid/gxvmorx0.c | 103 + src/3rdparty/freetype/src/gxvalid/gxvmorx1.c | 274 + src/3rdparty/freetype/src/gxvalid/gxvmorx2.c | 285 + src/3rdparty/freetype/src/gxvalid/gxvmorx4.c | 55 + src/3rdparty/freetype/src/gxvalid/gxvmorx5.c | 217 + src/3rdparty/freetype/src/gxvalid/gxvopbd.c | 217 + src/3rdparty/freetype/src/gxvalid/gxvprop.c | 301 + src/3rdparty/freetype/src/gxvalid/gxvtrak.c | 277 + src/3rdparty/freetype/src/gxvalid/module.mk | 23 + src/3rdparty/freetype/src/gxvalid/rules.mk | 94 + src/3rdparty/freetype/src/gzip/Jamfile | 16 + src/3rdparty/freetype/src/gzip/adler32.c | 48 + src/3rdparty/freetype/src/gzip/ftgzip.c | 682 + src/3rdparty/freetype/src/gzip/infblock.c | 387 + src/3rdparty/freetype/src/gzip/infblock.h | 36 + src/3rdparty/freetype/src/gzip/infcodes.c | 250 + src/3rdparty/freetype/src/gzip/infcodes.h | 31 + src/3rdparty/freetype/src/gzip/inffixed.h | 151 + src/3rdparty/freetype/src/gzip/inflate.c | 273 + src/3rdparty/freetype/src/gzip/inftrees.c | 468 + src/3rdparty/freetype/src/gzip/inftrees.h | 63 + src/3rdparty/freetype/src/gzip/infutil.c | 86 + src/3rdparty/freetype/src/gzip/infutil.h | 98 + src/3rdparty/freetype/src/gzip/rules.mk | 75 + src/3rdparty/freetype/src/gzip/zconf.h | 285 + src/3rdparty/freetype/src/gzip/zlib.h | 837 + src/3rdparty/freetype/src/gzip/zutil.c | 181 + src/3rdparty/freetype/src/gzip/zutil.h | 215 + src/3rdparty/freetype/src/lzw/Jamfile | 16 + src/3rdparty/freetype/src/lzw/ftlzw.c | 412 + src/3rdparty/freetype/src/lzw/ftzopen.c | 398 + src/3rdparty/freetype/src/lzw/ftzopen.h | 171 + src/3rdparty/freetype/src/lzw/rules.mk | 70 + src/3rdparty/freetype/src/otvalid/Jamfile | 29 + src/3rdparty/freetype/src/otvalid/module.mk | 23 + src/3rdparty/freetype/src/otvalid/otvalid.c | 31 + src/3rdparty/freetype/src/otvalid/otvalid.h | 78 + src/3rdparty/freetype/src/otvalid/otvbase.c | 318 + src/3rdparty/freetype/src/otvalid/otvcommn.c | 1086 + src/3rdparty/freetype/src/otvalid/otvcommn.h | 437 + src/3rdparty/freetype/src/otvalid/otverror.h | 43 + src/3rdparty/freetype/src/otvalid/otvgdef.c | 224 + src/3rdparty/freetype/src/otvalid/otvgpos.c | 1016 + src/3rdparty/freetype/src/otvalid/otvgpos.h | 36 + src/3rdparty/freetype/src/otvalid/otvgsub.c | 584 + src/3rdparty/freetype/src/otvalid/otvjstf.c | 258 + src/3rdparty/freetype/src/otvalid/otvmath.c | 452 + src/3rdparty/freetype/src/otvalid/otvmod.c | 267 + src/3rdparty/freetype/src/otvalid/otvmod.h | 39 + src/3rdparty/freetype/src/otvalid/rules.mk | 78 + src/3rdparty/freetype/src/pcf/Jamfile | 29 + src/3rdparty/freetype/src/pcf/README | 114 + src/3rdparty/freetype/src/pcf/module.mk | 34 + src/3rdparty/freetype/src/pcf/pcf.c | 36 + src/3rdparty/freetype/src/pcf/pcf.h | 237 + src/3rdparty/freetype/src/pcf/pcfdrivr.c | 681 + src/3rdparty/freetype/src/pcf/pcfdrivr.h | 44 + src/3rdparty/freetype/src/pcf/pcferror.h | 40 + src/3rdparty/freetype/src/pcf/pcfread.c | 1271 + src/3rdparty/freetype/src/pcf/pcfread.h | 45 + src/3rdparty/freetype/src/pcf/pcfutil.c | 104 + src/3rdparty/freetype/src/pcf/pcfutil.h | 55 + src/3rdparty/freetype/src/pcf/rules.mk | 79 + src/3rdparty/freetype/src/pfr/Jamfile | 29 + src/3rdparty/freetype/src/pfr/module.mk | 23 + src/3rdparty/freetype/src/pfr/pfr.c | 29 + src/3rdparty/freetype/src/pfr/pfrcmap.c | 167 + src/3rdparty/freetype/src/pfr/pfrcmap.h | 46 + src/3rdparty/freetype/src/pfr/pfrdrivr.c | 214 + src/3rdparty/freetype/src/pfr/pfrdrivr.h | 39 + src/3rdparty/freetype/src/pfr/pfrerror.h | 40 + src/3rdparty/freetype/src/pfr/pfrgload.c | 828 + src/3rdparty/freetype/src/pfr/pfrgload.h | 49 + src/3rdparty/freetype/src/pfr/pfrload.c | 938 + src/3rdparty/freetype/src/pfr/pfrload.h | 118 + src/3rdparty/freetype/src/pfr/pfrobjs.c | 581 + src/3rdparty/freetype/src/pfr/pfrobjs.h | 96 + src/3rdparty/freetype/src/pfr/pfrsbit.c | 680 + src/3rdparty/freetype/src/pfr/pfrsbit.h | 36 + src/3rdparty/freetype/src/pfr/pfrtypes.h | 362 + src/3rdparty/freetype/src/pfr/rules.mk | 73 + src/3rdparty/freetype/src/psaux/Jamfile | 31 + src/3rdparty/freetype/src/psaux/afmparse.c | 965 + src/3rdparty/freetype/src/psaux/afmparse.h | 87 + src/3rdparty/freetype/src/psaux/module.mk | 23 + src/3rdparty/freetype/src/psaux/psaux.c | 34 + src/3rdparty/freetype/src/psaux/psauxerr.h | 41 + src/3rdparty/freetype/src/psaux/psauxmod.c | 139 + src/3rdparty/freetype/src/psaux/psauxmod.h | 38 + src/3rdparty/freetype/src/psaux/psconv.c | 474 + src/3rdparty/freetype/src/psaux/psconv.h | 71 + src/3rdparty/freetype/src/psaux/psobjs.c | 1706 + src/3rdparty/freetype/src/psaux/psobjs.h | 212 + src/3rdparty/freetype/src/psaux/rules.mk | 73 + src/3rdparty/freetype/src/psaux/t1cmap.c | 341 + src/3rdparty/freetype/src/psaux/t1cmap.h | 105 + src/3rdparty/freetype/src/psaux/t1decode.c | 1474 + src/3rdparty/freetype/src/psaux/t1decode.h | 64 + src/3rdparty/freetype/src/pshinter/Jamfile | 29 + src/3rdparty/freetype/src/pshinter/module.mk | 23 + src/3rdparty/freetype/src/pshinter/pshalgo.c | 2302 + src/3rdparty/freetype/src/pshinter/pshalgo.h | 255 + src/3rdparty/freetype/src/pshinter/pshglob.c | 750 + src/3rdparty/freetype/src/pshinter/pshglob.h | 196 + src/3rdparty/freetype/src/pshinter/pshinter.c | 28 + src/3rdparty/freetype/src/pshinter/pshmod.c | 121 + src/3rdparty/freetype/src/pshinter/pshmod.h | 39 + src/3rdparty/freetype/src/pshinter/pshnterr.h | 40 + src/3rdparty/freetype/src/pshinter/pshrec.c | 1215 + src/3rdparty/freetype/src/pshinter/pshrec.h | 176 + src/3rdparty/freetype/src/pshinter/rules.mk | 72 + src/3rdparty/freetype/src/psnames/Jamfile | 29 + src/3rdparty/freetype/src/psnames/module.mk | 23 + src/3rdparty/freetype/src/psnames/psmodule.c | 590 + src/3rdparty/freetype/src/psnames/psmodule.h | 38 + src/3rdparty/freetype/src/psnames/psnamerr.h | 41 + src/3rdparty/freetype/src/psnames/psnames.c | 25 + src/3rdparty/freetype/src/psnames/pstables.h | 4095 + src/3rdparty/freetype/src/psnames/rules.mk | 70 + src/3rdparty/freetype/src/raster/Jamfile | 29 + src/3rdparty/freetype/src/raster/ftmisc.h | 84 + src/3rdparty/freetype/src/raster/ftraster.c | 3433 + src/3rdparty/freetype/src/raster/ftraster.h | 46 + src/3rdparty/freetype/src/raster/ftrend1.c | 273 + src/3rdparty/freetype/src/raster/ftrend1.h | 44 + src/3rdparty/freetype/src/raster/module.mk | 23 + src/3rdparty/freetype/src/raster/raster.c | 26 + src/3rdparty/freetype/src/raster/rasterrs.h | 41 + src/3rdparty/freetype/src/raster/rules.mk | 70 + src/3rdparty/freetype/src/sfnt/Jamfile | 29 + src/3rdparty/freetype/src/sfnt/module.mk | 23 + src/3rdparty/freetype/src/sfnt/rules.mk | 79 + src/3rdparty/freetype/src/sfnt/sfdriver.c | 643 + src/3rdparty/freetype/src/sfnt/sfdriver.h | 38 + src/3rdparty/freetype/src/sfnt/sferrors.h | 41 + src/3rdparty/freetype/src/sfnt/sfnt.c | 41 + src/3rdparty/freetype/src/sfnt/sfobjs.c | 1130 + src/3rdparty/freetype/src/sfnt/sfobjs.h | 54 + src/3rdparty/freetype/src/sfnt/ttbdf.c | 250 + src/3rdparty/freetype/src/sfnt/ttbdf.h | 46 + src/3rdparty/freetype/src/sfnt/ttcmap.c | 3187 + src/3rdparty/freetype/src/sfnt/ttcmap.h | 85 + src/3rdparty/freetype/src/sfnt/ttkern.c | 305 + src/3rdparty/freetype/src/sfnt/ttkern.h | 52 + src/3rdparty/freetype/src/sfnt/ttload.c | 1248 + src/3rdparty/freetype/src/sfnt/ttload.h | 112 + src/3rdparty/freetype/src/sfnt/ttmtx.c | 466 + src/3rdparty/freetype/src/sfnt/ttmtx.h | 55 + src/3rdparty/freetype/src/sfnt/ttpost.c | 522 + src/3rdparty/freetype/src/sfnt/ttpost.h | 46 + src/3rdparty/freetype/src/sfnt/ttsbit.c | 1507 + src/3rdparty/freetype/src/sfnt/ttsbit.h | 79 + src/3rdparty/freetype/src/sfnt/ttsbit0.c | 969 + src/3rdparty/freetype/src/smooth/Jamfile | 29 + src/3rdparty/freetype/src/smooth/ftgrays.c | 2057 + src/3rdparty/freetype/src/smooth/ftgrays.h | 57 + src/3rdparty/freetype/src/smooth/ftsmerrs.h | 41 + src/3rdparty/freetype/src/smooth/ftsmooth.c | 467 + src/3rdparty/freetype/src/smooth/ftsmooth.h | 49 + src/3rdparty/freetype/src/smooth/module.mk | 27 + src/3rdparty/freetype/src/smooth/rules.mk | 69 + src/3rdparty/freetype/src/smooth/smooth.c | 26 + src/3rdparty/freetype/src/tools/Jamfile | 5 + src/3rdparty/freetype/src/tools/apinames.c | 443 + src/3rdparty/freetype/src/tools/cordic.py | 79 + .../freetype/src/tools/docmaker/content.py | 584 + .../freetype/src/tools/docmaker/docbeauty.py | 113 + .../freetype/src/tools/docmaker/docmaker.py | 106 + .../freetype/src/tools/docmaker/formatter.py | 188 + .../freetype/src/tools/docmaker/sources.py | 347 + src/3rdparty/freetype/src/tools/docmaker/tohtml.py | 593 + src/3rdparty/freetype/src/tools/docmaker/utils.py | 132 + src/3rdparty/freetype/src/tools/ftrandom/Makefile | 35 + src/3rdparty/freetype/src/tools/ftrandom/README | 48 + .../freetype/src/tools/ftrandom/ftrandom.c | 659 + src/3rdparty/freetype/src/tools/glnames.py | 5287 + src/3rdparty/freetype/src/tools/test_afm.c | 157 + src/3rdparty/freetype/src/tools/test_bbox.c | 160 + src/3rdparty/freetype/src/tools/test_trig.c | 236 + src/3rdparty/freetype/src/truetype/Jamfile | 29 + src/3rdparty/freetype/src/truetype/module.mk | 23 + src/3rdparty/freetype/src/truetype/rules.mk | 72 + src/3rdparty/freetype/src/truetype/truetype.c | 36 + src/3rdparty/freetype/src/truetype/ttdriver.c | 474 + src/3rdparty/freetype/src/truetype/ttdriver.h | 38 + src/3rdparty/freetype/src/truetype/tterrors.h | 40 + src/3rdparty/freetype/src/truetype/ttgload.c | 2022 + src/3rdparty/freetype/src/truetype/ttgload.h | 63 + src/3rdparty/freetype/src/truetype/ttgxvar.c | 1541 + src/3rdparty/freetype/src/truetype/ttgxvar.h | 182 + src/3rdparty/freetype/src/truetype/ttinterp.c | 7828 + src/3rdparty/freetype/src/truetype/ttinterp.h | 311 + src/3rdparty/freetype/src/truetype/ttobjs.c | 955 + src/3rdparty/freetype/src/truetype/ttobjs.h | 463 + src/3rdparty/freetype/src/truetype/ttpload.c | 574 + src/3rdparty/freetype/src/truetype/ttpload.h | 75 + src/3rdparty/freetype/src/type1/Jamfile | 29 + src/3rdparty/freetype/src/type1/module.mk | 23 + src/3rdparty/freetype/src/type1/rules.mk | 73 + src/3rdparty/freetype/src/type1/t1afm.c | 390 + src/3rdparty/freetype/src/type1/t1afm.h | 54 + src/3rdparty/freetype/src/type1/t1driver.c | 331 + src/3rdparty/freetype/src/type1/t1driver.h | 38 + src/3rdparty/freetype/src/type1/t1errors.h | 40 + src/3rdparty/freetype/src/type1/t1gload.c | 489 + src/3rdparty/freetype/src/type1/t1gload.h | 53 + src/3rdparty/freetype/src/type1/t1load.c | 2245 + src/3rdparty/freetype/src/type1/t1load.h | 102 + src/3rdparty/freetype/src/type1/t1objs.c | 592 + src/3rdparty/freetype/src/type1/t1objs.h | 171 + src/3rdparty/freetype/src/type1/t1parse.c | 484 + src/3rdparty/freetype/src/type1/t1parse.h | 135 + src/3rdparty/freetype/src/type1/t1tokens.h | 143 + src/3rdparty/freetype/src/type1/type1.c | 33 + src/3rdparty/freetype/src/type42/Jamfile | 29 + src/3rdparty/freetype/src/type42/module.mk | 23 + src/3rdparty/freetype/src/type42/rules.mk | 70 + src/3rdparty/freetype/src/type42/t42drivr.c | 246 + src/3rdparty/freetype/src/type42/t42drivr.h | 38 + src/3rdparty/freetype/src/type42/t42error.h | 40 + src/3rdparty/freetype/src/type42/t42objs.c | 647 + src/3rdparty/freetype/src/type42/t42objs.h | 124 + src/3rdparty/freetype/src/type42/t42parse.c | 1175 + src/3rdparty/freetype/src/type42/t42parse.h | 90 + src/3rdparty/freetype/src/type42/t42types.h | 56 + src/3rdparty/freetype/src/type42/type42.c | 25 + src/3rdparty/freetype/src/winfonts/Jamfile | 16 + src/3rdparty/freetype/src/winfonts/fnterrs.h | 41 + src/3rdparty/freetype/src/winfonts/module.mk | 23 + src/3rdparty/freetype/src/winfonts/rules.mk | 65 + src/3rdparty/freetype/src/winfonts/winfnt.c | 1135 + src/3rdparty/freetype/src/winfonts/winfnt.h | 167 + src/3rdparty/freetype/version.sed | 5 + src/3rdparty/freetype/vms_make.com | 1286 + src/3rdparty/harfbuzz/.gitignore | 20 + src/3rdparty/harfbuzz/AUTHORS | 6 + src/3rdparty/harfbuzz/COPYING | 24 + src/3rdparty/harfbuzz/ChangeLog | 0 src/3rdparty/harfbuzz/Makefile.am | 2 + src/3rdparty/harfbuzz/NEWS | 0 src/3rdparty/harfbuzz/README | 7 + src/3rdparty/harfbuzz/autogen.sh | 116 + src/3rdparty/harfbuzz/configure.ac | 54 + src/3rdparty/harfbuzz/src/.gitignore | 7 + src/3rdparty/harfbuzz/src/Makefile.am | 69 + src/3rdparty/harfbuzz/src/harfbuzz-arabic.c | 1144 + .../harfbuzz/src/harfbuzz-buffer-private.h | 107 + src/3rdparty/harfbuzz/src/harfbuzz-buffer.c | 383 + src/3rdparty/harfbuzz/src/harfbuzz-buffer.h | 94 + src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c | 97 + src/3rdparty/harfbuzz/src/harfbuzz-dump.c | 767 + src/3rdparty/harfbuzz/src/harfbuzz-dump.h | 41 + src/3rdparty/harfbuzz/src/harfbuzz-external.h | 153 + src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h | 126 + src/3rdparty/harfbuzz/src/harfbuzz-gdef.c | 1163 + src/3rdparty/harfbuzz/src/harfbuzz-gdef.h | 132 + src/3rdparty/harfbuzz/src/harfbuzz-global.h | 118 + src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h | 721 + src/3rdparty/harfbuzz/src/harfbuzz-gpos.c | 6091 + src/3rdparty/harfbuzz/src/harfbuzz-gpos.h | 155 + src/3rdparty/harfbuzz/src/harfbuzz-greek.c | 447 + src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h | 475 + src/3rdparty/harfbuzz/src/harfbuzz-gsub.c | 4329 + src/3rdparty/harfbuzz/src/harfbuzz-gsub.h | 139 + src/3rdparty/harfbuzz/src/harfbuzz-hangul.c | 268 + src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c | 187 + src/3rdparty/harfbuzz/src/harfbuzz-impl.c | 84 + src/3rdparty/harfbuzz/src/harfbuzz-impl.h | 131 + src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp | 1898 + src/3rdparty/harfbuzz/src/harfbuzz-khmer.c | 667 + src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c | 538 + src/3rdparty/harfbuzz/src/harfbuzz-open-private.h | 102 + src/3rdparty/harfbuzz/src/harfbuzz-open.c | 1433 + src/3rdparty/harfbuzz/src/harfbuzz-open.h | 280 + src/3rdparty/harfbuzz/src/harfbuzz-shape.h | 199 + src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp | 37 + .../harfbuzz/src/harfbuzz-shaper-private.h | 171 + src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp | 1367 + src/3rdparty/harfbuzz/src/harfbuzz-shaper.h | 286 + .../harfbuzz/src/harfbuzz-stream-private.h | 81 + src/3rdparty/harfbuzz/src/harfbuzz-stream.c | 114 + src/3rdparty/harfbuzz/src/harfbuzz-stream.h | 43 + src/3rdparty/harfbuzz/src/harfbuzz-thai.c | 111 + src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c | 274 + src/3rdparty/harfbuzz/src/harfbuzz.c | 32 + src/3rdparty/harfbuzz/src/harfbuzz.h | 38 + src/3rdparty/harfbuzz/tests/Makefile.am | 7 + src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc | 124 + .../harfbuzz/tests/linebreaking/.gitignore | 4 + .../harfbuzz/tests/linebreaking/Makefile.am | 12 + .../harfbuzz/tests/linebreaking/harfbuzz-qt.cpp | 87 + src/3rdparty/harfbuzz/tests/linebreaking/main.cpp | 230 + src/3rdparty/harfbuzz/tests/shaping/.gitignore | 2 + src/3rdparty/harfbuzz/tests/shaping/Makefile.am | 14 + src/3rdparty/harfbuzz/tests/shaping/README | 9 + src/3rdparty/harfbuzz/tests/shaping/main.cpp | 1320 + src/3rdparty/libgq.pri | 9 + src/3rdparty/libgq/.gitignore | 37 + src/3rdparty/libgq/Makefile.am | 4 + src/3rdparty/libgq/README | 6 + src/3rdparty/libgq/autogen.sh | 2 + src/3rdparty/libgq/configure.ac | 23 + src/3rdparty/libgq/debian/README.scratchbox | 28 + src/3rdparty/libgq/debian/changelog | 31 + src/3rdparty/libgq/debian/compat | 1 + src/3rdparty/libgq/debian/control | 43 + src/3rdparty/libgq/debian/copyright | 8 + src/3rdparty/libgq/debian/fixup-scratchbox | 79 + src/3rdparty/libgq/debian/libgq-gconf-dev.install | 5 + src/3rdparty/libgq/debian/libgq-gconf-doc.install | 1 + src/3rdparty/libgq/debian/libgq-gconf0.install | 1 + src/3rdparty/libgq/debian/maemo-sanitize | 0 src/3rdparty/libgq/debian/rules | 32 + src/3rdparty/libgq/gconf/Doxyfile | 1514 + src/3rdparty/libgq/gconf/GConfItem | 1 + src/3rdparty/libgq/gconf/Makefile.am | 37 + src/3rdparty/libgq/gconf/gconfitem.cpp | 376 + src/3rdparty/libgq/gconf/gconfitem.h | 147 + src/3rdparty/libgq/gconf/gq-gconf.pc.in | 11 + src/3rdparty/libgq/gconf/run-test-gconf | 49 + src/3rdparty/libgq/gconf/test-gconf.cpp | 299 + src/3rdparty/libgq/gconf/test-gconf.h | 86 + src/3rdparty/libjpeg.pri | 63 + src/3rdparty/libjpeg/README | 326 + src/3rdparty/libjpeg/cderror.h | 134 + src/3rdparty/libjpeg/cdjpeg.h | 187 + src/3rdparty/libjpeg/change.log | 326 + src/3rdparty/libjpeg/ckconfig.c | 402 + src/3rdparty/libjpeg/coderules.txt | 118 + src/3rdparty/libjpeg/example.c | 433 + src/3rdparty/libjpeg/filelist.txt | 215 + src/3rdparty/libjpeg/jaricom.c | 153 + src/3rdparty/libjpeg/jcapimin.c | 288 + src/3rdparty/libjpeg/jcapistd.c | 161 + src/3rdparty/libjpeg/jcarith.c | 934 + src/3rdparty/libjpeg/jccoefct.c | 453 + src/3rdparty/libjpeg/jccolor.c | 459 + src/3rdparty/libjpeg/jcdctmgr.c | 482 + src/3rdparty/libjpeg/jchuff.c | 1576 + src/3rdparty/libjpeg/jcinit.c | 65 + src/3rdparty/libjpeg/jcmainct.c | 293 + src/3rdparty/libjpeg/jcmarker.c | 682 + src/3rdparty/libjpeg/jcmaster.c | 858 + src/3rdparty/libjpeg/jcomapi.c | 106 + src/3rdparty/libjpeg/jconfig.bcc | 48 + src/3rdparty/libjpeg/jconfig.cfg | 53 + src/3rdparty/libjpeg/jconfig.dj | 38 + src/3rdparty/libjpeg/jconfig.h | 164 + src/3rdparty/libjpeg/jconfig.mac | 43 + src/3rdparty/libjpeg/jconfig.manx | 43 + src/3rdparty/libjpeg/jconfig.mc6 | 52 + src/3rdparty/libjpeg/jconfig.sas | 43 + src/3rdparty/libjpeg/jconfig.st | 42 + src/3rdparty/libjpeg/jconfig.txt | 164 + src/3rdparty/libjpeg/jconfig.vc | 45 + src/3rdparty/libjpeg/jconfig.vms | 37 + src/3rdparty/libjpeg/jconfig.wat | 38 + src/3rdparty/libjpeg/jcparam.c | 632 + src/3rdparty/libjpeg/jcprepct.c | 358 + src/3rdparty/libjpeg/jcsample.c | 545 + src/3rdparty/libjpeg/jctrans.c | 382 + src/3rdparty/libjpeg/jdapimin.c | 396 + src/3rdparty/libjpeg/jdapistd.c | 275 + src/3rdparty/libjpeg/jdarith.c | 772 + src/3rdparty/libjpeg/jdatadst.c | 267 + src/3rdparty/libjpeg/jdatasrc.c | 274 + src/3rdparty/libjpeg/jdcoefct.c | 736 + src/3rdparty/libjpeg/jdcolor.c | 396 + src/3rdparty/libjpeg/jdct.h | 393 + src/3rdparty/libjpeg/jddctmgr.c | 384 + src/3rdparty/libjpeg/jdhuff.c | 1541 + src/3rdparty/libjpeg/jdinput.c | 661 + src/3rdparty/libjpeg/jdmainct.c | 512 + src/3rdparty/libjpeg/jdmarker.c | 1406 + src/3rdparty/libjpeg/jdmaster.c | 533 + src/3rdparty/libjpeg/jdmerge.c | 400 + src/3rdparty/libjpeg/jdpostct.c | 290 + src/3rdparty/libjpeg/jdsample.c | 361 + src/3rdparty/libjpeg/jdtrans.c | 140 + src/3rdparty/libjpeg/jerror.c | 252 + src/3rdparty/libjpeg/jerror.h | 304 + src/3rdparty/libjpeg/jfdctflt.c | 174 + src/3rdparty/libjpeg/jfdctfst.c | 230 + src/3rdparty/libjpeg/jfdctint.c | 4348 + src/3rdparty/libjpeg/jidctflt.c | 235 + src/3rdparty/libjpeg/jidctfst.c | 368 + src/3rdparty/libjpeg/jidctint.c | 5137 + src/3rdparty/libjpeg/jinclude.h | 95 + src/3rdparty/libjpeg/jmemansi.c | 167 + src/3rdparty/libjpeg/jmemdos.c | 638 + src/3rdparty/libjpeg/jmemdosa.asm | 379 + src/3rdparty/libjpeg/jmemmac.c | 289 + src/3rdparty/libjpeg/jmemmgr.c | 1118 + src/3rdparty/libjpeg/jmemname.c | 276 + src/3rdparty/libjpeg/jmemnobs.c | 109 + src/3rdparty/libjpeg/jmemsys.h | 198 + src/3rdparty/libjpeg/jmorecfg.h | 377 + src/3rdparty/libjpeg/jpegint.h | 407 + src/3rdparty/libjpeg/jpeglib.h | 1160 + src/3rdparty/libjpeg/jpegtran.1 | 285 + src/3rdparty/libjpeg/jquant1.c | 856 + src/3rdparty/libjpeg/jquant2.c | 1310 + src/3rdparty/libjpeg/jutils.c | 231 + src/3rdparty/libjpeg/jversion.h | 14 + src/3rdparty/libjpeg/libjpeg.txt | 3084 + src/3rdparty/libjpeg/rdjpgcom.1 | 63 + src/3rdparty/libjpeg/structure.txt | 945 + src/3rdparty/libjpeg/transupp.h | 210 + src/3rdparty/libjpeg/usage.txt | 631 + src/3rdparty/libjpeg/wizard.txt | 211 + src/3rdparty/libjpeg/wrjpgcom.1 | 103 + src/3rdparty/libmng.pri | 25 + src/3rdparty/libmng/CHANGES | 1447 + src/3rdparty/libmng/LICENSE | 57 + src/3rdparty/libmng/README | 36 + src/3rdparty/libmng/README.autoconf | 213 + src/3rdparty/libmng/README.config | 104 + src/3rdparty/libmng/README.contrib | 95 + src/3rdparty/libmng/README.dll | 41 + src/3rdparty/libmng/README.examples | 48 + src/3rdparty/libmng/README.footprint | 46 + src/3rdparty/libmng/README.packaging | 24 + src/3rdparty/libmng/doc/Plan1.png | Bin 0 -> 9058 bytes src/3rdparty/libmng/doc/Plan2.png | Bin 0 -> 8849 bytes src/3rdparty/libmng/doc/doc.readme | 19 + src/3rdparty/libmng/doc/libmng.txt | 1107 + src/3rdparty/libmng/doc/man/jng.5 | 37 + src/3rdparty/libmng/doc/man/libmng.3 | 1146 + src/3rdparty/libmng/doc/man/mng.5 | 42 + src/3rdparty/libmng/doc/misc/magic.dif | 30 + .../libmng/doc/rpm/libmng-1.0.10-rhconf.patch | 38 + src/3rdparty/libmng/doc/rpm/libmng.spec | 116 + src/3rdparty/libmng/libmng.h | 2932 + src/3rdparty/libmng/libmng_callback_xs.c | 1239 + src/3rdparty/libmng/libmng_chunk_descr.c | 6090 + src/3rdparty/libmng/libmng_chunk_descr.h | 146 + src/3rdparty/libmng/libmng_chunk_io.c | 10740 + src/3rdparty/libmng/libmng_chunk_io.h | 415 + src/3rdparty/libmng/libmng_chunk_prc.c | 4452 + src/3rdparty/libmng/libmng_chunk_prc.h | 381 + src/3rdparty/libmng/libmng_chunk_xs.c | 7016 + src/3rdparty/libmng/libmng_chunks.h | 1026 + src/3rdparty/libmng/libmng_cms.c | 758 + src/3rdparty/libmng/libmng_cms.h | 92 + src/3rdparty/libmng/libmng_conf.h | 295 + src/3rdparty/libmng/libmng_data.h | 1032 + src/3rdparty/libmng/libmng_display.c | 7140 + src/3rdparty/libmng/libmng_display.h | 343 + src/3rdparty/libmng/libmng_dither.c | 58 + src/3rdparty/libmng/libmng_dither.h | 45 + src/3rdparty/libmng/libmng_error.c | 326 + src/3rdparty/libmng/libmng_error.h | 119 + src/3rdparty/libmng/libmng_filter.c | 978 + src/3rdparty/libmng/libmng_filter.h | 69 + src/3rdparty/libmng/libmng_hlapi.c | 3001 + src/3rdparty/libmng/libmng_jpeg.c | 1088 + src/3rdparty/libmng/libmng_jpeg.h | 57 + src/3rdparty/libmng/libmng_memory.h | 64 + src/3rdparty/libmng/libmng_object_prc.c | 6998 + src/3rdparty/libmng/libmng_object_prc.h | 690 + src/3rdparty/libmng/libmng_objects.h | 635 + src/3rdparty/libmng/libmng_pixels.c | 24610 + src/3rdparty/libmng/libmng_pixels.h | 1147 + src/3rdparty/libmng/libmng_prop_xs.c | 2799 + src/3rdparty/libmng/libmng_read.c | 1369 + src/3rdparty/libmng/libmng_read.h | 53 + src/3rdparty/libmng/libmng_trace.c | 1683 + src/3rdparty/libmng/libmng_trace.h | 1474 + src/3rdparty/libmng/libmng_types.h | 574 + src/3rdparty/libmng/libmng_write.c | 198 + src/3rdparty/libmng/libmng_write.h | 49 + src/3rdparty/libmng/libmng_zlib.c | 607 + src/3rdparty/libmng/libmng_zlib.h | 60 + src/3rdparty/libmng/makefiles/Makefile.am | 29 + src/3rdparty/libmng/makefiles/README | 27 + src/3rdparty/libmng/makefiles/configure.in | 193 + src/3rdparty/libmng/makefiles/makefile.bcb3 | 108 + src/3rdparty/libmng/makefiles/makefile.dj | 155 + src/3rdparty/libmng/makefiles/makefile.linux | 180 + src/3rdparty/libmng/makefiles/makefile.mingw | 164 + src/3rdparty/libmng/makefiles/makefile.mingwdll | 158 + src/3rdparty/libmng/makefiles/makefile.qnx | 160 + src/3rdparty/libmng/makefiles/makefile.unix | 67 + src/3rdparty/libmng/makefiles/makefile.vcwin32 | 99 + src/3rdparty/libmng/unmaintained/autogen.sh | 50 + src/3rdparty/libpng.pri | 20 + src/3rdparty/libpng/ANNOUNCE | 96 + src/3rdparty/libpng/CHANGES | 3253 + src/3rdparty/libpng/CMakeLists.txt | 406 + src/3rdparty/libpng/INSTALL | 135 + src/3rdparty/libpng/LICENSE | 111 + src/3rdparty/libpng/README | 205 + src/3rdparty/libpng/TODO | 27 + src/3rdparty/libpng/config.guess | 1501 + src/3rdparty/libpng/config.h.in | 86 + src/3rdparty/libpng/config.sub | 1705 + src/3rdparty/libpng/configure.ac | 167 + src/3rdparty/libpng/example.c | 843 + src/3rdparty/libpng/libpng-manual.txt | 4136 + src/3rdparty/libpng/libpng.3 | 5376 + src/3rdparty/libpng/libpng.pc.in | 11 + src/3rdparty/libpng/libpngpf.3 | 30 + src/3rdparty/libpng/png.5 | 74 + src/3rdparty/libpng/png.c | 2362 + src/3rdparty/libpng/png.h | 2280 + src/3rdparty/libpng/pngconf.h | 639 + src/3rdparty/libpng/pngdebug.h | 157 + src/3rdparty/libpng/pngerror.c | 447 + src/3rdparty/libpng/pngget.c | 1032 + src/3rdparty/libpng/pnginfo.h | 270 + src/3rdparty/libpng/pnglibconf.h | 176 + src/3rdparty/libpng/pngmem.c | 658 + src/3rdparty/libpng/pngpread.c | 1854 + src/3rdparty/libpng/pngpriv.h | 1245 + src/3rdparty/libpng/pngread.c | 1466 + src/3rdparty/libpng/pngrio.c | 176 + src/3rdparty/libpng/pngrtran.c | 4224 + src/3rdparty/libpng/pngrutil.c | 3616 + src/3rdparty/libpng/pngset.c | 1225 + src/3rdparty/libpng/pngstruct.h | 308 + src/3rdparty/libpng/pngtest.c | 1787 + src/3rdparty/libpng/pngtrans.c | 723 + src/3rdparty/libpng/pngvalid.c | 6658 + src/3rdparty/libpng/pngwio.c | 254 + src/3rdparty/libpng/pngwrite.c | 1605 + src/3rdparty/libpng/pngwtran.c | 631 + src/3rdparty/libpng/pngwutil.c | 2948 + src/3rdparty/libtiff.pri | 43 + src/3rdparty/libtiff/COPYRIGHT | 21 + src/3rdparty/libtiff/ChangeLog | 4426 + src/3rdparty/libtiff/HOWTO-RELEASE | 105 + src/3rdparty/libtiff/README | 59 + src/3rdparty/libtiff/README.vms | 12 + src/3rdparty/libtiff/RELEASE-DATE | 1 + src/3rdparty/libtiff/SConstruct | 171 + src/3rdparty/libtiff/TODO | 12 + src/3rdparty/libtiff/VERSION | 1 + src/3rdparty/libtiff/html/TIFFTechNote2.html | 707 + src/3rdparty/libtiff/html/addingtags.html | 292 + src/3rdparty/libtiff/html/bugs.html | 63 + src/3rdparty/libtiff/html/build.html | 880 + src/3rdparty/libtiff/html/contrib.html | 209 + src/3rdparty/libtiff/html/document.html | 48 + src/3rdparty/libtiff/html/images.html | 41 + src/3rdparty/libtiff/html/images/back.gif | Bin 0 -> 1000 bytes src/3rdparty/libtiff/html/images/bali.jpg | Bin 0 -> 26152 bytes src/3rdparty/libtiff/html/images/cat.gif | Bin 0 -> 12477 bytes src/3rdparty/libtiff/html/images/cover.jpg | Bin 0 -> 20189 bytes src/3rdparty/libtiff/html/images/cramps.gif | Bin 0 -> 13137 bytes src/3rdparty/libtiff/html/images/dave.gif | Bin 0 -> 8220 bytes src/3rdparty/libtiff/html/images/info.gif | Bin 0 -> 131 bytes src/3rdparty/libtiff/html/images/jello.jpg | Bin 0 -> 13744 bytes src/3rdparty/libtiff/html/images/jim.gif | Bin 0 -> 14493 bytes src/3rdparty/libtiff/html/images/note.gif | Bin 0 -> 264 bytes src/3rdparty/libtiff/html/images/oxford.gif | Bin 0 -> 6069 bytes src/3rdparty/libtiff/html/images/quad.jpg | Bin 0 -> 23904 bytes src/3rdparty/libtiff/html/images/ring.gif | Bin 0 -> 4275 bytes src/3rdparty/libtiff/html/images/smallliz.jpg | Bin 0 -> 16463 bytes src/3rdparty/libtiff/html/images/strike.gif | Bin 0 -> 5610 bytes src/3rdparty/libtiff/html/images/warning.gif | Bin 0 -> 287 bytes src/3rdparty/libtiff/html/index.html | 123 + src/3rdparty/libtiff/html/internals.html | 572 + src/3rdparty/libtiff/html/intro.html | 68 + src/3rdparty/libtiff/html/libtiff.html | 747 + src/3rdparty/libtiff/html/man/TIFFClose.3tiff.html | 87 + .../libtiff/html/man/TIFFDataWidth.3tiff.html | 98 + src/3rdparty/libtiff/html/man/TIFFError.3tiff.html | 106 + src/3rdparty/libtiff/html/man/TIFFFlush.3tiff.html | 113 + .../libtiff/html/man/TIFFGetField.3tiff.html | 1446 + src/3rdparty/libtiff/html/man/TIFFOpen.3tiff.html | 421 + .../libtiff/html/man/TIFFPrintDirectory.3tiff.html | 225 + .../libtiff/html/man/TIFFRGBAImage.3tiff.html | 319 + .../libtiff/html/man/TIFFReadDirectory.3tiff.html | 218 + .../html/man/TIFFReadEncodedStrip.3tiff.html | 133 + .../html/man/TIFFReadEncodedTile.3tiff.html | 130 + .../libtiff/html/man/TIFFReadRGBAImage.3tiff.html | 301 + .../libtiff/html/man/TIFFReadRGBAStrip.3tiff.html | 208 + .../libtiff/html/man/TIFFReadRGBATile.3tiff.html | 261 + .../libtiff/html/man/TIFFReadRawStrip.3tiff.html | 109 + .../libtiff/html/man/TIFFReadRawTile.3tiff.html | 111 + .../libtiff/html/man/TIFFReadScanline.3tiff.html | 157 + .../libtiff/html/man/TIFFReadTile.3tiff.html | 133 + .../libtiff/html/man/TIFFSetDirectory.3tiff.html | 122 + .../libtiff/html/man/TIFFSetField.3tiff.html | 1362 + .../libtiff/html/man/TIFFWarning.3tiff.html | 108 + .../libtiff/html/man/TIFFWriteDirectory.3tiff.html | 176 + .../html/man/TIFFWriteEncodedStrip.3tiff.html | 153 + .../html/man/TIFFWriteEncodedTile.3tiff.html | 147 + .../libtiff/html/man/TIFFWriteRawStrip.3tiff.html | 144 + .../libtiff/html/man/TIFFWriteRawTile.3tiff.html | 128 + .../libtiff/html/man/TIFFWriteScanline.3tiff.html | 206 + .../libtiff/html/man/TIFFWriteTile.3tiff.html | 115 + .../libtiff/html/man/TIFFbuffer.3tiff.html | 116 + src/3rdparty/libtiff/html/man/TIFFcodec.3tiff.html | 116 + src/3rdparty/libtiff/html/man/TIFFcolor.3tiff.html | 975 + .../libtiff/html/man/TIFFmemory.3tiff.html | 110 + src/3rdparty/libtiff/html/man/TIFFquery.3tiff.html | 148 + src/3rdparty/libtiff/html/man/TIFFsize.3tiff.html | 95 + src/3rdparty/libtiff/html/man/TIFFstrip.3tiff.html | 129 + src/3rdparty/libtiff/html/man/TIFFswab.3tiff.html | 110 + src/3rdparty/libtiff/html/man/TIFFtile.3tiff.html | 141 + src/3rdparty/libtiff/html/man/fax2ps.1.html | 252 + src/3rdparty/libtiff/html/man/fax2tiff.1.html | 607 + src/3rdparty/libtiff/html/man/gif2tiff.1.html | 141 + src/3rdparty/libtiff/html/man/index.html | 64 + src/3rdparty/libtiff/html/man/libtiff.3tiff.html | 3137 + src/3rdparty/libtiff/html/man/pal2rgb.1.html | 189 + src/3rdparty/libtiff/html/man/ppm2tiff.1.html | 141 + src/3rdparty/libtiff/html/man/ras2tiff.1.html | 139 + src/3rdparty/libtiff/html/man/raw2tiff.1.html | 510 + src/3rdparty/libtiff/html/man/rgb2ycbcr.1.html | 155 + src/3rdparty/libtiff/html/man/sgi2tiff.1.html | 147 + src/3rdparty/libtiff/html/man/thumbnail.1.html | 148 + src/3rdparty/libtiff/html/man/tiff2bw.1.html | 161 + src/3rdparty/libtiff/html/man/tiff2pdf.1.html | 609 + src/3rdparty/libtiff/html/man/tiff2ps.1.html | 532 + src/3rdparty/libtiff/html/man/tiff2rgba.1.html | 162 + src/3rdparty/libtiff/html/man/tiffcmp.1.html | 156 + src/3rdparty/libtiff/html/man/tiffcp.1.html | 522 + src/3rdparty/libtiff/html/man/tiffcrop.1.html | 851 + src/3rdparty/libtiff/html/man/tiffdither.1.html | 183 + src/3rdparty/libtiff/html/man/tiffdump.1.html | 145 + src/3rdparty/libtiff/html/man/tiffgt.1.html | 551 + src/3rdparty/libtiff/html/man/tiffinfo.1.html | 196 + src/3rdparty/libtiff/html/man/tiffmedian.1.html | 183 + src/3rdparty/libtiff/html/man/tiffset.1.html | 176 + src/3rdparty/libtiff/html/man/tiffsplit.1.html | 102 + src/3rdparty/libtiff/html/man/tiffsv.1.html | 207 + src/3rdparty/libtiff/html/misc.html | 116 + src/3rdparty/libtiff/html/support.html | 655 + src/3rdparty/libtiff/html/tools.html | 164 + src/3rdparty/libtiff/html/v3.4beta007.html | 112 + src/3rdparty/libtiff/html/v3.4beta016.html | 122 + src/3rdparty/libtiff/html/v3.4beta018.html | 84 + src/3rdparty/libtiff/html/v3.4beta024.html | 139 + src/3rdparty/libtiff/html/v3.4beta028.html | 146 + src/3rdparty/libtiff/html/v3.4beta029.html | 86 + src/3rdparty/libtiff/html/v3.4beta031.html | 94 + src/3rdparty/libtiff/html/v3.4beta032.html | 90 + src/3rdparty/libtiff/html/v3.4beta033.html | 82 + src/3rdparty/libtiff/html/v3.4beta034.html | 68 + src/3rdparty/libtiff/html/v3.4beta035.html | 63 + src/3rdparty/libtiff/html/v3.4beta036.html | 117 + src/3rdparty/libtiff/html/v3.5.1.html | 75 + src/3rdparty/libtiff/html/v3.5.2.html | 108 + src/3rdparty/libtiff/html/v3.5.3.html | 132 + src/3rdparty/libtiff/html/v3.5.4.html | 88 + src/3rdparty/libtiff/html/v3.5.5.html | 155 + src/3rdparty/libtiff/html/v3.5.6-beta.html | 185 + src/3rdparty/libtiff/html/v3.5.7.html | 259 + src/3rdparty/libtiff/html/v3.6.0.html | 434 + src/3rdparty/libtiff/html/v3.6.1.html | 199 + src/3rdparty/libtiff/html/v3.7.0.html | 144 + src/3rdparty/libtiff/html/v3.7.0alpha.html | 249 + src/3rdparty/libtiff/html/v3.7.0beta.html | 162 + src/3rdparty/libtiff/html/v3.7.0beta2.html | 131 + src/3rdparty/libtiff/html/v3.7.1.html | 233 + src/3rdparty/libtiff/html/v3.7.2.html | 222 + src/3rdparty/libtiff/html/v3.7.3.html | 230 + src/3rdparty/libtiff/html/v3.7.4.html | 133 + src/3rdparty/libtiff/html/v3.8.0.html | 199 + src/3rdparty/libtiff/html/v3.8.1.html | 217 + src/3rdparty/libtiff/html/v3.8.2.html | 137 + src/3rdparty/libtiff/html/v3.9.0beta.html | 304 + src/3rdparty/libtiff/html/v3.9.1.html | 115 + src/3rdparty/libtiff/html/v3.9.2.html | 122 + src/3rdparty/libtiff/libtiff/SConstruct | 73 + src/3rdparty/libtiff/libtiff/libtiff.def | 140 + src/3rdparty/libtiff/libtiff/mkg3states.c | 444 + src/3rdparty/libtiff/libtiff/t4.h | 285 + src/3rdparty/libtiff/libtiff/tif_acorn.c | 519 + src/3rdparty/libtiff/libtiff/tif_apple.c | 274 + src/3rdparty/libtiff/libtiff/tif_atari.c | 243 + src/3rdparty/libtiff/libtiff/tif_aux.c | 275 + src/3rdparty/libtiff/libtiff/tif_close.c | 119 + src/3rdparty/libtiff/libtiff/tif_codec.c | 153 + src/3rdparty/libtiff/libtiff/tif_color.c | 275 + src/3rdparty/libtiff/libtiff/tif_compress.c | 288 + src/3rdparty/libtiff/libtiff/tif_config.h | 337 + src/3rdparty/libtiff/libtiff/tif_config.h-vms | 46 + src/3rdparty/libtiff/libtiff/tif_config.h.in | 309 + src/3rdparty/libtiff/libtiff/tif_config.vc.h | 56 + src/3rdparty/libtiff/libtiff/tif_config.wince.h | 67 + src/3rdparty/libtiff/libtiff/tif_dir.c | 1369 + src/3rdparty/libtiff/libtiff/tif_dir.h | 202 + src/3rdparty/libtiff/libtiff/tif_dirinfo.c | 881 + src/3rdparty/libtiff/libtiff/tif_dirread.c | 2016 + src/3rdparty/libtiff/libtiff/tif_dirwrite.c | 1407 + src/3rdparty/libtiff/libtiff/tif_dumpmode.c | 119 + src/3rdparty/libtiff/libtiff/tif_error.c | 73 + src/3rdparty/libtiff/libtiff/tif_extension.c | 111 + src/3rdparty/libtiff/libtiff/tif_fax3.c | 1603 + src/3rdparty/libtiff/libtiff/tif_fax3.h | 525 + src/3rdparty/libtiff/libtiff/tif_fax3sm.c | 1253 + src/3rdparty/libtiff/libtiff/tif_flush.c | 67 + src/3rdparty/libtiff/libtiff/tif_getimage.c | 2669 + src/3rdparty/libtiff/libtiff/tif_jbig.c | 378 + src/3rdparty/libtiff/libtiff/tif_jpeg.c | 2035 + src/3rdparty/libtiff/libtiff/tif_luv.c | 1622 + src/3rdparty/libtiff/libtiff/tif_lzw.c | 1122 + src/3rdparty/libtiff/libtiff/tif_msdos.c | 186 + src/3rdparty/libtiff/libtiff/tif_next.c | 147 + src/3rdparty/libtiff/libtiff/tif_ojpeg.c | 2427 + src/3rdparty/libtiff/libtiff/tif_open.c | 688 + src/3rdparty/libtiff/libtiff/tif_packbits.c | 293 + src/3rdparty/libtiff/libtiff/tif_pixarlog.c | 1364 + src/3rdparty/libtiff/libtiff/tif_predict.c | 729 + src/3rdparty/libtiff/libtiff/tif_predict.h | 70 + src/3rdparty/libtiff/libtiff/tif_print.c | 639 + src/3rdparty/libtiff/libtiff/tif_read.c | 741 + src/3rdparty/libtiff/libtiff/tif_stream.cxx | 295 + src/3rdparty/libtiff/libtiff/tif_strip.c | 363 + src/3rdparty/libtiff/libtiff/tif_swab.c | 235 + src/3rdparty/libtiff/libtiff/tif_thunder.c | 158 + src/3rdparty/libtiff/libtiff/tif_tile.c | 273 + src/3rdparty/libtiff/libtiff/tif_unix.c | 293 + src/3rdparty/libtiff/libtiff/tif_version.c | 33 + src/3rdparty/libtiff/libtiff/tif_warning.c | 74 + src/3rdparty/libtiff/libtiff/tif_win3.c | 225 + src/3rdparty/libtiff/libtiff/tif_win32.c | 402 + src/3rdparty/libtiff/libtiff/tif_wince.c | 281 + src/3rdparty/libtiff/libtiff/tif_write.c | 711 + src/3rdparty/libtiff/libtiff/tif_zip.c | 412 + src/3rdparty/libtiff/libtiff/tiff.h | 647 + src/3rdparty/libtiff/libtiff/tiffconf.h | 110 + src/3rdparty/libtiff/libtiff/tiffconf.h.in | 103 + src/3rdparty/libtiff/libtiff/tiffconf.vc.h | 109 + src/3rdparty/libtiff/libtiff/tiffconf.wince.h | 129 + src/3rdparty/libtiff/libtiff/tiffio.h | 521 + src/3rdparty/libtiff/libtiff/tiffio.hxx | 42 + src/3rdparty/libtiff/libtiff/tiffiop.h | 343 + src/3rdparty/libtiff/libtiff/tiffvers.h | 9 + src/3rdparty/libtiff/libtiff/uvcode.h | 173 + src/3rdparty/libtiff/nmake.opt | 218 + src/3rdparty/libtiff/port/dummy.c | 12 + src/3rdparty/libtiff/port/getopt.c | 124 + src/3rdparty/libtiff/port/lfind.c | 62 + src/3rdparty/libtiff/port/libport.h | 51 + src/3rdparty/libtiff/port/strcasecmp.c | 50 + src/3rdparty/libtiff/port/strtoul.c | 109 + src/3rdparty/md4/md4.cpp | 265 + src/3rdparty/md4/md4.h | 31 + src/3rdparty/md5/md5.cpp | 247 + src/3rdparty/md5/md5.h | 48 + .../patches/libmng-1.0.10-endless-loop.patch | 65 + src/3rdparty/pixman/README | 26 + src/3rdparty/pixman/pixman-arm-neon-asm.S | 1709 + src/3rdparty/pixman/pixman-arm-neon-asm.h | 906 + src/3rdparty/powervr/pvr2d.h | 502 + src/3rdparty/powervr/wsegl.h | 240 + src/3rdparty/ptmalloc/COPYRIGHT | 19 + src/3rdparty/ptmalloc/ChangeLog | 33 + src/3rdparty/ptmalloc/Makefile | 211 + src/3rdparty/ptmalloc/README | 186 + src/3rdparty/ptmalloc/lran2.h | 51 + src/3rdparty/ptmalloc/malloc-2.8.3.h | 534 + src/3rdparty/ptmalloc/malloc-private.h | 170 + src/3rdparty/ptmalloc/malloc.c | 5515 + src/3rdparty/ptmalloc/ptmalloc3.c | 1135 + src/3rdparty/ptmalloc/sysdeps/generic/atomic.h | 1 + .../ptmalloc/sysdeps/generic/malloc-machine.h | 68 + src/3rdparty/ptmalloc/sysdeps/generic/thread-st.h | 48 + .../ptmalloc/sysdeps/pthread/malloc-machine.h | 131 + src/3rdparty/ptmalloc/sysdeps/pthread/thread-st.h | 111 + .../ptmalloc/sysdeps/solaris/malloc-machine.h | 51 + src/3rdparty/ptmalloc/sysdeps/solaris/thread-st.h | 72 + .../ptmalloc/sysdeps/sproc/malloc-machine.h | 51 + src/3rdparty/ptmalloc/sysdeps/sproc/thread-st.h | 85 + src/3rdparty/s60/eiksoftkeyimage.h | 95 + src/3rdparty/sha1/sha1.cpp | 263 + src/3rdparty/sqlite.pri | 4 + src/3rdparty/sqlite/shell.c | 2093 + src/3rdparty/sqlite/sqlite3.c | 110646 +++ src/3rdparty/sqlite/sqlite3.h | 5763 + src/3rdparty/wintab/pktdef.h | 233 + src/3rdparty/wintab/wintab.h | 864 + src/3rdparty/xorg/wacomcfg.h | 138 + src/3rdparty/zlib.pri | 18 + src/3rdparty/zlib/CMakeLists.txt | 190 + src/3rdparty/zlib/ChangeLog | 1208 + src/3rdparty/zlib/FAQ | 366 + src/3rdparty/zlib/INDEX | 65 + src/3rdparty/zlib/README | 115 + src/3rdparty/zlib/adler32.c | 169 + src/3rdparty/zlib/compress.c | 80 + src/3rdparty/zlib/crc32.c | 442 + src/3rdparty/zlib/crc32.h | 441 + src/3rdparty/zlib/deflate.c | 1834 + src/3rdparty/zlib/deflate.h | 342 + src/3rdparty/zlib/doc/algorithm.txt | 209 + src/3rdparty/zlib/doc/rfc1950.txt | 619 + src/3rdparty/zlib/doc/rfc1951.txt | 955 + src/3rdparty/zlib/doc/rfc1952.txt | 675 + src/3rdparty/zlib/doc/txtvsbin.txt | 107 + src/3rdparty/zlib/example.c | 565 + src/3rdparty/zlib/gzclose.c | 25 + src/3rdparty/zlib/gzguts.h | 140 + src/3rdparty/zlib/gzlib.c | 537 + src/3rdparty/zlib/gzread.c | 653 + src/3rdparty/zlib/gzwrite.c | 531 + src/3rdparty/zlib/infback.c | 632 + src/3rdparty/zlib/inffast.c | 340 + src/3rdparty/zlib/inffast.h | 11 + src/3rdparty/zlib/inffixed.h | 94 + src/3rdparty/zlib/inflate.c | 1480 + src/3rdparty/zlib/inflate.h | 122 + src/3rdparty/zlib/inftrees.c | 330 + src/3rdparty/zlib/inftrees.h | 62 + src/3rdparty/zlib/minigzip.c | 440 + src/3rdparty/zlib/treebuild.xml | 116 + src/3rdparty/zlib/trees.c | 1244 + src/3rdparty/zlib/trees.h | 128 + src/3rdparty/zlib/uncompr.c | 59 + src/3rdparty/zlib/zconf.h | 428 + src/3rdparty/zlib/zconf.h.cmakein | 430 + src/3rdparty/zlib/zconf.h.in | 428 + src/3rdparty/zlib/zlib.3 | 151 + src/3rdparty/zlib/zlib.3.pdf | Bin 0 -> 8686 bytes src/3rdparty/zlib/zlib.h | 1622 + src/3rdparty/zlib/zlib.pc.in | 13 + src/3rdparty/zlib/zutil.c | 318 + src/3rdparty/zlib/zutil.h | 275 + src/3rdparty/zlib_dependency.pri | 8 + 1298 files changed, 1731185 insertions(+) create mode 100644 src/3rdparty/.gitattributes create mode 100644 src/3rdparty/Makefile create mode 100644 src/3rdparty/README create mode 100644 src/3rdparty/ce-compat/ce_time.c create mode 100644 src/3rdparty/ce-compat/ce_time.h create mode 100644 src/3rdparty/des/des.cpp create mode 100644 src/3rdparty/easing/easing.cpp create mode 100644 src/3rdparty/easing/legal.qdoc create mode 100644 src/3rdparty/fonts/5x7.bdf create mode 100644 src/3rdparty/fonts/6x13.bdf create mode 100644 src/3rdparty/fonts/COPYING.Cursor create mode 100644 src/3rdparty/fonts/COPYING.Helvetica create mode 100644 src/3rdparty/fonts/COPYING.Utopia create mode 100644 src/3rdparty/fonts/COPYRIGHT.BH create mode 100644 src/3rdparty/fonts/COPYRIGHT.Charter create mode 100644 src/3rdparty/fonts/COPYRIGHT.Courier create mode 100644 src/3rdparty/fonts/COPYRIGHT.DejaVu create mode 100644 src/3rdparty/fonts/COPYRIGHT.IBM create mode 100644 src/3rdparty/fonts/COPYRIGHT.Unifont create mode 100644 src/3rdparty/fonts/COPYRIGHT.Vera create mode 100644 src/3rdparty/fonts/README.DejaVu create mode 100644 src/3rdparty/fonts/helvB08.bdf create mode 100644 src/3rdparty/fonts/helvB10.bdf create mode 100644 src/3rdparty/fonts/helvB12.bdf create mode 100644 src/3rdparty/fonts/helvB14.bdf create mode 100644 src/3rdparty/fonts/helvB18.bdf create mode 100644 src/3rdparty/fonts/helvB24.bdf create mode 100644 src/3rdparty/fonts/helvBO08.bdf create mode 100644 src/3rdparty/fonts/helvBO10.bdf create mode 100644 src/3rdparty/fonts/helvBO12.bdf create mode 100644 src/3rdparty/fonts/helvBO14.bdf create mode 100644 src/3rdparty/fonts/helvBO18.bdf create mode 100644 src/3rdparty/fonts/helvBO24.bdf create mode 100644 src/3rdparty/fonts/helvO08.bdf create mode 100644 src/3rdparty/fonts/helvO10.bdf create mode 100644 src/3rdparty/fonts/helvO12.bdf create mode 100644 src/3rdparty/fonts/helvO14.bdf create mode 100644 src/3rdparty/fonts/helvO18.bdf create mode 100644 src/3rdparty/fonts/helvO24.bdf create mode 100644 src/3rdparty/fonts/helvR08.bdf create mode 100644 src/3rdparty/fonts/helvR10.bdf create mode 100644 src/3rdparty/fonts/helvR12.bdf create mode 100644 src/3rdparty/fonts/helvR14.bdf create mode 100644 src/3rdparty/fonts/helvR18.bdf create mode 100644 src/3rdparty/fonts/helvR24.bdf create mode 100644 src/3rdparty/fonts/micro.bdf create mode 100644 src/3rdparty/fonts/unifont.bdf create mode 100644 src/3rdparty/freetype/ChangeLog create mode 100644 src/3rdparty/freetype/ChangeLog.20 create mode 100644 src/3rdparty/freetype/ChangeLog.21 create mode 100644 src/3rdparty/freetype/ChangeLog.22 create mode 100644 src/3rdparty/freetype/Jamfile create mode 100644 src/3rdparty/freetype/Jamrules create mode 100644 src/3rdparty/freetype/Makefile create mode 100644 src/3rdparty/freetype/README create mode 100644 src/3rdparty/freetype/README.CVS create mode 100644 src/3rdparty/freetype/autogen.sh create mode 100644 src/3rdparty/freetype/builds/amiga/README create mode 100644 src/3rdparty/freetype/builds/amiga/include/freetype/config/ftconfig.h create mode 100644 src/3rdparty/freetype/builds/amiga/include/freetype/config/ftmodule.h create mode 100644 src/3rdparty/freetype/builds/amiga/makefile create mode 100644 src/3rdparty/freetype/builds/amiga/makefile.os4 create mode 100644 src/3rdparty/freetype/builds/amiga/smakefile create mode 100644 src/3rdparty/freetype/builds/amiga/src/base/ftdebug.c create mode 100644 src/3rdparty/freetype/builds/amiga/src/base/ftsystem.c create mode 100644 src/3rdparty/freetype/builds/ansi/ansi-def.mk create mode 100644 src/3rdparty/freetype/builds/ansi/ansi.mk create mode 100644 src/3rdparty/freetype/builds/atari/ATARI.H create mode 100644 src/3rdparty/freetype/builds/atari/FNames.SIC create mode 100644 src/3rdparty/freetype/builds/atari/FREETYPE.PRJ create mode 100644 src/3rdparty/freetype/builds/atari/README.TXT create mode 100644 src/3rdparty/freetype/builds/beos/beos-def.mk create mode 100644 src/3rdparty/freetype/builds/beos/beos.mk create mode 100644 src/3rdparty/freetype/builds/beos/detect.mk create mode 100644 src/3rdparty/freetype/builds/compiler/ansi-cc.mk create mode 100644 src/3rdparty/freetype/builds/compiler/bcc-dev.mk create mode 100644 src/3rdparty/freetype/builds/compiler/bcc.mk create mode 100644 src/3rdparty/freetype/builds/compiler/emx.mk create mode 100644 src/3rdparty/freetype/builds/compiler/gcc-dev.mk create mode 100644 src/3rdparty/freetype/builds/compiler/gcc.mk create mode 100644 src/3rdparty/freetype/builds/compiler/intelc.mk create mode 100644 src/3rdparty/freetype/builds/compiler/unix-lcc.mk create mode 100644 src/3rdparty/freetype/builds/compiler/visualage.mk create mode 100644 src/3rdparty/freetype/builds/compiler/visualc.mk create mode 100644 src/3rdparty/freetype/builds/compiler/watcom.mk create mode 100644 src/3rdparty/freetype/builds/compiler/win-lcc.mk create mode 100644 src/3rdparty/freetype/builds/detect.mk create mode 100644 src/3rdparty/freetype/builds/dos/detect.mk create mode 100644 src/3rdparty/freetype/builds/dos/dos-def.mk create mode 100644 src/3rdparty/freetype/builds/dos/dos-emx.mk create mode 100644 src/3rdparty/freetype/builds/dos/dos-gcc.mk create mode 100644 src/3rdparty/freetype/builds/dos/dos-wat.mk create mode 100644 src/3rdparty/freetype/builds/exports.mk create mode 100644 src/3rdparty/freetype/builds/freetype.mk create mode 100644 src/3rdparty/freetype/builds/link_dos.mk create mode 100644 src/3rdparty/freetype/builds/link_std.mk create mode 100644 src/3rdparty/freetype/builds/mac/FreeType.m68k_cfm.make.txt create mode 100644 src/3rdparty/freetype/builds/mac/FreeType.m68k_far.make.txt create mode 100644 src/3rdparty/freetype/builds/mac/FreeType.ppc_carbon.make.txt create mode 100644 src/3rdparty/freetype/builds/mac/FreeType.ppc_classic.make.txt create mode 100644 src/3rdparty/freetype/builds/mac/README create mode 100755 src/3rdparty/freetype/builds/mac/ascii2mpw.py create mode 100644 src/3rdparty/freetype/builds/mac/ftlib.prj.xml create mode 100644 src/3rdparty/freetype/builds/mac/ftmac.c create mode 100644 src/3rdparty/freetype/builds/modules.mk create mode 100644 src/3rdparty/freetype/builds/newline create mode 100644 src/3rdparty/freetype/builds/os2/detect.mk create mode 100644 src/3rdparty/freetype/builds/os2/os2-def.mk create mode 100644 src/3rdparty/freetype/builds/os2/os2-dev.mk create mode 100644 src/3rdparty/freetype/builds/os2/os2-gcc.mk create mode 100644 src/3rdparty/freetype/builds/symbian/bld.inf create mode 100644 src/3rdparty/freetype/builds/symbian/freetype.mmp create mode 100644 src/3rdparty/freetype/builds/toplevel.mk create mode 100644 src/3rdparty/freetype/builds/unix/aclocal.m4 create mode 100755 src/3rdparty/freetype/builds/unix/config.guess create mode 100755 src/3rdparty/freetype/builds/unix/config.sub create mode 100755 src/3rdparty/freetype/builds/unix/configure create mode 100644 src/3rdparty/freetype/builds/unix/configure.ac create mode 100644 src/3rdparty/freetype/builds/unix/configure.raw create mode 100644 src/3rdparty/freetype/builds/unix/detect.mk create mode 100644 src/3rdparty/freetype/builds/unix/freetype-config.in create mode 100644 src/3rdparty/freetype/builds/unix/freetype2.in create mode 100644 src/3rdparty/freetype/builds/unix/freetype2.m4 create mode 100644 src/3rdparty/freetype/builds/unix/ft-munmap.m4 create mode 100644 src/3rdparty/freetype/builds/unix/ft2unix.h create mode 100644 src/3rdparty/freetype/builds/unix/ftconfig.h create mode 100644 src/3rdparty/freetype/builds/unix/ftconfig.in create mode 100644 src/3rdparty/freetype/builds/unix/ftsystem.c create mode 100755 src/3rdparty/freetype/builds/unix/install-sh create mode 100644 src/3rdparty/freetype/builds/unix/install.mk create mode 100755 src/3rdparty/freetype/builds/unix/ltmain.sh create mode 100755 src/3rdparty/freetype/builds/unix/mkinstalldirs create mode 100644 src/3rdparty/freetype/builds/unix/unix-cc.in create mode 100644 src/3rdparty/freetype/builds/unix/unix-def.in create mode 100644 src/3rdparty/freetype/builds/unix/unix-dev.mk create mode 100644 src/3rdparty/freetype/builds/unix/unix-lcc.mk create mode 100644 src/3rdparty/freetype/builds/unix/unix.mk create mode 100644 src/3rdparty/freetype/builds/unix/unixddef.mk create mode 100644 src/3rdparty/freetype/builds/vms/ftconfig.h create mode 100644 src/3rdparty/freetype/builds/vms/ftsystem.c create mode 100644 src/3rdparty/freetype/builds/win32/detect.mk create mode 100644 src/3rdparty/freetype/builds/win32/ftdebug.c create mode 100644 src/3rdparty/freetype/builds/win32/vc2005/freetype.sln create mode 100644 src/3rdparty/freetype/builds/win32/vc2005/freetype.vcproj create mode 100644 src/3rdparty/freetype/builds/win32/vc2005/index.html create mode 100644 src/3rdparty/freetype/builds/win32/vc2008/freetype.sln create mode 100644 src/3rdparty/freetype/builds/win32/vc2008/freetype.vcproj create mode 100644 src/3rdparty/freetype/builds/win32/vc2008/index.html create mode 100644 src/3rdparty/freetype/builds/win32/visualc/freetype.dsp create mode 100644 src/3rdparty/freetype/builds/win32/visualc/freetype.dsw create mode 100644 src/3rdparty/freetype/builds/win32/visualc/index.html create mode 100644 src/3rdparty/freetype/builds/win32/w32-bcc.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-bccd.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-dev.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-gcc.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-icc.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-intl.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-lcc.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-mingw32.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-vcc.mk create mode 100644 src/3rdparty/freetype/builds/win32/w32-wat.mk create mode 100644 src/3rdparty/freetype/builds/win32/win32-def.mk create mode 100644 src/3rdparty/freetype/builds/wince/ftdebug.c create mode 100644 src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.sln create mode 100644 src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.vcproj create mode 100644 src/3rdparty/freetype/builds/wince/vc2005-ce/index.html create mode 100644 src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.sln create mode 100644 src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.vcproj create mode 100644 src/3rdparty/freetype/builds/wince/vc2008-ce/index.html create mode 100755 src/3rdparty/freetype/configure create mode 100644 src/3rdparty/freetype/devel/ft2build.h create mode 100644 src/3rdparty/freetype/devel/ftoption.h create mode 100644 src/3rdparty/freetype/docs/CHANGES create mode 100644 src/3rdparty/freetype/docs/CUSTOMIZE create mode 100644 src/3rdparty/freetype/docs/DEBUG create mode 100644 src/3rdparty/freetype/docs/FTL.TXT create mode 100644 src/3rdparty/freetype/docs/GPL.TXT create mode 100644 src/3rdparty/freetype/docs/INSTALL create mode 100644 src/3rdparty/freetype/docs/INSTALL.ANY create mode 100644 src/3rdparty/freetype/docs/INSTALL.CROSS create mode 100644 src/3rdparty/freetype/docs/INSTALL.GNU create mode 100644 src/3rdparty/freetype/docs/INSTALL.MAC create mode 100644 src/3rdparty/freetype/docs/INSTALL.UNIX create mode 100644 src/3rdparty/freetype/docs/INSTALL.VMS create mode 100644 src/3rdparty/freetype/docs/LICENSE.TXT create mode 100644 src/3rdparty/freetype/docs/MAKEPP create mode 100644 src/3rdparty/freetype/docs/PATENTS create mode 100644 src/3rdparty/freetype/docs/PROBLEMS create mode 100644 src/3rdparty/freetype/docs/TODO create mode 100644 src/3rdparty/freetype/docs/TRUETYPE create mode 100644 src/3rdparty/freetype/docs/UPGRADE.UNIX create mode 100644 src/3rdparty/freetype/docs/VERSION.DLL create mode 100644 src/3rdparty/freetype/docs/formats.txt create mode 100644 src/3rdparty/freetype/docs/raster.txt create mode 100644 src/3rdparty/freetype/docs/reference/README create mode 100644 src/3rdparty/freetype/docs/reference/ft2-base_interface.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-basic_types.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-bdf_fonts.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-bitmap_handling.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-cache_subsystem.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-cid_fonts.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-computations.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-font_formats.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-gasp_table.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-glyph_management.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-glyph_stroker.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-glyph_variants.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-gx_validation.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-gzip.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-header_file_macros.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-incremental.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-index.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-lcd_filtering.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-list_processing.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-lzw.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-mac_specific.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-module_management.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-multiple_masters.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-ot_validation.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-outline_processing.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-pfr_fonts.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-quick_advance.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-raster.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-sfnt_names.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-sizes_management.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-system_interface.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-toc.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-truetype_engine.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-truetype_tables.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-type1_tables.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-user_allocation.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-version.html create mode 100644 src/3rdparty/freetype/docs/reference/ft2-winfnt_fonts.html create mode 100644 src/3rdparty/freetype/docs/release create mode 100644 src/3rdparty/freetype/include/freetype/config/ftconfig.h create mode 100644 src/3rdparty/freetype/include/freetype/config/ftheader.h create mode 100644 src/3rdparty/freetype/include/freetype/config/ftmodule.h create mode 100644 src/3rdparty/freetype/include/freetype/config/ftoption.h create mode 100644 src/3rdparty/freetype/include/freetype/config/ftstdlib.h create mode 100644 src/3rdparty/freetype/include/freetype/freetype.h create mode 100644 src/3rdparty/freetype/include/freetype/ftadvanc.h create mode 100644 src/3rdparty/freetype/include/freetype/ftbbox.h create mode 100644 src/3rdparty/freetype/include/freetype/ftbdf.h create mode 100644 src/3rdparty/freetype/include/freetype/ftbitmap.h create mode 100644 src/3rdparty/freetype/include/freetype/ftcache.h create mode 100644 src/3rdparty/freetype/include/freetype/ftchapters.h create mode 100644 src/3rdparty/freetype/include/freetype/ftcid.h create mode 100644 src/3rdparty/freetype/include/freetype/fterrdef.h create mode 100644 src/3rdparty/freetype/include/freetype/fterrors.h create mode 100644 src/3rdparty/freetype/include/freetype/ftgasp.h create mode 100644 src/3rdparty/freetype/include/freetype/ftglyph.h create mode 100644 src/3rdparty/freetype/include/freetype/ftgxval.h create mode 100644 src/3rdparty/freetype/include/freetype/ftgzip.h create mode 100644 src/3rdparty/freetype/include/freetype/ftimage.h create mode 100644 src/3rdparty/freetype/include/freetype/ftincrem.h create mode 100644 src/3rdparty/freetype/include/freetype/ftlcdfil.h create mode 100644 src/3rdparty/freetype/include/freetype/ftlist.h create mode 100644 src/3rdparty/freetype/include/freetype/ftlzw.h create mode 100644 src/3rdparty/freetype/include/freetype/ftmac.h create mode 100644 src/3rdparty/freetype/include/freetype/ftmm.h create mode 100644 src/3rdparty/freetype/include/freetype/ftmodapi.h create mode 100644 src/3rdparty/freetype/include/freetype/ftmoderr.h create mode 100644 src/3rdparty/freetype/include/freetype/ftotval.h create mode 100644 src/3rdparty/freetype/include/freetype/ftoutln.h create mode 100644 src/3rdparty/freetype/include/freetype/ftpfr.h create mode 100644 src/3rdparty/freetype/include/freetype/ftrender.h create mode 100644 src/3rdparty/freetype/include/freetype/ftsizes.h create mode 100644 src/3rdparty/freetype/include/freetype/ftsnames.h create mode 100644 src/3rdparty/freetype/include/freetype/ftstroke.h create mode 100644 src/3rdparty/freetype/include/freetype/ftsynth.h create mode 100644 src/3rdparty/freetype/include/freetype/ftsystem.h create mode 100644 src/3rdparty/freetype/include/freetype/fttrigon.h create mode 100644 src/3rdparty/freetype/include/freetype/fttypes.h create mode 100644 src/3rdparty/freetype/include/freetype/ftwinfnt.h create mode 100644 src/3rdparty/freetype/include/freetype/ftxf86.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/autohint.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftcalc.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftdebug.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftdriver.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftgloadr.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftmemory.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftobjs.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftrfork.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftserv.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftstream.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/fttrace.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/ftvalid.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/internal.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/pcftypes.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/psaux.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/pshints.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svbdf.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svcid.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svgldict.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svgxval.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svkern.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svmm.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svotval.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svpfr.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svpostnm.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svsfnt.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svtteng.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svttglyf.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svwinfnt.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/services/svxf86nm.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/sfnt.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/t1types.h create mode 100644 src/3rdparty/freetype/include/freetype/internal/tttypes.h create mode 100644 src/3rdparty/freetype/include/freetype/t1tables.h create mode 100644 src/3rdparty/freetype/include/freetype/ttnameid.h create mode 100644 src/3rdparty/freetype/include/freetype/tttables.h create mode 100644 src/3rdparty/freetype/include/freetype/tttags.h create mode 100644 src/3rdparty/freetype/include/freetype/ttunpat.h create mode 100644 src/3rdparty/freetype/include/ft2build.h create mode 100644 src/3rdparty/freetype/modules.cfg create mode 100644 src/3rdparty/freetype/objs/README create mode 100644 src/3rdparty/freetype/src/Jamfile create mode 100644 src/3rdparty/freetype/src/autofit/Jamfile create mode 100644 src/3rdparty/freetype/src/autofit/afangles.c create mode 100644 src/3rdparty/freetype/src/autofit/afangles.h create mode 100644 src/3rdparty/freetype/src/autofit/afcjk.c create mode 100644 src/3rdparty/freetype/src/autofit/afcjk.h create mode 100644 src/3rdparty/freetype/src/autofit/afdummy.c create mode 100644 src/3rdparty/freetype/src/autofit/afdummy.h create mode 100644 src/3rdparty/freetype/src/autofit/aferrors.h create mode 100644 src/3rdparty/freetype/src/autofit/afglobal.c create mode 100644 src/3rdparty/freetype/src/autofit/afglobal.h create mode 100644 src/3rdparty/freetype/src/autofit/afhints.c create mode 100644 src/3rdparty/freetype/src/autofit/afhints.h create mode 100644 src/3rdparty/freetype/src/autofit/afindic.c create mode 100644 src/3rdparty/freetype/src/autofit/afindic.h create mode 100644 src/3rdparty/freetype/src/autofit/aflatin.c create mode 100644 src/3rdparty/freetype/src/autofit/aflatin.h create mode 100644 src/3rdparty/freetype/src/autofit/aflatin2.c create mode 100644 src/3rdparty/freetype/src/autofit/aflatin2.h create mode 100644 src/3rdparty/freetype/src/autofit/afloader.c create mode 100644 src/3rdparty/freetype/src/autofit/afloader.h create mode 100644 src/3rdparty/freetype/src/autofit/afmodule.c create mode 100644 src/3rdparty/freetype/src/autofit/afmodule.h create mode 100644 src/3rdparty/freetype/src/autofit/aftypes.h create mode 100644 src/3rdparty/freetype/src/autofit/afwarp.c create mode 100644 src/3rdparty/freetype/src/autofit/afwarp.h create mode 100644 src/3rdparty/freetype/src/autofit/autofit.c create mode 100644 src/3rdparty/freetype/src/autofit/module.mk create mode 100644 src/3rdparty/freetype/src/autofit/rules.mk create mode 100644 src/3rdparty/freetype/src/base/Jamfile create mode 100644 src/3rdparty/freetype/src/base/ftadvanc.c create mode 100644 src/3rdparty/freetype/src/base/ftapi.c create mode 100644 src/3rdparty/freetype/src/base/ftbase.c create mode 100644 src/3rdparty/freetype/src/base/ftbase.h create mode 100644 src/3rdparty/freetype/src/base/ftbbox.c create mode 100644 src/3rdparty/freetype/src/base/ftbdf.c create mode 100644 src/3rdparty/freetype/src/base/ftbitmap.c create mode 100644 src/3rdparty/freetype/src/base/ftcalc.c create mode 100644 src/3rdparty/freetype/src/base/ftcid.c create mode 100644 src/3rdparty/freetype/src/base/ftdbgmem.c create mode 100644 src/3rdparty/freetype/src/base/ftdebug.c create mode 100644 src/3rdparty/freetype/src/base/ftfstype.c create mode 100644 src/3rdparty/freetype/src/base/ftgasp.c create mode 100644 src/3rdparty/freetype/src/base/ftgloadr.c create mode 100644 src/3rdparty/freetype/src/base/ftglyph.c create mode 100644 src/3rdparty/freetype/src/base/ftgxval.c create mode 100644 src/3rdparty/freetype/src/base/ftinit.c create mode 100644 src/3rdparty/freetype/src/base/ftlcdfil.c create mode 100644 src/3rdparty/freetype/src/base/ftmac.c create mode 100644 src/3rdparty/freetype/src/base/ftmm.c create mode 100644 src/3rdparty/freetype/src/base/ftnames.c create mode 100644 src/3rdparty/freetype/src/base/ftobjs.c create mode 100644 src/3rdparty/freetype/src/base/ftotval.c create mode 100644 src/3rdparty/freetype/src/base/ftoutln.c create mode 100644 src/3rdparty/freetype/src/base/ftpatent.c create mode 100644 src/3rdparty/freetype/src/base/ftpfr.c create mode 100644 src/3rdparty/freetype/src/base/ftrfork.c create mode 100644 src/3rdparty/freetype/src/base/ftstream.c create mode 100644 src/3rdparty/freetype/src/base/ftstroke.c create mode 100644 src/3rdparty/freetype/src/base/ftsynth.c create mode 100644 src/3rdparty/freetype/src/base/ftsystem.c create mode 100644 src/3rdparty/freetype/src/base/fttrigon.c create mode 100644 src/3rdparty/freetype/src/base/fttype1.c create mode 100644 src/3rdparty/freetype/src/base/ftutil.c create mode 100644 src/3rdparty/freetype/src/base/ftwinfnt.c create mode 100644 src/3rdparty/freetype/src/base/ftxf86.c create mode 100644 src/3rdparty/freetype/src/base/rules.mk create mode 100644 src/3rdparty/freetype/src/bdf/Jamfile create mode 100644 src/3rdparty/freetype/src/bdf/README create mode 100644 src/3rdparty/freetype/src/bdf/bdf.c create mode 100644 src/3rdparty/freetype/src/bdf/bdf.h create mode 100644 src/3rdparty/freetype/src/bdf/bdfdrivr.c create mode 100644 src/3rdparty/freetype/src/bdf/bdfdrivr.h create mode 100644 src/3rdparty/freetype/src/bdf/bdferror.h create mode 100644 src/3rdparty/freetype/src/bdf/bdflib.c create mode 100644 src/3rdparty/freetype/src/bdf/module.mk create mode 100644 src/3rdparty/freetype/src/bdf/rules.mk create mode 100644 src/3rdparty/freetype/src/cache/Jamfile create mode 100644 src/3rdparty/freetype/src/cache/ftcache.c create mode 100644 src/3rdparty/freetype/src/cache/ftcbasic.c create mode 100644 src/3rdparty/freetype/src/cache/ftccache.c create mode 100644 src/3rdparty/freetype/src/cache/ftccache.h create mode 100644 src/3rdparty/freetype/src/cache/ftccback.h create mode 100644 src/3rdparty/freetype/src/cache/ftccmap.c create mode 100644 src/3rdparty/freetype/src/cache/ftcerror.h create mode 100644 src/3rdparty/freetype/src/cache/ftcglyph.c create mode 100644 src/3rdparty/freetype/src/cache/ftcglyph.h create mode 100644 src/3rdparty/freetype/src/cache/ftcimage.c create mode 100644 src/3rdparty/freetype/src/cache/ftcimage.h create mode 100644 src/3rdparty/freetype/src/cache/ftcmanag.c create mode 100644 src/3rdparty/freetype/src/cache/ftcmanag.h create mode 100644 src/3rdparty/freetype/src/cache/ftcmru.c create mode 100644 src/3rdparty/freetype/src/cache/ftcmru.h create mode 100644 src/3rdparty/freetype/src/cache/ftcsbits.c create mode 100644 src/3rdparty/freetype/src/cache/ftcsbits.h create mode 100644 src/3rdparty/freetype/src/cache/rules.mk create mode 100644 src/3rdparty/freetype/src/cff/Jamfile create mode 100644 src/3rdparty/freetype/src/cff/cff.c create mode 100644 src/3rdparty/freetype/src/cff/cffcmap.c create mode 100644 src/3rdparty/freetype/src/cff/cffcmap.h create mode 100644 src/3rdparty/freetype/src/cff/cffdrivr.c create mode 100644 src/3rdparty/freetype/src/cff/cffdrivr.h create mode 100644 src/3rdparty/freetype/src/cff/cfferrs.h create mode 100644 src/3rdparty/freetype/src/cff/cffgload.c create mode 100644 src/3rdparty/freetype/src/cff/cffgload.h create mode 100644 src/3rdparty/freetype/src/cff/cffload.c create mode 100644 src/3rdparty/freetype/src/cff/cffload.h create mode 100644 src/3rdparty/freetype/src/cff/cffobjs.c create mode 100644 src/3rdparty/freetype/src/cff/cffobjs.h create mode 100644 src/3rdparty/freetype/src/cff/cffparse.c create mode 100644 src/3rdparty/freetype/src/cff/cffparse.h create mode 100644 src/3rdparty/freetype/src/cff/cfftoken.h create mode 100644 src/3rdparty/freetype/src/cff/cfftypes.h create mode 100644 src/3rdparty/freetype/src/cff/module.mk create mode 100644 src/3rdparty/freetype/src/cff/rules.mk create mode 100644 src/3rdparty/freetype/src/cid/Jamfile create mode 100644 src/3rdparty/freetype/src/cid/ciderrs.h create mode 100644 src/3rdparty/freetype/src/cid/cidgload.c create mode 100644 src/3rdparty/freetype/src/cid/cidgload.h create mode 100644 src/3rdparty/freetype/src/cid/cidload.c create mode 100644 src/3rdparty/freetype/src/cid/cidload.h create mode 100644 src/3rdparty/freetype/src/cid/cidobjs.c create mode 100644 src/3rdparty/freetype/src/cid/cidobjs.h create mode 100644 src/3rdparty/freetype/src/cid/cidparse.c create mode 100644 src/3rdparty/freetype/src/cid/cidparse.h create mode 100644 src/3rdparty/freetype/src/cid/cidriver.c create mode 100644 src/3rdparty/freetype/src/cid/cidriver.h create mode 100644 src/3rdparty/freetype/src/cid/cidtoken.h create mode 100644 src/3rdparty/freetype/src/cid/module.mk create mode 100644 src/3rdparty/freetype/src/cid/rules.mk create mode 100644 src/3rdparty/freetype/src/cid/type1cid.c create mode 100644 src/3rdparty/freetype/src/gxvalid/Jamfile create mode 100644 src/3rdparty/freetype/src/gxvalid/README create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvalid.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvalid.h create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvbsln.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvcommn.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvcommn.h create mode 100644 src/3rdparty/freetype/src/gxvalid/gxverror.h create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvfeat.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvfeat.h create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvfgen.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvjust.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvkern.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvlcar.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmod.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmod.h create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmort.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmort.h create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmort0.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmort1.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmort2.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmort4.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmort5.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmorx.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmorx.h create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmorx0.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmorx1.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmorx2.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmorx4.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvmorx5.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvopbd.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvprop.c create mode 100644 src/3rdparty/freetype/src/gxvalid/gxvtrak.c create mode 100644 src/3rdparty/freetype/src/gxvalid/module.mk create mode 100644 src/3rdparty/freetype/src/gxvalid/rules.mk create mode 100644 src/3rdparty/freetype/src/gzip/Jamfile create mode 100644 src/3rdparty/freetype/src/gzip/adler32.c create mode 100644 src/3rdparty/freetype/src/gzip/ftgzip.c create mode 100644 src/3rdparty/freetype/src/gzip/infblock.c create mode 100644 src/3rdparty/freetype/src/gzip/infblock.h create mode 100644 src/3rdparty/freetype/src/gzip/infcodes.c create mode 100644 src/3rdparty/freetype/src/gzip/infcodes.h create mode 100644 src/3rdparty/freetype/src/gzip/inffixed.h create mode 100644 src/3rdparty/freetype/src/gzip/inflate.c create mode 100644 src/3rdparty/freetype/src/gzip/inftrees.c create mode 100644 src/3rdparty/freetype/src/gzip/inftrees.h create mode 100644 src/3rdparty/freetype/src/gzip/infutil.c create mode 100644 src/3rdparty/freetype/src/gzip/infutil.h create mode 100644 src/3rdparty/freetype/src/gzip/rules.mk create mode 100644 src/3rdparty/freetype/src/gzip/zconf.h create mode 100644 src/3rdparty/freetype/src/gzip/zlib.h create mode 100644 src/3rdparty/freetype/src/gzip/zutil.c create mode 100644 src/3rdparty/freetype/src/gzip/zutil.h create mode 100644 src/3rdparty/freetype/src/lzw/Jamfile create mode 100644 src/3rdparty/freetype/src/lzw/ftlzw.c create mode 100644 src/3rdparty/freetype/src/lzw/ftzopen.c create mode 100644 src/3rdparty/freetype/src/lzw/ftzopen.h create mode 100644 src/3rdparty/freetype/src/lzw/rules.mk create mode 100644 src/3rdparty/freetype/src/otvalid/Jamfile create mode 100644 src/3rdparty/freetype/src/otvalid/module.mk create mode 100644 src/3rdparty/freetype/src/otvalid/otvalid.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvalid.h create mode 100644 src/3rdparty/freetype/src/otvalid/otvbase.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvcommn.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvcommn.h create mode 100644 src/3rdparty/freetype/src/otvalid/otverror.h create mode 100644 src/3rdparty/freetype/src/otvalid/otvgdef.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvgpos.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvgpos.h create mode 100644 src/3rdparty/freetype/src/otvalid/otvgsub.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvjstf.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvmath.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvmod.c create mode 100644 src/3rdparty/freetype/src/otvalid/otvmod.h create mode 100644 src/3rdparty/freetype/src/otvalid/rules.mk create mode 100644 src/3rdparty/freetype/src/pcf/Jamfile create mode 100644 src/3rdparty/freetype/src/pcf/README create mode 100644 src/3rdparty/freetype/src/pcf/module.mk create mode 100644 src/3rdparty/freetype/src/pcf/pcf.c create mode 100644 src/3rdparty/freetype/src/pcf/pcf.h create mode 100644 src/3rdparty/freetype/src/pcf/pcfdrivr.c create mode 100644 src/3rdparty/freetype/src/pcf/pcfdrivr.h create mode 100644 src/3rdparty/freetype/src/pcf/pcferror.h create mode 100644 src/3rdparty/freetype/src/pcf/pcfread.c create mode 100644 src/3rdparty/freetype/src/pcf/pcfread.h create mode 100644 src/3rdparty/freetype/src/pcf/pcfutil.c create mode 100644 src/3rdparty/freetype/src/pcf/pcfutil.h create mode 100644 src/3rdparty/freetype/src/pcf/rules.mk create mode 100644 src/3rdparty/freetype/src/pfr/Jamfile create mode 100644 src/3rdparty/freetype/src/pfr/module.mk create mode 100644 src/3rdparty/freetype/src/pfr/pfr.c create mode 100644 src/3rdparty/freetype/src/pfr/pfrcmap.c create mode 100644 src/3rdparty/freetype/src/pfr/pfrcmap.h create mode 100644 src/3rdparty/freetype/src/pfr/pfrdrivr.c create mode 100644 src/3rdparty/freetype/src/pfr/pfrdrivr.h create mode 100644 src/3rdparty/freetype/src/pfr/pfrerror.h create mode 100644 src/3rdparty/freetype/src/pfr/pfrgload.c create mode 100644 src/3rdparty/freetype/src/pfr/pfrgload.h create mode 100644 src/3rdparty/freetype/src/pfr/pfrload.c create mode 100644 src/3rdparty/freetype/src/pfr/pfrload.h create mode 100644 src/3rdparty/freetype/src/pfr/pfrobjs.c create mode 100644 src/3rdparty/freetype/src/pfr/pfrobjs.h create mode 100644 src/3rdparty/freetype/src/pfr/pfrsbit.c create mode 100644 src/3rdparty/freetype/src/pfr/pfrsbit.h create mode 100644 src/3rdparty/freetype/src/pfr/pfrtypes.h create mode 100644 src/3rdparty/freetype/src/pfr/rules.mk create mode 100644 src/3rdparty/freetype/src/psaux/Jamfile create mode 100644 src/3rdparty/freetype/src/psaux/afmparse.c create mode 100644 src/3rdparty/freetype/src/psaux/afmparse.h create mode 100644 src/3rdparty/freetype/src/psaux/module.mk create mode 100644 src/3rdparty/freetype/src/psaux/psaux.c create mode 100644 src/3rdparty/freetype/src/psaux/psauxerr.h create mode 100644 src/3rdparty/freetype/src/psaux/psauxmod.c create mode 100644 src/3rdparty/freetype/src/psaux/psauxmod.h create mode 100644 src/3rdparty/freetype/src/psaux/psconv.c create mode 100644 src/3rdparty/freetype/src/psaux/psconv.h create mode 100644 src/3rdparty/freetype/src/psaux/psobjs.c create mode 100644 src/3rdparty/freetype/src/psaux/psobjs.h create mode 100644 src/3rdparty/freetype/src/psaux/rules.mk create mode 100644 src/3rdparty/freetype/src/psaux/t1cmap.c create mode 100644 src/3rdparty/freetype/src/psaux/t1cmap.h create mode 100644 src/3rdparty/freetype/src/psaux/t1decode.c create mode 100644 src/3rdparty/freetype/src/psaux/t1decode.h create mode 100644 src/3rdparty/freetype/src/pshinter/Jamfile create mode 100644 src/3rdparty/freetype/src/pshinter/module.mk create mode 100644 src/3rdparty/freetype/src/pshinter/pshalgo.c create mode 100644 src/3rdparty/freetype/src/pshinter/pshalgo.h create mode 100644 src/3rdparty/freetype/src/pshinter/pshglob.c create mode 100644 src/3rdparty/freetype/src/pshinter/pshglob.h create mode 100644 src/3rdparty/freetype/src/pshinter/pshinter.c create mode 100644 src/3rdparty/freetype/src/pshinter/pshmod.c create mode 100644 src/3rdparty/freetype/src/pshinter/pshmod.h create mode 100644 src/3rdparty/freetype/src/pshinter/pshnterr.h create mode 100644 src/3rdparty/freetype/src/pshinter/pshrec.c create mode 100644 src/3rdparty/freetype/src/pshinter/pshrec.h create mode 100644 src/3rdparty/freetype/src/pshinter/rules.mk create mode 100644 src/3rdparty/freetype/src/psnames/Jamfile create mode 100644 src/3rdparty/freetype/src/psnames/module.mk create mode 100644 src/3rdparty/freetype/src/psnames/psmodule.c create mode 100644 src/3rdparty/freetype/src/psnames/psmodule.h create mode 100644 src/3rdparty/freetype/src/psnames/psnamerr.h create mode 100644 src/3rdparty/freetype/src/psnames/psnames.c create mode 100644 src/3rdparty/freetype/src/psnames/pstables.h create mode 100644 src/3rdparty/freetype/src/psnames/rules.mk create mode 100644 src/3rdparty/freetype/src/raster/Jamfile create mode 100644 src/3rdparty/freetype/src/raster/ftmisc.h create mode 100644 src/3rdparty/freetype/src/raster/ftraster.c create mode 100644 src/3rdparty/freetype/src/raster/ftraster.h create mode 100644 src/3rdparty/freetype/src/raster/ftrend1.c create mode 100644 src/3rdparty/freetype/src/raster/ftrend1.h create mode 100644 src/3rdparty/freetype/src/raster/module.mk create mode 100644 src/3rdparty/freetype/src/raster/raster.c create mode 100644 src/3rdparty/freetype/src/raster/rasterrs.h create mode 100644 src/3rdparty/freetype/src/raster/rules.mk create mode 100644 src/3rdparty/freetype/src/sfnt/Jamfile create mode 100644 src/3rdparty/freetype/src/sfnt/module.mk create mode 100644 src/3rdparty/freetype/src/sfnt/rules.mk create mode 100644 src/3rdparty/freetype/src/sfnt/sfdriver.c create mode 100644 src/3rdparty/freetype/src/sfnt/sfdriver.h create mode 100644 src/3rdparty/freetype/src/sfnt/sferrors.h create mode 100644 src/3rdparty/freetype/src/sfnt/sfnt.c create mode 100644 src/3rdparty/freetype/src/sfnt/sfobjs.c create mode 100644 src/3rdparty/freetype/src/sfnt/sfobjs.h create mode 100644 src/3rdparty/freetype/src/sfnt/ttbdf.c create mode 100644 src/3rdparty/freetype/src/sfnt/ttbdf.h create mode 100644 src/3rdparty/freetype/src/sfnt/ttcmap.c create mode 100644 src/3rdparty/freetype/src/sfnt/ttcmap.h create mode 100644 src/3rdparty/freetype/src/sfnt/ttkern.c create mode 100644 src/3rdparty/freetype/src/sfnt/ttkern.h create mode 100644 src/3rdparty/freetype/src/sfnt/ttload.c create mode 100644 src/3rdparty/freetype/src/sfnt/ttload.h create mode 100644 src/3rdparty/freetype/src/sfnt/ttmtx.c create mode 100644 src/3rdparty/freetype/src/sfnt/ttmtx.h create mode 100644 src/3rdparty/freetype/src/sfnt/ttpost.c create mode 100644 src/3rdparty/freetype/src/sfnt/ttpost.h create mode 100644 src/3rdparty/freetype/src/sfnt/ttsbit.c create mode 100644 src/3rdparty/freetype/src/sfnt/ttsbit.h create mode 100644 src/3rdparty/freetype/src/sfnt/ttsbit0.c create mode 100644 src/3rdparty/freetype/src/smooth/Jamfile create mode 100644 src/3rdparty/freetype/src/smooth/ftgrays.c create mode 100644 src/3rdparty/freetype/src/smooth/ftgrays.h create mode 100644 src/3rdparty/freetype/src/smooth/ftsmerrs.h create mode 100644 src/3rdparty/freetype/src/smooth/ftsmooth.c create mode 100644 src/3rdparty/freetype/src/smooth/ftsmooth.h create mode 100644 src/3rdparty/freetype/src/smooth/module.mk create mode 100644 src/3rdparty/freetype/src/smooth/rules.mk create mode 100644 src/3rdparty/freetype/src/smooth/smooth.c create mode 100644 src/3rdparty/freetype/src/tools/Jamfile create mode 100644 src/3rdparty/freetype/src/tools/apinames.c create mode 100644 src/3rdparty/freetype/src/tools/cordic.py create mode 100644 src/3rdparty/freetype/src/tools/docmaker/content.py create mode 100644 src/3rdparty/freetype/src/tools/docmaker/docbeauty.py create mode 100644 src/3rdparty/freetype/src/tools/docmaker/docmaker.py create mode 100644 src/3rdparty/freetype/src/tools/docmaker/formatter.py create mode 100644 src/3rdparty/freetype/src/tools/docmaker/sources.py create mode 100644 src/3rdparty/freetype/src/tools/docmaker/tohtml.py create mode 100644 src/3rdparty/freetype/src/tools/docmaker/utils.py create mode 100644 src/3rdparty/freetype/src/tools/ftrandom/Makefile create mode 100644 src/3rdparty/freetype/src/tools/ftrandom/README create mode 100644 src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c create mode 100644 src/3rdparty/freetype/src/tools/glnames.py create mode 100644 src/3rdparty/freetype/src/tools/test_afm.c create mode 100644 src/3rdparty/freetype/src/tools/test_bbox.c create mode 100644 src/3rdparty/freetype/src/tools/test_trig.c create mode 100644 src/3rdparty/freetype/src/truetype/Jamfile create mode 100644 src/3rdparty/freetype/src/truetype/module.mk create mode 100644 src/3rdparty/freetype/src/truetype/rules.mk create mode 100644 src/3rdparty/freetype/src/truetype/truetype.c create mode 100644 src/3rdparty/freetype/src/truetype/ttdriver.c create mode 100644 src/3rdparty/freetype/src/truetype/ttdriver.h create mode 100644 src/3rdparty/freetype/src/truetype/tterrors.h create mode 100644 src/3rdparty/freetype/src/truetype/ttgload.c create mode 100644 src/3rdparty/freetype/src/truetype/ttgload.h create mode 100644 src/3rdparty/freetype/src/truetype/ttgxvar.c create mode 100644 src/3rdparty/freetype/src/truetype/ttgxvar.h create mode 100644 src/3rdparty/freetype/src/truetype/ttinterp.c create mode 100644 src/3rdparty/freetype/src/truetype/ttinterp.h create mode 100644 src/3rdparty/freetype/src/truetype/ttobjs.c create mode 100644 src/3rdparty/freetype/src/truetype/ttobjs.h create mode 100644 src/3rdparty/freetype/src/truetype/ttpload.c create mode 100644 src/3rdparty/freetype/src/truetype/ttpload.h create mode 100644 src/3rdparty/freetype/src/type1/Jamfile create mode 100644 src/3rdparty/freetype/src/type1/module.mk create mode 100644 src/3rdparty/freetype/src/type1/rules.mk create mode 100644 src/3rdparty/freetype/src/type1/t1afm.c create mode 100644 src/3rdparty/freetype/src/type1/t1afm.h create mode 100644 src/3rdparty/freetype/src/type1/t1driver.c create mode 100644 src/3rdparty/freetype/src/type1/t1driver.h create mode 100644 src/3rdparty/freetype/src/type1/t1errors.h create mode 100644 src/3rdparty/freetype/src/type1/t1gload.c create mode 100644 src/3rdparty/freetype/src/type1/t1gload.h create mode 100644 src/3rdparty/freetype/src/type1/t1load.c create mode 100644 src/3rdparty/freetype/src/type1/t1load.h create mode 100644 src/3rdparty/freetype/src/type1/t1objs.c create mode 100644 src/3rdparty/freetype/src/type1/t1objs.h create mode 100644 src/3rdparty/freetype/src/type1/t1parse.c create mode 100644 src/3rdparty/freetype/src/type1/t1parse.h create mode 100644 src/3rdparty/freetype/src/type1/t1tokens.h create mode 100644 src/3rdparty/freetype/src/type1/type1.c create mode 100644 src/3rdparty/freetype/src/type42/Jamfile create mode 100644 src/3rdparty/freetype/src/type42/module.mk create mode 100644 src/3rdparty/freetype/src/type42/rules.mk create mode 100644 src/3rdparty/freetype/src/type42/t42drivr.c create mode 100644 src/3rdparty/freetype/src/type42/t42drivr.h create mode 100644 src/3rdparty/freetype/src/type42/t42error.h create mode 100644 src/3rdparty/freetype/src/type42/t42objs.c create mode 100644 src/3rdparty/freetype/src/type42/t42objs.h create mode 100644 src/3rdparty/freetype/src/type42/t42parse.c create mode 100644 src/3rdparty/freetype/src/type42/t42parse.h create mode 100644 src/3rdparty/freetype/src/type42/t42types.h create mode 100644 src/3rdparty/freetype/src/type42/type42.c create mode 100644 src/3rdparty/freetype/src/winfonts/Jamfile create mode 100644 src/3rdparty/freetype/src/winfonts/fnterrs.h create mode 100644 src/3rdparty/freetype/src/winfonts/module.mk create mode 100644 src/3rdparty/freetype/src/winfonts/rules.mk create mode 100644 src/3rdparty/freetype/src/winfonts/winfnt.c create mode 100644 src/3rdparty/freetype/src/winfonts/winfnt.h create mode 100644 src/3rdparty/freetype/version.sed create mode 100644 src/3rdparty/freetype/vms_make.com create mode 100644 src/3rdparty/harfbuzz/.gitignore create mode 100644 src/3rdparty/harfbuzz/AUTHORS create mode 100644 src/3rdparty/harfbuzz/COPYING create mode 100644 src/3rdparty/harfbuzz/ChangeLog create mode 100644 src/3rdparty/harfbuzz/Makefile.am create mode 100644 src/3rdparty/harfbuzz/NEWS create mode 100644 src/3rdparty/harfbuzz/README create mode 100755 src/3rdparty/harfbuzz/autogen.sh create mode 100644 src/3rdparty/harfbuzz/configure.ac create mode 100644 src/3rdparty/harfbuzz/src/.gitignore create mode 100644 src/3rdparty/harfbuzz/src/Makefile.am create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-arabic.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-buffer-private.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-buffer.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-buffer.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-dump.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-dump.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-external.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gdef.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gdef.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-global.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gpos.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gpos.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-greek.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gsub.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-gsub.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-hangul.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-impl.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-impl.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-khmer.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-open-private.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-open.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-open.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-shape.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-shaper-private.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-shaper.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-stream-private.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-stream.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-stream.h create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-thai.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz.c create mode 100644 src/3rdparty/harfbuzz/src/harfbuzz.h create mode 100644 src/3rdparty/harfbuzz/tests/Makefile.am create mode 100644 src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc create mode 100644 src/3rdparty/harfbuzz/tests/linebreaking/.gitignore create mode 100644 src/3rdparty/harfbuzz/tests/linebreaking/Makefile.am create mode 100644 src/3rdparty/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp create mode 100644 src/3rdparty/harfbuzz/tests/linebreaking/main.cpp create mode 100644 src/3rdparty/harfbuzz/tests/shaping/.gitignore create mode 100644 src/3rdparty/harfbuzz/tests/shaping/Makefile.am create mode 100644 src/3rdparty/harfbuzz/tests/shaping/README create mode 100644 src/3rdparty/harfbuzz/tests/shaping/main.cpp create mode 100644 src/3rdparty/libgq.pri create mode 100644 src/3rdparty/libgq/.gitignore create mode 100644 src/3rdparty/libgq/Makefile.am create mode 100644 src/3rdparty/libgq/README create mode 100755 src/3rdparty/libgq/autogen.sh create mode 100644 src/3rdparty/libgq/configure.ac create mode 100644 src/3rdparty/libgq/debian/README.scratchbox create mode 100644 src/3rdparty/libgq/debian/changelog create mode 100644 src/3rdparty/libgq/debian/compat create mode 100644 src/3rdparty/libgq/debian/control create mode 100644 src/3rdparty/libgq/debian/copyright create mode 100755 src/3rdparty/libgq/debian/fixup-scratchbox create mode 100644 src/3rdparty/libgq/debian/libgq-gconf-dev.install create mode 100644 src/3rdparty/libgq/debian/libgq-gconf-doc.install create mode 100644 src/3rdparty/libgq/debian/libgq-gconf0.install create mode 100644 src/3rdparty/libgq/debian/maemo-sanitize create mode 100755 src/3rdparty/libgq/debian/rules create mode 100644 src/3rdparty/libgq/gconf/Doxyfile create mode 100644 src/3rdparty/libgq/gconf/GConfItem create mode 100644 src/3rdparty/libgq/gconf/Makefile.am create mode 100644 src/3rdparty/libgq/gconf/gconfitem.cpp create mode 100644 src/3rdparty/libgq/gconf/gconfitem.h create mode 100644 src/3rdparty/libgq/gconf/gq-gconf.pc.in create mode 100755 src/3rdparty/libgq/gconf/run-test-gconf create mode 100644 src/3rdparty/libgq/gconf/test-gconf.cpp create mode 100644 src/3rdparty/libgq/gconf/test-gconf.h create mode 100644 src/3rdparty/libjpeg.pri create mode 100644 src/3rdparty/libjpeg/README create mode 100644 src/3rdparty/libjpeg/cderror.h create mode 100644 src/3rdparty/libjpeg/cdjpeg.h create mode 100644 src/3rdparty/libjpeg/change.log create mode 100644 src/3rdparty/libjpeg/ckconfig.c create mode 100644 src/3rdparty/libjpeg/coderules.txt create mode 100644 src/3rdparty/libjpeg/example.c create mode 100644 src/3rdparty/libjpeg/filelist.txt create mode 100644 src/3rdparty/libjpeg/jaricom.c create mode 100644 src/3rdparty/libjpeg/jcapimin.c create mode 100644 src/3rdparty/libjpeg/jcapistd.c create mode 100644 src/3rdparty/libjpeg/jcarith.c create mode 100644 src/3rdparty/libjpeg/jccoefct.c create mode 100644 src/3rdparty/libjpeg/jccolor.c create mode 100644 src/3rdparty/libjpeg/jcdctmgr.c create mode 100644 src/3rdparty/libjpeg/jchuff.c create mode 100644 src/3rdparty/libjpeg/jcinit.c create mode 100644 src/3rdparty/libjpeg/jcmainct.c create mode 100644 src/3rdparty/libjpeg/jcmarker.c create mode 100644 src/3rdparty/libjpeg/jcmaster.c create mode 100644 src/3rdparty/libjpeg/jcomapi.c create mode 100644 src/3rdparty/libjpeg/jconfig.bcc create mode 100644 src/3rdparty/libjpeg/jconfig.cfg create mode 100644 src/3rdparty/libjpeg/jconfig.dj create mode 100644 src/3rdparty/libjpeg/jconfig.h create mode 100644 src/3rdparty/libjpeg/jconfig.mac create mode 100644 src/3rdparty/libjpeg/jconfig.manx create mode 100644 src/3rdparty/libjpeg/jconfig.mc6 create mode 100644 src/3rdparty/libjpeg/jconfig.sas create mode 100644 src/3rdparty/libjpeg/jconfig.st create mode 100644 src/3rdparty/libjpeg/jconfig.txt create mode 100644 src/3rdparty/libjpeg/jconfig.vc create mode 100644 src/3rdparty/libjpeg/jconfig.vms create mode 100644 src/3rdparty/libjpeg/jconfig.wat create mode 100644 src/3rdparty/libjpeg/jcparam.c create mode 100644 src/3rdparty/libjpeg/jcprepct.c create mode 100644 src/3rdparty/libjpeg/jcsample.c create mode 100644 src/3rdparty/libjpeg/jctrans.c create mode 100644 src/3rdparty/libjpeg/jdapimin.c create mode 100644 src/3rdparty/libjpeg/jdapistd.c create mode 100644 src/3rdparty/libjpeg/jdarith.c create mode 100644 src/3rdparty/libjpeg/jdatadst.c create mode 100644 src/3rdparty/libjpeg/jdatasrc.c create mode 100644 src/3rdparty/libjpeg/jdcoefct.c create mode 100644 src/3rdparty/libjpeg/jdcolor.c create mode 100644 src/3rdparty/libjpeg/jdct.h create mode 100644 src/3rdparty/libjpeg/jddctmgr.c create mode 100644 src/3rdparty/libjpeg/jdhuff.c create mode 100644 src/3rdparty/libjpeg/jdinput.c create mode 100644 src/3rdparty/libjpeg/jdmainct.c create mode 100644 src/3rdparty/libjpeg/jdmarker.c create mode 100644 src/3rdparty/libjpeg/jdmaster.c create mode 100644 src/3rdparty/libjpeg/jdmerge.c create mode 100644 src/3rdparty/libjpeg/jdpostct.c create mode 100644 src/3rdparty/libjpeg/jdsample.c create mode 100644 src/3rdparty/libjpeg/jdtrans.c create mode 100644 src/3rdparty/libjpeg/jerror.c create mode 100644 src/3rdparty/libjpeg/jerror.h create mode 100644 src/3rdparty/libjpeg/jfdctflt.c create mode 100644 src/3rdparty/libjpeg/jfdctfst.c create mode 100644 src/3rdparty/libjpeg/jfdctint.c create mode 100644 src/3rdparty/libjpeg/jidctflt.c create mode 100644 src/3rdparty/libjpeg/jidctfst.c create mode 100644 src/3rdparty/libjpeg/jidctint.c create mode 100644 src/3rdparty/libjpeg/jinclude.h create mode 100644 src/3rdparty/libjpeg/jmemansi.c create mode 100644 src/3rdparty/libjpeg/jmemdos.c create mode 100644 src/3rdparty/libjpeg/jmemdosa.asm create mode 100644 src/3rdparty/libjpeg/jmemmac.c create mode 100644 src/3rdparty/libjpeg/jmemmgr.c create mode 100644 src/3rdparty/libjpeg/jmemname.c create mode 100644 src/3rdparty/libjpeg/jmemnobs.c create mode 100644 src/3rdparty/libjpeg/jmemsys.h create mode 100644 src/3rdparty/libjpeg/jmorecfg.h create mode 100644 src/3rdparty/libjpeg/jpegint.h create mode 100644 src/3rdparty/libjpeg/jpeglib.h create mode 100644 src/3rdparty/libjpeg/jpegtran.1 create mode 100644 src/3rdparty/libjpeg/jquant1.c create mode 100644 src/3rdparty/libjpeg/jquant2.c create mode 100644 src/3rdparty/libjpeg/jutils.c create mode 100644 src/3rdparty/libjpeg/jversion.h create mode 100644 src/3rdparty/libjpeg/libjpeg.txt create mode 100644 src/3rdparty/libjpeg/rdjpgcom.1 create mode 100644 src/3rdparty/libjpeg/structure.txt create mode 100644 src/3rdparty/libjpeg/transupp.h create mode 100644 src/3rdparty/libjpeg/usage.txt create mode 100644 src/3rdparty/libjpeg/wizard.txt create mode 100644 src/3rdparty/libjpeg/wrjpgcom.1 create mode 100644 src/3rdparty/libmng.pri create mode 100644 src/3rdparty/libmng/CHANGES create mode 100644 src/3rdparty/libmng/LICENSE create mode 100644 src/3rdparty/libmng/README create mode 100644 src/3rdparty/libmng/README.autoconf create mode 100644 src/3rdparty/libmng/README.config create mode 100644 src/3rdparty/libmng/README.contrib create mode 100644 src/3rdparty/libmng/README.dll create mode 100644 src/3rdparty/libmng/README.examples create mode 100644 src/3rdparty/libmng/README.footprint create mode 100644 src/3rdparty/libmng/README.packaging create mode 100644 src/3rdparty/libmng/doc/Plan1.png create mode 100644 src/3rdparty/libmng/doc/Plan2.png create mode 100644 src/3rdparty/libmng/doc/doc.readme create mode 100644 src/3rdparty/libmng/doc/libmng.txt create mode 100644 src/3rdparty/libmng/doc/man/jng.5 create mode 100644 src/3rdparty/libmng/doc/man/libmng.3 create mode 100644 src/3rdparty/libmng/doc/man/mng.5 create mode 100644 src/3rdparty/libmng/doc/misc/magic.dif create mode 100644 src/3rdparty/libmng/doc/rpm/libmng-1.0.10-rhconf.patch create mode 100644 src/3rdparty/libmng/doc/rpm/libmng.spec create mode 100644 src/3rdparty/libmng/libmng.h create mode 100644 src/3rdparty/libmng/libmng_callback_xs.c create mode 100644 src/3rdparty/libmng/libmng_chunk_descr.c create mode 100644 src/3rdparty/libmng/libmng_chunk_descr.h create mode 100644 src/3rdparty/libmng/libmng_chunk_io.c create mode 100644 src/3rdparty/libmng/libmng_chunk_io.h create mode 100644 src/3rdparty/libmng/libmng_chunk_prc.c create mode 100644 src/3rdparty/libmng/libmng_chunk_prc.h create mode 100644 src/3rdparty/libmng/libmng_chunk_xs.c create mode 100644 src/3rdparty/libmng/libmng_chunks.h create mode 100644 src/3rdparty/libmng/libmng_cms.c create mode 100644 src/3rdparty/libmng/libmng_cms.h create mode 100644 src/3rdparty/libmng/libmng_conf.h create mode 100644 src/3rdparty/libmng/libmng_data.h create mode 100644 src/3rdparty/libmng/libmng_display.c create mode 100644 src/3rdparty/libmng/libmng_display.h create mode 100644 src/3rdparty/libmng/libmng_dither.c create mode 100644 src/3rdparty/libmng/libmng_dither.h create mode 100644 src/3rdparty/libmng/libmng_error.c create mode 100644 src/3rdparty/libmng/libmng_error.h create mode 100644 src/3rdparty/libmng/libmng_filter.c create mode 100644 src/3rdparty/libmng/libmng_filter.h create mode 100644 src/3rdparty/libmng/libmng_hlapi.c create mode 100644 src/3rdparty/libmng/libmng_jpeg.c create mode 100644 src/3rdparty/libmng/libmng_jpeg.h create mode 100644 src/3rdparty/libmng/libmng_memory.h create mode 100644 src/3rdparty/libmng/libmng_object_prc.c create mode 100644 src/3rdparty/libmng/libmng_object_prc.h create mode 100644 src/3rdparty/libmng/libmng_objects.h create mode 100644 src/3rdparty/libmng/libmng_pixels.c create mode 100644 src/3rdparty/libmng/libmng_pixels.h create mode 100644 src/3rdparty/libmng/libmng_prop_xs.c create mode 100644 src/3rdparty/libmng/libmng_read.c create mode 100644 src/3rdparty/libmng/libmng_read.h create mode 100644 src/3rdparty/libmng/libmng_trace.c create mode 100644 src/3rdparty/libmng/libmng_trace.h create mode 100644 src/3rdparty/libmng/libmng_types.h create mode 100644 src/3rdparty/libmng/libmng_write.c create mode 100644 src/3rdparty/libmng/libmng_write.h create mode 100644 src/3rdparty/libmng/libmng_zlib.c create mode 100644 src/3rdparty/libmng/libmng_zlib.h create mode 100644 src/3rdparty/libmng/makefiles/Makefile.am create mode 100644 src/3rdparty/libmng/makefiles/README create mode 100644 src/3rdparty/libmng/makefiles/configure.in create mode 100644 src/3rdparty/libmng/makefiles/makefile.bcb3 create mode 100644 src/3rdparty/libmng/makefiles/makefile.dj create mode 100644 src/3rdparty/libmng/makefiles/makefile.linux create mode 100644 src/3rdparty/libmng/makefiles/makefile.mingw create mode 100644 src/3rdparty/libmng/makefiles/makefile.mingwdll create mode 100644 src/3rdparty/libmng/makefiles/makefile.qnx create mode 100644 src/3rdparty/libmng/makefiles/makefile.unix create mode 100644 src/3rdparty/libmng/makefiles/makefile.vcwin32 create mode 100755 src/3rdparty/libmng/unmaintained/autogen.sh create mode 100644 src/3rdparty/libpng.pri create mode 100644 src/3rdparty/libpng/ANNOUNCE create mode 100644 src/3rdparty/libpng/CHANGES create mode 100644 src/3rdparty/libpng/CMakeLists.txt create mode 100644 src/3rdparty/libpng/INSTALL create mode 100644 src/3rdparty/libpng/LICENSE create mode 100644 src/3rdparty/libpng/README create mode 100644 src/3rdparty/libpng/TODO create mode 100644 src/3rdparty/libpng/config.guess create mode 100644 src/3rdparty/libpng/config.h.in create mode 100644 src/3rdparty/libpng/config.sub create mode 100644 src/3rdparty/libpng/configure.ac create mode 100644 src/3rdparty/libpng/example.c create mode 100644 src/3rdparty/libpng/libpng-manual.txt create mode 100644 src/3rdparty/libpng/libpng.3 create mode 100644 src/3rdparty/libpng/libpng.pc.in create mode 100644 src/3rdparty/libpng/libpngpf.3 create mode 100644 src/3rdparty/libpng/png.5 create mode 100644 src/3rdparty/libpng/png.c create mode 100644 src/3rdparty/libpng/png.h create mode 100644 src/3rdparty/libpng/pngconf.h create mode 100644 src/3rdparty/libpng/pngdebug.h create mode 100644 src/3rdparty/libpng/pngerror.c create mode 100644 src/3rdparty/libpng/pngget.c create mode 100644 src/3rdparty/libpng/pnginfo.h create mode 100644 src/3rdparty/libpng/pnglibconf.h create mode 100644 src/3rdparty/libpng/pngmem.c create mode 100644 src/3rdparty/libpng/pngpread.c create mode 100644 src/3rdparty/libpng/pngpriv.h create mode 100644 src/3rdparty/libpng/pngread.c create mode 100644 src/3rdparty/libpng/pngrio.c create mode 100644 src/3rdparty/libpng/pngrtran.c create mode 100644 src/3rdparty/libpng/pngrutil.c create mode 100644 src/3rdparty/libpng/pngset.c create mode 100644 src/3rdparty/libpng/pngstruct.h create mode 100644 src/3rdparty/libpng/pngtest.c create mode 100644 src/3rdparty/libpng/pngtrans.c create mode 100644 src/3rdparty/libpng/pngvalid.c create mode 100644 src/3rdparty/libpng/pngwio.c create mode 100644 src/3rdparty/libpng/pngwrite.c create mode 100644 src/3rdparty/libpng/pngwtran.c create mode 100644 src/3rdparty/libpng/pngwutil.c create mode 100644 src/3rdparty/libtiff.pri create mode 100644 src/3rdparty/libtiff/COPYRIGHT create mode 100644 src/3rdparty/libtiff/ChangeLog create mode 100644 src/3rdparty/libtiff/HOWTO-RELEASE create mode 100644 src/3rdparty/libtiff/README create mode 100644 src/3rdparty/libtiff/README.vms create mode 100644 src/3rdparty/libtiff/RELEASE-DATE create mode 100644 src/3rdparty/libtiff/SConstruct create mode 100644 src/3rdparty/libtiff/TODO create mode 100644 src/3rdparty/libtiff/VERSION create mode 100644 src/3rdparty/libtiff/html/TIFFTechNote2.html create mode 100644 src/3rdparty/libtiff/html/addingtags.html create mode 100644 src/3rdparty/libtiff/html/bugs.html create mode 100644 src/3rdparty/libtiff/html/build.html create mode 100644 src/3rdparty/libtiff/html/contrib.html create mode 100644 src/3rdparty/libtiff/html/document.html create mode 100644 src/3rdparty/libtiff/html/images.html create mode 100644 src/3rdparty/libtiff/html/images/back.gif create mode 100644 src/3rdparty/libtiff/html/images/bali.jpg create mode 100644 src/3rdparty/libtiff/html/images/cat.gif create mode 100644 src/3rdparty/libtiff/html/images/cover.jpg create mode 100644 src/3rdparty/libtiff/html/images/cramps.gif create mode 100644 src/3rdparty/libtiff/html/images/dave.gif create mode 100644 src/3rdparty/libtiff/html/images/info.gif create mode 100644 src/3rdparty/libtiff/html/images/jello.jpg create mode 100644 src/3rdparty/libtiff/html/images/jim.gif create mode 100644 src/3rdparty/libtiff/html/images/note.gif create mode 100644 src/3rdparty/libtiff/html/images/oxford.gif create mode 100644 src/3rdparty/libtiff/html/images/quad.jpg create mode 100644 src/3rdparty/libtiff/html/images/ring.gif create mode 100644 src/3rdparty/libtiff/html/images/smallliz.jpg create mode 100644 src/3rdparty/libtiff/html/images/strike.gif create mode 100644 src/3rdparty/libtiff/html/images/warning.gif create mode 100644 src/3rdparty/libtiff/html/index.html create mode 100644 src/3rdparty/libtiff/html/internals.html create mode 100644 src/3rdparty/libtiff/html/intro.html create mode 100644 src/3rdparty/libtiff/html/libtiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFClose.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFDataWidth.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFError.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFFlush.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFGetField.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFOpen.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFPrintDirectory.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFRGBAImage.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadDirectory.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadEncodedStrip.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadEncodedTile.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadRGBAImage.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadRGBAStrip.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadRGBATile.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadRawStrip.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadRawTile.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadScanline.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFReadTile.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFSetDirectory.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFSetField.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFWarning.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFWriteDirectory.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFWriteEncodedStrip.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFWriteEncodedTile.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFWriteRawStrip.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFWriteRawTile.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFWriteScanline.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFWriteTile.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFbuffer.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFcodec.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFcolor.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFmemory.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFquery.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFsize.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFstrip.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFswab.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/TIFFtile.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/fax2ps.1.html create mode 100644 src/3rdparty/libtiff/html/man/fax2tiff.1.html create mode 100644 src/3rdparty/libtiff/html/man/gif2tiff.1.html create mode 100644 src/3rdparty/libtiff/html/man/index.html create mode 100644 src/3rdparty/libtiff/html/man/libtiff.3tiff.html create mode 100644 src/3rdparty/libtiff/html/man/pal2rgb.1.html create mode 100644 src/3rdparty/libtiff/html/man/ppm2tiff.1.html create mode 100644 src/3rdparty/libtiff/html/man/ras2tiff.1.html create mode 100644 src/3rdparty/libtiff/html/man/raw2tiff.1.html create mode 100644 src/3rdparty/libtiff/html/man/rgb2ycbcr.1.html create mode 100644 src/3rdparty/libtiff/html/man/sgi2tiff.1.html create mode 100644 src/3rdparty/libtiff/html/man/thumbnail.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiff2bw.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiff2pdf.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiff2ps.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiff2rgba.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffcmp.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffcp.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffcrop.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffdither.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffdump.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffgt.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffinfo.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffmedian.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffset.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffsplit.1.html create mode 100644 src/3rdparty/libtiff/html/man/tiffsv.1.html create mode 100644 src/3rdparty/libtiff/html/misc.html create mode 100644 src/3rdparty/libtiff/html/support.html create mode 100644 src/3rdparty/libtiff/html/tools.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta007.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta016.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta018.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta024.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta028.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta029.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta031.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta032.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta033.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta034.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta035.html create mode 100644 src/3rdparty/libtiff/html/v3.4beta036.html create mode 100644 src/3rdparty/libtiff/html/v3.5.1.html create mode 100644 src/3rdparty/libtiff/html/v3.5.2.html create mode 100644 src/3rdparty/libtiff/html/v3.5.3.html create mode 100644 src/3rdparty/libtiff/html/v3.5.4.html create mode 100644 src/3rdparty/libtiff/html/v3.5.5.html create mode 100644 src/3rdparty/libtiff/html/v3.5.6-beta.html create mode 100644 src/3rdparty/libtiff/html/v3.5.7.html create mode 100644 src/3rdparty/libtiff/html/v3.6.0.html create mode 100644 src/3rdparty/libtiff/html/v3.6.1.html create mode 100644 src/3rdparty/libtiff/html/v3.7.0.html create mode 100644 src/3rdparty/libtiff/html/v3.7.0alpha.html create mode 100644 src/3rdparty/libtiff/html/v3.7.0beta.html create mode 100644 src/3rdparty/libtiff/html/v3.7.0beta2.html create mode 100644 src/3rdparty/libtiff/html/v3.7.1.html create mode 100644 src/3rdparty/libtiff/html/v3.7.2.html create mode 100644 src/3rdparty/libtiff/html/v3.7.3.html create mode 100644 src/3rdparty/libtiff/html/v3.7.4.html create mode 100644 src/3rdparty/libtiff/html/v3.8.0.html create mode 100644 src/3rdparty/libtiff/html/v3.8.1.html create mode 100644 src/3rdparty/libtiff/html/v3.8.2.html create mode 100644 src/3rdparty/libtiff/html/v3.9.0beta.html create mode 100644 src/3rdparty/libtiff/html/v3.9.1.html create mode 100644 src/3rdparty/libtiff/html/v3.9.2.html create mode 100644 src/3rdparty/libtiff/libtiff/SConstruct create mode 100644 src/3rdparty/libtiff/libtiff/libtiff.def create mode 100644 src/3rdparty/libtiff/libtiff/mkg3states.c create mode 100644 src/3rdparty/libtiff/libtiff/t4.h create mode 100644 src/3rdparty/libtiff/libtiff/tif_acorn.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_apple.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_atari.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_aux.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_close.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_codec.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_color.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_compress.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_config.h create mode 100644 src/3rdparty/libtiff/libtiff/tif_config.h-vms create mode 100644 src/3rdparty/libtiff/libtiff/tif_config.h.in create mode 100644 src/3rdparty/libtiff/libtiff/tif_config.vc.h create mode 100644 src/3rdparty/libtiff/libtiff/tif_config.wince.h create mode 100644 src/3rdparty/libtiff/libtiff/tif_dir.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_dir.h create mode 100644 src/3rdparty/libtiff/libtiff/tif_dirinfo.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_dirread.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_dirwrite.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_dumpmode.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_error.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_extension.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_fax3.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_fax3.h create mode 100644 src/3rdparty/libtiff/libtiff/tif_fax3sm.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_flush.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_getimage.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_jbig.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_jpeg.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_luv.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_lzw.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_msdos.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_next.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_ojpeg.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_open.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_packbits.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_pixarlog.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_predict.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_predict.h create mode 100644 src/3rdparty/libtiff/libtiff/tif_print.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_read.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_stream.cxx create mode 100644 src/3rdparty/libtiff/libtiff/tif_strip.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_swab.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_thunder.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_tile.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_unix.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_version.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_warning.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_win3.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_win32.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_wince.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_write.c create mode 100644 src/3rdparty/libtiff/libtiff/tif_zip.c create mode 100644 src/3rdparty/libtiff/libtiff/tiff.h create mode 100644 src/3rdparty/libtiff/libtiff/tiffconf.h create mode 100644 src/3rdparty/libtiff/libtiff/tiffconf.h.in create mode 100644 src/3rdparty/libtiff/libtiff/tiffconf.vc.h create mode 100644 src/3rdparty/libtiff/libtiff/tiffconf.wince.h create mode 100644 src/3rdparty/libtiff/libtiff/tiffio.h create mode 100644 src/3rdparty/libtiff/libtiff/tiffio.hxx create mode 100644 src/3rdparty/libtiff/libtiff/tiffiop.h create mode 100644 src/3rdparty/libtiff/libtiff/tiffvers.h create mode 100644 src/3rdparty/libtiff/libtiff/uvcode.h create mode 100644 src/3rdparty/libtiff/nmake.opt create mode 100644 src/3rdparty/libtiff/port/dummy.c create mode 100644 src/3rdparty/libtiff/port/getopt.c create mode 100644 src/3rdparty/libtiff/port/lfind.c create mode 100644 src/3rdparty/libtiff/port/libport.h create mode 100644 src/3rdparty/libtiff/port/strcasecmp.c create mode 100644 src/3rdparty/libtiff/port/strtoul.c create mode 100644 src/3rdparty/md4/md4.cpp create mode 100644 src/3rdparty/md4/md4.h create mode 100644 src/3rdparty/md5/md5.cpp create mode 100644 src/3rdparty/md5/md5.h create mode 100644 src/3rdparty/patches/libmng-1.0.10-endless-loop.patch create mode 100644 src/3rdparty/pixman/README create mode 100644 src/3rdparty/pixman/pixman-arm-neon-asm.S create mode 100644 src/3rdparty/pixman/pixman-arm-neon-asm.h create mode 100644 src/3rdparty/powervr/pvr2d.h create mode 100644 src/3rdparty/powervr/wsegl.h create mode 100644 src/3rdparty/ptmalloc/COPYRIGHT create mode 100644 src/3rdparty/ptmalloc/ChangeLog create mode 100644 src/3rdparty/ptmalloc/Makefile create mode 100644 src/3rdparty/ptmalloc/README create mode 100644 src/3rdparty/ptmalloc/lran2.h create mode 100644 src/3rdparty/ptmalloc/malloc-2.8.3.h create mode 100644 src/3rdparty/ptmalloc/malloc-private.h create mode 100644 src/3rdparty/ptmalloc/malloc.c create mode 100644 src/3rdparty/ptmalloc/ptmalloc3.c create mode 100644 src/3rdparty/ptmalloc/sysdeps/generic/atomic.h create mode 100644 src/3rdparty/ptmalloc/sysdeps/generic/malloc-machine.h create mode 100644 src/3rdparty/ptmalloc/sysdeps/generic/thread-st.h create mode 100644 src/3rdparty/ptmalloc/sysdeps/pthread/malloc-machine.h create mode 100644 src/3rdparty/ptmalloc/sysdeps/pthread/thread-st.h create mode 100644 src/3rdparty/ptmalloc/sysdeps/solaris/malloc-machine.h create mode 100644 src/3rdparty/ptmalloc/sysdeps/solaris/thread-st.h create mode 100644 src/3rdparty/ptmalloc/sysdeps/sproc/malloc-machine.h create mode 100644 src/3rdparty/ptmalloc/sysdeps/sproc/thread-st.h create mode 100644 src/3rdparty/s60/eiksoftkeyimage.h create mode 100644 src/3rdparty/sha1/sha1.cpp create mode 100644 src/3rdparty/sqlite.pri create mode 100644 src/3rdparty/sqlite/shell.c create mode 100644 src/3rdparty/sqlite/sqlite3.c create mode 100644 src/3rdparty/sqlite/sqlite3.h create mode 100644 src/3rdparty/wintab/pktdef.h create mode 100644 src/3rdparty/wintab/wintab.h create mode 100644 src/3rdparty/xorg/wacomcfg.h create mode 100644 src/3rdparty/zlib.pri create mode 100644 src/3rdparty/zlib/CMakeLists.txt create mode 100644 src/3rdparty/zlib/ChangeLog create mode 100644 src/3rdparty/zlib/FAQ create mode 100644 src/3rdparty/zlib/INDEX create mode 100644 src/3rdparty/zlib/README create mode 100644 src/3rdparty/zlib/adler32.c create mode 100644 src/3rdparty/zlib/compress.c create mode 100644 src/3rdparty/zlib/crc32.c create mode 100644 src/3rdparty/zlib/crc32.h create mode 100644 src/3rdparty/zlib/deflate.c create mode 100644 src/3rdparty/zlib/deflate.h create mode 100644 src/3rdparty/zlib/doc/algorithm.txt create mode 100644 src/3rdparty/zlib/doc/rfc1950.txt create mode 100644 src/3rdparty/zlib/doc/rfc1951.txt create mode 100644 src/3rdparty/zlib/doc/rfc1952.txt create mode 100644 src/3rdparty/zlib/doc/txtvsbin.txt create mode 100644 src/3rdparty/zlib/example.c create mode 100644 src/3rdparty/zlib/gzclose.c create mode 100644 src/3rdparty/zlib/gzguts.h create mode 100644 src/3rdparty/zlib/gzlib.c create mode 100644 src/3rdparty/zlib/gzread.c create mode 100644 src/3rdparty/zlib/gzwrite.c create mode 100644 src/3rdparty/zlib/infback.c create mode 100644 src/3rdparty/zlib/inffast.c create mode 100644 src/3rdparty/zlib/inffast.h create mode 100644 src/3rdparty/zlib/inffixed.h create mode 100644 src/3rdparty/zlib/inflate.c create mode 100644 src/3rdparty/zlib/inflate.h create mode 100644 src/3rdparty/zlib/inftrees.c create mode 100644 src/3rdparty/zlib/inftrees.h create mode 100644 src/3rdparty/zlib/minigzip.c create mode 100644 src/3rdparty/zlib/treebuild.xml create mode 100644 src/3rdparty/zlib/trees.c create mode 100644 src/3rdparty/zlib/trees.h create mode 100644 src/3rdparty/zlib/uncompr.c create mode 100644 src/3rdparty/zlib/zconf.h create mode 100644 src/3rdparty/zlib/zconf.h.cmakein create mode 100644 src/3rdparty/zlib/zconf.h.in create mode 100644 src/3rdparty/zlib/zlib.3 create mode 100644 src/3rdparty/zlib/zlib.3.pdf create mode 100644 src/3rdparty/zlib/zlib.h create mode 100644 src/3rdparty/zlib/zlib.pc.in create mode 100644 src/3rdparty/zlib/zutil.c create mode 100644 src/3rdparty/zlib/zutil.h create mode 100644 src/3rdparty/zlib_dependency.pri (limited to 'src/3rdparty') diff --git a/src/3rdparty/.gitattributes b/src/3rdparty/.gitattributes new file mode 100644 index 0000000000..8cb308ab3c --- /dev/null +++ b/src/3rdparty/.gitattributes @@ -0,0 +1,19 @@ +libpng/projects/cbuilder5/libpng.bpf -crlf +libpng/projects/cbuilder5/libpng.bpg -crlf +libpng/projects/cbuilder5/libpng.bpr -crlf +libpng/projects/cbuilder5/libpng.cpp -crlf +libpng/projects/cbuilder5/libpngstat.bpf -crlf +libpng/projects/cbuilder5/libpngstat.bpr -crlf +libpng/projects/visualc6/libpng.dsp -crlf +libpng/projects/visualc6/libpng.dsw -crlf +libpng/projects/visualc6/pngtest.dsp -crlf +libpng/projects/visualc71/libpng.sln -crlf +libpng/projects/visualc71/libpng.vcproj -crlf +libpng/projects/visualc71/pngtest.vcproj -crlf +libpng/projects/visualc71/zlib.vcproj -crlf +libtiff/nmake.opt -crlf +zlib/projects/visualc6/example.dsp -crlf +zlib/projects/visualc6/minigzip.dsp -crlf +zlib/projects/visualc6/README.txt -crlf +zlib/projects/visualc6/zlib.dsp -crlf +zlib/projects/visualc6/zlib.dsw -crlf diff --git a/src/3rdparty/Makefile b/src/3rdparty/Makefile new file mode 100644 index 0000000000..c8c9ed1924 --- /dev/null +++ b/src/3rdparty/Makefile @@ -0,0 +1,9 @@ +PNGMAK=scripts/makefile.linux + +all: + cd zlib; ./configure; make + cd libpng; make -f $(PNGMAK) + +clean: + -cd zlib; make clean + -cd libpng; make -f $(PNGMAK) clean diff --git a/src/3rdparty/README b/src/3rdparty/README new file mode 100644 index 0000000000..0248db1c53 --- /dev/null +++ b/src/3rdparty/README @@ -0,0 +1,23 @@ +The libraries included here are the original packages, unpacked, and +with their version number removed from the directory name (for version +information, see the README files in the directories). + +Certain files and subdirectories of the original library packages that +are irrelevant to Qt may not be included here. Typically, those are +the standalone library configuration and make files, tools, test +files, contribs, documentation, and similar. + +Patches may have been applied, typically for configuration and build +issues in the Qt framework. Such patches can be reviewed in the the +public git repository; they will appear in the commit logs of each +library directory, following the latest clean version update commit. + +The 'patches' subdirectory contains certain patches applied prior to +the start of the public git history, where the library has not been +updated since. + +-- + +The pvr2d.h & wsegl.h in the powervr directory are required for building +the PowerVR plugin on Qt for Embedded Linux. These headers are for SGX +based SoCs, but may also work on MBX SoCs. diff --git a/src/3rdparty/ce-compat/ce_time.c b/src/3rdparty/ce-compat/ce_time.c new file mode 100644 index 0000000000..92efae0ebb --- /dev/null +++ b/src/3rdparty/ce-compat/ce_time.c @@ -0,0 +1,677 @@ +// +// strftime.c +// +// Date to string conversion +// +// Copyright (C) 2002 Michael Ringgaard. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// + +///////////////////////////////////////////////////////////////////////////////////////////// +// // +// time() // +// // +///////////////////////////////////////////////////////////////////////////////////////////// + + +#include +#include +#include "ce_time.h" + +time_t +time(time_t* timer) +{ + SYSTEMTIME systime; + struct tm tmtime; + time_t tt; + + GetLocalTime(&systime); + + tmtime.tm_year = systime.wYear-1900; + tmtime.tm_mon = systime.wMonth-1; + tmtime.tm_mday = systime.wDay; + tmtime.tm_wday = systime.wDayOfWeek; + tmtime.tm_hour = systime.wHour; + tmtime.tm_min = systime.wMinute; + tmtime.tm_sec = systime.wSecond; + + tt = mktime(&tmtime); + + if(timer) + *timer = tt; + + return tt; +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +// // +// mktime() // +// // +///////////////////////////////////////////////////////////////////////////////////////////// + +static int month_to_day[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + +time_t mktime(struct tm *t) +{ + short month, year; + time_t result; + + month = t->tm_mon; + year = t->tm_year + month / 12 + 1900; + month %= 12; + if (month < 0) + { + year -= 1; + month += 12; + } + result = (year - 1970) * 365 + (year - 1969) / 4 + month_to_day[month]; + result = (year - 1970) * 365 + month_to_day[month]; + if (month <= 1) + year -= 1; + result += (year - 1968) / 4; + result -= (year - 1900) / 100; + result += (year - 1600) / 400; + result += t->tm_mday; + result -= 1; + result *= 24; + result += t->tm_hour; + result *= 60; + result += t->tm_min; + result *= 60; + result += t->tm_sec; + return(result); +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +// // +// strftime() - taken from OpenBSD // +// // +///////////////////////////////////////////////////////////////////////////////////////////// + +#define IN_NONE 0 +#define IN_SOME 1 +#define IN_THIS 2 +#define IN_ALL 3 +#define CHAR_BIT 8 + +#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT) +#define TYPE_SIGNED(type) (((type) -1) < 0) + +#define INT_STRLEN_MAXIMUM(type) \ + ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + 1 + TYPE_SIGNED(type)) + +#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) + +#define MONSPERYEAR 12 +#define DAYSPERWEEK 7 +#define TM_YEAR_BASE 1900 +#define HOURSPERDAY 24 +#define DAYSPERNYEAR 365 +#define DAYSPERLYEAR 366 + +static char wildabbr[] = "WILDABBR"; + +static char * tzname[2] = { + wildabbr, + wildabbr +}; + + +#define Locale (&C_time_locale) + +struct lc_time_T { + const char * mon[MONSPERYEAR]; + const char * month[MONSPERYEAR]; + const char * wday[DAYSPERWEEK]; + const char * weekday[DAYSPERWEEK]; + const char * X_fmt; + const char * x_fmt; + const char * c_fmt; + const char * am; + const char * pm; + const char * date_fmt; +}; + +static const struct lc_time_T C_time_locale = { + { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }, { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + }, { + "Sun", "Mon", "Tue", "Wed", + "Thu", "Fri", "Sat" + }, { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" + }, + + /* X_fmt */ + "%H:%M:%S", + + /* + ** x_fmt + ** C99 requires this format. + ** Using just numbers (as here) makes Quakers happier; + ** it's also compatible with SVR4. + */ + "%m/%d/%y", + + /* + ** c_fmt + ** C99 requires this format. + ** Previously this code used "%D %X", but we now conform to C99. + ** Note that + ** "%a %b %d %H:%M:%S %Y" + ** is used by Solaris 2.3. + */ + "%a %b %e %T %Y", + + /* am */ + "AM", + + /* pm */ + "PM", + + /* date_fmt */ + "%a %b %e %H:%M:%S %Z %Y" +}; + + +static char * +_add(const char * str, char * pt, const char * const ptlim) +{ + while (pt < ptlim && (*pt = *str++) != '\0') + ++pt; + return pt; +} + + +static char * +_conv(const int n, const char * const format, char * const pt, const char * const ptlim) +{ + char buf[INT_STRLEN_MAXIMUM(int) + 1]; + + (void) _snprintf(buf, sizeof buf, format, n); + return _add(buf, pt, ptlim); +} + + +static char * +_fmt(const char * format, const struct tm * const t, char * pt, const char * const ptlim, int * warnp) +{ + for ( ; *format; ++format) { + if (*format == '%') { +label: + switch (*++format) { + case '\0': + --format; + break; + case 'A': + pt = _add((t->tm_wday < 0 || + t->tm_wday >= DAYSPERWEEK) ? + "?" : Locale->weekday[t->tm_wday], + pt, ptlim); + continue; + case 'a': + pt = _add((t->tm_wday < 0 || + t->tm_wday >= DAYSPERWEEK) ? + "?" : Locale->wday[t->tm_wday], + pt, ptlim); + continue; + case 'B': + pt = _add((t->tm_mon < 0 || + t->tm_mon >= MONSPERYEAR) ? + "?" : Locale->month[t->tm_mon], + pt, ptlim); + continue; + case 'b': + case 'h': + pt = _add((t->tm_mon < 0 || + t->tm_mon >= MONSPERYEAR) ? + "?" : Locale->mon[t->tm_mon], + pt, ptlim); + continue; + case 'C': + /* + ** %C used to do a... + ** _fmt("%a %b %e %X %Y", t); + ** ...whereas now POSIX 1003.2 calls for + ** something completely different. + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_year + TM_YEAR_BASE) / 100, + "%02d", pt, ptlim); + continue; + case 'c': + { + int warn2 = IN_SOME; + + pt = _fmt(Locale->c_fmt, t, pt, ptlim, warnp); + if (warn2 == IN_ALL) + warn2 = IN_THIS; + if (warn2 > *warnp) + *warnp = warn2; + } + continue; + case 'D': + pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp); + continue; + case 'd': + pt = _conv(t->tm_mday, "%02d", pt, ptlim); + continue; + case 'E': + case 'O': + /* + ** C99 locale modifiers. + ** The sequences + ** %Ec %EC %Ex %EX %Ey %EY + ** %Od %oe %OH %OI %Om %OM + ** %OS %Ou %OU %OV %Ow %OW %Oy + ** are supposed to provide alternate + ** representations. + */ + goto label; + case 'e': + pt = _conv(t->tm_mday, "%2d", pt, ptlim); + continue; + case 'F': + pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp); + continue; + case 'H': + pt = _conv(t->tm_hour, "%02d", pt, ptlim); + continue; + case 'I': + pt = _conv((t->tm_hour % 12) ? + (t->tm_hour % 12) : 12, + "%02d", pt, ptlim); + continue; + case 'j': + pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim); + continue; + case 'k': + /* + ** This used to be... + ** _conv(t->tm_hour % 12 ? + ** t->tm_hour % 12 : 12, 2, ' '); + ** ...and has been changed to the below to + ** match SunOS 4.1.1 and Arnold Robbins' + ** strftime version 3.0. That is, "%k" and + ** "%l" have been swapped. + ** (ado, 1993-05-24) + */ + pt = _conv(t->tm_hour, "%2d", pt, ptlim); + continue; +#ifdef KITCHEN_SINK + case 'K': + /* + ** After all this time, still unclaimed! + */ + pt = _add("kitchen sink", pt, ptlim); + continue; +#endif /* defined KITCHEN_SINK */ + case 'l': + /* + ** This used to be... + ** _conv(t->tm_hour, 2, ' '); + ** ...and has been changed to the below to + ** match SunOS 4.1.1 and Arnold Robbin's + ** strftime version 3.0. That is, "%k" and + ** "%l" have been swapped. + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_hour % 12) ? + (t->tm_hour % 12) : 12, + "%2d", pt, ptlim); + continue; + case 'M': + pt = _conv(t->tm_min, "%02d", pt, ptlim); + continue; + case 'm': + pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim); + continue; + case 'n': + pt = _add("\n", pt, ptlim); + continue; + case 'p': + pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ? + Locale->pm : + Locale->am, + pt, ptlim); + continue; + case 'R': + pt = _fmt("%H:%M", t, pt, ptlim, warnp); + continue; + case 'r': + pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp); + continue; + case 'S': + pt = _conv(t->tm_sec, "%02d", pt, ptlim); + continue; + case 's': + { + struct tm tm; + char buf[INT_STRLEN_MAXIMUM( + time_t) + 1]; + time_t mkt; + + tm = *t; + mkt = mktime(&tm); + if (TYPE_SIGNED(time_t)) + (void) _snprintf(buf, sizeof buf, + "%ld", (long) mkt); + else (void) _snprintf(buf, sizeof buf, + "%lu", (unsigned long) mkt); + pt = _add(buf, pt, ptlim); + } + continue; + case 'T': + pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp); + continue; + case 't': + pt = _add("\t", pt, ptlim); + continue; + case 'U': + pt = _conv((t->tm_yday + DAYSPERWEEK - + t->tm_wday) / DAYSPERWEEK, + "%02d", pt, ptlim); + continue; + case 'u': + /* + ** From Arnold Robbins' strftime version 3.0: + ** "ISO 8601: Weekday as a decimal number + ** [1 (Monday) - 7]" + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_wday == 0) ? + DAYSPERWEEK : t->tm_wday, + "%d", pt, ptlim); + continue; + case 'V': /* ISO 8601 week number */ + case 'G': /* ISO 8601 year (four digits) */ + case 'g': /* ISO 8601 year (two digits) */ + { + int year; + int yday; + int wday; + int w; + + year = t->tm_year + TM_YEAR_BASE; + yday = t->tm_yday; + wday = t->tm_wday; + for ( ; ; ) { + int len; + int bot; + int top; + + len = isleap(year) ? + DAYSPERLYEAR : + DAYSPERNYEAR; + /* + ** What yday (-3 ... 3) does + ** the ISO year begin on? + */ + bot = ((yday + 11 - wday) % + DAYSPERWEEK) - 3; + /* + ** What yday does the NEXT + ** ISO year begin on? + */ + top = bot - + (len % DAYSPERWEEK); + if (top < -3) + top += DAYSPERWEEK; + top += len; + if (yday >= top) { + ++year; + w = 1; + break; + } + if (yday >= bot) { + w = 1 + ((yday - bot) / + DAYSPERWEEK); + break; + } + --year; + yday += isleap(year) ? + DAYSPERLYEAR : + DAYSPERNYEAR; + } + if (*format == 'V') + pt = _conv(w, "%02d", + pt, ptlim); + else if (*format == 'g') { + *warnp = IN_ALL; + pt = _conv(year % 100, "%02d", + pt, ptlim); + } else pt = _conv(year, "%04d", + pt, ptlim); + } + continue; + case 'v': + pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp); + continue; + case 'W': + pt = _conv((t->tm_yday + DAYSPERWEEK - + (t->tm_wday ? + (t->tm_wday - 1) : + (DAYSPERWEEK - 1))) / DAYSPERWEEK, + "%02d", pt, ptlim); + continue; + case 'w': + pt = _conv(t->tm_wday, "%d", pt, ptlim); + continue; + case 'X': + pt = _fmt(Locale->X_fmt, t, pt, ptlim, warnp); + continue; + case 'x': + { + int warn2 = IN_SOME; + + pt = _fmt(Locale->x_fmt, t, pt, ptlim, &warn2); + if (warn2 == IN_ALL) + warn2 = IN_THIS; + if (warn2 > *warnp) + *warnp = warn2; + } + continue; + case 'y': + *warnp = IN_ALL; + pt = _conv((t->tm_year + TM_YEAR_BASE) % 100, + "%02d", pt, ptlim); + continue; + case 'Y': + pt = _conv(t->tm_year + TM_YEAR_BASE, "%04d", + pt, ptlim); + continue; + case 'Z': + if (t->tm_isdst >= 0) + pt = _add(tzname[t->tm_isdst != 0], + pt, ptlim); + /* + ** C99 says that %Z must be replaced by the + ** empty string if the time zone is not + ** determinable. + */ + continue; + case 'z': + { + int diff; + char const * sign; + + if (t->tm_isdst < 0) + continue; + continue; + if (diff < 0) { + sign = "-"; + diff = -diff; + } else sign = "+"; + pt = _add(sign, pt, ptlim); + diff /= 60; + pt = _conv((diff/60)*100 + diff%60, + "%04d", pt, ptlim); + } + continue; + case '+': + pt = _fmt(Locale->date_fmt, t, pt, ptlim, + warnp); + continue; + case '%': + default: + break; + } + } + if (pt == ptlim) + break; + *pt++ = *format; + } + return pt; +} + + +size_t +strftime(char * const s, const size_t maxsize, const char * const format, const struct tm * const t) +{ + char * p; + int warn; + + //tzset(); + + warn = IN_NONE; + p = _fmt(((format == NULL) ? "%c" : format), t, s, s + maxsize, &warn); + + if (p == s + maxsize) { + if (maxsize > 0) + s[maxsize - 1] = '\0'; + return 0; + } + *p = '\0'; + return p - s; +} + + + +///////////////////////////////////////////////////////////////////////////////////////////// +// // +// gmtime() // +// // +///////////////////////////////////////////////////////////////////////////////////////////// + + + +static struct tm mytm; + +static int DMonth[13] = { 0,31,59,90,120,151,181,212,243,273,304,334,365 }; +static int monthCodes[12] = { 6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }; + + +static int +calcDayOfWeek(const struct tm* nTM) +{ + int day; + + day = (nTM->tm_year%100); + day += day/4; + day += monthCodes[nTM->tm_mon]; + day += nTM->tm_mday; + while(day>=7) + day -= 7; + + return day; +} + + +static struct tm * +gmtime(const time_t *timer) +{ + unsigned long x = *timer; + int imin, ihrs, iday, iyrs; + int sec, min, hrs, day, mon, yrs; + int lday, qday, jday, mday; + + + imin = x / 60; // whole minutes since 1/1/70 + sec = x - (60 * imin); // leftover seconds + ihrs = imin / 60; // whole hours since 1/1/70 + min = imin - 60 * ihrs; // leftover minutes + iday = ihrs / 24; // whole days since 1/1/70 + hrs = ihrs - 24 * iday; // leftover hours + iday = iday + 365 + 366; // whole days since 1/1/68 + lday = iday / (( 4* 365) + 1); // quadyr = 4 yr period = 1461 days + qday = iday % (( 4 * 365) + 1); // days since current quadyr began + if(qday >= (31 + 29)) // if past feb 29 then + lday = lday + 1; // add this quadyr’s leap day to the + // # of quadyrs (leap days) since 68 + iyrs = (iday - lday) / 365; // whole years since 1968 + jday = iday - (iyrs * 365) - lday; // days since 1 /1 of current year. + if(qday <= 365 && qday >= 60) // if past 2/29 and a leap year then + jday = jday + 1; // add a leap day to the # of whole + // days since 1/1 of current year + yrs = iyrs + 1968; // compute year + mon = 13; // estimate month ( +1) + mday = 366; // max days since 1/1 is 365 + while(jday < mday) // mday = # of days passed from 1/1 + { // until first day of current month + mon = mon - 1; // mon = month (estimated) + mday = DMonth[mon]; // # elapsed days at first of ”mon” + if((mon > 2) && (yrs % 4) == 0) // if past 2/29 and leap year then + mday = mday + 1; // add leap day + // compute month by decrementing + } // month until found + + day = jday - mday + 1; // compute day of month + + mytm.tm_sec = sec; + mytm.tm_min = min; + mytm.tm_hour = hrs; + mytm.tm_mday = day; + mytm.tm_mon = mon; + mytm.tm_year = yrs - 1900; + + mytm.tm_wday = calcDayOfWeek(&mytm); + mytm.tm_yday = jday; + mytm.tm_isdst = 0; + + return &mytm; +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +// // +// localtime() - simply using gmtime() // +// // +///////////////////////////////////////////////////////////////////////////////////////////// + + +struct tm * +localtime(const time_t *timer) +{ + return gmtime(timer); +} diff --git a/src/3rdparty/ce-compat/ce_time.h b/src/3rdparty/ce-compat/ce_time.h new file mode 100644 index 0000000000..07ca094634 --- /dev/null +++ b/src/3rdparty/ce-compat/ce_time.h @@ -0,0 +1,25 @@ +#ifndef __CE_TIME_H__ +#define __CE_TIME_H__ + +#if defined(_WIN32_WCE) && _WIN32_WCE >= 0x600 +/* we need to prototype the time functions for Windows CE >= 6.0 */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct tm; + +time_t time(time_t* timer); +time_t mktime(struct tm *t); +size_t strftime(char * const s, const size_t maxsize, const char * const format, const struct tm * const t); +struct tm *localtime(const time_t *timer); + +#ifdef __cplusplus +} /* closing brace for extern "C" */ +#endif + +#endif /* defined(_WIN32_WCE) && _WIN32_WCE >= 0x600 */ + +#endif /* !defined(__CE_TIME_H__) */ diff --git a/src/3rdparty/des/des.cpp b/src/3rdparty/des/des.cpp new file mode 100644 index 0000000000..c1a260bbac --- /dev/null +++ b/src/3rdparty/des/des.cpp @@ -0,0 +1,602 @@ +/* + * Implementation of DES encryption for NTLM + * + * Copyright 1997-2005 Simon Tatham. + * + * This software is released under the MIT license. + */ + +/* + * Description of DES + * ------------------ + * + * Unlike the description in FIPS 46, I'm going to use _sensible_ indices: + * bits in an n-bit word are numbered from 0 at the LSB to n-1 at the MSB. + * And S-boxes are indexed by six consecutive bits, not by the outer two + * followed by the middle four. + * + * The DES encryption routine requires a 64-bit input, and a key schedule K + * containing 16 48-bit elements. + * + * First the input is permuted by the initial permutation IP. + * Then the input is split into 32-bit words L and R. (L is the MSW.) + * Next, 16 rounds. In each round: + * (L, R) <- (R, L xor f(R, K[i])) + * Then the pre-output words L and R are swapped. + * Then L and R are glued back together into a 64-bit word. (L is the MSW, + * again, but since we just swapped them, the MSW is the R that came out + * of the last round.) + * The 64-bit output block is permuted by the inverse of IP and returned. + * + * Decryption is identical except that the elements of K are used in the + * opposite order. (This wouldn't work if that word swap didn't happen.) + * + * The function f, used in each round, accepts a 32-bit word R and a + * 48-bit key block K. It produces a 32-bit output. + * + * First R is expanded to 48 bits using the bit-selection function E. + * The resulting 48-bit block is XORed with the key block K to produce + * a 48-bit block X. + * This block X is split into eight groups of 6 bits. Each group of 6 + * bits is then looked up in one of the eight S-boxes to convert + * it to 4 bits. These eight groups of 4 bits are glued back + * together to produce a 32-bit preoutput block. + * The preoutput block is permuted using the permutation P and returned. + * + * Key setup maps a 64-bit key word into a 16x48-bit key schedule. Although + * the approved input format for the key is a 64-bit word, eight of the + * bits are discarded, so the actual quantity of key used is 56 bits. + * + * First the input key is converted to two 28-bit words C and D using + * the bit-selection function PC1. + * Then 16 rounds of key setup occur. In each round, C and D are each + * rotated left by either 1 or 2 bits (depending on which round), and + * then converted into a key schedule element using the bit-selection + * function PC2. + * + * That's the actual algorithm. Now for the tedious details: all those + * painful permutations and lookup tables. + * + * IP is a 64-to-64 bit permutation. Its output contains the following + * bits of its input (listed in order MSB to LSB of output). + * + * 6 14 22 30 38 46 54 62 4 12 20 28 36 44 52 60 + * 2 10 18 26 34 42 50 58 0 8 16 24 32 40 48 56 + * 7 15 23 31 39 47 55 63 5 13 21 29 37 45 53 61 + * 3 11 19 27 35 43 51 59 1 9 17 25 33 41 49 57 + * + * E is a 32-to-48 bit selection function. Its output contains the following + * bits of its input (listed in order MSB to LSB of output). + * + * 0 31 30 29 28 27 28 27 26 25 24 23 24 23 22 21 20 19 20 19 18 17 16 15 + * 16 15 14 13 12 11 12 11 10 9 8 7 8 7 6 5 4 3 4 3 2 1 0 31 + * + * The S-boxes are arbitrary table-lookups each mapping a 6-bit input to a + * 4-bit output. In other words, each S-box is an array[64] of 4-bit numbers. + * The S-boxes are listed below. The first S-box listed is applied to the + * most significant six bits of the block X; the last one is applied to the + * least significant. + * + * 14 0 4 15 13 7 1 4 2 14 15 2 11 13 8 1 + * 3 10 10 6 6 12 12 11 5 9 9 5 0 3 7 8 + * 4 15 1 12 14 8 8 2 13 4 6 9 2 1 11 7 + * 15 5 12 11 9 3 7 14 3 10 10 0 5 6 0 13 + * + * 15 3 1 13 8 4 14 7 6 15 11 2 3 8 4 14 + * 9 12 7 0 2 1 13 10 12 6 0 9 5 11 10 5 + * 0 13 14 8 7 10 11 1 10 3 4 15 13 4 1 2 + * 5 11 8 6 12 7 6 12 9 0 3 5 2 14 15 9 + * + * 10 13 0 7 9 0 14 9 6 3 3 4 15 6 5 10 + * 1 2 13 8 12 5 7 14 11 12 4 11 2 15 8 1 + * 13 1 6 10 4 13 9 0 8 6 15 9 3 8 0 7 + * 11 4 1 15 2 14 12 3 5 11 10 5 14 2 7 12 + * + * 7 13 13 8 14 11 3 5 0 6 6 15 9 0 10 3 + * 1 4 2 7 8 2 5 12 11 1 12 10 4 14 15 9 + * 10 3 6 15 9 0 0 6 12 10 11 1 7 13 13 8 + * 15 9 1 4 3 5 14 11 5 12 2 7 8 2 4 14 + * + * 2 14 12 11 4 2 1 12 7 4 10 7 11 13 6 1 + * 8 5 5 0 3 15 15 10 13 3 0 9 14 8 9 6 + * 4 11 2 8 1 12 11 7 10 1 13 14 7 2 8 13 + * 15 6 9 15 12 0 5 9 6 10 3 4 0 5 14 3 + * + * 12 10 1 15 10 4 15 2 9 7 2 12 6 9 8 5 + * 0 6 13 1 3 13 4 14 14 0 7 11 5 3 11 8 + * 9 4 14 3 15 2 5 12 2 9 8 5 12 15 3 10 + * 7 11 0 14 4 1 10 7 1 6 13 0 11 8 6 13 + * + * 4 13 11 0 2 11 14 7 15 4 0 9 8 1 13 10 + * 3 14 12 3 9 5 7 12 5 2 10 15 6 8 1 6 + * 1 6 4 11 11 13 13 8 12 1 3 4 7 10 14 7 + * 10 9 15 5 6 0 8 15 0 14 5 2 9 3 2 12 + * + * 13 1 2 15 8 13 4 8 6 10 15 3 11 7 1 4 + * 10 12 9 5 3 6 14 11 5 0 0 14 12 9 7 2 + * 7 2 11 1 4 14 1 7 9 4 12 10 14 8 2 13 + * 0 15 6 12 10 9 13 0 15 3 3 5 5 6 8 11 + * + * P is a 32-to-32 bit permutation. Its output contains the following + * bits of its input (listed in order MSB to LSB of output). + * + * 16 25 12 11 3 20 4 15 31 17 9 6 27 14 1 22 + * 30 24 8 18 0 5 29 23 13 19 2 26 10 21 28 7 + * + * PC1 is a 64-to-56 bit selection function. Its output is in two words, + * C and D. The word C contains the following bits of its input (listed + * in order MSB to LSB of output). + * + * 7 15 23 31 39 47 55 63 6 14 22 30 38 46 + * 54 62 5 13 21 29 37 45 53 61 4 12 20 28 + * + * And the word D contains these bits. + * + * 1 9 17 25 33 41 49 57 2 10 18 26 34 42 + * 50 58 3 11 19 27 35 43 51 59 36 44 52 60 + * + * PC2 is a 56-to-48 bit selection function. Its input is in two words, + * C and D. These are treated as one 56-bit word (with C more significant, + * so that bits 55 to 28 of the word are bits 27 to 0 of C, and bits 27 to + * 0 of the word are bits 27 to 0 of D). The output contains the following + * bits of this 56-bit input word (listed in order MSB to LSB of output). + * + * 42 39 45 32 55 51 53 28 41 50 35 46 33 37 44 52 30 48 40 49 29 36 43 54 + * 15 4 25 19 9 1 26 16 5 11 23 8 12 7 17 0 22 3 10 14 6 20 27 24 + */ + +/* + * Implementation details + * ---------------------- + * + * If you look at the code in this module, you'll find it looks + * nothing _like_ the above algorithm. Here I explain the + * differences... + * + * Key setup has not been heavily optimised here. We are not + * concerned with key agility: we aren't codebreakers. We don't + * mind a little delay (and it really is a little one; it may be a + * factor of five or so slower than it could be but it's still not + * an appreciable length of time) while setting up. The only tweaks + * in the key setup are ones which change the format of the key + * schedule to speed up the actual encryption. I'll describe those + * below. + * + * The first and most obvious optimisation is the S-boxes. Since + * each S-box always targets the same four bits in the final 32-bit + * word, so the output from (for example) S-box 0 must always be + * shifted left 28 bits, we can store the already-shifted outputs + * in the lookup tables. This reduces lookup-and-shift to lookup, + * so the S-box step is now just a question of ORing together eight + * table lookups. + * + * The permutation P is just a bit order change; it's invariant + * with respect to OR, in that P(x)|P(y) = P(x|y). Therefore, we + * can apply P to every entry of the S-box tables and then we don't + * have to do it in the code of f(). This yields a set of tables + * which might be called SP-boxes. + * + * The bit-selection function E is our next target. Note that E is + * immediately followed by the operation of splitting into 6-bit + * chunks. Examining the 6-bit chunks coming out of E we notice + * they're all contiguous within the word (speaking cyclically - + * the end two wrap round); so we can extract those bit strings + * individually rather than explicitly running E. This would yield + * code such as + * + * y |= SPboxes[0][ (rotl(R, 5) ^ top6bitsofK) & 0x3F ]; + * t |= SPboxes[1][ (rotl(R,11) ^ next6bitsofK) & 0x3F ]; + * + * and so on; and the key schedule preparation would have to + * provide each 6-bit chunk separately. + * + * Really we'd like to XOR in the key schedule element before + * looking up bit strings in R. This we can't do, naively, because + * the 6-bit strings we want overlap. But look at the strings: + * + * 3322222222221111111111 + * bit 10987654321098765432109876543210 + * + * box0 XXXXX X + * box1 XXXXXX + * box2 XXXXXX + * box3 XXXXXX + * box4 XXXXXX + * box5 XXXXXX + * box6 XXXXXX + * box7 X XXXXX + * + * The bit strings we need to XOR in for boxes 0, 2, 4 and 6 don't + * overlap with each other. Neither do the ones for boxes 1, 3, 5 + * and 7. So we could provide the key schedule in the form of two + * words that we can separately XOR into R, and then every S-box + * index is available as a (cyclically) contiguous 6-bit substring + * of one or the other of the results. + * + * The comments in Eric Young's libdes implementation point out + * that two of these bit strings require a rotation (rather than a + * simple shift) to extract. It's unavoidable that at least _one_ + * must do; but we can actually run the whole inner algorithm (all + * 16 rounds) rotated one bit to the left, so that what the `real' + * DES description sees as L=0x80000001 we see as L=0x00000003. + * This requires rotating all our SP-box entries one bit to the + * left, and rotating each word of the key schedule elements one to + * the left, and rotating L and R one bit left just after IP and + * one bit right again just before FP. And in each round we convert + * a rotate into a shift, so we've saved a few per cent. + * + * That's about it for the inner loop; the SP-box tables as listed + * below are what I've described here (the original S value, + * shifted to its final place in the input to P, run through P, and + * then rotated one bit left). All that remains is to optimise the + * initial permutation IP. + * + * IP is not an arbitrary permutation. It has the nice property + * that if you take any bit number, write it in binary (6 bits), + * permute those 6 bits and invert some of them, you get the final + * position of that bit. Specifically, the bit whose initial + * position is given (in binary) as fedcba ends up in position + * AcbFED (where a capital letter denotes the inverse of a bit). + * + * We have the 64-bit data in two 32-bit words L and R, where bits + * in L are those with f=1 and bits in R are those with f=0. We + * note that we can do a simple transformation: suppose we exchange + * the bits with f=1,c=0 and the bits with f=0,c=1. This will cause + * the bit fedcba to be in position cedfba - we've `swapped' bits c + * and f in the position of each bit! + * + * Better still, this transformation is easy. In the example above, + * bits in L with c=0 are bits 0x0F0F0F0F, and those in R with c=1 + * are 0xF0F0F0F0. So we can do + * + * difference = ((R >> 4) ^ L) & 0x0F0F0F0F + * R ^= (difference << 4) + * L ^= difference + * + * to perform the swap. Let's denote this by bitswap(4,0x0F0F0F0F). + * Also, we can invert the bit at the top just by exchanging L and + * R. So in a few swaps and a few of these bit operations we can + * do: + * + * Initially the position of bit fedcba is fedcba + * Swap L with R to make it Fedcba + * Perform bitswap( 4,0x0F0F0F0F) to make it cedFba + * Perform bitswap(16,0x0000FFFF) to make it ecdFba + * Swap L with R to make it EcdFba + * Perform bitswap( 2,0x33333333) to make it bcdFEa + * Perform bitswap( 8,0x00FF00FF) to make it dcbFEa + * Swap L with R to make it DcbFEa + * Perform bitswap( 1,0x55555555) to make it acbFED + * Swap L with R to make it AcbFED + * + * (In the actual code the four swaps are implicit: R and L are + * simply used the other way round in the first, second and last + * bitswap operations.) + * + * The final permutation is just the inverse of IP, so it can be + * performed by a similar set of operations. + */ + +struct des_context { + quint32 k0246[16], k1357[16]; +}; + +#define rotl(x, c) ( (x << c) | (x >> (32-c)) ) +#define rotl28(x, c) ( ( (x << c) | (x >> (28-c)) ) & 0x0FFFFFFF) + +static quint32 bitsel(quint32 * input, const int *bitnums, int size) +{ + quint32 ret = 0; + while (size--) { + int bitpos = *bitnums++; + ret <<= 1; + if (bitpos >= 0) + ret |= 1 & (input[bitpos / 32] >> (bitpos % 32)); + } + return ret; +} + +static inline void des_key_setup(quint32 key_msw, quint32 key_lsw, + struct des_context *sched) +{ + /* Tables are modified to work with 56-bit key */ + static const int PC1_Cbits[] = { + 6, 13, 20, 27, 34, 41, 48, 55, 5, 12, 19, 26, 33, 40, + 47, 54, 4, 11, 18, 25, 32, 39, 46, 53, 3, 10, 17, 24 + }; + static const int PC1_Dbits[] = { + 0, 7, 14, 21, 28, 35, 42, 49, 1, 8, 15, 22, 29, 36, + 43, 50, 2, 9, 16, 23, 30, 37, 44, 51, 31, 38, 45, 52 + }; + /* + * The bit numbers in the two lists below don't correspond to + * the ones in the above description of PC2, because in the + * above description C and D are concatenated so `bit 28' means + * bit 0 of C. In this implementation we're using the standard + * `bitsel' function above and C is in the second word, so bit + * 0 of C is addressed by writing `32' here. + */ + static const int PC2_0246[] = { + 49, 36, 59, 55, -1, -1, 37, 41, 48, 56, 34, 52, -1, -1, 15, 4, + 25, 19, 9, 1, -1, -1, 12, 7, 17, 0, 22, 3, -1, -1, 46, 43 + }; + static const int PC2_1357[] = { + -1, -1, 57, 32, 45, 54, 39, 50, -1, -1, 44, 53, 33, 40, 47, 58, + -1, -1, 26, 16, 5, 11, 23, 8, -1, -1, 10, 14, 6, 20, 27, 24 + }; + static const int leftshifts[] = { + 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 + }; + + quint32 C, D; + quint32 buf[2]; + int i; + + buf[0] = key_lsw; + buf[1] = key_msw; + + C = bitsel(buf, PC1_Cbits, 28); + D = bitsel(buf, PC1_Dbits, 28); + + for (i = 0; i < 16; i++) { + C = rotl28(C, leftshifts[i]); + D = rotl28(D, leftshifts[i]); + buf[0] = D; + buf[1] = C; + sched->k0246[i] = bitsel(buf, PC2_0246, 32); + sched->k1357[i] = bitsel(buf, PC2_1357, 32); + } +} + +static const quint32 SPboxes[8][64] = { + {0x01010400, 0x00000000, 0x00010000, 0x01010404, + 0x01010004, 0x00010404, 0x00000004, 0x00010000, + 0x00000400, 0x01010400, 0x01010404, 0x00000400, + 0x01000404, 0x01010004, 0x01000000, 0x00000004, + 0x00000404, 0x01000400, 0x01000400, 0x00010400, + 0x00010400, 0x01010000, 0x01010000, 0x01000404, + 0x00010004, 0x01000004, 0x01000004, 0x00010004, + 0x00000000, 0x00000404, 0x00010404, 0x01000000, + 0x00010000, 0x01010404, 0x00000004, 0x01010000, + 0x01010400, 0x01000000, 0x01000000, 0x00000400, + 0x01010004, 0x00010000, 0x00010400, 0x01000004, + 0x00000400, 0x00000004, 0x01000404, 0x00010404, + 0x01010404, 0x00010004, 0x01010000, 0x01000404, + 0x01000004, 0x00000404, 0x00010404, 0x01010400, + 0x00000404, 0x01000400, 0x01000400, 0x00000000, + 0x00010004, 0x00010400, 0x00000000, 0x01010004}, + + {0x80108020, 0x80008000, 0x00008000, 0x00108020, + 0x00100000, 0x00000020, 0x80100020, 0x80008020, + 0x80000020, 0x80108020, 0x80108000, 0x80000000, + 0x80008000, 0x00100000, 0x00000020, 0x80100020, + 0x00108000, 0x00100020, 0x80008020, 0x00000000, + 0x80000000, 0x00008000, 0x00108020, 0x80100000, + 0x00100020, 0x80000020, 0x00000000, 0x00108000, + 0x00008020, 0x80108000, 0x80100000, 0x00008020, + 0x00000000, 0x00108020, 0x80100020, 0x00100000, + 0x80008020, 0x80100000, 0x80108000, 0x00008000, + 0x80100000, 0x80008000, 0x00000020, 0x80108020, + 0x00108020, 0x00000020, 0x00008000, 0x80000000, + 0x00008020, 0x80108000, 0x00100000, 0x80000020, + 0x00100020, 0x80008020, 0x80000020, 0x00100020, + 0x00108000, 0x00000000, 0x80008000, 0x00008020, + 0x80000000, 0x80100020, 0x80108020, 0x00108000}, + + {0x00000208, 0x08020200, 0x00000000, 0x08020008, + 0x08000200, 0x00000000, 0x00020208, 0x08000200, + 0x00020008, 0x08000008, 0x08000008, 0x00020000, + 0x08020208, 0x00020008, 0x08020000, 0x00000208, + 0x08000000, 0x00000008, 0x08020200, 0x00000200, + 0x00020200, 0x08020000, 0x08020008, 0x00020208, + 0x08000208, 0x00020200, 0x00020000, 0x08000208, + 0x00000008, 0x08020208, 0x00000200, 0x08000000, + 0x08020200, 0x08000000, 0x00020008, 0x00000208, + 0x00020000, 0x08020200, 0x08000200, 0x00000000, + 0x00000200, 0x00020008, 0x08020208, 0x08000200, + 0x08000008, 0x00000200, 0x00000000, 0x08020008, + 0x08000208, 0x00020000, 0x08000000, 0x08020208, + 0x00000008, 0x00020208, 0x00020200, 0x08000008, + 0x08020000, 0x08000208, 0x00000208, 0x08020000, + 0x00020208, 0x00000008, 0x08020008, 0x00020200}, + + {0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802080, 0x00800081, 0x00800001, 0x00002001, + 0x00000000, 0x00802000, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00800080, 0x00800001, + 0x00000001, 0x00002000, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002001, 0x00002080, + 0x00800081, 0x00000001, 0x00002080, 0x00800080, + 0x00002000, 0x00802080, 0x00802081, 0x00000081, + 0x00800080, 0x00800001, 0x00802000, 0x00802081, + 0x00000081, 0x00000000, 0x00000000, 0x00802000, + 0x00002080, 0x00800080, 0x00800081, 0x00000001, + 0x00802001, 0x00002081, 0x00002081, 0x00000080, + 0x00802081, 0x00000081, 0x00000001, 0x00002000, + 0x00800001, 0x00002001, 0x00802080, 0x00800081, + 0x00002001, 0x00002080, 0x00800000, 0x00802001, + 0x00000080, 0x00800000, 0x00002000, 0x00802080}, + + {0x00000100, 0x02080100, 0x02080000, 0x42000100, + 0x00080000, 0x00000100, 0x40000000, 0x02080000, + 0x40080100, 0x00080000, 0x02000100, 0x40080100, + 0x42000100, 0x42080000, 0x00080100, 0x40000000, + 0x02000000, 0x40080000, 0x40080000, 0x00000000, + 0x40000100, 0x42080100, 0x42080100, 0x02000100, + 0x42080000, 0x40000100, 0x00000000, 0x42000000, + 0x02080100, 0x02000000, 0x42000000, 0x00080100, + 0x00080000, 0x42000100, 0x00000100, 0x02000000, + 0x40000000, 0x02080000, 0x42000100, 0x40080100, + 0x02000100, 0x40000000, 0x42080000, 0x02080100, + 0x40080100, 0x00000100, 0x02000000, 0x42080000, + 0x42080100, 0x00080100, 0x42000000, 0x42080100, + 0x02080000, 0x00000000, 0x40080000, 0x42000000, + 0x00080100, 0x02000100, 0x40000100, 0x00080000, + 0x00000000, 0x40080000, 0x02080100, 0x40000100}, + + {0x20000010, 0x20400000, 0x00004000, 0x20404010, + 0x20400000, 0x00000010, 0x20404010, 0x00400000, + 0x20004000, 0x00404010, 0x00400000, 0x20000010, + 0x00400010, 0x20004000, 0x20000000, 0x00004010, + 0x00000000, 0x00400010, 0x20004010, 0x00004000, + 0x00404000, 0x20004010, 0x00000010, 0x20400010, + 0x20400010, 0x00000000, 0x00404010, 0x20404000, + 0x00004010, 0x00404000, 0x20404000, 0x20000000, + 0x20004000, 0x00000010, 0x20400010, 0x00404000, + 0x20404010, 0x00400000, 0x00004010, 0x20000010, + 0x00400000, 0x20004000, 0x20000000, 0x00004010, + 0x20000010, 0x20404010, 0x00404000, 0x20400000, + 0x00404010, 0x20404000, 0x00000000, 0x20400010, + 0x00000010, 0x00004000, 0x20400000, 0x00404010, + 0x00004000, 0x00400010, 0x20004010, 0x00000000, + 0x20404000, 0x20000000, 0x00400010, 0x20004010}, + + {0x00200000, 0x04200002, 0x04000802, 0x00000000, + 0x00000800, 0x04000802, 0x00200802, 0x04200800, + 0x04200802, 0x00200000, 0x00000000, 0x04000002, + 0x00000002, 0x04000000, 0x04200002, 0x00000802, + 0x04000800, 0x00200802, 0x00200002, 0x04000800, + 0x04000002, 0x04200000, 0x04200800, 0x00200002, + 0x04200000, 0x00000800, 0x00000802, 0x04200802, + 0x00200800, 0x00000002, 0x04000000, 0x00200800, + 0x04000000, 0x00200800, 0x00200000, 0x04000802, + 0x04000802, 0x04200002, 0x04200002, 0x00000002, + 0x00200002, 0x04000000, 0x04000800, 0x00200000, + 0x04200800, 0x00000802, 0x00200802, 0x04200800, + 0x00000802, 0x04000002, 0x04200802, 0x04200000, + 0x00200800, 0x00000000, 0x00000002, 0x04200802, + 0x00000000, 0x00200802, 0x04200000, 0x00000800, + 0x04000002, 0x04000800, 0x00000800, 0x00200002}, + + {0x10001040, 0x00001000, 0x00040000, 0x10041040, + 0x10000000, 0x10001040, 0x00000040, 0x10000000, + 0x00040040, 0x10040000, 0x10041040, 0x00041000, + 0x10041000, 0x00041040, 0x00001000, 0x00000040, + 0x10040000, 0x10000040, 0x10001000, 0x00001040, + 0x00041000, 0x00040040, 0x10040040, 0x10041000, + 0x00001040, 0x00000000, 0x00000000, 0x10040040, + 0x10000040, 0x10001000, 0x00041040, 0x00040000, + 0x00041040, 0x00040000, 0x10041000, 0x00001000, + 0x00000040, 0x10040040, 0x00001000, 0x00041040, + 0x10001000, 0x00000040, 0x10000040, 0x10040000, + 0x10040040, 0x10000000, 0x00040000, 0x10001040, + 0x00000000, 0x10041040, 0x00040040, 0x10000040, + 0x10040000, 0x10001000, 0x10001040, 0x00000000, + 0x10041040, 0x00041000, 0x00041000, 0x00001040, + 0x00001040, 0x00040040, 0x10000000, 0x10041000} +}; + +#define f(R, K0246, K1357) (\ + s0246 = R ^ K0246, \ + s1357 = R ^ K1357, \ + s0246 = rotl(s0246, 28), \ + SPboxes[0] [(s0246 >> 24) & 0x3F] | \ + SPboxes[1] [(s1357 >> 24) & 0x3F] | \ + SPboxes[2] [(s0246 >> 16) & 0x3F] | \ + SPboxes[3] [(s1357 >> 16) & 0x3F] | \ + SPboxes[4] [(s0246 >> 8) & 0x3F] | \ + SPboxes[5] [(s1357 >> 8) & 0x3F] | \ + SPboxes[6] [(s0246 ) & 0x3F] | \ + SPboxes[7] [(s1357 ) & 0x3F]) + +#define bitswap(L, R, n, mask) (\ + swap = mask & ( (R >> n) ^ L ), \ + R ^= swap << n, \ + L ^= swap) + +/* Initial permutation */ +#define IP(L, R) (\ + bitswap(R, L, 4, 0x0F0F0F0F), \ + bitswap(R, L, 16, 0x0000FFFF), \ + bitswap(L, R, 2, 0x33333333), \ + bitswap(L, R, 8, 0x00FF00FF), \ + bitswap(R, L, 1, 0x55555555)) + +/* Final permutation */ +#define FP(L, R) (\ + bitswap(R, L, 1, 0x55555555), \ + bitswap(L, R, 8, 0x00FF00FF), \ + bitswap(L, R, 2, 0x33333333), \ + bitswap(R, L, 16, 0x0000FFFF), \ + bitswap(R, L, 4, 0x0F0F0F0F)) + +static void +des_encipher(quint32 *output, quint32 L, quint32 R, + struct des_context *sched) +{ + quint32 swap, s0246, s1357; + + IP(L, R); + + L = rotl(L, 1); + R = rotl(R, 1); + + L ^= f(R, sched->k0246[0], sched->k1357[0]); + R ^= f(L, sched->k0246[1], sched->k1357[1]); + L ^= f(R, sched->k0246[2], sched->k1357[2]); + R ^= f(L, sched->k0246[3], sched->k1357[3]); + L ^= f(R, sched->k0246[4], sched->k1357[4]); + R ^= f(L, sched->k0246[5], sched->k1357[5]); + L ^= f(R, sched->k0246[6], sched->k1357[6]); + R ^= f(L, sched->k0246[7], sched->k1357[7]); + L ^= f(R, sched->k0246[8], sched->k1357[8]); + R ^= f(L, sched->k0246[9], sched->k1357[9]); + L ^= f(R, sched->k0246[10], sched->k1357[10]); + R ^= f(L, sched->k0246[11], sched->k1357[11]); + L ^= f(R, sched->k0246[12], sched->k1357[12]); + R ^= f(L, sched->k0246[13], sched->k1357[13]); + L ^= f(R, sched->k0246[14], sched->k1357[14]); + R ^= f(L, sched->k0246[15], sched->k1357[15]); + + L = rotl(L, 31); + R = rotl(R, 31); + + swap = L; + L = R; + R = swap; + + FP(L, R); + + output[0] = L; + output[1] = R; +} + +#define GET_32BIT_MSB_FIRST(cp) \ + (((unsigned long)(unsigned char)(cp)[3]) | \ + ((unsigned long)(unsigned char)(cp)[2] << 8) | \ + ((unsigned long)(unsigned char)(cp)[1] << 16) | \ + ((unsigned long)(unsigned char)(cp)[0] << 24)) + +#define PUT_32BIT_MSB_FIRST(cp, value) do { \ + (cp)[3] = (value); \ + (cp)[2] = (value) >> 8; \ + (cp)[1] = (value) >> 16; \ + (cp)[0] = (value) >> 24; } while (0) + +static inline void +des_cbc_encrypt(unsigned char *dest, const unsigned char *src, + struct des_context *sched) +{ + quint32 out[2], L, R; + + L = GET_32BIT_MSB_FIRST(src); + R = GET_32BIT_MSB_FIRST(src + 4); + des_encipher(out, L, R, sched); + PUT_32BIT_MSB_FIRST(dest, out[0]); + PUT_32BIT_MSB_FIRST(dest + 4, out[1]); +} + + +static unsigned char * +deshash(unsigned char *dst, const unsigned char *key, + const unsigned char *src) +{ + struct des_context ctx; + + des_key_setup(GET_32BIT_MSB_FIRST(key) >> 8, + GET_32BIT_MSB_FIRST(key + 3), &ctx); + + des_cbc_encrypt(dst, src, &ctx); + + return dst; +} diff --git a/src/3rdparty/easing/easing.cpp b/src/3rdparty/easing/easing.cpp new file mode 100644 index 0000000000..7d70a4d24b --- /dev/null +++ b/src/3rdparty/easing/easing.cpp @@ -0,0 +1,670 @@ +/* +Disclaimer for Robert Penner's Easing Equations license: + +TERMS OF USE - EASING EQUATIONS + +Open source under the BSD License. + +Copyright © 2001 Robert Penner +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#ifndef M_PI_2 +#define M_PI_2 (M_PI / 2) +#endif + +QT_USE_NAMESPACE + +/** + * Easing equation function for a simple linear tweening, with no easing. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeNone(qreal progress) +{ + return progress; +} + +/** + * Easing equation function for a quadratic (t^2) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInQuad(qreal t) +{ + return t*t; +} + +/** +* Easing equation function for a quadratic (t^2) easing out: decelerating to zero velocity. +* +* @param t Current time (in frames or seconds). +* @return The correct value. +*/ +static qreal easeOutQuad(qreal t) +{ + return -t*(t-2); +} + +/** + * Easing equation function for a quadratic (t^2) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInOutQuad(qreal t) +{ + t*=2.0; + if (t < 1) { + return t*t/qreal(2); + } else { + --t; + return -0.5 * (t*(t-2) - 1); + } +} + +/** + * Easing equation function for a quadratic (t^2) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutInQuad(qreal t) +{ + if (t < 0.5) return easeOutQuad (t*2)/2; + return easeInQuad((2*t)-1)/2 + 0.5; +} + +/** + * Easing equation function for a cubic (t^3) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInCubic(qreal t) +{ + return t*t*t; +} + +/** + * Easing equation function for a cubic (t^3) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutCubic(qreal t) +{ + t-=1.0; + return t*t*t + 1; +} + +/** + * Easing equation function for a cubic (t^3) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInOutCubic(qreal t) +{ + t*=2.0; + if(t < 1) { + return 0.5*t*t*t; + } else { + t -= qreal(2.0); + return 0.5*(t*t*t + 2); + } +} + +/** + * Easing equation function for a cubic (t^3) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutInCubic(qreal t) +{ + if (t < 0.5) return easeOutCubic (2*t)/2; + return easeInCubic(2*t - 1)/2 + 0.5; +} + +/** + * Easing equation function for a quartic (t^4) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInQuart(qreal t) +{ + return t*t*t*t; +} + +/** + * Easing equation function for a quartic (t^4) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutQuart(qreal t) +{ + t-= qreal(1.0); + return - (t*t*t*t- 1); +} + +/** + * Easing equation function for a quartic (t^4) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInOutQuart(qreal t) +{ + t*=2; + if (t < 1) return 0.5*t*t*t*t; + else { + t -= 2.0f; + return -0.5 * (t*t*t*t- 2); + } +} + +/** + * Easing equation function for a quartic (t^4) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutInQuart(qreal t) +{ + if (t < 0.5) return easeOutQuart (2*t)/2; + return easeInQuart(2*t-1)/2 + 0.5; +} + +/** + * Easing equation function for a quintic (t^5) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInQuint(qreal t) +{ + return t*t*t*t*t; +} + +/** + * Easing equation function for a quintic (t^5) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutQuint(qreal t) +{ + t-=1.0; + return t*t*t*t*t + 1; +} + +/** + * Easing equation function for a quintic (t^5) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInOutQuint(qreal t) +{ + t*=2.0; + if (t < 1) return 0.5*t*t*t*t*t; + else { + t -= 2.0; + return 0.5*(t*t*t*t*t + 2); + } +} + +/** + * Easing equation function for a quintic (t^5) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutInQuint(qreal t) +{ + if (t < 0.5) return easeOutQuint (2*t)/2; + return easeInQuint(2*t - 1)/2 + 0.5; +} + +/** + * Easing equation function for a sinusoidal (sin(t)) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInSine(qreal t) +{ + return (t == 1.0) ? 1.0 : -::qCos(t * M_PI_2) + 1.0; +} + +/** + * Easing equation function for a sinusoidal (sin(t)) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutSine(qreal t) +{ + return ::qSin(t* M_PI_2); +} + +/** + * Easing equation function for a sinusoidal (sin(t)) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInOutSine(qreal t) +{ + return -0.5 * (::qCos(M_PI*t) - 1); +} + +/** + * Easing equation function for a sinusoidal (sin(t)) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutInSine(qreal t) +{ + if (t < 0.5) return easeOutSine (2*t)/2; + return easeInSine(2*t - 1)/2 + 0.5; +} + +/** + * Easing equation function for an exponential (2^t) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInExpo(qreal t) +{ + return (t==0 || t == 1.0) ? t : ::qPow(2.0, 10 * (t - 1)) - qreal(0.001); +} + +/** + * Easing equation function for an exponential (2^t) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutExpo(qreal t) +{ + return (t==1.0) ? 1.0 : 1.001 * (-::qPow(2.0f, -10 * t) + 1); +} + +/** + * Easing equation function for an exponential (2^t) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInOutExpo(qreal t) +{ + if (t==0.0) return qreal(0.0); + if (t==1.0) return qreal(1.0); + t*=2.0; + if (t < 1) return 0.5 * ::qPow(qreal(2.0), 10 * (t - 1)) - 0.0005; + return 0.5 * 1.0005 * (-::qPow(qreal(2.0), -10 * (t - 1)) + 2); +} + +/** + * Easing equation function for an exponential (2^t) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutInExpo(qreal t) +{ + if (t < 0.5) return easeOutExpo (2*t)/2; + return easeInExpo(2*t - 1)/2 + 0.5; +} + +/** + * Easing equation function for a circular (sqrt(1-t^2)) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInCirc(qreal t) +{ + return -(::sqrt(1 - t*t) - 1); +} + +/** + * Easing equation function for a circular (sqrt(1-t^2)) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutCirc(qreal t) +{ + t-= qreal(1.0); + return ::sqrt(1 - t* t); +} + +/** + * Easing equation function for a circular (sqrt(1-t^2)) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeInOutCirc(qreal t) +{ + t*=qreal(2.0); + if (t < 1) { + return -0.5 * (::sqrt(1 - t*t) - 1); + } else { + t -= qreal(2.0); + return 0.5 * (::sqrt(1 - t*t) + 1); + } +} + +/** + * Easing equation function for a circular (sqrt(1-t^2)) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @return The correct value. + */ +static qreal easeOutInCirc(qreal t) +{ + if (t < 0.5) return easeOutCirc (2*t)/2; + return easeInCirc(2*t - 1)/2 + 0.5; +} + +static qreal easeInElastic_helper(qreal t, qreal b, qreal c, qreal d, qreal a, qreal p) +{ + if (t==0) return b; + qreal t_adj = (qreal)t / (qreal)d; + if (t_adj==1) return b+c; + + qreal s; + if(a < ::qFabs(c)) { + a = c; + s = p / 4.0f; + } else { + s = p / (2 * M_PI) * ::qAsin(c / a); + } + + t_adj -= 1.0f; + return -(a*::qPow(2.0f,10*t_adj) * ::qSin( (t_adj*d-s)*(2*M_PI)/p )) + b; +} + +/** + * Easing equation function for an elastic (exponentially decaying sine wave) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @param a Amplitude. + * @param p Period. + * @return The correct value. + */ +static qreal easeInElastic(qreal t, qreal a, qreal p) +{ + return easeInElastic_helper(t, 0, 1, 1, a, p); +} + +static qreal easeOutElastic_helper(qreal t, qreal /*b*/, qreal c, qreal /*d*/, qreal a, qreal p) +{ + if (t==0) return 0; + if (t==1) return c; + + qreal s; + if(a < c) { + a = c; + s = p / 4.0f; + } else { + s = p / (2 * M_PI) * ::qAsin(c / a); + } + + return (a*::qPow(2.0f,-10*t) * ::qSin( (t-s)*(2*M_PI)/p ) + c); +} + +/** + * Easing equation function for an elastic (exponentially decaying sine wave) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @param a Amplitude. + * @param p Period. + * @return The correct value. + */ +static qreal easeOutElastic(qreal t, qreal a, qreal p) +{ + return easeOutElastic_helper(t, 0, 1, 1, a, p); +} + +/** + * Easing equation function for an elastic (exponentially decaying sine wave) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @param a Amplitude. + * @param p Period. + * @return The correct value. + */ +static qreal easeInOutElastic(qreal t, qreal a, qreal p) +{ + if (t==0) return 0.0; + t*=2.0; + if (t==2) return 1.0; + + qreal s; + if(a < 1.0) { + a = 1.0; + s = p / 4.0f; + } else { + s = p / (2 * M_PI) * ::qAsin(1.0 / a); + } + + if (t < 1) return -.5*(a*::qPow(2.0f,10*(t-1)) * ::qSin( (t-1-s)*(2*M_PI)/p )); + return a*::qPow(2.0f,-10*(t-1)) * ::qSin( (t-1-s)*(2*M_PI)/p )*.5 + 1.0; +} + +/** + * Easing equation function for an elastic (exponentially decaying sine wave) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @param a Amplitude. + * @param p Period. + * @return The correct value. + */ +static qreal easeOutInElastic(qreal t, qreal a, qreal p) +{ + if (t < 0.5) return easeOutElastic_helper(t*2, 0, 0.5, 1.0, a, p); + return easeInElastic_helper(2*t - 1.0, 0.5, 0.5, 1.0, a, p); +} + +/** + * Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @param s Overshoot ammount: higher s means greater overshoot (0 produces cubic easing with no overshoot, and the default value of 1.70158 produces an overshoot of 10 percent). + * @return The correct value. + */ +static qreal easeInBack(qreal t, qreal s) +{ + return t*t*((s+1)*t - s); +} + +/** + * Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @param s Overshoot ammount: higher s means greater overshoot (0 produces cubic easing with no overshoot, and the default value of 1.70158 produces an overshoot of 10 percent). + * @return The correct value. + */ +static qreal easeOutBack(qreal t, qreal s) +{ + t-= qreal(1.0); + return t*t*((s+1)*t+ s) + 1; +} + +/** + * Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @param s Overshoot ammount: higher s means greater overshoot (0 produces cubic easing with no overshoot, and the default value of 1.70158 produces an overshoot of 10 percent). + * @return The correct value. + */ +static qreal easeInOutBack(qreal t, qreal s) +{ + t *= 2.0; + if (t < 1) { + s *= 1.525f; + return 0.5*(t*t*((s+1)*t - s)); + } else { + t -= 2; + s *= 1.525f; + return 0.5*(t*t*((s+1)*t+ s) + 2); + } +} + +/** + * Easing equation function for a back (overshooting cubic easing: (s+1)*t^3 - s*t^2) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @param s Overshoot ammount: higher s means greater overshoot (0 produces cubic easing with no overshoot, and the default value of 1.70158 produces an overshoot of 10 percent). + * @return The correct value. + */ +static qreal easeOutInBack(qreal t, qreal s) +{ + if (t < 0.5) return easeOutBack (2*t, s)/2; + return easeInBack(2*t - 1, s)/2 + 0.5; +} + +static qreal easeOutBounce_helper(qreal t, qreal c, qreal a) +{ + if (t == 1.0) return c; + if (t < (4/11.0)) { + return c*(7.5625*t*t); + } else if (t < (8/11.0)) { + t -= (6/11.0); + return -a * (1. - (7.5625*t*t + .75)) + c; + } else if (t < (10/11.0)) { + t -= (9/11.0); + return -a * (1. - (7.5625*t*t + .9375)) + c; + } else { + t -= (21/22.0); + return -a * (1. - (7.5625*t*t + .984375)) + c; + } +} + +/** + * Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out: decelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @param a Amplitude. + * @return The correct value. + */ +static qreal easeOutBounce(qreal t, qreal a) +{ + return easeOutBounce_helper(t, 1, a); +} + +/** + * Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in: accelerating from zero velocity. + * + * @param t Current time (in frames or seconds). + * @param a Amplitude. + * @return The correct value. + */ +static qreal easeInBounce(qreal t, qreal a) +{ + return 1.0 - easeOutBounce_helper(1.0-t, 1.0, a); +} + + +/** + * Easing equation function for a bounce (exponentially decaying parabolic bounce) easing in/out: acceleration until halfway, then deceleration. + * + * @param t Current time (in frames or seconds). + * @param a Amplitude. + * @return The correct value. + */ +static qreal easeInOutBounce(qreal t, qreal a) +{ + if (t < 0.5) return easeInBounce (2*t, a)/2; + else return (t == 1.0) ? 1.0 : easeOutBounce (2*t - 1, a)/2 + 0.5; +} + +/** + * Easing equation function for a bounce (exponentially decaying parabolic bounce) easing out/in: deceleration until halfway, then acceleration. + * + * @param t Current time (in frames or seconds). + * @param a Amplitude. + * @return The correct value. + */ +static qreal easeOutInBounce(qreal t, qreal a) +{ + if (t < 0.5) return easeOutBounce_helper(t*2, 0.5, a); + return 1.0 - easeOutBounce_helper (2.0-2*t, 0.5, a); +} + +static inline qreal qt_sinProgress(qreal value) +{ + return qSin((value * M_PI) - M_PI_2) / 2 + qreal(0.5); +} + +static inline qreal qt_smoothBeginEndMixFactor(qreal value) +{ + return qMin(qMax(1 - value * 2 + qreal(0.3), qreal(0.0)), qreal(1.0)); +} + +// SmoothBegin blends Smooth and Linear Interpolation. +// Progress 0 - 0.3 : Smooth only +// Progress 0.3 - ~ 0.5 : Mix of Smooth and Linear +// Progress ~ 0.5 - 1 : Linear only + +/** + * Easing function that starts growing slowly, then increases in speed. At the end of the curve the speed will be constant. + */ +static qreal easeInCurve(qreal t) +{ + const qreal sinProgress = qt_sinProgress(t); + const qreal mix = qt_smoothBeginEndMixFactor(t); + return sinProgress * mix + t * (1 - mix); +} + +/** + * Easing function that starts growing steadily, then ends slowly. The speed will be constant at the beginning of the curve. + */ +static qreal easeOutCurve(qreal t) +{ + const qreal sinProgress = qt_sinProgress(t); + const qreal mix = qt_smoothBeginEndMixFactor(1 - t); + return sinProgress * mix + t * (1 - mix); +} + +/** + * Easing function where the value grows sinusoidally. Note that the calculated end value will be 0 rather than 1. + */ +static qreal easeSineCurve(qreal t) +{ + return (qSin(((t * M_PI * 2)) - M_PI_2) + 1) / 2; +} + +/** + * Easing function where the value grows cosinusoidally. Note that the calculated start value will be 0.5 and the end value will be 0.5 + * contrary to the usual 0 to 1 easing curve. + */ +static qreal easeCosineCurve(qreal t) +{ + return (qCos(((t * M_PI * 2)) - M_PI_2) + 1) / 2; +} + diff --git a/src/3rdparty/easing/legal.qdoc b/src/3rdparty/easing/legal.qdoc new file mode 100644 index 0000000000..466ff1561b --- /dev/null +++ b/src/3rdparty/easing/legal.qdoc @@ -0,0 +1,35 @@ +/*! +\page legal-easing.html +\title Easing Equations by Robert Penner +\ingroup licensing + +\legalese +\code +Copyright (c) 2001 Robert Penner +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\endcode +\endlegalese +*/ diff --git a/src/3rdparty/fonts/5x7.bdf b/src/3rdparty/fonts/5x7.bdf new file mode 100644 index 0000000000..0d4f56adde --- /dev/null +++ b/src/3rdparty/fonts/5x7.bdf @@ -0,0 +1,24999 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT In this version of the font file, all characters >= U+3200 are +COMMENT not encoded to keep XFontStruct small. +COMMENT Derived from 5x7.bdf,v 1.30 1999-11-20 17:59:07+00 mgk25 Rel mgk25 +COMMENT Send bug reports to Markus Kuhn +FONT -Misc-Fixed-Medium-R-Normal--7-70-75-75-C-50-ISO10646-1 +SIZE 7 75 75 +FONTBOUNDINGBOX 5 7 0 -1 +STARTPROPERTIES 24 +FONTNAME_REGISTRY "" +FOUNDRY "Misc" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 7 +POINT_SIZE 70 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 50 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 6 +FONT_DESCENT 1 +UNDERLINE_POSITION 0 +DESTINATION 1 +DEFAULT_CHAR 0 +COPYRIGHT "Public domain font. Share and enjoy." +_XMBDFED_INFO "Edited with xmbdfed 4.3." +CAP_HEIGHT 6 +X_HEIGHT 4 +ENDPROPERTIES +CHARS 1786 +STARTCHAR char0 +ENCODING 0 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +A8 +00 +88 +00 +A8 +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +00 +20 +00 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +50 +F8 +50 +F8 +50 +00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +A0 +70 +28 +70 +00 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +90 +20 +40 +90 +10 +00 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +A0 +40 +A0 +50 +00 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +20 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +50 +20 +70 +20 +50 +00 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +60 +60 +00 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +20 +40 +80 +00 +00 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +60 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +10 +20 +40 +F0 +00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +60 +10 +90 +60 +00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +60 +A0 +F0 +20 +20 +00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +10 +90 +60 +00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +80 +E0 +90 +90 +60 +00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +20 +20 +40 +40 +00 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +70 +10 +60 +00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +60 +00 +60 +60 +00 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +60 +00 +60 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +20 +40 +20 +10 +00 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +00 +F0 +00 +00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +20 +10 +20 +40 +00 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +10 +20 +00 +20 +00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +B0 +B0 +80 +60 +00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +B0 +90 +70 +00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +10 +10 +10 +90 +60 +00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +00 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +80 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +F0 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +D0 +D0 +B0 +B0 +90 +00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +80 +80 +00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +D0 +60 +10 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +A0 +90 +00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +20 +90 +60 +00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +60 +60 +00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +F0 +F0 +90 +00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +60 +60 +90 +90 +00 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +20 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +40 +40 +40 +40 +70 +00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +40 +20 +10 +00 +00 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +F0 +00 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +80 +80 +60 +00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +10 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +40 +E0 +40 +40 +00 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +60 +80 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +A0 +C0 +A0 +90 +00 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A0 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +90 +70 +10 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +80 +80 +00 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +C0 +30 +E0 +00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +E0 +40 +40 +30 +00 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +60 +60 +90 +00 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +50 +20 +40 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +20 +40 +F0 +00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +60 +20 +20 +10 +00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +30 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +A0 +A0 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +30 +40 +E0 +40 +B0 +00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +88 +70 +50 +70 +88 +00 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +20 +70 +20 +20 +00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +20 +00 +20 +20 +00 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +40 +60 +50 +30 +10 +60 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +A8 +C8 +A8 +88 +70 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +A0 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +48 +90 +48 +00 +00 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F0 +10 +00 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +E8 +C8 +C8 +88 +70 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +20 +20 +F8 +00 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +40 +60 +00 +00 +00 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +60 +20 +60 +00 +00 +00 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +D0 +D0 +50 +50 +50 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +60 +00 +00 +00 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +20 +40 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +60 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +A0 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +48 +90 +00 +00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +80 +90 +30 +70 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +80 +B0 +10 +20 +30 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +C0 +40 +D0 +30 +70 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +20 +40 +50 +20 +00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +60 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +A0 +B0 +E0 +A0 +B0 +00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +80 +90 +60 +40 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +D0 +50 +50 +E0 +00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +B0 +90 +D0 +B0 +B0 +90 +00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +60 +60 +90 +00 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +B0 +B0 +D0 +D0 +E0 +00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +00 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +E0 +90 +E0 +80 +80 +00 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +A0 +90 +90 +A0 +00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +60 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +B0 +A0 +70 +00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +30 +40 +40 +30 +20 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +A0 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +30 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +00 +F0 +00 +60 +00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +B0 +D0 +E0 +00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +90 +90 +50 +20 +40 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +90 +90 +50 +20 +40 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +10 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +B0 +50 +08 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +30 +40 +40 +30 +00 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +00 +60 +80 +80 +60 +00 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +60 +80 +80 +60 +00 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +40 +60 +80 +80 +60 +00 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +50 +10 +70 +90 +70 +00 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +D0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +38 +10 +70 +90 +70 +00 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +40 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +B0 +C0 +60 +40 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +40 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +B0 +90 +70 +00 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +00 +70 +90 +60 +80 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +B0 +90 +70 +00 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +70 +90 +60 +80 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +B0 +90 +70 +00 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +70 +90 +60 +80 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +B0 +90 +70 +40 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +70 +90 +60 +80 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +A0 +80 +E0 +90 +90 +00 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +F8 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +C0 +80 +E0 +90 +90 +00 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +40 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +60 +20 +20 +70 +40 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +D0 +A0 +00 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +00 +90 +90 +90 +D0 +20 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +10 +10 +10 +90 +60 +00 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +80 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +A0 +C0 +A0 +90 +80 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +E0 +90 +90 +00 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +A0 +80 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C8 +50 +40 +40 +40 +E0 +00 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +20 +20 +20 +70 +40 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +90 +80 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +90 +80 +80 +80 +40 +00 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +A0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +40 +50 +40 +40 +E0 +00 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +C0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +30 +60 +20 +70 +00 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +D0 +D0 +B0 +B0 +90 +00 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +D0 +D0 +B0 +B0 +90 +80 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +90 +80 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +D0 +D0 +B0 +B0 +90 +00 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +40 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +00 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +D0 +D0 +B0 +B0 +90 +20 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +90 +20 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +48 +90 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +A0 +B0 +A0 +A0 +70 +00 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +B0 +A0 +70 +00 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +A0 +90 +00 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +E0 +90 +80 +80 +00 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +A0 +90 +80 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +80 +80 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +A0 +90 +00 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +40 +E0 +90 +80 +80 +00 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +20 +90 +60 +00 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +70 +C0 +30 +E0 +00 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +20 +90 +60 +00 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +00 +70 +C0 +30 +E0 +00 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +20 +90 +60 +40 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +C0 +30 +E0 +40 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +20 +90 +60 +00 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +70 +C0 +30 +E0 +00 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +E0 +40 +40 +30 +40 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +40 +40 +40 +40 +00 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +40 +E0 +40 +30 +00 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +E0 +40 +40 +40 +00 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +E0 +40 +E0 +40 +30 +00 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +00 +90 +90 +70 +00 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +60 +00 +90 +90 +70 +00 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +48 +90 +00 +90 +90 +70 +00 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +40 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +70 +20 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +F0 +F0 +90 +00 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +00 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +A0 +A0 +40 +40 +40 +00 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +00 +90 +50 +20 +40 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +A0 +A0 +40 +40 +40 +00 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +20 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +F0 +20 +40 +F0 +00 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +20 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +F0 +20 +40 +F0 +00 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +20 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +F0 +20 +40 +F0 +00 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +60 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +E0 +40 +60 +50 +60 +00 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +60 +50 +50 +60 +00 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +80 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +60 +50 +50 +60 +00 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +C0 +F0 +48 +48 +70 +00 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +C0 +60 +50 +50 +60 +00 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +10 +10 +90 +60 +00 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +68 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +60 +80 +80 +60 +00 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +D0 +50 +50 +E0 +00 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +50 +50 +50 +60 +00 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +10 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +10 +30 +50 +50 +30 +00 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +60 +10 +60 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +70 +10 +10 +F0 +00 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +10 +F0 +90 +60 +00 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +80 +90 +60 +00 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +40 +60 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +40 +E0 +40 +40 +80 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +90 +80 +B0 +90 +70 +00 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +90 +90 +60 +90 +60 +00 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +C8 +A8 +A8 +90 +00 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +20 +20 +20 +10 +00 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +70 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +80 +C0 +A0 +90 +00 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +80 +A0 +C0 +A0 +90 +00 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +70 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +30 +60 +20 +50 +50 +00 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +F0 +50 +00 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +48 +68 +68 +58 +58 +48 +80 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +F0 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +68 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +08 +70 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +A8 +A8 +40 +00 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +A8 +A8 +48 +00 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +50 +60 +40 +40 +00 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +80 +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +E0 +90 +E0 +C0 +A0 +10 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +20 +40 +90 +60 +00 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +30 +C0 +70 +00 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +40 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +A0 +70 +20 +20 +20 +10 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +E0 +40 +70 +10 +20 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +A0 +A0 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +40 +E0 +40 +40 +30 +00 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +98 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +08 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +88 +88 +88 +88 +70 +00 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +50 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +A0 +A0 +40 +80 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +F0 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +70 +40 +F0 +00 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +20 +60 +10 +10 +E0 +00 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +40 +60 +80 +80 +70 +00 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +40 +60 +80 +70 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +20 +60 +30 +F8 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +10 +F0 +40 +F0 +00 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +90 +10 +E0 +00 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +60 +10 +60 +00 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +20 +10 +60 +00 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +50 +50 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +20 +70 +20 +00 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +20 +20 +00 +20 +00 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +18 +D8 +A8 +A8 +B0 +D8 +00 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D8 +A0 +B8 +A8 +B0 +D8 +00 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +38 +20 +78 +A8 +B0 +78 +00 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +88 +88 +88 +88 +A8 +D0 +00 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +88 +80 +88 +88 +88 +E8 +10 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C8 +40 +48 +48 +48 +E8 +10 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C8 +A8 +A8 +A8 +A8 +B0 +00 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C8 +A0 +A8 +A8 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +08 +00 +C8 +A8 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +40 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +50 +00 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +70 +00 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +70 +00 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +70 +00 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +30 +D0 +60 +00 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +50 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +70 +A0 +F0 +A0 +B0 +00 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +70 +B0 +A0 +70 +00 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +B0 +B8 +70 +00 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +60 +B8 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +B0 +90 +70 +00 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +70 +90 +60 +80 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +00 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +80 +A0 +C0 +A0 +00 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +40 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +90 +60 +40 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +40 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +60 +90 +90 +60 +40 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +20 +60 +10 +10 +E0 +00 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +F0 +20 +60 +10 +E0 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D8 +A8 +A8 +B0 +B0 +D8 +00 +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +A0 +B8 +A8 +B0 +D8 +00 +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +78 +00 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +B0 +90 +70 +00 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +70 +90 +60 +80 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +A0 +E8 +A8 +A8 +90 +00 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +A0 +C0 +80 +80 +00 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +D0 +D0 +B0 +B0 +90 +00 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +60 +60 +90 +70 +00 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +A0 +B0 +E0 +A0 +B0 +00 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +70 +B0 +A0 +70 +00 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +B0 +B0 +D0 +D0 +E0 +00 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +70 +B0 +D0 +E0 +00 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +50 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +50 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +50 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +50 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +A0 +90 +00 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +50 +E0 +90 +80 +80 +00 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +A0 +90 +00 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +E0 +90 +80 +80 +00 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +50 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +70 +00 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +20 +90 +60 +C0 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +C0 +30 +E0 +C0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +E0 +40 +40 +30 +40 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +10 +20 +10 +E0 +00 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +B0 +50 +20 +C0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +80 +E0 +90 +90 +00 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A0 +D0 +90 +E0 +00 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +80 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +10 +10 +60 +00 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +80 +B0 +60 +80 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +10 +70 +90 +90 +70 +18 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +18 +10 +70 +90 +90 +70 +00 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +D0 +30 +60 +00 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +30 +D0 +60 +00 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +38 +D0 +60 +00 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +30 +20 +40 +30 +00 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +20 +10 +60 +00 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +40 +20 +C0 +00 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +A0 +90 +60 +00 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +20 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +08 +70 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +80 +90 +70 +00 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +20 +50 +20 +00 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +70 +10 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +80 +E0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +80 +E0 +90 +90 +90 +20 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +20 +70 +20 +70 +00 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +40 +40 +E0 +00 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +68 +B0 +20 +70 +00 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +60 +70 +20 +70 +00 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +20 +20 +20 +20 +10 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +E0 +90 +90 +A0 +60 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +F0 +50 +00 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +F0 +50 +10 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A0 +F0 +90 +90 +20 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +50 +50 +50 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +C0 +A0 +A0 +A0 +10 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +D0 +B0 +90 +00 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +90 +F0 +90 +60 +00 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +B0 +A0 +70 +00 +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +A8 +70 +20 +00 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +10 +90 +70 +00 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +10 +10 +90 +70 +00 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +A0 +60 +30 +00 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +E0 +90 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +E0 +90 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +80 +80 +00 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +10 +10 +00 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +E0 +90 +00 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +E0 +90 +E0 +00 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +C0 +30 +E0 +80 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +20 +20 +70 +20 +40 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +20 +20 +10 +00 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +C0 +20 +20 +70 +20 +20 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +E0 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +F0 +90 +70 +00 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A0 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +40 +A0 +90 +90 +00 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A0 +40 +40 +40 +00 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +20 +40 +F0 +10 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +20 +50 +F0 +40 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +20 +60 +10 +E0 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +20 +60 +50 +78 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +10 +30 +20 +20 +00 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +30 +40 +60 +20 +20 +00 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +20 +30 +10 +60 +00 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +50 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +88 +A8 +88 +70 +00 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +E0 +90 +E0 +00 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +50 +90 +60 +00 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +18 +70 +80 +90 +70 +00 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +50 +30 +50 +10 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +80 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +18 +70 +90 +90 +70 +10 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +10 +20 +70 +20 +00 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +30 +40 +20 +70 +20 +00 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +78 +00 +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +68 +10 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +78 +A8 +B8 +78 +00 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +E8 +50 +48 +30 +00 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +48 +50 +F0 +50 +50 +30 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +E8 +50 +50 +38 +10 +ENDCHAR +STARTCHAR uni02B6 +ENCODING 694 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +C0 +A0 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B8 +ENCODING 696 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +80 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B9 +ENCODING 697 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +20 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02CC +ENCODING 716 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +20 +20 +ENDCHAR +STARTCHAR uni02D0 +ENCODING 720 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +20 +00 +20 +70 +00 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +20 +30 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +48 +90 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +48 +90 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +48 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +70 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +20 +40 +40 +80 +00 +ENDCHAR +STARTCHAR uni0340 +ENCODING 832 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0341 +ENCODING 833 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +20 +40 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +60 +00 +60 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +B0 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +60 +00 +00 +00 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +B0 +40 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +60 +90 +90 +90 +F0 +00 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +20 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +F0 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +00 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +60 +60 +90 +90 +90 +00 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +F0 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +D0 +D0 +B0 +B0 +90 +00 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +60 +00 +00 +F0 +00 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +00 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +80 +80 +00 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +40 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +50 +50 +70 +20 +00 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +60 +60 +90 +90 +00 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +70 +70 +70 +20 +20 +00 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +70 +20 +20 +70 +00 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +00 +A0 +A0 +40 +40 +00 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +70 +20 +40 +30 +00 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +B0 +40 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +80 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +20 +40 +30 +00 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +40 +80 +80 +80 +70 +10 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +70 +50 +50 +20 +00 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +A0 +E0 +90 +00 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +10 +50 +B0 +90 +90 +00 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +F0 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +40 +80 +60 +80 +70 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +C0 +30 +60 +00 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +A0 +90 +60 +00 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +40 +40 +20 +00 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +70 +50 +70 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +60 +60 +90 +90 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +70 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +00 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +00 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +A0 +D0 +90 +60 +00 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +70 +10 +90 +60 +00 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +50 +20 +20 +00 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +70 +50 +70 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +90 +60 +60 +90 +30 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +80 +80 +60 +10 +20 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +C0 +30 +60 +00 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +40 +60 +40 +40 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +90 +B0 +D0 +90 +10 +00 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +80 +F0 +10 +20 +20 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +60 +60 +90 +B0 +B0 +00 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +20 +50 +B0 +50 +10 +10 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +60 +60 +B0 +00 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +E0 +80 +60 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +30 +40 +40 +30 +00 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +60 +50 +50 +10 +20 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +C0 +80 +90 +60 +00 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +20 +90 +60 +00 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +10 +10 +10 +90 +60 +00 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +A0 +B0 +A8 +A8 +B0 +00 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +A0 +F0 +A8 +A8 +B0 +00 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +60 +50 +50 +50 +00 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +00 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +20 +20 +40 +00 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +50 +50 +70 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +80 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +50 +50 +50 +50 +F0 +90 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +A8 +70 +70 +A8 +A8 +00 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +10 +60 +10 +90 +60 +00 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +B0 +B0 +D0 +D0 +90 +00 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +B0 +B0 +D0 +D0 +90 +00 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +00 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +50 +50 +50 +50 +90 +00 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +F0 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +00 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +80 +80 +00 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +80 +80 +90 +60 +00 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +20 +20 +40 +00 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +50 +50 +70 +20 +00 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +60 +60 +90 +90 +00 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +F0 +10 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +70 +10 +10 +00 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +F8 +00 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +F8 +08 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +40 +60 +50 +50 +60 +00 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +D0 +B0 +B0 +D0 +00 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +30 +10 +90 +60 +00 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +D0 +D0 +D0 +A0 +00 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +90 +90 +70 +50 +90 +00 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +80 +E0 +90 +60 +00 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +E0 +90 +E0 +00 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +30 +50 +50 +F0 +90 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A8 +70 +70 +A8 +00 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +60 +20 +C0 +00 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +B0 +D0 +90 +00 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +90 +B0 +D0 +90 +00 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +E0 +A0 +90 +00 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +30 +50 +50 +90 +00 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +88 +D8 +A8 +A8 +00 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +80 +80 +60 +00 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +40 +40 +40 +00 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +50 +20 +40 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +20 +70 +50 +70 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +60 +60 +90 +00 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +F0 +10 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +70 +10 +00 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A8 +A8 +A8 +F8 +00 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A8 +A8 +A8 +F8 +08 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +C0 +60 +50 +60 +00 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +D0 +B0 +D0 +00 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +80 +E0 +90 +E0 +00 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +30 +10 +60 +00 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A0 +D0 +D0 +A0 +00 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +A0 +60 +A0 +00 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +00 +60 +B0 +C0 +60 +00 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +E0 +40 +60 +50 +10 +20 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +F0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +30 +60 +40 +30 +00 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +C0 +30 +E0 +00 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +60 +20 +20 +70 +00 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +B8 +A8 +B0 +00 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A0 +F0 +A8 +B0 +00 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +E0 +40 +70 +48 +48 +00 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +90 +E0 +A0 +90 +00 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +00 +90 +50 +20 +40 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +50 +50 +70 +20 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +F0 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +F0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +50 +A0 +90 +00 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +20 +20 +F0 +00 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +20 +20 +20 +D0 +00 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +20 +20 +20 +00 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +10 +90 +90 +00 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +20 +20 +20 +00 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +50 +50 +50 +00 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +F0 +00 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +10 +20 +20 +00 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +70 +10 +10 +E0 +00 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +70 +10 +20 +40 +00 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +70 +90 +90 +F0 +00 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +70 +90 +90 +B0 +00 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +20 +40 +40 +40 +00 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +20 +20 +20 +60 +00 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +78 +48 +48 +30 +00 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +50 +50 +F0 +00 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +10 +10 +00 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +90 +10 +F0 +00 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +60 +40 +40 +00 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +60 +20 +F0 +00 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +10 +A0 +80 +00 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +10 +10 +10 +00 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A8 +C8 +88 +F0 +00 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +50 +50 +D0 +00 +ENDCHAR +STARTCHAR uni16A0 +ENCODING 5792 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +60 +50 +60 +40 +40 +00 +ENDCHAR +STARTCHAR uni16A2 +ENCODING 5794 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +50 +50 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni16A3 +ENCODING 5795 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +70 +70 +70 +00 +ENDCHAR +STARTCHAR uni16A6 +ENCODING 5798 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +60 +50 +50 +60 +40 +00 +ENDCHAR +STARTCHAR uni16A9 +ENCODING 5801 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR uni16AA +ENCODING 5802 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +80 +C0 +A0 +80 +00 +ENDCHAR +STARTCHAR uni16AB +ENCODING 5803 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +50 +60 +50 +40 +40 +00 +ENDCHAR +STARTCHAR uni16B1 +ENCODING 5809 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +A0 +C0 +A0 +80 +00 +ENDCHAR +STARTCHAR uni16B3 +ENCODING 5811 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +60 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni16B7 +ENCODING 5815 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +20 +20 +50 +50 +00 +ENDCHAR +STARTCHAR uni16B8 +ENCODING 5816 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +70 +A8 +A8 +70 +50 +00 +ENDCHAR +STARTCHAR uni16B9 +ENCODING 5817 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +50 +50 +60 +40 +40 +00 +ENDCHAR +STARTCHAR uni16BB +ENCODING 5819 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +D0 +B0 +D0 +B0 +00 +ENDCHAR +STARTCHAR uni16BE +ENCODING 5822 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +60 +30 +20 +20 +00 +ENDCHAR +STARTCHAR uni16C0 +ENCODING 5824 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni16C4 +ENCODING 5828 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +A8 +70 +20 +00 +ENDCHAR +STARTCHAR uni16C7 +ENCODING 5831 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +30 +28 +A0 +60 +20 +00 +ENDCHAR +STARTCHAR uni16C8 +ENCODING 5832 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +80 +80 +A0 +D0 +00 +ENDCHAR +STARTCHAR uni16C9 +ENCODING 5833 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +A8 +A8 +70 +20 +20 +00 +ENDCHAR +STARTCHAR uni16CB +ENCODING 5835 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +90 +B0 +D0 +90 +10 +00 +ENDCHAR +STARTCHAR uni16CF +ENCODING 5839 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni16D2 +ENCODING 5842 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +E0 +E0 +90 +E0 +00 +ENDCHAR +STARTCHAR uni16D6 +ENCODING 5846 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +88 +D8 +A8 +88 +88 +88 +00 +ENDCHAR +STARTCHAR uni16D7 +ENCODING 5847 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +88 +D8 +A8 +D8 +88 +88 +00 +ENDCHAR +STARTCHAR uni16DA +ENCODING 5850 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +60 +50 +40 +40 +40 +00 +ENDCHAR +STARTCHAR uni16DD +ENCODING 5853 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +20 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni16DE +ENCODING 5854 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +88 +88 +D8 +A8 +D8 +88 +00 +ENDCHAR +STARTCHAR uni16DF +ENCODING 5855 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +20 +50 +50 +00 +ENDCHAR +STARTCHAR uni16E0 +ENCODING 5856 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +70 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni16E1 +ENCODING 5857 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +70 +70 +A8 +20 +20 +00 +ENDCHAR +STARTCHAR uni16E2 +ENCODING 5858 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +28 +30 +20 +20 +60 +A0 +00 +ENDCHAR +STARTCHAR uni16E3 +ENCODING 5859 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +70 +A8 +A8 +00 +ENDCHAR +STARTCHAR uni16E4 +ENCODING 5860 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +F0 +90 +90 +F0 +90 +00 +ENDCHAR +STARTCHAR uni16EB +ENCODING 5867 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni16EC +ENCODING 5868 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +00 +20 +00 +00 +ENDCHAR +STARTCHAR uni16ED +ENCODING 5869 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +20 +50 +00 +00 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +E0 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +80 +80 +E0 +90 +E0 +00 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +90 +90 +E0 +00 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +10 +10 +70 +90 +70 +00 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +20 +40 +E0 +40 +40 +00 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +F0 +F0 +90 +90 +90 +00 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +A0 +F0 +90 +90 +00 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +E0 +80 +80 +00 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +40 +20 +90 +60 +00 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +70 +C0 +30 +E0 +00 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +20 +70 +20 +20 +10 +00 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +F0 +F0 +90 +00 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +00 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +F0 +F0 +90 +00 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +F0 +F0 +90 +00 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +A0 +00 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +00 +90 +50 +20 +40 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +10 +70 +20 +40 +30 +00 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +20 +70 +20 +40 +30 +00 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +E0 +40 +80 +60 +00 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +E0 +40 +80 +60 +00 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +E0 +40 +80 +60 +00 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +E0 +40 +80 +60 +00 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +70 +20 +40 +30 +00 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +70 +20 +40 +30 +00 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +40 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +40 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +40 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +70 +90 +B0 +50 +00 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +70 +90 +B0 +50 +40 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +60 +90 +F0 +90 +00 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +60 +90 +F0 +90 +00 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +70 +50 +50 +00 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +F0 +90 +90 +40 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +A0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +40 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +E0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +E0 +90 +90 +10 +90 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +C0 +60 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +70 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +F0 +90 +90 +90 +40 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +20 +00 +20 +20 +10 +00 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +B0 +40 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +00 +40 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +A0 +00 +40 +40 +20 +00 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +70 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +70 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +A0 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +90 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +A0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +20 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +B0 +40 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +60 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +60 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +90 +00 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +60 +A0 +A0 +40 +40 +00 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +A0 +A0 +40 +40 +00 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +D0 +50 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +D0 +50 +60 +40 +40 +00 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D0 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +B0 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +90 +90 +F0 +F0 +00 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +00 +90 +90 +F0 +F0 +40 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +50 +50 +20 +50 +00 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +60 +00 +00 +00 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +60 +00 +00 +00 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +50 +50 +50 +00 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +F0 +00 +F0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +60 +20 +40 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +40 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +A0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +A0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +50 +50 +A0 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +A0 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +20 +20 +20 +00 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +20 +70 +20 +00 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +F0 +F0 +60 +00 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +60 +70 +60 +40 +00 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +20 +00 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +50 +00 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +A8 +00 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +60 +00 +00 +00 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +90 +20 +40 +A8 +28 +00 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +A0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +70 +E0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +A0 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +E0 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +40 +20 +00 +00 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +20 +40 +00 +00 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +50 +00 +50 +00 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +20 +40 +80 +00 +00 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +60 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +60 +10 +60 +00 +00 +00 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +60 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +10 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +50 +20 +00 +00 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +30 +60 +00 +00 +00 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +00 +70 +00 +00 +00 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +40 +40 +20 +00 +00 +00 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +10 +10 +20 +00 +00 +00 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +60 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +50 +50 +20 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +60 +20 +70 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +60 +20 +40 +60 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +60 +60 +20 +60 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +60 +70 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +70 +60 +10 +60 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +30 +60 +50 +20 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +70 +10 +20 +20 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +50 +20 +50 +20 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +50 +30 +60 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +70 +00 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +70 +00 +70 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +40 +40 +20 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +10 +10 +20 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +80 +D8 +A0 +A0 +A0 +00 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +40 +E0 +E0 +40 +B0 +00 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +50 +F8 +70 +40 +40 +00 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +38 +70 +90 +90 +70 +F0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +40 +E0 +E0 +40 +30 +00 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +60 +D0 +50 +D0 +E0 +00 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +D0 +D0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +B0 +B0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +F8 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +F8 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +D0 +C0 +C0 +D0 +60 +00 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +80 +70 +60 +A0 +50 +20 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +20 +20 +50 +00 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C8 +C8 +E8 +D8 +C8 +C8 +00 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +A0 +A0 +B0 +A8 +B0 +00 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +D0 +D0 +D0 +F0 +70 +10 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +D0 +D0 +F0 +E0 +D0 +00 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +00 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +30 +60 +60 +C0 +F0 +00 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +50 +20 +70 +00 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +50 +50 +50 +20 +00 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +D8 +E0 +70 +00 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +80 +B0 +30 +30 +30 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +C0 +40 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +80 +40 +B0 +30 +30 +30 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +40 +80 +B0 +30 +30 +30 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +F0 +40 +00 +00 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +F0 +20 +00 +00 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +70 +20 +00 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +F8 +50 +00 +00 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +20 +20 +70 +20 +00 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +F0 +50 +00 +00 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A0 +F0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +70 +20 +00 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +20 +20 +70 +20 +70 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +F8 +10 +40 +F8 +40 +00 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +F8 +40 +10 +F8 +10 +00 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +F0 +00 +F0 +20 +00 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +F0 +00 +F0 +40 +00 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +78 +80 +78 +20 +10 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +D8 +50 +50 +50 +00 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +F0 +08 +F0 +20 +40 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +D8 +50 +20 +00 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +88 +70 +20 +00 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +D8 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +F0 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +40 +40 +50 +20 +00 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +10 +30 +50 +50 +20 +00 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +10 +70 +10 +10 +F0 +00 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +F0 +50 +70 +50 +F0 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +70 +B0 +D0 +D0 +E0 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +50 +50 +88 +F8 +00 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +88 +50 +50 +20 +20 +00 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +80 +F0 +80 +70 +00 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +70 +A0 +F0 +A0 +70 +40 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +E0 +10 +F0 +10 +E0 +00 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +E0 +50 +F0 +50 +E0 +80 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +50 +50 +50 +50 +D8 +00 +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +D8 +50 +50 +50 +50 +F8 +00 +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +40 +20 +40 +80 +F0 +00 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +20 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +10 +20 +40 +80 +80 +00 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +50 +20 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +08 +10 +10 +20 +A0 +40 +00 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +A0 +A0 +50 +00 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +A8 +A8 +50 +00 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +80 +80 +80 +F0 +00 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +A0 +40 +F0 +20 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +30 +60 +20 +20 +00 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +50 +50 +50 +00 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +58 +70 +70 +D0 +50 +00 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +20 +20 +50 +50 +00 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +50 +20 +20 +00 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +90 +90 +00 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +28 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +28 +70 +A8 +70 +A0 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +50 +A0 +00 +00 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +50 +A0 +00 +F0 +00 +00 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +A0 +00 +F0 +00 +F0 +00 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +50 +A0 +00 +50 +A0 +00 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +50 +A0 +20 +50 +A0 +80 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +00 +F0 +00 +F0 +00 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +20 +00 +20 +F0 +00 +F0 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +F0 +20 +F0 +40 +00 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +F0 +00 +F0 +00 +F0 +00 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +F0 +20 +F0 +20 +F0 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +00 +F0 +00 +F0 +00 +F0 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +20 +40 +20 +10 +70 +00 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +20 +10 +20 +40 +70 +00 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +28 +50 +A0 +50 +28 +00 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +A0 +50 +28 +50 +A0 +00 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +80 +80 +70 +00 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +10 +10 +E0 +00 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +A0 +A0 +70 +20 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +E0 +50 +50 +E0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +80 +70 +00 +F0 +00 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +E0 +10 +E0 +00 +F0 +00 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A0 +70 +20 +F0 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +E0 +50 +E0 +40 +F0 +40 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +80 +70 +20 +F0 +20 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +E0 +10 +E0 +40 +F0 +40 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +A8 +F8 +A8 +70 +00 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +88 +F8 +88 +70 +00 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +D8 +A8 +D8 +70 +00 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +98 +A8 +C8 +70 +00 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +88 +A8 +88 +70 +00 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +80 +F0 +80 +80 +00 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +10 +F0 +10 +10 +00 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +20 +70 +00 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +40 +70 +40 +40 +00 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +70 +40 +70 +40 +00 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +F0 +80 +F0 +80 +00 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +90 +90 +90 +00 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +90 +90 +90 +90 +90 +60 +00 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +00 +20 +00 +20 +00 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +08 +00 +20 +00 +80 +00 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +00 +20 +00 +08 +00 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +78 +98 +A8 +C8 +F0 +00 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +50 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +40 +40 +40 +40 +40 +00 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +40 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F0 +80 +00 +00 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR angleleft +ENCODING 9001 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +40 +40 +20 +20 +00 +ENDCHAR +STARTCHAR angleright +ENCODING 9002 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +20 +20 +40 +40 +00 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +E0 +A0 +70 +20 +20 +00 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +F0 +20 +30 +20 +00 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A0 +A0 +78 +50 +10 +10 +00 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +80 +F8 +A0 +30 +20 +00 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +80 +E0 +50 +60 +50 +00 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +90 +F0 +00 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +A0 +A0 +A0 +20 +38 +00 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A8 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +20 +20 +00 +20 +00 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +00 +30 +30 +00 +30 +00 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +A8 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +00 +30 +00 +30 +00 +30 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +38 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +38 +30 +30 +30 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +38 +38 +30 +30 +30 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +38 +00 +00 +00 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +38 +38 +00 +00 +00 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +38 +00 +00 +00 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +38 +38 +00 +00 +00 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +E0 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F0 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +38 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +38 +30 +30 +30 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +38 +30 +30 +30 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +38 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +38 +38 +30 +30 +30 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +38 +38 +30 +30 +30 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +E0 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +F0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F0 +F0 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F0 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F0 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +38 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +18 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +E0 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +38 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F0 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +38 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +E0 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +38 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F0 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +38 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +E0 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +38 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F8 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F0 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +38 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +F8 +F8 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +D0 +00 +00 +00 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +D0 +D0 +00 +00 +00 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +00 +20 +20 +00 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +00 +30 +30 +00 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +38 +20 +38 +20 +20 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +78 +50 +50 +50 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +78 +40 +58 +50 +50 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +20 +E0 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F0 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +10 +D0 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +38 +20 +38 +00 +00 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +78 +00 +00 +00 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +58 +40 +78 +00 +00 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +E0 +20 +E0 +00 +00 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +D0 +10 +F0 +00 +00 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +38 +20 +38 +20 +20 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +58 +50 +50 +50 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +58 +40 +58 +50 +50 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +E0 +20 +E0 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +D0 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +D0 +10 +D0 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +00 +F8 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +00 +D8 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +D8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +D8 +00 +D8 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +18 +20 +20 +20 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +C0 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +18 +00 +00 +00 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +88 +50 +50 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +38 +00 +00 +00 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +E0 +00 +00 +00 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +38 +38 +00 +00 +00 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +38 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +20 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +E0 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +30 +30 +30 +30 +20 +20 +20 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +F8 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +F8 +F8 +F8 +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +10 +40 +10 +40 +10 +00 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +A8 +50 +A8 +50 +A8 +50 +A8 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +B8 +E8 +B8 +E8 +B8 +E8 +F8 +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +F0 +F0 +F0 +00 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F0 +90 +90 +F0 +00 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +70 +70 +00 +00 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +70 +50 +70 +00 +00 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +F8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +70 +70 +70 +70 +00 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +70 +70 +F8 +F8 +00 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +50 +50 +88 +F8 +00 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +C0 +E0 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +80 +C0 +A0 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +60 +70 +60 +40 +00 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +40 +60 +50 +60 +40 +00 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +E0 +F8 +E0 +80 +00 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +80 +E0 +98 +E0 +80 +00 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +F8 +70 +70 +20 +20 +00 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +88 +50 +50 +20 +20 +00 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +30 +70 +F0 +70 +30 +10 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +30 +70 +30 +10 +00 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +10 +30 +50 +30 +10 +00 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +08 +38 +F8 +38 +08 +00 +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +08 +38 +C8 +38 +08 +00 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +F8 +70 +20 +00 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +50 +88 +50 +20 +00 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +88 +88 +88 +70 +00 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +70 +F8 +F8 +F8 +70 +00 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +F8 +D8 +88 +D8 +F8 +F8 +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +F8 +F8 +D8 +A8 +D8 +F8 +F8 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +60 +90 +90 +60 +00 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +50 +00 +20 +50 +00 +00 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +50 +00 +50 +20 +00 +00 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +F8 +A8 +D8 +70 +00 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +50 +20 +70 +20 +00 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +20 +70 +20 +50 +20 +00 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +38 +18 +68 +A0 +40 +00 +00 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +F8 +F8 +20 +70 +00 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +70 +70 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +F8 +F8 +70 +70 +20 +00 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +F8 +F8 +70 +20 +00 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +10 +10 +30 +70 +20 +00 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +20 +30 +28 +60 +E0 +40 +00 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +60 +58 +48 +C8 +D8 +18 +00 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +40 +70 +50 +50 +60 +00 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +70 +50 +50 +70 +10 +00 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +58 +70 +D8 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +40 +00 +00 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +10 +00 +00 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +00 +00 +40 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +40 +00 +40 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +10 +00 +40 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +50 +00 +40 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +00 +00 +10 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +40 +00 +10 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +10 +00 +10 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +50 +00 +10 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +40 +00 +50 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +00 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +00 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +40 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +40 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +00 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +00 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +40 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +40 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +10 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +10 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +00 +00 +50 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +40 +00 +50 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +10 +00 +50 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +10 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +50 +00 +50 +00 +50 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 685 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +50 +00 +50 +00 +50 +00 +50 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/6x13.bdf b/src/3rdparty/fonts/6x13.bdf new file mode 100644 index 0000000000..0806bba2ec --- /dev/null +++ b/src/3rdparty/fonts/6x13.bdf @@ -0,0 +1,75535 @@ +STARTFONT 2.1 +COMMENT AUTOMATICALLY GENERATED FILE. DO NOT EDIT! +COMMENT In this version of the font file, all characters >= U+3200 are +COMMENT not encoded to keep XFontStruct small. +COMMENT Derived from 6x13.bdf,v 1.105 2000-06-19 00:45:36+01 mgk25 Rel mgk25 +COMMENT Send bug reports to Markus Kuhn +FONT -Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 13 0 -2 +STARTPROPERTIES 22 +FONTNAME_REGISTRY "" +FOUNDRY "Misc" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "SemiCondensed" +ADD_STYLE_NAME "" +PIXEL_SIZE 13 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 11 +COPYRIGHT "Public domain font. Share and enjoy." +_XMBDFED_INFO "Edited with xmbdfed 4.3." +CAP_HEIGHT 9 +X_HEIGHT 6 +ENDPROPERTIES +CHARS 4168 +STARTCHAR char0 +ENCODING 0 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +00 +88 +00 +88 +00 +88 +00 +A8 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +00 +20 +00 +00 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +50 +50 +F8 +50 +F8 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +78 +A0 +A0 +70 +28 +28 +F0 +20 +00 +00 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +A8 +50 +10 +20 +40 +50 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +A0 +A0 +40 +A0 +98 +90 +68 +00 +00 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +20 +40 +40 +40 +40 +40 +20 +20 +10 +00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +20 +10 +10 +10 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +F8 +70 +F8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +30 +20 +40 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +70 +20 +00 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +10 +10 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +88 +88 +88 +50 +20 +00 +00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +60 +A0 +20 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +08 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +20 +70 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +30 +50 +50 +90 +F8 +10 +10 +00 +00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +B0 +C8 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +F0 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +10 +20 +20 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +78 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +70 +20 +00 +00 +20 +70 +20 +00 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +70 +20 +00 +00 +30 +20 +40 +00 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +20 +40 +80 +40 +20 +10 +08 +00 +00 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +40 +20 +10 +08 +10 +20 +40 +80 +00 +00 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +08 +10 +20 +20 +00 +20 +00 +00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +98 +A8 +A8 +B0 +80 +78 +00 +00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +70 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +80 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +48 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +80 +98 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +10 +10 +10 +10 +10 +10 +90 +60 +00 +00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +D8 +A8 +A8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +00 +00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +A8 +70 +08 +00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +A0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +70 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +50 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +40 +40 +40 +40 +40 +40 +40 +40 +40 +70 +00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +40 +40 +20 +10 +10 +08 +08 +00 +00 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +F8 +00 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F0 +88 +88 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +78 +88 +88 +88 +88 +78 +00 +00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +40 +40 +F0 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +00 +30 +10 +10 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +90 +A0 +C0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D0 +A8 +A8 +A8 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +60 +10 +88 +70 +00 +00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +40 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +20 +20 +50 +88 +00 +00 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +18 +00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +20 +20 +20 +20 +18 +20 +20 +20 +20 +C0 +00 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +A8 +90 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +00 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +A0 +A0 +A8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +40 +40 +E0 +40 +40 +48 +B0 +00 +00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +88 +70 +50 +50 +70 +88 +00 +00 +00 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +F8 +20 +F8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +00 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +40 +30 +48 +48 +30 +08 +48 +30 +00 +00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +A8 +D8 +C8 +D8 +A8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +08 +78 +88 +78 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +28 +50 +A0 +A0 +50 +28 +00 +00 +00 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +08 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +E8 +D8 +D8 +E8 +D8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +48 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +20 +20 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +A0 +20 +40 +E0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +A0 +40 +20 +C0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +E8 +E8 +E8 +E8 +68 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +C0 +40 +40 +E0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +70 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +A0 +50 +28 +28 +50 +A0 +00 +00 +00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +C0 +40 +40 +E0 +08 +18 +28 +38 +08 +00 +00 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +C0 +40 +40 +E0 +10 +28 +08 +10 +38 +00 +00 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +A0 +40 +20 +A0 +48 +18 +28 +38 +08 +00 +00 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +00 +20 +20 +40 +80 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +20 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +58 +A0 +A0 +A0 +B0 +E0 +A0 +A0 +B8 +00 +00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +80 +80 +80 +88 +70 +20 +40 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +E8 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +88 +88 +C8 +A8 +98 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +70 +98 +98 +A8 +A8 +A8 +C8 +C8 +70 +80 +00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +88 +88 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +F0 +88 +88 +88 +F0 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +A0 +A0 +90 +88 +88 +B0 +00 +00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +50 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +30 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +28 +70 +A0 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +80 +88 +70 +20 +40 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +20 +60 +10 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +50 +00 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +00 +F8 +00 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +70 +98 +A8 +A8 +C8 +70 +80 +00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +80 +B0 +C8 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +20 +50 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +88 +F8 +88 +88 +88 +08 +04 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +08 +78 +88 +98 +68 +08 +04 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +70 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +70 +88 +80 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +70 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +F0 +48 +48 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +48 +30 +00 +08 +08 +78 +88 +88 +88 +88 +78 +00 +00 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +E8 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +1C +08 +78 +88 +88 +88 +88 +78 +00 +00 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +F8 +80 +80 +F0 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +20 +10 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +F8 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +70 +88 +80 +80 +98 +88 +70 +00 +00 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +70 +88 +80 +80 +98 +88 +70 +00 +00 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +70 +88 +80 +80 +98 +88 +70 +00 +00 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +80 +98 +88 +88 +70 +20 +40 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +60 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +80 +80 +B0 +C8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +F8 +88 +F8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +F0 +80 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A0 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +70 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +20 +20 +20 +20 +70 +20 +10 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +60 +20 +20 +20 +20 +70 +20 +10 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +DC +88 +88 +88 +88 +88 +88 +A8 +D0 +00 +00 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +48 +00 +D8 +48 +48 +48 +48 +E8 +48 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +38 +10 +10 +10 +10 +90 +60 +00 +00 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +30 +10 +10 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +40 +80 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +90 +A0 +C0 +A0 +90 +88 +40 +80 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +90 +A0 +E0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +80 +00 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +60 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +20 +40 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +70 +20 +40 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +60 +00 +40 +40 +40 +40 +40 +40 +78 +00 +00 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +90 +60 +00 +60 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +90 +90 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +28 +28 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +60 +40 +C0 +40 +40 +40 +78 +00 +00 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +30 +20 +60 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +88 +C8 +C8 +A8 +98 +98 +88 +00 +00 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +40 +80 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +40 +80 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +88 +C8 +C8 +A8 +98 +98 +88 +00 +00 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +40 +80 +00 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +28 +10 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +70 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +90 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +A0 +A0 +A0 +B0 +A0 +A0 +A0 +78 +00 +00 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +B8 +A0 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +F0 +88 +88 +F0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +B0 +C8 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +A0 +90 +88 +88 +40 +80 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +80 +80 +80 +80 +40 +80 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +60 +00 +F0 +88 +88 +F0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +60 +00 +B0 +C8 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +60 +10 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +88 +60 +10 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +70 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +60 +10 +88 +70 +20 +40 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +60 +00 +70 +88 +60 +10 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +40 +40 +48 +30 +20 +40 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +60 +00 +40 +F0 +40 +40 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +70 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +E0 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +50 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +20 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +20 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +90 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +90 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +98 +68 +20 +10 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +88 +88 +88 +A8 +A8 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +88 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +88 +50 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +50 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +F8 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +F8 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +F8 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +40 +40 +C0 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +E0 +40 +70 +48 +48 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +28 +28 +30 +28 +28 +28 +70 +00 +00 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +80 +80 +F0 +88 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +48 +40 +40 +70 +48 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +C0 +40 +40 +70 +48 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +C0 +40 +40 +60 +50 +50 +50 +60 +00 +00 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +08 +08 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +04 +78 +88 +80 +80 +80 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +04 +78 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +E8 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +28 +28 +28 +28 +28 +28 +70 +00 +00 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +08 +08 +78 +88 +88 +88 +78 +00 +00 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +48 +08 +08 +38 +48 +48 +48 +38 +00 +00 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +08 +08 +78 +08 +08 +08 +F8 +00 +00 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +08 +F8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +60 +80 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +20 +20 +20 +38 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +28 +20 +20 +70 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +04 +78 +88 +80 +80 +80 +98 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +50 +20 +20 +50 +50 +20 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +C8 +A8 +A8 +A8 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +70 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +94 +90 +A0 +C0 +A0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +80 +90 +A0 +C0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +70 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +60 +40 +A0 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +58 +00 +00 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +48 +68 +68 +78 +58 +58 +48 +48 +C0 +40 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +64 +94 +98 +90 +90 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +64 +94 +98 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +48 +00 +00 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +A8 +A8 +A8 +48 +08 +08 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +A8 +28 +30 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +80 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +F0 +88 +88 +88 +F0 +A0 +90 +08 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +08 +70 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +30 +40 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +60 +20 +20 +20 +20 +20 +28 +10 +00 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +40 +40 +48 +30 +10 +20 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +A0 +A0 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +40 +F0 +40 +40 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +94 +94 +98 +90 +90 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +94 +94 +98 +90 +B0 +50 +00 +00 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D8 +50 +50 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +A8 +A8 +28 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +94 +90 +90 +90 +70 +10 +90 +60 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +10 +F8 +40 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +F8 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +20 +70 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +40 +20 +70 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +40 +20 +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +70 +10 +60 +88 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +08 +10 +F8 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +80 +B0 +C8 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +48 +40 +50 +68 +08 +08 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +70 +20 +10 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +68 +48 +48 +50 +60 +40 +C0 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +F8 +20 +F8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +00 +20 +00 +00 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +10 +00 +D8 +A8 +A8 +B0 +B0 +B0 +D8 +00 +00 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +10 +C0 +A0 +B8 +A8 +A8 +B0 +D8 +00 +00 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +10 +00 +20 +20 +78 +A8 +A8 +B0 +78 +00 +00 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +A8 +F0 +00 +00 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +88 +80 +98 +88 +88 +88 +88 +F8 +28 +10 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +48 +40 +58 +48 +48 +48 +48 +E8 +28 +10 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +B8 +A8 +E8 +E8 +E8 +E8 +E8 +B8 +B8 +00 +00 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A8 +E0 +F8 +E8 +E8 +E8 +A8 +A8 +28 +10 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +00 +C8 +A8 +A8 +A8 +A8 +A8 +28 +10 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +60 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +50 +50 +00 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +50 +50 +00 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +48 +30 +00 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +48 +30 +00 +50 +50 +00 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +20 +00 +50 +50 +00 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +08 +F8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +F8 +00 +50 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +F8 +00 +50 +50 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +F8 +00 +20 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +F8 +00 +20 +20 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +58 +A0 +A0 +F0 +A0 +A0 +B8 +00 +00 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +70 +28 +70 +A0 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +80 +80 +80 +B0 +B8 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +90 +90 +90 +70 +10 +F8 +60 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +70 +88 +80 +98 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +80 +80 +90 +A0 +C0 +A0 +90 +00 +00 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +70 +88 +88 +88 +88 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +70 +88 +88 +88 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +F8 +10 +20 +70 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +F8 +10 +20 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +30 +10 +10 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D8 +A8 +A8 +A8 +A8 +B0 +B0 +B0 +D8 +00 +00 +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +A0 +A0 +B8 +A8 +A8 +B0 +B0 +D8 +00 +00 +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +78 +A8 +A8 +B0 +B0 +78 +00 +00 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +70 +88 +80 +98 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +A0 +A8 +E8 +A8 +A8 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +B0 +C8 +88 +88 +90 +A0 +C0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +88 +C8 +C8 +A8 +98 +98 +88 +00 +00 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +20 +50 +20 +20 +50 +88 +F8 +88 +00 +00 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +30 +48 +30 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +58 +A0 +A0 +F0 +A0 +A0 +B8 +00 +00 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +28 +70 +A0 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +08 +70 +98 +98 +A8 +C8 +C8 +70 +80 +00 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +08 +70 +98 +A8 +A8 +C8 +70 +80 +00 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +48 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +48 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +48 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +48 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +48 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +48 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +48 +00 +F0 +88 +88 +F0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +48 +00 +B0 +C8 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +00 +F0 +88 +88 +F0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +00 +B0 +C8 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +48 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +48 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +00 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +70 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +60 +10 +88 +70 +20 +40 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +40 +40 +48 +30 +10 +20 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +08 +10 +30 +48 +08 +10 +E0 +00 +00 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +88 +10 +30 +48 +08 +10 +E0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +80 +80 +B0 +C8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +48 +88 +88 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +88 +88 +70 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +08 +10 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +40 +80 +F8 +08 +10 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +10 +60 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +F8 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +78 +00 +28 +50 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +78 +00 +28 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +00 +88 +88 +50 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +F0 +80 +70 +00 +00 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +68 +98 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +C8 +B0 +00 +00 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +80 +F0 +88 +88 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +B0 +C8 +70 +80 +00 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +70 +90 +90 +90 +90 +70 +14 +08 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +14 +10 +10 +70 +90 +90 +90 +90 +70 +00 +00 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +F8 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +08 +F8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +98 +34 +50 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +30 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +98 +24 +10 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +B0 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +10 +10 +78 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +14 +10 +70 +90 +90 +90 +70 +10 +90 +60 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +98 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +50 +50 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +20 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +80 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +80 +B0 +C8 +88 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +60 +20 +70 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +68 +B0 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +60 +A0 +78 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +40 +40 +78 +48 +50 +70 +48 +E8 +08 +30 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +A8 +A8 +A8 +A8 +58 +00 +00 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D0 +A8 +A8 +A8 +A8 +88 +28 +10 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +68 +48 +48 +48 +48 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A0 +D0 +90 +90 +90 +90 +14 +08 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +C8 +A8 +A8 +98 +88 +00 +00 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +F8 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +A0 +B0 +A0 +A0 +78 +00 +00 +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +70 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +08 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +08 +08 +08 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +10 +10 +10 +B0 +50 +14 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +80 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +48 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +90 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +88 +F0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +90 +A0 +F0 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +80 +70 +08 +08 +F0 +80 +40 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +28 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +28 +20 +20 +20 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +A0 +20 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +28 +20 +20 +20 +20 +20 +60 +B0 +A8 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +90 +10 +10 +10 +78 +10 +10 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +40 +40 +40 +40 +48 +30 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +48 +FC +48 +58 +28 +00 +00 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D8 +50 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +88 +88 +88 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +50 +50 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +A8 +A8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +10 +20 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +50 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +40 +80 +F8 +10 +08 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +50 +A8 +F0 +40 +00 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +70 +08 +68 +98 +78 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +08 +08 +30 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +40 +40 +30 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +30 +08 +08 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +80 +80 +80 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +88 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +88 +F0 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +68 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +04 +78 +88 +80 +98 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +00 +30 +10 +10 +10 +10 +70 +98 +68 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +48 +28 +18 +28 +48 +08 +08 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +40 +40 +40 +40 +78 +00 +00 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +14 +70 +90 +90 +90 +70 +10 +10 +10 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +08 +08 +30 +20 +70 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +40 +40 +30 +10 +38 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +78 +A8 +A8 +B0 +B0 +78 +00 +00 +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +78 +A8 +A8 +B0 +B0 +68 +08 +30 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +78 +A8 +A8 +BC +B4 +78 +10 +20 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +E0 +58 +60 +50 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +50 +50 +F8 +50 +50 +50 +50 +30 +50 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +E0 +58 +60 +68 +74 +38 +20 +40 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +80 +80 +F0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +A0 +90 +C8 +B0 +00 +00 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F8 +88 +90 +A0 +C0 +F8 +00 +00 +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +50 +50 +00 +A8 +A8 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +78 +48 +00 +78 +48 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B0 +ENCODING 688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +50 +68 +48 +48 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B1 +ENCODING 689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +40 +50 +68 +48 +48 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B2 +ENCODING 690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +00 +10 +10 +50 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B3 +ENCODING 691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +60 +40 +40 +40 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B4 +ENCODING 692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +30 +50 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B5 +ENCODING 693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +30 +50 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B6 +ENCODING 694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +60 +50 +60 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B7 +ENCODING 695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +A8 +A8 +50 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B8 +ENCODING 696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +20 +20 +40 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02B9 +ENCODING 697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02BA +ENCODING 698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +28 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +30 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02BE +ENCODING 702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +10 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02BF +ENCODING 703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02C0 +ENCODING 704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +10 +20 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02C1 +ENCODING 705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +40 +20 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02C2 +ENCODING 706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +40 +20 +10 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02C3 +ENCODING 707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +10 +20 +40 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02C4 +ENCODING 708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +88 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02C5 +ENCODING 709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +50 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02CC +ENCODING 716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +70 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +10 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +40 +ENDCHAR +STARTCHAR uni02D0 +ENCODING 720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +20 +00 +00 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni02D1 +ENCODING 721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02D2 +ENCODING 722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +10 +10 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02D3 +ENCODING 723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +40 +40 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02D4 +ENCODING 724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02D5 +ENCODING 725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02D7 +ENCODING 727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +F8 +88 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +10 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +90 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02DE +ENCODING 734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +C8 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02DF +ENCODING 735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +20 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02E0 +ENCODING 736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +30 +30 +30 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02E1 +ENCODING 737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +20 +20 +20 +70 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02E2 +ENCODING 738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +40 +20 +10 +60 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02E3 +ENCODING 739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +30 +48 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02E4 +ENCODING 740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +40 +40 +30 +10 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02E5 +ENCODING 741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni02E6 +ENCODING 742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +70 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni02E7 +ENCODING 743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +10 +10 +70 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni02E8 +ENCODING 744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +10 +10 +10 +10 +10 +70 +10 +10 +ENDCHAR +STARTCHAR uni02E9 +ENCODING 745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +ENDCHAR +STARTCHAR uni02EA +ENCODING 746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +40 +70 +00 +00 +ENDCHAR +STARTCHAR uni02EB +ENCODING 747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +40 +70 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni02EC +ENCODING 748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +88 +50 +20 +ENDCHAR +STARTCHAR uni02ED +ENCODING 749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D8 +48 +90 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +90 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +48 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +88 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0315 +ENCODING 789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +0C +08 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0316 +ENCODING 790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +10 +ENDCHAR +STARTCHAR uni0317 +ENCODING 791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +ENDCHAR +STARTCHAR uni0318 +ENCODING 792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +30 +10 +ENDCHAR +STARTCHAR uni0319 +ENCODING 793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +30 +20 +ENDCHAR +STARTCHAR uni031A +ENCODING 794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +1C +04 +04 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni031B +ENCODING 795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +04 +04 +08 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni031C +ENCODING 796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +10 +ENDCHAR +STARTCHAR uni031D +ENCODING 797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +70 +ENDCHAR +STARTCHAR uni031E +ENCODING 798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +70 +20 +ENDCHAR +STARTCHAR uni031F +ENCODING 799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni0320 +ENCODING 800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +70 +ENDCHAR +STARTCHAR uni0321 +ENCODING 801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +28 +10 +ENDCHAR +STARTCHAR uni0322 +ENCODING 802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +08 +04 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +50 +ENDCHAR +STARTCHAR uni0325 +ENCODING 805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +50 +20 +ENDCHAR +STARTCHAR uni0326 +ENCODING 806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +ENDCHAR +STARTCHAR uni0327 +ENCODING 807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +ENDCHAR +STARTCHAR uni0328 +ENCODING 808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +10 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +20 +ENDCHAR +STARTCHAR uni032A +ENCODING 810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +78 +48 +ENDCHAR +STARTCHAR uni032B +ENCODING 811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +A8 +50 +ENDCHAR +STARTCHAR uni032C +ENCODING 812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +48 +30 +ENDCHAR +STARTCHAR uni032D +ENCODING 813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +30 +48 +ENDCHAR +STARTCHAR uni032E +ENCODING 814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +88 +70 +ENDCHAR +STARTCHAR uni032F +ENCODING 815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +70 +88 +ENDCHAR +STARTCHAR uni0330 +ENCODING 816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +28 +50 +ENDCHAR +STARTCHAR uni0331 +ENCODING 817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni0332 +ENCODING 818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uni0333 +ENCODING 819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni0334 +ENCODING 820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +28 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0335 +ENCODING 821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +70 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0336 +ENCODING 822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0337 +ENCODING 823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +20 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +10 +10 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni0339 +ENCODING 825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +10 +20 +ENDCHAR +STARTCHAR uni033A +ENCODING 826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +48 +78 +ENDCHAR +STARTCHAR uni033B +ENCODING 827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni033C +ENCODING 828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +50 +A8 +ENDCHAR +STARTCHAR uni033D +ENCODING 829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +20 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni033E +ENCODING 830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni033F +ENCODING 831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +00 +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0340 +ENCODING 832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +80 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0341 +ENCODING 833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +04 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0342 +ENCODING 834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0343 +ENCODING 835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0344 +ENCODING 836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +D8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0345 +ENCODING 837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni0346 +ENCODING 838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0347 +ENCODING 839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +70 +00 +70 +ENDCHAR +STARTCHAR uni0348 +ENCODING 840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +50 +50 +ENDCHAR +STARTCHAR uni0349 +ENCODING 841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +30 +10 +ENDCHAR +STARTCHAR uni034A +ENCODING 842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +68 +B0 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni034B +ENCODING 843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +00 +68 +B0 +00 +40 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni034C +ENCODING 844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +28 +50 +28 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni034D +ENCODING 845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +50 +F8 +50 +ENDCHAR +STARTCHAR uni034E +ENCODING 846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +70 +ENDCHAR +STARTCHAR uni0360 +ENCODING 864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +4C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0361 +ENCODING 865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +38 +44 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0362 +ENCODING 866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +FC +08 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +30 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +70 +20 +00 +00 +30 +20 +40 +00 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +D8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +28 +28 +28 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +70 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +A0 +20 +20 +30 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +A8 +28 +28 +38 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +90 +10 +10 +10 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +28 +28 +28 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +A8 +28 +28 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +28 +28 +28 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +D8 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +80 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +50 +50 +50 +88 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +50 +50 +50 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +D8 +A8 +A8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +00 +00 +70 +00 +00 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +88 +88 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +A8 +A8 +A8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +50 +50 +D8 +00 +00 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +00 +70 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +00 +88 +50 +50 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +00 +40 +40 +40 +40 +50 +20 +00 +00 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +D8 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +F0 +88 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +40 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +40 +40 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +90 +F0 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +40 +40 +40 +50 +20 +00 +00 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +90 +A0 +E0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +68 +98 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +40 +40 +30 +40 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +90 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +20 +20 +20 +20 +10 +00 +00 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +50 +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D8 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D8 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +B0 +C8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +48 +3C +08 +C8 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +54 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +14 +50 +90 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +00 +88 +54 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +70 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +88 +48 +50 +70 +50 +88 +08 +30 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +80 +80 +80 +80 +80 +70 +08 +10 +00 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +70 +80 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +E0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +80 +80 +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +88 +98 +A8 +C8 +88 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +40 +40 +80 +F8 +08 +10 +10 +20 +20 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +50 +50 +50 +98 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +20 +10 +30 +48 +98 +28 +48 +08 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +78 +08 +F0 +00 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +A8 +A8 +A8 +78 +08 +F0 +00 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +A8 +88 +88 +88 +78 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +A8 +88 +78 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +88 +88 +88 +08 +F0 +00 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +70 +A8 +A8 +48 +08 +F0 +00 +00 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +48 +10 +20 +40 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +80 +78 +00 +00 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +20 +50 +50 +50 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +20 +50 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +70 +80 +B0 +C8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +70 +80 +B0 +C8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +F8 +A8 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +30 +20 +F8 +A0 +20 +20 +20 +20 +60 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +48 +50 +70 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +00 +30 +10 +10 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +30 +28 +28 +28 +28 +28 +08 +10 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +40 +00 +F8 +88 +80 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +40 +80 +80 +F0 +80 +80 +40 +38 +00 +00 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +70 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +10 +10 +10 +10 +10 +10 +90 +60 +00 +00 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +A0 +A0 +A0 +B0 +A8 +A8 +A8 +B0 +00 +00 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +A0 +A0 +F0 +A8 +A8 +A8 +B0 +00 +00 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +30 +28 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +88 +98 +98 +A8 +C8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +88 +88 +88 +78 +08 +08 +70 +00 +00 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +80 +80 +80 +F0 +88 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +80 +80 +80 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +50 +50 +50 +50 +50 +50 +50 +F8 +88 +00 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +70 +20 +70 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +08 +30 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +48 +48 +48 +48 +48 +48 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +88 +88 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +88 +F0 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +80 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +78 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +A8 +A8 +A8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +90 +90 +90 +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +78 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +00 +00 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +40 +40 +40 +70 +48 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +E8 +98 +98 +98 +98 +E8 +00 +00 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +F0 +88 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E0 +10 +08 +08 +78 +08 +08 +10 +E0 +00 +00 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +A8 +A8 +A8 +E8 +A8 +A8 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +88 +88 +88 +78 +28 +48 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +70 +80 +F0 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +88 +F0 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +50 +50 +50 +50 +F8 +88 +00 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +A8 +70 +70 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +30 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +98 +A8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +90 +E0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +48 +48 +48 +48 +88 +00 +00 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +D8 +A8 +A8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +A8 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +70 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +20 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +78 +08 +08 +00 +00 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +A8 +A8 +A8 +A8 +F8 +00 +00 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C0 +40 +70 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +E8 +98 +98 +E8 +00 +00 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +80 +80 +F0 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +08 +38 +08 +08 +F0 +00 +00 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +A8 +A8 +E8 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +88 +88 +78 +48 +88 +00 +00 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +E0 +40 +50 +68 +48 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +00 +F8 +88 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +80 +E0 +80 +80 +78 +00 +00 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +60 +10 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +60 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +00 +30 +10 +10 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +A0 +B0 +A8 +A8 +B0 +00 +00 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A0 +A0 +F0 +A8 +A8 +B0 +00 +00 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +E0 +40 +50 +68 +48 +48 +48 +48 +00 +00 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +00 +88 +90 +E0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +88 +88 +98 +A8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +88 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +F0 +40 +40 +70 +48 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +E0 +40 +70 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +98 +A0 +A0 +A0 +F8 +A0 +A0 +A0 +98 +00 +00 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +98 +A0 +F8 +A0 +A0 +98 +00 +00 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +50 +50 +50 +88 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +50 +50 +88 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +90 +90 +B8 +F8 +B8 +B8 +B8 +B8 +00 +00 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +90 +F8 +B8 +B8 +B8 +00 +00 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +50 +50 +70 +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +50 +50 +70 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +B8 +A8 +A8 +A8 +F0 +B8 +D4 +D4 +D4 +00 +00 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B8 +A8 +90 +F8 +B8 +B8 +00 +00 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +30 +00 +70 +88 +08 +30 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +30 +00 +70 +88 +30 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +48 +78 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +98 +90 +90 +90 +50 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +98 +90 +90 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +48 +00 +9C +90 +90 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +48 +00 +98 +90 +90 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +A0 +B8 +B8 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +58 +B8 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +70 +A8 +88 +88 +88 +88 +88 +A8 +70 +20 +00 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +70 +A8 +88 +88 +A8 +70 +20 +00 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +60 +98 +60 +00 +50 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +98 +60 +00 +50 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +A8 +00 +50 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +A8 +00 +50 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +80 +80 +80 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +80 +70 +10 +10 +00 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +28 +10 +B0 +48 +40 +A0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0483 +ENCODING 1155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +04 +FC +80 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0484 +ENCODING 1156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +8C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0485 +ENCODING 1157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +C8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0486 +ENCODING 1158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +98 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0488 +ENCODING 1160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +A0 +08 +14 +00 +00 +00 +00 +00 +40 +A0 +08 +14 +ENDCHAR +STARTCHAR uni0489 +ENCODING 1161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +84 +C8 +0C +00 +00 +00 +00 +00 +40 +84 +C8 +0C +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +E0 +40 +70 +48 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +40 +E0 +40 +70 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +A8 +F0 +88 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +F8 +80 +80 +80 +80 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +F8 +80 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +48 +40 +40 +E0 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +48 +E0 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +F0 +88 +88 +88 +88 +10 +00 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +80 +F0 +88 +88 +88 +10 +00 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +70 +20 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +A8 +70 +70 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +08 +30 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +30 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +90 +A0 +A0 +C0 +A0 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +A0 +C0 +A0 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +A8 +B0 +A0 +E0 +A0 +B0 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +B0 +E0 +B0 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +E8 +50 +60 +60 +60 +50 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +E0 +48 +50 +60 +50 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C8 +48 +50 +60 +60 +60 +50 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C8 +50 +60 +50 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +90 +90 +90 +F0 +90 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +90 +F0 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +B8 +A0 +A0 +A0 +E0 +A0 +A0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B8 +A0 +E0 +A0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E0 +A0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +E0 +A0 +B0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +90 +A8 +A8 +A8 +70 +20 +18 +00 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +80 +90 +A8 +70 +20 +18 +00 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +80 +80 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +A8 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +F8 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +50 +50 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +50 +50 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +20 +50 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +48 +48 +48 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +E8 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +90 +90 +90 +90 +70 +10 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +A8 +A8 +78 +28 +28 +08 +00 +00 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +A8 +78 +28 +08 +00 +00 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F0 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +E0 +90 +90 +90 +90 +00 +00 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +48 +48 +F8 +40 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +48 +F8 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +48 +48 +F8 +40 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +70 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +A8 +A8 +70 +70 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +90 +E0 +90 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +F8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +78 +08 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +58 +A0 +A0 +A0 +B0 +E0 +A0 +A0 +B8 +00 +00 +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +28 +70 +A0 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +08 +F8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +08 +F8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +70 +88 +08 +F8 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +88 +08 +F8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +A8 +A8 +70 +20 +70 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +A8 +A8 +70 +70 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +70 +88 +08 +30 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +88 +30 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +20 +70 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +88 +98 +98 +A8 +C8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +88 +88 +98 +A8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +98 +98 +A8 +C8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +88 +88 +98 +A8 +C8 +88 +00 +00 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +E8 +B8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +E8 +B8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +70 +88 +E8 +B8 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +70 +88 +E8 +B8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +E0 +10 +08 +78 +08 +10 +E0 +00 +00 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +F0 +08 +38 +08 +08 +F0 +00 +00 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +88 +88 +98 +68 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +88 +98 +68 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +90 +00 +88 +88 +98 +68 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +90 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +88 +88 +78 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +88 +88 +88 +78 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +88 +E8 +98 +98 +98 +E8 +00 +00 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +88 +88 +E8 +98 +98 +E8 +00 +00 +ENDCHAR +STARTCHAR uni0531 +ENCODING 1329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +B0 +48 +00 +00 +ENDCHAR +STARTCHAR uni0532 +ENCODING 1330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +80 +F0 +88 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni0533 +ENCODING 1331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +A0 +A0 +70 +28 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni0534 +ENCODING 1332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +A0 +20 +30 +28 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni0535 +ENCODING 1333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +F0 +88 +80 +80 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0536 +ENCODING 1334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +90 +70 +10 +A0 +F0 +88 +00 +00 +ENDCHAR +STARTCHAR uni0537 +ENCODING 1335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F0 +88 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni0538 +ENCODING 1336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +80 +80 +80 +80 +80 +F0 +08 +00 +ENDCHAR +STARTCHAR uni0539 +ENCODING 1337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +B8 +D0 +D0 +A0 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni053A +ENCODING 1338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +10 +78 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni053B +ENCODING 1339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F0 +88 +88 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni053C +ENCODING 1340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni053D +ENCODING 1341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +E8 +A8 +A8 +90 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni053E +ENCODING 1342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +70 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni053F +ENCODING 1343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +88 +88 +88 +88 +78 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni0540 +ENCODING 1344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +10 +20 +40 +80 +C0 +30 +08 +00 +00 +ENDCHAR +STARTCHAR uni0541 +ENCODING 1345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +48 +48 +38 +08 +70 +90 +68 +00 +00 +ENDCHAR +STARTCHAR uni0542 +ENCODING 1346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +A0 +20 +20 +20 +20 +20 +30 +08 +00 +ENDCHAR +STARTCHAR uni0543 +ENCODING 1347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +10 +10 +E0 +50 +50 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni0544 +ENCODING 1348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +B8 +A8 +A0 +A0 +A0 +A0 +A0 +A0 +40 +00 +00 +ENDCHAR +STARTCHAR uni0545 +ENCODING 1349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +28 +30 +28 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0546 +ENCODING 1350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +80 +C0 +40 +40 +40 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni0547 +ENCODING 1351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +F0 +40 +80 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0548 +ENCODING 1352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0549 +ENCODING 1353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +78 +10 +10 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni054A +ENCODING 1354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +A8 +A8 +28 +28 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni054B +ENCODING 1355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +90 +50 +30 +A0 +F0 +88 +00 +00 +ENDCHAR +STARTCHAR uni054C +ENCODING 1356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +A0 +B0 +A8 +A8 +A0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni054D +ENCODING 1357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni054E +ENCODING 1358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +A0 +A0 +A0 +A0 +60 +20 +30 +08 +00 +ENDCHAR +STARTCHAR uni054F +ENCODING 1359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +70 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0550 +ENCODING 1360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +80 +80 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni0551 +ENCODING 1361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +70 +88 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0552 +ENCODING 1362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +E0 +90 +90 +88 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni0553 +ENCODING 1363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +A8 +A8 +A8 +70 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni0554 +ENCODING 1364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +28 +28 +30 +A0 +70 +28 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni0555 +ENCODING 1365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0556 +ENCODING 1366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +A0 +70 +28 +28 +A8 +A8 +70 +00 +00 +ENDCHAR +STARTCHAR uni0559 +ENCODING 1369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +40 +40 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni055A +ENCODING 1370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni055B +ENCODING 1371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni055C +ENCODING 1372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +70 +80 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni055D +ENCODING 1373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni055E +ENCODING 1374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +A8 +90 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni055F +ENCODING 1375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +88 +70 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0561 +ENCODING 1377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +A8 +A8 +A8 +A8 +58 +00 +00 +ENDCHAR +STARTCHAR uni0562 +ENCODING 1378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +88 +88 +88 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni0563 +ENCODING 1379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +90 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni0564 +ENCODING 1380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A0 +D0 +90 +90 +90 +98 +10 +10 +ENDCHAR +STARTCHAR uni0565 +ENCODING 1381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F8 +80 +88 +88 +C8 +B0 +00 +00 +ENDCHAR +STARTCHAR uni0566 +ENCODING 1382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +90 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni0567 +ENCODING 1383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +F8 +80 +80 +80 +80 +80 +70 +08 +00 +ENDCHAR +STARTCHAR uni0568 +ENCODING 1384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +80 +F8 +ENDCHAR +STARTCHAR uni0569 +ENCODING 1385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A0 +D0 +90 +B8 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni056A +ENCODING 1386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +78 +90 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni056B +ENCODING 1387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +A0 +D0 +90 +90 +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni056C +ENCODING 1388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni056D +ENCODING 1389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +E8 +A8 +A8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni056E +ENCODING 1390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +40 +20 +78 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni056F +ENCODING 1391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0570 +ENCODING 1392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0571 +ENCODING 1393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +20 +78 +88 +88 +88 +88 +78 +00 +00 +ENDCHAR +STARTCHAR uni0572 +ENCODING 1394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A0 +D0 +90 +90 +90 +90 +10 +18 +ENDCHAR +STARTCHAR uni0573 +ENCODING 1395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +40 +F8 +48 +48 +48 +58 +28 +00 +00 +ENDCHAR +STARTCHAR uni0574 +ENCODING 1396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +10 +90 +90 +90 +90 +B0 +50 +00 +00 +ENDCHAR +STARTCHAR uni0575 +ENCODING 1397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +08 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni0576 +ENCODING 1398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +98 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni0577 +ENCODING 1399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +48 +08 +08 +10 +20 +40 +38 +ENDCHAR +STARTCHAR uni0578 +ENCODING 1400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni0579 +ENCODING 1401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +20 +20 +40 +40 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni057A +ENCODING 1402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni057B +ENCODING 1403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +50 +20 +40 +38 +ENDCHAR +STARTCHAR uni057C +ENCODING 1404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A0 +D0 +90 +90 +90 +98 +00 +00 +ENDCHAR +STARTCHAR uni057D +ENCODING 1405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni057E +ENCODING 1406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +90 +90 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni057F +ENCODING 1407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +A8 +A8 +A8 +A8 +68 +00 +00 +ENDCHAR +STARTCHAR uni0580 +ENCODING 1408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni0581 +ENCODING 1409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni0582 +ENCODING 1410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +20 +20 +20 +20 +18 +00 +00 +ENDCHAR +STARTCHAR uni0583 +ENCODING 1411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +B0 +A8 +A8 +A8 +A8 +68 +20 +20 +ENDCHAR +STARTCHAR uni0584 +ENCODING 1412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +20 +20 +F8 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni0585 +ENCODING 1413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0586 +ENCODING 1414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +A0 +A0 +70 +28 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0587 +ENCODING 1415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +90 +90 +90 +90 +90 +68 +00 +00 +ENDCHAR +STARTCHAR uni0589 +ENCODING 1417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +30 +00 +30 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni058A +ENCODING 1418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +38 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0591 +ENCODING 1425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +50 +ENDCHAR +STARTCHAR uni0592 +ENCODING 1426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +88 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0593 +ENCODING 1427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0594 +ENCODING 1428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +00 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0595 +ENCODING 1429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +40 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0596 +ENCODING 1430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +10 +ENDCHAR +STARTCHAR uni0597 +ENCODING 1431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +70 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0598 +ENCODING 1432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +A8 +90 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0599 +ENCODING 1433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +80 +40 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni059A +ENCODING 1434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +04 +08 +04 +ENDCHAR +STARTCHAR uni059C +ENCODING 1436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni059D +ENCODING 1437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +04 +08 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni059E +ENCODING 1438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +24 +28 +28 +08 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni059F +ENCODING 1439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +A8 +50 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05A0 +ENCODING 1440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +28 +10 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05A1 +ENCODING 1441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +D0 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05A3 +ENCODING 1443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +70 +ENDCHAR +STARTCHAR uni05A4 +ENCODING 1444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +40 +20 +ENDCHAR +STARTCHAR uni05A5 +ENCODING 1445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +20 +ENDCHAR +STARTCHAR uni05A6 +ENCODING 1446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +48 +90 +ENDCHAR +STARTCHAR uni05A8 +ENCODING 1448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05A9 +ENCODING 1449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +A0 +40 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05AA +ENCODING 1450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +50 +20 +ENDCHAR +STARTCHAR uni05AB +ENCODING 1451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +40 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05AC +ENCODING 1452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +10 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05AD +ENCODING 1453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +04 +ENDCHAR +STARTCHAR uni05AF +ENCODING 1455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57799 +ENCODING 1456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +00 +20 +ENDCHAR +STARTCHAR afii57801 +ENCODING 1457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +A8 +00 +48 +ENDCHAR +STARTCHAR afii57800 +ENCODING 1458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +E0 +08 +ENDCHAR +STARTCHAR afii57802 +ENCODING 1459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +E0 +48 +ENDCHAR +STARTCHAR afii57793 +ENCODING 1460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +ENDCHAR +STARTCHAR afii57794 +ENCODING 1461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +50 +ENDCHAR +STARTCHAR afii57795 +ENCODING 1462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +88 +20 +ENDCHAR +STARTCHAR afii57798 +ENCODING 1463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +70 +ENDCHAR +STARTCHAR afii57797 +ENCODING 1464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +70 +20 +ENDCHAR +STARTCHAR afii57806 +ENCODING 1465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57796 +ENCODING 1467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +80 +20 +08 +ENDCHAR +STARTCHAR afii57807 +ENCODING 1468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57839 +ENCODING 1469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +20 +ENDCHAR +STARTCHAR afii57645 +ENCODING 1470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57841 +ENCODING 1471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57842 +ENCODING 1472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR afii57804 +ENCODING 1473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57803 +ENCODING 1474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57658 +ENCODING 1475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +20 +00 +00 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni05C4 +ENCODING 1476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +48 +68 +90 +88 +C8 +00 +00 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +10 +10 +10 +10 +F8 +00 +00 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +20 +10 +10 +28 +48 +00 +00 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +08 +08 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +20 +20 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +48 +48 +48 +48 +48 +00 +00 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +98 +A8 +A8 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +10 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +08 +08 +08 +08 +F0 +00 +00 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F8 +08 +08 +08 +10 +60 +00 +00 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +48 +48 +48 +48 +78 +00 +00 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +A8 +48 +88 +88 +B8 +00 +00 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +08 +08 +08 +08 +78 +00 +00 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +48 +48 +48 +50 +60 +00 +00 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D8 +48 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +48 +48 +48 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +48 +48 +08 +08 +F0 +00 +00 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +48 +48 +50 +60 +40 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +48 +28 +10 +08 +F8 +00 +00 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +08 +88 +88 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +A8 +A8 +E8 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +48 +48 +48 +48 +C8 +00 +00 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D8 +48 +48 +48 +48 +48 +00 +00 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D8 +48 +48 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D8 +48 +48 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +90 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E01 +ENCODING 3585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +C8 +48 +48 +48 +08 +00 +ENDCHAR +STARTCHAR uni0E02 +ENCODING 3586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +68 +68 +28 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E03 +ENCODING 3587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +E8 +28 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E04 +ENCODING 3588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +E8 +E8 +C8 +48 +00 +00 +ENDCHAR +STARTCHAR uni0E05 +ENCODING 3589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +E8 +E8 +C8 +48 +00 +00 +ENDCHAR +STARTCHAR uni0E06 +ENCODING 3590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +E8 +28 +48 +E8 +D0 +00 +00 +ENDCHAR +STARTCHAR uni0E07 +ENCODING 3591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +30 +10 +90 +50 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E08 +ENCODING 3592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +68 +68 +28 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E09 +ENCODING 3593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +E0 +10 +D0 +D0 +78 +58 +00 +00 +ENDCHAR +STARTCHAR uni0E0A +ENCODING 3594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +D0 +E0 +50 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni0E0B +ENCODING 3595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +A8 +F0 +28 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E0C +ENCODING 3596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +68 +A8 +68 +A8 +F8 +E8 +00 +00 +ENDCHAR +STARTCHAR uni0E0D +ENCODING 3597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +68 +A8 +68 +B8 +E0 +F8 +00 +00 +ENDCHAR +STARTCHAR uni0E0E +ENCODING 3598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +48 +48 +C8 +D8 +38 +48 +ENDCHAR +STARTCHAR uni0E0F +ENCODING 3599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +48 +48 +C8 +D8 +A8 +50 +ENDCHAR +STARTCHAR uni0E10 +ENCODING 3600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +80 +70 +68 +68 +18 +A8 +58 +ENDCHAR +STARTCHAR uni0E11 +ENCODING 3601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +F8 +28 +48 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni0E12 +ENCODING 3602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +E8 +A8 +A8 +F8 +E8 +00 +00 +ENDCHAR +STARTCHAR uni0E13 +ENCODING 3603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +68 +A8 +68 +B0 +B8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni0E14 +ENCODING 3604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +E8 +E8 +A8 +48 +00 +00 +ENDCHAR +STARTCHAR uni0E15 +ENCODING 3605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +E8 +E8 +A8 +48 +00 +00 +ENDCHAR +STARTCHAR uni0E16 +ENCODING 3606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +C8 +48 +68 +68 +00 +00 +ENDCHAR +STARTCHAR uni0E17 +ENCODING 3607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D0 +E8 +48 +48 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni0E18 +ENCODING 3608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +80 +F0 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E19 +ENCODING 3609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D0 +D0 +50 +90 +B8 +58 +00 +00 +ENDCHAR +STARTCHAR uni0E1A +ENCODING 3610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C8 +C8 +48 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E1B +ENCODING 3611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +08 +C8 +C8 +48 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E1C +ENCODING 3612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C8 +C8 +88 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni0E1D +ENCODING 3613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +08 +C8 +C8 +88 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni0E1E +ENCODING 3614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C8 +C8 +48 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni0E1F +ENCODING 3615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +08 +C8 +C8 +48 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni0E20 +ENCODING 3616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +C8 +48 +C8 +C8 +00 +00 +ENDCHAR +STARTCHAR uni0E21 +ENCODING 3617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C8 +C8 +48 +48 +E8 +D0 +00 +00 +ENDCHAR +STARTCHAR uni0E22 +ENCODING 3618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C8 +C8 +88 +68 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E23 +ENCODING 3619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +E0 +10 +30 +30 +00 +00 +ENDCHAR +STARTCHAR uni0E24 +ENCODING 3620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +C8 +48 +68 +68 +08 +08 +ENDCHAR +STARTCHAR uni0E25 +ENCODING 3621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +68 +98 +C8 +C8 +00 +00 +ENDCHAR +STARTCHAR uni0E26 +ENCODING 3622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +C8 +48 +C8 +C8 +08 +08 +ENDCHAR +STARTCHAR uni0E27 +ENCODING 3623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +08 +08 +18 +18 +00 +00 +ENDCHAR +STARTCHAR uni0E28 +ENCODING 3624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +08 +70 +88 +E8 +E8 +C8 +48 +00 +00 +ENDCHAR +STARTCHAR uni0E29 +ENCODING 3625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D0 +D0 +70 +B8 +90 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E2A +ENCODING 3626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +08 +70 +88 +68 +98 +C8 +C8 +00 +00 +ENDCHAR +STARTCHAR uni0E2B +ENCODING 3627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D8 +D8 +50 +68 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni0E2C +ENCODING 3628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +08 +D0 +C8 +48 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni0E2D +ENCODING 3629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +08 +C8 +C8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E2E +ENCODING 3630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +08 +F0 +08 +C8 +C8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E2F +ENCODING 3631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D8 +E8 +08 +08 +08 +10 +00 +00 +ENDCHAR +STARTCHAR uni0E30 +ENCODING 3632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +68 +70 +00 +68 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E31 +ENCODING 3633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +78 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E32 +ENCODING 3634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni0E33 +ENCODING 3635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +C0 +C0 +30 +48 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni0E34 +ENCODING 3636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E35 +ENCODING 3637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +78 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E36 +ENCODING 3638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +78 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E37 +ENCODING 3639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +78 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E38 +ENCODING 3640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +08 +ENDCHAR +STARTCHAR uni0E39 +ENCODING 3641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +38 +18 +ENDCHAR +STARTCHAR uni0E3A +ENCODING 3642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni0E3F +ENCODING 3647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +F0 +A8 +A8 +F0 +A8 +A8 +F0 +20 +00 +ENDCHAR +STARTCHAR uni0E40 +ENCODING 3648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +40 +40 +40 +60 +60 +00 +00 +ENDCHAR +STARTCHAR uni0E41 +ENCODING 3649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +90 +90 +90 +D8 +D8 +00 +00 +ENDCHAR +STARTCHAR uni0E42 +ENCODING 3650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +78 +80 +F0 +10 +10 +10 +18 +18 +00 +00 +ENDCHAR +STARTCHAR uni0E43 +ENCODING 3651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +90 +B0 +70 +10 +10 +18 +18 +00 +00 +ENDCHAR +STARTCHAR uni0E44 +ENCODING 3652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +B0 +50 +10 +10 +10 +10 +18 +18 +00 +00 +ENDCHAR +STARTCHAR uni0E45 +ENCODING 3653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni0E46 +ENCODING 3654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +E8 +D8 +08 +08 +08 +08 +10 +20 +ENDCHAR +STARTCHAR uni0E47 +ENCODING 3655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +60 +58 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E48 +ENCODING 3656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E49 +ENCODING 3657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E4A +ENCODING 3658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +54 +78 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E4B +ENCODING 3659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +38 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E4C +ENCODING 3660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +18 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E4D +ENCODING 3661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E4E +ENCODING 3662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +38 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni0E4F +ENCODING 3663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +88 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E50 +ENCODING 3664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E51 +ENCODING 3665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +A8 +E8 +08 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E52 +ENCODING 3666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +80 +A8 +B8 +B8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E53 +ENCODING 3667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +50 +A8 +88 +C8 +C8 +00 +00 +ENDCHAR +STARTCHAR uni0E54 +ENCODING 3668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +70 +80 +B0 +B0 +78 +00 +00 +ENDCHAR +STARTCHAR uni0E55 +ENCODING 3669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +68 +70 +80 +B0 +B0 +78 +00 +00 +ENDCHAR +STARTCHAR uni0E56 +ENCODING 3670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +80 +50 +28 +08 +68 +70 +00 +00 +ENDCHAR +STARTCHAR uni0E57 +ENCODING 3671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +A8 +E8 +A8 +A8 +D0 +00 +00 +ENDCHAR +STARTCHAR uni0E58 +ENCODING 3672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +70 +80 +98 +A8 +D8 +00 +00 +ENDCHAR +STARTCHAR uni0E59 +ENCODING 3673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +30 +60 +A0 +D0 +C8 +00 +00 +ENDCHAR +STARTCHAR uni0E5A +ENCODING 3674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A8 +E8 +28 +50 +A0 +A8 +00 +00 +ENDCHAR +STARTCHAR uni0E5B +ENCODING 3675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +A0 +B0 +A8 +C0 +C0 +00 +00 +ENDCHAR +STARTCHAR uni10D0 +ENCODING 4304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +30 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10D1 +ENCODING 4305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +60 +20 +20 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10D2 +ENCODING 4306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +40 +A0 +A0 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni10D3 +ENCODING 4307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +A8 +A8 +90 +80 +60 +10 +ENDCHAR +STARTCHAR uni10D4 +ENCODING 4308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni10D5 +ENCODING 4309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +30 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni10D6 +ENCODING 4310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +A8 +70 +30 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni10D7 +ENCODING 4311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +50 +A8 +A8 +A8 +48 +00 +00 +ENDCHAR +STARTCHAR uni10D8 +ENCODING 4312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +88 +88 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni10D9 +ENCODING 4313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +08 +08 +30 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni10DA +ENCODING 4314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +58 +B8 +B8 +A8 +80 +70 +08 +ENDCHAR +STARTCHAR uni10DB +ENCODING 4315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +08 +78 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10DC +ENCODING 4316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +80 +80 +80 +F0 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10DD +ENCODING 4317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +50 +A8 +A8 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR uni10DE +ENCODING 4318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +10 +08 +08 +30 +08 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10DF +ENCODING 4319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +18 +A8 +A8 +48 +08 +48 +30 +ENDCHAR +STARTCHAR uni10E0 +ENCODING 4320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +70 +80 +D0 +A8 +A8 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR uni10E1 +ENCODING 4321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +90 +A0 +90 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10E2 +ENCODING 4322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +50 +70 +D8 +D8 +A8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni10E3 +ENCODING 4323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +B0 +48 +48 +08 +08 +08 +48 +48 +30 +ENDCHAR +STARTCHAR uni10E4 +ENCODING 4324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +50 +A8 +A8 +50 +08 +48 +30 +ENDCHAR +STARTCHAR uni10E5 +ENCODING 4325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +18 +08 +08 +38 +48 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni10E6 +ENCODING 4326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +50 +A8 +A8 +88 +80 +70 +08 +ENDCHAR +STARTCHAR uni10E7 +ENCODING 4327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni10E8 +ENCODING 4328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +A8 +A8 +88 +38 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni10E9 +ENCODING 4329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +E0 +80 +F0 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni10EA +ENCODING 4330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +90 +88 +88 +B0 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni10EB +ENCODING 4331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +08 +08 +08 +78 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10EC +ENCODING 4332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +A8 +80 +80 +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni10ED +ENCODING 4333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +60 +A0 +20 +68 +B0 +68 +20 +20 +A0 +C0 +ENDCHAR +STARTCHAR uni10EE +ENCODING 4334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +90 +A0 +F0 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10EF +ENCODING 4335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +88 +50 +20 +50 +88 +40 +80 +ENDCHAR +STARTCHAR uni10F0 +ENCODING 4336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +30 +08 +30 +08 +08 +30 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10F1 +ENCODING 4337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +A0 +90 +88 +B0 +88 +88 +B0 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni10F2 +ENCODING 4338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +50 +F8 +00 +00 +ENDCHAR +STARTCHAR uni10F3 +ENCODING 4339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +08 +10 +30 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni10F4 +ENCODING 4340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +30 +08 +08 +30 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni10F5 +ENCODING 4341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +90 +78 +10 +78 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni10F6 +ENCODING 4342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +20 +20 +70 +A8 +A8 +70 +20 +20 +10 +ENDCHAR +STARTCHAR uni10FB +ENCODING 4347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +18 +18 +C0 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR uni11A8 +ENCODING 4520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +08 +08 +08 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni11A9 +ENCODING 4521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +28 +28 +28 +28 +28 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni11AA +ENCODING 4522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +C8 +48 +50 +50 +58 +68 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11AB +ENCODING 4523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11AC +ENCODING 4524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +B8 +90 +90 +90 +A8 +A8 +E8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11AD +ENCODING 4525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +B8 +80 +B8 +80 +B8 +A8 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11AE +ENCODING 4526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11AF +ENCODING 4527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +F8 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11B0 +ENCODING 4528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +28 +28 +E8 +88 +A8 +C8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11B1 +ENCODING 4529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +DC +54 +54 +D4 +94 +B4 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni11B2 +ENCODING 4530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D4 +54 +54 +DC +94 +B4 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni11B3 +ENCODING 4531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +E4 +24 +28 +E8 +94 +B4 +D4 +00 +00 +00 +ENDCHAR +STARTCHAR uni11B4 +ENCODING 4532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D8 +50 +50 +D8 +90 +B0 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11B5 +ENCODING 4533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +DC +40 +54 +D4 +94 +A8 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni11B6 +ENCODING 4534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +EC +20 +3C +E8 +9C +B4 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11B7 +ENCODING 4535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +88 +88 +88 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11B8 +ENCODING 4536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +88 +88 +88 +F8 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11B9 +ENCODING 4537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A8 +A8 +A8 +E8 +B4 +B4 +D4 +00 +00 +00 +ENDCHAR +STARTCHAR uni11BA +ENCODING 4538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +10 +20 +20 +50 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni11BB +ENCODING 4539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +28 +28 +50 +50 +58 +A8 +A4 +00 +00 +00 +ENDCHAR +STARTCHAR uni11BC +ENCODING 4540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +48 +84 +84 +84 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni11BD +ENCODING 4541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +10 +30 +48 +48 +84 +00 +00 +00 +ENDCHAR +STARTCHAR uni11BE +ENCODING 4542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +00 +F8 +20 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni11BF +ENCODING 4543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +F8 +08 +08 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni11C0 +ENCODING 4544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +80 +80 +F8 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11C1 +ENCODING 4545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +50 +50 +50 +50 +50 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11C2 +ENCODING 4546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +00 +F8 +00 +70 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni11EB +ENCODING 4587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +50 +50 +50 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni11F9 +ENCODING 4601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +00 +70 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni1680 +ENCODING 5760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1681 +ENCODING 5761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni1682 +ENCODING 5762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1683 +ENCODING 5763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +38 +38 +38 +38 +00 +00 +ENDCHAR +STARTCHAR uni1684 +ENCODING 5764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +78 +78 +78 +78 +00 +00 +ENDCHAR +STARTCHAR uni1685 +ENCODING 5765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +F8 +F8 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1686 +ENCODING 5766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1687 +ENCODING 5767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +28 +28 +28 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1688 +ENCODING 5768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +38 +38 +38 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1689 +ENCODING 5769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +78 +78 +78 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni168A +ENCODING 5770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +F8 +F8 +F8 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni168B +ENCODING 5771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +10 +FC +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni168C +ENCODING 5772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +28 +28 +28 +FC +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni168D +ENCODING 5773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +38 +38 +38 +FC +70 +70 +70 +70 +00 +00 +ENDCHAR +STARTCHAR uni168E +ENCODING 5774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +3C +3C +3C +3C +FC +78 +78 +78 +78 +00 +00 +ENDCHAR +STARTCHAR uni168F +ENCODING 5775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +7C +7C +7C +7C +FC +F8 +F8 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1690 +ENCODING 5776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +FC +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1691 +ENCODING 5777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +28 +FC +28 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1692 +ENCODING 5778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +FC +38 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1693 +ENCODING 5779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +FC +78 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1694 +ENCODING 5780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +FC +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1695 +ENCODING 5781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +28 +10 +10 +FC +10 +10 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1696 +ENCODING 5782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +48 +84 +FC +84 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni1697 +ENCODING 5783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +40 +58 +48 +78 +00 +00 +ENDCHAR +STARTCHAR uni1698 +ENCODING 5784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +D8 +70 +70 +D8 +00 +00 +ENDCHAR +STARTCHAR uni1699 +ENCODING 5785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +F8 +50 +F8 +50 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni169A +ENCODING 5786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +78 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni169B +ENCODING 5787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +40 +20 +1C +20 +40 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni169C +ENCODING 5788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +04 +08 +10 +E0 +10 +08 +04 +00 +00 +00 +ENDCHAR +STARTCHAR uni16A0 +ENCODING 5792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +50 +60 +48 +50 +60 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni16A1 +ENCODING 5793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +00 +48 +50 +60 +48 +50 +60 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni16A2 +ENCODING 5794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +C0 +A0 +90 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16A3 +ENCODING 5795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +C0 +A0 +90 +A8 +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni16A4 +ENCODING 5796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +C0 +A0 +90 +88 +A8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16A5 +ENCODING 5797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +C0 +A0 +90 +C8 +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni16A6 +ENCODING 5798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +70 +48 +48 +48 +70 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni16A7 +ENCODING 5799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +F0 +88 +A8 +88 +F0 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni16A8 +ENCODING 5800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni16A9 +ENCODING 5801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C8 +B0 +80 +C8 +B0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni16AA +ENCODING 5802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +D0 +A0 +80 +C0 +B0 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni16AB +ENCODING 5803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +50 +48 +60 +50 +48 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni16AC +ENCODING 5804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +A0 +60 +30 +A8 +60 +30 +28 +20 +00 +00 +ENDCHAR +STARTCHAR uni16AD +ENCODING 5805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +30 +28 +20 +30 +28 +20 +00 +00 +ENDCHAR +STARTCHAR uni16AE +ENCODING 5806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +60 +A0 +20 +60 +A0 +20 +00 +00 +ENDCHAR +STARTCHAR uni16AF +ENCODING 5807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +28 +30 +60 +A8 +30 +60 +A0 +20 +00 +00 +ENDCHAR +STARTCHAR uni16B0 +ENCODING 5808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +28 +30 +60 +A0 +20 +60 +A0 +20 +00 +00 +ENDCHAR +STARTCHAR uni16B1 +ENCODING 5809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +B0 +88 +B0 +C0 +A0 +90 +88 +80 +00 +00 +ENDCHAR +STARTCHAR uni16B2 +ENCODING 5810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +10 +20 +40 +20 +10 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni16B3 +ENCODING 5811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +C0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR uni16B4 +ENCODING 5812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni16B5 +ENCODING 5813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni16B6 +ENCODING 5814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +90 +E0 +C0 +C0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni16B7 +ENCODING 5815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16B8 +ENCODING 5816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +A8 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16B9 +ENCODING 5817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +B0 +88 +B0 +C0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni16BA +ENCODING 5818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +C8 +A8 +98 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16BB +ENCODING 5819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +C8 +A8 +D8 +A8 +98 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16BC +ENCODING 5820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16BD +ENCODING 5821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +70 +70 +70 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16BE +ENCODING 5822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +A0 +60 +20 +30 +28 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16BF +ENCODING 5823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +30 +28 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16C0 +ENCODING 5824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +A0 +70 +70 +70 +28 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16C1 +ENCODING 5825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16C2 +ENCODING 5826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +70 +70 +70 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16C3 +ENCODING 5827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +40 +90 +48 +10 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni16C4 +ENCODING 5828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +70 +A8 +70 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16C5 +ENCODING 5829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +28 +30 +20 +60 +A0 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16C6 +ENCODING 5830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +60 +A0 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16C7 +ENCODING 5831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +30 +28 +20 +20 +20 +A0 +60 +20 +00 +00 +ENDCHAR +STARTCHAR uni16C8 +ENCODING 5832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C8 +B0 +80 +80 +80 +80 +80 +B0 +C8 +00 +00 +ENDCHAR +STARTCHAR uni16C9 +ENCODING 5833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +70 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16CA +ENCODING 5834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +40 +20 +10 +20 +40 +20 +10 +00 +00 +ENDCHAR +STARTCHAR uni16CB +ENCODING 5835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +88 +98 +A8 +C8 +88 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni16CC +ENCODING 5836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni16CD +ENCODING 5837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +70 +70 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni16CE +ENCODING 5838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +A8 +70 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni16CF +ENCODING 5839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16D0 +ENCODING 5840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +60 +A0 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16D1 +ENCODING 5841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +60 +A0 +20 +70 +70 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16D2 +ENCODING 5842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +B0 +88 +B0 +C0 +B0 +88 +B0 +C0 +00 +00 +ENDCHAR +STARTCHAR uni16D3 +ENCODING 5843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +28 +30 +20 +28 +30 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16D4 +ENCODING 5844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +A8 +88 +F0 +88 +A8 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR uni16D5 +ENCODING 5845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR uni16D6 +ENCODING 5846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +D8 +A8 +88 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16D7 +ENCODING 5847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +D8 +A8 +D8 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16D8 +ENCODING 5848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +70 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16D9 +ENCODING 5849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +70 +70 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16DA +ENCODING 5850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +30 +28 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16DB +ENCODING 5851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +30 +28 +20 +70 +70 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16DC +ENCODING 5852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +88 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni16DD +ENCODING 5853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +50 +20 +50 +88 +50 +20 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni16DE +ENCODING 5854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +D8 +D8 +A8 +A8 +A8 +D8 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR uni16DF +ENCODING 5855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +50 +20 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni16E0 +ENCODING 5856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +70 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16E1 +ENCODING 5857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16E2 +ENCODING 5858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +30 +20 +20 +20 +20 +20 +60 +A0 +00 +00 +ENDCHAR +STARTCHAR uni16E3 +ENCODING 5859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +70 +A8 +00 +00 +ENDCHAR +STARTCHAR uni16E4 +ENCODING 5860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +70 +A8 +A8 +A8 +70 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni16E5 +ENCODING 5861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +D8 +A8 +D8 +88 +D8 +A8 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR uni16E6 +ENCODING 5862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +70 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni16E7 +ENCODING 5863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16E8 +ENCODING 5864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni16E9 +ENCODING 5865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +68 +88 +68 +18 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni16EA +ENCODING 5866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +E0 +40 +50 +70 +50 +10 +38 +10 +00 +00 +ENDCHAR +STARTCHAR uni16EB +ENCODING 5867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni16EC +ENCODING 5868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +00 +00 +00 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni16ED +ENCODING 5869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni16EE +ENCODING 5870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +30 +28 +20 +60 +A0 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni16EF +ENCODING 5871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +70 +20 +20 +20 +70 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni16F0 +ENCODING 5872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +F8 +88 +88 +88 +20 +50 +20 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +08 +78 +88 +98 +68 +20 +50 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +F0 +48 +48 +70 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +A0 +80 +80 +F0 +88 +88 +88 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +70 +48 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F0 +88 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +70 +48 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F0 +88 +88 +88 +88 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +80 +80 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +28 +08 +08 +78 +88 +88 +88 +88 +78 +00 +00 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +48 +48 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +78 +88 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +48 +48 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +78 +88 +88 +88 +88 +78 +00 +F8 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +48 +48 +48 +48 +F0 +20 +40 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +78 +88 +88 +88 +88 +78 +20 +40 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +48 +48 +48 +F0 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +78 +88 +88 +88 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +20 +F8 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +F8 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +F8 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +F8 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +80 +F8 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +88 +70 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +F0 +80 +80 +80 +F8 +00 +28 +50 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +80 +88 +70 +00 +28 +50 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +20 +40 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +88 +F8 +80 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +F8 +80 +80 +F0 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +30 +48 +40 +F0 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +70 +88 +80 +80 +98 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +70 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +A0 +80 +80 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +80 +80 +B0 +C8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +10 +20 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +88 +88 +88 +88 +10 +20 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +88 +88 +00 +88 +70 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +88 +88 +88 +00 +88 +70 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +20 +20 +20 +70 +00 +28 +50 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +60 +20 +20 +20 +70 +00 +28 +50 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +50 +00 +70 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +50 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +A0 +80 +80 +90 +A0 +C0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +90 +A0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +90 +A0 +C0 +A0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +60 +20 +20 +20 +20 +20 +20 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +70 +00 +70 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +20 +20 +20 +70 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +88 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +D0 +A8 +A8 +A8 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +88 +88 +D8 +A8 +A8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +D0 +A8 +A8 +A8 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +D8 +A8 +A8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D0 +A8 +A8 +A8 +A8 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +B0 +C8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +20 +50 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +20 +50 +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +28 +50 +00 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +28 +50 +00 +70 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +00 +28 +50 +00 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +28 +50 +00 +70 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +20 +00 +F8 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +F8 +00 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +F8 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +F8 +00 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +B0 +C8 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +A0 +90 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +80 +80 +80 +80 +00 +20 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +F0 +88 +88 +88 +F0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +B0 +C8 +80 +80 +80 +80 +00 +20 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +A0 +90 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +80 +80 +80 +80 +00 +F8 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +70 +88 +60 +10 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +70 +08 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +60 +10 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +10 +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +10 +20 +00 +00 +70 +88 +60 +10 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +00 +50 +20 +70 +88 +80 +70 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +00 +50 +20 +00 +70 +88 +60 +10 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +70 +88 +60 +10 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +40 +40 +F0 +40 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +40 +40 +48 +30 +00 +20 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +40 +40 +48 +30 +00 +F8 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F0 +40 +40 +48 +30 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +88 +70 +00 +50 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +98 +68 +00 +50 +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +70 +00 +28 +50 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +98 +68 +00 +28 +50 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +98 +68 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +28 +50 +00 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +00 +28 +50 +00 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +00 +F8 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +00 +F8 +00 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +88 +88 +88 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +50 +00 +88 +88 +88 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +50 +50 +50 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +50 +50 +20 +00 +20 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +88 +88 +A8 +A8 +A8 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +88 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +00 +88 +88 +A8 +A8 +A8 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +88 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +88 +A8 +A8 +A8 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +88 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +88 +88 +A8 +A8 +A8 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +88 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +A8 +A8 +A8 +D8 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +88 +50 +20 +20 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +88 +88 +50 +20 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +00 +88 +50 +20 +20 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +88 +88 +50 +50 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +F8 +08 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +F8 +10 +20 +40 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +40 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +20 +40 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +88 +88 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +40 +40 +F0 +40 +40 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +20 +00 +88 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +20 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E9A +ENCODING 7834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +04 +08 +00 +70 +08 +78 +88 +88 +78 +00 +00 +ENDCHAR +STARTCHAR uni1E9B +ENCODING 7835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +30 +48 +40 +C0 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +88 +F8 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +08 +78 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1EA2 +ENCODING 7842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EA3 +ENCODING 7843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +20 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +44 +A8 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +44 +A8 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +54 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +54 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EA8 +ENCODING 7848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +54 +A4 +08 +28 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EA9 +ENCODING 7849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +54 +A4 +08 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +28 +50 +00 +30 +48 +20 +50 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +28 +50 +30 +48 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +08 +78 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +88 +70 +00 +20 +50 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +20 +88 +70 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +20 +88 +70 +00 +20 +50 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +20 +88 +70 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EB2 +ENCODING 7858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +A8 +70 +20 +50 +88 +88 +F8 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EB3 +ENCODING 7859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +A8 +70 +00 +70 +08 +78 +88 +78 +00 +00 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +A0 +88 +70 +00 +20 +50 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +A0 +88 +70 +00 +70 +08 +78 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +08 +78 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +F8 +80 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EBA +ENCODING 7866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1EBB +ENCODING 7867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +20 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +50 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +44 +A8 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +44 +A8 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +54 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +54 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1EC2 +ENCODING 7874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +54 +A8 +08 +00 +F8 +80 +E0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1EC3 +ENCODING 7875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +54 +A8 +08 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +28 +50 +30 +48 +00 +F8 +80 +F0 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +28 +50 +30 +48 +00 +70 +88 +F8 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +88 +F8 +80 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EC8 +ENCODING 7880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +F8 +20 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni1EC9 +ENCODING 7881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +20 +20 +00 +60 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +20 +20 +20 +20 +20 +20 +20 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +60 +20 +20 +20 +20 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECE +ENCODING 7886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ECF +ENCODING 7887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +20 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +44 +A8 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +44 +A8 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +54 +00 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +54 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED4 +ENCODING 7892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +54 +A4 +08 +78 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED5 +ENCODING 7893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +54 +A4 +08 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +28 +50 +38 +48 +70 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +28 +50 +30 +48 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +00 +70 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +00 +70 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +40 +00 +64 +94 +98 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +00 +64 +94 +98 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +64 +94 +98 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +64 +94 +98 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EDE +ENCODING 7902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +64 +94 +98 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EDF +ENCODING 7903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +10 +20 +64 +94 +98 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +A0 +00 +64 +94 +98 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A0 +00 +64 +94 +98 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +64 +94 +98 +90 +90 +90 +90 +90 +60 +00 +20 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +64 +94 +98 +90 +90 +60 +00 +20 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1EE6 +ENCODING 7910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +A8 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1EE7 +ENCODING 7911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +20 +88 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +40 +00 +94 +94 +98 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +00 +94 +94 +98 +90 +B0 +50 +00 +00 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +94 +94 +98 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +94 +94 +98 +90 +B0 +50 +00 +00 +ENDCHAR +STARTCHAR uni1EEC +ENCODING 7916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +B4 +94 +98 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EED +ENCODING 7917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +20 +94 +94 +98 +90 +B0 +50 +00 +00 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +A0 +00 +94 +94 +98 +90 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A0 +00 +94 +94 +98 +90 +B0 +50 +00 +00 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +94 +94 +98 +90 +90 +90 +60 +00 +20 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +94 +94 +98 +90 +B0 +50 +00 +20 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +00 +88 +88 +50 +50 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +88 +88 +88 +98 +68 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +88 +50 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +20 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +28 +50 +00 +88 +50 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +50 +00 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +10 +20 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +20 +10 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +28 +28 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +28 +28 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +A8 +68 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +A8 +68 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +68 +A8 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +68 +A8 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +28 +E8 +68 +A8 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +28 +E8 +A8 +68 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +60 +A0 +20 +30 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +A0 +60 +20 +30 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +60 +A0 +A0 +70 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +A0 +60 +A0 +70 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +60 +A0 +60 +B0 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +A0 +60 +60 +B0 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +20 +10 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +68 +A8 +28 +38 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +28 +38 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +68 +A8 +A8 +78 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +A8 +78 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +68 +A8 +68 +B8 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +68 +B8 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +28 +E8 +68 +B8 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +28 +E8 +A8 +78 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +20 +40 +00 +40 +40 +40 +40 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +40 +20 +00 +40 +40 +40 +40 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +10 +20 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +20 +10 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +50 +90 +10 +10 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +90 +50 +10 +10 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +50 +90 +90 +50 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +90 +50 +90 +50 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +50 +90 +50 +90 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +90 +50 +30 +50 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +10 +D0 +50 +90 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +10 +D0 +90 +50 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +28 +28 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +28 +28 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +A8 +68 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +A8 +68 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +68 +A8 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +68 +A8 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +10 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +20 +10 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +28 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +A8 +50 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +68 +90 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +28 +E8 +A8 +50 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +10 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +20 +10 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +28 +28 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +28 +28 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +A8 +68 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +A8 +68 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +68 +A8 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +68 +A8 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +28 +E8 +68 +A8 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +28 +E8 +A8 +68 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +40 +00 +40 +40 +40 +40 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +00 +40 +40 +40 +40 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +10 +20 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +20 +10 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +28 +28 +38 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +28 +28 +38 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +A8 +68 +38 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +A8 +68 +38 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +68 +A8 +38 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +68 +A8 +38 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +28 +E8 +68 +A8 +38 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +28 +E8 +A8 +68 +38 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +20 +10 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +68 +A8 +28 +38 +28 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +28 +38 +28 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +68 +A8 +A8 +78 +28 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +A8 +78 +28 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +68 +A8 +68 +B8 +28 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +A8 +68 +68 +B8 +28 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +28 +E8 +68 +B8 +28 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E8 +28 +E8 +A8 +78 +28 +28 +28 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +48 +80 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D0 +88 +40 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +50 +80 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C8 +90 +40 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +10 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +20 +10 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +28 +28 +28 +10 +10 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +28 +28 +28 +10 +10 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +A8 +68 +28 +10 +10 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +A8 +68 +28 +10 +10 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +68 +A8 +68 +A8 +28 +10 +10 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +68 +68 +A8 +28 +10 +10 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +28 +E8 +68 +A8 +28 +10 +10 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +28 +E8 +A8 +68 +28 +10 +10 +28 +00 +10 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +70 +88 +88 +88 +98 +68 +00 +00 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +70 +88 +88 +88 +98 +68 +00 +20 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +20 +50 +88 +88 +F8 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +68 +28 +28 +28 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +28 +28 +28 +38 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +88 +88 +F8 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +20 +20 +20 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +68 +B0 +00 +D8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +B0 +C8 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +B0 +C8 +88 +88 +88 +88 +08 +88 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +B8 +60 +20 +20 +30 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +A0 +20 +20 +30 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +68 +28 +28 +38 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +A8 +28 +28 +38 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +48 +80 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C8 +50 +80 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +10 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +D8 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +D8 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +00 +D8 +00 +20 +20 +20 +20 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +70 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +B8 +50 +10 +10 +10 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +90 +10 +10 +10 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +88 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C8 +90 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +20 +10 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +D8 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +D8 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +10 +20 +00 +70 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +20 +10 +00 +70 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B0 +00 +D8 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +88 +70 +00 +88 +50 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +00 +88 +88 +50 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +68 +28 +28 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +A8 +28 +28 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +A8 +68 +28 +30 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +D8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +D8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +00 +88 +A8 +A8 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +68 +28 +28 +28 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +28 +28 +28 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +68 +28 +28 +28 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +28 +28 +28 +28 +10 +10 +28 +00 +00 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +50 +50 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +30 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +30 +10 +20 +00 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +90 +D8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D8 +48 +90 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +D8 +48 +90 +00 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D8 +90 +48 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +F8 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +F8 +F8 +F8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +60 +70 +78 +70 +60 +40 +00 +00 +00 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +00 +00 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +50 +00 +00 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +A8 +00 +00 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +30 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni202F +ENCODING 8239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +A8 +50 +10 +20 +40 +68 +D4 +A8 +00 +00 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +A8 +50 +10 +28 +54 +68 +D4 +A8 +00 +00 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +A0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +54 +54 +A8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +54 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +20 +50 +50 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +20 +40 +40 +20 +10 +00 +00 +00 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +40 +20 +10 +10 +20 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +88 +50 +20 +A8 +20 +50 +88 +A8 +00 +00 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +00 +50 +00 +00 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +28 +28 +30 +20 +20 +00 +20 +00 +00 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +88 +70 +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +88 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2041 +ENCODING 8257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +10 +10 +20 +20 +50 +50 +ENDCHAR +STARTCHAR uni2042 +ENCODING 8258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +70 +20 +50 +F8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +70 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +10 +20 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni2045 +ENCODING 8261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +40 +40 +40 +70 +40 +40 +40 +70 +00 +00 +ENDCHAR +STARTCHAR uni2046 +ENCODING 8262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +10 +10 +10 +70 +10 +10 +10 +70 +00 +00 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +A8 +A8 +28 +48 +48 +48 +00 +48 +00 +00 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +A8 +A8 +88 +90 +90 +90 +00 +90 +00 +00 +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +B8 +B8 +B8 +B8 +B0 +A0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +78 +E8 +E8 +E8 +78 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F0 +B8 +B8 +B8 +F0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +A0 +A0 +A0 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +80 +80 +C0 +E0 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +E0 +80 +C0 +20 +C0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +60 +80 +C0 +A0 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +E0 +20 +40 +40 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +A0 +40 +A0 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +A0 +60 +20 +C0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +E0 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E0 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +E0 +00 +E0 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +80 +80 +80 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +20 +20 +20 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +A0 +A0 +A0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +A0 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +80 +80 +C0 +E0 +40 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +40 +E0 +40 +00 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +E0 +00 +00 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +E0 +00 +E0 +00 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +60 +80 +80 +B8 +A0 +70 +20 +38 +00 +00 +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +78 +98 +90 +A0 +A0 +A0 +C0 +C8 +F0 +80 +00 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +A8 +B0 +A0 +A8 +70 +00 +00 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +80 +80 +E8 +B0 +A0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +40 +E0 +40 +E0 +40 +48 +B0 +00 +00 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +10 +D0 +A8 +A8 +A8 +A8 +C8 +C0 +40 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +48 +68 +FC +68 +FC +58 +58 +48 +00 +00 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +48 +FC +48 +70 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +A0 +A0 +A0 +D8 +A0 +B0 +A8 +B0 +00 +00 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +F8 +88 +F8 +A8 +A8 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +64 +94 +B4 +B4 +B4 +B4 +B4 +A4 +98 +00 +00 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +70 +10 +70 +90 +90 +90 +90 +70 +00 +F0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +40 +40 +F0 +40 +F0 +40 +40 +38 +00 +00 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +44 +44 +48 +50 +FC +50 +48 +44 +44 +00 +00 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +30 +60 +30 +60 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +70 +C8 +48 +48 +48 +48 +E8 +D0 +00 +00 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +40 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +10 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +C8 +C0 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +98 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +F8 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +F8 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D8 +ENCODING 8408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +20 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +30 +48 +E8 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni20DA +ENCODING 8410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +90 +B8 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni20DB +ENCODING 8411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +A8 +A8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20DC +ENCODING 8412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +B4 +B4 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20DD +ENCODING 8413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20DE +ENCODING 8414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni20DF +ENCODING 8415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +48 +84 +84 +84 +84 +84 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni20E0 +ENCODING 8416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +78 +C4 +A4 +A4 +A4 +A4 +A4 +94 +94 +94 +94 +8C +78 +ENDCHAR +STARTCHAR uni20E1 +ENCODING 8417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +F8 +50 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni20E2 +ENCODING 8418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +ENDCHAR +STARTCHAR uni20E3 +ENCODING 8419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +FC +ENDCHAR +STARTCHAR uni2100 +ENCODING 8448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +A8 +A8 +70 +60 +58 +A0 +A0 +98 +00 +00 +ENDCHAR +STARTCHAR uni2101 +ENCODING 8449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +A8 +A8 +70 +38 +60 +90 +88 +B0 +00 +00 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +A0 +A0 +A0 +A0 +A0 +A8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +A0 +40 +38 +40 +40 +40 +40 +40 +40 +38 +00 +00 +ENDCHAR +STARTCHAR uni2104 +ENCODING 8452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +70 +A0 +A0 +A0 +70 +20 +38 +00 +00 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +88 +90 +50 +20 +50 +68 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +88 +90 +50 +20 +68 +68 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +88 +80 +80 +60 +80 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2108 +ENCODING 8456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +90 +08 +48 +78 +48 +08 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +A0 +40 +78 +40 +40 +70 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni210A +ENCODING 8458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +48 +88 +88 +70 +10 +90 +60 +ENDCHAR +STARTCHAR uni210B +ENCODING 8459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C8 +48 +48 +48 +78 +90 +90 +90 +98 +00 +00 +ENDCHAR +STARTCHAR uni210C +ENCODING 8460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +90 +80 +B0 +C8 +48 +28 +A8 +48 +10 +20 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +B8 +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +40 +70 +48 +48 +90 +90 +00 +00 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +30 +60 +C0 +70 +48 +48 +90 +90 +00 +00 +ENDCHAR +STARTCHAR uni2110 +ENCODING 8464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +08 +08 +10 +10 +10 +20 +A0 +40 +00 +00 +ENDCHAR +STARTCHAR Ifraktur +ENCODING 8465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +48 +08 +10 +10 +08 +C8 +30 +00 +00 +ENDCHAR +STARTCHAR uni2112 +ENCODING 8466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +54 +38 +10 +10 +20 +60 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +28 +28 +28 +28 +28 +10 +30 +48 +00 +00 +ENDCHAR +STARTCHAR uni2114 +ENCODING 8468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +F8 +A0 +B0 +A8 +A8 +A8 +A8 +B0 +00 +00 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C4 +C4 +A4 +A4 +B4 +B4 +AC +AC +A4 +00 +00 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +90 +D0 +D0 +DC +B4 +B4 +94 +9C +00 +00 +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +E8 +D8 +E8 +C8 +C8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR weierstrass +ENCODING 8472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +70 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +A8 +A8 +A8 +A8 +B0 +A0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +70 +08 +00 +ENDCHAR +STARTCHAR uni211B +ENCODING 8475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +70 +A0 +90 +90 +90 +00 +00 +ENDCHAR +STARTCHAR Rfraktur +ENCODING 8476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +A8 +68 +28 +30 +30 +B0 +A8 +48 +00 +00 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +A8 +A8 +A8 +B0 +B0 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR prescription +ENCODING 8478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +A8 +90 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR uni211F +ENCODING 8479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +60 +20 +F0 +A8 +A8 +A8 +F0 +A0 +B0 +A8 +A8 +20 +00 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +68 +B8 +68 +A8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2121 +ENCODING 8481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +E0 +40 +70 +60 +30 +20 +30 +00 +10 +10 +10 +18 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F4 +5C +54 +54 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2123 +ENCODING 8483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +60 +20 +A8 +A8 +A8 +A8 +70 +70 +70 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +28 +28 +50 +50 +50 +A0 +A0 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2125 +ENCODING 8485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +10 +20 +78 +10 +20 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +88 +88 +88 +50 +50 +D8 +00 +00 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D8 +50 +50 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2128 +ENCODING 8488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +48 +30 +48 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2129 +ENCODING 8489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +90 +A0 +C0 +A0 +90 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +20 +20 +50 +88 +88 +F8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni212C +ENCODING 8492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +70 +90 +90 +90 +E0 +00 +00 +ENDCHAR +STARTCHAR uni212D +ENCODING 8493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +50 +90 +88 +A8 +90 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +D8 +D8 +F8 +C0 +C8 +70 +00 +00 +ENDCHAR +STARTCHAR uni212F +ENCODING 8495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +48 +78 +80 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni2130 +ENCODING 8496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +80 +60 +80 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2131 +ENCODING 8497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +7C +90 +10 +10 +78 +20 +20 +A0 +40 +00 +00 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +78 +08 +08 +08 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2133 +ENCODING 8499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +44 +6C +54 +54 +44 +88 +88 +88 +84 +00 +00 +ENDCHAR +STARTCHAR uni2134 +ENCODING 8500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +48 +48 +90 +90 +E0 +00 +00 +ENDCHAR +STARTCHAR aleph +ENCODING 8501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +48 +68 +90 +88 +C8 +00 +00 +ENDCHAR +STARTCHAR uni2136 +ENCODING 8502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +10 +10 +10 +10 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2137 +ENCODING 8503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +20 +10 +10 +28 +48 +00 +00 +ENDCHAR +STARTCHAR uni2138 +ENCODING 8504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni2139 +ENCODING 8505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +30 +00 +70 +30 +30 +30 +30 +78 +00 +00 +ENDCHAR +STARTCHAR uni213A +ENCODING 8506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +04 +7C +8C +84 +84 +78 +00 +00 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +90 +28 +10 +08 +30 +00 +00 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +40 +80 +F0 +28 +10 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +B8 +20 +30 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +A0 +40 +80 +E0 +38 +20 +30 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +A0 +40 +20 +C0 +38 +20 +30 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +C0 +E0 +40 +38 +20 +30 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +98 +20 +30 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E0 +80 +C0 +20 +D8 +20 +30 +28 +10 +00 +00 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +90 +28 +10 +28 +10 +00 +00 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +A0 +40 +20 +D0 +28 +10 +28 +10 +00 +00 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E0 +80 +E0 +20 +D0 +28 +10 +28 +10 +00 +00 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E0 +20 +40 +40 +50 +28 +10 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +90 +90 +00 +00 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +50 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D4 +D4 +D4 +D4 +D4 +D4 +D4 +54 +54 +00 +00 +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +DC +DC +DC +DC +DC +DC +DC +5C +5C +00 +00 +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +90 +90 +90 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +48 +48 +48 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +AC +AC +AC +4C +4C +4C +AC +AC +AC +00 +00 +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +80 +80 +80 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +48 +48 +48 +48 +48 +48 +48 +F0 +00 +00 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +D8 +A8 +A8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +50 +00 +50 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A8 +00 +A8 +A8 +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +00 +A8 +A8 +A8 +A8 +90 +90 +00 +00 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +00 +A8 +A8 +A8 +A8 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +14 +00 +D4 +D4 +D4 +D4 +54 +54 +00 +00 +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +1C +00 +DC +DC +DC +DC +5C +5C +00 +00 +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +00 +A8 +A8 +90 +90 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +20 +20 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +00 +A8 +A8 +48 +48 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +0C +00 +AC +AC +4C +4C +AC +AC +00 +00 +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +80 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +78 +88 +88 +88 +88 +78 +00 +00 +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +D0 +A8 +A8 +A8 +A8 +88 +00 +00 +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +E8 +A8 +A8 +A8 +E8 +88 +F0 +00 +00 +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +A8 +F8 +A8 +F8 +A8 +A8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +08 +08 +08 +08 +08 +88 +70 +00 +00 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +40 +F8 +40 +20 +00 +00 +00 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +10 +F8 +10 +20 +00 +00 +00 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +FC +48 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +F0 +E0 +A0 +20 +10 +10 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +78 +38 +28 +20 +40 +40 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +40 +40 +20 +28 +38 +78 +18 +00 +00 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +10 +10 +20 +A0 +E0 +F0 +C0 +00 +00 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +28 +48 +FC +50 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +28 +FC +48 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C0 +D8 +64 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +0C +6C +98 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +28 +50 +FC +50 +28 +00 +00 +00 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +70 +A8 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +28 +FC +28 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +A8 +70 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +24 +48 +F0 +48 +24 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +48 +3C +48 +90 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +48 +F8 +48 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +90 +F8 +90 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +A8 +70 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +28 +44 +F8 +40 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +88 +7C +08 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +4C +FC +48 +28 +00 +00 +00 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +C8 +FC +48 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni21AD +ENCODING 8621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +DC +EC +48 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni21AE +ENCODING 8622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +58 +FC +68 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +90 +B0 +D0 +90 +10 +38 +10 +00 +00 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +F8 +48 +28 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +10 +F8 +90 +A0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +28 +48 +F8 +40 +20 +00 +00 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +A0 +90 +F8 +10 +20 +00 +00 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +10 +10 +38 +10 +00 +00 +00 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +48 +F8 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +48 +48 +E8 +48 +00 +00 +00 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +90 +90 +B8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +E0 +C0 +A0 +20 +10 +10 +08 +00 +00 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +C0 +F8 +C0 +A8 +18 +F8 +18 +28 +00 +00 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +38 +30 +A8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +E0 +60 +A8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +40 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +40 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +30 +28 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +60 +A0 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +10 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +10 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +28 +30 +20 +00 +00 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +A0 +60 +20 +00 +00 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +10 +F8 +10 +20 +40 +F8 +40 +20 +00 +00 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +F0 +50 +50 +50 +50 +50 +78 +50 +00 +00 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +F8 +40 +20 +10 +F8 +10 +20 +00 +00 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +40 +F8 +40 +20 +40 +F8 +40 +20 +00 +00 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +F8 +50 +50 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +10 +F8 +10 +20 +10 +F8 +10 +20 +00 +00 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +F8 +50 +00 +00 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +40 +F8 +00 +F8 +10 +20 +00 +00 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +10 +F8 +00 +F8 +40 +20 +00 +00 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +14 +28 +7C +90 +7C +20 +50 +00 +00 +ENDCHAR +STARTCHAR uni21CE +ENCODING 8654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +58 +FC +A4 +FC +68 +40 +00 +00 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +A0 +50 +F8 +24 +F8 +10 +28 +00 +00 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +20 +7C +80 +7C +20 +10 +00 +00 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +D8 +50 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +10 +F8 +04 +F8 +10 +20 +00 +00 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +D8 +50 +20 +00 +00 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +FC +84 +FC +48 +00 +00 +00 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +D8 +50 +50 +50 +D8 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +A0 +D0 +A8 +94 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +7C +14 +2C +54 +A4 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +40 +A4 +54 +2C +14 +7C +00 +00 +00 +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +94 +A8 +D0 +A0 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +3C +40 +FC +40 +3C +10 +00 +00 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +F0 +08 +FC +08 +F0 +20 +00 +00 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +E8 +D4 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +5C +AC +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +20 +70 +20 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +70 +20 +70 +20 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +40 +A8 +40 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +00 +20 +20 +00 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +10 +A8 +10 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +00 +20 +20 +00 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A0 +C0 +F8 +C0 +A0 +00 +00 +00 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +28 +18 +F8 +18 +28 +00 +00 +00 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +78 +88 +78 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +D8 +50 +50 +50 +50 +50 +70 +00 +00 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +F0 +88 +F0 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +50 +50 +50 +50 +50 +D8 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +D8 +50 +50 +70 +00 +70 +50 +70 +00 +00 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +D8 +50 +50 +50 +D8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +F8 +88 +50 +50 +D8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni21ED +ENCODING 8685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +F8 +70 +70 +70 +F8 +A8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +D8 +50 +D8 +50 +50 +50 +70 +00 +00 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +D8 +50 +D8 +50 +D8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +A0 +F0 +88 +F0 +A0 +00 +00 +00 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +80 +B0 +E0 +90 +10 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +80 +40 +48 +38 +68 +08 +F8 +00 +00 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +D8 +50 +50 +50 +D8 +50 +20 +00 +00 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +F8 +88 +88 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +40 +40 +40 +40 +40 +50 +20 +00 +00 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +48 +08 +38 +48 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +08 +08 +78 +08 +08 +08 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +10 +F8 +18 +28 +28 +78 +28 +28 +48 +F8 +40 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +10 +70 +98 +A8 +A8 +A8 +C8 +70 +40 +40 +00 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +50 +50 +50 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +88 +50 +50 +50 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +38 +40 +80 +F0 +80 +40 +38 +00 +00 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +38 +60 +A0 +F0 +A0 +60 +38 +20 +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +40 +70 +40 +38 +00 +00 +00 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +E0 +10 +08 +78 +08 +10 +E0 +00 +00 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +E0 +30 +28 +78 +28 +30 +E0 +20 +20 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +08 +38 +08 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +FC +48 +48 +48 +48 +48 +48 +48 +48 +48 +EC +00 +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +EC +48 +48 +48 +48 +48 +48 +48 +48 +48 +FC +00 +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +FC +80 +40 +20 +10 +08 +10 +20 +40 +80 +FC +00 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +20 +20 +F8 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +10 +10 +20 +20 +40 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +40 +40 +20 +20 +10 +10 +08 +00 +00 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +A8 +70 +F8 +70 +A8 +20 +00 +00 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +50 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +70 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +04 +04 +04 +08 +08 +08 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +04 +44 +A4 +48 +28 +C8 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +04 +84 +84 +C8 +E8 +48 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A0 +A0 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +A8 +A8 +50 +00 +00 +00 +00 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +80 +80 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +20 +40 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +90 +60 +60 +A0 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +30 +48 +88 +48 +30 +10 +08 +00 +00 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +30 +20 +60 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +50 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +58 +50 +70 +50 +D0 +50 +50 +00 +00 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +20 +50 +50 +88 +00 +00 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +88 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +24 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +90 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +54 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +24 +48 +48 +78 +CC +CC +CC +78 +48 +48 +48 +90 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +54 +A8 +A8 +F8 +AC +AC +AC +F8 +A8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni2231 +ENCODING 8753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +28 +20 +20 +20 +74 +AC +3C +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2232 +ENCODING 8754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +BC +A8 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2233 +ENCODING 8755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +BC +AC +74 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +00 +00 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +88 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +48 +00 +00 +48 +00 +00 +00 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +00 +E0 +00 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +00 +F8 +00 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +40 +A8 +A8 +10 +40 +00 +00 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +A8 +A8 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +A8 +A8 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +A4 +94 +48 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +A0 +A0 +A0 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +10 +10 +10 +20 +40 +40 +40 +20 +00 +00 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +60 +A8 +A8 +30 +20 +00 +00 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +48 +A8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +A8 +90 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +68 +A8 +B0 +20 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +48 +A8 +90 +00 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +48 +A8 +90 +20 +F8 +20 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +68 +A8 +B0 +20 +F8 +20 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +48 +A8 +90 +48 +A8 +90 +00 +00 +00 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +68 +A8 +B0 +68 +A8 +B0 +20 +20 +00 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +48 +A8 +90 +48 +A8 +90 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +A8 +90 +48 +A8 +90 +48 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +90 +A8 +48 +00 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni224D +ENCODING 8781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +70 +00 +70 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni224E +ENCODING 8782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +D8 +00 +D8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni224F +ENCODING 8783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +D8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2250 +ENCODING 8784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +00 +F8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2251 +ENCODING 8785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +00 +F8 +00 +F8 +00 +20 +00 +00 +ENDCHAR +STARTCHAR uni2252 +ENCODING 8786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +00 +F8 +00 +F8 +00 +08 +00 +00 +ENDCHAR +STARTCHAR uni2253 +ENCODING 8787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +00 +F8 +00 +F8 +00 +80 +00 +00 +ENDCHAR +STARTCHAR uni2254 +ENCODING 8788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +B8 +00 +B8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2255 +ENCODING 8789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +E8 +00 +E8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2256 +ENCODING 8790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +50 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2257 +ENCODING 8791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +20 +00 +F8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2258 +ENCODING 8792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +00 +F8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +50 +00 +F8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +50 +20 +00 +F8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni225B +ENCODING 8795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR uni225C +ENCODING 8796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +50 +88 +F8 +00 +F8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR uni225D +ENCODING 8797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +4C +F8 +F8 +00 +F8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni225E +ENCODING 8798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +D0 +A8 +A8 +A8 +00 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +50 +10 +20 +00 +20 +F8 +00 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +F8 +20 +F8 +80 +00 +00 +00 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +10 +F8 +20 +F8 +20 +F8 +40 +40 +00 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +00 +F8 +00 +F8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +18 +60 +80 +60 +18 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +C0 +30 +08 +30 +C0 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +60 +80 +60 +18 +00 +F8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +30 +08 +30 +C0 +00 +F8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +60 +80 +60 +18 +20 +F8 +20 +F8 +20 +00 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +30 +08 +30 +C0 +20 +F8 +20 +F8 +20 +00 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +14 +28 +50 +A0 +50 +28 +14 +00 +00 +00 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A0 +50 +28 +14 +28 +50 +A0 +00 +00 +00 +ENDCHAR +STARTCHAR uni226C +ENCODING 8812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +20 +50 +50 +50 +50 +50 +20 +50 +00 +00 +ENDCHAR +STARTCHAR uni226D +ENCODING 8813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +A8 +70 +20 +70 +A8 +20 +00 +00 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +28 +30 +20 +60 +A0 +60 +20 +30 +28 +20 +00 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +A0 +60 +20 +30 +28 +30 +20 +60 +A0 +20 +00 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +38 +60 +A0 +60 +38 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +E0 +30 +28 +30 +E0 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni2272 +ENCODING 8818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +60 +80 +60 +18 +00 +48 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni2273 +ENCODING 8819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +30 +08 +30 +C0 +00 +48 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni2274 +ENCODING 8820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +38 +60 +A0 +60 +38 +20 +68 +A8 +B0 +20 +00 +ENDCHAR +STARTCHAR uni2275 +ENCODING 8821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +E0 +30 +28 +30 +E0 +20 +68 +A8 +B0 +20 +00 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +60 +80 +60 +18 +C0 +30 +08 +30 +C0 +00 +00 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +30 +08 +30 +C0 +18 +60 +80 +60 +18 +00 +00 +ENDCHAR +STARTCHAR uni2278 +ENCODING 8824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +38 +60 +A0 +60 +38 +E0 +30 +28 +30 +E0 +20 +00 +ENDCHAR +STARTCHAR uni2279 +ENCODING 8825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +E0 +30 +28 +30 +E0 +38 +60 +A0 +60 +38 +20 +00 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +E0 +10 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +40 +38 +40 +80 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +E0 +10 +E8 +10 +08 +00 +00 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +40 +38 +40 +B8 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni227E +ENCODING 8830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +E0 +10 +08 +00 +48 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni227F +ENCODING 8831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +40 +38 +40 +80 +00 +48 +A8 +90 +00 +00 +ENDCHAR +STARTCHAR uni2280 +ENCODING 8832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +28 +30 +E0 +30 +28 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2281 +ENCODING 8833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +A0 +60 +38 +60 +A0 +20 +20 +00 +00 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +80 +80 +80 +78 +00 +00 +00 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +08 +08 +08 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +78 +A0 +A0 +A0 +78 +20 +20 +00 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F0 +28 +28 +28 +F0 +20 +20 +00 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +78 +80 +80 +80 +78 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F0 +08 +08 +08 +F0 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +78 +A0 +A0 +A0 +78 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +F0 +28 +28 +28 +F0 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +78 +80 +80 +80 +78 +10 +F8 +40 +00 +00 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F0 +08 +08 +08 +F0 +10 +F8 +40 +00 +00 +ENDCHAR +STARTCHAR uni228C +ENCODING 8844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +88 +A8 +E8 +F8 +E8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni228D +ENCODING 8845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +88 +88 +88 +A8 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni228E +ENCODING 8846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +88 +A8 +A8 +F8 +A8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +08 +08 +08 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +80 +80 +80 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +08 +F8 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +A8 +F8 +A8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +F8 +88 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +D8 +A8 +D8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +98 +A8 +C8 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +A8 +88 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +A8 +D8 +A8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni229B +ENCODING 8859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +D8 +A8 +D8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +F8 +88 +F8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +88 +F8 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +A8 +F8 +A8 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +88 +F8 +88 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +D8 +A8 +D8 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +88 +A8 +88 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +F8 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +F8 +80 +F8 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +A8 +A8 +A8 +AC +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +A0 +B8 +A0 +B8 +A0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +90 +90 +F8 +A0 +A0 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +88 +88 +F8 +90 +F8 +A0 +A0 +80 +00 +00 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +A8 +A8 +BC +B0 +B0 +A0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A4 +A4 +BC +A8 +BC +B0 +B0 +A0 +00 +00 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +08 +10 +E0 +10 +08 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +80 +40 +38 +40 +80 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +68 +88 +68 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +B0 +88 +B0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +18 +68 +88 +68 +18 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +C0 +B0 +88 +B0 +C0 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +B8 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +E8 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +E8 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22B9 +ENCODING 8889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +D8 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22BA +ENCODING 8890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +88 +88 +50 +50 +20 +20 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +20 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +88 +88 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +80 +80 +80 +C0 +A0 +F8 +00 +00 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +18 +28 +28 +48 +F8 +00 +00 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +30 +30 +30 +48 +48 +48 +84 +84 +84 +84 +00 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +84 +84 +84 +84 +48 +48 +48 +30 +30 +30 +30 +00 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +48 +84 +84 +84 +84 +84 +84 +84 +84 +84 +00 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +48 +30 +00 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +50 +88 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +70 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +88 +50 +F8 +50 +88 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +88 +D8 +A8 +D8 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +88 +D0 +A0 +D0 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +88 +58 +28 +58 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +40 +20 +50 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +20 +50 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +A8 +48 +00 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +50 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +20 +20 +50 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +38 +40 +98 +A0 +98 +40 +38 +00 +00 +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +E0 +10 +C8 +28 +C8 +10 +E0 +00 +00 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +A8 +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +A8 +A8 +A8 +A8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni22D4 +ENCODING 8916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +00 +00 +ENDCHAR +STARTCHAR uni22D5 +ENCODING 8917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +50 +F8 +50 +50 +F8 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +20 +40 +88 +40 +20 +10 +08 +00 +00 +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +40 +20 +10 +88 +10 +20 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +14 +28 +54 +A8 +54 +28 +14 +00 +00 +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +A0 +50 +A8 +54 +A8 +50 +A0 +00 +00 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +00 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +18 +60 +80 +60 +18 +00 +00 +00 +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +00 +C0 +30 +08 +30 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +10 +E8 +10 +E0 +10 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +40 +B8 +40 +38 +40 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni22E0 +ENCODING 8928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +28 +30 +E0 +30 +E8 +30 +28 +20 +00 +ENDCHAR +STARTCHAR uni22E1 +ENCODING 8929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A0 +60 +38 +60 +B8 +60 +A0 +20 +00 +ENDCHAR +STARTCHAR uni22E2 +ENCODING 8930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +F8 +A0 +A0 +A0 +F8 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni22E3 +ENCODING 8931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +F8 +28 +28 +28 +F8 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni22E4 +ENCODING 8932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +80 +80 +80 +F8 +10 +F8 +40 +00 +00 +ENDCHAR +STARTCHAR uni22E5 +ENCODING 8933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +08 +F8 +10 +F8 +40 +00 +00 +ENDCHAR +STARTCHAR uni22E6 +ENCODING 8934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +60 +80 +60 +38 +20 +68 +A8 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E7 +ENCODING 8935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +30 +08 +30 +E0 +20 +68 +A8 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E8 +ENCODING 8936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +E0 +10 +28 +20 +68 +A8 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E9 +ENCODING 8937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +40 +38 +40 +A0 +20 +68 +A8 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22EA +ENCODING 8938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +38 +68 +A8 +68 +38 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni22EB +ENCODING 8939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +E0 +B0 +A8 +B0 +E0 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni22EC +ENCODING 8940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +38 +68 +A8 +68 +38 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni22ED +ENCODING 8941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +E0 +B0 +A8 +B0 +E0 +20 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +00 +00 +20 +00 +00 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +A8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +00 +20 +00 +80 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +00 +20 +00 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +68 +90 +A8 +48 +B0 +00 +00 +ENDCHAR +STARTCHAR uni2301 +ENCODING 8961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +30 +A8 +60 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +50 +50 +88 +88 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2303 +ENCODING 8963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2304 +ENCODING 8964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +88 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni2305 +ENCODING 8965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +20 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni2306 +ENCODING 8966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +00 +F8 +00 +20 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni2307 +ENCODING 8967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +20 +20 +10 +10 +20 +20 +10 +00 +00 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +70 +00 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR uni230C +ENCODING 8972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni230D +ENCODING 8973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +C0 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni230E +ENCODING 8974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +18 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni230F +ENCODING 8975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +C0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +80 +80 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2311 +ENCODING 8977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +88 +70 +50 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2312 +ENCODING 8978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2313 +ENCODING 8979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2314 +ENCODING 8980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2315 +ENCODING 8981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +50 +88 +A8 +50 +A0 +00 +00 +ENDCHAR +STARTCHAR uni2316 +ENCODING 8982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +70 +A8 +F8 +A8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2317 +ENCODING 8983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +50 +50 +F8 +50 +50 +F8 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni2318 +ENCODING 8984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +A8 +70 +20 +70 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni2319 +ENCODING 8985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +80 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +50 +70 +A8 +B8 +88 +70 +50 +70 +00 +00 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +88 +70 +20 +20 +50 +A8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +E0 +80 +80 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +38 +08 +08 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +80 +80 +E0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +08 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2322 +ENCODING 8994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +88 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2323 +ENCODING 8995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +70 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2324 +ENCODING 8996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +D8 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni2325 +ENCODING 8997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +C0 +20 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2326 +ENCODING 8998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F0 +D8 +A4 +D8 +F0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2327 +ENCODING 8999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +D8 +A8 +D8 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2328 +ENCODING 9000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +FC +84 +AC +84 +AC +84 +AC +84 +AC +84 +FC +00 +ENDCHAR +STARTCHAR angleleft +ENCODING 9001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +10 +10 +20 +20 +40 +20 +20 +10 +10 +08 +00 +ENDCHAR +STARTCHAR angleright +ENCODING 9002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +20 +10 +10 +08 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR uni232B +ENCODING 9003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +3C +6C +94 +6C +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni232C +ENCODING 9004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +50 +88 +88 +88 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni232D +ENCODING 9005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +20 +60 +D8 +30 +20 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni232E +ENCODING 9006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +BC +A8 +70 +40 +C0 +E0 +C0 +00 +00 +ENDCHAR +STARTCHAR uni232F +ENCODING 9007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +00 +F8 +00 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2330 +ENCODING 9008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +FC +48 +48 +48 +90 +90 +90 +F0 +00 +00 +ENDCHAR +STARTCHAR uni2331 +ENCODING 9009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +A8 +FC +A8 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni2332 +ENCODING 9010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +60 +50 +FC +50 +60 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni2333 +ENCODING 9011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +80 +C0 +A0 +90 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2334 +ENCODING 9012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +84 +84 +84 +84 +FC +00 +00 +ENDCHAR +STARTCHAR uni2335 +ENCODING 9013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +88 +88 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni2336 +ENCODING 9014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2337 +ENCODING 9015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +48 +48 +48 +48 +48 +48 +48 +48 +48 +78 +00 +ENDCHAR +STARTCHAR uni2338 +ENCODING 9016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +88 +F8 +88 +F8 +88 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2339 +ENCODING 9017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +A8 +88 +F8 +88 +A8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni233A +ENCODING 9018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +A8 +D8 +88 +D8 +A8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni233B +ENCODING 9019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +88 +A8 +D8 +A8 +88 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni233C +ENCODING 9020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +A8 +D8 +88 +88 +88 +D8 +A8 +88 +F8 +00 +ENDCHAR +STARTCHAR uni233D +ENCODING 9021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni233E +ENCODING 9022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +A8 +D8 +A8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni233F +ENCODING 9023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +10 +10 +F8 +40 +40 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni2340 +ENCODING 9024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +40 +40 +F8 +10 +10 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni2341 +ENCODING 9025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +98 +98 +98 +A8 +A8 +A8 +C8 +C8 +C8 +F8 +00 +ENDCHAR +STARTCHAR uni2342 +ENCODING 9026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +C8 +C8 +C8 +A8 +A8 +A8 +98 +98 +98 +F8 +00 +ENDCHAR +STARTCHAR uni2343 +ENCODING 9027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +98 +A8 +C8 +A8 +98 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2344 +ENCODING 9028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +C8 +A8 +98 +A8 +C8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2345 +ENCODING 9029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +30 +50 +F8 +50 +30 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni2346 +ENCODING 9030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +60 +50 +F8 +50 +60 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni2347 +ENCODING 9031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +A8 +C8 +F8 +C8 +A8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2348 +ENCODING 9032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +A8 +98 +F8 +98 +A8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2349 +ENCODING 9033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +70 +C8 +A8 +98 +70 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni234A +ENCODING 9034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +F8 +00 +F8 +00 +ENDCHAR +STARTCHAR uni234B +ENCODING 9035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +70 +70 +A8 +F8 +20 +20 +00 +ENDCHAR +STARTCHAR uni234C +ENCODING 9036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +88 +D8 +D8 +A8 +A8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni234D +ENCODING 9037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +A8 +A8 +D8 +D8 +F8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni234E +ENCODING 9038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +70 +A8 +A8 +70 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni234F +ENCODING 9039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +20 +20 +F8 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2350 +ENCODING 9040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +A8 +F8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +00 +ENDCHAR +STARTCHAR uni2351 +ENCODING 9041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2352 +ENCODING 9042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +F8 +A8 +70 +70 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR uni2353 +ENCODING 9043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2354 +ENCODING 9044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +F8 +D8 +D8 +A8 +A8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2355 +ENCODING 9045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +20 +20 +70 +A8 +A8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2356 +ENCODING 9046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +F8 +20 +20 +A8 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2357 +ENCODING 9047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +A8 +F8 +00 +ENDCHAR +STARTCHAR uni2358 +ENCODING 9048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +00 +00 +00 +00 +00 +00 +F8 +00 +ENDCHAR +STARTCHAR uni2359 +ENCODING 9049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +50 +50 +50 +88 +88 +F8 +00 +F8 +00 +ENDCHAR +STARTCHAR uni235A +ENCODING 9050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +50 +88 +50 +20 +00 +F8 +00 +ENDCHAR +STARTCHAR uni235B +ENCODING 9051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +50 +20 +00 +00 +00 +F8 +00 +ENDCHAR +STARTCHAR uni235C +ENCODING 9052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +F8 +00 +ENDCHAR +STARTCHAR uni235D +ENCODING 9053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +A8 +D8 +A8 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni235E +ENCODING 9054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +A8 +A8 +A8 +88 +88 +88 +88 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni235F +ENCODING 9055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +A8 +F8 +A8 +D8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2360 +ENCODING 9056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +88 +A8 +88 +88 +A8 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2361 +ENCODING 9057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2362 +ENCODING 9058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +F8 +88 +88 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2363 +ENCODING 9059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +20 +20 +F8 +70 +70 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni2364 +ENCODING 9060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +00 +20 +50 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2365 +ENCODING 9061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +70 +88 +88 +88 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2366 +ENCODING 9062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2367 +ENCODING 9063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +78 +90 +90 +90 +90 +78 +10 +10 +00 +ENDCHAR +STARTCHAR uni2368 +ENCODING 9064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +00 +00 +40 +A8 +A8 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni2369 +ENCODING 9065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +50 +50 +00 +00 +C0 +30 +08 +30 +C0 +00 +00 +00 +ENDCHAR +STARTCHAR uni236A +ENCODING 9066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +00 +30 +20 +40 +00 +ENDCHAR +STARTCHAR uni236B +ENCODING 9067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +88 +50 +58 +A8 +B0 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni236C +ENCODING 9068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +88 +E8 +B8 +88 +88 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni236D +ENCODING 9069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +68 +A8 +B0 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni236E +ENCODING 9070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +70 +20 +00 +00 +30 +20 +40 +F8 +00 +ENDCHAR +STARTCHAR uni236F +ENCODING 9071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +98 +98 +F8 +A8 +F8 +C8 +C8 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2370 +ENCODING 9072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +A8 +D8 +98 +A8 +A8 +88 +A8 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2371 +ENCODING 9073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +E8 +B8 +88 +50 +50 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2372 +ENCODING 9074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +50 +50 +88 +E8 +B8 +88 +00 +00 +ENDCHAR +STARTCHAR uni2373 +ENCODING 9075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +20 +20 +20 +20 +10 +00 +00 +ENDCHAR +STARTCHAR uni2374 +ENCODING 9076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni2375 +ENCODING 9077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +88 +A8 +A8 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni2376 +ENCODING 9078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +68 +90 +90 +90 +90 +68 +00 +F8 +00 +ENDCHAR +STARTCHAR uni2377 +ENCODING 9079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +60 +80 +88 +70 +00 +F8 +00 +ENDCHAR +STARTCHAR uni2378 +ENCODING 9080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +20 +20 +20 +10 +00 +F8 +00 +ENDCHAR +STARTCHAR uni2379 +ENCODING 9081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +88 +A8 +A8 +A8 +50 +00 +F8 +00 +ENDCHAR +STARTCHAR uni237A +ENCODING 9082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +68 +90 +90 +90 +90 +68 +00 +00 +ENDCHAR +STARTCHAR uni237B +ENCODING 9083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +38 +1C +90 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni237D +ENCODING 9085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +D8 +70 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni237E +ENCODING 9086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +F8 +50 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni237F +ENCODING 9087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +70 +F8 +F8 +F8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2380 +ENCODING 9088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +08 +78 +88 +88 +78 +00 +88 +50 +20 +ENDCHAR +STARTCHAR uni2381 +ENCODING 9089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +10 +70 +90 +90 +74 +00 +FC +ENDCHAR +STARTCHAR uni2382 +ENCODING 9090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +24 +6C +B4 +B4 +6C +00 +6C +ENDCHAR +STARTCHAR uni2383 +ENCODING 9091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +94 +30 +D4 +50 +B4 +00 +00 +ENDCHAR +STARTCHAR uni2384 +ENCODING 9092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +D4 +D4 +D4 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2385 +ENCODING 9093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +F8 +A8 +A8 +A8 +A8 +A8 +F8 +20 +00 +00 +ENDCHAR +STARTCHAR uni2386 +ENCODING 9094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +50 +88 +24 +F4 +24 +88 +50 +20 +00 +ENDCHAR +STARTCHAR uni2387 +ENCODING 9095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +1C +28 +40 +9C +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2388 +ENCODING 9096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +A8 +70 +A8 +70 +A8 +20 +00 +00 +ENDCHAR +STARTCHAR uni2389 +ENCODING 9097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +84 +84 +CC +B4 +78 +00 +00 +ENDCHAR +STARTCHAR uni238A +ENCODING 9098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +78 +84 +FC +CC +B4 +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni238B +ENCODING 9099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +E8 +C4 +A4 +14 +84 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni238C +ENCODING 9100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F0 +C8 +00 +50 +A8 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni238D +ENCODING 9101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +50 +50 +50 +50 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni238E +ENCODING 9102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +78 +50 +50 +50 +50 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni238F +ENCODING 9103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +20 +50 +88 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2390 +ENCODING 9104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +88 +50 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2391 +ENCODING 9105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +20 +50 +F8 +50 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2392 +ENCODING 9106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +F8 +50 +20 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni2393 +ENCODING 9107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +A8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2394 +ENCODING 9108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +48 +84 +84 +84 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni2395 +ENCODING 9109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +00 +ENDCHAR +STARTCHAR uni2396 +ENCODING 9110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +78 +70 +70 +60 +60 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni2397 +ENCODING 9111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +48 +28 +48 +F8 +48 +28 +48 +78 +00 +00 +ENDCHAR +STARTCHAR uni2398 +ENCODING 9112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +90 +A0 +90 +F8 +90 +A0 +90 +F0 +00 +00 +ENDCHAR +STARTCHAR uni2399 +ENCODING 9113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +38 +68 +48 +CC +CC +CC +FC +FC +00 +00 +ENDCHAR +STARTCHAR uni239A +ENCODING 9114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +78 +84 +94 +A4 +84 +78 +00 +00 +00 +ENDCHAR +STARTCHAR uni2400 +ENCODING 9216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +D0 +B0 +90 +50 +50 +70 +20 +20 +20 +38 +00 +ENDCHAR +STARTCHAR uni2401 +ENCODING 9217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +80 +40 +20 +E0 +50 +50 +20 +28 +38 +28 +00 +ENDCHAR +STARTCHAR uni2402 +ENCODING 9218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +80 +40 +20 +C0 +70 +20 +20 +28 +10 +28 +00 +ENDCHAR +STARTCHAR uni2403 +ENCODING 9219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +E0 +80 +C0 +80 +E0 +70 +20 +20 +28 +10 +28 +00 +ENDCHAR +STARTCHAR uni2404 +ENCODING 9220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +E0 +80 +C0 +80 +E0 +50 +50 +20 +38 +10 +10 +00 +ENDCHAR +STARTCHAR uni2405 +ENCODING 9221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +E0 +80 +C0 +80 +E0 +68 +58 +48 +10 +28 +28 +38 +18 +ENDCHAR +STARTCHAR uni2406 +ENCODING 9222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +A0 +E0 +A0 +30 +40 +30 +00 +28 +30 +28 +00 +ENDCHAR +STARTCHAR uni2407 +ENCODING 9223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +A0 +C0 +A0 +F0 +40 +60 +40 +70 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +A0 +C0 +A0 +D8 +20 +10 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +E0 +A0 +A0 +38 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +E0 +38 +20 +30 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +A0 +A0 +40 +40 +38 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E0 +80 +C0 +80 +B8 +20 +30 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +80 +80 +60 +30 +28 +30 +28 +28 +00 +00 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +80 +40 +20 +D0 +28 +28 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +60 +80 +40 +20 +F8 +10 +10 +10 +38 +00 +00 +ENDCHAR +STARTCHAR uni2410 +ENCODING 9232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +A0 +A0 +C0 +40 +40 +40 +70 +38 +20 +30 +20 +38 +ENDCHAR +STARTCHAR uni2411 +ENCODING 9233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +40 +30 +00 +10 +30 +10 +38 +ENDCHAR +STARTCHAR uni2412 +ENCODING 9234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +40 +30 +00 +30 +08 +10 +38 +ENDCHAR +STARTCHAR uni2413 +ENCODING 9235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +40 +30 +10 +28 +10 +08 +30 +ENDCHAR +STARTCHAR uni2414 +ENCODING 9236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +40 +30 +00 +20 +30 +38 +10 +ENDCHAR +STARTCHAR uni2415 +ENCODING 9237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +90 +D0 +B0 +00 +20 +50 +70 +50 +00 +28 +30 +30 +28 +ENDCHAR +STARTCHAR uni2416 +ENCODING 9238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +60 +80 +40 +20 +C0 +50 +50 +20 +20 +48 +68 +58 +48 +ENDCHAR +STARTCHAR uni2417 +ENCODING 9239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +20 +30 +28 +30 +28 +30 +ENDCHAR +STARTCHAR uni2418 +ENCODING 9240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +70 +80 +80 +70 +20 +50 +70 +50 +00 +68 +58 +48 +00 +ENDCHAR +STARTCHAR uni2419 +ENCODING 9241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +E0 +80 +C0 +80 +E0 +00 +50 +70 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni241A +ENCODING 9242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +60 +80 +40 +20 +C0 +50 +50 +20 +30 +28 +30 +28 +30 +ENDCHAR +STARTCHAR uni241B +ENCODING 9243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +E0 +80 +C0 +80 +F0 +40 +20 +10 +78 +20 +20 +18 +00 +ENDCHAR +STARTCHAR uni241C +ENCODING 9244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +E0 +80 +C0 +80 +98 +20 +10 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni241D +ENCODING 9245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +70 +80 +B0 +90 +60 +18 +20 +10 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni241E +ENCODING 9246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +A0 +C0 +A0 +A0 +18 +20 +10 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni241F +ENCODING 9247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +90 +90 +90 +90 +60 +18 +20 +10 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +60 +80 +40 +20 +C0 +30 +28 +30 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2421 +ENCODING 9249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +A0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +00 +ENDCHAR +STARTCHAR uni2422 +ENCODING 9250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +50 +60 +40 +F0 +48 +48 +48 +70 +00 +00 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +90 +D0 +B0 +90 +20 +20 +20 +20 +38 +00 +00 +ENDCHAR +STARTCHAR uni2425 +ENCODING 9253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +48 +90 +90 +20 +48 +48 +90 +90 +00 +00 +ENDCHAR +STARTCHAR uni2426 +ENCODING 9254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +88 +80 +40 +20 +20 +00 +20 +00 +00 +ENDCHAR +STARTCHAR uni2440 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +28 +28 +28 +20 +A0 +A0 +A0 +E0 +00 +00 +ENDCHAR +STARTCHAR uni2441 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +F8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni2442 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +F8 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2443 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +F8 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni2444 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +A8 +A8 +20 +20 +20 +A8 +A8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2445 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +D8 +A8 +D8 +88 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2446 +ENCODING 9286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +18 +18 +D8 +C0 +C0 +D8 +18 +18 +00 +00 +ENDCHAR +STARTCHAR uni2447 +ENCODING 9287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +18 +18 +18 +20 +20 +20 +C0 +C0 +C0 +00 +00 +ENDCHAR +STARTCHAR uni2448 +ENCODING 9288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +0C +AC +AC +AC +A0 +A0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2449 +ENCODING 9289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +A8 +A8 +A8 +A8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni244A +ENCODING 9290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +90 +90 +90 +90 +48 +48 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni2460 +ENCODING 9312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2461 +ENCODING 9313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2462 +ENCODING 9314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +A8 +98 +E8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2463 +ENCODING 9315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2464 +ENCODING 9316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2465 +ENCODING 9317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2466 +ENCODING 9318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2467 +ENCODING 9319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2468 +ENCODING 9320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2469 +ENCODING 9321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni246A +ENCODING 9322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +D4 +D4 +D4 +D4 +D4 +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni246B +ENCODING 9323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +D4 +CC +CC +D4 +DC +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni246C +ENCODING 9324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +D4 +CC +D4 +CC +D4 +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni246D +ENCODING 9325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +D4 +D4 +DC +DC +CC +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni246E +ENCODING 9326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +DC +D4 +DC +CC +DC +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni246F +ENCODING 9327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +D4 +D4 +DC +D4 +CC +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni2470 +ENCODING 9328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +DC +CC +D4 +D4 +D4 +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni2471 +ENCODING 9329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +CC +D4 +CC +D4 +CC +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni2472 +ENCODING 9330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +CC +D4 +CC +C4 +DC +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni2473 +ENCODING 9331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +FC +B4 +B4 +D4 +FC +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni2474 +ENCODING 9332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +A8 +E8 +A8 +A8 +F8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni2475 +ENCODING 9333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +A8 +D8 +98 +A8 +F8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni2476 +ENCODING 9334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +A8 +D8 +A8 +98 +E8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni2477 +ENCODING 9335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +C8 +C8 +E8 +F8 +A8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni2478 +ENCODING 9336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +F8 +C8 +E8 +98 +E8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni2479 +ENCODING 9337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +B8 +C8 +E8 +D8 +A8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni247A +ENCODING 9338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +F8 +98 +A8 +A8 +A8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni247B +ENCODING 9339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +A8 +D8 +A8 +D8 +A8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni247C +ENCODING 9340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +88 +A8 +D8 +B8 +98 +E8 +88 +50 +00 +00 +ENDCHAR +STARTCHAR uni247D +ENCODING 9341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +D4 +EC +EC +EC +D4 +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni247E +ENCODING 9342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +D4 +D4 +D4 +D4 +D4 +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni247F +ENCODING 9343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +D4 +CC +CC +D4 +DC +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni2480 +ENCODING 9344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +D4 +CC +D4 +CC +D4 +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni2481 +ENCODING 9345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +D4 +D4 +DC +DC +CC +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni2482 +ENCODING 9346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +DC +D4 +DC +CC +DC +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni2483 +ENCODING 9347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +D4 +D4 +DC +D4 +CC +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni2484 +ENCODING 9348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +DC +CC +D4 +D4 +D4 +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni2485 +ENCODING 9349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +CC +D4 +CC +D4 +CC +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni2486 +ENCODING 9350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +84 +CC +D4 +CC +C4 +DC +84 +48 +00 +00 +ENDCHAR +STARTCHAR uni24EA +ENCODING 9450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +D8 +D8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +A8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +A8 +A8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +00 +00 +20 +20 +00 +00 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +30 +00 +00 +30 +30 +00 +00 +30 +30 +00 +00 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +A8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +A8 +A8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +00 +20 +20 +00 +20 +20 +00 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +00 +30 +30 +00 +30 +30 +00 +30 +30 +00 +00 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +3C +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +3C +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +F0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +3C +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +3C +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +3C +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +3C +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +3C +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +3C +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +3C +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +3C +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +F0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +D8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +00 +00 +00 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +00 +00 +00 +30 +30 +30 +30 +00 +00 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +FC +00 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +20 +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +7C +40 +5C +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +E0 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F0 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F0 +10 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +20 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +7C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +5C +40 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +F0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +F0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +20 +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +5C +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +5C +40 +5C +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +FC +00 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +FC +00 +DC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +00 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +10 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +80 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +40 +80 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +10 +0C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +E0 +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +1C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +E0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +F8 +F8 +F8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +A8 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +88 +F8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +A8 +A8 +A8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +A8 +F8 +A8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +C8 +A8 +98 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +98 +A8 +C8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +D8 +A8 +D8 +F8 +00 +00 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +70 +70 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +50 +70 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +FC +FC +FC +FC +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +FC +84 +84 +84 +FC +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +78 +00 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +48 +48 +48 +48 +48 +48 +48 +48 +48 +78 +00 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +78 +F0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +48 +F0 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +70 +70 +70 +F8 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +50 +50 +50 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +70 +70 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +50 +50 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +C0 +E0 +F0 +F8 +F0 +E0 +C0 +80 +00 +00 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +C0 +A0 +90 +88 +90 +A0 +C0 +80 +00 +00 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +40 +60 +70 +60 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +40 +60 +50 +60 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +F0 +FC +F0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +B0 +8C +B0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +F8 +F8 +70 +70 +70 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +88 +50 +50 +50 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +70 +70 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +50 +50 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +18 +38 +78 +F8 +78 +38 +18 +08 +00 +00 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +18 +28 +48 +88 +48 +28 +18 +08 +00 +00 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +30 +70 +30 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +30 +50 +30 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +0C +3C +FC +3C +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +0C +34 +C4 +34 +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +70 +F8 +70 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +88 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +A8 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +48 +B4 +B4 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +50 +50 +88 +50 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +48 +84 +84 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +08 +80 +04 +40 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +A8 +A8 +A8 +70 +00 +00 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +A8 +D8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +78 +FC +FC +78 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +68 +E4 +E4 +68 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +58 +9C +9C +58 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +48 +84 +FC +78 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +78 +FC +84 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +58 +9C +84 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +58 +9C +FC +78 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +04 +1C +3C +3C +7C +7C +3C +3C +1C +04 +00 +00 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +80 +E0 +F0 +F0 +F8 +F8 +F0 +F0 +E0 +80 +00 +00 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +FC +FC +CC +B4 +78 +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DA +ENCODING 9690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +FC +FC +CC +B4 +78 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25DB +ENCODING 9691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +40 +80 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +08 +04 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +04 +08 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +80 +40 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +48 +84 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +84 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +18 +38 +78 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +80 +C0 +E0 +F0 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +F0 +E0 +C0 +80 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +78 +38 +18 +08 +00 +00 +00 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +88 +70 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +E8 +E8 +E8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +B8 +B8 +B8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +F8 +E8 +C8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +98 +B8 +F8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +A8 +A8 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +50 +50 +70 +A8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +70 +70 +70 +E8 +E8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +70 +70 +70 +B8 +B8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +30 +48 +84 +84 +84 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +A8 +E8 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +E8 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +B8 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +A8 +B8 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +A8 +E8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +E8 +A8 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +B8 +A8 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +A8 +B8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +88 +20 +70 +20 +88 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2601 +ENCODING 9729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +F8 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +F8 +F8 +20 +20 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni2603 +ENCODING 9731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +A0 +20 +74 +50 +A8 +50 +54 +70 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2604 +ENCODING 9732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +48 +50 +54 +44 +08 +60 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +70 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +50 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2607 +ENCODING 9735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +20 +40 +80 +40 +28 +18 +38 +00 +00 +ENDCHAR +STARTCHAR uni2608 +ENCODING 9736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +88 +90 +90 +A0 +A0 +98 +98 +B8 +00 +00 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +70 +88 +A8 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +88 +50 +50 +A8 +50 +00 +00 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +A8 +50 +50 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +70 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +48 +48 +30 +20 +60 +90 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +F8 +A8 +70 +F8 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +A8 +A8 +70 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +FC +84 +84 +84 +84 +84 +84 +84 +FC +00 +00 +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +FC +84 +8C +8C +94 +94 +D4 +A4 +FC +00 +00 +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +FC +CC +CC +B4 +B4 +B4 +CC +CC +FC +00 +00 +ENDCHAR +STARTCHAR uni2613 +ENCODING 9747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +50 +50 +20 +50 +50 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni2619 +ENCODING 9753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +24 +74 +F8 +E8 +F4 +74 +28 +00 +00 +ENDCHAR +STARTCHAR uni261A +ENCODING 9754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +7C +7C +3C +00 +00 +00 +ENDCHAR +STARTCHAR uni261B +ENCODING 9755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +F8 +F8 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni261C +ENCODING 9756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +4C +4C +3C +00 +00 +00 +ENDCHAR +STARTCHAR uni261D +ENCODING 9757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +18 +78 +68 +48 +48 +78 +78 +00 +00 +ENDCHAR +STARTCHAR uni261E +ENCODING 9758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +C8 +C8 +F0 +00 +00 +00 +ENDCHAR +STARTCHAR uni261F +ENCODING 9759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +78 +48 +48 +68 +78 +18 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni2620 +ENCODING 9760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +F8 +50 +70 +20 +88 +70 +88 +00 +00 +ENDCHAR +STARTCHAR uni2621 +ENCODING 9761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +08 +08 +10 +20 +40 +80 +80 +78 +00 +00 +ENDCHAR +STARTCHAR uni2622 +ENCODING 9762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +D8 +D8 +A8 +A8 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni2623 +ENCODING 9763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +A8 +50 +50 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni2624 +ENCODING 9764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +F8 +50 +70 +50 +70 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni2625 +ENCODING 9765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +50 +50 +20 +F8 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2626 +ENCODING 9766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +20 +F8 +20 +60 +30 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2627 +ENCODING 9767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +28 +28 +30 +A8 +70 +20 +70 +A8 +00 +00 +ENDCHAR +STARTCHAR uni2628 +ENCODING 9768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +20 +F8 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2629 +ENCODING 9769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +20 +A8 +F8 +A8 +20 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +E4 +C8 +DC +C8 +D4 +C0 +E4 +78 +00 +00 +ENDCHAR +STARTCHAR uni262B +ENCODING 9771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +A8 +50 +00 +20 +A8 +A8 +A8 +A8 +A8 +70 +70 +00 +00 +ENDCHAR +STARTCHAR uni262C +ENCODING 9772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +A8 +F8 +A8 +F8 +A8 +70 +A8 +00 +00 +ENDCHAR +STARTCHAR uni262D +ENCODING 9773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +28 +68 +C8 +A8 +18 +48 +B4 +00 +00 +ENDCHAR +STARTCHAR uni262E +ENCODING 9774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +A8 +A8 +A8 +A8 +F8 +A8 +A8 +70 +00 +00 +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +84 +EC +A4 +FC +78 +00 +00 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +F8 +00 +F8 +F8 +00 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D8 +D8 +00 +F8 +F8 +00 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +F8 +00 +D8 +D8 +00 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +F8 +00 +F8 +F8 +00 +D8 +D8 +00 +00 +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D8 +D8 +00 +F8 +F8 +00 +D8 +D8 +00 +00 +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +F8 +00 +D8 +D8 +00 +D8 +D8 +00 +00 +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +00 +ENDCHAR +STARTCHAR uni2638 +ENCODING 9784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +A8 +70 +D8 +70 +A8 +20 +00 +00 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +CC +84 +B4 +84 +B4 +CC +84 +78 +00 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +CC +84 +B4 +84 +CC +B4 +84 +78 +00 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +FC +B4 +FC +CC +FC +B4 +CC +78 +00 +00 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +88 +20 +50 +20 +88 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +C8 +28 +28 +28 +28 +28 +C8 +70 +00 +00 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +98 +A0 +A0 +A0 +A0 +A0 +98 +70 +00 +00 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +70 +88 +88 +88 +70 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +88 +88 +70 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +70 +20 +70 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +1C +0C +74 +88 +88 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +48 +A8 +28 +28 +48 +F8 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +E0 +40 +50 +68 +48 +48 +50 +50 +00 +00 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +A8 +A8 +F8 +A8 +A8 +A8 +20 +50 +20 +00 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +FC +A8 +A8 +A8 +70 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +A8 +A8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +50 +20 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +50 +50 +50 +50 +F8 +00 +00 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +48 +A0 +40 +10 +28 +90 +60 +00 +00 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +88 +88 +48 +28 +68 +A8 +48 +04 +00 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +AC +FC +AC +AC +AC +AC +A8 +A8 +A8 +18 +28 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +88 +50 +50 +D8 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A8 +F8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +0C +00 +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +18 +A8 +40 +A0 +00 +00 +00 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +90 +A8 +B0 +C8 +88 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +54 +A8 +00 +00 +54 +A8 +00 +00 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +50 +50 +50 +F8 +50 +50 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +70 +70 +A8 +F8 +88 +50 +50 +F8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +A8 +F8 +88 +F8 +50 +50 +88 +F8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A8 +F8 +88 +50 +50 +50 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +70 +D8 +88 +50 +50 +70 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +38 +68 +88 +E8 +28 +38 +48 +78 +00 +00 +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +50 +20 +50 +50 +70 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +70 +70 +A8 +F8 +F8 +70 +70 +F8 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +A8 +F8 +F8 +F8 +70 +70 +F8 +F8 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A8 +F8 +F8 +70 +70 +70 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +70 +70 +D8 +88 +50 +50 +70 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +38 +58 +F8 +F8 +38 +38 +78 +78 +00 +00 +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +70 +20 +70 +70 +70 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +70 +70 +F8 +F8 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +A8 +A8 +88 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +50 +88 +50 +50 +20 +00 +00 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +20 +A8 +F8 +F8 +A8 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +50 +50 +88 +F8 +20 +70 +00 +00 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +F8 +F8 +F8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +70 +70 +F8 +70 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +50 +20 +70 +A8 +70 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni2668 +ENCODING 9832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +90 +48 +90 +48 +00 +50 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +10 +10 +10 +10 +70 +F0 +60 +00 +00 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +18 +14 +10 +10 +10 +70 +F0 +60 +00 +00 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +60 +50 +48 +48 +C8 +C8 +18 +18 +00 +00 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +60 +50 +68 +58 +C8 +C8 +18 +18 +00 +00 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +B0 +C8 +88 +88 +90 +E0 +00 +00 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +88 +98 +A8 +C8 +98 +A8 +C8 +88 +08 +00 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +58 +70 +D0 +50 +58 +70 +D0 +40 +00 +00 +ENDCHAR +STARTCHAR uni2670 +ENCODING 9840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +20 +A8 +70 +A8 +20 +20 +20 +50 +00 +00 +ENDCHAR +STARTCHAR uni2671 +ENCODING 9841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +50 +20 +A8 +D8 +A8 +20 +20 +20 +50 +20 +00 +ENDCHAR +STARTCHAR uni2701 +ENCODING 9985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +50 +20 +50 +BC +48 +00 +00 +ENDCHAR +STARTCHAR uni2702 +ENCODING 9986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +40 +A4 +68 +10 +68 +A4 +40 +00 +00 +ENDCHAR +STARTCHAR uni2703 +ENCODING 9987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +48 +BC +50 +20 +50 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2704 +ENCODING 9988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +40 +AC +78 +10 +78 +AC +40 +00 +00 +ENDCHAR +STARTCHAR uni2706 +ENCODING 9990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +84 +B4 +B4 +A4 +A4 +A4 +B4 +B4 +44 +78 +00 +ENDCHAR +STARTCHAR uni2708 +ENCODING 9992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +10 +90 +FC +90 +10 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2713 +ENCODING 10003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +04 +04 +08 +08 +08 +90 +50 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2714 +ENCODING 10004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +0C +0C +0C +18 +18 +98 +D8 +70 +30 +00 +00 +ENDCHAR +STARTCHAR uni2715 +ENCODING 10005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +88 +50 +20 +50 +88 +00 +00 +ENDCHAR +STARTCHAR uni2716 +ENCODING 10006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +D8 +70 +70 +D8 +88 +00 +00 +ENDCHAR +STARTCHAR uni2717 +ENCODING 10007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +08 +90 +50 +20 +50 +48 +80 +00 +00 +ENDCHAR +STARTCHAR uni2718 +ENCODING 10008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +08 +98 +D0 +70 +70 +58 +C8 +80 +00 +00 +ENDCHAR +STARTCHAR uni2719 +ENCODING 10009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +30 +30 +FC +FC +30 +30 +30 +00 +00 +ENDCHAR +STARTCHAR uni271A +ENCODING 10010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +30 +30 +FC +FC +30 +30 +30 +00 +00 +ENDCHAR +STARTCHAR uni271B +ENCODING 10011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +D8 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni271C +ENCODING 10012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +30 +30 +CC +CC +30 +30 +30 +00 +00 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni271E +ENCODING 10014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +58 +DC +8C +DC +5C +58 +58 +78 +38 +00 +ENDCHAR +STARTCHAR uni271F +ENCODING 10015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +30 +30 +FC +FC +30 +30 +30 +30 +30 +00 +00 +ENDCHAR +STARTCHAR uni2720 +ENCODING 10016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +20 +A8 +F8 +A8 +20 +70 +00 +00 +ENDCHAR +STARTCHAR uni2722 +ENCODING 10018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +30 +30 +FC +FC +30 +30 +30 +00 +00 +ENDCHAR +STARTCHAR uni2723 +ENCODING 10019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +20 +A8 +F8 +A8 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2724 +ENCODING 10020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +20 +A8 +F8 +A8 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2725 +ENCODING 10021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +20 +A8 +F8 +A8 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2726 +ENCODING 10022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +70 +F8 +70 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2727 +ENCODING 10023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +88 +50 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2729 +ENCODING 10025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +50 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni272A +ENCODING 10026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +D8 +D8 +00 +88 +88 +70 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni272B +ENCODING 10027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +50 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni272C +ENCODING 10028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +70 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni272D +ENCODING 10029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +70 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni272E +ENCODING 10030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +70 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni272F +ENCODING 10031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +70 +70 +88 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2730 +ENCODING 10032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +30 +FC +58 +78 +CC +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2731 +ENCODING 10033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +70 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2732 +ENCODING 10034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +50 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2733 +ENCODING 10035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +F8 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2734 +ENCODING 10036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +F8 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2735 +ENCODING 10037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +F8 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2736 +ENCODING 10038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +70 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2737 +ENCODING 10039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +50 +50 +F8 +20 +F8 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni2738 +ENCODING 10040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +50 +70 +F8 +70 +F8 +70 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni273B +ENCODING 10043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +70 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni273C +ENCODING 10044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +50 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni273D +ENCODING 10045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +70 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni273E +ENCODING 10046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +50 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni273F +ENCODING 10047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +F8 +50 +70 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2743 +ENCODING 10051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +70 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2744 +ENCODING 10052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +70 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2745 +ENCODING 10053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +70 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2746 +ENCODING 10054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +70 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2747 +ENCODING 10055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +F8 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2748 +ENCODING 10056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +F8 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni2749 +ENCODING 10057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +A8 +70 +A8 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni274A +ENCODING 10058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +F8 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni274B +ENCODING 10059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +A8 +70 +F8 +70 +A8 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni274D +ENCODING 10061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +8C +8C +8C +8C +78 +00 +00 +ENDCHAR +STARTCHAR uni274F +ENCODING 10063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +8C +8C +FC +3C +00 +00 +ENDCHAR +STARTCHAR uni2750 +ENCODING 10064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +FC +8C +8C +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni2751 +ENCODING 10065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +8C +8C +8C +FC +7C +00 +00 +ENDCHAR +STARTCHAR uni2752 +ENCODING 10066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +7C +FC +8C +8C +8C +F8 +00 +00 +ENDCHAR +STARTCHAR uni2756 +ENCODING 10070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +20 +50 +F8 +50 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2758 +ENCODING 10072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2759 +ENCODING 10073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +00 +00 +ENDCHAR +STARTCHAR uni275A +ENCODING 10074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni275B +ENCODING 10075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +30 +40 +70 +70 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni275C +ENCODING 10076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +70 +70 +10 +60 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni275D +ENCODING 10077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +6C +90 +FC +FC +48 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni275E +ENCODING 10078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +48 +FC +FC +24 +D8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2761 +ENCODING 10081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +7C +E8 +E8 +78 +08 +68 +68 +48 +30 +00 +00 +ENDCHAR +STARTCHAR uni2762 +ENCODING 10082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +70 +70 +20 +20 +00 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2763 +ENCODING 10083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +F8 +F8 +70 +20 +00 +20 +70 +20 +00 +00 +ENDCHAR +STARTCHAR uni2764 +ENCODING 10084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +F8 +F8 +F8 +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni2765 +ENCODING 10085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +60 +F0 +F8 +7C +F8 +F0 +60 +00 +00 +ENDCHAR +STARTCHAR uni2766 +ENCODING 10086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +68 +B0 +10 +D8 +F8 +F0 +60 +68 +30 +00 +00 +ENDCHAR +STARTCHAR uni2767 +ENCODING 10087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +90 +B8 +7C +5C +BC +B8 +50 +00 +00 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +98 +D8 +D8 +88 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +A8 +D8 +E8 +98 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +FC +AC +94 +94 +94 +AC +FC +78 +00 +00 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +E8 +A8 +A8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +A8 +98 +E8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +00 +00 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +98 +D8 +D8 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +A8 +D8 +E8 +98 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +00 +00 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +FC +AC +94 +94 +94 +AC +FC +78 +00 +00 +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +18 +FC +FC +18 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +40 +28 +18 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +30 +F8 +30 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +38 +18 +28 +40 +80 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +20 +30 +FC +30 +20 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +30 +18 +FC +FC +18 +30 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +18 +FC +18 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +18 +FC +FC +18 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +18 +BC +BC +18 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +30 +B8 +BC +B8 +30 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +30 +F8 +FC +F8 +30 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni27A4 +ENCODING 10148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +70 +3C +70 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27A5 +ENCODING 10149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +B0 +F8 +FC +78 +30 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni27A6 +ENCODING 10150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +30 +78 +FC +F8 +B0 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni27A7 +ENCODING 10151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +20 +20 +30 +F0 +F8 +F8 +FC +F8 +F8 +F0 +30 +20 +20 +ENDCHAR +STARTCHAR uni27B2 +ENCODING 10162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +FC +DC +CC +04 +00 +04 +CC +DC +F8 +78 +00 +ENDCHAR +STARTCHAR uni27B4 +ENCODING 10164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +E0 +14 +0C +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27B5 +ENCODING 10165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +90 +C8 +7C +C8 +90 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27B6 +ENCODING 10166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +1C +0C +14 +E0 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27B7 +ENCODING 10167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +E0 +14 +0C +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27B8 +ENCODING 10168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +90 +C8 +7C +C8 +90 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27B9 +ENCODING 10169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +1C +0C +14 +E0 +20 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27BA +ENCODING 10170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +08 +FC +08 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27BB +ENCODING 10171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +C8 +FC +C8 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27BC +ENCODING 10172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +E8 +7C +E8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27BD +ENCODING 10173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D0 +D8 +7C +D8 +D0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni27BE +ENCODING 10174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +A0 +50 +28 +F4 +04 +F4 +28 +50 +A0 +00 +00 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +ENDCHAR +STARTCHAR uni3000 +ENCODING 12288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni3001 +ENCODING 12289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +40 +20 +00 +00 +ENDCHAR +STARTCHAR uni3002 +ENCODING 12290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +20 +50 +20 +00 +00 +ENDCHAR +STARTCHAR uni3003 +ENCODING 12291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +28 +28 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni3005 +ENCODING 12293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +20 +78 +48 +B0 +90 +00 +00 +ENDCHAR +STARTCHAR uni3006 +ENCODING 12294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +50 +A0 +B0 +C0 +80 +00 +00 +ENDCHAR +STARTCHAR uni3008 +ENCODING 12296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +10 +10 +20 +20 +40 +20 +20 +10 +10 +08 +00 +ENDCHAR +STARTCHAR uni3009 +ENCODING 12297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +20 +10 +10 +08 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR uni300A +ENCODING 12298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +14 +28 +28 +50 +50 +A0 +50 +50 +28 +28 +14 +00 +ENDCHAR +STARTCHAR uni300B +ENCODING 12299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +A0 +50 +50 +28 +28 +14 +28 +28 +50 +50 +A0 +00 +ENDCHAR +STARTCHAR uni300C +ENCODING 12300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +40 +40 +40 +40 +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR uni300D +ENCODING 12301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +10 +10 +10 +10 +10 +10 +70 +00 +00 +ENDCHAR +STARTCHAR uni300E +ENCODING 12302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +88 +B8 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +00 +00 +ENDCHAR +STARTCHAR uni300F +ENCODING 12303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +38 +28 +28 +28 +28 +28 +28 +E8 +88 +F8 +00 +ENDCHAR +STARTCHAR uni3010 +ENCODING 12304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +70 +70 +60 +60 +60 +60 +60 +70 +70 +78 +00 +ENDCHAR +STARTCHAR uni3011 +ENCODING 12305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +78 +38 +38 +18 +18 +18 +18 +18 +38 +38 +78 +00 +ENDCHAR +STARTCHAR uni3012 +ENCODING 12306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +00 +F8 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni3013 +ENCODING 12307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +F8 +00 +F8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni3014 +ENCODING 12308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +20 +40 +40 +40 +40 +40 +40 +40 +20 +10 +00 +ENDCHAR +STARTCHAR uni3015 +ENCODING 12309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +10 +10 +10 +10 +10 +10 +10 +20 +40 +00 +ENDCHAR +STARTCHAR uni3016 +ENCODING 12310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +90 +90 +A0 +A0 +A0 +A0 +A0 +90 +90 +F8 +00 +ENDCHAR +STARTCHAR uni3017 +ENCODING 12311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +48 +48 +28 +28 +28 +28 +28 +48 +48 +F8 +00 +ENDCHAR +STARTCHAR uni3018 +ENCODING 12312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +08 +10 +30 +50 +50 +50 +50 +50 +30 +10 +08 +00 +ENDCHAR +STARTCHAR uni3019 +ENCODING 12313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +40 +20 +30 +28 +28 +28 +28 +28 +30 +20 +40 +00 +ENDCHAR +STARTCHAR uni301A +ENCODING 12314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +00 +ENDCHAR +STARTCHAR uni301B +ENCODING 12315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +F8 +28 +28 +28 +28 +28 +28 +28 +28 +28 +F8 +00 +ENDCHAR +STARTCHAR uni301C +ENCODING 12316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +98 +64 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni301D +ENCODING 12317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +28 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni301E +ENCODING 12318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +28 +28 +50 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni301F +ENCODING 12319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +28 +28 +50 +00 +ENDCHAR +STARTCHAR uni3036 +ENCODING 12342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +88 +F8 +88 +F8 +A8 +A8 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni303F +ENCODING 12351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +D8 +D8 +A8 +A8 +A8 +D8 +D8 +F8 +00 +00 +ENDCHAR +STARTCHAR uni3099 +ENCODING 12441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +04 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni309A +ENCODING 12442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +0C +0C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni309B +ENCODING 12443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +20 +80 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni309C +ENCODING 12444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +40 +A0 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni30A1 +ENCODING 12449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F0 +50 +60 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni30A2 +ENCODING 12450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +28 +28 +30 +20 +20 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni30A3 +ENCODING 12451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +20 +60 +A0 +20 +00 +00 +ENDCHAR +STARTCHAR uni30A4 +ENCODING 12452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +10 +20 +60 +A0 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni30A5 +ENCODING 12453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +E0 +A0 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30A6 +ENCODING 12454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +20 +20 +F8 +88 +88 +08 +08 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30A7 +ENCODING 12455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30A8 +ENCODING 12456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +20 +20 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30A9 +ENCODING 12457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +F0 +20 +60 +A0 +00 +00 +ENDCHAR +STARTCHAR uni30AA +ENCODING 12458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +F8 +10 +30 +50 +90 +10 +30 +00 +00 +ENDCHAR +STARTCHAR uni30AB +ENCODING 12459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +F8 +28 +28 +28 +48 +48 +98 +00 +00 +ENDCHAR +STARTCHAR uni30AC +ENCODING 12460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +28 +24 +F8 +28 +28 +28 +48 +48 +98 +00 +00 +ENDCHAR +STARTCHAR uni30AD +ENCODING 12461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +58 +E0 +20 +38 +D0 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni30AE +ENCODING 12462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +48 +44 +58 +E0 +20 +38 +D0 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni30AF +ENCODING 12463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +48 +48 +88 +08 +10 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30B0 +ENCODING 12464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +78 +4C +48 +88 +08 +10 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30B1 +ENCODING 12465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +78 +90 +10 +10 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30B2 +ENCODING 12466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +48 +44 +78 +90 +10 +10 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30B3 +ENCODING 12467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +08 +08 +08 +08 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30B4 +ENCODING 12468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +FC +08 +08 +08 +08 +08 +08 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30B5 +ENCODING 12469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +50 +50 +F8 +50 +50 +10 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30B6 +ENCODING 12470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +58 +54 +F8 +50 +50 +10 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30B7 +ENCODING 12471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +C0 +08 +C8 +08 +08 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30B8 +ENCODING 12472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +C4 +08 +C8 +08 +08 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30B9 +ENCODING 12473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +08 +10 +10 +30 +30 +48 +88 +00 +00 +ENDCHAR +STARTCHAR uni30BA +ENCODING 12474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +F8 +0C +08 +10 +10 +30 +30 +48 +88 +00 +00 +ENDCHAR +STARTCHAR uni30BB +ENCODING 12475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +78 +C8 +50 +40 +40 +40 +38 +00 +00 +ENDCHAR +STARTCHAR uni30BC +ENCODING 12476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +48 +44 +78 +C8 +50 +40 +40 +40 +38 +00 +00 +ENDCHAR +STARTCHAR uni30BD +ENCODING 12477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +88 +48 +48 +10 +10 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30BE +ENCODING 12478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +8C +48 +48 +10 +10 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30BF +ENCODING 12479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +78 +48 +48 +68 +98 +10 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30C0 +ENCODING 12480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +78 +4C +48 +68 +98 +10 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30C1 +ENCODING 12481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +20 +60 +20 +F8 +20 +20 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni30C2 +ENCODING 12482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +18 +24 +60 +20 +F8 +20 +20 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni30C3 +ENCODING 12483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +A8 +A8 +08 +10 +E0 +00 +00 +ENDCHAR +STARTCHAR uni30C4 +ENCODING 12484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A8 +A8 +A8 +08 +08 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30C5 +ENCODING 12485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +AC +A8 +A8 +08 +08 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30C6 +ENCODING 12486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +00 +00 +F8 +20 +20 +20 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni30C7 +ENCODING 12487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +78 +04 +00 +F8 +20 +20 +20 +40 +40 +00 +00 +ENDCHAR +STARTCHAR uni30C8 +ENCODING 12488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +C0 +A0 +90 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni30C9 +ENCODING 12489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +10 +88 +90 +88 +C0 +A0 +90 +80 +80 +80 +00 +00 +ENDCHAR +STARTCHAR uni30CA +ENCODING 12490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +20 +40 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni30CB +ENCODING 12491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +00 +00 +00 +00 +00 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30CC +ENCODING 12492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +48 +30 +10 +28 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni30CD +ENCODING 12493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +F8 +10 +20 +70 +A8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni30CE +ENCODING 12494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +10 +10 +20 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni30CF +ENCODING 12495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +50 +50 +50 +48 +48 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni30D0 +ENCODING 12496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +54 +50 +50 +48 +48 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni30D1 +ENCODING 12497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +0C +0C +50 +50 +50 +48 +48 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni30D2 +ENCODING 12498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +F8 +80 +80 +80 +80 +80 +78 +00 +00 +ENDCHAR +STARTCHAR uni30D3 +ENCODING 12499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +88 +84 +F8 +80 +80 +80 +80 +80 +78 +00 +00 +ENDCHAR +STARTCHAR uni30D4 +ENCODING 12500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +0C +8C +80 +F8 +80 +80 +80 +80 +80 +78 +00 +00 +ENDCHAR +STARTCHAR uni30D5 +ENCODING 12501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +08 +10 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30D6 +ENCODING 12502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +FC +08 +08 +08 +10 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30D7 +ENCODING 12503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +0C +0C +00 +F8 +08 +08 +08 +10 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30D8 +ENCODING 12504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +50 +50 +90 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni30D9 +ENCODING 12505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +24 +28 +54 +50 +90 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni30DA +ENCODING 12506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +0C +2C +20 +50 +50 +90 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni30DB +ENCODING 12507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +F8 +20 +20 +A8 +A8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni30DC +ENCODING 12508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +28 +24 +F8 +20 +20 +A8 +A8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni30DD +ENCODING 12509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +0C +2C +20 +F8 +20 +20 +A8 +A8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni30DE +ENCODING 12510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +08 +08 +08 +10 +50 +60 +20 +10 +00 +00 +ENDCHAR +STARTCHAR uni30DF +ENCODING 12511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +C0 +30 +00 +C0 +30 +00 +80 +60 +18 +00 +00 +ENDCHAR +STARTCHAR uni30E0 +ENCODING 12512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +10 +20 +20 +50 +48 +98 +E4 +00 +00 +ENDCHAR +STARTCHAR uni30E1 +ENCODING 12513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +28 +10 +10 +28 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni30E2 +ENCODING 12514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F0 +40 +40 +F8 +40 +40 +40 +40 +38 +00 +00 +ENDCHAR +STARTCHAR uni30E3 +ENCODING 12515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +78 +C8 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni30E4 +ENCODING 12516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +40 +40 +78 +C8 +30 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni30E5 +ENCODING 12517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +20 +20 +20 +F0 +00 +00 +ENDCHAR +STARTCHAR uni30E6 +ENCODING 12518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +10 +10 +10 +10 +10 +10 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30E7 +ENCODING 12519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F0 +10 +F0 +10 +F0 +00 +00 +ENDCHAR +STARTCHAR uni30E8 +ENCODING 12520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +F8 +08 +08 +08 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30E9 +ENCODING 12521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +F8 +00 +F8 +08 +08 +08 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30EA +ENCODING 12522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +88 +88 +88 +88 +08 +10 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30EB +ENCODING 12523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +50 +50 +50 +50 +50 +50 +98 +90 +00 +00 +ENDCHAR +STARTCHAR uni30EC +ENCODING 12524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +80 +80 +80 +80 +80 +80 +88 +90 +E0 +00 +00 +ENDCHAR +STARTCHAR uni30ED +ENCODING 12525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +88 +88 +88 +88 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30EE +ENCODING 12526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +08 +08 +10 +20 +00 +00 +ENDCHAR +STARTCHAR uni30EF +ENCODING 12527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +88 +88 +08 +08 +08 +10 +20 +00 +00 +ENDCHAR +STARTCHAR uni30F0 +ENCODING 12528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +10 +F8 +50 +50 +F8 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni30F1 +ENCODING 12529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +78 +08 +30 +20 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30F2 +ENCODING 12530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +F8 +08 +08 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30F3 +ENCODING 12531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +40 +08 +08 +08 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30F4 +ENCODING 12532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +24 +28 +FC +88 +88 +08 +08 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30F5 +ENCODING 12533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +F8 +28 +48 +48 +90 +00 +00 +ENDCHAR +STARTCHAR uni30F6 +ENCODING 12534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +78 +90 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR uni30F7 +ENCODING 12535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +FC +88 +88 +08 +08 +08 +10 +60 +00 +00 +ENDCHAR +STARTCHAR uni30F8 +ENCODING 12536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +18 +14 +F8 +50 +50 +F8 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni30F9 +ENCODING 12537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +04 +78 +08 +30 +20 +20 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni30FA +ENCODING 12538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +08 +04 +08 +FC +08 +F8 +08 +08 +10 +20 +C0 +00 +00 +ENDCHAR +STARTCHAR uni30FB +ENCODING 12539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +70 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni30FC +ENCODING 12540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni30FD +ENCODING 12541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +20 +10 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni30FE +ENCODING 12542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +10 +08 +10 +48 +20 +10 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni3105 +ENCODING 12549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F8 +08 +08 +08 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni3106 +ENCODING 12550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +40 +F8 +08 +50 +50 +20 +D8 +00 +00 +ENDCHAR +STARTCHAR uni3107 +ENCODING 12551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +88 +88 +88 +88 +88 +00 +00 +ENDCHAR +STARTCHAR uni3108 +ENCODING 12552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +80 +80 +80 +80 +F8 +00 +00 +ENDCHAR +STARTCHAR uni3109 +ENCODING 12553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +40 +80 +F8 +28 +28 +28 +48 +90 +00 +00 +ENDCHAR +STARTCHAR uni310A +ENCODING 12554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +F8 +20 +20 +48 +F8 +08 +00 +ENDCHAR +STARTCHAR uni310B +ENCODING 12555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +70 +10 +38 +08 +08 +28 +10 +00 +00 +ENDCHAR +STARTCHAR uni310C +ENCODING 12556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +A0 +F8 +28 +48 +48 +90 +00 +00 +ENDCHAR +STARTCHAR uni310D +ENCODING 12557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +48 +90 +90 +48 +48 +00 +00 +ENDCHAR +STARTCHAR uni310E +ENCODING 12558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +20 +78 +08 +08 +30 +00 +00 +ENDCHAR +STARTCHAR uni310F +ENCODING 12559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +40 +40 +40 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni3110 +ENCODING 12560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +48 +58 +68 +08 +10 +00 +00 +ENDCHAR +STARTCHAR uni3111 +ENCODING 12561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +10 +20 +20 +10 +10 +00 +00 +ENDCHAR +STARTCHAR uni3112 +ENCODING 12562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +20 +10 +10 +10 +20 +00 +00 +ENDCHAR +STARTCHAR uni3113 +ENCODING 12563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +A8 +A8 +A8 +F8 +20 +F8 +00 +00 +ENDCHAR +STARTCHAR uni3114 +ENCODING 12564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +60 +08 +70 +A0 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni3115 +ENCODING 12565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +08 +78 +40 +40 +40 +80 +00 +ENDCHAR +STARTCHAR uni3116 +ENCODING 12566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +88 +C8 +A8 +A8 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni3117 +ENCODING 12567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +48 +48 +48 +48 +48 +58 +40 +00 +ENDCHAR +STARTCHAR uni3118 +ENCODING 12568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +40 +78 +08 +10 +20 +00 +00 +ENDCHAR +STARTCHAR uni3119 +ENCODING 12569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +20 +20 +40 +48 +F8 +08 +00 +ENDCHAR +STARTCHAR uni311A +ENCODING 12570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +50 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR uni311B +ENCODING 12571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +20 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni311C +ENCODING 12572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +20 +20 +F8 +20 +60 +80 +88 +70 +00 +00 +ENDCHAR +STARTCHAR uni311D +ENCODING 12573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +50 +F8 +50 +50 +50 +40 +78 +00 +00 +ENDCHAR +STARTCHAR uni311E +ENCODING 12574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +50 +50 +78 +28 +C8 +00 +00 +ENDCHAR +STARTCHAR uni311F +ENCODING 12575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +D0 +10 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3120 +ENCODING 12576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +48 +F0 +20 +40 +50 +F8 +08 +00 +ENDCHAR +STARTCHAR uni3121 +ENCODING 12577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +08 +50 +50 +20 +D8 +00 +00 +ENDCHAR +STARTCHAR uni3122 +ENCODING 12578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +F8 +50 +50 +F8 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni3123 +ENCODING 12579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +80 +80 +80 +F8 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR uni3124 +ENCODING 12580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +F8 +20 +50 +50 +98 +00 +00 +ENDCHAR +STARTCHAR uni3125 +ENCODING 12581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +20 +20 +40 +40 +F8 +00 +00 +ENDCHAR +STARTCHAR uni3126 +ENCODING 12582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +50 +50 +50 +50 +58 +80 +00 +ENDCHAR +STARTCHAR uni3127 +ENCODING 12583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni3128 +ENCODING 12584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +C8 +28 +10 +30 +48 +88 +00 +00 +ENDCHAR +STARTCHAR uni3129 +ENCODING 12585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +88 +88 +88 +88 +88 +F8 +00 +00 +ENDCHAR +STARTCHAR uni312A +ENCODING 12586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +20 +20 +38 +48 +48 +90 +00 +00 +ENDCHAR +STARTCHAR uni312B +ENCODING 12587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +F8 +50 +50 +50 +50 +50 +98 +00 +00 +ENDCHAR +STARTCHAR uni312C +ENCODING 12588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +10 +78 +40 +40 +40 +40 +80 +00 +00 +ENDCHAR +STARTCHAR uni3131 +ENCODING 12593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +08 +08 +08 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni3132 +ENCODING 12594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +28 +28 +28 +28 +28 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni3133 +ENCODING 12595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +C8 +48 +50 +50 +58 +68 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3134 +ENCODING 12596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +80 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3135 +ENCODING 12597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +B8 +90 +90 +90 +A8 +A8 +E8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3136 +ENCODING 12598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +B8 +80 +B8 +80 +B8 +A8 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3137 +ENCODING 12599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +80 +80 +80 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3138 +ENCODING 12600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +A0 +A0 +A0 +A0 +A0 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3139 +ENCODING 12601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +F8 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni313A +ENCODING 12602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +28 +28 +E8 +88 +A8 +C8 +00 +00 +00 +ENDCHAR +STARTCHAR uni313B +ENCODING 12603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +DC +54 +54 +D4 +94 +B4 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni313C +ENCODING 12604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D4 +54 +54 +DC +94 +B4 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni313D +ENCODING 12605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +E4 +24 +28 +E8 +94 +B4 +D4 +00 +00 +00 +ENDCHAR +STARTCHAR uni313E +ENCODING 12606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +D8 +50 +50 +D8 +90 +B0 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni313F +ENCODING 12607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +DC +40 +54 +D4 +94 +A8 +DC +00 +00 +00 +ENDCHAR +STARTCHAR uni3140 +ENCODING 12608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +EC +20 +3C +E8 +9C +B4 +D8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3141 +ENCODING 12609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +88 +88 +88 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3142 +ENCODING 12610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +88 +88 +88 +F8 +88 +88 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3143 +ENCODING 12611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A8 +A8 +A8 +F8 +A8 +A8 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni3144 +ENCODING 12612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +A8 +A8 +A8 +E8 +B4 +B4 +D4 +00 +00 +00 +ENDCHAR +STARTCHAR uni3145 +ENCODING 12613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +10 +10 +20 +20 +50 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni3146 +ENCODING 12614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +28 +28 +50 +50 +58 +A8 +A4 +00 +00 +00 +ENDCHAR +STARTCHAR uni3147 +ENCODING 12615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +30 +48 +84 +84 +84 +48 +30 +00 +00 +00 +ENDCHAR +STARTCHAR uni3148 +ENCODING 12616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +10 +30 +48 +48 +84 +00 +00 +00 +ENDCHAR +STARTCHAR uni3149 +ENCODING 12617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +50 +50 +50 +A8 +A8 +A8 +00 +00 +00 +ENDCHAR +STARTCHAR uni314A +ENCODING 12618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +70 +00 +F8 +20 +20 +50 +88 +00 +00 +00 +ENDCHAR +STARTCHAR uni314B +ENCODING 12619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +08 +08 +F8 +08 +08 +10 +00 +00 +00 +ENDCHAR +STARTCHAR uni314C +ENCODING 12620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +80 +80 +F8 +80 +80 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni314D +ENCODING 12621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +F8 +50 +50 +50 +50 +50 +F8 +00 +00 +00 +ENDCHAR +STARTCHAR uni314E +ENCODING 12622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +70 +00 +F8 +00 +70 +88 +88 +70 +00 +00 +00 +ENDCHAR +STARTCHAR uni314F +ENCODING 12623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +20 +38 +20 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni3150 +ENCODING 12624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +48 +48 +78 +48 +48 +48 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3151 +ENCODING 12625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +20 +20 +38 +20 +38 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni3152 +ENCODING 12626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +48 +78 +48 +78 +48 +48 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3153 +ENCODING 12627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +38 +08 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3154 +ENCODING 12628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +28 +28 +E8 +28 +28 +28 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3155 +ENCODING 12629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +38 +08 +38 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3156 +ENCODING 12630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +28 +E8 +28 +E8 +28 +28 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3157 +ENCODING 12631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +20 +20 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni3158 +ENCODING 12632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +48 +4C +58 +E8 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3159 +ENCODING 12633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +04 +14 +14 +5C +54 +74 +D4 +04 +00 +00 +00 +ENDCHAR +STARTCHAR uni315A +ENCODING 12634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +48 +48 +58 +E8 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni315B +ENCODING 12635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +50 +50 +50 +F8 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni315C +ENCODING 12636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +20 +20 +20 +00 +00 +00 +ENDCHAR +STARTCHAR uni315D +ENCODING 12637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +18 +E8 +48 +78 +48 +00 +00 +00 +ENDCHAR +STARTCHAR uni315E +ENCODING 12638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +04 +14 +14 +14 +F4 +54 +74 +54 +00 +00 +00 +ENDCHAR +STARTCHAR uni315F +ENCODING 12639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +18 +E8 +48 +48 +48 +00 +00 +00 +ENDCHAR +STARTCHAR uni3160 +ENCODING 12640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +50 +50 +50 +00 +00 +00 +ENDCHAR +STARTCHAR uni3161 +ENCODING 12641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR uni3162 +ENCODING 12642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +08 +18 +E8 +08 +00 +00 +00 +ENDCHAR +STARTCHAR uni3163 +ENCODING 12643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 13 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/COPYING.Cursor b/src/3rdparty/fonts/COPYING.Cursor new file mode 100644 index 0000000000..faa695a476 --- /dev/null +++ b/src/3rdparty/fonts/COPYING.Cursor @@ -0,0 +1 @@ +Copyright (c) 2000 XFree86, Inc. diff --git a/src/3rdparty/fonts/COPYING.Helvetica b/src/3rdparty/fonts/COPYING.Helvetica new file mode 100644 index 0000000000..850cf94dfb --- /dev/null +++ b/src/3rdparty/fonts/COPYING.Helvetica @@ -0,0 +1,19 @@ +Copyright 1984-1989, 1994 Adobe Systems Incorporated. +Copyright 1988, 1994 Digital Equipment Corporation. + +Adobe is a trademark of Adobe Systems Incorporated which may be +registered in certain jurisdictions. +Permission to use these trademarks is hereby granted only in +association with the images described in this file. + +Permission to use, copy, modify, distribute and sell this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notices appear in all +copies and that both those copyright notices and this permission +notice appear in supporting documentation, and that the names of +Adobe Systems and Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Adobe Systems and +Digital Equipment Corporation make no representations about the +suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. diff --git a/src/3rdparty/fonts/COPYING.Utopia b/src/3rdparty/fonts/COPYING.Utopia new file mode 100644 index 0000000000..2389021969 --- /dev/null +++ b/src/3rdparty/fonts/COPYING.Utopia @@ -0,0 +1,16 @@ +Permission to use, reproduce, display and distribute the listed typefaces +is hereby granted, provided that the Adobe Copyright notice appears in all +whole and partial copies of the software and that the following trademark +symbol and attribution appear in all unmodified copies of the software: + + Copyright (c) 1989 Adobe Systems Incorporated + Utopia (R) + Utopia is a registered trademark of Adobe Systems Incorporated + +The Adobe typefaces (Type 1 font program, bitmaps and Adobe Font Metric +files) donated are: + + Utopia Regular + Utopia Italic + Utopia Bold + Utopia Bold Italic diff --git a/src/3rdparty/fonts/COPYRIGHT.BH b/src/3rdparty/fonts/COPYRIGHT.BH new file mode 100644 index 0000000000..78c6065337 --- /dev/null +++ b/src/3rdparty/fonts/COPYRIGHT.BH @@ -0,0 +1,42 @@ +Luxi fonts copyright (c) 2001 by Bigelow & Holmes Inc. Luxi font +instruction code copyright (c) 2001 by URW++ GmbH. All Rights +Reserved. Luxi is a registered trademark of Bigelow & Holmes Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of these Fonts and associated documentation files (the "Font +Software"), to deal in the Font Software, including without +limitation the rights to use, copy, merge, publish, distribute, +sublicense, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to +the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software. + +The Font Software may not be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may not +be modified nor may additional glyphs or characters be added to the +Fonts. This License becomes null and void when the Fonts or Font +Software have been modified. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +BIGELOW & HOLMES INC. OR URW++ GMBH. BE LIABLE FOR ANY CLAIM, DAMAGES +OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR +INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT +SOFTWARE. + +Except as contained in this notice, the names of Bigelow & Holmes +Inc. and URW++ GmbH. shall not be used in advertising or otherwise to +promote the sale, use or other dealings in this Font Software without +prior written authorization from Bigelow & Holmes Inc. and URW++ GmbH. + +For further information, contact: + +info@urwpp.de +or +design@bigelowandholmes.com diff --git a/src/3rdparty/fonts/COPYRIGHT.Charter b/src/3rdparty/fonts/COPYRIGHT.Charter new file mode 100644 index 0000000000..a77490018a --- /dev/null +++ b/src/3rdparty/fonts/COPYRIGHT.Charter @@ -0,0 +1,11 @@ +(c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. + +You are hereby granted permission under all Bitstream propriety rights +to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream +Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts +for any purpose and without restriction; provided, that this notice is +left intact on all copies of such fonts and that Bitstream's trademark +is acknowledged as shown below on all unmodified copies of the 4 Charter +Type 1 fonts. + +BITSTREAM CHARTER is a registered trademark of Bitstream Inc. diff --git a/src/3rdparty/fonts/COPYRIGHT.Courier b/src/3rdparty/fonts/COPYRIGHT.Courier new file mode 100644 index 0000000000..a77490018a --- /dev/null +++ b/src/3rdparty/fonts/COPYRIGHT.Courier @@ -0,0 +1,11 @@ +(c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. + +You are hereby granted permission under all Bitstream propriety rights +to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream +Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts +for any purpose and without restriction; provided, that this notice is +left intact on all copies of such fonts and that Bitstream's trademark +is acknowledged as shown below on all unmodified copies of the 4 Charter +Type 1 fonts. + +BITSTREAM CHARTER is a registered trademark of Bitstream Inc. diff --git a/src/3rdparty/fonts/COPYRIGHT.DejaVu b/src/3rdparty/fonts/COPYRIGHT.DejaVu new file mode 100644 index 0000000000..635e609c8e --- /dev/null +++ b/src/3rdparty/fonts/COPYRIGHT.DejaVu @@ -0,0 +1,98 @@ +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah (see below) + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING +ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +associated documentation files (the "Font Software"), to reproduce +and distribute the modifications to the Bitstream Vera Font Software, +including without limitation the rights to use, copy, merge, publish, +distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to +the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +$Id: LICENSE 778 2006-04-20 18:14:24Z moyogo $ diff --git a/src/3rdparty/fonts/COPYRIGHT.IBM b/src/3rdparty/fonts/COPYRIGHT.IBM new file mode 100644 index 0000000000..5e50d448f2 --- /dev/null +++ b/src/3rdparty/fonts/COPYRIGHT.IBM @@ -0,0 +1,9 @@ +IBM Courier - Copyright (c) IBM Corporation 1990, 1991 + +You are hereby granted permission under the terms of the IBM/MIT X Consortium +Courier Typefont agreement to execute, reproduce, distribute, display, market, +sell and otherwise transfer copies of the IBM Courier font to third parties. + +The font is provided "AS IS" without charge. NO WARRANTIES OR INDEMNIFICATION +ARE GIVEN, WHETHER EXPRESS OR IMPLIED INCLUDING, BUT LIMITED TO THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. diff --git a/src/3rdparty/fonts/COPYRIGHT.Unifont b/src/3rdparty/fonts/COPYRIGHT.Unifont new file mode 100644 index 0000000000..d708ddc612 --- /dev/null +++ b/src/3rdparty/fonts/COPYRIGHT.Unifont @@ -0,0 +1,7 @@ +The Unifont font was originally obtained from http://www.czyborra.com/ under +the following license: + +All of my works you find here are freeware. You may freely copy, use, quote, +modify or redistribute them as long as you properly attribute my contribution +and have given a quick thought about whether Roman might perhaps be interested +to read what you did with his stuff. Horizontal rules don't apply. diff --git a/src/3rdparty/fonts/COPYRIGHT.Vera b/src/3rdparty/fonts/COPYRIGHT.Vera new file mode 100644 index 0000000000..e651be1c4f --- /dev/null +++ b/src/3rdparty/fonts/COPYRIGHT.Vera @@ -0,0 +1,124 @@ +Bitstream Vera Fonts Copyright + +The fonts have a generous copyright, allowing derivative works (as +long as "Bitstream" or "Vera" are not in the names), and full +redistribution (so long as they are not *sold* by themselves). They +can be be bundled, redistributed and sold with any software. + +The fonts are distributed under the following copyright: + +Copyright +========= + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream +Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute +the Font Software, including without limitation the rights to use, +copy, merge, publish, distribute, and/or sell copies of the Font +Software, and to permit persons to whom the Font Software is furnished +to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, +OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT +SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font +Software without prior written authorization from the Gnome Foundation +or Bitstream Inc., respectively. For further information, contact: +fonts at gnome dot org. + +Copyright FAQ +============= + + 1. I don't understand the resale restriction... What gives? + + Bitstream is giving away these fonts, but wishes to ensure its + competitors can't just drop the fonts as is into a font sale system + and sell them as is. It seems fair that if Bitstream can't make money + from the Bitstream Vera fonts, their competitors should not be able to + do so either. You can sell the fonts as part of any software package, + however. + + 2. I want to package these fonts separately for distribution and + sale as part of a larger software package or system. Can I do so? + + Yes. A RPM or Debian package is a "larger software package" to begin + with, and you aren't selling them independently by themselves. + See 1. above. + + 3. Are derivative works allowed? + Yes! + + 4. Can I change or add to the font(s)? + Yes, but you must change the name(s) of the font(s). + + 5. Under what terms are derivative works allowed? + + You must change the name(s) of the fonts. This is to ensure the + quality of the fonts, both to protect Bitstream and Gnome. We want to + ensure that if an application has opened a font specifically of these + names, it gets what it expects (though of course, using fontconfig, + substitutions could still could have occurred during font + opening). You must include the Bitstream copyright. Additional + copyrights can be added, as per copyright law. Happy Font Hacking! + + 6. If I have improvements for Bitstream Vera, is it possible they might get + adopted in future versions? + + Yes. The contract between the Gnome Foundation and Bitstream has + provisions for working with Bitstream to ensure quality additions to + the Bitstream Vera font family. Please contact us if you have such + additions. Note, that in general, we will want such additions for the + entire family, not just a single font, and that you'll have to keep + both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add + glyphs to the font, they must be stylistically in keeping with Vera's + design. Vera cannot become a "ransom note" font. Jim Lyles will be + providing a document describing the design elements used in Vera, as a + guide and aid for people interested in contributing to Vera. + + 7. I want to sell a software package that uses these fonts: Can I do so? + + Sure. Bundle the fonts with your software and sell your software + with the fonts. That is the intent of the copyright. + + 8. If applications have built the names "Bitstream Vera" into them, + can I override this somehow to use fonts of my choosing? + + This depends on exact details of the software. Most open source + systems and software (e.g., Gnome, KDE, etc.) are now converting to + use fontconfig (see www.fontconfig.org) to handle font configuration, + selection and substitution; it has provisions for overriding font + names and subsituting alternatives. An example is provided by the + supplied local.conf file, which chooses the family Bitstream Vera for + "sans", "serif" and "monospace". Other software (e.g., the XFree86 + core server) has other mechanisms for font substitution. + diff --git a/src/3rdparty/fonts/README.DejaVu b/src/3rdparty/fonts/README.DejaVu new file mode 100644 index 0000000000..e272feb458 --- /dev/null +++ b/src/3rdparty/fonts/README.DejaVu @@ -0,0 +1,59 @@ +DejaVu fonts 2.12 (c)2004-2006 DejaVu fonts team +----------------------------------------------- + +The DejaVu fonts are a font family based on the Bitstream Vera Fonts +(http://gnome.org/fonts/). Its purpose is to provide a wider range of +characters (see status.txt for more information) while maintaining the +original look and feel. + +DejaVu fonts are based on Bitstream Vera fonts version 1.10. + +Available fonts (Sans = sans serif, Mono = monospaced): + +DejaVu Sans Mono +DejaVu Sans Mono Bold +DejaVu Sans Mono Bold Oblique +DejaVu Sans Mono Oblique +DejaVu Sans +DejaVu Sans Bold +DejaVu Sans Bold Oblique +DejaVu Sans Oblique +DejaVu Sans ExtraLight (experimental) +DejaVu Serif +DejaVu Serif Bold +DejaVu Serif Bold Oblique (experimental) +DejaVu Serif Oblique (experimental) +DejaVu Sans Condensed (experimental) +DejaVu Sans Condensed Bold (experimental) +DejaVu Sans Condensed Bold Oblique (experimental) +DejaVu Sans Condensed Oblique (experimental) +DejaVu Serif Condensed (experimental) +DejaVu Serif Condensed Bold (experimental) +DejaVu Serif Condensed Bold Oblique (experimental) +DejaVu Serif Condensed Oblique (experimental) + +All fonts are also available as derivative called DejaVu LGC with support +only for Latin, Greek and Cyrillic scripts. + +For license information see LICENSE. What's new is described in NEWS. Known +bugs are in BUGS. All authors are mentioned in AUTHORS. + +Fonts are published in source form as SFD files (Spline Font Database from +FontForge - http://fontforge.sf.net/) and in compiled form as TTF files +(TrueType fonts). + +For more information go to http://dejavu.sourceforge.net/. + +Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah: +--------------------------- +U+01ba, U+01bf, U+01f7, U+021c, U+021d, U+0220, U+0222, U+0223, +U+02b9, U+02ba, U+02bd, U+02c2, U+02c3, U+02c4, U+02c5, U+02d4, +U+02d5, U+02d7, U+02ec, U+02ed, U+02ee, U+0346-034e, U+0360, U+0362, +U+03e2-03ef, U+0460-0463, U+0466-0486, U+0488-0489, U+04a8-04a9, +U+0500-050f, U+2055-205e, U+20B0, U+20B2-20B3, U+2102, U+210D, U+210f, +U+2111, U+2113, U+2115, U+2118-U+211A, U+211c-211d, U+2124,U+2135, +U+213C-U+2140, U+2295-2298, U+2308-230b, U+26A2-U+26B1, U+2701-2704, +U+2706-2709, U+270c-274b, U+2758-275a, U+2761-2775, U+2780-2794, +U+2798-27af, U+27b1-27be, U+fb05-fb06 + +$Id: README 1288 2006-11-19 14:22:52Z ben_laenen $ diff --git a/src/3rdparty/fonts/helvB08.bdf b/src/3rdparty/fonts/helvB08.bdf new file mode 100644 index 0000000000..bbae03c183 --- /dev/null +++ b/src/3rdparty/fonts/helvB08.bdf @@ -0,0 +1,2604 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-R-Normal--8-80-75-75-P-50-ISO10646-1 +SIZE 8 75 75 +FONTBOUNDINGBOX 11 11 -1 -2 +COMMENT $XConsortium: helvB08.bdf,v 1.13 95/01/26 18:01:26 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 8 +POINT_SIZE 80 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 50 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 6 +X_HEIGHT 5 +FONT_ASCENT 8 +FONT_DESCENT 2 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 7 0 0 +BITMAP +C0 +C0 +C0 +80 +00 +80 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 4 0 +BBX 3 2 0 4 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 -1 0 +BITMAP +50 +F8 +50 +F8 +A0 +A0 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 -1 +BITMAP +20 +70 +C0 +E0 +70 +30 +E0 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +E0 +38 +68 +B0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +50 +60 +F8 +D0 +68 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 3 0 3 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +40 +80 +80 +80 +80 +40 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +80 +80 +40 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 3 0 +BBX 3 3 0 3 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +20 +20 +F0 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 3 -1 -1 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 2 0 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 6 0 0 +BITMAP +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +D0 +D0 +D0 +D0 +60 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 3 6 0 0 +BITMAP +20 +E0 +60 +60 +60 +60 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +B0 +30 +60 +C0 +F0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +B0 +60 +30 +B0 +60 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +50 +D0 +F8 +30 +30 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +70 +C0 +E0 +30 +B0 +60 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +70 +C0 +E0 +D0 +D0 +60 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +F0 +30 +30 +60 +40 +C0 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +D0 +60 +D0 +D0 +60 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +B0 +B0 +70 +30 +E0 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 1 5 0 0 +BITMAP +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 6 -1 -1 +BITMAP +40 +40 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 3 0 1 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +E0 +30 +60 +40 +00 +40 +40 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 9 0 +BBX 8 7 0 -1 +BITMAP +7E +C3 +99 +A9 +99 +CE +60 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +F0 +D8 +D8 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C8 +C0 +C0 +C8 +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +F0 +C0 +F0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +F0 +C0 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C8 +C0 +D8 +C8 +78 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 6 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +30 +30 +30 +30 +B0 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +D8 +D0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +C6 +C6 +EE +FE +D6 +D6 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C8 +C8 +E8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +C8 +C8 +D8 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +70 +D8 +C8 +C8 +D8 +78 +04 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +D8 +F0 +D8 +D8 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +F0 +38 +D8 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E8 +68 +68 +68 +70 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 9 0 +BBX 8 6 0 0 +BITMAP +DB +DB +DA +DA +6C +6C +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +70 +70 +D8 +D8 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 6 0 0 +BITMAP +EC +68 +68 +78 +30 +30 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +38 +30 +60 +E0 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 6 0 0 +BITMAP +80 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 4 0 +BBX 4 3 0 3 +BITMAP +60 +60 +90 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 1 0 -1 +BITMAP +F8 +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 3 0 3 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +E0 +30 +F0 +B0 +D8 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +C0 +C0 +E0 +D0 +D0 +D0 +E0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +30 +30 +70 +B0 +B0 +B0 +70 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +60 +D0 +F0 +C0 +60 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 7 -1 0 +BITMAP +30 +60 +F0 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 0 -1 +BITMAP +D0 +B0 +B0 +F0 +30 +E0 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +C0 +C0 +E0 +D0 +D0 +D0 +D0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 7 0 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 8 -1 -1 +BITMAP +40 +00 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +C0 +C0 +D0 +D0 +E0 +D0 +D0 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +E8 +D4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +E0 +D0 +D0 +D0 +D0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +60 +D0 +D0 +D0 +60 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 0 -1 +BITMAP +E0 +D0 +D0 +D0 +E0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 0 -1 +BITMAP +70 +B0 +B0 +B0 +70 +30 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 3 0 +BBX 3 5 0 0 +BITMAP +A0 +E0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +70 +C0 +F0 +30 +E0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 7 -1 0 +BITMAP +20 +60 +F0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +D0 +D0 +D0 +F0 +50 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +D0 +D0 +D0 +60 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +F8 +F8 +48 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +70 +D8 +D8 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 -1 +BITMAP +D0 +D0 +D0 +70 +60 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +F0 +30 +60 +C0 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 3 7 0 -1 +BITMAP +20 +40 +40 +80 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 2 0 +BBX 1 7 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 3 7 0 -1 +BITMAP +80 +40 +40 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 2 0 2 +BITMAP +58 +B0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 7 0 -2 +BITMAP +40 +40 +00 +40 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 0 -1 +BITMAP +20 +20 +F0 +C0 +F0 +40 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +30 +50 +C0 +60 +50 +F0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 1 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +58 +D8 +58 +F8 +30 +30 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 2 0 +BBX 1 6 0 0 +BITMAP +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 -2 +BITMAP +70 +C0 +E0 +D0 +50 +30 +B0 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 1 0 5 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +78 +CC +B4 +C4 +B4 +CC +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 4 0 +BBX 3 5 0 2 +BITMAP +E0 +60 +A0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 3 0 1 +BITMAP +50 +A0 +50 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 2 0 2 +BITMAP +F0 +10 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 1 0 2 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +78 +4C +B4 +B4 +AC +C4 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 1 0 5 +BITMAP +C0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 3 0 +BBX 3 3 0 3 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +20 +20 +F0 +20 +00 +F0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 4 0 2 +BITMAP +C0 +40 +80 +C0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 4 0 2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 5 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 -2 +BITMAP +D0 +D0 +D0 +F0 +90 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 -1 -2 +BITMAP +78 +E8 +E8 +68 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 2 0 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 -2 +BITMAP +40 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 4 0 2 +BITMAP +40 +C0 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 4 0 +BBX 3 5 0 2 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 3 0 1 +BITMAP +A0 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +44 +C8 +50 +50 +28 +58 +BC +08 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +44 +C8 +50 +50 +38 +48 +90 +18 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +C4 +C8 +50 +A0 +28 +58 +BC +08 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 -2 +BITMAP +40 +40 +00 +40 +40 +C0 +F0 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +7E +38 +5E +F8 +D8 +DE +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C8 +C0 +C0 +C8 +78 +20 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +40 +20 +00 +F0 +C0 +F0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +10 +20 +00 +F0 +C0 +F0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +40 +A0 +00 +F0 +C0 +F0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +A0 +00 +F0 +C0 +F0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 -1 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 0 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 -1 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 -1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +58 +E8 +58 +58 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +C8 +C8 +E8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +C8 +C8 +D8 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +C8 +C8 +D8 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +D8 +C8 +C8 +D8 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +70 +D8 +C8 +C8 +D8 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +D8 +C8 +C8 +D8 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 4 0 1 +BITMAP +D8 +70 +70 +D8 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 7 7 -1 -1 +BITMAP +3A +6C +6C +74 +6C +78 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +EC +68 +68 +78 +30 +30 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +F0 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +E0 +D0 +E0 +D0 +D0 +A0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +E0 +30 +F0 +B0 +D8 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +E0 +30 +F0 +B0 +D8 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +00 +E0 +30 +F0 +B0 +D8 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +50 +A0 +00 +E0 +30 +F0 +B0 +D8 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +A0 +00 +E0 +30 +F0 +B0 +D8 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +40 +E0 +30 +F0 +B0 +D8 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +F8 +34 +7C +B0 +7C +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 7 0 -2 +BITMAP +60 +C0 +C0 +C0 +60 +40 +C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +40 +20 +00 +60 +D0 +F0 +C0 +60 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +10 +20 +00 +60 +D0 +F0 +C0 +60 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +20 +50 +00 +60 +D0 +F0 +C0 +60 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +50 +00 +60 +D0 +F0 +C0 +60 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 8 -1 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 8 0 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 -1 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 7 -1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +D0 +60 +A0 +70 +D0 +D0 +60 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +50 +A0 +00 +E0 +F0 +D0 +D0 +D0 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +40 +20 +00 +60 +D0 +D0 +D0 +60 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +10 +20 +00 +60 +D0 +D0 +D0 +60 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +20 +50 +00 +60 +D0 +D0 +D0 +60 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +50 +A0 +00 +60 +D0 +D0 +D0 +60 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +50 +00 +60 +D0 +D0 +D0 +60 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 6 7 -1 -1 +BITMAP +04 +38 +68 +68 +68 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +40 +20 +00 +D0 +D0 +D0 +F0 +50 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +10 +20 +00 +D0 +D0 +D0 +F0 +50 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +20 +50 +00 +D0 +D0 +D0 +F0 +50 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 0 +BITMAP +50 +00 +D0 +D0 +D0 +F0 +50 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 9 0 -1 +BITMAP +10 +20 +00 +D0 +D0 +D0 +70 +60 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 -1 -2 +BITMAP +C0 +70 +68 +68 +68 +70 +60 +70 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 -1 +BITMAP +50 +00 +D0 +D0 +D0 +60 +60 +60 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 -1 0 +BITMAP +3C +F4 +60 +F0 +64 +3C +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvB10.bdf b/src/3rdparty/fonts/helvB10.bdf new file mode 100644 index 0000000000..a322517f0b --- /dev/null +++ b/src/3rdparty/fonts/helvB10.bdf @@ -0,0 +1,2867 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-R-Normal--10-100-75-75-P-60-ISO10646-1 +SIZE 10 75 75 +FONTBOUNDINGBOX 11 13 -1 -2 +COMMENT $XConsortium: helvB10.bdf,v 1.13 95/01/26 18:01:30 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 10 +POINT_SIZE 100 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 8 +X_HEIGHT 6 +FONT_ASCENT 10 +FONT_DESCENT 2 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 8 1 0 +BITMAP +C0 +C0 +C0 +C0 +80 +80 +00 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 5 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +50 +FC +50 +F8 +A0 +A0 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +E0 +70 +38 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +62 +B4 +68 +10 +10 +2C +56 +8C +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +70 +D8 +D8 +70 +DE +CC +DC +76 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 0 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +20 +60 +40 +C0 +C0 +C0 +C0 +40 +60 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +80 +C0 +40 +60 +60 +60 +60 +40 +C0 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 3 3 0 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +40 +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 2 1 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +18 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +18 +30 +18 +18 +D8 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +18 +38 +58 +58 +98 +FC +18 +18 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +18 +98 +D8 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +C0 +F0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +18 +30 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +78 +18 +D8 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 1 6 1 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +40 +00 +00 +40 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 0 1 +BITMAP +30 +60 +C0 +60 +30 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 0 1 +BITMAP +C0 +60 +30 +60 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +18 +30 +60 +60 +00 +60 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 11 0 +BBX 10 9 0 -2 +BITMAP +1F00 +6080 +4D40 +9240 +A240 +A480 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +CC +CC +F8 +CC +CC +CC +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3C +66 +C2 +C0 +C0 +C2 +66 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F0 +D8 +CC +CC +CC +CC +D8 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3C +66 +C2 +C0 +CE +C6 +66 +3A +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +18 +18 +D8 +70 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 10 0 +BBX 9 8 0 0 +BITMAP +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +CC +CC +CC +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 9 0 -1 +BITMAP +38 +6C +C6 +C6 +C6 +D6 +6C +3C +02 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +CC +CC +CC +F8 +CC +CC +CC +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +78 +CC +E0 +78 +1C +8C +CC +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +C6 +C6 +6C +6C +6C +38 +38 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 10 8 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +6D80 +6D80 +7F80 +3300 +2100 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +C6 +C6 +6C +38 +38 +6C +C6 +C6 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +66 +66 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +0C +18 +30 +70 +60 +C0 +FC +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 4 0 4 +BITMAP +20 +70 +D8 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 0 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +F0 +D8 +C8 +C8 +D8 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +70 +D0 +C0 +C0 +D0 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +78 +D8 +98 +98 +D8 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +70 +C0 +E0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +D8 +98 +98 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 0 -2 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C0 +C0 +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 8 6 0 0 +BITMAP +B6 +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +B0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +D8 +C8 +C8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +D8 +98 +98 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 4 6 0 0 +BITMAP +B0 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +70 +18 +D8 +70 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 8 0 0 +BITMAP +C0 +C0 +E0 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +50 +70 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +D6 +D6 +D6 +6C +6C +6C +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 0 +BITMAP +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +78 +30 +30 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 10 0 -2 +BITMAP +30 +60 +60 +60 +C0 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 3 0 +BBX 1 10 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 10 0 -2 +BITMAP +C0 +60 +60 +60 +30 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +6C +D8 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 8 1 -2 +BITMAP +C0 +00 +40 +40 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +70 +D8 +A0 +A0 +D8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +68 +60 +F0 +60 +60 +68 +D8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +D8 +70 +D8 +D8 +70 +D8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +84 +CC +48 +78 +FC +30 +FC +30 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 3 0 +BBX 1 10 1 -2 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +C8 +E0 +70 +98 +C8 +70 +38 +98 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +42 +99 +A5 +A1 +9D +42 +3C +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 3 5 1 3 +BITMAP +E0 +20 +A0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 3 0 1 +BITMAP +6C +D8 +6C +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +42 +BD +A5 +B9 +A5 +42 +3C +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 7 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 4 0 +BBX 3 3 1 4 +BITMAP +60 +A0 +C0 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +FC +30 +30 +00 +FC +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 3 +BITMAP +60 +A0 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 3 +BITMAP +E0 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 0 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +E8 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +7C +E8 +E8 +E8 +68 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 1 0 3 +BITMAP +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 0 -2 +BITMAP +40 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 4 0 3 +BITMAP +40 +C0 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 3 5 1 3 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 3 0 1 +BITMAP +D8 +6C +D8 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +42 +C4 +48 +48 +12 +26 +2F +42 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +42 +C4 +48 +48 +16 +2A +24 +4E +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +E2 +44 +28 +C8 +12 +26 +2F +42 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +00 +30 +30 +60 +C0 +D8 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +28 +00 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +28 +10 +38 +38 +6C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 9 8 0 0 +BITMAP +3F80 +3C00 +6C00 +6F80 +6C00 +FC00 +CC00 +CF80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +3C +66 +C2 +C0 +C0 +C2 +66 +3C +10 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +40 +20 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +10 +20 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +20 +50 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 0 0 +BITMAP +80 +40 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 0 0 +BITMAP +40 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +40 +A0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +A0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F0 +D8 +CC +EC +CC +CC +D8 +F0 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +C6 +C6 +E6 +D6 +D6 +CE +CE +C6 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +04 +08 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +28 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3A +6C +CE +D6 +D6 +E6 +6C +B8 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +10 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +08 +10 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +10 +28 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +28 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +04 +08 +00 +C3 +C3 +66 +66 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +C0 +F8 +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +C8 +C8 +D0 +C8 +C8 +C8 +D0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +40 +20 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +30 +68 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +28 +50 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +50 +50 +00 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +50 +20 +70 +98 +78 +D8 +D8 +6C +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 8 6 0 0 +BITMAP +7E +9B +7F +D8 +DB +6E +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 -2 +BITMAP +70 +D0 +C0 +C0 +D0 +70 +20 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +00 +70 +D8 +F8 +C0 +D8 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +80 +40 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +20 +40 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 -1 0 +BITMAP +40 +A0 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +A0 +A0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +60 +A0 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +B0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +A0 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +00 +FC +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +74 +D8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +00 +D8 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +78 +30 +30 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +C8 +C8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +50 +50 +00 +D8 +D8 +D8 +D8 +78 +30 +30 +60 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 -1 0 +BITMAP +1E +33 +F9 +60 +F8 +61 +33 +1E +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvB12.bdf b/src/3rdparty/fonts/helvB12.bdf new file mode 100644 index 0000000000..9b2caa680e --- /dev/null +++ b/src/3rdparty/fonts/helvB12.bdf @@ -0,0 +1,3057 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-R-Normal--12-120-75-75-P-70-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 14 15 -1 -3 +COMMENT $XConsortium: helvB12.bdf,v 1.13 95/01/26 18:01:34 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +10 +78 +D4 +D0 +78 +1C +94 +D4 +78 +10 +10 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +7100 +DB00 +DA00 +7400 +0400 +09C0 +0B60 +1B60 +11C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3800 +6C00 +6C00 +3800 +7900 +CF00 +C600 +CF00 +7980 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 12 1 -3 +BITMAP +C0 +60 +60 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +F8 +70 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 4 1 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +30 +30 +20 +60 +60 +40 +40 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +18 +30 +60 +C0 +C0 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +38 +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +0C +1C +2C +2C +4C +8C +FE +0C +0C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +60 +C0 +F8 +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +C0 +C0 +F8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +18 +30 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +7C +0C +0C +CC +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 9 1 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +18 +70 +C0 +70 +18 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +C0 +70 +18 +70 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +18 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4040 +8D40 +9240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +18 +3C +24 +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3E +63 +C0 +C0 +CF +C3 +C3 +63 +3D +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +0C +0C +0C +0C +CC +CC +78 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +C3 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +C180 +C180 +E380 +E380 +F780 +D580 +DD80 +C980 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +E6 +E6 +D6 +D6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +66 +C3 +C3 +C3 +CB +CF +66 +3F +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +CC +C6 +C6 +C6 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +7C +C6 +C6 +70 +1C +0E +C6 +C6 +7C +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +4C80 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +3C +18 +3C +66 +C3 +C3 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +C3 +C3 +66 +66 +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +06 +0C +18 +30 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +C0 +C0 +40 +60 +60 +20 +20 +30 +30 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 4 0 5 +BITMAP +10 +38 +6C +C6 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -3 +BITMAP +FE +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 6 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +38 +60 +F0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +6C +DC +CC +CC +CC +DC +6C +0C +CC +78 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 -1 -3 +BITMAP +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +C0 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +BB80 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +74 +DC +CC +CC +CC +DC +6C +0C +0C +0C +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +D8 +F8 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +E0 +38 +1C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +60 +60 +F0 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +C6 +C6 +6C +6C +38 +38 +10 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +CCC0 +CCC0 +6D80 +6D80 +6D80 +3300 +3300 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 -3 +BITMAP +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +18 +30 +20 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +30 +60 +60 +60 +60 +C0 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 12 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 12 0 -3 +BITMAP +C0 +60 +60 +60 +60 +30 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +76 +DC +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 10 1 -3 +BITMAP +C0 +C0 +00 +40 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +10 +78 +DC +90 +A0 +A0 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +6C +60 +60 +F8 +60 +60 +EC +D8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +CC +78 +48 +48 +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +48 +FC +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 11 1 -2 +BITMAP +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +78 +CC +E0 +70 +D8 +CC +CC +6C +38 +1C +CC +78 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 0 8 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 4 6 1 3 +BITMAP +E0 +30 +F0 +B0 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 1 +BITMAP +24 +6C +D8 +6C +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +9480 +9880 +9480 +9480 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 0 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +30 +30 +FC +30 +30 +00 +FC +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 4 +BITMAP +60 +B0 +60 +C0 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 4 +BITMAP +60 +B0 +60 +30 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 0 8 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +CC +CC +CC +CC +CC +DC +EC +C0 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +3E +74 +F4 +F4 +F4 +74 +34 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +30 +30 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 4 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 4 6 1 3 +BITMAP +60 +D0 +D0 +60 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 1 +BITMAP +90 +D8 +6C +D8 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +E600 +6600 +6C00 +6D80 +0B80 +1A80 +37C0 +3180 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +E600 +6600 +6C00 +6D80 +0AC0 +1980 +3300 +33C0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6300 +B300 +6600 +3600 +ED80 +0B80 +1A80 +37C0 +3180 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 10 1 -3 +BITMAP +30 +30 +00 +30 +30 +30 +60 +CC +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +30 +18 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1C +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +1A +2C +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +36 +00 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +18 +24 +18 +18 +18 +3C +24 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 13 0 +BBX 11 9 1 0 +BITMAP +1FE0 +3600 +2600 +6600 +67E0 +7E00 +C600 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 12 1 -3 +BITMAP +3C +66 +C0 +C0 +C0 +C0 +C0 +66 +3C +18 +18 +70 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +60 +30 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +18 +30 +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +38 +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +6C +00 +FC +C0 +C0 +C0 +FC +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 12 0 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 12 1 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 0 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +66 +63 +63 +F3 +63 +63 +66 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +34 +58 +00 +C6 +C6 +E6 +E6 +F6 +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +30 +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +0C +18 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1C +36 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +1A +2C +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +66 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3D +66 +CF +CB +DB +D3 +F3 +66 +7C +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6C +7C +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +C3 +C3 +66 +66 +24 +3C +18 +18 +18 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +C0 +C0 +FC +C6 +C6 +C6 +FC +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +CC +CC +CC +D8 +CC +CC +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +30 +18 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +18 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +38 +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +34 +58 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +30 +48 +30 +00 +78 +CC +0C +7C +CC +CC +76 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 7 0 0 +BITMAP +7780 +CCC0 +0CC0 +7FC0 +CC00 +CCC0 +7780 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 -3 +BITMAP +78 +CC +C0 +C0 +C0 +CC +78 +10 +18 +70 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +FC +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 -1 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 -1 0 +BITMAP +D8 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +70 +90 +18 +7C +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +D8 +EC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +34 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +00 +FC +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 -1 0 +BITMAP +3D +66 +6E +76 +66 +66 +BC +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 13 0 -3 +BITMAP +0C +18 +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +C0 +C0 +D8 +EC +CC +CC +CC +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 0 -3 +BITMAP +6C +00 +C6 +C6 +6C +6C +38 +38 +18 +10 +30 +60 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 -1 0 +BITMAP +0F00 +1980 +3000 +FC00 +3000 +FC00 +3000 +1980 +0F00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvB14.bdf b/src/3rdparty/fonts/helvB14.bdf new file mode 100644 index 0000000000..8d9075d90b --- /dev/null +++ b/src/3rdparty/fonts/helvB14.bdf @@ -0,0 +1,3319 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-R-Normal--14-140-75-75-P-82-ISO10646-1 +SIZE 14 75 75 +FONTBOUNDINGBOX 16 17 -1 -3 +COMMENT $XConsortium: helvB14.bdf,v 1.14 95/01/26 18:01:39 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 14 +POINT_SIZE 140 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 82 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 11 +X_HEIGHT 8 +FONT_ASCENT 13 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 7 0 +BBX 5 3 1 8 +BITMAP +D8 +D8 +90 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +1B00 +1B00 +1B00 +7F80 +3600 +3600 +FF00 +6C00 +6C00 +6C00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 13 0 -2 +BITMAP +10 +7C +D6 +D6 +F0 +78 +1C +16 +D6 +D6 +7C +10 +10 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 12 10 0 0 +BITMAP +7880 +CD80 +CD00 +7B00 +0600 +0400 +0DE0 +0B30 +1B30 +11E0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3800 +6C00 +6C00 +3800 +7300 +FB00 +CE00 +C600 +CF00 +7D80 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 3 1 8 +BITMAP +E0 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 14 0 -3 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 14 1 -3 +BITMAP +C0 +60 +60 +30 +30 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 4 0 7 +BITMAP +20 +F8 +70 +D8 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +18 +18 +18 +FF +18 +18 +18 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 0 -1 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 1 1 4 +BITMAP +FE +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +30 +30 +20 +20 +60 +60 +60 +40 +40 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +38 +6C +C6 +C6 +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 4 10 1 0 +BITMAP +30 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +7C +E6 +C6 +0E +0C +38 +70 +E0 +C0 +FE +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +7C +CE +C6 +06 +3C +06 +06 +C6 +CE +7C +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +0E +1E +36 +66 +C6 +C6 +FF +06 +06 +06 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +7E +60 +C0 +F8 +1C +06 +06 +C6 +EC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +3C +76 +66 +C0 +DC +F6 +C6 +C6 +6E +3C +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +FE +06 +0C +0C +18 +18 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +7C +EE +C6 +C6 +7C +EE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +7C +EE +C6 +C6 +E6 +7E +06 +C6 +CE +7C +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 9 1 -1 +BITMAP +60 +60 +00 +00 +00 +00 +60 +60 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +1C +70 +C0 +70 +1C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 3 1 3 +BITMAP +FE +00 +FE +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +E0 +38 +0C +38 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +06 +0C +18 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 14 0 +BBX 13 12 0 -1 +BITMAP +0F80 +38E0 +7070 +66B0 +CD98 +D998 +DB18 +DB30 +CEE0 +6000 +3180 +1F00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 0 0 +BITMAP +0C00 +0C00 +1E00 +1200 +3300 +3300 +6180 +7F80 +6180 +C0C0 +C0C0 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +FE +C7 +C3 +C3 +C6 +FC +C6 +C3 +C3 +C7 +FE +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +1F00 +7B80 +6080 +C000 +C000 +C000 +C000 +C000 +6080 +7B80 +1F00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +FC00 +C700 +C300 +C180 +C180 +C180 +C180 +C180 +C300 +C700 +FC00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +FE +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +1F00 +7B80 +6080 +C000 +C000 +C780 +C180 +C180 +6180 +7B80 +1E80 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +FF +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +06 +06 +06 +06 +06 +06 +06 +C6 +C6 +EE +7C +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +C300 +C600 +CC00 +D800 +F000 +F000 +D800 +CC00 +C600 +C300 +C180 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +C060 +C060 +E0E0 +E0E0 +F1E0 +D160 +D160 +DB60 +CA60 +CE60 +C460 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +C180 +E180 +E180 +D180 +D980 +C980 +CD80 +C580 +C380 +C380 +C180 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +1E00 +7380 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7380 +1E00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +FE +C7 +C3 +C3 +C7 +FE +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +1E00 +7380 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C6C0 +6380 +7380 +1EC0 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +FE00 +C700 +C300 +C300 +C700 +FE00 +C300 +C300 +C300 +C300 +C180 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +7E +E7 +C3 +E0 +78 +1E +07 +03 +C3 +EE +7C +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +6300 +3E00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 10 11 0 0 +BITMAP +C0C0 +C0C0 +6180 +6180 +7380 +3300 +3300 +1E00 +1E00 +0C00 +0C00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 14 0 +BBX 14 11 0 0 +BITMAP +C30C +C30C +C30C +6798 +6498 +6498 +6CD8 +2CD0 +3870 +1860 +1860 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +C180 +C180 +6300 +3600 +1C00 +1C00 +3600 +6300 +6300 +C180 +C180 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 10 11 0 0 +BITMAP +C0C0 +6180 +6180 +3300 +3300 +1E00 +1E00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +03 +06 +0C +1C +18 +30 +70 +60 +C0 +FF +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 14 1 -3 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +C0 +C0 +C0 +40 +60 +60 +60 +20 +30 +30 +30 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 14 0 -3 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 7 +BITMAP +30 +78 +CC +84 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 1 0 -3 +BITMAP +FF +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 3 1 8 +BITMAP +60 +C0 +E0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 1 0 +BITMAP +78 +CC +0C +7C +CC +CC +FC +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +F8 +EC +C6 +C6 +C6 +C6 +EC +D8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +38 +7C +C4 +C0 +C0 +C4 +7C +38 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +06 +06 +06 +3E +6E +C6 +C6 +C6 +C6 +6E +36 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +CC +CC +FC +C0 +C0 +EC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +38 +60 +60 +F0 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +3A +6E +C6 +C6 +C6 +C6 +6E +3E +06 +CE +7C +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +DC +EE +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 11 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 14 0 -3 +BITMAP +60 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +E0 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +C0 +C0 +C0 +CC +D8 +F0 +F0 +D8 +D8 +CC +CC +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 10 8 1 0 +BITMAP +DB80 +EEC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +DC +EE +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +D8 +EC +C6 +C6 +C6 +C6 +EC +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +36 +6E +C6 +C6 +C6 +C6 +6E +3E +06 +06 +06 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +D8 +F8 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +EC +C0 +78 +1C +0C +EC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 10 0 0 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +60 +68 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +66 +66 +24 +3C +18 +18 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 8 0 0 +BITMAP +CCC0 +CCC0 +CCC0 +6D80 +6D80 +3300 +3300 +3300 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +C6 +C6 +6C +38 +38 +6C +C6 +C6 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 0 -3 +BITMAP +C3 +C3 +66 +66 +24 +3C +18 +18 +18 +30 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +0C +18 +30 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 14 0 -3 +BITMAP +18 +30 +30 +30 +30 +60 +C0 +60 +30 +30 +30 +30 +30 +18 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 14 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 14 1 -3 +BITMAP +C0 +60 +60 +60 +60 +30 +18 +30 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 3 1 3 +BITMAP +72 +DE +8C +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 11 1 -3 +BITMAP +C0 +C0 +00 +40 +40 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +04 +3C +6E +C8 +D0 +D0 +E6 +66 +7C +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +3C +66 +66 +30 +FC +30 +30 +63 +FB +DE +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 6 0 2 +BITMAP +C6 +7C +6C +6C +7C +C6 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C3 +C3 +66 +66 +3C +7E +18 +7E +18 +18 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 2 13 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 14 1 -3 +BITMAP +78 +CC +CC +E0 +78 +DC +CC +CC +EC +78 +1C +CC +CC +78 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 2 0 9 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +1E00 +6180 +4C80 +9240 +9040 +9040 +9240 +4C80 +6180 +1E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 7 0 4 +BITMAP +70 +90 +70 +D0 +F8 +00 +F8 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 5 1 2 +BITMAP +36 +6C +D8 +6C +36 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 4 1 2 +BITMAP +FE +02 +02 +02 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 0 4 +BITMAP +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +1E00 +6180 +5E80 +9240 +9240 +9C40 +9240 +5280 +6180 +1E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 0 10 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 6 0 +BBX 4 4 1 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +18 +18 +18 +FF +18 +18 +18 +00 +FF +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 6 0 4 +BITMAP +60 +B0 +30 +60 +C0 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 6 0 4 +BITMAP +60 +B0 +60 +30 +B0 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 2 1 9 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +EE +F6 +C0 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 14 0 -3 +BITMAP +3F +7A +FA +FA +FA +7A +3A +0A +0A +0A +0A +0A +0A +0A +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 0 -3 +BITMAP +18 +D8 +70 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 6 0 4 +BITMAP +60 +E0 +60 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 5 7 0 4 +BITMAP +70 +D8 +D8 +D8 +70 +00 +F8 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 5 1 2 +BITMAP +D8 +6C +36 +6C +D8 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 12 10 0 0 +BITMAP +6180 +E180 +6300 +6300 +6620 +6660 +0CE0 +0D60 +19F0 +1860 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +6180 +E180 +6300 +6300 +66C0 +6760 +0C60 +0CC0 +1980 +19E0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 12 10 0 0 +BITMAP +6180 +B180 +6300 +3300 +B620 +E660 +0CE0 +0D60 +19F0 +1860 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +18 +18 +00 +18 +18 +30 +60 +C0 +C6 +C6 +7C +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +1800 +0C00 +0000 +0C00 +0C00 +1E00 +1200 +3300 +3300 +6180 +7F80 +6180 +C0C0 +C0C0 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +0600 +0C00 +0000 +0C00 +0C00 +1E00 +1200 +3300 +3300 +6180 +7F80 +6180 +C0C0 +C0C0 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +0E00 +1B00 +0000 +0C00 +0C00 +1E00 +1200 +3300 +3300 +6180 +7F80 +6180 +C0C0 +C0C0 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +0D00 +1600 +0000 +0C00 +0C00 +1E00 +1200 +3300 +3300 +6180 +7F80 +6180 +C0C0 +C0C0 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +1B00 +1B00 +0000 +0C00 +0C00 +1E00 +1200 +3300 +3300 +6180 +7F80 +6180 +C0C0 +C0C0 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +1E00 +3300 +1E00 +0C00 +0C00 +1E00 +1200 +3300 +3300 +6180 +7F80 +6180 +C0C0 +C0C0 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 15 0 +BBX 14 11 0 0 +BITMAP +0FFC +0F00 +1B00 +1300 +3300 +33F8 +6300 +7F00 +6300 +C300 +C3FC +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 14 1 -3 +BITMAP +1F00 +7B80 +6080 +C000 +C000 +C000 +C000 +C000 +6080 +7B80 +1F00 +0400 +3600 +1C00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +30 +18 +00 +FE +C0 +C0 +C0 +C0 +FE +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +0C +18 +00 +FE +C0 +C0 +C0 +C0 +FE +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +38 +6C +00 +FE +C0 +C0 +C0 +C0 +FE +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +6C +6C +00 +FE +C0 +C0 +C0 +C0 +FE +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 14 0 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 14 1 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 14 0 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 14 0 0 +BITMAP +D8 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 10 11 0 0 +BITMAP +7E00 +6380 +6180 +60C0 +60C0 +F8C0 +60C0 +60C0 +6180 +6380 +7E00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1A00 +2C00 +0000 +C180 +C180 +E180 +F180 +D980 +C980 +CD80 +C580 +C380 +C380 +C180 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +1800 +0C00 +0000 +1E00 +7380 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7380 +1E00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +0600 +0C00 +0000 +1E00 +7380 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7380 +1E00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +0E00 +1B00 +0000 +1E00 +7380 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7380 +1E00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +0D00 +1600 +0000 +1E00 +7380 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7380 +1E00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +1B00 +1B00 +0000 +1E00 +7380 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7380 +1E00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +C3 +66 +3C +18 +3C +66 +C3 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 12 11 0 0 +BITMAP +0F30 +39E0 +30C0 +61E0 +6360 +6660 +6C60 +7860 +30C0 +79C0 +CF00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +0C00 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +6300 +3E00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0600 +0C00 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +6300 +3E00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +3600 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +6300 +3E00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3600 +3600 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +6300 +3E00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +0600 +0C00 +0000 +C0C0 +6180 +6180 +3300 +3300 +1E00 +1E00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +C0 +C0 +FE +C7 +C3 +C3 +C7 +FE +C0 +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +78 +CC +CC +CC +D8 +D8 +CC +CC +CC +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +30 +18 +00 +78 +CC +0C +7C +CC +CC +FC +76 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +18 +30 +00 +78 +CC +0C +7C +CC +CC +FC +76 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +38 +6C +00 +78 +CC +0C +7C +CC +CC +FC +76 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +34 +58 +00 +78 +CC +0C +7C +CC +CC +FC +76 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +6C +6C +00 +78 +CC +0C +7C +CC +CC +FC +76 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +38 +6C +38 +78 +CC +0C +7C +CC +CC +FC +76 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 11 8 1 0 +BITMAP +7BC0 +CE60 +0C60 +7FE0 +CC00 +CC00 +FE60 +77C0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +3C +76 +C6 +C0 +C0 +C6 +76 +3C +08 +6C +38 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +60 +30 +00 +78 +EC +CC +FC +C0 +C0 +EC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +18 +30 +00 +78 +EC +CC +FC +C0 +C0 +EC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +38 +6C +00 +78 +EC +CC +FC +C0 +C0 +EC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +6C +6C +00 +78 +EC +CC +FC +C0 +C0 +EC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 11 0 0 +BITMAP +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 11 1 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +70 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +D8 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +48 +3C +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +34 +58 +00 +DC +EE +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +18 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +0C +18 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +34 +58 +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +6C +00 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +18 +18 +00 +FF +00 +18 +18 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +3A +6C +CE +D6 +D6 +E6 +6C +B8 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 14 0 -3 +BITMAP +0C +18 +00 +C3 +C3 +66 +66 +24 +3C +18 +18 +18 +30 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +C0 +C0 +D8 +EC +C6 +C6 +C6 +C6 +EC +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 14 0 -3 +BITMAP +36 +36 +00 +C3 +C3 +66 +66 +24 +3C +18 +18 +18 +30 +70 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 10 11 0 0 +BITMAP +0F80 +3DC0 +3040 +6000 +FE00 +6000 +FE00 +6000 +3040 +3DC0 +0F80 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvB18.bdf b/src/3rdparty/fonts/helvB18.bdf new file mode 100644 index 0000000000..036bbe8085 --- /dev/null +++ b/src/3rdparty/fonts/helvB18.bdf @@ -0,0 +1,3864 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-R-Normal--18-180-75-75-P-103-ISO10646-1 +SIZE 18 75 75 +FONTBOUNDINGBOX 20 23 -1 -5 +COMMENT $XConsortium: helvB18.bdf,v 1.14 95/01/26 18:01:44 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 18 +POINT_SIZE 180 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 103 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 14 +X_HEIGHT 10 +FONT_ASCENT 16 +FONT_DESCENT 5 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 14 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +C0 +00 +E0 +E0 +E0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 8 0 +BBX 5 5 2 9 +BITMAP +D8 +D8 +D8 +D8 +90 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +0D80 +0D80 +0D80 +7FE0 +7FE0 +1B00 +1B00 +1B00 +FFC0 +FFC0 +3600 +3600 +3600 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 16 0 -2 +BITMAP +0800 +3E00 +7F00 +EB80 +EB80 +E800 +7800 +3E00 +0F00 +0B80 +EB80 +EB80 +7F00 +3E00 +0800 +0800 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 16 0 +BBX 13 13 1 0 +BITMAP +7860 +FC60 +CCC0 +CC80 +FD80 +7B00 +0200 +06F0 +0DF8 +0998 +1998 +31F8 +30F0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 13 1 0 +BITMAP +3E00 +7F00 +6300 +7300 +3E00 +7C60 +EE60 +C7E0 +C3C0 +C1C0 +E3E0 +7F70 +3E78 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 5 1 9 +BITMAP +E0 +E0 +60 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 6 18 0 -4 +BITMAP +1C +38 +30 +70 +60 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +60 +70 +30 +38 +1C +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 6 18 1 -4 +BITMAP +E0 +70 +30 +38 +18 +1C +1C +1C +1C +1C +1C +1C +1C +18 +38 +30 +70 +E0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 9 0 +BBX 7 6 1 8 +BITMAP +10 +D6 +7C +38 +6C +44 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 8 1 1 +BITMAP +1C00 +1C00 +1C00 +FF80 +FF80 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 5 1 -2 +BITMAP +E0 +E0 +E0 +60 +C0 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 2 1 4 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 3 1 0 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +18 +18 +18 +10 +30 +30 +30 +20 +60 +60 +40 +C0 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +1C00 +7F00 +7700 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +7700 +7F00 +1C00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 6 13 1 0 +BITMAP +1C +3C +FC +FC +1C +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +3E00 +7F00 +E380 +E380 +0380 +0700 +1F00 +3E00 +7800 +7000 +E000 +FF80 +FF80 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +3E00 +7F00 +E700 +E300 +0700 +1E00 +1F00 +0780 +0380 +E380 +E780 +7F00 +3E00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +0700 +0F00 +1F00 +3F00 +3700 +7700 +6700 +E700 +FF80 +FF80 +0700 +0700 +0700 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +FF00 +FF00 +E000 +E000 +FE00 +FF00 +E780 +0380 +0380 +E380 +E780 +FF00 +7E00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +3E00 +7F00 +7300 +E000 +E000 +EE00 +FF00 +F380 +E380 +E380 +F380 +7F00 +3E00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +FF80 +FF80 +0380 +0700 +0E00 +0E00 +1C00 +1C00 +3800 +3800 +7000 +7000 +7000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +3E00 +7F00 +E380 +E380 +E380 +7F00 +3E00 +7700 +E380 +E380 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +3E00 +7F00 +E700 +E380 +C380 +C380 +E780 +7F80 +3D80 +0380 +E700 +FF00 +7C00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 3 10 2 0 +BITMAP +E0 +E0 +E0 +00 +00 +00 +00 +E0 +E0 +E0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 3 12 2 -2 +BITMAP +E0 +E0 +E0 +00 +00 +00 +00 +E0 +E0 +E0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +0380 +0F80 +3E00 +7800 +E000 +7800 +3E00 +0F80 +0380 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 6 1 2 +BITMAP +FF +FF +00 +00 +FF +FF +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +E000 +F800 +3E00 +0F00 +0380 +0F00 +3E00 +F800 +E000 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +7E +FF +E7 +E7 +0E +1E +1C +38 +38 +38 +00 +38 +38 +38 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 18 0 +BBX 16 17 1 -3 +BITMAP +07F0 +1FFC +3C1E +7006 +63B7 +E7F3 +C663 +CC63 +CCC3 +CCC6 +CCC6 +EFFC +E7B8 +7000 +3C00 +1FF0 +07F0 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +0E00 +0E00 +1F00 +1F00 +1B00 +3B80 +3180 +3180 +71C0 +7FC0 +7FC0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FE00 +FF80 +E3C0 +E1C0 +E1C0 +E380 +FF80 +FFC0 +E1E0 +E0E0 +E0E0 +E1E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FE0 +78E0 +7070 +F070 +E000 +E000 +E000 +E000 +F070 +7070 +78E0 +3FE0 +0F80 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FF00 +FFC0 +E1E0 +E0E0 +E070 +E070 +E070 +E070 +E070 +E070 +E0E0 +E1E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +E000 +E000 +E000 +E000 +FF80 +FF80 +E000 +E000 +E000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +E000 +E000 +E000 +E000 +FF80 +FF80 +E000 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FE0 +78E0 +7070 +E070 +E000 +E000 +E3F0 +E3F0 +E070 +7070 +78F0 +3FF0 +1FB0 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +FFE0 +FFE0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 14 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +E380 +E380 +F780 +7F00 +3E00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 14 1 0 +BITMAP +E0F0 +E1E0 +E3C0 +E780 +EF00 +FE00 +FC00 +FE00 +EF00 +E780 +E3C0 +E1E0 +E0F0 +E078 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FF80 +FF80 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +E01C +E01C +F03C +F03C +F87C +F87C +F87C +ECDC +ECDC +ECDC +E79C +E79C +E31C +E31C +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +E070 +F070 +F070 +F870 +FC70 +EC70 +EE70 +E670 +E770 +E370 +E1F0 +E1F0 +E0F0 +E070 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +0FC0 +3FF0 +7878 +7038 +F03C +E01C +E01C +E01C +E01C +F03C +7038 +7878 +3FF0 +0FC0 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FE00 +FF80 +E3C0 +E1C0 +E1C0 +E3C0 +FF80 +FE00 +E000 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 14 15 1 -1 +BITMAP +0FC0 +3FF0 +7878 +7038 +F03C +E01C +E01C +E01C +E01C +F19C +71D8 +78F8 +3FF0 +0FF8 +0018 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FFC0 +E1E0 +E0E0 +E0E0 +E1E0 +FFC0 +FF80 +E1C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3F00 +7F80 +E3C0 +E1C0 +F000 +7C00 +3F00 +0F80 +03C0 +E1C0 +E1C0 +F3C0 +7F80 +3F00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +E0E0 +E0E0 +E0E0 +71C0 +71C0 +71C0 +3180 +3B80 +3B80 +1B00 +1F00 +1F00 +0E00 +0E00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +E38E +E38E +E38E +E38E +739C +739C +739C +76DC +36D8 +36D8 +3EF8 +1C70 +1C70 +1C70 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 14 0 0 +BITMAP +E070 +E070 +70E0 +79E0 +1980 +1F80 +0F00 +1F80 +1980 +39C0 +70E0 +70E0 +E070 +E070 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +E0E0 +E0E0 +E0E0 +71C0 +71C0 +3B80 +3B80 +1F00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +01C0 +0380 +0700 +0700 +0E00 +1C00 +3800 +3800 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 18 1 -4 +BITMAP +F8 +F8 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +F8 +F8 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +C0 +C0 +C0 +40 +60 +60 +60 +20 +30 +30 +10 +18 +18 +18 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 18 0 -4 +BITMAP +F8 +F8 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +F8 +F8 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 10 6 0 7 +BITMAP +0C00 +1E00 +3F00 +7380 +E1C0 +C0C0 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 2 0 -4 +BITMAP +FFC0 +FFC0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 5 1 9 +BITMAP +60 +C0 +C0 +E0 +E0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +E7 +0F +3F +77 +E7 +E7 +FF +77 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +E000 +E000 +E000 +E000 +EF00 +FF80 +F380 +E1C0 +E1C0 +E1C0 +E1C0 +F380 +FF80 +EF00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +1E00 +7F80 +7380 +E000 +E000 +E000 +E000 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +01C0 +01C0 +01C0 +01C0 +3DC0 +7FC0 +73C0 +E1C0 +E1C0 +E1C0 +E1C0 +73C0 +7FC0 +3DC0 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +1E00 +7F00 +7380 +E180 +FF80 +FF80 +E000 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 7 14 0 0 +BITMAP +1E +3E +38 +38 +FE +FE +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 -4 +BITMAP +3DC0 +7FC0 +73C0 +E1C0 +E1C0 +E1C0 +E1C0 +73C0 +7FC0 +3DC0 +01C0 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +E000 +E000 +E000 +E000 +EF00 +FF80 +F380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 14 1 0 +BITMAP +E0 +E0 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 18 -1 -4 +BITMAP +38 +38 +00 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +F8 +F0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +E000 +E000 +E000 +E000 +E700 +EE00 +FC00 +F800 +F800 +FC00 +EE00 +E700 +E780 +E380 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 14 1 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +EE70 +FFF8 +F7B8 +E738 +E738 +E738 +E738 +E738 +E738 +E738 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +EF00 +FF80 +F380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +1E00 +7F80 +7380 +E1C0 +E1C0 +E1C0 +E1C0 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 -4 +BITMAP +EF00 +FF80 +F380 +E1C0 +E1C0 +E1C0 +E1C0 +F380 +FF80 +EF00 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 -4 +BITMAP +3DC0 +7FC0 +73C0 +E1C0 +E1C0 +E1C0 +E1C0 +73C0 +7FC0 +3DC0 +01C0 +01C0 +01C0 +01C0 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +EC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +1E +7F +E7 +E0 +FE +3F +07 +E7 +FE +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 6 13 0 0 +BITMAP +70 +70 +70 +FC +FC +70 +70 +70 +70 +70 +70 +7C +3C +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +E380 +E380 +E380 +7700 +7700 +7700 +3E00 +3E00 +1C00 +1C00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 13 0 +BBX 13 10 0 0 +BITMAP +E738 +E738 +E738 +6730 +7770 +7570 +3DE0 +3DE0 +18C0 +18C0 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +E380 +E380 +7700 +3E00 +1C00 +3E00 +7700 +7700 +E380 +E380 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 14 0 -4 +BITMAP +E380 +E380 +E380 +7700 +7700 +7700 +3E00 +3E00 +1C00 +1C00 +1C00 +1800 +7800 +7000 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FF +FF +07 +0E +1C +38 +70 +E0 +FF +FF +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 8 0 +BBX 7 18 1 -4 +BITMAP +0E +1C +38 +38 +38 +38 +38 +70 +E0 +70 +38 +38 +38 +38 +38 +38 +1C +0E +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 5 0 +BBX 2 18 1 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 8 0 +BBX 7 18 0 -4 +BITMAP +E0 +70 +38 +38 +38 +38 +38 +1C +0E +1C +38 +38 +38 +38 +38 +38 +70 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 3 1 4 +BITMAP +7980 +FF80 +CF00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 3 14 2 -4 +BITMAP +E0 +E0 +00 +00 +60 +60 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 -2 +BITMAP +02 +02 +3E +7F +E7 +C8 +C8 +D0 +D0 +E3 +7F +7E +40 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 10 13 0 0 +BITMAP +1F00 +3FC0 +71C0 +7000 +7000 +3800 +7F00 +1C00 +1C00 +3800 +70C0 +FFC0 +EF80 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 8 1 2 +BITMAP +C180 +FF80 +7700 +6300 +6300 +7700 +FF80 +C180 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +E380 +E380 +E380 +7700 +7700 +3E00 +FF80 +1C00 +FF80 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 5 0 +BBX 2 17 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +3C +7E +C7 +C7 +E0 +78 +FC +C6 +C7 +E3 +73 +3F +0E +07 +E3 +E3 +7E +3C +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 2 1 11 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +38E0 +6030 +6730 +CD98 +D818 +9808 +D818 +CD98 +6730 +6030 +38E0 +0F80 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 8 0 +BBX 6 9 1 5 +BITMAP +78 +8C +7C +CC +CC +74 +00 +FC +FC +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 10 8 0 1 +BITMAP +1DC0 +3B80 +7700 +EE00 +EE00 +7700 +3B80 +1DC0 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 5 1 2 +BITMAP +FF80 +FF80 +0180 +0180 +0180 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 3 1 4 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +38E0 +6030 +6F90 +CCD8 +CCD8 +8F08 +CD98 +CD98 +6CF0 +6030 +38E0 +0F80 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 2 1 12 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 7 0 +BBX 6 6 0 7 +BITMAP +78 +FC +CC +CC +FC +78 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +1C00 +1C00 +FF80 +FF80 +1C00 +1C00 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 6 8 0 5 +BITMAP +78 +FC +CC +1C +78 +E0 +FC +FC +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 6 8 0 5 +BITMAP +78 +FC +CC +38 +3C +CC +FC +78 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 0 11 +BITMAP +38 +70 +E0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E780 +FF80 +FB80 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 18 0 -4 +BITMAP +3F80 +7B00 +FB00 +FB00 +FB00 +FB00 +FB00 +7B00 +3B00 +1B00 +1B00 +1B00 +1B00 +1B00 +1B00 +1B00 +1B00 +1B00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 5 1 -5 +BITMAP +60 +70 +18 +F8 +F0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 8 0 5 +BITMAP +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 8 0 +BBX 6 9 1 5 +BITMAP +78 +CC +CC +CC +CC +78 +00 +FC +FC +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 10 8 0 1 +BITMAP +EE00 +7700 +3B80 +1DC0 +1DC0 +3B80 +7700 +EE00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 14 13 0 0 +BITMAP +3060 +F060 +F0C0 +30C0 +3180 +3198 +3338 +3638 +0678 +0CD8 +0CFC +1818 +1818 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 15 13 0 0 +BITMAP +3060 +F060 +F0C0 +30C0 +3180 +31BC +337E +3666 +060E +0C3C +0C70 +187E +187E +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 14 13 0 0 +BITMAP +7830 +FC30 +CC60 +3860 +3CC0 +CCD8 +FDB8 +7B38 +0378 +06D8 +06FC +0C18 +0C18 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +1C +1C +00 +00 +1C +1C +1C +38 +78 +70 +E7 +E7 +FF +7E +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +3800 +1C00 +0E00 +0000 +0E00 +0E00 +1F00 +1F00 +1B00 +3B80 +3180 +3180 +71C0 +7FC0 +7FC0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0380 +0700 +0E00 +0000 +0E00 +0E00 +1F00 +1F00 +1B00 +3B80 +3180 +3180 +71C0 +7FC0 +7FC0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +1F00 +3B80 +0000 +0E00 +0E00 +1F00 +1F00 +1B00 +3B80 +3180 +3180 +71C0 +7FC0 +7FC0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1D80 +3F80 +3700 +0000 +0E00 +0E00 +1F00 +1F00 +1B00 +3B80 +3180 +3180 +71C0 +7FC0 +7FC0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1980 +1980 +0000 +0E00 +0E00 +1F00 +1F00 +1B00 +3B80 +3180 +3180 +71C0 +7FC0 +7FC0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +0E00 +1B00 +1B00 +0E00 +0E00 +1F00 +1F00 +1B00 +3B80 +3180 +3180 +71C0 +7FC0 +7FC0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 18 0 +BBX 16 14 1 0 +BITMAP +0FFF +0FFF +1F80 +1B80 +3B80 +3B80 +33FE +73FE +7380 +7F80 +FF80 +E380 +E3FF +E3FF +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 19 1 -5 +BITMAP +0F80 +3FE0 +78E0 +7070 +F070 +E000 +E000 +E000 +E000 +F070 +7070 +78E0 +3FE0 +0F80 +0C00 +0E00 +0300 +1F00 +1E00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 18 1 0 +BITMAP +3800 +1C00 +0E00 +0000 +FFC0 +FFC0 +E000 +E000 +E000 +E000 +FF80 +FF80 +E000 +E000 +E000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 18 1 0 +BITMAP +0380 +0700 +0E00 +0000 +FFC0 +FFC0 +E000 +E000 +E000 +E000 +FF80 +FF80 +E000 +E000 +E000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 18 1 0 +BITMAP +0E00 +1F00 +3B80 +0000 +FFC0 +FFC0 +E000 +E000 +E000 +E000 +FF80 +FF80 +E000 +E000 +E000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 17 1 0 +BITMAP +3300 +3300 +0000 +FFC0 +FFC0 +E000 +E000 +E000 +E000 +FF80 +FF80 +E000 +E000 +E000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 18 -1 0 +BITMAP +E0 +70 +38 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 18 1 0 +BITMAP +38 +70 +E0 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +20 +70 +D8 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +7F80 +7FE0 +70F0 +7070 +7038 +7038 +FE38 +FE38 +7038 +7038 +7070 +70F0 +7FE0 +7F80 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0EC0 +1FC0 +1B80 +0000 +E070 +F070 +F070 +F870 +FC70 +EC70 +EE70 +E670 +E770 +E370 +E1F0 +E1F0 +E0F0 +E070 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0E00 +0700 +0380 +0000 +0FC0 +3FF0 +7878 +7038 +F03C +E01C +E01C +E01C +E01C +F03C +7038 +7878 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +00E0 +01C0 +0380 +0000 +0FC0 +3FF0 +7878 +7038 +F03C +E01C +E01C +E01C +E01C +F03C +7038 +7878 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0380 +07C0 +0EE0 +0000 +0FC0 +3FF0 +7878 +7038 +F03C +E01C +E01C +E01C +E01C +F03C +7038 +7878 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0760 +0FE0 +0DC0 +0000 +0FC0 +3FF0 +7878 +7038 +F03C +E01C +E01C +E01C +E01C +F03C +7038 +7878 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 14 17 1 0 +BITMAP +0CC0 +0CC0 +0000 +0FC0 +3FF0 +7878 +7038 +F03C +E01C +E01C +E01C +E01C +F03C +7038 +7878 +3FF0 +0FC0 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 10 8 0 1 +BITMAP +E1C0 +7380 +3F00 +1E00 +1E00 +3F00 +7380 +E1C0 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +07EE +1FFC +3C38 +387C +78EE +71CE +738E +770E +7E0E +7C1E +381C +7C3C +EFF8 +C7E0 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +3800 +1C00 +0E00 +0000 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0380 +0700 +0E00 +0000 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +1F00 +3B80 +0000 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1980 +1980 +0000 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +71C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0380 +0700 +0E00 +0000 +E0E0 +E0E0 +E0E0 +71C0 +71C0 +3B80 +3B80 +1F00 +0E00 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +E000 +E000 +E000 +FE00 +FF80 +E3C0 +E1C0 +E1C0 +E3C0 +FF80 +FE00 +E000 +E000 +E000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +3C +7E +E7 +E7 +E7 +E7 +EE +EE +E7 +E7 +E7 +E7 +EF +EE +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +70 +38 +1C +00 +7C +FE +E7 +0F +3F +77 +E7 +E7 +FF +77 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0E +1C +38 +00 +7C +FE +E7 +0F +3F +77 +E7 +E7 +FF +77 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +1C +3E +77 +00 +7C +FE +E7 +0F +3F +77 +E7 +E7 +FF +77 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +3B +7F +6E +00 +7C +FE +E7 +0F +3F +77 +E7 +E7 +FF +77 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +36 +36 +00 +7C +FE +E7 +0F +3F +77 +E7 +E7 +FF +77 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +1C +36 +36 +1C +7C +FE +E7 +0F +3F +77 +E7 +E7 +FF +77 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 16 0 +BBX 14 10 1 0 +BITMAP +7CF0 +FFF8 +E71C +0F1C +3FFC +7700 +E700 +EF9C +FFFC +79F0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 15 1 -5 +BITMAP +1E00 +7F80 +7380 +E000 +E000 +E000 +E000 +7380 +7F80 +1E00 +1800 +1C00 +0600 +3E00 +3C00 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3800 +1C00 +0E00 +0000 +1E00 +7F00 +7380 +E180 +FF80 +FF80 +E000 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0700 +0E00 +1C00 +0000 +1E00 +7F00 +7380 +E180 +FF80 +FF80 +E000 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0E00 +1F00 +3B80 +0000 +1E00 +7F00 +7380 +E180 +FF80 +FF80 +E000 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +3300 +3300 +0000 +1E00 +7F00 +7380 +E180 +FF80 +FF80 +E000 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +E0 +70 +38 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +38 +70 +E0 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 14 -1 0 +BITMAP +38 +7C +EE +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +D8 +D8 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +7000 +1F00 +7C00 +0600 +1F00 +7F80 +7380 +E1C0 +E1C0 +E1C0 +E1C0 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3B00 +7F00 +6E00 +0000 +EF00 +FF80 +F380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3800 +1C00 +0E00 +0000 +1E00 +7F80 +7380 +E1C0 +E1C0 +E1C0 +E1C0 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +0700 +0E00 +1C00 +0000 +1E00 +7F80 +7380 +E1C0 +E1C0 +E1C0 +E1C0 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +0E00 +1F00 +3B80 +0000 +1E00 +7F80 +7380 +E1C0 +E1C0 +E1C0 +E1C0 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +1D80 +3F80 +3700 +0000 +1E00 +7F80 +7380 +E1C0 +E1C0 +E1C0 +E1C0 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +3300 +3300 +0000 +1E00 +7F80 +7380 +E1C0 +E1C0 +E1C0 +E1C0 +7380 +7F80 +1E00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 8 1 1 +BITMAP +1C00 +1C00 +0000 +FF80 +FF80 +0000 +1C00 +1C00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 12 10 0 0 +BITMAP +0F30 +3FE0 +38C0 +71E0 +77E0 +7EE0 +78E0 +31C0 +7FC0 +CF00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7000 +3800 +1C00 +0000 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0700 +0E00 +1C00 +0000 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +3E00 +7700 +0000 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +3600 +3600 +0000 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 18 0 -4 +BITMAP +0700 +0E00 +1C00 +0000 +E380 +E380 +E380 +7700 +7700 +7700 +3E00 +3E00 +1C00 +1C00 +1C00 +1800 +7800 +7000 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 18 1 -4 +BITMAP +E000 +E000 +E000 +E000 +EF00 +FF80 +F380 +E1C0 +E1C0 +E1C0 +E1C0 +F380 +FF80 +EF00 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 17 0 -4 +BITMAP +3600 +3600 +0000 +E380 +E380 +E380 +7700 +7700 +7700 +3E00 +3E00 +1C00 +1C00 +1C00 +1800 +7800 +7000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 14 14 -1 0 +BITMAP +03E0 +0FF8 +1E38 +1C1C +FF1C +FF00 +3800 +3800 +FF00 +FF1C +1C1C +1E38 +0FF8 +03E0 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvB24.bdf b/src/3rdparty/fonts/helvB24.bdf new file mode 100644 index 0000000000..f06ffe51cb --- /dev/null +++ b/src/3rdparty/fonts/helvB24.bdf @@ -0,0 +1,4718 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-R-Normal--24-240-75-75-P-138-ISO10646-1 +SIZE 24 75 75 +FONTBOUNDINGBOX 27 29 -2 -5 +COMMENT $XConsortium: helvB24.bdf,v 1.14 95/01/26 18:01:49 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 24 +POINT_SIZE 240 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 138 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 19 +X_HEIGHT 14 +FONT_ASCENT 22 +FONT_DESCENT 5 +FACE_NAME "Helvetica Bold" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Bold" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 3 19 2 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +00 +E0 +E0 +E0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 9 0 +BBX 5 6 2 13 +BITMAP +D8 +D8 +D8 +D8 +D8 +90 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 18 0 0 +BITMAP +0CC0 +0CC0 +0CC0 +0CC0 +0CC0 +7FF0 +7FF0 +1980 +1980 +1980 +1980 +FFE0 +FFE0 +3300 +3300 +3300 +3300 +3300 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 21 0 -2 +BITMAP +0600 +3F80 +7FC0 +F6E0 +E6E0 +E6E0 +F600 +7E00 +3E00 +0F00 +07C0 +07E0 +06F0 +E670 +E670 +E670 +F6F0 +7FE0 +1FC0 +0600 +0600 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 22 0 +BBX 21 18 0 0 +BITMAP +000700 +3E0700 +7F0E00 +E38E00 +C19C00 +C19C00 +E3B800 +7F3800 +3E7000 +007000 +00E3E0 +00E7F0 +01CE38 +01CC18 +038C18 +038E38 +0707F0 +0703E0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 18 1 0 +BITMAP +0F80 +1FC0 +3DE0 +38E0 +38E0 +38E0 +1DC0 +0F80 +1F00 +3F9C +7BDC +71FC +E0F8 +E070 +E0F8 +F1FC +7FCE +1F87 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 6 2 13 +BITMAP +E0 +E0 +E0 +60 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 24 1 -5 +BITMAP +0C +1C +38 +38 +70 +70 +60 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +60 +70 +70 +38 +38 +1C +0C +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 24 1 -5 +BITMAP +C0 +E0 +70 +70 +38 +38 +18 +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +18 +38 +38 +70 +70 +E0 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 8 7 1 12 +BITMAP +18 +18 +DB +FF +3C +66 +66 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 11 12 2 1 +BITMAP +0E00 +0E00 +0E00 +0E00 +0E00 +FFE0 +FFE0 +0E00 +0E00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 6 2 -3 +BITMAP +E0 +E0 +E0 +60 +60 +C0 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 2 1 6 +BITMAP +FFF0 +FFF0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 3 2 0 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 8 19 0 0 +BITMAP +07 +07 +06 +06 +0E +0C +0C +1C +1C +18 +18 +38 +30 +30 +70 +60 +60 +E0 +E0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +1F80 +3FC0 +79E0 +70E0 +70E0 +E070 +E070 +E070 +E070 +E070 +E070 +E070 +E070 +70E0 +70E0 +79E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 7 18 2 0 +BITMAP +0E +0E +1E +FE +FE +0E +0E +0E +0E +0E +0E +0E +0E +0E +0E +0E +0E +0E +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +1F00 +7FC0 +71E0 +E0E0 +E070 +E070 +0070 +00E0 +01E0 +03C0 +0780 +1F00 +3C00 +7800 +F000 +E000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +1F00 +7FC0 +71C0 +E0E0 +E0E0 +E0E0 +00E0 +01C0 +0F80 +0FE0 +00E0 +0070 +0070 +E070 +E0F0 +71E0 +7FE0 +1F80 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +01C0 +03C0 +03C0 +07C0 +07C0 +0DC0 +1DC0 +19C0 +31C0 +71C0 +61C0 +E1C0 +FFF0 +FFF0 +01C0 +01C0 +01C0 +01C0 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +7FE0 +7FE0 +7000 +7000 +7000 +7000 +7F80 +7FC0 +71E0 +00E0 +0070 +0070 +0070 +E070 +E0F0 +F1E0 +7FC0 +1F80 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0F80 +3FE0 +78E0 +7070 +E070 +E000 +E000 +EF00 +FFC0 +F9E0 +F0E0 +E070 +E070 +E070 +70E0 +79E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +FFF0 +FFF0 +00F0 +00E0 +01C0 +01C0 +0380 +0380 +0700 +0700 +0E00 +0E00 +1E00 +1C00 +1C00 +3C00 +3800 +3800 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0F00 +3FC0 +39C0 +70E0 +70E0 +70E0 +70E0 +39C0 +1F80 +3FC0 +70E0 +E070 +E070 +E070 +E070 +70E0 +7FE0 +1F80 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +1F80 +7FC0 +79E0 +F0E0 +E070 +E070 +E070 +E070 +F0F0 +79F0 +7FF0 +1F70 +0070 +0070 +E0E0 +F3E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 3 14 2 0 +BITMAP +E0 +E0 +E0 +00 +00 +00 +00 +00 +00 +00 +00 +E0 +E0 +E0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 3 17 2 -3 +BITMAP +E0 +E0 +E0 +00 +00 +00 +00 +00 +00 +00 +00 +E0 +E0 +E0 +60 +60 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 13 12 0 1 +BITMAP +0038 +00F8 +03E0 +0F80 +3E00 +F000 +F000 +3E00 +0F80 +03E0 +00F8 +0038 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 10 6 2 4 +BITMAP +FFC0 +FFC0 +0000 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 13 12 0 1 +BITMAP +E000 +F800 +3E00 +0F80 +03E0 +0078 +0078 +03E0 +0F80 +3E00 +F800 +E000 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 19 2 0 +BITMAP +1F80 +7FC0 +79E0 +F0E0 +E0E0 +E1E0 +01C0 +03C0 +0780 +0700 +0E00 +0E00 +0E00 +0E00 +0000 +0000 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 24 0 +BBX 22 22 1 -4 +BITMAP +01FF00 +07FFC0 +0F81F0 +1E0078 +3C0038 +787D9C +70FF9C +F1C71C +E3871C +E30E1C +E70E38 +E70C38 +E71C70 +E71C70 +E39DE0 +F3FFC0 +71F700 +780000 +3C0000 +1F0700 +0FFF00 +03FC00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 19 1 0 +BITMAP +03C0 +03C0 +07E0 +07E0 +0E60 +0E70 +0E70 +1C38 +1C38 +1C38 +381C +381C +3FFC +7FFE +700E +700E +E007 +E007 +E007 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 15 19 2 0 +BITMAP +FFE0 +FFF8 +E078 +E01C +E01C +E01C +E01C +E038 +FFF0 +FFF8 +E01C +E00E +E00E +E00E +E00E +E01E +E07C +FFF8 +FFE0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 19 1 0 +BITMAP +07F0 +1FFC +3E3E +780F +7007 +F000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +F007 +7007 +780F +3E3E +1FFC +07F0 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 16 19 2 0 +BITMAP +FFE0 +FFF8 +E07C +E01E +E00E +E00F +E007 +E007 +E007 +E007 +E007 +E007 +E007 +E00F +E00E +E01E +E07C +FFF8 +FFE0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 13 19 2 0 +BITMAP +FFF0 +FFF0 +E000 +E000 +E000 +E000 +E000 +E000 +FFE0 +FFE0 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 2 0 +BITMAP +FFF0 +FFF0 +E000 +E000 +E000 +E000 +E000 +E000 +FFE0 +FFE0 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 19 1 0 +BITMAP +07F000 +1FFC00 +3E3E00 +780F00 +700700 +F00000 +E00000 +E00000 +E00000 +E07F80 +E07F80 +E00380 +E00380 +F00380 +700780 +780F80 +3E3F80 +1FFB80 +07F180 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 15 19 2 0 +BITMAP +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +FFFE +FFFE +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 19 2 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 19 1 0 +BITMAP +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +00E0 +E0E0 +E0E0 +E0E0 +E0E0 +71E0 +7FC0 +3F80 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 19 2 0 +BITMAP +E03C +E078 +E0F0 +E1E0 +E3C0 +E780 +EF00 +FE00 +FE00 +FF00 +F780 +E3C0 +E1E0 +E0F0 +E078 +E03C +E01E +E00F +E007 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 2 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 23 0 +BBX 19 19 2 0 +BITMAP +E000E0 +F001E0 +F001E0 +F803E0 +F803E0 +FC07E0 +EC06E0 +EE0EE0 +E60CE0 +E71CE0 +E71CE0 +E318E0 +E3B8E0 +E3B8E0 +E1F0E0 +E1F0E0 +E0E0E0 +E0E0E0 +E0E0E0 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 15 19 2 0 +BITMAP +E00E +F00E +F00E +F80E +F80E +FC0E +EE0E +EE0E +E70E +E38E +E38E +E1CE +E0CE +E0EE +E07E +E03E +E03E +E01E +E00E +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 19 1 0 +BITMAP +07F000 +1FFC00 +3E3E00 +780F00 +700700 +F00780 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +F00780 +700700 +780F00 +3E3E00 +1FFC00 +07F000 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 14 19 2 0 +BITMAP +FFE0 +FFF8 +E038 +E01C +E01C +E01C +E01C +E038 +FFF8 +FFF0 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 19 1 0 +BITMAP +07F000 +1FFC00 +3E3E00 +780F00 +700700 +F00780 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +F00780 +70F700 +787F00 +3E1E00 +1FFF00 +07F780 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 17 0 +BBX 14 19 2 0 +BITMAP +FFE0 +FFF8 +E038 +E01C +E01C +E01C +E01C +E038 +FFF8 +FFF0 +E078 +E038 +E01C +E01C +E01C +E01C +E01C +E01C +E01C +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +07E0 +1FF8 +3C7C +781C +701C +7000 +7800 +3E00 +1FE0 +03F8 +007C +001E +000E +E00E +E00E +F01E +7C7C +3FF8 +0FE0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +FFFE +FFFE +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 15 19 2 0 +BITMAP +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +F01E +701C +7C7C +3FF8 +0FE0 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 18 0 +BBX 16 19 1 0 +BITMAP +E007 +E007 +F00F +700E +781E +381C +381C +3C3C +1C38 +1C38 +1E78 +0E70 +0E70 +0E70 +07E0 +07E0 +03C0 +03C0 +03C0 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 23 0 +BBX 21 19 1 0 +BITMAP +E07038 +E07038 +E07038 +E07038 +70F870 +70F870 +70D870 +71DC70 +31DC60 +39DCE0 +398CE0 +3B8EE0 +1B8EC0 +1B8EC0 +1F07C0 +1F07C0 +0E0380 +0E0380 +0E0380 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 18 0 +BBX 16 19 1 0 +BITMAP +E007 +F00F +781E +381C +1C38 +0E70 +0FF0 +07E0 +03C0 +03C0 +07E0 +0FF0 +0E70 +1C38 +3C3C +381C +700E +F00F +E007 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +E00E +F01E +701C +783C +3838 +3C78 +1C70 +1EF0 +0EE0 +0FE0 +07C0 +07C0 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +FFFC +FFFC +003C +0078 +00F0 +01E0 +01E0 +03C0 +0780 +0780 +0F00 +1E00 +1E00 +3C00 +3800 +7800 +F000 +FFFC +FFFC +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 5 24 1 -5 +BITMAP +F8 +F8 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +F8 +F8 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 8 19 0 0 +BITMAP +E0 +E0 +60 +60 +70 +30 +30 +38 +38 +18 +18 +1C +0C +0C +0E +06 +06 +07 +07 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 5 24 2 -5 +BITMAP +F8 +F8 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +F8 +F8 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 11 9 1 10 +BITMAP +0E00 +0E00 +1F00 +1B00 +3B80 +71C0 +71C0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 2 0 -5 +BITMAP +FFFC +FFFC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 6 2 13 +BITMAP +60 +C0 +C0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +1F80 +3FC0 +71E0 +70E0 +00E0 +07E0 +3FE0 +7CE0 +F0E0 +E0E0 +E1E0 +F3E0 +7FF0 +3E70 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 2 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +EF80 +FFC0 +F9E0 +F0E0 +E070 +E070 +E070 +E070 +E070 +E070 +F0E0 +F9E0 +FFC0 +EF80 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F80 +3FC0 +79E0 +70E0 +E000 +E000 +E000 +E000 +E000 +E000 +70E0 +79E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 1 0 +BITMAP +0070 +0070 +0070 +0070 +0070 +1F70 +3FF0 +79F0 +70F0 +E070 +E070 +E070 +E070 +E070 +E070 +70F0 +79F0 +3FF0 +1F70 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +FFF0 +FFF0 +E000 +E000 +7070 +78F0 +3FE0 +0F80 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 7 19 1 0 +BITMAP +1E +3E +38 +38 +38 +FE +FE +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 1 -5 +BITMAP +1F70 +3FF0 +79F0 +70F0 +E070 +E070 +E070 +E070 +E070 +E070 +70F0 +79F0 +3FF0 +1F70 +0070 +E070 +F0E0 +7FE0 +1F80 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 19 2 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +EF00 +FFC0 +F1C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 19 2 0 +BITMAP +E0 +E0 +E0 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 5 24 0 -5 +BITMAP +38 +38 +38 +00 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +F8 +F0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 2 0 +BITMAP +E000 +E000 +E000 +E000 +E000 +E1E0 +E3C0 +E780 +EF00 +FE00 +FC00 +FE00 +EF00 +E700 +E780 +E3C0 +E1C0 +E1E0 +E0F0 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 19 2 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 21 0 +BBX 17 14 2 0 +BITMAP +EF3E00 +FFFF00 +F3E780 +E1C380 +E1C380 +E1C380 +E1C380 +E1C380 +E1C380 +E1C380 +E1C380 +E1C380 +E1C380 +E1C380 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 14 2 0 +BITMAP +EF80 +FFC0 +F1C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +E070 +E070 +E070 +E070 +70E0 +79E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 2 -5 +BITMAP +EF80 +FFC0 +F9E0 +F0E0 +E070 +E070 +E070 +E070 +E070 +E070 +F0E0 +F9E0 +FFC0 +EF80 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 1 -5 +BITMAP +1F70 +3FF0 +79F0 +70F0 +E070 +E070 +E070 +E070 +E070 +E070 +70F0 +79F0 +3FF0 +1F70 +0070 +0070 +0070 +0070 +0070 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 7 14 2 0 +BITMAP +E6 +EE +FE +F0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3F00 +7F80 +F3C0 +E1C0 +E000 +FC00 +7F80 +0FC0 +01E0 +E0E0 +E0E0 +F1E0 +7FC0 +3F80 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 7 18 1 0 +BITMAP +38 +38 +38 +38 +FE +FE +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +3E +1E +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 14 2 0 +BITMAP +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +73E0 +7EE0 +1CE0 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +E070 +E070 +E070 +70E0 +70E0 +70E0 +39C0 +39C0 +39C0 +1F80 +1F80 +0F00 +0F00 +0F00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +E0E0E0 +E0E0E0 +60E0C0 +71F1C0 +71F1C0 +31B180 +33B980 +3BBB80 +1B1B00 +1F1F00 +1F1F00 +0E0E00 +0E0E00 +0E0E00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +E0E0 +F1E0 +71C0 +3B80 +3F80 +1F00 +0E00 +1F00 +1F00 +3B80 +7BC0 +71C0 +F1E0 +E0E0 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 15 0 +BBX 13 19 1 -5 +BITMAP +E038 +E038 +7038 +7870 +3870 +3CF0 +1CE0 +1CE0 +0FC0 +0FC0 +07C0 +0780 +0380 +0380 +0700 +0700 +0E00 +3E00 +3C00 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFE0 +FFE0 +01C0 +0380 +0780 +0F00 +0E00 +1E00 +3C00 +3800 +7000 +F000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 7 24 1 -5 +BITMAP +0E +1C +38 +38 +38 +38 +38 +38 +38 +38 +70 +E0 +E0 +70 +38 +38 +38 +38 +38 +38 +38 +38 +1C +0E +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 7 0 +BBX 3 24 2 -5 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 7 24 2 -5 +BITMAP +E0 +70 +38 +38 +38 +38 +38 +38 +38 +38 +1C +0E +0E +1C +38 +38 +38 +38 +38 +38 +38 +38 +70 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 11 4 1 5 +BITMAP +78E0 +FEE0 +EFE0 +E3C0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 3 19 2 -5 +BITMAP +E0 +E0 +E0 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 18 1 -2 +BITMAP +0180 +0180 +1F80 +3FC0 +7BE0 +7360 +E300 +E600 +E600 +E600 +E600 +EC00 +ECE0 +7DE0 +7FC0 +3F80 +1800 +1800 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 18 0 0 +BITMAP +1F80 +3FC0 +70E0 +70E0 +7000 +7800 +3800 +1C00 +FFC0 +FFC0 +1C00 +1C00 +1C00 +3800 +3800 +7738 +FFF8 +F9F0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 12 1 3 +BITMAP +C030 +EF70 +7FE0 +39C0 +70E0 +70E0 +70E0 +70E0 +39C0 +7FE0 +EF70 +C030 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 18 0 0 +BITMAP +E038 +E038 +7070 +7070 +38E0 +38E0 +1DC0 +1DC0 +7FF0 +7FF0 +0700 +7FF0 +7FF0 +0700 +0700 +0700 +0700 +0700 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 7 0 +BBX 3 23 2 -4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +00 +00 +00 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 24 1 -5 +BITMAP +1F80 +3FC0 +79E0 +70E0 +78E0 +3C00 +1E00 +7F00 +F780 +E3C0 +E1E0 +E0E0 +7070 +7870 +3C70 +1EE0 +0FC0 +0780 +03C0 +71E0 +70E0 +79E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 7 2 1 16 +BITMAP +EE +EE +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 19 0 +BBX 17 17 1 0 +BITMAP +07F000 +1E3C00 +380E00 +700700 +63E300 +E73380 +CE3180 +CE0180 +CE0180 +CE0180 +CE3180 +E73180 +63E300 +700700 +380E00 +1E3C00 +07F000 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 10 0 +BBX 8 12 1 7 +BITMAP +7C +FE +C6 +1E +7E +E6 +C6 +FF +7B +00 +FF +FF +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 10 8 1 3 +BITMAP +1DC0 +3B80 +7700 +EE00 +EE00 +7700 +3B80 +1DC0 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 7 1 4 +BITMAP +FFF0 +FFF0 +0030 +0030 +0030 +0030 +0030 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 7 3 0 6 +BITMAP +FE +FE +FE +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 19 0 +BBX 17 17 1 0 +BITMAP +07F000 +1E3C00 +380E00 +700700 +67E300 +E63380 +C63180 +C63180 +C7E180 +C6C180 +C66180 +E63180 +661B00 +700700 +380E00 +1E3C00 +07F000 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 7 2 1 17 +BITMAP +FE +FE +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 9 0 +BBX 8 7 0 11 +BITMAP +3C +66 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 11 13 2 0 +BITMAP +0E00 +0E00 +0E00 +0E00 +FFE0 +FFE0 +0E00 +0E00 +0E00 +0E00 +0000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 6 10 0 8 +BITMAP +78 +FC +CC +0C +1C +78 +E0 +C0 +FC +FC +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 6 10 0 8 +BITMAP +78 +FC +CC +0C +38 +38 +0C +CC +FC +78 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 4 1 15 +BITMAP +1C +38 +70 +E0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 19 2 -5 +BITMAP +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +F3E0 +FEE0 +ECE0 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 24 1 -5 +BITMAP +0FE0 +3FE0 +7CC0 +7CC0 +FCC0 +FCC0 +FCC0 +FCC0 +FCC0 +7CC0 +7CC0 +3CC0 +1CC0 +0CC0 +0CC0 +0CC0 +0CC0 +0CC0 +0CC0 +0CC0 +0CC0 +0CC0 +0CC0 +0CC0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 3 2 6 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 6 1 -5 +BITMAP +70 +78 +1C +1C +FC +78 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 4 10 0 8 +BITMAP +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 10 0 +BBX 8 12 1 7 +BITMAP +3C +7E +E7 +C3 +C3 +C3 +E7 +7E +3C +00 +FF +FF +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 10 8 1 3 +BITMAP +EE00 +7700 +3B80 +1DC0 +1DC0 +3B80 +7700 +EE00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 17 18 1 0 +BITMAP +301800 +301800 +F03000 +F03000 +306000 +306000 +30C000 +30C000 +318600 +318E00 +031E00 +031E00 +063600 +066600 +0C7F80 +0C7F80 +180600 +180600 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 16 18 1 0 +BITMAP +3018 +3018 +F030 +F030 +3060 +3060 +30C0 +30C0 +319E +31BF +0333 +0303 +0607 +061E +0C38 +0C30 +183F +183F +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 17 18 1 0 +BITMAP +781800 +FC1800 +CC3000 +0C3000 +386000 +386000 +0CC000 +CCC000 +FD8600 +798E00 +031E00 +031E00 +063600 +066600 +0C7F80 +0C7F80 +180600 +180600 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 19 2 -5 +BITMAP +0E00 +0E00 +0E00 +0000 +0000 +0E00 +0E00 +0E00 +0E00 +1C00 +3C00 +7800 +7000 +F0E0 +E0E0 +E1E0 +F3C0 +7FC0 +3F00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 24 1 0 +BITMAP +0E00 +0700 +0380 +01C0 +0000 +03C0 +03C0 +07E0 +07E0 +0E60 +0E70 +0E70 +1C38 +1C38 +1C38 +381C +381C +3FFC +7FFE +700E +700E +E007 +E007 +E007 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 24 1 0 +BITMAP +0038 +0070 +00E0 +01C0 +0000 +03C0 +03C0 +07E0 +07E0 +0E60 +0E70 +0E70 +1C38 +1C38 +1C38 +381C +381C +3FFC +7FFE +700E +700E +E007 +E007 +E007 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 24 1 0 +BITMAP +01C0 +03E0 +0770 +0E38 +0000 +03C0 +03C0 +07E0 +07E0 +0E60 +0E70 +0E70 +1C38 +1C38 +1C38 +381C +381C +3FFC +7FFE +700E +700E +E007 +E007 +E007 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 23 1 0 +BITMAP +0798 +0FF8 +0CF0 +0000 +03C0 +03C0 +07E0 +07E0 +0E60 +0E70 +0E70 +1C38 +1C38 +1C38 +381C +381C +3FFC +7FFE +700E +700E +E007 +E007 +E007 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 23 1 0 +BITMAP +0E70 +0E70 +0000 +0000 +03C0 +03C0 +07E0 +07E0 +0E60 +0E70 +0E70 +1C38 +1C38 +1C38 +381C +381C +3FFC +7FFE +700E +700E +E007 +E007 +E007 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 23 1 0 +BITMAP +03C0 +0660 +0660 +0660 +03C0 +03C0 +07E0 +07E0 +0E60 +0E70 +0E70 +1C38 +1C38 +1C38 +381C +381C +3FFC +7FFE +700E +700E +E007 +E007 +E007 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 24 0 +BBX 22 19 1 0 +BITMAP +03FFF8 +03FFF8 +07F000 +067000 +0E7000 +0E7000 +0E7000 +1C7000 +1C7FF0 +1C7FF0 +387000 +387000 +3FF000 +7FF000 +707000 +707000 +E07000 +E07FFC +E07FFC +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 24 1 -5 +BITMAP +07F0 +1FFC +3E3E +780F +7007 +F000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +F007 +7007 +780F +3E3E +1FFC +07F0 +03C0 +00E0 +00E0 +07E0 +03C0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 13 24 2 0 +BITMAP +7000 +3800 +1C00 +0E00 +0000 +FFF0 +FFF0 +E000 +E000 +E000 +E000 +E000 +E000 +FFE0 +FFE0 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 13 24 2 0 +BITMAP +00E0 +01C0 +0380 +0700 +0000 +FFF0 +FFF0 +E000 +E000 +E000 +E000 +E000 +E000 +FFE0 +FFE0 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 13 24 2 0 +BITMAP +0700 +0F80 +1DC0 +38E0 +0000 +FFF0 +FFF0 +E000 +E000 +E000 +E000 +E000 +E000 +FFE0 +FFE0 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 13 23 2 0 +BITMAP +39C0 +39C0 +0000 +0000 +FFF0 +FFF0 +E000 +E000 +E000 +E000 +E000 +E000 +FFE0 +FFE0 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 24 0 0 +BITMAP +E0 +70 +38 +1C +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 24 2 0 +BITMAP +1C +38 +70 +E0 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 9 24 -1 0 +BITMAP +1C00 +3E00 +7700 +E380 +0000 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 7 23 0 0 +BITMAP +EE +EE +00 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 19 19 -1 0 +BITMAP +1FFC00 +1FFF00 +1C0F80 +1C03C0 +1C01C0 +1C01E0 +1C00E0 +1C00E0 +FFC0E0 +FFC0E0 +1C00E0 +1C00E0 +1C00E0 +1C01E0 +1C01C0 +1C03C0 +1C0F80 +1FFF00 +1FFC00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 15 23 2 0 +BITMAP +0E30 +1FF0 +19E0 +0000 +E00E +F00E +F00E +F80E +F80E +FC0E +EE0E +EE0E +E70E +E38E +E38E +E1CE +E0CE +E0EE +E07E +E03E +E03E +E01E +E00E +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 24 1 0 +BITMAP +070000 +038000 +01C000 +00E000 +000000 +07F000 +1FFC00 +3E3E00 +780F00 +700700 +F00780 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +F00780 +700700 +780F00 +3E3E00 +1FFC00 +07F000 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 24 1 0 +BITMAP +003800 +007000 +00E000 +01C000 +000000 +07F000 +1FFC00 +3E3E00 +780F00 +700700 +F00780 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +F00780 +700700 +780F00 +3E3E00 +1FFC00 +07F000 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 24 1 0 +BITMAP +01C000 +03E000 +077000 +0E3800 +000000 +07F000 +1FFC00 +3E3E00 +780F00 +700700 +F00780 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +F00780 +700700 +780F00 +3E3E00 +1FFC00 +07F000 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 24 1 0 +BITMAP +079800 +0FF800 +0CF000 +000000 +000000 +07F000 +1FFC00 +3E3E00 +780F00 +700700 +F00780 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +F00780 +700700 +780F00 +3E3E00 +1FFC00 +07F000 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 23 1 0 +BITMAP +0E3800 +0E3800 +000000 +000000 +07F000 +1FFC00 +3E3E00 +780F00 +700700 +F00780 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +E00380 +F00780 +700700 +780F00 +3E3E00 +1FFC00 +07F000 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 12 1 1 +BITMAP +4020 +E070 +70E0 +39C0 +1F80 +0F00 +0F00 +1F80 +39C0 +70E0 +E070 +4020 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 19 19 0 0 +BITMAP +03F860 +0FFEE0 +1F1FC0 +3C0380 +380780 +780FC0 +701DC0 +7039C0 +7071C0 +70E1C0 +71C1C0 +7381C0 +7701C0 +7E03C0 +3C0380 +3C0780 +7F1F00 +EFFE00 +C3F800 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 15 24 2 0 +BITMAP +0E00 +0700 +0380 +01C0 +0000 +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +F01E +F01E +701C +7C7C +3FF8 +0FE0 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 15 24 2 0 +BITMAP +0070 +00E0 +01C0 +0380 +0000 +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +F01E +F01E +701C +7C7C +3FF8 +0FE0 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 15 24 2 0 +BITMAP +0780 +0FC0 +1CE0 +3870 +0000 +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +F01E +F01E +701C +7C7C +3FF8 +0FE0 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 15 23 2 0 +BITMAP +1C70 +1C70 +0000 +0000 +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +E00E +F01E +F01E +701C +7C7C +3FF8 +0FE0 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +0070 +00E0 +01C0 +0380 +0000 +F01E +701C +783C +3838 +3C78 +1C70 +1EF0 +0EE0 +0FE0 +07C0 +07C0 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +0380 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 14 19 2 0 +BITMAP +E000 +E000 +E000 +E000 +FFE0 +FFF8 +E038 +E01C +E01C +E01C +E01C +E038 +FFF8 +FFF0 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 11 19 2 0 +BITMAP +1E00 +7F80 +F380 +E1C0 +E1C0 +E1C0 +E1C0 +E380 +EF00 +EF80 +E3C0 +E1C0 +E0E0 +E0E0 +E0E0 +E0E0 +E1C0 +EFC0 +EF80 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +1C00 +0E00 +0700 +0380 +0000 +1F80 +3FC0 +71E0 +70E0 +00E0 +07E0 +3FE0 +7CE0 +F0E0 +E0E0 +E1E0 +F3E0 +7FF0 +3E70 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +01C0 +0380 +0700 +0E00 +0000 +1F80 +3FC0 +71E0 +70E0 +00E0 +07E0 +3FE0 +7CE0 +F0E0 +E0E0 +E1E0 +F3E0 +7FF0 +3E70 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0700 +0F80 +1DC0 +38E0 +0000 +1F80 +3FC0 +71E0 +70E0 +00E0 +07E0 +3FE0 +7CE0 +F0E0 +E0E0 +E1E0 +F3E0 +7FF0 +3E70 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +1E60 +3FE0 +33C0 +0000 +0000 +1F80 +3FC0 +71E0 +70E0 +00E0 +07E0 +3FE0 +7CE0 +F0E0 +E0E0 +E1E0 +F3E0 +7FF0 +3E70 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +1DC0 +1DC0 +0000 +0000 +1F80 +3FC0 +71E0 +70E0 +00E0 +07E0 +3FE0 +7CE0 +F0E0 +E0E0 +E1E0 +F3E0 +7FF0 +3E70 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0F00 +1980 +1980 +1980 +0F00 +1F80 +3FC0 +71E0 +70E0 +00E0 +07E0 +3FE0 +7CE0 +F0E0 +E0E0 +E1E0 +F3E0 +7FF0 +3E70 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 22 0 +BBX 20 14 1 0 +BITMAP +1F8F00 +3FFFC0 +71F9E0 +70F0E0 +00E070 +07E070 +3FFFF0 +7CFFF0 +F0E000 +E0E000 +E1F070 +F3F8F0 +7F3FE0 +3E0F80 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 -5 +BITMAP +1F80 +3FC0 +79E0 +70E0 +E000 +E000 +E000 +E000 +E000 +E000 +70E0 +79E0 +3FC0 +1F80 +1E00 +0700 +0700 +3F00 +1E00 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +1C00 +0E00 +0700 +0380 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +FFF0 +FFF0 +E000 +E000 +7070 +78F0 +3FE0 +0F80 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +01C0 +0380 +0700 +0E00 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +FFF0 +FFF0 +E000 +E000 +7070 +78F0 +3FE0 +0F80 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0700 +0F80 +1DC0 +38E0 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +FFF0 +FFF0 +E000 +E000 +7070 +78F0 +3FE0 +0F80 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +39C0 +39C0 +0000 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +FFF0 +FFF0 +E000 +E000 +7070 +78F0 +3FE0 +0F80 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 19 1 0 +BITMAP +E0 +70 +38 +1C +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 19 1 0 +BITMAP +1C +38 +70 +E0 +00 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 9 19 -1 0 +BITMAP +1C00 +3E00 +7700 +E380 +0000 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 7 18 0 0 +BITMAP +EE +EE +00 +00 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +E000 +39C0 +1F00 +3E00 +C300 +0F80 +3FC0 +79E0 +70E0 +E070 +E070 +E070 +E070 +E070 +E070 +70E0 +79E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 19 2 0 +BITMAP +3CC0 +7FC0 +6780 +0000 +0000 +EF80 +FFC0 +F1C0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +1C00 +0E00 +0700 +0380 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +E070 +E070 +E070 +E070 +70E0 +79E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +01C0 +0380 +0700 +0E00 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +E070 +E070 +E070 +E070 +70E0 +79E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +0700 +0F80 +1DC0 +38E0 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +E070 +E070 +E070 +E070 +70E0 +79E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 12 19 1 0 +BITMAP +1E60 +3FE0 +33C0 +0000 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +E070 +E070 +E070 +E070 +70E0 +79E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +1DC0 +1DC0 +0000 +0000 +0F00 +3FC0 +79E0 +70E0 +E070 +E070 +E070 +E070 +E070 +E070 +70E0 +79E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 11 12 2 1 +BITMAP +0E00 +0E00 +0E00 +0000 +0000 +FFE0 +FFE0 +0000 +0000 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +078C +1FF8 +3CF0 +3870 +70F8 +71F8 +73B8 +7738 +7E38 +7C38 +3870 +7CF0 +DFE0 +8780 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 19 2 0 +BITMAP +3800 +1C00 +0E00 +0700 +0000 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +73E0 +7EE0 +1CE0 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 19 2 0 +BITMAP +0380 +0700 +0E00 +1C00 +0000 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +73E0 +7EE0 +1CE0 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 19 2 0 +BITMAP +0E00 +1F00 +3B80 +71C0 +0000 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +73E0 +7EE0 +1CE0 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 11 18 2 0 +BITMAP +3B80 +3B80 +0000 +0000 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E0E0 +E1E0 +73E0 +7EE0 +1CE0 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 15 0 +BBX 13 24 1 -5 +BITMAP +00E0 +01C0 +0380 +0700 +0000 +E038 +E038 +7038 +7870 +3870 +3CF0 +1CE0 +1CE0 +0FC0 +0FC0 +07C0 +0780 +0380 +0380 +0700 +0700 +0E00 +3E00 +3C00 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 24 2 -5 +BITMAP +E000 +E000 +E000 +E000 +E000 +EF80 +FFC0 +F9E0 +F0E0 +E070 +E070 +E070 +E070 +E070 +E070 +F0E0 +F9E0 +FFC0 +EF80 +E000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 15 0 +BBX 13 23 1 -5 +BITMAP +1CE0 +1CE0 +0000 +0000 +E038 +E038 +7038 +7870 +3870 +3CF0 +1CE0 +1CE0 +0FC0 +0FC0 +07C0 +0780 +0380 +0380 +0700 +0700 +0E00 +3E00 +3C00 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 19 -1 0 +BITMAP +01FC00 +07FF00 +0F8F80 +1E03C0 +1C01C0 +3C0000 +FFC000 +FFC000 +380000 +380000 +FFC000 +FFC000 +380000 +3C01C0 +1C01C0 +1E03C0 +0F8F80 +07FF00 +01FC00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvBO08.bdf b/src/3rdparty/fonts/helvBO08.bdf new file mode 100644 index 0000000000..9c60df23a2 --- /dev/null +++ b/src/3rdparty/fonts/helvBO08.bdf @@ -0,0 +1,2597 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-O-Normal--8-80-75-75-P-50-ISO10646-1 +SIZE 8 75 75 +FONTBOUNDINGBOX 13 11 -2 -2 +COMMENT $XConsortium: helvBO08.bdf,v 1.13 95/01/26 18:01:56 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 8 +POINT_SIZE 80 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 50 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 6 +X_HEIGHT 5 +FONT_ASCENT 8 +FONT_DESCENT 2 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 6 0 0 +BITMAP +20 +60 +60 +40 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 5 0 +BBX 4 2 1 4 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +50 +F8 +50 +F0 +A0 +A0 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +10 +38 +60 +30 +B0 +E0 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 7 0 +BBX 6 6 1 0 +BITMAP +64 +A8 +D0 +2C +54 +98 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +28 +30 +74 +D8 +6C +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 3 0 3 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 8 0 -2 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 8 0 -2 +BITMAP +60 +30 +30 +30 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 3 3 2 3 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +20 +20 +F0 +40 +40 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 3 -1 -1 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 2 0 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 6 1 0 +BITMAP +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +78 +58 +D8 +F0 +60 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 3 6 1 0 +BITMAP +20 +E0 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +58 +18 +70 +C0 +F0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +58 +38 +10 +B0 +60 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +18 +38 +50 +F8 +20 +20 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +78 +60 +70 +10 +B0 +60 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +68 +60 +F0 +D0 +60 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +F0 +30 +20 +60 +C0 +C0 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +58 +78 +F0 +D0 +60 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +58 +78 +18 +B0 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 5 0 0 +BITMAP +40 +40 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 6 -1 -1 +BITMAP +20 +20 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 4 1 1 +BITMAP +30 +60 +C0 +60 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 3 0 1 +BITMAP +78 +00 +F0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +30 +60 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +E0 +30 +E0 +80 +00 +80 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 8 0 +BBX 7 7 0 -1 +BITMAP +3C +62 +5A +AA +BC +C0 +78 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 -1 0 +BITMAP +08 +18 +2C +7C +CC +CC +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +6C +78 +CC +D8 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +3C +6C +C0 +C8 +D8 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +64 +64 +CC +D8 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 6 6 0 0 +BITMAP +7C +60 +78 +C0 +C0 +F0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 4 0 +BBX 5 6 0 0 +BITMAP +78 +60 +70 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +3C +60 +C0 +DC +D8 +78 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +6C +78 +78 +D8 +D8 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 6 0 0 +BITMAP +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 6 6 0 0 +BITMAP +3C +18 +18 +D8 +B0 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +68 +70 +F0 +D8 +D8 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +60 +60 +C0 +C0 +F0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 8 0 +BBX 9 6 0 0 +BITMAP +6380 +6300 +7700 +FE00 +D600 +D600 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 7 6 0 0 +BITMAP +66 +64 +74 +F8 +C8 +C8 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +64 +6C +F8 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +38 +6C +CC +CC +D8 +70 +08 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +64 +78 +CC +D8 +D8 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +6C +70 +38 +D8 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 6 1 0 +BITMAP +F8 +60 +60 +E0 +C0 +C0 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 1 0 +BITMAP +CC +C8 +D8 +D0 +F0 +60 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 8 0 +BBX 8 6 1 0 +BITMAP +DB +DA +DE +EC +6C +6C +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +78 +30 +70 +D8 +D8 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 1 0 +BITMAP +CC +D8 +70 +60 +60 +60 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +0C +38 +70 +C0 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 8 0 -2 +BITMAP +70 +60 +60 +40 +40 +C0 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 6 1 0 +BITMAP +80 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 8 -1 -2 +BITMAP +70 +30 +30 +20 +20 +60 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 3 1 3 +BITMAP +30 +70 +D0 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 1 0 -1 +BITMAP +F0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 1 3 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +70 +18 +78 +D0 +F8 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +60 +70 +D8 +D8 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +30 +70 +C0 +F0 +60 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 6 6 0 0 +BITMAP +0C +38 +78 +D8 +D0 +70 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +30 +68 +F8 +C0 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 4 7 0 0 +BITMAP +30 +60 +E0 +40 +40 +80 +80 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +38 +58 +D8 +F0 +30 +E0 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +70 +78 +58 +D0 +D0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 7 0 0 +BITMAP +40 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 -1 -2 +BITMAP +20 +00 +60 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +60 +68 +70 +60 +F0 +D8 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 6 0 0 +BITMAP +40 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 7 0 +BBX 7 5 0 0 +BITMAP +74 +7E +56 +D4 +D4 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +70 +78 +58 +D0 +D0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +30 +78 +D8 +F0 +60 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 6 6 -1 -1 +BITMAP +38 +2C +6C +78 +70 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +38 +58 +D8 +F0 +70 +30 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 3 0 +BBX 4 5 0 0 +BITMAP +50 +70 +40 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +38 +60 +30 +B0 +60 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 6 0 0 +BITMAP +20 +F0 +60 +60 +40 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +48 +48 +50 +F0 +70 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +D0 +D0 +D0 +E0 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +A8 +A8 +E8 +F0 +A0 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 6 5 -1 0 +BITMAP +2C +38 +30 +70 +D8 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +68 +68 +78 +30 +20 +C0 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 5 5 0 0 +BITMAP +78 +18 +70 +C0 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 5 8 0 -2 +BITMAP +18 +30 +20 +C0 +60 +60 +20 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 3 0 +BBX 3 8 0 -2 +BITMAP +20 +20 +20 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 5 8 -1 -2 +BITMAP +20 +20 +30 +30 +18 +20 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 2 0 2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 7 0 -2 +BITMAP +40 +40 +00 +40 +C0 +C0 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 7 1 -1 +BITMAP +08 +30 +68 +C0 +D0 +60 +80 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +60 +60 +F0 +48 +F0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 1 +BITMAP +48 +70 +50 +70 +90 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +5C +58 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 3 0 +BBX 3 7 0 -1 +BITMAP +20 +20 +20 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +18 +24 +70 +58 +68 +38 +90 +60 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 2 5 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +78 +C4 +BC +A4 +BC +C4 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 4 0 +BBX 3 5 0 1 +BITMAP +60 +20 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 4 1 1 +BITMAP +28 +50 +A0 +50 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +F0 +10 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 1 1 2 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +78 +CC +B4 +B4 +AC +C4 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 2 5 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 3 0 +BBX 3 3 1 3 +BITMAP +60 +A0 +C0 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +10 +10 +78 +20 +00 +F0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 4 0 2 +BITMAP +60 +A0 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 4 0 2 +BITMAP +E0 +60 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 1 5 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 6 6 -1 -1 +BITMAP +2C +2C +2C +78 +68 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +78 +D0 +D0 +50 +50 +A0 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 2 1 2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 2 -1 -1 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 4 0 2 +BITMAP +40 +40 +C0 +C0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 4 0 +BBX 4 5 0 1 +BITMAP +30 +50 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 4 1 1 +BITMAP +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +42 +44 +C8 +D4 +2C +5C +88 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +42 +44 +C8 +DC +34 +48 +9C +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +E2 +64 +28 +D4 +2C +5C +08 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 -2 +BITMAP +10 +10 +00 +20 +60 +C0 +F0 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 -1 0 +BITMAP +10 +08 +00 +08 +18 +2C +7C +CC +CC +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 -1 0 +BITMAP +04 +08 +00 +08 +18 +2C +7C +CC +CC +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 -1 0 +BITMAP +08 +14 +00 +08 +18 +2C +7C +CC +CC +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 7 9 -1 0 +BITMAP +0A +14 +00 +08 +18 +2C +7C +CC +CC +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 8 -1 0 +BITMAP +14 +00 +08 +18 +2C +7C +CC +CC +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 -1 0 +BITMAP +08 +14 +08 +08 +18 +2C +7C +CC +CC +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 8 0 +BBX 9 6 0 0 +BITMAP +1F80 +1C00 +2F00 +7C00 +D800 +DE00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +3C +6C +C0 +C0 +D8 +70 +20 +C0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 6 9 0 0 +BITMAP +10 +08 +00 +7C +60 +78 +C0 +C0 +F0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +7C +60 +78 +C0 +C0 +F0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +7C +60 +78 +C0 +C0 +F0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 5 0 +BBX 6 8 0 0 +BITMAP +28 +00 +7C +60 +78 +C0 +C0 +F0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 0 0 +BITMAP +20 +40 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +A0 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +64 +F4 +4C +D8 +F0 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +14 +28 +00 +66 +64 +74 +F8 +C8 +C8 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +08 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +08 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +14 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +0A +14 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +14 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 4 0 1 +BITMAP +D8 +70 +70 +D8 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 7 8 0 -1 +BITMAP +02 +3C +6C +DC +EC +D8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +6C +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +6C +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +6C +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +6C +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 9 1 0 +BITMAP +08 +10 +00 +CC +D8 +70 +60 +60 +60 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +40 +70 +58 +F0 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +28 +70 +58 +D8 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +18 +78 +D0 +F8 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +18 +78 +D0 +F8 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +18 +78 +D0 +F8 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +28 +50 +00 +70 +18 +78 +D0 +F8 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +18 +78 +D0 +F8 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +10 +28 +10 +70 +18 +78 +D0 +F8 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 7 0 +BBX 7 5 0 0 +BITMAP +7C +1A +7E +D0 +FC +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 7 0 -2 +BITMAP +30 +70 +C0 +F0 +60 +20 +C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +30 +68 +F8 +C0 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +08 +10 +00 +30 +68 +F8 +C0 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +10 +28 +00 +30 +68 +F8 +C0 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +28 +00 +30 +68 +F8 +C0 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 8 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +20 +40 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 7 0 0 +BITMAP +A0 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +E8 +70 +B0 +78 +D8 +D0 +60 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +28 +50 +00 +70 +78 +58 +D0 +D0 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +30 +78 +D8 +F0 +60 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +08 +10 +00 +30 +78 +D8 +F0 +60 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +10 +28 +00 +30 +78 +D8 +F0 +60 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 6 8 0 0 +BITMAP +14 +28 +00 +30 +78 +D8 +F0 +60 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +28 +00 +30 +78 +D8 +F0 +60 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +20 +00 +F0 +00 +40 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 7 7 -1 -1 +BITMAP +02 +1C +3C +6C +78 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +48 +48 +50 +F0 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +08 +10 +00 +48 +48 +50 +F0 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +10 +28 +00 +48 +48 +50 +F0 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +28 +00 +48 +48 +50 +F0 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 -1 +BITMAP +08 +10 +00 +68 +68 +78 +30 +20 +C0 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 6 8 -1 -2 +BITMAP +70 +38 +2C +2C +78 +70 +C0 +E0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +28 +00 +68 +68 +78 +30 +20 +C0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 7 6 -1 0 +BITMAP +1E +7E +60 +F4 +6C +38 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvBO10.bdf b/src/3rdparty/fonts/helvBO10.bdf new file mode 100644 index 0000000000..d4dc41bab6 --- /dev/null +++ b/src/3rdparty/fonts/helvBO10.bdf @@ -0,0 +1,2863 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-O-Normal--10-100-75-75-P-60-ISO10646-1 +SIZE 10 75 75 +FONTBOUNDINGBOX 13 13 -2 -2 +COMMENT $XConsortium: helvBO10.bdf,v 1.13 95/01/26 18:01:59 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 10 +POINT_SIZE 100 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 8 +X_HEIGHT 6 +FONT_ASCENT 10 +FONT_DESCENT 2 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 8 1 0 +BITMAP +30 +30 +60 +60 +40 +40 +00 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 6 0 +BBX 6 3 1 5 +BITMAP +6C +48 +90 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +14 +14 +7E +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +08 +38 +7C +50 +78 +28 +F8 +70 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 8 8 1 0 +BITMAP +61 +D2 +64 +08 +10 +2C +5A +8C +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +1C +34 +2C +38 +7A +CE +DC +76 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 2 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 10 0 -2 +BITMAP +18 +30 +60 +60 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 10 0 -2 +BITMAP +60 +30 +30 +18 +18 +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 4 4 2 4 +BITMAP +20 +F0 +60 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 5 1 1 +BITMAP +30 +30 +F8 +60 +60 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +40 +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 2 1 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 8 0 0 +BITMAP +0C +18 +10 +30 +20 +60 +40 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +6C +4C +CC +CC +C8 +D8 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 8 2 0 +BITMAP +30 +F0 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +6C +0C +38 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +6C +0C +30 +18 +18 +D8 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +1C +28 +58 +98 +F8 +30 +30 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +3C +20 +60 +70 +18 +18 +D8 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +6C +60 +F8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +F8 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +6C +6C +78 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +6C +6C +6C +3C +0C +D8 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 6 1 0 +BITMAP +40 +40 +00 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 8 0 -2 +BITMAP +20 +20 +00 +00 +40 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 5 1 1 +BITMAP +18 +70 +C0 +60 +30 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 3 1 2 +BITMAP +78 +00 +F0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +60 +30 +18 +70 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 1 0 +BITMAP +38 +6C +0C +38 +60 +60 +00 +C0 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 10 0 +BBX 9 9 0 -2 +BITMAP +1E00 +6100 +4E80 +9480 +A480 +AD00 +B600 +4000 +3C00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +0C +1C +36 +36 +66 +7E +C6 +C6 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +3E +32 +66 +7C +66 +C6 +CC +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +1C +36 +66 +60 +C0 +C4 +CC +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +3E +33 +63 +63 +66 +C6 +CC +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 7 8 0 0 +BITMAP +3E +30 +60 +7C +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 7 8 0 0 +BITMAP +3E +30 +60 +78 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +1E +33 +60 +60 +CF +C6 +CC +7C +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 8 8 0 0 +BITMAP +33 +33 +66 +7E +66 +CC +CC +CC +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 0 0 +BITMAP +30 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 8 0 0 +BITMAP +06 +06 +0C +0C +0C +D8 +D8 +70 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +33 +36 +6C +78 +78 +CC +C6 +C6 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +30 +60 +60 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 10 0 +BBX 11 8 0 0 +BITMAP +3060 +30E0 +79C0 +6BC0 +6EC0 +CD80 +CD80 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 8 0 0 +BITMAP +3180 +3180 +7300 +7B00 +6B00 +CE00 +C600 +C600 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +1E +33 +63 +63 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 8 8 0 0 +BITMAP +3E +33 +63 +66 +7C +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +1E +33 +63 +63 +C6 +C6 +CC +7F +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +3E +33 +63 +7C +66 +C6 +CC +CC +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 8 8 0 0 +BITMAP +1E +33 +30 +38 +1C +CC +CC +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 1 0 +BITMAP +FC +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 8 8 0 0 +BITMAP +33 +33 +66 +66 +66 +CC +CC +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 8 2 0 +BITMAP +C6 +C6 +CC +CC +D8 +D8 +70 +60 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 8 1 0 +BITMAP +CCC0 +CCC0 +CD80 +D580 +D500 +7700 +6600 +6600 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 8 8 0 0 +BITMAP +63 +66 +2C +38 +38 +6C +CC +CC +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 8 8 1 0 +BITMAP +C3 +C6 +6C +78 +30 +30 +60 +60 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 8 0 0 +BITMAP +3F +03 +06 +1C +38 +60 +C0 +FC +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 6 10 -1 -2 +BITMAP +1C +18 +30 +30 +30 +60 +60 +60 +C0 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 8 2 0 +BITMAP +80 +80 +80 +80 +40 +40 +40 +40 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 6 10 -1 -2 +BITMAP +1C +0C +18 +18 +18 +30 +30 +30 +60 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 4 1 4 +BITMAP +18 +38 +68 +C8 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 1 -1 -2 +BITMAP +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 2 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +4C +3C +D8 +D8 +6C +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +30 +78 +6C +4C +C8 +D8 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +38 +68 +C0 +C0 +D8 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 7 8 0 0 +BITMAP +06 +06 +3C +6C +4C +C8 +D8 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +6C +7C +C0 +D8 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 5 8 0 0 +BITMAP +38 +60 +F0 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +3C +6C +4C +C8 +D8 +78 +30 +E0 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +30 +78 +6C +4C +D8 +D8 +D8 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 0 0 +BITMAP +30 +00 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 -1 -2 +BITMAP +18 +00 +30 +30 +30 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +30 +6C +78 +70 +D8 +D8 +CC +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 0 0 +BITMAP +30 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 9 6 0 0 +BITMAP +5B00 +6D80 +6D80 +DB00 +DB00 +DB00 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +6C +4C +D8 +D8 +D8 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 7 8 -1 -2 +BITMAP +3C +36 +26 +64 +6C +78 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +3C +6C +4C +C8 +D8 +78 +30 +30 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 5 6 0 0 +BITMAP +58 +70 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +6C +30 +18 +D8 +70 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 8 0 0 +BITMAP +30 +30 +F8 +60 +60 +C0 +C0 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +6C +CC +D8 +D8 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +D8 +D8 +D8 +D0 +E0 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 6 1 0 +BITMAP +D6 +D6 +D6 +D4 +F8 +48 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 7 6 -1 0 +BITMAP +66 +3C +18 +38 +6C +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +6C +6C +6C +38 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 6 6 0 0 +BITMAP +7C +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 6 10 0 -2 +BITMAP +0C +18 +30 +30 +C0 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 4 10 0 -2 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 6 10 -1 -2 +BITMAP +30 +18 +18 +18 +0C +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 2 1 3 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 8 0 -2 +BITMAP +30 +00 +20 +20 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 8 1 -1 +BITMAP +04 +38 +6C +D0 +A0 +D8 +70 +80 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +38 +6C +60 +F0 +40 +EC +D8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +44 +38 +68 +58 +70 +88 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +62 +66 +6C +28 +7C +30 +F8 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +00 +40 +40 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 -2 +BITMAP +1C +36 +30 +78 +4C +64 +3C +18 +D8 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 1 2 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +42 +99 +A5 +A1 +9D +42 +3C +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 5 6 0 2 +BITMAP +38 +18 +70 +50 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 3 1 2 +BITMAP +6C +D8 +6C +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +42 +BD +A5 +B9 +A5 +42 +3C +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 1 2 7 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 4 0 +BBX 3 3 1 4 +BITMAP +60 +A0 +C0 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +18 +18 +7C +30 +30 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 3 +BITMAP +60 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 3 +BITMAP +E0 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 7 8 -1 -2 +BITMAP +36 +36 +26 +6C +6C +74 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 -2 +BITMAP +3E +74 +E8 +E8 +68 +50 +50 +A0 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 2 1 2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 3 -1 -2 +BITMAP +40 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 4 1 3 +BITMAP +C0 +40 +80 +80 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 5 6 0 2 +BITMAP +38 +68 +58 +70 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 3 1 2 +BITMAP +D8 +6C +D8 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +61 +22 +44 +48 +12 +26 +4F +84 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +61 +22 +44 +48 +16 +22 +44 +8E +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +71 +22 +14 +68 +12 +26 +4F +84 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +0C +00 +18 +18 +70 +C0 +D8 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +08 +04 +00 +0C +0C +1C +36 +36 +7E +C6 +C6 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +02 +04 +00 +0C +0C +1C +36 +36 +7E +C6 +C6 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +04 +0A +00 +0C +0C +1C +36 +36 +7E +C6 +C6 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +0D +16 +00 +0C +0C +1C +36 +36 +7E +C6 +C6 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +0A +00 +0C +0C +1C +36 +36 +7E +C6 +C6 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +04 +0A +04 +0C +0C +1C +36 +36 +7E +C6 +C6 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 11 8 0 0 +BITMAP +0FE0 +1B00 +3600 +37C0 +6600 +7C00 +CC00 +CF80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 7 10 0 -2 +BITMAP +1C +36 +66 +60 +C0 +C4 +CC +78 +20 +C0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 7 11 0 0 +BITMAP +10 +08 +00 +3E +20 +60 +7C +40 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 7 11 0 0 +BITMAP +04 +08 +00 +3E +20 +60 +7C +40 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 7 11 0 0 +BITMAP +08 +14 +00 +3E +20 +60 +7C +40 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +14 +00 +3E +20 +60 +7C +40 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 0 0 +BITMAP +20 +10 +00 +30 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 11 0 0 +BITMAP +08 +10 +00 +30 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 11 0 0 +BITMAP +10 +28 +00 +30 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 0 0 +BITMAP +28 +00 +30 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +3E +33 +63 +F3 +66 +C6 +CC +F8 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 0 0 +BITMAP +0D00 +1600 +0000 +3180 +3180 +7300 +7B00 +6B00 +CE00 +C600 +C600 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +08 +04 +00 +1E +33 +63 +63 +C3 +C6 +CC +78 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +02 +04 +00 +1E +33 +63 +63 +C3 +C6 +CC +78 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +04 +0A +00 +1E +33 +63 +63 +C3 +C6 +CC +78 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +0D +16 +00 +1E +33 +63 +63 +C3 +C6 +CC +78 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +0A +00 +1E +33 +63 +63 +C3 +C6 +CC +78 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +6C +38 +30 +70 +D8 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 10 8 -1 0 +BITMAP +0F40 +1980 +3380 +3580 +6B00 +7300 +6600 +BC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +08 +04 +00 +33 +33 +66 +66 +66 +CC +CC +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +02 +04 +00 +33 +33 +66 +66 +66 +CC +CC +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 8 11 0 0 +BITMAP +04 +0A +00 +33 +33 +66 +66 +66 +CC +CC +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0A +00 +33 +33 +66 +66 +66 +CC +CC +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 1 0 +BITMAP +08 +10 +00 +C6 +C6 +6C +78 +30 +30 +60 +60 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 8 8 0 0 +BITMAP +30 +3E +33 +63 +66 +7C +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +1C +36 +26 +6C +66 +46 +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +38 +4C +3C +D8 +D8 +6C +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +38 +4C +3C +D8 +D8 +6C +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +38 +4C +3C +D8 +D8 +6C +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +34 +58 +00 +38 +4C +3C +D8 +D8 +6C +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +38 +4C +3C +D8 +D8 +6C +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +10 +38 +4C +3C +D8 +D8 +6C +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 9 6 0 0 +BITMAP +3F00 +4D80 +3F80 +D800 +DB00 +6E00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 -2 +BITMAP +38 +68 +C0 +C0 +D8 +70 +20 +C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +38 +6C +7C +C0 +D8 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +38 +6C +7C +C0 +D8 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +38 +6C +7C +C0 +D8 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +38 +6C +7C +C0 +D8 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +20 +00 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +20 +40 +00 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +20 +50 +00 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 0 0 +BITMAP +50 +00 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +6C +38 +58 +3C +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +34 +58 +00 +78 +6C +4C +D8 +D8 +D8 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +34 +58 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +38 +6C +CC +CC +D8 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 5 1 1 +BITMAP +30 +00 +F8 +00 +60 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 10 6 -1 0 +BITMAP +0EC0 +1B80 +3700 +3B00 +7600 +DC00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +6C +6C +CC +D8 +D8 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +6C +6C +CC +D8 +D8 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +6C +6C +CC +D8 +D8 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +6C +6C +CC +D8 +D8 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +08 +10 +00 +6C +6C +6C +38 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 7 10 -1 -2 +BITMAP +18 +18 +3C +36 +26 +64 +6C +78 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +28 +00 +6C +6C +6C +38 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 8 8 -1 0 +BITMAP +0E +1B +7B +30 +F0 +62 +66 +3C +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvBO12.bdf b/src/3rdparty/fonts/helvBO12.bdf new file mode 100644 index 0000000000..00202b24e8 --- /dev/null +++ b/src/3rdparty/fonts/helvBO12.bdf @@ -0,0 +1,3056 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-O-Normal--12-120-75-75-P-69-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 16 15 -2 -3 +COMMENT $XConsortium: helvBO12.bdf,v 1.13 95/01/26 18:02:02 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 69 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 6 0 +BBX 7 3 2 6 +BITMAP +36 +6C +D8 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 8 1 0 +BITMAP +14 +14 +7E +28 +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 -1 +BITMAP +08 +3C +6E +70 +38 +1C +2C +EC +78 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 11 9 2 0 +BITMAP +70C0 +D980 +DB00 +7600 +0600 +0DC0 +1B60 +3360 +61C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +1C +36 +36 +1C +39 +6F +C6 +CE +7B +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 3 6 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +0C +18 +30 +30 +60 +60 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 12 0 -3 +BITMAP +30 +18 +18 +0C +0C +0C +18 +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 4 4 3 5 +BITMAP +50 +60 +F0 +40 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +18 +18 +FE +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 1 2 3 +BITMAP +FC +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 2 0 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 9 0 0 +BITMAP +02 +06 +0C +18 +10 +30 +60 +C0 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +66 +46 +C6 +C4 +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 2 0 +BITMAP +18 +F8 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +0C +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +06 +06 +3C +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +06 +0E +16 +26 +4C +CC +FE +18 +18 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1E +30 +60 +78 +0C +0C +0C +D8 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +36 +60 +78 +EC +CC +C4 +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +7E +06 +0C +0C +18 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +66 +2C +78 +CC +CC +DC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +3C +66 +46 +66 +6E +3C +0C +D8 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 7 1 0 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 9 1 -2 +BITMAP +30 +30 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 2 1 +BITMAP +1C +70 +C0 +60 +30 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 1 2 +BITMAP +7C +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +30 +18 +0C +38 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 3 0 +BITMAP +78 +CC +9C +38 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 11 0 +BBX 11 10 1 -1 +BITMAP +0F80 +3040 +6020 +46A0 +8920 +9120 +9240 +4D80 +6000 +1E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 0 0 +BITMAP +06 +0E +0B +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +6180 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 1 0 +BITMAP +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6000 +6700 +C300 +C600 +CE00 +7A00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3180 +3180 +7F00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 9 1 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0180 +0300 +0300 +0600 +0600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +18C0 +1980 +3300 +3600 +3C00 +6600 +6600 +C300 +C300 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 12 9 1 0 +BITMAP +1830 +1870 +38E0 +38E0 +6940 +6AC0 +6EC0 +CD80 +C980 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +18C0 +18C0 +3980 +2980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +3980 +3180 +6180 +6300 +C300 +DE00 +CE00 +7B00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3300 +7E00 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +33 +63 +70 +3C +0E +C6 +CC +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 2 0 +BITMAP +FF +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +3180 +3180 +6300 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 9 3 0 +BITMAP +C3 +C3 +C6 +C6 +CC +CC +58 +70 +60 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 10 9 2 0 +BITMAP +CCC0 +CCC0 +CD80 +DD80 +DD00 +ED00 +EE00 +4400 +4400 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +30C0 +3180 +1B00 +1E00 +0C00 +1E00 +3600 +6300 +C300 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 9 2 0 +BITMAP +C6 +C6 +6C +6C +38 +30 +30 +60 +60 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 8 12 -1 -3 +BITMAP +0F +0C +18 +18 +30 +30 +30 +60 +60 +60 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 9 2 0 +BITMAP +C0 +C0 +C0 +40 +40 +40 +60 +60 +60 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 8 12 -2 -3 +BITMAP +0F +03 +06 +06 +0C +0C +0C +18 +18 +18 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 6 1 3 +BITMAP +18 +38 +6C +6C +CC +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 -1 -3 +BITMAP +FE +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 3 3 6 +BITMAP +60 +C0 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +36 +3B +63 +66 +C6 +CC +F8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +60 +60 +C6 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 9 0 0 +BITMAP +0180 +0180 +1B00 +3700 +6300 +6600 +C600 +CC00 +7C00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 7 9 1 0 +BITMAP +0E +18 +7C +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +0E80 +1B80 +3180 +3300 +6300 +6600 +3E00 +0600 +CC00 +7800 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 7 12 -2 -3 +BITMAP +06 +00 +0C +0C +18 +18 +18 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +18 +18 +33 +36 +7C +78 +6C +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 9 0 0 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 12 7 0 0 +BITMAP +2EE0 +3330 +3330 +6660 +6660 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +1B00 +1D80 +3180 +3300 +6300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1D +37 +63 +66 +C6 +CC +7C +0C +18 +18 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 7 0 0 +BITMAP +36 +3C +70 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +1E +33 +38 +1C +0C +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 9 1 0 +BITMAP +18 +18 +7C +30 +60 +60 +60 +C0 +E0 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 2 0 +BITMAP +CC +CC +D8 +D8 +F0 +60 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 7 1 0 +BITMAP +CCC0 +CCC0 +DD80 +DD80 +5500 +7700 +6600 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 7 0 0 +BITMAP +33 +36 +1C +18 +38 +6C +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 -3 +BITMAP +CC +CC +CC +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +3E +06 +0C +38 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 1 -3 +BITMAP +0E +18 +30 +30 +60 +C0 +60 +60 +60 +C0 +C0 +70 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 5 12 0 -3 +BITMAP +18 +18 +18 +10 +30 +30 +20 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 7 12 -1 -3 +BITMAP +1C +06 +06 +0C +0C +06 +0C +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 1 3 +BITMAP +74 +B8 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 10 -1 -3 +BITMAP +18 +18 +00 +10 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 -1 +BITMAP +04 +3C +6E +D0 +D0 +E6 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +19 +10 +7C +30 +30 +60 +E6 +DC +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 6 0 1 +BITMAP +33 +1E +34 +2C +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +66 +66 +6C +38 +FC +30 +F8 +60 +60 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +18 +18 +00 +00 +60 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 0 -3 +BITMAP +0E +1B +19 +38 +6C +66 +66 +36 +1C +98 +D8 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 3 8 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +5140 +A040 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 5 6 2 3 +BITMAP +38 +08 +78 +50 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +1980 +7700 +CC00 +6600 +3300 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 2 1 +BITMAP +FC +04 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +4A40 +9C40 +9480 +9280 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 3 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 2 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 8 7 0 0 +BITMAP +0C +0C +7F +18 +18 +00 +FE +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 4 +BITMAP +60 +B0 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 4 +BITMAP +70 +30 +60 +30 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 2 3 7 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 10 10 -2 -3 +BITMAP +0CC0 +0CC0 +18C0 +1980 +3180 +3300 +6D00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 2 -3 +BITMAP +3E +74 +F4 +F4 +E8 +E8 +68 +50 +50 +A0 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 4 0 -3 +BITMAP +60 +30 +90 +E0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 1 4 +BITMAP +20 +E0 +20 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 5 6 2 3 +BITMAP +38 +68 +58 +70 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +6600 +3300 +1980 +7700 +CC00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 2 0 +BITMAP +2000 +E300 +2600 +4C00 +5900 +1300 +3500 +6F80 +C200 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2000 +E300 +2600 +4C00 +5B00 +1580 +3100 +6200 +C780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +7000 +3180 +6300 +3600 +EC80 +0980 +1A80 +37C0 +6100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +0C +0C +00 +08 +18 +70 +E4 +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +0C +06 +00 +06 +06 +0F +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 0 0 +BITMAP +03 +06 +00 +06 +06 +0F +1B +33 +3F +63 +C3 +C3 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0700 +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0680 +0B00 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 0 0 +BITMAP +0D80 +0000 +0600 +0600 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 0 +BITMAP +0300 +0480 +0300 +0300 +0700 +0F00 +1B00 +3300 +3F00 +6300 +C300 +C300 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 14 9 0 0 +BITMAP +07FC +0DC0 +0980 +1980 +33F0 +3F00 +6300 +C600 +C7E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 12 1 -3 +BITMAP +1E +33 +63 +60 +C0 +C0 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0C00 +0600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0300 +0600 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +1F80 +1000 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +0D80 +0000 +1F80 +1800 +3000 +3000 +7E00 +6000 +6000 +C000 +FC00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 12 1 0 +BITMAP +30 +18 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 12 1 0 +BITMAP +06 +0C +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 12 1 0 +BITMAP +1C +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 11 1 0 +BITMAP +36 +00 +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1980 +3180 +3180 +F980 +6300 +6300 +C600 +FC00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0340 +0580 +0000 +18C0 +18C0 +38C0 +3980 +6980 +6500 +6700 +C600 +C600 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0600 +0300 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0180 +0300 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0680 +0B00 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0D80 +0000 +0F00 +3980 +3180 +6180 +C300 +C300 +C600 +CE00 +7800 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +66 +3C +38 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 11 9 0 0 +BITMAP +07A0 +1CC0 +19C0 +32C0 +3580 +6980 +7300 +6700 +BC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0C00 +0600 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0300 +0600 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 1 0 +BITMAP +0700 +0D80 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +1B00 +0000 +3180 +3180 +3180 +6300 +6300 +C600 +C600 +CC00 +7800 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 12 2 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +6C +6C +38 +30 +60 +60 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +18 +18 +3E +33 +23 +66 +7C +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +1B +33 +36 +6C +66 +66 +CC +D8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +30 +18 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +06 +0C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +1C +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +1A +2C +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 9 0 0 +BITMAP +36 +00 +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 10 0 0 +BITMAP +0C +12 +0C +3C +66 +06 +7C +CC +98 +EC +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 10 0 +BBX 11 7 0 0 +BITMAP +3BC0 +6660 +0460 +7FC0 +CC00 +9980 +EF00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 -3 +BITMAP +1E +33 +60 +60 +C6 +CC +78 +30 +90 +E0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +1E +33 +63 +7E +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +60 +30 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 0 0 +BITMAP +18 +30 +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 10 0 0 +BITMAP +38 +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 9 0 0 +BITMAP +6C +00 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +32 +1C +26 +1F +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0D +16 +00 +36 +3B +63 +66 +66 +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0D +16 +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +1E +33 +63 +66 +C6 +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +18 +00 +FE +00 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 8 -1 0 +BITMAP +0080 +0F00 +1B80 +3580 +3B00 +7300 +6600 +BC00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +18 +0C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +06 +0C +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +0E +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +1B +00 +33 +33 +63 +66 +C6 +CC +74 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 13 1 -3 +BITMAP +18 +30 +00 +CC +CC +D8 +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 12 -1 -3 +BITMAP +0C00 +0C00 +1B00 +1D80 +1180 +3300 +3300 +6600 +7C00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 12 1 -3 +BITMAP +6C +00 +CC +CC +D8 +D8 +50 +70 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 0 0 +BITMAP +0F00 +1980 +3180 +7C00 +6000 +F800 +6300 +6600 +3C00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvBO14.bdf b/src/3rdparty/fonts/helvBO14.bdf new file mode 100644 index 0000000000..ac7b959a2c --- /dev/null +++ b/src/3rdparty/fonts/helvBO14.bdf @@ -0,0 +1,3325 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-O-Normal--14-140-75-75-P-82-ISO10646-1 +SIZE 14 75 75 +FONTBOUNDINGBOX 18 17 -1 -3 +COMMENT $XConsortium: helvBO14.bdf,v 1.14 95/01/26 18:02:06 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 14 +POINT_SIZE 140 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 82 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 11 +X_HEIGHT 8 +FONT_ASCENT 13 +FONT_DESCENT 3 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 11 2 0 +BITMAP +18 +18 +30 +30 +30 +60 +60 +40 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 7 0 +BBX 5 3 4 8 +BITMAP +D8 +D8 +90 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 10 1 0 +BITMAP +0D80 +0D80 +1B00 +7FC0 +1B00 +3600 +FF00 +6C00 +D800 +D800 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 12 1 -1 +BITMAP +04 +3E +6B +68 +38 +1C +16 +16 +A6 +EC +78 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 11 10 2 0 +BITMAP +3860 +64C0 +4D80 +3B00 +0600 +0C00 +1B80 +3640 +64C0 +C380 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 10 10 1 0 +BITMAP +0E00 +1B00 +1300 +1600 +3CC0 +66C0 +C380 +C300 +E780 +7CC0 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 3 4 8 +BITMAP +E0 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 14 2 -3 +BITMAP +0C +18 +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 6 14 0 -3 +BITMAP +30 +18 +18 +0C +0C +0C +0C +0C +0C +18 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 5 4 3 7 +BITMAP +20 +F8 +60 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 7 2 1 +BITMAP +18 +18 +18 +FE +30 +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 4 0 -2 +BITMAP +60 +60 +20 +C0 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 1 2 4 +BITMAP +FE +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 7 11 0 0 +BITMAP +06 +04 +0C +08 +18 +10 +30 +20 +60 +40 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +1E +33 +63 +63 +C3 +C3 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 5 10 3 0 +BITMAP +18 +F8 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +3E +63 +63 +07 +0E +38 +70 +C0 +C0 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +1E +33 +33 +06 +1C +06 +06 +C6 +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +03 +07 +1B +33 +66 +C6 +FF +0C +0C +0C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +3F +30 +60 +7C +0E +06 +06 +C6 +CC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +1E +33 +60 +40 +DC +F6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 2 0 +BITMAP +7E +06 +0C +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +1E +33 +63 +66 +3C +66 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 0 +BITMAP +1E +33 +63 +63 +63 +3E +06 +C6 +CC +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 8 2 0 +BITMAP +30 +30 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 10 1 -2 +BITMAP +18 +18 +00 +00 +00 +00 +60 +60 +20 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 8 5 1 2 +BITMAP +07 +3C +E0 +38 +0E +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 3 2 3 +BITMAP +7F +00 +FE +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 5 1 2 +BITMAP +70 +1C +07 +3C +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 8 11 3 0 +BITMAP +3E +63 +63 +06 +1C +30 +60 +60 +00 +C0 +C0 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 14 0 +BBX 13 13 2 -2 +BITMAP +07E0 +1C30 +3018 +6348 +4CC8 +C998 +9190 +9330 +9B60 +CDC0 +4000 +71C0 +1F00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +0300 +0700 +0D80 +0D80 +1980 +1980 +3180 +7F80 +6180 +C180 +C180 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +1F80 +18C0 +18C0 +30C0 +3180 +3F00 +6180 +6180 +6180 +C300 +FE00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 10 11 2 0 +BITMAP +0780 +1CC0 +30C0 +6000 +6000 +C000 +C000 +C000 +C180 +6700 +3C00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 11 1 0 +BITMAP +1F80 +18C0 +1860 +3060 +3060 +3060 +60C0 +60C0 +6180 +C700 +FC00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 11 1 0 +BITMAP +1FC0 +1800 +1800 +3000 +3000 +3F80 +6000 +6000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 10 11 1 0 +BITMAP +1FC0 +1800 +1800 +3000 +3000 +3F00 +6000 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 11 2 0 +BITMAP +0780 +1CC0 +30C0 +6000 +6000 +C3C0 +C180 +C180 +C300 +6700 +3D00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 11 11 1 0 +BITMAP +1860 +1860 +1860 +30C0 +30C0 +3FC0 +6180 +6180 +6180 +C300 +C300 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 1 0 +BITMAP +18 +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 9 11 1 0 +BITMAP +0180 +0180 +0180 +0300 +0300 +0300 +0600 +C600 +C600 +EC00 +7800 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 11 11 1 0 +BITMAP +1860 +18C0 +1980 +3300 +3600 +3C00 +7600 +6600 +6300 +C300 +C180 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +18 +18 +18 +30 +30 +30 +60 +60 +60 +C0 +FE +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 13 0 +BBX 14 11 1 0 +BITMAP +180C +181C +183C +3C68 +34D8 +3498 +65B0 +6730 +6730 +C660 +C660 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 12 11 1 0 +BITMAP +1830 +1830 +1C30 +3C60 +3460 +3660 +66C0 +66C0 +63C0 +C180 +C180 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 11 11 2 0 +BITMAP +0780 +1CC0 +3060 +6060 +6060 +C060 +C0C0 +C0C0 +C180 +6700 +3C00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 11 11 1 0 +BITMAP +1FC0 +1860 +1860 +3060 +30C0 +3F80 +6000 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 11 11 2 0 +BITMAP +0780 +1CC0 +3060 +6060 +6060 +C060 +C0C0 +C6C0 +C380 +6700 +3D80 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +1F80 +18C0 +18C0 +30C0 +3180 +3F00 +6180 +6180 +6180 +C300 +C300 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 10 11 1 0 +BITMAP +0780 +18C0 +30C0 +3800 +1E00 +0700 +0380 +0180 +C180 +C300 +7C00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 3 0 +BITMAP +FF +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 11 2 0 +BITMAP +3060 +3060 +3060 +60C0 +60C0 +60C0 +C180 +C180 +C180 +C300 +7E00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 9 11 3 0 +BITMAP +C180 +C180 +C300 +C300 +C600 +C600 +CC00 +CC00 +5800 +7000 +6000 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 14 0 +BBX 13 11 3 0 +BITMAP +C618 +C618 +C630 +CE30 +CE60 +CA60 +DAC0 +D2C0 +7380 +6380 +6300 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 12 11 0 0 +BITMAP +1830 +1860 +0CC0 +0D80 +0700 +0600 +0E00 +1B00 +3300 +6180 +C180 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 10 11 3 0 +BITMAP +C0C0 +C180 +C300 +6600 +6C00 +7800 +3000 +3000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 11 11 0 0 +BITMAP +1FE0 +00C0 +0180 +0300 +0600 +0C00 +1800 +3000 +6000 +C000 +FF00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 8 14 0 -3 +BITMAP +0F +0C +0C +18 +18 +18 +30 +30 +30 +60 +60 +C0 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 3 11 3 0 +BITMAP +C0 +C0 +C0 +40 +40 +40 +40 +60 +60 +60 +60 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 8 14 -1 -3 +BITMAP +0F +03 +03 +06 +06 +06 +0C +0C +0C +18 +18 +30 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 6 3 5 +BITMAP +18 +38 +6C +6C +CC +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 1 -1 -3 +BITMAP +FF +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 3 4 8 +BITMAP +60 +C0 +E0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 8 1 0 +BITMAP +1E +33 +03 +3E +66 +C6 +CC +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +1800 +1800 +3000 +3700 +3980 +7180 +6180 +6300 +C300 +E600 +DC00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 8 1 0 +BITMAP +1E +33 +63 +60 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 11 1 0 +BITMAP +00C0 +00C0 +0180 +1D80 +3380 +6180 +6300 +C300 +C300 +CE00 +7600 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 8 1 0 +BITMAP +1E +33 +63 +7E +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 7 11 1 0 +BITMAP +0E +18 +18 +7C +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 11 0 -3 +BITMAP +0EC0 +19C0 +30C0 +3180 +6180 +6180 +6700 +3B00 +0300 +C600 +7C00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +1800 +1800 +3000 +3700 +3B80 +3180 +6300 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 1 0 +BITMAP +18 +18 +00 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 7 14 -1 -3 +BITMAP +06 +06 +00 +0C +0C +0C +18 +18 +18 +30 +30 +30 +E0 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +18 +18 +30 +33 +36 +3C +78 +6C +6C +CC +CC +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 1 0 +BITMAP +18 +18 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 12 8 1 0 +BITMAP +36E0 +3BB0 +3330 +6660 +6660 +6660 +CCC0 +CCC0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 8 1 0 +BITMAP +3700 +3980 +3180 +6300 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 8 1 0 +BITMAP +1E +33 +63 +63 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 11 0 -3 +BITMAP +1B80 +1CC0 +38C0 +30C0 +3180 +3180 +7B00 +6E00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 -3 +BITMAP +1D80 +3380 +6180 +6300 +C300 +C300 +CE00 +7600 +0600 +0C00 +0C00 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 7 8 1 0 +BITMAP +36 +3E +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 8 1 0 +BITMAP +1E +33 +30 +1C +06 +C6 +CC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 10 1 0 +BITMAP +18 +18 +7C +30 +30 +60 +60 +C0 +C0 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 8 1 0 +BITMAP +3180 +3180 +6180 +6300 +6300 +C600 +CE00 +7600 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 8 2 0 +BITMAP +C3 +C3 +C6 +CC +CC +58 +70 +60 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 8 2 0 +BITMAP +CCC0 +CCC0 +CCC0 +DD80 +D580 +7700 +6600 +6600 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 8 0 0 +BITMAP +3180 +3300 +1600 +1C00 +1C00 +3400 +6600 +C600 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 11 0 -3 +BITMAP +3180 +3180 +3300 +3300 +3600 +3600 +1C00 +1800 +3000 +6000 +C000 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 8 8 0 0 +BITMAP +3F +06 +0C +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 7 14 1 -3 +BITMAP +06 +0C +18 +18 +18 +30 +C0 +60 +60 +60 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 6 14 0 -3 +BITMAP +0C +0C +0C +08 +18 +18 +10 +30 +30 +20 +60 +60 +40 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 6 0 +BBX 7 14 0 -3 +BITMAP +0C +06 +06 +06 +0C +0C +06 +18 +18 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 3 2 3 +BITMAP +71 +DB +8E +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 11 0 -3 +BITMAP +18 +18 +00 +10 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 1 -1 +BITMAP +02 +1E +37 +68 +C8 +D0 +D6 +EC +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 1 0 +BITMAP +0F00 +1980 +1880 +1800 +7E00 +3000 +3000 +6000 +F300 +DE00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 8 6 1 2 +BITMAP +63 +3E +36 +6C +7C +C6 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 2 0 +BITMAP +6180 +6300 +6600 +6C00 +3800 +FC00 +3000 +FC00 +6000 +6000 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 4 0 +BBX 5 13 1 -2 +BITMAP +18 +18 +18 +30 +30 +00 +00 +00 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 14 1 -3 +BITMAP +0F00 +1D80 +1980 +1800 +3C00 +6600 +6300 +6300 +3300 +1E00 +0C00 +CC00 +DC00 +7800 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 2 3 9 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 12 0 +BBX 11 10 2 0 +BITMAP +0F00 +30C0 +2640 +4920 +5020 +9140 +9240 +4C80 +6180 +1E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 6 7 1 4 +BITMAP +1C +24 +1C +68 +78 +00 +F8 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 5 2 2 +BITMAP +1980 +7700 +CC00 +6600 +3300 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 4 2 2 +BITMAP +FE +02 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 12 0 +BBX 11 10 2 0 +BITMAP +0F00 +30C0 +2640 +4920 +4E20 +9240 +9240 +4080 +6180 +1E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 3 10 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 6 0 +BBX 4 4 3 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 9 1 0 +BITMAP +0C +0C +0C +7F +18 +18 +18 +00 +FE +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 6 2 4 +BITMAP +60 +B0 +30 +60 +C0 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 6 1 4 +BITMAP +70 +18 +70 +18 +98 +F0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 2 4 9 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 11 0 -3 +BITMAP +18C0 +18C0 +30C0 +3180 +3180 +6300 +6700 +7B00 +C000 +C000 +C000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 14 2 -3 +BITMAP +1F +3A +7A +F4 +F4 +F4 +68 +28 +28 +50 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 4 -1 -3 +BITMAP +30 +18 +D8 +70 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 6 2 4 +BITMAP +30 +F0 +30 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 7 7 1 4 +BITMAP +1C +36 +66 +6C +38 +00 +F8 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 5 2 2 +BITMAP +6600 +3300 +1980 +7700 +CC00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 11 10 2 0 +BITMAP +30C0 +F180 +3300 +6200 +6660 +6CE0 +0940 +1AC0 +33E0 +60C0 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +30C0 +F180 +3300 +6200 +66C0 +6D60 +0860 +18C0 +3180 +61E0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 13 0 +BBX 12 10 1 0 +BITMAP +7060 +18C0 +7180 +1900 +9B30 +F670 +04A0 +0D60 +19F0 +3060 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 7 11 0 -3 +BITMAP +06 +06 +00 +0C +0C +18 +70 +C0 +C6 +CC +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 14 0 0 +BITMAP +0600 +0300 +0000 +0300 +0700 +0D80 +0D80 +1980 +1980 +3180 +7F80 +6180 +C180 +C180 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 14 0 0 +BITMAP +00C0 +0180 +0000 +0300 +0700 +0D80 +0D80 +1980 +1980 +3180 +7F80 +6180 +C180 +C180 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 14 0 0 +BITMAP +0380 +06C0 +0000 +0300 +0700 +0D80 +0D80 +1980 +1980 +3180 +7F80 +6180 +C180 +C180 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 14 0 0 +BITMAP +0340 +0580 +0000 +0300 +0700 +0D80 +0D80 +1980 +1980 +3180 +7F80 +6180 +C180 +C180 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 14 0 0 +BITMAP +06C0 +06C0 +0000 +0300 +0700 +0D80 +0D80 +1980 +1980 +3180 +7F80 +6180 +C180 +C180 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 10 14 0 0 +BITMAP +0380 +06C0 +0380 +0300 +0700 +0D80 +0D80 +1980 +1980 +3180 +7F80 +6180 +C180 +C180 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 14 0 +BBX 17 11 0 0 +BITMAP +03FF80 +066000 +0C6000 +0CC000 +18C000 +18FE00 +318000 +7F8000 +618000 +C30000 +C3FC00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 10 14 2 -3 +BITMAP +0780 +1CC0 +30C0 +6000 +6000 +C000 +C000 +C000 +C180 +6700 +3C00 +1000 +D800 +7000 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 14 1 0 +BITMAP +0600 +0300 +0000 +1FC0 +1800 +1800 +3000 +3000 +3F80 +6000 +6000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 14 1 0 +BITMAP +0180 +0300 +0000 +1FC0 +1800 +1800 +3000 +3000 +3F80 +6000 +6000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 14 1 0 +BITMAP +0380 +06C0 +0000 +1FC0 +1800 +1800 +3000 +3000 +3F80 +6000 +6000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 14 1 0 +BITMAP +0D80 +0D80 +0000 +1FC0 +1800 +1800 +3000 +3000 +3F80 +6000 +6000 +6000 +C000 +FE00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 14 1 0 +BITMAP +30 +18 +00 +18 +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 7 14 1 0 +BITMAP +06 +0C +00 +18 +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 7 14 1 0 +BITMAP +1C +36 +00 +18 +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 7 14 1 0 +BITMAP +36 +36 +00 +18 +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 12 11 0 0 +BITMAP +0FC0 +0C60 +0C30 +1830 +1830 +FE30 +3060 +3060 +60C0 +6380 +7E00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 12 14 1 0 +BITMAP +0340 +0580 +0000 +1830 +1830 +1C30 +3C60 +3460 +3660 +66C0 +66C0 +63C0 +C180 +C180 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 11 14 2 0 +BITMAP +0300 +0180 +0000 +0780 +1CC0 +3060 +6060 +C060 +C060 +C0C0 +C0C0 +C180 +6700 +3C00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 11 14 2 0 +BITMAP +00C0 +0180 +0000 +0780 +1CC0 +3060 +6060 +C060 +C060 +C0C0 +C0C0 +C180 +6700 +3C00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 11 14 2 0 +BITMAP +01C0 +0360 +0000 +0780 +1CC0 +3060 +6060 +C060 +C060 +C0C0 +C0C0 +C180 +6700 +3C00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 11 14 2 0 +BITMAP +01A0 +02C0 +0000 +0780 +1CC0 +3060 +6060 +C060 +C060 +C0C0 +C0C0 +C180 +6700 +3C00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 11 14 2 0 +BITMAP +06C0 +06C0 +0000 +0780 +1CC0 +3060 +6060 +C060 +C060 +C0C0 +C0C0 +C180 +6700 +3C00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 9 7 1 1 +BITMAP +6180 +3300 +1E00 +1C00 +3C00 +6600 +C300 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 12 0 +BBX 15 11 0 0 +BITMAP +01E6 +073C +0C38 +1878 +18D8 +3398 +3630 +3C30 +3860 +79C0 +CF00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 14 2 0 +BITMAP +0600 +0300 +0000 +3060 +3060 +3060 +60C0 +60C0 +60C0 +C180 +C180 +C180 +C300 +7E00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 14 2 0 +BITMAP +0180 +0300 +0000 +3060 +3060 +3060 +60C0 +60C0 +60C0 +C180 +C180 +C180 +C300 +7E00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 14 2 0 +BITMAP +0700 +0D80 +0000 +3060 +3060 +3060 +60C0 +60C0 +60C0 +C180 +C180 +C180 +C300 +7E00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 14 2 0 +BITMAP +0D80 +0D80 +0000 +3060 +3060 +3060 +60C0 +60C0 +60C0 +C180 +C180 +C180 +C300 +7E00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 10 14 3 0 +BITMAP +0600 +0C00 +0000 +C0C0 +C180 +C300 +6600 +6C00 +7800 +3000 +3000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1800 +1800 +1F00 +3180 +3180 +3180 +6300 +7E00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0F00 +1980 +1980 +3300 +3600 +3300 +6300 +6300 +6300 +C600 +DC00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +18 +0C +00 +1E +33 +03 +3E +66 +C6 +CC +76 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +03 +06 +00 +1E +33 +03 +3E +66 +C6 +CC +76 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0E +1B +00 +1E +33 +03 +3E +66 +C6 +CC +76 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0D +16 +00 +1E +33 +03 +3E +66 +C6 +CC +76 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +1B +1B +00 +1E +33 +03 +3E +66 +C6 +CC +76 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0E +1B +0E +1E +33 +03 +3E +66 +C6 +CC +76 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 13 8 1 0 +BITMAP +1EF0 +3398 +0318 +3FF0 +6600 +C600 +CE60 +77C0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 9 11 0 -3 +BITMAP +0F00 +1980 +3180 +3000 +6000 +6300 +6600 +3C00 +1000 +D800 +7000 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +18 +0C +00 +1E +33 +63 +7E +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +03 +06 +00 +1E +33 +63 +7E +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0E +1B +00 +1E +33 +63 +7E +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +1B +1B +00 +1E +33 +63 +7E +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 11 1 0 +BITMAP +60 +30 +00 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 1 0 +BITMAP +18 +30 +00 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 6 11 1 0 +BITMAP +38 +6C +00 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 6 11 1 0 +BITMAP +6C +6C +00 +30 +30 +30 +60 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +31 +1E +1C +26 +1F +33 +63 +63 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0680 +0B00 +0000 +3700 +3980 +3180 +6300 +6300 +6300 +C600 +C600 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +18 +0C +00 +1E +33 +63 +63 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +03 +06 +00 +1E +33 +63 +63 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0E +1B +00 +1E +33 +63 +63 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0D +16 +00 +1E +33 +63 +63 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +1B +1B +00 +1E +33 +63 +63 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 7 2 1 +BITMAP +18 +18 +00 +FE +00 +30 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 10 8 0 0 +BITMAP +0F40 +1980 +3380 +3580 +6B00 +7300 +6600 +BC00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0C00 +0600 +0000 +3180 +3180 +6180 +6300 +6300 +C600 +CE00 +7600 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0300 +0600 +0000 +3180 +3180 +6180 +6300 +6300 +C600 +CE00 +7600 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0E00 +1B00 +0000 +3180 +3180 +6180 +6300 +6300 +C600 +CE00 +7600 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +1B00 +1B00 +0000 +3180 +3180 +6180 +6300 +6300 +C600 +CE00 +7600 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 14 0 -3 +BITMAP +0300 +0600 +0000 +3180 +3180 +3300 +3300 +3600 +3600 +1C00 +1800 +3000 +6000 +C000 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 14 0 -3 +BITMAP +0C00 +0C00 +1800 +1B80 +1CC0 +38C0 +30C0 +3180 +3180 +7B00 +6E00 +6000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 14 0 -3 +BITMAP +1B00 +1B00 +0000 +3180 +3180 +3300 +3300 +3600 +3600 +1C00 +1800 +3000 +6000 +C000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 12 11 0 0 +BITMAP +01E0 +0730 +0C30 +1800 +7F00 +3000 +FE00 +3000 +3060 +19C0 +0F00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvBO18.bdf b/src/3rdparty/fonts/helvBO18.bdf new file mode 100644 index 0000000000..7c5c37a4b8 --- /dev/null +++ b/src/3rdparty/fonts/helvBO18.bdf @@ -0,0 +1,3853 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-O-Normal--18-180-75-75-P-104-ISO10646-1 +SIZE 18 75 75 +FONTBOUNDINGBOX 23 23 -3 -5 +COMMENT $XConsortium: helvBO18.bdf,v 1.14 95/01/26 18:02:12 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 18 +POINT_SIZE 180 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 104 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 14 +X_HEIGHT 10 +FONT_ASCENT 16 +FONT_DESCENT 5 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 7 14 1 0 +BITMAP +0E +0E +0E +1C +1C +18 +18 +38 +30 +30 +00 +00 +E0 +E0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 9 0 +BBX 7 5 3 9 +BITMAP +66 +66 +EE +CC +88 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 12 0 +BBX 12 13 0 0 +BITMAP +0360 +0360 +06C0 +3FF0 +3FF0 +0D80 +0D80 +1B00 +FFE0 +FFE0 +1B00 +3600 +3600 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 16 0 -2 +BITMAP +0200 +0200 +1F80 +3FC0 +74C0 +6400 +7E00 +3F00 +0F80 +0980 +0980 +CB80 +FF00 +7E00 +1000 +1000 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 16 0 +BBX 12 13 2 0 +BITMAP +3860 +7CE0 +CDC0 +CD80 +FB00 +7700 +0E00 +1CE0 +19F0 +3B30 +7330 +E3E0 +C1C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 13 1 0 +BITMAP +0F00 +1F80 +1980 +1980 +1F00 +3E00 +7E60 +E7E0 +C3C0 +C380 +E7C0 +7EE0 +3C70 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 4 5 3 9 +BITMAP +70 +70 +30 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 8 18 1 -4 +BITMAP +03 +0E +1C +38 +30 +70 +60 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +60 +70 +38 +1C +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 8 18 -1 -4 +BITMAP +18 +0C +0E +06 +07 +07 +07 +07 +07 +07 +07 +06 +0E +0C +1C +38 +70 +E0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 9 0 +BBX 6 6 3 8 +BITMAP +10 +D4 +7C +70 +F0 +98 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 8 1 1 +BITMAP +0E00 +0E00 +1C00 +FF80 +FF80 +1C00 +3800 +3800 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 5 0 -2 +BITMAP +60 +60 +60 +20 +C0 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 8 2 2 4 +BITMAP +FF +FF +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 3 1 0 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 8 14 0 0 +BITMAP +03 +03 +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +0F00 +3F80 +3B80 +71C0 +61C0 +E1C0 +E1C0 +E1C0 +E380 +E380 +7700 +7E00 +3C00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +07 +0F +7E +FE +0E +0E +1C +1C +1C +1C +38 +38 +38 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +1F80 +3FC0 +71C0 +60C0 +01C0 +0780 +0F00 +1E00 +3800 +7000 +E000 +FF80 +FF80 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +0F80 +1FC0 +39C0 +30C0 +01C0 +0F80 +0F00 +0380 +0180 +C380 +E780 +7F00 +3E00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +01C0 +03C0 +07C0 +0F80 +1D80 +3B80 +7300 +E300 +FF80 +FF80 +0600 +0600 +0600 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +1FC0 +1FC0 +3800 +3000 +7C00 +7F00 +0700 +0380 +0380 +C380 +C700 +FF00 +7C00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +0F80 +1FC0 +38C0 +7000 +7000 +EE00 +FF00 +F380 +E180 +6180 +7380 +7F00 +3E00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +7FC0 +7FC0 +01C0 +0380 +0700 +0E00 +1C00 +1800 +3800 +7000 +7000 +E000 +E000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +0F80 +1FC0 +38C0 +30C0 +39C0 +1F80 +3F00 +7380 +E180 +E180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +0F00 +1F80 +39C0 +70C0 +70C0 +71C0 +3F80 +1F80 +0380 +0300 +C700 +FE00 +7C00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +30 +30 +30 +00 +00 +00 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +18 +18 +00 +00 +00 +00 +60 +60 +60 +20 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 7 1 2 +BITMAP +0380 +1F00 +7800 +E000 +7800 +1E00 +0700 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 6 1 2 +BITMAP +7F80 +7F80 +0000 +0000 +FF00 +FF00 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 7 1 2 +BITMAP +7000 +3C00 +0F00 +0380 +0F00 +7C00 +E000 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 3 0 +BITMAP +3F00 +7F80 +E380 +E380 +0700 +1E00 +3C00 +7000 +E000 +E000 +0000 +0000 +E000 +E000 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 18 0 +BBX 16 17 2 -3 +BITMAP +03F0 +0FFC +1E1E +3807 +31DB +73FB +6733 +E673 +CC66 +CCE6 +CCEE +CFFC +6738 +7000 +3800 +1FC0 +07C0 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +01C0 +03E0 +07E0 +0760 +0E70 +0E70 +1C70 +1C70 +3870 +3FF0 +7FF0 +7070 +E070 +E070 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +1FE0 +1FF0 +1C70 +3870 +3870 +38E0 +7FC0 +7FE0 +70F0 +7070 +E070 +E0F0 +FFE0 +FFC0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 14 1 0 +BITMAP +07E0 +1FF0 +3E38 +3838 +7000 +7000 +E000 +E000 +E000 +E070 +E0F0 +71E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +1FE0 +1FF8 +1C38 +381C +381C +381C +301C +701C +7038 +7038 +E070 +E1E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 13 14 0 0 +BITMAP +1FF8 +1FF8 +1C00 +3800 +3800 +3800 +3FE0 +7FE0 +7000 +7000 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 13 14 0 0 +BITMAP +1FF8 +1FF8 +1C00 +3800 +3800 +3800 +3FC0 +7FC0 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 13 14 1 0 +BITMAP +03F0 +0FF8 +1E38 +3838 +7000 +7000 +E000 +E3F0 +E3F0 +E070 +E070 +70E0 +7FE0 +1F60 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 14 14 0 0 +BITMAP +1C1C +1C1C +1C1C +3838 +3838 +3838 +3FF8 +7FF0 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 11 14 0 0 +BITMAP +00E0 +00E0 +00E0 +01C0 +01C0 +01C0 +01C0 +0380 +0380 +E380 +E380 +E700 +FF00 +7E00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 15 14 0 0 +BITMAP +1C1E +1C3C +1C78 +39E0 +3BC0 +3F80 +3F00 +7F00 +7780 +73C0 +71C0 +E1E0 +E0F0 +E078 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +FF80 +FF80 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 17 0 +BBX 18 14 0 0 +BITMAP +1C01C0 +1C03C0 +1C07C0 +3E0F80 +3E1F80 +3E1B80 +363B80 +777300 +776700 +63E700 +63C700 +E3CE00 +E38E00 +E38E00 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 15 14 0 0 +BITMAP +1C0E +1C0E +1E0E +3E1C +3F1C +3F1C +3B98 +73B8 +71B8 +71F8 +70F0 +E0F0 +E070 +E070 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 14 1 0 +BITMAP +07E0 +1FF8 +3E38 +381C +701C +701C +E01C +E01C +E038 +E038 +E070 +71F0 +7FE0 +1F80 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 13 14 0 0 +BITMAP +1FF0 +1FF8 +1C38 +3838 +3838 +3878 +3FF0 +7FC0 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +03F0 +0FFC +1E1C +380E +780E +700E +700E +E00C +E01C +E19C +E1F8 +70F0 +7FF8 +1FB8 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +1FF0 +1FF8 +1C38 +3838 +3838 +3878 +3FF0 +7FE0 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0FC0 +3FE0 +78E0 +70E0 +7800 +3E00 +1F00 +0780 +03C0 +01C0 +E1C0 +E3C0 +FF80 +7F00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 2 0 +BITMAP +FFE0 +FFE0 +0E00 +1C00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 14 1 0 +BITMAP +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +E1C0 +E3C0 +FF80 +3F00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 3 0 +BITMAP +E0E0 +E0E0 +E1C0 +E1C0 +E380 +E380 +E700 +E700 +EE00 +6E00 +7C00 +7C00 +7800 +7000 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 18 0 +BBX 17 14 2 0 +BITMAP +E1C380 +E1C380 +E1C380 +E3C700 +E3C700 +E7CE00 +E6CE00 +EECC00 +ECDC00 +7CD800 +78F800 +78F000 +70E000 +70E000 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 15 14 -1 0 +BITMAP +1C0E +1C0E +0E1C +0E38 +0670 +07E0 +03C0 +0780 +0F80 +1D80 +39C0 +71C0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 3 0 +BITMAP +E0E0 +E1E0 +E1C0 +E380 +E380 +6700 +7700 +7E00 +3C00 +3800 +3800 +7000 +7000 +7000 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 13 14 -1 0 +BITMAP +0FF8 +0FF8 +0038 +0070 +00E0 +01C0 +0380 +0700 +0E00 +1C00 +3800 +7000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 9 18 -1 -4 +BITMAP +0F80 +0F80 +0E00 +0E00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +E000 +E000 +F800 +F800 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 9 18 -2 -4 +BITMAP +0F80 +0F80 +0380 +0380 +0700 +0700 +0700 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +3800 +3800 +F800 +F800 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 7 2 6 +BITMAP +0600 +0E00 +1F00 +3B00 +7300 +E180 +C180 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 2 -1 -4 +BITMAP +FFC0 +FFC0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 4 5 3 9 +BITMAP +30 +60 +C0 +E0 +E0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +1F00 +3F80 +2180 +0F80 +3F80 +7380 +E380 +E700 +FF00 +7700 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +1C00 +1C00 +1C00 +3800 +3B80 +3FC0 +3CE0 +78E0 +70E0 +70E0 +71C0 +F3C0 +FF80 +EE00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +0F80 +3FC0 +78C0 +7000 +E000 +E000 +E180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 12 14 0 0 +BITMAP +0070 +0070 +0070 +00E0 +0EE0 +3FE0 +79E0 +71C0 +E1C0 +E1C0 +E3C0 +E780 +7F80 +3B80 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +0F00 +3F80 +79C0 +71C0 +FFC0 +FFC0 +E000 +E380 +7F80 +3E00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 8 14 1 0 +BITMAP +0F +1F +1C +38 +FE +FE +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 -4 +BITMAP +0EE0 +3FE0 +79C0 +71C0 +E1C0 +E1C0 +E380 +E780 +7F80 +3B80 +0300 +C700 +FE00 +7C00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +1C00 +1C00 +1C00 +3800 +3BC0 +3FE0 +3CE0 +70E0 +71C0 +71C0 +71C0 +E380 +E380 +E380 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +1C +1C +00 +00 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 9 18 -3 -4 +BITMAP +0380 +0380 +0000 +0000 +0700 +0700 +0700 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1800 +3800 +F800 +F000 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +1C00 +1C00 +1C00 +3800 +39C0 +3B80 +3F00 +7E00 +7C00 +7E00 +7700 +E700 +E380 +E380 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 15 10 0 0 +BITMAP +3B9C +3FFE +3DEE +79CE +739C +739C +739C +E738 +E738 +E738 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 10 0 0 +BITMAP +3BC0 +3FE0 +3CE0 +70E0 +71C0 +71C0 +71C0 +E380 +E380 +E380 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +0F00 +3F80 +79C0 +71C0 +E1C0 +E1C0 +E380 +E780 +7F00 +3C00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 12 14 -1 -4 +BITMAP +1DC0 +1FE0 +1E70 +3C70 +3870 +3870 +38E0 +79E0 +7FC0 +7700 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 -4 +BITMAP +0EE0 +3FE0 +79E0 +71C0 +E1C0 +E1C0 +E3C0 +E780 +7F80 +3B80 +0380 +0700 +0700 +0700 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 7 0 +BBX 8 10 0 0 +BITMAP +37 +3F +3C +78 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +0F80 +3FC0 +79C0 +7000 +3F00 +1F80 +0380 +E780 +FF00 +7C00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 7 13 1 0 +BITMAP +1C +1C +38 +FE +FE +38 +70 +70 +70 +E0 +E0 +F0 +70 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 10 0 0 +BITMAP +38E0 +38E0 +38E0 +71C0 +71C0 +71C0 +E3C0 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 1 0 +BITMAP +E380 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +7800 +7000 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 13 10 1 0 +BITMAP +E738 +E738 +E738 +E770 +EF70 +6F60 +7BE0 +7BC0 +7380 +7380 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +38C0 +39C0 +1B80 +1F00 +0E00 +1E00 +3F00 +7300 +E380 +C380 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 10 14 0 -4 +BITMAP +71C0 +71C0 +71C0 +7380 +7380 +7300 +3700 +3E00 +1E00 +1C00 +1C00 +3800 +F000 +E000 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 10 10 0 0 +BITMAP +3FC0 +3FC0 +0380 +0700 +0E00 +1C00 +3800 +7000 +FF00 +FF00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 8 0 +BBX 7 18 1 -4 +BITMAP +0E +1C +18 +18 +18 +18 +38 +70 +E0 +70 +30 +30 +60 +60 +60 +60 +70 +38 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 5 0 +BBX 7 18 -1 -4 +BITMAP +0E +0E +0C +0C +1C +1C +18 +18 +38 +38 +30 +30 +70 +70 +60 +60 +E0 +E0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 9 0 +BBX 7 18 1 -4 +BITMAP +38 +1C +0C +0C +18 +18 +18 +1C +0E +1C +38 +30 +30 +30 +30 +30 +70 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 3 2 4 +BITMAP +7980 +FF80 +CF00 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 6 14 0 -4 +BITMAP +1C +1C +00 +00 +18 +18 +38 +30 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 12 0 +BBX 10 13 2 -2 +BITMAP +0100 +1F80 +3FC0 +72C0 +6200 +E400 +C400 +C980 +CB80 +FF00 +7E00 +2000 +2000 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +07C0 +0FE0 +1C60 +1C00 +1C00 +0E00 +3F80 +0E00 +1C00 +3800 +70C0 +FFC0 +EF80 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 8 2 2 +BITMAP +6180 +7F80 +3B00 +3300 +6600 +6E00 +FF00 +C300 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 11 13 1 0 +BITMAP +7060 +70E0 +71C0 +3B80 +3F00 +1E00 +FF80 +1C00 +FF80 +1C00 +3800 +3800 +3800 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 5 0 +BBX 5 18 0 -4 +BITMAP +18 +18 +18 +18 +30 +30 +30 +30 +00 +00 +60 +60 +60 +60 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 11 18 0 -4 +BITMAP +07C0 +0FE0 +1C60 +1860 +1C00 +1F00 +3F80 +63C0 +61C0 +70C0 +39C0 +1F80 +0F00 +0700 +C300 +C700 +FE00 +7C00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 6 2 3 11 +BITMAP +CC +CC +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 15 0 +BBX 14 13 1 0 +BITMAP +07C0 +1C70 +3018 +6798 +6CCC +CC4C +D80C +D80C +CC98 +C718 +6030 +38E0 +0F80 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 8 0 +BBX 7 9 2 5 +BITMAP +1E +26 +1E +36 +6C +7C +00 +FC +FC +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 5 2 3 +BITMAP +1CE0 +7BC0 +E700 +7380 +39C0 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 5 2 3 +BITMAP +FF80 +FF80 +0180 +0300 +0300 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 6 2 2 4 +BITMAP +FC +FC +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 15 0 +BBX 14 13 1 0 +BITMAP +07C0 +1C70 +3018 +6798 +66CC +66CC +C78C +CD18 +CD98 +6D98 +6030 +3860 +0F80 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 2 4 12 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 7 0 +BBX 6 6 1 7 +BITMAP +38 +7C +CC +CC +F8 +70 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 10 9 0 0 +BITMAP +0700 +0700 +7FC0 +7FC0 +1C00 +1C00 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 6 8 1 5 +BITMAP +38 +7C +CC +18 +30 +60 +F8 +F8 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 7 8 0 5 +BITMAP +1C +3E +66 +18 +1C +CC +F8 +70 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 3 3 11 +BITMAP +38 +70 +E0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 13 14 -2 -4 +BITMAP +0E38 +0E38 +0E38 +1C70 +1C70 +1C70 +38F0 +39E0 +3FE0 +7EE0 +7000 +7000 +E000 +E000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 18 2 -4 +BITMAP +1FC0 +3D80 +7D80 +FB00 +FB00 +FB00 +F300 +F600 +7600 +3600 +3600 +6C00 +6C00 +6C00 +6C00 +D800 +D800 +D800 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 5 0 -5 +BITMAP +30 +38 +18 +F8 +F0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 8 2 5 +BITMAP +30 +F0 +30 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 8 0 +BBX 7 9 2 5 +BITMAP +1C +3E +66 +66 +7C +38 +00 +FC +FC +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 5 2 3 +BITMAP +7380 +39C0 +1CE0 +7BC0 +E700 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 12 13 2 0 +BITMAP +30C0 +F1C0 +3380 +6300 +6600 +CE60 +CCE0 +D9E0 +3B60 +37F0 +67F0 +E0C0 +C0C0 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 12 13 2 0 +BITMAP +30C0 +F1C0 +3380 +6300 +6600 +CEE0 +CDF0 +DB30 +3860 +30C0 +6180 +E3E0 +C3E0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 14 13 0 0 +BITMAP +1C30 +3E70 +66E0 +18C0 +1D80 +CF98 +FB38 +7678 +0ED8 +0DFC +19FC +3830 +3030 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 0 -4 +BITMAP +0380 +0380 +0000 +0000 +0380 +0380 +0700 +1E00 +3C00 +7000 +E380 +E380 +FF00 +7E00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0700 +0380 +00C0 +0000 +01C0 +03E0 +07E0 +0760 +0E70 +0E70 +1C70 +1C70 +3870 +3FF0 +7FF0 +7070 +E070 +E070 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0070 +00E0 +0180 +0000 +01C0 +03E0 +07E0 +0760 +0E70 +0E70 +1C70 +1C70 +3870 +3FF0 +7FF0 +7070 +E070 +E070 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +00E0 +01F0 +03B8 +0000 +01C0 +03E0 +07E0 +0760 +0E70 +0E70 +1C70 +1C70 +3870 +3FF0 +7FF0 +7070 +E070 +E070 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +01D8 +03F8 +0370 +0000 +01C0 +03E0 +07E0 +0760 +0E70 +0E70 +1C70 +1C70 +3870 +3FF0 +7FF0 +7070 +E070 +E070 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0330 +0330 +0000 +01C0 +03E0 +07E0 +0760 +0E70 +0E70 +1C70 +1C70 +3870 +3FF0 +7FF0 +7070 +E070 +E070 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +01E0 +0360 +0360 +01C0 +03E0 +07E0 +0760 +0E70 +0E70 +1C70 +1C70 +3870 +3FF0 +7FF0 +7070 +E070 +E070 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 19 0 +BBX 20 14 0 0 +BITMAP +01FFF0 +03FFF0 +07F800 +077000 +0E7000 +0E7000 +1C7FC0 +1CFFC0 +38E000 +3FE000 +7FE000 +71C000 +E1FF80 +E1FF80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 19 1 -5 +BITMAP +07E0 +1FF0 +3E38 +3838 +7000 +7000 +E000 +E000 +E000 +E070 +E0F0 +71E0 +7FC0 +1F00 +1800 +1C00 +0C00 +7C00 +7800 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 13 18 0 0 +BITMAP +0700 +0380 +00C0 +0000 +1FF8 +1FF8 +1C00 +3800 +3800 +3800 +3FE0 +7FE0 +7000 +7000 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 13 18 0 0 +BITMAP +0070 +00E0 +0180 +0000 +1FF8 +1FF8 +1C00 +3800 +3800 +3800 +3FE0 +7FE0 +7000 +7000 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 13 18 0 0 +BITMAP +01C0 +03E0 +0770 +0000 +1FF8 +1FF8 +1C00 +3800 +3800 +3800 +3FE0 +7FE0 +7000 +7000 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 13 17 0 0 +BITMAP +0660 +0660 +0000 +1FF8 +1FF8 +1C00 +3800 +3800 +3800 +3FE0 +7FE0 +7000 +7000 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 18 0 0 +BITMAP +70 +38 +0C +00 +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 8 18 0 0 +BITMAP +07 +0E +18 +00 +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 8 18 0 0 +BITMAP +1C +3E +77 +00 +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 8 17 0 0 +BITMAP +33 +33 +00 +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +1FE0 +1FF8 +1C38 +381C +381C +381C +FF1C +FF1C +7038 +7038 +E070 +E1E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 15 18 0 0 +BITMAP +01D8 +03F8 +0370 +0000 +1C0E +1C0E +1E0E +3E1C +3F1C +3F1C +3B98 +73B8 +71B8 +71F8 +70F0 +E0F0 +E070 +E070 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 18 1 0 +BITMAP +0700 +0380 +00C0 +0000 +07E0 +1FF8 +3E38 +381C +701C +701C +E01C +E01C +E038 +E038 +E070 +71F0 +7FE0 +1F80 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 18 1 0 +BITMAP +0070 +00E0 +0180 +0000 +07E0 +1FF8 +3E38 +381C +701C +701C +E01C +E01C +E038 +E038 +E070 +71F0 +7FE0 +1F80 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 18 1 0 +BITMAP +01C0 +03E0 +0770 +0000 +07E0 +1FF8 +3E38 +381C +701C +701C +E01C +E01C +E038 +E038 +E070 +71F0 +7FE0 +1F80 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 18 1 0 +BITMAP +03B0 +07F0 +06E0 +0000 +07E0 +1FF8 +3E38 +381C +701C +701C +E01C +E01C +E038 +E038 +E070 +71F0 +7FE0 +1F80 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 17 1 0 +BITMAP +0330 +0330 +0000 +07E0 +1FF8 +3E38 +381C +701C +701C +E01C +E01C +E038 +E038 +E070 +71F0 +7FE0 +1F80 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 8 1 1 +BITMAP +6180 +7380 +3F00 +1E00 +3C00 +7E00 +E700 +C300 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +07EC +1FF8 +3E38 +387C +70FC +71DC +E39C +E71C +EE38 +FC38 +F870 +71F0 +FFE0 +DF80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 18 1 0 +BITMAP +0E00 +0700 +0180 +0000 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +E1C0 +E3C0 +FF80 +3F00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 18 1 0 +BITMAP +00E0 +01C0 +0300 +0000 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +E1C0 +E3C0 +FF80 +3F00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 18 1 0 +BITMAP +0380 +07C0 +0EE0 +0000 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +E1C0 +E3C0 +FF80 +3F00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 17 1 0 +BITMAP +0660 +0660 +0000 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +E1C0 +E3C0 +FF80 +3F00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 18 3 0 +BITMAP +0380 +0700 +0C00 +0000 +E0E0 +E1E0 +E1C0 +E380 +E380 +6700 +7700 +7E00 +3C00 +3800 +3800 +7000 +7000 +7000 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 14 0 0 +BITMAP +1C00 +1C00 +1C00 +3FE0 +3FF0 +3870 +3870 +7870 +70F0 +7FE0 +7F80 +E000 +E000 +E000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +0780 +0FC0 +1CC0 +38C0 +39C0 +3380 +7700 +7380 +7180 +6180 +E180 +E380 +EF00 +EE00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +3800 +1C00 +0600 +0000 +1F00 +3F80 +2180 +0F80 +3F80 +7380 +E380 +E700 +FF00 +7700 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0380 +0700 +0C00 +0000 +1F00 +3F80 +2180 +0F80 +3F80 +7380 +E380 +E700 +FF00 +7700 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0E00 +1F00 +3B80 +0000 +1F00 +3F80 +2180 +0F80 +3F80 +7380 +E380 +E700 +FF00 +7700 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +0EC0 +1FC0 +1B80 +0000 +1F00 +3F80 +2180 +0F80 +3F80 +7380 +E380 +E700 +FF00 +7700 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +1980 +1980 +0000 +1F00 +3F80 +2180 +0F80 +3F80 +7380 +E380 +E700 +FF00 +7700 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0780 +0D80 +0D80 +0F00 +1F00 +3F80 +2180 +0F80 +3F80 +7380 +E380 +E700 +FF00 +7700 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 15 10 0 0 +BITMAP +1FF8 +3FFC +21CE +0F8E +3FFE +73FE +E380 +E78E +FFFE +78F8 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 15 0 -5 +BITMAP +0F00 +3F80 +7980 +7000 +E000 +E000 +E180 +E380 +7F00 +3E00 +3000 +3800 +1800 +F800 +F000 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +1C00 +0E00 +0300 +0000 +0F00 +3F80 +79C0 +71C0 +FFC0 +FFC0 +E000 +E380 +7F80 +3E00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +01C0 +0380 +0600 +0000 +0F00 +3F80 +79C0 +71C0 +FFC0 +FFC0 +E000 +E380 +7F80 +3E00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +0700 +0F80 +1DC0 +0000 +0F00 +3F80 +79C0 +71C0 +FFC0 +FFC0 +E000 +E380 +7F80 +3E00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +1980 +1980 +0000 +0F00 +3F80 +79C0 +71C0 +FFC0 +FFC0 +E000 +E380 +7F80 +3E00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +E0 +70 +18 +00 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 14 0 0 +BITMAP +0E +1C +30 +00 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 14 0 0 +BITMAP +38 +7C +EE +00 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 13 0 0 +BITMAP +66 +66 +00 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +3B80 +1E00 +1E00 +3300 +0F80 +3F80 +79C0 +71C0 +E1C0 +E1C0 +E380 +E780 +7F00 +3C00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +0760 +0FE0 +0DC0 +0000 +3BC0 +3FE0 +3CE0 +70E0 +71C0 +71C0 +71C0 +E380 +E380 +E380 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +1C00 +0E00 +0300 +0000 +0F00 +3F80 +79C0 +71C0 +E1C0 +E1C0 +E380 +E780 +7F00 +3C00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0380 +0700 +0C00 +0000 +0F00 +3F80 +79C0 +71C0 +E1C0 +E1C0 +E380 +E780 +7F00 +3C00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0700 +0F80 +1DC0 +0000 +0F00 +3F80 +79C0 +71C0 +E1C0 +E1C0 +E380 +E780 +7F00 +3C00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0EC0 +1FC0 +1B80 +0000 +0F00 +3F80 +79C0 +71C0 +E1C0 +E1C0 +E380 +E780 +7F00 +3C00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 13 1 0 +BITMAP +0CC0 +0CC0 +0000 +0F00 +3F80 +79C0 +71C0 +E1C0 +E1C0 +E380 +E780 +7F00 +3C00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 8 1 1 +BITMAP +0E00 +0E00 +0000 +FF80 +FF80 +0000 +3800 +3800 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 12 10 -1 0 +BITMAP +07B0 +1FE0 +3DE0 +3B60 +76E0 +6CE0 +79C0 +73C0 +7F80 +DE00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +1C00 +0E00 +0300 +0000 +38E0 +38E0 +38E0 +71C0 +71C0 +71C0 +E3C0 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +01C0 +0380 +0600 +0000 +38E0 +38E0 +38E0 +71C0 +71C0 +71C0 +E3C0 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 14 0 0 +BITMAP +0700 +0F80 +1DC0 +0000 +38E0 +38E0 +38E0 +71C0 +71C0 +71C0 +E3C0 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 13 0 0 +BITMAP +0CC0 +0CC0 +0000 +38E0 +38E0 +38E0 +71C0 +71C0 +71C0 +E3C0 +E780 +FF80 +7B80 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 10 18 0 -4 +BITMAP +0380 +0700 +0C00 +0000 +71C0 +71C0 +71C0 +7380 +7380 +7300 +3700 +3E00 +1E00 +1C00 +1C00 +3800 +F000 +E000 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 12 18 -1 -4 +BITMAP +0E00 +0E00 +0E00 +1C00 +1DC0 +1FE0 +1E70 +3C70 +3870 +3870 +38E0 +79E0 +7FC0 +7700 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 10 17 0 -4 +BITMAP +1980 +1980 +0000 +71C0 +71C0 +71C0 +7380 +7380 +7300 +3700 +3E00 +1E00 +1C00 +1C00 +3800 +F000 +E000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +03F0 +0FF8 +1F1C +1C1C +7F80 +7F80 +7000 +7000 +FF00 +FF38 +7078 +38F0 +3FE0 +0F80 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvBO24.bdf b/src/3rdparty/fonts/helvBO24.bdf new file mode 100644 index 0000000000..52ebd38a16 --- /dev/null +++ b/src/3rdparty/fonts/helvBO24.bdf @@ -0,0 +1,4709 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Bold-O-Normal--24-240-75-75-P-138-ISO10646-1 +SIZE 24 75 75 +FONTBOUNDINGBOX 28 29 -1 -5 +COMMENT $XConsortium: helvBO24.bdf,v 1.16 95/01/26 18:02:18 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Bold" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 24 +POINT_SIZE 240 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 138 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 19 +X_HEIGHT 14 +FONT_ASCENT 22 +FONT_DESCENT 5 +FACE_NAME "Helvetica Bold Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-BoldOblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2-1, 02-Jan-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 70 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Bold Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 8 19 2 0 +BITMAP +07 +07 +07 +0E +0E +0E +1C +1C +1C +18 +18 +38 +30 +30 +00 +00 +E0 +E0 +E0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 474 0 +DWIDTH 9 0 +BBX 7 5 5 14 +BITMAP +66 +66 +EE +CC +88 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 18 1 0 +BITMAP +0198 +0198 +0198 +0330 +0330 +1FFC +1FFC +0660 +0CC0 +0CC0 +1980 +FFE0 +FFE0 +3300 +3300 +6600 +6600 +6600 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 14 21 1 -2 +BITMAP +0060 +0060 +07F0 +1FF8 +1CDC +38DC +3980 +3D80 +1F80 +0F80 +07C0 +03E0 +06F0 +0670 +0670 +ECF0 +EDE0 +FFC0 +7F80 +1800 +1800 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 22 0 +BBX 16 17 4 0 +BITMAP +1E07 +3F0E +731C +E338 +C770 +CE60 +FCE0 +79C0 +0380 +071E +073F +0E73 +1CE3 +38C7 +70CE +E0FC +0078 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 15 18 2 0 +BITMAP +01E0 +07F0 +0738 +0E38 +0E38 +0E70 +07E0 +07C0 +0F80 +1F9C +39DC +70F8 +E070 +E070 +E0F0 +F1F8 +7FDC +3F0E +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 5 4 14 +BITMAP +3C +3C +0C +38 +E0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 10 24 2 -5 +BITMAP +01C0 +0380 +0700 +0E00 +1C00 +1800 +3800 +3000 +7000 +7000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +E000 +7000 +7000 +3800 +1C00 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 10 24 0 -5 +BITMAP +0E00 +0700 +0380 +0380 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +01C0 +0380 +0380 +0300 +0700 +0600 +0E00 +1C00 +3800 +7000 +E000 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 8 7 5 12 +BITMAP +18 +DB +FF +3C +78 +EC +CC +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 10 12 4 1 +BITMAP +0700 +0700 +0600 +0E00 +0E00 +FFC0 +FFC0 +1C00 +1C00 +1800 +3800 +3800 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 4 6 1 -3 +BITMAP +70 +70 +70 +30 +60 +C0 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 11 2 3 6 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 3 2 0 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 11 19 1 0 +BITMAP +0060 +0060 +00C0 +00C0 +0180 +0180 +0300 +0600 +0600 +0C00 +0C00 +1800 +1800 +3000 +3000 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 14 18 1 0 +BITMAP +03F0 +07F8 +0F3C +1C1C +1C1C +381C +381C +7038 +7038 +7038 +E038 +E070 +E070 +E0E0 +E0E0 +73C0 +7F80 +3F00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 7 18 6 0 +BITMAP +0E +0E +1E +FC +FC +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 15 18 0 0 +BITMAP +01F8 +07FC +0F1E +1E0E +1C0E +000E +001C +003C +00F8 +03E0 +0780 +0F00 +1C00 +3800 +7000 +E000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 18 1 0 +BITMAP +07E0 +0FF0 +1C78 +3838 +3838 +3838 +0070 +00E0 +03C0 +03E0 +00E0 +0070 +0070 +0070 +E0F0 +F1E0 +7FC0 +3F00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 18 1 0 +BITMAP +0038 +0078 +00F8 +01F0 +03F0 +0770 +0E70 +1C60 +38E0 +30E0 +70E0 +E1C0 +FFF0 +FFF0 +01C0 +0380 +0380 +0380 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 14 18 1 0 +BITMAP +0FFC +0FFC +0E00 +1C00 +1C00 +1C00 +3FC0 +3FE0 +38F0 +0070 +0070 +0070 +0070 +E0F0 +E0E0 +F3C0 +7F80 +3F00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 14 18 2 0 +BITMAP +01F0 +07F8 +0F3C +1C1C +3800 +3800 +7000 +77C0 +7FE0 +78F0 +F070 +E070 +E070 +E0E0 +E1E0 +73C0 +7F80 +3E00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 14 18 2 0 +BITMAP +3FFC +3FFC +0038 +0070 +00E0 +01C0 +01C0 +0380 +0700 +0700 +0E00 +1C00 +1C00 +3800 +7000 +7000 +E000 +E000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 18 1 0 +BITMAP +03E0 +07F0 +0E78 +1C38 +1C38 +1C38 +1E70 +0FE0 +0FC0 +3FE0 +78F0 +7070 +E070 +E070 +E0E0 +71E0 +7FC0 +1F80 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 14 18 1 0 +BITMAP +03F0 +07F8 +0F3C +1C1C +1C1C +381C +383C +3838 +3878 +3CF8 +1FF8 +0FF0 +0070 +00E0 +E0E0 +F3C0 +7F80 +3F00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 14 3 0 +BITMAP +1C +1C +1C +00 +00 +00 +00 +00 +00 +00 +00 +E0 +E0 +E0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 7 17 2 -3 +BITMAP +0E +0E +0E +00 +00 +00 +00 +00 +00 +00 +00 +70 +70 +70 +30 +60 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 14 11 3 2 +BITMAP +001C +0078 +01E0 +0780 +1E00 +7800 +E000 +7800 +1E00 +0780 +01C0 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 11 6 3 4 +BITMAP +7FE0 +7FE0 +0000 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 14 11 0 2 +BITMAP +0E00 +0780 +01E0 +0078 +001C +0078 +01E0 +0780 +1E00 +7800 +E000 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 5 0 +BITMAP +0FC0 +3FE0 +78F0 +7070 +E070 +E0F0 +01E0 +07C0 +0F00 +1C00 +3800 +7000 +7000 +7000 +0000 +0000 +7000 +7000 +7000 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 975 0 +DWIDTH 24 0 +BBX 23 23 2 -4 +BITMAP +003FC0 +00FFF0 +03E078 +07801C +0F000C +1E1CCE +1C7FCE +38E78E +71C38E +73830E +E3870E +E7061C +E70E1C +E70C38 +E71C38 +E39E70 +E3FFE0 +71E3C0 +700000 +780000 +3E1C00 +0FFC00 +03F000 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 19 1 0 +BITMAP +001C +003C +007C +007C +00EE +01CE +01CE +038E +070E +070E +0E0E +0E0E +1FFE +3FFF +3807 +7007 +7007 +E007 +E007 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 19 2 0 +BITMAP +0FFE00 +0FFF00 +0E0780 +0E0380 +1C0380 +1C0380 +1C0780 +1C0F00 +3FFE00 +3FFE00 +380700 +380700 +700700 +700700 +700F00 +E01E00 +E07C00 +FFF800 +FFE000 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 19 3 0 +BITMAP +01FC +07FE +0F8F +1E07 +3807 +7800 +7000 +F000 +E000 +E000 +E000 +E000 +E000 +E00E +F01E +703C +78F8 +3FF0 +1FC0 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 18 19 2 0 +BITMAP +0FFC00 +0FFF00 +0E0F80 +0E0380 +1C01C0 +1C01C0 +1C01C0 +1C01C0 +3801C0 +3801C0 +3801C0 +380380 +700380 +700780 +700F00 +701E00 +E07C00 +FFF800 +FFE000 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 19 2 0 +BITMAP +0FFF +0FFF +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3FF8 +3FF8 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 16 19 2 0 +BITMAP +0FFF +0FFF +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3FF8 +3FF8 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 19 3 0 +BITMAP +01FC00 +07FE00 +0F8F00 +1E0700 +380700 +780000 +700000 +F00000 +E00000 +E07F80 +E07F80 +E00700 +E00700 +E00F00 +F00E00 +701E00 +787E00 +3FFC00 +1FCC00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 19 19 2 0 +BITMAP +0E00E0 +0E00E0 +0E00E0 +0E00E0 +1C01C0 +1C01C0 +1C01C0 +1C01C0 +3FFF80 +3FFF80 +380380 +380380 +700700 +700700 +700700 +700700 +E00E00 +E00E00 +E00E00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 7 19 2 0 +BITMAP +0E +0E +0E +0E +1C +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 19 2 0 +BITMAP +001C +001C +001C +001C +0038 +0038 +0038 +0038 +0070 +0070 +0070 +0070 +00E0 +E0E0 +E1E0 +E1C0 +E3C0 +FF80 +7F00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 19 2 0 +BITMAP +0E03C0 +0E0780 +0E0F00 +0E1E00 +1C3800 +1CF000 +1DE000 +1FC000 +3F8000 +3FC000 +39E000 +38E000 +707000 +707800 +703C00 +701C00 +E00E00 +E00F00 +E00700 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 2 0 +BITMAP +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 23 0 +BBX 23 19 2 0 +BITMAP +0E000E +0E001E +0F003E +0F003E +1F007C +1F80FC +1F81DC +1D81DC +3983B8 +39C738 +39C738 +39CE38 +71DC70 +71DC70 +70F870 +70F070 +E0F0E0 +E0E0E0 +E0E0E0 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 19 19 2 0 +BITMAP +0E00E0 +0E00E0 +0F00E0 +0F00E0 +1F81C0 +1D81C0 +1DC1C0 +19C1C0 +39C380 +38E380 +38E380 +386380 +707300 +707700 +703700 +703F00 +E01E00 +E01E00 +E00E00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 19 3 0 +BITMAP +01FC00 +07FE00 +0F8F00 +1E0700 +380780 +780380 +700380 +F00380 +E00380 +E00380 +E00380 +E00780 +E00700 +E00F00 +F01E00 +703C00 +78F800 +3FF000 +1FC000 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 17 19 2 0 +BITMAP +0FFE00 +0FFF00 +0E0780 +0E0380 +1C0380 +1C0380 +1C0700 +1C0F00 +3FFE00 +3FF800 +380000 +380000 +700000 +700000 +700000 +700000 +E00000 +E00000 +E00000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 19 3 0 +BITMAP +01FC00 +07FE00 +0F8F00 +1E0700 +380780 +780380 +700380 +F00380 +E00380 +E00380 +E00380 +E00780 +E00700 +E00F00 +F1EE00 +70FC00 +787800 +3FFC00 +1FDE00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 17 0 +BBX 17 19 2 0 +BITMAP +0FFE00 +0FFF00 +0E0780 +0E0380 +1C0380 +1C0380 +1C0700 +1C0F00 +3FFE00 +3FFC00 +381E00 +380E00 +700E00 +700E00 +700E00 +700E00 +E01C00 +E01C00 +E01C00 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 16 19 2 0 +BITMAP +00FC +03FE +078F +0E07 +1C07 +1C00 +1E00 +0F80 +07F0 +01FC +003E +000E +000E +E00E +E01E +F03C +7CF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 15 19 4 0 +BITMAP +FFFE +FFFE +0380 +0380 +0700 +0700 +0700 +0700 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 18 19 3 0 +BITMAP +1C01C0 +1C01C0 +1C01C0 +1C01C0 +380380 +380380 +380380 +380380 +700700 +700700 +700700 +700F00 +E00E00 +E01E00 +E01C00 +F03C00 +78F800 +7FF000 +1FC000 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 18 0 +BBX 16 19 5 0 +BITMAP +E007 +E007 +E00E +E00E +E01C +701C +7038 +7070 +7070 +70E0 +70E0 +71C0 +7180 +3380 +3700 +3F00 +3E00 +3C00 +3C00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 23 0 +BBX 21 19 5 0 +BITMAP +E07038 +E07038 +E07070 +E0F070 +E0F0E0 +E0F0E0 +E1F0E0 +E1F1C0 +E3F1C0 +E37380 +E77380 +E67380 +EE7700 +7C3700 +7C3E00 +783E00 +783C00 +703800 +703800 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 18 0 +BBX 20 19 1 0 +BITMAP +0E0070 +0F00F0 +0701E0 +0783C0 +038780 +01CF00 +01FC00 +00F800 +00F000 +00F000 +01F800 +03B800 +073C00 +0E1C00 +1E1E00 +3C0E00 +780F00 +F00700 +E00700 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 16 19 5 0 +BITMAP +E00F +E01E +E03C +7078 +7070 +70E0 +39C0 +39C0 +3B80 +3F00 +1F00 +1E00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 16 0 +BBX 18 19 1 0 +BITMAP +0FFFC0 +0FFFC0 +0003C0 +000780 +000F00 +001E00 +003C00 +007800 +00F000 +01E000 +03C000 +078000 +0F0000 +1E0000 +3C0000 +780000 +F00000 +FFFE00 +FFFE00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 10 24 0 -5 +BITMAP +07C0 +07C0 +0700 +0700 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +F800 +F800 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 3 19 5 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 10 24 1 -5 +BITMAP +07C0 +07C0 +01C0 +01C0 +0380 +0380 +0380 +0380 +0700 +0700 +0700 +0700 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3800 +3800 +F800 +F800 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 12 9 3 10 +BITMAP +0180 +0380 +07C0 +0EC0 +1CE0 +1860 +3870 +7030 +E030 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 2 -1 -5 +BITMAP +FFFC +FFFC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 5 4 14 +BITMAP +1C +70 +C0 +F0 +F0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 14 2 0 +BITMAP +07E0 +1FF0 +3C70 +3870 +00F0 +07E0 +1FE0 +3CE0 +70E0 +E0E0 +E1C0 +E7C0 +FFC0 +79C0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 14 19 2 0 +BITMAP +0E00 +0E00 +0E00 +0E00 +1C00 +1DF0 +1FF8 +1F38 +3C1C +381C +381C +381C +7038 +7038 +7070 +7070 +F9E0 +FFC0 +EF80 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 14 2 0 +BITMAP +03C0 +0FE0 +1E70 +3830 +7000 +7000 +E000 +E000 +E000 +E000 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 15 19 2 0 +BITMAP +000E +000E +000E +000E +001C +03DC +0FFC +1E7C +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0F0 +73E0 +7FE0 +1EE0 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 14 2 0 +BITMAP +03E0 +0FF0 +1E70 +3838 +7038 +7038 +FFF8 +FFF0 +E000 +E000 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 9 19 3 0 +BITMAP +0780 +0F80 +0E00 +1C00 +1C00 +7F00 +7F00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 16 19 0 -5 +BITMAP +00F7 +03FF +079F +0E0E +1C0E +1C0E +380E +381C +381C +381C +383C +1CF8 +1FF8 +07B8 +0038 +E070 +F0E0 +7FE0 +1F80 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 19 2 0 +BITMAP +0E00 +0E00 +0E00 +0E00 +1C00 +1DE0 +1FF0 +1E38 +3C38 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 7 19 2 0 +BITMAP +0E +0E +0E +00 +00 +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 10 24 -1 -5 +BITMAP +01C0 +01C0 +01C0 +0000 +0000 +0380 +0380 +0380 +0700 +0700 +0700 +0700 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +F000 +F000 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +0E00 +0E00 +0E00 +0E00 +1C00 +1C38 +1C70 +1CE0 +39C0 +3F80 +3F00 +3F80 +7380 +71C0 +71C0 +70E0 +E0E0 +E070 +E070 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 7 19 2 0 +BITMAP +0E +0E +0E +0E +1C +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 889 0 +DWIDTH 21 0 +BBX 19 14 2 0 +BITMAP +1DE7C0 +1FFFE0 +1E7CE0 +3C78E0 +3870E0 +3870E0 +3870E0 +70E1C0 +70E1C0 +70E1C0 +70E1C0 +E1C380 +E1C380 +E1C380 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 14 2 0 +BITMAP +1DE0 +1FF0 +1E38 +3C38 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 13 14 2 0 +BITMAP +03C0 +0FF0 +1E70 +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 15 19 1 -5 +BITMAP +0EF0 +0FFC +0F9C +1E0E +1C0E +1C0E +380E +380E +381C +381C +3838 +7CF0 +7FE0 +7780 +7000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 14 19 2 -5 +BITMAP +03DC +0FFC +1E7C +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0F0 +73E0 +7FE0 +1EE0 +00E0 +01C0 +01C0 +01C0 +01C0 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 10 14 2 0 +BITMAP +1CC0 +1DC0 +1FC0 +3E00 +3C00 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 14 2 0 +BITMAP +0FC0 +3FE0 +78F0 +7070 +7000 +7C00 +3F00 +0FC0 +01E0 +E0E0 +E0E0 +F1E0 +7FC0 +3F00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 8 18 3 0 +BITMAP +0E +0E +0E +1C +7F +7F +1C +38 +38 +38 +38 +70 +70 +70 +E0 +E0 +F8 +78 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 14 3 0 +BITMAP +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E1E0 +E3E0 +E7C0 +7DC0 +39C0 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 14 4 0 +BITMAP +E070 +E0F0 +E0E0 +E1C0 +E1C0 +E380 +E380 +E700 +E700 +EE00 +7C00 +7C00 +7800 +7000 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 19 14 3 0 +BITMAP +E0E0E0 +E1E0E0 +E1E1C0 +E3E380 +E36380 +E76700 +E66700 +EE6E00 +EC6C00 +7C7C00 +787800 +787800 +707000 +707000 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 14 14 1 0 +BITMAP +1C1C +1C38 +0E70 +0EE0 +07C0 +0780 +0380 +0780 +0FC0 +1CC0 +38E0 +70E0 +E070 +C070 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 19 2 -5 +BITMAP +701C +701C +7038 +7038 +3870 +3870 +38E0 +38E0 +1DC0 +1DC0 +1F80 +0F00 +0F00 +0E00 +0E00 +1C00 +3800 +F800 +F000 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 13 14 1 0 +BITMAP +1FF8 +1FF8 +0070 +00E0 +01C0 +0380 +0700 +0E00 +1C00 +3800 +7000 +E000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 10 24 3 -5 +BITMAP +03C0 +07C0 +0E00 +0C00 +1C00 +1800 +1800 +1800 +1800 +3800 +F000 +E000 +3000 +3000 +3000 +3000 +6000 +6000 +6000 +C000 +C000 +C000 +F800 +7800 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 280 0 +DWIDTH 7 0 +BBX 8 24 1 -5 +BITMAP +03 +03 +07 +06 +06 +0E +0E +0C +0C +1C +1C +18 +18 +38 +38 +30 +30 +70 +70 +60 +60 +E0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 10 24 1 -5 +BITMAP +0780 +07C0 +00C0 +00C0 +00C0 +0180 +0180 +0180 +0380 +0300 +03C0 +01C0 +0300 +0300 +0300 +0600 +0600 +0600 +0600 +0E00 +0C00 +1C00 +F800 +F000 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 12 4 2 5 +BITMAP +3C30 +7E70 +E7E0 +C3C0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 8 19 1 -5 +BITMAP +07 +07 +07 +00 +00 +0C +0C +1C +18 +18 +38 +38 +38 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 18 2 -2 +BITMAP +0030 +0070 +07E0 +0FF0 +1EF8 +3998 +7180 +7300 +E300 +E600 +E600 +EC00 +ECE0 +79C0 +7F80 +3F00 +7000 +6000 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 18 1 0 +BITMAP +01F0 +03F8 +071C +0E0C +0E00 +0E00 +0700 +0700 +3FF0 +3FF0 +0700 +0E00 +0E00 +1C00 +3800 +7738 +FFF8 +F9F0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 12 2 3 +BITMAP +300C +3BDC +1FF8 +0E70 +1C70 +3870 +3870 +38E0 +39C0 +7FE0 +EF70 +C030 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 16 18 2 0 +BITMAP +3807 +380E +381C +1838 +1C70 +1CE0 +0DC0 +0F80 +7FF0 +7FF0 +0700 +FFE0 +FFE0 +0E00 +0E00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 280 0 +DWIDTH 7 0 +BBX 8 23 1 -4 +BITMAP +07 +07 +07 +07 +0E +0E +0E +1C +1C +1C +00 +00 +00 +38 +38 +38 +78 +70 +70 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 15 24 1 -5 +BITMAP +01F8 +03FC +079C +070E +070E +0700 +0380 +0FC0 +1FE0 +3CF0 +3870 +3838 +3838 +1C38 +1E78 +0FF0 +07E0 +03C0 +01C0 +E1C0 +E1C0 +7380 +7F80 +3F00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 10 0 +BBX 8 2 5 16 +BITMAP +E7 +E7 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 19 0 +BBX 17 17 3 0 +BITMAP +03F800 +0F1E00 +1C0700 +380300 +71F380 +631980 +E61980 +CC0180 +CC0180 +CC0180 +CC3380 +CE6300 +E7C700 +600E00 +701C00 +3C7800 +0FE000 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 10 0 +BBX 9 12 3 7 +BITMAP +1F00 +3F80 +3180 +0F80 +3F00 +7300 +6700 +7F00 +3B00 +0000 +FF00 +FF00 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 10 8 3 3 +BITMAP +1DC0 +3B80 +7700 +EE00 +CC00 +EE00 +7700 +3B80 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 7 3 3 +BITMAP +FFF0 +FFF0 +0030 +0030 +0060 +0060 +0060 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 10 0 +BBX 8 2 2 6 +BITMAP +FF +FF +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 19 0 +BBX 17 17 3 0 +BITMAP +03F800 +0F1E00 +1C0700 +380300 +73F380 +631980 +E31980 +C63180 +C7E180 +CCC180 +CC6380 +D83300 +D83700 +600E00 +701C00 +3C7800 +0FE000 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 7 2 5 16 +BITMAP +FE +FE +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 9 0 +BBX 8 7 3 11 +BITMAP +3C +66 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 13 2 0 +BITMAP +01C0 +01C0 +0380 +0380 +3FF0 +3FF0 +0700 +0700 +0E00 +0E00 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 7 10 2 8 +BITMAP +1C +3E +66 +06 +0E +3C +70 +E0 +FC +FC +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 8 10 2 8 +BITMAP +1E +3F +63 +06 +1C +1E +06 +C6 +FC +78 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 4 5 15 +BITMAP +1C +38 +70 +E0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 15 19 1 -5 +BITMAP +0E0E +0E0E +0E0E +1C1C +1C1C +1C1C +1C1C +3838 +3838 +3878 +3878 +7CF0 +7FF0 +6730 +6000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 24 4 -5 +BITMAP +03F8 +0FF8 +3E60 +7E60 +7CC0 +FCC0 +FCC0 +FCC0 +F980 +F980 +7980 +7980 +3300 +3300 +3300 +3300 +6600 +6600 +6600 +6600 +CC00 +CC00 +CC00 +CC00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 3 4 6 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 6 6 3 -5 +BITMAP +70 +38 +1C +CC +F8 +70 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 4 10 4 8 +BITMAP +30 +30 +F0 +F0 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 10 0 +BBX 9 12 3 7 +BITMAP +0F00 +1F80 +3980 +3180 +6180 +6300 +6700 +7E00 +3C00 +0000 +FF00 +FF00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 10 8 2 3 +BITMAP +7700 +3B80 +1DC0 +0CC0 +1DC0 +3B80 +7700 +EE00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 15 18 4 0 +BITMAP +3018 +3038 +F070 +F060 +60E0 +61C0 +6180 +C380 +C706 +C60E +0E1E +1C3C +186C +38CC +71FE +61FE +E018 +C018 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 16 18 4 0 +BITMAP +3018 +3038 +F070 +F060 +60E0 +61C0 +6180 +C380 +C70E +C61F +0E33 +1C03 +1807 +381E +7038 +6070 +E07E +C07E +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 17 18 2 0 +BITMAP +1E0300 +3F0700 +630E00 +060C00 +1C1C00 +1E3800 +063000 +C67000 +FCE180 +78C380 +01C780 +038F00 +031B00 +073300 +0E7F80 +0C7F80 +1C0600 +180600 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 1 -5 +BITMAP +00E0 +00E0 +00E0 +0000 +0000 +00E0 +00E0 +00E0 +01C0 +0380 +0F00 +3E00 +7800 +F070 +E070 +E0E0 +F1E0 +7FC0 +3F00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 24 1 0 +BITMAP +01C0 +00E0 +0070 +0038 +0000 +001C +003C +007C +007C +00EE +01CE +01CE +038E +070E +070E +0E0E +0E0E +1FFE +3FFF +3807 +7007 +7007 +E007 +E007 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 24 1 0 +BITMAP +0001C0 +000380 +000700 +000E00 +000000 +001C00 +003C00 +007C00 +007C00 +00EE00 +01CE00 +01CE00 +038E00 +070E00 +070E00 +0E0E00 +0E0E00 +1FFE00 +3FFF00 +380700 +700700 +700700 +E00700 +E00700 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 24 1 0 +BITMAP +001C00 +003E00 +007700 +00E380 +000000 +001C00 +003C00 +007C00 +007C00 +00EE00 +01CE00 +01CE00 +038E00 +070E00 +070E00 +0E0E00 +0E0E00 +1FFE00 +3FFF00 +380700 +700700 +700700 +E00700 +E00700 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 23 1 0 +BITMAP +007980 +00FF80 +00CF00 +000000 +001C00 +003C00 +007C00 +007C00 +00EE00 +01CE00 +01CE00 +038E00 +070E00 +070E00 +0E0E00 +0E0E00 +1FFE00 +3FFF00 +380700 +700700 +700700 +E00700 +E00700 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 23 1 0 +BITMAP +00E7 +00E7 +0000 +0000 +001C +003C +007C +007C +00EE +01CE +01CE +038E +070E +070E +0E0E +0E0E +1FFE +3FFF +3807 +7007 +7007 +E007 +E007 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 24 1 0 +BITMAP +001E +0033 +0033 +0033 +001E +001C +003C +007C +007C +00EE +01CE +01CE +038E +070E +070E +0E0E +0E0E +1FFE +3FFF +3807 +7007 +7007 +E007 +E007 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 24 0 +BBX 26 19 0 0 +BITMAP +001FFFC0 +003FFFC0 +007B8000 +00778000 +00E70000 +01C70000 +01C70000 +03870000 +070FFE00 +070FFE00 +0E0E0000 +0E0E0000 +1FFC0000 +3FFC0000 +381C0000 +701C0000 +70380000 +E03FFE00 +E03FFE00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 24 3 -5 +BITMAP +01FC +07FE +0F8F +1E07 +3807 +7800 +7000 +F000 +E000 +E000 +E000 +E000 +E000 +E00E +F01E +703C +78F8 +3FF0 +1FC0 +0700 +0380 +1980 +1F00 +0E00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 24 2 0 +BITMAP +0700 +0380 +01C0 +00E0 +0000 +0FFF +0FFF +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3FF8 +3FF8 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 24 2 0 +BITMAP +001C +0038 +0070 +00E0 +0000 +0FFF +0FFF +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3FF8 +3FF8 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 24 2 0 +BITMAP +0070 +00F8 +01DC +038E +0000 +0FFF +0FFF +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3FF8 +3FF8 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 23 2 0 +BITMAP +01CE +01CE +0000 +0000 +0FFF +0FFF +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3FF8 +3FF8 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 8 24 2 0 +BITMAP +38 +1C +0E +07 +00 +0E +0E +0E +0E +1C +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 10 24 2 0 +BITMAP +01C0 +0380 +0700 +0E00 +0000 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 10 24 2 0 +BITMAP +0E00 +1F00 +3B80 +71C0 +0000 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 10 23 2 0 +BITMAP +39C0 +39C0 +0000 +0000 +0E00 +0E00 +0E00 +0E00 +1C00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 18 19 2 0 +BITMAP +0FFC00 +0FFF00 +0E0F80 +0E0380 +1C01C0 +1C01C0 +1C01C0 +1C01C0 +FF81C0 +FF81C0 +3801C0 +380380 +700380 +700780 +700F00 +701E00 +E07C00 +FFF800 +FFE000 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 19 23 2 0 +BITMAP +007980 +00FF80 +00CF00 +000000 +0E00E0 +0E00E0 +0F00E0 +0F00E0 +1F81C0 +1D81C0 +1DC1C0 +19C1C0 +39C380 +38E380 +38E380 +386380 +707300 +707700 +703700 +703F00 +E01E00 +E01E00 +E00E00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 24 3 0 +BITMAP +01C000 +00E000 +007000 +003800 +000000 +01FC00 +07FE00 +0F8F00 +1E0700 +380780 +780380 +700380 +F00380 +E00380 +E00380 +E00380 +E00780 +E00700 +E00F00 +F01E00 +703C00 +78F800 +3FF000 +1FC000 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 24 3 0 +BITMAP +000E00 +001C00 +003800 +007000 +000000 +01FC00 +07FE00 +0F8F00 +1E0700 +380780 +780380 +700380 +F00380 +E00380 +E00380 +E00380 +E00780 +E00700 +E00F00 +F01E00 +703C00 +78F800 +3FF000 +1FC000 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 24 3 0 +BITMAP +007000 +00F800 +01DC00 +038E00 +000000 +01FC00 +07FE00 +0F8F00 +1E0700 +380780 +780380 +700380 +F00380 +E00380 +E00380 +E00380 +E00780 +E00700 +E00F00 +F01E00 +703C00 +78F800 +3FF000 +1FC000 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 23 3 0 +BITMAP +01E600 +03FE00 +033C00 +000000 +01FC00 +07FE00 +0F8F00 +1E0700 +380780 +780380 +700380 +F00380 +E00380 +E00380 +E00380 +E00780 +E00700 +E00F00 +F01E00 +703C00 +78F800 +3FF000 +1FC000 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 23 3 0 +BITMAP +01CE00 +01CE00 +000000 +000000 +01FC00 +07FE00 +0F8F00 +1E0700 +380780 +780380 +700380 +F00380 +E00380 +E00380 +E00380 +E00780 +E00700 +E00F00 +F01E00 +703C00 +78F800 +3FF000 +1FC000 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 13 12 2 1 +BITMAP +6018 +7038 +3870 +1CE0 +0FC0 +0780 +0F00 +1F80 +39C0 +70E0 +E070 +C030 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 20 19 1 0 +BITMAP +007F30 +01FFE0 +03E3C0 +0781E0 +0E03E0 +1E06E0 +1C0CE0 +3C18E0 +3830E0 +3860E0 +38C0E0 +3981E0 +3B01C0 +3E03C0 +3C0780 +380F00 +3C3E00 +6FFC00 +C7F000 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 18 24 3 0 +BITMAP +01C000 +00E000 +007000 +003800 +000000 +1C01C0 +1C01C0 +1C01C0 +1C01C0 +380380 +380380 +380380 +380380 +700700 +700700 +700700 +700F00 +E00E00 +E01E00 +E01C00 +F03C00 +78F800 +7FF000 +1FC000 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 18 24 3 0 +BITMAP +000E00 +001C00 +003800 +007000 +000000 +1C01C0 +1C01C0 +1C01C0 +1C01C0 +380380 +380380 +380380 +380380 +700700 +700700 +700700 +700F00 +E00E00 +E01E00 +E01C00 +F03C00 +78F800 +7FF000 +1FC000 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 18 24 3 0 +BITMAP +007000 +00F800 +01DC00 +038E00 +000000 +1C01C0 +1C01C0 +1C01C0 +1C01C0 +380380 +380380 +380380 +380380 +700700 +700700 +700700 +700F00 +E00E00 +E01E00 +E01C00 +F03C00 +78F800 +7FF000 +1FC000 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 19 0 +BBX 18 23 3 0 +BITMAP +01CE00 +01CE00 +000000 +000000 +1C01C0 +1C01C0 +1C01C0 +1C01C0 +380380 +380380 +380380 +380380 +700700 +700700 +700700 +700F00 +E00E00 +E01E00 +E01C00 +F03C00 +78F800 +7FF000 +1FC000 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 16 24 5 0 +BITMAP +0070 +00E0 +01C0 +0380 +0000 +E00F +E01E +E03C +7078 +7070 +70E0 +39C0 +39C0 +3B80 +3F00 +1F00 +1E00 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 16 19 2 0 +BITMAP +0E00 +0E00 +0E00 +0E00 +1FFC +1FFE +1C0F +1C07 +3C07 +3C07 +380E +381E +7FFC +7FF0 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +01E0 +07F0 +0770 +0E38 +0C38 +1C38 +1C70 +1CF0 +39C0 +39E0 +38E0 +3870 +7070 +7070 +7070 +70E0 +E1E0 +E7C0 +E700 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 2 0 +BITMAP +0E00 +0700 +0380 +01C0 +0000 +07E0 +1FF0 +3C70 +3870 +00F0 +07E0 +1FE0 +3CE0 +70E0 +E0E0 +E1C0 +E7C0 +FFC0 +79C0 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 2 0 +BITMAP +0070 +00E0 +01C0 +0380 +0000 +07E0 +1FF0 +3C70 +3870 +00F0 +07E0 +1FE0 +3CE0 +70E0 +E0E0 +E1C0 +E7C0 +FFC0 +79C0 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 2 0 +BITMAP +0380 +07C0 +0EE0 +1C70 +0000 +07E0 +1FF0 +3C70 +3870 +00F0 +07E0 +1FE0 +3CE0 +70E0 +E0E0 +E1C0 +E7C0 +FFC0 +79C0 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 18 2 0 +BITMAP +0F30 +1FF0 +19E0 +0000 +07E0 +1FF0 +3C70 +3870 +00F0 +07E0 +1FE0 +3CE0 +70E0 +E0E0 +E1C0 +E7C0 +FFC0 +79C0 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 18 2 0 +BITMAP +0E70 +0E70 +0000 +0000 +07E0 +1FF0 +3C70 +3870 +00F0 +07E0 +1FE0 +3CE0 +70E0 +E0E0 +E1C0 +E7C0 +FFC0 +79C0 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 2 0 +BITMAP +03C0 +0660 +0660 +0660 +03C0 +07E0 +1FF0 +3C70 +3870 +00F0 +07E0 +1FE0 +3CE0 +70E0 +E0E0 +E1C0 +E7C0 +FFC0 +79C0 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 22 0 +BBX 21 14 2 0 +BITMAP +07E3E0 +1FFFF0 +3C7E70 +387838 +00F038 +07F038 +1FFFF8 +3CFFF0 +70E000 +E0E000 +E1E070 +E7F1E0 +FF3FC0 +7C1F00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 -5 +BITMAP +03C0 +0FE0 +1E70 +3830 +7000 +7000 +E000 +E000 +E000 +E000 +E0E0 +71C0 +7F80 +3F00 +1C00 +0E00 +6600 +7C00 +3800 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +0E00 +0700 +0380 +01C0 +0000 +03E0 +0FF0 +1E70 +3838 +7038 +7038 +FFF8 +FFF0 +E000 +E000 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +0070 +00E0 +01C0 +0380 +0000 +03E0 +0FF0 +1E70 +3838 +7038 +7038 +FFF8 +FFF0 +E000 +E000 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +01C0 +03E0 +0770 +0E38 +0000 +03E0 +0FF0 +1E70 +3838 +7038 +7038 +FFF8 +FFF0 +E000 +E000 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 18 2 0 +BITMAP +0E70 +0E70 +0000 +0000 +03E0 +0FF0 +1E70 +3838 +7038 +7038 +FFF8 +FFF0 +E000 +E000 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 19 2 0 +BITMAP +E0 +70 +38 +1C +00 +1C +1C +1C +38 +38 +38 +38 +70 +70 +70 +70 +E0 +E0 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 9 19 2 0 +BITMAP +0380 +0700 +0E00 +1C00 +0000 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 9 19 2 0 +BITMAP +1C00 +3E00 +7700 +E380 +0000 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 9 18 2 0 +BITMAP +7380 +7380 +0000 +0000 +1C00 +1C00 +1C00 +3800 +3800 +3800 +3800 +7000 +7000 +7000 +7000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +1C00 +0F70 +03C0 +0FC0 +18E0 +03E0 +0FF0 +1E70 +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 18 2 0 +BITMAP +0798 +0FF8 +0CF0 +0000 +1DE0 +1FF0 +1E38 +3C38 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E0E0 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +1C00 +0E00 +0700 +0380 +0000 +03C0 +0FF0 +1E70 +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +0070 +00E0 +01C0 +0380 +0000 +03C0 +0FF0 +1E70 +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +01C0 +03E0 +0770 +0E38 +0000 +03C0 +0FF0 +1E70 +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 13 18 2 0 +BITMAP +0798 +0FF8 +0CF0 +0000 +03C0 +0FF0 +1E70 +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 13 18 2 0 +BITMAP +0E70 +0E70 +0000 +0000 +03C0 +0FF0 +1E70 +3838 +7038 +7038 +E038 +E038 +E070 +E070 +E0E0 +73C0 +7F80 +1E00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 10 12 4 1 +BITMAP +0E00 +0E00 +0E00 +0000 +0000 +FFC0 +FFC0 +0000 +0000 +3800 +3800 +3800 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 15 14 1 0 +BITMAP +01E6 +07FC +0F18 +1C3C +386C +30CC +718C +631C +6618 +6C38 +7870 +30E0 +7FC0 +CF00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 19 3 0 +BITMAP +1C00 +0E00 +0700 +0380 +0000 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E1E0 +E3E0 +E7C0 +7DC0 +39C0 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 19 3 0 +BITMAP +0070 +00E0 +01C0 +0380 +0000 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E1E0 +E3E0 +E7C0 +7DC0 +39C0 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 19 3 0 +BITMAP +0380 +07C0 +0EE0 +1C70 +0000 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E1E0 +E3E0 +E7C0 +7DC0 +39C0 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 18 3 0 +BITMAP +0E70 +0E70 +0000 +0000 +3838 +3838 +3838 +7070 +7070 +7070 +7070 +E0E0 +E0E0 +E1E0 +E3E0 +E7C0 +7DC0 +39C0 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 24 2 -5 +BITMAP +0070 +00E0 +01C0 +0380 +0000 +701C +701C +7038 +7038 +3870 +3870 +38E0 +38E0 +1DC0 +1DC0 +1F80 +0F00 +0F00 +0E00 +0E00 +1C00 +3800 +F800 +F000 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 15 24 1 -5 +BITMAP +0700 +0700 +0700 +0700 +0E00 +0EF0 +0FFC +0F9C +1E0E +1C0E +1C0E +380E +380E +381C +381C +3838 +7CF0 +7FE0 +7780 +7000 +E000 +E000 +E000 +E000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 556 0 +DWIDTH 15 0 +BBX 14 23 3 -5 +BITMAP +0E70 +0E70 +0000 +0000 +701C +701C +7038 +7038 +3870 +3870 +38E0 +38E0 +1DC0 +1DC0 +1F80 +0F00 +0F00 +0E00 +0E00 +1C00 +3800 +F800 +F000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 19 1 0 +BITMAP +007F00 +01FF80 +03E3C0 +0781C0 +0E01C0 +1E0000 +7FE000 +7FE000 +380000 +380000 +FFC000 +FFC000 +380000 +380380 +3C0780 +1C0F00 +1E3E00 +0FFC00 +07F000 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvO08.bdf b/src/3rdparty/fonts/helvO08.bdf new file mode 100644 index 0000000000..f715dabef3 --- /dev/null +++ b/src/3rdparty/fonts/helvO08.bdf @@ -0,0 +1,2601 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-O-Normal--8-80-75-75-P-47-ISO10646-1 +SIZE 8 75 75 +FONTBOUNDINGBOX 12 11 -1 -2 +COMMENT $XConsortium: helvO08.bdf,v 1.13 95/01/26 18:02:22 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 8 +POINT_SIZE 80 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 47 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 6 +X_HEIGHT 5 +FONT_ASCENT 8 +FONT_DESCENT 2 +FACE_NAME "Helvetica Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Oblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 6 0 0 +BITMAP +20 +20 +40 +40 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 3 0 +BBX 3 2 1 4 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +28 +7C +28 +F8 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 -1 +BITMAP +10 +30 +48 +60 +30 +90 +60 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 7 0 +BBX 6 6 1 0 +BITMAP +64 +A8 +D0 +2C +54 +98 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +28 +30 +58 +D0 +68 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 2 3 1 3 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 8 0 -2 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 8 -1 -2 +BITMAP +40 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 3 0 +BBX 3 3 1 4 +BITMAP +40 +E0 +C0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +20 +20 +F0 +40 +40 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 3 -1 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 6 0 0 +BITMAP +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +88 +88 +90 +60 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 3 6 1 0 +BITMAP +20 +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +18 +60 +80 +F0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +30 +10 +90 +60 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +10 +30 +50 +F8 +20 +20 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +78 +40 +70 +10 +90 +60 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +70 +90 +90 +60 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +48 +38 +90 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 5 0 0 +BITMAP +40 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 7 -1 -2 +BITMAP +20 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 3 4 1 0 +BITMAP +20 +40 +80 +40 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +70 +00 +E0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 3 4 1 0 +BITMAP +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +60 +10 +20 +40 +00 +80 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 9 0 +BBX 7 7 1 -1 +BITMAP +7C +C2 +BA +AA +BC +C0 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 -1 0 +BITMAP +08 +18 +24 +7C +44 +84 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +48 +70 +88 +88 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +44 +80 +80 +C8 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +44 +44 +84 +88 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +40 +78 +80 +80 +F0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 6 6 0 0 +BITMAP +7C +40 +70 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +44 +40 +9C +C8 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +44 +44 +7C +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 6 0 0 +BITMAP +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 6 0 0 +BITMAP +10 +10 +10 +A0 +A0 +40 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +48 +50 +60 +E0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 6 0 0 +BITMAP +40 +40 +40 +80 +80 +E0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 7 0 +BBX 6 6 0 0 +BITMAP +44 +44 +6C +AC +B4 +94 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +44 +64 +64 +98 +98 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +4C +84 +84 +C8 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +48 +48 +F0 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +38 +4C +84 +94 +D8 +78 +08 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +48 +48 +F0 +90 +90 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +44 +70 +18 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 4 0 +BBX 4 6 1 0 +BITMAP +F0 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +44 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +88 +90 +90 +A0 +A0 +40 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 8 0 +BBX 7 6 1 0 +BITMAP +92 +92 +B4 +54 +48 +48 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +44 +48 +30 +30 +48 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +90 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 -1 -2 +BITMAP +30 +20 +20 +40 +40 +40 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 6 0 0 +BITMAP +80 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 -1 -2 +BITMAP +30 +10 +10 +20 +20 +20 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 5 0 +BBX 3 3 1 3 +BITMAP +20 +60 +A0 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 1 -1 -1 +BITMAP +F8 +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 2 3 0 3 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +10 +70 +A0 +F0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 7 0 0 +BITMAP +20 +40 +60 +50 +90 +90 +E0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +30 +50 +80 +80 +60 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 7 0 0 +BITMAP +08 +08 +30 +50 +90 +A0 +60 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +30 +50 +E0 +80 +60 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 7 1 0 +BITMAP +30 +40 +E0 +40 +80 +80 +80 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 7 -1 -2 +BITMAP +18 +28 +48 +50 +30 +20 +C0 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 2 7 0 0 +BITMAP +40 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 3 9 -1 -2 +BITMAP +20 +00 +20 +20 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 5 7 0 0 +BITMAP +20 +20 +48 +50 +E0 +90 +90 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 3 7 0 0 +BITMAP +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +6C +54 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +30 +48 +88 +90 +60 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 7 -1 -2 +BITMAP +30 +28 +48 +50 +60 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 7 0 -2 +BITMAP +30 +50 +90 +A0 +60 +40 +40 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 5 0 0 +BITMAP +50 +60 +C0 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +30 +40 +60 +20 +C0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 6 0 0 +BITMAP +20 +F0 +40 +40 +80 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +50 +50 +90 +A0 +60 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +90 +90 +A0 +40 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +A8 +A8 +A8 +F0 +90 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +48 +50 +20 +50 +90 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 6 0 -1 +BITMAP +90 +90 +60 +40 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +70 +10 +20 +40 +E0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 3 0 +BBX 3 8 0 -2 +BITMAP +20 +40 +40 +C0 +40 +80 +80 +40 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 2 0 +BBX 2 7 0 -1 +BITMAP +40 +40 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 3 0 +BBX 4 8 -1 -2 +BITMAP +40 +20 +20 +30 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 2 1 2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 7 0 -2 +BITMAP +20 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +20 +60 +90 +80 +E0 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +E0 +40 +50 +A0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 1 +BITMAP +48 +30 +50 +60 +90 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +48 +F8 +50 +F8 +60 +40 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 2 0 +BBX 2 7 0 -1 +BITMAP +40 +40 +40 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 -2 +BITMAP +18 +20 +70 +50 +70 +20 +20 +C0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 1 1 5 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +30 +48 +B4 +A4 +B4 +48 +30 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 4 0 +BBX 4 5 0 2 +BITMAP +60 +30 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +50 +A0 +A0 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +F0 +10 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 1 1 2 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +30 +48 +B4 +B4 +AC +48 +30 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 1 1 5 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 3 0 +BBX 3 3 1 3 +BITMAP +60 +A0 +C0 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +20 +20 +70 +20 +00 +E0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 4 0 2 +BITMAP +60 +A0 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 4 0 2 +BITMAP +E0 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 1 5 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 7 0 -2 +BITMAP +50 +50 +90 +A0 +E0 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 5 0 +BBX 5 8 0 -2 +BITMAP +78 +C8 +D0 +D0 +50 +A0 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 2 1 2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 -1 -1 +BITMAP +40 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 4 0 2 +BITMAP +20 +E0 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 4 0 +BBX 4 5 0 2 +BITMAP +30 +50 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +50 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +22 +E4 +48 +54 +2C +5E +08 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +22 +E4 +48 +56 +2A +44 +0E +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +E2 +44 +28 +D4 +2C +5E +08 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 7 0 -2 +BITMAP +10 +00 +20 +40 +80 +80 +60 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 9 -1 0 +BITMAP +10 +08 +00 +08 +18 +24 +7C +44 +84 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 9 -1 0 +BITMAP +04 +08 +00 +08 +18 +24 +7C +44 +84 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 9 -1 0 +BITMAP +0C +14 +00 +08 +18 +24 +7C +44 +84 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 7 9 -1 0 +BITMAP +0A +14 +00 +08 +18 +24 +7C +44 +84 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 8 -1 0 +BITMAP +14 +00 +08 +18 +24 +7C +44 +84 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 9 -1 0 +BITMAP +08 +14 +08 +08 +18 +24 +7C +44 +84 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 8 0 +BBX 8 6 0 0 +BITMAP +1F +28 +2E +70 +90 +9E +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +38 +44 +40 +80 +88 +70 +20 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +7C +40 +78 +80 +80 +F0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +7C +40 +78 +80 +80 +F0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +7C +40 +78 +80 +80 +F0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +7C +40 +78 +80 +80 +F0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 0 0 +BITMAP +20 +40 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +A0 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +44 +64 +84 +88 +F0 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +14 +28 +00 +44 +64 +64 +98 +98 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +38 +4C +84 +84 +C8 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +38 +4C +84 +84 +C8 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +38 +4C +84 +84 +C8 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +14 +28 +00 +38 +4C +84 +84 +C8 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +38 +4C +84 +84 +C8 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 4 0 1 +BITMAP +48 +30 +60 +90 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +3C +4C +94 +A4 +C8 +F0 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +44 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +44 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +44 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +44 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 9 2 0 +BITMAP +10 +20 +00 +90 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +70 +48 +48 +F0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +70 +90 +90 +A0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +40 +20 +00 +60 +10 +70 +A0 +F0 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +10 +20 +00 +60 +10 +70 +A0 +F0 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +20 +50 +00 +60 +10 +70 +A0 +F0 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 8 0 0 +BITMAP +28 +50 +00 +60 +10 +70 +A0 +F0 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 7 0 0 +BITMAP +50 +00 +60 +10 +F0 +A0 +F0 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +20 +50 +00 +60 +10 +70 +A0 +F0 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +6C +14 +78 +A0 +F8 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 7 0 -2 +BITMAP +30 +50 +80 +A0 +C0 +40 +C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +20 +10 +00 +30 +50 +E0 +80 +60 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 8 0 0 +BITMAP +08 +10 +00 +30 +50 +E0 +80 +60 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 8 0 0 +BITMAP +10 +28 +00 +30 +50 +E0 +80 +60 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 7 0 0 +BITMAP +28 +00 +30 +50 +E0 +80 +60 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 8 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +20 +40 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 7 0 0 +BITMAP +A0 +00 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +D0 +60 +B0 +48 +88 +90 +60 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 6 8 0 0 +BITMAP +14 +28 +00 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +30 +48 +88 +90 +60 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 6 8 0 0 +BITMAP +04 +08 +00 +30 +48 +88 +90 +60 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +10 +28 +00 +30 +48 +88 +90 +60 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +28 +50 +00 +30 +48 +D8 +90 +60 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 7 0 0 +BITMAP +28 +00 +30 +48 +D8 +90 +60 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +20 +00 +F0 +00 +40 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +08 +38 +48 +88 +90 +E0 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +40 +20 +00 +50 +50 +90 +A0 +60 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +10 +20 +00 +50 +50 +90 +A0 +60 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +20 +50 +00 +50 +50 +90 +A0 +60 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 7 0 0 +BITMAP +50 +00 +50 +50 +90 +A0 +60 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 9 0 -1 +BITMAP +10 +20 +00 +90 +90 +60 +40 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 8 -1 -2 +BITMAP +20 +30 +28 +48 +50 +60 +80 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 8 0 -1 +BITMAP +50 +00 +90 +90 +60 +40 +40 +80 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 7 6 -1 0 +BITMAP +1C +72 +40 +E0 +64 +38 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvO10.bdf b/src/3rdparty/fonts/helvO10.bdf new file mode 100644 index 0000000000..b039e2ef56 --- /dev/null +++ b/src/3rdparty/fonts/helvO10.bdf @@ -0,0 +1,2869 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-O-Normal--10-100-75-75-P-57-ISO10646-1 +SIZE 10 75 75 +FONTBOUNDINGBOX 13 13 -2 -2 +COMMENT $XConsortium: helvO10.bdf,v 1.13 95/01/26 18:02:26 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 10 +POINT_SIZE 100 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 57 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 8 +X_HEIGHT 6 +FONT_ASCENT 10 +FONT_DESCENT 2 +FACE_NAME "Helvetica Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Oblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 8 1 0 +BITMAP +20 +20 +20 +40 +40 +40 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 4 0 +BBX 4 3 1 5 +BITMAP +50 +50 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +14 +14 +7E +28 +FC +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +08 +38 +54 +50 +38 +28 +A8 +70 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +72 +94 +A8 +D0 +16 +2A +52 +9C +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +18 +24 +24 +38 +52 +8C +88 +74 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 10 0 -2 +BITMAP +10 +20 +40 +40 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 10 -1 -2 +BITMAP +20 +10 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 4 3 1 5 +BITMAP +50 +60 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +20 +20 +F0 +40 +40 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 -1 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 0 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +64 +44 +84 +84 +88 +98 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +20 +E0 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +04 +08 +30 +40 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +04 +38 +08 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +0C +14 +28 +48 +FC +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +3C +20 +40 +78 +04 +84 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +40 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +F8 +08 +10 +20 +20 +40 +80 +80 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +44 +78 +48 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +44 +44 +3C +08 +88 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 6 0 0 +BITMAP +40 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 8 -1 -2 +BITMAP +20 +00 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +10 +60 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +78 +00 +F0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +40 +20 +10 +60 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +30 +48 +08 +30 +40 +40 +00 +80 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 11 0 +BBX 10 10 0 -2 +BITMAP +0F00 +3080 +6040 +4D40 +9240 +A240 +A680 +9B00 +4000 +3C00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 -1 0 +BITMAP +04 +0C +14 +14 +24 +7E +42 +82 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +3C +22 +42 +7C +44 +84 +8C +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +1C +22 +40 +40 +80 +82 +84 +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3C +22 +22 +42 +44 +84 +88 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +3E +20 +40 +7C +40 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 7 8 0 0 +BITMAP +3E +20 +40 +78 +40 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +1E +21 +40 +40 +8E +82 +84 +7C +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +21 +21 +42 +7E +42 +84 +84 +84 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 8 0 0 +BITMAP +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 6 8 -1 0 +BITMAP +04 +04 +08 +08 +08 +90 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +22 +24 +48 +70 +50 +88 +88 +84 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +20 +20 +40 +40 +40 +80 +80 +F0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +21 +23 +63 +55 +55 +9A +92 +92 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +21 +21 +52 +52 +52 +94 +8C +84 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +1E +21 +21 +42 +42 +84 +84 +78 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +3C +22 +42 +7C +40 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 9 0 -1 +BITMAP +1E +21 +21 +42 +42 +94 +8C +7C +02 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +3C +22 +42 +7C +44 +84 +88 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +1C +22 +40 +38 +04 +84 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 1 0 +BITMAP +F8 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +21 +21 +42 +42 +42 +84 +84 +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +84 +84 +88 +88 +90 +90 +A0 +40 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +8880 +8880 +9900 +9900 +AA00 +6600 +4400 +4400 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 8 8 -1 0 +BITMAP +21 +22 +14 +18 +18 +28 +44 +84 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 1 0 +BITMAP +82 +84 +48 +50 +20 +40 +40 +40 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +3E +04 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 6 10 -1 -2 +BITMAP +1C +10 +20 +20 +20 +40 +40 +40 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 1 0 +BITMAP +80 +80 +80 +80 +40 +40 +40 +40 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 6 10 -2 -2 +BITMAP +1C +04 +08 +08 +08 +10 +10 +10 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 6 0 +BBX 4 3 1 4 +BITMAP +20 +60 +90 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 1 -1 -2 +BITMAP +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +70 +08 +78 +90 +90 +68 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +48 +48 +88 +90 +E0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +80 +80 +90 +60 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 6 8 0 0 +BITMAP +04 +04 +38 +48 +88 +90 +90 +70 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +38 +48 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 8 1 0 +BITMAP +30 +40 +E0 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 6 8 -1 -2 +BITMAP +1C +24 +44 +48 +48 +38 +90 +60 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +20 +58 +64 +44 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +20 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 4 10 -1 -2 +BITMAP +10 +00 +20 +20 +20 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +20 +20 +48 +50 +60 +A0 +90 +90 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 8 0 +BBX 8 6 0 0 +BITMAP +76 +49 +49 +92 +92 +92 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +58 +64 +44 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 6 8 -1 -2 +BITMAP +38 +24 +24 +44 +48 +70 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 -2 +BITMAP +38 +48 +88 +90 +90 +70 +20 +20 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 5 6 0 0 +BITMAP +58 +60 +40 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +30 +48 +20 +10 +90 +60 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 8 1 0 +BITMAP +20 +20 +F0 +40 +40 +80 +80 +C0 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +48 +48 +88 +90 +90 +70 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +88 +90 +90 +A0 +60 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 6 1 0 +BITMAP +92 +92 +92 +B4 +48 +48 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +24 +28 +10 +30 +48 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 8 0 -2 +BITMAP +48 +48 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +78 +08 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 10 0 -2 +BITMAP +10 +20 +40 +40 +80 +40 +40 +80 +80 +40 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 4 10 -1 -2 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 10 -1 -2 +BITMAP +20 +10 +10 +20 +10 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +64 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 8 0 -2 +BITMAP +20 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 8 1 -1 +BITMAP +08 +38 +54 +90 +A0 +A8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +18 +24 +20 +78 +20 +20 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +24 +38 +48 +48 +70 +90 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 7 8 0 0 +BITMAP +42 +44 +28 +30 +78 +20 +F0 +40 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 3 10 0 -2 +BITMAP +20 +20 +40 +40 +00 +00 +40 +40 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +18 +24 +30 +58 +48 +48 +68 +30 +90 +60 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 1 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +42 +99 +A5 +A1 +9D +42 +3C +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 5 5 0 3 +BITMAP +38 +08 +50 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 4 1 1 +BITMAP +24 +48 +90 +48 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +3C +42 +B9 +A5 +B9 +A5 +42 +3C +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 1 7 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 4 0 +BBX 3 3 1 4 +BITMAP +60 +A0 +C0 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +78 +20 +20 +00 +F0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 5 0 3 +BITMAP +60 +10 +60 +80 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 5 0 3 +BITMAP +E0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 1 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 6 8 -1 -2 +BITMAP +24 +24 +44 +48 +48 +B8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 6 0 +BBX 7 10 0 -2 +BITMAP +3E +74 +F4 +E8 +E8 +50 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 2 1 3 +BITMAP +80 +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 3 -1 -2 +BITMAP +40 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 5 1 3 +BITMAP +40 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 5 5 0 3 +BITMAP +38 +48 +70 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 4 1 1 +BITMAP +48 +24 +48 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 9 2 -1 +BITMAP +42 +C4 +48 +88 +92 +26 +2A +4F +84 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 9 2 -1 +BITMAP +42 +C4 +48 +88 +96 +21 +26 +48 +8E +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 9 9 1 -1 +BITMAP +E100 +2200 +4400 +2400 +C900 +1300 +1500 +2780 +4200 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +08 +00 +10 +10 +60 +80 +90 +60 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 -1 0 +BITMAP +08 +04 +00 +04 +0C +14 +14 +24 +7E +42 +82 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 -1 0 +BITMAP +02 +04 +00 +04 +0C +14 +14 +24 +7E +42 +82 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 -1 0 +BITMAP +04 +0A +00 +04 +0C +14 +14 +24 +7E +42 +82 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 8 11 -1 0 +BITMAP +0D +12 +00 +04 +0C +14 +14 +24 +7E +42 +82 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 10 -1 0 +BITMAP +0A +00 +04 +0C +14 +14 +24 +7E +42 +82 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 -1 0 +BITMAP +04 +0A +04 +04 +0C +14 +14 +24 +7E +42 +82 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 11 8 -1 0 +BITMAP +07E0 +0A00 +1400 +17C0 +2400 +7C00 +4800 +8F80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +1C +22 +40 +40 +80 +82 +84 +78 +20 +C0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +08 +00 +3E +20 +40 +7C +40 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +04 +08 +00 +3E +20 +40 +7C +40 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +14 +00 +3E +20 +40 +7C +40 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +14 +00 +3E +20 +40 +7C +40 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +40 +20 +00 +20 +20 +20 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 11 0 0 +BITMAP +08 +10 +00 +20 +20 +20 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 0 0 +BITMAP +20 +50 +00 +20 +20 +20 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +50 +00 +20 +20 +20 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3C +22 +22 +F2 +44 +84 +88 +F0 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +0A +14 +00 +21 +21 +62 +52 +52 +94 +8C +84 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +08 +04 +00 +1E +21 +42 +42 +42 +84 +84 +78 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +02 +04 +00 +1E +21 +42 +42 +42 +84 +84 +78 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +04 +0A +00 +1E +21 +42 +42 +42 +84 +84 +78 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +05 +0A +00 +1E +21 +42 +42 +42 +84 +84 +78 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +0A +00 +1E +21 +42 +42 +42 +84 +84 +78 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +44 +28 +30 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 10 8 -1 0 +BITMAP +0F40 +1180 +1280 +2500 +2900 +5200 +6200 +BC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +08 +04 +00 +21 +21 +42 +42 +82 +84 +84 +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +02 +04 +00 +21 +21 +42 +42 +82 +84 +84 +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 11 0 0 +BITMAP +04 +0A +00 +21 +21 +42 +42 +82 +84 +84 +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +09 +00 +21 +21 +42 +42 +82 +84 +84 +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 1 0 +BITMAP +08 +10 +00 +82 +84 +48 +50 +20 +40 +40 +40 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +20 +20 +78 +44 +44 +F8 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +18 +24 +44 +58 +48 +88 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +08 +78 +90 +90 +68 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +90 +90 +68 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +90 +90 +68 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +70 +08 +78 +90 +90 +68 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +08 +78 +90 +90 +68 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +70 +08 +78 +90 +90 +68 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 8 0 +BBX 8 6 0 0 +BITMAP +77 +09 +7E +90 +92 +6C +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 6 8 -1 -2 +BITMAP +18 +24 +40 +40 +48 +30 +20 +C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +20 +10 +00 +38 +48 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +08 +10 +00 +38 +48 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +10 +28 +00 +38 +48 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +28 +00 +38 +48 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 0 0 +BITMAP +20 +40 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +A0 +00 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +64 +38 +48 +3C +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +14 +28 +00 +58 +64 +44 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +10 +00 +38 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +10 +00 +38 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +28 +00 +38 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +14 +28 +00 +38 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +00 +38 +44 +44 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +20 +00 +F0 +00 +40 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 8 6 -1 0 +BITMAP +1D +26 +2A +54 +64 +B8 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +20 +10 +00 +48 +48 +88 +90 +90 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +08 +10 +00 +48 +48 +88 +90 +90 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +10 +28 +00 +48 +48 +88 +90 +90 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +28 +00 +48 +48 +88 +90 +90 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 11 0 -2 +BITMAP +08 +10 +00 +48 +48 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 6 10 -1 -2 +BITMAP +10 +10 +38 +24 +24 +44 +48 +70 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 5 10 0 -2 +BITMAP +28 +00 +48 +48 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 8 -1 0 +BITMAP +0E +11 +78 +20 +F0 +41 +42 +3C +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvO12.bdf b/src/3rdparty/fonts/helvO12.bdf new file mode 100644 index 0000000000..74ebe1998e --- /dev/null +++ b/src/3rdparty/fonts/helvO12.bdf @@ -0,0 +1,3042 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-O-Normal--12-120-75-75-P-67-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 16 15 -3 -3 +COMMENT $XConsortium: helvO12.bdf,v 1.14 95/01/26 18:02:30 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 67 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Oblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 1 0 +BITMAP +10 +10 +20 +20 +20 +40 +40 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 5 0 +BBX 4 3 2 6 +BITMAP +50 +50 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 8 1 0 +BITMAP +0A +14 +7E +28 +FC +50 +A0 +A0 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 1 -1 +BITMAP +04 +1C +2A +28 +18 +14 +A4 +A8 +70 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 10 9 2 0 +BITMAP +3040 +4880 +9100 +6200 +0C00 +1180 +2240 +4480 +8300 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +0C +12 +12 +0C +38 +4A +86 +8C +72 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 3 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 12 1 -3 +BITMAP +10 +20 +20 +40 +40 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +20 +10 +10 +10 +10 +10 +10 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 4 3 2 6 +BITMAP +50 +60 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +10 +10 +FC +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 0 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 1 2 3 +BITMAP +FC +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +22 +22 +44 +44 +88 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 4 9 3 0 +BITMAP +10 +F0 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +22 +02 +0C +30 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +22 +02 +1C +04 +04 +04 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +0C +14 +24 +28 +48 +88 +FC +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1E +20 +40 +78 +04 +04 +04 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +22 +40 +B8 +C4 +84 +84 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 2 0 +BITMAP +FC +04 +08 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +22 +22 +3C +44 +84 +84 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 1 0 +BITMAP +1C +22 +42 +42 +3E +04 +04 +88 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 6 1 0 +BITMAP +20 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 8 0 -2 +BITMAP +10 +00 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +0E +30 +C0 +30 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 3 1 2 +BITMAP +7C +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 7 5 1 1 +BITMAP +60 +18 +06 +18 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 2 0 +BITMAP +38 +44 +84 +08 +30 +40 +40 +00 +80 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 12 0 +BBX 10 10 2 -1 +BITMAP +0700 +1880 +6040 +4D40 +9240 +A240 +A680 +9B00 +4000 +3C00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +06 +0A +12 +12 +22 +3E +42 +82 +82 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +11 +21 +22 +7C +42 +42 +84 +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +21 +40 +40 +80 +80 +82 +84 +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1080 +2080 +2080 +4100 +4100 +4200 +8400 +F800 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F80 +1000 +2000 +2000 +7E00 +4000 +4000 +8000 +FC00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 9 9 1 0 +BITMAP +1F80 +1000 +2000 +2000 +7C00 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +0E +31 +40 +40 +8E +82 +82 +84 +7C +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +1040 +1040 +2080 +2080 +7F00 +4100 +4100 +8200 +8200 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +01 +01 +02 +02 +02 +04 +84 +88 +70 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +11 +12 +24 +28 +70 +48 +44 +84 +82 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 12 0 +BBX 12 9 1 0 +BITMAP +1010 +1030 +2860 +28A0 +4940 +4A40 +4C40 +8880 +8880 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 9 1 0 +BITMAP +1040 +1040 +2880 +2880 +4900 +4500 +4500 +8200 +8200 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +1080 +2080 +4080 +4100 +8100 +8200 +8400 +7800 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +11 +21 +22 +7C +40 +40 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +0F00 +1080 +2080 +4080 +4100 +8900 +8600 +8600 +7900 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +11 +21 +22 +7C +42 +42 +84 +84 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 9 1 0 +BITMAP +1E +21 +20 +18 +04 +02 +82 +84 +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 2 0 +BITMAP +FE +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +2080 +2080 +4100 +4100 +4100 +8200 +8200 +8400 +7800 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 3 0 +BITMAP +84 +84 +88 +88 +90 +90 +A0 +A0 +C0 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 10 9 2 0 +BITMAP +8840 +8840 +8880 +9880 +9900 +A900 +AA00 +AA00 +CC00 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 9 1 0 +BITMAP +1040 +1080 +0900 +0A00 +0C00 +1400 +2400 +4200 +8200 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 3 0 +BITMAP +84 +84 +88 +50 +60 +40 +40 +80 +80 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F80 +0100 +0200 +0400 +0800 +1000 +2000 +4000 +FE00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 7 12 -1 -3 +BITMAP +0E +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 9 2 0 +BITMAP +80 +80 +80 +80 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 7 12 -2 -3 +BITMAP +0E +02 +02 +04 +04 +08 +08 +10 +10 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 6 0 +BBX 4 3 2 5 +BITMAP +20 +50 +90 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 -1 -3 +BITMAP +FE +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 2 6 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +1C +22 +02 +3C +44 +88 +74 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +10 +2C +32 +62 +44 +44 +C8 +B0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +18 +24 +40 +40 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +01 +01 +1A +26 +44 +44 +88 +98 +68 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +18 +24 +44 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 6 9 0 0 +BITMAP +0C +10 +78 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 -1 -3 +BITMAP +0D +13 +22 +22 +44 +4C +34 +08 +88 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +10 +2C +32 +42 +44 +44 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +10 +00 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 7 12 -3 -3 +BITMAP +02 +00 +04 +04 +08 +08 +08 +10 +10 +20 +20 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +10 +24 +28 +70 +50 +48 +88 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 9 7 0 0 +BITMAP +2900 +3680 +4480 +4900 +4900 +9200 +9200 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +2C +32 +42 +44 +44 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +1C +22 +42 +44 +84 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 10 -1 -3 +BITMAP +16 +19 +31 +22 +22 +64 +58 +40 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 -3 +BITMAP +1A +26 +44 +44 +8C +98 +68 +08 +10 +10 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 6 7 0 0 +BITMAP +2C +30 +60 +40 +40 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +18 +24 +40 +30 +08 +88 +70 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 9 0 0 +BITMAP +10 +10 +78 +20 +20 +40 +40 +80 +C0 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +22 +22 +44 +44 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +88 +88 +90 +90 +A0 +A0 +C0 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 7 1 0 +BITMAP +8880 +8880 +9900 +AA00 +AA00 +CC00 +8800 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 7 0 0 +BITMAP +22 +24 +28 +10 +28 +48 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 8 10 -2 -3 +BITMAP +11 +11 +12 +12 +14 +14 +18 +10 +20 +C0 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +04 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 5 0 +BBX 5 12 1 -3 +BITMAP +18 +20 +20 +20 +40 +80 +40 +40 +80 +80 +80 +60 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 4 0 +BBX 5 12 0 -3 +BITMAP +08 +08 +10 +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 5 0 +BBX 5 12 0 -3 +BITMAP +30 +08 +08 +10 +10 +08 +10 +10 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 1 3 +BITMAP +64 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 9 0 -3 +BITMAP +10 +00 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 9 1 -1 +BITMAP +04 +1C +2A +48 +90 +90 +A4 +78 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 9 0 0 +BITMAP +0E +12 +10 +20 +7C +20 +20 +44 +B8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 6 0 1 +BITMAP +22 +1C +24 +48 +70 +88 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 9 1 0 +BITMAP +11 +12 +14 +7E +10 +FC +20 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 4 0 +BBX 4 11 1 -2 +BITMAP +10 +10 +20 +20 +20 +00 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 12 0 -3 +BITMAP +1C +32 +22 +30 +48 +44 +44 +24 +18 +88 +98 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 3 8 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4C40 +5240 +A040 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 5 5 2 4 +BITMAP +38 +08 +50 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 4 1 2 +BITMAP +24 +48 +90 +48 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 10 9 1 0 +BITMAP +1F00 +2080 +4E40 +4A40 +9C40 +9480 +9280 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 3 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 1 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +08 +08 +7E +10 +10 +00 +FC +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 1 3 +BITMAP +60 +90 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 3 +BITMAP +70 +10 +20 +90 +60 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 9 10 -1 -3 +BITMAP +0880 +0880 +1100 +1100 +2200 +2600 +5A00 +4000 +8000 +8000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 8 0 +BBX 8 12 1 -3 +BITMAP +3F +7A +F4 +F4 +68 +28 +28 +50 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 4 -1 -3 +BITMAP +20 +10 +90 +60 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 5 2 3 +BITMAP +40 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 5 5 2 4 +BITMAP +38 +48 +70 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 4 1 2 +BITMAP +48 +24 +48 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +21 +62 +24 +48 +52 +16 +2A +5F +84 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2100 +6200 +2400 +4800 +5300 +1480 +2100 +4200 +8700 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7080 +1100 +2200 +9400 +6900 +0B00 +1500 +2F80 +4200 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 6 9 0 -3 +BITMAP +04 +00 +08 +08 +30 +40 +84 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +04 +02 +00 +02 +06 +0A +12 +22 +3E +42 +82 +82 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 12 1 0 +BITMAP +01 +02 +00 +02 +06 +0A +12 +22 +3E +42 +82 +82 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 12 1 0 +BITMAP +02 +05 +00 +02 +06 +0A +12 +22 +3E +42 +82 +82 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0280 +0500 +0000 +0200 +0600 +0A00 +1200 +2200 +3E00 +4200 +8200 +8200 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +05 +00 +02 +06 +0A +12 +22 +3E +42 +82 +82 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 12 1 0 +BITMAP +06 +09 +06 +02 +06 +0A +12 +22 +3E +42 +82 +82 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 12 9 1 0 +BITMAP +03F0 +0500 +0A00 +1200 +27C0 +3C00 +4400 +8800 +8F80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 12 0 -3 +BITMAP +0F00 +1080 +2000 +2000 +4000 +4000 +4100 +4200 +3C00 +1000 +9000 +6000 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +08 +04 +00 +1F +10 +20 +20 +7E +40 +40 +80 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +02 +04 +00 +1F +10 +20 +20 +7E +40 +40 +80 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 12 1 0 +BITMAP +04 +0A +00 +1F +10 +20 +20 +7E +40 +40 +80 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0A +00 +1F +10 +20 +20 +7E +40 +40 +80 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 12 1 0 +BITMAP +20 +10 +00 +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 1 0 +BITMAP +08 +10 +00 +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 12 1 0 +BITMAP +10 +28 +00 +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 1 0 +BITMAP +28 +00 +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 9 1 0 +BITMAP +1F00 +1080 +2080 +2080 +F100 +4100 +4200 +8400 +F800 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 12 1 0 +BITMAP +0280 +0500 +0000 +1040 +1040 +2880 +2880 +4900 +4500 +4500 +8200 +8200 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0800 +0400 +0000 +0F00 +1080 +2080 +4080 +4100 +8100 +8200 +8400 +7800 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0100 +0200 +0000 +0F00 +1080 +2080 +4080 +4100 +8100 +8200 +8400 +7800 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0200 +0500 +0000 +0F00 +1080 +2080 +4080 +4100 +8100 +8200 +8400 +7800 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0280 +0500 +0000 +0F00 +1080 +2080 +4080 +4100 +8100 +8200 +8400 +7800 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0500 +0000 +0F00 +1080 +2080 +4080 +4100 +8100 +8200 +8400 +7800 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +44 +28 +30 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 11 9 1 0 +BITMAP +07A0 +08C0 +1140 +2240 +2480 +4880 +5100 +6200 +BC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0800 +0400 +0000 +2080 +2080 +4080 +4100 +4100 +8200 +8200 +8400 +7800 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0200 +0400 +0000 +2080 +2080 +4080 +4100 +4100 +8200 +8200 +8400 +7800 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 12 1 0 +BITMAP +0400 +0A00 +0000 +2080 +2080 +4080 +4100 +4100 +8200 +8200 +8400 +7800 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0A00 +0000 +2080 +2080 +4080 +4100 +4100 +8200 +8200 +8400 +7800 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 3 0 +BITMAP +08 +10 +00 +84 +84 +88 +50 +60 +40 +40 +80 +80 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +10 +10 +3C +22 +42 +44 +78 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 8 9 0 0 +BITMAP +0E +11 +11 +26 +2C +42 +42 +84 +B8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +10 +08 +00 +1C +22 +02 +3C +44 +88 +74 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +04 +08 +00 +1C +22 +02 +3C +44 +88 +74 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +08 +14 +00 +1C +22 +02 +3C +44 +88 +74 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +0A +14 +00 +1C +22 +02 +3C +44 +88 +74 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +14 +00 +1C +22 +02 +3C +44 +88 +74 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +0C +12 +0C +1C +22 +02 +3C +44 +88 +74 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 11 7 0 0 +BITMAP +1DC0 +2220 +0220 +3FC0 +4400 +8C40 +7380 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 7 10 -1 -3 +BITMAP +0C +12 +20 +20 +40 +44 +38 +10 +90 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +10 +08 +00 +1C +24 +44 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +04 +08 +00 +1C +24 +44 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +08 +14 +00 +1C +24 +44 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +14 +00 +1C +24 +44 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +40 +20 +00 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +10 +20 +00 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 10 0 0 +BITMAP +20 +50 +00 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +50 +00 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +70 +1E +34 +02 +1E +22 +42 +44 +84 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +0A +14 +00 +2C +32 +42 +44 +44 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +10 +08 +00 +1C +22 +42 +44 +84 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +04 +08 +00 +1C +22 +42 +44 +84 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +08 +14 +00 +1C +22 +42 +44 +84 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +0A +14 +00 +1C +22 +42 +44 +84 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +14 +00 +1C +22 +42 +44 +84 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +10 +00 +FC +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 9 7 -1 0 +BITMAP +0E80 +1300 +2500 +2A00 +5200 +6400 +B800 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +10 +08 +00 +22 +22 +44 +44 +88 +98 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +04 +08 +00 +22 +22 +44 +44 +88 +98 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +08 +14 +00 +22 +22 +44 +44 +88 +98 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +14 +00 +22 +22 +44 +44 +88 +98 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 8 13 -2 -3 +BITMAP +02 +04 +00 +11 +11 +12 +12 +14 +14 +18 +10 +20 +C0 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 8 12 -1 -3 +BITMAP +08 +08 +16 +19 +31 +22 +22 +64 +58 +40 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 8 12 -1 -3 +BITMAP +0A +00 +11 +11 +12 +12 +14 +14 +18 +10 +20 +C0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 9 9 0 0 +BITMAP +0F00 +1080 +2000 +7C00 +4000 +F800 +4100 +4200 +3C00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvO14.bdf b/src/3rdparty/fonts/helvO14.bdf new file mode 100644 index 0000000000..d32bd9604f --- /dev/null +++ b/src/3rdparty/fonts/helvO14.bdf @@ -0,0 +1,3310 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-O-Normal--14-140-75-75-P-78-ISO10646-1 +SIZE 14 75 75 +FONTBOUNDINGBOX 20 17 -3 -3 +COMMENT $XConsortium: helvO14.bdf,v 1.14 95/01/26 18:02:35 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 14 +POINT_SIZE 140 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 78 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 11 +X_HEIGHT 8 +FONT_ASCENT 13 +FONT_DESCENT 3 +FACE_NAME "Helvetica Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Oblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 11 1 0 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +00 +80 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 5 0 +BBX 4 3 2 8 +BITMAP +50 +50 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0900 +0900 +1200 +7F80 +1200 +2400 +FE00 +2400 +4800 +4800 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 13 0 -2 +BITMAP +04 +1E +25 +25 +28 +18 +0C +12 +92 +94 +78 +20 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +7080 +8900 +8A00 +7400 +0400 +0800 +1700 +2880 +4880 +8700 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +1C +24 +24 +18 +31 +49 +86 +84 +8A +71 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 3 8 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 14 1 -3 +BITMAP +08 +10 +20 +20 +40 +40 +80 +80 +80 +80 +80 +80 +40 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 14 0 -3 +BITMAP +10 +10 +08 +08 +08 +08 +08 +08 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 8 0 +BBX 6 5 3 6 +BITMAP +10 +54 +78 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +08 +08 +10 +FE +10 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +40 +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 1 1 4 +BITMAP +FE +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 2 1 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 11 0 0 +BITMAP +08 +08 +10 +10 +20 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 9 10 0 0 +BITMAP +0F00 +1080 +2100 +2100 +4200 +4200 +4200 +8400 +8400 +7800 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 4 10 3 0 +BITMAP +10 +F0 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +1E +21 +21 +02 +0C +10 +60 +80 +80 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +1E +21 +01 +02 +1C +02 +02 +84 +84 +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +06 +0A +14 +24 +48 +88 +FC +10 +20 +20 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +1F +10 +20 +3C +02 +02 +02 +84 +84 +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +0F +11 +20 +20 +5C +62 +42 +82 +84 +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 2 0 +BITMAP +7E +04 +08 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +1E +21 +21 +12 +3C +42 +82 +82 +84 +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +0E +11 +21 +21 +22 +1E +02 +84 +84 +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 8 1 0 +BITMAP +20 +20 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 10 0 -2 +BITMAP +10 +10 +00 +00 +00 +00 +40 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 5 1 2 +BITMAP +06 +38 +C0 +30 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 3 1 3 +BITMAP +7E +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 5 1 2 +BITMAP +60 +18 +06 +38 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 2 0 +BITMAP +38 +44 +84 +84 +08 +10 +20 +40 +00 +80 +80 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 13 0 +BBX 12 12 1 -1 +BITMAP +07C0 +1820 +2010 +4750 +4890 +9120 +9120 +9340 +9D80 +8000 +4000 +3F00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +0200 +0500 +0900 +0900 +1100 +1100 +2100 +7F80 +4080 +8080 +8080 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1F00 +1080 +2080 +2080 +2100 +7E00 +4100 +4100 +8100 +8200 +FC00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +0F00 +1080 +2080 +4000 +4000 +8000 +8000 +8100 +8200 +C600 +3800 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1E00 +1100 +2100 +2080 +2080 +4080 +4100 +4100 +8200 +8C00 +F000 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 11 1 0 +BITMAP +1FC0 +1000 +1000 +2000 +2000 +7E00 +4000 +4000 +8000 +8000 +FE00 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 11 1 0 +BITMAP +1FC0 +1000 +2000 +2000 +2000 +7E00 +4000 +4000 +8000 +8000 +8000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +0780 +1840 +2040 +4000 +4000 +8780 +8080 +8100 +8100 +4700 +3900 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 11 1 0 +BITMAP +1020 +1020 +2040 +2040 +2040 +7F80 +4080 +4080 +8100 +8100 +8100 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 11 1 0 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +0080 +0080 +0100 +0100 +0100 +0200 +0200 +8200 +8400 +8400 +7800 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1080 +1100 +2200 +2400 +2800 +7800 +4800 +4400 +8200 +8200 +8100 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 14 0 +BBX 14 11 1 0 +BITMAP +180C +1814 +2828 +2828 +2848 +4890 +4890 +4510 +8520 +8620 +8420 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 11 1 0 +BITMAP +1820 +1820 +2840 +2440 +2440 +4480 +4480 +4480 +8500 +8300 +8300 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +0700 +1880 +20C0 +4040 +4040 +8080 +8080 +8180 +8200 +C600 +3800 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 9 11 1 0 +BITMAP +1F00 +1080 +2080 +2080 +2100 +7E00 +4000 +4000 +8000 +8000 +8000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +0700 +1880 +20C0 +4040 +4040 +8080 +8880 +8580 +8200 +C700 +3880 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1F00 +1080 +2080 +2080 +2100 +7E00 +4100 +4100 +8100 +8200 +8200 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +0700 +1880 +2080 +2000 +1800 +0600 +0100 +0100 +8200 +4600 +3800 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 9 11 2 0 +BITMAP +FF80 +0800 +1000 +1000 +1000 +2000 +2000 +2000 +4000 +4000 +4000 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 11 1 0 +BITMAP +1020 +1020 +2040 +2040 +2040 +4080 +4080 +4080 +8100 +C300 +7E00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 8 11 4 0 +BITMAP +81 +81 +82 +82 +84 +84 +88 +90 +90 +60 +40 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 14 0 +BBX 12 11 3 0 +BITMAP +8410 +8410 +8C20 +8C20 +9440 +9440 +A480 +A480 +C300 +C300 +8200 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 11 11 0 0 +BITMAP +1020 +1040 +0880 +0900 +0600 +0400 +0A00 +1200 +2100 +4100 +8080 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 9 11 2 0 +BITMAP +8080 +8100 +8200 +4200 +4400 +4800 +3000 +2000 +2000 +4000 +4000 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 10 11 0 0 +BITMAP +1FC0 +0040 +0080 +0100 +0200 +0400 +0800 +1000 +2000 +4000 +FF00 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 14 0 -3 +BITMAP +0E +08 +10 +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 3 11 2 0 +BITMAP +80 +80 +80 +40 +40 +40 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 14 -1 -3 +BITMAP +0E +02 +04 +04 +04 +08 +08 +08 +10 +10 +10 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 7 0 +BBX 6 5 2 6 +BITMAP +08 +14 +24 +44 +84 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 1 -1 -3 +BITMAP +FF +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 2 8 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +1C +22 +02 +3C +44 +88 +98 +EC +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +10 +20 +2C +32 +42 +42 +42 +84 +C4 +B8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +1C +22 +40 +40 +80 +84 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 9 11 0 0 +BITMAP +0080 +0080 +0100 +1D00 +2500 +4200 +4200 +8200 +8400 +8C00 +7400 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +1C +22 +42 +7E +80 +80 +8C +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 7 11 0 0 +BITMAP +0E +10 +20 +F8 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 9 11 -1 -3 +BITMAP +0E80 +1180 +2100 +2100 +4100 +4200 +4600 +3A00 +0400 +8400 +7800 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +10 +20 +2C +32 +42 +44 +44 +84 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +10 +10 +00 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 7 14 -3 -3 +BITMAP +02 +02 +00 +04 +04 +08 +08 +08 +10 +10 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +10 +20 +22 +24 +58 +60 +50 +90 +88 +84 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 4 11 0 0 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 11 8 0 0 +BITMAP +2CC0 +3320 +4420 +4440 +4440 +8880 +8880 +8880 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +2C +32 +42 +44 +44 +84 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +1C +22 +42 +42 +84 +84 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 -1 -3 +BITMAP +16 +19 +21 +21 +21 +42 +62 +5C +40 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 0 -3 +BITMAP +1D +23 +42 +42 +82 +84 +8C +74 +04 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 6 8 0 0 +BITMAP +2C +30 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +1C +22 +40 +38 +04 +84 +88 +70 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 10 0 0 +BITMAP +10 +10 +78 +20 +40 +40 +40 +80 +80 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +22 +22 +42 +44 +44 +84 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +84 +88 +88 +90 +90 +A0 +A0 +C0 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +8880 +8880 +9900 +9900 +AA00 +AA00 +CC00 +8800 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 8 8 -1 0 +BITMAP +21 +12 +14 +08 +18 +24 +44 +82 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -3 +BITMAP +42 +44 +44 +48 +48 +50 +70 +20 +40 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 8 8 -1 0 +BITMAP +3F +01 +06 +08 +30 +40 +80 +FC +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 5 0 +BBX 6 14 1 -3 +BITMAP +0C +10 +20 +20 +20 +40 +80 +40 +40 +40 +80 +80 +80 +60 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 5 14 0 -3 +BITMAP +08 +08 +10 +10 +10 +20 +20 +20 +40 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 5 0 +BBX 6 14 -1 -3 +BITMAP +18 +04 +04 +08 +08 +08 +04 +08 +10 +10 +10 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 3 2 3 +BITMAP +64 +B4 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 11 0 -3 +BITMAP +10 +10 +00 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 1 -1 +BITMAP +04 +1C +2A +48 +50 +90 +A4 +A8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0F00 +1080 +1080 +0800 +3E00 +1000 +2000 +2000 +6200 +DC00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 6 1 2 +BITMAP +42 +3C +48 +48 +78 +84 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 1 0 +BITMAP +2080 +2100 +1200 +1400 +0800 +7E00 +1000 +FC00 +2000 +2000 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 4 12 0 -1 +BITMAP +10 +10 +10 +20 +20 +00 +00 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 14 0 -3 +BITMAP +0E +11 +11 +08 +1C +26 +42 +42 +64 +38 +10 +88 +88 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 2 9 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +0F00 +30C0 +4640 +4920 +9020 +9020 +9240 +4C40 +6180 +1E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 6 7 1 4 +BITMAP +1C +04 +38 +48 +70 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +24 +48 +90 +48 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 4 1 2 +BITMAP +FE +02 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +0F00 +30C0 +4E40 +4920 +8920 +9E20 +9440 +5240 +6180 +1E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 2 9 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 6 0 +BBX 4 4 2 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +04 +04 +08 +7F +08 +10 +10 +00 +FE +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 6 1 4 +BITMAP +70 +90 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 6 1 4 +BITMAP +70 +90 +20 +10 +90 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 2 3 9 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 11 -1 -3 +BITMAP +11 +11 +21 +22 +22 +42 +4C +74 +80 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 8 0 +BBX 8 14 2 -3 +BITMAP +1F +7A +F4 +F4 +F4 +E8 +68 +28 +50 +50 +50 +A0 +A0 +A0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 1 1 4 +BITMAP +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 4 3 -2 -3 +BITMAP +10 +90 +60 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 6 2 4 +BITMAP +20 +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 6 7 1 4 +BITMAP +18 +24 +44 +48 +30 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +48 +24 +48 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +1040 +7080 +1100 +2200 +24C0 +2940 +1280 +2480 +47C0 +8100 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +1040 +7080 +1100 +2200 +25C0 +2A40 +1040 +2080 +4100 +83C0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +7040 +9080 +2100 +1200 +94C0 +E940 +1280 +2480 +47C0 +8100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 11 1 -3 +BITMAP +04 +04 +00 +08 +10 +20 +40 +84 +84 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0400 +0200 +0000 +0200 +0500 +0900 +0900 +1100 +1100 +2100 +7F80 +4080 +8080 +8080 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0100 +0200 +0000 +0200 +0500 +0900 +0900 +1100 +1100 +2100 +7F80 +4080 +8080 +8080 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0200 +0500 +0000 +0200 +0500 +0900 +0900 +1100 +1100 +2100 +7F80 +4080 +8080 +8080 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0680 +0B00 +0000 +0200 +0500 +0900 +0900 +1100 +1100 +2100 +7F80 +4080 +8080 +8080 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +0D80 +0000 +0200 +0500 +0900 +0900 +1100 +1100 +2100 +7F80 +4080 +8080 +8080 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0300 +0500 +0600 +0200 +0500 +0900 +0900 +1100 +1100 +2100 +7F80 +4080 +8080 +8080 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 15 0 +BBX 16 11 1 0 +BITMAP +03FF +0440 +0840 +0880 +1080 +10FC +2100 +7F00 +4100 +8200 +83F8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 14 1 -3 +BITMAP +0F00 +1080 +2080 +4000 +4000 +8000 +8000 +8100 +8200 +C600 +3800 +1000 +9000 +6000 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 14 1 0 +BITMAP +0400 +0200 +0000 +1FC0 +1000 +1000 +2000 +2000 +7E00 +4000 +4000 +8000 +8000 +FE00 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 14 1 0 +BITMAP +0100 +0200 +0000 +1FC0 +1000 +1000 +2000 +2000 +7E00 +4000 +4000 +8000 +8000 +FE00 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 14 1 0 +BITMAP +0200 +0500 +0000 +1FC0 +1000 +1000 +2000 +2000 +7E00 +4000 +4000 +8000 +8000 +FE00 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 10 13 1 0 +BITMAP +06C0 +0000 +1FC0 +1000 +1000 +2000 +2000 +7E00 +4000 +4000 +8000 +8000 +FE00 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 14 1 0 +BITMAP +20 +10 +00 +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 1 0 +BITMAP +08 +10 +00 +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 1 0 +BITMAP +10 +28 +00 +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 13 1 0 +BITMAP +6C +00 +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 11 11 0 0 +BITMAP +0F80 +0840 +0840 +1020 +1020 +FC20 +2040 +2040 +4080 +4300 +7C00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 14 1 0 +BITMAP +0340 +0580 +0000 +1820 +1820 +2840 +2440 +2440 +4480 +4480 +4480 +8500 +8300 +8300 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0400 +0200 +0000 +0700 +1880 +20C0 +4040 +4040 +8080 +8080 +8180 +8200 +C600 +3800 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0100 +0200 +0000 +0700 +1880 +20C0 +4040 +4040 +8080 +8080 +8180 +8200 +C600 +3800 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0200 +0500 +0000 +0700 +1880 +20C0 +4040 +4040 +8080 +8080 +8180 +8200 +C600 +3800 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0680 +0B00 +0000 +0700 +1880 +20C0 +4040 +4040 +8080 +8080 +8180 +8200 +C600 +3800 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 10 13 1 0 +BITMAP +0D80 +0000 +0700 +1880 +20C0 +4040 +4040 +8080 +8080 +8180 +8200 +C600 +3800 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +41 +22 +14 +18 +28 +44 +82 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 11 11 0 0 +BITMAP +03A0 +0C40 +10A0 +2120 +2220 +4440 +4840 +50C0 +6100 +6300 +9C00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 14 1 0 +BITMAP +0200 +0100 +0000 +1020 +1020 +2040 +2040 +2040 +4080 +4080 +4080 +8100 +C300 +7E00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 14 1 0 +BITMAP +0080 +0100 +0000 +1020 +1020 +2040 +2040 +2040 +4080 +4080 +4080 +8100 +C300 +7E00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 14 1 0 +BITMAP +0100 +0280 +0000 +1020 +1020 +2040 +2040 +2040 +4080 +4080 +4080 +8100 +C300 +7E00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 11 0 +BBX 11 13 1 0 +BITMAP +06C0 +0000 +1020 +1020 +2040 +2040 +2040 +4080 +4080 +4080 +8100 +C300 +7E00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 9 14 2 0 +BITMAP +0400 +0800 +0000 +8080 +8100 +8200 +4200 +4400 +4800 +3000 +2000 +2000 +4000 +4000 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +10 +10 +3E +21 +21 +41 +42 +7C +80 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 11 1 0 +BITMAP +0E +11 +21 +22 +2C +48 +44 +44 +84 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +08 +00 +1C +22 +02 +3C +44 +88 +98 +EC +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +04 +08 +00 +1C +22 +02 +3C +44 +88 +98 +EC +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +08 +14 +00 +1C +22 +02 +3C +44 +88 +98 +EC +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +1A +2C +00 +1C +22 +02 +3C +44 +88 +98 +EC +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +36 +00 +1C +22 +02 +3C +44 +88 +98 +EC +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 0 0 +BITMAP +06 +0A +0C +00 +1C +22 +02 +3C +44 +88 +98 +EC +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 12 8 -1 0 +BITMAP +1EE0 +2110 +0110 +1FF0 +6200 +8400 +8C20 +73C0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 8 11 -1 -3 +BITMAP +0E +11 +20 +20 +40 +42 +44 +38 +10 +90 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +08 +00 +1C +22 +42 +7E +80 +80 +8C +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +04 +08 +00 +1C +22 +42 +7E +80 +80 +8C +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +08 +14 +00 +1C +22 +42 +7E +80 +80 +8C +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +36 +00 +1C +22 +42 +7E +80 +80 +8C +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +40 +20 +00 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 0 0 +BITMAP +10 +20 +00 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 0 0 +BITMAP +20 +50 +00 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 5 10 0 0 +BITMAP +D8 +00 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +36 +1C +24 +06 +3E +42 +42 +84 +84 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +1A +2C +00 +2C +32 +42 +44 +44 +84 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +08 +00 +1C +22 +42 +42 +84 +84 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +04 +08 +00 +1C +22 +42 +42 +84 +84 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +08 +14 +00 +1C +22 +42 +42 +84 +84 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +1A +2C +00 +1C +22 +42 +42 +84 +84 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +36 +00 +1C +22 +42 +42 +84 +84 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +08 +08 +00 +FE +00 +20 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +02 +1C +26 +4A +52 +94 +A4 +C8 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +10 +08 +00 +22 +22 +42 +44 +44 +84 +98 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +04 +08 +00 +22 +22 +42 +44 +44 +84 +98 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +08 +14 +00 +22 +22 +42 +44 +44 +84 +98 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +36 +00 +22 +22 +42 +44 +44 +84 +98 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 14 0 -3 +BITMAP +04 +08 +00 +42 +44 +44 +48 +48 +50 +70 +20 +40 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 14 -1 -3 +BITMAP +08 +08 +08 +16 +19 +21 +21 +21 +42 +62 +5C +40 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -3 +BITMAP +36 +00 +42 +44 +44 +48 +48 +50 +70 +20 +40 +40 +80 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 10 11 0 0 +BITMAP +0780 +0840 +1040 +2000 +7E00 +4000 +FC00 +4080 +4100 +6300 +1C00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvO18.bdf b/src/3rdparty/fonts/helvO18.bdf new file mode 100644 index 0000000000..12d1a89de9 --- /dev/null +++ b/src/3rdparty/fonts/helvO18.bdf @@ -0,0 +1,3837 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-O-Normal--18-180-75-75-P-98-ISO10646-1 +SIZE 18 75 75 +FONTBOUNDINGBOX 23 22 -2 -5 +COMMENT $XConsortium: helvO18.bdf,v 1.14 95/01/26 18:02:39 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 18 +POINT_SIZE 180 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 98 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 14 +X_HEIGHT 10 +FONT_ASCENT 16 +FONT_DESCENT 5 +FACE_NAME "Helvetica Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Oblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 2 0 +BITMAP +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 7 0 +BBX 6 4 3 10 +BITMAP +6C +6C +D8 +90 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 11 13 1 0 +BITMAP +0240 +06C0 +0480 +3FE0 +3FE0 +0900 +1B00 +1200 +FF80 +FF80 +2400 +6C00 +4800 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 15 1 -1 +BITMAP +0200 +1F00 +3F80 +64C0 +64C0 +7400 +3C00 +0F00 +0B80 +0980 +C980 +CB80 +FF00 +7E00 +1000 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 16 0 +BBX 12 13 3 0 +BITMAP +3830 +6C60 +C4C0 +8C80 +D980 +7300 +0600 +0CE0 +09B0 +1B10 +3230 +6360 +C1C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +0F00 +1B80 +3180 +3180 +1B00 +1E00 +3CC0 +66C0 +C380 +C300 +C780 +FCC0 +78C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 3 4 3 10 +BITMAP +60 +60 +20 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 8 18 1 -4 +BITMAP +03 +06 +0C +18 +30 +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 8 18 -1 -4 +BITMAP +0C +06 +06 +03 +03 +03 +03 +03 +03 +03 +06 +06 +0C +0C +18 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 8 0 +BBX 5 6 3 8 +BITMAP +20 +A8 +70 +60 +D0 +90 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 10 2 0 +BITMAP +0C +0C +0C +18 +FF +FF +18 +30 +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 5 1 -3 +BITMAP +60 +60 +20 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 2 2 4 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 8 14 0 0 +BITMAP +03 +03 +06 +04 +0C +0C +18 +10 +30 +30 +60 +40 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 2 0 +BITMAP +0F00 +3F80 +3180 +6180 +6180 +6180 +C180 +C300 +C300 +C300 +C600 +FE00 +7800 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 5 13 5 0 +BITMAP +18 +78 +F0 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +0F80 +1FC0 +38C0 +30C0 +01C0 +0380 +0F00 +1C00 +3800 +6000 +C000 +FF00 +FF00 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +0F80 +1FC0 +30C0 +30C0 +01C0 +0780 +0700 +0180 +0180 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 2 0 +BITMAP +0180 +0380 +0700 +0F00 +1B00 +3300 +6600 +C600 +FF00 +FF00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +0FC0 +1FC0 +1800 +3000 +3E00 +7F00 +6380 +0180 +0180 +0180 +C300 +FF00 +7C00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +0780 +0FC0 +18C0 +3000 +6000 +6E00 +FF00 +E380 +C180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 2 0 +BITMAP +7FC0 +7FC0 +0180 +0300 +0600 +0C00 +1800 +3000 +3000 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 2 0 +BITMAP +0F00 +3F80 +3180 +6180 +6380 +3F00 +7600 +E300 +C300 +C300 +C700 +FE00 +7C00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +0780 +1FC0 +18C0 +30C0 +30C0 +31C0 +3FC0 +1F80 +0180 +0380 +C700 +FE00 +7C00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 10 1 0 +BITMAP +30 +30 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 13 0 -3 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +60 +60 +20 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 8 7 2 1 +BITMAP +07 +1C +70 +C0 +70 +1C +06 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 8 5 2 2 +BITMAP +7F +7F +00 +FE +FE +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 8 7 2 1 +BITMAP +60 +38 +0E +03 +0E +38 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 3 0 +BITMAP +3E +7F +E3 +C7 +0E +1C +38 +70 +60 +60 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 18 0 +BBX 17 17 2 -3 +BITMAP +01F800 +07FE00 +0E0700 +180300 +30ED80 +63B980 +671980 +C63180 +CC3300 +CC6300 +CCE600 +CDEC00 +C77800 +600000 +700000 +3FE000 +0FE000 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +00C0 +01C0 +03C0 +0360 +0660 +0660 +0C60 +1C60 +1860 +3FE0 +7FE0 +6060 +C060 +C060 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 2 0 +BITMAP +1FC0 +1FE0 +1860 +3060 +3060 +30C0 +3F80 +7FC0 +60E0 +6060 +6060 +C0E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 14 2 0 +BITMAP +03C0 +0FE0 +3C70 +3030 +6000 +E000 +C000 +C000 +C000 +C060 +E0E0 +61C0 +7F80 +1E00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 14 1 0 +BITMAP +1FE0 +1FF0 +1830 +3018 +3018 +3018 +3018 +6018 +6038 +6030 +6070 +C0E0 +FF80 +FF00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 14 2 0 +BITMAP +1FF0 +1FF0 +1800 +3000 +3000 +3000 +3FC0 +7FC0 +6000 +6000 +6000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 12 14 2 0 +BITMAP +1FF0 +1FF0 +1800 +3000 +3000 +3000 +3F80 +7F80 +6000 +6000 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 14 2 0 +BITMAP +03E0 +0FF0 +1C30 +3030 +7000 +6000 +6000 +C3F0 +C3F0 +C060 +E060 +60C0 +7FC0 +1EC0 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 14 2 0 +BITMAP +1818 +1818 +1818 +3030 +3030 +3030 +3FF0 +7FE0 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 5 14 2 0 +BITMAP +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 10 14 0 0 +BITMAP +00C0 +00C0 +00C0 +0180 +0180 +0180 +0180 +0300 +0300 +0300 +C300 +C600 +FE00 +7C00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 13 14 1 0 +BITMAP +1818 +1830 +18E0 +31C0 +3380 +3700 +3E00 +7E00 +7700 +6380 +61C0 +C0E0 +C070 +C030 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 7 14 2 0 +BITMAP +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +FE +FE +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 15 0 +BBX 16 14 1 0 +BITMAP +1803 +1807 +1C0F +3C0E +361E +3636 +3636 +666C +66EC +66CC +638C +C398 +C318 +C318 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 14 2 0 +BITMAP +1818 +1818 +1C18 +3C30 +3630 +3630 +3630 +6660 +6360 +6360 +6360 +C1C0 +C1C0 +C0C0 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 14 2 0 +BITMAP +03E0 +0FF8 +1C18 +301C +700C +600C +600C +C018 +C018 +C038 +E030 +60E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 14 2 0 +BITMAP +1FC0 +1FE0 +3860 +3060 +3060 +30E0 +7FC0 +7F00 +6000 +6000 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 15 2 -1 +BITMAP +03E0 +0FF8 +1C18 +301C +700C +600C +600C +C018 +C018 +C1B8 +E1F0 +60E0 +7FE0 +1F70 +0030 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 14 2 0 +BITMAP +1FE0 +1FF0 +1830 +3030 +3030 +3070 +3FE0 +7FC0 +60E0 +6060 +6060 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 2 0 +BITMAP +0F80 +3FC0 +70C0 +60C0 +6000 +7C00 +3F00 +0780 +01C0 +00C0 +C0C0 +C180 +FF80 +7E00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 10 14 3 0 +BITMAP +FFC0 +FFC0 +0C00 +1800 +1800 +1800 +1800 +3000 +3000 +3000 +3000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 14 3 0 +BITMAP +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 4 0 +BITMAP +C0C0 +C0C0 +C180 +C180 +C300 +C300 +C600 +C600 +CC00 +CC00 +D800 +7800 +7000 +6000 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 17 0 +BBX 16 14 3 0 +BITMAP +C183 +C183 +C386 +C386 +C6CC +C6CC +CCCC +CCD8 +D8D8 +7878 +7070 +7070 +6060 +6060 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 14 1 0 +BITMAP +3030 +3070 +3860 +18C0 +0D80 +0F80 +0700 +0F00 +1F00 +1980 +3180 +61C0 +E0C0 +C0C0 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 4 0 +BITMAP +C0C0 +C0C0 +C180 +C380 +C300 +6600 +6E00 +6C00 +7800 +3800 +3000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 13 14 0 0 +BITMAP +0FF8 +0FF8 +0030 +0060 +00C0 +0180 +0300 +0600 +0C00 +1800 +3000 +6000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 8 18 0 -4 +BITMAP +0F +0F +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 14 2 0 +BITMAP +80 +C0 +C0 +40 +40 +60 +60 +60 +20 +20 +30 +30 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 8 18 -1 -4 +BITMAP +0F +0F +03 +03 +03 +06 +06 +06 +06 +0C +0C +0C +0C +18 +18 +18 +F0 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 10 0 +BBX 8 8 2 5 +BITMAP +0C +1C +36 +36 +66 +63 +C3 +C3 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 11 2 -1 -4 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 3 4 3 10 +BITMAP +60 +80 +C0 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +0F00 +3F80 +3180 +0780 +3F00 +7300 +E300 +C600 +FE00 +7600 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +1800 +1800 +1800 +3000 +3780 +3FC0 +38C0 +70C0 +60C0 +60C0 +6180 +E380 +FF00 +DE00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 10 1 0 +BITMAP +0F00 +3F80 +7180 +6000 +C000 +C000 +C000 +C600 +FE00 +7800 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 11 14 1 0 +BITMAP +0060 +0060 +0060 +00C0 +1EC0 +3FC0 +71C0 +6180 +C180 +C180 +C380 +C700 +FF00 +7B00 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 10 1 0 +BITMAP +0F00 +3F80 +7180 +6180 +FF00 +C000 +C000 +C600 +FE00 +7800 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 7 14 1 0 +BITMAP +0E +1E +18 +30 +FC +FC +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 11 14 0 -4 +BITMAP +0760 +1FE0 +3860 +30C0 +60C0 +60C0 +61C0 +6380 +7F80 +3D80 +0300 +C700 +FE00 +3800 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +1800 +1800 +1800 +3000 +3380 +3FC0 +38C0 +70C0 +6180 +6180 +6180 +C300 +C300 +C300 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 5 14 1 0 +BITMAP +18 +18 +00 +00 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 8 18 -2 -4 +BITMAP +03 +03 +00 +00 +06 +06 +06 +0C +0C +0C +0C +18 +18 +18 +18 +30 +F0 +E0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +1800 +1800 +1800 +3000 +3180 +3300 +3600 +3C00 +7C00 +6600 +6600 +C600 +C300 +C300 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 5 14 1 0 +BITMAP +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 14 0 +BBX 14 10 1 0 +BITMAP +3318 +37BC +39CC +6318 +6318 +6318 +6318 +C630 +C630 +C630 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 10 10 1 0 +BITMAP +3380 +37C0 +38C0 +70C0 +6180 +6180 +6180 +C300 +C300 +C300 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +0F00 +3F80 +7180 +6180 +C180 +C180 +C300 +C700 +FE00 +7800 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 11 14 0 -4 +BITMAP +1BC0 +1FE0 +1C60 +3860 +3060 +3060 +30C0 +71C0 +7F80 +6F00 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 1 -4 +BITMAP +1EC0 +3FC0 +71C0 +6180 +C180 +C180 +C380 +C700 +FF00 +7B00 +0300 +0600 +0600 +0600 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 7 10 1 0 +BITMAP +36 +3E +38 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 10 1 0 +BITMAP +0F00 +3F80 +7180 +6000 +3C00 +1F00 +0300 +C300 +FE00 +7C00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 6 13 1 0 +BITMAP +18 +18 +30 +FC +FC +30 +60 +60 +60 +C0 +C0 +E0 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 10 1 0 +BITMAP +30C0 +30C0 +30C0 +6180 +6180 +6180 +C380 +C700 +FB00 +7300 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 10 2 0 +BITMAP +C3 +C3 +C7 +C6 +CE +CC +D8 +F8 +70 +60 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 10 2 0 +BITMAP +C630 +C630 +C660 +CE60 +CE60 +DEC0 +D6C0 +7380 +6300 +6300 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 10 10 1 0 +BITMAP +30C0 +30C0 +1980 +1B00 +0E00 +1C00 +3E00 +6600 +C300 +C300 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 10 14 0 -4 +BITMAP +30C0 +30C0 +30C0 +3180 +3180 +3300 +1B00 +1E00 +0C00 +1800 +1800 +3000 +E000 +C000 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 10 1 0 +BITMAP +3F80 +3F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FE00 +FE00 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 6 0 +BBX 8 18 1 -4 +BITMAP +07 +0C +18 +18 +18 +18 +30 +60 +C0 +60 +60 +60 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 4 0 +BBX 6 18 0 -4 +BITMAP +0C +0C +0C +18 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 7 0 +BBX 8 18 0 -4 +BITMAP +1C +06 +06 +06 +06 +0C +0C +06 +03 +06 +0C +18 +18 +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 3 2 4 +BITMAP +73 +FF +CE +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 14 1 -4 +BITMAP +18 +18 +00 +00 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 2 -2 +BITMAP +0100 +0100 +0F00 +3F80 +7580 +6400 +C800 +C800 +D000 +D300 +FE00 +7C00 +4000 +4000 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 11 13 1 0 +BITMAP +07C0 +0FE0 +1C60 +1800 +1800 +0C00 +3F00 +0C00 +1C00 +3800 +7080 +FF80 +DF00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 7 2 3 +BITMAP +6180 +7F80 +3300 +6200 +6600 +FF00 +C300 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 11 13 2 0 +BITMAP +6060 +60C0 +3180 +3300 +1E00 +0C00 +7F00 +1800 +FE00 +1800 +3000 +3000 +3000 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 4 0 +BBX 5 17 1 -3 +BITMAP +18 +18 +18 +18 +30 +30 +30 +00 +00 +00 +60 +60 +60 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 11 18 0 -4 +BITMAP +07C0 +0FE0 +1C60 +1860 +1E00 +0F00 +1B80 +31C0 +30C0 +30C0 +38C0 +1D80 +0F00 +C700 +C300 +E700 +7E00 +3C00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 2 3 11 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 15 0 +BBX 15 13 1 0 +BITMAP +03E0 +0C18 +1004 +21C4 +4622 +4402 +8802 +8804 +8C44 +4788 +4010 +3060 +0F80 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 7 0 +BBX 7 9 2 5 +BITMAP +3C +66 +1E +34 +6C +74 +00 +F8 +F8 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 6 2 3 +BITMAP +1B +36 +6C +D8 +6C +36 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 5 2 2 +BITMAP +FF80 +FF80 +0180 +0300 +0300 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 6 2 2 4 +BITMAP +FC +FC +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 15 0 +BBX 15 13 1 0 +BITMAP +03E0 +0C18 +1004 +23C4 +4222 +4422 +87C2 +8484 +8844 +4828 +4010 +3060 +0F80 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 3 12 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 7 0 +BBX 6 5 2 8 +BITMAP +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +0600 +0600 +0C00 +7F80 +7F80 +0C00 +1800 +1800 +0000 +FF00 +FF00 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 6 8 1 5 +BITMAP +38 +4C +0C +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 7 8 0 5 +BITMAP +1C +26 +06 +18 +0C +0C +98 +70 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 3 3 11 +BITMAP +30 +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 12 14 -1 -4 +BITMAP +0C30 +0C30 +0C30 +1860 +1860 +1860 +30E0 +31C0 +3EC0 +6CC0 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 10 18 2 -4 +BITMAP +0FC0 +3C80 +7D80 +F900 +F900 +F900 +FA00 +F200 +7200 +3400 +2400 +2400 +2400 +2800 +4800 +4800 +4800 +4800 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 2 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 6 -1 -5 +BITMAP +10 +30 +18 +18 +D8 +70 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 8 2 5 +BITMAP +30 +F0 +30 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 7 0 +BBX 7 9 2 5 +BITMAP +1C +36 +36 +6C +6C +38 +00 +F8 +F8 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 6 2 3 +BITMAP +6C +36 +1B +36 +6C +D8 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 13 13 3 0 +BITMAP +3060 +F0C0 +30C0 +6180 +6300 +C310 +C630 +CC70 +0CF0 +19A0 +33F8 +3060 +6060 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 13 13 3 0 +BITMAP +3060 +F0C0 +30C0 +6180 +6300 +C370 +C698 +CC18 +0C30 +1860 +30C0 +7180 +61F0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 15 13 0 0 +BITMAP +1C18 +2630 +0630 +1860 +0CC0 +0CC4 +998C +731C +032C +0648 +0CFE +0C18 +1818 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 8 14 0 -4 +BITMAP +03 +03 +00 +00 +06 +06 +0E +1C +38 +70 +E3 +C7 +FE +7C +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +0180 +00C0 +0000 +00C0 +01C0 +03C0 +0360 +0660 +0660 +0C60 +1C60 +1860 +3FE0 +7FE0 +6060 +C060 +C060 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +0060 +00C0 +0000 +00C0 +01C0 +03C0 +0360 +0660 +0660 +0C60 +1C60 +1860 +3FE0 +7FE0 +6060 +C060 +C060 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 17 0 0 +BITMAP +00E0 +01B0 +0000 +00C0 +01C0 +03C0 +0360 +0660 +0660 +0C60 +1C60 +1860 +3FE0 +7FE0 +6060 +C060 +C060 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 17 0 0 +BITMAP +01D0 +02E0 +0000 +00C0 +01C0 +03C0 +0360 +0660 +0660 +0C60 +1C60 +1860 +3FE0 +7FE0 +6060 +C060 +C060 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 17 0 0 +BITMAP +0330 +0330 +0000 +01C0 +01C0 +03C0 +0360 +0660 +0660 +0C60 +1C60 +1860 +3FE0 +7FE0 +6060 +C060 +C060 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +00E0 +0120 +0120 +01C0 +01C0 +03C0 +0360 +0660 +0660 +0C60 +1C60 +1860 +3FE0 +7FE0 +6060 +C060 +C060 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 17 0 +BBX 19 14 0 0 +BITMAP +00FFE0 +01FFE0 +01B000 +033000 +066000 +066000 +0C7F80 +1CFF80 +18C000 +3FC000 +7FC000 +618000 +C1FF00 +C1FF00 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 19 2 -5 +BITMAP +03C0 +0FE0 +3C70 +3030 +6000 +E000 +C000 +C000 +C000 +C060 +E0E0 +61C0 +7F80 +3E00 +1000 +3000 +1800 +D800 +7000 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 17 2 0 +BITMAP +0300 +0180 +0000 +1FF0 +1FF0 +1800 +3000 +3000 +3000 +3FC0 +7FC0 +6000 +6000 +6000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 17 2 0 +BITMAP +00C0 +0180 +0000 +1FF0 +1FF0 +1800 +3000 +3000 +3000 +3FC0 +7FC0 +6000 +6000 +6000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 17 2 0 +BITMAP +0380 +06C0 +0000 +1FF0 +1FF0 +1800 +3000 +3000 +3000 +3FC0 +7FC0 +6000 +6000 +6000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 17 2 0 +BITMAP +0660 +0660 +0000 +1FF0 +1FF0 +1800 +3000 +3000 +3000 +3FC0 +7FC0 +6000 +6000 +6000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 5 17 2 0 +BITMAP +30 +18 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 6 17 2 0 +BITMAP +0C +18 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 7 17 2 0 +BITMAP +1C +36 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 7 17 2 0 +BITMAP +36 +36 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 13 14 1 0 +BITMAP +1FE0 +1FF0 +1830 +3018 +3018 +3018 +FC18 +FC38 +6030 +6070 +60E0 +C1C0 +FF80 +FF00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 17 2 0 +BITMAP +03A0 +05C0 +0000 +1818 +1818 +1C18 +3C30 +3630 +3630 +3630 +6660 +6360 +6360 +6360 +C1C0 +C1C0 +C0C0 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 17 2 0 +BITMAP +0180 +00C0 +0000 +03E0 +0FF8 +1C18 +301C +700C +600C +600C +C018 +C018 +C038 +E030 +60E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 17 2 0 +BITMAP +0060 +00C0 +0000 +03E0 +0FF8 +1C18 +301C +700C +600C +600C +C018 +C018 +C038 +E030 +60E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 17 2 0 +BITMAP +01C0 +0360 +0000 +03E0 +0FF8 +1C18 +301C +700C +600C +600C +C018 +C018 +C038 +E030 +60E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 17 2 0 +BITMAP +01D0 +02E0 +0000 +03E0 +0FF8 +1C18 +301C +700C +600C +600C +C018 +C018 +C038 +E030 +60E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 17 2 0 +BITMAP +0330 +0330 +0000 +03E0 +0FF8 +1C18 +301C +700C +600C +600C +C018 +C018 +C038 +E030 +60E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 10 10 1 0 +BITMAP +4040 +60C0 +3180 +1B00 +0E00 +1C00 +3600 +6300 +C180 +8080 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 15 14 2 0 +BITMAP +03E6 +0FFC +1C18 +303C +706C +60CC +618C +C318 +C618 +CC38 +D830 +F0E0 +7FC0 +DF00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 17 3 0 +BITMAP +0600 +0300 +0000 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 17 3 0 +BITMAP +0180 +0300 +0000 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 17 3 0 +BITMAP +0380 +06C0 +0000 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 17 3 0 +BITMAP +0CC0 +0CC0 +0000 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 17 4 0 +BITMAP +0600 +0C00 +0000 +C0C0 +C0C0 +C180 +C380 +C300 +6600 +6E00 +6C00 +7800 +3800 +3000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 2 0 +BITMAP +1800 +1800 +1800 +3F80 +3FC0 +30C0 +30C0 +60C0 +61C0 +7F80 +7E00 +C000 +C000 +C000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0700 +0F80 +1980 +3180 +3180 +3300 +3600 +6700 +6180 +6180 +6180 +C300 +CF00 +CE00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +1800 +0C00 +0600 +0000 +0F00 +3F80 +3180 +0780 +3F00 +7300 +E300 +C600 +FE00 +7600 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0180 +0300 +0600 +0000 +0F00 +3F80 +3180 +0780 +3F00 +7300 +E300 +C600 +FE00 +7600 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0600 +0F00 +1980 +0000 +0F00 +3F80 +3180 +0780 +3F00 +7300 +E300 +C600 +FE00 +7600 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 1 0 +BITMAP +0640 +0F80 +1300 +0000 +0F00 +3F80 +3180 +0780 +3F00 +7300 +E300 +C600 +FE00 +7600 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 1 0 +BITMAP +0D80 +0D80 +0000 +0F00 +3F80 +3180 +0780 +3F00 +7300 +E300 +C600 +FE00 +7600 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0700 +0900 +0900 +0E00 +0F00 +3F80 +3180 +0780 +3F00 +7300 +E300 +C600 +FE00 +7600 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +0F78 +3FFC +318C +078C +3FF8 +7300 +E300 +C718 +FFF8 +77E0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 10 15 0 -5 +BITMAP +0780 +1FC0 +38C0 +3000 +6000 +6000 +6000 +6300 +7F00 +3E00 +1000 +3000 +1800 +D800 +7000 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +1800 +0C00 +0600 +0000 +0F00 +3F80 +7180 +6180 +FF00 +C000 +C000 +C600 +FE00 +7800 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +0180 +0300 +0600 +0000 +0F00 +3F80 +7180 +6180 +FF00 +C000 +C000 +C600 +FE00 +7800 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 14 1 0 +BITMAP +0600 +0F00 +1980 +0000 +0F00 +3F80 +7180 +6180 +FF00 +C000 +C000 +C600 +FE00 +7800 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 9 13 1 0 +BITMAP +1B00 +1B00 +0000 +0F00 +3F80 +7180 +6180 +FF00 +C000 +C000 +C600 +FE00 +7800 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 14 1 0 +BITMAP +C0 +60 +30 +00 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 6 14 1 0 +BITMAP +0C +18 +30 +00 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 6 14 1 0 +BITMAP +30 +78 +CC +00 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 6 13 1 0 +BITMAP +6C +6C +00 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +1800 +0D80 +1E00 +0300 +0F00 +3F80 +7180 +6180 +C180 +C180 +C300 +C700 +FE00 +7800 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 11 14 1 0 +BITMAP +0320 +07C0 +0980 +0000 +3380 +37C0 +38C0 +70C0 +6180 +6180 +6180 +C300 +C300 +C300 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +1800 +0C00 +0600 +0000 +0F00 +3F80 +7180 +6180 +C180 +C180 +C300 +C700 +FE00 +7800 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0180 +0300 +0600 +0000 +0F00 +3F80 +7180 +6180 +C180 +C180 +C300 +C700 +FE00 +7800 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0600 +0F00 +1980 +0000 +0F00 +3F80 +7180 +6180 +C180 +C180 +C300 +C700 +FE00 +7800 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 1 0 +BITMAP +0640 +0F80 +1300 +0000 +0F00 +3F80 +7180 +6180 +C180 +C180 +C300 +C700 +FE00 +7800 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 1 0 +BITMAP +0D80 +0D80 +0000 +0F00 +3F80 +7180 +6180 +C180 +C180 +C300 +C700 +FE00 +7800 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 8 2 1 +BITMAP +0C +0C +00 +FF +FF +00 +30 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 13 10 -1 0 +BITMAP +03D8 +0FF0 +1C60 +19E0 +3360 +3660 +3CC0 +31C0 +7F80 +DE00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 1 0 +BITMAP +1800 +0C00 +0600 +0000 +30C0 +30C0 +30C0 +6180 +6180 +6180 +C380 +C700 +FB00 +7300 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 1 0 +BITMAP +0180 +0300 +0600 +0000 +30C0 +30C0 +30C0 +6180 +6180 +6180 +C380 +C700 +FB00 +7300 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 14 1 0 +BITMAP +0600 +0F00 +1980 +0000 +30C0 +30C0 +30C0 +6180 +6180 +6180 +C380 +C700 +FB00 +7300 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 1 0 +BITMAP +0D80 +0D80 +0000 +30C0 +30C0 +30C0 +6180 +6180 +6180 +C380 +C700 +FB00 +7300 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 18 1 -4 +BITMAP +0300 +0600 +0C00 +0000 +6180 +6180 +6180 +6300 +6300 +6600 +3600 +3C00 +1C00 +1800 +3000 +6000 +C000 +8000 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 11 18 0 -4 +BITMAP +0C00 +0C00 +0C00 +0C00 +1BC0 +1FE0 +1C60 +3860 +3060 +3060 +30C0 +71C0 +7F80 +6F00 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 9 17 1 -4 +BITMAP +1B00 +1B00 +0000 +6180 +6180 +6180 +6300 +6300 +6600 +3600 +3C00 +1C00 +1800 +3000 +6000 +C000 +8000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 14 14 0 0 +BITMAP +00F0 +03F8 +0F1C +0C0C +7F00 +7F00 +3000 +FE00 +FE00 +3018 +3838 +1870 +1FE0 +0780 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvO24.bdf b/src/3rdparty/fonts/helvO24.bdf new file mode 100644 index 0000000000..2924a21d30 --- /dev/null +++ b/src/3rdparty/fonts/helvO24.bdf @@ -0,0 +1,4713 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-O-Normal--24-240-75-75-P-130-ISO10646-1 +SIZE 24 75 75 +FONTBOUNDINGBOX 28 29 -1 -5 +COMMENT $XConsortium: helvO24.bdf,v 1.13 95/01/26 18:02:44 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "O" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 24 +POINT_SIZE 240 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 130 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 19 +X_HEIGHT 14 +FONT_ASCENT 22 +FONT_DESCENT 5 +FACE_NAME "Helvetica Oblique" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica-Oblique" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica Oblique" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 6 19 3 0 +BITMAP +0C +0C +0C +0C +18 +18 +18 +18 +30 +30 +30 +30 +60 +60 +00 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 8 0 +BBX 7 6 4 13 +BITMAP +66 +66 +66 +CC +CC +88 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 17 3 0 +BITMAP +0330 +0330 +0660 +0660 +3FF8 +3FF8 +0CC0 +0CC0 +1980 +1980 +FFE0 +FFE0 +3300 +3300 +6600 +6600 +6600 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 21 2 -2 +BITMAP +00C0 +00C0 +07F0 +1FF8 +3998 +3198 +3300 +3B00 +1F00 +0F80 +07C0 +06E0 +0670 +0630 +0630 +CC70 +CCE0 +FFC0 +7F00 +1800 +1800 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 22 0 +BBX 16 18 4 0 +BITMAP +0001 +1E03 +3E06 +630C +C318 +C310 +C630 +7C60 +78C0 +0180 +031E +063E +0C63 +08C3 +18C3 +30C6 +607C +4078 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 14 18 2 0 +BITMAP +01E0 +07F0 +0630 +0C30 +0C30 +0C60 +0EE0 +07C0 +1F80 +3F0C +739C +E1D8 +C0F8 +C070 +C0F0 +E1F8 +7F9C +3E0C +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 3 6 5 13 +BITMAP +60 +60 +60 +20 +60 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 8 24 3 -5 +BITMAP +03 +06 +0C +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +60 +30 +18 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 8 24 0 -5 +BITMAP +18 +0C +06 +06 +06 +03 +03 +03 +03 +03 +03 +03 +03 +03 +06 +06 +06 +0C +0C +18 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 7 6 5 12 +BITMAP +10 +D6 +7C +70 +D8 +88 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 12 12 2 1 +BITMAP +0300 +0300 +0300 +0600 +0600 +FFF0 +FFF0 +0600 +0600 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 3 6 1 -3 +BITMAP +60 +60 +60 +20 +60 +C0 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 11 2 3 6 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 11 19 0 0 +BITMAP +0060 +00C0 +00C0 +0180 +0180 +0300 +0300 +0600 +0600 +0C00 +0C00 +1800 +1800 +3000 +3000 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 18 2 0 +BITMAP +03E0 +07F0 +0E38 +1818 +1818 +3018 +3018 +6030 +6030 +6030 +6030 +C060 +C060 +C0C0 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 6 18 6 0 +BITMAP +0C +0C +1C +F8 +F8 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 14 18 1 0 +BITMAP +03E0 +07F8 +0E1C +1C0C +180C +180C +001C +0038 +0070 +01E0 +0380 +0F00 +1C00 +3800 +7000 +E000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 2 0 +BITMAP +03C0 +0FE0 +1C70 +3830 +3030 +0070 +00E0 +01C0 +0780 +07C0 +00E0 +0060 +0060 +C060 +C0E0 +E3C0 +7F80 +3E00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 2 0 +BITMAP +0030 +0070 +00F0 +01B0 +0360 +0660 +0C60 +18C0 +18C0 +30C0 +6180 +C180 +FFE0 +FFE0 +0180 +0300 +0300 +0300 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 18 2 0 +BITMAP +0FF8 +0FF8 +0C00 +0C00 +1800 +1800 +1F80 +3FC0 +38E0 +0060 +0060 +0060 +0060 +C0E0 +C0C0 +C3C0 +FF80 +3E00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 18 2 0 +BITMAP +01E0 +07F0 +0E38 +1818 +3818 +3000 +6000 +6F00 +DFC0 +F0E0 +E060 +C060 +C060 +C060 +E0E0 +71C0 +7F80 +1E00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 18 3 0 +BITMAP +3FF8 +3FF8 +0030 +0060 +00C0 +01C0 +0380 +0300 +0600 +0E00 +1C00 +1800 +3800 +3000 +6000 +6000 +C000 +C000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 2 0 +BITMAP +03C0 +07E0 +0C70 +1830 +1830 +1830 +1C60 +0FC0 +1FC0 +38E0 +7060 +6060 +C060 +C060 +C0E0 +E1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 18 2 0 +BITMAP +03E0 +0FF0 +0E38 +3818 +3018 +7018 +6038 +6030 +6070 +71F0 +3FB0 +1E60 +0060 +00C0 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 5 14 3 0 +BITMAP +18 +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 6 17 2 -3 +BITMAP +0C +0C +0C +00 +00 +00 +00 +00 +00 +00 +00 +60 +60 +60 +20 +60 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 10 3 3 +BITMAP +0070 +01E0 +0780 +1E00 +7800 +E000 +F000 +3C00 +0F00 +0380 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 11 6 3 4 +BITMAP +7FE0 +7FE0 +0000 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 11 10 3 3 +BITMAP +7000 +3C00 +0F00 +03C0 +00E0 +01E0 +0780 +1E00 +7800 +E000 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 4 0 +BITMAP +0F80 +3FC0 +70E0 +6060 +C060 +C0E0 +01C0 +0780 +0E00 +1C00 +1800 +3000 +3000 +3000 +0000 +0000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 22 0 +BBX 21 23 2 -4 +BITMAP +003F00 +00FFC0 +03C1E0 +070070 +0C0038 +180018 +303818 +30FD98 +61C798 +638318 +630618 +C60630 +C60C30 +C60C60 +C618E0 +C718C0 +C3FF80 +C1EF00 +600000 +700000 +381800 +1FF800 +07E000 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +0070 +0070 +00F0 +00F8 +01D8 +0198 +0398 +0718 +0618 +0E0C +0C0C +1FFC +1FFC +380C +3006 +7006 +6006 +E006 +E006 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 16 19 2 0 +BITMAP +0FFC +0FFE +0C07 +0C03 +1803 +1803 +1807 +180E +3FF8 +3FFC +300E +3006 +6006 +6006 +6006 +600E +C03C +FFF8 +FFE0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 19 2 0 +BITMAP +00FE00 +03FF00 +078380 +0E0180 +180180 +380000 +300000 +600000 +600000 +600000 +C00000 +C00000 +C00000 +C00600 +E00E00 +601C00 +787800 +3FF000 +0FC000 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 19 2 0 +BITMAP +0FFC00 +0FFF00 +0C0780 +0C0180 +1801C0 +1800C0 +1800C0 +1800C0 +3000C0 +300180 +300180 +300180 +600300 +600700 +600E00 +601C00 +C07800 +FFF000 +FFC000 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 19 2 0 +BITMAP +0FFF +0FFF +0C00 +0C00 +1800 +1800 +1800 +1800 +3FF8 +3FF8 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 15 19 2 0 +BITMAP +0FFE +0FFE +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +3FF0 +3FF0 +3000 +6000 +6000 +6000 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 17 19 2 0 +BITMAP +00FE00 +03FF00 +078380 +0E0180 +180180 +380000 +300000 +600000 +600000 +603F80 +C03F80 +C00380 +C00300 +C00700 +E00E00 +601E00 +787600 +3FEC00 +0FCC00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 19 2 0 +BITMAP +0C00C0 +0C00C0 +0C00C0 +0C00C0 +180180 +180180 +180180 +180180 +3FFF00 +3FFF00 +300300 +300300 +600600 +600600 +600600 +600600 +C00C00 +C00C00 +C00C00 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 6 19 3 0 +BITMAP +0C +0C +0C +0C +18 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 13 19 2 0 +BITMAP +0018 +0018 +0018 +0018 +0030 +0030 +0030 +0030 +0060 +0060 +0060 +0060 +C0C0 +C0C0 +C1C0 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 18 0 +BBX 17 19 2 0 +BITMAP +0C0380 +0C0700 +0C0E00 +0C1C00 +187000 +18E000 +19C000 +1B8000 +3F0000 +3F8000 +39C000 +30C000 +60E000 +607000 +603800 +601800 +C01C00 +C00E00 +C00600 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 19 2 0 +BITMAP +0C00 +0C00 +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +3000 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 22 0 +BBX 22 19 2 0 +BITMAP +0C000C +0C001C +0E003C +1E0038 +1E0078 +1E00D8 +1B0198 +1B01B0 +330330 +330730 +330630 +330C30 +619C60 +619860 +61B860 +61B060 +C1E0C0 +C0E0C0 +C0C0C0 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 19 2 0 +BITMAP +0E00C0 +0E00C0 +0E00C0 +0F00C0 +1B0180 +1B0180 +198180 +198180 +318300 +30C300 +30C300 +30C300 +606600 +606600 +603600 +603600 +C01C00 +C01C00 +C01C00 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 18 19 2 0 +BITMAP +00FC00 +03FF00 +078780 +0E0180 +1801C0 +3800C0 +3000C0 +6000C0 +6000C0 +600180 +C00180 +C00380 +C00300 +C00600 +E00E00 +601C00 +787800 +3FF000 +0FC000 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 19 2 0 +BITMAP +0FFC +0FFE +0C07 +0C03 +1803 +1803 +1803 +1806 +3FFC +3FF8 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 18 19 2 0 +BITMAP +00FC00 +03FF00 +078780 +0E0180 +1801C0 +3800C0 +3000C0 +6000C0 +6000C0 +600180 +C00180 +C00380 +C00300 +C1C600 +E0EE00 +607C00 +787800 +3FFC00 +0FCE00 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 17 0 +BBX 16 19 2 0 +BITMAP +0FF8 +0FFE +0C07 +0C03 +1803 +1803 +1806 +180C +3FFC +3FF8 +301C +300C +600C +600C +600C +600C +C018 +C018 +C018 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 19 1 0 +BITMAP +00F8 +03FE +0707 +0C03 +1803 +1800 +1C00 +0F00 +07E0 +00F8 +001C +000E +0006 +C006 +C006 +E00C +783C +3FF0 +0FC0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 16 0 +BBX 14 19 5 0 +BITMAP +FFFC +FFFC +0300 +0300 +0600 +0600 +0600 +0600 +0C00 +0C00 +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +3000 +3000 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 19 3 0 +BITMAP +180180 +180180 +180180 +180180 +300300 +300300 +300300 +300300 +600600 +600600 +600600 +600C00 +C00C00 +C01C00 +C01800 +E03800 +607000 +7FE000 +1F8000 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 19 5 0 +BITMAP +C006 +C006 +C00C +C00C +C018 +C038 +6030 +6070 +6060 +60C0 +61C0 +6180 +6380 +6300 +6700 +3600 +3C00 +3C00 +3800 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 22 0 +BBX 20 19 5 0 +BITMAP +C06030 +C06030 +C0E060 +C0E060 +C1E0C0 +C1E0C0 +C36180 +C36180 +C76380 +C66300 +CE6700 +CC6600 +DC6E00 +D86C00 +783C00 +703800 +703800 +603000 +603000 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 19 19 0 0 +BITMAP +0C0060 +0E00E0 +0601C0 +070380 +030700 +018E00 +01DC00 +00F800 +00F000 +00E000 +01F000 +03B000 +073800 +0E1800 +1C1C00 +380C00 +700E00 +E00600 +C00600 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 15 19 5 0 +BITMAP +C00E +C01C +C038 +6070 +60E0 +61C0 +3180 +3300 +3700 +3E00 +1C00 +1800 +1800 +1800 +3000 +3000 +3000 +3000 +3000 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 17 19 1 0 +BITMAP +0FFF80 +0FFF80 +000380 +000700 +000E00 +001C00 +003800 +007000 +00E000 +01C000 +038000 +070000 +0E0000 +1C0000 +380000 +700000 +E00000 +FFF800 +FFF800 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 9 24 1 -5 +BITMAP +0780 +0780 +0600 +0600 +0C00 +0C00 +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +3000 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +C000 +F000 +F000 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 3 19 4 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 9 24 0 -5 +BITMAP +0780 +0780 +0180 +0180 +0300 +0300 +0300 +0300 +0600 +0600 +0600 +0600 +0C00 +0C00 +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +3000 +F000 +F000 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 12 0 +BBX 11 7 3 12 +BITMAP +0300 +0700 +0D80 +1980 +30C0 +60C0 +C060 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 2 -1 -5 +BITMAP +FFFC +FFFC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 3 6 5 13 +BITMAP +60 +C0 +80 +C0 +C0 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 14 2 0 +BITMAP +07C0 +1FE0 +3860 +3060 +00E0 +07C0 +1FC0 +78C0 +6180 +C180 +C380 +C780 +FDC0 +78C0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +0C00 +0C00 +0C00 +1800 +1800 +19E0 +1FF0 +1E38 +3818 +3018 +3018 +3018 +6030 +6030 +6060 +60E0 +F1C0 +FF80 +CF00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 11 14 2 0 +BITMAP +07C0 +0FE0 +1C60 +3060 +6000 +6000 +C000 +C000 +C000 +C000 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 19 2 0 +BITMAP +000C +000C +000C +0018 +0018 +0798 +0FF8 +1C70 +3030 +7030 +6030 +6030 +C060 +C060 +C060 +C0E0 +E3C0 +7FC0 +3CC0 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 14 2 0 +BITMAP +03C0 +0FE0 +1C70 +3830 +7030 +6030 +FFE0 +FFE0 +C000 +C000 +C0C0 +E1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 8 19 3 0 +BITMAP +07 +0F +0C +18 +18 +7E +7E +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 15 19 0 -5 +BITMAP +00F6 +03FE +071E +0C0C +180C +180C +181C +3018 +3018 +3038 +3038 +38F0 +1FF0 +07B0 +0030 +C060 +E0E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +0C00 +0C00 +0C00 +0C00 +1800 +19C0 +1FF0 +1E30 +3830 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 6 19 2 0 +BITMAP +0C +0C +0C +00 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 9 24 -1 -5 +BITMAP +0180 +0180 +0180 +0000 +0000 +0300 +0300 +0300 +0600 +0600 +0600 +0600 +0C00 +0C00 +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +3000 +F000 +E000 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 12 19 2 0 +BITMAP +0C00 +0C00 +0C00 +0C00 +1800 +1830 +1860 +18C0 +3380 +3700 +3E00 +3E00 +6700 +6300 +6380 +6180 +C1C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 6 19 2 0 +BITMAP +0C +0C +0C +0C +18 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 20 0 +BBX 18 14 2 0 +BITMAP +19C780 +1FEFC0 +1C78C0 +3060C0 +3060C0 +3060C0 +3060C0 +60C180 +60C180 +60C180 +60C180 +C18300 +C18300 +C18300 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 14 2 0 +BITMAP +19C0 +1FF0 +1E30 +3830 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 14 2 0 +BITMAP +07C0 +0FE0 +1C70 +3030 +6030 +6030 +C030 +C030 +C060 +C060 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 19 1 -5 +BITMAP +0CF0 +0FF8 +0F1C +1C0C +180C +180C +1818 +3018 +3018 +3030 +3070 +78E0 +7FC0 +6780 +6000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 19 2 -5 +BITMAP +0798 +0FF8 +1C70 +3030 +7030 +6030 +6030 +C060 +C060 +C060 +C0E0 +E3C0 +7FC0 +3CC0 +00C0 +0180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 9 14 2 0 +BITMAP +1980 +1B80 +1E00 +3C00 +3800 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 11 14 2 0 +BITMAP +1FC0 +3FE0 +7060 +6060 +6000 +7800 +3F00 +0780 +01C0 +00C0 +C0C0 +C1C0 +FF80 +7F00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 7 18 3 0 +BITMAP +0C +0C +0C +18 +7E +7E +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +F0 +70 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 14 3 0 +BITMAP +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +C780 +FD80 +7980 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 11 14 4 0 +BITMAP +C060 +C060 +C0C0 +C0C0 +C180 +C180 +C300 +C300 +6600 +6600 +6C00 +7800 +3800 +3000 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 14 3 0 +BITMAP +C0C180 +C1C180 +C3C300 +C3C300 +C6C600 +C6C600 +CCCC00 +CCCC00 +D8D800 +78D800 +707800 +707000 +606000 +606000 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 14 14 1 0 +BITMAP +180C +181C +0C38 +0C70 +06E0 +07C0 +0380 +0700 +0F80 +1D80 +38C0 +70C0 +E060 +C060 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 14 19 1 -5 +BITMAP +300C +300C +301C +3818 +1830 +1870 +1860 +0CE0 +0CC0 +0D80 +0780 +0700 +0700 +0600 +0C00 +1C00 +3800 +F000 +E000 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 13 14 1 0 +BITMAP +1FF8 +1FF8 +0030 +0060 +00C0 +0180 +0300 +0600 +0C00 +1800 +3000 +6000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 9 0 +BBX 10 24 2 -5 +BITMAP +01C0 +0300 +0600 +0C00 +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +6000 +C000 +6000 +3000 +3000 +6000 +6000 +6000 +C000 +C000 +C000 +6000 +3000 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 6 0 +BBX 7 24 1 -5 +BITMAP +06 +06 +06 +06 +0C +0C +0C +0C +18 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 9 0 +BBX 10 24 -1 -5 +BITMAP +0600 +0300 +0180 +0180 +0180 +0180 +0300 +0300 +0300 +0300 +0300 +0180 +00C0 +0180 +0300 +0600 +0600 +0C00 +0C00 +0C00 +1800 +1800 +3000 +E000 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 11 4 3 5 +BITMAP +3860 +7E60 +CFC0 +C380 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 19 2 -5 +BITMAP +0C +0C +0C +00 +00 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 2 -2 +BITMAP +0060 +0060 +07C0 +1FC0 +39E0 +6360 +6300 +C600 +C600 +CC00 +CC00 +D800 +D980 +F380 +7F00 +7E00 +C000 +C000 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 18 1 0 +BITMAP +01F8 +07FC +060C +0C0C +0C00 +0E00 +0600 +0600 +3FE0 +3FE0 +0600 +0E00 +0C00 +1C00 +3800 +77B0 +FFF0 +F8E0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 13 12 2 3 +BITMAP +3018 +3BB8 +1FF0 +0C60 +1860 +1860 +30C0 +30C0 +3180 +7FC0 +EEE0 +C060 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 18 3 0 +BITMAP +600C +601C +3038 +3030 +1860 +18E0 +18C0 +0D80 +7FE0 +7FE0 +0600 +FFC0 +FFC0 +0C00 +0C00 +1800 +1800 +1800 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 6 0 +BBX 6 23 2 -4 +BITMAP +0C +0C +0C +0C +0C +18 +18 +18 +18 +18 +00 +00 +00 +60 +60 +60 +60 +60 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 24 2 -5 +BITMAP +03E0 +07F0 +0E30 +0C30 +0C00 +0C00 +0600 +1F00 +3F80 +71C0 +60C0 +6060 +6060 +7060 +38E0 +1FC0 +0F80 +0600 +0300 +0300 +C300 +C700 +FE00 +7C00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 2 5 16 +BITMAP +CC +CC +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 19 0 +BBX 18 17 3 0 +BITMAP +00F800 +070E00 +0C0300 +380180 +21F880 +630CC0 +460440 +CC0040 +8C0040 +8C00C0 +8C1880 +C67180 +43C100 +600300 +300C00 +1C3800 +07C000 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 9 0 +BBX 8 12 4 7 +BITMAP +3E +63 +43 +1F +73 +C2 +C6 +FE +76 +00 +FE +FE +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 8 3 3 +BITMAP +0CC0 +1980 +3300 +6600 +CC00 +6600 +3300 +1980 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 7 3 3 +BITMAP +FFF0 +FFF0 +0030 +0030 +0060 +0060 +0060 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 7 2 2 6 +BITMAP +FE +FE +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 19 0 +BBX 18 17 3 0 +BITMAP +00F800 +070E00 +0C0300 +380180 +21F880 +630CC0 +C20C40 +861840 +87F040 +84C040 +8C60C0 +C83080 +581980 +600300 +300C00 +1C3800 +07E000 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 2 5 16 +BITMAP +FC +FC +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 9 0 +BBX 8 7 3 11 +BITMAP +3C +66 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 13 13 1 0 +BITMAP +0180 +0180 +0180 +0300 +7FF8 +7FF8 +0300 +0600 +0600 +0600 +0000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 7 10 2 8 +BITMAP +3C +7E +66 +06 +0C +38 +60 +C0 +FC +FC +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 8 10 2 8 +BITMAP +1E +3F +23 +06 +1C +1E +06 +C6 +FC +78 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 5 15 +BITMAP +18 +30 +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 19 1 -5 +BITMAP +0C0C +0C0C +0C0C +1818 +1818 +1818 +1818 +3030 +3030 +3030 +3070 +71E0 +7F60 +6E60 +6000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 12 0 +BBX 12 24 3 -5 +BITMAP +03F0 +0FF0 +1F60 +3E60 +7E40 +FEC0 +FCC0 +FCC0 +FC80 +FD80 +7980 +1980 +1900 +1B00 +1B00 +1300 +3200 +3600 +3600 +2600 +6C00 +6C00 +6C00 +6C00 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 3 4 6 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 6 1 -5 +BITMAP +30 +30 +18 +18 +F8 +70 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 4 10 4 8 +BITMAP +30 +30 +F0 +E0 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 9 0 +BBX 9 12 3 7 +BITMAP +0F00 +1F80 +3180 +2180 +6180 +6100 +6300 +7E00 +3C00 +0000 +FE00 +FE00 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 8 4 3 +BITMAP +6600 +3300 +1980 +0CC0 +1980 +3300 +6600 +CC00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 14 19 4 0 +BITMAP +000C +180C +1818 +7830 +7060 +3060 +30C0 +3180 +6180 +630C +661C +063C +0C6C +18D8 +3198 +33FC +63FC +C030 +C030 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 15 19 4 0 +BITMAP +000C +180C +1818 +7830 +7060 +3060 +30C0 +3180 +6180 +633C +667E +0666 +0C06 +180C +3038 +3060 +60C0 +C0FC +C0FC +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 16 19 2 0 +BITMAP +0003 +1E03 +3F06 +230C +0618 +1C18 +1E30 +0660 +C660 +FCC3 +7987 +018F +031B +0636 +0C66 +0CFF +18FF +300C +300C +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 13 0 +BBX 11 19 1 -5 +BITMAP +00C0 +00C0 +00C0 +0000 +0000 +0180 +0180 +0180 +0300 +0700 +0E00 +3C00 +7000 +E060 +C060 +C0C0 +E1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +0180 +00C0 +0060 +0030 +0000 +0070 +0070 +00F0 +00F8 +01D8 +0198 +0398 +0718 +0618 +0E0C +0C0C +1FFC +1FFC +380C +3006 +7006 +6006 +E006 +E006 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +000C +0018 +0030 +0060 +0000 +0070 +0070 +00F0 +00F8 +01D8 +0198 +0398 +0718 +0618 +0E0C +0C0C +1FFC +1FFC +380C +3006 +7006 +6006 +E006 +E006 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +0030 +0078 +00CC +0186 +0000 +0070 +0070 +00F0 +00F8 +01D8 +0198 +0398 +0718 +0618 +0E0C +0C0C +1FFC +1FFC +380C +3006 +7006 +6006 +E006 +E006 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 23 1 0 +BITMAP +00E2 +01B6 +011C +0000 +0070 +0070 +00F0 +00F8 +01D8 +0198 +0398 +0718 +0618 +0E0C +0C0C +1FFC +1FFC +380C +3006 +7006 +6006 +E006 +E006 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 23 1 0 +BITMAP +018C +018C +0000 +0000 +0070 +0070 +00F0 +00F8 +01D8 +0198 +0398 +0718 +0618 +0E0C +0C0C +1FFC +1FFC +380C +3006 +7006 +6006 +E006 +E006 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +0038 +006C +006C +0038 +0000 +0070 +0070 +00F0 +00F8 +01D8 +0198 +0398 +0718 +0618 +0E0C +0C0C +1FFC +1FFC +380C +3006 +7006 +6006 +E006 +E006 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 23 0 +BBX 25 19 1 0 +BITMAP +003FFF80 +007FFF80 +00660000 +00C60000 +018C0000 +018C0000 +030C0000 +030C0000 +061FFE00 +061FFE00 +0C180000 +1FF80000 +1FF00000 +30300000 +30300000 +60300000 +60600000 +C07FF800 +C07FF800 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 24 2 -5 +BITMAP +00FC00 +03FF00 +078780 +0E0180 +180180 +380000 +300000 +600000 +600000 +600000 +C00000 +C00000 +C00000 +C00600 +E00E00 +601C00 +787800 +3FF000 +0FC000 +0C0000 +060000 +060000 +3E0000 +1C0000 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 24 2 0 +BITMAP +0300 +0180 +00C0 +0060 +0000 +0FFF +0FFF +0C00 +0C00 +1800 +1800 +1800 +1800 +3FF8 +3FF8 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 24 2 0 +BITMAP +000C +0018 +0030 +0060 +0000 +0FFF +0FFF +0C00 +0C00 +1800 +1800 +1800 +1800 +3FF8 +3FF8 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 24 2 0 +BITMAP +0060 +00F0 +0198 +030C +0000 +0FFF +0FFF +0C00 +0C00 +1800 +1800 +1800 +1800 +3FF8 +3FF8 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 16 23 2 0 +BITMAP +0198 +0198 +0000 +0000 +0FFF +0FFF +0C00 +0C00 +1800 +1800 +1800 +1800 +3FF8 +3FF8 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 7 24 3 0 +BITMAP +30 +18 +0C +06 +00 +0C +0C +0C +0C +18 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 9 24 3 0 +BITMAP +0180 +0300 +0600 +0C00 +0000 +0C00 +0C00 +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +3000 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 10 24 3 0 +BITMAP +0E00 +1B00 +3180 +60C0 +0000 +0C00 +0C00 +0C00 +0C00 +1800 +1800 +1800 +1800 +3000 +3000 +3000 +3000 +6000 +6000 +6000 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 8 23 3 0 +BITMAP +1B +1B +00 +00 +0C +0C +0C +0C +18 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 19 2 0 +BITMAP +0FFC00 +0FFF00 +0C0780 +0C0180 +1801C0 +1800C0 +1800C0 +1800C0 +FF00C0 +FF0180 +300180 +300180 +600300 +600700 +600E00 +601C00 +C07800 +FFF000 +FFC000 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 23 2 0 +BITMAP +007100 +00DB00 +008E00 +000000 +0E00C0 +0E00C0 +0E00C0 +0F00C0 +1B0180 +1B0180 +198180 +198180 +318300 +30C300 +30C300 +30C300 +606600 +606600 +603600 +603600 +C01C00 +C01C00 +C01C00 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 18 24 2 0 +BITMAP +00C000 +006000 +003000 +001800 +000000 +00FC00 +03FF00 +078780 +0E0180 +1801C0 +3800C0 +3000C0 +6000C0 +6000C0 +600180 +C00180 +C00380 +C00300 +C00600 +E00E00 +601C00 +787800 +3FF000 +0FC000 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 18 24 2 0 +BITMAP +000300 +000600 +000C00 +001800 +000000 +00FC00 +03FF00 +078780 +0E0180 +1801C0 +3800C0 +3000C0 +6000C0 +6000C0 +600180 +C00180 +C00380 +C00300 +C00600 +E00E00 +601C00 +787800 +3FF000 +0FC000 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 18 24 2 0 +BITMAP +003800 +006C00 +00C600 +018300 +000000 +00FC00 +03FF00 +078780 +0E0180 +1801C0 +3800C0 +3000C0 +6000C0 +6000C0 +600180 +C00180 +C00380 +C00300 +C00600 +E00E00 +601C00 +787800 +3FF000 +0FC000 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 18 23 2 0 +BITMAP +007100 +00DB00 +008E00 +000000 +00FC00 +03FF00 +078780 +0E0180 +1801C0 +3800C0 +3000C0 +6000C0 +6000C0 +600180 +C00180 +C00380 +C00300 +C00600 +E00E00 +601C00 +787800 +3FF000 +0FC000 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 18 23 2 0 +BITMAP +006600 +006600 +000000 +000000 +00FC00 +03FF00 +078780 +0E0180 +1801C0 +3800C0 +3000C0 +6000C0 +6000C0 +600180 +C00180 +C00380 +C00300 +C00600 +E00E00 +601C00 +787800 +3FF000 +0FC000 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 14 13 1 0 +BITMAP +2008 +701C +3838 +1C70 +0EE0 +07C0 +0780 +0F80 +1DC0 +38E0 +7070 +E038 +4010 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 20 19 1 0 +BITMAP +007E30 +01FF60 +03C3C0 +0701C0 +0C0360 +1C0660 +180C60 +301860 +303060 +3060C0 +60C0C0 +6181C0 +630180 +660300 +6C0700 +780E00 +303C00 +7FF800 +C7E000 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 24 3 0 +BITMAP +018000 +00C000 +006000 +003000 +000000 +180180 +180180 +180180 +180180 +300300 +300300 +300300 +300300 +600600 +600600 +600600 +600C00 +C00C00 +C01C00 +C01800 +E03800 +607000 +7FE000 +1F8000 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 24 3 0 +BITMAP +000C00 +001800 +003000 +006000 +000000 +180180 +180180 +180180 +180180 +300300 +300300 +300300 +300300 +600600 +600600 +600600 +600C00 +C00C00 +C01C00 +C01800 +E03800 +607000 +7FE000 +1F8000 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 24 3 0 +BITMAP +007000 +00D800 +018C00 +030600 +000000 +180180 +180180 +180180 +180180 +300300 +300300 +300300 +300300 +600600 +600600 +600600 +600C00 +C00C00 +C01C00 +C01800 +E03800 +607000 +7FE000 +1F8000 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 23 3 0 +BITMAP +018C00 +018C00 +000000 +000000 +180180 +180180 +180180 +180180 +300300 +300300 +300300 +300300 +600600 +600600 +600600 +600C00 +C00C00 +C01C00 +C01800 +E03800 +607000 +7FE000 +1F8000 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 15 24 5 0 +BITMAP +0060 +00C0 +0180 +0300 +0000 +C00E +C01C +C038 +6070 +60E0 +61C0 +3180 +3300 +3700 +3E00 +1C00 +1800 +1800 +1800 +3000 +3000 +3000 +3000 +3000 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 15 19 2 0 +BITMAP +0C00 +0C00 +0C00 +0C00 +1FF0 +1FFC +180E +1806 +3806 +3006 +300C +301C +7FF8 +7FE0 +6000 +6000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 12 19 3 0 +BITMAP +01E0 +07F0 +0E30 +0C30 +1830 +1830 +1860 +18E0 +3380 +33C0 +30E0 +3060 +6060 +6060 +6060 +60C0 +C1C0 +CF80 +CE00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 2 0 +BITMAP +0C00 +0600 +0300 +0180 +0000 +07C0 +1FE0 +3860 +3060 +00E0 +07C0 +1FC0 +78C0 +60C0 +C180 +C380 +C780 +FDC0 +78C0 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 2 0 +BITMAP +0060 +00C0 +0180 +0300 +0000 +07C0 +1FE0 +3860 +3060 +00E0 +07C0 +1FC0 +78C0 +61C0 +C180 +C380 +C780 +FDC0 +78C0 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +0180 +03C0 +0660 +0C30 +0000 +07C0 +1FE0 +3860 +3060 +00E0 +07C0 +1FC0 +78C0 +61C0 +C180 +C380 +C780 +FDC0 +78C0 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 2 0 +BITMAP +0710 +0DB0 +08E0 +0000 +07C0 +1FE0 +3860 +3060 +00E0 +07C0 +1FC0 +78C0 +61C0 +C180 +C380 +C780 +FDC0 +78C0 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 2 0 +BITMAP +0CC0 +0CC0 +0000 +0000 +07C0 +1FE0 +3860 +3060 +00E0 +07C0 +1FC0 +78C0 +61C0 +C180 +C380 +C780 +FDC0 +78C0 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 2 0 +BITMAP +0180 +03C0 +0240 +03C0 +0180 +07C0 +1FE0 +3860 +3060 +00E0 +07C0 +1FC0 +78C0 +61C0 +C180 +C380 +C780 +FDC0 +78C0 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 21 0 +BBX 20 14 2 0 +BITMAP +07E7C0 +1FEFE0 +383C70 +307030 +006030 +07E030 +1FFFF0 +78FFE0 +E0C000 +C1C000 +C1C0C0 +C7E1C0 +FF7F80 +7C3E00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 11 19 2 -5 +BITMAP +07C0 +0FE0 +1C60 +3060 +6000 +6000 +C000 +C000 +C000 +C000 +C180 +E380 +7F00 +3E00 +3000 +1800 +1800 +F800 +7000 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +0C00 +0600 +0300 +0180 +0000 +03C0 +0FE0 +1C70 +3830 +7030 +6030 +FFE0 +FFE0 +C000 +C000 +C0C0 +E1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +0030 +0060 +00C0 +0180 +0000 +03C0 +0FE0 +1C70 +3830 +7030 +6030 +FFE0 +FFE0 +C000 +C000 +C0C0 +E1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +0180 +03C0 +0660 +0C30 +0000 +03C0 +0FE0 +1C70 +3830 +7030 +6030 +FFE0 +FFE0 +C000 +C000 +C0C0 +E1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 2 0 +BITMAP +0660 +0660 +0000 +0000 +03C0 +0FE0 +1C70 +3830 +7030 +6030 +FFE0 +FFE0 +C000 +C000 +C0C0 +E1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 5 19 2 0 +BITMAP +C0 +60 +30 +18 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 8 19 2 0 +BITMAP +03 +06 +0C +18 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 8 19 2 0 +BITMAP +18 +3C +66 +C3 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 8 18 2 0 +BITMAP +33 +33 +00 +00 +18 +18 +18 +30 +30 +30 +30 +60 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +1860 +0D80 +0F00 +3180 +00C0 +07E0 +0FE0 +1C70 +3030 +6030 +6030 +C030 +C030 +C060 +C060 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 13 19 2 0 +BITMAP +0388 +06D8 +0470 +0000 +0000 +19C0 +1BF0 +1E30 +3830 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +0C00 +0600 +0300 +0180 +0000 +07C0 +0FE0 +1C70 +3030 +6030 +6030 +C030 +C030 +C060 +C060 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +00C0 +0180 +0300 +0600 +0000 +07C0 +0FE0 +1C70 +3030 +6030 +6030 +C030 +C030 +C060 +C060 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +0300 +0780 +0CC0 +1860 +0000 +07C0 +0FE0 +1C70 +3030 +6030 +6030 +C030 +C030 +C060 +C060 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 19 2 0 +BITMAP +0710 +0DB0 +08E0 +0000 +0000 +07C0 +0FE0 +1C70 +3030 +6030 +6030 +C030 +C030 +C060 +C060 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 12 18 2 0 +BITMAP +0660 +0660 +0000 +0000 +07C0 +0FE0 +1C70 +3030 +6030 +6030 +C030 +C030 +C060 +C060 +C0C0 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 12 12 2 1 +BITMAP +0300 +0300 +0300 +0000 +0000 +FFF0 +FFF0 +0000 +0000 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 13 0 +BBX 15 14 0 0 +BITMAP +01F6 +03FC +0718 +0C3C +186C +18CC +318C +330C +3618 +3C18 +3830 +30E0 +7FC0 +CF80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 3 0 +BITMAP +1800 +0C00 +0600 +0300 +0000 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +C780 +FD80 +7980 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 3 0 +BITMAP +0060 +00C0 +0180 +0300 +0000 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +C780 +FD80 +7980 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 19 3 0 +BITMAP +0300 +0780 +0CC0 +1860 +0000 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +C780 +FD80 +7980 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 18 3 0 +BITMAP +0660 +0660 +0000 +0000 +3030 +3030 +3030 +6060 +6060 +6060 +6060 +C0C0 +C0C0 +C0C0 +C1C0 +C780 +FD80 +7980 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 14 24 1 -5 +BITMAP +0030 +0060 +00C0 +0180 +0000 +300C +300C +301C +3818 +1830 +1870 +1860 +0CE0 +0CC0 +0D80 +0780 +0700 +0700 +0600 +0C00 +1C00 +3800 +F000 +E000 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 24 1 -5 +BITMAP +0600 +0600 +0600 +0600 +0C00 +0CF0 +0FF8 +0F1C +1C0C +180C +180C +1818 +3018 +3018 +3030 +3070 +78E0 +7FC0 +6780 +6000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 14 23 1 -5 +BITMAP +0660 +0660 +0000 +0000 +300C +300C +301C +3818 +1830 +1870 +1860 +0CE0 +0CC0 +0D80 +0780 +0700 +0700 +0600 +0C00 +1C00 +3800 +F000 +E000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 19 19 0 0 +BITMAP +003F80 +00FFC0 +01E0E0 +038060 +060060 +0E0000 +7FE000 +7FE000 +180000 +180000 +FFC000 +FFC000 +300000 +300180 +380380 +180700 +1E1E00 +0FFC00 +03F000 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvR08.bdf b/src/3rdparty/fonts/helvR08.bdf new file mode 100644 index 0000000000..84f55f3b14 --- /dev/null +++ b/src/3rdparty/fonts/helvR08.bdf @@ -0,0 +1,2595 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-R-Normal--8-80-75-75-P-46-ISO10646-1 +SIZE 8 75 75 +FONTBOUNDINGBOX 11 11 -1 -2 +COMMENT $XConsortium: helvR08.bdf,v 1.13 95/01/26 18:02:49 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 8 +POINT_SIZE 80 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 46 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 6 +X_HEIGHT 5 +FONT_ASCENT 8 +FONT_DESCENT 2 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2-1, 04-Dec-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 6 1 0 +BITMAP +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 3 0 +BBX 3 3 1 3 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 5 0 0 +BITMAP +50 +F8 +50 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 1 -1 +BITMAP +20 +70 +80 +60 +10 +E0 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 7 0 +BBX 6 6 1 0 +BITMAP +E8 +A8 +D0 +2C +54 +5C +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +40 +A0 +48 +A8 +B0 +58 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 1 3 1 3 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 7 1 -1 +BITMAP +40 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 7 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 3 0 +BBX 3 3 1 2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 5 5 1 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 3 0 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 1 2 2 +BITMAP +F0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 7 1 -1 +BITMAP +40 +40 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 2 6 2 0 +BITMAP +40 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +60 +90 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 3 6 2 0 +BITMAP +C0 +20 +C0 +20 +20 +C0 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +20 +20 +60 +F0 +20 +20 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 3 6 2 0 +BITMAP +E0 +80 +C0 +20 +20 +C0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +70 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +60 +90 +60 +90 +90 +60 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 4 1 0 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 6 0 -2 +BITMAP +40 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 4 0 +BBX 3 3 1 1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 3 5 2 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 3 5 2 0 +BITMAP +C0 +20 +40 +00 +40 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 9 0 +BBX 8 7 1 -1 +BITMAP +3E +41 +99 +A5 +9E +80 +78 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +E0 +90 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +70 +88 +80 +80 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +F0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 2 0 +BITMAP +F0 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +70 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 6 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +90 +A0 +C0 +E0 +90 +90 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 3 6 2 0 +BITMAP +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 7 0 +BBX 5 6 2 0 +BITMAP +88 +D8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +88 +C8 +A8 +A8 +98 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +70 +88 +88 +88 +88 +70 +20 +10 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +E0 +90 +90 +E0 +90 +90 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +70 +80 +E0 +10 +10 +E0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 4 0 +BBX 3 6 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +90 +90 +90 +90 +A0 +40 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 7 0 +BBX 7 6 1 0 +BITMAP +92 +92 +92 +6C +48 +48 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +90 +90 +60 +60 +90 +90 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +C8 +48 +48 +30 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 4 6 2 0 +BITMAP +F0 +10 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 7 1 -1 +BITMAP +C0 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 7 0 -1 +BITMAP +80 +80 +80 +40 +40 +40 +40 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 7 0 -1 +BITMAP +C0 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 5 0 +BBX 5 3 0 2 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 1 0 -1 +BITMAP +F8 +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 1 3 1 3 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 5 1 0 +BITMAP +C0 +20 +E0 +A0 +D0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 1 0 +BITMAP +80 +80 +E0 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 3 5 1 0 +BITMAP +60 +80 +80 +80 +60 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 1 0 +BITMAP +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 5 1 0 +BITMAP +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 7 1 0 +BITMAP +20 +40 +E0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 -1 +BITMAP +70 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 1 0 +BITMAP +80 +80 +E0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 1 7 1 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 2 9 0 -2 +BITMAP +40 +00 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +80 +80 +A0 +C0 +C0 +A0 +A0 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 1 7 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +F0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +E0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 -1 +BITMAP +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 -1 +BITMAP +70 +90 +90 +90 +70 +10 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 5 1 0 +BITMAP +A0 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 3 5 1 0 +BITMAP +60 +80 +60 +20 +C0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 7 1 0 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 5 1 0 +BITMAP +A0 +A0 +A0 +A0 +60 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +90 +90 +90 +A0 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +A8 +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +90 +90 +60 +90 +90 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 6 1 -1 +BITMAP +90 +90 +90 +60 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 3 5 1 0 +BITMAP +E0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 2 0 +BBX 3 7 0 -1 +BITMAP +20 +40 +40 +C0 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 2 0 +BBX 1 7 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 2 0 +BBX 3 7 0 -1 +BITMAP +80 +40 +40 +60 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 2 1 2 +BITMAP +48 +B0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 1 7 1 -2 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 3 7 1 -1 +BITMAP +40 +40 +A0 +80 +A0 +40 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 1 0 +BITMAP +30 +40 +E0 +40 +40 +F0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 5 0 0 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +88 +50 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 2 0 +BBX 1 7 1 -1 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 1 -2 +BITMAP +70 +80 +60 +90 +60 +30 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 4 1 0 5 +BITMAP +90 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 7 0 +BBX 6 7 1 -1 +BITMAP +78 +84 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 3 0 +BBX 3 5 0 1 +BITMAP +C0 +20 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 3 1 1 +BITMAP +50 +A0 +50 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +F0 +10 +10 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 1 0 2 +BITMAP +C0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 7 0 +BBX 6 7 1 -1 +BITMAP +78 +84 +B4 +B4 +AC +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 1 0 5 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 3 0 +BBX 3 3 1 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +20 +F0 +20 +00 +F0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 4 1 2 +BITMAP +80 +40 +80 +C0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 3 4 0 2 +BITMAP +E0 +60 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 4 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 6 1 -2 +BITMAP +A0 +A0 +A0 +E0 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 5 0 +BBX 5 8 0 -2 +BITMAP +78 +D0 +D0 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 1 2 1 1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 4 0 2 +BITMAP +40 +C0 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 3 0 +BBX 3 5 0 1 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 3 1 1 +BITMAP +A0 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +40 +C4 +48 +54 +2C +5E +04 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +40 +C4 +48 +5C +22 +44 +0E +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 7 0 +BBX 7 7 0 -1 +BITMAP +E0 +64 +28 +D4 +2C +5E +04 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 6 1 -1 +BITMAP +20 +00 +20 +40 +90 +60 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +10 +20 +00 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +28 +50 +00 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +50 +00 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +20 +50 +20 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 8 0 +BBX 7 6 1 0 +BITMAP +3E +30 +50 +7C +90 +9E +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +70 +88 +88 +80 +88 +70 +40 +80 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 9 2 0 +BITMAP +40 +20 +00 +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 9 2 0 +BITMAP +20 +40 +00 +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 9 2 0 +BITMAP +40 +A0 +00 +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 4 8 2 0 +BITMAP +A0 +00 +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +70 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +28 +50 +00 +88 +C8 +A8 +A8 +98 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 4 1 0 +BITMAP +90 +60 +60 +90 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 6 0 +BBX 5 8 1 -1 +BITMAP +08 +78 +88 +98 +A8 +C8 +F0 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +08 +10 +00 +C8 +48 +48 +30 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +80 +F0 +88 +88 +F0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 4 7 2 -1 +BITMAP +60 +90 +A0 +90 +90 +A0 +80 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 1 0 +BITMAP +80 +40 +00 +C0 +20 +E0 +A0 +D0 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 1 0 +BITMAP +20 +40 +00 +C0 +20 +E0 +A0 +D0 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 1 0 +BITMAP +40 +A0 +00 +C0 +20 +E0 +A0 +D0 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +60 +10 +70 +50 +68 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +C0 +20 +E0 +A0 +D0 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 4 8 1 0 +BITMAP +40 +A0 +40 +C0 +20 +E0 +A0 +D0 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +D0 +28 +F8 +A0 +D8 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 3 7 1 -2 +BITMAP +60 +80 +80 +80 +60 +40 +80 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 8 1 0 +BITMAP +40 +20 +00 +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 8 1 0 +BITMAP +20 +40 +00 +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 8 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 8 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 7 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 1 0 +BITMAP +90 +60 +A0 +70 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 1 0 +BITMAP +50 +A0 +00 +E0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 1 0 +BITMAP +40 +20 +00 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 1 0 +BITMAP +10 +20 +00 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 1 0 +BITMAP +40 +A0 +00 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 1 0 +BITMAP +50 +A0 +00 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 1 0 +BITMAP +90 +00 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +20 +00 +F0 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 7 7 0 -1 +BITMAP +02 +3C +48 +58 +68 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 8 1 0 +BITMAP +80 +40 +00 +A0 +A0 +A0 +A0 +60 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 8 1 0 +BITMAP +20 +40 +00 +A0 +A0 +A0 +A0 +60 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +A0 +A0 +A0 +A0 +60 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +60 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 9 1 -1 +BITMAP +10 +20 +00 +90 +90 +90 +60 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 7 1 -1 +BITMAP +80 +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 4 0 +BBX 4 8 1 -1 +BITMAP +50 +00 +90 +90 +90 +60 +40 +80 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +70 +E8 +80 +E0 +88 +70 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvR10.bdf b/src/3rdparty/fonts/helvR10.bdf new file mode 100644 index 0000000000..f327538ef6 --- /dev/null +++ b/src/3rdparty/fonts/helvR10.bdf @@ -0,0 +1,2864 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-R-Normal--10-100-75-75-P-56-ISO10646-1 +SIZE 10 75 75 +FONTBOUNDINGBOX 11 13 -1 -2 +COMMENT $XConsortium: helvR10.bdf,v 1.13 95/01/26 18:02:53 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 10 +POINT_SIZE 100 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 56 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 8 +X_HEIGHT 6 +FONT_ASCENT 10 +FONT_DESCENT 2 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 4 0 +BBX 3 2 1 6 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +7C +28 +F8 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +64 +94 +68 +08 +10 +16 +29 +26 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +20 +50 +50 +60 +A4 +98 +98 +64 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 5 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 0 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 10 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 4 0 +BBX 3 3 0 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 3 0 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 8 0 0 +BITMAP +20 +20 +40 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +08 +08 +30 +40 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +08 +30 +08 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +30 +50 +50 +90 +F8 +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +B0 +C8 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +10 +10 +20 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 6 1 0 +BITMAP +80 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +00 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 5 0 +BBX 4 3 0 2 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +60 +90 +10 +20 +40 +40 +00 +40 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 11 0 +BBX 10 10 0 -2 +BITMAP +1F00 +2080 +4D40 +9240 +A240 +A480 +A480 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +44 +7C +82 +82 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +84 +80 +80 +80 +80 +84 +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +F0 +88 +84 +84 +84 +84 +88 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +84 +80 +80 +8C +84 +8C +74 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +88 +90 +A0 +E0 +90 +90 +88 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +82 +C6 +C6 +AA +AA +92 +92 +92 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +C4 +C4 +A4 +A4 +94 +94 +8C +8C +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 7 9 1 -1 +BITMAP +78 +84 +84 +84 +84 +94 +8C +7C +02 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +80 +70 +08 +88 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +82 +82 +44 +44 +44 +28 +28 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +8880 +8880 +4900 +4900 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +88 +88 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +82 +44 +44 +28 +28 +10 +10 +10 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F8 +08 +10 +20 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 1 -2 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 8 0 0 +BITMAP +80 +80 +40 +40 +40 +40 +20 +20 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 0 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 6 0 +BBX 5 5 0 3 +BITMAP +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 0 5 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 6 0 0 +BITMAP +E0 +10 +70 +90 +90 +68 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +90 +80 +80 +90 +60 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +90 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 8 0 0 +BITMAP +30 +40 +E0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 1 8 0 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 1 9 0 -1 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +80 +80 +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 2 0 +BBX 1 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +EC +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +B0 +C8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +C8 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 6 0 0 +BITMAP +A0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +60 +90 +60 +10 +90 +60 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 8 0 0 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +90 +90 +90 +90 +90 +70 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +92 +92 +54 +54 +28 +28 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 8 0 -2 +BITMAP +90 +90 +A0 +A0 +60 +40 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 6 0 0 +BITMAP +F0 +10 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 3 0 +BBX 3 10 0 -2 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 10 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 3 0 +BBX 3 10 0 -2 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +64 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 1 8 1 -2 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +70 +A8 +A0 +A0 +A8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +E0 +40 +40 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 6 0 1 +BITMAP +90 +60 +90 +90 +60 +90 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +50 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 10 1 -2 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +C0 +70 +98 +C8 +70 +18 +88 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +38 +44 +9A +A2 +9A +44 +38 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 4 0 +BBX 3 5 0 3 +BITMAP +E0 +20 +A0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 1 0 3 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +38 +44 +BA +B2 +AA +44 +38 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 7 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 4 0 +BBX 4 4 0 3 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 3 +BITMAP +60 +A0 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 3 +BITMAP +E0 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 0 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 -2 +BITMAP +90 +90 +90 +90 +90 +F0 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +7C +E8 +E8 +E8 +68 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 1 0 3 +BITMAP +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 2 0 -2 +BITMAP +40 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 2 4 0 3 +BITMAP +40 +C0 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 4 0 +BBX 3 5 0 3 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +4200 +C400 +4400 +4800 +0900 +1300 +1780 +2100 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +42 +C4 +44 +48 +0B +15 +12 +27 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +E200 +4400 +2400 +C800 +0900 +1300 +1780 +2100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +20 +00 +20 +20 +40 +80 +90 +60 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +20 +10 +00 +10 +10 +28 +28 +44 +7C +82 +82 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +10 +10 +28 +28 +44 +7C +82 +82 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +28 +00 +10 +10 +28 +28 +44 +7C +82 +82 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +14 +28 +00 +10 +10 +28 +28 +44 +7C +82 +82 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +28 +00 +10 +10 +28 +28 +44 +7C +82 +82 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +10 +28 +10 +10 +10 +28 +28 +44 +7C +82 +82 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 10 0 +BBX 9 8 0 0 +BITMAP +1F80 +1800 +2800 +2F80 +4800 +7800 +8800 +8F80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 10 1 -2 +BITMAP +78 +84 +80 +80 +80 +80 +84 +78 +10 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +F8 +80 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +78 +44 +42 +F2 +42 +42 +44 +78 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +28 +50 +00 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +10 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +08 +10 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +10 +28 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +28 +50 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +48 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 8 0 +BBX 6 10 1 -1 +BITMAP +04 +78 +8C +94 +94 +A4 +A4 +C4 +78 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +10 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +10 +20 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +10 +28 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +08 +10 +00 +82 +44 +44 +28 +28 +10 +10 +10 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +80 +80 +F0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +60 +90 +90 +A0 +90 +90 +90 +A0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +E0 +10 +70 +90 +90 +68 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +E0 +10 +70 +90 +90 +68 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +E0 +10 +70 +90 +90 +68 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +50 +A0 +00 +E0 +10 +70 +90 +90 +68 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 8 0 0 +BITMAP +50 +00 +E0 +10 +70 +90 +90 +68 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +E0 +10 +70 +90 +90 +68 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 8 0 +BBX 7 6 0 0 +BITMAP +EC +12 +7E +90 +92 +6C +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 8 0 -2 +BITMAP +60 +90 +80 +80 +90 +60 +20 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +40 +20 +00 +60 +90 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +20 +40 +00 +60 +90 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +20 +50 +00 +60 +90 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +50 +00 +60 +90 +F0 +80 +90 +60 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 -1 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 2 9 0 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 9 -1 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 2 0 +BBX 3 8 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +60 +90 +78 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +50 +A0 +00 +E0 +90 +90 +90 +90 +90 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +74 +98 +A8 +C8 +88 +70 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +40 +20 +00 +90 +90 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +20 +40 +00 +90 +90 +90 +90 +90 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 9 0 0 +BITMAP +20 +50 +00 +90 +90 +90 +90 +90 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 5 0 +BBX 4 8 0 0 +BITMAP +50 +00 +90 +90 +90 +90 +90 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 11 0 -2 +BITMAP +10 +20 +00 +90 +90 +A0 +A0 +60 +40 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +B0 +C8 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 5 0 +BBX 4 10 0 -2 +BITMAP +50 +00 +90 +90 +A0 +A0 +60 +40 +40 +80 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 7 8 0 0 +BITMAP +3C +42 +F0 +40 +F0 +40 +42 +3C +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvR12.bdf b/src/3rdparty/fonts/helvR12.bdf new file mode 100644 index 0000000000..6fd46df276 --- /dev/null +++ b/src/3rdparty/fonts/helvR12.bdf @@ -0,0 +1,3046 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-R-Normal--12-120-75-75-P-67-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 14 15 -1 -3 +COMMENT $XConsortium: helvR12.bdf,v 1.15 95/01/26 18:02:58 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 67 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 9 +X_HEIGHT 7 +FONT_ASCENT 11 +FONT_DESCENT 3 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +28 +28 +FC +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +6200 +9400 +9400 +6800 +0800 +1300 +1480 +1480 +2300 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +30 +48 +48 +30 +50 +8A +84 +8C +72 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 1 -3 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 12 0 -3 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 5 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 3 1 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 5 1 1 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +10 +10 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 3 9 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +30 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +18 +28 +28 +48 +88 +FC +08 +08 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +80 +B0 +C8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +78 +08 +08 +88 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 6 1 0 +BITMAP +80 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 8 0 -2 +BITMAP +40 +00 +00 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 3 1 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 5 1 1 +BITMAP +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +10 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1F00 +6080 +4D40 +9240 +A240 +A240 +A680 +9B00 +4000 +3E00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +10 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +80 +80 +80 +42 +3C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +F8 +84 +82 +82 +82 +82 +82 +84 +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +3C +42 +80 +80 +8E +82 +82 +46 +3A +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +82 +82 +FE +82 +82 +82 +82 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +08 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 7 9 1 0 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8080 +C180 +C180 +A280 +A280 +9480 +9480 +8880 +8880 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +3C +42 +81 +81 +81 +89 +85 +42 +3D +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +F8 +84 +84 +84 +F8 +88 +84 +84 +84 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +78 +84 +80 +60 +18 +04 +84 +84 +78 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +44 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +8880 +8880 +8880 +4900 +5500 +5500 +2200 +2200 +2200 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +44 +44 +28 +10 +28 +44 +44 +82 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +FE +02 +04 +08 +10 +20 +40 +80 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 1 -3 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 9 0 0 +BITMAP +80 +80 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 0 -3 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 1 0 -2 +BITMAP +FE +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 0 6 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 9 0 0 +BITMAP +30 +40 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 12 0 -3 +BITMAP +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +A4 +DA +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +68 +98 +88 +88 +88 +98 +68 +08 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +80 +60 +10 +90 +60 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 9 7 0 0 +BITMAP +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +10 +20 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +30 +40 +40 +40 +40 +80 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 12 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 4 0 +BBX 4 12 0 -3 +BITMAP +C0 +20 +20 +20 +20 +10 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +64 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 1 10 1 -3 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +10 +70 +A8 +A0 +A0 +A0 +C8 +70 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +30 +48 +40 +40 +F0 +20 +20 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +84 +78 +48 +48 +78 +84 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 11 1 -2 +BITMAP +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 6 0 +BBX 5 12 0 -3 +BITMAP +70 +88 +80 +60 +90 +88 +88 +48 +30 +08 +88 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 1 0 8 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +A280 +A080 +A280 +9C80 +4100 +3E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 5 0 +BBX 3 5 1 4 +BITMAP +E0 +20 +A0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 4 1 2 +BITMAP +FC +04 +04 +04 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +3E00 +4100 +9C80 +9480 +9880 +9480 +9480 +4100 +3E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 8 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 5 0 +BBX 4 4 0 4 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 5 0 3 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 3 5 0 3 +BITMAP +E0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 2 0 +BBX 2 2 0 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +88 +88 +88 +88 +88 +98 +E8 +80 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 7 0 +BBX 6 12 0 -3 +BITMAP +3C +68 +E8 +E8 +E8 +68 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 3 0 +BBX 3 4 0 -3 +BITMAP +40 +20 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 2 5 1 3 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 5 0 +BBX 3 5 1 4 +BITMAP +E0 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +4100 +C200 +4400 +4400 +4900 +1300 +1500 +2780 +4100 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +4100 +C200 +4400 +4800 +4B00 +1480 +1100 +2200 +4780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 10 0 +BBX 9 9 0 0 +BITMAP +E100 +2200 +4400 +2400 +C900 +0B00 +1500 +1780 +2100 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 9 1 -3 +BITMAP +20 +00 +20 +20 +40 +40 +88 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +20 +10 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +28 +00 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +28 +10 +10 +10 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +1F80 +2800 +2800 +4800 +4F80 +7800 +8800 +8800 +8F80 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +3C +42 +80 +80 +80 +80 +80 +42 +3C +08 +08 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +10 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +28 +00 +FC +80 +80 +80 +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 12 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 12 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +7C +42 +41 +41 +F1 +41 +41 +42 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +14 +28 +00 +82 +C2 +A2 +A2 +92 +8A +8A +86 +82 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +10 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +04 +08 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +08 +14 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 12 1 0 +BITMAP +14 +28 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +24 +00 +3C +42 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 10 0 +BBX 10 11 0 -1 +BITMAP +0040 +1E80 +2100 +4280 +4480 +4480 +4880 +5080 +2100 +5E00 +8000 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +20 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +82 +82 +44 +44 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +80 +80 +F8 +84 +84 +84 +F8 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +B0 +88 +88 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +20 +10 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +10 +20 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +20 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +28 +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +50 +00 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +30 +48 +30 +70 +88 +08 +78 +88 +88 +74 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 11 0 +BBX 9 7 1 0 +BITMAP +7700 +8880 +0880 +7F80 +8800 +8880 +7700 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -3 +BITMAP +70 +88 +80 +80 +80 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +F8 +80 +88 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 10 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 9 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +68 +30 +50 +08 +78 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +B0 +C8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +3A +44 +4C +54 +64 +44 +B8 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -3 +BITMAP +10 +20 +00 +88 +88 +88 +90 +50 +50 +20 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +80 +80 +B0 +C8 +88 +88 +88 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -3 +BITMAP +50 +00 +88 +88 +48 +50 +50 +30 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +1E +21 +40 +F8 +40 +F8 +40 +21 +1E +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvR14.bdf b/src/3rdparty/fonts/helvR14.bdf new file mode 100644 index 0000000000..d05a31477f --- /dev/null +++ b/src/3rdparty/fonts/helvR14.bdf @@ -0,0 +1,3313 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-R-Normal--14-140-75-75-P-77-ISO10646-1 +SIZE 14 75 75 +FONTBOUNDINGBOX 15 17 -1 -3 +COMMENT $XConsortium: helvR14.bdf,v 1.14 95/01/26 18:03:02 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 14 +POINT_SIZE 140 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 77 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 11 +X_HEIGHT 8 +FONT_ASCENT 13 +FONT_DESCENT 3 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 11-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 11 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 5 0 +BBX 3 3 1 8 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +14 +14 +14 +7E +28 +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 14 0 -2 +BITMAP +10 +10 +7C +92 +92 +50 +38 +14 +12 +92 +92 +7C +10 +10 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +7080 +8900 +8900 +7200 +0200 +0400 +09C0 +1220 +1220 +21C0 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +30 +48 +48 +30 +20 +52 +8A +84 +8A +71 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 1 8 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 14 1 -3 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 3 14 1 -3 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 7 0 +BBX 5 4 1 6 +BITMAP +20 +F8 +20 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 4 0 -2 +BITMAP +40 +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 1 1 4 +BITMAP +FE +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 2 1 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 3 10 2 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +78 +84 +84 +08 +10 +20 +40 +80 +80 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +78 +84 +84 +04 +38 +04 +04 +84 +84 +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +0C +14 +24 +24 +44 +84 +FE +04 +04 +04 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +FC +80 +80 +80 +F8 +04 +04 +84 +84 +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +78 +84 +80 +80 +B8 +C4 +84 +84 +84 +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +FC +04 +08 +08 +10 +10 +20 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +78 +84 +84 +84 +78 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +78 +84 +84 +84 +84 +7C +04 +84 +84 +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 1 8 1 0 +BITMAP +80 +80 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 10 0 -2 +BITMAP +40 +40 +00 +00 +00 +00 +40 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 6 3 1 3 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +30 +CC +84 +84 +04 +08 +10 +20 +00 +20 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 13 0 +BBX 11 12 1 -1 +BITMAP +0F00 +30C0 +4020 +46A0 +8920 +9120 +9120 +9340 +8D80 +4000 +6080 +1F00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +0800 +0800 +1400 +1400 +2200 +2200 +4100 +7F00 +4100 +8080 +8080 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +86 +82 +82 +82 +FC +82 +82 +82 +82 +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +1C +63 +41 +80 +80 +80 +80 +80 +41 +63 +1C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +F8 +86 +82 +81 +81 +81 +81 +81 +82 +86 +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +80 +80 +80 +80 +FC +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +80 +80 +80 +80 +FC +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +1E00 +6180 +4080 +8000 +8000 +8780 +8080 +8080 +4080 +6380 +1C80 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +81 +81 +81 +81 +81 +FF +81 +81 +81 +81 +81 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 11 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +84 +84 +78 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +82 +84 +88 +90 +A0 +E0 +90 +88 +84 +82 +81 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 13 0 +BBX 11 11 1 0 +BITMAP +8020 +8020 +C060 +A0A0 +A0A0 +9120 +9120 +8A20 +8A20 +8420 +8420 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +C1 +C1 +A1 +91 +91 +89 +89 +85 +85 +83 +83 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +1C00 +6300 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +6300 +1C00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +86 +82 +82 +86 +FC +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +1C00 +6300 +4100 +8080 +8080 +8080 +8880 +8480 +4300 +6300 +1C80 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +86 +82 +82 +84 +F8 +84 +82 +82 +82 +82 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +C6 +82 +80 +60 +18 +06 +02 +82 +C6 +38 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +81 +81 +81 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 11 1 0 +BITMAP +8080 +8080 +4100 +4100 +2200 +2200 +2200 +1400 +1400 +0800 +0800 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 15 0 +BBX 13 11 1 0 +BITMAP +8208 +8208 +8508 +4510 +4510 +4510 +28A0 +28A0 +28A0 +1040 +1040 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +81 +81 +42 +24 +18 +18 +24 +42 +42 +81 +81 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +8080 +4100 +4100 +2200 +2200 +1400 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +02 +04 +08 +18 +10 +20 +60 +40 +80 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 14 1 -3 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 11 0 0 +BITMAP +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 3 14 0 -3 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 7 0 +BBX 7 4 0 6 +BITMAP +10 +28 +44 +82 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 8 1 0 -3 +BITMAP +FF +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 2 3 0 8 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 8 1 0 +BITMAP +78 +CC +04 +7C +C4 +84 +CC +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +B8 +CC +84 +84 +84 +84 +CC +B8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +CC +80 +80 +80 +84 +CC +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +04 +04 +04 +74 +CC +84 +84 +84 +84 +CC +74 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +CC +84 +FC +80 +80 +CC +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 4 11 0 0 +BITMAP +30 +40 +40 +E0 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 -3 +BITMAP +74 +CC +84 +84 +84 +84 +CC +74 +04 +CC +78 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +B8 +CC +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 11 1 0 +BITMAP +80 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 3 14 -1 -3 +BITMAP +20 +20 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +88 +90 +A0 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 3 0 +BBX 1 11 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 11 0 +BBX 9 8 1 0 +BITMAP +B300 +CC80 +8880 +8880 +8880 +8880 +8880 +8880 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +B8 +CC +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +CC +84 +84 +84 +84 +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 -3 +BITMAP +B8 +CC +84 +84 +84 +84 +CC +B8 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 -3 +BITMAP +74 +CC +84 +84 +84 +84 +CC +74 +04 +04 +04 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 8 1 0 +BITMAP +B0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +78 +84 +80 +78 +0C +04 +84 +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 10 0 0 +BITMAP +40 +40 +F0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +CC +74 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +48 +48 +48 +30 +30 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 8 0 0 +BITMAP +8880 +8880 +8880 +4900 +4900 +5500 +2200 +2200 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +C6 +44 +28 +10 +10 +28 +44 +C6 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -3 +BITMAP +82 +82 +44 +44 +24 +28 +18 +10 +10 +30 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 5 0 +BBX 5 14 0 -3 +BITMAP +18 +20 +20 +20 +20 +40 +80 +40 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 14 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 5 0 +BBX 5 14 0 -3 +BITMAP +C0 +20 +20 +20 +20 +10 +08 +10 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 8 0 +BBX 6 3 1 3 +BITMAP +64 +B4 +98 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 1 11 1 -3 +BITMAP +80 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 -1 +BITMAP +04 +78 +CC +90 +90 +A0 +A4 +CC +78 +80 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +3C +42 +40 +20 +20 +F8 +20 +40 +62 +DC +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 6 1 2 +BITMAP +84 +78 +48 +48 +78 +84 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +82 +82 +44 +44 +28 +FE +10 +FE +10 +10 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 3 0 +BBX 1 13 1 -2 +BITMAP +80 +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 5 14 2 -3 +BITMAP +70 +D8 +88 +C0 +70 +98 +88 +88 +C8 +70 +18 +88 +D8 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 0 9 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +1E00 +6180 +4C80 +9240 +9040 +9040 +9240 +4C80 +6180 +1E00 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 6 0 +BBX 4 7 1 4 +BITMAP +E0 +10 +70 +90 +D0 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +24 +48 +90 +48 +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 4 1 3 +BITMAP +FE +02 +02 +02 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 1 0 4 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +1E00 +6180 +5C80 +9240 +9240 +9C40 +9240 +5280 +6180 +1E00 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 1 0 9 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 6 0 +BBX 4 4 1 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +10 +10 +10 +FE +10 +10 +10 +00 +FE +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 6 0 4 +BITMAP +60 +90 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 6 0 4 +BITMAP +60 +90 +20 +10 +90 +60 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 2 2 2 9 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +CC +B4 +80 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 8 0 +BBX 7 14 0 -3 +BITMAP +3E +74 +F4 +F4 +F4 +74 +34 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 1 1 4 +BITMAP +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 4 3 0 -3 +BITMAP +20 +90 +60 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 2 6 1 4 +BITMAP +40 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 6 0 +BBX 4 7 1 4 +BITMAP +60 +90 +90 +90 +60 +00 +F0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +4100 +C200 +4200 +4400 +4400 +4880 +0980 +1280 +1480 +27C0 +2080 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 9 11 1 0 +BITMAP +4200 +C400 +4400 +4800 +4800 +5300 +1480 +2080 +2100 +4200 +4780 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 12 0 +BBX 11 11 0 0 +BITMAP +6080 +9100 +2100 +1200 +9200 +6440 +04C0 +0940 +0A40 +13E0 +1040 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 6 11 1 -3 +BITMAP +10 +10 +00 +10 +20 +40 +80 +84 +84 +CC +30 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1000 +0800 +0000 +0800 +0800 +1400 +1400 +2200 +2200 +4100 +7F00 +4100 +8080 +8080 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0400 +0800 +0000 +0800 +0800 +1400 +1400 +2200 +2200 +4100 +7F00 +4100 +8080 +8080 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0800 +1400 +0000 +0800 +0800 +1400 +1400 +2200 +2200 +4100 +7F00 +4100 +8080 +8080 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1A00 +2C00 +0000 +0800 +0800 +1400 +1400 +2200 +2200 +4100 +7F00 +4100 +8080 +8080 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +3600 +0000 +0800 +0800 +1400 +1400 +2200 +2200 +4100 +7F00 +4100 +8080 +8080 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +2200 +1C00 +0800 +0800 +1400 +1400 +2200 +2200 +4100 +7F00 +4100 +8080 +8080 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 14 0 +BBX 12 11 1 0 +BITMAP +0FF0 +1C00 +1400 +1400 +2400 +27E0 +4400 +7C00 +4400 +8400 +87F0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 14 1 -3 +BITMAP +1C +63 +41 +80 +80 +80 +80 +80 +41 +63 +1C +08 +24 +18 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +20 +10 +00 +FE +80 +80 +80 +80 +FC +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +08 +10 +00 +FE +80 +80 +80 +80 +FC +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +10 +28 +00 +FE +80 +80 +80 +80 +FC +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +FE +80 +80 +80 +80 +FC +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 14 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 3 14 1 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +D8 +00 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 11 0 0 +BITMAP +7C00 +4300 +4100 +4080 +4080 +F080 +4080 +4080 +4100 +4300 +7C00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +1A +2C +00 +C1 +C1 +A1 +91 +91 +89 +89 +85 +85 +83 +83 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1000 +0800 +0000 +1C00 +6300 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +6300 +1C00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0400 +0800 +0000 +1C00 +6300 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +6300 +1C00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0800 +1400 +0000 +1C00 +6300 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +6300 +1C00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1A00 +2C00 +0000 +1C00 +6300 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +6300 +1C00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +3600 +0000 +1C00 +6300 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +6300 +1C00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +82 +44 +28 +10 +28 +44 +82 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 11 0 +BBX 11 11 0 0 +BITMAP +0E20 +31C0 +2080 +4140 +4240 +4440 +4840 +5040 +2080 +7180 +8E00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +10 +08 +00 +81 +81 +81 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +04 +08 +00 +81 +81 +81 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +08 +14 +00 +81 +81 +81 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +66 +00 +81 +81 +81 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 9 14 0 0 +BITMAP +0400 +0800 +0000 +8080 +4100 +4100 +2200 +2200 +1400 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +80 +80 +FC +86 +82 +82 +86 +FC +80 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +88 +88 +B0 +90 +88 +88 +88 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +20 +10 +00 +78 +CC +04 +7C +C4 +84 +CC +76 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +08 +10 +00 +78 +CC +04 +7C +C4 +84 +CC +76 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +10 +28 +00 +78 +CC +04 +7C +C4 +84 +CC +76 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 11 1 0 +BITMAP +34 +58 +00 +78 +CC +04 +7C +C4 +84 +CC +76 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +6C +00 +78 +CC +04 +7C +C4 +84 +CC +76 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 7 12 1 0 +BITMAP +30 +48 +30 +00 +78 +CC +04 +7C +C4 +84 +CC +76 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 13 0 +BBX 11 8 1 0 +BITMAP +7BC0 +C660 +0420 +7FE0 +C400 +8400 +CE60 +7BC0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 -3 +BITMAP +78 +CC +80 +80 +80 +84 +CC +78 +10 +48 +30 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +10 +00 +78 +CC +84 +FC +80 +80 +CC +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +10 +20 +00 +78 +CC +84 +FC +80 +80 +CC +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +10 +28 +00 +78 +CC +84 +FC +80 +80 +CC +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +CC +00 +78 +CC +84 +FC +80 +80 +CC +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 0 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 2 11 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 11 0 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 3 0 +BBX 3 10 0 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +D8 +70 +90 +08 +7C +84 +84 +84 +84 +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +34 +58 +00 +B8 +CC +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +10 +00 +78 +CC +84 +84 +84 +84 +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +08 +10 +00 +78 +CC +84 +84 +84 +84 +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +30 +48 +00 +78 +CC +84 +84 +84 +84 +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +34 +58 +00 +78 +CC +84 +84 +84 +84 +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +CC +00 +78 +CC +84 +84 +84 +84 +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +10 +10 +00 +FE +00 +10 +10 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 8 0 +BBX 8 8 0 0 +BITMAP +3D +62 +46 +4A +52 +62 +46 +BC +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +20 +10 +00 +84 +84 +84 +84 +84 +84 +CC +74 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +08 +10 +00 +84 +84 +84 +84 +84 +84 +CC +74 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 11 1 0 +BITMAP +30 +48 +00 +84 +84 +84 +84 +84 +84 +CC +74 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +CC +00 +84 +84 +84 +84 +84 +84 +CC +74 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 14 0 -3 +BITMAP +08 +10 +00 +82 +C2 +44 +44 +24 +28 +18 +10 +10 +30 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 8 0 +BBX 6 14 1 -3 +BITMAP +80 +80 +80 +B8 +CC +84 +84 +84 +84 +CC +B8 +80 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -3 +BITMAP +6C +00 +82 +C2 +44 +44 +24 +28 +18 +10 +10 +30 +60 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 10 0 +BBX 9 11 0 0 +BITMAP +0E00 +3180 +2080 +4000 +FC00 +4000 +FC00 +4000 +2080 +3180 +0E00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvR18.bdf b/src/3rdparty/fonts/helvR18.bdf new file mode 100644 index 0000000000..9a72ab3aed --- /dev/null +++ b/src/3rdparty/fonts/helvR18.bdf @@ -0,0 +1,3861 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-R-Normal--18-180-75-75-P-98-ISO10646-1 +SIZE 18 75 75 +FONTBOUNDINGBOX 22 22 -2 -4 +COMMENT $XConsortium: helvR18.bdf,v 1.14 95/01/26 18:03:06 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 18 +POINT_SIZE 180 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 98 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 14 +X_HEIGHT 10 +FONT_ASCENT 16 +FONT_DESCENT 5 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 11-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 5 0 +BBX 5 5 0 9 +BITMAP +D8 +D8 +D8 +90 +90 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +0900 +0900 +0900 +7FC0 +7FC0 +1200 +1200 +1200 +FF80 +FF80 +2400 +2400 +2400 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 16 1 -2 +BITMAP +0800 +3E00 +7F00 +CB00 +C800 +E800 +7800 +3E00 +0F00 +0980 +C980 +EB80 +7F00 +3E00 +0800 +0800 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 16 0 +BBX 14 13 1 0 +BITMAP +7860 +FCC0 +CCC0 +CD80 +FD80 +7B00 +0300 +0678 +06FC +0CCC +0CCC +18FC +1878 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 13 1 0 +BITMAP +3C00 +7E00 +6600 +6600 +3C00 +7C00 +EEC0 +C6C0 +C3C0 +C380 +E7C0 +7EE0 +3C70 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 18 1 -4 +BITMAP +10 +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +10 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 4 18 1 -4 +BITMAP +80 +C0 +60 +60 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 7 0 +BBX 5 6 1 8 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +18 +18 +18 +18 +FF +FF +18 +18 +18 +18 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 5 1 -3 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 8 2 1 4 +BITMAP +FF +FF +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +18 +18 +10 +10 +30 +30 +20 +20 +60 +60 +40 +40 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +7E +66 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +7E +3C +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 5 13 2 0 +BITMAP +18 +F8 +F8 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +FE +C3 +03 +07 +0E +1C +38 +70 +E0 +C0 +FF +FF +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +7E +C3 +C3 +06 +1C +1E +07 +03 +C3 +C7 +7E +3C +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 1 0 +BITMAP +0300 +0700 +0F00 +1B00 +3300 +3300 +6300 +C300 +FF80 +FF80 +0300 +0300 +0300 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +FE +FE +C0 +C0 +FC +FE +C7 +03 +03 +C3 +C7 +FE +7C +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +7F +63 +C0 +C0 +DC +FE +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +FF +FF +03 +06 +0C +0C +18 +18 +30 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +7E +E7 +C3 +C3 +66 +7E +66 +C3 +C3 +E7 +7E +3C +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +3C +7E +C7 +C3 +C3 +C3 +7F +3B +03 +03 +C6 +FE +7C +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 2 13 1 -3 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +03 +0F +3C +70 +C0 +70 +3C +0F +03 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 7 6 2 2 +BITMAP +FE +FE +00 +00 +FE +FE +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +C0 +F0 +3C +0E +03 +0E +3C +F0 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 7 14 1 0 +BITMAP +7C +FE +C6 +C6 +0E +1C +38 +30 +30 +30 +00 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 18 0 +BBX 16 17 1 -3 +BITMAP +03F0 +0FFC +1C0E +3006 +63B3 +6773 +C633 +CC63 +CC66 +CC66 +CCCC +CFF8 +6770 +7000 +3800 +1FF0 +07E0 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 14 0 0 +BITMAP +0600 +0600 +0F00 +0F00 +1980 +1980 +30C0 +30C0 +3FC0 +7FE0 +6060 +6060 +C030 +C030 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C1C0 +C0C0 +C0C0 +C180 +FF80 +FFC0 +C0E0 +C060 +C060 +C0E0 +FFC0 +FF80 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +E000 +C000 +C000 +C000 +C000 +E000 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C1C0 +C0C0 +C060 +C060 +C060 +C060 +C060 +C060 +C0C0 +C1C0 +FF80 +FF00 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +C000 +C000 +C000 +C000 +FF00 +FF00 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +C000 +C000 +C000 +C000 +FF00 +FF00 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +E030 +C000 +C000 +C1F0 +C1F0 +E030 +6030 +7070 +3FF0 +0FB0 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +FFE0 +FFE0 +C060 +C060 +C060 +C060 +C060 +C060 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +C3 +C3 +E7 +7E +3C +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 12 14 1 0 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +F800 +FC00 +CE00 +C700 +C380 +C1C0 +C0E0 +C070 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +FF +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +C00C +C00C +E01C +E01C +F03C +F03C +D86C +D86C +CCCC +CCCC +C48C +C78C +C30C +C30C +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C060 +E060 +F060 +F060 +D860 +CC60 +CC60 +C660 +C660 +C360 +C1E0 +C1E0 +C0E0 +C060 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +E038 +C018 +C018 +C018 +C018 +E038 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FF00 +FF80 +C1C0 +C0C0 +C0C0 +C1C0 +FF80 +FF00 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 13 15 1 -1 +BITMAP +0F80 +3FE0 +7070 +6030 +E038 +C018 +C018 +C018 +C018 +E1B8 +61B0 +70F0 +3FE0 +0FB0 +0030 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FF00 +FF80 +C1C0 +C0C0 +C0C0 +C1C0 +FF80 +FF00 +C180 +C180 +C0C0 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +7FC0 +E0E0 +C060 +E000 +7C00 +1F00 +03C0 +00E0 +0060 +C060 +E0E0 +7FC0 +3F00 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +C030 +C030 +6060 +6060 +6060 +30C0 +30C0 +30C0 +1980 +1980 +1980 +0F00 +0F00 +0600 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 18 0 +BBX 16 14 1 0 +BITMAP +C183 +C183 +C183 +C3C3 +63C6 +6246 +6666 +6666 +366C +366C +342C +1C38 +1818 +1818 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C060 +E0E0 +60C0 +71C0 +3180 +1B00 +0E00 +0E00 +1B00 +3180 +71C0 +60C0 +E0E0 +C060 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +C030 +C030 +6060 +6060 +30C0 +30C0 +1980 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +00C0 +0180 +0300 +0600 +0C00 +1C00 +1800 +3000 +6000 +C000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 18 1 -4 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +C0 +C0 +40 +40 +60 +60 +20 +20 +30 +30 +10 +10 +18 +18 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 4 18 0 -4 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 9 0 +BBX 7 5 1 8 +BITMAP +10 +38 +6C +C6 +82 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 10 2 0 -4 +BITMAP +FFC0 +FFC0 +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +40 +80 +80 +C0 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +EE +C6 +0E +7E +E6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DE00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3E +7F +63 +C0 +C0 +C0 +C0 +63 +7F +3E +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0180 +0180 +0180 +0180 +3D80 +7F80 +6380 +C180 +C180 +C180 +C180 +6380 +7F80 +3D80 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7E +C3 +C3 +FF +C0 +C0 +E3 +7F +3C +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 6 14 0 0 +BITMAP +1C +3C +30 +30 +FC +FC +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +3D80 +7F80 +6180 +C180 +C180 +C180 +C180 +6380 +7F80 +3D80 +0180 +6300 +7F00 +1C00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +CE +DF +E3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 4 18 -1 -4 +BITMAP +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C6 +CC +D8 +F0 +F8 +D8 +CC +CE +C6 +C7 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 14 0 +BBX 12 10 1 0 +BITMAP +CC60 +DEF0 +E730 +C630 +C630 +C630 +C630 +C630 +C630 +C630 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +CE +DF +E3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +6300 +C180 +C180 +C180 +C180 +6300 +7F00 +3E00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +3D80 +7F80 +6380 +C180 +C180 +C180 +C180 +6380 +7F80 +3D80 +0180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +D8 +D8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +3C +7E +C6 +C0 +FC +3E +06 +C6 +FC +78 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 6 13 0 0 +BITMAP +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +30 +38 +18 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C7 +FB +73 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 10 1 0 +BITMAP +C630 +C630 +C630 +6660 +6660 +6960 +2940 +39C0 +1980 +1980 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C3 +E7 +66 +3C +18 +18 +3C +66 +E7 +C3 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +C3 +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +18 +18 +70 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FE +FE +06 +0C +18 +30 +60 +C0 +FE +FE +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 6 0 +BBX 6 18 0 -4 +BITMAP +0C +18 +30 +30 +30 +30 +30 +60 +C0 +60 +30 +30 +30 +30 +30 +30 +18 +0C +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 4 0 +BBX 2 18 1 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 6 0 +BBX 6 18 0 -4 +BITMAP +C0 +60 +30 +30 +30 +30 +30 +18 +0C +18 +30 +30 +30 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 3 1 4 +BITMAP +33 +7E +CC +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 2 14 2 -4 +BITMAP +C0 +C0 +00 +00 +40 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +3E +7F +6B +C8 +C8 +C8 +C8 +6B +7F +3E +10 +10 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +1E00 +3F00 +6180 +6180 +6000 +3000 +7E00 +1800 +1800 +3000 +6080 +FF80 +DF00 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 7 1 3 +BITMAP +C3 +FF +66 +66 +66 +FF +C3 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +C3 +C3 +66 +66 +66 +3C +FF +18 +FF +18 +18 +18 +18 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 4 0 +BBX 2 17 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +3C +7E +C3 +C3 +F0 +7C +6E +C7 +C3 +E3 +73 +3E +0E +07 +C3 +C3 +7E +3C +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 2 0 11 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +4010 +4710 +8888 +9008 +9008 +9008 +8888 +4710 +4010 +3060 +0F80 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 7 0 +BBX 5 8 1 6 +BITMAP +70 +C8 +38 +48 +D8 +68 +00 +F8 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 8 1 1 +BITMAP +12 +36 +6C +D8 +D8 +6C +36 +12 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 11 0 +BBX 9 5 1 3 +BITMAP +FF80 +FF80 +0180 +0180 +0180 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 2 1 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 14 0 +BBX 13 13 1 0 +BITMAP +0F80 +3060 +4010 +4F90 +8848 +8848 +8F88 +8908 +8888 +4850 +4010 +3060 +0F80 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 1 0 12 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 7 0 +BBX 5 5 1 8 +BITMAP +70 +D8 +88 +D8 +70 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +18 +18 +18 +FF +FF +18 +18 +18 +00 +FF +FF +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 8 0 5 +BITMAP +70 +F8 +98 +18 +30 +60 +F8 +F8 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 5 8 0 5 +BITMAP +70 +F8 +98 +30 +30 +98 +F8 +70 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 4 0 +BBX 4 3 0 11 +BITMAP +30 +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +DB +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +3F +72 +F2 +F2 +F2 +F2 +72 +32 +12 +12 +12 +12 +12 +12 +12 +12 +12 +12 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 2 2 1 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 5 0 +BBX 5 5 0 -4 +BITMAP +60 +70 +18 +D8 +F0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 3 8 1 5 +BITMAP +60 +E0 +E0 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 7 0 +BBX 5 8 1 6 +BITMAP +70 +D8 +88 +88 +D8 +70 +00 +F8 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 8 1 1 +BITMAP +90 +D8 +6C +36 +36 +6C +D8 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +6060 +E060 +E0C0 +6180 +6180 +6310 +6230 +6670 +0CF0 +0DB0 +19F8 +3030 +3030 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 13 13 1 0 +BITMAP +6060 +E060 +E0C0 +6180 +6180 +6370 +62F8 +6698 +0C18 +0C30 +1860 +30F8 +30F8 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 15 0 +BBX 14 13 0 0 +BITMAP +7030 +F830 +9860 +30C0 +30C0 +9988 +F918 +7338 +0678 +06D8 +0CFC +1818 +1818 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 10 0 +BBX 7 14 1 -4 +BITMAP +18 +18 +00 +00 +18 +18 +18 +38 +70 +E0 +C6 +C6 +FE +7C +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 18 0 0 +BITMAP +1800 +0C00 +0600 +0000 +0600 +0600 +0F00 +0F00 +1980 +1980 +30C0 +30C0 +3FC0 +7FE0 +6060 +6060 +C030 +C030 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 18 0 0 +BITMAP +0180 +0300 +0600 +0000 +0600 +0600 +0F00 +0F00 +1980 +1980 +30C0 +30C0 +3FC0 +7FE0 +6060 +6060 +C030 +C030 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 18 0 0 +BITMAP +0600 +0F00 +1980 +0000 +0600 +0600 +0F00 +0F00 +1980 +1980 +30C0 +30C0 +3FC0 +7FE0 +6060 +6060 +C030 +C030 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 18 0 0 +BITMAP +0C80 +1680 +1300 +0000 +0600 +0600 +0F00 +0F00 +1980 +1980 +30C0 +30C0 +3FC0 +7FE0 +6060 +6060 +C030 +C030 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 17 0 0 +BITMAP +1980 +1980 +0000 +0600 +0600 +0F00 +0F00 +1980 +1980 +30C0 +30C0 +3FC0 +7FE0 +6060 +6060 +C030 +C030 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 12 18 0 0 +BITMAP +0F00 +1980 +1980 +0F00 +0600 +0600 +0F00 +0F00 +1980 +1980 +30C0 +30C0 +3FC0 +7FE0 +6060 +6060 +C030 +C030 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 18 0 +BBX 16 14 1 0 +BITMAP +07FF +07FF +0D80 +0D80 +1980 +1980 +31FE +31FE +3F80 +7F80 +6180 +6180 +C1FF +C1FF +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +0F80 +3FE0 +7070 +6030 +E000 +C000 +C000 +C000 +C000 +E000 +6030 +7070 +3FE0 +0F80 +0E00 +0300 +1B00 +1E00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1800 +0C00 +0000 +FF80 +FF80 +C000 +C000 +C000 +C000 +FF00 +FF00 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0300 +0600 +0C00 +0000 +FF80 +FF80 +C000 +C000 +C000 +C000 +FF00 +FF00 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +1E00 +3300 +0000 +FF80 +FF80 +C000 +C000 +C000 +C000 +FF00 +FF00 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3300 +3300 +0000 +FF80 +FF80 +C000 +C000 +C000 +C000 +FF00 +FF00 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 4 18 0 0 +BITMAP +C0 +60 +30 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 4 18 2 0 +BITMAP +30 +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 6 18 0 0 +BITMAP +30 +78 +CC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 6 17 0 0 +BITMAP +CC +CC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +7F80 +7FC0 +60E0 +6060 +6030 +6030 +FC30 +FC30 +6030 +6030 +6060 +60E0 +7FC0 +7F80 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0C80 +1680 +1300 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C660 +C360 +C1E0 +C1E0 +C0E0 +C060 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0C00 +0600 +0300 +0000 +0F80 +3FE0 +7070 +6030 +E038 +C018 +C018 +C018 +C018 +E038 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +00C0 +0180 +0300 +0000 +0F80 +3FE0 +7070 +6030 +E038 +C018 +C018 +C018 +C018 +E038 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0780 +0CC0 +0000 +0F80 +3FE0 +7070 +6030 +E038 +C018 +C018 +C018 +C018 +E038 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0640 +0B40 +0980 +0000 +0F80 +3FE0 +7070 +6030 +E038 +C018 +C018 +C018 +C018 +E038 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0D80 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +E038 +C018 +C018 +C018 +C018 +E038 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +C0C0 +6180 +3300 +1E00 +0C00 +1E00 +3300 +6180 +C0C0 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +07CC +1FFC +3838 +3078 +70DC +61CC +638C +670C +6E0C +6C1C +3818 +7838 +FFF0 +C7C0 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1800 +0C00 +0600 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0300 +0600 +0C00 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0F00 +1980 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1980 +1980 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0180 +0300 +0600 +0000 +C030 +C030 +6060 +6060 +30C0 +30C0 +1980 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +C000 +C000 +C000 +FF00 +FF80 +C1C0 +C0C0 +C0C0 +C1C0 +FF80 +FF00 +C000 +C000 +C000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +38 +7C +C6 +C6 +C6 +C6 +DC +DC +C6 +C6 +C6 +C6 +DE +DC +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +60 +30 +18 +00 +7C +EE +C6 +0E +7E +E6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +0C +18 +30 +00 +7C +EE +C6 +0E +7E +E6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +18 +3C +66 +00 +7C +EE +C6 +0E +7E +E6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +32 +5A +4C +00 +7C +EE +C6 +0E +7E +E6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +6C +00 +7C +EE +C6 +0E +7E +E6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +38 +6C +6C +38 +7C +EE +C6 +0E +7E +E6 +C6 +C6 +EE +76 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +7DE0 +EFF0 +C618 +0E18 +7FF8 +E600 +C600 +C718 +EFF8 +75E0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +3E +7F +63 +C0 +C0 +C0 +C0 +63 +7F +3E +38 +0C +6C +78 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +60 +30 +18 +00 +3C +7E +C3 +C3 +FF +C0 +C0 +E3 +7F +3C +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +06 +0C +18 +00 +3C +7E +C3 +C3 +FF +C0 +C0 +E3 +7F +3C +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +18 +3C +66 +00 +3C +7E +C3 +C3 +FF +C0 +C0 +E3 +7F +3C +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +36 +36 +00 +3C +7E +C3 +C3 +FF +C0 +C0 +E3 +7F +3C +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 14 0 0 +BITMAP +C0 +60 +30 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 4 14 0 0 +BITMAP +30 +60 +C0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 6 14 -1 0 +BITMAP +30 +78 +CC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 4 0 +BBX 5 13 0 0 +BITMAP +D8 +D8 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +6000 +3600 +3800 +4C00 +3E00 +7F00 +6300 +C180 +C180 +C180 +C180 +6300 +7F00 +3E00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +32 +5A +4C +00 +CE +DF +E3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3000 +1800 +0C00 +0000 +3E00 +7F00 +6300 +C180 +C180 +C180 +C180 +6300 +7F00 +3E00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0600 +0C00 +1800 +0000 +3E00 +7F00 +6300 +C180 +C180 +C180 +C180 +6300 +7F00 +3E00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +1E00 +3300 +0000 +3E00 +7F00 +6300 +C180 +C180 +C180 +C180 +6300 +7F00 +3E00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1900 +2D00 +2600 +0000 +3E00 +7F00 +6300 +C180 +C180 +C180 +C180 +6300 +7F00 +3E00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +3600 +3600 +0000 +3E00 +7F00 +6300 +C180 +C180 +C180 +C180 +6300 +7F00 +3E00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 10 0 +BBX 8 8 1 1 +BITMAP +18 +18 +00 +FF +FF +00 +18 +18 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 11 0 +BBX 11 10 0 0 +BITMAP +0E60 +3FC0 +3180 +63C0 +66C0 +6CC0 +78C0 +3180 +7F80 +CE00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +30 +18 +0C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C7 +FB +73 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +06 +0C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C7 +FB +73 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +18 +3C +66 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C7 +FB +73 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +66 +66 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C7 +FB +73 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +06 +0C +18 +00 +C3 +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +18 +18 +70 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 10 0 +BBX 8 17 1 -4 +BITMAP +66 +66 +00 +C3 +C3 +C3 +66 +66 +66 +24 +3C +18 +18 +18 +18 +70 +70 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +07C0 +1FF0 +3838 +3018 +FE00 +FE00 +6000 +6000 +FE00 +FE00 +3018 +3838 +1FF0 +07C0 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/helvR24.bdf b/src/3rdparty/fonts/helvR24.bdf new file mode 100644 index 0000000000..39fdb49d81 --- /dev/null +++ b/src/3rdparty/fonts/helvR24.bdf @@ -0,0 +1,4715 @@ +STARTFONT 2.1 +FONT -Adobe-Helvetica-Medium-R-Normal--24-240-75-75-P-130-ISO10646-1 +SIZE 24 75 75 +FONTBOUNDINGBOX 28 29 -3 -5 +COMMENT $XConsortium: helvR24.bdf,v 1.13 95/01/26 18:03:10 gildea Exp $ +COMMENT +COMMENT + +COMMENT Copyright 1984-1989, 1994 Adobe Systems Incorporated. +COMMENT Copyright 1988, 1994 Digital Equipment Corporation. +COMMENT +COMMENT Adobe is a trademark of Adobe Systems Incorporated which may be +COMMENT registered in certain jurisdictions. +COMMENT Permission to use these trademarks is hereby granted only in +COMMENT association with the images described in this file. +COMMENT +COMMENT Permission to use, copy, modify, distribute and sell this software +COMMENT and its documentation for any purpose and without fee is hereby +COMMENT granted, provided that the above copyright notices appear in all +COMMENT copies and that both those copyright notices and this permission +COMMENT notice appear in supporting documentation, and that the names of +COMMENT Adobe Systems and Digital Equipment Corporation not be used in +COMMENT advertising or publicity pertaining to distribution of the software +COMMENT without specific, written prior permission. Adobe Systems and +COMMENT Digital Equipment Corporation make no representations about the +COMMENT suitability of this software for any purpose. It is provided "as +COMMENT is" without express or implied warranty. +COMMENT - +STARTPROPERTIES 28 +FOUNDRY "Adobe" +FAMILY_NAME "Helvetica" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 24 +POINT_SIZE 240 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 130 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CAP_HEIGHT 19 +X_HEIGHT 14 +FONT_ASCENT 22 +FONT_DESCENT 5 +FACE_NAME "Helvetica" +COPYRIGHT "Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved." +NOTICE "Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. " +_DEC_DEVICE_FONTNAMES "PS=Helvetica" +_DEC_PRODUCTINFO "DECwindows Fonts V2.2, 07-Nov-1991" +DEFAULT_CHAR 32 +RELATIVE_SETWIDTH 50 +RELATIVE_WEIGHT 50 +CHARSET_COLLECTIONS "ASCII ISO10646-1 ADOBE-STANDARD" +FULL_NAME "Helvetica" +ENDPROPERTIES +CHARS 230 +STARTCHAR space +ENCODING 32 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 19 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +00 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 355 0 +DWIDTH 8 0 +BBX 6 6 1 13 +BITMAP +CC +CC +CC +CC +CC +44 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 17 2 0 +BITMAP +0CC0 +0CC0 +0CC0 +1980 +FFE0 +FFE0 +1980 +1980 +3300 +3300 +FFE0 +FFE0 +3300 +3300 +6600 +6600 +6600 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 21 1 -2 +BITMAP +0600 +0600 +3F80 +7FC0 +E6E0 +C660 +C600 +E600 +7600 +3E00 +0F80 +07C0 +06E0 +0660 +C660 +C660 +E6E0 +7FC0 +3F80 +0600 +0600 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 889 0 +DWIDTH 22 0 +BBX 19 18 1 0 +BITMAP +000600 +3C0C00 +7E0C00 +C31800 +C31800 +C33000 +C33000 +7E6000 +3C6000 +00C000 +00C780 +018FC0 +019860 +031860 +031860 +061860 +060FC0 +040780 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 14 18 1 0 +BITMAP +0F00 +1F80 +39C0 +30C0 +30C0 +30C0 +1980 +0F00 +1E00 +3F18 +7398 +61D8 +C0F0 +C060 +C0F0 +E1D8 +7F9C +1E00 +ENDCHAR +STARTCHAR quoteright +ENCODING 39 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 2 6 2 13 +BITMAP +C0 +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 5 24 2 -5 +BITMAP +18 +18 +30 +30 +60 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +60 +30 +30 +18 +18 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 5 24 1 -5 +BITMAP +C0 +C0 +60 +60 +30 +30 +30 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +30 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 389 0 +DWIDTH 10 0 +BBX 7 7 1 12 +BITMAP +10 +10 +D6 +7C +38 +6C +44 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 12 12 1 1 +BITMAP +0600 +0600 +0600 +0600 +0600 +FFF0 +FFF0 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 6 2 -3 +BITMAP +C0 +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR minus +ENCODING 45 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 11 2 2 6 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 7 19 0 0 +BITMAP +06 +06 +06 +0C +0C +0C +18 +18 +18 +18 +30 +30 +30 +60 +60 +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1F00 +3F80 +71C0 +60C0 +60C0 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 6 18 2 0 +BITMAP +0C +0C +1C +FC +FC +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1E00 +7F80 +61C0 +C0C0 +C060 +C060 +0060 +00C0 +01C0 +0380 +0F00 +1C00 +3800 +7000 +E000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1F00 +7F80 +6180 +C0C0 +C0C0 +C0C0 +00C0 +0180 +0F00 +0FC0 +00C0 +0060 +0060 +C060 +C0C0 +61C0 +7F80 +1F00 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0180 +0380 +0380 +0780 +0F80 +0D80 +1980 +3980 +3180 +6180 +E180 +C180 +FFE0 +FFE0 +0180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +7FC0 +7FC0 +6000 +6000 +6000 +6000 +6E00 +7F80 +71C0 +00C0 +0060 +0060 +0060 +C060 +C0C0 +E1C0 +7F80 +1E00 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0F00 +3FC0 +70C0 +6060 +E060 +C000 +C000 +CF00 +DF80 +F1C0 +E0C0 +C060 +C060 +C060 +E060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +FFE0 +FFE0 +00E0 +00C0 +0180 +0180 +0300 +0300 +0600 +0600 +0C00 +0C00 +1C00 +1800 +1800 +3800 +3000 +3000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +3F80 +3180 +60C0 +60C0 +60C0 +60C0 +3180 +1F00 +3F80 +60C0 +E0E0 +C060 +C060 +C060 +71C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1F00 +7FC0 +71C0 +E0C0 +C060 +C060 +C060 +C060 +E0E0 +71E0 +7F60 +1E60 +0060 +00E0 +C0C0 +E1C0 +7F80 +1E00 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 17 2 -3 +BITMAP +C0 +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 12 1 1 +BITMAP +0030 +00F0 +03C0 +0F00 +3C00 +E000 +E000 +3C00 +0F00 +03C0 +00F0 +0030 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 10 6 2 5 +BITMAP +FFC0 +FFC0 +0000 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 12 12 1 1 +BITMAP +C000 +F000 +3C00 +0F00 +03C0 +0070 +0070 +03C0 +0F00 +3C00 +F000 +C000 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 556 0 +DWIDTH 12 0 +BBX 10 19 1 0 +BITMAP +1F00 +7F80 +71C0 +E0C0 +C0C0 +C1C0 +0180 +0380 +0700 +0600 +0C00 +0C00 +0C00 +0C00 +0000 +0000 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1015 0 +DWIDTH 25 0 +BBX 22 23 2 -4 +BITMAP +00FF00 +03FFC0 +0F01E0 +1C0070 +380018 +300018 +60730C +60FB0C +C1C70C +C3860C +C3060C +C6060C +C60C1C +C60C18 +C60C38 +E71C70 +63F7E0 +71E380 +380000 +1C0000 +0F0300 +07FF00 +00FC00 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +0380 +0380 +06C0 +06C0 +0C40 +0C60 +0C60 +1830 +1830 +1830 +3018 +3FF8 +3FF8 +600C +600C +600C +C006 +C006 +C006 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 14 19 2 0 +BITMAP +FFC0 +FFF0 +C070 +C018 +C018 +C018 +C018 +C030 +FFE0 +FFF0 +C018 +C00C +C00C +C00C +C00C +C01C +C038 +FFF0 +FFC0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 19 1 0 +BITMAP +07E0 +1FF8 +3C3C +700E +6006 +E006 +C000 +C000 +C000 +C000 +C000 +C000 +C003 +E003 +6006 +700E +3C3C +1FF8 +07E0 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 15 19 2 0 +BITMAP +FFC0 +FFF0 +C078 +C01C +C00C +C00E +C006 +C006 +C006 +C006 +C006 +C006 +C006 +C00E +C00C +C01C +C078 +FFF0 +FFC0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 12 19 2 0 +BITMAP +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 611 0 +DWIDTH 14 0 +BBX 11 19 2 0 +BITMAP +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 778 0 +DWIDTH 19 0 +BBX 16 19 1 0 +BITMAP +07E0 +1FF8 +3C3C +700E +6006 +E006 +C000 +C000 +C000 +C07F +C07F +C003 +C003 +E003 +6007 +700F +3C3F +1FFB +07E3 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 14 19 2 0 +BITMAP +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +FFFC +FFFC +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 2 19 3 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 10 19 1 0 +BITMAP +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7F80 +3F00 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 667 0 +DWIDTH 18 0 +BBX 15 19 2 0 +BITMAP +C038 +C070 +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +FE00 +E700 +C380 +C1C0 +C0E0 +C070 +C038 +C01C +C00E +C006 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 19 2 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 833 0 +DWIDTH 21 0 +BBX 17 19 2 0 +BITMAP +C00180 +E00380 +E00380 +F00780 +F00780 +D80D80 +D80D80 +D80D80 +CC1980 +CC1980 +CC1980 +C63180 +C63180 +C63180 +C36180 +C36180 +C36180 +C1C180 +C1C180 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 14 19 2 0 +BITMAP +E00C +F00C +F00C +D80C +DC0C +CC0C +CE0C +C60C +C70C +C30C +C38C +C18C +C1CC +C0CC +C0EC +C06C +C03C +C03C +C01C +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 16 19 1 0 +BITMAP +07E0 +1FF8 +3C3C +700E +6006 +E007 +C003 +C003 +C003 +C003 +C003 +C003 +C003 +E007 +6006 +700E +3C3C +1FF8 +07E0 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 13 19 2 0 +BITMAP +FFE0 +FFF0 +C030 +C018 +C018 +C018 +C018 +C030 +FFF0 +FFE0 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 16 19 1 0 +BITMAP +07E0 +1FF8 +3C3C +700E +6006 +E007 +C003 +C003 +C003 +C003 +C003 +C003 +C003 +E007 +60E6 +707E +3C1C +1FFE +07E7 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 722 0 +DWIDTH 17 0 +BBX 13 19 2 0 +BITMAP +FFE0 +FFF0 +C030 +C018 +C018 +C018 +C018 +C030 +FFF0 +FFE0 +C070 +C030 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +07C0 +1FF0 +3838 +7018 +6018 +6000 +7000 +3E00 +0FC0 +01F0 +0078 +001C +000C +C00C +C00C +E01C +7838 +3FF0 +0FC0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 611 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 14 19 2 0 +BITMAP +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +C006 +C006 +E00E +600C +701C +3018 +3018 +3838 +1830 +1830 +1C70 +0C60 +0C60 +0EE0 +06C0 +06C0 +0380 +0380 +0380 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 944 0 +DWIDTH 22 0 +BBX 20 19 1 0 +BITMAP +C06030 +C06030 +C06030 +C0F030 +60F060 +619860 +619860 +619860 +619860 +3198C0 +330CC0 +330CC0 +330CC0 +1B0D80 +1B0D80 +1E0780 +0E0700 +0C0300 +0C0300 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +C006 +E00E +701C +3018 +1830 +1C70 +0EE0 +07C0 +0380 +0380 +07C0 +0EE0 +0C60 +1C70 +3838 +3018 +600C +E00E +C006 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +C00C +E01C +6018 +7038 +3030 +3870 +1860 +1CE0 +0CC0 +0FC0 +0780 +0780 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 13 19 1 0 +BITMAP +FFF8 +FFF8 +0038 +0070 +00E0 +01C0 +01C0 +0380 +0700 +0700 +0E00 +1C00 +1C00 +3800 +7000 +7000 +E000 +FFF8 +FFF8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 4 24 2 -5 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 7 19 0 0 +BITMAP +C0 +C0 +C0 +60 +60 +60 +30 +30 +30 +30 +18 +18 +18 +0C +0C +0C +06 +06 +06 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 278 0 +DWIDTH 7 0 +BBX 4 24 1 -5 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 469 0 +DWIDTH 12 0 +BBX 10 9 1 10 +BITMAP +0C00 +0C00 +1E00 +1200 +3300 +6180 +6180 +C0C0 +C0C0 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 2 0 -5 +BITMAP +FFFC +FFFC +ENDCHAR +STARTCHAR quoteleft +ENCODING 96 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 2 6 2 13 +BITMAP +40 +80 +80 +C0 +C0 +C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +3F80 +61C0 +60C0 +00C0 +07C0 +3FC0 +78C0 +E0C0 +C0C0 +C1C0 +E3C0 +7EE0 +3C60 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 19 2 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +CF00 +DF80 +F1C0 +E0C0 +C060 +C060 +C060 +C060 +C060 +C060 +E0C0 +F1C0 +DF80 +CF00 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +1F00 +3F80 +71C0 +60C0 +C000 +C000 +C000 +C000 +C000 +C000 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 19 1 0 +BITMAP +0060 +0060 +0060 +0060 +0060 +1E60 +3F60 +71E0 +60E0 +C060 +C060 +C060 +C060 +C060 +C060 +60E0 +71E0 +3F60 +1E60 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +0E00 +3F80 +71C0 +60C0 +C060 +C060 +FFE0 +FFE0 +C000 +C000 +6060 +70E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 6 19 1 0 +BITMAP +1C +3C +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 19 1 -5 +BITMAP +1E60 +3F60 +71E0 +60E0 +C060 +C060 +C060 +C060 +C060 +C060 +60E0 +71E0 +3F60 +1E60 +0060 +C060 +E0C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 10 19 2 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +CE00 +DF80 +F180 +E0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 2 19 2 0 +BITMAP +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 4 24 0 -5 +BITMAP +30 +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 10 19 2 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C180 +C380 +C700 +CE00 +DC00 +F800 +FC00 +CE00 +C600 +C700 +C380 +C180 +C1C0 +C0C0 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 2 19 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 833 0 +DWIDTH 20 0 +BBX 16 14 2 0 +BITMAP +CE3C +FF7E +E3C7 +C183 +C183 +C183 +C183 +C183 +C183 +C183 +C183 +C183 +C183 +C183 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +CE00 +DF80 +F180 +E0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +3F80 +71C0 +60C0 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 19 2 -5 +BITMAP +CF00 +DF80 +F1C0 +E0C0 +C060 +C060 +C060 +C060 +C060 +C060 +E0C0 +F1C0 +DF80 +CF00 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 19 1 -5 +BITMAP +1E60 +3F60 +71E0 +60E0 +C060 +C060 +C060 +C060 +C060 +C060 +60E0 +71E0 +3F60 +1E60 +0060 +0060 +0060 +0060 +0060 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 333 0 +DWIDTH 9 0 +BBX 6 14 2 0 +BITMAP +CC +DC +FC +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3E00 +7F80 +E1C0 +C0C0 +C000 +F800 +7F00 +0F80 +01C0 +00C0 +C0C0 +C1C0 +FF80 +3F00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 6 18 1 0 +BITMAP +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +3C +1C +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +63C0 +7EC0 +1CC0 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C060 +C060 +C060 +60C0 +60C0 +71C0 +3180 +3180 +1B00 +1B00 +1B00 +0E00 +0E00 +0E00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 14 0 0 +BITMAP +C0C0C0 +C0C0C0 +61E180 +61E180 +61E180 +312300 +333300 +333300 +1B3600 +1A1600 +1E1E00 +0E1C00 +0C0C00 +0C0C00 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +C0C0 +E1C0 +6180 +3300 +3F00 +1E00 +0C00 +1E00 +1E00 +3300 +7380 +6180 +E1C0 +C0C0 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 12 19 0 -5 +BITMAP +C030 +C030 +6030 +7060 +3060 +38E0 +18C0 +18C0 +0D80 +0D80 +0780 +0700 +0300 +0300 +0600 +0600 +0C00 +3C00 +3800 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +0180 +0300 +0700 +0E00 +0C00 +1C00 +3800 +3000 +6000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 334 0 +DWIDTH 8 0 +BBX 6 24 1 -5 +BITMAP +0C +18 +30 +30 +30 +30 +30 +30 +30 +30 +60 +C0 +C0 +60 +30 +30 +30 +30 +30 +30 +30 +30 +18 +0C +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 260 0 +DWIDTH 6 0 +BBX 2 24 2 -5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 334 0 +DWIDTH 8 0 +BBX 6 24 1 -5 +BITMAP +C0 +60 +30 +30 +30 +30 +30 +30 +30 +30 +18 +0C +0C +18 +30 +30 +30 +30 +30 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 10 4 2 5 +BITMAP +70C0 +FCC0 +CFC0 +C380 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 333 0 +DWIDTH 6 0 +BBX 2 19 2 -5 +BITMAP +C0 +C0 +C0 +00 +00 +40 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 10 18 1 -2 +BITMAP +0180 +0180 +1F00 +3F80 +73C0 +66C0 +C600 +CC00 +CC00 +CC00 +D800 +D800 +D8C0 +71C0 +7F80 +3F00 +6000 +6000 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +1F80 +3FE0 +7070 +6030 +6000 +7000 +3000 +1800 +FF80 +FF80 +1800 +1800 +1800 +3000 +3000 +6730 +FFF0 +F0E0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 12 1 3 +BITMAP +C060 +EEE0 +7FC0 +3180 +60C0 +60C0 +60C0 +60C0 +3180 +7FC0 +EEE0 +C060 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 14 18 0 0 +BITMAP +E01C +6018 +7038 +3030 +3870 +1860 +1CE0 +0CC0 +3FF0 +3FF0 +0300 +3FF0 +3FF0 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 260 0 +DWIDTH 6 0 +BBX 2 23 2 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 24 1 -5 +BITMAP +1F00 +3F80 +71C0 +60C0 +70C0 +3800 +1C00 +7E00 +E700 +C380 +C1C0 +C0C0 +6060 +7060 +3860 +1CC0 +0F80 +0700 +0380 +61C0 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 2 1 16 +BITMAP +CC +CC +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 737 0 +DWIDTH 19 0 +BBX 17 17 1 0 +BITMAP +07F000 +1C1C00 +300600 +600300 +43E100 +C63180 +8C1080 +880080 +880080 +880080 +8C1080 +C63180 +43E100 +600300 +300600 +1C1C00 +07F000 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 370 0 +DWIDTH 9 0 +BBX 7 12 1 7 +BITMAP +78 +CC +CC +0C +7C +CC +CC +DC +76 +00 +FE +FE +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 9 8 2 3 +BITMAP +1980 +3300 +6600 +CC00 +CC00 +6600 +3300 +1980 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 584 0 +DWIDTH 15 0 +BBX 13 8 1 3 +BITMAP +FFF8 +FFF8 +0018 +0018 +0018 +0018 +0018 +0018 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 2 1 6 +BITMAP +FC +FC +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 737 0 +DWIDTH 19 0 +BBX 17 17 1 0 +BITMAP +07F000 +1C1C00 +300600 +600300 +43E100 +C21180 +821080 +821080 +83E080 +824080 +822080 +C22180 +421100 +600300 +300600 +1C1C00 +07F000 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 333 0 +DWIDTH 8 0 +BBX 6 2 1 16 +BITMAP +FC +FC +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 400 0 +DWIDTH 9 0 +BBX 8 7 0 11 +BITMAP +3C +66 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 12 13 1 0 +BITMAP +0600 +0600 +0600 +0600 +FFF0 +FFF0 +0600 +0600 +0600 +0600 +0000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 7 10 0 8 +BITMAP +3C +7E +C6 +06 +0C +18 +30 +60 +FE +FE +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 7 10 0 8 +BITMAP +7C +FE +C6 +06 +3C +3C +06 +C6 +FE +7C +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 4 1 15 +BITMAP +18 +30 +60 +C0 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 19 2 -5 +BITMAP +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +E3C0 +FEC0 +DCC0 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 537 0 +DWIDTH 12 0 +BBX 10 23 1 -4 +BITMAP +1FC0 +7FC0 +7980 +F980 +F980 +F980 +F980 +F980 +F980 +7980 +7980 +3980 +1980 +1980 +1980 +1980 +1980 +1980 +1980 +1980 +1980 +1980 +1980 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 5 6 1 -5 +BITMAP +60 +70 +18 +18 +F8 +70 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 333 0 +DWIDTH 7 0 +BBX 4 10 1 8 +BITMAP +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 365 0 +DWIDTH 9 0 +BBX 7 12 1 7 +BITMAP +38 +6C +C6 +C6 +C6 +C6 +C6 +6C +38 +00 +FE +FE +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 9 8 3 3 +BITMAP +CC00 +6600 +3300 +1980 +1980 +3300 +6600 +CC00 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 18 18 1 0 +BITMAP +301800 +301800 +F03000 +F03000 +306000 +306000 +30C000 +30C000 +318300 +318700 +030F00 +030F00 +061B00 +063300 +0C7FC0 +0C7FC0 +180300 +180300 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 18 18 1 0 +BITMAP +301800 +301800 +F03000 +F03000 +306000 +306000 +30C000 +30C000 +318780 +318FC0 +0318C0 +0300C0 +060180 +060300 +0C0600 +0C0C00 +181FC0 +181FC0 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 834 0 +DWIDTH 19 0 +BBX 19 18 0 0 +BITMAP +7C0C00 +FE0C00 +C61800 +061800 +3C3000 +3C3000 +066000 +C66000 +FEC180 +7CC380 +018780 +018780 +030D80 +031980 +063FE0 +063FE0 +0C0180 +0C0180 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 611 0 +DWIDTH 12 0 +BBX 10 19 1 -5 +BITMAP +0C00 +0C00 +0C00 +0000 +0000 +0C00 +0C00 +0C00 +0C00 +1800 +3800 +7000 +6000 +E0C0 +C0C0 +C1C0 +E380 +7F80 +3E00 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +0C00 +0600 +0300 +0180 +0000 +0380 +0380 +06C0 +06C0 +0C40 +0C60 +0C60 +1830 +1830 +1830 +3018 +3FF8 +3FF8 +600C +600C +600C +C006 +C006 +C006 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +0060 +00C0 +0180 +0300 +0000 +0380 +0380 +06C0 +06C0 +0C40 +0C60 +0C60 +1830 +1830 +1830 +3018 +3FF8 +3FF8 +600C +600C +600C +C006 +C006 +C006 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +0180 +03C0 +0660 +0C30 +0000 +0380 +0380 +06C0 +06C0 +0C40 +0C60 +0C60 +1830 +1830 +1830 +3018 +3FF8 +3FF8 +600C +600C +600C +C006 +C006 +C006 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 23 1 0 +BITMAP +0710 +0DB0 +08E0 +0000 +0380 +0380 +06C0 +06C0 +0C40 +0C60 +0C60 +1830 +1830 +1830 +3018 +3FF8 +3FF8 +600C +600C +600C +C006 +C006 +C006 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 23 1 0 +BITMAP +0C60 +0C60 +0000 +0000 +0380 +0380 +06C0 +06C0 +0C40 +0C60 +0C60 +1830 +1830 +1830 +3018 +3FF8 +3FF8 +600C +600C +600C +C006 +C006 +C006 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 667 0 +DWIDTH 17 0 +BBX 15 24 1 0 +BITMAP +0380 +06C0 +06C0 +0380 +0000 +0380 +0380 +06C0 +06C0 +0C40 +0C60 +0C60 +1830 +1830 +1830 +3018 +3FF8 +3FF8 +600C +600C +600C +C006 +C006 +C006 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 23 0 +BBX 21 19 1 0 +BITMAP +03FFF8 +03FFF8 +066000 +066000 +0C6000 +0C6000 +0C6000 +186000 +187FF8 +187FF8 +306000 +3FE000 +3FE000 +606000 +606000 +606000 +C06000 +C07FF8 +C07FF8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 16 24 1 -5 +BITMAP +07E0 +1FF8 +3C3C +700E +6006 +E006 +C000 +C000 +C000 +C000 +C000 +C000 +C003 +E003 +6006 +700E +3C3C +1FF8 +07E0 +0380 +00C0 +00C0 +07C0 +0380 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 12 24 2 0 +BITMAP +3000 +1800 +0C00 +0600 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 12 24 2 0 +BITMAP +0180 +0300 +0600 +0C00 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 12 24 2 0 +BITMAP +0600 +0F00 +1980 +30C0 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 12 23 2 0 +BITMAP +1980 +1980 +0000 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 5 24 1 0 +BITMAP +C0 +60 +30 +18 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 5 24 2 0 +BITMAP +18 +30 +60 +C0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 8 24 0 0 +BITMAP +18 +3C +66 +C3 +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 278 0 +DWIDTH 8 0 +BBX 6 23 1 0 +BITMAP +CC +CC +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 17 19 0 0 +BITMAP +3FF000 +3FFC00 +301E00 +300700 +300300 +300380 +300180 +300180 +FF0180 +FF0180 +300180 +300180 +300180 +300380 +300300 +300700 +301E00 +3FFC00 +3FF000 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 14 23 2 0 +BITMAP +0710 +0DB0 +08E0 +0000 +E00C +F00C +F00C +D80C +DC0C +CC0C +CE0C +C60C +C70C +C30C +C38C +C18C +C1CC +C0CC +C0EC +C06C +C03C +C03C +C01C +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 16 24 1 0 +BITMAP +0600 +0300 +0180 +00C0 +0000 +07E0 +1FF8 +3C3C +700E +6006 +E007 +C003 +C003 +C003 +C003 +C003 +C003 +C003 +E007 +6006 +700E +3C3C +1FF8 +07E0 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 16 24 1 0 +BITMAP +0030 +0060 +00C0 +0180 +0000 +07E0 +1FF8 +3C3C +700E +6006 +E007 +C003 +C003 +C003 +C003 +C003 +C003 +C003 +E007 +6006 +700E +3C3C +1FF8 +07E0 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 16 24 1 0 +BITMAP +0180 +03C0 +0660 +0C30 +0000 +07E0 +1FF8 +3C3C +700E +6006 +E007 +C003 +C003 +C003 +C003 +C003 +C003 +C003 +E007 +6006 +700E +3C3C +1FF8 +07E0 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 16 23 1 0 +BITMAP +0710 +0DB0 +08E0 +0000 +07E0 +1FF8 +3C3C +700E +6006 +E007 +C003 +C003 +C003 +C003 +C003 +C003 +C003 +E007 +6006 +700E +3C3C +1FF8 +07E0 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 16 23 1 0 +BITMAP +0660 +0660 +0000 +0000 +07E0 +1FF8 +3C3C +700E +6006 +E007 +C003 +C003 +C003 +C003 +C003 +C003 +C003 +E007 +6006 +700E +3C3C +1FF8 +07E0 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 13 12 0 1 +BITMAP +C018 +6030 +3060 +18C0 +0D80 +0700 +0700 +0D80 +18C0 +3060 +6030 +C018 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 778 0 +DWIDTH 18 0 +BBX 18 19 0 0 +BITMAP +03F040 +0FFCC0 +1E1F80 +380700 +300700 +700D80 +601980 +603180 +606180 +60C180 +618180 +630180 +660180 +6C0380 +380300 +380700 +7E1E00 +CFFC00 +83F000 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 14 24 2 0 +BITMAP +0C00 +0600 +0300 +0180 +0000 +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 14 24 2 0 +BITMAP +0060 +00C0 +0180 +0300 +0000 +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 14 24 2 0 +BITMAP +0300 +0780 +0CC0 +1860 +0000 +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 14 23 2 0 +BITMAP +0CC0 +0CC0 +0000 +0000 +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +C00C +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 14 24 1 0 +BITMAP +0060 +00C0 +0180 +0300 +0000 +C00C +E01C +6018 +7038 +3030 +3870 +1860 +1CE0 +0CC0 +0FC0 +0780 +0780 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 667 0 +DWIDTH 16 0 +BBX 13 19 2 0 +BITMAP +C000 +C000 +C000 +C000 +FFE0 +FFF0 +C030 +C018 +C018 +C018 +C018 +C030 +FFF0 +FFE0 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 611 0 +DWIDTH 15 0 +BBX 10 19 3 0 +BITMAP +1C00 +7F00 +E300 +C180 +C180 +C180 +C300 +C700 +CE00 +CF00 +C380 +C180 +C0C0 +C0C0 +C0C0 +C180 +C380 +CF00 +CE00 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +1800 +0C00 +0600 +0300 +0000 +1F00 +3F80 +61C0 +60C0 +00C0 +07C0 +3FC0 +78C0 +E0C0 +C0C0 +C1C0 +E3C0 +7EE0 +3C60 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0180 +0300 +0600 +0C00 +0000 +1F00 +3F80 +61C0 +60C0 +00C0 +07C0 +3FC0 +78C0 +E0C0 +C0C0 +C1C0 +E3C0 +7EE0 +3C60 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0600 +0F00 +1980 +30C0 +0000 +1F00 +3F80 +61C0 +60C0 +00C0 +07C0 +3FC0 +78C0 +E0C0 +C0C0 +C1C0 +E3C0 +7EE0 +3C60 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +1C40 +36C0 +2380 +0000 +0000 +1F00 +3F80 +61C0 +60C0 +00C0 +07C0 +3FC0 +78C0 +E0C0 +C0C0 +C1C0 +E3C0 +7EE0 +3C60 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1980 +1980 +0000 +0000 +1F00 +3F80 +61C0 +60C0 +00C0 +07C0 +3FC0 +78C0 +E0C0 +C0C0 +C1C0 +E3C0 +7EE0 +3C60 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0E00 +1B00 +1100 +1B00 +0E00 +1F00 +3F80 +61C0 +60C0 +00C0 +07C0 +3FC0 +78C0 +E0C0 +C0C0 +C1C0 +E3C0 +7EE0 +3C60 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 889 0 +DWIDTH 21 0 +BBX 19 14 1 0 +BITMAP +1F0E00 +3FBF80 +61F1C0 +60E0C0 +00C060 +07C060 +3FFFE0 +78FFE0 +E0C000 +C0C000 +C1E060 +E3F0E0 +7E3FC0 +3C0F00 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 12 0 +BBX 10 19 1 -5 +BITMAP +1F00 +3F80 +71C0 +60C0 +C000 +C000 +C000 +C000 +C000 +C000 +60C0 +71C0 +3F80 +1F00 +1C00 +0600 +0600 +3E00 +1C00 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +1800 +0C00 +0600 +0300 +0000 +0E00 +3F80 +71C0 +60C0 +C060 +C060 +FFE0 +FFE0 +C000 +C000 +6060 +70E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0180 +0300 +0600 +0C00 +0000 +0E00 +3F80 +71C0 +60C0 +C060 +C060 +FFE0 +FFE0 +C000 +C000 +6060 +70E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0600 +0F00 +1980 +30C0 +0000 +0E00 +3F80 +71C0 +60C0 +C060 +C060 +FFE0 +FFE0 +C000 +C000 +6060 +70E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1980 +1980 +0000 +0000 +0E00 +3F80 +71C0 +60C0 +C060 +C060 +FFE0 +FFE0 +C000 +C000 +6060 +70E0 +3FC0 +0F00 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 5 19 0 0 +BITMAP +C0 +60 +30 +18 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 5 19 1 0 +BITMAP +18 +30 +60 +C0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 8 19 -1 0 +BITMAP +18 +3C +66 +C3 +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 278 0 +DWIDTH 6 0 +BBX 6 18 0 0 +BITMAP +CC +CC +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +E000 +7180 +1E00 +3C00 +C600 +1F00 +3F80 +71C0 +60C0 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 18 2 0 +BITMAP +3880 +6D80 +4700 +0000 +CE00 +DF80 +F180 +E0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +1800 +0C00 +0600 +0300 +0000 +1F00 +3F80 +71C0 +60C0 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0180 +0300 +0600 +0C00 +0000 +1F00 +3F80 +71C0 +60C0 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 19 1 0 +BITMAP +0600 +0F00 +1980 +30C0 +0000 +1F00 +3F80 +71C0 +60C0 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1C40 +36C0 +2380 +0000 +1F00 +3F80 +71C0 +60C0 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 556 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +3180 +3180 +0000 +0000 +1F00 +3F80 +71C0 +60C0 +C060 +C060 +C060 +C060 +C060 +C060 +60C0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 584 0 +DWIDTH 14 0 +BBX 12 12 1 1 +BITMAP +0600 +0600 +0600 +0000 +0000 +FFF0 +FFF0 +0000 +0000 +0600 +0600 +0600 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 611 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0F98 +1FF0 +38E0 +3060 +60F0 +61B0 +6330 +6630 +6630 +6C30 +3860 +30E0 +7FC0 +CF80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 19 2 0 +BITMAP +3000 +1800 +0C00 +0600 +0000 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +63C0 +7EC0 +1CC0 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 19 2 0 +BITMAP +0180 +0300 +0600 +0C00 +0000 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +63C0 +7EC0 +1CC0 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 19 2 0 +BITMAP +0C00 +1E00 +3300 +6180 +0000 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +63C0 +7EC0 +1CC0 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 10 18 2 0 +BITMAP +3300 +3300 +0000 +0000 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +63C0 +7EC0 +1CC0 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 12 24 0 -5 +BITMAP +00C0 +0180 +0300 +0600 +0000 +C030 +C030 +6030 +7060 +3060 +38E0 +18C0 +18C0 +0D80 +0D80 +0780 +0700 +0300 +0300 +0600 +0600 +0C00 +3C00 +3800 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 556 0 +DWIDTH 14 0 +BBX 11 24 2 -5 +BITMAP +C000 +C000 +C000 +C000 +C000 +CF00 +DF80 +F1C0 +E0C0 +C060 +C060 +C060 +C060 +C060 +C060 +E0C0 +F1C0 +DF80 +CF00 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 13 0 +BBX 12 23 0 -5 +BITMAP +1980 +1980 +0000 +0000 +C030 +C030 +6030 +7060 +3060 +38E0 +18C0 +18C0 +0D80 +0D80 +0780 +0700 +0300 +0300 +0600 +0600 +0C00 +3C00 +3800 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 722 0 +DWIDTH 18 0 +BBX 18 19 -1 0 +BITMAP +01F800 +07FE00 +0F0F00 +1C0380 +180180 +380180 +FFC000 +FFC000 +300000 +300000 +FFC000 +FFC000 +3000C0 +3800C0 +180180 +1C0380 +0F0F00 +07FE00 +01F800 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/micro.bdf b/src/3rdparty/fonts/micro.bdf new file mode 100644 index 0000000000..c016165200 --- /dev/null +++ b/src/3rdparty/fonts/micro.bdf @@ -0,0 +1,1548 @@ +STARTFONT 2.1 +COMMENT $XFree86: xc/fonts/bdf/misc/micro.bdf,v 1.1 1999/09/25 14:36:34 dawes Exp $ +FONT micro +SIZE 4 75 75 +FONTBOUNDINGBOX 4 5 0 0 +STARTPROPERTIES 3 +FONT_DESCENT 0 +FONT_ASCENT 5 +COPYRIGHT "Public domain font. Share and enjoy." +ENDPROPERTIES +CHARS 128 +STARTCHAR C000 +ENCODING 0 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +e0 +e0 +00 +ENDCHAR +STARTCHAR C001 +ENCODING 1 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +40 +40 +60 +40 +ENDCHAR +STARTCHAR C002 +ENCODING 2 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +00 +a0 +c0 +a0 +ENDCHAR +STARTCHAR C003 +ENCODING 3 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +a0 +e0 +a0 +c0 +ENDCHAR +STARTCHAR C004 +ENCODING 4 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +40 +e0 +a0 +00 +ENDCHAR +STARTCHAR C005 +ENCODING 5 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +00 +e0 +20 +00 +ENDCHAR +STARTCHAR C006 +ENCODING 6 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +80 +c0 +80 +40 +ENDCHAR +STARTCHAR C007 +ENCODING 7 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +00 +e0 +a0 +a0 +ENDCHAR +STARTCHAR C010 +ENCODING 8 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +40 +40 +40 +a0 +ENDCHAR +STARTCHAR C011 +ENCODING 9 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +a0 +40 +c0 +80 +ENDCHAR +STARTCHAR C012 +ENCODING 10 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +80 +40 +a0 +c0 +ENDCHAR +STARTCHAR C013 +ENCODING 11 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +60 +40 +40 +40 +ENDCHAR +STARTCHAR C014 +ENCODING 12 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +40 +e0 +40 +e0 +ENDCHAR +STARTCHAR C015 +ENCODING 13 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +00 +40 +e0 +40 +ENDCHAR +STARTCHAR C016 +ENCODING 14 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +00 +40 +00 +40 +ENDCHAR +STARTCHAR C017 +ENCODING 15 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +20 +60 +a0 +c0 +ENDCHAR +STARTCHAR C020 +ENCODING 16 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +60 +80 +80 +60 +ENDCHAR +STARTCHAR C021 +ENCODING 17 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +c0 +20 +20 +c0 +ENDCHAR +STARTCHAR C022 +ENCODING 18 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +a0 +a0 +a0 +00 +ENDCHAR +STARTCHAR C023 +ENCODING 19 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +a0 +40 +00 +ENDCHAR +STARTCHAR C024 +ENCODING 20 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +e0 +a0 +a0 +40 +ENDCHAR +STARTCHAR C025 +ENCODING 21 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +20 +60 +20 +e0 +ENDCHAR +STARTCHAR C026 +ENCODING 22 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +00 +a0 +40 +a0 +ENDCHAR +STARTCHAR C027 +ENCODING 23 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +20 +e0 +80 +40 +ENDCHAR +STARTCHAR C030 +ENCODING 24 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +60 +e0 +60 +20 +ENDCHAR +STARTCHAR C031 +ENCODING 25 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +c0 +e0 +c0 +80 +ENDCHAR +STARTCHAR C032 +ENCODING 26 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +e0 +40 +e0 +80 +ENDCHAR +STARTCHAR C033 +ENCODING 27 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +e0 +a0 +e0 +40 +ENDCHAR +STARTCHAR C034 +ENCODING 28 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +40 +80 +40 +e0 +ENDCHAR +STARTCHAR C035 +ENCODING 29 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +40 +20 +40 +e0 +ENDCHAR +STARTCHAR C036 +ENCODING 30 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +00 +e0 +00 +e0 +ENDCHAR +STARTCHAR C037 +ENCODING 31 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +a0 +a0 +40 +00 +ENDCHAR +STARTCHAR C040 +ENCODING 32 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR ! +ENCODING 33 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +c0 +c0 +00 +c0 +ENDCHAR +STARTCHAR " +ENCODING 34 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +00 +00 +00 +ENDCHAR +STARTCHAR # +ENCODING 35 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +e0 +a0 +e0 +a0 +ENDCHAR +STARTCHAR $ +ENCODING 36 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +e0 +c0 +60 +e0 +ENDCHAR +STARTCHAR % +ENCODING 37 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +60 +c0 +a0 +00 +ENDCHAR +STARTCHAR & +ENCODING 38 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +40 +e0 +c0 +40 +ENDCHAR +STARTCHAR ' +ENCODING 39 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +60 +00 +00 +00 +ENDCHAR +STARTCHAR ( +ENCODING 40 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +40 +40 +40 +20 +ENDCHAR +STARTCHAR ) +ENCODING 41 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR * +ENCODING 42 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +40 +e0 +40 +a0 +ENDCHAR +STARTCHAR + +ENCODING 43 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +40 +e0 +40 +00 +ENDCHAR +STARTCHAR , +ENCODING 44 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +00 +00 +40 +c0 +ENDCHAR +STARTCHAR - +ENCODING 45 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +00 +e0 +00 +00 +ENDCHAR +STARTCHAR . +ENCODING 46 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +00 +00 +c0 +c0 +ENDCHAR +STARTCHAR / +ENCODING 47 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR 0 +ENCODING 48 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +a0 +a0 +a0 +40 +ENDCHAR +STARTCHAR 1 +ENCODING 49 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +c0 +40 +40 +40 +ENDCHAR +STARTCHAR 2 +ENCODING 50 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +20 +40 +80 +e0 +ENDCHAR +STARTCHAR 3 +ENCODING 51 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +20 +60 +20 +e0 +ENDCHAR +STARTCHAR 4 +ENCODING 52 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +a0 +e0 +20 +ENDCHAR +STARTCHAR 5 +ENCODING 53 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +80 +c0 +20 +c0 +ENDCHAR +STARTCHAR 6 +ENCODING 54 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +80 +e0 +a0 +e0 +ENDCHAR +STARTCHAR 7 +ENCODING 55 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +20 +20 +40 +40 +ENDCHAR +STARTCHAR 8 +ENCODING 56 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +e0 +a0 +e0 +ENDCHAR +STARTCHAR 9 +ENCODING 57 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +e0 +20 +c0 +ENDCHAR +STARTCHAR : +ENCODING 58 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +c0 +00 +c0 +c0 +ENDCHAR +STARTCHAR ; +ENCODING 59 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +c0 +00 +40 +c0 +ENDCHAR +STARTCHAR < +ENCODING 60 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR = +ENCODING 61 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +00 +e0 +00 +ENDCHAR +STARTCHAR > +ENCODING 62 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR ? +ENCODING 63 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +20 +60 +00 +40 +ENDCHAR +STARTCHAR @ +ENCODING 64 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +a0 +c0 +80 +60 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +e0 +a0 +a0 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +c0 +a0 +e0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +80 +80 +80 +e0 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +a0 +a0 +a0 +c0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +80 +e0 +80 +e0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +80 +e0 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +80 +a0 +a0 +e0 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +e0 +a0 +a0 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +40 +40 +40 +e0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +20 +20 +a0 +e0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +c0 +a0 +a0 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +80 +80 +80 +e0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +e0 +a0 +a0 +a0 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +a0 +a0 +a0 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +a0 +a0 +e0 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +e0 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +a0 +c0 +60 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +a0 +c0 +a0 +a0 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +80 +e0 +20 +e0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +a0 +a0 +e0 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +a0 +a0 +40 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +a0 +e0 +a0 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +e0 +40 +e0 +a0 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +a0 +a0 +e0 +40 +40 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +e0 +20 +40 +80 +e0 +ENDCHAR +STARTCHAR [ +ENCODING 91 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +40 +40 +40 +60 +ENDCHAR +STARTCHAR \ +ENCODING 92 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR ] +ENCODING 93 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +40 +40 +40 +c0 +ENDCHAR +STARTCHAR ^ +ENCODING 94 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +a0 +00 +00 +00 +ENDCHAR +STARTCHAR _ +ENCODING 95 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +00 +00 +00 +e0 +ENDCHAR +STARTCHAR ` +ENCODING 96 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +60 +00 +00 +00 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +60 +a0 +e0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +e0 +a0 +a0 +e0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +80 +80 +e0 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +20 +e0 +a0 +a0 +e0 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +a0 +c0 +e0 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +80 +c0 +80 +80 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +a0 +60 +e0 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +e0 +a0 +a0 +a0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +40 +40 +40 +40 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +20 +20 +a0 +e0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +80 +a0 +c0 +c0 +a0 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +a0 +e0 +a0 +a0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +a0 +a0 +a0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +a0 +a0 +e0 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +a0 +e0 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +a0 +e0 +20 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +a0 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +c0 +60 +e0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +e0 +40 +40 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +a0 +a0 +a0 +e0 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +a0 +a0 +a0 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +a0 +a0 +e0 +a0 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +a0 +40 +40 +a0 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +a0 +a0 +60 +c0 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +e0 +60 +c0 +e0 +ENDCHAR +STARTCHAR { +ENCODING 123 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +40 +c0 +40 +60 +ENDCHAR +STARTCHAR | +ENCODING 124 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR } +ENCODING 125 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +c0 +40 +60 +40 +c0 +ENDCHAR +STARTCHAR ~ +ENCODING 126 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +00 +c0 +60 +00 +00 +ENDCHAR +STARTCHAR C177 +ENCODING 127 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 4 5 0 0 +BITMAP +60 +40 +40 +40 +c0 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/fonts/unifont.bdf b/src/3rdparty/fonts/unifont.bdf new file mode 100644 index 0000000000..de8f960e62 --- /dev/null +++ b/src/3rdparty/fonts/unifont.bdf @@ -0,0 +1,801998 @@ +STARTFONT 2.1 +FONT -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1 +SIZE 16 75 75 +FONTBOUNDINGBOX 16 16 0 -2 +STARTPROPERTIES 3 +FONT_ASCENT 14 +FONT_DESCENT 2 +DEFAULT_CHAR 32 +ENDPROPERTIES +CHARS 34869 +STARTCHAR U+0000 +ENCODING 0 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4A50 +6A50 +5A50 +499E +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0001 +ENCODING 1 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3992 +4252 +325E +0A52 +7192 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0002 +ENCODING 2 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3BA4 +4124 +3118 +0924 +7124 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0003 +ENCODING 3 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7BA4 +4124 +7918 +4124 +7924 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0004 +ENCODING 4 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +79BE +4248 +7A48 +4248 +7988 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0005 +ENCODING 5 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7A4C +4252 +7B52 +42D6 +7A4E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0006 +ENCODING 6 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +31A4 +4A28 +7A30 +4A28 +49A4 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0007 +ENCODING 7 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +73D0 +4A10 +73D0 +4A10 +73DE +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0008 +ENCODING 8 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +78E0 +4500 +78C0 +4420 +79C0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0009 +ENCODING 9 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +45F0 +4440 +7C40 +4440 +4440 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+000A +ENCODING 10 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +41F0 +4100 +41F0 +4100 +7D00 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+000B +ENCODING 11 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +45F0 +4440 +4440 +2840 +1040 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+000C +ENCODING 12 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7DF0 +4100 +7DF0 +4100 +4100 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+000D +ENCODING 13 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3DE0 +4110 +41E0 +4120 +3D10 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+000E +ENCODING 14 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3CE0 +4110 +3910 +0510 +78E0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+000F +ENCODING 15 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3DF0 +4040 +3840 +0440 +79F0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0010 +ENCODING 16 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7238 +4A20 +4A38 +4A20 +73B8 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0011 +ENCODING 17 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7188 +4A18 +4A08 +4A08 +719C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0012 +ENCODING 18 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7198 +4A04 +4A08 +4A10 +719C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0013 +ENCODING 19 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7198 +4A04 +4A18 +4A04 +7198 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0014 +ENCODING 20 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7184 +4A0C +4A14 +4A1C +7184 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0015 +ENCODING 21 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4992 +6A54 +6A58 +5BD4 +4A52 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0016 +ENCODING 22 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3452 +429A +3116 +0912 +7112 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0017 +ENCODING 23 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7BB8 +4124 +7938 +4124 +7938 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0018 +ENCODING 24 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3324 +44B4 +47AC +44A4 +34A4 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0019 +ENCODING 25 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7D10 +41B0 +7D50 +4110 +7D10 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+001A +ENCODING 26 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3A5C +4252 +325C +0A52 +719C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+001B +ENCODING 27 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +79CE +4210 +7990 +4050 +7B8E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+001C +ENCODING 28 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +79C0 +4200 +7980 +4040 +4380 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+001D +ENCODING 29 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +39C0 +4200 +5980 +4840 +3B80 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+001E +ENCODING 30 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +71C0 +4A00 +7180 +5040 +4B80 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+001F +ENCODING 31 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +49C0 +4A00 +4980 +4840 +3380 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0020 +ENCODING 32 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0021 +ENCODING 33 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +00 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0022 +ENCODING 34 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +22 +22 +22 +22 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0023 +ENCODING 35 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +12 +12 +12 +7E +24 +24 +7E +48 +48 +48 +00 +00 +ENDCHAR +STARTCHAR U+0024 +ENCODING 36 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +3E +49 +48 +38 +0E +09 +49 +3E +08 +00 +00 +ENDCHAR +STARTCHAR U+0025 +ENCODING 37 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +31 +4A +4A +34 +08 +08 +16 +29 +29 +46 +00 +00 +ENDCHAR +STARTCHAR U+0026 +ENCODING 38 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +22 +22 +1C +39 +45 +42 +46 +39 +00 +00 +ENDCHAR +STARTCHAR U+0027 +ENCODING 39 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0028 +ENCODING 40 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +08 +08 +10 +10 +10 +10 +10 +10 +08 +08 +04 +00 +ENDCHAR +STARTCHAR U+0029 +ENCODING 41 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +10 +10 +08 +08 +08 +08 +08 +08 +10 +10 +20 +00 +ENDCHAR +STARTCHAR U+002A +ENCODING 42 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +49 +2A +1C +2A +49 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+002B +ENCODING 43 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +08 +08 +7F +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+002C +ENCODING 44 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +08 +08 +10 +ENDCHAR +STARTCHAR U+002D +ENCODING 45 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+002E +ENCODING 46 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+002F +ENCODING 47 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +04 +08 +08 +10 +10 +20 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0030 +ENCODING 48 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +42 +42 +42 +42 +42 +42 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+0031 +ENCODING 49 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +18 +28 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0032 +ENCODING 50 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +0C +10 +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0033 +ENCODING 51 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +1C +02 +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0034 +ENCODING 52 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +0C +14 +24 +44 +44 +7E +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+0035 +ENCODING 53 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +02 +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0036 +ENCODING 54 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +20 +40 +40 +7C +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0037 +ENCODING 55 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +04 +04 +04 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0038 +ENCODING 56 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +3C +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0039 +ENCODING 57 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +3E +02 +02 +02 +04 +38 +00 +00 +ENDCHAR +STARTCHAR U+003A +ENCODING 58 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+003B +ENCODING 59 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +18 +08 +08 +10 +00 +ENDCHAR +STARTCHAR U+003C +ENCODING 60 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +04 +08 +10 +20 +10 +08 +04 +02 +00 +00 +ENDCHAR +STARTCHAR U+003D +ENCODING 61 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+003E +ENCODING 62 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +20 +10 +08 +04 +08 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR U+003F +ENCODING 63 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +04 +08 +08 +00 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0040 +ENCODING 64 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +4A +56 +52 +52 +52 +4E +20 +1E +00 +00 +ENDCHAR +STARTCHAR U+0041 +ENCODING 65 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0042 +ENCODING 66 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +42 +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+0043 +ENCODING 67 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0044 +ENCODING 68 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +44 +42 +42 +42 +42 +42 +42 +44 +78 +00 +00 +ENDCHAR +STARTCHAR U+0045 +ENCODING 69 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0046 +ENCODING 70 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0047 +ENCODING 71 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +4E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0048 +ENCODING 72 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0049 +ENCODING 73 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+004A +ENCODING 74 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1F +04 +04 +04 +04 +04 +04 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+004B +ENCODING 75 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +44 +48 +50 +60 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+004C +ENCODING 76 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+004D +ENCODING 77 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +66 +66 +5A +5A +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+004E +ENCODING 78 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +00 +ENDCHAR +STARTCHAR U+004F +ENCODING 79 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0050 +ENCODING 80 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0051 +ENCODING 81 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +5A +66 +3C +03 +00 +ENDCHAR +STARTCHAR U+0052 +ENCODING 82 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0053 +ENCODING 83 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0054 +ENCODING 84 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0055 +ENCODING 85 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0056 +ENCODING 86 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +41 +22 +22 +22 +14 +14 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0057 +ENCODING 87 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +5A +5A +66 +66 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0058 +ENCODING 88 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +24 +24 +18 +18 +24 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0059 +ENCODING 89 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+005A +ENCODING 90 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +04 +08 +10 +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+005B +ENCODING 91 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0E +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +0E +00 +ENDCHAR +STARTCHAR U+005C +ENCODING 92 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +20 +10 +10 +08 +08 +04 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+005D +ENCODING 93 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +70 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR U+005E +ENCODING 94 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +42 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+005F +ENCODING 95 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +7F +00 +ENDCHAR +STARTCHAR U+0060 +ENCODING 96 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +20 +10 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0061 +ENCODING 97 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0062 +ENCODING 98 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +62 +5C +00 +00 +ENDCHAR +STARTCHAR U+0063 +ENCODING 99 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +40 +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0064 +ENCODING 100 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +02 +3A +46 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0065 +ENCODING 101 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0066 +ENCODING 102 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +10 +10 +10 +7C +10 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0067 +ENCODING 103 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +3A +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+0068 +ENCODING 104 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0069 +ENCODING 105 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+006A +ENCODING 106 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +00 +0C +04 +04 +04 +04 +04 +04 +04 +48 +30 +ENDCHAR +STARTCHAR U+006B +ENCODING 107 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +44 +48 +50 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+006C +ENCODING 108 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+006D +ENCODING 109 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +76 +49 +49 +49 +49 +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+006E +ENCODING 110 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+006F +ENCODING 111 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0070 +ENCODING 112 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +62 +5C +40 +40 +ENDCHAR +STARTCHAR U+0071 +ENCODING 113 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3A +46 +42 +42 +42 +42 +46 +3A +02 +02 +ENDCHAR +STARTCHAR U+0072 +ENCODING 114 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0073 +ENCODING 115 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0074 +ENCODING 116 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+0075 +ENCODING 117 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0076 +ENCODING 118 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +24 +24 +24 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+0077 +ENCODING 119 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +41 +49 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0078 +ENCODING 120 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +24 +18 +18 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0079 +ENCODING 121 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+007A +ENCODING 122 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +02 +04 +08 +10 +20 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+007B +ENCODING 123 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +10 +10 +08 +08 +10 +10 +08 +08 +10 +10 +0C +00 +ENDCHAR +STARTCHAR U+007C +ENCODING 124 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+007D +ENCODING 125 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +30 +08 +08 +10 +10 +08 +08 +10 +10 +08 +08 +30 +00 +ENDCHAR +STARTCHAR U+007E +ENCODING 126 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +31 +49 +46 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+007F +ENCODING 127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +73D0 +4A10 +4BD0 +4A10 +73DE +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0080 +ENCODING 128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +719C +4A52 +73D2 +4252 +425C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0081 +ENCODING 129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +499C +4A52 +7A5C +4A50 +4990 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0082 +ENCODING 130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7392 +4A52 +739E +4A12 +7212 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0083 +ENCODING 131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4B92 +6A52 +5B9E +4A52 +4B92 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0084 +ENCODING 132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +74B8 +26A4 +25A4 +24A4 +74B8 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0085 +ENCODING 133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4BD0 +6A10 +5BD0 +4A10 +4BDE +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0086 +ENCODING 134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +39CC +4212 +319E +0852 +7392 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0087 +ENCODING 135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +79CC +4212 +799E +4052 +7B92 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0088 +ENCODING 136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4B9C +4920 +7918 +4904 +4938 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0089 +ENCODING 137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4BB8 +4908 +7908 +4908 +4930 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+008A +ENCODING 138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +45CC +4490 +4488 +2884 +1098 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+008B +ENCODING 139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +721C +4A12 +7212 +4212 +43DC +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+008C +ENCODING 140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7212 +4A12 +7212 +4212 +43CC +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+008D +ENCODING 141 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +72 +4A +72 +52 +4A +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+008E +ENCODING 142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +39DC +4202 +318C +0850 +739E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+008F +ENCODING 143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +39DC +4202 +318C +0842 +739C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0090 +ENCODING 144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +71CE +4A10 +4A0C +4A02 +71DC +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0091 +ENCODING 145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7244 +4A4C +7244 +4244 +418E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0092 +ENCODING 146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +725C +4A42 +724C +4250 +419E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0093 +ENCODING 147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B9C +4120 +3118 +0904 +7138 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0094 +ENCODING 148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +39D2 +4212 +421E +4212 +39D2 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0095 +ENCODING 149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4510 +6D10 +5550 +45B0 +4510 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0096 +ENCODING 150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B8C +4252 +339E +0A12 +7212 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0097 +ENCODING 151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7B8C +4252 +7B9E +4212 +7A12 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0098 +ENCODING 152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +398E +4250 +324C +0A42 +719C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0099 +ENCODING 153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +339A +4422 +25A2 +14A2 +639A +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+009A +ENCODING 154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +39DC +4208 +3208 +0A08 +71DC +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+009B +ENCODING 155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +39DC +4208 +4188 +4048 +3B9C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+009C +ENCODING 156 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3E +44 +24 +14 +64 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+009D +ENCODING 157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +31CE +4A10 +4990 +4850 +338E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+009E +ENCODING 158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7220 +4B60 +72A0 +4220 +4220 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+009F +ENCODING 159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +338E +4A50 +7B90 +4A10 +4A0E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+00A0 +ENCODING 160 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00A1 +ENCODING 161 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +00 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+00A2 +ENCODING 162 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +3E +49 +48 +48 +49 +3E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+00A3 +ENCODING 163 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +10 +10 +10 +7C +10 +10 +10 +3E +61 +00 +00 +ENDCHAR +STARTCHAR U+00A4 +ENCODING 164 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +42 +24 +3C +24 +24 +3C +24 +42 +00 +00 +00 +ENDCHAR +STARTCHAR U+00A5 +ENCODING 165 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +22 +14 +08 +7F +08 +7F +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+00A6 +ENCODING 166 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +00 +00 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+00A7 +ENCODING 167 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +40 +3C +42 +42 +3C +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00A8 +ENCODING 168 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00A9 +ENCODING 169 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +99 +A5 +A1 +A1 +A5 +99 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00AA +ENCODING 170 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +02 +1E +22 +1E +00 +3E +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00AB +ENCODING 171 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +12 +12 +24 +24 +48 +24 +24 +12 +12 +00 +00 +ENDCHAR +STARTCHAR U+00AC +ENCODING 172 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +7E +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+00AD +ENCODING 173 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00AE +ENCODING 174 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +B9 +A5 +A5 +B9 +A9 +A5 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00AF +ENCODING 175 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00B0 +ENCODING 176 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +28 +28 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00B1 +ENCODING 177 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +7F +08 +08 +08 +00 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+00B2 +ENCODING 178 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +22 +02 +1C +20 +20 +3E +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00B3 +ENCODING 179 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +22 +02 +1C +02 +22 +1C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00B4 +ENCODING 180 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +04 +08 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00B5 +ENCODING 181 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +22 +22 +22 +22 +36 +2A +20 +20 +ENDCHAR +STARTCHAR U+00B6 +ENCODING 182 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3E +7A +7A +7A +7A +3A +0A +0A +0A +0A +0A +0E +00 +ENDCHAR +STARTCHAR U+00B7 +ENCODING 183 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00B8 +ENCODING 184 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +30 +ENDCHAR +STARTCHAR U+00B9 +ENCODING 185 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +18 +28 +08 +08 +08 +08 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00BA +ENCODING 186 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +22 +22 +22 +1C +00 +3E +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00BB +ENCODING 187 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +48 +24 +24 +12 +24 +24 +48 +48 +00 +00 +ENDCHAR +STARTCHAR U+00BC +ENCODING 188 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +62 +24 +28 +28 +12 +16 +2A +4E +42 +00 +00 +ENDCHAR +STARTCHAR U+00BD +ENCODING 189 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +62 +24 +28 +28 +14 +1A +22 +44 +4E +00 +00 +ENDCHAR +STARTCHAR U+00BE +ENCODING 190 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +62 +12 +24 +18 +68 +12 +16 +2A +4E +42 +00 +00 +ENDCHAR +STARTCHAR U+00BF +ENCODING 191 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +00 +08 +08 +30 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00C0 +ENCODING 192 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+00C1 +ENCODING 193 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+00C2 +ENCODING 194 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+00C3 +ENCODING 195 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+00C4 +ENCODING 196 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+00C5 +ENCODING 197 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +18 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+00C6 +ENCODING 198 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1F +28 +48 +48 +7F +48 +48 +48 +48 +4F +00 +00 +ENDCHAR +STARTCHAR U+00C7 +ENCODING 199 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+00C8 +ENCODING 200 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+00C9 +ENCODING 201 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+00CA +ENCODING 202 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+00CB +ENCODING 203 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+00CC +ENCODING 204 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +06 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+00CD +ENCODING 205 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+00CE +ENCODING 206 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+00CF +ENCODING 207 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+00D0 +ENCODING 208 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +44 +42 +42 +F2 +42 +42 +42 +44 +78 +00 +00 +ENDCHAR +STARTCHAR U+00D1 +ENCODING 209 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +00 +ENDCHAR +STARTCHAR U+00D2 +ENCODING 210 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00D3 +ENCODING 211 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00D4 +ENCODING 212 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00D5 +ENCODING 213 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00D6 +ENCODING 214 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00D7 +ENCODING 215 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +42 +24 +18 +24 +42 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+00D8 +ENCODING 216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +3A +44 +46 +4A +4A +52 +52 +62 +22 +5C +40 +00 +ENDCHAR +STARTCHAR U+00D9 +ENCODING 217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00DA +ENCODING 218 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00DB +ENCODING 219 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00DC +ENCODING 220 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00DD +ENCODING 221 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+00DE +ENCODING 222 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +78 +44 +42 +42 +44 +78 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+00DF +ENCODING 223 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +44 +7C +42 +42 +42 +62 +5C +00 +00 +ENDCHAR +STARTCHAR U+00E0 +ENCODING 224 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00E1 +ENCODING 225 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00E2 +ENCODING 226 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00E3 +ENCODING 227 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00E4 +ENCODING 228 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00E5 +ENCODING 229 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +24 +18 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00E6 +ENCODING 230 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +49 +09 +3F +48 +48 +49 +3E +00 +00 +ENDCHAR +STARTCHAR U+00E7 +ENCODING 231 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +40 +40 +40 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+00E8 +ENCODING 232 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00E9 +ENCODING 233 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00EA +ENCODING 234 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00EB +ENCODING 235 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00EC +ENCODING 236 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+00ED +ENCODING 237 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+00EE +ENCODING 238 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+00EF +ENCODING 239 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+00F0 +ENCODING 240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +0C +14 +22 +02 +3E +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00F1 +ENCODING 241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+00F2 +ENCODING 242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00F3 +ENCODING 243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00F4 +ENCODING 244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00F5 +ENCODING 245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00F6 +ENCODING 246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+00F7 +ENCODING 247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +00 +00 +7E +00 +00 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+00F8 +ENCODING 248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +3C +46 +4A +4A +52 +52 +62 +3C +40 +00 +ENDCHAR +STARTCHAR U+00F9 +ENCODING 249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00FA +ENCODING 250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00FB +ENCODING 251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00FC +ENCODING 252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+00FD +ENCODING 253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+00FE +ENCODING 254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +3C +22 +22 +22 +24 +28 +30 +20 +20 +20 +ENDCHAR +STARTCHAR U+00FF +ENCODING 255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+0100 +ENCODING 256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0101 +ENCODING 257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0102 +ENCODING 258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0103 +ENCODING 259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +42 +3C +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0104 +ENCODING 260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +04 +03 +ENDCHAR +STARTCHAR U+0105 +ENCODING 261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +04 +03 +ENDCHAR +STARTCHAR U+0106 +ENCODING 262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0107 +ENCODING 263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +3C +42 +40 +40 +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0108 +ENCODING 264 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0109 +ENCODING 265 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +3C +42 +40 +40 +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+010A +ENCODING 266 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+010B +ENCODING 267 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +00 +3C +42 +40 +40 +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+010C +ENCODING 268 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+010D +ENCODING 269 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +3C +42 +40 +40 +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+010E +ENCODING 270 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +48 +30 +00 +00 +78 +44 +42 +42 +42 +42 +42 +42 +44 +78 +00 +00 +ENDCHAR +STARTCHAR U+010F +ENCODING 271 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +02 +02 +02 +3A +46 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0110 +ENCODING 272 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +44 +42 +42 +F2 +42 +42 +42 +44 +78 +00 +00 +ENDCHAR +STARTCHAR U+0111 +ENCODING 273 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +02 +0F +02 +02 +3A +46 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0112 +ENCODING 274 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0113 +ENCODING 275 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0114 +ENCODING 276 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0115 +ENCODING 277 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +42 +42 +3C +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0116 +ENCODING 278 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0117 +ENCODING 279 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0118 +ENCODING 280 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +08 +06 +ENDCHAR +STARTCHAR U+0119 +ENCODING 281 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +10 +0C +ENDCHAR +STARTCHAR U+011A +ENCODING 282 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+011B +ENCODING 283 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+011C +ENCODING 284 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +3C +42 +42 +40 +40 +4E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+011D +ENCODING 285 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +02 +3A +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+011E +ENCODING 286 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +3C +42 +42 +40 +40 +4E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+011F +ENCODING 287 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +42 +3C +00 +02 +3A +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+0120 +ENCODING 288 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +3C +42 +42 +40 +40 +4E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0121 +ENCODING 289 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +02 +3A +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+0122 +ENCODING 290 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +4E +42 +42 +46 +3A +08 +30 +ENDCHAR +STARTCHAR U+0123 +ENCODING 291 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +10 +00 +02 +3A +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+0124 +ENCODING 292 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0125 +ENCODING 293 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +48 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0126 +ENCODING 294 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +FF +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0127 +ENCODING 295 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +40 +F0 +40 +40 +5C +62 +42 +42 +42 +42 +42 +00 +00 +00 +ENDCHAR +STARTCHAR U+0128 +ENCODING 296 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0129 +ENCODING 297 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+012A +ENCODING 298 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+012B +ENCODING 299 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+012C +ENCODING 300 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+012D +ENCODING 301 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +42 +42 +3C +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+012E +ENCODING 302 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +08 +06 +ENDCHAR +STARTCHAR U+012F +ENCODING 303 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +00 +18 +08 +08 +08 +08 +08 +08 +3E +08 +06 +ENDCHAR +STARTCHAR U+0130 +ENCODING 304 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0131 +ENCODING 305 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0132 +ENCODING 306 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0133 +ENCODING 307 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +22 +22 +00 +00 +22 +22 +22 +22 +22 +22 +1A +02 +22 +1C +ENDCHAR +STARTCHAR U+0134 +ENCODING 308 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +12 +00 +00 +1F +04 +04 +04 +04 +04 +04 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+0135 +ENCODING 309 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +12 +00 +00 +0C +04 +04 +04 +04 +04 +04 +04 +48 +30 +ENDCHAR +STARTCHAR U+0136 +ENCODING 310 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +44 +48 +50 +60 +60 +50 +48 +44 +42 +20 +C0 +ENDCHAR +STARTCHAR U+0137 +ENCODING 311 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +44 +48 +50 +60 +50 +48 +44 +42 +20 +C0 +ENDCHAR +STARTCHAR U+0138 +ENCODING 312 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +44 +48 +70 +70 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+0139 +ENCODING 313 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +60 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+013A +ENCODING 314 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+013B +ENCODING 315 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7E +08 +30 +ENDCHAR +STARTCHAR U+013C +ENCODING 316 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +3E +08 +30 +ENDCHAR +STARTCHAR U+013D +ENCODING 317 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+013E +ENCODING 318 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+013F +ENCODING 319 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +40 +44 +44 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0140 +ENCODING 320 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +30 +10 +10 +10 +14 +14 +10 +10 +10 +7C +00 +00 +ENDCHAR +STARTCHAR U+0141 +ENCODING 321 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +48 +50 +60 +C0 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0142 +ENCODING 322 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +0A +0C +18 +28 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0143 +ENCODING 323 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +00 +ENDCHAR +STARTCHAR U+0144 +ENCODING 324 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0145 +ENCODING 325 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +20 +C0 +ENDCHAR +STARTCHAR U+0146 +ENCODING 326 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +20 +C0 +ENDCHAR +STARTCHAR U+0147 +ENCODING 327 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +00 +ENDCHAR +STARTCHAR U+0148 +ENCODING 328 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0149 +ENCODING 329 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +60 +20 +20 +40 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+014A +ENCODING 330 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +42 +4C +00 +00 +ENDCHAR +STARTCHAR U+014B +ENCODING 331 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +0C +ENDCHAR +STARTCHAR U+014C +ENCODING 332 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+014D +ENCODING 333 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+014E +ENCODING 334 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+014F +ENCODING 335 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +42 +42 +3C +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0150 +ENCODING 336 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +33 +44 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0151 +ENCODING 337 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +33 +44 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0152 +ENCODING 338 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +37 +48 +48 +48 +4E +48 +48 +48 +48 +37 +00 +00 +ENDCHAR +STARTCHAR U+0153 +ENCODING 339 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +36 +49 +49 +4F +48 +48 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0154 +ENCODING 340 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0155 +ENCODING 341 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0156 +ENCODING 342 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +20 +C0 +ENDCHAR +STARTCHAR U+0157 +ENCODING 343 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +20 +C0 +ENDCHAR +STARTCHAR U+0158 +ENCODING 344 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0159 +ENCODING 345 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+015A +ENCODING 346 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+015B +ENCODING 347 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +3C +42 +40 +30 +0C +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+015C +ENCODING 348 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+015D +ENCODING 349 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+015E +ENCODING 350 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+015F +ENCODING 351 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+0160 +ENCODING 352 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0161 +ENCODING 353 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0162 +ENCODING 354 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +30 +ENDCHAR +STARTCHAR U+0163 +ENCODING 355 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +08 +30 +ENDCHAR +STARTCHAR U+0164 +ENCODING 356 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0165 +ENCODING 357 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+0166 +ENCODING 358 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +0A +0C +18 +28 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0167 +ENCODING 359 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +14 +18 +30 +50 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+0168 +ENCODING 360 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0169 +ENCODING 361 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+016A +ENCODING 362 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+016B +ENCODING 363 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+016C +ENCODING 364 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+016D +ENCODING 365 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +42 +3C +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+016E +ENCODING 366 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +18 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+016F +ENCODING 367 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +18 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0170 +ENCODING 368 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +33 +44 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0171 +ENCODING 369 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +33 +44 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0172 +ENCODING 370 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +10 +0C +ENDCHAR +STARTCHAR U+0173 +ENCODING 371 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +04 +03 +ENDCHAR +STARTCHAR U+0174 +ENCODING 372 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +42 +42 +42 +42 +5A +5A +66 +66 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0175 +ENCODING 373 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +41 +49 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0176 +ENCODING 374 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0177 +ENCODING 375 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+0178 +ENCODING 376 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0179 +ENCODING 377 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +7E +02 +02 +04 +08 +10 +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+017A +ENCODING 378 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +7E +02 +04 +08 +10 +20 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+017B +ENCODING 379 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +7E +02 +02 +04 +08 +10 +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+017C +ENCODING 380 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +00 +7E +02 +04 +08 +10 +20 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+017D +ENCODING 381 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +7E +02 +02 +04 +08 +10 +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+017E +ENCODING 382 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +7E +02 +04 +08 +10 +20 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+017F +ENCODING 383 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +10 +10 +10 +30 +10 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0180 +ENCODING 384 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +F0 +40 +5C +62 +42 +42 +42 +42 +62 +5C +00 +00 +ENDCHAR +STARTCHAR U+0181 +ENCODING 385 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +A2 +A2 +22 +3C +22 +22 +22 +22 +3C +00 +00 +ENDCHAR +STARTCHAR U+0182 +ENCODING 386 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +42 +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+0183 +ENCODING 387 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +5C +62 +42 +42 +42 +62 +5C +00 +00 +ENDCHAR +STARTCHAR U+0184 +ENCODING 388 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +60 +20 +20 +20 +3C +22 +22 +22 +22 +3C +00 +00 +ENDCHAR +STARTCHAR U+0185 +ENCODING 389 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +20 +20 +20 +3C +22 +22 +3C +00 +00 +ENDCHAR +STARTCHAR U+0186 +ENCODING 390 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +02 +02 +02 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+0187 +ENCODING 391 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +03 +04 +3C +44 +44 +40 +40 +40 +40 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+0188 +ENCODING 392 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +03 +04 +3C +44 +40 +40 +40 +40 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+0189 +ENCODING 393 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +44 +42 +42 +F2 +42 +42 +42 +44 +78 +00 +00 +ENDCHAR +STARTCHAR U+018A +ENCODING 394 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +A4 +A2 +22 +22 +22 +22 +22 +24 +38 +00 +00 +ENDCHAR +STARTCHAR U+018B +ENCODING 395 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +02 +3E +42 +42 +42 +42 +3E +00 +00 +ENDCHAR +STARTCHAR U+018C +ENCODING 396 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +3A +46 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+018D +ENCODING 397 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +24 +18 +04 +04 +38 +ENDCHAR +STARTCHAR U+018E +ENCODING 398 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +02 +3E +02 +02 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+018F +ENCODING 399 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +42 +02 +02 +7E +42 +42 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+0190 +ENCODING 400 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +38 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0191 +ENCODING 401 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1F +10 +10 +10 +1E +10 +10 +10 +10 +10 +60 +00 +ENDCHAR +STARTCHAR U+0192 +ENCODING 402 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +10 +10 +10 +7C +10 +10 +10 +10 +10 +10 +60 +00 +ENDCHAR +STARTCHAR U+0193 +ENCODING 403 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +03 +3C +44 +44 +40 +40 +5C +44 +44 +4C +34 +00 +00 +ENDCHAR +STARTCHAR U+0194 +ENCODING 404 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +24 +24 +18 +18 +24 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+0195 +ENCODING 405 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +40 +72 +4A +4A +4A +4A +4A +44 +00 +00 +ENDCHAR +STARTCHAR U+0196 +ENCODING 406 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +70 +10 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+0197 +ENCODING 407 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +3E +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0198 +ENCODING 408 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +46 +4A +50 +50 +60 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+0199 +ENCODING 409 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +30 +40 +40 +44 +48 +50 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+019A +ENCODING 410 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +08 +3E +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+019B +ENCODING 411 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +28 +10 +30 +48 +18 +24 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+019C +ENCODING 412 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +49 +49 +37 +00 +00 +ENDCHAR +STARTCHAR U+019D +ENCODING 413 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +22 +32 +32 +2A +2A +26 +26 +22 +22 +C0 +00 +ENDCHAR +STARTCHAR U+019E +ENCODING 414 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+019F +ENCODING 415 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +7E +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01A0 +ENCODING 416 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +3A +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+01A1 +ENCODING 417 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +3A +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+01A2 +ENCODING 418 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +36 +4A +4A +4A +4A +4A +4A +4A +4A +32 +02 +02 +ENDCHAR +STARTCHAR U+01A3 +ENCODING 419 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +36 +4A +4A +4A +4A +4A +4A +32 +02 +02 +ENDCHAR +STARTCHAR U+01A4 +ENCODING 420 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +51 +51 +11 +1E +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+01A5 +ENCODING 421 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +03 +5C +64 +44 +44 +44 +44 +64 +58 +40 +40 +ENDCHAR +STARTCHAR U+01A6 +ENCODING 422 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +70 +20 +3C +22 +22 +3C +28 +24 +22 +21 +00 +00 +ENDCHAR +STARTCHAR U+01A7 +ENCODING 423 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +0C +30 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01A8 +ENCODING 424 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +0C +30 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01A9 +ENCODING 425 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +20 +10 +08 +08 +10 +20 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+01AA +ENCODING 426 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +50 +50 +30 +10 +10 +10 +10 +10 +10 +10 +0C +00 +ENDCHAR +STARTCHAR U+01AB +ENCODING 427 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +04 +18 +ENDCHAR +STARTCHAR U+01AC +ENCODING 428 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3F +48 +48 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+01AD +ENCODING 429 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +10 +10 +10 +7C +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+01AE +ENCODING 430 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +06 +00 +ENDCHAR +STARTCHAR U+01AF +ENCODING 431 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +01 +01 +46 +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+01B0 +ENCODING 432 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +01 +01 +46 +44 +44 +44 +44 +44 +4C +34 +00 +00 +ENDCHAR +STARTCHAR U+01B1 +ENCODING 433 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +24 +24 +42 +42 +42 +42 +42 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+01B2 +ENCODING 434 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +4C +42 +42 +42 +42 +42 +42 +44 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+01B3 +ENCODING 435 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +31 +51 +11 +0A +0A +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+01B4 +ENCODING 436 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +03 +44 +44 +44 +44 +44 +24 +1C +04 +04 +38 +ENDCHAR +STARTCHAR U+01B5 +ENCODING 437 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +04 +08 +3C +10 +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+01B6 +ENCODING 438 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +04 +08 +3C +10 +20 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+01B7 +ENCODING 439 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +04 +08 +10 +1C +02 +02 +02 +46 +3C +00 +00 +ENDCHAR +STARTCHAR U+01B8 +ENCODING 440 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +20 +10 +08 +38 +40 +40 +40 +62 +3C +00 +00 +ENDCHAR +STARTCHAR U+01B9 +ENCODING 441 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +20 +10 +08 +38 +40 +40 +40 +42 +3C +ENDCHAR +STARTCHAR U+01BA +ENCODING 442 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +04 +08 +1C +02 +02 +3C +40 +42 +3C +ENDCHAR +STARTCHAR U+01BB +ENCODING 443 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +04 +08 +7E +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+01BC +ENCODING 444 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +20 +20 +20 +3C +02 +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01BD +ENCODING 445 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +20 +20 +3C +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01BE +ENCODING 446 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +18 +04 +04 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+01BF +ENCODING 447 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +44 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR U+01C0 +ENCODING 448 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+01C1 +ENCODING 449 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +00 +00 +ENDCHAR +STARTCHAR U+01C2 +ENCODING 450 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +10 +10 +10 +7C +10 +7C +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+01C3 +ENCODING 451 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +00 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+01C4 +ENCODING 452 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +05 +02 +00 +00 +67 +51 +51 +51 +52 +52 +54 +54 +54 +67 +00 +00 +ENDCHAR +STARTCHAR U+01C5 +ENCODING 453 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +05 +02 +60 +50 +57 +51 +51 +52 +52 +54 +54 +67 +00 +00 +ENDCHAR +STARTCHAR U+01C6 +ENCODING 454 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +05 +12 +10 +10 +37 +51 +51 +52 +52 +54 +54 +37 +00 +00 +ENDCHAR +STARTCHAR U+01C7 +ENCODING 455 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +47 +41 +41 +41 +41 +41 +41 +49 +49 +76 +00 +00 +ENDCHAR +STARTCHAR U+01C8 +ENCODING 456 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +01 +41 +40 +43 +41 +41 +41 +41 +41 +41 +79 +02 +0C +ENDCHAR +STARTCHAR U+01C9 +ENCODING 457 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +01 +61 +20 +23 +21 +21 +21 +21 +21 +21 +F9 +02 +0C +ENDCHAR +STARTCHAR U+01CA +ENCODING 458 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +4B +49 +49 +69 +69 +59 +59 +4D +4D +4A +00 +00 +ENDCHAR +STARTCHAR U+01CB +ENCODING 459 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +01 +49 +48 +6B +69 +69 +59 +59 +59 +49 +49 +12 +0C +ENDCHAR +STARTCHAR U+01CC +ENCODING 460 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +01 +01 +00 +53 +69 +49 +49 +49 +49 +49 +49 +12 +0C +ENDCHAR +STARTCHAR U+01CD +ENCODING 461 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+01CE +ENCODING 462 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01CF +ENCODING 463 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+01D0 +ENCODING 464 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+01D1 +ENCODING 465 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01D2 +ENCODING 466 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01D3 +ENCODING 467 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01D4 +ENCODING 468 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01D5 +ENCODING 469 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +00 +24 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01D6 +ENCODING 470 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +24 +24 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01D7 +ENCODING 471 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +24 +00 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01D8 +ENCODING 472 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +24 +24 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01D9 +ENCODING 473 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +24 +00 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01DA +ENCODING 474 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +24 +24 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01DB +ENCODING 475 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +24 +00 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01DC +ENCODING 476 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +24 +24 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01DD +ENCODING 477 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +02 +7E +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+01DE +ENCODING 478 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +00 +24 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+01DF +ENCODING 479 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +24 +24 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01E0 +ENCODING 480 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +00 +18 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+01E1 +ENCODING 481 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +10 +10 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01E2 +ENCODING 482 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +1F +28 +48 +48 +7F +48 +48 +48 +48 +4F +00 +00 +ENDCHAR +STARTCHAR U+01E3 +ENCODING 483 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +3E +49 +09 +3F +48 +48 +49 +3E +00 +00 +ENDCHAR +STARTCHAR U+01E4 +ENCODING 484 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +4E +42 +4F +42 +3E +00 +00 +ENDCHAR +STARTCHAR U+01E5 +ENCODING 485 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +3A +44 +44 +44 +38 +20 +3C +4F +42 +3C +ENDCHAR +STARTCHAR U+01E6 +ENCODING 486 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +3C +42 +42 +40 +40 +4E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01E7 +ENCODING 487 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +02 +3A +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+01E8 +ENCODING 488 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +42 +44 +48 +50 +60 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+01E9 +ENCODING 489 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +48 +30 +00 +00 +40 +40 +44 +48 +50 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+01EA +ENCODING 490 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +10 +0C +ENDCHAR +STARTCHAR U+01EB +ENCODING 491 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +10 +0C +ENDCHAR +STARTCHAR U+01EC +ENCODING 492 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +10 +0C +ENDCHAR +STARTCHAR U+01ED +ENCODING 493 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +10 +0C +ENDCHAR +STARTCHAR U+01EE +ENCODING 494 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +18 +00 +00 +7E +04 +08 +10 +1C +02 +02 +02 +46 +3C +00 +00 +ENDCHAR +STARTCHAR U+01EF +ENCODING 495 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +3E +04 +08 +10 +1C +02 +02 +02 +42 +3C +ENDCHAR +STARTCHAR U+01F0 +ENCODING 496 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +12 +0C +00 +00 +0C +04 +04 +04 +04 +04 +04 +04 +48 +30 +ENDCHAR +STARTCHAR U+01F1 +ENCODING 497 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +67 +51 +51 +51 +52 +52 +54 +54 +54 +67 +00 +00 +ENDCHAR +STARTCHAR U+01F2 +ENCODING 498 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +60 +50 +57 +51 +51 +52 +52 +54 +54 +67 +00 +00 +ENDCHAR +STARTCHAR U+01F3 +ENCODING 499 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +10 +10 +37 +51 +51 +52 +52 +54 +54 +37 +00 +00 +ENDCHAR +STARTCHAR U+01F4 +ENCODING 500 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +3C +42 +42 +40 +40 +4E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01F5 +ENCODING 501 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +02 +3A +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+01F8 +ENCODING 504 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +30 +0C +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +00 +ENDCHAR +STARTCHAR U+01F9 +ENCODING 505 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +30 +0C +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+01FA +ENCODING 506 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +18 +24 +18 +18 +24 +24 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+01FB +ENCODING 507 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +18 +24 +18 +00 +3C +42 +02 +3E +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+01FC +ENCODING 508 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +06 +18 +00 +00 +1F +28 +48 +48 +7F +48 +48 +48 +48 +4F +00 +00 +ENDCHAR +STARTCHAR U+01FD +ENCODING 509 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +06 +18 +00 +00 +3E +49 +09 +3F +48 +48 +49 +3E +00 +00 +ENDCHAR +STARTCHAR U+01FE +ENCODING 510 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +02 +3A +44 +46 +4A +4A +52 +52 +62 +22 +5C +40 +00 +ENDCHAR +STARTCHAR U+01FF +ENCODING 511 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +02 +3C +46 +4A +4A +52 +52 +62 +3C +40 +00 +ENDCHAR +STARTCHAR U+0200 +ENCODING 512 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +CC +22 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0201 +ENCODING 513 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +CC +22 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0202 +ENCODING 514 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +42 +42 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0203 +ENCODING 515 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3C +42 +42 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0204 +ENCODING 516 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +CC +22 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0205 +ENCODING 517 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +CC +22 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0206 +ENCODING 518 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +42 +42 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0207 +ENCODING 519 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3C +42 +42 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0208 +ENCODING 520 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +CC +22 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0209 +ENCODING 521 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +CC +22 +00 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+020A +ENCODING 522 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +42 +42 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+020B +ENCODING 523 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3C +42 +42 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+020C +ENCODING 524 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +CC +22 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+020D +ENCODING 525 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +CC +22 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+020E +ENCODING 526 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +42 +42 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+020F +ENCODING 527 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3C +42 +42 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0210 +ENCODING 528 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +CC +22 +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0211 +ENCODING 529 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +CC +22 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0212 +ENCODING 530 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +42 +42 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0213 +ENCODING 531 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3C +42 +42 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0214 +ENCODING 532 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +CC +22 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0215 +ENCODING 533 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +CC +22 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0216 +ENCODING 534 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +42 +42 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0217 +ENCODING 535 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3C +42 +42 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0218 +ENCODING 536 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +08 +10 +ENDCHAR +STARTCHAR U+0219 +ENCODING 537 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +08 +10 +ENDCHAR +STARTCHAR U+021A +ENCODING 538 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +02 +04 +ENDCHAR +STARTCHAR U+021B +ENCODING 539 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +20 +40 +ENDCHAR +STARTCHAR U+021E +ENCODING 542 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +18 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+021F +ENCODING 543 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +18 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0250 +ENCODING 592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +7C +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0251 +ENCODING 593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3A +46 +42 +42 +42 +46 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+0252 +ENCODING 594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +4C +52 +62 +42 +42 +42 +62 +5C +00 +00 +ENDCHAR +STARTCHAR U+0253 +ENCODING 595 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +38 +40 +40 +5C +62 +42 +42 +42 +42 +62 +5C +00 +00 +ENDCHAR +STARTCHAR U+0254 +ENCODING 596 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +02 +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0255 +ENCODING 597 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +40 +40 +4C +52 +3C +40 +00 +ENDCHAR +STARTCHAR U+0256 +ENCODING 598 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +04 +34 +4C +44 +44 +44 +44 +4C +34 +03 +00 +ENDCHAR +STARTCHAR U+0257 +ENCODING 599 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +03 +04 +04 +34 +4C +44 +44 +44 +44 +4C +34 +00 +00 +ENDCHAR +STARTCHAR U+0258 +ENCODING 600 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0259 +ENCODING 601 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +02 +7E +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+025A +ENCODING 602 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +39 +46 +04 +04 +7C +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+025B +ENCODING 603 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+025C +ENCODING 604 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +3C +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+025D +ENCODING 605 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +39 +46 +04 +38 +04 +04 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+025E +ENCODING 606 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +5C +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+025F +ENCODING 607 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +04 +04 +04 +1F +04 +04 +04 +48 +30 +ENDCHAR +STARTCHAR U+0260 +ENCODING 608 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +03 +3D +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+0261 +ENCODING 609 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3A +46 +42 +42 +42 +46 +3A +02 +42 +3C +ENDCHAR +STARTCHAR U+0262 +ENCODING 610 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +40 +4E +42 +42 +3E +00 +00 +ENDCHAR +STARTCHAR U+0263 +ENCODING 611 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +24 +24 +18 +18 +24 +24 +18 +ENDCHAR +STARTCHAR U+0264 +ENCODING 612 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +24 +24 +18 +18 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+0265 +ENCODING 613 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +02 +02 +02 +ENDCHAR +STARTCHAR U+0266 +ENCODING 614 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +38 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0267 +ENCODING 615 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +38 +40 +40 +5C +62 +42 +42 +42 +42 +42 +4C +00 +00 +ENDCHAR +STARTCHAR U+0268 +ENCODING 616 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +00 +18 +08 +08 +3E +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0269 +ENCODING 617 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+026A +ENCODING 618 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+026B +ENCODING 619 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +08 +3A +4C +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+026C +ENCODING 620 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +38 +48 +3E +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+026D +ENCODING 621 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +08 +06 +00 +ENDCHAR +STARTCHAR U+026E +ENCODING 622 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +30 +10 +1F +11 +12 +14 +16 +11 +11 +7D +09 +06 +ENDCHAR +STARTCHAR U+026F +ENCODING 623 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +37 +00 +00 +ENDCHAR +STARTCHAR U+0270 +ENCODING 624 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +37 +01 +01 +ENDCHAR +STARTCHAR U+0271 +ENCODING 625 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +76 +49 +49 +49 +49 +49 +49 +41 +06 +00 +ENDCHAR +STARTCHAR U+0272 +ENCODING 626 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +16 +19 +11 +11 +11 +11 +11 +11 +60 +00 +ENDCHAR +STARTCHAR U+0273 +ENCODING 627 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +58 +64 +44 +44 +44 +44 +44 +44 +03 +00 +ENDCHAR +STARTCHAR U+0274 +ENCODING 628 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +62 +52 +4A +46 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0275 +ENCODING 629 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0276 +ENCODING 630 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +37 +48 +48 +4E +48 +48 +48 +37 +00 +00 +ENDCHAR +STARTCHAR U+0277 +ENCODING 631 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0278 +ENCODING 632 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +3E +49 +49 +49 +49 +49 +49 +3E +08 +08 +ENDCHAR +STARTCHAR U+0279 +ENCODING 633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +02 +02 +02 +02 +02 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+027A +ENCODING 634 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +02 +02 +02 +02 +02 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+027B +ENCODING 635 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +04 +04 +04 +04 +04 +44 +4C +34 +03 +00 +ENDCHAR +STARTCHAR U+027C +ENCODING 636 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR U+027D +ENCODING 637 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +30 +00 +ENDCHAR +STARTCHAR U+027E +ENCODING 638 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+027F +ENCODING 639 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +02 +02 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0280 +ENCODING 640 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +42 +42 +7C +44 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0281 +ENCODING 641 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +44 +7C +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+0282 +ENCODING 642 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +30 +0C +02 +42 +7C +40 +30 +ENDCHAR +STARTCHAR U+0283 +ENCODING 643 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +60 +00 +ENDCHAR +STARTCHAR U+0284 +ENCODING 644 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +10 +10 +10 +7C +10 +10 +7C +10 +10 +10 +60 +00 +ENDCHAR +STARTCHAR U+0285 +ENCODING 645 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +10 +10 +10 +10 +10 +10 +10 +0C +00 +ENDCHAR +STARTCHAR U+0286 +ENCODING 646 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +06 +08 +08 +08 +08 +08 +08 +08 +08 +38 +4E +30 +00 +ENDCHAR +STARTCHAR U+0287 +ENCODING 647 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +60 +10 +10 +10 +10 +10 +10 +7C +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0288 +ENCODING 648 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +10 +0E +00 +ENDCHAR +STARTCHAR U+0289 +ENCODING 649 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +22 +22 +7F +22 +22 +26 +1A +00 +00 +ENDCHAR +STARTCHAR U+028A +ENCODING 650 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +24 +42 +42 +42 +42 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+028B +ENCODING 651 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +4C +42 +42 +42 +42 +44 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+028C +ENCODING 652 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +18 +24 +24 +24 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+028D +ENCODING 653 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +36 +49 +49 +49 +49 +49 +49 +41 +00 +00 +ENDCHAR +STARTCHAR U+028E +ENCODING 654 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +40 +40 +58 +64 +42 +42 +42 +42 +42 +ENDCHAR +STARTCHAR U+028F +ENCODING 655 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +41 +41 +22 +14 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0290 +ENCODING 656 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +08 +08 +10 +10 +20 +20 +7C +04 +03 +ENDCHAR +STARTCHAR U+0291 +ENCODING 657 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +02 +04 +08 +10 +26 +49 +7E +10 +00 +ENDCHAR +STARTCHAR U+0292 +ENCODING 658 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +04 +08 +10 +1C +02 +02 +02 +42 +3C +ENDCHAR +STARTCHAR U+0293 +ENCODING 659 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +04 +08 +10 +1C +02 +02 +32 +4A +3C +ENDCHAR +STARTCHAR U+0294 +ENCODING 660 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +04 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0295 +ENCODING 661 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +20 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0296 +ENCODING 662 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +04 +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0297 +ENCODING 663 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +40 +40 +40 +40 +40 +42 +3C +ENDCHAR +STARTCHAR U+0298 +ENCODING 664 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +5A +5A +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0299 +ENCODING 665 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +42 +42 +7C +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+029A +ENCODING 666 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +3A +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+029B +ENCODING 667 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3B +44 +40 +40 +4C +44 +44 +3C +00 +00 +ENDCHAR +STARTCHAR U+029C +ENCODING 668 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +22 +22 +3E +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+029D +ENCODING 669 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +00 +0C +04 +04 +04 +04 +04 +04 +3E +48 +30 +ENDCHAR +STARTCHAR U+029E +ENCODING 670 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +22 +12 +0A +06 +0A +12 +22 +02 +02 +ENDCHAR +STARTCHAR U+029F +ENCODING 671 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+02A0 +ENCODING 672 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +03 +34 +4C +44 +44 +44 +44 +4C +34 +04 +04 +ENDCHAR +STARTCHAR U+02A1 +ENCODING 673 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +04 +08 +08 +3E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+02A2 +ENCODING 674 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +20 +10 +10 +7C +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+02A3 +ENCODING 675 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +10 +10 +3F +51 +52 +52 +54 +54 +58 +3F +00 +00 +ENDCHAR +STARTCHAR U+02A4 +ENCODING 676 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +10 +10 +3F +51 +52 +54 +56 +51 +51 +31 +09 +06 +ENDCHAR +STARTCHAR U+02A5 +ENCODING 677 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +10 +10 +3F +51 +52 +54 +58 +5A +55 +3E +04 +00 +ENDCHAR +STARTCHAR U+02A6 +ENCODING 678 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +76 +28 +28 +24 +22 +21 +21 +1E +00 +00 +ENDCHAR +STARTCHAR U+02A7 +ENCODING 679 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +03 +24 +24 +7C +24 +24 +24 +24 +24 +24 +1C +04 +18 +ENDCHAR +STARTCHAR U+02A8 +ENCODING 680 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +76 +29 +28 +28 +28 +2A +2D +1E +04 +00 +ENDCHAR +STARTCHAR U+02B0 +ENCODING 688 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +2C +32 +22 +22 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B1 +ENCODING 689 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +1C +22 +20 +2C +32 +22 +22 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B2 +ENCODING 690 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +00 +04 +04 +04 +24 +18 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B3 +ENCODING 691 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +2C +32 +20 +20 +20 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B4 +ENCODING 692 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +04 +4C +34 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B5 +ENCODING 693 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +04 +4C +34 +03 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B6 +ENCODING 694 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +44 +48 +78 +44 +44 +78 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B7 +ENCODING 695 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +44 +54 +54 +28 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B8 +ENCODING 696 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +44 +44 +3C +04 +38 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02B9 +ENCODING 697 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02BA +ENCODING 698 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +12 +24 +48 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02BB +ENCODING 699 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +10 +18 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02BC +ENCODING 700 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02BD +ENCODING 701 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +10 +10 +08 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02BE +ENCODING 702 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +30 +08 +04 +04 +08 +30 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02BF +ENCODING 703 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +10 +20 +20 +10 +0C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C0 +ENCODING 704 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +42 +02 +02 +1C +10 +10 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C1 +ENCODING 705 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +42 +40 +40 +38 +08 +08 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C2 +ENCODING 706 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +08 +10 +20 +10 +08 +04 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C3 +ENCODING 707 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +10 +08 +04 +08 +10 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C4 +ENCODING 708 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +14 +22 +41 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C5 +ENCODING 709 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +22 +14 +08 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C6 +ENCODING 710 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C7 +ENCODING 711 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C8 +ENCODING 712 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02C9 +ENCODING 713 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02CA +ENCODING 714 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02CB +ENCODING 715 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +30 +0C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02CC +ENCODING 716 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+02CD +ENCODING 717 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +3C +00 +00 +ENDCHAR +STARTCHAR U+02CE +ENCODING 718 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +30 +0C +00 +ENDCHAR +STARTCHAR U+02CF +ENCODING 719 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0C +30 +00 +ENDCHAR +STARTCHAR U+02D0 +ENCODING 720 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +38 +10 +00 +00 +10 +38 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D1 +ENCODING 721 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +38 +10 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D2 +ENCODING 722 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +30 +08 +04 +04 +08 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D3 +ENCODING 723 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +10 +20 +20 +10 +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D4 +ENCODING 724 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +10 +10 +10 +10 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D5 +ENCODING 725 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7C +10 +10 +10 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D6 +ENCODING 726 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +10 +10 +7C +10 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D7 +ENCODING 727 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +7C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D8 +ENCODING 728 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +42 +42 +3C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02D9 +ENCODING 729 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02DA +ENCODING 730 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02DB +ENCODING 731 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +06 +ENDCHAR +STARTCHAR U+02DC +ENCODING 732 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02DD +ENCODING 733 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +33 +44 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02DE +ENCODING 734 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +20 +60 +A2 +1C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02E0 +ENCODING 736 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +44 +28 +10 +28 +28 +10 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02E1 +ENCODING 737 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +10 +10 +10 +10 +38 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02E2 +ENCODING 738 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +40 +38 +04 +78 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02E3 +ENCODING 739 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +44 +28 +10 +28 +44 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02E4 +ENCODING 740 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3C +40 +40 +38 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+02E5 +ENCODING 741 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7C +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+02E6 +ENCODING 742 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +7C +04 +04 +04 +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+02E7 +ENCODING 743 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +04 +04 +04 +7C +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+02E8 +ENCODING 744 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +04 +04 +04 +04 +04 +04 +7C +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+02E9 +ENCODING 745 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +7C +00 +00 +ENDCHAR +STARTCHAR U+0300 +ENCODING 768 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +20 +10 +08 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0301 +ENCODING 769 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +04 +08 +10 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0302 +ENCODING 770 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +24 +42 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0303 +ENCODING 771 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0304 +ENCODING 772 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0305 +ENCODING 773 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +FF +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0306 +ENCODING 774 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +42 +3C +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0307 +ENCODING 775 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +18 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0308 +ENCODING 776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +66 +66 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0309 +ENCODING 777 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +24 +04 +08 +08 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+030A +ENCODING 778 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +24 +24 +18 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+030B +ENCODING 779 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +12 +24 +48 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+030C +ENCODING 780 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +24 +18 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+030D +ENCODING 781 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +08 +08 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+030E +ENCODING 782 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +24 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+030F +ENCODING 783 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +48 +24 +12 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0310 +ENCODING 784 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +5A +42 +3C +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0311 +ENCODING 785 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +42 +42 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0312 +ENCODING 786 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +10 +18 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0313 +ENCODING 787 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +08 +10 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0314 +ENCODING 788 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +10 +08 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0315 +ENCODING 789 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +02 +04 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0316 +ENCODING 790 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +10 +08 +04 +00 +ENDCHAR +STARTCHAR U+0317 +ENCODING 791 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +08 +10 +20 +00 +ENDCHAR +STARTCHAR U+0318 +ENCODING 792 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +08 +38 +08 +00 +ENDCHAR +STARTCHAR U+0319 +ENCODING 793 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +10 +1C +10 +00 +ENDCHAR +STARTCHAR U+031A +ENCODING 794 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +7E +02 +02 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+031B +ENCODING 795 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +04 +0A +02 +04 +2C +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+031C +ENCODING 796 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +18 +20 +18 +00 +ENDCHAR +STARTCHAR U+031D +ENCODING 797 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +10 +10 +38 +00 +ENDCHAR +STARTCHAR U+031E +ENCODING 798 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +38 +10 +10 +00 +ENDCHAR +STARTCHAR U+031F +ENCODING 799 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +10 +10 +7C +10 +10 +ENDCHAR +STARTCHAR U+0320 +ENCODING 800 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +3C +00 +00 +ENDCHAR +STARTCHAR U+0321 +ENCODING 801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +02 +02 +12 +0C +00 +ENDCHAR +STARTCHAR U+0322 +ENCODING 802 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +08 +08 +09 +06 +00 +ENDCHAR +STARTCHAR U+0323 +ENCODING 803 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +18 +18 +00 +ENDCHAR +STARTCHAR U+0324 +ENCODING 804 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +66 +66 +00 +ENDCHAR +STARTCHAR U+0325 +ENCODING 805 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +18 +24 +24 +18 +ENDCHAR +STARTCHAR U+0326 +ENCODING 806 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +18 +08 +10 +ENDCHAR +STARTCHAR U+0327 +ENCODING 807 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +10 +18 +04 +38 +00 +ENDCHAR +STARTCHAR U+0328 +ENCODING 808 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +08 +08 +06 +00 +00 +ENDCHAR +STARTCHAR U+0329 +ENCODING 809 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+032A +ENCODING 810 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +7E +42 +00 +ENDCHAR +STARTCHAR U+032B +ENCODING 811 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +49 +49 +36 +00 +ENDCHAR +STARTCHAR U+032C +ENCODING 812 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +42 +24 +18 +00 +ENDCHAR +STARTCHAR U+032D +ENCODING 813 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +18 +24 +42 +00 +ENDCHAR +STARTCHAR U+032E +ENCODING 814 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +42 +42 +3C +00 +ENDCHAR +STARTCHAR U+032F +ENCODING 815 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +3C +42 +42 +00 +ENDCHAR +STARTCHAR U+0330 +ENCODING 816 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +32 +4C +00 +ENDCHAR +STARTCHAR U+0331 +ENCODING 817 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+0332 +ENCODING 818 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +FF +00 +00 +ENDCHAR +STARTCHAR U+0333 +ENCODING 819 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +FF +00 +FF +00 +ENDCHAR +STARTCHAR U+0334 +ENCODING 820 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +32 +4C +00 +24 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0335 +ENCODING 821 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +7E +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0336 +ENCODING 822 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +FF +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0337 +ENCODING 823 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +26 +0C +5A +30 +64 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0338 +ENCODING 824 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +03 +26 +0C +5A +30 +64 +C0 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0339 +ENCODING 825 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +18 +04 +04 +18 +ENDCHAR +STARTCHAR U+033A +ENCODING 826 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +42 +7E +00 +ENDCHAR +STARTCHAR U+033B +ENCODING 827 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +3C +24 +24 +3C +ENDCHAR +STARTCHAR U+033C +ENCODING 828 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +6C +92 +10 +ENDCHAR +STARTCHAR U+033D +ENCODING 829 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +66 +18 +66 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+033E +ENCODING 830 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +10 +10 +08 +10 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+033F +ENCODING 831 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +FF +00 +FF +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0340 +ENCODING 832 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +20 +10 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0341 +ENCODING 833 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +04 +08 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0342 +ENCODING 834 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +48 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0343 +ENCODING 835 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +30 +10 +20 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0344 +ENCODING 836 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +54 +44 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0345 +ENCODING 837 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +10 +10 +10 +0C +ENDCHAR +STARTCHAR U+0360 +ENCODING 864 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +31 +4E +00 +00 +50 +00 +8A +00 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0361 +ENCODING 865 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3E +41 +00 +00 +50 +00 +8A +00 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0374 +ENCODING 884 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +18 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0375 +ENCODING 885 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0C +18 +10 +20 +ENDCHAR +STARTCHAR U+037A +ENCODING 890 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +18 +ENDCHAR +STARTCHAR U+037E +ENCODING 894 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +18 +08 +08 +10 +ENDCHAR +STARTCHAR U+0384 +ENCODING 900 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0385 +ENCODING 901 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +44 +44 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0386 +ENCODING 902 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +40 +40 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0387 +ENCODING 903 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +08 +1C +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0388 +ENCODING 904 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +40 +40 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0389 +ENCODING 905 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +40 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+038A +ENCODING 906 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +40 +40 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+038C +ENCODING 908 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +40 +40 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+038E +ENCODING 910 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +40 +40 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+038F +ENCODING 911 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +40 +40 +00 +3E +41 +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +ENDCHAR +STARTCHAR U+0390 +ENCODING 912 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +44 +44 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+0391 +ENCODING 913 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0392 +ENCODING 914 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +42 +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+0393 +ENCODING 915 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0394 +ENCODING 916 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +14 +14 +22 +22 +22 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+0395 +ENCODING 917 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0396 +ENCODING 918 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +04 +08 +10 +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0397 +ENCODING 919 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0398 +ENCODING 920 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +7E +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0399 +ENCODING 921 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+039A +ENCODING 922 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +44 +48 +50 +60 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+039B +ENCODING 923 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +14 +14 +22 +22 +22 +41 +41 +41 +00 +00 +ENDCHAR +STARTCHAR U+039C +ENCODING 924 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +66 +66 +5A +5A +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+039D +ENCODING 925 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +00 +ENDCHAR +STARTCHAR U+039E +ENCODING 926 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +00 +00 +00 +3C +00 +00 +00 +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+039F +ENCODING 927 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03A0 +ENCODING 928 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +22 +22 +22 +22 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+03A1 +ENCODING 929 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+03A3 +ENCODING 931 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +20 +10 +08 +08 +10 +20 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+03A4 +ENCODING 932 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+03A5 +ENCODING 933 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+03A6 +ENCODING 934 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +3E +49 +49 +49 +49 +3E +08 +7F +00 +00 +ENDCHAR +STARTCHAR U+03A7 +ENCODING 935 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +24 +24 +18 +18 +24 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+03A8 +ENCODING 936 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +49 +49 +49 +49 +49 +3E +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+03A9 +ENCODING 937 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+03AA +ENCODING 938 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+03AB +ENCODING 939 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+03AC +ENCODING 940 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +00 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+03AD +ENCODING 941 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +00 +00 +3E +40 +40 +3C +40 +40 +40 +3E +00 +00 +ENDCHAR +STARTCHAR U+03AE +ENCODING 942 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+03AF +ENCODING 943 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +00 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+03B0 +ENCODING 944 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +44 +44 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03B1 +ENCODING 945 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+03B2 +ENCODING 946 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +44 +7C +42 +42 +42 +62 +5C +40 +40 +ENDCHAR +STARTCHAR U+03B3 +ENCODING 947 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +31 +49 +0A +04 +08 +08 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+03B4 +ENCODING 948 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +20 +20 +20 +18 +24 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03B5 +ENCODING 949 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03B6 +ENCODING 950 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +1C +08 +10 +20 +20 +20 +20 +1C +02 +1C +ENDCHAR +STARTCHAR U+03B7 +ENCODING 951 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+03B8 +ENCODING 952 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +42 +7E +42 +42 +24 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+03B9 +ENCODING 953 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+03BA +ENCODING 954 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +24 +28 +30 +30 +28 +24 +22 +00 +00 +ENDCHAR +STARTCHAR U+03BB +ENCODING 955 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +10 +10 +08 +18 +24 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+03BC +ENCODING 956 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +66 +66 +5A +42 +40 +40 +ENDCHAR +STARTCHAR U+03BD +ENCODING 957 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +44 +44 +48 +50 +60 +00 +00 +ENDCHAR +STARTCHAR U+03BE +ENCODING 958 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +3C +40 +40 +3C +40 +40 +3C +02 +02 +3C +ENDCHAR +STARTCHAR U+03BF +ENCODING 959 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03C0 +ENCODING 960 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +24 +24 +24 +24 +24 +24 +24 +00 +00 +ENDCHAR +STARTCHAR U+03C1 +ENCODING 961 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +62 +5C +40 +40 +ENDCHAR +STARTCHAR U+03C2 +ENCODING 962 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1E +20 +40 +40 +40 +20 +1C +02 +02 +1C +ENDCHAR +STARTCHAR U+03C3 +ENCODING 963 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3F +48 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+03C4 +ENCODING 964 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+03C5 +ENCODING 965 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03C6 +ENCODING 966 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +49 +49 +49 +49 +49 +49 +3E +08 +08 +ENDCHAR +STARTCHAR U+03C7 +ENCODING 967 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +24 +24 +18 +18 +24 +24 +42 +42 +ENDCHAR +STARTCHAR U+03C8 +ENCODING 968 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +3E +08 +08 +ENDCHAR +STARTCHAR U+03C9 +ENCODING 969 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+03CA +ENCODING 970 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+03CB +ENCODING 971 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03CC +ENCODING 972 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03CD +ENCODING 973 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +00 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03CE +ENCODING 974 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +08 +08 +00 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+03D0 +ENCODING 976 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +42 +44 +78 +44 +42 +42 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+03D1 +ENCODING 977 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +12 +12 +12 +0F +22 +62 +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+03D2 +ENCODING 978 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +36 +49 +08 +08 +08 +08 +08 +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+03D3 +ENCODING 979 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +40 +00 +36 +49 +08 +08 +08 +08 +08 +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+03D4 +ENCODING 980 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +36 +36 +00 +36 +49 +08 +08 +08 +08 +08 +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+03D5 +ENCODING 981 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +2A +2A +2A +2A +2A +1C +08 +08 +00 +ENDCHAR +STARTCHAR U+03D6 +ENCODING 982 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +22 +41 +41 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+03DA +ENCODING 986 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +40 +40 +40 +30 +0C +02 +02 +3C +00 +00 +ENDCHAR +STARTCHAR U+03DC +ENCODING 988 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +42 +40 +40 +78 +48 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+03DE +ENCODING 990 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +60 +20 +20 +20 +20 +3E +04 +04 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+03E0 +ENCODING 992 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +06 +0A +12 +26 +4A +12 +22 +4C +00 +00 +ENDCHAR +STARTCHAR U+03E2 +ENCODING 994 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +DB +49 +49 +49 +49 +49 +49 +37 +01 +3E +40 +00 +ENDCHAR +STARTCHAR U+03E3 +ENCODING 995 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +37 +01 +3E +40 +00 +ENDCHAR +STARTCHAR U+03E4 +ENCODING 996 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +32 +4A +42 +42 +46 +3A +02 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+03E5 +ENCODING 997 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1A +22 +22 +22 +1E +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+03E6 +ENCODING 998 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +70 +20 +20 +2C +32 +22 +22 +02 +62 +1C +00 +00 +ENDCHAR +STARTCHAR U+03E7 +ENCODING 999 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +3C +52 +52 +22 +02 +02 +32 +4C +00 +00 +ENDCHAR +STARTCHAR U+03E8 +ENCODING 1000 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +0C +30 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03E9 +ENCODING 1001 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +24 +18 +20 +40 +3E +00 +00 +ENDCHAR +STARTCHAR U+03EA +ENCODING 1002 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +C3 +A5 +24 +18 +18 +24 +24 +42 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+03EB +ENCODING 1003 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +5A +18 +18 +18 +24 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+03EC +ENCODING 1004 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +3C +40 +5C +62 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03ED +ENCODING 1005 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +3C +40 +5C +62 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+03EE +ENCODING 1006 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +08 +3E +49 +2A +08 +08 +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+03EF +ENCODING 1007 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +0C +08 +09 +3E +48 +08 +08 +08 +18 +00 +00 +ENDCHAR +STARTCHAR U+03F0 +ENCODING 1008 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +62 +12 +14 +18 +10 +30 +48 +46 +00 +00 +ENDCHAR +STARTCHAR U+03F1 +ENCODING 1009 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +7C +40 +40 +3C +02 +00 +ENDCHAR +STARTCHAR U+03F2 +ENCODING 1010 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +3C +40 +40 +40 +40 +40 +40 +3C +02 +00 +ENDCHAR +STARTCHAR U+03F3 +ENCODING 1011 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +02 +02 +00 +00 +0E +02 +02 +02 +02 +02 +02 +22 +1C +00 +ENDCHAR +STARTCHAR U+0400 +ENCODING 1024 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +30 +0C +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0401 +ENCODING 1025 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0402 +ENCODING 1026 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +10 +10 +10 +1E +11 +11 +11 +11 +16 +00 +00 +ENDCHAR +STARTCHAR U+0403 +ENCODING 1027 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +7E +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0404 +ENCODING 1028 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +40 +40 +7C +40 +40 +40 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0405 +ENCODING 1029 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0406 +ENCODING 1030 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0407 +ENCODING 1031 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0408 +ENCODING 1032 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +04 +04 +04 +04 +04 +04 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+0409 +ENCODING 1033 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +48 +48 +48 +4E +49 +49 +49 +49 +8E +00 +00 +ENDCHAR +STARTCHAR U+040A +ENCODING 1034 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +48 +48 +48 +48 +7E +49 +49 +49 +49 +4E +00 +00 +ENDCHAR +STARTCHAR U+040B +ENCODING 1035 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +10 +10 +10 +1E +11 +11 +11 +11 +11 +00 +00 +ENDCHAR +STARTCHAR U+040C +ENCODING 1036 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +40 +46 +48 +50 +60 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+040D +ENCODING 1037 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +30 +0C +00 +42 +46 +46 +4A +4A +52 +52 +62 +62 +42 +00 +00 +ENDCHAR +STARTCHAR U+040E +ENCODING 1038 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +41 +41 +22 +22 +14 +14 +08 +08 +10 +30 +00 +00 +ENDCHAR +STARTCHAR U+040F +ENCODING 1039 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +41 +41 +41 +41 +7F +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0410 +ENCODING 1040 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +42 +42 +42 +7E +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0411 +ENCODING 1041 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +40 +40 +40 +7C +42 +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+0412 +ENCODING 1042 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +42 +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+0413 +ENCODING 1043 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0414 +ENCODING 1044 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +12 +12 +12 +22 +22 +22 +42 +42 +FF +81 +81 +ENDCHAR +STARTCHAR U+0415 +ENCODING 1045 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+0416 +ENCODING 1046 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +49 +49 +2A +2A +1C +1C +2A +2A +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+0417 +ENCODING 1047 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +02 +02 +3C +04 +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0418 +ENCODING 1048 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +46 +46 +4A +4A +52 +52 +62 +62 +42 +00 +00 +ENDCHAR +STARTCHAR U+0419 +ENCODING 1049 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +18 +00 +42 +46 +46 +4A +4A +52 +52 +62 +62 +42 +00 +00 +ENDCHAR +STARTCHAR U+041A +ENCODING 1050 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +46 +48 +50 +60 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+041B +ENCODING 1051 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1E +12 +12 +12 +12 +12 +12 +22 +22 +42 +00 +00 +ENDCHAR +STARTCHAR U+041C +ENCODING 1052 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +66 +66 +5A +5A +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+041D +ENCODING 1053 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+041E +ENCODING 1054 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+041F +ENCODING 1055 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +42 +42 +42 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0420 +ENCODING 1056 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0421 +ENCODING 1057 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0422 +ENCODING 1058 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0423 +ENCODING 1059 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +22 +22 +14 +14 +08 +08 +10 +30 +00 +00 +ENDCHAR +STARTCHAR U+0424 +ENCODING 1060 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +3E +49 +49 +49 +49 +49 +3E +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0425 +ENCODING 1061 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +24 +24 +18 +18 +24 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0426 +ENCODING 1062 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +7F +01 +01 +ENDCHAR +STARTCHAR U+0427 +ENCODING 1063 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +7E +02 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0428 +ENCODING 1064 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+0429 +ENCODING 1065 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +92 +92 +92 +92 +92 +92 +92 +92 +92 +FF +01 +01 +ENDCHAR +STARTCHAR U+042A +ENCODING 1066 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +70 +10 +10 +10 +1E +11 +11 +11 +11 +1E +00 +00 +ENDCHAR +STARTCHAR U+042B +ENCODING 1067 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +72 +4A +4A +4A +4A +72 +00 +00 +ENDCHAR +STARTCHAR U+042C +ENCODING 1068 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +40 +7C +42 +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+042D +ENCODING 1069 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +02 +02 +3E +02 +02 +02 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+042E +ENCODING 1070 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +4C +52 +52 +52 +72 +52 +52 +52 +52 +4C +00 +00 +ENDCHAR +STARTCHAR U+042F +ENCODING 1071 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +42 +42 +42 +3E +12 +22 +22 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0430 +ENCODING 1072 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0431 +ENCODING 1073 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +02 +1C +20 +40 +7C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0432 +ENCODING 1074 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +42 +42 +7C +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+0433 +ENCODING 1075 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +40 +40 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0434 +ENCODING 1076 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1E +12 +22 +22 +42 +42 +42 +7F +41 +00 +ENDCHAR +STARTCHAR U+0435 +ENCODING 1077 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0436 +ENCODING 1078 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +49 +49 +2A +1C +1C +2A +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+0437 +ENCODING 1079 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +3C +04 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0438 +ENCODING 1080 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +46 +46 +4A +4A +52 +52 +62 +62 +00 +00 +ENDCHAR +STARTCHAR U+0439 +ENCODING 1081 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +00 +00 +46 +46 +4A +4A +52 +52 +62 +62 +00 +00 +ENDCHAR +STARTCHAR U+043A +ENCODING 1082 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +46 +48 +50 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+043B +ENCODING 1083 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1E +12 +12 +12 +12 +22 +22 +42 +00 +00 +ENDCHAR +STARTCHAR U+043C +ENCODING 1084 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +66 +66 +5A +5A +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+043D +ENCODING 1085 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+043E +ENCODING 1086 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+043F +ENCODING 1087 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +42 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0440 +ENCODING 1088 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +42 +42 +42 +42 +7C +40 +40 +40 +40 +ENDCHAR +STARTCHAR U+0441 +ENCODING 1089 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +40 +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0442 +ENCODING 1090 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0443 +ENCODING 1091 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +24 +24 +18 +18 +10 +10 +20 +60 +ENDCHAR +STARTCHAR U+0444 +ENCODING 1092 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +3E +49 +49 +49 +49 +3E +08 +08 +00 +ENDCHAR +STARTCHAR U+0445 +ENCODING 1093 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +24 +18 +18 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0446 +ENCODING 1094 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +7F +01 +01 +ENDCHAR +STARTCHAR U+0447 +ENCODING 1095 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +7E +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0448 +ENCODING 1096 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+0449 +ENCODING 1097 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +92 +92 +92 +92 +92 +92 +92 +FF +01 +01 +ENDCHAR +STARTCHAR U+044A +ENCODING 1098 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +70 +10 +10 +1E +11 +11 +11 +1E +00 +00 +ENDCHAR +STARTCHAR U+044B +ENCODING 1099 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +72 +4A +4A +4A +72 +00 +00 +ENDCHAR +STARTCHAR U+044C +ENCODING 1100 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +40 +40 +7C +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+044D +ENCODING 1101 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +38 +44 +02 +3E +02 +02 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+044E +ENCODING 1102 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +4C +52 +52 +72 +52 +52 +52 +4C +00 +00 +ENDCHAR +STARTCHAR U+044F +ENCODING 1103 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +42 +42 +42 +3E +12 +22 +42 +00 +00 +ENDCHAR +STARTCHAR U+0450 +ENCODING 1104 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0451 +ENCODING 1105 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0452 +ENCODING 1106 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +78 +20 +20 +3C +22 +22 +22 +22 +0C +00 +ENDCHAR +STARTCHAR U+0453 +ENCODING 1107 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +7E +40 +40 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0454 +ENCODING 1108 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +40 +7C +40 +40 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0455 +ENCODING 1109 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0456 +ENCODING 1110 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0457 +ENCODING 1111 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +24 +24 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+0458 +ENCODING 1112 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +00 +0C +04 +04 +04 +04 +04 +04 +04 +48 +30 +ENDCHAR +STARTCHAR U+0459 +ENCODING 1113 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +78 +48 +48 +4E +49 +49 +49 +8E +00 +00 +ENDCHAR +STARTCHAR U+045A +ENCODING 1114 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +48 +48 +48 +7E +49 +49 +49 +4E +00 +00 +ENDCHAR +STARTCHAR U+045B +ENCODING 1115 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +78 +20 +20 +2C +32 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+045C +ENCODING 1116 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +46 +48 +50 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+045D +ENCODING 1117 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +46 +46 +4A +4A +52 +52 +62 +62 +00 +00 +ENDCHAR +STARTCHAR U+045E +ENCODING 1118 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +42 +3C +00 +00 +42 +42 +24 +24 +18 +18 +10 +10 +20 +60 +ENDCHAR +STARTCHAR U+045F +ENCODING 1119 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +22 +22 +22 +22 +22 +3E +08 +08 +08 +ENDCHAR +STARTCHAR U+0460 +ENCODING 1120 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +36 +41 +41 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0461 +ENCODING 1121 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0462 +ENCODING 1122 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +7C +10 +10 +1E +11 +11 +11 +11 +1E +00 +00 +ENDCHAR +STARTCHAR U+0463 +ENCODING 1123 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +78 +20 +20 +3C +22 +22 +22 +3C +00 +00 +ENDCHAR +STARTCHAR U+0464 +ENCODING 1124 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +46 +49 +50 +50 +7E +50 +50 +50 +49 +46 +00 +00 +ENDCHAR +STARTCHAR U+0465 +ENCODING 1125 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +46 +49 +50 +7E +50 +50 +49 +46 +00 +00 +ENDCHAR +STARTCHAR U+0466 +ENCODING 1126 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +14 +14 +22 +36 +2A +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+0467 +ENCODING 1127 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +14 +14 +22 +36 +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+0468 +ENCODING 1128 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +48 +48 +54 +54 +52 +76 +6A +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+0469 +ENCODING 1129 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +48 +54 +54 +52 +76 +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+046A +ENCODING 1130 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +22 +22 +14 +08 +1C +2A +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+046B +ENCODING 1131 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +22 +14 +08 +3E +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+046C +ENCODING 1132 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +5F +51 +51 +4A +74 +4E +55 +55 +55 +55 +00 +00 +ENDCHAR +STARTCHAR U+046D +ENCODING 1133 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5F +51 +4A +74 +4E +55 +55 +55 +00 +00 +ENDCHAR +STARTCHAR U+046E +ENCODING 1134 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +18 +3C +42 +02 +02 +3C +04 +02 +02 +02 +3C +40 +40 +ENDCHAR +STARTCHAR U+046F +ENCODING 1135 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +24 +18 +00 +3C +42 +02 +3C +04 +02 +02 +3C +40 +40 +ENDCHAR +STARTCHAR U+0470 +ENCODING 1136 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +49 +49 +49 +49 +49 +3E +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0471 +ENCODING 1137 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +3E +08 +08 +ENDCHAR +STARTCHAR U+0472 +ENCODING 1138 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +7E +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0473 +ENCODING 1139 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0474 +ENCODING 1140 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +43 +44 +44 +44 +28 +28 +28 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0475 +ENCODING 1141 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +46 +48 +48 +28 +28 +28 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0476 +ENCODING 1142 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +66 +11 +00 +00 +43 +44 +44 +44 +28 +28 +28 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0477 +ENCODING 1143 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +66 +11 +00 +00 +46 +48 +48 +28 +28 +28 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0478 +ENCODING 1144 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +59 +59 +59 +55 +56 +54 +54 +24 +08 +08 +ENDCHAR +STARTCHAR U+0479 +ENCODING 1145 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +29 +59 +59 +55 +56 +54 +54 +24 +08 +08 +ENDCHAR +STARTCHAR U+047A +ENCODING 1146 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +3E +49 +41 +41 +41 +41 +41 +41 +49 +3E +08 +00 +ENDCHAR +STARTCHAR U+047B +ENCODING 1147 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +3E +49 +41 +41 +41 +41 +49 +3E +08 +00 +ENDCHAR +STARTCHAR U+047C +ENCODING 1148 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +43 +18 +00 +36 +41 +41 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+047D +ENCODING 1149 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3C +43 +18 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+047E +ENCODING 1150 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +7F +08 +00 +00 +36 +41 +41 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+047F +ENCODING 1151 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +08 +00 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0480 +ENCODING 1152 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +40 +40 +3C +04 +04 +04 +ENDCHAR +STARTCHAR U+0481 +ENCODING 1153 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +3C +04 +04 +04 +ENDCHAR +STARTCHAR U+0482 +ENCODING 1154 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +12 +0C +44 +2A +11 +18 +24 +00 +00 +00 +ENDCHAR +STARTCHAR U+0483 +ENCODING 1155 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +78 +40 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0484 +ENCODING 1156 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +28 +48 +80 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0485 +ENCODING 1157 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +78 +40 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0486 +ENCODING 1158 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +78 +08 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0490 +ENCODING 1168 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +02 +02 +7E +40 +40 +40 +40 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0491 +ENCODING 1169 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +7E +40 +40 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0492 +ENCODING 1170 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1F +10 +10 +10 +10 +7C +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0493 +ENCODING 1171 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1F +10 +10 +10 +7C +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0494 +ENCODING 1172 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +40 +7C +42 +42 +42 +42 +0C +00 +ENDCHAR +STARTCHAR U+0495 +ENCODING 1173 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +40 +40 +40 +7C +42 +42 +42 +0C +00 +ENDCHAR +STARTCHAR U+0496 +ENCODING 1174 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +49 +49 +2A +2A +1C +1C +2A +2A +49 +49 +01 +01 +ENDCHAR +STARTCHAR U+0497 +ENCODING 1175 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +49 +49 +2A +1C +1C +2A +49 +49 +01 +01 +ENDCHAR +STARTCHAR U+0498 +ENCODING 1176 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +02 +02 +3C +04 +02 +02 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+0499 +ENCODING 1177 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +3C +04 +02 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+049A +ENCODING 1178 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +46 +48 +50 +60 +60 +50 +48 +44 +42 +02 +02 +ENDCHAR +STARTCHAR U+049B +ENCODING 1179 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +46 +48 +50 +60 +50 +48 +44 +42 +02 +02 +ENDCHAR +STARTCHAR U+049C +ENCODING 1180 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +43 +54 +54 +78 +54 +54 +54 +42 +41 +00 +00 +ENDCHAR +STARTCHAR U+049D +ENCODING 1181 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +43 +54 +54 +78 +54 +54 +42 +41 +00 +00 +ENDCHAR +STARTCHAR U+049E +ENCODING 1182 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +73 +24 +28 +30 +30 +28 +24 +22 +21 +00 +00 +ENDCHAR +STARTCHAR U+049F +ENCODING 1183 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +23 +74 +28 +30 +28 +24 +22 +21 +00 +00 +ENDCHAR +STARTCHAR U+04A0 +ENCODING 1184 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +E0 +23 +24 +28 +30 +30 +28 +24 +22 +21 +00 +00 +ENDCHAR +STARTCHAR U+04A1 +ENCODING 1185 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +E3 +24 +28 +30 +28 +24 +22 +21 +00 +00 +ENDCHAR +STARTCHAR U+04A2 +ENCODING 1186 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +43 +01 +01 +ENDCHAR +STARTCHAR U+04A3 +ENCODING 1187 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +7E +42 +42 +42 +43 +01 +01 +ENDCHAR +STARTCHAR U+04A4 +ENCODING 1188 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +47 +44 +44 +44 +7C +44 +44 +44 +44 +44 +00 +00 +ENDCHAR +STARTCHAR U+04A5 +ENCODING 1189 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +47 +44 +44 +7C +44 +44 +44 +44 +00 +00 +ENDCHAR +STARTCHAR U+04A6 +ENCODING 1190 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +48 +48 +48 +48 +4E +49 +49 +49 +49 +01 +06 +ENDCHAR +STARTCHAR U+04A7 +ENCODING 1191 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +78 +48 +48 +48 +4E +49 +49 +49 +01 +06 +ENDCHAR +STARTCHAR U+04A8 +ENCODING 1192 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +20 +40 +4C +52 +52 +52 +52 +2C +18 +06 +00 +ENDCHAR +STARTCHAR U+04A9 +ENCODING 1193 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +20 +4C +52 +52 +52 +2C +18 +06 +00 +ENDCHAR +STARTCHAR U+04AA +ENCODING 1194 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +10 +0C +ENDCHAR +STARTCHAR U+04AB +ENCODING 1195 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +40 +40 +42 +42 +3C +10 +0C +ENDCHAR +STARTCHAR U+04AC +ENCODING 1196 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +0C +04 +04 +ENDCHAR +STARTCHAR U+04AD +ENCODING 1197 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +0C +04 +04 +ENDCHAR +STARTCHAR U+04AE +ENCODING 1198 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+04AF +ENCODING 1199 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +22 +22 +14 +14 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+04B0 +ENCODING 1200 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +22 +22 +14 +08 +08 +3E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+04B1 +ENCODING 1201 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +22 +22 +14 +08 +08 +3E +08 +00 +00 +ENDCHAR +STARTCHAR U+04B2 +ENCODING 1202 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +24 +24 +18 +18 +24 +24 +42 +43 +01 +01 +ENDCHAR +STARTCHAR U+04B3 +ENCODING 1203 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +24 +18 +18 +24 +42 +43 +01 +01 +ENDCHAR +STARTCHAR U+04B4 +ENCODING 1204 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +FA +22 +22 +22 +22 +22 +22 +22 +22 +3F +01 +01 +ENDCHAR +STARTCHAR U+04B5 +ENCODING 1205 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FA +22 +22 +22 +22 +22 +22 +3F +01 +01 +ENDCHAR +STARTCHAR U+04B6 +ENCODING 1206 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +46 +3A +02 +02 +03 +01 +01 +ENDCHAR +STARTCHAR U+04B7 +ENCODING 1207 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +46 +3A +02 +03 +01 +01 +ENDCHAR +STARTCHAR U+04B8 +ENCODING 1208 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +52 +56 +3A +12 +12 +02 +00 +00 +ENDCHAR +STARTCHAR U+04B9 +ENCODING 1209 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +52 +56 +3A +12 +02 +00 +00 +ENDCHAR +STARTCHAR U+04BA +ENCODING 1210 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+04BB +ENCODING 1211 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +40 +5C +62 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+04BC +ENCODING 1212 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +4C +52 +52 +52 +3E +10 +10 +12 +12 +0C +00 +00 +ENDCHAR +STARTCHAR U+04BD +ENCODING 1213 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +4C +52 +52 +3E +10 +10 +12 +0C +00 +00 +ENDCHAR +STARTCHAR U+04BE +ENCODING 1214 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +4C +52 +52 +52 +3E +10 +10 +12 +12 +0C +08 +06 +ENDCHAR +STARTCHAR U+04BF +ENCODING 1215 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +4C +52 +52 +3E +10 +10 +12 +0C +08 +06 +ENDCHAR +STARTCHAR U+04C0 +ENCODING 1216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+04C1 +ENCODING 1217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +41 +41 +3E +00 +49 +49 +2A +2A +1C +1C +2A +2A +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+04C2 +ENCODING 1218 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +22 +22 +1C +00 +00 +49 +49 +2A +1C +1C +2A +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+04C3 +ENCODING 1219 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +46 +48 +50 +60 +7C +42 +42 +42 +42 +02 +0C +ENDCHAR +STARTCHAR U+04C4 +ENCODING 1220 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +46 +48 +50 +60 +7C +42 +42 +42 +02 +0C +ENDCHAR +STARTCHAR U+04C7 +ENCODING 1223 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +02 +0C +ENDCHAR +STARTCHAR U+04C8 +ENCODING 1224 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +7E +42 +42 +42 +42 +02 +0C +ENDCHAR +STARTCHAR U+04CB +ENCODING 1227 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +46 +3A +02 +02 +06 +04 +04 +ENDCHAR +STARTCHAR U+04CC +ENCODING 1228 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +46 +3A +02 +06 +04 +04 +ENDCHAR +STARTCHAR U+04D0 +ENCODING 1232 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+04D1 +ENCODING 1233 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +42 +3C +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+04D2 +ENCODING 1234 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+04D3 +ENCODING 1235 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+04D4 +ENCODING 1236 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1F +28 +48 +48 +7F +48 +48 +48 +48 +4F +00 +00 +ENDCHAR +STARTCHAR U+04D5 +ENCODING 1237 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +49 +09 +3F +48 +48 +49 +3E +00 +00 +ENDCHAR +STARTCHAR U+04D6 +ENCODING 1238 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+04D7 +ENCODING 1239 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +42 +42 +3C +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04D8 +ENCODING 1240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +42 +02 +02 +7E +42 +42 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+04D9 +ENCODING 1241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +02 +7E +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04DA +ENCODING 1242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +18 +24 +42 +02 +02 +7E +42 +42 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+04DB +ENCODING 1243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +02 +02 +7E +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04DC +ENCODING 1244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +49 +49 +2A +2A +1C +1C +2A +2A +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+04DD +ENCODING 1245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +49 +49 +2A +1C +1C +2A +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+04DE +ENCODING 1246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +3C +42 +02 +02 +3C +04 +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04DF +ENCODING 1247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +02 +3C +04 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04E0 +ENCODING 1248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +04 +08 +10 +1C +02 +02 +02 +46 +3C +00 +00 +ENDCHAR +STARTCHAR U+04E1 +ENCODING 1249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +04 +08 +10 +1C +02 +02 +02 +42 +3C +ENDCHAR +STARTCHAR U+04E2 +ENCODING 1250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +42 +46 +46 +4A +4A +52 +52 +62 +62 +42 +00 +00 +ENDCHAR +STARTCHAR U+04E3 +ENCODING 1251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +46 +46 +4A +4A +52 +52 +62 +62 +00 +00 +ENDCHAR +STARTCHAR U+04E4 +ENCODING 1252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +42 +46 +46 +4A +4A +52 +52 +62 +62 +42 +00 +00 +ENDCHAR +STARTCHAR U+04E5 +ENCODING 1253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +46 +46 +4A +4A +52 +52 +62 +62 +00 +00 +ENDCHAR +STARTCHAR U+04E6 +ENCODING 1254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04E7 +ENCODING 1255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04E8 +ENCODING 1256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +7E +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04E9 +ENCODING 1257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04EA +ENCODING 1258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +3C +42 +42 +42 +7E +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04EB +ENCODING 1259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +3C +42 +42 +7E +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+04EE +ENCODING 1262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3E +00 +00 +41 +41 +22 +22 +14 +14 +08 +08 +10 +30 +00 +00 +ENDCHAR +STARTCHAR U+04EF +ENCODING 1263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +42 +42 +24 +24 +18 +18 +10 +10 +20 +60 +ENDCHAR +STARTCHAR U+04F0 +ENCODING 1264 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +41 +41 +22 +22 +14 +14 +08 +08 +10 +30 +00 +00 +ENDCHAR +STARTCHAR U+04F1 +ENCODING 1265 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +42 +42 +24 +24 +18 +18 +10 +10 +20 +60 +ENDCHAR +STARTCHAR U+04F2 +ENCODING 1266 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +33 +44 +00 +00 +41 +41 +22 +22 +14 +14 +08 +08 +10 +30 +00 +00 +ENDCHAR +STARTCHAR U+04F3 +ENCODING 1267 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +33 +44 +00 +00 +42 +42 +24 +24 +18 +18 +10 +10 +20 +60 +ENDCHAR +STARTCHAR U+04F4 +ENCODING 1268 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +42 +42 +42 +42 +42 +46 +3A +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+04F5 +ENCODING 1269 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +42 +42 +42 +42 +46 +3A +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+04F8 +ENCODING 1272 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +42 +42 +42 +42 +72 +4A +4A +4A +4A +72 +00 +00 +ENDCHAR +STARTCHAR U+04F9 +ENCODING 1273 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +42 +42 +42 +72 +4A +4A +4A +72 +00 +00 +ENDCHAR +STARTCHAR U+0531 +ENCODING 1329 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +44 +44 +44 +44 +44 +44 +44 +47 +45 +38 +00 +00 +ENDCHAR +STARTCHAR U+0532 +ENCODING 1330 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +7C +42 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0533 +ENCODING 1331 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +44 +44 +3E +05 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+0534 +ENCODING 1332 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +04 +04 +06 +05 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+0535 +ENCODING 1333 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +7C +42 +40 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0536 +ENCODING 1334 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +22 +22 +22 +1C +04 +08 +10 +7C +02 +00 +ENDCHAR +STARTCHAR U+0537 +ENCODING 1335 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +7C +42 +40 +40 +40 +40 +7C +02 +00 +ENDCHAR +STARTCHAR U+0538 +ENCODING 1336 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +40 +40 +40 +7C +02 +00 +ENDCHAR +STARTCHAR U+0539 +ENCODING 1337 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +4F +54 +54 +48 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+053A +ENCODING 1338 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +04 +04 +3F +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+053B +ENCODING 1339 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +5C +62 +42 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+053C +ENCODING 1340 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7C +02 +00 +ENDCHAR +STARTCHAR U+053D +ENCODING 1341 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +79 +49 +49 +46 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+053E +ENCODING 1342 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +18 +24 +42 +42 +42 +42 +42 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+053F +ENCODING 1343 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +3E +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0540 +ENCODING 1344 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +10 +08 +10 +20 +40 +60 +18 +06 +00 +00 +ENDCHAR +STARTCHAR U+0541 +ENCODING 1345 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +22 +22 +22 +1C +24 +58 +48 +36 +00 +00 +ENDCHAR +STARTCHAR U+0542 +ENCODING 1346 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +04 +04 +04 +04 +04 +04 +06 +01 +00 +ENDCHAR +STARTCHAR U+0543 +ENCODING 1347 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +64 +18 +24 +24 +42 +42 +42 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+0544 +ENCODING 1348 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +47 +45 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+0545 +ENCODING 1349 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +02 +42 +7C +42 +02 +02 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0546 +ENCODING 1350 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +30 +10 +10 +10 +10 +10 +10 +11 +11 +0E +00 +ENDCHAR +STARTCHAR U+0547 +ENCODING 1351 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +3C +20 +40 +40 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0548 +ENCODING 1352 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0549 +ENCODING 1353 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +22 +22 +22 +1C +08 +08 +10 +7E +00 +00 +ENDCHAR +STARTCHAR U+054A +ENCODING 1354 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +49 +49 +49 +49 +09 +09 +01 +01 +01 +00 +00 +ENDCHAR +STARTCHAR U+054B +ENCODING 1355 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +22 +22 +22 +14 +0C +08 +10 +7C +02 +00 +ENDCHAR +STARTCHAR U+054C +ENCODING 1356 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +47 +45 +44 +44 +44 +44 +44 +00 +00 +ENDCHAR +STARTCHAR U+054D +ENCODING 1357 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+054E +ENCODING 1358 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +44 +44 +44 +44 +44 +44 +44 +3C +04 +06 +01 +00 +ENDCHAR +STARTCHAR U+054F +ENCODING 1359 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0550 +ENCODING 1360 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +40 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0551 +ENCODING 1361 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +3C +42 +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0552 +ENCODING 1362 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +58 +64 +44 +44 +43 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0553 +ENCODING 1363 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +38 +54 +54 +54 +54 +54 +54 +38 +10 +00 +00 +ENDCHAR +STARTCHAR U+0554 +ENCODING 1364 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +12 +12 +12 +1C +10 +7C +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0555 +ENCODING 1365 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0556 +ENCODING 1366 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +48 +48 +38 +0E +09 +09 +09 +49 +3E +00 +00 +ENDCHAR +STARTCHAR U+0559 +ENCODING 1369 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +20 +20 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+055A +ENCODING 1370 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +20 +10 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+055B +ENCODING 1371 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +18 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+055C +ENCODING 1372 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+055D +ENCODING 1373 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +20 +10 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+055E +ENCODING 1374 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +38 +44 +54 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+055F +ENCODING 1375 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +50 +40 +3C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0561 +ENCODING 1377 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +37 +00 +00 +ENDCHAR +STARTCHAR U+0562 +ENCODING 1378 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +40 +7E +40 +40 +40 +ENDCHAR +STARTCHAR U+0563 +ENCODING 1379 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +34 +4C +44 +44 +44 +44 +3F +04 +04 +04 +ENDCHAR +STARTCHAR U+0564 +ENCODING 1380 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +58 +64 +44 +44 +44 +44 +44 +47 +04 +04 +ENDCHAR +STARTCHAR U+0565 +ENCODING 1381 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +40 +40 +7E +40 +42 +42 +62 +5C +00 +00 +ENDCHAR +STARTCHAR U+0566 +ENCODING 1382 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +34 +4C +44 +44 +44 +44 +3C +04 +04 +07 +ENDCHAR +STARTCHAR U+0567 +ENCODING 1383 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +7C +40 +40 +40 +40 +40 +40 +38 +04 +00 +ENDCHAR +STARTCHAR U+0568 +ENCODING 1384 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +40 +7E +ENDCHAR +STARTCHAR U+0569 +ENCODING 1385 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +58 +64 +44 +4F +54 +54 +48 +40 +40 +40 +ENDCHAR +STARTCHAR U+056A +ENCODING 1386 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +04 +3F +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+056B +ENCODING 1387 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +40 +40 +ENDCHAR +STARTCHAR U+056C +ENCODING 1388 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7C +ENDCHAR +STARTCHAR U+056D +ENCODING 1389 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +79 +49 +49 +49 +49 +46 +40 +40 +40 +ENDCHAR +STARTCHAR U+056E +ENCODING 1390 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +70 +08 +04 +3F +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+056F +ENCODING 1391 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +42 +42 +42 +42 +42 +42 +42 +3E +02 +02 +ENDCHAR +STARTCHAR U+0570 +ENCODING 1392 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0571 +ENCODING 1393 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +08 +3E +42 +42 +42 +42 +42 +3E +00 +00 +ENDCHAR +STARTCHAR U+0572 +ENCODING 1394 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +58 +64 +44 +44 +44 +44 +44 +44 +04 +07 +ENDCHAR +STARTCHAR U+0573 +ENCODING 1395 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +11 +10 +7F +11 +11 +11 +11 +13 +0D +00 +00 +ENDCHAR +STARTCHAR U+0574 +ENCODING 1396 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +05 +04 +44 +44 +44 +44 +44 +4C +34 +00 +00 +ENDCHAR +STARTCHAR U+0575 +ENCODING 1397 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +04 +04 +04 +04 +04 +04 +04 +48 +30 +ENDCHAR +STARTCHAR U+0576 +ENCODING 1398 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +40 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+0577 +ENCODING 1399 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +04 +08 +08 +10 +10 +20 +20 +3F +00 +00 +ENDCHAR +STARTCHAR U+0578 +ENCODING 1400 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0579 +ENCODING 1401 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +20 +10 +08 +08 +10 +10 +20 +20 +3F +00 +00 +ENDCHAR +STARTCHAR U+057A +ENCODING 1402 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +37 +01 +01 +ENDCHAR +STARTCHAR U+057B +ENCODING 1403 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +48 +28 +10 +10 +20 +20 +3F +00 +00 +ENDCHAR +STARTCHAR U+057C +ENCODING 1404 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +58 +64 +44 +44 +44 +44 +44 +47 +00 +00 +ENDCHAR +STARTCHAR U+057D +ENCODING 1405 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+057E +ENCODING 1406 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +04 +44 +44 +44 +44 +44 +4C +34 +04 +07 +ENDCHAR +STARTCHAR U+057F +ENCODING 1407 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +4A +4D +49 +49 +49 +49 +59 +29 +00 +00 +ENDCHAR +STARTCHAR U+0580 +ENCODING 1408 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +40 +40 +ENDCHAR +STARTCHAR U+0581 +ENCODING 1409 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3A +46 +42 +42 +42 +46 +3A +02 +42 +3C +ENDCHAR +STARTCHAR U+0582 +ENCODING 1410 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +08 +0E +00 +00 +ENDCHAR +STARTCHAR U+0583 +ENCODING 1411 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +4A +4D +49 +49 +49 +49 +59 +29 +08 +08 +ENDCHAR +STARTCHAR U+0584 +ENCODING 1412 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0E +11 +10 +10 +7C +10 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+0585 +ENCODING 1413 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0586 +ENCODING 1414 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +48 +48 +38 +0E +09 +09 +09 +49 +3E +08 +08 +ENDCHAR +STARTCHAR U+0587 +ENCODING 1415 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +44 +44 +44 +44 +44 +44 +3B +00 +00 +ENDCHAR +STARTCHAR U+0589 +ENCODING 1417 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+0591 +ENCODING 1425 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +08 +08 +1C +22 +00 +ENDCHAR +STARTCHAR U+0592 +ENCODING 1426 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +00 +66 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0593 +ENCODING 1427 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +0C +30 +0C +30 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0594 +ENCODING 1428 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +00 +18 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0595 +ENCODING 1429 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +2C +20 +2C +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0596 +ENCODING 1430 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +10 +10 +0C +00 +ENDCHAR +STARTCHAR U+0597 +ENCODING 1431 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +1C +3E +1C +08 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0598 +ENCODING 1432 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +52 +4A +24 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0599 +ENCODING 1433 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +C0 +20 +20 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+059A +ENCODING 1434 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +02 +04 +02 +00 +ENDCHAR +STARTCHAR U+059B +ENCODING 1435 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +68 +68 +08 +70 +ENDCHAR +STARTCHAR U+059C +ENCODING 1436 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0C +10 +10 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+059D +ENCODING 1437 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +03 +04 +04 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+059E +ENCODING 1438 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +06 +08 +13 +14 +04 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+059F +ENCODING 1439 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +A5 +42 +24 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05A0 +ENCODING 1440 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +05 +02 +04 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05A1 +ENCODING 1441 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +50 +60 +80 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05A3 +ENCODING 1443 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +08 +08 +38 +00 +ENDCHAR +STARTCHAR U+05A4 +ENCODING 1444 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +08 +10 +08 +00 +ENDCHAR +STARTCHAR U+05A5 +ENCODING 1445 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +08 +08 +30 +00 +ENDCHAR +STARTCHAR U+05A6 +ENCODING 1446 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +14 +64 +08 +30 +ENDCHAR +STARTCHAR U+05A7 +ENCODING 1447 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +18 +20 +18 +04 +18 +ENDCHAR +STARTCHAR U+05A8 +ENCODING 1448 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +08 +08 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05A9 +ENCODING 1449 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +20 +50 +20 +10 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05AA +ENCODING 1450 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +22 +1C +08 +08 +ENDCHAR +STARTCHAR U+05AB +ENCODING 1451 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +20 +10 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05AC +ENCODING 1452 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +04 +04 +1C +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05AD +ENCODING 1453 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +04 +04 +03 +00 +ENDCHAR +STARTCHAR U+05AE +ENCODING 1454 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +48 +A8 +A8 +90 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05AF +ENCODING 1455 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +24 +24 +18 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05B0 +ENCODING 1456 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +18 +00 +18 +00 +ENDCHAR +STARTCHAR U+05B1 +ENCODING 1457 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +2A +00 +12 +00 +ENDCHAR +STARTCHAR U+05B2 +ENCODING 1458 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +3A +00 +02 +00 +ENDCHAR +STARTCHAR U+05B3 +ENCODING 1459 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +3A +10 +12 +00 +ENDCHAR +STARTCHAR U+05B4 +ENCODING 1460 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+05B5 +ENCODING 1461 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +66 +66 +00 +00 +ENDCHAR +STARTCHAR U+05B6 +ENCODING 1462 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +66 +00 +18 +ENDCHAR +STARTCHAR U+05B7 +ENCODING 1463 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +3C +00 +00 +ENDCHAR +STARTCHAR U+05B8 +ENCODING 1464 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +00 +3E +08 +08 +ENDCHAR +STARTCHAR U+05B9 +ENCODING 1465 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +30 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05BB +ENCODING 1467 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +20 +08 +02 +00 +ENDCHAR +STARTCHAR U+05BC +ENCODING 1468 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +5A +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05BD +ENCODING 1469 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +00 +42 +00 +24 +00 +08 +08 +08 +00 +ENDCHAR +STARTCHAR U+05BE +ENCODING 1470 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3E +7C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05BF +ENCODING 1471 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05C0 +ENCODING 1472 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+05C1 +ENCODING 1473 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +06 +06 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05C2 +ENCODING 1474 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +60 +60 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05C3 +ENCODING 1475 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +1C +08 +00 +00 +08 +1C +08 +00 +00 +ENDCHAR +STARTCHAR U+05C4 +ENCODING 1476 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +18 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05D0 +ENCODING 1488 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +42 +42 +22 +12 +2C +48 +44 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+05D1 +ENCODING 1489 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7C +04 +04 +04 +04 +04 +04 +04 +7F +00 +00 +ENDCHAR +STARTCHAR U+05D2 +ENCODING 1490 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +08 +08 +08 +04 +0C +14 +22 +42 +00 +00 +ENDCHAR +STARTCHAR U+05D3 +ENCODING 1491 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +04 +04 +04 +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+05D4 +ENCODING 1492 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +02 +02 +22 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+05D5 +ENCODING 1493 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+05D6 +ENCODING 1494 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +0C +0A +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+05D7 +ENCODING 1495 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +22 +22 +22 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+05D8 +ENCODING 1496 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +46 +4A +42 +42 +42 +42 +42 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+05D9 +ENCODING 1497 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +08 +08 +08 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05DA +ENCODING 1498 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +02 +02 +02 +02 +02 +02 +02 +02 +02 +02 +ENDCHAR +STARTCHAR U+05DB +ENCODING 1499 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +02 +02 +02 +02 +02 +02 +02 +7C +00 +00 +ENDCHAR +STARTCHAR U+05DC +ENCODING 1500 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +3E +02 +02 +02 +02 +04 +04 +08 +30 +00 +00 +ENDCHAR +STARTCHAR U+05DD +ENCODING 1501 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +FE +22 +22 +22 +22 +22 +22 +22 +3E +00 +00 +ENDCHAR +STARTCHAR U+05DE +ENCODING 1502 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +4E +31 +21 +41 +41 +41 +41 +41 +47 +00 +00 +ENDCHAR +STARTCHAR U+05DF +ENCODING 1503 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+05E0 +ENCODING 1504 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +04 +04 +04 +04 +04 +04 +04 +3C +00 +00 +ENDCHAR +STARTCHAR U+05E1 +ENCODING 1505 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +42 +42 +42 +42 +42 +42 +44 +78 +00 +00 +ENDCHAR +STARTCHAR U+05E2 +ENCODING 1506 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +12 +12 +12 +12 +12 +12 +12 +12 +FE +00 +00 +ENDCHAR +STARTCHAR U+05E3 +ENCODING 1507 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +42 +42 +42 +72 +02 +02 +02 +02 +02 +02 +ENDCHAR +STARTCHAR U+05E4 +ENCODING 1508 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +42 +42 +42 +72 +02 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+05E5 +ENCODING 1509 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +22 +22 +24 +28 +30 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U+05E6 +ENCODING 1510 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +42 +42 +24 +18 +08 +04 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+05E7 +ENCODING 1511 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +22 +22 +24 +24 +28 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U+05E8 +ENCODING 1512 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +02 +02 +02 +02 +02 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+05E9 +ENCODING 1513 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+05EA +ENCODING 1514 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3E +22 +22 +22 +22 +22 +22 +22 +62 +00 +00 +ENDCHAR +STARTCHAR U+05F0 +ENCODING 1520 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +77 +11 +11 +11 +11 +11 +11 +11 +11 +00 +00 +ENDCHAR +STARTCHAR U+05F1 +ENCODING 1521 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +77 +11 +11 +11 +01 +01 +01 +01 +01 +00 +00 +ENDCHAR +STARTCHAR U+05F2 +ENCODING 1522 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +77 +11 +11 +11 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05F3 +ENCODING 1523 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +02 +04 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+05F4 +ENCODING 1524 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +12 +24 +48 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+060C +ENCODING 1548 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +10 +18 +18 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+061B +ENCODING 1563 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +10 +18 +00 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+061F +ENCODING 1567 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3E +41 +40 +20 +10 +08 +08 +00 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0621 +ENCODING 1569 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1C +20 +3C +10 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0622 +ENCODING 1570 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +00 +08 +08 +08 +08 +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0623 +ENCODING 1571 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +20 +18 +00 +08 +08 +08 +08 +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0624 +ENCODING 1572 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +20 +18 +00 +0C +12 +12 +1E +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+0625 +ENCODING 1573 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +00 +0C +10 +0C +00 +ENDCHAR +STARTCHAR U+0626 +ENCODING 1574 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +40 +30 +00 +46 +48 +48 +46 +42 +3C +00 +ENDCHAR +STARTCHAR U+0627 +ENCODING 1575 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0628 +ENCODING 1576 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +04 +22 +42 +3C +00 +00 +08 +00 +00 +ENDCHAR +STARTCHAR U+0629 +ENCODING 1577 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +24 +00 +00 +18 +24 +22 +22 +1C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+062A +ENCODING 1578 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +14 +00 +00 +04 +22 +42 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+062B +ENCODING 1579 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +00 +24 +00 +00 +02 +41 +81 +7E +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+062C +ENCODING 1580 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +10 +20 +40 +48 +40 +22 +1C +ENDCHAR +STARTCHAR U+062D +ENCODING 1581 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +10 +20 +40 +40 +40 +22 +1C +ENDCHAR +STARTCHAR U+062E +ENCODING 1582 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +7E +10 +20 +40 +40 +40 +22 +1C +ENDCHAR +STARTCHAR U+062F +ENCODING 1583 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +04 +02 +42 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0630 +ENCODING 1584 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +00 +08 +04 +02 +42 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0631 +ENCODING 1585 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +04 +02 +02 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+0632 +ENCODING 1586 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +04 +02 +02 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+0633 +ENCODING 1587 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +01 +15 +15 +5E +48 +48 +30 +00 +ENDCHAR +STARTCHAR U+0634 +ENCODING 1588 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +12 +00 +00 +01 +15 +15 +5E +48 +48 +30 +00 +ENDCHAR +STARTCHAR U+0635 +ENCODING 1589 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +06 +19 +4E +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+0636 +ENCODING 1590 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +04 +00 +00 +06 +19 +4E +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+0637 +ENCODING 1591 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +2C +32 +22 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0638 +ENCODING 1592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +24 +20 +20 +2C +32 +22 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0639 +ENCODING 1593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +24 +20 +1C +20 +40 +40 +42 +3C +ENDCHAR +STARTCHAR U+063A +ENCODING 1594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +00 +00 +18 +24 +20 +1C +20 +40 +40 +42 +3C +ENDCHAR +STARTCHAR U+0640 +ENCODING 1600 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0641 +ENCODING 1601 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +06 +0A +06 +42 +42 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0642 +ENCODING 1602 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +00 +00 +1C +12 +0A +26 +42 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+0643 +ENCODING 1603 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +0A +12 +0A +22 +42 +42 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0644 +ENCODING 1604 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +02 +02 +02 +02 +22 +42 +42 +44 +3C +00 +00 +ENDCHAR +STARTCHAR U+0645 +ENCODING 1605 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +1C +06 +1E +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U+0646 +ENCODING 1606 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +04 +22 +42 +42 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+0647 +ENCODING 1607 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +18 +24 +24 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0648 +ENCODING 1608 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0C +12 +12 +1E +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+0649 +ENCODING 1609 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +04 +4A +48 +44 +42 +42 +3C +00 +ENDCHAR +STARTCHAR U+064A +ENCODING 1610 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +04 +4A +48 +44 +42 +3C +00 +28 +ENDCHAR +STARTCHAR U+064B +ENCODING 1611 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0C +30 +0C +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+064C +ENCODING 1612 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +06 +32 +14 +38 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+064D +ENCODING 1613 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0C +30 +0C +30 +00 +00 +ENDCHAR +STARTCHAR U+064E +ENCODING 1614 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+064F +ENCODING 1615 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +28 +28 +1C +10 +20 +40 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0650 +ENCODING 1616 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0C +30 +ENDCHAR +STARTCHAR U+0651 +ENCODING 1617 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +14 +58 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0652 +ENCODING 1618 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +24 +24 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0660 +ENCODING 1632 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +38 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0661 +ENCODING 1633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +20 +20 +20 +10 +10 +10 +08 +08 +08 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+0662 +ENCODING 1634 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +41 +41 +42 +22 +24 +18 +08 +08 +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+0663 +ENCODING 1635 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +49 +49 +4A +7E +24 +20 +20 +10 +10 +10 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0664 +ENCODING 1636 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +04 +0C +10 +20 +10 +08 +10 +20 +40 +40 +26 +3C +00 +00 +ENDCHAR +STARTCHAR U+0665 +ENCODING 1637 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +18 +24 +24 +42 +42 +42 +42 +24 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+0666 +ENCODING 1638 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +40 +3C +04 +04 +04 +04 +04 +06 +02 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0667 +ENCODING 1639 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +41 +41 +41 +22 +22 +22 +14 +14 +14 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+0668 +ENCODING 1640 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +08 +14 +14 +14 +22 +22 +22 +41 +41 +41 +00 +00 +ENDCHAR +STARTCHAR U+0669 +ENCODING 1641 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +18 +24 +24 +44 +44 +4C +34 +02 +02 +02 +01 +01 +01 +00 +00 +ENDCHAR +STARTCHAR U+067E +ENCODING 1662 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +04 +22 +42 +3C +00 +14 +00 +08 +00 +ENDCHAR +STARTCHAR U+0686 +ENCODING 1670 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +20 +40 +54 +40 +48 +22 +1C +ENDCHAR +STARTCHAR U+068E +ENCODING 1678 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +00 +28 +00 +08 +04 +02 +42 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0698 +ENCODING 1688 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +14 +00 +00 +04 +02 +02 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+0901 +ENCODING 2305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0980 +05B0 +0230 +01C0 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0902 +ENCODING 2306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0180 +0180 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0903 +ENCODING 2307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +024C +000C +0420 +000C +024C +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0905 +ENCODING 2309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1CFF +2260 +0260 +0660 +1C60 +0460 +43E0 +4360 +2760 +1E60 +0060 +0020 +0000 +ENDCHAR +STARTCHAR U+0906 +ENCODING 2310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1CFF +2266 +0266 +0666 +1C66 +0466 +43E6 +4366 +2766 +1E66 +0066 +0022 +0000 +ENDCHAR +STARTCHAR U+0907 +ENCODING 2311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +00C0 +00C0 +0FC0 +1800 +1800 +0FE0 +0030 +0330 +05B0 +07E0 +0040 +0020 +ENDCHAR +STARTCHAR U+0908 +ENCODING 2312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03C0 +0620 +0100 +FFFF +00C0 +00C0 +0FC0 +1800 +1800 +0FE0 +0030 +0330 +05B0 +07E0 +0040 +0020 +ENDCHAR +STARTCHAR U+0909 +ENCODING 2313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0180 +00C0 +00C0 +01C0 +0F80 +4180 +40C0 +20C0 +10C0 +09C0 +0780 +0000 +ENDCHAR +STARTCHAR U+090A +ENCODING 2314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0180 +00C0 +00C0 +01C0 +0F9C +41B2 +40E2 +20C2 +10C6 +09C4 +0780 +0000 +ENDCHAR +STARTCHAR U+090B +ENCODING 2315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0180 +3980 +6598 +0398 +07F8 +1F88 +3988 +219C +01B8 +01A0 +00A0 +001E +ENDCHAR +STARTCHAR U+090C +ENCODING 2316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0020 +0020 +3820 +74F8 +63CC +630C +300C +1078 +0CC0 +0280 +007C +0000 +ENDCHAR +STARTCHAR U+090D +ENCODING 2317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0098 +0070 +0000 +FFFF +0C30 +0C30 +0C30 +0C30 +0C60 +0400 +0200 +0180 +0060 +0010 +0018 +0018 +ENDCHAR +STARTCHAR U+090E +ENCODING 2318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +0FE0 +0010 +FFFF +0C30 +0C30 +0C30 +0C30 +0C60 +0400 +0200 +0180 +0060 +0010 +0018 +0018 +ENDCHAR +STARTCHAR U+090F +ENCODING 2319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0C30 +0C30 +0C30 +0C30 +0C60 +0400 +0200 +0180 +0060 +0010 +0018 +0018 +ENDCHAR +STARTCHAR U+0910 +ENCODING 2320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0F00 +0080 +0040 +FFFF +0C30 +0C30 +0C30 +0C30 +0C60 +0400 +0200 +0180 +0060 +0010 +0018 +0018 +ENDCHAR +STARTCHAR U+0911 +ENCODING 2321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0026 +001E +0000 +1CFF +2266 +0266 +0666 +1C66 +0466 +43E6 +4366 +2766 +1E66 +0066 +0022 +0000 +ENDCHAR +STARTCHAR U+0912 +ENCODING 2322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +00F8 +0004 +1CFF +2266 +0266 +0666 +1C66 +0466 +43E6 +4366 +2766 +1E66 +0066 +0022 +0000 +ENDCHAR +STARTCHAR U+0913 +ENCODING 2323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00E0 +0010 +0008 +1CFF +2266 +0266 +0666 +1C66 +0466 +43E6 +4366 +2766 +1E66 +0066 +0022 +0000 +ENDCHAR +STARTCHAR U+0914 +ENCODING 2324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0070 +00E8 +0014 +1CFF +2266 +0266 +0666 +1C66 +0466 +43E6 +4366 +2766 +1E66 +0066 +0022 +0000 +ENDCHAR +STARTCHAR U+0915 +ENCODING 2325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0180 +0180 +1D80 +33E0 +2390 +2798 +1D98 +0198 +0198 +0180 +0080 +0000 +ENDCHAR +STARTCHAR U+0916 +ENCODING 2326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0818 +0818 +09D8 +3B38 +3A18 +1238 +11D8 +0818 +0618 +0198 +0008 +0000 +ENDCHAR +STARTCHAR U+0917 +ENCODING 2327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0198 +0198 +0198 +0198 +0798 +0398 +0198 +0098 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+0918 +ENCODING 2328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0C18 +0C18 +07D8 +0218 +0418 +0438 +0478 +03D8 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+0919 +ENCODING 2329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0060 +0060 +0FE0 +1800 +1804 +0FCE +0064 +1060 +0860 +07C0 +0000 +0000 +ENDCHAR +STARTCHAR U+091A +ENCODING 2330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +0018 +1FF8 +0318 +0638 +0678 +03D8 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+091B +ENCODING 2331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0010 +0010 +3C78 +70E4 +60C4 +2044 +1F2C +0C18 +1838 +1864 +0786 +0006 +ENDCHAR +STARTCHAR U+091C +ENCODING 2332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +0018 +03F8 +1198 +08D8 +08D8 +0798 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+091D +ENCODING 2333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0318 +0318 +1F18 +3018 +3018 +1FF8 +0118 +0D18 +1618 +1D18 +0088 +0000 +ENDCHAR +STARTCHAR U+091E +ENCODING 2334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +0718 +0598 +21B8 +21F8 +21D8 +1398 +0F18 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+091F +ENCODING 2335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +00C0 +00C0 +00C0 +07C0 +0C00 +1800 +1800 +1800 +0C10 +07E0 +0000 +0000 +ENDCHAR +STARTCHAR U+0920 +ENCODING 2336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0180 +0180 +0180 +0380 +0760 +0C10 +0818 +0818 +0838 +0470 +03E0 +0000 +ENDCHAR +STARTCHAR U+0921 +ENCODING 2337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +03F8 +0600 +0600 +03F0 +0018 +0418 +0218 +01F0 +0000 +0000 +ENDCHAR +STARTCHAR U+0922 +ENCODING 2338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0060 +0060 +07E0 +0C00 +1800 +18C0 +19A0 +0910 +0510 +0330 +01E0 +0000 +ENDCHAR +STARTCHAR U+0923 +ENCODING 2339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +1998 +1998 +1998 +1998 +1998 +0998 +0718 +0018 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+0924 +ENCODING 2340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +0018 +07F8 +0E18 +0C18 +0C18 +0618 +0218 +0118 +0088 +0000 +ENDCHAR +STARTCHAR U+0925 +ENCODING 2341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1C7F +1B18 +1998 +0998 +0398 +0F18 +0C38 +0478 +03D8 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+0926 +ENCODING 2342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +0018 +01F8 +0200 +0600 +0618 +0228 +01F0 +0008 +0004 +0000 +ENDCHAR +STARTCHAR U+0927 +ENCODING 2343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0E7F +1918 +1818 +1818 +0C18 +0398 +0618 +0C18 +0C38 +0C78 +03D8 +0008 +0000 +ENDCHAR +STARTCHAR U+0928 +ENCODING 2344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +0018 +07F8 +0618 +0618 +0218 +0018 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+0929 +ENCODING 2345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +0018 +07F8 +0618 +0618 +0218 +0018 +0118 +0398 +0108 +0000 +ENDCHAR +STARTCHAR U+092A +ENCODING 2346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0618 +0618 +0618 +0618 +0618 +0238 +01D8 +0018 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+092B +ENCODING 2347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +3180 +3180 +3180 +31F0 +31C8 +1384 +0F84 +0184 +018C +018C +0080 +0000 +ENDCHAR +STARTCHAR U+092C +ENCODING 2348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +07D8 +0E78 +0D18 +0C98 +0C78 +07F8 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+092D +ENCODING 2349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +38FF +3618 +3218 +1318 +0F18 +0318 +07F8 +0718 +0318 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+092E +ENCODING 2350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0618 +0618 +0618 +0618 +0618 +0FF8 +0618 +0218 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+092F +ENCODING 2351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0318 +0318 +0318 +0318 +0618 +0438 +0478 +03D8 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+0930 +ENCODING 2352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +00C0 +00C0 +00C0 +03C0 +0380 +0380 +0100 +0080 +0040 +0020 +0018 +0000 +ENDCHAR +STARTCHAR U+0931 +ENCODING 2353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +00C0 +00C0 +00C0 +03C0 +0380 +0380 +0100 +0080 +0440 +0E20 +0418 +0000 +ENDCHAR +STARTCHAR U+0932 +ENCODING 2354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +1C38 +3AF8 +31D8 +3198 +1818 +0818 +0418 +0318 +0008 +0000 +ENDCHAR +STARTCHAR U+0933 +ENCODING 2355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0030 +0030 +0070 +0EC8 +198C +318C +318C +3198 +1370 +0E00 +0000 +0000 +ENDCHAR +STARTCHAR U+0934 +ENCODING 2356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0030 +0030 +0070 +0EC8 +198C +318C +318C +3198 +1370 +0E00 +00C0 +00C0 +ENDCHAR +STARTCHAR U+0935 +ENCODING 2357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +03D8 +0F38 +0C18 +0C38 +0478 +03D8 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+0936 +ENCODING 2358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0618 +0618 +1F18 +0198 +0198 +1998 +1518 +1E18 +0218 +0118 +0088 +0000 +ENDCHAR +STARTCHAR U+0937 +ENCODING 2359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0C18 +0E18 +0D18 +0C98 +0C58 +0C38 +0638 +01D8 +0018 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+0938 +ENCODING 2360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0318 +0318 +0318 +0B18 +0F18 +0EF8 +0418 +0418 +0218 +0118 +0088 +0000 +ENDCHAR +STARTCHAR U+0939 +ENCODING 2361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +07F8 +0C00 +0C00 +06F0 +0198 +0310 +0300 +0180 +00FC +0000 +ENDCHAR +STARTCHAR U+093C +ENCODING 2364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0180 +0180 +0000 +ENDCHAR +STARTCHAR U+093D +ENCODING 2365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +007F +0080 +0080 +00C0 +0060 +0030 +0010 +0018 +0018 +0138 +00F0 +0000 +0000 +ENDCHAR +STARTCHAR U+093E +ENCODING 2366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +003F +000C +000C +024C +000C +042C +000C +024C +000C +000C +000C +000C +0004 +ENDCHAR +STARTCHAR U+093F +ENCODING 2367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C00 +6200 +3100 +FC00 +3000 +3000 +3240 +3000 +3420 +3000 +3240 +3000 +3000 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+0940 +ENCODING 2368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F0 +0108 +0108 +003F +000C +000C +024C +000C +042C +000C +024C +000C +000C +000C +000C +0004 +ENDCHAR +STARTCHAR U+0941 +ENCODING 2369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0980 +0440 +0380 +0000 +ENDCHAR +STARTCHAR U+0942 +ENCODING 2370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +01C0 +0220 +0190 +0000 +ENDCHAR +STARTCHAR U+0943 +ENCODING 2371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0180 +0200 +01C0 +0000 +ENDCHAR +STARTCHAR U+0944 +ENCODING 2372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +0180 +0200 +0180 +0200 +0180 +0000 +ENDCHAR +STARTCHAR U+0945 +ENCODING 2373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0240 +0180 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0946 +ENCODING 2374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0700 +0080 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0947 +ENCODING 2375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +0100 +0080 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0948 +ENCODING 2376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +0100 +1C80 +0380 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0949 +ENCODING 2377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0022 +001E +0000 +003F +000C +000C +024C +000C +042C +000C +024C +000C +000C +000C +000C +0004 +ENDCHAR +STARTCHAR U+094A +ENCODING 2378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0078 +0004 +003F +000C +000C +024C +000C +042C +000C +024C +000C +000C +000C +000C +0004 +ENDCHAR +STARTCHAR U+094B +ENCODING 2379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F0 +0008 +0004 +003F +000C +000C +024C +000C +042C +000C +024C +000C +000C +000C +000C +0004 +ENDCHAR +STARTCHAR U+094C +ENCODING 2380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F0 +01E8 +0014 +003F +000C +000C +024C +000C +042C +000C +024C +000C +000C +000C +000C +0004 +ENDCHAR +STARTCHAR U+094D +ENCODING 2381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0380 +0040 +0020 +0000 +ENDCHAR +STARTCHAR U+0950 +ENCODING 2384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0030 +0030 +0000 +3884 +7C78 +0200 +020C +0C1E +1812 +0412 +423E +43EC +3CC0 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+0951 +ENCODING 2385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0080 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0952 +ENCODING 2386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+0953 +ENCODING 2387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0100 +0080 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0954 +ENCODING 2388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +0100 +0000 +0000 +0240 +0000 +0420 +0000 +0240 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0958 +ENCODING 2392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +00C0 +00C0 +0EC0 +19F8 +11C8 +13CC +0ECC +00CC +00CC +04C0 +0E40 +0400 +ENDCHAR +STARTCHAR U+0959 +ENCODING 2393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0818 +0818 +09D8 +3B38 +3A18 +1238 +11D8 +0818 +0418 +0098 +01C8 +0080 +ENDCHAR +STARTCHAR U+095A +ENCODING 2394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0198 +0198 +0198 +0198 +0798 +0398 +0198 +0098 +0018 +0098 +01C8 +0080 +ENDCHAR +STARTCHAR U+095B +ENCODING 2395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +0018 +03F8 +1198 +08D8 +08D8 +0798 +0018 +0098 +01C8 +0080 +ENDCHAR +STARTCHAR U+095C +ENCODING 2396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0018 +0018 +03F8 +0600 +0600 +03F0 +0018 +0418 +03F0 +0000 +00C0 +00C0 +ENDCHAR +STARTCHAR U+095D +ENCODING 2397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0060 +0060 +07E0 +0C00 +18E0 +1990 +1910 +0D30 +07E0 +0000 +0180 +0180 +ENDCHAR +STARTCHAR U+095E +ENCODING 2398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +3180 +3180 +3180 +31F0 +31C8 +1384 +0F84 +0184 +018C +098C +1C80 +0800 +ENDCHAR +STARTCHAR U+095F +ENCODING 2399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0318 +0318 +0318 +0318 +0618 +0438 +0478 +03D8 +0018 +0118 +0388 +0100 +ENDCHAR +STARTCHAR U+0960 +ENCODING 2400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0300 +0300 +3318 +4B28 +07F0 +0F18 +3308 +4318 +0330 +031C +0110 +000E +ENDCHAR +STARTCHAR U+0961 +ENCODING 2401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +FFFF +0020 +0020 +1E70 +3198 +3198 +1030 +0860 +04C0 +003C +00C0 +00C0 +003C +ENDCHAR +STARTCHAR U+0962 +ENCODING 2402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +06C0 +0920 +0820 +0440 +0030 +0000 +ENDCHAR +STARTCHAR U+0963 +ENCODING 2403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0240 +0000 +0420 +0000 +06C0 +0920 +0840 +0430 +0040 +0030 +ENDCHAR +STARTCHAR U+0964 +ENCODING 2404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0100 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0080 +0000 +ENDCHAR +STARTCHAR U+0965 +ENCODING 2405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0240 +0360 +0360 +0360 +0360 +0360 +0360 +0360 +0360 +0360 +0360 +0120 +0000 +ENDCHAR +STARTCHAR U+0966 +ENCODING 2406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +03C0 +04E0 +0C70 +0C30 +0E30 +0720 +03C0 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0967 +ENCODING 2407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0380 +0740 +0660 +0660 +0260 +01E0 +00C0 +0180 +0300 +0100 +0080 +0040 +0020 +ENDCHAR +STARTCHAR U+0968 +ENCODING 2408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0FC0 +0E20 +0010 +0010 +0010 +0030 +0360 +02C0 +0380 +0040 +0020 +0010 +0008 +ENDCHAR +STARTCHAR U+0969 +ENCODING 2409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0FC0 +0E20 +0020 +0020 +03C0 +0020 +0010 +0330 +02E0 +03C0 +0040 +0020 +0010 +ENDCHAR +STARTCHAR U+096A +ENCODING 2410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2004 +100C +0818 +0430 +0260 +01C0 +0180 +0340 +0260 +0260 +0260 +01C0 +0000 +ENDCHAR +STARTCHAR U+096B +ENCODING 2411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0C00 +0C30 +0C30 +0430 +03E0 +00C0 +00C0 +0680 +0580 +0780 +0040 +0020 +0010 +ENDCHAR +STARTCHAR U+096C +ENCODING 2412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +03C0 +0C00 +0800 +0C00 +07C0 +0100 +0200 +0230 +0330 +00F0 +0040 +0040 +0020 +ENDCHAR +STARTCHAR U+096D +ENCODING 2413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1000 +10E0 +11D8 +1188 +088C +087C +0804 +0404 +0408 +0318 +00E0 +0000 +0000 +ENDCHAR +STARTCHAR U+096E +ENCODING 2414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1FF8 +0400 +0800 +1000 +1000 +1060 +10F0 +0F90 +0710 +0010 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+096F +ENCODING 2415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0380 +0640 +0620 +0610 +0200 +0380 +0480 +0C00 +0C00 +0C00 +0200 +01F0 +0000 +ENDCHAR +STARTCHAR U+0970 +ENCODING 2416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +01C0 +0220 +0220 +01C0 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+0E01 +ENCODING 3585 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +62 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+0E02 +ENCODING 3586 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +64 +64 +24 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+0E03 +ENCODING 3587 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +52 +72 +12 +22 +22 +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0E04 +ENCODING 3588 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +5A +7A +62 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0E05 +ENCODING 3589 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +34 +4A +42 +5A +7A +62 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0E06 +ENCODING 3590 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +52 +72 +12 +22 +22 +22 +72 +6C +00 +00 +ENDCHAR +STARTCHAR U+0E07 +ENCODING 3591 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +0C +04 +04 +44 +24 +14 +0C +00 +00 +ENDCHAR +STARTCHAR U+0E08 +ENCODING 3592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +1A +1A +0A +0A +0C +00 +00 +ENDCHAR +STARTCHAR U+0E09 +ENCODING 3593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +38 +44 +04 +64 +64 +24 +2E +36 +00 +00 +ENDCHAR +STARTCHAR U+0E0A +ENCODING 3594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +32 +34 +12 +22 +22 +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0E0B +ENCODING 3595 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +52 +74 +12 +22 +22 +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0E0C +ENCODING 3596 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +39 +45 +25 +45 +45 +45 +6F +6D +00 +00 +ENDCHAR +STARTCHAR U+0E0D +ENCODING 3597 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +32 +4A +2A +4A +4A +4A +6E +62 +0E +00 +ENDCHAR +STARTCHAR U+0E0E +ENCODING 3598 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +62 +22 +22 +22 +66 +7A +16 +00 +ENDCHAR +STARTCHAR U+0E0F +ENCODING 3599 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +62 +22 +22 +22 +6A +6E +1A +00 +ENDCHAR +STARTCHAR U+0E10 +ENCODING 3600 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1E +20 +1C +02 +1A +1A +06 +02 +2A +16 +ENDCHAR +STARTCHAR U+0E11 +ENCODING 3601 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +54 +7A +12 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+0E12 +ENCODING 3602 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +29 +55 +45 +75 +75 +55 +6F +4D +00 +00 +ENDCHAR +STARTCHAR U+0E13 +ENCODING 3603 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +32 +4A +2A +4A +4A +4A +6F +6B +00 +00 +ENDCHAR +STARTCHAR U+0E14 +ENCODING 3604 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +5A +5A +4A +72 +42 +00 +00 +ENDCHAR +STARTCHAR U+0E15 +ENCODING 3605 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +34 +4A +42 +5A +5A +4A +72 +42 +00 +00 +ENDCHAR +STARTCHAR U+0E16 +ENCODING 3606 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +62 +22 +22 +22 +32 +32 +00 +00 +ENDCHAR +STARTCHAR U+0E17 +ENCODING 3607 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +64 +6A +32 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+0E18 +ENCODING 3608 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +40 +78 +24 +24 +24 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+0E19 +ENCODING 3609 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +64 +64 +24 +44 +44 +44 +4E +36 +00 +00 +ENDCHAR +STARTCHAR U+0E1A +ENCODING 3610 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +32 +32 +12 +22 +22 +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0E1B +ENCODING 3611 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +02 +32 +32 +12 +22 +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0E1C +ENCODING 3612 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +69 +69 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0E1D +ENCODING 3613 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +01 +01 +69 +69 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0E1E +ENCODING 3614 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +69 +69 +29 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0E1F +ENCODING 3615 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +01 +01 +69 +69 +29 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0E20 +ENCODING 3616 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +62 +22 +22 +22 +62 +62 +00 +00 +ENDCHAR +STARTCHAR U+0E21 +ENCODING 3617 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +62 +62 +22 +22 +22 +22 +72 +6C +00 +00 +ENDCHAR +STARTCHAR U+0E22 +ENCODING 3618 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +62 +62 +42 +32 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0E23 +ENCODING 3619 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +40 +78 +04 +04 +04 +0C +0C +00 +00 +ENDCHAR +STARTCHAR U+0E24 +ENCODING 3620 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +62 +22 +22 +22 +32 +32 +02 +00 +ENDCHAR +STARTCHAR U+0E25 +ENCODING 3621 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +1A +26 +22 +32 +32 +00 +00 +ENDCHAR +STARTCHAR U+0E26 +ENCODING 3622 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +62 +22 +22 +22 +62 +62 +02 +00 +ENDCHAR +STARTCHAR U+0E27 +ENCODING 3623 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +38 +44 +04 +04 +04 +04 +0C +0C +00 +00 +ENDCHAR +STARTCHAR U+0E28 +ENCODING 3624 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +02 +3C +42 +5A +7A +62 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+0E29 +ENCODING 3625 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +62 +62 +22 +2A +2F +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+0E2A +ENCODING 3626 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +03 +3C +42 +02 +1A +26 +22 +32 +32 +00 +00 +ENDCHAR +STARTCHAR U+0E2B +ENCODING 3627 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +66 +66 +24 +2A +32 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+0E2C +ENCODING 3628 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +01 +01 +6A +69 +29 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+0E2D +ENCODING 3629 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +62 +62 +42 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+0E2E +ENCODING 3630 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +03 +3C +7A +02 +62 +62 +42 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+0E2F +ENCODING 3631 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +6C +74 +04 +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+0E30 +ENCODING 3632 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +34 +38 +00 +34 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E31 +ENCODING 3633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +31 +3E +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E32 +ENCODING 3634 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +38 +44 +04 +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+0E33 +ENCODING 3635 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +60 +60 +00 +1C +22 +02 +02 +02 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0E34 +ENCODING 3636 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +42 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E35 +ENCODING 3637 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3E +46 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E36 +ENCODING 3638 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3A +4E +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E37 +ENCODING 3639 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3A +46 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E38 +ENCODING 3640 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +06 +02 +ENDCHAR +STARTCHAR U+0E39 +ENCODING 3641 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +1A +0E +ENDCHAR +STARTCHAR U+0E3A +ENCODING 3642 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0C +0C +ENDCHAR +STARTCHAR U+0E3F +ENCODING 3647 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +7C +2A +2A +2A +3C +2A +2A +2A +7C +08 +00 +ENDCHAR +STARTCHAR U+0E40 +ENCODING 3648 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +0C +0C +00 +00 +ENDCHAR +STARTCHAR U+0E41 +ENCODING 3649 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +12 +12 +12 +12 +12 +12 +1B +1B +00 +00 +ENDCHAR +STARTCHAR U+0E42 +ENCODING 3650 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3E +41 +7C +04 +04 +04 +04 +04 +04 +06 +06 +00 +00 +ENDCHAR +STARTCHAR U+0E43 +ENCODING 3651 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +38 +44 +54 +34 +04 +04 +04 +04 +04 +06 +06 +00 +00 +ENDCHAR +STARTCHAR U+0E44 +ENCODING 3652 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +6C +14 +04 +04 +04 +04 +04 +04 +04 +06 +06 +00 +00 +ENDCHAR +STARTCHAR U+0E45 +ENCODING 3653 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +38 +44 +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR U+0E46 +ENCODING 3654 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +6C +72 +02 +02 +02 +02 +02 +02 +04 +08 +ENDCHAR +STARTCHAR U+0E47 +ENCODING 3655 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3E +54 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E48 +ENCODING 3656 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +04 +04 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E49 +ENCODING 3657 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +09 +1E +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E4A +ENCODING 3658 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +28 +55 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E4B +ENCODING 3659 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +0E +04 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E4C +ENCODING 3660 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +01 +0E +0C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E4D +ENCODING 3661 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +06 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E4E +ENCODING 3662 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +07 +04 +0A +0C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E4F +ENCODING 3663 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +3C +42 +5A +5A +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0E50 +ENCODING 3664 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0E51 +ENCODING 3665 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3C +42 +42 +5A +3A +02 +3C +00 +00 +ENDCHAR +STARTCHAR U+0E52 +ENCODING 3666 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +40 +4A +56 +52 +5A +5A +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+0E53 +ENCODING 3667 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +34 +4A +4A +4A +42 +72 +72 +00 +00 +ENDCHAR +STARTCHAR U+0E54 +ENCODING 3668 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +02 +3C +40 +40 +4C +4C +48 +3E +00 +00 +ENDCHAR +STARTCHAR U+0E55 +ENCODING 3669 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1A +16 +3C +40 +40 +4C +4C +48 +3E +00 +00 +ENDCHAR +STARTCHAR U+0E56 +ENCODING 3670 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +2C +12 +02 +02 +32 +32 +3C +00 +00 +ENDCHAR +STARTCHAR U+0E57 +ENCODING 3671 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +02 +2A +5A +4A +4A +4A +6A +6C +00 +00 +ENDCHAR +STARTCHAR U+0E58 +ENCODING 3672 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +03 +3C +40 +40 +46 +56 +52 +6E +00 +00 +ENDCHAR +STARTCHAR U+0E59 +ENCODING 3673 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +02 +1A +34 +50 +48 +48 +64 +64 +00 +00 +ENDCHAR +STARTCHAR U+0E5A +ENCODING 3674 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +02 +36 +3A +02 +02 +02 +06 +04 +00 +00 +ENDCHAR +STARTCHAR U+0E5B +ENCODING 3675 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +50 +58 +57 +54 +50 +60 +60 +00 +00 +ENDCHAR +STARTCHAR U+0E81 +ENCODING 3713 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +5C +22 +22 +22 +22 +22 +22 +62 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E82 +ENCODING 3714 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +04 +18 +20 +4C +52 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E84 +ENCODING 3716 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +42 +32 +42 +42 +42 +32 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E87 +ENCODING 3719 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +2C +14 +04 +04 +04 +04 +64 +44 +44 +38 +ENDCHAR +STARTCHAR U+0E88 +ENCODING 3720 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +02 +1A +26 +02 +02 +02 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E8A +ENCODING 3722 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +64 +08 +10 +20 +4C +72 +02 +02 +02 +ENDCHAR +STARTCHAR U+0E8D +ENCODING 3725 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +32 +42 +42 +32 +42 +42 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0E94 +ENCODING 3732 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +52 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E95 +ENCODING 3733 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +24 +5A +42 +42 +42 +42 +42 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E96 +ENCODING 3734 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +5C +22 +22 +22 +22 +22 +22 +32 +02 +02 +02 +ENDCHAR +STARTCHAR U+0E97 +ENCODING 3735 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +8C +52 +52 +52 +52 +52 +52 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+0E99 +ENCODING 3737 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +22 +52 +22 +22 +22 +22 +22 +5C +00 +00 +00 +ENDCHAR +STARTCHAR U+0E9A +ENCODING 3738 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +22 +52 +22 +42 +42 +42 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0E9B +ENCODING 3739 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +02 +02 +02 +22 +52 +22 +42 +42 +42 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0E9C +ENCODING 3740 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +01 +66 +86 +82 +82 +82 +92 +92 +6C +00 +00 +00 +ENDCHAR +STARTCHAR U+0E9D +ENCODING 3741 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +02 +02 +02 +62 +82 +82 +82 +82 +92 +92 +6C +00 +00 +00 +ENDCHAR +STARTCHAR U+0E9E +ENCODING 3742 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +42 +A2 +42 +82 +82 +92 +92 +6C +00 +00 +00 +ENDCHAR +STARTCHAR U+0E9F +ENCODING 3743 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +02 +02 +02 +42 +A2 +42 +82 +82 +92 +92 +6C +00 +00 +00 +ENDCHAR +STARTCHAR U+0EA1 +ENCODING 3745 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +22 +22 +22 +22 +22 +22 +22 +5C +00 +00 +00 +ENDCHAR +STARTCHAR U+0EA2 +ENCODING 3746 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +02 +02 +02 +32 +42 +42 +22 +42 +42 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0EA3 +ENCODING 3747 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +40 +3C +02 +62 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0EA5 +ENCODING 3749 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +02 +02 +02 +32 +4A +24 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EA7 +ENCODING 3751 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +02 +02 +02 +42 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0EAA +ENCODING 3754 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3A +44 +46 +7A +02 +32 +4A +44 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EAB +ENCODING 3755 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +96 +49 +49 +49 +49 +49 +49 +31 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EAD +ENCODING 3757 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +42 +46 +3A +02 +44 +38 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EAE +ENCODING 3758 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +32 +4C +40 +3C +02 +62 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0EAF +ENCODING 3759 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +22 +26 +1A +02 +04 +04 +08 +08 +10 +10 +20 +ENDCHAR +STARTCHAR U+0EB0 +ENCODING 3760 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +34 +38 +00 +34 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EB1 +ENCODING 3761 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +61 +62 +7C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EB2 +ENCODING 3762 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +24 +14 +04 +04 +04 +04 +04 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EB3 +ENCODING 3763 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +C0 +C0 +00 +0C +12 +0A +02 +02 +02 +02 +02 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EB4 +ENCODING 3764 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +7C +44 +28 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EB5 +ENCODING 3765 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +7C +44 +2E +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EB6 +ENCODING 3766 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +7C +54 +28 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EB7 +ENCODING 3767 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +7C +54 +2E +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EB8 +ENCODING 3768 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +08 +ENDCHAR +STARTCHAR U+0EB9 +ENCODING 3769 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +1A +0C +ENDCHAR +STARTCHAR U+0EBB +ENCODING 3771 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3E +61 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EBC +ENCODING 3772 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +32 +4C +ENDCHAR +STARTCHAR U+0EBD +ENCODING 3773 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3A +24 +18 +04 +04 +04 +04 +64 +44 +44 +38 +ENDCHAR +STARTCHAR U+0EC0 +ENCODING 3776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +0C +0C +00 +00 +00 +ENDCHAR +STARTCHAR U+0EC1 +ENCODING 3777 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +24 +24 +24 +24 +24 +24 +36 +36 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EC2 +ENCODING 3778 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +30 +4C +22 +18 +04 +04 +04 +04 +04 +04 +06 +06 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EC3 +ENCODING 3779 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +38 +44 +54 +34 +04 +04 +04 +04 +04 +04 +06 +06 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EC4 +ENCODING 3780 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +4C +34 +04 +04 +04 +04 +04 +04 +04 +06 +06 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EC6 +ENCODING 3782 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +6C +52 +52 +22 +02 +02 +02 +02 +02 +04 +08 +ENDCHAR +STARTCHAR U+0EC8 +ENCODING 3784 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EC9 +ENCODING 3785 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +14 +38 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0ECA +ENCODING 3786 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +28 +55 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0ECB +ENCODING 3787 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +1C +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0ECC +ENCODING 3788 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +02 +1C +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0ECD +ENCODING 3789 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +14 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0ED0 +ENCODING 3792 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0ED1 +ENCODING 3793 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +5A +3A +02 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+0ED2 +ENCODING 3794 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +38 +44 +40 +5C +5C +44 +38 +00 +00 +00 +ENDCHAR +STARTCHAR U+0ED3 +ENCODING 3795 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +14 +0A +44 +22 +22 +22 +22 +22 +5C +00 +00 +00 +ENDCHAR +STARTCHAR U+0ED4 +ENCODING 3796 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +3C +40 +40 +4C +4C +48 +3E +00 +00 +00 +ENDCHAR +STARTCHAR U+0ED5 +ENCODING 3797 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +1A +3C +40 +40 +4C +4C +48 +3E +00 +00 +00 +ENDCHAR +STARTCHAR U+0ED6 +ENCODING 3798 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +14 +0A +24 +42 +42 +42 +52 +52 +2C +00 +00 +00 +ENDCHAR +STARTCHAR U+0ED7 +ENCODING 3799 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +22 +22 +22 +22 +22 +62 +02 +02 +02 +ENDCHAR +STARTCHAR U+0ED8 +ENCODING 3800 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +2C +52 +52 +42 +42 +26 +0A +14 +2C +30 +ENDCHAR +STARTCHAR U+0ED9 +ENCODING 3801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +32 +4A +4A +4A +4A +4A +24 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EDC +ENCODING 3804 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +B9 +D5 +55 +55 +55 +55 +55 +55 +26 +00 +00 +00 +ENDCHAR +STARTCHAR U+0EDD +ENCODING 3805 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +89 +D5 +55 +55 +55 +55 +55 +5D +2E +00 +00 +00 +ENDCHAR +STARTCHAR U+0F40 +ENCODING 3904 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +2A +2A +4A +4A +02 +02 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0F41 +ENCODING 3905 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +52 +52 +52 +5A +46 +42 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0F42 +ENCODING 3906 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +4A +4A +4A +6A +1A +0A +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0F43 +ENCODING 3907 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +4A +6A +1A +0A +02 +7E +40 +5C +22 +04 +00 +ENDCHAR +STARTCHAR U+0F44 +ENCODING 3908 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +02 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F45 +ENCODING 3909 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +10 +18 +64 +22 +12 +0C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F46 +ENCODING 3910 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +10 +38 +54 +54 +54 +28 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F47 +ENCODING 3911 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +7E +40 +7C +02 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F49 +ENCODING 3913 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +30 +48 +08 +18 +24 +04 +04 +08 +10 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F4A +ENCODING 3914 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +3E +42 +40 +40 +20 +10 +08 +00 +00 +ENDCHAR +STARTCHAR U+0F4C +ENCODING 3916 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +3E +40 +40 +40 +40 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F4E +ENCODING 3918 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +10 +10 +38 +54 +54 +48 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+0F4F +ENCODING 3919 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +7C +42 +02 +02 +04 +08 +10 +00 +00 +ENDCHAR +STARTCHAR U+0F50 +ENCODING 3920 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +42 +46 +2A +12 +22 +62 +1A +06 +02 +00 +00 +ENDCHAR +STARTCHAR U+0F51 +ENCODING 3921 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +7C +02 +02 +02 +02 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F53 +ENCODING 3923 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +08 +08 +1C +2A +2A +12 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+0F54 +ENCODING 3924 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +72 +22 +22 +22 +62 +1A +06 +02 +02 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F55 +ENCODING 3925 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +72 +22 +22 +26 +6A +1A +06 +02 +02 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F56 +ENCODING 3926 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +22 +22 +22 +62 +1A +06 +02 +02 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F58 +ENCODING 3928 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7A +12 +12 +32 +5A +56 +22 +02 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F59 +ENCODING 3929 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +03 +7E +10 +18 +64 +22 +12 +0C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F5A +ENCODING 3930 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +03 +7C +10 +38 +54 +54 +54 +28 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F5B +ENCODING 3931 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +03 +7E +40 +7E +40 +7C +02 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F5D +ENCODING 3933 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +52 +52 +12 +1E +12 +1A +06 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F5E +ENCODING 3934 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +44 +44 +4E +55 +55 +49 +41 +31 +01 +00 +00 +ENDCHAR +STARTCHAR U+0F5F +ENCODING 3935 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +7E +02 +7E +02 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F60 +ENCODING 3936 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +44 +58 +04 +02 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F61 +ENCODING 3937 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +5A +52 +5A +26 +02 +02 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F62 +ENCODING 3938 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +10 +10 +3C +42 +02 +02 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F63 +ENCODING 3939 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +32 +4A +4A +5A +46 +02 +02 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F64 +ENCODING 3940 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +12 +12 +5E +22 +12 +02 +02 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F66 +ENCODING 3942 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +72 +52 +4A +4A +66 +16 +02 +02 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F67 +ENCODING 3943 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +20 +4C +32 +02 +04 +08 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+0F68 +ENCODING 3944 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +5D +59 +69 +55 +55 +23 +03 +01 +01 +00 +00 +00 +ENDCHAR +STARTCHAR U+10D0 +ENCODING 4304 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +10 +10 +0C +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+10D1 +ENCODING 4305 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +30 +10 +10 +3C +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+10D2 +ENCODING 4306 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +48 +48 +08 +08 +3C +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR U+10D3 +ENCODING 4307 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +2C +52 +52 +52 +52 +4C +20 +1C +02 +ENDCHAR +STARTCHAR U+10D4 +ENCODING 4308 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +02 +02 +02 +02 +02 +42 +42 +3C +ENDCHAR +STARTCHAR U+10D5 +ENCODING 4309 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +02 +1C +02 +02 +42 +42 +3C +ENDCHAR +STARTCHAR U+10D6 +ENCODING 4310 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +50 +50 +54 +38 +1C +12 +12 +12 +0C +00 +00 +ENDCHAR +STARTCHAR U+10D7 +ENCODING 4311 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +34 +4A +4A +4A +4A +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+10D8 +ENCODING 4312 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +24 +00 +00 +ENDCHAR +STARTCHAR U+10D9 +ENCODING 4313 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +02 +02 +02 +1C +02 +02 +42 +42 +3C +ENDCHAR +STARTCHAR U+10DA +ENCODING 4314 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +2A +55 +55 +55 +41 +42 +40 +3E +01 +ENDCHAR +STARTCHAR U+10DB +ENCODING 4315 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +02 +02 +3E +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+10DC +ENCODING 4316 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +3C +40 +40 +40 +7C +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+10DD +ENCODING 4317 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +28 +54 +54 +54 +54 +44 +24 +00 +00 +ENDCHAR +STARTCHAR U+10DE +ENCODING 4318 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +18 +04 +02 +02 +1C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+10DF +ENCODING 4319 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +06 +0A +52 +52 +22 +02 +22 +22 +1C +ENDCHAR +STARTCHAR U+10E0 +ENCODING 4320 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +38 +40 +68 +54 +54 +54 +54 +44 +24 +00 +00 +ENDCHAR +STARTCHAR U+10E1 +ENCODING 4321 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +48 +50 +48 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+10E2 +ENCODING 4322 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +3C +66 +66 +5A +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR U+10E3 +ENCODING 4323 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +6C +12 +12 +02 +02 +02 +22 +22 +1C +ENDCHAR +STARTCHAR U+10E4 +ENCODING 4324 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +34 +4A +4A +4A +4A +34 +02 +02 +1C +ENDCHAR +STARTCHAR U+10E5 +ENCODING 4325 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +0C +04 +04 +04 +1C +24 +04 +04 +04 +44 +38 +ENDCHAR +STARTCHAR U+10E6 +ENCODING 4326 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +28 +54 +54 +54 +44 +48 +40 +38 +04 +ENDCHAR +STARTCHAR U+10E7 +ENCODING 4327 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +22 +42 +42 +42 +26 +1A +42 +42 +3C +ENDCHAR +STARTCHAR U+10E8 +ENCODING 4328 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +28 +54 +54 +04 +04 +1C +24 +24 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+10E9 +ENCODING 4329 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +44 +78 +40 +5C +62 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+10EA +ENCODING 4330 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +4C +42 +42 +42 +5C +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR U+10EB +ENCODING 4331 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +02 +02 +02 +02 +3E +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+10EC +ENCODING 4332 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +28 +54 +54 +40 +40 +7C +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR U+10ED +ENCODING 4333 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +18 +28 +08 +08 +19 +26 +1D +04 +04 +44 +38 +ENDCHAR +STARTCHAR U+10EE +ENCODING 4334 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +48 +50 +78 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+10EF +ENCODING 4335 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +42 +24 +18 +18 +24 +42 +20 +40 +ENDCHAR +STARTCHAR U+10F0 +ENCODING 4336 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +0C +02 +12 +0C +02 +12 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+10F1 +ENCODING 4337 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +50 +4C +42 +52 +4C +42 +52 +4C +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+10F2 +ENCODING 4338 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +24 +18 +7E +00 +00 +ENDCHAR +STARTCHAR U+10F3 +ENCODING 4339 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +02 +04 +08 +1C +02 +02 +42 +42 +3C +ENDCHAR +STARTCHAR U+10F4 +ENCODING 4340 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +10 +0C +02 +02 +02 +1C +02 +02 +42 +42 +3C +ENDCHAR +STARTCHAR U+10F5 +ENCODING 4341 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +44 +44 +3E +04 +3E +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+10F6 +ENCODING 4342 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +10 +10 +10 +38 +54 +54 +38 +10 +10 +10 +08 +ENDCHAR +STARTCHAR U+10FB +ENCODING 4347 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +30 +30 +06 +06 +30 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1100 +ENCODING 4352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F80 +0180 +0180 +0180 +0100 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1101 +ENCODING 4353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F80 +1980 +1980 +1980 +1100 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1102 +ENCODING 4354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7000 +3000 +3000 +3000 +1F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1103 +ENCODING 4355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F80 +3000 +3000 +3000 +1F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1104 +ENCODING 4356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FC0 +3300 +3300 +3300 +1DC0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1105 +ENCODING 4357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F80 +0180 +3F80 +3000 +1F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1106 +ENCODING 4358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F80 +3180 +3180 +3180 +3F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1107 +ENCODING 4359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7380 +3180 +3F80 +3180 +3F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1108 +ENCODING 4360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76C0 +36C0 +3FC0 +36C0 +3FC0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1109 +ENCODING 4361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +0600 +0E00 +1980 +30C0 +4040 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+110A +ENCODING 4362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1980 +1980 +1F80 +36C0 +6660 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+110B +ENCODING 4363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F00 +3180 +3180 +3180 +1F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+110C +ENCODING 4364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F80 +0300 +0600 +1980 +60C0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+110D +ENCODING 4365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FC0 +0D80 +1B00 +3F80 +64C0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+110E +ENCODING 4366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F80 +0300 +0600 +1980 +60C0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+110F +ENCODING 4367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F80 +0180 +3F80 +0180 +0180 +0100 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1110 +ENCODING 4368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F80 +3000 +3F80 +3000 +1F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1111 +ENCODING 4369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F80 +3300 +3300 +3300 +7F80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1112 +ENCODING 4370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FC0 +1F00 +3180 +3180 +1F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1161 +ENCODING 4449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +0018 +0018 +001F +0018 +0018 +0018 +0010 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1162 +ENCODING 4450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +0036 +0036 +003E +0036 +0036 +0036 +0024 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1163 +ENCODING 4451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +0018 +001F +0018 +001F +0018 +0018 +0010 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1164 +ENCODING 4452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +0036 +003E +0036 +003E +0036 +0036 +0024 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1165 +ENCODING 4453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +000C +000C +00FC +000C +000C +000C +0008 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1166 +ENCODING 4454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +0036 +0036 +00F6 +0036 +0036 +0036 +0024 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1167 +ENCODING 4455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +000C +007C +000C +007C +000C +000C +0008 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1168 +ENCODING 4456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +0036 +00F6 +0036 +00F6 +0036 +0036 +0024 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1169 +ENCODING 4457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+116A +ENCODING 4458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +0018 +0018 +001F +0C18 +0C18 +7FD8 +0010 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+116B +ENCODING 4459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +0036 +0036 +003E +1836 +1836 +7FA6 +0004 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+116C +ENCODING 4460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +000C +000C +000C +0C0C +0C0C +7FEC +0008 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+116D +ENCODING 4461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0C60 +0C60 +7FFE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+116E +ENCODING 4462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFE +0180 +0100 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+116F +ENCODING 4463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +001C +000C +000C +000C +7FEC +060C +067C +060C +0408 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1170 +ENCODING 4464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +0036 +0036 +0036 +00F6 +0036 +7FB6 +0C36 +0824 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1171 +ENCODING 4465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0006 +0006 +0006 +0006 +0006 +3FE6 +0606 +0604 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1172 +ENCODING 4466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFE +0660 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1173 +ENCODING 4467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1174 +ENCODING 4468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +000C +000C +000C +000C +000C +7FEC +0008 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1175 +ENCODING 4469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +000C +000C +000C +000C +000C +000C +0008 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+11A8 +ENCODING 4520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+11A9 +ENCODING 4521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+11AA +ENCODING 4522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+11AB +ENCODING 4523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+11AC +ENCODING 4524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+11AD +ENCODING 4525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+11AE +ENCODING 4526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+11AF +ENCODING 4527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+11B0 +ENCODING 4528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+11B1 +ENCODING 4529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+11B2 +ENCODING 4530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+11B3 +ENCODING 4531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+11B4 +ENCODING 4532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+11B5 +ENCODING 4533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+11B6 +ENCODING 4534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+11B7 +ENCODING 4535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+11B8 +ENCODING 4536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+11B9 +ENCODING 4537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+11BA +ENCODING 4538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+11BB +ENCODING 4539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+11BC +ENCODING 4540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+11BD +ENCODING 4541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+11BE +ENCODING 4542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+11BF +ENCODING 4543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+11C0 +ENCODING 4544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+11C1 +ENCODING 4545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+11C2 +ENCODING 4546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+1200 +ENCODING 4608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +01C0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +3180 +3180 +1F00 +0E00 +0000 +0000 +ENDCHAR +STARTCHAR U+1201 +ENCODING 4609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +01C0 +30C0 +30C0 +30C0 +30FC +30CC +30C0 +3180 +3180 +1F00 +0E00 +0000 +0000 +ENDCHAR +STARTCHAR U+1202 +ENCODING 4610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0660 +0C60 +0C60 +0C60 +0C60 +07C0 +03C0 +00C0 +0180 +0300 +0330 +03F0 +0000 +0000 +ENDCHAR +STARTCHAR U+1203 +ENCODING 4611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0660 +0C60 +0C60 +0C60 +0C60 +07C0 +03C0 +00C0 +0180 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1204 +ENCODING 4612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0660 +0C60 +0C60 +0C60 +0C60 +07C0 +03C0 +00C0 +01C0 +0340 +0320 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+1205 +ENCODING 4613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1870 +1830 +1C30 +0E30 +0630 +0C30 +0C30 +0C30 +0C60 +07E0 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1206 +ENCODING 4614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +00F0 +30C8 +30D8 +30E0 +30C0 +30C0 +30C0 +3180 +3180 +1F00 +0E00 +0000 +0000 +ENDCHAR +STARTCHAR U+1208 +ENCODING 4616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +0780 +07C0 +0CE0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+1209 +ENCODING 4617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C00 +0C00 +0C00 +1E00 +1F00 +3380 +3180 +3180 +31F8 +3198 +3180 +3180 +0000 +0000 +ENDCHAR +STARTCHAR U+120A +ENCODING 4618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C00 +0C00 +0C00 +1E00 +1F00 +3380 +3180 +3180 +3180 +3180 +3198 +31F8 +0000 +0000 +ENDCHAR +STARTCHAR U+120B +ENCODING 4619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +0780 +07C0 +0CE0 +0C60 +0C60 +0C60 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+120C +ENCODING 4620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C00 +0C00 +0C00 +1E00 +1F00 +3380 +3180 +3180 +3180 +31F0 +3198 +31F0 +0000 +0000 +ENDCHAR +STARTCHAR U+120D +ENCODING 4621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +0780 +07C0 +0CE0 +0C60 +1860 +1860 +1E60 +1B60 +1E60 +0000 +0000 +ENDCHAR +STARTCHAR U+120E +ENCODING 4622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C00 +0C00 +0C00 +1E00 +1F00 +3380 +3180 +31F8 +31AC +31B8 +3180 +3180 +0000 +0000 +ENDCHAR +STARTCHAR U+120F +ENCODING 4623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +0780 +07C0 +0CE0 +0C60 +0C60 +0C60 +0060 +0060 +0060 +03FC +070E +ENDCHAR +STARTCHAR U+1210 +ENCODING 4624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +0180 +0180 +07E0 +0DB0 +0DB0 +1998 +1998 +1998 +1998 +0000 +0000 +ENDCHAR +STARTCHAR U+1211 +ENCODING 4625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0600 +0600 +1F80 +36C0 +36C0 +667E +6666 +6660 +6660 +0000 +0000 +ENDCHAR +STARTCHAR U+1212 +ENCODING 4626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0600 +0600 +1F80 +36C0 +36C0 +6660 +6660 +6666 +667E +0000 +0000 +ENDCHAR +STARTCHAR U+1213 +ENCODING 4627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +0180 +0180 +07E0 +0DB0 +0DB0 +1998 +0018 +0018 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+1214 +ENCODING 4628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0600 +0600 +1F80 +36C0 +36C0 +6640 +6678 +664C +6678 +0000 +0000 +ENDCHAR +STARTCHAR U+1215 +ENCODING 4629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0780 +0180 +07E0 +0DB0 +0DB0 +1998 +1998 +1998 +1998 +0000 +0000 +ENDCHAR +STARTCHAR U+1216 +ENCODING 4630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +0180 +0180 +07E0 +0DB0 +0DB0 +1998 +1800 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+1217 +ENCODING 4631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +0300 +0300 +0300 +0300 +0FC0 +1B60 +1B60 +3330 +0030 +0030 +0030 +01FE +0387 +0000 +ENDCHAR +STARTCHAR U+1218 +ENCODING 4632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0FFC +1FFC +1124 +3164 +2344 +264C +3C78 +3C70 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1219 +ENCODING 4633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3FF0 +7FF0 +4490 +C59E +8D12 +9932 +F1E0 +F1C0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+121A +ENCODING 4634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +3FF8 +6288 +4288 +4508 +7DF8 +38F8 +0010 +0010 +0020 +0026 +003E +0000 +0000 +ENDCHAR +STARTCHAR U+121B +ENCODING 4635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FFC +1FFC +3144 +2144 +2284 +3EFC +1C7C +0008 +0008 +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+121C +ENCODING 4636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +3FF8 +6288 +4288 +4508 +7DF8 +38F8 +0010 +0010 +003C +0026 +003C +0000 +0000 +ENDCHAR +STARTCHAR U+121D +ENCODING 4637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1FF8 +3288 +2288 +2288 +22F8 +3E70 +1E00 +0200 +0600 +0C00 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+121E +ENCODING 4638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1FF8 +3288 +2288 +2288 +22F8 +3E70 +1E00 +0200 +0200 +0200 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+121F +ENCODING 4639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +3FF8 +6288 +4288 +4508 +7DF8 +38F8 +0010 +0010 +0030 +0020 +0020 +01F8 +030C +ENDCHAR +STARTCHAR U+1220 +ENCODING 4640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0998 +1998 +1998 +1998 +1998 +19B0 +19F0 +0D80 +0780 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1221 +ENCODING 4641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +26C0 +66C0 +66FC +66CC +66C0 +66C0 +67C0 +3600 +1E00 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1222 +ENCODING 4642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6640 +6660 +6660 +6660 +6660 +76E0 +3FE0 +0060 +0060 +0060 +0066 +007E +0000 +0000 +ENDCHAR +STARTCHAR U+1223 +ENCODING 4643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1990 +1998 +1998 +1998 +1998 +1DB8 +0FF8 +0018 +0018 +0018 +0018 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+1224 +ENCODING 4644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3320 +3330 +3330 +3330 +3330 +3B70 +1FF0 +0030 +0030 +0038 +0064 +0078 +0000 +0000 +ENDCHAR +STARTCHAR U+1225 +ENCODING 4645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1990 +1998 +1998 +1998 +1998 +1DB8 +1FF0 +1C00 +1800 +1800 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+1226 +ENCODING 4646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1998 +1998 +1998 +1998 +1998 +1DB8 +0FF0 +0380 +0300 +0700 +0E00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+1227 +ENCODING 4647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6640 +6660 +6660 +6660 +6660 +76E0 +3FE0 +0060 +0060 +0060 +0060 +0060 +03FC +070E +0000 +ENDCHAR +STARTCHAR U+1228 +ENCODING 4648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +0300 +0700 +0E00 +1C00 +1800 +1800 +1C60 +0FE0 +07E0 +0000 +0000 +ENDCHAR +STARTCHAR U+1229 +ENCODING 4649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0700 +0E00 +1C00 +1800 +3000 +3800 +1FF0 +0FF0 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+122A +ENCODING 4650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +0300 +0700 +0E00 +1C00 +1860 +1870 +1C30 +0FE0 +07C0 +0000 +0000 +ENDCHAR +STARTCHAR U+122B +ENCODING 4651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +0600 +0E00 +1C00 +3800 +3078 +30F8 +3998 +1F80 +0F00 +0000 +0000 +ENDCHAR +STARTCHAR U+122C +ENCODING 4652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +0300 +0700 +0E00 +1C00 +1800 +1800 +1CF0 +0F98 +07F0 +0000 +0000 +ENDCHAR +STARTCHAR U+122D +ENCODING 4653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +07E0 +0FE0 +1860 +1800 +1800 +1800 +1800 +1800 +1860 +1FE0 +0FC0 +0000 +0000 +ENDCHAR +STARTCHAR U+122E +ENCODING 4654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +07F0 +0F98 +18F0 +1800 +1800 +1800 +1800 +1800 +1860 +1FE0 +0FC0 +0000 +0000 +ENDCHAR +STARTCHAR U+122F +ENCODING 4655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3030 +1CE0 +0300 +0300 +0600 +0E00 +1C00 +3800 +3078 +30F8 +3998 +1F80 +0F00 +0000 +ENDCHAR +STARTCHAR U+1230 +ENCODING 4656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+1231 +ENCODING 4657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0400 +0E00 +1F00 +3180 +3180 +3180 +31F8 +3198 +3180 +3180 +3180 +0000 +0000 +ENDCHAR +STARTCHAR U+1232 +ENCODING 4658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0400 +0E00 +1F00 +3180 +3180 +3180 +3180 +3180 +3180 +3198 +31F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1233 +ENCODING 4659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C60 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+1234 +ENCODING 4660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0200 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18E0 +18D0 +18C8 +18F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1235 +ENCODING 4661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0300 +0180 +01C0 +03E0 +0630 +0630 +0630 +0630 +0630 +0630 +0630 +0000 +0000 +ENDCHAR +STARTCHAR U+1236 +ENCODING 4662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+1237 +ENCODING 4663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C60 +0060 +0060 +0060 +01F8 +030C +ENDCHAR +STARTCHAR U+1238 +ENCODING 4664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0200 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +18C0 +18C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1239 +ENCODING 4665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0200 +0700 +0F80 +18C0 +18C0 +18FC +18CC +18CC +18C0 +18C0 +0000 +0000 +ENDCHAR +STARTCHAR U+123A +ENCODING 4666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0200 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +18CC +18FC +0000 +0000 +ENDCHAR +STARTCHAR U+123B +ENCODING 4667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1830 +0FE0 +0100 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+123C +ENCODING 4668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0200 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18F8 +18CC +18F8 +0000 +0000 +ENDCHAR +STARTCHAR U+123D +ENCODING 4669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +0FC0 +0180 +01C0 +03E0 +0330 +0630 +0630 +0630 +0630 +0630 +0630 +0000 +0000 +ENDCHAR +STARTCHAR U+123E +ENCODING 4670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1830 +0FE0 +0100 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+123F +ENCODING 4671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0200 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +00C0 +00C0 +03F0 +0618 +ENDCHAR +STARTCHAR U+1240 +ENCODING 4672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1241 +ENCODING 4673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +07E0 +1B30 +3330 +3360 +1F80 +0300 +03F0 +0330 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1242 +ENCODING 4674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +07E0 +1B30 +3330 +3360 +1F80 +0300 +0300 +0330 +03F0 +0000 +0000 +ENDCHAR +STARTCHAR U+1243 +ENCODING 4675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0300 +0600 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+1244 +ENCODING 4676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +07E0 +1B30 +3330 +3360 +1F80 +0300 +03E0 +0330 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+1245 +ENCODING 4677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0780 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1246 +ENCODING 4678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01C0 +0260 +02C0 +0300 +07E0 +1B30 +3330 +3360 +1F80 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1248 +ENCODING 4680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +01F8 +01AC +01B8 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+124A +ENCODING 4682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0FC0 +366C +666C +66FC +3F07 +0603 +0600 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+124B +ENCODING 4683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0180 +0180 +0180 +07E0 +0C30 +ENDCHAR +STARTCHAR U+124C +ENCODING 4684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0180 +01F0 +0198 +07F0 +0C00 +ENDCHAR +STARTCHAR U+124D +ENCODING 4685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0618 +0618 +0FFE +3666 +6660 +66C0 +3F00 +0600 +0600 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+1250 +ENCODING 4688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1251 +ENCODING 4689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +0FC0 +0300 +0300 +07E0 +1B30 +3330 +3360 +1F80 +0300 +03F0 +0330 +0000 +0000 +ENDCHAR +STARTCHAR U+1252 +ENCODING 4690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +0FC0 +0300 +0300 +07E0 +1B30 +3330 +3360 +1F80 +0300 +0330 +03F0 +0000 +0000 +ENDCHAR +STARTCHAR U+1253 +ENCODING 4691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0300 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+1254 +ENCODING 4692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +0FC0 +0300 +07E0 +1B30 +3330 +3360 +1F80 +0300 +03E0 +0330 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+1255 +ENCODING 4693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +30C0 +1F80 +0600 +0780 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1256 +ENCODING 4694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C18 +07F0 +0120 +0160 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1258 +ENCODING 4696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +0FC0 +0300 +07E0 +1B30 +3330 +3360 +1F80 +03F0 +0358 +0370 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+125A +ENCODING 4698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +30C0 +1F80 +0600 +0600 +0FC0 +366C +666C +66FC +3F07 +0603 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+125B +ENCODING 4699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +0180 +0180 +07E0 +0C30 +ENDCHAR +STARTCHAR U+125C +ENCODING 4700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0180 +0180 +03F0 +0D98 +1998 +19B0 +0FC0 +0180 +01F0 +0198 +07F0 +0C00 +ENDCHAR +STARTCHAR U+125D +ENCODING 4701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +30C0 +1F80 +0618 +0618 +0FFE +3666 +6660 +66C0 +3F00 +0600 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+1260 +ENCODING 4704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+1261 +ENCODING 4705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0E00 +1F00 +3180 +3180 +3180 +31F8 +3198 +3198 +3180 +3180 +3180 +0000 +0000 +ENDCHAR +STARTCHAR U+1262 +ENCODING 4706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0E00 +1F00 +3180 +3180 +3180 +3180 +3180 +3180 +3180 +3198 +31F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1263 +ENCODING 4707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C60 +0060 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+1264 +ENCODING 4708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +18C0 +18F8 +18CC +18F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1265 +ENCODING 4709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +00E0 +01F0 +0318 +0318 +0318 +3F18 +3318 +3318 +0318 +0318 +0318 +0000 +0000 +ENDCHAR +STARTCHAR U+1266 +ENCODING 4710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C00 +0C00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+1267 +ENCODING 4711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0380 +07C0 +0C60 +0C60 +0C60 +0C60 +0C60 +0060 +0060 +0060 +0060 +01F8 +030C +ENDCHAR +STARTCHAR U+1268 +ENCODING 4712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0000 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +18C0 +18C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1269 +ENCODING 4713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0000 +0700 +0F80 +18C0 +18C0 +18FC +18CC +18CC +18C0 +18C0 +0000 +0000 +ENDCHAR +STARTCHAR U+126A +ENCODING 4714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0000 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +18CC +18FC +0000 +0000 +ENDCHAR +STARTCHAR U+126B +ENCODING 4715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0000 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+126C +ENCODING 4716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +60C0 +3F80 +0000 +0E00 +1F00 +3180 +3180 +3180 +3180 +31F0 +3198 +31F0 +0000 +0000 +ENDCHAR +STARTCHAR U+126D +ENCODING 4717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C18 +07F0 +0000 +01C0 +03E0 +0630 +0630 +7E30 +6630 +6630 +0630 +0630 +0000 +0000 +ENDCHAR +STARTCHAR U+126E +ENCODING 4718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0000 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+126F +ENCODING 4719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3060 +1FC0 +0000 +0700 +0F80 +18C0 +18C0 +18C0 +18C0 +18C0 +00C0 +00C0 +03F0 +0618 +ENDCHAR +STARTCHAR U+1270 +ENCODING 4720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0300 +0300 +0300 +3FF0 +7FF8 +6318 +0300 +0300 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1271 +ENCODING 4721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0300 +0300 +0300 +3FF0 +7FF8 +6318 +0300 +03F0 +0330 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1272 +ENCODING 4722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0300 +0300 +0300 +3FF0 +7FF8 +6318 +0300 +0300 +0300 +0330 +03F0 +0000 +0000 +ENDCHAR +STARTCHAR U+1273 +ENCODING 4723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0300 +0300 +0300 +3FF0 +7FF8 +6318 +0300 +0300 +0700 +0E00 +1C00 +0000 +0000 +ENDCHAR +STARTCHAR U+1274 +ENCODING 4724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0300 +0300 +0300 +3FF0 +7FF8 +6318 +0300 +0300 +03E0 +0330 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+1275 +ENCODING 4725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0700 +0380 +0180 +0180 +1FF8 +3FFC +318C +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1276 +ENCODING 4726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03E0 +0320 +0160 +0180 +1FF8 +3FFC +318C +0180 +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1277 +ENCODING 4727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0380 +0180 +0180 +0180 +1FF8 +3FFC +318C +0180 +0180 +0180 +0180 +0180 +07E0 +0C30 +ENDCHAR +STARTCHAR U+1278 +ENCODING 4728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1818 +1FF8 +3FFC +318C +0180 +1FF8 +3FFC +318C +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1279 +ENCODING 4729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1818 +1FF8 +3FFC +318C +0180 +1FF8 +3FFC +318C +0180 +01F8 +0198 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+127A +ENCODING 4730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1818 +1FF8 +3FFC +318C +0180 +1FF8 +3FFC +318C +0180 +0180 +0198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+127B +ENCODING 4731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3030 +3FF0 +7FF8 +6318 +0300 +3FF0 +7FF8 +6318 +0300 +0700 +0E00 +1C00 +0000 +0000 +ENDCHAR +STARTCHAR U+127C +ENCODING 4732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3030 +3FF0 +7FF8 +6318 +0300 +3FF0 +7FF8 +6318 +0300 +03E0 +0330 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+127D +ENCODING 4733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +30C0 +3FC0 +7FE0 +6660 +0700 +0180 +1FF8 +3FFC +318C +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+127E +ENCODING 4734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +1FF8 +1A58 +0240 +0180 +1FF8 +3FFC +318C +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+127F +ENCODING 4735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1818 +1FF8 +3FFC +318C +0180 +1FF8 +3FFC +318C +0180 +0180 +0180 +0180 +07E0 +0C30 +ENDCHAR +STARTCHAR U+1280 +ENCODING 4736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +1F80 +19E0 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+1281 +ENCODING 4737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +3F00 +33C0 +00C0 +00C0 +00FC +00CC +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1282 +ENCODING 4738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +3F00 +33C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00CC +00FC +0000 +0000 +ENDCHAR +STARTCHAR U+1283 +ENCODING 4739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +00C0 +00C0 +00C0 +0FC0 +0CF0 +0030 +0030 +0030 +00E0 +0180 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1284 +ENCODING 4740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +3F00 +33C0 +00C0 +00C0 +00C0 +00C0 +00F8 +00CC +00F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1285 +ENCODING 4741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +00C0 +00C0 +00C0 +03C0 +06F0 +0C30 +0C30 +0030 +0030 +0030 +0030 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+1286 +ENCODING 4742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F8 +03E4 +0638 +3E00 +3600 +0600 +07E0 +03E0 +0060 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+1288 +ENCODING 4744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +7E00 +6780 +0180 +01F8 +01AC +01B8 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+128A +ENCODING 4746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +7E00 +6780 +0198 +0198 +01F8 +018E +0186 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+128B +ENCODING 4747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +1F80 +19E0 +0060 +0060 +0060 +0060 +0060 +0060 +0060 +01F8 +030C +ENDCHAR +STARTCHAR U+128C +ENCODING 4748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +3F00 +33C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00F8 +00CC +03F8 +0600 +ENDCHAR +STARTCHAR U+128D +ENCODING 4749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +7E30 +67B0 +01FC +018C +0180 +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1290 +ENCODING 4752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0780 +01C0 +0180 +0180 +0180 +0300 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1291 +ENCODING 4753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0780 +01C0 +0180 +0180 +01F0 +0330 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1292 +ENCODING 4754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C00 +0C00 +0C00 +0F00 +0380 +0300 +0300 +0300 +0600 +0600 +0660 +07E0 +0000 +0000 +ENDCHAR +STARTCHAR U+1293 +ENCODING 4755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07C0 +0FE0 +1860 +3000 +3800 +1F00 +0380 +0180 +0100 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1294 +ENCODING 4756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0780 +01C0 +0180 +0180 +0180 +03C0 +0320 +0360 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1295 +ENCODING 4757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FC0 +3F80 +3180 +0300 +07C0 +00C0 +0180 +0300 +0300 +0600 +0600 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+1296 +ENCODING 4758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F0 +0FC8 +1858 +3030 +3800 +1F00 +0380 +0180 +0100 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1297 +ENCODING 4759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +07C0 +0FE0 +1860 +3000 +3800 +1F00 +0380 +0180 +0100 +0300 +0300 +0FC0 +1860 +ENDCHAR +STARTCHAR U+1298 +ENCODING 4760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +1FF8 +1188 +0180 +01E0 +0070 +0060 +0060 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1299 +ENCODING 4761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +3FF0 +2310 +0300 +03C0 +00E0 +00C0 +00F8 +0198 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+129A +ENCODING 4762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +3FF0 +2310 +0300 +03C0 +00E0 +00C0 +00C0 +0180 +0180 +0198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+129B +ENCODING 4763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C30 +1FF8 +1188 +07C0 +0FE0 +1860 +3000 +3800 +1F00 +0380 +0180 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+129C +ENCODING 4764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +3FF0 +2310 +0300 +03C0 +00E0 +00C0 +00C0 +01E0 +0190 +01B0 +01E0 +0000 +0000 +ENDCHAR +STARTCHAR U+129D +ENCODING 4765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +30C0 +7FE0 +4620 +1FC0 +3F80 +3180 +0300 +07C0 +00C0 +0180 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+129E +ENCODING 4766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +1FF0 +1110 +07F0 +0FC8 +1858 +3030 +3800 +1F00 +0380 +0180 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+129F +ENCODING 4767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C30 +1FF8 +1188 +07C0 +0FE0 +1860 +3000 +3800 +1F00 +0380 +0180 +0300 +0300 +0FC0 +1860 +ENDCHAR +STARTCHAR U+12A0 +ENCODING 4768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0780 +0180 +0380 +03C0 +06E0 +0E60 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+12A1 +ENCODING 4769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1800 +1800 +1800 +1E00 +0600 +0E00 +0F00 +1B80 +39F8 +3198 +3180 +3180 +0000 +0000 +ENDCHAR +STARTCHAR U+12A2 +ENCODING 4770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1800 +1800 +1800 +1E00 +0600 +0E00 +0F00 +1B80 +3980 +3180 +3198 +31F8 +0000 +0000 +ENDCHAR +STARTCHAR U+12A3 +ENCODING 4771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0780 +0180 +03C0 +06E0 +0C60 +0C60 +0C60 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+12A4 +ENCODING 4772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1800 +1800 +1800 +1E00 +0600 +0E00 +0F00 +1B80 +3980 +31F0 +3198 +31F0 +0000 +0000 +ENDCHAR +STARTCHAR U+12A5 +ENCODING 4773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C00 +0C00 +0E00 +0600 +0300 +0380 +07C0 +0EE0 +0C60 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+12A6 +ENCODING 4774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0780 +0180 +03C0 +06E0 +0C60 +0C60 +0C60 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+12A7 +ENCODING 4775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +18C0 +1FC0 +3660 +0600 +0780 +0180 +0380 +03C0 +06E0 +0E60 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+12A8 +ENCODING 4776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1800 +19C0 +1FE0 +1E30 +0630 +0630 +0630 +0630 +0630 +0630 +0630 +0000 +0000 +ENDCHAR +STARTCHAR U+12A9 +ENCODING 4777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6000 +6700 +7F80 +78C0 +18C0 +18C0 +18FC +18CC +18C0 +18C0 +18C0 +0000 +0000 +ENDCHAR +STARTCHAR U+12AA +ENCODING 4778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6000 +6700 +7F80 +78C0 +18C0 +18C0 +18C0 +18C0 +18C0 +18CC +18FC +0000 +0000 +ENDCHAR +STARTCHAR U+12AB +ENCODING 4779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1800 +19C0 +1FE0 +1E30 +0630 +0630 +0630 +0630 +0030 +0030 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+12AC +ENCODING 4780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6000 +6700 +7F80 +78C0 +18C0 +18C0 +18C0 +18C0 +18F8 +18CC +18F8 +0000 +0000 +ENDCHAR +STARTCHAR U+12AD +ENCODING 4781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1800 +19C0 +1BE0 +1E30 +0C30 +0E30 +0630 +0630 +0630 +0630 +0630 +0000 +0000 +ENDCHAR +STARTCHAR U+12AE +ENCODING 4782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1800 +19C0 +1FE0 +1E30 +0630 +0630 +0630 +0630 +0600 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+12B0 +ENCODING 4784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6000 +6600 +7F00 +7980 +1980 +19F8 +19AC +19B8 +1980 +1980 +1980 +0000 +0000 +ENDCHAR +STARTCHAR U+12B2 +ENCODING 4786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6000 +6600 +7F00 +7980 +1998 +1998 +19F8 +198E +1986 +1980 +1980 +0000 +0000 +ENDCHAR +STARTCHAR U+12B3 +ENCODING 4787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1800 +19C0 +1FE0 +1E30 +0630 +0630 +0630 +0630 +0030 +0030 +0030 +00FC +0186 +ENDCHAR +STARTCHAR U+12B4 +ENCODING 4788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6000 +6700 +7F80 +78C0 +18C0 +18C0 +18C0 +18C0 +00C0 +00F8 +00CC +03F8 +0600 +ENDCHAR +STARTCHAR U+12B5 +ENCODING 4789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6000 +6630 +7F30 +79FC +198C +1980 +1980 +1980 +1980 +1980 +1980 +0000 +0000 +ENDCHAR +STARTCHAR U+12B8 +ENCODING 4792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6180 +3F00 +0C00 +0DC0 +0FE0 +0630 +0630 +0630 +0630 +0630 +0630 +0630 +0000 +0000 +ENDCHAR +STARTCHAR U+12B9 +ENCODING 4793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C7E +0C66 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+12BA +ENCODING 4794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C60 +0C60 +0C60 +0C60 +0C66 +0C7E +0000 +0000 +ENDCHAR +STARTCHAR U+12BB +ENCODING 4795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6180 +3F00 +0C00 +0DC0 +0FE0 +0630 +0630 +0630 +0630 +0030 +0030 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+12BC +ENCODING 4796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6180 +3F00 +0C00 +0DC0 +0FE0 +0630 +0630 +0630 +0630 +063E +0633 +063E +0000 +0000 +ENDCHAR +STARTCHAR U+12BD +ENCODING 4797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6180 +3F00 +0C00 +0EE0 +0FF0 +0318 +0398 +0198 +0198 +0198 +0198 +0198 +0000 +0000 +ENDCHAR +STARTCHAR U+12BE +ENCODING 4798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6180 +3F00 +0C00 +0DC0 +0FE0 +0630 +0630 +0630 +0630 +0600 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+12C0 +ENCODING 4800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +C300 +7E00 +1800 +1B80 +1FC0 +0C60 +0C7E +0C6B +0C6E +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+12C2 +ENCODING 4802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +C300 +7E00 +1800 +1B00 +1F80 +0CCC +0CCC +0CFC +0CC7 +0CC3 +0CC0 +0CC0 +0000 +0000 +ENDCHAR +STARTCHAR U+12C3 +ENCODING 4803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6180 +3F00 +0C00 +0DC0 +0FE0 +0670 +0630 +0630 +0630 +0030 +0030 +0030 +00FC +0186 +ENDCHAR +STARTCHAR U+12C4 +ENCODING 4804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6180 +3F00 +0C00 +0DC0 +0FE0 +0670 +0630 +0630 +0630 +0030 +003E +0033 +00FE +0180 +ENDCHAR +STARTCHAR U+12C5 +ENCODING 4805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +C300 +7E00 +180C +1B8C +1FFF +0C63 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+12C8 +ENCODING 4808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0FF0 +1DB8 +3198 +3198 +3318 +3330 +3B70 +1FC0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+12C9 +ENCODING 4809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3FC0 +76E0 +C660 +C660 +CC60 +CCE0 +EDC6 +7FFC +000C +0000 +0000 +ENDCHAR +STARTCHAR U+12CA +ENCODING 4810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +1DB8 +3198 +3198 +3318 +3BB0 +1FE0 +0300 +0300 +0700 +0660 +07E0 +0000 +0000 +ENDCHAR +STARTCHAR U+12CB +ENCODING 4811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +1DB8 +3198 +3198 +3318 +3BB0 +1FE0 +0300 +0300 +0300 +0300 +0700 +0000 +0000 +ENDCHAR +STARTCHAR U+12CC +ENCODING 4812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +1DB8 +3198 +3198 +3318 +3BB0 +1FE0 +0300 +0300 +0780 +0660 +07C0 +0000 +0000 +ENDCHAR +STARTCHAR U+12CD +ENCODING 4813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3FC0 +76E0 +C660 +C67E +CC66 +CCC2 +EDC0 +7F00 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+12CE +ENCODING 4814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +1DB8 +3198 +3198 +3318 +3BB0 +1FE0 +0300 +0600 +0C00 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+12D0 +ENCODING 4816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +01E0 +0630 +0C30 +0C30 +0C30 +0C30 +0C30 +0C30 +0C30 +07F0 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+12D1 +ENCODING 4817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0780 +18C0 +30C0 +30C0 +30C0 +30C0 +30FC +30CC +30C0 +1FC0 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+12D2 +ENCODING 4818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1F00 +3180 +6180 +6180 +6180 +3FC0 +00C0 +00C0 +0180 +0198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+12D3 +ENCODING 4819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +07C0 +0C60 +1860 +1860 +1860 +0FF0 +0030 +0030 +0030 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+12D4 +ENCODING 4820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1F00 +3180 +6180 +6180 +6180 +3FC0 +00C0 +00C0 +01F0 +0198 +01F0 +0000 +0000 +ENDCHAR +STARTCHAR U+12D5 +ENCODING 4821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0180 +0180 +0180 +07E0 +0E30 +0C30 +0C30 +0C30 +0C30 +0C30 +0C30 +07F0 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+12D6 +ENCODING 4822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03C0 +0660 +0C30 +0C30 +0C30 +0E70 +07E0 +03C0 +0700 +0C00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+12D8 +ENCODING 4824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C60 +0C60 +0C60 +0C60 +0C60 +0FE0 +0FE0 +0C60 +0C60 +0C60 +0C60 +0C60 +0000 +0000 +ENDCHAR +STARTCHAR U+12D9 +ENCODING 4825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3180 +3180 +3180 +3180 +3180 +3F80 +3F80 +31F8 +3198 +3198 +3180 +3180 +0000 +0000 +ENDCHAR +STARTCHAR U+12DA +ENCODING 4826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3180 +3180 +3180 +3180 +3180 +3F80 +3F80 +3180 +3180 +3180 +3198 +31F8 +0000 +0000 +ENDCHAR +STARTCHAR U+12DB +ENCODING 4827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C60 +0C60 +0C60 +0C60 +0FE0 +0FE0 +0C60 +0C60 +0C60 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+12DC +ENCODING 4828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +18C0 +18C0 +18C0 +18C0 +18C0 +1FC0 +1FC0 +18C0 +18C0 +18F8 +18CC +18F8 +0000 +0000 +ENDCHAR +STARTCHAR U+12DD +ENCODING 4829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1C30 +3630 +3630 +0630 +0630 +07F0 +07F0 +0630 +0630 +0630 +0630 +0630 +0000 +0000 +ENDCHAR +STARTCHAR U+12DE +ENCODING 4830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C60 +0C60 +0C60 +0C60 +0FE0 +0FE0 +0C60 +0C60 +0C60 +0C00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+12DF +ENCODING 4831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C60 +0C60 +0C60 +0C60 +0FE0 +0FE0 +0C60 +0C60 +0C60 +0060 +0060 +0060 +01F8 +030C +ENDCHAR +STARTCHAR U+12E0 +ENCODING 4832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1C38 +366C +366C +0660 +0660 +07E0 +07E0 +0660 +0660 +0660 +0660 +0660 +0000 +0000 +ENDCHAR +STARTCHAR U+12E1 +ENCODING 4833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3870 +6CD8 +6CD8 +0CC0 +0CC0 +0FC0 +0FC0 +0CFC +0CCC +0CCC +0CC0 +0CC0 +0000 +0000 +ENDCHAR +STARTCHAR U+12E2 +ENCODING 4834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3870 +6CD8 +6CD8 +0CC0 +0CC0 +0FC0 +0FC0 +0CC0 +0CC0 +0CC0 +0CCC +0CFC +0000 +0000 +ENDCHAR +STARTCHAR U+12E3 +ENCODING 4835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1C38 +366C +366C +0660 +07E0 +07E0 +0660 +0660 +0660 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+12E4 +ENCODING 4836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3870 +6CD8 +6CD8 +0CC0 +0CC0 +0FC0 +0FC0 +0CC0 +0CC0 +0CF8 +0CCC +0CF8 +0000 +0000 +ENDCHAR +STARTCHAR U+12E5 +ENCODING 4837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6180 +3F00 +0C00 +1C38 +366C +366C +0660 +07E0 +07E0 +0660 +0660 +0660 +0660 +0000 +0000 +ENDCHAR +STARTCHAR U+12E6 +ENCODING 4838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1C38 +366C +366C +0660 +07E0 +07E0 +0660 +0660 +0660 +0600 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+12E7 +ENCODING 4839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1C38 +366C +366C +0660 +07E0 +07E0 +0660 +0660 +0660 +0060 +0060 +0060 +01F8 +030C +ENDCHAR +STARTCHAR U+12E8 +ENCODING 4840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0380 +06C0 +0C60 +0C60 +0C60 +0C60 +0EC0 +0780 +0300 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+12E9 +ENCODING 4841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0380 +06C0 +0C60 +0C60 +0C60 +0C60 +0EC0 +0780 +0300 +03F0 +0330 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+12EA +ENCODING 4842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0D80 +18C0 +18C0 +18C0 +18C0 +1D80 +0F00 +0660 +07F8 +0618 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+12EB +ENCODING 4843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01C0 +0360 +0630 +0630 +0630 +0660 +07C0 +0380 +01C0 +0060 +01C0 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+12EC +ENCODING 4844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0D80 +18C0 +18C0 +18C0 +18C0 +1D80 +0F00 +06F0 +0798 +06F0 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+12ED +ENCODING 4845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0780 +0CC0 +18C0 +18C0 +18C0 +0D80 +0F30 +0730 +03E0 +3E00 +7000 +6000 +0000 +ENDCHAR +STARTCHAR U+12EE +ENCODING 4846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0E00 +1B00 +3180 +31F8 +3198 +3180 +3B00 +1E00 +0C00 +0C00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+12EF +ENCODING 4847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +ENDCHAR +STARTCHAR U+12F0 +ENCODING 4848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0380 +07C0 +0C40 +0C40 +0CC0 +0F80 +0600 +0300 +0300 +0180 +1FF8 +1818 +0000 +0000 +ENDCHAR +STARTCHAR U+12F1 +ENCODING 4849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0F80 +1880 +1980 +1F00 +0C00 +0600 +1FC0 +30C0 +30FC +018C +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+12F2 +ENCODING 4850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0F80 +1880 +1980 +1F00 +0C00 +0600 +1FC0 +30C0 +30C0 +0198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+12F3 +ENCODING 4851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01C0 +03E0 +0620 +0660 +07C0 +0300 +0180 +0FF0 +0C30 +0C30 +0030 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+12F4 +ENCODING 4852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0F80 +1880 +1880 +1980 +1F00 +0C00 +0600 +0600 +03F0 +3F98 +30F0 +0000 +0000 +ENDCHAR +STARTCHAR U+12F5 +ENCODING 4853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0700 +0F80 +18F8 +1898 +1980 +1F00 +0C00 +0600 +0600 +0300 +3FF0 +3030 +0000 +0000 +ENDCHAR +STARTCHAR U+12F6 +ENCODING 4854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01C0 +03E0 +0620 +0660 +07C0 +0380 +07F0 +0C30 +1800 +1800 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+12F7 +ENCODING 4855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01C0 +03E0 +0620 +0660 +07C0 +0300 +0180 +0FF0 +0C30 +0C30 +0030 +0030 +00FC +0186 +ENDCHAR +STARTCHAR U+12F8 +ENCODING 4856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0380 +07C0 +0C40 +0CC0 +0F80 +0600 +0300 +0180 +0FF0 +0C30 +0000 +0000 +ENDCHAR +STARTCHAR U+12F9 +ENCODING 4857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0200 +0700 +0F80 +1880 +1980 +1F00 +0C00 +1FC0 +30FC +318C +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+12FA +ENCODING 4858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0200 +0700 +0F80 +1880 +1980 +1F00 +0C00 +1FC0 +30C0 +3198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+12FB +ENCODING 4859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0380 +07C0 +0C40 +0CC0 +0F80 +0600 +1FE0 +1860 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+12FC +ENCODING 4860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0400 +0E00 +1F00 +3100 +3300 +3E00 +1800 +0C00 +06F0 +3F98 +30F0 +0000 +0000 +ENDCHAR +STARTCHAR U+12FD +ENCODING 4861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0200 +0700 +0F80 +18F8 +1998 +1F00 +0C00 +0600 +0300 +1FE0 +1860 +0000 +0000 +ENDCHAR +STARTCHAR U+12FE +ENCODING 4862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0380 +07C0 +0C40 +0CC0 +0F80 +07F0 +0C30 +1800 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+12FF +ENCODING 4863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +01C0 +03E0 +0620 +0660 +07C0 +0300 +0180 +0FF0 +0C30 +0C30 +0030 +0030 +00FC +0186 +ENDCHAR +STARTCHAR U+1300 +ENCODING 4864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3030 +1FE0 +0300 +0780 +0CC0 +0C40 +0CC0 +0780 +0600 +0700 +0300 +1FE0 +1860 +0000 +0000 +ENDCHAR +STARTCHAR U+1301 +ENCODING 4865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6060 +3FC0 +0600 +0F00 +1980 +1980 +0F00 +0600 +1FC0 +30C0 +30FC +018C +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1302 +ENCODING 4866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6060 +3FC0 +0600 +0F00 +1980 +1980 +0F00 +0600 +1FC0 +30C0 +30C0 +0198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1303 +ENCODING 4867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3030 +1FE0 +0300 +0780 +0CC0 +0CC0 +0780 +0300 +1FE0 +1860 +1860 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+1304 +ENCODING 4868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6060 +3FC0 +0600 +0F00 +1980 +1880 +1980 +0F00 +0C00 +0E00 +07F0 +3F98 +30F0 +0000 +0000 +ENDCHAR +STARTCHAR U+1305 +ENCODING 4869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3030 +1FE0 +0300 +0780 +0CC0 +0C7C +0CCC +0780 +0600 +0700 +0300 +1FE0 +1860 +0000 +0000 +ENDCHAR +STARTCHAR U+1306 +ENCODING 4870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3030 +1FE0 +0300 +0780 +0CC0 +0CC0 +0780 +07F0 +0C30 +1800 +1800 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+1307 +ENCODING 4871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3030 +1FE0 +0300 +0780 +0CC0 +0CC0 +0780 +0300 +1FE0 +1860 +1860 +0060 +0060 +03FC +070E +ENDCHAR +STARTCHAR U+1308 +ENCODING 4872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0F80 +18C0 +18C0 +00C0 +00C0 +00C0 +0180 +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1309 +ENCODING 4873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1F00 +3180 +3180 +0180 +0180 +0180 +03F8 +0318 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+130A +ENCODING 4874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0F80 +18C0 +18C0 +00C0 +00C0 +00C0 +0180 +0180 +0180 +0198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+130B +ENCODING 4875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0780 +0FE0 +0C60 +0060 +0060 +0060 +00C0 +01C0 +0780 +0E00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+130C +ENCODING 4876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0F80 +18C0 +18C0 +00C0 +00C0 +00C0 +0180 +0180 +01F0 +0198 +01F0 +0000 +0000 +ENDCHAR +STARTCHAR U+130D +ENCODING 4877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0FE0 +19B0 +0F30 +0030 +0030 +0060 +0060 +0060 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+130E +ENCODING 4878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0100 +07C0 +0C60 +0C60 +0060 +0040 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1310 +ENCODING 4880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1F00 +3180 +3180 +0180 +0180 +01F8 +03AC +0338 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1312 +ENCODING 4882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1F00 +3180 +3180 +0180 +01B0 +01B0 +03F0 +031C +030C +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1313 +ENCODING 4883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0780 +0CC0 +0CC0 +00C0 +07E0 +0660 +0060 +0060 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+1314 +ENCODING 4884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0F80 +18C0 +18C0 +00C0 +00C0 +00C0 +0180 +0180 +0180 +01F0 +0198 +07F0 +0C00 +ENDCHAR +STARTCHAR U+1315 +ENCODING 4885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1F00 +31B0 +31B0 +01FC +018C +0180 +0380 +0300 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1318 +ENCODING 4888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0000 +07C0 +0C60 +0C60 +0060 +0040 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1319 +ENCODING 4889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +30C0 +1F80 +0000 +1F00 +3180 +3180 +0180 +0180 +03F8 +0318 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+131A +ENCODING 4890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +0FC0 +0000 +0F80 +18C0 +18C0 +00C0 +0080 +0180 +0180 +0198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+131B +ENCODING 4891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0000 +03C0 +07F0 +0430 +0030 +0030 +00E0 +03C0 +0700 +0E00 +0000 +0000 +ENDCHAR +STARTCHAR U+131C +ENCODING 4892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +0FC0 +0000 +0F80 +18C0 +18C0 +00C0 +0080 +0180 +01F0 +0198 +01F0 +0000 +0000 +ENDCHAR +STARTCHAR U+131D +ENCODING 4893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1860 +0FC0 +0000 +0FE0 +19B0 +0F30 +0030 +0020 +0060 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+131E +ENCODING 4894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C60 +07C0 +0100 +07C0 +0C60 +0C60 +0060 +0040 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+131F +ENCODING 4895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +ENDCHAR +STARTCHAR U+1320 +ENCODING 4896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +07C0 +0D60 +0D60 +1930 +1930 +1930 +1930 +1930 +1930 +1930 +0000 +0000 +ENDCHAR +STARTCHAR U+1321 +ENCODING 4897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +1F00 +3580 +3580 +64C0 +64C0 +64FC +64CC +64C0 +64C0 +64C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1322 +ENCODING 4898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +1F00 +3580 +3580 +64C0 +64C0 +64C0 +64C0 +64C0 +64CC +64FC +0000 +0000 +ENDCHAR +STARTCHAR U+1323 +ENCODING 4899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +07C0 +0D60 +0D60 +1930 +1930 +1930 +1930 +0030 +0030 +0030 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+1324 +ENCODING 4900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1F00 +3580 +3580 +64C0 +64C0 +64C0 +64C0 +64C0 +64F8 +64CC +64F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1325 +ENCODING 4901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0FE0 +1FF0 +1330 +3318 +3398 +3198 +0180 +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1326 +ENCODING 4902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +07C0 +0D60 +0D60 +1930 +1930 +1930 +1930 +1800 +1800 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+1327 +ENCODING 4903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +07C0 +0D60 +0D60 +1930 +1930 +1930 +1930 +0030 +0030 +0030 +0030 +00FC +0186 +ENDCHAR +STARTCHAR U+1328 +ENCODING 4904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +1F80 +3FC0 +6260 +C230 +C230 +C230 +F338 +DAB6 +CAB2 +FBBE +0000 +0000 +ENDCHAR +STARTCHAR U+1329 +ENCODING 4905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +1F80 +3FC0 +6260 +C230 +C23F +C233 +F338 +DAB4 +CAB2 +FBBE +0000 +0000 +ENDCHAR +STARTCHAR U+132A +ENCODING 4906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +1F80 +3FC0 +6260 +C230 +C230 +C230 +F330 +DAB0 +CAB3 +FBBF +0000 +0000 +ENDCHAR +STARTCHAR U+132B +ENCODING 4907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +1FF0 +3118 +6118 +7198 +6958 +6558 +7DD8 +0018 +0034 +0032 +003E +0000 +0000 +ENDCHAR +STARTCHAR U+132C +ENCODING 4908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +1F80 +3FC0 +6260 +C23F +C239 +C237 +F330 +DABC +CAB2 +FBBE +0000 +0000 +ENDCHAR +STARTCHAR U+132D +ENCODING 4909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1FC0 +7FE0 +C630 +E638 +9724 +F33C +0300 +0380 +0340 +0320 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+132E +ENCODING 4910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +1FF0 +1A18 +3218 +2318 +6294 +6252 +639C +7000 +6800 +6400 +7C00 +0000 +0000 +ENDCHAR +STARTCHAR U+132F +ENCODING 4911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0FE0 +1FF0 +3118 +6118 +7198 +6958 +6558 +7DD8 +0018 +0030 +0030 +00FC +0186 +ENDCHAR +STARTCHAR U+1330 +ENCODING 4912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +03C0 +0660 +0660 +03C0 +07E0 +0E70 +0C30 +0C30 +0C30 +0000 +0000 +ENDCHAR +STARTCHAR U+1331 +ENCODING 4913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0F00 +1980 +1980 +0F00 +1F80 +39C0 +30FC +30CC +30C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1332 +ENCODING 4914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0F00 +1980 +1980 +0F00 +1F80 +39C0 +30C0 +30CC +30FC +0000 +0000 +ENDCHAR +STARTCHAR U+1333 +ENCODING 4915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +03C0 +0660 +03C0 +07E0 +0E70 +0C70 +0C30 +0030 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+1334 +ENCODING 4916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0F00 +1980 +1980 +0F00 +1F80 +39C0 +30F8 +30CC +30F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1335 +ENCODING 4917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0600 +0600 +0600 +0F00 +19F8 +1998 +0F00 +1F80 +39C0 +30C0 +30C0 +30C0 +0000 +0000 +ENDCHAR +STARTCHAR U+1336 +ENCODING 4918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0180 +0180 +03C0 +0660 +03C0 +07E0 +0E70 +0C30 +0C30 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+1337 +ENCODING 4919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +0300 +0300 +0780 +0CC0 +0780 +0FC0 +1CC0 +18E0 +1860 +0060 +0060 +01F8 +030C +ENDCHAR +STARTCHAR U+1338 +ENCODING 4920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0180 +03C0 +0660 +0660 +03C0 +07E0 +0E70 +0C30 +0C30 +0C30 +0000 +0000 +ENDCHAR +STARTCHAR U+1339 +ENCODING 4921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0600 +0F00 +1980 +1980 +0F00 +1F80 +39C0 +30FC +30CC +30C0 +0000 +0000 +ENDCHAR +STARTCHAR U+133A +ENCODING 4922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0600 +0F00 +1980 +1980 +0F00 +1F80 +39C0 +30C0 +30CC +30FC +0000 +0000 +ENDCHAR +STARTCHAR U+133B +ENCODING 4923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0300 +0780 +0CC0 +0CC0 +0780 +0FC0 +1CC0 +18E0 +1860 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+133C +ENCODING 4924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0600 +0F00 +1980 +1980 +0F00 +1F80 +39C0 +30F0 +30D8 +30F0 +0000 +0000 +ENDCHAR +STARTCHAR U+133D +ENCODING 4925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0600 +0F00 +19F8 +1998 +0F00 +1F80 +39C0 +30C0 +30C0 +30C0 +0000 +0000 +ENDCHAR +STARTCHAR U+133E +ENCODING 4926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0300 +0780 +0CC0 +0CC0 +0780 +0FC0 +1CE0 +1860 +1860 +1800 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+133F +ENCODING 4927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0300 +0780 +0CC0 +0CC0 +0780 +0FC0 +1CC0 +18E0 +1860 +0060 +0060 +01F8 +030C +ENDCHAR +STARTCHAR U+1340 +ENCODING 4928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +01E0 +0630 +0C30 +0C30 +0C30 +0FF0 +0C30 +0C30 +0C30 +07F0 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+1341 +ENCODING 4929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0780 +18C0 +30C0 +30C0 +30C0 +3FC0 +30FC +30CC +30C0 +1FC0 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+1342 +ENCODING 4930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7E00 +C300 +C300 +FF00 +C300 +C300 +7F00 +0300 +0300 +0300 +0330 +03F0 +0000 +0000 +ENDCHAR +STARTCHAR U+1343 +ENCODING 4931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7E00 +C300 +C300 +FF00 +C300 +C300 +7F00 +0300 +0300 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+1344 +ENCODING 4932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7E00 +C300 +C300 +FF00 +C300 +C300 +7F00 +0300 +0300 +03E0 +0330 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+1345 +ENCODING 4933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0180 +0180 +0180 +07E0 +0E30 +0C30 +0C30 +0FF0 +0C30 +0C30 +0C30 +07F0 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+1346 +ENCODING 4934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03C0 +0660 +0C30 +0FF0 +0C30 +0E70 +07E0 +03C0 +0700 +0C00 +0C00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+1348 +ENCODING 4936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +00C0 +0040 +00C0 +0180 +0300 +0600 +0F00 +1980 +1888 +0FF8 +03E8 +0000 +0000 +ENDCHAR +STARTCHAR U+1349 +ENCODING 4937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0080 +0180 +0300 +0600 +0C00 +1F00 +1910 +19F0 +1FC0 +0300 +0600 +0600 +ENDCHAR +STARTCHAR U+134A +ENCODING 4938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0180 +0080 +0180 +0300 +0600 +0C00 +1E30 +3310 +3130 +1FE0 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR U+134B +ENCODING 4939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0200 +0300 +0600 +0400 +0C00 +1C00 +3600 +3320 +1FF0 +0310 +0300 +0300 +ENDCHAR +STARTCHAR U+134C +ENCODING 4940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0180 +0080 +0180 +0300 +0600 +0C00 +1E00 +3300 +3130 +1FE8 +07C8 +0070 +0000 +0000 +ENDCHAR +STARTCHAR U+134D +ENCODING 4941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0F80 +19C0 +10C0 +3000 +3000 +3E00 +33C0 +3740 +1B00 +0300 +0300 +0300 +ENDCHAR +STARTCHAR U+134E +ENCODING 4942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +07E0 +0F90 +18F0 +3000 +3000 +3000 +3C00 +3A00 +3130 +1B60 +0FE0 +0000 +0000 +ENDCHAR +STARTCHAR U+134F +ENCODING 4943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0200 +0300 +0600 +0400 +0C00 +1C00 +3600 +3320 +1FF0 +0310 +0300 +0FC0 +1860 +ENDCHAR +STARTCHAR U+1350 +ENCODING 4944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +0FF0 +1FF8 +1998 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1351 +ENCODING 4945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +0FF0 +1FF8 +1998 +0180 +0180 +0180 +01F8 +0198 +0180 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+1352 +ENCODING 4946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +0FF0 +1FF8 +1998 +0180 +0180 +0180 +0180 +0180 +0180 +0198 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+1353 +ENCODING 4947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +0FF0 +1FF8 +1998 +0180 +0180 +0180 +0180 +0300 +0600 +0C00 +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+1354 +ENCODING 4948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +0FF0 +1FF8 +1998 +0180 +0180 +0180 +0180 +0180 +01F0 +0198 +01F0 +0000 +0000 +ENDCHAR +STARTCHAR U+1355 +ENCODING 4949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +0FF0 +1FF8 +1998 +0180 +01E0 +0060 +0060 +0060 +0060 +0060 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+1356 +ENCODING 4950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +0FF0 +1FF8 +1998 +0180 +0180 +0300 +0300 +0600 +0600 +0600 +0600 +0000 +0000 +ENDCHAR +STARTCHAR U+1357 +ENCODING 4951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +0FF0 +1FF8 +1998 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0FF0 +1C38 +ENDCHAR +STARTCHAR U+1358 +ENCODING 4952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +0FF0 +0180 +0180 +0180 +0300 +0700 +0E00 +1C00 +1860 +1870 +1C30 +0FE0 +07C0 +0000 +ENDCHAR +STARTCHAR U+1359 +ENCODING 4953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1C1C +07F0 +01C0 +0FFC +1FFC +3144 +2144 +2284 +3EFC +1C7C +0008 +0008 +0010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+135A +ENCODING 4954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +0FF0 +0180 +0080 +0180 +0300 +0600 +0C00 +1E30 +3310 +3130 +1FE0 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR U+1360 +ENCODING 4960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +FFFF +ENDCHAR +STARTCHAR U+1361 +ENCODING 4961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0300 +0300 +0000 +0000 +0300 +0300 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1362 +ENCODING 4962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0660 +0660 +0000 +0000 +0660 +0660 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1363 +ENCODING 4963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +07E0 +0000 +0180 +0180 +0000 +0180 +0180 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1364 +ENCODING 4964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +07E0 +0000 +0180 +0180 +0000 +0180 +0180 +0000 +07E0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1365 +ENCODING 4965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0600 +0600 +0000 +1F80 +0000 +0600 +0600 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1366 +ENCODING 4966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0600 +0600 +0000 +03C0 +0000 +0600 +0600 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1367 +ENCODING 4967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0180 +0180 +0000 +0000 +0180 +0180 +0000 +0000 +0180 +0180 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1368 +ENCODING 4968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0180 +0180 +0C30 +0C30 +0180 +0180 +0C30 +0C30 +0180 +0180 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1369 +ENCODING 4969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1830 +0FE0 +0000 +0180 +0180 +0300 +07C0 +0C60 +0C60 +07C0 +0000 +0FE0 +1830 +0000 +ENDCHAR +STARTCHAR U+136A +ENCODING 4970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C18 +07F0 +0000 +01C0 +0360 +0660 +07C0 +0600 +07C0 +0360 +01C0 +07F0 +0C18 +0000 +ENDCHAR +STARTCHAR U+136B +ENCODING 4971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0C30 +07E0 +0000 +07E0 +0660 +0600 +0600 +0600 +0600 +0000 +07E0 +0C30 +0000 +ENDCHAR +STARTCHAR U+136C +ENCODING 4972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0C30 +07E0 +0000 +03C0 +0660 +0660 +0660 +0660 +03C0 +0000 +07E0 +0C30 +0000 +ENDCHAR +STARTCHAR U+136D +ENCODING 4973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1830 +0FE0 +0000 +0300 +0300 +07E0 +0E60 +0C00 +0C60 +07E0 +0000 +0FE0 +1830 +0000 +ENDCHAR +STARTCHAR U+136E +ENCODING 4974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1830 +0FE0 +0000 +0780 +0FC0 +0CC0 +00C0 +0180 +01C0 +0360 +03C0 +0000 +0FE0 +1830 +0000 +ENDCHAR +STARTCHAR U+136F +ENCODING 4975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1830 +0FE0 +0000 +0780 +0FC0 +0CC0 +00C0 +0180 +0100 +0320 +03E0 +0000 +0FE0 +1830 +0000 +ENDCHAR +STARTCHAR U+1370 +ENCODING 4976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1818 +0FF0 +0000 +0FF0 +0DB0 +0180 +0180 +0180 +0FF0 +0C30 +0000 +0FF0 +1818 +0000 +ENDCHAR +STARTCHAR U+1371 +ENCODING 4977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0000 +0000 +0660 +0660 +07E0 +0660 +0640 +0380 +0000 +07E0 +0C30 +0000 +ENDCHAR +STARTCHAR U+1372 +ENCODING 4978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0C30 +07E0 +0000 +0180 +0180 +0180 +0180 +0180 +0180 +0000 +07E0 +0C30 +0000 +ENDCHAR +STARTCHAR U+1373 +ENCODING 4979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1818 +0FF0 +0000 +07E0 +05A0 +0180 +03C0 +0660 +0660 +0000 +0FF0 +1818 +0000 +ENDCHAR +STARTCHAR U+1374 +ENCODING 4980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1818 +0FF0 +0000 +05E0 +0DB0 +0DB0 +0DB0 +0DB0 +0730 +0000 +0FF0 +1818 +0000 +ENDCHAR +STARTCHAR U+1375 +ENCODING 4981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1818 +0FF0 +0000 +0DB0 +0DB0 +0DB0 +07F0 +0030 +0030 +0030 +0000 +0FF0 +1818 +0000 +ENDCHAR +STARTCHAR U+1376 +ENCODING 4982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0000 +03E0 +0660 +03E0 +0060 +00C0 +00C0 +00C0 +0000 +07E0 +0C30 +0000 +ENDCHAR +STARTCHAR U+1377 +ENCODING 4983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1818 +0FF0 +0000 +0FF0 +0DB0 +0180 +01C0 +00C0 +0FF0 +0C30 +0000 +0FF0 +1818 +0000 +ENDCHAR +STARTCHAR U+1378 +ENCODING 4984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0C30 +07E0 +0000 +03E0 +06B0 +06E0 +0600 +0660 +03E0 +0000 +07E0 +0C30 +0000 +ENDCHAR +STARTCHAR U+1379 +ENCODING 4985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3018 +1FF0 +0000 +1FF0 +16D0 +06C0 +06C0 +06C0 +06C0 +0000 +1FF0 +3018 +0000 +ENDCHAR +STARTCHAR U+137A +ENCODING 4986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1830 +0FE0 +0000 +07C0 +06C0 +0180 +01C0 +00C0 +0180 +0180 +0180 +0000 +0FE0 +1830 +0000 +ENDCHAR +STARTCHAR U+137B +ENCODING 4987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C30 +07E0 +0000 +03C0 +0660 +07C0 +0600 +0300 +0300 +0300 +0000 +07E0 +0C30 +0000 +ENDCHAR +STARTCHAR U+137C +ENCODING 4988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +300C +1FF8 +0000 +1E78 +33CC +3EF8 +30C0 +1860 +1860 +1860 +0000 +1FF8 +300C +0000 +ENDCHAR +STARTCHAR U+1680 +ENCODING 5760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1681 +ENCODING 5761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +0100 +0100 +0100 +0100 +0100 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+1682 +ENCODING 5762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +0280 +0280 +0280 +0280 +0280 +0280 +0000 +0000 +ENDCHAR +STARTCHAR U+1683 +ENCODING 5763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +0540 +0540 +0540 +0540 +0540 +0540 +0000 +0000 +ENDCHAR +STARTCHAR U+1684 +ENCODING 5764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +0AA0 +0AA0 +0AA0 +0AA0 +0AA0 +0AA0 +0000 +0000 +ENDCHAR +STARTCHAR U+1685 +ENCODING 5765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +1550 +1550 +1550 +1550 +1550 +1550 +0000 +0000 +ENDCHAR +STARTCHAR U+1686 +ENCODING 5766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +0100 +FFFF +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1687 +ENCODING 5767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +0280 +0280 +0280 +0280 +0280 +FFFF +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1688 +ENCODING 5768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0540 +0540 +0540 +0540 +0540 +0540 +FFFF +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1689 +ENCODING 5769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0AA0 +0AA0 +0AA0 +0AA0 +0AA0 +0AA0 +FFFF +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+168A +ENCODING 5770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1550 +1550 +1550 +1550 +1550 +1550 +FFFF +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+168B +ENCODING 5771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0040 +0040 +0080 +0080 +0100 +FFFF +0100 +0200 +0200 +0400 +0400 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+168C +ENCODING 5772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +00A0 +00A0 +0140 +0140 +0280 +FFFF +0280 +0500 +0500 +0A00 +0A00 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+168D +ENCODING 5773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0150 +0150 +02A0 +02A0 +0540 +FFFF +0540 +0A80 +0A80 +1500 +1500 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+168E +ENCODING 5774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +02A8 +02A8 +0550 +0550 +0AA0 +FFFF +0AA0 +1540 +1540 +2A80 +2A80 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+168F +ENCODING 5775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0554 +0554 +0AA8 +0AA8 +1550 +FFFF +1550 +2AA0 +2AA0 +5540 +5540 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1690 +ENCODING 5776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0100 +0100 +FFFF +0100 +0100 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1691 +ENCODING 5777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0280 +0280 +FFFF +0280 +0280 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1692 +ENCODING 5778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0540 +0540 +FFFF +0540 +0540 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1693 +ENCODING 5779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0AA0 +0AA0 +FFFF +0AA0 +0AA0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1694 +ENCODING 5780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +1550 +1550 +FFFF +1550 +1550 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1695 +ENCODING 5781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0440 +0440 +0280 +0280 +0100 +FFFF +0100 +0280 +0280 +0440 +0440 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+1696 +ENCODING 5782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0280 +0440 +0440 +FFFF +0440 +0440 +0280 +0280 +0100 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+1697 +ENCODING 5783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +0800 +0800 +09C0 +0840 +0840 +0FC0 +0000 +0000 +ENDCHAR +STARTCHAR U+1698 +ENCODING 5784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +1290 +0920 +06C0 +06C0 +0920 +1290 +2448 +0000 +ENDCHAR +STARTCHAR U+1699 +ENCODING 5785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0550 +0FF8 +0550 +0FF8 +0550 +0FF8 +0550 +FFFF +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+169A +ENCODING 5786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +FFFF +0000 +0FF0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+169B +ENCODING 5787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2000 +1000 +0800 +0400 +0200 +01FF +0200 +0400 +0800 +1000 +2000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+169C +ENCODING 5788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0004 +0008 +0010 +0020 +0040 +FF80 +0040 +0020 +0010 +0008 +0004 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+16A0 +ENCODING 5792 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +92 +A4 +C8 +90 +A0 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16A1 +ENCODING 5793 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +AA +94 +A8 +D0 +A0 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16A2 +ENCODING 5794 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C0 +A0 +90 +88 +84 +84 +84 +84 +84 +84 +84 +84 +84 +00 +ENDCHAR +STARTCHAR U+16A3 +ENCODING 5795 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C0 +A0 +90 +88 +84 +82 +92 +92 +92 +92 +92 +92 +92 +00 +ENDCHAR +STARTCHAR U+16A4 +ENCODING 5796 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C0 +A0 +90 +88 +84 +84 +B4 +B4 +84 +84 +84 +84 +84 +00 +ENDCHAR +STARTCHAR U+16A5 +ENCODING 5797 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C0 +A0 +90 +88 +84 +C2 +A2 +92 +92 +92 +92 +92 +92 +00 +ENDCHAR +STARTCHAR U+16A6 +ENCODING 5798 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +80 +80 +C0 +A0 +90 +88 +88 +90 +A0 +C0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16A7 +ENCODING 5799 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +80 +80 +C0 +A0 +90 +A8 +A8 +90 +A0 +C0 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16A8 +ENCODING 5800 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C0 +A0 +90 +C8 +A0 +90 +88 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16A9 +ENCODING 5801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C2 +A4 +98 +C2 +A4 +98 +80 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16AA +ENCODING 5802 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C2 +A4 +98 +C0 +A0 +90 +80 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16AB +ENCODING 5803 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C0 +A0 +90 +C8 +A0 +90 +88 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16AC +ENCODING 5804 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +90 +50 +30 +90 +58 +34 +12 +18 +14 +12 +10 +10 +00 +ENDCHAR +STARTCHAR U+16AD +ENCODING 5805 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +18 +14 +12 +18 +14 +12 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16AE +ENCODING 5806 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +08 +08 +08 +08 +18 +28 +48 +18 +28 +48 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+16AF +ENCODING 5807 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +12 +14 +18 +12 +34 +58 +90 +30 +50 +90 +10 +10 +00 +ENDCHAR +STARTCHAR U+16B0 +ENCODING 5808 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +12 +14 +18 +10 +30 +50 +90 +30 +50 +90 +10 +10 +00 +ENDCHAR +STARTCHAR U+16B1 +ENCODING 5809 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C0 +A0 +90 +88 +84 +88 +90 +A0 +A0 +90 +88 +84 +82 +00 +ENDCHAR +STARTCHAR U+16B2 +ENCODING 5810 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +08 +10 +20 +40 +20 +10 +08 +04 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+16B3 +ENCODING 5811 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +A0 +90 +88 +84 +82 +00 +ENDCHAR +STARTCHAR U+16B4 +ENCODING 5812 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +84 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16B5 +ENCODING 5813 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +B2 +B4 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16B6 +ENCODING 5814 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +44 +48 +50 +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +40 +00 +ENDCHAR +STARTCHAR U+16B7 +ENCODING 5815 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +82 +44 +44 +28 +28 +10 +10 +28 +28 +44 +44 +82 +82 +00 +ENDCHAR +STARTCHAR U+16B8 +ENCODING 5816 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +82 +44 +44 +28 +28 +54 +54 +28 +28 +44 +44 +82 +82 +00 +ENDCHAR +STARTCHAR U+16B9 +ENCODING 5817 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +80 +C0 +A0 +90 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +80 +00 +ENDCHAR +STARTCHAR U+16BA +ENCODING 5818 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +82 +82 +82 +82 +E2 +92 +8E +82 +82 +82 +82 +82 +82 +00 +ENDCHAR +STARTCHAR U+16BB +ENCODING 5819 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +82 +82 +82 +E2 +92 +8E +E2 +92 +8E +82 +82 +82 +82 +00 +ENDCHAR +STARTCHAR U+16BC +ENCODING 5820 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +92 +54 +38 +10 +38 +54 +92 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16BD +ENCODING 5821 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +38 +38 +38 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16BE +ENCODING 5822 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +90 +50 +30 +10 +18 +14 +12 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16BF +ENCODING 5823 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +20 +20 +20 +20 +20 +30 +28 +24 +22 +20 +20 +20 +20 +20 +00 +ENDCHAR +STARTCHAR U+16C0 +ENCODING 5824 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +90 +50 +38 +38 +38 +14 +12 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16C1 +ENCODING 5825 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16C2 +ENCODING 5826 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +38 +38 +38 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16C3 +ENCODING 5827 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +20 +40 +88 +44 +22 +04 +08 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+16C4 +ENCODING 5828 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +38 +54 +92 +92 +54 +38 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16C5 +ENCODING 5829 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +12 +14 +18 +10 +30 +50 +90 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16C6 +ENCODING 5830 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +08 +08 +08 +08 +08 +18 +28 +48 +88 +08 +08 +08 +08 +00 +ENDCHAR +STARTCHAR U+16C7 +ENCODING 5831 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +18 +14 +12 +10 +10 +10 +10 +10 +10 +90 +50 +30 +10 +00 +ENDCHAR +STARTCHAR U+16C8 +ENCODING 5832 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +C4 +A8 +90 +80 +80 +80 +80 +80 +80 +90 +A8 +C4 +82 +00 +ENDCHAR +STARTCHAR U+16C9 +ENCODING 5833 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +92 +92 +54 +54 +38 +38 +10 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16CA +ENCODING 5834 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +10 +20 +40 +20 +10 +08 +10 +20 +40 +20 +10 +08 +00 +00 +ENDCHAR +STARTCHAR U+16CB +ENCODING 5835 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +40 +40 +40 +44 +4C +54 +64 +44 +04 +04 +04 +04 +04 +00 +ENDCHAR +STARTCHAR U+16CC +ENCODING 5836 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +10 +10 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+16CD +ENCODING 5837 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +38 +38 +38 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+16CE +ENCODING 5838 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +92 +54 +38 +10 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+16CF +ENCODING 5839 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +38 +54 +92 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16D0 +ENCODING 5840 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +18 +28 +48 +88 +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +ENDCHAR +STARTCHAR U+16D1 +ENCODING 5841 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +18 +28 +48 +88 +08 +1C +1C +1C +08 +08 +08 +08 +08 +00 +ENDCHAR +STARTCHAR U+16D2 +ENCODING 5842 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +60 +50 +48 +44 +48 +50 +60 +60 +50 +48 +44 +48 +50 +60 +00 +ENDCHAR +STARTCHAR U+16D3 +ENCODING 5843 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +40 +44 +48 +50 +64 +48 +50 +60 +40 +40 +40 +40 +40 +00 +ENDCHAR +STARTCHAR U+16D4 +ENCODING 5844 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +C0 +A0 +90 +A8 +90 +A0 +C0 +C0 +A0 +90 +A8 +90 +A0 +C0 +00 +ENDCHAR +STARTCHAR U+16D5 +ENCODING 5845 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +84 +88 +90 +A0 +C0 +80 +80 +C0 +A0 +90 +88 +84 +82 +00 +ENDCHAR +STARTCHAR U+16D6 +ENCODING 5846 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +82 +82 +82 +82 +00 +ENDCHAR +STARTCHAR U+16D7 +ENCODING 5847 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +C6 +AA +92 +AA +C6 +82 +82 +82 +82 +82 +82 +82 +82 +00 +ENDCHAR +STARTCHAR U+16D8 +ENCODING 5848 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +92 +92 +54 +54 +38 +38 +10 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16D9 +ENCODING 5849 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +38 +38 +38 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16DA +ENCODING 5850 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +60 +50 +48 +44 +42 +40 +40 +40 +40 +40 +40 +40 +40 +00 +ENDCHAR +STARTCHAR U+16DB +ENCODING 5851 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +60 +50 +48 +44 +42 +E0 +E0 +E0 +40 +40 +40 +40 +40 +00 +ENDCHAR +STARTCHAR U+16DC +ENCODING 5852 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +28 +44 +82 +82 +44 +28 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+16DD +ENCODING 5853 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +44 +28 +10 +28 +44 +82 +82 +44 +28 +10 +28 +44 +82 +00 +ENDCHAR +STARTCHAR U+16DE +ENCODING 5854 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +C6 +C6 +AA +AA +92 +92 +92 +92 +AA +AA +C6 +C6 +82 +00 +ENDCHAR +STARTCHAR U+16DF +ENCODING 5855 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +28 +44 +82 +82 +44 +28 +10 +28 +44 +82 +00 +00 +00 +ENDCHAR +STARTCHAR U+16E0 +ENCODING 5856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +8208 +4710 +2AA0 +1240 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0000 +ENDCHAR +STARTCHAR U+16E1 +ENCODING 5857 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +92 +54 +38 +10 +38 +54 +92 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16E2 +ENCODING 5858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +0310 +02A0 +0240 +0200 +0200 +0200 +0200 +0200 +0200 +1200 +2A00 +4600 +8200 +0000 +ENDCHAR +STARTCHAR U+16E3 +ENCODING 5859 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +10 +10 +10 +38 +38 +54 +54 +92 +92 +00 +ENDCHAR +STARTCHAR U+16E4 +ENCODING 5860 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +92 +92 +54 +54 +38 +38 +54 +54 +38 +38 +54 +54 +92 +92 +00 +ENDCHAR +STARTCHAR U+16E5 +ENCODING 5861 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +82 +C6 +AA +92 +AA +C6 +82 +82 +C6 +AA +92 +AA +C6 +82 +00 +ENDCHAR +STARTCHAR U+16E6 +ENCODING 5862 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +10 +10 +10 +38 +38 +54 +54 +92 +92 +00 +ENDCHAR +STARTCHAR U+16E7 +ENCODING 5863 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +10 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16E8 +ENCODING 5864 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +38 +54 +92 +10 +10 +10 +10 +10 +10 +92 +54 +38 +10 +00 +ENDCHAR +STARTCHAR U+16E9 +ENCODING 5865 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +04 +0C +14 +24 +44 +24 +14 +0C +04 +04 +04 +04 +04 +04 +00 +ENDCHAR +STARTCHAR U+16EA +ENCODING 5866 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +40 +E0 +40 +44 +4C +54 +64 +44 +04 +0E +04 +04 +04 +00 +ENDCHAR +STARTCHAR U+16EB +ENCODING 5867 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +38 +38 +38 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+16EC +ENCODING 5868 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +70 +70 +70 +00 +00 +00 +00 +00 +70 +70 +70 +00 +00 +00 +ENDCHAR +STARTCHAR U+16ED +ENCODING 5869 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +38 +38 +10 +D6 +FE +D6 +10 +38 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+16EE +ENCODING 5870 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +18 +14 +12 +10 +10 +30 +50 +90 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+16EF +ENCODING 5871 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +92 +54 +54 +38 +38 +10 +10 +10 +10 +38 +38 +54 +54 +92 +00 +ENDCHAR +STARTCHAR U+16F0 +ENCODING 5872 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +38 +54 +92 +92 +92 +92 +92 +54 +38 +10 +10 +00 +ENDCHAR +STARTCHAR U+1E00 +ENCODING 7680 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +5A +24 +18 +ENDCHAR +STARTCHAR U+1E01 +ENCODING 7681 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +3E +42 +46 +3A +18 +24 +18 +ENDCHAR +STARTCHAR U+1E02 +ENCODING 7682 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +7C +42 +42 +42 +7C +42 +42 +42 +42 +7C +00 +00 +ENDCHAR +STARTCHAR U+1E03 +ENCODING 7683 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +62 +5C +00 +00 +ENDCHAR +STARTCHAR U+1E04 +ENCODING 7684 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +42 +42 +42 +42 +7C +00 +18 +ENDCHAR +STARTCHAR U+1E05 +ENCODING 7685 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +62 +5C +00 +18 +ENDCHAR +STARTCHAR U+1E06 +ENCODING 7686 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +42 +42 +42 +42 +7C +00 +7E +ENDCHAR +STARTCHAR U+1E07 +ENCODING 7687 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +62 +5C +00 +7E +ENDCHAR +STARTCHAR U+1E08 +ENCODING 7688 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +3C +42 +42 +40 +40 +40 +40 +42 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+1E09 +ENCODING 7689 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +3C +42 +40 +40 +40 +40 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+1E0A +ENCODING 7690 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +78 +44 +42 +42 +42 +42 +42 +42 +44 +78 +00 +00 +ENDCHAR +STARTCHAR U+1E0B +ENCODING 7691 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +00 +02 +02 +02 +3A +46 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1E0C +ENCODING 7692 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +44 +42 +42 +42 +42 +42 +42 +44 +78 +00 +18 +ENDCHAR +STARTCHAR U+1E0D +ENCODING 7693 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +02 +3A +46 +42 +42 +42 +42 +46 +3A +00 +18 +ENDCHAR +STARTCHAR U+1E0E +ENCODING 7694 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +44 +42 +42 +42 +42 +42 +42 +44 +78 +00 +7E +ENDCHAR +STARTCHAR U+1E0F +ENCODING 7695 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +02 +3A +46 +42 +42 +42 +42 +46 +3A +00 +7E +ENDCHAR +STARTCHAR U+1E10 +ENCODING 7696 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +44 +42 +42 +42 +42 +42 +42 +44 +78 +10 +60 +ENDCHAR +STARTCHAR U+1E11 +ENCODING 7697 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +02 +3A +46 +42 +42 +42 +42 +46 +3A +10 +60 +ENDCHAR +STARTCHAR U+1E12 +ENCODING 7698 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +44 +42 +42 +42 +42 +42 +42 +44 +78 +18 +24 +ENDCHAR +STARTCHAR U+1E13 +ENCODING 7699 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +02 +3A +46 +42 +42 +42 +42 +46 +3A +18 +24 +ENDCHAR +STARTCHAR U+1E14 +ENCODING 7700 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +3C +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1E15 +ENCODING 7701 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +30 +0C +00 +3C +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E16 +ENCODING 7702 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +3C +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1E17 +ENCODING 7703 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0C +30 +00 +3C +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E18 +ENCODING 7704 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +18 +24 +ENDCHAR +STARTCHAR U+1E19 +ENCODING 7705 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +18 +24 +ENDCHAR +STARTCHAR U+1E1A +ENCODING 7706 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +00 +32 +4C +ENDCHAR +STARTCHAR U+1E1B +ENCODING 7707 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +40 +42 +3C +00 +32 +4C +ENDCHAR +STARTCHAR U+1E1C +ENCODING 7708 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +08 +30 +ENDCHAR +STARTCHAR U+1E1D +ENCODING 7709 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +42 +3C +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +08 +30 +ENDCHAR +STARTCHAR U+1E1E +ENCODING 7710 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+1E1F +ENCODING 7711 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +00 +0C +10 +10 +10 +7C +10 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+1E20 +ENCODING 7712 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +3C +42 +42 +40 +40 +4E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1E21 +ENCODING 7713 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +02 +3A +44 +44 +44 +38 +20 +3C +42 +42 +3C +ENDCHAR +STARTCHAR U+1E22 +ENCODING 7714 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E23 +ENCODING 7715 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E24 +ENCODING 7716 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E25 +ENCODING 7717 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E26 +ENCODING 7718 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E27 +ENCODING 7719 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E28 +ENCODING 7720 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +C0 +ENDCHAR +STARTCHAR U+1E29 +ENCODING 7721 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +20 +C0 +ENDCHAR +STARTCHAR U+1E2A +ENCODING 7722 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +00 +42 +3C +ENDCHAR +STARTCHAR U+1E2B +ENCODING 7723 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +00 +42 +3C +ENDCHAR +STARTCHAR U+1E2C +ENCODING 7724 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +3E +00 +32 +4C +ENDCHAR +STARTCHAR U+1E2D +ENCODING 7725 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +00 +18 +08 +08 +08 +08 +08 +3E +00 +32 +4C +ENDCHAR +STARTCHAR U+1E2E +ENCODING 7726 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +06 +18 +00 +36 +00 +3E +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1E2F +ENCODING 7727 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +24 +24 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1E30 +ENCODING 7728 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +42 +44 +48 +50 +60 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E31 +ENCODING 7729 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +40 +40 +44 +48 +50 +60 +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E32 +ENCODING 7730 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +44 +48 +50 +60 +60 +50 +48 +44 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E33 +ENCODING 7731 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +44 +48 +50 +60 +50 +48 +44 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E34 +ENCODING 7732 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +44 +48 +50 +60 +60 +50 +48 +44 +42 +00 +7E +ENDCHAR +STARTCHAR U+1E35 +ENCODING 7733 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +44 +48 +50 +60 +50 +48 +44 +42 +00 +7E +ENDCHAR +STARTCHAR U+1E36 +ENCODING 7734 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7E +00 +18 +ENDCHAR +STARTCHAR U+1E37 +ENCODING 7735 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +0C +ENDCHAR +STARTCHAR U+1E38 +ENCODING 7736 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +78 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7E +00 +18 +ENDCHAR +STARTCHAR U+1E39 +ENCODING 7737 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +0C +ENDCHAR +STARTCHAR U+1E3A +ENCODING 7738 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7E +00 +7E +ENDCHAR +STARTCHAR U+1E3B +ENCODING 7739 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +3E +ENDCHAR +STARTCHAR U+1E3C +ENCODING 7740 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +7E +18 +24 +ENDCHAR +STARTCHAR U+1E3D +ENCODING 7741 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +08 +08 +08 +3E +0C +12 +ENDCHAR +STARTCHAR U+1E3E +ENCODING 7742 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +42 +42 +66 +66 +5A +5A +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E3F +ENCODING 7743 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +06 +18 +00 +00 +76 +49 +49 +49 +49 +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+1E40 +ENCODING 7744 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +42 +42 +66 +66 +5A +5A +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E41 +ENCODING 7745 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +00 +00 +76 +49 +49 +49 +49 +49 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+1E42 +ENCODING 7746 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +66 +66 +5A +5A +42 +42 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E43 +ENCODING 7747 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +76 +49 +49 +49 +49 +49 +49 +49 +00 +18 +ENDCHAR +STARTCHAR U+1E44 +ENCODING 7748 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E45 +ENCODING 7749 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E46 +ENCODING 7750 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E47 +ENCODING 7751 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E48 +ENCODING 7752 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +00 +7E +ENDCHAR +STARTCHAR U+1E49 +ENCODING 7753 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +00 +7E +ENDCHAR +STARTCHAR U+1E4A +ENCODING 7754 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +62 +62 +52 +52 +4A +4A +46 +46 +42 +18 +24 +ENDCHAR +STARTCHAR U+1E4B +ENCODING 7755 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +18 +24 +ENDCHAR +STARTCHAR U+1E4C +ENCODING 7756 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +32 +4C +00 +3C +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E4D +ENCODING 7757 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +32 +4C +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E4E +ENCODING 7758 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +00 +32 +4C +00 +3C +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E4F +ENCODING 7759 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +32 +4C +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E50 +ENCODING 7760 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +3C +00 +3C +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E51 +ENCODING 7761 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +30 +0C +00 +3C +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E52 +ENCODING 7762 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +3C +00 +3C +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E53 +ENCODING 7763 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0C +30 +00 +3C +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E54 +ENCODING 7764 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +7C +42 +42 +42 +7C +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+1E55 +ENCODING 7765 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +00 +5C +62 +42 +42 +42 +42 +62 +5C +40 +40 +ENDCHAR +STARTCHAR U+1E56 +ENCODING 7766 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +7C +42 +42 +42 +7C +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+1E57 +ENCODING 7767 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +00 +00 +5C +62 +42 +42 +42 +42 +62 +5C +40 +40 +ENDCHAR +STARTCHAR U+1E58 +ENCODING 7768 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E59 +ENCODING 7769 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+1E5A +ENCODING 7770 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E5B +ENCODING 7771 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +18 +ENDCHAR +STARTCHAR U+1E5C +ENCODING 7772 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E5D +ENCODING 7773 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +18 +ENDCHAR +STARTCHAR U+1E5E +ENCODING 7774 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +48 +44 +44 +42 +42 +00 +7E +ENDCHAR +STARTCHAR U+1E5F +ENCODING 7775 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +40 +40 +40 +40 +40 +00 +7E +ENDCHAR +STARTCHAR U+1E60 +ENCODING 7776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E61 +ENCODING 7777 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E62 +ENCODING 7778 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1E63 +ENCODING 7779 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1E64 +ENCODING 7780 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +0C +30 +00 +3C +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E65 +ENCODING 7781 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +0C +30 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E66 +ENCODING 7782 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +24 +18 +00 +3C +42 +40 +30 +0C +02 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E67 +ENCODING 7783 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +24 +18 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E68 +ENCODING 7784 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +3C +42 +42 +40 +30 +0C +02 +42 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1E69 +ENCODING 7785 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +00 +3C +42 +40 +30 +0C +02 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1E6A +ENCODING 7786 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1E6B +ENCODING 7787 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1E6C +ENCODING 7788 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +18 +ENDCHAR +STARTCHAR U+1E6D +ENCODING 7789 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +00 +18 +ENDCHAR +STARTCHAR U+1E6E +ENCODING 7790 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +3E +ENDCHAR +STARTCHAR U+1E6F +ENCODING 7791 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +00 +3C +ENDCHAR +STARTCHAR U+1E70 +ENCODING 7792 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +00 +0C +12 +ENDCHAR +STARTCHAR U+1E71 +ENCODING 7793 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +18 +24 +ENDCHAR +STARTCHAR U+1E72 +ENCODING 7794 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +66 +ENDCHAR +STARTCHAR U+1E73 +ENCODING 7795 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +66 +ENDCHAR +STARTCHAR U+1E74 +ENCODING 7796 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +32 +4C +ENDCHAR +STARTCHAR U+1E75 +ENCODING 7797 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +46 +3A +00 +32 +4C +ENDCHAR +STARTCHAR U+1E76 +ENCODING 7798 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +18 +24 +ENDCHAR +STARTCHAR U+1E77 +ENCODING 7799 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +18 +24 +ENDCHAR +STARTCHAR U+1E78 +ENCODING 7800 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +32 +4C +00 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E79 +ENCODING 7801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +32 +4C +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1E7A +ENCODING 7802 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +3C +00 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1E7B +ENCODING 7803 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +00 +3C +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1E7C +ENCODING 7804 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +41 +41 +41 +22 +22 +22 +14 +14 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1E7D +ENCODING 7805 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +42 +42 +42 +24 +24 +24 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+1E7E +ENCODING 7806 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +41 +22 +22 +22 +14 +14 +08 +08 +00 +0C +ENDCHAR +STARTCHAR U+1E7F +ENCODING 7807 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +24 +24 +24 +18 +18 +00 +18 +ENDCHAR +STARTCHAR U+1E80 +ENCODING 7808 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +00 +42 +42 +42 +42 +5A +5A +66 +66 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E81 +ENCODING 7809 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +41 +49 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1E82 +ENCODING 7810 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +00 +42 +42 +42 +5A +5A +66 +66 +42 +42 +00 +00 +00 +ENDCHAR +STARTCHAR U+1E83 +ENCODING 7811 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +06 +18 +00 +00 +41 +49 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1E84 +ENCODING 7812 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +42 +42 +42 +42 +5A +5A +66 +66 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E85 +ENCODING 7813 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +12 +12 +00 +00 +41 +49 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1E86 +ENCODING 7814 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +42 +42 +42 +42 +5A +5A +66 +66 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E87 +ENCODING 7815 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +00 +00 +41 +49 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1E88 +ENCODING 7816 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +5A +5A +66 +66 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1E89 +ENCODING 7817 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +41 +49 +49 +49 +49 +49 +49 +36 +00 +0C +ENDCHAR +STARTCHAR U+1E8A +ENCODING 7818 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +00 +42 +42 +24 +24 +18 +18 +24 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E8B +ENCODING 7819 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +00 +00 +42 +42 +24 +18 +18 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E8C +ENCODING 7820 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +42 +42 +24 +24 +18 +18 +24 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E8D +ENCODING 7821 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +24 +24 +00 +00 +42 +42 +24 +18 +18 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1E8E +ENCODING 7822 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1E8F +ENCODING 7823 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +00 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+1E90 +ENCODING 7824 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +7E +02 +02 +04 +08 +10 +20 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1E91 +ENCODING 7825 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +7E +02 +04 +08 +10 +20 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1E92 +ENCODING 7826 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +04 +08 +10 +20 +40 +40 +7E +00 +18 +ENDCHAR +STARTCHAR U+1E93 +ENCODING 7827 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +02 +04 +08 +10 +20 +40 +7E +00 +18 +ENDCHAR +STARTCHAR U+1E94 +ENCODING 7828 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +04 +08 +10 +20 +40 +40 +7E +00 +7E +ENDCHAR +STARTCHAR U+1E95 +ENCODING 7829 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +02 +04 +08 +10 +20 +40 +7E +00 +7E +ENDCHAR +STARTCHAR U+1E96 +ENCODING 7830 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +5C +62 +42 +42 +42 +42 +42 +42 +00 +7E +ENDCHAR +STARTCHAR U+1E97 +ENCODING 7831 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +24 +00 +00 +10 +10 +7C +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1E98 +ENCODING 7832 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +12 +0C +00 +41 +49 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1E99 +ENCODING 7833 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +18 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+1E9A +ENCODING 7834 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +04 +02 +04 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1E9B +ENCODING 7835 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +00 +0C +10 +10 +10 +30 +10 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+1EA0 +ENCODING 7840 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1EA1 +ENCODING 7841 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +18 +ENDCHAR +STARTCHAR U+1EA2 +ENCODING 7842 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EA3 +ENCODING 7843 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EA4 +ENCODING 7844 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +31 +4A +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EA5 +ENCODING 7845 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +31 +4A +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EA6 +ENCODING 7846 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +46 +29 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EA7 +ENCODING 7847 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +46 +29 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EA8 +ENCODING 7848 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +33 +49 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EA9 +ENCODING 7849 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +33 +49 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EAA +ENCODING 7850 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +18 +24 +00 +18 +24 +24 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EAB +ENCODING 7851 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +24 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EAC +ENCODING 7852 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1EAD +ENCODING 7853 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +18 +ENDCHAR +STARTCHAR U+1EAE +ENCODING 7854 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +10 +42 +3C +00 +18 +24 +24 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EAF +ENCODING 7855 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +42 +3C +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EB0 +ENCODING 7856 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +08 +42 +3C +00 +18 +24 +24 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EB1 +ENCODING 7857 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +42 +3C +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EB2 +ENCODING 7858 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +42 +3C +00 +18 +24 +24 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EB3 +ENCODING 7859 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +00 +42 +3C +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EB4 +ENCODING 7860 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +42 +3C +00 +18 +24 +24 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1EB5 +ENCODING 7861 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +42 +3C +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EB6 +ENCODING 7862 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +18 +ENDCHAR +STARTCHAR U+1EB7 +ENCODING 7863 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +42 +42 +3C +00 +3C +42 +02 +3E +42 +42 +46 +3A +00 +18 +ENDCHAR +STARTCHAR U+1EB8 +ENCODING 7864 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +18 +ENDCHAR +STARTCHAR U+1EB9 +ENCODING 7865 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1EBA +ENCODING 7866 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1EBB +ENCODING 7867 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1EBC +ENCODING 7868 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1EBD +ENCODING 7869 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1EBE +ENCODING 7870 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +31 +4A +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1EBF +ENCODING 7871 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +31 +4A +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1EC0 +ENCODING 7872 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +46 +29 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1EC1 +ENCODING 7873 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +46 +29 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1EC2 +ENCODING 7874 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +33 +49 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1EC3 +ENCODING 7875 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +33 +49 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1EC4 +ENCODING 7876 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +18 +24 +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1EC5 +ENCODING 7877 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +24 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1EC6 +ENCODING 7878 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +18 +ENDCHAR +STARTCHAR U+1EC7 +ENCODING 7879 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +3C +42 +42 +7E +40 +40 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1EC8 +ENCODING 7880 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1EC9 +ENCODING 7881 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +08 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1ECA +ENCODING 7882 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +18 +ENDCHAR +STARTCHAR U+1ECB +ENCODING 7883 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +00 +18 +08 +08 +08 +08 +08 +08 +3E +00 +18 +ENDCHAR +STARTCHAR U+1ECC +ENCODING 7884 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1ECD +ENCODING 7885 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1ECE +ENCODING 7886 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ECF +ENCODING 7887 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED0 +ENCODING 7888 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +31 +4A +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED1 +ENCODING 7889 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +31 +4A +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED2 +ENCODING 7890 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +46 +29 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED3 +ENCODING 7891 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +46 +29 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED4 +ENCODING 7892 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +33 +49 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED5 +ENCODING 7893 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +33 +49 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED6 +ENCODING 7894 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +18 +24 +00 +3C +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED7 +ENCODING 7895 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +24 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1ED8 +ENCODING 7896 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +24 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1ED9 +ENCODING 7897 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +00 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1EDA +ENCODING 7898 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +00 +02 +3A +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EDB +ENCODING 7899 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +00 +02 +3A +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EDC +ENCODING 7900 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +02 +3A +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EDD +ENCODING 7901 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +02 +3A +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EDE +ENCODING 7902 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +00 +02 +3A +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EDF +ENCODING 7903 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +00 +02 +3A +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EE0 +ENCODING 7904 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +02 +3A +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EE1 +ENCODING 7905 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +02 +3A +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EE2 +ENCODING 7906 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +3A +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +18 +ENDCHAR +STARTCHAR U+1EE3 +ENCODING 7907 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +3A +44 +44 +44 +44 +44 +44 +38 +00 +18 +ENDCHAR +STARTCHAR U+1EE4 +ENCODING 7908 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +18 +ENDCHAR +STARTCHAR U+1EE5 +ENCODING 7909 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +18 +ENDCHAR +STARTCHAR U+1EE6 +ENCODING 7910 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1EE7 +ENCODING 7911 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +00 +00 +42 +42 +42 +42 +42 +42 +46 +3A +00 +00 +ENDCHAR +STARTCHAR U+1EE8 +ENCODING 7912 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +30 +01 +01 +46 +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EE9 +ENCODING 7913 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +30 +01 +01 +46 +44 +44 +44 +44 +44 +4C +34 +00 +00 +ENDCHAR +STARTCHAR U+1EEA +ENCODING 7914 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +01 +01 +46 +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EEB +ENCODING 7915 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +01 +01 +46 +44 +44 +44 +44 +44 +4C +34 +00 +00 +ENDCHAR +STARTCHAR U+1EEC +ENCODING 7916 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +10 +01 +01 +46 +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EED +ENCODING 7917 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +10 +01 +01 +46 +44 +44 +44 +44 +44 +4C +34 +00 +00 +ENDCHAR +STARTCHAR U+1EEE +ENCODING 7918 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +01 +01 +46 +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+1EEF +ENCODING 7919 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +01 +01 +46 +44 +44 +44 +44 +44 +4C +34 +00 +00 +ENDCHAR +STARTCHAR U+1EF0 +ENCODING 7920 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +01 +01 +46 +44 +44 +44 +44 +44 +44 +44 +44 +38 +00 +18 +ENDCHAR +STARTCHAR U+1EF1 +ENCODING 7921 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +01 +01 +46 +44 +44 +44 +44 +44 +4C +34 +00 +30 +ENDCHAR +STARTCHAR U+1EF2 +ENCODING 7922 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +0C +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1EF3 +ENCODING 7923 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +00 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+1EF4 +ENCODING 7924 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +18 +ENDCHAR +STARTCHAR U+1EF5 +ENCODING 7925 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +26 +1A +02 +3C +00 +18 +ENDCHAR +STARTCHAR U+1EF6 +ENCODING 7926 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1EF7 +ENCODING 7927 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +00 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+1EF8 +ENCODING 7928 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1EF9 +ENCODING 7929 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +4C +00 +00 +42 +42 +42 +42 +42 +26 +1A +02 +02 +3C +ENDCHAR +STARTCHAR U+1F00 +ENCODING 7936 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +10 +20 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F01 +ENCODING 7937 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +20 +10 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F02 +ENCODING 7938 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +68 +28 +44 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F03 +ENCODING 7939 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +68 +48 +24 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F04 +ENCODING 7940 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +64 +28 +48 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F05 +ENCODING 7941 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +64 +48 +28 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F06 +ENCODING 7942 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +00 +30 +10 +20 +00 +32 +4A +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F07 +ENCODING 7943 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +00 +30 +20 +10 +00 +32 +4A +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F08 +ENCODING 7944 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F09 +ENCODING 7945 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F0A +ENCODING 7946 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F0B +ENCODING 7947 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F0C +ENCODING 7948 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F0D +ENCODING 7949 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F0E +ENCODING 7950 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +20 +40 +18 +24 +24 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F0F +ENCODING 7951 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +40 +20 +18 +24 +24 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F10 +ENCODING 7952 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +10 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F11 +ENCODING 7953 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +08 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F12 +ENCODING 7954 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +14 +22 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F13 +ENCODING 7955 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +24 +12 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F14 +ENCODING 7956 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +14 +24 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F15 +ENCODING 7957 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +24 +14 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F18 +ENCODING 7960 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1F19 +ENCODING 7961 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1F1A +ENCODING 7962 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1F1B +ENCODING 7963 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1F1C +ENCODING 7964 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1F1D +ENCODING 7965 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1F20 +ENCODING 7968 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +10 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F21 +ENCODING 7969 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +08 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F22 +ENCODING 7970 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +14 +22 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F23 +ENCODING 7971 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +24 +12 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F24 +ENCODING 7972 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +14 +24 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F25 +ENCODING 7973 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +24 +14 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F26 +ENCODING 7974 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +08 +10 +00 +5C +62 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F27 +ENCODING 7975 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +10 +08 +00 +5C +62 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F28 +ENCODING 7976 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F29 +ENCODING 7977 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F2A +ENCODING 7978 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F2B +ENCODING 7979 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F2C +ENCODING 7980 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F2D +ENCODING 7981 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F2E +ENCODING 7982 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +20 +40 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F2F +ENCODING 7983 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +40 +20 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1F30 +ENCODING 7984 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +10 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F31 +ENCODING 7985 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +08 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F32 +ENCODING 7986 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +68 +28 +44 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F33 +ENCODING 7987 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +68 +48 +24 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F34 +ENCODING 7988 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +64 +28 +48 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F35 +ENCODING 7989 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +64 +48 +28 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F36 +ENCODING 7990 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +08 +10 +00 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F37 +ENCODING 7991 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +10 +08 +00 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F38 +ENCODING 7992 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1F39 +ENCODING 7993 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +60 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1F3A +ENCODING 7994 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1F3B +ENCODING 7995 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1F3C +ENCODING 7996 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1F3D +ENCODING 7997 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1F3E +ENCODING 7998 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +20 +40 +3E +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1F3F +ENCODING 7999 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +40 +20 +3E +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1F40 +ENCODING 8000 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +10 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F41 +ENCODING 8001 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +08 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F42 +ENCODING 8002 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +14 +22 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F43 +ENCODING 8003 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +24 +12 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F44 +ENCODING 8004 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +14 +24 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F45 +ENCODING 8005 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +24 +14 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F48 +ENCODING 8008 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F49 +ENCODING 8009 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F4A +ENCODING 8010 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F4B +ENCODING 8011 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F4C +ENCODING 8012 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F4D +ENCODING 8013 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F50 +ENCODING 8016 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +10 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F51 +ENCODING 8017 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +08 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F52 +ENCODING 8018 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +14 +22 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F53 +ENCODING 8019 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +24 +12 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F54 +ENCODING 8020 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +14 +24 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F55 +ENCODING 8021 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +24 +14 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F56 +ENCODING 8022 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +08 +10 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F57 +ENCODING 8023 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +10 +08 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F59 +ENCODING 8025 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1F5B +ENCODING 8027 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1F5D +ENCODING 8029 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1F5F +ENCODING 8031 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +40 +20 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1F60 +ENCODING 8032 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +04 +08 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F61 +ENCODING 8033 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +0C +08 +04 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F62 +ENCODING 8034 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +14 +22 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F63 +ENCODING 8035 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +24 +12 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F64 +ENCODING 8036 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +14 +24 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F65 +ENCODING 8037 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +24 +14 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F66 +ENCODING 8038 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +08 +10 +00 +22 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F67 +ENCODING 8039 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +10 +08 +00 +22 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F68 +ENCODING 8040 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1F69 +ENCODING 8041 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1F6A +ENCODING 8042 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1F6B +ENCODING 8043 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1F6C +ENCODING 8044 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1F6D +ENCODING 8045 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1F6E +ENCODING 8046 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +18 +08 +10 +1C +22 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1F6F +ENCODING 8047 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +18 +10 +08 +1C +23 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1F70 +ENCODING 8048 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +20 +20 +10 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F71 +ENCODING 8049 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +20 +20 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1F72 +ENCODING 8050 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F73 +ENCODING 8051 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +10 +10 +00 +3C +42 +40 +3C +40 +40 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F74 +ENCODING 8052 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F75 +ENCODING 8053 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +10 +10 +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1F76 +ENCODING 8054 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F77 +ENCODING 8055 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +10 +10 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1F78 +ENCODING 8056 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F79 +ENCODING 8057 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +10 +10 +00 +3C +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F7A +ENCODING 8058 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F7B +ENCODING 8059 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +10 +10 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1F7C +ENCODING 8060 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F7D +ENCODING 8061 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +04 +08 +08 +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1F80 +ENCODING 8064 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +10 +20 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1F81 +ENCODING 8065 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +20 +10 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1F82 +ENCODING 8066 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +68 +28 +44 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1F83 +ENCODING 8067 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +68 +48 +24 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1F84 +ENCODING 8068 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +64 +28 +48 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1F85 +ENCODING 8069 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +64 +48 +28 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1F86 +ENCODING 8070 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +30 +10 +20 +00 +32 +4A +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1F87 +ENCODING 8071 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +30 +20 +10 +00 +32 +4A +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1F88 +ENCODING 8072 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1F89 +ENCODING 8073 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1F8A +ENCODING 8074 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1F8B +ENCODING 8075 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1F8C +ENCODING 8076 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1F8D +ENCODING 8077 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1F8E +ENCODING 8078 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +20 +40 +18 +24 +24 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1F8F +ENCODING 8079 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +40 +20 +18 +24 +24 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1F90 +ENCODING 8080 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +10 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1F91 +ENCODING 8081 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +08 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1F92 +ENCODING 8082 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +14 +22 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1F93 +ENCODING 8083 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +24 +12 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1F94 +ENCODING 8084 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +14 +24 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1F95 +ENCODING 8085 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +24 +14 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1F96 +ENCODING 8086 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +08 +10 +00 +5C +62 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1F97 +ENCODING 8087 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +10 +08 +00 +5C +62 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1F98 +ENCODING 8088 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +18 +ENDCHAR +STARTCHAR U+1F99 +ENCODING 8089 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +18 +ENDCHAR +STARTCHAR U+1F9A +ENCODING 8090 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +18 +ENDCHAR +STARTCHAR U+1F9B +ENCODING 8091 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +18 +ENDCHAR +STARTCHAR U+1F9C +ENCODING 8092 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +18 +ENDCHAR +STARTCHAR U+1F9D +ENCODING 8093 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +18 +ENDCHAR +STARTCHAR U+1F9E +ENCODING 8094 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +20 +40 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +18 +ENDCHAR +STARTCHAR U+1F9F +ENCODING 8095 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +40 +20 +42 +42 +42 +7E +42 +42 +42 +42 +42 +20 +18 +ENDCHAR +STARTCHAR U+1FA0 +ENCODING 8096 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +10 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FA1 +ENCODING 8097 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +08 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FA2 +ENCODING 8098 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +14 +22 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FA3 +ENCODING 8099 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +34 +24 +12 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FA4 +ENCODING 8100 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +14 +24 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FA5 +ENCODING 8101 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +32 +24 +14 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FA6 +ENCODING 8102 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +08 +10 +00 +22 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FA7 +ENCODING 8103 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +10 +08 +00 +22 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FA8 +ENCODING 8104 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +40 +80 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FA9 +ENCODING 8105 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FAA +ENCODING 8106 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +50 +88 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FAB +ENCODING 8107 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +D0 +90 +48 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FAC +ENCODING 8108 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +50 +90 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FAD +ENCODING 8109 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C8 +90 +50 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FAE +ENCODING 8110 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +20 +40 +1C +22 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FAF +ENCODING 8111 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +98 +60 +40 +20 +1C +22 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FB0 +ENCODING 8112 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +44 +44 +38 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1FB1 +ENCODING 8113 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1FB2 +ENCODING 8114 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +20 +20 +10 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1FB3 +ENCODING 8115 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1FB4 +ENCODING 8116 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +20 +20 +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1FB6 +ENCODING 8118 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +4C +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+1FB7 +ENCODING 8119 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +4C +00 +32 +4A +44 +44 +44 +44 +4A +32 +20 +30 +ENDCHAR +STARTCHAR U+1FB8 +ENCODING 8120 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +42 +42 +3C +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1FB9 +ENCODING 8121 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3C +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1FBA +ENCODING 8122 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +40 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1FBB +ENCODING 8123 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +80 +80 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1FBC +ENCODING 8124 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +42 +42 +7E +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1FBD +ENCODING 8125 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +08 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FBE +ENCODING 8126 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +0C +ENDCHAR +STARTCHAR U+1FBF +ENCODING 8127 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +08 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FC0 +ENCODING 8128 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FC1 +ENCODING 8129 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FC2 +ENCODING 8130 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1FC3 +ENCODING 8131 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1FC4 +ENCODING 8132 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +10 +10 +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1FC6 +ENCODING 8134 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +4C +00 +5C +62 +42 +42 +42 +42 +42 +42 +02 +02 +ENDCHAR +STARTCHAR U+1FC7 +ENCODING 8135 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +4C +00 +5C +62 +42 +42 +42 +42 +42 +42 +22 +32 +ENDCHAR +STARTCHAR U+1FC8 +ENCODING 8136 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +40 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1FC9 +ENCODING 8137 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +80 +80 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+1FCA +ENCODING 8138 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1FCB +ENCODING 8139 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +80 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+1FCC +ENCODING 8140 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +10 +0C +ENDCHAR +STARTCHAR U+1FCD +ENCODING 8141 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +68 +28 +44 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FCE +ENCODING 8142 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +28 +48 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FCF +ENCODING 8143 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +08 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FD0 +ENCODING 8144 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +44 +44 +38 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1FD1 +ENCODING 8145 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1FD2 +ENCODING 8146 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +08 +00 +66 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1FD3 +ENCODING 8147 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +10 +10 +00 +66 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1FD6 +ENCODING 8150 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +4C +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1FD7 +ENCODING 8151 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +32 +4C +00 +66 +00 +10 +10 +10 +10 +10 +10 +10 +0C +00 +00 +ENDCHAR +STARTCHAR U+1FD8 +ENCODING 8152 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +22 +22 +1C +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1FD9 +ENCODING 8153 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +3E +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1FDA +ENCODING 8154 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +40 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1FDB +ENCODING 8155 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +80 +80 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+1FDD +ENCODING 8157 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +68 +48 +24 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FDE +ENCODING 8158 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +64 +48 +28 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FDF +ENCODING 8159 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +32 +4C +00 +18 +10 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FE0 +ENCODING 8160 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +42 +42 +3C +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1FE1 +ENCODING 8161 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +00 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1FE2 +ENCODING 8162 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +08 +00 +66 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1FE3 +ENCODING 8163 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +10 +10 +00 +66 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1FE4 +ENCODING 8164 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +10 +00 +3C +42 +42 +42 +42 +42 +62 +5C +40 +40 +ENDCHAR +STARTCHAR U+1FE5 +ENCODING 8165 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +08 +00 +3C +42 +42 +42 +42 +42 +62 +5C +40 +40 +ENDCHAR +STARTCHAR U+1FE6 +ENCODING 8166 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +4C +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1FE7 +ENCODING 8167 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +32 +4C +00 +66 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1FE8 +ENCODING 8168 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +22 +22 +1C +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1FE9 +ENCODING 8169 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3E +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1FEA +ENCODING 8170 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +40 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1FEB +ENCODING 8171 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +80 +80 +00 +41 +41 +22 +22 +14 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+1FEC +ENCODING 8172 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +80 +40 +00 +7C +42 +42 +42 +7C +40 +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+1FED +ENCODING 8173 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +08 +00 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FEE +ENCODING 8174 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +10 +10 +00 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FEF +ENCODING 8175 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FF2 +ENCODING 8178 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FF3 +ENCODING 8179 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FF4 +ENCODING 8180 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +04 +08 +08 +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FF6 +ENCODING 8182 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +4C +00 +22 +41 +41 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+1FF7 +ENCODING 8183 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +4C +00 +22 +41 +41 +49 +49 +49 +49 +36 +08 +0C +ENDCHAR +STARTCHAR U+1FF8 +ENCODING 8184 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +40 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1FF9 +ENCODING 8185 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +80 +80 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+1FFA +ENCODING 8186 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +40 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1FFB +ENCODING 8187 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +40 +80 +80 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +00 +00 +ENDCHAR +STARTCHAR U+1FFC +ENCODING 8188 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +41 +41 +41 +41 +41 +22 +14 +14 +77 +08 +06 +ENDCHAR +STARTCHAR U+1FFD +ENCODING 8189 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +10 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+1FFE +ENCODING 8190 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +10 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2000 +ENCODING 8192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2270 +3288 +2A88 +2698 +2278 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2001 +ENCODING 8193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2270 +3688 +2A88 +2298 +2278 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2002 +ENCODING 8194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E88 +20C8 +3EA8 +2098 +3E88 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2003 +ENCODING 8195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E88 +20D8 +3EA8 +2088 +3E88 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2004 +ENCODING 8196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3C88 +02D8 +1CA8 +0288 +3C88 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2005 +ENCODING 8197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2488 +24D8 +3EA8 +0488 +0488 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2006 +ENCODING 8198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1E88 +20D8 +3CA8 +2288 +1C88 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2007 +ENCODING 8199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E00 +2000 +3E00 +2000 +2000 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2008 +ENCODING 8200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3C00 +2200 +3C00 +2000 +2000 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+2009 +ENCODING 8201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E88 +0888 +08F8 +0888 +0888 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+200A +ENCODING 8202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2200 +2200 +3E00 +2200 +2200 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+200B +ENCODING 8203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E88 +0488 +08A8 +10D8 +3E88 +0000 +1EF0 +2088 +1CF0 +0280 +3C80 +0000 +0000 +ENDCHAR +STARTCHAR U+200C +ENCODING 8204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E88 +0488 +08A8 +10D8 +3E88 +0000 +2208 +3208 +2A08 +2688 +2270 +0000 +0000 +ENDCHAR +STARTCHAR U+200D +ENCODING 8205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E88 +0488 +08A8 +10D8 +3E88 +0000 +0080 +0080 +0080 +0480 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+200E +ENCODING 8206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +4722 +44B6 +472A +4522 +74A2 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+200F +ENCODING 8207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +7222 +4A36 +722A +5222 +4BA2 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2010 +ENCODING 8208 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2011 +ENCODING 8209 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2012 +ENCODING 8210 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2013 +ENCODING 8211 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2014 +ENCODING 8212 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +7F +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2015 +ENCODING 8213 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2016 +ENCODING 8214 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +00 +00 +ENDCHAR +STARTCHAR U+2017 +ENCODING 8215 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +00 +FF +ENDCHAR +STARTCHAR U+2018 +ENCODING 8216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +10 +10 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2019 +ENCODING 8217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +08 +08 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+201A +ENCODING 8218 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +08 +08 +10 +ENDCHAR +STARTCHAR U+201B +ENCODING 8219 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +10 +10 +08 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+201C +ENCODING 8220 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +22 +44 +44 +66 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+201D +ENCODING 8221 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +66 +22 +22 +44 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+201E +ENCODING 8222 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +66 +22 +22 +44 +ENDCHAR +STARTCHAR U+201F +ENCODING 8223 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +66 +44 +44 +22 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2020 +ENCODING 8224 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +1C +08 +2A +7F +2A +08 +1C +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2021 +ENCODING 8225 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +1C +08 +2A +7F +2A +08 +08 +2A +7F +2A +08 +1C +08 +00 +ENDCHAR +STARTCHAR U+2022 +ENCODING 8226 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +38 +7C +7C +7C +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2023 +ENCODING 8227 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +30 +38 +3C +38 +30 +20 +00 +00 +00 +ENDCHAR +STARTCHAR U+2024 +ENCODING 8228 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+2025 +ENCODING 8229 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+2026 +ENCODING 8230 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +49 +49 +00 +00 +ENDCHAR +STARTCHAR U+2027 +ENCODING 8231 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2028 +ENCODING 8232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0200 +0200 +0200 +0200 +03C0 +0000 +3BDC +4212 +33DC +0A10 +73D0 +0000 +0000 +ENDCHAR +STARTCHAR U+2029 +ENCODING 8233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0380 +0240 +0380 +0200 +0200 +0000 +3BDC +4212 +33DC +0A10 +73D0 +0000 +0000 +ENDCHAR +STARTCHAR U+202A +ENCODING 8234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +439E +4250 +439E +4290 +7A5E +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+202B +ENCODING 8235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +721E +4A10 +721E +5210 +4BDE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+202C +ENCODING 8236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +739E +4A50 +725E +4250 +4390 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+202D +ENCODING 8237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +438C +4252 +4392 +4292 +7A4C +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+202E +ENCODING 8238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +720C +4A12 +7212 +5212 +4BCC +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2030 +ENCODING 8240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +A4 +A4 +48 +10 +10 +2A +55 +55 +8A +00 +00 +ENDCHAR +STARTCHAR U+2031 +ENCODING 8241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +A0 +A0 +4C +30 +C0 +2A +55 +55 +2A +00 +00 +ENDCHAR +STARTCHAR U+2032 +ENCODING 8242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +18 +10 +20 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2033 +ENCODING 8243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +33 +66 +44 +88 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2034 +ENCODING 8244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3F +7E +54 +A8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2035 +ENCODING 8245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +30 +18 +08 +04 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2036 +ENCODING 8246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +CC +66 +22 +11 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2037 +ENCODING 8247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +FC +7E +2A +15 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2038 +ENCODING 8248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +28 +44 +ENDCHAR +STARTCHAR U+2039 +ENCODING 8249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +04 +04 +08 +08 +04 +04 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+203A +ENCODING 8250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +20 +20 +10 +10 +20 +20 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+203B +ENCODING 8251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +49 +22 +14 +49 +14 +22 +49 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+203C +ENCODING 8252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +24 +24 +24 +24 +24 +24 +00 +24 +24 +00 +00 +ENDCHAR +STARTCHAR U+203D +ENCODING 8253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +4A +4A +0A +0C +08 +08 +00 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+203E +ENCODING 8254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +7E +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+203F +ENCODING 8255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +42 +3C +ENDCHAR +STARTCHAR U+2040 +ENCODING 8256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +3C +42 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2041 +ENCODING 8257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +02 +04 +08 +10 +28 +44 +ENDCHAR +STARTCHAR U+2042 +ENCODING 8258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +1C +08 +00 +22 +77 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2043 +ENCODING 8259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +3C +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2044 +ENCODING 8260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +04 +08 +08 +10 +10 +20 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+2045 +ENCODING 8261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0E +08 +08 +08 +08 +0E +08 +08 +08 +08 +08 +0E +00 +ENDCHAR +STARTCHAR U+2046 +ENCODING 8262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +70 +10 +10 +10 +10 +70 +10 +10 +10 +10 +10 +70 +00 +ENDCHAR +STARTCHAR U+2047 +ENCODING 8263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +40 +40 +20 +10 +10 +00 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+206A +ENCODING 8298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E00 +0800 +0800 +0800 +3E00 +0000 +1E78 +2080 +1C70 +0208 +3CF0 +0000 +0000 +ENDCHAR +STARTCHAR U+206B +ENCODING 8299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1C00 +2200 +3E00 +2200 +2200 +0000 +1E78 +2080 +1C70 +0208 +3CF0 +0000 +0000 +ENDCHAR +STARTCHAR U+206C +ENCODING 8300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3E70 +0888 +08F8 +0888 +3E88 +0000 +3E78 +2080 +3C70 +2008 +20F0 +0000 +0000 +ENDCHAR +STARTCHAR U+206D +ENCODING 8301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1C70 +2288 +3EF8 +2288 +2288 +0000 +3E78 +2080 +3E70 +2008 +20F0 +0000 +0000 +ENDCHAR +STARTCHAR U+206E +ENCODING 8302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2270 +3288 +2AF8 +2688 +2288 +0000 +3C78 +2280 +2270 +2208 +3CF0 +0000 +0000 +ENDCHAR +STARTCHAR U+206F +ENCODING 8303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2270 +3288 +2A88 +2688 +2270 +0000 +3C78 +2280 +2270 +2208 +3CF0 +0000 +0000 +ENDCHAR +STARTCHAR U+2070 +ENCODING 8304 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +14 +22 +22 +22 +14 +08 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2074 +ENCODING 8308 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +04 +0C +14 +24 +3E +04 +04 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2075 +ENCODING 8309 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3E +20 +20 +3C +02 +02 +3C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2076 +ENCODING 8310 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +22 +20 +3C +22 +22 +1C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2077 +ENCODING 8311 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +3E +02 +02 +04 +08 +08 +08 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2078 +ENCODING 8312 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +22 +22 +1C +22 +22 +1C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2079 +ENCODING 8313 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +22 +22 +1E +02 +22 +1C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+207A +ENCODING 8314 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +3E +08 +08 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+207B +ENCODING 8315 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3E +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+207C +ENCODING 8316 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +00 +3E +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+207D +ENCODING 8317 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +04 +08 +08 +08 +08 +08 +04 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+207E +ENCODING 8318 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +08 +08 +08 +08 +08 +10 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+207F +ENCODING 8319 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +2C +32 +22 +22 +22 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2080 +ENCODING 8320 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +14 +22 +22 +22 +14 +08 +ENDCHAR +STARTCHAR U+2081 +ENCODING 8321 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +18 +28 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2082 +ENCODING 8322 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +1C +22 +02 +1C +20 +20 +3E +ENDCHAR +STARTCHAR U+2083 +ENCODING 8323 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +1C +22 +02 +1C +02 +22 +1C +ENDCHAR +STARTCHAR U+2084 +ENCODING 8324 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +04 +0C +14 +24 +3E +04 +04 +ENDCHAR +STARTCHAR U+2085 +ENCODING 8325 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +3E +20 +20 +3C +02 +02 +3C +ENDCHAR +STARTCHAR U+2086 +ENCODING 8326 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +1C +22 +20 +3C +22 +22 +1C +ENDCHAR +STARTCHAR U+2087 +ENCODING 8327 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +3E +02 +02 +04 +08 +08 +08 +ENDCHAR +STARTCHAR U+2088 +ENCODING 8328 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +1C +22 +22 +1C +22 +22 +1C +ENDCHAR +STARTCHAR U+2089 +ENCODING 8329 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +1C +22 +22 +1E +02 +22 +1C +ENDCHAR +STARTCHAR U+208A +ENCODING 8330 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +08 +08 +3E +08 +08 +00 +ENDCHAR +STARTCHAR U+208B +ENCODING 8331 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +3E +00 +00 +00 +ENDCHAR +STARTCHAR U+208C +ENCODING 8332 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +3E +00 +3E +00 +00 +ENDCHAR +STARTCHAR U+208D +ENCODING 8333 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +04 +08 +08 +08 +08 +08 +04 +ENDCHAR +STARTCHAR U+208E +ENCODING 8334 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +10 +08 +08 +08 +08 +08 +10 +ENDCHAR +STARTCHAR U+20A0 +ENCODING 8352 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +40 +40 +5E +50 +50 +3C +10 +10 +1E +00 +00 +ENDCHAR +STARTCHAR U+20A1 +ENCODING 8353 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0A +3E +4A +54 +54 +68 +68 +72 +5C +10 +00 +00 +ENDCHAR +STARTCHAR U+20A2 +ENCODING 8354 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +42 +40 +56 +58 +50 +50 +32 +1C +00 +00 +ENDCHAR +STARTCHAR U+20A3 +ENCODING 8355 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3F +20 +20 +20 +3E +20 +20 +FC +20 +20 +00 +00 +ENDCHAR +STARTCHAR U+20A4 +ENCODING 8356 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +10 +10 +7E +10 +7E +10 +10 +3E +61 +00 +00 +ENDCHAR +STARTCHAR U+20A5 +ENCODING 8357 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +01 +01 +76 +4D +4D +49 +49 +59 +69 +69 +00 +00 +ENDCHAR +STARTCHAR U+20A6 +ENCODING 8358 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +22 +32 +7F +2A +7F +26 +26 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+20A7 +ENCODING 8359 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +68 +58 +5F +5C +6C +4A +49 +49 +49 +4E +00 +00 +ENDCHAR +STARTCHAR U+20A8 +ENCODING 8360 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +70 +48 +4B +4C +74 +54 +52 +49 +49 +4E +00 +00 +ENDCHAR +STARTCHAR U+20A9 +ENCODING 8361 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +22 +22 +7F +2A +7F +36 +36 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+20AA +ENCODING 8362 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7A +4A +5A +5A +5A +5A +52 +5E +00 +00 +ENDCHAR +STARTCHAR U+20AB +ENCODING 8363 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +3E +02 +3A +46 +42 +42 +42 +46 +3A +00 +3C +ENDCHAR +STARTCHAR U+20AC +ENCODING 8364 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +12 +20 +7C +20 +7C +20 +20 +12 +0C +00 +00 +ENDCHAR +STARTCHAR U+20AD +ENCODING 8365 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +44 +48 +50 +60 +FE +50 +48 +44 +42 +00 +00 +ENDCHAR +STARTCHAR U+20D0 +ENCODING 8400 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +20 +7E +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20D1 +ENCODING 8401 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +04 +7E +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20D2 +ENCODING 8402 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +54 +10 +92 +10 +54 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+20D3 +ENCODING 8403 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +54 +10 +92 +10 +54 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20D4 +ENCODING 8404 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +4C +52 +60 +78 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20D5 +ENCODING 8405 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +32 +4A +06 +1E +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20D6 +ENCODING 8406 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +20 +7E +20 +10 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20D7 +ENCODING 8407 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +04 +7E +04 +08 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20D8 +ENCODING 8408 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +18 +25 +A4 +18 +42 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20D9 +ENCODING 8409 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +38 +35 +A4 +18 +42 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20DA +ENCODING 8410 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +1C +2D +A4 +18 +42 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20DB +ENCODING 8411 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +2A +2A +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20DC +ENCODING 8412 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +55 +55 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20DD +ENCODING 8413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0C60 +3018 +2008 +4004 +4244 +8002 +8422 +8002 +4244 +4004 +2008 +3018 +0C60 +0380 +ENDCHAR +STARTCHAR U+20DE +ENCODING 8414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4002 +4002 +4002 +4242 +4002 +4422 +4002 +4242 +4002 +4002 +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+20DF +ENCODING 8415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +0820 +1010 +2248 +4004 +8422 +4004 +2248 +1010 +0820 +0440 +0280 +0100 +ENDCHAR +STARTCHAR U+20E0 +ENCODING 8416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0C60 +3018 +3008 +5904 +4C04 +8602 +8722 +8182 +44C4 +4064 +2038 +3018 +0C60 +0380 +ENDCHAR +STARTCHAR U+20E1 +ENCODING 8417 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +24 +42 +FF +42 +24 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+20E2 +ENCODING 8418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3FFC +4002 +4002 +4242 +4002 +4422 +4002 +4242 +4002 +4002 +3FFC +7FFE +0000 +ENDCHAR +STARTCHAR U+20E3 +ENCODING 8419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +6006 +5FFA +500A +500A +524A +500A +542A +500A +524A +500A +5FFA +6006 +3FFC +0000 +ENDCHAR +STARTCHAR U+2100 +ENCODING 8448 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +51 +52 +34 +08 +13 +24 +44 +03 +00 +00 +ENDCHAR +STARTCHAR U+2101 +ENCODING 8449 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +51 +52 +34 +0B +14 +22 +41 +06 +00 +00 +ENDCHAR +STARTCHAR U+2102 +ENCODING 8450 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1E +31 +50 +50 +50 +50 +50 +50 +31 +1E +00 +00 +ENDCHAR +STARTCHAR U+2103 +ENCODING 8451 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +60 +90 +90 +60 +0C +12 +10 +10 +10 +12 +0C +00 +00 +ENDCHAR +STARTCHAR U+2104 +ENCODING 8452 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +3C +50 +50 +50 +50 +3C +10 +1E +00 +00 +ENDCHAR +STARTCHAR U+2105 +ENCODING 8453 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +41 +42 +34 +08 +16 +29 +49 +06 +00 +00 +ENDCHAR +STARTCHAR U+2106 +ENCODING 8454 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +41 +42 +34 +08 +10 +29 +49 +06 +00 +00 +ENDCHAR +STARTCHAR U+2107 +ENCODING 8455 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +42 +40 +40 +38 +40 +40 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+2108 +ENCODING 8456 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +02 +12 +1E +12 +02 +02 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+2109 +ENCODING 8457 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +60 +90 +90 +60 +00 +1E +10 +10 +1C +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+210A +ENCODING 8458 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3A +46 +42 +42 +3E +02 +3F +42 +3C +00 +ENDCHAR +STARTCHAR U+210B +ENCODING 8459 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +12 +75 +96 +14 +1C +34 +54 +94 +94 +63 +00 +00 +ENDCHAR +STARTCHAR U+210C +ENCODING 8460 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +77 +B7 +B6 +B6 +36 +3E +36 +36 +76 +67 +00 +00 +ENDCHAR +STARTCHAR U+210D +ENCODING 8461 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +71 +51 +51 +51 +5F +51 +51 +51 +51 +71 +00 +00 +ENDCHAR +STARTCHAR U+210E +ENCODING 8462 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +40 +58 +64 +44 +44 +44 +44 +46 +00 +00 +ENDCHAR +STARTCHAR U+210F +ENCODING 8463 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +50 +60 +40 +D8 +64 +44 +44 +44 +44 +46 +00 +00 +ENDCHAR +STARTCHAR U+2110 +ENCODING 8464 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +14 +24 +04 +04 +06 +0C +14 +24 +28 +30 +00 +ENDCHAR +STARTCHAR U+2111 +ENCODING 8465 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3F +7E +44 +24 +06 +06 +06 +06 +76 +5C +00 +00 +ENDCHAR +STARTCHAR U+2112 +ENCODING 8466 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +12 +12 +3C +10 +10 +10 +10 +70 +99 +66 +00 +00 +ENDCHAR +STARTCHAR U+2113 +ENCODING 8467 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +24 +24 +24 +28 +30 +60 +20 +20 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+2114 +ENCODING 8468 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +48 +48 +FE +48 +4A +4D +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+2115 +ENCODING 8469 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +71 +51 +59 +59 +55 +55 +53 +53 +51 +71 +00 +00 +ENDCHAR +STARTCHAR U+2116 +ENCODING 8470 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +92 +95 +95 +D2 +D0 +B7 +B0 +90 +90 +90 +00 +00 +ENDCHAR +STARTCHAR U+2117 +ENCODING 8471 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +B9 +A5 +A5 +B9 +A1 +A1 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+2118 +ENCODING 8472 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +4E +51 +51 +21 +2E +50 +50 +50 +50 +60 +00 +00 +ENDCHAR +STARTCHAR U+2119 +ENCODING 8473 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +52 +52 +52 +52 +5C +50 +50 +50 +70 +00 +00 +ENDCHAR +STARTCHAR U+211A +ENCODING 8474 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +32 +51 +51 +51 +51 +51 +51 +36 +1E +01 +00 +ENDCHAR +STARTCHAR U+211B +ENCODING 8475 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +2E +11 +31 +51 +51 +5E +54 +52 +52 +21 +00 +00 +ENDCHAR +STARTCHAR U+211C +ENCODING 8476 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +EE +B3 +33 +33 +3E +3C +36 +36 +76 +E3 +00 +00 +ENDCHAR +STARTCHAR U+211D +ENCODING 8477 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +51 +51 +51 +51 +5E +58 +54 +52 +71 +00 +00 +ENDCHAR +STARTCHAR U+211E +ENCODING 8478 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +50 +4A +44 +4A +50 +00 +00 +ENDCHAR +STARTCHAR U+211F +ENCODING 8479 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +38 +08 +7C +4A +4A +4A +7C +68 +58 +48 +4C +4A +08 +00 +ENDCHAR +STARTCHAR U+2120 +ENCODING 8480 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +71 +9B +55 +31 +D1 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2121 +ENCODING 8481 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +FE +52 +5A +52 +5F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2122 +ENCODING 8482 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +F1 +5B +55 +51 +51 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2123 +ENCODING 8483 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +0C +85 +89 +4A +52 +54 +24 +28 +78 +50 +80 +00 +00 +ENDCHAR +STARTCHAR U+2124 +ENCODING 8484 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +0A +0A +12 +14 +24 +28 +48 +50 +7E +00 +00 +ENDCHAR +STARTCHAR U+2125 +ENCODING 8485 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +08 +10 +3E +04 +08 +18 +04 +02 +42 +3C +00 +ENDCHAR +STARTCHAR U+2126 +ENCODING 8486 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +41 +41 +41 +41 +41 +22 +14 +55 +77 +00 +00 +ENDCHAR +STARTCHAR U+2127 +ENCODING 8487 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +77 +55 +14 +22 +41 +41 +41 +41 +41 +3E +00 +00 +ENDCHAR +STARTCHAR U+2128 +ENCODING 8488 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +7E +06 +3C +26 +06 +06 +66 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+2129 +ENCODING 8489 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +70 +08 +08 +08 +08 +0E +08 +00 +00 +ENDCHAR +STARTCHAR U+212A +ENCODING 8490 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +44 +48 +50 +60 +60 +50 +48 +44 +00 +00 +ENDCHAR +STARTCHAR U+212B +ENCODING 8491 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +18 +24 +24 +18 +00 +3C +42 +42 +42 +7E +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+212C +ENCODING 8492 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +2E +51 +51 +51 +5E +51 +51 +51 +51 +2E +00 +00 +ENDCHAR +STARTCHAR U+212D +ENCODING 8493 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +06 +1E +3C +6C +66 +66 +6C +60 +60 +66 +3C +18 +00 +ENDCHAR +STARTCHAR U+212E +ENCODING 8494 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +66 +66 +7E +60 +60 +66 +3C +00 +00 +ENDCHAR +STARTCHAR U+212F +ENCODING 8495 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +24 +48 +70 +40 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+2130 +ENCODING 8496 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +12 +20 +20 +1C +20 +40 +44 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+2131 +ENCODING 8497 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +02 +04 +04 +08 +3E +10 +20 +20 +00 +00 +ENDCHAR +STARTCHAR U+2132 +ENCODING 8498 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +02 +02 +02 +3E +02 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+2133 +ENCODING 8499 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +63 +36 +2A +2A +2A +2A +2A +6A +AA +49 +00 +00 +ENDCHAR +STARTCHAR U+2134 +ENCODING 8500 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +24 +53 +4E +42 +42 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+2135 +ENCODING 8501 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +44 +46 +22 +14 +28 +64 +72 +62 +00 +00 +ENDCHAR +STARTCHAR U+2136 +ENCODING 8502 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +3E +02 +02 +02 +02 +02 +3F +7E +00 +00 +ENDCHAR +STARTCHAR U+2137 +ENCODING 8503 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +3C +1E +02 +02 +02 +0E +32 +32 +32 +00 +00 +ENDCHAR +STARTCHAR U+2138 +ENCODING 8504 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +3E +1F +02 +02 +02 +02 +03 +02 +00 +00 +ENDCHAR +STARTCHAR U+2153 +ENCODING 8531 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +62 +24 +28 +28 +1C +12 +24 +42 +4C +00 +00 +ENDCHAR +STARTCHAR U+2154 +ENCODING 8532 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +62 +12 +24 +48 +78 +1C +12 +24 +42 +4C +00 +00 +ENDCHAR +STARTCHAR U+2155 +ENCODING 8533 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +62 +24 +28 +28 +1E +18 +2C +42 +4C +00 +00 +ENDCHAR +STARTCHAR U+2156 +ENCODING 8534 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +62 +12 +24 +48 +78 +1E +18 +2C +42 +4C +00 +00 +ENDCHAR +STARTCHAR U+2157 +ENCODING 8535 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +62 +12 +24 +18 +68 +1E +18 +2C +42 +4C +00 +00 +ENDCHAR +STARTCHAR U+2158 +ENCODING 8536 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +62 +F4 +28 +28 +1E +18 +2C +42 +4C +00 +00 +ENDCHAR +STARTCHAR U+2159 +ENCODING 8537 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +62 +24 +28 +28 +16 +18 +2E +4A +4E +00 +00 +ENDCHAR +STARTCHAR U+215A +ENCODING 8538 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +72 +42 +64 +18 +68 +16 +18 +2E +4A +4E +00 +00 +ENDCHAR +STARTCHAR U+215B +ENCODING 8539 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +62 +24 +28 +28 +14 +1A +24 +4A +4E +00 +00 +ENDCHAR +STARTCHAR U+215C +ENCODING 8540 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +62 +12 +24 +18 +68 +14 +1A +24 +4A +4E +00 +00 +ENDCHAR +STARTCHAR U+215D +ENCODING 8541 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +72 +42 +64 +18 +68 +14 +1A +24 +4A +4E +00 +00 +ENDCHAR +STARTCHAR U+215E +ENCODING 8542 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +72 +12 +24 +48 +48 +14 +1A +24 +4A +4E +00 +00 +ENDCHAR +STARTCHAR U+215F +ENCODING 8543 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +62 +24 +28 +28 +10 +10 +20 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+2160 +ENCODING 8544 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +08 +08 +08 +08 +08 +08 +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+2161 +ENCODING 8545 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +24 +24 +24 +24 +24 +24 +24 +24 +7E +00 +00 +ENDCHAR +STARTCHAR U+2162 +ENCODING 8546 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +2A +2A +2A +2A +2A +2A +2A +2A +7F +00 +00 +ENDCHAR +STARTCHAR U+2163 +ENCODING 8547 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +29 +29 +29 +29 +29 +26 +26 +26 +7F +00 +00 +ENDCHAR +STARTCHAR U+2164 +ENCODING 8548 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +22 +22 +22 +14 +14 +14 +08 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+2165 +ENCODING 8549 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +FF +4A +4A +4A +4A +4A +32 +32 +32 +7F +00 +00 +ENDCHAR +STARTCHAR U+2166 +ENCODING 8550 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +FF +55 +55 +55 +55 +25 +25 +25 +25 +7F +00 +00 +ENDCHAR +STARTCHAR U+2167 +ENCODING 8551 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +FF +B5 +B5 +B5 +B5 +55 +55 +55 +55 +FF +00 +00 +ENDCHAR +STARTCHAR U+2168 +ENCODING 8552 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +2A +2A +2A +24 +24 +2A +2A +2A +7F +00 +00 +ENDCHAR +STARTCHAR U+2169 +ENCODING 8553 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +22 +22 +22 +1C +1C +22 +22 +22 +7F +00 +00 +ENDCHAR +STARTCHAR U+216A +ENCODING 8554 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +2A +2A +2A +12 +12 +2A +2A +2A +7F +00 +00 +ENDCHAR +STARTCHAR U+216B +ENCODING 8555 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +55 +55 +55 +25 +25 +55 +55 +55 +7F +00 +00 +ENDCHAR +STARTCHAR U+216C +ENCODING 8556 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +70 +20 +20 +20 +20 +20 +20 +20 +22 +7E +00 +00 +ENDCHAR +STARTCHAR U+216D +ENCODING 8557 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1A +26 +40 +40 +40 +40 +40 +40 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+216E +ENCODING 8558 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +24 +22 +22 +22 +22 +22 +22 +24 +78 +00 +00 +ENDCHAR +STARTCHAR U+216F +ENCODING 8559 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +63 +22 +36 +36 +36 +2A +2A +2A +2A +7F +00 +00 +ENDCHAR +STARTCHAR U+2170 +ENCODING 8560 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +00 +08 +18 +08 +08 +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+2171 +ENCODING 8561 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +24 +00 +24 +6C +24 +24 +24 +24 +7E +00 +00 +ENDCHAR +STARTCHAR U+2172 +ENCODING 8562 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +2A +2A +00 +2A +7E +2A +2A +2A +2A +7F +00 +00 +ENDCHAR +STARTCHAR U+2173 +ENCODING 8563 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +00 +3B +69 +29 +29 +26 +26 +7F +00 +00 +ENDCHAR +STARTCHAR U+2174 +ENCODING 8564 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +77 +22 +22 +22 +14 +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+2175 +ENCODING 8565 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +00 +5A +4E +4A +4A +32 +32 +7F +00 +00 +ENDCHAR +STARTCHAR U+2176 +ENCODING 8566 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +05 +05 +00 +55 +5F +55 +55 +25 +25 +7F +00 +00 +ENDCHAR +STARTCHAR U+2177 +ENCODING 8567 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +15 +15 +00 +B5 +BF +B5 +55 +55 +55 +FF +00 +00 +ENDCHAR +STARTCHAR U+2178 +ENCODING 8568 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +00 +2A +6A +24 +24 +2A +2A +7F +00 +00 +ENDCHAR +STARTCHAR U+2179 +ENCODING 8569 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +77 +22 +14 +08 +14 +22 +77 +00 +00 +ENDCHAR +STARTCHAR U+217A +ENCODING 8570 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +00 +2A +2E +12 +12 +2A +2A +7F +00 +00 +ENDCHAR +STARTCHAR U+217B +ENCODING 8571 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +05 +05 +00 +55 +5F +25 +25 +55 +55 +7F +00 +00 +ENDCHAR +STARTCHAR U+217C +ENCODING 8572 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +18 +08 +08 +08 +08 +08 +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+217D +ENCODING 8573 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1A +26 +40 +40 +40 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+217E +ENCODING 8574 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +06 +02 +1A +26 +42 +42 +42 +26 +1B +00 +00 +ENDCHAR +STARTCHAR U+217F +ENCODING 8575 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +74 +2A +2A +2A +2A +2A +2A +7F +00 +00 +ENDCHAR +STARTCHAR U+2180 +ENCODING 8576 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +2C +5A +4A +4A +4A +4A +4A +4A +5A +2C +00 +00 +ENDCHAR +STARTCHAR U+2181 +ENCODING 8577 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +78 +24 +32 +2A +2A +2A +2A +32 +24 +78 +00 +00 +ENDCHAR +STARTCHAR U+2182 +ENCODING 8578 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +2A +49 +5D +5D +5D +5D +49 +2A +1C +00 +00 +ENDCHAR +STARTCHAR U+2190 +ENCODING 8592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +20 +7E +20 +10 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2191 +ENCODING 8593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +1C +2A +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2192 +ENCODING 8594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +04 +7E +04 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2193 +ENCODING 8595 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +2A +1C +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2194 +ENCODING 8596 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +42 +FF +42 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2195 +ENCODING 8597 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +1C +2A +08 +08 +08 +2A +1C +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+2196 +ENCODING 8598 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +60 +50 +48 +04 +02 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2197 +ENCODING 8599 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1E +06 +0A +12 +20 +40 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2198 +ENCODING 8600 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +20 +12 +0A +06 +1E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2199 +ENCODING 8601 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +02 +04 +48 +50 +60 +78 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+219A +ENCODING 8602 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +14 +24 +7F +24 +14 +04 +04 +00 +00 +00 +ENDCHAR +STARTCHAR U+219B +ENCODING 8603 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +14 +12 +7F +12 +14 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR U+219C +ENCODING 8604 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +26 +79 +20 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+219D +ENCODING 8605 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +04 +32 +4F +02 +04 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+219E +ENCODING 8606 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +48 +FF +48 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+219F +ENCODING 8607 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +1C +2A +08 +1C +2A +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A0 +ENCODING 8608 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +12 +FF +12 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A1 +ENCODING 8609 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +2A +1C +08 +2A +1C +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A2 +ENCODING 8610 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +11 +22 +7C +22 +11 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A3 +ENCODING 8611 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +44 +22 +1F +22 +44 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A4 +ENCODING 8612 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +12 +22 +7E +22 +12 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A5 +ENCODING 8613 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +1C +2A +08 +08 +3E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A6 +ENCODING 8614 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +48 +44 +7E +44 +48 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A7 +ENCODING 8615 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3E +08 +08 +2A +1C +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21A8 +ENCODING 8616 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +1C +2A +08 +08 +08 +2A +1C +08 +3E +00 +00 +ENDCHAR +STARTCHAR U+21A9 +ENCODING 8617 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +11 +21 +7E +20 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21AA +ENCODING 8618 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +44 +42 +3F +02 +04 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21AB +ENCODING 8619 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +15 +25 +7E +24 +14 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21AC +ENCODING 8620 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +54 +52 +3F +12 +14 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21AD +ENCODING 8621 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +5A +E7 +42 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21AE +ENCODING 8622 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +2C +4A +FF +4A +2C +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+21AF +ENCODING 8623 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +48 +58 +68 +48 +08 +2A +1C +08 +00 +00 +ENDCHAR +STARTCHAR U+21B0 +ENCODING 8624 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +20 +78 +24 +14 +04 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+21B1 +ENCODING 8625 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +04 +1E +24 +28 +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR U+21B2 +ENCODING 8626 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +04 +04 +04 +14 +24 +78 +20 +10 +00 +00 +ENDCHAR +STARTCHAR U+21B3 +ENCODING 8627 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +20 +20 +20 +28 +24 +1E +04 +08 +00 +00 +ENDCHAR +STARTCHAR U+21B4 +ENCODING 8628 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7C +04 +15 +0E +04 +00 +00 +00 +ENDCHAR +STARTCHAR U+21B5 +ENCODING 8629 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +04 +14 +24 +7C +20 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21B6 +ENCODING 8630 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1E +21 +A9 +71 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21B7 +ENCODING 8631 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +78 +84 +95 +8E +04 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21B8 +ENCODING 8632 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7E +00 +78 +60 +50 +48 +04 +02 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21B9 +ENCODING 8633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +50 +60 +7E +60 +50 +00 +0A +06 +7E +06 +0A +00 +00 +ENDCHAR +STARTCHAR U+21BA +ENCODING 8634 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +2E +4C +4A +42 +42 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21BB +ENCODING 8635 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +74 +32 +52 +42 +42 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21BC +ENCODING 8636 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +20 +7E +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21BD +ENCODING 8637 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +20 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21BE +ENCODING 8638 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +0C +0A +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21BF +ENCODING 8639 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +18 +28 +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21C0 +ENCODING 8640 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +04 +7E +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21C1 +ENCODING 8641 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +04 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21C2 +ENCODING 8642 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +08 +08 +0A +0C +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21C3 +ENCODING 8643 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +28 +18 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21C4 +ENCODING 8644 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +04 +7E +04 +08 +00 +10 +20 +7E +20 +10 +00 +00 +ENDCHAR +STARTCHAR U+21C5 +ENCODING 8645 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +24 +74 +A4 +25 +2E +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21C6 +ENCODING 8646 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +20 +7E +20 +10 +00 +08 +04 +7E +04 +08 +00 +00 +ENDCHAR +STARTCHAR U+21C7 +ENCODING 8647 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +20 +7E +20 +10 +00 +10 +20 +7E +20 +10 +00 +00 +ENDCHAR +STARTCHAR U+21C8 +ENCODING 8648 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +24 +7E +A5 +24 +24 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21C9 +ENCODING 8649 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +04 +7E +04 +08 +00 +08 +04 +7E +04 +08 +00 +00 +ENDCHAR +STARTCHAR U+21CA +ENCODING 8650 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +24 +24 +24 +A5 +7E +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21CB +ENCODING 8651 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +20 +7E +00 +7E +04 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21CC +ENCODING 8652 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +04 +7E +00 +7E +20 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21CD +ENCODING 8653 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +28 +7E +88 +7E +28 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+21CE +ENCODING 8654 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +2C +7E +89 +7E +2C +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+21CF +ENCODING 8655 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +14 +7E +11 +7E +14 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D0 +ENCODING 8656 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +3E +40 +3E +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D1 +ENCODING 8657 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +14 +36 +14 +14 +14 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D2 +ENCODING 8658 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +7C +02 +7C +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D3 +ENCODING 8659 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +14 +14 +14 +36 +14 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D4 +ENCODING 8660 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +24 +7E +81 +7E +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D5 +ENCODING 8661 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +14 +36 +14 +14 +36 +14 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D6 +ENCODING 8662 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +78 +50 +68 +54 +0A +04 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D7 +ENCODING 8663 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1E +0A +16 +2A +50 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D8 +ENCODING 8664 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +04 +0A +54 +68 +50 +78 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21D9 +ENCODING 8665 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +50 +2A +16 +0A +1E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21DA +ENCODING 8666 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +3E +40 +FE +40 +3E +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21DB +ENCODING 8667 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +7C +02 +7F +02 +7C +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21DC +ENCODING 8668 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +20 +42 +F5 +48 +20 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21DD +ENCODING 8669 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +04 +42 +AF +12 +04 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21DE +ENCODING 8670 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +1C +2A +08 +08 +3E +08 +3E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+21DF +ENCODING 8671 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +3E +08 +3E +08 +08 +2A +1C +08 +00 +00 +ENDCHAR +STARTCHAR U+21E0 +ENCODING 8672 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +20 +77 +20 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21E1 +ENCODING 8673 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +1C +2A +00 +08 +08 +08 +00 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+21E2 +ENCODING 8674 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +04 +02 +77 +02 +04 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21E3 +ENCODING 8675 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +00 +08 +08 +08 +00 +2A +1C +08 +00 +00 +ENDCHAR +STARTCHAR U+21E4 +ENCODING 8676 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +50 +60 +7E +60 +50 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21E5 +ENCODING 8677 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0A +06 +7E +06 +0A +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21E6 +ENCODING 8678 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +30 +5F +81 +5F +30 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21E7 +ENCODING 8679 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +14 +22 +77 +14 +14 +14 +14 +14 +1C +00 +00 +ENDCHAR +STARTCHAR U+21E8 +ENCODING 8680 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +0C +FA +81 +FA +0C +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+21E9 +ENCODING 8681 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +14 +14 +14 +14 +14 +77 +22 +14 +08 +00 +00 +ENDCHAR +STARTCHAR U+21EA +ENCODING 8682 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +14 +22 +77 +14 +14 +14 +14 +1C +00 +1C +1C +00 +00 +ENDCHAR +STARTCHAR U+2200 +ENCODING 8704 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +3E +22 +22 +14 +14 +14 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2201 +ENCODING 8705 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +24 +24 +20 +20 +20 +20 +24 +24 +18 +00 +00 +ENDCHAR +STARTCHAR U+2202 +ENCODING 8706 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +02 +02 +1E +22 +42 +44 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+2203 +ENCODING 8707 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +02 +7E +02 +02 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+2204 +ENCODING 8708 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +7E +12 +12 +12 +7E +12 +12 +12 +12 +7E +10 +00 +ENDCHAR +STARTCHAR U+2205 +ENCODING 8709 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1D +22 +45 +49 +51 +22 +5C +00 +00 +ENDCHAR +STARTCHAR U+2206 +ENCODING 8710 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +14 +14 +14 +22 +22 +22 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2207 +ENCODING 8711 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +41 +22 +22 +22 +14 +14 +14 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2208 +ENCODING 8712 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3E +40 +40 +7E +40 +40 +3E +00 +00 +ENDCHAR +STARTCHAR U+2209 +ENCODING 8713 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +3E +48 +48 +7E +48 +48 +3E +08 +00 +ENDCHAR +STARTCHAR U+220A +ENCODING 8714 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +3E +40 +7E +40 +3E +00 +00 +ENDCHAR +STARTCHAR U+220B +ENCODING 8715 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7C +02 +02 +7E +02 +02 +7C +00 +00 +ENDCHAR +STARTCHAR U+220C +ENCODING 8716 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +10 +7C +12 +12 +7E +12 +12 +7C +10 +00 +ENDCHAR +STARTCHAR U+220D +ENCODING 8717 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +7C +02 +7E +02 +7C +00 +00 +ENDCHAR +STARTCHAR U+220E +ENCODING 8718 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +7E +7E +7E +7E +7E +7E +7E +7E +7E +00 +00 +ENDCHAR +STARTCHAR U+220F +ENCODING 8719 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +22 +22 +22 +22 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+2210 +ENCODING 8720 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +22 +22 +22 +22 +22 +22 +22 +22 +7F +00 +00 +ENDCHAR +STARTCHAR U+2211 +ENCODING 8721 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +42 +20 +10 +08 +08 +10 +20 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+2212 +ENCODING 8722 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2213 +ENCODING 8723 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +00 +08 +08 +08 +7F +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+2214 +ENCODING 8724 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +1C +08 +00 +08 +08 +08 +7F +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+2215 +ENCODING 8725 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +04 +04 +08 +08 +10 +10 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR U+2216 +ENCODING 8726 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +20 +20 +10 +10 +08 +08 +04 +04 +02 +00 +00 +ENDCHAR +STARTCHAR U+2217 +ENCODING 8727 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +2A +1C +08 +1C +2A +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+2218 +ENCODING 8728 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +24 +24 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2219 +ENCODING 8729 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +3C +3C +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+221A +ENCODING 8730 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +07 +04 +04 +04 +04 +04 +74 +14 +14 +0C +0C +04 +04 +00 +ENDCHAR +STARTCHAR U+221B +ENCODING 8731 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +67 +14 +64 +14 +64 +04 +74 +14 +14 +0C +0C +04 +04 +00 +ENDCHAR +STARTCHAR U+221C +ENCODING 8732 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +57 +54 +74 +14 +14 +04 +74 +14 +14 +0C +0C +04 +04 +00 +ENDCHAR +STARTCHAR U+221D +ENCODING 8733 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +36 +48 +48 +36 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+221E +ENCODING 8734 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +36 +49 +49 +36 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+221F +ENCODING 8735 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +40 +40 +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+2220 +ENCODING 8736 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +02 +04 +08 +10 +20 +7E +00 +00 +ENDCHAR +STARTCHAR U+2221 +ENCODING 8737 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +02 +14 +08 +14 +24 +7E +00 +00 +ENDCHAR +STARTCHAR U+2222 +ENCODING 8738 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0A +0C +14 +64 +14 +0C +0A +00 +00 +ENDCHAR +STARTCHAR U+2223 +ENCODING 8739 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+2224 +ENCODING 8740 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +1A +1C +18 +18 +38 +58 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+2225 +ENCODING 8741 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +24 +24 +24 +24 +24 +24 +24 +24 +24 +00 +00 +ENDCHAR +STARTCHAR U+2226 +ENCODING 8742 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +24 +26 +24 +2C +34 +24 +64 +24 +24 +00 +00 +ENDCHAR +STARTCHAR U+2227 +ENCODING 8743 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +08 +14 +14 +22 +22 +41 +41 +00 +00 +ENDCHAR +STARTCHAR U+2228 +ENCODING 8744 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +41 +41 +22 +22 +14 +14 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2229 +ENCODING 8745 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+222A +ENCODING 8746 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+222B +ENCODING 8747 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +0A +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +28 +30 +00 +ENDCHAR +STARTCHAR U+222C +ENCODING 8748 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0A +15 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +54 +68 +00 +ENDCHAR +STARTCHAR U+222D +ENCODING 8749 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +15 +2A +2A +2A +2A +2A +2A +2A +2A +2A +2A +2A +AA +D4 +00 +ENDCHAR +STARTCHAR U+222E +ENCODING 8750 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +0A +08 +08 +08 +1C +2A +2A +1C +08 +08 +08 +28 +30 +00 +ENDCHAR +STARTCHAR U+222F +ENCODING 8751 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0A +15 +14 +14 +14 +3E +55 +55 +3E +14 +14 +14 +54 +68 +00 +ENDCHAR +STARTCHAR U+2230 +ENCODING 8752 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +15 +2A +2A +2A +7E +AB +AB +AB +7E +2A +2A +2A +AA +D4 +00 +ENDCHAR +STARTCHAR U+2231 +ENCODING 8753 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +0A +08 +08 +08 +1D +2B +2F +08 +08 +08 +08 +28 +30 +00 +ENDCHAR +STARTCHAR U+2232 +ENCODING 8754 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +0A +08 +08 +1D +2B +2F +2A +1C +08 +08 +08 +28 +30 +00 +ENDCHAR +STARTCHAR U+2233 +ENCODING 8755 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +0A +08 +08 +08 +5C +6A +7A +2A +1C +08 +08 +28 +30 +00 +ENDCHAR +STARTCHAR U+2234 +ENCODING 8756 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +66 +66 +00 +00 +00 +ENDCHAR +STARTCHAR U+2235 +ENCODING 8757 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+2236 +ENCODING 8758 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+2237 +ENCODING 8759 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +66 +66 +00 +00 +00 +66 +66 +00 +00 +00 +ENDCHAR +STARTCHAR U+2238 +ENCODING 8760 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +18 +00 +7E +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2239 +ENCODING 8761 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +06 +06 +00 +78 +00 +06 +06 +00 +00 +00 +ENDCHAR +STARTCHAR U+223A +ENCODING 8762 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +66 +66 +00 +7E +00 +66 +66 +00 +00 +00 +ENDCHAR +STARTCHAR U+223B +ENCODING 8763 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +18 +00 +32 +4C +00 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+223C +ENCODING 8764 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +32 +4C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+223D +ENCODING 8765 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +4C +32 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+223E +ENCODING 8766 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +32 +49 +26 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+223F +ENCODING 8767 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +30 +48 +49 +09 +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2240 +ENCODING 8768 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +08 +08 +08 +10 +10 +10 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+2241 +ENCODING 8769 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +3A +4C +08 +08 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2242 +ENCODING 8770 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +00 +00 +32 +4C +00 +00 +00 +ENDCHAR +STARTCHAR U+2243 +ENCODING 8771 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +32 +4C +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2244 +ENCODING 8772 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +3A +4C +08 +08 +7E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2245 +ENCODING 8773 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +32 +4C +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2246 +ENCODING 8774 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +32 +4C +08 +7E +08 +08 +7E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2247 +ENCODING 8775 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +3A +4C +08 +7E +08 +08 +7E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2248 +ENCODING 8776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +32 +4C +00 +32 +4C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2249 +ENCODING 8777 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +3A +4C +08 +3A +4C +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+224A +ENCODING 8778 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +32 +4C +00 +32 +4C +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+224B +ENCODING 8779 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +32 +4C +00 +32 +4C +00 +32 +4C +00 +00 +00 +ENDCHAR +STARTCHAR U+224C +ENCODING 8780 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +32 +49 +26 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+224D +ENCODING 8781 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +3C +00 +00 +3C +42 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+224E +ENCODING 8782 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +66 +00 +00 +66 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+224F +ENCODING 8783 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +66 +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2250 +ENCODING 8784 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2251 +ENCODING 8785 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +18 +00 +7E +00 +00 +7E +00 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+2252 +ENCODING 8786 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +60 +60 +00 +7E +00 +00 +7E +00 +06 +06 +00 +00 +00 +ENDCHAR +STARTCHAR U+2253 +ENCODING 8787 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +06 +06 +00 +7E +00 +00 +7E +00 +60 +60 +00 +00 +00 +ENDCHAR +STARTCHAR U+2254 +ENCODING 8788 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +5E +00 +00 +5E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2255 +ENCODING 8789 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7A +00 +00 +7A +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2256 +ENCODING 8790 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7E +24 +24 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2257 +ENCODING 8791 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +24 +24 +18 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2258 +ENCODING 8792 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2259 +ENCODING 8793 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +24 +42 +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+225A +ENCODING 8794 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +42 +24 +18 +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+225B +ENCODING 8795 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +3E +1C +14 +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+225C +ENCODING 8796 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +14 +22 +3E +00 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+225D +ENCODING 8797 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +12 +14 +76 +54 +74 +00 +00 +7E +00 +00 +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+225E +ENCODING 8798 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +68 +54 +54 +54 +00 +7E +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+225F +ENCODING 8799 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +30 +48 +08 +10 +10 +00 +10 +00 +7E +00 +00 +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+2260 +ENCODING 8800 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +08 +7E +08 +08 +7E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2261 +ENCODING 8801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7E +00 +7E +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2262 +ENCODING 8802 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +7E +08 +7E +08 +7E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2263 +ENCODING 8803 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +00 +7E +00 +7E +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2264 +ENCODING 8804 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +06 +18 +60 +18 +06 +00 +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+2265 +ENCODING 8805 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +18 +06 +18 +60 +00 +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+2266 +ENCODING 8806 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +06 +18 +60 +18 +06 +00 +7E +00 +00 +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+2267 +ENCODING 8807 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +60 +18 +06 +18 +60 +00 +7E +00 +00 +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+2268 +ENCODING 8808 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +06 +18 +60 +18 +16 +10 +7E +10 +10 +7E +10 +10 +00 +ENDCHAR +STARTCHAR U+2269 +ENCODING 8809 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +60 +18 +06 +18 +68 +08 +7E +08 +08 +7E +08 +08 +00 +ENDCHAR +STARTCHAR U+226A +ENCODING 8810 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +09 +12 +24 +48 +90 +48 +24 +12 +09 +00 +00 +ENDCHAR +STARTCHAR U+226B +ENCODING 8811 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +90 +48 +24 +12 +09 +12 +24 +48 +90 +00 +00 +ENDCHAR +STARTCHAR U+226C +ENCODING 8812 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +18 +18 +24 +24 +24 +24 +18 +18 +24 +00 +00 +ENDCHAR +STARTCHAR U+226D +ENCODING 8813 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +4A +3C +08 +08 +3C +4A +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+226E +ENCODING 8814 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +0A +0C +08 +18 +28 +18 +08 +0C +0A +08 +00 +ENDCHAR +STARTCHAR U+226F +ENCODING 8815 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +50 +30 +10 +18 +14 +18 +10 +30 +50 +10 +00 +ENDCHAR +STARTCHAR U+2270 +ENCODING 8816 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +0E +18 +68 +18 +0E +08 +7E +08 +08 +00 +ENDCHAR +STARTCHAR U+2271 +ENCODING 8817 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +70 +18 +16 +18 +70 +10 +7E +10 +10 +00 +ENDCHAR +STARTCHAR U+2272 +ENCODING 8818 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +06 +18 +60 +18 +06 +00 +32 +4C +00 +00 +ENDCHAR +STARTCHAR U+2273 +ENCODING 8819 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +18 +06 +18 +60 +00 +32 +4C +00 +00 +ENDCHAR +STARTCHAR U+2274 +ENCODING 8820 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +0E +18 +68 +18 +0E +08 +3A +4C +08 +00 +ENDCHAR +STARTCHAR U+2275 +ENCODING 8821 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +70 +18 +16 +18 +70 +10 +32 +5C +10 +00 +ENDCHAR +STARTCHAR U+2276 +ENCODING 8822 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +06 +18 +60 +18 +06 +60 +18 +06 +18 +60 +00 +00 +ENDCHAR +STARTCHAR U+2277 +ENCODING 8823 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +60 +18 +06 +18 +60 +06 +18 +60 +18 +06 +00 +00 +ENDCHAR +STARTCHAR U+2278 +ENCODING 8824 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +0E +18 +68 +18 +0E +68 +18 +0E +18 +68 +08 +00 +ENDCHAR +STARTCHAR U+2279 +ENCODING 8825 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +68 +18 +0E +18 +68 +0E +18 +68 +18 +0E +08 +00 +ENDCHAR +STARTCHAR U+227A +ENCODING 8826 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +04 +18 +60 +18 +04 +02 +02 +00 +00 +00 +ENDCHAR +STARTCHAR U+227B +ENCODING 8827 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +20 +18 +06 +18 +20 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR U+227C +ENCODING 8828 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +04 +18 +60 +18 +04 +02 +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+227D +ENCODING 8829 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +20 +18 +06 +18 +20 +40 +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+227E +ENCODING 8830 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +04 +18 +60 +18 +04 +02 +32 +4C +00 +00 +ENDCHAR +STARTCHAR U+227F +ENCODING 8831 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +40 +20 +18 +06 +18 +20 +40 +32 +4C +00 +00 +ENDCHAR +STARTCHAR U+2280 +ENCODING 8832 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +12 +14 +18 +70 +18 +14 +12 +02 +00 +00 +00 +ENDCHAR +STARTCHAR U+2281 +ENCODING 8833 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +48 +28 +18 +0E +18 +28 +48 +40 +00 +00 +00 +ENDCHAR +STARTCHAR U+2282 +ENCODING 8834 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +40 +40 +40 +40 +3E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2283 +ENCODING 8835 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +02 +02 +02 +02 +7C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2284 +ENCODING 8836 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +3E +48 +48 +48 +48 +3E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2285 +ENCODING 8837 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +12 +12 +12 +12 +7C +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+2286 +ENCODING 8838 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +40 +40 +40 +40 +3E +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+2287 +ENCODING 8839 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +02 +02 +02 +02 +7C +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+2288 +ENCODING 8840 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +3E +48 +48 +48 +48 +3E +08 +7E +08 +00 +ENDCHAR +STARTCHAR U+2289 +ENCODING 8841 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +10 +7C +12 +12 +12 +12 +7C +10 +7E +10 +00 +ENDCHAR +STARTCHAR U+228A +ENCODING 8842 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +40 +40 +40 +40 +3E +08 +7E +08 +00 +ENDCHAR +STARTCHAR U+228B +ENCODING 8843 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +02 +02 +02 +02 +7C +10 +7E +10 +00 +ENDCHAR +STARTCHAR U+228C +ENCODING 8844 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +4A +52 +7E +52 +4A +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+228D +ENCODING 8845 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +5A +5A +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+228E +ENCODING 8846 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +52 +52 +7A +52 +52 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+228F +ENCODING 8847 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +40 +40 +40 +40 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2290 +ENCODING 8848 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +02 +02 +02 +02 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2291 +ENCODING 8849 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +40 +40 +40 +40 +7E +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+2292 +ENCODING 8850 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +02 +02 +02 +02 +7E +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+2293 +ENCODING 8851 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +42 +42 +42 +42 +42 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2294 +ENCODING 8852 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +42 +42 +42 +42 +42 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2295 +ENCODING 8853 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +2A +49 +7F +49 +2A +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+2296 +ENCODING 8854 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +41 +7F +41 +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+2297 +ENCODING 8855 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +55 +49 +55 +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+2298 +ENCODING 8856 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +45 +49 +51 +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+2299 +ENCODING 8857 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +41 +49 +41 +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+229A +ENCODING 8858 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +49 +55 +49 +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+229B +ENCODING 8859 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +49 +5D +49 +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+229C +ENCODING 8860 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +5D +41 +5D +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+229D +ENCODING 8861 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +41 +5D +41 +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+229E +ENCODING 8862 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +49 +49 +7F +49 +49 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+229F +ENCODING 8863 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +41 +41 +7F +41 +41 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+22A0 +ENCODING 8864 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +63 +55 +49 +55 +63 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+22A1 +ENCODING 8865 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +41 +41 +49 +41 +41 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+22A2 +ENCODING 8866 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +40 +40 +40 +7E +40 +40 +40 +00 +00 +00 +ENDCHAR +STARTCHAR U+22A3 +ENCODING 8867 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +02 +02 +02 +7E +02 +02 +02 +00 +00 +00 +ENDCHAR +STARTCHAR U+22A4 +ENCODING 8868 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+22A5 +ENCODING 8869 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+22A6 +ENCODING 8870 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +20 +3C +20 +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR U+22A7 +ENCODING 8871 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +3C +20 +3C +20 +20 +20 +20 +00 +00 +ENDCHAR +STARTCHAR U+22A8 +ENCODING 8872 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +40 +40 +7E +40 +7E +40 +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+22A9 +ENCODING 8873 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +50 +50 +50 +50 +50 +5E +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR U+22AA +ENCODING 8874 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +54 +54 +54 +54 +54 +57 +54 +54 +54 +54 +54 +00 +00 +ENDCHAR +STARTCHAR U+22AB +ENCODING 8875 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +50 +50 +50 +50 +5E +50 +5E +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR U+22AC +ENCODING 8876 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +48 +48 +48 +7E +48 +48 +48 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+22AD +ENCODING 8877 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +48 +48 +48 +7E +48 +7E +48 +48 +48 +40 +00 +00 +ENDCHAR +STARTCHAR U+22AE +ENCODING 8878 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +50 +50 +54 +54 +54 +5E +54 +54 +54 +50 +50 +00 +00 +ENDCHAR +STARTCHAR U+22AF +ENCODING 8879 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +50 +54 +54 +54 +5E +54 +5E +54 +54 +54 +50 +00 +00 +ENDCHAR +STARTCHAR U+22B0 +ENCODING 8880 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +02 +04 +18 +60 +18 +04 +02 +0C +00 +00 +00 +ENDCHAR +STARTCHAR U+22B1 +ENCODING 8881 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +30 +40 +20 +18 +06 +18 +20 +40 +30 +00 +00 +00 +ENDCHAR +STARTCHAR U+22B2 +ENCODING 8882 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +06 +1A +62 +1A +06 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22B3 +ENCODING 8883 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +60 +58 +46 +58 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22B4 +ENCODING 8884 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +06 +1A +62 +1A +06 +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+22B5 +ENCODING 8885 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +60 +58 +46 +58 +60 +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+22B6 +ENCODING 8886 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +22 +5F +22 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22B7 +ENCODING 8887 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +22 +7D +22 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22B8 +ENCODING 8888 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +02 +7D +02 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22B9 +ENCODING 8889 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +00 +63 +00 +08 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22BA +ENCODING 8890 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+22BB +ENCODING 8891 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +22 +22 +14 +14 +08 +00 +3E +00 +00 +ENDCHAR +STARTCHAR U+22BC +ENCODING 8892 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3E +00 +08 +14 +14 +22 +22 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22BD +ENCODING 8893 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3E +00 +22 +22 +14 +14 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22BE +ENCODING 8894 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +40 +40 +40 +78 +48 +48 +7E +00 +00 +ENDCHAR +STARTCHAR U+22BF +ENCODING 8895 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +02 +06 +0A +12 +22 +7E +00 +00 +ENDCHAR +STARTCHAR U+22C0 +ENCODING 8896 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +14 +14 +14 +22 +22 +22 +41 +41 +41 +00 +00 +ENDCHAR +STARTCHAR U+22C1 +ENCODING 8897 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +41 +41 +22 +22 +22 +14 +14 +14 +08 +00 +00 +ENDCHAR +STARTCHAR U+22C2 +ENCODING 8898 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+22C3 +ENCODING 8899 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+22C4 +ENCODING 8900 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +14 +22 +14 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22C5 +ENCODING 8901 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22C6 +ENCODING 8902 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +3E +1C +14 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22C7 +ENCODING 8903 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +22 +14 +3E +14 +22 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22C8 +ENCODING 8904 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +22 +36 +2A +36 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+22C9 +ENCODING 8905 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +22 +34 +28 +34 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+22CA +ENCODING 8906 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +22 +16 +0A +16 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+22CB +ENCODING 8907 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +20 +10 +08 +14 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+22CC +ENCODING 8908 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +02 +04 +08 +14 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+22CD +ENCODING 8909 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +4C +32 +00 +00 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22CE +ENCODING 8910 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +41 +22 +22 +14 +14 +14 +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+22CF +ENCODING 8911 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +14 +14 +14 +22 +22 +41 +00 +00 +00 +ENDCHAR +STARTCHAR U+22D0 +ENCODING 8912 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +40 +5E +50 +50 +5E +40 +3E +00 +00 +ENDCHAR +STARTCHAR U+22D1 +ENCODING 8913 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7C +02 +7A +0A +0A +7A +02 +7C +00 +00 +ENDCHAR +STARTCHAR U+22D2 +ENCODING 8914 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3E +41 +5D +55 +55 +55 +00 +00 +00 +ENDCHAR +STARTCHAR U+22D3 +ENCODING 8915 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +55 +55 +55 +5D +41 +3E +00 +00 +00 +ENDCHAR +STARTCHAR U+22D4 +ENCODING 8916 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +1C +2A +2A +2A +2A +2A +2A +00 +00 +ENDCHAR +STARTCHAR U+22D5 +ENCODING 8917 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +24 +24 +24 +7E +24 +24 +7E +24 +24 +00 +00 +ENDCHAR +STARTCHAR U+22D6 +ENCODING 8918 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +04 +08 +10 +22 +10 +08 +04 +02 +00 +00 +ENDCHAR +STARTCHAR U+22D7 +ENCODING 8919 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +40 +20 +10 +08 +44 +08 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR U+22D8 +ENCODING 8920 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +15 +2A +54 +2A +15 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22D9 +ENCODING 8921 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +54 +2A +15 +2A +54 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22DA +ENCODING 8922 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +18 +60 +18 +06 +00 +7E +00 +60 +18 +06 +18 +60 +00 +00 +ENDCHAR +STARTCHAR U+22DB +ENCODING 8923 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +60 +18 +06 +18 +60 +00 +7E +00 +06 +18 +60 +18 +06 +00 +00 +ENDCHAR +STARTCHAR U+22DC +ENCODING 8924 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +00 +06 +18 +60 +18 +06 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22DD +ENCODING 8925 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +00 +60 +18 +06 +18 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22DE +ENCODING 8926 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +02 +02 +04 +18 +60 +18 +04 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+22DF +ENCODING 8927 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +40 +40 +20 +18 +06 +18 +20 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+22E0 +ENCODING 8928 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +0A +0A +0C +18 +68 +18 +0C +0A +0A +7E +08 +00 +ENDCHAR +STARTCHAR U+22E1 +ENCODING 8929 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +48 +48 +28 +18 +0E +18 +28 +48 +48 +7E +08 +00 +ENDCHAR +STARTCHAR U+22E2 +ENCODING 8930 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +08 +7E +48 +48 +48 +48 +7E +08 +7E +08 +00 +ENDCHAR +STARTCHAR U+22E3 +ENCODING 8931 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +08 +7E +0A +0A +0A +0A +7E +08 +7E +08 +00 +ENDCHAR +STARTCHAR U+22E4 +ENCODING 8932 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +40 +40 +40 +40 +7E +08 +7E +08 +00 +ENDCHAR +STARTCHAR U+22E5 +ENCODING 8933 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +02 +02 +02 +02 +7E +08 +7E +08 +00 +ENDCHAR +STARTCHAR U+22E6 +ENCODING 8934 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +06 +18 +60 +18 +06 +08 +3A +4C +08 +08 +00 +ENDCHAR +STARTCHAR U+22E7 +ENCODING 8935 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +18 +06 +18 +60 +08 +3A +4C +08 +08 +00 +ENDCHAR +STARTCHAR U+22E8 +ENCODING 8936 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +04 +18 +60 +18 +04 +0A +3A +4C +08 +08 +00 +ENDCHAR +STARTCHAR U+22E9 +ENCODING 8937 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +40 +40 +20 +18 +06 +18 +20 +40 +48 +3A +4C +08 +08 +00 +ENDCHAR +STARTCHAR U+22EA +ENCODING 8938 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +0E +1A +6A +1A +0E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+22EB +ENCODING 8939 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +68 +58 +4E +58 +68 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+22EC +ENCODING 8940 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +0E +1A +6A +1A +0E +08 +7E +08 +00 +ENDCHAR +STARTCHAR U+22ED +ENCODING 8941 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +68 +58 +4E +58 +68 +08 +7E +08 +00 +ENDCHAR +STARTCHAR U+22EE +ENCODING 8942 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +00 +18 +18 +00 +00 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+22EF +ENCODING 8943 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +DB +DB +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+22F0 +ENCODING 8944 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +03 +03 +00 +00 +18 +18 +00 +00 +C0 +C0 +00 +00 +ENDCHAR +STARTCHAR U+22F1 +ENCODING 8945 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +C0 +C0 +00 +00 +18 +18 +00 +00 +03 +03 +00 +00 +ENDCHAR +STARTCHAR U+2300 +ENCODING 8960 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1D +22 +45 +49 +51 +22 +5C +00 +00 +00 +ENDCHAR +STARTCHAR U+2302 +ENCODING 8962 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +24 +42 +42 +42 +42 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+2303 +ENCODING 8963 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +14 +22 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2304 +ENCODING 8964 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +22 +14 +08 +00 +00 +ENDCHAR +STARTCHAR U+2305 +ENCODING 8965 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +00 +08 +14 +22 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2306 +ENCODING 8966 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +00 +3E +00 +08 +14 +22 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2307 +ENCODING 8967 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +08 +04 +08 +10 +08 +04 +08 +10 +08 +04 +00 +00 +ENDCHAR +STARTCHAR U+2308 +ENCODING 8968 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1E +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +00 +ENDCHAR +STARTCHAR U+2309 +ENCODING 8969 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +78 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+230A +ENCODING 8970 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +1E +00 +00 +ENDCHAR +STARTCHAR U+230B +ENCODING 8971 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +78 +00 +00 +ENDCHAR +STARTCHAR U+230C +ENCODING 8972 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +07 +08 +08 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+230D +ENCODING 8973 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +70 +08 +08 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+230E +ENCODING 8974 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +07 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+230F +ENCODING 8975 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +70 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2310 +ENCODING 8976 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +7E +40 +40 +40 +00 +00 +ENDCHAR +STARTCHAR U+2311 +ENCODING 8977 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +41 +3E +22 +22 +22 +3E +41 +00 +00 +00 +ENDCHAR +STARTCHAR U+2312 +ENCODING 8978 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +1C +22 +41 +41 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2313 +ENCODING 8979 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +1C +22 +41 +7F +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2314 +ENCODING 8980 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +1C +22 +41 +22 +14 +08 +00 +00 +ENDCHAR +STARTCHAR U+2315 +ENCODING 8981 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1C +22 +41 +41 +51 +22 +5C +00 +00 +ENDCHAR +STARTCHAR U+2316 +ENCODING 8982 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +08 +1C +2A +7F +2A +1C +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2317 +ENCODING 8983 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +24 +FF +24 +24 +FF +24 +24 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2318 +ENCODING 8984 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +22 +55 +3E +14 +3E +55 +22 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2319 +ENCODING 8985 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +40 +40 +40 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+231A +ENCODING 8986 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +28 +28 +28 +28 +38 +54 +92 +9B +82 +44 +38 +28 +28 +28 +00 +ENDCHAR +STARTCHAR U+231B +ENCODING 8987 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +24 +24 +24 +18 +18 +24 +24 +3C +7E +00 +00 +ENDCHAR +STARTCHAR U+231C +ENCODING 8988 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +78 +40 +40 +40 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+231D +ENCODING 8989 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +1E +02 +02 +02 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+231E +ENCODING 8990 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +40 +40 +40 +78 +00 +ENDCHAR +STARTCHAR U+231F +ENCODING 8991 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +02 +02 +02 +1E +00 +ENDCHAR +STARTCHAR U+2320 +ENCODING 8992 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +06 +0A +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2321 +ENCODING 8993 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +28 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2322 +ENCODING 8994 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +3C +42 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2323 +ENCODING 8995 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +42 +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2324 +ENCODING 8996 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +77 +08 +14 +22 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2325 +ENCODING 8997 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +67 +10 +08 +07 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2326 +ENCODING 8998 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +AA +91 +AA +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2327 +ENCODING 8999 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +55 +49 +55 +7F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2328 +ENCODING 9000 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +7E +7E +00 +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2329 +ENCODING 9001 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +08 +10 +10 +20 +20 +40 +20 +20 +10 +10 +08 +08 +00 +ENDCHAR +STARTCHAR U+232A +ENCODING 9002 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +10 +08 +08 +04 +04 +02 +04 +04 +08 +08 +10 +10 +00 +ENDCHAR +STARTCHAR U+232B +ENCODING 9003 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3F +55 +89 +55 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+232C +ENCODING 9004 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +1C +26 +63 +61 +61 +63 +26 +1C +08 +00 +00 +00 +ENDCHAR +STARTCHAR U+232D +ENCODING 9005 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +18 +25 +66 +9C +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+232E +ENCODING 9006 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +24 +2F +38 +60 +60 +00 +00 +ENDCHAR +STARTCHAR U+232F +ENCODING 9007 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +00 +7E +00 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2330 +ENCODING 9008 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +09 +1B +12 +12 +24 +24 +24 +48 +48 +78 +00 +00 +ENDCHAR +STARTCHAR U+2331 +ENCODING 9009 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +20 +70 +AA +BF +AA +70 +20 +20 +00 +00 +ENDCHAR +STARTCHAR U+2332 +ENCODING 9010 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +58 +46 +7F +46 +58 +60 +00 +00 +00 +ENDCHAR +STARTCHAR U+2333 +ENCODING 9011 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +60 +58 +46 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+2334 +ENCODING 9012 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +42 +42 +42 +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+2335 +ENCODING 9013 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +42 +24 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+2336 +ENCODING 9014 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +7F +00 +00 +ENDCHAR +STARTCHAR U+2337 +ENCODING 9015 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +22 +22 +22 +22 +22 +22 +22 +22 +3E +00 +00 +ENDCHAR +STARTCHAR U+2338 +ENCODING 9016 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +41 +41 +7F +41 +41 +7F +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2339 +ENCODING 9017 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +49 +49 +41 +7F +41 +49 +49 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+233A +ENCODING 9018 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +49 +55 +63 +41 +63 +55 +49 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+233B +ENCODING 9019 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +41 +41 +5D +55 +5D +41 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+233C +ENCODING 9020 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +41 +5D +63 +41 +41 +63 +5D +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+233D +ENCODING 9021 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +1C +2A +49 +49 +49 +2A +1C +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+233E +ENCODING 9022 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +5D +55 +5D +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+233F +ENCODING 9023 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +04 +04 +08 +08 +FF +10 +20 +20 +40 +00 +00 +ENDCHAR +STARTCHAR U+2340 +ENCODING 9024 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +20 +20 +10 +10 +FF +08 +04 +04 +02 +00 +00 +ENDCHAR +STARTCHAR U+2341 +ENCODING 9025 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +43 +45 +45 +49 +51 +51 +61 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2342 +ENCODING 9026 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +61 +51 +51 +49 +45 +45 +43 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2343 +ENCODING 9027 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +41 +47 +59 +61 +59 +47 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2344 +ENCODING 9028 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +41 +71 +4D +43 +4D +71 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2345 +ENCODING 9029 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +08 +08 +28 +7F +28 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2346 +ENCODING 9030 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +08 +08 +0A +7F +0A +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2347 +ENCODING 9031 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +41 +49 +51 +7F +51 +49 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2348 +ENCODING 9032 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7F +41 +41 +49 +45 +7F +45 +49 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2349 +ENCODING 9033 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +5C +22 +51 +49 +45 +22 +1D +00 +00 +ENDCHAR +STARTCHAR U+234A +ENCODING 9034 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +7F +00 +7F +00 +00 +ENDCHAR +STARTCHAR U+234B +ENCODING 9035 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +1C +1C +2A +2A +3E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+234C +ENCODING 9036 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +41 +41 +41 +63 +63 +55 +55 +49 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+234D +ENCODING 9037 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +41 +49 +49 +55 +55 +63 +63 +7F +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+234E +ENCODING 9038 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +1C +2A +2A +1C +08 +08 +7F +00 +00 +ENDCHAR +STARTCHAR U+234F +ENCODING 9039 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +1C +2A +08 +7F +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2350 +ENCODING 9040 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +49 +5D +6B +49 +49 +49 +49 +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+2351 +ENCODING 9041 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +00 +3E +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2352 +ENCODING 9042 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +3E +2A +2A +1C +1C +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2353 +ENCODING 9043 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +49 +55 +55 +63 +63 +41 +41 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2354 +ENCODING 9044 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +41 +7F +63 +63 +55 +55 +49 +49 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2355 +ENCODING 9045 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7F +08 +08 +1C +2A +2A +1C +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2356 +ENCODING 9046 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +08 +08 +08 +08 +7F +08 +2A +1C +08 +00 +00 +ENDCHAR +STARTCHAR U+2357 +ENCODING 9047 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +49 +49 +49 +49 +49 +49 +49 +6B +5D +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+2358 +ENCODING 9048 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +00 +00 +00 +00 +00 +00 +3E +00 +00 +ENDCHAR +STARTCHAR U+2359 +ENCODING 9049 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +14 +14 +22 +22 +3E +00 +3E +00 +00 +ENDCHAR +STARTCHAR U+235A +ENCODING 9050 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +14 +22 +41 +22 +14 +08 +00 +3E +00 +00 +ENDCHAR +STARTCHAR U+235B +ENCODING 9051 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1C +22 +22 +22 +1C +00 +3E +00 +00 +ENDCHAR +STARTCHAR U+235C +ENCODING 9052 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +41 +41 +41 +22 +1C +00 +7F +00 +00 +ENDCHAR +STARTCHAR U+235D +ENCODING 9053 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +49 +55 +49 +41 +41 +41 +41 +41 +00 +00 +ENDCHAR +STARTCHAR U+235E +ENCODING 9054 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +49 +49 +49 +41 +41 +41 +41 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+235F +ENCODING 9055 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +49 +7F +5D +55 +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2360 +ENCODING 9056 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +41 +49 +49 +41 +41 +49 +49 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2361 +ENCODING 9057 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +00 +7F +08 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2362 +ENCODING 9058 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +00 +00 +3E +22 +22 +14 +14 +08 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2363 +ENCODING 9059 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +00 +00 +08 +3E +1C +14 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2364 +ENCODING 9060 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +00 +00 +00 +00 +1C +22 +22 +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2365 +ENCODING 9061 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +00 +00 +00 +00 +1C +22 +41 +41 +41 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+2366 +ENCODING 9062 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +49 +49 +49 +49 +49 +49 +49 +2A +1C +08 +00 +00 +ENDCHAR +STARTCHAR U+2367 +ENCODING 9063 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +1F +28 +48 +48 +48 +28 +1F +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2368 +ENCODING 9064 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +00 +00 +00 +00 +32 +4C +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2369 +ENCODING 9065 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +00 +40 +20 +10 +08 +04 +02 +04 +08 +10 +20 +40 +00 +ENDCHAR +STARTCHAR U+236A +ENCODING 9066 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +00 +00 +18 +08 +08 +10 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+236B +ENCODING 9067 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3E +22 +22 +14 +14 +39 +4E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+236C +ENCODING 9068 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +22 +22 +22 +33 +6E +22 +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+236D +ENCODING 9069 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +3A +4C +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+236E +ENCODING 9070 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +18 +00 +00 +18 +08 +08 +10 +00 +3E +00 +00 +ENDCHAR +STARTCHAR U+236F +ENCODING 9071 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +49 +49 +7F +49 +49 +7F +49 +49 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2370 +ENCODING 9072 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +49 +55 +55 +45 +49 +49 +41 +49 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2371 +ENCODING 9073 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +32 +4C +00 +22 +22 +14 +14 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2372 +ENCODING 9074 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +32 +4C +00 +08 +14 +14 +22 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2373 +ENCODING 9075 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +06 +00 +00 +ENDCHAR +STARTCHAR U+2374 +ENCODING 9076 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +42 +42 +42 +62 +5C +40 +40 +ENDCHAR +STARTCHAR U+2375 +ENCODING 9077 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +14 +22 +49 +49 +49 +49 +49 +36 +00 +00 +ENDCHAR +STARTCHAR U+2376 +ENCODING 9078 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +32 +4A +44 +44 +44 +4A +32 +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+2377 +ENCODING 9079 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +42 +40 +78 +40 +42 +3C +00 +7E +00 +00 +ENDCHAR +STARTCHAR U+2378 +ENCODING 9080 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +08 +08 +08 +08 +08 +06 +00 +1E +00 +00 +ENDCHAR +STARTCHAR U+2379 +ENCODING 9081 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +14 +22 +41 +49 +49 +49 +49 +36 +00 +7F +00 +00 +ENDCHAR +STARTCHAR U+237A +ENCODING 9082 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +32 +4A +44 +44 +44 +44 +4A +32 +00 +00 +ENDCHAR +STARTCHAR U+237B +ENCODING 9083 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7F +41 +41 +41 +41 +41 +41 +41 +41 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2400 +ENCODING 9216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4A50 +6A50 +5A50 +499E +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2401 +ENCODING 9217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3992 +4252 +325E +0A52 +7192 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2402 +ENCODING 9218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3BA4 +4124 +3118 +0924 +7124 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2403 +ENCODING 9219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7BA4 +4124 +7918 +4124 +7924 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2404 +ENCODING 9220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +79BE +4248 +7A48 +4248 +7988 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2405 +ENCODING 9221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7A4C +4252 +7B52 +42D6 +7A4E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2406 +ENCODING 9222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +31A4 +4A28 +7A30 +4A28 +49A4 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2407 +ENCODING 9223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +73D0 +4A10 +73D0 +4A10 +73DE +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2408 +ENCODING 9224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +78E0 +4500 +78C0 +4420 +79C0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2409 +ENCODING 9225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +45F0 +4440 +7C40 +4440 +4440 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+240A +ENCODING 9226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +41F0 +4100 +41F0 +4100 +7D00 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+240B +ENCODING 9227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +45F0 +4440 +4440 +2840 +1040 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+240C +ENCODING 9228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7DF0 +4100 +7DF0 +4100 +4100 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+240D +ENCODING 9229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3DE0 +4110 +41E0 +4120 +3D10 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+240E +ENCODING 9230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3CE0 +4110 +3910 +0510 +78E0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+240F +ENCODING 9231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3DF0 +4040 +3840 +0440 +79F0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2410 +ENCODING 9232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7238 +4A20 +4A38 +4A20 +73B8 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2411 +ENCODING 9233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7188 +4A18 +4A08 +4A08 +719C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2412 +ENCODING 9234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7198 +4A04 +4A08 +4A10 +719C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2413 +ENCODING 9235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7198 +4A04 +4A18 +4A04 +7198 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2414 +ENCODING 9236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7184 +4A0C +4A14 +4A1C +7184 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2415 +ENCODING 9237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +4992 +6A54 +6A58 +5BD4 +4A52 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2416 +ENCODING 9238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3452 +429A +3116 +0912 +7112 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2417 +ENCODING 9239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7BB8 +4124 +7938 +4124 +7938 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2418 +ENCODING 9240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3324 +44B4 +47AC +44A4 +34A4 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2419 +ENCODING 9241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7D10 +41B0 +7D50 +4110 +7D10 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+241A +ENCODING 9242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3A5C +4252 +325C +0A52 +719C +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+241B +ENCODING 9243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +79CE +4210 +7990 +4050 +7B8E +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+241C +ENCODING 9244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +79C0 +4200 +7980 +4040 +4380 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+241D +ENCODING 9245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +39C0 +4200 +5980 +4840 +3B80 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+241E +ENCODING 9246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +71C0 +4A00 +7180 +5040 +4B80 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+241F +ENCODING 9247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +49C0 +4A00 +4980 +4840 +3380 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2420 +ENCODING 9248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3B80 +4240 +3380 +0A00 +7200 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2421 +ENCODING 9249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +73D0 +4A10 +4BD0 +4A10 +73DE +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2422 +ENCODING 9250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +14 +18 +10 +30 +5C +12 +12 +12 +12 +1C +00 +00 +ENDCHAR +STARTCHAR U+2423 +ENCODING 9251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+2424 +ENCODING 9252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +48 +68 +58 +48 +00 +10 +10 +10 +1E +00 +00 +00 +ENDCHAR +STARTCHAR U+2440 +ENCODING 9280 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +0A +0A +0A +08 +08 +28 +28 +28 +38 +00 +00 +ENDCHAR +STARTCHAR U+2441 +ENCODING 9281 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +02 +02 +02 +3E +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+2442 +ENCODING 9282 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +22 +22 +22 +22 +3E +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2443 +ENCODING 9283 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +3E +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+2444 +ENCODING 9284 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3E +2A +2A +2A +08 +08 +2A +2A +2A +3E +00 +00 +ENDCHAR +STARTCHAR U+2445 +ENCODING 9285 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +36 +2A +36 +22 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2446 +ENCODING 9286 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +0E +6E +6E +60 +60 +6E +6E +0E +00 +00 +00 +ENDCHAR +STARTCHAR U+2447 +ENCODING 9287 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +03 +03 +03 +1B +18 +18 +D8 +C0 +C0 +C0 +00 +00 +ENDCHAR +STARTCHAR U+2448 +ENCODING 9288 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +07 +57 +57 +50 +50 +50 +50 +50 +50 +50 +00 +00 +ENDCHAR +STARTCHAR U+2449 +ENCODING 9289 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +6D +6D +6D +6D +6D +6D +6D +6D +6D +00 +00 +ENDCHAR +STARTCHAR U+244A +ENCODING 9290 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +A0 +A0 +50 +28 +28 +14 +14 +0A +05 +05 +00 +00 +ENDCHAR +STARTCHAR U+2460 +ENCODING 9312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4104 +4304 +8502 +8102 +8102 +8102 +8102 +4104 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2461 +ENCODING 9313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4824 +8022 +8022 +80C2 +8302 +8402 +4824 +4FE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2462 +ENCODING 9314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4824 +8022 +8022 +80C2 +8022 +8022 +4824 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2463 +ENCODING 9315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4044 +40C4 +8142 +8242 +8442 +8842 +9FF2 +4044 +41F4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2464 +ENCODING 9316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4FE4 +4804 +8802 +8FC2 +8022 +8022 +8022 +4824 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2465 +ENCODING 9317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4824 +8802 +8802 +8FC2 +8822 +8822 +4824 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2466 +ENCODING 9318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4FE4 +4824 +8042 +8042 +8082 +8102 +8102 +4204 +4204 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2467 +ENCODING 9319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4824 +8822 +8822 +87C2 +8822 +8822 +4824 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2468 +ENCODING 9320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4824 +8822 +8822 +87E2 +8022 +8022 +4824 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2469 +ENCODING 9321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +48E4 +5914 +8912 +8912 +8912 +8912 +8912 +4914 +5CE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+246A +ENCODING 9322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2424 +4C62 +4422 +4422 +4422 +4422 +4422 +4422 +4E72 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+246B +ENCODING 9323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +24E4 +4D12 +4592 +4412 +4462 +4482 +4502 +450A +4FF2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+246C +ENCODING 9324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +24E4 +4D12 +4412 +4412 +4462 +4412 +4512 +4512 +4EE2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+246D +ENCODING 9325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2424 +4C62 +4462 +44A2 +44A2 +4522 +47FA +4422 +4E72 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+246E +ENCODING 9326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2594 +4D62 +4502 +4562 +4592 +4412 +4412 +4512 +4EE2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+246F +ENCODING 9327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2464 +4C92 +4502 +4562 +4592 +4512 +4512 +4512 +4EE2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+2470 +ENCODING 9328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +25F4 +4D12 +4412 +4422 +4442 +4442 +4442 +4442 +4EE2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+2471 +ENCODING 9329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +24E4 +4D12 +4512 +4512 +44E2 +4512 +4512 +4512 +4EE2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+2472 +ENCODING 9330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +24E4 +4D12 +4512 +4512 +44F2 +4412 +4412 +4512 +4EE2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+2473 +ENCODING 9331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2C64 +5292 +4292 +4292 +4492 +4892 +5092 +5292 +5E62 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+2474 +ENCODING 9332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8102 +8102 +8102 +8102 +8102 +8102 +8102 +8102 +8102 +8102 +8102 +8102 +4004 +0000 +ENDCHAR +STARTCHAR U+2475 +ENCODING 9333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8782 +8842 +8842 +8042 +8042 +8042 +8082 +8302 +8402 +8842 +8842 +8FC2 +4004 +0000 +ENDCHAR +STARTCHAR U+2476 +ENCODING 9334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8782 +8842 +8842 +8042 +8082 +8302 +8082 +8042 +8042 +8842 +8842 +8782 +4004 +0000 +ENDCHAR +STARTCHAR U+2477 +ENCODING 9335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4184 +8282 +8282 +8282 +8482 +8482 +8882 +8882 +8FE2 +8082 +8082 +8082 +8082 +4004 +0000 +ENDCHAR +STARTCHAR U+2478 +ENCODING 9336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8FC2 +8802 +8802 +8802 +8B82 +8C42 +8842 +8042 +8042 +8842 +8842 +8782 +4004 +0000 +ENDCHAR +STARTCHAR U+2479 +ENCODING 9337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8782 +8842 +8842 +8802 +8802 +8B82 +8C42 +8842 +8842 +8842 +8842 +8782 +4004 +0000 +ENDCHAR +STARTCHAR U+247A +ENCODING 9338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8FE2 +8822 +8822 +8042 +8082 +8082 +8082 +8102 +8102 +8102 +8102 +8102 +4004 +0000 +ENDCHAR +STARTCHAR U+247B +ENCODING 9339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8782 +8842 +8842 +8842 +8842 +8782 +8842 +8842 +8842 +8842 +8842 +8782 +4004 +0000 +ENDCHAR +STARTCHAR U+247C +ENCODING 9340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8782 +8842 +8842 +8842 +8842 +88C2 +8742 +8042 +8042 +8842 +8842 +8782 +4004 +0000 +ENDCHAR +STARTCHAR U+247D +ENCODING 9341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +88E2 +8912 +8912 +8912 +8912 +8912 +8912 +8912 +8912 +8912 +8912 +88E2 +4004 +0000 +ENDCHAR +STARTCHAR U+247E +ENCODING 9342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +8822 +8822 +8822 +8822 +8822 +8822 +8822 +8822 +8822 +8822 +8822 +8822 +4004 +0000 +ENDCHAR +STARTCHAR U+247F +ENCODING 9343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +91E2 +9212 +9212 +9012 +9012 +9022 +90C2 +9102 +9202 +9212 +9212 +93F2 +4004 +0000 +ENDCHAR +STARTCHAR U+2480 +ENCODING 9344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +91E2 +9212 +9212 +9012 +9022 +90C2 +9022 +9012 +9012 +9212 +9212 +91E2 +4004 +0000 +ENDCHAR +STARTCHAR U+2481 +ENCODING 9345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +9062 +90A2 +90A2 +90A2 +9122 +9122 +9222 +9222 +93FA +9022 +9022 +9022 +4004 +0000 +ENDCHAR +STARTCHAR U+2482 +ENCODING 9346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +93F2 +9202 +9202 +9202 +92E2 +9312 +9212 +9012 +9012 +9212 +9212 +91E2 +4004 +0000 +ENDCHAR +STARTCHAR U+2483 +ENCODING 9347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +91E2 +9212 +9212 +9202 +9202 +92E2 +9312 +9212 +9212 +9212 +9212 +91E2 +4004 +0000 +ENDCHAR +STARTCHAR U+2484 +ENCODING 9348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +93F2 +9212 +9212 +9022 +9042 +9042 +9042 +9082 +9082 +9082 +9082 +9082 +4004 +0000 +ENDCHAR +STARTCHAR U+2485 +ENCODING 9349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +91E2 +9212 +9212 +9212 +9212 +91E2 +9212 +9212 +9212 +9212 +9212 +91E2 +4004 +0000 +ENDCHAR +STARTCHAR U+2486 +ENCODING 9350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +91E2 +9212 +9212 +9212 +9212 +9232 +91D2 +9012 +9012 +9212 +9212 +91E2 +4004 +0000 +ENDCHAR +STARTCHAR U+2487 +ENCODING 9351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +9C72 +A28A +A28A +828A +828A +848A +888A +908A +A08A +A28A +A28A +BE72 +4004 +0000 +ENDCHAR +STARTCHAR U+2488 +ENCODING 9352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0600 +0A00 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0240 +0000 +ENDCHAR +STARTCHAR U+2489 +ENCODING 9353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0F00 +1080 +1080 +0080 +0080 +0080 +0100 +0600 +0800 +1000 +1000 +1080 +1080 +1F90 +0000 +ENDCHAR +STARTCHAR U+248A +ENCODING 9354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0F00 +1080 +1080 +0080 +0080 +0100 +0600 +0100 +0080 +0080 +1080 +1080 +1080 +0F10 +0000 +ENDCHAR +STARTCHAR U+248B +ENCODING 9355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +0500 +0500 +0500 +0900 +0900 +0900 +1100 +1100 +1FC0 +0100 +0100 +0100 +0108 +0100 +ENDCHAR +STARTCHAR U+248C +ENCODING 9356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1F80 +1000 +1000 +1000 +1000 +1000 +1700 +1880 +1080 +0080 +0080 +1080 +1080 +0F10 +0000 +ENDCHAR +STARTCHAR U+248D +ENCODING 9357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0F00 +1080 +1080 +1080 +1000 +1000 +1700 +1880 +1080 +1080 +1080 +1080 +1080 +0F10 +0000 +ENDCHAR +STARTCHAR U+248E +ENCODING 9358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FC0 +1040 +1040 +0080 +0100 +0100 +0100 +0200 +0200 +0200 +0200 +0200 +0200 +0208 +0000 +ENDCHAR +STARTCHAR U+248F +ENCODING 9359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0F00 +1080 +1080 +1080 +1080 +0900 +0600 +0900 +1080 +1080 +1080 +1080 +1080 +0F10 +0000 +ENDCHAR +STARTCHAR U+2490 +ENCODING 9360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0F00 +1080 +1080 +1080 +1080 +1080 +1180 +0E80 +0080 +0080 +1080 +1080 +1080 +0F10 +0000 +ENDCHAR +STARTCHAR U+2491 +ENCODING 9361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23C0 +6420 +A420 +2420 +2420 +2420 +2420 +2420 +2420 +2420 +2420 +2420 +2420 +23C8 +0000 +ENDCHAR +STARTCHAR U+2492 +ENCODING 9362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +6180 +A280 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2080 +2090 +0000 +ENDCHAR +STARTCHAR U+2493 +ENCODING 9363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23C0 +6420 +A420 +2020 +2020 +2020 +2040 +2180 +2200 +2400 +2400 +2420 +2420 +27E4 +0000 +ENDCHAR +STARTCHAR U+2494 +ENCODING 9364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23C0 +6420 +A420 +2020 +2020 +2040 +2180 +2040 +2020 +2020 +2420 +2420 +2420 +23C4 +0000 +ENDCHAR +STARTCHAR U+2495 +ENCODING 9365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +20C0 +6140 +A140 +2140 +2240 +2240 +2240 +2440 +2440 +27F0 +2040 +2040 +2040 +2048 +0000 +ENDCHAR +STARTCHAR U+2496 +ENCODING 9366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +27E0 +6400 +A400 +2400 +2400 +2400 +25C0 +2620 +2420 +2020 +2020 +2420 +2420 +23C4 +0000 +ENDCHAR +STARTCHAR U+2497 +ENCODING 9367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23C0 +6420 +A420 +2420 +2400 +2400 +25C0 +2620 +2420 +2420 +2420 +2420 +2420 +23C4 +0000 +ENDCHAR +STARTCHAR U+2498 +ENCODING 9368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +27F0 +6410 +A410 +2020 +2040 +2040 +2040 +2080 +2080 +2080 +2080 +2080 +2080 +2084 +0000 +ENDCHAR +STARTCHAR U+2499 +ENCODING 9369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23C0 +6420 +A420 +2420 +2420 +2240 +2180 +2240 +2420 +2420 +2420 +2420 +2420 +23C4 +0000 +ENDCHAR +STARTCHAR U+249A +ENCODING 9370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23C0 +6420 +A420 +2420 +2420 +2420 +2460 +23A0 +2020 +2020 +2420 +2420 +2420 +23C4 +0000 +ENDCHAR +STARTCHAR U+249B +ENCODING 9371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +38E0 +4510 +4510 +0510 +0510 +0510 +1910 +2110 +4110 +4110 +4110 +4510 +4510 +7CE4 +0000 +ENDCHAR +STARTCHAR U+249C +ENCODING 9372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +43C2 +4422 +4022 +43E2 +4422 +4422 +43DA +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+249D +ENCODING 9373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2404 +4C02 +4402 +45C2 +4622 +4412 +4412 +4412 +4622 +4DC2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+249E +ENCODING 9374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +43C2 +4422 +4802 +4802 +4812 +4422 +43C2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+249F +ENCODING 9375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4062 +4022 +43A2 +4462 +4822 +4822 +4822 +4462 +43B2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24A0 +ENCODING 9376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +47C2 +4822 +4822 +4FE2 +4802 +4822 +47C2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24A1 +ENCODING 9377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +20C4 +4162 +4102 +47C2 +4102 +4102 +4102 +4102 +4102 +4382 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24A2 +ENCODING 9378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4032 +43C2 +4422 +4422 +4FC2 +4802 +47E2 +4812 +4812 +27E4 +1818 +0000 +ENDCHAR +STARTCHAR U+24A3 +ENCODING 9379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2404 +4C02 +4402 +44E2 +4722 +4422 +4422 +4422 +4422 +4E72 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24A4 +ENCODING 9380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1898 +2084 +4002 +4002 +4082 +4182 +4082 +4082 +4082 +4082 +41C2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24A5 +ENCODING 9381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1898 +2084 +4002 +4002 +4082 +4182 +4082 +4082 +4082 +4082 +4082 +4482 +2304 +1818 +0000 +ENDCHAR +STARTCHAR U+24A6 +ENCODING 9382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2404 +4C02 +4402 +44E2 +4442 +4482 +4782 +44C2 +4462 +4E72 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24A7 +ENCODING 9383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2104 +4302 +4102 +4102 +4102 +4102 +4102 +4102 +4102 +4382 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24A8 +ENCODING 9384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +4B62 +5DA2 +4922 +4922 +4922 +4922 +5DB2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24A9 +ENCODING 9385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +44E2 +4F22 +4422 +4422 +4422 +4422 +4E72 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24AA +ENCODING 9386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +47C2 +4822 +4822 +4822 +4822 +4822 +47C2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24AB +ENCODING 9387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +45C2 +4E22 +4412 +4412 +4412 +4622 +45C2 +4402 +2E04 +1818 +0000 +ENDCHAR +STARTCHAR U+24AC +ENCODING 9388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +43A2 +4462 +4822 +4822 +4822 +4462 +43A2 +4022 +2074 +1818 +0000 +ENDCHAR +STARTCHAR U+24AD +ENCODING 9389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +44E2 +4F32 +4402 +4402 +4402 +4402 +4E02 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24AE +ENCODING 9390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +43E2 +4412 +4402 +43E2 +4012 +4412 +43E2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24AF +ENCODING 9391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4102 +4102 +47C2 +4102 +4102 +4102 +4122 +41C2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24B0 +ENCODING 9392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +4422 +4C62 +4422 +4422 +4422 +4462 +47B2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24B1 +ENCODING 9393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +4E3A +4412 +4222 +4222 +4142 +4142 +4082 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24B2 +ENCODING 9394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +5FBA +4912 +4912 +44A2 +45A2 +4242 +4242 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24B3 +ENCODING 9395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +4E72 +4422 +4242 +4182 +4242 +4422 +4E72 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24B4 +ENCODING 9396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +5C72 +4822 +4442 +4282 +4102 +4102 +4382 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24B5 +ENCODING 9397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +43F2 +4222 +4442 +4082 +4102 +4212 +47E2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+24B6 +ENCODING 9398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2108 +4284 +4444 +8442 +8442 +87C2 +8442 +8442 +4444 +4C64 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24B7 +ENCODING 9399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4F84 +4444 +8422 +8442 +8782 +8442 +8422 +4444 +4FC4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24B8 +ENCODING 9400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +43C4 +4424 +8402 +8402 +8402 +8402 +8402 +4424 +43C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24B9 +ENCODING 9401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4F84 +4444 +8422 +8422 +8422 +8422 +8422 +4444 +4F84 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24BA +ENCODING 9402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4FE4 +4424 +8402 +8402 +8782 +8402 +8402 +4424 +4FE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24BB +ENCODING 9403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4FE4 +4424 +8402 +8402 +8782 +8402 +8402 +4404 +4E04 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24BC +ENCODING 9404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +43C4 +4424 +8402 +8402 +84E2 +8422 +8422 +4464 +43A4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24BD +ENCODING 9405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4EE4 +4444 +8442 +8442 +87C2 +8442 +8442 +4444 +4EE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24BE +ENCODING 9406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4384 +4104 +8102 +8102 +8102 +8102 +8102 +4104 +4384 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24BF +ENCODING 9407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +41C4 +4084 +8082 +8082 +8082 +8082 +8082 +4884 +4704 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C0 +ENCODING 9408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4E64 +4444 +8482 +8502 +8602 +8502 +8482 +4444 +4E64 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C1 +ENCODING 9409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4E04 +4404 +8402 +8402 +8402 +8402 +8402 +4424 +4FC4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C2 +ENCODING 9410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4C64 +46C4 +86C2 +8542 +8542 +8442 +8442 +4444 +4EE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C3 +ENCODING 9411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4C64 +4444 +8642 +8642 +8542 +8542 +84C2 +44C4 +4C64 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C4 +ENCODING 9412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4384 +4444 +8822 +8822 +8822 +8822 +8822 +4444 +4384 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C5 +ENCODING 9413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4F84 +4444 +8442 +8442 +8782 +8402 +8402 +4404 +4E04 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C6 +ENCODING 9414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4384 +4444 +8822 +8822 +8822 +8822 +89A2 +4444 +43A4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C7 +ENCODING 9415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4F84 +4444 +8442 +8442 +8782 +8502 +8482 +4444 +4E24 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C8 +ENCODING 9416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4384 +4444 +8402 +8402 +8382 +8042 +8042 +4444 +4384 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24C9 +ENCODING 9417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4FE4 +4924 +8102 +8102 +8102 +8102 +8102 +4104 +4384 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24CA +ENCODING 9418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4EE4 +4444 +8442 +8442 +8442 +8442 +8442 +4444 +4384 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24CB +ENCODING 9419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4C64 +4444 +8442 +8442 +8282 +8282 +8282 +4104 +4104 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24CC +ENCODING 9420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4C64 +4544 +8542 +8542 +8542 +8542 +86C2 +4444 +4444 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24CD +ENCODING 9421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4EE4 +4444 +8442 +8282 +8102 +8282 +8442 +4444 +4EE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24CE +ENCODING 9422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4EE4 +4444 +8442 +8282 +8102 +8102 +8102 +4104 +4384 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24CF +ENCODING 9423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4FE4 +4824 +8042 +8082 +8102 +8202 +8402 +4824 +4FE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+24D0 +ENCODING 9424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +47C2 +4822 +4022 +47E2 +4822 +4822 +47DA +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D1 +ENCODING 9425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1408 +2C04 +4402 +45C2 +4622 +4412 +4412 +4412 +4622 +4DC2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D2 +ENCODING 9426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +43C2 +4422 +4802 +4802 +4802 +4432 +43C2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D3 +ENCODING 9427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2064 +4022 +43A2 +4462 +4822 +4822 +4822 +4822 +47D2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D4 +ENCODING 9428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +43C2 +4422 +4812 +4FF2 +4802 +4412 +43E2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D5 +ENCODING 9429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +11C8 +2164 +4102 +47C2 +4102 +4102 +4102 +4102 +4102 +4382 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D6 +ENCODING 9430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4062 +43C2 +4422 +4422 +47C2 +4802 +4FE2 +4812 +2814 +17E8 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D7 +ENCODING 9431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1408 +2C04 +4402 +45E2 +4622 +4422 +4422 +4422 +4422 +4E72 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D8 +ENCODING 9432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1088 +2084 +4002 +4082 +4182 +4082 +4082 +4082 +4082 +41C2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24D9 +ENCODING 9433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1088 +2084 +4002 +4082 +4182 +4082 +4082 +4082 +4082 +4082 +2C84 +1308 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24DA +ENCODING 9434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1408 +2C04 +4402 +44F2 +4442 +4582 +46C2 +4462 +4432 +4E7A +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24DB +ENCODING 9435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1108 +2304 +4102 +4102 +4102 +4102 +4102 +4102 +4102 +4382 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24DC +ENCODING 9436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +4B62 +5DA2 +4922 +4922 +4922 +4922 +5DB2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24DD +ENCODING 9437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +45E2 +4E22 +4422 +4422 +4422 +4422 +4E72 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24DE +ENCODING 9438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +43E2 +4412 +4412 +4412 +4412 +4412 +43E2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24DF +ENCODING 9439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +45C2 +4E22 +4412 +4412 +4412 +4622 +45C2 +2404 +1408 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E0 +ENCODING 9440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +43A2 +4462 +4822 +4822 +4822 +4462 +43A2 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E1 +ENCODING 9441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +44E2 +4F32 +4402 +4402 +4402 +4402 +4E02 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E2 +ENCODING 9442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +43E2 +4412 +4602 +41C2 +4032 +4412 +43E2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E3 +ENCODING 9443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4102 +4102 +47C2 +4102 +4102 +4102 +4122 +41C2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E4 +ENCODING 9444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +4422 +4C62 +4422 +4422 +4422 +4422 +47D2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E5 +ENCODING 9445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +4E3A +4412 +4222 +4222 +4142 +4142 +4082 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E6 +ENCODING 9446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +7BBA +5112 +5112 +49A2 +4AA2 +4442 +4442 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E7 +ENCODING 9447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +5C72 +4442 +4282 +4102 +4282 +4442 +5C72 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E8 +ENCODING 9448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +5C72 +4822 +4442 +4282 +4102 +4102 +4382 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24E9 +ENCODING 9449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +47E2 +4422 +4842 +4182 +4202 +4422 +4FC2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+24EA +ENCODING 9450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4384 +4444 +8442 +8442 +8442 +8442 +8442 +4444 +4384 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2500 +ENCODING 9472 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2501 +ENCODING 9473 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2502 +ENCODING 9474 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2503 +ENCODING 9475 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2504 +ENCODING 9476 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +DB +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2505 +ENCODING 9477 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +DB +DB +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2506 +ENCODING 9478 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +00 +00 +08 +08 +08 +08 +00 +00 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2507 +ENCODING 9479 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +00 +00 +18 +18 +18 +18 +00 +00 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2508 +ENCODING 9480 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +AA +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2509 +ENCODING 9481 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +AA +AA +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+250A +ENCODING 9482 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +00 +08 +08 +08 +00 +08 +08 +08 +00 +08 +08 +08 +00 +ENDCHAR +STARTCHAR U+250B +ENCODING 9483 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +00 +18 +18 +18 +00 +18 +18 +18 +00 +18 +18 +18 +00 +ENDCHAR +STARTCHAR U+250C +ENCODING 9484 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0F +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+250D +ENCODING 9485 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0F +0F +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+250E +ENCODING 9486 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1F +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+250F +ENCODING 9487 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1F +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2510 +ENCODING 9488 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2511 +ENCODING 9489 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2512 +ENCODING 9490 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2513 +ENCODING 9491 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F8 +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2514 +ENCODING 9492 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +0F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2515 +ENCODING 9493 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +0F +0F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2516 +ENCODING 9494 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +1F +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2517 +ENCODING 9495 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +1F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2518 +ENCODING 9496 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2519 +ENCODING 9497 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+251A +ENCODING 9498 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+251B +ENCODING 9499 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+251C +ENCODING 9500 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +0F +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+251D +ENCODING 9501 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +0F +0F +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+251E +ENCODING 9502 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+251F +ENCODING 9503 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +1F +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2520 +ENCODING 9504 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2521 +ENCODING 9505 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +1F +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2522 +ENCODING 9506 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +1F +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2523 +ENCODING 9507 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +1F +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2524 +ENCODING 9508 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2525 +ENCODING 9509 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2526 +ENCODING 9510 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2527 +ENCODING 9511 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2528 +ENCODING 9512 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +18 +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2529 +ENCODING 9513 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+252A +ENCODING 9514 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+252B +ENCODING 9515 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F8 +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+252C +ENCODING 9516 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+252D +ENCODING 9517 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+252E +ENCODING 9518 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +0F +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+252F +ENCODING 9519 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +FF +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2530 +ENCODING 9520 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2531 +ENCODING 9521 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2532 +ENCODING 9522 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2533 +ENCODING 9523 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2534 +ENCODING 9524 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2535 +ENCODING 9525 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2536 +ENCODING 9526 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +0F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2537 +ENCODING 9527 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2538 +ENCODING 9528 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2539 +ENCODING 9529 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+253A +ENCODING 9530 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +1F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+253B +ENCODING 9531 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+253C +ENCODING 9532 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+253D +ENCODING 9533 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+253E +ENCODING 9534 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +0F +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+253F +ENCODING 9535 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +FF +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2540 +ENCODING 9536 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2541 +ENCODING 9537 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2542 +ENCODING 9538 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2543 +ENCODING 9539 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +FF +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2544 +ENCODING 9540 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +1F +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2545 +ENCODING 9541 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2546 +ENCODING 9542 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2547 +ENCODING 9543 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +FF +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2548 +ENCODING 9544 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FF +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+2549 +ENCODING 9545 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +F8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+254A +ENCODING 9546 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +1F +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+254B +ENCODING 9547 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +FF +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+254C +ENCODING 9548 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +EE +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+254D +ENCODING 9549 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +EE +EE +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+254E +ENCODING 9550 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +00 +00 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+254F +ENCODING 9551 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +00 +00 +18 +18 +18 +18 +18 +18 +00 +00 +ENDCHAR +STARTCHAR U+2550 +ENCODING 9552 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FF +00 +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2551 +ENCODING 9553 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2552 +ENCODING 9554 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0F +08 +0F +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2553 +ENCODING 9555 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1F +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2554 +ENCODING 9556 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1F +10 +17 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2555 +ENCODING 9557 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +F8 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2556 +ENCODING 9558 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +14 +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2557 +ENCODING 9559 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FC +04 +F4 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2558 +ENCODING 9560 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +0F +08 +0F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2559 +ENCODING 9561 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +14 +1F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+255A +ENCODING 9562 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +17 +10 +1F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+255B +ENCODING 9563 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +08 +F8 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+255C +ENCODING 9564 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +14 +FC +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+255D +ENCODING 9565 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +F4 +04 +FC +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+255E +ENCODING 9566 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +0F +08 +0F +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+255F +ENCODING 9567 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +14 +17 +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2560 +ENCODING 9568 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +17 +10 +17 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2561 +ENCODING 9569 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2562 +ENCODING 9570 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +14 +F4 +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2563 +ENCODING 9571 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +F4 +04 +F4 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2564 +ENCODING 9572 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FF +00 +FF +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2565 +ENCODING 9573 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2566 +ENCODING 9574 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FF +00 +F7 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+2567 +ENCODING 9575 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +FF +00 +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2568 +ENCODING 9576 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +14 +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2569 +ENCODING 9577 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +F7 +00 +FF +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+256A +ENCODING 9578 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +FF +08 +FF +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+256B +ENCODING 9579 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +14 +FF +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+256C +ENCODING 9580 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +14 +14 +14 +14 +14 +14 +F7 +00 +F7 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR U+256D +ENCODING 9581 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +03 +04 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+256E +ENCODING 9582 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +E0 +10 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+256F +ENCODING 9583 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +10 +E0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2570 +ENCODING 9584 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +04 +03 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2571 +ENCODING 9585 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +01 +01 +02 +02 +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR U+2572 +ENCODING 9586 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +02 +02 +01 +01 +ENDCHAR +STARTCHAR U+2573 +ENCODING 9587 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +81 +81 +42 +42 +24 +24 +18 +18 +18 +18 +24 +24 +42 +42 +81 +81 +ENDCHAR +STARTCHAR U+2574 +ENCODING 9588 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F0 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2575 +ENCODING 9589 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2576 +ENCODING 9590 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0F +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2577 +ENCODING 9591 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2578 +ENCODING 9592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +F0 +F0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2579 +ENCODING 9593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +18 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+257A +ENCODING 9594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0F +0F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+257B +ENCODING 9595 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+257C +ENCODING 9596 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +0F +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+257D +ENCODING 9597 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U+257E +ENCODING 9598 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +FF +F0 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+257F +ENCODING 9599 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +18 +18 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+2580 +ENCODING 9600 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2581 +ENCODING 9601 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +FF +ENDCHAR +STARTCHAR U+2582 +ENCODING 9602 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+2583 +ENCODING 9603 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+2584 +ENCODING 9604 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+2585 +ENCODING 9605 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+2586 +ENCODING 9606 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+2587 +ENCODING 9607 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+2588 +ENCODING 9608 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+2589 +ENCODING 9609 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR U+258A +ENCODING 9610 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR U+258B +ENCODING 9611 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR U+258C +ENCODING 9612 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR U+258D +ENCODING 9613 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR U+258E +ENCODING 9614 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR U+258F +ENCODING 9615 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U+2590 +ENCODING 9616 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +0F +ENDCHAR +STARTCHAR U+2591 +ENCODING 9617 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +88 +22 +88 +22 +88 +22 +88 +22 +88 +22 +88 +22 +88 +22 +88 +22 +ENDCHAR +STARTCHAR U+2592 +ENCODING 9618 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +AA +55 +AA +55 +AA +55 +AA +55 +AA +55 +AA +55 +AA +55 +AA +55 +ENDCHAR +STARTCHAR U+2593 +ENCODING 9619 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +EE +BB +EE +BB +EE +BB +EE +BB +EE +BB +EE +BB +EE +BB +EE +BB +ENDCHAR +STARTCHAR U+2594 +ENCODING 9620 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +FF +FF +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2595 +ENCODING 9621 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR U+25A0 +ENCODING 9632 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +7F +7F +7F +7F +7F +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25A1 +ENCODING 9633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +41 +41 +41 +41 +41 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25A2 +ENCODING 9634 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +41 +41 +41 +41 +41 +3E +00 +00 +00 +ENDCHAR +STARTCHAR U+25A3 +ENCODING 9635 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +41 +5D +5D +5D +41 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25A4 +ENCODING 9636 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +41 +7F +41 +7F +41 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25A5 +ENCODING 9637 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +55 +55 +55 +55 +55 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25A6 +ENCODING 9638 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +55 +7F +55 +7F +55 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25A7 +ENCODING 9639 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +53 +49 +65 +53 +49 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25A8 +ENCODING 9640 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +65 +49 +53 +65 +49 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25A9 +ENCODING 9641 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +55 +6B +55 +6B +55 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+25AA +ENCODING 9642 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +3C +3C +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25AB +ENCODING 9643 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +24 +24 +3C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25AC +ENCODING 9644 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +7F +7F +7F +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25AD +ENCODING 9645 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +41 +41 +7F +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25AE +ENCODING 9646 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +3C +3C +3C +3C +3C +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25AF +ENCODING 9647 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3C +24 +24 +24 +24 +24 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B0 +ENCODING 9648 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3F +7E +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B1 +ENCODING 9649 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3F +42 +FC +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B2 +ENCODING 9650 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +18 +3C +3C +7E +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B3 +ENCODING 9651 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +18 +24 +24 +42 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B4 +ENCODING 9652 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +3C +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B5 +ENCODING 9653 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +18 +24 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B6 +ENCODING 9654 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +78 +7E +7E +78 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B7 +ENCODING 9655 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +60 +58 +46 +46 +58 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B8 +ENCODING 9656 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +30 +3C +3C +30 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25B9 +ENCODING 9657 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +30 +2C +2C +30 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25BA +ENCODING 9658 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +78 +7E +78 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25BB +ENCODING 9659 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +60 +58 +46 +58 +60 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25BC +ENCODING 9660 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +7E +3C +3C +18 +18 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25BD +ENCODING 9661 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +42 +24 +24 +18 +18 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25BE +ENCODING 9662 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +3C +18 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25BF +ENCODING 9663 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +24 +18 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C0 +ENCODING 9664 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +06 +1E +7E +7E +1E +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C1 +ENCODING 9665 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +06 +1A +62 +62 +1A +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C2 +ENCODING 9666 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +3C +3C +0C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C3 +ENCODING 9667 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +34 +34 +0C +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C4 +ENCODING 9668 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +06 +1E +7E +1E +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C5 +ENCODING 9669 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +06 +1A +62 +1A +06 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C6 +ENCODING 9670 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +1C +3E +7F +3E +1C +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C7 +ENCODING 9671 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +14 +22 +41 +22 +14 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C8 +ENCODING 9672 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +14 +2A +5D +2A +14 +08 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25C9 +ENCODING 9673 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +59 +5D +4D +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25CA +ENCODING 9674 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +18 +24 +24 +42 +42 +24 +24 +18 +18 +00 +00 +00 +ENDCHAR +STARTCHAR U+25CB +ENCODING 9675 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +41 +41 +41 +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25CC +ENCODING 9676 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +14 +00 +41 +00 +41 +00 +14 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25CD +ENCODING 9677 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +36 +55 +55 +55 +36 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25CE +ENCODING 9678 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +49 +55 +49 +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25CF +ENCODING 9679 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +3E +7F +7F +7F +3E +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D0 +ENCODING 9680 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +32 +71 +71 +71 +32 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D1 +ENCODING 9681 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +26 +47 +47 +47 +26 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D2 +ENCODING 9682 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +41 +41 +7F +3E +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D3 +ENCODING 9683 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +3E +7F +41 +41 +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D4 +ENCODING 9684 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +2E +4F +4F +41 +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D5 +ENCODING 9685 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +26 +47 +47 +7F +3E +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D6 +ENCODING 9686 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +38 +78 +78 +78 +38 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D7 +ENCODING 9687 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +0C +0E +0F +0F +0F +0E +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25D8 +ENCODING 9688 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +FF +FF +FF +FF +FF +FF +E7 +C3 +C3 +E7 +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+25D9 +ENCODING 9689 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +FF +FF +FF +FF +FF +E7 +DB +BD +BD +DB +E7 +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+25DA +ENCODING 9690 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +FF +FF +FF +FF +FF +E7 +DB +BD +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25DB +ENCODING 9691 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +BD +DB +E7 +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR U+25DC +ENCODING 9692 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +20 +40 +40 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25DD +ENCODING 9693 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +0C +02 +01 +01 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25DE +ENCODING 9694 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +01 +01 +02 +0C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25DF +ENCODING 9695 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +40 +40 +20 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25E0 +ENCODING 9696 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +41 +41 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25E1 +ENCODING 9697 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +41 +41 +22 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25E2 +ENCODING 9698 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +02 +06 +0E +1E +3E +7E +00 +ENDCHAR +STARTCHAR U+25E3 +ENCODING 9699 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +40 +60 +70 +78 +7C +7E +00 +ENDCHAR +STARTCHAR U+25E4 +ENCODING 9700 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +7C +78 +70 +60 +40 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25E5 +ENCODING 9701 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +3E +1E +0E +06 +02 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25E6 +ENCODING 9702 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +38 +44 +44 +44 +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25E7 +ENCODING 9703 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +72 +72 +72 +72 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25E8 +ENCODING 9704 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +4E +4E +4E +4E +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25E9 +ENCODING 9705 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +7A +72 +62 +42 +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25EA +ENCODING 9706 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +42 +46 +4E +5E +7E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25EB +ENCODING 9707 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7F +49 +49 +49 +49 +7F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25EC +ENCODING 9708 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +14 +14 +22 +2A +41 +7F +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25ED +ENCODING 9709 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +18 +34 +34 +72 +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25EE +ENCODING 9710 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +18 +18 +2C +2C +4E +4E +7E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+25EF +ENCODING 9711 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +81 +81 +81 +81 +42 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2600 +ENCODING 9728 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +08 +49 +22 +00 +1C +3E +3E +1C +00 +22 +49 +08 +00 +00 +ENDCHAR +STARTCHAR U+2601 +ENCODING 9729 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +76 +FF +7E +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2602 +ENCODING 9730 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +3E +7F +08 +08 +08 +08 +10 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2603 +ENCODING 9731 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +1C +1C +3E +14 +14 +36 +63 +22 +77 +41 +41 +41 +3E +00 +00 +ENDCHAR +STARTCHAR U+2604 +ENCODING 9732 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +22 +24 +24 +28 +29 +02 +30 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+2605 +ENCODING 9733 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +7F +1C +36 +22 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2606 +ENCODING 9734 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +77 +22 +2A +36 +22 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2607 +ENCODING 9735 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +04 +08 +10 +20 +10 +0A +06 +0E +00 +00 +ENDCHAR +STARTCHAR U+2608 +ENCODING 9736 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +42 +44 +48 +50 +4A +46 +4E +00 +00 +ENDCHAR +STARTCHAR U+2609 +ENCODING 9737 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +81 +99 +99 +81 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+260A +ENCODING 9738 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +42 +42 +00 +A5 +42 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+260B +ENCODING 9739 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +42 +A5 +42 +42 +3C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+260C +ENCODING 9740 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +04 +08 +30 +48 +48 +30 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+260D +ENCODING 9741 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +06 +09 +09 +06 +08 +30 +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+260E +ENCODING 9742 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3E +63 +00 +2A +63 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+260F +ENCODING 9743 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +41 +5D +3E +49 +41 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+2610 +ENCODING 9744 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7F +41 +41 +41 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2611 +ENCODING 9745 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +04 +7F +45 +45 +65 +59 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2612 +ENCODING 9746 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7F +41 +55 +49 +55 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2613 +ENCODING 9747 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +22 +14 +14 +08 +08 +14 +14 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+261A +ENCODING 9754 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +1F +1F +0E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+261B +ENCODING 9755 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +3F +7C +7C +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+261C +ENCODING 9756 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +11 +19 +0E +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+261D +ENCODING 9757 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +04 +04 +1C +34 +24 +24 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+261E +ENCODING 9758 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +3F +44 +4C +38 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+261F +ENCODING 9759 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +24 +24 +34 +1C +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+2620 +ENCODING 9760 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +E7 +A5 +7E +81 +A5 +A5 +81 +5A +5A +42 +BD +E7 +00 +00 +ENDCHAR +STARTCHAR U+2621 +ENCODING 9761 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +04 +04 +08 +08 +10 +10 +20 +20 +1C +00 +00 +ENDCHAR +STARTCHAR U+2622 +ENCODING 9762 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +63 +77 +77 +08 +1C +3E +00 +00 +00 +ENDCHAR +STARTCHAR U+2623 +ENCODING 9763 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +24 +66 +FF +24 +24 +18 +18 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2624 +ENCODING 9764 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +3E +41 +3E +08 +08 +3E +41 +3E +22 +1C +14 +08 +00 +00 +ENDCHAR +STARTCHAR U+2625 +ENCODING 9765 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +22 +14 +08 +3E +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2626 +ENCODING 9766 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +1C +08 +3E +08 +0C +18 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2627 +ENCODING 9767 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +12 +12 +1C +10 +54 +38 +10 +38 +54 +00 +00 +ENDCHAR +STARTCHAR U+2628 +ENCODING 9768 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +1C +08 +3E +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2629 +ENCODING 9769 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1C +08 +49 +7F +49 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+262A +ENCODING 9770 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1E +21 +40 +C2 +C7 +C2 +40 +21 +1E +00 +00 +00 +ENDCHAR +STARTCHAR U+262B +ENCODING 9771 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +2A +AB +AB +AB +AB +AB +BF +5D +00 +00 +ENDCHAR +STARTCHAR U+262C +ENCODING 9772 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +1C +3E +49 +49 +6B +7F +6B +5D +00 +00 +ENDCHAR +STARTCHAR U+262D +ENCODING 9773 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +0C +02 +39 +79 +0D +3E +63 +C1 +00 +00 +ENDCHAR +STARTCHAR U+262E +ENCODING 9774 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +49 +49 +49 +5D +6B +49 +3E +00 +00 +ENDCHAR +STARTCHAR U+262F +ENCODING 9775 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7E +81 +F1 +D5 +F1 +FF +7E +00 +00 +ENDCHAR +STARTCHAR U+2630 +ENCODING 9776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +7E +00 +00 +7E +7E +00 +00 +7E +7E +00 +00 +ENDCHAR +STARTCHAR U+2631 +ENCODING 9777 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +66 +66 +00 +00 +7E +7E +00 +00 +7E +7E +00 +00 +ENDCHAR +STARTCHAR U+2632 +ENCODING 9778 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +7E +00 +00 +66 +66 +00 +00 +7E +7E +00 +00 +ENDCHAR +STARTCHAR U+2633 +ENCODING 9779 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +7E +7E +00 +00 +ENDCHAR +STARTCHAR U+2634 +ENCODING 9780 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +7E +00 +00 +7E +7E +00 +00 +66 +66 +00 +00 +ENDCHAR +STARTCHAR U+2635 +ENCODING 9781 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +66 +66 +00 +00 +7E +7E +00 +00 +66 +66 +00 +00 +ENDCHAR +STARTCHAR U+2636 +ENCODING 9782 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +7E +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +ENDCHAR +STARTCHAR U+2637 +ENCODING 9783 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +66 +66 +00 +00 +ENDCHAR +STARTCHAR U+2638 +ENCODING 9784 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +49 +3E +3E +77 +3E +3E +49 +00 +00 +ENDCHAR +STARTCHAR U+2639 +ENCODING 9785 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +3C +42 +81 +A5 +81 +99 +A5 +81 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+263A +ENCODING 9786 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +42 +81 +A5 +81 +A5 +99 +42 +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+263B +ENCODING 9787 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +3C +7E +FF +DB +FF +DB +E7 +7E +3C +00 +00 +00 +ENDCHAR +STARTCHAR U+263C +ENCODING 9788 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +49 +2A +1C +77 +1C +2A +49 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+263D +ENCODING 9789 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +38 +0C +06 +05 +05 +05 +05 +06 +0C +38 +00 +00 +ENDCHAR +STARTCHAR U+263E +ENCODING 9790 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0E +18 +30 +50 +50 +50 +50 +30 +18 +0E +00 +00 +ENDCHAR +STARTCHAR U+263F +ENCODING 9791 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +22 +1C +22 +22 +22 +1C +08 +3E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2640 +ENCODING 9792 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +22 +22 +1C +08 +3E +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2641 +ENCODING 9793 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +3E +08 +08 +1C +22 +22 +22 +1C +00 +00 +00 +ENDCHAR +STARTCHAR U+2642 +ENCODING 9794 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +07 +03 +05 +38 +44 +44 +44 +38 +00 +00 +00 +ENDCHAR +STARTCHAR U+2643 +ENCODING 9795 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +02 +02 +02 +3A +46 +06 +0A +7E +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+2644 +ENCODING 9796 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +70 +20 +2C +32 +22 +24 +24 +24 +00 +00 +ENDCHAR +STARTCHAR U+2645 +ENCODING 9797 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +6B +2A +3E +2A +6B +08 +1C +14 +1C +00 +00 +ENDCHAR +STARTCHAR U+2646 +ENCODING 9798 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +59 +CB +49 +49 +49 +3E +08 +3E +08 +08 +00 +ENDCHAR +STARTCHAR U+2647 +ENCODING 9799 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7C +42 +42 +42 +7C +40 +40 +40 +40 +7E +00 +00 +ENDCHAR +STARTCHAR U+2648 +ENCODING 9800 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +22 +55 +14 +14 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2649 +ENCODING 9801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +41 +22 +1C +22 +22 +22 +1C +00 +00 +ENDCHAR +STARTCHAR U+264A +ENCODING 9802 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +41 +3E +14 +14 +14 +14 +14 +14 +3E +41 +00 +00 +ENDCHAR +STARTCHAR U+264B +ENCODING 9803 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3E +49 +48 +30 +06 +09 +49 +3E +00 +00 +ENDCHAR +STARTCHAR U+264C +ENCODING 9804 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +22 +22 +12 +74 +94 +94 +65 +02 +00 +00 +ENDCHAR +STARTCHAR U+264D +ENCODING 9805 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +54 +7C +55 +57 +55 +55 +55 +55 +06 +7C +00 +00 +ENDCHAR +STARTCHAR U+264E +ENCODING 9806 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1C +22 +22 +77 +00 +7F +00 +00 +00 +ENDCHAR +STARTCHAR U+264F +ENCODING 9807 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +54 +7C +54 +54 +54 +54 +54 +54 +55 +03 +00 +00 +ENDCHAR +STARTCHAR U+2650 +ENCODING 9808 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0F +03 +45 +29 +10 +28 +44 +00 +00 +ENDCHAR +STARTCHAR U+2651 +ENCODING 9809 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +40 +78 +48 +48 +4E +0A +0E +08 +08 +30 +00 +00 +ENDCHAR +STARTCHAR U+2652 +ENCODING 9810 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +2A +54 +00 +00 +2A +54 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+2653 +ENCODING 9811 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +42 +42 +24 +24 +7E +24 +24 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+2654 +ENCODING 9812 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +1C +49 +5D +63 +41 +22 +22 +22 +41 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2655 +ENCODING 9813 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +1C +63 +41 +22 +22 +22 +41 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2656 +ENCODING 9814 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7F +41 +41 +22 +22 +41 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2657 +ENCODING 9815 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +14 +22 +22 +22 +22 +14 +77 +41 +7F +00 +00 +ENDCHAR +STARTCHAR U+2658 +ENCODING 9816 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +1E +22 +42 +42 +3A +12 +22 +42 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+2659 +ENCODING 9817 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +24 +24 +18 +24 +24 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+265A +ENCODING 9818 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +1C +49 +5D +7F +7F +3E +3E +3E +7F +7F +7F +7F +00 +00 +ENDCHAR +STARTCHAR U+265B +ENCODING 9819 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +1C +7F +77 +3E +3E +3E +7F +7F +7F +7F +00 +00 +ENDCHAR +STARTCHAR U+265C +ENCODING 9820 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +55 +7F +7F +3E +3E +7F +7F +7F +00 +00 +ENDCHAR +STARTCHAR U+265D +ENCODING 9821 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +1C +36 +22 +36 +3E +1C +7F +7F +7F +00 +00 +ENDCHAR +STARTCHAR U+265E +ENCODING 9822 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +1E +36 +7E +7E +3E +1E +3E +7E +7E +7E +00 +00 +ENDCHAR +STARTCHAR U+265F +ENCODING 9823 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +3C +3C +18 +3C +3C +7E +7E +00 +00 +ENDCHAR +STARTCHAR U+2660 +ENCODING 9824 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +1C +3E +7F +7F +7F +3E +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+2661 +ENCODING 9825 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +36 +49 +41 +41 +41 +22 +14 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2662 +ENCODING 9826 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +14 +14 +22 +22 +14 +14 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2663 +ENCODING 9827 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +1C +1C +08 +7F +7F +6B +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+2664 +ENCODING 9828 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +14 +22 +41 +41 +41 +3E +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+2665 +ENCODING 9829 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +36 +7F +7F +7F +7F +3E +1C +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2666 +ENCODING 9830 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +1C +1C +3E +3E +1C +1C +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+2667 +ENCODING 9831 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +1C +14 +1C +08 +77 +5D +6B +08 +08 +1C +00 +00 +ENDCHAR +STARTCHAR U+2668 +ENCODING 9832 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +51 +92 +92 +92 +49 +49 +49 +52 +81 +7E +00 +00 +ENDCHAR +STARTCHAR U+2669 +ENCODING 9833 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +38 +78 +70 +00 +00 +ENDCHAR +STARTCHAR U+266A +ENCODING 9834 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +0C +0A +0A +08 +08 +08 +38 +78 +70 +00 +00 +ENDCHAR +STARTCHAR U+266B +ENCODING 9835 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +1C +17 +11 +11 +11 +11 +71 +F1 +E7 +0F +0E +00 +00 +ENDCHAR +STARTCHAR U+266C +ENCODING 9836 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +1C +17 +11 +1D +17 +11 +71 +F1 +E7 +0F +0E +00 +00 +ENDCHAR +STARTCHAR U+266D +ENCODING 9837 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +40 +40 +40 +40 +40 +5C +66 +46 +44 +48 +50 +60 +00 +00 +ENDCHAR +STARTCHAR U+266E +ENCODING 9838 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +40 +4E +7E +72 +42 +4E +7E +72 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+266F +ENCODING 9839 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +04 +24 +26 +3E +7C +64 +24 +26 +3E +7C +64 +24 +20 +00 +ENDCHAR +STARTCHAR U+2701 +ENCODING 9985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3800 +7C00 +6C00 +7C00 +3C00 +0E00 +7FFC +FFFE +D9C0 +F8E0 +7000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2702 +ENCODING 9986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7008 +F83C +D878 +FEF0 +7FE0 +07C0 +7FE0 +FEF0 +D878 +F83C +7008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2703 +ENCODING 9987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +7000 +F8E0 +D9C0 +FFFE +7FFC +0E00 +3C00 +7C00 +6C00 +7C00 +3800 +0000 +ENDCHAR +STARTCHAR U+2704 +ENCODING 9988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +700C +8832 +AE44 +8188 +7910 +0620 +7850 +8188 +AE44 +8832 +700C +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2706 +ENCODING 9990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +41C4 +47E4 +8FF2 +8F72 +9E62 +9C02 +9F02 +4F04 +4604 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2707 +ENCODING 9991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1930 +2388 +4384 +4104 +8382 +87C2 +87C2 +87C2 +8BA2 +5C74 +5834 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2708 +ENCODING 9992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0F00 +0600 +07C0 +C380 +E3C0 +7FFE +7FFE +E3C0 +C380 +07C0 +0600 +0F00 +0800 +0000 +ENDCHAR +STARTCHAR U+2709 +ENCODING 9993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +7FFE +6006 +581A +4662 +599A +6006 +7FFE +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+270C +ENCODING 9996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1830 +2448 +2288 +1290 +1110 +0920 +0820 +7CFC +9282 +9272 +9222 +9242 +7C04 +2008 +1FF0 +0000 +ENDCHAR +STARTCHAR U+270D +ENCODING 9997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +001C +0038 +03F7 +0CF5 +11CD +2385 +4705 +6FE5 +1205 +2FFD +7005 +6007 +0000 +0000 +ENDCHAR +STARTCHAR U+270E +ENCODING 9998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1800 +2600 +5500 +4A80 +7140 +28A0 +1450 +0A28 +0528 +02C8 +0118 +00F8 +0000 +0000 +ENDCHAR +STARTCHAR U+270F +ENCODING 9999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FF0 +5028 +8FF4 +A816 +8FF4 +5028 +3FF0 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2710 +ENCODING 10000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +00F8 +0118 +02C8 +0528 +0A28 +1450 +28A0 +7140 +4A80 +5500 +2600 +1800 +0000 +0000 +ENDCHAR +STARTCHAR U+2711 +ENCODING 10001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00F0 +7908 +866C +80FE +866C +7908 +00F0 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2712 +ENCODING 10002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00E0 +79F0 +FF38 +FF0E +FF38 +79F0 +00E0 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2713 +ENCODING 10003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0004 +0008 +0010 +4020 +4040 +2080 +2100 +1200 +1400 +0800 +0000 +ENDCHAR +STARTCHAR U+2714 +ENCODING 10004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0004 +000E +401C +E038 +E070 +70E0 +71C0 +3B80 +3F00 +1E00 +0C00 +0000 +ENDCHAR +STARTCHAR U+2715 +ENCODING 10005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1010 +3838 +1C70 +0EE0 +07C0 +0380 +07C0 +0EE0 +1C70 +3838 +1010 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2716 +ENCODING 10006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3838 +7C7C +FEFE +7FFC +3FF8 +1FF0 +0FE0 +1FF0 +3FF8 +7FFC +FEFE +7C7C +3838 +1010 +0000 +ENDCHAR +STARTCHAR U+2717 +ENCODING 10007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6018 +3060 +31C0 +1B00 +0E00 +0E00 +1B00 +1980 +30C0 +3060 +6030 +6018 +2000 +0000 +0000 +ENDCHAR +STARTCHAR U+2718 +ENCODING 10008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6018 +7070 +31E0 +3B80 +1F00 +0E00 +1F00 +1B80 +39C0 +30E0 +7070 +6038 +6010 +2000 +0000 +ENDCHAR +STARTCHAR U+2719 +ENCODING 10009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +0440 +0540 +0540 +0540 +FD7E +8102 +BFFA +8102 +FD7E +0540 +0540 +0540 +0440 +07C0 +0000 +ENDCHAR +STARTCHAR U+271A +ENCODING 10010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +07C0 +07C0 +07C0 +07C0 +FFFE +FFFE +FFFE +FFFE +FFFE +07C0 +07C0 +07C0 +07C0 +07C0 +0000 +ENDCHAR +STARTCHAR U+271B +ENCODING 10011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +0380 +0380 +0380 +0380 +0380 +FC7E +FC7E +FC7E +0380 +0380 +0380 +0380 +0380 +0380 +0000 +ENDCHAR +STARTCHAR U+271C +ENCODING 10012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +07C0 +07C0 +07C0 +07C0 +F83E +F83E +F83E +F83E +F83E +07C0 +07C0 +07C0 +07C0 +07C0 +0000 +ENDCHAR +STARTCHAR U+271D +ENCODING 10013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0380 +0380 +0380 +1FF0 +1FF0 +1FF0 +0380 +0380 +0380 +0380 +0380 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+271E +ENCODING 10014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0780 +04C0 +04C0 +04C0 +7CF8 +400C +400C +7CFC +3CFC +04C0 +04C0 +04C0 +04C0 +07C0 +03C0 +0000 +ENDCHAR +STARTCHAR U+271F +ENCODING 10015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FE0 +0820 +7BBC +4384 +5FF4 +5FF4 +5FF4 +4384 +7BBC +0BA0 +0BA0 +0BA0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+2720 +ENCODING 10016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +07C0 +0380 +8382 +8382 +C386 +FFFE +FFFE +FFFE +C386 +8382 +8382 +0380 +07C0 +1FF0 +0000 +ENDCHAR +STARTCHAR U+2721 +ENCODING 10017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0280 +0440 +0440 +FFFE +5014 +5014 +2008 +5014 +5014 +FFFE +0440 +0440 +0280 +0100 +0000 +ENDCHAR +STARTCHAR U+2722 +ENCODING 10018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +07C0 +07C0 +0380 +0380 +610C +F93E +FFFE +F93E +610C +0380 +0380 +07C0 +07C0 +0380 +0000 +ENDCHAR +STARTCHAR U+2723 +ENCODING 10019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +07C0 +07C0 +07C0 +0380 +711C +F93E +FFFE +F93E +711C +0380 +07C0 +07C0 +07C0 +0380 +0000 +ENDCHAR +STARTCHAR U+2724 +ENCODING 10020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +0FE0 +0FE0 +07C0 +638C +F39E +FFFE +FFFE +FFFE +F39E +638C +07C0 +0FE0 +0FE0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2725 +ENCODING 10021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +07C0 +07C0 +0100 +310C +710E +FFFF +710E +310C +0100 +07C0 +07C0 +0380 +0100 +0000 +ENDCHAR +STARTCHAR U+2726 +ENCODING 10022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +0380 +07C0 +07C0 +1FF0 +7FFC +FFFE +7FFC +1FF0 +07C0 +07C0 +0380 +0380 +0100 +0000 +ENDCHAR +STARTCHAR U+2727 +ENCODING 10023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0280 +0280 +0440 +0440 +1830 +600C +8002 +600C +1830 +0440 +0440 +0280 +0280 +0100 +0000 +ENDCHAR +STARTCHAR U+2729 +ENCODING 10025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0280 +FC7E +4004 +3838 +0820 +1010 +1110 +26C8 +2828 +3018 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+272A +ENCODING 10026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3EF8 +7EFC +7C7C +C006 +F01E +F83E +F01E +F11E +67CC +6FEC +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+272B +ENCODING 10027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0380 +0380 +FFFE +7C7C +3838 +0820 +1C70 +1FF0 +3EF8 +3838 +3018 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+272C +ENCODING 10028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0280 +FC7E +4384 +27C8 +17D0 +1390 +1010 +27C8 +2828 +3018 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+272D +ENCODING 10029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +1C70 +E10E +4FE4 +2388 +17D0 +1450 +1110 +2288 +2C68 +3018 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+272E +ENCODING 10030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +1D70 +E38E +5FF4 +2FE8 +17D0 +16D0 +1550 +2288 +2C68 +3018 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+272F +ENCODING 10031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0380 +05C0 +F9FE +5D8C +27B8 +13F0 +0FD0 +1D90 +19D0 +32E8 +2C78 +3018 +0000 +0000 +ENDCHAR +STARTCHAR U+2730 +ENCODING 10032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +02C0 +FFFE +4447 +383E +083C +16D0 +1118 +27C8 +2F2C +3C1C +180C +0000 +0000 +ENDCHAR +STARTCHAR U+2731 +ENCODING 10033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0380 +0380 +4384 +F39E +3FFC +0FF0 +3FFC +F39E +4384 +0380 +0380 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+2732 +ENCODING 10034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0380 +0380 +4384 +F39E +3C7C +0830 +3C7C +F39E +4384 +0380 +0380 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+2733 +ENCODING 10035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +2108 +1110 +0D60 +0FE0 +07C0 +FFFE +07C0 +0FE0 +0D60 +1110 +2108 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+2734 +ENCODING 10036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +2108 +1BB0 +1FF0 +0FE0 +1FE0 +FFFE +1FF0 +0FE0 +1FF0 +1BB0 +2108 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+2735 +ENCODING 10037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0280 +3CF8 +2CC8 +2698 +32B8 +7D4C +8386 +4D7C +3A98 +32C8 +2668 +3E78 +0280 +0100 +0000 +ENDCHAR +STARTCHAR U+2736 +ENCODING 10038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +4384 +3BB8 +1FF0 +0FE0 +1FF0 +3BB8 +4384 +0100 +0100 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+2737 +ENCODING 10039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +0C60 +06C0 +E6CE +3BB8 +1FF0 +07C0 +1FF0 +3BB8 +E6CE +06C0 +0C60 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+2738 +ENCODING 10040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0C60 +0EE0 +0FE0 +FFFE +7FFC +3FF8 +1FF0 +3FF8 +7FFC +FFFE +0FE0 +0EE0 +0C60 +0820 +0000 +ENDCHAR +STARTCHAR U+2739 +ENCODING 10041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1930 +0FE0 +4FE4 +7FFC +3FF8 +3FF8 +FFFE +3FF8 +3FF8 +7FFC +4FE4 +0FE0 +1930 +0100 +0000 +ENDCHAR +STARTCHAR U+273A +ENCODING 10042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0920 +4924 +2548 +1550 +CBA6 +37D8 +0FE0 +FFFE +0FE0 +37D8 +CBA6 +1550 +2548 +4924 +0920 +0000 +ENDCHAR +STARTCHAR U+273B +ENCODING 10043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +0380 +0380 +E10E +711C +0D60 +0380 +0D60 +711C +E10E +0380 +0380 +0380 +0100 +0000 +ENDCHAR +STARTCHAR U+273C +ENCODING 10044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +07C0 +07C0 +638C +F11E +F39E +3C78 +0820 +3C78 +F39E +F11E +638C +07C0 +07C0 +0380 +0000 +ENDCHAR +STARTCHAR U+273D +ENCODING 10045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +07C0 +07C0 +638C +F39E +F11E +3D78 +07C0 +3D78 +F11E +F39E +638C +07C0 +07C0 +0380 +0000 +ENDCHAR +STARTCHAR U+273E +ENCODING 10046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +0440 +0440 +745C +FC7E +FEFE +7FFC +2108 +4384 +87C2 +8FE2 +77DC +07C0 +07C0 +0380 +0000 +ENDCHAR +STARTCHAR U+273F +ENCODING 10047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +07C0 +0FE0 +77DC +FFFE +FC7E +F01E +701C +1830 +3EF8 +7FFC +7EFC +7EFC +3C78 +0000 +0000 +ENDCHAR +STARTCHAR U+2740 +ENCODING 10048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +0440 +0920 +793C +8542 +B39A +8FE2 +6FEC +17D0 +27C8 +4924 +5294 +4284 +3C78 +0000 +0000 +ENDCHAR +STARTCHAR U+2741 +ENCODING 10049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +3C78 +4544 +5114 +4D64 +6FEC +86C2 +BC7A +86C2 +6FEC +4D64 +5114 +4544 +3C78 +0380 +0000 +ENDCHAR +STARTCHAR U+2742 +ENCODING 10050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1EF0 +3EF8 +5C74 +67CC +FC7E +E82E +8822 +E82E +FC7E +67CC +5C74 +3EF8 +1EF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2743 +ENCODING 10051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +04C0 +04C0 +74DC +BCE6 +9F9E +4F3C +3FF8 +7264 +E672 +CE7A +765C +0640 +0640 +0380 +0000 +ENDCHAR +STARTCHAR U+2744 +ENCODING 10052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0540 +0380 +C926 +3118 +4D64 +0380 +4D64 +3118 +C926 +0380 +0540 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+2745 +ENCODING 10053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0540 +0BA0 +C926 +3118 +4D64 +8382 +4D64 +3118 +C926 +0BA0 +0540 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+2746 +ENCODING 10054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0920 +0D60 +07C0 +1390 +C926 +3118 +ED6E +0380 +ED6E +3118 +C926 +1110 +07C0 +0D60 +0920 +0000 +ENDCHAR +STARTCHAR U+2747 +ENCODING 10055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +23C4 +13C8 +0990 +05A0 +700E +7DBE +7DBE +700E +05A0 +0990 +13C8 +23C4 +03C0 +0000 +ENDCHAR +STARTCHAR U+2748 +ENCODING 10056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +47C4 +27C8 +1390 +0BA0 +E00E +FBBE +FBBE +FBBE +E00E +0BA0 +1390 +27C8 +47C4 +07C0 +0000 +ENDCHAR +STARTCHAR U+2749 +ENCODING 10057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +07C0 +07C0 +77DC +FBBE +F93E +7D7C +07C0 +7D7C +F93E +FBBE +77DC +07C0 +07C0 +0380 +0000 +ENDCHAR +STARTCHAR U+274A +ENCODING 10058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +3398 +3118 +0920 +0540 +638C +FFFE +638C +0540 +0920 +3118 +3398 +0380 +0100 +0000 +ENDCHAR +STARTCHAR U+274B +ENCODING 10059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +3398 +3BB8 +1930 +07C0 +77DC +FFFE +77DC +07C0 +1930 +3BB8 +3398 +0380 +0100 +0000 +ENDCHAR +STARTCHAR U+274D +ENCODING 10061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03C0 +0C30 +1008 +100C +2004 +2006 +2006 +2006 +100E +100C +0C3C +03F8 +01E0 +0000 +ENDCHAR +STARTCHAR U+274F +ENCODING 10063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +100E +100E +100E +100E +100E +100E +100E +1FFE +07FE +07FE +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2750 +ENCODING 10064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FE +07FE +1FFE +100E +100E +100E +100E +100E +100E +100E +1008 +1FF8 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2751 +ENCODING 10065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +100C +100E +100E +100E +100E +100E +100E +100E +1FFE +0FFE +07FE +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2752 +ENCODING 10066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FE +0FFE +1FFE +100E +100E +100E +100E +100E +100E +100E +100C +1FF8 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2756 +ENCODING 10070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0380 +07C0 +0380 +1110 +3838 +7C7C +3838 +1110 +0380 +07C0 +0380 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+2758 +ENCODING 10072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0000 +ENDCHAR +STARTCHAR U+2759 +ENCODING 10073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +03C0 +0000 +ENDCHAR +STARTCHAR U+275A +ENCODING 10074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0FF0 +0000 +ENDCHAR +STARTCHAR U+275B +ENCODING 10075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01C0 +0700 +0C00 +0F80 +0FC0 +0FE0 +0FE0 +0FE0 +07C0 +0380 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+275C +ENCODING 10076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +07C0 +0FE0 +0FE0 +0FE0 +07E0 +03E0 +0060 +01C0 +0700 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+275D +ENCODING 10077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1C1C +7070 +C0C0 +F8F8 +FCFC +FEFE +FEFE +FEFE +7C7C +3838 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+275E +ENCODING 10078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3838 +7C7C +FEFE +FEFE +FEFE +7E7E +3E3E +0606 +1C1C +7070 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2761 +ENCODING 10081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +0FFE +3FF8 +7E10 +7E10 +3F10 +0FF0 +0010 +3030 +7820 +7860 +31C0 +1F00 +0000 +ENDCHAR +STARTCHAR U+2762 +ENCODING 10082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +0FE0 +1FF0 +1FF0 +1FF0 +0FE0 +0380 +0100 +0100 +0000 +0380 +07C0 +07C0 +07C0 +0380 +0000 +ENDCHAR +STARTCHAR U+2763 +ENCODING 10083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0EE0 +1FF0 +1FF0 +1FF0 +0FE0 +0380 +0100 +0000 +0380 +07C0 +07C0 +07C0 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+2764 +ENCODING 10084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3C78 +7EFC +FFFE +FFFE +FFFE +7FFC +7FFC +3FF8 +1FF0 +0FE0 +07C0 +0380 +0100 +0000 +ENDCHAR +STARTCHAR U+2765 +ENCODING 10085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1C00 +3F00 +7F80 +7FC0 +7FE0 +7FF0 +3FF8 +1FFC +3FF8 +7FF0 +7FE0 +7FC0 +7F80 +3F00 +1C00 +0000 +ENDCHAR +STARTCHAR U+2766 +ENCODING 10086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +0C86 +388E +67F8 +0100 +3938 +7EFC +FFFE +FFFE +7FFC +3FF8 +1FE2 +07EE +00F8 +0000 +ENDCHAR +STARTCHAR U+2767 +ENCODING 10087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +30CC +31E4 +1BF6 +0BF2 +0BFE +09FE +39FE +4EFC +49FC +29FC +33F8 +13F8 +1BF0 +09E0 +00C0 +ENDCHAR +STARTCHAR U+2776 +ENCODING 10102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +7EFC +7CFC +FAFE +FEFE +FEFE +FEFE +FEFE +7EFC +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2777 +ENCODING 10103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +77DC +FFDE +FFDE +FF3E +FCFE +FBFE +77DC +701C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2778 +ENCODING 10104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +77DC +FFDE +FFDE +FF3E +FFDE +FFDE +77DC +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2779 +ENCODING 10105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +7FBC +7F3C +FEBE +FDBE +FBBE +F7BE +E00E +7FBC +7E0C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+277A +ENCODING 10106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +701C +77FC +F7FE +F03E +FFDE +FFDE +FFDE +77DC +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+277B +ENCODING 10107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +77DC +F7FE +F7FE +F03E +F7DE +F7DE +77DC +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+277C +ENCODING 10108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +701C +77DC +FFBE +FFBE +FF7E +FEFE +FEFE +7DFC +7DFC +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+277D +ENCODING 10109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +77DC +F7DE +F7DE +F83E +F7DE +F7DE +77DC +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+277E +ENCODING 10110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +77DC +F7DE +F7DE +F81E +FFDE +FFDE +77DC +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+277F +ENCODING 10111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +771C +66EC +F6EE +F6EE +F6EE +F6EE +F6EE +76EC +631C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2780 +ENCODING 10112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4084 +4184 +8382 +8182 +8182 +8182 +8182 +4184 +4184 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2781 +ENCODING 10113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4FE4 +8C62 +8062 +81C2 +8702 +8C02 +4FE4 +4FE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2782 +ENCODING 10114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4FE4 +8C62 +8062 +81C2 +8062 +8C62 +4FE4 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2783 +ENCODING 10115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +40E4 +41E4 +8362 +8662 +8C62 +9FF2 +9FF2 +4064 +4064 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2784 +ENCODING 10116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4FE4 +4FE4 +8C02 +8FC2 +8FE2 +8062 +8C62 +4FE4 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2785 +ENCODING 10117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4FE4 +8C02 +8FC2 +8FE2 +8C62 +8C62 +4FE4 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2786 +ENCODING 10118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +4FE4 +4FE4 +8062 +8062 +80C2 +8382 +8602 +4604 +4604 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2787 +ENCODING 10119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4FE4 +8C62 +8C62 +87C2 +8C62 +8C62 +4FE4 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2788 +ENCODING 10120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +47C4 +4FE4 +8C62 +8C62 +8FE2 +87E2 +8062 +4FE4 +47C4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+2789 +ENCODING 10121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1830 +2008 +44E4 +4DF4 +9DB2 +8DB2 +8DB2 +8DB2 +8DB2 +4DF4 +4CE4 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+278A +ENCODING 10122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +7F7C +7E7C +FC7E +FE7E +FE7E +FE7E +FE7E +7E7C +7E7C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+278B +ENCODING 10123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +701C +F39E +FF9E +FE3E +F8FE +F3FE +701C +701C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+278C +ENCODING 10124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +701C +F39E +FF9E +FE3E +FF9E +F39E +701C +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+278D +ENCODING 10125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +7F1C +7E1C +FC9E +F99E +F39E +E00E +E00E +7F9C +7F9C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+278E +ENCODING 10126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +701C +701C +F3FE +F03E +F01E +FF9E +F39E +701C +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+278F +ENCODING 10127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +701C +F3FE +F03E +F01E +F39E +F39E +701C +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2790 +ENCODING 10128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +701C +701C +FF9E +FF9E +FF3E +FC7E +F9FE +79FC +79FC +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2791 +ENCODING 10129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +701C +F39E +F39E +F83E +F39E +F39E +701C +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2792 +ENCODING 10130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +783C +701C +F39E +F39E +F01E +F81E +FF9E +701C +783C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2793 +ENCODING 10131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3FF8 +7B1C +720C +E24E +F24E +F24E +F24E +F24E +720C +731C +3FF8 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+2794 +ENCODING 10132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1F80 +0FC0 +07E0 +03F0 +FFF8 +FFFC +FFFE +FFFC +FFF8 +03F0 +07E0 +0FC0 +1F80 +0000 +0000 +ENDCHAR +STARTCHAR U+2798 +ENCODING 10136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +1C00 +3E00 +1E00 +0F20 +0320 +00E0 +00F0 +03F0 +0070 +0008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2799 +ENCODING 10137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0100 +0180 +E0C0 +FCF0 +FFFE +FCF0 +E0C0 +0180 +0100 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+279A +ENCODING 10138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0008 +0070 +03F0 +00F0 +00E0 +0320 +0F20 +1E00 +3E00 +1C00 +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+279B +ENCODING 10139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0200 +0100 +01C0 +00F0 +FFFE +00F0 +01C0 +0100 +0200 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+279C +ENCODING 10140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00C0 +01E0 +01F0 +00F8 +7FFC +FFFE +FFFE +FFFE +7FFC +00F8 +01F0 +01E0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+279D +ENCODING 10141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0010 +0010 +0018 +0018 +FFFC +FFFE +FFFC +0018 +0018 +0010 +0010 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+279E +ENCODING 10142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +0018 +0018 +FFFC +FFFC +FFFE +FFFC +FFFC +0018 +0018 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+279F +ENCODING 10143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0020 +0030 +0038 +AAFC +AAFE +AAFC +0038 +0030 +0020 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27A0 +ENCODING 10144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0020 +0030 +AAF8 +AAFC +AAFE +AAFC +AAF8 +0030 +0020 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27A1 +ENCODING 10145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0020 +0030 +0038 +FFFC +FFFE +FFFC +0038 +0030 +0020 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27A2 +ENCODING 10146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +7000 +2C00 +2300 +10C0 +1030 +080C +07FE +0FFC +1FF0 +1FC0 +3F00 +3C00 +7000 +4000 +0000 +ENDCHAR +STARTCHAR U+27A3 +ENCODING 10147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +7000 +3C00 +3F00 +1FC0 +1FF0 +0FFC +07FE +080C +1030 +10C0 +2300 +2C00 +7000 +4000 +0000 +ENDCHAR +STARTCHAR U+27A4 +ENCODING 10148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +7000 +3C00 +3F00 +1FC0 +1FF0 +0FFC +07FE +0FFC +1FF0 +1FC0 +3F00 +3C00 +7000 +4000 +0000 +ENDCHAR +STARTCHAR U+27A5 +ENCODING 10149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8000 +8010 +C018 +7FFC +7FFE +3FFC +0018 +0010 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27A6 +ENCODING 10150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0010 +0018 +3FFC +7FFE +7FFC +C018 +8010 +8000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27A7 +ENCODING 10151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +00C0 +07C0 +07E0 +07E0 +07F0 +07E0 +07E0 +07C0 +00C0 +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+27A8 +ENCODING 10152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0040 +0040 +FFE0 +FFF0 +FFFE +FFF0 +FFE0 +0040 +0040 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27A9 +ENCODING 10153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0060 +0070 +7FD8 +400C +4006 +400C +7FD8 +0070 +0060 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27AA +ENCODING 10154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0060 +0070 +7FE8 +6004 +6002 +6004 +7FE8 +0070 +0060 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27AB +ENCODING 10155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0008 +0018 +0024 +0044 +3F82 +4002 +8006 +FF1E +FE7C +05F0 +0FC0 +0F00 +0C00 +0000 +ENDCHAR +STARTCHAR U+27AC +ENCODING 10156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C00 +0F00 +0FC0 +05F0 +FE7C +FF1E +8006 +4002 +3F82 +0044 +0024 +0018 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+27AD +ENCODING 10157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0080 +00C0 +FFA0 +8010 +8008 +8004 +800E +801C +FFB8 +7FF0 +00E0 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+27AE +ENCODING 10158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +00E0 +7FF0 +FFB8 +801C +800E +8004 +8008 +8010 +FFA0 +00C0 +0080 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27AF +ENCODING 10159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0040 +0060 +0050 +FFC8 +4004 +4002 +4007 +FFCE +7FDC +0078 +0070 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+27B0 +ENCODING 10160 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +18 +1C +F6 +F7 +43 +83 +F6 +14 +18 +10 +00 +00 +ENDCHAR +STARTCHAR U+27B1 +ENCODING 10161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +0070 +0078 +7FDC +FFCE +4007 +4002 +4004 +FFC8 +0050 +0060 +0040 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27B2 +ENCODING 10162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07C0 +1FF0 +3F78 +7F3C +7F1C +000E +0006 +0002 +0006 +000E +7F1C +7F3C +3F78 +1FF0 +07C0 +0000 +ENDCHAR +STARTCHAR U+27B3 +ENCODING 10163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +FE00 +4908 +248C +1FFE +248C +4908 +FE00 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27B4 +ENCODING 10164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0600 +0700 +3F00 +1F00 +0F08 +0088 +0058 +0038 +0078 +01F8 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27B5 +ENCODING 10165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +7C08 +3E0C +1FFE +3E0C +7C08 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27B6 +ENCODING 10166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +01F8 +0078 +0038 +0058 +0088 +0F08 +1F00 +3F00 +0700 +0600 +0400 +0000 +0000 +ENDCHAR +STARTCHAR U+27B7 +ENCODING 10167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0300 +0380 +0380 +3F88 +1F88 +0FD8 +00F8 +0078 +00F8 +03F8 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27B8 +ENCODING 10168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0020 +FC10 +7E18 +3FFC +1FFE +3FFC +7E18 +FC10 +0020 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27B9 +ENCODING 10169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +03F8 +00F8 +0078 +00F8 +0FD8 +1F88 +3F88 +0380 +0380 +0300 +0200 +0000 +0000 +ENDCHAR +STARTCHAR U+27BA +ENCODING 10170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0060 +00F0 +00F0 +7838 +FF0C +FFFE +FF0C +7838 +00F0 +00F0 +0060 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27BB +ENCODING 10171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0040 +60E0 +78F0 +FC78 +FFFE +FC78 +78F0 +60E0 +0040 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27BC +ENCODING 10172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +F810 +7C18 +3E1C +1FFE +3E1C +7C18 +F810 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27BD +ENCODING 10173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +F860 +FC70 +7E78 +7FFC +3FFE +7FFC +7E78 +FC70 +F860 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+27BE +ENCODING 10174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0220 +0110 +0088 +FFC4 +0002 +FFC4 +0088 +0110 +0220 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+2800 +ENCODING 10240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2801 +ENCODING 10241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2802 +ENCODING 10242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2803 +ENCODING 10243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2804 +ENCODING 10244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2805 +ENCODING 10245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2806 +ENCODING 10246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2807 +ENCODING 10247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2808 +ENCODING 10248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2809 +ENCODING 10249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+280A +ENCODING 10250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+280B +ENCODING 10251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+280C +ENCODING 10252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+280D +ENCODING 10253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+280E +ENCODING 10254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+280F +ENCODING 10255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +22 +00 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2810 +ENCODING 10256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2811 +ENCODING 10257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2812 +ENCODING 10258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2813 +ENCODING 10259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2814 +ENCODING 10260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2815 +ENCODING 10261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2816 +ENCODING 10262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2817 +ENCODING 10263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2818 +ENCODING 10264 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2819 +ENCODING 10265 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+281A +ENCODING 10266 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+281B +ENCODING 10267 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+281C +ENCODING 10268 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+281D +ENCODING 10269 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+281E +ENCODING 10270 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+281F +ENCODING 10271 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +32 +30 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2820 +ENCODING 10272 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2821 +ENCODING 10273 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2822 +ENCODING 10274 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2823 +ENCODING 10275 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2824 +ENCODING 10276 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2825 +ENCODING 10277 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2826 +ENCODING 10278 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2827 +ENCODING 10279 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2828 +ENCODING 10280 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2829 +ENCODING 10281 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+282A +ENCODING 10282 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+282B +ENCODING 10283 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+282C +ENCODING 10284 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+282D +ENCODING 10285 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+282E +ENCODING 10286 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+282F +ENCODING 10287 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +26 +06 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2830 +ENCODING 10288 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2831 +ENCODING 10289 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2832 +ENCODING 10290 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2833 +ENCODING 10291 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2834 +ENCODING 10292 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2835 +ENCODING 10293 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2836 +ENCODING 10294 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2837 +ENCODING 10295 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2838 +ENCODING 10296 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2839 +ENCODING 10297 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+283A +ENCODING 10298 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+283B +ENCODING 10299 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+283C +ENCODING 10300 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+283D +ENCODING 10301 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+283E +ENCODING 10302 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+283F +ENCODING 10303 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +36 +36 +00 +22 +00 +00 +00 +ENDCHAR +STARTCHAR U+2840 +ENCODING 10304 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2841 +ENCODING 10305 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2842 +ENCODING 10306 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2843 +ENCODING 10307 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2844 +ENCODING 10308 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2845 +ENCODING 10309 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2846 +ENCODING 10310 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2847 +ENCODING 10311 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2848 +ENCODING 10312 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2849 +ENCODING 10313 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+284A +ENCODING 10314 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+284B +ENCODING 10315 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+284C +ENCODING 10316 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+284D +ENCODING 10317 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+284E +ENCODING 10318 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+284F +ENCODING 10319 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +22 +00 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2850 +ENCODING 10320 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2851 +ENCODING 10321 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2852 +ENCODING 10322 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2853 +ENCODING 10323 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2854 +ENCODING 10324 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2855 +ENCODING 10325 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2856 +ENCODING 10326 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2857 +ENCODING 10327 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2858 +ENCODING 10328 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2859 +ENCODING 10329 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+285A +ENCODING 10330 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+285B +ENCODING 10331 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+285C +ENCODING 10332 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+285D +ENCODING 10333 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+285E +ENCODING 10334 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+285F +ENCODING 10335 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +32 +30 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2860 +ENCODING 10336 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2861 +ENCODING 10337 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2862 +ENCODING 10338 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2863 +ENCODING 10339 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2864 +ENCODING 10340 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2865 +ENCODING 10341 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2866 +ENCODING 10342 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2867 +ENCODING 10343 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2868 +ENCODING 10344 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2869 +ENCODING 10345 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+286A +ENCODING 10346 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+286B +ENCODING 10347 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+286C +ENCODING 10348 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+286D +ENCODING 10349 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+286E +ENCODING 10350 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+286F +ENCODING 10351 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +26 +06 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2870 +ENCODING 10352 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2871 +ENCODING 10353 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2872 +ENCODING 10354 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2873 +ENCODING 10355 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2874 +ENCODING 10356 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2875 +ENCODING 10357 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2876 +ENCODING 10358 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2877 +ENCODING 10359 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2878 +ENCODING 10360 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2879 +ENCODING 10361 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+287A +ENCODING 10362 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+287B +ENCODING 10363 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+287C +ENCODING 10364 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+287D +ENCODING 10365 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+287E +ENCODING 10366 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+287F +ENCODING 10367 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +36 +36 +00 +32 +30 +00 +00 +ENDCHAR +STARTCHAR U+2880 +ENCODING 10368 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2881 +ENCODING 10369 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2882 +ENCODING 10370 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2883 +ENCODING 10371 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2884 +ENCODING 10372 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2885 +ENCODING 10373 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2886 +ENCODING 10374 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2887 +ENCODING 10375 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2888 +ENCODING 10376 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2889 +ENCODING 10377 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+288A +ENCODING 10378 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+288B +ENCODING 10379 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+288C +ENCODING 10380 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+288D +ENCODING 10381 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+288E +ENCODING 10382 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+288F +ENCODING 10383 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +22 +00 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2890 +ENCODING 10384 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2891 +ENCODING 10385 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2892 +ENCODING 10386 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2893 +ENCODING 10387 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2894 +ENCODING 10388 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2895 +ENCODING 10389 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2896 +ENCODING 10390 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2897 +ENCODING 10391 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2898 +ENCODING 10392 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+2899 +ENCODING 10393 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+289A +ENCODING 10394 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+289B +ENCODING 10395 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+289C +ENCODING 10396 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+289D +ENCODING 10397 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+289E +ENCODING 10398 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+289F +ENCODING 10399 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +32 +30 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A0 +ENCODING 10400 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A1 +ENCODING 10401 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A2 +ENCODING 10402 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A3 +ENCODING 10403 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A4 +ENCODING 10404 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A5 +ENCODING 10405 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A6 +ENCODING 10406 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A7 +ENCODING 10407 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A8 +ENCODING 10408 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28A9 +ENCODING 10409 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28AA +ENCODING 10410 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28AB +ENCODING 10411 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28AC +ENCODING 10412 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28AD +ENCODING 10413 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28AE +ENCODING 10414 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28AF +ENCODING 10415 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +26 +06 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B0 +ENCODING 10416 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B1 +ENCODING 10417 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B2 +ENCODING 10418 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B3 +ENCODING 10419 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B4 +ENCODING 10420 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B5 +ENCODING 10421 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B6 +ENCODING 10422 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B7 +ENCODING 10423 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B8 +ENCODING 10424 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28B9 +ENCODING 10425 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28BA +ENCODING 10426 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28BB +ENCODING 10427 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28BC +ENCODING 10428 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28BD +ENCODING 10429 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28BE +ENCODING 10430 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28BF +ENCODING 10431 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +36 +36 +00 +26 +06 +00 +00 +ENDCHAR +STARTCHAR U+28C0 +ENCODING 10432 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C1 +ENCODING 10433 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C2 +ENCODING 10434 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C3 +ENCODING 10435 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C4 +ENCODING 10436 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C5 +ENCODING 10437 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C6 +ENCODING 10438 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C7 +ENCODING 10439 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C8 +ENCODING 10440 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28C9 +ENCODING 10441 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28CA +ENCODING 10442 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28CB +ENCODING 10443 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28CC +ENCODING 10444 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28CD +ENCODING 10445 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28CE +ENCODING 10446 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28CF +ENCODING 10447 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +22 +00 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D0 +ENCODING 10448 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D1 +ENCODING 10449 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D2 +ENCODING 10450 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D3 +ENCODING 10451 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D4 +ENCODING 10452 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D5 +ENCODING 10453 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D6 +ENCODING 10454 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D7 +ENCODING 10455 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D8 +ENCODING 10456 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28D9 +ENCODING 10457 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28DA +ENCODING 10458 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28DB +ENCODING 10459 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28DC +ENCODING 10460 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28DD +ENCODING 10461 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28DE +ENCODING 10462 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28DF +ENCODING 10463 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +32 +30 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E0 +ENCODING 10464 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E1 +ENCODING 10465 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E2 +ENCODING 10466 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E3 +ENCODING 10467 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E4 +ENCODING 10468 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E5 +ENCODING 10469 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E6 +ENCODING 10470 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E7 +ENCODING 10471 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E8 +ENCODING 10472 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28E9 +ENCODING 10473 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28EA +ENCODING 10474 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28EB +ENCODING 10475 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28EC +ENCODING 10476 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28ED +ENCODING 10477 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28EE +ENCODING 10478 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28EF +ENCODING 10479 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +26 +06 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F0 +ENCODING 10480 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +22 +00 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F1 +ENCODING 10481 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +22 +00 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F2 +ENCODING 10482 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +22 +00 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F3 +ENCODING 10483 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +22 +00 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F4 +ENCODING 10484 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +32 +30 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F5 +ENCODING 10485 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +32 +30 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F6 +ENCODING 10486 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +32 +30 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F7 +ENCODING 10487 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +32 +30 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F8 +ENCODING 10488 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +26 +06 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28F9 +ENCODING 10489 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +26 +06 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28FA +ENCODING 10490 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +26 +06 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28FB +ENCODING 10491 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +26 +06 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28FC +ENCODING 10492 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +22 +00 +00 +36 +36 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28FD +ENCODING 10493 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +32 +30 +00 +36 +36 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28FE +ENCODING 10494 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +26 +06 +00 +36 +36 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+28FF +ENCODING 10495 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +36 +36 +00 +36 +36 +00 +36 +36 +00 +36 +36 +00 +00 +ENDCHAR +STARTCHAR U+3000 +ENCODING 12288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3001 +ENCODING 12289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +4000 +3000 +1800 +0800 +0000 +ENDCHAR +STARTCHAR U+3002 +ENCODING 12290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3000 +4800 +4800 +3000 +0000 +ENDCHAR +STARTCHAR U+3003 +ENCODING 12291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0440 +0440 +0440 +0880 +0880 +1100 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3004 +ENCODING 12292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0700 +1830 +2028 +4024 +4124 +81C2 +8102 +8D02 +9302 +9102 +4804 +4404 +2408 +1830 +01C0 +0000 +ENDCHAR +STARTCHAR U+3005 +ENCODING 12293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0200 +0200 +03F0 +0420 +0420 +0840 +1280 +0180 +0040 +0020 +0000 +ENDCHAR +STARTCHAR U+3006 +ENCODING 12294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0010 +0010 +0020 +0640 +0980 +0900 +1280 +1400 +1800 +1000 +2000 +0000 +0000 +ENDCHAR +STARTCHAR U+3007 +ENCODING 12295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07C0 +1830 +2008 +2008 +4004 +4004 +4004 +4004 +4004 +2008 +2008 +1830 +07C0 +0000 +ENDCHAR +STARTCHAR U+3008 +ENCODING 12296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0010 +0020 +0040 +0080 +0100 +0200 +0200 +0100 +0080 +0040 +0020 +0010 +0008 +0000 +ENDCHAR +STARTCHAR U+3009 +ENCODING 12297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +2000 +1000 +0800 +0400 +0200 +0100 +0100 +0200 +0400 +0800 +1000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+300A +ENCODING 12298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +0048 +0090 +0090 +0120 +0120 +0240 +0240 +0120 +0120 +0090 +0090 +0048 +0048 +0000 +ENDCHAR +STARTCHAR U+300B +ENCODING 12299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4800 +4800 +2400 +2400 +1200 +1200 +0900 +0900 +1200 +1200 +2400 +2400 +4800 +4800 +0000 +ENDCHAR +STARTCHAR U+300C +ENCODING 12300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01F8 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+300D +ENCODING 12301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +0200 +7E00 +0000 +ENDCHAR +STARTCHAR U+300E +ENCODING 12302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03F8 +0208 +02F8 +0280 +0280 +0280 +0280 +0280 +0280 +0280 +0280 +0280 +0280 +0380 +0000 +ENDCHAR +STARTCHAR U+300F +ENCODING 12303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0700 +0500 +0500 +0500 +0500 +0500 +0500 +0500 +0500 +0500 +0500 +7D00 +4100 +7F00 +0000 +ENDCHAR +STARTCHAR U+3010 +ENCODING 12304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00F8 +00F0 +00E0 +00E0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00E0 +00E0 +00F0 +00F8 +0000 +ENDCHAR +STARTCHAR U+3011 +ENCODING 12305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7C00 +3C00 +1C00 +1C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +1C00 +1C00 +3C00 +7C00 +0000 +ENDCHAR +STARTCHAR U+3012 +ENCODING 12306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +3FF0 +0000 +0000 +7FF8 +7FF8 +0300 +0300 +0300 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+3013 +ENCODING 12307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3FF0 +3FF0 +0000 +0000 +3FF0 +3FF0 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3014 +ENCODING 12308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0010 +0020 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0040 +0020 +0010 +0008 +0000 +ENDCHAR +STARTCHAR U+3015 +ENCODING 12309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +2000 +1000 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +1000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+3016 +ENCODING 12310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00FE +0084 +0088 +0088 +0090 +0090 +0090 +0090 +0090 +0090 +0088 +0088 +0084 +00FE +0000 +ENDCHAR +STARTCHAR U+3017 +ENCODING 12311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE00 +4200 +2200 +2200 +1200 +1200 +1200 +1200 +1200 +1200 +2200 +2200 +4200 +FE00 +0000 +ENDCHAR +STARTCHAR U+301A +ENCODING 12314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0900 +0900 +0900 +0900 +0900 +0900 +0900 +0900 +0900 +0900 +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+301B +ENCODING 12315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0090 +0090 +0090 +0090 +0090 +0090 +0090 +0090 +0090 +0090 +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+301C +ENCODING 12316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +1C00 +2208 +4110 +00E0 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+301D +ENCODING 12317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +EE00 +6600 +2200 +1100 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+301E +ENCODING 12318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00EE +00CC +0088 +0110 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+301F +ENCODING 12319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +00EE +00CC +0088 +0110 +0000 +ENDCHAR +STARTCHAR U+3020 +ENCODING 12320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +7FFE +0000 +7FFE +7FFE +0180 +6DB6 +4DB2 +4002 +6816 +2424 +23C4 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3021 +ENCODING 12321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0180 +0080 +0000 +ENDCHAR +STARTCHAR U+3022 +ENCODING 12322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0060 +0260 +0660 +0660 +0660 +0660 +0660 +0660 +0660 +0660 +0660 +0660 +0260 +0060 +0020 +0000 +ENDCHAR +STARTCHAR U+3023 +ENCODING 12323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0018 +0818 +1818 +1898 +1998 +1998 +1998 +1998 +1998 +1998 +1998 +1898 +0818 +0018 +0008 +0000 +ENDCHAR +STARTCHAR U+3024 +ENCODING 12324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +600C +3018 +1830 +0C60 +06C0 +0380 +0380 +06C0 +0C60 +1830 +3018 +600C +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3025 +ENCODING 12325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0198 +0198 +0330 +0360 +03C0 +01C0 +0360 +0630 +0630 +0630 +0630 +0660 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+3026 +ENCODING 12326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0180 +0180 +0180 +0188 +3FFC +3FFE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3027 +ENCODING 12327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0180 +0180 +0188 +7FFC +7FFE +0000 +0020 +1FF0 +1FF8 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3028 +ENCODING 12328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0300 +0300 +0320 +7FF0 +7FF8 +0000 +0000 +1FE0 +1FE0 +0000 +0008 +FFFC +FFFE +0000 +0000 +ENDCHAR +STARTCHAR U+3029 +ENCODING 12329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0300 +0600 +0FF8 +1FFC +1818 +0C30 +0660 +03C0 +0180 +03C0 +0670 +1C3E +380C +0000 +0000 +ENDCHAR +STARTCHAR U+3041 +ENCODING 12353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0400 +0200 +1380 +0E00 +0480 +07E0 +0D10 +1610 +2610 +2A20 +10C0 +0000 +ENDCHAR +STARTCHAR U+3042 +ENCODING 12354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0200 +02C0 +1F00 +0480 +0480 +07E0 +0D10 +1508 +2208 +2608 +2A10 +1060 +0000 +0000 +ENDCHAR +STARTCHAR U+3043 +ENCODING 12355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1040 +1020 +1010 +1030 +0A00 +0C00 +0400 +0000 +0000 +ENDCHAR +STARTCHAR U+3044 +ENCODING 12356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +4000 +2060 +2010 +2008 +2208 +2418 +1408 +1800 +0800 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3045 +ENCODING 12357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0200 +0180 +0000 +1380 +0C40 +0040 +0040 +0040 +0080 +0300 +0000 +ENDCHAR +STARTCHAR U+3046 +ENCODING 12358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +01C0 +0000 +0000 +03C0 +1C20 +0020 +0020 +0020 +0020 +0040 +0040 +0080 +0100 +0000 +ENDCHAR +STARTCHAR U+3047 +ENCODING 12359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0200 +0180 +0000 +01C0 +0E80 +0100 +0200 +0700 +0900 +10F0 +0000 +ENDCHAR +STARTCHAR U+3048 +ENCODING 12360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0380 +0000 +0000 +11C0 +0E80 +0100 +0200 +0400 +0E00 +1100 +2100 +20F8 +0000 +0000 +ENDCHAR +STARTCHAR U+3049 +ENCODING 12361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +1040 +0830 +0C20 +3800 +0BC0 +0C20 +1820 +2820 +18C0 +0800 +0000 +ENDCHAR +STARTCHAR U+304A +ENCODING 12362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +0430 +0508 +060C +1C00 +0460 +0590 +0608 +0C08 +3488 +0C70 +0400 +0000 +0000 +ENDCHAR +STARTCHAR U+304B +ENCODING 12363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +0400 +0460 +4710 +3C88 +0898 +0880 +0880 +1080 +1100 +2500 +2200 +0000 +0000 +ENDCHAR +STARTCHAR U+304C +ENCODING 12364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0824 +0410 +0440 +4720 +3C90 +0888 +0898 +0880 +1080 +1100 +2500 +2200 +0000 +0000 +ENDCHAR +STARTCHAR U+304D +ENCODING 12365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0100 +0160 +0F80 +0080 +00F0 +1F40 +0020 +0020 +07F0 +0810 +0800 +0600 +01C0 +0000 +ENDCHAR +STARTCHAR U+304E +ENCODING 12366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0224 +02D0 +1F00 +0100 +01E0 +3E80 +0040 +0040 +0FE0 +1020 +1000 +0C00 +0380 +0000 +ENDCHAR +STARTCHAR U+304F +ENCODING 12367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0040 +0040 +0080 +0100 +0600 +0800 +0800 +0400 +0200 +0100 +0080 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+3050 +ENCODING 12368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0040 +0040 +0088 +0124 +0610 +0800 +0800 +0400 +0200 +0100 +0080 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+3051 +ENCODING 12369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +2040 +1020 +1020 +103C +23E0 +2020 +2020 +2020 +2020 +1820 +1040 +1040 +0080 +0000 +ENDCHAR +STARTCHAR U+3052 +ENCODING 12370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +40A4 +2050 +2040 +2078 +47C0 +4040 +4040 +4040 +4040 +3040 +2080 +2080 +0100 +0000 +ENDCHAR +STARTCHAR U+3053 +ENCODING 12371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +07E0 +0080 +0100 +0000 +0000 +0000 +0000 +2000 +2000 +1010 +0FE0 +0000 +0000 +ENDCHAR +STARTCHAR U+3054 +ENCODING 12372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0804 +07F0 +0088 +0100 +0000 +0000 +0000 +0000 +2000 +2000 +1010 +0FE0 +0000 +0000 +ENDCHAR +STARTCHAR U+3055 +ENCODING 12373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0200 +0130 +21C0 +1E80 +0040 +0040 +07E0 +0820 +1000 +1000 +0C00 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+3056 +ENCODING 12374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0204 +0130 +21C8 +1E80 +0040 +0040 +07E0 +0820 +1000 +1000 +0C00 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+3057 +ENCODING 12375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1000 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0808 +0810 +0460 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+3058 +ENCODING 12376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1020 +0890 +0840 +0800 +0800 +0800 +0800 +0800 +0808 +0810 +0460 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+3059 +ENCODING 12377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0080 +40F8 +3F80 +0080 +0380 +04C0 +0440 +03C0 +0040 +0080 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+305A +ENCODING 12378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0128 +0094 +40F8 +3F80 +0080 +0380 +04C0 +0440 +03C0 +0040 +0080 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+305B +ENCODING 12379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0080 +1040 +0840 +0878 +4BC0 +3C40 +0840 +0840 +08C0 +0840 +0400 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+305C +ENCODING 12380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0084 +1050 +0848 +0878 +4BC0 +3C40 +0840 +0840 +08C0 +0840 +0400 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+305D +ENCODING 12381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +09C0 +0640 +0080 +0100 +0238 +07C0 +3880 +0100 +0200 +0200 +0200 +0100 +00E0 +0000 +ENDCHAR +STARTCHAR U+305E +ENCODING 12382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +09C8 +0664 +0090 +0100 +0238 +07C0 +3880 +0100 +0200 +0200 +0200 +0100 +00E0 +0000 +ENDCHAR +STARTCHAR U+305F +ENCODING 12383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +0480 +0700 +3C00 +08F0 +0818 +0820 +1000 +1000 +1100 +2100 +20F8 +0000 +0000 +ENDCHAR +STARTCHAR U+3060 +ENCODING 12384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0824 +0490 +0700 +3C00 +08F0 +0818 +0820 +1000 +1000 +1100 +2100 +20F8 +0000 +0000 +ENDCHAR +STARTCHAR U+3061 +ENCODING 12385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0400 +04C0 +4700 +3C00 +0800 +08C0 +0B20 +1C10 +1010 +0010 +0020 +00C0 +0700 +0000 +ENDCHAR +STARTCHAR U+3062 +ENCODING 12386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0408 +04C4 +4710 +3C08 +0800 +08C0 +0B20 +1C10 +1010 +0010 +0020 +00C0 +0700 +0000 +ENDCHAR +STARTCHAR U+3063 +ENCODING 12387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +01C0 +0620 +3810 +0010 +0010 +0020 +00C0 +0700 +0000 +ENDCHAR +STARTCHAR U+3064 +ENCODING 12388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +03E0 +4C10 +3008 +0008 +0008 +0008 +0010 +0060 +0380 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3065 +ENCODING 12389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0024 +0010 +03E0 +4C10 +3008 +0008 +0008 +0008 +0010 +0060 +0380 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3066 +ENCODING 12390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0038 +43C0 +3C80 +0100 +0100 +0200 +0200 +0200 +0200 +0200 +0100 +00E0 +0000 +0000 +ENDCHAR +STARTCHAR U+3067 +ENCODING 12391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0038 +43C0 +3C88 +0124 +0110 +0200 +0200 +0200 +0200 +0200 +0100 +00E0 +0000 +0000 +ENDCHAR +STARTCHAR U+3068 +ENCODING 12392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0200 +0200 +0200 +0270 +0380 +0600 +0800 +1000 +1000 +0800 +07F0 +0000 +0000 +ENDCHAR +STARTCHAR U+3069 +ENCODING 12393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0408 +0224 +0210 +0200 +0270 +0380 +0600 +0800 +1000 +1000 +0800 +07F0 +0000 +0000 +ENDCHAR +STARTCHAR U+306A +ENCODING 12394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0200 +0280 +3F00 +0470 +0818 +0820 +1040 +1040 +2040 +03C0 +0460 +0450 +0380 +0000 +ENDCHAR +STARTCHAR U+306B +ENCODING 12395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2000 +1000 +10F0 +1318 +2020 +2000 +2000 +2000 +2200 +2A00 +11F8 +1000 +1000 +0000 +ENDCHAR +STARTCHAR U+306C +ENCODING 12396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0080 +0080 +13E0 +1510 +1908 +1208 +2A08 +4C08 +4C68 +5490 +2068 +0000 +0000 +ENDCHAR +STARTCHAR U+306D +ENCODING 12397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0800 +0800 +0800 +4CE0 +3F10 +0C10 +0810 +1810 +1810 +28F0 +5918 +08E0 +0000 +0000 +ENDCHAR +STARTCHAR U+306E +ENCODING 12398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +03C0 +0D20 +1110 +1108 +2208 +2208 +2408 +2410 +2810 +1060 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+306F +ENCODING 12399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2020 +1020 +1438 +13E0 +2020 +2020 +2020 +2020 +29E0 +1230 +1228 +11C0 +0000 +0000 +ENDCHAR +STARTCHAR U+3070 +ENCODING 12400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +4044 +2050 +2878 +27C0 +4040 +4040 +4040 +4040 +53C0 +2460 +2450 +2380 +0000 +0000 +ENDCHAR +STARTCHAR U+3071 +ENCODING 12401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0098 +4064 +2064 +2878 +27C0 +4040 +4040 +4040 +4040 +53C0 +2460 +2450 +2380 +0000 +0000 +ENDCHAR +STARTCHAR U+3072 +ENCODING 12402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0040 +0440 +3C20 +0820 +0830 +1028 +1020 +1020 +1040 +1040 +0880 +0700 +0000 +0000 +ENDCHAR +STARTCHAR U+3073 +ENCODING 12403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0044 +0450 +3C28 +0820 +0830 +1028 +1020 +1020 +1040 +1040 +0880 +0700 +0000 +0000 +ENDCHAR +STARTCHAR U+3074 +ENCODING 12404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +0048 +0448 +3C30 +0820 +0830 +1028 +1020 +1020 +1040 +1040 +0880 +0700 +0000 +0000 +ENDCHAR +STARTCHAR U+3075 +ENCODING 12405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0380 +0080 +0100 +0200 +0200 +0100 +02B0 +4C88 +389C +2480 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+3076 +ENCODING 12406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0388 +00A4 +0110 +0200 +0200 +0100 +02B0 +4C88 +389C +2480 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+3077 +ENCODING 12407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0398 +00A4 +0124 +0218 +0200 +0100 +02B0 +4C88 +389C +2480 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+3078 +ENCODING 12408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0600 +0900 +5080 +2040 +0030 +000C +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3079 +ENCODING 12409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0010 +0048 +0620 +0900 +5080 +2040 +0030 +000C +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+307A +ENCODING 12410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0030 +0048 +0048 +0630 +0900 +5080 +2040 +0030 +000C +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+307B +ENCODING 12411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2230 +11C0 +1040 +1038 +23E0 +2020 +2020 +2020 +29E0 +1230 +1228 +11C0 +0000 +0000 +ENDCHAR +STARTCHAR U+307C +ENCODING 12412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +4468 +2384 +2090 +2078 +47C0 +4040 +4040 +4040 +53C0 +2460 +2450 +2380 +0000 +0000 +ENDCHAR +STARTCHAR U+307D +ENCODING 12413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +4464 +23A4 +2098 +2070 +47C0 +4040 +4040 +4040 +53C0 +2460 +2450 +2380 +0000 +0000 +ENDCHAR +STARTCHAR U+307E +ENCODING 12414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0080 +10F0 +0F80 +0080 +10E0 +0F80 +0080 +0080 +0F80 +10E0 +1090 +0F00 +0000 +0000 +ENDCHAR +STARTCHAR U+307F +ENCODING 12415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0880 +0780 +0100 +0100 +0220 +0210 +0FF0 +3418 +4424 +4820 +3040 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+3080 +ENCODING 12416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0400 +2700 +1C30 +0408 +1C0C +2400 +2400 +2C20 +1810 +0810 +0810 +07E0 +0000 +0000 +ENDCHAR +STARTCHAR U+3081 +ENCODING 12417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0080 +1080 +13C0 +1CA0 +1110 +2908 +2A08 +4608 +4408 +4A10 +3060 +0000 +0000 +ENDCHAR +STARTCHAR U+3082 +ENCODING 12418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0100 +1100 +0E00 +0380 +1200 +2420 +1C20 +0710 +0410 +0410 +0410 +0220 +01C0 +0000 +ENDCHAR +STARTCHAR U+3083 +ENCODING 12419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0100 +0880 +09E0 +0E10 +3C10 +0460 +0200 +0200 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+3084 +ENCODING 12420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0080 +01C0 +1800 +10F0 +0B08 +4C08 +3408 +0270 +0200 +0100 +0100 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+3085 +ENCODING 12421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0200 +0100 +21E0 +2710 +2910 +3110 +2320 +21C0 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+3086 +ENCODING 12422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0300 +4080 +21E0 +2290 +2488 +2888 +3088 +3488 +2290 +21E0 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+3087 +ENCODING 12423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0200 +0100 +0120 +01C0 +0100 +0100 +0100 +0F00 +11C0 +1120 +0E00 +0000 +ENDCHAR +STARTCHAR U+3088 +ENCODING 12424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0100 +0100 +0130 +01C0 +0100 +0100 +0100 +0100 +1F80 +2160 +2110 +1E00 +0000 +0000 +ENDCHAR +STARTCHAR U+3089 +ENCODING 12425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0100 +01C0 +0600 +0800 +0800 +0800 +09E0 +0E10 +0810 +0810 +0020 +00C0 +0300 +0000 +ENDCHAR +STARTCHAR U+308A +ENCODING 12426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0980 +0A40 +0C20 +0C20 +0820 +0820 +0820 +0820 +0040 +0040 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+308B +ENCODING 12427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +08C0 +0740 +0080 +0100 +0200 +07C0 +0C20 +1010 +2010 +0390 +0460 +0440 +0380 +0000 +ENDCHAR +STARTCHAR U+308C +ENCODING 12428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1000 +0800 +09C0 +0A20 +1C20 +6C20 +0820 +1820 +1820 +2820 +4824 +1818 +0800 +0000 +ENDCHAR +STARTCHAR U+308D +ENCODING 12429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1180 +0E80 +0100 +0200 +0400 +0FC0 +0820 +1010 +2010 +0010 +0020 +00C0 +0700 +0000 +ENDCHAR +STARTCHAR U+308E +ENCODING 12430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0800 +0400 +0400 +06E0 +1D10 +0610 +0C10 +0C10 +1420 +0440 +0000 +ENDCHAR +STARTCHAR U+308F +ENCODING 12431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0800 +0800 +0800 +4CE0 +3F10 +0C08 +0808 +1808 +1808 +2810 +4820 +18C0 +0800 +0000 +ENDCHAR +STARTCHAR U+3090 +ENCODING 12432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0980 +0680 +0100 +0100 +03E0 +0E10 +1208 +2408 +2408 +28C8 +1930 +10E0 +0000 +0000 +ENDCHAR +STARTCHAR U+3091 +ENCODING 12433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0980 +0700 +0200 +07C0 +0820 +1020 +0620 +09C0 +0700 +0800 +1CE0 +2310 +4038 +0000 +ENDCHAR +STARTCHAR U+3092 +ENCODING 12434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0200 +12C0 +0F00 +0400 +0420 +0F38 +18C0 +2180 +0280 +0480 +0800 +0800 +07E0 +0000 +ENDCHAR +STARTCHAR U+3093 +ENCODING 12435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0100 +0100 +0200 +0200 +0400 +0400 +0F00 +0880 +1080 +1088 +2090 +2060 +0000 +0000 +ENDCHAR +STARTCHAR U+309B +ENCODING 12443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +4800 +2000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+309C +ENCODING 12444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3000 +4800 +4800 +3000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+309D +ENCODING 12445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0C00 +0300 +0080 +00C0 +0100 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+309E +ENCODING 12446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0020 +0090 +0C40 +0300 +0080 +00C0 +0100 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30A1 +ENCODING 12449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +21E0 +1E20 +0240 +0180 +0100 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30A2 +ENCODING 12450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +21F0 +1E10 +0020 +0240 +0180 +0100 +0100 +0100 +0200 +0200 +0400 +0800 +0000 +ENDCHAR +STARTCHAR U+30A3 +ENCODING 12451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0020 +0040 +0080 +0380 +1C80 +0080 +0080 +0080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+30A4 +ENCODING 12452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0020 +0020 +0040 +0080 +0300 +0D00 +3080 +0080 +0080 +0080 +0080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+30A5 +ENCODING 12453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0200 +0100 +01E0 +1E20 +0820 +0840 +0040 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+30A6 +ENCODING 12454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0100 +0100 +01F0 +3E10 +1010 +1020 +0820 +0840 +0040 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+30A7 +ENCODING 12455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +00E0 +0F00 +0100 +0100 +0100 +01E0 +1E10 +0000 +0000 +ENDCHAR +STARTCHAR U+30A8 +ENCODING 12456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0070 +1F80 +0200 +0100 +0100 +0100 +0100 +03F0 +3C08 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30A9 +ENCODING 12457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0100 +0080 +10E0 +0F80 +0180 +0280 +0480 +0880 +1180 +0080 +0000 +ENDCHAR +STARTCHAR U+30AA +ENCODING 12458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0080 +0040 +0040 +2078 +1FC0 +00C0 +0140 +0240 +0440 +0840 +1040 +00C0 +0040 +0000 +ENDCHAR +STARTCHAR U+30AB +ENCODING 12459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0100 +0100 +21F0 +1F10 +0210 +0210 +0420 +0420 +0820 +1140 +20C0 +0080 +0000 +ENDCHAR +STARTCHAR U+30AC +ENCODING 12460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0224 +0114 +0110 +21F0 +1F10 +0210 +0210 +0420 +0420 +0820 +1140 +20C0 +0080 +0000 +ENDCHAR +STARTCHAR U+30AD +ENCODING 12461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0200 +0270 +0380 +1D00 +0100 +0178 +0380 +3C80 +0080 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+30AE +ENCODING 12462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0424 +0214 +0270 +0380 +1D00 +0100 +0178 +0380 +3C80 +0080 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+30AF +ENCODING 12463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0270 +0390 +0220 +0420 +0440 +0840 +1080 +0080 +0100 +0200 +0400 +0800 +0000 +ENDCHAR +STARTCHAR U+30B0 +ENCODING 12464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0824 +04D4 +0750 +0440 +0840 +0880 +1080 +2100 +0100 +0200 +0400 +0800 +1000 +0000 +ENDCHAR +STARTCHAR U+30B1 +ENCODING 12465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +0400 +0400 +0438 +0FC0 +0900 +1080 +2080 +0080 +0100 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30B2 +ENCODING 12466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0824 +0414 +0410 +0438 +0FC0 +0900 +1080 +2080 +0080 +0100 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30B3 +ENCODING 12467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +21F0 +1E10 +0010 +0010 +0010 +0020 +0020 +03E0 +1C20 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30B4 +ENCODING 12468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0024 +0014 +43D0 +3C40 +0040 +0040 +0040 +0080 +0080 +0780 +3880 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30B5 +ENCODING 12469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0080 +0840 +0440 +0440 +24F8 +1F40 +0440 +0440 +0440 +0080 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+30B6 +ENCODING 12470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +00A4 +0854 +0450 +0440 +24F8 +1F40 +0440 +0440 +0440 +0080 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+30B7 +ENCODING 12471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0C00 +0200 +0000 +1800 +0408 +0010 +0020 +0040 +0080 +1300 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+30B8 +ENCODING 12472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0008 +0C24 +0214 +0010 +1800 +0408 +0010 +0020 +0040 +0080 +1300 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+30B9 +ENCODING 12473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +10E0 +0F20 +0040 +0040 +0080 +0080 +0140 +0220 +0C10 +3010 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30BA +ENCODING 12474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0024 +21D4 +1E50 +0080 +0080 +0100 +0100 +0280 +0440 +1820 +6020 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30BB +ENCODING 12475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +0400 +0400 +0478 +0588 +2610 +1C20 +0440 +0400 +0400 +0200 +01F0 +0000 +0000 +ENDCHAR +STARTCHAR U+30BC +ENCODING 12476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0824 +0414 +0410 +0478 +0588 +2610 +1C20 +0440 +0400 +0400 +0200 +01F8 +0000 +0000 +ENDCHAR +STARTCHAR U+30BD +ENCODING 12477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0020 +1010 +0810 +0410 +0420 +0420 +0040 +0040 +0080 +0080 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30BE +ENCODING 12478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +00A4 +2054 +1050 +0840 +0840 +0840 +0080 +0080 +0100 +0100 +0200 +0400 +0800 +0000 +ENDCHAR +STARTCHAR U+30BF +ENCODING 12479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0100 +01F0 +0210 +0220 +0520 +08C0 +1040 +0080 +0100 +0200 +0C00 +3000 +0000 +ENDCHAR +STARTCHAR U+30C0 +ENCODING 12480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0424 +0214 +03F0 +0420 +0420 +0A40 +1140 +2080 +0100 +0200 +0400 +1800 +6000 +0000 +ENDCHAR +STARTCHAR U+30C1 +ENCODING 12481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0040 +0180 +1E00 +0100 +00F8 +2380 +1C80 +0080 +0080 +0100 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30C2 +ENCODING 12482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0064 +0194 +1E10 +0100 +00F8 +2380 +1C80 +0080 +0080 +0100 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30C3 +ENCODING 12483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0440 +1220 +0A20 +0840 +0040 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+30C4 +ENCODING 12484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0410 +2208 +1108 +0910 +0810 +0020 +0020 +0040 +0080 +0100 +0200 +0000 +0000 +ENDCHAR +STARTCHAR U+30C5 +ENCODING 12485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0024 +1094 +0850 +4440 +2440 +1040 +1080 +0080 +0100 +0200 +0400 +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+30C6 +ENCODING 12486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +11E0 +0E00 +0000 +0078 +2380 +1C80 +0080 +0100 +0100 +0200 +0400 +0800 +0000 +ENDCHAR +STARTCHAR U+30C7 +ENCODING 12487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0024 +11D4 +0E10 +0000 +20F0 +1F00 +0080 +0080 +0100 +0100 +0200 +0400 +0800 +0000 +ENDCHAR +STARTCHAR U+30C8 +ENCODING 12488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +0400 +0400 +0400 +0400 +0700 +04C0 +0420 +0400 +0400 +0400 +0400 +0400 +0000 +ENDCHAR +STARTCHAR U+30C9 +ENCODING 12489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +1090 +0850 +0840 +0800 +0800 +0E00 +0980 +0840 +0800 +0800 +0800 +0800 +0800 +0000 +ENDCHAR +STARTCHAR U+30CA +ENCODING 12490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0080 +0080 +20F8 +1F80 +0080 +0080 +0080 +0100 +0100 +0200 +0400 +0800 +0000 +ENDCHAR +STARTCHAR U+30CB +ENCODING 12491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00E0 +1F00 +0000 +0000 +0000 +0000 +01F0 +3E08 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30CC +ENCODING 12492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +10F0 +0F10 +0020 +0020 +0E40 +01C0 +00C0 +0120 +0210 +0C10 +3000 +0000 +0000 +ENDCHAR +STARTCHAR U+30CD +ENCODING 12493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0100 +01E0 +1E20 +0040 +0080 +0100 +0340 +0D30 +3108 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+30CE +ENCODING 12494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0040 +0020 +0020 +0020 +0040 +0040 +0080 +0080 +0100 +0200 +0400 +0800 +1000 +0000 +ENDCHAR +STARTCHAR U+30CF +ENCODING 12495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0880 +0440 +0420 +0810 +0810 +1008 +2008 +4008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30D0 +ENCODING 12496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0008 +0024 +0014 +0890 +0440 +0420 +0810 +0810 +1008 +2008 +4008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30D1 +ENCODING 12497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +0024 +0024 +0018 +0880 +0440 +0420 +0810 +0810 +1008 +2008 +4008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30D2 +ENCODING 12498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1000 +0800 +0800 +08E0 +0F00 +0800 +0800 +0800 +0800 +0400 +03F0 +0000 +0000 +ENDCHAR +STARTCHAR U+30D3 +ENCODING 12499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0010 +1048 +0828 +0820 +0800 +08E0 +0F00 +0800 +0800 +0800 +0400 +03F0 +0000 +0000 +ENDCHAR +STARTCHAR U+30D4 +ENCODING 12500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0030 +1048 +0848 +0830 +0800 +08E0 +0F00 +0800 +0800 +0800 +0400 +03F0 +0000 +0000 +ENDCHAR +STARTCHAR U+30D5 +ENCODING 12501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +10F0 +0F10 +0010 +0020 +0020 +0040 +0040 +0080 +0100 +0200 +0400 +0000 +0000 +ENDCHAR +STARTCHAR U+30D6 +ENCODING 12502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0024 +23D4 +1C50 +0040 +0080 +0080 +0100 +0100 +0200 +0400 +0800 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+30D7 +ENCODING 12503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +0024 +23E4 +1C58 +0040 +0080 +0080 +0100 +0100 +0200 +0400 +0800 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+30D8 +ENCODING 12504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0200 +0500 +4880 +3040 +0030 +000C +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30D9 +ENCODING 12505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0020 +0090 +0050 +0240 +0500 +4880 +3040 +0030 +000C +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30DA +ENCODING 12506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0060 +0090 +0090 +0260 +0500 +4880 +3040 +0030 +000C +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30DB +ENCODING 12507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0100 +0100 +21F0 +1F00 +0100 +0140 +0920 +0910 +1110 +2100 +0300 +0100 +0000 +ENDCHAR +STARTCHAR U+30DC +ENCODING 12508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0224 +0114 +0110 +21F0 +1F00 +0100 +0140 +0920 +0910 +1110 +2100 +0300 +0100 +0000 +ENDCHAR +STARTCHAR U+30DD +ENCODING 12509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +0224 +0124 +0118 +21F0 +1F00 +0100 +0140 +0920 +0910 +1110 +2100 +0300 +0100 +0000 +ENDCHAR +STARTCHAR U+30DE +ENCODING 12510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +20F0 +1F08 +0010 +0020 +0040 +0C80 +0300 +0080 +0040 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30DF +ENCODING 12511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0300 +00C0 +0020 +0800 +0600 +0180 +0040 +1000 +0C00 +0300 +00C0 +0020 +0000 +ENDCHAR +STARTCHAR U+30E0 +ENCODING 12512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0100 +0100 +0100 +0200 +0200 +0240 +0420 +0430 +29C8 +1E08 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30E1 +ENCODING 12513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0040 +0020 +0020 +0020 +0620 +01C0 +0040 +00A0 +0090 +0100 +0200 +0C00 +3000 +0000 +ENDCHAR +STARTCHAR U+30E2 +ENCODING 12514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +10E0 +0F00 +0200 +0200 +23F8 +1E00 +0200 +0200 +0200 +01F0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30E3 +ENCODING 12515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0400 +0270 +0390 +1E20 +0140 +0100 +0080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+30E4 +ENCODING 12516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0800 +0400 +0478 +0388 +2610 +1A20 +0140 +0100 +0100 +0080 +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+30E5 +ENCODING 12517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +01C0 +0E40 +0040 +0080 +01E0 +1E10 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30E6 +ENCODING 12518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +11C0 +0E40 +0040 +0080 +0080 +01F0 +3E08 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30E7 +ENCODING 12519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +01E0 +0E20 +0020 +01E0 +0E40 +0040 +01C0 +0E20 +0000 +0000 +ENDCHAR +STARTCHAR U+30E8 +ENCODING 12520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +01F0 +1E10 +0010 +0010 +01E0 +0E20 +0020 +0020 +0020 +01E0 +0E10 +0000 +0000 +ENDCHAR +STARTCHAR U+30E9 +ENCODING 12521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +11C0 +0E00 +0070 +2390 +1C10 +0010 +0020 +0020 +0040 +0080 +0300 +0C00 +0000 +ENDCHAR +STARTCHAR U+30EA +ENCODING 12522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0040 +0820 +0420 +0420 +0420 +0420 +0420 +0420 +0040 +0040 +0080 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+30EB +ENCODING 12523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0100 +0880 +0480 +0480 +0488 +0488 +0490 +0890 +08A0 +10C0 +2080 +0000 +0000 +ENDCHAR +STARTCHAR U+30EC +ENCODING 12524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1000 +0800 +0800 +0800 +0800 +0800 +0810 +0820 +0840 +0880 +0B00 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+30ED +ENCODING 12525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +21F0 +1E10 +1010 +1010 +0820 +0820 +09E0 +0E10 +0800 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30EE +ENCODING 12526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +10F0 +0F10 +0820 +0420 +0440 +0040 +0080 +0100 +0000 +ENDCHAR +STARTCHAR U+30EF +ENCODING 12527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +21F0 +1E10 +1010 +0810 +0820 +0820 +0040 +0040 +0080 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30F0 +ENCODING 12528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0080 +0080 +01F0 +1E80 +0880 +0480 +05F0 +3E88 +0080 +0080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+30F1 +ENCODING 12529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +01E0 +1E20 +0240 +0180 +0100 +0100 +01F0 +3E08 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30F2 +ENCODING 12530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +01F0 +1E10 +0010 +0020 +01E0 +0E20 +0040 +0040 +0080 +0100 +0600 +1800 +0000 +ENDCHAR +STARTCHAR U+30F3 +ENCODING 12531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +1800 +0408 +0208 +0010 +0010 +0020 +0040 +0080 +1300 +0C00 +0000 +0000 +ENDCHAR +STARTCHAR U+30F4 +ENCODING 12532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0424 +0214 +0210 +43E0 +3C20 +2020 +1040 +1040 +0080 +0080 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30F5 +ENCODING 12533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0200 +0100 +11E0 +0E20 +0220 +0220 +0420 +08C0 +1040 +0000 +ENDCHAR +STARTCHAR U+30F6 +ENCODING 12534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0800 +0400 +0460 +0780 +0880 +1080 +0100 +0200 +0400 +0000 +ENDCHAR +STARTCHAR U+30FB +ENCODING 12539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0300 +0780 +0780 +0300 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30FC +ENCODING 12540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +40F8 +3F00 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30FD +ENCODING 12541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0C00 +0300 +0080 +0040 +0020 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+30FE +ENCODING 12542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0020 +0090 +0C40 +0300 +0080 +0040 +0020 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3105 +ENCODING 12549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1000 +3FF8 +0008 +0008 +0008 +0008 +0008 +0008 +0008 +0010 +0110 +00A0 +0040 +ENDCHAR +STARTCHAR U+3106 +ENCODING 12550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0400 +0800 +1FF8 +0008 +0008 +0010 +0110 +00A0 +0040 +00A0 +0310 +0C10 +3000 +0000 +ENDCHAR +STARTCHAR U+3107 +ENCODING 12551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FF8 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3108 +ENCODING 12552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+3109 +ENCODING 12553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0400 +0800 +1FF8 +0108 +0108 +0108 +0108 +0208 +0208 +0408 +0810 +1110 +20A0 +0040 +ENDCHAR +STARTCHAR U+310A +ENCODING 12554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +7FFC +0100 +0100 +0200 +0200 +0400 +0820 +1FF0 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+310B +ENCODING 12555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FC0 +0040 +0080 +0100 +03F8 +0008 +0008 +0008 +0008 +0008 +0010 +0110 +00A0 +0040 +ENDCHAR +STARTCHAR U+310C +ENCODING 12556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +0900 +1100 +1FF8 +0108 +0108 +0108 +0208 +0208 +0408 +0408 +0810 +1050 +2020 +ENDCHAR +STARTCHAR U+310D +ENCODING 12557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0220 +0220 +0440 +0440 +0880 +0880 +1100 +0880 +0880 +0440 +0440 +0220 +0220 +0000 +ENDCHAR +STARTCHAR U+310E +ENCODING 12558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0200 +0200 +0400 +0800 +1FF0 +0010 +0010 +0010 +0010 +0010 +0020 +00A0 +0040 +ENDCHAR +STARTCHAR U+310F +ENCODING 12559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +2000 +2000 +4000 +8000 +0000 +ENDCHAR +STARTCHAR U+3110 +ENCODING 12560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +0420 +0420 +0420 +0420 +0420 +0420 +0860 +09A0 +0E20 +0020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+3111 +ENCODING 12561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0080 +0100 +0100 +0200 +0400 +0200 +0100 +0100 +0080 +0080 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+3112 +ENCODING 12562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+3113 +ENCODING 12563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1110 +1110 +1110 +1110 +1110 +1110 +1FF0 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+3114 +ENCODING 12564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +0100 +0200 +0440 +0880 +1100 +0300 +0500 +0900 +1100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+3115 +ENCODING 12565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0008 +0008 +0008 +1FF8 +1000 +1000 +1000 +1000 +1000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U+3116 +ENCODING 12566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0820 +0A20 +0920 +08A0 +0820 +0820 +0820 +0820 +0FE0 +0000 +0000 +ENDCHAR +STARTCHAR U+3117 +ENCODING 12567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0410 +0410 +0410 +0410 +0410 +0420 +0520 +04C0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U+3118 +ENCODING 12568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +7FFC +0400 +0400 +0400 +0FF0 +0010 +0010 +0020 +0020 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U+3119 +ENCODING 12569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0200 +0200 +0200 +0400 +0400 +0840 +1020 +3FF0 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+311A +ENCODING 12570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0810 +0420 +0240 +0080 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+311B +ENCODING 12571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +0100 +0F00 +1000 +2000 +2000 +2000 +2008 +1010 +0FE0 +0000 +0000 +ENDCHAR +STARTCHAR U+311C +ENCODING 12572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0100 +0100 +0F00 +1000 +2000 +2000 +2000 +2008 +1010 +0FE0 +0000 +ENDCHAR +STARTCHAR U+311D +ENCODING 12573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0840 +0840 +0840 +7FFC +0840 +0840 +0840 +0880 +0880 +0900 +0800 +07F0 +0000 +0000 +ENDCHAR +STARTCHAR U+311E +ENCODING 12574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0900 +0900 +1100 +1FF8 +0108 +0108 +0108 +0208 +0208 +0410 +0810 +1020 +0000 +ENDCHAR +STARTCHAR U+311F +ENCODING 12575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1C00 +0400 +0400 +0400 +0200 +0200 +0200 +0100 +0100 +0080 +0040 +0020 +0018 +0000 +ENDCHAR +STARTCHAR U+3120 +ENCODING 12576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0420 +0420 +0840 +0840 +1F80 +0100 +0200 +0440 +0820 +1FF0 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+3121 +ENCODING 12577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1FF0 +0010 +0020 +0420 +0240 +0140 +0080 +0080 +0140 +0220 +0400 +0800 +0000 +ENDCHAR +STARTCHAR U+3122 +ENCODING 12578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FE0 +0820 +0820 +0820 +1040 +1040 +1FF8 +0008 +0008 +0008 +0010 +0010 +0020 +0040 +0000 +ENDCHAR +STARTCHAR U+3123 +ENCODING 12579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +0800 +1000 +1000 +1000 +1FF8 +0008 +0008 +0008 +0010 +0010 +0020 +0000 +ENDCHAR +STARTCHAR U+3124 +ENCODING 12580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +0200 +7FFC +0280 +0280 +0280 +0480 +0480 +0480 +0880 +1080 +607C +0000 +ENDCHAR +STARTCHAR U+3125 +ENCODING 12581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0100 +0200 +0200 +0400 +0400 +0800 +1000 +2000 +3FF8 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3126 +ENCODING 12582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0480 +0480 +0480 +0480 +0480 +0480 +0480 +0480 +0480 +0880 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+3127 +ENCODING 12583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+3128 +ENCODING 12584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +0010 +0820 +0420 +0240 +0140 +0080 +0080 +0140 +0220 +0410 +1800 +6000 +0000 +ENDCHAR +STARTCHAR U+3129 +ENCODING 12585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0008 +1008 +1008 +1008 +1008 +1008 +2008 +2078 +3F88 +0008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3131 +ENCODING 12593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2008 +1FFC +0808 +0008 +0008 +0008 +0008 +0008 +0008 +0008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3132 +ENCODING 12594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +4108 +3FFC +1108 +0108 +0108 +0108 +0108 +0108 +0108 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3133 +ENCODING 12595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8260 +7F10 +2210 +0210 +0230 +0228 +0248 +0244 +0282 +0301 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3134 +ENCODING 12596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3000 +0800 +0800 +0800 +0800 +0808 +07FC +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3135 +ENCODING 12597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0204 +C1FE +20A0 +2020 +2050 +2388 +1D04 +0202 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3136 +ENCODING 12598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0040 +0038 +C402 +23FF +2100 +2078 +2084 +2384 +1C84 +0078 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3137 +ENCODING 12599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +7010 +1FF8 +1000 +1000 +1000 +1000 +1008 +0FFC +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3138 +ENCODING 12600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +6288 +3FFC +2080 +2080 +2080 +2080 +2384 +1C7E +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3139 +ENCODING 12601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2010 +1FF8 +0810 +0010 +3010 +1FF8 +1000 +1000 +1010 +0FF8 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+313A +ENCODING 12602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8204 +7FFE +2284 +0204 +FF04 +4004 +4004 +4304 +3C04 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+313B +ENCODING 12603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +4144 +3FFE +1144 +0144 +7FC4 +2044 +2044 +23C4 +1C7E +0040 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+313C +ENCODING 12604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +4208 +3F04 +0284 +0284 +7EFC +2084 +2084 +2384 +1CFC +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+313D +ENCODING 12605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8460 +7E10 +2410 +0410 +FE30 +4028 +4048 +4684 +3902 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+313E +ENCODING 12606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +42C4 +3F7E +0240 +0244 +7F7E +2040 +2040 +2344 +1C3E +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+313F +ENCODING 12607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8508 +7EFC +0400 +0400 +FE84 +4048 +4048 +464A +3BFF +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3140 +ENCODING 12608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8440 +7E38 +0502 +04FF +FE00 +4038 +4044 +4644 +3838 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3141 +ENCODING 12609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3810 +0FF8 +0810 +0810 +0810 +0810 +0810 +0810 +0FF8 +0800 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3142 +ENCODING 12610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0020 +0010 +1010 +0810 +0810 +0FF0 +0810 +0810 +0810 +0FF0 +0810 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3143 +ENCODING 12611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0008 +0284 +2144 +1144 +1144 +1F7C +1144 +1144 +1144 +1F7C +1144 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3144 +ENCODING 12612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0460 +4210 +2210 +2210 +3E10 +2228 +2228 +2244 +3E44 +2282 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3145 +ENCODING 12613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0200 +0180 +0080 +0080 +0080 +0140 +0140 +0220 +0410 +0808 +3004 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3146 +ENCODING 12614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0840 +0420 +0420 +0420 +0A20 +0A50 +1148 +2084 +C302 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3147 +ENCODING 12615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0200 +0100 +07C0 +0820 +1010 +1010 +1010 +1010 +0820 +07C0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3148 +ENCODING 12616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2010 +1FF8 +0900 +0100 +0100 +0280 +0440 +0820 +1010 +6008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3149 +ENCODING 12617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +8104 +7FFE +2420 +0420 +0A50 +0950 +1088 +2104 +C602 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+314A +ENCODING 12618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +03E0 +0000 +2008 +1FFC +0880 +0140 +0220 +0410 +0808 +3004 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+314B +ENCODING 12619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1008 +0FFC +0408 +0008 +00F8 +3F08 +1008 +0008 +0008 +0008 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+314C +ENCODING 12620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3820 +0FF0 +0800 +0820 +0FF0 +0800 +0800 +0810 +07F8 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+314D +ENCODING 12621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +2010 +1FF8 +0800 +0000 +0810 +0420 +0220 +4248 +3FFC +1000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+314E +ENCODING 12622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0400 +03C0 +4008 +3FFC +1000 +03C0 +0420 +0810 +0810 +0420 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+314F +ENCODING 12623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0030 +0010 +0010 +0010 +0012 +001F +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+3150 +ENCODING 12624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0118 +00C8 +0048 +0048 +0048 +0078 +0048 +0048 +0048 +0048 +0048 +0048 +0048 +0008 +0000 +ENDCHAR +STARTCHAR U+3151 +ENCODING 12625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0030 +0010 +0010 +0012 +001F +0010 +0012 +001F +0010 +0010 +0010 +0010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+3152 +ENCODING 12626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0118 +00C8 +0048 +0048 +0078 +0048 +0048 +0078 +0048 +0048 +0048 +0048 +0048 +0008 +0000 +ENDCHAR +STARTCHAR U+3153 +ENCODING 12627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0030 +0010 +0010 +0010 +0010 +0010 +03F0 +0110 +0010 +0010 +0010 +0010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+3154 +ENCODING 12628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +008C +0064 +0024 +0024 +0024 +03E4 +0124 +0024 +0024 +0024 +0024 +0024 +0024 +0004 +0000 +ENDCHAR +STARTCHAR U+3155 +ENCODING 12629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0030 +0010 +0010 +0010 +03F0 +0110 +0010 +03F0 +0110 +0010 +0010 +0010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+3156 +ENCODING 12630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +008C +0064 +0024 +0024 +03E4 +0124 +0024 +03E4 +0124 +0024 +0024 +0024 +0024 +0004 +0000 +ENDCHAR +STARTCHAR U+3157 +ENCODING 12631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0100 +0080 +0080 +0080 +4082 +3FFF +1000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3158 +ENCODING 12632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0030 +0010 +0010 +0010 +0010 +0810 +0412 +041F +05F0 +7E10 +2010 +0010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+3159 +ENCODING 12633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +008C +0064 +0024 +0024 +0824 +0424 +043C +0424 +07E4 +7C24 +2024 +0024 +0024 +0004 +0000 +ENDCHAR +STARTCHAR U+315A +ENCODING 12634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0018 +0008 +0008 +0008 +0408 +0208 +0208 +0208 +03F8 +7E08 +2008 +0008 +0008 +0008 +0000 +ENDCHAR +STARTCHAR U+315B +ENCODING 12635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0040 +0420 +0220 +0220 +4222 +3FFF +1000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+315C +ENCODING 12636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +4002 +3FFF +1080 +0080 +0080 +0080 +0080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+315D +ENCODING 12637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0018 +0008 +0008 +0008 +0008 +01E8 +7E08 +2808 +09F8 +0888 +0808 +0808 +0808 +0008 +0000 +ENDCHAR +STARTCHAR U+315E +ENCODING 12638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0098 +0048 +0048 +0048 +0048 +0048 +03C8 +7C48 +2848 +0BC8 +0848 +0848 +0848 +0008 +0000 +ENDCHAR +STARTCHAR U+315F +ENCODING 12639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0018 +0008 +0008 +0008 +0008 +0008 +01E8 +7E08 +2408 +0408 +0408 +0408 +0408 +0008 +0000 +ENDCHAR +STARTCHAR U+3160 +ENCODING 12640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +4002 +3FFF +1220 +0220 +0220 +0220 +0220 +0220 +0220 +0000 +ENDCHAR +STARTCHAR U+3161 +ENCODING 12641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +4002 +3FFF +1000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3162 +ENCODING 12642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0018 +0008 +0008 +0008 +0008 +0008 +0008 +01F8 +7E08 +2008 +0008 +0008 +0008 +0008 +0000 +ENDCHAR +STARTCHAR U+3163 +ENCODING 12643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0030 +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+3164 +ENCODING 12644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3165 +ENCODING 12645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +C180 +2040 +2040 +2040 +2040 +2040 +2344 +1C3E +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3166 +ENCODING 12646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +C0C4 +207E +2040 +2040 +2040 +2040 +2342 +1C3F +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3167 +ENCODING 12647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +C020 +2010 +2010 +2010 +2010 +2028 +2348 +1C84 +0102 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3168 +ENCODING 12648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +C010 +2010 +2028 +2028 +2044 +2044 +2382 +1CFF +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3169 +ENCODING 12649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8850 +7FE8 +0848 +0848 +FC54 +4054 +4062 +3C41 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+316A +ENCODING 12650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +42C8 +3F7C +0240 +0240 +7F40 +2040 +2040 +2344 +1C3E +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+316B +ENCODING 12651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8890 +7C48 +0A48 +0A48 +FFD4 +4254 +4E62 +33C1 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+316C +ENCODING 12652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +8420 +7E20 +0420 +0450 +FC50 +4088 +4088 +4704 +3BFE +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+316D +ENCODING 12653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +8400 +7E00 +0504 +04FE +FE40 +4038 +4044 +4644 +3838 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+316E +ENCODING 12654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0008 +6284 +3F44 +2244 +227C +2244 +2244 +2244 +3F7C +2044 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+316F +ENCODING 12655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6220 +3F10 +2210 +2210 +2210 +2228 +2228 +3E44 +2282 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3170 +ENCODING 12656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +6210 +3F10 +2228 +2228 +2244 +2244 +2244 +2282 +3FFF +2000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3171 +ENCODING 12657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3008 +1FFC +1008 +1008 +1008 +1FFC +1100 +0080 +07E0 +0810 +1008 +1008 +0810 +07E0 +0000 +ENDCHAR +STARTCHAR U+3172 +ENCODING 12658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0400 +0282 +827F +4222 +7E02 +4202 +4202 +4202 +7E02 +4202 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3173 +ENCODING 12659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +02C8 +827C +4240 +4240 +7E40 +4240 +4240 +4244 +7E3E +4200 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3174 +ENCODING 12660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1142 +88BF +4882 +4882 +7982 +4942 +4A42 +7A22 +4C12 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3175 +ENCODING 12661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1132 +889F +4890 +4890 +7990 +4950 +4A50 +7A52 +4C2F +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3176 +ENCODING 12662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0800 +8604 +45FE +44A0 +7C20 +4420 +4450 +7C88 +4706 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3177 +ENCODING 12663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +02C4 +827E +4240 +4244 +7E7E +4240 +4240 +4244 +7E3E +4200 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3178 +ENCODING 12664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +2008 +1008 +1FF8 +1008 +1008 +1FF8 +1108 +0080 +07E0 +0810 +1008 +1008 +0810 +07E0 +0000 +ENDCHAR +STARTCHAR U+3179 +ENCODING 12665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +2488 +1248 +1E78 +1248 +1248 +1E78 +1248 +0080 +07E0 +0810 +1008 +1008 +0810 +07E0 +0000 +ENDCHAR +STARTCHAR U+317A +ENCODING 12666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0904 +04FE +0444 +0404 +0A04 +0A04 +1104 +2104 +C084 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+317B +ENCODING 12667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0800 +0580 +0440 +0640 +0A40 +0A40 +1140 +2144 +40BE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+317C +ENCODING 12668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +10C4 +087E +0840 +0840 +1440 +1440 +2240 +4144 +80BE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+317D +ENCODING 12669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0004 +1002 +0882 +0842 +087E +1442 +1442 +2242 +217E +40C2 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+317E +ENCODING 12670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1202 +09FF +0890 +0810 +1428 +1428 +2244 +4142 +8181 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+317F +ENCODING 12671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0100 +0100 +0280 +0280 +0440 +0440 +0820 +0820 +1010 +3FF8 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3180 +ENCODING 12672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1818 +0808 +3C3C +4242 +4242 +4242 +4242 +4242 +4242 +3C3C +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3181 +ENCODING 12673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +0100 +0FE0 +1010 +2008 +2008 +2008 +2008 +2008 +2008 +1010 +0FE0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3182 +ENCODING 12674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3000 +1204 +79FE +84A0 +8420 +8420 +8450 +8450 +8488 +8504 +7A02 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3183 +ENCODING 12675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3000 +1020 +7820 +8450 +8450 +8488 +8488 +8488 +8504 +8504 +7BFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3184 +ENCODING 12676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2010 +1FF8 +0000 +0420 +4248 +3FFC +1100 +0080 +07E0 +0810 +1008 +1008 +0810 +07E0 +0000 +ENDCHAR +STARTCHAR U+3185 +ENCODING 12677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2040 +1C38 +8102 +7FFF +2000 +1C38 +2244 +2244 +2244 +1C38 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3186 +ENCODING 12678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +4008 +3FFC +1200 +0100 +07C0 +0820 +0820 +0820 +0820 +07C0 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+3187 +ENCODING 12679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0030 +0010 +0010 +0010 +0912 +091F +0910 +09F2 +7E1F +2010 +0010 +0010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+3188 +ENCODING 12680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0118 +00C8 +0048 +0048 +0478 +0248 +2248 +1278 +13C8 +7C48 +2048 +0048 +0048 +0008 +0000 +ENDCHAR +STARTCHAR U+3189 +ENCODING 12681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0018 +0008 +0008 +0008 +0208 +1108 +0908 +0908 +0BE8 +7C08 +2008 +0008 +0008 +0008 +0000 +ENDCHAR +STARTCHAR U+318A +ENCODING 12682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0018 +0008 +0008 +0008 +0008 +01E8 +7F08 +2978 +0908 +0978 +0908 +0908 +0908 +0008 +0000 +ENDCHAR +STARTCHAR U+318B +ENCODING 12683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0118 +00C8 +0048 +0048 +0048 +0348 +FC48 +55C8 +1448 +15C8 +1448 +1448 +0048 +0008 +0000 +ENDCHAR +STARTCHAR U+318C +ENCODING 12684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0018 +0008 +0008 +0008 +0008 +0008 +01E8 +7F08 +2908 +0908 +0908 +0908 +0908 +0008 +0000 +ENDCHAR +STARTCHAR U+318D +ENCODING 12685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0100 +0380 +0100 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+318E +ENCODING 12686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0018 +0008 +0008 +0008 +0008 +0008 +0008 +0208 +0708 +0208 +0008 +0008 +0008 +0008 +0000 +ENDCHAR +STARTCHAR U+3200 +ENCODING 12800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4FF2 +4012 +4012 +4012 +4012 +4012 +4012 +4012 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3201 +ENCODING 12801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4402 +4402 +4402 +4402 +4402 +4402 +47FA +4002 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3202 +ENCODING 12802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +4FF2 +4802 +4802 +4802 +4802 +4802 +4FF2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3203 +ENCODING 12803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4FF2 +4012 +4012 +4FF2 +4802 +4802 +4802 +4FFA +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3204 +ENCODING 12804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +4FF2 +4812 +4812 +4812 +4812 +4FF2 +4002 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3205 +ENCODING 12805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4812 +4812 +4812 +4FF2 +4812 +4812 +4812 +4FF2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3206 +ENCODING 12806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4082 +4082 +4082 +4142 +4142 +4222 +4412 +480A +4002 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3207 +ENCODING 12807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +43C2 +4422 +4812 +4812 +4812 +4812 +4422 +43C2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3208 +ENCODING 12808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +5FF2 +4102 +4102 +4282 +4282 +4442 +4822 +5012 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+3209 +ENCODING 12809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +43E2 +4002 +4002 +4FFA +4082 +4142 +4222 +4412 +480A +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+320A +ENCODING 12810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4FF2 +4012 +4012 +5FF2 +4012 +4012 +4012 +4012 +4012 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+320B +ENCODING 12811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4FF2 +4802 +4802 +4FF2 +4802 +4802 +4802 +4FF2 +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+320C +ENCODING 12812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +4002 +4FF2 +4002 +4422 +4422 +4242 +4242 +5FFA +4002 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+320D +ENCODING 12813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2004 +4002 +43C2 +4002 +5FFA +4002 +43C2 +4422 +4422 +4422 +43C2 +2004 +1818 +0000 +ENDCHAR +STARTCHAR U+320E +ENCODING 12814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5FA2 +40A2 +413E +4222 +4422 +4822 +5022 +6022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+320F +ENCODING 12815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5022 +5022 +5022 +503E +5022 +5FE2 +4022 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3210 +ENCODING 12816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5FA2 +5022 +5022 +503E +5022 +5FA2 +4022 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3211 +ENCODING 12817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5FA2 +40A2 +40A2 +5FBE +5022 +5022 +5FA2 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3212 +ENCODING 12818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +4022 +5F22 +5122 +513E +5122 +5F22 +4022 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3213 +ENCODING 12819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5122 +5122 +5F22 +513E +5122 +5F22 +4022 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3214 +ENCODING 12820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +4422 +4422 +4A22 +4A3E +5122 +60A2 +4022 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3215 +ENCODING 12821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +4E22 +5122 +5122 +513E +5122 +5122 +4E22 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3216 +ENCODING 12822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5FE2 +4222 +4222 +453E +4522 +48A2 +5062 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3217 +ENCODING 12823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4722 +4022 +5FE2 +4222 +423E +4522 +48A2 +5062 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3218 +ENCODING 12824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5FA2 +40A2 +7F22 +423E +4422 +4822 +5022 +6022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+3219 +ENCODING 12825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5FA2 +5022 +5FA2 +503E +5022 +5FA2 +4022 +6022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+321A +ENCODING 12826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4022 +5FA2 +4022 +50A2 +493E +4922 +4BE2 +7C22 +4022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+321B +ENCODING 12827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +2024 +4F22 +4022 +7FE2 +4022 +4F3E +50A2 +50A2 +4F22 +6022 +4022 +2024 +1818 +0000 +ENDCHAR +STARTCHAR U+321C +ENCODING 12828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3018 +4004 +9FF2 +8102 +8282 +8C62 +B01A +8002 +FFFA +8102 +8102 +8102 +4104 +3118 +0000 +ENDCHAR +STARTCHAR U+3220 +ENCODING 12832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4004 +8002 +8002 +8002 +8012 +BFFA +8002 +8002 +8002 +8002 +8002 +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3221 +ENCODING 12833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4004 +8022 +9FF2 +8002 +8002 +8002 +8002 +8012 +BFFA +8002 +8002 +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3222 +ENCODING 12834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4024 +9FF2 +8002 +8002 +8042 +8FE2 +8002 +8002 +8012 +BFFA +8002 +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3223 +ENCODING 12835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4004 +8002 +BFFA +A44A +A44A +A44A +A44A +A44A +BFFA +8002 +8002 +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3224 +ENCODING 12836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4024 +9FF2 +8202 +8202 +8222 +9FF2 +8422 +8422 +8422 +8422 +BFFA +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3225 +ENCODING 12837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4004 +8202 +8102 +8012 +BFFA +8002 +8002 +8442 +8422 +8812 +9012 +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3226 +ENCODING 12838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4204 +8202 +8202 +8212 +827A +8382 +BE02 +8202 +8202 +8222 +8222 +41E4 +2008 +0000 +ENDCHAR +STARTCHAR U+3227 +ENCODING 12839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4084 +8482 +8482 +8482 +8482 +8482 +8842 +8822 +901A +A012 +8002 +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3228 +ENCODING 12840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4204 +8202 +8242 +9FE2 +8242 +8242 +8242 +8442 +844A +884A +903A +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3229 +ENCODING 12841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +4104 +8102 +8102 +8112 +BFFA +8102 +8102 +8102 +8102 +8102 +8102 +4004 +2008 +0000 +ENDCHAR +STARTCHAR U+3260 +ENCODING 12896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +5FF2 +4012 +4012 +4012 +4012 +4012 +4012 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3261 +ENCODING 12897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +4802 +4802 +4802 +4802 +4802 +4802 +4FF2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3262 +ENCODING 12898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4FF2 +4802 +4802 +4802 +4802 +4802 +4FF2 +4002 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3263 +ENCODING 12899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4FF2 +4012 +4012 +4FF2 +4802 +4802 +4802 +4FFA +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3264 +ENCODING 12900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4FF2 +4812 +4812 +4812 +4812 +4812 +4FF2 +4002 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3265 +ENCODING 12901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4812 +4812 +4812 +4FF2 +4812 +4812 +4812 +4FF2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3266 +ENCODING 12902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2084 +4082 +4082 +4142 +4142 +4222 +4222 +4412 +480A +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3267 +ENCODING 12903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +43C2 +4422 +4812 +4812 +4812 +4812 +4422 +43C2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3268 +ENCODING 12904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +4FFA +4082 +4082 +4142 +4222 +4412 +480A +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3269 +ENCODING 12905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +43E2 +4002 +4FFA +4082 +4142 +4222 +4412 +480A +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+326A +ENCODING 12906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4FF2 +4012 +4012 +5FF2 +4012 +4012 +4012 +4012 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+326B +ENCODING 12907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4FE2 +4802 +4802 +4FE2 +4802 +4802 +4802 +4FF2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+326C +ENCODING 12908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +4002 +4FF2 +4002 +4422 +4222 +4242 +4242 +5FFA +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+326D +ENCODING 12909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1008 +2004 +47E2 +4002 +5FFA +4002 +43C2 +4422 +4422 +43C2 +2004 +1008 +0FF0 +0000 +ENDCHAR +STARTCHAR U+326E +ENCODING 12910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5FA2 +40A2 +413E +4122 +4222 +4422 +4822 +5022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+326F +ENCODING 12911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5022 +5022 +5022 +503E +5022 +5FE2 +4022 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3270 +ENCODING 12912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5FA2 +5022 +5022 +503E +5022 +5FA2 +4022 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3271 +ENCODING 12913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5FA2 +40A2 +40A2 +5FBE +5022 +5022 +5FA2 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3272 +ENCODING 12914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +4022 +5F22 +5122 +513E +5122 +5122 +5F22 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3273 +ENCODING 12915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5122 +5122 +5F22 +513E +5122 +5122 +5F22 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3274 +ENCODING 12916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2224 +4222 +4422 +4622 +493E +50A2 +6022 +4022 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3275 +ENCODING 12917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +4E22 +5122 +5122 +513E +5122 +5122 +4E22 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3276 +ENCODING 12918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5FE2 +4222 +4222 +453E +48A2 +5062 +6022 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3277 +ENCODING 12919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +27A4 +4022 +5FE2 +4222 +453E +48A2 +5062 +6022 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3278 +ENCODING 12920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5FA2 +40A2 +4122 +5E3E +4422 +4822 +5022 +6022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+3279 +ENCODING 12921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5FA2 +5022 +5FA2 +503E +5022 +5FA2 +4022 +6022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+327A +ENCODING 12922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2024 +5FA2 +4022 +50A2 +493E +4922 +4BE2 +7C22 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+327B +ENCODING 12923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +1028 +2F24 +4022 +7FE2 +4022 +4F3E +50A2 +50A2 +4F22 +4022 +2024 +1028 +0FF0 +0000 +ENDCHAR +STARTCHAR U+327F +ENCODING 12927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF8 +1004 +2F7A +4621 +4640 +7687 +0701 +0681 +4641 +4621 +2F7A +1004 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+32A3 +ENCODING 12963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03C0 +0C30 +1008 +2004 +2FF4 +4082 +4082 +44E2 +4482 +2484 +2FF4 +1008 +0C30 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+3371 +ENCODING 13169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +4000 +4380 +4240 +524C +6A52 +4B82 +4A0E +4A12 +4A12 +4A16 +4A0A +0000 +0000 +ENDCHAR +STARTCHAR U+3372 +ENCODING 13170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0200 +0200 +0200 +3A3C +4642 +4202 +423E +4242 +4242 +4646 +3A3A +0000 +0000 +ENDCHAR +STARTCHAR U+3373 +ENCODING 13171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +1842 +2442 +2442 +4242 +4242 +7E42 +4242 +4242 +4242 +423C +0000 +0000 +ENDCHAR +STARTCHAR U+3374 +ENCODING 13172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +4000 +4000 +4000 +5194 +6A5A +4852 +49D0 +4A50 +4A50 +6AD0 +5150 +0000 +0000 +ENDCHAR +STARTCHAR U+3375 +ENCODING 13173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0041 +0041 +3C41 +4222 +4222 +4222 +4214 +4214 +4208 +3C08 +0000 +0000 +ENDCHAR +STARTCHAR U+3376 +ENCODING 13174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +5C3C +6242 +4240 +4240 +4240 +4240 +6242 +5C3C +4000 +4000 +ENDCHAR +STARTCHAR U+3380 +ENCODING 13184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +0028 +0028 +0028 +5C44 +E244 +427C +4244 +4282 +6282 +5C82 +41C7 +4000 +E000 +ENDCHAR +STARTCHAR U+3381 +ENCODING 13185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +0028 +0028 +0028 +5C44 +E444 +447C +4444 +4482 +4482 +4482 +EFC7 +0000 +0000 +ENDCHAR +STARTCHAR U+3382 +ENCODING 13186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +0028 +0028 +0028 +4244 +4244 +427C +4444 +8482 +8482 +8482 +FBC7 +8000 +8000 +ENDCHAR +STARTCHAR U+3383 +ENCODING 13187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +0028 +0028 +0028 +7C44 +D444 +547C +5444 +5482 +5482 +5482 +FFC7 +0000 +0000 +ENDCHAR +STARTCHAR U+3384 +ENCODING 13188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4010 +C010 +4028 +4028 +4028 +4744 +4244 +447C +7844 +5882 +4C82 +4682 +E7C7 +0000 +0000 +ENDCHAR +STARTCHAR U+3385 +ENCODING 13189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +427C +4442 +4842 +5042 +607C +6042 +5042 +4842 +4442 +427C +0000 +0000 +ENDCHAR +STARTCHAR U+3386 +ENCODING 13190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +427C +4242 +6642 +6642 +5A7C +5A42 +4242 +4242 +4242 +427C +0000 +0000 +ENDCHAR +STARTCHAR U+3387 +ENCODING 13191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3C7C +4242 +4242 +4042 +407C +4E42 +4242 +4242 +4642 +3A7C +0000 +0000 +ENDCHAR +STARTCHAR U+3388 +ENCODING 13192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0002 +0006 +0002 +0002 +0002 +38F2 +450A +400A +40FA +410A +410A +470A +38FF +0000 +0000 +ENDCHAR +STARTCHAR U+3389 +ENCODING 13193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4006 +C002 +4002 +4002 +4002 +4DBA +4A4A +520A +723A +524A +4A4A +464A +EFBF +0000 +0000 +ENDCHAR +STARTCHAR U+338A +ENCODING 13194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +0082 +0080 +0080 +0088 +5CF8 +E288 +4280 +4280 +4280 +6280 +5C80 +41C0 +4000 +E000 +ENDCHAR +STARTCHAR U+338B +ENCODING 13195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +0082 +0080 +0080 +0088 +5CF8 +E488 +4480 +4480 +4480 +4480 +4480 +EFC0 +0000 +0000 +ENDCHAR +STARTCHAR U+338C +ENCODING 13196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00FE +0041 +0040 +0040 +0044 +447C +4444 +4440 +4440 +8840 +8840 +8940 +F6E0 +8000 +8000 +ENDCHAR +STARTCHAR U+338D +ENCODING 13197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0006 +2238 +2244 +2244 +22B8 +4480 +44FC +4482 +7B82 +4082 +407C +ENDCHAR +STARTCHAR U+338E +ENCODING 13198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0006 +3E38 +6A44 +2A44 +2AB8 +2A80 +2AFC +2A82 +7F82 +0082 +007C +ENDCHAR +STARTCHAR U+338F +ENCODING 13199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +6000 +2000 +2000 +2000 +2006 +23B8 +2244 +2444 +38B8 +2C80 +26FC +2382 +7782 +0082 +007C +ENDCHAR +STARTCHAR U+3390 +ENCODING 13200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +E380 +4100 +4100 +4100 +4100 +413F +7F42 +4104 +4108 +4110 +4120 +4141 +E3FE +0000 +0000 +ENDCHAR +STARTCHAR U+3391 +ENCODING 13201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4770 +C220 +4220 +4220 +4220 +4E2F +4BF1 +5222 +7224 +5224 +4A28 +4A31 +FF7F +0000 +0000 +ENDCHAR +STARTCHAR U+3392 +ENCODING 13202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +8BF0 +8920 +D920 +D920 +D920 +A92F +A9F1 +A922 +A924 +A924 +8928 +8931 +8BFE +0000 +0000 +ENDCHAR +STARTCHAR U+3393 +ENCODING 13203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BF0 +8520 +8120 +8120 +8120 +812F +81F1 +9D22 +8924 +8924 +8928 +8931 +7BFE +0000 +0000 +ENDCHAR +STARTCHAR U+3394 +ENCODING 13204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFE0 +AA40 +2240 +2240 +2240 +225F +23E1 +2242 +2244 +2244 +2248 +2251 +77FE +0000 +0000 +ENDCHAR +STARTCHAR U+3395 +ENCODING 13205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000C +0014 +0014 +0024 +0024 +1128 +1148 +1148 +2250 +2252 +2262 +2224 +5DF8 +4000 +4000 +ENDCHAR +STARTCHAR U+3396 +ENCODING 13206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000C +0014 +0014 +0014 +0014 +5B24 +ED28 +4928 +4928 +4928 +4932 +4924 +DBD8 +0000 +0000 +ENDCHAR +STARTCHAR U+3397 +ENCODING 13207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0218 +0624 +0224 +0224 +0224 +3E48 +4248 +4248 +4250 +4250 +4262 +42C4 +3F38 +0000 +0000 +ENDCHAR +STARTCHAR U+3398 +ENCODING 13208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4018 +C024 +4024 +4024 +4044 +4F48 +4448 +4848 +7050 +5850 +4C62 +4644 +E7B8 +0000 +0000 +ENDCHAR +STARTCHAR U+3399 +ENCODING 13209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1C00 +2600 +2000 +2000 +78EC +2334 +2124 +2124 +2124 +2124 +2124 +73B6 +0000 +0000 +ENDCHAR +STARTCHAR U+339A +ENCODING 13210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +2C7C +74D4 +2454 +2454 +2454 +2454 +2454 +6EFE +0000 +0000 +ENDCHAR +STARTCHAR U+339B +ENCODING 13211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +24B6 +25DA +2492 +4492 +4892 +4892 +4892 +F5DB +8000 +8000 +ENDCHAR +STARTCHAR U+339C +ENCODING 13212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +3E7C +6AD4 +2A54 +2A54 +2A54 +2A54 +2A54 +7FFE +0000 +0000 +ENDCHAR +STARTCHAR U+339D +ENCODING 13213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +1C7C +22D4 +4054 +4054 +4054 +4054 +2354 +1CFE +0000 +0000 +ENDCHAR +STARTCHAR U+339E +ENCODING 13214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +C000 +4000 +4000 +4000 +4000 +4F7C +44D4 +4854 +5854 +7854 +4C54 +4654 +E7FE +0000 +0000 +ENDCHAR +STARTCHAR U+339F +ENCODING 13215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000F +0001 +000F +0008 +000F +0000 +3E7C +6AD4 +2A54 +2A54 +2A54 +2A54 +2A54 +7FFE +0000 +0000 +ENDCHAR +STARTCHAR U+33A0 +ENCODING 13216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000F +0001 +000F +0008 +000F +0000 +1C7C +22D4 +4054 +4054 +4054 +40D4 +2354 +1CFE +0000 +0000 +ENDCHAR +STARTCHAR U+33A1 +ENCODING 13217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001E +0002 +001E +0010 +001E +0000 +1770 +3990 +1110 +1110 +1110 +1110 +1110 +3BB8 +0000 +0000 +ENDCHAR +STARTCHAR U+33A2 +ENCODING 13218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000F +C001 +400F +4008 +400F +4000 +4F7C +44D4 +4854 +5854 +7854 +4C54 +4654 +E7FE +0000 +0000 +ENDCHAR +STARTCHAR U+33A3 +ENCODING 13219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000F +0001 +0007 +0001 +000F +0000 +3E7C +6AD4 +2A54 +2A54 +2A54 +2A54 +2A54 +7FFE +0000 +0000 +ENDCHAR +STARTCHAR U+33A4 +ENCODING 13220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000F +0001 +0007 +0001 +000F +0000 +1C7C +22D4 +4054 +4054 +4054 +4054 +2354 +1CFE +0000 +0000 +ENDCHAR +STARTCHAR U+33A5 +ENCODING 13221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001E +0002 +000E +0002 +001E +0000 +1770 +3990 +1110 +1110 +1110 +1110 +1110 +3BB8 +0000 +0000 +ENDCHAR +STARTCHAR U+33A6 +ENCODING 13222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000F +4001 +C007 +4001 +400F +4000 +4F7C +44D4 +4854 +7854 +4C54 +4654 +4354 +E7FE +0000 +0000 +ENDCHAR +STARTCHAR U+33A7 +ENCODING 13223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7C02 +D404 +5408 +5410 +5420 +5440 +54BE +FF41 +0141 +0230 +040C +0802 +1041 +2041 +403E +ENDCHAR +STARTCHAR U+33A8 +ENCODING 13224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7C17 +D411 +5427 +5444 +5447 +5480 +553E +FE42 +0241 +0430 +080C +0802 +1041 +2021 +403E +ENDCHAR +STARTCHAR U+33A9 +ENCODING 13225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E00 +2100 +2100 +2100 +2100 +2178 +3E84 +2004 +207C +2084 +2084 +2084 +707A +0000 +0000 +ENDCHAR +STARTCHAR U+33AA +ENCODING 13226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +43C0 +C120 +4120 +4120 +4120 +4F3C +45E2 +4902 +711E +5922 +4D22 +4722 +E79D +0000 +0000 +ENDCHAR +STARTCHAR U+33AB +ENCODING 13227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +8BC0 +8920 +D920 +D920 +D920 +A93E +A9E2 +A902 +A91E +A922 +8922 +8922 +8BBD +0000 +0000 +ENDCHAR +STARTCHAR U+33AC +ENCODING 13228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BC0 +8520 +8120 +8120 +8120 +813E +81E2 +9D02 +891E +8922 +8922 +8922 +7B9D +0000 +0000 +ENDCHAR +STARTCHAR U+33AD +ENCODING 13229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0002 +0006 +0002 +0002 +0002 +5B1E +E4A2 +40A2 +47A2 +48A2 +48A2 +48A2 +E7DF +0000 +0000 +ENDCHAR +STARTCHAR U+33AE +ENCODING 13230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0041 +00C2 +0042 +DDC4 +6544 +5D48 +5548 +5550 +5556 +FEE9 +0048 +0084 +0082 +0101 +0209 +0406 +ENDCHAR +STARTCHAR U+33AF +ENCODING 13231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +00CF +0049 +DDD7 +6554 +4557 +5D60 +5560 +554E +FED1 +0050 +008C +0082 +0101 +0111 +020E +ENDCHAR +STARTCHAR U+33B0 +ENCODING 13232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +2E3C +7142 +2140 +2138 +2104 +2102 +3E42 +203C +2000 +7000 +ENDCHAR +STARTCHAR U+33B1 +ENCODING 13233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +2E3C +7242 +2240 +2238 +2204 +2202 +2242 +773C +0000 +0000 +ENDCHAR +STARTCHAR U+33B2 +ENCODING 13234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +223C +2242 +2240 +2238 +4404 +4402 +44C2 +7B3C +4000 +4000 +ENDCHAR +STARTCHAR U+33B3 +ENCODING 13235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +3E3C +6A42 +2A40 +2A38 +2A04 +2A02 +2A42 +7F3C +0000 +0000 +ENDCHAR +STARTCHAR U+33B4 +ENCODING 13236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +038E +0104 +0104 +0088 +0088 +5C88 +E288 +4250 +4250 +4250 +6250 +5C20 +4020 +4000 +E000 +ENDCHAR +STARTCHAR U+33B5 +ENCODING 13237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +038E +0104 +0104 +0088 +0088 +5C88 +E488 +4450 +4450 +4450 +4450 +4420 +EE20 +0000 +0000 +ENDCHAR +STARTCHAR U+33B6 +ENCODING 13238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +038E +0104 +0104 +0088 +0088 +2288 +2288 +2250 +2250 +4450 +4450 +4520 +7A20 +4000 +4000 +ENDCHAR +STARTCHAR U+33B7 +ENCODING 13239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +038E +0104 +0104 +0088 +0088 +3E88 +6A88 +2A50 +2A50 +2A50 +2A50 +2A20 +7F20 +0000 +0000 +ENDCHAR +STARTCHAR U+33B8 +ENCODING 13240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +61C7 +2082 +2082 +2044 +2044 +23C4 +2144 +2228 +3C28 +2628 +2328 +2190 +73D0 +0000 +0000 +ENDCHAR +STARTCHAR U+33B9 +ENCODING 13241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +E1C7 +6182 +6382 +6344 +5344 +5544 +5544 +5528 +5528 +5528 +4928 +4910 +CB90 +0000 +0000 +ENDCHAR +STARTCHAR U+33BA +ENCODING 13242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0777 +0222 +0222 +0222 +0122 +5914 +E514 +4494 +4494 +44B4 +64C8 +5848 +4048 +4000 +E000 +ENDCHAR +STARTCHAR U+33BB +ENCODING 13243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0777 +0222 +0222 +0222 +0122 +5D14 +E514 +4494 +4494 +44B4 +44C8 +4448 +EE48 +0000 +0000 +ENDCHAR +STARTCHAR U+33BC +ENCODING 13244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0777 +0222 +0222 +0222 +0122 +4514 +4514 +4494 +4494 +88B4 +88C8 +8948 +F648 +8000 +8000 +ENDCHAR +STARTCHAR U+33BD +ENCODING 13245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0777 +0222 +0222 +0222 +0122 +7D14 +D514 +5494 +5494 +54B4 +54C8 +5448 +FE48 +0000 +0000 +ENDCHAR +STARTCHAR U+33BE +ENCODING 13246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4777 +C222 +4222 +4222 +4122 +4F14 +4514 +4894 +7094 +58B4 +4CC8 +4648 +EF48 +0000 +0000 +ENDCHAR +STARTCHAR U+33BF +ENCODING 13247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +8377 +C322 +C722 +C722 +AB22 +AA94 +AA94 +BA94 +9294 +92B4 +9248 +9248 +9248 +0000 +0000 +ENDCHAR +STARTCHAR U+33C0 +ENCODING 13248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4070 +C18C +4306 +4306 +4306 +5F06 +4B06 +5306 +718C +58D8 +4C51 +4652 +EFDE +0000 +0000 +ENDCHAR +STARTCHAR U+33C1 +ENCODING 13249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +8878 +88CC +8986 +D986 +D986 +D986 +A986 +A986 +A8CC +A848 +AA49 +894A +89CE +0000 +0000 +ENDCHAR +STARTCHAR U+33C2 +ENCODING 13250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +38EC +C9B4 +08A4 +78A4 +88A4 +88A4 +88A4 +7AB5 +0000 +0000 +ENDCHAR +STARTCHAR U+33C3 +ENCODING 13251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7C00 +2200 +2200 +2200 +2200 +3C3C +2244 +2144 +2144 +2144 +2144 +223C +7C04 +0004 +000E +ENDCHAR +STARTCHAR U+33C4 +ENCODING 13252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +1C38 +2244 +4080 +4080 +4080 +4080 +2346 +1C38 +0000 +0000 +ENDCHAR +STARTCHAR U+33C5 +ENCODING 13253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0004 +000C +0004 +0004 +0004 +3C7C +4284 +4084 +4084 +4084 +4084 +4284 +3C7E +0000 +0000 +ENDCHAR +STARTCHAR U+33C6 +ENCODING 13254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7020 +8840 +8080 +8100 +8A00 +7603 +0E7E +122A +224E +4390 +82CE +0271 +0231 +0739 +000E +ENDCHAR +STARTCHAR U+33C7 +ENCODING 13255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1D00 +2300 +4080 +4000 +4000 +403C +4042 +4042 +4042 +4042 +40C2 +2142 +1E3D +0000 +0000 +ENDCHAR +STARTCHAR U+33C8 +ENCODING 13256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +05FC +0482 +0482 +0482 +0482 +7CFC +8482 +8481 +8481 +8481 +8481 +8482 +7DFC +0000 +0000 +ENDCHAR +STARTCHAR U+33C9 +ENCODING 13257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E00 +4100 +8000 +8000 +8000 +80E7 +8042 +8022 +83A4 +8114 +8118 +4308 +3D10 +0010 +0060 +ENDCHAR +STARTCHAR U+33CA +ENCODING 13258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +6000 +2000 +2000 +2000 +2E78 +3284 +2204 +227C +2284 +2284 +228C +7776 +0000 +0000 +ENDCHAR +STARTCHAR U+33CB +ENCODING 13259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +427C +4242 +4242 +4242 +7E7C +4240 +4240 +4240 +4240 +4240 +0000 +0000 +ENDCHAR +STARTCHAR U+33CC +ENCODING 13260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0800 +0800 +0000 +185C +0862 +0842 +0842 +0842 +0842 +0842 +3E42 +0000 +0000 +ENDCHAR +STARTCHAR U+33CD +ENCODING 13261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +4242 +4444 +4848 +5050 +6060 +6060 +5050 +4848 +4444 +4242 +0000 +0000 +ENDCHAR +STARTCHAR U+33CE +ENCODING 13262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +E782 +4282 +42C6 +44C6 +48C6 +50EE +60AA +50AA +4892 +4492 +4282 +4282 +E7C6 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+33CF +ENCODING 13263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +6000 +2000 +2010 +2010 +2010 +23BC +2210 +2410 +3810 +2C10 +2611 +2312 +779C +0000 +0000 +ENDCHAR +STARTCHAR U+33D0 +ENCODING 13264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +6000 +2000 +2000 +2000 +216C +23B4 +2124 +2124 +2124 +2124 +2124 +73B6 +0000 +0000 +ENDCHAR +STARTCHAR U+33D1 +ENCODING 13265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +E000 +6000 +6000 +6000 +6700 +6378 +638C +630C +630C +630C +630C +630C +F71E +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+33D2 +ENCODING 13266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +C000 +4000 +4000 +4000 +4000 +4E1A +5126 +5124 +5118 +5110 +513C +5142 +EE42 +0042 +003C +0000 +ENDCHAR +STARTCHAR U+33D3 +ENCODING 13267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +6000 +2000 +2000 +2000 +239C +2108 +2090 +2060 +2060 +2090 +2108 +739C +0000 +0000 +ENDCHAR +STARTCHAR U+33D4 +ENCODING 13268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0040 +0040 +0040 +765C +4962 +4942 +4942 +4942 +4942 +4962 +495C +0000 +0000 +ENDCHAR +STARTCHAR U+33D5 +ENCODING 13269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001C +00CC +00CC +000C +D1CC +7CCC +54CC +54CC +54CC +54CC +54CC +54CC +FFFE +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+33D6 +ENCODING 13270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0002 +0006 +0002 +0002 +0002 +7C72 +D48A +548A +548A +548A +548A +548A +FE77 +0000 +0000 +ENDCHAR +STARTCHAR U+33D7 +ENCODING 13271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +7C42 +4242 +4242 +4242 +7C7E +4042 +4042 +4042 +4042 +4042 +0000 +0000 +ENDCHAR +STARTCHAR U+33D8 +ENCODING 13272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +58EC +E5B4 +44A4 +44A4 +44A4 +78A4 +40A4 +E5AD +0000 +0000 +ENDCHAR +STARTCHAR U+33D9 +ENCODING 13273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +7391 +4A51 +4A5B +4A5B +7395 +4215 +4211 +4211 +4211 +4211 +0000 +0000 +ENDCHAR +STARTCHAR U+33DA +ENCODING 13274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +7C7C +4242 +4242 +4242 +7C7C +4048 +4044 +4044 +4042 +4042 +0000 +0000 +ENDCHAR +STARTCHAR U+33DB +ENCODING 13275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +3C2C +4272 +4020 +3820 +0420 +0220 +4220 +3C70 +0000 +0000 +ENDCHAR +STARTCHAR U+33DC +ENCODING 13276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E00 +4100 +4080 +4000 +2000 +19C7 +0682 +0144 +00C4 +00A8 +40A8 +2110 +3E10 +0000 +0000 +ENDCHAR +STARTCHAR U+33DD +ENCODING 13277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +EEF0 +4450 +4450 +4450 +4450 +225E +2291 +2691 +2691 +2A91 +1111 +1111 +113E +0000 +0000 +ENDCHAR +STARTCHAR U+4E00 +ENCODING 19968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFC +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+4E01 +ENCODING 19969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4E02 +ENCODING 19970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +0100 +0300 +0200 +0600 +0400 +07F0 +0010 +0010 +0010 +0010 +0010 +0020 +01C0 +0000 +ENDCHAR +STARTCHAR U+4E03 +ENCODING 19971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0400 +0400 +0400 +043C +07C0 +7C00 +0400 +0400 +0400 +0400 +0408 +0408 +03F8 +0000 +ENDCHAR +STARTCHAR U+4E04 +ENCODING 19972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +FFFF +0000 +ENDCHAR +STARTCHAR U+4E05 +ENCODING 19973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E07 +ENCODING 19975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0200 +0200 +0200 +03F0 +0210 +0210 +0410 +0410 +0810 +1010 +2010 +4060 +0000 +ENDCHAR +STARTCHAR U+4E08 +ENCODING 19976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0100 +0100 +1100 +0900 +0500 +0300 +0300 +04C0 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+4E09 +ENCODING 19977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0000 +0000 +0000 +0000 +1FF0 +0000 +0000 +0000 +0000 +0000 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E0A +ENCODING 19978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +0200 +0200 +03F0 +0200 +0200 +0200 +0200 +0200 +0200 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E0B +ENCODING 19979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +0180 +0140 +0120 +0110 +0110 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E0C +ENCODING 19980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0840 +0840 +1040 +2040 +ENDCHAR +STARTCHAR U+4E0D +ENCODING 19981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0080 +0080 +0100 +0380 +0560 +1910 +6108 +0104 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E0E +ENCODING 19982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0400 +07F0 +0400 +0400 +07C0 +0440 +0040 +7FFC +0040 +0040 +0040 +0040 +0380 +0000 +ENDCHAR +STARTCHAR U+4E0F +ENCODING 19983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7FFF +0080 +0080 +10FC +1084 +1084 +1084 +1FFC +0004 +0004 +0008 +0090 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+4E10 +ENCODING 19984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +21F8 +2100 +2100 +3FF8 +2008 +0008 +0008 +0010 +0010 +0060 +0000 +ENDCHAR +STARTCHAR U+4E11 +ENCODING 19985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +0220 +0220 +0220 +0220 +3FF8 +0420 +0420 +0420 +0420 +0420 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E12 +ENCODING 19986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFC +0104 +1904 +0D04 +0704 +0204 +0704 +0584 +0C8C +1808 +3008 +E078 +0000 +FFFF +0000 +ENDCHAR +STARTCHAR U+4E13 +ENCODING 19987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0110 +3FF8 +0200 +0204 +FFFE +0400 +0400 +0FF8 +0010 +0020 +0040 +0680 +0180 +0040 +ENDCHAR +STARTCHAR U+4E14 +ENCODING 19988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0820 +0820 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E15 +ENCODING 19989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0080 +0100 +0380 +0560 +0910 +3108 +4104 +0100 +0100 +0000 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+4E16 +ENCODING 19990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1220 +1220 +1220 +7FFC +1220 +1220 +1220 +13E0 +1220 +1000 +1000 +1FF8 +1000 +0000 +ENDCHAR +STARTCHAR U+4E17 +ENCODING 19991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1110 +1110 +1110 +7FFC +1110 +1110 +1110 +1110 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+4E18 +ENCODING 19992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +00C0 +0F00 +0800 +0800 +0FF8 +0840 +0840 +0840 +0840 +0840 +0840 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E19 +ENCODING 19993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +3FF8 +2108 +2108 +2288 +2248 +2428 +2828 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+4E1A +ENCODING 19994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0440 +0440 +0440 +4444 +2444 +2448 +1448 +1450 +1450 +1460 +0440 +0440 +0444 +FFFE +0000 +ENDCHAR +STARTCHAR U+4E1B +ENCODING 19995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +0820 +0820 +0850 +0850 +1450 +1290 +2188 +410E +8204 +0000 +FFFE +0000 +ENDCHAR +STARTCHAR U+4E1C +ENCODING 19996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +0204 +FFFE +0400 +0900 +0900 +1110 +3FF8 +0100 +0940 +0920 +1110 +2118 +4508 +0200 +ENDCHAR +STARTCHAR U+4E1D +ENCODING 19997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +0810 +1020 +1020 +2244 +7EFC +0408 +0810 +1020 +2040 +7EFC +0000 +0004 +FFFE +0000 +ENDCHAR +STARTCHAR U+4E1E +ENCODING 19998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0040 +0088 +3D48 +0550 +0920 +0920 +1110 +2108 +4304 +0000 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+4E1F +ENCODING 19999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +0100 +0100 +3FFC +0100 +0100 +0100 +FFFF +0200 +0610 +0418 +0C08 +08FC +1F84 +7006 +ENDCHAR +STARTCHAR U+4E21 +ENCODING 20001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +3FF8 +2108 +2928 +2928 +2928 +2928 +2FE8 +2828 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+4E22 +ENCODING 20002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F0 +3F00 +0100 +0100 +0110 +3FF8 +0100 +0100 +0104 +FFFE +0200 +0400 +0820 +1010 +3FF8 +0008 +ENDCHAR +STARTCHAR U+4E23 +ENCODING 20003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +0240 +0240 +0240 +3E7C +2244 +2244 +2244 +3E7C +0240 +0240 +0440 +0440 +0840 +1040 +ENDCHAR +STARTCHAR U+4E24 +ENCODING 20004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0440 +0444 +7FFE +4444 +4444 +4444 +4444 +4444 +4AA4 +511C +620C +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+4E25 +ENCODING 20005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0240 +1248 +0A50 +0244 +3FFE +2000 +2000 +2000 +2000 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U+4E26 +ENCODING 20006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +7FFC +0440 +0440 +2448 +1448 +1450 +1460 +0440 +0440 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E27 +ENCODING 20007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0110 +3FF8 +0100 +1110 +0D30 +0544 +FFFE +1010 +1220 +1140 +1080 +1040 +1430 +180E +1004 +ENDCHAR +STARTCHAR U+4E28 +ENCODING 20008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+4E2A +ENCODING 20010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0280 +0440 +0820 +1110 +2108 +4104 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E2B +ENCODING 20011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2010 +1030 +0C40 +0480 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+4E2C +ENCODING 20012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1000 +9000 +5000 +5000 +1000 +1000 +1000 +3000 +5000 +9000 +1000 +1000 +1000 +1000 +ENDCHAR +STARTCHAR U+4E2D +ENCODING 20013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +3FF8 +2108 +2108 +2108 +2108 +3FF8 +2108 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E2E +ENCODING 20014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FF8 +0008 +0208 +0208 +0208 +3FE8 +0208 +0208 +0208 +7FF8 +0208 +0208 +020D +0207 +0202 +ENDCHAR +STARTCHAR U+4E2F +ENCODING 20015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +01FC +1F00 +0100 +0100 +01F8 +3F00 +0100 +0100 +01FE +7F00 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+4E30 +ENCODING 20016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0108 +7FFC +0100 +0100 +0110 +3FF8 +0100 +0100 +0104 +FFFE +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+4E31 +ENCODING 20017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +0480 +4488 +4488 +4488 +4488 +4488 +4488 +7CF8 +4488 +0880 +0880 +1080 +2080 +0000 +ENDCHAR +STARTCHAR U+4E32 +ENCODING 20018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1FF0 +1110 +1110 +1FF0 +0100 +3FF8 +2108 +2108 +3FF8 +2108 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E33 +ENCODING 20019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0220 +1FFC +1224 +1224 +1FFC +0220 +3FFE +2222 +2222 +3FFE +0420 +0820 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+4E34 +ENCODING 20020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +5104 +51FE +5200 +5480 +5860 +5024 +57FE +5444 +5444 +5444 +5444 +1444 +17FC +1404 +ENDCHAR +STARTCHAR U+4E35 +ENCODING 20021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +0240 +1248 +1248 +1248 +FFFF +0810 +0410 +0420 +1FF8 +0100 +0100 +3FFC +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+4E36 +ENCODING 20022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0200 +0100 +0080 +0080 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+4E38 +ENCODING 20024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +0200 +7FC0 +0240 +0240 +1A40 +0640 +0540 +08C4 +1044 +2044 +403C +0000 +ENDCHAR +STARTCHAR U+4E39 +ENCODING 20025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0A20 +0920 +0920 +0820 +7FFC +0820 +0820 +1020 +1020 +2020 +4060 +0000 +ENDCHAR +STARTCHAR U+4E3A +ENCODING 20026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +1080 +0C80 +0480 +0084 +FFFE +0104 +0104 +0204 +0284 +0464 +0824 +1004 +2004 +4028 +0010 +ENDCHAR +STARTCHAR U+4E3B +ENCODING 20027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0100 +0100 +3FF8 +0100 +0100 +0100 +1FF0 +0100 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E3C +ENCODING 20028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0420 +0420 +3FFC +0420 +0520 +04A0 +04A0 +7FFC +0420 +0820 +0820 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+4E3D +ENCODING 20029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0000 +0008 +3EFC +2288 +2288 +2288 +32C8 +2AA8 +2288 +2288 +2288 +2288 +2AA8 +2490 +ENDCHAR +STARTCHAR U+4E3E +ENCODING 20030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +1918 +0920 +0044 +FFFE +0440 +0920 +1110 +2FEE +C104 +0110 +3FF8 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+4E3F +ENCODING 20031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +0020 +0020 +0020 +0020 +0020 +0020 +0020 +0040 +0040 +0080 +0100 +0600 +1800 +0000 +ENDCHAR +STARTCHAR U+4E40 +ENCODING 20032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0400 +0A00 +1A00 +1200 +3300 +0100 +0100 +0180 +0080 +0040 +0060 +0030 +000C +0003 +ENDCHAR +STARTCHAR U+4E41 +ENCODING 20033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3E00 +0200 +0200 +0200 +0300 +0100 +0100 +0180 +0080 +0040 +0060 +0030 +000C +0003 +ENDCHAR +STARTCHAR U+4E42 +ENCODING 20034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +1020 +1020 +0820 +0840 +0840 +0440 +0480 +0280 +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+4E43 +ENCODING 20035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FC0 +0440 +0440 +0440 +0440 +0478 +0448 +0408 +0808 +0808 +1008 +2008 +4070 +0000 +ENDCHAR +STARTCHAR U+4E44 +ENCODING 20036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0006 +000C +0018 +0730 +01E0 +00C0 +01E0 +0330 +2600 +2400 +2C00 +3800 +3000 +6000 +0000 +ENDCHAR +STARTCHAR U+4E45 +ENCODING 20037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +03E0 +0420 +0420 +0840 +1040 +20C0 +0120 +0220 +0410 +1808 +6004 +0000 +ENDCHAR +STARTCHAR U+4E47 +ENCODING 20039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +03F8 +7E00 +0200 +0200 +0200 +0208 +03FC +FE00 +0200 +0200 +0200 +0200 +0202 +0202 +01FE +ENDCHAR +STARTCHAR U+4E48 +ENCODING 20040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0200 +0200 +0440 +0840 +1080 +2100 +4100 +0200 +0420 +0810 +1008 +3FFC +0004 +0000 +ENDCHAR +STARTCHAR U+4E49 +ENCODING 20041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +2108 +2110 +1010 +1020 +0820 +0840 +0440 +0280 +0100 +0280 +0460 +0818 +100E +6004 +ENDCHAR +STARTCHAR U+4E4B +ENCODING 20043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +3FF0 +0010 +0020 +0020 +0040 +0080 +1100 +1A00 +1400 +2300 +40FC +0000 +ENDCHAR +STARTCHAR U+4E4C +ENCODING 20044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0420 +1FF0 +1020 +1020 +1020 +10A0 +1040 +1004 +1FFE +0004 +0024 +FFF4 +0004 +0028 +0010 +ENDCHAR +STARTCHAR U+4E4D +ENCODING 20045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0400 +0400 +0FFC +0900 +1100 +21F8 +4100 +0100 +01F8 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E4E +ENCODING 20046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3FC0 +0110 +1110 +0920 +0940 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4E4F +ENCODING 20047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +00E0 +3F00 +0100 +0100 +1FF0 +0010 +0020 +0040 +0980 +0E00 +1400 +2300 +40FC +0000 +ENDCHAR +STARTCHAR U+4E50 +ENCODING 20048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +00F0 +1F00 +1000 +1100 +1100 +2104 +7FFE +0100 +0100 +0920 +0910 +1108 +210C +4504 +0200 +ENDCHAR +STARTCHAR U+4E51 +ENCODING 20049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +00E0 +0780 +3D00 +0100 +1100 +3104 +610C +C158 +0160 +1130 +3118 +610C +C107 +0100 +0100 +ENDCHAR +STARTCHAR U+4E52 +ENCODING 20050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0030 +0FC0 +0800 +0800 +0808 +0FFC +0820 +0820 +0820 +0824 +FFFE +0000 +0200 +0600 +0800 +1000 +ENDCHAR +STARTCHAR U+4E53 +ENCODING 20051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0030 +0FC0 +0800 +0800 +0810 +0FF8 +0820 +0820 +0820 +0824 +FFFE +0000 +0040 +0030 +0018 +0008 +ENDCHAR +STARTCHAR U+4E54 +ENCODING 20052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F0 +1F00 +0200 +0204 +FFFE +0440 +0420 +0850 +344E +C444 +0440 +0440 +0840 +0840 +1040 +0040 +ENDCHAR +STARTCHAR U+4E55 +ENCODING 20053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0078 +1F80 +1080 +1FFC +1080 +1FFC +1080 +17F8 +1488 +1488 +2488 +24B0 +4080 +0080 +0000 +ENDCHAR +STARTCHAR U+4E56 +ENCODING 20054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +0100 +7FFC +0100 +0920 +792C +0930 +0920 +1924 +691C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E57 +ENCODING 20055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +1F80 +0100 +3FF8 +0920 +7FFC +0920 +3FF8 +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4E58 +ENCODING 20056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +1F80 +0100 +7FFC +0548 +3D70 +0540 +1D48 +6538 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+4E59 +ENCODING 20057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FE0 +0040 +0080 +0100 +0200 +0400 +0800 +1000 +2008 +2008 +2008 +1FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+4E5A +ENCODING 20058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0801 +0C03 +07FE +0000 +ENDCHAR +STARTCHAR U+4E5C +ENCODING 20060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0820 +0870 +09A0 +0E20 +1820 +6820 +0820 +08A0 +0844 +0804 +0804 +07FC +0000 +ENDCHAR +STARTCHAR U+4E5D +ENCODING 20061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +0200 +7FC0 +0240 +0240 +0240 +0440 +0440 +0844 +1044 +2044 +403C +0000 +ENDCHAR +STARTCHAR U+4E5E +ENCODING 20062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +1FF8 +1000 +2000 +4FC0 +0100 +0200 +0400 +0800 +1008 +1008 +0FF8 +0000 +ENDCHAR +STARTCHAR U+4E5F +ENCODING 20063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1100 +1100 +1130 +11D0 +1710 +1910 +7110 +1110 +1110 +1160 +1004 +1004 +0FFC +0000 +ENDCHAR +STARTCHAR U+4E60 +ENCODING 20064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0004 +FFFE +0004 +0804 +0404 +0204 +0224 +00C4 +0304 +0C04 +3004 +1004 +0044 +0028 +0010 +ENDCHAR +STARTCHAR U+4E61 +ENCODING 20065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +0420 +0820 +1040 +3F80 +0100 +0208 +0408 +3FF0 +0020 +0040 +0080 +0300 +0C00 +7000 +ENDCHAR +STARTCHAR U+4E62 +ENCODING 20066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +5480 +5480 +5480 +5480 +5480 +5480 +5480 +7C84 +4484 +4084 +007C +0000 +ENDCHAR +STARTCHAR U+4E63 +ENCODING 20067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +3020 +2020 +6020 +C220 +6620 +3420 +0C20 +1820 +1220 +3320 +2120 +7FA1 +C0B3 +001E +ENDCHAR +STARTCHAR U+4E66 +ENCODING 20070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0210 +020C +7FE4 +0220 +0220 +0220 +0220 +FFFC +0204 +0204 +0204 +0204 +0228 +0210 +0200 +ENDCHAR +STARTCHAR U+4E68 +ENCODING 20072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +3020 +2220 +2320 +6120 +4FA0 +F8A0 +0020 +0020 +7F20 +4120 +4120 +4121 +4133 +7F1E +ENDCHAR +STARTCHAR U+4E69 +ENCODING 20073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1240 +1F40 +1040 +1040 +1040 +1240 +7F40 +4240 +4240 +4242 +4242 +4242 +7E3E +4200 +ENDCHAR +STARTCHAR U+4E6B +ENCODING 20075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +7F3E +0922 +0922 +1122 +1122 +233E +4000 +0000 +7FFC +00F0 +0700 +3800 +4001 +7FFF +ENDCHAR +STARTCHAR U+4E6D +ENCODING 20077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +0400 +0800 +1FFC +6804 +0804 +0FFC +0000 +3FFC +0070 +0380 +1C01 +2001 +3FFF +0000 +ENDCHAR +STARTCHAR U+4E70 +ENCODING 20080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFC +0084 +0888 +0680 +0280 +2080 +1900 +0904 +FFFE +0200 +02C0 +0430 +0818 +300C +C004 +ENDCHAR +STARTCHAR U+4E71 +ENCODING 20081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +0C40 +3840 +0840 +0840 +7F40 +0840 +0840 +3E40 +2240 +2240 +2244 +3E44 +223C +0000 +ENDCHAR +STARTCHAR U+4E73 +ENCODING 20083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0340 +7C40 +1140 +4940 +2A40 +2440 +3F40 +0240 +0440 +0740 +7C40 +0444 +0444 +0C3C +0000 +ENDCHAR +STARTCHAR U+4E74 +ENCODING 20084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +10FC +FE80 +1080 +10FF +1C88 +F088 +1188 +3308 +0000 +1FF8 +0060 +0380 +0C02 +1806 +0FFC +ENDCHAR +STARTCHAR U+4E75 +ENCODING 20085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FFA0 +4120 +6320 +2220 +2220 +FFA0 +0820 +0820 +0820 +FFA0 +0820 +0821 +0833 +081E +ENDCHAR +STARTCHAR U+4E76 +ENCODING 20086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0080 +3FFE +2082 +3FFE +2082 +3FFE +2082 +2086 +1FFC +0038 +01C0 +0E00 +1001 +1FFF +ENDCHAR +STARTCHAR U+4E77 +ENCODING 20087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1148 +0244 +4442 +2040 +0042 +10CC +2030 +40C0 +0700 +7FFC +01E0 +1E01 +6001 +7FFF +0000 +ENDCHAR +STARTCHAR U+4E79 +ENCODING 20089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FFA0 +0820 +7F20 +4120 +4120 +7F20 +4120 +4120 +7F20 +0820 +FFA1 +0821 +0833 +081E +ENDCHAR +STARTCHAR U+4E7E +ENCODING 20094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +7FFC +0880 +3F00 +22F8 +3E10 +2220 +3E40 +0840 +7F80 +0884 +0884 +087C +0000 +ENDCHAR +STARTCHAR U+4E7F +ENCODING 20095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0640 +7C40 +9140 +4A40 +0040 +2040 +4440 +2840 +1040 +2240 +FF40 +1140 +5441 +D641 +9263 +103E +ENDCHAR +STARTCHAR U+4E80 +ENCODING 20096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +03C0 +0C80 +7FE0 +0920 +0FE0 +0FE0 +1FF0 +1110 +1FF0 +1110 +1FF4 +1104 +00FC +0000 +ENDCHAR +STARTCHAR U+4E82 +ENCODING 20098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0740 +7A40 +2940 +3F40 +5640 +0840 +7F40 +5540 +7D40 +5D40 +5540 +4944 +5544 +633C +0000 +ENDCHAR +STARTCHAR U+4E83 +ENCODING 20099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1510 +1510 +0E10 +7FD0 +1510 +2490 +0490 +1090 +3BD0 +4A90 +33D0 +2091 +4091 +009F +0000 +0000 +ENDCHAR +STARTCHAR U+4E84 +ENCODING 20100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FD0 +0410 +3F90 +0010 +7FD0 +4050 +5F50 +0010 +3F90 +2090 +3F91 +1111 +7FDF +0000 +0000 +ENDCHAR +STARTCHAR U+4E85 +ENCODING 20101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0600 +0000 +ENDCHAR +STARTCHAR U+4E86 +ENCODING 20102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0020 +0040 +0180 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4E88 +ENCODING 20104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0220 +0140 +0180 +7FFC +0108 +0110 +0120 +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4E89 +ENCODING 20105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +03E0 +0C40 +3080 +1FF0 +0110 +7FFC +0110 +0110 +1FF0 +0110 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4E8A +ENCODING 20106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +1110 +0910 +0920 +1FF0 +0110 +7FFC +0110 +1FF0 +0110 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4E8B +ENCODING 20107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +0FE0 +0920 +0FE0 +0100 +1FF0 +0110 +7FFC +0110 +1FF0 +0110 +0300 +0000 +ENDCHAR +STARTCHAR U+4E8C +ENCODING 20108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3FF8 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFC +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+4E8D +ENCODING 20109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +0000 +0000 +0004 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+4E8E +ENCODING 20110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +0100 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +0600 +0000 +ENDCHAR +STARTCHAR U+4E8F +ENCODING 20111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +0000 +0000 +0004 +FFFE +0400 +0400 +0810 +0FF8 +0010 +0010 +0010 +0210 +0120 +00C0 +ENDCHAR +STARTCHAR U+4E90 +ENCODING 20112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +0200 +0200 +0400 +7FFF +0400 +0800 +0FFC +1004 +0004 +0004 +0004 +0008 +0008 +0070 +ENDCHAR +STARTCHAR U+4E91 +ENCODING 20113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0000 +0000 +0000 +7FFC +0100 +0100 +0140 +0220 +0210 +0470 +3F88 +0008 +0000 +ENDCHAR +STARTCHAR U+4E92 +ENCODING 20114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0200 +0200 +07E0 +0420 +0420 +0420 +0FE0 +0840 +0040 +0040 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E93 +ENCODING 20115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +0000 +0000 +0004 +FFFE +0440 +0440 +0440 +0440 +0440 +0440 +0840 +0840 +1040 +2040 +ENDCHAR +STARTCHAR U+4E94 +ENCODING 20116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0200 +0200 +0200 +0200 +3FE0 +0420 +0420 +0420 +0820 +0820 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E95 +ENCODING 20117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0440 +0440 +3FF8 +0440 +0440 +0440 +7FFC +0440 +0840 +0840 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+4E96 +ENCODING 20118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +0000 +0000 +0000 +FFFF +0000 +0000 +0000 +0000 +3FFC +0000 +0000 +0000 +FFFF +0000 +ENDCHAR +STARTCHAR U+4E97 +ENCODING 20119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +4102 +4102 +4102 +4102 +7FFE +0000 +0000 +0000 +3FFC +0000 +0000 +0000 +FFFF +0000 +ENDCHAR +STARTCHAR U+4E98 +ENCODING 20120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +7FFC +0000 +ENDCHAR +STARTCHAR U+4E99 +ENCODING 20121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0200 +0200 +07E0 +0520 +04A0 +04A0 +0A20 +0940 +0940 +0040 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E9A +ENCODING 20122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0440 +0440 +0440 +0440 +4448 +244C +2450 +1450 +1460 +0440 +0440 +0444 +FFFE +0000 +ENDCHAR +STARTCHAR U+4E9B +ENCODING 20123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +2898 +2FE0 +2880 +2884 +2E84 +707C +0000 +1FF0 +0000 +0000 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E9C +ENCODING 20124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0480 +0480 +3FF0 +2490 +2490 +2490 +3FF0 +2490 +0480 +0480 +7FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+4E9D +ENCODING 20125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0410 +0808 +3FFC +0004 +2010 +4422 +FE7F +0201 +0000 +0000 +1FFC +0000 +0000 +FFFF +0000 +ENDCHAR +STARTCHAR U+4E9E +ENCODING 20126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0440 +0440 +0440 +3C78 +2008 +2008 +3C78 +2448 +0440 +0440 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4E9F +ENCODING 20127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0200 +0200 +07F8 +3CC8 +24A8 +24B0 +2490 +3CA8 +20C4 +0300 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4EA0 +ENCODING 20128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0100 +0100 +0100 +0100 +7FFC +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+4EA1 +ENCODING 20129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+4EA2 +ENCODING 20130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0000 +0000 +07C0 +0440 +0440 +0440 +0440 +0840 +0844 +1044 +203C +0000 +ENDCHAR +STARTCHAR U+4EA4 +ENCODING 20132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0440 +0420 +0850 +1448 +2248 +0280 +0180 +0180 +0240 +0C30 +700C +0000 +ENDCHAR +STARTCHAR U+4EA5 +ENCODING 20133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +0240 +1A40 +0490 +0320 +0240 +0CC0 +1120 +0610 +1808 +6008 +0000 +ENDCHAR +STARTCHAR U+4EA6 +ENCODING 20134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0240 +0240 +1250 +1248 +2244 +4244 +0440 +0440 +0840 +10C0 +0000 +ENDCHAR +STARTCHAR U+4EA7 +ENCODING 20135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +0108 +7FFC +0810 +0420 +0448 +1FFC +1000 +1000 +1000 +1000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U+4EA8 +ENCODING 20136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0000 +1FE0 +0040 +0180 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4EA9 +ENCODING 20137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0000 +0008 +3FFC +2108 +2108 +2108 +3FF8 +2108 +2108 +2108 +2108 +3FF8 +2008 +ENDCHAR +STARTCHAR U+4EAB +ENCODING 20139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0000 +1FE0 +0040 +0180 +7FFC +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4EAC +ENCODING 20140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0000 +0FE0 +0820 +0820 +0FE0 +0100 +0920 +0910 +1108 +2108 +0300 +0000 +ENDCHAR +STARTCHAR U+4EAD +ENCODING 20141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0000 +3FFC +2008 +5FF0 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+4EAE +ENCODING 20142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0000 +3FFC +2008 +4480 +0480 +0484 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+4EAF +ENCODING 20143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0000 +1FF8 +1008 +1008 +1FF8 +0000 +7FFE +4002 +4002 +7FFE +4002 +4002 +7FFE +ENDCHAR +STARTCHAR U+4EB0 +ENCODING 20144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0920 +0910 +1108 +2108 +0300 +0000 +ENDCHAR +STARTCHAR U+4EB2 +ENCODING 20146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +7FFC +0820 +0440 +0284 +FFFE +0100 +0108 +7FFC +0100 +0920 +1918 +210C +4504 +0200 +ENDCHAR +STARTCHAR U+4EB3 +ENCODING 20147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0000 +3FFC +20C8 +4F00 +01F8 +3F00 +0104 +00FC +0000 +ENDCHAR +STARTCHAR U+4EB5 +ENCODING 20149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFE +0840 +0848 +7EFC +0848 +0EC8 +78A8 +090A +1A06 +0110 +02A0 +0C40 +1530 +660E +0404 +ENDCHAR +STARTCHAR U+4EB6 +ENCODING 20150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +1FF0 +17D0 +1450 +17D0 +1FF0 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4EB9 +ENCODING 20153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +0000 +77EE +4422 +77AE +44A2 +FFFF +8001 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +FFFF +ENDCHAR +STARTCHAR U+4EBA +ENCODING 20154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +0100 +0380 +0280 +0440 +0440 +0820 +1010 +2008 +4004 +0000 +ENDCHAR +STARTCHAR U+4EBB +ENCODING 20155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +0800 +1000 +1000 +3000 +5000 +9000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +ENDCHAR +STARTCHAR U+4EBF +ENCODING 20159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +0BF8 +1010 +1020 +3040 +5080 +9100 +1200 +1200 +1400 +1400 +1402 +1402 +13FE +1000 +ENDCHAR +STARTCHAR U+4EC0 +ENCODING 20160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0440 +0840 +0840 +1FFC +2840 +4840 +0840 +0840 +0840 +0840 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+4EC1 +ENCODING 20161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0BF8 +1000 +1000 +3000 +5000 +1000 +1000 +1000 +1000 +17FC +1000 +1000 +0000 +ENDCHAR +STARTCHAR U+4EC2 +ENCODING 20162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +1080 +1FF8 +3088 +5088 +1088 +1088 +1108 +1108 +1208 +1408 +1830 +0000 +ENDCHAR +STARTCHAR U+4EC3 +ENCODING 20163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +0BFE +1020 +1020 +3020 +5020 +9020 +1020 +1020 +1020 +1020 +1020 +1120 +10A0 +1040 +ENDCHAR +STARTCHAR U+4EC4 +ENCODING 20164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1000 +1080 +1080 +1080 +1080 +1140 +1140 +1220 +2220 +2410 +4808 +1004 +0000 +ENDCHAR +STARTCHAR U+4EC5 +ENCODING 20165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +0BFE +1004 +1104 +3104 +5108 +9108 +1088 +1090 +1050 +1020 +1050 +1088 +1106 +1604 +ENDCHAR +STARTCHAR U+4EC6 +ENCODING 20166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0440 +0840 +0860 +1850 +2848 +4844 +0844 +0840 +0840 +0840 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+4EC7 +ENCODING 20167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +0900 +0900 +1100 +11E0 +3F20 +5120 +1120 +1120 +1120 +1224 +1224 +1424 +181C +0000 +ENDCHAR +STARTCHAR U+4EC8 +ENCODING 20168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +0878 +1008 +3008 +5088 +1088 +1088 +1088 +1088 +1104 +1202 +1401 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+4EC9 +ENCODING 20169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0810 +09F8 +1110 +1110 +3110 +5110 +9110 +1110 +1110 +1110 +1110 +1212 +1212 +140E +1800 +ENDCHAR +STARTCHAR U+4ECA +ENCODING 20170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1830 +67CC +0000 +0000 +1FE0 +0020 +0040 +0040 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+4ECB +ENCODING 20171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1830 +644C +0440 +0440 +0440 +0440 +0840 +0840 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+4ECD +ENCODING 20173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FE0 +0920 +1120 +1120 +3120 +5138 +1128 +1108 +1108 +1208 +1208 +1408 +1830 +0000 +ENDCHAR +STARTCHAR U+4ECE +ENCODING 20174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0860 +0C50 +1250 +1290 +1188 +2108 +4204 +0000 +ENDCHAR +STARTCHAR U+4ECF +ENCODING 20175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +0880 +1080 +1080 +3080 +5100 +1120 +1110 +1208 +1278 +1F84 +1004 +0000 +ENDCHAR +STARTCHAR U+4ED0 +ENCODING 20176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +02C0 +0660 +0C30 +1818 +310C +E107 +0100 +0100 +FFFF +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+4ED1 +ENCODING 20177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0280 +0280 +0440 +0830 +301E +C824 +0860 +0980 +0E00 +0800 +0808 +0808 +07F8 +0000 +ENDCHAR +STARTCHAR U+4ED3 +ENCODING 20179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0280 +0280 +0440 +0820 +301E +CFE4 +0820 +0820 +08A0 +0840 +0808 +0808 +07F8 +0000 +ENDCHAR +STARTCHAR U+4ED4 +ENCODING 20180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0810 +1020 +1040 +3040 +5040 +17FC +1040 +1040 +1040 +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+4ED5 +ENCODING 20181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +1040 +1040 +37FC +5040 +1040 +1040 +1040 +1040 +1040 +13F8 +1000 +0000 +ENDCHAR +STARTCHAR U+4ED6 +ENCODING 20182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A40 +1248 +1278 +33C8 +5E48 +1248 +1248 +1258 +1240 +1204 +1204 +11FC +0000 +ENDCHAR +STARTCHAR U+4ED7 +ENCODING 20183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +17FC +1040 +3240 +5240 +1140 +11C0 +1080 +10C0 +1120 +1210 +140C +0000 +ENDCHAR +STARTCHAR U+4ED8 +ENCODING 20184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0410 +0410 +0410 +0810 +0BFC +1810 +2910 +4890 +0890 +0810 +0810 +0810 +0810 +0830 +0000 +ENDCHAR +STARTCHAR U+4ED9 +ENCODING 20185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +1248 +1248 +3248 +5248 +1248 +1248 +1248 +1248 +13F8 +1208 +1208 +0000 +ENDCHAR +STARTCHAR U+4EDA +ENCODING 20186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +02C0 +0660 +0C30 +1818 +300C +E107 +0100 +0100 +4102 +4102 +4102 +4102 +7FFE +0000 +ENDCHAR +STARTCHAR U+4EDB +ENCODING 20187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0406 +043C +0DE0 +0820 +1820 +1020 +3020 +73FF +D020 +1020 +1020 +1020 +1020 +1021 +1033 +101E +ENDCHAR +STARTCHAR U+4EDC +ENCODING 20188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +0804 +13FE +6020 +1020 +1020 +1020 +1020 +1020 +1020 +1022 +17FF +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+4EDD +ENCODING 20189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +0820 +1010 +600C +0FE0 +0100 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4EDE +ENCODING 20190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +0888 +1088 +1088 +3088 +5288 +1288 +1488 +1088 +1108 +1108 +1208 +1430 +0000 +ENDCHAR +STARTCHAR U+4EDF +ENCODING 20191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +0BC0 +1040 +1040 +3040 +5FFC +1040 +1040 +1040 +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4EE0 +ENCODING 20192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +04FE +0C10 +0810 +1810 +1010 +3010 +71FF +D010 +1010 +1010 +1010 +1010 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+4EE1 +ENCODING 20193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0908 +09FC +1200 +1200 +37F8 +5810 +9020 +1040 +1080 +1100 +1200 +1202 +1202 +11FE +1000 +ENDCHAR +STARTCHAR U+4EE2 +ENCODING 20194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +0480 +0C80 +08FE +1982 +1102 +3302 +7062 +D032 +1012 +1002 +1002 +1002 +1006 +1004 +101C +ENDCHAR +STARTCHAR U+4EE3 +ENCODING 20195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0490 +0488 +0488 +0880 +08FC +1F40 +2840 +4840 +0820 +0820 +0814 +0814 +080C +0804 +0000 +ENDCHAR +STARTCHAR U+4EE4 +ENCODING 20196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1830 +6FEC +0000 +1FF0 +0110 +0110 +0110 +01E0 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4EE5 +ENCODING 20197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1010 +1210 +1110 +1090 +1090 +1010 +1010 +1010 +1030 +1628 +1848 +6184 +0604 +0000 +ENDCHAR +STARTCHAR U+4EE8 +ENCODING 20200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +0BFC +1000 +1000 +3000 +5008 +93FC +1000 +1000 +1000 +1000 +1004 +17FE +1000 +1000 +ENDCHAR +STARTCHAR U+4EE9 +ENCODING 20201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0440 +0840 +1040 +3040 +5044 +107E +1040 +1040 +1040 +1040 +1040 +1042 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+4EEA +ENCODING 20202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0880 +0864 +1224 +1204 +3208 +5108 +9110 +1090 +10A0 +1040 +10A0 +1110 +1208 +140E +1804 +ENDCHAR +STARTCHAR U+4EEB +ENCODING 20203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +0840 +1040 +1080 +30A0 +5120 +9240 +1440 +1880 +1100 +1210 +1408 +17FC +1004 +1000 +ENDCHAR +STARTCHAR U+4EEC +ENCODING 20204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1204 +117E +2484 +2404 +6404 +A404 +2404 +2404 +2404 +2404 +2404 +2404 +2404 +2414 +2408 +ENDCHAR +STARTCHAR U+4EED +ENCODING 20205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +0888 +1088 +1088 +3488 +5288 +1188 +1088 +1168 +111C +1208 +1408 +1830 +0000 +ENDCHAR +STARTCHAR U+4EEE +ENCODING 20206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0A00 +1200 +13F8 +3288 +5288 +1250 +1250 +1220 +1420 +1450 +1988 +1604 +0000 +ENDCHAR +STARTCHAR U+4EEF +ENCODING 20207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1820 +1124 +3124 +2326 +6222 +A623 +2024 +20E4 +200C +2008 +2018 +2030 +2060 +21C0 +ENDCHAR +STARTCHAR U+4EF0 +ENCODING 20208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0880 +0B78 +1248 +1248 +3248 +5248 +1248 +1248 +13C8 +1E70 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4EF1 +ENCODING 20209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0870 +1850 +10D8 +318C +2306 +66FB +A000 +2000 +21FC +2004 +200C +2008 +2018 +2010 +2030 +ENDCHAR +STARTCHAR U+4EF2 +ENCODING 20210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +17FC +1444 +3444 +5444 +1444 +17FC +1444 +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4EF3 +ENCODING 20211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0A20 +0A20 +1220 +1222 +3224 +53B8 +9220 +1220 +1220 +1220 +1220 +1220 +13A2 +1222 +101E +ENDCHAR +STARTCHAR U+4EF4 +ENCODING 20212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +08FF +1082 +7082 +10FE +1082 +1082 +10FE +1082 +1082 +1082 +1082 +110A +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+4EF5 +ENCODING 20213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0900 +0A08 +13FC +1440 +3840 +5040 +9044 +1FFE +1040 +1040 +1040 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+4EF6 +ENCODING 20214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0940 +0940 +13F8 +1240 +3440 +5040 +17FC +1040 +1040 +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4EF7 +ENCODING 20215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08C0 +1140 +1120 +3210 +5528 +1924 +1120 +1120 +1220 +1220 +1420 +1820 +0000 +ENDCHAR +STARTCHAR U+4EFB +ENCODING 20219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +0BE0 +0840 +1040 +1040 +3040 +57FC +1040 +1040 +1040 +1040 +1040 +13F8 +1000 +0000 +ENDCHAR +STARTCHAR U+4EFD +ENCODING 20221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0920 +0920 +1110 +1210 +320E +5404 +9BF0 +1110 +1110 +1110 +1110 +1210 +1210 +14A0 +1040 +ENDCHAR +STARTCHAR U+4EFE +ENCODING 20222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1880 +1080 +3080 +21F8 +6108 +A108 +2308 +2208 +23F8 +2010 +2010 +2010 +27FF +2000 +ENDCHAR +STARTCHAR U+4EFF +ENCODING 20223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0840 +0840 +1004 +17FE +3080 +5088 +90FC +1088 +1088 +1088 +1088 +1108 +1108 +1250 +1420 +ENDCHAR +STARTCHAR U+4F00 +ENCODING 20224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0448 +0448 +0CCC +0884 +1986 +1102 +3123 +7320 +D020 +1060 +1044 +10C4 +1086 +1182 +111E +13F3 +ENDCHAR +STARTCHAR U+4F01 +ENCODING 20225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1930 +610C +0100 +0900 +09F0 +0900 +0900 +0900 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4F02 +ENCODING 20226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1820 +17FF +3020 +2020 +63FE +A222 +2222 +2222 +2222 +2222 +2226 +2020 +2020 +2020 +ENDCHAR +STARTCHAR U+4F03 +ENCODING 20227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FC +0C04 +08C8 +1870 +1020 +33FF +7021 +D022 +1024 +1020 +1020 +1020 +1020 +1020 +10E0 +ENDCHAR +STARTCHAR U+4F04 +ENCODING 20228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +09FE +1022 +3022 +53FE +1220 +1220 +17FF +1021 +1021 +102A +1024 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+4F05 +ENCODING 20229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0824 +13FE +6020 +1222 +1222 +1222 +13FE +1020 +1020 +1021 +1021 +103F +0000 +0000 +ENDCHAR +STARTCHAR U+4F08 +ENCODING 20232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08C0 +0860 +1830 +1010 +3080 +2080 +6080 +A080 +2286 +2282 +2683 +2481 +2C84 +2084 +20CC +2078 +ENDCHAR +STARTCHAR U+4F09 +ENCODING 20233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1000 +1000 +31E0 +5120 +1120 +1120 +1120 +1220 +1224 +1424 +181C +0000 +ENDCHAR +STARTCHAR U+4F0A +ENCODING 20234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0848 +1048 +17FC +3048 +5048 +13F8 +1048 +1040 +1080 +1080 +1100 +1200 +0000 +ENDCHAR +STARTCHAR U+4F0B +ENCODING 20235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +09F8 +1108 +1108 +3108 +31FE +5182 +5184 +1144 +1148 +1128 +1210 +1210 +1228 +1244 +1583 +ENDCHAR +STARTCHAR U+4F0C +ENCODING 20236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FF +0D00 +0900 +197C +1144 +3144 +7144 +D144 +1144 +114C +1140 +1340 +1241 +1663 +103E +ENDCHAR +STARTCHAR U+4F0D +ENCODING 20237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +0880 +1080 +1080 +3080 +57F0 +1110 +1110 +1110 +1110 +1110 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+4F0E +ENCODING 20238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +17FC +1040 +3040 +53F8 +1108 +1110 +1090 +10A0 +1040 +11B0 +160C +0000 +ENDCHAR +STARTCHAR U+4F0F +ENCODING 20239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +0848 +1048 +1040 +37FC +5040 +1040 +1040 +10A0 +10A0 +1110 +1608 +1804 +0000 +ENDCHAR +STARTCHAR U+4F10 +ENCODING 20240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0450 +0448 +0448 +0840 +087C +1FC8 +2848 +4850 +0830 +0820 +0864 +0894 +0B0C +0804 +0000 +ENDCHAR +STARTCHAR U+4F11 +ENCODING 20241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +1040 +17FC +3040 +50E0 +10E0 +1150 +1150 +1248 +1444 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4F12 +ENCODING 20242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0406 +041C +0DF0 +0900 +1900 +11FF +3108 +7108 +D108 +1108 +1108 +1308 +1208 +1608 +1C08 +1008 +ENDCHAR +STARTCHAR U+4F13 +ENCODING 20243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +13FF +2008 +4010 +2020 +2040 +20A0 +2124 +2622 +2021 +2020 +2020 +2020 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+4F14 +ENCODING 20244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1202 +2202 +5000 +1090 +1090 +1090 +1090 +1090 +1090 +1091 +1111 +121F +0000 +0000 +ENDCHAR +STARTCHAR U+4F15 +ENCODING 20245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0C20 +0BFE +1820 +1020 +3020 +77FF +D020 +1070 +1050 +10D8 +1088 +118C +1306 +1603 +ENDCHAR +STARTCHAR U+4F16 +ENCODING 20246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0440 +0C40 +0BFF +1840 +1040 +30FC +7084 +D084 +11CC +1148 +1378 +1630 +1078 +10CC +1387 +ENDCHAR +STARTCHAR U+4F17 +ENCODING 20247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +0280 +0440 +0838 +3010 +0000 +0820 +0820 +1450 +1250 +2288 +410E +8204 +0000 +ENDCHAR +STARTCHAR U+4F18 +ENCODING 20248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10A0 +1090 +2090 +2084 +7FFE +A140 +2140 +2140 +2240 +2240 +2240 +2442 +2442 +283E +3000 +ENDCHAR +STARTCHAR U+4F19 +ENCODING 20249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0840 +1040 +1244 +324C +5250 +9460 +1040 +10A0 +10A0 +1110 +1110 +1208 +140E +1804 +ENDCHAR +STARTCHAR U+4F1A +ENCODING 20250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1830 +67CC +0000 +0000 +3FF8 +0240 +0220 +04F0 +3F08 +0008 +0000 +ENDCHAR +STARTCHAR U+4F1B +ENCODING 20251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +0BFC +1200 +1208 +3288 +5250 +9250 +1220 +1220 +1250 +1288 +1308 +1204 +13FE +1000 +ENDCHAR +STARTCHAR U+4F1C +ENCODING 20252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0FE0 +10A0 +1124 +3124 +521C +1440 +1040 +17FC +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4F1D +ENCODING 20253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0800 +1000 +1000 +37FC +5080 +1080 +10A0 +1110 +1108 +1238 +1FC4 +1004 +0000 +ENDCHAR +STARTCHAR U+4F1E +ENCODING 20254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0280 +0440 +0920 +1110 +210E +D114 +0D30 +0544 +FFFE +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+4F1F +ENCODING 20255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0844 +17FE +1040 +3048 +57FC +9040 +1044 +1FFE +1044 +1044 +1054 +1048 +1040 +1040 +ENDCHAR +STARTCHAR U+4F20 +ENCODING 20256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0848 +17FC +1040 +3044 +5FFE +9080 +1100 +13FC +1008 +1110 +10A0 +1040 +1060 +1020 +ENDCHAR +STARTCHAR U+4F22 +ENCODING 20258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +0BFC +1010 +1110 +3114 +53FE +9030 +1030 +1050 +1090 +1110 +1210 +1410 +1050 +1020 +ENDCHAR +STARTCHAR U+4F24 +ENCODING 20260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0900 +0A04 +13FE +1480 +3880 +5088 +97FC +1088 +1088 +1088 +1108 +1108 +1208 +1450 +1820 +ENDCHAR +STARTCHAR U+4F25 +ENCODING 20261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0908 +0910 +1120 +1140 +3180 +5104 +9FFE +1140 +1140 +1120 +1110 +1108 +1146 +1184 +1100 +ENDCHAR +STARTCHAR U+4F26 +ENCODING 20262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +08A0 +10A0 +1110 +3208 +540E +9904 +1110 +1130 +11C0 +1100 +1104 +1104 +10FC +1000 +ENDCHAR +STARTCHAR U+4F27 +ENCODING 20263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +08A0 +10A0 +1110 +320E +5404 +99F0 +1110 +1110 +1150 +1120 +1104 +1104 +10FC +1000 +ENDCHAR +STARTCHAR U+4F2A +ENCODING 20266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0A40 +0940 +1044 +17FE +3044 +5044 +9044 +10C4 +10A4 +1114 +1104 +1204 +1404 +1828 +1010 +ENDCHAR +STARTCHAR U+4F2B +ENCODING 20267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0840 +0840 +13FC +1204 +3408 +5000 +9000 +1000 +1000 +1000 +1000 +1004 +1FFE +1000 +1000 +ENDCHAR +STARTCHAR U+4F2C +ENCODING 20268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1202 +2202 +4202 +23FE +2280 +2240 +2220 +2210 +2208 +2204 +2402 +2801 +0000 +0000 +ENDCHAR +STARTCHAR U+4F2D +ENCODING 20269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +1020 +27FF +5000 +1040 +1084 +1108 +13F0 +1020 +1040 +1084 +1104 +17FE +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+4F2E +ENCODING 20270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A00 +0A7E +1A22 +1222 +37A2 +22B6 +6294 +A294 +269C +2488 +2588 +271C +2114 +23B6 +22A2 +2663 +ENDCHAR +STARTCHAR U+4F2F +ENCODING 20271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +1080 +13F8 +3208 +5208 +1208 +13F8 +1208 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+4F30 +ENCODING 20272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +17FC +1040 +3040 +5040 +13F8 +1208 +1208 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+4F31 +ENCODING 20273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0870 +1850 +10D8 +318C +2326 +6623 +A0A8 +20A8 +21AC +2124 +2326 +2222 +2020 +2020 +20E0 +ENDCHAR +STARTCHAR U+4F32 +ENCODING 20274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0BFC +0A08 +1208 +1208 +33F8 +5208 +9280 +1288 +1298 +12A0 +12C0 +1482 +1482 +187E +1000 +ENDCHAR +STARTCHAR U+4F33 +ENCODING 20275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0A48 +1A48 +1248 +3248 +27FF +6248 +A248 +2248 +2248 +2278 +2200 +2200 +2200 +23FF +2000 +ENDCHAR +STARTCHAR U+4F34 +ENCODING 20276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0A48 +0948 +1150 +1040 +33F8 +5040 +1040 +17FC +1040 +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4F35 +ENCODING 20277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +1BFF +1249 +3249 +2249 +6249 +A249 +22C9 +228F +2381 +2201 +2201 +2201 +23FF +2000 +ENDCHAR +STARTCHAR U+4F36 +ENCODING 20278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +04A0 +08A0 +0910 +1BF8 +2C04 +4BF8 +0848 +0848 +0848 +0870 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+4F37 +ENCODING 20279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0C20 +0820 +1BFE +1222 +3222 +7222 +D222 +13FE +1222 +1222 +1222 +1222 +13FE +1000 +ENDCHAR +STARTCHAR U+4F38 +ENCODING 20280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BF8 +1248 +1248 +33F8 +5248 +1248 +13F8 +1248 +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4F39 +ENCODING 20281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FC +0D04 +0904 +1904 +11FC +3104 +7104 +D104 +11FC +1104 +1104 +1104 +1104 +17FF +1000 +ENDCHAR +STARTCHAR U+4F3A +ENCODING 20282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +0808 +17E8 +1008 +33C8 +5248 +1248 +1248 +13C8 +1248 +1008 +1008 +1018 +0000 +ENDCHAR +STARTCHAR U+4F3B +ENCODING 20283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1820 +1124 +31AC +20A8 +60A8 +A020 +27FF +2020 +2020 +2020 +2020 +2020 +2020 +2020 +ENDCHAR +STARTCHAR U+4F3C +ENCODING 20284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0A10 +0B10 +1290 +1250 +3250 +5210 +1210 +1210 +1210 +12B0 +1328 +1C44 +1084 +0000 +ENDCHAR +STARTCHAR U+4F3D +ENCODING 20285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A00 +0A00 +0A38 +1FA8 +12A8 +32A8 +52A8 +12A8 +12A8 +12A8 +14A8 +14B8 +19A8 +1000 +0000 +ENDCHAR +STARTCHAR U+4F3E +ENCODING 20286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FE +0C10 +0810 +1830 +1020 +3068 +70EC +D1A6 +1323 +1020 +1020 +1020 +1000 +13FF +1000 +ENDCHAR +STARTCHAR U+4F3F +ENCODING 20287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +09FE +1102 +6102 +1102 +1102 +11FE +1102 +1000 +1084 +1102 +1201 +1401 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+4F40 +ENCODING 20288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFC +1A04 +1204 +3204 +2204 +63FC +A200 +2200 +2200 +23FE +2202 +2202 +2202 +2202 +23FE +ENDCHAR +STARTCHAR U+4F41 +ENCODING 20289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0820 +1040 +3084 +5102 +13FF +1001 +1000 +11FE +1102 +1102 +1102 +11FE +1102 +0000 +0000 +ENDCHAR +STARTCHAR U+4F42 +ENCODING 20290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1820 +1020 +1020 +3120 +2120 +613E +A120 +2120 +2120 +2120 +2120 +2120 +27FF +2000 +ENDCHAR +STARTCHAR U+4F43 +ENCODING 20291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A48 +1248 +1248 +3248 +53F8 +1248 +1248 +1248 +1248 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+4F46 +ENCODING 20294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF0 +0A10 +1210 +1210 +33F0 +5210 +1210 +1210 +13F0 +1210 +1000 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+4F47 +ENCODING 20295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +1204 +1208 +3400 +57FC +1040 +1040 +1040 +1040 +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+4F48 +ENCODING 20296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1040 +1FFF +3120 +3220 +5420 +5BFE +1222 +1222 +1222 +1222 +1222 +1222 +1226 +1020 +ENDCHAR +STARTCHAR U+4F49 +ENCODING 20297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0C20 +0BFE +1820 +1020 +3020 +7020 +D7FF +1040 +1040 +10C4 +1084 +10BE +11E2 +1303 +ENDCHAR +STARTCHAR U+4F4B +ENCODING 20299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1842 +1042 +30C2 +2086 +6184 +A31C +2000 +21FE +2102 +2102 +2102 +2102 +2102 +21FE +ENDCHAR +STARTCHAR U+4F4C +ENCODING 20300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A20 +0A20 +1A20 +1222 +3226 +23BC +6220 +A220 +2220 +2220 +2220 +2220 +2220 +2221 +23B3 +2E1E +ENDCHAR +STARTCHAR U+4F4D +ENCODING 20301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +1080 +1FFC +3010 +5210 +1110 +1110 +1120 +1120 +1040 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+4F4E +ENCODING 20302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +0BE0 +0A40 +1240 +1240 +33FC +5220 +1220 +1220 +1390 +1C14 +100C +17FC +1004 +0000 +ENDCHAR +STARTCHAR U+4F4F +ENCODING 20303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0840 +0840 +17FC +1040 +3040 +5040 +13F8 +1040 +1040 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+4F50 +ENCODING 20304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +17FC +1080 +3080 +5080 +11F8 +1120 +1220 +1420 +1820 +13FC +1000 +0000 +ENDCHAR +STARTCHAR U+4F51 +ENCODING 20305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +17FC +1100 +3100 +5200 +13F8 +1508 +1908 +1108 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+4F52 +ENCODING 20306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1840 +13FC +3244 +2244 +6244 +A244 +2FFF +20A0 +20B0 +2190 +2118 +230C +2606 +2C03 +ENDCHAR +STARTCHAR U+4F53 +ENCODING 20307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +1040 +17FC +30E0 +50E0 +1150 +1150 +1248 +15F4 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4F54 +ENCODING 20308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0C20 +0820 +183F +1020 +3020 +7020 +D020 +13FE +1202 +1202 +1202 +1202 +1202 +13FE +ENDCHAR +STARTCHAR U+4F55 +ENCODING 20309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0808 +1008 +13C8 +3248 +5248 +1248 +13C8 +1248 +1008 +1008 +1008 +1018 +0000 +ENDCHAR +STARTCHAR U+4F56 +ENCODING 20310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08C0 +0860 +1820 +1084 +3084 +208C +6088 +A298 +2296 +22B3 +26E1 +24C0 +2080 +2382 +2EC6 +207C +ENDCHAR +STARTCHAR U+4F57 +ENCODING 20311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +1204 +1288 +3480 +5088 +1090 +10E0 +1080 +1080 +1084 +1084 +107C +0000 +ENDCHAR +STARTCHAR U+4F58 +ENCODING 20312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0280 +0440 +0830 +304E +CFE4 +0000 +0008 +7FFC +0100 +0920 +1918 +210C +4504 +0200 +ENDCHAR +STARTCHAR U+4F59 +ENCODING 20313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1830 +6FEC +0100 +0100 +3FF8 +0920 +0910 +1108 +2108 +0300 +0000 +ENDCHAR +STARTCHAR U+4F5A +ENCODING 20314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0A40 +0A40 +1240 +13F8 +3440 +5840 +1FFC +10C0 +10A0 +1120 +1210 +1408 +1804 +0000 +ENDCHAR +STARTCHAR U+4F5B +ENCODING 20315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +08A0 +0FF8 +10A8 +10A8 +37F8 +54A0 +14A0 +17FC +14A4 +1124 +1124 +1238 +1420 +0000 +ENDCHAR +STARTCHAR U+4F5C +ENCODING 20316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +0900 +0900 +13FC +1280 +3480 +58F8 +1080 +1080 +10F8 +1080 +1080 +1080 +1080 +0000 +ENDCHAR +STARTCHAR U+4F5D +ENCODING 20317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +0900 +0900 +13F8 +1208 +3408 +53C8 +1248 +1248 +1248 +13C8 +1208 +1008 +1030 +0000 +ENDCHAR +STARTCHAR U+4F5E +ENCODING 20318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0800 +1000 +17FC +3080 +5080 +17FC +1110 +1110 +13E0 +1030 +10C8 +1704 +0000 +ENDCHAR +STARTCHAR U+4F5F +ENCODING 20319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0900 +09F8 +1208 +1510 +38A0 +5040 +90A0 +1110 +128E +1C64 +1020 +1180 +1060 +1030 +1010 +ENDCHAR +STARTCHAR U+4F60 +ENCODING 20320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1100 +1100 +23FC +2204 +6408 +A840 +2040 +2150 +2148 +224C +2444 +2040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U+4F61 +ENCODING 20321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0820 +1020 +3050 +5088 +1104 +1623 +1020 +1222 +1222 +1222 +1222 +13FE +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+4F62 +ENCODING 20322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FF +0900 +1100 +3100 +51FE +1102 +1102 +1102 +11FE +1100 +1100 +1100 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+4F63 +ENCODING 20323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +1444 +2444 +2444 +67FC +A444 +2444 +2444 +27FC +2444 +2444 +2844 +2844 +3054 +2008 +ENDCHAR +STARTCHAR U+4F64 +ENCODING 20324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +0FFE +1100 +1110 +31F8 +5110 +9110 +1190 +1250 +1230 +1210 +13D2 +1612 +100E +1000 +ENDCHAR +STARTCHAR U+4F65 +ENCODING 20325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0280 +0440 +0820 +1050 +2FEE +C004 +1210 +0910 +0920 +0920 +0840 +0084 +FFFE +0000 +ENDCHAR +STARTCHAR U+4F67 +ENCODING 20327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0880 +0890 +10F8 +1080 +3080 +5084 +9FFE +1080 +10C0 +10A0 +1098 +1088 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U+4F69 +ENCODING 20329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF0 +0C10 +1410 +17F0 +3490 +57F0 +16B0 +16B0 +16B0 +16F4 +1A8C +188C +1084 +0000 +ENDCHAR +STARTCHAR U+4F6A +ENCODING 20330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFF +1A01 +1201 +3201 +2279 +6249 +A249 +2249 +2249 +2279 +2201 +2201 +2201 +23FF +2000 +ENDCHAR +STARTCHAR U+4F6B +ENCODING 20331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +09FC +1288 +6450 +1020 +1050 +1088 +1707 +11FC +1104 +1104 +1104 +11FC +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+4F6C +ENCODING 20332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0880 +0884 +17EC +1090 +30A0 +50C4 +9FFE +1100 +1308 +1530 +19C0 +1104 +1104 +10FC +1000 +ENDCHAR +STARTCHAR U+4F6E +ENCODING 20334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0470 +0C50 +08D8 +198C +1306 +3603 +71FC +D000 +1000 +11FC +1104 +1104 +1104 +1104 +11FC +ENDCHAR +STARTCHAR U+4F6F +ENCODING 20335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A10 +0910 +0920 +17FC +1040 +3040 +53F8 +1040 +1040 +17FC +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4F70 +ENCODING 20336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0840 +1080 +13F8 +3208 +5208 +1208 +13F8 +1208 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+4F71 +ENCODING 20337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +06C0 +0C70 +381C +E007 +0FF0 +0000 +0000 +7FFE +0080 +0080 +10FC +1080 +1080 +FFFF +ENDCHAR +STARTCHAR U+4F73 +ENCODING 20339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +13F8 +1040 +3040 +57FC +1040 +1040 +13F8 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+4F74 +ENCODING 20340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0FFE +0908 +1108 +11F8 +3108 +5108 +91F8 +1108 +1108 +117E +1788 +1008 +1008 +1008 +1008 +ENDCHAR +STARTCHAR U+4F75 +ENCODING 20341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A10 +0910 +0920 +17F8 +1120 +3120 +5120 +1FFC +1120 +1120 +1220 +1220 +1420 +1820 +0000 +ENDCHAR +STARTCHAR U+4F76 +ENCODING 20342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +1FFC +1040 +3040 +53F8 +1000 +13F8 +1208 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+4F77 +ENCODING 20343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FC +0D04 +0904 +19FC +1104 +3104 +71FC +D121 +1133 +1116 +1118 +1108 +110C +11E6 +1703 +ENDCHAR +STARTCHAR U+4F78 +ENCODING 20344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +083C +1BE0 +1020 +3020 +2020 +67FF +A020 +2020 +2020 +23FE +2202 +2202 +2202 +2202 +23FE +ENDCHAR +STARTCHAR U+4F79 +ENCODING 20345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +04FC +0D88 +0910 +1BFF +1100 +3100 +717C +D144 +1144 +1144 +114C +1140 +1141 +1263 +103E +ENDCHAR +STARTCHAR U+4F7A +ENCODING 20346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09E0 +0820 +1050 +1088 +3104 +3603 +53FE +5020 +1020 +1020 +13FE +1020 +1020 +1020 +17FF +1000 +ENDCHAR +STARTCHAR U+4F7B +ENCODING 20347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +08A0 +08A8 +14A8 +12B0 +32A0 +50B0 +11A8 +12A4 +1CA4 +1120 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+4F7C +ENCODING 20348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1120 +1110 +3228 +5528 +1120 +10C0 +10C0 +10C0 +1120 +1610 +180C +0000 +ENDCHAR +STARTCHAR U+4F7D +ENCODING 20349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1840 +107F +30C1 +2E93 +6192 +A010 +2010 +2138 +2628 +2C28 +206C +2044 +20C6 +2183 +ENDCHAR +STARTCHAR U+4F7E +ENCODING 20350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0940 +0920 +1210 +140E +3BF4 +5210 +9210 +13F0 +1210 +1210 +13F0 +1210 +1210 +1250 +1220 +ENDCHAR +STARTCHAR U+4F7F +ENCODING 20351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1040 +13F8 +3248 +5248 +13F8 +1248 +1140 +1080 +10C0 +1330 +1C0C +0000 +ENDCHAR +STARTCHAR U+4F80 +ENCODING 20352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +17E1 +2241 +4245 +2245 +2245 +2FF5 +2245 +2245 +2241 +2241 +2441 +2045 +2042 +0000 +0000 +ENDCHAR +STARTCHAR U+4F81 +ENCODING 20353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0940 +1140 +13FE +3440 +3840 +5040 +5FFF +1110 +1110 +1110 +1110 +1210 +1211 +141F +1800 +ENDCHAR +STARTCHAR U+4F82 +ENCODING 20354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1820 +17FF +3400 +241E +64F0 +A420 +2420 +25FF +2420 +2420 +2C20 +2821 +2833 +201E +ENDCHAR +STARTCHAR U+4F83 +ENCODING 20355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A08 +1208 +1208 +33F8 +5000 +1290 +1290 +1290 +1290 +1494 +1494 +180C +0000 +ENDCHAR +STARTCHAR U+4F84 +ENCODING 20356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +0FFC +1080 +1100 +3208 +57FC +9044 +1040 +1048 +17FC +1040 +1040 +1044 +1FFE +1000 +ENDCHAR +STARTCHAR U+4F85 +ENCODING 20357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1820 +17FF +3040 +20C8 +6198 +A312 +21B6 +2064 +20CC +2198 +2730 +206C +21C6 +2F03 +ENDCHAR +STARTCHAR U+4F86 +ENCODING 20358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0920 +0920 +0D30 +1348 +2388 +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+4F87 +ENCODING 20359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +17FC +2040 +43FC +2044 +27FC +2440 +27FF +2041 +20A1 +2112 +2208 +2404 +2803 +0000 +0000 +ENDCHAR +STARTCHAR U+4F88 +ENCODING 20360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08F8 +0908 +1290 +1460 +3040 +51A0 +167C +1084 +1348 +1030 +1020 +10C0 +1700 +0000 +ENDCHAR +STARTCHAR U+4F89 +ENCODING 20361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0844 +1FFE +10A0 +3110 +52EE +9C04 +13F8 +1100 +11F8 +1008 +1008 +1090 +1050 +1020 +ENDCHAR +STARTCHAR U+4F8A +ENCODING 20362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0A22 +1222 +1124 +3124 +3020 +5020 +17FF +1088 +1088 +1088 +1088 +1108 +1109 +1209 +140F +ENDCHAR +STARTCHAR U+4F8B +ENCODING 20363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0FE8 +0A28 +1228 +13A8 +34A8 +54A8 +1AA8 +11A8 +1128 +1128 +1208 +1408 +1818 +0000 +ENDCHAR +STARTCHAR U+4F8C +ENCODING 20364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0180 +03C0 +0E70 +381C +E7E7 +0000 +0FF0 +0020 +0040 +1FF8 +0000 +7FFE +0200 +0410 +08F8 +1F8C +ENDCHAR +STARTCHAR U+4F8D +ENCODING 20365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BF8 +1040 +1040 +37FC +5010 +1010 +17FC +1210 +1110 +1110 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+4F8E +ENCODING 20366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0D24 +09A4 +18AC +10A8 +3020 +73FE +D020 +1070 +1070 +10A8 +10A8 +1124 +1222 +1020 +ENDCHAR +STARTCHAR U+4F8F +ENCODING 20367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0940 +0940 +13F8 +1240 +3440 +5FFC +10E0 +10E0 +1150 +1150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+4F90 +ENCODING 20368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0460 +0C40 +09FC +1954 +1154 +3154 +7154 +D154 +1154 +1154 +1154 +1154 +1154 +17FF +1000 +ENDCHAR +STARTCHAR U+4F91 +ENCODING 20369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0FFC +1080 +1100 +31F8 +5308 +15F8 +1908 +11F8 +1108 +1108 +1108 +1118 +0000 +ENDCHAR +STARTCHAR U+4F92 +ENCODING 20370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0C20 +0BFF +1A01 +1241 +3040 +73FF +D044 +1084 +108C +11E8 +1018 +103C +10E6 +1382 +ENDCHAR +STARTCHAR U+4F93 +ENCODING 20371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0BFE +1822 +1022 +37FF +2022 +6022 +A3FE +2020 +2020 +23FE +2020 +2020 +27FF +2020 +2020 +ENDCHAR +STARTCHAR U+4F94 +ENCODING 20372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0880 +0910 +1208 +17FC +3244 +5250 +93F8 +1440 +1044 +1FFE +1040 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+4F95 +ENCODING 20373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +0BFF +1020 +2040 +53FF +1249 +1249 +1249 +1249 +1249 +1249 +1249 +1201 +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+4F96 +ENCODING 20374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1FF0 +600C +1FF0 +1290 +1290 +1FF0 +1290 +1290 +1290 +12B0 +0000 +ENDCHAR +STARTCHAR U+4F97 +ENCODING 20375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0BFE +0A04 +1214 +13FC +3204 +5214 +92FC +1294 +1294 +1294 +12F4 +1294 +1204 +1214 +1208 +ENDCHAR +STARTCHAR U+4F98 +ENCODING 20376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +1204 +1218 +3460 +53C0 +1040 +107C +17C0 +1040 +1044 +1044 +103C +0000 +ENDCHAR +STARTCHAR U+4F99 +ENCODING 20377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0414 +0C16 +0812 +1BFF +1010 +3010 +77D0 +D118 +1108 +1108 +1108 +11CC +1705 +1007 +1002 +ENDCHAR +STARTCHAR U+4F9A +ENCODING 20378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0900 +19FE +1302 +3202 +25F2 +6112 +A112 +21F2 +2112 +2112 +2112 +21F2 +2006 +2004 +201C +ENDCHAR +STARTCHAR U+4F9B +ENCODING 20379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0920 +0920 +1120 +17F8 +3120 +5120 +1120 +1FFC +1000 +1120 +1110 +1208 +1408 +0000 +ENDCHAR +STARTCHAR U+4F9C +ENCODING 20380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0884 +11FE +2304 +4544 +2124 +2114 +27FF +2144 +2124 +2114 +2104 +2104 +220C +0000 +0000 +ENDCHAR +STARTCHAR U+4F9D +ENCODING 20381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +17FC +1080 +30C8 +5148 +1350 +1520 +1120 +1110 +1150 +1188 +1604 +0000 +ENDCHAR +STARTCHAR U+4F9E +ENCODING 20382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1100 +110F +3109 +2FE9 +6229 +6229 +A269 +2649 +2449 +24C9 +2789 +21C9 +2369 +262F +2C00 +ENDCHAR +STARTCHAR U+4F9F +ENCODING 20383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1BFF +1040 +30C0 +20BE +6182 +A104 +2308 +257F +2908 +2108 +2108 +2108 +2108 +2138 +ENDCHAR +STARTCHAR U+4FA0 +ENCODING 20384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +17FC +1248 +3148 +5150 +1FFC +1040 +10A0 +10A0 +1110 +1208 +1404 +0000 +ENDCHAR +STARTCHAR U+4FA1 +ENCODING 20385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +08A0 +10A0 +10A0 +33F8 +52A8 +12A8 +12A8 +12A8 +12A8 +12A8 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+4FA3 +ENCODING 20387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0BFC +0A08 +1208 +1208 +33F8 +5000 +9004 +17FE +1404 +1404 +1404 +1404 +1404 +17FC +1404 +ENDCHAR +STARTCHAR U+4FA5 +ENCODING 20389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0908 +08FC +1780 +10A0 +3044 +50A4 +931C +1000 +17FC +1120 +1120 +1120 +1122 +1222 +1C1E +ENDCHAR +STARTCHAR U+4FA6 +ENCODING 20390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0844 +087E +1040 +1044 +37FE +5404 +9444 +1444 +1444 +1444 +1444 +1090 +110C +1606 +1802 +ENDCHAR +STARTCHAR U+4FA7 +ENCODING 20391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1044 +17E4 +2454 +2554 +6554 +A554 +2554 +2554 +2554 +2544 +2104 +2284 +2444 +2814 +2008 +ENDCHAR +STARTCHAR U+4FA8 +ENCODING 20392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0838 +0BC0 +0840 +1040 +1084 +3FFE +5120 +9110 +120E +1514 +1910 +1110 +1110 +1210 +1410 +1010 +ENDCHAR +STARTCHAR U+4FA9 +ENCODING 20393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1140 +2140 +2220 +6410 +A84E +33E4 +2000 +2008 +2FFC +2100 +2120 +2210 +27F8 +2008 +ENDCHAR +STARTCHAR U+4FAA +ENCODING 20394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0828 +0FFC +1110 +10A0 +3040 +50B0 +930E +1D14 +1110 +1110 +1110 +1110 +1110 +1210 +1410 +ENDCHAR +STARTCHAR U+4FAB +ENCODING 20395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1200 +1200 +31F8 +5080 +17FC +1110 +1110 +13E0 +1030 +10C8 +1704 +0000 +ENDCHAR +STARTCHAR U+4FAC +ENCODING 20396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0840 +17FE +1482 +3884 +5140 +9148 +1330 +1520 +1910 +1110 +1108 +114E +1184 +1100 +ENDCHAR +STARTCHAR U+4FAD +ENCODING 20397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A08 +1208 +13F8 +3228 +5220 +1290 +1450 +1448 +1804 +1180 +1060 +1010 +0000 +ENDCHAR +STARTCHAR U+4FAE +ENCODING 20398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +0900 +09FC +1200 +13F0 +3550 +5150 +1FFC +1250 +1250 +17FC +1410 +1010 +1060 +0000 +ENDCHAR +STARTCHAR U+4FAF +ENCODING 20399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +09F0 +0810 +0810 +17FC +1100 +3100 +51F8 +1240 +1440 +17FC +1060 +1090 +1308 +1C04 +0000 +ENDCHAR +STARTCHAR U+4FB2 +ENCODING 20402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFF +1A00 +1200 +32FE +2200 +6200 +A3FF +2248 +2249 +224B +224A +264C +2444 +2C76 +21C3 +ENDCHAR +STARTCHAR U+4FB3 +ENCODING 20403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1040 +2444 +4444 +2444 +2A4A +3151 +2040 +2040 +27FE +2040 +2040 +2040 +2FFF +0000 +0000 +ENDCHAR +STARTCHAR U+4FB5 +ENCODING 20405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF0 +0810 +13F0 +1010 +33F0 +5000 +17FC +1408 +1BF0 +1120 +10C0 +1330 +1C0C +0000 +ENDCHAR +STARTCHAR U+4FB6 +ENCODING 20406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF0 +0A10 +1210 +1210 +33F0 +5080 +1100 +17F8 +1408 +1408 +1408 +17F8 +1408 +0000 +ENDCHAR +STARTCHAR U+4FB7 +ENCODING 20407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FE +0D02 +0902 +19FE +1100 +3100 +71FF +D101 +1179 +1149 +1349 +1249 +127B +1402 +100E +ENDCHAR +STARTCHAR U+4FB9 +ENCODING 20409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1003 +178E +1178 +3108 +2308 +6208 +67FF +A088 +2888 +2588 +2508 +2708 +227F +2700 +25C0 +2C7F +ENDCHAR +STARTCHAR U+4FBA +ENCODING 20410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1421 +27FF +4020 +2050 +218C +2623 +2020 +23FE +2004 +2008 +2010 +2020 +2040 +0000 +0000 +ENDCHAR +STARTCHAR U+4FBB +ENCODING 20411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +098C +1888 +13FE +3202 +2202 +6202 +A202 +23FE +2088 +2088 +2088 +2188 +2109 +2309 +2607 +ENDCHAR +STARTCHAR U+4FBC +ENCODING 20412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFE +1020 +3020 +23FE +6202 +A202 +21FC +2008 +2010 +27FF +2020 +2020 +2020 +20E0 +ENDCHAR +STARTCHAR U+4FBD +ENCODING 20413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1A22 +1222 +33FE +2222 +6222 +A3FE +2000 +2040 +23FE +2042 +20C2 +2086 +2184 +271C +ENDCHAR +STARTCHAR U+4FBE +ENCODING 20414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0422 +0DFE +0824 +1828 +13FF +3020 +7040 +D1FC +1608 +1010 +13FF +1010 +1010 +1010 +1070 +ENDCHAR +STARTCHAR U+4FBF +ENCODING 20415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0840 +13F8 +1248 +33F8 +5248 +13F8 +1248 +1140 +1080 +10C0 +1130 +160C +0000 +ENDCHAR +STARTCHAR U+4FC0 +ENCODING 20416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +083C +1BE0 +1042 +3266 +232C +6148 +A040 +27FF +2088 +2188 +2118 +23D0 +2078 +20CC +2386 +ENDCHAR +STARTCHAR U+4FC1 +ENCODING 20417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0578 +0D48 +0948 +1948 +1178 +3100 +7100 +D1FC +1004 +1004 +13FF +1000 +1088 +118C +1306 +ENDCHAR +STARTCHAR U+4FC2 +ENCODING 20418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08E0 +0F90 +1090 +1320 +30D0 +5098 +11E4 +1740 +1050 +1248 +1244 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+4FC3 +ENCODING 20419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A08 +1208 +13F8 +3248 +5040 +1240 +1278 +1240 +1240 +1340 +14C0 +183C +0000 +ENDCHAR +STARTCHAR U+4FC4 +ENCODING 20420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0860 +09A8 +0F24 +1124 +1120 +3FFC +5120 +11A8 +1128 +1310 +1D10 +1134 +134C +1104 +0000 +ENDCHAR +STARTCHAR U+4FC5 +ENCODING 20421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0850 +0848 +1048 +17FE +3040 +5448 +9250 +1260 +10D0 +1150 +1248 +144E +1044 +1140 +1080 +ENDCHAR +STARTCHAR U+4FC6 +ENCODING 20422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0870 +1850 +10D8 +318C +2306 +66FB +A020 +2020 +23FE +2020 +2124 +2124 +2326 +2623 +20E0 +ENDCHAR +STARTCHAR U+4FC7 +ENCODING 20423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +1500 +227F +4508 +2908 +2108 +2108 +237F +2508 +2908 +2108 +2108 +257F +2200 +0000 +0000 +ENDCHAR +STARTCHAR U+4FC8 +ENCODING 20424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0920 +1920 +13FE +3220 +2420 +6020 +A7FF +2000 +2000 +23FE +2202 +2202 +2202 +2202 +23FE +ENDCHAR +STARTCHAR U+4FC9 +ENCODING 20425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0FFF +1040 +1040 +33FC +3044 +5084 +5084 +1FFF +1000 +11FC +1104 +1104 +1104 +11FC +1104 +ENDCHAR +STARTCHAR U+4FCA +ENCODING 20426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0890 +0918 +17E4 +1120 +3124 +529C +14F0 +1110 +1320 +14C0 +10C0 +1330 +1C0C +0000 +ENDCHAR +STARTCHAR U+4FCB +ENCODING 20427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FC +0D04 +0904 +19FC +1000 +33FE +7222 +D222 +1222 +13FE +1200 +1200 +1201 +1303 +11FE +ENDCHAR +STARTCHAR U+4FCC +ENCODING 20428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +0822 +1BFF +1020 +3020 +23FE +6222 +A222 +23FE +2222 +2222 +23FE +2222 +2222 +2222 +2226 +ENDCHAR +STARTCHAR U+4FCD +ENCODING 20429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0DFC +0904 +1904 +11FC +3104 +7104 +D1FD +1113 +1116 +1118 +1108 +110C +11E6 +1703 +ENDCHAR +STARTCHAR U+4FCE +ENCODING 20430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +1910 +2510 +25F0 +5110 +1110 +19F0 +1510 +2510 +2110 +4FFC +0000 +0000 +ENDCHAR +STARTCHAR U+4FCF +ENCODING 20431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0924 +08A8 +1024 +11FE +3104 +5104 +91FC +1104 +1104 +11FC +1104 +1104 +1104 +1114 +1108 +ENDCHAR +STARTCHAR U+4FD0 +ENCODING 20432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +09A8 +0F28 +1128 +1128 +3FE8 +5128 +1328 +13A8 +1568 +1568 +1908 +1108 +1118 +0000 +ENDCHAR +STARTCHAR U+4FD1 +ENCODING 20433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0890 +1060 +13F8 +3248 +5248 +13F8 +1248 +1248 +13F8 +1248 +1248 +1258 +0000 +ENDCHAR +STARTCHAR U+4FD2 +ENCODING 20434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +17FE +3402 +2402 +61F8 +6000 +A000 +27FE +2090 +2090 +2090 +2190 +2111 +2313 +260E +ENDCHAR +STARTCHAR U+4FD3 +ENCODING 20435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1124 +1124 +3248 +3248 +5124 +5092 +1000 +13FE +1020 +1020 +1020 +1020 +17FF +1000 +ENDCHAR +STARTCHAR U+4FD4 +ENCODING 20436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A08 +13F8 +1208 +33F8 +5208 +13F8 +12A8 +10A0 +1120 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+4FD6 +ENCODING 20438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +13FF +2020 +6064 +20A2 +2721 +2020 +2020 +23FE +2202 +2202 +2202 +23FE +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+4FD7 +ENCODING 20439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0910 +0A08 +1488 +1080 +3140 +5120 +1210 +17F8 +1A14 +1210 +1210 +13F0 +1210 +0000 +ENDCHAR +STARTCHAR U+4FD8 +ENCODING 20440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +0BD0 +1248 +1244 +3404 +53F8 +1030 +1040 +17FC +1040 +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+4FD9 +ENCODING 20441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +1050 +2020 +4050 +2088 +2020 +27FF +2110 +22FE +2492 +2092 +2096 +2010 +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+4FDA +ENCODING 20442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A48 +1248 +13F8 +3248 +5248 +13F8 +1040 +13F8 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+4FDB +ENCODING 20443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08F0 +0920 +1240 +17F8 +3248 +5248 +13F8 +1268 +10A0 +10A0 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+4FDC +ENCODING 20444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +0BFC +1248 +13F8 +3248 +53F8 +9000 +1FFE +1100 +11F8 +1008 +1008 +1088 +1050 +1020 +ENDCHAR +STARTCHAR U+4FDD +ENCODING 20445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A08 +1208 +13F8 +3248 +5040 +17FC +10E0 +1150 +1248 +1444 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4FDE +ENCODING 20446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0280 +0440 +0830 +37CE +C004 +3E08 +2248 +2248 +3E48 +2248 +2248 +3E48 +2248 +2208 +2618 +ENDCHAR +STARTCHAR U+4FDF +ENCODING 20447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08A0 +0890 +1138 +17C8 +3100 +51F8 +1240 +1440 +1FFC +1040 +10A0 +1110 +160C +0000 +ENDCHAR +STARTCHAR U+4FE0 +ENCODING 20448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1020 +17FF +3020 +3124 +5124 +52AA +1471 +1020 +1050 +1050 +1088 +1104 +1202 +1401 +ENDCHAR +STARTCHAR U+4FE1 +ENCODING 20449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F0 +0800 +17FC +1000 +33F8 +5000 +13F8 +1000 +13F8 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+4FE2 +ENCODING 20450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +0480 +0DFF +0904 +1A8C +10D8 +3070 +71DC +D707 +1060 +11CC +1038 +11E3 +100E +1078 +13C0 +ENDCHAR +STARTCHAR U+4FE3 +ENCODING 20451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A08 +1208 +13F8 +3000 +53F8 +1040 +1040 +17FC +1060 +1090 +1308 +1C04 +0000 +ENDCHAR +STARTCHAR U+4FE4 +ENCODING 20452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +0890 +08A0 +13F8 +1048 +33F8 +5240 +13FC +12C4 +10C4 +1144 +1258 +1440 +1040 +0000 +ENDCHAR +STARTCHAR U+4FE5 +ENCODING 20453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1040 +13F8 +3248 +53F8 +1248 +13F8 +1040 +17FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4FE6 +ENCODING 20454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0888 +0FFC +1080 +17F8 +3100 +5FFE +9110 +1214 +13FE +1510 +1890 +1090 +1010 +1050 +1020 +ENDCHAR +STARTCHAR U+4FE8 +ENCODING 20456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0FFC +08A0 +14A4 +12A8 +30A0 +57FE +9400 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +1800 +ENDCHAR +STARTCHAR U+4FE9 +ENCODING 20457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +1FFE +2120 +2124 +6FFE +A924 +2924 +2924 +2924 +2AD4 +2C8C +2804 +2804 +2814 +2808 +ENDCHAR +STARTCHAR U+4FEA +ENCODING 20458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +0FFE +1000 +1004 +37BE +54A4 +94A4 +16B4 +15AC +14A4 +14A4 +14A4 +14A4 +14A4 +15AC +ENDCHAR +STARTCHAR U+4FEC +ENCODING 20460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +1788 +2108 +4108 +27C8 +2108 +2188 +2348 +2511 +2121 +217F +2101 +2101 +2100 +0000 +0000 +ENDCHAR +STARTCHAR U+4FED +ENCODING 20461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +08A0 +10A0 +1110 +3208 +55F6 +9804 +1040 +1248 +114C +1148 +1150 +1004 +1FFE +1000 +ENDCHAR +STARTCHAR U+4FEE +ENCODING 20462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0CFC +1510 +16A0 +34E0 +573C +1440 +1590 +1460 +1588 +1410 +1060 +1380 +0000 +ENDCHAR +STARTCHAR U+4FEF +ENCODING 20463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1488 +1488 +3488 +55FC +1548 +1728 +1528 +1508 +1908 +1908 +1118 +0000 +ENDCHAR +STARTCHAR U+4FF0 +ENCODING 20464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +11C0 +171F +3111 +2111 +6FF1 +6111 +A111 +2391 +2351 +2751 +2511 +2D11 +291F +2100 +2100 +ENDCHAR +STARTCHAR U+4FF1 +ENCODING 20465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0BFC +0A08 +1208 +13F8 +3208 +53F8 +9208 +13F8 +1208 +1208 +1FFE +1000 +1110 +130C +1404 +ENDCHAR +STARTCHAR U+4FF2 +ENCODING 20466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0908 +0908 +1908 +1FE8 +301F +2289 +66C9 +A449 +2289 +2289 +2389 +2109 +2119 +2393 +22B2 +26E6 +ENDCHAR +STARTCHAR U+4FF3 +ENCODING 20467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +08A0 +08A0 +17BC +10A0 +30A0 +57BC +10A0 +10A0 +17BC +10A0 +1120 +1220 +1420 +0000 +ENDCHAR +STARTCHAR U+4FF4 +ENCODING 20468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0848 +0844 +13FE +3040 +5028 +1011 +10EF +1000 +1044 +13FF +1040 +1028 +1011 +11EF +0000 +0000 +ENDCHAR +STARTCHAR U+4FF5 +ENCODING 20469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1040 +13F8 +3040 +57FC +10C0 +1148 +1330 +1520 +1150 +1188 +1604 +0000 +ENDCHAR +STARTCHAR U+4FF6 +ENCODING 20470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A00 +0A00 +0A78 +1388 +1248 +3248 +5FC8 +1228 +1330 +1690 +16B0 +1A28 +1248 +1684 +0000 +ENDCHAR +STARTCHAR U+4FF7 +ENCODING 20471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +17DF +2455 +4455 +27D5 +2455 +245F +27D0 +2450 +2450 +2450 +2451 +2451 +28DF +0000 +0000 +ENDCHAR +STARTCHAR U+4FF8 +ENCODING 20472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BF8 +1040 +13F8 +30A0 +57FC +1150 +13F8 +1444 +13F8 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+4FFA +ENCODING 20474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0FF8 +1140 +12A0 +3498 +5FF4 +1490 +17F0 +1490 +17F0 +1494 +1084 +107C +0000 +ENDCHAR +STARTCHAR U+4FFC +ENCODING 20476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFF +1040 +3044 +209E +61E2 +A000 +21FE +2102 +21FE +2102 +21FE +2102 +2102 +2106 +ENDCHAR +STARTCHAR U+4FFD +ENCODING 20477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0890 +0990 +1F10 +141F +3431 +27EA +6488 +A488 +2488 +2488 +249C +2494 +2494 +2496 +28B2 +20A3 +ENDCHAR +STARTCHAR U+4FFE +ENCODING 20478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0880 +0BF8 +1248 +13F8 +3248 +53F8 +1040 +10A0 +1120 +17FC +1020 +1020 +1020 +0000 +ENDCHAR +STARTCHAR U+4FFF +ENCODING 20479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +083E +1820 +13FF +3201 +2222 +6238 +A2E0 +2222 +221E +2200 +2248 +2648 +2449 +2CC9 +2187 +ENDCHAR +STARTCHAR U+5000 +ENCODING 20480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FE +0D00 +09FC +1900 +11FC +3100 +7100 +D7FF +1122 +1136 +1114 +1118 +110C +11E6 +1703 +ENDCHAR +STARTCHAR U+5001 +ENCODING 20481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0900 +190F +13E9 +3489 +2089 +6089 +A7F9 +2089 +2089 +2089 +21C9 +2149 +236F +2630 +2C00 +ENDCHAR +STARTCHAR U+5002 +ENCODING 20482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0884 +0884 +1108 +1108 +3FFF +3108 +5108 +5108 +11C8 +1F7F +1108 +1108 +1108 +1208 +1208 +1408 +ENDCHAR +STARTCHAR U+5004 +ENCODING 20484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0B18 +18E0 +131C +3040 +2FFF +6080 +A1FC +2304 +2DFC +2104 +21FC +2104 +2104 +2104 +211C +ENDCHAR +STARTCHAR U+5005 +ENCODING 20485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1110 +1110 +3130 +52C8 +1448 +1040 +17FC +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+5006 +ENCODING 20486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0840 +1040 +17FC +3444 +5774 +1554 +1554 +16EC +14CC +1444 +1444 +144C +0000 +ENDCHAR +STARTCHAR U+5007 +ENCODING 20487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFE +1202 +3202 +2100 +61DE +A152 +2352 +2252 +27D2 +2C96 +2190 +2111 +2313 +260E +ENDCHAR +STARTCHAR U+5009 +ENCODING 20489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1FF0 +600C +0FE0 +0820 +0FE0 +0FE0 +0800 +1FF0 +1810 +2FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+500A +ENCODING 20490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0444 +0444 +0CC6 +09A3 +1820 +1064 +3044 +707E +D1C3 +1010 +1018 +1048 +1142 +1143 +1365 +123C +ENDCHAR +STARTCHAR U+500B +ENCODING 20491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +0C88 +1488 +17F8 +3488 +55E8 +1528 +1528 +15E8 +1528 +1408 +17F8 +1408 +0000 +ENDCHAR +STARTCHAR U+500C +ENCODING 20492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0840 +0BFE +1202 +1404 +33F8 +5208 +9208 +13F8 +1200 +13F8 +1208 +1208 +1208 +13F8 +1208 +ENDCHAR +STARTCHAR U+500D +ENCODING 20493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1210 +1110 +3120 +5FFC +1000 +13F8 +1208 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+500E +ENCODING 20494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0450 +0450 +0C50 +09FC +1954 +1154 +3154 +71FC +D154 +1154 +1154 +17FF +1000 +1088 +118C +1306 +ENDCHAR +STARTCHAR U+500F +ENCODING 20495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08F8 +1590 +1660 +34E0 +571C +1450 +1448 +17FC +1440 +14A0 +1110 +160C +0000 +ENDCHAR +STARTCHAR U+5010 +ENCODING 20496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0880 +19FF +1104 +328C +28D8 +6870 +A9DC +2F07 +2820 +2922 +2B76 +2A54 +28D8 +218C +2307 +ENDCHAR +STARTCHAR U+5011 +ENCODING 20497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FBC +0CA4 +17BC +14A4 +37BC +5404 +1404 +1404 +1404 +1404 +1404 +1404 +140C +0000 +ENDCHAR +STARTCHAR U+5012 +ENCODING 20498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0FE8 +0928 +11A8 +1268 +3FE8 +5128 +1128 +17E8 +1128 +1128 +11C8 +1E08 +1018 +0000 +ENDCHAR +STARTCHAR U+5013 +ENCODING 20499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0A44 +1A4C +16E8 +34B0 +2198 +630C +A647 +2040 +2246 +26EC +24A0 +21B0 +2118 +230C +2607 +ENDCHAR +STARTCHAR U+5014 +ENCODING 20500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0A04 +13FC +1220 +32A8 +52A8 +12A8 +12F8 +1324 +1524 +1524 +19FC +1104 +0000 +ENDCHAR +STARTCHAR U+5015 +ENCODING 20501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +13FC +2020 +4020 +27FF +2124 +2124 +27FF +2124 +2124 +27FF +2020 +2020 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+5016 +ENCODING 20502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BF8 +1040 +1040 +37FC +5110 +1120 +17FC +1040 +1040 +13F8 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+5017 +ENCODING 20503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BDE +1A52 +1252 +3252 +23DE +6252 +A252 +2252 +23DE +2252 +2252 +2252 +2252 +22D2 +2426 +ENDCHAR +STARTCHAR U+5018 +ENCODING 20504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0A48 +0948 +1150 +1044 +37FE +5404 +9404 +15F4 +1514 +1514 +1514 +15F4 +1504 +1414 +1408 +ENDCHAR +STARTCHAR U+5019 +ENCODING 20505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +09F0 +0810 +0C10 +17FC +3480 +54F8 +1520 +1620 +17FC +1460 +1450 +1490 +1108 +1604 +0000 +ENDCHAR +STARTCHAR U+501A +ENCODING 20506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +10A0 +1110 +3210 +5FFC +1008 +13C8 +1248 +1248 +13C8 +1208 +1018 +0000 +ENDCHAR +STARTCHAR U+501B +ENCODING 20507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0884 +0884 +1BFF +1084 +3084 +20FC +6084 +A084 +20FC +2084 +2084 +23FF +2000 +2084 +2186 +2303 +ENDCHAR +STARTCHAR U+501C +ENCODING 20508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0FFE +0C44 +1454 +17FC +3444 +5444 +95F4 +1404 +15F4 +1514 +1514 +15F4 +1404 +1414 +1808 +ENDCHAR +STARTCHAR U+501D +ENCODING 20509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FF90 +0810 +7F10 +4110 +4110 +7F10 +4110 +4138 +7F28 +0828 +FFEC +0844 +08C6 +0983 +ENDCHAR +STARTCHAR U+501E +ENCODING 20510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1020 +17FF +3000 +33FE +5202 +5202 +1202 +13FE +1020 +1020 +1124 +1222 +1421 +10E0 +ENDCHAR +STARTCHAR U+501F +ENCODING 20511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0920 +0920 +17F8 +1120 +3120 +5FFC +1000 +13F0 +1210 +13F0 +1210 +13F0 +1210 +0000 +ENDCHAR +STARTCHAR U+5020 +ENCODING 20512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0890 +1108 +33FF +5508 +1108 +11FF +1108 +1108 +11FF +1108 +1108 +11FF +1100 +0000 +0000 +ENDCHAR +STARTCHAR U+5021 +ENCODING 20513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF0 +0A10 +13F0 +1210 +33F0 +5210 +1000 +17F8 +1408 +17F8 +1408 +17F8 +1408 +0000 +ENDCHAR +STARTCHAR U+5022 +ENCODING 20514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1FFF +1020 +33FE +2022 +67FF +A022 +23FE +2020 +2120 +213E +2120 +23A0 +26E0 +2C3F +ENDCHAR +STARTCHAR U+5023 +ENCODING 20515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A20 +0A20 +0A20 +1FA0 +127C +3248 +53C8 +12A8 +12A8 +12B0 +1490 +14B0 +18C8 +1304 +0000 +ENDCHAR +STARTCHAR U+5024 +ENCODING 20516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1040 +15F0 +3510 +55F0 +1510 +15F0 +1510 +15F0 +1400 +17FC +1400 +0000 +ENDCHAR +STARTCHAR U+5025 +ENCODING 20517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +12A4 +12A8 +34A4 +511C +1200 +13F8 +1040 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+5026 +ENCODING 20518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0A48 +0950 +13F8 +1040 +37FC +50A0 +11F0 +1228 +15E4 +1120 +1108 +1108 +10F8 +0000 +ENDCHAR +STARTCHAR U+5027 +ENCODING 20519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1020 +17FF +3401 +3000 +53FE +5000 +1000 +17FF +1020 +1020 +1124 +1222 +1421 +1060 +ENDCHAR +STARTCHAR U+5028 +ENCODING 20520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A08 +1208 +13F8 +3248 +5240 +13FC +1240 +15F8 +1508 +1908 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+5029 +ENCODING 20521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0BF8 +0840 +13F8 +1040 +37FC +5000 +13F8 +1248 +1248 +13F8 +1208 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+502A +ENCODING 20522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0B38 +0A08 +1208 +13B8 +3208 +5208 +13F8 +12A8 +10A0 +1120 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+502B +ENCODING 20523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +08A0 +1110 +13F8 +3404 +5BF8 +12A8 +12A8 +13F8 +12A8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+502C +ENCODING 20524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +087C +1040 +13F8 +3208 +53F8 +1208 +13F8 +1040 +17FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+502D +ENCODING 20525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +0BE0 +0840 +17FC +10E0 +3150 +5248 +1040 +17FC +1090 +11D0 +1020 +10D0 +1708 +0000 +ENDCHAR +STARTCHAR U+502E +ENCODING 20526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0FFE +0C44 +1444 +17FC +3444 +5444 +97FC +1444 +1040 +1FFE +10E0 +1150 +124E +1C44 +1040 +ENDCHAR +STARTCHAR U+502F +ENCODING 20527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A00 +1208 +2214 +4222 +2FC1 +2200 +2208 +2708 +2A88 +2208 +2210 +2222 +227F +2201 +0000 +0000 +ENDCHAR +STARTCHAR U+5030 +ENCODING 20528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFE +1020 +37FF +2088 +6188 +A70F +2040 +207C +20C4 +218C +2358 +2070 +20DC +2787 +ENDCHAR +STARTCHAR U+5031 +ENCODING 20529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFE +1202 +23FE +6202 +23FE +2202 +2000 +2410 +2410 +27DF +2410 +2410 +2451 +27DF +0000 +0000 +ENDCHAR +STARTCHAR U+5032 +ENCODING 20530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1FFF +1020 +33FE +2222 +63FE +A222 +2222 +23FE +20A8 +20A8 +21AC +2726 +2E23 +2020 +ENDCHAR +STARTCHAR U+5033 +ENCODING 20531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1FFF +1020 +33FE +2222 +63FE +A020 +23FE +2022 +2FFF +2022 +23FE +2020 +2020 +2060 +ENDCHAR +STARTCHAR U+5035 +ENCODING 20533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080A +0BE9 +1809 +1008 +37FF +2088 +6088 +A288 +22E8 +2288 +228C +2284 +2284 +23F5 +2E07 +2802 +ENDCHAR +STARTCHAR U+5036 +ENCODING 20534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF0 +0A10 +1210 +13F0 +3210 +53F0 +1210 +13F0 +1000 +1FFC +1120 +1210 +1C08 +0000 +ENDCHAR +STARTCHAR U+5037 +ENCODING 20535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +2050 +4088 +2104 +26FB +2000 +23FE +2020 +20A8 +2124 +2623 +2020 +2040 +0000 +0000 +ENDCHAR +STARTCHAR U+5039 +ENCODING 20537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0940 +1220 +17F0 +3888 +57F0 +1490 +17F0 +1490 +1140 +1120 +1210 +1408 +0000 +ENDCHAR +STARTCHAR U+503A +ENCODING 20538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0FFC +0840 +13F8 +1040 +3FFE +5008 +93FC +1208 +1248 +1248 +1248 +1248 +10B0 +1108 +1604 +ENDCHAR +STARTCHAR U+503B +ENCODING 20539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0FFF +1249 +1249 +33CA +3249 +5249 +53C9 +1249 +1249 +13F9 +1E49 +1049 +104E +1048 +1048 +ENDCHAR +STARTCHAR U+503C +ENCODING 20540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +0FFC +1040 +1048 +33FC +5208 +93F8 +1208 +13F8 +1208 +13F8 +1208 +1208 +1FFE +1000 +ENDCHAR +STARTCHAR U+503E +ENCODING 20542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1020 +2844 +29FE +6904 +AF24 +2924 +2924 +2924 +2B24 +2D24 +2850 +204C +2086 +2302 +ENDCHAR +STARTCHAR U+5040 +ENCODING 20544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +0888 +1FFF +1088 +3088 +2020 +63FE +A222 +2222 +2222 +27FF +2050 +20D8 +218C +2306 +2603 +ENDCHAR +STARTCHAR U+5041 +ENCODING 20545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +1078 +17C2 +3266 +232C +6108 +6040 +A3FC +2244 +23FC +2244 +2244 +2FFF +2204 +2204 +221C +ENDCHAR +STARTCHAR U+5042 +ENCODING 20546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +098C +1888 +17FF +3000 +23C2 +6252 +A252 +23D2 +2252 +2252 +23D2 +2242 +2242 +2242 +22CE +ENDCHAR +STARTCHAR U+5043 +ENCODING 20547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0DF8 +1508 +15F8 +3508 +55F8 +1440 +17FC +1590 +1460 +15D8 +17FC +1400 +0000 +ENDCHAR +STARTCHAR U+5045 +ENCODING 20549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080C +0838 +1BE0 +1020 +37FF +2020 +63FE +A222 +23FE +2222 +23FE +2020 +23FE +2020 +2020 +27FF +ENDCHAR +STARTCHAR U+5046 +ENCODING 20550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFE +1020 +31FC +2050 +63FF +A088 +2104 +23FE +2505 +2104 +21FC +2104 +2104 +21FC +ENDCHAR +STARTCHAR U+5047 +ENCODING 20551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FB8 +0C88 +1488 +17B8 +3488 +5400 +1778 +1448 +1428 +1730 +1410 +1428 +14C4 +0000 +ENDCHAR +STARTCHAR U+5048 +ENCODING 20552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF0 +0A10 +13F0 +1210 +33F0 +5200 +13F8 +1488 +1CC8 +1528 +1608 +17E8 +1430 +0000 +ENDCHAR +STARTCHAR U+5049 +ENCODING 20553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0BF0 +0890 +17FC +1000 +33F0 +5210 +13F0 +1020 +13F8 +1220 +1FFC +1020 +1020 +0000 +ENDCHAR +STARTCHAR U+504A +ENCODING 20554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +083C +1BE0 +1020 +33FE +2222 +6222 +A3FE +2020 +27FF +2421 +2429 +243D +25E5 +2401 +2403 +ENDCHAR +STARTCHAR U+504B +ENCODING 20555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFF +0A01 +13FF +3242 +5224 +12FF +1224 +1224 +13FF +1224 +1224 +1244 +1484 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+504C +ENCODING 20556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0910 +0910 +0FFC +1110 +1190 +3084 +5FFE +9100 +1100 +1208 +13FC +1608 +1A08 +1208 +13F8 +1208 +ENDCHAR +STARTCHAR U+504D +ENCODING 20557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +1104 +21FC +4104 +21FC +2000 +27FF +2020 +2120 +213E +2120 +22A0 +2460 +283F +0000 +0000 +ENDCHAR +STARTCHAR U+504E +ENCODING 20558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0BFC +0A48 +1248 +13F8 +3248 +5248 +93F8 +1004 +1FFE +1288 +1250 +1220 +1290 +130E +1204 +ENDCHAR +STARTCHAR U+504F +ENCODING 20559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +0800 +13F0 +1210 +33F0 +5200 +13F8 +16A8 +16A8 +1BF8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+5050 +ENCODING 20560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0FFC +0890 +1060 +1190 +33FC +5210 +1260 +1388 +1230 +12C4 +1408 +1430 +19C0 +0000 +ENDCHAR +STARTCHAR U+5051 +ENCODING 20561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FC +1404 +3434 +25E4 +6444 +65F4 +A554 +2554 +25F4 +2444 +2444 +2454 +2475 +25D5 +2803 +ENDCHAR +STARTCHAR U+5052 +ENCODING 20562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +05FC +0D04 +09FC +1904 +1104 +31FC +7000 +D7FF +1100 +13FF +1649 +10D9 +13B3 +1062 +11CE +ENDCHAR +STARTCHAR U+5053 +ENCODING 20563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1A02 +1202 +33FE +2200 +62FE +A220 +2244 +22FE +2212 +2210 +26FE +2410 +2C10 +21FF +ENDCHAR +STARTCHAR U+5055 +ENCODING 20565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A20 +0A24 +0BE8 +1230 +1220 +33A4 +5E5C +1080 +13F8 +1208 +13F8 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+5056 +ENCODING 20566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BF8 +1048 +1050 +37FC +5060 +1090 +13F8 +1D08 +11F8 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+5057 +ENCODING 20567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +08AC +19A6 +1723 +3068 +2018 +61FE +AF02 +2102 +21FE +2102 +2102 +21FE +2102 +2102 +21FE +ENDCHAR +STARTCHAR U+5059 +ENCODING 20569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +3104 +218C +6088 +67FF +A421 +2421 +23FE +2222 +2222 +2222 +2226 +2020 +2020 +ENDCHAR +STARTCHAR U+505A +ENCODING 20570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0A20 +0A20 +1220 +1FFC +3248 +52C8 +17A8 +14B0 +1490 +14B0 +17A8 +1448 +1084 +0000 +ENDCHAR +STARTCHAR U+505B +ENCODING 20571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +13FC +2020 +4020 +27FF +2020 +2227 +2421 +2421 +27AF +2421 +2421 +27FF +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+505C +ENCODING 20572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0FFC +0800 +11F0 +1110 +31F0 +5000 +17FC +1408 +1BF8 +1040 +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+505D +ENCODING 20573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0848 +0848 +13CF +3048 +53CF +1000 +11FE +1102 +11FE +1102 +11FE +1102 +110A +1204 +0000 +0000 +ENDCHAR +STARTCHAR U+505E +ENCODING 20574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A48 +1248 +27FF +4248 +2278 +2200 +23FE +2020 +27FF +20A8 +2124 +2222 +2421 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+505F +ENCODING 20575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0440 +0DFC +0904 +19FC +1104 +3104 +71FC +D000 +13FE +1020 +11FC +1020 +1020 +17FF +1000 +ENDCHAR +STARTCHAR U+5060 +ENCODING 20576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFF +1848 +13FF +3249 +2249 +6279 +A000 +2040 +23FF +2084 +208C +21E8 +2038 +20EE +2383 +ENDCHAR +STARTCHAR U+5061 +ENCODING 20577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +0888 +17FF +2088 +40F8 +2088 +20F8 +2088 +27FF +2250 +2250 +229E +2200 +23FF +0000 +0000 +ENDCHAR +STARTCHAR U+5062 +ENCODING 20578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1390 +1E12 +3252 +2256 +6FD4 +6254 +A210 +2710 +26B8 +2AA8 +2A28 +322C +2264 +2246 +22C3 +ENDCHAR +STARTCHAR U+5063 +ENCODING 20579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFE +1104 +318C +2088 +67FF +A000 +2000 +21FC +2104 +2104 +21FC +2104 +2104 +21FC +ENDCHAR +STARTCHAR U+5064 +ENCODING 20580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +1088 +27FF +4050 +23FE +2252 +2252 +2292 +231E +2202 +2272 +2202 +23FE +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+5065 +ENCODING 20581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +0E28 +13FC +1228 +34F8 +5F20 +11F8 +1520 +15FC +1220 +1320 +14C0 +183C +0000 +ENDCHAR +STARTCHAR U+5066 +ENCODING 20582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FF +1041 +327A +2240 +67E0 +6C3F +A800 +27FE +2402 +27FE +2402 +27FE +2402 +2402 +240E +ENDCHAR +STARTCHAR U+5067 +ENCODING 20583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1BFE +1090 +330C +2CF3 +6110 +A7B0 +2060 +21C0 +273C +2044 +21EC +2018 +2070 +21C0 +ENDCHAR +STARTCHAR U+5068 +ENCODING 20584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0910 +1110 +2110 +45DF +2510 +2511 +2FDF +2020 +2020 +27FF +2124 +2222 +2421 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+5069 +ENCODING 20585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +13FC +2408 +4010 +23FE +2202 +23FE +2202 +23FE +2202 +23FE +2104 +2202 +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+506A +ENCODING 20586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFE +1800 +11FC +3104 +2104 +61FC +A000 +2000 +23FE +2222 +2222 +23FE +2222 +2222 +23FE +ENDCHAR +STARTCHAR U+506B +ENCODING 20587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1208 +243E +6908 +217F +2200 +2604 +2A7F +2224 +2214 +2204 +2204 +2214 +2208 +0000 +0000 +ENDCHAR +STARTCHAR U+506C +ENCODING 20588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +0900 +0BF8 +12A8 +15A8 +3968 +5268 +14B0 +1080 +1150 +1548 +1504 +1914 +10F0 +0000 +ENDCHAR +STARTCHAR U+506D +ENCODING 20589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1FFF +1040 +30C0 +2080 +67FE +6492 +A492 +24F2 +2492 +2492 +24F2 +2492 +2492 +2492 +27FE +ENDCHAR +STARTCHAR U+506E +ENCODING 20590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +09FC +1104 +31FE +5000 +13FF +1104 +11FC +1104 +11FC +1104 +13FE +1004 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+506F +ENCODING 20591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +27FC +6000 +A3F8 +2208 +2208 +23F8 +2080 +2104 +2328 +2D10 +2148 +2386 +0000 +0000 +ENDCHAR +STARTCHAR U+5070 +ENCODING 20592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +17DE +110A +310A +27CA +610A +611A +A1D2 +2736 +2000 +2020 +27FF +2050 +20D8 +218C +2707 +ENDCHAR +STARTCHAR U+5071 +ENCODING 20593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +083C +1BE0 +1210 +33FF +2210 +62FE +A282 +2282 +22FE +2282 +2682 +24FE +2C82 +2082 +20FE +ENDCHAR +STARTCHAR U+5072 +ENCODING 20594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A48 +1248 +13F8 +3248 +5248 +13F8 +1040 +1120 +1528 +1504 +1914 +10F0 +0000 +ENDCHAR +STARTCHAR U+5073 +ENCODING 20595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0A21 +1221 +33FF +5000 +13FF +1020 +1040 +13FF +1249 +1249 +1249 +1249 +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+5074 +ENCODING 20596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0FA8 +0CA8 +14A8 +17A8 +34A8 +54A8 +17A8 +14A8 +14A8 +17A8 +1308 +1488 +1818 +0000 +ENDCHAR +STARTCHAR U+5075 +ENCODING 20597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08F8 +1080 +13F0 +3210 +53F0 +1210 +13F0 +1210 +13F0 +1120 +1610 +1808 +0000 +ENDCHAR +STARTCHAR U+5076 +ENCODING 20598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF0 +0A90 +13F0 +1290 +33F0 +5080 +17F8 +14A8 +14F8 +1718 +1408 +1408 +1418 +0000 +ENDCHAR +STARTCHAR U+5077 +ENCODING 20599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1140 +2220 +2410 +6BEE +B004 +2788 +24A8 +27A8 +24A8 +27A8 +24A8 +2488 +24A8 +2590 +ENDCHAR +STARTCHAR U+5078 +ENCODING 20600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +09C0 +0840 +08A0 +1110 +17F8 +3804 +57A8 +14A8 +16A8 +15D0 +16D0 +15A8 +14A8 +15A8 +0000 +ENDCHAR +STARTCHAR U+507A +ENCODING 20602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1200 +13C8 +1248 +2688 +6914 +A2A2 +2440 +283E +2000 +27FC +2404 +27FC +2404 +27FC +0000 +0000 +ENDCHAR +STARTCHAR U+507B +ENCODING 20603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0A48 +0950 +1040 +17FC +30E0 +5150 +924C +1080 +1FFE +1110 +1210 +1120 +10C0 +1130 +1608 +ENDCHAR +STARTCHAR U+507D +ENCODING 20605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A40 +0940 +0940 +17F0 +1090 +3090 +51F8 +1108 +13FC +1554 +1CAC +1284 +1204 +1018 +0000 +ENDCHAR +STARTCHAR U+507E +ENCODING 20606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +0FFC +1040 +1154 +3FFE +5110 +9008 +13FC +1208 +1248 +1248 +1248 +10B0 +110C +1604 +ENDCHAR +STARTCHAR U+507F +ENCODING 20607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0A48 +0950 +1040 +17FE +3402 +5814 +93F8 +1000 +1004 +1FFE +1040 +1090 +1108 +13FC +1004 +ENDCHAR +STARTCHAR U+5080 +ENCODING 20608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0880 +0BF8 +1248 +13F8 +3248 +53F8 +12C8 +10D0 +10D0 +1168 +117C +1244 +143C +0000 +ENDCHAR +STARTCHAR U+5081 +ENCODING 20609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFE +1222 +3222 +23FE +6222 +A222 +23FE +2020 +27FE +2104 +2098 +2070 +21DC +2707 +ENDCHAR +STARTCHAR U+5082 +ENCODING 20610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +17FE +2210 +421E +2210 +22FF +2291 +22BC +2290 +229E +2280 +2294 +2495 +2927 +0000 +0000 +ENDCHAR +STARTCHAR U+5083 +ENCODING 20611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0BFE +1820 +11FC +3020 +27FF +6020 +A044 +2188 +2052 +27FF +2021 +20A8 +23AE +2623 +2020 +ENDCHAR +STARTCHAR U+5084 +ENCODING 20612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1FFF +1088 +328A +2104 +63FE +AD05 +2104 +21FC +2104 +2104 +21FC +2104 +2104 +21FC +ENDCHAR +STARTCHAR U+5085 +ENCODING 20613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0FFC +0840 +13F8 +1248 +33F8 +5248 +13F8 +1258 +1010 +1FFC +1110 +1090 +1030 +0000 +ENDCHAR +STARTCHAR U+5086 +ENCODING 20614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFF +1A08 +1210 +32FE +2282 +6282 +A2FE +2282 +2282 +22FE +2210 +2654 +24D6 +2D93 +2030 +ENDCHAR +STARTCHAR U+5087 +ENCODING 20615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0848 +0BFF +1048 +2000 +53FF +1084 +10FC +1084 +10FC +1084 +1084 +13FF +1004 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+5088 +ENCODING 20616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +10A4 +27FE +24A4 +64A4 +A4A4 +27FC +2040 +2044 +2FFE +20E0 +2150 +224E +2C44 +2040 +ENDCHAR +STARTCHAR U+508A +ENCODING 20618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFC +1A04 +1204 +33FC +2000 +67FE +A402 +27FE +2402 +27FE +2402 +27FE +2204 +2606 +2C03 +ENDCHAR +STARTCHAR U+508B +ENCODING 20619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +0BFE +1088 +33FE +5088 +17FF +1020 +13FE +1222 +13FE +1222 +17FF +1202 +1204 +0000 +0000 +ENDCHAR +STARTCHAR U+508C +ENCODING 20620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +13FF +2210 +43FF +2210 +23FF +2210 +2210 +23FF +2001 +2551 +2551 +2551 +200E +0000 +0000 +ENDCHAR +STARTCHAR U+508D +ENCODING 20621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +1110 +10A0 +37FC +5444 +1FFC +1040 +10F8 +1088 +1108 +1608 +1830 +0000 +ENDCHAR +STARTCHAR U+508E +ENCODING 20622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +3020 +21FC +6104 +61FC +A104 +21FC +2104 +21FC +2000 +27FF +2088 +218C +2707 +ENDCHAR +STARTCHAR U+508F +ENCODING 20623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFF +1210 +32FE +2212 +63FF +A212 +2212 +22FE +2200 +22FE +2682 +2482 +2C82 +20FE +ENDCHAR +STARTCHAR U+5090 +ENCODING 20624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +3000 +21FC +6104 +61FC +A000 +27FF +2401 +24F9 +2489 +2489 +24F9 +2401 +2407 +ENDCHAR +STARTCHAR U+5091 +ENCODING 20625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0908 +0908 +0BFC +12A8 +15A8 +317C +5248 +1448 +1FFC +10E0 +1150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+5092 +ENCODING 20626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +103C +13C2 +3466 +2624 +6240 +60C8 +A190 +20A4 +207E +23C3 +2020 +27FF +2050 +218C +2707 +ENDCHAR +STARTCHAR U+5093 +ENCODING 20627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +17F8 +1400 +37FE +2402 +67FE +6400 +A7FF +2421 +24E7 +27BD +2421 +2CE7 +2BBD +3821 +20E7 +ENDCHAR +STARTCHAR U+5094 +ENCODING 20628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +17FF +3090 +23FE +6092 +6092 +A7FF +2092 +2092 +23FE +2098 +2194 +2396 +2693 +2090 +ENDCHAR +STARTCHAR U+5095 +ENCODING 20629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1020 +27FF +4441 +2090 +2110 +23FE +2510 +29FE +2110 +21FE +2110 +2110 +21FE +0000 +0000 +ENDCHAR +STARTCHAR U+5096 +ENCODING 20630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0870 +18D8 +118C +3777 +2000 +61FC +A104 +21FC +2104 +21FC +2300 +22FE +2682 +2C82 +20FE +ENDCHAR +STARTCHAR U+5098 +ENCODING 20632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0540 +1930 +692C +0920 +1550 +2BA8 +0920 +1550 +2388 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5099 +ENCODING 20633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0920 +0FF8 +1120 +17FC +3400 +57F8 +1648 +17F8 +1648 +17F8 +1A48 +1248 +1218 +0000 +ENDCHAR +STARTCHAR U+509A +ENCODING 20634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0920 +0920 +1FFC +1548 +34C8 +54A8 +1B28 +1130 +1110 +1290 +12A8 +1448 +1884 +0000 +ENDCHAR +STARTCHAR U+509B +ENCODING 20635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFE +1202 +328A +218C +6326 +A070 +20D8 +218C +2707 +21FC +2104 +2104 +2104 +21FC +ENDCHAR +STARTCHAR U+509C +ENCODING 20636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +087C +18C4 +11AC +3358 +2030 +60C0 +A700 +21FE +2220 +2020 +27FF +2020 +2222 +2222 +23FE +ENDCHAR +STARTCHAR U+509D +ENCODING 20637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFE +1202 +23FE +4202 +23FE +2000 +2000 +27DF +2041 +234D +20C3 +275D +2041 +238E +0000 +0000 +ENDCHAR +STARTCHAR U+509E +ENCODING 20638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +0888 +1BFE +1020 +3020 +21FC +6020 +A020 +23FE +2040 +2080 +21FE +2310 +2C10 +2010 +21FF +ENDCHAR +STARTCHAR U+509F +ENCODING 20639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0488 +0488 +0D8C +0B46 +18C8 +108C +31F6 +7000 +D7DE +1042 +1252 +114A +10C6 +114A +1252 +10C6 +ENDCHAR +STARTCHAR U+50A0 +ENCODING 20640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1784 +1004 +3FC4 +203F +6784 +6024 +A034 +2794 +2014 +2004 +2784 +2484 +2484 +2484 +279C +ENDCHAR +STARTCHAR U+50A1 +ENCODING 20641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1208 +1208 +3FBF +2000 +64A2 +64A2 +A4A2 +25B6 +2514 +2114 +21D4 +2714 +2C04 +207F +2000 +ENDCHAR +STARTCHAR U+50A2 +ENCODING 20642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FE +3402 +2000 +63FC +6040 +A1A2 +2626 +2054 +2190 +2638 +2054 +2196 +2613 +2060 +ENDCHAR +STARTCHAR U+50A3 +ENCODING 20643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1088 +1FFC +2080 +2FF8 +6100 +BFFE +2220 +2490 +2C9E +32A4 +21C0 +22A0 +2498 +2888 +2180 +ENDCHAR +STARTCHAR U+50A5 +ENCODING 20645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1490 +12A0 +2080 +2FFC +6804 +B7F8 +2410 +2410 +2410 +27F0 +2550 +2140 +2144 +2244 +2C3C +ENDCHAR +STARTCHAR U+50A7 +ENCODING 20647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0840 +0BFE +1202 +1434 +31C0 +5108 +91FC +1110 +1110 +1114 +1FFE +1000 +1090 +110C +1604 +ENDCHAR +STARTCHAR U+50A8 +ENCODING 20648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1848 +25FC +2450 +6064 +BDFE +2488 +25FC +2688 +2488 +25F8 +2688 +2488 +20F8 +2088 +ENDCHAR +STARTCHAR U+50A9 +ENCODING 20649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1030 +1028 +2F7E +2148 +71C8 +AA7E +2A48 +2448 +247E +2A48 +2948 +3148 +207E +2040 +2040 +ENDCHAR +STARTCHAR U+50AA +ENCODING 20650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0888 +18F8 +1204 +3489 +278F +6020 +A050 +218C +2727 +2040 +2190 +2066 +218C +2038 +23E0 +ENDCHAR +STARTCHAR U+50AC +ENCODING 20652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0A48 +0A48 +13F8 +1298 +3120 +53FC +1620 +1BF8 +1220 +13F8 +1220 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+50AD +ENCODING 20653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1440 +27F8 +2448 +67FC +27F8 +2440 +27F8 +2648 +2BF8 +2BF8 +3248 +2258 +0000 +ENDCHAR +STARTCHAR U+50AE +ENCODING 20654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0444 +09FF +1044 +31FF +5145 +11FF +1145 +11FF +1000 +10FE +1082 +10FE +1082 +10FE +0000 +0000 +ENDCHAR +STARTCHAR U+50AF +ENCODING 20655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1040 +17FE +3442 +257A +648A +6552 +A462 +25D2 +2402 +27FE +2020 +2532 +2513 +2D05 +28FC +ENDCHAR +STARTCHAR U+50B0 +ENCODING 20656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0A22 +1A22 +13FE +3000 +23DE +6252 +A252 +23DE +2252 +2252 +23DE +2252 +2252 +22D2 +2426 +ENDCHAR +STARTCHAR U+50B1 +ENCODING 20657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +04A2 +0922 +1222 +3055 +5088 +1100 +1308 +1548 +114F +1148 +1148 +11A8 +1118 +110F +0000 +0000 +ENDCHAR +STARTCHAR U+50B2 +ENCODING 20658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A20 +0A20 +0FA0 +127C +1FC8 +3248 +52A8 +1FA8 +1230 +1390 +1290 +14A8 +14C8 +1984 +0000 +ENDCHAR +STARTCHAR U+50B3 +ENCODING 20659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0FFC +0840 +13F8 +1248 +33F8 +53F8 +1048 +17FC +1010 +1FFC +1210 +1110 +1030 +0000 +ENDCHAR +STARTCHAR U+50B4 +ENCODING 20660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0C00 +14F0 +1490 +34F0 +5400 +15F8 +1568 +1568 +15F8 +1400 +17FC +1400 +0000 +ENDCHAR +STARTCHAR U+50B5 +ENCODING 20661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0FF8 +0840 +13F8 +1040 +3FFC +53F0 +1210 +13F0 +13F0 +1210 +13F0 +1310 +1C08 +0000 +ENDCHAR +STARTCHAR U+50B6 +ENCODING 20662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080A +0809 +13FF +3208 +5248 +1278 +1248 +13F8 +1248 +12E9 +135A +1244 +144B +10D1 +0000 +0000 +ENDCHAR +STARTCHAR U+50B7 +ENCODING 20663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +09FC +0BF0 +1510 +19F0 +3110 +51F0 +1FFC +1200 +13F8 +14A8 +1928 +1248 +10B0 +0000 +ENDCHAR +STARTCHAR U+50B8 +ENCODING 20664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +09FF +1955 +2892 +4955 +0810 +0955 +0892 +0955 +0828 +0844 +0882 +0901 +0000 +0000 +ENDCHAR +STARTCHAR U+50B9 +ENCODING 20665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +3104 +2088 +67FF +6000 +A3FE +2202 +23FE +2202 +23FE +2088 +2189 +2309 +2E07 +ENDCHAR +STARTCHAR U+50BA +ENCODING 20666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A00 +0A20 +0BBC +14A4 +1AA8 +3510 +5310 +92E8 +1406 +1800 +17FC +1150 +124C +1444 +1140 +1080 +ENDCHAR +STARTCHAR U+50BB +ENCODING 20667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1104 +17FE +2514 +24E4 +6514 +A7FC +2208 +2506 +29FA +2308 +2490 +2860 +2090 +230E +2C04 +ENDCHAR +STARTCHAR U+50BD +ENCODING 20669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1BFE +1104 +3088 +27FF +6000 +A3FE +2202 +23FE +2202 +23FE +2020 +27FF +2020 +2020 +ENDCHAR +STARTCHAR U+50BE +ENCODING 20670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0810 +1420 +1578 +3548 +5678 +1448 +1478 +1548 +1578 +1330 +1048 +1184 +0000 +ENDCHAR +STARTCHAR U+50BF +ENCODING 20671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FFF +1020 +213C +6120 +27FF +2100 +21FC +2100 +21FF +2001 +2529 +2529 +2001 +201E +0000 +0000 +ENDCHAR +STARTCHAR U+50C0 +ENCODING 20672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0954 +0954 +1FFF +1154 +3354 +2677 +6000 +A7FF +2421 +2421 +23FE +2222 +2222 +2222 +2226 +2020 +ENDCHAR +STARTCHAR U+50C1 +ENCODING 20673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +2421 +6222 +27FF +2070 +20A8 +2124 +2663 +2020 +2500 +2542 +2521 +2104 +21FC +0000 +0000 +ENDCHAR +STARTCHAR U+50C2 +ENCODING 20674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0BF8 +0A48 +17FC +1248 +33F8 +53F8 +1248 +13F8 +1080 +1FFC +1190 +1070 +1788 +0000 +ENDCHAR +STARTCHAR U+50C3 +ENCODING 20675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +17FF +3088 +2288 +6200 +67FF +AC01 +2BF9 +2249 +23F9 +2249 +23F9 +2249 +225B +2006 +ENDCHAR +STARTCHAR U+50C4 +ENCODING 20676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BFF +1848 +13FF +3249 +2249 +63FF +A000 +21FE +2000 +23FF +2020 +2124 +2326 +2623 +20E0 +ENDCHAR +STARTCHAR U+50C5 +ENCODING 20677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +0910 +0FFC +1110 +13F8 +3248 +53F8 +1040 +13F8 +1040 +13F8 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+50C6 +ENCODING 20678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +15FF +2210 +60FE +2E92 +22FE +2492 +28FE +2410 +23FF +2210 +2410 +2A00 +31FF +0000 +0000 +ENDCHAR +STARTCHAR U+50C7 +ENCODING 20679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BDE +1842 +114A +30C6 +214A +6022 +A070 +21DC +2707 +2020 +21C8 +2032 +21C4 +2018 +21E0 +ENDCHAR +STARTCHAR U+50C8 +ENCODING 20680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFE +1202 +23FE +6202 +23FE +27FF +2489 +27FF +2000 +21FC +2088 +2050 +2020 +23DE +0000 +0000 +ENDCHAR +STARTCHAR U+50C9 +ENCODING 20681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1FF0 +600C +1EF0 +1290 +1290 +1EF0 +0820 +0C20 +1250 +2288 +4108 +0000 +ENDCHAR +STARTCHAR U+50CA +ENCODING 20682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0920 +17F8 +1528 +37F8 +5080 +1FFC +1120 +17F8 +1A24 +13E0 +1208 +11F8 +0000 +ENDCHAR +STARTCHAR U+50CB +ENCODING 20683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0438 +0844 +10BA +3101 +527C +1008 +10FE +1082 +10FE +10FE +1082 +10FE +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+50CC +ENCODING 20684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1108 +1FE8 +311F +27D2 +6572 +6552 +A7DA +254A +254E +27C4 +2104 +2FEE +210A +211B +2111 +ENDCHAR +STARTCHAR U+50CD +ENCODING 20685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11A0 +1E20 +1220 +3FF8 +2FA8 +6AA8 +2FA8 +2AA8 +2FA8 +2228 +2FA8 +2228 +23C8 +2C98 +0000 +ENDCHAR +STARTCHAR U+50CE +ENCODING 20686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17DF +1451 +37DF +2410 +6451 +63CF +A000 +2088 +23FE +2088 +2088 +27FF +2088 +218C +2707 +ENDCHAR +STARTCHAR U+50CF +ENCODING 20687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +09F0 +0E20 +13F8 +1248 +33F8 +5040 +1188 +16D0 +1160 +16B0 +1128 +1624 +10C0 +0000 +ENDCHAR +STARTCHAR U+50D0 +ENCODING 20688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1202 +1104 +17FF +3020 +23FE +6020 +67FF +A222 +2124 +27FF +2000 +23FE +2202 +2202 +2202 +23FE +ENDCHAR +STARTCHAR U+50D1 +ENCODING 20689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0830 +0BC0 +0880 +1FFC +1120 +33F0 +5528 +19E4 +17F8 +1408 +15E8 +1528 +15E8 +1418 +0000 +ENDCHAR +STARTCHAR U+50D3 +ENCODING 20691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +09FC +1924 +11FC +3020 +27FF +6000 +A1FC +2104 +21FC +2104 +21FC +2104 +21FC +2088 +2306 +ENDCHAR +STARTCHAR U+50D4 +ENCODING 20692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +17FF +3050 +23FE +6252 +639E +A202 +23FE +2202 +23FE +2004 +27FF +2104 +2084 +201C +ENDCHAR +STARTCHAR U+50D5 +ENCODING 20693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +0AA8 +09B0 +17FC +1110 +30A0 +57FC +1040 +13F8 +1040 +17FC +10A0 +1310 +1C0C +0000 +ENDCHAR +STARTCHAR U+50D6 +ENCODING 20694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0FFC +0840 +13F8 +1000 +33F8 +5208 +13F8 +1110 +1FFC +1000 +13F8 +1208 +13F8 +0000 +ENDCHAR +STARTCHAR U+50D7 +ENCODING 20695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +1555 +338E +5104 +128A +1451 +1000 +17FF +1441 +13FE +1042 +1082 +1102 +120C +0000 +0000 +ENDCHAR +STARTCHAR U+50D8 +ENCODING 20696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1108 +1928 +354F +210A +6FEA +683A +A82A +2BAA +2AAE +2AA4 +2AA4 +2BAE +282A +286A +201B +ENDCHAR +STARTCHAR U+50DA +ENCODING 20698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0FFC +14A4 +1318 +33F8 +5514 +11F0 +1110 +11F0 +1248 +1244 +1444 +10C0 +0000 +ENDCHAR +STARTCHAR U+50DB +ENCODING 20699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1450 +1450 +2FFF +6451 +2445 +27C5 +2444 +2444 +27C4 +2444 +2444 +2FE4 +228A +2451 +0000 +0000 +ENDCHAR +STARTCHAR U+50DC +ENCODING 20700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13E8 +1451 +328A +2104 +66FB +6000 +A1FC +2104 +2104 +21FC +2000 +2104 +218C +2088 +27FF +ENDCHAR +STARTCHAR U+50DD +ENCODING 20701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FE +1402 +37FE +2400 +64FC +6408 +A5FE +2410 +2430 +25CE +2442 +24E4 +279F +2884 +218C +ENDCHAR +STARTCHAR U+50DE +ENCODING 20702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +0FF0 +0A48 +1444 +13F0 +3210 +53F8 +1208 +13FC +1254 +152C +14AC +1A84 +1218 +0000 +ENDCHAR +STARTCHAR U+50DF +ENCODING 20703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1122 +1224 +16AD +3122 +2225 +62AF +67A4 +A022 +23FF +2220 +2312 +2294 +2288 +2615 +2427 +2CC2 +ENDCHAR +STARTCHAR U+50E0 +ENCODING 20704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +1020 +3124 +50A8 +17FF +10A8 +1124 +1222 +1401 +13FE +1222 +13FE +1222 +13FE +0000 +0000 +ENDCHAR +STARTCHAR U+50E2 +ENCODING 20706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +103C +17E2 +3246 +2124 +67FF +6401 +A505 +21C4 +237F +2254 +25D4 +2094 +21BF +2304 +2604 +ENDCHAR +STARTCHAR U+50E3 +ENCODING 20707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0920 +0FF8 +1120 +1FFC +3330 +52B0 +14C8 +1BF4 +1210 +13F0 +1210 +13F0 +1210 +0000 +ENDCHAR +STARTCHAR U+50E4 +ENCODING 20708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BDE +0A52 +1BDE +1000 +33FE +2222 +6222 +A3FE +2222 +2222 +23FE +2020 +27FF +2020 +2020 +2020 +ENDCHAR +STARTCHAR U+50E5 +ENCODING 20709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0BF8 +0840 +17FC +1110 +37BC +5110 +11BC +1600 +17FC +10A0 +10A0 +1124 +161C +0000 +ENDCHAR +STARTCHAR U+50E6 +ENCODING 20710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1410 +1210 +1298 +3FD4 +2010 +6FFE +A890 +2890 +2898 +2F98 +2228 +2B28 +2AA8 +32CA +264A +2086 +ENDCHAR +STARTCHAR U+50E7 +ENCODING 20711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +08A0 +0BF8 +1248 +13F8 +3248 +53F8 +1000 +11F0 +1110 +11F0 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+50E8 +ENCODING 20712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0BFE +1820 +1104 +37FF +2104 +6000 +A3FE +2202 +23FE +2202 +23FE +2202 +23FE +2104 +2603 +ENDCHAR +STARTCHAR U+50E9 +ENCODING 20713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17DF +1451 +37DF +2451 +67DF +6401 +A4F9 +2489 +2489 +24F9 +2489 +2489 +24F9 +2401 +2407 +ENDCHAR +STARTCHAR U+50EA +ENCODING 20714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +0808 +1050 +37FF +50A2 +1124 +1060 +17FF +1489 +1489 +1575 +1451 +1471 +1403 +0000 +0000 +ENDCHAR +STARTCHAR U+50EC +ENCODING 20716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0940 +0924 +09FE +1220 +1628 +3BFC +5220 +9228 +13FC +1220 +1224 +13FE +1200 +1524 +1492 +1802 +ENDCHAR +STARTCHAR U+50ED +ENCODING 20717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +0FFC +0D50 +1550 +17FC +3330 +55B4 +194C +13F8 +1208 +13F8 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+50EE +ENCODING 20718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0FF8 +0920 +1FFC +1000 +33F8 +5248 +13F8 +1248 +13F8 +1040 +13F8 +1040 +17FC +0000 +ENDCHAR +STARTCHAR U+50EF +ENCODING 20719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1222 +1124 +1020 +37FF +20A8 +61AC +6727 +A120 +21C4 +237F +2654 +21D4 +20BF +2184 +2304 +2604 +ENDCHAR +STARTCHAR U+50F0 +ENCODING 20720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +7F7F +4949 +4949 +1C1C +2A2A +4949 +0080 +0080 +0140 +0220 +7C1F +0000 +0000 +ENDCHAR +STARTCHAR U+50F1 +ENCODING 20721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FF +1000 +33FE +2202 +63FE +6224 +A248 +22FE +2390 +22FC +2290 +26FC +2490 +2CFF +2000 +ENDCHAR +STARTCHAR U+50F2 +ENCODING 20722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1FFF +1090 +37FE +2492 +6492 +67FE +A204 +2384 +26BF +2484 +2B94 +2124 +237F +2604 +2C04 +ENDCHAR +STARTCHAR U+50F3 +ENCODING 20723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +10A0 +27FC +24A4 +64A4 +A7FC +2040 +2248 +2150 +2FFE +2150 +2248 +2446 +2844 +2040 +ENDCHAR +STARTCHAR U+50F5 +ENCODING 20725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0BF8 +1248 +13F8 +3248 +53F8 +17FC +13F8 +1248 +13F8 +1248 +13F8 +17FC +0000 +ENDCHAR +STARTCHAR U+50F6 +ENCODING 20726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FC +14A4 +34A4 +27BC +60A0 +62A0 +AEBE +28A2 +28A2 +2FBE +28A2 +28A2 +2FBE +2041 +203F +ENDCHAR +STARTCHAR U+50F8 +ENCODING 20728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +17DF +3104 +538E +1555 +1104 +13FE +1000 +17FF +1020 +10A8 +1727 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+50F9 +ENCODING 20729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0920 +17F8 +1528 +37F8 +53F0 +1210 +13F0 +13F0 +1210 +13F0 +1130 +1608 +0000 +ENDCHAR +STARTCHAR U+50FA +ENCODING 20730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +04F8 +0488 +0C88 +08F8 +1800 +13DE +3252 +7252 +D3DE +1020 +17FF +10A8 +11AC +1326 +1623 +1020 +ENDCHAR +STARTCHAR U+50FB +ENCODING 20731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0B90 +0AFC +12A8 +12A8 +33A8 +527C +1210 +1790 +16FC +1A90 +1290 +1390 +1210 +0000 +ENDCHAR +STARTCHAR U+50FD +ENCODING 20733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0B84 +1115 +37D5 +5104 +1384 +154A +1111 +1000 +12A4 +1292 +1280 +1482 +107E +0000 +0000 +ENDCHAR +STARTCHAR U+50FE +ENCODING 20734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +17F8 +1242 +3124 +27FF +6421 +6292 +A285 +247C +2080 +21FC +2304 +2698 +2070 +21DC +2707 +ENDCHAR +STARTCHAR U+50FF +ENCODING 20735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +17FF +1489 +3088 +33FE +5088 +53FE +1088 +17FF +1124 +1222 +15FD +1020 +17FF +1000 +ENDCHAR +STARTCHAR U+5100 +ENCODING 20736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +08A0 +0FFC +1040 +13F8 +3040 +57FC +13A8 +1124 +1FFC +11A8 +1710 +116C +1304 +0000 +ENDCHAR +STARTCHAR U+5101 +ENCODING 20737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0920 +0BFC +1240 +17F8 +3A40 +53F8 +1240 +13FC +1000 +17BC +14A4 +14E4 +140C +0000 +ENDCHAR +STARTCHAR U+5102 +ENCODING 20738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +0BF8 +0AA8 +13F8 +12A8 +33F8 +5000 +17F8 +14E0 +17FC +1548 +1930 +19D0 +170C +0000 +ENDCHAR +STARTCHAR U+5103 +ENCODING 20739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1000 +33FE +2202 +62FA +628A +A2FA +2202 +23FE +2104 +21FC +2104 +21FC +2104 +27FF +ENDCHAR +STARTCHAR U+5104 +ENCODING 20740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0BF8 +08A0 +17FC +1000 +31F0 +5110 +11F0 +1110 +11F0 +1548 +1524 +1914 +10F0 +0000 +ENDCHAR +STARTCHAR U+5105 +ENCODING 20741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1150 +27FC +6404 +A5F4 +2110 +21F0 +2000 +23F8 +2248 +23F8 +2248 +23F8 +2208 +0000 +0000 +ENDCHAR +STARTCHAR U+5106 +ENCODING 20742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1520 +1520 +1FA0 +2524 +257E +6884 +AFC4 +28C4 +30A8 +2EA8 +2AA8 +2A90 +2EA8 +20A8 +22C6 +2104 +ENDCHAR +STARTCHAR U+5107 +ENCODING 20743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0FFE +0CA4 +14A4 +17FC +3000 +5FFE +9008 +13FC +1208 +13F8 +10C4 +1128 +1310 +1D8E +1104 +ENDCHAR +STARTCHAR U+5108 +ENCODING 20744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0850 +198C +1777 +3000 +23FE +6222 +A2AA +2222 +23FE +2000 +21FC +2104 +21FC +2104 +21FC +ENDCHAR +STARTCHAR U+5109 +ENCODING 20745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +08A0 +1110 +17FC +3000 +53B8 +12A8 +12A8 +13B8 +1110 +1198 +1264 +1444 +0000 +ENDCHAR +STARTCHAR U+510A +ENCODING 20746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +0904 +17DF +3104 +538E +1555 +1104 +17FF +1021 +1020 +113E +1120 +12A0 +147F +0000 +0000 +ENDCHAR +STARTCHAR U+510B +ENCODING 20747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +09F8 +0A10 +17FE +1488 +3524 +57FE +9400 +15FC +1400 +15FC +1400 +15FC +1504 +19FC +1104 +ENDCHAR +STARTCHAR U+510C +ENCODING 20748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1208 +17C8 +345F +27D2 +6472 +67D2 +A11A +2FEA +220E +23C4 +2244 +264E +24CA +2C9B +2991 +ENDCHAR +STARTCHAR U+510D +ENCODING 20749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0A8A +1A52 +1326 +3252 +228A +6222 +A3FE +2104 +2607 +2080 +21FC +2748 +2030 +20DC +2787 +ENDCHAR +STARTCHAR U+510E +ENCODING 20750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1114 +1116 +17D2 +3110 +2FFE +6110 +67D4 +A114 +27D4 +2554 +27DC +2548 +27C9 +211D +27D7 +2132 +ENDCHAR +STARTCHAR U+5110 +ENCODING 20752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0BFF +1A01 +11FE +30A4 +232B +6030 +A1FE +2702 +21FE +2102 +21FE +2102 +21FE +2084 +2303 +ENDCHAR +STARTCHAR U+5111 +ENCODING 20753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFE +1202 +33FE +5202 +13FE +1104 +1249 +17DF +1104 +1249 +17DF +1000 +1292 +1449 +0000 +0000 +ENDCHAR +STARTCHAR U+5112 +ENCODING 20754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0840 +17FC +1758 +3B58 +5000 +17FC +1040 +13F8 +12A8 +12A8 +12A8 +12B8 +0000 +ENDCHAR +STARTCHAR U+5113 +ENCODING 20755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +09FC +1020 +31FC +51FC +1104 +11FC +17FF +15FD +1449 +11FC +1020 +11FC +13FE +0000 +0000 +ENDCHAR +STARTCHAR U+5114 +ENCODING 20756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0FFC +0840 +13F8 +1FFC +33E8 +5040 +13F8 +1FFC +1008 +17FC +1548 +1728 +1418 +0000 +ENDCHAR +STARTCHAR U+5115 +ENCODING 20757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1FFC +1148 +3EB8 +2AA8 +6AB8 +2EE8 +3214 +23F0 +2210 +23F0 +2210 +2410 +2810 +0000 +ENDCHAR +STARTCHAR U+5116 +ENCODING 20758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0FE0 +0D20 +17BC +14C0 +3780 +5538 +17C0 +1000 +13F8 +12A8 +12A8 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+5117 +ENCODING 20759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1400 +14BF +1702 +3414 +2488 +63BF +6409 +A78A +2A28 +222E +2FA8 +2228 +2328 +22B8 +246C +28C7 +ENDCHAR +STARTCHAR U+5118 +ENCODING 20760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +17F0 +1090 +2FFC +27F0 +6080 +3FFC +2A48 +3124 +27F0 +2550 +2550 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5119 +ENCODING 20761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +14FE +1692 +32FE +2010 +61FF +6000 +AEFC +2284 +22FC +2280 +22FE +2282 +26FE +2500 +2CFF +ENDCHAR +STARTCHAR U+511A +ENCODING 20762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0FFC +0920 +13F8 +12A8 +33F8 +5000 +17FC +1444 +18F8 +1390 +1060 +10C0 +1700 +0000 +ENDCHAR +STARTCHAR U+511B +ENCODING 20763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1200 +17FE +1D54 +3154 +27FF +6154 +6154 +A3FE +2000 +2204 +23DE +2654 +2D54 +20FF +2384 +2E04 +ENDCHAR +STARTCHAR U+511C +ENCODING 20764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +3441 +24A1 +628A +64F9 +A000 +23FE +2292 +23FE +2000 +27FF +2020 +2020 +20E0 +ENDCHAR +STARTCHAR U+511D +ENCODING 20765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1555 +1555 +328A +2451 +6000 +63FE +A202 +2020 +27FF +20A8 +20A8 +21AC +2326 +2623 +2020 +ENDCHAR +STARTCHAR U+511E +ENCODING 20766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FF +1124 +3222 +27FF +6222 +6376 +A2AA +2376 +2222 +2376 +22AA +2376 +2222 +2222 +2206 +ENDCHAR +STARTCHAR U+511F +ENCODING 20767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A88 +0950 +0FFC +15E8 +1920 +31E0 +53F0 +1210 +13F0 +13F0 +1210 +13F0 +1310 +1C08 +0000 +ENDCHAR +STARTCHAR U+5120 +ENCODING 20768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0924 +0A48 +1124 +37FE +5422 +14DA +17FE +1448 +1778 +1448 +1778 +1449 +1555 +1662 +0000 +0000 +ENDCHAR +STARTCHAR U+5121 +ENCODING 20769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A48 +13F8 +1248 +33F8 +5208 +1000 +17FC +1554 +17FC +1554 +17FC +1444 +0000 +ENDCHAR +STARTCHAR U+5122 +ENCODING 20770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +083C +13FF +3221 +52FC +123C +127C +1254 +127C +1254 +127C +1251 +1542 +127E +0000 +0000 +ENDCHAR +STARTCHAR U+5123 +ENCODING 20771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +3448 +25FE +6448 +67FF +A420 +25FE +2522 +25FE +2522 +2D22 +29FE +3884 +2303 +ENDCHAR +STARTCHAR U+5124 +ENCODING 20772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +0904 +11FC +3104 +51FC +1088 +17FF +1088 +17FF +122A +15F1 +1068 +10A4 +1122 +0000 +0000 +ENDCHAR +STARTCHAR U+5125 +ENCODING 20773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +08FE +1010 +30FE +51FF +1129 +11FF +10FE +1082 +10FE +10FE +1082 +10FE +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+5126 +ENCODING 20774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0BFF +1248 +32FE +524A +12FE +1288 +1288 +12EE +1289 +12EF +1400 +1A4A +1249 +0000 +0000 +ENDCHAR +STARTCHAR U+5127 +ENCODING 20775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +17DF +1104 +37DF +2104 +628A +6451 +A1FC +2104 +21FC +2104 +21FC +2104 +21FC +2088 +2306 +ENDCHAR +STARTCHAR U+5128 +ENCODING 20776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10C3 +179E +1410 +37DF +2514 +6924 +6000 +A3FC +2204 +23FC +2204 +23FC +2204 +23FC +2108 +2E07 +ENDCHAR +STARTCHAR U+5129 +ENCODING 20777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +081E +0F92 +149E +3492 +579E +1492 +14A0 +17BF +14D5 +1495 +1795 +1029 +1301 +1486 +0000 +0000 +ENDCHAR +STARTCHAR U+512A +ENCODING 20778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +0840 +11F0 +11F0 +31F0 +57FC +1758 +1AE8 +14F4 +11A0 +1640 +11B0 +1E0C +0000 +ENDCHAR +STARTCHAR U+512C +ENCODING 20780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +113E +1FE2 +3122 +27BE +6122 +6FE2 +A03E +27A2 +24A2 +27BE +2494 +2794 +2495 +24B5 +25E3 +ENDCHAR +STARTCHAR U+512D +ENCODING 20781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +093E +1FE2 +12A2 +32BE +22A2 +67E2 +A13E +2122 +27E2 +213E +2394 +2554 +2935 +2125 +2163 +ENDCHAR +STARTCHAR U+512E +ENCODING 20782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFF +1211 +32EE +5244 +12FF +1244 +12EE +1355 +1244 +1210 +1210 +125C +1450 +19FF +0000 +0000 +ENDCHAR +STARTCHAR U+512F +ENCODING 20783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1244 +1148 +17FE +3090 +2FFF +6204 +67FE +AA21 +23FC +2220 +23FC +2220 +23FF +2551 +2D49 +2803 +ENDCHAR +STARTCHAR U+5130 +ENCODING 20784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +17FF +3088 +5088 +1050 +11FC +1044 +10FE +1102 +13FF +1555 +1155 +1001 +1006 +0000 +0000 +ENDCHAR +STARTCHAR U+5131 +ENCODING 20785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1108 +1FEF +3448 +228F +6FE1 +600F +A7C8 +244F +27C8 +244F +27C8 +244F +2448 +2449 +24C7 +ENDCHAR +STARTCHAR U+5132 +ENCODING 20786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0F20 +08F8 +1F28 +1030 +37FC +5020 +1778 +10C8 +1778 +1548 +1548 +1778 +1548 +0000 +ENDCHAR +STARTCHAR U+5133 +ENCODING 20787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11F8 +1610 +13FE +3202 +23FE +6110 +61DE +A111 +23CF +2000 +23FE +2222 +23FE +2094 +2191 +270F +ENDCHAR +STARTCHAR U+5134 +ENCODING 20788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1000 +33DE +2252 +63DE +6088 +A3FE +2088 +23FE +2088 +27FF +2091 +270A +21E4 +2303 +ENDCHAR +STARTCHAR U+5135 +ENCODING 20789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +13FF +16CC +3078 +28CC +6FFF +6924 +A9FC +2924 +29FC +2820 +29FC +2820 +27FF +2154 +2252 +ENDCHAR +STARTCHAR U+5137 +ENCODING 20791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FBC +0800 +0FBC +15B4 +1040 +37FC +54A0 +17F8 +14A8 +17F8 +15E4 +1938 +19E4 +171C +0000 +ENDCHAR +STARTCHAR U+5138 +ENCODING 20792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FE +1492 +37FE +2000 +610A +661F +A2B4 +2114 +225E +27D4 +2154 +211E +2554 +2954 +211F +ENDCHAR +STARTCHAR U+5139 +ENCODING 20793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1514 +17FF +1924 +37DF +228A +62CA +6493 +A3FE +2202 +23FE +2202 +23FE +2202 +23FE +2104 +2603 +ENDCHAR +STARTCHAR U+513A +ENCODING 20794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1528 +1FA8 +1528 +177C +2250 +2FD0 +6AFC +2FD0 +2250 +2FFC +2250 +2FD0 +257C +28C0 +0000 +ENDCHAR +STARTCHAR U+513B +ENCODING 20795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0950 +0FFC +0D18 +11F0 +13F8 +3358 +52E8 +13F8 +1040 +13F8 +1040 +17FC +12A8 +14A4 +0000 +ENDCHAR +STARTCHAR U+513C +ENCODING 20796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +13B8 +12A8 +13B8 +2000 +2FFC +6BA0 +2920 +2FFC +2AE8 +2BA8 +2B90 +32D0 +37A8 +20C4 +0000 +ENDCHAR +STARTCHAR U+513D +ENCODING 20797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +05FC +0924 +11FC +31FC +57DF +1555 +17DF +17DF +1088 +11F0 +1022 +13FE +10A8 +1124 +0000 +0000 +ENDCHAR +STARTCHAR U+513F +ENCODING 20799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0840 +0840 +1044 +2044 +403C +0000 +ENDCHAR +STARTCHAR U+5140 +ENCODING 20800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0840 +0840 +1044 +2044 +403C +0000 +ENDCHAR +STARTCHAR U+5141 +ENCODING 20801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0240 +0430 +0868 +7F84 +0480 +0480 +0480 +0880 +0880 +1080 +1084 +2084 +407C +0000 +ENDCHAR +STARTCHAR U+5142 +ENCODING 20802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +1FFE +1080 +1080 +1080 +1080 +FFFF +0080 +0180 +0140 +0340 +0640 +0C41 +3863 +E03E +ENDCHAR +STARTCHAR U+5143 +ENCODING 20803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0000 +0000 +0000 +7FFC +0480 +0480 +0480 +0880 +0884 +1084 +2084 +407C +0000 +ENDCHAR +STARTCHAR U+5144 +ENCODING 20804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +1020 +1020 +1020 +1FE0 +1520 +0500 +0500 +0900 +0908 +1108 +2108 +40F8 +0000 +ENDCHAR +STARTCHAR U+5145 +ENCODING 20805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0240 +0220 +0470 +3F88 +0240 +0240 +0440 +0440 +0844 +1044 +603C +0000 +ENDCHAR +STARTCHAR U+5146 +ENCODING 20806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +0480 +0490 +2490 +14A0 +14C0 +0480 +06A0 +0C90 +7890 +0880 +1084 +2084 +407C +0000 +ENDCHAR +STARTCHAR U+5147 +ENCODING 20807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +2090 +2D10 +2310 +2290 +2490 +2810 +3FF0 +2490 +0480 +0880 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+5148 +ENCODING 20808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +0900 +0FF0 +1100 +2100 +7FFC +0280 +0280 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+5149 +ENCODING 20809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1110 +0910 +0920 +0100 +7FFC +0480 +0480 +0480 +0880 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+514A +ENCODING 20810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0C30 +3A1C +E607 +0410 +0410 +0FF8 +380C +0000 +0420 +0420 +0C20 +0820 +1821 +3033 +E01E +ENDCHAR +STARTCHAR U+514B +ENCODING 20811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +1010 +1010 +1FF0 +1290 +0280 +0280 +0484 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+514C +ENCODING 20812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +0440 +0820 +1010 +6FEC +0820 +0820 +0820 +0FE0 +0280 +0280 +0484 +0884 +307C +0000 +ENDCHAR +STARTCHAR U+514D +ENCODING 20813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +07C0 +0880 +1100 +7FF0 +1110 +1110 +1FF0 +1290 +0280 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+514E +ENCODING 20814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +00C0 +3F00 +0100 +1FF0 +1110 +1110 +1FF0 +1310 +0340 +0520 +0924 +1104 +60FC +0000 +ENDCHAR +STARTCHAR U+514F +ENCODING 20815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +0078 +3FC0 +2040 +2040 +207C +2040 +2040 +2FFF +2110 +2110 +6110 +4310 +C211 +0613 +0C0E +ENDCHAR +STARTCHAR U+5150 +ENCODING 20816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13F0 +1210 +1210 +13F0 +1210 +1210 +13F0 +1290 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+5151 +ENCODING 20817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0820 +0450 +1FF8 +1010 +1010 +1010 +1010 +1FF0 +1450 +0440 +0440 +0842 +0842 +103E +6000 +ENDCHAR +STARTCHAR U+5152 +ENCODING 20818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +3CF8 +2008 +2008 +3EF8 +2008 +2008 +3FF8 +2488 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+5153 +ENCODING 20819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +0404 +3F3F +2424 +2424 +2424 +2424 +FF7F +0404 +0C0C +0C0C +1C1C +1514 +3535 +6365 +C0C3 +ENDCHAR +STARTCHAR U+5154 +ENCODING 20820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +03E0 +0440 +1880 +7FF0 +1110 +1110 +1FF0 +1310 +0340 +0520 +0924 +1104 +60FC +0000 +ENDCHAR +STARTCHAR U+5155 +ENCODING 20821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3C7C +2448 +2448 +27C8 +2008 +2008 +3FF8 +2448 +0440 +0440 +0440 +0842 +1042 +203E +4000 +ENDCHAR +STARTCHAR U+5156 +ENCODING 20822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0820 +1218 +220C +4444 +0820 +1FF0 +0490 +0480 +0480 +0484 +0884 +107C +6000 +ENDCHAR +STARTCHAR U+5157 +ENCODING 20823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0000 +0810 +0C30 +0420 +1FF8 +1008 +1008 +1FF8 +0420 +0C20 +1821 +3033 +E01E +ENDCHAR +STARTCHAR U+5158 +ENCODING 20824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C20 +0060 +0044 +00C4 +FE9E +29F2 +2800 +28FC +2884 +2884 +2884 +68FC +4801 +CC03 +87FE +ENDCHAR +STARTCHAR U+5159 +ENCODING 20825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FF10 +0810 +7F7E +4110 +4110 +4110 +7F10 +3412 +2412 +6412 +4412 +C402 +87FE +0000 +ENDCHAR +STARTCHAR U+515A +ENCODING 20826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +0920 +3FFC +2008 +4FE0 +0820 +0820 +0FE0 +0280 +0280 +0484 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+515B +ENCODING 20827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0808 +FF90 +0830 +7F50 +4110 +41FE +4110 +7F10 +1410 +3410 +6412 +4412 +C402 +87FE +0000 +ENDCHAR +STARTCHAR U+515C +ENCODING 20828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0900 +37F8 +2448 +27C8 +2448 +37D8 +2008 +0480 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+515D +ENCODING 20829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0838 +0808 +FF48 +0848 +0984 +7F02 +4178 +4128 +4128 +7F28 +1448 +348A +653A +C402 +87FE +0000 +ENDCHAR +STARTCHAR U+515E +ENCODING 20830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +FFF0 +0820 +7FFC +4120 +4120 +41FE +7F20 +1422 +3422 +2422 +643E +C402 +87FE +0000 +ENDCHAR +STARTCHAR U+515F +ENCODING 20831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +5050 +5050 +FEFE +9090 +1010 +1010 +FEFF +2848 +2848 +2848 +2848 +6AC8 +4C89 +C989 +8307 +ENDCHAR +STARTCHAR U+5161 +ENCODING 20833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FC +0810 +FF20 +0840 +7F7C +4144 +4144 +4144 +7F7C +1444 +3444 +3446 +647E +C402 +87FE +0000 +ENDCHAR +STARTCHAR U+5162 +ENCODING 20834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +0820 +3EF8 +2288 +2288 +3EF8 +1450 +1450 +1550 +2694 +2C94 +410C +0000 +ENDCHAR +STARTCHAR U+5163 +ENCODING 20835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1080 +FEBE +10AA +FEBE +82AA +82BE +8288 +FE88 +28FE +2908 +6A7E +4802 +C802 +8FFE +0000 +ENDCHAR +STARTCHAR U+5164 +ENCODING 20836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FE +9528 +557C +5528 +11FE +FF10 +297C +2954 +297C +2954 +297C +6A29 +48C5 +CC01 +87FF +ENDCHAR +STARTCHAR U+5165 +ENCODING 20837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0F00 +0100 +0100 +0100 +0100 +0100 +0380 +0280 +0440 +0440 +0820 +1010 +2008 +4004 +0000 +ENDCHAR +STARTCHAR U+5166 +ENCODING 20838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +47C0 +4040 +4040 +4040 +4040 +40E0 +40A0 +41B0 +4110 +4318 +460C +4C06 +6000 +3FFF +0000 +ENDCHAR +STARTCHAR U+5167 +ENCODING 20839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0080 +3FFE +2082 +2082 +2082 +2142 +2222 +2412 +380E +2002 +2002 +2002 +2002 +200E +ENDCHAR +STARTCHAR U+5168 +ENCODING 20840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1830 +600C +1FF0 +0100 +0100 +0FE0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5169 +ENCODING 20841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +3FF8 +2108 +2D68 +2528 +2528 +2B58 +3398 +2108 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+516A +ENCODING 20842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0700 +0280 +0440 +1830 +6FEC +0000 +3E48 +2248 +3A90 +2720 +3A90 +2690 +2248 +2648 +0000 +ENDCHAR +STARTCHAR U+516B +ENCODING 20843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07C0 +0040 +0040 +0440 +0440 +0440 +0440 +0820 +0820 +0820 +1010 +1010 +2008 +4004 +0000 +ENDCHAR +STARTCHAR U+516C +ENCODING 20844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +0440 +0420 +0820 +0810 +1108 +2104 +4100 +0240 +0220 +0210 +0470 +3F88 +0008 +0000 +ENDCHAR +STARTCHAR U+516D +ENCODING 20845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0000 +0000 +0440 +0420 +0810 +0810 +1008 +2008 +4008 +0000 +0000 +ENDCHAR +STARTCHAR U+516E +ENCODING 20846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +0440 +0820 +1010 +6FEC +0400 +0400 +07E0 +0820 +0820 +0020 +0040 +0040 +0180 +0000 +ENDCHAR +STARTCHAR U+5170 +ENCODING 20848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0820 +0448 +7FFC +0000 +0000 +0000 +0010 +3FF8 +0000 +0000 +0000 +0000 +0004 +FFFE +0000 +ENDCHAR +STARTCHAR U+5171 +ENCODING 20849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0440 +0440 +3FF8 +0440 +0440 +0440 +7FFC +0000 +0440 +0420 +0810 +3010 +0000 +ENDCHAR +STARTCHAR U+5173 +ENCODING 20851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0818 +0420 +0448 +7FFC +0100 +0100 +0104 +FFFE +0100 +0280 +0280 +0440 +0830 +300E +C004 +ENDCHAR +STARTCHAR U+5174 +ENCODING 20852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0208 +2108 +1110 +1910 +0920 +0020 +0044 +FFFE +0000 +0000 +0440 +0C20 +1018 +200C +4004 +ENDCHAR +STARTCHAR U+5175 +ENCODING 20853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00E0 +0F00 +0800 +0800 +0FF8 +0840 +0840 +0840 +0840 +7FFC +0000 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+5176 +ENCODING 20854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +3FF8 +0440 +07C0 +0440 +07C0 +0440 +0440 +7FFC +0000 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+5177 +ENCODING 20855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0000 +7FFC +0460 +1810 +6008 +0000 +ENDCHAR +STARTCHAR U+5178 +ENCODING 20856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +0280 +0280 +1FF0 +1290 +1290 +1FF0 +1290 +1290 +7FFC +0000 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+5179 +ENCODING 20857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0C30 +0440 +0004 +FFFE +1020 +1020 +2244 +2448 +78F0 +0810 +1020 +1428 +2244 +7EFC +0204 +ENDCHAR +STARTCHAR U+517B +ENCODING 20859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0440 +0288 +7FFC +0100 +3FF8 +0100 +FFFE +0440 +0830 +344E +C444 +0440 +0440 +0840 +1040 +ENDCHAR +STARTCHAR U+517C +ENCODING 20860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +7FFC +0480 +3FF0 +0490 +7FFC +0490 +3FF0 +04C0 +1CB0 +648C +0480 +0480 +0000 +ENDCHAR +STARTCHAR U+517D +ENCODING 20861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0448 +3FFC +2108 +3FF8 +2108 +3FF8 +0000 +FFFE +0010 +1FF8 +1010 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+517E +ENCODING 20862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3004 +180C +0818 +0010 +3FFC +2104 +3FFC +2104 +3FFC +0420 +7FFE +0420 +FFFF +0810 +381C +E007 +ENDCHAR +STARTCHAR U+5180 +ENCODING 20864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0448 +3C70 +0444 +1FFC +6920 +0FE0 +0920 +0FE0 +0440 +3FF8 +0440 +7FFC +0820 +3010 +0000 +ENDCHAR +STARTCHAR U+5181 +ENCODING 20865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4404 +25FE +2904 +7D04 +55FC +5548 +7DFC +5548 +5548 +7DFE +12A4 +FEA8 +1290 +1488 +18C6 +1080 +ENDCHAR +STARTCHAR U+5182 +ENCODING 20866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+5183 +ENCODING 20867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4002 +4002 +5FFA +4002 +4002 +4002 +5FFA +4002 +4002 +4002 +4002 +4002 +400E +ENDCHAR +STARTCHAR U+5184 +ENCODING 20868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1008 +1008 +7FFE +1008 +1008 +1008 +7FFE +1008 +1008 +1008 +1008 +1008 +1038 +ENDCHAR +STARTCHAR U+5185 +ENCODING 20869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +3FF8 +2108 +2108 +2288 +2248 +2428 +2828 +2008 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+5186 +ENCODING 20870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2108 +2108 +2108 +2108 +3FF8 +2008 +2008 +2008 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+5187 +ENCODING 20871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0102 +7FFF +0200 +0400 +0FFC +1404 +2404 +0404 +0404 +0404 +0404 +0814 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+5188 +ENCODING 20872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4004 +4004 +4824 +4464 +4284 +4104 +4284 +4464 +4834 +5014 +4004 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+5189 +ENCODING 20873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +7FFC +1010 +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+518A +ENCODING 20874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1290 +1290 +1290 +1290 +1290 +7FFC +1290 +1290 +1290 +1290 +1290 +1030 +0000 +ENDCHAR +STARTCHAR U+518B +ENCODING 20875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4002 +4002 +47E2 +4422 +4422 +4422 +4422 +47E2 +4002 +4002 +4002 +4002 +400E +ENDCHAR +STARTCHAR U+518C +ENCODING 20876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1E78 +1248 +1248 +1248 +1248 +7FFC +1248 +1248 +1248 +1248 +2288 +2288 +4718 +0000 +ENDCHAR +STARTCHAR U+518D +ENCODING 20877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +7FFC +1010 +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+518E +ENCODING 20878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1008 +11F8 +1108 +1108 +1108 +7FFE +4002 +4002 +4002 +4002 +4002 +4002 +400E +ENDCHAR +STARTCHAR U+518F +ENCODING 20879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +2488 +2898 +2878 +3008 +27C8 +2448 +2448 +2448 +27C8 +2448 +2018 +0000 +ENDCHAR +STARTCHAR U+5190 +ENCODING 20880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +3FE8 +2008 +3FE8 +2008 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+5191 +ENCODING 20881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +2108 +3FF8 +2108 +3FF8 +0000 +1FF0 +1010 +17D0 +1010 +17D0 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+5192 +ENCODING 20882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +3FF8 +2008 +3FF8 +2FE8 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5193 +ENCODING 20883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0440 +1FF0 +0440 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +7FFC +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+5194 +ENCODING 20884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1004 +1FFC +1004 +1FFC +0000 +7CFE +4410 +4410 +45FF +7C10 +4410 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5195 +ENCODING 20885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +07C0 +1880 +7FF0 +1110 +1FF0 +0284 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+5196 +ENCODING 20886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +1FFC +1004 +2008 +4000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+5197 +ENCODING 20887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2010 +4000 +0780 +0480 +0480 +0480 +0480 +0880 +0880 +1088 +2088 +4078 +0000 +ENDCHAR +STARTCHAR U+5198 +ENCODING 20888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +7FFE +4102 +4102 +4102 +0380 +0280 +0280 +0680 +0480 +0C80 +1881 +30C3 +E07E +ENDCHAR +STARTCHAR U+5199 +ENCODING 20889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2408 +4400 +07F0 +0400 +07C0 +0440 +0040 +7FFC +0040 +0040 +0080 +0300 +0000 +ENDCHAR +STARTCHAR U+519B +ENCODING 20891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4202 +8214 +3FF8 +0400 +0900 +1110 +3FF8 +0100 +0104 +FFFE +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+519C +ENCODING 20892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4102 +8104 +0200 +0208 +0518 +0920 +18C0 +2880 +4840 +8830 +0A0E +0C04 +0800 +ENDCHAR +STARTCHAR U+519D +ENCODING 20893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4002 +4FF2 +0810 +0810 +0FF0 +0810 +0810 +0FF0 +0810 +0810 +0810 +FFFF +0000 +ENDCHAR +STARTCHAR U+519E +ENCODING 20894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +4001 +4081 +1084 +0C98 +0080 +3FFE +0080 +02A0 +0490 +0888 +1084 +2082 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+51A0 +ENCODING 20896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2008 +7E10 +0010 +01FC +7F10 +1490 +1490 +1410 +1410 +2434 +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+51A1 +ENCODING 20897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +5FFA +0000 +7FFE +0200 +0D06 +718C +0698 +1CC0 +71E0 +06B0 +1C9C +F187 +0700 +ENDCHAR +STARTCHAR U+51A2 +ENCODING 20898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2008 +5FF8 +0200 +0648 +1948 +6B50 +0CA0 +35A0 +0690 +0C88 +3084 +0300 +0000 +ENDCHAR +STARTCHAR U+51A3 +ENCODING 20899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4002 +3F00 +12FC +1244 +1E44 +126C +1228 +1E38 +1210 +1238 +1E2C +3266 +02C3 +ENDCHAR +STARTCHAR U+51A4 +ENCODING 20900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2208 +47C0 +1880 +7FF0 +1110 +1110 +1FF0 +1310 +0340 +0524 +1924 +60FC +0000 +ENDCHAR +STARTCHAR U+51A5 +ENCODING 20901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2008 +4FE0 +0820 +0FE0 +0820 +0FE0 +0100 +7FFC +0000 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+51A6 +ENCODING 20902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2048 +5E40 +007C +0040 +7FF8 +1488 +1450 +1430 +1468 +258C +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+51A8 +ENCODING 20904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2008 +5FF0 +0FE0 +0820 +0FE0 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+51A9 +ENCODING 20905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2208 +5CF0 +1010 +1EF0 +1010 +1FF0 +0400 +1FF8 +6A48 +2528 +2528 +4030 +0000 +ENDCHAR +STARTCHAR U+51AA +ENCODING 20906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2448 +7FF8 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +0920 +1FF0 +692C +0960 +0000 +ENDCHAR +STARTCHAR U+51AB +ENCODING 20907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0400 +0200 +0100 +0100 +0000 +0000 +0000 +0080 +0100 +0200 +0200 +0400 +0400 +0000 +ENDCHAR +STARTCHAR U+51AC +ENCODING 20908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +03F0 +0C20 +3240 +0180 +0340 +0C30 +730C +0080 +0000 +0700 +00C0 +0020 +0000 +ENDCHAR +STARTCHAR U+51AD +ENCODING 20909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0240 +0660 +0C30 +1818 +338C +E0E7 +0000 +0000 +0070 +01C0 +0700 +0C00 +ENDCHAR +STARTCHAR U+51AF +ENCODING 20911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +47F8 +3010 +1210 +0210 +0A10 +1210 +1214 +23FE +E004 +2024 +2FF4 +2004 +2004 +2028 +2010 +ENDCHAR +STARTCHAR U+51B0 +ENCODING 20912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +2040 +1044 +17E4 +00E8 +00F0 +1160 +1150 +2250 +2448 +4844 +4040 +00C0 +0000 +ENDCHAR +STARTCHAR U+51B1 +ENCODING 20913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FFC +2200 +1200 +13F0 +0210 +0210 +1210 +13F0 +2210 +2010 +4010 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+51B2 +ENCODING 20914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +2040 +13F8 +1248 +0248 +0248 +1248 +13F8 +2248 +2040 +4040 +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+51B3 +ENCODING 20915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +2080 +17F0 +1090 +0090 +0090 +1FFC +10C0 +2120 +2120 +4210 +4408 +0804 +0000 +ENDCHAR +STARTCHAR U+51B4 +ENCODING 20916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +2110 +1110 +1110 +0110 +0FFC +1030 +1030 +2050 +2090 +4310 +4C10 +0030 +0000 +ENDCHAR +STARTCHAR U+51B5 +ENCODING 20917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +2208 +1208 +1208 +03F8 +02A8 +10A0 +10A0 +2120 +2120 +4224 +4424 +081C +0000 +ENDCHAR +STARTCHAR U+51B6 +ENCODING 20918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +2080 +10A0 +1110 +0138 +07C4 +1000 +13F8 +2208 +2208 +4208 +43F8 +0208 +0000 +ENDCHAR +STARTCHAR U+51B7 +ENCODING 20919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +2140 +1120 +1210 +05E8 +0804 +17F8 +1088 +2088 +2088 +40F0 +4080 +0080 +0000 +ENDCHAR +STARTCHAR U+51B8 +ENCODING 20920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6222 +3326 +1124 +0020 +03FE +0020 +0020 +1020 +17FF +3020 +2020 +6020 +4020 +C020 +0020 +ENDCHAR +STARTCHAR U+51B9 +ENCODING 20921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4024 +3022 +13FF +0040 +0042 +0482 +0902 +7244 +1428 +1010 +1028 +1044 +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+51BA +ENCODING 20922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FE +3202 +1202 +0202 +03FE +0210 +0210 +13FF +1210 +3210 +2218 +6208 +42CD +C387 +0E02 +ENDCHAR +STARTCHAR U+51BB +ENCODING 20923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4048 +23FC +1080 +1080 +0120 +0124 +0BFE +1020 +60A0 +20A8 +2124 +2222 +2422 +20A0 +0040 +ENDCHAR +STARTCHAR U+51BC +ENCODING 20924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4240 +2248 +13FC +1240 +0440 +0044 +17FE +2120 +2120 +E120 +2120 +2222 +2222 +241E +0800 +ENDCHAR +STARTCHAR U+51BD +ENCODING 20925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0FC8 +2228 +1228 +13A8 +04A8 +04A8 +1AA8 +1328 +2128 +2228 +4208 +4408 +0818 +0000 +ENDCHAR +STARTCHAR U+51BE +ENCODING 20926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6070 +3050 +10D8 +018C +0306 +06FB +0000 +1000 +11FC +3104 +2104 +6104 +4104 +C104 +01FC +ENDCHAR +STARTCHAR U+51BF +ENCODING 20927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +63FE +3022 +1022 +07FF +0022 +0022 +03FE +1020 +1020 +33FE +2020 +6020 +47FF +C020 +0020 +ENDCHAR +STARTCHAR U+51C0 +ENCODING 20928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +83F0 +6420 +2848 +07FC +1088 +2088 +3FFE +E088 +2088 +2FF8 +2088 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U+51C2 +ENCODING 20930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +60FC +3188 +1318 +0610 +03FE +0222 +0222 +1222 +13FE +3090 +2090 +6190 +4111 +C313 +0E0E +ENDCHAR +STARTCHAR U+51C4 +ENCODING 20932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4080 +23F0 +2090 +0FFC +0090 +13F0 +1080 +2FFC +2120 +43E0 +40D0 +0F08 +0000 +ENDCHAR +STARTCHAR U+51C5 +ENCODING 20933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F8 +2488 +1488 +17F8 +0488 +0488 +15E8 +1528 +2528 +25E8 +4408 +47F8 +0408 +0000 +ENDCHAR +STARTCHAR U+51C6 +ENCODING 20934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +2220 +13FC +1620 +0620 +0BF8 +1220 +1220 +23F8 +2220 +4220 +43FC +0200 +0000 +ENDCHAR +STARTCHAR U+51C7 +ENCODING 20935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4228 +2228 +2228 +1FC4 +0244 +2692 +2710 +2A90 +4AA0 +D220 +4248 +4244 +42FE +4202 +0200 +ENDCHAR +STARTCHAR U+51C8 +ENCODING 20936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +603C +33E2 +1126 +0094 +03FE +0022 +0022 +17FF +1022 +3022 +23FE +6020 +4020 +C020 +00E0 +ENDCHAR +STARTCHAR U+51C9 +ENCODING 20937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +27FC +1000 +13F8 +0208 +0208 +13F8 +1040 +2250 +2248 +4444 +4844 +00C0 +0000 +ENDCHAR +STARTCHAR U+51CA +ENCODING 20938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +43FE +3020 +11FC +1020 +07FF +0000 +09FE +1102 +71FE +1102 +11FE +1102 +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+51CB +ENCODING 20939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F8 +4488 +2488 +27E8 +0488 +17F8 +1408 +25E8 +2528 +45E8 +4928 +0808 +1018 +0000 +ENDCHAR +STARTCHAR U+51CC +ENCODING 20940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +23F8 +1040 +17FC +00A0 +1124 +169C +20F0 +2110 +46A0 +4040 +01B0 +0E0C +0000 +ENDCHAR +STARTCHAR U+51CD +ENCODING 20941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +27FC +1040 +13F8 +0248 +0BF8 +0A48 +13F8 +10E0 +2150 +2248 +2C44 +0040 +0000 +ENDCHAR +STARTCHAR U+51CE +ENCODING 20942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0070 +4088 +2104 +3202 +1401 +01FC +0420 +0820 +13FE +7020 +1222 +1124 +10A8 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+51CF +ENCODING 20943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4018 +3014 +17FE +0410 +0410 +0DD0 +1414 +25D4 +E554 +2554 +2558 +25D0 +252A +0846 +1082 +ENDCHAR +STARTCHAR U+51D0 +ENCODING 20944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +01FF +4028 +3028 +19FF +0129 +0129 +05FF +0810 +7010 +10FE +1010 +1010 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+51D1 +ENCODING 20945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4088 +2FFC +2080 +07F8 +0100 +0FFC +1220 +2410 +EBEE +3084 +27F0 +2080 +2140 +2230 +2410 +ENDCHAR +STARTCHAR U+51D2 +ENCODING 20946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6222 +3222 +13FE +0000 +07FF +0000 +01FC +1104 +1104 +31FC +2088 +60D8 +4050 +C7FF +0000 +ENDCHAR +STARTCHAR U+51D3 +ENCODING 20947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3090 +1090 +03FE +0292 +0292 +03FE +1020 +17FF +30A8 +21AC +6124 +4326 +C623 +0020 +ENDCHAR +STARTCHAR U+51D4 +ENCODING 20948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4050 +3088 +1124 +03FE +0505 +01FC +1104 +61FC +2200 +25FE +2902 +2102 +21FE +0000 +0000 +ENDCHAR +STARTCHAR U+51D5 +ENCODING 20949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3401 +15FD +0104 +0104 +01FC +0104 +1104 +11FC +3020 +27FF +6000 +4088 +C18C +0707 +ENDCHAR +STARTCHAR U+51D6 +ENCODING 20950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +2120 +13F8 +1240 +07F0 +1A40 +13F0 +2240 +23F8 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+51D7 +ENCODING 20951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4111 +6111 +21FF +1050 +0888 +01FF +0288 +08FE +1088 +60FE +2088 +2088 +20FF +0000 +0000 +ENDCHAR +STARTCHAR U+51D8 +ENCODING 20952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0482 +C48E +6FD8 +2490 +0490 +079F +0494 +0494 +2794 +2494 +2494 +6FD4 +4514 +4594 +CCA4 +0804 +ENDCHAR +STARTCHAR U+51DB +ENCODING 20955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +07FC +2000 +13F8 +12E8 +02A8 +02E8 +13F8 +11F0 +2000 +27FC +4150 +4248 +0448 +0000 +ENDCHAR +STARTCHAR U+51DC +ENCODING 20956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +07FC +2000 +13F8 +12E8 +02A8 +02E8 +13F8 +11F0 +2040 +27FC +4150 +4248 +0448 +0000 +ENDCHAR +STARTCHAR U+51DD +ENCODING 20957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +4E08 +28B0 +2790 +047C +1798 +1A50 +225C +3FD0 +4650 +4570 +4890 +110C +0000 +ENDCHAR +STARTCHAR U+51DE +ENCODING 20958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +27DE +0492 +05D2 +1552 +155E +1550 +25D0 +2490 +4491 +47DF +0400 +0000 +2422 +2211 +4211 +ENDCHAR +STARTCHAR U+51E0 +ENCODING 20960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07C0 +0440 +0440 +0440 +0440 +0440 +0440 +0440 +0840 +0840 +1044 +2044 +403C +0000 +ENDCHAR +STARTCHAR U+51E1 +ENCODING 20961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FC0 +0840 +0840 +0840 +0A40 +0940 +0940 +0940 +0840 +1040 +1044 +2044 +403C +0000 +ENDCHAR +STARTCHAR U+51E2 +ENCODING 20962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0180 +0100 +0FE0 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +1820 +1021 +3033 +E01E +ENDCHAR +STARTCHAR U+51E4 +ENCODING 20964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +2010 +2010 +2FF0 +2050 +2850 +2490 +2290 +2110 +2290 +24D0 +2850 +2012 +400A +8006 +ENDCHAR +STARTCHAR U+51E5 +ENCODING 20965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +2002 +2002 +3FFE +2000 +23F0 +2210 +2210 +2210 +2210 +2210 +6210 +4611 +CC1B +180E +ENDCHAR +STARTCHAR U+51E6 +ENCODING 20966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F0 +0890 +0E90 +1290 +1290 +3290 +4A90 +0C90 +0494 +0D14 +120C +2180 +407C +0000 +ENDCHAR +STARTCHAR U+51E7 +ENCODING 20967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +17D0 +1550 +1550 +1550 +1550 +1550 +15D4 +210C +210C +4104 +0000 +ENDCHAR +STARTCHAR U+51E9 +ENCODING 20969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1110 +1FF0 +1110 +1390 +1350 +1550 +1534 +292C +310C +4104 +0000 +ENDCHAR +STARTCHAR U+51EA +ENCODING 20970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1110 +1110 +1510 +15D0 +1510 +1510 +1510 +1514 +3FEC +200C +4004 +0000 +ENDCHAR +STARTCHAR U+51EB +ENCODING 20971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0420 +3FF0 +2020 +2420 +22A0 +2048 +3FFC +0008 +0FA8 +0890 +0880 +0880 +1082 +2082 +C07E +ENDCHAR +STARTCHAR U+51ED +ENCODING 20973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +0BE0 +1040 +17FC +3040 +5040 +13F8 +1000 +07C0 +0440 +0440 +0844 +1044 +203C +0000 +ENDCHAR +STARTCHAR U+51EE +ENCODING 20974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FF8 +2008 +2008 +27E8 +2108 +2208 +27E8 +2428 +2428 +27E8 +2428 +242C +6425 +47E7 +C002 +ENDCHAR +STARTCHAR U+51EF +ENCODING 20975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +497C +4948 +4948 +7F48 +0248 +FF48 +0248 +0248 +7E48 +4248 +4048 +468A +588A +6106 +0200 +ENDCHAR +STARTCHAR U+51F0 +ENCODING 20976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +17D0 +1450 +17D0 +1450 +17D0 +1010 +1FF0 +1114 +27CC +210C +4FE4 +0000 +ENDCHAR +STARTCHAR U+51F1 +ENCODING 20977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +2AF0 +2A90 +3E90 +0090 +7E90 +0090 +3E90 +2290 +3E90 +2490 +1494 +1F14 +620C +0000 +ENDCHAR +STARTCHAR U+51F2 +ENCODING 20978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFC +2004 +2124 +2244 +2FF4 +2284 +27E4 +22A4 +2FF4 +22A4 +27E4 +22C4 +26A4 +6EB5 +4A97 +C002 +ENDCHAR +STARTCHAR U+51F3 +ENCODING 20979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E90 +12A0 +0C48 +0FF0 +1010 +2FEE +C824 +0FE0 +0448 +7FFC +0040 +07E0 +0440 +0444 +0844 +303C +ENDCHAR +STARTCHAR U+51F4 +ENCODING 20980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +63FE +3220 +13FC +0220 +03FC +1220 +33FF +6009 +C525 +0893 +0000 +0FE0 +0820 +1821 +3033 +E01E +ENDCHAR +STARTCHAR U+51F5 +ENCODING 20981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+51F6 +ENCODING 20982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +4048 +5888 +4688 +4108 +4188 +4248 +4428 +4828 +5008 +7FF8 +4008 +4008 +0000 +ENDCHAR +STARTCHAR U+51F7 +ENCODING 20983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +4102 +4102 +4102 +4FF2 +4102 +4102 +4102 +4102 +4102 +5FFA +4002 +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+51F8 +ENCODING 20984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07C0 +0440 +0440 +0440 +0440 +3C78 +2448 +2008 +2008 +2008 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+51F9 +ENCODING 20985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3C78 +2448 +2448 +2448 +2448 +2448 +27C8 +2448 +2008 +2008 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+51FA +ENCODING 20986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1110 +1110 +1FF0 +1110 +2108 +2108 +2108 +2108 +3FF8 +2008 +2008 +0000 +ENDCHAR +STARTCHAR U+51FB +ENCODING 20987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0108 +7FFC +0100 +0100 +0100 +0104 +FFFE +0100 +0100 +2108 +2108 +2108 +3FF8 +2008 +ENDCHAR +STARTCHAR U+51FC +ENCODING 20988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +4114 +4134 +5F44 +4384 +4544 +4544 +4924 +5124 +611C +4504 +4204 +7FFC +0004 +ENDCHAR +STARTCHAR U+51FD +ENCODING 20989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0200 +4208 +4728 +5128 +49C8 +4B48 +4528 +5928 +4308 +4008 +7FF8 +4008 +0000 +ENDCHAR +STARTCHAR U+51FE +ENCODING 20990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FE0 +0040 +4088 +4108 +5DF8 +5598 +5568 +5528 +5D58 +5598 +4108 +4608 +7FF8 +4008 +0000 +ENDCHAR +STARTCHAR U+51FF +ENCODING 20991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +2448 +1450 +0444 +FFFE +0000 +0440 +2288 +2FE8 +2108 +2148 +2FE8 +2108 +2108 +3FF8 +2008 +ENDCHAR +STARTCHAR U+5200 +ENCODING 20992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0108 +0108 +0108 +0108 +0208 +0208 +0208 +0408 +0408 +0808 +1008 +2030 +0000 +ENDCHAR +STARTCHAR U+5201 +ENCODING 20993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +0008 +0008 +0008 +0048 +0088 +0108 +0208 +0408 +0808 +1008 +3008 +0050 +0020 +0000 +ENDCHAR +STARTCHAR U+5202 +ENCODING 20994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0004 +0004 +0024 +0024 +0024 +0024 +0024 +0024 +0024 +0024 +0004 +0004 +0004 +0014 +0008 +ENDCHAR +STARTCHAR U+5203 +ENCODING 20995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0208 +0208 +0208 +0208 +1E08 +0708 +0488 +0848 +0808 +1008 +2008 +4070 +0000 +ENDCHAR +STARTCHAR U+5204 +ENCODING 20996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF0 +0210 +0210 +2210 +1210 +0A10 +0610 +0590 +0470 +081C +1010 +2020 +41C0 +0000 +ENDCHAR +STARTCHAR U+5205 +ENCODING 20997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FF8 +0208 +0208 +0208 +220A +220A +660A +440B +C409 +8C09 +0818 +1810 +3010 +E0F0 +0000 +ENDCHAR +STARTCHAR U+5206 +ENCODING 20998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07C0 +0040 +0840 +0820 +1020 +1010 +3FE8 +4224 +0220 +0220 +0420 +0420 +0820 +10C0 +0000 +ENDCHAR +STARTCHAR U+5207 +ENCODING 20999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1048 +1348 +1C48 +7048 +1048 +1048 +1248 +1288 +0E88 +0108 +0608 +1830 +0000 +ENDCHAR +STARTCHAR U+5208 +ENCODING 21000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +0248 +0248 +2248 +1248 +0C48 +0448 +0648 +0A48 +0948 +1148 +1008 +2008 +4018 +0000 +ENDCHAR +STARTCHAR U+5209 +ENCODING 21001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +0841 +1FE1 +2009 +4009 +1F89 +0089 +0109 +0209 +0409 +0801 +1021 +2025 +1FE2 +0000 +0000 +ENDCHAR +STARTCHAR U+520A +ENCODING 21002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F48 +0848 +0848 +0848 +0848 +7F48 +0848 +0848 +0848 +0848 +0808 +0808 +0818 +0000 +ENDCHAR +STARTCHAR U+520B +ENCODING 21003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +0648 +3C48 +0448 +0448 +0448 +7FC8 +0448 +0448 +0448 +0848 +0808 +1008 +2018 +0000 +ENDCHAR +STARTCHAR U+520C +ENCODING 21004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0201 +0201 +0201 +7F91 +0211 +0211 +2211 +1211 +0A11 +0211 +0201 +0201 +0A0A +0404 +0000 +0000 +ENDCHAR +STARTCHAR U+520D +ENCODING 21005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0820 +0FF0 +1020 +1040 +2088 +5FFC +8008 +0008 +0008 +1FF8 +0008 +0008 +0008 +3FF8 +0008 +ENDCHAR +STARTCHAR U+520E +ENCODING 21006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1028 +1028 +1FA8 +2AA8 +2AA8 +4AA8 +12A8 +14A8 +24A8 +08A8 +1108 +0108 +0618 +0000 +ENDCHAR +STARTCHAR U+5210 +ENCODING 21008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0081 +1FC1 +1089 +1089 +1489 +1289 +7FE9 +1089 +1089 +1081 +1081 +1081 +2285 +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+5211 +ENCODING 21009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3FC8 +1248 +1248 +1248 +1248 +7FC8 +1248 +1248 +1248 +1248 +2208 +2208 +4218 +0000 +ENDCHAR +STARTCHAR U+5212 +ENCODING 21010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1404 +1204 +1024 +13A4 +FC24 +1024 +1024 +1124 +0B24 +0C24 +0824 +1404 +2484 +4294 +0188 +ENDCHAR +STARTCHAR U+5213 +ENCODING 21011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7F92 +0012 +0012 +0012 +0012 +FFD2 +1212 +1212 +1212 +1212 +1202 +3202 +2242 +6242 +C1CE +ENDCHAR +STARTCHAR U+5214 +ENCODING 21012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0848 +0848 +3F48 +0948 +0948 +0948 +7FC8 +0848 +0C48 +1248 +1108 +2108 +4018 +0000 +ENDCHAR +STARTCHAR U+5215 +ENCODING 21013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +0084 +0184 +030C +0E08 +3838 +0000 +FE7F +2211 +2211 +2211 +6231 +4221 +C663 +8C46 +ENDCHAR +STARTCHAR U+5216 +ENCODING 21014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +3F08 +2248 +2248 +2248 +3E48 +2248 +2248 +2248 +3E48 +2248 +2248 +4208 +4208 +8A28 +0410 +ENDCHAR +STARTCHAR U+5217 +ENCODING 21015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F48 +0848 +0848 +0E48 +1248 +1248 +2A48 +4648 +0448 +0448 +0808 +1008 +2018 +0000 +ENDCHAR +STARTCHAR U+5218 +ENCODING 21016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1804 +0924 +FFA4 +0224 +4224 +2224 +1424 +1424 +0824 +0824 +1424 +2204 +4304 +8114 +0008 +ENDCHAR +STARTCHAR U+5219 +ENCODING 21017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +7F84 +4124 +4924 +4924 +4924 +4924 +4924 +4924 +4924 +4924 +4904 +1404 +1204 +2114 +C108 +ENDCHAR +STARTCHAR U+521A +ENCODING 21018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +7F84 +4104 +4124 +6324 +6324 +5524 +5524 +4924 +5524 +5324 +6324 +4104 +4104 +4514 +4208 +ENDCHAR +STARTCHAR U+521B +ENCODING 21019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0804 +1404 +1224 +21A4 +20A4 +7E24 +A224 +2224 +2A24 +2424 +2004 +2104 +2104 +1F14 +0008 +ENDCHAR +STARTCHAR U+521C +ENCODING 21020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1201 +1201 +7FC1 +1249 +1249 +7FC9 +5209 +7FE9 +1229 +1221 +12A1 +2241 +4205 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+521D +ENCODING 21021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0848 +7E48 +0448 +0548 +0948 +1E48 +2A48 +4948 +0888 +0888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+521E +ENCODING 21022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F81 +1081 +1089 +1089 +1F89 +1089 +1089 +1F89 +1089 +1081 +1081 +1089 +7FE5 +0002 +0000 +0000 +ENDCHAR +STARTCHAR U+5220 +ENCODING 21024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7BE4 +4A44 +4A54 +4A54 +4A54 +4A54 +FFF4 +4A54 +4A54 +4A54 +4A54 +4A44 +5A44 +4254 +84C8 +ENDCHAR +STARTCHAR U+5221 +ENCODING 21025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7F81 +4089 +4089 +7F89 +4209 +4209 +7FC9 +4209 +4201 +4201 +4941 +50C5 +6042 +0000 +0000 +ENDCHAR +STARTCHAR U+5222 +ENCODING 21026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +0E09 +1B09 +3189 +60C9 +DF69 +0009 +0009 +7FC9 +0849 +0849 +0841 +0841 +09C1 +0801 +0807 +ENDCHAR +STARTCHAR U+5224 +ENCODING 21028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +4948 +2948 +2A48 +0848 +7F48 +0848 +0848 +7F48 +0848 +0848 +0808 +0808 +0818 +0000 +ENDCHAR +STARTCHAR U+5225 +ENCODING 21029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F48 +2148 +2148 +2148 +3F48 +2948 +0848 +0F48 +0948 +1148 +1108 +2108 +4618 +0000 +ENDCHAR +STARTCHAR U+5227 +ENCODING 21031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0448 +0448 +3F48 +0448 +0448 +7FC8 +0848 +0A48 +0948 +1148 +1F88 +7088 +0018 +0000 +ENDCHAR +STARTCHAR U+5228 +ENCODING 21032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1104 +1FA4 +2124 +2124 +7D24 +A524 +2524 +2524 +3D24 +2524 +2224 +2084 +2084 +1F94 +0008 +ENDCHAR +STARTCHAR U+5229 +ENCODING 21033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +0648 +3C48 +0448 +0448 +7F48 +0C48 +0E48 +1548 +1548 +2448 +4408 +0408 +0418 +0000 +ENDCHAR +STARTCHAR U+522A +ENCODING 21034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3FA8 +2AA8 +2AA8 +2AA8 +2AA8 +7FE8 +2AA8 +2AA8 +2AA8 +2AA8 +2A88 +2A88 +2198 +0000 +ENDCHAR +STARTCHAR U+522B +ENCODING 21035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +3F84 +2104 +2124 +2124 +3F24 +2824 +0924 +FFA4 +0924 +0924 +1124 +1104 +2504 +4214 +0008 +ENDCHAR +STARTCHAR U+522D +ENCODING 21037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7F84 +0104 +0224 +0424 +0B24 +30A4 +C024 +3FA4 +0424 +0424 +0404 +0784 +7C04 +2014 +0008 +ENDCHAR +STARTCHAR U+522E +ENCODING 21038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +0648 +3C48 +0448 +0448 +7FC8 +0448 +0448 +3F48 +2148 +2148 +2108 +3F08 +2018 +0000 +ENDCHAR +STARTCHAR U+5230 +ENCODING 21040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7FC8 +0848 +0C48 +1248 +7D48 +0948 +0848 +7F48 +0848 +0848 +0F08 +7008 +0018 +0000 +ENDCHAR +STARTCHAR U+5231 +ENCODING 21041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2400 +24FE +2412 +FF12 +2452 +2452 +24D2 +FFB3 +24A7 +24A5 +2425 +2424 +2464 +644C +44C8 +C5B8 +ENDCHAR +STARTCHAR U+5232 +ENCODING 21042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +0812 +7F92 +0812 +0812 +0812 +FFD2 +0012 +0812 +0812 +7F92 +0802 +0802 +0802 +FFC2 +000E +ENDCHAR +STARTCHAR U+5233 +ENCODING 21043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0848 +7F48 +1448 +2248 +5D48 +0048 +7F48 +1048 +1E48 +2248 +0208 +0208 +0C18 +0000 +ENDCHAR +STARTCHAR U+5235 +ENCODING 21045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +FF92 +2212 +2212 +3E12 +2212 +2212 +2212 +3E12 +2212 +2212 +2202 +3E02 +E202 +0202 +020E +ENDCHAR +STARTCHAR U+5236 +ENCODING 21046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1408 +1448 +1F48 +2448 +4448 +7FC8 +0448 +3F48 +2548 +2548 +2548 +2648 +2408 +0418 +0000 +ENDCHAR +STARTCHAR U+5237 +ENCODING 21047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F48 +2148 +2148 +3F48 +2448 +2448 +3F48 +3548 +5548 +5548 +1708 +1408 +0418 +0000 +ENDCHAR +STARTCHAR U+5238 +ENCODING 21048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +0920 +3FF8 +0280 +7FFC +0440 +1830 +6FEC +0220 +0220 +0420 +0820 +30C0 +0000 +ENDCHAR +STARTCHAR U+5239 +ENCODING 21049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +0248 +3C48 +0648 +1948 +6448 +0448 +7F48 +0C48 +0E48 +1548 +2508 +4408 +0418 +0000 +ENDCHAR +STARTCHAR U+523A +ENCODING 21050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0448 +7FC8 +0448 +3F48 +2548 +2548 +2748 +0C48 +0E48 +1548 +2508 +4408 +0418 +0000 +ENDCHAR +STARTCHAR U+523B +ENCODING 21051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0408 +7FC8 +0848 +0A48 +3248 +0C48 +0548 +0948 +1248 +2608 +0908 +1108 +6018 +0000 +ENDCHAR +STARTCHAR U+523C +ENCODING 21052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1012 +7C12 +1012 +1012 +1052 +FE32 +2012 +201A +2436 +6623 +4222 +4F66 +F9C4 +819C +ENDCHAR +STARTCHAR U+523D +ENCODING 21053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0804 +1404 +2224 +41A4 +BEA4 +0024 +0224 +7F24 +0824 +0824 +1024 +2204 +7F04 +0114 +0008 +ENDCHAR +STARTCHAR U+523F +ENCODING 21055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +0404 +2484 +24A4 +3FA4 +08A4 +0824 +0FA4 +10A4 +1124 +3124 +4A04 +0404 +0804 +1014 +6008 +ENDCHAR +STARTCHAR U+5240 +ENCODING 21056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0804 +4904 +4924 +7F24 +0024 +7F24 +0124 +0124 +3F24 +2124 +2004 +2184 +2604 +3814 +0008 +ENDCHAR +STARTCHAR U+5241 +ENCODING 21057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +3F04 +2204 +2224 +2224 +2224 +49A4 +0924 +FFA4 +0824 +1C24 +2B24 +4904 +8804 +0814 +0808 +ENDCHAR +STARTCHAR U+5242 +ENCODING 21058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0484 +7FC4 +1124 +0A24 +0424 +0A24 +31A4 +D164 +1124 +1124 +1124 +1104 +2104 +4114 +0008 +ENDCHAR +STARTCHAR U+5243 +ENCODING 21059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2208 +1248 +1448 +7F48 +0948 +7F48 +4848 +7F48 +5948 +1948 +2E48 +4808 +0808 +0818 +0000 +ENDCHAR +STARTCHAR U+5244 +ENCODING 21060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F48 +2A48 +2A48 +5448 +5448 +2A48 +2A48 +0048 +7F48 +0848 +0808 +0F08 +7818 +0000 +ENDCHAR +STARTCHAR U+5245 +ENCODING 21061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +FF92 +0012 +0012 +7F12 +4112 +4112 +4112 +7F12 +0012 +4112 +6302 +2202 +0202 +FF82 +000E +ENDCHAR +STARTCHAR U+5246 +ENCODING 21062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +0402 +3F92 +2092 +3F92 +2092 +3F92 +2012 +2412 +2202 +2302 +2482 +284A +7004 +0000 +0000 +ENDCHAR +STARTCHAR U+5247 +ENCODING 21063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3E48 +2248 +2248 +3E48 +2248 +3E48 +2248 +2248 +3E48 +1448 +1208 +2208 +4018 +0000 +ENDCHAR +STARTCHAR U+5249 +ENCODING 21065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +2489 +2489 +2489 +2489 +5549 +5549 +8E29 +0409 +0409 +7FC9 +0401 +0401 +0401 +FFE1 +0007 +ENDCHAR +STARTCHAR U+524A +ENCODING 21066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +4948 +2948 +2A48 +0848 +3E48 +2248 +3E48 +2248 +3E48 +2248 +2208 +2208 +2618 +0000 +ENDCHAR +STARTCHAR U+524B +ENCODING 21067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0848 +0848 +7F48 +0848 +3E48 +2248 +2248 +3E48 +1448 +1408 +141C +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+524C +ENCODING 21068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0848 +7F48 +0848 +7F48 +4948 +4948 +7F48 +4C48 +1A48 +1948 +2908 +4808 +0818 +0000 +ENDCHAR +STARTCHAR U+524D +ENCODING 21069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +7FFC +0000 +3E48 +2248 +2248 +3E48 +2248 +3E48 +2248 +2208 +2618 +0000 +ENDCHAR +STARTCHAR U+524E +ENCODING 21070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +6302 +1402 +0812 +1412 +6312 +0A12 +FF92 +0A12 +2A12 +2A12 +2A02 +4902 +080A +0804 +0000 +0000 +ENDCHAR +STARTCHAR U+524F +ENCODING 21071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +1200 +15F8 +7E48 +1448 +1548 +14C8 +7F48 +1468 +1458 +148C +2488 +2508 +4630 +0000 +ENDCHAR +STARTCHAR U+5250 +ENCODING 21072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +3FC4 +2084 +2094 +2094 +3F94 +2494 +0414 +7FD4 +4454 +4454 +4A54 +5144 +4044 +4154 +4088 +ENDCHAR +STARTCHAR U+5251 +ENCODING 21073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +0404 +0A04 +1124 +20A4 +4264 +BF24 +0024 +24A4 +14A4 +1524 +1524 +0384 +7C04 +2014 +0008 +ENDCHAR +STARTCHAR U+5252 +ENCODING 21074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1101 +1101 +7FC9 +1109 +1109 +7FC9 +0009 +3F89 +2089 +3F89 +2081 +2081 +3F85 +2082 +0000 +0000 +ENDCHAR +STARTCHAR U+5254 +ENCODING 21076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F48 +2148 +3F48 +2148 +3F48 +1048 +1F48 +2B48 +4B48 +1548 +2508 +0908 +1618 +0000 +ENDCHAR +STARTCHAR U+5255 +ENCODING 21077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0901 +0909 +0909 +79E9 +0909 +0909 +79E9 +0909 +0909 +39E9 +E909 +0901 +0901 +1901 +3101 +6107 +ENDCHAR +STARTCHAR U+5256 +ENCODING 21078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0448 +3FC8 +1148 +0948 +0A48 +7FC8 +0048 +1F48 +1148 +1148 +1108 +1F08 +1118 +0000 +ENDCHAR +STARTCHAR U+5257 +ENCODING 21079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1202 +1112 +1F92 +7812 +0D92 +0612 +1B52 +61D2 +1212 +1112 +1F92 +7802 +0D82 +0602 +1B42 +E1CE +ENDCHAR +STARTCHAR U+5258 +ENCODING 21080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2202 +2212 +FF92 +2212 +2212 +3E12 +2212 +2212 +3E12 +2212 +2212 +FF82 +0002 +2602 +6302 +C18E +ENDCHAR +STARTCHAR U+525A +ENCODING 21082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +0409 +FFE9 +0409 +7FC9 +4449 +7FC9 +0409 +7FC9 +0449 +FFE9 +0441 +7FC1 +0401 +0401 +0C07 +ENDCHAR +STARTCHAR U+525B +ENCODING 21083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3FA8 +32A8 +2AA8 +2CA8 +3FA8 +24A8 +35A8 +35A8 +35A8 +3FA8 +3188 +2088 +2198 +0000 +ENDCHAR +STARTCHAR U+525C +ENCODING 21084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +4404 +7FC4 +4054 +A094 +3BD4 +2A94 +4A94 +6A94 +9394 +1214 +2204 +2244 +4284 +8314 +0008 +ENDCHAR +STARTCHAR U+525D +ENCODING 21085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +0841 +0FC9 +1049 +1089 +2F89 +0209 +7FF9 +0209 +1249 +0A89 +0309 +0689 +1A41 +6221 +0603 +ENDCHAR +STARTCHAR U+525E +ENCODING 21086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0448 +7FC8 +0C48 +1248 +2248 +7FC8 +0148 +3D48 +2548 +2548 +3D08 +2108 +0318 +0000 +ENDCHAR +STARTCHAR U+525F +ENCODING 21087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7BC9 +0849 +6B49 +1089 +2949 +4229 +0009 +7BC9 +0849 +4849 +3281 +1281 +2901 +4A81 +8467 +ENDCHAR +STARTCHAR U+5260 +ENCODING 21088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +0409 +0409 +FFE9 +0009 +3F89 +2089 +2089 +2089 +3F89 +0409 +2481 +2481 +64C1 +C461 +1C07 +ENDCHAR +STARTCHAR U+5261 +ENCODING 21089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +4904 +2904 +2A24 +0824 +1624 +21A4 +C8A4 +0824 +2924 +2A24 +4804 +1604 +2184 +C094 +0008 +ENDCHAR +STARTCHAR U+5262 +ENCODING 21090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0081 +7FC1 +0801 +1C09 +2209 +4549 +0989 +5109 +2389 +5549 +0929 +1501 +2105 +4602 +0000 +0000 +ENDCHAR +STARTCHAR U+5263 +ENCODING 21091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0408 +0A48 +1148 +7FC8 +0448 +3F48 +2548 +3F48 +2448 +0A48 +0908 +1108 +6018 +0000 +ENDCHAR +STARTCHAR U+5264 +ENCODING 21092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0448 +7FC8 +1148 +0E48 +1BC8 +7148 +1F48 +1148 +1F48 +1148 +1108 +2108 +4118 +0000 +ENDCHAR +STARTCHAR U+5265 +ENCODING 21093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3E48 +0248 +3E48 +0248 +7FC8 +0448 +2548 +1548 +1648 +1D48 +6488 +0408 +0C18 +0000 +ENDCHAR +STARTCHAR U+5266 +ENCODING 21094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +0809 +FFF9 +1089 +1489 +2449 +7FE9 +A459 +2449 +3FC9 +2449 +2449 +3FC1 +0411 +0631 +03E7 +ENDCHAR +STARTCHAR U+5267 +ENCODING 21095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +3FC4 +20A4 +20A4 +3FA4 +2424 +2524 +3FA4 +2424 +24A4 +3FE4 +50A4 +5084 +5084 +9F94 +1088 +ENDCHAR +STARTCHAR U+5269 +ENCODING 21097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +3F28 +0428 +7FE8 +1528 +75E8 +1528 +3568 +5CE8 +0E28 +1528 +2488 +4488 +0418 +0000 +ENDCHAR +STARTCHAR U+526A +ENCODING 21098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +7FFC +3E48 +2A48 +3648 +2A48 +2A48 +2618 +0000 +7FF8 +0208 +0C08 +7070 +0000 +ENDCHAR +STARTCHAR U+526B +ENCODING 21099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +0201 +3FE1 +2509 +3FC9 +2509 +2709 +2009 +2F89 +2889 +2501 +2201 +4505 +0882 +0000 +0000 +ENDCHAR +STARTCHAR U+526C +ENCODING 21100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +4441 +4441 +7FC9 +0009 +7FC9 +0809 +1009 +7FC9 +4A49 +4A41 +4A41 +4A45 +4082 +0000 +0000 +ENDCHAR +STARTCHAR U+526D +ENCODING 21101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FC1 +2041 +3FC9 +2009 +2F89 +2409 +2889 +2FC9 +2249 +2209 +2FC1 +4201 +0205 +3FE2 +0000 +0000 +ENDCHAR +STARTCHAR U+526E +ENCODING 21102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7F89 +4089 +4089 +4F89 +4889 +4889 +FFC9 +8049 +9E49 +9249 +9241 +9241 +9E41 +8041 +81C7 +ENDCHAR +STARTCHAR U+526F +ENCODING 21103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F48 +0048 +3E48 +2248 +3E48 +0048 +7F48 +4948 +7F48 +4948 +4908 +7F08 +4118 +0000 +ENDCHAR +STARTCHAR U+5270 +ENCODING 21104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +1E28 +0428 +3FA8 +1528 +7FE8 +1528 +1528 +3FA8 +0E28 +1528 +2508 +4408 +0418 +0000 +ENDCHAR +STARTCHAR U+5271 +ENCODING 21105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1448 +1248 +3E48 +4948 +3EC8 +2A48 +2A68 +3E58 +148C +1288 +2308 +4230 +0000 +ENDCHAR +STARTCHAR U+5272 +ENCODING 21106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +7F48 +4948 +7F48 +0848 +3E48 +0848 +7F48 +0048 +3E48 +2248 +2208 +3E08 +2218 +0000 +ENDCHAR +STARTCHAR U+5273 +ENCODING 21107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1208 +1248 +7FC8 +1248 +1448 +0A48 +1148 +1FC8 +2048 +5F48 +1148 +1108 +1F08 +1018 +0000 +ENDCHAR +STARTCHAR U+5274 +ENCODING 21108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +2A48 +2A48 +3E48 +0048 +7F48 +0048 +3E48 +2248 +3E48 +2248 +1408 +1E08 +7018 +0000 +ENDCHAR +STARTCHAR U+5275 +ENCODING 21109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0648 +0948 +14C8 +3F48 +5148 +1F48 +1148 +1F48 +1048 +3F48 +3108 +5F08 +1118 +0000 +ENDCHAR +STARTCHAR U+5277 +ENCODING 21111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +0409 +7FC9 +1109 +0E09 +3189 +7FC9 +4009 +5209 +5F89 +5209 +4201 +4F81 +C201 +8201 +3FE7 +ENDCHAR +STARTCHAR U+5278 +ENCODING 21112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +0409 +FFE9 +0409 +7FC9 +4449 +7FC9 +4449 +7FC9 +0489 +1FC9 +F061 +0081 +FFE1 +2081 +1387 +ENDCHAR +STARTCHAR U+5279 +ENCODING 21113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +F792 +1092 +5292 +3192 +5292 +0892 +1C12 +3712 +E1D2 +0812 +7202 +0C82 +7102 +0602 +780E +ENDCHAR +STARTCHAR U+527A +ENCODING 21114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +3E3F +0822 +7F54 +1C08 +2A14 +4923 +3FFF +2000 +27FC +2084 +2084 +4104 +0E0C +0000 +0000 +ENDCHAR +STARTCHAR U+527B +ENCODING 21115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0201 +2221 +2229 +3FE9 +0009 +3DE9 +2529 +2529 +3DE9 +2529 +3DE9 +2521 +2525 +4E62 +0000 +0000 +ENDCHAR +STARTCHAR U+527C +ENCODING 21116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2081 +7F81 +1109 +2A49 +7FC9 +0A09 +1509 +2889 +5449 +2A09 +1401 +0805 +7002 +0000 +0000 +ENDCHAR +STARTCHAR U+527D +ENCODING 21117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F48 +1448 +7F48 +5548 +7F48 +0048 +3E48 +0048 +7F48 +2A48 +2908 +4908 +1818 +0000 +ENDCHAR +STARTCHAR U+527F +ENCODING 21119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2488 +4928 +24A8 +3FA8 +24A8 +3FA8 +24A8 +3FA8 +0428 +7FE8 +0E28 +1508 +6488 +0418 +0000 +ENDCHAR +STARTCHAR U+5280 +ENCODING 21120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7F81 +1109 +0A09 +FFC9 +1489 +2509 +4C09 +FFC9 +9249 +A249 +DFC1 +9241 +9241 +9E41 +8047 +ENDCHAR +STARTCHAR U+5281 +ENCODING 21121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +2504 +3F84 +2424 +2524 +7FA4 +A424 +2524 +3FA4 +2424 +2524 +3F84 +2004 +5484 +4A54 +8A48 +ENDCHAR +STARTCHAR U+5282 +ENCODING 21122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0022 +7FF2 +4002 +514A +4A4A +7F7A +449A +550A +554A +554A +5F4A +444A +44A2 +4892 +9116 +2202 +ENDCHAR +STARTCHAR U+5283 +ENCODING 21123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +3F48 +0948 +7FC8 +0948 +3F48 +3F48 +7FC8 +3F48 +2948 +3F48 +3F08 +0708 +7818 +0000 +ENDCHAR +STARTCHAR U+5284 +ENCODING 21124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2102 +39C2 +5282 +0412 +0A12 +1112 +2092 +5F52 +0012 +3F82 +2082 +2082 +3F8A +2084 +0000 +0000 +ENDCHAR +STARTCHAR U+5285 +ENCODING 21125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7FE5 +4925 +4925 +7FE5 +1005 +3FF5 +6415 +FF95 +2495 +2495 +3F91 +0511 +1FB1 +70A1 +0063 +ENDCHAR +STARTCHAR U+5287 +ENCODING 21127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +07A8 +3FE8 +26A8 +3BA8 +3FA8 +26A8 +3CA8 +2728 +3B28 +26A8 +3A88 +4208 +0C18 +0000 +ENDCHAR +STARTCHAR U+5288 +ENCODING 21128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +22F8 +3E50 +21FC +3E20 +32F8 +5E20 +1020 +3FF8 +0108 +0208 +0C08 +3070 +0000 +ENDCHAR +STARTCHAR U+5289 +ENCODING 21129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0804 +37A4 +32A4 +2AA4 +3CA4 +65A4 +0A24 +1F24 +64A4 +3FA4 +1524 +0E04 +0784 +780C +0000 +ENDCHAR +STARTCHAR U+528A +ENCODING 21130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +0A09 +3189 +EEE9 +0009 +7FC9 +4449 +5549 +4449 +7FC9 +0009 +3F81 +2081 +3F81 +2081 +3F87 +ENDCHAR +STARTCHAR U+528B +ENCODING 21131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0F81 +0881 +0F89 +0009 +3DE9 +2529 +3DE9 +0209 +7FF9 +0A81 +1241 +2221 +0205 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+528C +ENCODING 21132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0201 +13E5 +1205 +7FF5 +00A5 +0095 +7FF5 +4045 +5F45 +4445 +5555 +75E1 +4641 +58D1 +4151 +8633 +ENDCHAR +STARTCHAR U+528D +ENCODING 21133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0448 +0A48 +1148 +3F48 +4048 +3F48 +2D48 +3F48 +1248 +1A48 +1508 +2488 +4898 +0000 +ENDCHAR +STARTCHAR U+5290 +ENCODING 21136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +7FC4 +1104 +1224 +3FA4 +5224 +1FA4 +1224 +13A4 +1024 +3FA4 +1104 +0A04 +0404 +1B14 +6088 +ENDCHAR +STARTCHAR U+5291 +ENCODING 21137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +7FE8 +0AA8 +7F28 +2EA8 +2EE8 +3F68 +5128 +1F28 +1128 +1F28 +1108 +2108 +4118 +0000 +ENDCHAR +STARTCHAR U+5292 +ENCODING 21138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +04F8 +0A28 +1128 +3F68 +4068 +3FA8 +2DA8 +3F28 +1228 +1248 +2D48 +2588 +4930 +0000 +ENDCHAR +STARTCHAR U+5293 +ENCODING 21139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +3F84 +2884 +2494 +3F94 +0014 +7FD4 +4454 +7FD4 +4454 +7FD4 +0004 +FFC4 +1104 +1114 +2108 +ENDCHAR +STARTCHAR U+5294 +ENCODING 21140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +04F8 +0A28 +11A8 +3FA8 +4068 +3F68 +2D28 +3F38 +1228 +124C +2D48 +2588 +4930 +0000 +ENDCHAR +STARTCHAR U+5295 +ENCODING 21141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C31 +79E5 +4105 +7DF5 +5145 +9245 +0005 +3FC5 +2045 +3FC5 +2045 +3FC1 +2041 +3FC1 +1081 +E073 +ENDCHAR +STARTCHAR U+5296 +ENCODING 21142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1E01 +2409 +FF89 +4089 +7F89 +2209 +3B89 +2249 +79C9 +0009 +7F89 +4881 +7F81 +1501 +3441 +63C7 +ENDCHAR +STARTCHAR U+5297 +ENCODING 21143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +5141 +7FF5 +9245 +7DF5 +28A5 +2CA5 +4935 +3FE5 +2025 +3FE5 +2025 +3FE1 +2021 +3FE1 +1041 +6033 +ENDCHAR +STARTCHAR U+5298 +ENCODING 21144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0201 +7FF5 +4845 +7DF5 +4845 +5CE5 +5AD5 +6B55 +4485 +5CE5 +4485 +5CE1 +4481 +DCE1 +8481 +0883 +ENDCHAR +STARTCHAR U+5299 +ENCODING 21145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0F81 +0901 +7FE5 +1485 +2B05 +1685 +0A45 +3625 +1045 +7DF5 +5555 +7DF1 +1451 +7DF7 +0000 +0000 +ENDCHAR +STARTCHAR U+529A +ENCODING 21146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FF1 +4015 +7FF5 +4105 +5D75 +4105 +5FE5 +54A5 +5FF5 +4A15 +7FD5 +5251 +5FD1 +42B1 +87A1 +3CE3 +ENDCHAR +STARTCHAR U+529B +ENCODING 21147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +0200 +7FF8 +0208 +0208 +0208 +0408 +0408 +0808 +1008 +2008 +4030 +0000 +ENDCHAR +STARTCHAR U+529C +ENCODING 21148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1020 +FF20 +1120 +1120 +1120 +1120 +1120 +3120 +2120 +2320 +6221 +4233 +C61E +ENDCHAR +STARTCHAR U+529D +ENCODING 21149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7E40 +0244 +23FE +2244 +1444 +1444 +0844 +1444 +1444 +2284 +4284 +8104 +0228 +0410 +ENDCHAR +STARTCHAR U+529E +ENCODING 21150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +0200 +0220 +3FF0 +0220 +0220 +1230 +322C +2226 +4422 +8420 +0820 +10A0 +2040 +0000 +ENDCHAR +STARTCHAR U+529F +ENCODING 21151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0080 +7C80 +13F8 +1088 +1088 +1088 +1088 +1508 +1908 +6108 +0208 +0430 +0000 +ENDCHAR +STARTCHAR U+52A0 +ENCODING 21152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +087C +7F44 +0944 +0944 +0944 +0944 +0944 +1144 +117C +2144 +4600 +0000 +ENDCHAR +STARTCHAR U+52A1 +ENCODING 21153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +0FF0 +1820 +26C0 +4100 +06C0 +1A30 +E20E +1FF4 +0210 +0210 +0410 +0410 +08A0 +3040 +ENDCHAR +STARTCHAR U+52A2 +ENCODING 21154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0120 +FFA0 +1024 +10FE +1224 +1F24 +1224 +1224 +1224 +1244 +2244 +2244 +4A84 +84A8 +0110 +ENDCHAR +STARTCHAR U+52A3 +ENCODING 21155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0920 +0910 +1128 +2344 +0184 +0680 +7880 +0FF8 +0108 +0208 +0408 +1808 +6030 +0000 +ENDCHAR +STARTCHAR U+52A4 +ENCODING 21156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0308 +3C08 +2008 +2008 +207F +3F89 +2209 +2209 +2209 +2211 +2211 +2211 +2221 +4222 +4242 +428C +ENDCHAR +STARTCHAR U+52A5 +ENCODING 21157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +0808 +FF88 +007F +3E09 +2209 +2209 +2209 +2209 +2209 +2219 +2291 +6333 +4262 +C0CE +ENDCHAR +STARTCHAR U+52A6 +ENCODING 21158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +3FFC +0104 +0304 +060C +1C08 +7038 +0000 +1010 +FF7F +1111 +3131 +2323 +6262 +CECE +ENDCHAR +STARTCHAR U+52A7 +ENCODING 21159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0310 +0E10 +7810 +0810 +08FF +7F11 +0811 +0811 +0811 +FF91 +0811 +0831 +0821 +0863 +08C2 +398E +ENDCHAR +STARTCHAR U+52A8 +ENCODING 21160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C40 +0044 +05FE +FE44 +1044 +1044 +2044 +2444 +4284 +FE84 +4104 +0104 +0228 +0410 +ENDCHAR +STARTCHAR U+52A9 +ENCODING 21161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +27F8 +3C48 +2448 +2448 +3C48 +2448 +2448 +2688 +3888 +6108 +0230 +0000 +ENDCHAR +STARTCHAR U+52AA +ENCODING 21162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +7E88 +1248 +1250 +3C20 +06D0 +190C +6100 +3FF0 +0110 +0210 +0C10 +30E0 +0000 +ENDCHAR +STARTCHAR U+52AB +ENCODING 21163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +3E40 +09F8 +0848 +7F48 +0848 +0C48 +1248 +1688 +7988 +0108 +0230 +0000 +ENDCHAR +STARTCHAR U+52AC +ENCODING 21164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +1E40 +23F8 +2248 +7A48 +2A48 +2A48 +2A48 +3A88 +2288 +0308 +0E30 +0000 +ENDCHAR +STARTCHAR U+52AD +ENCODING 21165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +1240 +1240 +13F8 +2248 +4C48 +0048 +3E48 +2248 +2288 +2288 +3F08 +2230 +0000 +ENDCHAR +STARTCHAR U+52AE +ENCODING 21166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +2408 +2408 +3F08 +247F +4409 +0409 +7F89 +0409 +0409 +0A09 +1111 +20A5 +4042 +0000 +0000 +ENDCHAR +STARTCHAR U+52AF +ENCODING 21167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1010 +1010 +11FF +1011 +3E11 +2211 +6211 +6211 +A231 +2221 +2223 +3E62 +0042 +00CE +ENDCHAR +STARTCHAR U+52B0 +ENCODING 21168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +1020 +7C20 +45FE +4422 +4422 +4422 +7C22 +4422 +4422 +4462 +4442 +7C46 +00C4 +019C +ENDCHAR +STARTCHAR U+52B1 +ENCODING 21169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01A0 +1E20 +1020 +1020 +1FFC +1424 +1424 +1724 +1524 +1524 +1544 +2944 +2984 +5718 +0000 +ENDCHAR +STARTCHAR U+52B2 +ENCODING 21170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FF20 +0220 +0424 +0CFE +1224 +2124 +4024 +FE24 +0824 +0844 +0844 +0F84 +7104 +2228 +0010 +ENDCHAR +STARTCHAR U+52B3 +ENCODING 21171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0448 +7FFC +0440 +0440 +7FFE +4202 +8214 +1FF8 +0410 +0410 +0410 +0810 +0810 +10A0 +2040 +ENDCHAR +STARTCHAR U+52B4 +ENCODING 21172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0910 +0920 +3FFC +2008 +4100 +0100 +3FF0 +0110 +0210 +0210 +0410 +1810 +6060 +0000 +ENDCHAR +STARTCHAR U+52B5 +ENCODING 21173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0920 +0910 +1FF8 +2108 +0280 +7FFC +0640 +0A20 +1FF0 +622C +0420 +0820 +10C0 +0000 +ENDCHAR +STARTCHAR U+52B6 +ENCODING 21174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0310 +0E10 +7810 +4010 +407F +7F91 +4011 +4011 +4011 +5F11 +5111 +5111 +9131 +1123 +1122 +1F66 +ENDCHAR +STARTCHAR U+52B7 +ENCODING 21175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4420 +6C20 +2820 +FE20 +11FE +1022 +7C22 +1022 +1022 +1E22 +F062 +1042 +3046 +20C4 +6084 +C19C +ENDCHAR +STARTCHAR U+52B8 +ENCODING 21176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +7F10 +0810 +087F +FF91 +0011 +0811 +0811 +7F11 +0811 +0831 +0821 +0F23 +3862 +E0CE +ENDCHAR +STARTCHAR U+52B9 +ENCODING 21177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7F40 +14F8 +1248 +2348 +5248 +0C48 +0448 +0A88 +1288 +2108 +4230 +0000 +ENDCHAR +STARTCHAR U+52BA +ENCODING 21178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +3210 +2210 +7F7E +0112 +0812 +4812 +7F12 +8812 +0812 +FFB2 +0822 +0826 +0864 +08CC +ENDCHAR +STARTCHAR U+52BB +ENCODING 21179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7F90 +4010 +4010 +5F7F +4411 +4411 +5F11 +4411 +4411 +4411 +5F11 +4033 +4022 +7FA2 +006E +ENDCHAR +STARTCHAR U+52BC +ENCODING 21180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7F40 +09F8 +0848 +3E48 +0048 +3E48 +2248 +2288 +2288 +3F08 +2230 +0000 +ENDCHAR +STARTCHAR U+52BD +ENCODING 21181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7F92 +0812 +1F12 +3112 +6B12 +0612 +0C02 +3802 +E08E +0080 +7FFE +0102 +0302 +0E06 +781C +ENDCHAR +STARTCHAR U+52BE +ENCODING 21182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +1040 +15F8 +6448 +1848 +0A48 +1248 +2448 +0C88 +1288 +2108 +4230 +0000 +ENDCHAR +STARTCHAR U+52BF +ENCODING 21183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +7DFC +0848 +1C48 +E988 +08CA +292A +1206 +0200 +7FF8 +0208 +0408 +0888 +1050 +6020 +ENDCHAR +STARTCHAR U+52C0 +ENCODING 21184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +FF88 +0808 +087F +7F09 +4109 +4109 +4109 +7F09 +1409 +1409 +341B +2452 +66D2 +C3B6 +ENDCHAR +STARTCHAR U+52C1 +ENCODING 21185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +2A40 +2A40 +55F8 +5448 +2A48 +2A48 +0048 +7F48 +0848 +0888 +0E88 +7930 +0000 +ENDCHAR +STARTCHAR U+52C2 +ENCODING 21186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +2408 +3F88 +243F +4409 +0409 +7FC9 +0009 +3F89 +2089 +2091 +20A1 +3F82 +208C +0000 +0000 +ENDCHAR +STARTCHAR U+52C3 +ENCODING 21187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +3F40 +0840 +3FF8 +2248 +7E48 +0448 +0848 +0E48 +7888 +0888 +0908 +1A30 +0000 +ENDCHAR +STARTCHAR U+52C4 +ENCODING 21188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2008 +7FC8 +4008 +C03F +3F89 +2489 +2489 +2489 +FFC9 +4889 +4889 +4899 +7FD3 +0132 +0F6E +ENDCHAR +STARTCHAR U+52C5 +ENCODING 21189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0840 +3FF8 +2A48 +2A48 +3E48 +1C48 +1A48 +2A88 +4888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+52C6 +ENCODING 21190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +7F10 +4110 +417F +7F11 +4111 +4111 +7F11 +4011 +4211 +4211 +4F31 +7923 +C062 +00CE +ENDCHAR +STARTCHAR U+52C7 +ENCODING 21191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +04C0 +0300 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +7FF8 +0208 +0C08 +7070 +0000 +ENDCHAR +STARTCHAR U+52C8 +ENCODING 21192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FF10 +0210 +2410 +18FF +7F11 +4911 +4911 +7F11 +4911 +4911 +7F11 +4933 +4922 +4922 +4B66 +ENDCHAR +STARTCHAR U+52C9 +ENCODING 21193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1E40 +2440 +7FF8 +2A48 +2A48 +3E48 +2C88 +0C88 +1508 +1634 +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+52CB +ENCODING 21195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +3F20 +2220 +2220 +3E24 +00FE +7F24 +4124 +4924 +4924 +4924 +4924 +4944 +1444 +2394 +C108 +ENDCHAR +STARTCHAR U+52CC +ENCODING 21196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4910 +6B10 +2A10 +7F10 +147F +1411 +FF91 +2211 +2211 +7F11 +C291 +0211 +3E33 +20A2 +21A2 +1F66 +ENDCHAR +STARTCHAR U+52CD +ENCODING 21197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0040 +3FF8 +2248 +2248 +3E48 +0848 +2C48 +2A88 +2A88 +4908 +1A30 +0000 +ENDCHAR +STARTCHAR U+52CF +ENCODING 21199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FF90 +4110 +637F +2211 +2211 +FF91 +0011 +0011 +7F11 +4111 +4133 +4122 +4122 +7F66 +ENDCHAR +STARTCHAR U+52D0 +ENCODING 21200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7F20 +0220 +0424 +7EFE +0424 +1424 +0824 +7F24 +5524 +5544 +5544 +5544 +FF84 +00A8 +0110 +ENDCHAR +STARTCHAR U+52D1 +ENCODING 21201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FF90 +0810 +497F +4911 +4911 +AA91 +AA91 +1C11 +1C11 +2A11 +6B33 +C9A2 +0822 +0866 +ENDCHAR +STARTCHAR U+52D2 +ENCODING 21202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +1440 +7F40 +1440 +1DF8 +0848 +3E48 +2A48 +3E48 +0848 +7F88 +0888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+52D3 +ENCODING 21203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4208 +4208 +7BC8 +421F +4A49 +73C9 +0809 +3F89 +2089 +3F89 +2089 +2091 +3FAA +2084 +0000 +0000 +ENDCHAR +STARTCHAR U+52D4 +ENCODING 21204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FF90 +0810 +1010 +7F7F +5511 +5511 +5D11 +5511 +5511 +5D11 +5511 +5531 +5523 +7F62 +00CE +ENDCHAR +STARTCHAR U+52D5 +ENCODING 21205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0640 +3840 +0840 +7FF8 +3E48 +2A48 +3E48 +2A48 +3E48 +0848 +3E88 +0888 +0F08 +7230 +0000 +ENDCHAR +STARTCHAR U+52D6 +ENCODING 21206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +FFA0 +8120 +BD24 +81FE +BD24 +0024 +7E24 +4224 +7E24 +4244 +7E44 +4244 +7E84 +42A8 +0110 +ENDCHAR +STARTCHAR U+52D7 +ENCODING 21207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +3E40 +2240 +3FF8 +2248 +3E48 +2288 +3F88 +6130 +0000 +ENDCHAR +STARTCHAR U+52D8 +ENCODING 21208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1240 +1240 +7F40 +12F8 +1E48 +1248 +1E48 +1248 +7FC8 +2C48 +2D48 +3388 +3F88 +2130 +0000 +ENDCHAR +STARTCHAR U+52D9 +ENCODING 21209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3E80 +04FC +1990 +0A50 +7E20 +0AD0 +1B4C +1C40 +2BF8 +4848 +0888 +0908 +1A30 +0000 +ENDCHAR +STARTCHAR U+52DB +ENCODING 21211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3E08 +2208 +2208 +3E7F +0009 +7F09 +4109 +7F09 +4111 +7F11 +4111 +7F11 +0021 +2221 +4146 +ENDCHAR +STARTCHAR U+52DC +ENCODING 21212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2410 +2410 +6610 +D310 +347F +2611 +7A11 +0011 +FF11 +1111 +9911 +5531 +3321 +5523 +9962 +334E +ENDCHAR +STARTCHAR U+52DD +ENCODING 21213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E48 +2550 +27F8 +2440 +3FFC +24A0 +2550 +3E48 +27F4 +2490 +2490 +2510 +4E60 +0000 +ENDCHAR +STARTCHAR U+52DE +ENCODING 21214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0C30 +2AA8 +2AA8 +5960 +1450 +2288 +3FFC +2208 +5FF0 +0210 +0410 +0810 +3060 +0000 +ENDCHAR +STARTCHAR U+52DF +ENCODING 21215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +0540 +1FF0 +612C +0620 +18C0 +0000 +ENDCHAR +STARTCHAR U+52E0 +ENCODING 21216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +2B40 +5D40 +2BF8 +4D48 +1A48 +6148 +0948 +3448 +0A88 +3488 +0908 +3230 +0000 +ENDCHAR +STARTCHAR U+52E1 +ENCODING 21217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FF90 +1410 +7F10 +557F +5511 +7F11 +0011 +7F11 +0011 +FF91 +0811 +2A33 +6B22 +C9A2 +186E +ENDCHAR +STARTCHAR U+52E2 +ENCODING 21218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +09F0 +7F50 +15D0 +2B50 +7E70 +0894 +7F0C +0100 +3FF0 +0210 +0C10 +30E0 +0000 +ENDCHAR +STARTCHAR U+52E3 +ENCODING 21219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +7F40 +0840 +3E40 +08F8 +7F48 +3E48 +2248 +3E48 +3E48 +2248 +3E88 +1288 +6130 +0000 +ENDCHAR +STARTCHAR U+52E4 +ENCODING 21220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +7F40 +1440 +3E40 +2BF8 +2A48 +3E48 +0848 +3E48 +0848 +3E48 +0888 +0E88 +7930 +0000 +ENDCHAR +STARTCHAR U+52E5 +ENCODING 21221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FCC4 +049E +7DF3 +4010 +7DFF +0511 +05FF +0C12 +0BFF +3801 +0100 +7FFE +0202 +0C06 +F01C +ENDCHAR +STARTCHAR U+52E6 +ENCODING 21222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2A40 +5440 +2A40 +3E40 +2BF8 +3E48 +2A48 +3E48 +0848 +7E48 +1C88 +2A88 +4908 +0A30 +0000 +ENDCHAR +STARTCHAR U+52E7 +ENCODING 21223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +3F40 +28F8 +5F48 +1448 +3F48 +6448 +3F48 +2448 +3F48 +2488 +3F88 +2130 +0000 +ENDCHAR +STARTCHAR U+52E8 +ENCODING 21224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +3F08 +6208 +4408 +FFBF +4889 +4889 +7F89 +0809 +3089 +C989 +3519 +CE11 +3513 +C532 +1C66 +ENDCHAR +STARTCHAR U+52E9 +ENCODING 21225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4908 +FFC8 +4908 +4F08 +403F +7F89 +0009 +7F09 +4109 +7F09 +4109 +7F19 +4111 +7F13 +2232 +C1A6 +ENDCHAR +STARTCHAR U+52EA +ENCODING 21226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0708 +7C08 +0808 +FFC8 +123F +3F09 +D2C9 +1E09 +0009 +7F89 +4089 +5E99 +5291 +5E93 +40B2 +43A6 +ENDCHAR +STARTCHAR U+52EB +ENCODING 21227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F08 +2488 +153F +0E09 +7FC9 +1509 +2489 +4449 +3F89 +2489 +3F89 +2491 +3FAA +2084 +0000 +0000 +ENDCHAR +STARTCHAR U+52EC +ENCODING 21228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4908 +2A08 +0808 +7F88 +123F +FFC9 +2109 +4889 +B249 +1409 +0909 +7F99 +0891 +2A13 +6B32 +C9A6 +ENDCHAR +STARTCHAR U+52EF +ENCODING 21231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7FC8 +0008 +3FBF +2E89 +2A89 +2E89 +3F89 +1F09 +1109 +1F09 +1111 +1F21 +7FCE +0000 +0000 +ENDCHAR +STARTCHAR U+52F0 +ENCODING 21232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +12FE +7F92 +1292 +12FE +2A92 +4492 +00FE +4482 +FF20 +5510 +5550 +55C2 +55C6 +9944 +333C +ENDCHAR +STARTCHAR U+52F1 +ENCODING 21233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +2208 +FF88 +2208 +7F7F +4909 +7F09 +4909 +7F09 +0809 +FF89 +8899 +8A91 +BE93 +82B2 +81A6 +ENDCHAR +STARTCHAR U+52F2 +ENCODING 21234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +3C40 +7F40 +3FF8 +2A48 +3E48 +2A48 +3E48 +3E88 +0F88 +7930 +0000 +2488 +4244 +0000 +ENDCHAR +STARTCHAR U+52F3 +ENCODING 21235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0640 +3840 +7F40 +0840 +7FF8 +6B48 +5D48 +7F48 +0848 +7F48 +0848 +7E88 +3A88 +5530 +0000 +ENDCHAR +STARTCHAR U+52F4 +ENCODING 21236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +0788 +0408 +7FC8 +485F +7F09 +4849 +5FC9 +5489 +5F89 +5489 +5F89 +4419 +AA93 +2952 +4736 +ENDCHAR +STARTCHAR U+52F5 +ENCODING 21237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FA0 +2520 +3FA0 +2578 +2FA8 +2AA8 +2FA8 +2AA8 +2FA8 +3FE8 +3368 +3FC8 +50D8 +0000 +ENDCHAR +STARTCHAR U+52F6 +ENCODING 21238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +37C8 +621F +9492 +37F2 +604A +A7CE +2444 +27CE +245B +24D1 +0100 +7FFE +0202 +0C06 +F01C +ENDCHAR +STARTCHAR U+52F7 +ENCODING 21239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +FF88 +0008 +F788 +94BF +F789 +2209 +FF89 +2209 +FF89 +2209 +FF89 +3209 +E289 +3911 +E0D3 +ENDCHAR +STARTCHAR U+52F8 +ENCODING 21240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +7F40 +1440 +7740 +55F8 +7748 +2448 +3F48 +2448 +7E48 +2448 +3E88 +2488 +3F30 +0000 +ENDCHAR +STARTCHAR U+52F9 +ENCODING 21241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +0FF8 +1008 +1008 +2008 +4008 +0008 +0008 +0008 +0008 +0010 +0060 +0000 +ENDCHAR +STARTCHAR U+52FA +ENCODING 21242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +0FF8 +1008 +1008 +2408 +4208 +0108 +0108 +0008 +0008 +0008 +0030 +0000 +ENDCHAR +STARTCHAR U+52FB +ENCODING 21243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +1000 +1FFE +2002 +4002 +0002 +0FE2 +0002 +0002 +1FF2 +0002 +0004 +0004 +0008 +0070 +ENDCHAR +STARTCHAR U+52FC +ENCODING 21244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1FFF +2401 +4401 +1FC1 +0441 +0449 +0449 +0849 +1079 +2002 +0024 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+52FE +ENCODING 21246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +1FF8 +1208 +2208 +4208 +0308 +0488 +05C8 +3E48 +0008 +0008 +0030 +0000 +ENDCHAR +STARTCHAR U+52FF +ENCODING 21247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +0FF8 +1248 +1248 +2248 +4448 +0448 +0888 +1088 +0108 +0208 +0030 +0000 +ENDCHAR +STARTCHAR U+5300 +ENCODING 21248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +0FFE +1004 +1004 +2604 +4304 +8104 +0024 +00C4 +0304 +1C04 +0804 +0044 +0028 +0010 +ENDCHAR +STARTCHAR U+5301 +ENCODING 21249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +0FF0 +0910 +1510 +1310 +2110 +42D0 +0230 +041C +0810 +1020 +00C0 +0000 +ENDCHAR +STARTCHAR U+5302 +ENCODING 21250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +1FF8 +1008 +2808 +4988 +0E08 +0808 +0848 +0848 +07C8 +0008 +0030 +0000 +ENDCHAR +STARTCHAR U+5303 +ENCODING 21251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1FFE +3002 +2002 +6102 +D102 +1102 +1382 +1282 +16C6 +1C64 +1004 +1FEC +0008 +0038 +ENDCHAR +STARTCHAR U+5305 +ENCODING 21253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +1FF8 +1008 +3F88 +4088 +0088 +1F88 +10B0 +1000 +1004 +1004 +0FFC +0000 +ENDCHAR +STARTCHAR U+5306 +ENCODING 21254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +0FF8 +1248 +1248 +2E48 +45C8 +0448 +08A8 +1088 +0108 +0210 +0060 +0000 +ENDCHAR +STARTCHAR U+5308 +ENCODING 21256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +0FF8 +1008 +1108 +3948 +5748 +1348 +14C8 +1848 +1FC8 +1048 +0030 +0000 +ENDCHAR +STARTCHAR U+5309 +ENCODING 21257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0802 +1FFF +2002 +4FE2 +0102 +0922 +0542 +3FFA +0102 +0102 +0102 +0114 +0108 +0000 +0000 +ENDCHAR +STARTCHAR U+530A +ENCODING 21258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1FFF +3001 +2101 +6921 +CD61 +0541 +0101 +3FF9 +0301 +07C1 +0D63 +1932 +2106 +011C +ENDCHAR +STARTCHAR U+530B +ENCODING 21259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1FFE +3002 +6802 +CFF2 +1902 +0102 +3FFA +0102 +1112 +1112 +1112 +1FF6 +0004 +001C +ENDCHAR +STARTCHAR U+530C +ENCODING 21260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +3FFE +2102 +6382 +C6C2 +0C62 +383A +07C2 +0002 +0FE2 +0822 +0826 +0FE4 +000C +0038 +ENDCHAR +STARTCHAR U+530D +ENCODING 21261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1248 +3FE8 +4208 +1FC8 +1248 +1FC8 +1248 +1FC8 +1248 +12C8 +0030 +0000 +ENDCHAR +STARTCHAR U+530E +ENCODING 21262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1FFF +2081 +4FF9 +0221 +0491 +0FF9 +1495 +07F1 +0491 +07F1 +0081 +00F9 +0002 +0000 +0000 +ENDCHAR +STARTCHAR U+530F +ENCODING 21263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +14F8 +1288 +3FE8 +40A8 +7EA8 +10E8 +1EB0 +2280 +0284 +0284 +0C7C +0000 +ENDCHAR +STARTCHAR U+5310 +ENCODING 21264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1008 +3FC8 +4F88 +0888 +0F88 +1FC8 +1248 +1FC8 +1248 +1FC8 +1030 +0000 +ENDCHAR +STARTCHAR U+5311 +ENCODING 21265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +3FFF +6401 +C8F9 +1E09 +1209 +1EF9 +1281 +1E81 +12F9 +7E09 +0A09 +1A0B +321A +0676 +ENDCHAR +STARTCHAR U+5312 +ENCODING 21266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1FFF +2221 +4FF9 +0221 +03C1 +0421 +0811 +17E9 +2005 +07E1 +0421 +07E1 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+5313 +ENCODING 21267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +3FFF +6001 +D071 +2651 +229D +3601 +22F9 +3E49 +0859 +3E31 +0821 +0E73 +38DA +0006 +ENDCHAR +STARTCHAR U+5315 +ENCODING 21269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1000 +1008 +1010 +1020 +10C0 +1300 +1C00 +7000 +1000 +1004 +1004 +0804 +07FC +0000 +ENDCHAR +STARTCHAR U+5316 +ENCODING 21270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +0480 +0488 +0888 +0890 +18A0 +28C0 +4880 +0880 +0880 +0880 +0884 +0884 +087C +0000 +ENDCHAR +STARTCHAR U+5317 +ENCODING 21271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +0480 +0488 +0488 +7C90 +04A0 +04C0 +0480 +0480 +1C80 +6480 +0484 +0484 +047C +0000 +ENDCHAR +STARTCHAR U+5318 +ENCODING 21272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +8092 +8124 +8248 +8124 +9892 +B000 +E040 +83FE +8202 +828A +8252 +8222 +8A52 +DA8A +7202 +03FE +ENDCHAR +STARTCHAR U+5319 +ENCODING 21273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1F40 +1140 +1F48 +1148 +1F50 +0060 +7FC0 +0440 +1744 +1444 +1C3C +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+531A +ENCODING 21274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+531B +ENCODING 21275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4100 +4100 +43F0 +4610 +4C30 +4060 +4040 +40E0 +41B0 +4318 +5E0E +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+531C +ENCODING 21276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4080 +4480 +4498 +44E8 +4788 +5C88 +4498 +4480 +4404 +460C +43F8 +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+531D +ENCODING 21277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2080 +2080 +27F0 +2490 +2490 +2490 +2490 +2490 +24E0 +2080 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+531E +ENCODING 21278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4000 +4000 +4FF8 +4080 +4080 +4080 +4080 +4080 +4080 +5FFC +4000 +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+531F +ENCODING 21279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4080 +4080 +5FFC +4000 +43E0 +4220 +4220 +4620 +4424 +4C24 +581C +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+5320 +ENCODING 21280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2020 +20C0 +2700 +2400 +27F8 +2440 +2440 +2840 +2840 +3040 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5321 +ENCODING 21281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2000 +2FF8 +2080 +2080 +27F0 +2080 +2080 +2080 +2FF8 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5322 +ENCODING 21282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7FFF +4400 +4400 +4FFE +5122 +4122 +4222 +4442 +4882 +4104 +4038 +4000 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5323 +ENCODING 21283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2000 +27F0 +2490 +27F0 +2490 +27F0 +2490 +2080 +2080 +2080 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5325 +ENCODING 21285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4200 +4620 +44F0 +4F18 +4000 +4220 +5FFC +4220 +4420 +4420 +4820 +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+5326 +ENCODING 21286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +4840 +4A40 +7F50 +50F8 +5450 +7F50 +4450 +4450 +7F54 +4454 +448C +4500 +7FFE +0000 +ENDCHAR +STARTCHAR U+5327 +ENCODING 21287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4080 +4080 +5FFC +4080 +4490 +4490 +4AA8 +51C4 +4360 +4630 +5C1C +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+5328 +ENCODING 21288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4000 +4210 +4A10 +4A10 +4EFE +4210 +4210 +5E10 +4A10 +4A10 +527C +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+5329 +ENCODING 21289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4080 +4888 +4888 +4FF8 +4080 +4000 +4FF8 +4080 +47F0 +4080 +5FFC +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+532A +ENCODING 21290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2140 +2140 +2F78 +2140 +2F78 +2140 +2F78 +2240 +2240 +2440 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+532B +ENCODING 21291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4400 +4FFC +5924 +436C +46C8 +4018 +4FF8 +4808 +4FF8 +4808 +4FF8 +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+532C +ENCODING 21292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4080 +43E0 +4E38 +79CE +4000 +5F04 +5124 +5F24 +5124 +5F24 +5104 +530C +4000 +7FFE +ENDCHAR +STARTCHAR U+532D +ENCODING 21293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4420 +5F20 +44F8 +5F28 +5528 +5F28 +5528 +5F28 +446A +5F4A +44C6 +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+532E +ENCODING 21294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +4080 +4FF8 +4888 +4FF8 +4080 +7FFC +4008 +4FFC +4888 +4888 +4360 +4C18 +7FFE +0000 +ENDCHAR +STARTCHAR U+532F +ENCODING 21295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2890 +24A0 +35F8 +2B20 +29F8 +2120 +25F8 +2520 +29F8 +2900 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5330 +ENCODING 21296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4000 +5F7C +5144 +5F7C +4000 +4FF8 +4888 +4FF8 +4888 +4FF8 +4080 +5FFC +4080 +7FFE +0000 +ENDCHAR +STARTCHAR U+5331 +ENCODING 21297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2080 +27F0 +2490 +3FFC +27F0 +2410 +27F0 +27F0 +27F0 +2C18 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5332 +ENCODING 21298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4100 +4100 +5FFC +4220 +4FF8 +7A2E +43E0 +4000 +4F78 +4948 +4F78 +4000 +7FFE +0000 +ENDCHAR +STARTCHAR U+5333 +ENCODING 21299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2080 +2140 +27F0 +3808 +2770 +2550 +2770 +2220 +2550 +2988 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5334 +ENCODING 21300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +4410 +4FBF +5244 +47F8 +4408 +47F8 +47F8 +4408 +47F8 +4110 +5FFE +4410 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5335 +ENCODING 21301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4080 +5FFC +4080 +4FF8 +4000 +5FFC +5224 +5FFC +4808 +4FF8 +4808 +4FF8 +4630 +4C18 +7FFE +ENDCHAR +STARTCHAR U+5337 +ENCODING 21303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +5FFC +5144 +5D74 +5D74 +5F7C +4420 +4FFC +5820 +4FFC +4FFC +4820 +4FFC +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5338 +ENCODING 21304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +0800 +07F8 +0000 +0000 +ENDCHAR +STARTCHAR U+5339 +ENCODING 21305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2240 +2240 +2240 +2240 +2240 +2448 +2448 +2838 +3000 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+533A +ENCODING 21306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2020 +2020 +2040 +2C40 +2380 +2080 +2140 +2220 +2420 +2800 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+533B +ENCODING 21307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2200 +2200 +27F0 +2480 +2880 +3FF8 +2140 +2120 +2210 +2C10 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+533C +ENCODING 21308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +2040 +20E0 +21B0 +2318 +2E0E +21F0 +2000 +23F8 +2208 +2208 +23F8 +3000 +1FFF +0000 +ENDCHAR +STARTCHAR U+533D +ENCODING 21309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFE +4000 +4FF8 +4808 +4FF8 +4808 +4FF8 +4100 +5FFC +4220 +47C0 +4170 +4E18 +6000 +3FFE +ENDCHAR +STARTCHAR U+533E +ENCODING 21310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +4080 +4FF8 +4808 +4FF8 +4800 +4FFC +5924 +6924 +4FFC +4924 +492C +4804 +7FFE +0000 +ENDCHAR +STARTCHAR U+533F +ENCODING 21311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2240 +2FF0 +2240 +2100 +3FF8 +2200 +27F0 +2A10 +33F0 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5340 +ENCODING 21312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +2000 +23E0 +2220 +23E0 +2000 +2F78 +2948 +2F78 +2948 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5341 +ENCODING 21313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5342 +ENCODING 21314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFF8 +0008 +0408 +0408 +0408 +0408 +0408 +FFE8 +0408 +0408 +0408 +040C +0405 +0407 +0002 +ENDCHAR +STARTCHAR U+5343 +ENCODING 21315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +00C0 +1F00 +0100 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5344 +ENCODING 21316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +0410 +0410 +0410 +7FFF +0410 +0410 +0410 +0410 +0410 +0410 +0410 +0410 +0410 +0410 +ENDCHAR +STARTCHAR U+5345 +ENCODING 21317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1110 +1110 +1110 +1110 +7FFC +1110 +1110 +1110 +1110 +2110 +2110 +4010 +0000 +ENDCHAR +STARTCHAR U+5346 +ENCODING 21318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +3FC0 +0440 +0444 +0844 +113C +2100 +0100 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5347 +ENCODING 21319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0140 +0640 +3C40 +0440 +0440 +0440 +7FFC +0440 +0440 +0840 +0840 +1040 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+5348 +ENCODING 21320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0FF0 +1100 +1100 +2100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5349 +ENCODING 21321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +3FF8 +0100 +0920 +0920 +0820 +7FFC +0820 +0820 +1020 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+534A +ENCODING 21322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1110 +0910 +0920 +3FF8 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+534B +ENCODING 21323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +7FFE +0100 +1108 +1108 +1008 +FFFF +1008 +1008 +1008 +1008 +1008 +1FF8 +0000 +ENDCHAR +STARTCHAR U+534C +ENCODING 21324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1248 +1248 +1248 +1248 +1248 +FFFF +1248 +1248 +1248 +1248 +1248 +1248 +1248 +1248 +1248 +ENDCHAR +STARTCHAR U+534D +ENCODING 21325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F08 +0108 +0108 +0108 +0108 +3FF8 +2100 +2100 +2100 +2100 +2100 +21F8 +0000 +0000 +ENDCHAR +STARTCHAR U+534E +ENCODING 21326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0448 +0858 +0860 +18C0 +2940 +4A44 +0844 +093C +0100 +FFFE +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+534F +ENCODING 21327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2080 +2088 +FBFC +2088 +2088 +248C +248A +248A +2908 +2108 +2108 +2208 +2428 +2010 +ENDCHAR +STARTCHAR U+5351 +ENCODING 21329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0400 +1FF0 +1110 +1110 +1FF0 +1110 +1FF0 +0440 +0840 +7FFC +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5352 +ENCODING 21330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0840 +0840 +0C60 +1290 +2310 +0100 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5353 +ENCODING 21331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +01F8 +0100 +1FF0 +1010 +1FF0 +1010 +1FF0 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5354 +ENCODING 21332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +1048 +7C88 +1108 +1230 +1210 +1FFC +1294 +1294 +14A4 +14A4 +19CC +0000 +ENDCHAR +STARTCHAR U+5355 +ENCODING 21333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0820 +0448 +3FFC +2108 +2108 +3FF8 +2108 +2108 +3FF8 +2100 +0104 +FFFE +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+5356 +ENCODING 21334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0110 +3FF8 +0100 +0100 +7FFC +0804 +0688 +2280 +1880 +0884 +FFFE +0140 +0230 +0C18 +3008 +ENDCHAR +STARTCHAR U+5357 +ENCODING 21335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +0100 +3FF8 +2448 +2288 +2FE8 +2108 +2FE8 +2108 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+5358 +ENCODING 21336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0910 +0920 +1FF0 +1110 +1FF0 +1110 +1110 +1FF0 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5359 +ENCODING 21337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +2208 +FF88 +2208 +3E08 +2208 +3E7F +2208 +FF88 +5408 +5408 +5788 +6008 +4008 +7F08 +0008 +ENDCHAR +STARTCHAR U+535A +ENCODING 21338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +17FC +1040 +13F8 +7E48 +13F8 +1248 +13F8 +1010 +17FC +1110 +1090 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+535B +ENCODING 21339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +47E8 +8010 +53CA +2004 +4BC9 +F81F +23C4 +AA55 +ABD5 +2104 +0100 +FFFF +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+535C +ENCODING 21340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +0200 +0300 +0280 +0240 +0220 +0220 +0200 +0200 +0200 +0200 +0200 +0000 +ENDCHAR +STARTCHAR U+535E +ENCODING 21342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +0100 +0180 +0140 +0120 +0110 +0110 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+535F +ENCODING 21343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0880 +7C80 +4880 +48A0 +4898 +488C +4884 +4880 +4880 +7880 +4880 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+5360 +ENCODING 21344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +03F8 +0200 +0200 +0200 +3FF0 +2010 +2010 +2010 +2010 +3FF0 +2010 +0000 +ENDCHAR +STARTCHAR U+5361 +ENCODING 21345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0220 +03F0 +0200 +0200 +0204 +FFFE +0200 +0200 +0280 +0260 +0230 +0210 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U+5362 +ENCODING 21346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +01FE +0100 +0108 +3FFC +2008 +2008 +2008 +3FF8 +2008 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U+5363 +ENCODING 21347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +01FC +0100 +0108 +3FFC +2008 +2088 +3FC8 +2088 +2088 +3F88 +2088 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+5364 +ENCODING 21348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +01FE +0100 +0108 +3FFC +2008 +2828 +2468 +2288 +2108 +2188 +2248 +2428 +2818 +3FF8 +2008 +ENDCHAR +STARTCHAR U+5365 +ENCODING 21349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +01FF +0100 +0100 +3FFC +2004 +2094 +2C94 +2324 +2CC4 +2124 +2614 +2004 +3FFC +0000 +ENDCHAR +STARTCHAR U+5366 +ENCODING 21350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0420 +0420 +3FA0 +0420 +0430 +7FE8 +0424 +0424 +3FA0 +0420 +0420 +07A0 +7C20 +0000 +ENDCHAR +STARTCHAR U+5367 +ENCODING 21351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +7F40 +4840 +4840 +4840 +7E60 +4250 +4248 +4244 +7E44 +4840 +4840 +4A40 +7F40 +0040 +0040 +ENDCHAR +STARTCHAR U+5368 +ENCODING 21352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +00FF +0080 +1FFC +1004 +11FC +1104 +1104 +7FFF +4001 +47F1 +4411 +47F1 +4411 +4003 +ENDCHAR +STARTCHAR U+5369 +ENCODING 21353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +09C0 +0800 +0800 +0800 +0000 +ENDCHAR +STARTCHAR U+536B +ENCODING 21355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7FFC +0208 +0208 +0208 +0208 +0208 +0208 +0228 +0210 +0200 +0200 +0204 +FFFE +0000 +ENDCHAR +STARTCHAR U+536C +ENCODING 21356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0300 +0E00 +78FE +4082 +4082 +4082 +4082 +4082 +4082 +4082 +4082 +5E82 +F082 +009E +0080 +0080 +ENDCHAR +STARTCHAR U+536D +ENCODING 21357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +FEFE +1082 +1082 +1082 +1082 +1082 +1082 +1082 +1E82 +7082 +C082 +009E +0080 +0080 +ENDCHAR +STARTCHAR U+536E +ENCODING 21358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +00E0 +1F00 +1000 +1FFC +1000 +13F0 +1210 +1210 +1210 +1260 +2204 +2204 +41FC +0000 +ENDCHAR +STARTCHAR U+536F +ENCODING 21359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0C00 +30F8 +2288 +2288 +2288 +2288 +2288 +2288 +3E88 +64F0 +0480 +0880 +1080 +0000 +ENDCHAR +STARTCHAR U+5370 +ENCODING 21360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0600 +38F8 +2088 +2088 +3E88 +2088 +2088 +2088 +3E88 +20F0 +2080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+5371 +ENCODING 21361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +07E0 +18C0 +6100 +1FFC +1000 +13F0 +1210 +1210 +1210 +1260 +2204 +2204 +41FC +0000 +ENDCHAR +STARTCHAR U+5372 +ENCODING 21362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFBF +10A1 +10A1 +30A1 +21A1 +6121 +C721 +0021 +7FA1 +40A1 +40A1 +40A7 +40A0 +40A0 +7FA0 +ENDCHAR +STARTCHAR U+5373 +ENCODING 21363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +2288 +3E88 +2288 +2288 +3E88 +2888 +2488 +2688 +3AF0 +6280 +0080 +0000 +ENDCHAR +STARTCHAR U+5374 +ENCODING 21364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0878 +0848 +3F48 +0848 +0848 +7FC8 +0848 +0C48 +1248 +1370 +7D40 +0140 +0040 +0000 +ENDCHAR +STARTCHAR U+5375 +ENCODING 21365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0C00 +32F8 +2288 +32C8 +2AA8 +2AA8 +2288 +2288 +2E88 +74F0 +0480 +0880 +1080 +0000 +ENDCHAR +STARTCHAR U+5377 +ENCODING 21367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0920 +0910 +1FF0 +0280 +7FFC +0440 +0820 +17D0 +644C +0440 +0580 +0410 +03F0 +0000 +ENDCHAR +STARTCHAR U+5378 +ENCODING 21368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1078 +1F48 +2448 +4448 +7FC8 +0448 +2748 +2448 +2448 +2770 +3C40 +6040 +0040 +0000 +ENDCHAR +STARTCHAR U+5379 +ENCODING 21369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +183E +1022 +7F22 +5522 +5522 +5522 +5522 +5522 +5522 +55A2 +5722 +5C2E +7020 +C020 +0020 +ENDCHAR +STARTCHAR U+537A +ENCODING 21370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0040 +0188 +3DB0 +0540 +0930 +330E +C104 +3FF8 +0010 +1FF8 +1010 +1090 +1064 +1004 +0FFC +ENDCHAR +STARTCHAR U+537B +ENCODING 21371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0C78 +1248 +2148 +4948 +0C48 +1248 +1148 +3F48 +5248 +1270 +1240 +1E40 +1040 +0000 +ENDCHAR +STARTCHAR U+537C +ENCODING 21372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +007C +7E84 +2808 +28FF +2880 +28FE +28A2 +28A2 +2AAC +2AA0 +4EA1 +0121 +023F +0000 +0000 +ENDCHAR +STARTCHAR U+537D +ENCODING 21373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2000 +7E7E +4242 +7E42 +4242 +7E42 +4242 +0042 +4042 +4742 +7842 +4042 +414E +7F40 +0040 +ENDCHAR +STARTCHAR U+537E +ENCODING 21374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +F7BE +94A2 +94A2 +F7A2 +0022 +7F22 +0022 +FFA2 +1022 +2022 +7F22 +012E +0120 +0320 +0E20 +ENDCHAR +STARTCHAR U+537F +ENCODING 21375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +33B8 +22A8 +2AA8 +2BA8 +2AA8 +2AA8 +2BA8 +2A28 +3B28 +6AA8 +13F0 +1620 +2020 +0000 +ENDCHAR +STARTCHAR U+5382 +ENCODING 21378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +2000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+5383 +ENCODING 21379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0FF0 +1820 +3040 +6080 +BFFF +2000 +2000 +2000 +2000 +2000 +2000 +6000 +4000 +C000 +0000 +ENDCHAR +STARTCHAR U+5384 +ENCODING 21380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1000 +1000 +13F0 +1210 +1210 +1210 +1210 +1260 +1200 +2204 +2204 +41FC +0000 +ENDCHAR +STARTCHAR U+5385 +ENCODING 21381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2000 +2000 +2004 +3FFE +2080 +2080 +2080 +2080 +2080 +2080 +4080 +4080 +8280 +0100 +ENDCHAR +STARTCHAR U+5386 +ENCODING 21382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2100 +2100 +2100 +2104 +3FFE +2104 +2104 +2104 +2104 +2204 +4204 +4444 +8828 +1010 +ENDCHAR +STARTCHAR U+5387 +ENCODING 21383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2000 +200C +2078 +2FC0 +2080 +2080 +2080 +3FFF +2080 +2080 +6080 +4082 +C0C6 +007C +ENDCHAR +STARTCHAR U+5388 +ENCODING 21384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2000 +2000 +27FC +2040 +2040 +2040 +2040 +3FFF +2040 +2040 +6040 +4040 +C040 +0040 +ENDCHAR +STARTCHAR U+5389 +ENCODING 21385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2000 +2004 +3FFE +2200 +2208 +23FC +2208 +2208 +2208 +2208 +4408 +4488 +8850 +1020 +ENDCHAR +STARTCHAR U+538A +ENCODING 21386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2000 +2FFC +2410 +2410 +27FE +2030 +2050 +2090 +2110 +2210 +2410 +4050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+538B +ENCODING 21387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2080 +2080 +2080 +2080 +2088 +2FFC +2080 +20A0 +2098 +2088 +4080 +4084 +9FFE +0000 +ENDCHAR +STARTCHAR U+538C +ENCODING 21388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2080 +20A0 +2090 +2094 +3FFE +2080 +2080 +2140 +2140 +2220 +4220 +4410 +880E +1004 +ENDCHAR +STARTCHAR U+538D +ENCODING 21389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2100 +2108 +2FFC +2240 +2240 +2450 +2FF8 +2040 +2044 +3FFE +4040 +4040 +8040 +0040 +ENDCHAR +STARTCHAR U+538E +ENCODING 21390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2000 +2038 +27E0 +2420 +2420 +2420 +27FE +2420 +2430 +2790 +6C18 +400A +DFEE +0004 +ENDCHAR +STARTCHAR U+538F +ENCODING 21391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2200 +2200 +27FE +2880 +2080 +20FC +2080 +2080 +20FC +2080 +4080 +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5392 +ENCODING 21394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +3FFF +2000 +2200 +2200 +27FC +2840 +2040 +2FFE +2040 +2444 +2444 +27FC +4404 +0000 +0000 +ENDCHAR +STARTCHAR U+5393 +ENCODING 21395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2040 +2040 +27FC +2040 +2040 +3FFF +2000 +2040 +2040 +27FC +2040 +2040 +5FFF +4000 +ENDCHAR +STARTCHAR U+5394 +ENCODING 21396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2000 +2000 +2FFE +2100 +2308 +227C +2FC6 +2000 +2040 +2040 +67FC +4040 +C040 +1FFF +ENDCHAR +STARTCHAR U+5395 +ENCODING 21397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3FFE +2000 +2F84 +28A4 +2AA4 +2AA4 +2AA4 +2AA4 +2AA4 +2AA4 +2224 +4504 +4484 +8894 +1008 +ENDCHAR +STARTCHAR U+5396 +ENCODING 21398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1310 +1290 +12A8 +1228 +1FD0 +1214 +1324 +1308 +2510 +2524 +4904 +10FC +0000 +ENDCHAR +STARTCHAR U+5397 +ENCODING 21399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2080 +2040 +2FFE +2208 +2110 +2FFE +2040 +2040 +2FFE +2040 +4040 +0040 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+5398 +ENCODING 21400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1000 +17F0 +1490 +17F0 +1490 +17F0 +1080 +17F0 +1080 +2080 +3FFC +4000 +0000 +ENDCHAR +STARTCHAR U+5399 +ENCODING 21401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2000 +2040 +2FFE +2040 +27FC +2444 +27FC +2444 +27FC +6040 +5FFF +4040 +C040 +0040 +ENDCHAR +STARTCHAR U+539A +ENCODING 21402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +13F0 +1210 +13F0 +1210 +13F0 +1000 +13F0 +1020 +2FFC +2040 +4040 +00C0 +0000 +ENDCHAR +STARTCHAR U+539C +ENCODING 21404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2004 +27F8 +2040 +2FFE +2040 +2248 +2FFE +2248 +2040 +27FC +2040 +4040 +0FFE +0000 +0000 +ENDCHAR +STARTCHAR U+539D +ENCODING 21405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2220 +2228 +2FFC +2220 +3FFE +2008 +27FC +2408 +2408 +27F8 +4408 +4408 +87F8 +0408 +ENDCHAR +STARTCHAR U+539E +ENCODING 21406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +3FFF +2090 +2090 +2F9F +2090 +2090 +2F9F +2090 +2090 +2F9F +2090 +4090 +0110 +0000 +0000 +ENDCHAR +STARTCHAR U+539F +ENCODING 21407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1080 +13F0 +1210 +13F0 +1210 +13F0 +1080 +12A0 +2290 +2488 +4888 +0180 +0000 +ENDCHAR +STARTCHAR U+53A0 +ENCODING 21408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1000 +1788 +14A8 +17A8 +14A8 +17A8 +14A8 +14A8 +17A8 +2328 +2488 +4898 +0000 +ENDCHAR +STARTCHAR U+53A1 +ENCODING 21409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2040 +2080 +27FC +2404 +27FC +2404 +27FC +2041 +2F63 +2156 +6358 +464C +DC47 +01C0 +ENDCHAR +STARTCHAR U+53A2 +ENCODING 21410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3FFE +2200 +2204 +227E +3FC4 +2244 +267C +2744 +2AC4 +2A7C +3244 +4244 +4244 +827C +0244 +ENDCHAR +STARTCHAR U+53A3 +ENCODING 21411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +20A0 +2090 +2FFC +2140 +3E3C +2008 +2FFC +2888 +2FF8 +2888 +4FF8 +4888 +8080 +0080 +ENDCHAR +STARTCHAR U+53A4 +ENCODING 21412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +4000 +431C +5E70 +4410 +4410 +5F7E +4410 +4E38 +4D38 +D554 +9454 +A492 +0411 +0410 +ENDCHAR +STARTCHAR U+53A5 +ENCODING 21413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +18A0 +14A0 +1520 +1FFC +1254 +1A98 +1A90 +1F90 +1AB0 +2228 +2448 +4884 +0000 +ENDCHAR +STARTCHAR U+53A6 +ENCODING 21414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +17F8 +1080 +13F0 +1210 +13F0 +13F0 +1210 +13F0 +11F0 +2720 +20E0 +4F38 +0000 +ENDCHAR +STARTCHAR U+53A7 +ENCODING 21415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2040 +27FC +2040 +23F8 +2208 +23F8 +2208 +23F8 +23F8 +2208 +2FFE +2208 +4404 +0000 +0000 +ENDCHAR +STARTCHAR U+53A8 +ENCODING 21416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1008 +1FC8 +1008 +1788 +14FC +14C8 +17A8 +14A8 +1288 +2308 +2388 +4C18 +0000 +ENDCHAR +STARTCHAR U+53A9 +ENCODING 21417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2000 +2F78 +2950 +2F50 +2950 +2FFC +2830 +2A30 +2950 +2B54 +4C94 +310C +0000 +ENDCHAR +STARTCHAR U+53AA +ENCODING 21418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +4210 +4210 +5FFE +4210 +4000 +4FFC +4884 +4FFC +4080 +4FFC +C080 +87F8 +8080 +3FFF +ENDCHAR +STARTCHAR U+53AB +ENCODING 21419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +4210 +4210 +4F90 +423F +4FA2 +4212 +5FD6 +4414 +479C +4488 +C488 +8C9C +8896 +19B3 +ENDCHAR +STARTCHAR U+53AC +ENCODING 21420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2000 +27FC +25F4 +27FC +2108 +23EC +2E4A +2188 +2F7E +2000 +27FC +4404 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+53AD +ENCODING 21421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2000 +2F28 +2924 +2F20 +2FFC +2020 +2F20 +2920 +2F70 +2F50 +2988 +4B04 +0000 +ENDCHAR +STARTCHAR U+53AE +ENCODING 21422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1508 +1510 +1FE0 +1540 +177C +1550 +1750 +1550 +1FD0 +2550 +2490 +4890 +0000 +ENDCHAR +STARTCHAR U+53AF +ENCODING 21423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +4208 +4208 +5FBF +4208 +471C +5AAB +4208 +4000 +4580 +44C6 +C443 +8409 +8618 +03F0 +ENDCHAR +STARTCHAR U+53B0 +ENCODING 21424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1220 +1720 +16A0 +1AFC +1FC8 +18A8 +1FA8 +1D90 +1D90 +2FA8 +28C8 +4984 +0000 +ENDCHAR +STARTCHAR U+53B2 +ENCODING 21426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +4210 +5FFF +4210 +47FC +4444 +47FC +4444 +47FC +4040 +5FFF +D041 +9051 +97F9 +100B +ENDCHAR +STARTCHAR U+53B3 +ENCODING 21427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0908 +0490 +1FFC +1020 +1FA0 +1220 +1FBC +1548 +17A8 +1730 +2510 +3F30 +4148 +0184 +0000 +ENDCHAR +STARTCHAR U+53B4 +ENCODING 21428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +510A +5F09 +407F +5F08 +511C +5F14 +5136 +5363 +5FFC +4884 +4FFC +C884 +8FFC +8080 +0080 +ENDCHAR +STARTCHAR U+53B5 +ENCODING 21429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2040 +27FC +2404 +27FC +6248 +464C +CDC6 +0000 +7F7F +4444 +5F5F +5151 +5F5F +C444 +9555 +ENDCHAR +STARTCHAR U+53B6 +ENCODING 21430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +0200 +0200 +0200 +0420 +0410 +0808 +10F8 +7F04 +0004 +0000 +ENDCHAR +STARTCHAR U+53B7 +ENCODING 21431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +0200 +FFFF +0400 +0400 +0C80 +0880 +1990 +1118 +3108 +630C +C204 +027E +07C2 +0C03 +ENDCHAR +STARTCHAR U+53B8 +ENCODING 21432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1008 +1008 +1008 +1018 +3010 +2010 +2010 +2030 +2824 +6824 +4C26 +4462 +4442 +5E4F +F2F9 +ENDCHAR +STARTCHAR U+53B9 +ENCODING 21433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +0400 +3FF0 +0410 +0411 +0811 +1011 +621F +0400 +0820 +1010 +7FF8 +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+53BA +ENCODING 21434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0240 +0660 +0C30 +1918 +310C +E307 +0220 +0630 +0C10 +09F8 +1F08 +300C +ENDCHAR +STARTCHAR U+53BB +ENCODING 21435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +1FF0 +0100 +0100 +0100 +7FFC +0200 +0240 +0420 +08F0 +3F08 +0008 +0000 +ENDCHAR +STARTCHAR U+53BD +ENCODING 21437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +0610 +0418 +0C08 +08FC +3F84 +0000 +1010 +1010 +1010 +3232 +2222 +6262 +4F4F +F9F9 +ENDCHAR +STARTCHAR U+53BF +ENCODING 21439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0FF0 +0820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0824 +FFFE +0400 +0820 +1010 +3FF8 +0008 +ENDCHAR +STARTCHAR U+53C0 +ENCODING 21440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0100 +3FFC +2104 +2104 +3FFC +2104 +2104 +3FFC +0400 +0C18 +080C +1FFE +F003 +ENDCHAR +STARTCHAR U+53C1 +ENCODING 21441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0440 +0820 +3FF0 +0210 +0204 +FFFE +0440 +0FE0 +1010 +204E +CFE4 +0000 +0010 +3FF8 +0000 +ENDCHAR +STARTCHAR U+53C2 +ENCODING 21442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0280 +0460 +3F90 +0200 +7FFC +04C0 +0920 +1650 +618C +0E20 +0040 +0180 +1E00 +0000 +ENDCHAR +STARTCHAR U+53C3 +ENCODING 21443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0240 +1FF0 +0810 +1528 +7EFC +0440 +18B0 +630C +0C40 +0190 +0E20 +00C0 +1F00 +0000 +ENDCHAR +STARTCHAR U+53C5 +ENCODING 21445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0808 +3FFC +0004 +2010 +4922 +FBBD +0EE0 +3838 +E10F +0100 +110C +1166 +3132 +6110 +0700 +ENDCHAR +STARTCHAR U+53C8 +ENCODING 21448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0810 +0810 +0820 +0420 +0440 +0240 +0280 +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+53C9 +ENCODING 21449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0210 +0910 +0920 +0420 +0440 +0240 +0180 +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+53CA +ENCODING 21450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FE0 +0420 +0440 +0440 +06F0 +0A10 +0910 +0920 +08A0 +1040 +10A0 +2310 +4C0C +0000 +ENDCHAR +STARTCHAR U+53CB +ENCODING 21451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +7FFC +0200 +0200 +07F0 +0610 +0520 +0940 +0880 +1140 +2630 +580C +0000 +ENDCHAR +STARTCHAR U+53CC +ENCODING 21452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0288 +0288 +2288 +1288 +0C50 +0450 +0460 +0A20 +0A60 +1090 +2108 +4204 +0000 +ENDCHAR +STARTCHAR U+53CD +ENCODING 21453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1000 +1000 +1FF0 +1210 +1210 +1220 +1120 +1140 +1080 +2140 +2630 +580C +0000 +ENDCHAR +STARTCHAR U+53CE +ENCODING 21454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +05F8 +2488 +2488 +2488 +2488 +2450 +2450 +2660 +3C20 +6460 +0490 +0708 +0404 +0000 +ENDCHAR +STARTCHAR U+53CF +ENCODING 21455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +3FF8 +0108 +0108 +FFFF +0000 +7FFC +080C +0C18 +0670 +03C0 +0E70 +381C +E007 +ENDCHAR +STARTCHAR U+53D1 +ENCODING 21457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1120 +1110 +2104 +7FFE +0200 +0200 +07F0 +0610 +0A20 +0940 +1080 +2140 +4230 +8C0E +3004 +ENDCHAR +STARTCHAR U+53D2 +ENCODING 21458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFC +080C +0C18 +0670 +03C0 +0E70 +381C +E007 +0000 +FEFE +4242 +6666 +2C2C +1818 +6C6C +C6C7 +ENDCHAR +STARTCHAR U+53D3 +ENCODING 21459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +0100 +3FFC +2104 +2104 +3FFC +0100 +7FFC +080C +0C18 +0670 +03C0 +0E70 +381C +E007 +ENDCHAR +STARTCHAR U+53D4 +ENCODING 21460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0888 +0F88 +0888 +0850 +7F50 +0850 +0A20 +2920 +2950 +2890 +4908 +1A04 +0000 +ENDCHAR +STARTCHAR U+53D5 +ENCODING 21461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +4242 +6666 +2C2C +1818 +6C6C +C6C7 +0000 +FEFE +4242 +6666 +2C2C +1818 +6C6C +C6C7 +ENDCHAR +STARTCHAR U+53D6 +ENCODING 21462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F00 +13F8 +1288 +1E88 +1288 +1248 +1E50 +1250 +1220 +1E60 +6290 +0308 +0204 +0000 +ENDCHAR +STARTCHAR U+53D7 +ENCODING 21463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +01D0 +3E10 +1220 +0940 +3FFC +2008 +5FE0 +0420 +0240 +0180 +0180 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+53D8 +ENCODING 21464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +7FFC +0440 +1450 +1448 +244C +4444 +1FF0 +0820 +0440 +0280 +0100 +02C0 +0C3C +3008 +ENDCHAR +STARTCHAR U+53D9 +ENCODING 21465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1488 +1288 +2288 +7E50 +0850 +7F50 +0820 +2C20 +2A50 +2A90 +4908 +1A04 +0000 +ENDCHAR +STARTCHAR U+53DA +ENCODING 21466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7EFE +4202 +4202 +4202 +7EFE +4000 +41FE +7E42 +4046 +406C +4038 +7E10 +4038 +40EC +4387 +ENDCHAR +STARTCHAR U+53DB +ENCODING 21467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0AFC +4A80 +2C80 +28F8 +7E88 +0888 +08C8 +0F50 +7930 +1120 +1250 +2288 +4404 +0000 +ENDCHAR +STARTCHAR U+53DD +ENCODING 21469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +7C82 +108E +1080 +FEFE +20A2 +20A2 +20B6 +6894 +499C +7D08 +C51C +0336 +0663 +ENDCHAR +STARTCHAR U+53DE +ENCODING 21470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F7E +4122 +4122 +7F22 +4022 +4036 +5F14 +4014 +5F1C +4408 +5508 +D51C +9514 +A536 +0C63 +ENDCHAR +STARTCHAR U+53DF +ENCODING 21471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0500 +3978 +2108 +3D78 +2108 +2108 +3FF8 +0100 +3FF0 +0420 +0240 +0180 +0660 +781C +0000 +ENDCHAR +STARTCHAR U+53E0 +ENCODING 21472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0440 +0380 +3EF8 +1450 +0820 +76DC +0000 +7FFE +4002 +9FF4 +1010 +1E10 +11F0 +1014 +FFFE +ENDCHAR +STARTCHAR U+53E1 +ENCODING 21473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +08F8 +7F08 +5D48 +5A48 +2D50 +5250 +1F30 +3220 +5E30 +1250 +1E48 +1288 +1F04 +0000 +ENDCHAR +STARTCHAR U+53E2 +ENCODING 21474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1290 +0AA0 +7FFC +0440 +3FF8 +1FF0 +0100 +7FFC +1200 +1FF8 +1E90 +1260 +7EF0 +030C +0000 +ENDCHAR +STARTCHAR U+53E3 +ENCODING 21475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1FF0 +1010 +1010 +1010 +1010 +1010 +1010 +1010 +1FF0 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+53E4 +ENCODING 21476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0100 +0100 +0100 +1FF0 +1010 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+53E5 +ENCODING 21477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +1FF8 +1008 +2F88 +4888 +0888 +0888 +0F88 +0888 +0008 +0008 +0030 +0000 +ENDCHAR +STARTCHAR U+53E6 +ENCODING 21478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1010 +1FF0 +1200 +0208 +7FFC +0208 +0208 +0408 +0408 +0888 +1050 +6020 +ENDCHAR +STARTCHAR U+53E7 +ENCODING 21479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +2004 +2004 +2004 +2004 +3FFC +0000 +0000 +FFFE +0102 +0302 +0606 +0C04 +380C +E038 +ENDCHAR +STARTCHAR U+53E8 +ENCODING 21480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F8 +7888 +4888 +4888 +4888 +4888 +4888 +4888 +4888 +7908 +4908 +4208 +0430 +0000 +ENDCHAR +STARTCHAR U+53E9 +ENCODING 21481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +00F8 +7C88 +4488 +4488 +4488 +4488 +4488 +7C88 +4488 +40F0 +0080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+53EA +ENCODING 21482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1010 +1010 +1010 +1FF0 +1010 +0440 +0420 +0810 +1008 +6008 +0000 +ENDCHAR +STARTCHAR U+53EB +ENCODING 21483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +7910 +4910 +4910 +4910 +4910 +4910 +491C +79F0 +4F10 +4010 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+53EC +ENCODING 21484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0208 +0208 +0408 +1808 +6070 +0000 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+53ED +ENCODING 21485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01E0 +0020 +7820 +4820 +4920 +4920 +4920 +4920 +4910 +7910 +4A10 +4208 +0408 +0804 +0000 +ENDCHAR +STARTCHAR U+53EE +ENCODING 21486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7820 +4820 +4820 +4820 +4820 +4820 +4820 +4820 +7820 +4820 +4020 +0060 +0000 +ENDCHAR +STARTCHAR U+53EF +ENCODING 21487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0010 +0010 +1F10 +1110 +1110 +1110 +1F10 +1110 +0010 +0010 +0010 +0030 +0000 +ENDCHAR +STARTCHAR U+53F0 +ENCODING 21488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0200 +0440 +0830 +7FC8 +0004 +0000 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+53F1 +ENCODING 21489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +7C80 +4488 +4488 +4490 +44A0 +44C0 +4780 +7C80 +4480 +4084 +0084 +007C +0000 +ENDCHAR +STARTCHAR U+53F2 +ENCODING 21490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +1FF0 +1110 +1110 +1110 +1FF0 +1110 +0A00 +0600 +0700 +18C0 +603C +0000 +ENDCHAR +STARTCHAR U+53F3 +ENCODING 21491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +7FFC +0400 +0400 +0800 +0FF0 +1810 +1810 +2810 +4810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+53F5 +ENCODING 21493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +4000 +4020 +47F0 +4420 +4420 +4420 +4420 +4420 +47E0 +4420 +4000 +4004 +7FFE +0000 +ENDCHAR +STARTCHAR U+53F6 +ENCODING 21494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4840 +4840 +4FFC +4840 +4840 +4840 +7840 +4840 +4040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+53F7 +ENCODING 21495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0000 +7FFC +0400 +07E0 +0820 +0820 +0020 +0040 +0180 +0000 +ENDCHAR +STARTCHAR U+53F8 +ENCODING 21496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0008 +3FC8 +0008 +1F88 +1088 +1088 +1088 +1F88 +1088 +0008 +0008 +0030 +0000 +ENDCHAR +STARTCHAR U+53F9 +ENCODING 21497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7FF8 +4A08 +4A08 +4910 +4910 +48A0 +48A0 +4840 +48A0 +78A0 +4910 +0210 +040E +1804 +ENDCHAR +STARTCHAR U+53FA +ENCODING 21498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +0040 +7840 +4840 +4840 +4840 +48C0 +48A0 +48A0 +7920 +4910 +4210 +0408 +0804 +0000 +ENDCHAR +STARTCHAR U+53FB +ENCODING 21499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C40 +4844 +4BFE +4844 +4844 +4844 +4844 +4884 +4884 +7904 +4904 +0204 +0428 +0810 +ENDCHAR +STARTCHAR U+53FC +ENCODING 21500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0804 +7DFE +4804 +4804 +4804 +4814 +4824 +4844 +4884 +4984 +7B04 +4904 +0004 +0028 +0010 +ENDCHAR +STARTCHAR U+53FD +ENCODING 21501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +09F8 +7D10 +4910 +4910 +4910 +4910 +4910 +4910 +4910 +4910 +7910 +4A12 +0212 +040E +0800 +ENDCHAR +STARTCHAR U+5401 +ENCODING 21505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7840 +4840 +4840 +4840 +4FFC +4840 +4840 +4840 +7840 +4840 +4040 +00C0 +0000 +ENDCHAR +STARTCHAR U+5402 +ENCODING 21506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +2000 +2000 +2000 +1FFC +0000 +0000 +1FF8 +1008 +1008 +1008 +1FF8 +0000 +ENDCHAR +STARTCHAR U+5403 +ENCODING 21507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +79FC +4A00 +4A00 +4DF0 +4820 +4840 +7880 +4900 +4204 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+5404 +ENCODING 21508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +07F0 +0C20 +1240 +2180 +0340 +0C30 +7FEC +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5406 +ENCODING 21510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C40 +4880 +4884 +4904 +4BF8 +4808 +4810 +4820 +4840 +7880 +4908 +0204 +03FE +0002 +ENDCHAR +STARTCHAR U+5407 +ENCODING 21511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FC +0004 +7C04 +4408 +4410 +4410 +45FF +4410 +4410 +7C10 +4410 +0090 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5408 +ENCODING 21512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1830 +6FEC +0000 +0000 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5409 +ENCODING 21513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0100 +0100 +3FF8 +0000 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+540A +ENCODING 21514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1FF0 +1110 +0100 +3FF8 +2108 +2108 +2108 +2108 +2130 +0100 +0000 +ENDCHAR +STARTCHAR U+540B +ENCODING 21515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0010 +7810 +4810 +4FFC +4810 +4910 +4890 +4890 +7810 +4810 +4010 +0010 +0030 +0000 +ENDCHAR +STARTCHAR U+540C +ENCODING 21516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +4008 +4008 +5FE8 +4008 +4FC8 +4848 +4848 +4848 +4FC8 +4848 +4008 +4018 +0000 +ENDCHAR +STARTCHAR U+540D +ENCODING 21517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +07E0 +0420 +0C40 +1280 +2100 +0200 +07F8 +1C08 +6408 +0408 +07F8 +0408 +0000 +ENDCHAR +STARTCHAR U+540E +ENCODING 21518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1FC0 +1000 +1000 +1FFC +1000 +1000 +13F0 +1210 +1210 +2210 +2210 +43F0 +0210 +0000 +ENDCHAR +STARTCHAR U+540F +ENCODING 21519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +1110 +1110 +1FF0 +1910 +0500 +0200 +0580 +1860 +601C +0000 +ENDCHAR +STARTCHAR U+5410 +ENCODING 21520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4840 +4BF8 +4840 +4840 +4840 +4840 +7840 +4840 +4040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5411 +ENCODING 21521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0400 +3FF8 +2008 +2008 +27C8 +2448 +2448 +2448 +27C8 +2448 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+5412 +ENCODING 21522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +081C +7DE0 +4840 +4840 +4844 +487E +4FC0 +4840 +4840 +4840 +7840 +4842 +0042 +003E +0000 +ENDCHAR +STARTCHAR U+5413 +ENCODING 21523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0FFE +7C40 +4840 +4840 +4840 +4850 +4848 +4844 +4844 +4840 +7840 +4840 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U+5415 +ENCODING 21525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1010 +1FF0 +1010 +0000 +0008 +3FFC +2008 +2008 +2008 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+5416 +ENCODING 21526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A04 +7D0C +4890 +48A0 +4840 +4840 +4840 +4840 +4840 +4840 +7840 +4840 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U+5417 +ENCODING 21527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0BF8 +7C10 +4910 +4910 +4910 +4910 +4914 +49FE +4804 +4824 +7FF4 +4804 +0004 +0014 +0008 +ENDCHAR +STARTCHAR U+5418 +ENCODING 21528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0044 +7CFE +4510 +4410 +4410 +4412 +45FF +4410 +7C10 +4410 +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5419 +ENCODING 21529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0222 +7A22 +4924 +48A8 +4820 +4820 +4820 +7820 +4850 +0088 +0104 +0202 +0C01 +0000 +0000 +ENDCHAR +STARTCHAR U+541A +ENCODING 21530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F022 +9022 +9022 +97FF +9022 +9022 +9022 +93FE +9020 +F020 +0060 +0040 +00C0 +0180 +ENDCHAR +STARTCHAR U+541B +ENCODING 21531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +0220 +0220 +7FFC +0220 +0220 +1FE0 +0400 +0FF0 +1410 +2410 +47F0 +0410 +0000 +ENDCHAR +STARTCHAR U+541C +ENCODING 21532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FC +0024 +7C24 +4424 +4424 +4424 +45FF +4424 +4424 +7C24 +4424 +0024 +0024 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+541D +ENCODING 21533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0420 +0240 +0180 +0660 +781C +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+541E +ENCODING 21534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +0200 +0204 +FFFE +0440 +0440 +0820 +1010 +2FEE +4824 +8820 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR U+541F +ENCODING 21535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +78A0 +48A0 +4910 +4BF8 +4C04 +4800 +4BF8 +7808 +4810 +4010 +0020 +0020 +0000 +ENDCHAR +STARTCHAR U+5420 +ENCODING 21536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0050 +7848 +4848 +4840 +4FFC +4840 +4840 +4860 +78A0 +4890 +4110 +0608 +1804 +0000 +ENDCHAR +STARTCHAR U+5421 +ENCODING 21537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0220 +0A20 +7E20 +4A24 +4A28 +4BB0 +4A20 +4A20 +4A20 +4A20 +7A20 +4AA2 +0322 +021E +0000 +ENDCHAR +STARTCHAR U+5423 +ENCODING 21539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +0820 +7C20 +48A0 +4880 +4A88 +4A84 +4A82 +4A82 +4A82 +7A8A +448A +0088 +0078 +0000 +ENDCHAR +STARTCHAR U+5424 +ENCODING 21540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0050 +7888 +4904 +4A02 +4889 +4888 +4888 +7888 +4888 +0108 +0208 +0408 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+5425 +ENCODING 21541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +07FF +7808 +4810 +4820 +4840 +48A0 +4924 +4A22 +7821 +4820 +0020 +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5426 +ENCODING 21542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +03C0 +0530 +1908 +6104 +0100 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5427 +ENCODING 21543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +7FFC +4A48 +4A48 +4A48 +4A48 +4A48 +4BF8 +4A08 +4A00 +7A00 +4A02 +0202 +01FE +0000 +ENDCHAR +STARTCHAR U+5428 +ENCODING 21544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C48 +4FFC +4840 +4840 +4A48 +4A48 +4A48 +4A48 +4BF8 +7A48 +4840 +0042 +0042 +003E +ENDCHAR +STARTCHAR U+5429 +ENCODING 21545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +0120 +7920 +4920 +4A10 +4A10 +4FF8 +4894 +4890 +4890 +7910 +4910 +4210 +0460 +0000 +ENDCHAR +STARTCHAR U+542A +ENCODING 21546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +0050 +78D0 +4892 +4896 +499C +4A90 +4890 +4890 +4890 +4890 +7890 +0090 +0091 +0093 +008E +ENDCHAR +STARTCHAR U+542B +ENCODING 21547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1FF0 +600C +1FE0 +0040 +0080 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+542C +ENCODING 21548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0030 +79C0 +4900 +4900 +49FC +4920 +4920 +4920 +4920 +7A20 +4220 +4420 +0020 +0000 +ENDCHAR +STARTCHAR U+542D +ENCODING 21549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4FFC +4800 +49E0 +4920 +4920 +4920 +7920 +4920 +4224 +0224 +041C +0000 +ENDCHAR +STARTCHAR U+542E +ENCODING 21550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7890 +4888 +493C +4FE4 +48A0 +48A0 +48A0 +48A0 +7920 +4924 +4224 +041C +0000 +ENDCHAR +STARTCHAR U+542F +ENCODING 21551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +1004 +1004 +1004 +1FFC +1000 +1004 +1FFE +1804 +2804 +2804 +4804 +8FFC +0804 +ENDCHAR +STARTCHAR U+5430 +ENCODING 21552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7BFF +4820 +4840 +4880 +4910 +4A20 +4840 +7880 +4904 +0202 +07FF +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+5431 +ENCODING 21553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0820 +7C24 +4BFE +4820 +4820 +49FC +4904 +4888 +4888 +4850 +7820 +4850 +0088 +010E +0604 +ENDCHAR +STARTCHAR U+5432 +ENCODING 21554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +0BF4 +7C24 +4824 +4824 +4BE4 +4A04 +4A04 +4A24 +4BF4 +4824 +7824 +4824 +0224 +0144 +0084 +ENDCHAR +STARTCHAR U+5433 +ENCODING 21555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03F8 +1208 +1208 +1208 +13F8 +1000 +1FFE +1090 +0088 +7FFF +0080 +0140 +0220 +0C18 +7007 +ENDCHAR +STARTCHAR U+5434 +ENCODING 21556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1FF0 +0000 +0010 +3FF8 +0100 +0104 +FFFE +0280 +0240 +0420 +181C +6008 +ENDCHAR +STARTCHAR U+5435 +ENCODING 21557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C40 +4840 +4950 +4948 +4946 +4A42 +4A48 +4C48 +4848 +7810 +4810 +0020 +00C0 +0700 +ENDCHAR +STARTCHAR U+5436 +ENCODING 21558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +0040 +7840 +4BF8 +4A48 +4A48 +4A48 +4AA8 +4A98 +4B18 +7A08 +4A08 +4208 +0218 +0000 +ENDCHAR +STARTCHAR U+5437 +ENCODING 21559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7840 +4BFC +4844 +4844 +4844 +4FFF +4840 +78A0 +4910 +0208 +0404 +0803 +0000 +0000 +ENDCHAR +STARTCHAR U+5438 +ENCODING 21560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F0 +7910 +4920 +4920 +49F8 +4988 +4988 +7A50 +4A50 +4220 +0450 +0988 +1604 +0000 +ENDCHAR +STARTCHAR U+5439 +ENCODING 21561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7900 +4900 +49FC +4A48 +4A50 +4C40 +4840 +78A0 +48A0 +4110 +0608 +1804 +0000 +ENDCHAR +STARTCHAR U+543B +ENCODING 21563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7900 +4BF8 +4AA8 +4AA8 +4CA8 +4928 +4948 +7A48 +4C48 +4088 +0108 +0030 +0000 +ENDCHAR +STARTCHAR U+543C +ENCODING 21564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +07E0 +7860 +48A0 +48A0 +4920 +4960 +49A0 +4F20 +7920 +4920 +4124 +0124 +031C +0000 +ENDCHAR +STARTCHAR U+543D +ENCODING 21565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0140 +7940 +4940 +49F8 +4A40 +4A40 +4C40 +4FFC +4840 +7840 +4840 +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+543E +ENCODING 21566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0200 +0200 +1FE0 +0420 +0420 +7FFC +0000 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5440 +ENCODING 21568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7820 +4A20 +4A20 +4A20 +4BFC +4860 +48A0 +48A0 +7920 +4A20 +4420 +0060 +0000 +ENDCHAR +STARTCHAR U+5441 +ENCODING 21569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +78FF +4901 +4A01 +4801 +48F1 +4801 +49F9 +7801 +4801 +0001 +0012 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+5442 +ENCODING 21570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0820 +0FE0 +0920 +0200 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5443 +ENCODING 21571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0BFE +7E00 +4A08 +4AFC +4A88 +4A88 +4A88 +4A88 +4AA8 +4A90 +7A80 +4482 +0482 +087E +1000 +ENDCHAR +STARTCHAR U+5444 +ENCODING 21572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FF0 +0210 +021E +0602 +0C02 +3806 +E11C +0100 +FFFF +0100 +0100 +3FFC +2004 +2004 +2004 +3FFC +ENDCHAR +STARTCHAR U+5445 +ENCODING 21573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7DFF +4400 +4404 +4404 +4484 +4444 +4428 +7C10 +4428 +0044 +0082 +0301 +0000 +0000 +ENDCHAR +STARTCHAR U+5446 +ENCODING 21574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1FF0 +1110 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5447 +ENCODING 21575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0106 +FD8C +05D8 +0D60 +1930 +311C +E107 +0700 +0000 +3FFC +2004 +2004 +2004 +3FFC +0000 +ENDCHAR +STARTCHAR U+5448 +ENCODING 21576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0000 +3FF8 +0100 +0100 +1FF0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5449 +ENCODING 21577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F0 +1210 +1210 +13F0 +1000 +1FF0 +1010 +0010 +7FFC +0000 +0460 +1810 +6008 +0000 +ENDCHAR +STARTCHAR U+544A +ENCODING 21578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +0900 +1FF0 +1100 +2100 +7FFC +0000 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+544B +ENCODING 21579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C48 +4BFC +4840 +4840 +4844 +4FFE +4840 +48A0 +48A0 +7910 +4910 +0208 +040E +0804 +ENDCHAR +STARTCHAR U+544D +ENCODING 21581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F800 +8800 +8800 +8800 +8FFF +8880 +8880 +8880 +8988 +F90C +0104 +013E +03E3 +0601 +ENDCHAR +STARTCHAR U+544E +ENCODING 21582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F8 +7908 +4908 +4908 +4908 +49F8 +4988 +7940 +4A40 +4220 +0410 +0808 +1004 +0000 +ENDCHAR +STARTCHAR U+544F +ENCODING 21583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +00E4 +F784 +9084 +9084 +9084 +97FF +9084 +9084 +9084 +9084 +F084 +0184 +0104 +0304 +0604 +ENDCHAR +STARTCHAR U+5450 +ENCODING 21584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C44 +4BFE +4A44 +4A44 +4A44 +4A44 +4AA4 +4A94 +4B14 +4A04 +7A04 +4A04 +0214 +0208 +ENDCHAR +STARTCHAR U+5451 +ENCODING 21585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +0100 +7FFC +0280 +0440 +1830 +6FEC +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5452 +ENCODING 21586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7C80 +4880 +4880 +4884 +4FFE +48A0 +48A0 +48A0 +4920 +7920 +4A22 +0222 +041E +0800 +ENDCHAR +STARTCHAR U+5453 +ENCODING 21587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0094 +7BFE +4890 +4800 +4BF8 +4810 +4820 +4840 +4880 +4900 +7A00 +4A02 +0202 +01FE +0000 +ENDCHAR +STARTCHAR U+5454 +ENCODING 21588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C40 +4844 +4FFE +4840 +48A0 +48A0 +48A0 +48A0 +4910 +7990 +4A48 +0448 +0806 +1004 +ENDCHAR +STARTCHAR U+5455 +ENCODING 21589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7E00 +4B08 +4A88 +4A50 +4A50 +4A20 +4A20 +4A50 +4A50 +4A88 +7B08 +4A04 +03FE +0000 +ENDCHAR +STARTCHAR U+5456 +ENCODING 21590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0BFE +7E40 +4A40 +4A44 +4BFE +4A44 +4A44 +4A44 +4A44 +4A44 +7A44 +4484 +0484 +0928 +1210 +ENDCHAR +STARTCHAR U+5457 +ENCODING 21591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +09FE +7D04 +4924 +4924 +4924 +4924 +4924 +4924 +4924 +4924 +7924 +4840 +0098 +0106 +0202 +ENDCHAR +STARTCHAR U+5458 +ENCODING 21592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1FF0 +0008 +3FFC +2008 +2108 +2108 +2108 +2108 +2208 +0460 +1818 +6004 +ENDCHAR +STARTCHAR U+5459 +ENCODING 21593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1010 +1FF0 +1110 +0104 +7FFE +4284 +4244 +4424 +4824 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+545B +ENCODING 21595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7CA0 +48A0 +4910 +4A0E +4DF4 +4910 +4910 +4910 +4950 +7920 +4904 +0104 +00FC +0000 +ENDCHAR +STARTCHAR U+545C +ENCODING 21596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0888 +7DFC +4908 +4908 +4908 +4928 +4910 +4904 +49FE +4804 +7824 +47F4 +0004 +0014 +0008 +ENDCHAR +STARTCHAR U+545E +ENCODING 21598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FE +F802 +8802 +89F2 +8802 +8802 +89F2 +8912 +8912 +8912 +F9F2 +0002 +0002 +0002 +000E +ENDCHAR +STARTCHAR U+545F +ENCODING 21599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4FFC +4840 +4850 +4A90 +4990 +48A0 +4860 +7850 +4888 +413C +07C4 +0000 +ENDCHAR +STARTCHAR U+5460 +ENCODING 21600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +03FE +7820 +4870 +48A8 +4924 +4A22 +4C21 +7820 +49FC +0020 +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5461 +ENCODING 21601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +03FF +0202 +7A02 +4BFE +4A10 +4A10 +4BFF +4A10 +4A10 +7A08 +4A45 +0283 +0301 +0000 +0000 +ENDCHAR +STARTCHAR U+5462 +ENCODING 21602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7E08 +4A08 +4A08 +4BF8 +4A00 +4A88 +4A98 +4AA0 +4AC0 +7C80 +4482 +0882 +107E +2000 +ENDCHAR +STARTCHAR U+5463 +ENCODING 21603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +03FF +0202 +7A42 +4A22 +4A12 +4FFF +4A42 +4A22 +7A12 +4A02 +03FF +0004 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+5464 +ENCODING 21604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +08A0 +7CA0 +4910 +4A8E +4C64 +4820 +4800 +4BF8 +4808 +7910 +48A0 +0040 +0020 +0020 +ENDCHAR +STARTCHAR U+5465 +ENCODING 21605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +03FE +7A22 +4A22 +4BFE +4A22 +4A22 +4FFF +7A02 +4A02 +0202 +020A +0204 +0000 +0000 +ENDCHAR +STARTCHAR U+5466 +ENCODING 21606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1120 +7920 +5120 +5224 +54FE +5F24 +5124 +5224 +5224 +54A4 +7FC4 +5444 +0084 +0128 +0210 +ENDCHAR +STARTCHAR U+5467 +ENCODING 21607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +001C +F9F0 +8910 +8910 +8910 +89FF +8910 +8910 +8918 +F908 +01C8 +070C +0005 +07F7 +0002 +ENDCHAR +STARTCHAR U+5468 +ENCODING 21608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1108 +1108 +17C8 +1108 +1FE8 +1008 +17C8 +1448 +1448 +27C8 +2448 +4018 +0000 +ENDCHAR +STARTCHAR U+5469 +ENCODING 21609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F800 +8800 +8800 +8800 +8FFF +8820 +8820 +8924 +F926 +0322 +0223 +0621 +0020 +00E0 +ENDCHAR +STARTCHAR U+546A +ENCODING 21610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7A08 +4A08 +4A08 +4BF8 +4AA8 +48A0 +48A0 +7920 +4920 +4224 +0424 +181C +0000 +ENDCHAR +STARTCHAR U+546B +ENCODING 21611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7C20 +4420 +443F +4420 +4420 +4420 +4420 +45FE +4502 +7D02 +0102 +0102 +0102 +01FE +ENDCHAR +STARTCHAR U+546C +ENCODING 21612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0201 +07FF +0251 +7A51 +4A51 +4A51 +4A91 +4B11 +4A1F +7A01 +4A01 +03FF +0201 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+546D +ENCODING 21613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0124 +0124 +F124 +9124 +97FF +9124 +9124 +9124 +9124 +9124 +913C +F100 +0100 +0100 +01FF +0000 +ENDCHAR +STARTCHAR U+546E +ENCODING 21614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FE +F902 +8902 +8902 +8902 +8902 +8902 +8902 +8902 +89FE +F800 +0084 +0084 +0186 +0303 +ENDCHAR +STARTCHAR U+546F +ENCODING 21615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0010 +7D11 +4492 +4454 +4410 +45FF +4410 +4410 +7C10 +4410 +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5470 +ENCODING 21616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0888 +2890 +2FE0 +2880 +2884 +2E84 +387C +6000 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5471 +ENCODING 21617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0030 +7BE0 +4AA0 +4AA0 +4AA0 +4AA0 +4AA0 +4AA0 +4A90 +7AD0 +4CA8 +47F8 +0814 +0000 +ENDCHAR +STARTCHAR U+5472 +ENCODING 21618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0890 +7C90 +4890 +4A92 +4A94 +4AF8 +4A90 +4A90 +4A90 +4A90 +7AB0 +4AD2 +0312 +0C0E +0000 +ENDCHAR +STARTCHAR U+5473 +ENCODING 21619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4840 +4840 +4FFC +48E0 +48E0 +4950 +7A48 +4C44 +4840 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5474 +ENCODING 21620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +F100 +93FE +9202 +9602 +91F2 +9112 +9112 +9112 +9112 +F1F2 +0002 +0002 +0006 +001C +ENDCHAR +STARTCHAR U+5475 +ENCODING 21621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7808 +4808 +4BC8 +4A48 +4A48 +4A48 +4A48 +4BC8 +7A48 +4808 +4008 +0018 +0000 +ENDCHAR +STARTCHAR U+5476 +ENCODING 21622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +72F8 +5248 +5FC8 +5548 +5548 +5530 +5D30 +5310 +72B0 +52A8 +4448 +0884 +0000 +ENDCHAR +STARTCHAR U+5477 +ENCODING 21623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7A48 +4A48 +4A48 +4BF8 +4A48 +4A48 +4A48 +7BF8 +4A48 +4040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5478 +ENCODING 21624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +07FC +7820 +4820 +4840 +48C0 +48C0 +4950 +494C +4A46 +4C42 +7840 +4840 +0044 +0FFE +0000 +ENDCHAR +STARTCHAR U+547A +ENCODING 21626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +0102 +7902 +49FE +4800 +4BFF +4880 +4880 +48FE +7802 +4802 +0002 +0024 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+547B +ENCODING 21627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4A48 +4A48 +4BF8 +4A48 +4A48 +4BF8 +7A48 +4840 +4040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+547C +ENCODING 21628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +03E0 +7848 +4A48 +4950 +4960 +4840 +4FFC +4840 +7840 +4840 +4040 +0040 +00C0 +0000 +ENDCHAR +STARTCHAR U+547D +ENCODING 21629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1830 +6FEC +0000 +3CF8 +2488 +2488 +2488 +3C88 +24F0 +2080 +0080 +0000 +ENDCHAR +STARTCHAR U+547E +ENCODING 21630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +00FF +0082 +7C82 +4482 +44FE +4482 +4482 +4482 +7CFE +4482 +0000 +0000 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+547F +ENCODING 21631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F020 +93FE +9020 +9020 +9020 +9020 +97FF +9040 +9040 +F0C4 +0084 +00BE +01E2 +0303 +ENDCHAR +STARTCHAR U+5480 +ENCODING 21632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F0 +7910 +4910 +4910 +49F0 +4910 +4910 +49F0 +4910 +7910 +4910 +47FC +0000 +0000 +ENDCHAR +STARTCHAR U+5481 +ENCODING 21633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +0084 +F884 +8884 +8BFF +8884 +8884 +8884 +8884 +88FC +8884 +F884 +0084 +0084 +0084 +00FC +ENDCHAR +STARTCHAR U+5482 +ENCODING 21634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +03FC +7A20 +4A28 +4AFC +4AA8 +4AA8 +4AA8 +4AA8 +4AA8 +4AA8 +7AB8 +4A20 +0224 +03FE +0000 +ENDCHAR +STARTCHAR U+5483 +ENCODING 21635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0150 +F150 +9356 +925A +9672 +9652 +9AD2 +9252 +9252 +9256 +F250 +0250 +0241 +0263 +023E +ENDCHAR +STARTCHAR U+5484 +ENCODING 21636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0248 +7A48 +4A48 +4A48 +4BF8 +4A48 +4840 +4A48 +4A48 +7A48 +4A48 +43F8 +0208 +0000 +ENDCHAR +STARTCHAR U+5485 +ENCODING 21637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +0810 +0C30 +0420 +FFFF +0000 +0000 +1FF8 +1008 +1008 +1008 +1008 +1FF8 +0000 +ENDCHAR +STARTCHAR U+5486 +ENCODING 21638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +79F8 +4A08 +4A08 +4DE8 +4928 +4928 +49E8 +7930 +4900 +4104 +0104 +00FC +0000 +ENDCHAR +STARTCHAR U+5487 +ENCODING 21639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +0010 +7880 +4A82 +4A89 +4A91 +48A0 +48C0 +7880 +4980 +0282 +0481 +007F +0000 +0000 +ENDCHAR +STARTCHAR U+5488 +ENCODING 21640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0090 +F7FE +9092 +9092 +97FE +9490 +9490 +97FF +9091 +9091 +F093 +0192 +0116 +0310 +0610 +ENDCHAR +STARTCHAR U+5489 +ENCODING 21641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F020 +93FE +9222 +9222 +9222 +9222 +9222 +97FF +9050 +F0D8 +0088 +018C +0306 +0603 +ENDCHAR +STARTCHAR U+548B +ENCODING 21643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7900 +4BFC +4A80 +4C80 +48F8 +4880 +4880 +78F8 +4880 +4080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+548C +ENCODING 21644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0400 +38F8 +0888 +0888 +7F88 +0888 +1C88 +1A88 +2A88 +4888 +08F8 +0888 +0800 +0000 +ENDCHAR +STARTCHAR U+548D +ENCODING 21645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +78C0 +4884 +4984 +493E +4BE3 +4800 +4800 +4800 +49FE +7902 +0102 +0102 +0102 +01FE +ENDCHAR +STARTCHAR U+548E +ENCODING 21646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1E20 +1260 +3450 +4C88 +0D08 +13FC +6000 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+548F +ENCODING 21647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0020 +7820 +49C0 +4844 +4864 +4FE8 +48F0 +48E0 +4950 +7950 +4248 +4444 +00C0 +0000 +ENDCHAR +STARTCHAR U+5490 +ENCODING 21648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +0088 +7888 +4908 +49FC +4B08 +4D48 +4928 +4928 +4908 +7908 +4908 +4108 +0118 +0000 +ENDCHAR +STARTCHAR U+5491 +ENCODING 21649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +F17F +9108 +97C8 +9108 +9108 +9108 +91C8 +9708 +9108 +F108 +0108 +0108 +0108 +0338 +ENDCHAR +STARTCHAR U+5492 +ENCODING 21650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +2288 +3EF8 +2288 +0000 +07C0 +0440 +0440 +0440 +0844 +1044 +203C +0000 +ENDCHAR +STARTCHAR U+5494 +ENCODING 21652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0888 +7CFC +4880 +4880 +4884 +4FFE +4880 +48A0 +4890 +7888 +4888 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+5495 +ENCODING 21653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C40 +4844 +4FFE +4840 +4840 +4848 +4BFC +4A08 +4A08 +7A08 +4A08 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR U+5496 +ENCODING 21654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +7404 +54BE +5FE4 +54A4 +54A4 +54A4 +54A4 +54A4 +54A4 +74A4 +48A4 +0ABC +1124 +2000 +ENDCHAR +STARTCHAR U+5498 +ENCODING 21656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7BFF +4890 +4910 +4AFE +4C92 +4892 +7892 +4892 +0096 +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5499 +ENCODING 21657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +08A0 +7C90 +4884 +4FFE +48A0 +48A4 +48A4 +4928 +4928 +4930 +7A20 +4262 +04A2 +0B1E +1000 +ENDCHAR +STARTCHAR U+549A +ENCODING 21658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0880 +7CF8 +4908 +4910 +4AA0 +4840 +48A0 +4910 +4A8E +4C64 +7820 +4980 +0060 +0010 +0000 +ENDCHAR +STARTCHAR U+549B +ENCODING 21659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0820 +7C20 +4BFE +4A02 +4A04 +4800 +4BFE +4820 +4820 +4820 +7820 +4820 +0020 +00A0 +0040 +ENDCHAR +STARTCHAR U+549C +ENCODING 21660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F820 +8BFF +8A01 +8A01 +8880 +8886 +889C +88F0 +8880 +F880 +0080 +0081 +00C3 +007E +ENDCHAR +STARTCHAR U+549D +ENCODING 21661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1108 +7908 +5108 +5210 +5294 +57BC +5108 +5210 +5210 +5420 +77BC +5000 +0004 +0FFE +0000 +ENDCHAR +STARTCHAR U+549F +ENCODING 21663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FF +F810 +8830 +8820 +89FE +8902 +8902 +8902 +8902 +89FE +F902 +0102 +0102 +0102 +01FE +ENDCHAR +STARTCHAR U+54A0 +ENCODING 21664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +1FFE +1004 +1FFC +0000 +7FFF +0808 +0FF8 +0808 +0FF8 +0808 +7FFF +0008 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+54A1 +ENCODING 21665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FF +F884 +8884 +88FC +8884 +8884 +8884 +88FC +8884 +8884 +F887 +00FC +0384 +0004 +0004 +ENDCHAR +STARTCHAR U+54A2 +ENCODING 21666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +0000 +1FF0 +0000 +7FFC +0400 +07E0 +0820 +0020 +0040 +0380 +0000 +ENDCHAR +STARTCHAR U+54A3 +ENCODING 21667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7A48 +494C +4950 +4950 +4844 +4FFE +4920 +4920 +4920 +7920 +4A22 +0222 +041E +0800 +ENDCHAR +STARTCHAR U+54A4 +ENCODING 21668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BFC +4A08 +4C30 +4BC0 +4840 +487C +4FC0 +4840 +7840 +4844 +4044 +003C +0000 +ENDCHAR +STARTCHAR U+54A5 +ENCODING 21669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7890 +4888 +493C +4FC4 +4840 +4840 +4BF8 +7840 +4840 +4040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+54A6 +ENCODING 21670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +7BFC +4840 +4BF8 +4848 +4848 +4BF8 +4A40 +4A44 +7BFE +4844 +00AC +0110 +0208 +0C06 +ENDCHAR +STARTCHAR U+54A7 +ENCODING 21671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +07E4 +0904 +7D04 +49D4 +4A54 +4A54 +4A54 +4D54 +4894 +4894 +7914 +4904 +0204 +0414 +0808 +ENDCHAR +STARTCHAR U+54A8 +ENCODING 21672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +79FC +0244 +0448 +00B0 +1910 +6208 +0FE4 +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+54A9 +ENCODING 21673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +0910 +7CA0 +4BFC +4840 +4840 +4848 +4BFC +4840 +4840 +4844 +7FFE +4840 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U+54AA +ENCODING 21674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C44 +4A48 +4950 +4844 +4FFE +4840 +48E0 +48D0 +4950 +7948 +4A46 +0444 +0840 +0040 +ENDCHAR +STARTCHAR U+54AB +ENCODING 21675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1EF8 +1288 +1288 +1288 +1288 +1EF8 +1A60 +1850 +1488 +1508 +2200 +2180 +407C +0000 +ENDCHAR +STARTCHAR U+54AC +ENCODING 21676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FFC +4910 +4908 +4B14 +4C94 +4890 +4860 +7860 +4860 +4090 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+54AD +ENCODING 21677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0820 +7C24 +4BFE +4820 +4820 +49FC +4800 +4804 +49FE +4904 +7904 +4904 +0104 +01FC +0104 +ENDCHAR +STARTCHAR U+54AE +ENCODING 21678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0120 +F120 +9120 +93FE +9220 +9420 +9020 +97FF +90A8 +90A8 +F1AC +0124 +0326 +0623 +0020 +ENDCHAR +STARTCHAR U+54AF +ENCODING 21679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +79F0 +4910 +4B20 +4CA0 +4860 +4998 +4FF4 +7910 +4910 +4110 +01F0 +0110 +0000 +ENDCHAR +STARTCHAR U+54B0 +ENCODING 21680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +01FF +7A01 +48F9 +4889 +48F9 +4889 +48F9 +7889 +4801 +0002 +0024 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+54B1 +ENCODING 21681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0844 +7DFE +4904 +4904 +4904 +49FC +4904 +4904 +4904 +49FC +7904 +4904 +0104 +01FC +0104 +ENDCHAR +STARTCHAR U+54B2 +ENCODING 21682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +0110 +7920 +4BF8 +4840 +4840 +4840 +4FFC +4840 +78A0 +48A0 +4110 +0608 +1804 +0000 +ENDCHAR +STARTCHAR U+54B3 +ENCODING 21683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FFC +4840 +4A48 +4990 +48A0 +4848 +4890 +7B20 +4860 +4090 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+54B4 +ENCODING 21684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0884 +7FFE +4880 +48A0 +4920 +4924 +4AAC +4CB0 +4920 +7850 +4850 +0088 +010E +0204 +ENDCHAR +STARTCHAR U+54B6 +ENCODING 21686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +01F8 +7820 +4820 +4FFF +4820 +4820 +49FC +4904 +7904 +4904 +0104 +01FC +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+54B7 +ENCODING 21687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0090 +F092 +9696 +9394 +9090 +9090 +9090 +909C +9396 +9693 +F090 +0190 +0111 +0313 +0E0E +ENDCHAR +STARTCHAR U+54B8 +ENCODING 21688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +0048 +1FFC +1040 +17C8 +1028 +17A8 +14B0 +1490 +14B4 +27AC +244C +4084 +0000 +ENDCHAR +STARTCHAR U+54B9 +ENCODING 21689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +F3FE +9202 +9242 +9040 +9040 +97FF +9084 +918C +9108 +F3D8 +0070 +00D8 +018C +0706 +ENDCHAR +STARTCHAR U+54BA +ENCODING 21690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F800 +8800 +89FC +8904 +8904 +89FC +8904 +8904 +8904 +F9FC +0000 +0000 +07FF +0000 +ENDCHAR +STARTCHAR U+54BB +ENCODING 21691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +0120 +1120 +7A20 +5224 +57FE +5A20 +5270 +5268 +52A8 +52A8 +72A6 +5324 +0220 +0220 +0220 +ENDCHAR +STARTCHAR U+54BC +ENCODING 21692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +09E0 +0920 +0920 +3FF8 +2008 +27C8 +2448 +2448 +27C8 +2448 +2018 +0000 +ENDCHAR +STARTCHAR U+54BD +ENCODING 21693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7A48 +4A48 +4A48 +4BF8 +4A48 +4A48 +4AA8 +7A98 +4B18 +4208 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+54BE +ENCODING 21694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4848 +4850 +4FFC +4840 +4888 +4990 +4EE0 +7880 +4888 +4088 +0078 +0000 +ENDCHAR +STARTCHAR U+54BF +ENCODING 21695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +11FE +7A44 +5244 +5644 +5BFE +5244 +5244 +5244 +53FC +7244 +5240 +0240 +0280 +0300 +ENDCHAR +STARTCHAR U+54C0 +ENCODING 21696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0000 +0FE0 +0820 +0820 +0FE8 +0308 +0C90 +74A0 +0440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+54C1 +ENCODING 21697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FC0 +0840 +0840 +0840 +0FC0 +0840 +0000 +7CF8 +4488 +4488 +4488 +7CF8 +4488 +0000 +ENDCHAR +STARTCHAR U+54C2 +ENCODING 21698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +78A0 +48A0 +4BF8 +4AA8 +4AA8 +4AA8 +4B38 +7B38 +4A08 +4208 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+54C3 +ENCODING 21699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +0201 +7A01 +4AFD +4A01 +4A79 +4A49 +4A49 +4A79 +7A49 +4A01 +0201 +0205 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+54C4 +ENCODING 21700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0120 +7920 +4920 +4FF8 +4920 +4920 +4920 +4920 +7FFC +4920 +4110 +0208 +0408 +0000 +ENDCHAR +STARTCHAR U+54C5 +ENCODING 21701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0080 +79FF +4A01 +4889 +4955 +4925 +4955 +498D +7905 +49FD +0001 +0012 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+54C6 +ENCODING 21702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7CFC +4908 +4A90 +4860 +4840 +49A0 +4E7E +4884 +4988 +7A50 +4820 +0040 +0180 +0600 +ENDCHAR +STARTCHAR U+54C7 +ENCODING 21703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4840 +4840 +4FFC +4840 +4840 +4BF8 +7840 +4840 +4040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+54C8 +ENCODING 21704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +78A0 +48A0 +4910 +4BF8 +4C04 +4800 +49F0 +7910 +4910 +4110 +01F0 +0110 +0000 +ENDCHAR +STARTCHAR U+54C9 +ENCODING 21705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0890 +3F88 +0888 +0880 +7FFC +0048 +3E48 +2250 +2230 +2220 +3E54 +228C +2004 +0000 +ENDCHAR +STARTCHAR U+54CA +ENCODING 21706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7BFF +4840 +4840 +48FE +4882 +4982 +4AFE +4882 +4882 +78FE +0082 +0082 +0082 +008E +ENDCHAR +STARTCHAR U+54CC +ENCODING 21708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +003C +7BC0 +4A04 +4A18 +4AE0 +4AA0 +4AA4 +4AA8 +4A90 +4A90 +7A90 +4488 +04AE +08C4 +0080 +ENDCHAR +STARTCHAR U+54CD +ENCODING 21709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0840 +7C84 +4BFE +4A04 +4A04 +4AF4 +4A94 +4A94 +4A94 +4A94 +7AF4 +4A04 +0204 +0214 +0208 +ENDCHAR +STARTCHAR U+54CE +ENCODING 21710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0090 +0894 +7FFE +4890 +4890 +4908 +4908 +4890 +4890 +4860 +7840 +48A0 +0110 +020E +0404 +ENDCHAR +STARTCHAR U+54CF +ENCODING 21711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +09FC +7D08 +4908 +49F8 +4908 +4908 +49F8 +4944 +4948 +4930 +7920 +4910 +014E +0184 +0100 +ENDCHAR +STARTCHAR U+54D0 +ENCODING 21712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7E00 +4A08 +4BFC +4A20 +4A20 +4AF8 +4A20 +4A20 +4A28 +7BFC +4A00 +0204 +03FE +0000 +ENDCHAR +STARTCHAR U+54D1 +ENCODING 21713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7C90 +4890 +4890 +4890 +4C92 +4A94 +4A94 +4998 +4890 +7890 +4890 +0094 +07FE +0000 +ENDCHAR +STARTCHAR U+54D2 +ENCODING 21714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7020 +5420 +5224 +52FE +5020 +5E20 +5220 +5250 +5248 +728C +5304 +0600 +0906 +00FC +ENDCHAR +STARTCHAR U+54D3 +ENCODING 21715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0888 +7CFC +4B80 +4848 +4850 +4862 +4B92 +480E +4FF8 +4920 +7920 +4922 +0222 +041E +1800 +ENDCHAR +STARTCHAR U+54D4 +ENCODING 21716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0220 +7A24 +4BA8 +4A30 +4A24 +4AA4 +4B1C +4840 +4844 +4FFE +7840 +4840 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U+54D5 +ENCODING 21717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0820 +7D24 +4924 +4924 +49FC +4844 +4840 +48FC +4984 +4A44 +7828 +4810 +0060 +0180 +0600 +ENDCHAR +STARTCHAR U+54D6 +ENCODING 21718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +01FF +7A10 +4810 +4BFE +4910 +4910 +4910 +7FFF +4810 +0010 +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+54D7 +ENCODING 21719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +08A4 +7D2C +4930 +4B60 +4D22 +4922 +491E +4940 +4844 +4FFE +7840 +4840 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U+54D8 +ENCODING 21720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0178 +7A00 +4C00 +4880 +48FC +4910 +4B10 +4D10 +7910 +4910 +4110 +0110 +0130 +0000 +ENDCHAR +STARTCHAR U+54D9 +ENCODING 21721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +08A0 +7CA0 +4910 +4A08 +4DF6 +4800 +4804 +4FFE +4880 +7880 +4910 +0208 +07FC +0004 +ENDCHAR +STARTCHAR U+54DA +ENCODING 21722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01F8 +0910 +7D10 +4910 +4910 +4A4C +4840 +4FFE +4840 +48E0 +78D0 +4948 +024E +0C44 +0040 +ENDCHAR +STARTCHAR U+54DC +ENCODING 21724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +7824 +4BFE +4908 +4890 +4860 +4890 +490E +4E94 +4890 +7890 +4890 +0110 +0210 +0410 +ENDCHAR +STARTCHAR U+54DD +ENCODING 21725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0820 +7C20 +49FE +4942 +4A44 +4840 +48A0 +48A4 +4928 +4990 +7A90 +4488 +08AE +00C4 +0080 +ENDCHAR +STARTCHAR U+54DE +ENCODING 21726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0040 +0888 +7D04 +4BFE +4822 +4928 +49FC +4920 +4A20 +4824 +7BFE +4820 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+54DF +ENCODING 21727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1120 +7924 +523E +5244 +5484 +5F04 +5244 +5424 +5FA4 +5004 +7184 +4E04 +0444 +0028 +0010 +ENDCHAR +STARTCHAR U+54E0 +ENCODING 21728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0120 +F120 +93FE +9220 +9020 +9020 +97FF +9000 +9000 +91FC +F104 +0104 +0104 +0104 +01FC +ENDCHAR +STARTCHAR U+54E1 +ENCODING 21729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+54E2 +ENCODING 21730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7840 +49F0 +4840 +4840 +4FFC +4910 +4910 +7FFC +4910 +4110 +0210 +0410 +0000 +ENDCHAR +STARTCHAR U+54E4 +ENCODING 21732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0140 +0121 +0102 +7BF4 +4909 +4942 +4944 +4949 +4942 +7944 +4958 +0241 +0441 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+54E5 +ENCODING 21733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0020 +1F20 +1120 +1F20 +0020 +7FFC +0020 +1F20 +1120 +1F20 +1120 +0060 +0000 +ENDCHAR +STARTCHAR U+54E6 +ENCODING 21734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +0128 +7F24 +4924 +4920 +4FFC +4928 +4928 +4990 +7F10 +4934 +414C +018C +0304 +0000 +ENDCHAR +STARTCHAR U+54E7 +ENCODING 21735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +7BFC +4840 +4840 +4844 +4FFE +48A0 +4AA8 +4AA4 +7AA4 +4524 +0920 +0220 +04A0 +0040 +ENDCHAR +STARTCHAR U+54E8 +ENCODING 21736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0150 +7948 +4A44 +4C44 +4BF8 +4A08 +4BF8 +4A08 +7BF8 +4A08 +4208 +0208 +0218 +0000 +ENDCHAR +STARTCHAR U+54E9 +ENCODING 21737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7A48 +4A48 +4BF8 +4A48 +4A48 +4BF8 +4840 +7BF8 +4840 +4040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+54EA +ENCODING 21738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FDE +7252 +5254 +5FD4 +5254 +5258 +5254 +5FD2 +5252 +5252 +7452 +545A +0954 +1090 +0010 +ENDCHAR +STARTCHAR U+54EB +ENCODING 21739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +01FE +0104 +7904 +4904 +49FC +4820 +4820 +493C +4920 +7920 +49A0 +0260 +043F +0000 +0000 +ENDCHAR +STARTCHAR U+54EC +ENCODING 21740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +01FF +F104 +9304 +9274 +9654 +9654 +9A54 +9254 +9254 +9274 +F204 +0204 +0204 +0204 +021C +ENDCHAR +STARTCHAR U+54ED +ENCODING 21741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +2288 +3EF8 +2288 +0120 +0110 +7FFC +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+54EE +ENCODING 21742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0088 +7BE8 +4890 +4890 +4FFC +4840 +49F8 +4B30 +7C40 +4FFC +4040 +0040 +00C0 +0000 +ENDCHAR +STARTCHAR U+54EF +ENCODING 21743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FC +F204 +9204 +93FC +9204 +9204 +93FC +9204 +9204 +93FC +F090 +0090 +0191 +0313 +0E0E +ENDCHAR +STARTCHAR U+54F1 +ENCODING 21745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +7C10 +4410 +45FF +4501 +457D +4408 +4410 +7DFF +4410 +0010 +0010 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+54F2 +ENCODING 21746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08E0 +7F80 +08FC +0E90 +7890 +0910 +1A10 +0000 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+54F3 +ENCODING 21747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +020C +7270 +5FC0 +5240 +5244 +527E +52C8 +5348 +5E48 +5248 +7248 +5288 +0288 +0B08 +0408 +ENDCHAR +STARTCHAR U+54F6 +ENCODING 21750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F78F +9088 +9088 +9000 +93FE +9020 +9020 +97FF +9020 +F020 +0020 +0020 +0020 +00E0 +ENDCHAR +STARTCHAR U+54F7 +ENCODING 21751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0018 +79F0 +4802 +4922 +4894 +4800 +4804 +4BFF +7884 +4844 +0004 +0014 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+54F8 +ENCODING 21752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +07FE +0124 +7A22 +4C21 +4880 +4888 +4FFF +4888 +7888 +4850 +0020 +0050 +078F +0000 +0000 +ENDCHAR +STARTCHAR U+54FA +ENCODING 21754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +7FFC +4840 +4BF8 +4A48 +4A48 +4BF8 +4A48 +7A48 +4BF8 +4248 +0248 +0258 +0000 +ENDCHAR +STARTCHAR U+54FB +ENCODING 21755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +0104 +79FC +4904 +49FC +4800 +49FC +4820 +7820 +4BFE +0020 +0020 +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+54FC +ENCODING 21756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0824 +7FFE +4808 +49FC +4908 +4908 +49F8 +4800 +4BFC +4808 +7830 +4820 +0020 +00A0 +0040 +ENDCHAR +STARTCHAR U+54FD +ENCODING 21757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7840 +4BF8 +4A48 +4BF8 +4A48 +4BF8 +4A40 +7980 +4880 +4140 +0230 +0C0C +0000 +ENDCHAR +STARTCHAR U+54FE +ENCODING 21758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +030C +7908 +4BFC +4A04 +4A04 +4A04 +4A04 +4BFC +4890 +4890 +7890 +0190 +0111 +031B +0E0E +ENDCHAR +STARTCHAR U+54FF +ENCODING 21759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +7F7E +0944 +1144 +1544 +627C +0000 +FFFE +0010 +1F90 +1090 +1090 +1F90 +1050 +0020 +ENDCHAR +STARTCHAR U+5500 +ENCODING 21760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +0038 +F3E0 +9020 +97FF +90A8 +91AC +9727 +9000 +93F8 +9048 +F04E +00C2 +0082 +0182 +070E +ENDCHAR +STARTCHAR U+5501 +ENCODING 21761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0824 +7FFE +4800 +4808 +4BFC +4800 +4BFC +4800 +4804 +4BFE +7A04 +4A04 +0204 +03FC +0204 +ENDCHAR +STARTCHAR U+5503 +ENCODING 21763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +01FE +0208 +7810 +49FF +4911 +49FF +4911 +4911 +79FF +4901 +0101 +0105 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+5504 +ENCODING 21764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F8 +3D08 +2508 +25F8 +2508 +2508 +25F8 +2508 +3D08 +25F8 +2090 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+5505 +ENCODING 21765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0060 +00F0 +F198 +930C +9EF7 +9000 +91FC +9004 +9008 +9010 +9020 +F3FC +0204 +0204 +0204 +03FC +ENDCHAR +STARTCHAR U+5506 +ENCODING 21766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0090 +7918 +4FE4 +4920 +4924 +4A9C +4CF0 +4910 +7B20 +4CA0 +4040 +01B0 +0E0C +0000 +ENDCHAR +STARTCHAR U+5507 +ENCODING 21767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1000 +17F0 +1000 +1FFC +1490 +2760 +581C +0FF0 +0810 +0810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+5508 +ENCODING 21768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +7904 +4904 +49FC +4800 +4BFE +4A22 +4A22 +4A22 +4BFE +7A00 +0200 +0201 +0303 +01FE +ENDCHAR +STARTCHAR U+5509 +ENCODING 21769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +0890 +7D08 +4BFC +4804 +4910 +49F8 +4A40 +4844 +4FFE +7840 +48A0 +0090 +010E +0604 +ENDCHAR +STARTCHAR U+550A +ENCODING 21770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +0020 +7924 +4924 +4AAA +4C71 +4820 +4820 +7850 +4888 +0104 +0202 +0C01 +0000 +0000 +ENDCHAR +STARTCHAR U+550B +ENCODING 21771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0050 +0088 +7904 +4AFA +4C21 +4820 +4BFE +4870 +78A8 +4924 +0222 +0020 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+550C +ENCODING 21772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +078E +F138 +9108 +9208 +9228 +97AE +90A8 +92A8 +92A8 +92A8 +93A8 +F17F +0380 +06E0 +0C3F +ENDCHAR +STARTCHAR U+550D +ENCODING 21773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +F7FE +9402 +9402 +91F8 +9000 +9000 +97FE +9090 +9090 +F090 +0190 +0111 +0313 +0E0E +ENDCHAR +STARTCHAR U+550E +ENCODING 21774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0061 +0389 +7889 +4889 +4BE9 +4889 +4989 +49C9 +4AA9 +4A89 +7C89 +4889 +0089 +0081 +0081 +0007 +ENDCHAR +STARTCHAR U+550F +ENCODING 21775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +01A0 +78E0 +4B90 +4880 +4FFC +4940 +4A40 +4BF8 +7E48 +4A48 +4248 +0258 +0040 +0000 +ENDCHAR +STARTCHAR U+5510 +ENCODING 21776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1080 +17F0 +1090 +1FFC +1090 +17F0 +1000 +17F0 +2410 +2410 +47F0 +0410 +0000 +ENDCHAR +STARTCHAR U+5511 +ENCODING 21777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +0248 +7A48 +4A48 +4A48 +4D54 +48E2 +4840 +4848 +4BFC +7840 +4840 +0044 +0FFE +0000 +ENDCHAR +STARTCHAR U+5512 +ENCODING 21778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +0048 +7848 +4BFF +4A49 +4A49 +4A89 +4B0F +4A01 +7AFD +4A01 +0201 +03FF +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+5514 +ENCODING 21780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7880 +4880 +4BF0 +4910 +4910 +4FFC +4800 +7BF8 +4A08 +4208 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+5515 +ENCODING 21781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0060 +F040 +93FE +9202 +9202 +93FE +9202 +9202 +93FE +F020 +0020 +07FF +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+5516 +ENCODING 21782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +78A0 +48A0 +4BF8 +4AA8 +4AA8 +4AA8 +4BF8 +7AA8 +48A0 +40A0 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5517 +ENCODING 21783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7BFE +4820 +4820 +4FFF +4820 +4920 +493E +7920 +4920 +02A0 +0460 +083F +0000 +0000 +ENDCHAR +STARTCHAR U+551A +ENCODING 21786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +0004 +03FE +7804 +49FC +4800 +4BFF +4A01 +4AFA +4888 +7850 +4820 +0050 +038E +0000 +0000 +ENDCHAR +STARTCHAR U+551B +ENCODING 21787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +7BFC +4840 +4BF8 +4840 +4FFE +4880 +49F8 +4908 +4910 +7AA0 +4440 +00B0 +030E +0C04 +ENDCHAR +STARTCHAR U+551C +ENCODING 21788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0080 +3FFE +01C0 +02A0 +0C98 +7087 +0080 +0020 +3F23 +213C +2121 +3F21 +213F +ENDCHAR +STARTCHAR U+5520 +ENCODING 21792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0094 +7BFE +4890 +4890 +4BFE +4A42 +4C44 +4BF8 +4848 +4888 +7888 +4908 +0208 +0450 +0820 +ENDCHAR +STARTCHAR U+5522 +ENCODING 21794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0244 +094C +7D50 +4848 +4BFC +4A08 +4A48 +4A48 +4A48 +4A48 +7A48 +4AA8 +0090 +010C +0604 +ENDCHAR +STARTCHAR U+5523 +ENCODING 21795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0088 +7BFC +4A08 +4A08 +4BF8 +4A08 +4A08 +4BF8 +4A40 +7844 +407E +0FC0 +0044 +0044 +003C +ENDCHAR +STARTCHAR U+5524 +ENCODING 21796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7CF8 +4910 +4A24 +49FE +4924 +4924 +4924 +4924 +4FFE +7820 +4850 +0088 +0106 +0604 +ENDCHAR +STARTCHAR U+5526 +ENCODING 21798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0210 +7910 +4834 +4852 +4C91 +4A10 +4912 +4812 +7892 +4904 +0208 +0410 +00E0 +0000 +0000 +ENDCHAR +STARTCHAR U+5527 +ENCODING 21799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +07C4 +74BE +54A4 +57A4 +54A4 +54A4 +57A4 +54A4 +5424 +5524 +74B4 +5528 +0620 +0020 +0020 +ENDCHAR +STARTCHAR U+552A +ENCODING 21802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0844 +7FFE +4840 +4BFC +4840 +4FFE +48A0 +4950 +4BF8 +4C46 +7840 +47FC +0040 +0040 +0040 +ENDCHAR +STARTCHAR U+552B +ENCODING 21803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F050 +90D8 +918C +9306 +96FB +9020 +9020 +93FE +9020 +F222 +0326 +0124 +07FF +0000 +ENDCHAR +STARTCHAR U+552C +ENCODING 21804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +087C +7C40 +4BFE +4A42 +4A5C +4BE0 +4A44 +4A3C +4A10 +4AF8 +7A90 +4C90 +0892 +1112 +060E +ENDCHAR +STARTCHAR U+552D +ENCODING 21805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +0044 +01FF +7C44 +4444 +447C +4444 +447C +4444 +7C44 +45FF +0044 +0082 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+552E +ENCODING 21806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0FFC +1840 +1FF8 +2840 +4FF8 +0840 +0FFC +0000 +0FF0 +0810 +0810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+552F +ENCODING 21807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0090 +7920 +49FC +4B20 +4B20 +4DF8 +4920 +4920 +79F8 +4920 +4120 +01FC +0100 +0000 +ENDCHAR +STARTCHAR U+5530 +ENCODING 21808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +17C4 +7C54 +5454 +57D4 +5514 +5514 +57D4 +5554 +7554 +4D54 +1544 +1544 +25C4 +0114 +0108 +ENDCHAR +STARTCHAR U+5531 +ENCODING 21809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F0 +7910 +49F0 +4910 +49F0 +4910 +4800 +7BF8 +4A08 +43F8 +0208 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+5532 +ENCODING 21810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +00C0 +F39E +9202 +9202 +93DE +9202 +9202 +93FE +9090 +9090 +F090 +0190 +0111 +0313 +060E +ENDCHAR +STARTCHAR U+5533 +ENCODING 21811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7800 +4BF8 +4A08 +4A08 +4BF8 +4A50 +4A48 +7BFC +4C40 +44A0 +0910 +060C +0000 +ENDCHAR +STARTCHAR U+5534 +ENCODING 21812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0088 +7850 +4BFE +4820 +4BFE +4820 +4FFF +4890 +7890 +4890 +0111 +0211 +0C1F +0000 +0000 +ENDCHAR +STARTCHAR U+5535 +ENCODING 21813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7FFF +4850 +48A8 +4924 +4E23 +49FC +4924 +79FC +4924 +41FC +0124 +0021 +003F +0000 +ENDCHAR +STARTCHAR U+5536 +ENCODING 21814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F3FE +9088 +9088 +9088 +97FF +9000 +9000 +91FC +9104 +F104 +01FC +0104 +0104 +01FC +ENDCHAR +STARTCHAR U+5537 +ENCODING 21815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0844 +7FFE +4880 +4908 +4BFC +4804 +49F8 +4908 +49F8 +4908 +79F8 +4908 +0108 +0128 +0110 +ENDCHAR +STARTCHAR U+5538 +ENCODING 21816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +78A0 +4910 +4EEC +4800 +4BF8 +4810 +48A0 +7850 +4D48 +4504 +0914 +00F0 +0000 +ENDCHAR +STARTCHAR U+5539 +ENCODING 21817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +7910 +4FE8 +4A28 +4A44 +4AA4 +4B90 +4A90 +7A80 +4CA0 +4490 +0888 +1308 +0000 +ENDCHAR +STARTCHAR U+553B +ENCODING 21819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F7FF +9020 +9124 +9124 +9124 +93AE +92AA +9673 +9070 +F0A8 +01AC +0326 +0623 +0020 +ENDCHAR +STARTCHAR U+553C +ENCODING 21820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0050 +0BF8 +7C00 +4910 +48A0 +4FFC +4880 +4884 +4FFE +4910 +7A10 +4920 +00C0 +0130 +0608 +ENDCHAR +STARTCHAR U+553D +ENCODING 21821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0202 +020E +F238 +9FA0 +9220 +923F +9324 +96A4 +96A4 +9A24 +9224 +F224 +0264 +0244 +02C4 +0204 +ENDCHAR +STARTCHAR U+553E +ENCODING 21822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +03E0 +7840 +4BF8 +4950 +4950 +4FFC +4950 +4950 +7BF8 +4840 +4040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+553F +ENCODING 21823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0904 +7DFE +4A94 +4A94 +4C94 +4924 +4924 +4A54 +4808 +4940 +7D24 +4522 +090A +00F8 +0000 +ENDCHAR +STARTCHAR U+5540 +ENCODING 21824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7A20 +4AF8 +4A20 +4A20 +4BFC +4A20 +4A20 +7AF8 +4C20 +4420 +0BFC +1000 +0000 +ENDCHAR +STARTCHAR U+5541 +ENCODING 21825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +09FE +7D24 +4924 +49FC +4924 +4924 +49FC +4904 +4974 +4954 +7954 +4A74 +0204 +0414 +0808 +ENDCHAR +STARTCHAR U+5543 +ENCODING 21827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0948 +7D7C +4940 +4944 +4FFE +4808 +4BFC +4A08 +4BF8 +4A08 +7BF8 +4A08 +0208 +0228 +0210 +ENDCHAR +STARTCHAR U+5544 +ENCODING 21828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7840 +4888 +49C8 +4E50 +48E0 +4920 +7E70 +48A8 +4324 +0C20 +0020 +00C0 +0000 +ENDCHAR +STARTCHAR U+5545 +ENCODING 21829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +787C +4840 +4BF8 +4A08 +4BF8 +4A08 +4BF8 +7840 +4FFC +4040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5546 +ENCODING 21830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0820 +0440 +3FF8 +2488 +2498 +2FF8 +3448 +2448 +27C8 +2448 +2018 +0000 +ENDCHAR +STARTCHAR U+5547 +ENCODING 21831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0810 +0420 +7FFE +4002 +4102 +5FFA +4102 +4FF2 +4812 +4812 +4FF2 +4002 +400E +ENDCHAR +STARTCHAR U+5548 +ENCODING 21832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +00FE +0010 +7C10 +45FF +4444 +4428 +45FF +4410 +7C10 +44FE +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5549 +ENCODING 21833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +1110 +7910 +5114 +5FFE +5110 +5330 +53B8 +5558 +5554 +5554 +7992 +5110 +0110 +0110 +0110 +ENDCHAR +STARTCHAR U+554A +ENCODING 21834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +2F7E +F904 +A904 +AA14 +AA7C +AC54 +AA54 +AA54 +A954 +E974 +AD54 +0A04 +0804 +0814 +080C +ENDCHAR +STARTCHAR U+554B +ENCODING 21835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +01FC +7C11 +4492 +4454 +4410 +45FF +4410 +4438 +7C54 +4492 +0111 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+554C +ENCODING 21836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BFC +4AA8 +4CA0 +4924 +4A1C +4800 +4BF8 +7840 +4840 +4040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+554D +ENCODING 21837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F7FF +9000 +91FC +9104 +91FC +9000 +93FE +900C +9030 +F7FF +0020 +0020 +0020 +00E0 +ENDCHAR +STARTCHAR U+554E +ENCODING 21838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +20FF +7E10 +087E +0812 +0812 +7EFF +0800 +087E +0842 +0842 +0842 +087E +0842 +0000 +0000 +ENDCHAR +STARTCHAR U+554F +ENCODING 21839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +27C8 +2448 +2448 +27C8 +2448 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+5550 +ENCODING 21840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0848 +7FFC +4910 +4910 +4910 +4AA8 +4A44 +4C44 +4840 +4FFE +7840 +4840 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U+5551 +ENCODING 21841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F7FF +9020 +93FE +9022 +97FF +9022 +93FE +9020 +9120 +F13E +0120 +03A0 +06E0 +0C3F +ENDCHAR +STARTCHAR U+5552 +ENCODING 21842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +0201 +7A01 +4BFF +4A10 +4A92 +4A92 +4AFE +4A10 +7A91 +4A91 +0491 +08FF +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+5553 +ENCODING 21843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +00FC +3F90 +2290 +2260 +3E60 +2390 +200C +4FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5555 +ENCODING 21845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +1204 +7BFE +5404 +5A24 +53F4 +5484 +5094 +5FFC +5084 +5494 +7494 +57F4 +0004 +0014 +0008 +ENDCHAR +STARTCHAR U+5556 +ENCODING 21846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0048 +7A48 +4AD0 +4CA0 +4910 +4A50 +4840 +4A48 +7AC8 +4CB0 +4120 +0210 +0C0C +0000 +ENDCHAR +STARTCHAR U+5557 +ENCODING 21847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +78F8 +4908 +4A10 +4CE0 +4B38 +4A08 +4A08 +7BB8 +4A08 +4208 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+5558 +ENCODING 21848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F3FE +9202 +9202 +9100 +91DE +9152 +9352 +9252 +97D2 +F096 +0190 +0111 +0313 +060E +ENDCHAR +STARTCHAR U+555A +ENCODING 21850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +2004 +3FFC +0100 +FFFF +0000 +3FFC +2004 +27E4 +2424 +2424 +27E4 +2004 +3FFC +0000 +ENDCHAR +STARTCHAR U+555B +ENCODING 21851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F7FF +9020 +93FE +9022 +97FF +9022 +93FE +9040 +97FF +F084 +0108 +03F0 +005E +0783 +ENDCHAR +STARTCHAR U+555C +ENCODING 21852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F8 +7CC8 +4AA8 +4910 +4AA8 +4CC8 +4FF8 +4CC8 +7AA8 +4930 +4190 +02A8 +0C44 +0000 +ENDCHAR +STARTCHAR U+555D +ENCODING 21853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0180 +7F38 +4928 +4928 +4FE8 +4928 +4BA8 +4BA8 +7D78 +4540 +0920 +0110 +0100 +0000 +ENDCHAR +STARTCHAR U+555E +ENCODING 21854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FE +0090 +7090 +5090 +579E +5402 +5402 +5402 +5402 +779E +5090 +0090 +0090 +0FFF +0000 +ENDCHAR +STARTCHAR U+555F +ENCODING 21855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0E40 +70FE +7F04 +4144 +4144 +7F44 +4044 +5F44 +5128 +5110 +5110 +5F28 +80C6 +0000 +0000 +ENDCHAR +STARTCHAR U+5560 +ENCODING 21856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0306 +3E7C +2040 +3F7F +2448 +64C8 +C588 +0408 +0000 +3FFC +2004 +2004 +2004 +2004 +3FFC +0000 +ENDCHAR +STARTCHAR U+5561 +ENCODING 21857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0890 +7C94 +4F9E +4890 +4890 +4894 +4F9E +4890 +4890 +4890 +7894 +4F9E +0090 +0090 +0090 +ENDCHAR +STARTCHAR U+5562 +ENCODING 21858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +0010 +0010 +7DFF +4511 +4555 +4555 +45BB +4511 +4511 +7D11 +4511 +0101 +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+5563 +ENCODING 21859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +7238 +57E8 +5528 +5928 +5FE8 +5128 +55E8 +7528 +5528 +45F0 +0720 +0C20 +0000 +ENDCHAR +STARTCHAR U+5564 +ENCODING 21860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0888 +7FFC +4A48 +4A48 +4BF8 +4A48 +4A88 +4BF8 +4880 +4944 +4FFE +7840 +4840 +0040 +0040 +ENDCHAR +STARTCHAR U+5565 +ENCODING 21861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7CA0 +4910 +4BFE +4C44 +4840 +4FFC +4840 +4848 +4BFC +7A08 +4A08 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR U+5566 +ENCODING 21862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0210 +7214 +5FFE +5200 +5244 +52C4 +5344 +5244 +5E48 +5228 +7228 +5228 +0200 +0BFE +0400 +ENDCHAR +STARTCHAR U+5567 +ENCODING 21863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0848 +7FFC +4840 +4BF8 +4840 +4FFE +4808 +4BFC +4A08 +4A48 +7A48 +4A48 +00B0 +010C +0604 +ENDCHAR +STARTCHAR U+556A +ENCODING 21866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +1210 +7A24 +5FFE +5244 +5244 +5244 +52C4 +537C +5E44 +5244 +7244 +5244 +0244 +0A7C +0444 +ENDCHAR +STARTCHAR U+556C +ENCODING 21868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +7FFC +0100 +0920 +0544 +FFFE +0000 +3FF8 +2008 +27C8 +2448 +27C8 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+556D +ENCODING 21869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +1110 +7914 +57FE +5210 +5214 +557E +5510 +5F90 +5120 +517E +7384 +4D28 +0110 +010C +0104 +ENDCHAR +STARTCHAR U+556E +ENCODING 21870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0848 +7D7C +4940 +4940 +4944 +4FFE +4800 +4A44 +4A44 +4A44 +4AB4 +7B14 +4A04 +03FC +0204 +ENDCHAR +STARTCHAR U+5575 +ENCODING 21877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0410 +7210 +52FE +5892 +5494 +5090 +52FC +52A4 +54A4 +5CA8 +7490 +5528 +0528 +0646 +0484 +ENDCHAR +STARTCHAR U+5576 +ENCODING 21878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0820 +7C20 +4BFE +4A02 +4C04 +4800 +4BFE +4820 +4920 +493C +7920 +4920 +02A0 +0460 +081E +ENDCHAR +STARTCHAR U+5577 +ENCODING 21879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +17BC +7CA4 +54A8 +57A8 +54B0 +54A8 +57A4 +5424 +5424 +7524 +54B4 +05A8 +0620 +0020 +ENDCHAR +STARTCHAR U+5578 +ENCODING 21880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +7BFC +4848 +4FFE +4848 +4BF8 +4840 +4A48 +4AE8 +4AD8 +7B58 +4248 +0448 +0848 +0040 +ENDCHAR +STARTCHAR U+557B +ENCODING 21883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0440 +0280 +3FFC +2108 +5FF0 +1110 +1130 +0100 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+557C +ENCODING 21884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4910 +48A0 +4BFC +4A48 +4C40 +4BF8 +7A48 +4A48 +4248 +0258 +0040 +0000 +ENDCHAR +STARTCHAR U+557D +ENCODING 21885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0070 +0088 +7904 +4AFE +4C01 +48FC +4884 +48FC +7800 +4884 +03FF +0084 +0084 +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+557E +ENCODING 21886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0190 +7F10 +4914 +4934 +4FF8 +4950 +4990 +4B50 +7B70 +4D28 +4928 +0144 +0184 +0000 +ENDCHAR +STARTCHAR U+557F +ENCODING 21887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +07FF +F104 +9104 +91FC +9104 +9104 +91FC +9104 +9104 +9FFF +F248 +0248 +038F +0200 +03FF +ENDCHAR +STARTCHAR U+5580 +ENCODING 21888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BFC +4A88 +4CF0 +4890 +49A0 +4A60 +4890 +7BFC +4D10 +4110 +01F0 +0110 +0000 +ENDCHAR +STARTCHAR U+5581 +ENCODING 21889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +13FC +7A48 +5248 +53F8 +5248 +5248 +53F8 +5044 +57FE +7444 +5454 +05F4 +0404 +0414 +0408 +ENDCHAR +STARTCHAR U+5582 +ENCODING 21890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7E48 +4A48 +4BF8 +4A48 +4A48 +4BF8 +4800 +4FFE +4A88 +7A50 +4A20 +0290 +030E +0204 +ENDCHAR +STARTCHAR U+5583 +ENCODING 21891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FFC +4840 +4BF8 +4B28 +4AA8 +4BF8 +4A48 +7BF8 +4A48 +4248 +0248 +0218 +0000 +ENDCHAR +STARTCHAR U+5584 +ENCODING 21892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +3FF8 +0100 +1FF0 +0100 +3FF8 +0920 +7FFC +0000 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5586 +ENCODING 21894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +0410 +7FFF +0410 +0410 +3F7E +0000 +0000 +3F7E +2142 +2142 +2142 +2142 +3F7E +2142 +ENDCHAR +STARTCHAR U+5587 +ENCODING 21895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +0108 +7FE8 +5128 +57E8 +5568 +5568 +57E8 +5128 +73A8 +5348 +4548 +0908 +0118 +0000 +ENDCHAR +STARTCHAR U+5588 +ENCODING 21896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0224 +7BA8 +4A30 +4A22 +4AA2 +4B5E +4888 +49FC +4908 +7908 +49F8 +0108 +0108 +01F8 +0108 +ENDCHAR +STARTCHAR U+5589 +ENCODING 21897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F0 +7910 +4BFC +4A40 +4E40 +4AFC +4AA0 +4B20 +7BFC +4A20 +4250 +0288 +0304 +0000 +ENDCHAR +STARTCHAR U+558A +ENCODING 21898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +7048 +57FC +5440 +57C8 +5428 +57A8 +56B0 +7690 +57B4 +4A4C +088C +1004 +0000 +ENDCHAR +STARTCHAR U+558B +ENCODING 21899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0150 +0150 +7FFC +4950 +4970 +4900 +49F8 +4840 +4FFC +78E0 +4950 +4648 +1844 +0040 +0000 +ENDCHAR +STARTCHAR U+558C +ENCODING 21900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F7E +2142 +2142 +3F7E +2140 +0802 +0842 +4842 +3A52 +09CE +0842 +0842 +1042 +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+558D +ENCODING 21901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0090 +7AFF +4A90 +4A91 +4A91 +4FFF +4800 +4820 +4FFF +78A8 +4924 +0222 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+558E +ENCODING 21902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FC +F204 +9204 +927C +9244 +9244 +97FE +9402 +94F2 +9492 +F492 +0492 +04F2 +0402 +040E +ENDCHAR +STARTCHAR U+558F +ENCODING 21903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0910 +7FFC +4910 +4840 +4844 +4FFE +4880 +4888 +49FC +4908 +7B08 +4508 +0908 +01F8 +0108 +ENDCHAR +STARTCHAR U+5591 +ENCODING 21905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0048 +07FC +7800 +4910 +48A4 +4FFE +4808 +4BFC +4A08 +4A08 +7BF8 +4A08 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR U+5592 +ENCODING 21906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +01E8 +F128 +932E +966B +9D48 +90C8 +91B0 +931C +9607 +9000 +F3FC +0204 +0204 +0204 +03FC +ENDCHAR +STARTCHAR U+5593 +ENCODING 21907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FF +F088 +97FF +9489 +9489 +97FF +9080 +9080 +97FF +9104 +F10C +03C8 +0078 +00CE +0783 +ENDCHAR +STARTCHAR U+5594 +ENCODING 21908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +03FE +7A04 +4A04 +4BFC +4A00 +4BFC +4A40 +4A88 +4AFC +7A20 +42FC +0420 +0424 +0BFE +1000 +ENDCHAR +STARTCHAR U+5595 +ENCODING 21909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +0010 +0020 +7BFF +4A49 +4A49 +4A79 +4A49 +4A49 +7A79 +4A49 +0249 +03FF +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+5597 +ENCODING 21911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FF +F401 +9421 +93FE +9020 +93FE +9222 +93FE +9222 +9222 +F3FE +0020 +07FF +0020 +0020 +ENDCHAR +STARTCHAR U+5598 +ENCODING 21912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0248 +7A48 +4BF8 +4800 +4FFC +4840 +4BF8 +4AA8 +7AA8 +4AA8 +42A8 +02A8 +0218 +0000 +ENDCHAR +STARTCHAR U+5599 +ENCODING 21913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F0 +7910 +4BE0 +4820 +4FFC +4888 +49C8 +4EF0 +7960 +4ED0 +4148 +0644 +0180 +0000 +ENDCHAR +STARTCHAR U+559A +ENCODING 21914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +00F0 +7920 +4A40 +4FF8 +4AA8 +4AA8 +4AB8 +4B28 +7A48 +4FFC +40A0 +0318 +0C04 +0000 +ENDCHAR +STARTCHAR U+559C +ENCODING 21916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +0000 +0FE0 +0820 +0FE0 +0440 +7FFC +0000 +1FF0 +1010 +1FF0 +0000 +ENDCHAR +STARTCHAR U+559D +ENCODING 21917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F0 +7A10 +4BF0 +4A10 +4BF0 +4880 +49F8 +4E68 +7B88 +4A08 +4228 +01E8 +0030 +0000 +ENDCHAR +STARTCHAR U+559E +ENCODING 21918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0238 +77A8 +54A8 +57A8 +54A8 +57A8 +54A8 +5428 +77A8 +5430 +47A0 +0420 +0420 +0000 +ENDCHAR +STARTCHAR U+559F +ENCODING 21919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7A48 +4BF8 +4A48 +4BF8 +4800 +49F0 +4910 +79F0 +4910 +41F0 +0110 +0130 +0000 +ENDCHAR +STARTCHAR U+55A1 +ENCODING 21921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +00FE +0012 +7DFF +4400 +44FE +4482 +44FE +4410 +7DFF +4490 +01FF +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+55A2 +ENCODING 21922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007C +0010 +0010 +7DFF +4410 +4450 +4493 +4511 +4511 +7DD7 +4511 +0111 +01FF +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+55A3 +ENCODING 21923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7BFE +4A02 +4E02 +49F2 +4912 +4912 +79F2 +0006 +0004 +001C +0000 +2444 +6666 +C223 +ENDCHAR +STARTCHAR U+55A4 +ENCODING 21924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0040 +79FC +4904 +49FC +4904 +4904 +49FC +4800 +4BFE +4820 +79FC +0020 +0020 +07FF +0000 +ENDCHAR +STARTCHAR U+55A5 +ENCODING 21925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0010 +03FF +7A44 +4BFF +4A44 +4A7C +4A00 +4A7C +7A44 +4A28 +0210 +0428 +01C7 +0000 +0000 +ENDCHAR +STARTCHAR U+55A6 +ENCODING 21926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF8 +0808 +0808 +0FF8 +0000 +7EBF +42A1 +42A1 +7EBF +0080 +2082 +2082 +2082 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+55A7 +ENCODING 21927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4A08 +4BF8 +4800 +49F0 +4910 +49F0 +7910 +49F0 +4000 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+55A8 +ENCODING 21928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +07FC +7800 +49F0 +4910 +49F0 +4800 +4BFC +4A08 +7CA0 +48A0 +40A4 +0124 +061C +0000 +ENDCHAR +STARTCHAR U+55A9 +ENCODING 21929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +7140 +5220 +57F0 +5808 +57AC +54A8 +56A8 +75D0 +56D0 +45A8 +04A8 +05A8 +0000 +ENDCHAR +STARTCHAR U+55AA +ENCODING 21930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +3D78 +2548 +3D78 +2548 +0100 +7FFC +0890 +08A0 +0840 +0E30 +700C +0000 +ENDCHAR +STARTCHAR U+55AB +ENCODING 21931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +02F8 +7FA8 +5228 +5FA8 +5228 +53C8 +5E58 +5080 +7FFC +5080 +4140 +0630 +180C +0000 +ENDCHAR +STARTCHAR U+55AC +ENCODING 21932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +0F80 +0100 +7FFC +0440 +1FF0 +644C +07C0 +3FF8 +2008 +27C8 +2448 +27C8 +2018 +0000 +ENDCHAR +STARTCHAR U+55AD +ENCODING 21933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F3FE +9088 +9070 +9088 +93FE +9208 +9238 +92E6 +920C +F23B +06E6 +040C +0C38 +00E0 +ENDCHAR +STARTCHAR U+55AE +ENCODING 21934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+55B0 +ENCODING 21936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +78A0 +49F0 +4E0C +49F0 +4910 +49F0 +4910 +79F8 +4948 +4130 +01D8 +0F04 +0000 +ENDCHAR +STARTCHAR U+55B1 +ENCODING 21937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +17FE +7C00 +55FC +5524 +5524 +55FC +5524 +5524 +55FC +5420 +7428 +49FC +0820 +1024 +03FE +ENDCHAR +STARTCHAR U+55B2 +ENCODING 21938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0188 +F108 +965F +92D1 +91B1 +9101 +9249 +97ED +9125 +9101 +F541 +0561 +0D23 +0902 +010E +ENDCHAR +STARTCHAR U+55B3 +ENCODING 21939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C48 +4FFC +48E0 +4950 +4A4E +4C44 +4BF8 +4A08 +4BF8 +7A08 +4BF8 +0000 +0FFE +0000 +ENDCHAR +STARTCHAR U+55B5 +ENCODING 21941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +1114 +7FFE +5110 +5110 +5004 +57FE +5444 +5444 +5444 +57FC +7444 +5444 +0444 +07FC +0404 +ENDCHAR +STARTCHAR U+55B6 +ENCODING 21942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0920 +3FFC +2008 +4FE0 +0820 +0820 +0FE0 +0200 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+55B7 +ENCODING 21943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +0BFC +7C40 +4914 +4FFE +4910 +4808 +4BFC +4A08 +4A48 +4A48 +7A48 +4A48 +0090 +010C +0604 +ENDCHAR +STARTCHAR U+55B9 +ENCODING 21945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +0044 +77FE +50A0 +5150 +53F8 +5C46 +53F8 +5040 +5048 +77FC +5040 +0044 +0FFE +0000 +ENDCHAR +STARTCHAR U+55BB +ENCODING 21947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +10C0 +7920 +5210 +55EE +5804 +5788 +54A8 +54A8 +57A8 +54A8 +74A8 +57A8 +0488 +04A8 +0590 +ENDCHAR +STARTCHAR U+55BD +ENCODING 21949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0A48 +7D50 +4840 +4FFC +4840 +4950 +4A48 +4880 +4FFE +4910 +7A10 +4920 +00C0 +0130 +0608 +ENDCHAR +STARTCHAR U+55BE +ENCODING 21950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +1110 +0020 +7FFE +4102 +9124 +1FF0 +2104 +FFFE +0010 +1FF8 +1010 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+55BF +ENCODING 21951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF0 +0810 +0810 +0FF0 +0000 +7E7E +4242 +4242 +7E7E +0100 +FFFF +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+55C0 +ENCODING 21952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041C +7FD4 +0414 +3F94 +0015 +7FE7 +4040 +1F3E +0022 +3FA2 +2094 +2088 +3F94 +20A2 +0000 +0000 +ENDCHAR +STARTCHAR U+55C1 +ENCODING 21953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +007C +F7D0 +941E +9410 +95FF +9511 +951C +9571 +951F +9500 +F524 +0524 +0925 +0265 +00C3 +ENDCHAR +STARTCHAR U+55C2 +ENCODING 21954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +01FC +7D11 +4492 +4454 +4440 +44FE +4510 +4410 +45FF +7C10 +0111 +0111 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+55C3 +ENCODING 21955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F7FF +9000 +91FC +9104 +91FC +9000 +93FE +9202 +92FA +F28A +028A +02FA +0202 +020E +ENDCHAR +STARTCHAR U+55C4 +ENCODING 21956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7840 +4BF0 +4A10 +4BF0 +4BF0 +4A10 +4BF0 +79F0 +4B20 +44C0 +01B0 +0E0C +0000 +ENDCHAR +STARTCHAR U+55C5 +ENCODING 21957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +7BF0 +4A10 +4BF0 +4A10 +4BF0 +4A10 +4BF0 +7888 +4FFC +40C0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+55C6 +ENCODING 21958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F0D8 +918C +9777 +9000 +91FC +9104 +91FC +9104 +91FC +F300 +02FE +0682 +0C82 +00FE +ENDCHAR +STARTCHAR U+55C7 +ENCODING 21959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0920 +1550 +2590 +7FFC +0000 +1FF0 +17D0 +1450 +17D0 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+55C8 +ENCODING 21960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0049 +0092 +0124 +7C92 +44FE +4482 +44FE +4400 +45FF +7D11 +45FF +0100 +0101 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+55C9 +ENCODING 21961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +07FC +7840 +4BF8 +4840 +4FFE +4840 +4890 +4BE0 +4848 +7BF8 +4950 +024C +0444 +0040 +ENDCHAR +STARTCHAR U+55CA +ENCODING 21962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0010 +7C10 +45FF +4400 +44FE +4482 +44FE +4482 +7CFE +4482 +00FE +0044 +0183 +0000 +0000 +ENDCHAR +STARTCHAR U+55CB +ENCODING 21963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +03FE +F0C2 +930E +9104 +97DF +9249 +96D3 +9000 +93FE +9202 +F3FE +0202 +03FE +0202 +020E +ENDCHAR +STARTCHAR U+55CC +ENCODING 21964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +0110 +7804 +4FFE +48A0 +4918 +4A08 +4800 +4BF8 +4AA8 +7AA8 +4AA8 +02A8 +0FFE +0000 +ENDCHAR +STARTCHAR U+55CD +ENCODING 21965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +045E +1294 +7FF4 +5114 +555C +5554 +5554 +5554 +555C +57D4 +7154 +5124 +0224 +0454 +0888 +ENDCHAR +STARTCHAR U+55CE +ENCODING 21966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F220 +9220 +93FC +9220 +9220 +93FC +9220 +9220 +93FF +F001 +0011 +0559 +0D4B +0806 +ENDCHAR +STARTCHAR U+55CF +ENCODING 21967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +07FF +7888 +4870 +4888 +4904 +4A22 +4C21 +7BFE +48A8 +0124 +0222 +0421 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+55D0 +ENCODING 21968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +0421 +79FC +4820 +49FC +4820 +4FFF +7800 +49FC +0104 +0104 +01FC +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+55D1 +ENCODING 21969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +0BFC +7C40 +4844 +4FFE +4880 +4910 +4BF8 +4800 +4BF8 +7AA8 +4AA8 +02A8 +0FFE +0000 +ENDCHAR +STARTCHAR U+55D2 +ENCODING 21970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0114 +0FFE +7950 +4840 +48A0 +4910 +4A0E +4DF4 +4800 +4BF8 +7A08 +4A08 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR U+55D3 +ENCODING 21971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03F8 +1110 +F8E0 +9110 +9208 +97BC +94A4 +9318 +94A4 +9040 +9FFE +90E0 +F150 +924E +0C44 +0040 +ENDCHAR +STARTCHAR U+55D4 +ENCODING 21972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0118 +01E0 +7904 +48FC +4AF8 +4A88 +4AF8 +4A88 +4AF8 +7A88 +4AF8 +43FC +0198 +0E04 +0000 +ENDCHAR +STARTCHAR U+55D5 +ENCODING 21973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FF +0080 +7CFE +4480 +44FF +4549 +4646 +4452 +4465 +7DFF +4444 +0024 +0004 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+55D6 +ENCODING 21974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0148 +7A5C +4A48 +4A48 +4B58 +4A48 +4A48 +4BF8 +4840 +7BF8 +4910 +00A0 +0040 +01B0 +0E0E +ENDCHAR +STARTCHAR U+55D7 +ENCODING 21975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +0104 +F13C +9124 +9124 +97FF +9401 +9401 +91FC +9104 +91FC +F104 +01FC +0104 +0104 +011C +ENDCHAR +STARTCHAR U+55D8 +ENCODING 21976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +003C +F3C2 +9466 +9624 +9240 +90C8 +9190 +90A4 +907E +93C3 +F020 +07FF +0050 +018C +0707 +ENDCHAR +STARTCHAR U+55D9 +ENCODING 21977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +7904 +4888 +4FFF +4C01 +4820 +4FFF +4880 +78FE +4882 +0082 +0102 +021C +0000 +0000 +ENDCHAR +STARTCHAR U+55DA +ENCODING 21978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +7BF0 +4A10 +4A10 +4BF0 +4A00 +4BF8 +4A00 +7BFC +4AA4 +4554 +0554 +0818 +0000 +ENDCHAR +STARTCHAR U+55DB +ENCODING 21979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0088 +F7FF +9090 +93FE +9092 +9092 +97FF +9092 +9092 +93FE +F098 +0194 +0396 +0693 +0090 +ENDCHAR +STARTCHAR U+55DC +ENCODING 21980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +03F8 +7890 +4FFC +48D8 +49E0 +4E88 +48F8 +4BF0 +7A10 +4BF0 +4210 +03F0 +0210 +0000 +ENDCHAR +STARTCHAR U+55DD +ENCODING 21981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +07FE +1008 +7BFC +5208 +5208 +53F8 +5004 +57FE +5514 +54A4 +75F4 +5444 +0444 +0454 +0408 +ENDCHAR +STARTCHAR U+55DE +ENCODING 21982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F7FF +9088 +9000 +9104 +9208 +9208 +9492 +928A +9104 +F104 +028A +028A +07DF +0451 +ENDCHAR +STARTCHAR U+55DF +ENCODING 21983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +00A0 +7BF8 +4840 +49F0 +4840 +4FFC +4900 +49F8 +7A20 +4A20 +4420 +0BFC +0000 +0000 +ENDCHAR +STARTCHAR U+55E1 +ENCODING 21985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +10A0 +7910 +5248 +5486 +5914 +53F8 +5000 +57BC +5084 +54A4 +7294 +54A4 +0084 +0294 +0108 +ENDCHAR +STARTCHAR U+55E2 +ENCODING 21986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FC +F204 +9204 +93FC +9204 +9204 +93FC +9000 +97FE +9492 +F492 +0492 +0492 +0492 +0FFF +ENDCHAR +STARTCHAR U+55E3 +ENCODING 21987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EFC +2204 +2274 +3E04 +0074 +7F54 +5554 +5554 +7F74 +5554 +5504 +5504 +430C +0000 +ENDCHAR +STARTCHAR U+55E4 +ENCODING 21988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0248 +7A48 +4BF8 +4880 +4FFC +4840 +4BF8 +4A48 +7BF8 +4A50 +4048 +007C +0F84 +0000 +ENDCHAR +STARTCHAR U+55E5 +ENCODING 21989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0088 +7BFC +4A08 +4BF8 +4A08 +4BF8 +4884 +4FFE +48A0 +4950 +7A48 +45FE +0844 +0040 +0040 +ENDCHAR +STARTCHAR U+55E6 +ENCODING 21990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +17FC +7840 +57FE +5442 +5894 +53F0 +5040 +5088 +57FC +7150 +524C +0444 +0140 +0080 +ENDCHAR +STARTCHAR U+55E7 +ENCODING 21991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +FE3E +1224 +1224 +2424 +45BC +8A40 +0420 +1BD8 +E006 +3FF8 +2448 +3FF8 +2448 +2458 +0000 +ENDCHAR +STARTCHAR U+55E8 +ENCODING 21992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0888 +75FC +5100 +53F8 +5908 +5548 +5128 +57FE +5508 +5548 +7528 +5908 +09FC +0808 +0030 +ENDCHAR +STARTCHAR U+55E9 +ENCODING 21993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +0326 +F124 +9020 +93FE +9202 +9202 +93FE +9202 +9202 +93FE +F202 +0202 +03FE +0104 +0603 +ENDCHAR +STARTCHAR U+55EA +ENCODING 21994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +0BFC +7C40 +4BF8 +4880 +4FFE +48A0 +4910 +4BF8 +4C46 +7BF8 +48C0 +0170 +0648 +0040 +ENDCHAR +STARTCHAR U+55EB +ENCODING 21995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0FFC +7210 +53F0 +5210 +53F0 +5214 +5FFE +5010 +5FBC +5084 +74A4 +5528 +0210 +0528 +08C6 +ENDCHAR +STARTCHAR U+55EC +ENCODING 21996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +0128 +17FC +7920 +5104 +53FE +5208 +5608 +5AE8 +52A8 +52A8 +72E8 +5208 +0208 +0228 +0210 +ENDCHAR +STARTCHAR U+55EF +ENCODING 21999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +03FC +7A48 +4A48 +4BF8 +4A48 +4AA8 +4B18 +4A08 +4BF8 +7800 +4544 +0522 +090A +00F8 +0000 +ENDCHAR +STARTCHAR U+55F2 +ENCODING 22002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0118 +0AA4 +7C40 +49B0 +4E4E +48F0 +4B90 +4860 +4BA0 +4878 +7B88 +4890 +0060 +00C0 +0700 +ENDCHAR +STARTCHAR U+55F3 +ENCODING 22003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1078 +7B80 +5248 +5150 +57FE +5482 +5884 +57FC +5100 +51F0 +7310 +52A0 +0440 +08B0 +030C +ENDCHAR +STARTCHAR U+55F5 +ENCODING 22005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +0808 +7450 +5424 +51FE +5124 +5D24 +55FC +5524 +5524 +55FC +7524 +552C +0A06 +11FC +0000 +ENDCHAR +STARTCHAR U+55F6 +ENCODING 22006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F222 +93FE +9222 +9222 +93FE +9124 +97FF +9124 +9124 +F3FE +0020 +03FE +0020 +0020 +ENDCHAR +STARTCHAR U+55F7 +ENCODING 22007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0220 +7FA0 +5220 +527C +5FC8 +5248 +5FA8 +5228 +7390 +5490 +44A8 +08C8 +1304 +0000 +ENDCHAR +STARTCHAR U+55F9 +ENCODING 22009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +0420 +73FC +5220 +58F8 +54A8 +54F8 +50A8 +5EF8 +7220 +53FC +4220 +0520 +08FC +0000 +ENDCHAR +STARTCHAR U+55FA +ENCODING 22010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0221 +0221 +7BFF +4890 +4910 +4BFF +4D10 +49FF +4910 +79FF +4910 +01FF +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+55FC +ENCODING 22012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +03FF +7C48 +4400 +45FE +4502 +45FE +4502 +45FE +7C20 +03FF +0048 +0084 +0303 +0000 +0000 +ENDCHAR +STARTCHAR U+55FD +ENCODING 22013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0220 +7FE0 +5220 +5FFC +5AD4 +5A98 +5A90 +7F90 +5730 +46A8 +0AA8 +1244 +0284 +0000 +ENDCHAR +STARTCHAR U+55FE +ENCODING 22014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0220 +7A20 +4FBC +4A40 +4A60 +4BBC +4AD0 +4A90 +7AFC +4CB0 +44A8 +08C8 +1304 +0000 +ENDCHAR +STARTCHAR U+55FF +ENCODING 22015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +00F8 +F18C +9777 +9000 +91FC +9008 +93FE +9202 +93FE +9202 +F3FE +0202 +03FE +0104 +0603 +ENDCHAR +STARTCHAR U+5600 +ENCODING 22016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +1044 +7FFE +5110 +50A4 +57FE +5444 +5444 +57FC +5444 +55F4 +7514 +5514 +05F4 +0414 +0408 +ENDCHAR +STARTCHAR U+5601 +ENCODING 22017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +0024 +77FE +5420 +5520 +55E4 +5524 +5524 +57E8 +5528 +5528 +7B90 +4D50 +112A +234A +0084 +ENDCHAR +STARTCHAR U+5602 +ENCODING 22018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3C5E +2552 +2552 +3D5E +0140 +0140 +0140 +3D5E +2552 +25D2 +3C5E +0040 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+5604 +ENCODING 22020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +00FE +7DFA +4482 +44FE +4480 +44FE +4480 +44FF +7C11 +45FF +0055 +0093 +0111 +0000 +0000 +ENDCHAR +STARTCHAR U+5605 +ENCODING 22021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +023E +F794 +9494 +9794 +9494 +9494 +97BF +9004 +94C4 +978C +F40C +0454 +03D5 +0025 +0043 +ENDCHAR +STARTCHAR U+5606 +ENCODING 22022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +7FFC +4910 +4BF8 +4A48 +4BF8 +4840 +4BF8 +7840 +4FFC +40A0 +0318 +0C04 +0000 +ENDCHAR +STARTCHAR U+5608 +ENCODING 22024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +00A4 +0FFE +70A0 +57FC +54A4 +57FC +54A4 +57FC +5000 +53F8 +7208 +53F8 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR U+5609 +ENCODING 22025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0000 +0FE0 +0820 +0FE0 +0440 +7FFC +0400 +3F78 +0948 +3378 +0000 +ENDCHAR +STARTCHAR U+560A +ENCODING 22026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +0222 +F3FE +9000 +97FF +9400 +9410 +94FE +9410 +95FF +F400 +0410 +0CFE +0810 +19FF +0000 +ENDCHAR +STARTCHAR U+560C +ENCODING 22028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +07FE +70A0 +50A4 +57FE +54A4 +54A4 +57FC +5000 +57FC +5000 +7FFE +5150 +024C +0544 +0080 +ENDCHAR +STARTCHAR U+560D +ENCODING 22029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +03FE +F222 +97FF +9222 +93FE +9020 +93FE +9222 +93FE +9040 +F7FF +0084 +01C8 +007C +07C7 +ENDCHAR +STARTCHAR U+560E +ENCODING 22030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07FC +0880 +7FF8 +4A08 +4BF8 +4A08 +4BF8 +4A08 +4BF8 +4940 +493E +7FC0 +48A0 +0042 +01B2 +0E0E +ENDCHAR +STARTCHAR U+560F +ENCODING 22031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27BE +2484 +FC84 +2484 +27BC +2484 +7400 +57BC +5404 +5424 +57A8 +7410 +5428 +042E +04C4 +ENDCHAR +STARTCHAR U+5610 +ENCODING 22032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03DE +F042 +914A +90C6 +914A +9022 +9070 +91DC +9707 +9020 +F1C8 +0032 +01C4 +0018 +01E0 +ENDCHAR +STARTCHAR U+5611 +ENCODING 22033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +007E +F040 +97FF +9441 +9471 +95C4 +947C +9400 +941E +F5F0 +0C92 +0854 +1BFF +3010 +0030 +ENDCHAR +STARTCHAR U+5612 +ENCODING 22034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0104 +F7DF +9104 +97DF +9104 +91DF +9704 +9104 +9000 +F3FC +0004 +0FFF +0004 +0004 +03FC +ENDCHAR +STARTCHAR U+5613 +ENCODING 22035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +0205 +7A0B +4BFF +4A09 +4AE9 +4AA9 +4AEB +4A0D +7BE9 +4A15 +0203 +03FF +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+5614 +ENCODING 22036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F8 +7400 +54F0 +5490 +54F0 +5400 +55F8 +5568 +75F8 +5568 +4400 +07FC +0400 +0000 +ENDCHAR +STARTCHAR U+5615 +ENCODING 22037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07FF +0020 +793C +4920 +4FFF +4900 +49FC +4900 +49FF +7AA9 +4AA9 +02A9 +0001 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+5616 +ENCODING 22038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7840 +49F0 +4840 +4FFC +49F0 +4910 +49F0 +79F0 +4910 +41F0 +0190 +0608 +0000 +ENDCHAR +STARTCHAR U+5617 +ENCODING 22039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0920 +3FFC +27C8 +4440 +17F0 +1FC0 +1008 +0FF8 +0FE0 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5618 +ENCODING 22040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +00F8 +7080 +57FC +54F8 +5788 +5478 +54A0 +56A8 +75A8 +49B0 +08A0 +17FC +0000 +0000 +ENDCHAR +STARTCHAR U+5619 +ENCODING 22041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0608 +E37F +AC49 +A67E +A052 +A354 +A6C8 +AD94 +A063 +A080 +EFFF +0108 +03D0 +0078 +07CE +ENDCHAR +STARTCHAR U+561B +ENCODING 22043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +77FC +5490 +5490 +57FC +5490 +55D8 +55F8 +75F8 +55FC +4ABC +08D4 +1090 +0000 +ENDCHAR +STARTCHAR U+561C +ENCODING 22044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +7C92 +4555 +4438 +4428 +4444 +44A2 +457D +7CC4 +4528 +0010 +0020 +01C0 +0000 +0000 +ENDCHAR +STARTCHAR U+561D +ENCODING 22045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +03C2 +008A +7BE6 +4AA2 +4AAA +4BE6 +4AA2 +4AA2 +4BFF +7A22 +4A22 +0222 +0462 +0000 +0000 +ENDCHAR +STARTCHAR U+561E +ENCODING 22046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0290 +1290 +7FF0 +5294 +53BE +5114 +57D4 +5554 +5554 +57D4 +5114 +5FF4 +7124 +0124 +0154 +0188 +ENDCHAR +STARTCHAR U+561F +ENCODING 22047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +123C +7FA4 +5224 +52A4 +5FE8 +5224 +57A4 +5CA2 +54A2 +57A2 +74B4 +54A8 +07A0 +04A0 +0020 +ENDCHAR +STARTCHAR U+5623 +ENCODING 22051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1444 +7C44 +57FC +5004 +57BE +54A4 +54A4 +57BC +54A4 +54A4 +77BC +54A4 +08A4 +0AD4 +1108 +ENDCHAR +STARTCHAR U+5624 +ENCODING 22052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07BC +14A4 +7DAC +55AC +56B4 +56B4 +5528 +58C4 +5080 +5FFE +5110 +7210 +5120 +00C0 +0130 +0608 +ENDCHAR +STARTCHAR U+5627 +ENCODING 22055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +07FE +7402 +5894 +5150 +5524 +554A +598A +52F8 +5C40 +7248 +5248 +0248 +03F8 +0008 +ENDCHAR +STARTCHAR U+5629 +ENCODING 22057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +7FFC +4910 +4BF8 +4950 +4FFC +4950 +4BF8 +7840 +4FFC +4040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+562A +ENCODING 22058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +0249 +0249 +7BFF +4800 +49FE +4902 +49FE +4902 +49FE +7902 +49FE +0084 +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+562C +ENCODING 22060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01F8 +0908 +7DF8 +4908 +49F8 +4800 +4FFE +4A40 +4BFC +4A44 +4BE8 +7A68 +43D0 +0E68 +0446 +0040 +ENDCHAR +STARTCHAR U+562D +ENCODING 22061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0144 +0FE4 +7108 +57C8 +5010 +57C4 +5444 +5448 +57D2 +5002 +7444 +5284 +0FE8 +0010 +0020 +ENDCHAR +STARTCHAR U+562E +ENCODING 22062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +056A +F39C +9108 +9294 +9462 +97FE +9442 +F3FC +9044 +0084 +0104 +0228 +0C10 +0000 +0000 +ENDCHAR +STARTCHAR U+562F +ENCODING 22063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +07F8 +7088 +5FFC +5088 +57F8 +55A8 +57B8 +5488 +77F8 +5488 +47B8 +05A8 +09A8 +0000 +ENDCHAR +STARTCHAR U+5630 +ENCODING 22064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0122 +0224 +F6AD +9122 +9225 +92AF +97A4 +9022 +93FF +9220 +9212 +F314 +0288 +0695 +0427 +0CC2 +ENDCHAR +STARTCHAR U+5631 +ENCODING 22065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F8 +7408 +57F8 +5438 +57C0 +55F0 +5550 +55F0 +77F8 +4AA8 +4BF8 +1208 +2218 +0000 +ENDCHAR +STARTCHAR U+5632 +ENCODING 22066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0238 +7FE8 +5228 +57A8 +54B8 +57A8 +54A8 +57B8 +7228 +5FC8 +4248 +0288 +0318 +0000 +ENDCHAR +STARTCHAR U+5633 +ENCODING 22067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +01FC +7924 +49FC +4820 +4FFF +4800 +49FC +4904 +49FC +4904 +79FC +0104 +01FC +0088 +0306 +ENDCHAR +STARTCHAR U+5634 +ENCODING 22068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0524 +75F8 +5520 +57A4 +5CFC +5120 +5FF8 +5248 +73F8 +5248 +43F8 +0408 +0818 +0000 +ENDCHAR +STARTCHAR U+5635 +ENCODING 22069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +01FC +F020 +93FE +9000 +9104 +97DF +9104 +91C4 +971F +9000 +F3FF +0088 +0089 +0189 +0307 +ENDCHAR +STARTCHAR U+5636 +ENCODING 22070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0508 +0510 +7560 +5FC0 +5540 +577C +5550 +5750 +5550 +7FD0 +5550 +4590 +0890 +1110 +0000 +ENDCHAR +STARTCHAR U+5637 +ENCODING 22071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +01FC +7904 +49FC +4904 +49FC +4904 +49FC +4820 +4BAE +7820 +03AE +0020 +0FFF +0020 +0020 +ENDCHAR +STARTCHAR U+5638 +ENCODING 22072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +73FC +56A8 +5AA8 +5FFC +52A8 +52A8 +52A8 +77FC +5000 +4548 +04A4 +08A4 +0000 +ENDCHAR +STARTCHAR U+5639 +ENCODING 22073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0844 +7FFE +4840 +4AA8 +4910 +4BF8 +4E0E +4BF8 +4A08 +4BF8 +7840 +4950 +024C +0544 +0080 +ENDCHAR +STARTCHAR U+563A +ENCODING 22074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +00FC +0010 +7DFF +4428 +447C +44C6 +457D +45FF +4501 +7D7D +4545 +017D +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+563B +ENCODING 22075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0848 +7FFC +4840 +4BF8 +4800 +4BF8 +4A08 +4BF8 +4910 +4FFE +7808 +4BFC +0208 +0208 +03F8 +ENDCHAR +STARTCHAR U+563C +ENCODING 22076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +0000 +3FFC +2104 +3FFC +2104 +3FFC +0000 +FFFF +0000 +3FFC +2004 +2004 +3FFC +ENDCHAR +STARTCHAR U+563D +ENCODING 22077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03DE +0252 +7BDE +4800 +49FC +4924 +4924 +49FC +4924 +4924 +79FC +0020 +07FF +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+563E +ENCODING 22078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +0050 +7BFE +4A52 +4BFE +49FC +4904 +49FC +4904 +79FC +4820 +03FE +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+563F +ENCODING 22079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7E48 +4B58 +4AE8 +4A48 +4A48 +4BF8 +4840 +4BF8 +4840 +4FFE +7800 +4AA8 +02A4 +0404 +ENDCHAR +STARTCHAR U+5640 +ENCODING 22080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07DF +F041 +97DF +9410 +9451 +93CF +9000 +9088 +93FE +9088 +F088 +07FF +0088 +018C +0707 +ENDCHAR +STARTCHAR U+5641 +ENCODING 22081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FF +F050 +93DE +9202 +9202 +93DE +9050 +9050 +97FF +9020 +F030 +0292 +0283 +0685 +047C +ENDCHAR +STARTCHAR U+5642 +ENCODING 22082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +00A0 +7FFC +48A0 +4BF8 +4AA8 +4B38 +4BF8 +4BF8 +7810 +4FFC +4110 +0090 +0030 +0000 +ENDCHAR +STARTCHAR U+5643 +ENCODING 22083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001C +01F0 +F222 +9124 +97FF +90A8 +91AC +9326 +9623 +9000 +93FE +F222 +03FE +0222 +0222 +03FE +ENDCHAR +STARTCHAR U+5644 +ENCODING 22084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +01DF +F709 +91C9 +9719 +91D3 +9736 +9100 +9088 +9110 +90A2 +F7FF +0021 +0124 +0326 +0623 +ENDCHAR +STARTCHAR U+5645 +ENCODING 22085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +0090 +79FC +4844 +4848 +48FE +4882 +4904 +7BFF +0401 +0955 +1155 +0002 +001C +0000 +0000 +ENDCHAR +STARTCHAR U+5646 +ENCODING 22086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0FBE +F514 +9514 +9FBF +930C +9595 +9927 +9000 +93FC +9204 +F204 +03FC +0204 +0204 +03FC +ENDCHAR +STARTCHAR U+5648 +ENCODING 22088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0089 +0089 +03E8 +781F +4BE8 +4A28 +4A2A +4BEA +488A +7AAA +02AA +008B +0093 +0183 +0000 +0000 +ENDCHAR +STARTCHAR U+5649 +ENCODING 22089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +07E8 +F108 +910F +97EA +9252 +924A +93CA +924A +924E +93C4 +F244 +024E +03CA +0E5B +0051 +ENDCHAR +STARTCHAR U+564A +ENCODING 22090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0024 +7C18 +45FF +4451 +4492 +4430 +45FF +4545 +7D87 +457D +0145 +017D +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+564B +ENCODING 22091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +0108 +FFE8 +901F +97D2 +9472 +97D6 +9014 +97D4 +909C +9108 +F1C8 +071C +0114 +0136 +0763 +ENDCHAR +STARTCHAR U+564C +ENCODING 22092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +00A0 +7BF8 +4A48 +4BF8 +4A48 +4BF8 +4800 +49F0 +7910 +49F0 +4110 +01F0 +0110 +0000 +ENDCHAR +STARTCHAR U+564D +ENCODING 22093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +0890 +7DFC +4920 +4B28 +4DFC +4920 +4928 +49FC +4920 +4924 +79FE +4900 +02A8 +02A4 +0404 +ENDCHAR +STARTCHAR U+564E +ENCODING 22094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +07FC +7840 +49F0 +4BFC +4A08 +4FFC +49F0 +4910 +79F0 +4910 +40A0 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+564F +ENCODING 22095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +00F8 +F18C +9777 +9000 +91FC +9104 +91FC +9000 +97DF +9041 +F659 +00C3 +034D +0451 +00C3 +ENDCHAR +STARTCHAR U+5650 +ENCODING 22096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1EF0 +1290 +1290 +1EF0 +0000 +3FF8 +0100 +7FFC +0000 +1EF0 +1290 +1EF0 +1290 +0000 +ENDCHAR +STARTCHAR U+5653 +ENCODING 22099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +007C +7040 +57FF +5442 +547C +57C2 +547E +5400 +7450 +5554 +4554 +05DC +0850 +0BFE +1000 +ENDCHAR +STARTCHAR U+5654 +ENCODING 22100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0748 +7130 +5524 +5218 +53F0 +5408 +5BF6 +5210 +5210 +53F0 +7000 +5210 +0124 +1FFE +0000 +ENDCHAR +STARTCHAR U+5657 +ENCODING 22103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +02A8 +79B0 +48A4 +4FFE +4910 +48A0 +4BF8 +4840 +4BF8 +4840 +7FFE +48A0 +0110 +0110 +060C +ENDCHAR +STARTCHAR U+5658 +ENCODING 22104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +07FE +7408 +5628 +554E +57F2 +5484 +56A8 +56A8 +56A8 +7BE8 +48A8 +0888 +1114 +2224 +0042 +ENDCHAR +STARTCHAR U+5659 +ENCODING 22105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +10A0 +7910 +5248 +55F6 +58A0 +5248 +52A8 +53F8 +5044 +77FE +5494 +05F4 +0404 +040C +ENDCHAR +STARTCHAR U+565A +ENCODING 22106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +0002 +7BFF +4802 +49FE +4800 +4FDF +4911 +4FDF +4804 +7FFF +4904 +0014 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+565B +ENCODING 22107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0140 +7978 +4940 +4FFC +4B58 +4AD8 +4AE8 +4BF8 +7AE8 +4B58 +4248 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+565C +ENCODING 22108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +11F0 +7A20 +57FC +5C44 +57FC +5444 +57FC +5000 +5FFE +5000 +73F8 +5208 +03F8 +0208 +03F8 +ENDCHAR +STARTCHAR U+565E +ENCODING 22110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F0D8 +918C +9707 +90F8 +9000 +93DE +9252 +9252 +93DE +F000 +0104 +0104 +038E +06DB +ENDCHAR +STARTCHAR U+5660 +ENCODING 22112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0410 +F6FE +9210 +91FF +9044 +9028 +9EFE +9210 +92FE +9210 +F3FF +0210 +0610 +0500 +0CFF +ENDCHAR +STARTCHAR U+5661 +ENCODING 22113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F8 +0110 +F7FF +9244 +9387 +927C +9200 +93FF +9200 +927C +9200 +F27C +0200 +02FE +0482 +00FE +ENDCHAR +STARTCHAR U+5662 +ENCODING 22114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0104 +77FE +5444 +5554 +5444 +57FC +54C4 +5574 +564C +7040 +4FFE +00A0 +0110 +0208 +0C06 +ENDCHAR +STARTCHAR U+5663 +ENCODING 22115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FE +F492 +9492 +97FE +9100 +93FF +9641 +9FF9 +9249 +9249 +F3F9 +0051 +01FB +070A +0006 +ENDCHAR +STARTCHAR U+5664 +ENCODING 22116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +7FFC +4BB0 +4B78 +4D54 +4910 +4BF8 +4800 +7FFC +4A50 +4248 +0448 +00C0 +0000 +ENDCHAR +STARTCHAR U+5665 +ENCODING 22117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +07FC +F4A4 +97FC +94A4 +97FC +9000 +97FE +95FC +F400 +97FE +0518 +0510 +0BAE +0000 +0000 +ENDCHAR +STARTCHAR U+5666 +ENCODING 22118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +013E +F120 +97FF +900A +9009 +97FF +9404 +95F4 +9444 +9555 +F75E +0464 +058D +0415 +0863 +ENDCHAR +STARTCHAR U+5668 +ENCODING 22120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1EF0 +1290 +1290 +1EF0 +0100 +7FFC +0440 +1830 +7EFC +1290 +1290 +1EF0 +1290 +0000 +ENDCHAR +STARTCHAR U+5669 +ENCODING 22121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0100 +3D78 +2548 +3D78 +0100 +7FFC +0100 +3D78 +2548 +2548 +3D78 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+566A +ENCODING 22122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F0 +7910 +49F0 +4800 +4BB8 +4AA8 +4BB8 +4840 +7FFC +48E0 +4150 +064C +0040 +0000 +ENDCHAR +STARTCHAR U+566B +ENCODING 22123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4920 +4FFC +49F0 +4910 +49F0 +4910 +79F0 +48C0 +4528 +0514 +08F4 +0000 +ENDCHAR +STARTCHAR U+566C +ENCODING 22124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0220 +7BFC +4D50 +4888 +4800 +4FFC +4950 +4950 +7958 +4AE4 +4444 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+566D +ENCODING 22125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +0208 +F7C8 +945F +97D2 +9472 +97D2 +911A +9FEA +920E +93C4 +F244 +064E +04CA +0C9B +1991 +ENDCHAR +STARTCHAR U+566E +ENCODING 22126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +0252 +03FE +7800 +4FFF +4800 +49FC +4904 +49FC +4882 +7994 +4AA8 +04C4 +0182 +0000 +0000 +ENDCHAR +STARTCHAR U+566F +ENCODING 22127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +07F8 +F242 +9124 +97FF +9421 +9292 +9285 +947C +9080 +91FC +F304 +0698 +0070 +01DC +0707 +ENDCHAR +STARTCHAR U+5670 +ENCODING 22128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +0000 +008A +791F +4A32 +4FD2 +489F +4912 +4A52 +4FDF +7852 +4892 +031F +0000 +0000 +ENDCHAR +STARTCHAR U+5671 +ENCODING 22129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +107C +7840 +57FE +5442 +57F8 +5440 +5438 +57FE +5480 +5548 +7AB0 +4970 +10AE +2324 +0060 +ENDCHAR +STARTCHAR U+5672 +ENCODING 22130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0050 +F18C +9777 +9000 +93FE +9222 +92AA +9222 +93FE +9000 +F1FC +0104 +01FC +0104 +01FC +ENDCHAR +STARTCHAR U+5673 +ENCODING 22131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +001C +03FF +7A11 +4A7E +4A1C +4A7C +4A44 +4AFC +4A90 +7AFE +4A12 +02FF +0424 +0000 +0000 +ENDCHAR +STARTCHAR U+5674 +ENCODING 22132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7950 +4FFC +4910 +4BF8 +4A08 +4BF8 +4A08 +7BF8 +4A08 +43F8 +0110 +0E0C +0000 +ENDCHAR +STARTCHAR U+5675 +ENCODING 22133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +6FFF +3040 +13FC +0204 +F3FC +1204 +13FC +1204 +33FC +6800 +C7FF +0000 +3FFC +2004 +3FFC +ENDCHAR +STARTCHAR U+5676 +ENCODING 22134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0FFE +7910 +4BF8 +4A08 +4BF8 +4A08 +4BF8 +4904 +49FE +4A44 +7C64 +4A94 +0204 +03E4 +000C +ENDCHAR +STARTCHAR U+5677 +ENCODING 22135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +03E8 +780F +4A29 +4951 +4885 +4BE5 +4804 +4BE4 +4A24 +7BE4 +4A24 +03EA +0231 +0000 +0000 +ENDCHAR +STARTCHAR U+5678 +ENCODING 22136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +027C +7390 +5E20 +52F8 +5AC8 +5AF8 +5AC8 +7FF8 +5AC8 +4A78 +02B0 +02A8 +01C4 +0000 +ENDCHAR +STARTCHAR U+5679 +ENCODING 22137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0444 +0248 +FFFE +9802 +9BFA +9208 +93F8 +9000 +97FC +F444 +97FC +0444 +07FC +0404 +0000 +0000 +ENDCHAR +STARTCHAR U+567A +ENCODING 22138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0104 +0108 +7FF0 +54A0 +52A0 +533C +5FE8 +5228 +5FE8 +7728 +56A8 +4AC8 +1248 +0288 +0000 +ENDCHAR +STARTCHAR U+567B +ENCODING 22139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +77FE +5512 +5BFC +5110 +53F8 +5110 +5FFE +5150 +5248 +75F6 +4840 +0048 +07FC +0000 +ENDCHAR +STARTCHAR U+567C +ENCODING 22140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +07C8 +747E +5440 +5454 +57D4 +543E +5408 +57C8 +5648 +767E +4A48 +0A48 +13C8 +2248 +0008 +ENDCHAR +STARTCHAR U+567E +ENCODING 22142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +0129 +7D4D +4410 +45FF +4482 +45FF +4400 +44FE +7C82 +44FE +0082 +00FE +0000 +0000 +ENDCHAR +STARTCHAR U+567F +ENCODING 22143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07DF +0249 +0555 +0249 +79A6 +4BFE +4904 +4924 +4AAA +4C71 +7820 +4FFF +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5680 +ENCODING 22144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03FC +7A48 +4CA8 +4AA4 +4A94 +4C70 +4BF8 +4AA8 +7FFC +4800 +47FC +0040 +00C0 +0000 +ENDCHAR +STARTCHAR U+5681 +ENCODING 22145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +0129 +7CA5 +4463 +44A5 +4448 +44FF +4588 +44FF +7C88 +44FF +0088 +00FF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5682 +ENCODING 22146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03E8 +0288 +03EF +0228 +7BE8 +4A90 +4A87 +4BE0 +4800 +4BFE +7A52 +4A52 +0252 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+5683 +ENCODING 22147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007F +0255 +7955 +487F +4808 +4B08 +492A +4949 +4908 +492A +7949 +4908 +0100 +02FF +0000 +0000 +ENDCHAR +STARTCHAR U+5684 +ENCODING 22148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +07FF +F088 +9110 +93FF +9620 +9BFE +9220 +93FE +9220 +93FF +F000 +07FE +008C +0070 +078F +ENDCHAR +STARTCHAR U+5685 +ENCODING 22149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +07FC +7040 +57FE +5442 +5B5C +5040 +5358 +5004 +5FFE +5080 +77FC +54A4 +04A4 +04A4 +040C +ENDCHAR +STARTCHAR U+5686 +ENCODING 22150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +07FC +7950 +4840 +4FFC +49F0 +4910 +49F0 +4BF8 +7A08 +4AE8 +42A8 +02E8 +0218 +0000 +ENDCHAR +STARTCHAR U+5687 +ENCODING 22151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +0210 +7FFC +5210 +5210 +5FFC +5528 +5568 +5DEC +7DAC +556C +4948 +0948 +1398 +0000 +ENDCHAR +STARTCHAR U+5688 +ENCODING 22152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FFF +E800 +ABC6 +AA45 +ABC4 +AA5F +ABC4 +A804 +ABC4 +AA44 +EBCE +0A4A +13CA +025B +02D1 +ENDCHAR +STARTCHAR U+568A +ENCODING 22154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +01F0 +7910 +49F0 +49F0 +4910 +49F0 +4BF8 +4BF8 +7A48 +4BF8 +47FC +0110 +0610 +0000 +ENDCHAR +STARTCHAR U+568B +ENCODING 22155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +03FE +F020 +91FC +9000 +97FF +9001 +91FD +9020 +93FE +9000 +F7FF +0002 +07BF +0492 +0786 +ENDCHAR +STARTCHAR U+568C +ENCODING 22156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F7FF +9050 +97AF +92AA +92AA +95AD +9000 +9202 +93FE +F202 +03FE +0202 +0202 +0402 +ENDCHAR +STARTCHAR U+568D +ENCODING 22157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +01FC +7824 +4BFE +4824 +49FC +4820 +4BFE +4A52 +4800 +79FC +4954 +0154 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+568E +ENCODING 22158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +17FC +F800 +91F0 +9110 +97FE +9402 +9BFC +9080 +9148 +96F0 +F150 +96CE +0144 +0640 +00C0 +ENDCHAR +STARTCHAR U+568F +ENCODING 22159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7840 +4BFC +4BF8 +4D50 +49F0 +4950 +49F0 +7FFC +4A48 +4278 +05C0 +087C +0000 +ENDCHAR +STARTCHAR U+5690 +ENCODING 22160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0124 +00A8 +03FE +FAFA +8888 +88F8 +89F0 +8900 +89FC +F9FC +8904 +01FC +0104 +01FC +0000 +0000 +ENDCHAR +STARTCHAR U+5693 +ENCODING 22163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +77FE +5502 +59BC +52A8 +56B0 +5110 +53F8 +5406 +5BF8 +7040 +5150 +024C +0544 +0080 +ENDCHAR +STARTCHAR U+5694 +ENCODING 22164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7840 +4BFC +4BF8 +4D50 +49F0 +4950 +49F0 +78A0 +4BF0 +4278 +05C0 +087C +0000 +ENDCHAR +STARTCHAR U+5695 +ENCODING 22165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +01F8 +F310 +9FFE +9222 +93FE +9222 +93FE +9292 +9449 +9000 +F3FE +0202 +03FE +0202 +03FE +ENDCHAR +STARTCHAR U+5697 +ENCODING 22167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +0202 +03FE +7A02 +4BFE +4888 +4BFE +4888 +4BFE +4924 +7A2A +4DF1 +00A8 +0124 +0000 +0000 +ENDCHAR +STARTCHAR U+5698 +ENCODING 22168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +0020 +007C +7C64 +444C +47FF +4753 +4544 +447C +4420 +447C +7CA8 +0110 +006E +0000 +0000 +ENDCHAR +STARTCHAR U+5699 +ENCODING 22169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0120 +F13E +9120 +9120 +97FF +928A +928A +9356 +9202 +93FE +F28A +028A +0356 +0202 +03FE +ENDCHAR +STARTCHAR U+569A +ENCODING 22170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +0000 +7FFE +4080 +7FFC +4004 +7FFC +4080 +7FFE +0000 +7E7E +4242 +7E7E +0000 +ENDCHAR +STARTCHAR U+569C +ENCODING 22172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +02AA +0272 +03FE +7820 +49FC +4820 +4FFF +4AAA +7CA9 +4820 +03FE +0020 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+569D +ENCODING 22173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F7FF +9448 +95FE +9448 +97FF +9420 +95FE +9522 +95FE +F522 +0D22 +09FE +1884 +0303 +ENDCHAR +STARTCHAR U+569E +ENCODING 22174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFC +0100 +1FF8 +0000 +0FF0 +0810 +0FF0 +1008 +FE7F +1008 +7C3E +0000 +7C3E +4422 +7C3E +ENDCHAR +STARTCHAR U+569F +ENCODING 22175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01A0 +073F +E165 +AFCD +A519 +ADC3 +A90E +A160 +A0F0 +A39C +AE07 +E040 +064E +01F0 +035C +0EC7 +ENDCHAR +STARTCHAR U+56A0 +ENCODING 22176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0104 +06F4 +76B4 +55B4 +5F74 +5194 +5294 +57F4 +5934 +77D4 +5554 +4384 +03C4 +0C0C +0000 +ENDCHAR +STARTCHAR U+56A2 +ENCODING 22178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0FE0 +0920 +0FE0 +3FFC +2AA8 +7FF8 +0FE0 +7FFC +0690 +7C60 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+56A3 +ENCODING 22179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3EF8 +2288 +3EF8 +0004 +FFFE +0200 +1FF0 +1010 +1110 +1290 +0440 +783C +0000 +3EF8 +2288 +3EF8 +ENDCHAR +STARTCHAR U+56A5 +ENCODING 22181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0140 +0FFC +7140 +55D0 +5414 +5DD8 +5550 +5554 +5DD4 +754C +5000 +4548 +04A4 +08A4 +0000 +ENDCHAR +STARTCHAR U+56A6 +ENCODING 22182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FF +F488 +9488 +97FE +9488 +95DC +96AA +9488 +9420 +9520 +F53E +0520 +0920 +0120 +07FF +ENDCHAR +STARTCHAR U+56A7 +ENCODING 22183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0078 +F040 +97FE +9442 +95F8 +9442 +95FE +9524 +95FC +9524 +F5FC +0400 +0BFE +0292 +07FF +ENDCHAR +STARTCHAR U+56A8 +ENCODING 22184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F7FF +9228 +914F +97F1 +900F +93E8 +922F +93E8 +922F +F3E8 +022F +0228 +0229 +0267 +ENDCHAR +STARTCHAR U+56A9 +ENCODING 22185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +010C +030A +E27F +AC88 +A5BE +A32A +A23E +A4AA +AFBE +A284 +A27F +EA84 +1AA4 +1294 +0204 +020C +ENDCHAR +STARTCHAR U+56AA +ENCODING 22186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07DF +0451 +07DF +0451 +7FDF +4C01 +4CFD +4D09 +4C51 +4D9D +7D05 +4DDD +0505 +05FD +0000 +0000 +ENDCHAR +STARTCHAR U+56AB +ENCODING 22187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +013E +F7E2 +92A2 +92BE +92A2 +97E2 +913E +9122 +97E2 +913E +F394 +0554 +0935 +0125 +0163 +ENDCHAR +STARTCHAR U+56AC +ENCODING 22188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +013F +0104 +75C8 +551E +5512 +5FF2 +511E +5132 +5532 +555E +7B92 +5092 +011E +0212 +0C21 +ENDCHAR +STARTCHAR U+56AD +ENCODING 22189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +FF7F +1008 +7E18 +0030 +7E74 +42D6 +7E93 +2410 +2410 +FF00 +007E +7E42 +4242 +4242 +7E7E +ENDCHAR +STARTCHAR U+56AE +ENCODING 22190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +17F8 +13A8 +6AB0 +2BB0 +13A8 +2A28 +7BB8 +13A0 +2100 +3FF8 +27C8 +2448 +27C8 +2018 +0000 +ENDCHAR +STARTCHAR U+56AF +ENCODING 22191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +07FC +7040 +57FE +5552 +58E4 +5150 +5120 +53FC +5620 +5BFC +7220 +53FC +0220 +03FE +0200 +ENDCHAR +STARTCHAR U+56B1 +ENCODING 22193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +020A +03CB +E209 +AFC8 +AA4F +AFB8 +AA48 +A9CA +A80A +AFEE +A804 +EFC4 +1444 +17CD +329B +07D1 +ENDCHAR +STARTCHAR U+56B2 +ENCODING 22194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0877 +0855 +7F77 +0000 +3E7F +2249 +3E7F +0049 +3E7F +0408 +7F7F +0808 +0808 +1808 +0000 +0000 +ENDCHAR +STARTCHAR U+56B3 +ENCODING 22195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A40 +399C +2244 +381C +2244 +399C +2244 +7FFE +4902 +4FF2 +1100 +7FFE +0000 +1FF8 +1008 +1FF8 +ENDCHAR +STARTCHAR U+56B4 +ENCODING 22196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1E78 +1248 +1E78 +3FFC +2020 +2FA0 +2220 +3FFC +2948 +2FA8 +2F30 +29B0 +3F48 +4184 +0000 +ENDCHAR +STARTCHAR U+56B5 +ENCODING 22197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01F8 +0210 +03FE +7A02 +4BFE +49EE +4908 +49FE +4A10 +4BFE +7A22 +4BFE +0095 +031F +0000 +0000 +ENDCHAR +STARTCHAR U+56B6 +ENCODING 22198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03B8 +7AA8 +4BB8 +4AA8 +4BB8 +4AA8 +4BB8 +4AA8 +7CC4 +4FFC +4320 +00E0 +0718 +0000 +ENDCHAR +STARTCHAR U+56B7 +ENCODING 22199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +0FFE +7000 +53B8 +52A8 +53B8 +5110 +57FC +5110 +53F8 +5110 +5FFE +7148 +4330 +0D0E +0184 +ENDCHAR +STARTCHAR U+56BC +ENCODING 22204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +07F0 +7488 +5FFC +5528 +57F8 +5788 +5488 +57FC +77C8 +5428 +47A8 +0788 +0418 +0000 +ENDCHAR +STARTCHAR U+56BD +ENCODING 22205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +07DF +0122 +7FD4 +4B88 +4C94 +49A2 +4BFE +4A02 +4BFA +4BFA +7A02 +03FE +0401 +0000 +0000 +ENDCHAR +STARTCHAR U+56BE +ENCODING 22206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +078F +F088 +93DE +9252 +93DE +9084 +9088 +91FE +9310 +95FC +F110 +01FC +0110 +0110 +01FF +ENDCHAR +STARTCHAR U+56C0 +ENCODING 22208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +0210 +7FFC +527C +5FD4 +5AFC +5FD4 +5AFC +5FA8 +727C +5F88 +427C +0228 +0218 +0000 +ENDCHAR +STARTCHAR U+56C1 +ENCODING 22209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7910 +49F0 +49F0 +4BF8 +4810 +4FFC +4AA8 +7BB8 +4BB8 +42AC +0FF8 +0088 +0000 +ENDCHAR +STARTCHAR U+56C2 +ENCODING 22210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1EF0 +1290 +1EF0 +7FFC +0200 +1FF0 +1F90 +13F0 +1FF0 +0C60 +7EFC +1290 +1EF0 +1290 +0000 +ENDCHAR +STARTCHAR U+56C3 +ENCODING 22211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0228 +0228 +7FA8 +557C +5568 +57A8 +5ABC +5228 +5FA8 +773C +56A8 +4AA8 +123C +0220 +0000 +ENDCHAR +STARTCHAR U+56C5 +ENCODING 22213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +EEFE +AA82 +EE82 +00FE +7C80 +5494 +54FF +7C94 +5494 +54FF +7CA9 +10AA +FEAC +1136 +1063 +ENDCHAR +STARTCHAR U+56C6 +ENCODING 22214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +01EF +00FE +7892 +48FE +48FE +49FF +4915 +493D +49FF +4892 +78FE +0011 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+56C8 +ENCODING 22216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0FFC +7320 +57A0 +52F8 +5FA8 +57E8 +5FBC +53AC +7E44 +53F0 +4FFC +0110 +07F8 +0000 +ENDCHAR +STARTCHAR U+56C9 +ENCODING 22217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F292 +93FE +9000 +910A +961F +92B4 +9114 +925E +97D4 +F154 +011E +0354 +0554 +011F +ENDCHAR +STARTCHAR U+56CA +ENCODING 22218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +3FF8 +0920 +7FFE +5292 +9EF4 +0440 +7FFC +0440 +3FF8 +0440 +7FFC +0C90 +1460 +651C +0608 +ENDCHAR +STARTCHAR U+56CB +ENCODING 22219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A28 +0FBE +EA28 +A208 +BFBF +A514 +A595 +A927 +A000 +A7FC +A404 +E404 +07FC +0404 +0404 +07FC +ENDCHAR +STARTCHAR U+56CC +ENCODING 22220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +0FFF +E108 +A403 +A786 +A49C +AFC4 +A55F +A7C4 +A54E +A54E +E7D5 +0014 +0AA4 +0AA4 +0804 +ENDCHAR +STARTCHAR U+56CD +ENCODING 22221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +7FFF +0808 +7F7F +0000 +7F7F +4141 +7F7F +0808 +7FFF +0808 +7F7F +4141 +7F7F +4141 +ENDCHAR +STARTCHAR U+56CE +ENCODING 22222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +0750 +7548 +55FC +57AC +55F4 +55FC +5700 +5578 +7548 +5778 +4648 +0578 +0948 +0000 +ENDCHAR +STARTCHAR U+56CF +ENCODING 22223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2810 +29FF +FE10 +28FE +0000 +7CFE +5482 +54FE +7C44 +1028 +7DFF +1000 +FEFE +2882 +6C82 +C4FE +ENDCHAR +STARTCHAR U+56D0 +ENCODING 22224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +03C5 +E205 +BFE4 +A224 +AF9F +A224 +BFE4 +A484 +A784 +A004 +FFEE +34AA +38EA +573A +1263 +ENDCHAR +STARTCHAR U+56D1 +ENCODING 22225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF8 +0808 +7FF8 +5B58 +5B58 +5FF8 +5D28 +5FF8 +5BF8 +7BE8 +4EA8 +0BE8 +10A8 +27F0 +0000 +ENDCHAR +STARTCHAR U+56D3 +ENCODING 22227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0E78 +73A8 +5E28 +53C8 +5C98 +52F0 +5FFC +5528 +76D8 +57F8 +4528 +06D8 +07F8 +0000 +ENDCHAR +STARTCHAR U+56D4 +ENCODING 22228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +17FC +7840 +53F8 +5208 +57FE +5512 +5BFC +5110 +57FC +5110 +7FFE +5148 +0330 +0D9E +0104 +ENDCHAR +STARTCHAR U+56D7 +ENCODING 22231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56D8 +ENCODING 22232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2008 +27C8 +2448 +2448 +27C8 +2408 +2428 +2428 +23E8 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+56D9 +ENCODING 22233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4002 +4002 +7FC2 +4042 +4042 +4042 +4042 +7FC2 +4002 +4002 +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+56DA +ENCODING 22234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2108 +2108 +2108 +2108 +2288 +2288 +2448 +2828 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56DB +ENCODING 22235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +4488 +4488 +4488 +4488 +4898 +4898 +5078 +6008 +4008 +7FF8 +4008 +4008 +0000 +ENDCHAR +STARTCHAR U+56DC +ENCODING 22236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4102 +4102 +4302 +4202 +4222 +4632 +4412 +45F2 +4F1A +580A +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+56DD +ENCODING 22237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4004 +4FE4 +4044 +4084 +4124 +5FF4 +4104 +4104 +4104 +4104 +4304 +4004 +7FFC +4004 +ENDCHAR +STARTCHAR U+56DE +ENCODING 22238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2008 +27C8 +2448 +2448 +2448 +2448 +27C8 +2008 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56DF +ENCODING 22239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +0408 +3FFC +2008 +2828 +2448 +2288 +2108 +2288 +2448 +2828 +3018 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+56E0 +ENCODING 22240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2108 +2108 +3FF8 +2108 +2308 +2288 +2448 +2828 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56E1 +ENCODING 22241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4204 +4204 +4214 +7FFC +4444 +4444 +4844 +4444 +4384 +4284 +4464 +4814 +7FFC +4004 +ENDCHAR +STARTCHAR U+56E2 +ENCODING 22242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4084 +4084 +4094 +7FFC +4184 +4284 +4484 +4884 +5084 +6084 +4284 +4104 +7FFC +4004 +ENDCHAR +STARTCHAR U+56E3 +ENCODING 22243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2088 +2088 +3FF8 +2088 +2488 +2288 +2288 +2088 +2088 +2188 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56E4 +ENCODING 22244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4104 +4124 +5FF4 +4104 +4924 +4924 +4924 +4FE4 +4904 +4114 +40F4 +4004 +7FFC +4004 +ENDCHAR +STARTCHAR U+56E5 +ENCODING 22245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4102 +4102 +5FFA +4002 +43C2 +4242 +4242 +4642 +444A +4C4A +583A +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+56E6 +ENCODING 22246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4082 +4082 +408A +5E9A +42B2 +46C2 +44A2 +4C9A +588E +4082 +4382 +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+56E7 +ENCODING 22247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +4442 +4442 +4C7A +5802 +4002 +47E2 +4422 +4422 +4422 +4422 +7FFE +0000 +ENDCHAR +STARTCHAR U+56E8 +ENCODING 22248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4002 +5FFA +4102 +4302 +4762 +4D32 +791E +4102 +4102 +4102 +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+56EA +ENCODING 22250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0800 +1004 +3FFE +6084 +A504 +2214 +2524 +28C4 +30C4 +2124 +2204 +3FFC +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+56EB +ENCODING 22251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4804 +4814 +4FFC +5494 +5494 +6494 +4894 +4914 +5114 +6254 +4424 +4004 +7FFC +4004 +ENDCHAR +STARTCHAR U+56ED +ENCODING 22253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4044 +4FE4 +4004 +4024 +5FF4 +4484 +4484 +4484 +4494 +4894 +5074 +4004 +7FFC +4004 +ENDCHAR +STARTCHAR U+56EE +ENCODING 22254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2288 +2298 +24A8 +2CC8 +3488 +2498 +2498 +2478 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56F0 +ENCODING 22256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2108 +3FF8 +2388 +2388 +2548 +2548 +2928 +3118 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56F1 +ENCODING 22257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0804 +7FFE +4404 +4404 +47E4 +4424 +4844 +5444 +4284 +4104 +4284 +4404 +4804 +7FFC +4004 +ENDCHAR +STARTCHAR U+56F2 +ENCODING 22258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2248 +2248 +2FE8 +2248 +2248 +3FF8 +2248 +2448 +2848 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56F3 +ENCODING 22259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2228 +2928 +2528 +2448 +2048 +2788 +20C8 +2328 +2C08 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56F4 +ENCODING 22260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4104 +4124 +5FF4 +4104 +4FE4 +4104 +5FF4 +4114 +4114 +4154 +4124 +4104 +7FFC +4004 +ENDCHAR +STARTCHAR U+56F5 +ENCODING 22261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4104 +4104 +4284 +4444 +4824 +545C +6484 +4504 +4604 +4424 +43E4 +4004 +7FFC +4004 +ENDCHAR +STARTCHAR U+56F6 +ENCODING 22262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4242 +4242 +4662 +4C32 +591A +4102 +4FF2 +4102 +4102 +5FFA +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+56F7 +ENCODING 22263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4032 +41E2 +4F02 +4102 +5FFA +4542 +4542 +4562 +4D32 +591A +4102 +7FFE +0000 +ENDCHAR +STARTCHAR U+56F9 +ENCODING 22265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2288 +2C68 +37D8 +2008 +2FE8 +2128 +2128 +21C8 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56FA +ENCODING 22266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2108 +3FF8 +2108 +27C8 +2448 +2448 +27C8 +2448 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56FD +ENCODING 22269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2FE8 +2108 +2108 +2FE8 +2108 +2148 +2128 +2FE8 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+56FE +ENCODING 22270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4404 +47E4 +4C44 +5284 +4104 +4284 +4644 +493C +7094 +4604 +4104 +4084 +7FFC +4004 +ENDCHAR +STARTCHAR U+56FF +ENCODING 22271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2208 +3FF8 +2208 +27E8 +2628 +2BE8 +3228 +23E8 +2228 +2268 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5700 +ENCODING 22272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +2498 +2978 +2108 +2FE8 +2108 +21E8 +2228 +2428 +28C8 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5701 +ENCODING 22273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4102 +4102 +5FFA +4002 +47E2 +4002 +47E2 +4002 +4FF2 +4812 +4FF2 +4002 +7FFE +0000 +ENDCHAR +STARTCHAR U+5702 +ENCODING 22274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4FE2 +4202 +4512 +4932 +42A2 +4482 +59C2 +42E2 +44B2 +589A +4302 +7FFE +0000 +ENDCHAR +STARTCHAR U+5703 +ENCODING 22275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2128 +3FF8 +2108 +2FE8 +2928 +2FE8 +2928 +2FE8 +2928 +2968 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5704 +ENCODING 22276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2008 +2FE8 +2108 +2FC8 +2248 +3FF8 +27C8 +2448 +27C8 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5706 +ENCODING 22278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4004 +4FE4 +4824 +4FE4 +4004 +5FF4 +5014 +5114 +5114 +5294 +4444 +4824 +7FFC +4004 +ENDCHAR +STARTCHAR U+5707 +ENCODING 22279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +4081 +41C1 +4771 +5C1D +43E1 +4001 +4FFD +4925 +4FFD +4925 +4925 +492D +4001 +7FFF +ENDCHAR +STARTCHAR U+5708 +ENCODING 22280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2928 +37D8 +2288 +3FF8 +2448 +2FE8 +3458 +2588 +2428 +23E8 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5709 +ENCODING 22281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +27C8 +2108 +2FE8 +2448 +2288 +2FE8 +2108 +27C8 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+570A +ENCODING 22282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4104 +4104 +5FF4 +4104 +4FE4 +4104 +5FF4 +4024 +4444 +4284 +4104 +4084 +7FFC +4004 +ENDCHAR +STARTCHAR U+570B +ENCODING 22283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +20C8 +20A8 +3FF8 +2088 +2EA8 +2AA8 +2E58 +2378 +3CB8 +2118 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+570C +ENCODING 22284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4102 +4912 +4912 +4FF2 +4002 +5FFA +4082 +4102 +5FFA +524A +524A +524A +525A +4002 +7FFE +ENDCHAR +STARTCHAR U+570D +ENCODING 22285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +27C8 +2248 +2FE8 +27C8 +27C8 +27E8 +2448 +2FE8 +2048 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+570F +ENCODING 22287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2548 +2FE8 +2288 +3FF8 +2448 +2FE8 +3058 +27C8 +2428 +23E8 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5711 +ENCODING 22289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4142 +4122 +5FFA +4102 +4FF2 +4912 +4FF2 +4912 +4FF2 +4022 +5FFA +4422 +4222 +4062 +7FFE +ENDCHAR +STARTCHAR U+5712 +ENCODING 22290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2FE8 +2108 +3FF8 +27C8 +2448 +27E8 +23A8 +2D48 +2128 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5713 +ENCODING 22291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +27C8 +2448 +2FE8 +2828 +2FE8 +2FE8 +2828 +2FE8 +2668 +3818 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5714 +ENCODING 22292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +4081 +4FF9 +4081 +5FFD +4211 +47F9 +4005 +4FF9 +4949 +4949 +7FFF +4001 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5715 +ENCODING 22293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4102 +4FF2 +4112 +7FFE +4112 +4FF2 +4102 +4FF2 +4102 +7FFE +4812 +4FF2 +4812 +7FFE +0000 +ENDCHAR +STARTCHAR U+5716 +ENCODING 22294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +27C8 +2448 +27C8 +2108 +3FF8 +2FE8 +2BA8 +2AA8 +2BA8 +2FE8 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5718 +ENCODING 22296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2FE8 +27C8 +2548 +27C8 +2548 +27E8 +2FE8 +2048 +2FE8 +2248 +3FF8 +0000 +ENDCHAR +STARTCHAR U+571A +ENCODING 22298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4102 +4FF2 +4912 +4FF2 +4102 +7FFE +4812 +4FF2 +4812 +4FF2 +4812 +4FF2 +4422 +4812 +7FFE +ENDCHAR +STARTCHAR U+571B +ENCODING 22299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4002 +5FFA +524A +5FFA +4102 +4FF2 +4102 +5FFA +4422 +4FF2 +4102 +5FFA +4102 +4102 +7FFE +ENDCHAR +STARTCHAR U+571C +ENCODING 22300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2FE8 +2AA8 +2FE8 +3FF8 +27C8 +2448 +27D8 +3EA8 +2748 +2C38 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+571D +ENCODING 22301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +8001 +9109 +9109 +A3D1 +A815 +9189 +A413 +FDBF +940B +B3D9 +DE6F +9249 +93C9 +8001 +FFFF +ENDCHAR +STARTCHAR U+571E +ENCODING 22302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +5089 +7FF3 +53DD +680B +7BDF +43C1 +6A6B +6BEB +4081 +7FFF +4491 +4889 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+571F +ENCODING 22303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +3FF8 +0100 +0100 +0100 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5720 +ENCODING 22304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +1040 +FE40 +1040 +1040 +1040 +1040 +1040 +1E40 +F040 +0040 +0041 +0063 +003E +ENDCHAR +STARTCHAR U+5722 +ENCODING 22306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +13FF +1010 +FC10 +1010 +1010 +1010 +1010 +1010 +1C10 +F010 +0010 +0010 +0010 +0070 +ENDCHAR +STARTCHAR U+5723 +ENCODING 22307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FF8 +1010 +0C60 +0280 +0100 +02C0 +0C30 +310E +C124 +1FF0 +0100 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+5724 +ENCODING 22308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +1040 +FE40 +1040 +1070 +105C +1046 +1043 +1E40 +F040 +0040 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U+5725 +ENCODING 22309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +3FFC +0100 +0100 +0100 +FFFF +0440 +0440 +0440 +0C40 +0840 +1841 +3063 +E03E +ENDCHAR +STARTCHAR U+5726 +ENCODING 22310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1040 +1040 +1040 +7C40 +1040 +10C0 +10A0 +14A0 +1920 +6110 +0210 +0408 +0804 +0000 +ENDCHAR +STARTCHAR U+5727 +ENCODING 22311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1080 +1080 +1080 +1080 +17F8 +1080 +1080 +1080 +2080 +2080 +4FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5728 +ENCODING 22312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +7FFC +0440 +0C40 +0840 +0BF8 +1840 +2840 +4840 +0840 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+5729 +ENCODING 22313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +11FC +1020 +1420 +FE20 +1024 +13FE +1020 +1020 +1E20 +F020 +4020 +0020 +00A0 +0040 +ENDCHAR +STARTCHAR U+572A +ENCODING 22314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1084 +10FE +1500 +FE00 +11F8 +1010 +1020 +1040 +1E80 +F100 +4102 +0102 +00FE +0000 +ENDCHAR +STARTCHAR U+572C +ENCODING 22316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +11FC +1000 +1400 +FE04 +13FE +1080 +1088 +11FC +1E08 +F008 +4008 +0088 +0050 +0020 +ENDCHAR +STARTCHAR U+572D +ENCODING 22317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1FF0 +0100 +0100 +7FFC +0100 +0100 +3FF8 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+572E +ENCODING 22318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +13FC +1008 +1408 +FE08 +1008 +13F8 +1208 +1200 +1E00 +F200 +4202 +0202 +01FE +0000 +ENDCHAR +STARTCHAR U+572F +ENCODING 22319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +13FC +1208 +1208 +FE08 +1208 +13F8 +1208 +1200 +1E00 +F200 +4202 +0202 +01FE +0000 +ENDCHAR +STARTCHAR U+5730 +ENCODING 22320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1240 +1240 +1248 +7E78 +13C8 +1648 +1248 +1248 +1670 +1A40 +6204 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+5733 +ENCODING 22323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1104 +1124 +1124 +1524 +FF24 +1124 +1124 +1124 +1124 +1D24 +F124 +4224 +0204 +0404 +0004 +ENDCHAR +STARTCHAR U+5734 +ENCODING 22324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2080 +20FE +F982 +2102 +2302 +20C2 +2062 +2022 +3802 +E002 +0006 +0004 +000C +0038 +ENDCHAR +STARTCHAR U+5737 +ENCODING 22327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13FC +1040 +1040 +7C40 +1060 +1050 +1048 +1448 +1840 +6040 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5738 +ENCODING 22328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +1040 +1248 +7E48 +1248 +1248 +1248 +1648 +1A48 +6248 +03F8 +0208 +0208 +0000 +ENDCHAR +STARTCHAR U+5739 +ENCODING 22329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1024 +13FE +1200 +FE00 +1200 +1200 +1200 +1200 +1E00 +F200 +4400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U+573A +ENCODING 22330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27F8 +2020 +2040 +F880 +2104 +27FE +2124 +2124 +2124 +3A24 +E244 +4444 +0884 +1128 +0010 +ENDCHAR +STARTCHAR U+573B +ENCODING 22331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +1030 +11C0 +1100 +7D00 +11FC +1120 +1120 +1520 +1A20 +6220 +0420 +0820 +0020 +0000 +ENDCHAR +STARTCHAR U+573D +ENCODING 22333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2100 +2100 +21FF +2149 +FB49 +2249 +2649 +20C9 +2099 +3991 +E331 +0621 +0063 +00C2 +000E +ENDCHAR +STARTCHAR U+573E +ENCODING 22334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +1108 +1108 +1110 +FD10 +113C +1184 +1188 +1148 +1E50 +F220 +4450 +0490 +090E +1204 +ENDCHAR +STARTCHAR U+573F +ENCODING 22335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +2050 +20D8 +F98C +238E +268B +2088 +2088 +2088 +3888 +E088 +0188 +0108 +0308 +0608 +ENDCHAR +STARTCHAR U+5740 +ENCODING 22336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +1040 +1240 +7E40 +1278 +1240 +1240 +1640 +1A40 +6240 +0240 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5741 +ENCODING 22337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +13FE +1110 +7D10 +1110 +11FF +1110 +1110 +1510 +1908 +7129 +0145 +0183 +0701 +0000 +0000 +ENDCHAR +STARTCHAR U+5742 +ENCODING 22338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +1100 +1100 +7DF8 +1188 +1188 +1150 +1150 +1E20 +6260 +0490 +0B08 +1004 +0000 +ENDCHAR +STARTCHAR U+5745 +ENCODING 22341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +2050 +20D8 +F98C +2306 +26FB +2000 +2000 +21FC +3804 +E00C +0008 +0018 +0010 +0030 +ENDCHAR +STARTCHAR U+5746 +ENCODING 22342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2080 +21FF +F904 +2384 +268C +20C8 +2058 +2070 +3820 +E070 +00D8 +018C +0306 +0603 +ENDCHAR +STARTCHAR U+5747 +ENCODING 22343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1100 +1100 +11F8 +7E08 +1308 +1488 +1088 +1028 +14C8 +1B08 +6008 +0008 +0030 +0000 +ENDCHAR +STARTCHAR U+5749 +ENCODING 22345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0024 +13FE +1020 +1124 +7D24 +1124 +1124 +11FC +1420 +1820 +7021 +0021 +003F +0000 +0000 +ENDCHAR +STARTCHAR U+574A +ENCODING 22346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +1040 +17FC +7C40 +1040 +1040 +1078 +1088 +1C88 +6108 +0208 +0408 +0830 +0000 +ENDCHAR +STARTCHAR U+574B +ENCODING 22347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +0044 +1082 +1101 +1000 +7CFE +1022 +1022 +1022 +1422 +1842 +7082 +010A +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+574C +ENCODING 22348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0180 +0480 +0440 +0820 +1010 +2FEE +C424 +0420 +08A0 +3140 +0110 +3FF8 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+574D +ENCODING 22349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +2208 +2208 +2288 +FA48 +2248 +2208 +2FFE +2208 +2208 +3A08 +E208 +4408 +0428 +0810 +ENDCHAR +STARTCHAR U+574E +ENCODING 22350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1100 +1100 +11FC +7E44 +1248 +1450 +10C0 +14A0 +18A0 +6110 +0110 +0208 +0404 +0000 +ENDCHAR +STARTCHAR U+574F +ENCODING 22351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13FC +1020 +1020 +7C40 +1060 +10D0 +1148 +1644 +1844 +6040 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5750 +ENCODING 22352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0920 +0920 +0920 +1960 +1550 +2388 +4104 +3FF8 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5751 +ENCODING 22353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +17FC +1000 +7C00 +11E0 +1120 +1120 +1120 +1D20 +6220 +0224 +0424 +081C +0000 +ENDCHAR +STARTCHAR U+5752 +ENCODING 22354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2046 +3E7C +2040 +2041 +2043 +3E7E +E000 +0100 +0100 +3FFC +0100 +0100 +FFFF +0000 +ENDCHAR +STARTCHAR U+5757 +ENCODING 22359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +1088 +13FC +FC88 +1088 +1088 +1088 +17FE +1C80 +F140 +4120 +0210 +040E +0804 +ENDCHAR +STARTCHAR U+575A +ENCODING 22362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +25F8 +2508 +2490 +2490 +2460 +2420 +24D0 +270E +0504 +0110 +3FF8 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+575B +ENCODING 22363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +13FC +1000 +1000 +FC04 +17FE +1040 +1040 +1080 +1090 +1D08 +F104 +43FC +0004 +0000 +ENDCHAR +STARTCHAR U+575C +ENCODING 22364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +13FE +1240 +1240 +FE44 +13FE +1244 +1244 +1244 +1E44 +F244 +4484 +0484 +0928 +1210 +ENDCHAR +STARTCHAR U+575D +ENCODING 22365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +1124 +1124 +FD24 +1124 +1124 +1124 +1124 +1D24 +F124 +4050 +0048 +0086 +0302 +ENDCHAR +STARTCHAR U+575E +ENCODING 22366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1088 +11FC +1108 +1108 +FD08 +1128 +1110 +1104 +11FE +1004 +1C24 +F3F4 +4004 +0014 +0008 +ENDCHAR +STARTCHAR U+575F +ENCODING 22367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1020 +1004 +13FE +FC88 +1088 +1088 +1088 +1048 +1050 +1C20 +F050 +4088 +010E +0604 +ENDCHAR +STARTCHAR U+5760 +ENCODING 22368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C40 +4440 +48A0 +50A0 +48A0 +4510 +6508 +5A0E +4404 +4100 +5FF0 +0100 +0100 +FFFE +0000 +ENDCHAR +STARTCHAR U+5761 +ENCODING 22369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +13FC +1248 +7E50 +1240 +13F8 +1308 +1690 +1A90 +6460 +0460 +0990 +160C +0000 +ENDCHAR +STARTCHAR U+5762 +ENCODING 22370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2222 +2326 +2124 +F820 +23FE +2020 +2020 +2020 +27FF +3820 +E020 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+5764 +ENCODING 22372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +1040 +13F8 +7E48 +1248 +13F8 +1248 +1648 +1BF8 +6248 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5765 +ENCODING 22373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +2104 +2104 +F904 +21FC +2104 +2104 +2104 +21FC +3904 +E104 +0104 +0104 +07FF +0000 +ENDCHAR +STARTCHAR U+5766 +ENCODING 22374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +11F0 +1110 +1110 +7D10 +11F0 +1110 +1110 +1510 +19F0 +6110 +0000 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5767 +ENCODING 22375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2020 +2020 +F820 +2060 +2040 +207E +20C2 +21C2 +3B42 +6042 +8042 +0042 +0042 +007E +ENDCHAR +STARTCHAR U+5768 +ENCODING 22376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1020 +13FE +1202 +FC04 +1100 +1110 +1130 +1140 +1D80 +F100 +4102 +0102 +00FE +0000 +ENDCHAR +STARTCHAR U+5769 +ENCODING 22377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +1110 +1110 +17FC +7D10 +1110 +1110 +11F0 +1510 +1910 +6110 +0110 +01F0 +0110 +0000 +ENDCHAR +STARTCHAR U+576A +ENCODING 22378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +17FC +1040 +1248 +7D48 +1150 +1040 +17FC +1040 +1C40 +6040 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+576B +ENCODING 22379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1044 +107E +1440 +FE40 +1040 +1048 +13FC +1208 +1208 +1E08 +F208 +4208 +03F8 +0208 +ENDCHAR +STARTCHAR U+576D +ENCODING 22381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1208 +1208 +1208 +FFF8 +1200 +1280 +1288 +1298 +1EA0 +F2C0 +4482 +0482 +087E +1000 +ENDCHAR +STARTCHAR U+576E +ENCODING 22382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1040 +1044 +1082 +7C9E +11E1 +1000 +1000 +10FE +1082 +1C82 +6082 +0082 +00FE +0082 +ENDCHAR +STARTCHAR U+576F +ENCODING 22383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +13FE +1010 +1010 +FC20 +1020 +1068 +10A4 +1122 +1222 +1C20 +F020 +4024 +07FE +0000 +ENDCHAR +STARTCHAR U+5770 +ENCODING 22384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +1102 +7D02 +117A +114A +114A +114A +114A +1F7A +7102 +0102 +0102 +0102 +010E +ENDCHAR +STARTCHAR U+5771 +ENCODING 22385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +21FC +2124 +F924 +2124 +2124 +2124 +27FF +2050 +38D8 +E088 +018C +0306 +0603 +ENDCHAR +STARTCHAR U+5772 +ENCODING 22386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +2090 +27FE +2092 +7892 +27FE +2490 +2490 +27FF +2891 +3091 +6116 +0210 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5773 +ENCODING 22387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1120 +1120 +1224 +127E +FCA4 +17A4 +1124 +1224 +14A4 +17A4 +1C24 +F044 +4044 +0094 +0108 +ENDCHAR +STARTCHAR U+5774 +ENCODING 22388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +3FFC +0100 +0100 +7FFE +0420 +0C20 +193E +7100 +0100 +3FFC +0100 +0100 +FFFF +0000 +ENDCHAR +STARTCHAR U+5775 +ENCODING 22389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +11E0 +1100 +1100 +1100 +7D00 +11FE +1108 +1108 +1108 +1108 +1F08 +7108 +0108 +07FF +0000 +ENDCHAR +STARTCHAR U+5776 +ENCODING 22390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1148 +1128 +FD28 +110A +17FE +1208 +1288 +1E48 +F248 +43FC +0008 +0050 +0020 +ENDCHAR +STARTCHAR U+5777 +ENCODING 22391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +17FE +1008 +1008 +FDE8 +1128 +1128 +1128 +1128 +1128 +1DE8 +F128 +4008 +0028 +0010 +ENDCHAR +STARTCHAR U+5779 +ENCODING 22393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +23FF +FA01 +2201 +2249 +2048 +2048 +2048 +38CC +E084 +0084 +0186 +0102 +0303 +ENDCHAR +STARTCHAR U+577A +ENCODING 22394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +204C +2044 +23FF +F840 +2040 +2044 +20E4 +20AC +20A8 +39B8 +6110 +C338 +066C +00C6 +0183 +ENDCHAR +STARTCHAR U+577B +ENCODING 22395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +103C +13E0 +1220 +1220 +FE28 +13FC +1220 +1220 +1220 +1E20 +F210 +4290 +0352 +062A +0006 +ENDCHAR +STARTCHAR U+577C +ENCODING 22396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +11E0 +1100 +1100 +FD04 +11FE +1110 +1110 +1150 +1D30 +F118 +4214 +0210 +0410 +0010 +ENDCHAR +STARTCHAR U+577D +ENCODING 22397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1028 +1044 +1082 +7D01 +1078 +1000 +1000 +14FE +1802 +7004 +0028 +0010 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+577E +ENCODING 22398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FE +2202 +FA02 +2000 +27FF +2020 +2020 +2020 +3820 +E020 +0020 +0020 +0020 +00E0 +ENDCHAR +STARTCHAR U+577F +ENCODING 22399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +1090 +1090 +1110 +7DFC +1310 +1590 +1150 +1550 +1910 +6110 +0110 +0110 +0130 +0000 +ENDCHAR +STARTCHAR U+5780 +ENCODING 22400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +10F8 +1010 +7C92 +1054 +1010 +11FF +1410 +1810 +7010 +0010 +0090 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5781 +ENCODING 22401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +21FE +2120 +FB20 +2020 +2020 +23FF +2020 +2020 +3870 +E050 +00D8 +018C +0306 +0603 +ENDCHAR +STARTCHAR U+5782 +ENCODING 22402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +3FF8 +0920 +0920 +7FFC +0920 +0920 +3FF8 +0100 +0100 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+5783 +ENCODING 22403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +1048 +13FC +1000 +FD08 +1108 +1108 +1090 +1090 +1090 +1CA0 +E020 +4044 +07FE +0000 +ENDCHAR +STARTCHAR U+5784 +ENCODING 22404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0280 +0244 +FFFE +0500 +0510 +0920 +11C4 +2704 +C0FC +0100 +0108 +7FFC +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+5785 +ENCODING 22405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10A0 +1090 +1094 +17FE +FCA0 +10A0 +10A4 +10A4 +1128 +1D28 +F130 +4262 +02A2 +041E +0800 +ENDCHAR +STARTCHAR U+5786 +ENCODING 22406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +107E +1040 +1048 +FFFC +1208 +1208 +1208 +13F8 +1E08 +F200 +4400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U+5788 +ENCODING 22408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0450 +0448 +085C +0BE0 +1820 +2810 +4914 +090C +0104 +1FF0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5789 +ENCODING 22409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1100 +1100 +13F8 +7E08 +17C8 +1248 +1248 +17C8 +1A70 +6200 +0204 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+578B +ENCODING 22411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3FC8 +1248 +1248 +7FC8 +1248 +1248 +2218 +4100 +1FF0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+578C +ENCODING 22412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1204 +1204 +12F4 +FE04 +1204 +12F4 +1294 +1294 +1E94 +F2F4 +4204 +0204 +0214 +0208 +ENDCHAR +STARTCHAR U+578F +ENCODING 22415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1010 +107E +1012 +7DFF +1012 +107E +1010 +14FE +1810 +71FF +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5792 +ENCODING 22418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0200 +0420 +0810 +3FF8 +0810 +1020 +2448 +7EFC +0100 +0110 +3FF8 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+5793 +ENCODING 22419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +13FC +1040 +7C50 +1190 +10A0 +1068 +1448 +1890 +6130 +0048 +0184 +0604 +0000 +ENDCHAR +STARTCHAR U+5794 +ENCODING 22420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2050 +23FE +FA52 +2292 +231E +2202 +23FE +2020 +3820 +E3FE +0020 +0020 +07FF +0000 +ENDCHAR +STARTCHAR U+5795 +ENCODING 22421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +00F8 +3F80 +2000 +3FFF +2000 +27FC +2404 +2404 +27FC +2000 +2040 +6FFE +4040 +C040 +1FFF +ENDCHAR +STARTCHAR U+5797 +ENCODING 22423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +2090 +2492 +2696 +229C +FA90 +2090 +2090 +239C +2696 +2092 +3890 +E190 +0111 +0313 +060E +ENDCHAR +STARTCHAR U+5798 +ENCODING 22424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +208A +2109 +2208 +797F +2108 +2108 +2108 +2908 +3108 +6114 +0122 +0141 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+5799 +ENCODING 22425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2222 +2326 +2124 +F924 +2020 +2020 +27FF +2088 +2088 +3888 +E088 +0188 +0109 +0309 +0607 +ENDCHAR +STARTCHAR U+579A +ENCODING 22426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +3FFC +0100 +0100 +0100 +7FFE +0000 +1010 +1010 +FEFE +1010 +1010 +1E10 +F1FF +0000 +ENDCHAR +STARTCHAR U+579B +ENCODING 22427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11F8 +1110 +1110 +FD10 +1110 +164C +1040 +1FFE +10C0 +1CE0 +F150 +4248 +0446 +0844 +0040 +ENDCHAR +STARTCHAR U+579C +ENCODING 22428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FC +2024 +2027 +F861 +20C1 +2183 +232E +2020 +27FF +38A8 +E1AC +0326 +0623 +0020 +0020 +ENDCHAR +STARTCHAR U+579D +ENCODING 22429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +20FC +2188 +2110 +FBFF +2500 +2100 +217C +2144 +2144 +3944 +E14C +0340 +0241 +0663 +003E +ENDCHAR +STARTCHAR U+579E +ENCODING 22430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2201 +220D +F838 +23E0 +2040 +2040 +27FF +2040 +3840 +E040 +0041 +0063 +003E +ENDCHAR +STARTCHAR U+579F +ENCODING 22431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +218C +2088 +23FE +F820 +2020 +2020 +21FC +2020 +2020 +3820 +E7FF +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+57A0 +ENCODING 22432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13F0 +1210 +1210 +7FF0 +1210 +1210 +13F4 +1644 +1A48 +6230 +0290 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+57A1 +ENCODING 22433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0920 +0910 +0900 +11FC +1F00 +3090 +50A0 +9044 +11A4 +171C +0100 +3FF8 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+57A2 +ENCODING 22434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +13E0 +1200 +1200 +7FFC +1200 +1200 +12F8 +1288 +1E88 +6488 +0488 +08F8 +0088 +0000 +ENDCHAR +STARTCHAR U+57A3 +ENCODING 22435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +17FC +1000 +11F0 +7D10 +1110 +11F0 +1110 +1510 +19F0 +6110 +0000 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+57A4 +ENCODING 22436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13FC +1040 +1050 +7C88 +13FC +1044 +1040 +17F8 +1840 +6040 +0040 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+57A5 +ENCODING 22437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1028 +1044 +1082 +7D01 +10FE +1000 +1000 +10FE +1482 +1882 +7082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+57A6 +ENCODING 22438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +2010 +3FF0 +2010 +3FF0 +2208 +2190 +2460 +381C +0108 +7FFC +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+57A7 +ENCODING 22439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1084 +13FE +1204 +FE04 +12F4 +1294 +1294 +1294 +1E94 +F2F4 +4204 +0204 +0214 +0208 +ENDCHAR +STARTCHAR U+57A8 +ENCODING 22440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2201 +FA01 +2008 +2008 +23FF +2008 +2008 +3988 +E0C8 +0048 +0008 +0008 +0038 +ENDCHAR +STARTCHAR U+57A9 +ENCODING 22441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0280 +2288 +1A98 +0AA0 +0284 +FFFE +0100 +0110 +3FF8 +0100 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+57AA +ENCODING 22442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +1088 +1090 +13FC +7C90 +1090 +1090 +1090 +17FC +1890 +6110 +0110 +0210 +0410 +0000 +ENDCHAR +STARTCHAR U+57AB +ENCODING 22443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +7EFC +0848 +0AC8 +1C68 +6858 +088A +2B06 +1100 +0108 +7FFC +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+57AC +ENCODING 22444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +2088 +2088 +FBFE +2088 +2088 +2088 +2088 +3888 +E7FF +0000 +0088 +018C +0306 +0603 +ENDCHAR +STARTCHAR U+57AD +ENCODING 22445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +10A0 +10A0 +10A0 +FCA4 +14A4 +12A4 +12A8 +12A8 +1CA0 +F0A0 +40A0 +00A4 +0FFE +0000 +ENDCHAR +STARTCHAR U+57AE +ENCODING 22446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2048 +27FC +F8A0 +2110 +220E +25F4 +2800 +23FC +3880 +E1F8 +4008 +0008 +0090 +0060 +ENDCHAR +STARTCHAR U+57B0 +ENCODING 22448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +1078 +1040 +7C40 +13FC +1000 +13FC +1440 +1870 +6048 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+57B2 +ENCODING 22450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1444 +1444 +17FC +FC04 +1008 +13FC +1008 +1008 +13F8 +1E08 +F200 +4202 +0202 +01FE +ENDCHAR +STARTCHAR U+57B3 +ENCODING 22451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +10F8 +1100 +1200 +7C80 +10FC +1110 +1310 +1510 +1910 +6110 +0110 +0110 +0130 +0000 +ENDCHAR +STARTCHAR U+57B4 +ENCODING 22452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2040 +2044 +2FFE +2000 +F810 +2514 +24A4 +24A4 +2444 +24A4 +3C94 +E514 +4404 +07FC +0404 +ENDCHAR +STARTCHAR U+57B5 +ENCODING 22453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1101 +1101 +7C40 +1044 +11FF +1044 +1444 +1828 +7010 +0028 +0044 +0383 +0000 +0000 +ENDCHAR +STARTCHAR U+57B6 +ENCODING 22454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1010 +11FE +1084 +7C48 +1030 +13FF +1010 +1410 +19FE +7010 +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+57B8 +ENCODING 22456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +13FE +1202 +1424 +FDF0 +1000 +1004 +17FE +10A0 +1CA0 +F0A0 +4122 +0122 +021E +0C00 +ENDCHAR +STARTCHAR U+57B9 +ENCODING 22457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +213F +27D1 +2112 +7914 +27D2 +2111 +2111 +27D1 +2919 +3116 +6110 +0210 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+57BA +ENCODING 22458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +11FE +1010 +1111 +7C92 +11FE +1004 +1018 +15FF +1810 +6010 +0010 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+57BC +ENCODING 22460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087C +7045 +0587 +0800 +707C +1028 +1010 +10EE +0000 +0080 +1FFC +0080 +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+57BD +ENCODING 22461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +300E +19F8 +C100 +6100 +01FF +1910 +7310 +C210 +0610 +0100 +0100 +7FFE +0100 +0100 +FFFF +0000 +ENDCHAR +STARTCHAR U+57BF +ENCODING 22463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +23FF +2200 +7AFE +2204 +2238 +2208 +23FF +2A12 +3210 +6210 +0410 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+57C0 +ENCODING 22464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +7FFC +0548 +3D50 +0560 +0D48 +3538 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+57C1 +ENCODING 22465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0222 +2222 +23FE +2020 +7850 +2088 +2104 +2673 +2000 +29FC +3008 +6010 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+57C2 +ENCODING 22466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +2FFE +2040 +27FC +FC44 +2444 +27FC +2444 +2444 +27FC +3C44 +E340 +4080 +0160 +061E +1804 +ENDCHAR +STARTCHAR U+57C3 +ENCODING 22467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1050 +1088 +13FC +7C84 +1080 +11F8 +1240 +1040 +1FFC +60C0 +00A0 +0310 +0C0C +0000 +ENDCHAR +STARTCHAR U+57C6 +ENCODING 22470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +10F0 +1120 +1640 +7FF8 +1248 +1248 +13F8 +1648 +1A48 +63F8 +0208 +0408 +0818 +0000 +ENDCHAR +STARTCHAR U+57C7 +ENCODING 22471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1004 +1048 +1030 +7FFE +1222 +1222 +13FE +1222 +1E22 +73FE +0222 +0222 +0222 +0226 +ENDCHAR +STARTCHAR U+57C8 +ENCODING 22472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1044 +109E +13E9 +7C48 +1089 +110F +1640 +10FE +1D04 +7288 +0C50 +0030 +00CC +0703 +ENDCHAR +STARTCHAR U+57CB +ENCODING 22475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +1248 +7FF8 +1248 +1248 +13F8 +1040 +1FF8 +6040 +0040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+57CC +ENCODING 22476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +23FC +2204 +FA04 +23FC +2204 +2204 +23FC +2221 +3A33 +E216 +0218 +02CC +0386 +0E03 +ENDCHAR +STARTCHAR U+57CE +ENCODING 22478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +1048 +1048 +13FC +7E40 +1248 +13A8 +12A8 +16B0 +1A90 +6490 +06B4 +09CC +1004 +0000 +ENDCHAR +STARTCHAR U+57CF +ENCODING 22479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +200C +2F70 +2110 +2210 +FA50 +245C +2F50 +2150 +2950 +2550 +3A50 +E27C +0500 +0886 +107C +ENDCHAR +STARTCHAR U+57D0 +ENCODING 22480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +2004 +23FF +2004 +79FC +2000 +27FF +2401 +22FA +2850 +3020 +6050 +0088 +0707 +0000 +0000 +ENDCHAR +STARTCHAR U+57D2 +ENCODING 22482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +1030 +13D0 +1148 +7D44 +1244 +1010 +1010 +17FC +1910 +6090 +0090 +0010 +0030 +0000 +ENDCHAR +STARTCHAR U+57D3 +ENCODING 22483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +1044 +13A4 +1118 +7C90 +10E0 +1390 +1010 +17FC +1910 +6090 +0090 +0010 +0030 +0000 +ENDCHAR +STARTCHAR U+57D4 +ENCODING 22484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +1048 +17FC +1040 +7FF8 +1248 +1248 +13F8 +1648 +1A48 +63F8 +0248 +0248 +0258 +0000 +ENDCHAR +STARTCHAR U+57D5 +ENCODING 22485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +1104 +1104 +FDFC +1104 +1000 +13FE +1020 +1020 +1DFC +F020 +4024 +07FE +0000 +ENDCHAR +STARTCHAR U+57D6 +ENCODING 22486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +1110 +17FC +1110 +7CA0 +10A0 +10A4 +1128 +1530 +1B20 +6520 +0124 +0124 +011C +0000 +ENDCHAR +STARTCHAR U+57D8 +ENCODING 22488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2088 +27C8 +2488 +248A +FCFE +2488 +2788 +24C8 +24A8 +24A8 +3C88 +E788 +4488 +0028 +0010 +ENDCHAR +STARTCHAR U+57D9 +ENCODING 22489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1108 +11F8 +FC04 +13FE +1204 +1224 +1224 +1E24 +F244 +4244 +0098 +0304 +0C02 +ENDCHAR +STARTCHAR U+57DA +ENCODING 22490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1108 +11F8 +FD48 +1044 +13FE +1244 +1244 +1E44 +F2B4 +4314 +0204 +0214 +0208 +ENDCHAR +STARTCHAR U+57DC +ENCODING 22492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +1C70 +1A70 +2AA8 +4924 +0920 +0100 +1FF0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+57DD +ENCODING 22493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +1110 +FE8E +1444 +13F8 +1010 +1020 +1C80 +F040 +4544 +0512 +0912 +00F0 +ENDCHAR +STARTCHAR U+57DE +ENCODING 22494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FE +2202 +FA02 +21FC +2020 +2020 +2120 +213E +3920 +E120 +0120 +03A0 +02E0 +063F +ENDCHAR +STARTCHAR U+57DF +ENCODING 22495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1050 +1048 +17FC +1040 +7FC8 +12C8 +12A8 +13A8 +1630 +1894 +6334 +0C4C +0084 +0000 +ENDCHAR +STARTCHAR U+57E0 +ENCODING 22496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1080 +13F0 +1210 +7FF0 +1200 +13F8 +1208 +13F8 +1C40 +67FC +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+57E1 +ENCODING 22497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +27FF +2088 +2088 +2088 +FB8E +2202 +2202 +2202 +238E +2088 +3888 +E088 +0088 +07FF +0000 +ENDCHAR +STARTCHAR U+57E2 +ENCODING 22498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0092 +1054 +1038 +11FF +7C10 +11FF +1044 +1482 +197D +7044 +0044 +0049 +0041 +007F +0000 +0000 +ENDCHAR +STARTCHAR U+57E3 +ENCODING 22499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +17FC +1110 +7D10 +1198 +1264 +1444 +1040 +1FFC +6040 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+57E4 +ENCODING 22500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1084 +13FE +1224 +1224 +FFFC +1244 +1244 +13FC +10A0 +1D24 +F7FE +4020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+57E5 +ENCODING 22501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +27FF +2020 +23FE +7820 +27FF +2000 +23FE +2A02 +33FE +6202 +03FE +0202 +0406 +0000 +0000 +ENDCHAR +STARTCHAR U+57E6 +ENCODING 22502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FE +2202 +2202 +F900 +21DE +2152 +2352 +2652 +21D2 +3896 +E190 +0111 +0313 +060E +ENDCHAR +STARTCHAR U+57E7 +ENCODING 22503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +2104 +2104 +F9FC +2104 +2104 +21FC +2104 +2104 +39FC +E000 +07FF +0088 +018C +0306 +ENDCHAR +STARTCHAR U+57E9 +ENCODING 22505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +203C +23E2 +2126 +F894 +23FE +2022 +2022 +27FF +2022 +3822 +E3FE +0020 +0020 +0020 +00E0 +ENDCHAR +STARTCHAR U+57EC +ENCODING 22508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +27FF +2020 +7BFE +2222 +23FE +2222 +23FE +28A8 +3124 +6222 +0421 +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+57ED +ENCODING 22509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +13FC +1048 +104A +FFFE +1048 +1048 +13F8 +1040 +1E48 +F150 +4250 +0C4E +0144 +0080 +ENDCHAR +STARTCHAR U+57EE +ENCODING 22510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1092 +1054 +7C10 +1028 +1044 +1193 +1092 +1054 +1428 +1844 +7082 +0101 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+57EF +ENCODING 22511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1084 +17FE +1110 +FD50 +13F8 +164E +1A48 +13F8 +1E48 +F248 +43F8 +024A +0042 +003E +ENDCHAR +STARTCHAR U+57F0 +ENCODING 22512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +10E2 +1091 +1108 +7E00 +1020 +1020 +1020 +17FF +1020 +1C70 +6068 +00A8 +0124 +0222 +0421 +ENDCHAR +STARTCHAR U+57F1 +ENCODING 22513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +211F +21D1 +2111 +7911 +27D1 +2111 +2391 +2551 +292A +2904 +310A +6111 +0321 +0000 +0000 +ENDCHAR +STARTCHAR U+57F2 +ENCODING 22514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +23FE +2040 +23FE +7840 +27FF +2124 +2222 +25FD +2820 +37FF +6020 +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+57F3 +ENCODING 22515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20FF +2102 +2204 +7808 +2090 +2100 +220F +2201 +2BDF +3201 +6201 +03FF +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+57F4 +ENCODING 22516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +1020 +13FC +1020 +7EF8 +1288 +12F8 +1288 +16F8 +1A88 +62F8 +0288 +0200 +01FC +0000 +ENDCHAR +STARTCHAR U+57F5 +ENCODING 22517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200C +2038 +23E0 +2020 +FBFE +2124 +2124 +2124 +27FF +2124 +3924 +E124 +03FE +0020 +0020 +07FF +ENDCHAR +STARTCHAR U+57F6 +ENCODING 22518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +7E20 +1020 +10FC +FF24 +2424 +24A4 +C764 +1024 +1034 +7E54 +1054 +1045 +1EC5 +F183 +ENDCHAR +STARTCHAR U+57F7 +ENCODING 22519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +3E40 +09F0 +7F50 +2250 +12D0 +1450 +7F70 +08B0 +3E90 +0894 +0914 +0A0C +0000 +ENDCHAR +STARTCHAR U+57F8 +ENCODING 22520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1208 +13F8 +1208 +FFF8 +1100 +1104 +13FE +14A4 +10A4 +1D24 +F144 +4244 +0494 +0108 +ENDCHAR +STARTCHAR U+57F9 +ENCODING 22521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +13FC +1110 +7C90 +10A0 +17FC +1000 +11F8 +1D08 +6108 +0108 +01F8 +0108 +0000 +ENDCHAR +STARTCHAR U+57FA +ENCODING 22522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +07C0 +0440 +07C0 +0440 +7FFC +0920 +1FF0 +610C +0100 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+57FB +ENCODING 22523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1000 +10FE +7C82 +10FE +1000 +147C +1808 +71FF +0010 +0010 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+57FC +ENCODING 22524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +13F8 +1060 +7C90 +1308 +17FC +1008 +17C8 +1A48 +6248 +03C8 +0208 +0018 +0000 +ENDCHAR +STARTCHAR U+57FD +ENCODING 22525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +2008 +21F8 +2808 +FBF8 +2000 +27FE +2442 +2BFC +3A48 +E248 +4248 +0258 +0040 +0040 +ENDCHAR +STARTCHAR U+57FE +ENCODING 22526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +2200 +3EFE +2242 +3E66 +222C +2218 +3E3C +E2E7 +0100 +7FFE +0100 +0100 +FFFF +0000 +ENDCHAR +STARTCHAR U+57FF +ENCODING 22527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +33FE +1A02 +C3FE +6200 +028C +1AB8 +72E0 +C681 +0CC3 +017E +0100 +7FFE +0100 +0100 +FFFF +0000 +ENDCHAR +STARTCHAR U+5800 +ENCODING 22528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13FC +1204 +13FC +7E20 +12A8 +12A8 +12A8 +16F8 +1B24 +6524 +0524 +09FC +1104 +0000 +ENDCHAR +STARTCHAR U+5801 +ENCODING 22529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +2222 +23FE +2222 +7A22 +23FE +2020 +27FF +2870 +30A8 +6124 +0222 +0421 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5802 +ENCODING 22530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0920 +3FFC +2008 +4FE0 +0820 +0820 +0FE0 +0100 +1FF0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5803 +ENCODING 22531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +FEFF +2020 +3E3E +2222 +2222 +6666 +4444 +DDDC +0100 +7FFE +0100 +0100 +FFFF +0000 +ENDCHAR +STARTCHAR U+5804 +ENCODING 22532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20C0 +239E +2202 +FA02 +23DE +2202 +2202 +23FE +2090 +3890 +E090 +0190 +0111 +0313 +060E +ENDCHAR +STARTCHAR U+5805 +ENCODING 22533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +3E50 +2250 +3E20 +24D0 +3F0C +2100 +1FF0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5806 +ENCODING 22534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +1110 +1120 +13FC +7F20 +1520 +11F8 +1120 +1520 +19F8 +6120 +0120 +01FC +0100 +0000 +ENDCHAR +STARTCHAR U+5807 +ENCODING 22535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0820 +0FE0 +0108 +3FFC +2108 +3FF8 +0100 +7FFC +0100 +3FF8 +0100 +FFFE +0000 +ENDCHAR +STARTCHAR U+5808 +ENCODING 22536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +1145 +1129 +7DFF +1111 +1155 +1155 +1155 +1155 +1F55 +717D +0145 +0101 +0107 +ENDCHAR +STARTCHAR U+5809 +ENCODING 22537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +1040 +1084 +7D3E +13C1 +1000 +11FC +1104 +1DFC +6104 +01FC +0104 +0104 +010C +ENDCHAR +STARTCHAR U+580A +ENCODING 22538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0280 +1EF0 +1010 +1EF0 +1290 +0280 +7FFC +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+580B +ENCODING 22539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13B8 +12A8 +12A8 +7EA8 +13B8 +12A8 +12A8 +13B8 +1EA8 +64A8 +04C8 +08C8 +1198 +0000 +ENDCHAR +STARTCHAR U+580C +ENCODING 22540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +27FE +2402 +2442 +2442 +FDFA +2442 +2442 +24F2 +2492 +2492 +3C92 +E4F2 +0402 +07FE +0000 +ENDCHAR +STARTCHAR U+580D +ENCODING 22541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +10F8 +1110 +1224 +FFFE +1224 +1224 +1244 +13FC +1E44 +F0A0 +40B0 +012A +0622 +181E +ENDCHAR +STARTCHAR U+580E +ENCODING 22542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2020 +23FE +2020 +7820 +27FF +2204 +2487 +20FC +2988 +3250 +6020 +0050 +078F +0000 +0000 +ENDCHAR +STARTCHAR U+5810 +ENCODING 22544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +2210 +2210 +22FE +7A10 +2210 +23FF +2210 +2210 +2AFE +3210 +6410 +0010 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+5811 +ENCODING 22545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +FEF0 +2080 +2884 +7EFE +0890 +0F90 +F910 +4A10 +0910 +0100 +3FF8 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+5814 +ENCODING 22548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1129 +1129 +1149 +7C8E +1010 +11FF +1410 +1838 +7054 +0092 +0111 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5815 +ENCODING 22549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7FFC +4880 +71F8 +5308 +4DF8 +4908 +71F8 +4108 +4118 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5819 +ENCODING 22553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +17FC +10A0 +13F8 +7EA8 +12A8 +13F8 +1248 +1440 +1BF8 +6040 +0040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+581B +ENCODING 22555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2000 +21FC +2104 +F904 +21FC +2000 +2000 +23FE +3A22 +6222 +C3FE +0222 +0222 +03FE +ENDCHAR +STARTCHAR U+581C +ENCODING 22556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +11FF +7911 +1155 +1139 +11FF +1410 +1854 +7092 +0111 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+581D +ENCODING 22557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +11F0 +1110 +1170 +7D50 +1150 +13F8 +1208 +16E8 +1AA8 +62A8 +02E8 +0288 +0218 +0000 +ENDCHAR +STARTCHAR U+581E +ENCODING 22558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1290 +1294 +17FE +1290 +FE90 +12F0 +1200 +13FC +1040 +1FFE +F0E0 +4150 +024E +0C44 +0040 +ENDCHAR +STARTCHAR U+581F +ENCODING 22559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11FC +1004 +11FC +F804 +13FF +1040 +10A2 +1336 +1854 +7090 +C338 +0054 +0092 +0311 +0060 +ENDCHAR +STARTCHAR U+5820 +ENCODING 22560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1178 +1108 +1212 +13FE +FE00 +1688 +1AFC +1320 +1224 +1FFE +F220 +4220 +0250 +028E +0304 +ENDCHAR +STARTCHAR U+5821 +ENCODING 22561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F0 +1110 +11F0 +3040 +57FC +10E0 +1358 +1444 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5823 +ENCODING 22563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +1092 +10FE +1092 +7CFE +1092 +1010 +11FF +1511 +1915 +717D +0105 +0101 +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+5824 +ENCODING 22564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +11F0 +1110 +11F0 +7D10 +11F0 +1000 +17FC +1040 +1E78 +6240 +0340 +04C0 +083C +0000 +ENDCHAR +STARTCHAR U+5825 +ENCODING 22565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F10 +0220 +1C7F +0884 +7F24 +0A24 +1824 +6818 +1866 +0080 +1FFC +0080 +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5826 +ENCODING 22566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +2213 +23DE +2210 +2210 +FA11 +23CF +2620 +2040 +23FE +3A02 +6202 +C3FE +0202 +0202 +03FE +ENDCHAR +STARTCHAR U+5827 +ENCODING 22567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1020 +13FE +1252 +7E52 +1252 +1252 +1256 +1020 +1C20 +67FF +0050 +0088 +0104 +0603 +ENDCHAR +STARTCHAR U+5828 +ENCODING 22568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +1102 +11FE +1102 +7DFE +1080 +11FF +1311 +1111 +1529 +1945 +7101 +01F9 +000E +0000 +0000 +ENDCHAR +STARTCHAR U+5829 +ENCODING 22569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +22FF +2220 +2220 +7A3E +2322 +26A2 +2A32 +222A +2226 +2A22 +327E +6202 +0204 +02FF +0000 +0000 +ENDCHAR +STARTCHAR U+582A +ENCODING 22570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +17FC +1110 +11F0 +7D10 +11F0 +1110 +17FC +12A0 +1AA8 +6318 +0200 +03FC +0200 +0000 +ENDCHAR +STARTCHAR U+582C +ENCODING 22572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +1044 +1082 +1101 +7C7C +1000 +11E1 +1129 +15E9 +1929 +71E9 +0129 +0121 +0263 +0000 +0000 +ENDCHAR +STARTCHAR U+582D +ENCODING 22573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +23FE +2202 +2202 +23FE +FA02 +2202 +23FE +2000 +23FE +3820 +6020 +C3FE +0020 +0020 +07FF +ENDCHAR +STARTCHAR U+582E +ENCODING 22574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +1129 +1129 +11EF +7C00 +10FE +1000 +11FF +1440 +19FF +7001 +0001 +0012 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+582F +ENCODING 22575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0100 +3FF8 +0820 +3EF8 +0820 +0FFC +7000 +3FF8 +0240 +0444 +1844 +603C +0000 +ENDCHAR +STARTCHAR U+5830 +ENCODING 22576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13FC +1200 +12F8 +7E88 +12F8 +1288 +12F8 +1620 +1BFC +62D0 +0230 +02C8 +03FC +0000 +ENDCHAR +STARTCHAR U+5831 +ENCODING 22577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +3E88 +0888 +7FB0 +2280 +12F8 +14C8 +7FA8 +08B0 +3E90 +08B0 +08C8 +0884 +0000 +ENDCHAR +STARTCHAR U+5832 +ENCODING 22578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +7E42 +4242 +7E42 +4042 +4442 +445E +5E40 +F240 +0100 +0100 +7FFE +0100 +FFFF +ENDCHAR +STARTCHAR U+5833 +ENCODING 22579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1111 +1111 +11FF +7D00 +117F +1141 +117F +1541 +197F +7141 +0141 +027F +0041 +0000 +0000 +ENDCHAR +STARTCHAR U+5834 +ENCODING 22580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +11F0 +1110 +11F0 +7D10 +11F0 +1000 +17FC +1500 +1BF8 +64A8 +0128 +0248 +00B0 +0000 +ENDCHAR +STARTCHAR U+5835 +ENCODING 22581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1048 +13F8 +1050 +7C60 +17FC +1040 +11F8 +1708 +1DF8 +6108 +0108 +01F8 +0108 +0000 +ENDCHAR +STARTCHAR U+5836 +ENCODING 22582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +13FF +1040 +10FE +7D08 +12FF +1000 +10FE +1482 +18FE +7082 +00FE +0082 +0084 +0000 +0000 +ENDCHAR +STARTCHAR U+5837 +ENCODING 22583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1010 +11FF +1044 +1044 +7C44 +11FF +1000 +10FE +1482 +18FE +7082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+5838 +ENCODING 22584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +2202 +22FA +2222 +7A22 +22FA +22AA +22AA +2AFA +3222 +622A +02FA +0203 +0C01 +0000 +0000 +ENDCHAR +STARTCHAR U+5839 +ENCODING 22585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001C +21F0 +2020 +27FF +2020 +FBFE +2222 +23FE +2222 +2222 +3BFE +6020 +C3FE +0020 +0020 +07FF +ENDCHAR +STARTCHAR U+583A +ENCODING 22586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13F8 +1248 +13F8 +7E48 +13F8 +1248 +10A0 +1D30 +7328 +0D24 +0120 +0220 +0420 +0000 +ENDCHAR +STARTCHAR U+583B +ENCODING 22587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +19FC +4824 +33FF +1024 +05FC +0820 +33FE +0020 +07FF +00A0 +1FFC +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+583D +ENCODING 22589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13F8 +12A8 +12A8 +7FF8 +1000 +17FC +1040 +1440 +1C78 +6440 +0440 +07FC +0400 +0000 +ENDCHAR +STARTCHAR U+583F +ENCODING 22591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000A +2009 +2009 +23FF +2208 +FAE8 +220A +22EA +22AA +22AA +3AAE +62E4 +C20D +061D +0437 +0C62 +ENDCHAR +STARTCHAR U+5840 +ENCODING 22592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13FC +1204 +13FC +7E8C +1250 +13FC +1250 +1650 +1BFC +6490 +0490 +0910 +1210 +0000 +ENDCHAR +STARTCHAR U+5841 +ENCODING 22593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +3008 +0930 +0D60 +7118 +1FF4 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5844 +ENCODING 22596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1294 +1294 +1294 +FFFC +1244 +1020 +17FE +1080 +1CF8 +F088 +4108 +0108 +0228 +0C10 +ENDCHAR +STARTCHAR U+5848 +ENCODING 22600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F7E +2148 +3F48 +217F +3F08 +2818 +2428 +2A49 +708F +0080 +1FFC +0080 +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5849 +ENCODING 22601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23AE +2070 +FB56 +2088 +21FC +2707 +2104 +21FC +3904 +E104 +01FC +0104 +0104 +011C +ENDCHAR +STARTCHAR U+584A +ENCODING 22602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1080 +13F8 +1248 +7FF8 +1248 +13F8 +12C8 +10D0 +1D50 +6168 +027C +0444 +083C +0000 +ENDCHAR +STARTCHAR U+584B +ENCODING 22603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0C30 +2AA8 +2AA8 +5960 +1450 +2288 +3FFC +2108 +5FF0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+584C +ENCODING 22604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +2208 +23F8 +2208 +FBF8 +2004 +27BE +2084 +24A4 +2294 +398C +E294 +44A4 +0294 +0108 +ENDCHAR +STARTCHAR U+584D +ENCODING 22605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A48 +4950 +4840 +4BFC +7840 +4FFE +48A0 +4910 +7A4E +4C44 +4BF8 +4840 +4848 +ABFC +1000 +ENDCHAR +STARTCHAR U+584E +ENCODING 22606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +2020 +27FF +2489 +7D25 +2252 +2088 +2104 +2202 +29FC +3104 +6104 +01FC +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+584F +ENCODING 22607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1092 +1092 +10FE +1000 +7EFE +1000 +10FE +1082 +1082 +10FE +1E00 +7084 +0044 +01FF +0000 +ENDCHAR +STARTCHAR U+5850 +ENCODING 22608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2020 +23FE +2020 +21FC +F820 +27FF +2040 +2090 +2124 +38C2 +E3FF +0021 +0124 +0124 +0266 +ENDCHAR +STARTCHAR U+5851 +ENCODING 22609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +14F8 +7F88 +2AF8 +2A88 +3EF8 +2A88 +0908 +1118 +2FE0 +0100 +0100 +7FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+5852 +ENCODING 22610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +1020 +17F8 +1520 +7D20 +15FC +1710 +1510 +15FC +1D90 +6750 +0450 +0010 +0030 +0000 +ENDCHAR +STARTCHAR U+5853 +ENCODING 22611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07FF +2401 +25FD +2104 +79FC +2104 +21FC +2020 +2020 +27FF +2800 +3104 +6202 +0401 +0000 +0000 +ENDCHAR +STARTCHAR U+5854 +ENCODING 22612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +1110 +17FC +1110 +7D50 +10A0 +1110 +17FC +1400 +1BF8 +6208 +0208 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+5855 +ENCODING 22613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +2088 +2104 +2643 +2048 +F884 +21FE +2002 +27DF +2041 +3B4D +E0C3 +0145 +0249 +0451 +01C7 +ENDCHAR +STARTCHAR U+5857 +ENCODING 22615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3040 +08A0 +6110 +17FC +0040 +0FFC +1150 +2648 +21C0 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5858 +ENCODING 22616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +13FC +1240 +13F8 +7E48 +13FC +1248 +13F8 +1200 +1FF8 +6508 +0508 +09F8 +1108 +0000 +ENDCHAR +STARTCHAR U+5859 +ENCODING 22617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +17FC +1000 +7DF0 +1110 +11F0 +1000 +17F8 +1C08 +65E8 +0528 +05E8 +0418 +0000 +ENDCHAR +STARTCHAR U+585A +ENCODING 22618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13FC +1208 +17F8 +7C40 +11C8 +1668 +10B0 +1330 +1C68 +61A4 +0620 +0020 +00C0 +0000 +ENDCHAR +STARTCHAR U+585B +ENCODING 22619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +2050 +23FE +2252 +7A52 +23FE +2020 +2020 +27FF +28A8 +3124 +6222 +0421 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+585D +ENCODING 22621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +23FF +2084 +2084 +7BFF +2201 +2010 +23FF +2040 +287E +3042 +6042 +0082 +010C +0000 +0000 +ENDCHAR +STARTCHAR U+585E +ENCODING 22622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2448 +7FF8 +0440 +1FF0 +0440 +7FFC +0540 +1930 +6FEC +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+585F +ENCODING 22623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +7FFE +1040 +3E46 +E27C +3441 +1843 +E03E +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+5861 +ENCODING 22625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +111E +11E0 +1101 +11FF +1000 +7CFE +1282 +12FE +1282 +12FE +1E82 +72FE +0200 +03FF +0102 +0201 +ENDCHAR +STARTCHAR U+5862 +ENCODING 22626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1080 +13F0 +1210 +7E10 +13F0 +1200 +13F8 +1600 +1BFC +62A4 +0554 +0554 +0818 +0000 +ENDCHAR +STARTCHAR U+5863 +ENCODING 22627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +1202 +4BFE +2002 +13FC +0020 +0BFE +1020 +67FF +0080 +1FFC +0080 +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5864 +ENCODING 22628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1084 +1084 +10FC +7C00 +11FE +1102 +11FE +1102 +11FE +1102 +1DFE +7000 +0102 +0201 +ENDCHAR +STARTCHAR U+5865 +ENCODING 22629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +1000 +13F8 +1208 +FE08 +13F8 +1004 +17FE +1514 +1CA4 +F5F4 +4444 +0444 +0454 +0408 +ENDCHAR +STARTCHAR U+5867 +ENCODING 22631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +2198 +2090 +23FE +2088 +F888 +218C +2104 +2306 +2203 +3DFC +E154 +0154 +0154 +0154 +07FF +ENDCHAR +STARTCHAR U+5868 +ENCODING 22632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +23FE +2088 +F888 +2088 +27FF +2088 +2104 +2643 +2040 +3952 +E153 +0359 +0648 +00C0 +ENDCHAR +STARTCHAR U+5869 +ENCODING 22633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1100 +11FC +1200 +7FF0 +1510 +11F0 +1000 +17F8 +1AA8 +62A8 +02A8 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+586B +ENCODING 22635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +17FC +1040 +7DF0 +1110 +11F0 +1110 +11F0 +1D10 +61F0 +07FC +0190 +0608 +0000 +ENDCHAR +STARTCHAR U+586C +ENCODING 22636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1220 +1244 +12FE +FE84 +1284 +12FC +1284 +1284 +1EFC +F220 +44A8 +0526 +0A22 +0060 +ENDCHAR +STARTCHAR U+586D +ENCODING 22637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43F8 +4248 +4248 +42A8 +F318 +4208 +43F8 +4000 +47FC +54A4 +64A4 +C4A4 +84A4 +0FFE +0000 +0000 +ENDCHAR +STARTCHAR U+586F +ENCODING 22639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +118F +1145 +1125 +7D45 +118A +1000 +10FE +1292 +1492 +18FE +7092 +0092 +00FE +0000 +0000 +ENDCHAR +STARTCHAR U+5870 +ENCODING 22640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +09FC +4A00 +25F8 +2168 +0FFC +1268 +23FC +2130 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5871 +ENCODING 22641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083F +7F21 +413F +7F21 +413F +7F21 +4821 +4C21 +7241 +0080 +0080 +1FFC +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5872 +ENCODING 22642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1100 +13F8 +15F0 +7D10 +11F0 +1110 +11F0 +17FC +1A00 +63F8 +0548 +0948 +02B0 +0000 +ENDCHAR +STARTCHAR U+5874 +ENCODING 22644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2421 +2421 +27FF +7800 +27DF +2451 +27DF +2451 +2FDF +3451 +6451 +0451 +08E3 +0000 +0000 +ENDCHAR +STARTCHAR U+5875 +ENCODING 22645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1240 +1FF8 +1248 +1FF8 +17CC +1470 +2744 +58BC +0FF0 +0080 +3FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5876 +ENCODING 22646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +13FF +1248 +13FF +7E49 +1249 +13FF +1200 +1684 +1A95 +72E6 +0284 +0495 +09F7 +0000 +0000 +ENDCHAR +STARTCHAR U+5878 +ENCODING 22648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23FF +2200 +2200 +2278 +FA48 +2278 +2200 +22EE +22AA +3AAA +62EE +C200 +0200 +03FF +0000 +ENDCHAR +STARTCHAR U+5879 +ENCODING 22649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +7FE0 +3E80 +2AFC +3E90 +2A90 +3E90 +7F10 +0A10 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+587A +ENCODING 22650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2208 +2208 +2FBE +2208 +271C +2AAA +2208 +2040 +27FC +2040 +4040 +1FFF +0000 +0000 +ENDCHAR +STARTCHAR U+587B +ENCODING 22651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +13FF +1048 +11FE +7D02 +11FE +1102 +11FE +1420 +1BFF +7048 +0084 +0102 +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+587C +ENCODING 22652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1020 +13FE +1222 +7FFE +1222 +13FE +1022 +143F +1FC9 +1008 +67FF +0108 +0088 +0018 +ENDCHAR +STARTCHAR U+587D +ENCODING 22653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +23FE +22AA +2124 +FAAA +2020 +22AA +2124 +22AA +3850 +E050 +4088 +0106 +0602 +0000 +0000 +ENDCHAR +STARTCHAR U+587E +ENCODING 22654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7F40 +1FF0 +1250 +1FD0 +3E70 +0C54 +748C +0D04 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+587F +ENCODING 22655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +23FC +2244 +27FF +FA44 +23FC +2040 +23FC +2244 +23FC +3900 +67FF +C110 +03B0 +00E0 +07BF +ENDCHAR +STARTCHAR U+5880 +ENCODING 22656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27FE +2404 +27FC +2420 +FD24 +24A8 +2524 +24A0 +25FC +3E20 +E424 +47FE +0820 +1020 +0020 +ENDCHAR +STARTCHAR U+5881 +ENCODING 22657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13F8 +1208 +13F8 +1208 +13F8 +FC04 +17FE +14A4 +14A4 +17FC +1C00 +F3F8 +4110 +00E0 +0318 +0C06 +ENDCHAR +STARTCHAR U+5882 +ENCODING 22658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1028 +11FF +1129 +7D29 +11FF +1000 +10FE +1400 +19FF +7054 +0092 +0111 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5883 +ENCODING 22659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +13F8 +1120 +10A0 +7FFC +1000 +11F0 +1110 +15F0 +1910 +61F0 +00A0 +0324 +0C1C +0000 +ENDCHAR +STARTCHAR U+5885 +ENCODING 22661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2A50 +3E20 +2BFC +3E28 +0830 +3E20 +0C60 +7100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5886 +ENCODING 22662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10AA +10AA +11FF +10AA +7D3B +1000 +11FF +1111 +10FE +1492 +1892 +7096 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5887 +ENCODING 22663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2020 +21FE +2084 +2048 +FBFF +2000 +21FE +2102 +21FE +3902 +61FE +C020 +03FF +0020 +0020 +ENDCHAR +STARTCHAR U+5888 +ENCODING 22664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2448 +2448 +2448 +2FFF +F449 +27C9 +2449 +27C9 +2449 +2FE9 +3549 +6549 +C551 +0661 +040B +03E6 +ENDCHAR +STARTCHAR U+5889 +ENCODING 22665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +27FE +2420 +25FC +2424 +FFFE +2424 +25FC +2420 +25FC +3D24 +E5FC +4924 +09FC +1124 +012C +ENDCHAR +STARTCHAR U+588A +ENCODING 22666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +7EFC +1024 +FF24 +2424 +FF64 +1034 +FF45 +1085 +1007 +0100 +7FFE +0100 +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+588B +ENCODING 22667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1084 +11FC +1104 +7A29 +17FF +1048 +1094 +152A +1A51 +74A4 +0048 +0010 +01E0 +0000 +0000 +ENDCHAR +STARTCHAR U+588C +ENCODING 22668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2020 +27FF +2400 +2488 +FC88 +27FF +2488 +2488 +24F8 +3C00 +6552 +C552 +0D29 +1929 +0000 +ENDCHAR +STARTCHAR U+588D +ENCODING 22669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7EFE +4248 +7E48 +42FE +7E18 +4018 +4428 +4428 +5E4A +F286 +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+588E +ENCODING 22670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +17FF +1009 +13E9 +7E2A +13EC +100A +17E9 +1049 +1889 +77ED +008A +0288 +0108 +0000 +0000 +ENDCHAR +STARTCHAR U+588F +ENCODING 22671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +447E +45D2 +7C5C +05F0 +FC04 +27FF +2484 +24C4 +6444 +C41C +0100 +3FFE +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+5890 +ENCODING 22672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +27FF +2088 +20F8 +F820 +23FE +2222 +23FE +2020 +23FE +3820 +E3FE +0020 +0020 +07FF +ENDCHAR +STARTCHAR U+5891 +ENCODING 22673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +13FF +1084 +1048 +7FFF +1221 +13FF +1221 +12FD +1685 +1A85 +72FD +0201 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+5892 +ENCODING 22674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +17FE +1108 +FC94 +13FE +1204 +1294 +130C +12F4 +1E94 +F294 +42F4 +0204 +0214 +0208 +ENDCHAR +STARTCHAR U+5893 +ENCODING 22675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +1930 +6FEC +0100 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+5894 +ENCODING 22676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2222 +2222 +23FE +2110 +F920 +23FE +2220 +2620 +23FE +3A20 +6220 +C3FE +0220 +0220 +03FF +ENDCHAR +STARTCHAR U+5896 +ENCODING 22678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2070 +20D8 +218C +2707 +F9FC +2000 +21FC +2104 +21FC +3800 +63FE +C222 +03FE +0222 +03FE +ENDCHAR +STARTCHAR U+5897 +ENCODING 22679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +10A0 +13F8 +1248 +7FF8 +1248 +13F8 +1000 +15F0 +1910 +61F0 +0110 +01F0 +0110 +0000 +ENDCHAR +STARTCHAR U+5898 +ENCODING 22680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +27C8 +210F +27D0 +7C40 +27DE +2442 +27C2 +2102 +2904 +37C8 +6111 +0111 +011F +0000 +0000 +ENDCHAR +STARTCHAR U+5899 +ENCODING 22681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2048 +27FC +2040 +FA48 +2150 +2FFE +2008 +23FC +2208 +3AE8 +E2A8 +42E8 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR U+589A +ENCODING 22682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2408 +22FC +2848 +24C8 +2148 +FC88 +24A8 +2910 +2044 +2FFE +3840 +E0E0 +4150 +024E +0C44 +0040 +ENDCHAR +STARTCHAR U+589C +ENCODING 22684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3CA0 +2BFC +30C8 +2F68 +24B0 +2770 +38A8 +2324 +21C0 +1FF8 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+589D +ENCODING 22685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +21FC +2020 +23FE +2000 +F904 +27DF +2104 +21C4 +271F +3800 +67FF +C090 +0091 +0191 +070F +ENDCHAR +STARTCHAR U+589E +ENCODING 22686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +2110 +20A0 +2004 +27FE +FC44 +2554 +2444 +27FC +2008 +3BFC +E208 +43F8 +0208 +03F8 +0208 +ENDCHAR +STARTCHAR U+589F +ENCODING 22687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +10F8 +1080 +17FC +7CB8 +14C8 +1778 +14A0 +16A8 +1EA8 +6BB8 +08A0 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58A0 +ENCODING 22688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07DF +2451 +2451 +27DF +2000 +FBFE +2222 +23FE +2222 +2222 +3BFE +6020 +C7FF +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+58A1 +ENCODING 22689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +2084 +23FF +2020 +21FE +F820 +23FF +2122 +20A4 +23FF +3800 +E1FE +0102 +0102 +0102 +01FE +ENDCHAR +STARTCHAR U+58A2 +ENCODING 22690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01E4 +2029 +2352 +208C +2703 +F800 +239C +2094 +2395 +2223 +3B80 +60FF +C0A2 +0094 +0188 +0377 +ENDCHAR +STARTCHAR U+58A3 +ENCODING 22691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0129 +10AA +11FF +1044 +7C28 +11FF +1010 +10FE +1010 +1DFF +7028 +0044 +0082 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+58A5 +ENCODING 22693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1044 +11FF +1000 +7CFE +1092 +10FE +1092 +10FE +1C10 +70FE +0010 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+58A6 +ENCODING 22694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +2038 +27E0 +2244 +2148 +FFFF +2148 +214C +2346 +2643 +3BFC +6244 +C3FC +0244 +0244 +03FC +ENDCHAR +STARTCHAR U+58A8 +ENCODING 22696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0920 +0FE0 +0920 +0FE0 +1FF0 +0100 +7FFC +1550 +2FE8 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58A9 +ENCODING 22697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2420 +22A0 +3FE0 +2024 +2FBE +F8C4 +2FA4 +2024 +2FA4 +2128 +2228 +3F90 +E210 +4228 +0A46 +0484 +ENDCHAR +STARTCHAR U+58AB +ENCODING 22699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +1110 +17FC +10A0 +7FF8 +12B8 +1338 +13F8 +1608 +1BF8 +6010 +0FFC +0110 +00B0 +0000 +ENDCHAR +STARTCHAR U+58AC +ENCODING 22700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +7C44 +4828 +51FF +4820 +443A +444C +449C +552A +4849 +4098 +1FFC +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+58AE +ENCODING 22702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3FFC +24F8 +2920 +3AF8 +25F8 +2508 +39F8 +21F8 +2118 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58AF +ENCODING 22703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FE +5040 +50FC +7D10 +50FE +507C +1044 +107C +107C +108C +1FFC +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+58B1 +ENCODING 22705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +21E8 +2231 +214A +2084 +FB7B +2000 +20FC +2084 +2084 +38FC +6000 +C084 +00CC +0048 +03FF +ENDCHAR +STARTCHAR U+58B2 +ENCODING 22706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2100 +23FF +2754 +2154 +F954 +27FF +2154 +2154 +2154 +37FF +6000 +C000 +0154 +0356 +0653 +ENDCHAR +STARTCHAR U+58B3 +ENCODING 22707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +13F8 +1150 +17FC +7D10 +13F8 +1208 +13F8 +1608 +1BF8 +6208 +03F8 +0330 +1C0C +0000 +ENDCHAR +STARTCHAR U+58B8 +ENCODING 22712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +17FC +1150 +1048 +7DF8 +1050 +17FC +1050 +15F8 +1F08 +61F8 +0108 +01F8 +0108 +0000 +ENDCHAR +STARTCHAR U+58B9 +ENCODING 22713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2F78 +2948 +2F78 +7948 +2F78 +2808 +2BE8 +2A28 +3BE8 +6A28 +0BE8 +0A08 +0818 +0000 +ENDCHAR +STARTCHAR U+58BA +ENCODING 22714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1080 +13F8 +12E8 +7F58 +12E8 +13F8 +12E8 +1758 +1840 +6FFC +00A0 +0310 +0C0C +0000 +ENDCHAR +STARTCHAR U+58BB +ENCODING 22715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +17FC +1150 +7DD8 +1264 +17FC +1000 +17F8 +1AE8 +62A8 +02E8 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+58BC +ENCODING 22716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +FF7C +0848 +7F48 +4986 +7F7C +4944 +7F44 +0828 +FF90 +4928 +7FC6 +0100 +3FF8 +0100 +FFFE +ENDCHAR +STARTCHAR U+58BD +ENCODING 22717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +27D0 +245F +27E2 +7C42 +27D2 +2112 +27D2 +2212 +2BD2 +324A +6444 +084A +01D1 +0000 +0000 +ENDCHAR +STARTCHAR U+58BE +ENCODING 22718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C00 +79F8 +2688 +18F8 +6CF8 +36C8 +1AB0 +62D8 +0D84 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58BF +ENCODING 22719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07FF +2489 +27FF +2020 +7BFE +2020 +27FF +2104 +2088 +23FE +2820 +37FF +6020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+58C1 +ENCODING 22721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +1E20 +13FC +1E88 +1050 +3FFC +3220 +5FFC +1220 +0120 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58C2 +ENCODING 22722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F3C +4124 +7F24 +5225 +7F47 +5200 +52FF +7F42 +5424 +5218 +A177 +0100 +7FFE +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+58C4 +ENCODING 22724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27C8 +2248 +F9BF +27C8 +6158 +719C +B92E +AD2B +2108 +2308 +0000 +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+58C5 +ENCODING 22725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +1090 +14FC +6590 +1AF8 +14F8 +7C90 +09FC +1100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58C6 +ENCODING 22726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +095C +3084 +1D5C +1004 +1144 +1C9C +1144 +7FFF +4081 +0080 +0FF8 +0080 +0080 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+58C7 +ENCODING 22727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +17FC +13F8 +12E8 +7EA8 +12E8 +13F8 +11F0 +1510 +19F0 +6110 +01F0 +0000 +0FFC +0000 +ENDCHAR +STARTCHAR U+58C8 +ENCODING 22728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +27FF +2000 +23FE +2202 +FAFA +228A +22FA +2202 +23FE +3800 +61FC +C020 +07FF +0124 +0623 +ENDCHAR +STARTCHAR U+58C9 +ENCODING 22729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0038 +11FE +1122 +11FC +7D20 +113C +11FC +1142 +11F4 +1128 +125C +7CAA +0059 +0000 +0000 +ENDCHAR +STARTCHAR U+58CA +ENCODING 22730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +17FC +1040 +13F8 +7EA8 +12A8 +13F8 +1040 +17FC +18C8 +6350 +0D20 +01D0 +060C +0000 +ENDCHAR +STARTCHAR U+58CC +ENCODING 22732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +17FC +1110 +12A8 +7FFC +10A0 +13F8 +10A0 +17FC +18C8 +6330 +0D50 +0188 +0604 +0000 +ENDCHAR +STARTCHAR U+58CD +ENCODING 22733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +420F +2FB0 +0220 +8FBF +4AA4 +0FA4 +2AA4 +2FA4 +4224 +4FA4 +8244 +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+58CE +ENCODING 22734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +11E0 +1020 +17FF +1020 +7FFE +1326 +12AA +13FE +1420 +1BFE +6020 +07FF +0000 +0492 +0891 +ENDCHAR +STARTCHAR U+58CF +ENCODING 22735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07E0 +2488 +248F +27C8 +7C50 +27C7 +2480 +27E0 +2000 +2BFE +3252 +6252 +0252 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+58D0 +ENCODING 22736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +1108 +2104 +7FFE +D52B +4912 +552A +4102 +552A +4912 +552A +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+58D1 +ENCODING 22737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0EF8 +3F88 +2D50 +5250 +2C20 +1E50 +7388 +1E04 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58D2 +ENCODING 22738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +27FF +2104 +2020 +23FE +F820 +27FF +2080 +2104 +23FE +3802 +63FE +C252 +0252 +0252 +07FF +ENDCHAR +STARTCHAR U+58D3 +ENCODING 22739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2F98 +2E94 +2FFC +2F90 +28B0 +2FA8 +2FC8 +4984 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58D4 +ENCODING 22740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +23FE +2020 +21FC +2000 +FBFE +2002 +20FA +2020 +21FC +3800 +E7FF +0004 +03FF +02A4 +038C +ENDCHAR +STARTCHAR U+58D5 +ENCODING 22741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +17FC +11F0 +1110 +7DF0 +17FC +1408 +17F8 +14C8 +1F70 +63B0 +00E8 +0724 +00C0 +0000 +ENDCHAR +STARTCHAR U+58D6 +ENCODING 22742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +27FF +2020 +27FF +2421 +FDAD +2421 +25AD +2421 +2000 +3FFF +E040 +07FF +0491 +0491 +0497 +ENDCHAR +STARTCHAR U+58D7 +ENCODING 22743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +13F8 +1048 +17FC +7C48 +13F8 +1040 +17FC +16A8 +1A94 +67F8 +02A8 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58D8 +ENCODING 22744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0920 +0FE0 +0920 +0FE0 +3EF8 +2AA8 +3EF8 +2BA8 +3FF8 +1FF0 +0100 +7FFC +0000 +ENDCHAR +STARTCHAR U+58D9 +ENCODING 22745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +13FC +1290 +13FC +7E90 +12F0 +13FC +12F8 +16A8 +1AF8 +62A8 +04F8 +04C8 +0B04 +0000 +ENDCHAR +STARTCHAR U+58DA +ENCODING 22746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +207E +2040 +23FF +2221 +FAFC +2221 +22FF +2292 +22FE +3A92 +E2FE +0200 +02FE +06AA +0DFF +ENDCHAR +STARTCHAR U+58DB +ENCODING 22747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03CF +0249 +13CF +1249 +13CF +7E41 +127D +1289 +1241 +128D +1285 +12ED +7E85 +02FF +0000 +0000 +ENDCHAR +STARTCHAR U+58DC +ENCODING 22748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01F0 +1110 +11F0 +11F0 +7FF8 +1040 +17FC +1448 +1758 +1B58 +61F0 +07FC +0090 +03F8 +0000 +ENDCHAR +STARTCHAR U+58DD +ENCODING 22749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +247E +2652 +227E +2010 +F8FF +2000 +267E +2242 +227E +3A42 +627E +C242 +027E +0681 +09FF +ENDCHAR +STARTCHAR U+58DE +ENCODING 22750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +17FC +1000 +13F8 +7EA8 +13F8 +1040 +1358 +1758 +18C8 +6328 +0D30 +01D0 +060C +0000 +ENDCHAR +STARTCHAR U+58DF +ENCODING 22751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +3EF8 +14F8 +7F08 +3EF8 +22F0 +3EB8 +3E9C +267C +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58E1 +ENCODING 22753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0F7F +0821 +FF92 +8094 +1E08 +4114 +BEA3 +4108 +FFC8 +4108 +7F7F +4108 +7F08 +4108 +7F7F +ENDCHAR +STARTCHAR U+58E2 +ENCODING 22754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +27FF +2400 +24E7 +279C +FC84 +27FF +258C +26D6 +24A5 +3CA4 +6420 +C53C +0D20 +0920 +1BFF +ENDCHAR +STARTCHAR U+58E3 +ENCODING 22755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2F44 +2599 +2566 +2544 +7799 +25FF +2500 +2524 +27A5 +25A5 +25E7 +7724 +0124 +0144 +0000 +0000 +ENDCHAR +STARTCHAR U+58E4 +ENCODING 22756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +17FC +13B8 +12A8 +7FB8 +10A0 +17FC +13F8 +10A0 +1FFC +6148 +0F30 +01D0 +060C +0000 +ENDCHAR +STARTCHAR U+58E5 +ENCODING 22757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +13FC +12F8 +12A8 +7EF8 +12F8 +1220 +12F8 +17FC +1AE8 +6574 +05F8 +0820 +13FC +0000 +ENDCHAR +STARTCHAR U+58E7 +ENCODING 22759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +1129 +11EF +11FF +7D04 +1174 +1127 +11FA +115A +117A +117A +1254 +7CF2 +0019 +0000 +0000 +ENDCHAR +STARTCHAR U+58E8 +ENCODING 22760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E3E +2A2A +3E3E +2A2A +3E3E +0000 +3E3E +2A2A +3E3E +2AAA +3EBE +0FF8 +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+58E9 +ENCODING 22761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +2020 +27FF +2421 +25AD +F421 +25AD +2280 +27DF +2291 +37DF +6551 +C7DF +0111 +07D1 +0123 +ENDCHAR +STARTCHAR U+58EB +ENCODING 22763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+58EC +ENCODING 22764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +03C0 +3D00 +0100 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+58EE +ENCODING 22766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +4840 +2840 +2FFC +0840 +0840 +1840 +1840 +2840 +4840 +0BF8 +0800 +0000 +ENDCHAR +STARTCHAR U+58EF +ENCODING 22767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +2440 +2440 +2440 +3C40 +27FC +0440 +0440 +7C40 +2440 +2440 +2440 +47F8 +0400 +0000 +ENDCHAR +STARTCHAR U+58F0 +ENCODING 22768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +3FF8 +0000 +1FF0 +1110 +1110 +1FF0 +1010 +1000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+58F1 +ENCODING 22769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +0000 +3FFC +2408 +4460 +0780 +0400 +0408 +0408 +03F8 +0000 +ENDCHAR +STARTCHAR U+58F2 +ENCODING 22770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +0000 +3FFC +2008 +4480 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+58F3 +ENCODING 22771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +7FFC +0100 +3FF8 +0000 +7FFE +4022 +8FF4 +0820 +0820 +0820 +0824 +0824 +101C +6000 +ENDCHAR +STARTCHAR U+58F4 +ENCODING 22772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0080 +0080 +3FFE +0000 +1FFC +1004 +1004 +1FFC +0000 +1004 +0808 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+58F6 +ENCODING 22774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +7FFC +0100 +3FF8 +0100 +7FFE +4444 +8440 +2448 +1458 +0C60 +0440 +0448 +7FFC +0000 +ENDCHAR +STARTCHAR U+58F7 +ENCODING 22775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +0000 +3FFC +2288 +5FF0 +1290 +1FF0 +1290 +0280 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58F9 +ENCODING 22777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0000 +3FFC +2008 +5FF0 +0FE0 +0820 +0FE0 +0440 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58FA +ENCODING 22778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +0000 +3FFC +2288 +5EF0 +1010 +1EF0 +1290 +0280 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58FB +ENCODING 22779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +17FC +1048 +1150 +7D70 +12C0 +143C +13F0 +1610 +1BF0 +6210 +03F0 +0210 +0230 +0000 +ENDCHAR +STARTCHAR U+58FC +ENCODING 22780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +3FFC +2008 +5FF0 +0280 +1EF0 +1010 +1EF0 +0280 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+58FD +ENCODING 22781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0000 +7FFC +0FE8 +0100 +0FE0 +7FFC +1E10 +13FC +1E90 +1030 +0000 +ENDCHAR +STARTCHAR U+58FE +ENCODING 22782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F40 +0840 +0840 +7F7F +0041 +7F41 +417F +7F40 +4140 +2240 +147F +7F40 +0000 +0000 +ENDCHAR +STARTCHAR U+58FF +ENCODING 22783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +1044 +11FF +1028 +10FE +7CAA +10C6 +10BA +1082 +10FE +1C04 +71FF +0024 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+5902 +ENCODING 22786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +07E0 +0420 +0C20 +1440 +2240 +0280 +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5903 +ENCODING 22787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +1004 +1008 +1010 +101F +1FC1 +2841 +4881 +0501 +0201 +0501 +18C2 +0004 +0038 +0000 +0000 +ENDCHAR +STARTCHAR U+5904 +ENCODING 22788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1040 +1040 +1040 +1E40 +2260 +2250 +224C +5444 +9440 +0840 +1440 +1440 +2206 +41FC +8000 +ENDCHAR +STARTCHAR U+5905 +ENCODING 22789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +07F0 +1C10 +6820 +06C0 +0380 +1EF8 +F04F +0040 +3FFC +0440 +0440 +3FFC +0040 +0040 +ENDCHAR +STARTCHAR U+5906 +ENCODING 22790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +07F0 +1C10 +6860 +06C0 +0380 +1CF0 +E10F +1FF8 +0100 +1FF8 +0100 +3FFC +0100 +0100 +ENDCHAR +STARTCHAR U+5907 +ENCODING 22791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +07F0 +0820 +1440 +2380 +0280 +0C60 +301E +DFF4 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +1010 +ENDCHAR +STARTCHAR U+5909 +ENCODING 22793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0240 +1250 +1248 +24C4 +4A04 +03E0 +0440 +1A80 +0180 +0660 +781C +0000 +ENDCHAR +STARTCHAR U+590A +ENCODING 22794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +2200 +2200 +17E0 +1420 +0820 +1840 +2440 +0280 +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+590B +ENCODING 22795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0620 +0C30 +3FD8 +000C +0640 +1C62 +703E +0200 +07F0 +0C30 +3860 +00C0 +03E0 +1E38 +F00F +ENDCHAR +STARTCHAR U+590C +ENCODING 22796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFC +0100 +0100 +FFFF +0420 +1C30 +F01F +0200 +07F0 +0C30 +3860 +00C0 +03E0 +1E38 +F00F +ENDCHAR +STARTCHAR U+590D +ENCODING 22797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1FFC +2000 +2FF0 +4810 +8FF0 +0810 +0FF0 +0400 +0FF0 +0C20 +1240 +2180 +4240 +0430 +380E +ENDCHAR +STARTCHAR U+590E +ENCODING 22798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +0888 +36B6 +0080 +1FFC +0080 +7FFF +0400 +0FF8 +3220 +0140 +0080 +0360 +3C1E +0000 +0000 +ENDCHAR +STARTCHAR U+590F +ENCODING 22799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +07E0 +3C40 +0380 +06E0 +781C +0000 +ENDCHAR +STARTCHAR U+5910 +ENCODING 22800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +0C80 +7FF0 +1290 +1450 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +3C40 +0380 +7C78 +0000 +ENDCHAR +STARTCHAR U+5912 +ENCODING 22802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +1100 +13DE +5E52 +53D2 +525E +53D1 +7E51 +C3CF +0C30 +0400 +1FF8 +F460 +03C0 +FC3F +ENDCHAR +STARTCHAR U+5913 +ENCODING 22803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +37EE +6102 +47E2 +742E +47E2 +4422 +47E2 +742E +07E4 +3C3C +0400 +1FF8 +F460 +03C0 +FC3F +ENDCHAR +STARTCHAR U+5914 +ENCODING 22804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0100 +17DC +5454 +5FD4 +545C +57D0 +5C52 +E7CE +1410 +27C8 +4C44 +1380 +0C60 +701C +ENDCHAR +STARTCHAR U+5915 +ENCODING 22805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +01F8 +0208 +0208 +0510 +0890 +1060 +0020 +0040 +0080 +0100 +0600 +3800 +0000 +ENDCHAR +STARTCHAR U+5916 +ENCODING 22806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +0F40 +09C0 +1140 +1960 +2658 +4244 +0440 +0440 +0840 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+5917 +ENCODING 22807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0802 +0F7F +1122 +2122 +5122 +1122 +0922 +052C +0220 +0420 +0821 +7021 +001F +0000 +0000 +ENDCHAR +STARTCHAR U+5918 +ENCODING 22808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +10F8 +1E88 +1288 +1288 +3288 +2A88 +4C88 +0488 +0488 +08B0 +0880 +1080 +2080 +0000 +ENDCHAR +STARTCHAR U+5919 +ENCODING 22809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1110 +11D0 +1250 +1250 +1550 +1890 +1094 +210C +220C +4404 +0000 +ENDCHAR +STARTCHAR U+591A +ENCODING 22810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +03E0 +0420 +0A40 +3180 +0140 +067C +3884 +0388 +0C50 +0060 +00C0 +0700 +3800 +0000 +ENDCHAR +STARTCHAR U+591B +ENCODING 22811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +0020 +1FE0 +0020 +7FFC +0100 +03F0 +0C10 +3220 +0140 +0180 +0600 +3800 +0000 +ENDCHAR +STARTCHAR U+591C +ENCODING 22812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0880 +0880 +10F0 +1190 +3150 +5320 +14A0 +1040 +10A0 +1310 +1C0C +0000 +ENDCHAR +STARTCHAR U+591D +ENCODING 22813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2090 +3C90 +2490 +24FE +6590 +4510 +E410 +B410 +1CFE +0810 +1810 +3010 +6010 +C1FF +0000 +ENDCHAR +STARTCHAR U+591F +ENCODING 22815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +227C +3F44 +4288 +8350 +7A20 +4A50 +4A9E +4B22 +4A44 +7AA8 +4210 +0A20 +0440 +0080 +ENDCHAR +STARTCHAR U+5920 +ENCODING 22816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +3E40 +42FE +A502 +1802 +20FA +D08A +108A +3E8A +42FA +A48A +1802 +1002 +E01C +0000 +0000 +ENDCHAR +STARTCHAR U+5921 +ENCODING 22817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1F10 +3110 +62FE +B610 +1C10 +0810 +307C +DF00 +3100 +62FE +B682 +1C82 +0882 +3082 +E0FE +ENDCHAR +STARTCHAR U+5922 +ENCODING 22818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FF0 +1290 +1FF0 +0000 +3FFC +2108 +43E0 +1E40 +0180 +0300 +3C00 +0000 +ENDCHAR +STARTCHAR U+5923 +ENCODING 22819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +0420 +08F0 +3F9C +0000 +3FFC +2244 +FFFF +8201 +87F9 +1C30 +3260 +01C0 +0700 +3C00 +ENDCHAR +STARTCHAR U+5924 +ENCODING 22820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0FF0 +3260 +0780 +5900 +7FFE +4002 +9FF4 +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0820 +3018 +ENDCHAR +STARTCHAR U+5925 +ENCODING 22821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +2A78 +3E88 +2B50 +3E20 +0850 +7E9C +1C24 +1A68 +2A98 +4810 +0820 +08C0 +0000 +ENDCHAR +STARTCHAR U+5927 +ENCODING 22823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0100 +7FFC +0100 +0280 +0280 +0440 +0440 +0820 +1010 +600C +0000 +ENDCHAR +STARTCHAR U+5928 +ENCODING 22824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +1800 +1000 +1F80 +0080 +0080 +FFFF +0240 +0240 +0660 +0420 +0C30 +1818 +300C +E007 +ENDCHAR +STARTCHAR U+5929 +ENCODING 22825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +0100 +3FF8 +0100 +0380 +0280 +0440 +0440 +0820 +1010 +600C +0000 +ENDCHAR +STARTCHAR U+592A +ENCODING 22826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +7FFC +0100 +0280 +0280 +0440 +0440 +0A20 +1110 +2108 +4004 +0000 +ENDCHAR +STARTCHAR U+592B +ENCODING 22827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +3FF8 +0100 +0100 +0100 +7FFC +0180 +0280 +0240 +0420 +1810 +600C +0000 +ENDCHAR +STARTCHAR U+592C +ENCODING 22828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +1FF0 +0110 +0110 +0110 +7FFC +0100 +0300 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+592D +ENCODING 22829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +01C0 +1F00 +0100 +0100 +0100 +7FFC +0300 +0280 +0480 +0440 +0820 +1010 +600C +0000 +ENDCHAR +STARTCHAR U+592E +ENCODING 22830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +1FF0 +1110 +1110 +1110 +1110 +7FFC +0300 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+592F +ENCODING 22831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0108 +7FFC +0280 +0440 +0A30 +320E +C204 +1FF0 +0210 +0210 +0210 +0410 +08A0 +3040 +ENDCHAR +STARTCHAR U+5930 +ENCODING 22832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0660 +0C30 +381C +E007 +0810 +0810 +0810 +0810 +1810 +1010 +3010 +6010 +ENDCHAR +STARTCHAR U+5931 +ENCODING 22833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +0900 +0900 +1FF0 +1100 +2100 +7FFC +0100 +0280 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5932 +ENCODING 22834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0280 +0440 +1930 +610C +0100 +1FF0 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5933 +ENCODING 22835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0660 +0C30 +1818 +300C +E007 +1FF8 +0000 +0000 +0000 +0000 +7FFE +0000 +ENDCHAR +STARTCHAR U+5934 +ENCODING 22836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0880 +0680 +2280 +1880 +0880 +0084 +FFFE +0080 +0100 +0160 +0210 +0408 +180C +6004 +ENDCHAR +STARTCHAR U+5935 +ENCODING 22837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0660 +0C30 +1818 +310C +E107 +0100 +1110 +1110 +3118 +210C +6106 +0700 +ENDCHAR +STARTCHAR U+5936 +ENCODING 22838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +1010 +1010 +FEFF +1010 +3838 +2828 +2828 +2828 +2C2C +6464 +4444 +C6C6 +8283 +ENDCHAR +STARTCHAR U+5937 +ENCODING 22839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +3FF0 +0110 +3FF0 +2100 +3FFC +2304 +0284 +0458 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5938 +ENCODING 22840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0280 +0440 +1FF0 +600C +1FF0 +0200 +03E0 +0420 +0040 +0040 +0180 +0000 +ENDCHAR +STARTCHAR U+5939 +ENCODING 22841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0108 +7FFC +0100 +1110 +0920 +0104 +FFFE +0100 +0280 +0280 +0440 +0830 +300E +C004 +ENDCHAR +STARTCHAR U+593A +ENCODING 22842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +7FFC +0280 +0440 +0830 +300E +C024 +0020 +7FFC +0420 +0220 +0220 +0020 +00A0 +0040 +ENDCHAR +STARTCHAR U+593C +ENCODING 22844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +FFFE +0280 +0440 +0830 +300E +C924 +0920 +0920 +0920 +0920 +1120 +1120 +2120 +0020 +ENDCHAR +STARTCHAR U+593E +ENCODING 22846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0920 +0920 +0920 +1550 +1548 +2388 +0280 +0440 +0820 +1010 +600C +0000 +ENDCHAR +STARTCHAR U+593F +ENCODING 22847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0660 +0C30 +381C +FFF7 +1110 +1110 +1FF0 +1000 +1004 +1004 +180C +0FF8 +ENDCHAR +STARTCHAR U+5940 +ENCODING 22848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0040 +0080 +0188 +0284 +7C83 +0000 +0080 +7FFF +0140 +0220 +0410 +0808 +7007 +0000 +0000 +ENDCHAR +STARTCHAR U+5941 +ENCODING 22849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +FFFE +0280 +0440 +0820 +3FF8 +D026 +1440 +1280 +1100 +1280 +1460 +1820 +1FF8 +0000 +ENDCHAR +STARTCHAR U+5942 +ENCODING 22850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +0FE0 +1020 +1040 +2090 +5FF8 +1110 +1110 +1114 +FFFE +0100 +0280 +0460 +181C +6008 +ENDCHAR +STARTCHAR U+5943 +ENCODING 22851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0660 +0C30 +381C +E1E7 +1F00 +1040 +1FFC +1040 +1060 +1F20 +7032 +001E +7F0C +ENDCHAR +STARTCHAR U+5944 +ENCODING 22852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0280 +0D60 +711C +1FF0 +1110 +1FF0 +1110 +1FF0 +1114 +1104 +00FC +0000 +ENDCHAR +STARTCHAR U+5945 +ENCODING 22853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0100 +7FFF +0400 +0808 +1204 +2402 +5AFD +1244 +1244 +3E44 +0258 +0440 +0840 +0000 +0000 +ENDCHAR +STARTCHAR U+5946 +ENCODING 22854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0660 +0C30 +1818 +3FFC +F007 +1000 +1FF0 +1010 +1FF0 +1000 +1000 +1FFC +ENDCHAR +STARTCHAR U+5947 +ENCODING 22855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0280 +0440 +1820 +7FFC +0010 +1F10 +1110 +1110 +1F10 +1110 +0030 +0000 +ENDCHAR +STARTCHAR U+5948 +ENCODING 22856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0280 +0440 +1830 +67CC +0000 +3FF8 +0100 +0540 +1930 +6108 +0300 +0000 +ENDCHAR +STARTCHAR U+5949 +ENCODING 22857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +1FF0 +0280 +7FFC +0920 +17D0 +610C +1FF0 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+594A +ENCODING 22858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +27F0 +2080 +2FF8 +2080 +27F0 +2080 +2FF8 +2000 +3FFE +0080 +3FFE +0220 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+594B +ENCODING 22859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0104 +FFFE +0280 +0440 +0820 +301E +DFF4 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +1010 +ENDCHAR +STARTCHAR U+594E +ENCODING 22862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0280 +0540 +1930 +6FEC +0100 +1FF0 +0100 +0FE0 +0100 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+594F +ENCODING 22863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +1FF0 +0280 +7FFC +04C0 +1F30 +610C +1FF0 +0280 +0C60 +3018 +0000 +ENDCHAR +STARTCHAR U+5950 +ENCODING 22864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +03E0 +0C40 +7080 +1FF0 +1290 +12B0 +1470 +1110 +0100 +7FFC +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+5951 +ENCODING 22865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +7F48 +0848 +3E48 +0888 +0F08 +7130 +0100 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5952 +ENCODING 22866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0660 +0C30 +391C +E107 +1FF8 +0200 +0CC8 +1998 +0730 +1C60 +01D8 +3F0E +ENDCHAR +STARTCHAR U+5953 +ENCODING 22867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0660 +0C30 +391C +E3E7 +0E20 +0140 +1F80 +00FC +0384 +3D08 +0090 +00E0 +3F00 +ENDCHAR +STARTCHAR U+5954 +ENCODING 22868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0440 +0920 +1FF0 +610C +0540 +0440 +7FFC +0440 +0440 +0840 +1040 +0000 +ENDCHAR +STARTCHAR U+5955 +ENCODING 22869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0240 +1250 +1248 +2448 +09C0 +0100 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5956 +ENCODING 22870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +4440 +247C +0484 +1548 +2430 +6420 +0440 +0104 +FFFE +0100 +0280 +0440 +0830 +300E +C004 +ENDCHAR +STARTCHAR U+5957 +ENCODING 22871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0440 +1FF0 +640C +07C0 +0400 +07C0 +0400 +7FFC +0280 +0460 +3F90 +0000 +ENDCHAR +STARTCHAR U+5958 +ENCODING 22872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2420 +2420 +3C20 +05FC +7C20 +2420 +24F8 +4500 +0100 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5959 +ENCODING 22873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0610 +0C10 +3FF8 +010C +FFFF +0380 +0EE0 +3838 +DFFF +1108 +1FF8 +1108 +1FF9 +0101 +00FF +ENDCHAR +STARTCHAR U+595A +ENCODING 22874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FE0 +1110 +1108 +2248 +0E40 +01A0 +0310 +1FF0 +0100 +7FFC +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+595B +ENCODING 22875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0660 +0C30 +381C +E0FF +3E84 +2284 +22FC +3E84 +22FC +2284 +3E84 +0184 +031C +ENDCHAR +STARTCHAR U+595C +ENCODING 22876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7E3F +0220 +7E3F +0220 +7E3F +0420 +08A0 +0080 +7FFF +0140 +0220 +0410 +780F +0000 +0000 +ENDCHAR +STARTCHAR U+595D +ENCODING 22877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +03C0 +0E70 +F81F +1FFC +1084 +13E4 +1084 +17F4 +1004 +13E4 +3224 +23E4 +601C +ENDCHAR +STARTCHAR U+595E +ENCODING 22878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0660 +0C30 +381C +E447 +0880 +1FFC +3080 +5FF8 +1080 +1FF8 +1080 +1080 +1FFC +ENDCHAR +STARTCHAR U+595F +ENCODING 22879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0660 +0C30 +381C +FEFF +2284 +2284 +3EFC +2284 +3EFC +2284 +2284 +6284 +CE9C +ENDCHAR +STARTCHAR U+5960 +ENCODING 22880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07E0 +1020 +2FF0 +428C +1FF0 +12B0 +1470 +1FF0 +1010 +1FF0 +0100 +7FFC +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+5961 +ENCODING 22881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFC +0200 +1FF8 +1008 +1FF8 +1008 +1008 +1FF8 +0100 +FFFF +0420 +2424 +6424 +4C24 +18E0 +ENDCHAR +STARTCHAR U+5962 +ENCODING 22882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +7FFC +0920 +1FF0 +614C +1FF8 +0240 +0FE0 +7420 +07E0 +0420 +07E0 +0420 +0000 +ENDCHAR +STARTCHAR U+5963 +ENCODING 22883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +0100 +FFFF +0280 +0EE0 +F01F +00FC +7C84 +4484 +44FC +7C84 +44FC +4484 +7D84 +031C +ENDCHAR +STARTCHAR U+5965 +ENCODING 22885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +1FF0 +1950 +1550 +1590 +1FF0 +1390 +1550 +1930 +7FFC +0280 +0C60 +3018 +0000 +ENDCHAR +STARTCHAR U+5967 +ENCODING 22887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0400 +1FF0 +1390 +1550 +1390 +1FF0 +1390 +1550 +0100 +7FFC +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+5968 +ENCODING 22888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +081C +4BE4 +2A48 +2930 +0810 +1FFC +6910 +0890 +0930 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5969 +ENCODING 22889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0240 +0C30 +7FFC +13E0 +1220 +13E0 +1770 +1550 +1770 +1000 +0FF8 +0000 +ENDCHAR +STARTCHAR U+596A +ENCODING 22890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +7FFC +0640 +1AB0 +67FC +0C80 +17E0 +07E0 +0480 +07F0 +7FFC +0420 +0220 +0060 +0000 +ENDCHAR +STARTCHAR U+596B +ENCODING 22891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0360 +0C18 +7007 +2252 +1252 +43DE +2202 +13FE +1202 +23DE +2252 +4252 +4402 +ENDCHAR +STARTCHAR U+596C +ENCODING 22892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2440 +24F8 +3F50 +2520 +04D0 +7FFC +2510 +2490 +4430 +0100 +7FFC +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+596D +ENCODING 22893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0080 +3FFE +0888 +3EBE +22A2 +3EBE +22A2 +3EBE +22A2 +0140 +0220 +0C18 +7007 +ENDCHAR +STARTCHAR U+596E +ENCODING 22894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0660 +1C90 +6FFC +1FE0 +2FE0 +0880 +0FF8 +1FF0 +1110 +1FF0 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+596F +ENCODING 22895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +FFFF +1C38 +E087 +10F8 +1080 +FFFF +0014 +7FFE +4010 +5F1C +4409 +551D +D537 +8CE2 +ENDCHAR +STARTCHAR U+5970 +ENCODING 22896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1224 +1224 +1FFC +0000 +7F7F +5555 +5555 +7F7F +0080 +7FFF +0410 +0808 +7007 +0000 +0000 +ENDCHAR +STARTCHAR U+5971 +ENCODING 22897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0882 +13E4 +2409 +79DE +1004 +25C9 +7C1F +01C0 +5555 +55D5 +0080 +3FFE +0410 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+5972 +ENCODING 22898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +FF77 +2655 +53F7 +9100 +7E7F +1849 +FF7F +30C9 +7E7F +E208 +3EFF +2208 +3E08 +2208 +3E08 +ENDCHAR +STARTCHAR U+5973 +ENCODING 22899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +0200 +7FFC +0440 +0440 +0440 +0F80 +0880 +0140 +0220 +0C10 +3010 +0000 +ENDCHAR +STARTCHAR U+5974 +ENCODING 22900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0888 +0888 +7E88 +1248 +1250 +1250 +3C20 +2420 +0650 +0A90 +1108 +2004 +0000 +ENDCHAR +STARTCHAR U+5975 +ENCODING 22901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +13FF +1010 +FE10 +2210 +2210 +2210 +6210 +4610 +4410 +FC10 +0E10 +1A10 +3010 +E070 +ENDCHAR +STARTCHAR U+5976 +ENCODING 22902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +1088 +1088 +FC88 +2490 +2494 +24BE +2484 +4904 +2904 +1104 +2A04 +4A04 +8428 +0810 +ENDCHAR +STARTCHAR U+5977 +ENCODING 22903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2006 +2278 +7F08 +2208 +220A +22FF +2208 +2208 +1408 +0808 +1408 +2208 +4108 +0000 +0000 +ENDCHAR +STARTCHAR U+5978 +ENCODING 22904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0820 +0820 +7E20 +1220 +13FC +1220 +3E20 +2420 +0620 +0A20 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+5979 +ENCODING 22905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1020 +FD24 +253E +25E4 +2724 +2524 +4534 +2928 +1120 +2922 +4502 +84FE +0000 +ENDCHAR +STARTCHAR U+597B +ENCODING 22907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +1010 +FEFE +2222 +2222 +2222 +6262 +4646 +4444 +FCFC +0E0E +1B1B +3030 +E0E0 +ENDCHAR +STARTCHAR U+597C +ENCODING 22908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +103C +11E0 +1020 +FC20 +2420 +27FF +2420 +6420 +4C20 +4820 +FC20 +1420 +3021 +6033 +C01E +ENDCHAR +STARTCHAR U+597D +ENCODING 22909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0808 +0810 +7E10 +1220 +1220 +13FC +3C20 +2420 +0620 +0A20 +1020 +2060 +0000 +ENDCHAR +STARTCHAR U+597E +ENCODING 22910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2008 +2208 +2208 +7F08 +2249 +2249 +2249 +2249 +1449 +0849 +1449 +227F +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+597F +ENCODING 22911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +7EFF +1224 +1224 +1A24 +1618 +1218 +1224 +1242 +2281 +4200 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+5980 +ENCODING 22912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7E42 +0242 +02FF +0242 +7E42 +4242 +4042 +4024 +4218 +4418 +4824 +7042 +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+5981 +ENCODING 22913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +08F8 +7E88 +1308 +1288 +1248 +3C48 +2408 +0608 +0A08 +1008 +2030 +0000 +ENDCHAR +STARTCHAR U+5982 +ENCODING 22914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +08F8 +0888 +7E88 +1288 +1288 +1288 +3C88 +2488 +0688 +0AF8 +1088 +2000 +0000 +ENDCHAR +STARTCHAR U+5983 +ENCODING 22915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0808 +0808 +7E08 +12F8 +1288 +1280 +3C80 +2480 +0680 +0A84 +1084 +207C +0000 +ENDCHAR +STARTCHAR U+5984 +ENCODING 22916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0800 +0800 +07F8 +0100 +0200 +7FFC +0420 +0F40 +10C0 +0330 +3C08 +0000 +ENDCHAR +STARTCHAR U+5985 +ENCODING 22917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2200 +2202 +7F7F +2208 +2208 +2208 +2208 +2208 +1408 +0808 +140A +227F +4100 +0000 +0000 +ENDCHAR +STARTCHAR U+5986 +ENCODING 22918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0840 +4880 +2884 +2FFE +0908 +0908 +1908 +2A08 +4910 +C8A0 +0840 +08B0 +090C +0A04 +ENDCHAR +STARTCHAR U+5987 +ENCODING 22919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1004 +13FE +FC04 +2404 +2404 +2404 +25FC +4804 +2804 +1004 +2804 +47FC +8404 +0000 +ENDCHAR +STARTCHAR U+5988 +ENCODING 22920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13F8 +1010 +1110 +FD10 +2510 +2510 +2514 +25FE +4404 +2824 +13F4 +2804 +4404 +8428 +0010 +ENDCHAR +STARTCHAR U+598A +ENCODING 22922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +081C +09E0 +0820 +7E20 +1220 +1220 +13FC +3C20 +2420 +0620 +0A20 +11FC +2000 +0000 +ENDCHAR +STARTCHAR U+598B +ENCODING 22923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1020 +FDFE +2420 +2420 +2420 +65FF +4C20 +4870 +FC50 +14D8 +3088 +618C +C307 +ENDCHAR +STARTCHAR U+598C +ENCODING 22924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +1044 +1044 +FDFF +2444 +2444 +2444 +6444 +4DFF +4844 +FC44 +14C4 +3084 +6184 +C304 +ENDCHAR +STARTCHAR U+598D +ENCODING 22925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0890 +0890 +7E90 +1290 +13FC +1290 +3C90 +2490 +0690 +0B10 +1110 +2210 +0000 +ENDCHAR +STARTCHAR U+598E +ENCODING 22926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +1028 +1028 +FC6C +2444 +24C6 +2583 +6444 +4C44 +4844 +FC44 +1444 +30C4 +6084 +C184 +ENDCHAR +STARTCHAR U+598F +ENCODING 22927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2208 +227F +7F22 +2222 +2222 +2222 +2222 +2214 +1408 +0814 +1422 +2241 +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+5990 +ENCODING 22928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2018 +2224 +2242 +7F81 +2300 +2208 +2208 +2210 +2210 +1424 +0842 +14FF +6301 +0000 +0000 +ENDCHAR +STARTCHAR U+5992 +ENCODING 22930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1020 +1004 +FDFE +2504 +2504 +2504 +25FC +4504 +2900 +1100 +2A00 +4600 +8400 +0800 +ENDCHAR +STARTCHAR U+5993 +ENCODING 22931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +0820 +7E20 +13F8 +1288 +1288 +3C50 +2450 +0620 +0A50 +1188 +2204 +0000 +ENDCHAR +STARTCHAR U+5995 +ENCODING 22933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +1010 +FDFF +2511 +2511 +2511 +6511 +4DFF +4810 +FC10 +1410 +3010 +6010 +C010 +ENDCHAR +STARTCHAR U+5996 +ENCODING 22934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +09E0 +0820 +7E20 +1220 +13FC +1220 +3C20 +2460 +0650 +0A90 +1108 +2204 +0000 +ENDCHAR +STARTCHAR U+5997 +ENCODING 22935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +FD10 +250E +2644 +2420 +2400 +45F8 +2808 +1010 +2810 +4420 +8440 +0080 +ENDCHAR +STARTCHAR U+5998 +ENCODING 22936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +227E +2200 +7F00 +2200 +22FF +2208 +2208 +2210 +1420 +0842 +1482 +22FF +4101 +0000 +0000 +ENDCHAR +STARTCHAR U+5999 +ENCODING 22937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +08B0 +7EA8 +12A8 +12A4 +132C +3D28 +2470 +0610 +0A20 +10C0 +2300 +0000 +ENDCHAR +STARTCHAR U+599B +ENCODING 22939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1FF0 +0000 +7FFC +0200 +3FF8 +0440 +0440 +0F80 +08E0 +0310 +3C08 +0000 +ENDCHAR +STARTCHAR U+599D +ENCODING 22941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +2440 +2440 +2440 +3FFC +2490 +0490 +7C90 +1510 +15A0 +1460 +2450 +2588 +4604 +0000 +ENDCHAR +STARTCHAR U+599E +ENCODING 22942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1088 +1088 +FC88 +2488 +2488 +25F8 +2488 +4488 +2888 +1088 +2888 +4488 +87FE +0000 +ENDCHAR +STARTCHAR U+599F +ENCODING 22943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +1FF8 +0200 +0200 +FFFF +0830 +1E60 +03C0 +0E70 +781E +ENDCHAR +STARTCHAR U+59A0 +ENCODING 22944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2208 +2208 +7F7F +2249 +2249 +2249 +2255 +2263 +1441 +0841 +1441 +2245 +4142 +0000 +0000 +ENDCHAR +STARTCHAR U+59A1 +ENCODING 22945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +227E +2240 +7F40 +227F +2244 +2244 +2244 +2244 +1444 +0844 +1484 +2204 +4104 +0000 +0000 +ENDCHAR +STARTCHAR U+59A2 +ENCODING 22946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +2028 +2244 +2282 +7F01 +22FE +2212 +2212 +2212 +2212 +1422 +0842 +148A +6204 +0000 +0000 +ENDCHAR +STARTCHAR U+59A3 +ENCODING 22947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +1120 +1124 +7D24 +25E8 +2530 +2520 +7920 +4920 +0D20 +1564 +21A4 +461C +0000 +ENDCHAR +STARTCHAR U+59A4 +ENCODING 22948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11F8 +1008 +1050 +FC20 +2420 +27FE +2422 +2424 +4420 +2820 +1020 +2820 +4420 +84A0 +0040 +ENDCHAR +STARTCHAR U+59A5 +ENCODING 22949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +00E8 +3F08 +1210 +0920 +0840 +0100 +7FFC +0220 +0420 +0740 +08C0 +0330 +3C08 +0000 +ENDCHAR +STARTCHAR U+59A6 +ENCODING 22950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2209 +220E +7F78 +2208 +2208 +227F +2208 +2208 +147F +0808 +1408 +2208 +4108 +0000 +0000 +ENDCHAR +STARTCHAR U+59A7 +ENCODING 22951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1000 +1000 +FC00 +2400 +27FF +2448 +6448 +4C48 +4848 +FC48 +14C9 +3089 +6189 +C307 +ENDCHAR +STARTCHAR U+59A8 +ENCODING 22952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +09FC +7E40 +1240 +1278 +1248 +3C48 +2448 +0688 +0A88 +1108 +2230 +0000 +ENDCHAR +STARTCHAR U+59A9 +ENCODING 22953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1040 +1040 +FC40 +2444 +27FE +2450 +2450 +4450 +2890 +1090 +2892 +4512 +820E +0400 +ENDCHAR +STARTCHAR U+59AA +ENCODING 22954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1100 +1104 +FD84 +2548 +2528 +2510 +2510 +4528 +2944 +1184 +2900 +4504 +85FE +0000 +ENDCHAR +STARTCHAR U+59AB +ENCODING 22955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1240 +1140 +1140 +FC44 +27FE +2444 +2444 +2444 +4444 +28A4 +1094 +2904 +4504 +8228 +0410 +ENDCHAR +STARTCHAR U+59AC +ENCODING 22956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +0820 +7E20 +1240 +1240 +12F8 +3C88 +2588 +0688 +0A88 +10F8 +2088 +0000 +ENDCHAR +STARTCHAR U+59AD +ENCODING 22957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +104C +1044 +13FF +FC40 +2440 +2444 +24E4 +64AC +4CA8 +49B8 +FD10 +1338 +366C +60C6 +C183 +ENDCHAR +STARTCHAR U+59AE +ENCODING 22958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +1104 +FD04 +25FC +2500 +2540 +2544 +494C +2950 +1260 +2A42 +4642 +843E +0800 +ENDCHAR +STARTCHAR U+59AF +ENCODING 22959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1024 +FDFE +2524 +2524 +2524 +2524 +45FC +2924 +1124 +2924 +4524 +85FC +0104 +ENDCHAR +STARTCHAR U+59B0 +ENCODING 22960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +10FF +FDA0 +2520 +2520 +243E +6420 +4C20 +4820 +FC3E +1420 +3020 +6020 +C020 +ENDCHAR +STARTCHAR U+59B1 +ENCODING 22961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +207F +2211 +2211 +7F11 +2211 +2221 +2246 +2200 +227F +1441 +0841 +1441 +227F +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+59B2 +ENCODING 22962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +0888 +7E88 +12F8 +1288 +1288 +3C88 +24F8 +0688 +0A00 +13FC +2000 +0000 +ENDCHAR +STARTCHAR U+59B3 +ENCODING 22963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +10FF +FD90 +2710 +2410 +2410 +6492 +4C92 +4892 +FD93 +1511 +3010 +6010 +C070 +ENDCHAR +STARTCHAR U+59B4 +ENCODING 22964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1F7E +6222 +1422 +083C +1021 +603F +0410 +7FFF +0220 +0140 +0080 +0140 +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+59B5 +ENCODING 22965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2008 +2200 +227F +7F08 +2208 +2208 +227F +2208 +1408 +0808 +1408 +227F +4100 +0000 +0000 +ENDCHAR +STARTCHAR U+59B6 +ENCODING 22966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +2810 +29FF +7C10 +2822 +2844 +28F8 +2810 +2820 +1044 +2882 +45FF +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+59B7 +ENCODING 22967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +10FE +FD90 +2510 +2410 +25FF +6410 +4C10 +4838 +FC28 +146C +3044 +60C6 +C183 +ENDCHAR +STARTCHAR U+59B9 +ENCODING 22969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +08F8 +7E20 +1220 +13FC +1270 +3C70 +24A8 +0724 +0A20 +1220 +2020 +0000 +ENDCHAR +STARTCHAR U+59BA +ENCODING 22970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +13FF +FC20 +2420 +2420 +25FE +64A8 +4CA8 +48A8 +FDAC +1524 +3326 +6223 +C020 +ENDCHAR +STARTCHAR U+59BB +ENCODING 22971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +0110 +7FFC +0110 +1FF0 +0200 +7FFC +0420 +0F40 +01E0 +3E18 +0000 +ENDCHAR +STARTCHAR U+59BC +ENCODING 22972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1060 +1030 +1010 +1044 +FC44 +244C +2548 +2548 +6558 +4D56 +4B73 +FA61 +1440 +31C2 +6766 +C03C +ENDCHAR +STARTCHAR U+59BD +ENCODING 22973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2208 +227F +7F49 +2249 +227F +2249 +2249 +227F +1449 +0808 +1408 +2208 +4108 +0000 +0000 +ENDCHAR +STARTCHAR U+59BE +ENCODING 22974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0820 +0440 +7FFC +0100 +0200 +7FFC +0440 +0F40 +10C0 +0330 +3C08 +0000 +ENDCHAR +STARTCHAR U+59C0 +ENCODING 22976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +220E +2278 +7F08 +2208 +227F +2208 +2208 +221C +142A +0849 +1408 +2208 +4108 +0000 +0000 +ENDCHAR +STARTCHAR U+59C1 +ENCODING 22977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +11FF +FD01 +2701 +24F9 +2489 +6489 +4C89 +4889 +FCF9 +1401 +3001 +6003 +C00E +ENDCHAR +STARTCHAR U+59C3 +ENCODING 22979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1010 +7E10 +2490 +2490 +2490 +249F +4490 +4890 +6890 +5090 +1890 +2890 +25FF +4400 +ENDCHAR +STARTCHAR U+59C4 +ENCODING 22980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +1102 +FD02 +25FE +2510 +2510 +65FF +4D10 +4910 +FD18 +1508 +316D +61C7 +C302 +ENDCHAR +STARTCHAR U+59C5 +ENCODING 22981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +4222 +4924 +48A8 +FDFC +4820 +4820 +4820 +4BFE +2820 +1020 +2820 +4420 +8220 +0000 +0000 +ENDCHAR +STARTCHAR U+59C6 +ENCODING 22982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +08C8 +7EA8 +12A8 +13FC +1288 +3EC8 +24A8 +06A8 +0BFC +1108 +2030 +0000 +ENDCHAR +STARTCHAR U+59C7 +ENCODING 22983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +0808 +73FF +1008 +1108 +10C8 +1418 +0410 +7FFF +0410 +0220 +01C0 +0220 +7C1F +0000 +0000 +ENDCHAR +STARTCHAR U+59C8 +ENCODING 22984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1070 +1058 +10CC +FD86 +2703 +24FC +2400 +6400 +4DFE +4822 +FC22 +1422 +302E +6020 +C020 +ENDCHAR +STARTCHAR U+59C9 +ENCODING 22985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +0820 +7E20 +12F8 +12A8 +12A8 +3CA8 +24A8 +06A8 +0AB0 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+59CA +ENCODING 22986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1028 +103C +11E0 +FD20 +2520 +2520 +25FE +2422 +4462 +286A +10A4 +2920 +4620 +8020 +0020 +ENDCHAR +STARTCHAR U+59CB +ENCODING 22987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +1050 +7C88 +249C +27E4 +2400 +75F8 +4908 +0D08 +1508 +21F8 +4108 +0000 +ENDCHAR +STARTCHAR U+59CC +ENCODING 22988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +28FE +2892 +7C92 +28FE +2892 +2892 +29FF +2882 +2882 +1082 +288A +4484 +0000 +0000 +ENDCHAR +STARTCHAR U+59CD +ENCODING 22989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1152 +1152 +FD52 +2552 +2552 +27FF +6552 +4D52 +4952 +F952 +1552 +3152 +6352 +C656 +ENDCHAR +STARTCHAR U+59CE +ENCODING 22990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +2810 +28FE +7C92 +2892 +2892 +29FF +2810 +2828 +2844 +1082 +2901 +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+59CF +ENCODING 22991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2022 +2022 +2222 +2222 +7F7F +2222 +2222 +2222 +223E +1422 +0822 +1422 +223E +4122 +0000 +0000 +ENDCHAR +STARTCHAR U+59D0 +ENCODING 22992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +0888 +7E88 +12F8 +1288 +1288 +3CF8 +2488 +0688 +0888 +13FC +6000 +0000 +ENDCHAR +STARTCHAR U+59D1 +ENCODING 22993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +09FC +7E20 +1220 +1220 +12F8 +3C88 +2488 +0688 +0A88 +10F8 +2088 +0000 +ENDCHAR +STARTCHAR U+59D2 +ENCODING 22994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +1148 +1128 +FD28 +2528 +2508 +2508 +2508 +4508 +2948 +1190 +2910 +4428 +8446 +0082 +ENDCHAR +STARTCHAR U+59D3 +ENCODING 22995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1120 +1120 +1120 +7DFC +2620 +2620 +2420 +79F8 +4820 +0C20 +1420 +23FC +4000 +0000 +ENDCHAR +STARTCHAR U+59D4 +ENCODING 22996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +7FFC +0380 +0D60 +711C +0200 +7FFC +0440 +0F40 +10C0 +0330 +3C08 +0000 +ENDCHAR +STARTCHAR U+59D6 +ENCODING 22998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +227F +2240 +7F40 +2240 +227F +2241 +2241 +227F +1440 +0840 +1440 +227F +4140 +0000 +0000 +ENDCHAR +STARTCHAR U+59D7 +ENCODING 22999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11DE +1154 +1154 +FD54 +2554 +2554 +27FE +2554 +4554 +2954 +1154 +2954 +4554 +82EC +0444 +ENDCHAR +STARTCHAR U+59D8 +ENCODING 23000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +1000 +13FE +FC88 +2488 +2488 +2488 +27FE +4488 +2888 +1088 +2888 +4488 +8108 +0208 +ENDCHAR +STARTCHAR U+59D9 +ENCODING 23001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +108C +10F0 +1110 +7D10 +2710 +2510 +25FC +7910 +4910 +0D10 +1510 +217C +4100 +0000 +ENDCHAR +STARTCHAR U+59DA +ENCODING 23002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +12A8 +11A8 +7DB0 +24A0 +24B0 +25A8 +7AA8 +48A0 +0D20 +1524 +2224 +441C +0000 +ENDCHAR +STARTCHAR U+59DB +ENCODING 23003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +2101 +2901 +297D +7D01 +297D +2945 +2945 +297D +2945 +2901 +1101 +2905 +4502 +0000 +0000 +ENDCHAR +STARTCHAR U+59DC +ENCODING 23004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0200 +7FFC +0440 +0F40 +11C0 +0620 +3810 +0000 +ENDCHAR +STARTCHAR U+59DD +ENCODING 23005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1120 +1128 +11FC +FD20 +2620 +2424 +27FE +2420 +4470 +28A8 +10A8 +2924 +4622 +8420 +0020 +ENDCHAR +STARTCHAR U+59DE +ENCODING 23006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +11FF +FC10 +2410 +2410 +25FF +6400 +4C00 +48FE +7C82 +1482 +3082 +6082 +C0FE +ENDCHAR +STARTCHAR U+59DF +ENCODING 23007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +23FF +FC40 +24C0 +2588 +24D8 +6430 +4C64 +48CC +FB98 +1430 +306C +60C6 +C383 +ENDCHAR +STARTCHAR U+59E0 +ENCODING 23008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2040 +2880 +29FF +7D01 +297D +2945 +2945 +297D +2945 +2901 +1101 +2905 +4502 +0000 +0000 +ENDCHAR +STARTCHAR U+59E1 +ENCODING 23009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +21FE +2810 +2810 +7C10 +29FF +2810 +2810 +28FE +2882 +2882 +1082 +6CFE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+59E3 +ENCODING 23011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1004 +13FE +FC00 +2488 +2506 +268A +2488 +4450 +2850 +1020 +2850 +4488 +810E +0604 +ENDCHAR +STARTCHAR U+59E4 +ENCODING 23012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +1100 +FD00 +25FF +2500 +2500 +6500 +4D7E +4942 +FD42 +1542 +3142 +6342 +C67E +ENDCHAR +STARTCHAR U+59E5 +ENCODING 23013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1048 +11F8 +1050 +7C50 +27FC +2420 +24C0 +7898 +49E0 +0E80 +1484 +2084 +407C +0000 +ENDCHAR +STARTCHAR U+59E6 +ENCODING 23014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0440 +0E80 +03C0 +1C30 +0820 +7FFC +1248 +34D0 +0C30 +1A68 +6184 +0000 +ENDCHAR +STARTCHAR U+59E7 +ENCODING 23015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +107F +FF08 +2208 +4208 +FC08 +1B08 +E0FF +1008 +FF08 +2208 +6208 +4608 +FC08 +1B08 +F108 +ENDCHAR +STARTCHAR U+59E8 +ENCODING 23016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +0820 +7EF8 +1228 +12F8 +12A0 +3DFC +2424 +0678 +0850 +1188 +2604 +0000 +ENDCHAR +STARTCHAR U+59E9 +ENCODING 23017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2042 +28FF +7D08 +2808 +28FE +2848 +2848 +2848 +29FF +2808 +1008 +2808 +4408 +0000 +0000 +ENDCHAR +STARTCHAR U+59EA +ENCODING 23018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1080 +10A0 +7D10 +27F8 +2448 +2440 +77F8 +4840 +0C40 +1440 +27FC +4000 +0000 +ENDCHAR +STARTCHAR U+59EB +ENCODING 23019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +1120 +1120 +7D20 +25F8 +2508 +2508 +79F8 +4920 +0D20 +1520 +21FC +4100 +0000 +ENDCHAR +STARTCHAR U+59EC +ENCODING 23020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1110 +1110 +FD14 +257E +2544 +2544 +2544 +4544 +297C +1110 +2910 +4514 +85FE +0000 +ENDCHAR +STARTCHAR U+59ED +ENCODING 23021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1FFC +0104 +0614 +1018 +7E7F +2221 +4CC6 +0410 +7FFF +0220 +01C0 +0220 +7C1F +0000 +0000 +ENDCHAR +STARTCHAR U+59EE +ENCODING 23022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +11FF +1000 +7E00 +24FE +2482 +4482 +48FE +6882 +5082 +58FE +1482 +2400 +21FF +4000 +ENDCHAR +STARTCHAR U+59EF +ENCODING 23023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1122 +11A6 +10A4 +FCA4 +2420 +2420 +27FF +6448 +4C48 +4848 +FC48 +14C8 +3089 +6189 +C307 +ENDCHAR +STARTCHAR U+59F1 +ENCODING 23025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +1048 +FCCC +2787 +2478 +2400 +65FE +4C20 +4840 +FCFE +1402 +3002 +6006 +C01C +ENDCHAR +STARTCHAR U+59F2 +ENCODING 23026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +1101 +FD45 +2444 +25FF +2444 +64C4 +4C84 +4884 +FCCC +1468 +3038 +606C +C1C7 +ENDCHAR +STARTCHAR U+59F3 +ENCODING 23027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +207E +2842 +2884 +7D48 +2830 +2820 +287E +28C2 +2B42 +2842 +1042 +287E +4442 +0000 +0000 +ENDCHAR +STARTCHAR U+59F4 +ENCODING 23028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F82 +0822 +1F22 +3122 +6B22 +0622 +0C02 +780E +0200 +FFFF +0410 +0830 +1F60 +01C0 +0778 +7C0E +ENDCHAR +STARTCHAR U+59F5 +ENCODING 23029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +2202 +2AFA +7E22 +2A22 +2AFA +2AAA +2AAA +2AAA +2AAA +2AB2 +1222 +2821 +4420 +0000 +0000 +ENDCHAR +STARTCHAR U+59F6 +ENCODING 23030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +0850 +7E50 +1288 +13FC +1200 +32F8 +2C88 +0488 +0A88 +10F8 +6088 +0000 +ENDCHAR +STARTCHAR U+59F7 +ENCODING 23031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +1040 +FC40 +24FE +2582 +2682 +64FE +4C82 +4882 +FCFE +1482 +3082 +6082 +C08E +ENDCHAR +STARTCHAR U+59F8 +ENCODING 23032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1036 +11D8 +1048 +2448 +7E48 +2448 +2458 +44E8 +4B5E +4848 +6848 +5848 +1448 +2488 +2488 +4108 +ENDCHAR +STARTCHAR U+59F9 +ENCODING 23033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +13FE +1202 +FC04 +2438 +25C0 +2440 +2444 +47FE +2840 +1040 +2842 +4442 +843E +0000 +ENDCHAR +STARTCHAR U+59FA +ENCODING 23034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2090 +28FE +2890 +7D10 +2810 +29FF +2848 +2848 +2848 +2848 +1089 +2909 +440F +0000 +0000 +ENDCHAR +STARTCHAR U+59FB +ENCODING 23035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1148 +1148 +7D48 +25F8 +2548 +2548 +7968 +4998 +0D98 +1508 +21F8 +4108 +0000 +ENDCHAR +STARTCHAR U+59FC +ENCODING 23036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +207E +2044 +28A8 +2910 +7C20 +28C8 +281F +2821 +2852 +280C +2808 +1010 +2820 +44C0 +0000 +0000 +ENDCHAR +STARTCHAR U+59FD +ENCODING 23037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20FC +2904 +2808 +7CFF +2880 +28FE +28A2 +28A2 +28BC +28A0 +1121 +2821 +443F +0000 +0000 +ENDCHAR +STARTCHAR U+59FE +ENCODING 23038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2014 +2222 +2241 +7F00 +223E +2208 +2208 +223E +1408 +0808 +1408 +227F +4100 +0000 +0000 +ENDCHAR +STARTCHAR U+59FF +ENCODING 23039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3100 +0BFC +0248 +0CC0 +1130 +660C +0100 +7FFC +0220 +0740 +08C0 +0330 +3C08 +0000 +ENDCHAR +STARTCHAR U+5A00 +ENCODING 23040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +100B +1009 +1008 +FDFF +2408 +2448 +2448 +65F9 +4C4B +484A +FCCE +1484 +318D +6317 +C062 +ENDCHAR +STARTCHAR U+5A01 +ENCODING 23041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +1FFC +1040 +1FC8 +1248 +1FC8 +14D0 +14B0 +1F30 +1124 +22D4 +2C8C +4004 +0000 +ENDCHAR +STARTCHAR U+5A03 +ENCODING 23043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +08F8 +7E20 +1220 +13FC +1220 +3C20 +24F8 +0620 +0A20 +11FC +2000 +0000 +ENDCHAR +STARTCHAR U+5A04 +ENCODING 23044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +0D30 +0540 +7FFC +0540 +0D20 +111C +2108 +0200 +FFFE +0420 +0820 +0640 +0180 +0660 +3810 +ENDCHAR +STARTCHAR U+5A05 +ENCODING 23045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +17FE +1090 +FC90 +2490 +2492 +2694 +2598 +4490 +2890 +1090 +2890 +4494 +87FE +0000 +ENDCHAR +STARTCHAR U+5A06 +ENCODING 23046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +105C +13E0 +FC48 +2452 +2462 +279E +2400 +47F8 +2890 +1090 +2890 +4492 +8112 +060E +ENDCHAR +STARTCHAR U+5A07 +ENCODING 23047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1018 +13E0 +1040 +1040 +FC44 +27FE +24A0 +2510 +271E +4514 +2910 +1110 +2910 +4510 +8210 +0410 +ENDCHAR +STARTCHAR U+5A08 +ENCODING 23048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +7FFC +0440 +1450 +244C +4444 +0540 +0204 +FFFE +0420 +0820 +0640 +0180 +0660 +3818 +ENDCHAR +STARTCHAR U+5A09 +ENCODING 23049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +08A8 +08F8 +7EA8 +12F8 +1200 +13FC +3C40 +0478 +0688 +0A08 +1010 +2060 +0000 +ENDCHAR +STARTCHAR U+5A0A +ENCODING 23050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +203E +2022 +2222 +223E +7F22 +223E +2222 +2222 +223E +2214 +1414 +0814 +1425 +6347 +0000 +0000 +ENDCHAR +STARTCHAR U+5A0C +ENCODING 23052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +11FE +1124 +FD24 +25FC +2524 +2524 +25FC +4420 +2828 +11FC +2820 +4424 +87FE +0000 +ENDCHAR +STARTCHAR U+5A0D +ENCODING 23053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4024 +4026 +4022 +47FF +F420 +5420 +57A2 +54B2 +D496 +9494 +B49C +E488 +249C +75B5 +5C67 +C8C2 +ENDCHAR +STARTCHAR U+5A0E +ENCODING 23054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +081C +08F0 +FE80 +08FF +0A88 +1C88 +E888 +0888 +0A08 +FFFF +0410 +0830 +1F60 +01C0 +0770 +7C1E +ENDCHAR +STARTCHAR U+5A0F +ENCODING 23055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20A1 +20A1 +2882 +29F4 +7C81 +28A2 +28A4 +28A1 +28A2 +28A4 +10A9 +2921 +4421 +021F +0000 +0000 +ENDCHAR +STARTCHAR U+5A11 +ENCODING 23057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +4950 +2948 +2254 +0CD4 +1060 +20C0 +2700 +0200 +7FFC +0440 +0F80 +0360 +3C10 +0000 +ENDCHAR +STARTCHAR U+5A12 +ENCODING 23058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11FF +1100 +FF00 +24FE +2492 +2492 +6492 +4FFF +4922 +FD22 +1522 +31FF +6004 +C00C +ENDCHAR +STARTCHAR U+5A13 +ENCODING 23059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +1104 +FDFC +2500 +250C +25F0 +2520 +45FC +2920 +11FE +2920 +4522 +8222 +041E +ENDCHAR +STARTCHAR U+5A15 +ENCODING 23061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2810 +7CFE +2892 +2892 +28FE +2810 +2838 +2854 +1092 +2911 +4410 +0210 +0000 +0000 +ENDCHAR +STARTCHAR U+5A16 +ENCODING 23062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +20FE +2082 +2482 +2482 +7EFE +2410 +2490 +249E +2490 +2490 +14D0 +0930 +741F +0000 +0000 +ENDCHAR +STARTCHAR U+5A17 +ENCODING 23063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +21DE +2844 +7C84 +2904 +289F +2844 +2844 +2844 +2944 +109F +2940 +4620 +001F +0000 +0000 +ENDCHAR +STARTCHAR U+5A18 +ENCODING 23064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +08F8 +0888 +7E88 +12F8 +1288 +12F8 +3AA4 +24A8 +0690 +0AB0 +10C8 +2304 +0000 +ENDCHAR +STARTCHAR U+5A19 +ENCODING 23065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2002 +21FF +2449 +2492 +2524 +7E92 +2449 +2400 +24FE +2410 +1410 +0810 +1410 +63FF +0000 +0000 +ENDCHAR +STARTCHAR U+5A1A +ENCODING 23066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +08A8 +08A8 +7EF8 +12A8 +12A8 +12F8 +3C20 +05FC +0624 +0A44 +1084 +2318 +0000 +ENDCHAR +STARTCHAR U+5A1B +ENCODING 23067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +107C +1044 +1544 +7F44 +257C +2500 +25FE +4922 +6822 +5022 +5BFF +1450 +2488 +2104 +4603 +ENDCHAR +STARTCHAR U+5A1C +ENCODING 23068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17B8 +12A8 +12A8 +7FB0 +2AB0 +2AA8 +2FA8 +2AA4 +72A4 +12A4 +1CB8 +2720 +4820 +0000 +ENDCHAR +STARTCHAR U+5A1E +ENCODING 23070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +1021 +FD33 +2596 +2484 +2420 +65FF +4C44 +48C4 +F88C +15E8 +303C +6066 +C1C3 +ENDCHAR +STARTCHAR U+5A1F +ENCODING 23071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +1108 +7DF8 +2400 +25F8 +2508 +75F8 +4908 +0DF8 +1508 +2508 +4118 +0000 +ENDCHAR +STARTCHAR U+5A20 +ENCODING 23072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +1100 +1100 +7DF8 +2500 +25FC +2568 +7968 +4D70 +0A50 +1250 +2468 +4184 +0000 +ENDCHAR +STARTCHAR U+5A23 +ENCODING 23075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1048 +1010 +11FC +FC24 +2424 +25FC +2520 +2520 +45FE +2862 +1062 +28AA +4524 +8220 +0020 +ENDCHAR +STARTCHAR U+5A24 +ENCODING 23076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +4410 +4410 +7DFF +0410 +FC10 +2410 +6410 +C4FE +0400 +FFFF +0820 +1F60 +01C0 +0770 +7C1E +ENDCHAR +STARTCHAR U+5A25 +ENCODING 23077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1060 +10A8 +13A4 +10A4 +7CA0 +27FC +24A8 +24A8 +78D8 +4B90 +0C94 +14AC +20CC +4184 +0000 +ENDCHAR +STARTCHAR U+5A27 +ENCODING 23079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +1186 +1084 +11FE +FF02 +2502 +2502 +2502 +65FE +4C48 +4848 +FC48 +14C8 +3089 +6189 +C307 +ENDCHAR +STARTCHAR U+5A28 +ENCODING 23080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +11FE +FF02 +2502 +25FE +2400 +65FE +4C20 +4820 +FBFF +1420 +3020 +6020 +C020 +ENDCHAR +STARTCHAR U+5A29 +ENCODING 23081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1078 +1090 +1320 +7DF8 +2548 +2548 +25F8 +7968 +4860 +0CA0 +14A4 +2124 +461C +0000 +ENDCHAR +STARTCHAR U+5A2A +ENCODING 23082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1020 +1020 +FDFC +2444 +2444 +2444 +67FF +4C00 +48FE +F882 +1482 +3082 +6082 +C0FE +ENDCHAR +STARTCHAR U+5A2D +ENCODING 23085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1044 +1084 +FDFE +2482 +2480 +24FE +6520 +4C20 +4BFF +F848 +1448 +30CC +6186 +C303 +ENDCHAR +STARTCHAR U+5A2E +ENCODING 23086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2010 +25FF +2400 +7EFE +2400 +24FE +2400 +24FE +2482 +1482 +0882 +14FE +6282 +0000 +0000 +ENDCHAR +STARTCHAR U+5A2F +ENCODING 23087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1178 +1148 +1148 +7D48 +2578 +2548 +2500 +79F0 +4810 +0FFC +1490 +2108 +4604 +0000 +ENDCHAR +STARTCHAR U+5A30 +ENCODING 23088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1081 +1081 +1081 +10A1 +FDA1 +2529 +252D +6725 +4721 +4D21 +4921 +F923 +1532 +31E6 +610D +C119 +ENDCHAR +STARTCHAR U+5A31 +ENCODING 23089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1108 +FDF8 +2508 +2400 +25F8 +2440 +4444 +2FFE +1040 +28A0 +4510 +820E +0404 +ENDCHAR +STARTCHAR U+5A32 +ENCODING 23090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +1104 +FD04 +25FC +2524 +2420 +27FE +4A22 +2A22 +1252 +2A8A +4602 +820A +0204 +ENDCHAR +STARTCHAR U+5A33 +ENCODING 23091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2011 +21E1 +2841 +7C45 +2845 +29F5 +2845 +2845 +28E5 +2955 +2A49 +1041 +2845 +4442 +0000 +0000 +ENDCHAR +STARTCHAR U+5A34 +ENCODING 23092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +10BE +1084 +1124 +FD24 +2524 +25FC +2524 +2574 +456C +29AC +1124 +2924 +4504 +8514 +0108 +ENDCHAR +STARTCHAR U+5A35 +ENCODING 23093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1280 +1280 +7BF8 +2AC8 +2AC8 +2BA8 +6AB0 +1290 +13B0 +1CA8 +20C8 +4084 +0000 +ENDCHAR +STARTCHAR U+5A36 +ENCODING 23094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F00 +12F8 +1E88 +1250 +1E20 +12D0 +7F0C +0200 +7FFC +0440 +0F80 +0360 +3C10 +0000 +ENDCHAR +STARTCHAR U+5A37 +ENCODING 23095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2002 +21FC +2010 +2410 +25FF +7E10 +2454 +25FF +2454 +2454 +29FF +1010 +2810 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5A38 +ENCODING 23096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +2044 +29FF +2844 +7E7C +2844 +2844 +287C +2844 +2844 +29FF +1044 +2882 +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+5A39 +ENCODING 23097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21C8 +2044 +285F +7DC0 +2904 +2904 +29C9 +285F +2842 +2844 +1048 +2852 +449F +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+5A3C +ENCODING 23100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +11F0 +7D10 +25F0 +2510 +2400 +7BF8 +4A08 +0FF8 +1608 +23F8 +4208 +0000 +ENDCHAR +STARTCHAR U+5A3E +ENCODING 23102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +20FF +2088 +2488 +24BE +7E88 +2488 +24FF +2488 +2488 +28BE +1108 +2808 +447F +0000 +0000 +ENDCHAR +STARTCHAR U+5A40 +ENCODING 23104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1508 +1508 +7EE8 +2EA8 +2DA8 +2DA8 +75E8 +55A8 +1F08 +2C08 +2408 +4418 +0000 +ENDCHAR +STARTCHAR U+5A41 +ENCODING 23105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0920 +7FFC +0920 +0FE0 +0FE0 +0920 +0FE0 +7FFC +0440 +0F40 +01C0 +3E30 +0000 +ENDCHAR +STARTCHAR U+5A42 +ENCODING 23106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2040 +24FE +2582 +7EFE +2482 +24FE +2410 +25FF +2511 +2911 +1116 +2810 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+5A43 +ENCODING 23107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2010 +29FF +2901 +7D01 +287C +2800 +28FE +2810 +2854 +1092 +2911 +4410 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+5A44 +ENCODING 23108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +1084 +FC84 +24CC +2448 +27FF +6400 +4C00 +49FE +FD02 +1502 +3102 +6102 +C1FE +ENDCHAR +STARTCHAR U+5A45 +ENCODING 23109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +10FF +FC81 +2521 +2525 +24A9 +65FD +4C61 +48F9 +FCAD +15A5 +3323 +6022 +C00E +ENDCHAR +STARTCHAR U+5A46 +ENCODING 23110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3040 +0BFC +6248 +0BF8 +1290 +2460 +279C +0900 +7FFC +0220 +0740 +08E0 +0310 +3C08 +0000 +ENDCHAR +STARTCHAR U+5A47 +ENCODING 23111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +1021 +FD33 +2592 +2480 +2410 +6410 +4DFF +4854 +FC54 +14D6 +3092 +6193 +C010 +ENDCHAR +STARTCHAR U+5A48 +ENCODING 23112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FE +1020 +FFFF +2488 +2588 +274F +6440 +4CFC +4984 +7B0C +14D8 +3070 +60DC +C387 +ENDCHAR +STARTCHAR U+5A49 +ENCODING 23113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +11FC +1104 +7E88 +24B8 +24E8 +2568 +6B68 +18F0 +0CA0 +14A4 +2124 +421C +0000 +ENDCHAR +STARTCHAR U+5A4A +ENCODING 23114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1024 +13FE +1020 +FC20 +25FC +2420 +2424 +27FE +4440 +28A4 +11A8 +2A90 +4488 +80C6 +0080 +ENDCHAR +STARTCHAR U+5A4C +ENCODING 23116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +109F +10E9 +1089 +FC89 +248B +27EA +248A +648E +4DC4 +4BE4 +FAAE +12AA +308A +609B +C191 +ENDCHAR +STARTCHAR U+5A4D +ENCODING 23117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2444 +2482 +7F01 +25FF +2402 +24FA +248A +288A +10FA +2802 +440A +4204 +0000 +0000 +ENDCHAR +STARTCHAR U+5A50 +ENCODING 23120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +1122 +FDFE +2522 +2522 +25FE +6420 +4FFF +48A8 +F8A4 +14A4 +3122 +6221 +C020 +ENDCHAR +STARTCHAR U+5A51 +ENCODING 23121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +21FE +2410 +25FF +7E54 +2492 +2551 +2444 +25FF +2844 +1028 +2810 +4428 +45C7 +0000 +0000 +ENDCHAR +STARTCHAR U+5A52 +ENCODING 23122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2092 +2092 +2854 +2810 +7E28 +28C6 +2800 +2892 +2892 +2854 +2810 +1028 +2844 +4583 +0000 +0000 +ENDCHAR +STARTCHAR U+5A53 +ENCODING 23123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0140 +3F7E +0140 +3F7E +0140 +3F7E +0240 +7FFF +0220 +0140 +0080 +0140 +0220 +3C1E +0000 +0000 +ENDCHAR +STARTCHAR U+5A55 +ENCODING 23125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2048 +27FC +2040 +FBF8 +4848 +4FFE +4848 +4BF8 +9040 +5248 +227C +2340 +52C0 +8460 +081E +ENDCHAR +STARTCHAR U+5A56 +ENCODING 23126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +21FE +2410 +25FF +7E28 +2444 +2492 +2511 +2450 +2894 +1115 +2815 +4451 +4420 +0000 +0000 +ENDCHAR +STARTCHAR U+5A57 +ENCODING 23127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +204E +2982 +2902 +7DEE +2902 +2902 +29FE +2848 +2848 +2849 +1049 +2889 +450F +0000 +0000 +ENDCHAR +STARTCHAR U+5A58 +ENCODING 23128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2092 +2054 +2438 +25FF +7E10 +25FF +2428 +2444 +24FE +2945 +1044 +2848 +4441 +447F +0000 +0000 +ENDCHAR +STARTCHAR U+5A5A +ENCODING 23130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +11E0 +1120 +11FC +7D20 +2510 +25D4 +270C +79FC +4908 +0DF8 +1508 +21F8 +4108 +0000 +ENDCHAR +STARTCHAR U+5A5B +ENCODING 23131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2010 +25FF +2400 +7EFE +2482 +2482 +24FE +2438 +2854 +1092 +2911 +4450 +4420 +0000 +0000 +ENDCHAR +STARTCHAR U+5A5C +ENCODING 23132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F80 +247F +3F22 +2114 +3F08 +2414 +3FA2 +0220 +7FFE +0220 +0140 +0080 +0140 +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+5A5D +ENCODING 23133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2010 +21FF +7F01 +2501 +247C +2410 +2410 +2410 +249E +1890 +18D0 +24B0 +431F +0000 +0000 +ENDCHAR +STARTCHAR U+5A5E +ENCODING 23134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FE +1020 +FC20 +27FF +2484 +24CC +6448 +4DFE +4820 +F820 +17FF +3020 +6020 +C020 +ENDCHAR +STARTCHAR U+5A5F +ENCODING 23135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +2111 +2511 +25FF +7F11 +2511 +257D +2545 +2545 +297D +1145 +2901 +45FF +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+5A60 +ENCODING 23136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2010 +21FF +2501 +2501 +7EFE +2482 +2482 +24FE +2480 +28FE +1082 +2882 +44FE +0000 +0000 +ENDCHAR +STARTCHAR U+5A62 +ENCODING 23138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +08F8 +08A8 +7EF8 +12A8 +12A8 +12F8 +3A50 +2490 +07FC +0A10 +1010 +2010 +0000 +ENDCHAR +STARTCHAR U+5A63 +ENCODING 23139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2101 +2129 +2129 +2129 +FDEF +2501 +2501 +25FF +6501 +4D01 +49EF +F929 +1529 +3329 +6229 +C601 +ENDCHAR +STARTCHAR U+5A64 +ENCODING 23140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +2111 +2911 +297D +7D11 +297D +2901 +297D +2945 +2945 +297D +1101 +2905 +4602 +0000 +0000 +ENDCHAR +STARTCHAR U+5A65 +ENCODING 23141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +103F +1020 +FDFE +2502 +2502 +25FE +6502 +4D02 +49FE +FC20 +17FF +3020 +6020 +C020 +ENDCHAR +STARTCHAR U+5A66 +ENCODING 23142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1010 +11F0 +7C10 +25F0 +2400 +27FC +7A44 +4BF8 +0E48 +1248 +2270 +4040 +0000 +ENDCHAR +STARTCHAR U+5A67 +ENCODING 23143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1024 +13FE +1020 +FDFC +2420 +27FE +2400 +25FC +4504 +29FC +1104 +29FC +4504 +8514 +0108 +ENDCHAR +STARTCHAR U+5A69 +ENCODING 23145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2092 +2492 +24FE +7E00 +24FF +2480 +24BE +2488 +24FF +2888 +1088 +2908 +4408 +0000 +0000 +ENDCHAR +STARTCHAR U+5A6A +ENCODING 23146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +1C70 +1A70 +2AA8 +4924 +0820 +0200 +7FFC +0440 +0F80 +0360 +3C10 +0000 +ENDCHAR +STARTCHAR U+5A6C +ENCODING 23148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +11C8 +1124 +7E24 +2418 +25E0 +2420 +7820 +08F8 +0C20 +1020 +27FC +4000 +0000 +ENDCHAR +STARTCHAR U+5A6D +ENCODING 23149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1048 +1048 +FC48 +25CE +2502 +2502 +6502 +4DCE +4848 +FC48 +1448 +3048 +61FF +C000 +ENDCHAR +STARTCHAR U+5A70 +ENCODING 23152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2028 +2028 +24FE +24AA +7EAA +24FE +24AA +24AA +24AA +25FF +2400 +1844 +1882 +6701 +0000 +0000 +ENDCHAR +STARTCHAR U+5A74 +ENCODING 23156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3EFC +2288 +2AA8 +2AA8 +2AA8 +1450 +6288 +0204 +FFFE +0420 +0820 +0440 +0380 +0460 +3810 +ENDCHAR +STARTCHAR U+5A75 +ENCODING 23157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +1050 +11FC +FD24 +2524 +25FC +2524 +2524 +45FC +2820 +13FE +2820 +4420 +8420 +0020 +ENDCHAR +STARTCHAR U+5A76 +ENCODING 23158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +13FE +1222 +FC20 +25FC +2524 +2524 +25FC +4524 +2924 +11FC +2924 +4420 +8020 +0020 +ENDCHAR +STARTCHAR U+5A77 +ENCODING 23159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +1000 +FDFC +2504 +25FC +2400 +27FE +4A02 +29FC +1020 +2820 +4420 +84A0 +0040 +ENDCHAR +STARTCHAR U+5A78 +ENCODING 23160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FE +2082 +28FE +2882 +7CFE +2800 +29FF +2840 +28FF +2B49 +2849 +1049 +2891 +4406 +0000 +0000 +ENDCHAR +STARTCHAR U+5A7A +ENCODING 23162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7F44 +127E +0C88 +7F50 +1520 +2450 +4C8E +0204 +FFFE +0420 +0820 +0440 +0380 +0460 +3810 +ENDCHAR +STARTCHAR U+5A7B +ENCODING 23163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +1010 +FC10 +25FF +2545 +256D +6529 +4D7D +4911 +FDFF +1511 +3111 +6111 +C117 +ENDCHAR +STARTCHAR U+5A7C +ENCODING 23164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +21FF +2844 +2810 +7C10 +29FF +2820 +2840 +28FE +2942 +2A42 +1042 +287E +4442 +0000 +0000 +ENDCHAR +STARTCHAR U+5A7D +ENCODING 23165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21EF +2121 +2521 +25EF +7F00 +2500 +25EF +2509 +2509 +25E9 +150A +0904 +150A +6311 +0000 +0000 +ENDCHAR +STARTCHAR U+5A7E +ENCODING 23166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1070 +10D8 +118C +FF77 +2400 +25E2 +252A +652A +4DEA +492A +FD2A +15E2 +3122 +6122 +C16E +ENDCHAR +STARTCHAR U+5A7F +ENCODING 23167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1048 +1150 +7D78 +25C0 +263C +25F8 +7508 +49F8 +0D08 +15F8 +2108 +4118 +0000 +ENDCHAR +STARTCHAR U+5A83 +ENCODING 23171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FE +2024 +2418 +24FF +7E51 +2492 +2430 +2410 +25FF +2438 +2854 +1092 +2911 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+5A84 +ENCODING 23172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +2044 +24FE +2410 +7EFE +2410 +25FF +2410 +2410 +25FF +2828 +1044 +2882 +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+5A8A +ENCODING 23178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2102 +2084 +2448 +25FF +7E00 +25E5 +2525 +2525 +25E5 +2525 +29E5 +1121 +2921 +4563 +0000 +0000 +ENDCHAR +STARTCHAR U+5A8B +ENCODING 23179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FE +1020 +FDFC +2440 +27FF +2484 +6502 +4EFD +4884 +FC84 +14FC +3084 +6084 +C0FC +ENDCHAR +STARTCHAR U+5A8C +ENCODING 23180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +2044 +25EF +2444 +7E44 +2400 +25FF +2511 +2511 +25FF +2911 +1111 +29FF +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+5A8E +ENCODING 23182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2011 +24FE +2414 +7E18 +25FF +2420 +247E +24C2 +297E +1042 +2842 +447E +4442 +0000 +0000 +ENDCHAR +STARTCHAR U+5A8F +ENCODING 23183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2111 +2511 +25FF +7E00 +25FF +2440 +2480 +25FF +2529 +2929 +1129 +2929 +4502 +0000 +0000 +ENDCHAR +STARTCHAR U+5A90 +ENCODING 23184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FF7E +8802 +AE02 +A27E +AE41 +8841 +FF3F +0200 +FFFF +0410 +0830 +3F60 +01C0 +0770 +7C1E +ENDCHAR +STARTCHAR U+5A92 +ENCODING 23186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +13FC +1090 +7CF0 +2490 +24F0 +2440 +7FFC +48E0 +0D50 +1648 +2444 +4040 +0000 +ENDCHAR +STARTCHAR U+5A93 +ENCODING 23187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1040 +11FE +1102 +FDFE +2502 +2502 +25FE +6400 +4DFE +4820 +FC20 +14FC +3020 +6020 +C3FF +ENDCHAR +STARTCHAR U+5A94 +ENCODING 23188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2002 +21FF +2820 +2840 +7DFF +2929 +2929 +2939 +2929 +2929 +2939 +1129 +2929 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5A95 +ENCODING 23189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2038 +2044 +2482 +257D +7E00 +24FE +2482 +24FE +2444 +25FF +2844 +1044 +2884 +4704 +0000 +0000 +ENDCHAR +STARTCHAR U+5A96 +ENCODING 23190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13FF +1084 +FCA4 +2420 +25FE +2522 +6522 +4D22 +4BFF +F848 +1448 +30CC +6186 +C303 +ENDCHAR +STARTCHAR U+5A97 +ENCODING 23191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2010 +25FF +2501 +2501 +7EFE +2400 +24FE +2482 +24FE +2882 +10FE +2800 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5A99 +ENCODING 23193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200A +2009 +2008 +23FF +FA08 +2AE8 +2A09 +6A49 +4BFB +5AAA +52AE +F2E4 +2A55 +2A8D +6217 +C462 +ENDCHAR +STARTCHAR U+5A9A +ENCODING 23194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +1248 +7FF8 +2A00 +2AF8 +2A88 +6AF8 +1288 +1AF8 +1488 +24F8 +4888 +0000 +ENDCHAR +STARTCHAR U+5A9B +ENCODING 23195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +101C +13E4 +1248 +1130 +7FFC +2440 +27FC +2440 +74F8 +48C8 +0930 +1630 +24C8 +4304 +0000 +ENDCHAR +STARTCHAR U+5A9C +ENCODING 23196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +103F +1020 +FDFE +2502 +2502 +25FE +6502 +4D02 +49FE +FD02 +1502 +31FE +6048 +C387 +ENDCHAR +STARTCHAR U+5A9D +ENCODING 23197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E49 +0849 +7F2A +2A08 +4914 +0863 +0200 +7FFF +0220 +0220 +0140 +0080 +0140 +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+5A9E +ENCODING 23198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +10FE +1082 +FC82 +24FE +2400 +25FF +6410 +4C10 +4910 +FD1E +1510 +3190 +62F0 +C23F +ENDCHAR +STARTCHAR U+5A9F +ENCODING 23199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +1124 +13FF +1124 +FD24 +253C +2500 +25FE +6420 +4FFF +48A8 +FCA8 +15AC +3126 +6323 +C020 +ENDCHAR +STARTCHAR U+5AA0 +ENCODING 23200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +23FF +2080 +F9FE +2B10 +28FF +6800 +49FE +5902 +51FE +F102 +29FE +2902 +6102 +C10E +ENDCHAR +STARTCHAR U+5AA2 +ENCODING 23202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +117D +FD01 +257D +2400 +2400 +64FE +4C82 +48FE +FC82 +14FE +3082 +6082 +C0FE +ENDCHAR +STARTCHAR U+5AA4 +ENCODING 23204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1492 +7E92 +24FE +2492 +2492 +24FE +4882 +6810 +580A +1442 +1545 +2545 +227C +4200 +ENDCHAR +STARTCHAR U+5AA5 +ENCODING 23205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +20FE +2880 +28FE +7C82 +28FE +2880 +28FF +28A9 +29A9 +2AFF +10A9 +28A9 +4483 +0000 +0000 +ENDCHAR +STARTCHAR U+5AA6 +ENCODING 23206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FE +2092 +28FE +2892 +7CFE +2800 +28FE +2882 +28FE +2882 +28FE +1082 +2882 +4506 +0000 +0000 +ENDCHAR +STARTCHAR U+5AA7 +ENCODING 23207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +109E +1092 +FC92 +25FF +2501 +2501 +657D +4D45 +4945 +FD45 +157D +3101 +6101 +C107 +ENDCHAR +STARTCHAR U+5AA9 +ENCODING 23209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +208F +2089 +2889 +2BE9 +7C8F +2889 +2889 +2BE9 +2A2F +2A29 +2A29 +1229 +2BE9 +4413 +0000 +0000 +ENDCHAR +STARTCHAR U+5AAA +ENCODING 23210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +2208 +2208 +FBF8 +4A08 +4A08 +4BF8 +4800 +97FC +54A4 +24A4 +24A4 +54A4 +8FFE +0000 +ENDCHAR +STARTCHAR U+5AAC +ENCODING 23212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10BE +10A2 +11A2 +FD22 +253E +2708 +2708 +677F +4D08 +491C +FD1C +152A +312A +6149 +C108 +ENDCHAR +STARTCHAR U+5AAE +ENCODING 23214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2038 +2044 +2482 +2501 +7E7C +2400 +25F1 +2515 +25F5 +2515 +25F5 +1911 +2511 +4333 +0000 +0000 +ENDCHAR +STARTCHAR U+5AAF +ENCODING 23215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2850 +29FC +2844 +7C48 +287E +2842 +2884 +29FF +2A01 +2955 +1155 +2801 +440E +0000 +0000 +ENDCHAR +STARTCHAR U+5AB0 +ENCODING 23216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +20FF +2891 +7D95 +28FD +2821 +284E +2880 +28FF +2921 +2AA5 +10FD +2821 +444E +0000 +0000 +ENDCHAR +STARTCHAR U+5AB1 +ENCODING 23217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +107C +10C4 +13AC +FC58 +2430 +24E0 +2780 +64FE +4D20 +4820 +FFFF +1420 +3122 +6122 +C1FE +ENDCHAR +STARTCHAR U+5AB2 +ENCODING 23218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1044 +11FE +1154 +FD24 +2554 +2504 +25FC +2510 +4512 +29D4 +1118 +2912 +4552 +818E +0000 +ENDCHAR +STARTCHAR U+5AB3 +ENCODING 23219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1084 +11FE +1104 +FD04 +25FC +2504 +25FC +2504 +4504 +29FC +1040 +2920 +472C +850A +00F8 +ENDCHAR +STARTCHAR U+5AB4 +ENCODING 23220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2410 +7EFE +2400 +24FE +2482 +24FE +2420 +2441 +28CA +1344 +2852 +44E1 +0000 +0000 +ENDCHAR +STARTCHAR U+5AB5 +ENCODING 23221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A48 +4950 +4BFC +4840 +7FFE +48A0 +4910 +4A4E +7C44 +4FFE +4890 +4910 +48E0 +A918 +1604 +ENDCHAR +STARTCHAR U+5AB6 +ENCODING 23222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +2044 +25FF +2444 +7E00 +24FF +2442 +247E +2442 +247E +2842 +10FF +2802 +4602 +0000 +0000 +ENDCHAR +STARTCHAR U+5AB7 +ENCODING 23223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FF +2080 +28BE +2880 +7CFF +28A9 +28A6 +292A +2871 +2804 +29FF +1044 +2824 +440C +0000 +0000 +ENDCHAR +STARTCHAR U+5AB8 +ENCODING 23224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +1124 +11FC +FC20 +27FE +2400 +2424 +25FE +4524 +2924 +11FC +2820 +4424 +85FE +0002 +ENDCHAR +STARTCHAR U+5AB9 +ENCODING 23225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +218F +2505 +2545 +7F25 +2559 +2583 +2400 +25FF +2911 +11FF +2911 +4511 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5ABA +ENCODING 23226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2548 +2548 +255F +FFD2 +2832 +2802 +2FEA +6A8A +4A8E +5A84 +F284 +2AEE +62CA +469B +C411 +ENDCHAR +STARTCHAR U+5ABB +ENCODING 23227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +3E7C +2244 +2A47 +FF80 +227E +2A22 +2A24 +2218 +4667 +0400 +FFFF +0810 +1F20 +01F8 +7F0E +ENDCHAR +STARTCHAR U+5ABC +ENCODING 23228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1148 +1168 +7D98 +2508 +25F8 +2400 +6BF8 +1AA8 +0EA8 +12A8 +2FFC +4000 +0000 +ENDCHAR +STARTCHAR U+5ABD +ENCODING 23229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +1120 +1120 +7DF8 +2520 +25F8 +2520 +75FC +0854 +0D2C +16AC +2284 +4418 +0000 +ENDCHAR +STARTCHAR U+5ABE +ENCODING 23230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +09FC +0850 +08F8 +7E50 +13FC +1220 +12F8 +3CA8 +24F8 +06A8 +0BFC +1088 +2098 +0000 +ENDCHAR +STARTCHAR U+5ABF +ENCODING 23231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1040 +11FE +1122 +FD22 +25FE +2522 +2522 +65FE +4C50 +4854 +FC55 +14DF +3090 +6191 +C10F +ENDCHAR +STARTCHAR U+5AC0 +ENCODING 23232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +24FE +2410 +7FFF +2444 +2486 +2579 +2410 +25FF +2854 +1092 +2911 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+5AC1 +ENCODING 23233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +1208 +7FFC +2440 +24E4 +2768 +78B0 +4B70 +0CA8 +1724 +2020 +40C0 +0000 +ENDCHAR +STARTCHAR U+5AC2 +ENCODING 23234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10C0 +1358 +1248 +1248 +7B58 +2A48 +2A48 +2BF8 +2840 +73F8 +1110 +18A0 +20E0 +471C +0000 +ENDCHAR +STARTCHAR U+5AC4 +ENCODING 23236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1108 +1510 +7F7E +2542 +257E +2542 +497E +4910 +6910 +5152 +1992 +2911 +2A11 +4230 +ENDCHAR +STARTCHAR U+5AC6 +ENCODING 23238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +1101 +FD45 +24C6 +2593 +2438 +646C +4CC6 +4983 +F8FE +1482 +3082 +6082 +C0FE +ENDCHAR +STARTCHAR U+5AC7 +ENCODING 23239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +2101 +297D +2844 +7C7C +2844 +287C +2844 +2810 +2810 +29FF +1044 +2882 +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+5AC8 +ENCODING 23240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2952 +2A54 +1428 +2244 +0000 +7FFE +4002 +4202 +0200 +7FFE +0410 +0810 +1F20 +01F0 +3F1C +ENDCHAR +STARTCHAR U+5AC9 +ENCODING 23241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +11FC +1540 +7B40 +2B78 +29A0 +2920 +7BFC +5520 +1A30 +1250 +2488 +4904 +0000 +ENDCHAR +STARTCHAR U+5ACA +ENCODING 23242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2810 +29FF +7C10 +29FF +2810 +2822 +29FC +2809 +29FF +1092 +2911 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+5ACB +ENCODING 23243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +1088 +1088 +7FB8 +2A20 +2A20 +2BB8 +2998 +72A8 +1198 +1AA8 +2088 +4330 +0000 +ENDCHAR +STARTCHAR U+5ACC +ENCODING 23244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1108 +1090 +13FC +10A0 +7DF8 +24A8 +27FC +24A8 +79F8 +48A0 +0DB0 +16A8 +24A4 +40A0 +0000 +ENDCHAR +STARTCHAR U+5ACD +ENCODING 23245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +20F8 +2421 +2512 +7E94 +2400 +2440 +258F +2501 +2501 +29EF +1101 +2901 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5ACF +ENCODING 23247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +210F +23E9 +222B +FA2A +2BEE +2A2C +2A2A +6BE9 +4A09 +5A49 +F249 +13AD +362B +6C28 +C008 +ENDCHAR +STARTCHAR U+5AD0 +ENCODING 23248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +17C8 +1548 +1548 +7FFC +2D54 +2FD4 +2914 +2FD4 +7178 +1248 +1A48 +2454 +48E4 +0000 +ENDCHAR +STARTCHAR U+5AD2 +ENCODING 23250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +201C +23E0 +2124 +20A8 +FBFE +4A42 +4C44 +4BFE +4880 +8880 +51FC +2288 +2450 +5020 +88D8 +0306 +ENDCHAR +STARTCHAR U+5AD4 +ENCODING 23252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +13FE +1202 +FC1C +24E0 +2480 +24FC +2488 +4488 +2888 +13FE +2800 +4488 +8506 +0202 +ENDCHAR +STARTCHAR U+5AD5 +ENCODING 23253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +2920 +297E +7D08 +297F +2914 +2922 +29FF +2800 +2AA2 +2A91 +2A89 +1082 +6CFE +0000 +0000 +ENDCHAR +STARTCHAR U+5AD6 +ENCODING 23254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +10A0 +13F8 +7AA8 +2AA8 +2BF8 +2800 +29F0 +7000 +17FC +1950 +2248 +40C0 +0000 +ENDCHAR +STARTCHAR U+5AD7 +ENCODING 23255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1200 +12F0 +7A90 +2AF0 +2A00 +2BF8 +2B68 +7368 +13F8 +1A00 +23FC +4200 +0000 +ENDCHAR +STARTCHAR U+5AD8 +ENCODING 23256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1124 +11FC +FD24 +25FC +2440 +2484 +25F8 +4420 +2848 +11FC +28A8 +4526 +8622 +0060 +ENDCHAR +STARTCHAR U+5AD9 +ENCODING 23257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2110 +293F +2BC0 +7D1F +2905 +29C4 +2944 +2956 +2954 +2A54 +105C +2854 +45A3 +0000 +0000 +ENDCHAR +STARTCHAR U+5ADA +ENCODING 23258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +1084 +10FC +1084 +FCFC +2400 +25FF +2529 +65FF +4C00 +4BFF +F8C6 +146C +3038 +606C +C3C7 +ENDCHAR +STARTCHAR U+5ADB +ENCODING 23259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F3C +5025 +5F47 +6400 +5F3E +4A14 +5108 +7F77 +0400 +7FFF +0220 +0140 +0080 +3F7E +0000 +0000 +ENDCHAR +STARTCHAR U+5ADC +ENCODING 23260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FC +1088 +1050 +FFFE +2400 +25FC +2504 +25FC +4504 +29FC +1020 +2BFE +4420 +8420 +0020 +ENDCHAR +STARTCHAR U+5ADD +ENCODING 23261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2510 +257E +7F12 +25FF +2512 +257E +2512 +25F4 +2938 +1154 +2A92 +4511 +0000 +0000 +ENDCHAR +STARTCHAR U+5ADE +ENCODING 23262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2510 +257E +7FFF +2512 +257E +2510 +25FF +2591 +29FF +12FF +2891 +4492 +0000 +0000 +ENDCHAR +STARTCHAR U+5ADF +ENCODING 23263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +2100 +2924 +297E +7D24 +2910 +297F +2910 +293E +2962 +293E +1122 +2900 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5AE0 +ENCODING 23264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3F24 +043E +7FE8 +0E10 +1528 +2444 +3FFE +2100 +2104 +3FFE +2210 +2620 +41C0 +4630 +9808 +ENDCHAR +STARTCHAR U+5AE1 +ENCODING 23265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +1110 +78A0 +2BF8 +2A48 +2BF8 +2A48 +7AE8 +5AA8 +16E8 +22A8 +4218 +0000 +ENDCHAR +STARTCHAR U+5AE2 +ENCODING 23266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +0842 +3E7A +087A +7F42 +147E +2225 +4547 +7FFF +0220 +0140 +0080 +0140 +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+5AE3 +ENCODING 23267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +1020 +10B8 +7CA0 +27FC +2480 +24F8 +7880 +08FC +0D54 +16AC +22AC +4418 +0000 +ENDCHAR +STARTCHAR U+5AE5 +ENCODING 23269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FF +1020 +11FE +FD22 +25FE +2522 +25FE +6422 +4DFF +4805 +FDFF +1404 +3044 +6024 +C00C +ENDCHAR +STARTCHAR U+5AE6 +ENCODING 23270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1150 +13FC +7A08 +2DF0 +2910 +29F0 +2840 +73F8 +1A48 +1248 +2270 +4040 +0000 +ENDCHAR +STARTCHAR U+5AE8 +ENCODING 23272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +21FF +2844 +287C +2810 +7CFE +2892 +28FE +2810 +28FE +2810 +11FF +2844 +4482 +0000 +0000 +ENDCHAR +STARTCHAR U+5AE9 +ENCODING 23273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1110 +17D0 +793C +2FE8 +2D68 +2D68 +2FD8 +7398 +1350 +1D58 +2928 +4144 +0000 +ENDCHAR +STARTCHAR U+5AEA +ENCODING 23274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13DE +1042 +114A +FCC6 +254A +2422 +2470 +65DC +4F07 +4820 +F9C8 +1432 +31C4 +6018 +C1E0 +ENDCHAR +STARTCHAR U+5AEB +ENCODING 23275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FE +1088 +FC88 +25FC +2504 +25FC +2504 +45FC +2820 +13FE +2820 +4450 +848E +0304 +ENDCHAR +STARTCHAR U+5AEC +ENCODING 23276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +21FF +2900 +2924 +7D24 +29FF +2924 +2924 +2924 +293C +2A00 +10AA +28AA +4515 +0000 +0000 +ENDCHAR +STARTCHAR U+5AED +ENCODING 23277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +201C +24FF +2491 +7EFE +2490 +249E +2482 +24FC +24AA +28FF +1108 +2808 +4418 +0000 +0000 +ENDCHAR +STARTCHAR U+5AEE +ENCODING 23278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1010 +11FF +FD11 +2555 +2511 +2454 +6400 +4CFE +4800 +FDFF +1420 +307E +6002 +C00E +ENDCHAR +STARTCHAR U+5AF1 +ENCODING 23281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1028 +11FC +1020 +FD24 +24A8 +27FE +2400 +25FC +4504 +2974 +1154 +2974 +4504 +85FC +0104 +ENDCHAR +STARTCHAR U+5AF3 +ENCODING 23283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4920 +2A3F +7F62 +4914 +5D08 +6B14 +4563 +0410 +7FFF +0220 +0140 +0080 +0140 +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+5AF4 +ENCODING 23284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2410 +25FF +7F01 +25FF +2410 +25FF +2444 +25FF +2810 +11FF +2810 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+5AF5 +ENCODING 23285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11FF +13AA +FCAA +24AA +27FF +24AA +64AA +4CAA +4BFF +F800 +1400 +30AA +61AB +C129 +ENDCHAR +STARTCHAR U+5AF6 +ENCODING 23286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +1190 +13FE +FD10 +2510 +25FE +2510 +65FE +4D10 +4910 +F9FF +1400 +3152 +635B +C249 +ENDCHAR +STARTCHAR U+5AF7 +ENCODING 23287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23D0 +227F +2A90 +2B1F +7EA4 +2A5F +2A40 +2A5F +2A51 +2B5F +2A91 +121F +2A11 +4623 +0000 +0000 +ENDCHAR +STARTCHAR U+5AF8 +ENCODING 23288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +2044 +21FF +2410 +25FF +7E10 +25FF +2444 +25FF +2444 +29FF +1101 +2901 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5AF9 +ENCODING 23289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +21FF +2044 +247C +2400 +7FFF +2400 +24FE +2492 +24FE +2892 +10FE +2882 +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+5AFA +ENCODING 23290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +13B8 +7AA8 +2BB8 +2A08 +2AE8 +2AA8 +72E8 +12A8 +1AE8 +22A8 +4378 +0000 +ENDCHAR +STARTCHAR U+5AFB +ENCODING 23291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +13B8 +7AA8 +2BB8 +2A48 +2A48 +2BF8 +72E8 +12D8 +1B58 +2248 +4258 +0000 +ENDCHAR +STARTCHAR U+5AFD +ENCODING 23293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +1048 +FD4A +2484 +27FF +2484 +64FC +4C84 +48FC +F820 +1524 +3126 +6323 +C060 +ENDCHAR +STARTCHAR U+5AFF +ENCODING 23295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +20FE +25FF +2412 +7EFE +2410 +24FE +25FF +24FE +2492 +28FE +1092 +28FE +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B00 +ENCODING 23296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2018 +21F0 +2244 +2128 +FBFC +2A04 +2A04 +6BFE +4A02 +5A02 +53FF +FA01 +2A15 +2555 +6343 +C20E +ENDCHAR +STARTCHAR U+5B01 +ENCODING 23297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10E4 +1028 +1171 +10DA +FD8C +2776 +2603 +65FC +4504 +4D04 +49FC +FC88 +1488 +30D8 +6050 +C3FF +ENDCHAR +STARTCHAR U+5B02 +ENCODING 23298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +208A +23E9 +2948 +2948 +7FFF +2808 +2BE8 +2A2A +2BEC +2A28 +1235 +2BE3 +4401 +0000 +0000 +ENDCHAR +STARTCHAR U+5B03 +ENCODING 23299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +04FF +0820 +127E +2442 +087E +1242 +247E +0842 +107E +24A1 +3FFE +0220 +01C0 +0E38 +0000 +0000 +ENDCHAR +STARTCHAR U+5B05 +ENCODING 23301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +1088 +7C00 +27FE +2524 +2524 +27FF +4924 +4924 +6BFE +5020 +1820 +17FF +2420 +4420 +ENDCHAR +STARTCHAR U+5B07 +ENCODING 23303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +20FE +2492 +24FE +7E10 +25FF +24FE +2482 +24FE +2482 +28FE +1082 +28FE +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+5B08 +ENCODING 23304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FE +1020 +13FF +FC00 +2484 +27DF +2484 +64E4 +4F9F +4800 +FBFF +1488 +3089 +6189 +C707 +ENDCHAR +STARTCHAR U+5B09 +ENCODING 23305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +13F8 +7DF8 +2508 +25F8 +2490 +7BFC +4800 +0DF8 +1508 +21F8 +4108 +0000 +ENDCHAR +STARTCHAR U+5B0B +ENCODING 23307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +13B8 +7C00 +2BF8 +2A48 +2BF8 +2A48 +73F8 +1840 +17FC +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+5B0C +ENCODING 23308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +11E0 +1040 +13F8 +7CA0 +25F0 +26A8 +24E4 +7BF8 +0A08 +0EE8 +12A8 +22E8 +4298 +0000 +ENDCHAR +STARTCHAR U+5B0F +ENCODING 23311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2002 +21FC +2492 +2454 +7FFF +2454 +2492 +2511 +24FE +2492 +28FE +1092 +28FE +4482 +0000 +0000 +ENDCHAR +STARTCHAR U+5B10 +ENCODING 23312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2028 +2844 +2882 +7D7D +2800 +29EF +2929 +29EF +2800 +2884 +2884 +114A +6E31 +0000 +0000 +ENDCHAR +STARTCHAR U+5B13 +ENCODING 23315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +23E8 +2A3F +2BE2 +7E22 +2BE2 +288A +2BEA +290A +29EA +292A +2924 +112A +6E71 +0000 +0000 +ENDCHAR +STARTCHAR U+5B14 +ENCODING 23316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +23E4 +2854 +289F +7FE4 +2AA4 +2AAE +2BE4 +2944 +295F +2940 +1150 +2948 +467F +0000 +0000 +ENDCHAR +STARTCHAR U+5B16 +ENCODING 23318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EF8 +2250 +3E50 +21FC +3E20 +32F8 +5E20 +0220 +7FFC +0440 +0F80 +0360 +3C10 +0000 +ENDCHAR +STARTCHAR U+5B17 +ENCODING 23319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +1000 +11FC +FD54 +2574 +2554 +25FC +2400 +45FC +2904 +11FC +2904 +45FC +8400 +03FE +ENDCHAR +STARTCHAR U+5B19 +ENCODING 23321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +1124 +FD24 +26AA +2420 +27FF +6400 +4DFE +4902 +FD7A +154A +317A +6102 +C1FE +ENDCHAR +STARTCHAR U+5B1A +ENCODING 23322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2944 +29FF +7D28 +29FE +292A +29FF +292A +29FE +2A6C +10AA +2929 +4428 +0000 +0000 +ENDCHAR +STARTCHAR U+5B1B +ENCODING 23323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +10AA +10AA +FCFE +2400 +25FF +2400 +64FE +4C82 +48FE +FC29 +146A +31CC +6066 +C0C3 +ENDCHAR +STARTCHAR U+5B1D +ENCODING 23325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FE +1182 +10FE +FC82 +24FE +2480 +24FE +6480 +4CFF +4821 +FDFD +1469 +30D1 +6149 +C065 +ENDCHAR +STARTCHAR U+5B1E +ENCODING 23326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2028 +21FF +282A +28FC +7E10 +29FF +28FE +2892 +28FE +28FE +2810 +10FE +2810 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B20 +ENCODING 23328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +207C +2044 +287C +2800 +7DEF +2929 +29EF +2800 +2810 +29FF +2854 +2892 +1111 +6C10 +0000 +0000 +ENDCHAR +STARTCHAR U+5B21 +ENCODING 23329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +11F8 +1122 +1094 +FDFF +2511 +25AA +24A5 +653C +4C40 +48FE +FD82 +144C +3038 +60EE +C383 +ENDCHAR +STARTCHAR U+5B22 +ENCODING 23330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +11A8 +12A4 +7FFC +24A0 +25F8 +24A0 +7BFC +48C8 +0FB0 +1490 +20C8 +4304 +0000 +ENDCHAR +STARTCHAR U+5B23 +ENCODING 23331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +25FF +252B +2565 +7EBE +2400 +24FE +24AA +24AA +25FF +2800 +10FE +2810 +4430 +0000 +0000 +ENDCHAR +STARTCHAR U+5B24 +ENCODING 23332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +47FE +4488 +F488 +57FE +5488 +55DC +96AA +5440 +2520 +2448 +5484 +89FC +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+5B25 +ENCODING 23333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11EF +1021 +11EF +FC21 +25EF +2444 +2488 +65FF +4F10 +49FE +FD10 +15FE +3110 +6110 +C1FF +ENDCHAR +STARTCHAR U+5B26 +ENCODING 23334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2010 +24FE +25FF +7E01 +24FF +2410 +25FF +25FF +2402 +15FF +092A +75E6 +0000 +0000 +ENDCHAR +STARTCHAR U+5B27 +ENCODING 23335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +20FE +2412 +25FF +7E12 +24FE +2410 +25FF +2529 +2400 +28FE +10AA +28AA +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B28 +ENCODING 23336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +29FF +2800 +2842 +7CA5 +29EF +2842 +28A5 +29EF +2800 +2952 +2949 +1042 +6C7E +0000 +0000 +ENDCHAR +STARTCHAR U+5B2A +ENCODING 23338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1208 +13F8 +7D50 +2660 +24F8 +2788 +24F8 +78F8 +0888 +14F8 +20C8 +4304 +0000 +ENDCHAR +STARTCHAR U+5B2C +ENCODING 23340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +13FC +7F58 +2B58 +2840 +2FFC +2840 +73F8 +5AA8 +16A8 +22A8 +42B8 +0000 +ENDCHAR +STARTCHAR U+5B2D +ENCODING 23341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1054 +1092 +FDFF +2511 +25BB +2555 +65BB +4D11 +4911 +FDBB +1555 +31BB +6111 +C113 +ENDCHAR +STARTCHAR U+5B2E +ENCODING 23342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2F8C +2A8A +2FFF +2F88 +2888 +2F88 +4894 +0FA2 +0AE1 +3FFE +0140 +0080 +0770 +0000 +0000 +ENDCHAR +STARTCHAR U+5B2F +ENCODING 23343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +20FE +207C +24FE +2482 +7EFE +25FF +257D +2424 +24FC +2410 +14FE +0810 +75FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B30 +ENCODING 23344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2288 +3EF8 +1550 +7FFC +0420 +0F40 +01E0 +3E18 +0000 +ENDCHAR +STARTCHAR U+5B32 +ENCODING 23346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7D7C +5554 +5554 +7FFC +56D4 +7EFC +1290 +7FFC +1514 +1594 +26A4 +2624 +4C4C +0000 +ENDCHAR +STARTCHAR U+5B34 +ENCODING 23348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFE +2000 +3FF8 +0000 +1FF0 +1010 +1FF0 +7938 +4928 +7FE8 +4AB8 +7AA8 +492A +4EEA +9846 +ENDCHAR +STARTCHAR U+5B36 +ENCODING 23350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +11F0 +1110 +11F0 +7DF0 +2510 +25F0 +27F8 +7A48 +0BF8 +0FF8 +17FC +2110 +4610 +0000 +ENDCHAR +STARTCHAR U+5B37 +ENCODING 23351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +4024 +47FE +4488 +F488 +57FE +5488 +55DC +56AA +9440 +5490 +2520 +2448 +5484 +89FC +1004 +ENDCHAR +STARTCHAR U+5B38 +ENCODING 23352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13FF +1201 +123D +FDE4 +24A8 +27FF +2470 +64A8 +4F27 +49FE +FD22 +15FE +3122 +6122 +C1FE +ENDCHAR +STARTCHAR U+5B3C +ENCODING 23356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2101 +2671 +2451 +2D55 +7E15 +28E5 +2945 +2A25 +2FF5 +2885 +2BE5 +12A1 +29C1 +47F3 +0000 +0000 +ENDCHAR +STARTCHAR U+5B3D +ENCODING 23357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FD +2155 +29FD +7DFF +2900 +297F +2955 +297F +2900 +29FF +2810 +11FF +2844 +4482 +0000 +0000 +ENDCHAR +STARTCHAR U+5B3E +ENCODING 23358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +113C +17D4 +1114 +7FEC +2D7C +2D64 +2FFC +2B24 +73BC +1564 +193C +2918 +4164 +0000 +ENDCHAR +STARTCHAR U+5B3F +ENCODING 23359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +2044 +29FF +2844 +287C +7C00 +28BA +28AA +29AB +28AA +29BB +1000 +294A +4549 +0000 +0000 +ENDCHAR +STARTCHAR U+5B40 +ENCODING 23360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +13FC +7B58 +2D50 +2978 +2948 +2FF8 +7348 +13F8 +1D48 +2978 +4148 +0000 +ENDCHAR +STARTCHAR U+5B41 +ENCODING 23361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFC +0100 +7FFE +4102 +5D7A +4102 +1D78 +0000 +7BDE +4A52 +7BDE +0100 +7FFE +0440 +0380 +3E78 +ENDCHAR +STARTCHAR U+5B43 +ENCODING 23363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +13B8 +12A8 +7BB8 +28A0 +2BF8 +29F0 +28A0 +77FC +11C8 +1F30 +29D0 +430C +0000 +ENDCHAR +STARTCHAR U+5B45 +ENCODING 23365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +12A0 +12B0 +13E8 +1568 +7820 +2FFC +2AA0 +2EE8 +2AA8 +76D0 +12D4 +1EAC +23CC +4E04 +0000 +ENDCHAR +STARTCHAR U+5B47 +ENCODING 23367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +228A +27DF +22AA +2BCF +7E8A +2BCF +2A8A +2BCF +29FC +2888 +2850 +1020 +2850 +478F +0000 +0000 +ENDCHAR +STARTCHAR U+5B48 +ENCODING 23368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +23FE +2890 +29FC +7F10 +29FC +29FC +2910 +29FC +2BFF +2A51 +12F9 +2B8D +46FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B4B +ENCODING 23371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23DF +2000 +23DF +2251 +FAD5 +2820 +2BFF +2A48 +6BFF +4A49 +5BFF +F288 +2AEE +6A88 +C6E9 +858F +ENDCHAR +STARTCHAR U+5B4C +ENCODING 23372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +47E8 +D01A +23C4 +4809 +FBDF +2004 +ABD5 +AA55 +23C4 +0200 +FFFF +0810 +1F20 +01F8 +7F0E +ENDCHAR +STARTCHAR U+5B4D +ENCODING 23373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21EF +2129 +21EF +25FF +7F04 +2574 +2527 +25FA +255A +2572 +2572 +1454 +08F2 +7419 +0000 +0000 +ENDCHAR +STARTCHAR U+5B4E +ENCODING 23374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FE +2102 +25FE +2598 +7F54 +25FE +25AA +25FE +25FF +25FD +25A5 +16FD +0821 +74FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B50 +ENCODING 23376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0020 +0040 +0080 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B51 +ENCODING 23377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0020 +0040 +0080 +0100 +0130 +01C0 +0F00 +7100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B52 +ENCODING 23378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FF8 +0030 +0060 +00C0 +0180 +0100 +01FF +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U+5B53 +ENCODING 23379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FF0 +0020 +0040 +1180 +0900 +0500 +0300 +0100 +0180 +0140 +0130 +010C +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+5B54 +ENCODING 23380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +0240 +0440 +0440 +0840 +0840 +0E40 +7840 +0840 +0840 +0844 +0844 +183C +0000 +ENDCHAR +STARTCHAR U+5B55 +ENCODING 23381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FC0 +0440 +0478 +0808 +0808 +1FE8 +2070 +4080 +0100 +7FFC +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B56 +ENCODING 23382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F7F +0606 +0C0C +0808 +0808 +0B08 +0EFF +3808 +E808 +0808 +0808 +0808 +0808 +0808 +3838 +ENDCHAR +STARTCHAR U+5B57 +ENCODING 23383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4FE0 +0040 +0180 +0100 +7FFC +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B58 +ENCODING 23384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +7FFC +0400 +05F8 +0810 +1820 +2840 +4FFC +0840 +0840 +0840 +08C0 +0000 +ENDCHAR +STARTCHAR U+5B59 +ENCODING 23385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7E20 +0220 +0420 +0820 +0AB0 +0CA8 +3924 +C926 +0A22 +0C20 +0820 +0820 +0820 +28A0 +1040 +ENDCHAR +STARTCHAR U+5B5A +ENCODING 23386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +01E0 +1E10 +1108 +1108 +2FE0 +0040 +0080 +0100 +7FFC +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B5B +ENCODING 23387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +3FFC +2008 +4FE0 +0040 +0080 +7FFC +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B5C +ENCODING 23388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7E80 +0280 +04FC +0910 +0990 +0E90 +7850 +0860 +0820 +0850 +0890 +0B08 +1C04 +0000 +ENDCHAR +STARTCHAR U+5B5D +ENCODING 23389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0110 +1FF0 +0120 +0140 +7FFC +0100 +07E0 +1840 +6080 +1FF8 +0080 +0080 +0180 +0000 +ENDCHAR +STARTCHAR U+5B5E +ENCODING 23390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +0060 +00C0 +7FFE +0080 +0080 +0080 +0380 +0000 +0180 +00C6 +2443 +2409 +6618 +C3F0 +ENDCHAR +STARTCHAR U+5B5F +ENCODING 23391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF0 +0060 +0180 +0100 +7FFC +0100 +0300 +1FF0 +1290 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5B62 +ENCODING 23394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +FC88 +05FC +0A08 +1008 +13E8 +1E28 +3228 +D3E8 +1208 +1228 +1212 +1202 +51FE +2000 +ENDCHAR +STARTCHAR U+5B63 +ENCODING 23395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +1F80 +0100 +7FFC +0380 +0540 +1930 +6FEC +0040 +0180 +7FFC +0100 +0100 +0700 +0000 +ENDCHAR +STARTCHAR U+5B64 +ENCODING 23396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3E30 +03D0 +0550 +0550 +0950 +0D50 +1950 +6950 +0968 +0A58 +0A78 +0F94 +1804 +0000 +ENDCHAR +STARTCHAR U+5B65 +ENCODING 23397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7FF8 +1248 +1250 +3C20 +06D0 +190C +6FE0 +00C0 +0100 +7FFC +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B66 +ENCODING 23398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0910 +0920 +3FFC +2008 +4FE0 +0040 +0080 +0100 +7FFC +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B68 +ENCODING 23400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +0060 +00C0 +7FFE +0080 +0080 +0380 +3C7C +0408 +0810 +0EFE +7810 +0810 +0810 +1830 +ENDCHAR +STARTCHAR U+5B69 +ENCODING 23401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +07FC +0840 +0A50 +1190 +10A0 +1468 +1848 +7090 +1130 +1048 +1184 +3604 +0000 +ENDCHAR +STARTCHAR U+5B6A +ENCODING 23402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0440 +1450 +244C +4444 +1FE0 +0080 +0104 +FFFE +0100 +0100 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+5B6B +ENCODING 23403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7C30 +07E0 +0850 +0B90 +10A0 +1048 +1BF4 +7044 +1150 +1148 +1244 +1444 +3040 +0000 +ENDCHAR +STARTCHAR U+5B6C +ENCODING 23404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0300 +0560 +1918 +6104 +1000 +10F8 +FE08 +2210 +2224 +23FE +1420 +0820 +14A0 +6240 +ENDCHAR +STARTCHAR U+5B6E +ENCODING 23406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FC20 +0BFF +1A01 +3201 +20FC +2000 +3800 +E3FF +2020 +2124 +2124 +2124 +2326 +2222 +E020 +ENDCHAR +STARTCHAR U+5B6F +ENCODING 23407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7EFE +4804 +7E4C +4238 +7E10 +4878 +7ECE +0000 +0FE0 +00C0 +0100 +FFFF +0100 +0100 +0700 +ENDCHAR +STARTCHAR U+5B70 +ENCODING 23408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0040 +3FF0 +2250 +3F50 +00D0 +3E50 +0470 +0EB4 +7894 +0914 +1A0C +0000 +ENDCHAR +STARTCHAR U+5B71 +ENCODING 23409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +13E0 +1040 +1FF8 +1080 +17FC +1108 +1310 +3EFC +2210 +4630 +0000 +ENDCHAR +STARTCHAR U+5B72 +ENCODING 23410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7DFF +0444 +0844 +1044 +11C7 +1501 +1901 +3101 +51C7 +1044 +1044 +5044 +21FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B73 +ENCODING 23411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +7FFC +0A28 +34D0 +0A28 +3FFC +0104 +1FF0 +00C0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B75 +ENCODING 23413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0804 +0878 +3758 +2D54 +2D94 +3F00 +3F7C +2D08 +2D10 +2DFC +7D10 +1610 +1410 +2430 +0000 +ENDCHAR +STARTCHAR U+5B77 +ENCODING 23415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F9F +0434 +7FC8 +1514 +24A2 +3FFF +2000 +23F8 +2010 +2FFE +2020 +40A0 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+5B78 +ENCODING 23416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +1AF0 +1110 +1EF0 +1290 +1D70 +1290 +3FFC +2008 +4FE0 +00C0 +3FF8 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B7A +ENCODING 23418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0440 +0BFC +0B58 +1550 +1040 +1FFC +7080 +13F8 +12A8 +12A8 +12A8 +3218 +0000 +ENDCHAR +STARTCHAR U+5B7B +ENCODING 23419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +04FE +0812 +11FF +1012 +10FE +7C10 +11FF +1129 +1000 +10FE +10AA +10AA +31FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B7C +ENCODING 23420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +4908 +7F7F +0822 +3E14 +23FF +3E08 +227F +3E08 +2208 +2FF8 +0020 +7FFF +0080 +0080 +0180 +ENDCHAR +STARTCHAR U+5B7D +ENCODING 23421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0444 +FFFE +1020 +7EF8 +4250 +7E50 +41FC +7E20 +42F8 +7E20 +4020 +0FE0 +0088 +7FFC +0100 +0300 +ENDCHAR +STARTCHAR U+5B7E +ENCODING 23422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBDE +0A52 +13DE +2252 +23DE +2252 +3BDE +E154 +2222 +2080 +27FF +2104 +23C8 +207C +E3C6 +ENDCHAR +STARTCHAR U+5B7F +ENCODING 23423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +47E8 +D01A +23C4 +4809 +FBDF +23C4 +AA55 +ABD5 +2004 +1FF0 +0080 +FFFF +0100 +0100 +0300 +ENDCHAR +STARTCHAR U+5B80 +ENCODING 23424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0100 +0100 +3FFC +2004 +2008 +4000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+5B81 +ENCODING 23425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4002 +8004 +0000 +FFFE +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+5B83 +ENCODING 23427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2004 +2208 +4200 +0210 +0260 +0380 +0200 +0200 +0204 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+5B84 +ENCODING 23428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4202 +8204 +0220 +3FF0 +0220 +0220 +0220 +0420 +0420 +0822 +1022 +201E +4000 +ENDCHAR +STARTCHAR U+5B85 +ENCODING 23429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4060 +0180 +1E00 +0200 +03FC +7E00 +0200 +0208 +0208 +01F8 +0000 +ENDCHAR +STARTCHAR U+5B86 +ENCODING 23430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4002 +3FF8 +0008 +0008 +1FF8 +1000 +1000 +1FFC +0004 +000C +0018 +00F0 +ENDCHAR +STARTCHAR U+5B87 +ENCODING 23431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4000 +1FF0 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5B88 +ENCODING 23432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4040 +0040 +7FFC +0040 +0840 +0440 +0440 +0040 +0040 +00C0 +0000 +ENDCHAR +STARTCHAR U+5B89 +ENCODING 23433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2208 +4200 +0200 +7FFC +0440 +0440 +0F40 +08C0 +0120 +0610 +3808 +0000 +ENDCHAR +STARTCHAR U+5B8A +ENCODING 23434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4132 +0118 +0100 +3FFC +0100 +0380 +02C0 +0640 +0460 +0C30 +1818 +700E +ENDCHAR +STARTCHAR U+5B8B +ENCODING 23435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4100 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5B8C +ENCODING 23436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4FE0 +0000 +0000 +7FFC +0480 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+5B8D +ENCODING 23437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4100 +0100 +0100 +7FFC +0000 +0440 +0420 +0810 +1008 +6008 +0000 +ENDCHAR +STARTCHAR U+5B8E +ENCODING 23438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +40F2 +0F80 +0100 +0100 +3FFC +0100 +0380 +02C0 +0660 +0C30 +1818 +700E +ENDCHAR +STARTCHAR U+5B8F +ENCODING 23439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2208 +4200 +7FFC +0200 +0480 +0480 +0880 +1120 +2130 +4FC8 +0008 +0000 +ENDCHAR +STARTCHAR U+5B90 +ENCODING 23440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4402 +0400 +07F8 +0C08 +0808 +1B18 +3190 +00D0 +0030 +0020 +0020 +7FFE +ENDCHAR +STARTCHAR U+5B91 +ENCODING 23441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4422 +4420 +0420 +3FFC +0420 +0420 +0420 +7FFE +0820 +0820 +1820 +3020 +ENDCHAR +STARTCHAR U+5B92 +ENCODING 23442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0080 +7FFF +4001 +4021 +00C0 +0F80 +0080 +1FFC +0080 +3FFE +0080 +0081 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+5B93 +ENCODING 23443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4002 +8204 +0110 +0910 +0820 +2848 +2884 +2904 +4A04 +0C10 +1810 +67F0 +0000 +ENDCHAR +STARTCHAR U+5B94 +ENCODING 23444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4202 +0100 +3FFC +0100 +0100 +0100 +1FF8 +0100 +0100 +0100 +0100 +7FFE +ENDCHAR +STARTCHAR U+5B95 +ENCODING 23445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4000 +7FFC +0400 +0400 +0FF0 +0C10 +1410 +2410 +47F0 +0410 +0000 +ENDCHAR +STARTCHAR U+5B96 +ENCODING 23446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4001 +1F08 +0108 +0108 +1F08 +1010 +2010 +3F10 +2112 +0122 +012F +02F1 +1C00 +ENDCHAR +STARTCHAR U+5B97 +ENCODING 23447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4FE0 +0000 +0000 +7FFC +0100 +0920 +0910 +1108 +2108 +0300 +0000 +ENDCHAR +STARTCHAR U+5B98 +ENCODING 23448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4FE0 +0820 +0820 +0FE0 +0800 +0FF0 +0810 +0810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+5B99 +ENCODING 23449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4100 +0100 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5B9A +ENCODING 23450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4000 +3FF8 +0100 +0900 +09F0 +0900 +0900 +1500 +2300 +40FC +0000 +ENDCHAR +STARTCHAR U+5B9B +ENCODING 23451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2808 +4800 +0EF8 +1288 +1288 +2A88 +44B0 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+5B9C +ENCODING 23452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4FC0 +0840 +0840 +0FC0 +0840 +0FC0 +0840 +0840 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5B9D +ENCODING 23453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4000 +1FF0 +0100 +0100 +1FF0 +0100 +0120 +0110 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5B9E +ENCODING 23454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4802 +8684 +0280 +1080 +0C80 +0484 +FFFE +0100 +0140 +0220 +0410 +180C +6004 +ENDCHAR +STARTCHAR U+5B9F +ENCODING 23455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2108 +4100 +1FF0 +0100 +0FE0 +0100 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5BA0 +ENCODING 23456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4202 +8284 +0250 +3FF8 +0280 +0290 +04B0 +04C0 +0880 +0982 +1282 +207E +4000 +ENDCHAR +STARTCHAR U+5BA1 +ENCODING 23457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4102 +8104 +3FF8 +2108 +2108 +3FF8 +2108 +2108 +3FF8 +2108 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+5BA2 +ENCODING 23458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2208 +47E0 +0C40 +3280 +0380 +0C70 +7FEC +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5BA3 +ENCODING 23459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +5FF0 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0000 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5BA4 +ENCODING 23460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +7FF8 +0280 +0460 +3F90 +0100 +1FF0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5BA5 +ENCODING 23461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +3FFC +2208 +7FFC +0400 +07F0 +0C10 +0FF0 +1410 +27F0 +4410 +0410 +0430 +0000 +ENDCHAR +STARTCHAR U+5BA6 +ENCODING 23462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2004 +3FF8 +5100 +1FF0 +1010 +1010 +1FF0 +1110 +1100 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+5BA7 +ENCODING 23463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0080 +7FFF +4001 +5FFD +1040 +1040 +17FC +1404 +1404 +17FC +1040 +1040 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5BA8 +ENCODING 23464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4442 +0448 +3458 +1C70 +0440 +0440 +1C78 +744C +0C40 +0842 +1862 +703E +ENDCHAR +STARTCHAR U+5BA9 +ENCODING 23465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4102 +1110 +1930 +0920 +7FFE +0540 +0540 +0D60 +1930 +3118 +610E +0100 +ENDCHAR +STARTCHAR U+5BAA +ENCODING 23466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4902 +8924 +0FF0 +1100 +2104 +FFFE +0280 +0280 +0280 +0482 +0482 +187E +6000 +ENDCHAR +STARTCHAR U+5BAB +ENCODING 23467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4002 +8024 +0FF0 +0820 +0820 +0FE0 +0010 +1FF8 +1010 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+5BAC +ENCODING 23468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4001 +00A0 +0090 +3FFF +2080 +2082 +3E44 +2248 +2230 +2230 +2C49 +4185 +4603 +ENDCHAR +STARTCHAR U+5BAD +ENCODING 23469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4002 +1FF8 +0208 +7FFE +0208 +1FF8 +0400 +0FFC +1404 +6404 +0404 +07FC +ENDCHAR +STARTCHAR U+5BAE +ENCODING 23470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4FE0 +0820 +0820 +0FE0 +0100 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5BAF +ENCODING 23471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4112 +1FF8 +0120 +0140 +7FFE +0300 +0FE0 +7840 +7FFE +0080 +0080 +0380 +ENDCHAR +STARTCHAR U+5BB0 +ENCODING 23472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2108 +7FF8 +0820 +0440 +7FFC +0100 +0100 +3FF8 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5BB1 +ENCODING 23473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4902 +0900 +1BFE +1240 +3640 +307C +5040 +107C +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+5BB2 +ENCODING 23474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4002 +0FF0 +0810 +0810 +0FF0 +0100 +7FFE +0520 +0D30 +1918 +710E +0100 +ENDCHAR +STARTCHAR U+5BB3 +ENCODING 23475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2108 +5FF0 +0100 +1FF0 +0100 +7FFC +0000 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5BB4 +ENCODING 23476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +4FE0 +0820 +0FE0 +0820 +0FE0 +0100 +7FFC +0440 +0E80 +03C0 +3C30 +0000 +ENDCHAR +STARTCHAR U+5BB5 +ENCODING 23477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2928 +4520 +0540 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+5BB6 +ENCODING 23478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +7FF8 +0200 +0D48 +33C8 +0DB0 +32A0 +0490 +1888 +6084 +0300 +0000 +ENDCHAR +STARTCHAR U+5BB7 +ENCODING 23479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +40F8 +1F80 +1110 +1930 +0920 +7FFE +0520 +0520 +0D30 +1918 +710E +0100 +ENDCHAR +STARTCHAR U+5BB8 +ENCODING 23480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +5FF8 +1000 +17F0 +1000 +1FFC +1280 +1248 +1250 +2220 +2390 +4C0C +0000 +ENDCHAR +STARTCHAR U+5BB9 +ENCODING 23481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2448 +4420 +0910 +1290 +0440 +1830 +6FEC +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5BBA +ENCODING 23482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4002 +0FF0 +0810 +0810 +0FF0 +0000 +3FFC +0000 +0910 +0911 +191B +310E +ENDCHAR +STARTCHAR U+5BBC +ENCODING 23484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4002 +3F20 +00FE +0024 +7F44 +124C +12F8 +121C +12E6 +3202 +2302 +61FE +ENDCHAR +STARTCHAR U+5BBD +ENCODING 23485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4442 +8444 +7FFC +0450 +1FF8 +1010 +1110 +1110 +1190 +1290 +0482 +0882 +707E +ENDCHAR +STARTCHAR U+5BBE +ENCODING 23486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +3FFC +2004 +40E8 +0F00 +0820 +0FF0 +0840 +0840 +0844 +FFFE +0000 +0C40 +0830 +1010 +ENDCHAR +STARTCHAR U+5BBF +ENCODING 23487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4800 +0FF8 +1080 +13F0 +3210 +53F0 +1210 +1210 +13F0 +1210 +0000 +ENDCHAR +STARTCHAR U+5BC0 +ENCODING 23488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4001 +0078 +0F84 +1042 +2020 +0080 +0080 +7FFF +01C0 +02A0 +0490 +188C +6083 +ENDCHAR +STARTCHAR U+5BC1 +ENCODING 23489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4102 +5FFA +0100 +1FF8 +0108 +7FFE +0108 +1FF8 +0100 +11F8 +1100 +2900 +47FE +ENDCHAR +STARTCHAR U+5BC2 +ENCODING 23490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2808 +4800 +0EF8 +0888 +7F48 +0850 +2A30 +2920 +4950 +0888 +1904 +0000 +ENDCHAR +STARTCHAR U+5BC3 +ENCODING 23491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2208 +47C0 +1880 +7FF0 +1110 +1110 +1FF0 +1290 +02A0 +0494 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+5BC4 +ENCODING 23492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2108 +5FF8 +0240 +0C20 +7FFC +0010 +1F10 +1110 +1F10 +1110 +0030 +0000 +ENDCHAR +STARTCHAR U+5BC5 +ENCODING 23493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +5FF0 +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+5BC6 +ENCODING 23494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2208 +4550 +1548 +1484 +2524 +07E0 +1900 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5BC7 +ENCODING 23495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2044 +3E78 +4040 +7FF8 +1488 +1450 +1430 +1470 +2588 +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+5BC9 +ENCODING 23497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2408 +4440 +0880 +0FF8 +1880 +2FF0 +4880 +0FF0 +0880 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+5BCA +ENCODING 23498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4081 +40F9 +0080 +1FFC +1004 +1FFC +1004 +1FFC +1004 +1FFC +0808 +3006 +0000 +0000 +ENDCHAR +STARTCHAR U+5BCB +ENCODING 23499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +5FFD +0410 +1FFC +0410 +3FFE +0808 +17F4 +6413 +04F0 +0402 +07FE +0000 +0000 +ENDCHAR +STARTCHAR U+5BCC +ENCODING 23500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +5FF0 +07C0 +0440 +07C0 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5BCD +ENCODING 23501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +4182 +08CC +2846 +2802 +6C08 +47F8 +0000 +1FF8 +1248 +1248 +1248 +7FFE +ENDCHAR +STARTCHAR U+5BCE +ENCODING 23502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4001 +4000 +25FF +2410 +2410 +3DFF +0511 +7D11 +2529 +2545 +2501 +4503 +0000 +0000 +ENDCHAR +STARTCHAR U+5BCF +ENCODING 23503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4402 +47E2 +0840 +1080 +3FF8 +1248 +1648 +1C78 +1108 +7FFE +0660 +1C38 +700E +ENDCHAR +STARTCHAR U+5BD0 +ENCODING 23504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2448 +6440 +25F8 +3C40 +27FC +04E0 +7CD0 +1550 +1648 +2444 +44C0 +0000 +ENDCHAR +STARTCHAR U+5BD1 +ENCODING 23505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4001 +0BFE +1002 +67FF +23FE +2000 +27FF +2401 +25FD +2050 +2020 +23DE +0000 +0000 +ENDCHAR +STARTCHAR U+5BD2 +ENCODING 23506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2448 +7FF8 +0440 +1FF0 +0440 +7FFC +0440 +1B30 +608C +0600 +0180 +0040 +0000 +ENDCHAR +STARTCHAR U+5BD3 +ENCODING 23507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +4FE0 +0920 +0FE0 +0920 +0FE0 +0100 +3FF8 +2148 +2FE8 +2028 +2018 +0000 +ENDCHAR +STARTCHAR U+5BD4 +ENCODING 23508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +4FE0 +0820 +0FE0 +0820 +0FE0 +0000 +7FFC +1100 +19F0 +2700 +41FC +0000 +ENDCHAR +STARTCHAR U+5BD6 +ENCODING 23510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +71FA +1808 +03FC +6008 +37FE +1402 +05FA +0888 +18D8 +1070 +30D8 +638E +ENDCHAR +STARTCHAR U+5BD7 +ENCODING 23511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4101 +1484 +140A +27F9 +0080 +1FFC +1084 +7FFF +1084 +7FFF +1004 +1004 +1004 +101C +ENDCHAR +STARTCHAR U+5BD8 +ENCODING 23512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4402 +5FFA +0400 +03F0 +1000 +17F0 +1410 +17F0 +1410 +17F0 +1410 +7FFE +0420 +1818 +ENDCHAR +STARTCHAR U+5BD9 +ENCODING 23513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +8001 +830D +0E18 +3A74 +2A54 +2A54 +2A54 +2B54 +29D4 +2A54 +6EDD +5AB7 +C182 +ENDCHAR +STARTCHAR U+5BDA +ENCODING 23514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4002 +5FFA +0100 +0FF8 +0100 +7FFE +0800 +0FF0 +1100 +7FFE +0100 +1108 +1FF8 +ENDCHAR +STARTCHAR U+5BDB +ENCODING 23515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2448 +7FF8 +0440 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0284 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+5BDD +ENCODING 23517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +49F0 +0810 +49F0 +29F0 +2BFC +0A08 +1FF8 +6890 +0860 +08F0 +0B0C +0000 +ENDCHAR +STARTCHAR U+5BDE +ENCODING 23518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2448 +5FF0 +0440 +0FE0 +0820 +0FE0 +0820 +0FE0 +0100 +7FFC +06C0 +3838 +0000 +ENDCHAR +STARTCHAR U+5BDF +ENCODING 23519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2808 +4FF8 +1990 +6660 +1430 +1FEC +6000 +3FF8 +0540 +1930 +6108 +0300 +0000 +ENDCHAR +STARTCHAR U+5BE0 +ENCODING 23520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4102 +5FFA +1108 +7FFE +1108 +1FF8 +0100 +1FF8 +1108 +FFFF +0C20 +07E0 +7E3E +ENDCHAR +STARTCHAR U+5BE1 +ENCODING 23521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2FE8 +4200 +0FE0 +0820 +0FE0 +0FE0 +0FE0 +7FFC +0FE0 +725C +0440 +1980 +0000 +ENDCHAR +STARTCHAR U+5BE2 +ENCODING 23522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +25F8 +6410 +27FC +3C10 +25F0 +07FC +7E08 +15F0 +1490 +1460 +24F0 +470C +0000 +ENDCHAR +STARTCHAR U+5BE3 +ENCODING 23523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4001 +4411 +24FE +2400 +247C +3C00 +047C +7C00 +24FE +2482 +4482 +04FE +0000 +0000 +ENDCHAR +STARTCHAR U+5BE4 +ENCODING 23524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2408 +65F8 +2440 +3DF0 +2490 +07FC +7C00 +15F8 +1508 +25F8 +4508 +0000 +ENDCHAR +STARTCHAR U+5BE5 +ENCODING 23525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +5EF0 +0A50 +16B0 +0B50 +1280 +0CE0 +775C +01A0 +0640 +0180 +0E00 +0000 +ENDCHAR +STARTCHAR U+5BE6 +ENCODING 23526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +27E8 +4520 +7FFC +0940 +0FC0 +0FE0 +0820 +0FE0 +0FE0 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+5BE7 +ENCODING 23527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2308 +54A0 +1450 +23C8 +1FF0 +1290 +1FF0 +0000 +7FFC +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5BE8 +ENCODING 23528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2448 +7FF8 +0440 +1FF0 +0440 +7FFC +0920 +1FF0 +638C +0D60 +3118 +0100 +0000 +ENDCHAR +STARTCHAR U+5BE9 +ENCODING 23529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2068 +5FA0 +0540 +7FFC +0540 +1930 +6FEC +0920 +0FE0 +0920 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5BEA +ENCODING 23530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0080 +7FFF +4421 +4241 +0FFC +0108 +03FE +0404 +0FFF +1249 +2925 +4401 +000E +0000 +0000 +ENDCHAR +STARTCHAR U+5BEB +ENCODING 23531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2208 +5CF0 +1010 +1EF0 +1010 +1FF0 +0800 +1FF8 +6548 +12A8 +12A8 +2030 +0000 +ENDCHAR +STARTCHAR U+5BEC +ENCODING 23532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4221 +1FFC +0220 +1FFC +1004 +1FFC +1004 +1FFC +1004 +1FFC +0221 +0C21 +703F +ENDCHAR +STARTCHAR U+5BEE +ENCODING 23534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2108 +7FFC +2448 +1FF0 +682C +0FE0 +0820 +0FE0 +0560 +0910 +3108 +0300 +0000 +ENDCHAR +STARTCHAR U+5BEF +ENCODING 23535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4421 +0840 +1FFE +3080 +5FFE +1080 +1FFE +1080 +1FFF +1000 +3E3E +2222 +23E2 +2006 +ENDCHAR +STARTCHAR U+5BF0 +ENCODING 23536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +5FF0 +1290 +1FF0 +7FFC +0FE0 +0820 +0FE0 +0C88 +7450 +0730 +180C +0000 +ENDCHAR +STARTCHAR U+5BF1 +ENCODING 23537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4042 +4482 +25FC +2504 +25FC +3D04 +05FC +0504 +7DFC +2420 +25FE +64A8 +C526 +ENDCHAR +STARTCHAR U+5BF2 +ENCODING 23538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4001 +60FD +3C28 +2210 +3EFF +2009 +3E08 +484E +7F48 +1468 +2298 +410F +0000 +0000 +ENDCHAR +STARTCHAR U+5BF3 +ENCODING 23539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +3E88 +48F8 +3FB0 +0EA8 +3968 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +3C38 +0000 +ENDCHAR +STARTCHAR U+5BF4 +ENCODING 23540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +8801 +887D +7F44 +227C +3644 +147C +7F44 +0844 +7F7C +2A28 +2B29 +6929 +C8C7 +ENDCHAR +STARTCHAR U+5BF5 +ENCODING 23541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2848 +7F78 +1440 +7F78 +0008 +3E78 +2240 +3E78 +2278 +3E7C +2244 +263C +0000 +ENDCHAR +STARTCHAR U+5BF6 +ENCODING 23542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +3EF8 +4920 +3FFC +0EA8 +38F8 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +3C38 +0000 +ENDCHAR +STARTCHAR U+5BF8 +ENCODING 23544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +0040 +0040 +7FFC +0040 +0840 +0440 +0240 +0240 +0040 +0040 +0040 +01C0 +0000 +ENDCHAR +STARTCHAR U+5BF9 +ENCODING 23545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +0010 +FC14 +07FE +0410 +4810 +2910 +1090 +1090 +2810 +2410 +4410 +8010 +0050 +0020 +ENDCHAR +STARTCHAR U+5BFA +ENCODING 23546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +0100 +7FFC +0040 +0040 +7FFC +0840 +0440 +0440 +0040 +00C0 +0000 +ENDCHAR +STARTCHAR U+5BFB +ENCODING 23547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +0010 +0010 +1FF0 +0010 +0010 +3FF0 +0020 +0024 +FFFE +0820 +0420 +0420 +00A0 +0040 +ENDCHAR +STARTCHAR U+5BFC +ENCODING 23548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +2010 +2010 +3FF0 +2014 +2004 +1FFC +0020 +0024 +FFFE +0020 +0820 +0420 +00A0 +0040 +ENDCHAR +STARTCHAR U+5BFD +ENCODING 23549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0030 +00E0 +1F90 +1118 +1188 +308C +6086 +0020 +7FFE +0020 +0420 +0620 +0220 +0020 +0020 +00E0 +ENDCHAR +STARTCHAR U+5BFE +ENCODING 23550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +0810 +7FFC +0410 +0410 +2490 +1450 +0C50 +0C10 +0A10 +1210 +2010 +4030 +0000 +ENDCHAR +STARTCHAR U+5BFF +ENCODING 23551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +1FF0 +0200 +7FFC +0420 +7FFC +0820 +1420 +2220 +4220 +0060 +0000 +ENDCHAR +STARTCHAR U+5C01 +ENCODING 23553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +3E10 +09FC +0810 +7F10 +0890 +0850 +3E50 +0810 +0810 +0E10 +7010 +0030 +0000 +ENDCHAR +STARTCHAR U+5C02 +ENCODING 23554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0040 +7FFC +0840 +0440 +0040 +00C0 +0000 +ENDCHAR +STARTCHAR U+5C03 +ENCODING 23555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +7FFF +0080 +1FFC +1084 +1FFC +1084 +1FFC +1084 +0008 +7FFF +0408 +0228 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5C04 +ENCODING 23556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0808 +1F08 +1108 +1FFC +1108 +1F48 +11A8 +1F28 +7308 +0508 +1908 +6108 +0318 +0000 +ENDCHAR +STARTCHAR U+5C05 +ENCODING 23557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +7F10 +0810 +3FFC +2210 +2290 +3E50 +1450 +1410 +1410 +2434 +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+5C06 +ENCODING 23558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +0860 +0F88 +4A48 +2950 +2920 +0810 +0FFC +1910 +6890 +0890 +0810 +0810 +0830 +0000 +ENDCHAR +STARTCHAR U+5C07 +ENCODING 23559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +2478 +2488 +24D0 +3D30 +26A0 +04D0 +7C90 +17FC +1510 +1490 +2490 +4410 +0430 +0000 +ENDCHAR +STARTCHAR U+5C08 +ENCODING 23560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0110 +3FF8 +0048 +7FFC +0840 +04C0 +0000 +ENDCHAR +STARTCHAR U+5C09 +ENCODING 23561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F08 +2108 +3F08 +20FC +3E08 +2048 +3F28 +2428 +2E08 +2D08 +3508 +4408 +0C18 +0000 +ENDCHAR +STARTCHAR U+5C0A +ENCODING 23562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +7FFC +0280 +1FF0 +12D0 +1450 +1FF0 +1FF0 +0040 +7FFC +0840 +0440 +00C0 +0000 +ENDCHAR +STARTCHAR U+5C0B +ENCODING 23563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +0020 +1FE0 +0020 +1FE0 +3EF8 +0888 +0EF8 +3040 +7FFC +0440 +0240 +00C0 +0000 +ENDCHAR +STARTCHAR U+5C0C +ENCODING 23564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +0802 +FF82 +087F +0802 +7F02 +0002 +7F22 +4132 +4112 +7F02 +2202 +2202 +1402 +1402 +7F0E +ENDCHAR +STARTCHAR U+5C0D +ENCODING 23565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A08 +4A88 +2A88 +2B08 +7FFC +1108 +0A48 +3F28 +0428 +3F08 +0408 +0408 +0708 +7818 +0000 +ENDCHAR +STARTCHAR U+5C0E +ENCODING 23566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2120 +1FFC +1080 +03F0 +7210 +13F0 +13F0 +1A10 +67F0 +03F8 +7FFC +0440 +0240 +00C0 +0000 +ENDCHAR +STARTCHAR U+5C0F +ENCODING 23567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +0920 +0910 +1108 +1108 +2104 +4104 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5C10 +ENCODING 23568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0888 +1084 +2082 +4081 +1080 +0880 +0480 +0200 +0100 +0080 +0040 +003F +0000 +0000 +ENDCHAR +STARTCHAR U+5C11 +ENCODING 23569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0920 +0910 +1108 +1114 +2114 +4120 +0320 +0040 +0080 +0100 +0600 +3800 +0000 +ENDCHAR +STARTCHAR U+5C12 +ENCODING 23570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0140 +0220 +0410 +0808 +1084 +6083 +0080 +02A0 +0490 +0888 +3086 +0280 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+5C13 +ENCODING 23571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +1FFC +1100 +2100 +4920 +0910 +1110 +1108 +2108 +4108 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+5C14 +ENCODING 23572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0C00 +0808 +1FFC +2008 +4110 +8100 +0100 +0940 +0920 +1110 +1118 +2108 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+5C15 +ENCODING 23573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FF0 +0410 +0424 +047E +0804 +0804 +1114 +2108 +4900 +8920 +1110 +1110 +210C +0504 +0200 +ENDCHAR +STARTCHAR U+5C16 +ENCODING 23574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0920 +0910 +1108 +2108 +0300 +0100 +7FFC +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+5C17 +ENCODING 23575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +01F8 +0100 +0100 +0100 +7FFE +0100 +0100 +0910 +0910 +1918 +310C +6106 +0100 +0700 +ENDCHAR +STARTCHAR U+5C18 +ENCODING 23576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0540 +0D20 +1118 +210C +4104 +0000 +0100 +0108 +7FFC +0100 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+5C19 +ENCODING 23577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +1084 +2082 +4081 +0080 +3FFE +2002 +2002 +27F2 +2412 +2412 +27F2 +2412 +2002 +2002 +2006 +ENDCHAR +STARTCHAR U+5C1A +ENCODING 23578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +0910 +0920 +3FF8 +2008 +27C8 +2448 +2448 +27C8 +2448 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+5C1C +ENCODING 23580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0920 +0910 +1108 +2308 +0000 +0104 +FFFE +0280 +0C60 +311E +C924 +0920 +1118 +2508 +0200 +ENDCHAR +STARTCHAR U+5C1D +ENCODING 23581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1110 +0920 +0100 +7FFE +4002 +8024 +1FF0 +0000 +0008 +7FFC +0200 +0440 +0820 +1FF0 +0010 +ENDCHAR +STARTCHAR U+5C1E +ENCODING 23582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +0240 +2664 +1428 +0FF0 +1818 +6FF6 +0810 +0FF0 +0100 +0910 +1918 +310C +0700 +ENDCHAR +STARTCHAR U+5C1F +ENCODING 23583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7E10 +4210 +7E54 +4254 +4256 +7E93 +0010 +FF32 +0806 +4804 +4F0C +4818 +6870 +D800 +8FFF +ENDCHAR +STARTCHAR U+5C20 +ENCODING 23584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1220 +3F20 +12B0 +1EA8 +12A8 +1EA4 +132C +7F68 +2C30 +2D10 +3320 +20C0 +1F00 +0000 +ENDCHAR +STARTCHAR U+5C22 +ENCODING 23586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +7FFC +0180 +0280 +0280 +0280 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+5C23 +ENCODING 23587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +0240 +0660 +0420 +0C30 +1818 +344C +E447 +0440 +0440 +0440 +0440 +0C40 +0842 +1862 +303E +ENDCHAR +STARTCHAR U+5C24 +ENCODING 23588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0108 +0108 +0100 +7FFC +0300 +0300 +0300 +0500 +0500 +0900 +1104 +2104 +40FC +0000 +ENDCHAR +STARTCHAR U+5C25 +ENCODING 23589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2088 +20FC +FD08 +2908 +2A88 +2848 +2848 +2808 +2808 +2888 +2852 +4822 +47FE +8000 +ENDCHAR +STARTCHAR U+5C26 +ENCODING 23590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2840 +2840 +6C40 +447F +C6C1 +8281 +AB81 +2801 +2879 +2803 +2802 +2802 +2806 +681D +4C01 +C7FF +ENDCHAR +STARTCHAR U+5C27 +ENCODING 23591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0408 +03FC +7E20 +0140 +0084 +0764 +381C +0008 +7FFC +0240 +0240 +0440 +0442 +0842 +703E +ENDCHAR +STARTCHAR U+5C28 +ENCODING 23592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1420 +1240 +1250 +7E90 +1520 +1428 +1448 +1490 +1410 +1420 +2444 +2484 +43FC +0000 +ENDCHAR +STARTCHAR U+5C29 +ENCODING 23593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2800 +2800 +6C00 +45FE +C620 +8020 +A820 +28FC +2820 +2820 +2820 +2820 +29FE +6801 +4C01 +C7FF +ENDCHAR +STARTCHAR U+5C2A +ENCODING 23594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1010 +7E10 +1010 +10FE +1410 +1410 +1410 +14FE +2400 +4401 +0401 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+5C2B +ENCODING 23595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE00 +2800 +29FE +2820 +2820 +2820 +28FC +2820 +2820 +2820 +2820 +29FE +6801 +4C01 +C7FF +ENDCHAR +STARTCHAR U+5C2C +ENCODING 23596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2050 +2090 +FD08 +2A06 +2C94 +2890 +2890 +2890 +2910 +2910 +2A12 +4802 +47FE +8000 +ENDCHAR +STARTCHAR U+5C2D +ENCODING 23597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +0920 +7FFC +0820 +0820 +7FFC +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+5C2E +ENCODING 23598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21F8 +2088 +208E +FC82 +2182 +2B0E +2820 +2BFE +28A8 +28A8 +29AC +2B26 +6820 +4C01 +C7FF +ENDCHAR +STARTCHAR U+5C30 +ENCODING 23600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200C +20F8 +2020 +23FF +FC20 +21FE +2922 +29FE +2922 +29FE +2820 +29FE +2820 +6BFF +4C01 +C7FF +ENDCHAR +STARTCHAR U+5C31 +ENCODING 23601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +7F48 +0048 +3FFC +2240 +2260 +3E60 +0860 +2CA0 +2AA0 +2B24 +4A24 +181C +0000 +ENDCHAR +STARTCHAR U+5C32 +ENCODING 23602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +20CC +2048 +23FF +F848 +23FE +284A +2FFF +284A +2BFE +2848 +28CC +294A +6849 +4C01 +C7FF +ENDCHAR +STARTCHAR U+5C33 +ENCODING 23603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +1044 +105C +1054 +7DFF +1101 +107C +1444 +147C +1444 +147C +2485 +4401 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+5C34 +ENCODING 23604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +2290 +22A0 +22FC +FE80 +2A90 +2888 +2880 +2BF8 +2AA8 +2AA8 +2AA8 +2FFE +4802 +47FE +8000 +ENDCHAR +STARTCHAR U+5C35 +ENCODING 23605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +21FC +2124 +21FC +F820 +23FF +2800 +29FC +2904 +29FC +2904 +29FC +2904 +69FD +4E03 +C7FF +ENDCHAR +STARTCHAR U+5C36 +ENCODING 23606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03E8 +FE88 +2BDF +2A50 +2BE0 +2A8F +2BE0 +2800 +29FE +2952 +2952 +2952 +2952 +6BFF +4C01 +C7FF +ENDCHAR +STARTCHAR U+5C37 +ENCODING 23607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4790 +4510 +47BE +FCA0 +47C0 +451E +5780 +5000 +53FC +5294 +5294 +57FE +4800 +87FE +0000 +0000 +ENDCHAR +STARTCHAR U+5C38 +ENCODING 23608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1008 +1000 +1000 +1000 +1000 +1000 +2000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+5C39 +ENCODING 23609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0110 +0110 +7FFC +0110 +0110 +1FF0 +0110 +0110 +0200 +0200 +0400 +0800 +0000 +ENDCHAR +STARTCHAR U+5C3A +ENCODING 23610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0810 +0810 +0810 +0FF0 +0910 +0900 +0880 +0880 +1040 +1020 +2010 +400C +0000 +ENDCHAR +STARTCHAR U+5C3B +ENCODING 23611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1108 +1100 +1FE0 +1120 +1120 +1220 +2224 +2424 +481C +0000 +ENDCHAR +STARTCHAR U+5C3C +ENCODING 23612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1208 +1200 +1238 +13C0 +1200 +1200 +2204 +2204 +41FC +0000 +ENDCHAR +STARTCHAR U+5C3D +ENCODING 23613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0810 +0810 +0FF0 +0910 +1080 +1040 +2330 +408C +0000 +0F00 +00C0 +0020 +0000 +ENDCHAR +STARTCHAR U+5C3E +ENCODING 23614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1068 +1780 +10F0 +1780 +10FC +1F80 +2080 +2084 +407C +0000 +ENDCHAR +STARTCHAR U+5C3F +ENCODING 23615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1080 +1088 +1FC8 +11B0 +12A0 +2490 +3888 +4084 +0180 +0000 +ENDCHAR +STARTCHAR U+5C40 +ENCODING 23616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1000 +1FFC +1004 +13E4 +1224 +1224 +23E4 +2224 +4018 +0000 +ENDCHAR +STARTCHAR U+5C41 +ENCODING 23617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1448 +1440 +1444 +17C8 +1470 +1440 +2444 +2744 +5C3C +0000 +ENDCHAR +STARTCHAR U+5C42 +ENCODING 23618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +1FFE +1004 +1004 +1FFC +1000 +1010 +17F8 +1000 +1004 +1FFE +1100 +2210 +2408 +4FFC +8004 +ENDCHAR +STARTCHAR U+5C44 +ENCODING 23620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +2002 +3FFE +2040 +2040 +2FFE +2802 +2802 +2120 +2210 +4408 +0806 +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+5C45 +ENCODING 23621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1088 +1080 +1FFC +1080 +1080 +17F0 +2410 +2410 +47F0 +0410 +0000 +ENDCHAR +STARTCHAR U+5C46 +ENCODING 23622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1088 +1080 +1488 +17F8 +1488 +1488 +15E8 +2408 +27F8 +4408 +0000 +ENDCHAR +STARTCHAR U+5C47 +ENCODING 23623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +2002 +3FFE +2000 +2002 +2FFF +2842 +2842 +2FFE +2842 +2842 +2FFE +4802 +0000 +0000 +ENDCHAR +STARTCHAR U+5C48 +ENCODING 23624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1088 +1490 +1490 +17F0 +1490 +1888 +2888 +2888 +4FF8 +0808 +0000 +ENDCHAR +STARTCHAR U+5C49 +ENCODING 23625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2008 +2008 +3FF8 +2090 +2490 +2494 +3FFE +2490 +2490 +24F0 +2400 +4408 +87FC +0000 +ENDCHAR +STARTCHAR U+5C4A +ENCODING 23626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1080 +1FF8 +1888 +1888 +1FF8 +2888 +2888 +4FF8 +0808 +0000 +ENDCHAR +STARTCHAR U+5C4B +ENCODING 23627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1000 +1FF8 +1140 +1230 +1FC8 +1080 +27F0 +2080 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5C4C +ENCODING 23628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFF +1001 +1FFF +1000 +11FC +1104 +11FC +1020 +17FF +1421 +2425 +4422 +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5C4D +ENCODING 23629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1000 +1FFC +1240 +13C8 +14F0 +1D40 +2340 +2244 +4C44 +303C +0000 +ENDCHAR +STARTCHAR U+5C4E +ENCODING 23630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1088 +1490 +1290 +12A0 +1FFC +11C0 +12A0 +2490 +288C +4080 +0000 +ENDCHAR +STARTCHAR U+5C4F +ENCODING 23631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1210 +1120 +17F8 +1120 +1120 +1FFC +1120 +2220 +2420 +4820 +0000 +ENDCHAR +STARTCHAR U+5C50 +ENCODING 23632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1220 +1220 +15FC +1A20 +13F8 +1488 +1C50 +2420 +24D0 +470C +0000 +ENDCHAR +STARTCHAR U+5C51 +ENCODING 23633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1490 +12A0 +17F0 +1410 +17F0 +1410 +27F0 +2410 +4410 +0430 +0000 +ENDCHAR +STARTCHAR U+5C53 +ENCODING 23635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1000 +17F0 +1410 +17F0 +1410 +17F0 +1410 +27F0 +2330 +4C08 +0000 +ENDCHAR +STARTCHAR U+5C54 +ENCODING 23636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +1041 +2041 +407F +7E40 +2450 +2450 +2450 +245E +2450 +2451 +2451 +7E51 +009F +0000 +0000 +ENDCHAR +STARTCHAR U+5C55 +ENCODING 23637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1248 +1240 +1FF8 +1240 +1FFC +1248 +1250 +2220 +2390 +5C0C +0000 +ENDCHAR +STARTCHAR U+5C56 +ENCODING 23638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +3FFE +2040 +27FC +2208 +2110 +2FFE +2040 +2040 +27FC +2040 +4040 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+5C58 +ENCODING 23640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FF00 +817E +8102 +FF04 +8008 +BF08 +887E +BF88 +8808 +BF88 +8808 +881A +8802 +87FE +0000 +0000 +ENDCHAR +STARTCHAR U+5C59 +ENCODING 23641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3FFE +2004 +3FFC +2000 +2FFE +2A08 +2AE8 +2CA8 +2AA8 +2AA8 +2EA8 +4AE8 +4808 +8828 +0810 +ENDCHAR +STARTCHAR U+5C5A +ENCODING 23642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +2002 +2002 +3FFE +2000 +2FFE +2040 +2FFE +2842 +2A52 +294A +6842 +4A52 +C94A +0846 +ENDCHAR +STARTCHAR U+5C5B +ENCODING 23643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +2002 +3FFE +2108 +2108 +2210 +3FFE +2210 +2210 +2390 +3EFF +2210 +4410 +4410 +4810 +ENDCHAR +STARTCHAR U+5C5C +ENCODING 23644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +2002 +3FFE +2000 +2440 +2454 +2C54 +2BFF +3254 +2654 +2454 +6C5C +5440 +C440 +047E +ENDCHAR +STARTCHAR U+5C5D +ENCODING 23645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4002 +7FFE +4120 +4120 +4F3C +4120 +4F3C +4120 +5F3E +4120 +4120 +8220 +0420 +0000 +0000 +ENDCHAR +STARTCHAR U+5C5E +ENCODING 23646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1078 +1F80 +17F0 +1490 +17F0 +1FF8 +18A8 +2FF8 +2808 +4818 +0000 +ENDCHAR +STARTCHAR U+5C60 +ENCODING 23648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1088 +17F0 +10A0 +1FFC +11F0 +1710 +19F0 +1110 +21F0 +4110 +0000 +ENDCHAR +STARTCHAR U+5C61 +ENCODING 23649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1490 +12A0 +1FFC +13E0 +1C98 +1FFC +1120 +23A0 +20E0 +4F18 +0000 +ENDCHAR +STARTCHAR U+5C62 +ENCODING 23650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +3FFE +27FC +2444 +3FFF +2444 +27FC +27FC +2444 +27FC +2100 +3FFF +4618 +41E0 +5F1E +ENDCHAR +STARTCHAR U+5C63 +ENCODING 23651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3FFE +2004 +3FFC +2220 +24BC +28A0 +32A8 +25FC +2C20 +34A8 +24BC +44A0 +4560 +863E +0400 +ENDCHAR +STARTCHAR U+5C64 +ENCODING 23652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1220 +17F8 +17F8 +1488 +17F8 +13F0 +23F0 +2210 +43F0 +0210 +0000 +ENDCHAR +STARTCHAR U+5C65 +ENCODING 23653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1280 +14FC +1BF0 +12F0 +1490 +1CF0 +14F8 +2790 +2460 +479C +0000 +ENDCHAR +STARTCHAR U+5C66 +ENCODING 23654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3FFE +2004 +3FFC +2220 +24A8 +2820 +33FC +24A8 +2D24 +3440 +27FE +4488 +4470 +8448 +0584 +ENDCHAR +STARTCHAR U+5C67 +ENCODING 23655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +3FFE +2000 +24A4 +25FF +2CA4 +2ABC +3280 +26FE +2410 +2DFF +7454 +4454 +C4D6 +0593 +ENDCHAR +STARTCHAR U+5C68 +ENCODING 23656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +3FFE +2410 +24FE +2C92 +2BFF +3292 +26FE +2410 +2CFE +3492 +65FF +4464 +C438 +05EF +ENDCHAR +STARTCHAR U+5C69 +ENCODING 23657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +3FFE +2000 +24FC +2420 +2CFE +2A48 +32FC +274A +25FF +2D02 +757A +454A +C57A +0506 +ENDCHAR +STARTCHAR U+5C6A +ENCODING 23658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +3FFE +2040 +2FFE +2BFA +2514 +23F8 +27EC +2A0A +23F8 +2248 +4444 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+5C6C +ENCODING 23660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +16B0 +16B0 +17F0 +1550 +17F0 +17F8 +1D48 +27C8 +2168 +4FF0 +0000 +ENDCHAR +STARTCHAR U+5C6D +ENCODING 23661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2002 +3FFE +2210 +23F0 +2210 +23F0 +2210 +2FFE +2922 +2F3E +2922 +6F3E +4922 +CF3E +19E3 +ENDCHAR +STARTCHAR U+5C6E +ENCODING 23662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +2108 +2108 +2108 +2108 +2108 +3FF8 +2108 +2208 +0200 +0400 +0800 +1000 +0000 +ENDCHAR +STARTCHAR U+5C6F +ENCODING 23663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0230 +03C0 +7E00 +2220 +2220 +2220 +2220 +3FE0 +2220 +2220 +0204 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+5C70 +ENCODING 23664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +0C30 +0420 +7FFE +0100 +1108 +1108 +1108 +1108 +1FF8 +0100 +0300 +0200 +0600 +1C00 +ENDCHAR +STARTCHAR U+5C71 +ENCODING 23665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +2108 +2108 +2108 +2108 +2108 +2108 +2108 +2108 +3FF8 +2008 +2008 +0000 +ENDCHAR +STARTCHAR U+5C73 +ENCODING 23667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0300 +0080 +0140 +0220 +0410 +0808 +7007 +0080 +0080 +2082 +2082 +2082 +3FFE +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+5C74 +ENCODING 23668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +2104 +3FFC +0100 +0100 +3FFC +0204 +0204 +0204 +0604 +040C +0C08 +1808 +7038 +ENDCHAR +STARTCHAR U+5C75 +ENCODING 23669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +2104 +2104 +3FFC +0000 +3FFC +2000 +2000 +2000 +2000 +2000 +2000 +2000 +6000 +C000 +ENDCHAR +STARTCHAR U+5C76 +ENCODING 23670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +2108 +2108 +3FF8 +2008 +0000 +7FF8 +0208 +0208 +0208 +0408 +1808 +6070 +0000 +ENDCHAR +STARTCHAR U+5C79 +ENCODING 23673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +55FC +5500 +5600 +55F0 +5420 +5440 +5480 +7C80 +4504 +4104 +00FC +0000 +ENDCHAR +STARTCHAR U+5C7A +ENCODING 23674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +11FE +1004 +5404 +5404 +55FC +5504 +5500 +5500 +5500 +5500 +7D02 +0502 +00FE +0000 +ENDCHAR +STARTCHAR U+5C7B +ENCODING 23675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2021 +2021 +A821 +AB21 +A9A1 +A8E1 +A841 +A8E1 +A8B1 +F993 +0102 +0302 +060E +0000 +ENDCHAR +STARTCHAR U+5C7C +ENCODING 23676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2090 +2090 +A890 +A890 +A890 +A890 +A890 +A890 +A890 +F890 +0190 +0111 +0319 +060F +ENDCHAR +STARTCHAR U+5C7D +ENCODING 23677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FE +2020 +2020 +A820 +A820 +A820 +ABFF +A820 +A820 +A820 +A820 +F820 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+5C7E +ENCODING 23678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +0808 +0808 +4949 +4949 +4949 +4949 +4949 +4949 +4949 +4949 +7F7F +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+5C7F +ENCODING 23679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1088 +10FC +5480 +5480 +5484 +54FE +5404 +5424 +57F4 +7C04 +4404 +0004 +0028 +0010 +ENDCHAR +STARTCHAR U+5C81 +ENCODING 23681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +2108 +3FF8 +2408 +0400 +0FFC +1008 +2410 +4220 +0140 +0180 +0300 +1C00 +E000 +ENDCHAR +STARTCHAR U+5C82 +ENCODING 23682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +2108 +3FF8 +0010 +7FF8 +0010 +0010 +0010 +3FF0 +2010 +2000 +2002 +2002 +1FFE +ENDCHAR +STARTCHAR U+5C86 +ENCODING 23686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +10FC +1010 +1010 +5410 +55FF +5410 +5410 +5410 +7C28 +4444 +0082 +0101 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+5C87 +ENCODING 23687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +4102 +7FFE +0000 +0000 +46FE +7C82 +4082 +4082 +4082 +4E82 +F08E +0080 +0080 +ENDCHAR +STARTCHAR U+5C88 +ENCODING 23688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +11FC +1010 +5510 +5514 +55FE +5410 +5430 +5450 +5490 +5510 +7E10 +0410 +0050 +0020 +ENDCHAR +STARTCHAR U+5C89 +ENCODING 23689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1040 +107F +10A9 +5529 +5429 +5429 +5449 +5489 +5511 +7C21 +4441 +008A +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+5C8A +ENCODING 23690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +2104 +2104 +3FFC +2000 +2002 +3002 +1FFE +0100 +0100 +2104 +2104 +2104 +3FFC +0000 +ENDCHAR +STARTCHAR U+5C8B +ENCODING 23691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +1082 +1084 +1088 +549E +5482 +5482 +54A2 +5494 +7C88 +4514 +0022 +0041 +0181 +0000 +0000 +ENDCHAR +STARTCHAR U+5C8C +ENCODING 23692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0000 +3FC0 +0440 +0440 +07F0 +0410 +0A20 +0940 +10C0 +2330 +4C0C +0000 +ENDCHAR +STARTCHAR U+5C8D +ENCODING 23693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +13FE +1088 +5488 +5488 +5488 +57FE +5488 +5488 +5488 +5488 +7D08 +0508 +0208 +0408 +ENDCHAR +STARTCHAR U+5C8F +ENCODING 23695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FE +2000 +2000 +A800 +ABFF +A848 +A848 +A848 +A848 +A848 +F8C8 +0089 +0189 +0707 +0000 +ENDCHAR +STARTCHAR U+5C90 +ENCODING 23696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +1040 +17FC +5440 +5440 +57F8 +5508 +5490 +7C90 +4460 +4060 +0190 +060C +0000 +ENDCHAR +STARTCHAR U+5C91 +ENCODING 23697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +2108 +3FF8 +2108 +0280 +0440 +1830 +67CC +0000 +1FC0 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5C92 +ENCODING 23698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +2050 +20D8 +A98C +AB06 +AEFB +A800 +A800 +A9FC +A804 +F80C +0008 +0018 +0010 +0030 +ENDCHAR +STARTCHAR U+5C93 +ENCODING 23699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +11FE +1080 +1080 +54FF +5488 +5488 +5488 +5488 +5488 +7D08 +4408 +0008 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+5C94 +ENCODING 23700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07C0 +0440 +1830 +6FEC +0220 +0220 +0C20 +30C0 +0100 +2108 +2108 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5C95 +ENCODING 23701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0080 +0140 +0220 +0410 +0A28 +7227 +0220 +0220 +0C20 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5C96 +ENCODING 23702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1100 +1104 +5544 +5528 +5528 +5510 +5510 +5528 +5524 +5544 +7D80 +0500 +01FE +0000 +ENDCHAR +STARTCHAR U+5C97 +ENCODING 23703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4104 +4104 +7FFC +0004 +7FFE +4004 +4824 +4444 +4284 +4104 +4284 +4444 +4834 +5014 +4008 +ENDCHAR +STARTCHAR U+5C98 +ENCODING 23704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1148 +5548 +5548 +5548 +5548 +5548 +5568 +54A0 +54A0 +7D22 +0522 +021E +0C00 +ENDCHAR +STARTCHAR U+5C99 +ENCODING 23705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0038 +3FC0 +0200 +0204 +FFFE +0440 +0830 +310E +C104 +1110 +1110 +1110 +1110 +1FF0 +0010 +ENDCHAR +STARTCHAR U+5C9A +ENCODING 23706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0000 +1FF0 +1010 +1010 +1450 +1290 +1110 +1290 +2450 +2852 +400A +8004 +ENDCHAR +STARTCHAR U+5C9B +ENCODING 23707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0220 +0FF0 +0820 +0A20 +0920 +0860 +0804 +0FFE +0804 +0204 +2224 +2224 +3FE4 +2034 +0008 +ENDCHAR +STARTCHAR U+5C9C +ENCODING 23708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0000 +3FF8 +2108 +2108 +2108 +3FF8 +2008 +2000 +2002 +2002 +1FFE +0000 +ENDCHAR +STARTCHAR U+5C9D +ENCODING 23709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +2104 +3FFC +0800 +0800 +1FFC +3100 +6100 +01FC +0100 +01FC +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+5C9F +ENCODING 23711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +21FC +A924 +A924 +A924 +A924 +A924 +ABFE +A850 +F8D8 +0088 +018C +0306 +0603 +ENDCHAR +STARTCHAR U+5CA0 +ENCODING 23712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FF +2100 +2100 +A900 +A9FE +A902 +A902 +A902 +A9FE +A900 +F900 +0100 +0100 +01FF +0000 +ENDCHAR +STARTCHAR U+5CA1 +ENCODING 23713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2848 +2448 +2488 +3FF8 +2108 +2928 +2928 +2928 +2FE8 +2828 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+5CA2 +ENCODING 23714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0004 +FFFE +0010 +0090 +1FD0 +1090 +1090 +1090 +1F90 +1010 +0050 +0020 +ENDCHAR +STARTCHAR U+5CA3 +ENCODING 23715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1084 +10FE +5504 +5624 +55F4 +5524 +5524 +5524 +5524 +55E4 +7D24 +0404 +0028 +0010 +ENDCHAR +STARTCHAR U+5CA4 +ENCODING 23716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1010 +11FF +5501 +5501 +5400 +5400 +5410 +5448 +7C84 +4502 +0201 +0201 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+5CA5 +ENCODING 23717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +1008 +10FF +1089 +5488 +54BE +54A2 +54A2 +5494 +5488 +7C94 +4522 +0041 +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+5CA6 +ENCODING 23718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +2104 +3FFC +0100 +0100 +3FFC +0010 +0810 +0830 +0C20 +0460 +0440 +0040 +7FFE +ENDCHAR +STARTCHAR U+5CA7 +ENCODING 23719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +0000 +1FFC +0104 +0204 +0C38 +0000 +1FFC +1004 +1004 +1FFC +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+5CA8 +ENCODING 23720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +11F0 +1110 +5510 +5510 +55F0 +5510 +5510 +55F0 +7D10 +4510 +4110 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5CA9 +ENCODING 23721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1FF0 +0000 +7FFC +0400 +0400 +0FF0 +0C10 +1410 +2410 +47F0 +0410 +0000 +ENDCHAR +STARTCHAR U+5CAA +ENCODING 23722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +7FFE +0440 +7FFC +0444 +0444 +7FFC +4440 +4440 +7FFE +0442 +0C42 +1846 +705C +ENDCHAR +STARTCHAR U+5CAB +ENCODING 23723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +5440 +55F8 +5548 +5548 +5548 +55F8 +5548 +7D48 +4548 +41F8 +0108 +0000 +ENDCHAR +STARTCHAR U+5CAC +ENCODING 23724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +11FC +1124 +1124 +55FC +5524 +5524 +55FC +5524 +7C20 +4420 +4020 +0020 +0020 +0000 +ENDCHAR +STARTCHAR U+5CAD +ENCODING 23725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1050 +1050 +5488 +554E +5624 +5420 +5400 +55FC +5404 +5C08 +7450 +4420 +0010 +0010 +ENDCHAR +STARTCHAR U+5CAE +ENCODING 23726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1010 +11FF +1101 +5501 +5440 +5442 +5444 +5478 +5440 +7C40 +4441 +0041 +007F +0000 +0000 +ENDCHAR +STARTCHAR U+5CAF +ENCODING 23727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +11FF +1004 +5408 +5410 +5430 +5458 +5494 +5512 +5411 +7C10 +4410 +0010 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+5CB0 +ENCODING 23728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +1024 +105F +1085 +5515 +55E5 +5445 +5485 +5525 +55E5 +7C29 +4411 +0025 +0042 +0000 +0000 +ENDCHAR +STARTCHAR U+5CB1 +ENCODING 23729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0888 +10FC +17C0 +3040 +5024 +1014 +110C +0100 +1110 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5CB2 +ENCODING 23730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FE +2102 +2102 +A902 +A902 +A902 +A9FE +A848 +A848 +A848 +F8C8 +0088 +0189 +0309 +0607 +ENDCHAR +STARTCHAR U+5CB3 +ENCODING 23731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +00C0 +0F00 +0800 +0FF8 +0840 +0840 +7FFC +0100 +1110 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+5CB4 +ENCODING 23732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200C +2038 +21E0 +2100 +A900 +A900 +A9FE +A908 +A908 +A908 +A908 +F908 +0108 +0108 +07FF +0000 +ENDCHAR +STARTCHAR U+5CB5 +ENCODING 23733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1024 +55FE +5420 +5420 +5420 +5424 +55FE +5504 +5504 +7D04 +0504 +01FC +0104 +ENDCHAR +STARTCHAR U+5CB6 +ENCODING 23734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +1040 +55F8 +5508 +5508 +5508 +55F8 +5508 +5508 +7D08 +4508 +41F8 +0108 +0000 +ENDCHAR +STARTCHAR U+5CB7 +ENCODING 23735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +5508 +55F8 +5528 +5520 +55FC +5520 +5520 +7D10 +4554 +418C +0604 +0000 +ENDCHAR +STARTCHAR U+5CB8 +ENCODING 23736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1FF0 +0000 +1FFC +1000 +17F0 +1080 +1080 +2FF8 +2080 +4080 +0080 +0000 +ENDCHAR +STARTCHAR U+5CBA +ENCODING 23738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +2082 +0140 +0220 +0410 +180C +63E3 +0000 +0FF8 +0208 +0208 +0230 +0200 +ENDCHAR +STARTCHAR U+5CBB +ENCODING 23739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +11E0 +1120 +5520 +5520 +55FC +5520 +5520 +5510 +5550 +7D94 +460C +43EC +0004 +0000 +ENDCHAR +STARTCHAR U+5CBC +ENCODING 23740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +5550 +5548 +5648 +5440 +57FC +5440 +5440 +7C40 +4440 +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+5CBD +ENCODING 23741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0200 +0204 +FFFE +0400 +0480 +0890 +1FF8 +0080 +0890 +108C +6284 +0100 +ENDCHAR +STARTCHAR U+5CBE +ENCODING 23742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +547C +5440 +5440 +5440 +55F8 +5508 +5508 +7D08 +4508 +41F8 +0108 +0000 +ENDCHAR +STARTCHAR U+5CBF +ENCODING 23743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +2008 +0804 +4FFE +4804 +4804 +4BFC +4804 +5004 +1004 +27FC +4004 +8000 +ENDCHAR +STARTCHAR U+5CC0 +ENCODING 23744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +4081 +4081 +4081 +7FFF +4001 +0000 +3FFE +2082 +2082 +3FFE +2082 +2082 +3FFE +2002 +ENDCHAR +STARTCHAR U+5CC1 +ENCODING 23745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0404 +78FE +4284 +4284 +4284 +4284 +4E84 +72A4 +0498 +0480 +1880 +6080 +ENDCHAR +STARTCHAR U+5CC4 +ENCODING 23748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FC +1088 +1050 +5420 +54D8 +5706 +5420 +55FC +5420 +5424 +57FE +7C20 +0420 +0020 +0020 +ENDCHAR +STARTCHAR U+5CC5 +ENCODING 23749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1090 +5498 +57E4 +5490 +5490 +5490 +57FC +7C90 +4510 +4110 +0210 +0410 +0000 +ENDCHAR +STARTCHAR U+5CC6 +ENCODING 23750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1028 +1044 +1082 +5501 +547C +5400 +5400 +54FE +5482 +7C82 +4482 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+5CC7 +ENCODING 23751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +2108 +3FF8 +2108 +0280 +0440 +1FF0 +600C +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5CC8 +ENCODING 23752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +107E +1084 +5528 +5410 +5428 +5444 +5583 +54FE +7C82 +4482 +0082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+5CC9 +ENCODING 23753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +2104 +3FFC +0200 +07F0 +0C10 +7E60 +03C0 +0E70 +F81F +0FF0 +0810 +0810 +0FF0 +ENDCHAR +STARTCHAR U+5CCA +ENCODING 23754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1FFC +7004 +1FFC +1000 +1FFC +1004 +1FFC +1000 +0080 +2082 +2082 +3FFE +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+5CCB +ENCODING 23755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1084 +10FE +5504 +5624 +55F4 +5524 +5524 +55E4 +5524 +5524 +7DE4 +0504 +0028 +0010 +ENDCHAR +STARTCHAR U+5CCC +ENCODING 23756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +11FF +1010 +1020 +5442 +54FE +5412 +5410 +5410 +54FE +7C10 +4410 +0010 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+5CCE +ENCODING 23758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +0000 +1FFC +1004 +1FFC +1004 +1FFC +1002 +1024 +1118 +1208 +7C07 +0000 +0000 +ENDCHAR +STARTCHAR U+5CCF +ENCODING 23759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1010 +1020 +5440 +55FF +5529 +5529 +5529 +5529 +7D29 +4529 +0129 +0129 +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+5CD0 +ENCODING 23760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1012 +11FF +5420 +5444 +5488 +55F2 +5424 +5448 +7C90 +4428 +0044 +0082 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+5CD2 +ENCODING 23762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +1114 +55FC +5504 +5504 +5574 +5554 +5554 +5554 +5574 +7D54 +0504 +0114 +0108 +ENDCHAR +STARTCHAR U+5CD3 +ENCODING 23763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1010 +54FE +5412 +55FE +5510 +55FF +7C11 +4411 +002A +0044 +0082 +0301 +0000 +0000 +ENDCHAR +STARTCHAR U+5CD4 +ENCODING 23764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1021 +10FE +1024 +5428 +55FF +5420 +5440 +54C0 +557E +7C40 +4440 +0040 +007F +0000 +0000 +ENDCHAR +STARTCHAR U+5CD6 +ENCODING 23766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1101 +1141 +5444 +55FF +5444 +5444 +5444 +7C28 +4410 +0028 +0044 +0383 +0000 +0000 +ENDCHAR +STARTCHAR U+5CD7 +ENCODING 23767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20FC +2188 +2110 +ABFF +A900 +A900 +A97C +A944 +A944 +A944 +F94C +0140 +0141 +0163 +023E +ENDCHAR +STARTCHAR U+5CD8 +ENCODING 23768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +11FF +1000 +54FE +5482 +5482 +54FE +5482 +5482 +7CFE +4482 +0000 +0002 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+5CD9 +ENCODING 23769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +11F8 +5440 +5440 +57FC +5410 +5410 +57FC +5510 +7C90 +4490 +4010 +0030 +0000 +ENDCHAR +STARTCHAR U+5CDA +ENCODING 23770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0080 +0100 +3FFE +0410 +0888 +1084 +2FFA +4081 +0080 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5CDB +ENCODING 23771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +0000 +7FC1 +0811 +0F91 +1091 +3111 +0A11 +0401 +0801 +7005 +0002 +0000 +0000 +ENDCHAR +STARTCHAR U+5CDD +ENCODING 23773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +2104 +3FFC +0000 +7FFE +4002 +4FF2 +4002 +47E2 +4422 +4422 +47E2 +4002 +400E +ENDCHAR +STARTCHAR U+5CDE +ENCODING 23774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +0100 +03F8 +0410 +1FFE +1000 +17FC +1204 +2278 +4201 +0201 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+5CDF +ENCODING 23775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +0200 +7FFF +0800 +13FC +2204 +43FC +0204 +03FC +0204 +0214 +0408 +0000 +0000 +ENDCHAR +STARTCHAR U+5CE0 +ENCODING 23776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +1078 +1040 +5440 +57FC +5400 +57FC +5460 +5450 +7C48 +4440 +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+5CE1 +ENCODING 23777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1040 +13F8 +1040 +5648 +5548 +5550 +57FC +5440 +7CA0 +4490 +4110 +0208 +0C04 +0000 +ENDCHAR +STARTCHAR U+5CE4 +ENCODING 23780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +203C +23C0 +2040 +A844 +AFFE +A8A0 +A910 +A918 +AB16 +AD10 +A910 +F910 +0910 +0210 +0410 +ENDCHAR +STARTCHAR U+5CE5 +ENCODING 23781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10F8 +1110 +5624 +55FE +5424 +5424 +57FE +5424 +5424 +55FC +7C24 +0420 +00A0 +0040 +ENDCHAR +STARTCHAR U+5CE6 +ENCODING 23782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0440 +1450 +1448 +2444 +2444 +4440 +0100 +2108 +2108 +2108 +2108 +3FF8 +2008 +ENDCHAR +STARTCHAR U+5CE8 +ENCODING 23784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +10A8 +13A4 +10A4 +54A0 +57FC +54A4 +54A8 +54D8 +5590 +7EB0 +44CC +408C +0184 +0000 +ENDCHAR +STARTCHAR U+5CE9 +ENCODING 23785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +2008 +0650 +3848 +0840 +7FFC +0848 +0E48 +7830 +0874 +098C +1804 +0000 +ENDCHAR +STARTCHAR U+5CEA +ENCODING 23786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +1090 +1108 +5648 +5440 +54A0 +54A0 +5510 +57F8 +5514 +7D10 +4510 +41F0 +0110 +0000 +ENDCHAR +STARTCHAR U+5CEC +ENCODING 23788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +1012 +11FF +1010 +54FE +5492 +54FE +5492 +54FE +5492 +7C92 +4492 +0092 +0084 +0000 +0000 +ENDCHAR +STARTCHAR U+5CED +ENCODING 23789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1150 +1148 +5644 +5444 +55F8 +5508 +55F8 +5508 +7DF8 +4508 +4108 +0108 +0118 +0000 +ENDCHAR +STARTCHAR U+5CEE +ENCODING 23790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +2044 +2044 +ABFF +A844 +A844 +A9FC +A880 +A880 +A9FE +FB82 +0682 +0082 +0082 +00FE +ENDCHAR +STARTCHAR U+5CEF +ENCODING 23791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1FF0 +0200 +07E0 +3C40 +0380 +0D60 +77DC +0100 +0FE0 +0100 +3FF8 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5CF0 +ENCODING 23792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +10F8 +1390 +1060 +54B0 +574C +57F8 +5440 +55F0 +7C40 +47FC +4040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+5CF1 +ENCODING 23793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +8BF8 +5048 +2048 +27FF +5088 +9088 +1088 +37FF +3020 +5020 +9222 +1222 +1222 +3222 +E3FE +ENDCHAR +STARTCHAR U+5CF2 +ENCODING 23794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2084 +2084 +2084 +3FFC +0000 +0604 +3C44 +0844 +7F44 +0844 +1C44 +1A44 +2904 +4804 +081C +ENDCHAR +STARTCHAR U+5CF4 +ENCODING 23796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1104 +5504 +55FC +5504 +5504 +55FC +5504 +5504 +55FC +7C50 +4450 +0091 +011F +0600 +ENDCHAR +STARTCHAR U+5CF6 +ENCODING 23798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0820 +0FE0 +0820 +0FE0 +0800 +0FFC +0800 +0FFC +2224 +2224 +3FE4 +2038 +0000 +ENDCHAR +STARTCHAR U+5CF7 +ENCODING 23799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +0000 +0080 +3FFE +0410 +0220 +7FFF +0080 +0080 +3FFE +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5CF8 +ENCODING 23800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +100A +1009 +11FF +5508 +5508 +55C8 +5549 +554A +7D4C +4548 +0259 +04A5 +0003 +0000 +0000 +ENDCHAR +STARTCHAR U+5CF9 +ENCODING 23801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07F0 +0808 +17F4 +6083 +1FFC +0490 +0888 +3086 +0000 +0080 +2082 +2082 +3FFE +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+5CFA +ENCODING 23802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1040 +55F8 +5548 +55F8 +5548 +55F8 +5748 +5540 +7C80 +44C0 +4330 +0C0C +0000 +ENDCHAR +STARTCHAR U+5CFB +ENCODING 23803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1050 +1098 +57E4 +54A0 +54A4 +559C +56F0 +5490 +7DA0 +4640 +40A0 +0318 +0C04 +0000 +ENDCHAR +STARTCHAR U+5CFD +ENCODING 23805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +5550 +5550 +5550 +56E8 +5644 +5444 +54A0 +7CA0 +4510 +4208 +0404 +0000 +ENDCHAR +STARTCHAR U+5CFF +ENCODING 23807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1020 +1020 +54FC +5424 +5424 +55FF +5400 +54FE +7C82 +4482 +0082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+5D00 +ENCODING 23808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0080 +1FFC +1004 +1FFC +1004 +1FFC +1042 +1024 +1210 +3C0F +0000 +0000 +ENDCHAR +STARTCHAR U+5D01 +ENCODING 23809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +4102 +7FFE +1080 +1080 +FDFE +1102 +1326 +1024 +1020 +1070 +1C58 +F0CC +0187 +ENDCHAR +STARTCHAR U+5D02 +ENCODING 23810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1094 +17FE +1090 +5400 +57FE +5642 +5444 +55F8 +5448 +5448 +5448 +7C88 +0488 +0128 +0210 +ENDCHAR +STARTCHAR U+5D03 +ENCODING 23811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +13FE +5420 +5524 +54A8 +5420 +57FE +5420 +5470 +54A8 +7CA8 +0524 +0222 +0020 +ENDCHAR +STARTCHAR U+5D06 +ENCODING 23814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1020 +11FE +5502 +5654 +5488 +5504 +5400 +55FC +5420 +5420 +7C20 +0424 +03FE +0000 +ENDCHAR +STARTCHAR U+5D07 +ENCODING 23815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1FF0 +0100 +3FFC +2008 +4FE0 +0000 +7FFC +0920 +0910 +1108 +2108 +0300 +0000 +ENDCHAR +STARTCHAR U+5D0B +ENCODING 23819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0000 +3FF8 +0920 +7FFC +0920 +0920 +3FF8 +0100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5D0C +ENCODING 23820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1101 +11FF +1108 +5508 +557F +5508 +5508 +557F +7D41 +4541 +0141 +027F +0041 +0000 +0000 +ENDCHAR +STARTCHAR U+5D0D +ENCODING 23821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +55FF +5410 +5410 +5492 +5492 +5555 +5638 +5410 +7C38 +4458 +0094 +0112 +0211 +ENDCHAR +STARTCHAR U+5D0E +ENCODING 23822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +2A20 +2A50 +2A88 +2BFC +2A08 +2AE8 +2AA8 +3EE8 +22A8 +2008 +0018 +0000 +ENDCHAR +STARTCHAR U+5D0F +ENCODING 23823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +11FE +1088 +5488 +54FF +5488 +54C5 +5583 +54FE +7C82 +44FE +0082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+5D11 +ENCODING 23825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +2008 +1FF0 +1010 +1FF0 +1010 +1FF0 +1098 +1EE0 +1084 +1C84 +707C +0000 +ENDCHAR +STARTCHAR U+5D12 +ENCODING 23826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +3FFC +0100 +0100 +7FFE +0810 +0810 +1C38 +366C +0100 +7FFE +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+5D14 +ENCODING 23828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +2108 +3FF8 +2448 +0480 +0FF8 +0880 +1FF0 +2880 +4FF0 +0880 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+5D15 +ENCODING 23829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +1120 +55F8 +5520 +5520 +55FC +5520 +5520 +55F8 +7D20 +4620 +43FC +0400 +0000 +ENDCHAR +STARTCHAR U+5D16 +ENCODING 23830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1FF0 +0000 +1FFC +1080 +17F0 +1080 +1FF8 +1080 +27F0 +2080 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5D17 +ENCODING 23831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0000 +3FF8 +2448 +2288 +3FF8 +2108 +2928 +2928 +2FE8 +2828 +2018 +0000 +ENDCHAR +STARTCHAR U+5D18 +ENCODING 23832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +5510 +57F8 +5404 +57F8 +56A8 +56A8 +57F8 +7EA8 +46A8 +42A8 +0218 +0000 +ENDCHAR +STARTCHAR U+5D19 +ENCODING 23833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +2108 +3FF8 +2288 +0440 +1FF0 +600C +1FF0 +1290 +1FF0 +1290 +1290 +1030 +0000 +ENDCHAR +STARTCHAR U+5D1A +ENCODING 23834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +11F8 +1040 +57FC +54A0 +54A4 +555C +5640 +54F0 +5510 +7EA0 +4440 +41B0 +0E0C +0000 +ENDCHAR +STARTCHAR U+5D1B +ENCODING 23835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +1104 +5504 +55FC +5520 +55A8 +55A8 +55F8 +7E20 +4724 +4524 +09FC +0104 +0000 +ENDCHAR +STARTCHAR U+5D1D +ENCODING 23837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1010 +11FF +5410 +57FF +5400 +54FE +5482 +54FE +7C82 +44FE +0082 +0106 +0000 +0000 +ENDCHAR +STARTCHAR U+5D1E +ENCODING 23838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1048 +13FC +1000 +55F8 +5508 +55F8 +5400 +55F8 +5410 +5460 +57FE +7C40 +0440 +0140 +0080 +ENDCHAR +STARTCHAR U+5D1F +ENCODING 23839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +2108 +3FF8 +2288 +0440 +1FF0 +610C +1FF0 +0920 +0520 +0540 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+5D20 +ENCODING 23840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1010 +54FE +5492 +54FE +5492 +54FE +5438 +7C54 +4492 +0111 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5D22 +ENCODING 23842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +11F0 +1148 +5524 +5604 +55F8 +5448 +57FC +5448 +55F8 +7C48 +4440 +4040 +00C0 +0000 +ENDCHAR +STARTCHAR U+5D23 +ENCODING 23843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +7FFE +0070 +1FC0 +0100 +FFFF +0920 +711C +0300 +FFFF +0420 +0E40 +03C0 +3E7C +ENDCHAR +STARTCHAR U+5D24 +ENCODING 23844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1090 +1060 +1090 +5548 +5440 +57FE +5480 +54F8 +5588 +56F8 +5488 +7CF8 +0488 +00A8 +0090 +ENDCHAR +STARTCHAR U+5D25 +ENCODING 23845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1040 +10FE +1192 +54FE +5492 +54FE +54A2 +5450 +5490 +7DFF +4410 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5D26 +ENCODING 23846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +13FE +5450 +54A8 +55FC +5726 +5524 +55FC +5524 +5524 +7DFC +0420 +0022 +001E +ENDCHAR +STARTCHAR U+5D27 +ENCODING 23847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0800 +0810 +0890 +7E90 +0908 +1D48 +2A46 +2880 +4890 +8908 +09FC +0804 +ENDCHAR +STARTCHAR U+5D28 +ENCODING 23848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1010 +54FE +5412 +55FF +5412 +54FE +5410 +7C90 +449E +0190 +0250 +043F +0000 +0000 +ENDCHAR +STARTCHAR U+5D29 +ENCODING 23849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1FF0 +0000 +1E78 +1248 +1E78 +1248 +1E78 +1248 +2288 +2288 +4718 +0000 +ENDCHAR +STARTCHAR U+5D2B +ENCODING 23851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +3FFC +0000 +3FFC +2004 +3FFC +2080 +2488 +2488 +27F8 +6080 +4884 +C884 +0FFC +ENDCHAR +STARTCHAR U+5D2D +ENCODING 23853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +3FF8 +1000 +141C +FEE0 +2080 +4884 +7EFE +0890 +0E90 +F890 +4910 +0910 +0A10 +0810 +ENDCHAR +STARTCHAR U+5D2E +ENCODING 23854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0000 +3FF8 +2108 +2FE8 +2108 +27C8 +2448 +2448 +27C8 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+5D30 +ENCODING 23856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0049 +1092 +1124 +5524 +5492 +5449 +55FF +5511 +5511 +7DFF +4511 +0111 +01FF +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+5D31 +ENCODING 23857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +7FFE +0000 +7F02 +4122 +4122 +7F22 +4122 +7F22 +4122 +4102 +7F02 +1402 +630E +ENDCHAR +STARTCHAR U+5D32 +ENCODING 23858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0080 +11FE +1082 +54FE +5482 +54FE +5400 +54FE +5410 +7CFE +4410 +0010 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+5D33 +ENCODING 23859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0030 +1048 +1084 +1102 +56FD +5400 +55E2 +552A +55EA +552A +7DEA +452A +0122 +0044 +0000 +0000 +ENDCHAR +STARTCHAR U+5D34 +ENCODING 23860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0050 +3FFE +2040 +3FC4 +2444 +3FC8 +24A8 +2930 +4620 +4552 +988A +0006 +ENDCHAR +STARTCHAR U+5D35 +ENCODING 23861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +1082 +10FE +5482 +54FE +5400 +55FF +5440 +54FF +5529 +7C29 +4429 +0051 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+5D36 +ENCODING 23862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0000 +0804 +3E7F +0804 +7F44 +0824 +3E14 +0804 +7F04 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+5D37 +ENCODING 23863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +1044 +11FF +1028 +5428 +55FF +5529 +5529 +5529 +5545 +5583 +7D7D +4501 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+5D38 +ENCODING 23864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1010 +1020 +10FE +5482 +5482 +54FE +5482 +54FE +5482 +7CFE +4444 +0082 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+5D39 +ENCODING 23865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2084 +A8CC +A848 +ABFF +AA21 +AA21 +A9FE +A922 +F922 +0122 +0126 +0020 +0020 +ENDCHAR +STARTCHAR U+5D3A +ENCODING 23866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0000 +1080 +11FF +7C10 +2090 +3DFE +2492 +4490 +0481 +18FF +0000 +0000 +ENDCHAR +STARTCHAR U+5D3C +ENCODING 23868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +1082 +10FE +1082 +54FE +5400 +55FF +5410 +5490 +5490 +7C9E +4490 +0150 +023F +0000 +0000 +ENDCHAR +STARTCHAR U+5D3D +ENCODING 23869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +0200 +5108 +5106 +9012 +0FF0 +0000 +ENDCHAR +STARTCHAR U+5D3E +ENCODING 23870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1050 +1054 +55FE +5554 +5554 +55FC +5440 +5444 +57FE +5488 +7C90 +0460 +0098 +0304 +ENDCHAR +STARTCHAR U+5D3F +ENCODING 23871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2252 +2252 +ABDE +A800 +A9FE +A800 +ABFF +A840 +A880 +F9FE +0002 +0002 +0006 +001C +ENDCHAR +STARTCHAR U+5D40 +ENCODING 23872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0000 +0820 +0810 +3EFE +0810 +1C10 +2AFE +4910 +0810 +09FF +0000 +0000 +ENDCHAR +STARTCHAR U+5D41 +ENCODING 23873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +1044 +11FF +1044 +547C +5444 +547C +5444 +55FF +5494 +7C94 +44A6 +0080 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+5D42 +ENCODING 23874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +7FFE +1020 +33FE +6022 +C7FF +1022 +33FE +6020 +E3FE +2020 +27FF +2020 +2020 +ENDCHAR +STARTCHAR U+5D43 +ENCODING 23875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2084 +A848 +ABFF +AA04 +AA1C +AAF2 +AA06 +AA3C +FAE1 +0203 +0206 +041C +00F0 +ENDCHAR +STARTCHAR U+5D45 +ENCODING 23877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0028 +0024 +3FFE +2020 +2F20 +2024 +2F28 +2911 +2F29 +40C7 +0000 +0000 +ENDCHAR +STARTCHAR U+5D46 +ENCODING 23878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +022C +3C26 +0820 +FEFF +0820 +1C70 +1A50 +28D1 +4899 +090F +0000 +0100 +2104 +2104 +2104 +3FFC +ENDCHAR +STARTCHAR U+5D47 +ENCODING 23879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0CA0 +F094 +17FE +10A0 +FCA0 +1122 +3122 +3A1E +5440 +5040 +9248 +1248 +1248 +13F8 +1008 +ENDCHAR +STARTCHAR U+5D48 +ENCODING 23880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200E +27F8 +2242 +AB66 +A924 +ABFE +A840 +AFFF +A880 +A8FC +A984 +FB0C +06D8 +0070 +01DC +0707 +ENDCHAR +STARTCHAR U+5D49 +ENCODING 23881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1000 +107C +5444 +547C +5400 +55FF +5501 +7C7C +4410 +0010 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5D4A +ENCODING 23882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +203C +27C0 +2044 +AFFE +A840 +A950 +AF5C +A950 +AF5C +A8E0 +A950 +F948 +0A4E +0444 +0040 +ENDCHAR +STARTCHAR U+5D4B +ENCODING 23883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1128 +5528 +55F8 +5500 +5578 +5548 +5578 +5548 +7D78 +4648 +4278 +0448 +0000 +ENDCHAR +STARTCHAR U+5D4C +ENCODING 23884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +2108 +3FF8 +2448 +2440 +7F7C +24A8 +2530 +3C60 +2450 +2490 +3D08 +2604 +0000 +ENDCHAR +STARTCHAR U+5D4E +ENCODING 23886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1150 +55F0 +5550 +5550 +55F0 +5440 +57F8 +5668 +7E58 +47F8 +4208 +0218 +0000 +ENDCHAR +STARTCHAR U+5D50 +ENCODING 23888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1FF0 +0000 +1FF0 +10D0 +1F10 +17D0 +1550 +17D0 +1554 +21EC +2E2C +4004 +0000 +ENDCHAR +STARTCHAR U+5D51 +ENCODING 23889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FC +2104 +2104 +21FC +A904 +A904 +A9FC +A880 +A9FF +AB01 +AE31 +FBE1 +0201 +0213 +01F2 +000E +ENDCHAR +STARTCHAR U+5D52 +ENCODING 23890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0000 +3EF8 +2288 +3EF8 +2288 +0100 +2108 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5D55 +ENCODING 23893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2102 +214A +2132 +214A +A902 +A9FE +A888 +A988 +AB47 +A8FC +A984 +FB4C +0058 +0030 +00EC +0387 +ENDCHAR +STARTCHAR U+5D58 +ENCODING 23896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FE +1088 +5400 +55FE +5502 +5624 +5420 +55FE +5420 +5470 +7CA8 +0526 +0224 +0020 +ENDCHAR +STARTCHAR U+5D59 +ENCODING 23897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +3FFC +0000 +0E04 +F8C4 +1064 +1004 +FEC4 +1064 +3807 +743C +52E4 +9004 +1004 +ENDCHAR +STARTCHAR U+5D5B +ENCODING 23899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +2108 +3FF8 +0100 +06C0 +3830 +CFEE +0008 +3E48 +2248 +3E48 +2248 +3E48 +2248 +2618 +ENDCHAR +STARTCHAR U+5D5C +ENCODING 23900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0100 +3FF8 +0820 +0440 +7FFC +0010 +1F10 +1110 +1F10 +1110 +0030 +0000 +ENDCHAR +STARTCHAR U+5D5D +ENCODING 23901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +10A8 +5420 +57FE +5420 +54A8 +5524 +5440 +57FE +5488 +5508 +7C90 +0460 +0098 +0304 +ENDCHAR +STARTCHAR U+5D5E +ENCODING 23902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01C0 +0220 +3C1E +03E0 +0080 +1FFC +0490 +0888 +1084 +0988 +4949 +4949 +7F7F +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+5D5F +ENCODING 23903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +3FFC +0000 +3FFE +2220 +2440 +2FFC +3840 +2FFC +2840 +6FFC +4840 +C840 +0FFE +ENDCHAR +STARTCHAR U+5D60 +ENCODING 23904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +203C +23C2 +2466 +AE24 +AA40 +A8C8 +A990 +A8A4 +A87E +ABC3 +F820 +07FF +0050 +018C +0707 +ENDCHAR +STARTCHAR U+5D61 +ENCODING 23905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +7FFE +0420 +1D38 +730E +0220 +07F0 +1C18 +7EFE +2222 +1212 +0E0E +1212 +6666 +ENDCHAR +STARTCHAR U+5D62 +ENCODING 23906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +20D8 +218C +AB77 +A800 +A9FC +A904 +A9FC +A904 +A9FC +F900 +03FE +0282 +0682 +00FE +ENDCHAR +STARTCHAR U+5D63 +ENCODING 23907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1110 +55FE +5512 +55FF +5512 +55FE +5500 +7D7E +4542 +0142 +027E +0042 +0000 +0000 +ENDCHAR +STARTCHAR U+5D64 +ENCODING 23908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2952 +2A54 +1428 +2244 +0000 +7FFE +4002 +4002 +4102 +0100 +0100 +2104 +2104 +2104 +3FFC +ENDCHAR +STARTCHAR U+5D65 +ENCODING 23909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0042 +10EF +112A +54AA +546A +544F +5482 +5410 +55FF +7C38 +4454 +0092 +0111 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5D67 +ENCODING 23911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01CF +1109 +1129 +5569 +5596 +5400 +54FE +5492 +5492 +7CFE +4492 +0092 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+5D68 +ENCODING 23912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +107E +10C2 +1142 +547E +5440 +547F +5440 +547F +5401 +7D55 +4555 +0001 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+5D69 +ENCODING 23913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1FF0 +0100 +7FFC +0FE0 +0820 +0FE0 +3FF8 +2008 +27C8 +2448 +27C8 +2018 +0000 +ENDCHAR +STARTCHAR U+5D6A +ENCODING 23914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2000 +A8FC +A884 +A8FC +A800 +ABFF +AA01 +AAFD +FA85 +0285 +02FD +0201 +0207 +ENDCHAR +STARTCHAR U+5D6B +ENCODING 23915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +1000 +13FE +5488 +5488 +5510 +5554 +57B8 +5488 +5510 +5514 +7EA4 +03FC +0084 +0000 +ENDCHAR +STARTCHAR U+5D6C +ENCODING 23916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0200 +1FF0 +1110 +1FF0 +1110 +1FF0 +12B0 +02A8 +04FC +1884 +607C +0000 +ENDCHAR +STARTCHAR U+5D6D +ENCODING 23917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2084 +A848 +ABFF +AA01 +AA21 +A820 +ABFF +A840 +F87E +0042 +00C2 +0182 +030E +ENDCHAR +STARTCHAR U+5D6F +ENCODING 23919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +1090 +13FC +1040 +55F8 +5440 +57FC +5480 +55F8 +7D20 +4620 +4420 +0BFC +0000 +0000 +ENDCHAR +STARTCHAR U+5D70 +ENCODING 23920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2090 +27FF +2090 +ABFE +A892 +A892 +AFFF +A892 +A892 +ABFE +F898 +0194 +0296 +0493 +0090 +ENDCHAR +STARTCHAR U+5D71 +ENCODING 23921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1010 +11FF +5529 +5545 +5492 +5428 +5444 +5583 +7CFE +4482 +0082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+5D72 +ENCODING 23922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1020 +10FE +1082 +54FE +54FE +5482 +54FE +5410 +55FF +7C54 +4492 +0111 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+5D73 +ENCODING 23923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0440 +7FFC +0100 +1FF0 +0100 +7FFC +0800 +0FF0 +1100 +3FFC +4000 +0000 +ENDCHAR +STARTCHAR U+5D74 +ENCODING 23924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2248 +2150 +AA48 +A8A0 +A910 +ABFE +AD14 +A910 +A9F0 +A910 +A910 +F9F0 +0910 +0150 +0120 +ENDCHAR +STARTCHAR U+5D76 +ENCODING 23926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1088 +5488 +57F8 +5640 +5640 +57F8 +5598 +56E8 +7D98 +46E8 +4088 +0330 +0000 +ENDCHAR +STARTCHAR U+5D77 +ENCODING 23927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0122 +1122 +1122 +1222 +54D5 +5500 +5708 +5508 +554F +5548 +7D48 +4548 +01A8 +011F +0000 +0000 +ENDCHAR +STARTCHAR U+5D79 +ENCODING 23929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +7FFE +0080 +F988 +091C +0BF6 +7840 +43FC +4244 +7A44 +0BFC +0840 +1844 +107E +73C2 +ENDCHAR +STARTCHAR U+5D7A +ENCODING 23930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2042 +214A +A8C6 +A94A +A820 +A870 +A9DC +AF07 +A820 +F9C8 +0032 +01C4 +0018 +01E0 +ENDCHAR +STARTCHAR U+5D7C +ENCODING 23932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1044 +1028 +55FF +5548 +5548 +557E +5588 +5508 +7D7E +4508 +0208 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+5D7D +ENCODING 23933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00AA +11FF +10AA +113B +5400 +55FF +5511 +5511 +54FE +5492 +7C92 +4496 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5D7E +ENCODING 23934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +3FFC +0220 +0FF0 +1020 +2444 +7EFE +0180 +0660 +18D8 +EF07 +00E0 +0F08 +0070 +1F80 +ENDCHAR +STARTCHAR U+5D7F +ENCODING 23935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +7FFE +0000 +01FE +FE20 +11FE +1102 +11FE +1102 +11FE +1102 +11FE +7084 +0102 +ENDCHAR +STARTCHAR U+5D80 +ENCODING 23936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1010 +11FF +1155 +5555 +5400 +547C +5400 +55FF +5440 +7C7E +4402 +0002 +001C +0000 +0000 +ENDCHAR +STARTCHAR U+5D81 +ENCODING 23937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +21FC +2124 +2BFF +A924 +A9FC +A820 +A9FC +A924 +A9FC +A840 +FBFF +0088 +01D0 +0078 +03CF +ENDCHAR +STARTCHAR U+5D82 +ENCODING 23938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1120 +57FC +5400 +55F0 +5510 +55F0 +5510 +55F0 +7C40 +47FC +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+5D83 +ENCODING 23939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2081 +2083 +27FE +2088 +ABE8 +AAAF +AAAA +ABEA +AAAA +AAAA +ABEA +F88A +07FA +0092 +00A2 +0082 +ENDCHAR +STARTCHAR U+5D84 +ENCODING 23940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0808 +7F30 +08C0 +3E80 +2AFC +3E90 +2A90 +3E90 +0910 +7F10 +0A10 +0000 +ENDCHAR +STARTCHAR U+5D86 +ENCODING 23942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +11FF +1028 +11FF +5529 +55FF +5529 +55FF +5400 +54FE +7C82 +44FE +0082 +00FE +0000 +0000 +ENDCHAR +STARTCHAR U+5D87 +ENCODING 23943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1200 +56F0 +5690 +56F0 +5600 +57F8 +5768 +5768 +7FF8 +4600 +43FC +0200 +0000 +ENDCHAR +STARTCHAR U+5D88 +ENCODING 23944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +3FFC +0000 +4410 +447E +45D2 +7C5C +05F0 +0408 +FDFF +2488 +2448 +6408 +C418 +ENDCHAR +STARTCHAR U+5D89 +ENCODING 23945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0048 +0088 +7DFF +4688 +44FF +4488 +44FF +7C88 +44FF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5D8A +ENCODING 23946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +3FFC +0000 +1048 +1090 +7DFE +1290 +1090 +10FC +1C90 +70FC +1090 +1090 +30FE +ENDCHAR +STARTCHAR U+5D8B +ENCODING 23947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +11F0 +1110 +55F0 +5510 +55F0 +5500 +55FC +5500 +7DFC +4754 +42AC +0484 +0818 +0000 +ENDCHAR +STARTCHAR U+5D8C +ENCODING 23948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0100 +0FE0 +0820 +0FE0 +0FE0 +0800 +0FFC +0FF8 +2A88 +2548 +4030 +0000 +ENDCHAR +STARTCHAR U+5D8D +ENCODING 23949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +1021 +11ED +5421 +55ED +5421 +54C6 +5440 +54FF +7D81 +46FF +0081 +00FF +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+5D90 +ENCODING 23952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0040 +3CF8 +2790 +2860 +339C +29F0 +25F8 +2540 +3BF0 +2040 +27FC +0000 +ENDCHAR +STARTCHAR U+5D92 +ENCODING 23954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2050 +218C +2777 +A800 +ABFE +AA22 +AAAA +AA22 +ABFE +A800 +F9FC +0104 +01FC +0104 +01FC +ENDCHAR +STARTCHAR U+5D93 +ENCODING 23955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +201C +20F0 +2122 +20A4 +ABFF +A8A8 +A9AC +AB26 +AA23 +A800 +A9FE +F922 +01FE +0122 +0122 +01FE +ENDCHAR +STARTCHAR U+5D94 +ENCODING 23956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +3FFC +0820 +1C20 +367E +6042 +7ED6 +0814 +7F10 +0810 +6A38 +2828 +0F6C +78C6 +ENDCHAR +STARTCHAR U+5D95 +ENCODING 23957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2090 +21FE +2110 +AB10 +ADFC +A910 +A910 +A9FC +A910 +A910 +F9FE +0000 +0154 +0356 +0653 +ENDCHAR +STARTCHAR U+5D97 +ENCODING 23959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +12B5 +11CE +5484 +554A +5631 +57FF +5621 +55FE +7C22 +4422 +0042 +0082 +010C +0000 +0000 +ENDCHAR +STARTCHAR U+5D99 +ENCODING 23961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2248 +2150 +2044 +AFFE +A950 +AA48 +AC44 +AA08 +ABBC +ACA8 +AAA8 +F97E +0908 +0208 +0408 +ENDCHAR +STARTCHAR U+5D9A +ENCODING 23962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1FFC +0080 +3FFE +0220 +4411 +2FFA +180C +2FFA +4809 +0FF8 +0490 +0888 +1184 +0000 +0000 +ENDCHAR +STARTCHAR U+5D9B +ENCODING 23963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +27FF +2088 +AA8A +A904 +ABFE +AD05 +A9FC +A904 +A9FC +F820 +0124 +0326 +0623 +0060 +ENDCHAR +STARTCHAR U+5D9C +ENCODING 23964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +0000 +3E3E +2828 +3F3F +1414 +6727 +0FFC +0804 +0FFC +0804 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5D9D +ENCODING 23965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10E0 +1068 +1150 +5494 +55F8 +5608 +55F4 +5510 +5510 +7DF0 +4510 +40A0 +03FC +0000 +0000 +ENDCHAR +STARTCHAR U+5D9E +ENCODING 23966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C40 +45FF +48BE +5108 +48FF +447E +447E +687E +5042 +4084 +2082 +2082 +3FFE +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+5D9F +ENCODING 23967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2102 +2084 +23FF +2050 +A9FE +A952 +A99E +A902 +A9FE +A902 +A9FE +F804 +03FF +0084 +0044 +001C +ENDCHAR +STARTCHAR U+5DA0 +ENCODING 23968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +10F0 +1010 +11FF +5448 +54FC +574B +5478 +5400 +55FE +5502 +557A +7D4A +457A +0102 +010E +ENDCHAR +STARTCHAR U+5DA1 +ENCODING 23969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0000 +3FFF +2890 +2510 +2F9E +2222 +2A88 +2F88 +4214 +0C22 +0000 +0000 +ENDCHAR +STARTCHAR U+5DA2 +ENCODING 23970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1040 +57FC +5510 +57B8 +5510 +55FC +5600 +7FFC +44A0 +40A4 +0124 +061C +0000 +ENDCHAR +STARTCHAR U+5DA7 +ENCODING 23975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23FF +2249 +23FF +A820 +A9FE +A820 +ABFF +A884 +A848 +A9FE +F820 +03FF +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+5DA8 +ENCODING 23976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +095C +3084 +1D5C +1004 +1144 +1C9C +1144 +7FFF +4001 +4081 +1084 +1084 +1084 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5DA9 +ENCODING 23977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +10FE +10AA +10FE +54AA +54FE +55FF +5500 +55FE +5500 +55FF +7D4A +4644 +006B +0000 +0000 +ENDCHAR +STARTCHAR U+5DAA +ENCODING 23978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +2002 +1224 +0A28 +7FFF +0220 +3FFE +0080 +1FFC +0080 +7FFF +02A0 +0C98 +7087 +ENDCHAR +STARTCHAR U+5DAB +ENCODING 23979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2252 +2356 +2154 +23FF +A884 +A848 +ABFF +A820 +A9FE +A820 +ABFF +F8A4 +00A4 +01A6 +0323 +0020 +ENDCHAR +STARTCHAR U+5DAC +ENCODING 23980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1108 +1090 +13FC +5440 +55F8 +5440 +57FC +54A8 +5724 +57FC +7DA8 +4714 +412C +03C4 +0000 +ENDCHAR +STARTCHAR U+5DAD +ENCODING 23981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +3FFE +0810 +1010 +3EFE +6244 +3E44 +21FF +3E10 +22FE +3E10 +2010 +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+5DAE +ENCODING 23982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +54A0 +5510 +57F8 +5404 +57B8 +56A8 +7FB8 +4510 +4190 +02A8 +0444 +0000 +ENDCHAR +STARTCHAR U+5DAF +ENCODING 23983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +1084 +1FFC +3E14 +2212 +3E7F +7F10 +2210 +3E11 +2212 +3E14 +2209 +7F15 +0223 +0000 +0000 +ENDCHAR +STARTCHAR U+5DB0 +ENCODING 23984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +21DF +2149 +2249 +ABF6 +AAA4 +AAB4 +ABFF +AAA4 +AAA4 +ABFF +FA24 +0224 +0624 +0424 +0464 +ENDCHAR +STARTCHAR U+5DB1 +ENCODING 23985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +01EF +1044 +10FE +5482 +54FE +5482 +54FE +5480 +55FF +5621 +7D51 +4589 +01F7 +0000 +0000 +ENDCHAR +STARTCHAR U+5DB2 +ENCODING 23986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1FFC +0840 +1FFC +2840 +4FFC +0840 +0FFC +0840 +0FFC +0000 +3E3E +23E2 +200C +0000 +0000 +ENDCHAR +STARTCHAR U+5DB4 +ENCODING 23988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +1FF8 +1068 +1FA8 +1548 +1FF8 +1388 +1548 +1928 +7FFE +0810 +710E +0100 +2104 +2104 +3FFC +ENDCHAR +STARTCHAR U+5DB5 +ENCODING 23989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +1129 +1129 +55FF +5428 +55EF +5428 +55EF +5428 +55EF +7C28 +4428 +0048 +0088 +0000 +0000 +ENDCHAR +STARTCHAR U+5DB7 +ENCODING 23991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +2400 +38F8 +2250 +1E20 +21FC +3E28 +48A0 +7EB8 +08A0 +1560 +623C +0000 +ENDCHAR +STARTCHAR U+5DB8 +ENCODING 23992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +12A9 +12EA +1094 +5552 +5621 +57FF +5621 +5420 +57FF +5460 +7C70 +44A8 +0124 +0222 +0C61 +ENDCHAR +STARTCHAR U+5DB9 +ENCODING 23993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FE +2020 +21FC +A800 +ABFE +A802 +A8FA +A820 +A9FC +A800 +FFFF +0004 +03FF +02A4 +038C +ENDCHAR +STARTCHAR U+5DBA +ENCODING 23994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1FF0 +1810 +0DFC +1220 +1EF8 +2088 +7EF8 +0AF8 +0A88 +0CF8 +08C8 +0B04 +0000 +ENDCHAR +STARTCHAR U+5DBC +ENCODING 23996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10D8 +1168 +5548 +55F8 +5528 +5568 +55F8 +5568 +5568 +7FFC +4490 +4108 +0208 +0000 +ENDCHAR +STARTCHAR U+5DBD +ENCODING 23997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0818 +2B94 +17D4 +187C +2B90 +4B90 +1810 +2BB0 +4AA8 +0BC8 +3284 +0000 +ENDCHAR +STARTCHAR U+5DC0 +ENCODING 24000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +3FFE +1509 +2589 +465F +0408 +0908 +7FC8 +1208 +1F89 +120A +1F85 +123B +1FC1 +0000 +0000 +ENDCHAR +STARTCHAR U+5DC2 +ENCODING 24002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1FFC +0420 +0FF8 +1820 +2FF8 +0FF8 +0820 +0FF8 +3FFE +2222 +27F2 +2C1A +27F6 +0000 +0000 +ENDCHAR +STARTCHAR U+5DC3 +ENCODING 24003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4102 +7FFE +0840 +7F7E +2240 +147E +FF82 +007E +3E40 +227E +3E40 +227E +3E40 +227E +2241 +263F +ENDCHAR +STARTCHAR U+5DC5 +ENCODING 24005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2108 +3FF8 +0800 +FFFE +0820 +3E7C +2244 +2A54 +2A54 +2A54 +2A54 +FF54 +0828 +1426 +62C2 +ENDCHAR +STARTCHAR U+5DC6 +ENCODING 24006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +028A +01DC +1088 +1154 +5602 +57FF +5401 +55FD +5504 +55FC +5440 +57FE +7E02 +03FE +0000 +0000 +ENDCHAR +STARTCHAR U+5DC7 +ENCODING 24007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +210A +21EB +2109 +2FE8 +A92B +AFDC +A928 +A8E9 +A809 +ABEE +A806 +FBEC +0A2C +0BF5 +1147 +03E2 +ENDCHAR +STARTCHAR U+5DC9 +ENCODING 24009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1070 +10A0 +13F8 +5488 +55F8 +55B0 +55E4 +575C +54E0 +57F0 +7D50 +45F4 +40AC +031C +0000 +ENDCHAR +STARTCHAR U+5DCB +ENCODING 24011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +7FFE +1000 +7E7E +4202 +7EFF +4002 +7E7E +4200 +7FFF +1111 +5EFE +5092 +5E96 +F010 +ENDCHAR +STARTCHAR U+5DCC +ENCODING 24012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1108 +1FF8 +0910 +3FFC +2F20 +2220 +3FBC +2948 +2FA8 +2F10 +2FB0 +3948 +4184 +0000 +ENDCHAR +STARTCHAR U+5DCD +ENCODING 24013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +3FF8 +0C40 +39F0 +7F50 +1DF0 +2B50 +49F0 +7ED0 +14E8 +3CFC +0D44 +323C +0000 +ENDCHAR +STARTCHAR U+5DCE +ENCODING 24014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2020 +2277 +ABD5 +AA77 +AA54 +AAF5 +AF57 +A888 +AB46 +F8FC +0398 +0070 +00D8 +078F +ENDCHAR +STARTCHAR U+5DCF +ENCODING 24015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +11FF +1044 +11EF +5529 +55EF +5488 +55FF +5488 +54FF +5488 +7CFF +0088 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+5DD0 +ENCODING 24016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +7FFE +0000 +087E +7F42 +007E +3E42 +227E +3E04 +0074 +7F24 +41FF +5D24 +5524 +5D24 +ENDCHAR +STARTCHAR U+5DD1 +ENCODING 24017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +014A +11EF +1042 +11EF +554A +5463 +54FE +5482 +54FE +5482 +54FE +7C82 +00FE +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+5DD2 +ENCODING 24018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +1FD8 +6868 +1390 +2BA8 +7C7C +3BB8 +56D4 +1390 +0100 +2108 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+5DD3 +ENCODING 24019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2108 +3FF8 +2400 +3BFC +1E20 +5EF8 +5288 +5EF8 +5E88 +52F8 +5E88 +3EF8 +1448 +6384 +0000 +ENDCHAR +STARTCHAR U+5DD4 +ENCODING 24020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4104 +7FFC +087E +FF90 +7F7E +4142 +7F7E +7F42 +417E +7F42 +417E +FF94 +80A2 +0000 +0000 +ENDCHAR +STARTCHAR U+5DD5 +ENCODING 24021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +03FE +1084 +11FF +112A +55FF +55E4 +553F +55E4 +5444 +55FF +7C28 +0010 +00EE +0000 +0000 +ENDCHAR +STARTCHAR U+5DD6 +ENCODING 24022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2108 +3FF8 +1EF0 +1290 +1EF0 +3FFC +2F20 +2420 +3FFC +2948 +2FB0 +2F90 +3F68 +4184 +0000 +ENDCHAR +STARTCHAR U+5DD8 +ENCODING 24024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +21C6 +2105 +2FE4 +A91F +AFC4 +A924 +AFE4 +AA44 +AFEE +AAAA +FAEA +0C2A +0BAA +1AAA +0BB3 +ENDCHAR +STARTCHAR U+5DD9 +ENCODING 24025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +2088 +2FFF +2220 +AA77 +ABD5 +AA77 +AAD4 +AF77 +A888 +AB06 +F87C +07C8 +0070 +00D8 +0F8F +ENDCHAR +STARTCHAR U+5DDB +ENCODING 24027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0888 +0888 +0888 +1110 +1110 +2220 +4440 +2220 +1110 +1110 +0888 +0888 +0888 +0000 +ENDCHAR +STARTCHAR U+5DDD +ENCODING 24029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0888 +0888 +0888 +0888 +0888 +0888 +0888 +0888 +0888 +1088 +1008 +2008 +4008 +0000 +ENDCHAR +STARTCHAR U+5DDE +ENCODING 24030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0888 +0888 +0888 +2CC8 +2AA8 +2AA8 +4888 +0888 +0888 +1088 +1088 +2008 +4008 +0000 +ENDCHAR +STARTCHAR U+5DDF +ENCODING 24031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0082 +7FFF +0800 +0800 +0800 +0FFC +0000 +0888 +0888 +0888 +1089 +2089 +408F +0000 +0000 +ENDCHAR +STARTCHAR U+5DE0 +ENCODING 24032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +0888 +1998 +1110 +3330 +1998 +0888 +0888 +0000 +3FFC +0100 +0100 +0100 +0100 +7FFE +ENDCHAR +STARTCHAR U+5DE1 +ENCODING 24033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0248 +4248 +2248 +2490 +0490 +0920 +0490 +7490 +1248 +1248 +1248 +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+5DE2 +ENCODING 24034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +2220 +1110 +3FF8 +2108 +3FF8 +2108 +3FF8 +0104 +FFFE +0540 +0920 +111C +6108 +0100 +ENDCHAR +STARTCHAR U+5DE3 +ENCODING 24035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0910 +0920 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+5DE4 +ENCODING 24036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +1998 +3330 +1998 +0888 +3FFC +2664 +2184 +2664 +3FFC +2948 +2528 +294C +2525 +39C7 +E702 +ENDCHAR +STARTCHAR U+5DE5 +ENCODING 24037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3FF8 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +7FFC +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+5DE6 +ENCODING 24038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +7FFC +0200 +0200 +0400 +07F0 +0880 +0880 +1080 +2080 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5DE7 +ENCODING 24039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +0080 +7C80 +1080 +10F8 +1108 +1108 +1008 +1C08 +6008 +0008 +0008 +0070 +0000 +ENDCHAR +STARTCHAR U+5DE8 +ENCODING 24040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2000 +2000 +3FE0 +2020 +2020 +2020 +3FE0 +2020 +2000 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+5DE9 +ENCODING 24041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +09FC +FD08 +1108 +1108 +1108 +1148 +1128 +1128 +1108 +1D08 +F108 +420A +020A +0406 +0800 +ENDCHAR +STARTCHAR U+5DEB +ENCODING 24043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +0920 +0920 +0920 +0920 +0D60 +1350 +1388 +2108 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5DEE +ENCODING 24046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0800 +0FF8 +1080 +2080 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5DEF +ENCODING 24047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +FBFE +0880 +1080 +2D08 +C3FC +0804 +7D50 +1150 +1150 +1150 +1D52 +F252 +444E +0800 +ENDCHAR +STARTCHAR U+5DF0 +ENCODING 24048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F88 +0008 +157F +2A10 +5421 +2A41 +157F +0000 +7F54 +0854 +0854 +0854 +0854 +7F97 +0000 +0000 +ENDCHAR +STARTCHAR U+5DF1 +ENCODING 24049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0010 +0010 +0010 +3FF0 +2010 +2000 +2000 +2000 +2008 +2008 +2008 +1FF8 +0000 +ENDCHAR +STARTCHAR U+5DF2 +ENCODING 24050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0010 +0010 +2010 +2010 +3FF0 +2010 +2000 +2000 +2004 +2004 +2004 +1FFC +0000 +ENDCHAR +STARTCHAR U+5DF3 +ENCODING 24051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +2010 +2010 +2010 +2010 +3FF0 +2010 +2000 +2000 +2000 +2008 +2008 +1FF8 +0000 +ENDCHAR +STARTCHAR U+5DF4 +ENCODING 24052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2108 +2108 +2108 +3FF8 +2008 +2000 +2000 +2000 +2004 +2004 +1FFC +0000 +ENDCHAR +STARTCHAR U+5DF5 +ENCODING 24053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +1000 +1FFC +1000 +17F0 +1490 +1490 +17F0 +1410 +1400 +2404 +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+5DF7 +ENCODING 24055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +3FF8 +0440 +0440 +7FFC +0440 +0FE0 +1050 +6FCC +0840 +0810 +0810 +07F0 +0000 +ENDCHAR +STARTCHAR U+5DF8 +ENCODING 24056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F7E +4442 +4442 +4442 +5742 +5142 +5142 +517E +5740 +4440 +4440 +4440 +4441 +7F41 +003F +ENDCHAR +STARTCHAR U+5DF9 +ENCODING 24057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0040 +3D8C +0530 +0520 +1910 +E10F +0300 +3FFC +0000 +3FFC +0004 +3FFC +2000 +3002 +1FFE +ENDCHAR +STARTCHAR U+5DFB +ENCODING 24059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0910 +0920 +3FF8 +0280 +7FFC +0440 +1FF0 +604C +0FC0 +0840 +0808 +0808 +07F8 +0000 +ENDCHAR +STARTCHAR U+5DFD +ENCODING 24061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +0208 +3EF8 +2080 +2288 +1E78 +0440 +3FF8 +0440 +7FFC +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+5DFE +ENCODING 24062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +3FF8 +2108 +2108 +2108 +2108 +2108 +2108 +2108 +2130 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5DFF +ENCODING 24063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0082 +7FFF +0080 +0080 +1FFC +1084 +1084 +1084 +1084 +1094 +1088 +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5E00 +ENCODING 24064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +0100 +0100 +0100 +3FFC +2104 +2104 +2104 +2104 +2104 +2104 +211C +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+5E01 +ENCODING 24065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +03C0 +7D00 +0100 +0108 +3FFC +2108 +2108 +2108 +2108 +2108 +2128 +2110 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+5E02 +ENCODING 24066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +0100 +1FF0 +1110 +1110 +1110 +1110 +1110 +1160 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5E03 +ENCODING 24067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +7FFC +0480 +0480 +0FF8 +0888 +1888 +2888 +4888 +0888 +08B0 +0080 +0000 +ENDCHAR +STARTCHAR U+5E04 +ENCODING 24068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0802 +08FF +7F08 +4908 +4908 +4908 +4908 +4908 +4B08 +0808 +0808 +0828 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+5E05 +ENCODING 24069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +4824 +49FE +4924 +4924 +4924 +4924 +4924 +4924 +4924 +0924 +1134 +1128 +2020 +4020 +ENDCHAR +STARTCHAR U+5E06 +ENCODING 24070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7D10 +5510 +5590 +5550 +5550 +5550 +5D10 +5110 +1214 +1214 +140C +0000 +ENDCHAR +STARTCHAR U+5E07 +ENCODING 24071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFC +0104 +FFFF +0104 +3FFC +0100 +0100 +3FFC +2104 +2104 +2104 +2104 +2104 +211C +0100 +ENDCHAR +STARTCHAR U+5E08 +ENCODING 24072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0BFE +4820 +4824 +49FE +4924 +4924 +4924 +4924 +4924 +4924 +4924 +1134 +1128 +2020 +4020 +ENDCHAR +STARTCHAR U+5E0A +ENCODING 24074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +087F +7F49 +4949 +4949 +497F +4940 +4B40 +0840 +0840 +0841 +0841 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+5E0B +ENCODING 24075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +1100 +1FFC +1080 +1E64 +711C +0104 +1FF0 +1110 +1110 +1110 +11E0 +0100 +0000 +ENDCHAR +STARTCHAR U+5E0C +ENCODING 24076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0620 +01C0 +0760 +3910 +0200 +7FFC +0480 +0FF8 +1888 +2888 +4888 +0888 +08B0 +0080 +0000 +ENDCHAR +STARTCHAR U+5E0D +ENCODING 24077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +0000 +3FFC +2004 +2004 +3FFC +2080 +2080 +2FFC +2884 +2884 +6884 +4884 +C89C +0080 +ENDCHAR +STARTCHAR U+5E0E +ENCODING 24078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +087F +7F51 +4951 +4914 +4914 +4B14 +0814 +0824 +0825 +0845 +0885 +0907 +0000 +0000 +ENDCHAR +STARTCHAR U+5E0F +ENCODING 24079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +7FFE +5420 +5428 +55FC +5420 +5420 +57FE +5C22 +5422 +102A +1024 +1020 +1020 +ENDCHAR +STARTCHAR U+5E10 +ENCODING 24080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1084 +1484 +7E88 +5490 +54A0 +5484 +57FE +54A0 +54A0 +5490 +5C90 +1088 +108E +10C4 +1080 +ENDCHAR +STARTCHAR U+5E11 +ENCODING 24081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +7FF8 +1288 +1250 +3C20 +06D0 +190C +7FF0 +1110 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+5E12 +ENCODING 24082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0890 +0898 +1888 +10FE +37C0 +5060 +1032 +111E +0100 +3FFC +2104 +2104 +2104 +2104 +210C +0100 +ENDCHAR +STARTCHAR U+5E14 +ENCODING 24084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +7DFE +5522 +5524 +5520 +55F8 +5508 +5548 +5D50 +5550 +1220 +1250 +148E +1304 +ENDCHAR +STARTCHAR U+5E15 +ENCODING 24085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1044 +7DFE +5504 +5504 +5504 +5504 +55FC +5504 +5504 +5504 +5D04 +1104 +11FC +1104 +ENDCHAR +STARTCHAR U+5E16 +ENCODING 24086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7C7C +5440 +5440 +5440 +55F8 +5508 +5D08 +5108 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+5E17 +ENCODING 24087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1022 +1021 +7DFF +5420 +5420 +5442 +5442 +5C84 +10A8 +1110 +1228 +1044 +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+5E18 +ENCODING 24088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4002 +8924 +1110 +2108 +1FF0 +1110 +1110 +1110 +1110 +1110 +1150 +1120 +0100 +ENDCHAR +STARTCHAR U+5E19 +ENCODING 24089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1140 +1140 +7DF8 +5540 +5640 +5440 +57FC +5440 +58A0 +50A0 +1110 +1208 +1404 +0000 +ENDCHAR +STARTCHAR U+5E1A +ENCODING 24090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0020 +7FFC +0020 +0FE0 +0000 +3FFC +2108 +5FF0 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+5E1B +ENCODING 24091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +1FF0 +1010 +1FF0 +1010 +1FF0 +0100 +3FF8 +2108 +2108 +2108 +2130 +0100 +0000 +ENDCHAR +STARTCHAR U+5E1C +ENCODING 24092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +15FE +7F04 +5504 +5504 +5504 +5504 +55FC +5504 +5400 +5C50 +1048 +1084 +1106 +1202 +ENDCHAR +STARTCHAR U+5E1D +ENCODING 24093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0820 +0440 +3FFC +2108 +5FF0 +1110 +1110 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+5E1F +ENCODING 24095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0420 +2424 +6426 +CC23 +1820 +0100 +3FFC +2104 +2104 +2104 +2104 +211C +0100 +ENDCHAR +STARTCHAR U+5E20 +ENCODING 24096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0300 +0E00 +387C +2004 +3E7C +2004 +2004 +3FFC +0100 +0100 +3FFC +2104 +2104 +2104 +211C +0100 +ENDCHAR +STARTCHAR U+5E21 +ENCODING 24097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +1028 +7CFE +5444 +5444 +55FF +5C44 +1044 +1044 +1044 +1084 +1104 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+5E22 +ENCODING 24098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0814 +0822 +7F41 +4900 +493E +4900 +4900 +4B7F +0841 +0841 +0841 +087F +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+5E23 +ENCODING 24099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +0888 +3FFE +0200 +7FFF +0804 +1082 +2081 +1FFC +1084 +1084 +108C +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5E24 +ENCODING 24100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +223F +7F21 +1421 +0821 +143F +2321 +4080 +0080 +3FFE +2082 +208A +2084 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5E25 +ENCODING 24101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +3C20 +25FC +2524 +3D24 +2524 +2124 +3D24 +2524 +2538 +3C20 +2420 +2020 +0000 +ENDCHAR +STARTCHAR U+5E26 +ENCODING 24102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0920 +0928 +7FFC +0920 +0920 +7FFE +4102 +8104 +1FF0 +1110 +1110 +1110 +1110 +1150 +1120 +0100 +ENDCHAR +STARTCHAR U+5E27 +ENCODING 24103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1024 +103E +7C20 +55FC +5504 +5524 +5524 +5524 +5524 +5524 +5D24 +1144 +1058 +1084 +1302 +ENDCHAR +STARTCHAR U+5E28 +ENCODING 24104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2102 +2186 +2084 +FDFE +A502 +A502 +A502 +A502 +A5FE +A448 +AC48 +2048 +20C8 +2089 +2189 +2307 +ENDCHAR +STARTCHAR U+5E29 +ENCODING 24105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1111 +1092 +7C10 +54FE +5482 +54FE +5482 +5CFE +1082 +1082 +1082 +108A +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+5E2B +ENCODING 24107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +3E20 +2220 +22F8 +3EA8 +22A8 +20A8 +3EA8 +22A8 +22B0 +3E20 +2220 +2020 +0000 +ENDCHAR +STARTCHAR U+5E2D +ENCODING 24109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1220 +1FFC +1220 +13E0 +1080 +17F8 +1488 +2488 +2488 +44B0 +0080 +0000 +ENDCHAR +STARTCHAR U+5E2E +ENCODING 24110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0A7C +FF48 +0850 +7E58 +0844 +FF64 +0858 +1150 +3FF0 +D110 +1110 +1110 +1150 +1120 +0100 +ENDCHAR +STARTCHAR U+5E2F +ENCODING 24111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0920 +7FFC +0920 +0FE0 +0000 +3FFC +2108 +5FF0 +1110 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+5E30 +ENCODING 24112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0808 +09F8 +2808 +2BF8 +2800 +4FFC +0C44 +0BF8 +0A48 +1248 +1258 +2040 +0000 +ENDCHAR +STARTCHAR U+5E31 +ENCODING 24113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +13FC +7C40 +55F8 +5440 +57FE +5488 +5488 +55FE +5D08 +5288 +1448 +1008 +1028 +1010 +ENDCHAR +STARTCHAR U+5E32 +ENCODING 24114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +2086 +20C4 +FC44 +A5FF +A444 +A444 +A444 +A444 +A5FF +AC44 +2044 +20C4 +2084 +2184 +2304 +ENDCHAR +STARTCHAR U+5E33 +ENCODING 24115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1100 +7DF0 +5500 +55F0 +5500 +57FC +5548 +5D50 +5120 +1150 +1188 +1604 +0000 +ENDCHAR +STARTCHAR U+5E34 +ENCODING 24116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +11FE +7C40 +5428 +5411 +55EF +5440 +5442 +5DFF +1040 +1028 +1011 +1029 +11C7 +0000 +0000 +ENDCHAR +STARTCHAR U+5E35 +ENCODING 24117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FE +FA02 +AA02 +A900 +A9DE +A952 +AB52 +AA52 +A952 +20D6 +2090 +2091 +2193 +230E +ENDCHAR +STARTCHAR U+5E36 +ENCODING 24118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0AA0 +0AA0 +7FFC +0AA0 +0BA8 +1018 +3FFC +2108 +5FF0 +1110 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+5E37 +ENCODING 24119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +10A0 +7DFC +5520 +5720 +55F8 +5520 +5520 +55F8 +5920 +1120 +11FC +1100 +0000 +ENDCHAR +STARTCHAR U+5E38 +ENCODING 24120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0920 +3FFC +2008 +4FE0 +0820 +0FE0 +0100 +1FF0 +1110 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+5E3B +ENCODING 24123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1028 +11FC +7C20 +55FC +5420 +57FE +5400 +55FC +5504 +5D24 +5524 +1120 +1058 +1086 +1302 +ENDCHAR +STARTCHAR U+5E3C +ENCODING 24124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +7DFC +5524 +5524 +55FC +5524 +5534 +552C +5D24 +55FC +1104 +1104 +11FC +1104 +ENDCHAR +STARTCHAR U+5E3D +ENCODING 24125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7FF8 +5608 +57F8 +55F0 +5510 +55F0 +5510 +59F0 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+5E3E +ENCODING 24126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2022 +21FE +FC24 +A42C +A428 +A7FF +A410 +A420 +A4FE +AD82 +2282 +20FE +2082 +2082 +20FE +ENDCHAR +STARTCHAR U+5E3F +ENCODING 24127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10BC +1084 +7D04 +55FF +5710 +5520 +553E +5548 +5588 +55FF +5D08 +1114 +1114 +1122 +1141 +ENDCHAR +STARTCHAR U+5E40 +ENCODING 24128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +107C +7C40 +55F8 +5508 +55F8 +5508 +55F8 +5508 +59F8 +1050 +1088 +1304 +0000 +ENDCHAR +STARTCHAR U+5E41 +ENCODING 24129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +0808 +0810 +7F7F +4941 +4941 +497F +4941 +497F +4B41 +0841 +087F +0822 +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+5E42 +ENCODING 24130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +9FF4 +1010 +1FF0 +1010 +1FF0 +0004 +FFFE +0920 +1FF0 +292E +C924 +0960 +0100 +ENDCHAR +STARTCHAR U+5E43 +ENCODING 24131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +13F0 +1090 +7FFC +5400 +55F0 +5510 +55F0 +5420 +55F8 +5920 +17FC +1020 +1020 +0000 +ENDCHAR +STARTCHAR U+5E44 +ENCODING 24132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7DF8 +5500 +55FC +5550 +5558 +55E8 +5520 +59F8 +1220 +13FC +1400 +0000 +ENDCHAR +STARTCHAR U+5E45 +ENCODING 24133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1000 +7DF0 +5510 +55F0 +5400 +57F8 +5648 +5FF8 +5248 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+5E47 +ENCODING 24135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +3E10 +09FC +7E90 +0850 +3E10 +0F30 +7100 +1FF0 +1110 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+5E49 +ENCODING 24137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2124 +2124 +23FF +FD24 +A524 +A53C +A500 +A5FE +A420 +A7FF +ACA8 +20A8 +21AC +2126 +2323 +2020 +ENDCHAR +STARTCHAR U+5E4A +ENCODING 24138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1010 +1010 +7CFE +5400 +54FE +5482 +54FE +5C82 +10FE +1082 +10FE +1044 +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+5E4B +ENCODING 24139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +3E7C +2244 +2A47 +FF80 +227E +2A26 +6A18 +C66F +0100 +3FFC +2104 +2104 +2104 +211C +0100 +ENDCHAR +STARTCHAR U+5E4C +ENCODING 24140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7DF8 +5508 +55F8 +5648 +5550 +57FC +54A0 +58A0 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+5E4D +ENCODING 24141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1054 +7C92 +5511 +5400 +5440 +5487 +5501 +5501 +5DC7 +1101 +1101 +11FF +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+5E4E +ENCODING 24142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1208 +7DF0 +5510 +55F0 +5510 +55F0 +5440 +57FC +5800 +1090 +1108 +1608 +0000 +ENDCHAR +STARTCHAR U+5E4F +ENCODING 24143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13FF +1201 +7EFA +5420 +5450 +55B3 +5454 +5898 +1334 +1052 +1391 +1050 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+5E50 +ENCODING 24144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A44 +4948 +4840 +4BFE +7890 +4890 +4FFF +490C +4B46 +7E43 +4BFC +4A44 +4A44 +CA5C +9840 +ENDCHAR +STARTCHAR U+5E51 +ENCODING 24145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +3548 +2548 +655F +C7D2 +1032 +37CA +210A +610A +E7CE +2544 +2544 +254E +254A +211B +2111 +ENDCHAR +STARTCHAR U+5E53 +ENCODING 24147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +11FE +1044 +7CA9 +55FF +5444 +5492 +5525 +5448 +1092 +1024 +1048 +1010 +11E0 +0000 +0000 +ENDCHAR +STARTCHAR U+5E54 +ENCODING 24148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +5510 +55F0 +57F8 +56A8 +57F8 +55F0 +5890 +1060 +10F0 +170C +0000 +ENDCHAR +STARTCHAR U+5E55 +ENCODING 24149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0FE0 +0820 +0FE0 +7FFC +0540 +1FF0 +692C +0920 +0960 +0100 +0000 +ENDCHAR +STARTCHAR U+5E56 +ENCODING 24150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FF +2048 +FDFF +A549 +A549 +A5FF +A400 +A4FE +A400 +ADFF +2010 +2094 +2196 +2313 +2070 +ENDCHAR +STARTCHAR U+5E57 +ENCODING 24151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1268 +7E58 +57F8 +5648 +57D8 +5758 +57E8 +5678 +5BB8 +1258 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+5E58 +ENCODING 24152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +2010 +FCFE +A410 +A5FF +A400 +A4FE +A482 +A4FE +AC82 +20FE +2082 +20FE +2044 +2183 +ENDCHAR +STARTCHAR U+5E59 +ENCODING 24153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +7C00 +54FE +5482 +54FE +5482 +54FE +5410 +11FF +1028 +1044 +1183 +0000 +0000 +ENDCHAR +STARTCHAR U+5E5B +ENCODING 24155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FC +1088 +7C50 +57FE +5400 +55FC +5504 +55FC +5504 +5DFC +5420 +13FE +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+5E5C +ENCODING 24156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FE +2102 +21FE +FD02 +A5FE +A420 +A7FF +A400 +A5FE +A502 +AD02 +21FE +2020 +20A4 +21A6 +2363 +ENDCHAR +STARTCHAR U+5E5D +ENCODING 24157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +1129 +11EF +7C00 +54FE +5492 +54FE +5492 +54FE +1010 +11FF +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+5E5E +ENCODING 24158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +1154 +10D8 +7C50 +57FE +5488 +5450 +55FC +5420 +55FC +5C20 +57FE +1020 +1050 +1088 +1306 +ENDCHAR +STARTCHAR U+5E5F +ENCODING 24159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10B0 +17E8 +7D68 +55A0 +57FC +5420 +57E8 +5668 +57D8 +5A50 +13D4 +122C +1044 +0000 +ENDCHAR +STARTCHAR U+5E60 +ENCODING 24160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10FF +7DAA +54AA +55FF +54AA +54AA +5CAA +11FF +1000 +1129 +1129 +1229 +0000 +0000 +ENDCHAR +STARTCHAR U+5E61 +ENCODING 24161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E8 +1248 +7D50 +57FC +54E0 +5550 +57F8 +5554 +5DF0 +5150 +1150 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+5E62 +ENCODING 24162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +10A0 +7FFC +55F0 +5550 +55F0 +5550 +55F0 +5440 +5BF8 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+5E63 +ENCODING 24163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4940 +2A7C +7FC8 +5D30 +5B30 +6BC8 +4104 +1FF0 +1110 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+5E64 +ENCODING 24164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +2A40 +497C +7F88 +5D50 +5530 +5DCC +4100 +3FF8 +2108 +2108 +2108 +2130 +0100 +0000 +ENDCHAR +STARTCHAR U+5E66 +ENCODING 24166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F08 +217F +3F22 +207F +3F08 +317F +5108 +1F08 +0080 +1FFC +1084 +109C +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5E67 +ENCODING 24167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +1044 +7C7C +5400 +55EF +5529 +55EF +5400 +5C10 +11FF +1054 +1092 +1111 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+5E68 +ENCODING 24168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2078 +2090 +23FF +FD24 +A5C7 +A53C +A500 +A5FF +A500 +A53C +AD00 +213C +2100 +217E +2242 +207E +ENDCHAR +STARTCHAR U+5E69 +ENCODING 24169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +7C54 +55FF +5444 +54FE +5482 +54FE +5482 +10FE +1082 +10FE +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+5E6A +ENCODING 24170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +21FF +2044 +FDFF +A501 +A4FE +A400 +A5FF +A420 +A4D1 +AD2A +20DC +212A +204A +2189 +2038 +ENDCHAR +STARTCHAR U+5E6B +ENCODING 24171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +7EFF +0804 +FF24 +0834 +7E94 +0904 +FFFC +1008 +1FF8 +1008 +1FF8 +0100 +3FFC +2104 +211C +ENDCHAR +STARTCHAR U+5E6C +ENCODING 24172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FE +2020 +F9FC +A800 +AFFF +A801 +A9FD +A820 +ABFE +A800 +27FF +2002 +27BF +2492 +2786 +ENDCHAR +STARTCHAR U+5E6D +ENCODING 24173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +27FF +F888 +ABFE +AA52 +AA52 +ABFE +A809 +ABFF +AA08 +220A +22EA +260D +2415 +2C67 +ENDCHAR +STARTCHAR U+5E6E +ENCODING 24174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +FC82 +A7E2 +A49F +A5E2 +A402 +A5E2 +A52A +AD2E +25E6 +2D42 +2942 +28E2 +238E +ENDCHAR +STARTCHAR U+5E6F +ENCODING 24175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +10E7 +114A +7C00 +55EF +5529 +55E9 +5529 +5DE9 +1109 +110A +1148 +1168 +1388 +0000 +0000 +ENDCHAR +STARTCHAR U+5E70 +ENCODING 24176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +27FF +2421 +FDFD +A820 +A9FC +A820 +AFFF +A800 +ABFE +AA52 +23FE +2020 +2296 +228B +2679 +ENDCHAR +STARTCHAR U+5E72 +ENCODING 24178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +0100 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5E73 +ENCODING 24179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +1110 +0910 +0920 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5E74 +ENCODING 24180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1080 +2080 +4FF0 +0880 +0880 +0880 +7FFC +0080 +0080 +0080 +0080 +0000 +ENDCHAR +STARTCHAR U+5E75 +ENCODING 24181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +0820 +0820 +0820 +0820 +7FFC +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+5E76 +ENCODING 24182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +3FF8 +0440 +0440 +0440 +7FFC +0440 +0440 +0840 +0840 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+5E77 +ENCODING 24183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +0408 +0810 +0810 +7EFE +0810 +0810 +0810 +0F90 +79FF +0810 +0810 +1010 +1010 +2010 +4010 +ENDCHAR +STARTCHAR U+5E78 +ENCODING 24184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0100 +0100 +7FFC +0820 +0440 +7FFC +0100 +0100 +3FF8 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5E79 +ENCODING 24185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F50 +0888 +3F04 +22F8 +3E20 +2220 +3FFC +0820 +7F20 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+5E7A +ENCODING 24186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0100 +0110 +1A10 +0620 +0120 +00C0 +0080 +0120 +0210 +0478 +3F84 +0004 +0000 +ENDCHAR +STARTCHAR U+5E7B +ENCODING 24187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0808 +0A08 +7208 +1208 +0C08 +0408 +0C08 +0A08 +1208 +7D08 +0108 +0030 +0000 +ENDCHAR +STARTCHAR U+5E7C +ENCODING 24188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +1240 +53F8 +2448 +1448 +0848 +0C48 +1248 +1688 +3A88 +6108 +0230 +0000 +ENDCHAR +STARTCHAR U+5E7D +ENCODING 24189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0520 +2528 +39C8 +2B58 +2B58 +2528 +2738 +2B58 +3FF8 +2108 +3FF8 +2008 +2008 +0000 +ENDCHAR +STARTCHAR U+5E7E +ENCODING 24190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1528 +65C8 +1930 +0D30 +1348 +7FFC +0110 +3FFC +0890 +0CA0 +1244 +21B4 +460C +0000 +ENDCHAR +STARTCHAR U+5E7F +ENCODING 24191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +2000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+5E80 +ENCODING 24192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2000 +2400 +2400 +2408 +2430 +24C0 +2700 +2400 +2400 +4404 +4404 +83FC +0000 +ENDCHAR +STARTCHAR U+5E81 +ENCODING 24193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1000 +1000 +1FFC +1040 +1040 +1040 +1040 +1040 +2040 +2040 +40C0 +0000 +ENDCHAR +STARTCHAR U+5E82 +ENCODING 24194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +3FFF +2000 +2040 +2040 +2040 +2040 +2040 +2040 +20A0 +2110 +2208 +4C06 +0000 +0000 +ENDCHAR +STARTCHAR U+5E83 +ENCODING 24195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1000 +1080 +1080 +1080 +1080 +1080 +1120 +1110 +2238 +2FC4 +4004 +0000 +ENDCHAR +STARTCHAR U+5E84 +ENCODING 24196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1000 +1080 +1080 +1080 +1FF8 +1080 +1080 +1080 +2080 +3FFC +4000 +0000 +ENDCHAR +STARTCHAR U+5E86 +ENCODING 24198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2080 +2080 +2088 +3FFC +2080 +2080 +2140 +2140 +2220 +2220 +4410 +880E +3004 +ENDCHAR +STARTCHAR U+5E87 +ENCODING 24199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1000 +1440 +1440 +1444 +17C8 +1470 +1440 +1440 +2544 +2644 +583C +0000 +ENDCHAR +STARTCHAR U+5E88 +ENCODING 24200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2040 +20A0 +2110 +2208 +25F4 +3803 +27FC +2008 +2010 +4020 +0040 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5E89 +ENCODING 24201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0042 +3FFF +2000 +2040 +2FFE +2040 +2444 +2444 +2444 +27FC +2040 +4042 +007E +0000 +0000 +ENDCHAR +STARTCHAR U+5E8A +ENCODING 24202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1000 +1080 +1080 +1FFC +11C0 +11A0 +12A0 +1290 +2488 +2884 +4080 +0000 +ENDCHAR +STARTCHAR U+5E8B +ENCODING 24203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2080 +2084 +3FFE +2080 +2080 +2FF8 +2410 +2220 +2140 +4080 +4160 +861E +1804 +ENDCHAR +STARTCHAR U+5E8C +ENCODING 24204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +3FFF +2000 +2FFC +2410 +2410 +27FE +2050 +2090 +2110 +2210 +4C50 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5E8D +ENCODING 24205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2000 +2004 +27F8 +2200 +2204 +23FE +2210 +2210 +2410 +2810 +4010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+5E8E +ENCODING 24206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2040 +20E0 +21B0 +2318 +260C +3D17 +2110 +2110 +2110 +6110 +4310 +C210 +0610 +ENDCHAR +STARTCHAR U+5E8F +ENCODING 24207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1000 +17F0 +1120 +10C0 +1FFC +1088 +1090 +2080 +2080 +4080 +0180 +0000 +ENDCHAR +STARTCHAR U+5E90 +ENCODING 24208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2100 +2088 +27FC +2408 +2408 +2408 +27F8 +2408 +2400 +4400 +4400 +8800 +1000 +ENDCHAR +STARTCHAR U+5E91 +ENCODING 24209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2000 +2010 +2FF8 +2080 +2084 +3FFE +2140 +2140 +2140 +4240 +4242 +8442 +183E +ENDCHAR +STARTCHAR U+5E93 +ENCODING 24211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2100 +2108 +3FFC +2200 +2480 +2890 +2FF8 +2080 +2084 +3FFE +4080 +4080 +8080 +ENDCHAR +STARTCHAR U+5E94 +ENCODING 24212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2000 +2104 +2884 +2484 +2448 +2248 +2248 +2210 +2210 +4020 +4044 +9FFE +0000 +ENDCHAR +STARTCHAR U+5E95 +ENCODING 24213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1030 +13C0 +1240 +1240 +13FC +1220 +1220 +1390 +1C14 +27EC +4004 +0000 +ENDCHAR +STARTCHAR U+5E96 +ENCODING 24214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1100 +11F8 +1208 +17C8 +1848 +13C8 +1270 +1200 +2204 +2204 +41FC +0000 +ENDCHAR +STARTCHAR U+5E97 +ENCODING 24215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1080 +1080 +10FC +1080 +1080 +17F8 +1408 +2408 +2408 +47F8 +0408 +0000 +ENDCHAR +STARTCHAR U+5E99 +ENCODING 24217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2000 +2080 +2088 +2FFC +2888 +2888 +2888 +2FF8 +2888 +4888 +4888 +8FF8 +0808 +ENDCHAR +STARTCHAR U+5E9A +ENCODING 24218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1080 +17F0 +1090 +1FFC +1090 +17F0 +1090 +1140 +2120 +2210 +4C0C +0000 +ENDCHAR +STARTCHAR U+5E9B +ENCODING 24219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +1FFF +1000 +1110 +1110 +1110 +1110 +15DF +1510 +1510 +2511 +4511 +0FDF +0000 +0000 +ENDCHAR +STARTCHAR U+5E9C +ENCODING 24220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1110 +1110 +1210 +13FC +1610 +1A90 +1250 +1250 +2210 +2210 +4230 +0000 +ENDCHAR +STARTCHAR U+5E9E +ENCODING 24222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +7FFE +4200 +4240 +4228 +7FFC +4280 +4280 +4488 +4490 +44A0 +48C2 +4B82 +9082 +207E +ENDCHAR +STARTCHAR U+5E9F +ENCODING 24223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2080 +2490 +2488 +2FFE +2100 +23F8 +2208 +2510 +24A0 +2840 +30B0 +430E +8C04 +ENDCHAR +STARTCHAR U+5EA0 +ENCODING 24224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1220 +1140 +1FF8 +1080 +17F0 +1080 +1080 +1FFC +2080 +2080 +4080 +0000 +ENDCHAR +STARTCHAR U+5EA2 +ENCODING 24226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2000 +2000 +2FFE +2100 +2108 +2208 +27FC +2044 +2040 +67FC +4040 +C040 +1FFF +ENDCHAR +STARTCHAR U+5EA3 +ENCODING 24227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +3FFF +2000 +2120 +2924 +2528 +2330 +2120 +2330 +2D2C +2221 +4421 +183F +0000 +0000 +ENDCHAR +STARTCHAR U+5EA4 +ENCODING 24228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2040 +27FC +2040 +2040 +2FFF +2008 +2008 +2FFF +2208 +6308 +4108 +C008 +0078 +ENDCHAR +STARTCHAR U+5EA5 +ENCODING 24229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2000 +2220 +2420 +2424 +2FFE +3460 +2470 +24A8 +24A8 +4526 +4624 +8420 +0420 +ENDCHAR +STARTCHAR U+5EA6 +ENCODING 24230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1220 +1FFC +1220 +13E0 +1000 +17F0 +1220 +1140 +20C0 +2330 +5C0C +0000 +ENDCHAR +STARTCHAR U+5EA7 +ENCODING 24231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1000 +1490 +1490 +1698 +19A4 +10C4 +17F0 +2080 +2080 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5EA8 +ENCODING 24232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2040 +2044 +27FC +2048 +3FFF +20E0 +2380 +3EFC +2010 +7FFF +4020 +C020 +00E0 +ENDCHAR +STARTCHAR U+5EAA +ENCODING 24234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2410 +2410 +24FF +2F10 +2410 +24FE +2446 +2744 +2C6C +6438 +4438 +C46C +0CC7 +ENDCHAR +STARTCHAR U+5EAB +ENCODING 24235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1080 +1FF8 +1080 +17F0 +1490 +17F0 +1490 +17F0 +2080 +3FFC +4080 +0080 +0000 +ENDCHAR +STARTCHAR U+5EAC +ENCODING 24236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2400 +2508 +2498 +3FB0 +2464 +250C +2518 +2572 +2506 +650C +4D79 +C981 +18FF +ENDCHAR +STARTCHAR U+5EAD +ENCODING 24237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1018 +1EE0 +1220 +1420 +1FFC +1220 +1A20 +14F8 +2600 +2980 +507C +0000 +ENDCHAR +STARTCHAR U+5EAE +ENCODING 24238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2000 +2FFE +20A0 +20A0 +2FFE +2922 +2A3E +2802 +2BFA +4802 +0FFE +0802 +0000 +0000 +ENDCHAR +STARTCHAR U+5EB0 +ENCODING 24240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1202 +1104 +1088 +13FE +1088 +1088 +17FF +1088 +2108 +4208 +0408 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+5EB1 +ENCODING 24241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2040 +2FFE +2040 +3FFF +2110 +2310 +2E9F +21F8 +2308 +6E98 +4060 +C1B8 +0F0F +ENDCHAR +STARTCHAR U+5EB2 +ENCODING 24242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2040 +2FFE +2248 +2248 +2554 +28E2 +20E0 +2150 +2248 +4444 +1843 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+5EB3 +ENCODING 24243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2100 +2FF8 +2888 +2FF8 +2888 +2FF8 +2140 +2244 +3FFE +4040 +4040 +8040 +0040 +ENDCHAR +STARTCHAR U+5EB4 +ENCODING 24244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2110 +2110 +2FFE +2110 +2FFE +2000 +27FC +2404 +27FC +4404 +07FC +0404 +0000 +0000 +ENDCHAR +STARTCHAR U+5EB5 +ENCODING 24245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1100 +1FFC +12A0 +1490 +1FFC +1490 +17F0 +2490 +27F0 +4484 +007C +0000 +ENDCHAR +STARTCHAR U+5EB6 +ENCODING 24246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1120 +1120 +1FFC +1120 +1120 +11E0 +1120 +2000 +2A48 +4924 +1124 +0000 +ENDCHAR +STARTCHAR U+5EB7 +ENCODING 24247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1080 +17F0 +1090 +1FFC +1090 +17F0 +1CC8 +23B0 +2690 +588C +0180 +0000 +ENDCHAR +STARTCHAR U+5EB8 +ENCODING 24248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1080 +17F0 +1090 +1FFC +17F0 +1080 +17F0 +1490 +27F0 +27F0 +4490 +04B0 +0000 +ENDCHAR +STARTCHAR U+5EB9 +ENCODING 24249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2220 +3FFC +2220 +23E0 +2000 +27F0 +2410 +27F0 +2480 +4440 +4830 +880E +1004 +ENDCHAR +STARTCHAR U+5EBD +ENCODING 24253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2000 +27FC +2444 +27FC +2444 +27FC +2040 +2FFE +2842 +6852 +48FA +CB8A +0806 +ENDCHAR +STARTCHAR U+5EBE +ENCODING 24254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2280 +2CB8 +2888 +2888 +2EB8 +2888 +2888 +2FF8 +2948 +4220 +4410 +880E +3004 +ENDCHAR +STARTCHAR U+5EBF +ENCODING 24255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2110 +2110 +2FFE +2110 +2110 +2000 +27FC +2444 +2444 +67FC +4444 +C444 +07FC +ENDCHAR +STARTCHAR U+5EC1 +ENCODING 24257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1000 +1788 +14A8 +17A8 +14A8 +17A8 +14A8 +17A8 +1328 +2288 +2488 +4818 +0000 +ENDCHAR +STARTCHAR U+5EC2 +ENCODING 24258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1200 +1278 +1FC8 +1248 +1378 +16C8 +16F8 +1A48 +3248 +2278 +4248 +0000 +ENDCHAR +STARTCHAR U+5EC3 +ENCODING 24259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1000 +1390 +18D4 +1524 +1218 +1FF8 +1144 +1FF8 +2140 +2240 +4444 +183C +0000 +ENDCHAR +STARTCHAR U+5EC4 +ENCODING 24260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFE +4000 +5F3C +5124 +5F24 +5146 +5100 +5F7C +5144 +5428 +5210 +9528 +38C6 +0000 +0000 +ENDCHAR +STARTCHAR U+5EC5 +ENCODING 24261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1020 +13FE +1020 +17FF +1040 +1082 +13FE +1000 +27FE +4492 +0492 +0FFF +0000 +0000 +ENDCHAR +STARTCHAR U+5EC6 +ENCODING 24262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2100 +2FFC +2884 +2884 +2FFC +2884 +2FFC +2248 +2254 +6256 +465A +C461 +0C3F +ENDCHAR +STARTCHAR U+5EC7 +ENCODING 24263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2080 +2F3E +2812 +2892 +29A2 +2E8E +2000 +27FC +2444 +27FC +2444 +47FC +0000 +0000 +ENDCHAR +STARTCHAR U+5EC8 +ENCODING 24264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1000 +1FFC +1080 +13F0 +13F0 +13F0 +1210 +13F0 +11F0 +2720 +20E0 +4F1C +0000 +ENDCHAR +STARTCHAR U+5EC9 +ENCODING 24265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1220 +1FFC +1140 +17F0 +1150 +1FFC +1150 +17F0 +2360 +2D50 +714C +0140 +0000 +ENDCHAR +STARTCHAR U+5ECA +ENCODING 24266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1200 +1238 +17A8 +14A8 +17B0 +14A8 +17A4 +2524 +25B8 +46A0 +1820 +0000 +ENDCHAR +STARTCHAR U+5ECB +ENCODING 24267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2040 +2140 +265C +2444 +275C +2444 +275C +2040 +2FFC +2208 +6110 +40E0 +C3B8 +1E0F +ENDCHAR +STARTCHAR U+5ECC +ENCODING 24268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2220 +3FFE +2222 +2222 +3FFE +2400 +27FE +2400 +2FFF +6001 +4A49 +DB6D +1127 +ENDCHAR +STARTCHAR U+5ECE +ENCODING 24270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2000 +28FF +2810 +2B7E +2E42 +287E +2842 +287E +2942 +6942 +477E +C024 +00C3 +ENDCHAR +STARTCHAR U+5ECF +ENCODING 24271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1200 +1770 +1550 +1754 +158C +17F8 +1448 +1550 +2620 +24D0 +438C +0000 +ENDCHAR +STARTCHAR U+5ED0 +ENCODING 24272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1200 +1778 +1550 +1750 +157C +1750 +1410 +1530 +2634 +24D4 +438C +0000 +ENDCHAR +STARTCHAR U+5ED1 +ENCODING 24273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2410 +3FFC +2410 +27F0 +2080 +2FF8 +2888 +2FF8 +2080 +2FF8 +2080 +4FF8 +4080 +BFFE +ENDCHAR +STARTCHAR U+5ED2 +ENCODING 24274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2220 +2FA4 +223E +2FA8 +2248 +3FA8 +2428 +27A8 +2490 +4490 +4AA8 +9144 +0082 +ENDCHAR +STARTCHAR U+5ED3 +ENCODING 24275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1100 +1FFC +1024 +17A8 +14B0 +17A8 +1024 +17A4 +21A4 +2F38 +4120 +0320 +0000 +ENDCHAR +STARTCHAR U+5ED4 +ENCODING 24276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2040 +27FC +2444 +3FFF +2444 +27FC +2040 +27FC +2444 +3FFF +6210 +4720 +C1F0 +0F1E +ENDCHAR +STARTCHAR U+5ED5 +ENCODING 24277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4010 +5E38 +526C +52D6 +5593 +547C +520C +5230 +52FE +5600 +D1FF +9024 +904E +11FB +ENDCHAR +STARTCHAR U+5ED6 +ENCODING 24278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1000 +17F8 +1198 +16E8 +1198 +16E8 +1370 +1CDC +1360 +2190 +2060 +4780 +0000 +ENDCHAR +STARTCHAR U+5ED7 +ENCODING 24279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1000 +128A +17FF +128A +14FB +1000 +17FF +1421 +13FE +2222 +4226 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+5ED8 +ENCODING 24280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2040 +2020 +27FE +2450 +27FE +2452 +27FE +2508 +254A +258C +2929 +41EF +0000 +0000 +ENDCHAR +STARTCHAR U+5ED9 +ENCODING 24281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1000 +13FE +1222 +13FE +1222 +13FE +1088 +13FE +2088 +47FF +0104 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+5EDA +ENCODING 24282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1108 +1FC8 +1108 +17FC +1008 +17C8 +14A8 +17A8 +1488 +2308 +2388 +4C18 +0000 +ENDCHAR +STARTCHAR U+5EDB +ENCODING 24283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +17F0 +1490 +17F0 +1490 +17F0 +17F0 +1FFC +1228 +14B8 +3BE0 +2080 +5FFC +0000 +ENDCHAR +STARTCHAR U+5EDC +ENCODING 24284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4000 +5FFE +5002 +5FFE +5044 +57FC +504A +5FFF +50E0 +53FC +DF04 +B1FC +A104 +61FC +ENDCHAR +STARTCHAR U+5EDD +ENCODING 24285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1508 +1570 +1FC0 +1540 +177C +1550 +1750 +1550 +3FD0 +2550 +4490 +0890 +0000 +ENDCHAR +STARTCHAR U+5EDE +ENCODING 24286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7FFF +4410 +4E10 +4B10 +599F +50F1 +7FA3 +426A +5F88 +4208 +5A88 +CA1C +8394 +8E36 +3863 +ENDCHAR +STARTCHAR U+5EDF +ENCODING 24287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3FFC +2400 +3FF8 +2448 +2F48 +2978 +2F48 +2948 +2F78 +2448 +3FC8 +4488 +4518 +0000 +ENDCHAR +STARTCHAR U+5EE0 +ENCODING 24288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1220 +1AA0 +1720 +1FBC +18C8 +1FA8 +1DB0 +2F90 +2CB0 +48C8 +0984 +0000 +ENDCHAR +STARTCHAR U+5EE1 +ENCODING 24289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1200 +1200 +13FC +16A8 +1AA8 +1FFC +12A8 +12A8 +17FC +2548 +24A4 +48A4 +0000 +ENDCHAR +STARTCHAR U+5EE2 +ENCODING 24290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1010 +17D4 +1924 +1618 +177C +1950 +1754 +148C +1FF8 +2150 +2130 +46CC +0000 +ENDCHAR +STARTCHAR U+5EE3 +ENCODING 24291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1220 +1FF8 +13E0 +1FFC +1080 +17F0 +1490 +17F0 +2490 +27F0 +4330 +0C08 +0000 +ENDCHAR +STARTCHAR U+5EE5 +ENCODING 24293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +20E0 +2110 +22E8 +2404 +2FFE +3555 +2444 +27FC +2000 +23F8 +6208 +43F8 +C208 +03F8 +ENDCHAR +STARTCHAR U+5EE6 +ENCODING 24294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2008 +2788 +24BE +2494 +2794 +247F +2F88 +34BE +2488 +2788 +4488 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+5EE7 +ENCODING 24295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1020 +17FF +1124 +12AA +17FF +1000 +13FE +12FA +128A +12FA +2202 +43FE +0000 +0000 +ENDCHAR +STARTCHAR U+5EE8 +ENCODING 24296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3FFC +2400 +2778 +2928 +3228 +2FD8 +2AB0 +2FB0 +2AFC +2FD0 +28FC +2890 +5190 +0000 +ENDCHAR +STARTCHAR U+5EE9 +ENCODING 24297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1080 +1FF8 +17F0 +15D0 +1550 +15D0 +17F0 +10E0 +1380 +3FFC +26B0 +588C +0000 +ENDCHAR +STARTCHAR U+5EEA +ENCODING 24298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2080 +3FFE +2000 +2FF8 +2A28 +2BE8 +2A28 +2FF8 +2000 +27F0 +2000 +5FFC +42A0 +8C98 +ENDCHAR +STARTCHAR U+5EEB +ENCODING 24299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4000 +5FEF +5221 +52A5 +5263 +5EA5 +5210 +526C +5F8B +5270 +D206 +9278 +B203 +26FC +ENDCHAR +STARTCHAR U+5EEC +ENCODING 24300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +10F0 +17FC +14E8 +1778 +15F0 +1550 +15F0 +1550 +25F0 +2BF8 +4AA8 +17FC +0000 +ENDCHAR +STARTCHAR U+5EEE +ENCODING 24302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2000 +27BC +27BC +27BC +24A4 +27BC +2942 +2110 +2FFE +40A0 +0040 +07BC +0000 +0000 +ENDCHAR +STARTCHAR U+5EEF +ENCODING 24303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2422 +2714 +293E +2208 +2F88 +2ABE +2F88 +2A88 +2FBE +4008 +1548 +1548 +0000 +0000 +ENDCHAR +STARTCHAR U+5EF0 +ENCODING 24304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3FFC +2020 +3FFC +2A20 +2BFC +2F54 +2BFC +2E20 +2A58 +2FD4 +3AC4 +2348 +4238 +0000 +ENDCHAR +STARTCHAR U+5EF1 +ENCODING 24305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3FFC +2AA8 +3528 +2ABC +2F68 +2968 +2FBC +2028 +2FBC +2AA8 +2FA8 +287C +47E0 +0000 +ENDCHAR +STARTCHAR U+5EF2 +ENCODING 24306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2F3C +2000 +2F3C +2D6C +2FFE +2890 +2FFE +2892 +2FFE +4B9C +0A52 +13DE +0000 +0000 +ENDCHAR +STARTCHAR U+5EF3 +ENCODING 24307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3FFC +3F20 +29FC +2F20 +29FC +2FB4 +29FC +3F00 +3FFC +2528 +2FD4 +25CC +4F38 +0000 +ENDCHAR +STARTCHAR U+5EF4 +ENCODING 24308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3C00 +0400 +0800 +0800 +1000 +3C00 +0400 +2400 +2800 +1800 +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+5EF6 +ENCODING 24310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +781C +0BE0 +1020 +1020 +3D20 +0538 +2520 +2520 +1520 +1BFC +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+5EF7 +ENCODING 24311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +0030 +7BC0 +0840 +1040 +1040 +3FFC +0840 +4840 +2840 +13F8 +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+5EF8 +ENCODING 24312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7840 +0840 +1040 +13F8 +2248 +7A48 +0BF8 +4A48 +3248 +13F8 +2A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+5EFA +ENCODING 24314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +0848 +17FC +1048 +3BF8 +0840 +4BF8 +2840 +17FC +1840 +2640 +41FC +0000 +ENDCHAR +STARTCHAR U+5EFB +ENCODING 24315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7A08 +0AE8 +12A8 +12A8 +3AA8 +0AA8 +4AE8 +2A08 +13F8 +1A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+5EFC +ENCODING 24316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +78A0 +08A0 +13F8 +12A8 +3AA8 +0AB8 +4B38 +2A08 +13F8 +1A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+5EFE +ENCODING 24318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0440 +0440 +0440 +7FFC +0440 +0440 +0440 +0440 +0840 +0840 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+5EFF +ENCODING 24319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +0820 +7FFC +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+5F00 +ENCODING 24320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0820 +0820 +0820 +0820 +0824 +FFFE +0820 +0820 +0820 +0820 +1020 +1020 +2020 +4020 +ENDCHAR +STARTCHAR U+5F01 +ENCODING 24321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0240 +0430 +3FC8 +0440 +0440 +0440 +7FFC +0440 +0840 +0840 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+5F02 +ENCODING 24322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +2010 +2010 +3FF0 +2004 +2004 +1FFC +0820 +0824 +FFFE +0820 +0820 +0820 +1020 +2020 +ENDCHAR +STARTCHAR U+5F03 +ENCODING 24323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0200 +0220 +0410 +3FF8 +0448 +0440 +7FFC +0440 +0840 +0840 +1040 +0000 +ENDCHAR +STARTCHAR U+5F04 +ENCODING 24324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +0FE0 +0100 +0100 +3FF8 +0440 +0440 +7FFC +0440 +0440 +0840 +1040 +0000 +ENDCHAR +STARTCHAR U+5F05 +ENCODING 24325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0808 +7007 +0FF8 +0108 +0208 +0C38 +0410 +0410 +7FFF +0410 +0410 +0810 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+5F06 +ENCODING 24326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +1FF8 +0100 +0100 +FFFF +0400 +0C10 +09F8 +3F0C +0420 +FFFF +0420 +0C20 +1820 +7020 +ENDCHAR +STARTCHAR U+5F07 +ENCODING 24327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0380 +06C0 +0C70 +381C +E7E7 +0000 +1FF8 +1008 +1008 +1FF8 +0410 +0410 +FFFF +0810 +3010 +ENDCHAR +STARTCHAR U+5F08 +ENCODING 24328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +7FFC +0440 +1450 +244C +48C4 +1000 +0440 +0444 +FFFE +0440 +0440 +0840 +1040 +2040 +ENDCHAR +STARTCHAR U+5F09 +ENCODING 24329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2440 +2440 +3C40 +07FC +7C40 +2440 +25F8 +4400 +0440 +7FFC +0440 +0440 +0840 +1040 +0000 +ENDCHAR +STARTCHAR U+5F0A +ENCODING 24330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +2A40 +1C7C +7FC8 +5D28 +5B30 +69C8 +4B44 +0440 +7FFC +0440 +0440 +0840 +1040 +0000 +ENDCHAR +STARTCHAR U+5F0B +ENCODING 24331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0110 +0110 +010C +00F0 +0780 +7880 +0040 +0040 +0020 +0024 +0014 +000C +0004 +0000 +ENDCHAR +STARTCHAR U+5F0C +ENCODING 24332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +0048 +0040 +7FFC +0040 +0040 +0020 +0020 +3FA0 +0010 +0014 +000C +0004 +0000 +ENDCHAR +STARTCHAR U+5F0D +ENCODING 24333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +0048 +7FFC +0040 +0040 +0040 +3F20 +0020 +0020 +0010 +7F94 +000C +0004 +0000 +ENDCHAR +STARTCHAR U+5F0E +ENCODING 24334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +004C +0046 +0042 +FFFF +0040 +0040 +0040 +7F40 +0060 +0020 +3E20 +0030 +0011 +FF9B +000E +0004 +ENDCHAR +STARTCHAR U+5F0F +ENCODING 24335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +0048 +7FFC +0040 +0040 +3FC0 +0420 +0420 +0420 +0414 +0794 +780C +0004 +0000 +ENDCHAR +STARTCHAR U+5F10 +ENCODING 24336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +1F48 +0048 +0040 +7FFC +0040 +0040 +1F20 +0020 +0020 +0190 +0E14 +700C +0004 +0000 +ENDCHAR +STARTCHAR U+5F11 +ENCODING 24337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0218 +0214 +3414 +0DFC +1A10 +6A10 +09F0 +7E50 +1850 +1C54 +2A4C +2A6C +4984 +0804 +0000 +ENDCHAR +STARTCHAR U+5F12 +ENCODING 24338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2228 +1424 +0BFE +1420 +6220 +0A20 +09D0 +FE90 +2C90 +2A90 +48F2 +0B8A +080A +0804 +0000 +0000 +ENDCHAR +STARTCHAR U+5F13 +ENCODING 24339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0010 +0010 +1FF0 +1010 +1000 +1FF8 +1008 +1008 +0008 +0008 +0010 +00E0 +0000 +ENDCHAR +STARTCHAR U+5F14 +ENCODING 24340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0210 +0210 +3FF0 +2210 +2200 +3FF8 +2208 +2208 +0208 +0230 +0200 +0200 +0000 +ENDCHAR +STARTCHAR U+5F15 +ENCODING 24341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +7F10 +0110 +0110 +3F10 +2110 +2010 +3F10 +2110 +0110 +0110 +0110 +0210 +1C10 +0000 +ENDCHAR +STARTCHAR U+5F16 +ENCODING 24342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0010 +0010 +1FF0 +1010 +1000 +1FF8 +1008 +0008 +0010 +00E0 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5F17 +ENCODING 24343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +0480 +3FF0 +0490 +0490 +3FF0 +2490 +2480 +3FF8 +2488 +0888 +0888 +10B0 +2080 +0000 +ENDCHAR +STARTCHAR U+5F18 +ENCODING 24344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +0220 +0220 +3E20 +2220 +2040 +3E40 +2240 +0250 +0288 +0498 +07E4 +3804 +0000 +ENDCHAR +STARTCHAR U+5F19 +ENCODING 24345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBFE +0820 +0820 +0820 +7820 +4020 +47FF +4020 +7820 +0820 +0820 +0820 +0820 +1820 +70E0 +ENDCHAR +STARTCHAR U+5F1A +ENCODING 24346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +2002 +5FFD +0084 +0084 +1FFC +1080 +1080 +1FFF +0081 +0081 +0082 +008C +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+5F1B +ENCODING 24347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7CA0 +04A0 +04A8 +3CB8 +24E8 +23A8 +3CA8 +24A8 +24B8 +04A0 +0484 +0884 +307C +0000 +ENDCHAR +STARTCHAR U+5F1C +ENCODING 24348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE7F +0201 +0201 +0201 +7E7F +4040 +4040 +4040 +7E7F +0201 +0201 +0603 +0402 +0C06 +383C +ENDCHAR +STARTCHAR U+5F1D +ENCODING 24349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBFE +0A22 +0A22 +0A22 +7A22 +4222 +43FE +4200 +7A00 +0A00 +0A00 +0A01 +1B03 +11FE +7000 +ENDCHAR +STARTCHAR U+5F1F +ENCODING 24351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0440 +0480 +3FF0 +0110 +3FF0 +2100 +3FF8 +2308 +0308 +0508 +1970 +6100 +0100 +0000 +ENDCHAR +STARTCHAR U+5F20 +ENCODING 24352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +FD08 +0908 +0910 +0920 +7940 +4104 +47FE +4140 +7940 +0920 +0920 +0910 +094E +5184 +2100 +ENDCHAR +STARTCHAR U+5F21 +ENCODING 24353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +F9FF +0900 +0900 +0900 +79FE +4102 +4102 +4102 +79FE +0900 +0900 +0900 +0900 +19FF +7000 +ENDCHAR +STARTCHAR U+5F22 +ENCODING 24354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FA22 +0A22 +0BFE +0820 +7820 +43FC +4104 +418C +78D8 +0870 +0820 +0870 +18D8 +118C +7707 +ENDCHAR +STARTCHAR U+5F23 +ENCODING 24355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +F884 +0984 +0904 +0B7F +7B04 +4504 +4924 +4134 +7914 +0904 +0904 +0904 +1904 +1104 +711C +ENDCHAR +STARTCHAR U+5F24 +ENCODING 24356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +F81C +09F0 +0910 +0910 +7910 +41FF +4110 +4110 +7918 +0908 +09C8 +0F0C +1805 +17F7 +7002 +ENDCHAR +STARTCHAR U+5F25 +ENCODING 24357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7C80 +0480 +05FC +3D20 +2620 +20B0 +3CA8 +24A8 +2524 +0524 +0624 +0820 +3060 +0000 +ENDCHAR +STARTCHAR U+5F26 +ENCODING 24358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +07FC +0440 +3C48 +2788 +2090 +3C50 +2420 +2420 +0450 +0488 +0BF4 +3004 +0000 +ENDCHAR +STARTCHAR U+5F27 +ENCODING 24359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7C30 +05D0 +0550 +3D50 +2550 +2150 +3D50 +2550 +2568 +0558 +067C +0B94 +3414 +0000 +ENDCHAR +STARTCHAR U+5F28 +ENCODING 24360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBFE +0842 +0842 +08C2 +7886 +4184 +431C +4000 +79FE +0902 +0902 +0902 +1902 +1102 +71FE +ENDCHAR +STARTCHAR U+5F29 +ENCODING 24361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7F88 +1250 +3A20 +06D0 +190C +6FE0 +0020 +0FE0 +0800 +1FF0 +1010 +00E0 +0000 +ENDCHAR +STARTCHAR U+5F2A +ENCODING 24362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7DFC +0408 +0430 +0458 +7C86 +4302 +4008 +41FC +7C20 +0420 +0420 +0420 +0424 +2BFE +1000 +ENDCHAR +STARTCHAR U+5F2B +ENCODING 24363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFF +0288 +0288 +0288 +7EFE +4082 +4082 +4082 +7EFE +0288 +0288 +0688 +0488 +0CFF +7800 +ENDCHAR +STARTCHAR U+5F2C +ENCODING 24364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFF +0288 +0288 +0288 +7EAE +40A2 +40A2 +40A2 +7EAE +0288 +0288 +0688 +0488 +0CFF +7800 +ENDCHAR +STARTCHAR U+5F2D +ENCODING 24365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0910 +0910 +79F0 +4910 +4110 +41F0 +7910 +4910 +09F0 +0F10 +0810 +3010 +0000 +ENDCHAR +STARTCHAR U+5F2E +ENCODING 24366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1918 +0910 +7FFE +0240 +0420 +FFFF +0810 +17E8 +2024 +CFE3 +0800 +0FF0 +0010 +0070 +07C0 +ENDCHAR +STARTCHAR U+5F2F +ENCODING 24367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0240 +1250 +1248 +24C4 +4FE4 +0020 +0FE0 +0800 +1FF0 +1010 +0010 +00E0 +0000 +ENDCHAR +STARTCHAR U+5F30 +ENCODING 24368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FA22 +0B26 +0924 +0820 +7BFE +4202 +4202 +43FE +7A02 +0A02 +0BFE +0A02 +1A02 +1202 +720E +ENDCHAR +STARTCHAR U+5F31 +ENCODING 24369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7EF8 +0208 +0208 +3EF8 +2080 +3EF8 +2288 +1248 +0E38 +1A68 +6288 +0208 +0C30 +0000 +ENDCHAR +STARTCHAR U+5F33 +ENCODING 24371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7DFF +0400 +0449 +0492 +7D24 +4092 +4049 +7C00 +05FF +0410 +0410 +0810 +33FF +0000 +0000 +ENDCHAR +STARTCHAR U+5F34 +ENCODING 24372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F820 +0FFF +0800 +09FC +7904 +41FC +4000 +43FE +780C +0810 +0FFF +0820 +1820 +1020 +70E0 +ENDCHAR +STARTCHAR U+5F35 +ENCODING 24373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +79F8 +0900 +09F0 +7900 +49F0 +4100 +7FFC +4948 +4950 +0920 +0950 +1188 +6604 +0000 +ENDCHAR +STARTCHAR U+5F36 +ENCODING 24374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F820 +0820 +0FFF +0800 +79FC +4104 +4104 +4104 +79FC +0820 +0924 +0924 +1B26 +1623 +70E0 +ENDCHAR +STARTCHAR U+5F37 +ENCODING 24375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7850 +0888 +0FFC +7844 +4BF8 +4248 +7A48 +4BF8 +4A50 +0848 +087C +17C4 +6004 +0000 +ENDCHAR +STARTCHAR U+5F38 +ENCODING 24376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7BB8 +0AA8 +0AA8 +7AA8 +4BB8 +42A8 +7AA8 +4AA8 +0BB8 +0AA8 +0CC8 +14C8 +6998 +0000 +ENDCHAR +STARTCHAR U+5F39 +ENCODING 24377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A08 +7D10 +08A0 +0BF8 +0A48 +7A48 +4BF8 +4248 +4248 +7BF8 +0840 +0FFE +0840 +0840 +5040 +2040 +ENDCHAR +STARTCHAR U+5F3A +ENCODING 24378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FDFE +0904 +0904 +09FC +7924 +4820 +43FE +4222 +7A22 +0BFE +0A22 +0820 +8824 +53FE +2002 +ENDCHAR +STARTCHAR U+5F3B +ENCODING 24379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +F7EF +1081 +1081 +1081 +F7EF +84A8 +84A8 +F5EF +1561 +1761 +1621 +1421 +3423 +2422 +E7EE +ENDCHAR +STARTCHAR U+5F3C +ENCODING 24380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7878 +0FC8 +0908 +3938 +23A0 +22A0 +3AB8 +2BA8 +0A88 +0A88 +0B88 +0A88 +3030 +0000 +ENDCHAR +STARTCHAR U+5F3D +ENCODING 24381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0124 +F124 +17FF +1124 +1124 +F13C +8100 +81FE +F020 +17FF +10A8 +10A8 +11AC +3326 +2623 +E020 +ENDCHAR +STARTCHAR U+5F3E +ENCODING 24382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +7A48 +0910 +0BF8 +7A48 +4BF8 +4248 +7BF8 +4840 +4FFC +0840 +0840 +1040 +6040 +0000 +ENDCHAR +STARTCHAR U+5F3F +ENCODING 24383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4422 +5FFA +0420 +3FFC +0420 +FFFF +0810 +3FFC +E027 +0FE0 +0800 +0FF0 +0010 +07E0 +ENDCHAR +STARTCHAR U+5F40 +ENCODING 24384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +FEFC +1088 +7C88 +0088 +FE88 +8306 +BE00 +01FC +7C84 +0488 +7C50 +4020 +7C50 +048E +1B04 +ENDCHAR +STARTCHAR U+5F41 +ENCODING 24385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0808 +0BC8 +7A48 +4BC8 +4018 +7FFC +4808 +0BC8 +0A48 +0BC8 +0A48 +3018 +0000 +ENDCHAR +STARTCHAR U+5F43 +ENCODING 24387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFE +0492 +04FE +0492 +7CFE +4054 +41FF +7C54 +05FF +0410 +04FE +0410 +2810 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+5F44 +ENCODING 24388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBFF +0A00 +0A7C +0A44 +7A44 +427C +4200 +42EE +7AAA +0AAA +0AAA +0AEE +1A00 +13FF +7000 +ENDCHAR +STARTCHAR U+5F45 +ENCODING 24389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +F888 +0FFF +0800 +0BC2 +7A52 +43D2 +4252 +43D2 +7A42 +0ACE +0820 +0BFE +1822 +10E6 +738C +ENDCHAR +STARTCHAR U+5F46 +ENCODING 24390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +9240 +547E +FE88 +9350 +BA20 +D650 +828E +1FF0 +0010 +1FF0 +1000 +1FF0 +0010 +01E0 +0000 +0000 +ENDCHAR +STARTCHAR U+5F47 +ENCODING 24391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FCFE +0412 +05FF +0412 +7CFE +4010 +4155 +41D7 +7D11 +05FF +0511 +05D7 +0D55 +0955 +3A11 +ENDCHAR +STARTCHAR U+5F48 +ENCODING 24392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7BB8 +0AA8 +0BB8 +7800 +4BF8 +4248 +7BF8 +4A48 +0BF8 +0840 +0FFC +0840 +3040 +0000 +ENDCHAR +STARTCHAR U+5F49 +ENCODING 24393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C44 +05FF +0444 +047C +7C00 +41FF +4000 +7CFE +0492 +04FE +0492 +04FE +2844 +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+5F4A +ENCODING 24394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7BF8 +0950 +09F0 +7950 +49F0 +43F8 +79F0 +4950 +49F0 +0950 +09F0 +17FC +6000 +0000 +ENDCHAR +STARTCHAR U+5F4B +ENCODING 24395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +0529 +05FF +7C00 +41FF +4000 +40FE +7C82 +04FE +0449 +04CA +0744 +0452 +38E1 +0000 +0000 +ENDCHAR +STARTCHAR U+5F4C +ENCODING 24396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0958 +0E44 +7BF8 +4AD8 +43F8 +7AD8 +4B68 +0AD8 +0BF8 +0AD8 +0B68 +3258 +0000 +ENDCHAR +STARTCHAR U+5F4D +ENCODING 24397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +F810 +0BFF +0A44 +0AFE +7A44 +43FF +4210 +42FE +7A92 +0AFE +0A92 +0A92 +1AFE +1444 +7183 +ENDCHAR +STARTCHAR U+5F4E +ENCODING 24398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +6FE8 +2BA8 +1794 +7FFC +3AB8 +57D4 +1FE0 +0020 +0FE0 +0800 +1FF0 +1010 +00E0 +0000 +ENDCHAR +STARTCHAR U+5F4F +ENCODING 24399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DEF +0529 +05EF +05EF +7D29 +41EF +4088 +7CFE +05BC +049E +04FE +0444 +0838 +31EF +0000 +0000 +ENDCHAR +STARTCHAR U+5F50 +ENCODING 24400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0008 +7FFC +0008 +0008 +0008 +3FF8 +0008 +0008 +0008 +0008 +7FF8 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+5F51 +ENCODING 24401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +0200 +07E0 +0420 +0420 +0420 +0420 +0FE0 +0840 +0040 +0040 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+5F52 +ENCODING 24402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0404 +25FE +2404 +2404 +2404 +2404 +25FC +2404 +2404 +2404 +0404 +0804 +13FC +6004 +0000 +ENDCHAR +STARTCHAR U+5F53 +ENCODING 24403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1110 +0910 +0920 +0100 +3FF0 +0010 +0010 +1FF0 +0010 +0010 +3FF0 +0010 +0000 +ENDCHAR +STARTCHAR U+5F54 +ENCODING 24404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0FF0 +0810 +1FF0 +0020 +FFFF +0100 +3104 +190C +0998 +01C0 +0D60 +1930 +311C +E107 +0700 +ENDCHAR +STARTCHAR U+5F55 +ENCODING 24405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +0010 +0010 +1FF0 +0010 +0014 +FFFE +0108 +1110 +09A0 +0540 +0920 +111E +6504 +0200 +ENDCHAR +STARTCHAR U+5F56 +ENCODING 24406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +03E0 +0440 +0F80 +0080 +7FFC +0100 +0748 +79D0 +06E0 +39A0 +0690 +388C +0300 +0000 +ENDCHAR +STARTCHAR U+5F57 +ENCODING 24407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7EFC +0820 +3EF8 +0820 +0EFC +7820 +1FF0 +0010 +7FFC +0010 +1FF0 +0010 +0000 +ENDCHAR +STARTCHAR U+5F58 +ENCODING 24408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +07F0 +0820 +1FE0 +0044 +FFFE +0200 +2220 +27E4 +3928 +2130 +2FE0 +2922 +32A2 +245E +0800 +ENDCHAR +STARTCHAR U+5F59 +ENCODING 24409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +07E0 +0FC0 +7FFC +0000 +3FFC +2FE8 +4920 +0FE0 +0920 +0FE0 +7FFC +0D60 +3118 +0000 +ENDCHAR +STARTCHAR U+5F5B +ENCODING 24411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF8 +0008 +7FFF +0008 +1FF8 +490E +2A22 +7FC1 +1C3E +2A12 +4922 +00C4 +0410 +7FFF +0810 +3010 +ENDCHAR +STARTCHAR U+5F5C +ENCODING 24412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +03E0 +07C0 +7FFC +2A50 +1C88 +7FFC +1C48 +2A48 +4898 +0440 +7FFC +0440 +1840 +0000 +ENDCHAR +STARTCHAR U+5F5D +ENCODING 24413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +03E0 +07C0 +7FFC +2A28 +1CD0 +7E28 +1DFC +2AA8 +4924 +0440 +7FFC +0440 +1840 +0000 +ENDCHAR +STARTCHAR U+5F60 +ENCODING 24416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C24 +05FF +7C24 +0448 +7CFF +0188 +EEFE +4A88 +4AFE +EE88 +04FF +FE00 +65FE +3444 +0438 +1DC7 +ENDCHAR +STARTCHAR U+5F61 +ENCODING 24417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0200 +0240 +0440 +0880 +1090 +0110 +0220 +0420 +0040 +0080 +0300 +0C00 +0000 +ENDCHAR +STARTCHAR U+5F62 +ENCODING 24418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F10 +1220 +1220 +1248 +1208 +7F90 +1210 +1224 +1204 +1208 +2208 +2210 +4220 +0000 +ENDCHAR +STARTCHAR U+5F63 +ENCODING 24419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +080C +0818 +FFB0 +0202 +0206 +660C +3418 +1C31 +0803 +1C06 +140C +3638 +6300 +C1C0 +007F +ENDCHAR +STARTCHAR U+5F64 +ENCODING 24420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +3F0C +2210 +2220 +3240 +2A84 +2A0C +2210 +FFA0 +2242 +2206 +2208 +2210 +4220 +4A40 +8580 +ENDCHAR +STARTCHAR U+5F65 +ENCODING 24421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1FF0 +0440 +0380 +0440 +3FF8 +2060 +2180 +2630 +20C0 +2318 +4C60 +4180 +9E00 +0000 +0000 +ENDCHAR +STARTCHAR U+5F66 +ENCODING 24422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +0420 +0240 +1FFC +1020 +10C0 +1710 +1060 +1384 +2018 +2060 +4780 +0000 +ENDCHAR +STARTCHAR U+5F67 +ENCODING 24423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +0044 +0040 +7FFF +0040 +0048 +3F4A +2152 +2134 +3F29 +2152 +00B4 +0F58 +7019 +0065 +0183 +ENDCHAR +STARTCHAR U+5F69 +ENCODING 24425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0610 +7910 +4920 +2A28 +2448 +0890 +0810 +7F24 +1C44 +1A08 +2908 +4810 +0820 +0840 +0000 +ENDCHAR +STARTCHAR U+5F6A +ENCODING 24426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0410 +0710 +0420 +3FA8 +2948 +2E10 +3894 +2724 +2A08 +2A08 +2A10 +2A20 +3204 +41FC +0000 +ENDCHAR +STARTCHAR U+5F6B +ENCODING 24427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F90 +24A0 +24A0 +2EC8 +2488 +3F90 +2090 +2EA4 +2A84 +2A88 +2E88 +2A90 +41A0 +0000 +ENDCHAR +STARTCHAR U+5F6C +ENCODING 24428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1120 +7FE0 +1108 +1908 +3790 +3750 +3364 +5504 +5508 +1108 +1110 +1120 +0000 +ENDCHAR +STARTCHAR U+5F6D +ENCODING 24429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +7F20 +0828 +3E48 +0090 +3E14 +2224 +3E48 +2208 +1210 +1420 +1E40 +7080 +0000 +ENDCHAR +STARTCHAR U+5F6F +ENCODING 24431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFCC +1408 +7F98 +54B2 +5486 +7F84 +000C +7F98 +0031 +FFC3 +0802 +2906 +698C +C8D8 +1830 +ENDCHAR +STARTCHAR U+5F70 +ENCODING 24432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0410 +3F90 +0A20 +7FA8 +0048 +1F10 +1110 +1F24 +1144 +1F08 +0408 +7F90 +0420 +0440 +0000 +ENDCHAR +STARTCHAR U+5F71 +ENCODING 24433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F10 +1120 +1F20 +1148 +1F08 +0410 +7F90 +1F24 +1104 +1F08 +1508 +6490 +0C20 +0000 +ENDCHAR +STARTCHAR U+5F72 +ENCODING 24434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7BC4 +000C +7BD8 +5AD0 +0402 +7FC6 +4A04 +7FCC +4A58 +7FC1 +5203 +5BC2 +D206 +9A4C +31D8 +ENDCHAR +STARTCHAR U+5F73 +ENCODING 24435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0200 +0240 +0440 +0880 +0080 +0100 +0300 +0500 +0900 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+5F74 +ENCODING 24436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +1880 +1080 +31FF +6101 +CB01 +1801 +10C1 +3061 +7031 +D001 +1001 +1003 +1002 +1006 +101C +ENDCHAR +STARTCHAR U+5F75 +ENCODING 24437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +1220 +322E +623A +CAE2 +1BA2 +1622 +3222 +7226 +D220 +1200 +1200 +1201 +1303 +11FE +ENDCHAR +STARTCHAR U+5F76 +ENCODING 24438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +13FE +2104 +4908 +1110 +313E +5102 +1142 +1122 +1114 +1208 +1414 +1022 +10C1 +0000 +0000 +ENDCHAR +STARTCHAR U+5F77 +ENCODING 24439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1040 +17FC +2440 +0840 +0878 +1848 +2848 +4888 +0888 +0908 +0A08 +0C30 +0000 +ENDCHAR +STARTCHAR U+5F78 +ENCODING 24440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +1888 +108C +3184 +6106 +C902 +1B43 +1040 +3040 +7040 +D0C4 +1084 +1084 +109E +10F2 +1383 +ENDCHAR +STARTCHAR U+5F79 +ENCODING 24441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11E0 +2120 +4924 +0924 +121C +1400 +37F0 +5110 +1120 +10C0 +10C0 +1330 +1C0C +0000 +ENDCHAR +STARTCHAR U+5F7A +ENCODING 24442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1BFE +1020 +3020 +6020 +C820 +1820 +11FC +3020 +7020 +D020 +1020 +1020 +1020 +17FF +1000 +ENDCHAR +STARTCHAR U+5F7B +ENCODING 24443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1204 +12FE +2224 +4224 +92A4 +13E4 +2E24 +6224 +A264 +22A4 +2324 +2044 +2084 +2128 +2210 +ENDCHAR +STARTCHAR U+5F7C +ENCODING 24444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +23FC +4A48 +0A50 +1240 +13F8 +3288 +5290 +1250 +1260 +1460 +1590 +1E0C +0000 +ENDCHAR +STARTCHAR U+5F7D +ENCODING 24445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +181C +13F0 +3210 +6210 +CA10 +1BFF +1210 +3210 +7218 +D208 +13C8 +160C +1005 +17E7 +1002 +ENDCHAR +STARTCHAR U+5F7E +ENCODING 24446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1870 +10D8 +318C +6306 +CAFB +1800 +1000 +33FE +7042 +D042 +1042 +1042 +104E +1040 +1040 +ENDCHAR +STARTCHAR U+5F7F +ENCODING 24447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +08A0 +13F8 +14A8 +24A8 +4BF8 +0AA8 +1AA0 +2BFC +4AA4 +08A4 +08B8 +0920 +0A20 +0000 +ENDCHAR +STARTCHAR U+5F80 +ENCODING 24448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0840 +1040 +27FC +4440 +0840 +0840 +1BF8 +2840 +4840 +0840 +0840 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+5F81 +ENCODING 24449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +1040 +2440 +4540 +0940 +0978 +1940 +2940 +4940 +0940 +0940 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+5F82 +ENCODING 24450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F0 +1110 +1510 +2510 +49F0 +0910 +1910 +29F0 +4910 +0910 +0910 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+5F83 +ENCODING 24451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1240 +2240 +2A40 +4BFC +1440 +1440 +3840 +53F8 +1040 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+5F84 +ENCODING 24452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +1110 +24A0 +0440 +09F0 +1E4C +2840 +4BF8 +0840 +0840 +0840 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+5F85 +ENCODING 24453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +13F8 +2440 +0440 +0FFC +1810 +2810 +4FFC +0910 +0890 +0890 +0810 +0830 +0000 +ENDCHAR +STARTCHAR U+5F86 +ENCODING 24454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17FF +1050 +2050 +4050 +0FFF +1451 +3451 +5451 +1491 +171F +1401 +1401 +17FF +1401 +0000 +0000 +ENDCHAR +STARTCHAR U+5F87 +ENCODING 24455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +0900 +1100 +15F8 +2608 +4BE8 +0D28 +19E8 +2928 +49E8 +0928 +0808 +0808 +0830 +0000 +ENDCHAR +STARTCHAR U+5F88 +ENCODING 24456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F0 +1110 +1510 +25F0 +4910 +0910 +19F4 +2944 +4948 +0930 +0950 +0988 +0E04 +0000 +ENDCHAR +STARTCHAR U+5F89 +ENCODING 24457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A08 +0910 +10A0 +2008 +4BFC +0840 +1048 +37FC +5040 +9044 +1FFE +1040 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+5F8A +ENCODING 24458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +2208 +4A08 +0AE8 +12A8 +12A8 +32A8 +52E8 +12A8 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+5F8B +ENCODING 24459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +23F8 +4848 +0FFC +1048 +13F8 +3040 +53F8 +1040 +17FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+5F8C +ENCODING 24460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1050 +2390 +48A0 +0850 +1088 +17F4 +3084 +51F8 +1710 +10A0 +1040 +11B0 +1E0C +0000 +ENDCHAR +STARTCHAR U+5F8D +ENCODING 24461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +13FE +3020 +6020 +C820 +1BFF +1000 +3020 +7020 +D3FE +1020 +1020 +1020 +17FF +1000 +ENDCHAR +STARTCHAR U+5F8F +ENCODING 24463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1920 +113E +3120 +6120 +CBFF +1820 +10A4 +31A6 +7323 +D024 +106C +1018 +1030 +10E0 +1380 +ENDCHAR +STARTCHAR U+5F90 +ENCODING 24464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +20A0 +4910 +0A08 +15F4 +1040 +37FC +5040 +1150 +1148 +1244 +1444 +10C0 +0000 +ENDCHAR +STARTCHAR U+5F91 +ENCODING 24465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +2248 +4A48 +0C90 +1248 +1248 +3000 +53F8 +1040 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+5F92 +ENCODING 24466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +23F8 +4840 +0840 +17FC +1040 +3240 +5278 +1240 +1240 +1540 +18C0 +103C +0000 +ENDCHAR +STARTCHAR U+5F93 +ENCODING 24467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +1110 +2120 +4FFC +0840 +1040 +1240 +3278 +5240 +1240 +1340 +14C0 +1460 +181C +0000 +ENDCHAR +STARTCHAR U+5F95 +ENCODING 24469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1048 +27FC +4840 +0A48 +1150 +37FE +5040 +90E0 +1150 +1248 +144E +1844 +1040 +1040 +ENDCHAR +STARTCHAR U+5F96 +ENCODING 24470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +13FF +3201 +6201 +C8FC +1800 +1000 +33FF +7020 +D124 +1124 +1126 +1322 +1223 +10E0 +ENDCHAR +STARTCHAR U+5F97 +ENCODING 24471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +2110 +49F0 +0910 +11F0 +1000 +37FC +5010 +17FC +1110 +1090 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+5F98 +ENCODING 24472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +20A0 +4FBC +08A0 +10A0 +17B8 +30A0 +50A0 +1FBC +1120 +1120 +1220 +1420 +0000 +ENDCHAR +STARTCHAR U+5F99 +ENCODING 24473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +2240 +4A78 +0A40 +1240 +17FC +3040 +5240 +1278 +1240 +1340 +14C0 +183C +0000 +ENDCHAR +STARTCHAR U+5F9B +ENCODING 24475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +2020 +4850 +098C +17FF +3004 +53E4 +1224 +13E4 +1224 +1004 +1014 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+5F9C +ENCODING 24476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +124C +2148 +4950 +0844 +17FE +3404 +5404 +95F4 +1514 +1514 +15F4 +1404 +1414 +1408 +ENDCHAR +STARTCHAR U+5F9D +ENCODING 24477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1810 +17FF +3010 +60FE +CA82 +1A82 +12FE +3282 +7282 +D2FE +1282 +1282 +12FE +1200 +13FF +ENDCHAR +STARTCHAR U+5F9E +ENCODING 24478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +2110 +4AA8 +0AA4 +1444 +1040 +3240 +5240 +1278 +1240 +1540 +14C0 +183C +0000 +ENDCHAR +STARTCHAR U+5F9F +ENCODING 24479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +13FF +2222 +4A22 +0AFA +1222 +33FE +5202 +12FA +128A +12FA +128A +1202 +1404 +0000 +0000 +ENDCHAR +STARTCHAR U+5FA0 +ENCODING 24480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +27FC +4950 +0950 +1358 +12E4 +3444 +50E0 +10D0 +1150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+5FA1 +ENCODING 24481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1238 +23E8 +4D28 +0928 +17E8 +1128 +3528 +55E8 +1528 +1578 +15A0 +1E20 +1020 +0000 +ENDCHAR +STARTCHAR U+5FA2 +ENCODING 24482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +17FF +3020 +63FE +C822 +1BFF +1022 +33FE +7020 +D120 +113E +1120 +13A0 +16E0 +143F +ENDCHAR +STARTCHAR U+5FA4 +ENCODING 24484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3F7E +6112 +4212 +94FF +1F12 +3112 +217E +6510 +E57E +2710 +22FF +2210 +2610 +2500 +2CFF +ENDCHAR +STARTCHAR U+5FA5 +ENCODING 24485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +1104 +21FC +4504 +09FC +1000 +37FF +5020 +1120 +1120 +113C +11A0 +1260 +143F +0000 +0000 +ENDCHAR +STARTCHAR U+5FA6 +ENCODING 24486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +13DF +2241 +4241 +0BDF +1200 +321F +53C1 +1211 +1211 +13CA +1204 +120A +1211 +0000 +0000 +ENDCHAR +STARTCHAR U+5FA7 +ENCODING 24487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1BFF +1000 +33FE +6202 +CA02 +1BFE +1200 +33FF +7349 +D349 +17FF +1549 +1949 +1149 +114B +ENDCHAR +STARTCHAR U+5FA8 +ENCODING 24488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0880 +11F8 +1508 +25F8 +4908 +09F8 +1800 +2FFC +4840 +0BF8 +0840 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+5FA9 +ENCODING 24489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +21FC +4BF0 +0D10 +11F0 +1110 +31F0 +5080 +11F0 +16A0 +1040 +11B0 +1E0C +0000 +ENDCHAR +STARTCHAR U+5FAA +ENCODING 24490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +23E0 +4A20 +0BFC +1220 +12F8 +3288 +52F8 +1288 +12F8 +1488 +14F8 +1888 +0000 +ENDCHAR +STARTCHAR U+5FAB +ENCODING 24491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +1BFC +1084 +3084 +67FF +C800 +19FC +1104 +31FC +7008 +D3FE +1088 +1088 +17FF +1008 +1008 +ENDCHAR +STARTCHAR U+5FAC +ENCODING 24492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +13FF +3084 +6048 +CBFF +1A01 +1221 +3020 +73FF +D040 +107E +10C2 +1082 +1182 +130E +ENDCHAR +STARTCHAR U+5FAD +ENCODING 24493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F0 +2190 +4E60 +0940 +1180 +17F8 +3140 +5240 +17FC +1040 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+5FAE +ENCODING 24494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1AA0 +2AA0 +4AA0 +1FFC +1848 +20C8 +7FE8 +2628 +2630 +2A90 +2B30 +32C8 +2004 +0000 +ENDCHAR +STARTCHAR U+5FAF +ENCODING 24495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +183C +13C2 +3466 +6624 +CA40 +18C8 +1190 +30A4 +707E +D3C3 +1020 +17FF +1050 +118C +1707 +ENDCHAR +STARTCHAR U+5FB0 +ENCODING 24496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFE +1820 +1020 +313C +6120 +C920 +1BFF +1000 +3000 +73FE +D020 +1020 +113C +1120 +1120 +17FF +ENDCHAR +STARTCHAR U+5FB1 +ENCODING 24497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FF +3090 +23FE +6292 +CA92 +1BFE +1000 +33FE +7000 +D7FF +1020 +1124 +1326 +1623 +10E0 +ENDCHAR +STARTCHAR U+5FB2 +ENCODING 24498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +09FE +1102 +25FE +4510 +09D6 +1110 +31D6 +5150 +117E +1150 +12FF +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+5FB3 +ENCODING 24499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +27FC +4840 +0BF8 +12A8 +12A8 +33F8 +5308 +10D0 +1528 +1504 +1914 +10F0 +0000 +ENDCHAR +STARTCHAR U+5FB4 +ENCODING 24500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1AA0 +2AA0 +4AA0 +1FFC +1048 +2FC8 +6228 +2228 +2FB0 +2210 +23B0 +2C48 +2084 +0000 +ENDCHAR +STARTCHAR U+5FB5 +ENCODING 24501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +1210 +2A90 +4AA4 +8FBE +1044 +2FA4 +6028 +AFA8 +2210 +2F90 +2228 +23A8 +2E44 +2086 +2100 +ENDCHAR +STARTCHAR U+5FB6 +ENCODING 24502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1544 +2544 +4548 +110F +1FE2 +292A +692A +2BAA +2D6A +292A +2924 +292A +2961 +0000 +0000 +ENDCHAR +STARTCHAR U+5FB7 +ENCODING 24503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +2FFE +2040 +47FC +94A4 +14A4 +27FC +6000 +AFFE +2040 +2120 +2524 +250A +28FA +2000 +ENDCHAR +STARTCHAR U+5FB8 +ENCODING 24504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +13FF +3084 +6048 +CBFF +1800 +11FE +3122 +71FE +D122 +11FE +1020 +11FE +1020 +13FF +ENDCHAR +STARTCHAR U+5FB9 +ENCODING 24505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +2FE0 +4B20 +0AFC +1FC8 +1048 +37A8 +54A8 +17B0 +1490 +17B0 +14C8 +1584 +0000 +ENDCHAR +STARTCHAR U+5FBB +ENCODING 24507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0870 +0888 +1174 +2A02 +4DFD +11AC +3174 +51FC +1000 +10F8 +1088 +10F8 +1088 +10F8 +0000 +0000 +ENDCHAR +STARTCHAR U+5FBC +ENCODING 24508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1220 +27A0 +4CA0 +0FFC +14C8 +17A8 +3228 +5FB0 +1210 +1390 +12A8 +14C8 +1984 +0000 +ENDCHAR +STARTCHAR U+5FBD +ENCODING 24509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1AA0 +2AA0 +4FA0 +147C +1548 +3DC8 +6228 +2528 +3FB0 +2A90 +2B30 +32C8 +2284 +0000 +ENDCHAR +STARTCHAR U+5FBE +ENCODING 24510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +14A8 +27E8 +510F +17EA +3012 +53CA +100A +13CA +100A +13CA +1244 +124A +13D1 +0000 +0000 +ENDCHAR +STARTCHAR U+5FBF +ENCODING 24511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +13EE +2148 +47EE +0802 +13EE +3228 +53EE +1228 +122E +13E8 +122E +1229 +126F +0000 +0000 +ENDCHAR +STARTCHAR U+5FC0 +ENCODING 24512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +11FF +21EF +4529 +09EF +1044 +31FF +5044 +11FF +1044 +11FF +118A +1084 +10CB +0000 +0000 +ENDCHAR +STARTCHAR U+5FC1 +ENCODING 24513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +107A +2042 +447E +0892 +10FE +3111 +51FF +1010 +11FF +1092 +1155 +1038 +1054 +0000 +0000 +ENDCHAR +STARTCHAR U+5FC3 +ENCODING 24515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0080 +0040 +0240 +0200 +0200 +1210 +1208 +1204 +2204 +4200 +0210 +0210 +01F0 +0000 +ENDCHAR +STARTCHAR U+5FC4 +ENCODING 24516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1000 +1000 +5800 +5400 +5000 +9000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +1000 +ENDCHAR +STARTCHAR U+5FC5 +ENCODING 24517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0110 +0090 +0490 +0420 +0420 +2450 +2448 +2484 +4504 +4600 +0410 +1C10 +63F0 +0000 +ENDCHAR +STARTCHAR U+5FC6 +ENCODING 24518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +13F8 +1010 +5820 +5440 +5080 +9100 +1200 +1200 +1400 +1400 +1402 +1402 +13FE +1000 +ENDCHAR +STARTCHAR U+5FC7 +ENCODING 24519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +5020 +59FF +5421 +D421 +9021 +1021 +1061 +1041 +1041 +10C3 +1082 +1182 +130E +ENDCHAR +STARTCHAR U+5FC8 +ENCODING 24520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0000 +0000 +0000 +0000 +7FFE +0000 +0180 +04C0 +2446 +2403 +6409 +C618 +03F0 +ENDCHAR +STARTCHAR U+5FC9 +ENCODING 24521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +17FE +1044 +5844 +5444 +5044 +9044 +1044 +1044 +1084 +1084 +1084 +1104 +1228 +1410 +ENDCHAR +STARTCHAR U+5FCB +ENCODING 24523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1002 +5002 +5802 +5402 +D5FE +9100 +1100 +1100 +1100 +1100 +1101 +1183 +10FE +1000 +ENDCHAR +STARTCHAR U+5FCC +ENCODING 24524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +0020 +0020 +1FE0 +1020 +1008 +0FF8 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+5FCD +ENCODING 24525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0110 +0D10 +0310 +0290 +0C10 +3060 +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+5FCF +ENCODING 24527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +13E0 +1040 +5840 +5440 +5044 +97FE +1040 +1040 +1040 +1040 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+5FD0 +ENCODING 24528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0110 +01F8 +0100 +0100 +0104 +7FFE +0000 +0A00 +2988 +2884 +4812 +8812 +07F0 +0000 +ENDCHAR +STARTCHAR U+5FD1 +ENCODING 24529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +0100 +0180 +0160 +0130 +0110 +0100 +0000 +0A00 +2988 +2884 +4812 +8812 +07F0 +0000 +ENDCHAR +STARTCHAR U+5FD2 +ENCODING 24530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00A0 +0094 +00FE +FF80 +0040 +0840 +0440 +1420 +54A0 +5060 +5050 +9112 +110A +0F0A +0004 +ENDCHAR +STARTCHAR U+5FD3 +ENCODING 24531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1020 +5020 +5820 +5420 +D420 +93FF +1020 +1020 +1020 +1020 +1020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+5FD4 +ENCODING 24532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +51FF +5900 +5500 +D6FE +9018 +1030 +1060 +10C0 +1080 +1180 +1101 +1183 +10FE +ENDCHAR +STARTCHAR U+5FD5 +ENCODING 24533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +5822 +57FF +5020 +5020 +1020 +1020 +1050 +1088 +1104 +1202 +1401 +0000 +0000 +ENDCHAR +STARTCHAR U+5FD6 +ENCODING 24534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1010 +1010 +1810 +37FC +3410 +3110 +5090 +1090 +1010 +1010 +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+5FD7 +ENCODING 24535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0100 +0100 +1FF0 +0100 +0490 +1488 +1404 +2424 +4420 +03E0 +0000 +ENDCHAR +STARTCHAR U+5FD8 +ENCODING 24536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0800 +0800 +0800 +07F0 +0100 +0480 +0490 +2408 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+5FD9 +ENCODING 24537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +17FC +3900 +3500 +3500 +5100 +1100 +1100 +1100 +1100 +10F8 +1000 +0000 +ENDCHAR +STARTCHAR U+5FDC +ENCODING 24540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1080 +1040 +1120 +1120 +1508 +1504 +1504 +2904 +2910 +4110 +00F0 +0000 +ENDCHAR +STARTCHAR U+5FDD +ENCODING 24541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +01C0 +1F00 +0100 +7FFC +0280 +0440 +1A30 +620C +0B20 +0A90 +1248 +2248 +0600 +0000 +ENDCHAR +STARTCHAR U+5FDE +ENCODING 24542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +0810 +0C30 +0660 +03C0 +06E0 +1C38 +700E +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+5FE0 +ENCODING 24544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1FF0 +1110 +1110 +1110 +1FF0 +1110 +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+5FE1 +ENCODING 24545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2040 +2044 +B7FE +AC44 +A444 +A444 +2444 +27FC +2444 +2040 +2040 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+5FE2 +ENCODING 24546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +0100 +0100 +1FF0 +0210 +0610 +0410 +7FFE +0000 +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+5FE3 +ENCODING 24547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FE +1104 +5908 +5510 +513F +5101 +1142 +1124 +1118 +1218 +1424 +1042 +1181 +0000 +0000 +ENDCHAR +STARTCHAR U+5FE4 +ENCODING 24548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1100 +19F8 +3640 +3440 +3040 +57FC +1040 +1040 +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+5FE5 +ENCODING 24549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1FFE +2000 +47F8 +0000 +7FFC +0004 +0204 +2A44 +2924 +2815 +4845 +07C3 +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+5FE7 +ENCODING 24551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10A0 +1090 +1090 +5884 +57FE +5140 +9140 +1140 +1140 +1240 +1240 +1242 +1442 +143E +1800 +ENDCHAR +STARTCHAR U+5FE8 +ENCODING 24552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1000 +5000 +5800 +5400 +D5FF +9048 +1048 +1048 +1048 +1048 +1048 +10C9 +1089 +1187 +ENDCHAR +STARTCHAR U+5FE9 +ENCODING 24553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +0C30 +1918 +310C +E327 +0620 +0CF0 +3F18 +000C +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+5FEA +ENCODING 24554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1020 +10A0 +1090 +5910 +5508 +520E +9444 +1040 +1080 +1080 +1110 +1208 +13FC +1004 +1000 +ENDCHAR +STARTCHAR U+5FEB +ENCODING 24555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +13F8 +3848 +3448 +3448 +53FC +1060 +10A0 +1090 +1110 +1208 +1404 +0000 +ENDCHAR +STARTCHAR U+5FEC +ENCODING 24556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1006 +5068 +5830 +5418 +D5FF +9011 +1011 +1011 +1017 +1010 +1010 +1010 +1010 +1070 +ENDCHAR +STARTCHAR U+5FED +ENCODING 24557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +1004 +17FE +5840 +5440 +5060 +9050 +104C +1044 +1040 +1040 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+5FEE +ENCODING 24558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1044 +17FE +5840 +5440 +5040 +93F8 +1208 +1110 +10A0 +1040 +10A0 +1110 +120E +1C04 +ENDCHAR +STARTCHAR U+5FEF +ENCODING 24559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +5110 +5910 +5510 +D510 +91FF +1110 +1118 +1108 +1108 +110C +1105 +11E7 +1702 +ENDCHAR +STARTCHAR U+5FF0 +ENCODING 24560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +13E0 +18A0 +34A4 +3524 +311C +5240 +1040 +17FC +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+5FF1 +ENCODING 24561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +13FC +3A44 +3648 +3460 +5060 +10A0 +10A0 +1120 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+5FF2 +ENCODING 24562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +5020 +5BFF +5420 +D420 +9020 +1070 +1050 +1050 +10D8 +1088 +11AC +1136 +1313 +ENDCHAR +STARTCHAR U+5FF3 +ENCODING 24563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1026 +103C +51E0 +5820 +5524 +D524 +9124 +1124 +1124 +11FC +1020 +1020 +1021 +1033 +101E +ENDCHAR +STARTCHAR U+5FF4 +ENCODING 24564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1050 +1088 +1904 +5202 +54F9 +5000 +1000 +13FE +1002 +1004 +1008 +1010 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+5FF5 +ENCODING 24565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1FF0 +600C +0FE0 +0040 +0180 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+5FF6 +ENCODING 24566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1000 +5000 +5800 +5400 +D5FE +9040 +1040 +1040 +10C8 +108C +1084 +109E +11F3 +1301 +ENDCHAR +STARTCHAR U+5FF7 +ENCODING 24567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1202 +5202 +5A02 +568A +5252 +1222 +1252 +128A +1202 +1202 +13FE +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+5FF8 +ENCODING 24568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +1110 +1910 +3510 +3510 +37FC +5110 +1110 +1110 +1110 +1110 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+5FFA +ENCODING 24570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +50FF +5891 +5593 +D412 +9010 +1010 +1038 +1028 +1028 +106C +1044 +10C6 +1083 +ENDCHAR +STARTCHAR U+5FFB +ENCODING 24571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +11C0 +1900 +3500 +35FC +3110 +5110 +1110 +1110 +1210 +1210 +1410 +1810 +0000 +ENDCHAR +STARTCHAR U+5FFC +ENCODING 24572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +53FF +5800 +5400 +D4F8 +9088 +1088 +1088 +1088 +1088 +1188 +1109 +1309 +1607 +ENDCHAR +STARTCHAR U+5FFD +ENCODING 24573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1248 +2248 +4488 +0888 +0130 +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+5FFE +ENCODING 24574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1104 +11FE +1200 +5BF8 +5400 +53F0 +9010 +1010 +1010 +1010 +1010 +1012 +100A +1006 +1002 +ENDCHAR +STARTCHAR U+5FFF +ENCODING 24575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +0440 +0820 +1010 +6FEC +0220 +0420 +18C0 +0100 +0490 +2488 +2404 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6000 +ENCODING 24576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +17FE +1020 +5820 +5440 +5040 +90D0 +114C +1246 +1442 +1840 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+6001 +ENCODING 24577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +FFFE +0100 +0280 +0440 +0A30 +310E +C004 +0200 +2910 +2908 +2824 +4824 +07E0 +0000 +ENDCHAR +STARTCHAR U+6002 +ENCODING 24578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +0820 +0820 +1450 +1450 +2288 +228E +4104 +8000 +2A10 +2988 +28A4 +4824 +07E0 +0000 +ENDCHAR +STARTCHAR U+6003 +ENCODING 24579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +17FC +1040 +5840 +5444 +5FFE +9040 +1060 +10A0 +10A0 +10A0 +1122 +1122 +121E +1400 +ENDCHAR +STARTCHAR U+6004 +ENCODING 24580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1200 +1204 +5A84 +5648 +5248 +9230 +1210 +1228 +1248 +1284 +1304 +1200 +13FE +1000 +ENDCHAR +STARTCHAR U+6005 +ENCODING 24581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1108 +1110 +1120 +5940 +5580 +5104 +9FFE +1140 +1140 +1120 +1120 +1110 +114E +1184 +1100 +ENDCHAR +STARTCHAR U+6006 +ENCODING 24582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +1090 +5908 +560E +5404 +91F0 +1110 +1110 +1150 +1120 +1104 +1104 +10FC +1000 +ENDCHAR +STARTCHAR U+6007 +ENCODING 24583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1100 +5100 +5900 +55FE +D502 +9102 +1102 +11FE +1100 +1100 +1100 +1100 +11FF +1000 +ENDCHAR +STARTCHAR U+6009 +ENCODING 24585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10FE +1102 +5802 +55F2 +5112 +5112 +11F2 +1102 +110C +1100 +1101 +1101 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+600A +ENCODING 24586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +13FE +1084 +5884 +5484 +5114 +9208 +1400 +13FC +1204 +1204 +1204 +1204 +13FC +1204 +ENDCHAR +STARTCHAR U+600B +ENCODING 24587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1102 +1102 +59FE +5510 +5110 +51FE +1110 +1110 +1108 +1128 +1145 +1183 +1301 +0000 +0000 +ENDCHAR +STARTCHAR U+600C +ENCODING 24588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FF +1008 +5810 +5420 +5040 +50A0 +5124 +1222 +1021 +1020 +1020 +17FF +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+600D +ENCODING 24589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1100 +1104 +11FE +5A80 +5480 +5088 +90FC +1080 +1080 +1088 +10FC +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U+600E +ENCODING 24590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0FFC +1100 +11F0 +2100 +41F0 +0100 +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+600F +ENCODING 24591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +1BF8 +3648 +3648 +3248 +57FC +1040 +10C0 +10A0 +1120 +1210 +1C0C +0000 +ENDCHAR +STARTCHAR U+6010 +ENCODING 24592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1100 +3BF8 +3608 +3408 +53C8 +1248 +1248 +1248 +13C8 +1248 +1008 +1030 +0000 +ENDCHAR +STARTCHAR U+6011 +ENCODING 24593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +1124 +58A8 +5420 +51FC +5020 +5020 +17FF +1020 +1020 +1020 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+6012 +ENCODING 24594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +7FF8 +1288 +1250 +3C20 +04D0 +1B0C +6100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6013 +ENCODING 24595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +213F +2111 +A111 +B7D1 +AA51 +AA5B +AA4A +A24A +26CE +2484 +2FCE +214A +210A +231B +2631 +ENDCHAR +STARTCHAR U+6014 +ENCODING 24596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +1040 +1040 +5840 +5440 +5048 +927C +1240 +1240 +1240 +1240 +1240 +1244 +1FFE +1000 +ENDCHAR +STARTCHAR U+6015 +ENCODING 24597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1080 +19F8 +3508 +3508 +3108 +51F8 +1108 +1108 +1108 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+6016 +ENCODING 24598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +17FC +38A0 +3520 +35FC +5324 +1524 +1924 +1124 +1138 +1020 +1020 +0000 +ENDCHAR +STARTCHAR U+6017 +ENCODING 24599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +5020 +583F +5420 +D420 +9020 +1020 +11FE +1102 +1102 +1102 +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+6018 +ENCODING 24600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0100 +0100 +1FF8 +1008 +1008 +1008 +1FF8 +0000 +25C6 +2463 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+6019 +ENCODING 24601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +3BFC +3440 +3440 +5040 +13F8 +1208 +1208 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+601A +ENCODING 24602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1104 +5104 +5904 +55FC +D504 +9104 +1104 +11FC +1104 +1104 +1104 +1104 +17FF +1000 +ENDCHAR +STARTCHAR U+601B +ENCODING 24603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +1910 +3510 +35F0 +3110 +5110 +1110 +11F0 +1110 +1000 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+601C +ENCODING 24604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +18A0 +3510 +37F8 +3404 +53F8 +1048 +1048 +1048 +1070 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+601D +ENCODING 24605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+601E +ENCODING 24606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +5010 +59FF +5511 +5111 +5111 +11FF +1111 +1111 +1111 +11FF +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+601F +ENCODING 24607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +5110 +5910 +5510 +D5FF +9110 +1110 +1118 +1108 +11C8 +170C +1005 +17F7 +1002 +ENDCHAR +STARTCHAR U+6020 +ENCODING 24608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0240 +0430 +7FE8 +0004 +0FE0 +0820 +0820 +0FE0 +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6021 +ENCODING 24609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1840 +3490 +3488 +311C +57E4 +1000 +13F8 +1208 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+6022 +ENCODING 24610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +10FE +1910 +5410 +5010 +51FF +5010 +1010 +1028 +1044 +1082 +1101 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+6024 +ENCODING 24612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1808 +17FF +3008 +6308 +A188 +2088 +2008 +2008 +2038 +0180 +04C6 +2443 +2409 +6618 +C3F0 +ENDCHAR +STARTCHAR U+6025 +ENCODING 24613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +07C0 +0880 +3FF0 +0010 +0FF0 +0010 +1FF0 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6026 +ENCODING 24614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +1950 +3548 +3648 +3040 +57FC +1040 +1040 +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+6027 +ENCODING 24615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1140 +1140 +13F8 +3A40 +3440 +3440 +53F8 +1040 +1040 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6028 +ENCODING 24616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1188 +2A88 +46B0 +0484 +187C +6100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6029 +ENCODING 24617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1A08 +3608 +37F8 +3208 +5280 +1288 +1290 +12E0 +1480 +1484 +1884 +107C +0000 +ENDCHAR +STARTCHAR U+602A +ENCODING 24618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1110 +10A0 +38C0 +3730 +344C +5040 +13F8 +1040 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+602B +ENCODING 24619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +13F8 +18A8 +34A8 +37F8 +32A0 +52A0 +13FC +12A4 +10A4 +10B8 +1120 +1220 +0000 +ENDCHAR +STARTCHAR U+602C +ENCODING 24620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1129 +5929 +5529 +5129 +5149 +118F +1101 +1101 +1101 +11FF +1101 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+602D +ENCODING 24621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1060 +1030 +1010 +5044 +5844 +544C +D448 +9158 +115E +1173 +1361 +1240 +10C0 +1141 +1663 +103E +ENDCHAR +STARTCHAR U+602E +ENCODING 24622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1088 +10BF +5909 +5649 +57C9 +5089 +1109 +1249 +17C9 +1051 +1021 +104A +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+602F +ENCODING 24623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +13F8 +3840 +3440 +3440 +57FC +1040 +1090 +1088 +1138 +17C4 +1004 +0000 +ENDCHAR +STARTCHAR U+6031 +ENCODING 24625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1248 +2E48 +4588 +08C8 +0130 +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6032 +ENCODING 24626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1010 +1010 +5810 +55FF +5111 +5111 +1111 +1129 +1145 +1101 +1101 +1105 +1102 +0000 +0000 +ENDCHAR +STARTCHAR U+6033 +ENCODING 24627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +5102 +5902 +5502 +D502 +91FE +1048 +1048 +1048 +1048 +10C8 +1089 +1189 +1307 +ENDCHAR +STARTCHAR U+6034 +ENCODING 24628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +1012 +1010 +59FF +5510 +5110 +5112 +1112 +1114 +1108 +1155 +11A3 +1301 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+6035 +ENCODING 24629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +1048 +1040 +5BFE +5440 +50C0 +90E0 +1150 +1150 +1248 +144E +1844 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+6037 +ENCODING 24631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +0082 +7FFF +0080 +0888 +1088 +208F +0180 +0080 +0800 +2882 +2841 +4809 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+6039 +ENCODING 24633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1120 +27FC +6124 +2120 +2101 +21FF +0000 +0100 +0084 +2442 +2401 +4408 +07F8 +0000 +0000 +ENDCHAR +STARTCHAR U+603A +ENCODING 24634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1020 +1020 +19C0 +3448 +3468 +33F0 +50E0 +1150 +1150 +1248 +1444 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+603B +ENCODING 24635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0820 +0440 +0010 +1FF8 +1010 +1010 +1010 +1FF0 +1010 +0200 +5184 +5092 +9012 +0FF0 +0000 +ENDCHAR +STARTCHAR U+603C +ENCODING 24636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7E14 +03FE +2410 +1490 +0850 +1410 +2250 +4020 +2A08 +2984 +4892 +8812 +07F0 +0000 +ENDCHAR +STARTCHAR U+603F +ENCODING 24639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13F8 +1110 +10A0 +5840 +54A0 +5150 +924E +15F4 +1040 +1048 +17FC +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+6040 +ENCODING 24640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +107C +10C4 +518C +5B58 +5430 +D460 +91D0 +101F +1031 +10E3 +1192 +1016 +100C +1038 +13E0 +ENDCHAR +STARTCHAR U+6041 +ENCODING 24641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +0BE0 +1040 +1040 +37FC +5040 +1040 +13F8 +1100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6042 +ENCODING 24642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1100 +19F8 +3608 +37C8 +3248 +53C8 +1248 +13C8 +1248 +1008 +1008 +1030 +0000 +ENDCHAR +STARTCHAR U+6043 +ENCODING 24643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +1840 +3440 +37FC +3010 +5010 +17FC +1110 +1090 +1090 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+6044 +ENCODING 24644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +1820 +5420 +5020 +53FE +1000 +13FE +1202 +1202 +1202 +13FE +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+6045 +ENCODING 24645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1042 +13FC +1848 +5050 +57FF +5040 +1080 +1140 +127E +1440 +1040 +1040 +103F +0000 +0000 +ENDCHAR +STARTCHAR U+6046 +ENCODING 24646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1100 +1900 +35F0 +3590 +3150 +5150 +1310 +12A0 +12A0 +1020 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+6047 +ENCODING 24647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1100 +517F +5908 +5508 +D508 +9108 +113E +1108 +1108 +1108 +1108 +117F +1100 +11FF +ENDCHAR +STARTCHAR U+6048 +ENCODING 24648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10C4 +1084 +51FE +5802 +5490 +D490 +91FE +1310 +1010 +1010 +13FF +1010 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+6049 +ENCODING 24649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +110E +11F8 +5100 +5901 +5583 +D4FE +9000 +1000 +11FE +1102 +1102 +11FE +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+604A +ENCODING 24650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +1888 +3488 +3508 +3230 +5210 +1FFC +1294 +1294 +14A4 +14A4 +19CC +0000 +ENDCHAR +STARTCHAR U+604B +ENCODING 24651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0240 +1250 +1248 +2244 +44C4 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+604C +ENCODING 24652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +1048 +1249 +534B +594E +5448 +D448 +9048 +104E +11CB +1349 +1048 +10C8 +1089 +1189 +1307 +ENDCHAR +STARTCHAR U+604D +ENCODING 24653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1248 +1948 +3550 +3440 +37FC +50A0 +10A0 +10A0 +1120 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+6050 +ENCODING 24656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF0 +0910 +0910 +0990 +0F54 +7254 +040C +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6051 +ENCODING 24657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +107E +10C4 +5108 +5BFF +5500 +D500 +917E +1142 +1142 +1142 +114E +1140 +1341 +1263 +103E +ENDCHAR +STARTCHAR U+6052 +ENCODING 24658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1000 +11F0 +3910 +3510 +35F0 +5110 +1110 +11F0 +1110 +1000 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6053 +ENCODING 24659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1028 +1028 +5828 +55FF +5129 +1129 +1149 +118F +1101 +1101 +1101 +11FF +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+6054 +ENCODING 24660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +53FF +5884 +5586 +D703 +9088 +1088 +10D8 +1070 +1020 +1070 +10D8 +118C +1307 +ENDCHAR +STARTCHAR U+6055 +ENCODING 24661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +7EF8 +1288 +1288 +3C88 +06F8 +1888 +6100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6056 +ENCODING 24662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0200 +3FFC +2624 +2364 +21C4 +2364 +2E34 +2004 +3FFC +0080 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+6057 +ENCODING 24663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +5048 +5884 +5503 +D4FC +9000 +13FF +1040 +1080 +11FE +1002 +1002 +1006 +101C +ENDCHAR +STARTCHAR U+6058 +ENCODING 24664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +1108 +5A7F +5508 +5108 +5108 +111C +112A +1149 +1108 +1108 +1108 +1108 +0000 +0000 +ENDCHAR +STARTCHAR U+6059 +ENCODING 24665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +3FF8 +0100 +1FF0 +0100 +0100 +7FFC +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+605A +ENCODING 24666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0100 +7FFC +0100 +1FF0 +0100 +7FFC +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+605B +ENCODING 24667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +11FF +5901 +5501 +517D +5145 +1145 +1145 +117D +1101 +1101 +11FF +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+605D +ENCODING 24669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +7F7E +0824 +3E24 +0824 +7F44 +0854 +0888 +0000 +2A08 +2984 +4892 +8812 +07F0 +0000 +ENDCHAR +STARTCHAR U+605E +ENCODING 24670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1020 +5BFE +5022 +57FE +1420 +17FF +1021 +1021 +1052 +1088 +1104 +1603 +0000 +0000 +ENDCHAR +STARTCHAR U+605F +ENCODING 24671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1200 +1200 +1BF8 +3448 +3648 +39A8 +54A8 +1568 +1628 +17E8 +1428 +1008 +1030 +0000 +ENDCHAR +STARTCHAR U+6060 +ENCODING 24672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +1BFC +3500 +3520 +3220 +5620 +1AF8 +1220 +1220 +1220 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+6061 +ENCODING 24673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +10CC +1030 +5078 +59CC +5400 +D480 +93FF +1080 +1090 +1090 +11B4 +1124 +1324 +167E +10C2 +ENDCHAR +STARTCHAR U+6062 +ENCODING 24674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1200 +1220 +3A28 +36A8 +36B0 +52A0 +1320 +1220 +1250 +1490 +1B08 +1C04 +0000 +ENDCHAR +STARTCHAR U+6063 +ENCODING 24675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +79FC +0248 +0450 +18A0 +6110 +060C +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6064 +ENCODING 24676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +1880 +37F8 +36A8 +32A8 +52A8 +12A8 +12A8 +12A8 +12A8 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+6065 +ENCODING 24677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E10 +2410 +2440 +3C40 +2440 +2548 +3D44 +2544 +2644 +3E40 +6448 +0448 +0438 +0000 +ENDCHAR +STARTCHAR U+6066 +ENCODING 24678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1040 +1080 +59FF +5501 +517D +5145 +1145 +1145 +117D +1145 +1101 +1105 +1102 +0000 +0000 +ENDCHAR +STARTCHAR U+6067 +ENCODING 24679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0200 +0408 +3FFC +2448 +2448 +2448 +2458 +0000 +2A08 +2984 +4892 +8812 +07F0 +0000 +ENDCHAR +STARTCHAR U+6068 +ENCODING 24680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +1910 +35F0 +3510 +3110 +51F4 +1144 +1128 +1130 +1150 +1188 +1604 +0000 +ENDCHAR +STARTCHAR U+6069 +ENCODING 24681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +12D0 +1C30 +1FF0 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+606A +ENCODING 24682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +10F0 +1910 +35A0 +3660 +3060 +5090 +11F8 +1714 +1110 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+606B +ENCODING 24683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +1A08 +37F8 +3608 +32E8 +52A8 +12A8 +12E8 +12A8 +1208 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+606C +ENCODING 24684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +13C0 +1840 +3440 +37FC +3040 +5040 +13F8 +1208 +1208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+606D +ENCODING 24685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +3FF8 +0440 +0440 +7FFC +0440 +0A20 +1210 +620C +1290 +1248 +2248 +0600 +0000 +ENDCHAR +STARTCHAR U+606E +ENCODING 24686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1050 +1088 +5D04 +5202 +5401 +51FC +1020 +1020 +11FC +1020 +1020 +1022 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+606F +ENCODING 24687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6070 +ENCODING 24688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +18A0 +3510 +37F8 +3404 +5000 +11F0 +1110 +1110 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+6071 +ENCODING 24689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +118C +5347 +5840 +54C8 +D488 +90BC +11E6 +1000 +1050 +1050 +1050 +10D1 +119B +130E +ENDCHAR +STARTCHAR U+6072 +ENCODING 24690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +1050 +1BFE +5488 +5088 +5088 +17FF +1088 +1088 +1108 +1208 +1408 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+6073 +ENCODING 24691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +2010 +3FF0 +2010 +3FF0 +2208 +2190 +2460 +381C +0208 +5184 +5092 +9012 +0FF0 +0000 +ENDCHAR +STARTCHAR U+6075 +ENCODING 24693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6076 +ENCODING 24694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0440 +2448 +1458 +1460 +0440 +0444 +FFFE +0000 +2A10 +2988 +28A4 +4824 +07E0 +0000 +ENDCHAR +STARTCHAR U+6077 +ENCODING 24695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +17FC +10E0 +30E0 +5150 +1248 +1444 +1140 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6078 +ENCODING 24696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2110 +2F90 +3014 +A87E +A014 +BFD4 +A214 +2214 +2414 +2524 +28A4 +2FA4 +2044 +2094 +2108 +ENDCHAR +STARTCHAR U+6079 +ENCODING 24697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27FE +2440 +2450 +B448 +AC40 +A7FE +A440 +2440 +2440 +24A0 +24A0 +28A0 +2910 +310E +2604 +ENDCHAR +STARTCHAR U+607A +ENCODING 24698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +1248 +1248 +5BF8 +5400 +53F8 +9008 +1008 +13F8 +1208 +1200 +1202 +1202 +11FE +1000 +ENDCHAR +STARTCHAR U+607B +ENCODING 24699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +27E4 +2444 +2454 +B554 +AD54 +A554 +A554 +2554 +2554 +2554 +2104 +2284 +2244 +2454 +2808 +ENDCHAR +STARTCHAR U+607C +ENCODING 24700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +1004 +17FE +5800 +5214 +5314 +92A4 +12A4 +1244 +12A4 +131C +120C +1204 +13FC +1204 +ENDCHAR +STARTCHAR U+607D +ENCODING 24701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FE +2482 +2884 +B7F8 +A900 +A140 +A248 +27FC +2040 +2044 +2FFE +2040 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+607E +ENCODING 24702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FF +5088 +5820 +5420 +D420 +93FF +1080 +1080 +1080 +1080 +1080 +1080 +10C0 +107E +ENDCHAR +STARTCHAR U+607F +ENCODING 24703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FF0 +0240 +0188 +3FFC +2108 +3FF8 +2108 +3FF8 +2108 +2118 +0200 +5184 +5092 +9012 +0FF0 +0000 +ENDCHAR +STARTCHAR U+6080 +ENCODING 24704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1004 +1028 +5810 +55FF +5111 +51FF +1111 +11FF +1111 +1111 +1111 +1105 +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+6081 +ENCODING 24705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +1A08 +37F8 +3400 +33F8 +5208 +13F8 +1208 +13F8 +1208 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+6082 +ENCODING 24706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +1116 +51DC +5910 +5510 +D511 +91CF +1300 +1020 +1020 +13FE +1020 +1020 +17FF +1000 +ENDCHAR +STARTCHAR U+6083 +ENCODING 24707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +1A48 +3648 +37F8 +3248 +52E8 +12D8 +1358 +1248 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+6084 +ENCODING 24708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1150 +1148 +1A44 +3444 +37F8 +3208 +53F8 +1208 +13F8 +1208 +1208 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+6085 +ENCODING 24709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1078 +1004 +1902 +1601 +55FE +5104 +5104 +1104 +11FC +1090 +1090 +1091 +1111 +121F +1400 +ENDCHAR +STARTCHAR U+6086 +ENCODING 24710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0180 +0660 +0810 +37EC +E107 +1FF8 +0100 +0930 +1918 +330C +0000 +25C6 +2463 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+6087 +ENCODING 24711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +5882 +557D +5010 +5010 +11FF +1038 +1054 +1092 +1111 +1010 +1030 +0000 +0000 +ENDCHAR +STARTCHAR U+6088 +ENCODING 24712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +1012 +1010 +53FF +5810 +5550 +D552 +9152 +13F6 +1154 +115C +1148 +115D +1235 +1067 +10C2 +ENDCHAR +STARTCHAR U+6089 +ENCODING 24713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FD0 +1110 +0920 +7FFC +0380 +0D60 +711C +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+608A +ENCODING 24714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +10F8 +7C80 +10FE +1088 +1C88 +7088 +1188 +1308 +3008 +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+608B +ENCODING 24715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +1910 +34A0 +3440 +31B0 +560C +11F0 +1110 +1110 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+608C +ENCODING 24716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1090 +10A0 +1BF8 +3448 +37F8 +3240 +53FC +12C4 +10C4 +1144 +1258 +1440 +1040 +0000 +ENDCHAR +STARTCHAR U+608D +ENCODING 24717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +1BF8 +3608 +37F8 +3000 +53F8 +1040 +1040 +17FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+608E +ENCODING 24718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1120 +1120 +51FE +5A20 +5420 +D420 +93FF +1000 +1000 +11FE +1102 +1102 +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+6090 +ENCODING 24720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +5124 +2124 +50A8 +0820 +1820 +6850 +0888 +1306 +0000 +2482 +2441 +2405 +4404 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+6091 +ENCODING 24721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +1022 +13FF +5020 +5820 +55FE +D522 +9122 +11FE +1122 +1122 +11FE +1122 +1122 +1122 +1126 +ENDCHAR +STARTCHAR U+6092 +ENCODING 24722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +19F0 +3400 +37F8 +3248 +5248 +13F8 +1208 +1200 +1204 +1204 +11FC +0000 +ENDCHAR +STARTCHAR U+6093 +ENCODING 24723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +5102 +59FE +5502 +D502 +91FE +1102 +1102 +11FE +1048 +1048 +10C9 +1189 +1307 +ENDCHAR +STARTCHAR U+6094 +ENCODING 24724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +11FC +1A00 +35F0 +3550 +3150 +57FC +1250 +1250 +17FC +1410 +1010 +1060 +0000 +ENDCHAR +STARTCHAR U+6095 +ENCODING 24725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10C4 +106C +1038 +50EC +5B86 +5440 +D5FF +9080 +1120 +13FE +1522 +1122 +1122 +1122 +1126 +1020 +ENDCHAR +STARTCHAR U+6096 +ENCODING 24726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1BFC +1440 +37FC +3208 +35F0 +5020 +1040 +17FC +1040 +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+6097 +ENCODING 24727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F0 +1120 +1A40 +37F8 +3648 +3248 +53F8 +1248 +10E0 +10D0 +1154 +1244 +143C +0000 +ENDCHAR +STARTCHAR U+6098 +ENCODING 24728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +2400 +27F8 +2480 +2880 +3FFC +2120 +2210 +3FFE +0080 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+609A +ENCODING 24730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +1040 +3BF8 +3648 +3648 +53F8 +12C8 +10E0 +1150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+609B +ENCODING 24731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1050 +1088 +1BFC +34A4 +34A0 +3124 +529C +10F0 +1110 +12A0 +1040 +11B0 +160C +0000 +ENDCHAR +STARTCHAR U+609C +ENCODING 24732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1102 +1102 +5902 +55FE +5102 +5000 +11FE +1010 +1010 +11FE +1010 +1010 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+609D +ENCODING 24733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +17FE +1444 +5C44 +57FC +5444 +9444 +17FC +1040 +1048 +17FC +1040 +1044 +1FFE +1000 +ENDCHAR +STARTCHAR U+609E +ENCODING 24734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +107C +1144 +5144 +5944 +557C +D500 +9100 +11FE +1002 +1022 +13FF +1050 +10D8 +118C +1307 +ENDCHAR +STARTCHAR U+609F +ENCODING 24735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1040 +1840 +35F0 +3490 +3090 +57FC +1000 +11F8 +1108 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+60A0 +ENCODING 24736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +15FC +1510 +36A0 +5440 +15B0 +160C +1100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60A2 +ENCODING 24738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FC +5104 +5904 +55FC +D504 +9104 +11FC +1121 +1133 +1116 +111C +1108 +11EC +1707 +ENDCHAR +STARTCHAR U+60A3 +ENCODING 24739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0920 +0FE0 +0100 +1FF0 +1110 +1FF0 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60A4 +ENCODING 24740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0100 +1FFC +1104 +13E4 +1644 +1984 +1364 +1FFC +0400 +0200 +0902 +280A +2809 +4FF9 +4000 +ENDCHAR +STARTCHAR U+60A5 +ENCODING 24741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +0000 +0FF0 +0000 +0FF0 +0000 +1FF8 +1008 +1FF8 +0000 +25C6 +2463 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+60A6 +ENCODING 24742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1090 +10A0 +1BF8 +3608 +3608 +33F8 +52A8 +10A0 +1120 +1120 +1224 +1424 +181C +0000 +ENDCHAR +STARTCHAR U+60A7 +ENCODING 24743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +10A8 +1728 +1928 +3528 +37E8 +3128 +53A8 +1368 +1568 +1928 +1108 +1108 +1118 +0000 +ENDCHAR +STARTCHAR U+60A8 +ENCODING 24744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0900 +13FC +1204 +3448 +5940 +9150 +124C +1444 +1140 +1080 +0200 +5184 +5092 +9012 +0FF0 +ENDCHAR +STARTCHAR U+60A9 +ENCODING 24745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1088 +1248 +1150 +1920 +3440 +3420 +3328 +52A8 +1248 +1248 +12A8 +1308 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+60AA +ENCODING 24746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0280 +1FF0 +1290 +1FF0 +0280 +7FFC +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60AB +ENCODING 24747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7FFC +0100 +3FF8 +0000 +7FFE +4002 +8FE4 +0820 +0828 +3038 +0A00 +2984 +4892 +8812 +07F0 +ENDCHAR +STARTCHAR U+60AC +ENCODING 24748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +1010 +1FF0 +1010 +1FF0 +1014 +FFFE +0400 +0820 +1FF0 +0210 +5184 +5082 +9012 +0FF0 +0000 +ENDCHAR +STARTCHAR U+60AD +ENCODING 24749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2500 +25FC +2504 +B528 +AD10 +A528 +A546 +2580 +2080 +2090 +2FF8 +2080 +2084 +3FFE +2000 +ENDCHAR +STARTCHAR U+60AF +ENCODING 24751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +117E +1004 +1244 +5A24 +57FC +5294 +9254 +1254 +1224 +1254 +138C +1204 +1204 +1214 +1208 +ENDCHAR +STARTCHAR U+60B0 +ENCODING 24752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +15FF +1501 +5400 +50FE +5000 +1000 +11FF +1010 +1010 +1094 +1112 +1211 +1030 +ENDCHAR +STARTCHAR U+60B1 +ENCODING 24753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A0 +10A0 +10A8 +17BC +58A0 +54A0 +50A0 +97BC +10A0 +10A0 +10A4 +1FBE +10A0 +10A0 +10A0 +10A0 +ENDCHAR +STARTCHAR U+60B2 +ENCODING 24754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +0280 +3EF8 +0280 +3EF8 +0280 +7EFC +0480 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60B3 +ENCODING 24755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +27F0 +2410 +27F0 +27F0 +2410 +27F0 +3FFC +0100 +2488 +2424 +43E4 +0000 +ENDCHAR +STARTCHAR U+60B4 +ENCODING 24756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +1910 +3510 +3598 +3264 +5444 +1040 +17FC +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+60B5 +ENCODING 24757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1100 +19F0 +3500 +35F0 +3100 +57FC +1148 +1128 +1130 +1150 +1188 +1604 +0000 +ENDCHAR +STARTCHAR U+60B6 +ENCODING 24758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +2088 +2288 +2A28 +2A58 +3258 +21C8 +2018 +0000 +ENDCHAR +STARTCHAR U+60B7 +ENCODING 24759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2000 +A3FE +B202 +AA02 +ABFE +A220 +A220 +23FF +2220 +2270 +2650 +24D8 +218C +2307 +ENDCHAR +STARTCHAR U+60B8 +ENCODING 24760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E0 +1840 +17FC +34E0 +3150 +364C +51F0 +1020 +1040 +17FC +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+60B9 +ENCODING 24761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4001 +0FF8 +0808 +0FF8 +0800 +0FF8 +0808 +0FF8 +0002 +2481 +2449 +47F8 +0000 +0000 +ENDCHAR +STARTCHAR U+60BA +ENCODING 24762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1401 +5401 +59FC +5104 +5104 +11FC +1100 +11FC +1104 +1104 +11FC +1100 +0000 +0000 +ENDCHAR +STARTCHAR U+60BB +ENCODING 24763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +17FC +1040 +5844 +57FE +5208 +9110 +10A0 +17FC +1040 +1044 +1FFE +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+60BC +ENCODING 24764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +10FC +1880 +37F8 +3608 +33F8 +5208 +13F8 +1040 +1FFC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+60BD +ENCODING 24765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +1BF8 +3448 +37FC +3048 +53F8 +1080 +17FC +1110 +13E0 +10D0 +1708 +0000 +ENDCHAR +STARTCHAR U+60BE +ENCODING 24766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +5149 +5949 +54C8 +D58F +9000 +1000 +10FE +1010 +1010 +1010 +1010 +11FF +1000 +ENDCHAR +STARTCHAR U+60BF +ENCODING 24767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FC +1020 +5820 +57FF +5088 +5104 +1222 +14A1 +10A0 +10AA +112A +1225 +10A0 +1040 +0000 +0000 +ENDCHAR +STARTCHAR U+60C0 +ENCODING 24768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1050 +1088 +5904 +5202 +55FD +5000 +13FE +1252 +13FE +1252 +1252 +1252 +1204 +0000 +0000 +ENDCHAR +STARTCHAR U+60C1 +ENCODING 24769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0803 +083C +7F20 +083F +1C24 +2A24 +4924 +0824 +0844 +0000 +2444 +2422 +4409 +07F8 +0000 +0000 +ENDCHAR +STARTCHAR U+60C2 +ENCODING 24770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +107E +50C2 +5882 +5586 +D404 +901C +10C0 +119E +1102 +1102 +11DE +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+60C3 +ENCODING 24771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1202 +53FE +5A02 +5202 +53FE +1202 +1410 +1410 +17DF +1410 +1451 +1451 +17DF +0000 +0000 +ENDCHAR +STARTCHAR U+60C4 +ENCODING 24772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0EFE +0844 +7F6C +0838 +2A10 +6A38 +4B6C +5946 +0000 +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+60C5 +ENCODING 24773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1040 +19F0 +3440 +37FC +3000 +51F0 +1110 +11F0 +1110 +11F0 +1110 +1130 +0000 +ENDCHAR +STARTCHAR U+60C6 +ENCODING 24774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +1A48 +36E8 +3648 +32E8 +5248 +12E8 +12A8 +12A8 +14E8 +1488 +1818 +0000 +ENDCHAR +STARTCHAR U+60C7 +ENCODING 24775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1000 +19F0 +3510 +35F0 +3000 +53F0 +1020 +1040 +17FC +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+60C8 +ENCODING 24776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +5122 +59FE +5522 +D522 +91FE +1020 +13FF +10A8 +10AC +11A4 +1126 +1323 +1020 +ENDCHAR +STARTCHAR U+60C9 +ENCODING 24777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3040 +1840 +487E +6040 +3040 +03FC +0A04 +1204 +73FC +2000 +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+60CA +ENCODING 24778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1044 +17FE +1000 +5808 +57FC +5208 +9208 +1208 +13F8 +1040 +1150 +124C +1444 +1140 +1080 +ENDCHAR +STARTCHAR U+60CB +ENCODING 24779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2040 +27FE +3402 +AA04 +A200 +A3BC +A4A4 +24A4 +24B4 +2AA8 +2120 +2122 +2222 +241E +2800 +ENDCHAR +STARTCHAR U+60CC +ENCODING 24780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4001 +48FD +1F44 +3178 +0A40 +0442 +387E +0000 +2902 +2889 +2805 +4FFC +0000 +0000 +ENDCHAR +STARTCHAR U+60CD +ENCODING 24781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1050 +1088 +5904 +5202 +55FD +5020 +1020 +11FC +1020 +1222 +1124 +10A8 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+60CE +ENCODING 24782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +7FFE +0810 +0FF0 +0810 +0FF0 +0810 +FFFF +0810 +318C +C4C3 +144C +1406 +3608 +63F8 +ENDCHAR +STARTCHAR U+60CF +ENCODING 24783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2108 +2108 +A7BF +B108 +A908 +AB9C +A35C +252A +252A +2949 +2108 +2108 +2108 +2108 +2108 +ENDCHAR +STARTCHAR U+60D1 +ENCODING 24785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +7FFC +0090 +1E90 +1260 +1E64 +079C +7904 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60D3 +ENCODING 24787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1150 +1148 +1BF8 +34A0 +37FC +3110 +53F8 +1514 +1110 +1160 +1108 +1108 +10F8 +0000 +ENDCHAR +STARTCHAR U+60D4 +ENCODING 24788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1091 +1093 +51BA +5928 +546C +D4C6 +9193 +1010 +1091 +1093 +11BA +1128 +106C +10C6 +1183 +ENDCHAR +STARTCHAR U+60D5 +ENCODING 24789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1108 +59F8 +5508 +5108 +91F8 +1084 +11FE +12A4 +14A4 +10A4 +1124 +1254 +1088 +ENDCHAR +STARTCHAR U+60D8 +ENCODING 24792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1328 +1AA8 +36C8 +37F8 +3248 +53F8 +1288 +1288 +12E8 +1288 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+60D9 +ENCODING 24793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2042 +A35A +B084 +A94A +AA11 +A000 +23DE +2042 +2242 +2194 +2094 +2148 +2254 +2423 +ENDCHAR +STARTCHAR U+60DA +ENCODING 24794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +11F8 +1AA8 +34A8 +3528 +3248 +50B0 +1080 +1150 +1548 +1514 +1914 +10F0 +0000 +ENDCHAR +STARTCHAR U+60DB +ENCODING 24795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +11F8 +1110 +5110 +59FF +5508 +D508 +91C5 +1303 +11FE +1102 +1102 +11FE +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+60DC +ENCODING 24796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +1090 +1BFC +3490 +3490 +37FC +5000 +11F8 +1108 +11F8 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+60DD +ENCODING 24797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1444 +1248 +1150 +5844 +57FE +5404 +9404 +15F4 +1514 +1514 +1514 +15F4 +1404 +1414 +1408 +ENDCHAR +STARTCHAR U+60DE +ENCODING 24798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +2190 +2710 +A43F +A429 +B7E9 +AC8A +A488 +2488 +2488 +249C +2494 +2C94 +2896 +28B2 +20A3 +ENDCHAR +STARTCHAR U+60DF +ENCODING 24799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +1120 +19FC +3720 +3520 +31F8 +5120 +1120 +11F8 +1120 +1120 +11FC +1100 +0000 +ENDCHAR +STARTCHAR U+60E0 +ENCODING 24800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0110 +3FF8 +0100 +2488 +2424 +43E4 +0000 +ENDCHAR +STARTCHAR U+60E1 +ENCODING 24801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0280 +1EF0 +1010 +1EF0 +0280 +7FFC +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60E2 +ENCODING 24802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +24CC +2446 +6402 +4400 +4608 +03F8 +0000 +0808 +0D0D +5555 +5151 +5050 +5252 +5A5A +8E8E +ENDCHAR +STARTCHAR U+60E3 +ENCODING 24803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +2900 +3FF8 +2AA8 +4CA8 +1928 +6A48 +08B0 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60E4 +ENCODING 24804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1790 +1088 +18FF +5080 +5788 +5410 +5422 +17BC +1088 +1090 +10A2 +10A1 +153F +1201 +0000 +0000 +ENDCHAR +STARTCHAR U+60E5 +ENCODING 24805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0700 +3C00 +213C +2104 +3D7C +2104 +3FFC +0240 +0660 +1C38 +718E +04C0 +2446 +240B +6619 +C3F0 +ENDCHAR +STARTCHAR U+60E6 +ENCODING 24806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1004 +13FE +5A20 +5624 +523E +9220 +1224 +12FE +1284 +1284 +1484 +1484 +18FC +1084 +ENDCHAR +STARTCHAR U+60E7 +ENCODING 24807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +19F0 +3510 +35F0 +3110 +51F0 +1110 +17FC +1120 +1110 +1208 +1408 +0000 +ENDCHAR +STARTCHAR U+60E8 +ENCODING 24808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1060 +1090 +1BE8 +3440 +37FC +30A0 +5110 +164C +11A0 +1048 +1190 +1060 +1380 +0000 +ENDCHAR +STARTCHAR U+60E9 +ENCODING 24809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1BFC +2040 +4050 +1278 +1A40 +3240 +5248 +97FC +1000 +2A10 +2988 +28A4 +4824 +07E0 +0000 +ENDCHAR +STARTCHAR U+60EB +ENCODING 24811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0FE0 +1440 +1280 +2380 +0C60 +301E +DFF4 +1110 +1FF0 +1110 +1FF0 +0200 +2988 +2894 +47F4 +ENDCHAR +STARTCHAR U+60EC +ENCODING 24812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +1420 +1428 +5DFC +5420 +54A8 +9420 +17FE +1420 +1450 +1450 +1488 +1504 +17FE +1000 +ENDCHAR +STARTCHAR U+60ED +ENCODING 24813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2106 +2138 +2FE0 +B220 +AD20 +A53E +2FE8 +2128 +2128 +21E8 +2F28 +2548 +2148 +2188 +2108 +ENDCHAR +STARTCHAR U+60EE +ENCODING 24814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1110 +10A0 +13F8 +5A48 +5648 +53F8 +9248 +1248 +13F8 +1040 +1FFE +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+60EF +ENCODING 24815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1248 +1FFE +5A48 +57F8 +5000 +93F8 +1208 +1248 +1248 +1248 +1248 +10B0 +110C +1604 +ENDCHAR +STARTCHAR U+60F0 +ENCODING 24816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1080 +19F8 +3620 +37FC +3000 +51F8 +1108 +11F8 +1108 +11F8 +1108 +1118 +0000 +ENDCHAR +STARTCHAR U+60F1 +ENCODING 24817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1128 +1128 +1250 +1A50 +3528 +3568 +3080 +53F8 +1228 +12C8 +1268 +1298 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+60F2 +ENCODING 24818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1201 +5221 +59FE +5420 +D5FE +9122 +11FE +1122 +1122 +11FE +1020 +13FF +1020 +1020 +ENDCHAR +STARTCHAR U+60F3 +ENCODING 24819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7E88 +08F8 +1C88 +1AF8 +2A88 +48F8 +0900 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60F4 +ENCODING 24820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1248 +1248 +3BF8 +3400 +37FC +5080 +13F8 +12A8 +12A8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+60F5 +ENCODING 24821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +1124 +13FF +5124 +5924 +553C +D500 +91FE +1020 +13FF +10A8 +10A8 +11AC +1126 +1323 +1020 +ENDCHAR +STARTCHAR U+60F6 +ENCODING 24822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +11F0 +1910 +35F0 +3510 +31F0 +5000 +13F8 +1040 +11F0 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+60F7 +ENCODING 24823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0FE0 +0280 +7FFC +0FE0 +1450 +67CC +0440 +07C0 +2108 +2484 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60F8 +ENCODING 24824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11FF +5301 +58F9 +5489 +D4F9 +9089 +10FB +1000 +11FE +1008 +13FF +1010 +1010 +1070 +ENDCHAR +STARTCHAR U+60F9 +ENCODING 24825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +7FFC +0400 +1FF0 +6410 +07F0 +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+60FA +ENCODING 24826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +1BF8 +3608 +37F8 +3140 +5140 +13F8 +1440 +13F0 +1040 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+60FB +ENCODING 24827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1788 +14A8 +1CA8 +3FA8 +3CA8 +37A8 +54A8 +14A8 +17A8 +1328 +1288 +1488 +1818 +0000 +ENDCHAR +STARTCHAR U+60FC +ENCODING 24828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1000 +51FE +5902 +5502 +D5FE +9100 +11FF +1129 +1329 +13FF +1529 +1129 +1129 +112B +ENDCHAR +STARTCHAR U+60FD +ENCODING 24829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +51FE +5910 +55FF +D518 +91C9 +130F +1000 +11FE +1102 +11FE +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+60FE +ENCODING 24830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1129 +1111 +5129 +5945 +55FF +5084 +1122 +127D +10C4 +1128 +1210 +1028 +11C7 +0000 +0000 +ENDCHAR +STARTCHAR U+60FF +ENCODING 24831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +10FE +5882 +54FE +5000 +53FF +1020 +1120 +113E +1120 +11A0 +1260 +143F +0000 +0000 +ENDCHAR +STARTCHAR U+6100 +ENCODING 24832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1090 +1710 +1914 +3534 +37F8 +3150 +5190 +1350 +1350 +1528 +1928 +1144 +1184 +0000 +ENDCHAR +STARTCHAR U+6101 +ENCODING 24833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +3C24 +08A4 +7EA8 +1D50 +2A50 +4A88 +0904 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6102 +ENCODING 24834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7F90 +087E +7F92 +4092 +3F32 +0222 +7FA2 +0422 +1C6E +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+6103 +ENCODING 24835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +1A08 +37F8 +3400 +31F0 +5110 +11F0 +1110 +11F0 +1000 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6104 +ENCODING 24836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1222 +1222 +5BFE +5622 +5222 +53FE +1000 +17FF +1240 +1222 +1214 +1288 +1707 +0000 +0000 +ENDCHAR +STARTCHAR U+6105 +ENCODING 24837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +507C +5810 +54FE +5092 +1092 +10FE +1010 +11FF +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6106 +ENCODING 24838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1178 +2400 +4A00 +08FC +1110 +3210 +5210 +1030 +0100 +2488 +2484 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6107 +ENCODING 24839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FC +1044 +5044 +5BFF +5400 +D5FC +9104 +11FC +1008 +11FE +1088 +1088 +13FF +1008 +1008 +ENDCHAR +STARTCHAR U+6108 +ENCODING 24840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1FF0 +7E9C +1290 +1E90 +1E90 +1210 +1730 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6109 +ENCODING 24841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +1910 +37F8 +3404 +37A8 +54A8 +17A8 +14A8 +17A8 +14A8 +1488 +1598 +0000 +ENDCHAR +STARTCHAR U+610A +ENCODING 24842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1000 +50FE +5882 +5482 +D482 +90FE +1000 +11FF +1111 +1111 +11FF +1111 +1111 +11FF +ENDCHAR +STARTCHAR U+610B +ENCODING 24843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +10A8 +1124 +5222 +5BFE +5440 +57FF +1040 +10FC +1188 +1250 +1020 +1050 +178F +0000 +0000 +ENDCHAR +STARTCHAR U+610C +ENCODING 24844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10FC +1184 +5108 +5BFE +5552 +D552 +9152 +115E +1182 +1122 +13FF +1050 +10D8 +118C +1307 +ENDCHAR +STARTCHAR U+610D +ENCODING 24845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +227C +3EC8 +2948 +3F30 +2430 +3BC8 +6104 +0110 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+610E +ENCODING 24846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +11FC +1200 +1DF0 +3510 +35F0 +3110 +51F0 +1080 +11F8 +1690 +1060 +10F0 +170C +0000 +ENDCHAR +STARTCHAR U+610F +ENCODING 24847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0440 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +2508 +2484 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6110 +ENCODING 24848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1010 +5020 +59FF +5529 +D529 +9139 +1129 +1129 +1139 +1129 +1129 +1129 +11FF +1000 +ENDCHAR +STARTCHAR U+6111 +ENCODING 24849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1084 +1048 +51FE +5922 +5522 +D5FE +9122 +1122 +11FE +1020 +13FF +1041 +1043 +10C2 +118E +ENDCHAR +STARTCHAR U+6112 +ENCODING 24850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1104 +1104 +51FC +5904 +5504 +D5FC +9080 +11FF +1301 +1631 +13E1 +1201 +1213 +11F2 +100E +ENDCHAR +STARTCHAR U+6113 +ENCODING 24851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1104 +11FC +5104 +5904 +55FC +D400 +93FF +1100 +11FF +1249 +14D9 +1191 +1333 +1062 +100E +ENDCHAR +STARTCHAR U+6114 +ENCODING 24852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +5044 +5844 +5444 +D5FF +9000 +10FE +1082 +1082 +10FE +1082 +1082 +1082 +10FE +ENDCHAR +STARTCHAR U+6115 +ENCODING 24853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +1BB8 +3400 +35F0 +3000 +57FC +1080 +10F0 +1110 +1010 +1010 +1060 +0000 +ENDCHAR +STARTCHAR U+6116 +ENCODING 24854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13FF +5084 +58FC +5484 +D4FC +9084 +1084 +13FF +1128 +1128 +114F +1180 +1100 +11FF +ENDCHAR +STARTCHAR U+6117 +ENCODING 24855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7F20 +227E +1444 +7FEC +1938 +1A10 +2838 +486C +1846 +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+6118 +ENCODING 24856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1141 +507E +5844 +54A8 +5010 +1028 +13C7 +1000 +10FE +1082 +1082 +10FE +0000 +0000 +ENDCHAR +STARTCHAR U+6119 +ENCODING 24857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFC +2204 +27E4 +0C40 +3380 +0670 +781E +0FF0 +0810 +0FF0 +2480 +24C6 +644B +4619 +C3F0 +ENDCHAR +STARTCHAR U+611A +ENCODING 24858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0920 +0FE0 +0920 +0FE0 +3FF8 +2148 +2FE8 +2138 +1488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+611B +ENCODING 24859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3FD0 +1210 +0920 +3FFC +2588 +5450 +13C8 +2208 +07E0 +3A40 +0180 +06E0 +781C +0000 +ENDCHAR +STARTCHAR U+611C +ENCODING 24860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2420 +A420 +B7FF +AD24 +A524 +A524 +26AA +26A9 +2450 +2450 +248C +2703 +2400 +27FF +ENDCHAR +STARTCHAR U+611D +ENCODING 24861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1200 +12FE +5282 +5AFE +5682 +52FE +1228 +12FE +1228 +1210 +1228 +12C6 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+611E +ENCODING 24862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1040 +53FF +5249 +5A49 +D649 +924B +1020 +1020 +13FF +1048 +1048 +10CC +1186 +1303 +ENDCHAR +STARTCHAR U+611F +ENCODING 24863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +1FFC +1088 +1F48 +1050 +2F20 +2954 +4F8C +0104 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6120 +ENCODING 24864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +27FC +2408 +2408 +B7F8 +AC08 +A408 +A7F8 +2000 +2FFC +2924 +2924 +2924 +2924 +3FFE +2000 +ENDCHAR +STARTCHAR U+6121 +ENCODING 24865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +11F8 +1AA8 +35A8 +3568 +3258 +50B0 +1080 +1150 +1548 +1514 +1914 +10F0 +0000 +ENDCHAR +STARTCHAR U+6122 +ENCODING 24866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +5122 +59FE +5522 +D522 +91FE +1000 +1060 +1036 +1293 +1281 +1280 +16C6 +147C +ENDCHAR +STARTCHAR U+6123 +ENCODING 24867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +14A4 +14A4 +5FFC +5480 +5044 +9FFE +1080 +1088 +10FC +1088 +1108 +1108 +1228 +1410 +ENDCHAR +STARTCHAR U+6124 +ENCODING 24868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +13F8 +1040 +5954 +57FE +5110 +93F8 +1208 +1248 +1248 +1248 +1248 +10A0 +1118 +1608 +ENDCHAR +STARTCHAR U+6126 +ENCODING 24870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +13FC +1A48 +53F8 +5040 +5FFE +9008 +13FC +1208 +1248 +1248 +1248 +10B0 +1108 +1604 +ENDCHAR +STARTCHAR U+6127 +ENCODING 24871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +13F8 +1A48 +37F8 +3648 +33F8 +52C8 +10D0 +1150 +1168 +127C +1444 +183C +0000 +ENDCHAR +STARTCHAR U+6128 +ENCODING 24872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +7F50 +0854 +3E8C +00F8 +3F48 +2230 +5ED8 +0004 +0110 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6129 +ENCODING 24873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1020 +1020 +53FE +5800 +55FC +5104 +51FC +1104 +11FC +1104 +11FC +1088 +1306 +0000 +0000 +ENDCHAR +STARTCHAR U+612A +ENCODING 24874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +5102 +59FE +5400 +D5FE +9102 +11FE +1102 +11FE +1102 +11FE +1084 +1186 +1303 +ENDCHAR +STARTCHAR U+612B +ENCODING 24875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +17FC +1840 +57F8 +5040 +5FFE +9080 +1110 +13E0 +1048 +17FC +1150 +124C +1444 +10C0 +ENDCHAR +STARTCHAR U+612C +ENCODING 24876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +14F8 +7F88 +08F8 +2A88 +2AF8 +3E88 +0908 +1318 +2080 +0488 +2424 +2424 +43E0 +0000 +ENDCHAR +STARTCHAR U+612E +ENCODING 24878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +11FC +1111 +5892 +5454 +5040 +50FE +5110 +1010 +13FF +1010 +1111 +1111 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+612F +ENCODING 24879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +10FF +1188 +52FE +5888 +54FE +5088 +50FF +107C +1044 +1028 +1010 +1028 +11C7 +0000 +0000 +ENDCHAR +STARTCHAR U+6130 +ENCODING 24880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1104 +15FC +1504 +55FC +5020 +5222 +1124 +10A8 +17FF +1048 +1048 +1089 +110F +1600 +ENDCHAR +STARTCHAR U+6131 +ENCODING 24881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +5540 +5340 +597E +D590 +9110 +1310 +15FF +1110 +1138 +1328 +126C +12C6 +1183 +ENDCHAR +STARTCHAR U+6132 +ENCODING 24882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1104 +113C +5924 +57FF +5401 +55FD +1104 +11FC +1104 +11FC +1104 +1104 +120C +0000 +0000 +ENDCHAR +STARTCHAR U+6134 +ENCODING 24884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +19F0 +3608 +35F4 +3110 +51F0 +1110 +11F0 +1200 +13F8 +1508 +11F8 +0000 +ENDCHAR +STARTCHAR U+6135 +ENCODING 24885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23DF +2041 +2041 +A3DF +B210 +AA10 +ABDF +A041 +2259 +2145 +2041 +20C7 +2149 +2251 +20C3 +2186 +ENDCHAR +STARTCHAR U+6136 +ENCODING 24886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FC +20C4 +A318 +A208 +B7DF +AA49 +A4D3 +2000 +23FE +2202 +23FE +2202 +23FE +2202 +2406 +ENDCHAR +STARTCHAR U+6137 +ENCODING 24887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1092 +1092 +14FE +5400 +54FE +5000 +10FE +1082 +1082 +10FE +1000 +1084 +1044 +11FF +1000 +ENDCHAR +STARTCHAR U+6139 +ENCODING 24889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +5101 +5945 +54C6 +D593 +9038 +106C +10C6 +1183 +10FE +1082 +1082 +1082 +10FE +ENDCHAR +STARTCHAR U+613B +ENCODING 24891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7EFE +0410 +0824 +10FE +0A10 +0C22 +79FF +0892 +2911 +1010 +0482 +2441 +2405 +47FC +0000 +0000 +ENDCHAR +STARTCHAR U+613C +ENCODING 24892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1164 +1184 +18F8 +34F8 +3688 +32F8 +5288 +12F8 +1288 +12F8 +13FC +1198 +1604 +0000 +ENDCHAR +STARTCHAR U+613D +ENCODING 24893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +17FC +1040 +1BF8 +3648 +37F8 +3248 +53F8 +1248 +1010 +17FC +1110 +1090 +1030 +0000 +ENDCHAR +STARTCHAR U+613E +ENCODING 24894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +11FC +1A00 +35F0 +3400 +37F0 +54B0 +12B0 +12D0 +17F4 +11CC +12AC +1484 +0000 +ENDCHAR +STARTCHAR U+613F +ENCODING 24895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1080 +17F0 +17F0 +1410 +27F0 +24B0 +598C +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6140 +ENCODING 24896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +11FE +5111 +50B2 +5840 +5484 +50F8 +5011 +11FF +1010 +11FF +1044 +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+6141 +ENCODING 24897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFC +2004 +2FF4 +2384 +2ECC +2174 +2EE4 +2154 +2E4C +2184 +3FFC +2486 +24C3 +6449 +4618 +C3F0 +ENDCHAR +STARTCHAR U+6142 +ENCODING 24898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +13F0 +08A0 +4BF8 +2248 +23F8 +0A48 +13F8 +2248 +2258 +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6144 +ENCODING 24900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +10A0 +1BF8 +36A8 +36A8 +33F8 +5040 +17FC +10E0 +1150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+6145 +ENCODING 24901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +10A2 +1294 +5348 +5950 +5430 +D44C +9383 +1020 +13FE +1222 +1222 +13FE +1022 +103F +13E1 +ENDCHAR +STARTCHAR U+6146 +ENCODING 24902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +1038 +13E0 +5122 +59B6 +5494 +D400 +90E0 +138F +1201 +1201 +13CF +1201 +1201 +1201 +13FF +ENDCHAR +STARTCHAR U+6147 +ENCODING 24903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +38F0 +3E90 +2294 +3FFC +3E90 +3E60 +23B0 +4C0C +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6148 +ENCODING 24904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +7FFC +0820 +32C8 +0C30 +1248 +7FFC +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6149 +ENCODING 24905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +5020 +5848 +55F2 +D422 +93FF +1000 +11FE +1122 +1122 +11FE +1122 +1122 +11FE +ENDCHAR +STARTCHAR U+614A +ENCODING 24906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +11B0 +10A0 +1FFC +34A0 +37F8 +30A8 +57FC +10A8 +13F8 +11B0 +12A8 +14A4 +10A0 +0000 +ENDCHAR +STARTCHAR U+614B +ENCODING 24907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +1248 +7F70 +3E44 +223C +3E48 +3E70 +2244 +263C +0110 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+614C +ENCODING 24908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +13FC +1090 +1840 +37FC +3500 +3100 +50F8 +1150 +1150 +1150 +1154 +1254 +140C +0000 +ENDCHAR +STARTCHAR U+614D +ENCODING 24909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1150 +1950 +35B0 +3510 +31F0 +5000 +13F8 +12A8 +12A8 +12A8 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+614E +ENCODING 24910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +19F0 +3510 +35F0 +3110 +51F0 +1110 +11F0 +17FC +10A0 +1110 +1608 +0000 +ENDCHAR +STARTCHAR U+614F +ENCODING 24911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17FF +1401 +15FD +5104 +59FC +5504 +51FC +1104 +1020 +1020 +17FF +1088 +1104 +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+6151 +ENCODING 24913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1108 +59F8 +5508 +51F8 +9108 +17FE +1008 +17BC +14A4 +12A8 +1110 +12A8 +1446 +1804 +ENDCHAR +STARTCHAR U+6152 +ENCODING 24914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +1088 +1FFF +5489 +57FF +5489 +17FF +1000 +13FE +1202 +13FE +1202 +13FE +0000 +0000 +ENDCHAR +STARTCHAR U+6153 +ENCODING 24915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +10A0 +1BF8 +36A8 +37F8 +3000 +53F8 +1000 +17FC +1150 +1248 +1448 +10C0 +0000 +ENDCHAR +STARTCHAR U+6154 +ENCODING 24916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +1088 +5000 +59FC +5504 +51FC +5104 +11FC +1020 +17FF +1050 +1088 +1306 +0000 +0000 +ENDCHAR +STARTCHAR U+6155 +ENCODING 24917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +0A20 +1B50 +6AAC +12A0 +0600 +0000 +ENDCHAR +STARTCHAR U+6156 +ENCODING 24918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17FF +1401 +1413 +5FFF +5411 +55D1 +5551 +55D3 +1415 +17E9 +1417 +1423 +1401 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+6158 +ENCODING 24920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1090 +13F8 +1910 +3518 +36A4 +37FC +50A0 +1150 +17AC +1048 +1190 +1060 +1380 +0000 +ENDCHAR +STARTCHAR U+6159 +ENCODING 24921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +7FF0 +3E80 +2AFC +3E90 +2A90 +3E90 +7F10 +0810 +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+615A +ENCODING 24922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1104 +1138 +17E0 +1120 +3FE0 +3D7C +37E8 +5568 +17E8 +1128 +17E8 +1148 +1148 +1188 +0000 +ENDCHAR +STARTCHAR U+615B +ENCODING 24923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1111 +1111 +51FF +5848 +5488 +51FF +5288 +10FF +1088 +10FF +1088 +10FF +1080 +0000 +0000 +ENDCHAR +STARTCHAR U+615D +ENCODING 24925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2440 +3FF0 +2540 +3FF8 +27E0 +3A20 +23E0 +3FF8 +0100 +24A8 +2424 +43E4 +0000 +ENDCHAR +STARTCHAR U+615E +ENCODING 24926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FE +5084 +5848 +57FF +D400 +91FE +1102 +11FE +1102 +11FE +1020 +13FF +1020 +1020 +ENDCHAR +STARTCHAR U+615F +ENCODING 24927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1790 +1110 +17D0 +393C +3FD4 +3554 +57D4 +1554 +17D4 +1114 +17E4 +11E4 +174C +0000 +ENDCHAR +STARTCHAR U+6160 +ENCODING 24928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2110 +27D0 +A11F +B132 +AFF2 +A912 +A11A +27CA +210A +21CE +2144 +214E +224A +225B +24D1 +ENDCHAR +STARTCHAR U+6161 +ENCODING 24929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1020 +5AAA +5524 +52AA +5020 +52AA +1124 +12AA +1050 +1088 +1104 +1603 +0000 +0000 +ENDCHAR +STARTCHAR U+6162 +ENCODING 24930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +19F0 +3510 +35F0 +33F8 +52A8 +13F8 +17F8 +1090 +1060 +11B0 +1E0C +0000 +ENDCHAR +STARTCHAR U+6163 +ENCODING 24931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1148 +17FC +3A50 +37F0 +37F8 +5208 +13F8 +13F8 +1208 +13F8 +1198 +1604 +0000 +ENDCHAR +STARTCHAR U+6164 +ENCODING 24932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7F7C +0844 +7F45 +4147 +7E80 +01FE +7E44 +0028 +3E18 +22A7 +4340 +0882 +2849 +4FF8 +0000 +ENDCHAR +STARTCHAR U+6165 +ENCODING 24933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +12A0 +11A0 +19F8 +34A0 +3720 +33FC +5020 +16F8 +1288 +1288 +12F8 +1500 +18FC +0000 +ENDCHAR +STARTCHAR U+6166 +ENCODING 24934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0510 +0490 +7FDF +24A2 +150A +0E0A +1504 +249B +0C00 +0084 +2842 +4805 +0804 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+6167 +ENCODING 24935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +7FFC +0820 +3EF8 +0FFC +7820 +0FE0 +07E0 +0020 +0FE0 +2508 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6168 +ENCODING 24936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1550 +1550 +3F50 +3D50 +35FC +5710 +1530 +14B0 +15D0 +1654 +1C94 +110C +0000 +ENDCHAR +STARTCHAR U+616A +ENCODING 24938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1100 +113E +5122 +5922 +553E +5100 +5100 +5177 +1155 +1155 +1177 +1100 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+616B +ENCODING 24939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +22A8 +4C44 +0A40 +1278 +3340 +54C0 +183C +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+616C +ENCODING 24940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13FF +5084 +58FC +5420 +D5FE +9122 +1122 +11FE +1020 +11FE +1020 +11FE +1020 +13FF +ENDCHAR +STARTCHAR U+616E +ENCODING 24942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F0 +1FFC +11E8 +1F10 +10F0 +17F0 +1490 +17F0 +1490 +27F8 +2A44 +4A34 +11F0 +0000 +ENDCHAR +STARTCHAR U+616F +ENCODING 24943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +13FC +15F0 +3910 +35F0 +3510 +51F0 +17FC +1100 +13F8 +14A8 +1148 +12B0 +0000 +ENDCHAR +STARTCHAR U+6170 +ENCODING 24944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F10 +2110 +3FFC +2E90 +2050 +3F50 +5610 +2510 +4D30 +0488 +24A4 +2424 +43E0 +0000 +ENDCHAR +STARTCHAR U+6171 +ENCODING 24945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +1BF8 +3648 +37F8 +3248 +53F8 +1048 +17FC +1010 +17FC +1110 +10B0 +0000 +ENDCHAR +STARTCHAR U+6172 +ENCODING 24946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +27FF +A088 +A0F8 +B020 +AFFF +A421 +2525 +2525 +2525 +26AB +2673 +2421 +2421 +2403 +ENDCHAR +STARTCHAR U+6173 +ENCODING 24947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1524 +1FA8 +3498 +3790 +3568 +5784 +1440 +13F8 +1040 +1040 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+6174 +ENCODING 24948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1198 +1AA8 +35D8 +36A8 +34C8 +5100 +13F0 +1210 +13F0 +1210 +13F0 +1210 +0000 +ENDCHAR +STARTCHAR U+6175 +ENCODING 24949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1440 +1DF8 +3C48 +3FFC +3448 +55F8 +17F8 +1648 +17F8 +1A48 +1BF8 +1258 +0000 +ENDCHAR +STARTCHAR U+6176 +ENCODING 24950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1240 +1FF8 +1248 +1FF8 +1FFC +1558 +19E4 +13F4 +2D20 +20C0 +4360 +1C1C +0000 +ENDCHAR +STARTCHAR U+6177 +ENCODING 24951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1240 +1BF8 +3648 +37FC +3248 +53F8 +1248 +1368 +14D0 +1750 +184C +10C0 +0000 +ENDCHAR +STARTCHAR U+6178 +ENCODING 24952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A50 +0A50 +7FFE +0A50 +324C +7FFE +4102 +5FFA +1108 +1108 +1138 +0100 +29C6 +6843 +4C09 +C7F8 +ENDCHAR +STARTCHAR U+6179 +ENCODING 24953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F90 +043E +7FD2 +1132 +7FDA +0413 +3FA3 +0401 +0000 +0104 +24C3 +2204 +01FC +0000 +0000 +ENDCHAR +STARTCHAR U+617A +ENCODING 24954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +1092 +51FF +5092 +5CFE +50FE +5092 +50FE +5054 +11FF +1028 +1010 +11EF +0000 +0000 +ENDCHAR +STARTCHAR U+617B +ENCODING 24955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +11AC +10A8 +53FE +5820 +5450 +D7FF +9088 +1104 +13FE +1505 +11FC +1104 +11FC +1104 +11FC +ENDCHAR +STARTCHAR U+617C +ENCODING 24956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +3FFE +2220 +23A0 +2224 +3FB4 +2214 +2A98 +32AA +262E +4024 +0180 +24C6 +644B +4619 +C3F0 +ENDCHAR +STARTCHAR U+617D +ENCODING 24957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +100A +13FF +1248 +1A48 +5679 +5249 +53FA +124A +12EA +135C +1248 +124C +12D5 +1425 +1443 +ENDCHAR +STARTCHAR U+617E +ENCODING 24958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +1240 +2A7C +0CA8 +1330 +3E20 +5250 +1F88 +0104 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+617F +ENCODING 24959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07FC +6440 +37F8 +0440 +07F8 +3440 +67FE +0242 +3FFA +0442 +0846 +0180 +24C6 +644B +4619 +C3F0 +ENDCHAR +STARTCHAR U+6180 +ENCODING 24960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13DE +1042 +514A +58C6 +554A +D020 +9070 +11DC +1707 +1020 +11C8 +1032 +11C4 +1018 +11E0 +ENDCHAR +STARTCHAR U+6181 +ENCODING 24961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +11FE +1542 +157A +55CA +5132 +512A +1146 +11FE +1020 +1292 +1291 +1485 +14FC +1000 +ENDCHAR +STARTCHAR U+6182 +ENCODING 24962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0200 +0FE0 +0FE0 +0FE0 +3FFC +2538 +57E8 +23E4 +0E40 +3180 +0760 +781C +0000 +ENDCHAR +STARTCHAR U+6183 +ENCODING 24963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFC +0100 +0FF0 +0200 +7FFE +0910 +1E78 +6816 +0E70 +0810 +0FF0 +2482 +644B +4618 +C3F0 +ENDCHAR +STARTCHAR U+6184 +ENCODING 24964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13FE +2020 +4AFC +1A84 +12FC +3284 +52FC +1284 +12FC +1200 +13FE +2482 +244B +6619 +C3F0 +ENDCHAR +STARTCHAR U+6187 +ENCODING 24967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0288 +3C88 +09FC +7E88 +08F8 +3E88 +2288 +3EF8 +2088 +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6189 +ENCODING 24969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1081 +1082 +13E4 +1888 +5480 +53E1 +5002 +13E4 +1228 +13E0 +1001 +1222 +1144 +17F8 +0000 +0000 +ENDCHAR +STARTCHAR U+618A +ENCODING 24970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +0BF8 +10A0 +17FC +31F8 +5348 +1DF8 +1148 +11F8 +1158 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+618B +ENCODING 24971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4920 +2A20 +0824 +7F3E +4948 +5DA8 +6B10 +492E +4344 +0000 +2A10 +2988 +28A4 +4824 +07E0 +0000 +ENDCHAR +STARTCHAR U+618C +ENCODING 24972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1420 +223F +7F41 +0839 +3E01 +083D +2A01 +1C01 +7F06 +0040 +2422 +2405 +47FC +0000 +0000 +ENDCHAR +STARTCHAR U+618D +ENCODING 24973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +11F0 +1040 +53FF +5888 +55FC +D68B +90F8 +1000 +13FE +1202 +12FA +128A +12FA +1202 +1206 +ENDCHAR +STARTCHAR U+618E +ENCODING 24974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +10A0 +13F8 +1A48 +37F8 +3648 +33F8 +5000 +11F0 +1110 +11F0 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+6190 +ENCODING 24976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1150 +1BFC +34E0 +3550 +364C +5248 +13FC +12A8 +15A8 +117C +1208 +1C08 +0000 +ENDCHAR +STARTCHAR U+6191 +ENCODING 24977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +23F8 +1240 +13F0 +03F0 +0A40 +13FC +2554 +24AC +0918 +0480 +2488 +2424 +43E4 +0000 +ENDCHAR +STARTCHAR U+6192 +ENCODING 24978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +1092 +50FE +5810 +55FF +D400 +90FE +1082 +10FE +1082 +10FE +1082 +10FE +1044 +1183 +ENDCHAR +STARTCHAR U+6193 +ENCODING 24979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1020 +53FE +5A22 +57FE +D222 +93FE +1022 +13FF +1041 +1166 +1523 +1505 +158C +14F8 +ENDCHAR +STARTCHAR U+6194 +ENCODING 24980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1120 +1BFC +3720 +35F8 +3120 +51F8 +1120 +11FC +1000 +12A8 +1254 +1454 +0000 +ENDCHAR +STARTCHAR U+6196 +ENCODING 24982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0830 +7F28 +2A28 +2AFC +5D20 +1C30 +2A48 +4B84 +0100 +0490 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6197 +ENCODING 24983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FF7F +0844 +2AAC +2A38 +5D10 +9CB8 +2A6E +C943 +0880 +04C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+6198 +ENCODING 24984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1410 +14FE +5400 +50FE +5082 +10FE +1044 +1028 +11FF +1000 +10FE +1082 +10FE +1082 +ENDCHAR +STARTCHAR U+6199 +ENCODING 24985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +1FF0 +0FE0 +0820 +0FE0 +0440 +7FFC +0FE0 +0820 +0FE0 +2508 +24A4 +43E4 +0000 +ENDCHAR +STARTCHAR U+619A +ENCODING 24986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +1BB8 +3400 +37F8 +3248 +53F8 +1248 +13F8 +1040 +17FC +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+619B +ENCODING 24987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17FF +1088 +17FF +1C89 +57FF +53FE +1202 +13FE +1202 +13FE +1020 +17FF +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+619C +ENCODING 24988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2710 +257F +2520 +A77E +B688 +AE7F +A500 +A53E +2522 +273E +2422 +243E +2422 +2422 +2426 +ENDCHAR +STARTCHAR U+619D +ENCODING 24989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FF40 +0044 +7EFE +4304 +7E44 +0028 +7F10 +0428 +FF46 +0884 +1A00 +5184 +5092 +9012 +0FF0 +ENDCHAR +STARTCHAR U+619F +ENCODING 24991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FF +1090 +53FE +5A92 +5692 +D3FE +9124 +1124 +10A8 +17FF +10A8 +11AC +1326 +1623 +1020 +ENDCHAR +STARTCHAR U+61A0 +ENCODING 24992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +28A0 +2520 +3FBE +2252 +2A94 +2A90 +2FB8 +6228 +466C +1C46 +0180 +24C6 +244B +6619 +C3F0 +ENDCHAR +STARTCHAR U+61A1 +ENCODING 24993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +13CF +1514 +5882 +5420 +57FF +5020 +13FE +1222 +1272 +10A8 +1727 +1020 +1040 +0000 +0000 +ENDCHAR +STARTCHAR U+61A2 +ENCODING 24994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FE +1820 +57FF +5104 +57DF +1104 +17DF +1000 +17FF +1110 +1211 +141F +0000 +0000 +ENDCHAR +STARTCHAR U+61A4 +ENCODING 24996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1150 +1FFC +3510 +37F8 +3208 +53F8 +1208 +13F8 +1208 +13F8 +1130 +160C +0000 +ENDCHAR +STARTCHAR U+61A5 +ENCODING 24997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2A54 +2A54 +1428 +2244 +7FFE +4102 +5FFA +0208 +0608 +0C18 +3870 +0180 +24C6 +644B +4619 +C3F0 +ENDCHAR +STARTCHAR U+61A7 +ENCODING 24999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1110 +17FC +3BF8 +3648 +37F8 +5248 +13F8 +1040 +13F8 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+61A8 +ENCODING 25000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E40 +0444 +FF7E +2284 +3F44 +2248 +3E28 +2210 +FF2E +02C4 +0A00 +2988 +28A4 +4824 +07E0 +0000 +ENDCHAR +STARTCHAR U+61A9 +ENCODING 25001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +3CF8 +0888 +7FF8 +0888 +3EF8 +2288 +3EF8 +2088 +0500 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+61AA +ENCODING 25002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23CF +2249 +23CF +A249 +B3CF +AA01 +A279 +A249 +2249 +2279 +2249 +2249 +2279 +2201 +2207 +ENDCHAR +STARTCHAR U+61AB +ENCODING 25003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +1BB8 +36A8 +37B8 +3248 +53F8 +12A8 +1248 +1268 +12A8 +1308 +1218 +0000 +ENDCHAR +STARTCHAR U+61AC +ENCODING 25004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +19F0 +3510 +35F0 +3040 +57FC +11F0 +1110 +11F0 +1150 +1248 +14C8 +0000 +ENDCHAR +STARTCHAR U+61AD +ENCODING 25005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +17FF +5088 +5A8A +5504 +D3FE +9505 +11FC +1104 +11FC +1020 +1124 +1326 +1623 +1060 +ENDCHAR +STARTCHAR U+61AE +ENCODING 25006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1200 +13FC +1EA8 +36A8 +37FC +32A8 +52A8 +12A8 +17FC +1000 +1548 +14A4 +18A4 +0000 +ENDCHAR +STARTCHAR U+61AF +ENCODING 25007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17DF +1514 +1514 +1FDF +5586 +52CB +54D3 +1000 +13FE +1202 +13FE +1202 +13FE +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+61B0 +ENCODING 25008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +1008 +1050 +1BFF +5451 +5092 +5110 +17FF +1489 +1575 +1451 +1471 +1405 +1402 +0000 +0000 +ENDCHAR +STARTCHAR U+61B1 +ENCODING 25009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1109 +17C9 +183F +57C8 +5448 +5448 +57CA +110A +110A +154A +154A +110A +1112 +1323 +0000 +0000 +ENDCHAR +STARTCHAR U+61B2 +ENCODING 25010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2108 +7FF8 +1FF0 +0100 +7FFC +1FF0 +1290 +1FF0 +2508 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+61B3 +ENCODING 25011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1002 +53FF +5002 +5DFE +5000 +53DF +5111 +53DF +1004 +13FF +1104 +1084 +1018 +0000 +0000 +ENDCHAR +STARTCHAR U+61B4 +ENCODING 25012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1154 +5154 +51DC +5C50 +53DE +5252 +53DE +5252 +13DE +1040 +1041 +1041 +107F +0000 +0000 +ENDCHAR +STARTCHAR U+61B5 +ENCODING 25013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1EFE +1244 +1E28 +10FE +3E10 +52FE +1210 +1E10 +0000 +0082 +2441 +2408 +43FC +0000 +0000 +ENDCHAR +STARTCHAR U+61B6 +ENCODING 25014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1110 +17FC +3800 +35F0 +3510 +51F0 +1110 +11F0 +1548 +1524 +1914 +10F0 +0000 +ENDCHAR +STARTCHAR U+61B7 +ENCODING 25015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1114 +1FFE +1110 +5BB8 +5554 +5110 +97FC +1048 +1240 +127C +1240 +1340 +12C0 +1446 +183C +ENDCHAR +STARTCHAR U+61B8 +ENCODING 25016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1070 +10D8 +518C +5B07 +54F8 +D400 +93DE +1252 +1252 +13DE +1000 +1104 +1104 +138E +16DB +ENDCHAR +STARTCHAR U+61B9 +ENCODING 25017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +23FE +2292 +A3FE +B292 +ABFE +A800 +A7FF +2400 +25FE +2400 +27FF +2522 +2536 +29DC +2307 +ENDCHAR +STARTCHAR U+61BA +ENCODING 25018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10F0 +1320 +1BFC +36A8 +3698 +3370 +53FC +1270 +1270 +14F8 +1488 +18F8 +1088 +0000 +ENDCHAR +STARTCHAR U+61BC +ENCODING 25020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1420 +7F20 +147E +2044 +7FEC +4138 +3910 +293C +3B66 +0000 +0180 +24C6 +2443 +6409 +4618 +C3F0 +ENDCHAR +STARTCHAR U+61BE +ENCODING 25022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1028 +13FC +1220 +1BE8 +3628 +37D0 +3354 +55EC +1884 +1150 +1548 +1514 +1914 +10F0 +0000 +ENDCHAR +STARTCHAR U+61BF +ENCODING 25023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +17D0 +147F +1FC2 +5442 +57C2 +5112 +17D2 +1212 +13D2 +124A +1244 +144A +1191 +0000 +0000 +ENDCHAR +STARTCHAR U+61C0 +ENCODING 25024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1070 +118C +5777 +5800 +57FE +D622 +92AA +1222 +13FE +1000 +11FC +1104 +11FC +1104 +11FC +ENDCHAR +STARTCHAR U+61C1 +ENCODING 25025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1152 +5152 +59FE +5400 +D7FF +9000 +11FE +1102 +11FE +1061 +10B2 +112C +1623 +1020 +ENDCHAR +STARTCHAR U+61C2 +ENCODING 25026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2114 +2FFE +2110 +27FC +B040 +AFFE +A044 +27FE +2444 +27FC +2444 +27FC +2040 +27FC +2040 +2FFE +ENDCHAR +STARTCHAR U+61C3 +ENCODING 25027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +7F40 +1C40 +3FF8 +2A48 +3E48 +7F88 +3E88 +0F30 +7100 +0488 +24A4 +2424 +43E0 +0000 +ENDCHAR +STARTCHAR U+61C5 +ENCODING 25029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1038 +13FE +5222 +52FC +5E20 +523C +52FC +5242 +52F4 +1228 +125C +14AA +1059 +0000 +0000 +ENDCHAR +STARTCHAR U+61C6 +ENCODING 25030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +19F0 +3400 +37B8 +32A8 +53B8 +1040 +17FC +10E0 +1150 +164C +1040 +0000 +ENDCHAR +STARTCHAR U+61C7 +ENCODING 25031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C00 +78F8 +2688 +18F8 +7888 +1CF8 +6CA4 +14B8 +65C8 +1904 +0490 +2488 +2424 +43E4 +0000 +ENDCHAR +STARTCHAR U+61C8 +ENCODING 25032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +13BC +1494 +1914 +37E4 +3D4C +3D68 +57E8 +157C +1548 +17FC +1448 +1848 +10C8 +0000 +ENDCHAR +STARTCHAR U+61C9 +ENCODING 25033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1290 +12FC +1590 +1EF8 +1490 +14F8 +1490 +14FC +2080 +2A48 +4A14 +11F4 +0000 +ENDCHAR +STARTCHAR U+61CA +ENCODING 25034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +13F8 +1AE8 +3758 +36E8 +33F8 +52E8 +1358 +1040 +17FC +10A0 +1110 +160C +0000 +ENDCHAR +STARTCHAR U+61CB +ENCODING 25035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +17D0 +7ABC +1110 +3FF8 +3BB8 +3534 +5954 +1310 +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+61CC +ENCODING 25036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +1BF8 +3440 +37F8 +3040 +57FC +1110 +17FC +1040 +13F8 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+61CD +ENCODING 25037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1000 +1BF8 +36E8 +36A8 +32E8 +53F8 +13F0 +1040 +17FC +11F0 +164C +1040 +0000 +ENDCHAR +STARTCHAR U+61CE +ENCODING 25038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +5124 +5124 +5AAA +D420 +93FF +1000 +11FE +1102 +117A +114A +117A +1102 +11FE +ENDCHAR +STARTCHAR U+61CF +ENCODING 25039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1090 +11FF +5110 +5BFE +5510 +D5FE +9110 +11FF +1000 +13CF +1249 +1249 +1279 +1201 +1203 +ENDCHAR +STARTCHAR U+61D0 +ENCODING 25040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +1BF8 +36A8 +36A8 +33F8 +5040 +17FC +10C8 +1350 +1D20 +11D0 +160C +0000 +ENDCHAR +STARTCHAR U+61D1 +ENCODING 25041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4110 +2FFE +1110 +87FC +6110 +2FFC +1514 +26AC +E444 +240C +0000 +2A08 +2984 +4892 +8812 +07F0 +ENDCHAR +STARTCHAR U+61D2 +ENCODING 25042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2210 +3FDC +2224 +AFC8 +AABE +AAA2 +AAAA +2FAA +222A +272A +2AAA +322A +2208 +2214 +2262 +ENDCHAR +STARTCHAR U+61D4 +ENCODING 25044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1FFE +1000 +17FC +5D14 +55F4 +5514 +97FC +1000 +13F8 +1000 +1FFE +1150 +124C +1444 +10C0 +ENDCHAR +STARTCHAR U+61D5 +ENCODING 25045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +5110 +5F14 +4012 +5FFE +5110 +5F38 +5128 +DF2C +9164 +9346 +0080 +24C6 +244B +6619 +C3F0 +ENDCHAR +STARTCHAR U+61D6 +ENCODING 25046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1C02 +223C +4108 +7F08 +087F +7F08 +083E +2A22 +1C22 +7F3E +0080 +2842 +2809 +4FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+61D8 +ENCODING 25048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2154 +17FF +0954 +0277 +4000 +27FF +0421 +15FD +2124 +412C +0020 +2902 +2889 +4FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+61DC +ENCODING 25052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +27FF +2088 +A3FE +A252 +B3FE +A800 +A7FF +2441 +24FD +2188 +2358 +2030 +2060 +23C0 +ENDCHAR +STARTCHAR U+61DD +ENCODING 25053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2400 +24BE +2702 +2424 +A498 +B388 +AD7F +A789 +A50A +2928 +27AE +2128 +22A8 +2278 +242C +2447 +ENDCHAR +STARTCHAR U+61DE +ENCODING 25054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +13FF +1048 +53FF +5201 +5AFD +D400 +93FF +1040 +10A3 +1356 +1090 +1338 +10D4 +1313 +1070 +ENDCHAR +STARTCHAR U+61DF +ENCODING 25055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +5484 +5584 +3504 +7FFE +2104 +1224 +7FB4 +0814 +7F84 +0804 +7F9C +0080 +24C6 +244B +6619 +C3F0 +ENDCHAR +STARTCHAR U+61E0 +ENCODING 25056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +5029 +50D6 +5C54 +50D6 +5115 +5082 +50FE +1082 +10FE +1082 +1082 +1102 +0000 +0000 +ENDCHAR +STARTCHAR U+61E1 +ENCODING 25057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +2484 +A7FF +A484 +B595 +AED5 +A4A5 +2400 +2448 +2498 +2DB2 +2862 +28CE +23FB +ENDCHAR +STARTCHAR U+61E2 +ENCODING 25058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +27E8 +2508 +27DF +A450 +B470 +AFCE +A500 +A7E0 +2000 +23FE +2292 +2292 +2292 +27FF +2000 +ENDCHAR +STARTCHAR U+61E3 +ENCODING 25059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0FFC +4910 +21F0 +27FC +0F74 +1554 +1554 +26EC +2444 +0100 +2488 +2424 +43E4 +0000 +ENDCHAR +STARTCHAR U+61E4 +ENCODING 25060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +50FE +51FF +5C01 +50FF +5010 +51FF +51FF +1002 +11FF +112A +11E6 +0000 +0000 +ENDCHAR +STARTCHAR U+61E5 +ENCODING 25061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +27FF +2020 +27FF +A401 +B1FC +A924 +A9FC +A124 +21FC +2082 +27FF +2121 +213C +23E0 +267F +ENDCHAR +STARTCHAR U+61E6 +ENCODING 25062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +1BFC +3648 +3758 +3358 +5040 +17FC +1080 +13F8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+61E7 +ENCODING 25063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +2441 +A4A1 +B28A +ACF9 +A800 +A3FE +2292 +23FE +2000 +27FF +2020 +2020 +20E0 +ENDCHAR +STARTCHAR U+61E8 +ENCODING 25064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +11F2 +1193 +51F2 +5192 +5DFF +51F2 +5192 +51F2 +5192 +11F2 +1292 +1094 +1019 +0000 +0000 +ENDCHAR +STARTCHAR U+61E9 +ENCODING 25065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +2088 +23FE +2020 +A1FC +B020 +AFFF +A924 +A3FE +2505 +21FC +2104 +21FD +2112 +21CC +2307 +ENDCHAR +STARTCHAR U+61EA +ENCODING 25066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1202 +13FE +5202 +53FE +5C88 +53FE +5088 +53FE +5124 +162B +11F0 +10A8 +1124 +0000 +0000 +ENDCHAR +STARTCHAR U+61EB +ENCODING 25067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1021 +11CE +1108 +51EF +514A +5D4A +50FE +5082 +50FE +5082 +10FE +1082 +10FE +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+61EC +ENCODING 25068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4210 +4FFC +4210 +7FFF +4FF8 +4888 +4FF8 +C888 +8FF8 +BE3E +0580 +24CA +661B +C3F1 +ENDCHAR +STARTCHAR U+61ED +ENCODING 25069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +13FF +5A44 +56FE +5244 +D3FF +9210 +12FE +1292 +12FE +1292 +1292 +12FE +1444 +1183 +ENDCHAR +STARTCHAR U+61EE +ENCODING 25070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1020 +10FC +50F4 +50BC +5884 +57FF +5355 +517C +5020 +107C +10A8 +1110 +10EE +0000 +0000 +ENDCHAR +STARTCHAR U+61EF +ENCODING 25071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A20 +7F20 +083F +7F64 +4954 +7F14 +491C +7F08 +081C +7F14 +1E36 +3263 +6600 +0486 +644B +C3F9 +ENDCHAR +STARTCHAR U+61F0 +ENCODING 25072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1101 +1671 +1451 +5555 +5615 +5CE5 +5145 +5225 +57F5 +5085 +13E5 +12A1 +11C1 +17F3 +0000 +0000 +ENDCHAR +STARTCHAR U+61F1 +ENCODING 25073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +1088 +53FE +5A52 +53FE +1012 +13FF +1210 +1214 +13D8 +1218 +1225 +1443 +0000 +0000 +ENDCHAR +STARTCHAR U+61F2 +ENCODING 25074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +2AA0 +4FBC +1048 +3FA8 +5228 +1790 +13B0 +1C48 +0104 +1490 +1488 +2424 +43E4 +0000 +ENDCHAR +STARTCHAR U+61F4 +ENCODING 25076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1130 +17E8 +1928 +3FFC +32A0 +36E8 +52A8 +16D8 +1290 +16D4 +12AC +13CC +1E04 +0000 +ENDCHAR +STARTCHAR U+61F5 +ENCODING 25077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2FFE +2110 +23F8 +B2A8 +ABF8 +A000 +AFFE +2802 +33FC +2208 +23F8 +2208 +23F8 +2208 +23F8 +ENDCHAR +STARTCHAR U+61F6 +ENCODING 25078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +113C +17D4 +1114 +3FEC +3D7C +3564 +57FC +1324 +13BC +1564 +197C +1128 +1144 +0000 +ENDCHAR +STARTCHAR U+61F7 +ENCODING 25079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1000 +1BF8 +36A8 +37F8 +3040 +575C +175C +11C8 +1F28 +1130 +11D0 +160C +0000 +ENDCHAR +STARTCHAR U+61F8 +ENCODING 25080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1E18 +52E0 +5E28 +5ED0 +5228 +5FFC +7E64 +2AA8 +2924 +4920 +0480 +2488 +2424 +43E4 +0000 +ENDCHAR +STARTCHAR U+61F9 +ENCODING 25081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +11EF +5129 +51EF +5C44 +51FF +5044 +51FF +5044 +11FF +118A +1084 +10CB +0000 +0000 +ENDCHAR +STARTCHAR U+61FA +ENCODING 25082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +12A0 +12B0 +13E8 +1D68 +3820 +3FFC +32A0 +56E8 +12A8 +16D0 +12D4 +16AC +13CC +1E04 +0000 +ENDCHAR +STARTCHAR U+61FB +ENCODING 25083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +11EF +1028 +51EF +50FE +5C92 +50FE +5092 +50FE +5044 +11FF +1044 +11FF +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+61FC +ENCODING 25084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +1BB8 +37B8 +36A8 +33B8 +5120 +11FC +1320 +15F8 +19F8 +1120 +11FC +0000 +ENDCHAR +STARTCHAR U+61FD +ENCODING 25085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +17FC +1110 +1BB8 +36A8 +37B8 +3120 +51FC +1320 +15F8 +1920 +11F8 +1120 +11FC +0000 +ENDCHAR +STARTCHAR U+61FE +ENCODING 25086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1110 +19F0 +35F0 +37F8 +3010 +57FC +12A8 +13B8 +13B8 +12AC +17F8 +1088 +0000 +ENDCHAR +STARTCHAR U+61FF +ENCODING 25087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +7C40 +137C +38A8 +7C30 +4530 +7E48 +00C4 +3C20 +2420 +3D48 +2544 +1E54 +6030 +0000 +ENDCHAR +STARTCHAR U+6200 +ENCODING 25088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +1FD8 +6868 +1390 +2BA8 +7C7C +3BB8 +56D4 +1390 +0100 +2488 +24A4 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+6201 +ENCODING 25089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2212 +FF96 +223F +7F64 +4924 +7F3F +0824 +3E24 +083F +7F24 +1424 +363F +E380 +0486 +644B +C3F9 +ENDCHAR +STARTCHAR U+6203 +ENCODING 25091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +2124 +27FF +2505 +A5FD +B000 +ABFE +AA22 +23FE +2222 +23FE +2020 +27FF +2000 +2292 +2449 +ENDCHAR +STARTCHAR U+6204 +ENCODING 25092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23DE +2252 +23DE +2252 +A3DE +B252 +ABFF +AE20 +2BFE +2220 +23FE +2220 +2FFF +2108 +20F0 +2F0F +ENDCHAR +STARTCHAR U+6206 +ENCODING 25094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FF7E +14A8 +FF10 +22EE +3E00 +227C +3E44 +0854 +7F54 +0828 +0A44 +5184 +5092 +9012 +0FF0 +ENDCHAR +STARTCHAR U+6207 +ENCODING 25095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +3E7E +14C4 +7F38 +3E7F +2390 +3EFF +227E +3E42 +087E +7F42 +087E +0224 +2942 +4809 +0FF8 +ENDCHAR +STARTCHAR U+6208 +ENCODING 25096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0110 +0108 +0108 +7FFC +0080 +0088 +0088 +0050 +0060 +00E4 +0314 +1C0C +0004 +0000 +ENDCHAR +STARTCHAR U+6209 +ENCODING 25097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +0088 +1FFC +1080 +1088 +1088 +1048 +1050 +1230 +1424 +1854 +618C +0604 +0000 +ENDCHAR +STARTCHAR U+620A +ENCODING 25098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0090 +0088 +1FFC +1080 +1088 +1088 +1050 +1050 +1020 +1064 +2194 +260C +4004 +0000 +ENDCHAR +STARTCHAR U+620B +ENCODING 25099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0480 +0448 +04FC +7F00 +0400 +0204 +02FE +FF00 +0110 +0120 +00C0 +0180 +0644 +3824 +001C +ENDCHAR +STARTCHAR U+620C +ENCODING 25100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +0088 +1FFC +1080 +1088 +1088 +1048 +1F50 +1030 +1024 +2054 +218C +4604 +0000 +ENDCHAR +STARTCHAR U+620D +ENCODING 25101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +0088 +1FFC +1080 +1088 +1888 +1448 +1250 +1230 +1024 +2054 +218C +4604 +0000 +ENDCHAR +STARTCHAR U+620E +ENCODING 25102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +0088 +7FFC +0080 +0888 +0888 +0B50 +7C50 +0820 +0860 +1094 +110C +2004 +0000 +ENDCHAR +STARTCHAR U+620F +ENCODING 25103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0050 +7E48 +0240 +43FE +2440 +1444 +1444 +0848 +1448 +1250 +2220 +4060 +8092 +010A +0206 +ENDCHAR +STARTCHAR U+6210 +ENCODING 25104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +0088 +1FFC +1080 +1090 +1E90 +1250 +1260 +1220 +1264 +2C94 +210C +4004 +0000 +ENDCHAR +STARTCHAR U+6211 +ENCODING 25105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +0490 +3888 +0888 +0880 +7FFC +0888 +0888 +0E50 +7850 +0824 +08D4 +0B0C +1804 +0000 +ENDCHAR +STARTCHAR U+6212 +ENCODING 25106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +0088 +7FFC +0080 +1288 +1288 +1250 +7FD0 +1220 +1224 +2254 +228C +4104 +0000 +ENDCHAR +STARTCHAR U+6213 +ENCODING 25107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +004C +0044 +FFFF +0040 +0040 +7E42 +4266 +4224 +422C +4238 +7E10 +0039 +00ED +0387 +0E02 +ENDCHAR +STARTCHAR U+6214 +ENCODING 25108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0110 +7FFC +0090 +0064 +01B4 +1E2C +0110 +7FFC +0090 +0060 +00E4 +071C +3804 +0000 +ENDCHAR +STARTCHAR U+6215 +ENCODING 25109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +2450 +2448 +2440 +2444 +3C7E +07C0 +0440 +FC48 +2448 +2450 +2420 +2460 +4492 +850A +0404 +ENDCHAR +STARTCHAR U+6216 +ENCODING 25110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +0088 +7FFC +0080 +1E88 +1288 +1248 +1E50 +1030 +0324 +0C54 +718C +0604 +0000 +ENDCHAR +STARTCHAR U+6217 +ENCODING 25111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0850 +1448 +1348 +2140 +407E +BFC0 +2224 +2224 +2A28 +2428 +2010 +2212 +222A +1E4A +0084 +ENDCHAR +STARTCHAR U+6218 +ENCODING 25112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +1248 +1F48 +107E +13C0 +1040 +7E40 +4248 +4228 +4230 +4220 +4250 +7E92 +410A +0206 +ENDCHAR +STARTCHAR U+6219 +ENCODING 25113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F94 +4092 +4090 +5EBF +4090 +5E90 +5292 +5292 +5E92 +5294 +4088 +4095 +42A3 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+621A +ENCODING 25114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +1FFC +1240 +13C8 +1248 +1FC8 +1228 +1730 +16B0 +2AB4 +324C +428C +0604 +0000 +ENDCHAR +STARTCHAR U+621B +ENCODING 25115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0200 +1FF0 +1010 +1FF0 +1FF0 +1010 +1FF0 +0108 +7FFC +00B0 +03E4 +3C1C +0000 +ENDCHAR +STARTCHAR U+621C +ENCODING 25116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +004C +0044 +FFFF +0040 +7E40 +4242 +7E66 +0024 +FF2C +1038 +7F10 +1039 +1F6D +F0C7 +0382 +ENDCHAR +STARTCHAR U+621D +ENCODING 25117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3E48 +2248 +2240 +3E7C +23C8 +3E48 +2250 +2230 +3E20 +1454 +1294 +230C +4204 +0000 +ENDCHAR +STARTCHAR U+621E +ENCODING 25118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0200 +0FE0 +0820 +0FE0 +0FE0 +0820 +3FFC +2128 +5FF8 +00A0 +03E4 +3C1C +0000 +ENDCHAR +STARTCHAR U+621F +ENCODING 25119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +7F48 +085C +3FE0 +2248 +3E48 +2250 +3E30 +0820 +7F60 +0894 +090C +0804 +0000 +ENDCHAR +STARTCHAR U+6220 +ENCODING 25120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +1016 +FF12 +4210 +661F +24F0 +FF10 +0012 +7E16 +4214 +421C +7E08 +421C +4235 +7E67 +01C2 +ENDCHAR +STARTCHAR U+6221 +ENCODING 25121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1228 +1224 +7FA4 +123C +1EE0 +1228 +1E28 +1228 +7FB0 +2A10 +2B34 +314C +208C +1F04 +0000 +ENDCHAR +STARTCHAR U+6222 +ENCODING 25122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +3FA8 +2124 +3F24 +0020 +FFFE +2120 +3F20 +2124 +3F24 +2128 +2110 +FFB2 +414A +018A +0104 +ENDCHAR +STARTCHAR U+6223 +ENCODING 25123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0094 +7D16 +9452 +7690 +221F +6370 +C190 +3E12 +0812 +0816 +7F1C +1008 +1C1D +3635 +6267 +C1C2 +ENDCHAR +STARTCHAR U+6224 +ENCODING 25124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +FFA8 +2124 +2224 +3D20 +55FE +4920 +5520 +8224 +7F24 +5528 +5510 +5532 +FFCA +008A +0104 +ENDCHAR +STARTCHAR U+6225 +ENCODING 25125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +7FA8 +4124 +7F24 +4120 +7FFE +2820 +2A20 +3F24 +4824 +BE28 +0810 +0F32 +F84A +408A +0104 +ENDCHAR +STARTCHAR U+6226 +ENCODING 25126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1150 +4948 +2A48 +2440 +3E7C +2BC0 +3E48 +2A48 +3E50 +0830 +7F24 +08D4 +0B0C +0804 +0000 +ENDCHAR +STARTCHAR U+6227 +ENCODING 25127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0814 +1C16 +3612 +6310 +DD9F +0070 +3F12 +2112 +3F16 +2114 +3F1C +2008 +7F1D +5115 +D137 +1F62 +ENDCHAR +STARTCHAR U+6229 +ENCODING 25129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +FF96 +4212 +421F +8470 +A510 +D692 +0012 +FF96 +0014 +7F1C +4108 +7F1D +4115 +4137 +7F62 +ENDCHAR +STARTCHAR U+622A +ENCODING 25130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0450 +3F48 +0448 +7FFC +1240 +1FA8 +3228 +3FB8 +5210 +1F94 +122C +1FCC +1004 +0000 +ENDCHAR +STARTCHAR U+622B +ENCODING 25131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +1009 +FE08 +21FF +2008 +7C08 +45E9 +4529 +FD2B +452A +45EE +7C04 +45EC +4415 +4477 +5DC2 +ENDCHAR +STARTCHAR U+622C +ENCODING 25132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7F28 +1424 +5524 +3620 +14FE +FF20 +0020 +3E24 +2224 +2228 +3E10 +2232 +224A +3E8A +0104 +ENDCHAR +STARTCHAR U+622D +ENCODING 25133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0414 +7FD2 +4050 +5F7F +0410 +3F90 +2490 +3F92 +2494 +3F89 +1115 +20A3 +4041 +0000 +0000 +ENDCHAR +STARTCHAR U+622E +ENCODING 25134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +7FA8 +19A8 +2AA0 +5DBC +2AE0 +4CA8 +1628 +6910 +3410 +0934 +324C +0C8C +7004 +0000 +ENDCHAR +STARTCHAR U+622F +ENCODING 25135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0430 +0728 +0428 +3FA0 +273C +3DE0 +2328 +2A28 +2AB0 +3B10 +3A34 +2B4C +4C8C +3004 +0000 +ENDCHAR +STARTCHAR U+6230 +ENCODING 25136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +7728 +5528 +7720 +003C +3EE0 +2A28 +3E28 +2A18 +3E10 +0834 +7F4C +088C +0804 +0000 +ENDCHAR +STARTCHAR U+6231 +ENCODING 25137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +03CA +0209 +3FE8 +2228 +23CF +3E78 +23C9 +2009 +228A +2AAA +2AAC +2EE4 +4AAD +4293 +4FE1 +ENDCHAR +STARTCHAR U+6232 +ENCODING 25138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0430 +0728 +3FA8 +2B20 +3D3C +27E0 +3F28 +2028 +2F18 +2910 +2F34 +2A4C +278C +5C04 +0000 +ENDCHAR +STARTCHAR U+6233 +ENCODING 25139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +7FA8 +19A8 +2AA0 +5DBC +2AE0 +5AA8 +1FA8 +2418 +7F10 +2414 +3F2C +244C +3F84 +0000 +ENDCHAR +STARTCHAR U+6234 +ENCODING 25140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1F50 +0448 +7FFC +1F40 +1548 +1F48 +1528 +1F28 +3FB0 +0A14 +7FAC +194C +6084 +0000 +ENDCHAR +STARTCHAR U+6236 +ENCODING 25142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007C +1F80 +1000 +1000 +1FFE +1002 +1002 +1002 +1FFE +1000 +1000 +1000 +1000 +2000 +2000 +4000 +ENDCHAR +STARTCHAR U+6237 +ENCODING 25143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0080 +0084 +3FFE +2004 +2004 +2004 +3FFC +2004 +2000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U+6238 +ENCODING 25144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +1FF8 +1008 +1008 +1008 +1FF8 +1008 +1000 +1000 +2000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+6239 +ENCODING 25145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +0078 +3FC0 +2000 +3FFE +2002 +3FFE +2000 +2FFC +2018 +2070 +61C0 +4700 +CC01 +0803 +07FE +ENDCHAR +STARTCHAR U+623A +ENCODING 25146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0100 +3E7F +2041 +2041 +3F41 +217F +2140 +2140 +3F40 +2040 +2041 +2041 +407F +0000 +0000 +ENDCHAR +STARTCHAR U+623B +ENCODING 25147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +1FF8 +1008 +1FF8 +1088 +1080 +1FFC +1080 +2140 +2220 +4C10 +300C +0000 +ENDCHAR +STARTCHAR U+623D +ENCODING 25149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +3FFC +2008 +2008 +3FF8 +2420 +2320 +2920 +2624 +223E +3FE0 +4020 +4020 +8020 +0020 +ENDCHAR +STARTCHAR U+623E +ENCODING 25150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +3FFC +2008 +2008 +3FF8 +2140 +2124 +3FFE +2100 +2100 +2280 +4280 +4460 +881C +3008 +ENDCHAR +STARTCHAR U+623F +ENCODING 25151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0000 +1FF0 +1010 +1FF0 +1080 +1FFC +1080 +10F0 +1110 +2210 +2C10 +7060 +0000 +ENDCHAR +STARTCHAR U+6240 +ENCODING 25152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F10 +00E0 +1E80 +1280 +12FC +1290 +1E90 +1290 +1090 +1110 +1110 +2210 +4010 +0000 +ENDCHAR +STARTCHAR U+6241 +ENCODING 25153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +1FF8 +1008 +1FF8 +1000 +1FF8 +1948 +1948 +2FF8 +2948 +4948 +0958 +0000 +ENDCHAR +STARTCHAR U+6242 +ENCODING 25154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +0078 +3FC0 +2000 +3FFE +2002 +3FFE +2080 +2080 +20FE +2080 +6080 +4FFC +C804 +0804 +0FFC +ENDCHAR +STARTCHAR U+6243 +ENCODING 25155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +3FFC +2008 +2008 +3FF8 +2004 +2FFE +2804 +2804 +2BF4 +2A14 +4A14 +4BF4 +8804 +0808 +ENDCHAR +STARTCHAR U+6244 +ENCODING 25156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +0078 +3FC0 +2000 +3FFC +2004 +3FFC +2080 +2100 +2FFE +2802 +6BFA +4A0A +CBFA +0802 +080E +ENDCHAR +STARTCHAR U+6246 +ENCODING 25158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +0078 +3FC0 +2000 +3FFE +2002 +3FFE +2080 +2080 +3FFF +6140 +4766 +5C2C +C430 +079C +1C07 +ENDCHAR +STARTCHAR U+6247 +ENCODING 25159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +1FF8 +1008 +1FF8 +1000 +1FF8 +1948 +1528 +2738 +39C8 +4108 +0318 +0000 +ENDCHAR +STARTCHAR U+6248 +ENCODING 25160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +1FF8 +1008 +1FF8 +13E0 +1220 +13E0 +17F0 +1490 +27F4 +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+6249 +ENCODING 25161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +1FF8 +1008 +1FF8 +1140 +1F78 +1140 +1F78 +2140 +3E7C +4240 +0440 +0000 +ENDCHAR +STARTCHAR U+624A +ENCODING 25162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFC +2000 +3FFE +2002 +3FFE +2444 +2358 +20A0 +2F1E +2000 +2444 +2358 +40A0 +0F1E +0000 +0000 +ENDCHAR +STARTCHAR U+624B +ENCODING 25163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +00C0 +1F00 +0100 +0100 +3FF8 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+624C +ENCODING 25164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1000 +1000 +FC00 +1000 +1000 +1400 +1800 +3000 +D000 +1000 +1000 +1000 +5000 +2000 +ENDCHAR +STARTCHAR U+624D +ENCODING 25165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0080 +7FFC +00A0 +00C0 +0080 +0180 +0280 +0C80 +3080 +0080 +0080 +0180 +0000 +ENDCHAR +STARTCHAR U+624E +ENCODING 25166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +7C80 +1080 +1080 +1080 +1480 +1880 +7080 +1084 +1084 +1084 +307C +0000 +ENDCHAR +STARTCHAR U+6250 +ENCODING 25168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1020 +FDFE +1022 +1022 +1022 +1C22 +F062 +1042 +1042 +10C6 +1084 +1184 +731C +ENDCHAR +STARTCHAR U+6251 +ENCODING 25169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0840 +0A40 +7F40 +0850 +0A4C +0C46 +1842 +6840 +0840 +0840 +0840 +0840 +2840 +1040 +ENDCHAR +STARTCHAR U+6252 +ENCODING 25170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1020 +1120 +1120 +FD20 +1120 +1520 +1920 +3120 +D120 +1210 +1210 +1218 +140E +5804 +2000 +ENDCHAR +STARTCHAR U+6253 +ENCODING 25171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +7E20 +0820 +0820 +0820 +0E20 +7820 +0820 +0820 +0820 +0820 +1860 +0000 +ENDCHAR +STARTCHAR U+6254 +ENCODING 25172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +17FC +1088 +FC88 +1090 +1494 +18BE +3084 +D084 +1104 +1104 +1104 +1244 +5428 +2810 +ENDCHAR +STARTCHAR U+6255 +ENCODING 25173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7E40 +0840 +0840 +0840 +0C80 +78A0 +0890 +0908 +0938 +0FC4 +1804 +0000 +ENDCHAR +STARTCHAR U+6256 +ENCODING 25174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11E0 +1020 +1020 +FC20 +1020 +1020 +1020 +1C70 +F050 +1050 +10D8 +1088 +118C +1306 +7603 +ENDCHAR +STARTCHAR U+6258 +ENCODING 25176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +09C0 +7E40 +0840 +0840 +087C +0FC0 +1840 +6840 +0840 +0844 +0844 +183C +0000 +ENDCHAR +STARTCHAR U+6259 +ENCODING 25177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1008 +7DFF +1008 +1008 +1488 +1888 +3048 +5028 +1010 +1028 +1044 +5082 +2301 +0000 +0000 +ENDCHAR +STARTCHAR U+625A +ENCODING 25178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +10FE +FD82 +1102 +1302 +10C2 +1C62 +F022 +1002 +1002 +1002 +1006 +1004 +701C +ENDCHAR +STARTCHAR U+625B +ENCODING 25179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +7C40 +1040 +1040 +1040 +1440 +1840 +7040 +1040 +1040 +1FFC +3000 +0000 +ENDCHAR +STARTCHAR U+625C +ENCODING 25180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1010 +1010 +FC10 +1010 +1010 +11FF +1C10 +F010 +1010 +1010 +1010 +1010 +1010 +7010 +ENDCHAR +STARTCHAR U+625E +ENCODING 25182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1040 +7C40 +1040 +1040 +13FC +1440 +1840 +7040 +1040 +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+6260 +ENCODING 25184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1008 +7C48 +1128 +1130 +1090 +14A0 +1860 +7040 +10A0 +1110 +1208 +3404 +0000 +ENDCHAR +STARTCHAR U+6261 +ENCODING 25185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +7C90 +13FF +1091 +1491 +1892 +7090 +1080 +1081 +1081 +5081 +207F +0000 +0000 +ENDCHAR +STARTCHAR U+6262 +ENCODING 25186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1042 +10FF +7D00 +1000 +10FE +1404 +1808 +7010 +1020 +1040 +1081 +5101 +20FF +0000 +0000 +ENDCHAR +STARTCHAR U+6263 +ENCODING 25187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1000 +11F8 +7D08 +1108 +1108 +1108 +1508 +1908 +7108 +1108 +11F8 +1108 +3108 +0000 +ENDCHAR +STARTCHAR U+6264 +ENCODING 25188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FF +1090 +1090 +FC90 +1090 +1090 +1090 +1C90 +F090 +1090 +1190 +1110 +1111 +1319 +760F +ENDCHAR +STARTCHAR U+6265 +ENCODING 25189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0822 +0827 +7E38 +09E0 +0820 +0C22 +19FF +6820 +0820 +0820 +0821 +2821 +101F +0000 +0000 +ENDCHAR +STARTCHAR U+6266 +ENCODING 25190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +13C0 +1040 +FC40 +1040 +1444 +1FFE +3040 +D040 +1040 +1040 +1040 +1040 +5040 +2040 +ENDCHAR +STARTCHAR U+6267 +ENCODING 25191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +1090 +FFF8 +1090 +1490 +1890 +3190 +D090 +1150 +1152 +1112 +1212 +540E +2800 +ENDCHAR +STARTCHAR U+6268 +ENCODING 25192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +1090 +7C90 +1090 +1290 +1190 +1490 +18D0 +70B0 +111C +1110 +1210 +3460 +0000 +ENDCHAR +STARTCHAR U+6269 +ENCODING 25193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1024 +13FE +FE00 +1200 +1600 +1A00 +3200 +D200 +1200 +1200 +1200 +1400 +5400 +2800 +ENDCHAR +STARTCHAR U+626A +ENCODING 25194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1204 +117E +1284 +FE04 +1204 +1204 +1604 +1A04 +3204 +D204 +1204 +1204 +1204 +5214 +2008 +ENDCHAR +STARTCHAR U+626B +ENCODING 25195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +13FE +1004 +FC04 +1004 +1404 +19FC +3004 +D004 +1004 +1004 +1004 +13FC +5004 +2000 +ENDCHAR +STARTCHAR U+626C +ENCODING 25196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13F8 +1010 +1020 +FC40 +1084 +17FE +18A4 +30A4 +D0A4 +1124 +1144 +1244 +1484 +5128 +2010 +ENDCHAR +STARTCHAR U+626D +ENCODING 25197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1088 +1088 +FC88 +1088 +1488 +1BF8 +3088 +D088 +1088 +1088 +1088 +1088 +57FE +2000 +ENDCHAR +STARTCHAR U+626E +ENCODING 25198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10E0 +1020 +1120 +7D20 +1110 +1210 +13F8 +1C94 +7090 +1090 +1110 +1110 +1210 +3460 +0000 +ENDCHAR +STARTCHAR U+626F +ENCODING 25199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1020 +FC20 +1128 +153C +1920 +3120 +D120 +1120 +1120 +1124 +17FE +5000 +2000 +ENDCHAR +STARTCHAR U+6270 +ENCODING 25200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +1048 +1040 +FC44 +13FE +1440 +1860 +30A0 +D0A0 +10A0 +10A0 +1122 +1122 +521E +2400 +ENDCHAR +STARTCHAR U+6271 +ENCODING 25201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +1110 +7D20 +1120 +11F8 +1188 +1D88 +7250 +1250 +1220 +1450 +1588 +3E04 +0000 +ENDCHAR +STARTCHAR U+6272 +ENCODING 25202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +7C82 +1101 +107C +1400 +1800 +70FE +1002 +1004 +1008 +5010 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6273 +ENCODING 25203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +11E0 +1100 +FD00 +11FC +1104 +1548 +1948 +3150 +D130 +1220 +1250 +148E +5904 +2000 +ENDCHAR +STARTCHAR U+6274 +ENCODING 25204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +7C82 +1101 +1044 +1444 +1844 +7044 +1044 +1084 +1104 +5204 +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+6276 +ENCODING 25206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FF8 +1040 +1040 +1040 +1FFC +7040 +10A0 +10A0 +1110 +1608 +3804 +0000 +ENDCHAR +STARTCHAR U+6277 +ENCODING 25207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +08FC +0810 +7C10 +0810 +09FF +0C10 +1810 +6810 +0828 +0844 +0882 +2901 +1201 +0000 +0000 +ENDCHAR +STARTCHAR U+6279 +ENCODING 25209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1220 +1220 +7E24 +1224 +13E8 +1230 +1E20 +7220 +1220 +1220 +12E4 +1324 +3C1C +0000 +ENDCHAR +STARTCHAR U+627A +ENCODING 25210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +1110 +FD10 +1110 +1110 +11FF +1D10 +F118 +1108 +1108 +110C +1105 +11E7 +7702 +ENDCHAR +STARTCHAR U+627B +ENCODING 25211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +107F +7C91 +1111 +1010 +1410 +1810 +7010 +1028 +1044 +1082 +5101 +2201 +0000 +0000 +ENDCHAR +STARTCHAR U+627C +ENCODING 25212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1200 +7E00 +12F8 +1288 +1288 +1688 +1A88 +72B0 +1280 +1484 +1484 +387C +0000 +ENDCHAR +STARTCHAR U+627D +ENCODING 25213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2026 +203C +23E0 +F820 +2222 +2222 +2222 +3A22 +E222 +23FE +2020 +2020 +2021 +2033 +601E +ENDCHAR +STARTCHAR U+627E +ENCODING 25214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1048 +1048 +7C40 +107C +13C8 +1048 +1450 +1830 +7020 +1054 +1094 +130C +3004 +0000 +ENDCHAR +STARTCHAR U+627F +ENCODING 25215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0040 +0084 +7924 +0FE8 +0930 +0FE0 +1110 +1FF0 +2108 +4104 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6280 +ENCODING 25216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +1040 +1040 +13F8 +1D08 +7090 +1090 +1060 +1060 +1190 +360C +0000 +ENDCHAR +STARTCHAR U+6281 +ENCODING 25217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +1040 +7C84 +1102 +13FF +1491 +1890 +7090 +1090 +1090 +1111 +5211 +241F +0000 +0000 +ENDCHAR +STARTCHAR U+6282 +ENCODING 25218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1040 +7C40 +1040 +1040 +13F8 +1440 +1840 +7040 +1040 +1040 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+6283 +ENCODING 25219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +1040 +1040 +1060 +1450 +1848 +7048 +1040 +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+6284 +ENCODING 25220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1160 +7D50 +1148 +1248 +1254 +1C54 +70E0 +1020 +1040 +1080 +1300 +3C00 +0000 +ENDCHAR +STARTCHAR U+6286 +ENCODING 25222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FE +FC88 +1088 +1888 +1088 +3050 +5050 +9020 +1050 +1088 +5104 +2602 +0000 +0000 +ENDCHAR +STARTCHAR U+6287 +ENCODING 25223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0802 +08FF +7E82 +0882 +0882 +0A82 +0CFE +1882 +6882 +0882 +0882 +28FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+6288 +ENCODING 25224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +08FE +0882 +7E82 +08FE +0A82 +0C82 +18FE +6882 +0882 +0882 +0882 +290A +1204 +0000 +0000 +ENDCHAR +STARTCHAR U+6289 +ENCODING 25225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +7FF0 +1090 +1090 +1090 +17FC +1880 +70C0 +1140 +1220 +1410 +380C +0000 +ENDCHAR +STARTCHAR U+628A +ENCODING 25226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +7E48 +1248 +1248 +13F8 +1E08 +7200 +1200 +1200 +1204 +1204 +31FC +0000 +ENDCHAR +STARTCHAR U+628C +ENCODING 25228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +09FF +7D21 +0921 +0820 +0C28 +1828 +6828 +0828 +0848 +0889 +2909 +120F +0000 +0000 +ENDCHAR +STARTCHAR U+628D +ENCODING 25229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +10E4 +1384 +1084 +FC84 +1084 +13FF +1084 +1C84 +F084 +1084 +1084 +1184 +1104 +1304 +7204 +ENDCHAR +STARTCHAR U+628E +ENCODING 25230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1000 +1000 +FC00 +1000 +11FF +1020 +1C20 +F020 +1064 +1044 +1046 +10C2 +109E +71F3 +ENDCHAR +STARTCHAR U+628F +ENCODING 25231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1000 +1000 +FC00 +1000 +13FF +1048 +1C48 +F048 +1048 +1048 +10C8 +1089 +1189 +7307 +ENDCHAR +STARTCHAR U+6290 +ENCODING 25232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +23FE +FA22 +2222 +2222 +2272 +3A52 +E2DA +228A +2202 +2202 +2202 +2202 +620E +ENDCHAR +STARTCHAR U+6291 +ENCODING 25233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1378 +7E48 +1248 +1248 +1248 +1E48 +7248 +13C8 +1E70 +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+6292 +ENCODING 25234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1090 +7C60 +1040 +17FC +1048 +1450 +1840 +7040 +1040 +1040 +1040 +30C0 +0000 +ENDCHAR +STARTCHAR U+6293 +ENCODING 25235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +11D0 +7D50 +1150 +1150 +1150 +1550 +1950 +7150 +1250 +1248 +1448 +3804 +0000 +ENDCHAR +STARTCHAR U+6294 +ENCODING 25236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1020 +7C20 +1060 +1060 +10D0 +1548 +1A44 +7044 +1040 +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+6295 +ENCODING 25237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11E0 +1120 +7D24 +1124 +121C +1400 +1FF0 +7110 +1120 +10C0 +10C0 +1330 +3C0C +0000 +ENDCHAR +STARTCHAR U+6296 +ENCODING 25238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1090 +1050 +7C50 +1010 +1110 +1090 +1490 +181C +7070 +1390 +1010 +1010 +3010 +0000 +ENDCHAR +STARTCHAR U+6297 +ENCODING 25239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7C00 +1000 +11E0 +1120 +1520 +1920 +7120 +1120 +1224 +1224 +341C +0000 +ENDCHAR +STARTCHAR U+6298 +ENCODING 25240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +11C0 +7D00 +1100 +11FC +1120 +1D20 +7120 +1220 +1220 +1420 +1820 +3020 +0000 +ENDCHAR +STARTCHAR U+629A +ENCODING 25242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +17FC +1040 +FC40 +1044 +17FE +1840 +3040 +D0A0 +10A0 +1120 +1122 +1222 +541E +2800 +ENDCHAR +STARTCHAR U+629B +ENCODING 25243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1220 +1220 +7E78 +17A8 +12A8 +12A8 +16A8 +1AA8 +72C8 +1298 +1484 +1484 +387C +0000 +ENDCHAR +STARTCHAR U+629C +ENCODING 25244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +7FFC +1080 +1080 +10F8 +1C88 +70C8 +1150 +1130 +1230 +14C8 +3B04 +0000 +ENDCHAR +STARTCHAR U+629E +ENCODING 25246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7D08 +1108 +11F8 +1148 +1D40 +7120 +1120 +1210 +1210 +1408 +3804 +0000 +ENDCHAR +STARTCHAR U+629F +ENCODING 25247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1048 +13FC +FC40 +1044 +17FE +1480 +1880 +31F8 +D008 +1310 +10D0 +1020 +5010 +2008 +ENDCHAR +STARTCHAR U+62A0 +ENCODING 25248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1200 +1308 +FE88 +1250 +1650 +1A20 +3220 +D250 +1298 +1308 +1200 +1204 +53FE +2000 +ENDCHAR +STARTCHAR U+62A1 +ENCODING 25249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +FD10 +1108 +120E +1D04 +3110 +D130 +11C0 +1100 +1104 +1104 +50FC +2000 +ENDCHAR +STARTCHAR U+62A2 +ENCODING 25250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +FD10 +120E +15F4 +1910 +3110 +D110 +1150 +1120 +1104 +1104 +50FC +2000 +ENDCHAR +STARTCHAR U+62A4 +ENCODING 25252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1060 +1024 +13FE +FE04 +1204 +1604 +1BFC +3204 +D200 +1200 +1200 +1200 +1400 +5400 +2800 +ENDCHAR +STARTCHAR U+62A5 +ENCODING 25253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1108 +FD28 +1110 +1500 +19F8 +3108 +D190 +1150 +1120 +1150 +118E +5104 +2100 +ENDCHAR +STARTCHAR U+62A6 +ENCODING 25254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2020 +2020 +FBFE +2222 +2222 +2272 +3A52 +E2DA +228A +2202 +2202 +2202 +2202 +620E +ENDCHAR +STARTCHAR U+62A8 +ENCODING 25256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1020 +1020 +FD24 +10A8 +1420 +1824 +33FE +D020 +1020 +1020 +1020 +1020 +5020 +2020 +ENDCHAR +STARTCHAR U+62A9 +ENCODING 25257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FC +7D24 +1124 +15FC +1924 +3124 +57FF +1104 +1104 +1104 +5114 +2108 +0000 +0000 +ENDCHAR +STARTCHAR U+62AA +ENCODING 25258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +13FF +7C50 +1090 +11FE +1292 +1892 +7092 +1092 +1096 +1010 +5010 +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+62AB +ENCODING 25259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7E48 +1250 +1240 +13F8 +1E88 +7290 +1250 +1260 +1460 +1590 +3E0C +0000 +ENDCHAR +STARTCHAR U+62AC +ENCODING 25260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7C90 +1088 +111C +17E4 +1400 +19F8 +7108 +1108 +1108 +11F8 +3108 +0000 +ENDCHAR +STARTCHAR U+62AD +ENCODING 25261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +7D01 +1101 +1048 +1448 +1848 +7048 +1048 +1048 +1089 +5109 +220F +0000 +0000 +ENDCHAR +STARTCHAR U+62AE +ENCODING 25262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +7C82 +1111 +1020 +1448 +1810 +7024 +1044 +1008 +1010 +5020 +21C0 +0000 +0000 +ENDCHAR +STARTCHAR U+62AF +ENCODING 25263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1084 +7C84 +1084 +10FC +1484 +1884 +70FC +1084 +1084 +1084 +5084 +23FF +0000 +0000 +ENDCHAR +STARTCHAR U+62B0 +ENCODING 25264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +7DFC +1124 +1124 +1524 +1924 +77FF +1050 +1088 +1104 +5202 +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+62B1 +ENCODING 25265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +11F8 +7E08 +13C8 +1448 +1048 +1FC8 +7248 +1230 +1200 +1204 +1204 +31FC +0000 +ENDCHAR +STARTCHAR U+62B3 +ENCODING 25267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2202 +2202 +FA02 +23FE +2200 +2240 +3A46 +E25C +2270 +2240 +2640 +2441 +2C63 +603E +ENDCHAR +STARTCHAR U+62B4 +ENCODING 25268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1092 +1092 +7C92 +1092 +11FF +1492 +1892 +7092 +1092 +109E +1080 +5080 +20FF +0000 +0000 +ENDCHAR +STARTCHAR U+62B5 +ENCODING 25269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +11E0 +1120 +7D20 +1120 +11FC +1120 +1D20 +7120 +11D0 +1614 +100C +17FC +3004 +0000 +ENDCHAR +STARTCHAR U+62B6 +ENCODING 25270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2120 +2120 +21FE +FB20 +2220 +2020 +23FF +3820 +E070 +2050 +2058 +20C8 +208C +2186 +6303 +ENDCHAR +STARTCHAR U+62B7 +ENCODING 25271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1010 +1010 +FC30 +1020 +1068 +10EC +1DA6 +F323 +1020 +1020 +1020 +1000 +13FF +7000 +ENDCHAR +STARTCHAR U+62B8 +ENCODING 25272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1038 +11E0 +7C20 +1020 +13FF +100C +1838 +70E0 +1100 +1300 +1480 +5060 +201F +0000 +0000 +ENDCHAR +STARTCHAR U+62B9 +ENCODING 25273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +1040 +1040 +13F8 +1CE0 +70E0 +1150 +1248 +1444 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+62BA +ENCODING 25274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +23FE +F820 +2020 +2020 +27FF +38A8 +E0A8 +20A8 +21AC +2124 +2326 +2623 +6020 +ENDCHAR +STARTCHAR U+62BB +ENCODING 25275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FF8 +1248 +1248 +13F8 +1648 +1A48 +73F8 +1248 +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+62BC +ENCODING 25276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +7E48 +13F8 +1248 +1248 +1FF8 +7248 +1040 +1040 +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+62BD +ENCODING 25277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7C40 +13F8 +1248 +1248 +1E48 +73F8 +1248 +1248 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+62BE +ENCODING 25278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +21FE +F820 +2020 +2020 +2020 +3BFF +E040 +2040 +20C4 +2084 +20BE +21E2 +6303 +ENDCHAR +STARTCHAR U+62BF +ENCODING 25279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1208 +1208 +FE08 +13F8 +1640 +1A44 +33FE +D240 +1220 +1220 +1210 +1292 +530A +2206 +ENDCHAR +STARTCHAR U+62C2 +ENCODING 25282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +13F8 +7CA8 +10A8 +13F8 +12A0 +16A0 +1BFC +70A4 +10A4 +10B8 +1120 +3220 +0000 +ENDCHAR +STARTCHAR U+62C4 +ENCODING 25284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1004 +13FE +FC20 +1020 +1420 +1828 +31FC +D020 +1020 +1020 +1020 +1024 +57FE +2000 +ENDCHAR +STARTCHAR U+62C5 +ENCODING 25285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7D10 +1110 +11F0 +1110 +1510 +1910 +71F0 +1110 +1000 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+62C6 +ENCODING 25286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +13C0 +7E00 +1200 +13FC +1220 +16A0 +1A60 +7230 +1228 +1424 +1420 +3820 +0000 +ENDCHAR +STARTCHAR U+62C7 +ENCODING 25287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7D48 +1128 +1128 +17FC +1608 +1A88 +7248 +1248 +13FC +1208 +3030 +0000 +ENDCHAR +STARTCHAR U+62C8 +ENCODING 25288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7C40 +107C +1040 +1040 +1440 +1BF8 +7208 +1208 +1208 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+62C9 +ENCODING 25289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +1010 +1210 +1110 +1510 +18A0 +70A0 +10A0 +1040 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+62CA +ENCODING 25290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1110 +7D10 +13FC +1210 +1690 +1650 +1A50 +7210 +1210 +1210 +1210 +3230 +0000 +ENDCHAR +STARTCHAR U+62CB +ENCODING 25291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +2210 +2210 +FA7C +2FD4 +2214 +3294 +6294 +A294 +2294 +22A4 +24CA +A882 +407E +0000 +0000 +ENDCHAR +STARTCHAR U+62CC +ENCODING 25292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1150 +7D48 +1248 +11F0 +1040 +1440 +1BFC +7040 +1040 +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+62CD +ENCODING 25293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +1040 +7C80 +11F8 +1108 +1108 +1D08 +71F8 +1108 +1108 +1108 +11F8 +3108 +0000 +ENDCHAR +STARTCHAR U+62CE +ENCODING 25294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +FD10 +1288 +144E +1844 +3000 +D3F8 +1008 +1010 +10A0 +1040 +5020 +2020 +ENDCHAR +STARTCHAR U+62CF +ENCODING 25295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7FF8 +1248 +1250 +3C20 +06D0 +190C +60E0 +0F00 +1FF0 +0100 +3FF8 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+62D0 +ENCODING 25296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7E08 +13F8 +1208 +1000 +1FF8 +7088 +1088 +1088 +1108 +1208 +3430 +0000 +ENDCHAR +STARTCHAR U+62D1 +ENCODING 25297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1110 +7FFC +1110 +1110 +1110 +15F0 +1910 +7110 +1110 +1110 +11F0 +3110 +0000 +ENDCHAR +STARTCHAR U+62D2 +ENCODING 25298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0900 +7F00 +09F8 +0908 +0908 +0F08 +79F8 +0908 +0900 +0900 +09FC +1900 +0000 +ENDCHAR +STARTCHAR U+62D3 +ENCODING 25299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1040 +7C40 +1080 +1080 +11F8 +1308 +1D08 +7908 +1108 +1108 +11F8 +3108 +0000 +ENDCHAR +STARTCHAR U+62D4 +ENCODING 25300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1088 +1088 +7FFC +1080 +1090 +1090 +15D0 +1950 +7120 +1220 +1250 +1488 +3904 +0000 +ENDCHAR +STARTCHAR U+62D5 +ENCODING 25301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +11FF +FD01 +1101 +1040 +1046 +1C5C +F070 +1040 +1040 +1040 +1041 +1063 +703E +ENDCHAR +STARTCHAR U+62D6 +ENCODING 25302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1084 +10FE +FD20 +1220 +1124 +1D3E +31E4 +D724 +1134 +1128 +1122 +1102 +50FE +2000 +ENDCHAR +STARTCHAR U+62D7 +ENCODING 25303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1120 +1120 +7D20 +1678 +12A8 +12A8 +1528 +1928 +72A8 +12A8 +1FC8 +1048 +3098 +0000 +ENDCHAR +STARTCHAR U+62D8 +ENCODING 25304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1100 +7FF8 +1208 +1408 +13C8 +1248 +1A48 +73C8 +1248 +1008 +1008 +3030 +0000 +ENDCHAR +STARTCHAR U+62D9 +ENCODING 25305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1248 +7E48 +1248 +13F8 +1248 +1040 +1A48 +7248 +1248 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+62DA +ENCODING 25306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1090 +1108 +FFFC +1004 +1110 +1510 +1914 +37FE +D110 +1110 +1110 +1110 +5210 +2410 +ENDCHAR +STARTCHAR U+62DB +ENCODING 25307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1088 +7C88 +1088 +1108 +1130 +1600 +19F8 +7108 +1108 +1108 +11F8 +3108 +0000 +ENDCHAR +STARTCHAR U+62DC +ENCODING 25308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +05FC +3820 +08F8 +0820 +3E20 +08F8 +0820 +0E20 +79FC +0820 +1020 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+62DD +ENCODING 25309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +7C40 +13F8 +1040 +1040 +13F8 +1840 +7040 +17FC +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+62DF +ENCODING 25311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +1088 +1248 +FE68 +1228 +1608 +1A08 +3208 +D208 +1248 +1288 +1314 +1222 +5042 +2080 +ENDCHAR +STARTCHAR U+62E0 +ENCODING 25312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1270 +1250 +7A50 +1750 +1550 +1550 +1B50 +7290 +1294 +1514 +190C +10C0 +303C +0000 +ENDCHAR +STARTCHAR U+62E1 +ENCODING 25313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +11FC +7D00 +1120 +1120 +1120 +1D20 +7120 +1150 +1248 +127C +1784 +3804 +0000 +ENDCHAR +STARTCHAR U+62E2 +ENCODING 25314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10A0 +1090 +1090 +FC84 +13FE +14A0 +18A0 +3124 +D124 +1128 +1232 +1222 +1462 +549E +2800 +ENDCHAR +STARTCHAR U+62E3 +ENCODING 25315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +13FE +1080 +FC80 +13E0 +1120 +1E24 +33FE +D020 +1020 +10A8 +1124 +1222 +54A2 +2040 +ENDCHAR +STARTCHAR U+62E5 +ENCODING 25317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27FE +2444 +2444 +FC44 +27FC +2C44 +3444 +6444 +A7FC +2444 +2444 +2844 +2844 +B054 +4008 +ENDCHAR +STARTCHAR U+62E6 +ENCODING 25318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1208 +1110 +10A4 +FFFE +1000 +1400 +1808 +33FC +D000 +1000 +1000 +1000 +1004 +5FFE +2000 +ENDCHAR +STARTCHAR U+62E7 +ENCODING 25319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1020 +13FE +FA02 +1404 +1000 +1BFE +3020 +D020 +1020 +1020 +1020 +1020 +50A0 +2040 +ENDCHAR +STARTCHAR U+62E8 +ENCODING 25320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +1248 +1240 +FFFE +1080 +1480 +18F8 +1108 +3190 +D250 +1220 +1450 +1888 +510E +2204 +ENDCHAR +STARTCHAR U+62E9 +ENCODING 25321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13F8 +1110 +10A0 +FC40 +10A0 +1510 +1A4E +35F4 +D040 +1048 +17FC +1040 +1040 +5040 +2040 +ENDCHAR +STARTCHAR U+62EA +ENCODING 25322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2048 +2048 +FBFF +2249 +2249 +2249 +3A49 +E289 +2307 +2201 +2201 +2201 +23FF +6000 +ENDCHAR +STARTCHAR U+62EB +ENCODING 25323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +7D04 +11FC +1104 +15FC +1902 +3124 +5128 +1110 +1128 +1144 +5182 +2301 +0000 +0000 +ENDCHAR +STARTCHAR U+62EC +ENCODING 25324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +13C0 +7C40 +1040 +17FC +1040 +1C40 +73F8 +1208 +1208 +1208 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+62ED +ENCODING 25325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1028 +1024 +7FFC +1020 +1020 +17E0 +1120 +1920 +7110 +1150 +1194 +1E0C +3004 +0000 +ENDCHAR +STARTCHAR U+62EE +ENCODING 25326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +1040 +1040 +11F8 +1400 +19F8 +7108 +1108 +1108 +11F8 +3108 +0000 +ENDCHAR +STARTCHAR U+62EF +ENCODING 25327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1020 +7C40 +13C8 +10E8 +10F0 +1550 +1950 +7248 +1444 +10C0 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+62F0 +ENCODING 25328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1082 +7D04 +1338 +1108 +1108 +1508 +197F +7108 +1108 +1108 +1108 +513E +2100 +0000 +0000 +ENDCHAR +STARTCHAR U+62F1 +ENCODING 25329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +1120 +7D20 +17F8 +1120 +1120 +1520 +1920 +77FC +1120 +1110 +1208 +3408 +0000 +ENDCHAR +STARTCHAR U+62F2 +ENCODING 25330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +7FFE +0420 +0420 +0420 +FFFF +0810 +30EC +EF87 +0100 +1FF8 +0100 +FFFF +0100 +0700 +ENDCHAR +STARTCHAR U+62F3 +ENCODING 25331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +1110 +1FF0 +0280 +7FFC +0820 +1FD8 +6104 +1FF0 +0100 +3FF8 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+62F4 +ENCODING 25332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +1110 +FE0E +1404 +13F8 +1C40 +3040 +D048 +17FC +1040 +1040 +1044 +5FFE +2000 +ENDCHAR +STARTCHAR U+62F5 +ENCODING 25333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +7FFC +1100 +11F8 +1208 +1610 +1A20 +73FC +1220 +1220 +1220 +3260 +0000 +ENDCHAR +STARTCHAR U+62F6 +ENCODING 25334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1124 +1124 +1248 +7C90 +1248 +11A4 +1040 +1478 +1888 +7190 +1250 +1020 +10C0 +3300 +0000 +ENDCHAR +STARTCHAR U+62F7 +ENCODING 25335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7C48 +1050 +17FC +1040 +1CF8 +7180 +12F8 +1488 +1008 +1008 +3030 +0000 +ENDCHAR +STARTCHAR U+62F8 +ENCODING 25336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +107E +10C4 +7D28 +1010 +1020 +15C8 +181F +7021 +10D2 +100C +1008 +1010 +33E0 +0000 +0000 +ENDCHAR +STARTCHAR U+62F9 +ENCODING 25337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FE +1022 +7C42 +108C +1400 +1904 +37DF +5145 +1145 +1249 +1451 +5082 +230C +0000 +0000 +ENDCHAR +STARTCHAR U+62FA +ENCODING 25338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +7C10 +1010 +11FF +1511 +1911 +7010 +1038 +1054 +1092 +1311 +5010 +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+62FB +ENCODING 25339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1022 +11FF +7C40 +1040 +1090 +1510 +1A92 +7054 +1010 +1028 +1044 +5082 +2301 +0000 +0000 +ENDCHAR +STARTCHAR U+62FC +ENCODING 25340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1118 +10A0 +13FC +FD10 +1110 +1510 +1914 +37FE +D110 +1110 +1110 +1110 +1110 +5210 +2410 +ENDCHAR +STARTCHAR U+62FD +ENCODING 25341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1048 +13FC +FE48 +1248 +17F8 +1A48 +3248 +D3FC +1248 +1050 +1020 +10D2 +570A +2006 +ENDCHAR +STARTCHAR U+62FE +ENCODING 25342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7CA0 +1110 +13F8 +1404 +1C00 +71F0 +1110 +1110 +1110 +11F0 +3110 +0000 +ENDCHAR +STARTCHAR U+62FF +ENCODING 25343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0FE0 +701C +0FE0 +0820 +0FE0 +01C0 +0F00 +1FF0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6300 +ENCODING 25344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +1030 +11C0 +7D0C +1110 +1560 +1942 +7152 +1154 +1148 +1144 +1252 +5461 +20C0 +0000 +0000 +ENDCHAR +STARTCHAR U+6301 +ENCODING 25345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7C40 +1040 +17FC +1010 +1010 +1FFC +7110 +1090 +1090 +1010 +3030 +0000 +ENDCHAR +STARTCHAR U+6302 +ENCODING 25346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7C40 +1040 +17FC +1040 +1440 +1BF8 +7040 +1040 +1040 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+6303 +ENCODING 25347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2080 +2084 +F984 +213E +23E2 +2000 +3820 +E020 +23FE +2020 +2020 +2020 +27FF +6000 +ENDCHAR +STARTCHAR U+6304 +ENCODING 25348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1122 +11A6 +10A4 +FCA4 +1020 +1020 +13FF +1C48 +F048 +1048 +1048 +10C8 +1089 +1189 +7307 +ENDCHAR +STARTCHAR U+6307 +ENCODING 25351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1118 +11E0 +7D00 +1104 +10FC +1000 +1DF8 +7108 +11F8 +1108 +1108 +11F8 +3108 +0000 +ENDCHAR +STARTCHAR U+6308 +ENCODING 25352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A00 +0DF8 +3A48 +0C48 +3A48 +0C88 +3930 +00E0 +0F00 +1FF0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6309 +ENCODING 25353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7E08 +1440 +1040 +17FC +1890 +7090 +1190 +1160 +1030 +10C8 +3704 +0000 +ENDCHAR +STARTCHAR U+630A +ENCODING 25354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +103E +1020 +FC20 +11FF +1000 +1000 +1DFF +F020 +1020 +103C +1026 +1020 +1020 +7020 +ENDCHAR +STARTCHAR U+630B +ENCODING 25355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1110 +1110 +FD10 +11FE +1102 +1102 +1D02 +F1FE +1110 +1110 +1110 +1110 +11FF +7000 +ENDCHAR +STARTCHAR U+630C +ENCODING 25356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +11F0 +7D10 +1320 +14A0 +1040 +14A0 +19F8 +7714 +1110 +1110 +11F0 +3110 +0000 +ENDCHAR +STARTCHAR U+630D +ENCODING 25357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +11FF +FC44 +10C6 +1183 +1044 +1C44 +F06C +1038 +1010 +1038 +106C +10C6 +7183 +ENDCHAR +STARTCHAR U+630E +ENCODING 25358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1048 +17FC +F8A0 +1110 +1A0E +35F4 +D000 +17FC +1080 +11F8 +1008 +1008 +5090 +2060 +ENDCHAR +STARTCHAR U+630F +ENCODING 25359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1101 +7D7D +1101 +117D +1545 +1945 +1145 +717D +1145 +1101 +1101 +5105 +2102 +0000 +0000 +ENDCHAR +STARTCHAR U+6310 +ENCODING 25360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087E +FF42 +1142 +2242 +7E42 +0B7E +3000 +C0E0 +0F80 +0100 +3FFC +0100 +FFFF +0100 +0700 +ENDCHAR +STARTCHAR U+6311 +ENCODING 25361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +10A8 +7EA8 +11B0 +11A0 +10B0 +1DA8 +72A4 +14A4 +1120 +1124 +1224 +341C +0000 +ENDCHAR +STARTCHAR U+6313 +ENCODING 25363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +23FF +2201 +FA0D +2038 +21E0 +2020 +3820 +E3FF +2020 +2020 +2020 +2021 +2033 +601E +ENDCHAR +STARTCHAR U+6314 +ENCODING 25364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1022 +13FF +7C20 +1040 +1480 +1982 +72A4 +14A8 +1090 +1088 +10A4 +50C2 +2381 +0000 +0000 +ENDCHAR +STARTCHAR U+6315 +ENCODING 25365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +13FF +1084 +7C84 +10FC +1084 +1484 +18FC +7084 +1084 +13FF +1004 +5004 +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+6316 +ENCODING 25366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1000 +13FE +FA02 +1494 +1108 +1A04 +31F8 +D010 +1060 +1180 +1200 +1202 +5202 +21FE +ENDCHAR +STARTCHAR U+6318 +ENCODING 25368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +20A4 +21A6 +2323 +F824 +206C +2038 +20E0 +3B80 +E020 +23FE +2022 +2062 +2046 +20C4 +639C +ENDCHAR +STARTCHAR U+6319 +ENCODING 25369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0910 +0920 +7FFC +0440 +0860 +1F98 +6104 +1FF0 +0100 +3FF8 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+631A +ENCODING 25370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +7EFC +0848 +0EC8 +F868 +488A +1936 +3FC0 +0100 +1FF0 +0104 +FFFE +0100 +0100 +0300 +ENDCHAR +STARTCHAR U+631B +ENCODING 25371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0440 +1450 +344C +4474 +3F80 +0100 +1FF0 +0104 +FFFE +0100 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+631D +ENCODING 25373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1008 +1408 +1208 +F8FE +1008 +1608 +1A48 +3228 +D228 +1208 +1208 +1228 +1516 +58FC +2000 +ENDCHAR +STARTCHAR U+631E +ENCODING 25374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1210 +1110 +1114 +FCFE +1010 +1710 +1910 +3128 +D128 +1146 +1184 +1100 +1286 +547C +2000 +ENDCHAR +STARTCHAR U+631F +ENCODING 25375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7840 +1248 +1148 +1150 +1FFC +7040 +10A0 +1090 +1110 +1208 +3404 +0000 +ENDCHAR +STARTCHAR U+6320 +ENCODING 25376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1088 +10FC +1780 +FC48 +1032 +10D2 +1F0E +3008 +D7FC +1120 +1120 +1122 +1122 +521E +2C00 +ENDCHAR +STARTCHAR U+6321 +ENCODING 25377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1244 +114C +FD50 +1044 +17FE +1804 +3004 +D004 +13FC +1004 +1004 +1004 +57FC +2004 +ENDCHAR +STARTCHAR U+6322 +ENCODING 25378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +103C +17C0 +1040 +FC84 +17FE +10A0 +1510 +1A08 +3516 +D914 +1110 +1110 +1210 +5210 +2410 +ENDCHAR +STARTCHAR U+6323 +ENCODING 25379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11F8 +1210 +FC20 +13F8 +1448 +1848 +37FE +D048 +1048 +13F8 +1048 +1040 +5140 +2080 +ENDCHAR +STARTCHAR U+6324 +ENCODING 25380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1048 +17FC +1008 +FD10 +10A0 +1440 +19B0 +360E +D114 +1110 +1110 +1110 +1110 +5210 +2410 +ENDCHAR +STARTCHAR U+6325 +ENCODING 25381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FE +1244 +1448 +FBFC +1080 +1120 +1A28 +33FC +D020 +1024 +17FE +1020 +1020 +5020 +2020 +ENDCHAR +STARTCHAR U+6327 +ENCODING 25383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1088 +7D98 +1198 +12A8 +14C8 +1598 +1998 +72A8 +14C8 +1088 +1088 +3198 +0000 +ENDCHAR +STARTCHAR U+6328 +ENCODING 25384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10A0 +1090 +7938 +17C8 +1100 +11F8 +1A40 +7440 +17FC +1040 +10A0 +1310 +3C0C +0000 +ENDCHAR +STARTCHAR U+6329 +ENCODING 25385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +1186 +1084 +11FE +FD02 +1102 +1102 +1102 +1DFE +F048 +1048 +1048 +10C8 +1089 +1189 +7307 +ENDCHAR +STARTCHAR U+632A +ENCODING 25386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17DE +1252 +1254 +FA54 +17D4 +1258 +1A58 +3254 +D7D2 +1252 +1252 +145A +1954 +5090 +2010 +ENDCHAR +STARTCHAR U+632B +ENCODING 25387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1150 +7D50 +1150 +1158 +12E4 +1C44 +7040 +13F8 +1040 +1040 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+632C +ENCODING 25388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +7C10 +11FF +1101 +157D +1808 +7010 +11FF +1010 +1010 +5010 +2060 +0000 +0000 +ENDCHAR +STARTCHAR U+632D +ENCODING 25389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1020 +11FE +FD22 +1122 +11FE +1122 +1D22 +F1FE +1020 +11A0 +10E0 +1070 +10DC +7387 +ENDCHAR +STARTCHAR U+632F +ENCODING 25391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1200 +7E00 +12F8 +1200 +13FC +1EC8 +72C8 +12B0 +14A0 +1490 +18C8 +3304 +0000 +ENDCHAR +STARTCHAR U+6332 +ENCODING 25394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +0950 +414C +2654 +0860 +70C0 +2300 +0CF0 +7F00 +0110 +3FF8 +0100 +FFFE +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+6333 +ENCODING 25395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +11FF +1049 +7C92 +1124 +1092 +1449 +1800 +71FF +1010 +1010 +1010 +5010 +23FF +0000 +0000 +ENDCHAR +STARTCHAR U+6334 +ENCODING 25396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11FF +7A00 +11FE +1122 +1912 +33FF +5122 +1112 +1102 +11FE +5002 +201C +0000 +0000 +ENDCHAR +STARTCHAR U+6335 +ENCODING 25397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2020 +21FC +F820 +2020 +27FF +2000 +3888 +E088 +27FF +2088 +2188 +2108 +2308 +6608 +ENDCHAR +STARTCHAR U+6336 +ENCODING 25398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +1102 +FDFE +1100 +1100 +11FF +1D01 +F179 +1149 +1149 +1349 +127B +1602 +700E +ENDCHAR +STARTCHAR U+6338 +ENCODING 25400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +7DFE +1102 +11FE +1502 +19FE +3048 +5048 +1048 +1049 +5089 +270F +0000 +0000 +ENDCHAR +STARTCHAR U+6339 +ENCODING 25401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1108 +FDF8 +1004 +13FE +1644 +1A44 +3244 +D3FC +1204 +1200 +1202 +5202 +21FE +ENDCHAR +STARTCHAR U+633A +ENCODING 25402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1718 +11E0 +7A20 +1220 +1720 +11FC +1D20 +7520 +1220 +12F8 +1500 +18C0 +303C +0000 +ENDCHAR +STARTCHAR U+633B +ENCODING 25403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1003 +13CC +10B8 +7C88 +1108 +1128 +13AF +14A8 +1CA8 +70A8 +10A8 +14A8 +13FF +1180 +127F +3400 +ENDCHAR +STARTCHAR U+633C +ENCODING 25404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +1021 +FD33 +1196 +10A4 +1020 +1DFF +F044 +10C4 +108C +11E8 +103C +1066 +71C3 +ENDCHAR +STARTCHAR U+633D +ENCODING 25405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F0 +1120 +7E40 +17F8 +1248 +1248 +1FF8 +7268 +10A0 +10A0 +1124 +1224 +341C +0000 +ENDCHAR +STARTCHAR U+633E +ENCODING 25406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +1150 +1150 +1158 +16E4 +1A44 +7060 +10A0 +1090 +1108 +3604 +0000 +ENDCHAR +STARTCHAR U+633F +ENCODING 25407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +13C0 +7C40 +17FC +1040 +13F8 +1E48 +73F8 +1248 +13F8 +1248 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+6340 +ENCODING 25408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +11FE +1288 +7850 +1020 +10D8 +1727 +1820 +73FE +1020 +13FE +1020 +57FF +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6341 +ENCODING 25409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2120 +2120 +23FE +FA20 +2420 +2020 +27FF +3800 +E000 +21FC +2104 +2104 +2104 +2104 +61FC +ENDCHAR +STARTCHAR U+6342 +ENCODING 25410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1080 +1088 +FDFC +1088 +1508 +1908 +37FE +D008 +11FC +1108 +1108 +1108 +51F8 +2108 +ENDCHAR +STARTCHAR U+6343 +ENCODING 25411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +1108 +1108 +FFFE +1108 +1108 +17F8 +1900 +3208 +D3FC +1508 +1508 +1908 +51F8 +2108 +ENDCHAR +STARTCHAR U+6344 +ENCODING 25412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2024 +2026 +2022 +27FF +F820 +2222 +2326 +212C +3820 +E030 +20B8 +21AC +2326 +2623 +2020 +60E0 +ENDCHAR +STARTCHAR U+6345 +ENCODING 25413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27F8 +2010 +20A0 +F844 +27FE +2444 +2C44 +37FC +E444 +2444 +27FC +2444 +2444 +A454 +4448 +ENDCHAR +STARTCHAR U+6346 +ENCODING 25414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +1444 +1444 +FC44 +17FC +1444 +1CC4 +34E4 +D55C +164C +1444 +1444 +1404 +57FC +2404 +ENDCHAR +STARTCHAR U+6347 +ENCODING 25415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FE +7820 +1020 +17FF +1088 +1888 +728A +128A +1489 +1088 +50A8 +2110 +0000 +0000 +ENDCHAR +STARTCHAR U+6348 +ENCODING 25416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +7C82 +117D +1010 +1410 +19FF +7038 +1054 +1092 +1111 +5050 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6349 +ENCODING 25417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7E08 +1208 +13F8 +1040 +1640 +1A78 +7240 +1240 +1340 +14C0 +383C +0000 +ENDCHAR +STARTCHAR U+634A +ENCODING 25418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200C +2038 +27E2 +2246 +FB6C +2128 +23FE +2004 +3818 +E020 +27FF +2020 +2020 +2020 +2020 +60E0 +ENDCHAR +STARTCHAR U+634B +ENCODING 25419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +107C +1780 +1248 +FD48 +1150 +1020 +1408 +1BFE +3008 +D108 +1088 +1088 +1008 +5028 +2010 +ENDCHAR +STARTCHAR U+634C +ENCODING 25420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +17A8 +14A8 +7CA8 +14A8 +17A8 +1228 +1A28 +73A8 +12A8 +14A8 +1488 +1888 +3318 +0000 +ENDCHAR +STARTCHAR U+634D +ENCODING 25421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7FF8 +1208 +13F8 +1000 +17F8 +1840 +7040 +17FC +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+634E +ENCODING 25422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +10A4 +10A8 +FC24 +11FE +1504 +1904 +11FC +3104 +D104 +11FC +1104 +1104 +5114 +2108 +ENDCHAR +STARTCHAR U+634F +ENCODING 25423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7FF8 +1208 +13F8 +1208 +1040 +1840 +73F8 +1040 +1040 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+6350 +ENCODING 25424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7E08 +13F8 +1000 +13F8 +1608 +1BF8 +7208 +13F8 +1208 +1208 +3218 +0000 +ENDCHAR +STARTCHAR U+6351 +ENCODING 25425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +10FE +7C82 +10FE +1020 +1440 +18F0 +7010 +11FF +1028 +1044 +5082 +2101 +0000 +0000 +ENDCHAR +STARTCHAR U+6352 +ENCODING 25426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +1020 +FC20 +11FE +1122 +1122 +1D22 +F1FE +10A8 +10A8 +11AC +1326 +1623 +7020 +ENDCHAR +STARTCHAR U+6353 +ENCODING 25427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23EF +2249 +2249 +FA49 +224A +2FEA +214A +3949 +E149 +2349 +2249 +2649 +2C4B +2048 +61C8 +ENDCHAR +STARTCHAR U+6354 +ENCODING 25428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20FE +2184 +2708 +F9FF +2111 +2111 +21FF +3911 +E111 +21FF +2101 +2101 +2301 +2201 +6607 +ENDCHAR +STARTCHAR U+6355 +ENCODING 25429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1048 +17FC +7C40 +13F8 +1248 +1248 +1FF8 +7248 +1248 +13F8 +1248 +1248 +3258 +0000 +ENDCHAR +STARTCHAR U+6356 +ENCODING 25430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +7D01 +1101 +10FE +1400 +19FF +7028 +1028 +1028 +1048 +1089 +310F +0000 +0000 +ENDCHAR +STARTCHAR U+6357 +ENCODING 25431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1140 +1178 +7D40 +1140 +17FC +1150 +1D48 +7254 +14D4 +1020 +1040 +1180 +3E00 +0000 +ENDCHAR +STARTCHAR U+6358 +ENCODING 25432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2184 +2104 +23FE +F892 +2190 +231F +2680 +38FC +E184 +230C +26D8 +2070 +20D8 +218C +6707 +ENDCHAR +STARTCHAR U+6359 +ENCODING 25433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +7CFE +1092 +10FE +1492 +18FE +7092 +1010 +11FF +1010 +5010 +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+635A +ENCODING 25434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +08FF +0892 +7EFE +0892 +0A92 +0CFE +1810 +6810 +08FE +0810 +0810 +2812 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+635B +ENCODING 25435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1104 +1104 +FD04 +1104 +11FC +1020 +1C60 +F040 +13FE +1202 +1202 +1202 +1202 +73FE +ENDCHAR +STARTCHAR U+635C +ENCODING 25436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7E48 +13F8 +1248 +13F8 +1040 +1FF8 +7110 +10A0 +1040 +11B0 +360C +0000 +ENDCHAR +STARTCHAR U+635E +ENCODING 25438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +17FC +1110 +F800 +17FE +1482 +1884 +33F8 +D088 +1088 +1088 +1088 +1108 +5128 +2E10 +ENDCHAR +STARTCHAR U+635F +ENCODING 25439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +1104 +FDFC +1000 +15FC +1904 +3124 +D124 +1124 +1124 +1124 +1050 +508C +2304 +ENDCHAR +STARTCHAR U+6361 +ENCODING 25441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +FD10 +120E +15F4 +1800 +3040 +D248 +114C +1148 +1150 +1004 +57FE +2000 +ENDCHAR +STARTCHAR U+6362 +ENCODING 25442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11F0 +1220 +FC48 +13FC +1248 +1E48 +3248 +D248 +1FFE +1040 +10A0 +1110 +520E +2C04 +ENDCHAR +STARTCHAR U+6363 +ENCODING 25443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1088 +11FC +1108 +FD48 +1108 +1528 +1910 +3100 +D1FE +1082 +1492 +1492 +17F2 +500A +2004 +ENDCHAR +STARTCHAR U+6365 +ENCODING 25445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FE +2202 +FA02 +2100 +21DE +2152 +3B52 +E252 +27D2 +2096 +2190 +2111 +2313 +660E +ENDCHAR +STARTCHAR U+6366 +ENCODING 25446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +2050 +20D8 +F98C +2306 +26FB +2020 +3820 +E3FE +2020 +2222 +2326 +2124 +27FF +6000 +ENDCHAR +STARTCHAR U+6367 +ENCODING 25447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7C40 +11F0 +10A0 +1FFC +1150 +33F8 +5444 +13F8 +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+6368 +ENCODING 25448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7D50 +164C +11F0 +1040 +1FFC +7000 +11F0 +1110 +1110 +11F0 +3110 +0000 +ENDCHAR +STARTCHAR U+6369 +ENCODING 25449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1000 +7FF8 +1208 +13F8 +1248 +1E40 +73FC +1240 +1440 +14A0 +1B10 +3C0C +0000 +ENDCHAR +STARTCHAR U+636B +ENCODING 25451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +7FB8 +12A8 +13B8 +1208 +1608 +1A08 +7208 +1208 +1208 +1208 +3218 +0000 +ENDCHAR +STARTCHAR U+636C +ENCODING 25452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2200 +FA44 +2244 +22FF +2284 +3BA4 +E2B4 +2294 +2284 +2284 +2284 +2484 +609C +ENDCHAR +STARTCHAR U+636D +ENCODING 25453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1084 +13FE +1244 +FE44 +13FC +1244 +1644 +1BFC +30A0 +D124 +1FFE +1020 +1020 +5020 +2020 +ENDCHAR +STARTCHAR U+636E +ENCODING 25454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7FF8 +1248 +1240 +13FC +1E40 +7240 +15F8 +1508 +1908 +11F8 +3108 +0000 +ENDCHAR +STARTCHAR U+636F +ENCODING 25455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +17F1 +1085 +7905 +1225 +17F5 +1095 +1885 +7085 +13E5 +1081 +1081 +5085 +27F2 +0000 +0000 +ENDCHAR +STARTCHAR U+6370 +ENCODING 25456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1222 +13FE +7A22 +1222 +13FE +1020 +17FF +1820 +70A8 +1124 +1222 +1421 +3020 +0000 +0000 +ENDCHAR +STARTCHAR U+6371 +ENCODING 25457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1220 +1228 +FFFC +1220 +1224 +17FE +1A20 +3228 +D3FC +1220 +1420 +1424 +5BFE +2000 +ENDCHAR +STARTCHAR U+6372 +ENCODING 25458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1150 +7FF8 +10A0 +17FC +1110 +13E8 +1C24 +71E0 +1120 +1108 +1108 +30F8 +0000 +ENDCHAR +STARTCHAR U+6374 +ENCODING 25460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +10C6 +11A3 +FC20 +1064 +1044 +107E +1DC3 +F010 +1018 +1048 +1142 +1143 +1365 +723C +ENDCHAR +STARTCHAR U+6375 +ENCODING 25461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +2090 +2090 +23FE +FA92 +2292 +2292 +23FE +3A92 +E292 +2292 +27FF +2000 +2104 +2306 +6603 +ENDCHAR +STARTCHAR U+6376 +ENCODING 25462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E0 +1040 +7FF8 +1150 +1150 +17FC +1150 +1950 +73F8 +1040 +1040 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+6377 +ENCODING 25463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +7FF8 +1048 +17FC +1048 +1BF8 +7040 +1178 +1140 +1340 +14C0 +383C +0000 +ENDCHAR +STARTCHAR U+6378 +ENCODING 25464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +21FE +2022 +FBFF +2022 +21FE +2020 +3B23 +E1B6 +2038 +20EC +23A6 +2623 +2020 +60E0 +ENDCHAR +STARTCHAR U+637A +ENCODING 25466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7C40 +10A0 +1110 +13F8 +1C04 +77F8 +1140 +1150 +1248 +1448 +30C0 +0000 +ENDCHAR +STARTCHAR U+637B +ENCODING 25467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7D10 +13F8 +1404 +13F8 +1C10 +70A0 +1150 +1548 +1514 +1914 +30F0 +0000 +ENDCHAR +STARTCHAR U+637C +ENCODING 25468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200C +2038 +21E0 +2020 +FBFF +20A8 +21AC +2327 +3840 +E040 +27FF +2084 +2108 +23F0 +205C +6786 +ENDCHAR +STARTCHAR U+637D +ENCODING 25469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FE +2000 +F888 +2088 +21DC +2356 +3800 +E020 +27FF +2020 +2020 +2020 +2020 +6020 +ENDCHAR +STARTCHAR U+637F +ENCODING 25471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +7C20 +11FC +1024 +13FF +1024 +1DFC +7040 +17FF +1108 +1290 +1060 +11D8 +3607 +ENDCHAR +STARTCHAR U+6380 +ENCODING 25472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10C0 +1140 +1640 +7C40 +147C +17A4 +15A8 +1520 +1D20 +7530 +1550 +1950 +1988 +3104 +0000 +ENDCHAR +STARTCHAR U+6381 +ENCODING 25473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1100 +11FE +7D00 +11FE +1100 +1500 +1BFF +7140 +1122 +1114 +1128 +5144 +2383 +0000 +0000 +ENDCHAR +STARTCHAR U+6382 +ENCODING 25474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1004 +13FE +FE20 +1224 +163E +1A20 +3224 +D2FE +1284 +1284 +1484 +1484 +58FC +2084 +ENDCHAR +STARTCHAR U+6383 +ENCODING 25475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1010 +7DF0 +1010 +11F0 +1000 +1FFC +7448 +13F8 +1248 +1248 +1270 +3040 +0000 +ENDCHAR +STARTCHAR U+6384 +ENCODING 25476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +20D8 +218C +FB07 +20F8 +2000 +23FE +3A92 +E292 +23FE +2292 +2292 +2292 +2292 +6296 +ENDCHAR +STARTCHAR U+6385 +ENCODING 25477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +09FF +7E10 +08FE +0810 +0DFF +0800 +18FE +2882 +48FE +0882 +08FE +2882 +1106 +0000 +0000 +ENDCHAR +STARTCHAR U+6387 +ENCODING 25479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2FFC +24A4 +2528 +FA10 +2528 +28C4 +2000 +3FBC +E084 +28C4 +2528 +2210 +2528 +A8CE +5084 +ENDCHAR +STARTCHAR U+6388 +ENCODING 25480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E8 +1248 +7D50 +1120 +13FC +1208 +15F0 +1C90 +70A0 +1060 +1060 +1190 +360C +0000 +ENDCHAR +STARTCHAR U+6389 +ENCODING 25481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +107C +7C40 +13F8 +1208 +13F8 +1608 +1BF8 +7040 +17FC +1040 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+638A +ENCODING 25482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +1048 +17FC +FC00 +1110 +10A4 +17FE +1800 +3008 +D3FC +1208 +1208 +1208 +53F8 +2208 +ENDCHAR +STARTCHAR U+638C +ENCODING 25484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0920 +3FFC +2008 +4FE0 +0820 +0FF0 +1FC0 +0100 +1FF0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+638D +ENCODING 25485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1202 +13FE +7A02 +1202 +13FE +1400 +1C10 +7410 +17DF +1410 +1451 +5451 +27DF +0000 +0000 +ENDCHAR +STARTCHAR U+638E +ENCODING 25486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7CA0 +1090 +1110 +13FC +1408 +19E8 +7128 +1128 +11E8 +1108 +3018 +0000 +ENDCHAR +STARTCHAR U+638F +ENCODING 25487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +11F8 +7E08 +1508 +11E8 +1288 +17E8 +1888 +72A8 +12A8 +13E8 +1208 +3030 +0000 +ENDCHAR +STARTCHAR U+6390 +ENCODING 25488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11FC +1208 +FC10 +10A4 +171E +1A04 +3204 +D204 +13BC +1204 +1204 +1204 +53FC +2204 +ENDCHAR +STARTCHAR U+6391 +ENCODING 25489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1104 +17FF +7904 +11FC +1104 +11FC +1904 +7104 +17FF +1000 +1104 +5202 +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+6392 +ENCODING 25490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +10A0 +7FBC +10A0 +10A0 +17BC +18A0 +70A0 +17BC +10A0 +1120 +1220 +3420 +0000 +ENDCHAR +STARTCHAR U+6394 +ENCODING 25492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F7E +4822 +7E24 +4214 +7E18 +486C +7F07 +00E0 +0F80 +0100 +3FFC +0100 +FFFF +0100 +0700 +ENDCHAR +STARTCHAR U+6395 +ENCODING 25493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +21FE +2020 +FBFF +2088 +2188 +234F +3840 +E0FC +2184 +230C +20D8 +2070 +21DC +6707 +ENDCHAR +STARTCHAR U+6396 +ENCODING 25494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7D20 +1120 +1138 +1248 +1668 +1A98 +7250 +1230 +1230 +12C8 +3304 +0000 +ENDCHAR +STARTCHAR U+6397 +ENCODING 25495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +13FF +1048 +7848 +1048 +13CF +1201 +1A01 +7201 +13CF +1048 +1048 +5048 +23FF +0000 +0000 +ENDCHAR +STARTCHAR U+6398 +ENCODING 25496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1204 +7FFC +1224 +12A8 +12A8 +1EF8 +72A8 +1324 +1524 +1524 +19FC +3104 +0000 +ENDCHAR +STARTCHAR U+6399 +ENCODING 25497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +203C +23E2 +2126 +F894 +23FE +2022 +2022 +37FF +E022 +2022 +23FE +2020 +2020 +2020 +60E0 +ENDCHAR +STARTCHAR U+639A +ENCODING 25498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2020 +2020 +FBFE +2222 +2222 +23BA +3AAA +E2AA +22AA +2376 +2222 +2222 +2222 +6226 +ENDCHAR +STARTCHAR U+639B +ENCODING 25499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +17D0 +7910 +1110 +17F8 +1914 +1114 +37F0 +5110 +1110 +11D0 +1E10 +3010 +0000 +ENDCHAR +STARTCHAR U+639C +ENCODING 25500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +110E +1202 +7A02 +13DE +1202 +1602 +1BFE +7090 +1090 +1090 +1111 +5211 +241F +0000 +0000 +ENDCHAR +STARTCHAR U+639D +ENCODING 25501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +1009 +17FF +7808 +1008 +13E8 +1228 +1A28 +73E9 +122A +100C +17ED +5013 +2001 +0000 +0000 +ENDCHAR +STARTCHAR U+639E +ENCODING 25502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2122 +2126 +2374 +FA50 +20D8 +218C +2307 +3820 +E122 +2126 +2374 +2250 +20D8 +218C +6707 +ENDCHAR +STARTCHAR U+639F +ENCODING 25503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7E08 +1400 +17FC +1040 +1640 +1A78 +7240 +1240 +1340 +14C0 +383C +0000 +ENDCHAR +STARTCHAR U+63A0 +ENCODING 25504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7C00 +13F8 +1208 +1208 +1FF8 +7040 +1150 +1148 +1244 +1444 +30C0 +0000 +ENDCHAR +STARTCHAR U+63A1 +ENCODING 25505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E8 +1248 +7D50 +1120 +1040 +1040 +1FFC +70E0 +10E0 +1150 +1248 +1444 +3040 +0000 +ENDCHAR +STARTCHAR U+63A2 +ENCODING 25506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +12A8 +7CA0 +1124 +125C +1040 +1FFC +70E0 +1150 +1248 +1444 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+63A3 +ENCODING 25507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2808 +3E48 +4848 +7F48 +0848 +3E48 +2A08 +2ED8 +0700 +1FF0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+63A4 +ENCODING 25508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23CF +2249 +2249 +2249 +FB4D +22CB +2249 +2249 +3B4D +E2CB +2249 +2249 +2249 +2649 +2449 +6CD3 +ENDCHAR +STARTCHAR U+63A5 +ENCODING 25509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7D10 +10A0 +17FC +1040 +17FC +1890 +7090 +11E0 +1030 +10C8 +3708 +0000 +ENDCHAR +STARTCHAR U+63A6 +ENCODING 25510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1104 +1104 +FDFC +1104 +1104 +11FC +1C40 +F0FF +1195 +1725 +1049 +1193 +1022 +70CE +ENDCHAR +STARTCHAR U+63A7 +ENCODING 25511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7EA8 +14A0 +10A4 +111C +1600 +1BF8 +7040 +1040 +1040 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+63A8 +ENCODING 25512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +1120 +7DFC +1320 +1520 +11F8 +1520 +1920 +71F8 +1120 +1120 +11FC +3100 +0000 +ENDCHAR +STARTCHAR U+63A9 +ENCODING 25513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7CA0 +1150 +1248 +1FFC +1248 +33F8 +5248 +13F8 +1248 +1044 +303C +0000 +ENDCHAR +STARTCHAR U+63AA +ENCODING 25514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +17F8 +7D20 +1120 +17FC +1000 +1FF0 +7210 +13F0 +1210 +1210 +13F0 +3210 +0000 +ENDCHAR +STARTCHAR U+63AB +ENCODING 25515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1280 +7E80 +13F8 +12C8 +12C8 +17A8 +1AB0 +7290 +13B0 +16C8 +1088 +3084 +0000 +ENDCHAR +STARTCHAR U+63AC +ENCODING 25516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1100 +7FF8 +1288 +14A8 +12A8 +1AC8 +77F8 +11C8 +11A8 +1298 +1488 +30B0 +0000 +ENDCHAR +STARTCHAR U+63AD +ENCODING 25517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1040 +1040 +FC84 +17FE +10A0 +1510 +1A4E +3444 +D968 +1154 +1254 +1444 +5140 +2080 +ENDCHAR +STARTCHAR U+63AE +ENCODING 25518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +1204 +FE04 +13FC +1200 +16FC +1A84 +32FC +D284 +12FC +1484 +1484 +5894 +2088 +ENDCHAR +STARTCHAR U+63AF +ENCODING 25519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +209E +2090 +2090 +FBFF +2000 +21FE +2102 +3902 +E1FE +2102 +2102 +21FE +2102 +2102 +610E +ENDCHAR +STARTCHAR U+63B0 +ENCODING 25520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C86 +F2B8 +1288 +1448 +783E +1788 +1288 +1E88 +F2FE +1288 +1488 +2488 +2988 +4028 +0010 +ENDCHAR +STARTCHAR U+63B1 +ENCODING 25521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07F0 +0080 +0FF8 +0080 +3FFE +0080 +0180 +3E3E +0808 +3E3E +0808 +7F7F +0808 +1818 +0000 +0000 +ENDCHAR +STARTCHAR U+63B2 +ENCODING 25522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7DF8 +1108 +11F8 +1080 +1DFC +7334 +15C4 +1104 +1114 +10F4 +3018 +0000 +ENDCHAR +STARTCHAR U+63B3 +ENCODING 25523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +107C +1040 +13FE +FE44 +1270 +17C4 +1A7C +3200 +D244 +13FE +1244 +1244 +1484 +5494 +2908 +ENDCHAR +STARTCHAR U+63B4 +ENCODING 25524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7FF8 +1248 +1248 +13F8 +1E48 +7268 +1258 +13F8 +1208 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+63B5 +ENCODING 25525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7D10 +13F8 +1404 +13B8 +16A8 +1AA8 +72A8 +13A8 +1230 +1020 +3020 +0000 +ENDCHAR +STARTCHAR U+63B7 +ENCODING 25527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2880 +257C +2044 +2FC4 +F248 +2248 +2250 +2A48 +3FC4 +E242 +2242 +2562 +24D4 +2848 +B040 +4040 +ENDCHAR +STARTCHAR U+63B8 +ENCODING 25528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +1050 +11FC +FD24 +1124 +15FC +1924 +3124 +D1FC +1020 +17FE +1020 +1020 +5020 +2020 +ENDCHAR +STARTCHAR U+63BA +ENCODING 25530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10A0 +1110 +13F8 +F880 +17FE +10A0 +1910 +3248 +D48E +1924 +1240 +1090 +1120 +5040 +2380 +ENDCHAR +STARTCHAR U+63BB +ENCODING 25531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1090 +7C60 +10F0 +174C +1040 +1FF8 +7248 +13F8 +1248 +1050 +1078 +3784 +0000 +ENDCHAR +STARTCHAR U+63BC +ENCODING 25532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1248 +17FE +FA48 +1248 +13F8 +1000 +1BF8 +3208 +D248 +1248 +1248 +10B0 +5108 +2604 +ENDCHAR +STARTCHAR U+63BD +ENCODING 25533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +20CC +2048 +2000 +FBFF +2048 +2048 +2249 +3A49 +E249 +2249 +23CF +2048 +2048 +2048 +63FF +ENDCHAR +STARTCHAR U+63BE +ENCODING 25534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F0 +1090 +7DE0 +1020 +17FC +1040 +14E8 +1B68 +70B0 +1370 +10A8 +1324 +30C0 +0000 +ENDCHAR +STARTCHAR U+63C0 +ENCODING 25536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7C40 +13F8 +1358 +12D8 +16E8 +1BF8 +70E0 +1150 +1248 +1444 +3040 +0000 +ENDCHAR +STARTCHAR U+63C1 +ENCODING 25537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +103F +1020 +FDFE +1102 +1102 +11FE +1D02 +F102 +11FE +1102 +1102 +11FE +1084 +7303 +ENDCHAR +STARTCHAR U+63C2 +ENCODING 25538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1048 +11FE +7C48 +1048 +11FE +154A +194A +314A +518E +1102 +117A +5102 +21FE +0000 +0000 +ENDCHAR +STARTCHAR U+63C3 +ENCODING 25539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +1110 +1120 +7FFC +1000 +17A8 +14A8 +17A8 +1CA8 +77A8 +14A8 +1488 +1488 +3598 +0000 +ENDCHAR +STARTCHAR U+63C4 +ENCODING 25540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11C0 +1040 +10A0 +7D10 +13F8 +1404 +17A8 +14A8 +1EA8 +75D0 +16D0 +15A8 +14A8 +35A8 +0000 +ENDCHAR +STARTCHAR U+63C5 +ENCODING 25541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFF +1024 +1024 +3EFF +6224 +A264 +3EC4 +0030 +0FE0 +0080 +3FFC +0080 +FFFF +0080 +0380 +ENDCHAR +STARTCHAR U+63C6 +ENCODING 25542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11D0 +1054 +12A4 +7DA8 +1110 +1208 +11F4 +1440 +1840 +73F8 +10A0 +1090 +1108 +3608 +0000 +ENDCHAR +STARTCHAR U+63C7 +ENCODING 25543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +7C10 +11FF +1101 +1545 +1929 +317D +5111 +117D +1111 +5111 +2102 +0000 +0000 +ENDCHAR +STARTCHAR U+63C8 +ENCODING 25544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2100 +23FF +2601 +F9F1 +2001 +27FD +2001 +39F1 +E001 +21F1 +2001 +23F9 +220B +23FA +6006 +ENDCHAR +STARTCHAR U+63C9 +ENCODING 25545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +10A0 +7C40 +17FC +10C8 +1350 +14C0 +1840 +77FC +10E0 +1150 +164C +3040 +0000 +ENDCHAR +STARTCHAR U+63CA +ENCODING 25546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1000 +10FE +7C82 +1082 +10FE +1400 +19FF +7111 +11FF +1111 +1111 +51FF +2101 +0000 +0000 +ENDCHAR +STARTCHAR U+63CB +ENCODING 25547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1092 +10FE +7C92 +10FE +1082 +1400 +19FF +3080 +5089 +108A +10AC +50C4 +2183 +0000 +0000 +ENDCHAR +STARTCHAR U+63CC +ENCODING 25548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1124 +1124 +7DFC +1124 +1124 +15FC +1904 +3020 +5292 +1289 +1281 +5482 +20FE +0000 +0000 +ENDCHAR +STARTCHAR U+63CD +ENCODING 25549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +17FC +1040 +FBF8 +1080 +17FE +1910 +320E +DDF4 +1040 +17FC +1040 +10B0 +510C +2604 +ENDCHAR +STARTCHAR U+63CE +ENCODING 25550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1440 +17FE +1402 +FC08 +13FC +1000 +13F8 +1A08 +33F8 +D208 +13F8 +1208 +1004 +57FE +2000 +ENDCHAR +STARTCHAR U+63CF +ENCODING 25551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +17FC +7D10 +1110 +1000 +1BF8 +1248 +3248 +53F8 +1248 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+63D0 +ENCODING 25552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1110 +11F0 +1000 +1FFC +7040 +1278 +1240 +1340 +14C0 +383C +0000 +ENDCHAR +STARTCHAR U+63D1 +ENCODING 25553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20C0 +239E +2202 +2202 +FB9E +2202 +2202 +23FE +3800 +E020 +23FE +2020 +2020 +2020 +27FF +6000 +ENDCHAR +STARTCHAR U+63D2 +ENCODING 25554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +13C0 +7C40 +1040 +17FC +1140 +1258 +1A48 +7358 +1248 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+63D3 +ENCODING 25555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +2220 +2220 +2FFF +F440 +24C8 +272B +252D +3539 +E569 +25AB +2528 +2D28 +2921 +2933 +7B1E +ENDCHAR +STARTCHAR U+63D4 +ENCODING 25556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2100 +23FE +FA52 +2592 +20E2 +2132 +2256 +3884 +E01C +2060 +2130 +2506 +250B +2D19 +68F0 +ENDCHAR +STARTCHAR U+63D5 +ENCODING 25557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +2084 +23FF +2084 +F8FC +2084 +20FC +2084 +3884 +E7FF +2248 +2248 +228F +2300 +2200 +63FF +ENDCHAR +STARTCHAR U+63D6 +ENCODING 25558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1000 +17FC +1110 +1DF0 +7110 +11F0 +111C +11F0 +1710 +3010 +0000 +ENDCHAR +STARTCHAR U+63D7 +ENCODING 25559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +11F8 +1100 +7D08 +117F +1108 +157F +1941 +717F +1141 +127F +1441 +5041 +207F +0000 +0000 +ENDCHAR +STARTCHAR U+63D8 +ENCODING 25560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1080 +7DFE +1102 +11FE +1102 +15FE +1800 +71FE +1010 +11FE +1010 +5010 +23FF +0000 +0000 +ENDCHAR +STARTCHAR U+63D9 +ENCODING 25561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1100 +11FF +7D01 +11FF +1100 +157F +1955 +7155 +117F +1155 +1255 +5455 +2043 +0000 +0000 +ENDCHAR +STARTCHAR U+63DA +ENCODING 25562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1110 +11F0 +1000 +1FFC +7100 +13F8 +14A8 +1128 +1248 +30B0 +0000 +ENDCHAR +STARTCHAR U+63DB +ENCODING 25563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F0 +1120 +7FF8 +12A8 +12A8 +1338 +1A58 +7040 +17FC +1040 +10A0 +1110 +360C +0000 +ENDCHAR +STARTCHAR U+63DC +ENCODING 25564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +20D8 +218C +FB06 +26FB +2000 +21FC +3904 +E1FC +2000 +2088 +27FF +2088 +2188 +6308 +ENDCHAR +STARTCHAR U+63DD +ENCODING 25565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +11E4 +1124 +1224 +794A +1091 +1140 +123F +1800 +71FE +1102 +11FE +5102 +21FE +0000 +0000 +ENDCHAR +STARTCHAR U+63DE +ENCODING 25566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1048 +17FC +1000 +FD10 +10A4 +1FFE +1408 +1BFC +3208 +D208 +13F8 +1208 +1208 +53F8 +2208 +ENDCHAR +STARTCHAR U+63DF +ENCODING 25567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1011 +109C +7CD0 +113F +1000 +14FE +1882 +70FE +1082 +10FE +1082 +5082 +3106 +0000 +0000 +ENDCHAR +STARTCHAR U+63E0 +ENCODING 25568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +1400 +15F8 +FD08 +15F8 +1508 +15F8 +1C40 +37FE +D488 +1590 +1460 +1498 +57FE +2000 +ENDCHAR +STARTCHAR U+63E1 +ENCODING 25569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7FF8 +1200 +13F8 +1260 +1A90 +73E8 +1440 +17F8 +1840 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+63E3 +ENCODING 25571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1248 +7E48 +13F8 +1000 +17FC +1040 +1BF8 +72A8 +12A8 +12A8 +12A8 +3218 +0000 +ENDCHAR +STARTCHAR U+63E4 +ENCODING 25572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13EF +1229 +7A29 +13E9 +1229 +1229 +1BED +720A +1288 +12C8 +5328 +2608 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+63E5 +ENCODING 25573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +2104 +F98C +2088 +27FF +2421 +2421 +3BFE +E222 +2222 +2222 +2226 +2020 +6020 +ENDCHAR +STARTCHAR U+63E7 +ENCODING 25575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +3F82 +0412 +3F92 +2492 +3F92 +1502 +24A6 +0FC0 +1FF8 +0080 +7FFE +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+63E8 +ENCODING 25576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1000 +7CFE +1082 +10FE +1400 +19FF +3101 +50FE +1008 +1008 +5028 +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+63E9 +ENCODING 25577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1124 +11F8 +7D20 +1120 +11E4 +165C +1080 +19F8 +7108 +11F8 +1108 +11F8 +3108 +0000 +ENDCHAR +STARTCHAR U+63EA +ENCODING 25578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10D0 +1710 +1112 +F954 +17B8 +1110 +1B10 +3390 +D550 +1910 +1110 +1128 +1146 +5184 +2100 +ENDCHAR +STARTCHAR U+63EB +ENCODING 25579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7E49 +082A +7F1C +1C14 +2A22 +0845 +1FF8 +0080 +1FFC +0080 +7FFF +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+63EC +ENCODING 25580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2249 +FA49 +20C8 +218F +2300 +3828 +E024 +27FF +2050 +20D8 +218C +2306 +6E03 +ENDCHAR +STARTCHAR U+63ED +ENCODING 25581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1208 +13F8 +FE08 +13F8 +1480 +1904 +33FE +D444 +1C44 +14A4 +1514 +17E4 +5028 +2010 +ENDCHAR +STARTCHAR U+63EE +ENCODING 25582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1248 +7FF8 +1040 +13F8 +1248 +1FF8 +7248 +13F8 +1040 +17FC +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+63EF +ENCODING 25583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +12FF +1220 +7A20 +123E +1722 +16A2 +1632 +1A2A +7226 +1222 +127E +1202 +5202 +22FF +0000 +0000 +ENDCHAR +STARTCHAR U+63F0 +ENCODING 25584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1010 +7DFF +1010 +10FE +1092 +14FE +1892 +70FE +1010 +10FE +1010 +5010 +21FF +0000 +0000 +ENDCHAR +STARTCHAR U+63F1 +ENCODING 25585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2482 +1502 +3F92 +2092 +3E92 +3E92 +4082 +0196 +0FE0 +1FF0 +0080 +3FF8 +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+63F2 +ENCODING 25586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1290 +1294 +17FE +FA90 +1290 +12F0 +1600 +1BFC +3040 +D7FE +10E0 +1150 +124E +5444 +2040 +ENDCHAR +STARTCHAR U+63F3 +ENCODING 25587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +21DE +270A +210A +F9CA +270A +211A +21D2 +3736 +E100 +2040 +27FF +2090 +2198 +230C +6E07 +ENDCHAR +STARTCHAR U+63F4 +ENCODING 25588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +13C8 +7E48 +1110 +13F8 +1080 +1FFC +7100 +11F8 +1290 +1460 +18F0 +330C +0000 +ENDCHAR +STARTCHAR U+63F5 +ENCODING 25589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2F7E +2112 +2212 +F4FF +2712 +2112 +217E +3510 +E57E +2710 +22FF +2210 +2210 +2500 +6CFF +ENDCHAR +STARTCHAR U+63F6 +ENCODING 25590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +12A8 +7EA8 +13B0 +12B0 +12A8 +17A8 +1AA4 +72A4 +13A4 +16B8 +10A0 +30A0 +0000 +ENDCHAR +STARTCHAR U+63F7 +ENCODING 25591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101E +10F0 +1010 +7C10 +11FF +1030 +10D6 +1492 +1892 +70FE +1092 +1092 +1092 +10FE +1092 +3010 +ENDCHAR +STARTCHAR U+63F8 +ENCODING 25592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +17FC +1040 +FCE0 +1150 +124E +1444 +1BF8 +3208 +D3F8 +1208 +13F8 +1000 +5FFE +2000 +ENDCHAR +STARTCHAR U+63F9 +ENCODING 25593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +2793 +209E +F890 +2391 +2C99 +208F +2000 +3BFE +E202 +23FE +2202 +23FE +2202 +2202 +620E +ENDCHAR +STARTCHAR U+63FA +ENCODING 25594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1038 +13C8 +1248 +7D50 +1120 +1040 +13F8 +1840 +77FC +1040 +1248 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+63FD +ENCODING 25597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1294 +129E +12A8 +FEC4 +1284 +1488 +1BFC +3208 +D248 +1248 +1268 +12A8 +10A2 +5122 +261E +ENDCHAR +STARTCHAR U+63FF +ENCODING 25599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2420 +2420 +27A4 +F43E +2844 +37A8 +2220 +3220 +2FA0 +E220 +2250 +2350 +2288 +A08E +4104 +ENDCHAR +STARTCHAR U+6400 +ENCODING 25600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1080 +11F0 +1220 +FFF8 +1248 +1648 +1BF8 +30A0 +D122 +121E +1CC0 +1030 +1180 +5060 +2010 +ENDCHAR +STARTCHAR U+6401 +ENCODING 25601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1404 +12FE +1044 +FCF4 +1514 +16A4 +1C44 +34A4 +D71C +15F4 +1514 +1514 +15F4 +5514 +2408 +ENDCHAR +STARTCHAR U+6402 +ENCODING 25602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +1150 +1044 +FFFE +1150 +124C +1C44 +3080 +D7FE +1108 +1208 +11B0 +1040 +51B0 +2608 +ENDCHAR +STARTCHAR U+6405 +ENCODING 25605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1244 +1124 +1128 +17FE +FC02 +1404 +13F8 +1A08 +3248 +D248 +1248 +1248 +1248 +10A2 +5122 +261E +ENDCHAR +STARTCHAR U+6406 +ENCODING 25606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +17FC +10A0 +7FF8 +10A0 +17FC +1040 +17F8 +1A48 +77FC +1248 +17FC +1208 +3218 +0000 +ENDCHAR +STARTCHAR U+6409 +ENCODING 25609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +2241 +FAC5 +2088 +21FE +2310 +3510 +E1FE +2110 +2110 +21FE +2110 +2110 +61FF +ENDCHAR +STARTCHAR U+640A +ENCODING 25610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +21FE +2322 +26AA +F8AA +20FA +2046 +208C +3900 +E1FE +2322 +26AA +20AA +20FA +2046 +608C +ENDCHAR +STARTCHAR U+640B +ENCODING 25611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +107C +17A0 +143C +FC20 +15FE +1522 +15F8 +1D24 +353C +D500 +1578 +1548 +164A +588A +2306 +ENDCHAR +STARTCHAR U+640C +ENCODING 25612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1204 +1204 +FFFC +1294 +1290 +17FC +1A90 +3294 +D3FE +1540 +1528 +1510 +598E +2104 +ENDCHAR +STARTCHAR U+640D +ENCODING 25613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1000 +13F8 +1208 +1FF8 +7208 +13F8 +1208 +13F8 +1198 +3604 +0000 +ENDCHAR +STARTCHAR U+640E +ENCODING 25614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17C1 +107F +1048 +7C88 +1112 +153E +1984 +1109 +337F +5508 +112A +112A +5549 +2218 +0000 +0000 +ENDCHAR +STARTCHAR U+640F +ENCODING 25615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +17FC +1040 +7FF8 +1248 +13F8 +1248 +17F8 +1A48 +7010 +17FC +1110 +1090 +3030 +0000 +ENDCHAR +STARTCHAR U+6410 +ENCODING 25616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1044 +1FFE +1080 +FD10 +13F0 +1040 +1888 +33F8 +D004 +17FE +1444 +17FC +1444 +57FC +2404 +ENDCHAR +STARTCHAR U+6412 +ENCODING 25618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +2104 +F888 +23FE +2202 +2242 +3840 +E7FF +2080 +20FC +2084 +2184 +2304 +661C +ENDCHAR +STARTCHAR U+6413 +ENCODING 25619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +10A0 +13F8 +7C40 +11F0 +1040 +17FC +1100 +19F8 +7240 +1440 +1840 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+6414 +ENCODING 25620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FC +1048 +1110 +FCE0 +1110 +164E +1848 +33FC +D248 +1248 +13F8 +1240 +1048 +57FC +2004 +ENDCHAR +STARTCHAR U+6415 +ENCODING 25621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +1020 +7C20 +17FF +1040 +1081 +17FF +1801 +33FE +5252 +1252 +1252 +37FF +0000 +0000 +ENDCHAR +STARTCHAR U+6416 +ENCODING 25622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F0 +1190 +7E60 +1140 +1180 +17F8 +1240 +1FFC +3040 +5248 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+6417 +ENCODING 25623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +11F8 +7D08 +11F8 +1108 +11F8 +1500 +19FC +7100 +11FC +12A4 +13E4 +3218 +0000 +ENDCHAR +STARTCHAR U+6418 +ENCODING 25624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2041 +23FB +2046 +2048 +27FF +F860 +218E +26F8 +2081 +387F +E000 +21FE +2102 +21FE +2102 +61FE +ENDCHAR +STARTCHAR U+641A +ENCODING 25626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +08FC +0824 +0848 +7C84 +09EF +0CA5 +094A +18FE +2882 +48FA +08FA +2882 +110E +0000 +0000 +ENDCHAR +STARTCHAR U+641B +ENCODING 25627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1110 +10A4 +17FE +F8A0 +10A4 +17FE +10A4 +1FFE +30A4 +D7FC +11B0 +12A8 +14A6 +58A4 +20A0 +ENDCHAR +STARTCHAR U+641C +ENCODING 25628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1140 +1258 +1248 +7F58 +1248 +1248 +13F8 +1040 +1FF8 +7110 +10A0 +1040 +11B0 +360C +0000 +ENDCHAR +STARTCHAR U+641E +ENCODING 25630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1044 +1FFE +1000 +FBF8 +1208 +1208 +1BF8 +3004 +D7FE +1404 +15F4 +1514 +15F4 +5404 +240C +ENDCHAR +STARTCHAR U+641F +ENCODING 25631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +109F +13E4 +7C84 +13E4 +12A4 +13FF +16A4 +1BE4 +7084 +13E4 +1084 +5084 +2084 +0000 +0000 +ENDCHAR +STARTCHAR U+6420 +ENCODING 25632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +28BE +2524 +2024 +FFE4 +223C +2AA4 +2AA4 +2AA4 +3ABC +EFA4 +22A4 +2244 +2444 +A894 +5108 +ENDCHAR +STARTCHAR U+6421 +ENCODING 25633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13F8 +1110 +10E0 +FB18 +1000 +17BC +14A4 +1B18 +34A4 +D040 +1FFE +1150 +1248 +5446 +2040 +ENDCHAR +STARTCHAR U+6422 +ENCODING 25634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1088 +7C88 +1132 +17FF +1021 +1400 +1BFF +7000 +11FE +1102 +11FE +1102 +11FE +3102 +ENDCHAR +STARTCHAR U+6423 +ENCODING 25635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +100A +1009 +7BFF +1208 +13F8 +1A68 +1248 +335A +52EC +1248 +1255 +14A3 +3111 +0000 +0000 +ENDCHAR +STARTCHAR U+6424 +ENCODING 25636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +218C +2088 +23FE +F888 +218C +2104 +2306 +3603 +E000 +23FE +2252 +2252 +2252 +2252 +67FF +ENDCHAR +STARTCHAR U+6425 +ENCODING 25637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2610 +237E +2142 +F842 +2042 +207E +2740 +3940 +E17E +2142 +2142 +2142 +237E +2680 +6C7F +ENDCHAR +STARTCHAR U+6426 +ENCODING 25638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1088 +7C88 +13B8 +1220 +1220 +17B8 +1998 +72A8 +15D8 +12A8 +14C8 +3330 +0000 +ENDCHAR +STARTCHAR U+6427 +ENCODING 25639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17F8 +1200 +13FE +7A02 +13FE +1200 +13EF +1A21 +32A5 +5263 +12A5 +5421 +20C6 +0000 +0000 +ENDCHAR +STARTCHAR U+6428 +ENCODING 25640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +1210 +7FF0 +1210 +13F0 +1000 +17F8 +1998 +72A8 +15D8 +12A8 +14C8 +3198 +0000 +ENDCHAR +STARTCHAR U+6429 +ENCODING 25641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2204 +23C4 +227F +2754 +F5D4 +2094 +21BF +2304 +3604 +E020 +27FF +20A8 +21AC +2326 +2623 +6020 +ENDCHAR +STARTCHAR U+642A +ENCODING 25642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +1220 +FFFC +1224 +17FE +1A24 +33FC +D220 +13FC +1504 +1504 +1504 +59FC +2104 +ENDCHAR +STARTCHAR U+642B +ENCODING 25643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103C +3E24 +2A25 +2647 +7FBE +3222 +2A1C +466B +0FF0 +1FFC +0080 +3FFE +0080 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+642C +ENCODING 25644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1238 +17A8 +7CA8 +16AC +15AC +15C4 +1FF8 +74A8 +16A8 +1690 +1AB0 +18C8 +3184 +0000 +ENDCHAR +STARTCHAR U+642D +ENCODING 25645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +17FC +7D10 +1150 +10A0 +1B18 +15F4 +3000 +53F8 +1208 +1208 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+642E +ENCODING 25646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FF +0828 +0828 +7DFF +0929 +0929 +0DFF +0810 +19FF +2838 +4854 +0892 +0911 +1810 +0000 +0000 +ENDCHAR +STARTCHAR U+642F +ENCODING 25647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +203C +23E0 +2043 +FA66 +232C +2108 +20C0 +3B9E +E202 +2202 +23DE +2202 +2202 +2202 +63FE +ENDCHAR +STARTCHAR U+6430 +ENCODING 25648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +2104 +213C +F924 +2124 +27FF +2401 +39FC +E104 +21FC +2104 +21FC +2104 +2104 +610C +ENDCHAR +STARTCHAR U+6433 +ENCODING 25651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1421 +79FC +1020 +11FC +1020 +17FF +1800 +71FC +1104 +1104 +51FC +2104 +0000 +0000 +ENDCHAR +STARTCHAR U+6434 +ENCODING 25652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2288 +5FF0 +0FE0 +0280 +3FF8 +08E0 +1710 +6FEC +0100 +3FF8 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6435 +ENCODING 25653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +2104 +2104 +F9FC +2104 +2104 +21FC +3800 +E3FE +2252 +2252 +2252 +2252 +27FF +6000 +ENDCHAR +STARTCHAR U+6436 +ENCODING 25654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7DF0 +1208 +15F4 +1110 +15F0 +1910 +71F0 +1100 +13F8 +1508 +31F8 +0000 +ENDCHAR +STARTCHAR U+6437 +ENCODING 25655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +1020 +7DFC +1104 +11FC +1104 +19FC +3104 +51FC +1104 +17FF +5104 +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+6439 +ENCODING 25657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FF +0800 +087C +0844 +7C44 +087C +0C00 +09FF +1945 +2929 +497D +0911 +0911 +1907 +0000 +0000 +ENDCHAR +STARTCHAR U+643A +ENCODING 25658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +11FC +1320 +7FF8 +1520 +11F8 +1120 +15FC +1FE0 +7120 +113C +1104 +1204 +3418 +0000 +ENDCHAR +STARTCHAR U+643D +ENCODING 25661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +17FC +1110 +FC40 +10A0 +1510 +1A4E +3444 +D3F8 +1040 +1250 +124C +1444 +5140 +2080 +ENDCHAR +STARTCHAR U+643E +ENCODING 25662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7EA8 +14A8 +1118 +1300 +19FC +7240 +1478 +1040 +1078 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+643F +ENCODING 25663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0D06 +F138 +1288 +1448 +783E +17C8 +1008 +17C8 +FC7E +1448 +1448 +2448 +27C8 +2028 +4010 +ENDCHAR +STARTCHAR U+6440 +ENCODING 25664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +11FE +1302 +7D02 +11FE +1100 +15FF +1900 +11FF +7001 +12A9 +12A9 +5001 +200E +0000 +0000 +ENDCHAR +STARTCHAR U+6441 +ENCODING 25665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1248 +1248 +FFF8 +1248 +12A8 +1718 +1A08 +33F8 +D000 +1140 +1544 +1512 +5912 +20F0 +ENDCHAR +STARTCHAR U+6442 +ENCODING 25666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1090 +7CF0 +1090 +10F0 +109C +1FF0 +7118 +10B0 +1000 +10A0 +1318 +3C04 +0000 +ENDCHAR +STARTCHAR U+6443 +ENCODING 25667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1010 +1010 +7DFF +1000 +10FE +1082 +14FE +1882 +70FE +1082 +10FE +5044 +2082 +0000 +0000 +ENDCHAR +STARTCHAR U+6444 +ENCODING 25668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1108 +11F8 +FD08 +11F8 +1508 +1BFE +3008 +D7BC +14A4 +12A8 +1110 +12A8 +5446 +2804 +ENDCHAR +STARTCHAR U+6445 +ENCODING 25669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +107C +1040 +13FC +FE44 +1248 +13F8 +1640 +1A44 +323C +D200 +14A0 +1A94 +1282 +548A +2078 +ENDCHAR +STARTCHAR U+6446 +ENCODING 25670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +14A4 +14A4 +FFFC +1444 +1050 +1BF8 +3040 +D044 +1FFE +1080 +1110 +1208 +57FC +2004 +ENDCHAR +STARTCHAR U+6447 +ENCODING 25671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +103C +17C0 +1248 +FD48 +1150 +1600 +1BFC +3440 +D044 +1FFE +1040 +1248 +1248 +53F8 +2208 +ENDCHAR +STARTCHAR U+6448 +ENCODING 25672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +17FE +1402 +FC34 +11C0 +1510 +19F8 +3110 +D110 +1114 +1FFE +1000 +1190 +510C +2204 +ENDCHAR +STARTCHAR U+644A +ENCODING 25674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2050 +2044 +2EFE +F390 +2A90 +2AFC +3A90 +6A90 +A4FC +2A90 +2990 +3194 +20FE +A080 +4080 +ENDCHAR +STARTCHAR U+644B +ENCODING 25675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +244E +228A +210A +FA8A +2453 +2100 +215F +3909 +E7EB +210A +238E +2344 +254E +291A +6133 +ENDCHAR +STARTCHAR U+644D +ENCODING 25677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +1401 +7880 +117F +1308 +1510 +197F +7141 +1141 +117F +1141 +5141 +217F +0000 +0000 +ENDCHAR +STARTCHAR U+644E +ENCODING 25678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1198 +7AA8 +15D8 +12A8 +14C8 +1120 +1E50 +71AC +1048 +1190 +1060 +3380 +0000 +ENDCHAR +STARTCHAR U+644F +ENCODING 25679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +27FE +2040 +FBFC +20A0 +2FFF +2108 +330C +EEC7 +239C +2204 +239C +2204 +2204 +63FC +ENDCHAR +STARTCHAR U+6450 +ENCODING 25680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1222 +1222 +7C66 +1199 +1100 +1210 +1610 +1A50 +725F +1250 +1250 +1270 +1250 +328F +0000 +0000 +ENDCHAR +STARTCHAR U+6451 +ENCODING 25681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2FFE +282A +2826 +FFFE +2822 +2BA2 +2AA6 +3BAA +E812 +2BB2 +2E56 +288A +2802 +2FFE +6000 +ENDCHAR +STARTCHAR U+6452 +ENCODING 25682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27FE +2404 +2404 +FFFC +2508 +2490 +27FC +2C90 +3494 +E7FE +2490 +2890 +2890 +B110 +4210 +ENDCHAR +STARTCHAR U+6453 +ENCODING 25683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +243E +2642 +22A4 +F818 +2024 +20C3 +2610 +3A7E +E210 +227E +2210 +22FF +2610 +2500 +68FF +ENDCHAR +STARTCHAR U+6454 +ENCODING 25684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +1020 +FC48 +12F2 +1524 +1A52 +30F8 +D020 +17FE +1020 +1020 +1020 +5020 +2020 +ENDCHAR +STARTCHAR U+6458 +ENCODING 25688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7D10 +10A0 +13F8 +1248 +1FF8 +7248 +12E8 +12A8 +12E8 +1208 +3218 +0000 +ENDCHAR +STARTCHAR U+6459 +ENCODING 25689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1408 +127F +1008 +7F7F +1149 +127F +1449 +127F +1908 +717F +1108 +1108 +1280 +347F +0000 +0000 +ENDCHAR +STARTCHAR U+645A +ENCODING 25690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +2326 +2124 +23FE +FA02 +22FA +2088 +2088 +38F8 +E020 +2020 +21FC +2020 +2020 +27FF +6000 +ENDCHAR +STARTCHAR U+645B +ENCODING 25691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +1000 +FD4A +1132 +114A +1102 +1DFE +F020 +13FF +1241 +1249 +12F5 +1201 +7203 +ENDCHAR +STARTCHAR U+645C +ENCODING 25692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2222 +27FF +FA22 +23FE +2000 +23FE +3A02 +E3FE +2202 +23FE +2202 +23FE +2104 +6603 +ENDCHAR +STARTCHAR U+645D +ENCODING 25693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +2490 +FC90 +27FE +2492 +2492 +37FE +E400 +2510 +25D6 +251C +2510 +29D1 +630F +ENDCHAR +STARTCHAR U+645E +ENCODING 25694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +1444 +17FC +FC44 +17FC +1484 +1110 +1BE0 +3040 +D088 +17FC +1150 +124C +5444 +20C0 +ENDCHAR +STARTCHAR U+645F +ENCODING 25695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FE +2222 +27FF +FA22 +23FE +2020 +23FE +3A22 +E3FE +2020 +27FF +2084 +21C8 +207C +67C7 +ENDCHAR +STARTCHAR U+6460 +ENCODING 25696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +11FE +7D42 +117A +11CA +1132 +152A +1946 +71FE +1020 +1292 +1291 +1485 +14FC +3000 +ENDCHAR +STARTCHAR U+6461 +ENCODING 25697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +233E +2214 +2794 +FC94 +2794 +2494 +27BF +3804 +E404 +24CC +278C +2414 +2655 +23D5 +6023 +ENDCHAR +STARTCHAR U+6463 +ENCODING 25699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +203E +2020 +23FF +FA21 +2238 +22E2 +223E +3A00 +E2FC +2284 +22FC +2684 +24FC +2C84 +63FF +ENDCHAR +STARTCHAR U+6465 +ENCODING 25701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10FE +1100 +7CFC +1084 +10FC +1484 +18FC +73FF +1100 +11FF +1249 +5049 +2093 +0000 +0000 +ENDCHAR +STARTCHAR U+6466 +ENCODING 25702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1104 +17C8 +7D32 +12A2 +146A +1BAA +102A +77EA +122A +13AA +10AA +50AD +235E +0000 +0000 +ENDCHAR +STARTCHAR U+6467 +ENCODING 25703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1248 +7FF8 +1298 +10A0 +11FC +1520 +1BF8 +7520 +11F8 +1120 +11FC +3100 +0000 +ENDCHAR +STARTCHAR U+6468 +ENCODING 25704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1201 +13FF +7E10 +13D7 +1210 +13D7 +1A50 +72FE +1310 +15FF +1010 +3010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6469 +ENCODING 25705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1210 +1FFC +1738 +1AD4 +1230 +17C0 +1080 +17F8 +2080 +3FFC +4080 +0180 +0000 +ENDCHAR +STARTCHAR U+646B +ENCODING 25707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +113E +1122 +17E2 +7D3E +1122 +1122 +153E +1FE2 +7122 +113E +1114 +1295 +5455 +2067 +0000 +0000 +ENDCHAR +STARTCHAR U+646C +ENCODING 25708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +7C44 +11FF +1000 +10FE +1482 +18FE +7082 +10FE +1028 +1048 +5089 +230F +0000 +0000 +ENDCHAR +STARTCHAR U+646D +ENCODING 25709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +1288 +FE88 +1288 +13FE +1688 +1A88 +32F8 +D488 +1400 +1554 +1552 +5A52 +2000 +ENDCHAR +STARTCHAR U+646E +ENCODING 25710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3F +3E44 +08A8 +7F10 +1E28 +1247 +6604 +3FF8 +3FFE +0080 +7FFF +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+646F +ENCODING 25711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +08F0 +7F50 +14D4 +7FB4 +3F0C +0860 +0780 +1FF0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6470 +ENCODING 25712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +3E10 +087C +7F14 +2A34 +7F15 +082D +7E07 +0FF0 +1FFC +0080 +7FFF +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+6472 +ENCODING 25714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2101 +27DE +2110 +77D0 +255F +27D2 +2552 +37D2 +6112 +27D2 +2112 +2122 +2102 +6102 +0000 +0000 +ENDCHAR +STARTCHAR U+6473 +ENCODING 25715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2200 +227C +FA44 +2244 +227C +2200 +3AEE +E2AA +22AA +22AA +22EE +2200 +23FF +6000 +ENDCHAR +STARTCHAR U+6474 +ENCODING 25716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2020 +27FF +FC21 +25AD +2421 +21AC +3800 +E3FE +2000 +27FF +2080 +21FE +2002 +600E +ENDCHAR +STARTCHAR U+6475 +ENCODING 25717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1009 +13FF +7E08 +1248 +1278 +1248 +1648 +1BF8 +7249 +12EA +135C +1248 +5255 +24C3 +0000 +0000 +ENDCHAR +STARTCHAR U+6476 +ENCODING 25718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +7FF8 +1248 +13F8 +1248 +17F8 +1850 +73F8 +1010 +17FC +1110 +30B0 +0000 +ENDCHAR +STARTCHAR U+6477 +ENCODING 25719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +1124 +1092 +7C00 +10FE +1092 +10FE +1492 +18FE +7010 +11FF +1054 +5092 +2111 +0000 +0000 +ENDCHAR +STARTCHAR U+6478 +ENCODING 25720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +17FC +7CA0 +11F0 +1110 +19F0 +1110 +31F0 +5040 +17FC +10A0 +1110 +360C +0000 +ENDCHAR +STARTCHAR U+6479 +ENCODING 25721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +FFFE +0820 +3FF8 +2108 +3FF8 +0200 +FFFE +0440 +1FF0 +2108 +DFF6 +0100 +3FF8 +0100 +0300 +ENDCHAR +STARTCHAR U+647A +ENCODING 25722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +14C8 +7EA8 +13B8 +14C8 +1198 +1C80 +73F0 +1210 +13F0 +1210 +13F0 +3210 +0000 +ENDCHAR +STARTCHAR U+647B +ENCODING 25723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2088 +20F8 +2104 +FA49 +23CF +2020 +2050 +398C +E727 +2040 +2190 +2066 +218C +2038 +63E0 +ENDCHAR +STARTCHAR U+647D +ENCODING 25725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2048 +23FF +FA49 +2249 +23FF +2000 +39FE +E000 +23FF +2020 +2124 +2326 +2623 +60E0 +ENDCHAR +STARTCHAR U+647F +ENCODING 25727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1050 +1088 +7D24 +12FA +1451 +1050 +1BFE +1000 +31FC +5104 +11FC +1104 +31FC +0000 +0000 +ENDCHAR +STARTCHAR U+6482 +ENCODING 25730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1248 +13F8 +FE48 +13F8 +1480 +19F8 +3310 +D0E0 +1318 +1FFE +1208 +1208 +53F8 +2208 +ENDCHAR +STARTCHAR U+6483 +ENCODING 25731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7F70 +3E54 +2A8C +3FF8 +3E50 +7F30 +08CC +0F00 +1FF0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6484 +ENCODING 25732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17BC +14A4 +15AC +FDAC +1634 +1318 +14A4 +1880 +37FE +D110 +1210 +1120 +10E0 +5198 +2604 +ENDCHAR +STARTCHAR U+6485 +ENCODING 25733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +2FFE +2808 +2A28 +F94E +2FF2 +38A0 +6AA8 +AAA8 +2AA8 +2BE8 +2A94 +2894 +3124 +A122 +4240 +ENDCHAR +STARTCHAR U+6487 +ENCODING 25735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2210 +2A90 +2724 +F23E +2FC4 +2AA4 +2AA4 +3AA8 +EFA8 +2E90 +2A90 +2AA8 +29A8 +A846 +4084 +ENDCHAR +STARTCHAR U+6488 +ENCODING 25736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1554 +13B4 +7918 +12A8 +1444 +13FC +1248 +1C40 +73F8 +1088 +1088 +1108 +3230 +0000 +ENDCHAR +STARTCHAR U+6489 +ENCODING 25737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F20 +3E3F +2242 +3E14 +3E08 +0414 +7F22 +0841 +1FF8 +0FF8 +3FFE +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+648A +ENCODING 25738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17DF +1451 +17DF +7C51 +17DF +1401 +15FD +1D05 +15FD +7505 +15FD +1505 +560D +2403 +0000 +0000 +ENDCHAR +STARTCHAR U+648B +ENCODING 25739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17DF +1451 +17DF +7C51 +17DF +1401 +15FD +3421 +5421 +15FD +1421 +1421 +35FD +1402 +0000 +0000 +ENDCHAR +STARTCHAR U+648C +ENCODING 25740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +08FE +0892 +08FE +7C10 +09FF +0CFE +0882 +18FE +2882 +48FE +0882 +08FE +1901 +0000 +0000 +ENDCHAR +STARTCHAR U+648F +ENCODING 25743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FC +2004 +23FC +2004 +FBFC +2000 +27DE +2112 +39D2 +E71E +2004 +27FF +2104 +2184 +2084 +601C +ENDCHAR +STARTCHAR U+6490 +ENCODING 25744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +2326 +2124 +27FF +FC01 +25FD +2104 +21FC +3800 +E1FE +2108 +27FF +2028 +20C8 +2708 +6038 +ENDCHAR +STARTCHAR U+6491 +ENCODING 25745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1150 +17FE +1402 +F9F4 +1110 +11F0 +1818 +37E0 +D040 +13F8 +1040 +17FC +1040 +5140 +2080 +ENDCHAR +STARTCHAR U+6492 +ENCODING 25746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +12A0 +12A0 +17E0 +7ABC +12A8 +1FC8 +1028 +1FA8 +74B0 +1790 +1490 +17A8 +14C8 +3584 +0000 +ENDCHAR +STARTCHAR U+6493 +ENCODING 25747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1040 +7FFC +1110 +17FC +1110 +11FC +1E00 +73F8 +10A0 +10A0 +1124 +361C +0000 +ENDCHAR +STARTCHAR U+6495 +ENCODING 25749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1284 +1288 +12B0 +7FE0 +12A0 +13BC +12A8 +17A8 +1AA8 +77E8 +1328 +12C8 +1448 +3888 +0000 +ENDCHAR +STARTCHAR U+6496 +ENCODING 25750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2010 +2790 +2124 +FA3E +2FC4 +24A4 +27A8 +2CA8 +37A8 +E490 +24D0 +3FA8 +20A8 +A0C6 +4084 +ENDCHAR +STARTCHAR U+6497 +ENCODING 25751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +1088 +7CF8 +1000 +17FF +1000 +13FE +1A22 +73FE +1222 +13FE +5104 +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+6498 +ENCODING 25752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2210 +27DF +2528 +F884 +2020 +2070 +20D8 +398C +E777 +2000 +21FC +2104 +2104 +2104 +61FC +ENDCHAR +STARTCHAR U+6499 +ENCODING 25753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1110 +17FC +10A8 +FBFC +12A8 +1318 +12E8 +1A08 +33F8 +D014 +1FFE +1210 +1110 +5050 +2020 +ENDCHAR +STARTCHAR U+649A +ENCODING 25754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1230 +1228 +13A8 +7AA0 +16FC +15A0 +1D30 +1350 +1A48 +7484 +1800 +1548 +14A4 +38A4 +0000 +ENDCHAR +STARTCHAR U+649B +ENCODING 25755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +2124 +2020 +27FF +F8A8 +21AC +2727 +2120 +39C4 +E37F +2654 +21D4 +20BF +2184 +2304 +6604 +ENDCHAR +STARTCHAR U+649C +ENCODING 25756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17D2 +1054 +1459 +7C8A +1304 +13FE +1000 +15FC +1904 +71FC +1000 +1104 +5088 +23FE +0000 +0000 +ENDCHAR +STARTCHAR U+649D +ENCODING 25757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2018 +21F2 +2246 +2124 +FBFC +2204 +2204 +23FE +3A02 +E202 +23FF +2601 +2415 +2D55 +2343 +620E +ENDCHAR +STARTCHAR U+649E +ENCODING 25758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1110 +7FFC +13F8 +1248 +13F8 +1648 +1BF8 +7040 +13F8 +1040 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+649F +ENCODING 25759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +201C +23F0 +2040 +27FF +F888 +21FC +268B +20F8 +3800 +E3FE +2202 +22FA +228A +22FA +2202 +6206 +ENDCHAR +STARTCHAR U+64A0 +ENCODING 25760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1089 +13E9 +7C9F +13E8 +1228 +13E8 +1228 +1BE9 +708A +13EC +1088 +1095 +3083 +0000 +0000 +ENDCHAR +STARTCHAR U+64A1 +ENCODING 25761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2088 +20F8 +2104 +FA49 +23CF +2020 +2050 +398C +E707 +2040 +2146 +2353 +2659 +2048 +60C0 +ENDCHAR +STARTCHAR U+64A2 +ENCODING 25762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FC +2090 +FFFE +2492 +27FE +2BFC +3204 +23FC +6204 +A3FC +2020 +27FE +A020 +4020 +0000 +0000 +ENDCHAR +STARTCHAR U+64A3 +ENCODING 25763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2252 +23DE +F800 +21FC +2124 +2124 +39FC +E124 +2124 +21FC +2020 +27FF +2020 +6020 +ENDCHAR +STARTCHAR U+64A4 +ENCODING 25764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +17E0 +7B20 +12FC +1FC8 +1048 +1FA8 +74A8 +17B0 +1490 +17B0 +14C8 +3584 +0000 +ENDCHAR +STARTCHAR U+64A5 +ENCODING 25765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11D0 +1254 +11A4 +7D18 +1208 +1774 +1150 +1754 +1C8C +77F8 +1548 +1130 +1128 +36C4 +0000 +ENDCHAR +STARTCHAR U+64A6 +ENCODING 25766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +F888 +2747 +2050 +23FC +3860 +E7FF +2088 +21FC +2704 +21FC +2104 +2104 +61FC +ENDCHAR +STARTCHAR U+64A8 +ENCODING 25768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2090 +21FF +2110 +FB10 +25FE +2110 +2110 +39FE +E110 +2110 +21FF +2000 +2152 +235B +6249 +ENDCHAR +STARTCHAR U+64A9 +ENCODING 25769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7CA4 +1318 +17F8 +1114 +15F0 +1910 +71F0 +1150 +1248 +1448 +30C0 +0000 +ENDCHAR +STARTCHAR U+64AB +ENCODING 25771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1100 +7FFC +16A8 +12A8 +17FC +1AA8 +72A8 +17FC +1000 +1548 +14A4 +38A4 +0000 +ENDCHAR +STARTCHAR U+64AC +ENCODING 25772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13F8 +1040 +11F0 +1040 +FFF8 +1042 +147E +1800 +37BC +D110 +17BC +1110 +1FBE +1110 +5152 +218E +ENDCHAR +STARTCHAR U+64AD +ENCODING 25773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +13E8 +1248 +7D50 +17FC +10E0 +1150 +1A48 +77FC +1248 +13F8 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+64AE +ENCODING 25774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1110 +11F0 +1FFC +1C80 +77F8 +17C8 +14A8 +1790 +1CE8 +3084 +0000 +ENDCHAR +STARTCHAR U+64B0 +ENCODING 25776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1088 +7FF8 +1440 +14C8 +13B8 +1920 +77F8 +1120 +1FFC +1110 +1608 +3808 +0000 +ENDCHAR +STARTCHAR U+64B1 +ENCODING 25777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13D0 +127F +1250 +12BF +7B44 +129F +1240 +125F +1251 +325F +5351 +129F +5211 +2223 +0000 +0000 +ENDCHAR +STARTCHAR U+64B2 +ENCODING 25778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +12A8 +11B0 +7FFC +1110 +10A0 +13F8 +1C40 +71F0 +1040 +17FC +10A0 +1310 +3C0C +0000 +ENDCHAR +STARTCHAR U+64B3 +ENCODING 25779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2390 +22D0 +265F +F831 +27CA +2108 +2108 +37C8 +E108 +255C +2554 +2514 +21D6 +2F12 +6023 +ENDCHAR +STARTCHAR U+64B5 +ENCODING 25781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2110 +27FC +2110 +FFFE +2110 +22AE +3C84 +67F8 +A100 +2240 +27F8 +2040 +3FFE +A040 +4040 +ENDCHAR +STARTCHAR U+64B7 +ENCODING 25783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1204 +127E +1210 +FFA4 +127E +1244 +17D4 +1854 +3754 +D554 +1554 +1554 +1720 +504C +2182 +ENDCHAR +STARTCHAR U+64B8 +ENCODING 25784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +13F0 +1424 +17FE +FC44 +17FC +1444 +17FC +1800 +37FE +D000 +13F8 +1208 +13F8 +5208 +23F8 +ENDCHAR +STARTCHAR U+64B9 +ENCODING 25785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1288 +1150 +13FC +7E08 +15F0 +1110 +11F0 +1D10 +71F0 +1110 +11F0 +10A4 +1124 +361C +0000 +ENDCHAR +STARTCHAR U+64BA +ENCODING 25786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +17FE +1512 +FA48 +1444 +13F8 +1248 +1BF8 +3040 +D7FC +1444 +17FC +1040 +5040 +2040 +ENDCHAR +STARTCHAR U+64BB +ENCODING 25787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +12F8 +1220 +79FC +1488 +1250 +13FC +1020 +1EF8 +7220 +13FC +1220 +1520 +38FC +0000 +ENDCHAR +STARTCHAR U+64BC +ENCODING 25788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1028 +1024 +13FC +7E20 +13E8 +1228 +13D0 +1754 +1BEC +7444 +12A8 +12A4 +1494 +3070 +0000 +ENDCHAR +STARTCHAR U+64BD +ENCODING 25789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2208 +27C8 +FC5F +27D2 +2472 +27D2 +391A +E10A +2FEE +2204 +23C4 +224E +264A +245B +6CD1 +ENDCHAR +STARTCHAR U+64BE +ENCODING 25790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +207C +2444 +2644 +225C +F854 +2054 +2EFE +2282 +3ABA +E2AA +22AA +22BA +2282 +2686 +2500 +6CFF +ENDCHAR +STARTCHAR U+64BF +ENCODING 25791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +20D8 +218C +2707 +F8F8 +2000 +23DE +2252 +3A52 +E3DE +2000 +2104 +2104 +238E +66DB +ENDCHAR +STARTCHAR U+64C0 +ENCODING 25792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2210 +2228 +2FA8 +F244 +2F82 +28FC +2F90 +3890 +EF94 +227E +2F90 +2210 +2210 +A210 +4210 +ENDCHAR +STARTCHAR U+64C1 +ENCODING 25793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7928 +1128 +16FC +12D0 +197C +72D0 +17FC +1150 +1150 +127C +3440 +0000 +ENDCHAR +STARTCHAR U+64C2 +ENCODING 25794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +7FFC +1248 +1758 +1358 +1040 +1BF8 +7248 +13F8 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+64C3 +ENCODING 25795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +13FE +1252 +13FE +7A52 +13FE +13FE +1200 +1AFE +7200 +13FE +1292 +548C +20C6 +0000 +0000 +ENDCHAR +STARTCHAR U+64C4 +ENCODING 25796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103F +1020 +7FFF +122E +13F0 +123F +12FE +1E92 +73FF +1292 +12FE +1210 +12FE +1422 +34CC +ENDCHAR +STARTCHAR U+64C5 +ENCODING 25797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +13F8 +7EE8 +12A8 +12E8 +13F8 +15F0 +1910 +71F0 +1110 +11F0 +17FC +3000 +0000 +ENDCHAR +STARTCHAR U+64C7 +ENCODING 25799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +7FF8 +1040 +13F8 +1040 +17FC +1910 +77FC +1040 +13F8 +1040 +3040 +0000 +ENDCHAR +STARTCHAR U+64C9 +ENCODING 25801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FE +2492 +2492 +F7FE +2100 +23FF +2641 +3FF9 +E249 +2249 +23F9 +2051 +21FB +270A +6006 +ENDCHAR +STARTCHAR U+64CA +ENCODING 25802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7F7C +0844 +7F45 +4947 +7F80 +7F7F +0822 +7F1C +09E7 +1E80 +7FFE +0080 +7FFF +0080 +0180 +ENDCHAR +STARTCHAR U+64CB +ENCODING 25803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +2326 +2124 +27FF +FC01 +25FD +2104 +21FC +3800 +E3FE +2222 +2222 +23FE +2222 +2222 +63FE +ENDCHAR +STARTCHAR U+64CC +ENCODING 25804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2210 +27DF +2524 +F882 +2020 +27FF +2020 +3924 +E124 +22AA +2272 +2050 +20D8 +218C +6707 +ENDCHAR +STARTCHAR U+64CD +ENCODING 25805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1000 +17BC +14A4 +1FBC +7040 +17FC +10E0 +1150 +164C +3040 +0000 +ENDCHAR +STARTCHAR U+64CE +ENCODING 25806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2420 +FF24 +243E +3F44 +41A8 +BD10 +252E +3D44 +0270 +3F80 +0100 +1FF0 +0104 +FFFE +0100 +0300 +ENDCHAR +STARTCHAR U+64CF +ENCODING 25807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1148 +13E8 +1148 +780F +1212 +13E2 +1422 +1BA2 +72B2 +12B2 +13AA +1024 +502A +20D1 +0000 +0000 +ENDCHAR +STARTCHAR U+64D0 +ENCODING 25808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +14A4 +14A4 +FFFC +1000 +17FE +1000 +1BF8 +3208 +D3F8 +1144 +1328 +1510 +598E +2104 +ENDCHAR +STARTCHAR U+64D1 +ENCODING 25809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2014 +2796 +2492 +2490 +F79F +2070 +2FD2 +2492 +3796 +E494 +279C +2488 +279C +2C95 +20B3 +60A1 +ENDCHAR +STARTCHAR U+64D2 +ENCODING 25810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10A0 +1358 +7FFC +12A8 +1268 +1398 +17F8 +1840 +77FC +14A4 +15F4 +1414 +340C +0000 +ENDCHAR +STARTCHAR U+64D4 +ENCODING 25812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10F0 +1320 +7FFC +12A4 +129C +1370 +16F8 +1A70 +7270 +12F8 +1488 +14F8 +3888 +0000 +ENDCHAR +STARTCHAR U+64D5 +ENCODING 25813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2120 +23FF +FA20 +27FE +2A20 +23FE +3A20 +E3FF +2000 +279E +2492 +2492 +24F2 +2402 +640E +ENDCHAR +STARTCHAR U+64D6 +ENCODING 25814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +10FE +7C82 +10FE +1082 +14FE +197F +7311 +1511 +1129 +51FD +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+64D7 +ENCODING 25815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2008 +27C8 +247E +F440 +27D4 +2414 +343E +27C8 +E648 +267E +2A48 +2A48 +33C8 +A248 +4008 +ENDCHAR +STARTCHAR U+64D8 +ENCODING 25816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EF8 +2250 +3FFC +2020 +3EF8 +5220 +1EE0 +0700 +1FF0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+64D9 +ENCODING 25817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +13FE +1202 +7EFA +12AA +1272 +13FE +1672 +1AAA +7222 +17FF +1050 +1088 +3707 +0000 +0000 +ENDCHAR +STARTCHAR U+64DA +ENCODING 25818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1078 +13FC +7E78 +13C8 +1238 +13FC +1668 +1BB8 +7270 +13B8 +1458 +1594 +3860 +0000 +ENDCHAR +STARTCHAR U+64DB +ENCODING 25819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +1094 +7DFF +1094 +109C +1480 +18FF +7010 +11FF +1054 +5092 +2111 +0000 +0000 +ENDCHAR +STARTCHAR U+64DE +ENCODING 25822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2A90 +2710 +2214 +FFBE +2244 +3724 +2AA4 +6228 +BFE8 +2490 +2890 +2528 +2228 +A546 +4884 +ENDCHAR +STARTCHAR U+64E0 +ENCODING 25824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +2FFC +2148 +7EB8 +2AA8 +2AA8 +36B4 +2210 +33F0 +6210 +23F0 +2210 +2410 +6810 +0000 +ENDCHAR +STARTCHAR U+64E1 +ENCODING 25825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +7FF8 +11F0 +1110 +11F0 +17FC +1DF8 +7090 +11F8 +1040 +11F0 +37FC +0000 +ENDCHAR +STARTCHAR U+64E2 +ENCODING 25826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1088 +7FF8 +1088 +17F8 +1120 +1FF8 +7640 +13F0 +13F0 +1240 +13FC +3200 +0000 +ENDCHAR +STARTCHAR U+64E3 +ENCODING 25827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +7DF0 +1000 +17FC +11E8 +1440 +19F0 +77FC +1388 +12FC +13A8 +3218 +0000 +ENDCHAR +STARTCHAR U+64E4 +ENCODING 25828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +13F8 +1288 +1248 +FBF8 +1000 +17FC +1444 +1FFC +3444 +D7FC +1000 +1FFE +1110 +5110 +2610 +ENDCHAR +STARTCHAR U+64E5 +ENCODING 25829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E80 +49FF +7F00 +42FE +7E00 +48FE +7EAA +41FF +00F8 +1F80 +0080 +3FFE +0080 +7FFF +0080 +0380 +ENDCHAR +STARTCHAR U+64E6 +ENCODING 25830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1308 +7DF8 +1368 +16F0 +1190 +1BF8 +7404 +13F8 +1150 +1248 +1448 +30C0 +0000 +ENDCHAR +STARTCHAR U+64E7 +ENCODING 25831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A30 +1390 +1A30 +1390 +18B0 +1290 +7FFC +08E0 +1710 +6FEC +0100 +3FF8 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+64E8 +ENCODING 25832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +2F88 +2908 +29CF +7911 +2BE1 +2AA4 +3BE4 +6A84 +2AC4 +2A04 +32AA +24B1 +6120 +0000 +0000 +ENDCHAR +STARTCHAR U+64E9 +ENCODING 25833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2020 +27FF +FC21 +25AD +2421 +21AC +3800 +E7FF +2040 +27FF +2491 +2491 +2491 +6493 +ENDCHAR +STARTCHAR U+64EA +ENCODING 25834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +5124 +5F22 +40FF +5F28 +5128 +5F2C +5164 +5F46 +53F3 +4040 +4FFC +4040 +BFFF +0040 +01C0 +ENDCHAR +STARTCHAR U+64EB +ENCODING 25835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FF +09F2 +0993 +09F2 +7D92 +09FF +0D02 +09F2 +1992 +29F2 +4992 +09F2 +0A94 +1819 +0000 +0000 +ENDCHAR +STARTCHAR U+64EC +ENCODING 25836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +15FC +1628 +7C90 +1390 +127C +1398 +1D50 +77DC +1150 +1350 +12F0 +1490 +390C +0000 +ENDCHAR +STARTCHAR U+64ED +ENCODING 25837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +27FF +2088 +2110 +FBFF +2620 +2BFE +2220 +3BFE +E220 +23FF +2000 +27FE +208C +2070 +678F +ENDCHAR +STARTCHAR U+64EF +ENCODING 25839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1208 +7FF8 +1258 +14E4 +11F4 +1710 +19F0 +71F0 +1110 +11F0 +1190 +3608 +0000 +ENDCHAR +STARTCHAR U+64F0 +ENCODING 25840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +FC41 +24A1 +228A +24F9 +2000 +3BFE +E292 +23FE +2000 +27FF +2020 +2020 +60E0 +ENDCHAR +STARTCHAR U+64F1 +ENCODING 25841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +7FB8 +12A8 +13B8 +1288 +16E8 +1BA8 +7248 +13F8 +12A8 +12E8 +3218 +0000 +ENDCHAR +STARTCHAR U+64F2 +ENCODING 25842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2480 +27F8 +2B68 +7FE8 +2B70 +2DF0 +2FE8 +2868 +3FE4 +6224 +2FE4 +2338 +24A0 +6820 +0000 +ENDCHAR +STARTCHAR U+64F3 +ENCODING 25843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +13CF +1492 +7C00 +17DF +1449 +17C9 +1C49 +77C9 +140E +1408 +1488 +1588 +3688 +0000 +0000 +ENDCHAR +STARTCHAR U+64F4 +ENCODING 25844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1290 +7FFC +12F0 +13FC +1220 +16F8 +1AA8 +72F8 +12A8 +14F8 +14C8 +3B04 +0000 +ENDCHAR +STARTCHAR U+64F5 +ENCODING 25845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +FC84 +27FF +2484 +25CE +26B5 +3C0C +E4F8 +2410 +25FE +2410 +2BFF +2010 +6070 +ENDCHAR +STARTCHAR U+64F6 +ENCODING 25846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +17FC +1550 +7918 +10A0 +17FC +1000 +17A8 +1CA8 +77A8 +14A8 +17A8 +1488 +3598 +0000 +ENDCHAR +STARTCHAR U+64F7 +ENCODING 25847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +213F +2108 +27DE +F912 +2112 +27DE +2012 +3812 +E7DE +2452 +2452 +245E +27C0 +2012 +6021 +ENDCHAR +STARTCHAR U+64F8 +ENCODING 25848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +1124 +7C92 +13FE +1222 +1652 +1BFE +1000 +31B4 +516C +11B4 +116C +1125 +31B3 +0000 +0000 +ENDCHAR +STARTCHAR U+64FA +ENCODING 25850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +7FF8 +1220 +14A8 +1FF0 +1064 +1F9C +74A0 +17A8 +17B0 +14A4 +359C +0000 +ENDCHAR +STARTCHAR U+64FB +ENCODING 25851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +27C8 +2548 +2FFF +F552 +27F2 +2112 +27DA +354A +E7CE +2204 +2FE4 +24CE +2F8A +22DB +6C71 +ENDCHAR +STARTCHAR U+64FC +ENCODING 25852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +087C +0888 +08FE +7E92 +08FE +0C92 +09FF +1925 +28FE +4882 +08FE +0882 +18FE +0000 +0000 +ENDCHAR +STARTCHAR U+64FD +ENCODING 25853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1248 +15F4 +7DB4 +12E8 +13AC +15B4 +17FC +1840 +77FC +10E0 +1150 +164C +3040 +0000 +ENDCHAR +STARTCHAR U+64FE +ENCODING 25854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1040 +7DF0 +11F0 +11F0 +17FC +1ED4 +72F8 +14F4 +1190 +1660 +10F0 +370C +0000 +ENDCHAR +STARTCHAR U+64FF +ENCODING 25855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2410 +26FF +2242 +F824 +20FF +2E91 +22FF +3A91 +E2BD +22A5 +22BD +2281 +2683 +2500 +6CFF +ENDCHAR +STARTCHAR U+6500 +ENCODING 25856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1390 +7D7C +1AB0 +36D8 +5194 +1350 +7FFC +05C0 +1F30 +6FEC +3FF8 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6501 +ENCODING 25857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +2110 +27FE +2040 +FBFC +2040 +2FFF +2248 +37FC +EA0B +23F8 +2208 +23FA +2224 +23B8 +6E0F +ENDCHAR +STARTCHAR U+6503 +ENCODING 25859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +13FF +7C84 +1080 +11DF +134A +1C84 +137A +3601 +51FE +1020 +10A8 +3124 +1222 +0000 +0000 +ENDCHAR +STARTCHAR U+6504 +ENCODING 25860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103E +1020 +7FFF +125E +13E1 +127F +16FE +1A92 +72FE +1292 +12FE +1220 +1352 +1545 +357C +ENDCHAR +STARTCHAR U+6505 +ENCODING 25861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +17F8 +1120 +7FFC +11B0 +1248 +15F4 +1D10 +71F0 +11F0 +1110 +11F0 +1190 +3608 +0000 +ENDCHAR +STARTCHAR U+6506 +ENCODING 25862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +13DE +1088 +FBDE +1154 +1A22 +13FE +31FC +5124 +91FC +1124 +11FC +53FE +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6507 +ENCODING 25863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FF +1221 +12F9 +7C20 +10F8 +1820 +13FE +31FC +5154 +11FC +12A4 +128A +34F9 +0000 +0000 +ENDCHAR +STARTCHAR U+6508 +ENCODING 25864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +27FF +2490 +27FE +FC92 +27FE +2510 +25DC +3D11 +E7DF +2400 +25FC +2420 +2BFF +20A8 +6727 +ENDCHAR +STARTCHAR U+6509 +ENCODING 25865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +27FC +2040 +2FFE +FA4A +2150 +2248 +2840 +37FC +E440 +2FF8 +3440 +27F8 +2440 +A7FE +4400 +ENDCHAR +STARTCHAR U+650A +ENCODING 25866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2488 +2488 +F7FE +2488 +25DC +26AA +3488 +E420 +2520 +253E +2520 +2920 +2120 +67FF +ENDCHAR +STARTCHAR U+650C +ENCODING 25868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17FF +1401 +15FD +1555 +7DFD +1401 +1DFD +14F9 +3489 +54F9 +14D5 +1559 +146D +37FF +0000 +0000 +ENDCHAR +STARTCHAR U+650D +ENCODING 25869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FE +1200 +13FC +7BFC +1204 +13FC +1F47 +3555 +57FD +1557 +1755 +5525 +25D5 +0000 +0000 +ENDCHAR +STARTCHAR U+650E +ENCODING 25870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1038 +13FF +1221 +7AFC +123C +127C +1A54 +327C +5254 +127C +14FE +50AA +21FF +0000 +0000 +ENDCHAR +STARTCHAR U+650F +ENCODING 25871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2108 +2FEF +2448 +F28F +2FE1 +200F +27C8 +344F +E7C8 +244F +27C8 +244F +2448 +2449 +64C7 +ENDCHAR +STARTCHAR U+6510 +ENCODING 25872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +1252 +12FA +7C50 +10F8 +1050 +15FC +1924 +72FA +1050 +10D4 +5348 +2064 +0000 +0000 +ENDCHAR +STARTCHAR U+6512 +ENCODING 25874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +2A28 +2FBE +3248 +FFFE +2514 +2514 +29A6 +33F8 +E208 +2248 +2248 +2248 +20A0 +A318 +4C04 +ENDCHAR +STARTCHAR U+6513 +ENCODING 25875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2FFF +2891 +2BFD +F090 +23FC +2090 +27FE +3108 +E7FE +2D0B +21F8 +20A0 +21BC +2360 +663F +ENDCHAR +STARTCHAR U+6514 +ENCODING 25876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27DF +2451 +27DF +2451 +F7DF +2421 +25FD +2421 +35FD +E525 +25FD +2525 +25FD +24A9 +2525 +6423 +ENDCHAR +STARTCHAR U+6515 +ENCODING 25877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A8 +10AA +1159 +7C08 +13FF +10A8 +1BB8 +10A8 +33B8 +50AA +13BC +10A8 +13F5 +3003 +0000 +0000 +ENDCHAR +STARTCHAR U+6516 +ENCODING 25878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2252 +23DE +FA52 +23DE +2252 +23DE +3954 +E222 +2080 +27FF +2104 +23C8 +207C +63C6 +ENDCHAR +STARTCHAR U+6517 +ENCODING 25879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1128 +117E +7D2A +11FE +197E +1148 +317E +5292 +1054 +11FF +1054 +3092 +0000 +0000 +ENDCHAR +STARTCHAR U+6518 +ENCODING 25880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +13B8 +7AA8 +13B8 +10A0 +13F8 +11F0 +18A0 +77FC +10C8 +1730 +11D0 +330C +0000 +ENDCHAR +STARTCHAR U+6519 +ENCODING 25881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21F8 +2610 +23FE +2202 +FBFE +2110 +21DE +2111 +3BCF +E000 +23FE +2222 +23FE +2094 +2191 +670F +ENDCHAR +STARTCHAR U+651B +ENCODING 25883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +27FE +2492 +2F1F +F0C0 +279E +2402 +279E +3402 +E7FE +2224 +23B4 +2225 +23B5 +2223 +6779 +ENDCHAR +STARTCHAR U+651C +ENCODING 25884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +13F8 +1120 +7FF8 +1240 +17F0 +13F0 +1240 +1BF8 +77F8 +1558 +17F8 +1548 +35D8 +0000 +ENDCHAR +STARTCHAR U+651D +ENCODING 25885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1110 +7DF0 +11F0 +17FC +1010 +17FC +1AA8 +73B8 +13B8 +12AC +17F8 +3088 +0000 +ENDCHAR +STARTCHAR U+651E +ENCODING 25886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FE +2492 +27FE +F800 +210A +261F +22B4 +3914 +E25E +27D4 +2154 +211E +2554 +2554 +611F +ENDCHAR +STARTCHAR U+651F +ENCODING 25887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2FFF +2910 +2FFE +F912 +2FFE +2A10 +2BDC +3A11 +EFFF +2AFA +2A22 +2BFE +3272 +22AA +63FE +ENDCHAR +STARTCHAR U+6520 +ENCODING 25888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13FF +1244 +13EF +7A44 +12EE +1345 +1228 +1BEF +7228 +13EF +1228 +55EF +2048 +0000 +0000 +ENDCHAR +STARTCHAR U+6521 +ENCODING 25889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1FFA +156A +7CBF +156A +17EA +190F +17EA +352A +556F +17EA +142A +542F +2468 +0000 +0000 +ENDCHAR +STARTCHAR U+6522 +ENCODING 25890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2514 +27FF +2924 +27DF +FA8A +22CA +2493 +23FE +3A02 +E3FE +2202 +23FE +2202 +23FE +2104 +6603 +ENDCHAR +STARTCHAR U+6523 +ENCODING 25891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +6FE8 +2BA8 +1794 +7C7C +3BB8 +56D4 +13E0 +0F80 +1FF0 +0100 +7FFC +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6524 +ENCODING 25892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2528 +2FA8 +2528 +7F7C +2FD0 +2AD0 +2FFC +2250 +3FD0 +627C +2FD0 +2350 +24FC +6840 +0000 +ENDCHAR +STARTCHAR U+6525 +ENCODING 25893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +13DE +1528 +13F8 +FE88 +1248 +13F8 +1880 +17FE +3150 +D298 +1DE6 +1090 +13F8 +5150 +264C +ENDCHAR +STARTCHAR U+6526 +ENCODING 25894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27DF +2000 +27DF +2451 +F555 +2020 +27FF +2490 +37FE +E492 +27FE +2510 +25DE +2510 +29D1 +630F +ENDCHAR +STARTCHAR U+6529 +ENCODING 25897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +2124 +27FF +2505 +F5FD +2000 +23FE +2222 +3BFE +E222 +23FE +2020 +27FF +2000 +2292 +6449 +ENDCHAR +STARTCHAR U+652A +ENCODING 25898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11B8 +1268 +13B8 +7F78 +12A8 +17FC +15F8 +1D10 +71F0 +11F0 +1110 +11F0 +11A4 +363C +0000 +ENDCHAR +STARTCHAR U+652B +ENCODING 25899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +13B8 +12A8 +13B8 +7FB8 +13B8 +1120 +13FC +16F0 +1AF0 +73FC +13F0 +10A0 +10E0 +371C +0000 +ENDCHAR +STARTCHAR U+652C +ENCODING 25900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +2FFC +2A80 +7F78 +2FFC +2AB4 +2FFC +2BF0 +3210 +63F0 +23F0 +23F4 +21A4 +6E1C +0000 +ENDCHAR +STARTCHAR U+652D +ENCODING 25901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103C +1048 +10F0 +1010 +7DFF +105A +10AC +185C +30AA +53EF +12AB +13EF +5082 +23EF +0000 +0000 +ENDCHAR +STARTCHAR U+652E +ENCODING 25902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +27FC +2040 +23F8 +F248 +2FFE +2912 +27FC +2110 +33F8 +E110 +27FC +2148 +2330 +AD8E +4104 +ENDCHAR +STARTCHAR U+652F +ENCODING 25903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0100 +0100 +1FE0 +0420 +0440 +0240 +0180 +0340 +0C30 +700C +0000 +ENDCHAR +STARTCHAR U+6531 +ENCODING 25905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FE10 +0010 +44FE +6442 +2446 +2C64 +282C +0838 +0E10 +7838 +C06C +00C6 +0183 +ENDCHAR +STARTCHAR U+6532 +ENCODING 25906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +3F88 +047F +0A08 +1108 +7F88 +013E +3D22 +2522 +2522 +3D14 +0108 +0514 +0263 +0000 +0000 +ENDCHAR +STARTCHAR U+6533 +ENCODING 25907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +0802 +08FF +3E02 +087E +08F7 +3E25 +22F7 +2202 +14FF +0822 +1406 +2200 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+6534 +ENCODING 25908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +01FC +0100 +0100 +3FF0 +0410 +0220 +0220 +0140 +0080 +0340 +0C30 +700C +0000 +ENDCHAR +STARTCHAR U+6535 +ENCODING 25909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0400 +0400 +0400 +0FFC +0C20 +1420 +2240 +0240 +0180 +0180 +0240 +0C30 +700C +0000 +ENDCHAR +STARTCHAR U+6536 +ENCODING 25910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +0480 +2480 +25FC +2510 +2690 +2490 +2450 +2660 +3C20 +6460 +0490 +0508 +0604 +0000 +ENDCHAR +STARTCHAR U+6537 +ENCODING 25911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7E80 +1080 +10FC +1110 +1D90 +2690 +2450 +0460 +0420 +0420 +0850 +0888 +3304 +0000 +ENDCHAR +STARTCHAR U+6538 +ENCODING 25912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0C80 +14FC +1510 +3590 +5690 +1450 +1460 +1420 +1420 +1450 +1088 +1304 +0000 +ENDCHAR +STARTCHAR U+6539 +ENCODING 25913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7C80 +0480 +04FC +0510 +7D90 +4690 +4050 +4060 +4420 +4460 +3C90 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+653A +ENCODING 25914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7E40 +427F +4244 +42C4 +7EA4 +41AC +4028 +4038 +4010 +4238 +6228 +3E6C +00C6 +0183 +ENDCHAR +STARTCHAR U+653B +ENCODING 25915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0080 +7EFC +1110 +1190 +1290 +1050 +1460 +1820 +6060 +0090 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+653C +ENCODING 25916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C40 +1040 +107F +1044 +10C4 +FEA4 +11AC +1028 +1038 +1010 +1038 +1028 +106C +10C6 +1183 +ENDCHAR +STARTCHAR U+653D +ENCODING 25917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2420 +2420 +2420 +663F +4264 +C344 +81AC +7E28 +1228 +1238 +1210 +1238 +3228 +266C +6446 +CCC3 +ENDCHAR +STARTCHAR U+653E +ENCODING 25918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7F40 +08FC +0888 +0F88 +0A48 +0A50 +1230 +1220 +2250 +4388 +0E04 +0000 +ENDCHAR +STARTCHAR U+653F +ENCODING 25919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7F80 +0880 +08FC +2910 +2F90 +2A90 +2850 +2860 +2820 +2E60 +3890 +6308 +0C04 +0000 +ENDCHAR +STARTCHAR U+6541 +ENCODING 25921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1008 +1008 +1F0F +1008 +1008 +103E +7E22 +4222 +4214 +4208 +4214 +7E22 +4241 +0000 +0000 +ENDCHAR +STARTCHAR U+6543 +ENCODING 25923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7F90 +4090 +409F +40B2 +7FA2 +4866 +4814 +7F94 +481C +4808 +4C1C +4494 +4696 +73B2 +C123 +ENDCHAR +STARTCHAR U+6545 +ENCODING 25925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +0890 +0990 +0A90 +3E50 +2260 +2220 +2260 +3E90 +2308 +2204 +0000 +ENDCHAR +STARTCHAR U+6546 +ENCODING 25926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1408 +220E +4108 +0008 +3E7F +0041 +3E41 +2222 +2214 +2208 +2214 +3E22 +22C1 +0000 +0000 +ENDCHAR +STARTCHAR U+6547 +ENCODING 25927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FFA0 +083F +0864 +7F44 +49CC +4928 +4928 +4B38 +1810 +1C38 +2A28 +696C +C846 +08C3 +ENDCHAR +STARTCHAR U+6548 +ENCODING 25928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +147C +1290 +2690 +6590 +1450 +0C60 +0C20 +0A20 +1250 +2088 +4104 +0000 +ENDCHAR +STARTCHAR U+6549 +ENCODING 25929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +9440 +5444 +58FE +1108 +FE88 +3088 +3888 +5490 +5450 +9020 +1050 +108E +1104 +1200 +ENDCHAR +STARTCHAR U+654A +ENCODING 25930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +0F0E +0808 +0808 +7FBE +0822 +2A22 +2A22 +2A14 +4908 +0814 +0822 +18C1 +0000 +0000 +ENDCHAR +STARTCHAR U+654C +ENCODING 25932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0720 +7820 +0844 +087E +0A88 +FF48 +0848 +0A48 +3F48 +2250 +2250 +2220 +3E50 +228E +0104 +ENDCHAR +STARTCHAR U+654D +ENCODING 25933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +147C +1240 +3E40 +49F8 +0888 +7E88 +0850 +2C50 +2A20 +2A50 +4888 +1B04 +0000 +ENDCHAR +STARTCHAR U+654E +ENCODING 25934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +0C08 +1410 +2A10 +083F +7F22 +1062 +1FA2 +2224 +4414 +0F98 +7808 +0818 +0824 +0842 +1981 +ENDCHAR +STARTCHAR U+654F +ENCODING 25935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +3F40 +407C +3E88 +2A88 +2B48 +7F50 +2A30 +2A20 +7F50 +4388 +0604 +0000 +ENDCHAR +STARTCHAR U+6550 +ENCODING 25936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7F20 +4020 +403F +5E64 +4044 +40CC +7F28 +5028 +50B8 +5510 +5238 +5228 +576C +9946 +30C3 +ENDCHAR +STARTCHAR U+6551 +ENCODING 25937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0A40 +0940 +7F7C +0888 +4A88 +2B50 +2C50 +1C30 +1A20 +2A30 +4850 +0888 +1B04 +0000 +ENDCHAR +STARTCHAR U+6552 +ENCODING 25938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +1210 +1210 +3F9F +2AB2 +6AA2 +6AE6 +AF94 +2A94 +2A9C +2A88 +2F88 +221C +2214 +2236 +2263 +ENDCHAR +STARTCHAR U+6553 +ENCODING 25939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +2110 +40BF +3F42 +2102 +2112 +2112 +3F12 +1212 +1212 +120A +1204 +224A +43D1 +0000 +0000 +ENDCHAR +STARTCHAR U+6554 +ENCODING 25940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7E20 +1020 +103F +7C64 +2444 +24CC +2428 +FF28 +0038 +7E10 +4238 +4228 +426C +4246 +7EC3 +ENDCHAR +STARTCHAR U+6555 +ENCODING 25941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +08FC +3E90 +2B90 +2A90 +3E50 +1C60 +1A20 +2A20 +4850 +0888 +0B04 +0000 +ENDCHAR +STARTCHAR U+6556 +ENCODING 25942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +3E40 +08FC +7F90 +0890 +0950 +7F50 +0860 +0E20 +1230 +1250 +2288 +4D04 +0000 +ENDCHAR +STARTCHAR U+6557 +ENCODING 25943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +2240 +2240 +3EFC +2290 +3F90 +2250 +2250 +3E20 +1420 +1250 +2288 +4104 +0000 +ENDCHAR +STARTCHAR U+6558 +ENCODING 25944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +12FC +3E90 +4990 +0A90 +7E50 +0860 +2C20 +2A20 +2A50 +4888 +1B04 +0000 +ENDCHAR +STARTCHAR U+6559 +ENCODING 25945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0940 +3F40 +0A40 +0AFC +7F88 +0988 +1F48 +2250 +4730 +3C20 +0450 +0588 +0E04 +0000 +ENDCHAR +STARTCHAR U+655B +ENCODING 25947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1420 +1324 +217E +4084 +BE44 +0044 +1148 +4928 +2A28 +2A10 +2A28 +0728 +7846 +2184 +ENDCHAR +STARTCHAR U+655C +ENCODING 25948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0A10 +111F +24A2 +0202 +0022 +3FA2 +0122 +0222 +0022 +2A94 +2A48 +4894 +0FA3 +0000 +0000 +ENDCHAR +STARTCHAR U+655D +ENCODING 25949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +2A40 +2940 +497C +08C8 +7FC8 +4948 +6B48 +6B30 +6B30 +6B30 +4950 +4988 +4304 +0000 +ENDCHAR +STARTCHAR U+655E +ENCODING 25950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +2A40 +2940 +497C +08C8 +7FC8 +4148 +5D48 +5530 +5530 +5D30 +5550 +4188 +4304 +0000 +ENDCHAR +STARTCHAR U+655F +ENCODING 25951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1420 +1420 +1420 +7F3F +5564 +5544 +55CC +7F28 +5528 +5538 +5510 +FFB8 +0028 +246C +6646 +42C3 +ENDCHAR +STARTCHAR U+6560 +ENCODING 25952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +F788 +108F +D688 +2108 +52FE +8422 +0022 +F7B6 +1094 +949C +6308 +211C +5294 +54B6 +8863 +ENDCHAR +STARTCHAR U+6562 +ENCODING 25954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3F40 +0440 +0440 +7FFC +1288 +1F88 +1250 +1E50 +1320 +1E20 +6250 +0288 +0304 +0000 +ENDCHAR +STARTCHAR U+6563 +ENCODING 25955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +1440 +3F40 +147C +1488 +7F88 +0148 +3E50 +2230 +3E20 +2230 +3E50 +2288 +2704 +0000 +ENDCHAR +STARTCHAR U+6564 +ENCODING 25956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F84 +2484 +2484 +3F87 +2484 +2484 +3F9F +0411 +7FD1 +0411 +150A +2484 +444A +0411 +0000 +0000 +ENDCHAR +STARTCHAR U+6565 +ENCODING 25957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +4908 +4908 +2A08 +080F +1408 +6308 +087F +4941 +4941 +2A41 +0841 +147F +6341 +0000 +0000 +ENDCHAR +STARTCHAR U+6566 +ENCODING 25958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0040 +3EFC +2290 +3F90 +0050 +3E50 +0420 +0E20 +7850 +0988 +1E04 +0000 +ENDCHAR +STARTCHAR U+6567 +ENCODING 25959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +FF8F +1408 +3608 +637E +0022 +FFA2 +0236 +7A14 +4A1C +4A08 +7A1C +0214 +0236 +0E63 +ENDCHAR +STARTCHAR U+6568 +ENCODING 25960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +3FBF +1102 +1102 +0A22 +7FE2 +0022 +3FA2 +2094 +2088 +2088 +3F94 +20A3 +0000 +0000 +ENDCHAR +STARTCHAR U+656A +ENCODING 25962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +39C4 +0844 +2947 +1084 +2944 +463F +0011 +39D1 +0851 +2951 +294A +1084 +294A +4631 +0000 +0000 +ENDCHAR +STARTCHAR U+656B +ENCODING 25963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +1040 +7E44 +427E +7E88 +4288 +7F48 +1048 +0A48 +FF50 +1050 +1E20 +2250 +2288 +4B0E +8604 +ENDCHAR +STARTCHAR U+656C +ENCODING 25964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +1440 +7F40 +147C +1088 +1E88 +2348 +7A50 +2A30 +2A20 +3A30 +2250 +0288 +0D04 +0000 +ENDCHAR +STARTCHAR U+656D +ENCODING 25965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3F10 +2120 +3F3F +2142 +3F62 +08A2 +0924 +1014 +3F94 +4988 +1288 +2494 +4924 +1142 +2681 +ENDCHAR +STARTCHAR U+656F +ENCODING 25967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F88 +4088 +7F8E +4408 +7F88 +443E +52A2 +61A2 +0022 +3FA2 +2094 +3F88 +2094 +3FA2 +0000 +0000 +ENDCHAR +STARTCHAR U+6570 +ENCODING 25968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4940 +2940 +2A40 +7F7C +1C88 +1A88 +2B48 +4850 +7F30 +1220 +3A30 +0450 +1A88 +6104 +0000 +ENDCHAR +STARTCHAR U+6572 +ENCODING 25970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F3C +0020 +3E20 +22F8 +3E48 +0048 +7F28 +4130 +5D10 +5530 +5D48 +4384 +0000 +ENDCHAR +STARTCHAR U+6573 +ENCODING 25971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +4450 +7FDF +0022 +7FC2 +0012 +3F92 +2092 +3F92 +0012 +208A +1104 +0A0A +7FD1 +0000 +0000 +ENDCHAR +STARTCHAR U+6574 +ENCODING 25972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +7F40 +3E7C +2AC8 +3F28 +1C30 +2AC8 +4904 +3FF8 +0100 +09E0 +0900 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+6575 +ENCODING 25973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +2240 +147C +7F90 +4990 +7F50 +4950 +5D20 +5520 +5D50 +4188 +4304 +0000 +ENDCHAR +STARTCHAR U+6576 +ENCODING 25974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7884 +4BE8 +509F +63E2 +52A2 +4BE2 +4AAA +4BEA +688A +51CA +42AA +4084 +408A +4091 +0000 +0000 +ENDCHAR +STARTCHAR U+6577 +ENCODING 25975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A40 +7F40 +0840 +3E40 +2AFC +3E90 +2B90 +3E50 +0850 +7F20 +1E20 +1250 +2388 +4E04 +0000 +ENDCHAR +STARTCHAR U+6578 +ENCODING 25976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +3F20 +2520 +7FFC +2548 +3FC8 +3F48 +2550 +3F30 +0820 +7F30 +1250 +1E88 +7104 +0000 +ENDCHAR +STARTCHAR U+6579 +ENCODING 25977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +0710 +043F +7FC2 +4042 +3F12 +2492 +1512 +7FD2 +1512 +248C +444C +0C12 +0421 +0000 +0000 +ENDCHAR +STARTCHAR U+657A +ENCODING 25978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +FF88 +800F +9E08 +9208 +927E +9E22 +8022 +BBB6 +AA94 +AA9C +AA88 +BB9C +8014 +FFB6 +0063 +ENDCHAR +STARTCHAR U+657B +ENCODING 25979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07E0 +0840 +1FF8 +0948 +0A28 +07F0 +07D0 +05F0 +0410 +07F0 +03E0 +0540 +0880 +3F7E +0000 +0000 +ENDCHAR +STARTCHAR U+657C +ENCODING 25980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +7FC4 +0404 +3F87 +0004 +3F84 +209F +3F91 +1111 +7FD1 +110A +3F84 +208A +3F91 +0000 +0000 +ENDCHAR +STARTCHAR U+657D +ENCODING 25981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0708 +7C08 +080F +FF88 +1208 +3F7E +D2A2 +1E22 +0036 +7F14 +411C +5D08 +551C +5D14 +4136 +4363 +ENDCHAR +STARTCHAR U+657E +ENCODING 25982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +1110 +7FD0 +043F +3FA2 +0462 +7FA2 +24A2 +1514 +7FD4 +0008 +3F88 +2094 +2094 +3FA2 +20C1 +ENDCHAR +STARTCHAR U+657F +ENCODING 25983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F90 +0410 +7FDF +1122 +3F82 +5142 +1F12 +0012 +7FD2 +4052 +5F52 +514C +5F4C +40D3 +0000 +0000 +ENDCHAR +STARTCHAR U+6580 +ENCODING 25984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F88 +2A88 +2A8E +3F88 +1008 +1F88 +28BE +7EA2 +2AA2 +3EA2 +0994 +7F88 +0094 +0363 +0000 +0000 +ENDCHAR +STARTCHAR U+6581 +ENCODING 25985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7F10 +5510 +551F +7F32 +0822 +7F66 +0814 +FF94 +221C +1408 +FF88 +081C +7F14 +0836 +0863 +ENDCHAR +STARTCHAR U+6582 +ENCODING 25986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +127C +3FC8 +40C8 +7728 +5528 +7730 +1210 +1230 +2D48 +2588 +4904 +0000 +ENDCHAR +STARTCHAR U+6583 +ENCODING 25987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4920 +2A20 +7F7C +49C8 +5D30 +6B30 +4BCC +0000 +7FFC +0888 +1EB0 +72C4 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+6584 +ENCODING 25988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1F3E +0454 +3F88 +1514 +24A3 +3FFE +2040 +2FFE +2448 +2A54 +20E0 +2150 +464C +0000 +0000 +ENDCHAR +STARTCHAR U+6585 +ENCODING 25989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A08 +3588 +2488 +3B8F +2488 +3F88 +2488 +7FFE +4062 +1F14 +0214 +07C8 +7C08 +0414 +0422 +0CC1 +ENDCHAR +STARTCHAR U+6587 +ENCODING 25991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0820 +0820 +0440 +0440 +0280 +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+6588 +ENCODING 25992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0440 +0280 +0380 +0C60 +77DC +0080 +0100 +7FFC +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6589 +ENCODING 25993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0440 +0280 +0380 +0C60 +783C +0FE0 +0820 +0FE0 +0820 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+658A +ENCODING 25994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +0810 +0660 +03C0 +0E70 +F81F +0000 +FFFF +0810 +0FF0 +0810 +0FF0 +081F +FFF0 +0010 +ENDCHAR +STARTCHAR U+658B +ENCODING 25995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0820 +0440 +0380 +1C70 +E00E +1FF0 +0200 +0408 +3FFC +2448 +2448 +2448 +2018 +ENDCHAR +STARTCHAR U+658C +ENCODING 25996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +13E8 +1024 +7FFC +08A0 +08A0 +4AA0 +2AE0 +1290 +1290 +1AB4 +2ACC +270C +4004 +0000 +ENDCHAR +STARTCHAR U+658E +ENCODING 25998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0440 +0380 +06C0 +783C +17D0 +1010 +1FF0 +1590 +1550 +2950 +4310 +0000 +ENDCHAR +STARTCHAR U+6590 +ENCODING 26000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +3E7C +0240 +3E7C +0240 +7C7C +0540 +0900 +7FFC +0440 +0280 +0380 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+6591 +ENCODING 26001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7D7C +1110 +17D0 +1090 +1490 +7AFC +1310 +1110 +1110 +1E90 +6290 +047C +0800 +0000 +ENDCHAR +STARTCHAR U+6592 +ENCODING 26002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1007 +10FC +1080 +FEFE +0482 +0482 +CCFE +6880 +38FF +10A9 +38A9 +6DFF +C1A9 +82A9 +00A9 +00AB +ENDCHAR +STARTCHAR U+6593 +ENCODING 26003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +42FE +2044 +0454 +FFFC +1444 +55F4 +2554 +25F4 +5554 +55F4 +4CE4 +8D54 +064C +0454 +0448 +ENDCHAR +STARTCHAR U+6594 +ENCODING 26004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F28 +224B +1449 +0849 +146B +6349 +0849 +7F7F +4908 +7F08 +0814 +0922 +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+6595 +ENCODING 26005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27DF +2451 +27DF +FC51 +17DF +5421 +55FD +7421 +25FD +3525 +55FD +4525 +45FD +84A9 +0525 +0423 +ENDCHAR +STARTCHAR U+6596 +ENCODING 26006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0220 +01C0 +3E3E +13E0 +3A2E +23E2 +3AAE +7FFF +4FF9 +0FE8 +0FE8 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+6597 +ENCODING 26007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0C40 +0240 +0040 +1840 +0440 +0040 +007C +07C0 +7840 +0040 +0040 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+6598 +ENCODING 26008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +2064 +3E34 +2214 +6204 +42C4 +E264 +B624 +1404 +1C07 +083C +18E4 +1004 +3004 +6004 +C004 +ENDCHAR +STARTCHAR U+6599 +ENCODING 26009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +4A90 +2A50 +2C50 +0910 +7E90 +0890 +1C1C +1A70 +2B90 +4810 +0810 +0810 +0810 +0000 +ENDCHAR +STARTCHAR U+659B +ENCODING 26011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1E90 +2450 +7E50 +2A10 +2A90 +3E50 +2A50 +2A1C +3E70 +2390 +2210 +2210 +4610 +0000 +ENDCHAR +STARTCHAR U+659C +ENCODING 26012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0890 +1450 +1250 +2310 +7E90 +0890 +7E1C +0870 +2D90 +2A10 +2A10 +4810 +1810 +0000 +ENDCHAR +STARTCHAR U+659D +ENCODING 26013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E7C +2244 +3E7C +0000 +7FFE +4002 +4E22 +0320 +0020 +3820 +0C20 +003F +07E0 +FC20 +0020 +0020 +ENDCHAR +STARTCHAR U+659E +ENCODING 26014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +1582 +2492 +248A +3582 +2492 +248A +3F82 +2482 +043F +0402 +0A02 +1102 +60C2 +0000 +0000 +ENDCHAR +STARTCHAR U+659F +ENCODING 26015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +1290 +7F50 +1250 +1E10 +1290 +1E50 +1250 +7F1C +2A70 +2B90 +3310 +2010 +1F10 +0000 +ENDCHAR +STARTCHAR U+65A0 +ENCODING 26016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1404 +1424 +FFB4 +1414 +7F04 +1424 +FFB4 +0814 +7F04 +4907 +7F1C +4974 +FF84 +4104 +4104 +4304 +ENDCHAR +STARTCHAR U+65A1 +ENCODING 26017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F50 +0888 +3F54 +2230 +3E90 +2250 +3E50 +081C +7FF0 +0810 +0810 +0810 +0000 +ENDCHAR +STARTCHAR U+65A2 +ENCODING 26018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +7FC2 +1112 +1F0A +0002 +7FD2 +000A +3F82 +2482 +3FBF +2482 +3F82 +1102 +60C2 +0000 +0000 +ENDCHAR +STARTCHAR U+65A3 +ENCODING 26019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +FFD2 +925A +924A +FFC2 +2012 +7FDA +C84A +7F42 +4943 +7F4E +087A +0A42 +1EC2 +7282 +0182 +ENDCHAR +STARTCHAR U+65A4 +ENCODING 26020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0060 +0F80 +0800 +0800 +0FFC +0840 +0840 +0840 +1040 +1040 +2040 +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+65A5 +ENCODING 26021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +0060 +0F80 +0800 +0800 +0FFC +0840 +0840 +09C0 +1070 +1048 +2040 +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+65A6 +ENCODING 26022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0202 +0E0E +3878 +2040 +2040 +3F7F +2444 +2444 +2444 +2444 +2444 +2444 +64C4 +4484 +C584 +0404 +ENDCHAR +STARTCHAR U+65A7 +ENCODING 26023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0460 +0C30 +3248 +0380 +0C60 +70DC +0F00 +0800 +0FF8 +0880 +1080 +1080 +2080 +4080 +0000 +ENDCHAR +STARTCHAR U+65A8 +ENCODING 26024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2201 +22FE +2240 +2240 +3E7F +0244 +0244 +7E44 +2244 +2244 +2244 +4284 +0204 +0204 +0000 +0000 +ENDCHAR +STARTCHAR U+65A9 +ENCODING 26025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +14E0 +FE80 +2080 +2884 +48FE +7E90 +0890 +0890 +0E90 +F890 +4910 +0910 +0A10 +0810 +ENDCHAR +STARTCHAR U+65AA +ENCODING 26026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +2002 +3F3C +2120 +4120 +013F +7D24 +4524 +4524 +7D24 +4524 +0144 +0904 +0604 +0000 +0000 +ENDCHAR +STARTCHAR U+65AB +ENCODING 26027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F30 +08C0 +0880 +0880 +10FC +1E90 +3290 +3290 +5290 +1310 +1F10 +1210 +1010 +0000 +ENDCHAR +STARTCHAR U+65AC +ENCODING 26028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +7FE0 +0880 +3E80 +2AFC +3E90 +2A90 +3E90 +0890 +7F10 +0910 +0A10 +0810 +0000 +ENDCHAR +STARTCHAR U+65AD +ENCODING 26029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +0410 +6560 +5540 +5640 +447C +7FC8 +4C48 +4E48 +5548 +6588 +4488 +7F08 +4008 +0000 +ENDCHAR +STARTCHAR U+65AE +ENCODING 26030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1202 +120E +7FB8 +1220 +1220 +123F +FFE4 +0024 +0024 +3F24 +2124 +2124 +3F64 +2144 +21C4 +3F04 +ENDCHAR +STARTCHAR U+65AF +ENCODING 26031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1208 +1210 +1260 +7FC0 +1240 +1E7C +1248 +1E48 +1248 +7F48 +1488 +1288 +2308 +4008 +0000 +ENDCHAR +STARTCHAR U+65B0 +ENCODING 26032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +7FE0 +2280 +1280 +14FC +7F90 +0890 +7E90 +1C90 +1B10 +2910 +4A10 +0810 +0000 +ENDCHAR +STARTCHAR U+65B2 +ENCODING 26034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3002 +E78E +94B8 +94A0 +F7A0 +143F +1424 +F7A4 +80A4 +80A4 +F7A4 +1424 +1424 +17A4 +3C44 +E004 +ENDCHAR +STARTCHAR U+65B3 +ENCODING 26035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2202 +220E +FFB8 +2220 +0020 +7F3F +4924 +4924 +7F24 +0824 +7F24 +0864 +7F44 +08C4 +0804 +FF84 +ENDCHAR +STARTCHAR U+65B4 +ENCODING 26036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4902 +2A0E +0838 +FFA0 +2A20 +6B3F +C9A4 +4824 +7124 +DFA4 +9524 +7524 +3FA4 +6124 +C144 +8104 +ENDCHAR +STARTCHAR U+65B6 +ENCODING 26038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +05FE +794A +21FE +2040 +3EFF +2521 +24FD +24A5 +24FD +2429 +44FD +0405 +0401 +040F +0000 +0000 +ENDCHAR +STARTCHAR U+65B7 +ENCODING 26039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1208 +5B70 +6D40 +5240 +6D40 +7F7C +7F50 +5B50 +6D50 +5250 +6D90 +7F90 +7F10 +4010 +0000 +ENDCHAR +STARTCHAR U+65B8 +ENCODING 26040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FC1 +207E +3FD0 +3310 +2A9F +3FD2 +3552 +3FD2 +3FF2 +3FB2 +34B2 +5FA2 +0422 +1FE2 +0000 +0000 +ENDCHAR +STARTCHAR U+65B9 +ENCODING 26041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0200 +0200 +03F0 +0210 +0210 +0410 +0410 +0810 +1010 +20E0 +0000 +ENDCHAR +STARTCHAR U+65BB +ENCODING 26043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0810 +08FF +7F00 +107C +1044 +1E44 +1244 +1244 +2244 +4245 +0245 +1485 +0907 +0000 +0000 +ENDCHAR +STARTCHAR U+65BC +ENCODING 26044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7F50 +0850 +0888 +0F44 +0A20 +0A20 +1200 +1240 +2220 +4210 +0C10 +0000 +ENDCHAR +STARTCHAR U+65BD +ENCODING 26045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08FC +7F20 +11A0 +12B8 +1CE8 +17A8 +14A8 +14A8 +24B8 +24A0 +4484 +187C +0000 +ENDCHAR +STARTCHAR U+65BF +ENCODING 26047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +FEFF +1080 +1180 +107E +1E02 +1204 +1208 +1208 +32FF +2608 +2408 +6408 +DC38 +ENDCHAR +STARTCHAR U+65C1 +ENCODING 26049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0440 +0280 +3FFC +2108 +4100 +3FF8 +0100 +01F0 +0210 +0C10 +30E0 +0000 +ENDCHAR +STARTCHAR U+65C2 +ENCODING 26050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +FEFF +2080 +218E +3C78 +2440 +2440 +247F +2448 +2448 +24C8 +6488 +4588 +CC08 +ENDCHAR +STARTCHAR U+65C3 +ENCODING 26051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +10FC +7D00 +1100 +12F8 +1CA8 +14A8 +14A8 +15FC +2488 +2488 +4488 +1898 +0000 +ENDCHAR +STARTCHAR U+65C4 +ENCODING 26052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +10FC +7D10 +13E0 +1040 +1C78 +15C0 +1440 +147C +27C0 +2444 +4444 +183C +0000 +ENDCHAR +STARTCHAR U+65C5 +ENCODING 26053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +08A0 +0928 +0E48 +0A70 +0AE0 +1350 +1250 +2248 +4244 +0C40 +0000 +ENDCHAR +STARTCHAR U+65C6 +ENCODING 26054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +10FC +7D20 +1220 +13FC +1C20 +14F8 +14A8 +14A8 +24A8 +24B8 +4420 +1820 +0000 +ENDCHAR +STARTCHAR U+65C8 +ENCODING 26056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FE40 +2042 +209F +3DF1 +2400 +2454 +2454 +2454 +2454 +2454 +64D5 +4495 +CD83 +ENDCHAR +STARTCHAR U+65C9 +ENCODING 26057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +FFFF +0100 +3FFC +2104 +3FFC +2104 +3FFC +2104 +0100 +FFFF +0200 +07F8 +0C08 +1818 +7070 +ENDCHAR +STARTCHAR U+65CB +ENCODING 26059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +7FFC +1100 +11FC +1E28 +14B0 +14A0 +14BC +24A0 +24A0 +4560 +1A1C +0000 +ENDCHAR +STARTCHAR U+65CC +ENCODING 26060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +10FC +7F00 +11A0 +12A0 +1CF8 +14A0 +1520 +14F8 +2420 +2420 +45FC +1800 +0000 +ENDCHAR +STARTCHAR U+65CD +ENCODING 26061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +087F +0098 +7E24 +1042 +1081 +1F3C +1200 +127E +1202 +2204 +4228 +1410 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+65CE +ENCODING 26062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +1880 +0884 +00FE +FD00 +22FC +2084 +3C84 +24FC +2480 +24A4 +24A8 +44B0 +4522 +9522 +0A1E +ENDCHAR +STARTCHAR U+65CF +ENCODING 26063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +10FC +7F00 +1280 +10F8 +1D20 +1620 +17FC +1460 +2450 +2490 +4508 +1A04 +0000 +ENDCHAR +STARTCHAR U+65D0 +ENCODING 26064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +FDFF +2300 +2048 +3849 +2B4B +294A +2848 +29CE +2F4B +2848 +68C9 +4989 +DB07 +ENDCHAR +STARTCHAR U+65D2 +ENCODING 26066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +11FC +7E20 +13FC +1050 +1C98 +17E8 +1410 +1550 +2550 +2554 +4554 +1A0C +0000 +ENDCHAR +STARTCHAR U+65D3 +ENCODING 26067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +047F +0080 +7E08 +1049 +102A +1E7F +1241 +127F +1241 +127F +2241 +4241 +0C43 +0000 +0000 +ENDCHAR +STARTCHAR U+65D4 +ENCODING 26068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13BE +108A +FD0A +217F +220A +3B8A +28BE +2888 +2ABE +2A88 +297F +6908 +4908 +4B80 +DA7F +ENDCHAR +STARTCHAR U+65D6 +ENCODING 26070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +1884 +09FE +0220 +FEF8 +2020 +2050 +3C88 +27FE +2408 +25E8 +2528 +4528 +45E8 +9408 +0818 +ENDCHAR +STARTCHAR U+65D7 +ENCODING 26071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +11FC +7E90 +13FC +1090 +1CF0 +1490 +14F0 +1490 +27FC +2450 +4488 +1B04 +0000 +ENDCHAR +STARTCHAR U+65D8 +ENCODING 26072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +108A +13EB +FC09 +2228 +2148 +3FFF +2408 +25EA +252A +252E +25E4 +2524 +6525 +45EF +DC1A +ENDCHAR +STARTCHAR U+65D9 +ENCODING 26073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +11E8 +1128 +7CB0 +13FC +1070 +1CA8 +1724 +14F8 +14A8 +24F8 +24A8 +44F8 +1888 +0000 +ENDCHAR +STARTCHAR U+65DA +ENCODING 26074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +19FE +0200 +7DFE +2048 +21FE +3D4A +25FE +24FC +2400 +25FE +2410 +4454 +1892 +0000 +0000 +ENDCHAR +STARTCHAR U+65DB +ENCODING 26075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10FC +1118 +7EE8 +10B0 +11FC +1C70 +14A8 +17FC +14A8 +24F8 +24A8 +44F8 +1888 +0000 +ENDCHAR +STARTCHAR U+65DD +ENCODING 26077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +11FE +1138 +7E44 +20BA +2101 +3CFE +24D6 +24FE +247C +2444 +247C +4444 +1C7C +0000 +0000 +ENDCHAR +STARTCHAR U+65DE +ENCODING 26078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2042 +1424 +7AFF +2008 +2790 +3969 +2A1A +2C6C +2A1A +2969 +2908 +4930 +4A80 +1C7F +0000 +0000 +ENDCHAR +STARTCHAR U+65DF +ENCODING 26079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1100 +13FF +FE00 +20C0 +23A6 +3A3A +2BA6 +2A32 +2A12 +2B56 +2A52 +2A52 +6FFF +4888 +DB06 +ENDCHAR +STARTCHAR U+65E0 +ENCODING 26080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +0100 +0100 +0100 +7FFC +0180 +0180 +0280 +0280 +0484 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+65E1 +ENCODING 26081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +2100 +2100 +2100 +3FFC +2180 +0180 +0280 +0280 +0484 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+65E2 +ENCODING 26082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EFC +2250 +2250 +3E50 +2250 +23FC +3E30 +2830 +2450 +2650 +3A94 +6114 +020C +0000 +ENDCHAR +STARTCHAR U+65E3 +ENCODING 26083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +20FE +7C48 +4448 +4448 +7C48 +4448 +47FF +7C18 +4018 +4028 +7C28 +4049 +7C89 +410F +4600 +ENDCHAR +STARTCHAR U+65E5 +ENCODING 26085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1010 +1010 +1FF0 +1010 +1010 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+65E6 +ENCODING 26086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0000 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+65E7 +ENCODING 26087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +27F0 +2410 +2410 +2410 +2410 +27F0 +2410 +2410 +2410 +2410 +27F0 +2410 +2000 +0000 +ENDCHAR +STARTCHAR U+65E8 +ENCODING 26088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +2070 +3F80 +2008 +2008 +1FF8 +0000 +1FE0 +1020 +1FE0 +1020 +1020 +1FE0 +1020 +0000 +ENDCHAR +STARTCHAR U+65E9 +ENCODING 26089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1FF0 +1010 +1FF0 +1110 +0100 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+65EC +ENCODING 26092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0FF8 +1008 +1F88 +2888 +4888 +0F88 +0888 +0888 +0F88 +0888 +0008 +0030 +0000 +ENDCHAR +STARTCHAR U+65ED +ENCODING 26093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +0888 +7E88 +0AF8 +0A88 +0A88 +0A88 +0AF8 +1288 +1204 +2204 +41FC +0000 +ENDCHAR +STARTCHAR U+65EE +ENCODING 26094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0220 +7FF0 +0420 +0420 +0822 +1022 +201E +DFF0 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+65EF +ENCODING 26095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +0200 +0220 +7FF0 +0420 +0422 +0822 +101E +6000 +ENDCHAR +STARTCHAR U+65F0 +ENCODING 26096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +7FFC +4420 +4420 +4420 +4420 +7C24 +47FE +4420 +4420 +4420 +7C20 +4420 +0020 +0020 +ENDCHAR +STARTCHAR U+65F1 +ENCODING 26097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0000 +3FF8 +0100 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+65F2 +ENCODING 26098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +1FF8 +0000 +0100 +0100 +FFFF +0240 +0660 +1C38 +F00F +ENDCHAR +STARTCHAR U+65F3 +ENCODING 26099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7C7F +4481 +4501 +4441 +7C21 +4411 +4401 +4401 +7C01 +4401 +0012 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+65F4 +ENCODING 26100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +7820 +4820 +4820 +4820 +7820 +4FFF +4820 +4820 +4820 +7820 +4820 +0020 +0020 +0060 +ENDCHAR +STARTCHAR U+65F5 +ENCODING 26101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +1FF8 +0000 +0100 +4102 +4102 +4102 +4102 +7FFE +0000 +ENDCHAR +STARTCHAR U+65F6 +ENCODING 26102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0408 +7E08 +4408 +47FE +4408 +4408 +7C88 +4448 +4448 +4408 +4408 +7C08 +4448 +0028 +0010 +ENDCHAR +STARTCHAR U+65F7 +ENCODING 26103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0820 +7C24 +4BFE +4A00 +4A00 +7A00 +4A00 +4A00 +4A00 +4A00 +7A00 +4400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U+65F9 +ENCODING 26105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2104 +2104 +3FFC +0100 +0100 +FFFF +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+65FA +ENCODING 26106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +4440 +4440 +4440 +7C40 +47F8 +4440 +4440 +7C40 +4440 +4040 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+65FB +ENCODING 26107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0100 +7FFC +0440 +0440 +0280 +0380 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+65FC +ENCODING 26108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +0020 +7FFF +4904 +4904 +4888 +7888 +4850 +4850 +4820 +7830 +4848 +0084 +0102 +0201 +ENDCHAR +STARTCHAR U+65FD +ENCODING 26109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +0020 +783E +4BE0 +4820 +4A22 +7A22 +4A22 +4BFE +4A22 +7820 +4821 +4021 +003F +0000 +ENDCHAR +STARTCHAR U+65FE +ENCODING 26110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +010C +01F8 +FF00 +0100 +2108 +2108 +3FF9 +0103 +00FE +0000 +1FF8 +1008 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+65FF +ENCODING 26111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7900 +49FE +4A20 +4C20 +7820 +4820 +4820 +4FFF +7820 +4820 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+6600 +ENCODING 26112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0480 +7E84 +44FE +4504 +4684 +4444 +7C44 +4414 +4464 +4584 +4404 +7C04 +4444 +0028 +0010 +ENDCHAR +STARTCHAR U+6602 +ENCODING 26114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0600 +38F8 +2088 +2088 +2688 +38F0 +2080 +0080 +0000 +ENDCHAR +STARTCHAR U+6603 +ENCODING 26115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0000 +1FFC +1080 +1080 +11C0 +2140 +2630 +580C +0000 +ENDCHAR +STARTCHAR U+6604 +ENCODING 26116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00FF +7C80 +4480 +4480 +44FE +44A2 +7CA2 +44B6 +4494 +449C +4488 +7D9C +0114 +0336 +0063 +ENDCHAR +STARTCHAR U+6605 +ENCODING 26117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07FE +0104 +7908 +4910 +4920 +797E +4902 +4922 +4914 +7908 +4914 +0222 +0441 +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+6606 +ENCODING 26118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1FF0 +1010 +1FF0 +1080 +1098 +1FE0 +1080 +1084 +1E84 +607C +0000 +ENDCHAR +STARTCHAR U+6607 +ENCODING 26119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0340 +3C40 +0440 +7FFC +0440 +0840 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+6608 +ENCODING 26120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +001C +F9F0 +8900 +89FF +8901 +8901 +F901 +89FF +8900 +8900 +8900 +F900 +0300 +0200 +0600 +ENDCHAR +STARTCHAR U+6609 +ENCODING 26121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7C40 +47FF +4440 +4440 +7C40 +447E +4482 +4482 +7C82 +4502 +4102 +0202 +0404 +1818 +ENDCHAR +STARTCHAR U+660A +ENCODING 26122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0000 +7FFC +0100 +3FF8 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+660B +ENCODING 26123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +1FF8 +0080 +0080 +7FFF +0220 +0410 +0808 +1FFC +680B +0FF8 +0808 +0FF8 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+660C +ENCODING 26124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +3FF8 +2008 +3FF8 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+660D +ENCODING 26125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +4242 +4242 +4242 +4242 +7E7E +4242 +4242 +4242 +4242 +4242 +4242 +7E7E +0000 +ENDCHAR +STARTCHAR U+660E +ENCODING 26126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7CF8 +4488 +4488 +4488 +7CF8 +4488 +4488 +4488 +7CF8 +4508 +4108 +0208 +0418 +0000 +ENDCHAR +STARTCHAR U+660F +ENCODING 26127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0070 +0F80 +0880 +0FFC +0840 +0F24 +701C +0FF4 +0810 +0FF0 +0810 +0810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+6610 +ENCODING 26128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00F8 +7808 +4908 +4904 +4A02 +4801 +7FFC +4884 +4884 +4884 +7904 +4904 +4208 +0408 +1870 +ENDCHAR +STARTCHAR U+6611 +ENCODING 26129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7850 +4850 +4888 +4904 +4AFA +7C01 +4800 +49FC +4804 +4808 +7808 +0010 +0010 +0020 +ENDCHAR +STARTCHAR U+6612 +ENCODING 26130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +F900 +89FF +8949 +8B49 +8A49 +F849 +88D9 +8891 +8991 +8B31 +F821 +0063 +00C2 +000E +ENDCHAR +STARTCHAR U+6613 +ENCODING 26131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0200 +07F8 +1928 +6248 +0C88 +3108 +0610 +00E0 +0000 +ENDCHAR +STARTCHAR U+6614 +ENCODING 26132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +3FF8 +0440 +0440 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+6615 +ENCODING 26133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +041C +7FE0 +4500 +4500 +4504 +45FE +7D10 +4510 +4510 +4510 +4510 +7D10 +4110 +0210 +0410 +ENDCHAR +STARTCHAR U+6616 +ENCODING 26134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F88C +8984 +8906 +8902 +8B43 +F840 +8840 +8840 +88C4 +8884 +F884 +009E +00F2 +0383 +ENDCHAR +STARTCHAR U+6619 +ENCODING 26137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1FF0 +1010 +1FF0 +0000 +3FF8 +0000 +0004 +FFFE +0200 +0440 +0820 +1FF0 +0010 +ENDCHAR +STARTCHAR U+661C +ENCODING 26140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0000 +7FFC +0800 +0FF8 +1248 +2248 +0488 +0930 +0000 +ENDCHAR +STARTCHAR U+661D +ENCODING 26141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1E40 +2260 +3458 +4840 +1646 +21FC +4010 +9FF8 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+661E +ENCODING 26142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FF +0020 +7820 +4820 +4BFE +4A22 +4A22 +7A52 +4A8A +4B0A +4A02 +4A02 +7A02 +4A02 +0206 +ENDCHAR +STARTCHAR U+661F +ENCODING 26143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0900 +0900 +1FF8 +2100 +0FE0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+6620 +ENCODING 26144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4BF8 +4A48 +4A48 +7A48 +4FFC +4840 +48A0 +78A0 +4910 +0208 +0C04 +0000 +ENDCHAR +STARTCHAR U+6621 +ENCODING 26145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F820 +8BFF +8840 +88C0 +8888 +F988 +8B18 +89F0 +8820 +8864 +F8C6 +0082 +01FF +0701 +ENDCHAR +STARTCHAR U+6622 +ENCODING 26146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +FA22 +8A22 +8A22 +8A22 +8BFE +F820 +8820 +8820 +8A22 +8A22 +FA22 +0222 +03FE +0000 +ENDCHAR +STARTCHAR U+6623 +ENCODING 26147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F8D8 +898C +8B06 +8E23 +8860 +F8C4 +8B8C +8818 +8871 +8BC3 +F806 +001C +0070 +03C0 +ENDCHAR +STARTCHAR U+6624 +ENCODING 26148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F8D8 +898C +8B06 +8EFB +8800 +F800 +8BFE +8842 +8842 +8842 +F842 +004E +0040 +0040 +ENDCHAR +STARTCHAR U+6625 +ENCODING 26149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +1FF0 +0280 +7FFC +0440 +1FF0 +682C +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+6626 +ENCODING 26150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +0100 +FFFF +0660 +0C30 +381C +E427 +0420 +0420 +0C20 +1820 +ENDCHAR +STARTCHAR U+6627 +ENCODING 26151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4BF8 +4840 +4840 +7FFC +48E0 +48E0 +4950 +7A48 +4C44 +4840 +0040 +0000 +ENDCHAR +STARTCHAR U+6628 +ENCODING 26152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7900 +49FC +4A40 +4A40 +7C7C +4840 +4840 +487C +7840 +4840 +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+6629 +ENCODING 26153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F820 +8FFF +8820 +8820 +8820 +FBFE +88A8 +88A8 +88A8 +89AC +F924 +0326 +0623 +0020 +ENDCHAR +STARTCHAR U+662A +ENCODING 26154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +0600 +0C10 +18F8 +7F8E +0420 +FFFF +0420 +0C20 +1820 +3020 +ENDCHAR +STARTCHAR U+662B +ENCODING 26155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +F880 +89FF +8901 +8B01 +88F9 +F889 +8889 +8889 +8889 +88F9 +F801 +0001 +0003 +000E +ENDCHAR +STARTCHAR U+662C +ENCODING 26156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FF8 +2008 +3FF8 +2100 +3FFC +2080 +2062 +7C1E +0000 +1FF8 +1008 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+662D +ENCODING 26157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7888 +4888 +4888 +4908 +7930 +4A00 +49F8 +4908 +7908 +4908 +41F8 +0108 +0000 +ENDCHAR +STARTCHAR U+662E +ENCODING 26158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +0040 +FC40 +13FE +1042 +1042 +1CC2 +7082 +C086 +0184 +030C +ENDCHAR +STARTCHAR U+662F +ENCODING 26159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0000 +7FFC +0900 +09F0 +0900 +1500 +2300 +40FC +0000 +ENDCHAR +STARTCHAR U+6630 +ENCODING 26160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +0000 +7FFF +0080 +0880 +08FC +0880 +0880 +7FFF +0000 +ENDCHAR +STARTCHAR U+6631 +ENCODING 26161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +0200 +0108 +7FFC +0820 +0420 +0444 +FFFE +0000 +ENDCHAR +STARTCHAR U+6632 +ENCODING 26162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +03FE +7892 +4892 +4BFE +4A90 +7A90 +4BFF +4891 +4891 +4891 +7916 +4A10 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+6633 +ENCODING 26163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0120 +F920 +8BFE +8A20 +8A20 +8820 +F820 +8BFF +8850 +8850 +88D8 +F888 +018C +0306 +0603 +ENDCHAR +STARTCHAR U+6634 +ENCODING 26164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0200 +3CF8 +2288 +2288 +2E88 +72F0 +0480 +0880 +0000 +ENDCHAR +STARTCHAR U+6635 +ENCODING 26165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7A08 +4A08 +4BF8 +4A08 +7A80 +4A88 +4A90 +4AE0 +7A80 +4C84 +4484 +087C +0000 +ENDCHAR +STARTCHAR U+6636 +ENCODING 26166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7E78 +0048 +3C48 +0578 +0548 +7E48 +0E48 +0D78 +1548 +1480 +2460 +441C +0C00 +0000 +ENDCHAR +STARTCHAR U+6637 +ENCODING 26167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +0810 +0810 +0FF0 +0810 +0810 +0FF0 +0000 +0000 +3FFC +2244 +2244 +2244 +2244 +FFFF +ENDCHAR +STARTCHAR U+6639 +ENCODING 26169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00C0 +0070 +F810 +8800 +89E0 +8820 +8822 +FBB6 +88BC +88A8 +88A8 +89AC +F924 +0326 +0623 +00E0 +ENDCHAR +STARTCHAR U+663A +ENCODING 26170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1004 +1FFC +1004 +1FFC +0000 +7FFF +0080 +0080 +3FFE +2142 +2222 +241A +380E +2002 +2006 +ENDCHAR +STARTCHAR U+663B +ENCODING 26171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +0000 +7F7E +0842 +0842 +0842 +0F42 +704E +0040 +0040 +ENDCHAR +STARTCHAR U+663C +ENCODING 26172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0810 +0FF0 +0890 +0840 +17E0 +1450 +27C8 +4444 +07C0 +0000 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+663E +ENCODING 26174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +1450 +4444 +344C +1450 +0440 +0444 +FFFE +0000 +ENDCHAR +STARTCHAR U+663F +ENCODING 26175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4BFC +4A00 +4A20 +7A20 +4A20 +4A40 +4A50 +7A88 +4498 +07E4 +0804 +0000 +ENDCHAR +STARTCHAR U+6640 +ENCODING 26176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0090 +F492 +9696 +929C +9090 +9090 +F090 +909C +9396 +9692 +9090 +F190 +0111 +0313 +060E +ENDCHAR +STARTCHAR U+6641 +ENCODING 26177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0290 +1290 +0AE0 +0AA0 +1C90 +6494 +0884 +107C +0000 +ENDCHAR +STARTCHAR U+6642 +ENCODING 26178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4840 +4840 +4FFC +7810 +4810 +4FFC +4910 +7890 +4890 +4010 +0030 +0000 +ENDCHAR +STARTCHAR U+6643 +ENCODING 26179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +1110 +0910 +0920 +7FFC +0280 +0484 +0884 +307C +0000 +ENDCHAR +STARTCHAR U+6644 +ENCODING 26180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7A48 +4948 +4950 +4840 +7FFC +48A0 +48A0 +48A0 +7920 +4924 +0224 +041C +0000 +ENDCHAR +STARTCHAR U+6645 +ENCODING 26181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F800 +8800 +89FC +8904 +8904 +F9FC +8904 +8904 +8904 +89FC +F800 +0000 +07FF +0000 +ENDCHAR +STARTCHAR U+6646 +ENCODING 26182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +FBFE +8820 +8820 +8820 +8FFF +F800 +8820 +8820 +8BFE +8820 +F820 +0020 +07FF +0000 +ENDCHAR +STARTCHAR U+6647 +ENCODING 26183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +0048 +7884 +4902 +4AFD +7800 +4BFF +4880 +48FE +7802 +4802 +0044 +0038 +0000 +0000 +ENDCHAR +STARTCHAR U+6649 +ENCODING 26185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0820 +1450 +3EF8 +0208 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+664A +ENCODING 26186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F840 +8840 +88C4 +889C +8BF6 +F800 +8820 +8820 +8BFE +8820 +F820 +0020 +07FF +0000 +ENDCHAR +STARTCHAR U+664B +ENCODING 26187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +1448 +1450 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+664C +ENCODING 26188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0840 +7C84 +4BFE +4A04 +4A14 +4AFC +7A94 +4A94 +4A94 +4A94 +4AF4 +7A94 +4A04 +0214 +0208 +ENDCHAR +STARTCHAR U+664E +ENCODING 26190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F888 +8888 +8BFE +8888 +8888 +F888 +8888 +8888 +8FFF +8800 +F888 +018C +0306 +0603 +ENDCHAR +STARTCHAR U+664F +ENCODING 26191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0100 +3FFC +2208 +7FF8 +0440 +0F80 +0360 +3C10 +0000 +ENDCHAR +STARTCHAR U+6651 +ENCODING 26193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +0200 +0400 +7FFE +4002 +47E2 +4422 +4422 +4422 +47E2 +4006 +ENDCHAR +STARTCHAR U+6652 +ENCODING 26194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +78A0 +48A0 +4BF8 +4AA8 +7AA8 +4AA8 +4AB8 +4B38 +7A18 +4A08 +43F8 +0208 +0000 +ENDCHAR +STARTCHAR U+6653 +ENCODING 26195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0888 +7CFC +4F80 +4850 +4822 +78D2 +4B0E +4800 +4BFC +48A0 +78A0 +4922 +0122 +021E +0C00 +ENDCHAR +STARTCHAR U+6654 +ENCODING 26196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +08A4 +7D2C +4930 +4B20 +4D62 +49A2 +791E +4940 +4844 +4FFE +4840 +7840 +4840 +0040 +0040 +ENDCHAR +STARTCHAR U+6655 +ENCODING 26197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +1010 +1FF0 +1010 +1FF0 +0000 +7FFE +4202 +9FF4 +0400 +0900 +1FF0 +0100 +7FFC +0100 +0100 +ENDCHAR +STARTCHAR U+6656 +ENCODING 26198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +7A02 +4A44 +4840 +4BFC +4880 +7928 +4BFC +4820 +4824 +4BFE +7820 +4820 +0020 +0020 +ENDCHAR +STARTCHAR U+6657 +ENCODING 26199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7CA0 +48A0 +4990 +4A4E +4C04 +7BF0 +4820 +4848 +4BFC +4A08 +7A08 +4A08 +03F8 +0208 +ENDCHAR +STARTCHAR U+6658 +ENCODING 26200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FE +F902 +89FE +8902 +89FE +8800 +F9FE +8820 +8820 +8BFF +8820 +F820 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+6659 +ENCODING 26201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0044 +789E +4BE9 +4848 +4849 +788F +4F40 +4840 +48FE +7944 +4A28 +0C10 +0030 +00CC +0703 +ENDCHAR +STARTCHAR U+665A +ENCODING 26202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0880 +7DF8 +4A10 +4C24 +4BFE +4A44 +7A44 +4A44 +4BFC +4A64 +48A0 +78A2 +4922 +021E +0400 +ENDCHAR +STARTCHAR U+665B +ENCODING 26203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +4904 +4904 +49FC +4904 +7904 +49FC +4904 +4904 +49FC +7890 +4891 +0111 +021F +0C00 +ENDCHAR +STARTCHAR U+665C +ENCODING 26204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF8 +1008 +1FF8 +1008 +1FF8 +0810 +0420 +7FFC +0104 +7FFC +4100 +7FFF +0501 +0D01 +3903 +E10E +ENDCHAR +STARTCHAR U+665D +ENCODING 26205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0110 +7FFC +1FF0 +0FE0 +0100 +3FF8 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +0000 +ENDCHAR +STARTCHAR U+665E +ENCODING 26206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +01D0 +7870 +4B88 +4880 +4FFC +7940 +4BF8 +4E48 +4A48 +7A48 +4A48 +0270 +0040 +0000 +ENDCHAR +STARTCHAR U+665F +ENCODING 26207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0088 +3FFC +2080 +3E48 +2450 +2424 +38D4 +430C +0000 +ENDCHAR +STARTCHAR U+6660 +ENCODING 26208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +0016 +F812 +8BFF +8A10 +8A10 +8BD2 +FA52 +8A56 +8A5C +8A4C +8A48 +FA5C +06D5 +0437 +0C62 +ENDCHAR +STARTCHAR U+6661 +ENCODING 26209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +0048 +7840 +4FFE +4848 +4BFC +4A48 +7A48 +4BF8 +4A48 +4A48 +4BF8 +7A48 +4A48 +0268 +0250 +ENDCHAR +STARTCHAR U+6662 +ENCODING 26210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08E0 +7F80 +08FC +0E90 +7890 +0910 +1A10 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+6664 +ENCODING 26212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7840 +4840 +4BF0 +4890 +7890 +4FFC +4800 +49F8 +7908 +4908 +01F8 +0108 +0000 +ENDCHAR +STARTCHAR U+6665 +ENCODING 26213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7BFF +4A01 +4800 +49FC +7800 +4800 +4FFF +4848 +7848 +4848 +0088 +0109 +020F +0C00 +ENDCHAR +STARTCHAR U+6666 +ENCODING 26214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +79FC +4A00 +4DF0 +4950 +7950 +4FFC +4A50 +4A50 +7BFC +4A10 +4010 +0060 +0000 +ENDCHAR +STARTCHAR U+6667 +ENCODING 26215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0140 +7940 +49F8 +4A40 +4C40 +7FFC +4840 +4BF0 +4A10 +7A10 +4A10 +03F0 +0210 +0000 +ENDCHAR +STARTCHAR U+6668 +ENCODING 26216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +3FF8 +2000 +2FF0 +2000 +3FFC +2490 +2660 +5C1C +0000 +ENDCHAR +STARTCHAR U+6669 +ENCODING 26217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +00F0 +7920 +4A40 +4FF8 +4A48 +7A48 +4BF8 +4AA8 +48A0 +7920 +4924 +4224 +041C +0000 +ENDCHAR +STARTCHAR U+666A +ENCODING 26218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0090 +F890 +8BFE +8A92 +8A92 +8A92 +FBFE +8A92 +8A92 +8A92 +8FFF +F800 +0088 +018C +0306 +ENDCHAR +STARTCHAR U+666B +ENCODING 26219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +783F +4820 +4820 +4BFE +7A02 +4BFE +4A02 +4BFE +4820 +7820 +4FFF +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+666C +ENCODING 26220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +FBFE +8800 +8904 +8904 +8B8C +FADA +8C01 +8820 +8FFF +8820 +F820 +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+666E +ENCODING 26222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +3FF8 +2290 +1290 +12A0 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+666F +ENCODING 26223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0100 +7FFC +0FE0 +0820 +0FE0 +0560 +0910 +3308 +0000 +ENDCHAR +STARTCHAR U+6670 +ENCODING 26224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0104 +0108 +7930 +4FE0 +4920 +49BC +7B68 +4B68 +4B28 +4D28 +7D48 +4948 +0188 +0108 +0000 +ENDCHAR +STARTCHAR U+6671 +ENCODING 26225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0124 +0124 +78A8 +4820 +4850 +4B8E +7820 +4924 +4924 +48A8 +7820 +4850 +038E +0000 +0000 +ENDCHAR +STARTCHAR U+6672 +ENCODING 26226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +009C +7904 +4B04 +49DC +4904 +7904 +49FC +4850 +4850 +4850 +7891 +4911 +021F +0000 +0000 +ENDCHAR +STARTCHAR U+6673 +ENCODING 26227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080E +0870 +7F40 +0840 +1C7F +2A44 +2844 +4884 +0904 +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +ENDCHAR +STARTCHAR U+6674 +ENCODING 26228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7840 +49F0 +4840 +4FFC +7800 +49F0 +4910 +49F0 +7910 +49F0 +4110 +0130 +0000 +ENDCHAR +STARTCHAR U+6675 +ENCODING 26229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0720 +7C20 +407F +7E44 +42CC +4228 +7E38 +406C +40C6 +C003 +9FF8 +1008 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+6676 +ENCODING 26230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +1020 +1FE0 +1020 +1FE0 +1020 +0000 +7CF8 +4488 +7CF8 +4488 +7CF8 +4488 +0000 +ENDCHAR +STARTCHAR U+6677 +ENCODING 26231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +1010 +1FF0 +1010 +1FF0 +0840 +1F60 +2258 +D440 +0846 +37FC +C008 +1FFC +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+6678 +ENCODING 26232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF8 +0808 +0FF8 +0808 +0FF8 +0020 +7F20 +087F +0842 +2FA4 +2918 +2810 +2F28 +70C4 +0303 +ENDCHAR +STARTCHAR U+6679 +ENCODING 26233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +0104 +F904 +89FC +8904 +8904 +89FC +F880 +89FF +8B29 +8E29 +8849 +F991 +0021 +00C3 +000E +ENDCHAR +STARTCHAR U+667A +ENCODING 26234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1000 +1FF8 +2488 +7F88 +0C88 +0AF8 +1288 +2FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+667B +ENCODING 26235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +FBFF +8888 +88A8 +8924 +8BFE +FD25 +8924 +89FC +8924 +8924 +F9FC +0021 +0033 +001E +ENDCHAR +STARTCHAR U+667C +ENCODING 26236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +FBFE +8A02 +8A02 +8900 +89DE +FB52 +8A52 +8E52 +8952 +88D6 +F890 +0191 +031B +060E +ENDCHAR +STARTCHAR U+667E +ENCODING 26238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0040 +7844 +4FFE +4808 +4BFC +4A08 +7A08 +4A08 +4BF8 +4840 +4950 +7A4C +4444 +0940 +0080 +ENDCHAR +STARTCHAR U+667F +ENCODING 26239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FE +F902 +8902 +89FE +8902 +8902 +F9FE +8800 +8BFF +8A01 +8A01 +FBFF +0201 +0201 +03FF +ENDCHAR +STARTCHAR U+6680 +ENCODING 26240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +0330 +F210 +94FF +9910 +9110 +9310 +F210 +967E +9A10 +9210 +9210 +F210 +0210 +02FF +0200 +ENDCHAR +STARTCHAR U+6681 +ENCODING 26241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4840 +4950 +4FFC +7910 +4910 +4FFC +48A0 +78A0 +4924 +4224 +0C1C +0000 +ENDCHAR +STARTCHAR U+6682 +ENCODING 26242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +7EF0 +1080 +2884 +7EFE +0890 +FE90 +0910 +0A10 +0010 +1FF8 +1010 +1FF0 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+6683 +ENCODING 26243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +0280 +7EFC +0280 +3EF8 +0280 +0EFC +7480 +0880 +0000 +ENDCHAR +STARTCHAR U+6684 +ENCODING 26244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BFC +4A08 +4FF8 +4800 +79F0 +4910 +49F0 +4910 +79F0 +4800 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+6686 +ENCODING 26246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7888 +4FDF +4A20 +4A14 +7BD4 +4A7F +4A55 +4A55 +7A54 +0250 +0450 +0051 +00DF +0000 +0000 +ENDCHAR +STARTCHAR U+6687 +ENCODING 26247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07B8 +7488 +5488 +57B8 +5488 +7400 +5778 +5448 +5428 +7730 +5410 +4428 +04C4 +0000 +ENDCHAR +STARTCHAR U+6688 +ENCODING 26248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0FE0 +3FFC +2108 +7FF8 +0FE0 +0FE0 +0920 +0FE0 +7FFC +0100 +0000 +ENDCHAR +STARTCHAR U+6689 +ENCODING 26249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7A48 +4FF8 +4840 +4BF8 +7A48 +4BF8 +4A48 +4BF8 +7840 +4FFC +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+668A +ENCODING 26250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +0010 +7C20 +44FE +4482 +44FE +7C82 +44FE +4482 +4482 +44FE +7C44 +4482 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+668B +ENCODING 26251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7E40 +427E +7EC4 +48A4 +7F28 +4410 +5228 +6146 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+668C +ENCODING 26252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0BA8 +7CB4 +4AA8 +4910 +4910 +4A0E +7DF4 +4840 +4844 +4FFE +4840 +78A0 +4910 +020C +0404 +ENDCHAR +STARTCHAR U+668D +ENCODING 26253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +0104 +F904 +89FC +8904 +8904 +89FC +F880 +89FF +8B01 +8F31 +89E1 +F901 +0111 +00F3 +000E +ENDCHAR +STARTCHAR U+668E +ENCODING 26254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +7FFC +4950 +4840 +4BF8 +7A48 +4A48 +4A48 +4FFC +7840 +48A0 +0310 +0C0C +0000 +ENDCHAR +STARTCHAR U+6690 +ENCODING 26256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +01FE +7842 +4FFF +4800 +49FE +7902 +49FE +4810 +4BFE +7910 +4910 +07FF +0010 +0010 +ENDCHAR +STARTCHAR U+6691 +ENCODING 26257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1FF0 +0110 +1FE0 +0140 +7FFC +07E0 +1FE0 +6420 +07E0 +0420 +0000 +ENDCHAR +STARTCHAR U+6692 +ENCODING 26258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FE +F902 +89FE +8902 +8902 +89FE +F820 +8920 +89FE +8B20 +8A20 +F8FC +0020 +0020 +03FF +ENDCHAR +STARTCHAR U+6694 +ENCODING 26260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +7840 +4880 +4BFF +4A89 +7A51 +4BFD +4A21 +4A21 +7BFD +4A21 +0225 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+6695 +ENCODING 26261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +7820 +4BFE +4A22 +4AAA +7BFE +4820 +4870 +48A8 +7924 +4A22 +0421 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+6696 +ENCODING 26262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +07E4 +7A48 +4930 +4BF8 +4880 +7FFC +4880 +49F0 +4910 +7AA0 +4C40 +09B0 +160C +0000 +ENDCHAR +STARTCHAR U+6697 +ENCODING 26263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7BF8 +4910 +48A0 +4FFC +7800 +49F0 +4910 +49F0 +7910 +4910 +41F0 +0110 +0000 +ENDCHAR +STARTCHAR U+6698 +ENCODING 26264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F0 +7910 +49F0 +4910 +49F0 +7800 +4FFC +4900 +4BF8 +7CA8 +4928 +0248 +00B0 +0000 +ENDCHAR +STARTCHAR U+6699 +ENCODING 26265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +FBFE +8820 +89FC +8850 +8FFF +F888 +8904 +8BFE +8D05 +8904 +F9FC +0104 +0104 +01FC +ENDCHAR +STARTCHAR U+669A +ENCODING 26266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +007C +F8C4 +8BAC +8858 +8830 +88E0 +FB80 +88FE +8920 +8820 +8BFF +F820 +0122 +0122 +01FE +ENDCHAR +STARTCHAR U+669B +ENCODING 26267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0088 +FBFE +8820 +8820 +89FC +8820 +F820 +8FFF +8880 +8880 +89FE +F910 +0210 +0410 +01FF +ENDCHAR +STARTCHAR U+669C +ENCODING 26268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +FEFF +4442 +4442 +6C66 +2824 +FEFF +0000 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+669D +ENCODING 26269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7A08 +4DF0 +4910 +49F0 +7910 +49F0 +4840 +4FFC +7800 +4890 +0108 +0608 +0000 +ENDCHAR +STARTCHAR U+669F +ENCODING 26271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0122 +F922 +89FE +8800 +8BFF +8800 +F9FE +8902 +8902 +89FE +8884 +F8CC +0048 +03FF +0000 +ENDCHAR +STARTCHAR U+66A0 +ENCODING 26272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1004 +1FFC +1004 +1FFC +0080 +7FFF +0FF8 +0808 +0FF8 +3FFE +2002 +27F2 +2412 +27F2 +200E +ENDCHAR +STARTCHAR U+66A1 +ENCODING 26273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0124 +7A42 +4C89 +49FC +4804 +7800 +4FDF +4841 +4F5D +7841 +4FDF +0041 +038E +0000 +0000 +ENDCHAR +STARTCHAR U+66A2 +ENCODING 26274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +5510 +7DF0 +5400 +7FFC +5500 +53F8 +14A8 +1128 +1248 +10B0 +0000 +ENDCHAR +STARTCHAR U+66A4 +ENCODING 26276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0040 +F9FE +8902 +89FE +8902 +89FE +F820 +8BFF +8888 +898C +8B26 +FA23 +01FC +0020 +0020 +ENDCHAR +STARTCHAR U+66A6 +ENCODING 26278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2220 +3FFC +2730 +2AE8 +32A4 +2220 +27F0 +2410 +27F0 +4410 +47F0 +0410 +0000 +ENDCHAR +STARTCHAR U+66A7 +ENCODING 26279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001C +0BE0 +7D24 +48A8 +4FFE +4C42 +4844 +7BFE +4880 +48F8 +4908 +4950 +7A20 +4C50 +018E +0604 +ENDCHAR +STARTCHAR U+66A8 +ENCODING 26280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DF8 +4420 +7D24 +45FE +7C20 +4852 +5C92 +630E +1FF0 +1010 +1FF0 +1010 +1FF0 +0004 +FFFE +0000 +ENDCHAR +STARTCHAR U+66A9 +ENCODING 26281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +03FF +7E52 +498C +4904 +4A03 +7DFC +4800 +4BFE +4820 +78A8 +4B26 +0060 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+66AA +ENCODING 26282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +0044 +01FF +7C44 +447C +4410 +45FF +7D11 +4599 +4555 +4577 +7D99 +4511 +0107 +0000 +0000 +ENDCHAR +STARTCHAR U+66AB +ENCODING 26283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +7FE0 +3E80 +2AFC +3E90 +3E90 +7F90 +0910 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+66AD +ENCODING 26285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0040 +F9FE +8902 +89FE +8902 +89FE +F800 +89AE +8820 +89AE +8820 +FBFF +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+66AE +ENCODING 26286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0820 +0FE0 +0FE0 +7FFC +07C0 +1C70 +67CC +0440 +07C0 +0440 +0000 +ENDCHAR +STARTCHAR U+66AF +ENCODING 26287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +0044 +7DEF +4444 +44FE +4482 +7CFE +4482 +44FE +4410 +7DFF +4428 +0044 +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+66B0 +ENCODING 26288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0244 +0244 +7CAA +4911 +4910 +4A10 +7E10 +4A5E +4A50 +4A50 +7A50 +4A70 +0250 +028F +0000 +0000 +ENDCHAR +STARTCHAR U+66B1 +ENCODING 26289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FF +FA00 +8A44 +8AFE +8A44 +8A20 +FBFF +8A40 +8AFE +8B42 +8A42 +FA7E +0200 +03FF +0000 +ENDCHAR +STARTCHAR U+66B2 +ENCODING 26290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7BFE +4904 +4888 +4FFF +7800 +4BFE +4A02 +4BFE +4A02 +7BFE +4820 +07FF +0020 +0020 +ENDCHAR +STARTCHAR U+66B3 +ENCODING 26291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7108 +57FF +5108 +57DE +5108 +71FF +5F08 +5108 +5108 +53FC +5004 +7FFF +5004 +03FC +0004 +ENDCHAR +STARTCHAR U+66B4 +ENCODING 26292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +3FF8 +0440 +7FFC +0920 +1550 +67CC +1930 +0300 +0000 +ENDCHAR +STARTCHAR U+66B5 +ENCODING 26293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +07FF +F888 +88F8 +8820 +8BFE +8A22 +FBFE +8820 +89FC +8820 +8FFF +F850 +00D8 +018C +0707 +ENDCHAR +STARTCHAR U+66B7 +ENCODING 26295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +0010 +7CFE +4492 +44FE +4492 +7CFE +4411 +45FF +4404 +7DFF +4444 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+66B8 +ENCODING 26296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +07FC +7A48 +49B0 +4B18 +4DF4 +7910 +49F0 +4910 +49F0 +7950 +4248 +0448 +00C0 +0000 +ENDCHAR +STARTCHAR U+66B9 +ENCODING 26297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +23F8 +13F8 +1110 +01FC +7320 +15F8 +11F8 +1120 +19FC +2700 +41FC +0000 +ENDCHAR +STARTCHAR U+66BA +ENCODING 26298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +7D29 +45EF +4400 +44FE +4492 +7CFE +4492 +44FE +4410 +45FF +7C10 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+66BB +ENCODING 26299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +7904 +49FC +4904 +49FC +4820 +7FFF +4800 +49FC +4904 +4904 +49FC +7820 +0124 +0222 +0060 +ENDCHAR +STARTCHAR U+66BC +ENCODING 26300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +2A40 +497C +7FC8 +4948 +5D30 +6B30 +49C8 +1FF4 +1010 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+66BD +ENCODING 26301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0092 +7C54 +4438 +45FF +4454 +4492 +7D11 +4442 +44EF +452A +44AA +7C4F +0082 +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+66BE +ENCODING 26302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0120 +7FE0 +483C +4BC8 +4AE8 +7BA8 +4828 +4FF0 +4890 +7998 +4F28 +0144 +0384 +0000 +ENDCHAR +STARTCHAR U+66BF +ENCODING 26303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +FC10 +84FE +8400 +84FE +8482 +FCFE +8444 +8428 +85FF +8400 +FCFE +0082 +0082 +00FE +ENDCHAR +STARTCHAR U+66C0 +ENCODING 26304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +FBFF +8820 +89FC +8800 +8BFE +FA02 +8AFA +8800 +89FC +8904 +F9FC +0088 +0050 +07FF +ENDCHAR +STARTCHAR U+66C1 +ENCODING 26305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +3EF8 +2290 +3FFC +3E30 +26D4 +390C +1FE0 +0420 +07E0 +0420 +07E0 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+66C2 +ENCODING 26306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +FBFE +8888 +88F8 +8800 +8FFF +F820 +8BFE +8A22 +8BFE +8A22 +FA22 +03FE +0104 +0603 +ENDCHAR +STARTCHAR U+66C3 +ENCODING 26307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0410 +F6FE +9212 +90FF +9012 +90FE +FE10 +9292 +9256 +927C +92D6 +F293 +0630 +0500 +0CFF +ENDCHAR +STARTCHAR U+66C4 +ENCODING 26308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +07FC +7910 +4BF8 +4950 +4950 +7FFC +4950 +4950 +4BF8 +7840 +4FFC +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+66C6 +ENCODING 26310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2000 +238E +2E38 +2208 +3FFF +271C +2AAA +3249 +2208 +27FC +2404 +27FC +4404 +47FC +ENDCHAR +STARTCHAR U+66C7 +ENCODING 26311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FE0 +0820 +0FE0 +0FE0 +3FF8 +0100 +3FFC +2D68 +4D60 +1FF0 +0000 +7FFC +0460 +3F90 +0000 +ENDCHAR +STARTCHAR U+66C8 +ENCODING 26312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +FBFE +8904 +8888 +8FFF +8800 +F9FC +8924 +89FC +8924 +89FC +F820 +03FE +0020 +07FF +ENDCHAR +STARTCHAR U+66C9 +ENCODING 26313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7840 +4FFC +4910 +4FBC +7910 +49BC +4E00 +4BF8 +78A0 +40A4 +0124 +061C +0000 +ENDCHAR +STARTCHAR U+66CA +ENCODING 26314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +01FE +7C4A +47FE +4648 +47FF +448B +7DFE +4502 +45FE +45FE +4502 +7DFE +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+66CB +ENCODING 26315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +7C44 +45FF +4545 +45FF +4400 +7CFE +4482 +44FE +4482 +44FE +7C10 +45FF +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+66CC +ENCODING 26316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +7C82 +44FE +4482 +7CFE +4482 +4582 +7D06 +0100 +7FFE +4642 +187C +2000 +3FFC +0100 +FFFF +ENDCHAR +STARTCHAR U+66CE +ENCODING 26318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +FA92 +8BFE +8820 +8BFE +8820 +FFFF +8904 +8888 +8BFE +8820 +F9FC +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+66CF +ENCODING 26319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF8 +1008 +1FF8 +1008 +1FF8 +2100 +67DF +D451 +B7D2 +6454 +47D6 +F411 +1791 +3417 +6450 +C3D0 +ENDCHAR +STARTCHAR U+66D2 +ENCODING 26322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +07C8 +7A5F +4BE2 +4A42 +4BC2 +7912 +4BD2 +4912 +49D2 +794A +0244 +044A +0191 +0000 +0000 +ENDCHAR +STARTCHAR U+66D4 +ENCODING 26324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0290 +0290 +F7D0 +929F +92B2 +9422 +97D2 +F856 +9754 +9554 +955C +9548 +F75C +00D4 +0096 +01A3 +ENDCHAR +STARTCHAR U+66D6 +ENCODING 26326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +03E8 +7A48 +4910 +4BFC +4A68 +7D98 +49F4 +4A40 +48F8 +7B90 +4860 +00F0 +070C +0000 +ENDCHAR +STARTCHAR U+66D8 +ENCODING 26328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +0020 +7BFE +4AAA +4A72 +4AAA +7800 +4BFE +4880 +4BFE +7A52 +0252 +0252 +0206 +0000 +0000 +ENDCHAR +STARTCHAR U+66D9 +ENCODING 26329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7AA8 +4BF8 +4844 +4BF8 +7850 +4FFC +48F8 +4B88 +7CF8 +4888 +40F8 +0088 +0000 +ENDCHAR +STARTCHAR U+66DA +ENCODING 26330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +07FC +7910 +4BFC +4AE8 +4C00 +7FFC +48C8 +4F68 +48B0 +7B70 +48A8 +0724 +00C0 +0000 +ENDCHAR +STARTCHAR U+66DB +ENCODING 26331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001C +07E0 +7044 +5FFE +5040 +57FC +5554 +7554 +57FC +5040 +57FC +5040 +7FFE +5524 +0492 +0892 +ENDCHAR +STARTCHAR U+66DC +ENCODING 26332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F8 +7888 +4BB8 +4888 +4FF8 +7920 +4BF8 +4E40 +4BF0 +7A40 +4BF0 +4240 +03F8 +0000 +ENDCHAR +STARTCHAR U+66DD +ENCODING 26333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +79F0 +4910 +49F0 +49F0 +78A0 +4BF8 +48A0 +4FFC +4950 +7B58 +4CE4 +4358 +00C0 +0000 +ENDCHAR +STARTCHAR U+66DE +ENCODING 26334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +7A24 +4AFF +4A24 +4A7E +4A4A +7A7E +4A4A +4A7E +4A08 +4AFF +7A89 +4CBD +0087 +0000 +0000 +ENDCHAR +STARTCHAR U+66DF +ENCODING 26335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF0 +0810 +0FF0 +0810 +7FFE +4242 +7E7E +4242 +7FFE +27F8 +2000 +3FFE +6908 +49D8 +CF70 +9C1E +ENDCHAR +STARTCHAR U+66E0 +ENCODING 26336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03FC +7A90 +4BFC +4AF0 +4BFC +7A20 +4AF8 +4AA8 +4AF8 +7CA8 +44F8 +08C8 +0304 +0000 +ENDCHAR +STARTCHAR U+66E3 +ENCODING 26339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +0044 +7DFF +4444 +447C +4400 +44BA +7DAB +44AA +44AA +45BB +4400 +7D29 +0129 +0000 +0000 +ENDCHAR +STARTCHAR U+66E4 +ENCODING 26340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +0010 +7DFF +4553 +4535 +4553 +4440 +7CFF +4588 +44FF +4488 +44FF +7C88 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+66E6 +ENCODING 26342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +03F8 +7840 +49F0 +4FFC +4BA8 +7924 +4FFC +4BA8 +4D28 +7FD0 +47B4 +04CC +0184 +0000 +ENDCHAR +STARTCHAR U+66E8 +ENCODING 26344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0110 +FFFF +9450 +929E +9FE2 +901E +F7D0 +945E +97D0 +945E +97D0 +F45E +0450 +0459 +04CF +ENDCHAR +STARTCHAR U+66E9 +ENCODING 26345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF0 +17D0 +1FF0 +0100 +7FFC +1EF0 +1290 +1EF0 +3FF8 +0FE0 +7FFC +0C90 +7760 +1C1C +0000 +ENDCHAR +STARTCHAR U+66EB +ENCODING 26347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +47E8 +D00A +23C4 +4809 +FBDF +23C4 +B256 +ABD5 +2000 +1FF8 +1008 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+66EC +ENCODING 26348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07DF +0000 +F7DF +9451 +9555 +9020 +97FF +F490 +97FE +9492 +97FE +9510 +F5DE +0510 +09D1 +030F +ENDCHAR +STARTCHAR U+66ED +ENCODING 26349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0092 +01FF +0101 +7D7D +4444 +447C +44FE +7CBA +44FE +4410 +44FE +7C10 +01FF +0129 +0000 +0000 +ENDCHAR +STARTCHAR U+66EE +ENCODING 26350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03DE +0252 +F3DE +9000 +97FF +9400 +95E8 +F488 +97FF +9532 +95EA +952E +F5E4 +0D2E +09FB +0231 +ENDCHAR +STARTCHAR U+66F0 +ENCODING 26352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +2010 +2010 +2010 +2010 +3F90 +2010 +2010 +2010 +2010 +3FF0 +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+66F2 +ENCODING 26354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0440 +3FF8 +2448 +2448 +2448 +3FF8 +2448 +2448 +2448 +3FF8 +2008 +2008 +0000 +ENDCHAR +STARTCHAR U+66F3 +ENCODING 26355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF8 +1110 +00A0 +00C0 +0344 +3C34 +000C +0000 +ENDCHAR +STARTCHAR U+66F4 +ENCODING 26356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +1910 +0500 +0300 +04C0 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+66F5 +ENCODING 26357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0110 +1FF0 +1110 +1FD0 +1110 +1110 +1FF8 +1110 +00A0 +00C0 +0344 +3C34 +000C +0000 +ENDCHAR +STARTCHAR U+66F6 +ENCODING 26358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1FFF +6221 +0221 +0421 +0841 +108E +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+66F7 +ENCODING 26359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +1200 +07F8 +1908 +7188 +1248 +1408 +1FE8 +1030 +0000 +ENDCHAR +STARTCHAR U+66F8 +ENCODING 26360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0110 +7FFC +1FF0 +0100 +1FF0 +0100 +7FFC +0FE0 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+66F9 +ENCODING 26361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FF8 +2448 +3FF8 +2448 +3FF8 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+66FA +ENCODING 26362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0080 +3FFE +2082 +3FFE +2082 +3FFE +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +ENDCHAR +STARTCHAR U+66FB +ENCODING 26363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +0000 +1008 +1EFF +7248 +D248 +0E48 +0DFF +3808 +E008 +0008 +ENDCHAR +STARTCHAR U+66FC +ENCODING 26364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +3FF8 +2448 +3FF8 +0FE0 +0240 +0180 +03C0 +3C38 +0000 +ENDCHAR +STARTCHAR U+66FD +ENCODING 26365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +3FF8 +2108 +3FF8 +2108 +3FF8 +2008 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+66FE +ENCODING 26366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +0420 +1810 +7FFC +1550 +1390 +1FF0 +1010 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+66FF +ENCODING 26367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +3EF8 +0820 +7FFC +1430 +1250 +2288 +4FE4 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+6700 +ENCODING 26368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +1200 +1EF8 +1E48 +1230 +1E70 +7388 +0204 +0000 +ENDCHAR +STARTCHAR U+6701 +ENCODING 26369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4848 +4848 +7E7E +1414 +2525 +4747 +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+6703 +ENCODING 26371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1FF0 +600C +1FF0 +1930 +1550 +1FF0 +0FE0 +0820 +0FE0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+6704 +ENCODING 26372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +7C10 +55FF +5593 +7D55 +5539 +55FF +7C10 +1054 +1092 +1111 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6705 +ENCODING 26373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +1082 +FEFE +1082 +1082 +10FE +1040 +FEFF +2181 +2399 +64F1 +4481 +7E89 +C2FB +0206 +ENDCHAR +STARTCHAR U+6707 +ENCODING 26375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1C10 +223F +DDA9 +0029 +FFBF +88A9 +AAA9 +88BF +FF94 +0014 +7F24 +41FF +7F04 +4104 +7F04 +ENDCHAR +STARTCHAR U+6708 +ENCODING 26376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0810 +0810 +0810 +0FF0 +0810 +0810 +0FF0 +0810 +1010 +1010 +2010 +4030 +0000 +ENDCHAR +STARTCHAR U+6709 +ENCODING 26377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +7FFC +0400 +0400 +0FF0 +0C10 +17F0 +2410 +47F0 +0410 +0410 +0410 +0430 +0000 +ENDCHAR +STARTCHAR U+670A +ENCODING 26378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +3FFC +2400 +2400 +2400 +3C04 +27FE +2490 +2490 +3C90 +2490 +2490 +4492 +4512 +960E +0800 +ENDCHAR +STARTCHAR U+670B +ENCODING 26379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1E78 +1248 +1248 +1248 +1E78 +1248 +1248 +1E78 +1248 +1288 +2288 +2308 +4618 +0000 +ENDCHAR +STARTCHAR U+670D +ENCODING 26381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2508 +2508 +2530 +3D00 +25F8 +2588 +3D50 +2550 +2520 +2550 +2588 +4D04 +0000 +ENDCHAR +STARTCHAR U+670E +ENCODING 26382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C70 +44D8 +458C +4707 +7CF8 +4400 +4400 +45FE +7C42 +4442 +4442 +4442 +444E +C440 +9C40 +ENDCHAR +STARTCHAR U+670F +ENCODING 26383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3D24 +2524 +2524 +2524 +3DFC +2524 +2420 +3D24 +2524 +2524 +2524 +25FC +4D04 +0000 +ENDCHAR +STARTCHAR U+6710 +ENCODING 26384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +3E80 +2484 +24FE +2504 +3E04 +24F4 +2494 +2494 +3C94 +2494 +24F4 +4484 +4404 +9414 +0808 +ENDCHAR +STARTCHAR U+6712 +ENCODING 26386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3C10 +2410 +25FF +3D11 +2529 +2545 +3D11 +2529 +2545 +2501 +2501 +2505 +4D02 +0000 +0000 +ENDCHAR +STARTCHAR U+6713 +ENCODING 26387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +7850 +4A52 +4B56 +495C +7950 +4850 +4850 +485C +79D6 +4F52 +4850 +48D0 +4891 +C993 +9B0E +ENDCHAR +STARTCHAR U+6714 +ENCODING 26388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +12F8 +1488 +7F88 +0888 +2AF8 +2A88 +2A88 +3EF8 +2A88 +2888 +0888 +1108 +2218 +0000 +ENDCHAR +STARTCHAR U+6715 +ENCODING 26389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +3D08 +2490 +24A0 +3FF8 +2440 +2440 +3FFC +2440 +24A0 +2490 +2510 +2608 +4C04 +0000 +ENDCHAR +STARTCHAR U+6716 +ENCODING 26390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +25F0 +2510 +2510 +3DF0 +2510 +25F0 +3D48 +2528 +2530 +2510 +25C8 +4F04 +0000 +ENDCHAR +STARTCHAR U+6717 +ENCODING 26391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +3E88 +2288 +2288 +3EF8 +2288 +3E88 +28F8 +2488 +2708 +3908 +6208 +0418 +0000 +ENDCHAR +STARTCHAR U+6718 +ENCODING 26392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C20 +2444 +2482 +25FF +3C45 +2482 +2541 +3C7E +24C4 +2528 +2410 +2444 +4482 +0901 +0000 +0000 +ENDCHAR +STARTCHAR U+6719 +ENCODING 26393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +003E +FFA2 +94A2 +94A2 +94BE +A4A2 +C3A2 +80A2 +9CBE +94A2 +94A2 +FFA2 +0062 +0042 +00CE +ENDCHAR +STARTCHAR U+671B +ENCODING 26395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7F88 +20F8 +2088 +20F8 +1F08 +0230 +3FF8 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+671C +ENCODING 26396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +45FF +4400 +44FE +7C82 +44FE +4400 +44FE +7C04 +4408 +45FF +4410 +4410 +C410 +9C70 +ENDCHAR +STARTCHAR U+671D +ENCODING 26397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7F88 +0888 +3E88 +22F8 +3E88 +2288 +3EF8 +0888 +7F88 +0888 +0908 +0A18 +0000 +ENDCHAR +STARTCHAR U+671E +ENCODING 26398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0440 +07C0 +07C0 +0440 +7FFC +0820 +17D0 +6448 +07C4 +07C0 +0840 +10C0 +0000 +ENDCHAR +STARTCHAR U+671F +ENCODING 26399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1278 +1248 +7FC8 +1278 +1E48 +1248 +1E78 +1248 +7FC8 +1448 +1288 +2288 +4118 +0000 +ENDCHAR +STARTCHAR U+6720 +ENCODING 26400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7C44 +45FF +4444 +4444 +7C10 +44FE +4492 +4492 +7C92 +45FF +4428 +4428 +446C +C4C6 +9D83 +ENDCHAR +STARTCHAR U+6721 +ENCODING 26401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C28 +2492 +24AA +24C6 +3C82 +24FE +2444 +3CA2 +257D +2444 +24A8 +2410 +2428 +4DC7 +0000 +0000 +ENDCHAR +STARTCHAR U+6722 +ENCODING 26402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F7E +4842 +7F7E +4142 +417E +7F42 +4842 +7F86 +0000 +7FFE +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+6723 +ENCODING 26403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4444 +45FF +4400 +7CFE +4492 +44FE +4492 +7CFE +4410 +44FE +4410 +4DFF +0000 +0000 +ENDCHAR +STARTCHAR U+6726 +ENCODING 26406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3FFC +2490 +25FC +2508 +3EF0 +27FC +24C8 +3F68 +24B0 +2770 +24A8 +2724 +4CC0 +0000 +ENDCHAR +STARTCHAR U+6727 +ENCODING 26407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +393C +2FE0 +2AB8 +2A88 +3FF8 +2820 +2BB8 +3AA0 +2BB8 +2AA0 +2BBC +2AA4 +5A9C +0000 +ENDCHAR +STARTCHAR U+6728 +ENCODING 26408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +7FFC +0380 +0380 +0540 +0920 +1110 +2108 +4104 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+672A +ENCODING 26410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1FF0 +0100 +0100 +7FFC +0100 +0380 +0540 +1930 +610C +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+672B +ENCODING 26411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0100 +0100 +1FF0 +0100 +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+672C +ENCODING 26412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +7FFC +0380 +0540 +0540 +0920 +1110 +2FE8 +4104 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+672D +ENCODING 26413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7F40 +0840 +1840 +1C40 +1A40 +2940 +2940 +4840 +0844 +0844 +083C +0000 +ENDCHAR +STARTCHAR U+672E +ENCODING 26414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0108 +0108 +7FFC +0100 +0920 +0920 +0920 +0920 +0920 +1124 +1124 +211C +0100 +0000 +ENDCHAR +STARTCHAR U+672F +ENCODING 26415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0140 +0130 +0110 +0104 +FFFE +0100 +0380 +0540 +0920 +1110 +210E +C104 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+6731 +ENCODING 26417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +0900 +0FF0 +1100 +2100 +7FFC +0380 +0540 +1930 +610C +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+6733 +ENCODING 26419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1038 +1008 +FC08 +1088 +1088 +3888 +3488 +3088 +5088 +5088 +9088 +108C +1184 +1106 +1303 +ENDCHAR +STARTCHAR U+6734 +ENCODING 26420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7F40 +0860 +1850 +1C48 +1A44 +2A44 +2840 +4840 +0840 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+6735 +ENCODING 26421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0FF0 +0820 +0820 +0820 +0820 +311C +0100 +FFFE +0300 +0380 +0540 +0920 +111C +6108 +0100 +ENDCHAR +STARTCHAR U+6736 +ENCODING 26422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FC0 +0440 +0478 +0808 +1008 +2170 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6737 +ENCODING 26423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0888 +7E88 +0888 +1C88 +1A88 +1A88 +2888 +2888 +4908 +0908 +0A08 +0C30 +0000 +ENDCHAR +STARTCHAR U+6738 +ENCODING 26424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FF8 +0848 +1C48 +1A48 +1A48 +2848 +2848 +4888 +0888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+6739 +ENCODING 26425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1048 +7DFC +1048 +1048 +1048 +3848 +5448 +1048 +1089 +1109 +1209 +140F +0000 +0000 +ENDCHAR +STARTCHAR U+673A +ENCODING 26426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F0 +0890 +7F90 +0890 +1C90 +1A90 +1A90 +2890 +2890 +4910 +0914 +0A14 +0C0C +0000 +ENDCHAR +STARTCHAR U+673B +ENCODING 26427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +0841 +0841 +7F41 +0841 +0841 +0841 +1C7F +2A01 +4901 +0801 +0801 +0801 +0801 +0000 +0000 +ENDCHAR +STARTCHAR U+673C +ENCODING 26428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +7C80 +1080 +1080 +10FE +3880 +5480 +1080 +1081 +1081 +1081 +107E +0000 +0000 +ENDCHAR +STARTCHAR U+673D +ENCODING 26429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0840 +7F40 +0840 +1CF8 +1A88 +1A88 +2908 +2808 +4808 +0808 +0808 +0830 +0000 +ENDCHAR +STARTCHAR U+673E +ENCODING 26430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1008 +FE08 +1008 +1008 +3808 +3408 +3208 +5008 +5008 +9008 +1008 +1008 +1008 +1038 +ENDCHAR +STARTCHAR U+673F +ENCODING 26431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +1110 +1110 +1110 +1160 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6740 +ENCODING 26432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0830 +06C0 +0100 +02C0 +0C30 +3108 +0100 +FFFE +0380 +0540 +0920 +111C +6108 +0500 +0200 +ENDCHAR +STARTCHAR U+6741 +ENCODING 26433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +09C0 +0840 +0840 +7E40 +0840 +0C40 +1A40 +1AE0 +18A0 +28A0 +2910 +4910 +0A08 +0C04 +0000 +ENDCHAR +STARTCHAR U+6742 +ENCODING 26434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0420 +3FF0 +0420 +0420 +0824 +0824 +111C +2100 +0104 +FFFE +0100 +0920 +1118 +2508 +0200 +ENDCHAR +STARTCHAR U+6743 +ENCODING 26435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +13F8 +1008 +FE08 +1208 +3108 +3910 +5510 +50A0 +9040 +10A0 +1110 +120E +1404 +1000 +ENDCHAR +STARTCHAR U+6745 +ENCODING 26437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1010 +FE10 +1010 +1010 +3810 +35FF +3210 +5010 +5010 +9010 +1010 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+6746 +ENCODING 26438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0820 +7E20 +0820 +1C20 +1BFC +1A20 +2820 +2820 +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+6747 +ENCODING 26439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1000 +FC00 +1000 +13FF +3880 +3480 +3080 +51FE +5102 +9002 +1006 +1004 +1004 +101C +ENDCHAR +STARTCHAR U+6748 +ENCODING 26440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +13FC +1008 +FC88 +1250 +3150 +3910 +54A0 +50A0 +9040 +10A0 +1120 +1218 +140E +1804 +ENDCHAR +STARTCHAR U+6749 +ENCODING 26441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +0820 +7F40 +0888 +1C08 +1A10 +1A20 +28C4 +2804 +4808 +0810 +0860 +0980 +0000 +ENDCHAR +STARTCHAR U+674B +ENCODING 26443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +7D08 +1108 +1148 +3928 +5508 +1108 +1108 +1108 +1109 +1209 +140F +0000 +0000 +ENDCHAR +STARTCHAR U+674C +ENCODING 26444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +17FE +1090 +FC90 +1090 +3090 +3890 +5490 +5090 +9090 +1110 +1112 +1212 +140E +1800 +ENDCHAR +STARTCHAR U+674D +ENCODING 26445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FE +0804 +0808 +7E10 +0810 +09FF +1C10 +2A10 +4910 +0810 +0810 +0810 +0850 +0820 +0000 +0000 +ENDCHAR +STARTCHAR U+674E +ENCODING 26446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0380 +0540 +1930 +610C +0FE0 +00C0 +0100 +7FFC +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+674F +ENCODING 26447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+6750 +ENCODING 26448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +0810 +7FFC +0810 +1C30 +1A30 +1A50 +2850 +2890 +4910 +0810 +0810 +0830 +0000 +ENDCHAR +STARTCHAR U+6751 +ENCODING 26449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +0810 +7FFC +0810 +1810 +1C90 +1A50 +2A50 +2810 +4810 +0810 +0810 +0830 +0000 +ENDCHAR +STARTCHAR U+6753 +ENCODING 26451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +7FF8 +0908 +1A08 +1C88 +1A48 +2A48 +2808 +4808 +0808 +0808 +0830 +0000 +ENDCHAR +STARTCHAR U+6754 +ENCODING 26452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +10F0 +FE20 +1020 +1020 +3820 +35FF +3220 +5020 +5020 +9020 +1020 +1021 +1033 +101E +ENDCHAR +STARTCHAR U+6755 +ENCODING 26453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FC20 +13FF +1020 +3820 +3420 +3070 +5050 +5050 +90D8 +1088 +118C +1106 +1303 +ENDCHAR +STARTCHAR U+6756 +ENCODING 26454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7FFC +0820 +1D20 +1B20 +1AA0 +28A0 +2860 +4860 +0850 +0988 +0E04 +0000 +ENDCHAR +STARTCHAR U+6757 +ENCODING 26455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFC +1000 +1000 +1FF8 +0100 +0108 +7FFC +0520 +0918 +110C +6104 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+6759 +ENCODING 26457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +0848 +7E40 +087C +1DC0 +1A40 +1A20 +2820 +2820 +4814 +0814 +080C +0804 +0000 +ENDCHAR +STARTCHAR U+675A +ENCODING 26458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1042 +10FF +7D00 +1000 +107C +1004 +3808 +5410 +1020 +1040 +1081 +1101 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+675C +ENCODING 26460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7F20 +0820 +19FC +1C20 +1A20 +2A20 +2820 +4820 +0820 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+675D +ENCODING 26461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1120 +FD26 +113A +1162 +39A2 +3722 +3122 +5126 +5120 +9100 +1100 +1101 +1183 +10FE +ENDCHAR +STARTCHAR U+675E +ENCODING 26462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0808 +7E08 +0808 +1C08 +1BF8 +1B08 +2900 +2900 +4900 +0904 +0904 +08FC +0000 +ENDCHAR +STARTCHAR U+675F +ENCODING 26463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +1110 +1110 +1FF0 +1390 +0340 +0520 +1910 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6760 +ENCODING 26464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +7E20 +0820 +1C20 +1A20 +1A20 +2820 +2820 +4820 +0820 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+6761 +ENCODING 26465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +07E0 +0C40 +3280 +0380 +0D60 +711C +1FF0 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6762 +ENCODING 26466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +1FF0 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+6763 +ENCODING 26467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7E48 +1248 +1A48 +3648 +3648 +3248 +5248 +5248 +13F8 +1208 +1208 +0000 +ENDCHAR +STARTCHAR U+6764 +ENCODING 26468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0840 +7E40 +0840 +1C78 +1A48 +1A48 +2888 +2888 +4908 +0908 +0A08 +0C30 +0000 +ENDCHAR +STARTCHAR U+6765 +ENCODING 26469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0920 +0520 +0540 +7FFC +0100 +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+6766 +ENCODING 26470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +107C +FE44 +10C4 +108C +3988 +3408 +3218 +5010 +5038 +9028 +106C +1044 +10C6 +1183 +ENDCHAR +STARTCHAR U+6768 +ENCODING 26472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13F8 +1010 +1020 +FC40 +1084 +33FE +38A4 +54A4 +50A4 +9124 +1144 +1244 +1484 +1128 +1010 +ENDCHAR +STARTCHAR U+6769 +ENCODING 26473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1010 +13F8 +1010 +FD10 +1110 +3110 +3910 +5514 +51FE +9004 +1024 +17F4 +1004 +1014 +1008 +ENDCHAR +STARTCHAR U+676A +ENCODING 26474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7EB0 +08A8 +1CA4 +1B2C +1A28 +2870 +2810 +4820 +0840 +0980 +0E00 +0000 +ENDCHAR +STARTCHAR U+676C +ENCODING 26476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1000 +FE00 +1000 +1000 +39FF +3448 +3248 +5048 +5048 +9048 +10C8 +1089 +1189 +1307 +ENDCHAR +STARTCHAR U+676D +ENCODING 26477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +0800 +1CF0 +1A90 +1A90 +2890 +2890 +4890 +0914 +0914 +0A0C +0000 +ENDCHAR +STARTCHAR U+676E +ENCODING 26478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FE10 +1010 +1010 +39FF +3511 +3111 +5111 +5111 +9111 +1117 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+676F +ENCODING 26479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +7E20 +0820 +1C70 +1A68 +1AA8 +28A4 +2924 +4A20 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+6770 +ENCODING 26480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0380 +0540 +0920 +1110 +610C +0100 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+6771 +ENCODING 26481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6772 +ENCODING 26482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6773 +ENCODING 26483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0380 +0540 +1930 +610C +0FE0 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+6774 +ENCODING 26484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +FE7F +10D1 +1093 +3992 +3410 +3210 +5038 +5028 +9028 +106C +1044 +10C6 +1083 +ENDCHAR +STARTCHAR U+6775 +ENCODING 26485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +7FFC +0920 +1A20 +1C20 +1BFC +2A20 +2820 +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+6776 +ENCODING 26486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1026 +103C +FDE0 +1020 +1020 +3924 +3524 +3124 +5124 +5124 +91FC +1020 +1021 +1033 +101E +ENDCHAR +STARTCHAR U+6777 +ENCODING 26487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0948 +7F48 +0948 +1948 +1DF8 +1B08 +2B00 +2900 +4900 +0904 +0904 +08FC +0000 +ENDCHAR +STARTCHAR U+6778 +ENCODING 26488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +1044 +1044 +7C44 +1187 +1000 +10FE +3804 +5428 +1010 +1028 +1044 +1082 +1301 +0000 +0000 +ENDCHAR +STARTCHAR U+6779 +ENCODING 26489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +1090 +7D10 +1310 +1110 +111E +3910 +5510 +1110 +1111 +1111 +1111 +111F +0000 +0000 +ENDCHAR +STARTCHAR U+677A +ENCODING 26490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1010 +1008 +7C00 +1140 +1142 +1141 +3A41 +5440 +1040 +1040 +1042 +1042 +103E +0000 +0000 +ENDCHAR +STARTCHAR U+677B +ENCODING 26491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1022 +7E22 +1022 +3822 +3422 +31FF +5044 +5044 +5044 +1044 +1044 +1044 +13FF +1000 +ENDCHAR +STARTCHAR U+677C +ENCODING 26492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0810 +7E60 +0820 +1FFC +1A24 +1A28 +2830 +2820 +4820 +0820 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+677D +ENCODING 26493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +10FC +1010 +7C10 +10FE +1010 +1010 +39FF +5410 +1010 +1010 +1010 +1050 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+677E +ENCODING 26494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +0810 +0890 +7E90 +0890 +1D08 +1B48 +1A44 +2840 +28A0 +4890 +0918 +0FE4 +0804 +0000 +ENDCHAR +STARTCHAR U+677F +ENCODING 26495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0900 +7F00 +09F8 +1988 +1D88 +1B50 +2B50 +2920 +4920 +0A50 +0A88 +0D04 +0000 +ENDCHAR +STARTCHAR U+6781 +ENCODING 26497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +1108 +1108 +FD10 +1110 +313C +3984 +5588 +5148 +9250 +1220 +1250 +1488 +190E +1204 +ENDCHAR +STARTCHAR U+6783 +ENCODING 26499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +10FF +7D01 +1201 +1079 +1001 +3801 +54FD +1001 +1001 +1001 +1012 +100C +0000 +0000 +ENDCHAR +STARTCHAR U+6784 +ENCODING 26500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1084 +10FE +FD04 +1204 +3044 +3844 +5484 +50A4 +1114 +11F4 +1014 +1004 +1028 +1010 +ENDCHAR +STARTCHAR U+6785 +ENCODING 26501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0890 +7E90 +0890 +1C90 +1BFC +1A90 +2890 +2890 +4910 +0910 +0A10 +0C10 +0000 +ENDCHAR +STARTCHAR U+6786 +ENCODING 26502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +11FC +1020 +7C20 +1020 +13FE +3820 +5420 +13FE +1020 +1020 +1021 +1021 +103F +0000 +0000 +ENDCHAR +STARTCHAR U+6787 +ENCODING 26503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0920 +0920 +7F24 +0924 +19E8 +1D30 +1B20 +2B20 +2920 +4920 +0964 +09A4 +0E1C +0000 +ENDCHAR +STARTCHAR U+6789 +ENCODING 26505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +7E20 +0820 +1C20 +1BFC +1A20 +2820 +2820 +4820 +0820 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+678B +ENCODING 26507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +0840 +1C40 +1A78 +1A48 +2848 +2848 +4888 +0888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+678C +ENCODING 26508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11E0 +10A0 +10A0 +7D10 +1110 +1A08 +37F4 +3490 +3090 +5090 +5110 +1110 +1210 +1460 +0000 +ENDCHAR +STARTCHAR U+678D +ENCODING 26509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +1044 +1082 +7D01 +1000 +11FF +3820 +5440 +10FF +1001 +1001 +1002 +1024 +1018 +0000 +0000 +ENDCHAR +STARTCHAR U+678E +ENCODING 26510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FDFE +1020 +1020 +3820 +3420 +33FF +5050 +5050 +90D8 +1088 +118C +1306 +1203 +ENDCHAR +STARTCHAR U+678F +ENCODING 26511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1084 +7C84 +1084 +33FF +3884 +5484 +5084 +5084 +53FF +1084 +1084 +1084 +1084 +109C +ENDCHAR +STARTCHAR U+6790 +ENCODING 26512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +08C0 +7E80 +0880 +18FC +1C90 +1A90 +2A90 +2890 +4910 +0910 +0A10 +0C10 +0000 +ENDCHAR +STARTCHAR U+6791 +ENCODING 26513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1040 +FC40 +1040 +10FC +3884 +3484 +3184 +5104 +51FC +9008 +1008 +1008 +13FF +1000 +ENDCHAR +STARTCHAR U+6792 +ENCODING 26514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1084 +7C84 +1084 +10FF +1014 +3824 +5444 +1084 +1104 +1204 +1014 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+6793 +ENCODING 26515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0848 +0828 +3E08 +0808 +1888 +1C48 +2A08 +2808 +4808 +480F +0878 +0B88 +0808 +0808 +0808 +ENDCHAR +STARTCHAR U+6794 +ENCODING 26516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +7C82 +1101 +1078 +1000 +39FE +5402 +1004 +1008 +1010 +1020 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+6795 +ENCODING 26517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +0948 +1A40 +1C60 +1A60 +2A60 +28A0 +48A0 +0924 +0A24 +0C1C +0000 +ENDCHAR +STARTCHAR U+6796 +ENCODING 26518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +10F0 +FE10 +1010 +1010 +39FF +3410 +3210 +5038 +5028 +9028 +106C +1044 +10C6 +1183 +ENDCHAR +STARTCHAR U+6797 +ENCODING 26519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +0840 +0C60 +1AE0 +1AD0 +2950 +4A48 +0844 +0840 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+6798 +ENCODING 26520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +1044 +FFFE +1244 +3244 +3A44 +5644 +52A4 +929C +130C +1204 +1204 +1214 +1208 +ENDCHAR +STARTCHAR U+6799 +ENCODING 26521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1100 +FD00 +117E +1142 +3942 +3542 +3142 +5142 +5146 +9340 +1240 +1641 +1063 +103E +ENDCHAR +STARTCHAR U+679A +ENCODING 26522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +7FFC +0910 +1A90 +1C90 +1A50 +2A60 +2820 +4860 +0890 +0B08 +0804 +0000 +ENDCHAR +STARTCHAR U+679B +ENCODING 26523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +103C +11E4 +FD04 +1124 +1124 +3924 +3524 +3124 +5124 +5124 +9124 +1126 +1322 +1222 +1623 +ENDCHAR +STARTCHAR U+679C +ENCODING 26524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1FF0 +1110 +1FF0 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+679D +ENCODING 26525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +0840 +1C40 +1BF8 +1B08 +2890 +2890 +4860 +0860 +0990 +0E0C +0000 +ENDCHAR +STARTCHAR U+679E +ENCODING 26526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1110 +1110 +1110 +FD10 +1110 +3110 +3910 +5510 +52A8 +92A8 +1448 +1444 +1884 +1102 +1000 +ENDCHAR +STARTCHAR U+679F +ENCODING 26527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1000 +7C00 +1000 +11FF +3810 +5420 +1040 +1084 +1102 +13FF +1001 +1001 +0000 +0000 +ENDCHAR +STARTCHAR U+67A0 +ENCODING 26528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +09F0 +7E50 +0850 +0C94 +1B54 +1A4C +2840 +4BFC +0840 +0840 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+67A1 +ENCODING 26529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1090 +1390 +7C90 +1090 +1890 +37FC +3490 +3090 +5090 +5110 +1110 +1210 +1410 +0000 +ENDCHAR +STARTCHAR U+67A2 +ENCODING 26530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0900 +7F08 +0908 +1948 +1D30 +1B10 +2B30 +2948 +4988 +0900 +09FC +0900 +0000 +ENDCHAR +STARTCHAR U+67A3 +ENCODING 26531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +FFFE +0100 +3FF8 +2108 +2388 +2550 +0930 +300E +C704 +00C0 +0040 +0E00 +01C0 +0040 +ENDCHAR +STARTCHAR U+67A5 +ENCODING 26533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +13FE +1240 +FE40 +1244 +33FE +3A44 +5644 +5244 +9244 +1244 +1484 +1484 +1928 +1210 +ENDCHAR +STARTCHAR U+67A6 +ENCODING 26534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0800 +7FF8 +0908 +1D08 +1B08 +1BF8 +2908 +2900 +4900 +0A00 +0A00 +0C00 +0000 +ENDCHAR +STARTCHAR U+67A7 +ENCODING 26535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1128 +FD28 +1128 +3128 +3928 +5548 +5148 +9060 +10A0 +10A2 +1122 +121E +1400 +ENDCHAR +STARTCHAR U+67A8 +ENCODING 26536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1108 +1118 +1120 +FD40 +1180 +3104 +3BFE +5540 +5120 +9120 +1110 +1110 +114E +1184 +1100 +ENDCHAR +STARTCHAR U+67A9 +ENCODING 26537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0380 +0540 +1930 +610C +0440 +0830 +1108 +6104 +0220 +0470 +1F88 +0000 +ENDCHAR +STARTCHAR U+67AA +ENCODING 26538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +FD10 +120E +35F4 +3910 +5510 +5110 +9150 +1120 +1104 +1104 +10FC +1000 +ENDCHAR +STARTCHAR U+67AB +ENCODING 26539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +13FC +1208 +FE08 +1208 +3B18 +36A8 +5248 +5248 +92A8 +1318 +1208 +140A +140A +1806 +ENDCHAR +STARTCHAR U+67AD +ENCODING 26541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0410 +1FF8 +1010 +1210 +1160 +1004 +1FFE +0104 +0104 +7FF4 +0394 +0548 +1930 +610E +0100 +ENDCHAR +STARTCHAR U+67AE +ENCODING 26542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +7E3E +1020 +1020 +1022 +38FF +5482 +1282 +1082 +1082 +10FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+67AF +ENCODING 26543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +0840 +1C40 +1A40 +1BF8 +2908 +2908 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+67B0 +ENCODING 26544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +13FC +1040 +FC40 +1248 +3150 +3844 +57FE +5040 +9040 +1040 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+67B1 +ENCODING 26545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10C4 +FC86 +1182 +113E +3BE3 +3401 +3000 +51FE +5102 +9102 +1102 +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+67B2 +ENCODING 26546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0600 +0C08 +18F8 +7F8C +0004 +1FF8 +1008 +1008 +1FF8 +0100 +FFFF +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+67B3 +ENCODING 26547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +7F08 +0908 +1D08 +1B08 +1BF8 +2908 +2800 +4890 +0888 +0904 +0A04 +0000 +ENDCHAR +STARTCHAR U+67B4 +ENCODING 26548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +7F08 +09F8 +1D08 +1A00 +1BF8 +2A48 +2848 +4848 +0888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+67B5 +ENCODING 26549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1108 +FD08 +11F8 +3000 +3BFE +5480 +5088 +91FC +1008 +1008 +1088 +1050 +1020 +ENDCHAR +STARTCHAR U+67B6 +ENCODING 26550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +10F8 +7E88 +1288 +1288 +22F8 +4D88 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+67B7 +ENCODING 26551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1200 +1200 +7FB8 +12A8 +1AA8 +36A8 +36A8 +32A8 +52A8 +52A8 +14B8 +14A8 +1980 +0000 +ENDCHAR +STARTCHAR U+67B8 +ENCODING 26552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +7DF8 +1108 +3A08 +35E8 +3528 +5128 +51E8 +1128 +1008 +1008 +1030 +0000 +ENDCHAR +STARTCHAR U+67B9 +ENCODING 26553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1100 +7DF8 +1208 +1BE8 +3528 +3528 +31E8 +5130 +5100 +1104 +1104 +10FC +0000 +ENDCHAR +STARTCHAR U+67BA +ENCODING 26554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +7C10 +1010 +10FE +3810 +5438 +1054 +1092 +1111 +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+67BB +ENCODING 26555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1124 +1124 +FD24 +1124 +13FF +3924 +3524 +3124 +5124 +513C +9100 +1100 +1100 +11FF +1000 +ENDCHAR +STARTCHAR U+67BC +ENCODING 26556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +FFFF +1110 +1110 +11F0 +1000 +1000 +1FFC +0100 +FFFF +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+67BD +ENCODING 26557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +1108 +1108 +FFFF +1008 +1008 +1FF8 +0100 +FFFF +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+67BE +ENCODING 26558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +0810 +7FFF +0810 +1892 +1C92 +2A92 +2892 +4892 +48FE +0892 +0912 +0912 +0A10 +0810 +ENDCHAR +STARTCHAR U+67C0 +ENCODING 26560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +FDFF +1111 +1112 +3910 +35FE +3142 +5146 +5164 +912C +1318 +123C +1666 +10C3 +ENDCHAR +STARTCHAR U+67C1 +ENCODING 26561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7F08 +0A80 +1880 +1888 +1C90 +2AE0 +2A80 +4880 +0884 +0884 +087C +0000 +ENDCHAR +STARTCHAR U+67C2 +ENCODING 26562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +FDFF +1100 +1310 +3896 +349A +30B2 +50D2 +5196 +9090 +1090 +1081 +10C3 +107E +ENDCHAR +STARTCHAR U+67C3 +ENCODING 26563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +FD10 +128E +3444 +3840 +5400 +53F8 +9008 +1010 +1010 +10A0 +1040 +1020 +ENDCHAR +STARTCHAR U+67C4 +ENCODING 26564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0840 +7E40 +09F8 +1948 +1D48 +1B68 +2B98 +2998 +4908 +0908 +0908 +0918 +0000 +ENDCHAR +STARTCHAR U+67C5 +ENCODING 26565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +FD02 +1102 +11FE +3900 +3540 +3146 +515C +5170 +9140 +1340 +1241 +1663 +103E +ENDCHAR +STARTCHAR U+67C6 +ENCODING 26566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +1010 +1210 +3910 +3510 +3490 +50A0 +50A0 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+67C8 +ENCODING 26568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1122 +11A6 +FCA4 +1020 +11FE +3820 +3420 +3020 +53FF +5020 +9020 +1020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+67C9 +ENCODING 26569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +FC20 +1020 +1020 +39FE +3404 +300C +5008 +5018 +9030 +1060 +10F0 +1398 +100F +ENDCHAR +STARTCHAR U+67CA +ENCODING 26570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0878 +7E88 +0890 +1D50 +1A20 +1A50 +28C8 +2924 +4800 +09C0 +0830 +0808 +0000 +ENDCHAR +STARTCHAR U+67CB +ENCODING 26571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0424 +0822 +73FF +1020 +1010 +1009 +1007 +0080 +7FFF +02A0 +0490 +0888 +3086 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+67CC +ENCODING 26572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1001 +1001 +7DF9 +1001 +11F9 +1109 +3909 +55F9 +1109 +1001 +1001 +1002 +101C +0000 +0000 +ENDCHAR +STARTCHAR U+67CD +ENCODING 26573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +7CFE +1092 +1092 +1092 +39FF +5410 +1028 +1044 +1082 +1101 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+67CE +ENCODING 26574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1088 +1088 +1088 +7C88 +11FC +1908 +3748 +3528 +3128 +5108 +5108 +1108 +1108 +1118 +0000 +ENDCHAR +STARTCHAR U+67CF +ENCODING 26575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0840 +7FF8 +0908 +1908 +1D08 +1BF8 +2B08 +2908 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+67D0 +ENCODING 26576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +0820 +0FE0 +0820 +0FE0 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+67D1 +ENCODING 26577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0888 +0888 +7FFC +0888 +1888 +1C88 +1AF8 +2A88 +2888 +4888 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+67D2 +ENCODING 26578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +1080 +4088 +20FC +0F80 +1088 +6088 +2078 +2104 +FFFE +0540 +0520 +0910 +111C +6108 +0100 +ENDCHAR +STARTCHAR U+67D3 +ENCODING 26579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +4880 +2BE0 +20A0 +08A4 +1124 +221C +4100 +3FF8 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+67D4 +ENCODING 26580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FC0 +0480 +0300 +7FF8 +0330 +0D40 +3300 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+67D7 +ENCODING 26583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +1044 +1044 +FCC6 +1082 +1183 +3901 +3400 +30FE +5082 +5082 +9082 +1082 +1082 +1082 +10FE +ENDCHAR +STARTCHAR U+67D8 +ENCODING 26584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0840 +7E40 +0840 +1880 +1CF8 +1A88 +2B88 +2988 +4A88 +0C88 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+67D9 +ENCODING 26585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +11FE +1124 +FD24 +1124 +31FC +3924 +5524 +5124 +91FC +1124 +1020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+67DA +ENCODING 26586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7C40 +13F8 +1248 +3A48 +3648 +37F8 +5248 +1248 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+67DB +ENCODING 26587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +7D11 +1111 +11FF +1111 +3911 +55FF +1111 +1010 +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+67DC +ENCODING 26588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1200 +1200 +FE08 +13FC +3208 +3A08 +5608 +53F8 +9208 +1200 +1200 +1204 +13FE +1000 +ENDCHAR +STARTCHAR U+67DD +ENCODING 26589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +09C0 +7F00 +0900 +1DFC +1B20 +1B60 +2930 +2928 +4A20 +0A20 +0C20 +0820 +0000 +ENDCHAR +STARTCHAR U+67DE +ENCODING 26590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +7FFC +0940 +1E40 +1A78 +1A40 +2840 +2878 +4840 +0840 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+67DF +ENCODING 26591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +7CFE +1092 +1092 +10FE +1092 +3892 +55FF +1082 +1082 +1082 +108A +1084 +0000 +0000 +ENDCHAR +STARTCHAR U+67E0 +ENCODING 26592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1020 +13FE +FE02 +1404 +3000 +3BFE +5420 +5020 +9020 +1020 +1020 +1020 +10A0 +1040 +ENDCHAR +STARTCHAR U+67E1 +ENCODING 26593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1000 +FC00 +1000 +13FF +3820 +3422 +33A6 +50B4 +50B8 +91A8 +112C +1326 +1623 +1060 +ENDCHAR +STARTCHAR U+67E2 +ENCODING 26594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +09E0 +7F20 +0920 +1DFC +1B20 +1B20 +2910 +2910 +49D4 +0F0C +09EC +0804 +0000 +ENDCHAR +STARTCHAR U+67E3 +ENCODING 26595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +10FE +7D10 +1210 +1010 +11FF +3810 +5410 +1028 +1044 +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+67E4 +ENCODING 26596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F0 +0910 +7F10 +0910 +1DF0 +1B10 +1B10 +29F0 +2910 +4910 +0910 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+67E5 +ENCODING 26597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +FFFE +0540 +0920 +1110 +3FFE +D014 +1010 +1FF0 +1010 +1010 +1FF0 +0004 +FFFE +0000 +ENDCHAR +STARTCHAR U+67E6 +ENCODING 26598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +FE82 +1082 +1082 +38FE +3482 +3282 +5082 +5082 +90FE +1000 +1000 +11FF +1000 +ENDCHAR +STARTCHAR U+67E7 +ENCODING 26599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +09D0 +7F50 +0950 +1D50 +1B50 +1B50 +2950 +2950 +4970 +0A58 +0BF8 +0C04 +0000 +ENDCHAR +STARTCHAR U+67E9 +ENCODING 26601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1240 +7E40 +1270 +1A90 +3720 +3620 +3250 +5288 +5304 +1200 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+67EA +ENCODING 26602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1088 +109F +7D09 +1249 +17C9 +1049 +3889 +5509 +1249 +1249 +17D1 +1042 +100C +0000 +0000 +ENDCHAR +STARTCHAR U+67EB +ENCODING 26603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +13FE +7C92 +1092 +13FE +1290 +3A90 +57FF +1091 +1091 +1091 +1116 +1210 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+67EC +ENCODING 26604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +1950 +1550 +1590 +1FF0 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+67ED +ENCODING 26605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +1022 +13FF +7C20 +1040 +1088 +1308 +3888 +5450 +1020 +1050 +1088 +1104 +1603 +0000 +0000 +ENDCHAR +STARTCHAR U+67EE +ENCODING 26606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1248 +7E48 +1248 +1BF8 +3648 +3440 +3248 +5248 +5248 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+67EF +ENCODING 26607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0808 +7E08 +09E8 +1D28 +1B28 +1B28 +29E8 +2928 +4808 +0808 +0808 +0818 +0000 +ENDCHAR +STARTCHAR U+67F0 +ENCODING 26608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +7FFC +0540 +0930 +110E +2024 +DFF0 +0000 +0008 +7FFC +0100 +0920 +1118 +2508 +0200 +ENDCHAR +STARTCHAR U+67F1 +ENCODING 26609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0840 +0840 +7FFC +0840 +1840 +1C40 +1BF8 +2A40 +2840 +4840 +0840 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+67F2 +ENCODING 26610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1060 +1030 +1010 +FC44 +1044 +1044 +384C +3548 +315E +5153 +5371 +9260 +1040 +11C2 +1766 +103C +ENDCHAR +STARTCHAR U+67F3 +ENCODING 26611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +1338 +7EA8 +12A8 +1AA8 +36A8 +36A8 +32A8 +53A8 +14B8 +1120 +1120 +1220 +0000 +ENDCHAR +STARTCHAR U+67F4 +ENCODING 26612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0898 +2FE0 +2884 +2884 +2E7C +7100 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+67F5 +ENCODING 26613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +7EA8 +12A8 +1AA8 +17FC +36A8 +32A8 +52A8 +12A8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+67F6 +ENCODING 26614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1129 +7D29 +1129 +3129 +3929 +7529 +514F +5181 +5101 +1101 +1101 +1101 +11FF +1101 +ENDCHAR +STARTCHAR U+67F7 +ENCODING 26615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +FD02 +1102 +1102 +3902 +35FE +3448 +5048 +5048 +9048 +10C8 +1089 +1189 +1307 +ENDCHAR +STARTCHAR U+67F8 +ENCODING 26616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +13FF +1008 +7C10 +1020 +1040 +38A8 +5724 +1023 +1020 +1020 +1020 +1020 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+67F9 +ENCODING 26617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FDFE +1120 +1120 +3920 +3520 +31FF +50A1 +50A1 +90A1 +11A1 +1121 +1323 +1026 +ENDCHAR +STARTCHAR U+67FA +ENCODING 26618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +1082 +7C82 +10FE +1020 +1020 +383F +5421 +1021 +1041 +1081 +1322 +101C +0000 +0000 +ENDCHAR +STARTCHAR U+67FB +ENCODING 26619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0380 +0540 +1930 +6FEC +0820 +0FE0 +0820 +0FE0 +0820 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+67FC +ENCODING 26620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1010 +1010 +7DFF +1101 +1102 +3800 +5428 +1028 +1044 +1082 +1101 +1201 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+67FD +ENCODING 26621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13F8 +1208 +1110 +FCA0 +1040 +30B0 +3B0E +5444 +5050 +93F8 +1040 +1040 +1048 +17FC +1000 +ENDCHAR +STARTCHAR U+67FE +ENCODING 26622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +7E20 +0820 +1920 +1D3C +1B20 +2B20 +2920 +4920 +0920 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+67FF +ENCODING 26623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7FFC +0820 +1820 +1DFC +1B24 +2B24 +2924 +4924 +092C +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+6800 +ENCODING 26624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +13E0 +1200 +FE08 +13FC +3200 +3AF8 +5688 +5288 +92A8 +1290 +1482 +1482 +187E +1000 +ENDCHAR +STARTCHAR U+6802 +ENCODING 26626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +7EC8 +08A8 +1C88 +1BFC +1B08 +2948 +2928 +4908 +0BFC +0A08 +0830 +0000 +ENDCHAR +STARTCHAR U+6803 +ENCODING 26627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +09E0 +0900 +7F00 +09FC +1D40 +1B40 +1B78 +2948 +2A48 +4A88 +0C88 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+6804 +ENCODING 26628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0910 +0920 +3FFC +2008 +4100 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+6805 +ENCODING 26629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27BE +24A4 +24A4 +FCA4 +24A4 +74A4 +6FFE +A4A4 +24A4 +24A4 +24A4 +24A4 +29A4 +3054 +2088 +ENDCHAR +STARTCHAR U+6807 +ENCODING 26631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1010 +13F8 +1000 +FC00 +1004 +37FE +3840 +5440 +5150 +9148 +124C +1444 +1040 +1140 +1080 +ENDCHAR +STARTCHAR U+6808 +ENCODING 26632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1090 +1088 +1080 +FCF8 +1380 +3088 +38FC +5780 +5048 +1050 +1020 +1060 +1192 +160A +1006 +ENDCHAR +STARTCHAR U+6809 +ENCODING 26633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +1114 +17FE +FD10 +1008 +33FC +3888 +5488 +5088 +9088 +10A8 +1090 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U+680A +ENCODING 26634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10A0 +1090 +1094 +FFFE +10A0 +30A0 +38A4 +54A4 +50A8 +9128 +1130 +1262 +12A2 +141E +1800 +ENDCHAR +STARTCHAR U+680B +ENCODING 26635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1048 +13FC +FC80 +1080 +38A0 +3524 +53FE +5020 +9128 +1124 +1222 +1422 +10A0 +1040 +ENDCHAR +STARTCHAR U+680C +ENCODING 26636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +107E +1040 +FC44 +13FE +3204 +3A04 +5604 +53FC +9204 +1200 +1200 +1400 +1400 +1800 +ENDCHAR +STARTCHAR U+680E +ENCODING 26638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +13E0 +1200 +FE20 +1220 +3224 +3BFE +5420 +5020 +90A8 +1124 +1222 +1422 +10A0 +1040 +ENDCHAR +STARTCHAR U+680F +ENCODING 26639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1208 +1110 +10A4 +FFFE +1000 +3000 +3808 +57FC +5000 +9000 +1000 +1000 +1004 +1FFE +1000 +ENDCHAR +STARTCHAR U+6811 +ENCODING 26641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1008 +1008 +17C8 +FC7E +1448 +3288 +3AA8 +5118 +5108 +9288 +1248 +1448 +1808 +1028 +1010 +ENDCHAR +STARTCHAR U+6812 +ENCODING 26642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1080 +7DFF +1101 +3201 +38F9 +7489 +52F9 +5089 +50F9 +5089 +1001 +1001 +1002 +100C +ENDCHAR +STARTCHAR U+6813 +ENCODING 26643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +08A0 +7EA0 +0910 +1E08 +1BFC +1A40 +2840 +2BF8 +4840 +0840 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+6814 +ENCODING 26644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +FF11 +0811 +7F11 +0831 +3F23 +E866 +0100 +FFFF +0520 +0520 +0D30 +1918 +F10F +0100 +ENDCHAR +STARTCHAR U+6816 +ENCODING 26646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +10A0 +7CA0 +10A0 +13F8 +3AA8 +36A8 +36B8 +5338 +5318 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+6817 +ENCODING 26647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0280 +1FF0 +1290 +1290 +1FF0 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6818 +ENCODING 26648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +21FC +2208 +FD10 +20A0 +2040 +70A0 +A97E +2282 +2544 +2228 +2010 +2020 +21C0 +0000 +0000 +ENDCHAR +STARTCHAR U+6819 +ENCODING 26649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10FC +FD84 +1348 +1030 +38DC +3787 +3010 +51FE +5090 +9090 +13FF +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+681A +ENCODING 26650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +1044 +1028 +7DFF +1010 +1010 +39FF +5410 +1210 +1010 +1028 +1044 +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+681C +ENCODING 26652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +7DFF +1111 +1111 +3912 +5438 +1054 +1092 +1111 +1210 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+681D +ENCODING 26653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +103C +13E0 +1020 +FC20 +1024 +37FE +3820 +5424 +51FE +9104 +1104 +1104 +1104 +11FC +1104 +ENDCHAR +STARTCHAR U+681E +ENCODING 26654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +0820 +0820 +7FFC +0820 +0920 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+681F +ENCODING 26655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +10C6 +1044 +FDFF +1044 +1044 +3844 +3444 +35FF +5044 +5044 +9044 +1044 +10C4 +1084 +1184 +ENDCHAR +STARTCHAR U+6820 +ENCODING 26656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +0BFE +7020 +17FF +1020 +13FE +1000 +0080 +7FFF +02A0 +0490 +0888 +7087 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+6821 +ENCODING 26657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7FFC +0890 +1888 +1D94 +1A94 +2A50 +2860 +4820 +0850 +0988 +0E04 +0000 +ENDCHAR +STARTCHAR U+6822 +ENCODING 26658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0820 +7E40 +09F8 +1908 +1D08 +1B08 +2BF8 +2908 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+6825 +ENCODING 26661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3CFE +0122 +0050 +0088 +3B06 +0080 +0080 +7FFF +02A0 +0490 +0888 +7087 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+6826 +ENCODING 26662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +1091 +1091 +7C91 +12D9 +11B5 +1093 +3891 +5491 +1091 +1091 +1091 +1111 +1001 +0000 +0000 +ENDCHAR +STARTCHAR U+6827 +ENCODING 26663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FE +FD22 +1122 +11FE +3922 +3522 +35FE +5020 +5032 +9016 +101C +1039 +10ED +1387 +ENDCHAR +STARTCHAR U+6828 +ENCODING 26664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2640 +FB7F +2141 +20D3 +7092 +6810 +A810 +A110 +2138 +2328 +222C +2664 +2446 +20C3 +ENDCHAR +STARTCHAR U+6829 +ENCODING 26665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1088 +7D98 +1198 +1AA8 +34C8 +3598 +3198 +52A8 +54C8 +1088 +1088 +1198 +0000 +ENDCHAR +STARTCHAR U+682A +ENCODING 26666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A0 +08A0 +7FF8 +0920 +1A20 +1FFC +1A60 +2A70 +28B0 +4928 +0A24 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+682B +ENCODING 26667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +1080 +18F8 +3508 +3510 +3310 +55FC +5110 +1110 +1110 +1130 +0000 +ENDCHAR +STARTCHAR U+682C +ENCODING 26668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10F8 +1188 +FD10 +13FE +1122 +3922 +3522 +3122 +51FE +5100 +9100 +1100 +1101 +1183 +10FE +ENDCHAR +STARTCHAR U+682D +ENCODING 26669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1010 +FC20 +11FF +1129 +3929 +3529 +3529 +5129 +5129 +9129 +1129 +1129 +1129 +1103 +ENDCHAR +STARTCHAR U+682E +ENCODING 26670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1082 +7C82 +10FE +1082 +1082 +38FE +5482 +1082 +11FF +1002 +1002 +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+682F +ENCODING 26671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +7FFF +1040 +3080 +38FC +7584 +5284 +54FC +5084 +5084 +10FC +1084 +1084 +108C +ENDCHAR +STARTCHAR U+6830 +ENCODING 26672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1054 +1096 +1392 +FC90 +1090 +13FF +3890 +3492 +3492 +50D4 +5394 +9098 +1089 +108D +1097 +13A2 +ENDCHAR +STARTCHAR U+6831 +ENCODING 26673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +1048 +1048 +FC48 +11FE +1048 +3848 +3448 +3448 +5048 +53FF +9000 +1048 +10CC +1186 +1303 +ENDCHAR +STARTCHAR U+6832 +ENCODING 26674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0848 +09F8 +7E50 +0850 +1FFC +1A40 +1AFC +2980 +2AF8 +4888 +0808 +0808 +0830 +0000 +ENDCHAR +STARTCHAR U+6833 +ENCODING 26675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1044 +13F8 +FC50 +1064 +37FE +3840 +5488 +5198 +92A0 +14C0 +1884 +1084 +107C +1000 +ENDCHAR +STARTCHAR U+6834 +ENCODING 26676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08FC +7F00 +0A00 +1CF8 +1AA8 +1AA8 +28A8 +2BFC +4888 +0888 +0888 +0898 +0000 +ENDCHAR +STARTCHAR U+6835 +ENCODING 26677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13F9 +1081 +7C85 +10F5 +1095 +1115 +1295 +3855 +5425 +1045 +1081 +1101 +1205 +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+6837 +ENCODING 26679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1110 +10A0 +17FC +FC40 +1050 +3BF8 +3440 +5040 +5044 +9FFE +1040 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+6838 +ENCODING 26680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7E20 +0948 +1C88 +1A50 +1A20 +2848 +2990 +4830 +0848 +0984 +0E04 +0000 +ENDCHAR +STARTCHAR U+6839 +ENCODING 26681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F0 +0910 +0910 +7FF0 +1910 +1D10 +1BF4 +2B44 +2928 +4930 +0950 +0988 +0E04 +0000 +ENDCHAR +STARTCHAR U+683A +ENCODING 26682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1082 +10FC +7C81 +1081 +10FF +1000 +38FF +5481 +10FF +1081 +1081 +10FF +1081 +0000 +0000 +ENDCHAR +STARTCHAR U+683B +ENCODING 26683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +100A +100B +FC09 +11FF +1008 +3808 +35E8 +3488 +5088 +508C +90E4 +1384 +1005 +1007 +1002 +ENDCHAR +STARTCHAR U+683C +ENCODING 26684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0878 +7E88 +0950 +1820 +1C50 +1A88 +2BFC +2888 +4888 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+683D +ENCODING 26685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +3F48 +0848 +0840 +7FFC +0848 +7F48 +1C50 +1A30 +2924 +4854 +088C +0904 +0000 +ENDCHAR +STARTCHAR U+683E +ENCODING 26686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +7FFC +0440 +1450 +1448 +2444 +4544 +0100 +FFFE +0380 +0540 +0930 +110E +6104 +0100 +ENDCHAR +STARTCHAR U+683F +ENCODING 26687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2112 +2113 +2311 +FA10 +22FF +2610 +7210 +6A38 +AA28 +A228 +222C +2264 +2246 +2242 +22C3 +ENDCHAR +STARTCHAR U+6840 +ENCODING 26688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +1EFC +2290 +5490 +0FFC +1810 +6110 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6841 +ENCODING 26689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08F8 +0900 +7E00 +0880 +1CFC +1B10 +1B10 +2910 +2910 +4910 +0910 +0910 +0930 +0000 +ENDCHAR +STARTCHAR U+6842 +ENCODING 26690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +09F8 +7E40 +0840 +1BFC +1C40 +1A40 +2BF8 +2840 +4840 +0840 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+6843 +ENCODING 26691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +10A8 +7EA8 +11B0 +39A0 +34B0 +35A8 +56A4 +50A4 +1120 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+6844 +ENCODING 26692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1444 +1248 +FD50 +1044 +37FE +38A0 +54A0 +50A0 +90A0 +10A0 +1122 +1122 +121E +1400 +ENDCHAR +STARTCHAR U+6845 +ENCODING 26693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10F8 +1110 +1224 +FFFE +1200 +3208 +3AFC +5688 +5288 +92A8 +1290 +1282 +1482 +147E +1800 +ENDCHAR +STARTCHAR U+6846 +ENCODING 26694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1200 +7EF8 +1220 +1A20 +36F8 +3620 +3220 +5220 +52F8 +1200 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+6848 +ENCODING 26696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2208 +7FF8 +0440 +0F80 +0360 +1D10 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+6849 +ENCODING 26697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1220 +13FE +FE02 +1444 +3040 +3884 +57FE +5088 +9108 +1090 +1060 +1090 +110C +1204 +ENDCHAR +STARTCHAR U+684A +ENCODING 26698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1110 +0920 +3FF8 +0200 +7FFC +0440 +0830 +310E +C104 +3FF8 +0100 +0920 +1118 +2508 +0200 +ENDCHAR +STARTCHAR U+684B +ENCODING 26699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +1020 +7FFE +1022 +13FE +1220 +3BFF +5421 +1021 +1052 +1088 +1104 +1603 +0000 +0000 +ENDCHAR +STARTCHAR U+684C +ENCODING 26700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +01FC +0100 +0110 +1FF8 +1010 +1FF0 +1010 +1FF0 +0104 +FFFE +0380 +0560 +091C +3108 +0100 +ENDCHAR +STARTCHAR U+684D +ENCODING 26701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7CA0 +1090 +19F8 +3604 +37F8 +3080 +50F0 +5110 +1010 +1010 +1060 +0000 +ENDCHAR +STARTCHAR U+684E +ENCODING 26702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1040 +7C50 +1088 +1FFC +3444 +3440 +33F8 +5040 +5040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+684F +ENCODING 26703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +103F +17D1 +7D12 +1114 +1112 +3951 +5591 +1119 +1615 +1012 +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6850 +ENCODING 26704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7E08 +13F8 +1208 +3AE8 +36A8 +36A8 +52E8 +52A8 +1208 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+6851 +ENCODING 26705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +0440 +0380 +3EF8 +1248 +0D30 +1BC8 +6104 +3FF8 +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+6852 +ENCODING 26706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +1FF8 +0100 +0910 +0810 +FFFF +0810 +0810 +0100 +7FFE +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+6853 +ENCODING 26707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0800 +7EF8 +0888 +1888 +1CF8 +1A88 +2A88 +28F8 +4888 +0800 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+6854 +ENCODING 26708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7FFC +0840 +1C40 +1BF8 +1A00 +29F8 +2908 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+6855 +ENCODING 26709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1040 +10C0 +1104 +FE3E +1204 +3204 +3A04 +57BC +5204 +9204 +1204 +1204 +1204 +13FC +1204 +ENDCHAR +STARTCHAR U+6857 +ENCODING 26711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1024 +FC27 +1061 +1041 +38C3 +35AE +3020 +53FF +50A8 +90AC +11A6 +1323 +1020 +1020 +ENDCHAR +STARTCHAR U+6858 +ENCODING 26712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1030 +1020 +FEFE +1082 +1082 +3882 +34FE +3280 +5080 +50FE +9082 +1082 +1082 +1082 +10FE +ENDCHAR +STARTCHAR U+6859 +ENCODING 26713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +0888 +7FFC +08A4 +1CA0 +1AF8 +1B20 +2A20 +2BFC +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+685B +ENCODING 26715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +103E +FC20 +1020 +13FF +3800 +3400 +33FF +5020 +5020 +903C +1026 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+685C +ENCODING 26716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0A48 +0948 +7F10 +0860 +1C40 +1BFC +1A90 +2890 +29D0 +4920 +0830 +08C8 +0B08 +0000 +ENDCHAR +STARTCHAR U+685D +ENCODING 26717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1108 +1108 +1108 +7DFC +12A8 +12A8 +3EA8 +35A8 +34FC +5108 +5108 +1208 +1408 +1808 +0000 +ENDCHAR +STARTCHAR U+685F +ENCODING 26719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +0848 +7FFC +0840 +19F8 +1C40 +1BFC +2A28 +2828 +4810 +0834 +08CC +0B04 +0000 +ENDCHAR +STARTCHAR U+6860 +ENCODING 26720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +13FC +1090 +FC90 +1090 +3294 +3A94 +5594 +5098 +9090 +1090 +1090 +1094 +17FE +1000 +ENDCHAR +STARTCHAR U+6861 +ENCODING 26721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +109C +13E0 +FC50 +1020 +3052 +398E +5400 +53FC +9090 +1090 +1090 +1112 +1212 +140E +ENDCHAR +STARTCHAR U+6862 +ENCODING 26722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +107E +1040 +FC48 +13FC +3208 +3A48 +5648 +5248 +9248 +1248 +1080 +10B0 +110C +1604 +ENDCHAR +STARTCHAR U+6863 +ENCODING 26723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1248 +7D48 +1150 +1840 +37F8 +3408 +3008 +53F8 +5008 +1008 +13F8 +1008 +0000 +ENDCHAR +STARTCHAR U+6864 +ENCODING 26724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1248 +1248 +FFF8 +1000 +33F8 +3808 +5408 +53F8 +9208 +1200 +1202 +1202 +11FE +1000 +ENDCHAR +STARTCHAR U+6865 +ENCODING 26725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1038 +13C0 +1040 +1040 +FC84 +17FE +3120 +3910 +560E +5514 +9910 +1110 +1110 +1210 +1410 +1010 +ENDCHAR +STARTCHAR U+6866 +ENCODING 26726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A0 +10A0 +10A4 +1128 +FD30 +1360 +35A4 +391C +5540 +5044 +97FE +1040 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+6867 +ENCODING 26727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7CA0 +1110 +1BF8 +3404 +3400 +37FC +50A0 +5090 +1138 +17C4 +1004 +0000 +ENDCHAR +STARTCHAR U+6868 +ENCODING 26728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +4440 +247C +0484 +1548 +2430 +6420 +0540 +0104 +FFFE +0540 +0920 +1110 +210E +C104 +0100 +ENDCHAR +STARTCHAR U+6869 +ENCODING 26729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1024 +13FE +FE00 +1220 +3220 +3A28 +57FC +5220 +9220 +1220 +1420 +1424 +1BFE +1000 +ENDCHAR +STARTCHAR U+686B +ENCODING 26731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1210 +1110 +1110 +FC54 +1252 +3290 +3814 +5514 +5118 +9208 +1610 +1220 +1240 +1080 +1300 +ENDCHAR +STARTCHAR U+686D +ENCODING 26733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FE +1200 +7A00 +13FE +3200 +3A00 +77FF +5250 +5252 +5254 +1248 +1248 +1274 +15C2 +1401 +ENDCHAR +STARTCHAR U+686E +ENCODING 26734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1010 +FE30 +107C +10D6 +3993 +3410 +3210 +5000 +50FE +9082 +1082 +1082 +1082 +10FE +ENDCHAR +STARTCHAR U+686F +ENCODING 26735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1084 +FE84 +1084 +10FC +3800 +3400 +31FE +5020 +5020 +90FC +1020 +1020 +13FF +1000 +ENDCHAR +STARTCHAR U+6870 +ENCODING 26736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +11F8 +1108 +FD08 +11FF +1108 +3908 +35C5 +3303 +51FE +5102 +9102 +11FE +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+6871 +ENCODING 26737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1000 +FE49 +1092 +1124 +3892 +3449 +3249 +5000 +51FF +9010 +1010 +1010 +1010 +11FF +ENDCHAR +STARTCHAR U+6872 +ENCODING 26738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FC10 +1010 +11FF +3901 +3501 +30FE +5004 +5008 +91FF +1010 +1010 +1010 +1070 +ENDCHAR +STARTCHAR U+6874 +ENCODING 26740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +13C8 +7D24 +1124 +1A00 +35F8 +3410 +3020 +53FC +5020 +1020 +1020 +1060 +0000 +ENDCHAR +STARTCHAR U+6875 +ENCODING 26741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +103C +11E0 +FC21 +1133 +1196 +38A4 +3420 +31FF +5044 +50C4 +908C +11E8 +103C +1066 +11C3 +ENDCHAR +STARTCHAR U+6876 +ENCODING 26742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1090 +7C60 +13F8 +1248 +3A48 +37F8 +3648 +5248 +53F8 +1248 +1248 +1258 +0000 +ENDCHAR +STARTCHAR U+6877 +ENCODING 26743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F0 +1120 +7E40 +13F8 +1A48 +3648 +37F8 +3248 +5248 +53F8 +1208 +1408 +1818 +0000 +ENDCHAR +STARTCHAR U+6878 +ENCODING 26744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +1044 +1038 +7C44 +1092 +11FF +3850 +5490 +11FF +1291 +1091 +1092 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6879 +ENCODING 26745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FC +FD04 +1104 +11FC +3904 +3504 +31FD +5113 +5116 +9118 +1108 +110C +11E6 +1703 +ENDCHAR +STARTCHAR U+687A +ENCODING 26746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1048 +FC48 +1048 +13CF +3A49 +3649 +3249 +5249 +5249 +9249 +12C9 +1088 +1188 +1308 +ENDCHAR +STARTCHAR U+687B +ENCODING 26747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +107C +10C4 +FD8C +1358 +1070 +38DC +3787 +3020 +51FE +5020 +91FE +1020 +13FF +1020 +1020 +ENDCHAR +STARTCHAR U+687C +ENCODING 26748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +0520 +0D30 +1918 +710E +07E0 +1C38 +F10F +0100 +7D3C +05E0 +0D40 +1960 +773E +ENDCHAR +STARTCHAR U+687D +ENCODING 26749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFE +0490 +0888 +1084 +0000 +0888 +1494 +22A2 +0080 +1FFC +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+687E +ENCODING 26750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +1090 +7C90 +17FC +1090 +3890 +37F0 +3500 +51F8 +5308 +1508 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+687F +ENCODING 26751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7FF8 +1208 +1BF8 +3400 +37F8 +3040 +5040 +57FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+6880 +ENCODING 26752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +7C10 +11FF +1111 +1111 +39FF +5438 +1054 +1092 +1111 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6881 +ENCODING 26753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +4090 +2290 +0A98 +0D14 +1264 +2100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+6882 +ENCODING 26754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +1026 +1022 +FDFF +1020 +1122 +39A6 +34AC +3020 +5030 +50B8 +91AC +1326 +1223 +1020 +10E0 +ENDCHAR +STARTCHAR U+6883 +ENCODING 26755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +17E0 +1120 +7D20 +1220 +1AFC +3720 +3120 +3520 +5520 +52F8 +1200 +1500 +18FC +0000 +ENDCHAR +STARTCHAR U+6884 +ENCODING 26756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1028 +FE28 +11FF +1129 +3929 +3529 +3329 +7149 +5187 +9101 +11FF +1101 +1101 +11FF +ENDCHAR +STARTCHAR U+6885 +ENCODING 26757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08FC +7F00 +0AF8 +18A8 +1CA8 +1BFC +2AA8 +28A8 +49FC +0908 +0808 +0830 +0000 +ENDCHAR +STARTCHAR U+6886 +ENCODING 26758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +113E +1122 +17E4 +F924 +1128 +37E4 +3924 +5522 +57E2 +9122 +1134 +1228 +1220 +1420 +1020 +ENDCHAR +STARTCHAR U+6887 +ENCODING 26759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1010 +7CFE +1010 +1010 +39FF +5444 +1044 +11FF +1044 +1044 +1044 +1084 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+6888 +ENCODING 26760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FC00 +10FE +1082 +3882 +34FE +3000 +50FE +5004 +9008 +1010 +1010 +1010 +1070 +ENDCHAR +STARTCHAR U+6889 +ENCODING 26761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +1124 +7D24 +1124 +11E4 +383F +5424 +13E4 +1124 +1124 +1124 +123F +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+688A +ENCODING 26762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +3EFC +0840 +087F +1C44 +2A44 +0884 +0884 +7FFF +02A0 +0490 +0888 +7087 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+688B +ENCODING 26763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +1082 +7CFE +1000 +10FE +1082 +38FE +5482 +10FE +1082 +1082 +110A +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+688C +ENCODING 26764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +7C82 +117D +1010 +1010 +39FF +5438 +1054 +1092 +1111 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+688D +ENCODING 26765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +11F8 +7D08 +11F8 +1908 +35F8 +3480 +309C +50E0 +5380 +1088 +1088 +1078 +0000 +ENDCHAR +STARTCHAR U+688F +ENCODING 26767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1140 +1140 +7DF8 +1240 +1C40 +37FC +3440 +31F8 +5108 +5108 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+6890 +ENCODING 26768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +1210 +1210 +7FDF +1210 +1251 +139F +3820 +5420 +13FE +1020 +1020 +1020 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+6891 +ENCODING 26769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1488 +1508 +1249 +7D29 +109A +1088 +1188 +1288 +3888 +5488 +1094 +1122 +1641 +1041 +0000 +0000 +ENDCHAR +STARTCHAR U+6892 +ENCODING 26770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1050 +7C88 +1174 +1202 +15FD +1008 +3810 +55FE +1102 +1102 +1102 +11FE +1102 +0000 +0000 +ENDCHAR +STARTCHAR U+6893 +ENCODING 26771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7E88 +0848 +1C50 +1BFC +1A20 +2820 +29FC +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+6894 +ENCODING 26772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E0 +1200 +7FFC +1200 +1AF8 +36A8 +36A8 +32F8 +5288 +5480 +1484 +1884 +107C +0000 +ENDCHAR +STARTCHAR U+6896 +ENCODING 26774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +FD02 +11FE +1102 +3902 +3502 +31FE +5102 +5102 +9102 +11FE +1084 +1186 +1303 +ENDCHAR +STARTCHAR U+6897 +ENCODING 26775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1040 +7FF8 +1248 +13F8 +3A48 +37F8 +3648 +5140 +5080 +10C0 +1330 +1C0C +0000 +ENDCHAR +STARTCHAR U+6898 +ENCODING 26776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +FD02 +11FE +1102 +3902 +35FE +3102 +5102 +51FE +9048 +1048 +10C9 +1189 +1307 +ENDCHAR +STARTCHAR U+689A +ENCODING 26778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +107C +10C8 +FD98 +1110 +11FE +3922 +3522 +3122 +51FE +5050 +9050 +10D0 +1091 +119B +130E +ENDCHAR +STARTCHAR U+689B +ENCODING 26779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17B8 +12A8 +7AA8 +17B0 +1AB0 +3AA8 +37A8 +32A4 +52A4 +54A4 +14B8 +18A0 +1320 +0000 +ENDCHAR +STARTCHAR U+689C +ENCODING 26780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +FC20 +1124 +1124 +3924 +36AA +32AA +5071 +5050 +90D8 +1088 +118C +1106 +1303 +ENDCHAR +STARTCHAR U+689D +ENCODING 26781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08FC +0D10 +16A0 +1460 +37DC +5440 +17FC +14E0 +1550 +1648 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+689F +ENCODING 26783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0FE0 +0820 +0FE0 +0FF8 +0800 +0FF0 +0910 +0160 +7FFC +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+68A0 +ENCODING 26784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7D10 +1110 +19F0 +3440 +3480 +33F8 +5208 +5208 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+68A1 +ENCODING 26785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +7D01 +1000 +30FE +3800 +7400 +53FF +5048 +5048 +1048 +1088 +1089 +110F +1600 +ENDCHAR +STARTCHAR U+68A2 +ENCODING 26786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0924 +08A4 +7EA8 +0820 +18F8 +1C88 +1AF8 +2A88 +28F8 +4888 +0888 +0888 +0898 +0000 +ENDCHAR +STARTCHAR U+68A3 +ENCODING 26787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1111 +1111 +FDFF +1010 +1038 +386C +34C6 +31BB +5000 +50FE +9004 +100C +1008 +1018 +1010 +ENDCHAR +STARTCHAR U+68A4 +ENCODING 26788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1111 +7DFF +1000 +1044 +1082 +3901 +54FE +1022 +1022 +1022 +1042 +1094 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+68A5 +ENCODING 26789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4002 +4422 +1C38 +320C +0220 +0CF0 +3F1C +0100 +7FFE +0520 +0D30 +1918 +710E +0100 +ENDCHAR +STARTCHAR U+68A6 +ENCODING 26790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +1C70 +1A70 +2AA8 +4924 +01F0 +0610 +1A20 +0140 +0180 +0600 +3800 +0000 +ENDCHAR +STARTCHAR U+68A7 +ENCODING 26791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0840 +7E40 +09F0 +1C90 +1A90 +1BFC +2800 +29F8 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+68A8 +ENCODING 26792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +3E48 +0448 +7FC8 +0E48 +1548 +6498 +0500 +3FF8 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+68A9 +ENCODING 26793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +FD22 +11FE +1122 +3922 +35FE +3020 +5020 +5020 +91FE +1020 +1020 +1020 +13FF +ENDCHAR +STARTCHAR U+68AA +ENCODING 26794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1000 +FE00 +10FE +1082 +3882 +3482 +32FE +5000 +5044 +9064 +102C +1008 +11FF +1000 +ENDCHAR +STARTCHAR U+68AB +ENCODING 26795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1002 +11FF +7C02 +10FE +1000 +11FF +3901 +557D +1044 +1028 +1010 +1028 +11C7 +0000 +0000 +ENDCHAR +STARTCHAR U+68AC +ENCODING 26796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1111 +7DFF +1111 +11FF +1000 +39FF +5440 +10FF +1001 +1001 +1002 +103C +0000 +0000 +ENDCHAR +STARTCHAR U+68AD +ENCODING 26797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +0898 +7FE4 +08A0 +1CA4 +1B5C +1A40 +28F0 +2910 +4AA0 +0840 +09B0 +0E0C +0000 +ENDCHAR +STARTCHAR U+68AE +ENCODING 26798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +FD02 +11FE +1100 +3900 +35FF +3101 +5179 +5149 +9349 +1249 +127B +1402 +100E +ENDCHAR +STARTCHAR U+68AF +ENCODING 26799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +0890 +08A0 +7FF8 +0848 +1BF8 +1E40 +1BFC +2AC4 +28C4 +4944 +0A58 +0C40 +0840 +0000 +ENDCHAR +STARTCHAR U+68B0 +ENCODING 26800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1028 +1024 +7FFC +1020 +12A8 +3AA8 +36A8 +37F0 +5290 +5294 +14AC +184C +1084 +0000 +ENDCHAR +STARTCHAR U+68B1 +ENCODING 26801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +7E48 +1248 +13F8 +3A48 +36E8 +36D8 +5358 +5248 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+68B2 +ENCODING 26802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +1186 +1084 +FDFE +1102 +1102 +3902 +3502 +31FE +5048 +5048 +9048 +10C8 +1089 +1189 +1307 +ENDCHAR +STARTCHAR U+68B3 +ENCODING 26803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7C90 +1118 +1FE4 +3400 +3550 +3150 +5150 +5150 +1254 +1254 +140C +0000 +ENDCHAR +STARTCHAR U+68B4 +ENCODING 26804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13C1 +105E +7C84 +1104 +1207 +1114 +3894 +5494 +1094 +12BF +1100 +1280 +147F +0000 +0000 +ENDCHAR +STARTCHAR U+68B5 +ENCODING 26805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +1C70 +1A70 +2AA8 +4924 +07C0 +0440 +0640 +0540 +0944 +1044 +203C +0000 +ENDCHAR +STARTCHAR U+68B6 +ENCODING 26806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +7FF8 +0908 +19F0 +1D40 +1BF8 +2B40 +29FC +4940 +0A44 +0A44 +0C3C +0000 +ENDCHAR +STARTCHAR U+68B9 +ENCODING 26809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +11C0 +7D00 +11FC +1910 +3510 +3510 +3110 +57FC +5110 +1108 +1204 +1404 +0000 +ENDCHAR +STARTCHAR U+68BA +ENCODING 26810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +1C70 +2AA8 +4B24 +0820 +7FFC +0100 +01C0 +0120 +0110 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+68BB +ENCODING 26811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1094 +1094 +11FF +FD15 +1315 +137F +3554 +3954 +357F +5115 +5115 +9115 +1135 +1125 +1125 +1143 +ENDCHAR +STARTCHAR U+68BC +ENCODING 26812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7C40 +11F8 +1040 +3FFC +3490 +37FC +5110 +5290 +1490 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+68C0 +ENCODING 26816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +10A0 +FD10 +120E +35F4 +3000 +5840 +5648 +914C +1148 +1150 +1004 +1FFE +1000 +ENDCHAR +STARTCHAR U+68C2 +ENCODING 26818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1008 +1008 +FDF8 +1008 +3008 +3BF8 +5440 +5148 +9148 +1250 +10A0 +1090 +110E +1604 +ENDCHAR +STARTCHAR U+68C4 +ENCODING 26820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0240 +1FE0 +0930 +7FFC +0920 +0FE0 +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+68C5 +ENCODING 26821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +11E0 +1020 +7FFF +1020 +3020 +39FC +3424 +53FF +5024 +51FC +1070 +10A8 +1124 +1222 +1421 +ENDCHAR +STARTCHAR U+68C6 +ENCODING 26822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7D10 +13F8 +1404 +3BF8 +36A8 +36A8 +53F8 +52A8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+68C7 +ENCODING 26823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +1044 +1082 +7D11 +1010 +1020 +1044 +387C +5404 +1152 +1152 +1149 +1242 +107E +0000 +0000 +ENDCHAR +STARTCHAR U+68C8 +ENCODING 26824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FE10 +10FE +1010 +39FF +3400 +32FE +5082 +50FE +9082 +10FE +1082 +1082 +108E +ENDCHAR +STARTCHAR U+68C9 +ENCODING 26825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +08F8 +7E88 +08F8 +1C88 +1AF8 +1A20 +29FC +2924 +4924 +0924 +0938 +0820 +0000 +ENDCHAR +STARTCHAR U+68CA +ENCODING 26826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0440 +07C0 +0440 +07C0 +0440 +7FFC +0920 +1FF0 +638C +0D60 +3118 +0100 +0000 +ENDCHAR +STARTCHAR U+68CB +ENCODING 26827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +0890 +7FFC +0890 +1CF0 +1A90 +1AF0 +2890 +2BFC +4890 +0888 +0904 +0A04 +0000 +ENDCHAR +STARTCHAR U+68CC +ENCODING 26828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +FE21 +1133 +1192 +3880 +3410 +3210 +51FF +5054 +9054 +10D6 +1092 +1193 +1010 +ENDCHAR +STARTCHAR U+68CD +ENCODING 26829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +7F08 +09F8 +1D08 +1BF8 +1B20 +2924 +29F8 +4920 +0924 +09E4 +0F1C +0000 +ENDCHAR +STARTCHAR U+68CE +ENCODING 26830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1129 +1129 +7C48 +108E +1000 +1010 +39FF +5410 +1054 +1092 +1111 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+68CF +ENCODING 26831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1104 +FDFC +1104 +1104 +39FC +3400 +33FF +5008 +53FF +9108 +1188 +1088 +1008 +1038 +ENDCHAR +STARTCHAR U+68D0 +ENCODING 26832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7C3E +0420 +3C3C +0420 +3C20 +643E +0C20 +1820 +0100 +FFFF +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+68D1 +ENCODING 26833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +1024 +1024 +FEE7 +1024 +1024 +3824 +34E7 +3224 +5024 +50E4 +91A7 +1024 +1064 +10C4 +1184 +ENDCHAR +STARTCHAR U+68D2 +ENCODING 26834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +7E40 +09F8 +1CA0 +1BFC +1B50 +2BF8 +2C44 +4BF8 +0840 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+68D3 +ENCODING 26835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FE +FD04 +118C +1088 +3888 +37FF +3400 +5000 +51FC +9104 +1104 +1104 +1104 +11FC +ENDCHAR +STARTCHAR U+68D4 +ENCODING 26836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +09E0 +0920 +7FFC +0920 +1D10 +1BD4 +1B0C +29FC +2908 +49F8 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+68D5 +ENCODING 26837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7F08 +0A00 +1CF8 +1A00 +1BFC +2820 +28B0 +48A8 +0924 +0A24 +0860 +0000 +ENDCHAR +STARTCHAR U+68D6 +ENCODING 26838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1080 +FEFC +1080 +10FC +3880 +3480 +37FF +5092 +D096 +909C +1088 +108C +10E6 +1383 +ENDCHAR +STARTCHAR U+68D7 +ENCODING 26839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +1390 +1D60 +3110 +7FFC +0100 +1FF0 +1390 +1D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+68D8 +ENCODING 26840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +0820 +3EF8 +2AA8 +2AA8 +2AA8 +2EB8 +0C30 +1C70 +2AA8 +4924 +0820 +0000 +ENDCHAR +STARTCHAR U+68D9 +ENCODING 26841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1000 +FDFE +1102 +1102 +39FE +3510 +3510 +51FF +5110 +9138 +1128 +136C +1246 +16C3 +ENDCHAR +STARTCHAR U+68DA +ENCODING 26842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +7EA8 +12A8 +13B8 +3AA8 +36A8 +37B8 +52A8 +52A8 +14C8 +14C8 +1998 +0000 +ENDCHAR +STARTCHAR U+68DC +ENCODING 26844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +2208 +221C +FFD4 +2236 +2223 +23C0 +7240 +6A58 +AE4C +A446 +2440 +24D8 +2C8C +2886 +2980 +ENDCHAR +STARTCHAR U+68DD +ENCODING 26845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +FD11 +1111 +11FF +3911 +3511 +357D +5145 +5145 +9145 +117D +1101 +11FF +1000 +ENDCHAR +STARTCHAR U+68DE +ENCODING 26846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1101 +1103 +7D7D +1111 +1111 +39FF +5511 +1139 +1155 +1193 +1111 +1101 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+68DF +ENCODING 26847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7C40 +13F8 +1248 +3BF8 +3648 +37F8 +50E0 +5150 +1648 +1044 +1040 +0000 +ENDCHAR +STARTCHAR U+68E0 +ENCODING 26848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0920 +3FFC +2008 +4FE0 +0820 +0FE0 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+68E1 +ENCODING 26849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1528 +7CA8 +14C8 +1FF8 +3C48 +3558 +3558 +5558 +55F8 +1518 +1408 +1418 +0000 +ENDCHAR +STARTCHAR U+68E3 +ENCODING 26851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7C48 +13FC +1848 +37F8 +3648 +3168 +5170 +50D0 +1148 +1644 +10C0 +0000 +ENDCHAR +STARTCHAR U+68E4 +ENCODING 26852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +11FF +7C44 +1044 +11FF +1000 +38FE +5482 +10FE +1082 +1082 +10FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+68E5 +ENCODING 26853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1004 +1044 +FA5F +1184 +1084 +394C +360E +340D +5055 +5254 +91A4 +1084 +1144 +1204 +1004 +ENDCHAR +STARTCHAR U+68E6 +ENCODING 26854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1054 +1092 +7D11 +10FE +1012 +11FF +3812 +5412 +10FE +1010 +1010 +1050 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+68E7 +ENCODING 26855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +087C +7FC8 +0830 +1C34 +1BCC +1A54 +287C +2BC8 +4830 +0814 +086C +0984 +0000 +ENDCHAR +STARTCHAR U+68E8 +ENCODING 26856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0610 +3810 +203F +3F42 +21C4 +2128 +3F10 +206C +4183 +4080 +0080 +7FFF +01C0 +02A0 +0C98 +7087 +ENDCHAR +STARTCHAR U+68E9 +ENCODING 26857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1129 +1129 +1129 +7D29 +11EF +1101 +11FF +3901 +55EF +1129 +1129 +1129 +1129 +1229 +0000 +0000 +ENDCHAR +STARTCHAR U+68EA +ENCODING 26858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1091 +1093 +FDBA +1128 +106C +38C6 +3593 +3410 +5091 +5093 +91BA +1128 +106C +10C6 +1183 +ENDCHAR +STARTCHAR U+68EB +ENCODING 26859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +1012 +1012 +FDFF +1010 +13D0 +3A51 +3651 +325B +53CA +500E +91C8 +131D +1025 +10C7 +1002 +ENDCHAR +STARTCHAR U+68EC +ENCODING 26860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1222 +1326 +1124 +FBFE +1050 +1050 +3BFF +3488 +3104 +53FE +560B +9008 +11F8 +1102 +1106 +10FC +ENDCHAR +STARTCHAR U+68ED +ENCODING 26861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +FC90 +1090 +119E +3912 +3732 +332A +5566 +5114 +911C +1108 +111C +1136 +1163 +ENDCHAR +STARTCHAR U+68EE +ENCODING 26862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0380 +0D60 +3118 +0920 +0820 +7FFC +1860 +1C70 +2AA8 +4924 +0820 +0000 +ENDCHAR +STARTCHAR U+68EF +ENCODING 26863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7D10 +13F8 +1404 +39F0 +3420 +3440 +50A0 +52A8 +1284 +1494 +1070 +0000 +ENDCHAR +STARTCHAR U+68F0 +ENCODING 26864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +17C0 +1044 +FFFE +1248 +3248 +3A48 +57FC +5248 +9248 +1FFE +1040 +1048 +17FC +1000 +ENDCHAR +STARTCHAR U+68F1 +ENCODING 26865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +13F8 +1040 +FC44 +17FE +3910 +368C +54F4 +5110 +9110 +12A0 +1440 +10B0 +110E +1604 +ENDCHAR +STARTCHAR U+68F2 +ENCODING 26866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1040 +7DF8 +1048 +1BFC +3448 +35F8 +3040 +57FC +5090 +11D0 +1070 +1388 +0000 +ENDCHAR +STARTCHAR U+68F3 +ENCODING 26867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +1021 +114A +7C84 +114A +1231 +1000 +39EF +5421 +1129 +114A +1084 +114A +1231 +0000 +0000 +ENDCHAR +STARTCHAR U+68F4 +ENCODING 26868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13DF +1251 +1251 +7E51 +13D1 +1251 +1256 +3BD0 +565F +1259 +1259 +1255 +1252 +1295 +0000 +0000 +ENDCHAR +STARTCHAR U+68F5 +ENCODING 26869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1248 +1248 +FFF8 +1248 +3A48 +37F8 +5040 +5FFE +9040 +10E0 +1150 +124E +1C44 +1040 +ENDCHAR +STARTCHAR U+68F6 +ENCODING 26870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FBFF +1020 +1124 +3924 +36AA +32AA +5070 +5070 +90A8 +10AC +11A6 +1323 +1020 +ENDCHAR +STARTCHAR U+68F7 +ENCODING 26871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17E0 +1240 +125F +7E51 +13D1 +1251 +1251 +3BD1 +5651 +1251 +124A +17C4 +104A +1051 +0000 +0000 +ENDCHAR +STARTCHAR U+68F8 +ENCODING 26872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +223E +3E22 +2214 +3E08 +2214 +7E22 +0280 +0080 +7FFF +0490 +0888 +3086 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+68F9 +ENCODING 26873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +107C +7C40 +13F8 +1A08 +37F8 +3608 +33F8 +5040 +57FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+68FA +ENCODING 26874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +7E08 +09F0 +1910 +1D10 +1BF0 +2B00 +29F8 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+68FB +ENCODING 26875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0660 +0C30 +3FFC +E217 +0210 +0630 +0920 +FFFF +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+68FC +ENCODING 26876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0828 +7EFC +0820 +1C70 +2AAC +4920 +04C0 +0820 +1010 +2FEE +C424 +0420 +0420 +08A0 +1040 +ENDCHAR +STARTCHAR U+68FD +ENCODING 26877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FEFF +2854 +2C54 +6AD6 +C993 +0910 +06C0 +3838 +E7CF +0000 +1FF8 +0030 +0060 +00C0 +ENDCHAR +STARTCHAR U+6900 +ENCODING 26880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7E08 +1500 +19F8 +3568 +3768 +32E8 +54B8 +50A0 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+6901 +ENCODING 26881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1000 +7DF0 +1110 +19F0 +3400 +37F8 +3010 +5060 +57FC +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+6904 +ENCODING 26884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7D10 +10A0 +1FFC +3440 +37FC +3090 +5090 +51E0 +1030 +10C8 +1708 +0000 +ENDCHAR +STARTCHAR U+6905 +ENCODING 26885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7E60 +0850 +1C88 +1BFC +1A08 +29E8 +2928 +49E8 +0928 +0808 +0818 +0000 +ENDCHAR +STARTCHAR U+6906 +ENCODING 26886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +FD11 +117D +1111 +3911 +357D +3501 +517D +5145 +9145 +117D +1101 +1301 +1203 +ENDCHAR +STARTCHAR U+6907 +ENCODING 26887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +7CFE +1082 +10FE +1082 +38FE +5482 +1082 +11FF +1044 +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+6908 +ENCODING 26888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +11F8 +7E88 +14A8 +12A8 +39C8 +37F8 +35C8 +51A8 +52A8 +1488 +1088 +1030 +0000 +ENDCHAR +STARTCHAR U+6909 +ENCODING 26889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0808 +1EFE +7248 +1648 +1CFE +F008 +0108 +FFFF +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+690A +ENCODING 26890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FE00 +1042 +1042 +38C6 +3529 +3210 +5010 +51FF +9010 +1010 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+690B +ENCODING 26891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7E00 +08F8 +1888 +1C88 +1AF8 +2A20 +28B0 +48A8 +0924 +0A24 +0860 +0000 +ENDCHAR +STARTCHAR U+690C +ENCODING 26892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7EA8 +14A0 +18A4 +351C +3600 +33F8 +5040 +5040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+690D +ENCODING 26893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7E20 +0978 +1948 +1D78 +1B48 +2B78 +2948 +4978 +0900 +09FC +0900 +0000 +ENDCHAR +STARTCHAR U+690E +ENCODING 26894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +08A0 +7FFC +0920 +1B20 +1DF8 +1B20 +2B20 +29F8 +4920 +0920 +09FC +0900 +0000 +ENDCHAR +STARTCHAR U+690F +ENCODING 26895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +10A0 +7CA0 +10A0 +1BB8 +3608 +3608 +33B8 +52A8 +50A0 +10A0 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6910 +ENCODING 26896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1204 +1204 +FFFC +1220 +3224 +3BFE +5620 +5224 +93FE +1304 +1504 +1504 +19FC +1104 +ENDCHAR +STARTCHAR U+6911 +ENCODING 26897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1040 +11FE +FD22 +1122 +11FE +3922 +3522 +35FE +5090 +5110 +93FF +1010 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+6912 +ENCODING 26898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +11FC +7D24 +1124 +17E8 +3928 +3518 +3790 +5350 +5568 +1928 +1144 +1384 +0000 +ENDCHAR +STARTCHAR U+6913 +ENCODING 26899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1040 +FCC0 +11A2 +1326 +3A74 +34D0 +3190 +5338 +5058 +90D4 +1196 +1313 +1030 +10E0 +ENDCHAR +STARTCHAR U+6914 +ENCODING 26900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1049 +1092 +1124 +1124 +7C92 +1049 +1000 +39FF +5511 +1111 +11FF +1111 +1111 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+6915 +ENCODING 26901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +1214 +1004 +7C1F +1004 +13E4 +1124 +392E +5535 +1124 +1124 +1224 +1424 +10C4 +0000 +0000 +ENDCHAR +STARTCHAR U+6916 +ENCODING 26902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1000 +FDFE +1102 +1102 +39FE +3510 +3510 +51FF +5120 +913E +1322 +1262 +1642 +10C6 +ENDCHAR +STARTCHAR U+6917 +ENCODING 26903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FD01 +1101 +10FE +3810 +3410 +3490 +509E +5090 +9090 +1090 +11D0 +1170 +131F +ENDCHAR +STARTCHAR U+6919 +ENCODING 26905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7FF0 +1110 +19F0 +3510 +3400 +33F8 +5208 +53F8 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+691A +ENCODING 26906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +7FB8 +12A8 +1BB8 +3608 +3608 +3208 +5208 +5208 +1208 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+691B +ENCODING 26907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +0BFC +7E90 +0840 +1C64 +1AA4 +1BA8 +29B0 +2AA0 +48A0 +08A4 +08A4 +089C +0000 +ENDCHAR +STARTCHAR U+691C +ENCODING 26908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +08A0 +7F10 +0BF8 +1844 +1DF8 +1B48 +2B48 +29F8 +4860 +0890 +0B08 +0C04 +0000 +ENDCHAR +STARTCHAR U+691F +ENCODING 26911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +13FC +1040 +FC40 +13FE +3122 +38A4 +5620 +5120 +9024 +17FE +1040 +1058 +1186 +1602 +ENDCHAR +STARTCHAR U+6920 +ENCODING 26912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0A0C +7F70 +1440 +1444 +3F7E +0448 +7F48 +0488 +0508 +FFFE +0380 +0540 +1930 +610E +0100 +ENDCHAR +STARTCHAR U+6921 +ENCODING 26913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +17C8 +1128 +7DA8 +12A8 +17E8 +3968 +3528 +37E8 +5128 +5128 +11C8 +1708 +1018 +0000 +ENDCHAR +STARTCHAR U+6922 +ENCODING 26914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +7FF8 +1248 +1A48 +37F8 +3648 +3268 +5258 +53F8 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+6923 +ENCODING 26915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +10A0 +7FF8 +12A8 +1AA8 +37F8 +36A8 +32A8 +57FC +50A0 +1090 +1108 +1608 +0000 +ENDCHAR +STARTCHAR U+6924 +ENCODING 26916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1294 +1294 +FE94 +13FC +3080 +3888 +55FC +5108 +9288 +1450 +1020 +10C0 +1300 +1C00 +ENDCHAR +STARTCHAR U+6925 +ENCODING 26917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1200 +1238 +7FE8 +1528 +1928 +3FE8 +3528 +3528 +51A8 +5268 +1278 +1428 +1800 +0000 +ENDCHAR +STARTCHAR U+6926 +ENCODING 26918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1150 +1148 +7FF8 +1040 +1BFC +34A0 +3550 +364C +53F8 +5088 +1088 +1108 +1230 +0000 +ENDCHAR +STARTCHAR U+6927 +ENCODING 26919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1030 +1048 +1084 +7D02 +1201 +31FE +3800 +7400 +53DE +5252 +5252 +13D2 +1256 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+6928 +ENCODING 26920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +13FC +7E48 +1248 +1A48 +36FC +36C8 +33A8 +52A8 +5488 +1488 +1888 +1098 +0000 +ENDCHAR +STARTCHAR U+692A +ENCODING 26922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1090 +10A0 +7FFC +10A0 +1AA8 +36A8 +35A8 +31B0 +51B0 +51A0 +10A0 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+692D +ENCODING 26925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2790 +2494 +257E +FD10 +2624 +757E +6DA4 +A4A4 +24BC +26A4 +2524 +243C +2424 +2424 +242C +ENDCHAR +STARTCHAR U+692F +ENCODING 26927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +1124 +1124 +7DFC +1000 +13FE +3820 +5440 +13FE +1252 +1252 +1252 +1252 +1206 +0000 +0000 +ENDCHAR +STARTCHAR U+6930 +ENCODING 26928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +12A8 +7EA8 +13B0 +1AB0 +36A8 +37A8 +32A4 +52E4 +53A4 +16B8 +10A0 +10A0 +0000 +ENDCHAR +STARTCHAR U+6931 +ENCODING 26929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FE +1080 +FDFE +1102 +11FE +3902 +35FE +3502 +51FE +5040 +90FE +1386 +10CC +1078 +13CF +ENDCHAR +STARTCHAR U+6932 +ENCODING 26930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FE +7C12 +13FF +1000 +11FE +3902 +55FE +1010 +11FF +1110 +13FF +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6933 +ENCODING 26931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +FD22 +11FE +1122 +3922 +35FE +3000 +53FF +5122 +9126 +1134 +1158 +11CC +1187 +ENDCHAR +STARTCHAR U+6934 +ENCODING 26932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10B8 +1328 +7E28 +13AC +124C +3A04 +37F8 +3628 +52A8 +5310 +1630 +1248 +1204 +0000 +ENDCHAR +STARTCHAR U+6935 +ENCODING 26933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2242 +FA42 +2242 +23DE +2200 +723E +6BC2 +AA26 +A214 +221C +23C8 +221C +2236 +2263 +ENDCHAR +STARTCHAR U+6936 +ENCODING 26934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1228 +13C8 +7E68 +1298 +1BF8 +34A0 +3524 +329C +50F0 +5190 +1660 +10F0 +170C +0000 +ENDCHAR +STARTCHAR U+6937 +ENCODING 26935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +1009 +13FF +7E08 +13F8 +1208 +3AE8 +56A9 +12AA +12AC +12E8 +1215 +1403 +1001 +0000 +0000 +ENDCHAR +STARTCHAR U+6938 +ENCODING 26936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +2220 +2120 +FFFF +2240 +2208 +23AB +72AD +6AB9 +AAE9 +A2AB +24A8 +24A0 +24A1 +2CB3 +219E +ENDCHAR +STARTCHAR U+6939 +ENCODING 26937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +17FC +7D10 +11F0 +1910 +35F0 +3510 +37FC +52A0 +52A8 +1318 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+693B +ENCODING 26939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1200 +FEFE +1282 +12FE +3A82 +36FE +3220 +53FF +5244 +92E8 +123C +12E6 +1200 +13FF +ENDCHAR +STARTCHAR U+693C +ENCODING 26940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1086 +7D20 +1210 +104F +1082 +1122 +3B12 +5502 +1112 +1112 +1122 +1102 +1106 +0000 +0000 +ENDCHAR +STARTCHAR U+693D +ENCODING 26941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F8 +1110 +7DF0 +1020 +1FFC +34C8 +3768 +30B0 +5370 +50A8 +1724 +1020 +10C0 +0000 +ENDCHAR +STARTCHAR U+693F +ENCODING 26943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7C40 +11F0 +18A0 +37FC +3510 +33F8 +5514 +51F0 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+6940 +ENCODING 26944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +10F8 +1010 +10FE +7C92 +1092 +10FE +3810 +55FF +1115 +117D +1105 +1101 +1107 +0000 +0000 +ENDCHAR +STARTCHAR U+6941 +ENCODING 26945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +7C01 +1080 +11FC +1288 +1050 +3820 +57DF +1000 +13FE +1202 +1202 +13FE +0000 +0000 +ENDCHAR +STARTCHAR U+6942 +ENCODING 26946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1048 +17FC +FCE0 +1150 +324E +3C44 +57F8 +5208 +93F8 +1208 +13F8 +1000 +1FFE +1000 +ENDCHAR +STARTCHAR U+6944 +ENCODING 26948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +10FC +1080 +7CFE +1082 +10FE +3880 +54FF +10A5 +11A5 +12FF +10A5 +10A5 +1083 +0000 +0000 +ENDCHAR +STARTCHAR U+6945 +ENCODING 26949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1000 +FEFE +1082 +1082 +38FE +3400 +35FF +5111 +5111 +91FF +1111 +1111 +1111 +11FF +ENDCHAR +STARTCHAR U+6948 +ENCODING 26952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1021 +7D3C +11A0 +127F +1400 +11FE +3902 +55FE +1102 +11FE +1102 +1102 +1206 +0000 +0000 +ENDCHAR +STARTCHAR U+6949 +ENCODING 26953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +11FF +FE44 +1044 +1020 +3820 +35FF +3240 +5040 +50FF +91C1 +1341 +1041 +1041 +107F +ENDCHAR +STARTCHAR U+694A +ENCODING 26954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1110 +19F0 +3400 +37FC +3100 +53F8 +54A8 +1128 +1248 +10B0 +0000 +ENDCHAR +STARTCHAR U+694B +ENCODING 26955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1041 +11F1 +7C45 +11F5 +1155 +1155 +39F5 +5445 +10E1 +1151 +1249 +1041 +1041 +1042 +0000 +0000 +ENDCHAR +STARTCHAR U+694C +ENCODING 26956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1082 +7C44 +11FF +1104 +1108 +3912 +5524 +1108 +1112 +1204 +1008 +10F0 +0000 +0000 +ENDCHAR +STARTCHAR U+694E +ENCODING 26958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1201 +FE21 +11FE +1020 +39FE +3522 +31FE +5122 +51FE +9020 +1020 +13FF +1020 +1020 +ENDCHAR +STARTCHAR U+694F +ENCODING 26959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +1050 +7C88 +1124 +12FA +1421 +3BFE +5420 +11FC +1020 +1020 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+6951 +ENCODING 26961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17D2 +1054 +1259 +7D8A +1104 +1202 +15FD +3820 +5420 +13FE +1020 +1050 +1088 +1306 +0000 +0000 +ENDCHAR +STARTCHAR U+6952 +ENCODING 26962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1124 +1124 +7DFC +1124 +1124 +11FC +3800 +5444 +10A2 +1291 +1284 +1282 +147E +0000 +0000 +ENDCHAR +STARTCHAR U+6953 +ENCODING 26963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1238 +7FC8 +1248 +1BF8 +3758 +3758 +33F8 +536C +525C +147C +1784 +1804 +0000 +ENDCHAR +STARTCHAR U+6954 +ENCODING 26964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +17FC +7924 +17E4 +1124 +39C4 +3718 +3540 +57FC +5040 +10A0 +1310 +1C0C +0000 +ENDCHAR +STARTCHAR U+6955 +ENCODING 26965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0BFC +0880 +7FF8 +0920 +1BFC +1C00 +1BF8 +2B08 +2BF8 +4908 +09F8 +0908 +0918 +0000 +ENDCHAR +STARTCHAR U+6956 +ENCODING 26966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13EF +1229 +7E29 +13E9 +1229 +3A29 +57ED +120A +1288 +1248 +12A8 +1318 +1608 +0000 +0000 +ENDCHAR +STARTCHAR U+6957 +ENCODING 26967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1014 +177E +1114 +FDFE +1214 +377C +3910 +557C +5110 +95FE +1510 +1210 +1516 +18FC +1000 +ENDCHAR +STARTCHAR U+6958 +ENCODING 26968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F10 +0220 +1CFF +7F04 +0C04 +1428 +6410 +0C2F +0080 +7FFF +02A0 +0490 +788F +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+6959 +ENCODING 26969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +17D0 +1090 +7F7C +1110 +17D0 +3978 +35B8 +3738 +5354 +5554 +1910 +1110 +1310 +0000 +ENDCHAR +STARTCHAR U+695A +ENCODING 26970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0420 +7FFC +0E60 +15B0 +652C +0420 +7FF8 +0110 +1120 +11F0 +1900 +2700 +41FC +0000 +ENDCHAR +STARTCHAR U+695B +ENCODING 26971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13FF +FC84 +1084 +1020 +3820 +37FF +3420 +5020 +51FE +9102 +1102 +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+695C +ENCODING 26972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1138 +1128 +7FE8 +1128 +1938 +37A8 +36A8 +32B8 +52A8 +53C8 +1248 +1088 +1118 +0000 +ENDCHAR +STARTCHAR U+695D +ENCODING 26973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7C40 +13F8 +1B58 +36D8 +36E8 +33F8 +50E0 +5150 +164C +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+695E +ENCODING 26974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +7EA8 +13F8 +1248 +3840 +37FC +3440 +5078 +5088 +1088 +1108 +1630 +0000 +ENDCHAR +STARTCHAR U+695F +ENCODING 26975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1000 +7CFE +1082 +10FE +3800 +55FF +1101 +117D +1010 +1010 +1010 +1070 +0000 +0000 +ENDCHAR +STARTCHAR U+6960 +ENCODING 26976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7C40 +13F8 +1328 +3AC8 +37F8 +3648 +53F8 +5248 +1248 +1248 +1218 +0000 +ENDCHAR +STARTCHAR U+6961 +ENCODING 26977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11C0 +1040 +10A0 +7D10 +13F8 +1404 +3FA8 +3CA8 +36A8 +55D0 +56D0 +15A8 +14A8 +15A8 +0000 +ENDCHAR +STARTCHAR U+6962 +ENCODING 26978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1090 +10A0 +7FFC +14A0 +13F8 +3AA8 +36A8 +36B8 +5318 +53F8 +1208 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+6963 +ENCODING 26979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1224 +1224 +FFFC +1200 +32FC +3A84 +5684 +52FC +9284 +12FC +1484 +1484 +18FC +1084 +ENDCHAR +STARTCHAR U+6964 +ENCODING 26980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11FE +FD52 +1252 +1192 +38E2 +3532 +3246 +508C +5020 +90B0 +1296 +128B +1699 +1470 +ENDCHAR +STARTCHAR U+6965 +ENCODING 26981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +13F8 +1122 +FDB6 +1094 +11FE +3800 +37FF +3040 +50FC +5184 +930C +10D8 +1070 +10DC +1387 +ENDCHAR +STARTCHAR U+6966 +ENCODING 26982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1440 +17FE +1402 +F814 +13F8 +3000 +3BF8 +5608 +53F8 +9208 +13F8 +1208 +1000 +1FFE +1000 +ENDCHAR +STARTCHAR U+6968 +ENCODING 26984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +103F +7C20 +11FE +3102 +3102 +79FE +5502 +5102 +51FE +5102 +1102 +11FE +1102 +1201 +ENDCHAR +STARTCHAR U+6969 +ENCODING 26985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +21FF +2110 +FB10 +22FF +2691 +26FF +7291 +6AFF +AA10 +A250 +2230 +2238 +222C +2266 +22C3 +ENDCHAR +STARTCHAR U+696A +ENCODING 26986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1150 +1150 +17FC +7D50 +1170 +1900 +35F8 +3440 +37FC +50E0 +5150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+696B +ENCODING 26987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1000 +1FFC +3510 +35F0 +3110 +51F0 +511C +11F0 +1710 +1010 +0000 +ENDCHAR +STARTCHAR U+696C +ENCODING 26988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1104 +1104 +FDFC +1104 +1104 +39FC +3480 +31FF +5301 +5631 +93E1 +1201 +1213 +11F2 +100E +ENDCHAR +STARTCHAR U+696D +ENCODING 26989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +1290 +0AA0 +7FFC +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+696E +ENCODING 26990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7C48 +1050 +1FFC +3460 +3490 +31F8 +5708 +51F8 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+696F +ENCODING 26991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +13E0 +7E20 +13FC +1A20 +36F8 +3688 +32F8 +5288 +54F8 +1488 +18F8 +1088 +0000 +ENDCHAR +STARTCHAR U+6970 +ENCODING 26992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +11A0 +132E +FE22 +1222 +13AE +3A22 +3622 +33FE +5020 +5070 +9050 +10D0 +1091 +119B +170E +ENDCHAR +STARTCHAR U+6971 +ENCODING 26993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +13FC +1040 +FDF8 +1080 +37FC +3910 +5608 +55F6 +9840 +13F8 +1040 +10B0 +110C +1604 +ENDCHAR +STARTCHAR U+6972 +ENCODING 26994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +1009 +1008 +FFFF +1208 +12E8 +3A09 +3649 +33FB +52AA +52AE +92E4 +1255 +128D +1217 +1462 +ENDCHAR +STARTCHAR U+6973 +ENCODING 26995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +0BFC +7E90 +08F0 +1890 +1CF0 +1A40 +2BFC +28E0 +4950 +0E48 +0844 +0840 +0000 +ENDCHAR +STARTCHAR U+6974 +ENCODING 26996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7D10 +10A0 +1BFC +3648 +3440 +33F8 +5248 +5248 +1248 +1270 +1040 +0000 +ENDCHAR +STARTCHAR U+6975 +ENCODING 26997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1080 +7C80 +11DC +1124 +3BB4 +36A8 +36A8 +53B4 +5224 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6976 +ENCODING 26998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3CFF +0111 +0828 +3C44 +0083 +0FF8 +0808 +0FF8 +0080 +7FFF +02A0 +0490 +788F +0000 +0000 +ENDCHAR +STARTCHAR U+6977 +ENCODING 26999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0924 +09E8 +7F30 +0920 +19E4 +1F3C +1A40 +2BF8 +2908 +49F8 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+6978 +ENCODING 27000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1090 +1710 +7D14 +1134 +17F8 +3958 +3590 +3750 +5350 +5528 +1928 +1144 +1184 +0000 +ENDCHAR +STARTCHAR U+6979 +ENCODING 27001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +1090 +7C9C +11F4 +1954 +3664 +3698 +33F8 +52A8 +52A8 +12A8 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+697A +ENCODING 27002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +104C +FE30 +11FF +1052 +3854 +3490 +3510 +5020 +53FF +90A8 +10AC +11A6 +1323 +1020 +ENDCHAR +STARTCHAR U+697B +ENCODING 27003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1040 +11FE +FD02 +11FE +1102 +3902 +35FE +3400 +51FE +5020 +9020 +10FC +1020 +1020 +13FF +ENDCHAR +STARTCHAR U+697C +ENCODING 27004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0A48 +0950 +7FFC +08E0 +0D50 +1A48 +1A40 +2BFC +4890 +09D0 +0820 +08D0 +0F08 +0000 +ENDCHAR +STARTCHAR U+697D +ENCODING 27005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2208 +17C8 +1450 +07E0 +1C58 +67C4 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+697E +ENCODING 27006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +13F8 +7E08 +13F8 +1A08 +37F8 +3448 +37E8 +50F0 +5150 +1248 +1444 +10C0 +0000 +ENDCHAR +STARTCHAR U+697F +ENCODING 27007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +1038 +11E0 +FC20 +13FF +10A8 +39AC +3726 +3623 +51FC +5104 +9104 +11FC +1104 +1104 +11FC +ENDCHAR +STARTCHAR U+6980 +ENCODING 27008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +13FC +1208 +FE08 +1208 +33F8 +3800 +5404 +57BE +94A4 +14A4 +14A4 +14A4 +17BC +14A4 +ENDCHAR +STARTCHAR U+6981 +ENCODING 27009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7E08 +17FC +18A0 +3510 +37E8 +3040 +53F8 +5040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6982 +ENCODING 27010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1510 +7D50 +1750 +1550 +3DFC +3730 +3630 +5530 +55D0 +16D4 +1C94 +110C +0000 +ENDCHAR +STARTCHAR U+6983 +ENCODING 27011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +7F7F +0808 +1C1C +2A2A +4949 +0808 +1FFC +1084 +1FFC +1084 +1FFC +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+6984 +ENCODING 27012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1120 +1520 +1524 +153E +FD50 +1588 +3008 +3BFC +5608 +5248 +9248 +1248 +12A8 +10A2 +1122 +161E +ENDCHAR +STARTCHAR U+6986 +ENCODING 27014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1060 +1090 +1108 +FEF6 +1400 +33C4 +3A54 +5654 +53D4 +9254 +1254 +13C4 +1244 +1254 +12C8 +ENDCHAR +STARTCHAR U+6987 +ENCODING 27015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1048 +17FC +1000 +FD10 +10A4 +37FE +3840 +5448 +57FC +9040 +1150 +124C +1444 +1140 +1080 +ENDCHAR +STARTCHAR U+6988 +ENCODING 27016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1404 +12FE +1404 +FC04 +15F4 +3514 +3D14 +55F4 +5404 +95F4 +1514 +1514 +15F4 +1414 +1408 +ENDCHAR +STARTCHAR U+6989 +ENCODING 27017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1444 +1248 +1010 +FC04 +17FE +30A0 +3910 +5648 +55F6 +9840 +13F8 +1040 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+698A +ENCODING 27018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +1110 +7FFC +10D4 +18D4 +357C +3554 +33D4 +55FC +5954 +1110 +1110 +1110 +0000 +ENDCHAR +STARTCHAR U+698D +ENCODING 27021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1204 +1204 +FFFC +1220 +3324 +3AA8 +57FC +5304 +95FC +1504 +15FC +1504 +1914 +1108 +ENDCHAR +STARTCHAR U+698E +ENCODING 27022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0840 +7FF8 +0908 +1DF8 +1BF8 +1B08 +29F8 +28F8 +4B90 +0860 +09B0 +0E0C +0000 +ENDCHAR +STARTCHAR U+6990 +ENCODING 27024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1201 +13FF +7E44 +1244 +12FE +1244 +3BFF +5641 +124A +124C +1454 +1062 +10C1 +0000 +0000 +ENDCHAR +STARTCHAR U+6991 +ENCODING 27025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +17FC +1040 +7FF8 +1248 +1BF8 +3648 +37F8 +3248 +5010 +57FC +1110 +1090 +1030 +0000 +ENDCHAR +STARTCHAR U+6992 +ENCODING 27026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27DF +2041 +F841 +27DF +2410 +2410 +77DF +6841 +AE59 +A249 +21C7 +234D +2659 +20C3 +238E +ENDCHAR +STARTCHAR U+6993 +ENCODING 27027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1012 +1049 +1144 +7D48 +1151 +1121 +3A5E +5480 +1000 +11FE +114A +114A +114A +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+6994 +ENCODING 27028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +113C +17A4 +7CA8 +14A8 +17B0 +3CA8 +3FA4 +3624 +5524 +54A4 +1578 +1660 +1820 +0000 +ENDCHAR +STARTCHAR U+6995 +ENCODING 27029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7E08 +1510 +1948 +3648 +34A0 +3110 +53F8 +5514 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+6996 +ENCODING 27030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +083C +FF24 +0824 +7E24 +0047 +FF00 +817E +BD22 +0822 +FF36 +2A1C +2A08 +6B1C +C9B6 +0863 +ENDCHAR +STARTCHAR U+6997 +ENCODING 27031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1022 +1044 +7CA9 +11EF +1000 +39FF +5400 +10FE +1082 +10FE +1082 +10FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+6998 +ENCODING 27032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +10FC +3E80 +48F8 +0888 +7EF8 +1480 +22FC +4100 +0104 +FFFE +0380 +0540 +3930 +C10E +0100 +ENDCHAR +STARTCHAR U+6999 +ENCODING 27033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +1088 +7C20 +1050 +1088 +1104 +3AFA +5401 +11FC +1104 +1104 +11FC +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+699A +ENCODING 27034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1050 +1000 +7DFC +1020 +1020 +11FC +3820 +5420 +13FE +1000 +1249 +1249 +1249 +0000 +0000 +ENDCHAR +STARTCHAR U+699B +ENCODING 27035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1040 +7FF8 +10A0 +17FC +3910 +36E8 +3444 +53F8 +50E0 +1150 +164C +1040 +0000 +ENDCHAR +STARTCHAR U+699C +ENCODING 27036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7D10 +10A0 +1BFC +3648 +37F8 +3040 +5078 +5088 +1088 +1108 +1630 +0000 +ENDCHAR +STARTCHAR U+699E +ENCODING 27038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1220 +1240 +7EFE +1382 +12FE +1282 +3AFE +5610 +1254 +1292 +1311 +1410 +1030 +0000 +0000 +ENDCHAR +STARTCHAR U+69A0 +ENCODING 27040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1208 +7DF0 +1110 +19F0 +3510 +35F0 +3040 +57FC +5000 +1090 +1108 +1608 +0000 +ENDCHAR +STARTCHAR U+69A1 +ENCODING 27041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FE +1020 +FDFE +1020 +13FF +3860 +348C +3330 +50C2 +53FE +9023 +10A4 +11A6 +1123 +1020 +ENDCHAR +STARTCHAR U+69A3 +ENCODING 27043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +207E +20C2 +FB24 +2098 +20E0 +7700 +69FC +A220 +23FE +2020 +2222 +23FE +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+69A4 +ENCODING 27044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +11EF +122A +7D4A +10CA +109F +3902 +5410 +11FF +1054 +1092 +1111 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+69A5 +ENCODING 27045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1104 +7DFC +1104 +31FC +3820 +7622 +5124 +50A8 +53FF +5048 +1048 +1089 +110F +1600 +ENDCHAR +STARTCHAR U+69A6 +ENCODING 27046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +FF28 +106C +7EC6 +4393 +4210 +7EFE +4210 +4238 +7E38 +1054 +FF56 +1093 +1010 +1010 +ENDCHAR +STARTCHAR U+69A7 +ENCODING 27047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1250 +7E50 +13DC +1A50 +37DC +3670 +33DC +5250 +5290 +1310 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+69A8 +ENCODING 27048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +13FE +128A +FD04 +1040 +38FE +3580 +5288 +54FC +9080 +1084 +10FE +1080 +1080 +1080 +ENDCHAR +STARTCHAR U+69A9 +ENCODING 27049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103C +1020 +13FF +7E21 +12FC +1220 +123C +3A10 +56FE +1244 +1228 +1210 +1428 +10C6 +0000 +0000 +ENDCHAR +STARTCHAR U+69AA +ENCODING 27050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1110 +1110 +7DFE +1110 +11FE +3910 +5510 +11FF +1001 +12A9 +12A9 +12A9 +1006 +0000 +0000 +ENDCHAR +STARTCHAR U+69AB +ENCODING 27051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1140 +1124 +11FE +FA20 +17FC +3220 +3BFC +5620 +53FE +9220 +1024 +17FE +1020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+69AC +ENCODING 27052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +1010 +7DFF +1000 +10FE +3882 +54FE +10C2 +1154 +1248 +1044 +10E3 +0000 +0000 +ENDCHAR +STARTCHAR U+69AD +ENCODING 27053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1104 +13C4 +1244 +FFC4 +127E +3BC4 +3664 +5254 +57D4 +90C4 +1144 +1244 +1444 +1154 +1088 +ENDCHAR +STARTCHAR U+69AE +ENCODING 27054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +2AA4 +2CA8 +4930 +1448 +2288 +3FFC +2108 +5FF0 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+69AF +ENCODING 27055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1008 +13FF +FE48 +1248 +1248 +3BFF +3642 +3242 +527F +5242 +93D2 +101A +100A +1002 +100E +ENDCHAR +STARTCHAR U+69B0 +ENCODING 27056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1018 +7DFF +1030 +105E +1091 +391F +5400 +10FE +1082 +10FE +1082 +10FE +0000 +0000 +ENDCHAR +STARTCHAR U+69B1 +ENCODING 27057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +1000 +7DF0 +1110 +17FC +3910 +35F0 +34C8 +5148 +5730 +1110 +11C8 +1304 +0000 +ENDCHAR +STARTCHAR U+69B2 +ENCODING 27058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +7E68 +1298 +1B08 +37F8 +3400 +33F8 +52A8 +52A8 +12A8 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+69B3 +ENCODING 27059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FF +7E00 +13DF +1244 +1244 +3A9F +5704 +1284 +1244 +125F +1240 +14A0 +111F +0000 +0000 +ENDCHAR +STARTCHAR U+69B4 +ENCODING 27060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13BC +1214 +7E94 +1254 +1AE4 +372C +3440 +33F8 +5248 +53F8 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+69B5 +ENCODING 27061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +7C00 +11FF +1082 +10FE +3882 +54FE +1082 +11FF +1002 +1002 +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+69B6 +ENCODING 27062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13FF +1210 +7EFE +1212 +13FF +1212 +3AFE +5610 +12FE +1282 +1482 +10FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+69B7 +ENCODING 27063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +13FE +12A2 +FCA4 +11FE +3120 +3B28 +55FC +5120 +9128 +11FC +1120 +1124 +11FE +1100 +ENDCHAR +STARTCHAR U+69B8 +ENCODING 27064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +227F +2249 +FA49 +227F +27C9 +2249 +727F +6A08 +AA08 +A27F +2388 +2608 +2008 +20FF +2000 +ENDCHAR +STARTCHAR U+69B9 +ENCODING 27065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13F8 +1110 +7D1E +117F +1151 +397E +5550 +115E +1140 +1154 +1254 +1095 +1127 +0000 +0000 +ENDCHAR +STARTCHAR U+69BA +ENCODING 27066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A44 +4948 +4840 +4BFE +7890 +4890 +4FFF +490C +7B26 +4E23 +4BFE +48A8 +49AC +CB26 +9820 +ENDCHAR +STARTCHAR U+69BB +ENCODING 27067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +1210 +7FF0 +1210 +1BF0 +3400 +37F8 +3198 +56E8 +5198 +16E8 +1088 +1198 +0000 +ENDCHAR +STARTCHAR U+69BC +ENCODING 27068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FE +FC20 +1020 +13FF +3840 +3448 +30BC +53E6 +5000 +91FE +1152 +1152 +1152 +13FF +ENDCHAR +STARTCHAR U+69BD +ENCODING 27069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +11FE +1011 +7C91 +1040 +1084 +38F8 +5411 +11FF +1010 +11FF +1010 +1028 +11C7 +0000 +0000 +ENDCHAR +STARTCHAR U+69BE +ENCODING 27070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7D78 +1148 +1BFC +3608 +35F8 +3108 +51F8 +5108 +11F8 +1108 +1118 +0000 +ENDCHAR +STARTCHAR U+69BF +ENCODING 27071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1248 +7FF8 +1000 +1FFC +3400 +35F0 +3110 +51F0 +5110 +10A0 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+69C1 +ENCODING 27073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7C00 +11F0 +1910 +35F0 +3400 +33F8 +5208 +52E8 +12A8 +12E8 +1218 +0000 +ENDCHAR +STARTCHAR U+69C2 +ENCODING 27074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17C1 +107E +1088 +7D12 +127F +1108 +3991 +557F +1308 +152A +112A +1149 +1508 +1218 +0000 +0000 +ENDCHAR +STARTCHAR U+69C3 +ENCODING 27075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08F0 +3E90 +3294 +2B0C +2FF8 +7A90 +2A60 +479C +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+69C4 +ENCODING 27076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +10F8 +1021 +7D11 +1092 +1044 +1000 +3840 +558F +1101 +11EF +1101 +1101 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+69C5 +ENCODING 27077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1000 +FEFE +1082 +10FE +3800 +35FF +3329 +5149 +5187 +9101 +117D +1111 +1111 +1113 +ENDCHAR +STARTCHAR U+69C6 +ENCODING 27078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +1088 +7D00 +13FF +1401 +11F9 +3909 +55F9 +1109 +11F9 +1001 +1002 +101C +0000 +0000 +ENDCHAR +STARTCHAR U+69C7 +ENCODING 27079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0898 +08E0 +0884 +7F7C +0978 +1948 +1D78 +1B48 +2B78 +2948 +4978 +09FC +08D8 +0B04 +0000 +ENDCHAR +STARTCHAR U+69C8 +ENCODING 27080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1100 +FF7E +1100 +11FF +3962 +3554 +3368 +5147 +5104 +91FF +1104 +1344 +1224 +140C +ENDCHAR +STARTCHAR U+69C9 +ENCODING 27081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1008 +11FF +7D20 +1120 +157F +1308 +1508 +3908 +557F +1108 +1114 +1222 +1041 +0000 +0000 +ENDCHAR +STARTCHAR U+69CA +ENCODING 27082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +14F8 +7F88 +08F8 +2A88 +2AF8 +3E88 +0918 +1100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+69CB +ENCODING 27083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +0BFC +08A0 +7FF8 +08A0 +1BFC +1C40 +1BF8 +2B48 +29F8 +4948 +0BFC +0908 +0918 +0000 +ENDCHAR +STARTCHAR U+69CC +ENCODING 27084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1220 +1178 +7D48 +1048 +1078 +3B40 +3578 +3548 +5148 +5178 +1148 +1280 +147C +0000 +ENDCHAR +STARTCHAR U+69CD +ENCODING 27085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7FF0 +1208 +15F4 +3910 +35F0 +35F0 +5100 +53F8 +1508 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+69CE +ENCODING 27086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +10A0 +17FC +7C40 +13F8 +1840 +37FC +3500 +31F8 +5240 +5440 +1840 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+69CF +ENCODING 27087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1050 +13FF +7C50 +11FE +1052 +13FF +3852 +55FE +1050 +1154 +1252 +1451 +1050 +0000 +0000 +ENDCHAR +STARTCHAR U+69D0 +ENCODING 27088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +13F8 +7E48 +1248 +1BF8 +3648 +37F8 +3150 +5150 +5168 +127C +1444 +183C +0000 +ENDCHAR +STARTCHAR U+69D1 +ENCODING 27089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +4242 +4242 +7E7E +0810 +0810 +FEFF +1818 +1C38 +2A54 +2A54 +4992 +8991 +0810 +ENDCHAR +STARTCHAR U+69D3 +ENCODING 27091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0840 +7FFC +0800 +19F8 +1D08 +1BF8 +2B08 +29F8 +4908 +09F8 +0998 +0E04 +0000 +ENDCHAR +STARTCHAR U+69D4 +ENCODING 27092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1088 +13FC +1208 +FFF8 +1208 +33F8 +3880 +57FE +5110 +9248 +1446 +1BF8 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+69D6 +ENCODING 27094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +0100 +1FF8 +0000 +7FFE +4002 +5FFA +0200 +0FF8 +3408 +07F8 +0100 +7FFE +0910 +710E +ENDCHAR +STARTCHAR U+69D7 +ENCODING 27095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +13FF +FC80 +11FE +1182 +3A82 +34FE +3400 +51FF +5101 +917D +1145 +1145 +117D +1103 +ENDCHAR +STARTCHAR U+69D8 +ENCODING 27096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0850 +09FC +7E20 +08F8 +1820 +1DFC +1B24 +2AB8 +2870 +48A8 +0B24 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+69D9 +ENCODING 27097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +7E40 +09F0 +1910 +1DF0 +1B10 +2BF0 +2910 +49F0 +0FFC +0990 +0E08 +0000 +ENDCHAR +STARTCHAR U+69DB +ENCODING 27099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1090 +1294 +12BE +FED0 +128C +3284 +3880 +5408 +53FC +92A8 +12A8 +12A8 +12A8 +1FFE +1000 +ENDCHAR +STARTCHAR U+69DD +ENCODING 27101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +13F0 +1210 +7FF0 +1210 +1BF0 +3600 +37FC +3200 +53FC +5494 +1494 +17F4 +1418 +0000 +ENDCHAR +STARTCHAR U+69DE +ENCODING 27102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7D10 +10A0 +1FFC +3400 +37F8 +3248 +53F8 +5248 +13FC +1244 +103C +0000 +ENDCHAR +STARTCHAR U+69DF +ENCODING 27103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +17FE +1402 +F834 +11C0 +3108 +39FC +5510 +5110 +9114 +1FFE +1000 +1110 +120C +1404 +ENDCHAR +STARTCHAR U+69E0 +ENCODING 27104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1420 +1224 +12FC +F828 +1630 +33FE +3A40 +56FC +5344 +9244 +127C +12C4 +1344 +127C +1044 +ENDCHAR +STARTCHAR U+69E2 +ENCODING 27106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13DF +1249 +F945 +1041 +11C7 +3A59 +3441 +3420 +51FE +5102 +9102 +11FE +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+69E4 +ENCODING 27108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +117F +1008 +7F7F +1149 +117F +1249 +397F +5508 +117F +1108 +1208 +1500 +18FF +0000 +0000 +ENDCHAR +STARTCHAR U+69E5 +ENCODING 27109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13DF +FC84 +11CE +1084 +3BDF +3484 +3484 +5000 +51FE +9002 +13FF +1002 +1002 +11FE +ENDCHAR +STARTCHAR U+69E6 +ENCODING 27110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1110 +7D7E +1112 +11FF +117E +3910 +55FF +1191 +11FF +1191 +12FF +1097 +0000 +0000 +ENDCHAR +STARTCHAR U+69E7 +ENCODING 27111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +7FE0 +3E80 +2AFC +3E90 +2A90 +3E90 +7F10 +0900 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+69E8 +ENCODING 27112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1138 +17E8 +7C28 +13B0 +12B0 +3BA8 +3428 +37A4 +50A4 +51A4 +1738 +1120 +1320 +0000 +ENDCHAR +STARTCHAR U+69EA +ENCODING 27114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1100 +13FF +7E54 +1254 +33D4 +3A54 +367F +53C4 +5204 +53CC +120C +13D4 +1224 +1245 +1287 +ENDCHAR +STARTCHAR U+69EB +ENCODING 27115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +13F8 +7E48 +13F8 +1A48 +37F8 +3450 +37F8 +5010 +57FC +1110 +1090 +1030 +0000 +ENDCHAR +STARTCHAR U+69EC +ENCODING 27116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1104 +17C8 +1110 +7EA2 +1462 +13AA +382A +57EA +122A +13AA +10AA +10CE +1309 +0000 +0000 +ENDCHAR +STARTCHAR U+69ED +ENCODING 27117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1028 +1024 +7FFC +1220 +1AA8 +36E8 +36A8 +33E8 +5290 +55D0 +15B4 +1AAC +11C4 +0000 +ENDCHAR +STARTCHAR U+69EE +ENCODING 27118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +1084 +11FE +FC02 +1084 +1129 +3BFF +3430 +30CC +5387 +5010 +91E4 +1018 +10E2 +100C +11F0 +ENDCHAR +STARTCHAR U+69EF +ENCODING 27119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1122 +1122 +FDFE +1088 +1090 +39FE +3510 +3310 +51FE +5110 +9110 +11FE +1110 +1110 +11FF +ENDCHAR +STARTCHAR U+69F1 +ENCODING 27121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1048 +FE48 +11FF +1149 +3949 +3587 +3301 +517D +5101 +91FF +1000 +10AA +11AB +1129 +ENDCHAR +STARTCHAR U+69F2 +ENCODING 27122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1208 +13E8 +1498 +7D18 +17C8 +1568 +3D58 +3FD8 +354C +5578 +57C8 +1448 +1448 +18C8 +0000 +ENDCHAR +STARTCHAR U+69F3 +ENCODING 27123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +447E +45D2 +7C5C +05F0 +FC04 +27FF +2484 +64C4 +C44C +0100 +FFFF +0520 +1D38 +F10F +0100 +ENDCHAR +STARTCHAR U+69F4 +ENCODING 27124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13F8 +1100 +11FC +7D04 +11FC +117C +3944 +557C +11FE +1192 +12FE +1081 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+69F5 +ENCODING 27125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FE +1122 +FD22 +11FE +1020 +39FE +3522 +3122 +51FE +5020 +9010 +115B +1149 +1362 +123E +ENDCHAR +STARTCHAR U+69F6 +ENCODING 27126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +120D +13FF +7E09 +12E9 +12A9 +12A9 +3AE9 +560B +12ED +120D +1213 +1201 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+69F7 +ENCODING 27127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +3E7C +0814 +7F54 +2A35 +5D2D +0845 +7F87 +0080 +7FFF +02A0 +0490 +188C +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+69F8 +ENCODING 27128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13E8 +7C9E +108A +13EA +114A +3A2A +548E +108A +13EA +108B +1093 +17E3 +0000 +0000 +ENDCHAR +STARTCHAR U+69F9 +ENCODING 27129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +13F8 +7E08 +13F8 +1A08 +37F8 +3440 +3358 +5040 +5358 +17FC +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+69FB +ENCODING 27131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1278 +1248 +7FC8 +1278 +1A48 +37F8 +3648 +3248 +5378 +52B0 +14B4 +1454 +198C +0000 +ENDCHAR +STARTCHAR U+69FC +ENCODING 27132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +3E42 +087E +7F7E +0842 +087E +1425 +2247 +0080 +7FFF +02A0 +0490 +188C +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+69FD +ENCODING 27133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +17FC +10A0 +7FF8 +12A8 +13F8 +3AA8 +37F8 +35F0 +5110 +51F0 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+69FE +ENCODING 27134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +1084 +10FC +FC84 +10FC +1000 +39FF +3529 +31FF +5000 +53FF +90C6 +106C +1038 +10EC +1387 +ENDCHAR +STARTCHAR U+69FF +ENCODING 27135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +17FC +1120 +7DE0 +13F8 +1A48 +37F8 +3440 +33F8 +5040 +53F8 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6A00 +ENCODING 27136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +FC84 +1048 +13FF +3A01 +3621 +32FD +5221 +52FD +9285 +1285 +12FD +1201 +1207 +ENDCHAR +STARTCHAR U+6A01 +ENCODING 27137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FE +FC20 +11FC +1040 +3BFF +3484 +3122 +52CD +5084 +9084 +10DC +1084 +1084 +10FC +ENDCHAR +STARTCHAR U+6A02 +ENCODING 27138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +6BE8 +2AA8 +1390 +1A98 +2EAC +77F4 +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+6A03 +ENCODING 27139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +110F +13E9 +FE29 +1229 +13EF +3A29 +3629 +33E9 +520F +5299 +92A9 +1249 +13C9 +1629 +1013 +ENDCHAR +STARTCHAR U+6A04 +ENCODING 27140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1788 +14FF +1508 +7E7F +1549 +14FF +14C9 +3EFF +5508 +141C +142A +1449 +1408 +0000 +0000 +ENDCHAR +STARTCHAR U+6A05 +ENCODING 27141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1148 +1148 +1248 +7C48 +11B4 +19A4 +3600 +3620 +36A0 +52B8 +52A0 +12A0 +1360 +121C +0000 +ENDCHAR +STARTCHAR U+6A06 +ENCODING 27142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +128A +7E52 +1222 +1252 +13FE +3820 +57FF +1421 +1425 +15FD +1401 +1402 +0000 +0000 +ENDCHAR +STARTCHAR U+6A07 +ENCODING 27143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +109F +112A +7F04 +155B +1140 +115F +3951 +555F +1151 +115F +1111 +1111 +1123 +0000 +0000 +ENDCHAR +STARTCHAR U+6A08 +ENCODING 27144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +1044 +1028 +7DFF +1000 +10FE +3882 +54FE +1082 +10FE +1048 +1089 +110F +0000 +0000 +ENDCHAR +STARTCHAR U+6A09 +ENCODING 27145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +7C20 +12AA +1124 +12AA +1020 +3AAA +5524 +12AA +1020 +1050 +138E +0000 +0000 +ENDCHAR +STARTCHAR U+6A0A +ENCODING 27146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +7F7C +1190 +3AB8 +34B8 +5754 +5194 +1310 +7FFC +0100 +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+6A0B +ENCODING 27147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +15F8 +1250 +7E20 +10F8 +10A8 +3EF8 +36A8 +36F8 +52A8 +52A8 +1298 +1580 +187C +0000 +ENDCHAR +STARTCHAR U+6A0C +ENCODING 27148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1148 +7FFC +1250 +1BF0 +35F8 +3508 +31F8 +51F8 +5108 +11F8 +1198 +1604 +0000 +ENDCHAR +STARTCHAR U+6A0D +ENCODING 27149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +11FF +7C10 +11FF +10FE +3882 +54FE +1082 +10FE +1082 +10FE +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+6A0F +ENCODING 27151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +FDFE +1122 +1122 +39FE +3448 +3592 +50A2 +53FF +9021 +10A4 +11A6 +1122 +1020 +ENDCHAR +STARTCHAR U+6A11 +ENCODING 27153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1240 +117E +1492 +7B32 +1092 +312A +3A42 +740C +5020 +5020 +57FF +1070 +10A8 +1124 +1222 +1421 +ENDCHAR +STARTCHAR U+6A12 +ENCODING 27154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +7E98 +1450 +12A8 +3AA4 +34D4 +35F0 +5640 +5248 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+6A13 +ENCODING 27155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1248 +7FFC +1248 +1BF8 +37F8 +3648 +33F8 +5080 +57FC +1190 +1070 +1788 +0000 +ENDCHAR +STARTCHAR U+6A14 +ENCODING 27156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1490 +1248 +7FF8 +1248 +1BF8 +3648 +37F8 +3040 +57FC +50E0 +1150 +164C +1040 +0000 +ENDCHAR +STARTCHAR U+6A15 +ENCODING 27157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2108 +27C8 +F91F +27D1 +2555 +2565 +7544 +6FC4 +A90C +A38A +234A +254A +251A +2113 +2111 +ENDCHAR +STARTCHAR U+6A16 +ENCODING 27158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01C0 +0220 +05D0 +0808 +17F4 +2412 +07F0 +1000 +11FE +7C04 +11E4 +3924 +55E4 +101C +0000 +0000 +ENDCHAR +STARTCHAR U+6A17 +ENCODING 27159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +7FFC +1758 +1358 +39F0 +3400 +37FC +5080 +50F0 +1110 +1010 +1060 +0000 +ENDCHAR +STARTCHAR U+6A18 +ENCODING 27160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +1150 +1440 +FFFE +1402 +31F4 +3910 +5510 +51F0 +9040 +17FC +1040 +1044 +17FE +1000 +ENDCHAR +STARTCHAR U+6A19 +ENCODING 27161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +10A0 +7FF8 +12A8 +1BF8 +3400 +35F0 +3000 +57FC +5150 +1248 +1448 +10C0 +0000 +ENDCHAR +STARTCHAR U+6A1A +ENCODING 27162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +FE48 +1248 +13FF +3A49 +3649 +33FF +5288 +528B +92EE +1288 +1488 +14E9 +1187 +ENDCHAR +STARTCHAR U+6A1B +ENCODING 27163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +10CC +7D54 +12EC +1954 +3664 +35B0 +364C +51A0 +5048 +1190 +1060 +1380 +0000 +ENDCHAR +STARTCHAR U+6A1D +ENCODING 27165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103E +1020 +FDFF +1121 +11FE +3920 +351E +3100 +517E +5142 +917E +1142 +127E +1242 +10FF +ENDCHAR +STARTCHAR U+6A1E +ENCODING 27166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1200 +7EF0 +1290 +1AF0 +3600 +37F8 +3368 +5368 +53F8 +1200 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+6A1F +ENCODING 27167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +0850 +7FFC +0800 +1CF8 +1A88 +1AF8 +2888 +28F8 +4820 +0BFC +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+6A20 +ENCODING 27168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +11FF +FE44 +1044 +107C +3810 +35FF +3511 +5111 +5155 +9155 +11BB +1111 +1111 +1113 +ENDCHAR +STARTCHAR U+6A21 +ENCODING 27169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +0BFC +7E90 +09F8 +1D08 +1BF8 +1B08 +29F8 +2840 +4FFC +08A0 +0910 +0E0C +0000 +ENDCHAR +STARTCHAR U+6A22 +ENCODING 27170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +13F0 +1210 +7FF0 +1210 +1BF0 +3600 +37FC +3200 +53FC +52A4 +1554 +1504 +1818 +0000 +ENDCHAR +STARTCHAR U+6A23 +ENCODING 27171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +10A0 +13F8 +7C40 +11F0 +1840 +37FC +34C0 +31C8 +5068 +57F0 +1150 +164C +10C0 +0000 +ENDCHAR +STARTCHAR U+6A24 +ENCODING 27172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2110 +213F +FA22 +2254 +2688 +2294 +72E3 +6A88 +AA88 +A2FF +22AA +22AA +226B +2249 +2208 +ENDCHAR +STARTCHAR U+6A25 +ENCODING 27173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +13FF +1088 +107C +7CA8 +1110 +1028 +3854 +54BA +1111 +107C +1010 +10FE +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6A26 +ENCODING 27174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +11EF +1294 +7C42 +1000 +1010 +1010 +39FF +5410 +1010 +10FE +1010 +1010 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+6A27 +ENCODING 27175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +145E +1292 +1112 +7E92 +1452 +1153 +17C0 +111F +3D51 +5551 +1551 +154A +1104 +111B +0000 +0000 +ENDCHAR +STARTCHAR U+6A28 +ENCODING 27176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1204 +13FC +FE20 +13AC +3270 +3BAC +5620 +52A8 +92FC +1220 +13FE +1420 +1820 +1020 +ENDCHAR +STARTCHAR U+6A29 +ENCODING 27177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +11F8 +7E40 +13FC +3090 +39FC +3720 +55F8 +5120 +11F8 +1120 +11FC +1100 +0000 +ENDCHAR +STARTCHAR U+6A2A +ENCODING 27178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +13F8 +7CA0 +17FC +1040 +3BF8 +3648 +37F8 +5248 +53F8 +10A0 +1110 +1608 +0000 +ENDCHAR +STARTCHAR U+6A2B +ENCODING 27179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +7FE8 +1250 +13D0 +3AA8 +37C4 +3440 +53F8 +5040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6A2E +ENCODING 27182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +10A0 +7FF8 +12A8 +1AA8 +37F8 +3440 +3248 +5248 +54D0 +10A0 +1310 +1C0C +0000 +ENDCHAR +STARTCHAR U+6A2F +ENCODING 27183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +17FC +1040 +FA48 +1150 +37FE +3800 +57FC +5404 +95F4 +1514 +15F4 +1404 +17FC +1404 +ENDCHAR +STARTCHAR U+6A30 +ENCODING 27184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1020 +FFFF +1221 +11AC +3820 +35AC +3420 +51FE +5002 +9002 +11FF +1002 +1002 +11FE +ENDCHAR +STARTCHAR U+6A31 +ENCODING 27185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17BC +14A4 +15AC +FDAC +16B4 +3B18 +34A4 +5080 +5FFE +9090 +1110 +10A0 +1040 +11B0 +1608 +ENDCHAR +STARTCHAR U+6A32 +ENCODING 27186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +1009 +13FF +FC08 +11E8 +1008 +3BFC +3404 +35F4 +5114 +51F4 +9116 +11F2 +1112 +11F2 +131B +ENDCHAR +STARTCHAR U+6A34 +ENCODING 27188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +108A +13EB +FC09 +1228 +1148 +3BFF +3408 +33EA +522A +522E +93E4 +1224 +1225 +13EF +101A +ENDCHAR +STARTCHAR U+6A35 +ENCODING 27189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +1120 +7FFC +1320 +15F8 +3920 +35F8 +3520 +51FC +5000 +12A8 +1254 +1454 +0000 +ENDCHAR +STARTCHAR U+6A36 +ENCODING 27190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1110 +19F0 +37FC +3680 +33F8 +52A8 +53A8 +1290 +17E8 +1084 +0000 +ENDCHAR +STARTCHAR U+6A37 +ENCODING 27191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FEFF +2854 +2C54 +6AD6 +C993 +0000 +FFFF +2100 +3F7E +2122 +3F14 +2108 +3F14 +E162 +ENDCHAR +STARTCHAR U+6A38 +ENCODING 27192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +12A8 +11B0 +7FFC +1110 +18A0 +37F8 +3440 +31F0 +5040 +57FC +10A0 +1110 +160C +0000 +ENDCHAR +STARTCHAR U+6A39 +ENCODING 27193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1108 +1108 +17C8 +793C +17C8 +1028 +3BD8 +3658 +37C8 +5448 +5288 +13C8 +1E08 +1018 +0000 +ENDCHAR +STARTCHAR U+6A3A +ENCODING 27194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +17FC +7D10 +13F8 +1950 +37FC +3550 +33F8 +5040 +57FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+6A3B +ENCODING 27195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +1092 +FEFE +1010 +11FF +3800 +34FE +3282 +50FE +5082 +90FE +1082 +10FE +1044 +1183 +ENDCHAR +STARTCHAR U+6A3C +ENCODING 27196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1201 +13FF +7E7C +1208 +12FE +3A10 +5610 +13FF +1222 +1244 +17FF +1044 +10CC +0000 +0000 +ENDCHAR +STARTCHAR U+6A3D +ENCODING 27197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +10A0 +17FC +78A0 +13F8 +1AB8 +3718 +37F8 +33F8 +5010 +57FC +1110 +1090 +1030 +0000 +ENDCHAR +STARTCHAR U+6A3E +ENCODING 27198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2218 +2214 +2F94 +F27E +2250 +7FD0 +6A54 +A254 +2BC8 +2A6A +2A56 +2E20 +2A06 +31FC +2000 +ENDCHAR +STARTCHAR U+6A3F +ENCODING 27199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13DF +1251 +1251 +FBDF +1000 +11FE +3922 +35FE +3522 +5122 +51FE +9020 +13FF +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+6A40 +ENCODING 27200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +1040 +7C82 +13FE +1124 +1124 +3A24 +5407 +13FE +1252 +1252 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+6A41 +ENCODING 27201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +13CF +1492 +1000 +7D00 +13FF +1401 +11F9 +3909 +55F9 +1109 +11F9 +1002 +101C +0000 +0000 +ENDCHAR +STARTCHAR U+6A44 +ENCODING 27204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +13E0 +1120 +7FE0 +12BC +1AE8 +37E8 +36A8 +33B0 +5290 +53B0 +16A8 +10C8 +1084 +0000 +ENDCHAR +STARTCHAR U+6A45 +ENCODING 27205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11FF +FDAA +12AA +10AA +3BFF +34AA +30AA +50AA +51FF +9000 +1000 +10AA +11AB +1129 +ENDCHAR +STARTCHAR U+6A46 +ENCODING 27206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3FFC +5248 +1248 +FFFF +1248 +1248 +1248 +3FFC +0810 +7EFE +2854 +2C54 +6AD6 +C993 +0810 +ENDCHAR +STARTCHAR U+6A47 +ENCODING 27207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1030 +13C0 +10F0 +7F80 +10F8 +1B88 +3478 +3598 +3660 +53B8 +5660 +13BC +1664 +11DC +0000 +ENDCHAR +STARTCHAR U+6A48 +ENCODING 27208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1040 +7FFC +1110 +1BB8 +3510 +35FC +3600 +57FC +50A0 +10A0 +1124 +161C +0000 +ENDCHAR +STARTCHAR U+6A49 +ENCODING 27209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1222 +1124 +1020 +FBFF +10A8 +11AC +3B27 +3520 +31C4 +527F +5254 +9354 +10FF +1084 +1184 +1304 +ENDCHAR +STARTCHAR U+6A4A +ENCODING 27210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1028 +1028 +FDEF +1129 +1129 +39EF +3428 +3228 +51FF +5111 +9111 +11FF +1111 +1111 +11FF +ENDCHAR +STARTCHAR U+6A4B +ENCODING 27211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E0 +1040 +7FFC +10A0 +19F0 +36A8 +34E4 +33F8 +5208 +52E8 +12A8 +12E8 +1218 +0000 +ENDCHAR +STARTCHAR U+6A4D +ENCODING 27213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +1129 +11EF +7D29 +11EF +1101 +397D +5511 +1139 +1111 +1111 +117D +1101 +1103 +0000 +0000 +ENDCHAR +STARTCHAR U+6A4E +ENCODING 27214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +FD24 +10A8 +13FF +38A8 +34AC +31A6 +5323 +51FE +9122 +11FE +1122 +1122 +11FE +ENDCHAR +STARTCHAR U+6A4F +ENCODING 27215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +1044 +11FF +7C10 +11FF +1010 +39FF +5444 +11FF +1044 +11FF +1101 +1101 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+6A50 +ENCODING 27216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FF8 +0920 +7FFE +4002 +9FF4 +0800 +1FF0 +6810 +0FF0 +0104 +FFFE +0540 +1930 +610E +0100 +ENDCHAR +STARTCHAR U+6A51 +ENCODING 27217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +FC48 +114A +1084 +3BFF +3484 +30FC +5084 +50FC +9020 +1124 +1126 +1323 +1060 +ENDCHAR +STARTCHAR U+6A52 +ENCODING 27218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17FF +1020 +7FFF +1421 +33AE +3820 +77AE +5000 +51FC +5000 +17FF +1080 +1104 +127E +1781 +ENDCHAR +STARTCHAR U+6A53 +ENCODING 27219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101E +11E0 +1000 +7D12 +1092 +33FF +3A01 +7504 +5104 +53FF +5264 +15A4 +18FF +1104 +1204 +1404 +ENDCHAR +STARTCHAR U+6A54 +ENCODING 27220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +13E8 +1008 +7FEF +1230 +13E2 +3802 +55CA +104A +108A +13EA +1084 +108A +1191 +0000 +0000 +ENDCHAR +STARTCHAR U+6A55 +ENCODING 27221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1122 +11A6 +10A4 +FFFF +1201 +12FD +3884 +34FC +3400 +51FE +5044 +91FE +1024 +1064 +10C4 +118C +ENDCHAR +STARTCHAR U+6A56 +ENCODING 27222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1122 +11A6 +10A4 +FFFF +1201 +12FD +3884 +3484 +30FC +5020 +53FE +90A4 +10A4 +11A6 +1323 +1020 +ENDCHAR +STARTCHAR U+6A58 +ENCODING 27224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +10A0 +7FFC +10C8 +1B50 +34C0 +37F8 +32A8 +5338 +52E8 +12A8 +12E8 +1218 +0000 +ENDCHAR +STARTCHAR U+6A59 +ENCODING 27225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11D0 +1050 +12A8 +7DA8 +1110 +1BF8 +3404 +35F0 +3110 +51F0 +5110 +10A0 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6A5A +ENCODING 27226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +1012 +11FF +7C12 +10FE +1155 +39D7 +5511 +11FF +1111 +11D7 +1155 +1255 +0000 +0000 +ENDCHAR +STARTCHAR U+6A5B +ENCODING 27227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2004 +2FFE +2808 +FA28 +2948 +6FEE +7892 +6AA4 +AAA8 +2BE8 +28A8 +2888 +2894 +2914 +3222 +ENDCHAR +STARTCHAR U+6A5D +ENCODING 27229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1044 +11FF +7D45 +11FF +1000 +10FE +3882 +54FE +1082 +10FE +1010 +11FF +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6A5E +ENCODING 27230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +10FE +7C92 +10FE +1092 +38FE +5411 +11FF +1022 +1151 +1144 +127C +0000 +0000 +ENDCHAR +STARTCHAR U+6A5F +ENCODING 27231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1148 +1148 +16F4 +7ED4 +1148 +1AD4 +37FC +3450 +33FC +5228 +5328 +1490 +143C +18C4 +0000 +ENDCHAR +STARTCHAR U+6A60 +ENCODING 27232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FF +107C +7CC8 +1330 +105F +1022 +3814 +54F8 +1000 +1092 +1194 +12A8 +15C7 +0000 +0000 +ENDCHAR +STARTCHAR U+6A61 +ENCODING 27233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +11F0 +1640 +7FF8 +1248 +13F8 +3880 +35E8 +3668 +51B0 +5668 +11A4 +1620 +10C0 +0000 +ENDCHAR +STARTCHAR U+6A62 +ENCODING 27234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +17FC +1520 +7D78 +1690 +17FC +3D00 +3D78 +3548 +5578 +5648 +1478 +1448 +1458 +0000 +ENDCHAR +STARTCHAR U+6A64 +ENCODING 27236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1488 +2620 +03E0 +1414 +AAAA +A0A0 +B2B1 +1E1F +0100 +FFFF +0520 +0D30 +391C +E107 +0100 +ENDCHAR +STARTCHAR U+6A65 +ENCODING 27237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4448 +29F0 +1054 +2FFE +4880 +19F8 +2B08 +4DF8 +0908 +29F8 +1100 +FFFE +0540 +1930 +610E +0100 +ENDCHAR +STARTCHAR U+6A66 +ENCODING 27238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1110 +7FFC +13F8 +1A48 +37F8 +3648 +33F8 +5040 +53F8 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6A67 +ENCODING 27239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +1044 +11FF +FF11 +1111 +11FF +3911 +3511 +33FF +5000 +50FE +9082 +10FE +1082 +1082 +10FE +ENDCHAR +STARTCHAR U+6A68 +ENCODING 27240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1054 +11FF +7C44 +10FE +1082 +38FE +5482 +10FE +1082 +10FE +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+6A69 +ENCODING 27241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1555 +1555 +7F8E +128A +1451 +1000 +17FF +3C01 +54F0 +1090 +1090 +1111 +121F +0000 +0000 +ENDCHAR +STARTCHAR U+6A6A +ENCODING 27242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +210A +210B +23C9 +FA48 +237F +24C8 +2688 +719C +7116 +A333 +A661 +2000 +2292 +2292 +26DB +2449 +ENDCHAR +STARTCHAR U+6A6B +ENCODING 27243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +17FF +7C88 +10F8 +3020 +3BFF +7420 +53FE +5222 +53FE +1222 +13FE +1000 +1104 +1202 +ENDCHAR +STARTCHAR U+6A6D +ENCODING 27245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +7DFF +1101 +11FF +3810 +55FF +1044 +11FF +1010 +10FE +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6A6F +ENCODING 27247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1555 +1555 +7F8E +128A +1451 +1000 +17FF +3C41 +55FE +1042 +1042 +1082 +110C +0000 +0000 +ENDCHAR +STARTCHAR U+6A71 +ENCODING 27249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27FE +2400 +2444 +FFE4 +2404 +75DE +6D44 +A544 +25D4 +240C +2544 +2544 +2BE4 +3014 +2008 +ENDCHAR +STARTCHAR U+6A72 +ENCODING 27250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1040 +7DF0 +1000 +19F0 +3510 +35F0 +30A0 +57FC +51F0 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+6A73 +ENCODING 27251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +27C9 +24AA +FC88 +24BE +2588 +2494 +74FF +6CA2 +A7C9 +A488 +24BE +2492 +2492 +2892 +29A6 +ENDCHAR +STARTCHAR U+6A76 +ENCODING 27254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1089 +13E9 +7C9F +13E8 +1228 +13E8 +1228 +3BE9 +548A +108C +13E8 +1095 +1083 +1081 +0000 +0000 +ENDCHAR +STARTCHAR U+6A78 +ENCODING 27256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +1110 +19F0 +3510 +3400 +33B8 +52A8 +53B8 +12A8 +13B8 +12A8 +0000 +ENDCHAR +STARTCHAR U+6A79 +ENCODING 27257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +11F0 +1224 +17FE +FC44 +17FC +3C44 +37FC +5000 +5FFE +9000 +13F8 +1208 +13F8 +1208 +13F8 +ENDCHAR +STARTCHAR U+6A7C +ENCODING 27260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2278 +2248 +2248 +F4F8 +2F08 +32FE +6C20 +6454 +AFB8 +2050 +23B8 +2C54 +2092 +2110 +2030 +ENDCHAR +STARTCHAR U+6A7E +ENCODING 27262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +1044 +1044 +FE7C +1000 +11EF +3929 +3529 +33EF +5010 +51FF +9054 +1054 +10D6 +1193 +1010 +ENDCHAR +STARTCHAR U+6A7F +ENCODING 27263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +11F0 +7D50 +11F0 +1950 +35F0 +37F8 +31F0 +5150 +51F0 +1150 +11F0 +17FC +0000 +ENDCHAR +STARTCHAR U+6A80 +ENCODING 27264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +13F8 +7EE8 +12A8 +12E8 +3BF8 +35F0 +3510 +51F0 +5110 +11F0 +1000 +17FC +0000 +ENDCHAR +STARTCHAR U+6A81 +ENCODING 27265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FF +1000 +FDFE +1102 +117A +394A +357A +3102 +51FE +5020 +93FF +10A4 +11A6 +1323 +1020 +ENDCHAR +STARTCHAR U+6A83 +ENCODING 27267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +7BF8 +4892 +51FE +5820 +49FE +4802 +4BFF +5802 +41FE +0100 +FFFF +0520 +1D38 +F10F +0100 +ENDCHAR +STARTCHAR U+6A84 +ENCODING 27268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +13A0 +12A0 +7FBC +12E8 +1BE8 +3528 +37E8 +3110 +5190 +5290 +12A8 +14C8 +1184 +0000 +ENDCHAR +STARTCHAR U+6A85 +ENCODING 27269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +105E +1050 +7DFF +1005 +11FE +1104 +3974 +3524 +5175 +11AD +1116 +1265 +140B +0000 +0000 +ENDCHAR +STARTCHAR U+6A86 +ENCODING 27270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2548 +2548 +FD48 +238F +2288 +26C8 +7468 +7108 +AD5F +A551 +2551 +2391 +2291 +26D1 +247F +ENDCHAR +STARTCHAR U+6A87 +ENCODING 27271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1088 +11FF +FF10 +11FE +1110 +39FE +3510 +31FF +5000 +53CF +9249 +1249 +1279 +1201 +1203 +ENDCHAR +STARTCHAR U+6A89 +ENCODING 27273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17E0 +125E +7FD2 +1252 +33D2 +3A52 +765E +53D2 +5640 +505E +51E0 +1020 +13FE +1020 +17FF +ENDCHAR +STARTCHAR U+6A8B +ENCODING 27275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +11FE +FC88 +13FF +1124 +39FC +3622 +33FE +5125 +51FC +9124 +11FC +1020 +13FE +1020 +ENDCHAR +STARTCHAR U+6A8C +ENCODING 27276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1129 +1129 +7DFF +1028 +11EF +3828 +35EF +5028 +11EF +1028 +1028 +1048 +1088 +0000 +0000 +ENDCHAR +STARTCHAR U+6A8D +ENCODING 27277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1110 +7FFC +1000 +19F0 +3510 +35F0 +3110 +51F0 +5048 +12A4 +1294 +1470 +0000 +ENDCHAR +STARTCHAR U+6A8E +ENCODING 27278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1140 +12B0 +7FFC +12B0 +1A50 +37B0 +37F0 +3080 +57F8 +5528 +17D8 +1408 +1418 +0000 +ENDCHAR +STARTCHAR U+6A90 +ENCODING 27280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10F0 +1320 +7FFC +12A8 +1B58 +3640 +37FC +32F0 +52F0 +55F8 +1508 +19F8 +1108 +0000 +ENDCHAR +STARTCHAR U+6A91 +ENCODING 27281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13F8 +1040 +17FE +FD52 +14E4 +3150 +3840 +57F8 +5248 +9248 +13F8 +1248 +1248 +13F8 +1208 +ENDCHAR +STARTCHAR U+6A92 +ENCODING 27282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1F7C +0410 +1554 +2492 +1FFC +13E4 +1084 +17F4 +1494 +17F4 +10A4 +27F5 +4013 +0000 +0000 +ENDCHAR +STARTCHAR U+6A93 +ENCODING 27283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +116E +112A +7E2A +136A +1233 +3BE0 +348F +5089 +13E9 +1089 +1086 +1086 +17F9 +0000 +0000 +ENDCHAR +STARTCHAR U+6A94 +ENCODING 27284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +10A8 +13FE +FE02 +12FA +1088 +38F8 +5400 +93FC +1124 +11FC +1124 +11FC +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+6A95 +ENCODING 27285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083C +7F25 +0847 +3E00 +2A7E +3E24 +2A18 +3E24 +4943 +7F80 +0080 +7FFF +0490 +0888 +0000 +0000 +ENDCHAR +STARTCHAR U+6A96 +ENCODING 27286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1222 +1114 +10FF +7C08 +1399 +10E6 +388C +5576 +120D +1174 +1104 +1108 +1180 +127F +0000 +0000 +ENDCHAR +STARTCHAR U+6A97 +ENCODING 27287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EF8 +2250 +3FFC +2020 +3FFC +5220 +1F20 +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+6A9A +ENCODING 27290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +11EF +7C84 +11CE +12B5 +1084 +3BFF +3422 +5020 +113C +1120 +1120 +1320 +14FF +0000 +0000 +ENDCHAR +STARTCHAR U+6A9B +ENCODING 27291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +267E +2342 +F95E +2052 +2052 +20FF +7681 +72BD +AAA5 +A2A5 +22BD +2281 +2283 +2700 +24FF +ENDCHAR +STARTCHAR U+6A9C +ENCODING 27292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10A0 +1110 +7EE8 +13FC +1358 +3AE8 +37F8 +35F0 +5110 +51F0 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+6A9D +ENCODING 27293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23CA +224B +FBC9 +2008 +27DF +2248 +73C8 +6A4A +ABCA +A24E +2264 +23CC +264D +2057 +2042 +ENDCHAR +STARTCHAR U+6A9E +ENCODING 27294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +23DF +2649 +FC89 +27D9 +2573 +2540 +77D4 +6D54 +A57F +A7E4 +2444 +247F +2444 +2444 +28C4 +ENDCHAR +STARTCHAR U+6A9F +ENCODING 27295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1048 +13FF +FE49 +1249 +13FF +3800 +35FE +3302 +51FE +5102 +91FE +1102 +11FE +1084 +1303 +ENDCHAR +STARTCHAR U+6AA0 +ENCODING 27296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +7F40 +147C +1E90 +2350 +7A20 +2A50 +3B8C +0D00 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+6AA1 +ENCODING 27297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1129 +7DFF +1010 +10FE +1010 +39FF +3444 +5028 +10FE +1010 +11FF +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6AA2 +ENCODING 27298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7D10 +13F8 +1404 +3BB8 +36A8 +37B8 +5110 +5110 +11A8 +1264 +1444 +0000 +ENDCHAR +STARTCHAR U+6AA3 +ENCODING 27299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +7D50 +1150 +1AE8 +37FC +3400 +33F8 +52E8 +52A8 +12E8 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+6AA4 +ENCODING 27300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1442 +1424 +12FF +7810 +177E +1142 +3A7E +3442 +537E +1142 +117E +1242 +1600 +19FF +0000 +0000 +ENDCHAR +STARTCHAR U+6AA5 +ENCODING 27301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +13FE +FC20 +11FC +1020 +3BFF +3404 +33D2 +5090 +53FF +9092 +10D4 +1389 +1095 +11A3 +ENDCHAR +STARTCHAR U+6AA6 +ENCODING 27302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17F1 +1141 +7FF1 +1555 +17F5 +1005 +3BE5 +3405 +57F5 +1081 +1081 +12A1 +1493 +1081 +0000 +0000 +ENDCHAR +STARTCHAR U+6AA8 +ENCODING 27304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +1044 +11FF +7C10 +11FF +1010 +39FF +5510 +109F +1115 +1084 +1044 +108A +1111 +0000 +0000 +ENDCHAR +STARTCHAR U+6AA9 +ENCODING 27305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1FFE +1000 +17FC +FD14 +15F4 +3514 +3FFC +5000 +53F8 +9000 +1FFE +1150 +124C +1544 +1080 +ENDCHAR +STARTCHAR U+6AAA +ENCODING 27306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1484 +13F4 +7D18 +13F8 +1314 +3DF4 +3440 +37FC +50E0 +5150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+6AAB +ENCODING 27307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1440 +17FE +1502 +F9BC +12A8 +35B0 +3B10 +52E8 +5406 +9BF8 +1040 +1150 +124C +1444 +10C0 +ENDCHAR +STARTCHAR U+6AAC +ENCODING 27308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +17FC +1110 +7FFC +1208 +15F0 +3FFC +34C8 +3768 +50B0 +5370 +10A8 +1724 +10C0 +0000 +ENDCHAR +STARTCHAR U+6AAD +ENCODING 27309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +129F +1451 +7C1F +17D1 +1111 +111F +17D4 +3914 +5515 +1556 +1394 +111A +17D1 +0000 +0000 +ENDCHAR +STARTCHAR U+6AAE +ENCODING 27310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1040 +7DF0 +17FC +11E8 +3840 +35F0 +37FC +5008 +53FC +12A8 +13A8 +1018 +0000 +ENDCHAR +STARTCHAR U+6AAF +ENCODING 27311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FF +1020 +FDFE +1000 +10FC +3884 +37FF +3201 +51FE +5084 +91FC +1022 +11FE +1020 +13FF +ENDCHAR +STARTCHAR U+6AB0 +ENCODING 27312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2310 +263E +FCA2 +25BE +2322 +2622 +74BE +6F88 +A2BF +A229 +26A9 +26A9 +2A6B +2208 +2208 +ENDCHAR +STARTCHAR U+6AB1 +ENCODING 27313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1108 +11EF +FA94 +1042 +1084 +3BFF +3484 +34FC +5084 +50FC +9084 +13FF +1084 +1186 +1303 +ENDCHAR +STARTCHAR U+6AB3 +ENCODING 27315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1208 +7DF8 +1150 +1260 +39F8 +3708 +35F8 +51F8 +5108 +11F8 +1188 +1604 +0000 +ENDCHAR +STARTCHAR U+6AB4 +ENCODING 27316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +13FF +1048 +FC90 +11FF +1310 +39FE +3510 +31FE +5110 +51FF +9000 +13FE +108C +1070 +138F +ENDCHAR +STARTCHAR U+6AB6 +ENCODING 27318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1028 +1044 +7C82 +11FF +113C +3924 +553C +1100 +1177 +1155 +1177 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+6AB7 +ENCODING 27319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1092 +7D11 +11FF +1111 +11BB +3155 +59BB +1511 +11BB +1155 +11BB +1111 +1111 +0000 +0000 +ENDCHAR +STARTCHAR U+6AB8 +ENCODING 27320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1248 +7DA8 +1194 +1270 +3BF8 +36A8 +37FC +5000 +57FC +1040 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+6AB9 +ENCODING 27321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1420 +123E +1148 +7FBE +1214 +13A2 +32BF +5A82 +12BA +12AA +14BA +1082 +1082 +130C +0000 +0000 +ENDCHAR +STARTCHAR U+6ABA +ENCODING 27322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13FF +10FC +7C84 +10FC +13FF +3AFD +5440 +10F3 +112C +105C +10AA +1149 +1090 +0000 +0000 +ENDCHAR +STARTCHAR U+6ABB +ENCODING 27323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +17E0 +1520 +7FBC +14C0 +1780 +3D38 +3FC0 +3400 +53F8 +52A8 +12A8 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+6ABD +ENCODING 27325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1020 +FFFF +1221 +12AD +3A21 +34AC +3000 +53FF +5020 +93FF +1249 +1249 +1249 +124B +ENDCHAR +STARTCHAR U+6ABE +ENCODING 27326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +4952 +2A54 +0810 +1428 +2244 +7FFE +4002 +4822 +3EFC +0820 +2AA8 +2AA8 +2AAA +4926 +0820 +ENDCHAR +STARTCHAR U+6ABF +ENCODING 27327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +5110 +5F14 +4012 +5F7E +5110 +5F38 +5128 +DF6C +9146 +0100 +FFFF +0520 +1D38 +F10F +0100 +ENDCHAR +STARTCHAR U+6AC1 +ENCODING 27329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1298 +7C50 +12A8 +1AA4 +34D4 +35F0 +3640 +53F8 +5248 +13F8 +1058 +17E4 +0000 +ENDCHAR +STARTCHAR U+6AC2 +ENCODING 27330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +10CC +7F74 +10CC +1B74 +3490 +35FC +3320 +55F8 +5120 +11F8 +1120 +11FC +0000 +ENDCHAR +STARTCHAR U+6AC3 +ENCODING 27331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1220 +7EF8 +12A8 +1BFC +36F8 +36E8 +32B8 +52F8 +5250 +1388 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+6AC5 +ENCODING 27333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +17FF +1088 +7FDF +12AA +14AA +392D +5602 +13FE +1202 +13FE +1202 +1402 +0000 +0000 +ENDCHAR +STARTCHAR U+6AC6 +ENCODING 27334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +2102 +27EA +FD26 +2522 +27EA +2526 +7522 +6FE3 +AA9E +A2A2 +22AA +22FA +2681 +24C3 +2C7E +ENDCHAR +STARTCHAR U+6AC7 +ENCODING 27335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +109F +1084 +13E8 +7EBF +12B1 +13DF +1251 +3B5F +5751 +1351 +135F +148A +1151 +1221 +0000 +0000 +ENDCHAR +STARTCHAR U+6AC8 +ENCODING 27336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10E4 +1229 +117A +FD86 +137B +1000 +38FC +3484 +30FC +5048 +51FE +9000 +10F8 +1088 +1089 +1107 +ENDCHAR +STARTCHAR U+6AC9 +ENCODING 27337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2400 +FC82 +27E2 +2482 +25DF +7402 +6DE2 +AD2A +A5E6 +2402 +2522 +2522 +28F2 +2386 +ENDCHAR +STARTCHAR U+6ACB +ENCODING 27339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FE +10FE +7CFE +1082 +10FE +3810 +57FF +52A5 +11FE +1020 +107E +1082 +110C +0000 +0000 +ENDCHAR +STARTCHAR U+6ACC +ENCODING 27340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1020 +10FC +FC84 +10FC +1084 +3BFF +3611 +314A +5145 +523C +9040 +10FC +1344 +1038 +13C7 +ENDCHAR +STARTCHAR U+6ACD +ENCODING 27341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1021 +11CE +1108 +11EF +7D4A +1042 +10FE +3882 +54FE +1082 +10FE +1082 +10FE +1183 +0000 +0000 +ENDCHAR +STARTCHAR U+6ACF +ENCODING 27343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +15FF +1428 +11FF +7929 +17FF +1210 +15FF +3C44 +56FE +1145 +127C +1242 +133E +14FF +0000 +0000 +ENDCHAR +STARTCHAR U+6AD0 +ENCODING 27344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF0 +0910 +0FF0 +0910 +0FF0 +7E7E +5252 +7E7E +5252 +7E7E +0100 +7FFE +0520 +1D38 +710E +0100 +ENDCHAR +STARTCHAR U+6AD1 +ENCODING 27345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +7FF8 +1248 +1BF8 +3608 +3400 +37FC +5554 +57FC +1554 +17FC +1444 +0000 +ENDCHAR +STARTCHAR U+6AD3 +ENCODING 27347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +11F0 +1640 +7FF8 +1248 +1BF8 +3648 +37F8 +32A8 +53F4 +5514 +11F0 +1110 +11F0 +0000 +ENDCHAR +STARTCHAR U+6AD4 +ENCODING 27348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1244 +FFFF +1244 +12FE +3A92 +36FE +3292 +52FE +5210 +92FF +1295 +129D +14F5 +1083 +ENDCHAR +STARTCHAR U+6AD5 +ENCODING 27349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +11DE +1084 +FDDF +118C +135A +3A31 +35FE +3102 +51FE +5102 +91FE +1102 +11FE +1084 +1303 +ENDCHAR +STARTCHAR U+6AD6 +ENCODING 27350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103E +1020 +FFFF +1241 +13FC +3A41 +36FF +3292 +52FE +5292 +92FE +1210 +154A +1945 +123D +ENDCHAR +STARTCHAR U+6AD9 +ENCODING 27353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +13FE +1088 +7BFE +1200 +127C +1244 +127C +3AEE +56AA +12AA +12EE +1200 +13FE +0000 +0000 +ENDCHAR +STARTCHAR U+6ADA +ENCODING 27354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +7FB8 +12A8 +1BB8 +36E8 +36A8 +32E8 +5248 +52E8 +12A8 +12E8 +1218 +0000 +ENDCHAR +STARTCHAR U+6ADB +ENCODING 27355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +13FC +1330 +7CC8 +1000 +1BB8 +36A8 +37A8 +32A8 +53A8 +5328 +12B0 +13E0 +1C20 +0000 +ENDCHAR +STARTCHAR U+6ADC +ENCODING 27356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +0100 +1FF8 +1108 +FFFF +8F21 +B939 +0620 +39FC +0000 +1FF8 +1008 +FFFF +0910 +710E +ENDCHAR +STARTCHAR U+6ADD +ENCODING 27357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +FEFE +1000 +11FF +3929 +35FF +3282 +50FE +5082 +90FE +1082 +10FE +1044 +1183 +ENDCHAR +STARTCHAR U+6ADE +ENCODING 27358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +113C +16A8 +7EF8 +1108 +19FC +36A0 +37F4 +3134 +55D8 +55B8 +15D4 +1910 +1160 +0000 +ENDCHAR +STARTCHAR U+6ADF +ENCODING 27359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1248 +15F4 +7FAC +12E8 +15B4 +3FFC +3440 +37FC +50E0 +5150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+6AE0 +ENCODING 27360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13FF +1274 +1219 +7EA6 +1242 +12EF +3B2A +56EA +1293 +12EE +122A +1424 +106B +0000 +0000 +ENDCHAR +STARTCHAR U+6AE1 +ENCODING 27361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +11EF +1252 +1010 +7CFE +1014 +1018 +39FF +5420 +107E +10C2 +117E +1042 +107E +0000 +0000 +ENDCHAR +STARTCHAR U+6AE4 +ENCODING 27364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +11EF +1294 +FC42 +1082 +1044 +39FF +3400 +31F1 +5115 +51F5 +9115 +11F5 +1111 +1111 +1133 +ENDCHAR +STARTCHAR U+6AE5 +ENCODING 27365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +27FE +2484 +FFE4 +2484 +75DE +6C04 +A5C4 +2554 +25C4 +2944 +2944 +33E4 +2008 +0000 +0000 +ENDCHAR +STARTCHAR U+6AE7 +ENCODING 27367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2789 +203F +FFCA +200A +278C +207F +7008 +6F90 +A83F +A051 +2791 +249F +2491 +2491 +279F +ENDCHAR +STARTCHAR U+6AE8 +ENCODING 27368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1070 +13FC +1258 +7FE8 +12F8 +1AA8 +36F8 +36A8 +32F8 +5400 +55F8 +1968 +1168 +17FC +0000 +ENDCHAR +STARTCHAR U+6AEA +ENCODING 27370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +15F8 +7C90 +17FC +15F0 +3ED8 +3C94 +3440 +5578 +5540 +1940 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+6AEB +ENCODING 27371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F08 +307E +480A +157F +2610 +4E3E +1562 +24BE +4422 +183E +0080 +7FFF +0490 +0888 +0000 +0000 +ENDCHAR +STARTCHAR U+6AEC +ENCODING 27372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +213E +27E2 +FAA2 +22BE +22A2 +27E2 +713E +6922 +AFE2 +A13E +2394 +2554 +2934 +2125 +2163 +ENDCHAR +STARTCHAR U+6AEE +ENCODING 27374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1010 +11D7 +7D55 +11D7 +1010 +39FF +5410 +11D7 +1155 +11D7 +1010 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+6AEF +ENCODING 27375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1101 +11DE +1244 +7C84 +13FF +12A4 +3BE4 +56AE +13F5 +1004 +1224 +1554 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+6AF0 +ENCODING 27376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FF +1000 +FFFE +1292 +13FE +3820 +37AE +3420 +53AE +5071 +90D3 +139A +108C +10E6 +1383 +ENDCHAR +STARTCHAR U+6AF1 +ENCODING 27377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +5210 +7EFE +1044 +7E44 +4228 +7EFE +4010 +7EFE +4210 +7E10 +0100 +7FFE +0D30 +791E +0100 +ENDCHAR +STARTCHAR U+6AF2 +ENCODING 27378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +279E +20A2 +FD44 +233F +2229 +27E9 +727F +6A90 +A229 +A255 +222E +2254 +2226 +2245 +2618 +ENDCHAR +STARTCHAR U+6AF3 +ENCODING 27379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +13EE +1148 +114E +7FE2 +100E +13E8 +3A2E +57E8 +122E +13E8 +122E +1229 +126F +0000 +0000 +ENDCHAR +STARTCHAR U+6AF6 +ENCODING 27382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1111 +7C1E +10F0 +31FE +3810 +75FF +5000 +51FF +5129 +51FF +1040 +12A2 +1285 +14FD +ENDCHAR +STARTCHAR U+6AF8 +ENCODING 27384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +114E +1272 +17CE +1272 +7FBE +1252 +17FF +3888 +5524 +12FA +1421 +13FE +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+6AF9 +ENCODING 27385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1054 +10FE +7C12 +11FF +1012 +38FE +5555 +11D7 +11FF +1111 +11D7 +1155 +0000 +0000 +ENDCHAR +STARTCHAR U+6AFA +ENCODING 27386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +7FFC +1248 +1758 +3B58 +3440 +37FC +55B4 +55B4 +15B4 +17FC +15B4 +0000 +ENDCHAR +STARTCHAR U+6AFB +ENCODING 27387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +7FB8 +13B8 +12A8 +3BB8 +36A8 +3444 +57FC +5090 +11E0 +1070 +1388 +0000 +ENDCHAR +STARTCHAR U+6AFC +ENCODING 27388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2248 +224A +25AB +FDA9 +2008 +27FF +2148 +777A +694A +AF7A +A14E +2774 +214C +21FD +2717 +2022 +ENDCHAR +STARTCHAR U+6AFD +ENCODING 27389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7BFE +48A8 +49FC +5000 +51FE +4802 +4BFF +4802 +59FE +42A2 +4695 +447C +0100 +FFFF +0910 +710E +ENDCHAR +STARTCHAR U+6B00 +ENCODING 27392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +11EF +1129 +7DEF +1044 +11FF +3844 +55FF +1044 +11FF +118A +1084 +10CB +0000 +0000 +ENDCHAR +STARTCHAR U+6B02 +ENCODING 27394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +27FF +2088 +F80A +267F +2308 +217F +7649 +6B7F +A949 +A07F +2149 +2302 +227F +2622 +2416 +ENDCHAR +STARTCHAR U+6B03 +ENCODING 27395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +1308 +11FE +FD02 +11FE +1088 +38EE +3489 +31E7 +5000 +51FE +9122 +11FE +1054 +10D1 +138F +ENDCHAR +STARTCHAR U+6B04 +ENCODING 27396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17BC +14A4 +7FBC +17BC +3444 +3FFC +3DF4 +55F4 +5554 +15F4 +14E4 +175C +144C +0000 +ENDCHAR +STARTCHAR U+6B05 +ENCODING 27397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1198 +12E8 +1398 +7EE8 +13B8 +1AA8 +37FC +3170 +33C8 +55F4 +5040 +13F8 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+6B06 +ENCODING 27398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A5 +114A +13FF +FD4A +11EF +114A +39EF +354A +31EF +5000 +53FF +9082 +106C +1038 +10EC +1387 +ENDCHAR +STARTCHAR U+6B07 +ENCODING 27399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1088 +10F8 +FC88 +10F8 +108E +3BF8 +3008 +37FF +5252 +53DE +9252 +13DE +1253 +17FE +1042 +ENDCHAR +STARTCHAR U+6B08 +ENCODING 27400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1222 +13FE +1090 +11FC +7F10 +15FC +11FC +3910 +55FC +17FF +1451 +14F9 +158D +14FB +0000 +0000 +ENDCHAR +STARTCHAR U+6B09 +ENCODING 27401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2252 +2154 +27FF +F904 +2088 +23FE +2020 +73FE +6820 +AFFF +A240 +23FF +2252 +23CC +2656 +2053 +ENDCHAR +STARTCHAR U+6B0A +ENCODING 27402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +17FC +1110 +7FB8 +12A8 +1BB8 +35FC +3520 +33F8 +5320 +55F8 +1120 +11FC +1100 +0000 +ENDCHAR +STARTCHAR U+6B0B +ENCODING 27403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +1129 +11EF +11EF +7D29 +11EF +1048 +38FF +5588 +10FF +1088 +10FF +1088 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+6B0C +ENCODING 27404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +13FF +1048 +7C0A +11FF +3508 +3DF8 +37A9 +51E9 +51AA +57AA +15EC +15A4 +12AD +12F3 +14A1 +ENDCHAR +STARTCHAR U+6B0F +ENCODING 27407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27FF +2491 +2491 +FFFF +2112 +2224 +247F +72A4 +6924 +AA7F +A7E4 +2124 +257F +2564 +2564 +213F +ENDCHAR +STARTCHAR U+6B10 +ENCODING 27408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13DF +1000 +13DF +FE51 +12D5 +1020 +3BFF +3648 +33FF +5249 +53FF +9288 +12EF +1288 +14E9 +1187 +ENDCHAR +STARTCHAR U+6B11 +ENCODING 27409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1294 +13DF +1084 +FFFF +114A +114A +3A73 +35FE +3502 +51FE +5102 +91FE +1102 +11FE +1084 +1303 +ENDCHAR +STARTCHAR U+6B12 +ENCODING 27410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +1FD8 +6868 +1390 +2BA8 +7FFC +3AB8 +57D4 +1110 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+6B13 +ENCODING 27411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +11FF +1101 +117D +7C44 +107C +10FE +38BA +54FE +1010 +10FE +1010 +11FF +1129 +0000 +0000 +ENDCHAR +STARTCHAR U+6B16 +ENCODING 27414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +17FC +1540 +7FB8 +17FC +1574 +3FFC +37F0 +3610 +53F0 +53F0 +13F4 +11A4 +1E1C +0000 +ENDCHAR +STARTCHAR U+6B17 +ENCODING 27415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +27FF +2088 +FFDF +2451 +27DF +2451 +77DF +6C21 +AFFF +A525 +25FD +2525 +25FD +24A9 +2527 +ENDCHAR +STARTCHAR U+6B18 +ENCODING 27416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1102 +11FE +7D98 +1154 +11FE +11AA +39FE +55FF +11FD +11A5 +12FD +1021 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+6B19 +ENCODING 27417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1124 +11FC +7DFC +17DF +1555 +17DF +3FDF +5488 +11F0 +1022 +13FE +1124 +1222 +0000 +0000 +ENDCHAR +STARTCHAR U+6B1A +ENCODING 27418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103C +1048 +10F0 +1010 +7FFF +10F4 +1138 +3854 +54B2 +13EF +12AB +13EF +1082 +13EF +0000 +0000 +ENDCHAR +STARTCHAR U+6B1B +ENCODING 27419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +2020 +27FF +FC21 +25AD +2421 +21AC +7280 +6FFF +AA91 +A7DF +2551 +27DF +2111 +2FF1 +2113 +ENDCHAR +STARTCHAR U+6B1D +ENCODING 27421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1290 +7DFC +3AB8 +55D4 +1FF0 +1290 +1FF0 +3E10 +23FC +3E90 +3E50 +2450 +3E10 +6030 +0000 +ENDCHAR +STARTCHAR U+6B1E +ENCODING 27422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +2020 +27FF +FC21 +25AD +2421 +21AC +7000 +6F77 +A555 +A777 +2000 +23FE +2124 +22AA +27FF +ENDCHAR +STARTCHAR U+6B1F +ENCODING 27423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1480 +1FF8 +14A8 +7FE8 +1B78 +1FE8 +3538 +3FE8 +3D28 +57B8 +57B0 +1554 +17D4 +148C +0000 +ENDCHAR +STARTCHAR U+6B20 +ENCODING 27424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +0800 +1FFC +1108 +2110 +4120 +0180 +0280 +0240 +0420 +1810 +600C +0000 +ENDCHAR +STARTCHAR U+6B21 +ENCODING 27425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +2100 +1100 +11FC +0248 +0250 +1440 +1040 +20A0 +20A0 +4110 +4608 +1804 +0000 +ENDCHAR +STARTCHAR U+6B22 +ENCODING 27426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +FC80 +04FC +4504 +4648 +2840 +2840 +1040 +2840 +24A0 +44A0 +8110 +0108 +020E +0C04 +ENDCHAR +STARTCHAR U+6B23 +ENCODING 27427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0140 +0240 +1C40 +1040 +10FC +1FA8 +1530 +1420 +1420 +1460 +2450 +2490 +4508 +0604 +0000 +ENDCHAR +STARTCHAR U+6B24 +ENCODING 27428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +2040 +2440 +3E7E +2082 +2124 +2220 +3F20 +0220 +0220 +1A20 +E250 +0250 +1488 +0906 +0204 +ENDCHAR +STARTCHAR U+6B25 +ENCODING 27429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7C7F +4491 +4511 +4412 +7C10 +4410 +4410 +4428 +7C44 +4482 +0101 +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+6B27 +ENCODING 27431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3F40 +2240 +22FC +32A4 +2B28 +2430 +2620 +2A20 +2960 +3150 +2090 +3F08 +2204 +0000 +ENDCHAR +STARTCHAR U+6B28 +ENCODING 27432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +7F7F +4141 +81D3 +7912 +4910 +4910 +4938 +4928 +7928 +032C +0264 +0246 +0EC3 +ENDCHAR +STARTCHAR U+6B2B +ENCODING 27435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +7F20 +487F +8841 +08D3 +7F12 +0810 +4810 +4F38 +4828 +4828 +4F6C +7844 +C0C6 +0183 +ENDCHAR +STARTCHAR U+6B2C +ENCODING 27436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FF7F +1041 +30D3 +6212 +C610 +6C10 +1910 +3338 +6628 +CC2C +1A64 +3346 +E1C3 +ENDCHAR +STARTCHAR U+6B2D +ENCODING 27437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F20 +4120 +493F +4941 +7F09 +490A +4908 +5508 +6308 +4108 +4108 +4114 +7F22 +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+6B2F +ENCODING 27439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FF7F +1041 +10D3 +1012 +7E10 +0010 +0010 +7E38 +4228 +422C +4264 +4246 +7EC3 +ENDCHAR +STARTCHAR U+6B31 +ENCODING 27441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1420 +223F +4141 +0009 +3E0A +0008 +3E08 +2208 +2208 +2208 +2214 +3E22 +2241 +0000 +0000 +ENDCHAR +STARTCHAR U+6B32 +ENCODING 27442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +1240 +2240 +4840 +08FC +14A8 +1330 +2220 +7E20 +2260 +2250 +3E90 +2308 +2204 +0000 +ENDCHAR +STARTCHAR U+6B33 +ENCODING 27443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +0F3F +0841 +7F09 +550A +5508 +7F08 +5508 +5508 +5514 +5522 +4141 +4241 +0000 +0000 +ENDCHAR +STARTCHAR U+6B34 +ENCODING 27444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0420 +3F3F +2121 +3F49 +210A +2108 +3F08 +2008 +2408 +2208 +2514 +28A2 +7041 +0000 +0000 +ENDCHAR +STARTCHAR U+6B35 +ENCODING 27445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +4E40 +7840 +40FF +4281 +3F13 +4012 +7F10 +4810 +8810 +7F38 +0828 +1C2C +3664 +6346 +C0C3 +ENDCHAR +STARTCHAR U+6B36 +ENCODING 27446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FFA0 +087F +7F41 +4993 +4912 +4910 +7F10 +1810 +1C38 +2A28 +292C +4864 +8846 +08C3 +ENDCHAR +STARTCHAR U+6B37 +ENCODING 27447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +3440 +1C40 +6A40 +08FC +7FA4 +1128 +2830 +7E20 +2A60 +2A50 +2E90 +2908 +0A04 +0000 +ENDCHAR +STARTCHAR U+6B38 +ENCODING 27448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0C40 +1240 +7DFC +20A4 +3F28 +2830 +4820 +7F60 +0850 +1490 +2308 +4204 +0000 +ENDCHAR +STARTCHAR U+6B39 +ENCODING 27449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0C40 +12FC +22A4 +7F28 +0230 +3A20 +2A20 +2A50 +3A50 +0288 +0704 +0000 +ENDCHAR +STARTCHAR U+6B3A +ENCODING 27450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1240 +1240 +1240 +7F40 +127C +1EA8 +1330 +1E20 +1220 +7F20 +1250 +1190 +2108 +4204 +0000 +ENDCHAR +STARTCHAR U+6B3B +ENCODING 27451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +4920 +4B20 +DA7F +9441 +3693 +6312 +C910 +0810 +4910 +4B38 +DA28 +942C +3664 +6346 +C1C3 +ENDCHAR +STARTCHAR U+6B3C +ENCODING 27452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +39D0 +085F +2951 +1091 +2945 +4624 +0004 +39C4 +0844 +0844 +2944 +1084 +294A +4631 +0000 +0000 +ENDCHAR +STARTCHAR U+6B3D +ENCODING 27453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +1240 +22FC +5CA8 +0930 +7E20 +0820 +2A60 +1C50 +1890 +0F08 +7204 +0000 +ENDCHAR +STARTCHAR U+6B3E +ENCODING 27454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0840 +3EFC +00A8 +3F30 +0020 +7F20 +0C60 +2A50 +2A90 +4908 +1A04 +0000 +ENDCHAR +STARTCHAR U+6B3F +ENCODING 27455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +3F20 +217F +4141 +41D3 +8712 +3010 +C710 +8110 +8138 +F728 +812C +8164 +8146 +FFC3 +ENDCHAR +STARTCHAR U+6B41 +ENCODING 27457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +7FD0 +111F +1F11 +1125 +1F04 +1104 +7FC4 +2A04 +2A04 +3384 +200A +3FD1 +0000 +0000 +ENDCHAR +STARTCHAR U+6B42 +ENCODING 27458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +4920 +493F +7F41 +0001 +7F09 +080A +1008 +7F08 +5508 +5508 +5514 +4122 +4341 +0000 +0000 +ENDCHAR +STARTCHAR U+6B43 +ENCODING 27459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0340 +3C40 +0840 +7F40 +08FC +18A4 +6B28 +4930 +4920 +6B20 +4950 +4950 +7F88 +4104 +0000 +ENDCHAR +STARTCHAR U+6B45 +ENCODING 27461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7F10 +141F +7F21 +5521 +5549 +670A +4108 +7F08 +0808 +3E08 +0814 +0822 +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+6B46 +ENCODING 27462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +0A40 +7F40 +007E +2282 +1524 +FFA0 +0020 +3E20 +2220 +2220 +3E50 +2250 +2288 +3F06 +2204 +ENDCHAR +STARTCHAR U+6B47 +ENCODING 27463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +2240 +3E40 +22FC +3EA4 +1128 +1F30 +2920 +6D20 +2B50 +3350 +3D88 +2704 +0000 +ENDCHAR +STARTCHAR U+6B48 +ENCODING 27464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0E10 +1110 +209F +4051 +1F25 +0004 +3884 +2A84 +3A84 +2A84 +3A84 +2A84 +288A +5991 +0000 +0000 +ENDCHAR +STARTCHAR U+6B49 +ENCODING 27465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1240 +3440 +7FC0 +1440 +3F7C +15A4 +7FA8 +1530 +3F20 +1620 +3550 +3550 +5488 +1504 +0000 +ENDCHAR +STARTCHAR U+6B4A +ENCODING 27466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FFA0 +003F +3E61 +224B +3E8A +0008 +7F08 +4108 +5D1C +5514 +5514 +5D36 +4122 +4363 +ENDCHAR +STARTCHAR U+6B4B +ENCODING 27467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +3F10 +221F +2395 +2FD5 +2A65 +2F85 +2A04 +2BC4 +2804 +2A84 +2AA4 +52AA +04F1 +0000 +0000 +ENDCHAR +STARTCHAR U+6B4C +ENCODING 27468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +0240 +3A40 +2AFC +3AA8 +0330 +7F20 +0220 +3A60 +2A50 +3A90 +2B08 +0604 +0000 +ENDCHAR +STARTCHAR U+6B4D +ENCODING 27469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1020 +7E20 +427F +4241 +42CB +7E0A +4008 +7F88 +4008 +7F9C +0294 +AA94 +AAB6 +A9A2 +0363 +ENDCHAR +STARTCHAR U+6B4E +ENCODING 27470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +1440 +7F40 +14FC +3EA4 +2B28 +3E30 +0820 +3E20 +0860 +7F50 +1490 +2308 +4204 +0000 +ENDCHAR +STARTCHAR U+6B50 +ENCODING 27472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +4040 +5E40 +527C +5EA4 +40A8 +7F30 +6D20 +6D20 +7F50 +4050 +7F88 +4104 +0000 +ENDCHAR +STARTCHAR U+6B51 +ENCODING 27473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0F88 +0808 +3FEF +2449 +3F91 +2405 +27A5 +2FC4 +2924 +2544 +2FE4 +410A +0311 +0000 +0000 +ENDCHAR +STARTCHAR U+6B52 +ENCODING 27474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +FF20 +247F +2441 +24D3 +FF12 +9110 +9110 +FF10 +9138 +BD28 +A52C +A564 +BD46 +83C3 +ENDCHAR +STARTCHAR U+6B53 +ENCODING 27475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F40 +2840 +7FFC +14A8 +1F30 +3420 +5F20 +1420 +1F50 +1450 +1F88 +1104 +0000 +ENDCHAR +STARTCHAR U+6B54 +ENCODING 27476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0740 +0440 +3FC0 +2B7C +3DA4 +27A8 +2A30 +3B20 +3B20 +3B50 +2A50 +4F88 +3904 +0000 +ENDCHAR +STARTCHAR U+6B55 +ENCODING 27477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7FC8 +150F +7FD1 +1125 +3F84 +2084 +3F84 +2084 +3F84 +2084 +3F84 +110A +2091 +0000 +0000 +ENDCHAR +STARTCHAR U+6B56 +ENCODING 27478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +FF20 +107F +7E41 +00D3 +7E12 +4210 +7E10 +2410 +FF38 +2428 +7E2C +4264 +4246 +7EC3 +ENDCHAR +STARTCHAR U+6B58 +ENCODING 27480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +4920 +4B20 +DA7F +9441 +36D3 +6312 +C110 +2210 +A290 +B6B8 +AB28 +662C +5564 +CD46 +88C3 +ENDCHAR +STARTCHAR U+6B59 +ENCODING 27481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0C40 +1240 +3F40 +5EFC +12A4 +1F28 +7F30 +1B20 +2D20 +5B50 +2D50 +4988 +1B04 +0000 +ENDCHAR +STARTCHAR U+6B5B +ENCODING 27483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0A40 +1140 +3FFC +40A4 +3F28 +2D30 +3F20 +1220 +1A50 +1750 +2488 +4904 +0000 +ENDCHAR +STARTCHAR U+6B5C +ENCODING 27484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F20 +5520 +553E +7F42 +2092 +3F14 +5110 +FD10 +5510 +7D10 +1328 +FF24 +0A46 +0482 +0000 +0000 +ENDCHAR +STARTCHAR U+6B5D +ENCODING 27485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7F20 +5520 +7F7F +0841 +7F93 +0812 +FF90 +2210 +1410 +7F38 +0828 +7F2C +0864 +0846 +08C3 +ENDCHAR +STARTCHAR U+6B5E +ENCODING 27486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F80 +1090 +1F9F +1091 +1F95 +2124 +2944 +6B44 +1084 +2944 +7BC4 +0004 +2A8A +2A91 +0000 +0000 +ENDCHAR +STARTCHAR U+6B5F +ENCODING 27487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1820 +29A0 +2EA0 +28A0 +3FFC +22E4 +2AA8 +3BB0 +2AA0 +2AA0 +7FD0 +0A50 +1188 +6104 +0000 +ENDCHAR +STARTCHAR U+6B60 +ENCODING 27488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FFA0 +1120 +663F +99A1 +FFCB +110A +6608 +9988 +FF88 +141C +FF94 +9494 +FFB6 +80A2 +FFE3 +ENDCHAR +STARTCHAR U+6B61 +ENCODING 27489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +7F40 +1440 +7740 +55FC +77A4 +3F28 +2430 +7F20 +2420 +3F50 +2450 +3F88 +2104 +0000 +ENDCHAR +STARTCHAR U+6B62 +ENCODING 27490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +1100 +1100 +11F8 +1100 +1100 +1100 +1100 +1100 +1100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+6B63 +ENCODING 27491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +0100 +0100 +1100 +11F0 +1100 +1100 +1100 +1100 +1100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+6B64 +ENCODING 27492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0440 +0448 +2448 +27D0 +2460 +2440 +2440 +2440 +2540 +2644 +3844 +603C +0000 +ENDCHAR +STARTCHAR U+6B65 +ENCODING 27493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0900 +0910 +09F8 +0900 +0904 +FFFE +0100 +0910 +0D18 +1120 +2120 +00C0 +0300 +0C00 +7000 +ENDCHAR +STARTCHAR U+6B66 +ENCODING 27494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +1F48 +0048 +0040 +7FFC +0440 +0440 +17C0 +1440 +1420 +1424 +1794 +780C +0004 +0000 +ENDCHAR +STARTCHAR U+6B67 +ENCODING 27495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1048 +17FC +5040 +5C40 +53F8 +5208 +5110 +5110 +50A0 +5C40 +E0A0 +4110 +060E +1804 +ENDCHAR +STARTCHAR U+6B69 +ENCODING 27497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +09F0 +0900 +0900 +7FFC +0100 +0920 +0910 +1128 +2348 +0180 +0600 +7800 +0000 +ENDCHAR +STARTCHAR U+6B6A +ENCODING 27498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +03C0 +0D30 +7108 +0100 +3FF8 +0100 +09F0 +0900 +0900 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+6B6B +ENCODING 27499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +08FF +0880 +4880 +4880 +48FC +4F84 +4884 +4884 +48FC +4880 +4880 +4880 +4F80 +78FF +C000 +ENDCHAR +STARTCHAR U+6B6D +ENCODING 27501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +09FF +0810 +0810 +08FE +2E04 +2804 +29FF +2804 +2844 +2824 +7E04 +0014 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+6B6E +ENCODING 27502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0880 +08F8 +0880 +0880 +7FFE +0410 +0410 +0450 +275E +2450 +2450 +2F50 +F8FF +0000 +ENDCHAR +STARTCHAR U+6B6F +ENCODING 27503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +09F8 +0900 +7FFC +2928 +2548 +3FF8 +2388 +2548 +2928 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+6B70 +ENCODING 27504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +0909 +4949 +5959 +3333 +6666 +0000 +0410 +0410 +0450 +275E +2450 +2450 +2F50 +F8FF +0000 +ENDCHAR +STARTCHAR U+6B72 +ENCODING 27506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +04FC +0480 +7FFF +0048 +0044 +3FFF +2040 +2042 +3FA4 +2424 +2D68 +3490 +2D29 +4645 +5983 +ENDCHAR +STARTCHAR U+6B73 +ENCODING 27507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +09F0 +0900 +3FFC +0050 +1FFC +1040 +1FC8 +1228 +1730 +1690 +2AB4 +324C +4684 +0000 +ENDCHAR +STARTCHAR U+6B74 +ENCODING 27508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2220 +2220 +3FFC +2770 +2AA8 +32A4 +2080 +24F0 +2480 +4480 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+6B75 +ENCODING 27509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +50FE +5010 +51FF +5E00 +50FE +5082 +50FE +5082 +50FE +5082 +5EFE +7044 +C183 +ENDCHAR +STARTCHAR U+6B76 +ENCODING 27510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +173C +1421 +7FFF +1FFC +1084 +1FFC +1084 +1FFC +0080 +7FFF +4089 +4FF9 +4007 +0000 +0000 +ENDCHAR +STARTCHAR U+6B77 +ENCODING 27511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2000 +238E +2E38 +2208 +3FFF +271C +2AAA +3249 +2208 +2040 +2240 +227E +4240 +5FFF +ENDCHAR +STARTCHAR U+6B78 +ENCODING 27512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +3EF8 +2208 +3FFC +2008 +3EF8 +2200 +3FFC +0928 +2EF8 +28A8 +28A8 +2EB8 +7020 +0000 +ENDCHAR +STARTCHAR U+6B79 +ENCODING 27513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0200 +0200 +03F0 +0410 +0410 +0A20 +1120 +2140 +0080 +0100 +0600 +3800 +0000 +ENDCHAR +STARTCHAR U+6B7B +ENCODING 27515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0880 +0880 +0E88 +1288 +1290 +2AA0 +44C0 +0480 +0880 +1084 +2084 +407C +0000 +ENDCHAR +STARTCHAR U+6B7C +ENCODING 27516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7E1C +11E0 +1020 +1020 +3E20 +2224 +63FE +9220 +0C20 +0420 +0820 +1020 +2020 +4020 +0020 +ENDCHAR +STARTCHAR U+6B7D +ENCODING 27517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +FE1C +20F0 +2080 +2080 +3CFF +2488 +6488 +5488 +CC88 +0888 +1888 +1188 +3108 +6308 +C008 +ENDCHAR +STARTCHAR U+6B7E +ENCODING 27518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FE40 +207F +2055 +3CD5 +2495 +65B5 +4425 +746D +DC49 +08D9 +1991 +1033 +3062 +60C2 +C00E +ENDCHAR +STARTCHAR U+6B7F +ENCODING 27519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +1078 +1088 +1E88 +1308 +3230 +2BF8 +4C88 +0490 +0850 +1020 +20D0 +470C +0000 +ENDCHAR +STARTCHAR U+6B80 +ENCODING 27520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7E30 +11C0 +1040 +1E40 +2240 +33FC +4A40 +0C40 +04A0 +08A0 +1110 +2208 +4404 +0000 +ENDCHAR +STARTCHAR U+6B81 +ENCODING 27521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +04FC +FE88 +2088 +2088 +3D0E +2600 +45F8 +6408 +9888 +0850 +1020 +1050 +2090 +410E +0604 +ENDCHAR +STARTCHAR U+6B82 +ENCODING 27522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +05FC +FF08 +2108 +2108 +3DF8 +2508 +4508 +6508 +99F8 +0908 +1108 +1108 +2108 +47FE +0000 +ENDCHAR +STARTCHAR U+6B83 +ENCODING 27523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +1040 +11F8 +1D48 +2548 +2548 +57FC +1840 +08A0 +10A0 +1110 +2208 +4404 +0000 +ENDCHAR +STARTCHAR U+6B84 +ENCODING 27524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +10A0 +10A0 +1F10 +2228 +3244 +4B80 +0C10 +0460 +0988 +1010 +2060 +4380 +0000 +ENDCHAR +STARTCHAR U+6B85 +ENCODING 27525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7E50 +1050 +1050 +10FF +3C90 +2510 +2410 +5410 +4CFE +0410 +0810 +0810 +1010 +2010 +41FF +ENDCHAR +STARTCHAR U+6B86 +ENCODING 27526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +0840 +0850 +0E88 +128C +13F4 +2A00 +45F8 +0508 +0908 +1108 +21F8 +4108 +0000 +ENDCHAR +STARTCHAR U+6B87 +ENCODING 27527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0484 +FEFE +2100 +22F8 +3C10 +2424 +45FE +6494 +9894 +0924 +1124 +1244 +2484 +4128 +0010 +ENDCHAR +STARTCHAR U+6B88 +ENCODING 27528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7E20 +2040 +3DFE +24AA +24AA +64AA +14AA +0CAA +08AA +08AA +10AA +21FF +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+6B89 +ENCODING 27529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7E80 +10F8 +1108 +1FE8 +2528 +2528 +55E8 +0928 +0928 +09E8 +1128 +2008 +4030 +0000 +ENDCHAR +STARTCHAR U+6B8A +ENCODING 27530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +1140 +11F8 +1E40 +2440 +27FC +54E0 +08E0 +0950 +0A48 +1444 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+6B8B +ENCODING 27531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +7E48 +1040 +13F8 +1C40 +27F8 +2440 +57FC +1828 +0828 +1010 +1034 +20CC +4304 +0000 +ENDCHAR +STARTCHAR U+6B8C +ENCODING 27532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +01FF +7C00 +2049 +2092 +3D24 +2492 +2449 +6400 +15FF +0C10 +0810 +1010 +61FF +0000 +0000 +ENDCHAR +STARTCHAR U+6B8D +ENCODING 27533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7E30 +13D0 +1148 +1D24 +2604 +27F8 +5410 +1860 +0FFC +1040 +1040 +2040 +40C0 +0000 +ENDCHAR +STARTCHAR U+6B8E +ENCODING 27534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +1010 +1054 +3C54 +2454 +44D6 +2539 +1410 +0C10 +0828 +1044 +2082 +0301 +0000 +0000 +ENDCHAR +STARTCHAR U+6B8F +ENCODING 27535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +7C12 +11FF +1010 +3D93 +2454 +4438 +2438 +1454 +0C92 +0911 +1010 +2050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+6B91 +ENCODING 27537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +11FF +1010 +3CFE +2482 +4482 +24FE +1448 +0C48 +0848 +1089 +2109 +060F +0000 +0000 +ENDCHAR +STARTCHAR U+6B92 +ENCODING 27538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +05FE +FF04 +2104 +21FC +3C00 +25FC +4504 +6524 +9924 +0924 +1124 +1124 +2050 +408C +0304 +ENDCHAR +STARTCHAR U+6B93 +ENCODING 27539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0420 +FE50 +2088 +2104 +3E0A +25FC +4400 +6444 +9924 +0924 +1128 +1128 +2010 +47FE +0000 +ENDCHAR +STARTCHAR U+6B94 +ENCODING 27540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +00FE +7E12 +11FF +1012 +3EFE +4210 +2411 +19D2 +1054 +2054 +4092 +0311 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+6B95 +ENCODING 27541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +13F8 +1110 +1C90 +24A0 +27FC +5400 +19F8 +0908 +1108 +1108 +21F8 +4108 +0000 +ENDCHAR +STARTCHAR U+6B96 +ENCODING 27542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +11FC +1020 +1D78 +2548 +2578 +5548 +1978 +0948 +1178 +1100 +21FC +4100 +0000 +ENDCHAR +STARTCHAR U+6B97 +ENCODING 27543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FC40 +23FF +2088 +38A8 +2924 +6BFE +4D25 +E924 +39FC +1124 +1124 +31FC +2021 +6033 +C01E +ENDCHAR +STARTCHAR U+6B98 +ENCODING 27544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +7E48 +107C +13C8 +1C30 +2474 +258C +5454 +087C +0BC8 +1050 +1034 +20DC +4304 +0000 +ENDCHAR +STARTCHAR U+6B99 +ENCODING 27545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +0084 +7C84 +10FF +1084 +3CA4 +44C3 +2581 +18FE +1082 +20FE +4082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+6B9A +ENCODING 27546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0488 +FE10 +21FC +2124 +3D24 +25FC +4524 +6524 +99FC +0820 +1024 +13FE +2020 +4020 +0020 +ENDCHAR +STARTCHAR U+6B9B +ENCODING 27547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +05FC +FE08 +2010 +2020 +3BBE +2AA2 +4AB4 +6AB4 +9AA8 +0BB6 +1222 +10A0 +2044 +4FFE +0000 +ENDCHAR +STARTCHAR U+6B9E +ENCODING 27550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7DF8 +1108 +11F8 +1C00 +25F8 +2508 +55F8 +1908 +09F8 +1108 +11F8 +2198 +4604 +0000 +ENDCHAR +STARTCHAR U+6B9F +ENCODING 27551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FDFC +2124 +2124 +3974 +29DC +6904 +49FC +E800 +3BFE +1292 +1292 +3292 +2292 +67FF +C000 +ENDCHAR +STARTCHAR U+6BA0 +ENCODING 27552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FC40 +21FC +2104 +3DFC +2504 +65FC +4504 +75FC +DC20 +0820 +1FFF +1050 +30D8 +618C +C707 +ENDCHAR +STARTCHAR U+6BA1 +ENCODING 27553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0440 +FFFE +2202 +2434 +3DC0 +2508 +45FC +6510 +9910 +0914 +17FE +1000 +2110 +420C +0404 +ENDCHAR +STARTCHAR U+6BA2 +ENCODING 27554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0154 +F954 +27FF +2154 +3B54 +2E77 +6800 +4BFF +EA21 +3A21 +11FE +1122 +3122 +2122 +6126 +C020 +ENDCHAR +STARTCHAR U+6BA3 +ENCODING 27555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +FE44 +21FF +2044 +3C7C +2410 +64FE +4492 +7492 +DCFE +0810 +18FE +1010 +30FE +6010 +C1FF +ENDCHAR +STARTCHAR U+6BA4 +ENCODING 27556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +11F0 +1310 +1DF0 +2510 +25F0 +57FC +1900 +09F8 +12A8 +14A8 +2148 +42B0 +0000 +ENDCHAR +STARTCHAR U+6BA5 +ENCODING 27557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7E10 +21FF +2101 +3CFE +2410 +24FE +5492 +0CFE +0492 +08FE +1044 +2082 +4101 +0000 +0000 +ENDCHAR +STARTCHAR U+6BA6 +ENCODING 27558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7F7E +08A2 +103E +3F22 +413E +2220 +143E +0820 +103F +2001 +4155 +0155 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+6BA7 +ENCODING 27559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0049 +7DE9 +2008 +21FF +3D28 +2528 +652A +15EA +0C8A +09CA +12AA +208A +408B +0193 +0000 +0000 +ENDCHAR +STARTCHAR U+6BA8 +ENCODING 27560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FDFF +2010 +20FE +3C00 +24FE +6482 +44FE +7444 +DC28 +09FF +1800 +10FE +3082 +6082 +C0FE +ENDCHAR +STARTCHAR U+6BA9 +ENCODING 27561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBDE +2102 +23D4 +3A48 +2D54 +68A3 +4B00 +E924 +38A8 +17FF +10A8 +31AC +2326 +6623 +C020 +ENDCHAR +STARTCHAR U+6BAA +ENCODING 27562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FF8 +1040 +11F0 +1C00 +27FC +2608 +57F8 +19F0 +0910 +11F0 +10A0 +27FC +4000 +0000 +ENDCHAR +STARTCHAR U+6BAB +ENCODING 27563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FB8 +12A8 +13B8 +1C00 +27F8 +2648 +57F8 +1A48 +0BF8 +1040 +17FC +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+6BAC +ENCODING 27564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +20AA +20AA +3CFE +2410 +64FE +4410 +75FF +DC44 +0828 +19FF +1010 +30FE +6010 +C010 +ENDCHAR +STARTCHAR U+6BAD +ENCODING 27565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FDFF +2000 +20FE +3C92 +24FE +6492 +45FF +7400 +DCFE +0892 +18FE +1092 +30FE +6000 +C1FF +ENDCHAR +STARTCHAR U+6BAE +ENCODING 27566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7F28 +1044 +1082 +1101 +3EFE +2200 +22EE +52AA +0CAA +04EE +0800 +0844 +1044 +20AA +4111 +ENDCHAR +STARTCHAR U+6BAF +ENCODING 27567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FFC +1208 +15F8 +1D50 +2660 +25F8 +5708 +19F8 +09F8 +1108 +11F8 +2198 +4604 +0000 +ENDCHAR +STARTCHAR U+6BB0 +ENCODING 27568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FDFF +2010 +20FE +3C00 +25FF +6549 +45FF +7482 +DCFE +0882 +18FE +1082 +30FE +6044 +C183 +ENDCHAR +STARTCHAR U+6BB1 +ENCODING 27569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +7D30 +17E8 +1128 +3FFC +2AA0 +2EE8 +6AA8 +5EE8 +1AD0 +1694 +13EC +2E4C +4084 +0000 +ENDCHAR +STARTCHAR U+6BB2 +ENCODING 27570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +02A0 +7EB0 +13E8 +1568 +3820 +2FFC +2AA0 +6EE8 +5AA8 +1ED0 +12D4 +169C +23EC +4E44 +0000 +ENDCHAR +STARTCHAR U+6BB3 +ENCODING 27571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FC0 +0840 +0844 +0844 +103C +6000 +3FE0 +0820 +0440 +0280 +0380 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+6BB4 +ENCODING 27572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F70 +2250 +2250 +3254 +2A94 +250C +24F8 +2A48 +2A50 +3030 +2030 +3EC8 +2304 +0000 +ENDCHAR +STARTCHAR U+6BB5 +ENCODING 27573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +38F0 +2090 +2090 +3C94 +2114 +220C +3DF8 +2088 +2090 +3C50 +6020 +20D0 +230C +0000 +ENDCHAR +STARTCHAR U+6BB6 +ENCODING 27574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +103C +0824 +7F24 +0825 +08C7 +0800 +083E +7F22 +0814 +0808 +0814 +0822 +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+6BB7 +ENCODING 27575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +38F0 +2090 +3E94 +2294 +3E8C +2300 +3FF8 +2088 +3E50 +2250 +2220 +22D0 +4F0C +0000 +ENDCHAR +STARTCHAR U+6BB8 +ENCODING 27576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +083C +FFA4 +0824 +0824 +7F47 +0000 +7F7E +4922 +4922 +7F36 +401C +4008 +401C +4036 +8063 +ENDCHAR +STARTCHAR U+6BB9 +ENCODING 27577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFBC +4824 +4824 +5F24 +7447 +4400 +7FFE +4A22 +4A22 +4B36 +599C +7088 +401C +3FB6 +0063 +ENDCHAR +STARTCHAR U+6BBA +ENCODING 27578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +02F0 +3490 +0C94 +1A94 +690C +0A00 +7FF8 +1C88 +1A50 +2A50 +4820 +08D0 +0B0C +0000 +ENDCHAR +STARTCHAR U+6BBB +ENCODING 27579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0870 +7F50 +0854 +3E54 +008C +3F00 +22F8 +5C88 +1450 +1450 +1620 +24D0 +430C +0000 +ENDCHAR +STARTCHAR U+6BBC +ENCODING 27580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7F70 +0850 +3E50 +0054 +3F54 +228C +5DF8 +0088 +1C50 +1450 +1620 +24D0 +4B0C +0000 +ENDCHAR +STARTCHAR U+6BBD +ENCODING 27581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +663C +1824 +6724 +0824 +FF47 +1000 +3E7E +6222 +BE22 +2236 +3E1C +2208 +221C +2236 +2663 +ENDCHAR +STARTCHAR U+6BBE +ENCODING 27582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +113C +7F24 +1224 +1624 +1447 +FF00 +107E +2022 +7E22 +A236 +221C +3E08 +221C +2236 +3E63 +ENDCHAR +STARTCHAR U+6BBF +ENCODING 27583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F70 +2150 +2150 +3F54 +2A94 +2A8C +3FF8 +2A48 +3F50 +2C30 +4A30 +52C8 +2304 +0000 +ENDCHAR +STARTCHAR U+6BC0 +ENCODING 27584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +36F0 +2290 +3690 +2294 +2314 +3E0C +2BF8 +0888 +3E90 +0850 +0820 +0ED0 +730C +0000 +ENDCHAR +STARTCHAR U+6BC1 +ENCODING 27585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +66FC +4288 +4288 +6688 +4288 +4306 +7E00 +01FC +7E88 +0888 +0850 +0E20 +F850 +408E +0304 +ENDCHAR +STARTCHAR U+6BC2 +ENCODING 27586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7C +0848 +3E48 +0048 +FF48 +9186 +9200 +7FFC +2884 +2888 +7E50 +0820 +FF50 +088E +0B04 +ENDCHAR +STARTCHAR U+6BC3 +ENCODING 27587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +083C +FFA4 +0024 +3E24 +2247 +3E00 +007E +7F22 +4122 +5D36 +551C +5508 +5D1C +4136 +4363 +ENDCHAR +STARTCHAR U+6BC4 +ENCODING 27588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +083C +FFA4 +0824 +7F24 +4947 +7F00 +497E +7F22 +0822 +FFB6 +081C +7F08 +411C +4136 +7F63 +ENDCHAR +STARTCHAR U+6BC5 +ENCODING 27589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0870 +3F50 +1250 +0C54 +7F94 +190C +6DF8 +1648 +6D50 +1530 +6430 +04C8 +1B04 +0000 +ENDCHAR +STARTCHAR U+6BC6 +ENCODING 27590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F70 +4050 +5E50 +5254 +5E94 +410C +7FF8 +6D48 +6D50 +7F30 +4030 +7F48 +4184 +0000 +ENDCHAR +STARTCHAR U+6BC7 +ENCODING 27591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103C +2724 +4125 +7725 +4147 +7F00 +083E +4922 +2A22 +7F14 +0808 +2A14 +4922 +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+6BC8 +ENCODING 27592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2017 +2065 +4F45 +4545 +5575 +5549 +7740 +5577 +5545 +7745 +14F5 +1445 +2442 +4445 +0000 +0000 +ENDCHAR +STARTCHAR U+6BC9 +ENCODING 27593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FBC +4824 +4F27 +5440 +7FBE +4A14 +5108 +7FB6 +0000 +7FFE +1108 +1108 +391C +6D36 +0100 +FFFF +ENDCHAR +STARTCHAR U+6BCA +ENCODING 27594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +043C +3FA5 +1F47 +3FBE +2494 +3F88 +47F7 +1FFC +0220 +07F0 +0BE8 +1FFC +13E4 +13EC +0000 +0000 +ENDCHAR +STARTCHAR U+6BCB +ENCODING 27595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1110 +1110 +7FFC +1110 +1110 +1110 +1110 +3FFC +2020 +00C0 +0000 +ENDCHAR +STARTCHAR U+6BCC +ENCODING 27596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +1084 +1084 +1084 +1084 +1084 +FFFF +2108 +2108 +2108 +2108 +2108 +2108 +3FF8 +0000 +ENDCHAR +STARTCHAR U+6BCD +ENCODING 27597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0910 +0890 +0890 +7FFC +1210 +1110 +1110 +1010 +3FFC +2020 +0020 +00C0 +0000 +ENDCHAR +STARTCHAR U+6BCE +ENCODING 27598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FFC +1000 +2FE0 +4920 +0920 +7FFC +0920 +0920 +1FF8 +1020 +0020 +00C0 +0000 +ENDCHAR +STARTCHAR U+6BCF +ENCODING 27599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +1FFC +2010 +5FF8 +1210 +1110 +1014 +FFFE +1210 +2110 +2010 +3FF8 +0020 +00A0 +0040 +ENDCHAR +STARTCHAR U+6BD0 +ENCODING 27600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFE +0080 +1FFC +0000 +1FFC +1084 +1084 +7FFF +1084 +1084 +1FFE +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+6BD2 +ENCODING 27602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0100 +7FFC +0000 +0FE0 +0920 +7FFC +0920 +1FF8 +1020 +00C0 +0000 +ENDCHAR +STARTCHAR U+6BD3 +ENCODING 27603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +1FFC +2030 +7E48 +33FC +2A04 +7FA8 +32A8 +2AA8 +3FA8 +22AC +052C +0E04 +0000 +ENDCHAR +STARTCHAR U+6BD4 +ENCODING 27604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +1088 +1088 +1F90 +10A0 +10C0 +1080 +1080 +1180 +1684 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+6BD5 +ENCODING 27605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2098 +3EE0 +2080 +2284 +2C84 +707C +2100 +0104 +FFFE +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+6BD6 +ENCODING 27606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2088 +2498 +3EA0 +20C0 +2084 +2E84 +307C +0400 +1240 +5088 +5106 +9612 +1810 +67F0 +0000 +ENDCHAR +STARTCHAR U+6BD7 +ENCODING 27607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0510 +7F10 +5510 +5510 +5512 +55DC +7D10 +5510 +5510 +5510 +5510 +7D52 +4592 +010E +0000 +ENDCHAR +STARTCHAR U+6BD8 +ENCODING 27608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1FF0 +1110 +1FF0 +1080 +1098 +1FE0 +1080 +1084 +1E84 +707C +0000 +ENDCHAR +STARTCHAR U+6BD9 +ENCODING 27609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2098 +3EE0 +2080 +2E88 +3078 +0004 +FFFE +1080 +1E88 +2298 +52A0 +0CC0 +0884 +1084 +607C +ENDCHAR +STARTCHAR U+6BDA +ENCODING 27610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FC0 +1080 +FFFC +2004 +3FFC +1040 +1F7D +1043 +FF3E +0000 +3FFC +2104 +3FFC +0448 +1C41 +F03F +ENDCHAR +STARTCHAR U+6BDB +ENCODING 27611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +01C0 +1E00 +0200 +0200 +3FF8 +0200 +0200 +7FFC +0200 +0200 +0204 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+6BDE +ENCODING 27614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +3F7E +2040 +2141 +7F7F +0002 +1FFC +0080 +1FFC +0080 +3FFE +0080 +0081 +007F +0000 +0000 +ENDCHAR +STARTCHAR U+6BDF +ENCODING 27615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1118 +2364 +4184 +0E00 +70E0 +1F00 +03F0 +3E00 +03FC +7E00 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+6BE0 +ENCODING 27616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7F3F +0921 +1121 +2121 +4E3F +0010 +07E0 +0080 +0FF8 +0080 +1FFC +0081 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+6BE1 +ENCODING 27617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0E40 +F040 +1048 +147C +1E40 +7040 +1448 +1FFC +F108 +1108 +1108 +11FA +110A +0FFE +0000 +ENDCHAR +STARTCHAR U+6BE2 +ENCODING 27618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +02FE +7C28 +0828 +08FE +7EAA +08AA +08CE +7E82 +0882 +08FE +0882 +0800 +0801 +0FFF +0000 +0000 +ENDCHAR +STARTCHAR U+6BE3 +ENCODING 27619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FEFE +2222 +1212 +0E0E +3A3A +E2E2 +0202 +0070 +1FC0 +0100 +3FF8 +0100 +7FFE +0101 +0183 +00FE +ENDCHAR +STARTCHAR U+6BE4 +ENCODING 27620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1200 +2104 +48B8 +1010 +227C +7F10 +017C +1210 +1212 +121E +1200 +1201 +2201 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+6BE6 +ENCODING 27622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +FE1C +44F0 +4420 +7C20 +44FE +4420 +4420 +7C20 +45FF +4420 +4420 +7C20 +C421 +0433 +041E +ENDCHAR +STARTCHAR U+6BE7 +ENCODING 27623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C0A +3809 +E008 +21FF +2008 +FC49 +2049 +21FA +204A +FC4C +20C5 +2087 +218A +2331 +3003 +1FFE +ENDCHAR +STARTCHAR U+6BE8 +ENCODING 27624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7CA0 +10F8 +1120 +7C20 +11FC +1050 +7C50 +1050 +1092 +131E +1000 +1001 +1FFF +0000 +0000 +ENDCHAR +STARTCHAR U+6BEA +ENCODING 27626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +1E40 +F088 +1084 +11FC +1020 +7D28 +11FC +1120 +1E24 +F3FE +1020 +1022 +1022 +0FFE +0000 +ENDCHAR +STARTCHAR U+6BEB +ENCODING 27627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +3FFC +20C8 +4F00 +03F0 +1E00 +03F8 +3E04 +01FC +0000 +ENDCHAR +STARTCHAR U+6BEC +ENCODING 27628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0450 +0848 +73F8 +1040 +1E48 +7168 +1170 +1CD0 +7148 +1644 +1040 +10C4 +1004 +0FFC +0000 +ENDCHAR +STARTCHAR U+6BEE +ENCODING 27630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2124 +2124 +FB66 +261B +2070 +23C0 +200C +39F8 +E020 +23FE +2020 +27FF +2020 +2031 +601E +ENDCHAR +STARTCHAR U+6BEF +ENCODING 27631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0448 +0948 +7150 +1260 +1C90 +7150 +1248 +1D48 +7150 +1260 +1090 +1114 +1204 +0FFC +0000 +ENDCHAR +STARTCHAR U+6BF0 +ENCODING 27632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +0410 +38FE +0844 +0828 +3EFE +0800 +087C +7F44 +0844 +087C +0844 +0801 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+6BF1 +ENCODING 27633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C80 +3880 +E1FE +2302 +20AA +FCAA +2022 +20FA +2022 +FC72 +20AA +2126 +2004 +201D +3003 +1FFE +ENDCHAR +STARTCHAR U+6BF2 +ENCODING 27634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +39C1 +0842 +295C +2944 +1084 +6F7F +0004 +39C4 +087F +2944 +2944 +2944 +1085 +6F67 +0000 +0000 +ENDCHAR +STARTCHAR U+6BF3 +ENCODING 27635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00C0 +0F00 +03E0 +1E00 +03F0 +3E08 +01F8 +0618 +38E0 +0E38 +38E0 +0F3C +79E4 +0F3C +0000 +ENDCHAR +STARTCHAR U+6BF5 +ENCODING 27637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +103C +25E0 +7E20 +1020 +FF28 +28FC +4C20 +9220 +2424 +49FE +1220 +6420 +0822 +3022 +C01E +ENDCHAR +STARTCHAR U+6BF7 +ENCODING 27639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +FE1C +82F0 +BA20 +8220 +BAFE +0020 +7C20 +4420 +7DFF +4420 +4420 +7C20 +4421 +4433 +7C1E +ENDCHAR +STARTCHAR U+6BF8 +ENCODING 27640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +02FE +7C92 +08FE +0892 +3E92 +08FE +0800 +7F52 +0849 +0942 +097E +0800 +0801 +0FFF +0000 +0000 +ENDCHAR +STARTCHAR U+6BF9 +ENCODING 27641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +083C +15E0 +2220 +7F20 +80A8 +71FC +5520 +5520 +7524 +55FE +5520 +7520 +5122 +5522 +521E +ENDCHAR +STARTCHAR U+6BFB +ENCODING 27643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +7F7C +1010 +3F10 +447E +3F10 +0010 +3F7F +2110 +3F10 +2110 +3F11 +2111 +431F +0000 +0000 +ENDCHAR +STARTCHAR U+6BFC +ENCODING 27644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F81 +109E +1F88 +1088 +1FBF +2008 +7FC8 +0448 +247F +2A48 +3148 +2049 +3E49 +038F +0000 +0000 +ENDCHAR +STARTCHAR U+6BFD +ENCODING 27645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1828 +E0FC +2E28 +23FE +2428 +F4F8 +2E20 +22F8 +2220 +FBFC +2420 +2A22 +31FE +2002 +1FFE +ENDCHAR +STARTCHAR U+6BFE +ENCODING 27646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F81 +20BE +3F88 +2088 +3FBE +0008 +7BC8 +087F +4A48 +2948 +0849 +2949 +4A49 +108F +0000 +0000 +ENDCHAR +STARTCHAR U+6BFF +ENCODING 27647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +241C +3C70 +4210 +9490 +F7FE +0810 +1410 +6310 +C9FF +1210 +6410 +1990 +6311 +0E13 +F80E +ENDCHAR +STARTCHAR U+6C00 +ENCODING 27648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +3FBE +2488 +7FC8 +2488 +3FBE +0408 +3F88 +2488 +3FBE +1509 +7FC9 +0409 +7BCF +0000 +0000 +ENDCHAR +STARTCHAR U+6C01 +ENCODING 27649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0444 +79FF +1044 +10FE +1082 +7CFE +1082 +10FE +1010 +7DFF +1044 +1082 +1101 +1FFF +0000 +0000 +ENDCHAR +STARTCHAR U+6C02 +ENCODING 27650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F20 +087F +FFA4 +2A18 +C967 +0000 +7FFF +4000 +47E0 +4100 +4FF8 +4100 +5FFD +8103 +00FE +ENDCHAR +STARTCHAR U+6C03 +ENCODING 27651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +7FFE +1108 +7FC8 +003E +3F88 +2488 +3F88 +24BE +3F88 +0409 +3F89 +0409 +7FCF +0000 +0000 +ENDCHAR +STARTCHAR U+6C04 +ENCODING 27652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0003 +7F8E +1138 +0A08 +FFC8 +14BF +2508 +4C08 +FFC8 +927F +A248 +DFC8 +9248 +9249 +9E49 +80C7 +ENDCHAR +STARTCHAR U+6C05 +ENCODING 27653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +4920 +2A24 +7F7E +41A8 +5D10 +5528 +5DC6 +4130 +3FC0 +0200 +1FF0 +0200 +FFFA +0202 +01FE +ENDCHAR +STARTCHAR U+6C06 +ENCODING 27654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +3920 +E7FC +2120 +2528 +2330 +F124 +2FFE +2000 +23F0 +FA10 +23F0 +2210 +23F2 +2002 +1FFE +ENDCHAR +STARTCHAR U+6C07 +ENCODING 27655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +39F0 +E220 +27F8 +2A48 +23F8 +F248 +2FFE +2000 +23F8 +FA08 +23F8 +2208 +23FA +2002 +1FFE +ENDCHAR +STARTCHAR U+6C08 +ENCODING 27656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +7FD0 +3FE0 +2EA0 +2AB8 +2EE0 +3FA0 +1F20 +113C +1FE0 +1F20 +1124 +1FA4 +701C +0000 +ENDCHAR +STARTCHAR U+6C09 +ENCODING 27657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E06 +221C +2270 +3E10 +0010 +777E +5510 +5510 +7710 +087F +FF90 +2A10 +2A10 +6B11 +C993 +080E +ENDCHAR +STARTCHAR U+6C0B +ENCODING 27659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1201 +7FBE +1208 +7F88 +40BE +5E88 +0008 +3F08 +083E +1488 +2B09 +1709 +2A89 +160F +0000 +0000 +ENDCHAR +STARTCHAR U+6C0C +ENCODING 27660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +027C +7C88 +10FE +1092 +10FE +7E92 +10FE +10AA +107C +7E44 +107C +1045 +107D +1FFF +0000 +0000 +ENDCHAR +STARTCHAR U+6C0D +ENCODING 27661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7708 +553C +77E0 +5520 +7720 +5528 +77FC +2420 +3FA0 +6424 +7FFE +A420 +3F20 +2422 +3FA2 +201E +ENDCHAR +STARTCHAR U+6C0E +ENCODING 27662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F83 +249E +3F84 +2484 +FFE4 +AABF +FBE4 +AAA4 +FBE4 +041F +FFE4 +9024 +3F84 +6885 +0505 +FFE3 +ENDCHAR +STARTCHAR U+6C0F +ENCODING 27663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +0180 +1F00 +1100 +1100 +1178 +1F80 +1080 +1040 +1040 +1024 +1314 +1C0C +6004 +0000 +ENDCHAR +STARTCHAR U+6C10 +ENCODING 27664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +00F8 +3F80 +2080 +2080 +2084 +3FFE +2080 +2080 +2040 +2240 +2420 +2820 +3312 +208A +0006 +ENDCHAR +STARTCHAR U+6C11 +ENCODING 27665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1008 +1FF8 +1088 +1080 +1FFC +1040 +1040 +1024 +1614 +180C +6004 +0000 +ENDCHAR +STARTCHAR U+6C12 +ENCODING 27666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0018 +00F0 +3F80 +2080 +2080 +3FFE +2040 +2061 +3C33 +E01E +0100 +0100 +FFFF +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+6C13 +ENCODING 27667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +1208 +7FF8 +4248 +4240 +43FC +4240 +4620 +3E24 +0294 +030C +0C04 +0000 +ENDCHAR +STARTCHAR U+6C14 +ENCODING 27668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1000 +3FE0 +4000 +3FF0 +0010 +0010 +0010 +0014 +000C +000C +0004 +0000 +ENDCHAR +STARTCHAR U+6C15 +ENCODING 27669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +2FF8 +4000 +BFF8 +0008 +0208 +0208 +0208 +0208 +0208 +0408 +040A +080A +1004 +ENDCHAR +STARTCHAR U+6C16 +ENCODING 27670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1FFC +1000 +2FF8 +4000 +9FF8 +0088 +7FC8 +0888 +0888 +09E8 +0828 +102A +102A +214A +4084 +ENDCHAR +STARTCHAR U+6C17 +ENCODING 27671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1000 +2FE0 +4000 +3FE0 +0120 +0120 +1A20 +0614 +0514 +180C +6004 +0000 +ENDCHAR +STARTCHAR U+6C18 +ENCODING 27672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +2FF8 +4000 +BFF8 +0008 +0888 +0888 +0888 +0888 +0888 +1088 +108A +208A +4084 +ENDCHAR +STARTCHAR U+6C19 +ENCODING 27673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +2FF8 +4000 +BFF8 +0208 +0208 +2228 +2228 +2228 +2228 +2228 +3FEA +002A +0004 +ENDCHAR +STARTCHAR U+6C1A +ENCODING 27674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +2FF8 +4000 +BFF8 +0008 +1248 +1248 +1248 +1248 +1248 +1248 +224A +224A +4044 +ENDCHAR +STARTCHAR U+6C1B +ENCODING 27675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1000 +3FF0 +4000 +3FF0 +0F10 +1090 +7FF0 +0494 +088C +108C +6304 +0000 +ENDCHAR +STARTCHAR U+6C1D +ENCODING 27677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1FF8 +2000 +4FF0 +0000 +3FF8 +0208 +3FE8 +2228 +2528 +28A8 +2029 +2025 +2043 +0000 +0000 +ENDCHAR +STARTCHAR U+6C1F +ENCODING 27679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1FFC +1000 +2FF8 +4000 +BFF8 +0A08 +7FC8 +0A48 +7FC8 +4A08 +7FE8 +0A28 +0AAA +124A +6204 +ENDCHAR +STARTCHAR U+6C20 +ENCODING 27680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1FFE +2000 +47E0 +0000 +7FF8 +0408 +7FC8 +4448 +7FC8 +4448 +7FC9 +0405 +0403 +0000 +0000 +ENDCHAR +STARTCHAR U+6C21 +ENCODING 27681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +2FF8 +4000 +BFF8 +0408 +0FC8 +1088 +6D08 +0208 +0D88 +7678 +010A +0C0A +0304 +ENDCHAR +STARTCHAR U+6C22 +ENCODING 27682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1FFC +1000 +2FF8 +4010 +BFF8 +0010 +3F90 +0210 +0D90 +7070 +1FD0 +0210 +0252 +7FEA +0006 +ENDCHAR +STARTCHAR U+6C23 +ENCODING 27683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1000 +3FE0 +4000 +3FF0 +1250 +0A90 +3FD0 +0714 +0A8C +324C +0204 +0000 +ENDCHAR +STARTCHAR U+6C24 +ENCODING 27684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1000 +3FE0 +4000 +3FF0 +1FD0 +1250 +1FD0 +1554 +18CC +1FCC +1044 +0000 +ENDCHAR +STARTCHAR U+6C25 +ENCODING 27685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1FFE +27E0 +5FF8 +0008 +3FE8 +0508 +3FE8 +2528 +2528 +29E8 +2029 +3FE5 +2023 +0000 +0000 +ENDCHAR +STARTCHAR U+6C26 +ENCODING 27686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1FFC +1000 +2FF8 +4000 +BFF8 +0208 +3FE8 +0408 +0888 +3F08 +0208 +0C88 +318A +466A +1824 +ENDCHAR +STARTCHAR U+6C27 +ENCODING 27687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1FFC +2000 +2FF8 +4000 +BFF8 +0888 +0508 +3FE8 +0208 +1FC8 +0208 +7FFA +020A +0204 +0200 +ENDCHAR +STARTCHAR U+6C28 +ENCODING 27688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +5FF8 +8000 +3FF8 +0208 +3FE8 +2228 +0408 +FFF8 +0888 +1908 +060A +098A +3044 +ENDCHAR +STARTCHAR U+6C29 +ENCODING 27689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +2FF8 +4000 +BFF8 +0008 +7FE8 +0908 +4928 +2948 +2988 +0908 +090A +FFFA +0004 +ENDCHAR +STARTCHAR U+6C2A +ENCODING 27690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +2FF8 +4000 +BFF8 +0408 +7FE8 +0408 +3F88 +2088 +3F88 +0A08 +0A2A +122A +61E4 +ENDCHAR +STARTCHAR U+6C2B +ENCODING 27691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1FFC +67E0 +FFF8 +0008 +7FE8 +1248 +2488 +1248 +0008 +3FCA +040A +0446 +7FE2 +0000 +0000 +ENDCHAR +STARTCHAR U+6C2C +ENCODING 27692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +3FFE +2000 +6FF8 +C000 +3FF8 +0008 +3FE8 +0508 +3DE8 +2028 +3DED +0505 +7FF7 +0002 +ENDCHAR +STARTCHAR U+6C2E +ENCODING 27694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1FFC +1000 +3FF8 +4000 +BFF0 +1250 +0A90 +0510 +38F0 +0210 +1250 +0A90 +0512 +08CA +7024 +ENDCHAR +STARTCHAR U+6C2F +ENCODING 27695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1FFC +1000 +2FF8 +4000 +BFF8 +0048 +3FE8 +0048 +1FC8 +0048 +FFF8 +1248 +0A8A +326A +0604 +ENDCHAR +STARTCHAR U+6C30 +ENCODING 27696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1FFC +1000 +2FF8 +4010 +BFF8 +0410 +3F90 +0410 +3F90 +0410 +7FD0 +0090 +0912 +060A +0206 +ENDCHAR +STARTCHAR U+6C32 +ENCODING 27698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +2FF8 +4000 +BFF8 +0008 +3FC8 +2648 +3FC8 +0008 +7FE8 +4928 +492A +FFFA +0004 +ENDCHAR +STARTCHAR U+6C33 +ENCODING 27699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +3FFF +2000 +6FF8 +C000 +3FF8 +0008 +1FC8 +1248 +1548 +1FC8 +000C +3FE5 +24A7 +7FF2 +ENDCHAR +STARTCHAR U+6C34 +ENCODING 27700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0108 +0188 +7F90 +0560 +0540 +0920 +0920 +1110 +2108 +4104 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6C35 +ENCODING 27701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +3000 +1000 +8000 +4800 +4800 +1000 +1000 +2000 +E000 +2000 +2000 +2000 +2000 +2000 +ENDCHAR +STARTCHAR U+6C36 +ENCODING 27702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFC +0018 +0060 +0184 +FD0C +0518 +0DB0 +09C0 +1960 +1130 +3118 +610C +C107 +0100 +0300 +ENDCHAR +STARTCHAR U+6C37 +ENCODING 27703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1100 +0908 +0988 +0190 +7D60 +0540 +0920 +0920 +1110 +2108 +4104 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6C38 +ENCODING 27704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +0080 +0000 +0F00 +0108 +0188 +7F90 +0560 +0540 +0920 +1110 +610C +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+6C3A +ENCODING 27706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +2104 +310C +1918 +0930 +0120 +0500 +0DE0 +1938 +710C +C106 +0102 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U+6C3B +ENCODING 27707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +3040 +1040 +07FE +C042 +6042 +2042 +0042 +10C2 +1082 +3082 +2182 +6106 +4304 +C61C +ENDCHAR +STARTCHAR U+6C3D +ENCODING 27709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0280 +0440 +0930 +310E +C104 +3D90 +0560 +0940 +0920 +1110 +210E +4104 +0500 +0200 +ENDCHAR +STARTCHAR U+6C3E +ENCODING 27710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +09F8 +0908 +4108 +2108 +2108 +0108 +0930 +0900 +0900 +1100 +1104 +2104 +20FC +0000 +ENDCHAR +STARTCHAR U+6C3F +ENCODING 27711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +6080 +3080 +1080 +07F8 +C088 +6088 +2088 +0088 +1088 +1088 +3188 +2108 +6309 +4609 +CC07 +ENDCHAR +STARTCHAR U+6C40 +ENCODING 27712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BFC +0820 +4020 +2020 +2020 +0020 +0820 +0820 +0820 +1020 +1020 +2020 +2060 +0000 +ENDCHAR +STARTCHAR U+6C41 +ENCODING 27713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4040 +2040 +27FC +0040 +0840 +0840 +0840 +1040 +1040 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6C42 +ENCODING 27714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0110 +0110 +7FFC +0100 +0188 +3188 +0950 +0360 +0520 +1910 +6108 +0104 +0300 +0000 +ENDCHAR +STARTCHAR U+6C43 +ENCODING 27715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +1878 +0808 +0008 +4088 +3088 +1088 +0288 +0488 +0888 +7104 +1202 +1401 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+6C46 +ENCODING 27718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0600 +0100 +0280 +0C60 +3118 +C106 +0100 +3D90 +0560 +0940 +0920 +1110 +210E +4104 +0500 +0200 +ENDCHAR +STARTCHAR U+6C47 +ENCODING 27719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +37FE +1400 +0400 +8400 +6400 +2400 +0C00 +1400 +E400 +2400 +2400 +2404 +27FE +2000 +ENDCHAR +STARTCHAR U+6C49 +ENCODING 27721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4008 +37FC +1008 +8208 +6208 +2210 +0910 +1120 +20A0 +E040 +20A0 +2110 +2208 +240E +0804 +ENDCHAR +STARTCHAR U+6C4A +ENCODING 27722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +37FC +1008 +8288 +4A50 +4950 +1110 +10A0 +20A0 +E040 +20A0 +20A0 +2110 +220E +2C04 +ENDCHAR +STARTCHAR U+6C4B +ENCODING 27723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +6100 +3100 +11FE +0302 +C202 +6602 +20C2 +0062 +1022 +1002 +3002 +2002 +6006 +4004 +C01C +ENDCHAR +STARTCHAR U+6C4C +ENCODING 27724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4001 +3101 +1111 +4111 +3111 +1111 +0511 +0911 +1111 +7111 +1111 +1201 +1401 +1001 +0000 +0000 +ENDCHAR +STARTCHAR U+6C4D +ENCODING 27725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +3040 +1040 +07F8 +C048 +6048 +2348 +01C8 +10C8 +10E8 +31A8 +2108 +6309 +4609 +CC07 +ENDCHAR +STARTCHAR U+6C4E +ENCODING 27726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +09F0 +0910 +4110 +2110 +2190 +0150 +0950 +0910 +0910 +1110 +1214 +2214 +240C +0000 +ENDCHAR +STARTCHAR U+6C4F +ENCODING 27727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +3040 +1040 +0040 +CFFF +60A0 +20A0 +00A0 +11B0 +1110 +3118 +2308 +620C +4606 +CC03 +ENDCHAR +STARTCHAR U+6C50 +ENCODING 27728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +0880 +40F8 +2108 +2108 +0290 +0C50 +0820 +0820 +1040 +1080 +2300 +2C00 +0000 +ENDCHAR +STARTCHAR U+6C52 +ENCODING 27730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +3020 +17FF +0100 +C100 +6100 +2100 +0100 +1100 +1100 +3100 +2100 +6180 +40FE +C000 +ENDCHAR +STARTCHAR U+6C54 +ENCODING 27732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +3104 +11FE +8200 +4C00 +4BF0 +1010 +1020 +2040 +E080 +2100 +2202 +2202 +21FE +2000 +ENDCHAR +STARTCHAR U+6C55 +ENCODING 27733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4248 +2248 +2248 +0248 +0A48 +0A48 +1248 +1248 +23F8 +2208 +2208 +0000 +ENDCHAR +STARTCHAR U+6C57 +ENCODING 27735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0840 +4040 +2040 +2040 +07FC +0840 +0840 +0840 +1040 +1040 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6C59 +ENCODING 27737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FE +3020 +1020 +0020 +C020 +6020 +27FF +0020 +1020 +3020 +2020 +6020 +4020 +C020 +00E0 +ENDCHAR +STARTCHAR U+6C5A +ENCODING 27738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0840 +4040 +27FC +2080 +0080 +09F8 +0908 +0808 +1008 +1008 +2008 +2070 +0000 +ENDCHAR +STARTCHAR U+6C5B +ENCODING 27739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +47F8 +3010 +1110 +8110 +6110 +2110 +0950 +17F0 +2110 +E110 +2110 +210A +210A +2106 +2100 +ENDCHAR +STARTCHAR U+6C5C +ENCODING 27740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4008 +33FC +1208 +8208 +4A08 +4A08 +13F8 +1208 +2200 +E200 +2200 +2202 +2202 +21FE +2000 +ENDCHAR +STARTCHAR U+6C5D +ENCODING 27741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +0880 +4080 +27FC +2110 +0110 +0910 +0B90 +0A60 +1020 +1050 +2188 +2608 +0000 +ENDCHAR +STARTCHAR U+6C5E +ENCODING 27742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +0100 +7FFC +0100 +0188 +7D88 +0550 +0960 +0920 +1110 +610C +0300 +0000 +ENDCHAR +STARTCHAR U+6C5F +ENCODING 27743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0840 +4040 +2040 +2040 +0040 +0840 +0840 +0840 +1040 +1040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6C60 +ENCODING 27744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0A40 +0A40 +4248 +2278 +23C8 +0E48 +0248 +0A48 +0A70 +1240 +1204 +2204 +21FC +0000 +ENDCHAR +STARTCHAR U+6C61 +ENCODING 27745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +23FC +1800 +0800 +8004 +6FFE +2100 +0900 +1108 +23FC +E008 +2008 +2008 +2088 +2050 +2020 +ENDCHAR +STARTCHAR U+6C62 +ENCODING 27746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4040 +2040 +23F8 +0040 +0840 +0840 +1040 +1040 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6C64 +ENCODING 27748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23F8 +1810 +0820 +8040 +6084 +23FE +08A4 +10A4 +2124 +E144 +2244 +2484 +2904 +2228 +2010 +ENDCHAR +STARTCHAR U+6C65 +ENCODING 27749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3020 +13FE +0020 +4020 +33FE +1104 +0488 +0850 +1020 +7050 +1088 +1104 +1603 +0000 +0000 +ENDCHAR +STARTCHAR U+6C66 +ENCODING 27750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4001 +33FE +1210 +0210 +4210 +33FF +1210 +0210 +0A10 +7210 +1250 +1289 +1305 +1603 +0000 +0000 +ENDCHAR +STARTCHAR U+6C67 +ENCODING 27751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67DF +3104 +1104 +0104 +C104 +61C4 +271F +0104 +1104 +1104 +3104 +2304 +6204 +4604 +CC04 +ENDCHAR +STARTCHAR U+6C68 +ENCODING 27752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +4208 +2208 +2208 +03F8 +0A08 +0A08 +1208 +1208 +2208 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6C69 +ENCODING 27753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +3004 +17FE +8404 +4404 +4C04 +1404 +17FC +2404 +E404 +2404 +2404 +27FC +2404 +2000 +ENDCHAR +STARTCHAR U+6C6A +ENCODING 27754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +0840 +4040 +2040 +2040 +03F8 +0840 +0840 +1040 +1040 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6C6B +ENCODING 27755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +6088 +3088 +1088 +03FE +C088 +6088 +2088 +0088 +17FF +1088 +3088 +2188 +6108 +4308 +C608 +ENDCHAR +STARTCHAR U+6C6D +ENCODING 27757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20E0 +1020 +0020 +0020 +43FE +2222 +0222 +0252 +1252 +128A +1306 +2202 +2202 +2202 +4202 +4206 +ENDCHAR +STARTCHAR U+6C6F +ENCODING 27759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +6080 +3080 +17FF +0080 +C080 +6190 +2110 +0110 +1130 +1320 +3224 +2664 +6444 +4C7E +C1C3 +ENDCHAR +STARTCHAR U+6C70 +ENCODING 27760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4040 +27FC +2040 +0040 +10C0 +10A0 +1120 +2190 +2250 +4448 +4804 +0000 +ENDCHAR +STARTCHAR U+6C71 +ENCODING 27761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1820 +0824 +0022 +4020 +37FF +1020 +0420 +0820 +0850 +7088 +1104 +1202 +1401 +1401 +0000 +0000 +ENDCHAR +STARTCHAR U+6C72 +ENCODING 27762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17F0 +1210 +4220 +2220 +2378 +0308 +1290 +1290 +1260 +2420 +2450 +4888 +5304 +0000 +ENDCHAR +STARTCHAR U+6C73 +ENCODING 27763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BFC +0A00 +4200 +23F8 +2288 +0288 +0A50 +0A50 +1220 +1260 +2490 +2708 +2C04 +0000 +ENDCHAR +STARTCHAR U+6C74 +ENCODING 27764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4080 +3080 +1004 +8FFE +4080 +4880 +10A0 +1090 +208C +E084 +2080 +2080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U+6C76 +ENCODING 27766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +3044 +17FE +8008 +4A08 +4A08 +1110 +1110 +20A0 +E040 +20A0 +2110 +2208 +240E +2804 +ENDCHAR +STARTCHAR U+6C78 +ENCODING 27768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +3020 +17FF +0040 +C040 +6040 +207E +0042 +1042 +1042 +30C2 +2086 +6184 +4304 +C61C +ENDCHAR +STARTCHAR U+6C79 +ENCODING 27769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4208 +3110 +1494 +84A4 +6444 +2444 +0CA4 +14A4 +2514 +E50C +260C +2404 +27FC +2404 +2000 +ENDCHAR +STARTCHAR U+6C7A +ENCODING 27770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +0880 +47F0 +2090 +2090 +0090 +1FFC +10C0 +1120 +2120 +2210 +4408 +4804 +0000 +ENDCHAR +STARTCHAR U+6C7B +ENCODING 27771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +6100 +31FE +1320 +0620 +C020 +6020 +27FF +0020 +1020 +1020 +3020 +2020 +6020 +4020 +C020 +ENDCHAR +STARTCHAR U+6C7D +ENCODING 27773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0BF8 +4200 +25F0 +2000 +07F0 +0010 +0810 +0810 +1014 +100C +200C +2004 +0000 +ENDCHAR +STARTCHAR U+6C7E +ENCODING 27774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10E0 +0820 +0920 +4110 +2210 +2208 +07F4 +0890 +0890 +1090 +1110 +2110 +2210 +2460 +0000 +ENDCHAR +STARTCHAR U+6C80 +ENCODING 27776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087E +0902 +0A02 +7C14 +1A08 +2A7F +4909 +0909 +0888 +0808 +0808 +2828 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6C81 +ENCODING 27777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0820 +0820 +4080 +2080 +2080 +0288 +0A84 +0A84 +1480 +1480 +2088 +2088 +2078 +0000 +ENDCHAR +STARTCHAR U+6C82 +ENCODING 27778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0830 +0BC0 +4200 +2200 +23FC +0220 +0A20 +0A20 +1220 +1220 +2420 +2420 +2820 +0000 +ENDCHAR +STARTCHAR U+6C83 +ENCODING 27779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0830 +0BC0 +4040 +2040 +2040 +07FC +1040 +1040 +20A0 +20A0 +4110 +4208 +4C04 +0000 +ENDCHAR +STARTCHAR U+6C84 +ENCODING 27780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3000 +11FE +0000 +4000 +3000 +13FF +0410 +0820 +0840 +7080 +1102 +13FF +1001 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+6C85 +ENCODING 27781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3000 +1000 +8004 +4FFE +4920 +1120 +1120 +2120 +E120 +2220 +2222 +2422 +281E +3000 +ENDCHAR +STARTCHAR U+6C86 +ENCODING 27782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +3044 +17FE +8000 +4810 +49F8 +1110 +1110 +2110 +E110 +2110 +2212 +2212 +240E +2800 +ENDCHAR +STARTCHAR U+6C87 +ENCODING 27783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1040 +0080 +0104 +4102 +227F +0F91 +0090 +1090 +1090 +1090 +2090 +2111 +2111 +421F +4C00 +ENDCHAR +STARTCHAR U+6C88 +ENCODING 27784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4040 +23FC +2248 +0440 +1060 +1060 +20A0 +20A0 +4124 +4224 +441C +0000 +ENDCHAR +STARTCHAR U+6C89 +ENCODING 27785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +37FC +1404 +8408 +6820 +21F0 +0920 +1120 +2120 +E120 +2120 +2222 +2222 +241E +2800 +ENDCHAR +STARTCHAR U+6C8A +ENCODING 27786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +7E12 +5214 +52F8 +5018 +1434 +1452 +1491 +1510 +2450 +4421 +0401 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+6C8B +ENCODING 27787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3044 +1042 +0040 +43FF +3040 +1050 +0450 +0850 +0850 +7090 +1111 +1211 +141F +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+6C8C +ENCODING 27788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +087C +47C0 +2048 +2248 +0248 +0A48 +0BF8 +0A48 +1040 +1044 +2044 +203C +0000 +ENDCHAR +STARTCHAR U+6C8D +ENCODING 27789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +0880 +4080 +21F0 +2110 +0110 +0910 +0BF0 +1220 +1020 +2020 +2FFC +2000 +0000 +ENDCHAR +STARTCHAR U+6C8E +ENCODING 27790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +30A0 +1120 +0220 +0420 +4220 +323E +1220 +0220 +0A20 +7220 +1221 +1221 +123F +0000 +0000 +ENDCHAR +STARTCHAR U+6C8F +ENCODING 27791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4400 +3404 +14FE +0424 +8524 +5FA4 +4424 +0424 +1424 +2424 +E544 +2644 +2444 +2084 +2114 +2208 +ENDCHAR +STARTCHAR U+6C90 +ENCODING 27792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4040 +27FC +2040 +00E0 +08E0 +0950 +1150 +1248 +2444 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6C92 +ENCODING 27794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +09F8 +0908 +4108 +2208 +2470 +0000 +0BF8 +0908 +1090 +10A0 +2040 +21B0 +2E0C +0000 +ENDCHAR +STARTCHAR U+6C93 +ENCODING 27795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0108 +3F90 +0560 +0920 +1110 +630C +0FE0 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+6C94 +ENCODING 27796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +4FFE +3040 +1040 +8244 +4A7E +4A44 +1244 +1244 +23FC +E004 +2004 +2004 +2004 +2028 +2010 +ENDCHAR +STARTCHAR U+6C95 +ENCODING 27797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +1080 +0100 +01FF +0249 +4449 +2889 +0091 +0911 +0921 +1221 +1441 +1042 +2082 +2104 +4038 +ENDCHAR +STARTCHAR U+6C96 +ENCODING 27798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +43F8 +2248 +2248 +0248 +0A48 +0BF8 +0A48 +1040 +1040 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6C97 +ENCODING 27799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +0100 +0100 +FFFF +0240 +0C30 +391C +E107 +1918 +0D70 +0180 +07E0 +1D38 +F10F +0700 +ENDCHAR +STARTCHAR U+6C98 +ENCODING 27800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +6220 +3220 +1222 +0226 +C3BC +6220 +2220 +0220 +1220 +1220 +3220 +2220 +6221 +43B3 +CE1E +ENDCHAR +STARTCHAR U+6C99 +ENCODING 27801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4250 +2248 +2248 +044C +1454 +18D0 +1060 +2020 +2040 +4180 +4E00 +0000 +ENDCHAR +STARTCHAR U+6C9A +ENCODING 27802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4240 +2240 +2278 +0240 +0A40 +0A40 +1240 +1240 +2240 +2FFC +2000 +0000 +ENDCHAR +STARTCHAR U+6C9B +ENCODING 27803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +47FC +2040 +2040 +03F8 +0A48 +0A48 +1248 +1248 +2270 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6C9C +ENCODING 27804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +6210 +3210 +1210 +03FF +C200 +6200 +2200 +03F8 +1208 +1208 +3208 +2208 +6608 +4408 +CC08 +ENDCHAR +STARTCHAR U+6C9D +ENCODING 27805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +0912 +0A14 +7CF8 +0C18 +1A34 +2952 +4891 +0810 +0810 +0810 +2850 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+6C9F +ENCODING 27807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4200 +3204 +13FE +8404 +6884 +2084 +0104 +0904 +1244 +E424 +27E4 +2024 +2004 +2028 +2010 +ENDCHAR +STARTCHAR U+6CA1 +ENCODING 27809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +09E0 +0920 +4124 +2124 +221C +0400 +0BF0 +0910 +1090 +10A0 +2040 +21B0 +2E0C +0000 +ENDCHAR +STARTCHAR U+6CA2 +ENCODING 27810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +4208 +2208 +23F8 +0248 +1240 +1240 +1220 +2420 +2410 +4808 +5004 +0000 +ENDCHAR +STARTCHAR U+6CA3 +ENCODING 27811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3048 +17FC +8040 +4850 +4BF8 +1040 +1040 +2044 +EFFE +2040 +2040 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+6CA4 +ENCODING 27812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +3200 +1308 +8288 +6250 +2250 +0A20 +1220 +2250 +E250 +2288 +2308 +2204 +23FE +2000 +ENDCHAR +STARTCHAR U+6CA5 +ENCODING 27813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +3440 +1440 +0444 +8444 +67FE +2444 +0C44 +1444 +E444 +2444 +2484 +2884 +2914 +3208 +ENDCHAR +STARTCHAR U+6CA6 +ENCODING 27814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +30A0 +10A0 +0110 +8208 +640E +2904 +1110 +1130 +E1C0 +2100 +2104 +2104 +20FC +2000 +ENDCHAR +STARTCHAR U+6CA7 +ENCODING 27815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +3140 +1140 +8220 +4410 +480E +13F4 +1210 +2210 +E250 +2220 +2204 +2204 +21FC +2000 +ENDCHAR +STARTCHAR U+6CA9 +ENCODING 27817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3440 +1340 +8144 +4FFE +4884 +1084 +1084 +20C4 +E134 +2114 +2204 +2244 +2428 +2810 +ENDCHAR +STARTCHAR U+6CAA +ENCODING 27818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4060 +3024 +13FE +8204 +6204 +2204 +0BFC +1204 +1200 +E200 +2200 +2200 +2400 +2400 +2800 +ENDCHAR +STARTCHAR U+6CAB +ENCODING 27819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +47FC +2040 +2040 +03F8 +08E0 +08E0 +0950 +1150 +1248 +2444 +2040 +0000 +ENDCHAR +STARTCHAR U+6CAC +ENCODING 27820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +2048 +17FC +8040 +4044 +2FFE +0040 +08E0 +1150 +2248 +CC46 +4040 +4040 +4040 +0000 +0000 +ENDCHAR +STARTCHAR U+6CAD +ENCODING 27821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4050 +304C +1044 +87FE +4840 +48E0 +1150 +1150 +2248 +E248 +2444 +2846 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+6CAE +ENCODING 27822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +09F0 +0910 +4110 +2110 +21F0 +0110 +0910 +09F0 +1110 +1110 +2110 +2FFC +2000 +0000 +ENDCHAR +STARTCHAR U+6CB0 +ENCODING 27824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3040 +1040 +0040 +C0C0 +6080 +20FE +0182 +1382 +1682 +3082 +2082 +6082 +4082 +C0FE +ENDCHAR +STARTCHAR U+6CB1 +ENCODING 27825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4208 +2500 +2100 +0108 +0930 +09C0 +1100 +1100 +2104 +2104 +20FC +0000 +ENDCHAR +STARTCHAR U+6CB2 +ENCODING 27826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4108 +31FC +1240 +8440 +4248 +4A7C +13C8 +1648 +2248 +E268 +2250 +2242 +2202 +21FE +2000 +ENDCHAR +STARTCHAR U+6CB3 +ENCODING 27827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +0808 +4008 +23C8 +2248 +0248 +0248 +0BC8 +0A48 +1008 +1008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+6CB4 +ENCODING 27828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6070 +30D8 +118C +0306 +C623 +6060 +20C4 +038C +1018 +1071 +33C3 +2006 +601C +4070 +C3C0 +ENDCHAR +STARTCHAR U+6CB6 +ENCODING 27830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3000 +13FE +0000 +4000 +37FF +1020 +0020 +08A8 +1124 +6222 +2421 +2020 +20A0 +2040 +0000 +0000 +ENDCHAR +STARTCHAR U+6CB7 +ENCODING 27831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3022 +1021 +07FF +4020 +3040 +1084 +0104 +0A44 +1028 +6010 +2028 +2044 +2082 +2301 +0000 +0000 +ENDCHAR +STARTCHAR U+6CB8 +ENCODING 27832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0920 +0FF8 +4128 +2128 +27F8 +0528 +1520 +17FC +1524 +2124 +2238 +4220 +4420 +0000 +ENDCHAR +STARTCHAR U+6CB9 +ENCODING 27833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +4040 +23F8 +2248 +0248 +0A48 +0BF8 +0A48 +1248 +1248 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6CBA +ENCODING 27834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A48 +4248 +2248 +2248 +03F8 +0A48 +0A48 +1248 +1248 +2248 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6CBB +ENCODING 27835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +0880 +40A0 +2110 +2138 +0FC4 +0000 +13F8 +1208 +2208 +2208 +43F8 +4208 +0000 +ENDCHAR +STARTCHAR U+6CBC +ENCODING 27836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FF8 +0888 +4088 +2108 +2108 +0230 +0400 +13F8 +1208 +2208 +2208 +43F8 +4208 +0000 +ENDCHAR +STARTCHAR U+6CBD +ENCODING 27837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +47FC +2040 +2040 +0040 +0BF8 +0A08 +1208 +1208 +2208 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6CBE +ENCODING 27838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +407C +2040 +2040 +0040 +0BF8 +0A08 +1208 +1208 +2208 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6CBF +ENCODING 27839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10E0 +0820 +0920 +4120 +2110 +2210 +0208 +17F4 +1210 +1210 +2210 +2210 +43F0 +4210 +0000 +ENDCHAR +STARTCHAR U+6CC0 +ENCODING 27840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FF +3001 +1001 +01F9 +4001 +31F9 +1109 +0109 +09F9 +1109 +6001 +2002 +2024 +2018 +0000 +0000 +ENDCHAR +STARTCHAR U+6CC1 +ENCODING 27841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +4208 +2208 +23F8 +02A8 +10A0 +10A0 +1120 +2120 +2224 +4424 +481C +0000 +ENDCHAR +STARTCHAR U+6CC2 +ENCODING 27842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +13FF +0201 +0201 +4201 +2279 +0249 +0249 +1249 +1279 +1249 +2201 +2201 +2201 +4201 +4203 +ENDCHAR +STARTCHAR U+6CC3 +ENCODING 27843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +3080 +10FF +0101 +4201 +31F9 +1109 +0109 +09F9 +1109 +6001 +2001 +2012 +200C +0000 +0000 +ENDCHAR +STARTCHAR U+6CC4 +ENCODING 27844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1250 +0A50 +0A50 +4250 +27FC +2250 +0250 +0A50 +0A50 +1270 +1250 +2200 +23FC +2200 +0000 +ENDCHAR +STARTCHAR U+6CC5 +ENCODING 27845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FF8 +0C08 +4488 +2488 +2488 +0488 +0CC8 +0D48 +1528 +1618 +2408 +27F8 +2408 +0000 +ENDCHAR +STARTCHAR U+6CC6 +ENCODING 27846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6120 +3120 +1120 +03FE +C220 +6620 +2020 +07FF +1050 +1050 +30D8 +2088 +618C +4306 +C603 +ENDCHAR +STARTCHAR U+6CC7 +ENCODING 27847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +3100 +1100 +07EF +4129 +3129 +1129 +0129 +0929 +1129 +6229 +242F +2049 +2180 +0000 +0000 +ENDCHAR +STARTCHAR U+6CC9 +ENCODING 27849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +0FE0 +0820 +0FE0 +0820 +0FE0 +0108 +3F90 +03E0 +0540 +1930 +610C +0300 +0000 +ENDCHAR +STARTCHAR U+6CCA +ENCODING 27850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0880 +43F8 +2208 +2208 +0208 +13F8 +1208 +1208 +2208 +2208 +43F8 +4208 +0000 +ENDCHAR +STARTCHAR U+6CCC +ENCODING 27852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0828 +0828 +4088 +2090 +2290 +02B0 +12A8 +14C4 +14C4 +2880 +2188 +4288 +4478 +0000 +ENDCHAR +STARTCHAR U+6CCD +ENCODING 27853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +3040 +1040 +0FFF +C150 +6150 +2158 +0348 +124C +1244 +3646 +2DFB +6040 +4040 +C040 +ENDCHAR +STARTCHAR U+6CCF +ENCODING 27855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +3222 +1222 +0222 +C222 +63FE +2020 +0020 +1020 +1222 +3222 +2222 +6222 +43FE +C000 +ENDCHAR +STARTCHAR U+6CD0 +ENCODING 27856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4F20 +3920 +1A20 +8A24 +4CFE +4A24 +1924 +1924 +2924 +ED24 +2A44 +2844 +2884 +2928 +2A10 +ENDCHAR +STARTCHAR U+6CD1 +ENCODING 27857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +6108 +3308 +1208 +063F +C489 +6689 +2389 +0109 +1109 +1319 +3251 +2253 +67F2 +4C22 +C06E +ENDCHAR +STARTCHAR U+6CD2 +ENCODING 27858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +603C +33E4 +1204 +0244 +C244 +6244 +2244 +0244 +1244 +1244 +3254 +2256 +667A +45CA +CC03 +ENDCHAR +STARTCHAR U+6CD3 +ENCODING 27859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +0F20 +0920 +4120 +2720 +2420 +0420 +0F20 +0D30 +1148 +1148 +215C +21E4 +2604 +0000 +ENDCHAR +STARTCHAR U+6CD4 +ENCODING 27860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +4210 +2210 +2214 +9FFE +4210 +4A10 +1210 +1210 +23F0 +E210 +2210 +2210 +2210 +23F0 +2210 +ENDCHAR +STARTCHAR U+6CD5 +ENCODING 27861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +43F8 +2040 +2040 +07FC +0040 +0840 +0890 +1088 +1138 +27C4 +2004 +0000 +ENDCHAR +STARTCHAR U+6CD6 +ENCODING 27862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4104 +363E +14A4 +84A4 +44A4 +4CA4 +14A4 +15A4 +26B4 +E0A8 +2120 +2120 +2220 +2420 +2820 +ENDCHAR +STARTCHAR U+6CD7 +ENCODING 27863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FF8 +0D48 +4548 +2548 +2548 +0548 +0D58 +0E58 +1638 +1408 +2408 +27F8 +2408 +0000 +ENDCHAR +STARTCHAR U+6CD9 +ENCODING 27865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0840 +4150 +2148 +2248 +0040 +0FFC +0840 +1040 +1040 +2040 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6CDA +ENCODING 27866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +6110 +3110 +1510 +0513 +C5DE +6510 +2510 +0510 +1510 +1510 +3510 +2510 +6511 +45D1 +CF0F +ENDCHAR +STARTCHAR U+6CDB +ENCODING 27867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0830 +0BC0 +4040 +2040 +27F8 +0008 +0810 +0810 +1020 +1240 +2380 +24C0 +283C +0000 +ENDCHAR +STARTCHAR U+6CDC +ENCODING 27868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +601C +33F0 +1210 +0210 +C210 +63FF +2210 +0210 +1218 +1208 +33C8 +260C +6005 +47F7 +C002 +ENDCHAR +STARTCHAR U+6CDD +ENCODING 27869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0830 +0BC0 +4200 +2200 +23FC +0220 +0AE0 +0A30 +1228 +1224 +2420 +2420 +2820 +0000 +ENDCHAR +STARTCHAR U+6CDE +ENCODING 27870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +3040 +1040 +07FE +8402 +6804 +2000 +0FFE +1040 +2040 +E040 +2040 +2040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U+6CE0 +ENCODING 27872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +30A0 +1110 +8110 +4A88 +4C46 +1040 +17F8 +2008 +E010 +2120 +20C0 +2040 +2030 +2010 +ENDCHAR +STARTCHAR U+6CE1 +ENCODING 27873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0900 +43F8 +2208 +27C8 +0848 +03C8 +0A70 +0A00 +1200 +1204 +2204 +21FC +0000 +ENDCHAR +STARTCHAR U+6CE2 +ENCODING 27874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4248 +2250 +2240 +03F8 +1308 +1290 +1290 +2460 +2460 +4990 +560C +0000 +ENDCHAR +STARTCHAR U+6CE3 +ENCODING 27875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +47FC +2010 +2210 +0110 +0910 +0890 +10A0 +10A0 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6CE5 +ENCODING 27877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +4208 +23F8 +2288 +0280 +0298 +12E0 +1280 +2480 +2484 +4884 +507C +0000 +ENDCHAR +STARTCHAR U+6CE7 +ENCODING 27879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +6016 +3012 +1010 +03FF +C210 +6212 +2212 +0216 +1214 +121C +3208 +239D +6E35 +4067 +C1C2 +ENDCHAR +STARTCHAR U+6CE8 +ENCODING 27880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0840 +0840 +47FC +2040 +2040 +0040 +13F8 +1040 +1040 +2040 +2040 +4FFC +4000 +0000 +ENDCHAR +STARTCHAR U+6CE9 +ENCODING 27881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6120 +3120 +1120 +01FE +C320 +6620 +2020 +0020 +13FE +1020 +3020 +2020 +6020 +47FF +C000 +ENDCHAR +STARTCHAR U+6CEA +ENCODING 27882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +4208 +2208 +23F8 +0208 +0A08 +0BF8 +1208 +1208 +2208 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6CEB +ENCODING 27883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +3044 +17FE +8080 +4080 +4908 +1218 +17E0 +2040 +E080 +2100 +2210 +2408 +27FC +2004 +ENDCHAR +STARTCHAR U+6CEC +ENCODING 27884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +3020 +17FF +0401 +C401 +6401 +2088 +0088 +1088 +1088 +3088 +218C +6104 +4306 +C603 +ENDCHAR +STARTCHAR U+6CED +ENCODING 27885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4084 +3084 +1104 +0204 +457F +3104 +1104 +0144 +0924 +1114 +6104 +2104 +2114 +2108 +0000 +0000 +ENDCHAR +STARTCHAR U+6CEE +ENCODING 27886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4444 +334C +1150 +8040 +47FC +4840 +1040 +1044 +2FFE +E040 +2040 +2040 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+6CEF +ENCODING 27887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +4208 +23F8 +2248 +0240 +0BFC +0A20 +1220 +1210 +2214 +23CC +2E04 +0000 +ENDCHAR +STARTCHAR U+6CF0 +ENCODING 27888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +0FE0 +0280 +7FFC +0540 +1930 +6D6C +0380 +0D60 +3118 +0300 +0000 +ENDCHAR +STARTCHAR U+6CF1 +ENCODING 27889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +43F8 +2248 +2248 +0248 +0A48 +0FFC +1040 +1040 +20A0 +2310 +2C0C +0000 +ENDCHAR +STARTCHAR U+6CF2 +ENCODING 27890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6023 +303E +13E0 +0020 +C220 +6220 +2220 +03FF +1061 +1061 +30A3 +21A2 +632E +4620 +C020 +ENDCHAR +STARTCHAR U+6CF3 +ENCODING 27891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10C0 +0820 +0800 +43C0 +2048 +2048 +07F0 +10E0 +1150 +1150 +2248 +2444 +4040 +40C0 +0000 +ENDCHAR +STARTCHAR U+6CF4 +ENCODING 27892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0102 +7D06 +059C +0D60 +1930 +311C +E107 +0700 +0000 +3FFC +2444 +2444 +2444 +FFFF +0000 +ENDCHAR +STARTCHAR U+6CF5 +ENCODING 27893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0400 +0810 +1FF8 +2810 +C810 +0FF0 +0908 +0118 +7DA0 +0540 +0920 +111E +6104 +0300 +ENDCHAR +STARTCHAR U+6CF6 +ENCODING 27894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +1118 +0920 +0040 +7FFE +4102 +8104 +0110 +3DA0 +0540 +0920 +1110 +210E +C104 +0500 +0200 +ENDCHAR +STARTCHAR U+6CF7 +ENCODING 27895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4120 +3110 +1104 +8FFE +4940 +4948 +1148 +1150 +2250 +E260 +2240 +24C2 +2542 +283E +3000 +ENDCHAR +STARTCHAR U+6CF8 +ENCODING 27896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4044 +307E +1040 +8044 +4BFE +4A04 +1204 +1204 +23FC +E204 +2200 +2200 +2400 +2400 +2800 +ENDCHAR +STARTCHAR U+6CF9 +ENCODING 27897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +33FE +1202 +0202 +4202 +33FE +1202 +0202 +0BFE +1202 +6000 +2000 +27FF +2000 +0000 +0000 +ENDCHAR +STARTCHAR U+6CFA +ENCODING 27898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +407C +3780 +1440 +8440 +4440 +4444 +17FE +1040 +2040 +E150 +2248 +2446 +2842 +2140 +2080 +ENDCHAR +STARTCHAR U+6CFB +ENCODING 27899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +27FE +2402 +0904 +8100 +61FC +2100 +0904 +11FE +2004 +E024 +2FF4 +2004 +2004 +2014 +2008 +ENDCHAR +STARTCHAR U+6CFC +ENCODING 27900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4250 +3248 +1440 +87FE +6080 +2080 +09F8 +1108 +2310 +E290 +24A0 +2840 +20B0 +210E +2604 +ENDCHAR +STARTCHAR U+6CFD +ENCODING 27901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +33F8 +1110 +00A0 +8040 +60A0 +2110 +0A4E +15F4 +2040 +E040 +27FC +2040 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+6CFE +ENCODING 27902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4010 +37F8 +1010 +8020 +48C0 +4918 +1206 +1402 +27FC +E040 +2040 +2040 +2044 +2FFE +2000 +ENDCHAR +STARTCHAR U+6D00 +ENCODING 27904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +3080 +11FC +0304 +4544 +3124 +1104 +07FF +0904 +7144 +1124 +1104 +1104 +120C +0000 +0000 +ENDCHAR +STARTCHAR U+6D01 +ENCODING 27905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3044 +17FE +0040 +8048 +67FC +2000 +0808 +13FC +E208 +2208 +2208 +2208 +23F8 +2208 +ENDCHAR +STARTCHAR U+6D03 +ENCODING 27907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3040 +17FF +0100 +4220 +3524 +1124 +04A8 +0820 +1050 +7088 +1104 +1202 +1401 +0000 +0000 +ENDCHAR +STARTCHAR U+6D04 +ENCODING 27908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +4FFE +2804 +1824 +89F4 +4924 +4924 +1924 +1924 +2924 +E9E4 +2924 +2804 +2804 +2FFC +2804 +ENDCHAR +STARTCHAR U+6D07 +ENCODING 27911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +3444 +1444 +8454 +4FFC +4C44 +1444 +14A4 +24A4 +E4A4 +2514 +260C +2404 +27FC +2404 +ENDCHAR +STARTCHAR U+6D08 +ENCODING 27912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +31FC +1208 +0010 +41FF +3100 +1100 +057E +0942 +1142 +7144 +1141 +1241 +147F +0000 +0000 +ENDCHAR +STARTCHAR U+6D09 +ENCODING 27913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4001 +33FE +1200 +0200 +43FF +3200 +1200 +02FE +1282 +2282 +6282 +2482 +28FE +2082 +0000 +0000 +ENDCHAR +STARTCHAR U+6D0A +ENCODING 27914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +3040 +17FF +0080 +C080 +61BE +2104 +0308 +1508 +117F +3108 +2108 +6108 +4108 +C138 +ENDCHAR +STARTCHAR U+6D0B +ENCODING 27915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0890 +08A0 +47FC +2040 +2040 +03F8 +0840 +0840 +0FFC +1040 +1040 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6D0C +ENCODING 27916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0FC8 +0A28 +4228 +23A8 +24A8 +04A8 +0EA8 +09A8 +1128 +1128 +2208 +2408 +2818 +0000 +ENDCHAR +STARTCHAR U+6D0D +ENCODING 27917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3410 +1410 +0410 +44FE +3482 +1482 +0482 +04FE +1410 +6410 +2410 +27FF +2400 +0000 +0000 +ENDCHAR +STARTCHAR U+6D0E +ENCODING 27918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4088 +33FC +1208 +8208 +4A08 +4BF8 +1208 +1208 +2208 +E3F8 +2208 +2208 +2208 +23F8 +2208 +ENDCHAR +STARTCHAR U+6D0F +ENCODING 27919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6FFF +3020 +1060 +0040 +C7FE +6492 +2492 +0492 +1492 +1492 +3492 +2492 +6492 +4492 +C496 +ENDCHAR +STARTCHAR U+6D10 +ENCODING 27920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +313F +1200 +0480 +4080 +313F +1304 +0504 +0904 +1104 +7104 +1104 +1114 +1108 +0000 +0000 +ENDCHAR +STARTCHAR U+6D11 +ENCODING 27921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +1110 +0210 +0210 +46FF +2610 +0A10 +0228 +1228 +1228 +1228 +2224 +2244 +2244 +4242 +4281 +ENDCHAR +STARTCHAR U+6D12 +ENCODING 27922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +0940 +4140 +27F8 +2548 +0548 +0D58 +0D58 +1638 +1608 +2408 +27F8 +2408 +0000 +ENDCHAR +STARTCHAR U+6D13 +ENCODING 27923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +37FE +1040 +0040 +C7FE +6442 +2442 +0442 +14E6 +10E0 +3150 +2358 +664C +4C47 +C040 +ENDCHAR +STARTCHAR U+6D16 +ENCODING 27926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +41FC +3104 +1104 +05FC +4400 +37FE +1022 +0022 +17FF +2050 +6088 +2104 +2202 +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+6D17 +ENCODING 27927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0940 +0940 +41F8 +2240 +2440 +07FC +10A0 +10A0 +1120 +2120 +2224 +4424 +481C +0000 +ENDCHAR +STARTCHAR U+6D18 +ENCODING 27928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3042 +13FC +0050 +47FF +3040 +10C0 +057E +0A40 +107F +7001 +1001 +1022 +101C +0000 +0000 +ENDCHAR +STARTCHAR U+6D19 +ENCODING 27929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0940 +0940 +41F8 +2240 +2440 +07FC +08E0 +08E0 +1150 +1150 +2248 +2444 +2040 +0000 +ENDCHAR +STARTCHAR U+6D1A +ENCODING 27930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +31F8 +1310 +84A0 +4040 +49B0 +164E +1040 +23F8 +E240 +2244 +27FE +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+6D1B +ENCODING 27931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +08F0 +4110 +2320 +24C0 +00C0 +1330 +1FFC +2210 +2210 +4210 +43F0 +4210 +0000 +ENDCHAR +STARTCHAR U+6D1D +ENCODING 27933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1401 +0080 +4088 +37FF +1088 +0488 +0888 +7050 +1020 +1050 +1088 +1707 +0000 +0000 +ENDCHAR +STARTCHAR U+6D1E +ENCODING 27934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FF8 +0C08 +4408 +27F8 +2408 +05E8 +1528 +1528 +15E8 +2528 +2408 +4408 +4418 +0000 +ENDCHAR +STARTCHAR U+6D1F +ENCODING 27935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4040 +23F8 +2048 +03F8 +0A40 +0BFC +1244 +1058 +20A0 +2110 +260C +0000 +ENDCHAR +STARTCHAR U+6D20 +ENCODING 27936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3084 +1102 +03FF +4021 +3120 +11FE +0220 +0820 +17FF +7020 +1020 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+6D22 +ENCODING 27938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +317F +1211 +0611 +42FF +3211 +1211 +027F +0A10 +1210 +7210 +1220 +1240 +1280 +0000 +0000 +ENDCHAR +STARTCHAR U+6D25 +ENCODING 27941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BF8 +4048 +27FC +2048 +03F8 +1040 +13F8 +1040 +27FC +2040 +4040 +4040 +0000 +ENDCHAR +STARTCHAR U+6D26 +ENCODING 27942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3020 +1060 +0040 +C3FE +6202 +2202 +0202 +1202 +13FE +3202 +2202 +6202 +4202 +C3FE +ENDCHAR +STARTCHAR U+6D27 +ENCODING 27943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4084 +37FE +1080 +8108 +49FC +4B08 +1508 +11F8 +2108 +E108 +21F8 +2108 +2108 +2128 +2110 +ENDCHAR +STARTCHAR U+6D28 +ENCODING 27944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +3020 +17FF +0088 +C18C +6306 +268B +0088 +10D8 +1070 +3020 +2070 +60D8 +418C +C707 +ENDCHAR +STARTCHAR U+6D29 +ENCODING 27945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BF8 +4248 +2248 +23F8 +0248 +0BF8 +0A48 +0830 +1020 +10D4 +270C +2004 +0000 +ENDCHAR +STARTCHAR U+6D2A +ENCODING 27946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0920 +0920 +4120 +27F8 +2120 +0120 +0120 +1FFC +1100 +2120 +2210 +4408 +4808 +0000 +ENDCHAR +STARTCHAR U+6D2B +ENCODING 27947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0880 +43F8 +22A8 +22A8 +02A8 +0AA8 +0AA8 +12A8 +12A8 +22A8 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6D2C +ENCODING 27948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FC +3404 +1404 +07FC +4444 +3474 +1494 +0514 +1494 +6464 +2444 +2585 +2405 +2803 +0000 +0000 +ENDCHAR +STARTCHAR U+6D2D +ENCODING 27949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3400 +1400 +05FF +4410 +3410 +15FF +0410 +0C10 +15FF +6400 +2400 +27FF +2400 +0000 +0000 +ENDCHAR +STARTCHAR U+6D2E +ENCODING 27950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +40A0 +30A0 +14A4 +82AC +4AB0 +48A0 +11B0 +12AC +24A4 +E0A0 +2120 +2122 +2222 +241E +2800 +ENDCHAR +STARTCHAR U+6D2F +ENCODING 27951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0F7E +F812 +0F12 +7832 +0F22 +F866 +08CC +0100 +0102 +7D86 +056C +0D30 +391C +E107 +0700 +ENDCHAR +STARTCHAR U+6D30 +ENCODING 27952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FF +3200 +1200 +0200 +43FE +3202 +1202 +0202 +0BFE +1200 +6200 +2200 +23FF +2200 +0000 +0000 +ENDCHAR +STARTCHAR U+6D31 +ENCODING 27953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3208 +1208 +83F8 +6208 +2208 +0BF8 +1208 +2208 +E208 +2FFE +2008 +2008 +2008 +2008 +ENDCHAR +STARTCHAR U+6D32 +ENCODING 27954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1208 +0A48 +0A48 +4248 +2768 +26D8 +0AD8 +0248 +1248 +1248 +2448 +2448 +4848 +5008 +0000 +ENDCHAR +STARTCHAR U+6D33 +ENCODING 27955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0938 +4128 +2FA8 +22A8 +02A8 +0AA8 +0AA8 +17A8 +11A8 +2178 +2228 +2400 +0000 +ENDCHAR +STARTCHAR U+6D34 +ENCODING 27956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +3088 +1050 +03FE +4088 +3088 +1088 +07FF +0888 +1088 +7108 +1208 +1408 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+6D35 +ENCODING 27957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0900 +41F8 +2208 +23C8 +0648 +0BC8 +0A48 +13C8 +1248 +2008 +2008 +2030 +0000 +ENDCHAR +STARTCHAR U+6D36 +ENCODING 27958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0900 +43F8 +2208 +2448 +0E68 +15A8 +14A8 +2568 +2628 +47E8 +4428 +4030 +0000 +ENDCHAR +STARTCHAR U+6D37 +ENCODING 27959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +37FF +1040 +0088 +4104 +33FE +1022 +0420 +0820 +13FE +7020 +1020 +1022 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+6D38 +ENCODING 27960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0A48 +4148 +2150 +2040 +07FC +08A0 +08A0 +10A0 +1120 +2124 +2224 +241C +0000 +ENDCHAR +STARTCHAR U+6D39 +ENCODING 27961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3000 +1008 +83FC +4A08 +4A08 +13F8 +1208 +2208 +E208 +23F8 +2208 +2000 +2FFE +2000 +ENDCHAR +STARTCHAR U+6D3A +ENCODING 27962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +30FE +1104 +0288 +4450 +3020 +1040 +0480 +09FE +7282 +1082 +1082 +10FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+6D3B +ENCODING 27963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0830 +0BC0 +4040 +2040 +27FC +0040 +1040 +13F8 +1208 +2208 +2208 +43F8 +4208 +0000 +ENDCHAR +STARTCHAR U+6D3C +ENCODING 27964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3048 +17FC +8040 +6044 +2FFE +0840 +1040 +2048 +E7FC +2040 +2040 +2044 +2FFE +2000 +ENDCHAR +STARTCHAR U+6D3D +ENCODING 27965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +08A0 +40A0 +2110 +23F8 +0404 +0800 +0BF8 +1208 +1208 +2208 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6D3E +ENCODING 27966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +08C0 +0B08 +4230 +22C0 +22C8 +02C8 +12B0 +12A0 +1290 +2490 +2488 +4884 +5080 +0000 +ENDCHAR +STARTCHAR U+6D3F +ENCODING 27967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +37FF +1090 +030C +CC03 +63FC +2000 +07FF +1080 +1100 +33FE +2002 +6002 +4006 +C01C +ENDCHAR +STARTCHAR U+6D40 +ENCODING 27968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +3088 +1088 +0088 +47FF +3489 +1489 +0489 +17FF +6489 +2489 +2489 +27FF +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+6D41 +ENCODING 27969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +40A0 +2110 +27E8 +0008 +12A0 +12A0 +22A0 +22A0 +42A4 +44A4 +481C +0000 +ENDCHAR +STARTCHAR U+6D42 +ENCODING 27970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +3088 +1050 +03FE +4020 +3020 +17FF +0020 +0820 +7050 +1088 +1104 +1202 +1401 +0000 +0000 +ENDCHAR +STARTCHAR U+6D43 +ENCODING 27971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3048 +17FC +8040 +4A48 +4950 +1044 +1FFE +2040 +E0A0 +20A0 +2110 +2108 +220E +2C04 +ENDCHAR +STARTCHAR U+6D44 +ENCODING 27972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +09F0 +4220 +2440 +23F8 +0048 +0FFC +1048 +13F8 +2048 +2040 +4040 +40C0 +0000 +ENDCHAR +STARTCHAR U+6D45 +ENCODING 27973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +0888 +08F8 +4780 +20F0 +2380 +00F8 +1790 +1050 +1060 +2064 +2194 +460C +4004 +0000 +ENDCHAR +STARTCHAR U+6D46 +ENCODING 27974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +4440 +247C +0484 +1548 +2430 +6420 +0540 +0108 +7D98 +0560 +0920 +0910 +110E +6504 +0200 +ENDCHAR +STARTCHAR U+6D47 +ENCODING 27975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +3108 +10FC +0780 +80A0 +6044 +20A4 +0B1C +1000 +27FC +E120 +2120 +2120 +2122 +2222 +2C1E +ENDCHAR +STARTCHAR U+6D48 +ENCODING 27976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4044 +307E +1040 +8048 +4BFC +4A08 +1248 +1248 +2248 +E248 +2248 +20A0 +2090 +210C +2604 +ENDCHAR +STARTCHAR U+6D4A +ENCODING 27978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3040 +1044 +87FE +6444 +2444 +0C44 +1444 +27FC +E444 +2050 +2048 +207C +2FC4 +2404 +ENDCHAR +STARTCHAR U+6D4B +ENCODING 27979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4044 +27E4 +2454 +8554 +6554 +2554 +0D54 +1554 +2554 +E554 +2104 +2284 +2444 +2854 +2008 +ENDCHAR +STARTCHAR U+6D4D +ENCODING 27981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +30A0 +1110 +8208 +4C0E +49F4 +1000 +1004 +2FFE +E040 +2080 +2110 +2208 +27FC +2004 +ENDCHAR +STARTCHAR U+6D4E +ENCODING 27982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4044 +37FE +1110 +80A0 +6040 +21B0 +0E0E +1114 +2110 +E110 +2110 +2110 +2210 +2410 +2010 +ENDCHAR +STARTCHAR U+6D4F +ENCODING 27983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +4104 +3114 +1FF4 +8054 +4454 +4294 +1294 +1114 +2114 +E294 +2294 +2444 +2844 +2014 +2008 +ENDCHAR +STARTCHAR U+6D51 +ENCODING 27985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +27FE +2484 +0888 +8100 +67FC +2140 +0A40 +1448 +27FC +E040 +2044 +2FFE +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+6D52 +ENCODING 27986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4840 +2448 +24FC +80A0 +5120 +5C20 +1424 +25FE +2420 +E420 +2520 +2620 +2420 +2020 +2020 +ENDCHAR +STARTCHAR U+6D53 +ENCODING 27987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3040 +17FC +0444 +8848 +6080 +2084 +094C +1350 +2520 +E920 +2110 +210E +2144 +2180 +2100 +ENDCHAR +STARTCHAR U+6D54 +ENCODING 27988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3008 +1008 +83F8 +4808 +4808 +13F8 +1014 +2FFE +E210 +2110 +2110 +2010 +2050 +2020 +ENDCHAR +STARTCHAR U+6D57 +ENCODING 27991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +6026 +3022 +17FF +0020 +C222 +6326 +212C +0020 +1030 +10B8 +31AC +2326 +6623 +4020 +C0E0 +ENDCHAR +STARTCHAR U+6D58 +ENCODING 27992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3202 +1202 +03FE +4204 +33F8 +1220 +03FC +0A20 +13FE +6220 +2221 +2421 +283F +0000 +0000 +ENDCHAR +STARTCHAR U+6D59 +ENCODING 27993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1208 +0A10 +0A60 +4FC0 +2240 +227C +0250 +0AD0 +0B50 +1E50 +1250 +2290 +2290 +2710 +0000 +ENDCHAR +STARTCHAR U+6D5A +ENCODING 27994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0850 +0898 +47E4 +2120 +2124 +029C +0CF0 +0910 +1320 +14A0 +2040 +21B0 +2E0C +0000 +ENDCHAR +STARTCHAR U+6D5C +ENCODING 27996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1030 +0BC0 +0A00 +4200 +23F8 +2220 +0220 +1220 +1FFC +2000 +2220 +4210 +4408 +4808 +0000 +ENDCHAR +STARTCHAR U+6D5E +ENCODING 27998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +3208 +1208 +8208 +4BF8 +4840 +1040 +1248 +227C +E240 +2240 +2340 +22C0 +2430 +280E +ENDCHAR +STARTCHAR U+6D5F +ENCODING 27999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +6090 +3190 +111F +0332 +C2A2 +66E6 +2A94 +0294 +129C +1288 +329C +2294 +6296 +4232 +C263 +ENDCHAR +STARTCHAR U+6D60 +ENCODING 28000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +41B0 +3040 +11B0 +8248 +4080 +4FFE +1140 +1248 +27FC +EA48 +2248 +2248 +2258 +2040 +0040 +ENDCHAR +STARTCHAR U+6D61 +ENCODING 28001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1020 +0020 +C3FE +6202 +2202 +01FC +1008 +1010 +37FF +2020 +6020 +4020 +C0E0 +ENDCHAR +STARTCHAR U+6D62 +ENCODING 28002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4002 +B7FF +1000 +03FE +4202 +3202 +1202 +03FE +0A02 +1000 +6202 +2104 +2088 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+6D63 +ENCODING 28003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4208 +27F8 +2000 +0000 +0FFC +08A0 +10A0 +1120 +2124 +2224 +241C +0000 +ENDCHAR +STARTCHAR U+6D64 +ENCODING 28004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4208 +2480 +2080 +07FC +0880 +0920 +1120 +1250 +2448 +28FC +2384 +0000 +ENDCHAR +STARTCHAR U+6D65 +ENCODING 28005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +61FC +3104 +1104 +01FC +C000 +63FE +2222 +0222 +1222 +13FE +3200 +2200 +6201 +4303 +C1FE +ENDCHAR +STARTCHAR U+6D66 +ENCODING 28006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +0848 +0FFC +4040 +23F8 +2248 +0248 +0BF8 +0A48 +0A48 +13F8 +1248 +2248 +2258 +0000 +ENDCHAR +STARTCHAR U+6D67 +ENCODING 28007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FC +3204 +1204 +0204 +C3FC +6000 +201C +03F0 +1040 +1040 +37FE +2040 +6040 +4FFF +C000 +ENDCHAR +STARTCHAR U+6D68 +ENCODING 28008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1810 +09FF +4101 +3111 +1010 +01FF +0410 +1858 +7094 +1112 +1211 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6D69 +ENCODING 28009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0940 +0940 +43F8 +2240 +2440 +0FFC +0000 +13F8 +1208 +2208 +2208 +43F8 +4208 +0000 +ENDCHAR +STARTCHAR U+6D6A +ENCODING 28010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +0BF0 +4210 +2210 +23F0 +0210 +13F0 +1288 +2248 +2250 +4220 +4390 +4C0C +0000 +ENDCHAR +STARTCHAR U+6D6C +ENCODING 28012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A48 +4248 +23F8 +2248 +0248 +0BF8 +0840 +0BF8 +1040 +1040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6D6D +ENCODING 28013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3020 +13FE +0222 +43FE +3222 +13FE +0222 +08A0 +1060 +7060 +1090 +1108 +1607 +0000 +0000 +ENDCHAR +STARTCHAR U+6D6E +ENCODING 28014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0870 +0F88 +4448 +2250 +2200 +03F8 +1030 +1040 +17FC +2040 +2040 +4040 +40C0 +0000 +ENDCHAR +STARTCHAR U+6D6F +ENCODING 28015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3080 +1090 +87F8 +4910 +4910 +1114 +1FFE +2000 +E3F8 +2208 +2208 +2208 +23F8 +2208 +ENDCHAR +STARTCHAR U+6D70 +ENCODING 28016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0042 +61D2 +3712 +1112 +0112 +CFD2 +6112 +2112 +0392 +1352 +1552 +3512 +2902 +6102 +4102 +C10E +ENDCHAR +STARTCHAR U+6D74 +ENCODING 28020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0910 +0A08 +4248 +2440 +20A0 +0120 +1210 +17F8 +1A14 +2210 +2210 +43F0 +4210 +0000 +ENDCHAR +STARTCHAR U+6D75 +ENCODING 28021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +33F1 +1222 +02A4 +42A8 +3221 +17F2 +0224 +0A28 +1221 +6222 +2224 +22A8 +2440 +0000 +0000 +ENDCHAR +STARTCHAR U+6D76 +ENCODING 28022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1401 +0020 +4120 +31FC +1120 +0220 +0820 +13FE +7020 +1020 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+6D77 +ENCODING 28023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0BFC +4200 +25F0 +2150 +0150 +1FFC +1250 +1250 +27FC +2410 +4010 +4060 +0000 +ENDCHAR +STARTCHAR U+6D78 +ENCODING 28024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0810 +43F0 +2010 +23F0 +0000 +17FC +1408 +1BF0 +2120 +20C0 +41E0 +4E1C +0000 +ENDCHAR +STARTCHAR U+6D79 +ENCODING 28025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +47FC +2150 +2150 +0158 +0AE4 +0C44 +10A0 +10A0 +2110 +2208 +2404 +0000 +ENDCHAR +STARTCHAR U+6D7A +ENCODING 28026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4108 +3108 +117F +05C9 +4549 +3549 +1149 +057F +0949 +1108 +7108 +1108 +1108 +1108 +0000 +0000 +ENDCHAR +STARTCHAR U+6D7B +ENCODING 28027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3451 +1451 +0491 +451F +3401 +14F9 +0489 +1489 +64F9 +2489 +2401 +2405 +2402 +0000 +0000 +ENDCHAR +STARTCHAR U+6D7C +ENCODING 28028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +31F8 +1210 +8424 +47FE +4C44 +1444 +1444 +27FC +E4A4 +20A0 +2120 +2122 +2222 +2C1E +ENDCHAR +STARTCHAR U+6D7D +ENCODING 28029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4001 +37FE +1124 +0222 +4080 +3088 +17FF +0088 +0888 +7050 +1020 +1050 +1088 +1707 +0000 +0000 +ENDCHAR +STARTCHAR U+6D7E +ENCODING 28030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3020 +13FE +0020 +4020 +37FF +1088 +0088 +0A8A +128A +6489 +2088 +20A8 +2110 +0000 +0000 +ENDCHAR +STARTCHAR U+6D7F +ENCODING 28031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +13FE +0202 +0202 +4202 +23FE +0202 +0202 +13FE +1202 +1202 +2202 +23FE +2104 +4202 +4401 +ENDCHAR +STARTCHAR U+6D80 +ENCODING 28032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FC +1904 +0904 +01FC +4104 +31FC +1104 +0504 +09FC +7050 +1050 +1091 +1111 +121F +0000 +0000 +ENDCHAR +STARTCHAR U+6D82 +ENCODING 28034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +3140 +1220 +8410 +482E +57F4 +0080 +1088 +2FFC +E080 +22A0 +2498 +2888 +2280 +2100 +ENDCHAR +STARTCHAR U+6D83 +ENCODING 28035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3421 +1421 +07FF +4421 +3421 +1471 +04A9 +1525 +6623 +2421 +2401 +27FF +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+6D84 +ENCODING 28036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +33FE +1222 +03FE +4222 +33FE +1000 +07FF +0880 +1100 +71FE +1002 +1004 +1038 +0000 +0000 +ENDCHAR +STARTCHAR U+6D85 +ENCODING 28037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +43F8 +2208 +23F8 +0248 +0840 +0BF8 +1040 +1040 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6D86 +ENCODING 28038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4002 +301F +13C4 +0244 +4244 +3244 +13DF +0244 +0A44 +1244 +73C4 +1244 +1004 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+6D87 +ENCODING 28039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FE +0000 +0124 +4124 +2248 +0248 +0124 +1124 +1000 +13FE +2020 +2020 +2020 +4FFF +4000 +ENDCHAR +STARTCHAR U+6D88 +ENCODING 28040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0C48 +0A48 +4150 +2160 +23F8 +0208 +13F8 +1208 +13F8 +2208 +2208 +4208 +4218 +0000 +ENDCHAR +STARTCHAR U+6D89 +ENCODING 28041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4048 +327C +1240 +8240 +6244 +2FFE +0840 +1044 +2244 +E248 +2450 +2020 +20C0 +2300 +2C00 +ENDCHAR +STARTCHAR U+6D8A +ENCODING 28042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +8FFC +6084 +2484 +0284 +8104 +6208 +2C70 +0000 +1084 +2A42 +CA20 +4204 +4204 +43FC +0000 +0000 +ENDCHAR +STARTCHAR U+6D8B +ENCODING 28043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3020 +17FF +0401 +4421 +3024 +1022 +07FF +1020 +2050 +6088 +2104 +2202 +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+6D8C +ENCODING 28044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +08B0 +4040 +23F8 +2248 +0248 +0BF8 +0A48 +0A48 +13F8 +1248 +2248 +2258 +0000 +ENDCHAR +STARTCHAR U+6D8D +ENCODING 28045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1042 +03FC +0044 +4048 +2FFE +0020 +0040 +13FC +1110 +1620 +2FFF +2020 +2020 +4020 +4060 +ENDCHAR +STARTCHAR U+6D8E +ENCODING 28046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1004 +0F08 +0970 +4110 +2210 +2250 +075C +0950 +0D50 +1550 +1250 +233C +2480 +287C +0000 +ENDCHAR +STARTCHAR U+6D90 +ENCODING 28048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +404A +3389 +1088 +0088 +47FF +3088 +10C9 +0489 +098A +728C +1499 +10A9 +1505 +1203 +0000 +0000 +ENDCHAR +STARTCHAR U+6D91 +ENCODING 28049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4044 +37FE +1040 +8048 +4BFC +4A48 +1248 +1248 +23F8 +E0E0 +2150 +224E +2C44 +2040 +2040 +ENDCHAR +STARTCHAR U+6D92 +ENCODING 28050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FC +3044 +1044 +07FF +C044 +6044 +23FC +0080 +1100 +11FE +3302 +2502 +6102 +4102 +C1FE +ENDCHAR +STARTCHAR U+6D93 +ENCODING 28051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +4208 +23F8 +2000 +03F8 +0A08 +0BF8 +1208 +13F8 +2208 +2208 +2218 +0000 +ENDCHAR +STARTCHAR U+6D94 +ENCODING 28052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3444 +1444 +87FC +4044 +48A0 +1110 +124E +2404 +EBF8 +2008 +2010 +2020 +2040 +2080 +ENDCHAR +STARTCHAR U+6D95 +ENCODING 28053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0910 +0920 +47F8 +2048 +23F8 +0240 +0BFC +0AC4 +10C4 +1144 +2258 +2C40 +2040 +0000 +ENDCHAR +STARTCHAR U+6D96 +ENCODING 28054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +6110 +3310 +12FE +0200 +C644 +6A44 +2244 +026C +1228 +1228 +3228 +2228 +6208 +42FF +C200 +ENDCHAR +STARTCHAR U+6D97 +ENCODING 28055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0202 +6306 +3104 +13FE +0202 +C202 +6202 +2202 +03FE +1090 +1090 +3090 +2190 +6111 +4319 +C60F +ENDCHAR +STARTCHAR U+6D98 +ENCODING 28056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +6084 +3184 +113E +07E3 +C100 +6100 +23FE +0620 +1020 +17FF +3050 +20D8 +618C +4306 +C603 +ENDCHAR +STARTCHAR U+6D99 +ENCODING 28057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +0800 +43F8 +2208 +23F8 +0248 +1240 +13FC +2440 +2460 +4890 +5308 +4C04 +0000 +ENDCHAR +STARTCHAR U+6D9B +ENCODING 28059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4040 +23F8 +2040 +07FC +0890 +0FFC +1110 +1290 +2490 +2810 +2030 +0000 +ENDCHAR +STARTCHAR U+6D9C +ENCODING 28060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +1040 +17FC +4040 +23F8 +2000 +03FC +1208 +14A0 +10A0 +20A0 +2124 +4224 +4C1C +0000 +ENDCHAR +STARTCHAR U+6D9D +ENCODING 28061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4110 +3110 +17FC +8110 +6000 +2FFE +0802 +1084 +1088 +27FC +E088 +2108 +2108 +2208 +2450 +2820 +ENDCHAR +STARTCHAR U+6D9E +ENCODING 28062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3048 +17FC +8040 +4248 +4950 +1044 +17FE +20D0 +E150 +2248 +244E +2844 +2040 +2040 +ENDCHAR +STARTCHAR U+6D9F +ENCODING 28063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +8828 +65FC +2440 +00A0 +8128 +6DFC +2420 +0C20 +1424 +E7FE +2420 +2420 +2A26 +31FC +2000 +ENDCHAR +STARTCHAR U+6DA0 +ENCODING 28064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +3444 +1454 +87FC +4C44 +4DF4 +1444 +17F4 +2454 +E454 +2474 +2444 +2444 +27FC +2404 +ENDCHAR +STARTCHAR U+6DA1 +ENCODING 28065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +3208 +1208 +8208 +63F8 +2044 +0FFE +1444 +2444 +E444 +24A4 +2514 +2404 +2414 +2408 +ENDCHAR +STARTCHAR U+6DA3 +ENCODING 28067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +3080 +11F0 +0220 +8448 +63FC +2248 +0A48 +1248 +1248 +EFFE +2040 +20A0 +2110 +220E +2C04 +ENDCHAR +STARTCHAR U+6DA4 +ENCODING 28068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +31F8 +1310 +84A0 +6040 +20A0 +0910 +124E +2440 +EBFC +2150 +224C +2444 +2140 +2080 +ENDCHAR +STARTCHAR U+6DA6 +ENCODING 28070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +437E +3104 +1424 +85F4 +4444 +4444 +1444 +15F4 +2444 +E444 +2444 +25F4 +2404 +2414 +2408 +ENDCHAR +STARTCHAR U+6DA7 +ENCODING 28071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +41BE +3484 +1404 +8404 +65F4 +2514 +0D14 +15F4 +2514 +E514 +25F4 +2514 +2404 +2414 +2408 +ENDCHAR +STARTCHAR U+6DA8 +ENCODING 28072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +2F40 +2144 +0144 +8148 +4F50 +4844 +08FE +1850 +2F50 +E150 +2148 +2148 +2144 +2A62 +2440 +ENDCHAR +STARTCHAR U+6DA9 +ENCODING 28073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +0844 +8144 +6244 +2084 +0914 +1208 +2440 +E248 +227C +2240 +2240 +2244 +2FFE +2000 +ENDCHAR +STARTCHAR U+6DAA +ENCODING 28074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +3048 +17FC +0000 +8110 +60A0 +2004 +0FFE +1008 +23FC +E208 +2208 +2208 +2208 +23F8 +2208 +ENDCHAR +STARTCHAR U+6DAB +ENCODING 28075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +37FE +1402 +8804 +43F8 +4A08 +1208 +13F8 +2200 +E3F8 +2208 +2208 +2208 +23F8 +2208 +ENDCHAR +STARTCHAR U+6DAC +ENCODING 28076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +33FE +1020 +0020 +C7FF +6104 +218C +0088 +17FF +1020 +3020 +23FE +6020 +4020 +C020 +ENDCHAR +STARTCHAR U+6DAE +ENCODING 28078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +47E4 +3444 +1454 +87D4 +4514 +4D54 +17F4 +1554 +2D54 +ED54 +3554 +2544 +25C4 +2114 +2108 +ENDCHAR +STARTCHAR U+6DAF +ENCODING 28079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BFC +0A20 +4220 +22F8 +2220 +03FC +0220 +1220 +12F8 +2420 +2420 +4BFC +4000 +0000 +ENDCHAR +STARTCHAR U+6DB2 +ENCODING 28082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4140 +2178 +2248 +02A8 +1698 +1B50 +1250 +2220 +2250 +4288 +4304 +0000 +ENDCHAR +STARTCHAR U+6DB3 +ENCODING 28083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3020 +17FF +0451 +4489 +3104 +1202 +0008 +09FC +7020 +1020 +1020 +1022 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+6DB4 +ENCODING 28084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +33FE +1202 +0202 +C100 +61DE +2152 +0352 +1252 +17D2 +3096 +2190 +6111 +4313 +C60E +ENDCHAR +STARTCHAR U+6DB5 +ENCODING 28085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1FFC +1100 +4100 +29A8 +2EA8 +0AC8 +1AC8 +19A8 +2EA8 +2898 +4988 +4FF8 +4808 +0000 +ENDCHAR +STARTCHAR U+6DB7 +ENCODING 28087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1020 +03FE +C222 +63FE +2222 +0222 +13FE +10A8 +30A8 +21AC +6326 +4623 +C020 +ENDCHAR +STARTCHAR U+6DB8 +ENCODING 28088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A48 +4248 +23F8 +2248 +0248 +0AE8 +0AA8 +12A8 +12E8 +2208 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6DB9 +ENCODING 28089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +6038 +33E0 +1020 +07FF +C0A8 +61AC +2727 +0040 +1040 +17FF +3084 +2108 +63F0 +405C +C786 +ENDCHAR +STARTCHAR U+6DBA +ENCODING 28090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3202 +1202 +03FE +4210 +3210 +13FF +0210 +0A10 +12FE +7282 +1282 +14FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+6DBB +ENCODING 28091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3050 +1088 +0104 +42FA +3421 +1020 +03FE +0820 +11FC +7104 +1104 +11FC +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+6DBC +ENCODING 28092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4000 +23F8 +2208 +0208 +13F8 +1040 +1250 +2248 +2444 +4844 +40C0 +0000 +ENDCHAR +STARTCHAR U+6DBD +ENCODING 28093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +67F8 +3420 +1420 +07FF +C410 +6418 +270D +0C07 +13FC +1204 +3204 +23FC +6204 +4204 +C3FC +ENDCHAR +STARTCHAR U+6DBE +ENCODING 28094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3022 +13F4 +0068 +40A4 +3122 +1621 +0020 +0BFE +1202 +73FE +1202 +13FE +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+6DBF +ENCODING 28095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +4FFE +3080 +1100 +8688 +40D0 +5560 +1260 +16D0 +2950 +E248 +244E +2844 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U+6DC0 +ENCODING 28096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4208 +2400 +27FC +0040 +1240 +1278 +2240 +2240 +4340 +44C0 +483C +0000 +ENDCHAR +STARTCHAR U+6DC2 +ENCODING 28098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3202 +13FE +0202 +43FE +3000 +13FE +0008 +0FFF +1108 +7088 +1008 +1028 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6DC3 +ENCODING 28099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +40A8 +2124 +03FE +0421 +4050 +27FF +0108 +1204 +15FB +1108 +2108 +2138 +2102 +2102 +41FE +4000 +ENDCHAR +STARTCHAR U+6DC4 +ENCODING 28100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0248 +4248 +2490 +2920 +8490 +6248 +2248 +0804 +17FE +2444 +E444 +27FC +2444 +2444 +27FC +2404 +ENDCHAR +STARTCHAR U+6DC5 +ENCODING 28101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2208 +1210 +1260 +4FC0 +2240 +237C +06D0 +16D0 +1650 +2A50 +2A90 +5290 +4310 +4210 +0000 +ENDCHAR +STARTCHAR U+6DC6 +ENCODING 28102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +09E0 +08D0 +4348 +27FC +2080 +01F8 +0908 +0BF8 +1508 +19F8 +2108 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+6DC7 +ENCODING 28103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0910 +0910 +47FC +2110 +21F0 +0110 +09F0 +0910 +17FC +1000 +2090 +2108 +2608 +0000 +ENDCHAR +STARTCHAR U+6DC8 +ENCODING 28104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FE +3202 +1202 +03FE +C200 +6210 +2292 +0292 +12FE +1210 +3210 +2292 +6692 +4492 +CCFE +ENDCHAR +STARTCHAR U+6DC9 +ENCODING 28105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3222 +13FE +0222 +43FE +3222 +1020 +07FF +0870 +10A8 +7124 +1222 +1421 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+6DCA +ENCODING 28106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +6080 +30FE +1182 +0106 +C304 +661C +2000 +00C0 +139E +1202 +3202 +23DE +6202 +4202 +C3FE +ENDCHAR +STARTCHAR U+6DCB +ENCODING 28107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1220 +1220 +4FFC +2220 +2330 +06F0 +16E8 +1AA8 +1B24 +2220 +2220 +4220 +4220 +0000 +ENDCHAR +STARTCHAR U+6DCC +ENCODING 28108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0950 +0948 +4244 +2444 +23F8 +0208 +0AE8 +0AA8 +12A8 +12A8 +22E8 +2208 +2218 +0000 +ENDCHAR +STARTCHAR U+6DCD +ENCODING 28109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3222 +1222 +02FA +4222 +33FE +1202 +02FA +0A8A +128A +72FA +1202 +120A +1404 +0000 +0000 +ENDCHAR +STARTCHAR U+6DCE +ENCODING 28110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1020 +03FE +C050 +67FF +2088 +0124 +1623 +11FC +3020 +27FF +6020 +4020 +C020 +ENDCHAR +STARTCHAR U+6DCF +ENCODING 28111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +13FE +0202 +03FE +4202 +23FE +0202 +0000 +13FE +1020 +1020 +2FFF +2050 +2088 +4104 +4603 +ENDCHAR +STARTCHAR U+6DD0 +ENCODING 28112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3202 +13FE +0202 +43FE +3202 +1000 +07FF +1401 +67FF +2401 +2401 +27FF +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+6DD1 +ENCODING 28113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +0A00 +0BF8 +4248 +2248 +2FC8 +0228 +1330 +16B0 +1690 +2A30 +2A48 +4288 +4704 +0000 +ENDCHAR +STARTCHAR U+6DD2 +ENCODING 28114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0FFC +0840 +43F8 +2048 +27FC +0048 +0BF8 +0840 +17FC +1090 +21E0 +2070 +2788 +0000 +ENDCHAR +STARTCHAR U+6DD3 +ENCODING 28115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +37FF +1088 +0020 +4022 +37FF +1040 +047E +0842 +1082 +7102 +1204 +1028 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6DD4 +ENCODING 28116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1020 +0040 +41FC +3104 +11FC +0504 +09FC +1104 +71FC +1104 +17FF +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+6DD5 +ENCODING 28117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BF8 +4040 +27FC +2120 +0124 +0A5C +0C40 +13F8 +1040 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6DD6 +ENCODING 28118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +30FC +1080 +0088 +87FC +6408 +27F8 +0C08 +17F8 +2080 +E084 +3FFE +2080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U+6DD7 +ENCODING 28119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +31FF +1201 +0041 +4249 +3151 +1041 +03F9 +0841 +1151 +7249 +1041 +104A +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+6DD8 +ENCODING 28120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0900 +43F8 +2308 +25E8 +0A88 +17F8 +1088 +12A8 +22A8 +23E8 +4228 +4030 +0000 +ENDCHAR +STARTCHAR U+6DD9 +ENCODING 28121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4208 +25F0 +2000 +0000 +0FFC +0840 +1150 +1148 +2244 +2444 +20C0 +0000 +ENDCHAR +STARTCHAR U+6DDA +ENCODING 28122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FF +0000 +03FE +4202 +2202 +03FE +1210 +1210 +13FF +2210 +2228 +2228 +2444 +4482 +4901 +ENDCHAR +STARTCHAR U+6DDB +ENCODING 28123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0101 +6509 +3509 +17E9 +0909 +C109 +6FE9 +2109 +0109 +0FE9 +2929 +2929 +6921 +4921 +4961 +C107 +ENDCHAR +STARTCHAR U+6DDC +ENCODING 28124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47DF +3451 +1451 +07DF +4451 +3451 +17DF +0451 +1451 +6451 +2451 +2451 +2555 +28A2 +0000 +0000 +ENDCHAR +STARTCHAR U+6DDD +ENCODING 28125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +4F7E +2954 +2954 +8954 +4F54 +5954 +1954 +297C +2F44 +E940 +2940 +2942 +2942 +2B3E +1000 +ENDCHAR +STARTCHAR U+6DDE +ENCODING 28126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2270 +1210 +1250 +4FD0 +2248 +2348 +06A4 +16A0 +1620 +2A30 +2A48 +4258 +43E4 +4204 +0000 +ENDCHAR +STARTCHAR U+6DDF +ENCODING 28127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +6090 +3090 +17FE +0492 +C492 +6492 +27FE +0492 +1492 +1492 +3FFF +2000 +6108 +430C +C606 +ENDCHAR +STARTCHAR U+6DE0 +ENCODING 28128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +3444 +1444 +87FC +5444 +5444 +17FC +1000 +2FFE +E110 +2110 +2110 +2210 +2410 +2810 +ENDCHAR +STARTCHAR U+6DE1 +ENCODING 28129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0848 +0A48 +42D0 +24A0 +2118 +0644 +1048 +1248 +12D0 +24A0 +2120 +4210 +4C0C +0000 +ENDCHAR +STARTCHAR U+6DE2 +ENCODING 28130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +6024 +3024 +17FF +0020 +C020 +67A2 +24B2 +0496 +1494 +179C +3008 +2399 +6E2D +40C7 +C302 +ENDCHAR +STARTCHAR U+6DE3 +ENCODING 28131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +310E +1202 +0202 +43DE +3202 +1202 +03FE +0890 +1090 +7111 +1211 +1411 +181F +0000 +0000 +ENDCHAR +STARTCHAR U+6DE4 +ENCODING 28132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +0A20 +0A20 +4250 +2FD0 +2288 +0224 +0B90 +0A90 +12C0 +14A0 +2490 +2888 +3308 +0000 +ENDCHAR +STARTCHAR U+6DE5 +ENCODING 28133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +60FC +3184 +110C +03F8 +C008 +67FF +2020 +0322 +11A6 +10B4 +3078 +21AC +6326 +4E23 +C0E0 +ENDCHAR +STARTCHAR U+6DE6 +ENCODING 28134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +08A0 +4110 +23F8 +2444 +0040 +0BF8 +0840 +1248 +1148 +2150 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6DE8 +ENCODING 28136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +0BF0 +0A48 +4244 +2404 +23F8 +0048 +0FFC +0848 +13F8 +1048 +2040 +2040 +20C0 +0000 +ENDCHAR +STARTCHAR U+6DE9 +ENCODING 28137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +33FE +1020 +07FF +C088 +6188 +230F +0040 +107C +10C4 +318C +2358 +6070 +40DC +C787 +ENDCHAR +STARTCHAR U+6DEA +ENCODING 28138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +08A0 +4110 +23F8 +2404 +03F8 +0AA8 +0AA8 +13F8 +12A8 +22A8 +22A8 +2218 +0000 +ENDCHAR +STARTCHAR U+6DEB +ENCODING 28139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +100C +0874 +0F84 +4488 +2250 +2238 +03C0 +1040 +1040 +13F8 +2040 +2040 +4FFC +4000 +0000 +ENDCHAR +STARTCHAR U+6DEC +ENCODING 28140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4110 +2110 +2118 +02A4 +0C44 +0840 +17FC +1040 +2040 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6DED +ENCODING 28141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4001 +33FE +1200 +03FE +4202 +33FE +1210 +02FE +0A10 +1238 +7254 +1292 +1511 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+6DEE +ENCODING 28142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0910 +0920 +43FC +2220 +2220 +07F8 +0A20 +0A20 +13F8 +1220 +2220 +23FC +2200 +0000 +ENDCHAR +STARTCHAR U+6DEF +ENCODING 28143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +37FF +1080 +0104 +C3FE +6E03 +2000 +03FC +1204 +13FC +3204 +23FC +6204 +4204 +C21C +ENDCHAR +STARTCHAR U+6DF0 +ENCODING 28144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6070 +30D8 +118C +0707 +C0F8 +6000 +23FE +0004 +100C +1068 +3030 +2296 +6283 +46C5 +C47C +ENDCHAR +STARTCHAR U+6DF1 +ENCODING 28145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BFC +0AA8 +44A0 +20A4 +211C +0240 +1040 +17FC +10E0 +2150 +2248 +4444 +4040 +0000 +ENDCHAR +STARTCHAR U+6DF2 +ENCODING 28146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +301E +1010 +03FF +4221 +32FD +1220 +0220 +0A3E +1248 +7248 +1248 +1489 +110F +0000 +0000 +ENDCHAR +STARTCHAR U+6DF3 +ENCODING 28147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0FFC +0800 +41F0 +2110 +21F0 +0000 +13F8 +1010 +1060 +27FC +2040 +4040 +40C0 +0000 +ENDCHAR +STARTCHAR U+6DF4 +ENCODING 28148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +6100 +33FE +1252 +0C92 +C122 +6246 +2084 +011C +1000 +1060 +3130 +2506 +650B +4D19 +C8F0 +ENDCHAR +STARTCHAR U+6DF5 +ENCODING 28149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +12A8 +0AA8 +0AA8 +42A8 +23B8 +2208 +03F8 +1208 +13B8 +12A8 +22A8 +24A8 +44A8 +4808 +0000 +ENDCHAR +STARTCHAR U+6DF6 +ENCODING 28150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1020 +0124 +C124 +6124 +23AE +02AA +1673 +1070 +30A8 +21AC +6326 +4623 +C020 +ENDCHAR +STARTCHAR U+6DF7 +ENCODING 28151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0A10 +4210 +23F0 +2210 +03F0 +1240 +1248 +13F0 +2240 +2244 +43C4 +4C3C +0000 +ENDCHAR +STARTCHAR U+6DF8 +ENCODING 28152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +07FF +0020 +43FE +2020 +07FF +0000 +13FE +1222 +1222 +23FE +2202 +2202 +4202 +4206 +ENDCHAR +STARTCHAR U+6DF9 +ENCODING 28153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +0FFC +4110 +2150 +2248 +07FC +0A48 +0BF8 +1248 +13F8 +2244 +2044 +203C +0000 +ENDCHAR +STARTCHAR U+6DFA +ENCODING 28154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +0888 +08FC +4790 +2050 +2064 +039C +08A4 +08FC +1790 +1050 +2024 +20DC +2704 +0000 +ENDCHAR +STARTCHAR U+6DFB +ENCODING 28155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1038 +0BC0 +0840 +47FC +20A0 +2110 +0288 +1484 +12D0 +12A8 +24A4 +28A4 +4080 +4180 +0000 +ENDCHAR +STARTCHAR U+6DFC +ENCODING 28156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +0110 +7DA0 +05C0 +0940 +1130 +250E +4204 +0820 +0924 +FAE8 +1C70 +2CA8 +CB26 +28A4 +1040 +ENDCHAR +STARTCHAR U+6DFD +ENCODING 28157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +3104 +17FF +0104 +4104 +3020 +1020 +0520 +093E +1120 +7120 +1120 +1120 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+6E00 +ENCODING 28160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +6040 +37FE +1090 +030C +CE47 +6040 +23F8 +0040 +1148 +1108 +37FE +2108 +6308 +4208 +C608 +ENDCHAR +STARTCHAR U+6E03 +ENCODING 28163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +1884 +0BFF +4084 +3094 +1020 +03FF +0840 +1080 +71FE +1282 +1082 +10FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+6E04 +ENCODING 28164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +6048 +3048 +13CF +0048 +C048 +6048 +23CF +0048 +1048 +11C8 +374F +2048 +60C8 +4188 +C308 +ENDCHAR +STARTCHAR U+6E05 +ENCODING 28165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0FF8 +0880 +47F0 +2080 +2FFC +0000 +03F0 +1210 +13F0 +2210 +23F0 +4210 +4230 +0000 +ENDCHAR +STARTCHAR U+6E07 +ENCODING 28167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0A10 +43F0 +2210 +23F0 +0100 +13F8 +1648 +1B88 +2208 +2228 +41E8 +4030 +0000 +ENDCHAR +STARTCHAR U+6E08 +ENCODING 28168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4110 +20A0 +20E0 +071C +0910 +09F0 +0910 +11F0 +1210 +2210 +2410 +0000 +ENDCHAR +STARTCHAR U+6E09 +ENCODING 28169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0A78 +4240 +2240 +2FFC +0050 +1248 +1254 +14D4 +2820 +2040 +4180 +4E00 +0000 +ENDCHAR +STARTCHAR U+6E0A +ENCODING 28170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1208 +0A48 +0B58 +42D8 +22E8 +2248 +03F8 +0A48 +0AE8 +12D8 +1358 +2648 +2448 +2808 +0000 +ENDCHAR +STARTCHAR U+6E0B +ENCODING 28171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0A40 +4278 +2240 +2240 +0FFC +1000 +1608 +1130 +2000 +20A0 +4318 +4C04 +0000 +ENDCHAR +STARTCHAR U+6E0C +ENCODING 28172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +3008 +1008 +83F8 +4808 +4808 +17FE +1040 +2444 +E2E8 +2150 +2248 +2C4E +2144 +2080 +ENDCHAR +STARTCHAR U+6E0D +ENCODING 28173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +47FC +3040 +13F8 +8040 +6FFE +2008 +0BFC +1208 +2248 +E248 +2248 +2248 +20B0 +230C +2C04 +ENDCHAR +STARTCHAR U+6E0E +ENCODING 28174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4048 +37FC +1040 +8040 +4FFE +4122 +10A4 +1260 +2120 +E0A4 +2FFE +2040 +2050 +218C +2604 +ENDCHAR +STARTCHAR U+6E10 +ENCODING 28176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +420C +2230 +2FE0 +0420 +8524 +693E +2FE8 +1128 +2128 +E1E8 +3F28 +2928 +2148 +2188 +2108 +ENDCHAR +STARTCHAR U+6E11 +ENCODING 28177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +3208 +1208 +83F8 +4840 +4FFC +1444 +1444 +27FC +E444 +2444 +27FC +2040 +2042 +203E +ENDCHAR +STARTCHAR U+6E13 +ENCODING 28179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0870 +0B88 +4248 +2150 +2120 +0040 +13F8 +1040 +17FC +20C0 +20A0 +4110 +460C +0000 +ENDCHAR +STARTCHAR U+6E14 +ENCODING 28180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +31F8 +1210 +8424 +6FFE +2444 +0C44 +17FC +2444 +E444 +27FC +2404 +2000 +2FFE +2000 +ENDCHAR +STARTCHAR U+6E15 +ENCODING 28181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +0C88 +0AA8 +4328 +27E8 +2128 +0128 +0FE8 +0928 +11A8 +1268 +2448 +2808 +2018 +0000 +ENDCHAR +STARTCHAR U+6E16 +ENCODING 28182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +37FE +1442 +8840 +47FC +4444 +1444 +17FC +2444 +E444 +27FC +2444 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+6E17 +ENCODING 28183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +3120 +1210 +07F8 +8080 +6FFC +2120 +0A50 +148E +2924 +E240 +2090 +2320 +2040 +2180 +2600 +ENDCHAR +STARTCHAR U+6E19 +ENCODING 28185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +11F0 +1220 +4FF8 +2548 +2558 +0558 +1638 +1488 +2FFC +2080 +4140 +4630 +580C +0000 +ENDCHAR +STARTCHAR U+6E1A +ENCODING 28186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4048 +2050 +27FC +0040 +1080 +13F8 +1D08 +21F8 +2108 +41F8 +4108 +0000 +ENDCHAR +STARTCHAR U+6E1B +ENCODING 28187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +0828 +0824 +47FC +2420 +27E8 +0428 +17A8 +16B0 +1690 +27B4 +2A4C +488C +5104 +0000 +ENDCHAR +STARTCHAR U+6E1C +ENCODING 28188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FE +3020 +1040 +07FE +4492 +3492 +1492 +0424 +1020 +67FF +2020 +2050 +2088 +2707 +0000 +0000 +ENDCHAR +STARTCHAR U+6E1D +ENCODING 28189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11C0 +0840 +08A0 +4110 +23F8 +2C04 +07A8 +0CA8 +0EA8 +15D0 +16D0 +25A8 +24A8 +25A8 +0000 +ENDCHAR +STARTCHAR U+6E1E +ENCODING 28190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +618C +3088 +17FF +0020 +C040 +63FE +2202 +0202 +13FE +1202 +3202 +23FE +6202 +4202 +C3FE +ENDCHAR +STARTCHAR U+6E1F +ENCODING 28191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0FFC +0800 +41F0 +2110 +21F0 +0000 +0BFC +0A08 +17F8 +1040 +2040 +2040 +20C0 +0000 +ENDCHAR +STARTCHAR U+6E20 +ENCODING 28192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +4A00 +23F0 +2210 +0BF0 +0A00 +13F8 +2100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+6E21 +ENCODING 28193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4490 +27FC +2490 +04F0 +1400 +17F8 +1510 +24A0 +2840 +49B0 +560C +0000 +ENDCHAR +STARTCHAR U+6E22 +ENCODING 28194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FC +3404 +1434 +05E4 +C444 +65F4 +2554 +0554 +15F4 +1444 +3444 +2454 +6475 +45D5 +C803 +ENDCHAR +STARTCHAR U+6E23 +ENCODING 28195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +40E0 +2150 +264C +01F0 +0910 +09F0 +1110 +11F0 +2000 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6E24 +ENCODING 28196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1220 +1FE0 +4220 +2FF8 +28A8 +1728 +1128 +1228 +23A8 +2E48 +4248 +4288 +4730 +0000 +ENDCHAR +STARTCHAR U+6E25 +ENCODING 28197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +43F8 +2200 +23FC +0250 +0298 +13E4 +1240 +25F8 +2440 +4FFC +4000 +0000 +ENDCHAR +STARTCHAR U+6E26 +ENCODING 28198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0A10 +42F0 +2290 +2290 +07F8 +1408 +15E8 +1528 +25E8 +2528 +4408 +4418 +0000 +ENDCHAR +STARTCHAR U+6E27 +ENCODING 28199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1104 +018C +C088 +67FF +2421 +0421 +13FE +1222 +3222 +2222 +6226 +4020 +C020 +ENDCHAR +STARTCHAR U+6E28 +ENCODING 28200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3222 +13FE +0222 +43FE +3000 +17FF +0200 +1220 +6222 +2214 +2248 +2284 +2703 +0000 +0000 +ENDCHAR +STARTCHAR U+6E29 +ENCODING 28201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0A10 +43F0 +2210 +23F0 +0210 +1000 +17F8 +1528 +2528 +2528 +4FFC +4000 +0000 +ENDCHAR +STARTCHAR U+6E2B +ENCODING 28203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1150 +0950 +0FFC +4150 +2170 +2100 +01F8 +0840 +0FFC +10E0 +1150 +2248 +2444 +2040 +0000 +ENDCHAR +STARTCHAR U+6E2C +ENCODING 28204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +1788 +14A8 +44A8 +27A8 +24A8 +07A8 +14A8 +14A8 +17A8 +2308 +2288 +4488 +4818 +0000 +ENDCHAR +STARTCHAR U+6E2D +ENCODING 28205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FF8 +0C88 +47F8 +2488 +27F8 +0408 +0BF0 +0A10 +13F0 +1210 +23F0 +2210 +2230 +0000 +ENDCHAR +STARTCHAR U+6E2E +ENCODING 28206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0910 +0FFC +4110 +2110 +27FC +0008 +0BC8 +0A48 +1248 +13C8 +2248 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+6E2F +ENCODING 28207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0920 +0FF8 +4120 +2FFC +2120 +0210 +17EC +1820 +13E0 +2220 +2208 +4208 +41F8 +0000 +ENDCHAR +STARTCHAR U+6E30 +ENCODING 28208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4070 +3088 +1104 +02FA +4401 +31FC +1104 +09FC +1088 +6088 +27FF +2088 +2108 +2208 +0000 +0000 +ENDCHAR +STARTCHAR U+6E31 +ENCODING 28209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +3100 +111F +07C4 +4544 +3544 +1544 +0544 +17C4 +6104 +2104 +2144 +27DF +2040 +0000 +0000 +ENDCHAR +STARTCHAR U+6E32 +ENCODING 28210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +37FE +1402 +89F4 +4000 +4BF8 +1208 +1208 +23F8 +E208 +2208 +23F8 +2000 +2FFE +2000 +ENDCHAR +STARTCHAR U+6E33 +ENCODING 28211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +37BF +1092 +0092 +479E +3412 +1412 +079E +1092 +6092 +20BF +2082 +2502 +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+6E34 +ENCODING 28212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3408 +17F8 +8408 +67F8 +2204 +03FE +1444 +2444 +E8A4 +3514 +2404 +27E4 +2014 +2008 +ENDCHAR +STARTCHAR U+6E35 +ENCODING 28213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +3088 +17FF +0088 +4088 +3002 +17FF +0222 +0A22 +73FE +1222 +1222 +13FE +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+6E36 +ENCODING 28214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +1088 +07FF +0088 +40A8 +2020 +03FE +0222 +1222 +1222 +1FFF +2050 +2050 +2088 +4104 +4603 +ENDCHAR +STARTCHAR U+6E38 +ENCODING 28216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +0A20 +0A20 +423C +2FC0 +22F8 +0208 +0B90 +0A90 +12FC +1290 +2490 +2490 +2B30 +0000 +ENDCHAR +STARTCHAR U+6E39 +ENCODING 28217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +6200 +33FF +1601 +04F1 +CC01 +63FD +2001 +00F1 +1001 +10F1 +3001 +21F9 +610B +41FA +C006 +ENDCHAR +STARTCHAR U+6E3A +ENCODING 28218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2020 +1F20 +1920 +4970 +2F68 +2968 +09A4 +1F2C +1928 +2970 +2F10 +4920 +40C0 +4300 +0000 +ENDCHAR +STARTCHAR U+6E3B +ENCODING 28219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +60AC +31A6 +1723 +0068 +C018 +61FE +2702 +0102 +11FE +1102 +3102 +21FE +6102 +4102 +C1FE +ENDCHAR +STARTCHAR U+6E3C +ENCODING 28220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +1088 +07FF +0020 +0020 +47FF +2020 +0020 +0BFE +0820 +1020 +17FF +1050 +2088 +2104 +4603 +ENDCHAR +STARTCHAR U+6E3D +ENCODING 28221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2120 +1128 +0FE4 +0120 +4120 +2FFF +0020 +0022 +17A4 +14A4 +14A8 +2490 +27B0 +2049 +4085 +4303 +ENDCHAR +STARTCHAR U+6E3E +ENCODING 28222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BFC +0A48 +47FC +2040 +23F8 +0248 +0BF8 +0A48 +13F8 +1040 +27FC +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6E3F +ENCODING 28223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3020 +13FE +00A8 +4124 +3222 +1000 +05FC +0800 +73FE +1124 +1222 +1421 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+6E40 +ENCODING 28224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43D2 +3054 +1259 +018A +4104 +32FA +1421 +0020 +1020 +63FE +2020 +2050 +2088 +2707 +0000 +0000 +ENDCHAR +STARTCHAR U+6E41 +ENCODING 28225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4208 +3214 +1222 +0FC1 +4200 +323E +1280 +0B00 +123E +6622 +2222 +2222 +2A3E +2422 +0000 +0000 +ENDCHAR +STARTCHAR U+6E43 +ENCODING 28227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +09FC +0F10 +4110 +217C +2790 +0110 +097C +0990 +1710 +117C +2210 +2210 +2410 +0000 +ENDCHAR +STARTCHAR U+6E44 +ENCODING 28228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +3444 +1444 +87FC +4400 +4DFC +1504 +1504 +25FC +E504 +2504 +25FC +2904 +2904 +31FC +ENDCHAR +STARTCHAR U+6E45 +ENCODING 28229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1020 +03FE +C222 +6326 +22AA +0222 +13FE +10A8 +30A8 +21AC +6326 +4623 +C020 +ENDCHAR +STARTCHAR U+6E46 +ENCODING 28230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3010 +11FE +0084 +4048 +33FF +1000 +05FE +0902 +11FE +7102 +1102 +11FE +1102 +0000 +0000 +ENDCHAR +STARTCHAR U+6E47 +ENCODING 28231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +33FE +1088 +0050 +47FF +3000 +11FC +0504 +09FC +1104 +71FC +1104 +1104 +120C +0000 +0000 +ENDCHAR +STARTCHAR U+6E48 +ENCODING 28232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +6104 +37FF +1104 +01FC +C104 +6104 +21FC +0020 +17FF +10A8 +31AC +2124 +6326 +4623 +C020 +ENDCHAR +STARTCHAR U+6E49 +ENCODING 28233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0106 +610C +3138 +1508 +0588 +C548 +6D7F +2908 +0108 +1108 +113E +3122 +2122 +6122 +4122 +C13E +ENDCHAR +STARTCHAR U+6E4A +ENCODING 28234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4040 +23F8 +20A0 +07FC +1110 +13E8 +1444 +23F8 +20A0 +4110 +460C +0000 +ENDCHAR +STARTCHAR U+6E4B +ENCODING 28235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +63FC +3084 +1084 +07FF +C000 +63FC +2204 +03FC +1010 +17FE +3110 +2110 +6FFF +4010 +C010 +ENDCHAR +STARTCHAR U+6E4D +ENCODING 28237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0A48 +0A48 +4248 +23F8 +2000 +07FC +0880 +0BF8 +12A8 +12A8 +22A8 +22A8 +2218 +0000 +ENDCHAR +STARTCHAR U+6E4E +ENCODING 28238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +0880 +4100 +27F8 +2528 +0528 +0DE8 +0D28 +15E8 +1528 +2528 +27F8 +2408 +0000 +ENDCHAR +STARTCHAR U+6E4F +ENCODING 28239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3040 +13FE +0202 +C202 +63FE +2202 +0202 +13FE +1202 +3202 +23FE +6104 +4306 +C603 +ENDCHAR +STARTCHAR U+6E51 +ENCODING 28241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +6FFF +3041 +127A +0240 +C740 +6CFF +2000 +03FC +1204 +13FC +3204 +23FC +6204 +4204 +C21C +ENDCHAR +STARTCHAR U+6E52 +ENCODING 28242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +61FC +3104 +1104 +01FC +C000 +67FF +2104 +01FC +1104 +11FC +3107 +21FC +6704 +4004 +C004 +ENDCHAR +STARTCHAR U+6E53 +ENCODING 28243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4120 +3120 +1210 +87FE +4914 +4110 +1250 +1420 +27F8 +E528 +2528 +2528 +2528 +3FFE +2000 +ENDCHAR +STARTCHAR U+6E54 +ENCODING 28244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +4210 +3124 +1FFE +8000 +4788 +44A8 +14A8 +17A8 +24A8 +E4A8 +27A8 +2488 +2488 +25A8 +2490 +ENDCHAR +STARTCHAR U+6E55 +ENCODING 28245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +3010 +177E +0112 +417F +3212 +147E +0210 +117E +6110 +257E +2210 +2510 +28FF +0000 +0000 +ENDCHAR +STARTCHAR U+6E56 +ENCODING 28246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1278 +1248 +4248 +2FC8 +2278 +0248 +0F48 +1948 +1978 +2F48 +2988 +4088 +4118 +0000 +ENDCHAR +STARTCHAR U+6E57 +ENCODING 28247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +6102 +37C2 +1102 +011F +CFE2 +6002 +2112 +011A +17CA +1102 +3102 +2102 +61C2 +4702 +CC0E +ENDCHAR +STARTCHAR U+6E58 +ENCODING 28248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +1278 +1248 +4FC8 +2248 +2278 +0748 +16C8 +16F8 +1A48 +2A48 +2248 +4278 +4248 +0000 +ENDCHAR +STARTCHAR U+6E5A +ENCODING 28250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4424 +3444 +1494 +05E4 +4454 +34F4 +1404 +05F4 +1514 +65F4 +2514 +25F5 +2515 +2917 +0000 +0000 +ENDCHAR +STARTCHAR U+6E5B +ENCODING 28251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0FFC +0910 +41F0 +2110 +21F0 +0110 +1FFC +14A0 +14A4 +251C +2600 +47FC +4400 +0000 +ENDCHAR +STARTCHAR U+6E5C +ENCODING 28252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +13FE +0202 +03FE +4202 +23FE +0000 +0000 +17FF +1020 +1120 +213E +2220 +2320 +44FF +4800 +ENDCHAR +STARTCHAR U+6E5D +ENCODING 28253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +6213 +33DE +1210 +0210 +C211 +638F +2E20 +0040 +13FE +1202 +3202 +23FE +6202 +4202 +C3FE +ENDCHAR +STARTCHAR U+6E5E +ENCODING 28254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +003F +0020 +43FE +2202 +0202 +03FE +1202 +1202 +13FE +2202 +2202 +23FE +4202 +4401 +ENDCHAR +STARTCHAR U+6E5F +ENCODING 28255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0880 +0BF8 +4208 +23F8 +2208 +03F8 +0800 +0FFC +1040 +13F8 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6E60 +ENCODING 28256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3222 +1222 +03FE +4000 +33FF +1292 +0292 +0A54 +7210 +1228 +1244 +1482 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+6E61 +ENCODING 28257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3222 +13FE +0222 +43FE +3222 +1020 +07FF +1421 +6421 +2429 +25F9 +2405 +2402 +0000 +0000 +ENDCHAR +STARTCHAR U+6E62 +ENCODING 28258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3000 +13FE +0202 +C202 +63FE +2000 +0000 +17FF +1421 +3421 +27FF +6421 +4421 +C7FF +ENDCHAR +STARTCHAR U+6E63 +ENCODING 28259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +6202 +3202 +13FE +0210 +C210 +63FF +2208 +0209 +1385 +1603 +33FE +2202 +63FE +4202 +C3FE +ENDCHAR +STARTCHAR U+6E64 +ENCODING 28260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4408 +3208 +1110 +0FBF +4400 +3404 +1794 +04BF +1495 +6494 +2494 +2490 +2891 +231F +0000 +0000 +ENDCHAR +STARTCHAR U+6E65 +ENCODING 28261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +3010 +11FF +4129 +3145 +1082 +0414 +0812 +71FF +1010 +1010 +1028 +1044 +1383 +0000 +0000 +ENDCHAR +STARTCHAR U+6E66 +ENCODING 28262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3202 +13FE +0202 +43FE +3120 +1120 +03FE +1420 +6020 +21FC +2020 +2020 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+6E67 +ENCODING 28263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FF8 +0890 +4060 +23F8 +2248 +03F8 +1248 +13F8 +2040 +2FFC +4084 +4304 +4C18 +0000 +ENDCHAR +STARTCHAR U+6E68 +ENCODING 28264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FE +3202 +13FE +0202 +C3FE +6202 +23FE +0028 +102C +1024 +37FF +2050 +60D8 +418C +C707 +ENDCHAR +STARTCHAR U+6E69 +ENCODING 28265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +8008 +67F0 +2040 +0FFE +8040 +67FC +2444 +07FC +1444 +E7FC +4040 +47FC +4040 +4FFE +0000 +0000 +ENDCHAR +STARTCHAR U+6E6B +ENCODING 28267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +20A0 +1120 +1E20 +4224 +2264 +2FE8 +0270 +17A0 +16B0 +2AB0 +2A50 +5248 +4288 +4304 +0000 +ENDCHAR +STARTCHAR U+6E6E +ENCODING 28270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +0940 +47F8 +2548 +2558 +0638 +0FF8 +0880 +17F8 +1080 +2080 +2FFC +2000 +0000 +ENDCHAR +STARTCHAR U+6E6F +ENCODING 28271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0A10 +43F0 +2210 +23F0 +0000 +1FFC +1200 +23F8 +24A8 +4928 +4248 +40B0 +0000 +ENDCHAR +STARTCHAR U+6E71 +ENCODING 28273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4024 +31F8 +1020 +03FE +4020 +37FF +1020 +07FF +1080 +61FE +2282 +2482 +2882 +20FE +0000 +0000 +ENDCHAR +STARTCHAR U+6E72 +ENCODING 28274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +0BF0 +0A48 +4244 +25F4 +2080 +07FC +0880 +09F8 +1148 +1250 +2420 +28D0 +230C +0000 +ENDCHAR +STARTCHAR U+6E73 +ENCODING 28275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2020 +0FFF +0020 +4020 +27FF +0401 +1489 +1451 +15FD +2421 +27FF +2421 +2421 +4421 +4403 +ENDCHAR +STARTCHAR U+6E74 +ENCODING 28276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4102 +3084 +1048 +03FF +4048 +3048 +1048 +0249 +094A +10CC +7048 +1048 +1048 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+6E76 +ENCODING 28278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0880 +0BF8 +4208 +23F8 +2208 +03F8 +0844 +0FE4 +10E8 +1150 +2248 +2C44 +20C0 +0000 +ENDCHAR +STARTCHAR U+6E77 +ENCODING 28279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3020 +13FE +0020 +43FE +3020 +17FF +0088 +1104 +63FE +2505 +21FC +2104 +21FC +0000 +0000 +ENDCHAR +STARTCHAR U+6E78 +ENCODING 28280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3020 +17FF +0000 +41FC +3104 +11FC +0000 +17FF +6401 +2491 +2090 +2111 +261F +0000 +0000 +ENDCHAR +STARTCHAR U+6E79 +ENCODING 28281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FF +3200 +12FE +0292 +42FE +3292 +1292 +0AFE +1210 +6210 +22FE +2210 +2410 +29FF +0000 +0000 +ENDCHAR +STARTCHAR U+6E7A +ENCODING 28282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +117C +0244 +0244 +4644 +267C +0A10 +0210 +13FF +1218 +1238 +2254 +2254 +2292 +4311 +4210 +ENDCHAR +STARTCHAR U+6E7B +ENCODING 28283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1000 +01FC +C104 +6104 +21FC +0000 +13FE +1202 +3202 +23FE +6202 +4202 +C3FE +ENDCHAR +STARTCHAR U+6E7D +ENCODING 28285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0111 +6222 +3444 +1FFF +0444 +C222 +6111 +2000 +03FE +1222 +1222 +33FE +2222 +6222 +4222 +C3FE +ENDCHAR +STARTCHAR U+6E7E +ENCODING 28286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +42A8 +24A4 +2964 +03F0 +1010 +13F0 +1200 +27F8 +2408 +4008 +4070 +0000 +ENDCHAR +STARTCHAR U+6E7F +ENCODING 28287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +43F8 +2208 +23F8 +02A8 +10A0 +14A8 +12A8 +22B0 +20A0 +4FFC +4000 +0000 +ENDCHAR +STARTCHAR U+6E80 +ENCODING 28288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2120 +1120 +1FF8 +4120 +2FFC +2080 +0FF8 +1888 +1AA8 +2AA8 +2BE8 +4A28 +4808 +4818 +0000 +ENDCHAR +STARTCHAR U+6E82 +ENCODING 28290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2208 +1228 +1FE8 +4228 +2FA8 +2AA8 +0AA8 +1FA8 +1228 +2728 +26A8 +4A88 +5208 +4218 +0000 +ENDCHAR +STARTCHAR U+6E83 +ENCODING 28291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4048 +33FC +1248 +83F8 +6040 +2FFE +0808 +13FC +2208 +E248 +2248 +2248 +20B0 +210C +2604 +ENDCHAR +STARTCHAR U+6E85 +ENCODING 28293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4020 +2FA4 +28AE +0AF0 +8AA0 +4AAE +4AF0 +1AA4 +2AA4 +CAA8 +4A90 +4230 +454A +488A +5006 +ENDCHAR +STARTCHAR U+6E86 +ENCODING 28294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4200 +3504 +14FE +8844 +5744 +4244 +1228 +1FA8 +2228 +E710 +2A90 +3228 +2228 +2A44 +2482 +ENDCHAR +STARTCHAR U+6E88 +ENCODING 28296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4110 +30A0 +13F8 +0088 +4090 +31FC +1104 +0908 +13FF +6401 +2AA9 +22A9 +2001 +2006 +0000 +0000 +ENDCHAR +STARTCHAR U+6E89 +ENCODING 28297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +2FFE +2910 +0910 +8F50 +4950 +4954 +1F7E +2810 +2810 +CA20 +4B30 +4D52 +4852 +408E +4100 +ENDCHAR +STARTCHAR U+6E8C +ENCODING 28300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2390 +1090 +1564 +4328 +2210 +27F8 +0924 +0120 +1FFC +1120 +2120 +2224 +4424 +581C +0000 +ENDCHAR +STARTCHAR U+6E8D +ENCODING 28301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3104 +1104 +0208 +C28A +675D +2000 +07FF +1000 +13FE +3202 +23FE +6202 +4202 +C3FE +ENDCHAR +STARTCHAR U+6E8E +ENCODING 28302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4108 +3108 +113E +47C8 +3108 +117F +0380 +1548 +1108 +613E +2108 +2108 +2108 +217F +0000 +0000 +ENDCHAR +STARTCHAR U+6E8F +ENCODING 28303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4440 +25F8 +2448 +07FC +1448 +15F8 +2440 +25F8 +4908 +49F8 +5108 +0000 +ENDCHAR +STARTCHAR U+6E90 +ENCODING 28304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BFC +0A20 +4240 +22F8 +2288 +02F8 +1288 +12F8 +1220 +24A8 +24A4 +4924 +4060 +0000 +ENDCHAR +STARTCHAR U+6E92 +ENCODING 28306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +33FE +1020 +47FF +3000 +13FE +0202 +13FE +1091 +6192 +228C +2484 +20A2 +21C1 +0000 +0000 +ENDCHAR +STARTCHAR U+6E93 +ENCODING 28307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +6108 +37FF +1090 +03FE +C092 +6092 +27FF +0092 +1092 +13FE +3198 +2294 +6696 +4C93 +C090 +ENDCHAR +STARTCHAR U+6E94 +ENCODING 28308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +3088 +13FE +4020 +3020 +13FE +0020 +0020 +1020 +17FF +6000 +2492 +2492 +2891 +0000 +0000 +ENDCHAR +STARTCHAR U+6E96 +ENCODING 28310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0920 +4BF8 +2240 +27F0 +0A40 +0BF0 +1240 +23F8 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+6E97 +ENCODING 28311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +41FC +3020 +17FF +4020 +30A8 +13AE +00A8 +17AF +1020 +6070 +20A8 +2124 +2222 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6E98 +ENCODING 28312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BF8 +4040 +27FC +20A0 +0110 +0FF8 +0808 +13F8 +12A8 +22A8 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6E99 +ENCODING 28313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +67FF +3020 +13FE +0050 +C7FF +6088 +2104 +0623 +1020 +1326 +31AC +2078 +61AE +4723 +C060 +ENDCHAR +STARTCHAR U+6E9B +ENCODING 28315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1489 +4505 +320B +13F0 +0100 +0908 +0928 +3128 +1144 +1292 +14F9 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+6E9C +ENCODING 28316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2100 +16F8 +1428 +4528 +24A8 +25C8 +0E58 +1080 +17F0 +2490 +27F0 +4490 +47F0 +4410 +0000 +ENDCHAR +STARTCHAR U+6E9D +ENCODING 28317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1140 +0FF8 +0940 +47F0 +2140 +2FFC +0080 +13F0 +1290 +13F0 +2290 +2FFC +4210 +4230 +0000 +ENDCHAR +STARTCHAR U+6E9E +ENCODING 28318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FC +3244 +1128 +4090 +3160 +10E0 +079E +1020 +13FE +6222 +23FE +2021 +27FF +2001 +0000 +0000 +ENDCHAR +STARTCHAR U+6E9F +ENCODING 28319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BFC +0A08 +45F0 +2110 +21F0 +0110 +09F0 +0840 +17FC +1000 +2090 +2108 +2608 +0000 +ENDCHAR +STARTCHAR U+6EA0 +ENCODING 28320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +6088 +33FE +1020 +0020 +C1FC +6020 +2020 +03FE +1040 +1080 +31FE +2310 +6C10 +4010 +C1FF +ENDCHAR +STARTCHAR U+6EA1 +ENCODING 28321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +30FE +1710 +4510 +357C +1500 +0704 +15FF +1504 +6544 +2724 +2014 +2004 +200C +0000 +0000 +ENDCHAR +STARTCHAR U+6EA2 +ENCODING 28322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2410 +1210 +1220 +4FFC +2220 +2220 +0410 +1FF8 +1554 +1550 +2550 +2550 +5FFC +4000 +0000 +ENDCHAR +STARTCHAR U+6EA3 +ENCODING 28323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4110 +3128 +1244 +0482 +4D01 +347C +1400 +05FF +1529 +7529 +25FF +2529 +2529 +2503 +0000 +0000 +ENDCHAR +STARTCHAR U+6EA4 +ENCODING 28324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FF +3210 +13FF +4210 +33FF +1210 +0210 +03FF +1001 +12A9 +62A9 +22A9 +2001 +200E +0000 +0000 +ENDCHAR +STARTCHAR U+6EA5 +ENCODING 28325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +0FFC +0840 +43F8 +2248 +23F8 +0248 +0BF8 +0A48 +1010 +17FC +2110 +2090 +2030 +0000 +ENDCHAR +STARTCHAR U+6EA6 +ENCODING 28326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4108 +3110 +157F +4552 +37D2 +1012 +07D2 +1012 +1292 +6292 +228A +2284 +22AA +26D1 +0000 +0000 +ENDCHAR +STARTCHAR U+6EA7 +ENCODING 28327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +30A0 +10A4 +87FE +44A4 +44A4 +17FC +1040 +2044 +EFFE +20E0 +2150 +224E +2C44 +2040 +ENDCHAR +STARTCHAR U+6EAA +ENCODING 28330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +0BF0 +0A88 +4244 +2454 +2190 +00A0 +0850 +0BF8 +1048 +17FC +20A0 +2110 +260C +0000 +ENDCHAR +STARTCHAR U+6EAB +ENCODING 28331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FC +0444 +0444 +44A4 +2514 +07FC +0404 +1000 +1000 +1FFE +2912 +2912 +2912 +5FFF +4000 +ENDCHAR +STARTCHAR U+6EAD +ENCODING 28333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FE +3222 +13FE +0222 +C3FE +6088 +2188 +070F +1080 +11FE +330C +2ED8 +6070 +41DC +C707 +ENDCHAR +STARTCHAR U+6EAE +ENCODING 28334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +623F +3788 +1488 +04BF +C4A9 +67A9 +2429 +0429 +17A9 +14A9 +34A9 +24A9 +64AB +4788 +C008 +ENDCHAR +STARTCHAR U+6EAF +ENCODING 28335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2880 +14B8 +1528 +4FE8 +2228 +2AB8 +0AA8 +1AA8 +1FB8 +2AA8 +2248 +4248 +4488 +4918 +0000 +ENDCHAR +STARTCHAR U+6EB0 +ENCODING 28336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4421 +3421 +17FF +4000 +37FF +1000 +03FE +1202 +13FE +6000 +2202 +2104 +2088 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+6EB1 +ENCODING 28337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4044 +37FE +1040 +87FC +4080 +4FFE +1110 +1208 +25FE +E844 +23F8 +20E0 +2150 +264C +2040 +ENDCHAR +STARTCHAR U+6EB2 +ENCODING 28338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1140 +0A58 +0A48 +4358 +2248 +2358 +0248 +0840 +0BF8 +1110 +10A0 +2040 +21B0 +2E0C +0000 +ENDCHAR +STARTCHAR U+6EB3 +ENCODING 28339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FE +3202 +1202 +03FE +C000 +63FE +2202 +03FE +1202 +13FE +3202 +23FE +6104 +4306 +C603 +ENDCHAR +STARTCHAR U+6EB4 +ENCODING 28340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4108 +37FC +1408 +87F8 +4408 +47F8 +1408 +17F8 +20A0 +E094 +3FFE +2140 +2120 +2210 +2C0E +ENDCHAR +STARTCHAR U+6EB6 +ENCODING 28342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4208 +2510 +2148 +0248 +10A0 +1110 +23F8 +2514 +4110 +41F0 +4110 +0000 +ENDCHAR +STARTCHAR U+6EB7 +ENCODING 28343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FF8 +0C08 +47F8 +2488 +25D8 +06D8 +0D68 +0EE8 +1558 +1658 +2588 +27F8 +2408 +0000 +ENDCHAR +STARTCHAR U+6EB9 +ENCODING 28345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +31FE +1020 +03FF +4201 +3222 +1040 +0088 +09F0 +1042 +63FF +20A9 +2124 +2222 +0000 +0000 +ENDCHAR +STARTCHAR U+6EBA +ENCODING 28346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FF8 +0888 +4088 +27F8 +2440 +07F8 +1088 +14C8 +13B8 +22A8 +24C8 +4088 +4330 +0000 +ENDCHAR +STARTCHAR U+6EBB +ENCODING 28347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3408 +17F8 +8408 +4FF8 +4804 +17BE +1084 +24A4 +E39C +2294 +24A4 +2084 +2294 +2108 +ENDCHAR +STARTCHAR U+6EBC +ENCODING 28348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +8FFE +6104 +2208 +0492 +8F3C +6208 +2492 +0FBE +1040 +2040 +C7FC +4040 +4040 +4FFE +0000 +0000 +ENDCHAR +STARTCHAR U+6EBD +ENCODING 28349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BFC +0A00 +43F8 +2200 +27FC +0528 +09D0 +0F1C +1010 +17FC +2110 +2090 +2030 +0000 +ENDCHAR +STARTCHAR U+6EBE +ENCODING 28350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +3100 +13FE +4622 +3222 +13FE +0222 +13FE +1092 +6095 +209F +2111 +2211 +241F +0000 +0000 +ENDCHAR +STARTCHAR U+6EBF +ENCODING 28351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +6FA9 +3AAB +0AAA +0A88 +CABE +6F88 +2A88 +0A88 +2AFF +2A88 +2A88 +6F88 +4008 +4008 +C008 +ENDCHAR +STARTCHAR U+6EC0 +ENCODING 28352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1080 +0108 +C710 +61A2 +207F +0FC1 +1000 +13FE +3222 +23FE +6222 +4222 +C3FE +ENDCHAR +STARTCHAR U+6EC1 +ENCODING 28353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +5E20 +3250 +3450 +1488 +9506 +5AFC +1420 +3224 +33FE +DA20 +54A8 +5126 +5222 +50A0 +1040 +ENDCHAR +STARTCHAR U+6EC2 +ENCODING 28354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BF8 +4110 +20A0 +27FC +0448 +0840 +0FFC +1040 +1078 +2088 +2108 +2630 +0000 +ENDCHAR +STARTCHAR U+6EC3 +ENCODING 28355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +618C +3306 +1643 +00C8 +C19C +63E6 +2000 +07DE +1042 +1252 +314A +20C6 +614A +4252 +C0C6 +ENDCHAR +STARTCHAR U+6EC4 +ENCODING 28356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +08A0 +41F0 +2208 +25F4 +0110 +09F0 +09F0 +1200 +13F8 +2508 +29F8 +2108 +0000 +ENDCHAR +STARTCHAR U+6EC5 +ENCODING 28357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +0828 +0824 +47FC +2420 +27E8 +0528 +1768 +17B0 +1510 +25B0 +2A54 +4C8C +5004 +0000 +ENDCHAR +STARTCHAR U+6EC6 +ENCODING 28358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3000 +1000 +43FE +3202 +13FE +0000 +17FF +1489 +6489 +25FD +2421 +2421 +2403 +0000 +0000 +ENDCHAR +STARTCHAR U+6EC7 +ENCODING 28359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4048 +37FC +1040 +83F8 +6208 +23F8 +0A08 +13F8 +2208 +E3F8 +2208 +2FFE +2110 +230C +2404 +ENDCHAR +STARTCHAR U+6EC8 +ENCODING 28360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1000 +01FC +C104 +61FC +2000 +03FE +1202 +12FA +328A +228A +62FA +4202 +C20E +ENDCHAR +STARTCHAR U+6EC9 +ENCODING 28361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +43F8 +2208 +23F8 +0248 +0948 +0950 +17FC +10A0 +20A0 +2124 +261C +0000 +ENDCHAR +STARTCHAR U+6ECA +ENCODING 28362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +6200 +37FE +1400 +0DF8 +C000 +67FC +2084 +0494 +12A4 +1FFC +31C4 +22A5 +66B5 +4C9B +C081 +ENDCHAR +STARTCHAR U+6ECB +ENCODING 28363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0890 +08A0 +47FC +2110 +2110 +0154 +0664 +12A8 +1198 +2110 +22A8 +4FFC +4044 +0000 +ENDCHAR +STARTCHAR U+6ECC +ENCODING 28364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1220 +127C +4548 +25B0 +2D30 +15EC +1520 +15FC +2570 +2570 +45A8 +4524 +4420 +0000 +ENDCHAR +STARTCHAR U+6ECD +ENCODING 28365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6222 +3222 +13FE +0040 +C080 +67FF +2020 +03FE +1222 +1222 +33FE +2020 +6022 +40FF +C781 +ENDCHAR +STARTCHAR U+6ECE +ENCODING 28366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +2929 +2A2A +4848 +1414 +2222 +0000 +7FFF +40C1 +3EC4 +02A8 +0490 +0490 +0888 +1084 +6383 +ENDCHAR +STARTCHAR U+6ECF +ENCODING 28367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +420C +3514 +10A0 +8040 +49B0 +4E0E +13F8 +1040 +2040 +E7FC +2248 +2150 +2044 +2FFE +2000 +ENDCHAR +STARTCHAR U+6ED0 +ENCODING 28368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4102 +33DF +1052 +4252 +3192 +111F +0202 +1402 +1020 +67FF +20A8 +2124 +2222 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6ED1 +ENCODING 28369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0A10 +42F0 +2290 +27FC +0404 +17F8 +1A10 +13F0 +2210 +23F0 +4210 +4230 +0000 +ENDCHAR +STARTCHAR U+6ED2 +ENCODING 28370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3004 +13E4 +4224 +33E4 +1004 +07FF +1004 +13E4 +6224 +23E4 +2004 +2004 +2018 +0000 +0000 +ENDCHAR +STARTCHAR U+6ED3 +ENCODING 28371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BFC +4208 +2440 +23F8 +0110 +08A0 +0FFC +1040 +13F8 +2040 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6ED4 +ENCODING 28372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +0BF0 +0A48 +4224 +2424 +2080 +0338 +0A08 +0A08 +13B8 +1208 +2208 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6ED5 +ENCODING 28373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3D50 +2548 +27F8 +24A0 +3FFC +2550 +2648 +3D54 +24D0 +24E0 +2750 +2448 +4CC0 +0000 +ENDCHAR +STARTCHAR U+6ED6 +ENCODING 28374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1000 +41FC +3104 +17FF +0104 +09FC +08A1 +3192 +1288 +1484 +10A2 +11C1 +0000 +0000 +ENDCHAR +STARTCHAR U+6ED7 +ENCODING 28375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +4224 +33BE +1550 +8888 +403C +4FC0 +1090 +17F8 +2080 +E084 +2FFE +2080 +2084 +2084 +207C +ENDCHAR +STARTCHAR U+6ED8 +ENCODING 28376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3451 +1451 +418C +3000 +13FE +0020 +17FF +1000 +63FE +2202 +2202 +23FE +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+6EDA +ENCODING 28378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4048 +37FC +1110 +834C +6444 +2080 +0910 +13F8 +2080 +E144 +2328 +2510 +294E +2184 +2100 +ENDCHAR +STARTCHAR U+6EDC +ENCODING 28380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +33FE +1202 +43FE +3202 +13FE +0040 +17FF +1104 +6222 +2421 +21FC +2020 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6EDD +ENCODING 28381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +0FF8 +4220 +2140 +2FFC +0000 +17F0 +1490 +17F0 +2490 +27F4 +4484 +407C +0000 +ENDCHAR +STARTCHAR U+6EDE +ENCODING 28382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1150 +0950 +0FFC +4150 +21F0 +2000 +07FC +0448 +1BF8 +1248 +2248 +2248 +4270 +4040 +0000 +ENDCHAR +STARTCHAR U+6EDF +ENCODING 28383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +4220 +223C +2F48 +8294 +427E +4FD4 +1254 +1254 +2254 +EFFC +2240 +2242 +2242 +223E +2200 +ENDCHAR +STARTCHAR U+6EE0 +ENCODING 28384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +4FFC +3210 +13F0 +8210 +4BF0 +4A14 +1FFE +1010 +2FFC +E884 +2528 +2210 +2528 +28C6 +3084 +ENDCHAR +STARTCHAR U+6EE1 +ENCODING 28385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4120 +3124 +1FFE +0120 +8008 +6FFC +2120 +0124 +1FFE +2924 +E924 +2AD4 +2C0C +2804 +2814 +2808 +ENDCHAR +STARTCHAR U+6EE2 +ENCODING 28386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4114 +3FFE +1110 +8FFE +4802 +4804 +17FC +1040 +2050 +E3F8 +2040 +2050 +2048 +2FFE +2000 +ENDCHAR +STARTCHAR U+6EE4 +ENCODING 28388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +40F8 +2080 +2FFE +0882 +88F4 +5F80 +4888 +1878 +2800 +C940 +4B24 +4D2A +510A +50F8 +6000 +ENDCHAR +STARTCHAR U+6EE5 +ENCODING 28389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +4120 +3524 +153E +8550 +6588 +2508 +0100 +1008 +27FC +E528 +2528 +2528 +2528 +3FFE +2000 +ENDCHAR +STARTCHAR U+6EE6 +ENCODING 28390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4084 +3FFE +2220 +0630 +8A2C +5224 +42A0 +1084 +2FFE +C1C0 +42A0 +4490 +488E +5084 +4080 +ENDCHAR +STARTCHAR U+6EE8 +ENCODING 28392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +2FFE +2802 +1064 +8380 +5210 +13F8 +1220 +2220 +E224 +3FFE +2000 +2320 +2218 +2408 +ENDCHAR +STARTCHAR U+6EE9 +ENCODING 28393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4028 +3020 +1F7E +8148 +69C8 +297C +0648 +1248 +257C +E948 +3048 +2048 +207E +2040 +2040 +ENDCHAR +STARTCHAR U+6EEB +ENCODING 28395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +6120 +337F +12C2 +0626 +C51C +6D76 +35C3 +057E +0542 +257E +2542 +657E +4442 +4442 +C446 +ENDCHAR +STARTCHAR U+6EEC +ENCODING 28396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1FFC +1000 +47F8 +2408 +27F8 +05F0 +1510 +15F0 +27F8 +2648 +4BF8 +4A04 +51FC +0000 +ENDCHAR +STARTCHAR U+6EED +ENCODING 28397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FE +3222 +13FE +0222 +C3FE +6124 +2124 +0FFF +1124 +1124 +33FE +2020 +61FC +4020 +C020 +ENDCHAR +STARTCHAR U+6EEE +ENCODING 28398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +60E1 +3083 +0FF6 +0914 +C9E1 +6F03 +2926 +08EC +2809 +2A43 +2A46 +6A4C +4A49 +5263 +C43E +ENDCHAR +STARTCHAR U+6EEF +ENCODING 28399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2550 +1550 +1FFC +4550 +25D4 +280C +0FFC +1888 +17F0 +2490 +2490 +4490 +44E0 +4080 +0000 +ENDCHAR +STARTCHAR U+6EF1 +ENCODING 28401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3020 +17FF +4409 +33C8 +100E +0008 +17E8 +115F +614A +2144 +214A +2251 +2441 +287F +0000 +0000 +ENDCHAR +STARTCHAR U+6EF2 +ENCODING 28402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0890 +0BF8 +4110 +2198 +2264 +07FC +08A0 +0B50 +1DAC +1048 +2190 +2060 +2380 +0000 +ENDCHAR +STARTCHAR U+6EF4 +ENCODING 28404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4210 +2120 +27F8 +0488 +17F8 +1488 +15E8 +2528 +25E8 +4528 +4418 +0000 +ENDCHAR +STARTCHAR U+6EF5 +ENCODING 28405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1401 +4441 +32AC +1292 +04A5 +107C +1080 +6110 +2610 +2111 +2111 +21FF +0000 +0000 +ENDCHAR +STARTCHAR U+6EF6 +ENCODING 28406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +3088 +13EF +4092 +37F2 +108A +07FA +120A +13EA +622A +222A +2424 +214A +2091 +0000 +0000 +ENDCHAR +STARTCHAR U+6EF7 +ENCODING 28407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +08FC +4080 +27F8 +24A8 +0668 +0D68 +0ED8 +15C8 +15A8 +2658 +27F8 +2408 +0000 +ENDCHAR +STARTCHAR U+6EF8 +ENCODING 28408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2020 +1720 +1020 +4FFC +2050 +2790 +0010 +1710 +10FC +2710 +2510 +4510 +4710 +4510 +0000 +ENDCHAR +STARTCHAR U+6EF9 +ENCODING 28409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +407C +3040 +17FE +8444 +45F0 +4444 +143C +1408 +25F0 +E524 +24A8 +2BFE +2820 +30A0 +2040 +ENDCHAR +STARTCHAR U+6EFB +ENCODING 28411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1104 +018C +C088 +67FF +2400 +0490 +14FE +1510 +3410 +24FE +6410 +4810 +C1FF +ENDCHAR +STARTCHAR U+6EFC +ENCODING 28412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +3104 +17DF +4104 +338E +1555 +0104 +1000 +11F8 +1108 +6148 +2128 +2209 +240F +0000 +0000 +ENDCHAR +STARTCHAR U+6EFD +ENCODING 28413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +67FF +3420 +15FE +0422 +C7FF +6422 +25FE +0420 +15FE +1522 +35FE +2522 +65FE +4922 +C126 +ENDCHAR +STARTCHAR U+6EFE +ENCODING 28414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0FFC +0910 +4208 +2FF4 +2210 +0210 +0BF0 +08C8 +1128 +1F30 +2110 +21C8 +2604 +0000 +ENDCHAR +STARTCHAR U+6EFF +ENCODING 28415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1FFC +1220 +43E0 +2080 +2FF8 +0888 +1EE8 +1AA8 +2AA8 +2DD8 +4888 +4888 +4898 +0000 +ENDCHAR +STARTCHAR U+6F00 +ENCODING 28416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +043C +3F24 +0425 +3F47 +3FBE +2494 +3F88 +2077 +4080 +3EBE +02A0 +0490 +398E +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+6F01 +ENCODING 28417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0880 +09F0 +4120 +2240 +27F8 +0248 +13F8 +1248 +13F8 +2000 +2548 +44A4 +48A4 +0000 +ENDCHAR +STARTCHAR U+6F02 +ENCODING 28418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +08A0 +43F8 +22A8 +23F8 +0000 +13F8 +1000 +17FC +2150 +2248 +4448 +40C0 +0000 +ENDCHAR +STARTCHAR U+6F03 +ENCODING 28419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1401 +4401 +3100 +11DF +0111 +17D1 +1111 +638A +2544 +210A +2131 +2100 +0000 +0000 +ENDCHAR +STARTCHAR U+6F04 +ENCODING 28420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +6222 +33FE +1000 +07FF +C400 +6420 +25FE +0420 +17FF +1400 +3420 +25FE +6820 +43FF +C000 +ENDCHAR +STARTCHAR U+6F05 +ENCODING 28421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4222 +3444 +1222 +0000 +43FE +3222 +13FE +0222 +13FE +1020 +67FF +2124 +2222 +2421 +0000 +0000 +ENDCHAR +STARTCHAR U+6F06 +ENCODING 28422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +40E0 +2150 +264C +00A0 +1358 +1E4C +1150 +20E0 +2150 +464C +40C0 +0000 +ENDCHAR +STARTCHAR U+6F07 +ENCODING 28423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4108 +3108 +122E +44A8 +30A8 +117F +0208 +1608 +124E +6248 +2248 +22A8 +2318 +220F +0000 +0000 +ENDCHAR +STARTCHAR U+6F08 +ENCODING 28424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +61DE +3322 +16A6 +0154 +C088 +6104 +26FB +0000 +1000 +13FE +3020 +2124 +6326 +4623 +C0E0 +ENDCHAR +STARTCHAR U+6F09 +ENCODING 28425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +1040 +17FC +44A0 +27F8 +24A8 +04A8 +17F8 +1520 +15E8 +2530 +2964 +49A4 +561C +0000 +ENDCHAR +STARTCHAR U+6F0A +ENCODING 28426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +63FE +3222 +17FF +0222 +C3FE +6020 +23FE +0222 +13FE +1040 +37FF +2084 +61C8 +4078 +C3CE +ENDCHAR +STARTCHAR U+6F0C +ENCODING 28428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +6088 +37FF +1088 +00F8 +C020 +63FE +2222 +0222 +13FE +1020 +33FE +2020 +63FE +4020 +C7FF +ENDCHAR +STARTCHAR U+6F0D +ENCODING 28429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3429 +1425 +07FF +C421 +65D1 +2555 +0555 +15DD +1409 +35DB +2437 +64E5 +4401 +C7FF +ENDCHAR +STARTCHAR U+6F0E +ENCODING 28430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4242 +3242 +1466 +4199 +3100 +1110 +0210 +1610 +125E +6250 +2250 +2250 +22B0 +231F +0000 +0000 +ENDCHAR +STARTCHAR U+6F0F +ENCODING 28431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17F8 +1408 +47F8 +2400 +27FC +0440 +17F8 +1768 +16D8 +2A48 +2B68 +52D8 +4258 +0000 +ENDCHAR +STARTCHAR U+6F11 +ENCODING 28433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +12F8 +1F10 +4950 +2950 +2F50 +09FC +1F20 +1830 +2F30 +2850 +4F54 +4894 +490C +0000 +ENDCHAR +STARTCHAR U+6F12 +ENCODING 28434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4710 +3110 +1121 +417F +3709 +1408 +047F +1749 +1149 +617F +2108 +2109 +217F +2601 +0000 +0000 +ENDCHAR +STARTCHAR U+6F13 +ENCODING 28435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +1FFC +1450 +4750 +24D0 +2530 +07F0 +1080 +1FF8 +28C8 +2928 +4FD8 +4808 +4818 +0000 +ENDCHAR +STARTCHAR U+6F14 +ENCODING 28436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +4408 +2FFC +2040 +03F8 +1248 +13F8 +1248 +23F8 +2090 +4308 +4C04 +0000 +ENDCHAR +STARTCHAR U+6F15 +ENCODING 28437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +0FFC +08A0 +43F8 +22A8 +23F8 +02A8 +0BF8 +09F0 +0910 +11F0 +1110 +21F0 +2110 +0000 +ENDCHAR +STARTCHAR U+6F16 +ENCODING 28438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +6368 +31C8 +176F +001A +C092 +67EA +210A +020A +15EE +1044 +3084 +20EE +678A +408A +C19B +ENDCHAR +STARTCHAR U+6F18 +ENCODING 28440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +6200 +32FE +1200 +03FF +C24A +624C +2276 +03C3 +12FE +1282 +32FE +2682 +64FE +4C82 +C086 +ENDCHAR +STARTCHAR U+6F19 +ENCODING 28441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +33FE +11FC +0124 +41FC +3124 +11FC +0022 +0BFE +1008 +63FE +2088 +2048 +2018 +0000 +0000 +ENDCHAR +STARTCHAR U+6F1A +ENCODING 28442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FF +3400 +147C +0444 +C444 +647C +2400 +05EF +1529 +1529 +3529 +25EF +6400 +47FF +C000 +ENDCHAR +STARTCHAR U+6F1B +ENCODING 28443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6124 +30A8 +13FE +0050 +C7FF +6088 +2326 +06CB +1050 +1024 +33FE +2023 +60A8 +41AC +C326 +ENDCHAR +STARTCHAR U+6F1C +ENCODING 28444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +3104 +17DF +0104 +438E +3555 +1104 +0104 +0820 +1020 +63FE +2020 +2020 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+6F1E +ENCODING 28446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FE +3124 +1222 +0000 +41FC +3104 +11FC +0104 +11FC +1104 +61FC +2090 +2111 +261F +0000 +0000 +ENDCHAR +STARTCHAR U+6F1F +ENCODING 28447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4222 +3124 +17FF +0401 +45FD +3104 +1104 +01FC +0820 +1020 +61FC +2020 +2020 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+6F20 +ENCODING 28448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0920 +0FFC +4120 +23F0 +2210 +03F0 +1210 +13F0 +1080 +2FFC +20C0 +4330 +4C0C +0000 +ENDCHAR +STARTCHAR U+6F21 +ENCODING 28449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +32FF +1400 +41FE +317A +11FE +0000 +03FF +1080 +11FF +6149 +2249 +2091 +2026 +0000 +0000 +ENDCHAR +STARTCHAR U+6F22 +ENCODING 28450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0920 +0FFC +4120 +23F8 +2248 +03F8 +1040 +13F8 +1040 +27FC +20A0 +4110 +460C +0000 +ENDCHAR +STARTCHAR U+6F23 +ENCODING 28451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2020 +15FC +1220 +42F8 +20A8 +20F8 +0EA8 +12F8 +1220 +23FC +2220 +4220 +45A0 +487C +0000 +ENDCHAR +STARTCHAR U+6F24 +ENCODING 28452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +4210 +2FFC +1210 +8738 +4AD4 +5212 +1290 +1084 +2FFE +E110 +2210 +2120 +20C0 +2330 +2C08 +ENDCHAR +STARTCHAR U+6F25 +ENCODING 28453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1489 +0505 +4222 +31FC +1020 +0020 +13FE +1020 +61FC +2020 +2020 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+6F26 +ENCODING 28454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F20 +087F +FFC4 +2A28 +4910 +882C +08C3 +0000 +7FFF +408C +5E98 +42E0 +84B8 +388F +0380 +ENDCHAR +STARTCHAR U+6F27 +ENCODING 28455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4108 +37C8 +111F +4120 +37C0 +1440 +07DE +1442 +17C2 +6104 +2FE8 +2111 +2111 +211F +0000 +0000 +ENDCHAR +STARTCHAR U+6F29 +ENCODING 28457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +4220 +3224 +1FFE +8480 +4400 +4F7E +1512 +1514 +2550 +E55C +2950 +2950 +2D70 +3298 +2106 +ENDCHAR +STARTCHAR U+6F2A +ENCODING 28458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +4928 +25FC +1220 +8650 +4A88 +53FE +1204 +26F4 +2A94 +F294 +2294 +22F4 +2204 +2A14 +2408 +ENDCHAR +STARTCHAR U+6F2B +ENCODING 28459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0A10 +43F0 +2210 +23F0 +07F8 +1528 +17F8 +23F0 +2120 +40C0 +41E0 +4E1C +0000 +ENDCHAR +STARTCHAR U+6F2C +ENCODING 28460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BF8 +0840 +41F0 +2040 +27FC +01F0 +1110 +11F0 +11F0 +2110 +21F0 +4190 +4608 +0000 +ENDCHAR +STARTCHAR U+6F2D +ENCODING 28461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4110 +3FFE +1110 +8048 +4FFE +40A0 +1110 +120E +2D14 +E110 +27FC +2110 +2110 +2210 +2410 +ENDCHAR +STARTCHAR U+6F2E +ENCODING 28462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1420 +45FE +3422 +17FF +0422 +15FE +1422 +65E4 +24A8 +2524 +2823 +2060 +0000 +0000 +ENDCHAR +STARTCHAR U+6F2F +ENCODING 28463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +3444 +17FC +8444 +47FC +4484 +1108 +17F0 +2080 +E108 +27FC +2250 +244C +2944 +2080 +ENDCHAR +STARTCHAR U+6F30 +ENCODING 28464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6222 +3222 +13FE +0000 +C3DE +6252 +2252 +03DE +1252 +1252 +33DE +2252 +6252 +42D2 +C426 +ENDCHAR +STARTCHAR U+6F31 +ENCODING 28465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1220 +1FA0 +4220 +2FFC +2AE4 +0AA8 +1FB0 +1320 +26A0 +26D0 +4A50 +5288 +4304 +0000 +ENDCHAR +STARTCHAR U+6F32 +ENCODING 28466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1EF8 +1280 +42F0 +2E80 +28F0 +0880 +1FFC +1AA8 +22A8 +2290 +42B0 +42C8 +4D84 +0000 +ENDCHAR +STARTCHAR U+6F33 +ENCODING 28467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +47FC +3110 +10A4 +8FFE +6008 +23FC +0A08 +13F8 +2208 +E3F8 +2040 +2FFE +2040 +2040 +2040 +ENDCHAR +STARTCHAR U+6F35 +ENCODING 28469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +3288 +1448 +482F +37C2 +1102 +010A +110A +1FEA +610A +254A +2924 +210A +2111 +0000 +0000 +ENDCHAR +STARTCHAR U+6F36 +ENCODING 28470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4044 +37FE +1444 +8444 +47FC +4040 +17FC +1444 +2444 +E7FC +2040 +2A88 +2A46 +320A +21F8 +ENDCHAR +STARTCHAR U+6F37 +ENCODING 28471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +37EF +1009 +47EA +342C +17EA +0009 +13E9 +1049 +67ED +208A +2088 +2088 +2188 +0000 +0000 +ENDCHAR +STARTCHAR U+6F38 +ENCODING 28472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2208 +1208 +1FD0 +4220 +2FA0 +2ABC +0FA8 +0AA8 +1FA8 +1228 +3FE8 +2248 +4248 +4288 +0000 +ENDCHAR +STARTCHAR U+6F39 +ENCODING 28473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3020 +113C +4120 +37FF +1100 +01FC +1100 +11FF +6529 +2529 +2529 +2001 +2006 +0000 +0000 +ENDCHAR +STARTCHAR U+6F3A +ENCODING 28474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1020 +42AA +3124 +12AA +0020 +0AAA +1124 +62AA +2020 +2050 +2088 +2707 +0000 +0000 +ENDCHAR +STARTCHAR U+6F3B +ENCODING 28475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63DE +3042 +114A +00C6 +C14A +6022 +2070 +01DC +1707 +1020 +31C8 +2032 +61C4 +4018 +C1E0 +ENDCHAR +STARTCHAR U+6F3C +ENCODING 28476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6222 +3222 +13FE +0110 +C120 +63FE +2220 +0620 +2BFE +2220 +2220 +63FE +4220 +4220 +C3FF +ENDCHAR +STARTCHAR U+6F3E +ENCODING 28478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0FFC +0840 +43F8 +2040 +27FC +03F0 +09C0 +0868 +17E8 +10D0 +2148 +2644 +20C0 +0000 +ENDCHAR +STARTCHAR U+6F3F +ENCODING 28479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2440 +24F8 +3F50 +04F0 +7F90 +15FC +2490 +4530 +0108 +7F90 +0560 +1930 +610C +0300 +0000 +ENDCHAR +STARTCHAR U+6F40 +ENCODING 28480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3489 +1489 +47FF +3004 +11F8 +0020 +1222 +1222 +6322 +24A5 +28A9 +2020 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6F41 +ENCODING 28481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +23FC +3C20 +2040 +22F8 +1E88 +08F8 +0A88 +7AF8 +1C88 +2CF8 +2A50 +4988 +1B04 +0000 +ENDCHAR +STARTCHAR U+6F43 +ENCODING 28483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4120 +313E +1154 +0214 +4608 +3294 +12A2 +02BE +0AA2 +12BE +62A2 +223E +2222 +2246 +0000 +0000 +ENDCHAR +STARTCHAR U+6F45 +ENCODING 28485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0BF8 +4280 +27FC +2920 +03FC +1220 +17F8 +2A20 +23F8 +4220 +43FC +4200 +0000 +ENDCHAR +STARTCHAR U+6F46 +ENCODING 28486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4114 +2FFE +1110 +87FE +4482 +4914 +13E0 +1080 +2108 +E7FC +2044 +2250 +244C +2944 +2080 +ENDCHAR +STARTCHAR U+6F47 +ENCODING 28487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4FFE +3110 +1040 +87FC +4044 +4FFE +1044 +17FC +2040 +E444 +2564 +2554 +2654 +2844 +3044 +ENDCHAR +STARTCHAR U+6F4B +ENCODING 28491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +4210 +3510 +14A4 +887E +57A4 +4024 +1AA4 +1AA8 +2AA8 +EA90 +2110 +23A8 +3C28 +2844 +2182 +ENDCHAR +STARTCHAR U+6F4D +ENCODING 28493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4450 +2444 +24FE +8890 +5F90 +42FC +0490 +2890 +5FFC +C090 +4090 +4394 +5CFE +4880 +4080 +ENDCHAR +STARTCHAR U+6F4E +ENCODING 28494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +32A8 +12A8 +408F +37F1 +1491 +0495 +15D5 +16B5 +6495 +2495 +2415 +2412 +243D +0000 +0000 +ENDCHAR +STARTCHAR U+6F4F +ENCODING 28495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FC +3088 +1050 +07FE +C0A4 +6128 +2260 +07FE +1492 +1512 +36FE +2492 +6492 +44F2 +C406 +ENDCHAR +STARTCHAR U+6F50 +ENCODING 28496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4110 +3210 +17FF +0210 +43FF +3210 +13FF +0210 +0BFF +1200 +6000 +2489 +2489 +2489 +0000 +0000 +ENDCHAR +STARTCHAR U+6F51 +ENCODING 28497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +13F4 +0159 +008A +4304 +2C03 +07BC +10A5 +17A7 +1440 +14FE +27A2 +2094 +2098 +4134 +46C3 +ENDCHAR +STARTCHAR U+6F52 +ENCODING 28498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +61FC +3308 +1210 +07FE +C222 +6222 +23FE +0020 +10C2 +1326 +30D4 +2338 +60D4 +4713 +C070 +ENDCHAR +STARTCHAR U+6F53 +ENCODING 28499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +67FF +3020 +13FE +0222 +C3FE +6222 +23FE +0024 +17FE +1023 +32B0 +229A +6683 +4CC5 +C07C +ENDCHAR +STARTCHAR U+6F54 +ENCODING 28500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +1FF8 +1228 +4FA8 +2228 +23D8 +0CA0 +1120 +1750 +10B8 +2FC8 +22B0 +4C88 +4080 +0000 +ENDCHAR +STARTCHAR U+6F55 +ENCODING 28501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +3100 +13FF +0652 +4252 +37FF +1252 +0252 +0A52 +17FF +6000 +2489 +2489 +2489 +0000 +0000 +ENDCHAR +STARTCHAR U+6F57 +ENCODING 28503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +1120 +03FE +0220 +47FE +2A20 +03FE +0220 +13FF +1220 +1020 +2FFF +2070 +20A8 +4324 +4C23 +ENDCHAR +STARTCHAR U+6F58 +ENCODING 28504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +0BE8 +0A48 +4150 +2FFC +20E0 +0150 +0E4C +0BF8 +1248 +13F8 +2248 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6F59 +ENCODING 28505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0018 +61F2 +3246 +1124 +03FC +C204 +6204 +23FE +0202 +1202 +13FF +3601 +2415 +6D55 +4343 +C20E +ENDCHAR +STARTCHAR U+6F5A +ENCODING 28506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +13FE +0022 +0FFF +0022 +43FE +2020 +04A9 +14A9 +17AF +1421 +27FF +2421 +27AF +44A9 +48A9 +ENDCHAR +STARTCHAR U+6F5B +ENCODING 28507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2210 +1FFC +1A50 +4A50 +2FFC +26B0 +0734 +1A4C +13F0 +2210 +23F0 +4210 +43F0 +4210 +0000 +ENDCHAR +STARTCHAR U+6F5C +ENCODING 28508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0920 +0FF8 +4120 +2FFC +2330 +02D0 +1488 +1BF4 +1210 +23F0 +2210 +43F0 +4210 +0000 +ENDCHAR +STARTCHAR U+6F5D +ENCODING 28509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6070 +31DC +1707 +00F8 +C000 +61FC +2104 +01FC +1000 +17DF +3041 +2249 +61C7 +4659 +C0C3 +ENDCHAR +STARTCHAR U+6F5E +ENCODING 28510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2FA0 +28BC +08C4 +88C4 +4FA8 +4A90 +0228 +1A46 +2B84 +CA7C +4A44 +4A44 +4BC4 +5C7C +0844 +ENDCHAR +STARTCHAR U+6F5F +ENCODING 28511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0B38 +0A08 +43B8 +2208 +23F8 +0100 +13FC +1624 +2A94 +2554 +4544 +4804 +4018 +0000 +ENDCHAR +STARTCHAR U+6F60 +ENCODING 28512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +87BC +64A4 +24A4 +07BC +8420 +6420 +27BC +0110 +17FC +2110 +CFFE +4110 +4208 +4404 +0000 +0000 +ENDCHAR +STARTCHAR U+6F61 +ENCODING 28513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +6108 +3FE8 +101F +07D2 +C472 +67D6 +2014 +07D4 +109C +1108 +31C8 +271C +6114 +4136 +C763 +ENDCHAR +STARTCHAR U+6F62 +ENCODING 28514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4110 +37FC +1110 +8114 +4FFE +4840 +17FC +1444 +27FC +E444 +27FC +2404 +2110 +220C +2404 +ENDCHAR +STARTCHAR U+6F63 +ENCODING 28515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47DF +3451 +17DF +0451 +47DF +3421 +15FD +0489 +0C89 +1451 +6421 +2451 +2489 +2402 +0000 +0000 +ENDCHAR +STARTCHAR U+6F64 +ENCODING 28516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1F78 +1948 +4F78 +2948 +2F78 +0808 +0BE8 +1888 +1BE8 +2888 +2BE8 +4808 +4818 +0000 +ENDCHAR +STARTCHAR U+6F66 +ENCODING 28518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +44A8 +2310 +23F8 +0D14 +09F0 +0910 +11F0 +1250 +2248 +2448 +20C0 +0000 +ENDCHAR +STARTCHAR U+6F67 +ENCODING 28519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4202 +3104 +17FF +0525 +44A9 +37FF +1000 +03FE +0A02 +1202 +63FE +2202 +2202 +23FE +0000 +0000 +ENDCHAR +STARTCHAR U+6F68 +ENCODING 28520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6040 +37FE +1492 +0492 +CFFF +6030 +23E2 +0156 +1354 +1658 +30C8 +21CC +6346 +4E43 +C040 +ENDCHAR +STARTCHAR U+6F69 +ENCODING 28521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3222 +1222 +03FE +4222 +3222 +13FE +0088 +0BFE +1088 +67FF +2088 +2104 +2603 +0000 +0000 +ENDCHAR +STARTCHAR U+6F6A +ENCODING 28522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4400 +37DF +1511 +07D1 +411F +3291 +1440 +0000 +0BFE +1202 +63FE +2202 +23FE +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+6F6B +ENCODING 28523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4222 +3124 +13FE +0020 +47FF +3088 +1124 +064B +08F0 +1024 +61FC +2124 +2222 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6F6C +ENCODING 28524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03DE +6252 +33DE +1000 +01FC +C124 +6124 +21FC +0124 +1124 +11FC +3020 +27FF +6020 +4020 +C020 +ENDCHAR +STARTCHAR U+6F6D +ENCODING 28525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +08A0 +43F8 +22A8 +23F8 +01F0 +0910 +09F0 +1110 +11F0 +27FC +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6F6E +ENCODING 28526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +1278 +1FC8 +4248 +2F48 +2978 +0F48 +1948 +1F78 +2248 +3FC8 +4248 +4288 +4318 +0000 +ENDCHAR +STARTCHAR U+6F6F +ENCODING 28527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0810 +47FC +2010 +23F0 +07B8 +0928 +09B8 +1610 +17FC +2110 +2090 +2030 +0000 +ENDCHAR +STARTCHAR U+6F70 +ENCODING 28528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +0BF0 +0A90 +43F0 +2080 +2FFC +03F0 +1210 +13F0 +13F0 +2210 +23F0 +4310 +4C08 +0000 +ENDCHAR +STARTCHAR U+6F72 +ENCODING 28530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4190 +2E54 +1238 +8210 +5FFC +4244 +1644 +177C +2AC4 +EA44 +327C +2244 +2244 +2254 +2248 +ENDCHAR +STARTCHAR U+6F73 +ENCODING 28531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FF +3201 +13FF +4222 +32FC +1228 +03FF +0A20 +127E +62C2 +237E +2242 +247E +2042 +0000 +0000 +ENDCHAR +STARTCHAR U+6F74 +ENCODING 28532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2240 +1240 +1BF8 +4448 +2450 +2BFC +0250 +1688 +17F8 +2A88 +2AF8 +4288 +42F8 +4C88 +0000 +ENDCHAR +STARTCHAR U+6F76 +ENCODING 28534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +32AA +12AA +0272 +43FE +3020 +1020 +01FC +0820 +17FF +6000 +2489 +2489 +2889 +0000 +0000 +ENDCHAR +STARTCHAR U+6F77 +ENCODING 28535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4108 +31EF +1294 +0020 +41FE +3022 +13FF +0022 +05FE +0820 +71FE +1020 +13FF +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+6F78 +ENCODING 28536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2210 +1210 +1FFC +4210 +2AD8 +2ADC +0A94 +13F0 +1210 +23F0 +2210 +43F0 +4410 +4830 +0000 +ENDCHAR +STARTCHAR U+6F7A +ENCODING 28538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17F8 +1408 +47F8 +25F0 +2460 +07FC +1440 +17F8 +2488 +2990 +4F7C +5110 +4330 +0000 +ENDCHAR +STARTCHAR U+6F7B +ENCODING 28539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FC +3020 +17FF +00A8 +4124 +3252 +1088 +0124 +0AAA +1070 +60A8 +2124 +2663 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6F7C +ENCODING 28540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BF8 +0910 +47FC +23F8 +2248 +03F8 +0A48 +0BF8 +1040 +13F8 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+6F7D +ENCODING 28541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2204 +1108 +0108 +07FE +4090 +2492 +0294 +0FFF +1000 +13FC +1204 +2204 +23FC +2204 +4204 +43FC +ENDCHAR +STARTCHAR U+6F7E +ENCODING 28542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1124 +00A8 +07FF +4070 +20A8 +0124 +1623 +1108 +13FE +2668 +29A8 +217F +2208 +4408 +4808 +ENDCHAR +STARTCHAR U+6F7F +ENCODING 28543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FF +3221 +12FD +0225 +43FF +32FD +1285 +02FD +0A09 +12FD +6289 +22FF +2209 +23FF +0000 +0000 +ENDCHAR +STARTCHAR U+6F80 +ENCODING 28544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1FF8 +12A8 +4AE8 +26A8 +24C8 +0BB0 +1210 +1BDC +2A50 +2A50 +4B50 +4EFC +5800 +0000 +ENDCHAR +STARTCHAR U+6F81 +ENCODING 28545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +1240 +1278 +4240 +2240 +2FFC +0210 +1A50 +1BDC +2A50 +2A50 +4B50 +4EFC +5800 +0000 +ENDCHAR +STARTCHAR U+6F82 +ENCODING 28546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1AA0 +1AA0 +4AA0 +2FBC +2048 +0FE8 +10A8 +1FB0 +2210 +2F90 +4228 +43C8 +5C84 +0000 +ENDCHAR +STARTCHAR U+6F83 +ENCODING 28547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFF +3820 +E1FE +0902 +39FE +E102 +09FE +1902 +31FE +E048 +0387 +7D04 +0588 +1970 +F10F +0700 +ENDCHAR +STARTCHAR U+6F84 +ENCODING 28548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2390 +1090 +1564 +4328 +23F0 +2408 +0BF4 +1210 +13F0 +1220 +2120 +2140 +4FFC +4000 +0000 +ENDCHAR +STARTCHAR U+6F85 +ENCODING 28549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +31FC +1024 +03FE +41FC +3020 +11FC +03FE +09FC +1124 +61FC +2124 +21FC +23FE +0000 +0000 +ENDCHAR +STARTCHAR U+6F86 +ENCODING 28550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BF8 +0840 +47FC +2110 +27BC +0110 +09BC +0E00 +17FC +10A0 +20A4 +2124 +261C +0000 +ENDCHAR +STARTCHAR U+6F87 +ENCODING 28551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +6555 +3555 +1104 +028A +C451 +6000 +27FF +0401 +1441 +13FE +3042 +20C2 +6086 +4184 +C71C +ENDCHAR +STARTCHAR U+6F88 +ENCODING 28552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +4110 +2FD0 +2214 +04BE +8FC4 +4024 +47A8 +14A8 +27A8 +E490 +2790 +24A8 +24A8 +24C6 +2584 +ENDCHAR +STARTCHAR U+6F89 +ENCODING 28553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4790 +3090 +1124 +8FFE +44A4 +4CA4 +17A4 +14A8 +24A8 +E790 +2490 +24A8 +3FA8 +20C4 +2082 +ENDCHAR +STARTCHAR U+6F8B +ENCODING 28555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FC +3204 +13FC +0204 +C3FC +6020 +2FFF +0000 +13FC +1204 +33FC +2128 +632C +4626 +C0E0 +ENDCHAR +STARTCHAR U+6F8C +ENCODING 28556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +490C +2970 +1FC0 +8940 +4944 +5F7E +1948 +2F48 +2948 +E948 +3FC8 +2448 +2948 +3088 +2108 +ENDCHAR +STARTCHAR U+6F8D +ENCODING 28557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +4288 +2FC8 +2208 +8FBE +5008 +1F88 +28A8 +2898 +4F88 +C008 +4888 +4508 +5FC8 +4028 +4010 +ENDCHAR +STARTCHAR U+6F8E +ENCODING 28558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0910 +0FE0 +4128 +27C8 +2010 +07D0 +0C64 +0FC4 +1488 +1288 +22D0 +2320 +2C40 +0000 +ENDCHAR +STARTCHAR U+6F90 +ENCODING 28560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FF +0020 +07FF +4421 +23AE +0020 +03AE +1000 +11FC +1000 +27FF +2100 +2104 +427E +4F81 +ENDCHAR +STARTCHAR U+6F91 +ENCODING 28561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +08A0 +43B8 +22A8 +22A8 +03B8 +08A0 +0BF8 +1248 +13F8 +2248 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+6F92 +ENCODING 28562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +40FF +6F10 +247E +0442 +8442 +C47E +4442 +0442 +247E +2742 +2C42 +607E +4024 +4066 +C0C3 +ENDCHAR +STARTCHAR U+6F93 +ENCODING 28563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +4320 +667F +2CC0 +003E +8122 +C33E +4622 +0E3E +2210 +223E +2262 +62D6 +421C +4236 +C2E3 +ENDCHAR +STARTCHAR U+6F94 +ENCODING 28564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +1128 +0228 +07BE +04C8 +4488 +24FF +0488 +1788 +14BE +14A2 +24A2 +24A2 +27BE +44A2 +4020 +ENDCHAR +STARTCHAR U+6F95 +ENCODING 28565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +37FF +1088 +07FF +4124 +37FF +1124 +0124 +0FFF +1020 +67FF +2020 +2020 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6F96 +ENCODING 28566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67DF +3451 +17DF +0451 +C7DF +6401 +2421 +05FD +1421 +1471 +3471 +24A9 +6525 +4421 +C407 +ENDCHAR +STARTCHAR U+6F97 +ENCODING 28567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1F78 +1948 +4F78 +2948 +2F78 +0808 +0BE8 +1A28 +1BE8 +2A28 +2BE8 +4A28 +4818 +0000 +ENDCHAR +STARTCHAR U+6F9A +ENCODING 28570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6040 +33FE +1202 +02AA +C222 +62FA +2272 +02AA +1202 +17FF +3080 +21FE +6002 +4006 +C01C +ENDCHAR +STARTCHAR U+6F9C +ENCODING 28572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4204 +317E +1504 +0454 +87FC +6444 +25F4 +0D54 +15F4 +2554 +E5F4 +24E4 +2554 +264C +2444 +240C +ENDCHAR +STARTCHAR U+6F9E +ENCODING 28574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +303C +13FF +02FD +4220 +3238 +127C +0244 +0B7C +13FE +6212 +23FF +2228 +24C6 +0000 +0000 +ENDCHAR +STARTCHAR U+6F9F +ENCODING 28575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +67FF +3000 +11FC +0104 +C174 +6154 +2174 +0104 +11FC +1002 +33FC +2020 +67FF +40A8 +C727 +ENDCHAR +STARTCHAR U+6FA0 +ENCODING 28576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +67FE +3492 +1492 +079E +C090 +6090 +279E +0492 +1492 +179E +3492 +2492 +679E +40C1 +C07F +ENDCHAR +STARTCHAR U+6FA1 +ENCODING 28577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +09F0 +0910 +41F0 +2000 +27BC +04A4 +0FBC +0840 +17FC +10E0 +2150 +264C +2040 +0000 +ENDCHAR +STARTCHAR U+6FA2 +ENCODING 28578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4222 +3124 +17FF +0401 +45FD +3505 +11FC +0000 +0BFE +1222 +63FE +2222 +23FE +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+6FA3 +ENCODING 28579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1220 +1FB0 +4250 +2F48 +29FC +0F20 +1920 +1FFC +2220 +3FA0 +4220 +4220 +4220 +0000 +ENDCHAR +STARTCHAR U+6FA4 +ENCODING 28580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0AA8 +43F8 +2040 +23F8 +0040 +0FFC +0910 +17FC +1040 +23F8 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+6FA5 +ENCODING 28581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +63FF +3649 +1C89 +07D9 +C577 +6540 +27C4 +0554 +155F +17E4 +3444 +247F +6444 +4444 +C8C4 +ENDCHAR +STARTCHAR U+6FA6 +ENCODING 28582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +5F7F +6108 +2A3E +0422 +8422 +DFBE +44A2 +0522 +243E +2422 +2422 +643E +4414 +4436 +CC63 +ENDCHAR +STARTCHAR U+6FA7 +ENCODING 28583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +40A4 +37FE +14A4 +87FC +44A4 +57FC +1000 +27FC +2000 +E3F8 +2208 +23F8 +2110 +20A0 +2FFE +ENDCHAR +STARTCHAR U+6FA8 +ENCODING 28584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +6108 +33DF +1294 +04A4 +C000 +63FE +2020 +0124 +1124 +13AE +32AA +2471 +6020 +47FF +C000 +ENDCHAR +STARTCHAR U+6FA9 +ENCODING 28585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0540 +388E +2142 +380E +2142 +388E +2142 +7FFF +4081 +4084 +1EB8 +02A0 +0490 +198C +0000 +0000 +ENDCHAR +STARTCHAR U+6FAA +ENCODING 28586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0840 +43FC +2248 +2758 +0358 +08A0 +0BF8 +1C04 +13F8 +2048 +2070 +2040 +0000 +ENDCHAR +STARTCHAR U+6FAB +ENCODING 28587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +37FF +1088 +03FE +4222 +33FE +1222 +03FE +0820 +17FF +6429 +24F9 +2409 +2403 +0000 +0000 +ENDCHAR +STARTCHAR U+6FAC +ENCODING 28588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4420 +333F +1049 +0108 +4214 +3463 +11FE +0102 +09FA +11FA +6102 +21FE +2084 +2303 +0000 +0000 +ENDCHAR +STARTCHAR U+6FAD +ENCODING 28589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3020 +17FF +0088 +4112 +327F +17D2 +011F +0A52 +17DF +6052 +2092 +271F +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+6FAE +ENCODING 28590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1050 +0088 +0104 +46FB +2000 +07FF +0525 +14A9 +17FF +1000 +23FE +2202 +23FE +4202 +43FE +ENDCHAR +STARTCHAR U+6FAF +ENCODING 28591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +1080 +01FF +0332 +44D4 +2A88 +0114 +0263 +1420 +1124 +10A8 +27FF +2070 +20A8 +4324 +4C23 +ENDCHAR +STARTCHAR U+6FB0 +ENCODING 28592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6070 +30D8 +118C +0707 +C0F8 +6000 +23DE +0252 +1252 +13DE +3000 +2104 +6104 +438E +C6DB +ENDCHAR +STARTCHAR U+6FB1 +ENCODING 28593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1FB8 +18A8 +08A8 +4FA8 +2AAC +2AC4 +0FFC +1AA8 +1AA8 +2FD0 +2B30 +54C8 +4884 +0000 +ENDCHAR +STARTCHAR U+6FB2 +ENCODING 28594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4451 +3252 +17FF +0104 +4088 +33FE +1020 +03FE +0820 +1FFF +6124 +2222 +2421 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6FB3 +ENCODING 28595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0880 +0BF8 +42E8 +2358 +22E8 +03F8 +0AE8 +0B58 +1040 +17FC +2040 +21B0 +260C +0000 +ENDCHAR +STARTCHAR U+6FB4 +ENCODING 28596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +87FC +64A4 +27FC +0000 +87FC +63F8 +2208 +03F8 +1104 +2328 +C510 +4948 +4186 +4302 +0000 +0000 +ENDCHAR +STARTCHAR U+6FB5 +ENCODING 28597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0103 +411E +6FF0 +2450 +06D0 +829F +CFF2 +4112 +0112 +2FF2 +2112 +2392 +6552 +4912 +4122 +C102 +ENDCHAR +STARTCHAR U+6FB6 +ENCODING 28598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4FFE +2000 +27FC +8514 +45F4 +4514 +17FC +1000 +23F8 +E208 +23F8 +2208 +23F8 +2000 +2FFE +ENDCHAR +STARTCHAR U+6FB8 +ENCODING 28600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4009 +33FF +1208 +03F8 +4209 +32EA +12A5 +02EB +0A01 +1200 +655A +2549 +2542 +283E +0000 +0000 +ENDCHAR +STARTCHAR U+6FB9 +ENCODING 28601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +13F0 +1C40 +47FC +24A4 +271C +04F0 +17FC +14F0 +24F0 +25F8 +4908 +49F8 +5108 +0000 +ENDCHAR +STARTCHAR U+6FBA +ENCODING 28602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +33FE +1104 +07FF +4000 +33FE +1202 +03FE +0A02 +13FE +6544 +2522 +2505 +21FC +0000 +0000 +ENDCHAR +STARTCHAR U+6FBC +ENCODING 28604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +6788 +34BE +1480 +04A2 +C4B6 +6794 +247F +0408 +2788 +2CBE +2C88 +7488 +4488 +4788 +C008 +ENDCHAR +STARTCHAR U+6FBD +ENCODING 28605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +403C +3020 +13FF +02FD +4221 +3238 +12FE +0210 +0AF3 +121C +62EC +221A +22E9 +2430 +0000 +0000 +ENDCHAR +STARTCHAR U+6FBE +ENCODING 28606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +1708 +017E +0108 +42FF +2422 +0714 +11FF +1108 +157F +2508 +237F +2108 +2188 +427F +4C00 +ENDCHAR +STARTCHAR U+6FBF +ENCODING 28607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +37DF +1104 +038E +4555 +3104 +1000 +03FE +0800 +17FF +60A8 +2124 +2623 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6FC0 +ENCODING 28608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2120 +1220 +17A0 +44A0 +27FC +24C8 +07A8 +1228 +1FE8 +1390 +2490 +24A8 +4B48 +5084 +0000 +ENDCHAR +STARTCHAR U+6FC1 +ENCODING 28609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17F0 +1550 +47F0 +2200 +23F8 +0508 +1FC8 +1548 +17C8 +2548 +21E8 +4E28 +4030 +0000 +ENDCHAR +STARTCHAR U+6FC2 +ENCODING 28610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +17FC +14D8 +47FC +24A0 +27F8 +04A8 +17FC +14A8 +27F8 +25B0 +4AA8 +4CA4 +50A0 +0000 +ENDCHAR +STARTCHAR U+6FC3 +ENCODING 28611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +0BF8 +0AA8 +43F8 +22A8 +23F8 +07FC +05F0 +1400 +17FC +2548 +2530 +49D0 +560C +0000 +ENDCHAR +STARTCHAR U+6FC4 +ENCODING 28612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +443E +3222 +17AE +012A +422A +347F +1241 +015D +0955 +1155 +615D +2243 +2500 +28FF +0000 +0000 +ENDCHAR +STARTCHAR U+6FC5 +ENCODING 28613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +67FF +3401 +15FD +0004 +C3FF +6004 +27FF +0401 +15FD +1124 +3020 +27FF +6106 +40F8 +CF8F +ENDCHAR +STARTCHAR U+6FC6 +ENCODING 28614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BF8 +0950 +07FC +4110 +23F8 +2208 +0BF8 +0A08 +13F8 +1208 +23F8 +2198 +2E04 +0000 +ENDCHAR +STARTCHAR U+6FC7 +ENCODING 28615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +63FE +3020 +1124 +0124 +C2AA +6020 +27FF +0000 +13FE +1202 +32FA +228A +62FA +4202 +C3FE +ENDCHAR +STARTCHAR U+6FC8 +ENCODING 28616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +4F16 +6912 +2910 +0F1F +8070 +DF92 +4912 +0F16 +2914 +2F1C +2988 +6F1C +5915 +4137 +C162 +ENDCHAR +STARTCHAR U+6FC9 +ENCODING 28617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4030 +2F48 +297E +89C8 +4948 +5F7E +1948 +2948 +2F7E +E948 +2948 +2948 +2F7E +2940 +2040 +ENDCHAR +STARTCHAR U+6FCA +ENCODING 28618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +113E +0120 +07FF +4014 +2012 +07FF +0412 +17F2 +1494 +15D4 +26A8 +2488 +2595 +4423 +48C1 +ENDCHAR +STARTCHAR U+6FCB +ENCODING 28619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +3104 +17DF +0104 +438E +3555 +1104 +07FE +0820 +1120 +613E +2120 +22A0 +247E +0000 +0000 +ENDCHAR +STARTCHAR U+6FCC +ENCODING 28620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +7C08 +0809 +7F7E +081C +7F2A +4949 +7F88 +497F +7F41 +087F +7F41 +087F +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+6FCD +ENCODING 28621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +37FF +1288 +03FF +4229 +34A9 +1049 +00B1 +0816 +1000 +6144 +2522 +2505 +21FC +0000 +0000 +ENDCHAR +STARTCHAR U+6FCE +ENCODING 28622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +41FC +3104 +11FC +0104 +41FC +3505 +15FD +0451 +0FDF +1050 +67DF +2451 +2451 +2851 +0000 +0000 +ENDCHAR +STARTCHAR U+6FCF +ENCODING 28623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47DF +3104 +1104 +07DF +4104 +3104 +17DF +0000 +0884 +1552 +6511 +2522 +20FE +2700 +0000 +0000 +ENDCHAR +STARTCHAR U+6FD1 +ENCODING 28625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +4420 +3F7C +2488 +8410 +5F7C +1544 +5554 +5F54 +4454 +CC54 +4E54 +5554 +6428 +4446 +4482 +ENDCHAR +STARTCHAR U+6FD2 +ENCODING 28626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +42FE +2A10 +2BA4 +0A7E +8A44 +5FD4 +0254 +2A54 +2AD4 +D354 +4254 +4410 +4828 +5046 +0182 +ENDCHAR +STARTCHAR U+6FD4 +ENCODING 28628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1FFC +12B0 +4C88 +2FF8 +2998 +0EE8 +1BA8 +1CD8 +2998 +2EE8 +4BA8 +4CD8 +4898 +0000 +ENDCHAR +STARTCHAR U+6FD5 +ENCODING 28629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +43F8 +2208 +23F8 +0110 +0EE8 +0B30 +12A8 +17FC +2348 +24A4 +28A4 +0000 +ENDCHAR +STARTCHAR U+6FD8 +ENCODING 28632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BFC +0A48 +45A8 +2294 +2474 +03F8 +0AA8 +0FFC +1000 +13F8 +2040 +2040 +20C0 +0000 +ENDCHAR +STARTCHAR U+6FDA +ENCODING 28634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +12A9 +02EA +0094 +4152 +2221 +07FF +0421 +1020 +17FF +1060 +2070 +20A8 +2124 +4222 +4C61 +ENDCHAR +STARTCHAR U+6FDB +ENCODING 28635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0FFC +0910 +43FC +22E8 +2400 +07FC +08C8 +0F68 +10F0 +1370 +20A8 +2324 +20C0 +0000 +ENDCHAR +STARTCHAR U+6FDC +ENCODING 28636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +31FC +1024 +03FE +4024 +31FC +1020 +03FE +0A52 +1000 +63FE +2252 +2252 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+6FDD +ENCODING 28637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +33FE +1088 +00F8 +40F8 +3088 +17FF +00A8 +0944 +12F2 +6429 +20FC +20A8 +2124 +0000 +0000 +ENDCHAR +STARTCHAR U+6FDE +ENCODING 28638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +43F8 +3288 +1248 +83F8 +4800 +4FFC +1444 +17FC +2444 +E7FC +2000 +2FFE +2110 +2110 +2210 +ENDCHAR +STARTCHAR U+6FDF +ENCODING 28639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +1FFC +1148 +4FB0 +25A8 +25A8 +07B8 +1A14 +13F0 +2210 +23F0 +4210 +4410 +4810 +0000 +ENDCHAR +STARTCHAR U+6FE0 +ENCODING 28640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0FFC +09F0 +4110 +21F0 +27FC +0408 +0FF8 +10C8 +1770 +23F0 +21A8 +4624 +40C0 +0000 +ENDCHAR +STARTCHAR U+6FE1 +ENCODING 28641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0840 +47FC +2758 +2358 +0040 +0FFC +0880 +13F8 +12A8 +22A8 +22A8 +22B8 +0000 +ENDCHAR +STARTCHAR U+6FE2 +ENCODING 28642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47DF +3249 +1555 +0249 +41A6 +33FE +1104 +02AA +0C71 +1020 +6FFF +2020 +2020 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+6FE3 +ENCODING 28643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +37CC +1112 +0121 +47C4 +3454 +17CC +0454 +0FCC +1104 +613F +27C4 +2104 +2104 +0000 +0000 +ENDCHAR +STARTCHAR U+6FE4 +ENCODING 28644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +17F8 +1080 +43F0 +2FFC +23E8 +0080 +13F0 +1FFC +2010 +27FC +4550 +4730 +4030 +0000 +ENDCHAR +STARTCHAR U+6FE6 +ENCODING 28646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4008 +33F0 +1124 +01FC +4020 +33FE +11FC +0004 +09FE +1004 +61FC +22A4 +228A +24F8 +0000 +0000 +ENDCHAR +STARTCHAR U+6FE7 +ENCODING 28647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4280 +2AA2 +26C2 +029F +4FE2 +2442 +2282 +07D2 +090A +1102 +6FC2 +2102 +2106 +2FE2 +0000 +0000 +ENDCHAR +STARTCHAR U+6FE8 +ENCODING 28648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +618C +3088 +17FF +0104 +C208 +6492 +230C +028A +17DF +1041 +3020 +22B2 +6293 +46C5 +C47C +ENDCHAR +STARTCHAR U+6FE9 +ENCODING 28649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +17FF +0098 +0120 +43FE +2620 +0BFE +0220 +13FE +1220 +13FE +2000 +23FE +210C +40F0 +4F0F +ENDCHAR +STARTCHAR U+6FEB +ENCODING 28651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2020 +17E0 +1520 +47BC +24C0 +2780 +0538 +17C0 +1000 +17F8 +2528 +2528 +5FFC +4000 +0000 +ENDCHAR +STARTCHAR U+6FEC +ENCODING 28652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0878 +0BFC +42E8 +2510 +2148 +02A8 +09F0 +0F1C +11F0 +11F0 +2110 +21F0 +2110 +0000 +ENDCHAR +STARTCHAR U+6FED +ENCODING 28653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +33FE +1088 +0020 +41FC +3020 +17FE +0084 +09FE +1002 +63FE +2252 +2252 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+6FEE +ENCODING 28654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2250 +1354 +12D8 +47FC +2488 +2C50 +05FC +1420 +14F8 +2420 +25FC +4420 +4450 +458C +0000 +ENDCHAR +STARTCHAR U+6FEF +ENCODING 28655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17F8 +1088 +47F8 +2088 +27F8 +0220 +13F8 +1640 +1BF0 +23F0 +2240 +43FC +4200 +0000 +ENDCHAR +STARTCHAR U+6FF0 +ENCODING 28656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4312 +6236 +2C24 +057F +8324 +C224 +44BF +0FA4 +22A4 +2224 +2ABF +6AA4 +4AA4 +4224 +C23F +ENDCHAR +STARTCHAR U+6FF1 +ENCODING 28657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BFC +0A08 +45F0 +2258 +24E4 +01F8 +0F08 +09F8 +11F8 +1108 +21F8 +2198 +2604 +0000 +ENDCHAR +STARTCHAR U+6FF2 +ENCODING 28658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +410E +37CA +110A +07CA +4FEA +3831 +1080 +031F +0901 +17D1 +638A +2544 +292A +2111 +0000 +0000 +ENDCHAR +STARTCHAR U+6FF3 +ENCODING 28659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2630 +1630 +1FFC +4A50 +3FFC +2530 +05B4 +154C +1BF0 +2210 +23F0 +4210 +43F0 +4210 +0000 +ENDCHAR +STARTCHAR U+6FF4 +ENCODING 28660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +3555 +138E +0104 +428A +3451 +17FF +0401 +0824 +13A8 +60B0 +20A8 +2124 +2663 +0000 +0000 +ENDCHAR +STARTCHAR U+6FF5 +ENCODING 28661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +67FF +3401 +13FE +0222 +C3FE +6200 +22FE +0282 +12FE +1282 +36FE +2482 +6CFE +4044 +C183 +ENDCHAR +STARTCHAR U+6FF6 +ENCODING 28662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1F78 +1948 +4F78 +2948 +2F78 +0868 +1B88 +1FF8 +2888 +2BE8 +4A28 +4BE8 +4A38 +0000 +ENDCHAR +STARTCHAR U+6FF7 +ENCODING 28663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +3EBC +02A0 +0490 +388E +4044 +31FF +1044 +407C +3010 +15FF +0955 +31BB +1113 +0000 +0000 +ENDCHAR +STARTCHAR U+6FF9 +ENCODING 28665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63FE +3222 +13FE +0222 +C3FE +6020 +23FE +0020 +17FF +1154 +3623 +21FC +6020 +47FF +C000 +ENDCHAR +STARTCHAR U+6FFA +ENCODING 28666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2050 +1F48 +195C +49E8 +2F28 +2934 +09CC +1F54 +195C +29E8 +2F28 +4614 +496C +5184 +0000 +ENDCHAR +STARTCHAR U+6FFB +ENCODING 28667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4008 +37BE +14AA +04BE +4508 +367F +153E +04A2 +0CBE +14A2 +66BE +2522 +243E +2463 +0000 +0000 +ENDCHAR +STARTCHAR U+6FFC +ENCODING 28668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +6646 +3474 +1555 +0252 +C272 +6454 +2555 +0777 +1020 +17FF +30A8 +21AC +6326 +4623 +C020 +ENDCHAR +STARTCHAR U+6FFD +ENCODING 28669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +67DF +3104 +17DF +0104 +C28A +6451 +23FE +0202 +13FE +1202 +33FE +2202 +63FE +4104 +C603 +ENDCHAR +STARTCHAR U+6FFE +ENCODING 28670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +1078 +17FC +44E8 +2788 +2478 +05F0 +1550 +15F0 +2550 +25F8 +4AA4 +4A94 +5470 +0000 +ENDCHAR +STARTCHAR U+6FFF +ENCODING 28671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3444 +15FF +0444 +44FE +3492 +14FE +0492 +0CFE +1410 +65FF +2515 +297D +2103 +0000 +0000 +ENDCHAR +STARTCHAR U+7000 +ENCODING 28672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07FF +6020 +31FC +1104 +01FC +C104 +67FF +2421 +0292 +1285 +147C +3080 +21FC +6684 +4078 +C787 +ENDCHAR +STARTCHAR U+7001 +ENCODING 28673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0FFC +0840 +41F0 +27FC +2110 +02E8 +0DF4 +0910 +11F0 +11F8 +2150 +21B0 +260C +0000 +ENDCHAR +STARTCHAR U+7004 +ENCODING 28676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4208 +33CF +1492 +0000 +47DF +3449 +17C9 +0449 +0FC9 +140E +6408 +2488 +24C8 +2708 +0000 +0000 +ENDCHAR +STARTCHAR U+7005 +ENCODING 28677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +1155 +0596 +0924 +428A +2451 +0000 +07FF +1401 +1000 +13FE +2020 +21FC +2028 +4024 +43FE +ENDCHAR +STARTCHAR U+7006 +ENCODING 28678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +17FF +0020 +03FE +43FE +2252 +03FE +1000 +13FE +1202 +23FE +2202 +23FE +23FE +4104 +4202 +ENDCHAR +STARTCHAR U+7007 +ENCODING 28679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +6020 +37FF +1448 +05FE +C448 +67FF +2420 +05FE +1522 +15FE +3522 +2D22 +69FE +5884 +C303 +ENDCHAR +STARTCHAR U+7009 +ENCODING 28681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BFC +0A88 +4738 +2208 +23B8 +0208 +0BF8 +0880 +13FC +1EA4 +2954 +2504 +2418 +0000 +ENDCHAR +STARTCHAR U+700A +ENCODING 28682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +421C +37D4 +1354 +02E7 +47FE +3342 +12D4 +024C +04D3 +1000 +63FE +2252 +2252 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+700B +ENCODING 28683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BFC +0A28 +47C8 +2150 +27FC +00E0 +0B58 +0FFC +1248 +13F8 +2248 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+700C +ENCODING 28684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +33FF +1248 +03FF +4249 +33FF +1288 +02EE +0A88 +1299 +64FF +2000 +2489 +2489 +0000 +0000 +ENDCHAR +STARTCHAR U+700D +ENCODING 28685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +63FF +3200 +12FE +0292 +C2FE +6292 +22FE +0210 +13FF +1248 +338F +2610 +64FE +4C10 +C1FF +ENDCHAR +STARTCHAR U+700E +ENCODING 28686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4084 +33FF +1084 +03FF +4249 +3249 +13FF +0014 +0BFF +1210 +63D4 +2208 +2215 +2422 +0000 +0000 +ENDCHAR +STARTCHAR U+700F +ENCODING 28687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2208 +1FC8 +1D68 +4B68 +3EE8 +2228 +0528 +1FE8 +1228 +2FE8 +2AA8 +4708 +4388 +4E18 +0000 +ENDCHAR +STARTCHAR U+7011 +ENCODING 28689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17F0 +1410 +47F0 +2410 +27F0 +0FF8 +1220 +1FFC +26B0 +39CC +42B0 +4C88 +4180 +0000 +ENDCHAR +STARTCHAR U+7014 +ENCODING 28692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +410E +2FEA +210A +07CB +400B +2FEB +2830 +0BAF +07C9 +1109 +67C6 +2386 +2549 +2931 +0000 +0000 +ENDCHAR +STARTCHAR U+7015 +ENCODING 28693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +12FC +1A10 +4BA0 +2A78 +3FC8 +0378 +16C8 +16F8 +2F48 +2978 +4230 +4448 +4984 +0000 +ENDCHAR +STARTCHAR U+7016 +ENCODING 28694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3020 +17FF +0529 +44A5 +3110 +13FE +0110 +09FE +1110 +61FE +2110 +21FE +2100 +0000 +0000 +ENDCHAR +STARTCHAR U+7017 +ENCODING 28695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4FFE +6842 +2BFA +0040 +83F8 +C040 +4FFE +0000 +27FC +2494 +27FC +6040 +4522 +4D0B +D8F9 +ENDCHAR +STARTCHAR U+7018 +ENCODING 28696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +1078 +17FC +44C8 +2778 +25F0 +0550 +15F0 +1550 +25F0 +27F8 +4AA8 +57FC +4000 +0000 +ENDCHAR +STARTCHAR U+7019 +ENCODING 28697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4200 +223E +3FE2 +08A2 +453E +2FA2 +2222 +0FBE +0222 +1722 +6ABE +2215 +2225 +2247 +0000 +0000 +ENDCHAR +STARTCHAR U+701A +ENCODING 28698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2420 +1420 +1F50 +4450 +2E88 +2B04 +0FF8 +1A48 +1ED8 +2568 +3ED8 +4568 +4448 +44D8 +0000 +ENDCHAR +STARTCHAR U+701B +ENCODING 28699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +1FFC +1200 +41F8 +27F0 +2410 +07F0 +1EB8 +1BE8 +2F68 +2B78 +4EBC +4AEC +5744 +0000 +ENDCHAR +STARTCHAR U+701C +ENCODING 28700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17C4 +0004 +07DF +4455 +27D5 +0015 +1FFF +1AB5 +1AA4 +2CE4 +2824 +2FE5 +2927 +4939 +4860 +ENDCHAR +STARTCHAR U+701D +ENCODING 28701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17FC +15F8 +4490 +27FC +25F8 +06D4 +1440 +1540 +2578 +2540 +4940 +4FFC +5000 +0000 +ENDCHAR +STARTCHAR U+701E +ENCODING 28702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2420 +1F20 +1478 +4F90 +2420 +3FF8 +0028 +1FFC +1928 +2FF8 +2928 +4F20 +4920 +4B60 +0000 +ENDCHAR +STARTCHAR U+701F +ENCODING 28703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1FFC +12A0 +47F0 +2090 +3FFC +07F0 +1AA8 +1EB8 +2FF8 +2888 +4EB8 +4AA8 +52A8 +0000 +ENDCHAR +STARTCHAR U+7020 +ENCODING 28704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +6555 +3555 +128A +0451 +C000 +67FF +2421 +0445 +1188 +1052 +37FF +2021 +6124 +4326 +C623 +ENDCHAR +STARTCHAR U+7021 +ENCODING 28705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4F10 +293F +2A90 +0C5F +4AE4 +293F +295F +0991 +095F +1951 +6D5F +2A51 +28D3 +293F +0000 +0000 +ENDCHAR +STARTCHAR U+7022 +ENCODING 28706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4008 +343E +122A +003E +477F +313E +1122 +023E +0922 +113E +6122 +223E +2541 +28FF +0000 +0000 +ENDCHAR +STARTCHAR U+7023 +ENCODING 28707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +43BC +3224 +17A8 +8490 +4AA8 +4146 +12A0 +17BC +20A0 +E7BC +20A0 +27BC +20A0 +2FFE +2000 +ENDCHAR +STARTCHAR U+7024 +ENCODING 28708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +37FF +1000 +03FE +4252 +33FE +1020 +03AE +0FAF +1000 +6294 +2488 +28A4 +21C3 +0000 +0000 +ENDCHAR +STARTCHAR U+7026 +ENCODING 28710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2020 +1F20 +12F8 +4228 +26B0 +2AFC +0320 +1778 +1BC8 +22F8 +26C8 +5A48 +4278 +4C48 +0000 +ENDCHAR +STARTCHAR U+7027 +ENCODING 28711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2240 +1278 +1FC0 +4578 +2508 +3FF8 +0040 +0F78 +1940 +1F78 +2940 +2F78 +4944 +4B3C +0000 +ENDCHAR +STARTCHAR U+7028 +ENCODING 28712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +113E +07D2 +0112 +412C +27C0 +055E +1552 +155E +17D2 +211E +2392 +255E +2500 +4912 +4121 +ENDCHAR +STARTCHAR U+7029 +ENCODING 28713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +405F +3784 +1108 +07DF +4111 +3391 +155F +0111 +0A9F +1291 +6291 +229F +24CA +28D1 +0000 +0000 +ENDCHAR +STARTCHAR U+702A +ENCODING 28714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FA0 +3F7F +5514 +3F88 +1514 +1FA3 +0FF8 +0808 +0FF8 +0FF8 +1FFC +02A0 +0490 +788F +0000 +0000 +ENDCHAR +STARTCHAR U+702B +ENCODING 28715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +2FEE +210A +07CB +4FF3 +2820 +2BAF +0109 +0A49 +1789 +610A +2FE4 +254A +2931 +0000 +0000 +ENDCHAR +STARTCHAR U+702C +ENCODING 28716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +127C +1F90 +4278 +2FC8 +2AF8 +0AC8 +0FF8 +1248 +1778 +26B0 +2AA8 +5244 +4284 +0000 +ENDCHAR +STARTCHAR U+702F +ENCODING 28719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +12A9 +02EA +0094 +4152 +2221 +07FF +0401 +11FC +1104 +11FC +2040 +23FE +2202 +4202 +43FE +ENDCHAR +STARTCHAR U+7030 +ENCODING 28720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1FFC +12A8 +4324 +2FFC +296C +09FC +1F6C +1BB4 +236C +23FC +436C +43B4 +4D2C +0000 +ENDCHAR +STARTCHAR U+7031 +ENCODING 28721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +3489 +17FF +0000 +47FF +3440 +1551 +04E1 +0CA5 +1515 +6555 +24E5 +28A1 +2113 +0000 +0000 +ENDCHAR +STARTCHAR U+7032 +ENCODING 28722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1220 +1320 +44A0 +27FC +2848 +0FE8 +1B68 +1B68 +2FD0 +2490 +44A8 +4B68 +5244 +0000 +ENDCHAR +STARTCHAR U+7033 +ENCODING 28723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +37FF +10A8 +07FF +4450 +35FE +1452 +07FE +0D00 +15FE +65FF +2555 +2A55 +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+7034 +ENCODING 28724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +63DE +3252 +13DE +0252 +C3DE +6252 +23DE +0154 +1222 +1080 +37FF +2104 +63C8 +407C +C3C6 +ENDCHAR +STARTCHAR U+7035 +ENCODING 28725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4248 +2FFE +2150 +8248 +4FFE +4444 +17FC +1444 +27FC +E110 +27FC +2110 +2FFE +2208 +2404 +ENDCHAR +STARTCHAR U+7037 +ENCODING 28727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27FE +114A +0252 +0CE6 +434A +23FE +0222 +03FE +1222 +13FE +1088 +23FE +2088 +2FFF +4104 +4202 +ENDCHAR +STARTCHAR U+7038 +ENCODING 28728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4249 +3248 +15A8 +0008 +47FF +3148 +1369 +0149 +0B6A +114C +6368 +2159 +27F5 +2003 +0000 +0000 +ENDCHAR +STARTCHAR U+7039 +ENCODING 28729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4140 +2220 +2410 +8BEE +5004 +4FFC +1924 +2FFC +2000 +EFFC +2924 +2924 +2FFC +2924 +280C +ENDCHAR +STARTCHAR U+703A +ENCODING 28730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +41F8 +3210 +13FE +0202 +43FE +31EE +1108 +01FE +0A10 +13FE +6222 +23FE +2095 +231F +0000 +0000 +ENDCHAR +STARTCHAR U+703B +ENCODING 28731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +408A +33E9 +1088 +07FF +43E8 +32A8 +13E8 +02A8 +0BE8 +1148 +63E9 +214A +27F5 +222B +0000 +0000 +ENDCHAR +STARTCHAR U+703C +ENCODING 28732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +67FF +3000 +13DE +0252 +C3DE +6088 +23FE +0088 +13FE +1088 +37FF +20C8 +638A +40E4 +C383 +ENDCHAR +STARTCHAR U+703E +ENCODING 28734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1F78 +1948 +4F78 +2948 +2FF8 +0FF8 +1BE8 +1BE8 +2AA8 +2BE8 +49C8 +4EB8 +4898 +0000 +ENDCHAR +STARTCHAR U+703F +ENCODING 28735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4408 +37DF +1D62 +07CA +4544 +37CB +1020 +00C8 +0BF0 +1020 +6044 +27FE +2124 +2262 +0000 +0000 +ENDCHAR +STARTCHAR U+7040 +ENCODING 28736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +37FF +1020 +07FF +4525 +34A9 +1104 +008F +0FE9 +118F +62C9 +24AF +2089 +208F +0000 +0000 +ENDCHAR +STARTCHAR U+7041 +ENCODING 28737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47DF +3451 +17DF +0451 +07DF +4441 +34F9 +14F9 +0C89 +14F9 +6421 +25FD +24A9 +2525 +0000 +0000 +ENDCHAR +STARTCHAR U+7042 +ENCODING 28738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4002 +33FC +1122 +07FF +4489 +37FF +1000 +07C2 +0C42 +17FF +6442 +27D2 +258A +2646 +0000 +0000 +ENDCHAR +STARTCHAR U+7043 +ENCODING 28739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1249 +D75D +7249 +175D +1249 +D75D +7249 +1FFF +0000 +2FFE +2000 +27FC +6404 +47FC +4110 +DFFF +ENDCHAR +STARTCHAR U+7044 +ENCODING 28740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07FE +6108 +31F8 +1108 +01F8 +C10E +67F8 +2008 +0FFF +1492 +179E +3492 +279E +6492 +5FBE +C082 +ENDCHAR +STARTCHAR U+7045 +ENCODING 28741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +41FC +3124 +11FC +0124 +01FC +47DF +3555 +17DF +0555 +0FDF +1020 +63FE +2020 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+7046 +ENCODING 28742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4104 +37DF +1104 +07D0 +4490 +37DF +1460 +07C0 +0C8E +17C0 +63FE +2252 +2252 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+7048 +ENCODING 28744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07DF +6451 +37DF +1451 +07DF +C451 +67DF +2088 +0110 +13FF +1620 +33FE +2220 +63FE +4220 +C3FF +ENDCHAR +STARTCHAR U+7049 +ENCODING 28745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A92 +8A96 +D514 +553F +0AA4 +8AE4 +C024 +4FBF +08A4 +2FA4 +2024 +2FBF +6AA4 +4FA4 +4864 +C7BF +ENDCHAR +STARTCHAR U+704A +ENCODING 28746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +4FBE +6514 +2514 +0FBF +830C +C595 +4927 +0000 +2FFF +2204 +27FE +6492 +471E +44E2 +C44E +ENDCHAR +STARTCHAR U+704B +ENCODING 28747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +67FF +3490 +17FE +0492 +C7FE +6500 +25FF +0401 +1555 +1623 +35FC +2420 +67FE +4884 +C1FA +ENDCHAR +STARTCHAR U+704C +ENCODING 28748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +0FFC +08A0 +43B8 +22A8 +23B8 +0120 +13FC +1640 +1BF8 +23F8 +2240 +43FC +4200 +0000 +ENDCHAR +STARTCHAR U+704E +ENCODING 28750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A08 +BF88 +6ABE +3F88 +2A88 +BFFF +4010 +3FB2 +0027 +5F79 +5100 +513E +DF2A +8A2A +8FAA +B87F +ENDCHAR +STARTCHAR U+704F +ENCODING 28751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4004 +3F7E +3110 +9F24 +517E +5F44 +0454 +3F54 +2054 +5F54 +D154 +5F54 +4420 +5528 +6446 +4C82 +ENDCHAR +STARTCHAR U+7050 +ENCODING 28752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +1155 +0596 +0924 +428A +2451 +07FF +0461 +1090 +130C +1DF3 +2040 +27FC +2248 +4150 +47FE +ENDCHAR +STARTCHAR U+7051 +ENCODING 28753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +1F7C +1000 +4F78 +2DE8 +2FFC +0940 +1FF8 +1948 +2FF8 +2BC8 +4A70 +53C4 +6C3C +0000 +ENDCHAR +STARTCHAR U+7052 +ENCODING 28754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +414A +31EF +1042 +01EF +414A +3063 +10FE +0082 +08FE +1082 +60FE +2082 +20FE +2101 +0000 +0000 +ENDCHAR +STARTCHAR U+7054 +ENCODING 28756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0280 +4FE7 +6AA9 +2FF2 +0AA4 +8FFF +C015 +4FF5 +0015 +27DF +2450 +2450 +67D0 +4291 +43F1 +CE0F +ENDCHAR +STARTCHAR U+7055 +ENCODING 28757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0209 +820B +5FCA +401F +1574 +9254 +5554 +5FDE +0214 +5FD4 +5454 +555E +5ED4 +D054 +9054 +90DF +ENDCHAR +STARTCHAR U+7056 +ENCODING 28758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +31FF +1144 +01EF +4144 +31EE +1145 +0128 +09EF +1128 +61EF +2128 +22EF +2048 +0000 +0000 +ENDCHAR +STARTCHAR U+7057 +ENCODING 28759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4008 +307F +127F +025D +4FD5 +2ADD +2AFF +0ABE +0FA2 +123E +62A2 +2FBE +2022 +207F +0000 +0000 +ENDCHAR +STARTCHAR U+7058 +ENCODING 28760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2528 +1528 +1FB0 +457C +2FD0 +2AD0 +0FFC +1250 +1FD0 +227C +2FD0 +4350 +44FC +5840 +0000 +ENDCHAR +STARTCHAR U+705A +ENCODING 28762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4106 +3252 +1326 +0252 +4326 +3252 +17FF +05FD +0D05 +11F4 +61F4 +21FC +2091 +271F +0000 +0000 +ENDCHAR +STARTCHAR U+705B +ENCODING 28763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47DF +3451 +17DF +0451 +47DF +35DD +1555 +05DD +0CF9 +14F9 +64A9 +24F9 +25FD +2427 +0000 +0000 +ENDCHAR +STARTCHAR U+705D +ENCODING 28765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17DF +0444 +07C8 +445E +27D2 +0112 +1FFE +1012 +17D2 +145E +27D2 +2112 +255E +4932 +4321 +ENDCHAR +STARTCHAR U+705E +ENCODING 28766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FC +2040 +2FFE +0A4A +9540 +4FBC +4524 +1724 +123C +2FA4 +EAA4 +2FBC +2224 +3FE4 +2254 +2288 +ENDCHAR +STARTCHAR U+705F +ENCODING 28767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +3202 +13FE +0298 +4254 +32FE +12AA +02FE +0BFF +12FD +62A5 +22FD +2421 +20FF +0000 +0000 +ENDCHAR +STARTCHAR U+7060 +ENCODING 28768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47C8 +350F +17D2 +045F +47D3 +3515 +17DF +03FE +0A02 +13FA +63FA +23FF +2109 +220F +0000 +0000 +ENDCHAR +STARTCHAR U+7061 +ENCODING 28769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4088 +37FF +1088 +078F +4489 +378F +1489 +07AF +04F9 +1421 +65FD +2575 +25FD +24AB +0000 +0000 +ENDCHAR +STARTCHAR U+7062 +ENCODING 28770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +31FF +10FE +0092 +40FE +31FF +11EF +00AA +08EE +10FE +6028 +21FF +20CA +2067 +0000 +0000 +ENDCHAR +STARTCHAR U+7063 +ENCODING 28771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +24C8 +17EC +1A14 +44C8 +2EDC +25E8 +0F3C +1DEC +17F0 +2010 +27F0 +47F8 +4808 +40F0 +0000 +ENDCHAR +STARTCHAR U+7064 +ENCODING 28772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08C4 +9008 +55FA +4804 +12C9 +BE1F +4AC5 +4804 +1CEE +2AB5 +48E4 +4040 +5FFF +C0E0 +875C +9C47 +ENDCHAR +STARTCHAR U+7065 +ENCODING 28773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0FF0 +0810 +0FF0 +0106 +7DCC +1930 +E30F +1010 +7E7E +4242 +7E7E +1111 +F6F6 +3C3C +D2D3 +ENDCHAR +STARTCHAR U+7066 +ENCODING 28774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4FDF +2844 +2FCF +0849 +4FC9 +244F +2AA9 +0EE9 +044F +2AA9 +4EE9 +400F +4AA6 +4AA9 +0000 +0000 +ENDCHAR +STARTCHAR U+7068 +ENCODING 28776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4210 +2F9E +2534 +0F88 +401C +2FAA +28BE +0FBE +08A2 +1FBE +623E +2FA2 +223E +2241 +0000 +0000 +ENDCHAR +STARTCHAR U+7069 +ENCODING 28777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2384 +1FE4 +0BBF +0FE4 +0BA4 +4FFF +2FE4 +1009 +0FFF +07C0 +0C5E +17D6 +229A +4FFF +0000 +0000 +ENDCHAR +STARTCHAR U+706A +ENCODING 28778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +27DF +1555 +0FFF +0481 +4553 +26B4 +1559 +06B2 +07F4 +0A29 +13C2 +2624 +43E8 +0000 +0000 +ENDCHAR +STARTCHAR U+706B +ENCODING 28779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0108 +1108 +1110 +1120 +2180 +2280 +0240 +0440 +0420 +0810 +1008 +6004 +0000 +ENDCHAR +STARTCHAR U+706C +ENCODING 28780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +4888 +4444 +4442 +8002 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+706D +ENCODING 28781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0100 +0100 +1108 +1118 +1120 +2140 +0280 +0280 +0440 +0420 +0810 +100E +6004 +0000 +ENDCHAR +STARTCHAR U+706E +ENCODING 28782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1104 +138C +3298 +26C0 +0C60 +3838 +E44F +0440 +0440 +0440 +0C40 +0840 +1841 +3063 +E03E +ENDCHAR +STARTCHAR U+706F +ENCODING 28783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +0A20 +2A20 +2C20 +2820 +4820 +0820 +0C20 +1220 +1220 +2020 +4060 +0000 +ENDCHAR +STARTCHAR U+7070 +ENCODING 28784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1000 +1080 +1088 +1288 +1290 +14A0 +1080 +1140 +2140 +2220 +4C10 +300C +0000 +ENDCHAR +STARTCHAR U+7071 +ENCODING 28785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +08FF +0811 +2A11 +2C11 +2811 +2811 +4811 +0811 +1421 +1241 +2282 +4114 +4008 +0000 +0000 +ENDCHAR +STARTCHAR U+7074 +ENCODING 28788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0802 +087F +4A08 +4908 +4908 +0808 +0808 +0808 +0808 +1408 +2208 +417F +4100 +0000 +0000 +ENDCHAR +STARTCHAR U+7075 +ENCODING 28789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0008 +3FF8 +0008 +7FF8 +0108 +0100 +2108 +1918 +0AA0 +0280 +0440 +0830 +300E +C004 +ENDCHAR +STARTCHAR U+7076 +ENCODING 28790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +1240 +5440 +5848 +53FC +9040 +1040 +1040 +1040 +2840 +2440 +4444 +87FE +0000 +ENDCHAR +STARTCHAR U+7078 +ENCODING 28792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +03C0 +0C80 +3180 +0240 +0D30 +710C +0110 +1110 +12A0 +2240 +0420 +1810 +600C +0000 +ENDCHAR +STARTCHAR U+707A +ENCODING 28794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1090 +1090 +5890 +55FF +5091 +5091 +1092 +1090 +1090 +1080 +2881 +4481 +427F +0000 +0000 +ENDCHAR +STARTCHAR U+707C +ENCODING 28796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0880 +0AF8 +2A88 +2D08 +2988 +4A48 +0848 +0808 +1408 +1208 +2208 +4030 +0000 +ENDCHAR +STARTCHAR U+707D +ENCODING 28797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0888 +1110 +2220 +1110 +0888 +0100 +0108 +1108 +1290 +2280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+707E +ENCODING 28798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4002 +8104 +0100 +1110 +1118 +1120 +2140 +0280 +0280 +0440 +0830 +100E +6004 +ENDCHAR +STARTCHAR U+707F +ENCODING 28799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1420 +5420 +5924 +5124 +9124 +1124 +1124 +1124 +2924 +2524 +4524 +81FC +0104 +ENDCHAR +STARTCHAR U+7080 +ENCODING 28800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13F8 +1010 +1420 +5440 +5884 +53FE +90A4 +10A4 +10A4 +1924 +2544 +2244 +4484 +8128 +0010 +ENDCHAR +STARTCHAR U+7081 +ENCODING 28801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +0840 +0840 +0840 +FFFF +0080 +0180 +0340 +0641 +1C63 +F03E +0000 +2444 +6666 +C223 +ENDCHAR +STARTCHAR U+7082 +ENCODING 28802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0844 +2A42 +2A81 +2D01 +2810 +4810 +0810 +0820 +0844 +1482 +13FF +2201 +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+7083 +ENCODING 28803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0808 +7007 +1FF8 +0208 +0448 +0830 +0080 +0490 +02A0 +01C0 +0220 +0410 +780F +0000 +0000 +ENDCHAR +STARTCHAR U+7084 +ENCODING 28804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FC +0824 +2A24 +2A24 +2C24 +2824 +49FF +0824 +0824 +0824 +1424 +1224 +21FF +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+7085 +ENCODING 28805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1FF0 +1010 +1FF0 +0100 +0108 +0918 +0AA0 +12C0 +2440 +0420 +0810 +100E +6004 +ENDCHAR +STARTCHAR U+7086 +ENCODING 28806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +15FF +5444 +5444 +D044 +906C +1028 +1038 +3810 +2838 +2C28 +646C +40C6 +C183 +ENDCHAR +STARTCHAR U+7089 +ENCODING 28809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0800 +0AF8 +2A88 +2C88 +2888 +48F8 +0888 +0880 +1500 +1300 +2200 +4400 +0000 +ENDCHAR +STARTCHAR U+708A +ENCODING 28810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +0A40 +2AFC +2CA8 +2930 +4A20 +0820 +0C60 +1250 +1290 +2108 +4204 +0000 +ENDCHAR +STARTCHAR U+708E +ENCODING 28814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0910 +0920 +1300 +02C0 +0C30 +3108 +0110 +1110 +1320 +2280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+7091 +ENCODING 28817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +2A12 +2BFF +2C10 +2810 +4838 +0854 +0892 +0911 +1410 +1210 +2010 +4010 +0000 +0000 +ENDCHAR +STARTCHAR U+7092 +ENCODING 28818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +0AB0 +2AA8 +2CA8 +28A4 +492C +0868 +0C10 +1220 +1240 +2180 +4600 +0000 +ENDCHAR +STARTCHAR U+7093 +ENCODING 28819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0824 +0814 +4A04 +4924 +4814 +0804 +0804 +087F +0804 +1404 +2204 +4104 +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+7094 +ENCODING 28820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1240 +5648 +59FC +5048 +9048 +1048 +17FE +2840 +2840 +24A0 +44A0 +4110 +820E +0404 +ENDCHAR +STARTCHAR U+7095 +ENCODING 28821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +1044 +17FE +5400 +5810 +51F8 +9110 +1110 +1110 +1110 +2910 +2512 +4212 +820E +0400 +ENDCHAR +STARTCHAR U+7096 +ENCODING 28822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1044 +17FE +5440 +5A48 +5248 +9248 +1248 +13F8 +1048 +2840 +2442 +4442 +803E +0000 +ENDCHAR +STARTCHAR U+7097 +ENCODING 28823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FFFF +0820 +0820 +0FE0 +0100 +0100 +1104 +110C +3398 +2280 +06C0 +0C60 +3838 +E00F +ENDCHAR +STARTCHAR U+7098 +ENCODING 28824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +10F0 +1080 +1480 +1880 +50FF +5084 +5084 +1084 +1084 +1084 +1084 +2884 +2904 +4904 +4204 +ENDCHAR +STARTCHAR U+7099 +ENCODING 28825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +03F8 +0D10 +34A0 +02C0 +0700 +7908 +0908 +0910 +1120 +2280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+709A +ENCODING 28826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7821 +4922 +4924 +4A28 +4A20 +7C20 +4820 +4850 +4850 +4888 +7888 +0104 +0202 +0401 +ENDCHAR +STARTCHAR U+709B +ENCODING 28827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1104 +138C +3298 +26C0 +0C60 +3838 +E00F +0240 +0640 +0C46 +387C +E840 +0841 +0863 +083E +ENDCHAR +STARTCHAR U+709C +ENCODING 28828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1044 +17FE +5440 +5848 +53FC +9040 +1044 +17FE +1044 +2844 +2454 +4448 +8040 +0040 +ENDCHAR +STARTCHAR U+709D +ENCODING 28829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +14A0 +5510 +5910 +520E +95F4 +1910 +1110 +1110 +2950 +2524 +4504 +80FC +0000 +ENDCHAR +STARTCHAR U+709F +ENCODING 28831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0802 +08FF +2A82 +2A82 +2CFE +4882 +0882 +0882 +08FE +1482 +1200 +2002 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+70A1 +ENCODING 28833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1010 +1410 +1810 +5010 +5090 +509F +1090 +1090 +1090 +1090 +2890 +2890 +2BFF +4000 +ENDCHAR +STARTCHAR U+70A4 +ENCODING 28836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1022 +1022 +1442 +5842 +5084 +5118 +1600 +11FE +1102 +1102 +2902 +2502 +25FE +4102 +ENDCHAR +STARTCHAR U+70A9 +ENCODING 28841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0828 +2A44 +2A82 +2D01 +2878 +4800 +09FE +0802 +0804 +1488 +1250 +2020 +4010 +0000 +0000 +ENDCHAR +STARTCHAR U+70AB +ENCODING 28843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1004 +17FE +5440 +5840 +5080 +9108 +13F0 +1020 +1040 +2880 +2508 +4204 +47FC +8004 +ENDCHAR +STARTCHAR U+70AC +ENCODING 28844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0900 +0B00 +2BF8 +2D08 +2908 +4908 +09F8 +0D08 +1300 +1300 +21FC +4100 +0000 +ENDCHAR +STARTCHAR U+70AD +ENCODING 28845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1FF0 +0000 +1FFC +1080 +1088 +1488 +1550 +2940 +2220 +4410 +180C +0000 +ENDCHAR +STARTCHAR U+70AE +ENCODING 28846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0A80 +0AF8 +2D08 +29E8 +2B28 +4928 +09E8 +0D30 +1300 +1304 +2104 +40FC +0000 +ENDCHAR +STARTCHAR U+70AF +ENCODING 28847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1208 +1608 +36E8 +3AA8 +32A8 +52A8 +12A8 +1AE8 +16A8 +2608 +2208 +4218 +0000 +ENDCHAR +STARTCHAR U+70B0 +ENCODING 28848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1FFC +3004 +7FC4 +C044 +0044 +3FCC +2008 +2038 +2001 +3003 +1FFE +0000 +2444 +6666 +C223 +ENDCHAR +STARTCHAR U+70B1 +ENCODING 28849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0200 +0420 +0810 +3FF8 +0000 +1FF0 +1010 +1010 +1FF0 +0108 +1110 +1120 +2280 +0C60 +701C +ENDCHAR +STARTCHAR U+70B3 +ENCODING 28851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0840 +0A40 +2BF8 +2D48 +2948 +4968 +0998 +0D98 +1308 +1308 +2108 +4118 +0000 +ENDCHAR +STARTCHAR U+70B4 +ENCODING 28852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +15FC +5524 +5524 +D124 +9124 +17FF +1050 +3850 +2858 +2CC8 +648C +4186 +C303 +ENDCHAR +STARTCHAR U+70B5 +ENCODING 28853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +2A7E +2A44 +2CC4 +2828 +4810 +0828 +0844 +0993 +1408 +1224 +2010 +400C +0000 +0000 +ENDCHAR +STARTCHAR U+70B7 +ENCODING 28855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1024 +13FE +5420 +5420 +5820 +9028 +11FC +1020 +1020 +2820 +2420 +4424 +43FE +8000 +ENDCHAR +STARTCHAR U+70B8 +ENCODING 28856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +0A80 +0AFC +2D40 +2940 +2A78 +4840 +0840 +0C78 +1240 +1240 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+70B9 +ENCODING 28857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +01F8 +0100 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+70BA +ENCODING 28858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +0900 +3FE0 +0220 +0240 +07F0 +0410 +0FFC +0804 +1544 +32A4 +4AA4 +0818 +0000 +ENDCHAR +STARTCHAR U+70BB +ENCODING 28859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +17FE +1040 +5440 +5480 +5880 +9108 +13FC +1508 +1108 +2908 +2508 +4508 +41F8 +8108 +ENDCHAR +STARTCHAR U+70BC +ENCODING 28860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +17FC +1480 +58A0 +57F0 +5120 +9120 +1224 +13FE +1020 +28A8 +2526 +4222 +84A0 +0040 +ENDCHAR +STARTCHAR U+70BD +ENCODING 28861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +11FC +1508 +5908 +5108 +5108 +9108 +11F8 +1108 +1000 +2890 +2588 +420C +8404 +0000 +ENDCHAR +STARTCHAR U+70BE +ENCODING 28862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +08FF +2A82 +2A82 +2C82 +2882 +48FE +0828 +0828 +0828 +1429 +1249 +2089 +430F +0000 +0000 +ENDCHAR +STARTCHAR U+70C0 +ENCODING 28864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +13E0 +1020 +5524 +54AC +58B0 +9024 +17FE +1020 +1020 +2820 +2420 +4420 +40A0 +8040 +ENDCHAR +STARTCHAR U+70C1 +ENCODING 28865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +13E0 +1600 +5A20 +5220 +5224 +93FE +1020 +1020 +10A8 +2924 +2622 +4422 +80A0 +0040 +ENDCHAR +STARTCHAR U+70C2 +ENCODING 28866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1108 +1090 +54A0 +5804 +57FE +5000 +9000 +1008 +13FC +1000 +2800 +2400 +4004 +8FFE +0000 +ENDCHAR +STARTCHAR U+70C3 +ENCODING 28867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FC +1008 +1410 +5820 +5058 +5186 +9602 +1008 +11FC +1020 +2820 +2420 +4024 +87FE +0000 +ENDCHAR +STARTCHAR U+70C5 +ENCODING 28869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1040 +5480 +5902 +53FF +5252 +5252 +1252 +1252 +1252 +2A52 +2652 +47FF +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+70C6 +ENCODING 28870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +108F +5120 +5440 +549F +5982 +3282 +1082 +1082 +1082 +2882 +2482 +448A +4084 +0000 +0000 +ENDCHAR +STARTCHAR U+70C7 +ENCODING 28871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0828 +4844 +4A82 +4D01 +48FE +2810 +0810 +0810 +08FE +1410 +1210 +2010 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+70C8 +ENCODING 28872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F88 +0848 +0F48 +1148 +2948 +0648 +0448 +1808 +6018 +1490 +1248 +2244 +4004 +0000 +ENDCHAR +STARTCHAR U+70CA +ENCODING 28874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1110 +10A0 +1408 +57FC +5840 +5048 +93FC +1040 +1044 +17FE +2840 +2440 +4440 +4040 +8040 +ENDCHAR +STARTCHAR U+70CB +ENCODING 28875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1040 +17FC +30E0 +50E0 +1150 +1248 +1444 +1040 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+70CD +ENCODING 28877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1120 +1124 +55FE +5920 +5220 +5022 +17FF +1050 +1050 +1050 +2850 +2491 +4511 +421F +0000 +0000 +ENDCHAR +STARTCHAR U+70CE +ENCODING 28878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E3E +0808 +0808 +7F7F +0808 +0808 +0888 +0080 +2082 +188C +0140 +0220 +0410 +780F +0000 +0000 +ENDCHAR +STARTCHAR U+70CF +ENCODING 28879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +0FE0 +0820 +0820 +0FE0 +0800 +0FFC +0800 +0FF8 +2948 +24A8 +2408 +4030 +0000 +ENDCHAR +STARTCHAR U+70D1 +ENCODING 28881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +1028 +1129 +15AB +54AE +5428 +D028 +9028 +102E +10EB +39A9 +2828 +2C68 +6449 +40C9 +C187 +ENDCHAR +STARTCHAR U+70D2 +ENCODING 28882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +1009 +13FF +5008 +5408 +5BE8 +5088 +1088 +1088 +1089 +2BE9 +2405 +4403 +4001 +0000 +0000 +ENDCHAR +STARTCHAR U+70D3 +ENCODING 28883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +10FE +1410 +5410 +5410 +D1FF +9000 +1010 +1010 +38FE +2C10 +2410 +6010 +43FF +C000 +ENDCHAR +STARTCHAR U+70D4 +ENCODING 28884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1102 +1502 +557A +5502 +D102 +917A +114A +114A +394A +297A +2D02 +6502 +4102 +C10E +ENDCHAR +STARTCHAR U+70D5 +ENCODING 28885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +004C +0044 +7FFF +4040 +5F40 +4044 +4464 +54AC +5528 +4438 +4E10 +4B39 +D96D +B0C7 +8182 +ENDCHAR +STARTCHAR U+70D6 +ENCODING 28886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +7F26 +0822 +0820 +FFFF +0020 +0822 +48B2 +4996 +CB14 +9C1C +1608 +331D +6077 +C3C2 +ENDCHAR +STARTCHAR U+70D7 +ENCODING 28887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1012 +53FF +5420 +5444 +5888 +31F2 +1024 +1048 +1090 +2928 +2444 +4482 +4101 +0000 +0000 +ENDCHAR +STARTCHAR U+70D8 +ENCODING 28888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1090 +1090 +1090 +57FC +5890 +5090 +9090 +1090 +1094 +17FE +2800 +2490 +4488 +810C +0204 +ENDCHAR +STARTCHAR U+70D9 +ENCODING 28889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0878 +0A88 +2AD0 +2D50 +2820 +48D8 +0BFC +0C88 +1288 +1288 +20F8 +4088 +0000 +ENDCHAR +STARTCHAR U+70DA +ENCODING 28890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0828 +4844 +4A82 +4D01 +48FE +2800 +08FE +0882 +0882 +1482 +1282 +20FE +4082 +0000 +0000 +ENDCHAR +STARTCHAR U+70DB +ENCODING 28891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1224 +55FE +5924 +5124 +9124 +1124 +11FC +1124 +2820 +2424 +443C +83E2 +0102 +ENDCHAR +STARTCHAR U+70DC +ENCODING 28892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FE +1000 +1400 +55FC +5504 +D104 +91FC +1104 +1104 +3904 +2DFC +2400 +6000 +47FF +C000 +ENDCHAR +STARTCHAR U+70DD +ENCODING 28893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0040 +0188 +3F48 +0550 +0920 +1110 +630C +1FF0 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+70DE +ENCODING 28894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +1084 +53E4 +5484 +5886 +31C5 +12A4 +1494 +1084 +2884 +2484 +4484 +4084 +0000 +0000 +ENDCHAR +STARTCHAR U+70DF +ENCODING 28895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0948 +0B48 +2B48 +2DF8 +2948 +4948 +0968 +0D98 +1398 +1308 +21F8 +4108 +0000 +ENDCHAR +STARTCHAR U+70E0 +ENCODING 28896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +5020 +5440 +58FE +5142 +127E +1042 +107E +1042 +2842 +448A +4404 +0000 +0000 +ENDCHAR +STARTCHAR U+70E1 +ENCODING 28897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +188C +0140 +0220 +7C1F +0410 +3FFE +0410 +0410 +7FFF +0808 +1004 +6003 +0000 +0000 +ENDCHAR +STARTCHAR U+70E2 +ENCODING 28898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +17FF +5C01 +5405 +51F8 +5040 +1040 +17FF +1040 +2840 +2441 +4441 +407F +0000 +0000 +ENDCHAR +STARTCHAR U+70E4 +ENCODING 28900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1088 +13F8 +5490 +58A4 +53FE +9080 +1108 +13FC +1480 +19F8 +2808 +2408 +4510 +8090 +0060 +ENDCHAR +STARTCHAR U+70E6 +ENCODING 28902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1040 +1488 +59FC +5108 +5128 +9128 +1128 +1148 +1148 +2948 +2480 +4490 +810C +0204 +ENDCHAR +STARTCHAR U+70E7 +ENCODING 28903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1088 +14FC +5F80 +5050 +5022 +90D2 +170E +1008 +17FC +2920 +2520 +4522 +8222 +0C1E +ENDCHAR +STARTCHAR U+70E8 +ENCODING 28904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A0 +10A0 +10A0 +1524 +5528 +5930 +5364 +951C +1140 +1044 +17FE +2840 +2440 +4440 +4040 +8040 +ENDCHAR +STARTCHAR U+70E9 +ENCODING 28905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +1490 +5908 +5226 +55F4 +9000 +1004 +17FE +1040 +2840 +2490 +4108 +83FC +0004 +ENDCHAR +STARTCHAR U+70EB +ENCODING 28907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23F0 +1040 +4084 +23FE +0924 +7124 +1124 +1254 +1488 +0100 +0910 +0AA0 +1280 +0460 +181C +6008 +ENDCHAR +STARTCHAR U+70EC +ENCODING 28908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1508 +59F8 +5128 +5120 +9210 +120E +14C4 +1020 +1010 +28C0 +4430 +8408 +0000 +ENDCHAR +STARTCHAR U+70ED +ENCODING 28909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0848 +7FFC +0848 +0A48 +1CC8 +6848 +08A8 +088A +290A +1204 +0000 +4888 +4446 +8442 +ENDCHAR +STARTCHAR U+70EF +ENCODING 28911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +10D8 +1020 +14D8 +5904 +5080 +57FE +90A0 +1124 +11FE +1324 +2D24 +2934 +4528 +8020 +0020 +ENDCHAR +STARTCHAR U+70F0 +ENCODING 28912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1054 +5492 +5511 +5800 +51FE +1004 +1010 +1010 +13FF +1010 +2810 +4450 +4420 +0000 +0000 +ENDCHAR +STARTCHAR U+70F1 +ENCODING 28913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +16A8 +36B8 +3B38 +3218 +52E8 +12A8 +1AA8 +16E8 +26A8 +2208 +4218 +0000 +ENDCHAR +STARTCHAR U+70F3 +ENCODING 28915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +1012 +11FF +5410 +55FF +5911 +51FF +1111 +11FF +1111 +1111 +2911 +4515 +4502 +0000 +0000 +ENDCHAR +STARTCHAR U+70F4 +ENCODING 28916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +11FF +5000 +5449 +5492 +5524 +5892 +1049 +1000 +11FF +1010 +1010 +2812 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+70F6 +ENCODING 28918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +11DE +1044 +5444 +5484 +591F +5084 +1044 +1044 +1044 +125F +2940 +4480 +457F +0000 +0000 +ENDCHAR +STARTCHAR U+70F7 +ENCODING 28919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +13FE +1602 +5A14 +51F8 +5000 +9008 +13FC +1090 +1090 +2890 +2512 +4512 +820E +0400 +ENDCHAR +STARTCHAR U+70F8 +ENCODING 28920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1100 +13FF +5400 +55FE +5922 +1112 +13FF +1122 +1112 +1102 +29FF +4404 +4438 +0000 +0000 +ENDCHAR +STARTCHAR U+70F9 +ENCODING 28921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +3FF8 +0060 +0180 +0100 +0300 +1490 +2248 +4244 +0000 +ENDCHAR +STARTCHAR U+70FA +ENCODING 28922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FC +1504 +5504 +55FC +D104 +9104 +11FD +1113 +3916 +2918 +2D08 +650C +41E6 +C703 +ENDCHAR +STARTCHAR U+70FB +ENCODING 28923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +13DE +1044 +1084 +5504 +5907 +5094 +1094 +1094 +1294 +11BF +1080 +2940 +463F +0000 +0000 +ENDCHAR +STARTCHAR U+70FC +ENCODING 28924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1010 +1020 +5450 +5489 +591A +102C +1048 +119C +102A +1049 +2988 +4428 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+70FD +ENCODING 28925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0AF8 +0B90 +2E60 +28F0 +2F4C +4BF8 +0840 +0DF0 +1240 +13F8 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+70FF +ENCODING 28927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11E1 +1122 +5524 +55E0 +5921 +1122 +13F4 +1120 +1120 +1121 +2922 +4524 +4648 +0000 +0000 +ENDCHAR +STARTCHAR U+7100 +ENCODING 28928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +1044 +1082 +5511 +5428 +5844 +5082 +1101 +10FE +1082 +1082 +2882 +44FE +4482 +0000 +0000 +ENDCHAR +STARTCHAR U+7102 +ENCODING 28930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +107F +3284 +5214 +1208 +1214 +10E3 +0080 +1084 +0C98 +0140 +0220 +0410 +780F +0000 +0000 +ENDCHAR +STARTCHAR U+7103 +ENCODING 28931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +10FE +1210 +5610 +5410 +D1FF +9048 +114A +114A +3B4B +2A49 +2C48 +64C8 +4088 +C198 +ENDCHAR +STARTCHAR U+7104 +ENCODING 28932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +0104 +7FFF +0204 +1FFC +0400 +0800 +1FFC +6804 +0804 +0FFC +0804 +0000 +2112 +4111 +ENDCHAR +STARTCHAR U+7105 +ENCODING 28933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +15FE +5510 +5410 +D010 +91FF +1000 +1000 +38FE +2882 +2C82 +6482 +4082 +C0FE +ENDCHAR +STARTCHAR U+7106 +ENCODING 28934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +1282 +56FE +5400 +D0FE +9082 +1082 +10FE +3882 +2882 +2CFE +6482 +4082 +C08E +ENDCHAR +STARTCHAR U+7107 +ENCODING 28935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1111 +1193 +1492 +5410 +54FE +D082 +9082 +10FE +1082 +3882 +28FE +2C82 +6482 +4082 +C08E +ENDCHAR +STARTCHAR U+7109 +ENCODING 28937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +09F0 +0900 +7FFC +0800 +0FF0 +0800 +0FF8 +1A48 +1528 +2408 +4070 +0000 +ENDCHAR +STARTCHAR U+710A +ENCODING 28938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1104 +1104 +15FC +5904 +5104 +51FC +9000 +13FE +1020 +1024 +2BFE +2420 +4420 +8020 +0020 +ENDCHAR +STARTCHAR U+710B +ENCODING 28939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +4820 +4820 +7FFF +0820 +F820 +4820 +4BFE +8800 +0104 +110C +3398 +22C0 +0660 +1C38 +F00F +ENDCHAR +STARTCHAR U+710C +ENCODING 28940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1044 +1082 +153F +5BC9 +5048 +5089 +534F +1C40 +10FE +1184 +1248 +2C30 +2850 +418C +4603 +ENDCHAR +STARTCHAR U+710D +ENCODING 28941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1050 +11FE +5422 +5822 +53FE +1220 +1220 +13FF +1061 +10A1 +292A +4624 +4420 +0000 +0000 +ENDCHAR +STARTCHAR U+710E +ENCODING 28942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +087C +7F40 +0840 +0C7F +1844 +6844 +0884 +2804 +1004 +0000 +2222 +4221 +4221 +0000 +0000 +ENDCHAR +STARTCHAR U+710F +ENCODING 28943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FF8 +0060 +0180 +017E +7D22 +4536 +451C +4508 +7D1C +0136 +0763 +0000 +2444 +6666 +C223 +ENDCHAR +STARTCHAR U+7110 +ENCODING 28944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1080 +1488 +57FC +5908 +5108 +9108 +17FE +1000 +11FC +2904 +2504 +4504 +41FC +8104 +ENDCHAR +STARTCHAR U+7113 +ENCODING 28947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +14A0 +5510 +5990 +5248 +95F6 +1814 +1020 +13F8 +2A08 +2608 +4608 +43F8 +8208 +ENDCHAR +STARTCHAR U+7114 +ENCODING 28948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A78 +0A88 +2B10 +2C20 +2978 +4948 +0948 +0D78 +1348 +1348 +2178 +4148 +0000 +ENDCHAR +STARTCHAR U+7115 +ENCODING 28949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10F8 +1510 +5A24 +51FE +5124 +9124 +1124 +1124 +17FE +2820 +2450 +4088 +8106 +0604 +ENDCHAR +STARTCHAR U+7116 +ENCODING 28950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2404 +22FE +2004 +2404 +AC44 +B424 +A4A4 +2484 +2594 +26AC +24A4 +24E4 +5404 +4C04 +8414 +0408 +ENDCHAR +STARTCHAR U+7117 +ENCODING 28951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1101 +1101 +55FF +5500 +59FF +1101 +117D +1145 +1145 +117D +2901 +4602 +440C +0000 +0000 +ENDCHAR +STARTCHAR U+7118 +ENCODING 28952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0208 +7FFC +0200 +3FF8 +0400 +FFFE +0820 +1FFC +2420 +4220 +80A0 +0040 +2488 +2244 +4244 +ENDCHAR +STARTCHAR U+7119 +ENCODING 28953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BF8 +0B10 +2A90 +2CA0 +2BFC +4800 +09F8 +0D08 +1308 +1308 +21F8 +4108 +0000 +ENDCHAR +STARTCHAR U+711A +ENCODING 28954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +1C60 +1AB0 +2928 +4824 +0110 +0910 +09A0 +1280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+711B +ENCODING 28955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4001 +4081 +4889 +4491 +4081 +4141 +4221 +4C19 +4002 +0000 +0000 +ENDCHAR +STARTCHAR U+711C +ENCODING 28956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +0B08 +2BF8 +2D08 +29F8 +4920 +0924 +0DF8 +1320 +1324 +21E4 +471C +0000 +ENDCHAR +STARTCHAR U+711E +ENCODING 28958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +1400 +14FE +5482 +5082 +50FE +1000 +10FE +1008 +101F +13F0 +2810 +2410 +4030 +ENDCHAR +STARTCHAR U+711F +ENCODING 28959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +10FE +5444 +5444 +59FF +5000 +10FE +1082 +10FE +1082 +2882 +44FE +4482 +0000 +0000 +ENDCHAR +STARTCHAR U+7120 +ENCODING 28960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +1200 +5644 +5444 +D0EE +91AB +1000 +1010 +39FF +2810 +2C10 +6410 +4010 +C010 +ENDCHAR +STARTCHAR U+7121 +ENCODING 28961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +1AA0 +2AA0 +7FF8 +0AA0 +0AA0 +0AA0 +7FFC +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7122 +ENCODING 28962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +5529 +5945 +5082 +5101 +1000 +10FE +1010 +1010 +1010 +2812 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+7123 +ENCODING 28963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F80 +113E +1102 +1F22 +1122 +1F22 +1122 +1114 +7F08 +0114 +0163 +0000 +2442 +4221 +0000 +0000 +ENDCHAR +STARTCHAR U+7125 +ENCODING 28965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +1101 +5501 +5848 +50E8 +10A8 +1128 +12AF +1068 +1048 +2889 +450F +0000 +0000 +ENDCHAR +STARTCHAR U+7126 +ENCODING 28966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +0880 +0FF8 +1880 +2FF0 +4880 +0FF0 +0880 +0FFC +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7128 +ENCODING 28968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +0841 +087F +4A41 +4C7F +4800 +487F +0841 +087F +0841 +147F +1441 +2245 +4182 +0000 +0000 +ENDCHAR +STARTCHAR U+712B +ENCODING 28971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13FF +1484 +5484 +5460 +D020 +91FE +1122 +1122 +3972 +295A +2D8A +6502 +4102 +C10E +ENDCHAR +STARTCHAR U+712D +ENCODING 28973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2952 +2A54 +1428 +2244 +0000 +7FFE +4002 +4002 +07E0 +0420 +0420 +0C20 +0821 +1833 +701E +ENDCHAR +STARTCHAR U+712E +ENCODING 28974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +139F +1211 +5611 +5BE5 +5244 +5244 +1244 +1244 +1244 +1244 +1244 +2C4A +4451 +0000 +0000 +ENDCHAR +STARTCHAR U+712F +ENCODING 28975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +107C +1040 +1440 +57F8 +5A08 +53F8 +9208 +13F8 +1040 +1044 +2BFE +2440 +4440 +4040 +8040 +ENDCHAR +STARTCHAR U+7130 +ENCODING 28976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +10FC +1508 +5A10 +5084 +533E +9204 +1204 +1204 +13BC +2A04 +2604 +4604 +83FC +0204 +ENDCHAR +STARTCHAR U+7131 +ENCODING 28977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1110 +1130 +1140 +2280 +0C60 +301E +C824 +0820 +2AA4 +2AA8 +4D30 +1450 +1248 +208E +C104 +ENDCHAR +STARTCHAR U+7132 +ENCODING 28978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +17FF +5080 +54A0 +593E +5322 +1532 +114A +11A2 +1114 +1108 +2914 +4522 +0000 +0000 +ENDCHAR +STARTCHAR U+7136 +ENCODING 28982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0828 +0F24 +19FC +1520 +3260 +4A50 +0C90 +1908 +6004 +1490 +1248 +2244 +4004 +0000 +ENDCHAR +STARTCHAR U+7138 +ENCODING 28984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +4242 +7E7E +4242 +4242 +7E7E +0100 +1104 +138C +3298 +26C0 +0C60 +3838 +E00F +ENDCHAR +STARTCHAR U+713A +ENCODING 28986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +10FE +5482 +54FE +5810 +50E4 +1044 +13FF +1044 +1044 +2844 +4484 +4404 +0000 +0000 +ENDCHAR +STARTCHAR U+713C +ENCODING 28988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +0A40 +2CD0 +2BF8 +2890 +4890 +0FFC +08A0 +14A0 +1324 +2224 +441C +0000 +ENDCHAR +STARTCHAR U+7141 +ENCODING 28993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13FF +1484 +54FC +5484 +D0FC +9084 +1084 +13FF +3948 +2948 +2D8E +6500 +4100 +C1FF +ENDCHAR +STARTCHAR U+7142 +ENCODING 28994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +5088 +58F8 +5420 +53FE +1222 +1222 +13FE +1020 +17FF +1020 +2820 +4420 +0000 +0000 +ENDCHAR +STARTCHAR U+7143 +ENCODING 28995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +5050 +5888 +5524 +5222 +15FD +1020 +13FE +1020 +11FC +2820 +47FE +0000 +0000 +ENDCHAR +STARTCHAR U+7144 +ENCODING 28996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1020 +5FFF +5420 +53FE +5222 +13FE +1222 +13FE +1020 +13FE +1020 +2820 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+7145 +ENCODING 28997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +13BE +1224 +1224 +57A4 +5A42 +5200 +93BC +1204 +1224 +1228 +1790 +2A10 +2A28 +424E +8284 +ENDCHAR +STARTCHAR U+7146 +ENCODING 28998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2242 +2A42 +AA42 +B3DE +A200 +A23E +23D2 +2216 +2214 +73DC +5208 +5A1C +CA36 +8263 +ENDCHAR +STARTCHAR U+7147 +ENCODING 28999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1111 +1410 +15FF +5410 +50FE +5092 +10FE +1092 +10FE +1010 +29FF +2810 +2810 +4010 +ENDCHAR +STARTCHAR U+7149 +ENCODING 29001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +1040 +17F8 +3648 +3BF8 +5248 +13F8 +10E0 +1950 +2648 +2444 +4040 +0000 +ENDCHAR +STARTCHAR U+714A +ENCODING 29002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +17FE +1402 +5404 +5BF8 +5000 +93F8 +1208 +13F8 +1208 +2BF8 +2400 +4004 +47FE +8000 +ENDCHAR +STARTCHAR U+714B +ENCODING 29003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +2104 +29FC +A904 +A904 +A1FC +A020 +2120 +23FE +2620 +71FC +5820 +4820 +C7FF +8000 +ENDCHAR +STARTCHAR U+714C +ENCODING 29004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +09F8 +0B08 +2BF8 +2D08 +29F8 +4800 +0BFC +0840 +15F8 +1440 +23FC +4000 +0000 +ENDCHAR +STARTCHAR U+714D +ENCODING 29005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +1788 +112A +592A +552A +57C8 +1108 +1388 +1548 +1108 +1108 +1114 +2922 +4541 +0000 +0000 +ENDCHAR +STARTCHAR U+714E +ENCODING 29006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +7FFC +0000 +3E48 +2248 +3E48 +3E48 +2248 +2618 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7150 +ENCODING 29008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FF +1488 +18A8 +5020 +53FE +5222 +1222 +1222 +17FF +1050 +2850 +2888 +2904 +4603 +ENDCHAR +STARTCHAR U+7152 +ENCODING 29010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +10FC +1044 +1444 +55FF +5400 +D0FE +9082 +10FE +1010 +39FE +2C90 +2C90 +65FF +4010 +C010 +ENDCHAR +STARTCHAR U+7153 +ENCODING 29011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1111 +1111 +55FF +5400 +59FF +5010 +1020 +11FF +1129 +1129 +1129 +2929 +4503 +0000 +0000 +ENDCHAR +STARTCHAR U+7154 +ENCODING 29012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +4910 +4910 +2A1F +0810 +2210 +4110 +0010 +497F +4941 +2A41 +0841 +227F +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+7155 +ENCODING 29013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F78 +2248 +2B48 +2978 +2948 +2B40 +2244 +3F44 +203C +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7156 +ENCODING 29014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +09F0 +0948 +0B24 +2A04 +2DF8 +2840 +4BFC +0840 +0CF8 +12C8 +1130 +2270 +458C +0000 +ENDCHAR +STARTCHAR U+7157 +ENCODING 29015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2020 +2BFF +AA49 +B249 +A249 +A249 +224B +2020 +2020 +73FF +5050 +58D8 +C98C +8707 +ENDCHAR +STARTCHAR U+7158 +ENCODING 29016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +1009 +13FF +5A08 +5608 +53F8 +1208 +12E8 +12AA +12AC +12E8 +2C15 +4403 +4401 +0000 +0000 +ENDCHAR +STARTCHAR U+7159 +ENCODING 29017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +10A0 +17F8 +36A8 +3AA8 +33F8 +5248 +1840 +17F8 +2440 +2040 +47FC +0000 +0000 +ENDCHAR +STARTCHAR U+715A +ENCODING 29018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DFE +4500 +45FC +7D04 +4504 +45FC +4500 +7DFF +0000 +1104 +310C +2398 +06C0 +1C70 +F01F +ENDCHAR +STARTCHAR U+715C +ENCODING 29020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1204 +1204 +57FC +5A04 +5204 +93FC +1040 +1020 +13FC +2908 +2488 +4090 +47FE +8000 +ENDCHAR +STARTCHAR U+715D +ENCODING 29021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1111 +1111 +59FF +5500 +517F +1141 +117F +1141 +117F +1141 +1141 +2A7F +4441 +0000 +0000 +ENDCHAR +STARTCHAR U+715E +ENCODING 29022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1024 +1E3E +2444 +48A4 +FF24 +0124 +0128 +7F10 +0128 +0146 +7F84 +0000 +4488 +4246 +8002 +ENDCHAR +STARTCHAR U+715F +ENCODING 29023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1092 +50FE +5892 +54FE +5000 +50FE +1082 +10FE +1082 +10FE +1082 +2882 +4506 +0000 +0000 +ENDCHAR +STARTCHAR U+7160 +ENCODING 29024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +1124 +13FF +1524 +5524 +553C +D100 +91FE +1020 +13FF +38A8 +2CA8 +25AC +6126 +4323 +C020 +ENDCHAR +STARTCHAR U+7161 +ENCODING 29025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +177E +1112 +5A7F +5412 +527E +1110 +117E +1110 +177F +1110 +2A90 +447F +0000 +0000 +ENDCHAR +STARTCHAR U+7162 +ENCODING 29026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +2AA8 +2CB0 +5550 +2288 +3FFC +2008 +5FF0 +0210 +0210 +1FD4 +020C +020C +0204 +0000 +ENDCHAR +STARTCHAR U+7163 +ENCODING 29027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1004 +1028 +53FF +5851 +5492 +5210 +1030 +1000 +1010 +11FF +2854 +4492 +4511 +0000 +0000 +ENDCHAR +STARTCHAR U+7164 +ENCODING 29028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +0BFC +0A90 +2CF0 +2890 +28F0 +4840 +0BFC +08E0 +14D0 +1348 +2644 +4040 +0000 +ENDCHAR +STARTCHAR U+7165 +ENCODING 29029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F0 +1120 +1640 +37F8 +3AA8 +32B8 +5318 +1248 +1FFC +1440 +24A0 +2110 +460C +0000 +ENDCHAR +STARTCHAR U+7166 +ENCODING 29030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +24F8 +2508 +27E8 +3D28 +2528 +25E8 +3D28 +2408 +0030 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7167 +ENCODING 29031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +2488 +2530 +3FF8 +2508 +2508 +3DF8 +2508 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7168 +ENCODING 29032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +1248 +1248 +57F8 +5A48 +5248 +93F8 +1000 +1FFE +1288 +1250 +2A20 +2690 +430E +8204 +ENDCHAR +STARTCHAR U+7169 +ENCODING 29033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0820 +0A40 +2BF8 +2D08 +29F8 +4908 +09F8 +0D08 +13F8 +1290 +2108 +4604 +0000 +ENDCHAR +STARTCHAR U+716A +ENCODING 29034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +1044 +13FF +5828 +5428 +51FF +1129 +1149 +118F +1101 +1101 +297D +4501 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+716C +ENCODING 29036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +0BF8 +2B08 +2DF8 +2800 +4BFC +0900 +0DF8 +16A8 +14A8 +2148 +42B0 +0000 +ENDCHAR +STARTCHAR U+716E +ENCODING 29038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +1FF0 +0120 +7FFC +0100 +07E0 +1C20 +67E0 +0420 +07E0 +0420 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7170 +ENCODING 29040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10F8 +1088 +1088 +1088 +5888 +54F8 +5000 +1000 +17DF +1451 +1451 +1451 +2C51 +47DF +0000 +0000 +ENDCHAR +STARTCHAR U+7172 +ENCODING 29042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0BFC +0A08 +13F8 +3040 +5FFE +90E0 +1150 +164E +1140 +0910 +0920 +12C0 +0440 +1830 +600E +ENDCHAR +STARTCHAR U+7173 +ENCODING 29043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +213E +2124 +2FE4 +A924 +B13C +A124 +27A4 +24A4 +24BC +24A4 +24A4 +57A4 +4844 +8094 +0108 +ENDCHAR +STARTCHAR U+7178 +ENCODING 29048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +1204 +5604 +5BFC +5200 +9204 +13FE +1554 +1554 +29FC +2554 +4554 +4154 +810C +ENDCHAR +STARTCHAR U+7179 +ENCODING 29049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +2048 +23FF +2848 +A9FE +A848 +A3FF +A020 +21FE +2122 +21FE +7122 +53FF +5902 +C902 +810E +ENDCHAR +STARTCHAR U+717A +ENCODING 29050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +10FC +1488 +1288 +56F8 +5888 +5088 +96F8 +12A4 +12A8 +1290 +2AC8 +2684 +4506 +88FC +0000 +ENDCHAR +STARTCHAR U+717B +ENCODING 29051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13FF +1210 +5AFE +5612 +53FF +5212 +12FE +1210 +12FE +1482 +1082 +28FE +4482 +0000 +0000 +ENDCHAR +STARTCHAR U+717D +ENCODING 29053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1000 +13F8 +1608 +37F8 +3A00 +53F8 +1248 +1B68 +16D8 +2368 +2448 +48D8 +0000 +ENDCHAR +STARTCHAR U+7180 +ENCODING 29056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +2104 +29FC +A904 +A9FC +A222 +A326 +2124 +27FF +2088 +7088 +5988 +4909 +C309 +8607 +ENDCHAR +STARTCHAR U+7181 +ENCODING 29057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +13FE +5882 +561C +57DF +5249 +14D3 +11FE +1102 +11FE +1102 +11FE +2902 +4606 +0000 +0000 +ENDCHAR +STARTCHAR U+7182 +ENCODING 29058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1200 +13FE +1200 +54F8 +5000 +5BFC +5444 +5154 +10E4 +13FC +1044 +1155 +2A4D +4443 +0000 +0000 +ENDCHAR +STARTCHAR U+7184 +ENCODING 29060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +09F8 +0B08 +2BF8 +2D08 +29F8 +4908 +09F8 +0C40 +12A8 +1284 +2494 +4070 +0000 +ENDCHAR +STARTCHAR U+7185 +ENCODING 29061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1084 +1284 +56FC +5484 +D084 +90FC +1000 +11FE +3952 +2952 +2D52 +6552 +43FF +C000 +ENDCHAR +STARTCHAR U+7186 +ENCODING 29062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FC +1020 +5BFE +5440 +5082 +53FF +1001 +1000 +13FE +1252 +1252 +2A52 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+7187 +ENCODING 29063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +1400 +54FC +5484 +D0FC +9000 +11FE +1102 +397A +294A +2D4A +657A +4102 +C106 +ENDCHAR +STARTCHAR U+7188 +ENCODING 29064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2FF8 +2A48 +2F48 +2978 +2948 +2F40 +2A44 +2FC4 +483C +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7189 +ENCODING 29065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +1082 +14FE +5800 +51FF +5101 +11FF +1101 +11FF +2901 +29FF +2400 +4482 +4101 +ENDCHAR +STARTCHAR U+718A +ENCODING 29066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +1248 +7F70 +0144 +3E3C +2240 +3E4C +2270 +3E40 +2244 +263C +1490 +2248 +4244 +0000 +ENDCHAR +STARTCHAR U+718C +ENCODING 29068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27DF +2451 +2FDF +B451 +A7DF +A401 +A421 +2421 +2421 +2471 +7451 +54D9 +4D8D +C401 +8407 +ENDCHAR +STARTCHAR U+718F +ENCODING 29071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +7FFC +1FF0 +1550 +1390 +1FF0 +0100 +3FF8 +0100 +7FFC +2488 +4244 +0000 +ENDCHAR +STARTCHAR U+7190 +ENCODING 29072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17FF +1401 +15FD +5904 +55FC +5104 +51FC +1020 +1020 +17FF +1000 +1104 +2A02 +4401 +0000 +0000 +ENDCHAR +STARTCHAR U+7192 +ENCODING 29074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +2A29 +2C2A +494C +1414 +2222 +4141 +7FFF +4085 +0888 +0890 +1080 +0140 +0220 +0C18 +7007 +ENDCHAR +STARTCHAR U+7194 +ENCODING 29076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +1608 +3510 +3548 +3A48 +50A0 +1110 +1FFC +1510 +2510 +21F0 +4110 +0000 +ENDCHAR +STARTCHAR U+7195 +ENCODING 29077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0840 +0BFC +2A00 +2DF8 +2908 +49F8 +0908 +0DF8 +1308 +13F8 +2198 +4604 +0000 +ENDCHAR +STARTCHAR U+7197 +ENCODING 29079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1050 +58A8 +5524 +53FE +5505 +11FC +1104 +11FC +1200 +15FC +1104 +2904 +45FC +0000 +0000 +ENDCHAR +STARTCHAR U+7198 +ENCODING 29080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +277E +2424 +2524 +ACA4 +B5A4 +A654 +2088 +27FC +2444 +2444 +27FC +5444 +4C44 +87FC +0404 +ENDCHAR +STARTCHAR U+7199 +ENCODING 29081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F78 +2248 +2F48 +2978 +2948 +2F40 +2244 +3F44 +203C +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+719A +ENCODING 29082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +15FE +5522 +5522 +D1FE +90A4 +13FF +10A4 +38A4 +29FE +2C20 +65FE +4020 +C020 +ENDCHAR +STARTCHAR U+719B +ENCODING 29083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2048 +2BFF +AA49 +B249 +A3FF +A000 +21FE +2000 +23FF +7020 +5924 +4B26 +C623 +80E0 +ENDCHAR +STARTCHAR U+719C +ENCODING 29084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1100 +13FE +12A2 +5A46 +56AA +5312 +122A +1246 +13FE +14A2 +1491 +2C84 +44FC +0000 +0000 +ENDCHAR +STARTCHAR U+719D +ENCODING 29085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1010 +13FF +1248 +5A48 +57FF +5249 +1249 +13FF +1308 +13EF +1508 +2929 +45EF +0000 +0000 +ENDCHAR +STARTCHAR U+719E +ENCODING 29086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17C0 +151F +1511 +5FD1 +544A +57C4 +150A +1511 +17C0 +1020 +13FE +1020 +2820 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+719F +ENCODING 29087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7F40 +01F0 +1E50 +1250 +1FD0 +3E50 +0674 +7C8C +050C +0E04 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+71A0 +ENCODING 29088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +2FFE +24A4 +2294 +A884 +B294 +A4A4 +2048 +23FC +2208 +2208 +23F8 +5208 +4A08 +83F8 +0208 +ENDCHAR +STARTCHAR U+71A1 +ENCODING 29089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +1092 +11FF +5492 +58FE +5010 +50FE +1092 +10FE +1054 +11FF +2810 +45EF +0000 +0000 +ENDCHAR +STARTCHAR U+71A2 +ENCODING 29090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1220 +113E +1042 +14A4 +1B18 +5014 +5063 +5190 +10FE +1610 +12FE +1210 +12FE +2A10 +2B10 +44FF +ENDCHAR +STARTCHAR U+71A4 +ENCODING 29092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17DF +1041 +1659 +5841 +5659 +538E +1020 +1020 +13FE +1088 +1088 +1088 +2888 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+71A5 +ENCODING 29093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +147E +1204 +1018 +1788 +58FF +5549 +527F +1249 +117F +1149 +1149 +114B +2A80 +447F +0000 +0000 +ENDCHAR +STARTCHAR U+71A7 +ENCODING 29095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +2484 +4884 +114A +3221 +50BC +10A0 +1140 +123E +1088 +0890 +0140 +0220 +7C1F +0000 +0000 +ENDCHAR +STARTCHAR U+71A8 +ENCODING 29096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F08 +2108 +3FFC +2E48 +3FA8 +3628 +5508 +2D18 +0910 +0910 +12A0 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+71A9 +ENCODING 29097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13F8 +1100 +11FC +5504 +59FC +517C +5144 +117C +11FE +1192 +12FE +2881 +44FF +0000 +0000 +ENDCHAR +STARTCHAR U+71AA +ENCODING 29098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13C4 +108F +5491 +5BEA +5084 +5088 +1090 +11C4 +12AF +1091 +108A +2884 +4498 +0000 +0000 +ENDCHAR +STARTCHAR U+71AC +ENCODING 29100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +0840 +7FFC +0890 +7F50 +0850 +0E20 +1250 +2388 +4C04 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+71AF +ENCODING 29103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +2104 +27FF +2904 +ABFE +AA22 +A222 +A3FE +2020 +23FE +2020 +77FF +5050 +58D8 +C98C +8707 +ENDCHAR +STARTCHAR U+71B0 +ENCODING 29104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1100 +153E +5522 +5522 +D13E +9100 +1177 +1155 +3955 +2955 +2D77 +6500 +40FF +C000 +ENDCHAR +STARTCHAR U+71B1 +ENCODING 29105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +3FF0 +0850 +7F50 +15D0 +2B50 +7E74 +0894 +0F0C +7000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+71B2 +ENCODING 29106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +46FF +7C10 +407E +4142 +3F42 +007E +2942 +2B42 +6A7E +4842 +1C42 +167E +3324 +6066 +C0C3 +ENDCHAR +STARTCHAR U+71B3 +ENCODING 29107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11F8 +1108 +11F8 +1508 +55F8 +5800 +53FC +9294 +13FC +1000 +13FC +2908 +2490 +4460 +4190 +860E +ENDCHAR +STARTCHAR U+71B5 +ENCODING 29109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2044 +2FFE +2110 +A8A4 +B7FE +A4A4 +2514 +260C +25F4 +2514 +2514 +55F4 +4C04 +8414 +0408 +ENDCHAR +STARTCHAR U+71B8 +ENCODING 29112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17DF +1514 +1514 +5FDF +5186 +528A +14D3 +1000 +13FE +1202 +13FE +1202 +2BFE +4602 +0000 +0000 +ENDCHAR +STARTCHAR U+71B9 +ENCODING 29113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +0FE0 +0820 +0FE0 +0440 +7FFC +0FE0 +0820 +0FE0 +2488 +4244 +0000 +ENDCHAR +STARTCHAR U+71BA +ENCODING 29114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1210 +14FE +1800 +50FE +5082 +50FE +1044 +1028 +11FF +1000 +28FE +2882 +28FE +4082 +ENDCHAR +STARTCHAR U+71BC +ENCODING 29116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1222 +5BFE +5622 +53FE +1088 +1088 +13FE +1088 +1088 +17FF +1088 +2904 +4603 +0000 +0000 +ENDCHAR +STARTCHAR U+71BD +ENCODING 29117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +1022 +5FFF +5022 +53FE +14A9 +17AF +1421 +17FF +1421 +17AF +2CA9 +44A9 +0000 +0000 +ENDCHAR +STARTCHAR U+71BE +ENCODING 29118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1130 +17E8 +14A8 +36A0 +3FFC +3020 +53E8 +1258 +1BD0 +1654 +27EC +224C +4084 +0000 +ENDCHAR +STARTCHAR U+71BF +ENCODING 29119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +23FE +2088 +2888 +B7FF +A020 +A3FE +A222 +2222 +23FE +2222 +7222 +53FE +5904 +CB06 +8203 +ENDCHAR +STARTCHAR U+71C0 +ENCODING 29120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23DE +2252 +23DE +2800 +A9FC +A924 +A124 +A1FC +2124 +2124 +21FC +7020 +57FF +5820 +C820 +8020 +ENDCHAR +STARTCHAR U+71C1 +ENCODING 29121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +17FF +1088 +17FE +5924 +5124 +57FF +1124 +1124 +17FE +1020 +1FFF +2420 +2420 +4020 +ENDCHAR +STARTCHAR U+71C2 +ENCODING 29122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17FF +1050 +13FE +5252 +5BFE +5400 +51FC +1104 +11FC +1104 +11FC +1020 +2BFE +4420 +0000 +0000 +ENDCHAR +STARTCHAR U+71C3 +ENCODING 29123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1128 +15E4 +1564 +3B7C +32A0 +36A0 +5950 +1250 +1488 +1804 +2548 +24A4 +48A4 +0000 +ENDCHAR +STARTCHAR U+71C4 +ENCODING 29124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2091 +3C93 +25BA +6D28 +486C +D8C6 +0193 +2010 +EC91 +8493 +85BA +ED28 +846C +84C6 +FD83 +ENDCHAR +STARTCHAR U+71C5 +ENCODING 29125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0849 +3E49 +082A +0814 +7F22 +2241 +2200 +6B49 +0849 +3E2A +0814 +0822 +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+71C6 +ENCODING 29126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +1010 +11FF +5428 +587C +50C6 +517D +1000 +11FF +1101 +117D +1145 +297D +4507 +0000 +0000 +ENDCHAR +STARTCHAR U+71C7 +ENCODING 29127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +17FF +5850 +57FE +5252 +128E +1272 +1202 +13FE +1004 +17FF +1084 +2844 +441C +0000 +0000 +ENDCHAR +STARTCHAR U+71C8 +ENCODING 29128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11C8 +1048 +16B0 +15A4 +39F8 +3208 +35F4 +5110 +11F0 +1910 +1490 +24A0 +27FC +4000 +0000 +ENDCHAR +STARTCHAR U+71C9 +ENCODING 29129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +17E0 +1420 +37FC +3AC8 +33A8 +5028 +13B0 +1890 +15D0 +2728 +2148 +4384 +0000 +ENDCHAR +STARTCHAR U+71CA +ENCODING 29130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0490 +02A0 +0080 +0770 +0000 +4949 +2A2A +0808 +3636 +0080 +7FFF +02A0 +0C98 +3086 +0000 +0000 +ENDCHAR +STARTCHAR U+71CB +ENCODING 29131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2090 +29FF +2910 +B310 +A5FE +A110 +A110 +21FE +2110 +2110 +71FF +5000 +594A +CB4B +8201 +ENDCHAR +STARTCHAR U+71CC +ENCODING 29132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +1010 +1444 +55FF +5444 +D000 +90FE +1082 +10FE +3882 +28FE +2C82 +64FE +4044 +C183 +ENDCHAR +STARTCHAR U+71CE +ENCODING 29134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13FC +16A8 +3510 +3BF8 +3514 +51F0 +1110 +19F0 +1550 +2548 +2248 +40C0 +0000 +ENDCHAR +STARTCHAR U+71CF +ENCODING 29135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1008 +1850 +57FF +5052 +5190 +1070 +17FF +1489 +1707 +14F9 +1489 +2CF9 +4403 +0000 +0000 +ENDCHAR +STARTCHAR U+71D0 +ENCODING 29136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1150 +17FC +34E0 +3950 +564C +1148 +11FC +1AA8 +16A8 +217C +2208 +4408 +0000 +ENDCHAR +STARTCHAR U+71D2 +ENCODING 29138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1040 +17FC +3510 +3BB8 +3110 +51FC +1600 +1BFC +14A0 +24A4 +2124 +461C +0000 +ENDCHAR +STARTCHAR U+71D3 +ENCODING 29139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +2244 +F99F +2244 +2004 +724E +6996 +A245 +2004 +0100 +110C +3398 +62C0 +0660 +1C38 +F00F +ENDCHAR +STARTCHAR U+71D4 +ENCODING 29140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E8 +1248 +1550 +37FC +38E0 +3150 +5248 +17FC +1A48 +17F8 +2648 +23F8 +4208 +0000 +ENDCHAR +STARTCHAR U+71D5 +ENCODING 29141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0FE4 +7828 +0BB0 +1AA0 +6AA4 +0B9C +1490 +1248 +2244 +4004 +0000 +ENDCHAR +STARTCHAR U+71D6 +ENCODING 29142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FC +2004 +23FC +2804 +ABFC +B000 +A7DE +A112 +21D2 +271E +2004 +77FF +5104 +5984 +C884 +801C +ENDCHAR +STARTCHAR U+71D7 +ENCODING 29143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +17B8 +36A8 +3BB8 +32E8 +52A8 +12E8 +1AA8 +16E8 +26A8 +2368 +4218 +0000 +ENDCHAR +STARTCHAR U+71D8 +ENCODING 29144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17DF +1451 +17DF +5C51 +57DF +5421 +15FD +1489 +1489 +1451 +1421 +1451 +2D8D +4403 +0000 +0000 +ENDCHAR +STARTCHAR U+71D9 +ENCODING 29145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +61F8 +3108 +01F8 +C108 +61F8 +0000 +2FFF +2100 +63FE +4492 +C126 +0100 +339C +66C0 +1C70 +F01F +ENDCHAR +STARTCHAR U+71DA +ENCODING 29146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +4891 +4993 +DD3A +9428 +366C +62C6 +C993 +0810 +4891 +C993 +9D3A +1428 +366C +62C6 +C183 +ENDCHAR +STARTCHAR U+71DB +ENCODING 29147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +0948 +3F7E +2142 +3F7E +0948 +7F7F +0000 +0080 +1084 +0888 +0140 +0220 +3C1E +0000 +0000 +ENDCHAR +STARTCHAR U+71DC +ENCODING 29148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27DF +2451 +2FDF +B451 +A7DF +A401 +A421 +2411 +2555 +2543 +7641 +5449 +4C39 +C401 +8407 +ENDCHAR +STARTCHAR U+71DF +ENCODING 29151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0528 +1670 +2CB0 +1248 +3FFC +2008 +4FE0 +0820 +0FE0 +0200 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+71E0 +ENCODING 29152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +13F8 +16E8 +3758 +3AE8 +33F8 +52E8 +12D8 +1B48 +17FC +24A0 +2110 +460C +0000 +ENDCHAR +STARTCHAR U+71E1 +ENCODING 29153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1129 +11FF +5410 +58FE +5010 +51FF +1044 +10FE +1010 +11FF +1010 +2810 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+71E2 +ENCODING 29154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0540 +389E +2142 +3C1E +2142 +3C9E +2142 +7FFF +4081 +4889 +0490 +0140 +0220 +1C1C +0000 +0000 +ENDCHAR +STARTCHAR U+71E4 +ENCODING 29156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +13FE +1088 +51FC +5D24 +51FC +1124 +11FC +1020 +13FF +1229 +12F9 +2A09 +4603 +0000 +0000 +ENDCHAR +STARTCHAR U+71E5 +ENCODING 29157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +15F0 +3400 +3BB8 +32A8 +53B8 +1040 +17FC +18E0 +2550 +264C +4040 +0000 +ENDCHAR +STARTCHAR U+71E6 +ENCODING 29158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +11F8 +1128 +17E8 +3690 +3DA8 +5144 +1648 +1150 +17FC +18E0 +2950 +264C +4040 +0000 +ENDCHAR +STARTCHAR U+71E7 +ENCODING 29159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1230 +1150 +1148 +1484 +36FC +3924 +31F4 +5738 +11D8 +1934 +15D4 +2510 +22E0 +447C +0000 +ENDCHAR +STARTCHAR U+71E8 +ENCODING 29160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1028 +10FE +1010 +50FE +5C10 +51FF +128A +13FF +1088 +10CA +138A +2885 +459B +0000 +0000 +ENDCHAR +STARTCHAR U+71EC +ENCODING 29164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1638 +15A8 +14A8 +3FAC +3CAC +34C4 +57F8 +1128 +1BA8 +1510 +2510 +21A8 +4644 +0000 +ENDCHAR +STARTCHAR U+71ED +ENCODING 29165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +12A8 +17F8 +3500 +39F8 +5288 +17E8 +1AA8 +17E8 +24A8 +20F8 +4730 +0000 +ENDCHAR +STARTCHAR U+71EE +ENCODING 29166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +17D4 +5434 +5BB8 +33D0 +1B98 +2AA4 +23C4 +4000 +1FE0 +0440 +0380 +06C0 +3838 +0000 +ENDCHAR +STARTCHAR U+71F0 +ENCODING 29168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +11FC +1092 +1054 +57FF +5B53 +5245 +507C +1020 +107C +10A8 +1110 +2828 +45C6 +0000 +0000 +ENDCHAR +STARTCHAR U+71F1 +ENCODING 29169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1044 +55FF +5800 +50FE +5082 +10FE +1082 +10FE +1000 +1152 +2945 +447C +0000 +0000 +ENDCHAR +STARTCHAR U+71F2 +ENCODING 29170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +10FC +1024 +1144 +57CF +5945 +5249 +50FC +1084 +10FC +10FC +1084 +28FC +4586 +0000 +0000 +ENDCHAR +STARTCHAR U+71F4 +ENCODING 29172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1070 +1088 +1104 +96FA +5800 +53FE +52AA +13FE +1000 +11FC +2904 +25FC +4504 +81FC +0000 +0000 +ENDCHAR +STARTCHAR U+71F5 +ENCODING 29173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +11F8 +1120 +15FC +3648 +3950 +31FC +5720 +11F8 +1920 +15FC +2520 +22A0 +447C +0000 +ENDCHAR +STARTCHAR U+71F8 +ENCODING 29176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2820 +2FFF +B421 +A5AD +A421 +A1AC +2000 +27FF +2040 +73FE +5292 +5A92 +CA92 +8296 +ENDCHAR +STARTCHAR U+71F9 +ENCODING 29177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7EFC +1020 +7AF4 +1E34 +6CD8 +1A34 +6AD4 +3160 +0910 +0910 +12A0 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+71FB +ENCODING 29179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E0 +1040 +17FC +37F8 +3B58 +32E8 +53F8 +1040 +1BF8 +1440 +27FC +22A8 +4454 +0000 +ENDCHAR +STARTCHAR U+71FC +ENCODING 29180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1048 +17FC +3448 +3BF8 +3040 +57FC +12A8 +1C54 +17F8 +22A8 +22A8 +47FC +0000 +ENDCHAR +STARTCHAR U+71FD +ENCODING 29181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +10FE +55FF +5801 +51FF +5010 +13FF +11FF +1002 +11FF +292A +45E6 +0000 +0000 +ENDCHAR +STARTCHAR U+71FE +ENCODING 29182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0080 +1FFC +7FFF +0001 +1FF8 +3FFE +0000 +7FFF +0004 +1DFF +1C24 +0004 +244E +4221 +ENDCHAR +STARTCHAR U+71FF +ENCODING 29183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +12A8 +15D8 +36A8 +34C8 +3A20 +53F8 +1640 +1FF0 +17F0 +2640 +23FC +4200 +0000 +ENDCHAR +STARTCHAR U+7200 +ENCODING 29184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1108 +1108 +17FE +1908 +5108 +5FFF +5294 +16D6 +16B5 +1AB5 +1294 +2A94 +2A94 +2A94 +45A4 +ENDCHAR +STARTCHAR U+7201 +ENCODING 29185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17E8 +1488 +17CF +5C48 +57C8 +5492 +17E1 +1000 +13FE +1252 +1252 +1252 +2A52 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+7202 +ENCODING 29186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF0 +341E +25D2 +3C1E +25D2 +3D5E +25D2 +7FFF +4081 +4889 +4491 +0140 +0220 +0C18 +0000 +0000 +ENDCHAR +STARTCHAR U+7203 +ENCODING 29187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1555 +138E +5904 +528A +5451 +1000 +17FF +1421 +15FD +1020 +10A8 +2924 +4222 +0000 +0000 +ENDCHAR +STARTCHAR U+7205 +ENCODING 29189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +12AA +1272 +5BFE +5020 +11FC +1020 +17FF +128A +1489 +1020 +13FE +2820 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+7206 +ENCODING 29190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +15F0 +35F0 +38A0 +33F8 +50A0 +17FC +1950 +1758 +24E4 +2358 +40C0 +0000 +ENDCHAR +STARTCHAR U+7207 +ENCODING 29191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7F10 +087C +FF94 +2254 +CB74 +3E24 +0875 +FF53 +0000 +FFFF +0808 +3FF4 +0000 +6666 +C333 +ENDCHAR +STARTCHAR U+7208 +ENCODING 29192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +203C +2020 +2BFE +AA22 +AAF8 +A222 +A2FE +22A4 +22FC +22A4 +72FC +5220 +5552 +C945 +823C +ENDCHAR +STARTCHAR U+7209 +ENCODING 29193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +2444 +2222 +27FC +A4A4 +AC44 +B4A4 +A7FC +2000 +2664 +2554 +7664 +5554 +5445 +C775 +8CC3 +ENDCHAR +STARTCHAR U+720A +ENCODING 29194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1010 +11FF +1128 +55FF +5929 +51FF +5144 +1177 +1144 +117F +1100 +2A55 +4455 +0000 +0000 +ENDCHAR +STARTCHAR U+720C +ENCODING 29196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +1248 +13FE +5648 +5A78 +53FF +52FE +1292 +12FE +1492 +10FE +2844 +4482 +0000 +0000 +ENDCHAR +STARTCHAR U+720D +ENCODING 29197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1248 +15F4 +17AC +36E8 +3DB4 +37FC +5040 +17FC +10E0 +1950 +2648 +2444 +4040 +0000 +ENDCHAR +STARTCHAR U+7210 +ENCODING 29200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F8 +17FC +14C8 +3F78 +3DF0 +3550 +55F0 +1550 +15F0 +1FF8 +26A8 +2AA8 +57FC +0000 +ENDCHAR +STARTCHAR U+7213 +ENCODING 29203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27DF +2451 +27DF +2C51 +B7DF +A401 +A441 +A4FD +2589 +2411 +249D +7505 +55DD +5505 +CDFD +8403 +ENDCHAR +STARTCHAR U+7214 +ENCODING 29204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +13FE +13FE +1020 +53FE +5BCA +5088 +53FE +12A8 +13E8 +110A +11CC +284D +43D3 +0000 +0000 +ENDCHAR +STARTCHAR U+7217 +ENCODING 29207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +2202 +23FE +2A02 +ABFE +A888 +A3FE +A088 +23FE +2124 +27FF +7124 +5BFE +4820 +C3FE +8020 +ENDCHAR +STARTCHAR U+7219 +ENCODING 29209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +11EF +1129 +55EF +5844 +51FF +5044 +51FF +1044 +11FF +118A +2884 +44CB +0000 +0000 +ENDCHAR +STARTCHAR U+721A +ENCODING 29210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2070 +21DC +2707 +A8F8 +B000 +A777 +A555 +2777 +2000 +23FE +7292 +53FE +5A92 +CA92 +8296 +ENDCHAR +STARTCHAR U+721B +ENCODING 29211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17BC +14A4 +1FBC +3CA4 +37FC +37FC +55F4 +1554 +15F4 +1DF4 +2CE4 +2754 +444C +0000 +ENDCHAR +STARTCHAR U+721D +ENCODING 29213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27FC +2248 +2150 +27FC +ACA4 +B7FC +A000 +2788 +2488 +27FE +2488 +27C8 +5528 +4D08 +86A8 +0410 +ENDCHAR +STARTCHAR U+721E +ENCODING 29214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FC +5124 +5DFC +5022 +53FE +1000 +1104 +17DF +1555 +17DF +1104 +2945 +47DF +0000 +0000 +ENDCHAR +STARTCHAR U+721F +ENCODING 29215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +27FF +2088 +2BDE +AA52 +ABDE +A088 +A090 +21FE +2310 +25FE +7110 +51FE +5910 +C910 +81FF +ENDCHAR +STARTCHAR U+7222 +ENCODING 29218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2208 +2FBE +271C +2AAA +2110 +2F1E +2110 +4F1E +0110 +1F1F +0110 +1224 +0000 +0000 +ENDCHAR +STARTCHAR U+7223 +ENCODING 29219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +11FF +1101 +557D +5844 +507C +50FE +50BA +10FE +1010 +10FE +1010 +29FF +4529 +0000 +0000 +ENDCHAR +STARTCHAR U+7224 +ENCODING 29220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +27FF +2088 +2FDF +B451 +A7DF +A451 +A7DF +2421 +27FF +2525 +75FD +5525 +55FD +CCA9 +8525 +ENDCHAR +STARTCHAR U+7226 +ENCODING 29222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17C8 +150E +17D2 +145F +57D3 +5D15 +57DF +53FE +5202 +13FA +13FA +13FF +2909 +460F +0000 +0000 +ENDCHAR +STARTCHAR U+7227 +ENCODING 29223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1010 +11FF +1195 +5553 +59BB +51AB +51BB +1000 +10FE +1054 +10BA +2810 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+7228 +ENCODING 29224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF0 +15D0 +1FF0 +1EF0 +17D0 +3FFC +2428 +7FFC +0E70 +35AC +7FFC +1530 +6ACC +1C70 +0000 +ENDCHAR +STARTCHAR U+7229 +ENCODING 29225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +17DF +138E +5555 +57FF +7D53 +56B4 +5559 +16B2 +17F4 +1229 +2BC2 +4624 +03E8 +0000 +0000 +ENDCHAR +STARTCHAR U+722A +ENCODING 29226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +00E0 +0F20 +0920 +0920 +0920 +0920 +0920 +0910 +0910 +1110 +1108 +2108 +4104 +0000 +ENDCHAR +STARTCHAR U+722B +ENCODING 29227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +000C +00F8 +1F80 +1118 +110C +3186 +2083 +6081 +C000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+722C +ENCODING 29228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +06F8 +3AA8 +2AA8 +2AA8 +2AF8 +2A88 +2A80 +2A84 +2984 +297C +2880 +2860 +401C +0000 +ENDCHAR +STARTCHAR U+722D +ENCODING 29229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3FE0 +1210 +1108 +2108 +5FF0 +0110 +7FFC +0110 +0110 +1FF0 +0110 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+722F +ENCODING 29231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0018 +00F0 +1F90 +1108 +318C +6086 +0100 +1FF8 +1108 +1108 +1FF8 +1108 +1108 +FFFF +1008 +1038 +ENDCHAR +STARTCHAR U+7230 +ENCODING 29232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FE0 +1110 +1088 +2FF8 +4200 +7FFC +0400 +07F0 +0A20 +0940 +10C0 +2330 +5C0C +0000 +ENDCHAR +STARTCHAR U+7231 +ENCODING 29233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0078 +3F80 +1110 +0920 +7FFE +4202 +8204 +7FF8 +0400 +07F0 +0A20 +0940 +1080 +1160 +221C +0C08 +ENDCHAR +STARTCHAR U+7232 +ENCODING 29234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FE0 +1210 +1108 +2FE8 +4820 +0FF0 +0810 +0810 +0FFC +1524 +1A94 +2A04 +5038 +0000 +ENDCHAR +STARTCHAR U+7234 +ENCODING 29236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0003 +FF8E +94BA +92AA +FFAA +90AA +E8AA +AAAA +AAAA +EEAA +84AA +EDAA +9BAA +F2AB +80C9 +FF81 +ENDCHAR +STARTCHAR U+7235 +ENCODING 29237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0078 +3F90 +1220 +3FF8 +2448 +3FF8 +1E10 +13FC +1E90 +1250 +1E50 +1410 +1E10 +6130 +0000 +ENDCHAR +STARTCHAR U+7236 +ENCODING 29238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0420 +0810 +1008 +2448 +0440 +0440 +0280 +0280 +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+7237 +ENCODING 29239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0820 +1450 +0280 +0100 +06C0 +1830 +E00E +1FF0 +0210 +0210 +0210 +0250 +0220 +0200 +0200 +ENDCHAR +STARTCHAR U+7238 +ENCODING 29240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0420 +0C58 +3288 +0100 +0280 +0C60 +3018 +DFF6 +1110 +1110 +1FF0 +1010 +1004 +1004 +0FFC +ENDCHAR +STARTCHAR U+7239 +ENCODING 29241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0820 +3458 +0380 +06C0 +1A30 +67CE +8C44 +1380 +0680 +19F0 +0220 +0D40 +0180 +0600 +3800 +ENDCHAR +STARTCHAR U+723A +ENCODING 29242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +02C0 +0C30 +3248 +0180 +0660 +781C +3FF8 +1250 +1E70 +1248 +1E44 +1344 +7E78 +0240 +0000 +ENDCHAR +STARTCHAR U+723B +ENCODING 29243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +0040 +0F80 +0160 +0610 +3840 +0440 +0440 +0280 +0280 +0100 +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+723C +ENCODING 29244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +05F0 +6510 +1910 +0910 +15F0 +2110 +4510 +25F0 +1910 +0910 +1510 +27FC +4000 +0000 +ENDCHAR +STARTCHAR U+723D +ENCODING 29245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0508 +3568 +0910 +1D68 +65C8 +1930 +15A8 +66C8 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+723E +ENCODING 29246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1110 +610C +3FF8 +2318 +2D68 +2B58 +3398 +2D68 +2528 +2B58 +3188 +2118 +0000 +ENDCHAR +STARTCHAR U+723F +ENCODING 29247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0420 +0420 +0420 +07E0 +0420 +0020 +3FE0 +0220 +0220 +0220 +0420 +0820 +3020 +0000 +ENDCHAR +STARTCHAR U+7240 +ENCODING 29248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +2440 +2440 +2440 +3FFC +2440 +04E0 +7CE0 +1550 +1550 +1648 +2444 +2440 +4440 +0000 +ENDCHAR +STARTCHAR U+7241 +ENCODING 29249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +4BFF +4804 +4804 +49E4 +7924 +0924 +0924 +F924 +4924 +49E4 +4804 +4804 +4804 +8804 +081C +ENDCHAR +STARTCHAR U+7242 +ENCODING 29250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +498C +4888 +4BFE +4820 +7820 +0820 +09FC +F820 +4820 +4820 +4FFF +4820 +4820 +8820 +0820 +ENDCHAR +STARTCHAR U+7243 +ENCODING 29251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +5124 +57FF +5124 +5124 +713C +1100 +11FE +F020 +57FF +50A8 +50A8 +51AC +5326 +9623 +1020 +ENDCHAR +STARTCHAR U+7244 +ENCODING 29252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0438 +2444 +2492 +2511 +26FE +7C82 +04FE +7C82 +24FE +2480 +25FE +2682 +2482 +44FE +0000 +0000 +ENDCHAR +STARTCHAR U+7245 +ENCODING 29253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +57FF +5420 +55FE +5422 +77FF +1422 +15FE +F420 +55FE +5522 +55FE +5522 +55FE +9922 +1126 +ENDCHAR +STARTCHAR U+7246 +ENCODING 29254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +2840 +2FFC +2950 +3B58 +2CE4 +0FFC +7800 +2BF8 +2AE8 +2AA8 +2AE8 +2BF8 +4A08 +0000 +ENDCHAR +STARTCHAR U+7247 +ENCODING 29255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +0840 +0FFC +0800 +0800 +0FE0 +0820 +0820 +1020 +1020 +2020 +4020 +0000 +ENDCHAR +STARTCHAR U+7248 +ENCODING 29256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2800 +29FC +2900 +2900 +3FF8 +2188 +2188 +3D50 +2550 +2520 +2620 +2650 +4588 +4604 +0000 +ENDCHAR +STARTCHAR U+7249 +ENCODING 29257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2292 +2292 +2254 +3E10 +20FE +2010 +3E10 +23FF +2210 +2210 +2210 +2210 +4010 +0000 +0000 +ENDCHAR +STARTCHAR U+724A +ENCODING 29258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2202 +22FF +2222 +2222 +2222 +3E4A +2084 +2000 +3EFE +2282 +2282 +2282 +22FE +4282 +0000 +0000 +ENDCHAR +STARTCHAR U+724B +ENCODING 29259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2450 +2448 +247C +25C8 +3E30 +2074 +218C +3C54 +247C +27C8 +2430 +2474 +258C +4404 +0000 +ENDCHAR +STARTCHAR U+724C +ENCODING 29260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2840 +2880 +2BF8 +2A48 +3FF8 +2248 +23F8 +3AA8 +28A0 +2920 +2FFC +2820 +2820 +4820 +0000 +ENDCHAR +STARTCHAR U+724D +ENCODING 29261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +4848 +4BFC +4840 +4BFE +7C02 +4124 +40A0 +7A20 +4920 +4824 +4FFE +4840 +4850 +888C +0304 +ENDCHAR +STARTCHAR U+724E +ENCODING 29262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4880 +4880 +49FF +4B29 +48C9 +7C71 +4099 +412B +4042 +780E +4810 +485A +494B +4941 +CB44 +8A3C +ENDCHAR +STARTCHAR U+724F +ENCODING 29263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +5020 +5070 +50D8 +518C +7B77 +4000 +43C2 +4252 +7252 +53D2 +5252 +5252 +53C2 +5242 +D242 +92CE +ENDCHAR +STARTCHAR U+7250 +ENCODING 29264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4806 +481C +49F0 +4810 +7C10 +41FF +4010 +40D0 +7997 +4911 +4911 +49D7 +4911 +4911 +C9FF +8800 +ENDCHAR +STARTCHAR U+7252 +ENCODING 29266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2950 +2950 +2BFC +2950 +3D50 +2170 +2100 +39F8 +2840 +2FFC +28E0 +2950 +2E4C +4840 +0000 +ENDCHAR +STARTCHAR U+7253 +ENCODING 29267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4820 +4820 +4BFF +4884 +7C48 +43FF +4201 +4221 +7820 +4BFF +4840 +487E +4842 +48C2 +C982 +8B0E +ENDCHAR +STARTCHAR U+7255 +ENCODING 29269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4810 +4820 +49FE +4922 +7DBA +414A +41AA +4112 +792A +4902 +49FE +4810 +495A +494B +CB45 +8A3C +ENDCHAR +STARTCHAR U+7256 +ENCODING 29270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +5024 +57FE +5404 +57FC +7C28 +47FE +4420 +75FC +5524 +55FC +5524 +55FC +5524 +9924 +112C +ENDCHAR +STARTCHAR U+7258 +ENCODING 29272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2840 +2FFC +29F0 +2BF8 +3EA8 +2338 +23F8 +39F0 +2910 +29F0 +29F0 +29F0 +2990 +4E08 +0000 +ENDCHAR +STARTCHAR U+7259 +ENCODING 29273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0840 +0840 +0840 +0840 +7FFC +00C0 +0140 +0240 +0440 +1840 +6040 +00C0 +0000 +ENDCHAR +STARTCHAR U+725A +ENCODING 29274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +3118 +1110 +FFFF +8001 +9FF9 +1008 +1FF8 +0000 +1FFC +1020 +FFFF +0320 +0E20 +7820 +00E0 +ENDCHAR +STARTCHAR U+725B +ENCODING 29275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +0900 +0900 +1FF0 +1100 +2100 +0100 +7FFC +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+725C +ENCODING 29276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0480 +0480 +0480 +0FF8 +0880 +1880 +0080 +00B8 +00E0 +0380 +0E80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+725D +ENCODING 29277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +2880 +2880 +2888 +3E88 +2890 +48A0 +08C0 +0E80 +7880 +0880 +0884 +0884 +087C +0000 +ENDCHAR +STARTCHAR U+725E +ENCODING 29278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +5020 +5020 +5020 +7DFE +D022 +9022 +1022 +1022 +1C22 +F022 +1062 +1046 +1044 +10C4 +119C +ENDCHAR +STARTCHAR U+725F +ENCODING 29279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0240 +0220 +04F0 +3F08 +0900 +0FF0 +1100 +2100 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7260 +ENCODING 29280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +5120 +5120 +5126 +7D3A +D162 +91A2 +1722 +1122 +1D22 +7126 +D120 +1100 +1101 +1183 +10FE +ENDCHAR +STARTCHAR U+7261 +ENCODING 29281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +2840 +2840 +3E40 +29F8 +2840 +4840 +0E40 +7840 +0840 +0840 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7262 +ENCODING 29282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4900 +0900 +0FF0 +1100 +2100 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7263 +ENCODING 29283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +51FE +5022 +5022 +7CA2 +D0A2 +90A2 +11A2 +1122 +1C62 +7042 +D042 +10C6 +1084 +1184 +131C +ENDCHAR +STARTCHAR U+7266 +ENCODING 29286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +081C +2BE0 +2840 +3E40 +485C +49E0 +8840 +0E44 +187E +6BC0 +0840 +0842 +0842 +083E +0800 +ENDCHAR +STARTCHAR U+7267 +ENCODING 29287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +2880 +2880 +3EFC +2910 +2990 +4A90 +0E50 +7860 +0820 +0850 +0988 +0E04 +0000 +ENDCHAR +STARTCHAR U+7268 +ENCODING 29288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +5020 +5020 +53FF +7C00 +D000 +90F8 +1088 +1C88 +7088 +D088 +1088 +1188 +1109 +1309 +1607 +ENDCHAR +STARTCHAR U+7269 +ENCODING 29289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +2900 +2900 +29F8 +3EA8 +2AA8 +4CA8 +0928 +0D28 +7A48 +0848 +0888 +0908 +0830 +0000 +ENDCHAR +STARTCHAR U+726A +ENCODING 29290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2890 +2890 +3CFE +4890 +0910 +0C10 +19FF +6810 +0810 +0810 +0810 +0810 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+726B +ENCODING 29291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +5026 +5022 +5020 +FC3F +93E0 +1022 +1032 +1016 +1C14 +F01C +1008 +101C +1075 +13C7 +1002 +ENDCHAR +STARTCHAR U+726C +ENCODING 29292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2813 +283C +3DD0 +4910 +0910 +0DFF +1831 +2851 +4891 +0911 +0A16 +0810 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+726E +ENCODING 29294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08A0 +0894 +089E +17E0 +3080 +5044 +9134 +190C +0920 +0FF0 +1100 +2104 +FFFE +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+726F +ENCODING 29295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +2820 +2820 +3E24 +4BFE +4820 +8820 +0E24 +19FE +6904 +0904 +0904 +0904 +09FC +0904 +ENDCHAR +STARTCHAR U+7270 +ENCODING 29296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2810 +2810 +3DFF +4911 +0911 +0D11 +19FF +6911 +0911 +0911 +09FF +0901 +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+7271 +ENCODING 29297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +5000 +53FF +5004 +FC04 +91E4 +1124 +1124 +1124 +1D24 +F124 +11E4 +1004 +1004 +1004 +101C +ENDCHAR +STARTCHAR U+7272 +ENCODING 29298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A0 +28A0 +28A0 +3FFC +2920 +2A20 +4820 +0DF8 +7820 +0820 +0820 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7273 +ENCODING 29299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +28FF +2882 +3EA2 +2892 +488A +09FF +0C82 +18A2 +2892 +488A +08FF +0802 +081C +0000 +0000 +ENDCHAR +STARTCHAR U+7274 +ENCODING 29300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +29E0 +2920 +3F20 +29FC +2920 +4920 +0F20 +79D0 +0B14 +080C +0BFC +0804 +0000 +ENDCHAR +STARTCHAR U+7275 +ENCODING 29301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0110 +3FF8 +0280 +0460 +0820 +7FFE +4902 +8924 +1FF0 +2100 +0108 +7FFC +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+7276 +ENCODING 29302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +0888 +0490 +1FFC +0100 +7FFF +0410 +0888 +1284 +27F2 +4881 +1FFC +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7277 +ENCODING 29303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +5038 +506C +50C6 +FD83 +9000 +10FE +1010 +1010 +1C10 +F0FE +1010 +1010 +1010 +11FF +1000 +ENDCHAR +STARTCHAR U+7278 +ENCODING 29304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +5020 +51FF +5101 +7D01 +D0FE +9004 +1008 +1C10 +71FF +D010 +1010 +1010 +1010 +1010 +1070 +ENDCHAR +STARTCHAR U+7279 +ENCODING 29305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +2BF8 +2840 +3C40 +2BFC +2810 +4810 +0FFC +7910 +0890 +0890 +0810 +0830 +0000 +ENDCHAR +STARTCHAR U+727A +ENCODING 29306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +57FE +5090 +7C90 +5094 +97FE +1A94 +3294 +D294 +1294 +128C +1304 +1204 +13FC +1204 +ENDCHAR +STARTCHAR U+727B +ENCODING 29307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +5098 +5088 +53FF +7C84 +D08C +9098 +10B2 +1086 +1C8C +71D9 +D143 +1146 +135D +1261 +163F +ENDCHAR +STARTCHAR U+727C +ENCODING 29308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +53FF +5000 +5092 +FC92 +9124 +1124 +1092 +1092 +1C00 +71FE +D020 +1020 +1020 +13FF +1000 +ENDCHAR +STARTCHAR U+727D +ENCODING 29309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +06C0 +0300 +7FFC +4448 +5FE0 +0910 +0FE0 +1100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+727E +ENCODING 29310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +2840 +2840 +3FF0 +2890 +2890 +4BFC +0C00 +79F8 +0908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+727F +ENCODING 29311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +28A0 +28A8 +3EFC +4920 +4824 +8BFE +0E00 +1804 +69FE +0904 +0904 +0904 +09FC +0904 +ENDCHAR +STARTCHAR U+7280 +ENCODING 29312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1008 +1FF8 +1088 +16B0 +1080 +16B0 +1280 +17F0 +2880 +2FF8 +4080 +0080 +0000 +ENDCHAR +STARTCHAR U+7281 +ENCODING 29313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +3C48 +0848 +7F48 +1C48 +1A48 +2A08 +4918 +1100 +1FF8 +2100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7282 +ENCODING 29314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0680 +3880 +08F8 +7FA8 +1D28 +1A48 +2A88 +4930 +1100 +1FF8 +2100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7284 +ENCODING 29316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +2BFC +28A0 +3E98 +4908 +4FFE +8808 +0DE8 +1928 +6928 +0928 +09E8 +0808 +0828 +0810 +ENDCHAR +STARTCHAR U+7285 +ENCODING 29317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FF +2901 +2945 +3D29 +49FF +0D11 +0911 +0955 +1955 +2955 +497D +0901 +0905 +0902 +0000 +0000 +ENDCHAR +STARTCHAR U+7286 +ENCODING 29318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +4810 +49FF +7C10 +48FE +4882 +0CFE +0882 +18FE +2882 +48FE +0882 +0882 +0BFF +0000 +0000 +ENDCHAR +STARTCHAR U+7287 +ENCODING 29319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +0FF0 +1100 +3FF8 +0100 +0920 +28A0 +3EF8 +28A0 +4F20 +79FC +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+7288 +ENCODING 29320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0892 +0854 +2838 +29FF +3C10 +49FF +0828 +0C44 +08FE +1945 +2844 +4848 +0841 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+7289 +ENCODING 29321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +5020 +53FF +5000 +7CFC +D084 +90FC +1000 +1DFE +700C +D010 +13FF +1020 +1020 +1020 +10E0 +ENDCHAR +STARTCHAR U+728A +ENCODING 29322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1028 +51FC +5020 +7C20 +53FE +9092 +1454 +1910 +3094 +D7FE +1020 +1020 +1050 +108C +1304 +ENDCHAR +STARTCHAR U+728B +ENCODING 29323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +09FC +2908 +29F8 +3F08 +49F8 +4B08 +8DF8 +0908 +1908 +6FFE +0800 +0910 +0908 +0A04 +0C04 +ENDCHAR +STARTCHAR U+728C +ENCODING 29324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09EF +2921 +2921 +3D21 +49EF +0900 +0D0F +09E1 +1909 +2906 +09E6 +0909 +0909 +0909 +0000 +0000 +ENDCHAR +STARTCHAR U+728D +ENCODING 29325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +577C +5114 +7DFE +9214 +147C +1710 +197C +3510 +D5FE +1210 +1310 +1296 +147C +1800 +ENDCHAR +STARTCHAR U+728E +ENCODING 29326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +7F04 +087F +FF84 +0824 +7F34 +0814 +0F84 +F81C +0100 +1100 +3FF8 +2100 +FFFF +0100 +0100 +ENDCHAR +STARTCHAR U+728F +ENCODING 29327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +53FE +5204 +7E04 +93FC +1200 +1204 +1FFE +3354 +D354 +15FC +1554 +1954 +1154 +110C +ENDCHAR +STARTCHAR U+7290 +ENCODING 29328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0842 +2B82 +2892 +3C8A +4BE2 +0892 +0C8A +09C2 +1ABF +2882 +4882 +0882 +0882 +0882 +0000 +0000 +ENDCHAR +STARTCHAR U+7291 +ENCODING 29329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FE +2882 +28FE +3E82 +48FE +0882 +0CFE +0812 +1811 +29FF +0828 +0844 +0882 +0901 +0000 +0000 +ENDCHAR +STARTCHAR U+7292 +ENCODING 29330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +2BFC +2800 +3DF0 +2910 +29F0 +4800 +0FF8 +7A08 +0AE8 +0AA8 +0AE8 +0A18 +0000 +ENDCHAR +STARTCHAR U+7293 +ENCODING 29331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +51FF +5221 +5125 +FD25 +91FD +1043 +1086 +1C80 +71FF +D221 +1125 +1125 +11FD +1043 +1086 +ENDCHAR +STARTCHAR U+7295 +ENCODING 29333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2844 +29FF +3C44 +4844 +09FF +0880 +0CFE +0992 +1AFE +2892 +08FE +0892 +0892 +0906 +0000 +0000 +ENDCHAR +STARTCHAR U+7296 +ENCODING 29334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +2AA8 +2CB0 +4920 +1450 +2288 +3FFC +2908 +4FF0 +1100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7297 +ENCODING 29335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2810 +29FF +3D11 +487C +0810 +087C +0C10 +19FF +2800 +08FE +0882 +0882 +08FE +0000 +0000 +ENDCHAR +STARTCHAR U+7298 +ENCODING 29336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2208 +2FBE +2208 +271C +2AAA +2208 +2440 +2FFE +5040 +1FFF +0040 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+729A +ENCODING 29338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FC2 +2042 +3FC2 +203F +2F92 +200A +5FC2 +0A82 +124E +0840 +0FFC +1040 +2FFE +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+729B +ENCODING 29339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F20 +087F +FFC4 +2A28 +4910 +882C +08C3 +0000 +7FFF +4480 +4FF8 +4880 +BFFF +0080 +0080 +ENDCHAR +STARTCHAR U+729D +ENCODING 29341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +28FE +2844 +3DFF +2800 +48FE +0892 +0CFE +1892 +68FE +0810 +08FE +0810 +09FF +0000 +0000 +ENDCHAR +STARTCHAR U+729E +ENCODING 29342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +28FE +2810 +3DFF +4844 +08FE +0945 +0C7C +0800 +79FF +0901 +097D +0945 +097D +0903 +0000 +0000 +ENDCHAR +STARTCHAR U+729F +ENCODING 29343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFC +0504 +7DFC +4420 +41FC +7D24 +05FC +2828 +13FC +1102 +1FF8 +2100 +FFFE +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+72A0 +ENCODING 29344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +08A0 +2BFC +2840 +3DF8 +2840 +4BFC +0DE8 +18A4 +6FFC +08E8 +0B94 +08AC +09C4 +0000 +ENDCHAR +STARTCHAR U+72A1 +ENCODING 29345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFF +2A24 +2AFF +3E24 +2A7E +4A4A +0E7E +0A4A +1A7E +0A08 +2AFF +4A89 +0CBD +0887 +0000 +0000 +ENDCHAR +STARTCHAR U+72A2 +ENCODING 29346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0BFC +29F0 +2BF8 +3EB8 +2B18 +2BF8 +49F0 +0D10 +79F0 +09F0 +09F0 +0990 +0E08 +0000 +ENDCHAR +STARTCHAR U+72A3 +ENCODING 29347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0892 +2924 +2892 +3C00 +49FF +0911 +0929 +0DFF +1800 +29B4 +496C +09B5 +096D +09B3 +0000 +0000 +ENDCHAR +STARTCHAR U+72A4 +ENCODING 29348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FF +2929 +3DFF +4880 +0948 +0BEF +0808 +19EF +2920 +49E8 +092F +09E8 +0929 +0A6F +0000 +0000 +ENDCHAR +STARTCHAR U+72A5 +ENCODING 29349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +29FF +2924 +3DFF +49A5 +09FF +0D55 +1966 +2944 +4955 +0A77 +0800 +0929 +0929 +0000 +0000 +ENDCHAR +STARTCHAR U+72A6 +ENCODING 29350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FF +0901 +29FF +2901 +3DFF +2844 +49FF +0C44 +09FF +1896 +29F9 +4838 +0854 +0892 +0000 +0000 +ENDCHAR +STARTCHAR U+72A7 +ENCODING 29351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0BFC +2840 +29F8 +3FFC +29E8 +28A4 +4BFC +0DE8 +7AA8 +0BD8 +09D4 +0A6C +08C4 +0000 +ENDCHAR +STARTCHAR U+72A8 +ENCODING 29352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2424 +7F7F +C8C8 +7E7E +4848 +7E7E +4848 +7F7F +0100 +1100 +3FF8 +2100 +0100 +FFFF +0100 +0100 +ENDCHAR +STARTCHAR U+72A9 +ENCODING 29353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E3E +086A +7FBE +1C2A +2A3E +140A +7F1D +142F +0849 +368F +0FF8 +1080 +3FFC +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+72AA +ENCODING 29354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +13FE +5020 +7D77 +5155 +15F7 +1D74 +1555 +37F7 +5108 +12FC +1150 +1220 +31DE +0000 +0000 +ENDCHAR +STARTCHAR U+72AC +ENCODING 29356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0120 +0110 +0110 +7FFC +0100 +0300 +0280 +0280 +0440 +0440 +0820 +1010 +600C +0000 +ENDCHAR +STARTCHAR U+72AD +ENCODING 29357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +8800 +5000 +2000 +5000 +8800 +0800 +1800 +2800 +4800 +8800 +0800 +0800 +0800 +5000 +2000 +ENDCHAR +STARTCHAR U+72AE +ENCODING 29358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +020C +0204 +FFFF +0400 +0400 +0410 +0E10 +0A30 +0B20 +1960 +31C0 +60E0 +C1B0 +071C +1C07 +ENDCHAR +STARTCHAR U+72AF +ENCODING 29359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +45F8 +2908 +1108 +3108 +4908 +0908 +1930 +2900 +4900 +0900 +0904 +0904 +30FC +0000 +ENDCHAR +STARTCHAR U+72B0 +ENCODING 29360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +8880 +5080 +2090 +57F8 +8890 +0890 +1890 +2890 +4910 +8910 +0910 +0A12 +0A12 +540E +2800 +ENDCHAR +STARTCHAR U+72B1 +ENCODING 29361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +8840 +5040 +2040 +23F8 +5048 +9048 +1148 +30C8 +3048 +5068 +90A8 +10A8 +1189 +330D +E607 +ENDCHAR +STARTCHAR U+72B2 +ENCODING 29362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +4420 +2820 +1020 +37FC +4860 +0860 +18A0 +28A0 +4920 +0A20 +0C20 +3020 +1060 +0000 +ENDCHAR +STARTCHAR U+72B4 +ENCODING 29364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +8BF8 +5040 +2040 +5040 +8844 +0FFE +1840 +2840 +4840 +8840 +0840 +0840 +0840 +5040 +2040 +ENDCHAR +STARTCHAR U+72B5 +ENCODING 29365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4480 +2882 +10FF +2900 +4400 +04FE +0C04 +1408 +2410 +4420 +0441 +0481 +2901 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+72B6 +ENCODING 29366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +0848 +4848 +2FFC +2840 +0840 +0840 +18A0 +28A0 +4910 +0A10 +0C08 +0804 +0000 +ENDCHAR +STARTCHAR U+72B7 +ENCODING 29367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8820 +5024 +21FE +5100 +8900 +0900 +1900 +2900 +4900 +8900 +0900 +0A00 +0A00 +5400 +2800 +ENDCHAR +STARTCHAR U+72B8 +ENCODING 29368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +8BF8 +5010 +2110 +5110 +8910 +0910 +1914 +29FE +4804 +8824 +0FF4 +0804 +0804 +5028 +2010 +ENDCHAR +STARTCHAR U+72B9 +ENCODING 29369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0450 +4448 +2848 +1040 +37FC +48C0 +08C0 +18C0 +28C0 +4940 +0940 +0A44 +3444 +183C +0000 +ENDCHAR +STARTCHAR U+72BA +ENCODING 29370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +2812 +11FF +2800 +4400 +047C +0C44 +1444 +2444 +4444 +0444 +0485 +2905 +1207 +0000 +0000 +ENDCHAR +STARTCHAR U+72BD +ENCODING 29373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4400 +28FE +1084 +2884 +4484 +04FF +0C14 +1424 +2444 +4484 +0504 +0404 +2824 +1018 +0000 +0000 +ENDCHAR +STARTCHAR U+72BE +ENCODING 29374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +882C +5026 +2022 +2020 +57FF +9020 +1020 +3070 +3050 +5050 +90D8 +1088 +118C +3306 +E603 +ENDCHAR +STARTCHAR U+72BF +ENCODING 29375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4440 +2820 +1010 +29FF +4410 +0410 +0C18 +1414 +2412 +4410 +0410 +0410 +2810 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+72C0 +ENCODING 29376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +2214 +2212 +2210 +2210 +3FFF +2210 +0228 +0228 +3E28 +1248 +1244 +1244 +2282 +2282 +4301 +ENDCHAR +STARTCHAR U+72C1 +ENCODING 29377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8840 +5040 +2090 +5108 +8A04 +0BFE +1890 +2890 +4890 +8890 +0890 +0912 +0912 +520E +2400 +ENDCHAR +STARTCHAR U+72C2 +ENCODING 29378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4FFC +3040 +1040 +3040 +4840 +0BF8 +1840 +2840 +4840 +0840 +0840 +3FFC +1000 +0000 +ENDCHAR +STARTCHAR U+72C3 +ENCODING 29379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +47F0 +2890 +1090 +3090 +4890 +0BFC +1890 +2890 +4890 +0890 +0890 +3FFC +1000 +0000 +ENDCHAR +STARTCHAR U+72C4 +ENCODING 29380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4840 +3048 +1148 +3150 +4960 +0A40 +1A60 +2860 +48A0 +0890 +0910 +3208 +1404 +0000 +ENDCHAR +STARTCHAR U+72C5 +ENCODING 29381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +4406 +2818 +11F0 +2810 +4410 +0410 +0DFF +1410 +2410 +4410 +0410 +0810 +31FF +0000 +0000 +ENDCHAR +STARTCHAR U+72C6 +ENCODING 29382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4840 +3040 +13F8 +3248 +4A48 +0A48 +1BF8 +2A48 +4840 +0840 +0840 +3040 +1040 +0000 +ENDCHAR +STARTCHAR U+72C7 +ENCODING 29383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8820 +5020 +2020 +27FF +50A8 +90A8 +10A8 +31AC +3124 +5326 +9222 +1623 +1020 +3020 +E020 +ENDCHAR +STARTCHAR U+72C8 +ENCODING 29384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +4404 +29FE +1104 +2924 +4924 +8924 +0924 +1924 +2924 +4924 +8944 +0850 +0888 +5106 +2202 +ENDCHAR +STARTCHAR U+72C9 +ENCODING 29385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +89FE +5010 +2010 +2030 +5020 +9068 +10EC +31A6 +3323 +5020 +9020 +1020 +1000 +33FF +E000 +ENDCHAR +STARTCHAR U+72CA +ENCODING 29386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FFA +0081 +0080 +7FFF +0140 +0220 +0410 +380E +0000 +0000 +ENDCHAR +STARTCHAR U+72CB +ENCODING 29387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4400 +28FE +1000 +2800 +4400 +0DFF +1410 +2410 +4454 +0493 +0511 +0410 +2850 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+72CC +ENCODING 29388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8920 +5120 +2120 +21FE +5320 +9220 +1020 +3020 +31FC +5020 +9020 +1020 +1020 +37FF +E000 +ENDCHAR +STARTCHAR U+72CD +ENCODING 29389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0500 +8904 +51FE +2204 +5224 +8DF4 +0924 +1924 +2924 +49E4 +8928 +0910 +0902 +0902 +50FE +2000 +ENDCHAR +STARTCHAR U+72CE +ENCODING 29390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BF8 +3248 +1248 +33F8 +4A48 +0A48 +1BF8 +2A48 +4840 +0840 +0840 +3040 +1040 +0000 +ENDCHAR +STARTCHAR U+72D0 +ENCODING 29392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +4430 +29D0 +1150 +3150 +4950 +0950 +1950 +2950 +4968 +0958 +0A78 +3394 +1404 +0000 +ENDCHAR +STARTCHAR U+72D1 +ENCODING 29393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4420 +2850 +1088 +2904 +4A02 +0CF1 +1800 +2BFE +4804 +0808 +0810 +08A0 +5040 +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+72D2 +ENCODING 29394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +04A0 +44A0 +2BF8 +10A8 +30A8 +4BF8 +0AA8 +1AA0 +2BFC +4AA4 +08A4 +0938 +3220 +1420 +0000 +ENDCHAR +STARTCHAR U+72D4 +ENCODING 29396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +45FF +2902 +1102 +29FE +4900 +0940 +1940 +2940 +497E +0940 +0941 +1241 +607F +0000 +0000 +ENDCHAR +STARTCHAR U+72D5 +ENCODING 29397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0908 +8908 +5308 +2208 +263F +5489 +9689 +1389 +3109 +3109 +5319 +9251 +1253 +17F2 +3C22 +E06E +ENDCHAR +STARTCHAR U+72D6 +ENCODING 29398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8820 +5020 +23FE +2202 +5202 +9202 +1088 +3088 +3088 +5088 +9088 +118C +1104 +3306 +E603 +ENDCHAR +STARTCHAR U+72D7 +ENCODING 29399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +4880 +3080 +11F8 +3108 +4A08 +0DE8 +1928 +2928 +49E8 +0928 +0808 +3008 +1030 +0000 +ENDCHAR +STARTCHAR U+72D8 +ENCODING 29400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +8826 +5022 +2020 +23FF +5220 +9222 +1222 +3236 +3214 +521C +9208 +139C +1635 +3067 +E0C2 +ENDCHAR +STARTCHAR U+72D9 +ENCODING 29401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +45F0 +2910 +1110 +3110 +49F0 +0910 +1910 +19F0 +2910 +4910 +0910 +0FFC +3000 +0000 +ENDCHAR +STARTCHAR U+72DA +ENCODING 29402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +4400 +28FE +1082 +2882 +4482 +04FE +0C82 +1482 +2482 +44FE +0482 +0800 +31FF +0000 +0000 +ENDCHAR +STARTCHAR U+72DB +ENCODING 29403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +4440 +2880 +11F8 +3108 +4908 +0908 +19F8 +2908 +4908 +0908 +0908 +31F8 +1108 +0000 +ENDCHAR +STARTCHAR U+72DC +ENCODING 29404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +2810 +1012 +29FF +4410 +0410 +0C12 +14FF +2482 +4482 +0482 +0482 +28FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+72DE +ENCODING 29406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4420 +2C20 +13FE +2A02 +4C04 +8800 +0BFE +1820 +2820 +4820 +8820 +0820 +0820 +50A0 +2040 +ENDCHAR +STARTCHAR U+72DF +ENCODING 29407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +8BFE +5000 +2000 +21FC +5104 +9104 +11FC +3104 +3104 +5104 +91FC +1000 +1000 +37FF +E000 +ENDCHAR +STARTCHAR U+72E0 +ENCODING 29408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +45F0 +2910 +1110 +31F0 +4910 +0910 +19F4 +2944 +4928 +0930 +0910 +31C8 +1704 +0000 +ENDCHAR +STARTCHAR U+72E1 +ENCODING 29409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4840 +37FC +1110 +3108 +4B14 +0D14 +18A0 +28A0 +4840 +08A0 +0910 +3208 +1C04 +0000 +ENDCHAR +STARTCHAR U+72E2 +ENCODING 29410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +4880 +31F0 +1110 +3320 +4CC0 +08C0 +1930 +2FFC +4A10 +0A10 +0A10 +33F0 +1210 +0000 +ENDCHAR +STARTCHAR U+72E3 +ENCODING 29411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4890 +5090 +2090 +5492 +0A94 +0998 +1890 +2998 +4A94 +0C92 +0890 +0910 +1211 +641F +0000 +0000 +ENDCHAR +STARTCHAR U+72E4 +ENCODING 29412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +2810 +11FF +2810 +4410 +0410 +0CFE +1400 +24FE +0482 +0482 +0482 +08FE +3082 +0000 +0000 +ENDCHAR +STARTCHAR U+72E5 +ENCODING 29413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +8900 +51FE +2302 +2202 +57F2 +9112 +1112 +31F2 +3112 +5112 +9112 +11F2 +1006 +3004 +E01C +ENDCHAR +STARTCHAR U+72E6 +ENCODING 29414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +44FE +28AA +10AA +28AA +45FF +04AA +0CAA +14AA +25FF +44AA +04AA +04AA +08AA +3086 +0000 +0000 +ENDCHAR +STARTCHAR U+72E8 +ENCODING 29416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +8828 +5024 +2020 +57FE +8820 +0920 +1928 +2FE8 +4928 +8928 +0910 +0912 +0A2A +50C6 +2002 +ENDCHAR +STARTCHAR U+72E9 +ENCODING 29417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4840 +33FC +1208 +3410 +4810 +0FFC +1810 +2910 +4890 +0890 +0810 +3010 +1030 +0000 +ENDCHAR +STARTCHAR U+72EA +ENCODING 29418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +49FF +2901 +1101 +297D +4901 +097D +1945 +2945 +4945 +097D +0945 +0901 +5105 +2102 +0000 +0000 +ENDCHAR +STARTCHAR U+72EB +ENCODING 29419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4440 +2842 +13FC +2848 +4850 +0FFF +1840 +2880 +4940 +0A7E +0840 +0840 +5040 +207F +0000 +0000 +ENDCHAR +STARTCHAR U+72EC +ENCODING 29420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +4440 +2840 +13F8 +3248 +4A48 +0A48 +1BF8 +2A48 +4850 +0848 +0878 +3784 +1004 +0000 +ENDCHAR +STARTCHAR U+72ED +ENCODING 29421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +4440 +2840 +17FC +3248 +4948 +0950 +1FFC +2840 +48A0 +08A0 +0910 +3208 +1404 +0000 +ENDCHAR +STARTCHAR U+72EE +ENCODING 29422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +89FE +5110 +2510 +557C +9554 +1554 +1554 +3554 +5554 +9554 +1554 +1154 +125C +5410 +2010 +ENDCHAR +STARTCHAR U+72EF +ENCODING 29423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8840 +50A0 +2110 +520E +8C24 +09F0 +1800 +2804 +4FFE +8840 +0880 +0910 +0A08 +53FC +2004 +ENDCHAR +STARTCHAR U+72F0 +ENCODING 29424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0280 +4480 +29F8 +1210 +2820 +4BF8 +8848 +0848 +1FFE +2848 +4848 +8BF8 +0848 +0840 +2940 +1080 +ENDCHAR +STARTCHAR U+72F1 +ENCODING 29425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +8820 +5430 +2228 +5220 +91FE +1E20 +1220 +3220 +5220 +92D0 +1350 +1288 +1088 +A106 +4204 +ENDCHAR +STARTCHAR U+72F2 +ENCODING 29426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +8810 +5790 +2090 +5110 +9210 +12D8 +3354 +5654 +9A52 +1292 +1210 +1210 +1A10 +A450 +4020 +ENDCHAR +STARTCHAR U+72F3 +ENCODING 29427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8840 +50A0 +2110 +5208 +8DF6 +0840 +1848 +2FFC +4840 +8950 +0948 +0A44 +0C44 +5140 +2080 +ENDCHAR +STARTCHAR U+72F4 +ENCODING 29428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +8A20 +5224 +2228 +53B0 +8A20 +0A22 +1AA2 +2B1E +4840 +8848 +0BFC +0840 +0844 +57FE +2000 +ENDCHAR +STARTCHAR U+72F6 +ENCODING 29430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4444 +2828 +1010 +2828 +4454 +05FF +0448 +0CFF +1549 +2449 +4449 +044B +2808 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+72F7 +ENCODING 29431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BF8 +3208 +1208 +33F8 +4800 +0BF8 +1A08 +2BF8 +4A08 +0BF8 +0A08 +3208 +1218 +0000 +ENDCHAR +STARTCHAR U+72F8 +ENCODING 29432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BF8 +3248 +1248 +33F8 +4A48 +0A48 +1BF8 +2840 +4BF8 +0840 +0840 +3FFC +1000 +0000 +ENDCHAR +STARTCHAR U+72F9 +ENCODING 29433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4840 +3040 +17FC +3150 +4950 +0950 +1AE8 +2C44 +48A0 +08A0 +0910 +3208 +1404 +0000 +ENDCHAR +STARTCHAR U+72FA +ENCODING 29434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +8844 +57FE +2000 +5000 +8BFC +0800 +1BFC +2800 +4804 +8BFE +0A04 +0A04 +0A04 +53FC +2204 +ENDCHAR +STARTCHAR U+72FB +ENCODING 29435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8880 +5110 +2208 +57FC +9110 +1208 +3504 +51F8 +9108 +1310 +14A0 +1040 +10B0 +A10E +4604 +ENDCHAR +STARTCHAR U+72FC +ENCODING 29436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +4440 +29F0 +1110 +3110 +49F0 +0910 +19F0 +2948 +4928 +0930 +0950 +0988 +3604 +0000 +ENDCHAR +STARTCHAR U+72FD +ENCODING 29437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +45F8 +2908 +1108 +31F8 +4908 +09F8 +1908 +1908 +29F8 +4890 +0888 +0904 +3204 +0000 +ENDCHAR +STARTCHAR U+72FE +ENCODING 29438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1202 +920E +5238 +6220 +2FA0 +623F +A224 +2224 +23A4 +6E24 +A224 +2224 +2264 +2244 +22C4 +C604 +ENDCHAR +STARTCHAR U+72FF +ENCODING 29439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4801 +539E +2084 +5104 +0A04 +0917 +1894 +2894 +4894 +0894 +0ABF +0900 +5280 +247F +0000 +0000 +ENDCHAR +STARTCHAR U+7300 +ENCODING 29440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4A08 +2908 +1088 +282A +4849 +0A09 +0909 +1889 +2802 +4884 +0908 +0A10 +2820 +10C0 +0000 +0000 +ENDCHAR +STARTCHAR U+7301 +ENCODING 29441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +88C4 +5704 +2114 +5114 +9154 +1FF4 +3114 +5314 +9394 +1554 +1514 +1904 +1104 +A114 +4108 +ENDCHAR +STARTCHAR U+7302 +ENCODING 29442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +89FC +5104 +21FC +2104 +5104 +91FC +1000 +33FE +3020 +5020 +97FF +1020 +1020 +3020 +E020 +ENDCHAR +STARTCHAR U+7303 +ENCODING 29443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8840 +50A0 +2110 +5208 +8C06 +0BF8 +1800 +2808 +4A48 +8948 +0950 +0950 +0804 +57FE +2000 +ENDCHAR +STARTCHAR U+7304 +ENCODING 29444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8820 +5020 +27FF +2000 +51FC +9104 +1104 +3104 +31FC +5020 +9124 +1124 +1326 +3623 +E0E0 +ENDCHAR +STARTCHAR U+7305 +ENCODING 29445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0848 +8848 +5048 +23CF +2048 +5048 +9048 +13CF +3048 +3048 +51C8 +974F +1048 +10C8 +3188 +E308 +ENDCHAR +STARTCHAR U+7307 +ENCODING 29447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +883E +5020 +23FF +2201 +5222 +9238 +12E0 +3222 +321E +5200 +9248 +1248 +1249 +34C9 +E187 +ENDCHAR +STARTCHAR U+7308 +ENCODING 29448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4880 +2900 +13FE +2E22 +4BFE +0A22 +0BFE +1A42 +2890 +4910 +0FFF +0810 +1010 +6010 +0000 +0000 +ENDCHAR +STARTCHAR U+730A +ENCODING 29450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +4B38 +3208 +1208 +33B8 +4A08 +0A08 +1BF8 +28A0 +48A0 +08A0 +0924 +3224 +141C +0000 +ENDCHAR +STARTCHAR U+730B +ENCODING 29451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0108 +7FFE +0240 +0660 +1C38 +700E +0000 +1414 +1212 +FEFF +2028 +3828 +6C6C +C4C6 +8183 +ENDCHAR +STARTCHAR U+730C +ENCODING 29452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +040A +7FC9 +2488 +24BF +5548 +5548 +0408 +0E08 +1508 +2488 +4454 +0422 +0441 +0000 +0000 +ENDCHAR +STARTCHAR U+730D +ENCODING 29453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8820 +57FF +2020 +2124 +5124 +9124 +13AE +32AA +3673 +5070 +90A8 +11AC +1326 +3623 +E020 +ENDCHAR +STARTCHAR U+730E +ENCODING 29454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +4490 +2C90 +13FC +2890 +4894 +8FFE +0808 +19FC +2908 +4908 +89F8 +0908 +0908 +51F8 +2108 +ENDCHAR +STARTCHAR U+730F +ENCODING 29455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +45FF +2900 +11FF +2901 +49FF +0900 +097F +1941 +297F +4941 +097F +0941 +2A45 +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+7311 +ENCODING 29457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +49FF +2901 +11FF +2901 +49FF +0901 +0800 +1908 +2908 +49EF +0908 +0929 +2929 +11EF +0000 +0000 +ENDCHAR +STARTCHAR U+7312 +ENCODING 29458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +4214 +4216 +7E12 +4210 +42FF +7E10 +0010 +7E10 +4238 +7E28 +4228 +7E2C +4264 +4246 +46C3 +ENDCHAR +STARTCHAR U+7313 +ENCODING 29459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +8BFC +5248 +2248 +53F8 +8A48 +0A48 +1BF8 +2840 +4FFE +8840 +08E0 +0950 +0A4E +5444 +2040 +ENDCHAR +STARTCHAR U+7315 +ENCODING 29461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8F20 +5120 +2140 +517E +9782 +1414 +3410 +5454 +9754 +1152 +1152 +1192 +1110 +AA50 +4420 +ENDCHAR +STARTCHAR U+7316 +ENCODING 29462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +49F0 +3110 +11F0 +3110 +49F0 +0910 +1800 +2BF8 +4A08 +0BF8 +0A08 +33F8 +1208 +0000 +ENDCHAR +STARTCHAR U+7317 +ENCODING 29463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +4440 +2BF8 +1040 +30A0 +4910 +0FFC +1808 +29E8 +4928 +09E8 +0928 +3008 +1018 +0000 +ENDCHAR +STARTCHAR U+7318 +ENCODING 29464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +950A +550A +6FEA +290A +610A +AFEA +210A +210A +6FEA +A92A +292A +2922 +2922 +2962 +C10E +ENDCHAR +STARTCHAR U+7319 +ENCODING 29465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080C +8878 +57C4 +224C +2128 +53FC +9044 +1044 +37FF +3044 +5044 +93FC +1040 +1040 +3040 +E1C0 +ENDCHAR +STARTCHAR U+731B +ENCODING 29467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BF8 +3010 +1060 +37FC +4840 +08C0 +1BF8 +2AA8 +4AA8 +0AA8 +0AA8 +0FFC +3000 +0000 +ENDCHAR +STARTCHAR U+731C +ENCODING 29468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4FFC +3040 +13F8 +3040 +4FFC +0800 +1BF8 +2A48 +4A48 +0BF8 +0A08 +3208 +1218 +0000 +ENDCHAR +STARTCHAR U+731D +ENCODING 29469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4840 +37FC +1110 +3110 +4AA8 +0C44 +1840 +2FFC +4840 +0840 +0840 +3040 +1040 +0000 +ENDCHAR +STARTCHAR U+731E +ENCODING 29470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8840 +50A0 +2110 +5208 +95F6 +1840 +3048 +57FC +9040 +13F8 +1208 +1208 +1208 +A3F8 +4208 +ENDCHAR +STARTCHAR U+731F +ENCODING 29471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C88 +4A48 +3250 +11F0 +3150 +4950 +09F0 +1950 +2950 +49F0 +0A54 +0A4C +0C4C +3844 +0000 +ENDCHAR +STARTCHAR U+7321 +ENCODING 29473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +8FFE +54A4 +24A4 +54A4 +97FC +1484 +1080 +31F8 +5208 +9508 +1090 +1060 +1040 +A180 +4600 +ENDCHAR +STARTCHAR U+7322 +ENCODING 29474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0504 +893E +5124 +2124 +5FE4 +913C +1124 +3124 +57A4 +94BC +14A4 +14A4 +17A4 +1444 +A094 +4108 +ENDCHAR +STARTCHAR U+7323 +ENCODING 29475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0484 +494A +3132 +2932 +454A +0DFE +1484 +2542 +46FD +0584 +0648 +0430 +2830 +11CE +0000 +0000 +ENDCHAR +STARTCHAR U+7324 +ENCODING 29476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +8BF4 +5451 +22DA +218C +5306 +9603 +11FC +3020 +3020 +57FF +9050 +1050 +10D8 +318C +E707 +ENDCHAR +STARTCHAR U+7325 +ENCODING 29477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BF8 +3248 +13F8 +3248 +4BF8 +0800 +1FFC +2948 +4928 +0930 +0910 +31C8 +1604 +0000 +ENDCHAR +STARTCHAR U+7326 +ENCODING 29478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4BFE +3202 +3206 +4AFA +0A22 +0AFA +0AAA +1AAA +2AAA +4AFA +0A22 +0A2A +2AFB +1409 +0000 +0000 +ENDCHAR +STARTCHAR U+7327 +ENCODING 29479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +89FC +5104 +213C +2124 +5124 +9124 +13FE +3202 +32FA +528A +928A +128A +12FA +3202 +E206 +ENDCHAR +STARTCHAR U+7328 +ENCODING 29480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +883C +57E2 +2246 +2124 +53FE +9080 +17FF +3080 +30FC +5184 +930C +16D8 +1070 +31DC +E707 +ENDCHAR +STARTCHAR U+7329 +ENCODING 29481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BF8 +3208 +13F8 +3208 +4BF8 +0940 +19F8 +2A40 +4DF0 +0840 +0840 +3FFC +1000 +0000 +ENDCHAR +STARTCHAR U+732A +ENCODING 29482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +4488 +2BF8 +1090 +30A0 +4FFC +0880 +19F8 +2B08 +4DF8 +0908 +0908 +31F8 +1108 +0000 +ENDCHAR +STARTCHAR U+732B +ENCODING 29483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +4910 +37FC +1110 +3110 +4800 +0BF8 +1A48 +2A48 +4BF8 +0A48 +0A48 +33F8 +1208 +0000 +ENDCHAR +STARTCHAR U+732C +ENCODING 29484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +8FFE +5444 +27FC +5444 +97FC +1000 +33F8 +5208 +93F8 +1208 +13F8 +1208 +1208 +A228 +4210 +ENDCHAR +STARTCHAR U+732D +ENCODING 29485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +503C +2044 +50F8 +0810 +0BFF +1880 +29FA +4A4C +089C +092A +0849 +1088 +6010 +0000 +0000 +ENDCHAR +STARTCHAR U+732E +ENCODING 29486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0428 +7FA4 +0424 +3FFC +3320 +2D20 +3F30 +2550 +3F50 +2548 +2588 +2584 +2304 +0000 +ENDCHAR +STARTCHAR U+732F +ENCODING 29487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4A48 +3248 +13F8 +3000 +4FFC +0840 +1BF8 +2AA8 +4AA8 +0AA8 +0AA8 +32A8 +1218 +0000 +ENDCHAR +STARTCHAR U+7330 +ENCODING 29488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2880 +13EF +2885 +4BE5 +0889 +0BF1 +0886 +1820 +2BFE +4820 +0850 +0888 +2904 +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+7331 +ENCODING 29489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +8BF8 +5090 +2060 +57FC +88C4 +0948 +0AC0 +1844 +2FFE +4840 +88E0 +0950 +0A4E +5444 +2040 +ENDCHAR +STARTCHAR U+7332 +ENCODING 29490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +8BFE +5202 +23FE +2202 +53FE +9100 +11FF +3341 +3641 +52F1 +9399 +1201 +13FB +3002 +E00E +ENDCHAR +STARTCHAR U+7333 +ENCODING 29491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47DF +2A41 +1241 +2A41 +4BDF +0A00 +0A1F +1BC1 +2A11 +4A11 +0BCA +0A04 +2A0A +1211 +0000 +0000 +ENDCHAR +STARTCHAR U+7334 +ENCODING 29492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +49F0 +3110 +1210 +33FC +4E80 +0AF8 +1AA0 +2B20 +4BFC +0A20 +0A50 +3288 +1304 +0000 +ENDCHAR +STARTCHAR U+7335 +ENCODING 29493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0807 +8BFC +5200 +23FE +2202 +5202 +93FE +1200 +32FE +32AA +52AA +92FE +12AA +12AA +34AA +E086 +ENDCHAR +STARTCHAR U+7336 +ENCODING 29494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +4890 +30A0 +17FC +30A0 +4BF8 +0AA8 +1AA8 +2B38 +4A18 +0BF8 +0A08 +33F8 +1208 +0000 +ENDCHAR +STARTCHAR U+7337 +ENCODING 29495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2120 +1128 +1224 +7FA4 +0C20 +3FFC +2D20 +2D20 +3730 +3350 +3F50 +2188 +3F88 +2104 +0000 +ENDCHAR +STARTCHAR U+7338 +ENCODING 29496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +8BFE +5224 +2224 +53FC +8A00 +0AFC +1A84 +2AFC +4A84 +8A84 +0AFC +0A84 +0A84 +54FC +2884 +ENDCHAR +STARTCHAR U+7339 +ENCODING 29497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8848 +57FC +20E0 +5150 +9248 +1446 +3BF8 +5208 +93F8 +1208 +13F8 +1208 +1000 +AFFE +4000 +ENDCHAR +STARTCHAR U+733A +ENCODING 29498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +887C +50C4 +21AC +2358 +5030 +90C0 +1700 +31FE +3220 +5020 +97FF +1020 +1222 +3222 +E3FE +ENDCHAR +STARTCHAR U+733B +ENCODING 29499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +9F9C +50F0 +6110 +2222 +6216 +A20C +2398 +2E12 +627F +A209 +222A +222A +226B +2249 +C608 +ENDCHAR +STARTCHAR U+733C +ENCODING 29500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4412 +29FF +1010 +28FE +4892 +08FE +0892 +18FE +2892 +4804 +09FF +0844 +2824 +100C +0000 +0000 +ENDCHAR +STARTCHAR U+733D +ENCODING 29501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +8BFF +5201 +22FD +2084 +5084 +90FC +1084 +3084 +30FC +5020 +93FF +1000 +1048 +30CC +E387 +ENDCHAR +STARTCHAR U+733E +ENCODING 29502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BF0 +3210 +12F0 +3290 +4FFC +0C08 +1BF0 +2A10 +4BF0 +0A10 +0BF0 +3210 +1230 +0000 +ENDCHAR +STARTCHAR U+733F +ENCODING 29503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4BF8 +3040 +17FC +3000 +49F0 +0910 +19F0 +28C8 +4F48 +0930 +0910 +31C8 +1604 +0000 +ENDCHAR +STARTCHAR U+7340 +ENCODING 29504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +4493 +2911 +1111 +29D7 +4911 +09FF +0810 +187C +2844 +4828 +0810 +0828 +19C7 +0000 +0000 +ENDCHAR +STARTCHAR U+7342 +ENCODING 29506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +45FF +2910 +1120 +297E +49C2 +097E +0942 +197E +2908 +4928 +0A4A +0889 +2808 +1018 +0000 +0000 +ENDCHAR +STARTCHAR U+7343 +ENCODING 29507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +4914 +4916 +7F12 +0010 +FFFF +0010 +7F10 +4110 +4110 +7F38 +2228 +222C +1764 +3C46 +E0C3 +ENDCHAR +STARTCHAR U+7344 +ENCODING 29508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +4B98 +3014 +1FD4 +3010 +4BFC +0810 +1B90 +2810 +4BA8 +0AA8 +0BA8 +3244 +1084 +0000 +ENDCHAR +STARTCHAR U+7345 +ENCODING 29509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +52FC +3410 +2710 +357C +5554 +1754 +3454 +3754 +5554 +155C +1750 +1410 +3010 +0000 +ENDCHAR +STARTCHAR U+7349 +ENCODING 29513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +29FF +1010 +29FF +4810 +09FF +0886 +1979 +2810 +49FF +0854 +0892 +2911 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+734A +ENCODING 29514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +2828 +1054 +2892 +497D +0844 +087C +1844 +287C +4880 +097E +0A42 +2842 +107E +0000 +0000 +ENDCHAR +STARTCHAR U+734C +ENCODING 29516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +45FE +2902 +11FE +2902 +49FE +0800 +0BFF +1A49 +2BFF +487C +0828 +0810 +2828 +11C7 +0000 +0000 +ENDCHAR +STARTCHAR U+734D +ENCODING 29517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8FFC +5110 +20A4 +5FFE +8800 +0BFC +1A04 +2BFC +4A04 +8BFC +08A0 +08A0 +0922 +5222 +2C1E +ENDCHAR +STARTCHAR U+734E +ENCODING 29518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2440 +24F8 +3F50 +2520 +04D0 +7FFC +2510 +24B0 +4520 +0110 +7FFC +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+734F +ENCODING 29519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +4FFC +3110 +13F8 +3208 +4BF8 +0A08 +1BF8 +2840 +4FFC +0840 +08A0 +3110 +160C +0000 +ENDCHAR +STARTCHAR U+7350 +ENCODING 29520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8FFC +5110 +20A4 +5FFE +8800 +0BF8 +1A08 +2BF8 +4A08 +8BF8 +0840 +0FFE +0840 +5040 +2040 +ENDCHAR +STARTCHAR U+7351 +ENCODING 29521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4481 +2BEE +1088 +2888 +4BE8 +0AAF +1BEA +2AAA +4BEA +088A +0BEA +088A +2892 +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+7352 +ENCODING 29522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7F44 +087E +3E48 +0888 +7F28 +1010 +1E28 +2246 +4A90 +0508 +FFFE +0100 +0280 +0C70 +700E +ENDCHAR +STARTCHAR U+7356 +ENCODING 29526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8BFE +5020 +2104 +27FF +5104 +9000 +13FE +3202 +33FE +5202 +93FE +1202 +13FE +3104 +E603 +ENDCHAR +STARTCHAR U+7357 +ENCODING 29527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +57FC +3650 +2550 +3590 +57FC +1534 +1758 +3758 +37D0 +5730 +1928 +1A48 +3484 +0000 +ENDCHAR +STARTCHAR U+7358 +ENCODING 29528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +9220 +D620 +547F +FE44 +92EC +BA38 +D610 +923C +96E7 +0108 +0104 +FFFF +0240 +0660 +1C38 +F00F +ENDCHAR +STARTCHAR U+7359 +ENCODING 29529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0884 +52A4 +22A4 +51C4 +1087 +17FA +1492 +3492 +55D2 +16B2 +149A +1494 +549A +2491 +0000 +0000 +ENDCHAR +STARTCHAR U+735A +ENCODING 29530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4444 +29FF +1044 +287C +4800 +09FF +0800 +18FE +2892 +48FE +0892 +08FE +2882 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+735B +ENCODING 29531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4428 +2929 +10AA +29FF +4844 +0828 +09FF +0810 +18FE +2810 +49FF +0828 +2844 +1183 +0000 +0000 +ENDCHAR +STARTCHAR U+735D +ENCODING 29533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +8BFC +5088 +2050 +27FE +50A4 +9128 +1260 +37FE +3492 +5512 +96FE +1492 +1492 +34F2 +E406 +ENDCHAR +STARTCHAR U+735E +ENCODING 29534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8820 +53FE +2104 +2088 +57FF +9000 +11FC +3124 +31FC +5124 +91FC +1020 +13FE +3020 +E7FF +ENDCHAR +STARTCHAR U+735F +ENCODING 29535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +89FC +5020 +23FE +2000 +5104 +97DF +1104 +31C4 +371F +5000 +97FF +1088 +1089 +3189 +E707 +ENDCHAR +STARTCHAR U+7360 +ENCODING 29536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +8844 +57FE +2040 +52A8 +9110 +13F8 +360E +5BF8 +9208 +13F8 +1040 +1250 +144C +A944 +4080 +ENDCHAR +STARTCHAR U+7361 +ENCODING 29537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4480 +290E +1302 +29CE +4902 +09FE +1880 +29FF +4A01 +0955 +0955 +0955 +2801 +1006 +0000 +0000 +ENDCHAR +STARTCHAR U+7362 +ENCODING 29538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4BFE +5020 +27FF +5088 +09FC +0A8A +1CF9 +2800 +4BFE +0A02 +0AFA +0A8A +2AFA +1204 +0000 +0000 +ENDCHAR +STARTCHAR U+7363 +ENCODING 29539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +4928 +2224 +3E24 +2A20 +3FFC +2A20 +3E20 +7F20 +0060 +3E50 +2290 +3F08 +2204 +0000 +ENDCHAR +STARTCHAR U+7365 +ENCODING 29541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4488 +2908 +13E8 +2A2F +4BE8 +0A32 +0BE2 +1882 +2BEA +490A +09CA +0A44 +284A +10D1 +0000 +0000 +ENDCHAR +STARTCHAR U+7366 +ENCODING 29542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0908 +8FFF +5108 +23FC +2204 +53FC +9204 +13FC +3100 +33FF +5621 +9A71 +12D9 +1203 +33F2 +E00E +ENDCHAR +STARTCHAR U+7367 +ENCODING 29543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +8BFE +5292 +2292 +23FE +5000 +97FF +1000 +33FE +3202 +53FE +9061 +10B2 +112C +3623 +E020 +ENDCHAR +STARTCHAR U+7368 +ENCODING 29544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BF8 +32A8 +13F8 +3100 +49F8 +0A88 +1FE8 +2AA8 +4BE8 +08A8 +08F8 +3718 +1030 +0000 +ENDCHAR +STARTCHAR U+7369 +ENCODING 29545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +893E +5120 +27FF +200A +5009 +97FF +1404 +35F4 +3444 +5555 +975E +1464 +158D +3415 +E863 +ENDCHAR +STARTCHAR U+736A +ENCODING 29546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +48A0 +31F0 +160C +33F8 +4B58 +0AE8 +1BF8 +29F0 +4910 +09F0 +0910 +31F0 +1110 +0000 +ENDCHAR +STARTCHAR U+736B +ENCODING 29547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8870 +50D8 +218C +2707 +50F8 +9000 +13DE +3252 +3252 +53DE +9000 +1104 +1104 +338E +E6DB +ENDCHAR +STARTCHAR U+736C +ENCODING 29548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +8A3E +5394 +2494 +5914 +97EC +1540 +3558 +57DE +9568 +1548 +17FE +1548 +1548 +A8C8 +4008 +ENDCHAR +STARTCHAR U+736D +ENCODING 29549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +8A10 +5210 +2F9C +6224 +AFC8 +2ABE +2AA2 +6AAA +AFAA +222A +272A +2AAA +3208 +2214 +A222 +4242 +ENDCHAR +STARTCHAR U+736E +ENCODING 29550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +97FF +5124 +2222 +27FF +5222 +9376 +12AA +3376 +3222 +5376 +92AA +1376 +1222 +3222 +E226 +ENDCHAR +STARTCHAR U+736F +ENCODING 29551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +8BC0 +5044 +2FFE +5040 +97FC +1554 +34E4 +57FC +9040 +17FC +1040 +1FFE +1524 +A492 +4802 +ENDCHAR +STARTCHAR U+7370 +ENCODING 29552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4BFC +3248 +16A8 +3294 +4C70 +0BF8 +1AA8 +2BF8 +4800 +0FFC +0840 +3040 +10C0 +0000 +ENDCHAR +STARTCHAR U+7371 +ENCODING 29553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8BFF +5201 +21FE +20A4 +532B +9030 +11FE +3702 +31FE +5102 +91FE +1102 +11FE +3084 +E303 +ENDCHAR +STARTCHAR U+7372 +ENCODING 29554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +4FFC +3130 +11FC +3320 +4DF8 +09F8 +1920 +29FC +4BF8 +0890 +0860 +30F0 +170C +0000 +ENDCHAR +STARTCHAR U+7373 +ENCODING 29555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +45FF +2810 +11FF +2955 +4933 +0854 +0800 +19FF +2820 +49FF +0929 +0929 +2929 +1103 +0000 +0000 +ENDCHAR +STARTCHAR U+7375 +ENCODING 29557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A48 +4C90 +3248 +13F8 +32E8 +4BA8 +0BF8 +1B68 +2AD8 +4B68 +0AD8 +0A4C +336C +1644 +0000 +ENDCHAR +STARTCHAR U+7376 +ENCODING 29558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47FF +2820 +10FC +28F4 +48BC +0BFF +0B53 +1944 +287C +4820 +087C +08A8 +0910 +18EE +0000 +0000 +ENDCHAR +STARTCHAR U+7377 +ENCODING 29559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +8820 +57FF +2448 +25FE +5448 +97FF +1420 +35FE +3522 +55FE +9522 +1522 +19FE +3084 +E303 +ENDCHAR +STARTCHAR U+7378 +ENCODING 29560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7720 +5528 +7724 +3F24 +2520 +3FFC +2520 +3F20 +7FA0 +0030 +3F50 +2150 +3F88 +2104 +0000 +ENDCHAR +STARTCHAR U+7379 +ENCODING 29561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +883C +5020 +23FF +2221 +52FC +9221 +12FF +3292 +32FE +5292 +92FE +1200 +15FE +3152 +E3FF +ENDCHAR +STARTCHAR U+737A +ENCODING 29562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +52F8 +2FA8 +2248 +3FF8 +5AC8 +1AF8 +3FC8 +3278 +5748 +16F8 +1A30 +1248 +6288 +0000 +ENDCHAR +STARTCHAR U+737B +ENCODING 29563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +07A8 +3FA4 +2D24 +3720 +3FFC +2F20 +2920 +2F30 +3FB0 +36D0 +3FC8 +3288 +5284 +0000 +ENDCHAR +STARTCHAR U+737C +ENCODING 29564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2C00 +25FF +A492 +4511 +4DFF +A911 +29BB +2955 +29BB +6D11 +A5BB +2555 +25BB +2511 +2511 +C913 +ENDCHAR +STARTCHAR U+737D +ENCODING 29565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +29FF +11EF +2929 +49EF +0844 +09FF +1844 +29FF +4844 +09FF +088A +0984 +1ACB +0000 +0000 +ENDCHAR +STARTCHAR U+737E +ENCODING 29566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +8FFE +5110 +27BC +54A4 +97BC +1140 +3224 +57FE +9A20 +13FC +1220 +13FC +1220 +A3FE +4200 +ENDCHAR +STARTCHAR U+737F +ENCODING 29567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +45FE +2820 +1177 +29D5 +4B77 +0B74 +0B55 +1FF7 +2888 +4944 +0878 +08D0 +2820 +10DE +0000 +0000 +ENDCHAR +STARTCHAR U+7380 +ENCODING 29568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +8BFE +5292 +23FE +2000 +510A +961F +12B4 +3114 +325E +53D4 +9154 +111E +1354 +3554 +E11F +ENDCHAR +STARTCHAR U+7381 +ENCODING 29569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +279E +2492 +A79E +4000 +4FFF +A808 +2BC8 +290F +2FFA +6A52 +ABCA +2A4E +2BC4 +324E +23CA +C65B +ENDCHAR +STARTCHAR U+7382 +ENCODING 29570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A20 +5771 +222E +5778 +1558 +177F +33EA +52AA +13EA +12B2 +13E2 +1082 +17F2 +6082 +0000 +0000 +ENDCHAR +STARTCHAR U+7383 +ENCODING 29571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BDE +8A52 +53DE +2252 +23DE +5252 +97FF +1C20 +37FE +3420 +57FF +9000 +17FE +108C +3070 +E78F +ENDCHAR +STARTCHAR U+7384 +ENCODING 29572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +0120 +0220 +1A40 +0640 +0180 +00A0 +0110 +0278 +7F84 +0004 +0000 +ENDCHAR +STARTCHAR U+7385 +ENCODING 29573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FEA4 +10A4 +30A6 +21A2 +C523 +6C24 +2824 +186C +3008 +2418 +6430 +5E60 +F2C0 +ENDCHAR +STARTCHAR U+7386 +ENCODING 29574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0410 +0820 +08A0 +5244 +2224 +1428 +0810 +0A10 +1122 +27CF +78F1 +0000 +ENDCHAR +STARTCHAR U+7387 +ENCODING 29575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +2108 +1650 +0280 +19B0 +624C +0FA0 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7388 +ENCODING 29576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1042 +00FF +7D00 +1002 +20FC +4480 +7881 +10A2 +2094 +4888 +44A4 +7CC2 +0381 +0000 +0000 +ENDCHAR +STARTCHAR U+7389 +ENCODING 29577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +0100 +0100 +0100 +1FF0 +0100 +0120 +0110 +0110 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+738A +ENCODING 29578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +0080 +0090 +0088 +0084 +0080 +3FFE +0080 +0080 +0080 +0080 +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+738B +ENCODING 29579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +0100 +0100 +0100 +1FF0 +0100 +0100 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+738E +ENCODING 29582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0804 +7DFE +1020 +1020 +1020 +7C20 +1020 +1020 +1020 +1020 +1C20 +7020 +2120 +00A0 +0040 +ENDCHAR +STARTCHAR U+7390 +ENCODING 29584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F888 +2088 +2088 +2088 +2088 +F888 +2088 +2088 +218C +2104 +3904 +E306 +0202 +0603 +ENDCHAR +STARTCHAR U+7391 +ENCODING 29585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +09F8 +7D10 +1110 +1110 +1110 +7D10 +1110 +1110 +1110 +1110 +1E10 +7212 +2412 +080E +1000 +ENDCHAR +STARTCHAR U+7392 +ENCODING 29586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +7CFE +1010 +1010 +1010 +1010 +7C10 +1010 +1010 +1410 +1810 +7012 +03FF +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+7393 +ENCODING 29587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +F880 +20FE +2182 +2102 +2302 +F802 +20F2 +2002 +2002 +2002 +3806 +E004 +000C +0038 +ENDCHAR +STARTCHAR U+7394 +ENCODING 29588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0092 +0092 +7C92 +1092 +1092 +1092 +1092 +7C92 +1092 +1092 +1092 +1692 +1892 +6112 +0112 +0202 +ENDCHAR +STARTCHAR U+7395 +ENCODING 29589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +0038 +F9E0 +2020 +2020 +2020 +2020 +FBFF +2020 +2020 +2020 +2020 +3820 +E020 +0020 +0020 +ENDCHAR +STARTCHAR U+7396 +ENCODING 29590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +7C80 +10F0 +1110 +1110 +7E20 +1020 +1060 +1460 +1890 +6110 +0208 +0C04 +0000 +ENDCHAR +STARTCHAR U+7397 +ENCODING 29591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FE +7C20 +1020 +1020 +1020 +7C20 +17FF +1020 +1020 +1020 +1C20 +7020 +0020 +0020 +0060 +ENDCHAR +STARTCHAR U+7398 +ENCODING 29592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +7C04 +1004 +1004 +1004 +11FC +7D00 +1100 +1100 +1100 +1100 +1D01 +6101 +01FF +0000 +ENDCHAR +STARTCHAR U+739B +ENCODING 29595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0BF8 +FC10 +1110 +1110 +1110 +7D10 +1114 +11FE +1004 +1C24 +F3F4 +4004 +0004 +0014 +0008 +ENDCHAR +STARTCHAR U+739C +ENCODING 29596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F88C +2184 +2106 +2102 +2343 +F840 +2040 +2040 +20C4 +2084 +3884 +E09E +00F2 +0383 +ENDCHAR +STARTCHAR U+739D +ENCODING 29597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0044 +7CFE +1110 +1010 +1012 +7DFF +1010 +1010 +1410 +1810 +7010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+739E +ENCODING 29598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F820 +23FE +2020 +2020 +2020 +F820 +23FF +2050 +2050 +20D8 +3888 +E18C +0306 +0603 +ENDCHAR +STARTCHAR U+739F +ENCODING 29599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0840 +7C24 +17FE +1008 +1108 +7D08 +1110 +1090 +10A0 +1040 +1CA0 +7110 +2208 +040E +0804 +ENDCHAR +STARTCHAR U+73A0 +ENCODING 29600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F850 +20D8 +218C +238E +268B +F888 +2088 +2088 +2088 +2088 +3988 +E108 +0308 +0608 +ENDCHAR +STARTCHAR U+73A1 +ENCODING 29601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DFE +1084 +1084 +1084 +11FF +7C0C +1014 +1024 +1444 +1884 +7104 +0214 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+73A2 +ENCODING 29602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0890 +7C90 +1090 +1108 +1204 +7C02 +13F8 +1088 +1088 +1088 +1C88 +7108 +2108 +0250 +0420 +ENDCHAR +STARTCHAR U+73A4 +ENCODING 29604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C12 +10FC +1010 +1010 +10FE +7C10 +1010 +11FF +1410 +1810 +7010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+73A5 +ENCODING 29605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FE +F902 +2102 +2102 +21FE +2102 +F902 +2102 +21FE +2102 +2102 +3B02 +E202 +0602 +0C0E +ENDCHAR +STARTCHAR U+73A6 +ENCODING 29606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F820 +21FC +2024 +2024 +2024 +F824 +27FF +2050 +2050 +2058 +38C8 +E08C +0186 +0303 +ENDCHAR +STARTCHAR U+73A7 +ENCODING 29607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7C40 +1084 +1102 +123E +7FC9 +1088 +1088 +1088 +1C88 +7088 +0109 +0109 +020F +0400 +ENDCHAR +STARTCHAR U+73A8 +ENCODING 29608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +03FC +FC40 +1040 +1040 +1040 +1048 +7DFC +1040 +1040 +1040 +1C40 +F044 +47FE +0000 +0000 +ENDCHAR +STARTCHAR U+73A9 +ENCODING 29609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F8 +7C00 +1000 +1000 +13FC +7CA0 +10A0 +10A0 +1120 +1D20 +6224 +0424 +081C +0000 +ENDCHAR +STARTCHAR U+73AA +ENCODING 29610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F850 +20D8 +218C +2306 +26FB +F800 +2000 +21FC +2004 +200C +3808 +E018 +0010 +0030 +ENDCHAR +STARTCHAR U+73AB +ENCODING 29611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +FC40 +1084 +10FE +1108 +1288 +7C88 +1088 +1090 +1050 +1020 +1C50 +E088 +410E +0604 +ENDCHAR +STARTCHAR U+73AC +ENCODING 29612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFE +1082 +10A2 +1092 +7C8A +11FF +1082 +1082 +1482 +1882 +7082 +010A +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+73AD +ENCODING 29613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0110 +0110 +7D10 +1110 +1111 +11F6 +7D18 +1110 +1110 +1110 +1110 +1DF1 +6711 +001F +0000 +ENDCHAR +STARTCHAR U+73AE +ENCODING 29614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C44 +13FE +1040 +1048 +7DFC +1040 +1044 +17FE +1044 +1C44 +7044 +2054 +0048 +0040 +ENDCHAR +STARTCHAR U+73AF +ENCODING 29615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +F804 +27FE +2020 +2020 +2040 +F840 +20D0 +214C +2246 +2442 +2040 +3840 +E040 +4040 +0040 +ENDCHAR +STARTCHAR U+73B0 +ENCODING 29616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +09FC +FD08 +1128 +1128 +1128 +1128 +7D48 +1148 +1148 +1040 +1CA0 +F0A0 +4122 +0222 +0C1E +ENDCHAR +STARTCHAR U+73B2 +ENCODING 29618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7CA0 +10A0 +1110 +12E8 +7C04 +13F8 +1048 +1448 +1848 +6070 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+73B3 +ENCODING 29619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0128 +7D24 +1224 +123C +17E0 +7A20 +1220 +1220 +1210 +1A14 +620C +020C +0204 +0000 +ENDCHAR +STARTCHAR U+73B4 +ENCODING 29620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0124 +0924 +7D24 +1124 +17FF +1124 +1124 +7D24 +1124 +113C +1124 +1D00 +71FF +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+73B5 +ENCODING 29621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +0084 +F884 +2084 +23FF +2084 +2084 +F884 +2084 +20FC +2084 +2084 +3884 +E084 +0084 +00FC +ENDCHAR +STARTCHAR U+73B6 +ENCODING 29622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFE +1010 +1092 +1092 +1054 +7C10 +11FF +1010 +1410 +1810 +7010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+73B7 +ENCODING 29623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C44 +107E +1040 +1040 +7C40 +1044 +11FE +1104 +1104 +1D04 +7104 +2104 +01FC +0104 +ENDCHAR +STARTCHAR U+73B8 +ENCODING 29624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7CFE +1102 +1202 +11F2 +1112 +7D12 +11F2 +1102 +151C +1900 +7100 +0101 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+73B9 +ENCODING 29625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7C10 +11FF +1020 +1020 +1240 +7D88 +1088 +1050 +1220 +1444 +1882 +613F +07C1 +0000 +ENDCHAR +STARTCHAR U+73BA +ENCODING 29626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +1FFC +2108 +4920 +1118 +2308 +0000 +7FFC +0100 +0110 +3FF8 +0140 +0124 +FFFE +0000 +ENDCHAR +STARTCHAR U+73BB +ENCODING 29627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FFC +1248 +1250 +1240 +7FF8 +1288 +1250 +1250 +1A20 +6450 +0588 +0E04 +0000 +ENDCHAR +STARTCHAR U+73BC +ENCODING 29628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +F888 +2288 +2288 +228B +22EE +FA88 +2288 +2288 +2288 +2288 +3A88 +E2E9 +0389 +0607 +ENDCHAR +STARTCHAR U+73BD +ENCODING 29629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +F900 +23FE +2202 +2602 +21F2 +F912 +2112 +2112 +2112 +21F2 +3802 +E002 +0006 +001C +ENDCHAR +STARTCHAR U+73BE +ENCODING 29630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +7D11 +1111 +11FF +1111 +7D11 +11FF +1111 +1410 +1810 +7010 +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+73BF +ENCODING 29631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +F842 +2042 +20C2 +2086 +2184 +FB1C +2000 +21FE +2102 +2102 +3902 +E102 +0102 +01FE +ENDCHAR +STARTCHAR U+73C0 +ENCODING 29632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7C80 +11F8 +1108 +1108 +7D08 +11F8 +1108 +1108 +1D08 +6108 +01F8 +0108 +0000 +ENDCHAR +STARTCHAR U+73C2 +ENCODING 29634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7C08 +1008 +11E8 +1128 +7D28 +1128 +11E8 +1128 +1C08 +6008 +0008 +0018 +0000 +ENDCHAR +STARTCHAR U+73C3 +ENCODING 29635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7CFE +1092 +1092 +10FE +7C92 +1092 +11FF +1482 +1882 +7082 +008A +0084 +0000 +0000 +ENDCHAR +STARTCHAR U+73C5 +ENCODING 29637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F820 +23FF +2221 +2221 +2221 +FBFF +2221 +2221 +2221 +23FF +3820 +E020 +0020 +0020 +ENDCHAR +STARTCHAR U+73C6 +ENCODING 29638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +F8C0 +2084 +2184 +213E +23E3 +F800 +2000 +2000 +21FE +2102 +3902 +E102 +0102 +01FE +ENDCHAR +STARTCHAR U+73C7 +ENCODING 29639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFC +1084 +1084 +1084 +10FC +7C84 +1084 +1084 +10FC +1484 +1884 +7084 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+73C8 +ENCODING 29640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0200 +7A00 +1238 +1FA8 +12A8 +7AA8 +12A8 +12A8 +12A8 +1CA8 +64B8 +08A8 +1300 +0000 +ENDCHAR +STARTCHAR U+73C9 +ENCODING 29641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +09FE +7D04 +1104 +11FC +1124 +7D20 +1124 +11FE +1120 +1120 +1110 +1D10 +714A +218A +0106 +ENDCHAR +STARTCHAR U+73CA +ENCODING 29642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7EA8 +12A8 +12A8 +12A8 +7FFC +12A8 +12A8 +12A8 +1EA8 +62A8 +02A8 +0218 +0000 +ENDCHAR +STARTCHAR U+73CB +ENCODING 29643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +F8C0 +238F +2249 +2249 +2249 +FA49 +2249 +2249 +2249 +2249 +3BC9 +E64F +0048 +00C8 +0188 +ENDCHAR +STARTCHAR U+73CC +ENCODING 29644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0022 +7C12 +1002 +1084 +1084 +1088 +7C88 +1292 +1292 +14A1 +10A1 +1CC2 +7082 +017E +0600 +ENDCHAR +STARTCHAR U+73CD +ENCODING 29645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7CA0 +10A0 +1110 +1248 +7C84 +1320 +1040 +1188 +1C10 +6020 +00C0 +0700 +0000 +ENDCHAR +STARTCHAR U+73CE +ENCODING 29646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7D00 +11FC +1248 +1450 +7C40 +1160 +1150 +1148 +1A44 +6444 +0040 +00C0 +0000 +ENDCHAR +STARTCHAR U+73CF +ENCODING 29647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7C40 +1040 +1040 +1040 +7C48 +13FC +1040 +1040 +1050 +1048 +1C48 +7040 +27FE +0000 +ENDCHAR +STARTCHAR U+73D0 +ENCODING 29648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1040 +F840 +2048 +27FC +2040 +2040 +F844 +2FFE +2040 +2040 +2080 +3908 +E204 +47FE +0002 +ENDCHAR +STARTCHAR U+73D1 +ENCODING 29649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +08A0 +7C98 +1088 +17FE +10A0 +7CA0 +10A4 +1124 +1128 +1130 +1E20 +7262 +24A2 +081E +1000 +ENDCHAR +STARTCHAR U+73D2 +ENCODING 29650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FBFE +2022 +2022 +27FF +2022 +F822 +23FE +2020 +2020 +23FE +3820 +E020 +07FF +0020 +0020 +ENDCHAR +STARTCHAR U+73D3 +ENCODING 29651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F820 +27FF +2104 +2306 +2603 +F888 +2088 +20D8 +2070 +2020 +3870 +E0D8 +018C +0707 +ENDCHAR +STARTCHAR U+73D4 +ENCODING 29652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7DFF +1040 +109E +1182 +7E84 +1088 +10FF +1488 +1888 +7088 +00A8 +0090 +0000 +0000 +ENDCHAR +STARTCHAR U+73D6 +ENCODING 29654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0222 +0222 +7D24 +1124 +1020 +1020 +7FFF +1088 +1088 +1088 +1C88 +6108 +0109 +0209 +0C0F +ENDCHAR +STARTCHAR U+73D7 +ENCODING 29655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0090 +7CFE +1090 +1110 +1010 +7DFF +1028 +1028 +1428 +1828 +7049 +0089 +030F +0000 +0000 +ENDCHAR +STARTCHAR U+73D8 +ENCODING 29656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0040 +7CFE +1182 +10A2 +1092 +7C8A +11FF +10A2 +1492 +188A +7082 +008A +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+73D9 +ENCODING 29657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +1110 +F910 +2110 +27FC +2110 +F910 +2110 +2110 +2114 +2FFE +2000 +3910 +E208 +4404 +0804 +ENDCHAR +STARTCHAR U+73DA +ENCODING 29658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +0101 +7D11 +1111 +11FF +1111 +7D11 +1111 +1129 +1545 +1983 +7101 +01FF +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+73DB +ENCODING 29659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7DFF +1040 +10FE +1182 +7EFE +1082 +10FE +1482 +1882 +7082 +008A +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+73DC +ENCODING 29660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +0044 +7C28 +11FF +1010 +1010 +7DFF +1010 +1410 +19FF +7010 +0010 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+73DD +ENCODING 29661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FF +7C23 +1065 +10A9 +1131 +1221 +7C23 +1023 +1065 +10A9 +1D31 +7221 +0421 +0021 +0063 +ENDCHAR +STARTCHAR U+73DE +ENCODING 29662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +7CF0 +1110 +1320 +14C0 +7CC0 +1130 +17FC +1210 +1A10 +6210 +03F0 +0210 +0000 +ENDCHAR +STARTCHAR U+73E0 +ENCODING 29664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0140 +7D40 +11F8 +1240 +1440 +7FFC +10E0 +10E0 +1150 +1E48 +6444 +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+73E1 +ENCODING 29665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE7F +1008 +1008 +7C3E +1008 +1008 +1E7F +F100 +0100 +0380 +02C0 +0660 +0C30 +381C +E007 +ENDCHAR +STARTCHAR U+73E3 +ENCODING 29667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7D00 +13FF +1201 +1401 +19F9 +7D09 +11F9 +1109 +11F9 +1109 +1C01 +6001 +0002 +000C +ENDCHAR +STARTCHAR U+73E4 +ENCODING 29668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +0080 +7DFE +1220 +1020 +1020 +7FFF +1020 +1020 +1122 +1D22 +6122 +0122 +01FE +0102 +ENDCHAR +STARTCHAR U+73E5 +ENCODING 29669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7D10 +1110 +11F0 +1110 +7D10 +11F0 +1110 +1110 +19F0 +6710 +0010 +0010 +0000 +ENDCHAR +STARTCHAR U+73E6 +ENCODING 29670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7C20 +11FE +1102 +1102 +1102 +7D7A +114A +114A +117A +1102 +1D02 +7102 +0102 +0106 +ENDCHAR +STARTCHAR U+73E7 +ENCODING 29671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +1120 +F924 +252C +2330 +2120 +F920 +2130 +232C +2D24 +2120 +3920 +E222 +4222 +041E +1800 +ENDCHAR +STARTCHAR U+73E8 +ENCODING 29672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0028 +7C44 +1082 +1101 +107C +7C00 +1000 +10FE +1082 +1482 +1882 +70FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+73E9 +ENCODING 29673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1108 +FA7C +2400 +2900 +2104 +FAFE +2608 +2A08 +2208 +2208 +3A08 +E208 +4208 +0228 +0210 +ENDCHAR +STARTCHAR U+73EA +ENCODING 29674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FF8 +1040 +1040 +17FC +7C40 +1040 +13F8 +1440 +1840 +6040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+73EB +ENCODING 29675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7DFE +1040 +1080 +1104 +13FE +7C92 +1090 +1490 +1890 +1111 +6211 +041F +0000 +0000 +ENDCHAR +STARTCHAR U+73ED +ENCODING 29677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7CFC +1290 +1290 +1290 +1290 +7EFC +1290 +1290 +1090 +1D10 +6110 +02FC +0400 +0000 +ENDCHAR +STARTCHAR U+73EE +ENCODING 29678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F0 +7C10 +17F0 +1490 +1490 +7FF0 +16B0 +16B0 +16B0 +1EB4 +66EC +088C +1084 +0000 +ENDCHAR +STARTCHAR U+73F1 +ENCODING 29681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0084 +0444 +7A48 +1210 +1080 +1080 +7FFC +1110 +1110 +13A0 +1C60 +6050 +0188 +0E08 +0000 +ENDCHAR +STARTCHAR U+73F2 +ENCODING 29682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +13FE +FA42 +2444 +23FC +2080 +F8A0 +2128 +23FC +2020 +2824 +37FE +E020 +4020 +0020 +0020 +ENDCHAR +STARTCHAR U+73F4 +ENCODING 29684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00D4 +F996 +2712 +2110 +2110 +27FF +F910 +2112 +2112 +21D6 +2714 +211C +3909 +E11D +0137 +0762 +ENDCHAR +STARTCHAR U+73F5 +ENCODING 29685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +F904 +2104 +2104 +21FC +2000 +F80E +23F8 +2020 +2020 +21FC +3820 +E020 +07FF +0000 +ENDCHAR +STARTCHAR U+73F6 +ENCODING 29686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0088 +7DFE +1022 +1022 +13FE +7E20 +1220 +13FF +1461 +18A1 +732A +0024 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+73F7 +ENCODING 29687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0014 +7DD2 +1010 +17FF +1090 +1090 +7C90 +12F0 +1290 +1290 +1E90 +62E8 +0709 +0005 +0003 +ENDCHAR +STARTCHAR U+73F8 +ENCODING 29688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7C40 +1040 +11F0 +1090 +7C90 +17FC +1000 +11F8 +1D08 +6108 +01F8 +0108 +0000 +ENDCHAR +STARTCHAR U+73F9 +ENCODING 29689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +0024 +0020 +7FFF +1220 +1220 +1222 +7FD2 +1254 +1254 +1258 +1F98 +6410 +0429 +08C5 +1303 +ENDCHAR +STARTCHAR U+73FA +ENCODING 29690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +F9FC +2044 +2044 +23FF +2044 +F844 +21FC +2080 +2080 +21FE +3B82 +E682 +0082 +0082 +00FE +ENDCHAR +STARTCHAR U+73FB +ENCODING 29691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FBFE +2200 +2600 +21FC +2124 +F924 +2124 +27FF +2244 +2244 +3A44 +E3FF +0008 +0038 +ENDCHAR +STARTCHAR U+73FC +ENCODING 29692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +7D02 +1102 +11FE +1102 +7D02 +11FE +1102 +1102 +1D02 +71FE +0084 +0102 +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+73FD +ENCODING 29693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C6 +7CB8 +1088 +1108 +1108 +13C8 +7C7F +1088 +1488 +1288 +1D3E +6100 +02C0 +043F +0800 +ENDCHAR +STARTCHAR U+73FE +ENCODING 29694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01F8 +7D08 +1108 +11F8 +1108 +7DF8 +1108 +11F8 +10A0 +1CA0 +6124 +0624 +181C +0000 +ENDCHAR +STARTCHAR U+73FF +ENCODING 29695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +FA02 +2202 +2202 +2202 +23FE +F820 +2020 +2120 +213E +2120 +3B20 +E2A0 +0670 +0C1F +ENDCHAR +STARTCHAR U+7400 +ENCODING 29696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F8D8 +218C +2777 +2000 +21FC +F808 +2010 +2020 +21FC +2104 +3904 +E104 +01FC +0000 +ENDCHAR +STARTCHAR U+7401 +ENCODING 29697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +00FF +7D00 +1000 +13FF +1012 +7C10 +1090 +109F +1090 +1C90 +6110 +0190 +027F +0400 +ENDCHAR +STARTCHAR U+7403 +ENCODING 29699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +7C48 +13FC +1040 +1248 +7D68 +1170 +1050 +14D0 +1948 +6644 +0040 +00C0 +0000 +ENDCHAR +STARTCHAR U+7404 +ENCODING 29700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +FA02 +2202 +23FE +2000 +23FE +FA02 +2202 +23FE +2202 +2202 +3BFE +E202 +0202 +020E +ENDCHAR +STARTCHAR U+7405 +ENCODING 29701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7DF8 +1108 +11F8 +1108 +7D08 +11F8 +1124 +1124 +1D18 +6150 +0188 +0604 +0000 +ENDCHAR +STARTCHAR U+7406 +ENCODING 29702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7E48 +1248 +13F8 +1248 +7E48 +13F8 +1040 +13F8 +1840 +6040 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+7407 +ENCODING 29703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001E +00F0 +7C10 +11FF +1038 +1054 +1092 +7D11 +1210 +11FE +1044 +104F +1C81 +6081 +0102 +061C +ENDCHAR +STARTCHAR U+7408 +ENCODING 29704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +7C54 +1092 +1111 +10FE +1004 +7C08 +1010 +11FF +1410 +1810 +7010 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+7409 +ENCODING 29705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FFC +1060 +1090 +13F8 +7C08 +1150 +1150 +1150 +1E50 +6254 +0454 +080C +0000 +ENDCHAR +STARTCHAR U+740A +ENCODING 29706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +17C0 +F8BE +22A2 +22A4 +24A4 +F7E8 +21A4 +21A4 +22A2 +2AA2 +34A2 +E4B4 +4AA8 +0120 +0020 +ENDCHAR +STARTCHAR U+740B +ENCODING 29707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0042 +0024 +7C18 +1024 +1052 +11FF +7C50 +1090 +11FF +1491 +1891 +7095 +0092 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+740C +ENCODING 29708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0111 +7D11 +11FF +1010 +1028 +7C44 +1092 +1109 +1400 +18FE +7004 +0008 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+740D +ENCODING 29709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0042 +0782 +F10A +210A +214A +2FEA +210A +F38A +254A +292A +2102 +3902 +E10A +4104 +0000 +0000 +ENDCHAR +STARTCHAR U+740F +ENCODING 29711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1420 +FA24 +21FE +2040 +2650 +FA90 +22FC +2210 +2214 +22FE +3A10 +E210 +4516 +08FC +0000 +ENDCHAR +STARTCHAR U+7410 +ENCODING 29712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0924 +FCA4 +10A8 +1024 +11FE +1104 +7D24 +1124 +1124 +1124 +1D24 +F020 +4058 +0184 +0602 +ENDCHAR +STARTCHAR U+7411 +ENCODING 29713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +0326 +F924 +2020 +23FE +2202 +2202 +FBFE +2202 +2202 +23FE +2202 +3A02 +E202 +0202 +020E +ENDCHAR +STARTCHAR U+7413 +ENCODING 29715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7FFF +1401 +1000 +11FC +1000 +7C00 +17FF +1088 +1088 +1E88 +7088 +0109 +020F +0C00 +ENDCHAR +STARTCHAR U+7416 +ENCODING 29718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0022 +7CFF +1024 +1028 +1011 +10E9 +7C07 +1000 +1022 +11FF +1422 +1815 +7009 +00F7 +0000 +0000 +ENDCHAR +STARTCHAR U+741A +ENCODING 29722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +13FE +FA04 +2204 +23FC +2220 +FA24 +23FE +2220 +2224 +23FE +3D04 +E504 +4904 +11FC +0104 +ENDCHAR +STARTCHAR U+741B +ENCODING 29723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +17FE +FC02 +28A4 +2118 +2208 +F840 +2044 +2FFE +2040 +20E0 +3950 +E248 +444E +0844 +0040 +ENDCHAR +STARTCHAR U+741D +ENCODING 29725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +7C82 +10FE +1082 +10FE +1010 +7DFF +1044 +1044 +1428 +1810 +7028 +0044 +0183 +0000 +0000 +ENDCHAR +STARTCHAR U+7420 +ENCODING 29728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +0048 +7C48 +11FE +114A +114A +114A +7DFE +114A +114A +114A +13FF +1C00 +6084 +0102 +0201 +ENDCHAR +STARTCHAR U+7421 +ENCODING 29729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +013E +7D12 +11F2 +1112 +1114 +17F4 +7D0C +1108 +1548 +1948 +1154 +1D14 +6122 +0122 +0341 +ENDCHAR +STARTCHAR U+7422 +ENCODING 29730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7C40 +1080 +11C8 +1648 +7CF0 +1120 +1670 +10A8 +1B24 +6C20 +0020 +00C0 +0000 +ENDCHAR +STARTCHAR U+7423 +ENCODING 29731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +10FE +1044 +1044 +1044 +7DFF +1000 +10FE +1482 +1882 +7082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+7424 +ENCODING 29732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +003C +FBE2 +2126 +2094 +21FE +2022 +F822 +23FF +2022 +2022 +21FE +3820 +E020 +0020 +00E0 +ENDCHAR +STARTCHAR U+7425 +ENCODING 29733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0078 +7C40 +13FC +1248 +1278 +7FC8 +1238 +12A0 +12A0 +1CA0 +64A4 +0924 +121C +0000 +ENDCHAR +STARTCHAR U+7426 +ENCODING 29734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1048 +FBFC +2040 +20A0 +2114 +FBFE +2008 +23C8 +2248 +2248 +3A48 +E3C8 +4208 +0028 +0010 +ENDCHAR +STARTCHAR U+7428 +ENCODING 29736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7E08 +1208 +13F8 +1208 +7E08 +13F8 +1220 +1224 +13A8 +1E30 +7220 +22A2 +0322 +021E +ENDCHAR +STARTCHAR U+7429 +ENCODING 29737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FE +F902 +2102 +21FE +2102 +2102 +F9FE +2000 +23FF +2201 +2201 +3BFF +E201 +0201 +03FF +ENDCHAR +STARTCHAR U+742A +ENCODING 29738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0910 +7FFC +1110 +1110 +11F0 +7D10 +1110 +11F0 +1110 +1114 +17FE +1C00 +7110 +220C +0404 +ENDCHAR +STARTCHAR U+742B +ENCODING 29739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +03FE +7C20 +11FE +1050 +13FF +7D04 +1222 +1421 +11FC +1C20 +63FE +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+742C +ENCODING 29740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +1440 +FFFE +2402 +2A04 +23BC +FAA4 +24A4 +24A4 +2AA4 +2134 +3928 +E222 +4422 +081E +1000 +ENDCHAR +STARTCHAR U+742D +ENCODING 29741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FC +F984 +210C +23F8 +2008 +23FF +F820 +2122 +21A6 +20B4 +2078 +38AC +E1A6 +0323 +00E0 +ENDCHAR +STARTCHAR U+742E +ENCODING 29742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +1440 +FFFE +2402 +2814 +23F8 +F800 +2004 +27FE +2040 +2150 +3948 +E244 +4444 +0140 +0080 +ENDCHAR +STARTCHAR U+742F +ENCODING 29743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +01FF +7D01 +1000 +10FC +1084 +7C84 +10FC +1080 +1080 +1EFE +7082 +0082 +00FE +0080 +ENDCHAR +STARTCHAR U+7430 +ENCODING 29744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7D48 +1150 +1240 +10A0 +7C98 +1148 +1244 +1148 +1150 +1EA0 +70A0 +2110 +020E +0C04 +ENDCHAR +STARTCHAR U+7431 +ENCODING 29745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +FA02 +2222 +22FA +2222 +2222 +FAFA +2202 +22FA +228A +228A +3AFA +E202 +0202 +040E +ENDCHAR +STARTCHAR U+7432 +ENCODING 29746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +00A0 +7CA0 +17BC +10A0 +10A0 +7FBC +10A0 +10A0 +11BC +1F20 +6120 +0220 +0420 +0000 +ENDCHAR +STARTCHAR U+7433 +ENCODING 29747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +7D10 +17FC +1110 +1190 +7F78 +1378 +1354 +1594 +1D10 +6110 +0110 +0110 +0000 +ENDCHAR +STARTCHAR U+7434 +ENCODING 29748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +0820 +3EF8 +0820 +0FFC +7280 +0440 +1FF0 +600C +0FE0 +0040 +0080 +0100 +0000 +ENDCHAR +STARTCHAR U+7435 +ENCODING 29749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7EFC +0820 +3EF8 +0820 +0EFC +7080 +1080 +1098 +1FE0 +1080 +1084 +1E84 +707C +0000 +ENDCHAR +STARTCHAR U+7436 +ENCODING 29750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +0820 +3EF8 +0820 +0EFC +7000 +1FF0 +1110 +1FF0 +1010 +1004 +1004 +0FFC +0000 +ENDCHAR +STARTCHAR U+7438 +ENCODING 29752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7C3F +1020 +1020 +13FE +1202 +7FFE +1202 +13FE +1020 +1C20 +77FF +0020 +0020 +0020 +ENDCHAR +STARTCHAR U+7439 +ENCODING 29753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE7F +1008 +1008 +7C3E +1008 +1E08 +F17F +0100 +0100 +FFFF +0540 +0D60 +3938 +E10F +0100 +ENDCHAR +STARTCHAR U+743A +ENCODING 29754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0120 +7D20 +14F8 +1220 +1220 +7DFC +1120 +1120 +1230 +1E48 +6478 +05C4 +0404 +0000 +ENDCHAR +STARTCHAR U+743C +ENCODING 29756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +1040 +F804 +27FE +2008 +23FC +FA08 +2208 +2208 +23F8 +2040 +3950 +E34C +4444 +0140 +0080 +ENDCHAR +STARTCHAR U+743F +ENCODING 29759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7E48 +17FC +1040 +13F8 +7E48 +13F8 +1248 +13F8 +1840 +67FC +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+7440 +ENCODING 29760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +00F0 +7C10 +10FE +1092 +10FE +1092 +7CFE +1010 +11FF +1115 +1D1D +61E3 +0101 +0101 +0103 +ENDCHAR +STARTCHAR U+7441 +ENCODING 29761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7E08 +12E8 +1208 +12E8 +7DF0 +1110 +11F0 +1110 +1DF0 +6110 +01F0 +0110 +0000 +ENDCHAR +STARTCHAR U+7442 +ENCODING 29762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +7D12 +11FE +1100 +117E +1142 +7D42 +117E +1142 +1542 +197E +1242 +6442 +007E +0000 +0000 +ENDCHAR +STARTCHAR U+7443 +ENCODING 29763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +03FE +7C20 +13FE +1050 +17FF +7888 +1104 +1603 +11FC +1D04 +61FC +0104 +01FC +0104 +ENDCHAR +STARTCHAR U+7444 +ENCODING 29764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +07FF +7C01 +1000 +13FE +1000 +7DFC +1104 +11FC +1104 +1DFC +6104 +0000 +07FF +0000 +ENDCHAR +STARTCHAR U+7446 +ENCODING 29766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +F904 +21FC +2104 +2104 +21FC +F820 +2120 +23FE +2620 +21FC +3820 +E020 +07FF +0000 +ENDCHAR +STARTCHAR U+7447 +ENCODING 29767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +03FE +F820 +21FC +2020 +27FF +2000 +F9FC +2124 +2124 +27FF +2224 +3A24 +E3FE +0008 +0038 +ENDCHAR +STARTCHAR U+744A +ENCODING 29770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000A +7C09 +13FF +1208 +1208 +13F8 +7E08 +12E8 +16AA +1AAC +12E9 +6215 +0403 +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+744B +ENCODING 29771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7DFE +1042 +17FF +1000 +11FE +7D02 +11FE +1010 +1010 +1DFE +6110 +07FF +0010 +0010 +ENDCHAR +STARTCHAR U+744D +ENCODING 29773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +01F8 +FB08 +2210 +27FE +2252 +2252 +FA52 +229E +2302 +2222 +27FF +3850 +E0D8 +018C +0707 +ENDCHAR +STARTCHAR U+744E +ENCODING 29774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7D08 +11EF +1108 +1129 +11CF +7C00 +1020 +11FF +1101 +15FF +1901 +71FF +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+744F +ENCODING 29775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +1129 +1145 +1082 +10FE +7C48 +1048 +11FF +1028 +1448 +1888 +7108 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+7450 +ENCODING 29776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7C28 +11FF +1000 +10F1 +1095 +7CF5 +1095 +10F5 +1491 +1891 +1091 +6091 +0133 +0000 +0000 +ENDCHAR +STARTCHAR U+7451 +ENCODING 29777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01F8 +F808 +21F8 +2008 +27FF +2080 +F942 +2266 +20AC +2130 +2268 +38AC +E126 +0623 +00C0 +ENDCHAR +STARTCHAR U+7452 +ENCODING 29778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01F8 +F908 +21F8 +2108 +2108 +21F8 +F800 +27FF +2100 +23FE +2652 +3892 +E326 +0044 +019C +ENDCHAR +STARTCHAR U+7454 +ENCODING 29780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7CFE +1082 +10FE +1082 +10FE +7C12 +11F4 +1038 +1454 +1892 +1311 +6010 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+7455 +ENCODING 29781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07B8 +7C88 +1488 +17B8 +1488 +7C00 +17F8 +1448 +1428 +1FB0 +6410 +0428 +04C4 +0000 +ENDCHAR +STARTCHAR U+7457 +ENCODING 29783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001C +17E0 +FA48 +2150 +2020 +23FC +F880 +27FE +2100 +21F8 +2288 +3A50 +E420 +4850 +018E +0604 +ENDCHAR +STARTCHAR U+7459 +ENCODING 29785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0248 +0248 +7C90 +1248 +1248 +1080 +7FF8 +1228 +13A8 +1248 +1AA8 +6318 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+745A +ENCODING 29786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0278 +7A48 +17C8 +1248 +1278 +7F48 +1548 +1578 +1548 +1F88 +6488 +0108 +0218 +0000 +ENDCHAR +STARTCHAR U+745B +ENCODING 29787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +7FFC +1110 +1040 +13F8 +7E48 +1248 +17FC +1040 +1C60 +6090 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+745C +ENCODING 29788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +0040 +7CA0 +1110 +13F8 +1404 +7FA8 +14A8 +16A8 +15D0 +1ED0 +65A8 +04A8 +05A8 +0000 +ENDCHAR +STARTCHAR U+745D +ENCODING 29789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0040 +F9FC +2104 +21FC +2104 +2104 +F9FC +2000 +23FE +2020 +21FC +3820 +E020 +07FF +0000 +ENDCHAR +STARTCHAR U+745E +ENCODING 29790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0248 +7E48 +13F8 +1000 +17FC +7C40 +13F8 +12A8 +16A8 +1AA8 +62A8 +02A8 +0218 +0000 +ENDCHAR +STARTCHAR U+745F +ENCODING 29791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7EFC +0820 +3EF8 +0820 +7EFC +0220 +0120 +0550 +1448 +1484 +2514 +4610 +1BF0 +0000 +ENDCHAR +STARTCHAR U+7460 +ENCODING 29792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +037C +7E14 +1294 +12D4 +1324 +7C4C +13F8 +1248 +13F8 +1E48 +6248 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+7462 +ENCODING 29794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7DFF +1101 +1028 +1044 +7D93 +1028 +1044 +1183 +1000 +1CFE +6082 +0082 +00FE +0082 +ENDCHAR +STARTCHAR U+7463 +ENCODING 29795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0150 +7D48 +1244 +17FC +1208 +7FF8 +1208 +13F8 +1208 +1BF8 +60B0 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+7464 +ENCODING 29796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0078 +7CC8 +1130 +16A0 +10C0 +7F00 +11F8 +1240 +17FC +1E48 +6248 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+7465 +ENCODING 29797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +7D24 +1124 +1154 +118C +7DFC +1104 +1000 +13FE +1E52 +7252 +0252 +0252 +07FF +0000 +ENDCHAR +STARTCHAR U+7466 +ENCODING 29798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F840 +23FC +2204 +2204 +2204 +FBFC +2200 +23FF +2200 +23FE +3802 +E2AA +06AA +0C06 +000C +ENDCHAR +STARTCHAR U+7467 +ENCODING 29799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +03FE +F820 +21FC +2050 +23FF +2088 +F934 +26E3 +2020 +23FE +20A8 +39AC +E326 +0623 +0020 +ENDCHAR +STARTCHAR U+7468 +ENCODING 29800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FF +7C88 +1088 +1132 +13FF +1021 +7C00 +13FF +1000 +11FE +1502 +19FE +6102 +01FE +0102 +ENDCHAR +STARTCHAR U+7469 +ENCODING 29801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0A28 +2AA8 +2CB0 +5550 +2288 +3FFC +2008 +7FF8 +0100 +1FF0 +0120 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+746A +ENCODING 29802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7E40 +13F8 +1240 +13F8 +7E40 +13FC +1224 +1094 +1E54 +6544 +0904 +1018 +0000 +ENDCHAR +STARTCHAR U+746B +ENCODING 29803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +003C +FBE0 +2042 +2266 +232C +2108 +F8C0 +239E +2202 +2202 +23DE +3A02 +E202 +0202 +03FE +ENDCHAR +STARTCHAR U+746D +ENCODING 29805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1024 +FBFE +2220 +22FC +2224 +FBFE +2224 +22FC +2220 +23FC +3D04 +E504 +4904 +11FC +0104 +ENDCHAR +STARTCHAR U+746E +ENCODING 29806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FF +F890 +2090 +23FE +2292 +2292 +FBFE +2020 +27FF +20A8 +21AC +3924 +E326 +0623 +0020 +ENDCHAR +STARTCHAR U+746F +ENCODING 29807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0138 +7FA8 +14A8 +17B0 +14B0 +7CA8 +17E8 +1464 +15A4 +1CA4 +6578 +0660 +1820 +0000 +ENDCHAR +STARTCHAR U+7470 +ENCODING 29808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +7FF8 +1248 +13F8 +1248 +7E48 +13F8 +10D0 +10D0 +1D68 +617C +0244 +0C3C +0000 +ENDCHAR +STARTCHAR U+7471 +ENCODING 29809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +010E +01F8 +F901 +20FF +2000 +22FE +2282 +FAFE +2282 +22FE +2282 +22FE +3A00 +E3FF +0084 +0303 +ENDCHAR +STARTCHAR U+7472 +ENCODING 29810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0070 +F8D8 +218C +2777 +2000 +21FC +F904 +21FC +2104 +21FC +2100 +3BFE +E282 +0682 +00FE +ENDCHAR +STARTCHAR U+7473 +ENCODING 29811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0090 +7CA0 +13F8 +1040 +11F0 +7C40 +17FC +1100 +13F8 +1A40 +6440 +0BFC +0000 +0000 +ENDCHAR +STARTCHAR U+7475 +ENCODING 29813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +7CA2 +1054 +1128 +1090 +11EF +7C00 +1010 +10FE +1492 +18FE +1011 +61FF +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+7476 +ENCODING 29814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +03C8 +7E48 +1150 +1120 +1040 +7FF8 +1040 +17FC +1248 +1E48 +6248 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+7477 +ENCODING 29815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +17C0 +FA48 +2150 +27FE +2482 +F884 +27FE +2100 +21F0 +2210 +3AA0 +E440 +48A0 +011E +0604 +ENDCHAR +STARTCHAR U+7479 +ENCODING 29817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +01FF +7C44 +1010 +1028 +1044 +7C92 +1111 +107C +1410 +18FE +7054 +0092 +0111 +0000 +0000 +ENDCHAR +STARTCHAR U+747C +ENCODING 29820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +1010 +10FE +1092 +10FE +7C92 +10FE +1011 +11FF +1404 +19FF +7024 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+747D +ENCODING 29821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0122 +7A22 +1455 +1000 +1088 +1108 +7B08 +152E +1128 +1128 +1928 +7128 +0138 +014F +0000 +0000 +ENDCHAR +STARTCHAR U+747E +ENCODING 29822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +07FC +7D10 +11F0 +13F8 +1248 +7FF8 +1040 +13F8 +1040 +1DF0 +6040 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+747F +ENCODING 29823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F3C +4825 +5F47 +443E +5F22 +4A14 +5108 +7F77 +0000 +3FFE +0080 +3FFE +0086 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+7480 +ENCODING 29824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1444 +FC44 +27FC +2144 +2120 +FBFE +2220 +27FC +2A20 +23FC +3A20 +E224 +43FE +0200 +0200 +ENDCHAR +STARTCHAR U+7481 +ENCODING 29825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1084 +FBFE +2244 +2274 +2294 +FAD4 +2324 +2244 +2284 +23FC +3840 +E524 +452A +090A +00F8 +ENDCHAR +STARTCHAR U+7482 +ENCODING 29826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +0044 +7DFF +1044 +107C +1044 +107C +7C44 +13FF +1044 +1092 +1111 +1CFE +7010 +03FF +0000 +ENDCHAR +STARTCHAR U+7483 +ENCODING 29827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +07FC +7E28 +12A8 +1268 +1298 +7FF8 +1040 +17FC +1464 +1C94 +67F4 +0414 +040C +0000 +ENDCHAR +STARTCHAR U+7485 +ENCODING 29829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0244 +036C +F928 +21FC +2124 +21FC +2124 +F924 +21FC +2020 +27FF +20A8 +39AC +E326 +0623 +0020 +ENDCHAR +STARTCHAR U+7486 +ENCODING 29830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03DE +F842 +214A +20C6 +214A +2022 +F870 +21DC +2707 +2020 +21C8 +3832 +E1C4 +0018 +01E0 +ENDCHAR +STARTCHAR U+7487 +ENCODING 29831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0240 +F244 +2FFE +2480 +2400 +F77E +2512 +2554 +2550 +355E +E950 +4950 +15B0 +2290 +010E +ENDCHAR +STARTCHAR U+7488 +ENCODING 29832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +7888 +13EF +1092 +13E2 +108A +7BEA +110A +11EA +112A +192A +7224 +042A +01D1 +0000 +0000 +ENDCHAR +STARTCHAR U+7489 +ENCODING 29833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0210 +70FE +2010 +28FE +2492 +20FE +7092 +20FE +2E10 +2210 +22FE +3A10 +6310 +04FF +0800 +ENDCHAR +STARTCHAR U+748A +ENCODING 29834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +0044 +7DFF +1044 +107C +1010 +11FF +7D11 +1155 +1155 +11BB +1111 +7D11 +0107 +0000 +0000 +ENDCHAR +STARTCHAR U+748B +ENCODING 29835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7D10 +10A0 +17FC +11F0 +7D10 +11F0 +1110 +15F0 +1840 +67FC +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+748E +ENCODING 29838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +17BC +FDAC +25AC +26B4 +26B4 +FB18 +24A4 +2040 +2FFE +2090 +3910 +E0A0 +4040 +01B0 +060C +ENDCHAR +STARTCHAR U+748F +ENCODING 29839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FC +F984 +210C +23F8 +2008 +23FF +F840 +2474 +24A5 +2726 +24F4 +3C24 +E424 +0755 +0C83 +ENDCHAR +STARTCHAR U+7490 +ENCODING 29840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0FA0 +F8BE +28C4 +28A4 +2FA8 +F210 +2228 +2BC4 +2A82 +2A7C +3A44 +CBC4 +5E44 +007C +0044 +ENDCHAR +STARTCHAR U+7491 +ENCODING 29841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FBFF +2754 +2154 +2154 +27FF +F954 +2154 +2154 +27FF +2000 +3800 +E154 +0356 +0653 +ENDCHAR +STARTCHAR U+7492 +ENCODING 29842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +01E8 +FA31 +214A +2084 +237B +2000 +F8FC +2084 +2084 +20FC +2000 +3884 +E0CC +0048 +03FF +ENDCHAR +STARTCHAR U+7494 +ENCODING 29844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +7C44 +11FF +1193 +1155 +1139 +7DFF +1000 +10FE +1482 +18FE +1082 +60FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+7495 +ENCODING 29845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +7C02 +10FE +1002 +11FE +1000 +7DEF +1089 +11EF +1004 +11FF +7C84 +0044 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+7497 +ENCODING 29847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21F8 +1108 +09F8 +4108 +21F8 +13FC +0100 +13FC +2524 +4248 +1FFC +1FFC +0088 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+7498 +ENCODING 29848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0124 +7CA8 +17FF +1070 +10A8 +1124 +7E23 +1108 +11FE +1268 +16A8 +19FF +6108 +0208 +0408 +ENDCHAR +STARTCHAR U+7499 +ENCODING 29849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +F840 +27FF +2088 +228A +2104 +FBFE +2505 +21FC +2104 +21FC +3820 +E124 +0326 +0623 +00E0 +ENDCHAR +STARTCHAR U+749A +ENCODING 29850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FE +F844 +2028 +23FF +2052 +2094 +F930 +23FF +2249 +2289 +237F +3A49 +E249 +0279 +0203 +ENDCHAR +STARTCHAR U+749C +ENCODING 29852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +1110 +FFFC +2110 +2114 +2FFE +F840 +23F8 +2248 +23F8 +2248 +3BF8 +E000 +4110 +020C +0404 +ENDCHAR +STARTCHAR U+749E +ENCODING 29854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +02A8 +7DB0 +17FC +1110 +10A0 +7FF8 +1040 +11F0 +1040 +1FFC +6060 +0190 +060C +0000 +ENDCHAR +STARTCHAR U+749F +ENCODING 29855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +0104 +7DFC +1104 +11FC +1020 +17FF +7C00 +11FC +1104 +1104 +1DFC +60A8 +0124 +0222 +0060 +ENDCHAR +STARTCHAR U+74A0 +ENCODING 29856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001C +01F0 +FA22 +2124 +27FF +20A8 +21AC +FB26 +2623 +2000 +23FE +2222 +3BFE +E222 +0222 +03FE +ENDCHAR +STARTCHAR U+74A1 +ENCODING 29857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0224 +0124 +7C48 +10FE +1148 +1448 +127E +7C48 +1048 +167E +1248 +1E48 +727F +0340 +04FF +0800 +ENDCHAR +STARTCHAR U+74A2 +ENCODING 29858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7CA0 +13B8 +12A8 +12A8 +7FB8 +10A0 +13F8 +1248 +1FF8 +6248 +03F8 +0208 +0000 +ENDCHAR +STARTCHAR U+74A3 +ENCODING 29859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0148 +0148 +7E52 +10E2 +135C +1148 +127F +7FE8 +1044 +17FF +1122 +1124 +1A98 +6419 +0065 +0183 +ENDCHAR +STARTCHAR U+74A5 +ENCODING 29861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0244 +0244 +07E8 +724F +224A +211A +23EA +742A +2BAA +22AC +22A4 +3EA4 +63A4 +002A +004A +0191 +ENDCHAR +STARTCHAR U+74A6 +ENCODING 29862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +07F8 +FA42 +2124 +27FF +2421 +FA92 +2285 +247C +2080 +21FC +3B04 +E698 +0070 +01DC +0707 +ENDCHAR +STARTCHAR U+74A7 +ENCODING 29863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FFC +2288 +3E50 +21FC +3E20 +53FC +1E20 +3FF8 +0100 +1FF0 +0120 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+74A8 +ENCODING 29864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +13BC +FA04 +27A8 +2890 +2528 +FA46 +2440 +2A48 +2150 +27FE +38E0 +E150 +424E +0C44 +0040 +ENDCHAR +STARTCHAR U+74A9 +ENCODING 29865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0078 +1040 +FFFE +2482 +24F4 +2788 +FCF8 +2400 +27FE +24C0 +2768 +3CB0 +E768 +48A6 +1324 +0040 +ENDCHAR +STARTCHAR U+74AA +ENCODING 29866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +7D04 +11FC +1000 +13DE +1252 +7E52 +13DE +1020 +1020 +17FF +1C70 +60A8 +0124 +0623 +ENDCHAR +STARTCHAR U+74AB +ENCODING 29867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +0326 +F924 +27FF +2401 +25FD +2104 +F9FC +2000 +23FE +2222 +2222 +3BFE +E222 +0222 +03FE +ENDCHAR +STARTCHAR U+74AD +ENCODING 29869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +7911 +157D +1210 +177C +7954 +127C +1154 +117C +1910 +11FE +6210 +4500 +08FF +0000 +0000 +ENDCHAR +STARTCHAR U+74AE +ENCODING 29870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +F800 +23FE +2202 +22FA +228A +FAFA +2202 +23FE +2104 +21FC +3904 +E1FC +0104 +07FF +ENDCHAR +STARTCHAR U+74AF +ENCODING 29871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0050 +F98C +2777 +2000 +23FE +2222 +FAAA +2222 +23FE +2000 +21FC +3904 +E1FC +0104 +01FC +ENDCHAR +STARTCHAR U+74B0 +ENCODING 29872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7EA8 +13F8 +1000 +17FC +7DF0 +1110 +11F8 +14C8 +19B0 +6690 +008C +0080 +0000 +ENDCHAR +STARTCHAR U+74B1 +ENCODING 29873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07DF +F904 +2104 +27CE +2104 +2104 +F9DF +2740 +2060 +2028 +214A +215B +3B51 +E264 +01C4 +073C +ENDCHAR +STARTCHAR U+74B2 +ENCODING 29874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +011C +7C44 +1082 +157D +1232 +105C +7DA8 +104C +169A +122A +1EC9 +6231 +0300 +04FF +0800 +ENDCHAR +STARTCHAR U+74B5 +ENCODING 29877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +01A6 +7D32 +1122 +1122 +11BE +7D02 +113A +11CE +112A +1D2A +63FF +0000 +0084 +0102 +0201 +ENDCHAR +STARTCHAR U+74B6 +ENCODING 29878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7DFC +1024 +13FF +1024 +7DFC +1020 +13FE +1649 +1800 +13FE +6252 +4252 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+74B7 +ENCODING 29879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0150 +07F0 +7110 +27DF +2552 +27E2 +2542 +77CA +254A +2FEA +220A +27C4 +784A +01D1 +0000 +0000 +ENDCHAR +STARTCHAR U+74B8 +ENCODING 29880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +1101 +117D +1054 +1098 +7C7C +13C4 +107C +1044 +107C +1044 +7C7C +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+74B9 +ENCODING 29881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +7C10 +10FE +1000 +17FF +10FC +7C10 +13FF +1004 +17FF +1004 +1DD4 +614C +01C4 +000C +ENDCHAR +STARTCHAR U+74BA +ENCODING 29882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FE4 +783E +4BA4 +682C +4BA4 +6AAC +4BA4 +4824 +FFFE +8002 +3FF8 +0100 +1FF0 +0140 +0124 +FFFE +ENDCHAR +STARTCHAR U+74BB +ENCODING 29883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07DF +FA49 +21C7 +275D +2041 +2020 +FBFE +2104 +2104 +238E +26DB +3820 +E7FF +0020 +0020 +ENDCHAR +STARTCHAR U+74BD +ENCODING 29885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1110 +3FF8 +5BB4 +1570 +1BB0 +1550 +1BB0 +3FF8 +1FF0 +0120 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+74BE +ENCODING 29886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7FFF +1088 +17DF +12AC +7EAA +158D +1104 +15FC +1904 +11FC +6104 +4104 +0204 +0000 +0000 +ENDCHAR +STARTCHAR U+74BF +ENCODING 29887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +001E +0010 +7DFF +1139 +1044 +1183 +7C30 +10CC +1303 +11FC +1C84 +60FC +0084 +00FC +00FC +ENDCHAR +STARTCHAR U+74C0 +ENCODING 29888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +7C10 +11FF +1155 +1139 +7D55 +1000 +10FE +1420 +19FF +1129 +6129 +4129 +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+74C1 +ENCODING 29889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +01FF +7C54 +10FE +1188 +10FE +1088 +7CFE +1088 +10FE +10FE +1044 +7C38 +01C7 +0000 +0000 +ENDCHAR +STARTCHAR U+74C2 +ENCODING 29890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +01FF +7C44 +1010 +10FE +1010 +11FF +7C20 +1042 +10FE +1000 +10FE +7CAA +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+74C3 +ENCODING 29891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +7D24 +11FC +1124 +11FC +1000 +7C00 +17DF +1555 +1555 +17DF +1D55 +1555 +67DF +0000 +0000 +ENDCHAR +STARTCHAR U+74C5 +ENCODING 29893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7E74 +1254 +14D9 +177E +1254 +7D7A +178F +1020 +1FFF +1124 +6222 +4421 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+74C6 +ENCODING 29894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0063 +039C +7E10 +13FF +1252 +1462 +1442 +7DFE +1102 +11FE +1102 +1DFE +7102 +01FE +0102 +0201 +ENDCHAR +STARTCHAR U+74C8 +ENCODING 29896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00D0 +0790 +F93F +2125 +2FCD +2519 +2DC1 +F927 +2070 +21DC +2707 +2020 +3B26 +E0F8 +01AC +0767 +ENDCHAR +STARTCHAR U+74C9 +ENCODING 29897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +07DF +F904 +27DF +2104 +228A +2451 +F9FC +2104 +21FC +2104 +21FC +3904 +E1FC +0088 +0306 +ENDCHAR +STARTCHAR U+74CA +ENCODING 29898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +01F0 +7E20 +13F8 +12A8 +13F8 +7D10 +11F0 +11F0 +1510 +19F8 +6710 +00E0 +071C +0000 +ENDCHAR +STARTCHAR U+74CB +ENCODING 29899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7D7F +1122 +1014 +177F +1149 +7A7F +1449 +125D +1955 +115D +6141 +4200 +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+74CC +ENCODING 29900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +F800 +23FE +2292 +23FE +F800 +27AF +2020 +27AF +3870 +E1D1 +0F1A +010C +01E6 +0703 +ENDCHAR +STARTCHAR U+74CF +ENCODING 29903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +07FC +7AA0 +12B8 +17C8 +1038 +7FA0 +14B8 +17A0 +14B8 +1FA0 +64B8 +04A4 +059C +0000 +ENDCHAR +STARTCHAR U+74D0 +ENCODING 29904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +003C +F820 +23FF +2221 +22FC +2221 +FAFF +2292 +22FE +2292 +22FE +3A00 +E5FE +0152 +03FF +ENDCHAR +STARTCHAR U+74D2 +ENCODING 29906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +0528 +F7BC +2948 +2FBE +2318 +F5AA +294E +23F8 +2208 +2248 +3A48 +E248 +40B0 +010C +0604 +ENDCHAR +STARTCHAR U+74D3 +ENCODING 29907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07DF +0451 +FFDF +2451 +27DF +2421 +25FD +FC21 +25FD +2525 +25FD +2525 +3DFD +E4A9 +0525 +0423 +ENDCHAR +STARTCHAR U+74D4 +ENCODING 29908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07BC +7CA4 +17BC +17BC +14A4 +7FBC +1328 +14C4 +17FC +1890 +61D0 +0078 +0784 +0000 +ENDCHAR +STARTCHAR U+74D5 +ENCODING 29909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3CFE +0410 +3DFF +21BB +3D55 +05BB +0555 +19BB +0000 +3FFE +0080 +1FFC +0084 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+74D6 +ENCODING 29910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0FFE +F7BC +24A4 +27BC +2110 +F7FC +27FC +2110 +2FFE +3110 +E348 +4586 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+74D7 +ENCODING 29911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +03FE +7C90 +11FC +1310 +15FC +11FC +7D10 +11FC +17FF +1451 +14F9 +7D8D +04FB +0000 +0000 +ENDCHAR +STARTCHAR U+74D8 +ENCODING 29912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +07FF +7C88 +13FE +1222 +13FE +1088 +7D10 +11FE +1320 +15FE +1120 +1DFE +6120 +01FF +0100 +ENDCHAR +STARTCHAR U+74D9 +ENCODING 29913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +00FE +7C10 +107C +11FF +10FD +7CFC +11FF +1002 +11FF +1D2A +71E2 +0156 +0249 +0000 +0000 +ENDCHAR +STARTCHAR U+74DA +ENCODING 29914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +07FE +7D08 +17FF +1108 +1294 +1463 +7FFE +1202 +13FE +1602 +1BFE +6202 +03FE +0202 +0401 +ENDCHAR +STARTCHAR U+74DB +ENCODING 29915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +01C5 +E105 +5FE4 +5124 +57DF +5124 +FFE4 +5244 +53C4 +5004 +7FEE +DAAA +1CEA +2BBA +0963 +ENDCHAR +STARTCHAR U+74DC +ENCODING 29916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +00E0 +0F20 +0920 +0920 +0920 +0920 +0920 +0910 +0990 +1150 +11E8 +2E28 +4004 +0000 +ENDCHAR +STARTCHAR U+74DD +ENCODING 29917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +7C40 +20FF +2101 +2801 +2A21 +2A11 +2A09 +2A01 +2902 +288C +4A40 +1F20 +001F +0000 +0000 +ENDCHAR +STARTCHAR U+74DE +ENCODING 29918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +0710 +7A50 +2A54 +2A7E +2A90 +2A14 +2AFE +2A10 +2A28 +2A26 +2942 +2A80 +5E40 +403E +8004 +ENDCHAR +STARTCHAR U+74DF +ENCODING 29919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0640 +1C40 +747E +44C2 +5482 +55F2 +5412 +5412 +5476 +5444 +564C +5241 +5363 +D5BE +9CC0 +B47F +ENDCHAR +STARTCHAR U+74E0 +ENCODING 29920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +7FD0 +1950 +2550 +5F50 +0150 +7F50 +1150 +1D50 +2570 +0658 +0678 +1DC4 +0000 +ENDCHAR +STARTCHAR U+74E1 +ENCODING 29921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0808 +3EF0 +0884 +7FA4 +22A4 +14A4 +3EA4 +08A4 +7FA4 +08A2 +0929 +0A2C +0830 +0000 +0000 +ENDCHAR +STARTCHAR U+74E2 +ENCODING 29922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F30 +19D0 +7F50 +5B50 +7F50 +0150 +3D50 +0150 +7F70 +1950 +3678 +53D8 +3404 +0000 +ENDCHAR +STARTCHAR U+74E3 +ENCODING 29923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1090 +7FFC +2BA8 +2BA8 +2BA8 +7FFC +1390 +1F90 +737C +15D0 +15D0 +2F30 +4810 +0000 +ENDCHAR +STARTCHAR U+74E4 +ENCODING 29924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +FE1C +00E0 +EEA8 +AAA8 +EEA8 +28A8 +FEA8 +28A8 +7CA8 +28A8 +FEA8 +24A4 +68AA +A538 +3200 +ENDCHAR +STARTCHAR U+74E5 +ENCODING 29925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +027E +3C34 +2058 +2A2C +2A5A +2929 +2AC8 +4E30 +0808 +3E3E +2A2A +3E3E +0909 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+74E6 +ENCODING 29926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0400 +0400 +07C0 +0440 +0440 +0640 +0940 +0940 +0840 +09C4 +0E44 +703C +0000 +ENDCHAR +STARTCHAR U+74E7 +ENCODING 29927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FA0 +1020 +1020 +1E20 +13FC +1220 +1A20 +1620 +1620 +1220 +1624 +1A04 +61FC +0000 +ENDCHAR +STARTCHAR U+74E8 +ENCODING 29928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FF +F880 +2080 +2080 +21F8 +2108 +2108 +2148 +2168 +3928 +E308 +0208 +0209 +03C9 +0E07 +ENDCHAR +STARTCHAR U+74E9 +ENCODING 29929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F10 +10E0 +1020 +1E20 +1220 +1BFC +1620 +1620 +1220 +1220 +1624 +1A04 +61FC +0000 +ENDCHAR +STARTCHAR U+74EA +ENCODING 29930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFF +4080 +4080 +7CFE +44A2 +44B6 +6494 +549C +5588 +451C +4736 +4463 +5C01 +7603 +C3FE +ENDCHAR +STARTCHAR U+74EB +ENCODING 29931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C30 +1818 +300C +EFF7 +0210 +0610 +1C70 +0000 +FFFF +0800 +0FF0 +0A10 +1B10 +1111 +1FF3 +F00E +ENDCHAR +STARTCHAR U+74EC +ENCODING 29932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +0840 +7E40 +107C +1044 +1E44 +1264 +1254 +124C +2244 +4244 +0255 +1465 +09C7 +0000 +0000 +ENDCHAR +STARTCHAR U+74EE +ENCODING 29934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07C0 +0440 +1930 +618C +0260 +1F90 +0000 +7FFC +0400 +07E0 +0520 +08A4 +0FA4 +701C +0000 +ENDCHAR +STARTCHAR U+74EF +ENCODING 29935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +03FE +7E80 +4088 +62FC +5288 +54C8 +48A8 +48A8 +5488 +5288 +6288 +40AA +44CA +7E86 +0002 +ENDCHAR +STARTCHAR U+74F0 +ENCODING 29936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0070 +7F10 +1050 +1048 +1E88 +13FC +1A48 +1648 +1648 +1288 +1330 +1604 +1A04 +61FC +0000 +ENDCHAR +STARTCHAR U+74F1 +ENCODING 29937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F30 +11C0 +1040 +1E78 +13C0 +1A40 +167C +17C0 +1240 +1244 +163C +1A04 +61FC +0000 +ENDCHAR +STARTCHAR U+74F2 +ENCODING 29938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F2C +11F0 +1020 +1EA8 +12A8 +1AA8 +16F8 +16A8 +1220 +1228 +161C +1A04 +61FC +0000 +ENDCHAR +STARTCHAR U+74F4 +ENCODING 29940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0BFE +1480 +1488 +22FC +5188 +88C8 +00A8 +7EA8 +0288 +2488 +1488 +08AA +04CA +0486 +0002 +ENDCHAR +STARTCHAR U+74F5 +ENCODING 29941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FE +0840 +1040 +227C +7F44 +0164 +0054 +3E4C +2244 +2244 +2244 +2265 +3EC5 +2207 +0000 +0000 +ENDCHAR +STARTCHAR U+74F6 +ENCODING 29942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +13FC +1480 +7F80 +14F0 +1490 +14D0 +7FB0 +14B0 +1490 +1494 +24EC +270C +4404 +0000 +ENDCHAR +STARTCHAR U+74F7 +ENCODING 29943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +79FC +0248 +1CD0 +6120 +0618 +7FFC +0800 +0FE0 +0A20 +1124 +1FA4 +701C +0000 +ENDCHAR +STARTCHAR U+74F8 +ENCODING 29944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1020 +1040 +1EF8 +1288 +1AF8 +1688 +1688 +12F8 +1288 +1604 +1A04 +61FC +0000 +ENDCHAR +STARTCHAR U+74FA +ENCODING 29946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3EFF +2040 +3E40 +2040 +207C +3E44 +2044 +2064 +FF54 +2054 +2244 +6244 +4F45 +F97D +00C3 +ENDCHAR +STARTCHAR U+74FB +ENCODING 29947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +6200 +36FF +1C20 +3620 +E320 +103C +FF24 +2024 +4834 +FF2C +4924 +4924 +4924 +4925 +4B3D +08E3 +ENDCHAR +STARTCHAR U+74FC +ENCODING 29948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FDFC +4124 +4124 +41FC +7D24 +4524 +45FC +6420 +55FC +5420 +4420 +47FE +5C01 +7603 +C3FE +ENDCHAR +STARTCHAR U+74FD +ENCODING 29949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +0490 +7FFF +4FF9 +0808 +0FF8 +0000 +7FFF +0800 +0FF0 +0910 +0892 +0A12 +3C1E +0000 +0000 +ENDCHAR +STARTCHAR U+74FE +ENCODING 29950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FBF +0410 +0410 +7FDE +2492 +4452 +151A +1116 +7FD2 +1112 +0A12 +0412 +0A1A +31B3 +0000 +0000 +ENDCHAR +STARTCHAR U+74FF +ENCODING 29951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4004 +23FE +FE80 +0088 +44FC +2888 +FEC8 +00A8 +04A8 +7E88 +4488 +4488 +44AA +44CA +7C86 +4402 +ENDCHAR +STARTCHAR U+7500 +ENCODING 29952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00BF +3F10 +0410 +041E +7FD2 +1112 +1512 +7FDA +1516 +1512 +7FD2 +0412 +0413 +3F9B +0000 +0000 +ENDCHAR +STARTCHAR U+7501 +ENCODING 29953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A00 +0AFE +1420 +7F20 +1420 +143C +1424 +1424 +1434 +7F4C +1444 +1444 +2445 +247D +4587 +4400 +ENDCHAR +STARTCHAR U+7502 +ENCODING 29954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +005F +3FD0 +2010 +3FDE +2052 +3FD2 +2016 +3FD2 +3552 +3FD2 +5552 +5552 +155B +10D3 +0000 +0000 +ENDCHAR +STARTCHAR U+7503 +ENCODING 29955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +3C24 +08A4 +7EA8 +1D50 +2A48 +4884 +7FFC +0400 +07E0 +0520 +08A4 +0FA4 +701C +0000 +ENDCHAR +STARTCHAR U+7504 +ENCODING 29956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1440 +7F40 +5578 +5548 +7F68 +4958 +0858 +7F48 +0848 +085C +0E6C +7184 +0000 +ENDCHAR +STARTCHAR U+7505 +ENCODING 29957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +2100 +21F8 +3DA8 +25F8 +35A8 +2DF8 +2D20 +26F8 +2620 +2DFC +3404 +63FC +0000 +ENDCHAR +STARTCHAR U+7506 +ENCODING 29958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1010 +2424 +6C6C +3838 +1212 +7F7F +0101 +FFFF +0800 +1FF0 +1110 +3FF1 +E00F +ENDCHAR +STARTCHAR U+7507 +ENCODING 29959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +4949 +2A2A +1414 +2222 +7FFF +4001 +5FFD +0400 +07F0 +0490 +0452 +0512 +0E1E +0000 +0000 +ENDCHAR +STARTCHAR U+7508 +ENCODING 29960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7FFF +4140 +7F7C +4144 +7F64 +4154 +7F4C +0844 +7F44 +0844 +2A55 +4965 +0847 +0000 +0000 +ENDCHAR +STARTCHAR U+750B +ENCODING 29963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +7F7F +2220 +1420 +7F3E +4922 +7F32 +492A +5D22 +5522 +5D2A +4133 +4363 +0000 +0000 +ENDCHAR +STARTCHAR U+750C +ENCODING 29964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +4040 +5E40 +5278 +5E48 +4068 +7F58 +6D58 +6D48 +7F4C +405C +7F64 +4184 +0000 +ENDCHAR +STARTCHAR U+750D +ENCODING 29965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FF0 +1290 +1FF0 +3FFC +2008 +5FF0 +0400 +3FE0 +0924 +0FA4 +701C +0000 +ENDCHAR +STARTCHAR U+750E +ENCODING 29966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7FFC +3E40 +2A40 +3E78 +2A48 +3E68 +0A58 +7F58 +0448 +7F4C +245C +1464 +0D84 +0000 +ENDCHAR +STARTCHAR U+750F +ENCODING 29967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +7F08 +0874 +7F08 +2274 +3E08 +1410 +7F60 +0004 +FFFE +0800 +0FE0 +0920 +08A4 +0E24 +101C +ENDCHAR +STARTCHAR U+7510 +ENCODING 29968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +24BF +1510 +7FDE +1512 +249A +4456 +1092 +3BD2 +4A92 +2A96 +17DB +2093 +4083 +0000 +0000 +ENDCHAR +STARTCHAR U+7511 +ENCODING 29969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +14FC +7F40 +4940 +7F78 +4948 +7F68 +0058 +3E58 +2288 +3E88 +22EC +3F8C +2204 +0000 +ENDCHAR +STARTCHAR U+7512 +ENCODING 29970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +407F +7FA0 +D520 +5520 +553C +FFA4 +5524 +5534 +552C +5524 +FFA4 +0024 +5525 +D53D +9563 +ENDCHAR +STARTCHAR U+7513 +ENCODING 29971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EF8 +2250 +3FFC +2020 +3EF8 +5220 +1E20 +7FFC +0400 +07E0 +0924 +0FA4 +781C +0000 +ENDCHAR +STARTCHAR U+7514 +ENCODING 29972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103F +1F90 +2110 +3FF0 +289E +3252 +3FF2 +3FDA +3FD6 +2012 +3FD3 +5057 +1FDB +1053 +0000 +0000 +ENDCHAR +STARTCHAR U+7515 +ENCODING 29973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0890 +32FC +0D90 +0AF8 +7EF8 +0490 +08FC +3FF8 +0400 +3FE4 +0924 +7E9C +0000 +ENDCHAR +STARTCHAR U+7516 +ENCODING 29974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4242 +7E7E +2424 +4242 +0000 +FFFF +0800 +1FF0 +1110 +3FF1 +E00F +ENDCHAR +STARTCHAR U+7517 +ENCODING 29975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +077E +0420 +7FA0 +44A0 +5F3C +44A4 +7FA4 +4934 +4F2C +4024 +7FA4 +6AA4 +73A5 +AEBD +25E3 +ENDCHAR +STARTCHAR U+7518 +ENCODING 29976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +0820 +7FFC +0820 +0820 +0820 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7519 +ENCODING 29977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00A0 +0094 +00FE +FF80 +2240 +2240 +FFC0 +2240 +2240 +3E20 +2220 +2212 +3E12 +220A +0004 +ENDCHAR +STARTCHAR U+751A +ENCODING 29978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0440 +07C0 +0440 +07C0 +0440 +7FFC +1280 +1288 +1478 +1800 +1FF8 +1000 +0000 +ENDCHAR +STARTCHAR U+751B +ENCODING 29979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +220E +2270 +2210 +2210 +7F10 +23FF +2210 +2210 +2210 +3EFE +2282 +2282 +2282 +2282 +3EFE +2282 +ENDCHAR +STARTCHAR U+751C +ENCODING 29980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0688 +3888 +0888 +0888 +7FFC +0888 +0888 +0888 +3EF8 +2288 +2288 +2288 +3EF8 +2288 +0000 +ENDCHAR +STARTCHAR U+751D +ENCODING 29981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0722 +0422 +3FA2 +24FF +3F22 +2422 +273E +2022 +2A22 +2A3E +4A00 +0A01 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+751E +ENCODING 29982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0920 +3FFC +2008 +4FE0 +0820 +0FE0 +0820 +7FFC +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+751F +ENCODING 29983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +0900 +0900 +1FF8 +1100 +2100 +4100 +1FF0 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7520 +ENCODING 29984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0120 +F920 +8920 +89FE +8B20 +8A20 +F820 +8820 +8BFE +8820 +8820 +F820 +0020 +07FF +0000 +ENDCHAR +STARTCHAR U+7521 +ENCODING 29985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +4848 +4848 +4848 +7F7F +C8C8 +8888 +0808 +0808 +7E7E +0808 +0808 +0808 +1E08 +F0FF +0000 +ENDCHAR +STARTCHAR U+7522 +ENCODING 29986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFC +0820 +0444 +7FFE +4880 +4880 +4FF8 +5080 +6090 +4FF8 +4080 +8084 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+7523 +ENCODING 29987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +0420 +0240 +1FFC +1280 +1280 +17F8 +1880 +17F0 +2080 +2080 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7524 +ENCODING 29988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +FF28 +1028 +327F +6648 +D408 +3808 +683E +CC08 +1C08 +3A08 +6A08 +CB7F +0980 +18E0 +703F +ENDCHAR +STARTCHAR U+7525 +ENCODING 29989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +2BF8 +2A48 +3E48 +2BF8 +4A48 +0A48 +3FF8 +0840 +0BF8 +0C48 +1888 +6108 +0630 +0000 +ENDCHAR +STARTCHAR U+7526 +ENCODING 29990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FA0 +08A0 +3EA0 +2AFC +3F20 +2B20 +3EF8 +6A20 +2820 +11FC +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+7527 +ENCODING 29991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4848 +4848 +FEFF +8888 +7E7E +0808 +1E08 +F0FF +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1038 +ENDCHAR +STARTCHAR U+7528 +ENCODING 29992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1110 +2110 +4030 +0000 +ENDCHAR +STARTCHAR U+7529 +ENCODING 29993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2108 +2108 +2108 +3FF8 +2108 +2108 +2108 +3FF8 +2108 +2108 +2128 +2112 +4102 +80FE +ENDCHAR +STARTCHAR U+752A +ENCODING 29994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0300 +0200 +3FFE +2082 +2082 +2082 +3FFE +2082 +2082 +2082 +3FFE +2082 +6082 +4082 +C08E +ENDCHAR +STARTCHAR U+752B +ENCODING 29995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0110 +7FFC +0100 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1130 +0000 +ENDCHAR +STARTCHAR U+752C +ENCODING 29996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0460 +0380 +0100 +3FF8 +2108 +3FF8 +2108 +2108 +3FF8 +2108 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+752D +ENCODING 29997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0100 +0760 +1918 +E104 +3FF8 +2108 +2108 +3FF8 +2108 +2108 +3FF8 +2108 +4128 +8110 +ENDCHAR +STARTCHAR U+752E +ENCODING 29998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1FFF +1211 +6211 +0421 +084E +0000 +3FFE +2082 +3FFE +2082 +3FFE +2082 +4086 +0000 +0000 +ENDCHAR +STARTCHAR U+752F +ENCODING 29999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4202 +A914 +2828 +47E4 +0000 +3FF8 +2108 +3FF8 +2108 +3FF8 +2108 +2128 +2110 +ENDCHAR +STARTCHAR U+7530 +ENCODING 30000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2108 +2108 +2108 +3FF8 +2108 +2108 +2108 +2108 +3FF8 +2008 +0000 +0000 +ENDCHAR +STARTCHAR U+7531 +ENCODING 30001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0100 +3FF8 +2108 +2108 +2108 +3FF8 +2108 +2108 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+7532 +ENCODING 30002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +2108 +3FF8 +2108 +2108 +3FF8 +2108 +0100 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7533 +ENCODING 30003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +2108 +2108 +3FF8 +2108 +2108 +3FF8 +2108 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7535 +ENCODING 30005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0200 +0210 +7FF8 +4210 +4210 +7FF0 +4210 +4210 +7FF0 +4210 +0200 +0204 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+7536 +ENCODING 30006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0600 +0400 +7FFE +4102 +4102 +4102 +4102 +7FFE +4102 +4102 +4102 +4102 +4102 +7FFE +0000 +ENDCHAR +STARTCHAR U+7537 +ENCODING 30007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +0100 +7FF8 +0208 +0408 +1808 +6070 +0000 +ENDCHAR +STARTCHAR U+7538 +ENCODING 30008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0FF8 +1008 +1008 +3FC8 +5248 +1248 +1FC8 +1248 +1248 +1FC8 +1048 +0030 +0000 +ENDCHAR +STARTCHAR U+7539 +ENCODING 30009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +3FFC +2104 +3FFC +2104 +2104 +3FFC +0000 +FFFF +0800 +1FFC +0004 +0004 +000C +0038 +ENDCHAR +STARTCHAR U+753A +ENCODING 30010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F80 +24FC +2490 +2490 +3F90 +2490 +2490 +2490 +3F90 +2090 +0010 +0010 +0030 +0000 +ENDCHAR +STARTCHAR U+753B +ENCODING 30011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +2FE8 +2928 +2928 +2FE8 +2928 +2928 +2FE8 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+753C +ENCODING 30012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1110 +1FF0 +0000 +7FFC +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+753D +ENCODING 30013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +0092 +7C92 +5492 +5492 +5492 +5492 +7C92 +5492 +5492 +5492 +5492 +7C92 +0182 +0102 +0302 +ENDCHAR +STARTCHAR U+753E +ENCODING 30014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +2220 +4440 +2220 +1110 +1110 +0008 +3FFC +2108 +2108 +3FF8 +2108 +2108 +3FF8 +2008 +ENDCHAR +STARTCHAR U+753F +ENCODING 30015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7C10 +5410 +55FF +5440 +5440 +7C40 +5440 +5440 +5440 +5440 +7C40 +0060 +003E +0000 +ENDCHAR +STARTCHAR U+7540 +ENCODING 30016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +0004 +FFFE +0820 +0820 +0820 +0820 +1020 +2020 +ENDCHAR +STARTCHAR U+7543 +ENCODING 30019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +FE7E +92C2 +9282 +9382 +FE02 +927A +9202 +9202 +FE02 +1002 +1006 +1004 +101C +ENDCHAR +STARTCHAR U+7544 +ENCODING 30020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +2108 +1110 +1020 +0040 +3FF8 +2108 +2108 +3FF8 +2108 +2108 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+7545 +ENCODING 30021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13F8 +1020 +7C40 +5480 +5504 +57FE +7C94 +5494 +5524 +5524 +7E44 +5444 +1084 +1128 +1010 +ENDCHAR +STARTCHAR U+7546 +ENCODING 30022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7F20 +0020 +3E20 +2A20 +2A20 +3E30 +2A48 +2A48 +2A7C +3F84 +2204 +0000 +ENDCHAR +STARTCHAR U+7547 +ENCODING 30023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +0080 +7C80 +55FF +5501 +5601 +7CF9 +5401 +5401 +55FD +7C01 +4401 +0002 +0004 +0038 +ENDCHAR +STARTCHAR U+7548 +ENCODING 30024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +041C +7FE0 +5500 +5500 +55FC +5504 +7D44 +5548 +5528 +5528 +5510 +7E28 +4228 +0444 +0182 +ENDCHAR +STARTCHAR U+7549 +ENCODING 30025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7C40 +57F8 +5440 +5440 +7C40 +57FC +5440 +54A0 +7CA0 +4510 +0208 +0404 +0000 +ENDCHAR +STARTCHAR U+754A +ENCODING 30026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0090 +7C90 +57FC +5490 +5490 +7C90 +5490 +57FC +5490 +7D10 +4510 +0210 +0410 +0000 +ENDCHAR +STARTCHAR U+754B +ENCODING 30027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +7C80 +54FC +5510 +5590 +7E90 +5450 +5460 +5420 +7C20 +4450 +0188 +0604 +0000 +ENDCHAR +STARTCHAR U+754C +ENCODING 30028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +1110 +0280 +0C60 +745C +0440 +0440 +0840 +3040 +0000 +ENDCHAR +STARTCHAR U+754D +ENCODING 30029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7C40 +54A0 +54A0 +5510 +7EA8 +54A4 +54A0 +54A0 +7D20 +4520 +0220 +0420 +0000 +ENDCHAR +STARTCHAR U+754E +ENCODING 30030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0460 +7E50 +5450 +5444 +57FE +5440 +7C40 +5440 +54A0 +54A0 +5510 +7D10 +4208 +040E +0804 +ENDCHAR +STARTCHAR U+754F +ENCODING 30031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +0000 +7FFC +0910 +0890 +08A0 +0B40 +0C30 +700C +0000 +ENDCHAR +STARTCHAR U+7550 +ENCODING 30032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +0000 +3FFC +2004 +2004 +3FFC +0000 +7FFE +4102 +4102 +7FFE +4102 +4102 +7FFE +0000 +ENDCHAR +STARTCHAR U+7551 +ENCODING 30033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +08A8 +0AA8 +2AA8 +2CA8 +28F8 +48A8 +08A8 +08A8 +14A8 +12F8 +2288 +4000 +0000 +ENDCHAR +STARTCHAR U+7552 +ENCODING 30034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +0810 +FF90 +0010 +7F10 +4910 +4910 +4910 +7F38 +4928 +4928 +496C +7F44 +00C6 +0183 +ENDCHAR +STARTCHAR U+7553 +ENCODING 30035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00C2 +3FC4 +02A8 +04B0 +0890 +1088 +2084 +4083 +1FFC +1084 +1084 +1FFC +1084 +1084 +1FFC +ENDCHAR +STARTCHAR U+7554 +ENCODING 30036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0248 +7D48 +5550 +5440 +57F8 +7C40 +5440 +57FC +5440 +7C40 +4440 +4040 +0040 +0000 +ENDCHAR +STARTCHAR U+7557 +ENCODING 30039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0000 +3FFC +2004 +2004 +3FFC +0000 +7FFE +4102 +4102 +7FFE +4102 +4102 +7FFE +ENDCHAR +STARTCHAR U+7559 +ENCODING 30041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +39F8 +2048 +2448 +2688 +3908 +6230 +1FF0 +1110 +1FF0 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+755A +ENCODING 30042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +02C0 +0470 +3F88 +0100 +7FFC +0440 +1830 +7FFC +1110 +1FF0 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+755B +ENCODING 30043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7CA0 +54A0 +5510 +5628 +7CC4 +5710 +5420 +54C8 +7F10 +4420 +00C0 +0700 +0000 +ENDCHAR +STARTCHAR U+755C +ENCODING 30044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0240 +1CC0 +0520 +03F0 +7E08 +1FF0 +1110 +1FF0 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+755D +ENCODING 30045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7F78 +0088 +3E88 +2B10 +2A10 +3E30 +2A30 +2A48 +3E88 +2304 +0204 +0000 +ENDCHAR +STARTCHAR U+755E +ENCODING 30046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +FFFF +0100 +0120 +7D20 +557C +5544 +7DCC +5508 +551C +5514 +7D36 +0163 +0100 +ENDCHAR +STARTCHAR U+755F +ENCODING 30047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +2104 +3FFC +2104 +3FFC +0420 +0C21 +383F +E400 +0FF0 +1830 +7660 +03C0 +1E78 +F00F +ENDCHAR +STARTCHAR U+7560 +ENCODING 30048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +1FF0 +1010 +1FF0 +1010 +1FF0 +0000 +3FF8 +2108 +3FF8 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+7561 +ENCODING 30049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +F820 +AFFF +A840 +A8C8 +A998 +FB12 +A9B6 +A864 +A8CC +A998 +FB30 +006C +01C6 +0F03 +ENDCHAR +STARTCHAR U+7562 +ENCODING 30050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +0920 +7FFC +0920 +1FF0 +0100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7563 +ENCODING 30051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03E0 +0410 +0808 +17F4 +2002 +47F1 +0410 +07F0 +0000 +1FFC +1084 +1FFC +1084 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7564 +ENCODING 30052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FF8 +5440 +5440 +57FC +7C10 +5410 +57FC +5510 +7C90 +4490 +0010 +0030 +0000 +ENDCHAR +STARTCHAR U+7565 +ENCODING 30053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7C78 +5488 +5550 +5620 +7C50 +5588 +56FC +5488 +7C88 +4488 +40F8 +0088 +0000 +ENDCHAR +STARTCHAR U+7566 +ENCODING 30054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FF8 +5440 +5440 +57FC +7C40 +5440 +57F8 +5440 +7C40 +4440 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+7567 +ENCODING 30055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +0200 +07F0 +3C40 +0380 +7FFC +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7569 +ENCODING 30057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7C40 +57FC +54C0 +54C8 +7D48 +5550 +5720 +5520 +7D10 +4550 +0188 +0604 +0000 +ENDCHAR +STARTCHAR U+756A +ENCODING 30058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3FD0 +1110 +0920 +7FFC +0380 +0540 +1930 +7FFC +1110 +1FF0 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+756B +ENCODING 30059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +7FFC +0110 +1FF0 +0FE0 +7FFC +1FF0 +1110 +1FF0 +1110 +1FF0 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+756C +ENCODING 30060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03E0 +0410 +0BE8 +1084 +27F2 +42A1 +0C98 +3086 +1FFC +1084 +1FFC +1084 +1FFC +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+756D +ENCODING 30061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7CA0 +5510 +57F8 +5444 +7C40 +57FC +5440 +5550 +7D48 +4644 +0444 +00C0 +0000 +ENDCHAR +STARTCHAR U+756F +ENCODING 30063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0044 +7C82 +553F +57C9 +5448 +7C89 +574F +5440 +54FE +7D84 +4648 +0C30 +0050 +018C +0603 +ENDCHAR +STARTCHAR U+7570 +ENCODING 30064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +0440 +3FF8 +0440 +0440 +7FFC +0240 +0C30 +3008 +0000 +ENDCHAR +STARTCHAR U+7571 +ENCODING 30065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +0240 +7E7E +4242 +4242 +7E7E +0240 +3FFC +2104 +2104 +3FFC +2104 +2104 +3FFC +0000 +ENDCHAR +STARTCHAR U+7572 +ENCODING 30066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0280 +0C60 +17D0 +E00E +1FF0 +0920 +1118 +2508 +0200 +1FF0 +1110 +1FF0 +1110 +1FF0 +1010 +ENDCHAR +STARTCHAR U+7573 +ENCODING 30067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0920 +0FE0 +0920 +0FE0 +3FFC +2FE8 +4820 +0FE0 +0FE0 +0820 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7574 +ENCODING 30068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FFC +5440 +55F8 +5440 +7FFC +5490 +57FC +5590 +7D50 +4650 +0410 +0030 +0000 +ENDCHAR +STARTCHAR U+7575 +ENCODING 30069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0FF8 +0088 +7FFF +0088 +0FF8 +0080 +1FFC +7FFF +0000 +2FFA +2FFA +288A +2FFA +2002 +3FFE +ENDCHAR +STARTCHAR U+7576 +ENCODING 30070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0920 +3FFC +2008 +4FE0 +0820 +0FE0 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7577 +ENCODING 30071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7CC8 +56A8 +5510 +55B0 +7E48 +57F8 +54A8 +56A8 +7D10 +4590 +4268 +0444 +0000 +ENDCHAR +STARTCHAR U+7578 +ENCODING 30072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7FF8 +5440 +54A0 +5510 +7FFC +5408 +55E8 +5528 +7DE8 +4528 +0008 +0018 +0000 +ENDCHAR +STARTCHAR U+7579 +ENCODING 30073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0420 +7FFE +5602 +5504 +55DE +5554 +7D54 +5554 +56D4 +545C +5494 +7C90 +4512 +020E +0400 +ENDCHAR +STARTCHAR U+757A +ENCODING 30074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0000 +1FFC +1084 +1FFC +1084 +1FFC +7FFF +0000 +1FFC +1084 +1FFC +1084 +1FFC +0000 +7FFF +ENDCHAR +STARTCHAR U+757B +ENCODING 30075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0124 +F8A8 +A820 +A9FE +A848 +A848 +FBFF +A884 +A986 +AB23 +A820 +F9FE +0020 +0020 +03FF +ENDCHAR +STARTCHAR U+757C +ENCODING 30076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01F8 +F908 +A9F8 +A908 +A908 +A9F8 +F800 +AFFF +A900 +ABFE +AE52 +F892 +0326 +0044 +019C +ENDCHAR +STARTCHAR U+757D +ENCODING 30077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +0038 +F9E0 +A820 +ABFF +A820 +A9FE +F922 +A9FE +A922 +A9FE +A820 +F9FE +0020 +0020 +03FF +ENDCHAR +STARTCHAR U+757E +ENCODING 30078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF8 +1108 +1108 +1FF8 +1108 +1108 +1FF8 +0000 +FE7F +9249 +9249 +FE7F +9249 +9249 +FE7F +0000 +ENDCHAR +STARTCHAR U+757F +ENCODING 30079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1528 +65C8 +1930 +1528 +7FFC +02A4 +7FFC +3E88 +2A48 +3E50 +2A20 +3E54 +218C +0000 +ENDCHAR +STARTCHAR U+7580 +ENCODING 30080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1508 +2A7F +5408 +2A3E +150A +007F +7F0A +493E +4908 +7F2E +4928 +4928 +7F28 +415F +0000 +0000 +ENDCHAR +STARTCHAR U+7581 +ENCODING 30081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03DE +F842 +A94A +A8C6 +A94A +A822 +F870 +A9DC +AF07 +A820 +A9C8 +F832 +01C4 +0018 +01E0 +ENDCHAR +STARTCHAR U+7582 +ENCODING 30082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FE0 +0920 +0FE0 +0FE0 +3838 +0EE0 +3018 +3FFC +2FE8 +4FE0 +0FE0 +0820 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7583 +ENCODING 30083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +05FC +7E88 +5450 +57FE +5400 +55FC +7D24 +55FC +5524 +55FC +5420 +7DFC +4420 +03FE +0000 +ENDCHAR +STARTCHAR U+7584 +ENCODING 30084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0092 +0054 +7C38 +55FF +5492 +7D11 +5442 +54EF +552A +7C6A +444F +0082 +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+7585 +ENCODING 30085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07FF +F800 +A9FC +A924 +A9FC +A924 +FFFF +A800 +A9FC +A924 +A9FC +F924 +01FC +0000 +07FF +ENDCHAR +STARTCHAR U+7586 +ENCODING 30086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +05F8 +0548 +3DF8 +2148 +3DF8 +27FC +15F8 +3D48 +15F8 +1D48 +65F8 +1BFC +0000 +ENDCHAR +STARTCHAR U+7587 +ENCODING 30087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7C40 +55F0 +57FC +55E8 +7C40 +55F0 +57FC +5408 +7FFC +46A8 +0398 +0218 +0000 +ENDCHAR +STARTCHAR U+7589 +ENCODING 30089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FE0 +0920 +0FE0 +0FE0 +3EF8 +2AA8 +3EF8 +3FF8 +3FFC +2208 +47E0 +0640 +0940 +7FFC +0000 +ENDCHAR +STARTCHAR U+758A +ENCODING 30090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FE0 +0920 +0FE0 +0FE0 +3EF8 +2AA8 +3EF8 +3EF8 +3FFC +3FE8 +4FE0 +0FE0 +0820 +7FFC +0000 +ENDCHAR +STARTCHAR U+758B +ENCODING 30091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0108 +0110 +0920 +0900 +0900 +09F0 +0900 +0900 +1500 +1300 +2180 +407C +0000 +ENDCHAR +STARTCHAR U+758C +ENCODING 30092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0080 +1FFC +0084 +3FFE +0084 +1FFC +0080 +0880 +18FC +2480 +4280 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+758E +ENCODING 30094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +07FC +0840 +0BF8 +2A48 +2E48 +2BF8 +28E0 +28E0 +2950 +2E48 +3844 +6040 +0000 +ENDCHAR +STARTCHAR U+758F +ENCODING 30095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +03FC +0C50 +0898 +2BE4 +2810 +2D50 +2950 +2950 +2950 +2F54 +3A54 +640C +0000 +ENDCHAR +STARTCHAR U+7590 +ENCODING 30096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +0100 +7FFE +4002 +1FF8 +1108 +1FF8 +1108 +1FF8 +0000 +FFFF +1101 +11F2 +2900 +C7FF +ENDCHAR +STARTCHAR U+7591 +ENCODING 30097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +27F8 +3890 +2260 +1E20 +11FC +1E28 +28B0 +7EA0 +08B8 +14A0 +1360 +2230 +440C +0000 +ENDCHAR +STARTCHAR U+7592 +ENCODING 30098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +9000 +5000 +5000 +1000 +3000 +5000 +D000 +1000 +2000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+7593 +ENCODING 30099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +9000 +D000 +57F0 +1110 +1110 +7110 +D11E +1102 +3102 +2302 +6206 +C604 +0C1C +ENDCHAR +STARTCHAR U+7594 +ENCODING 30100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +0FFC +4800 +2800 +2FFC +0840 +1840 +2840 +4840 +1040 +1040 +2040 +40C0 +0000 +ENDCHAR +STARTCHAR U+7595 +ENCODING 30101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +9000 +D000 +5200 +1200 +120C +7278 +D3C0 +1200 +3200 +2201 +6203 +C302 +01FE +ENDCHAR +STARTCHAR U+7596 +ENCODING 30102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +9004 +57FE +5084 +1084 +3084 +5084 +D0A4 +1094 +2088 +2080 +4080 +0080 +ENDCHAR +STARTCHAR U+7597 +ENCODING 30103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +1000 +9000 +57F8 +5010 +1020 +3040 +5040 +D040 +1040 +2040 +2240 +4140 +0080 +ENDCHAR +STARTCHAR U+7598 +ENCODING 30104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +1FFF +1000 +1000 +57FF +3020 +1020 +3020 +5020 +1020 +1022 +27FF +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+7599 +ENCODING 30105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +1200 +9210 +53F8 +5400 +1800 +37F0 +5020 +D0C0 +1300 +2400 +2402 +4402 +03FE +ENDCHAR +STARTCHAR U+759A +ENCODING 30106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4880 +2880 +29F0 +0910 +1A20 +2C20 +4840 +10C0 +1120 +2610 +580C +0000 +ENDCHAR +STARTCHAR U+759C +ENCODING 30108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +9000 +D000 +5000 +17FF +1020 +7020 +D038 +102C +3026 +2020 +6020 +C020 +0020 +ENDCHAR +STARTCHAR U+759D +ENCODING 30109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4840 +2840 +2A48 +0A48 +1A48 +2A48 +4A48 +1248 +1248 +23F8 +4208 +0000 +ENDCHAR +STARTCHAR U+759F +ENCODING 30111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +1000 +9008 +53FC +5200 +1200 +3204 +5FFE +D200 +1200 +2200 +2208 +43FC +0000 +ENDCHAR +STARTCHAR U+75A0 +ENCODING 30112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +9004 +5FFE +5100 +1108 +31FC +5108 +D108 +1208 +2208 +2408 +4850 +1020 +ENDCHAR +STARTCHAR U+75A1 +ENCODING 30113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +1000 +97F0 +5040 +5080 +1104 +37FE +5124 +D124 +1244 +2244 +2484 +4928 +0010 +ENDCHAR +STARTCHAR U+75A2 +ENCODING 30114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6080 +2080 +2484 +248C +6C98 +A880 +21C0 +6140 +4360 +C630 +0C1C +3807 +ENDCHAR +STARTCHAR U+75A3 +ENCODING 30115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4890 +2888 +2FFC +0880 +18C0 +28C0 +4940 +1140 +1244 +2444 +583C +0000 +ENDCHAR +STARTCHAR U+75A4 +ENCODING 30116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +9004 +57FE +5444 +1444 +3444 +57FC +D404 +1400 +2402 +2402 +43FE +0000 +ENDCHAR +STARTCHAR U+75A5 +ENCODING 30117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4840 +2840 +28A0 +0910 +1B28 +2D24 +4920 +1120 +1120 +2220 +4420 +0000 +ENDCHAR +STARTCHAR U+75A7 +ENCODING 30119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +0FFF +0800 +4801 +2BFE +1A08 +2A08 +4BFF +0A08 +0A08 +1245 +2283 +4701 +0000 +0000 +ENDCHAR +STARTCHAR U+75AA +ENCODING 30122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +0FFF +0800 +4A10 +2A10 +1A10 +2BDF +4A10 +0A10 +0A10 +0A51 +1291 +231F +0000 +0000 +ENDCHAR +STARTCHAR U+75AB +ENCODING 30123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +29E0 +2924 +0924 +1A1C +2FF0 +4910 +10A0 +1040 +21B0 +4E0C +0000 +ENDCHAR +STARTCHAR U+75AC +ENCODING 30124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +97FC +5400 +5440 +1444 +35FE +5444 +D444 +1444 +2884 +2884 +5128 +0210 +ENDCHAR +STARTCHAR U+75AE +ENCODING 30126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +1080 +9140 +5220 +5410 +1BEE +3224 +5220 +D2A0 +1240 +2208 +2208 +41F8 +0000 +ENDCHAR +STARTCHAR U+75AF +ENCODING 30127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +1008 +97FC +5408 +5618 +1518 +34A8 +5448 +D448 +14A8 +2518 +2A1A +480A +1006 +ENDCHAR +STARTCHAR U+75B0 +ENCODING 30128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +9080 +5048 +57FC +1040 +3040 +5050 +D3F8 +1040 +2040 +2044 +4FFE +0000 +ENDCHAR +STARTCHAR U+75B1 +ENCODING 30129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4900 +2900 +2BF8 +0C08 +1BC8 +2A48 +4BC8 +1270 +1204 +2204 +41FC +0000 +ENDCHAR +STARTCHAR U+75B2 +ENCODING 30130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4840 +2BFC +2A48 +0A50 +1BF0 +2B10 +4AA0 +12A0 +1440 +25B0 +4E0C +0000 +ENDCHAR +STARTCHAR U+75B3 +ENCODING 30131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4910 +2910 +2FFC +0910 +1910 +29F0 +4910 +1110 +1110 +21F0 +4110 +0000 +ENDCHAR +STARTCHAR U+75B4 +ENCODING 30132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +9004 +5FFE +5008 +1008 +33C8 +5248 +D248 +1248 +23C8 +2008 +4028 +0010 +ENDCHAR +STARTCHAR U+75B5 +ENCODING 30133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +5120 +3120 +3520 +1524 +15E8 +3530 +5520 +1520 +25E4 +2724 +5C1C +0000 +ENDCHAR +STARTCHAR U+75B6 +ENCODING 30134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +1FFF +1000 +1100 +5124 +3124 +17FF +3124 +5124 +1124 +113C +2100 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+75B8 +ENCODING 30136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2BF0 +2A10 +0A10 +1BF0 +2A10 +4A10 +13F0 +1000 +2FFC +4000 +0000 +ENDCHAR +STARTCHAR U+75B9 +ENCODING 30137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4880 +2940 +2A30 +0C4C +1980 +2820 +48C8 +1310 +1020 +20C0 +4700 +0000 +ENDCHAR +STARTCHAR U+75BA +ENCODING 30138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +3FFF +A000 +603C +27E0 +2040 +2040 +6FFE +A00C +2018 +6030 +40E0 +C780 +1CF0 +001F +ENDCHAR +STARTCHAR U+75BB +ENCODING 30139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +1FFF +1000 +5000 +31FC +1104 +3104 +51FC +1104 +1000 +1088 +2104 +4202 +0000 +0000 +ENDCHAR +STARTCHAR U+75BC +ENCODING 30140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4880 +28F0 +2910 +0EA0 +18C0 +2B30 +4CCC +1020 +1380 +2060 +4010 +0000 +ENDCHAR +STARTCHAR U+75BD +ENCODING 30141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2BF0 +2A10 +0A10 +1BF0 +2A10 +4BF0 +1210 +1210 +2FFC +4000 +0000 +ENDCHAR +STARTCHAR U+75BE +ENCODING 30142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4900 +2900 +2BF8 +0A40 +1C40 +2FFC +48C0 +10A0 +1110 +2208 +4C04 +0000 +ENDCHAR +STARTCHAR U+75BF +ENCODING 30143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A120 +6120 +2FFC +2124 +2124 +6FFC +A920 +2920 +6FFE +4222 +C222 +062E +1C20 +ENDCHAR +STARTCHAR U+75C0 +ENCODING 30144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +1FFF +9000 +D100 +5100 +13FE +1202 +7602 +D1F2 +1112 +3112 +21F2 +6006 +C004 +001C +ENDCHAR +STARTCHAR U+75C1 +ENCODING 30145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +1FFF +9000 +D040 +5040 +107F +1040 +7040 +D040 +13FC +3204 +2204 +6204 +C204 +03FC +ENDCHAR +STARTCHAR U+75C2 +ENCODING 30146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4A00 +2A00 +2FB8 +0AA8 +1AA8 +2AA8 +4AA8 +12A8 +12B8 +24A8 +4980 +0000 +ENDCHAR +STARTCHAR U+75C3 +ENCODING 30147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4840 +2840 +2FFC +0840 +1890 +2B90 +4860 +1050 +1098 +2FE4 +4004 +0000 +ENDCHAR +STARTCHAR U+75C4 +ENCODING 30148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1100 +9108 +51FC +5280 +1290 +34F8 +5880 +D088 +10FC +2080 +2080 +4080 +0080 +ENDCHAR +STARTCHAR U+75C5 +ENCODING 30149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2BF8 +2840 +0BF8 +1A48 +6A68 +0A98 +1318 +1208 +2208 +4218 +0000 +ENDCHAR +STARTCHAR U+75C6 +ENCODING 30150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +67FE +2402 +2402 +27FE +6400 +A486 +249C +64F0 +4C80 +C881 +18C3 +307E +ENDCHAR +STARTCHAR U+75C7 +ENCODING 30151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2800 +2FF8 +0840 +1840 +2A78 +4A40 +1240 +1240 +2FFC +4000 +0000 +ENDCHAR +STARTCHAR U+75C8 +ENCODING 30152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +97FC +5444 +5444 +17FC +3444 +5444 +D7FC +1444 +2444 +2444 +4854 +1008 +ENDCHAR +STARTCHAR U+75C9 +ENCODING 30153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +57F8 +3030 +10C0 +1338 +3C06 +5000 +97F8 +1040 +2040 +2044 +4FFE +8000 +ENDCHAR +STARTCHAR U+75CA +ENCODING 30154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +49C0 +28A0 +2910 +0FFC +1840 +2840 +4BF8 +1040 +1040 +2FFC +4000 +0000 +ENDCHAR +STARTCHAR U+75CB +ENCODING 30155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +1020 +5020 +33FE +1222 +3222 +5222 +13FE +1020 +1022 +27FF +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+75CC +ENCODING 30156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6FFE +2802 +2802 +2BFA +6802 +A9F2 +2912 +6912 +4912 +C9F2 +0802 +081E +ENDCHAR +STARTCHAR U+75CD +ENCODING 30157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4840 +2FFC +2840 +0BF8 +1848 +2BF8 +4A40 +0FFC +1444 +10B8 +2310 +4C0C +0000 +ENDCHAR +STARTCHAR U+75CE +ENCODING 30158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A040 +6040 +2FFF +2040 +20C8 +6D98 +A632 +2366 +60CC +4398 +CE36 +00E3 +0F81 +ENDCHAR +STARTCHAR U+75CF +ENCODING 30159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +3FFF +A000 +6080 +2080 +2FFF +2100 +63FC +A604 +2BFC +2204 +63FC +4204 +C204 +020C +ENDCHAR +STARTCHAR U+75D0 +ENCODING 30160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +57FF +3401 +15FD +3505 +5505 +1505 +15FD +1505 +2401 +47FF +0401 +0000 +0000 +ENDCHAR +STARTCHAR U+75D1 +ENCODING 30161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1040 +50FE +3144 +1628 +3030 +53D0 +103F +11E2 +1024 +2018 +4010 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+75D2 +ENCODING 30162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +0FFC +4910 +28A0 +2FFC +0840 +1BF8 +2840 +4840 +1FFC +1040 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+75D4 +ENCODING 30164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4840 +2840 +2BF8 +0840 +1FFC +2810 +4FFC +1210 +1110 +2110 +4030 +0000 +ENDCHAR +STARTCHAR U+75D5 +ENCODING 30165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2BF0 +2A10 +0BF0 +1A10 +2BF8 +4A48 +1250 +1220 +2390 +4C0C +0000 +ENDCHAR +STARTCHAR U+75D6 +ENCODING 30166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +9FFC +5120 +5120 +1924 +3524 +5528 +D528 +1530 +2120 +2124 +5FFE +0000 +ENDCHAR +STARTCHAR U+75D7 +ENCODING 30167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +9100 +D100 +53FE +1600 +11FC +7124 +D124 +17FF +3244 +2244 +63FF +C008 +0038 +ENDCHAR +STARTCHAR U+75D8 +ENCODING 30168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2FF8 +2800 +0BF0 +1A10 +2A10 +4BF0 +1220 +1120 +2140 +4FFC +0000 +ENDCHAR +STARTCHAR U+75D9 +ENCODING 30169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2FFC +2A48 +0A48 +1C90 +2A48 +4BF8 +1040 +1040 +2FFC +4000 +0000 +ENDCHAR +STARTCHAR U+75DA +ENCODING 30170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1042 +17FE +5048 +3FFF +1040 +30FC +5308 +1410 +1BFF +2010 +4050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+75DB +ENCODING 30171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2BF0 +2920 +08C0 +1BF8 +2A48 +4BF8 +1248 +13F8 +2248 +4258 +0000 +ENDCHAR +STARTCHAR U+75DC +ENCODING 30172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +9000 +D01C +51F0 +1020 +17FF +70A8 +D1AC +1727 +3000 +20F8 +6088 +C189 +0707 +ENDCHAR +STARTCHAR U+75DD +ENCODING 30173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +1FFF +1240 +1244 +5FC8 +3212 +1224 +3209 +5292 +1284 +1298 +2481 +48FF +0000 +0000 +ENDCHAR +STARTCHAR U+75DE +ENCODING 30174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4800 +2FFC +2860 +09D8 +1E44 +2840 +4BF8 +1208 +1208 +23F8 +4208 +0000 +ENDCHAR +STARTCHAR U+75DF +ENCODING 30175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +9000 +D222 +5326 +1124 +1020 +73FE +D202 +13FE +3202 +23FE +6202 +C202 +020E +ENDCHAR +STARTCHAR U+75E0 +ENCODING 30176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A104 +6204 +27FE +2092 +2190 +6F1F +A200 +23FC +660C +4D98 +C0F0 +039C +1E07 +ENDCHAR +STARTCHAR U+75E1 +ENCODING 30177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6050 +2048 +2FFE +2040 +67FC +A444 +27FC +6444 +47FC +C444 +0444 +044C +ENDCHAR +STARTCHAR U+75E2 +ENCODING 30178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4848 +29A8 +2F28 +0928 +1FE8 +2928 +4BA8 +1368 +1548 +2908 +4118 +0000 +ENDCHAR +STARTCHAR U+75E3 +ENCODING 30179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4840 +2840 +2FFC +0840 +1BF8 +2840 +4920 +1528 +1504 +2914 +40F0 +0000 +ENDCHAR +STARTCHAR U+75E4 +ENCODING 30180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1040 +9248 +5248 +5248 +1554 +38E2 +5048 +D7FC +1040 +2040 +2044 +4FFE +0000 +ENDCHAR +STARTCHAR U+75E6 +ENCODING 30182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +97FC +5080 +53F0 +1110 +3114 +5FFE +D000 +13F8 +2208 +2208 +43F8 +0208 +ENDCHAR +STARTCHAR U+75E7 +ENCODING 30183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1020 +9420 +52A8 +52A4 +18A2 +352A +5028 +D230 +1410 +2C20 +2440 +4480 +0300 +ENDCHAR +STARTCHAR U+75E8 +ENCODING 30184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1110 +97FC +5110 +5110 +17FE +3482 +5884 +D3F8 +1088 +2088 +2108 +4228 +0C10 +ENDCHAR +STARTCHAR U+75E9 +ENCODING 30185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +0840 +4BF8 +2A48 +2BF8 +0A48 +1BF8 +2840 +4BF8 +1090 +1060 +21B0 +4E0C +0000 +ENDCHAR +STARTCHAR U+75EA +ENCODING 30186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +1100 +51F0 +3220 +1448 +33FC +5248 +D248 +1248 +1FFE +20A0 +2110 +420E +0C04 +ENDCHAR +STARTCHAR U+75EB +ENCODING 30187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1200 +91FC +5544 +5444 +17F4 +3444 +54C4 +D4E4 +1554 +264C +2444 +4454 +0408 +ENDCHAR +STARTCHAR U+75EC +ENCODING 30188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +67FC +2404 +27FC +2404 +67FC +A200 +27FF +6489 +4D99 +D933 +0362 +000E +ENDCHAR +STARTCHAR U+75ED +ENCODING 30189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +57DF +3451 +1451 +37DF +5451 +1451 +17DF +1451 +2451 +4451 +0863 +0000 +0000 +ENDCHAR +STARTCHAR U+75EE +ENCODING 30190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +63FC +2200 +23F8 +2200 +63F8 +A200 +2FFE +6244 +4268 +C230 +0398 +0E0E +ENDCHAR +STARTCHAR U+75EF +ENCODING 30191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6040 +2FFF +2801 +29F9 +6108 +A108 +21F8 +6100 +41FC +C104 +0104 +01FC +ENDCHAR +STARTCHAR U+75F0 +ENCODING 30192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4848 +2A48 +2A50 +0CB0 +194C +2E48 +4A48 +1250 +14A0 +2310 +4C0C +0000 +ENDCHAR +STARTCHAR U+75F1 +ENCODING 30193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1120 +9124 +5F3E +5120 +1128 +3F3C +5120 +D124 +1F3E +2120 +2120 +4120 +0120 +ENDCHAR +STARTCHAR U+75F2 +ENCODING 30194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4910 +2910 +2FFC +0910 +1BB8 +2BB8 +4BB8 +13DC +155C +2990 +4110 +0000 +ENDCHAR +STARTCHAR U+75F3 +ENCODING 30195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4910 +2910 +2FFC +0910 +1BB8 +2BB8 +4B78 +1554 +1594 +2910 +4110 +0000 +ENDCHAR +STARTCHAR U+75F4 +ENCODING 30196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4A00 +2A00 +2BF8 +0D28 +1928 +2FE8 +4928 +1128 +12B8 +24A8 +4800 +0000 +ENDCHAR +STARTCHAR U+75F5 +ENCODING 30197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1002 +57FC +3020 +17FF +1124 +3222 +55FD +1008 +17FF +2020 +4020 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+75F6 +ENCODING 30198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +1050 +53FE +3252 +1252 +33FE +5252 +1252 +17FF +2088 +4104 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+75F7 +ENCODING 30199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1020 +57FF +3104 +1222 +35FD +5124 +11FC +1124 +11FC +1020 +2020 +403F +0000 +0000 +ENDCHAR +STARTCHAR U+75F8 +ENCODING 30200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +5281 +3281 +17F5 +3085 +57F5 +1085 +17F5 +1491 +2491 +4081 +0083 +0000 +0000 +ENDCHAR +STARTCHAR U+75F9 +ENCODING 30201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2000 +AFF8 +6888 +2FF8 +2888 +2FF8 +6000 +BFFE +2410 +2410 +4410 +8810 +1010 +ENDCHAR +STARTCHAR U+75FA +ENCODING 30202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4880 +2BF8 +2A48 +0BF8 +1A48 +2BF8 +48A0 +1120 +17FC +2020 +4020 +0000 +ENDCHAR +STARTCHAR U+75FB +ENCODING 30203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +57FE +3210 +13FF +3248 +5787 +1000 +13FE +1202 +13FE +2202 +43FE +0000 +0000 +ENDCHAR +STARTCHAR U+75FC +ENCODING 30204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +5000 +37F8 +3488 +17F8 +1488 +35E8 +5528 +15E8 +2408 +27F8 +4408 +0000 +ENDCHAR +STARTCHAR U+75FD +ENCODING 30205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +1110 +53FF +3610 +1210 +33FF +5210 +1210 +13FF +1210 +2210 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+75FE +ENCODING 30206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +5000 +37FC +3508 +16E8 +16A8 +35A8 +55E8 +15A8 +2608 +2408 +4418 +0000 +ENDCHAR +STARTCHAR U+75FF +ENCODING 30207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4BF0 +2840 +2FFC +09F0 +1E4C +28C0 +4FFC +1120 +13E0 +20D0 +4708 +0000 +ENDCHAR +STARTCHAR U+7600 +ENCODING 30208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1400 +9210 +5010 +5FE8 +1228 +33A4 +52C6 +D2B0 +1488 +24A0 +2A98 +5108 +0000 +ENDCHAR +STARTCHAR U+7601 +ENCODING 30209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4840 +2FFC +2910 +0910 +1B28 +2CC4 +4840 +1FFC +1040 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+7602 +ENCODING 30210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6000 +2FFE +2110 +2110 +6F1E +A802 +2802 +6F1E +4110 +C110 +1FFF +0000 +ENDCHAR +STARTCHAR U+7603 +ENCODING 30211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +9FFC +5080 +5308 +1C98 +3560 +5240 +DDE0 +1150 +224E +2C44 +4140 +0080 +ENDCHAR +STARTCHAR U+7604 +ENCODING 30212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6110 +2110 +2FFE +2110 +6110 +BFFF +2000 +67FC +4404 +C7FC +0404 +07FC +ENDCHAR +STARTCHAR U+7605 +ENCODING 30213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2410 +A220 +6FF8 +2888 +2FF8 +6888 +AFF8 +2080 +3FFE +4080 +4080 +8080 +0080 +ENDCHAR +STARTCHAR U+7607 +ENCODING 30215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2018 +A3F0 +6040 +2FFE +2040 +27FC +6444 +A7FC +2444 +67FC +4040 +C7FC +0040 +1FFF +ENDCHAR +STARTCHAR U+7608 +ENCODING 30216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A200 +63BE +2E12 +2392 +2E12 +63B2 +AE22 +226E +6080 +5FFF +C318 +060C +1C07 +ENDCHAR +STARTCHAR U+7609 +ENCODING 30217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4BC0 +2920 +2BF0 +0C0C +1FA8 +2EA8 +4DD0 +16D0 +15A8 +24A8 +45A8 +0000 +ENDCHAR +STARTCHAR U+760A +ENCODING 30218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1200 +92F8 +5408 +55FE +1C40 +34FC +5520 +D424 +17FE +2420 +2450 +448E +0704 +ENDCHAR +STARTCHAR U+760B +ENCODING 30219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5000 +37F0 +3470 +1790 +17F0 +36B0 +56B0 +17F0 +14AC +28FC +2F14 +5004 +0000 +ENDCHAR +STARTCHAR U+760C +ENCODING 30220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1100 +9FE4 +5104 +57D4 +1554 +3554 +57D4 +D114 +1394 +2554 +2944 +4114 +0108 +ENDCHAR +STARTCHAR U+760D +ENCODING 30221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4BF0 +2A10 +2BF0 +0A10 +1BF0 +2FFC +4A00 +0BF8 +1548 +1948 +2288 +4530 +0000 +ENDCHAR +STARTCHAR U+760F +ENCODING 30223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6048 +2048 +27F8 +2050 +6FFF +A080 +23FC +6E04 +5BFC +C204 +0204 +03FC +ENDCHAR +STARTCHAR U+7610 +ENCODING 30224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2280 +ACB8 +6888 +2888 +2EB8 +6888 +A888 +2FF8 +2888 +4140 +4220 +8C1E +3004 +ENDCHAR +STARTCHAR U+7611 +ENCODING 30225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +51FC +3104 +113C +3124 +57FF +1401 +14F9 +2489 +44F9 +0401 +0403 +0000 +0000 +ENDCHAR +STARTCHAR U+7612 +ENCODING 30226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2000 +AFFE +6802 +2842 +27FC +2040 +67FC +A444 +27FC +6444 +47FC +C040 +1FFF +0040 +ENDCHAR +STARTCHAR U+7613 +ENCODING 30227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A200 +63F0 +2610 +2C20 +3FFC +64A4 +A53C +2604 +6444 +5FFF +C110 +071C +1C07 +ENDCHAR +STARTCHAR U+7614 +ENCODING 30228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1000 +5104 +37FF +1104 +3020 +57FF +1020 +13FE +1202 +2202 +43FE +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+7615 +ENCODING 30229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1000 +97BC +5484 +5484 +17BC +3400 +57FC +D424 +1428 +2790 +2428 +4446 +0584 +ENDCHAR +STARTCHAR U+7616 +ENCODING 30230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6040 +2040 +2FFE +2208 +6110 +BFFF +2000 +67FC +4404 +C7FC +0404 +07FC +ENDCHAR +STARTCHAR U+7617 +ENCODING 30231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2080 +AFF8 +6490 +22A4 +3FFE +6220 +A490 +288E +37F4 +4080 +4088 +9FFC +0000 +ENDCHAR +STARTCHAR U+7618 +ENCODING 30232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1040 +9248 +5150 +57FC +1150 +364C +5080 +DFFE +1110 +2320 +20C0 +4130 +0608 +ENDCHAR +STARTCHAR U+7619 +ENCODING 30233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2000 +AFF8 +6490 +2220 +21C0 +6220 +BC9E +27F4 +2490 +47F0 +4088 +9FFC +0004 +ENDCHAR +STARTCHAR U+761A +ENCODING 30234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1000 +1448 +5288 +37CF +1111 +1105 +3544 +5544 +17C4 +2104 +420A +0431 +0000 +0000 +ENDCHAR +STARTCHAR U+761B +ENCODING 30235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1200 +9FFC +5224 +5FA4 +1224 +3FD4 +5288 +D100 +12C0 +2A54 +2A12 +51F2 +0000 +ENDCHAR +STARTCHAR U+761C +ENCODING 30236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A100 +67F8 +2408 +27F8 +2408 +67F8 +A408 +27F8 +6080 +4AC6 +CA4B +1B19 +31F0 +ENDCHAR +STARTCHAR U+761D +ENCODING 30237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6FFE +2912 +2912 +2FFE +6040 +A140 +2763 +6C56 +4158 +C74C +1C47 +0040 +ENDCHAR +STARTCHAR U+761E +ENCODING 30238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2040 +2040 +2FFE +2444 +2444 +2AEA +2AAA +21B0 +675C +5C47 +C3F8 +0040 +1FFF +ENDCHAR +STARTCHAR U+761F +ENCODING 30239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4800 +2BF0 +2A90 +0AD0 +1B30 +2BF0 +4800 +0BF8 +12A8 +12A8 +3FFC +4000 +0000 +ENDCHAR +STARTCHAR U+7620 +ENCODING 30240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4840 +2F5C +2840 +0FBC +1910 +2FFC +4910 +09F0 +1110 +11F0 +2110 +4130 +0000 +ENDCHAR +STARTCHAR U+7621 +ENCODING 30241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4840 +28A0 +29F0 +0FFC +1910 +29F0 +49F0 +0900 +13F8 +1308 +25F8 +4908 +0000 +ENDCHAR +STARTCHAR U+7622 +ENCODING 30242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5100 +3238 +37A8 +14A8 +16AC +35C4 +5FF8 +16A8 +16A8 +2690 +2AA8 +51C4 +0000 +ENDCHAR +STARTCHAR U+7623 +ENCODING 30243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A040 +6080 +27FC +2444 +27FC +6444 +A7FC +2120 +6128 +432A +C23E +0621 +1C1F +ENDCHAR +STARTCHAR U+7624 +ENCODING 30244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +0880 +4B78 +2B28 +2AA8 +0FD8 +1880 +2BF8 +4A48 +13F8 +1248 +23F8 +4208 +0000 +ENDCHAR +STARTCHAR U+7625 +ENCODING 30245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1120 +9FFC +5080 +57F8 +1080 +3FFE +5100 +D208 +17FC +2840 +3044 +47FE +0000 +ENDCHAR +STARTCHAR U+7626 +ENCODING 30246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0088 +3FFC +2280 +ACB8 +6888 +2EB8 +2888 +2FF8 +6080 +AFF0 +2220 +2140 +4080 +8360 +1C1C +ENDCHAR +STARTCHAR U+7627 +ENCODING 30247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4840 +2878 +2BFC +0A78 +1BC8 +2A38 +4AF8 +0A80 +17FC +1480 +28F8 +5080 +0000 +ENDCHAR +STARTCHAR U+7628 +ENCODING 30248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1020 +57FF +3020 +11FC +3104 +51F4 +11F4 +11F4 +1104 +27FF +4202 +0401 +0000 +0000 +ENDCHAR +STARTCHAR U+7629 +ENCODING 30249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +1FFE +9220 +5228 +5FFC +12A0 +3140 +5220 +D7F0 +180E +17F4 +2410 +2410 +47F0 +0410 +ENDCHAR +STARTCHAR U+762A +ENCODING 30250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +3FFE +2100 +A7F8 +6408 +27F8 +2408 +27F8 +6408 +A7F8 +2120 +2210 +266E +3B84 +4208 +81F8 +ENDCHAR +STARTCHAR U+762B +ENCODING 30251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0044 +1FFE +1020 +9028 +5F7E +5148 +19C8 +357E +5248 +9248 +157E +2548 +2848 +407E +0040 +ENDCHAR +STARTCHAR U+762D +ENCODING 30253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2000 +3FFC +A140 +6FF8 +2948 +2FF8 +6000 +AFF8 +2000 +3FFE +4490 +488C +9284 +0100 +ENDCHAR +STARTCHAR U+762F +ENCODING 30255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1220 +5220 +3FBF +1440 +1420 +37BE +54A8 +1488 +14FF +2894 +4122 +02C1 +0000 +0000 +ENDCHAR +STARTCHAR U+7630 +ENCODING 30256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4BF8 +2A48 +2BF8 +0A48 +1BF8 +2890 +4B30 +08C8 +1FFC +1158 +2644 +4040 +0000 +ENDCHAR +STARTCHAR U+7631 +ENCODING 30257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1FFF +1020 +57FF +3124 +12AA +3451 +518C +1603 +1000 +1144 +1522 +2504 +01FC +0000 +0000 +ENDCHAR +STARTCHAR U+7632 +ENCODING 30258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A244 +6244 +2644 +2CAA +3AAA +6200 +A610 +2490 +6C9C +5490 +C4D0 +04B8 +050F +ENDCHAR +STARTCHAR U+7633 +ENCODING 30259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFC +2000 +AF78 +6948 +2528 +25A8 +6948 +A670 +288E +3724 +2040 +4790 +4020 +80C0 +0F00 +ENDCHAR +STARTCHAR U+7634 +ENCODING 30260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4840 +2BF8 +28A0 +0FFC +19F0 +2910 +49F0 +0910 +11F0 +17FC +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+7635 +ENCODING 30261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2440 +2778 +A948 +7550 +2A20 +2418 +6BE6 +B000 +2FF8 +2080 +4490 +448C +8A84 +0100 +ENDCHAR +STARTCHAR U+7638 +ENCODING 30264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +1FFE +1200 +9FBC +52A4 +52A4 +12A4 +15BC +3844 +57FE +D444 +15B4 +2444 +24A4 +4514 +0408 +ENDCHAR +STARTCHAR U+7639 +ENCODING 30265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A210 +6710 +2D90 +38BF +2F21 +6261 +AF81 +221D +6A81 +4A81 +CA03 +0382 +0E0E +ENDCHAR +STARTCHAR U+763A +ENCODING 30266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2000 +AFFE +6802 +2FFE +2800 +2BFE +6820 +ABFE +2B32 +6AAA +5A22 +D332 +32AA +0226 +ENDCHAR +STARTCHAR U+763B +ENCODING 30267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4840 +2BF8 +2FFC +0BF8 +1840 +2BF8 +4BF8 +0840 +17FC +1190 +2070 +4788 +0000 +ENDCHAR +STARTCHAR U+763C +ENCODING 30268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2220 +BFFC +6220 +2FF8 +2808 +6FF8 +A808 +2FF8 +2080 +5FFE +4140 +8620 +181C +ENDCHAR +STARTCHAR U+763D +ENCODING 30269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1088 +17FF +5088 +30F8 +1020 +13FE +3222 +53FE +13FE +2020 +43FE +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+763E +ENCODING 30270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2040 +2E78 +AA90 +6AFC +2C04 +2AFC +6904 +A9FC +2D20 +2A10 +4944 +494A +8A4A +0838 +ENDCHAR +STARTCHAR U+763F +ENCODING 30271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2000 +2F78 +A948 +6B58 +2B58 +2630 +6948 +A100 +3FFE +2220 +4640 +41C0 +8230 +0C10 +ENDCHAR +STARTCHAR U+7640 +ENCODING 30272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2220 +AFF8 +6220 +3FFE +2088 +6FF8 +A888 +2FF8 +2888 +4FF8 +4220 +8418 +0808 +ENDCHAR +STARTCHAR U+7641 +ENCODING 30273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A240 +66FF +2D80 +387E +2242 +667E +AC42 +3C7E +6420 +447E +C5C4 +0438 +05E7 +ENDCHAR +STARTCHAR U+7642 +ENCODING 30274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +0840 +4FFC +2AA8 +2910 +0BF8 +1D14 +29F0 +4910 +11F0 +1248 +2444 +40C0 +0000 +ENDCHAR +STARTCHAR U+7643 +ENCODING 30275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2020 +2F3C +A968 +6A90 +2C28 +2AC6 +6938 +A950 +2D7C +2A90 +487C +4810 +89FE +0800 +ENDCHAR +STARTCHAR U+7644 +ENCODING 30276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A220 +6240 +27FE +2C40 +27FC +6440 +A7FC +2440 +67FF +4000 +C524 +0DB6 +1893 +ENDCHAR +STARTCHAR U+7645 +ENCODING 30277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6FFE +20A0 +27BC +24A4 +67BC +A0A0 +27FC +6444 +47FC +C444 +07FC +0000 +ENDCHAR +STARTCHAR U+7646 +ENCODING 30278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4954 +2DB4 +2D58 +0AA8 +1CC4 +2FFC +4C88 +0FF8 +1088 +1108 +2208 +4C30 +0000 +ENDCHAR +STARTCHAR U+7647 +ENCODING 30279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5000 +37F8 +34C8 +17F8 +14C8 +37F8 +55E8 +1528 +15E8 +2528 +25E8 +4538 +0000 +ENDCHAR +STARTCHAR U+7648 +ENCODING 30280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +49D0 +2CD4 +2B24 +0E18 +1F74 +2954 +4F9C +0CF8 +1748 +1130 +2130 +46CC +0000 +ENDCHAR +STARTCHAR U+7649 +ENCODING 30281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2000 +A7BC +64A4 +27BC +2000 +27FC +6444 +A7FC +2444 +67FC +4040 +DFFF +0040 +0040 +ENDCHAR +STARTCHAR U+764A +ENCODING 30282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6F18 +2924 +295A +2A81 +6A7C +A908 +297E +6B00 +48FF +C824 +084E +08F3 +ENDCHAR +STARTCHAR U+764B +ENCODING 30283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6FFE +20A0 +27BC +2404 +67BC +A0A0 +3FFF +6040 +4266 +CA23 +1B09 +31F8 +ENDCHAR +STARTCHAR U+764C +ENCODING 30284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +0800 +49F0 +2910 +29F0 +0FBC +1CA4 +2FBC +4C44 +1248 +1248 +23F8 +4208 +0000 +ENDCHAR +STARTCHAR U+764D +ENCODING 30285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2100 +2080 +BC1E +6BE8 +2848 +2948 +6948 +BD5C +2888 +2948 +4A28 +4E08 +B83E +0000 +ENDCHAR +STARTCHAR U+764E +ENCODING 30286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +1000 +179E +5492 +379E +1492 +179E +1402 +34F2 +5492 +14F2 +2492 +24F2 +4406 +ENDCHAR +STARTCHAR U+7650 +ENCODING 30288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1070 +5088 +3174 +1202 +17FF +32AA +53FE +11FC +1104 +21FC +4104 +01FC +0000 +0000 +ENDCHAR +STARTCHAR U+7652 +ENCODING 30290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +08C0 +4F30 +29FC +2BA8 +0AA8 +1BA8 +2BA8 +4A98 +10C0 +1528 +2514 +48F4 +0000 +ENDCHAR +STARTCHAR U+7653 +ENCODING 30291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +12AC +54AC +30FC +1107 +12FA +3602 +52A2 +12A2 +12AA +22B4 +432A +0211 +0000 +0000 +ENDCHAR +STARTCHAR U+7654 +ENCODING 30292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2080 +2FF8 +A220 +7FFE +2000 +2FF8 +6808 +AFF8 +2808 +2FF8 +4080 +4A44 +9214 +21F0 +ENDCHAR +STARTCHAR U+7655 +ENCODING 30293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A040 +6040 +2FFF +2224 +2428 +697F +AAC8 +247E +6948 +5F7E +C248 +047F +1800 +ENDCHAR +STARTCHAR U+7656 +ENCODING 30294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +0FFC +4810 +2B90 +2AFC +0AA8 +1BB0 +2A7C +4B90 +16FC +1690 +2B90 +4210 +0000 +ENDCHAR +STARTCHAR U+7657 +ENCODING 30295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1000 +57FF +3020 +17FF +1529 +3529 +5084 +13FE +1222 +23FE +4222 +03FE +0000 +0000 +ENDCHAR +STARTCHAR U+7658 +ENCODING 30296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4910 +2FFC +2BF8 +0A48 +1BF8 +2A48 +4BF8 +0FFC +1454 +147C +278C +440C +0000 +ENDCHAR +STARTCHAR U+7659 +ENCODING 30297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A000 +6300 +2E3C +2804 +2F3C +6804 +AFFC +2888 +6EE8 +4888 +CEED +0885 +1DE3 +ENDCHAR +STARTCHAR U+765A +ENCODING 30298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1100 +51F8 +3210 +17FE +14A8 +37FE +5400 +15FC +15FC +27FE +4A02 +03FE +0000 +0000 +ENDCHAR +STARTCHAR U+765C +ENCODING 30300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5000 +37F8 +3468 +17EC +16AC +37C4 +56B8 +16A8 +1FF0 +2A90 +3268 +4444 +0000 +ENDCHAR +STARTCHAR U+765E +ENCODING 30302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2220 +223C +AFA4 +6248 +2FBE +2AA2 +6AAA +AFAA +222A +272A +4AAA +5210 +8214 +0222 +ENDCHAR +STARTCHAR U+765F +ENCODING 30303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2100 +A3F8 +6208 +23F8 +2208 +23F8 +6208 +A7FC +3C07 +67FC +44A4 +C7FC +04A4 +04AC +ENDCHAR +STARTCHAR U+7660 +ENCODING 30304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1020 +57FF +3051 +13AE +12AA +352D +5202 +13FE +1202 +23FE +4202 +0402 +0000 +0000 +ENDCHAR +STARTCHAR U+7661 +ENCODING 30305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4A00 +2AFC +2B28 +0A90 +19FC +2A14 +4BD8 +0D5C +1FD0 +1370 +24D0 +488C +0000 +ENDCHAR +STARTCHAR U+7662 +ENCODING 30306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4910 +2FFC +2840 +0BF8 +1FFC +2950 +4BF8 +0D14 +11F0 +11F8 +2170 +4788 +0000 +ENDCHAR +STARTCHAR U+7663 +ENCODING 30307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2444 +A428 +6F7C +3210 +2F90 +6AFC +AF90 +2A94 +2FFE +4010 +4390 +9C10 +0810 +ENDCHAR +STARTCHAR U+7664 +ENCODING 30308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1210 +17FF +5A24 +3142 +17DF +1451 +17D1 +3451 +57D1 +1411 +14D1 +2717 +2450 +47D0 +ENDCHAR +STARTCHAR U+7665 +ENCODING 30309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +A488 +6EA8 +3AAF +23EA +241A +6DCA +B80E +2BE4 +6884 +4BE4 +C88E +0BEA +081B +ENDCHAR +STARTCHAR U+7667 +ENCODING 30311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5000 +37FC +37B8 +1510 +17FC +3598 +5774 +1440 +1578 +2940 +2FFC +5000 +0000 +ENDCHAR +STARTCHAR U+7668 +ENCODING 30312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0FFC +4BF8 +2840 +2FFC +0F58 +1B58 +2BF8 +4E20 +0BF8 +13F8 +1220 +23FC +4200 +0000 +ENDCHAR +STARTCHAR U+7669 +ENCODING 30313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5200 +3FF8 +3228 +1FD8 +1AF8 +3AC8 +5FF8 +1778 +16C8 +2AF8 +3228 +42C4 +0000 +ENDCHAR +STARTCHAR U+766A +ENCODING 30314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5120 +3EF8 +3270 +12FC +1FF8 +3248 +5778 +16F8 +1AC8 +3278 +2228 +42C4 +0000 +ENDCHAR +STARTCHAR U+766B +ENCODING 30315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2200 +BFFE +6210 +2FBE +28A2 +6FAA +A8AA +2FAA +28AA +2FAA +48AA +5FD0 +8514 +08A2 +ENDCHAR +STARTCHAR U+766C +ENCODING 30316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5248 +37A8 +3930 +1FFC +1A90 +3FB8 +5A90 +1FFC +1590 +2AD0 +2AD0 +5010 +0000 +ENDCHAR +STARTCHAR U+766D +ENCODING 30317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2000 +AFBE +68A2 +2FBE +28A2 +2FBE +68A2 +AFBE +2514 +68A2 +5FFF +C610 +01F0 +0F1C +ENDCHAR +STARTCHAR U+766E +ENCODING 30318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2006 +AF7C +694A +2991 +2A7E +2A10 +69FF +A902 +297F +6B02 +487E +C8AA +08A5 +091C +ENDCHAR +STARTCHAR U+766F +ENCODING 30319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2000 +2F78 +AD68 +6B58 +2F78 +2240 +67FC +AC40 +37F8 +2440 +47F8 +4440 +87FC +0400 +ENDCHAR +STARTCHAR U+7670 +ENCODING 30320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5568 +3AA8 +357C +17A8 +14E8 +37BC +5FA8 +1ABC +1FA8 +2828 +28BC +47A0 +0000 +ENDCHAR +STARTCHAR U+7671 +ENCODING 30321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2512 +BFD4 +653E +2028 +2FA8 +2AA8 +6FBE +A228 +2FA8 +623E +5FE8 +C528 +0DA8 +18BE +ENDCHAR +STARTCHAR U+7672 +ENCODING 30322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +5480 +377C +3490 +13B8 +1BA8 +3BB8 +5BA8 +1AB8 +1BA8 +2FF8 +2298 +4C64 +0000 +ENDCHAR +STARTCHAR U+7674 +ENCODING 30324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2848 +AAEA +6404 +2AE9 +3EBF +24E4 +760D +A5F5 +2040 +67FC +4040 +DFFF +0040 +01C0 +ENDCHAR +STARTCHAR U+7675 +ENCODING 30325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +1FFF +1222 +1575 +5E7E +3474 +1979 +3F5F +5575 +1020 +13FE +2252 +02AA +0256 +0000 +0000 +ENDCHAR +STARTCHAR U+7676 +ENCODING 30326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0F20 +0120 +22C8 +1288 +0C50 +0820 +1010 +600C +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+7678 +ENCODING 30328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1E90 +0290 +2464 +1444 +0828 +1FF0 +2108 +4104 +3FF8 +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+7679 +ENCODING 30329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F44 +2228 +1411 +080A +13E4 +6223 +0C38 +0000 +07F0 +0220 +0140 +0080 +0140 +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+767A +ENCODING 30330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1E90 +0290 +2464 +1444 +0828 +1FF0 +2248 +4244 +3FF8 +0240 +0440 +0444 +1844 +603C +0000 +ENDCHAR +STARTCHAR U+767B +ENCODING 30331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E90 +0290 +2464 +1444 +0828 +1FF0 +2008 +4FE4 +0820 +0FE0 +0440 +0480 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+767C +ENCODING 30332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1E90 +0294 +2464 +1828 +1CF8 +64A4 +04A8 +3D18 +23F0 +3C90 +24A0 +0440 +08B0 +330C +0000 +ENDCHAR +STARTCHAR U+767D +ENCODING 30333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0200 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+767E +ENCODING 30334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0200 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+767F +ENCODING 30335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1020 +2120 +7FA0 +2120 +2120 +2120 +3F20 +2120 +2120 +2121 +2121 +3F21 +211F +0000 +0000 +ENDCHAR +STARTCHAR U+7680 +ENCODING 30336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +3FF8 +2008 +3FF8 +2008 +3FF8 +2008 +1030 +11C0 +1E00 +1008 +1008 +0FF8 +0000 +ENDCHAR +STARTCHAR U+7681 +ENCODING 30337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0100 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +1FF8 +0100 +0100 +FFFF +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+7682 +ENCODING 30338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0410 +1FF8 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +0104 +01FE +FF00 +0100 +0104 +0104 +00FC +ENDCHAR +STARTCHAR U+7683 +ENCODING 30339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +3FF8 +2008 +3FF8 +2008 +3FF8 +2488 +0480 +0480 +0880 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+7684 +ENCODING 30340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +2080 +7CF8 +4508 +4508 +4688 +7C48 +4448 +4408 +4408 +7C08 +4008 +0030 +0000 +ENDCHAR +STARTCHAR U+7685 +ENCODING 30341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +33FE +2222 +FA22 +8A22 +8A22 +8A22 +8BFE +FA00 +8A00 +8A00 +8A00 +8A01 +FB03 +01FE +0000 +ENDCHAR +STARTCHAR U+7686 +ENCODING 30342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1098 +1FE0 +1084 +1084 +1D7C +6200 +0FE0 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7687 +ENCODING 30343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +1FF0 +1010 +1FF0 +1010 +1FF0 +0000 +3FF8 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7688 +ENCODING 30344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +2100 +7900 +49F8 +4988 +7988 +4950 +4950 +4A20 +7A20 +4450 +0988 +1604 +0000 +ENDCHAR +STARTCHAR U+7689 +ENCODING 30345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +1048 +2048 +7C48 +457F +4548 +4548 +7D48 +4548 +4548 +4549 +7D49 +4549 +07DF +0000 +0000 +ENDCHAR +STARTCHAR U+768A +ENCODING 30346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2028 +4044 +7C82 +4539 +4400 +7C00 +44FE +4402 +4404 +7C48 +4430 +0010 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+768B +ENCODING 30347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +1010 +1FF0 +1010 +1FF0 +0100 +7FFC +0280 +0540 +1930 +6FEC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+768C +ENCODING 30348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1020 +3020 +27FF +F820 +8820 +8820 +8BFE +F8A8 +88A8 +88A8 +89AC +8924 +FB26 +0623 +0020 +ENDCHAR +STARTCHAR U+768D +ENCODING 30349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0200 +1FF8 +1008 +1FF8 +1008 +1FF8 +0000 +207E +2042 +3F42 +2042 +2042 +3F4E +E040 +0040 +ENDCHAR +STARTCHAR U+768E +ENCODING 30350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +27FC +7910 +4908 +4A14 +7D14 +4910 +48A0 +48A0 +7840 +48A0 +0318 +0C04 +0000 +ENDCHAR +STARTCHAR U+768F +ENCODING 30351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +2044 +4028 +7CFE +4444 +4444 +7C44 +45FF +4444 +4444 +7C44 +4484 +0104 +0204 +0000 +0000 +ENDCHAR +STARTCHAR U+7690 +ENCODING 30352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0400 +0FE0 +0820 +0FE0 +0820 +0FE0 +1D70 +0100 +1D70 +0100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7691 +ENCODING 30353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +2524 +7F24 +45FC +4400 +45FC +7C04 +4404 +45FC +4504 +4500 +7D02 +4502 +00FE +0000 +ENDCHAR +STARTCHAR U+7692 +ENCODING 30354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01E6 +1045 +2044 +4044 +7DFF +4444 +4464 +7C44 +44C5 +4546 +4444 +7C4D +4553 +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+7693 +ENCODING 30355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1140 +2140 +79F8 +4A40 +4C40 +7FFC +4800 +49F0 +4910 +7910 +4910 +01F0 +0110 +0000 +ENDCHAR +STARTCHAR U+7695 +ENCODING 30357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFF +0808 +1818 +1010 +7E7E +4242 +4242 +4242 +4242 +7E7E +4242 +4242 +4242 +4242 +7E7E +ENDCHAR +STARTCHAR U+7696 +ENCODING 30358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +23FC +7A08 +4DF0 +4800 +7800 +4FFC +48A0 +78A0 +48A0 +0124 +0624 +181C +0000 +ENDCHAR +STARTCHAR U+7699 +ENCODING 30361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08E0 +7E80 +1CFC +1A90 +2890 +4A90 +0D10 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+769A +ENCODING 30362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +2248 +7BF8 +4800 +4FFC +7800 +4BF8 +4A08 +4BF8 +7910 +48A0 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+769B +ENCODING 30363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0200 +0FF0 +0810 +0FF0 +0810 +0FF0 +0000 +0808 +1010 +7E7E +4242 +7E7E +4242 +7E7E +0000 +ENDCHAR +STARTCHAR U+769C +ENCODING 30364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +23FF +F800 +88FC +8884 +88FC +8800 +FBFF +8A01 +8A79 +8A49 +8A49 +FA79 +0201 +0207 +ENDCHAR +STARTCHAR U+769D +ENCODING 30365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2092 +7CD6 +4454 +7C54 +4410 +4410 +7DFF +0048 +FE48 +1048 +FE48 +10C8 +1E89 +F189 +0307 +ENDCHAR +STARTCHAR U+769E +ENCODING 30366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +13FE +2602 +43FE +7A02 +4BFE +4820 +7820 +4FFF +4924 +7A22 +4DFD +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+769F +ENCODING 30367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +19FF +1010 +7CFE +4410 +45FF +4400 +44FE +7C82 +44FE +4482 +44FE +4482 +7CFE +0044 +0183 +ENDCHAR +STARTCHAR U+76A0 +ENCODING 30368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3111 +2111 +F9FF +8888 +8890 +89FF +8910 +FB10 +8DFE +8910 +8910 +89FE +F910 +0110 +01FF +ENDCHAR +STARTCHAR U+76A2 +ENCODING 30370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +31FC +2020 +FBFE +8800 +8904 +8BDF +8904 +F9C4 +8B1F +8800 +8BFF +8888 +F889 +0189 +0707 +ENDCHAR +STARTCHAR U+76A3 +ENCODING 30371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +6088 +47FF +F088 +93FE +9124 +9124 +97FF +F124 +9124 +93FE +9020 +97FF +F020 +0020 +0020 +ENDCHAR +STARTCHAR U+76A4 +ENCODING 30372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1038 +17C0 +2048 +7A54 +4FFE +48E0 +4950 +4A48 +7FFE +4A48 +4A48 +4BF8 +4A48 +7A48 +4BF8 +0208 +ENDCHAR +STARTCHAR U+76A5 +ENCODING 30373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3040 +21FC +F904 +89FC +8904 +89FC +8904 +F9FC +8820 +8BAE +8820 +8BAE +F820 +07FF +0020 +ENDCHAR +STARTCHAR U+76A6 +ENCODING 30374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +6208 +47C8 +F45F +97D2 +9472 +97D2 +911A +F10A +9FEE +9204 +93C4 +924E +F64A +045B +0CD1 +ENDCHAR +STARTCHAR U+76A7 +ENCODING 30375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200E +67F8 +4242 +F124 +97FF +9421 +9292 +9285 +F47C +9080 +91FC +9304 +9698 +F070 +01DC +0707 +ENDCHAR +STARTCHAR U+76A8 +ENCODING 30376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0FF0 +0810 +0FF0 +0810 +0FF0 +1008 +7E7E +4242 +7E7E +4242 +7E7E +0100 +3FFC +0100 +FFFF +ENDCHAR +STARTCHAR U+76AA +ENCODING 30378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +6646 +4474 +F555 +9252 +9272 +9454 +9555 +F777 +9020 +97FF +90A8 +91AC +F326 +0623 +0020 +ENDCHAR +STARTCHAR U+76AB +ENCODING 30379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +13FF +2200 +4248 +7BFF +4A49 +4BFF +4B08 +7BCE +4B28 +4DEF +4800 +7A49 +0249 +0000 +0000 +ENDCHAR +STARTCHAR U+76AD +ENCODING 30381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200E +67F8 +4242 +F124 +97FE +9492 +97FE +9000 +F7C2 +945F +97C2 +9452 +97DA +F48A +07C2 +0C4E +ENDCHAR +STARTCHAR U+76AE +ENCODING 30382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1088 +1090 +1080 +1FF0 +1210 +1120 +1120 +10C0 +20C0 +2330 +4C0C +0000 +ENDCHAR +STARTCHAR U+76AF +ENCODING 30383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +3FBE +2488 +2508 +2408 +2F7F +2908 +2908 +2608 +4608 +0908 +1088 +2048 +0000 +0000 +ENDCHAR +STARTCHAR U+76B0 +ENCODING 30384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +3F40 +2AFC +2C84 +29F4 +3E94 +3294 +2AF4 +2498 +2480 +2A84 +3284 +407C +0000 +ENDCHAR +STARTCHAR U+76B1 +ENCODING 30385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1E10 +22FE +C492 +0894 +7E90 +02FC +0284 +7EC4 +02A8 +02A8 +7F10 +0128 +024E +0084 +ENDCHAR +STARTCHAR U+76B2 +ENCODING 30386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7F20 +5220 +91FE +7D22 +1124 +2920 +29FC +7D88 +0950 +0920 +FD50 +0A50 +0A88 +0D0E +0A04 +ENDCHAR +STARTCHAR U+76B4 +ENCODING 30388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0C20 +12FC +7DA8 +14B0 +15A0 +2BF8 +48C8 +1EA8 +32B0 +4C90 +0D30 +1348 +6284 +0000 +ENDCHAR +STARTCHAR U+76B5 +ENCODING 30389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +1204 +3F3F +1225 +1225 +7FA4 +003F +3F21 +2121 +2131 +3F2A +2144 +210A +3F11 +0000 +0000 +ENDCHAR +STARTCHAR U+76B7 +ENCODING 30391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F20 +08FC +3EA8 +00A0 +3EF8 +22C8 +3ED0 +24B0 +1520 +1F50 +1A88 +6504 +0000 +ENDCHAR +STARTCHAR U+76B8 +ENCODING 30392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +2AFC +7FA8 +08B0 +3EA0 +2AF8 +3EC8 +2AA8 +3EB0 +0890 +7F30 +0948 +0A84 +0000 +ENDCHAR +STARTCHAR U+76B9 +ENCODING 30393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08FC +3FA8 +2BFC +2C20 +28F8 +3EA8 +32F8 +2AA8 +24F8 +2420 +2BFC +3220 +4020 +0000 +ENDCHAR +STARTCHAR U+76BA +ENCODING 30394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1E20 +2AFC +6EA8 +3EB0 +2AA0 +14F8 +1EC8 +2AA8 +6EB0 +3E90 +2AB0 +12C8 +2504 +0000 +ENDCHAR +STARTCHAR U+76BB +ENCODING 30395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +0784 +3FDF +2455 +3F55 +2414 +2714 +2F9F +2891 +2F91 +28AA +4F84 +088A +3FD1 +0000 +0000 +ENDCHAR +STARTCHAR U+76BD +ENCODING 30397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +FE08 +0008 +FEFF +8289 +BA8A +AA88 +BAFE +82A2 +FEB6 +4494 +7C9C +4488 +7C9C +4536 +FE63 +ENDCHAR +STARTCHAR U+76BE +ENCODING 30398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +7FC4 +0404 +3F9F +7FD5 +4A54 +7FD4 +001F +3F91 +2099 +3E9A +3EA4 +3F8A +60D1 +0000 +0000 +ENDCHAR +STARTCHAR U+76BF +ENCODING 30399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +1FF0 +1290 +1290 +1290 +1290 +1290 +1290 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76C1 +ENCODING 30401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FF0 +0210 +021E +0602 +0C02 +1802 +3006 +E01C +0000 +3FFC +2444 +2444 +2444 +FFFF +0000 +ENDCHAR +STARTCHAR U+76C2 +ENCODING 30402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +0100 +7FFC +0100 +0100 +0300 +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76C3 +ENCODING 30403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0080 +03C0 +0D30 +7108 +0104 +1FF0 +1290 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76C4 +ENCODING 30404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +0084 +3FFC +2080 +3FFF +0081 +0081 +0082 +1FFC +1224 +1224 +1224 +1224 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+76C5 +ENCODING 30405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +3FFC +2108 +2108 +2108 +3FF8 +2108 +0100 +0108 +3FFC +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+76C6 +ENCODING 30406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +0840 +0820 +1FF0 +2128 +4224 +0C20 +30C0 +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76C8 +ENCODING 30408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FC0 +0440 +0440 +0FF8 +0C88 +1308 +2288 +4C70 +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76C9 +ENCODING 30409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +00F8 +3F80 +0100 +FFFF +0520 +0D30 +391C +E107 +0000 +3FFC +2444 +2444 +2444 +FFFF +0000 +ENDCHAR +STARTCHAR U+76CA +ENCODING 30410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +7FFC +0820 +0820 +1010 +1FF0 +2AA8 +4AA4 +0AA0 +0AA0 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76CB +ENCODING 30411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0210 +FFFF +0400 +0708 +0DD8 +1870 +31DC +E707 +0000 +3FFC +2444 +2444 +2444 +FFFF +0000 +ENDCHAR +STARTCHAR U+76CC +ENCODING 30412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1F7E +3142 +2342 +724E +D640 +0C41 +1863 +303E +E000 +3FFC +2444 +2444 +2444 +FFFF +0000 +ENDCHAR +STARTCHAR U+76CD +ENCODING 30413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0100 +7FFC +0240 +0470 +3F88 +0000 +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76CE +ENCODING 30414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +3FFC +2108 +2108 +FFFE +0280 +0C60 +301E +C004 +3FF8 +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+76CF +ENCODING 30415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +0220 +03F8 +7E00 +03FC +7E20 +0140 +0182 +0E62 +701E +3FF8 +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+76D0 +ENCODING 30416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0840 +7F50 +0848 +0844 +0F44 +7840 +0008 +3FFC +2448 +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+76D1 +ENCODING 30417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0440 +2448 +247C +24A0 +2518 +2408 +2400 +0408 +3FFC +2448 +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+76D2 +ENCODING 30418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1FF0 +600C +0FE0 +0820 +0FE0 +0000 +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76D3 +ENCODING 30419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +41FE +3010 +1010 +43FF +2010 +0810 +1050 +2020 +0000 +1FFC +1224 +1224 +1224 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+76D4 +ENCODING 30420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0204 +FFFE +0480 +0490 +0AA0 +0940 +1120 +221C +4408 +3FF8 +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+76D6 +ENCODING 30422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0000 +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76D7 +ENCODING 30423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2100 +11FC +0248 +0A50 +14A0 +2110 +220C +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76D8 +ENCODING 30424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +1FF8 +1010 +1210 +1114 +FFFE +1010 +1210 +2150 +4020 +3FF8 +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+76D9 +ENCODING 30425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0108 +FFFF +0100 +3FFC +2104 +3FFC +2104 +3FFC +2104 +211C +0000 +3FFC +2444 +2444 +FFFF +ENDCHAR +STARTCHAR U+76DA +ENCODING 30426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +0082 +7FFF +0082 +3EBC +01C0 +02A0 +3C9E +0380 +0000 +1FFC +1224 +1224 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+76DB +ENCODING 30427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0088 +1FFC +1090 +1E90 +1260 +2264 +4C9C +1FF4 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76DC +ENCODING 30428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0900 +41FC +2148 +0A50 +1460 +2090 +210C +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76DD +ENCODING 30429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +01F0 +0220 +0540 +0080 +7FFF +0490 +02A0 +0490 +398E +1FFC +1224 +1224 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+76DE +ENCODING 30430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +7FFC +0160 +01C4 +1EB4 +02EC +7F20 +01C4 +1E34 +1FFC +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76DF +ENCODING 30431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +0218 +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76E0 +ENCODING 30432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF8 +0008 +1FF8 +0008 +FFFF +0240 +0D46 +312C +06B0 +7898 +038C +FC87 +0100 +3FFC +2444 +FFFF +ENDCHAR +STARTCHAR U+76E1 +ENCODING 30433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0110 +7FFC +1FF0 +0100 +7FFC +1490 +2248 +5FF4 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76E3 +ENCODING 30435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3F40 +2440 +3EFC +2280 +3F00 +2478 +3F00 +2000 +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76E4 +ENCODING 30436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +3E70 +3254 +2A8C +7FF8 +2A50 +2A70 +478C +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76E5 +ENCODING 30437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +3178 +2748 +3BB8 +2388 +3D78 +2928 +2308 +1FF0 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76E6 +ENCODING 30438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03C0 +1E78 +F18F +0FF0 +0020 +7FFE +0240 +1FF8 +1248 +1C78 +1008 +1FF8 +1008 +7FFE +4422 +FFFF +ENDCHAR +STARTCHAR U+76E7 +ENCODING 30439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F0 +1FFC +11E8 +1F10 +10F0 +17F0 +1490 +17F0 +1490 +17F0 +2FF8 +2948 +5FFC +0000 +ENDCHAR +STARTCHAR U+76E8 +ENCODING 30440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFF +3820 +E1FE +0902 +19FE +3102 +E5FE +0D02 +19FE +3084 +E303 +0000 +3FFC +2444 +2444 +FFFF +ENDCHAR +STARTCHAR U+76E9 +ENCODING 30441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +3E20 +087F +7F04 +2224 +1424 +7F24 +0818 +3E18 +0826 +1FF8 +1248 +1248 +7FFE +0000 +0000 +ENDCHAR +STARTCHAR U+76EA +ENCODING 30442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11F0 +0910 +41F0 +21F0 +0FFC +1100 +13FC +24A4 +2158 +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+76EC +ENCODING 30444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FCFE +9190 +9010 +FDFF +8410 +8410 +FCFE +9082 +9082 +FCFE +0000 +3FFC +2444 +2444 +FFFF +ENDCHAR +STARTCHAR U+76ED +ENCODING 30445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2440 +7840 +117F +3F40 +0882 +3E22 +7F14 +1408 +3E14 +7F22 +0841 +1FFC +1224 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+76EE +ENCODING 30446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+76EF +ENCODING 30447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7804 +4FFE +4820 +4820 +7820 +4820 +4820 +4820 +7820 +4820 +4820 +4820 +7820 +48A0 +0040 +ENDCHAR +STARTCHAR U+76F0 +ENCODING 30448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4820 +4820 +4820 +7820 +4820 +4FFF +4820 +7820 +4820 +4820 +4820 +7820 +0020 +0020 +ENDCHAR +STARTCHAR U+76F1 +ENCODING 30449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +05FC +7E20 +4420 +4420 +7C20 +4424 +47FE +7C20 +4420 +4420 +4420 +7C20 +4420 +00A0 +0040 +ENDCHAR +STARTCHAR U+76F2 +ENCODING 30450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0800 +07F0 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+76F3 +ENCODING 30451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +7C10 +45FF +4440 +7C40 +4440 +4440 +7C40 +4440 +4440 +7C40 +447F +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+76F4 +ENCODING 30452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +7FFC +0080 +27F0 +2410 +27F0 +2410 +27F0 +2410 +27F0 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+76F5 +ENCODING 30453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C80 +457F +4400 +7C00 +447C +4404 +7C08 +4410 +4420 +4440 +7C81 +4501 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+76F6 +ENCODING 30454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FE +4800 +4800 +4800 +7800 +4BFF +4848 +4848 +7848 +4848 +4848 +48C8 +7889 +0189 +0307 +ENDCHAR +STARTCHAR U+76F7 +ENCODING 30455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7900 +49FF +4A01 +7801 +48F1 +4801 +7801 +49F9 +4801 +4801 +7801 +4802 +001C +0000 +0000 +ENDCHAR +STARTCHAR U+76F8 +ENCODING 30456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +7F08 +0908 +19F8 +1D08 +1B08 +2BF8 +2908 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+76F9 +ENCODING 30457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7844 +4FFE +4840 +7A48 +4A48 +4A48 +7A48 +4A48 +4BF8 +4848 +7842 +4842 +003E +0000 +ENDCHAR +STARTCHAR U+76FA +ENCODING 30458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7CFE +4440 +4440 +7C7F +4444 +4444 +7C44 +4444 +4484 +7D04 +4404 +0004 +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+76FB +ENCODING 30459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01E0 +7920 +4A10 +4C08 +7BF4 +4880 +48F0 +7910 +4910 +4810 +7810 +4810 +0060 +0000 +ENDCHAR +STARTCHAR U+76FC +ENCODING 30460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +08A0 +7CA0 +4910 +4910 +7A08 +4A0E +4DF4 +4890 +7890 +4890 +4890 +4910 +7910 +4250 +0420 +ENDCHAR +STARTCHAR U+76FE +ENCODING 30462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +00E0 +1F80 +1080 +1FFC +1080 +17F0 +1410 +17F0 +1410 +27F0 +2410 +47F0 +0410 +0000 +ENDCHAR +STARTCHAR U+7700 +ENCODING 30464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFE +4482 +4482 +4482 +7CFE +4482 +4482 +4482 +7CFE +4482 +4482 +4582 +7D02 +0302 +0E0E +ENDCHAR +STARTCHAR U+7701 +ENCODING 30465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0920 +1118 +6324 +00C0 +0700 +7FF0 +0810 +0FF0 +0810 +0FF0 +0810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+7703 +ENCODING 30467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +79FE +4800 +4800 +7802 +4BFF +4810 +7810 +4820 +4840 +4884 +7902 +4BFF +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+7704 +ENCODING 30468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7840 +4A40 +4A78 +7A48 +4A48 +4A48 +7BF8 +4A08 +4A08 +7808 +4808 +0030 +0000 +ENDCHAR +STARTCHAR U+7705 +ENCODING 30469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +79FE +4900 +4900 +797E +4942 +4942 +7924 +4918 +4918 +4A24 +7C42 +4881 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+7706 +ENCODING 30470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4820 +4BFF +4840 +7840 +4840 +487E +4842 +7842 +4842 +48C2 +4886 +7884 +0184 +031C +ENDCHAR +STARTCHAR U+7707 +ENCODING 30471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4950 +4948 +7944 +4A4C +4A48 +7C50 +48D0 +4820 +7840 +4980 +0E00 +0000 +ENDCHAR +STARTCHAR U+7708 +ENCODING 30472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4BFC +4A48 +7A40 +4860 +4860 +78A0 +48A0 +4920 +7A24 +4C24 +081C +0000 +ENDCHAR +STARTCHAR U+7709 +ENCODING 30473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1108 +1108 +1FF8 +1008 +17F0 +1410 +17F0 +1410 +27F0 +2410 +47F0 +0410 +0000 +ENDCHAR +STARTCHAR U+770A +ENCODING 30474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +781C +49F0 +4820 +4820 +79FE +4820 +4820 +4820 +7BFF +4820 +4820 +4820 +7821 +0033 +001E +ENDCHAR +STARTCHAR U+770B +ENCODING 30475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0200 +3FF8 +0200 +7FFC +0400 +07F0 +0C10 +0FF0 +1410 +27F0 +4410 +07F0 +0000 +ENDCHAR +STARTCHAR U+770C +ENCODING 30476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F0 +2410 +27F0 +2410 +27F0 +2410 +27F0 +2000 +3FFC +2560 +1918 +6104 +0100 +0000 +ENDCHAR +STARTCHAR U+770D +ENCODING 30477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +01FE +7D00 +4504 +4584 +7D48 +4528 +4510 +7D28 +4528 +4544 +4584 +7D00 +4504 +01FE +0000 +ENDCHAR +STARTCHAR U+770E +ENCODING 30478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +78FC +4800 +4800 +4800 +7800 +4BFF +4820 +4820 +7924 +4924 +4B26 +4A23 +7820 +0020 +00E0 +ENDCHAR +STARTCHAR U+7710 +ENCODING 30480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +01FF +7C10 +4410 +4410 +7C10 +449F +4490 +7C90 +4490 +4490 +7C90 +4490 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+7711 +ENCODING 30481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0048 +789F +4909 +4A29 +7FC9 +4889 +4909 +7A49 +4FC9 +4849 +7811 +4802 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+7712 +ENCODING 30482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4BFE +4A22 +4A22 +7A22 +4BFE +4A22 +4A22 +7A22 +4A22 +4BFE +4820 +7820 +0020 +0020 +ENDCHAR +STARTCHAR U+7713 +ENCODING 30483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0014 +7C12 +4410 +45FF +7D10 +4510 +4511 +7D12 +4514 +4509 +7D55 +45A3 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+7714 +ENCODING 30484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +7FFE +0100 +2104 +310C +1918 +01B0 +05C0 +0D60 +1930 +711C +C107 +0700 +ENDCHAR +STARTCHAR U+7715 +ENCODING 30485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7870 +48D8 +498C +7B06 +4E23 +4860 +48C4 +7B8C +4818 +4871 +4BC3 +7806 +001C +0070 +03C0 +ENDCHAR +STARTCHAR U+7717 +ENCODING 30487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7880 +4880 +49FE +4902 +7B02 +48F2 +4892 +4892 +7892 +4892 +48F2 +4802 +7802 +0006 +001C +ENDCHAR +STARTCHAR U+7719 +ENCODING 30489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0420 +7E40 +4440 +4488 +7D04 +47FE +4402 +7C04 +45FE +4504 +4504 +7D04 +4504 +01FC +0104 +ENDCHAR +STARTCHAR U+771A +ENCODING 30490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1110 +1FF8 +2100 +5FF0 +0104 +FFFE +0010 +1FF8 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+771B +ENCODING 30491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4BF8 +4840 +7840 +4FFC +48E0 +78E0 +4950 +4A48 +7C44 +4840 +0040 +0000 +ENDCHAR +STARTCHAR U+771C +ENCODING 30492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4820 +4FFF +4820 +7820 +4820 +4BFE +48A8 +78A8 +48A8 +49AC +4924 +7B26 +0623 +0020 +ENDCHAR +STARTCHAR U+771D +ENCODING 30493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0010 +7DFF +4501 +4501 +7C00 +45FF +4410 +7C10 +4410 +4410 +7C10 +4450 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+771E +ENCODING 30494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1030 +11C0 +1E08 +0FF8 +27F0 +2410 +27F0 +2410 +27F0 +2410 +27F0 +3FFC +0C30 +700C +0000 +ENDCHAR +STARTCHAR U+771F +ENCODING 30495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+7720 +ENCODING 30496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +79F8 +4908 +4908 +79F8 +4920 +4920 +79FC +4920 +4920 +7910 +4954 +418C +0604 +0000 +ENDCHAR +STARTCHAR U+7722 +ENCODING 30498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1EFC +1288 +3288 +4AA8 +0490 +0882 +307E +DFF0 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+7723 +ENCODING 30499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0090 +7CFE +4510 +4410 +7C10 +45FF +4410 +7C10 +4410 +4428 +4444 +7C82 +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+7724 +ENCODING 30500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +7A08 +4A08 +4BF8 +7A88 +4A80 +4A88 +7AB0 +4AC0 +4A80 +7C84 +4C84 +087C +0000 +ENDCHAR +STARTCHAR U+7725 +ENCODING 30501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1448 +1770 +1444 +1744 +783C +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7726 +ENCODING 30502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +0090 +7890 +4A90 +4A94 +7AF8 +4A90 +4A90 +7A90 +4A90 +4AB0 +7AD4 +4B14 +0C0C +0000 +ENDCHAR +STARTCHAR U+7727 +ENCODING 30503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +7C21 +4421 +4421 +7C41 +448E +4400 +7DFF +4501 +4501 +7D01 +4501 +01FF +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+7728 +ENCODING 30504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080C +7C30 +4BC0 +4880 +4840 +7840 +4BF8 +4810 +4820 +7840 +4880 +4900 +4E00 +7D06 +48FC +0000 +ENDCHAR +STARTCHAR U+7729 +ENCODING 30505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +7840 +4FFC +4840 +7A50 +4990 +48A0 +7860 +4860 +4890 +7938 +4FC4 +0004 +0000 +ENDCHAR +STARTCHAR U+772D +ENCODING 30509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0028 +7DFC +4420 +4420 +7C24 +47FE +4420 +7C20 +4428 +45FC +4420 +7C20 +4424 +03FE +0000 +ENDCHAR +STARTCHAR U+772E +ENCODING 30510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FE +4902 +4902 +497A +7902 +4902 +497A +494A +794A +494A +497A +4902 +7902 +0102 +0106 +ENDCHAR +STARTCHAR U+772F +ENCODING 30511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C40 +4A44 +494C +4950 +7844 +4FFE +4840 +78E0 +48E0 +4950 +4948 +7A4E +4444 +0040 +0040 +ENDCHAR +STARTCHAR U+7731 +ENCODING 30513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BFE +4820 +4BFE +7822 +4BFE +4A20 +7BFF +4821 +4825 +4852 +7888 +4904 +0603 +0000 +0000 +ENDCHAR +STARTCHAR U+7732 +ENCODING 30514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7BFE +4884 +4884 +78FC +4884 +4884 +78FC +4884 +4884 +7BFF +4804 +0004 +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+7733 +ENCODING 30515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +787F +4882 +4984 +7A48 +4830 +4820 +7840 +48FF +4981 +7A81 +4881 +00FF +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+7734 +ENCODING 30516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7900 +49FE +4B02 +7A02 +4FF2 +4912 +4912 +79F2 +4912 +4912 +4912 +79F2 +0006 +0004 +001C +ENDCHAR +STARTCHAR U+7735 +ENCODING 30517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0440 +7EFC +4508 +4690 +7C60 +4440 +44A0 +7F3E +4442 +4484 +4544 +7C28 +4410 +0060 +0380 +ENDCHAR +STARTCHAR U+7736 +ENCODING 30518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0BFC +7E00 +4AF8 +4A20 +4A20 +7A20 +4AF8 +4A20 +7A20 +4A20 +4A28 +4BFC +7A00 +4BFE +0000 +ENDCHAR +STARTCHAR U+7737 +ENCODING 30519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0920 +0FF0 +1290 +7FFC +0820 +1FF0 +682C +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7738 +ENCODING 30520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0060 +7890 +4FE8 +4948 +7940 +4BF8 +4C40 +7840 +4FFC +4840 +7840 +4840 +0040 +0000 +ENDCHAR +STARTCHAR U+7739 +ENCODING 30521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0202 +7B06 +498C +4888 +4BFE +7820 +4820 +4820 +4FFF +7850 +4850 +48D8 +4888 +798C +0306 +0603 +ENDCHAR +STARTCHAR U+773A +ENCODING 30522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +78A0 +48A8 +4AA8 +79B0 +49A0 +48B0 +79A8 +4EA4 +48A4 +7920 +4924 +4224 +041C +0000 +ENDCHAR +STARTCHAR U+773B +ENCODING 30523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +7C44 +45FF +4410 +7C10 +45FF +4410 +7C10 +45FF +4410 +7C10 +4410 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+773C +ENCODING 30524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +79F0 +4910 +4910 +79F0 +4910 +4910 +79F8 +4948 +4950 +7920 +4950 +4188 +0604 +0000 +ENDCHAR +STARTCHAR U+773D +ENCODING 30525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +7838 +49E0 +4906 +493C +7920 +4922 +4926 +492C +7930 +4928 +4928 +492C +7924 +0226 +0023 +ENDCHAR +STARTCHAR U+773E +ENCODING 30526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +2444 +2444 +3FFC +0040 +10C8 +1188 +1708 +1108 +391C +2914 +6D36 +C563 +0100 +0100 +ENDCHAR +STARTCHAR U+7740 +ENCODING 30528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0FF0 +0C10 +17F0 +1410 +27F0 +4410 +07F0 +0410 +0000 +ENDCHAR +STARTCHAR U+7741 +ENCODING 30529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +7C80 +49F8 +4A10 +4820 +7BF8 +4848 +4848 +4FFE +7848 +4848 +4BF8 +4848 +7840 +4940 +0080 +ENDCHAR +STARTCHAR U+7742 +ENCODING 30530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0702 +1CE2 +7032 +0702 +1CE2 +7032 +0002 +FFFE +4000 +4FFC +4804 +4FFC +4804 +4FFC +8804 +0FFC +ENDCHAR +STARTCHAR U+7743 +ENCODING 30531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7C90 +4908 +4BFC +7890 +490C +4A84 +78F8 +4908 +4910 +4AA0 +7C40 +48A0 +0118 +0606 +ENDCHAR +STARTCHAR U+7744 +ENCODING 30532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0111 +0092 +7C54 +4410 +44FE +7C82 +44FE +4482 +7CFE +4482 +4482 +7C82 +448A +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+7745 +ENCODING 30533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +4904 +49FC +4904 +7904 +49FC +4800 +4BFE +7820 +4820 +4FFF +4820 +7820 +0020 +0020 +ENDCHAR +STARTCHAR U+7746 +ENCODING 30534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4BFE +4A02 +4A02 +79FC +4800 +4800 +4FFF +7890 +4890 +4890 +4990 +7911 +0313 +060E +ENDCHAR +STARTCHAR U+7747 +ENCODING 30535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0090 +78A0 +4BF8 +4848 +7BF8 +4A40 +4BFC +7AC4 +48C4 +4944 +7A58 +4C40 +0040 +0000 +ENDCHAR +STARTCHAR U+774A +ENCODING 30538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FE +4902 +4902 +49FE +7800 +49FE +4902 +4902 +79FE +4902 +4902 +49FE +7902 +0102 +010E +ENDCHAR +STARTCHAR U+774B +ENCODING 30539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00CA +7B89 +4888 +4888 +7BFF +4888 +48C8 +4889 +798A +4A8C +4889 +7895 +4AA3 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+774C +ENCODING 30540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +00FF +7902 +4A04 +49FF +7911 +4911 +49FF +7848 +4848 +4848 +4848 +7889 +030F +0000 +0000 +ENDCHAR +STARTCHAR U+774D +ENCODING 30541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +4904 +4904 +49FC +7904 +4904 +49FC +4904 +7904 +49FC +4850 +4851 +7891 +491F +0E00 +ENDCHAR +STARTCHAR U+774E +ENCODING 30542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00C4 +786C +4838 +486C +49C6 +7820 +4BFF +4840 +4890 +79FE +4A92 +4892 +4892 +7892 +0096 +0010 +ENDCHAR +STARTCHAR U+774F +ENCODING 30543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4A02 +4A22 +4A22 +7AFA +4A22 +4A72 +4A72 +7AAA +4AAA +4A22 +4A22 +7A02 +03FE +0000 +ENDCHAR +STARTCHAR U+7750 +ENCODING 30544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7848 +4FFC +4840 +7A48 +4950 +4864 +7FFE +48C0 +48E0 +4950 +7948 +4A4E +0444 +0040 +ENDCHAR +STARTCHAR U+7751 +ENCODING 30545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +7CA0 +4910 +4A0E +7C24 +49F0 +4800 +7A48 +4A48 +4948 +4950 +7950 +4824 +07FE +0000 +ENDCHAR +STARTCHAR U+7752 +ENCODING 30546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7922 +4926 +4B74 +4A50 +78D8 +498C +4B07 +4820 +7922 +4926 +4B74 +4A50 +78D8 +018C +0707 +ENDCHAR +STARTCHAR U+7754 +ENCODING 30548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0050 +7888 +4904 +4AFA +7C01 +4BFE +4A52 +7A52 +4BFE +4A52 +7A52 +0252 +0206 +0000 +0000 +ENDCHAR +STARTCHAR U+7755 +ENCODING 30549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +03FF +7A01 +4A01 +4880 +79EF +4929 +4A29 +7929 +48AE +4848 +7889 +0109 +020F +0000 +0000 +ENDCHAR +STARTCHAR U+7756 +ENCODING 30550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4BFE +4820 +4FFF +7888 +4988 +4B0F +4840 +787C +48C4 +498C +4B58 +7870 +00DC +0787 +ENDCHAR +STARTCHAR U+7757 +ENCODING 30551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +4904 +4904 +49FC +7904 +4904 +49FC +4880 +79FF +4E49 +4889 +4B11 +7823 +00C2 +000E +ENDCHAR +STARTCHAR U+7759 +ENCODING 30553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +0200 +7BFF +4A01 +4BFF +7A00 +4A14 +4A12 +7BFF +4A10 +4A10 +7A28 +0244 +0583 +0000 +0000 +ENDCHAR +STARTCHAR U+775A +ENCODING 30554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7A20 +4AF8 +4A20 +7A20 +4BFC +4A20 +7A20 +4AF8 +4A20 +7C20 +4FFC +0800 +0000 +ENDCHAR +STARTCHAR U+775B +ENCODING 30555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7BF8 +4840 +49F0 +7840 +4FFC +4800 +7BF8 +4A48 +4A48 +7BF8 +4A08 +0208 +0218 +0000 +ENDCHAR +STARTCHAR U+775C +ENCODING 30556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +783C +4BE2 +4926 +4894 +79FE +4822 +4822 +4BFF +7822 +4822 +49FE +4820 +7820 +0020 +00E0 +ENDCHAR +STARTCHAR U+775E +ENCODING 30558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4FFF +4820 +4924 +7924 +4924 +4BAE +4AAA +7E73 +4870 +48A8 +49AC +7B26 +0623 +0020 +ENDCHAR +STARTCHAR U+775F +ENCODING 30559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4BFE +4800 +4888 +7888 +49DC +4B56 +4800 +7820 +4FFF +4820 +4820 +7820 +0020 +0020 +ENDCHAR +STARTCHAR U+7760 +ENCODING 30560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +7B26 +4924 +4BFE +4850 +7850 +4FFF +4888 +4904 +7BFE +4E0B +4808 +49F8 +7902 +0106 +00FC +ENDCHAR +STARTCHAR U+7761 +ENCODING 30561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +7BE0 +4840 +4BF8 +7950 +4950 +4FFC +7950 +4950 +4BF8 +7840 +4840 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+7762 +ENCODING 30562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00C0 +08A0 +7C84 +49FE +4920 +7B28 +4DFC +4920 +7928 +49FC +4920 +4920 +7924 +49FE +0100 +0100 +ENDCHAR +STARTCHAR U+7763 +ENCODING 30563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +0848 +7F50 +2A20 +29D0 +5FEC +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7764 +ENCODING 30564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4A22 +4A22 +7BFE +4A22 +4A22 +4BFE +7800 +4FFF +4888 +4888 +7888 +0188 +0108 +0308 +ENDCHAR +STARTCHAR U+7765 +ENCODING 30565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +7BF8 +4A48 +4BF8 +7A48 +4BF8 +4A88 +78A0 +4920 +4FFC +7820 +4820 +0020 +0000 +ENDCHAR +STARTCHAR U+7766 +ENCODING 30566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7840 +4BF8 +4840 +7FFC +4920 +4924 +7A5C +4C40 +4BF8 +7840 +4040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7767 +ENCODING 30567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +79F8 +4910 +4910 +49FF +7908 +4908 +49C5 +4B03 +79FE +4902 +4902 +49FE +7902 +0102 +01FE +ENDCHAR +STARTCHAR U+7768 +ENCODING 30568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0338 +7A08 +4BB8 +4A08 +7A08 +4BF8 +4AA8 +78A0 +48A0 +4920 +7924 +4A24 +0C1C +0000 +ENDCHAR +STARTCHAR U+7769 +ENCODING 30569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7878 +4888 +49F0 +7820 +4FFF +4820 +4822 +7BAC +4820 +48A8 +7924 +0222 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+776A +ENCODING 30570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4442 +4442 +7FFE +0100 +3FFC +0100 +FFFF +1010 +0820 +7FFE +0100 +3FFC +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+776B +ENCODING 30571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +07FC +7840 +4BF8 +4848 +7FFC +4848 +4BF8 +7848 +4A40 +4A7C +7B40 +4CC0 +083C +0000 +ENDCHAR +STARTCHAR U+776C +ENCODING 30572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +081C +7FE0 +4888 +4A48 +4950 +7800 +4844 +4FFE +4840 +78C0 +48E0 +4950 +4A4E +7C44 +4840 +0040 +ENDCHAR +STARTCHAR U+776D +ENCODING 30573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +7A22 +4A22 +4AFA +7A22 +4BFE +4A02 +7AFA +4A8A +4A8A +7AFA +028A +0202 +0406 +0000 +0000 +ENDCHAR +STARTCHAR U+776E +ENCODING 30574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0070 +0088 +7904 +4A02 +4DFD +7800 +4BC2 +4A52 +7BD2 +4A52 +4BD2 +7A52 +4A42 +04C6 +0000 +0000 +ENDCHAR +STARTCHAR U+776F +ENCODING 30575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E20 +423F +7E42 +4812 +7E14 +4808 +5514 +6263 +1FFC +1004 +1FF4 +1FF4 +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7770 +ENCODING 30576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +7884 +4BFF +4884 +4884 +7840 +4840 +4BFF +4880 +7880 +49FE +4A82 +4882 +7882 +0082 +00FE +ENDCHAR +STARTCHAR U+7772 +ENCODING 30578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +4904 +49FC +4904 +7904 +49FC +4820 +4920 +7BFE +4E20 +49FC +4820 +7820 +07FF +0000 +ENDCHAR +STARTCHAR U+7773 +ENCODING 30579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F020 +97FF +9088 +9124 +F6FB +9020 +9020 +91FE +F000 +9020 +91FE +9020 +F020 +07FF +0000 +ENDCHAR +STARTCHAR U+7774 +ENCODING 30580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +F7FE +9402 +9442 +F3FC +9040 +93FC +9244 +F3FC +9244 +9244 +93FC +F040 +0FFF +0040 +0040 +ENDCHAR +STARTCHAR U+7779 +ENCODING 30585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0088 +7BF8 +4890 +48A0 +7FFC +4850 +4888 +79F8 +4F08 +49F8 +7908 +49F8 +0108 +0000 +ENDCHAR +STARTCHAR U+777A +ENCODING 30586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +F2FC +9204 +9204 +95FF +F400 +9C80 +94FE +9510 +F410 +95FF +9428 +946C +F444 +04C6 +0583 +ENDCHAR +STARTCHAR U+777C +ENCODING 30588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +0104 +79FC +4904 +49FC +7800 +4FFF +4820 +7820 +4920 +493E +79A0 +4A60 +043F +0000 +0000 +ENDCHAR +STARTCHAR U+777D +ENCODING 30589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +03B0 +78A4 +4AA8 +4910 +7908 +4A0E +4DF4 +7840 +4848 +4BFC +4840 +78A0 +48A0 +011C +0608 +ENDCHAR +STARTCHAR U+777E +ENCODING 30590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +2448 +3FF8 +0100 +1FF0 +0100 +7FFC +0440 +3FF8 +0100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+777F +ENCODING 30591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F0 +3FFC +2FE8 +4920 +1290 +0440 +1FF0 +682C +0FE0 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7780 +ENCODING 30592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E40 +2444 +187E +FE88 +2B50 +2820 +4850 +898E +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+7781 +ENCODING 30593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0082 +7CFE +4482 +44FE +7C82 +44FE +4410 +7C11 +45FF +4428 +7C44 +4482 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+7782 +ENCODING 30594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0314 +7E7F +4410 +7F90 +4410 +5F12 +5122 +5152 +5F12 +5114 +5108 +5F14 +1122 +1F41 +0000 +0000 +ENDCHAR +STARTCHAR U+7783 +ENCODING 30595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +07FE +7A10 +4A10 +4BFF +7A10 +4A10 +4AFF +7A81 +4AFF +4A81 +7AFF +0481 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+7784 +ENCODING 30596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0910 +7D10 +4914 +4FFE +4910 +7914 +4BFE +4A44 +4A44 +7A44 +4BFC +4A44 +4A44 +7A44 +4BFC +0204 +ENDCHAR +STARTCHAR U+7785 +ENCODING 30597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +09D0 +7F10 +4912 +4956 +7FB8 +4910 +4B90 +4B50 +7D10 +4928 +4928 +4928 +7946 +4984 +0100 +ENDCHAR +STARTCHAR U+7787 +ENCODING 30599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +F492 +9254 +9010 +FEFE +9210 +9438 +9454 +F292 +9210 +9210 +9610 +F900 +90FE +0000 +0000 +ENDCHAR +STARTCHAR U+7788 +ENCODING 30600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +0088 +7904 +4A22 +4849 +78F8 +4800 +4FDF +7C51 +4A49 +4945 +7A49 +0451 +00C3 +0000 +0000 +ENDCHAR +STARTCHAR U+7789 +ENCODING 30601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7F3C +0824 +3E25 +7F47 +4100 +5D00 +3E3E +2222 +3E22 +2214 +3E08 +2214 +3E22 +0000 +0000 +ENDCHAR +STARTCHAR U+778B +ENCODING 30603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +7934 +49C4 +4AFC +7AF8 +4A88 +4AF8 +7A88 +4AF8 +4A88 +7AF8 +4BFC +0188 +0604 +0000 +ENDCHAR +STARTCHAR U+778C +ENCODING 30604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0048 +7BFC +4840 +4FFE +7880 +4910 +4BF8 +7800 +4BFC +4A94 +4A94 +7A94 +4A94 +07FE +0000 +ENDCHAR +STARTCHAR U+778D +ENCODING 30605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +7DAE +4524 +4524 +45AC +7D24 +4524 +45FC +7C20 +47FC +4488 +4450 +7C20 +4450 +018E +0604 +ENDCHAR +STARTCHAR U+778E +ENCODING 30606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03FC +7A58 +4DE0 +4840 +7BF8 +4840 +4FFC +7840 +4BF8 +4A08 +7A08 +4BF8 +0208 +0000 +ENDCHAR +STARTCHAR U+778F +ENCODING 30607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +3FFE +0080 +0FF8 +0080 +7FFF +0000 +0FF8 +0808 +0FF8 +1450 +2520 +461F +0000 +0000 +ENDCHAR +STARTCHAR U+7791 +ENCODING 30609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03FC +7A08 +4DF0 +4910 +79F0 +4910 +49F0 +7840 +4FFC +4800 +7890 +4908 +0608 +0000 +ENDCHAR +STARTCHAR U+7792 +ENCODING 30610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +7914 +4FFE +4910 +4804 +7FFE +4890 +4894 +4BFE +7A94 +4A94 +4B6C +4A04 +7A04 +4A14 +0208 +ENDCHAR +STARTCHAR U+7794 +ENCODING 30612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F7FF +9020 +93FE +9020 +F7FF +9000 +93FE +9202 +F3FE +9202 +93FE +9202 +F3FE +0104 +0603 +ENDCHAR +STARTCHAR U+7795 +ENCODING 30613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +49FE +4884 +4848 +7BFF +4800 +49FE +4902 +79FE +4902 +49FE +4820 +7BFF +0020 +0020 +ENDCHAR +STARTCHAR U+7796 +ENCODING 30614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FBC +4824 +4F27 +5440 +7FBE +4A14 +5108 +7FB6 +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +ENDCHAR +STARTCHAR U+7797 +ENCODING 30615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +00FE +7D42 +447E +4442 +7C7E +4440 +447E +7C40 +447F +4555 +7D55 +0001 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+7799 +ENCODING 30617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +01EF +7C44 +4400 +44FE +7C82 +44FE +4482 +7CFE +4410 +45FF +7C28 +4444 +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+779A +ENCODING 30618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F020 +97FF +9401 +95FD +F020 +93FE +9222 +9222 +F3FE +9222 +9222 +93FE +F104 +0306 +0603 +ENDCHAR +STARTCHAR U+779B +ENCODING 30619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A2 +0122 +7A22 +4855 +4880 +7908 +4B08 +494F +7948 +4948 +4948 +7948 +49A8 +011F +0000 +0000 +ENDCHAR +STARTCHAR U+779C +ENCODING 30620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +00FE +7C92 +45FF +4492 +7CFE +45FF +4511 +7DFF +4454 +45FF +7C28 +4410 +01EF +0000 +0000 +ENDCHAR +STARTCHAR U+779D +ENCODING 30621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +7CC6 +44AA +4492 +7CAA +44FE +4410 +7DFF +4515 +457D +7D05 +0101 +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+779E +ENCODING 30622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +0110 +77FC +5110 +51F0 +7040 +57FC +5444 +7774 +5554 +5554 +76EC +5444 +044C +0000 +ENDCHAR +STARTCHAR U+779F +ENCODING 30623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +07FE +7890 +4894 +4BFE +7A94 +4A94 +4BFC +7800 +49F8 +4800 +4FFE +7950 +4A4C +0444 +00C0 +ENDCHAR +STARTCHAR U+77A0 +ENCODING 30624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7A48 +4950 +4BFC +7A08 +4DF0 +4910 +7910 +49F0 +4840 +7BF8 +4840 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+77A1 +ENCODING 30625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +013F +0121 +7FE1 +493F +4921 +7921 +4FFF +4921 +7921 +493F +4A94 +7C65 +4845 +0087 +0000 +0000 +ENDCHAR +STARTCHAR U+77A2 +ENCODING 30626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +3FF8 +2448 +3FF8 +0000 +7FFE +4002 +9FF4 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +ENDCHAR +STARTCHAR U+77A3 +ENCODING 30627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +79FC +4924 +49FC +7820 +4BFE +4A22 +7BFE +4820 +4800 +7AA6 +4A91 +0484 +00FC +0000 +0000 +ENDCHAR +STARTCHAR U+77A5 +ENCODING 30629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4920 +2A20 +7F7C +49C8 +5D30 +6BD0 +4FEC +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+77A7 +ENCODING 30631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0940 +7D28 +49FC +4B20 +4D20 +79F8 +4920 +4920 +49F8 +7920 +4928 +49FC +4900 +7AA8 +42A6 +0402 +ENDCHAR +STARTCHAR U+77A8 +ENCODING 30632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +0154 +78D8 +4FFF +4888 +7850 +49FC +4820 +79FC +4820 +4BFE +7850 +4888 +0106 +0000 +0000 +ENDCHAR +STARTCHAR U+77A9 +ENCODING 30633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +07FE +7404 +57FC +5400 +75FC +5420 +55FC +7524 +55FC +5420 +77FE +4A22 +122A +22FA +0206 +ENDCHAR +STARTCHAR U+77AA +ENCODING 30634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7FA8 +48B0 +4AA4 +4918 +7908 +4BFE +4C04 +4BF8 +7A08 +4A08 +4BF8 +4910 +78A4 +4FFE +0000 +ENDCHAR +STARTCHAR U+77AB +ENCODING 30635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +0044 +7DFF +4545 +45FF +7C00 +44FE +4482 +7CFE +4482 +44FE +7C10 +01FF +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+77AC +ENCODING 30636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +7BE8 +4A48 +4950 +7920 +4FFC +4D18 +79F8 +4AD0 +4ED0 +79FC +4910 +4210 +0410 +0000 +ENDCHAR +STARTCHAR U+77AD +ENCODING 30637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7840 +4FFC +4AA8 +7910 +4BF8 +4D14 +79F0 +4910 +49F0 +7A48 +4A44 +4444 +00C0 +0000 +ENDCHAR +STARTCHAR U+77AE +ENCODING 30638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +F108 +9FE8 +920F +929A +F4D2 +974A +900A +97CA +F44E +97C4 +9444 +97CE +F44A +044A +04DB +ENDCHAR +STARTCHAR U+77AF +ENCODING 30639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BDE +4A52 +4BDE +4A52 +7BDE +4A02 +4AFA +4A8A +7A8A +4AFA +4A8A +4A8A +7AFA +0202 +020E +ENDCHAR +STARTCHAR U+77B0 +ENCODING 30640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +07A0 +7220 +5FE0 +54BC +74E8 +57A8 +54A8 +77A8 +5490 +5790 +7CA8 +50C8 +0084 +0000 +ENDCHAR +STARTCHAR U+77B1 +ENCODING 30641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +F088 +97FF +9088 +93FE +F124 +9124 +97FF +9124 +F124 +93FE +9020 +97FF +F020 +0020 +0020 +ENDCHAR +STARTCHAR U+77B2 +ENCODING 30642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FC +0008 +7850 +4BFF +4851 +7992 +4830 +4BFF +7A89 +4B77 +4A51 +7A71 +0201 +0203 +0000 +0000 +ENDCHAR +STARTCHAR U+77B3 +ENCODING 30643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7BF8 +4910 +4FFC +7BF8 +4A48 +4BF8 +7A48 +4BF8 +4840 +7BF8 +4040 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+77B4 +ENCODING 30644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7BFE +4954 +4954 +7BFE +4954 +4954 +7954 +4FFF +4800 +7A52 +0252 +0251 +0000 +0000 +ENDCHAR +STARTCHAR U+77B5 +ENCODING 30645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0248 +7950 +4FFE +4950 +7A48 +4C46 +4A08 +7BBC +4AA8 +4AA8 +4D28 +797E +4208 +0408 +0008 +ENDCHAR +STARTCHAR U+77B6 +ENCODING 30646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +03F8 +7A48 +4BF8 +4FFC +7BF8 +4A08 +4BF8 +7A08 +4BF8 +4A08 +7BF8 +4998 +0604 +0000 +ENDCHAR +STARTCHAR U+77B7 +ENCODING 30647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03CF +0249 +7BCF +4A49 +4BCF +7A01 +4A79 +4A49 +7A79 +4A49 +4A79 +7A01 +4A01 +0203 +0000 +0000 +ENDCHAR +STARTCHAR U+77B9 +ENCODING 30649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +03E4 +7A48 +4930 +4BFC +7A48 +4DA8 +4A94 +78F0 +49F8 +4E90 +7860 +49B0 +0E0C +0000 +ENDCHAR +STARTCHAR U+77BA +ENCODING 30650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +0044 +7CBA +4501 +45FF +7D55 +4539 +45FF +7C00 +44FE +4482 +7CFE +4482 +00FE +0000 +0000 +ENDCHAR +STARTCHAR U+77BB +ENCODING 30651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +00F0 +7F20 +4BFC +4AA8 +7A98 +4B70 +4BFC +7A70 +4A70 +4AF8 +7C88 +4CF8 +0888 +0000 +ENDCHAR +STARTCHAR U+77BC +ENCODING 30652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0040 +78A0 +4910 +4BF8 +7C04 +4BB8 +4AA8 +7AA8 +4BB8 +4910 +7998 +4A64 +0444 +0000 +ENDCHAR +STARTCHAR U+77BD +ENCODING 30653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +7FFC +3E20 +3EF8 +2248 +3E30 +17D8 +7FF4 +1010 +1FF0 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+77BE +ENCODING 30654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4242 +7E7E +0100 +7FFE +4422 +5C22 +F13F +0100 +3FFC +0100 +FFFF +ENDCHAR +STARTCHAR U+77BF +ENCODING 30655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3EF8 +2288 +3EF8 +3EF8 +2288 +3EF8 +0840 +0FF8 +1880 +2FF0 +4FF0 +0880 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+77C2 +ENCODING 30658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0082 +7CFE +4400 +45EF +7D29 +45FF +4410 +7DFF +4454 +4492 +7D11 +4410 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+77C3 +ENCODING 30659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F020 +97FF +9441 +94A1 +F28A +94F9 +9000 +93FE +F292 +93FE +9000 +97FF +F020 +0020 +00E0 +ENDCHAR +STARTCHAR U+77C4 +ENCODING 30660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +7820 +4BFE +4820 +7BFE +4AAA +4A72 +7BFE +4820 +4BFE +7820 +07FF +0489 +0489 +0000 +0000 +ENDCHAR +STARTCHAR U+77C7 +ENCODING 30663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +07FC +7910 +4BFC +4AE8 +7C00 +4FFC +48C8 +7F68 +49F0 +4E70 +79A8 +4E24 +00C0 +0000 +ENDCHAR +STARTCHAR U+77C9 +ENCODING 30665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F3FF +9201 +91FE +90A4 +F32B +9030 +91FE +9702 +F1FE +9102 +91FE +9102 +F1FE +0084 +0303 +ENDCHAR +STARTCHAR U+77CA +ENCODING 30666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +793E +4962 +4ABE +4FA2 +793E +4A88 +4FFF +7929 +4BA9 +4D69 +792A +4908 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+77CC +ENCODING 30668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +03FE +0248 +7BFE +4A48 +4A78 +7BFE +4A00 +4AFE +7A92 +4AFE +4C92 +78FE +0183 +0000 +0000 +ENDCHAR +STARTCHAR U+77CD +ENCODING 30669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3EF8 +2288 +3EF8 +3EF8 +2288 +3EF8 +0FF8 +1BE0 +6BE0 +0FF8 +3FE0 +0440 +03C0 +7C3C +0000 +ENDCHAR +STARTCHAR U+77CE +ENCODING 30670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +00FC +0108 +7DFF +4529 +45FF +7C82 +44FE +4482 +7CFE +4482 +447C +7C90 +01EF +0000 +0000 +ENDCHAR +STARTCHAR U+77CF +ENCODING 30671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0182 +00FA +7CFA +4482 +44FE +7C10 +45FF +4545 +7C92 +45FF +447C +7C84 +010C +0000 +0000 +ENDCHAR +STARTCHAR U+77D0 +ENCODING 30672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +0020 +7BFE +4AAA +4A72 +7888 +4A20 +4BFE +7E20 +4BFC +4A20 +7BFC +4A20 +03FE +0000 +0000 +ENDCHAR +STARTCHAR U+77D1 +ENCODING 30673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F03C +9020 +93FF +9221 +F2FC +9221 +92FF +9292 +F2FE +9292 +92FE +9600 +F5FE +0D52 +03FF +ENDCHAR +STARTCHAR U+77D2 +ENCODING 30674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +F78F +9088 +93FE +9252 +F3FE +9000 +97FF +9401 +F5FD +9104 +91FC +9104 +F1FC +0104 +01FC +ENDCHAR +STARTCHAR U+77D3 +ENCODING 30675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +FFBC +94A0 +953C +9F84 +F03C +97A0 +94BC +F7A0 +94BC +97A0 +94BC +F4A2 +091E +0000 +0000 +ENDCHAR +STARTCHAR U+77D4 +ENCODING 30676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +01FF +7C44 +45EF +4529 +7DEF +4488 +45FF +7C88 +44FF +4488 +7CFF +0088 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+77D5 +ENCODING 30677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +47E8 +D00A +23C4 +4809 +FBDF +2244 +ABD6 +A815 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +ENDCHAR +STARTCHAR U+77D7 +ENCODING 30679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +07C0 +17C0 +17C0 +17C0 +1FF8 +7FFC +1C70 +5D70 +5D70 +5D70 +7FFC +4100 +0000 +ENDCHAR +STARTCHAR U+77D8 +ENCODING 30680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0092 +01FF +0101 +797D +4844 +487C +78FE +48BA +48FE +7810 +48FE +4810 +79FF +0129 +0000 +0000 +ENDCHAR +STARTCHAR U+77D9 +ENCODING 30681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0F9F +E891 +AF9F +A891 +AF9F +E801 +AB91 +A91F +AFF5 +E815 +AFDD +AA89 +AB9D +EA97 +0FB1 +08A3 +ENDCHAR +STARTCHAR U+77DA +ENCODING 30682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +7404 +57FC +5758 +7758 +57F8 +56A8 +77F8 +55FC +57F4 +79F4 +487C +1798 +0000 +ENDCHAR +STARTCHAR U+77DB +ENCODING 30683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0220 +0140 +0080 +7FFC +0088 +0190 +0280 +0480 +1880 +6080 +0080 +0180 +0000 +ENDCHAR +STARTCHAR U+77DC +ENCODING 30684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +1250 +0C50 +0488 +7FF4 +0D00 +0E00 +14F8 +1408 +2408 +4408 +0408 +0C08 +0000 +ENDCHAR +STARTCHAR U+77DE +ENCODING 30686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0660 +0180 +FFFE +0384 +0C88 +7080 +0380 +7FFE +4242 +4472 +4802 +47E2 +4422 +442A +47E6 +ENDCHAR +STARTCHAR U+77DF +ENCODING 30687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F10 +0254 +14D6 +0892 +0410 +FFFE +1A82 +1C82 +28FE +2882 +4882 +48FE +8882 +0882 +2882 +188E +ENDCHAR +STARTCHAR U+77E0 +ENCODING 30688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F24 +0224 +1424 +08FF +0424 +FF24 +1A24 +1CFF +2800 +287E +4842 +4842 +887E +0842 +2842 +187E +ENDCHAR +STARTCHAR U+77E2 +ENCODING 30690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +1FF0 +1100 +2100 +0100 +7FFC +0100 +0280 +0240 +0420 +1810 +600C +0000 +ENDCHAR +STARTCHAR U+77E3 +ENCODING 30691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0240 +0430 +3FC8 +0800 +0FF8 +1100 +2100 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+77E4 +ENCODING 30692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +F880 +0880 +09FE +0920 +7A20 +4020 +47FF +4020 +7850 +0850 +0888 +0888 +1904 +1202 +7401 +ENDCHAR +STARTCHAR U+77E5 +ENCODING 30693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1000 +1000 +3FF8 +2888 +4888 +0888 +7F88 +0888 +0C88 +1488 +12F8 +2288 +4000 +0000 +ENDCHAR +STARTCHAR U+77E6 +ENCODING 30694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0FF0 +1820 +2040 +FFFF +2100 +23F8 +2640 +2040 +2FFE +2040 +20A0 +60A0 +4110 +C208 +0404 +ENDCHAR +STARTCHAR U+77E7 +ENCODING 30695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +11C8 +1048 +3E48 +29C8 +4908 +0908 +7FC8 +0948 +0C48 +1248 +1248 +2048 +4188 +0000 +ENDCHAR +STARTCHAR U+77E8 +ENCODING 30696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +2002 +3F7C +2808 +4808 +0808 +087F +7F08 +0808 +0808 +0808 +1414 +2222 +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+77E9 +ENCODING 30697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +10FC +1080 +3F80 +28F8 +4888 +0888 +7F88 +08F8 +0C88 +1480 +1280 +22FC +4080 +0000 +ENDCHAR +STARTCHAR U+77EA +ENCODING 30698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2030 +7C20 +D0FC +1084 +10A4 +1094 +FE84 +13FF +1084 +38A4 +2894 +6C94 +4594 +C104 +031C +ENDCHAR +STARTCHAR U+77EB +ENCODING 30699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2018 +23E0 +2840 +3C40 +5044 +97FE +10A0 +FD10 +131E +1514 +1110 +2910 +2510 +4110 +8210 +0410 +ENDCHAR +STARTCHAR U+77EC +ENCODING 30700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2248 +3E48 +5248 +9248 +1554 +FCE2 +1040 +1048 +13FC +2840 +2440 +4044 +8FFE +0000 +ENDCHAR +STARTCHAR U+77ED +ENCODING 30701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1000 +3FF8 +2908 +4908 +09F8 +7F08 +0908 +0890 +1490 +1220 +23FC +4000 +0000 +ENDCHAR +STARTCHAR U+77EE +ENCODING 30702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +11E0 +1020 +1FFC +2870 +28A8 +4924 +7E20 +09FC +0C48 +12C8 +1230 +2068 +4384 +0000 +ENDCHAR +STARTCHAR U+77EF +ENCODING 30703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E0 +1040 +3FFC +28A0 +49F0 +0AA8 +7EE4 +0BF8 +0E08 +16E8 +12A8 +22E8 +4218 +0000 +ENDCHAR +STARTCHAR U+77F0 +ENCODING 30704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +205C +2044 +7C82 +5101 +90FE +10D6 +FEBA +10FE +1000 +10FE +2882 +2482 +44FE +4082 +8082 +00FE +ENDCHAR +STARTCHAR U+77F1 +ENCODING 30705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2028 +21EF +7C6C +5088 +91FF +1290 +FEFE +1090 +10FE +1090 +28FF +2400 +44FE +804C +0038 +00E6 +ENDCHAR +STARTCHAR U+77F2 +ENCODING 30706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FF +20A5 +3EFF +4844 +0897 +08F4 +7F05 +08F7 +0890 +08F4 +1497 +22F4 +4195 +0117 +0000 +0000 +ENDCHAR +STARTCHAR U+77F3 +ENCODING 30707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0200 +0200 +0200 +0400 +07F8 +0C08 +0C08 +1408 +2408 +4408 +07F8 +0408 +0000 +ENDCHAR +STARTCHAR U+77F4 +ENCODING 30708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE00 +11FF +1010 +1010 +1010 +3C10 +2410 +6410 +A410 +2410 +2410 +2410 +3C10 +0050 +0030 +ENDCHAR +STARTCHAR U+77F6 +ENCODING 30710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +FEFC +1088 +1088 +2088 +2488 +3E88 +6488 +A488 +2488 +2488 +2488 +250A +3D0A +2206 +0400 +ENDCHAR +STARTCHAR U+77F7 +ENCODING 30711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +003E +0002 +7F02 +0804 +1008 +3F08 +517F +1108 +1108 +1F08 +1108 +0008 +0028 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+77F8 +ENCODING 30712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +FDFC +1020 +1020 +2020 +2020 +3C24 +67FE +A420 +2420 +2420 +2420 +2420 +3C20 +2020 +0020 +ENDCHAR +STARTCHAR U+77F9 +ENCODING 30713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +00FF +7F24 +0824 +1024 +2024 +5F24 +1124 +1124 +1124 +1F25 +1125 +0045 +0087 +0000 +0000 +ENDCHAR +STARTCHAR U+77FA +ENCODING 30714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +021C +7F70 +0810 +1010 +2010 +5F7F +1110 +1110 +1110 +1F10 +1111 +0011 +001F +0000 +0000 +ENDCHAR +STARTCHAR U+77FB +ENCODING 30715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FE40 +107F +1080 +1100 +107E +3C02 +2404 +6408 +A410 +2420 +2440 +2480 +3C81 +0081 +007F +ENDCHAR +STARTCHAR U+77FC +ENCODING 30716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0820 +0820 +0820 +1020 +1E20 +3220 +5220 +1220 +1220 +1E20 +13FC +0000 +0000 +ENDCHAR +STARTCHAR U+77FD +ENCODING 30717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0440 +FE40 +107E +1042 +2082 +2084 +7D44 +A624 +2418 +2408 +2410 +2420 +3C40 +2480 +0100 +ENDCHAR +STARTCHAR U+77FE +ENCODING 30718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FDF8 +1110 +1110 +2110 +2990 +7D50 +A950 +2910 +2910 +2910 +2910 +3A12 +2A12 +040E +0800 +ENDCHAR +STARTCHAR U+77FF +ENCODING 30719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0420 +FE24 +11FE +1100 +2100 +2500 +3F00 +6500 +A500 +2500 +2500 +3D00 +2200 +0400 +0800 +ENDCHAR +STARTCHAR U+7800 +ENCODING 30720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01F8 +FE10 +1020 +2040 +2084 +21FE +7C54 +A454 +2454 +2494 +24A4 +2524 +3D44 +2254 +0088 +ENDCHAR +STARTCHAR U+7801 +ENCODING 30721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFF8 +1010 +1110 +2110 +2510 +3F10 +6514 +A5FE +2404 +2424 +27F4 +2404 +3C04 +2414 +0008 +ENDCHAR +STARTCHAR U+7802 +ENCODING 30722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +0820 +08B0 +08A8 +10A8 +1F24 +332C +5268 +1210 +1210 +1E20 +10C0 +0300 +0000 +ENDCHAR +STARTCHAR U+7803 +ENCODING 30723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00FE +7C82 +10A2 +1092 +3C8A +65FF +2482 +2482 +2482 +3C82 +2482 +008A +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+7805 +ENCODING 30725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1010 +1012 +1014 +11F8 +3C30 +2438 +6454 +A452 +2491 +2510 +2410 +3C10 +0050 +0030 +ENDCHAR +STARTCHAR U+7806 +ENCODING 30726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1010 +10FE +1010 +1010 +3C10 +25FF +6410 +A410 +2428 +2428 +2444 +3C44 +0082 +0101 +ENDCHAR +STARTCHAR U+7809 +ENCODING 30729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFC +0100 +3FF8 +0100 +7FFC +0100 +FFFE +0400 +0410 +0FF8 +1810 +2810 +C810 +0FF0 +0810 +ENDCHAR +STARTCHAR U+780C +ENCODING 30732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +7EF8 +1228 +12A8 +1328 +3E28 +2A28 +6A28 +2AA8 +2AA8 +39C8 +2848 +2088 +0118 +0000 +ENDCHAR +STARTCHAR U+780D +ENCODING 30733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0480 +FE80 +10FC +1104 +2208 +2440 +7E40 +A440 +2440 +24A0 +24A0 +2510 +3E08 +240E +0804 +ENDCHAR +STARTCHAR U+780E +ENCODING 30734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1028 +1044 +1082 +1101 +3C44 +2444 +6444 +A444 +2444 +2444 +2444 +3C84 +0084 +0104 +ENDCHAR +STARTCHAR U+780F +ENCODING 30735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +0044 +7C82 +1101 +1000 +20FE +7C22 +2422 +2422 +2422 +2422 +3C42 +2494 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+7810 +ENCODING 30736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FF +7C82 +1084 +1088 +3CBF +6481 +24A1 +24A2 +2494 +3C88 +2514 +0222 +00C1 +0000 +0000 +ENDCHAR +STARTCHAR U+7811 +ENCODING 30737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +FEFE +1008 +1088 +2088 +2108 +3DFE +6428 +A428 +2448 +2448 +2488 +2508 +3E08 +2428 +0010 +ENDCHAR +STARTCHAR U+7812 +ENCODING 30738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +7F20 +1120 +1120 +1124 +3DE8 +2530 +6520 +2520 +2520 +3D20 +2564 +21A4 +061C +0000 +ENDCHAR +STARTCHAR U+7813 +ENCODING 30739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007C +0044 +7E44 +1084 +1107 +3C00 +64FE +2444 +2428 +2410 +3C28 +2444 +0082 +0301 +0000 +0000 +ENDCHAR +STARTCHAR U+7814 +ENCODING 30740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0890 +0890 +0890 +1090 +1FFC +3290 +5290 +1290 +1290 +1F10 +1110 +0210 +0000 +ENDCHAR +STARTCHAR U+7815 +ENCODING 30741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3F40 +09F0 +0850 +0894 +1094 +1F0C +3220 +5220 +13FC +1220 +1E20 +1020 +0020 +0000 +ENDCHAR +STARTCHAR U+7816 +ENCODING 30742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0440 +FE48 +11FC +1040 +2044 +23FE +7C80 +A480 +25FC +2408 +2410 +2490 +3C60 +2420 +0010 +ENDCHAR +STARTCHAR U+7817 +ENCODING 30743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FE48 +13FC +1080 +20A0 +2120 +3D28 +67FC +A420 +2420 +2424 +27FE +2420 +3C20 +2020 +0020 +ENDCHAR +STARTCHAR U+7818 +ENCODING 30744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE24 +11FE +1020 +2124 +2124 +3D24 +6524 +A524 +2524 +25FC +2424 +2420 +3C22 +201E +0000 +ENDCHAR +STARTCHAR U+781A +ENCODING 30746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7FFC +1108 +1128 +2128 +2528 +7F48 +A548 +2548 +2548 +2460 +24A0 +3CA2 +2522 +021E +0400 +ENDCHAR +STARTCHAR U+781C +ENCODING 30748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +FFFC +1208 +1208 +2318 +2298 +3AA8 +6AA8 +AA48 +2A48 +2AA8 +2A98 +3B1A +240A +080A +1004 +ENDCHAR +STARTCHAR U+781D +ENCODING 30749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE20 +1028 +11FC +2020 +2020 +3C24 +67FE +A420 +2420 +2440 +2480 +2508 +3DFC +2004 +0000 +ENDCHAR +STARTCHAR U+781F +ENCODING 30751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +FE80 +1084 +10FE +2140 +2240 +3C48 +647C +A440 +2440 +2448 +247C +2440 +3C40 +2040 +0040 +ENDCHAR +STARTCHAR U+7820 +ENCODING 30752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7EF8 +1088 +1088 +1088 +3CF8 +2488 +6488 +24F8 +2488 +3C88 +2488 +23FC +0000 +0000 +ENDCHAR +STARTCHAR U+7821 +ENCODING 30753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +FE10 +1010 +1010 +1010 +1010 +3C10 +24FE +6410 +A410 +2414 +2412 +2412 +3C10 +0010 +01FF +ENDCHAR +STARTCHAR U+7822 +ENCODING 30754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +FE02 +1002 +1002 +10F2 +1092 +3C92 +2492 +6492 +A492 +24F2 +2402 +2402 +3C02 +0002 +000E +ENDCHAR +STARTCHAR U+7823 +ENCODING 30755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FE20 +1020 +13FE +2202 +2484 +3E80 +6488 +A498 +24A0 +24C0 +2480 +2482 +3C82 +207E +0000 +ENDCHAR +STARTCHAR U+7825 +ENCODING 30757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +7FE0 +1120 +1120 +1120 +21FC +3D20 +6520 +2510 +25D0 +2714 +3C0C +25FC +0004 +0000 +ENDCHAR +STARTCHAR U+7826 +ENCODING 30758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0888 +2F90 +28E4 +2884 +2E7C +7000 +3FF8 +0200 +07F0 +1C10 +6410 +07F0 +0410 +0000 +ENDCHAR +STARTCHAR U+7827 +ENCODING 30759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +0820 +083C +0820 +1020 +1E20 +32F8 +5288 +1288 +1288 +1E88 +10F8 +0088 +0000 +ENDCHAR +STARTCHAR U+7828 +ENCODING 30760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +00FE +7C80 +10FF +1081 +3CFF +6480 +24BE +2484 +2488 +3C90 +2521 +0241 +003F +0000 +0000 +ENDCHAR +STARTCHAR U+7829 +ENCODING 30761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +0090 +FC94 +13FE +2094 +2094 +23FC +7A90 +AA90 +2BFE +2892 +2892 +289A +3894 +0110 +0210 +ENDCHAR +STARTCHAR U+782A +ENCODING 30762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +7C82 +08A2 +1092 +208A +7DFF +2482 +24A2 +2492 +248A +3CFF +2402 +0014 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+782B +ENCODING 30763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0820 +7C12 +11FF +1010 +2010 +7C10 +2414 +24FE +2410 +2410 +3C10 +2412 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+782C +ENCODING 30764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FE20 +1024 +13FE +2000 +2008 +3D08 +6508 +A490 +2490 +2490 +2490 +2420 +3C24 +27FE +0000 +ENDCHAR +STARTCHAR U+782D +ENCODING 30765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +FE3C +13C0 +1040 +2020 +2420 +3FFC +6408 +A410 +2420 +2440 +2480 +2500 +3F00 +2286 +007C +ENDCHAR +STARTCHAR U+782E +ENCODING 30766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +FF82 +1214 +2408 +1814 +1422 +2241 +FFFF +0200 +0400 +0FFC +1804 +6804 +0804 +0FFC +ENDCHAR +STARTCHAR U+782F +ENCODING 30767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0490 +7E50 +1011 +11D2 +3C54 +6454 +2492 +2511 +2410 +3C10 +2410 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+7830 +ENCODING 30768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +FFFC +1020 +1020 +2124 +24A8 +3E20 +6424 +A7FE +2420 +2420 +2420 +2420 +3C20 +2420 +0020 +ENDCHAR +STARTCHAR U+7831 +ENCODING 30769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0428 +7E44 +0882 +1101 +7C7C +2400 +24FE +2402 +2402 +2444 +3C28 +2410 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+7832 +ENCODING 30770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7E80 +10F8 +1108 +13E8 +2028 +3C28 +65E8 +2530 +2500 +2500 +3D04 +2504 +20FC +0000 +ENDCHAR +STARTCHAR U+7833 +ENCODING 30771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0202 +7F7F +0808 +0808 +0808 +1010 +3E3F +6251 +2211 +2211 +2211 +2211 +3E1F +2211 +0000 +0000 +ENDCHAR +STARTCHAR U+7834 +ENCODING 30772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +11FC +1128 +1130 +2120 +3DF8 +6588 +2550 +2550 +2620 +3E50 +2588 +0E04 +0000 +ENDCHAR +STARTCHAR U+7835 +ENCODING 30773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1010 +11FF +1010 +1038 +3C38 +2454 +6454 +A492 +2511 +247C +2410 +3C10 +0010 +0010 +ENDCHAR +STARTCHAR U+7837 +ENCODING 30775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0420 +FE24 +11FE +1124 +2124 +2524 +7FFC +A524 +2524 +2524 +25FC +3D24 +2420 +0020 +0020 +ENDCHAR +STARTCHAR U+7838 +ENCODING 30776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FDFE +1110 +1110 +217C +2554 +7F54 +A554 +2554 +2554 +2554 +255C +3D10 +2514 +01FE +0000 +ENDCHAR +STARTCHAR U+7839 +ENCODING 30777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0488 +FE88 +13FE +1088 +2088 +2000 +3D04 +6504 +A488 +2488 +2450 +2420 +2450 +3C88 +210E +0604 +ENDCHAR +STARTCHAR U+783A +ENCODING 30778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1100 +1100 +11FC +3D20 +2520 +6538 +2528 +2528 +3E48 +2248 +2488 +0930 +0000 +ENDCHAR +STARTCHAR U+783B +ENCODING 30779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0428 +7FFC +0500 +0530 +09C4 +3704 +C1FC +0004 +FFFE +0410 +0FF8 +1810 +2810 +CFF0 +0810 +ENDCHAR +STARTCHAR U+783C +ENCODING 30780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE20 +1050 +1050 +2088 +2504 +3E02 +6408 +A5FC +2420 +2420 +2420 +2420 +3C24 +23FE +0000 +ENDCHAR +STARTCHAR U+783E +ENCODING 30782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +081C +FDE0 +1100 +1120 +2120 +2524 +7FFE +A420 +2420 +24A8 +2524 +3D22 +2222 +04A0 +0040 +ENDCHAR +STARTCHAR U+783F +ENCODING 30783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +1020 +11FC +1100 +3D20 +2520 +6520 +2520 +2530 +3D48 +2648 +23F4 +0404 +0000 +ENDCHAR +STARTCHAR U+7840 +ENCODING 30784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0420 +FE20 +1124 +1124 +2124 +2524 +7FFC +A420 +2524 +2524 +2524 +2524 +3D24 +25FC +0104 +ENDCHAR +STARTCHAR U+7843 +ENCODING 30787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE90 +1090 +10FE +1110 +1210 +3C10 +25FF +6438 +A438 +2454 +2454 +2492 +3D11 +0010 +0010 +ENDCHAR +STARTCHAR U+7844 +ENCODING 30788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1010 +1112 +1092 +1054 +3C38 +25FF +6428 +A428 +2428 +2428 +2448 +3C49 +0089 +0107 +ENDCHAR +STARTCHAR U+7845 +ENCODING 30789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +13F8 +1040 +1040 +3FFC +2440 +6440 +27F8 +2440 +3C40 +2440 +27FC +0000 +0000 +ENDCHAR +STARTCHAR U+7847 +ENCODING 30791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE20 +1044 +11FE +2104 +218C +3D54 +6554 +A524 +2554 +254C +258C +2504 +3D04 +21FC +0104 +ENDCHAR +STARTCHAR U+7848 +ENCODING 30792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1010 +1010 +11FF +1010 +3C10 +24FE +6400 +A400 +24FE +2482 +2482 +3C82 +00FE +0000 +ENDCHAR +STARTCHAR U+7849 +ENCODING 30793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +00FE +7C12 +11FF +1012 +3CFE +6410 +24FE +2410 +2410 +3DFF +2410 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+784A +ENCODING 30794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007E +0084 +7E08 +11FF +1100 +3D00 +657F +2521 +2521 +3D2A +2524 +0120 +0221 +043F +0000 +0000 +ENDCHAR +STARTCHAR U+784C +ENCODING 30796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0488 +FEFC +1108 +2188 +2250 +2020 +7C50 +A48E +2504 +27F8 +2508 +2508 +3D08 +21F8 +0108 +ENDCHAR +STARTCHAR U+784D +ENCODING 30797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0082 +7EFE +0882 +10FE +3C80 +6482 +24A2 +2494 +2488 +3C94 +24A2 +00C1 +0181 +0000 +0000 +ENDCHAR +STARTCHAR U+784E +ENCODING 30798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +FFE4 +1244 +1254 +2254 +2254 +3A54 +6FF4 +AA54 +2A54 +2A54 +2A54 +3A44 +2244 +0454 +0848 +ENDCHAR +STARTCHAR U+784F +ENCODING 30799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +0824 +0824 +0824 +1024 +1024 +3F37 +32EC +5224 +5224 +1244 +1244 +1244 +1E84 +1104 +ENDCHAR +STARTCHAR U+7850 +ENCODING 30800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FFFE +1204 +1204 +22F4 +2204 +3A04 +6AF4 +AA94 +2A94 +2A94 +2AF4 +2A94 +3A04 +2214 +0208 +ENDCHAR +STARTCHAR U+7852 +ENCODING 30802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0BFE +FC50 +1050 +1054 +21FE +2554 +7F54 +A554 +2554 +255C +2584 +2504 +3D04 +25FC +0104 +ENDCHAR +STARTCHAR U+7855 +ENCODING 30805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FDFE +1020 +1044 +21FE +2504 +3F24 +6524 +A524 +2524 +2524 +2524 +3C20 +2458 +0084 +0302 +ENDCHAR +STARTCHAR U+7856 +ENCODING 30806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC48 +17FC +1040 +2248 +2148 +3950 +6844 +AFFE +28A0 +28A0 +2910 +2910 +3A08 +240E +0804 +ENDCHAR +STARTCHAR U+7857 +ENCODING 30807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FE48 +107C +13C0 +2028 +2012 +3C6A +6586 +A400 +27FC +2490 +2490 +2490 +3D12 +2112 +060E +ENDCHAR +STARTCHAR U+785C +ENCODING 30812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +FE00 +1049 +1092 +1092 +1124 +3C92 +2492 +6449 +A400 +24FE +2410 +2410 +3C10 +0010 +01FF +ENDCHAR +STARTCHAR U+785D +ENCODING 30813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E44 +1144 +1148 +1050 +11F8 +3D08 +25F8 +6508 +25F8 +2508 +3D08 +2508 +0118 +0000 +ENDCHAR +STARTCHAR U+785E +ENCODING 30814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE90 +1090 +10FE +1190 +1110 +3C10 +25FF +6410 +A410 +2400 +24FE +2482 +3C82 +0082 +00FE +ENDCHAR +STARTCHAR U+7860 +ENCODING 30816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +10FE +1082 +1082 +10FE +3C82 +2482 +64FE +A4A0 +24A3 +249C +2490 +3C8C +00E6 +0183 +ENDCHAR +STARTCHAR U+7861 +ENCODING 30817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1010 +11FF +1101 +1121 +3C20 +25FF +6420 +A468 +2448 +24C8 +2492 +3D13 +013F +0001 +ENDCHAR +STARTCHAR U+7862 +ENCODING 30818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0028 +7C44 +0882 +117D +2010 +7C10 +2410 +24FE +2438 +2454 +3C92 +2511 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+7863 +ENCODING 30819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FE22 +10FA +1024 +1028 +13FF +3C20 +24C0 +677C +A408 +2410 +25FF +2410 +3C10 +0010 +0070 +ENDCHAR +STARTCHAR U+7864 +ENCODING 30820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +1010 +11FF +1010 +1052 +3C52 +2452 +64B5 +A539 +2428 +2428 +2444 +3C44 +0082 +0101 +ENDCHAR +STARTCHAR U+7865 +ENCODING 30821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +0121 +7D02 +0BE4 +1109 +2102 +7D44 +2549 +2542 +2544 +3D48 +2541 +0241 +047F +0000 +0000 +ENDCHAR +STARTCHAR U+7868 +ENCODING 30824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +10FE +1010 +1010 +10FE +3C92 +24FE +6492 +A4FE +2410 +2410 +25FF +3C10 +0010 +0010 +ENDCHAR +STARTCHAR U+7869 +ENCODING 30825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +7EFE +0840 +0C7F +7848 +0888 +1808 +0000 +7FFF +0400 +0FFC +1804 +2804 +4FFC +0000 +0000 +ENDCHAR +STARTCHAR U+786A +ENCODING 30826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +FE58 +1394 +1094 +2090 +23FE +3C90 +6490 +A4B4 +24D4 +2798 +2490 +24AA +3CCA +228A +0104 +ENDCHAR +STARTCHAR U+786B +ENCODING 30827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +13FC +1060 +1090 +3FE8 +2408 +6550 +2550 +2550 +3D50 +2554 +2254 +040C +0000 +ENDCHAR +STARTCHAR U+786C +ENCODING 30828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1040 +13F8 +1248 +23F8 +3E48 +67F8 +2648 +2540 +3C80 +20C0 +2330 +0C0C +0000 +ENDCHAR +STARTCHAR U+786D +ENCODING 30829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0488 +FE88 +13FE +1088 +2088 +2020 +3C24 +67FE +A500 +2500 +2500 +2500 +2500 +3D08 +20FC +0000 +ENDCHAR +STARTCHAR U+786E +ENCODING 30830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0440 +FE78 +1090 +1124 +23FE +2524 +7D24 +A5FC +2524 +2524 +25FC +2524 +3D24 +2224 +040C +ENDCHAR +STARTCHAR U+786F +ENCODING 30831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +1108 +1108 +11F8 +1108 +3DF8 +2508 +65F8 +24A0 +24A0 +3D24 +2224 +041C +0000 +ENDCHAR +STARTCHAR U+7870 +ENCODING 30832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +0924 +2122 +1129 +0010 +1020 +23C0 +0000 +7FFF +0400 +0FFC +1804 +6804 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7871 +ENCODING 30833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +0101 +7D11 +0911 +11FF +2111 +7D11 +2539 +2555 +2593 +2511 +3D11 +2501 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+7872 +ENCODING 30834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +7E90 +1108 +1248 +1040 +3CA0 +24A0 +6510 +27F8 +2514 +3D10 +2110 +21F0 +0110 +0000 +ENDCHAR +STARTCHAR U+7874 +ENCODING 30836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +7C90 +13FC +1090 +1090 +3CA0 +24A4 +6528 +2730 +2520 +3D20 +2524 +2124 +011C +0000 +ENDCHAR +STARTCHAR U+7877 +ENCODING 30839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +FCA0 +10A0 +1110 +220E +2DF4 +7800 +A840 +2A48 +294C +2948 +2950 +3804 +27FE +0000 +ENDCHAR +STARTCHAR U+7879 +ENCODING 30841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0114 +7914 +17D4 +2122 +7941 +2900 +2B88 +2D48 +2908 +3910 +2922 +017F +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+787A +ENCODING 30842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +FE20 +1020 +1042 +10A2 +1134 +3CD8 +2490 +6578 +A458 +2494 +2514 +2412 +3C21 +0140 +0080 +ENDCHAR +STARTCHAR U+787B +ENCODING 30843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FBF +4421 +7F91 +408A +7F84 +440A +7F91 +0000 +7FFF +0800 +17FC +2404 +4404 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+787C +ENCODING 30844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FB8 +12A8 +12A8 +12A8 +3BB8 +2AA8 +6AA8 +2BB8 +2AA8 +3AA8 +2CC8 +24C8 +0998 +0000 +ENDCHAR +STARTCHAR U+787E +ENCODING 30846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +FE78 +10D0 +1010 +1010 +11FF +3C92 +2492 +67FF +A492 +2492 +25FF +2410 +3C10 +0010 +01FF +ENDCHAR +STARTCHAR U+787F +ENCODING 30847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0020 +FBFE +2252 +2252 +4090 +F90E +4800 +49FC +4820 +4820 +4820 +7820 +03FE +0000 +0000 +ENDCHAR +STARTCHAR U+7880 +ENCODING 30848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +01FE +7E54 +1092 +1111 +20FE +7E12 +23FF +2212 +22FE +3E10 +2210 +0010 +0070 +0000 +0000 +ENDCHAR +STARTCHAR U+7881 +ENCODING 30849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +07C0 +07C0 +0440 +7FFC +0820 +1FF0 +620C +0FE0 +3420 +07E0 +0420 +0000 +ENDCHAR +STARTCHAR U+7883 +ENCODING 30851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +00FE +7C10 +10FE +1010 +21FF +7C00 +24FE +2482 +24FE +2482 +3CFE +2482 +0086 +0000 +0000 +ENDCHAR +STARTCHAR U+7884 +ENCODING 30852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +0044 +7E44 +11FF +1044 +1044 +2044 +7CEE +2555 +2444 +2444 +3C44 +2444 +0044 +0000 +0000 +ENDCHAR +STARTCHAR U+7885 +ENCODING 30853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +7D01 +117D +1111 +2111 +7DFF +2511 +2539 +2555 +2593 +3D11 +2501 +01FF +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+7886 +ENCODING 30854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BFC +4248 +23F8 +0A90 +1260 +24F0 +2B0C +7FFC +0400 +1FF0 +6810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+7887 +ENCODING 30855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +11FC +1108 +1200 +3FFC +2420 +64A0 +24B8 +24A0 +3CA0 +25A0 +2260 +041C +0000 +ENDCHAR +STARTCHAR U+7889 +ENCODING 30857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FDFE +1124 +1124 +21FC +2524 +3F24 +65FC +A504 +2574 +2554 +2554 +2574 +3D04 +2214 +0408 +ENDCHAR +STARTCHAR U+788A +ENCODING 30858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +FE44 +13FE +1040 +1028 +1031 +3C69 +2587 +6448 +A444 +25FE +2440 +2428 +3C31 +0069 +0187 +ENDCHAR +STARTCHAR U+788C +ENCODING 30860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7EF0 +1110 +11E0 +1020 +3FFC +2668 +6568 +2550 +24D0 +3D48 +2644 +2040 +00C0 +0000 +ENDCHAR +STARTCHAR U+788D +ENCODING 30861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7DF8 +1108 +11F8 +1108 +3DF8 +2400 +65F8 +2410 +27FC +3D10 +2090 +2090 +0030 +0000 +ENDCHAR +STARTCHAR U+788E +ENCODING 30862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +13FC +1090 +1090 +3C98 +2564 +6664 +2420 +27FC +3C20 +2420 +2020 +0020 +0000 +ENDCHAR +STARTCHAR U+788F +ENCODING 30863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +FE48 +1048 +11FE +1048 +1048 +3C48 +27FF +6400 +A4FC +2484 +2484 +24FC +3C84 +0084 +00FC +ENDCHAR +STARTCHAR U+7891 +ENCODING 30865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +1080 +13F8 +1248 +13F8 +3E48 +27F8 +64A0 +2520 +27FC +3C20 +2020 +2020 +0000 +ENDCHAR +STARTCHAR U+7893 +ENCODING 30867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +7E90 +10A0 +11FC +1120 +3F20 +25F8 +6520 +2520 +25F8 +3D20 +2520 +21FC +0100 +0000 +ENDCHAR +STARTCHAR U+7894 +ENCODING 30868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +FE0A +11E9 +1009 +1008 +13FF +3C08 +2448 +6448 +A448 +247C +2545 +2545 +3D47 +0173 +03C1 +ENDCHAR +STARTCHAR U+7895 +ENCODING 30869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +13FC +1060 +1090 +3D10 +27FC +6408 +25E8 +2528 +3D28 +21E8 +2108 +0018 +0000 +ENDCHAR +STARTCHAR U+7896 +ENCODING 30870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0028 +7E44 +1082 +117D +2000 +7EFE +22AA +22AA +22FE +22AA +3EAA +22AA +0086 +0000 +0000 +ENDCHAR +STARTCHAR U+7897 +ENCODING 30871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +13FC +1208 +1100 +21F8 +3D68 +6568 +26E8 +26B8 +3CA0 +2524 +2224 +041C +0000 +ENDCHAR +STARTCHAR U+7898 +ENCODING 30872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +0450 +FE54 +11FE +1154 +2154 +2554 +3FFC +6554 +A554 +2554 +27FE +2400 +3C88 +2586 +0202 +ENDCHAR +STARTCHAR U+7899 +ENCODING 30873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +7D01 +1145 +1129 +2111 +7DFF +2511 +2555 +2555 +2555 +3D7D +2501 +0105 +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+789A +ENCODING 30874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +13F8 +1110 +1090 +3CA0 +27FC +6400 +25F8 +2508 +3D08 +2508 +21F8 +0108 +0000 +ENDCHAR +STARTCHAR U+789B +ENCODING 30875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FC24 +13FE +1020 +21FC +2420 +3FFE +6400 +A5FC +2504 +2524 +2524 +2524 +3C58 +2084 +0302 +ENDCHAR +STARTCHAR U+789C +ENCODING 30876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC90 +1108 +13FC +2040 +27FE +3890 +6928 +AA46 +2D94 +2820 +28C8 +2B10 +3820 +20C0 +0300 +ENDCHAR +STARTCHAR U+789D +ENCODING 30877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +FE10 +1020 +10FE +10AA +10AA +3CAA +24AA +6410 +A410 +25FF +2410 +2438 +3C6C +00C6 +0101 +ENDCHAR +STARTCHAR U+789E +ENCODING 30878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07F0 +0410 +0410 +07F0 +0000 +3F7E +2142 +2142 +3F7E +0000 +7FFF +0400 +0FFC +1404 +6404 +07FC +ENDCHAR +STARTCHAR U+789F +ENCODING 30879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +0950 +FD54 +13FE +1150 +2150 +2570 +3F00 +65FC +A420 +27FE +2470 +24A8 +3D26 +2224 +0020 +ENDCHAR +STARTCHAR U+78A0 +ENCODING 30880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +7C00 +10FE +1082 +20FE +7C00 +25FF +2501 +257D +3C10 +0010 +0050 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+78A1 +ENCODING 30881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFC +1020 +11FC +2020 +23FE +3C00 +65FC +A544 +2524 +27FE +2544 +2524 +3DFE +2004 +0018 +ENDCHAR +STARTCHAR U+78A2 +ENCODING 30882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0082 +7E9E +2092 +2092 +21FF +4101 +3D01 +257D +2545 +2545 +257D +3D01 +0107 +0000 +0000 +ENDCHAR +STARTCHAR U+78A3 +ENCODING 30883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF0 +1110 +11F0 +1110 +3DF0 +2480 +64F8 +2548 +2768 +3D98 +25E8 +2108 +0030 +0000 +ENDCHAR +STARTCHAR U+78A4 +ENCODING 30884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +FE44 +11EF +1044 +1054 +1010 +3CFE +2492 +6492 +A492 +25FF +2410 +2428 +3C44 +0082 +0101 +ENDCHAR +STARTCHAR U+78A5 +ENCODING 30885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC24 +13FE +1204 +2204 +23FC +3A00 +6A04 +ABFE +2B54 +2B54 +2DFC +2954 +3954 +2154 +010C +ENDCHAR +STARTCHAR U+78A7 +ENCODING 30887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F40 +08F8 +3E88 +08F8 +0F88 +70F8 +0000 +7FFC +0200 +07F0 +1C10 +67F0 +0410 +0000 +ENDCHAR +STARTCHAR U+78A8 +ENCODING 30888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +FE92 +1092 +10FE +1092 +1092 +3CFE +2400 +67FF +A480 +24A2 +2494 +2488 +3CA4 +00C2 +0081 +ENDCHAR +STARTCHAR U+78A9 +ENCODING 30889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1040 +1080 +11F8 +3D08 +25F8 +6508 +25F8 +2508 +3DF8 +2090 +2308 +0C04 +0000 +ENDCHAR +STARTCHAR U+78AA +ENCODING 30890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +7C90 +13FC +1090 +10F0 +3C90 +24F0 +6490 +27FC +2550 +3D54 +258C +21FC +0100 +0000 +ENDCHAR +STARTCHAR U+78AB +ENCODING 30891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +002E +03CA +7D0A +110A +11EB +2113 +7D00 +25FF +2511 +2511 +27EA +3D04 +010A +0111 +0000 +0000 +ENDCHAR +STARTCHAR U+78AC +ENCODING 30892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +FF21 +1121 +11EF +1100 +1100 +3D00 +25EF +6501 +A50B +250A +25E6 +2504 +3D0E +0109 +0111 +ENDCHAR +STARTCHAR U+78AD +ENCODING 30893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +FE82 +10FE +1082 +10FE +1000 +3DFF +2440 +647F +A455 +2495 +2525 +2449 +3C92 +0022 +000C +ENDCHAR +STARTCHAR U+78AF +ENCODING 30895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0248 +7A48 +1490 +1248 +1248 +3880 +2BF8 +6A28 +2BA8 +2A48 +3AA8 +2B18 +23F8 +0208 +0000 +ENDCHAR +STARTCHAR U+78B0 +ENCODING 30896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +0888 +FC90 +2008 +23FC +4090 +4890 +7C92 +CA96 +4A94 +4A98 +4890 +4890 +7894 +47FE +0000 +ENDCHAR +STARTCHAR U+78B1 +ENCODING 30897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1018 +F814 +27FE +2410 +4410 +55D0 +7C14 +D5D4 +5554 +5554 +5558 +55D0 +752A +4846 +1082 +ENDCHAR +STARTCHAR U+78B2 +ENCODING 30898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FE24 +11FE +1088 +2050 +23FE +3E22 +6424 +A5FE +2524 +2524 +2534 +2528 +3C20 +2020 +0020 +ENDCHAR +STARTCHAR U+78B3 +ENCODING 30899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0820 +FD24 +1124 +11FC +2080 +23FE +7C80 +A4A0 +2524 +25A8 +2650 +2450 +3C88 +250E +0204 +ENDCHAR +STARTCHAR U+78B4 +ENCODING 30900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0840 +FC44 +17FE +10E0 +2150 +224E +7C44 +ABF8 +2A08 +2BF8 +2A08 +2BF8 +3804 +27FE +0000 +ENDCHAR +STARTCHAR U+78B5 +ENCODING 30901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +107C +1040 +11F8 +3D08 +25F8 +6508 +25F8 +2508 +3DF8 +2490 +2108 +0604 +0000 +ENDCHAR +STARTCHAR U+78B9 +ENCODING 30905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FE20 +13FE +1202 +2404 +21FC +3C00 +65FC +A504 +25FC +2504 +25FC +2400 +3C04 +23FE +0000 +ENDCHAR +STARTCHAR U+78BA +ENCODING 30906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +11FC +1148 +1290 +3CA0 +25FC +6720 +25F8 +2520 +3DF8 +2520 +21FC +0100 +0000 +ENDCHAR +STARTCHAR U+78BB +ENCODING 30907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7E10 +11FF +1000 +10FE +2082 +20FE +7C00 +65FF +6501 +257D +2545 +257D +2545 +3D01 +2503 +ENDCHAR +STARTCHAR U+78BC +ENCODING 30908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1120 +11F8 +1120 +3DF8 +2520 +6520 +25FC +2454 +3F2C +22AC +2284 +0418 +0000 +ENDCHAR +STARTCHAR U+78BD +ENCODING 30909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +FE10 +1010 +11FF +1000 +10FE +3C82 +24FE +6482 +A4FE +2482 +24FE +2400 +3C44 +0082 +0101 +ENDCHAR +STARTCHAR U+78BE +ENCODING 30910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7DF8 +1108 +11F8 +1150 +3D50 +25F8 +6550 +2550 +25FC +3EA8 +2290 +04E8 +0984 +0000 +ENDCHAR +STARTCHAR U+78BF +ENCODING 30911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FF +FE01 +23FF +2210 +2254 +2292 +7B11 +4AFE +CA82 +4AFE +4A82 +4AFE +4A82 +7A82 +0482 +090E +ENDCHAR +STARTCHAR U+78C1 +ENCODING 30913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +7C90 +10A0 +17FC +1110 +2110 +3954 +6E64 +2998 +2888 +3910 +2AA8 +27FC +0044 +0000 +ENDCHAR +STARTCHAR U+78C3 +ENCODING 30915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FF8 +2110 +211E +2110 +217F +4151 +3D7E +2550 +255E +2540 +2654 +2495 +3D27 +0000 +0000 +ENDCHAR +STARTCHAR U+78C4 +ENCODING 30916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +03FF +7A10 +12FE +1212 +3BFF +6A12 +2AFE +2A10 +2AFE +3A82 +0282 +04FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+78C5 +ENCODING 30917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +13F8 +1110 +10A0 +3FFC +2648 +6440 +27FC +2440 +3C78 +2488 +2108 +0630 +0000 +ENDCHAR +STARTCHAR U+78C6 +ENCODING 30918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF0 +1110 +1170 +1150 +3FFC +2608 +65F0 +2510 +25F0 +3D10 +25F0 +2110 +0130 +0000 +ENDCHAR +STARTCHAR U+78C7 +ENCODING 30919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE20 +11FE +1102 +114A +1132 +3D4A +2502 +65FE +A488 +2488 +24EE +2488 +3C89 +0089 +01E7 +ENDCHAR +STARTCHAR U+78C8 +ENCODING 30920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FE40 +11FC +1124 +1124 +11FC +3D24 +2524 +65FC +A4A4 +24A4 +24A9 +24AF +3D21 +0121 +021F +ENDCHAR +STARTCHAR U+78C9 +ENCODING 30921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +05FC +FE88 +1070 +1088 +2106 +23FC +3D54 +6488 +A554 +2422 +27FE +2470 +24A8 +3D26 +2220 +0020 +ENDCHAR +STARTCHAR U+78CA +ENCODING 30922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0200 +07F0 +1C10 +67F0 +0410 +7EFC +1040 +1E78 +32C8 +5348 +1E78 +1248 +0000 +ENDCHAR +STARTCHAR U+78CB +ENCODING 30923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +7CA0 +13F8 +1040 +11F0 +3C40 +27FC +6480 +24F8 +2520 +3D20 +2620 +27FC +0000 +0000 +ENDCHAR +STARTCHAR U+78CC +ENCODING 30924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +FEFC +1081 +107F +1000 +107E +3D42 +257E +6542 +A57E +2542 +257E +2500 +3DFF +0044 +0082 +ENDCHAR +STARTCHAR U+78CD +ENCODING 30925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +7C21 +11FC +1020 +3DFC +6420 +27FE +2400 +25FC +2504 +3D04 +01FC +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+78CE +ENCODING 30926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001E +7EE4 +10A2 +1111 +2040 +2050 +4190 +7CA4 +645E +27E1 +2420 +27FF +2420 +2450 +3C8C +2303 +ENDCHAR +STARTCHAR U+78CF +ENCODING 30927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +0088 +7FFF +1050 +23FE +7852 +2FFF +2852 +2BFE +2954 +3A52 +0451 +0050 +0050 +0000 +0000 +ENDCHAR +STARTCHAR U+78D0 +ENCODING 30928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +3E70 +3254 +2A8C +7FF8 +2A50 +2A30 +47CC +3FF8 +0200 +0FF0 +7410 +07F0 +0410 +0000 +ENDCHAR +STARTCHAR U+78D1 +ENCODING 30929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E48 +13F8 +1000 +17FC +3C00 +25F0 +6510 +2510 +25F0 +3D10 +24A0 +27FC +0000 +0000 +ENDCHAR +STARTCHAR U+78D2 +ENCODING 30930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FC +FC84 +2084 +20FC +2000 +21FE +7902 +49FE +C902 +49FE +4902 +49FE +4800 +7884 +0102 +0201 +ENDCHAR +STARTCHAR U+78D3 +ENCODING 30931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +FA10 +237E +2142 +2042 +2042 +787E +4B40 +C940 +497E +4942 +4942 +4942 +7B7E +0280 +067F +ENDCHAR +STARTCHAR U+78D4 +ENCODING 30932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +7D08 +11BC +12A8 +16A8 +39FC +2948 +6A48 +2FFC +28E0 +3950 +2A48 +2444 +0040 +0000 +ENDCHAR +STARTCHAR U+78D5 +ENCODING 30933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0428 +FFFC +1020 +1024 +21FE +2040 +7C88 +A5FC +2400 +25FC +2554 +2554 +3D54 +23FE +0000 +ENDCHAR +STARTCHAR U+78D6 +ENCODING 30934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBDF +2249 +2145 +20C3 +2145 +7A49 +4820 +C840 +49FE +4902 +4902 +49FE +7902 +0102 +01FE +ENDCHAR +STARTCHAR U+78D9 +ENCODING 30937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC24 +17FE +1108 +2246 +2492 +3908 +6BFC +A880 +2888 +2950 +2B20 +2D10 +3948 +218E +0104 +ENDCHAR +STARTCHAR U+78DA +ENCODING 30938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FFC +1040 +11F8 +1148 +3DF8 +2548 +65F8 +2448 +27FC +3C10 +27FC +2090 +0070 +0000 +ENDCHAR +STARTCHAR U+78DB +ENCODING 30939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +FF8E +0838 +7F20 +493F +7F24 +4924 +7F64 +0844 +FF84 +0804 +FFFF +0400 +3FFC +E804 +0FFC +ENDCHAR +STARTCHAR U+78DD +ENCODING 30941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0088 +7BEF +108A +2092 +7BE2 +288A +2BEA +290A +29EA +292A +392A +0224 +00DB +0000 +0000 +ENDCHAR +STARTCHAR U+78DE +ENCODING 30942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +7A22 +13FE +1000 +23DE +7A52 +2A52 +2BDE +2A52 +2A52 +3BDE +2A52 +0252 +04E6 +0000 +0000 +ENDCHAR +STARTCHAR U+78DF +ENCODING 30943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBDE +2042 +214A +20C6 +214A +7822 +4870 +C9DC +4F07 +4820 +49C8 +4832 +79C4 +0018 +01E0 +ENDCHAR +STARTCHAR U+78E0 +ENCODING 30944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FC20 +203E +2020 +2020 +23FE +7A22 +4A8A +CA52 +4A52 +4B26 +4A52 +4A52 +7A8A +0222 +03FE +ENDCHAR +STARTCHAR U+78E1 +ENCODING 30945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0248 +FA48 +27E8 +2248 +23DF +2249 +73C9 +5249 +D7E9 +5549 +5549 +5669 +5409 +7419 +07D1 +0037 +ENDCHAR +STARTCHAR U+78E2 +ENCODING 30946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +07FF +7820 +12AA +1124 +22AA +7820 +2AAA +2924 +2AAA +3820 +2850 +0088 +0707 +0000 +0000 +ENDCHAR +STARTCHAR U+78E3 +ENCODING 30947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0084 +79FE +1108 +1252 +27FF +3888 +6924 +2A42 +2D91 +2824 +39C8 +2810 +03E0 +0000 +0000 +ENDCHAR +STARTCHAR U+78E4 +ENCODING 30948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00C0 +FB9E +2212 +23D2 +2252 +23E3 +7240 +527F +D3D3 +5212 +53D6 +5254 +564C +74D8 +0C96 +01B3 +ENDCHAR +STARTCHAR U+78E5 +ENCODING 30949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +0092 +7CFE +0892 +10FE +3C24 +6448 +24F0 +2422 +25FF +2454 +3C92 +2511 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+78E6 +ENCODING 30950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBFF +2048 +23FF +2249 +2249 +7BFF +4800 +C9FE +4800 +4BFF +4820 +4924 +7B26 +0623 +00E0 +ENDCHAR +STARTCHAR U+78E7 +ENCODING 30951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FF8 +1040 +11F0 +1040 +3FFC +25F0 +6510 +25F0 +25F0 +3D10 +25F0 +2190 +0608 +0000 +ENDCHAR +STARTCHAR U+78E8 +ENCODING 30952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1210 +1FFC +1738 +1AD4 +1290 +17FC +1080 +23F8 +2E08 +43F8 +0208 +0000 +ENDCHAR +STARTCHAR U+78E9 +ENCODING 30953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0005 +7BFF +1244 +2244 +7A74 +2A44 +2BFC +2A45 +2A46 +2AE4 +3B54 +2A4D +0453 +00C1 +0000 +0000 +ENDCHAR +STARTCHAR U+78EA +ENCODING 30954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FA22 +2222 +23FE +2110 +2120 +7BFE +4A20 +CE20 +4BFE +4A20 +4A20 +4BFE +7A20 +0220 +03FF +ENDCHAR +STARTCHAR U+78EC +ENCODING 30956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7F70 +0854 +3E8C +3FF8 +2A50 +3E70 +218C +7FF8 +0400 +1FF0 +6810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+78ED +ENCODING 30957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +7D00 +11FF +1100 +11FF +214A +7D44 +256A +24FF +2481 +24FF +3C81 +24FF +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+78EF +ENCODING 30959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0150 +7D50 +1268 +16D8 +1150 +3AE8 +2FFC +6850 +2BFC +2B28 +3AA8 +2A94 +042C +08C4 +0000 +ENDCHAR +STARTCHAR U+78F2 +ENCODING 30962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A04 +FF7E +1140 +147C +2244 +20FC +3940 +6A7E +AA40 +2844 +2FFE +28E0 +2950 +3A4E +2444 +0040 +ENDCHAR +STARTCHAR U+78F3 +ENCODING 30963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +FC84 +23FF +2221 +2221 +23FF +7A21 +4A21 +CBFF +4800 +49FE +4902 +49FE +7902 +0102 +01FE +ENDCHAR +STARTCHAR U+78F4 +ENCODING 30964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01D0 +7E54 +12A4 +11A8 +1110 +3FF8 +2404 +65F8 +2508 +25F8 +3C90 +2460 +27FC +0000 +0000 +ENDCHAR +STARTCHAR U+78F5 +ENCODING 30965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3DEF +1129 +11EF +1129 +11EF +2101 +3D01 +3539 +3529 +5539 +5529 +1539 +1501 +1501 +1D07 +ENDCHAR +STARTCHAR U+78F6 +ENCODING 30966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00C0 +FD9E +2102 +2102 +21DE +2102 +7902 +49FE +C880 +49FF +4B01 +4E05 +4955 +7951 +0203 +000E +ENDCHAR +STARTCHAR U+78F7 +ENCODING 30967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FD24 +10A8 +13FE +2070 +20A8 +7D26 +A6A4 +24A4 +25DE +2654 +2554 +24BE +3D04 +2204 +0004 +ENDCHAR +STARTCHAR U+78F9 +ENCODING 30969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +7C50 +13FE +1252 +23FE +7800 +29FC +2904 +29FC +2904 +29FC +2820 +3BFE +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+78FA +ENCODING 30970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0888 +FDFC +1088 +1088 +23FE +3C24 +65FE +A524 +25FC +2524 +25FC +3C00 +2488 +0106 +0602 +ENDCHAR +STARTCHAR U+78FB +ENCODING 30971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001E +7DF0 +1092 +1054 +13FF +2038 +2054 +7C92 +6711 +6410 +24FE +2492 +24FE +2492 +3CFE +2482 +ENDCHAR +STARTCHAR U+78FC +ENCODING 30972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +7DFE +1310 +11FC +2110 +79FC +2910 +29FE +2810 +2BFF +3894 +2B13 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+78FD +ENCODING 30973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FF8 +1040 +17FC +1110 +3FBC +2910 +69BC +2E00 +2FFC +38A0 +28A4 +2124 +061C +0000 +ENDCHAR +STARTCHAR U+78FE +ENCODING 30974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03DE +0252 +7E52 +13DE +1000 +21FC +7924 +29FC +2924 +29FC +2820 +3BFE +0020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+78FF +ENCODING 30975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +438E +4E38 +4208 +5FBF +471C +5AAB +4208 +4000 +5FFF +C100 +83FC +8E04 +3A04 +03FC +ENDCHAR +STARTCHAR U+7900 +ENCODING 30976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBDF +2251 +23DF +2251 +23DF +7A01 +4A79 +CA49 +4A49 +4A79 +4A49 +4A49 +7A79 +0201 +0207 +ENDCHAR +STARTCHAR U+7901 +ENCODING 30977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +7E90 +10A0 +11FC +1120 +3FF8 +2520 +65F8 +2520 +25FC +3C00 +22A8 +2254 +0404 +0000 +ENDCHAR +STARTCHAR U+7902 +ENCODING 30978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +01FF +7E10 +08FE +0800 +10FE +2082 +7CFE +2444 +25FF +2444 +24FE +3C82 +00FE +0000 +0000 +ENDCHAR +STARTCHAR U+7904 +ENCODING 30980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FC +7C20 +13FE +1088 +2174 +7A52 +2C71 +2800 +2BFE +2A02 +2A72 +3A52 +2A72 +0206 +0000 +0000 +ENDCHAR +STARTCHAR U+7905 +ENCODING 30981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0910 +FD10 +17D0 +101E +27E4 +2444 +3FD4 +6814 +AFD4 +2894 +2908 +29C8 +2F14 +3914 +2522 +0240 +ENDCHAR +STARTCHAR U+7906 +ENCODING 30982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FC70 +20D8 +218C +2707 +20F8 +7800 +4BDE +CA52 +4A52 +4BDE +4800 +4904 +7904 +038E +06DB +ENDCHAR +STARTCHAR U+7907 +ENCODING 30983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FF8 +12E8 +1358 +12E8 +3BF8 +2AE8 +6B58 +2A48 +2840 +3FFC +28A0 +2110 +060C +0000 +ENDCHAR +STARTCHAR U+7909 +ENCODING 30985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +7FC8 +125F +13E2 +2242 +7BD2 +2912 +2BD2 +2912 +29D2 +294C +3A4C +0052 +01A1 +0000 +0000 +ENDCHAR +STARTCHAR U+790C +ENCODING 30988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +F9FE +2020 +23FF +2221 +22AD +7A21 +4AAC +C800 +49FE +4922 +4922 +49FE +7922 +0122 +01FE +ENDCHAR +STARTCHAR U+790E +ENCODING 30990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +7D10 +17FC +1110 +13B8 +3B54 +2D10 +6BFC +2848 +2A40 +3A78 +2340 +24C0 +083C +0000 +ENDCHAR +STARTCHAR U+7910 +ENCODING 30992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C00 +3A5C +2184 +3A5C +2004 +3A5C +2184 +2244 +7FFE +4002 +5FFA +0400 +0FF8 +3808 +E808 +0FF8 +ENDCHAR +STARTCHAR U+7911 +ENCODING 30993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0248 +7D50 +13FC +1208 +15F0 +3910 +29F0 +6800 +2BF8 +2A48 +3BF8 +2A48 +23F8 +0208 +0000 +ENDCHAR +STARTCHAR U+7912 +ENCODING 30994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +7FFC +1040 +13F8 +1040 +3FFC +28A8 +6F24 +2FFC +2928 +3998 +2F34 +21CC +0304 +0000 +ENDCHAR +STARTCHAR U+7913 +ENCODING 30995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BFE +FC00 +11FC +1124 +21FC +2524 +3FFE +6400 +A5FC +2524 +25FC +2524 +25FC +3C00 +23FE +0000 +ENDCHAR +STARTCHAR U+7914 +ENCODING 30996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +7FE4 +125F +124A +23CA +7A0A +2A3F +2BC4 +2E44 +2A5F +2A44 +3A44 +2BC4 +0244 +0000 +0000 +ENDCHAR +STARTCHAR U+7916 +ENCODING 30998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7DA6 +1132 +1122 +1122 +21BE +2102 +3D3A +65CE +652A +652A +27FF +2400 +2484 +3D02 +2601 +ENDCHAR +STARTCHAR U+7917 +ENCODING 30999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7FFF +2101 +217D +2058 +2090 +41FC +3C44 +247C +2444 +247C +2444 +247C +3C82 +0000 +0000 +ENDCHAR +STARTCHAR U+7919 +ENCODING 31001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +7CFC +1728 +1490 +1390 +3A7C +2B94 +6D58 +2950 +2FDC +3B50 +2AF0 +2450 +088C +0000 +ENDCHAR +STARTCHAR U+791A +ENCODING 31002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +F904 +27FF +2104 +2020 +23FE +7820 +4FFF +C888 +4904 +4BFA +4800 +4BFE +7A52 +0252 +07FF +ENDCHAR +STARTCHAR U+791B +ENCODING 31003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03E8 +0288 +7FEF +1228 +23EC +7A92 +2BE0 +2800 +2BFE +2A52 +3A52 +2A52 +0252 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+791C +ENCODING 31004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0D00 +39DC +2104 +39DC +2244 +3A5C +2244 +FFFF +1008 +300C +6FF6 +C403 +0FF8 +3808 +E808 +0FF8 +ENDCHAR +STARTCHAR U+791D +ENCODING 31005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +0010 +7DFF +1155 +1133 +2044 +7C00 +25FF +2420 +25FF +2529 +3D29 +2529 +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+791E +ENCODING 31006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +FFFE +2110 +27FE +2402 +49F4 +7000 +D7FC +5080 +5148 +5670 +50B0 +5768 +70A6 +4720 +0060 +ENDCHAR +STARTCHAR U+791F +ENCODING 31007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +FFD2 +248E +2484 +27CA +24B1 +7480 +57D1 +D491 +5491 +57EA +502A +5564 +756A +0AAA +0051 +ENDCHAR +STARTCHAR U+7920 +ENCODING 31008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +F888 +27FF +2088 +2104 +2208 +7492 +5514 +D249 +57DF +5041 +5020 +52B2 +7293 +06C5 +047C +ENDCHAR +STARTCHAR U+7921 +ENCODING 31009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +7BFF +1014 +11FF +20FE +3892 +68FE +2892 +28FE +2892 +29FF +2844 +3824 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+7923 +ENCODING 31011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7DEF +2044 +21FF +2129 +21FF +400A +3C09 +24FF +2489 +24CA +24AD +250D +3C13 +0000 +0000 +ENDCHAR +STARTCHAR U+7924 +ENCODING 31012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +FFFE +2110 +2220 +23BC +44A4 +7B18 +D608 +55F4 +5802 +57FC +5040 +5150 +724C +4444 +00C0 +ENDCHAR +STARTCHAR U+7925 +ENCODING 31013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03EF +FE81 +23C9 +224A +23C4 +228A +7BE9 +4800 +C9FC +4904 +49FC +4904 +49FC +7904 +01FC +0707 +ENDCHAR +STARTCHAR U+7926 +ENCODING 31014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FFC +1250 +13FC +1250 +3A70 +2BFC +6AF8 +2AA8 +2AF8 +3AA8 +2CF8 +24C8 +0B04 +0000 +ENDCHAR +STARTCHAR U+7927 +ENCODING 31015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FDFC +2124 +21FC +2124 +2124 +71FC +5000 +D7DF +5555 +5555 +57DF +5555 +7555 +07DF +0000 +ENDCHAR +STARTCHAR U+7928 +ENCODING 31016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1084 +1FF4 +1FFC +7F7F +4949 +7D7D +7F7F +0000 +7FFF +0800 +1FFC +2804 +4FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7929 +ENCODING 31017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00C3 +FB9E +2210 +23DF +2294 +24A4 +7800 +49FC +C904 +49FC +4904 +49FC +4904 +79FC +0088 +0707 +ENDCHAR +STARTCHAR U+792A +ENCODING 31018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1250 +13FC +12F8 +3AA8 +2AF8 +6AA8 +2AF8 +2BFC +3D34 +25FC +2904 +010C +0000 +ENDCHAR +STARTCHAR U+792B +ENCODING 31019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0248 +7E48 +13EC +15B4 +12E8 +3AA8 +2DF4 +6F5C +2840 +2FFC +38E0 +2950 +264C +0040 +0000 +ENDCHAR +STARTCHAR U+792C +ENCODING 31020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1290 +7D7C +1A90 +36B8 +5154 +1290 +7FFC +0420 +1FF0 +620C +0FF0 +3410 +07F0 +0000 +ENDCHAR +STARTCHAR U+792D +ENCODING 31021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +FC20 +23FE +2222 +22AA +2222 +78A8 +4800 +C888 +49FE +4B10 +4DFC +4910 +79FC +0110 +01FF +ENDCHAR +STARTCHAR U+792F +ENCODING 31023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0154 +7F8E +2104 +228A +27FF +2421 +4040 +3C88 +25F0 +2422 +27FE +24A8 +2524 +3E22 +0000 +0000 +ENDCHAR +STARTCHAR U+7931 +ENCODING 31025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3F +2220 +FFBE +2202 +3E3E +2220 +3E3C +2221 +261F +0000 +FFFF +0800 +3FFC +E804 +0FFC +ENDCHAR +STARTCHAR U+7934 +ENCODING 31028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +FFFE +2128 +2BFE +2420 +41FC +7924 +D5FC +5524 +51FC +5524 +57FE +5488 +7848 +4808 +0018 +ENDCHAR +STARTCHAR U+7935 +ENCODING 31029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FBFF +2020 +23FF +2221 +22AD +7A21 +48AC +C800 +488F +4BE9 +488F +49C9 +7AAF +0089 +008F +ENDCHAR +STARTCHAR U+7938 +ENCODING 31032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +014A +09EF +7C42 +21EF +20C6 +216B +7CFE +2482 +24FE +2482 +24FE +3C82 +24FE +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+7939 +ENCODING 31033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +0129 +7DEF +13FF +22E4 +7A44 +2BF7 +2AAA +2AE2 +2AAA +2AEA +3AA6 +03F6 +0429 +0000 +0000 +ENDCHAR +STARTCHAR U+793A +ENCODING 31034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0000 +0000 +0000 +7FFC +0100 +0920 +0910 +1108 +1108 +2104 +4104 +0300 +0000 +ENDCHAR +STARTCHAR U+793B +ENCODING 31035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +0000 +1FC0 +0080 +0100 +0100 +0380 +0540 +0900 +1100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+793C +ENCODING 31036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7E40 +0440 +0840 +0840 +1C40 +2A40 +4A40 +0840 +0844 +0844 +083C +0000 +ENDCHAR +STARTCHAR U+793D +ENCODING 31037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1044 +FC44 +0444 +0C44 +0844 +1847 +3041 +7C41 +D641 +10C1 +1083 +1082 +1182 +130E +ENDCHAR +STARTCHAR U+793E +ENCODING 31038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7E40 +0440 +09F8 +0C40 +1A40 +2A40 +4840 +0840 +0840 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+793F +ENCODING 31039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +FCFE +0482 +0D82 +0802 +1862 +3032 +7C12 +D602 +1002 +1002 +1006 +1004 +101C +ENDCHAR +STARTCHAR U+7940 +ENCODING 31040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +0088 +0088 +7F88 +0888 +2AF8 +2A88 +2A80 +2A80 +2A80 +2A84 +4884 +087C +0000 +ENDCHAR +STARTCHAR U+7941 +ENCODING 31041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +7E90 +0290 +04A0 +0890 +1C88 +2A84 +4A84 +08C4 +08B8 +0880 +0880 +0000 +ENDCHAR +STARTCHAR U+7942 +ENCODING 31042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1090 +0890 +7C90 +09FE +1092 +3892 +5494 +1090 +1090 +1081 +1081 +10FF +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+7944 +ENCODING 31044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +1028 +FC6C +0444 +0CC6 +0945 +1844 +3044 +7C44 +D644 +1044 +1044 +10C4 +1084 +1184 +ENDCHAR +STARTCHAR U+7945 +ENCODING 31045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +10F0 +FC10 +0410 +0C10 +09FF +1810 +3010 +7C38 +D628 +1028 +106C +1044 +10C6 +1183 +ENDCHAR +STARTCHAR U+7946 +ENCODING 31046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +107C +03C0 +FC40 +0840 +1040 +1044 +3BFE +5440 +90A0 +10A0 +1110 +1110 +1208 +140E +1804 +ENDCHAR +STARTCHAR U+7947 +ENCODING 31047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +11E0 +7D20 +0520 +0920 +09FC +1920 +3510 +5514 +1114 +11CC +160C +1004 +0000 +ENDCHAR +STARTCHAR U+7948 +ENCODING 31048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +08C0 +7E80 +0480 +08FC +0C90 +1A90 +2A90 +4890 +0910 +0910 +0A10 +0C10 +0000 +ENDCHAR +STARTCHAR U+7949 +ENCODING 31049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7E20 +04A0 +08BC +0CA0 +1AA0 +2AA0 +48A0 +08A0 +08A0 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+794A +ENCODING 31050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FDFF +0440 +0C40 +0840 +187E +3042 +7C42 +D642 +1042 +10C2 +1086 +1184 +131C +ENDCHAR +STARTCHAR U+794B +ENCODING 31051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10F8 +1088 +FC88 +0488 +0D88 +0B0F +1800 +31FC +7C84 +D6CC +1058 +1030 +1078 +10CC +1387 +ENDCHAR +STARTCHAR U+794C +ENCODING 31052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0408 +0008 +7E7F +0449 +0849 +1C49 +2A7F +4849 +0808 +0808 +0808 +0808 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+794F +ENCODING 31055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1020 +FC20 +0420 +0C60 +0840 +18FE +30C2 +7D42 +D642 +1042 +1042 +1042 +107E +1000 +ENDCHAR +STARTCHAR U+7950 +ENCODING 31056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FFC +0840 +0840 +1880 +14F8 +3588 +5188 +1288 +1488 +10F8 +1088 +0000 +ENDCHAR +STARTCHAR U+7951 +ENCODING 31057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +FCFE +0590 +0D10 +0810 +19FF +3010 +7C10 +D638 +1028 +106C +1044 +10C6 +1183 +ENDCHAR +STARTCHAR U+7952 +ENCODING 31058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +11FF +0821 +7E21 +0421 +0841 +188E +2C00 +4AFF +0881 +0881 +0881 +08FF +0881 +0000 +0000 +ENDCHAR +STARTCHAR U+7953 +ENCODING 31059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3E48 +0048 +0040 +7FFC +0840 +2A48 +2A68 +2A68 +2AB0 +2A90 +2930 +4A48 +0C84 +0000 +ENDCHAR +STARTCHAR U+7954 +ENCODING 31060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +2084 +2084 +F984 +097F +1904 +1304 +3524 +2134 +7114 +A904 +2104 +2104 +2104 +2104 +211C +ENDCHAR +STARTCHAR U+7955 +ENCODING 31061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E10 +0050 +0048 +7F48 +08C8 +2AD8 +2AD4 +2B54 +2B64 +2A60 +2848 +48C8 +0938 +0000 +ENDCHAR +STARTCHAR U+7956 +ENCODING 31062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7D10 +0910 +09F0 +1110 +1910 +35F0 +5710 +1110 +1110 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+7957 +ENCODING 31063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3E10 +00E0 +00A0 +7FA0 +08FC +2AA0 +2A90 +2A90 +2AB4 +2ACC +2B0C +49F4 +0804 +0000 +ENDCHAR +STARTCHAR U+7958 +ENCODING 31064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1000 +FC00 +0400 +0C00 +09FF +1810 +3010 +7C54 +D654 +10D6 +1092 +1193 +1010 +1070 +ENDCHAR +STARTCHAR U+795A +ENCODING 31066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +0040 +007C +7FA0 +08A0 +2B3C +2A20 +2A20 +2A3C +2A20 +2A20 +4820 +0820 +0000 +ENDCHAR +STARTCHAR U+795B +ENCODING 31067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1040 +0040 +FC48 +0BFC +1040 +1040 +3844 +57FE +9040 +1040 +1080 +1110 +1208 +17FC +1004 +ENDCHAR +STARTCHAR U+795C +ENCODING 31068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1040 +0044 +FBFE +0840 +1040 +1040 +3848 +57FC +9208 +1208 +1208 +1208 +1208 +13F8 +1208 +ENDCHAR +STARTCHAR U+795D +ENCODING 31069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7D08 +0908 +09F8 +11A8 +18A0 +34A0 +54A0 +1120 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+795E +ENCODING 31070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7FF8 +0A48 +0A48 +13F8 +1A48 +3648 +57F8 +1248 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+795F +ENCODING 31071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1FF0 +2108 +3FF8 +2008 +0FE0 +0000 +7FFC +0540 +1930 +6108 +0300 +0000 +ENDCHAR +STARTCHAR U+7960 +ENCODING 31072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0008 +01F8 +7E08 +08E8 +2AA8 +2AA8 +2AA8 +2AE8 +2AA8 +2A08 +4808 +0818 +0000 +ENDCHAR +STARTCHAR U+7961 +ENCODING 31073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +27BE +2420 +2421 +7FBF +0000 +1FFC +0000 +7FFF +0080 +0888 +1084 +6083 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7962 +ENCODING 31074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +7DFC +0920 +0A20 +10B0 +18A8 +34A8 +5524 +1124 +1224 +1020 +1060 +0000 +ENDCHAR +STARTCHAR U+7963 +ENCODING 31075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +10FF +0100 +7C02 +08FC +1080 +3882 +54A2 +1094 +1088 +1094 +10A2 +10C1 +1181 +0000 +0000 +ENDCHAR +STARTCHAR U+7964 +ENCODING 31076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21EF +1021 +7D29 +04A5 +0863 +1021 +3821 +5463 +11AD +1021 +1021 +1021 +114A +1084 +0000 +0000 +ENDCHAR +STARTCHAR U+7965 +ENCODING 31077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1090 +10A0 +7FFC +0840 +0840 +13F8 +1840 +3440 +57FC +1040 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+7967 +ENCODING 31079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +10A0 +00A0 +FCA4 +0AAC +11B0 +10A0 +38A0 +55B0 +92AC +14A4 +10A0 +1122 +1122 +121E +1400 +ENDCHAR +STARTCHAR U+7968 +ENCODING 31080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0280 +1FF0 +1290 +1FF0 +0000 +1FF0 +0000 +7FFC +0540 +1930 +6108 +0300 +0000 +ENDCHAR +STARTCHAR U+7969 +ENCODING 31081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +FCFE +0590 +0D10 +0810 +19FF +3054 +7C54 +D654 +10D6 +1092 +1193 +1010 +1010 +ENDCHAR +STARTCHAR U+796A +ENCODING 31082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +10FE +0104 +7C08 +09FF +1100 +397E +5522 +1122 +112A +1124 +1120 +1121 +123F +0000 +0000 +ENDCHAR +STARTCHAR U+796B +ENCODING 31083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1070 +1058 +FCC8 +048C +0D86 +0B7B +1800 +3000 +7CFC +D684 +1084 +1084 +1084 +1084 +10FC +ENDCHAR +STARTCHAR U+796D +ENCODING 31085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +1188 +2A50 +6420 +1810 +1FEC +6000 +1FF8 +0920 +0910 +1108 +2108 +0300 +0000 +ENDCHAR +STARTCHAR U+796F +ENCODING 31087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1048 +007C +FC40 +0BF8 +1208 +1248 +3A48 +5648 +9248 +1248 +1248 +10A0 +1098 +110C +1604 +ENDCHAR +STARTCHAR U+7970 +ENCODING 31088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1110 +7DFE +0910 +1210 +3010 +59FF +1400 +10FE +1082 +1082 +1082 +10FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+7972 +ENCODING 31090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1004 +FCFC +0404 +0CFC +0800 +1BFF +3201 +7AFD +D484 +10CC +1058 +1070 +10DC +1387 +ENDCHAR +STARTCHAR U+7973 +ENCODING 31091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FF +1100 +0100 +7D7E +0900 +1100 +31FF +5140 +1940 +1551 +114A +1154 +1162 +12C1 +0000 +0000 +ENDCHAR +STARTCHAR U+7974 +ENCODING 31092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200A +1009 +01FF +7C08 +0448 +0948 +1148 +33E8 +5948 +154A +114C +114D +1253 +1001 +0000 +0000 +ENDCHAR +STARTCHAR U+7977 +ENCODING 31095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +13F8 +7C40 +05F0 +0840 +0BFC +1490 +37FC +5190 +1250 +1450 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+7978 +ENCODING 31096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4008 +23FC +2208 +0208 +FA08 +13F8 +2040 +7044 +AFFE +2444 +2444 +24B4 +2514 +2404 +2414 +2408 +ENDCHAR +STARTCHAR U+7979 +ENCODING 31097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +11FF +FD01 +0681 +0CF9 +0941 +1841 +33FD +7841 +D549 +1149 +1149 +11FB +1002 +100E +ENDCHAR +STARTCHAR U+797A +ENCODING 31098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3C90 +0090 +03FC +7E90 +08F0 +2A90 +2AF0 +2A90 +2A90 +2BFC +2890 +4908 +0A08 +0000 +ENDCHAR +STARTCHAR U+797B +ENCODING 31099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +FD11 +0511 +0DFF +0911 +1911 +317D +7945 +D545 +1145 +117D +1101 +11FF +1000 +ENDCHAR +STARTCHAR U+797C +ENCODING 31100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +FD22 +05FE +0D22 +0922 +19FE +3020 +7BFF +D4A8 +10AC +11A4 +1126 +1323 +1020 +ENDCHAR +STARTCHAR U+797D +ENCODING 31101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1010 +01FF +7C44 +0444 +0844 +10AA +3901 +5410 +11FF +1010 +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+797E +ENCODING 31102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FE +FC20 +07FF +0C48 +0848 +188F +3140 +787C +D4C4 +118C +1358 +1070 +10DC +1387 +ENDCHAR +STARTCHAR U+797F +ENCODING 31103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E78 +0088 +00F0 +7E10 +09FC +2B20 +2AB4 +2AB8 +2A70 +2AA8 +2B24 +4820 +0860 +0000 +ENDCHAR +STARTCHAR U+7980 +ENCODING 31104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +1FF0 +17D0 +1450 +17D0 +1FF0 +0000 +1FF0 +0000 +7FFC +0D60 +3118 +0300 +0000 +ENDCHAR +STARTCHAR U+7981 +ENCODING 31105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +1C60 +1A70 +2AA8 +4924 +0FE0 +0000 +7FFC +0920 +1110 +6108 +0300 +0000 +ENDCHAR +STARTCHAR U+7982 +ENCODING 31106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +1111 +7D11 +057D +0911 +1111 +39FF +5501 +117D +1145 +1145 +117D +1101 +1107 +0000 +0000 +ENDCHAR +STARTCHAR U+7984 +ENCODING 31108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1010 +7DF0 +0810 +0BFC +1840 +1664 +3568 +50D0 +1150 +1648 +1044 +10C0 +0000 +ENDCHAR +STARTCHAR U+7985 +ENCODING 31109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1088 +1248 +1150 +7D20 +0BF8 +0A48 +13F8 +1A48 +37F8 +5440 +17FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+7988 +ENCODING 31112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +1111 +097D +7C10 +08FE +1092 +30FE +5892 +14FE +1010 +11FF +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+798A +ENCODING 31114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3D78 +03A8 +0128 +7FA8 +11A8 +3748 +3598 +3440 +37FC +3440 +34A0 +5110 +160C +0000 +ENDCHAR +STARTCHAR U+798B +ENCODING 31115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1050 +FDFE +0552 +0D52 +099E +1902 +31FE +7C20 +D620 +11FE +1020 +1020 +13FF +1000 +ENDCHAR +STARTCHAR U+798C +ENCODING 31116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +10CC +1048 +FFFF +0484 +0C84 +0908 +1908 +3252 +794A +D484 +1084 +114A +114A +13DF +1251 +ENDCHAR +STARTCHAR U+798D +ENCODING 31117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7D70 +0950 +0950 +13F8 +1A08 +36E8 +56A8 +12E8 +12A8 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+798E +ENCODING 31118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +107C +7C40 +09F8 +0908 +11F8 +1908 +35F8 +5508 +11F8 +1090 +1108 +1604 +0000 +ENDCHAR +STARTCHAR U+798F +ENCODING 31119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1000 +7DF0 +0910 +09F0 +1000 +1BF8 +3648 +57F8 +1248 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+7990 +ENCODING 31120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2002 +11FC +0811 +0111 +7C92 +09FF +1080 +31FF +5880 +14FC +1128 +1010 +1028 +11C7 +0000 +0000 +ENDCHAR +STARTCHAR U+7991 +ENCODING 31121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000E +7CF0 +0010 +00FE +0092 +7EFE +1092 +10FE +5410 +55FF +5515 +551D +55E3 +5501 +1101 +1103 +ENDCHAR +STARTCHAR U+7992 +ENCODING 31122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +107E +0884 +01F8 +7C10 +09FF +1041 +30A2 +5934 +144C +109A +1129 +1048 +1038 +0000 +0000 +ENDCHAR +STARTCHAR U+7993 +ENCODING 31123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1084 +FCFC +0484 +0C84 +08FC +1800 +33FF +7900 +D5FF +1249 +1089 +1313 +1022 +10CE +ENDCHAR +STARTCHAR U+7994 +ENCODING 31124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1084 +FCFC +0484 +0C84 +08FC +1800 +33FF +7820 +D520 +113E +1120 +13A0 +12E0 +163F +ENDCHAR +STARTCHAR U+7995 +ENCODING 31125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FC +1044 +FC44 +07FF +0C00 +09FC +1904 +31FC +7808 +D5FE +1088 +1088 +13FF +1008 +1008 +ENDCHAR +STARTCHAR U+7996 +ENCODING 31126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13FF +FC84 +04FC +0C84 +0884 +18FC +3020 +7BFF +D4A8 +10AC +11A4 +1126 +1323 +1020 +ENDCHAR +STARTCHAR U+7997 +ENCODING 31127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +1222 +0A22 +7FFE +0A22 +1222 +3BFE +5400 +1000 +10A2 +1292 +1281 +1284 +14FC +0000 +0000 +ENDCHAR +STARTCHAR U+7998 +ENCODING 31128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FC44 +046C +0C28 +09FF +1911 +3111 +7CFE +D492 +1092 +1092 +1096 +1010 +1010 +ENDCHAR +STARTCHAR U+799A +ENCODING 31130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +1088 +0050 +FBFE +0820 +1020 +11FC +3820 +5420 +9024 +13FE +1000 +12A4 +1252 +1452 +1000 +ENDCHAR +STARTCHAR U+799B +ENCODING 31131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1086 +10FC +1081 +FC7F +0400 +0D7E +0942 +197E +3142 +797E +D542 +117E +1100 +11FF +1044 +1183 +ENDCHAR +STARTCHAR U+799C +ENCODING 31132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2952 +2A54 +1428 +2244 +0000 +7FFE +4002 +4002 +1FF8 +0000 +FFFF +0100 +1918 +310C +E707 +ENDCHAR +STARTCHAR U+799D +ENCODING 31133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +00A8 +00F8 +7FA8 +08F8 +2A50 +2A94 +2B4C +2A70 +2AD0 +2B20 +4850 +098C +0000 +ENDCHAR +STARTCHAR U+79A0 +ENCODING 31136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4004 +23F8 +0110 +7D1E +0510 +097F +1151 +317E +5950 +155E +1140 +1254 +1095 +1127 +0000 +0000 +ENDCHAR +STARTCHAR U+79A1 +ENCODING 31137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1110 +FD10 +05FC +0D10 +0910 +19FC +3110 +7D10 +D5FF +1001 +1155 +1355 +1203 +1006 +ENDCHAR +STARTCHAR U+79A2 +ENCODING 31138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +1202 +03FE +7E02 +0BFE +1000 +3000 +57DF +1841 +134D +10C3 +175D +1041 +138E +0000 +0000 +ENDCHAR +STARTCHAR U+79A4 +ENCODING 31140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +1129 +0129 +7DFF +0800 +11EF +3021 +5929 +14A5 +1063 +10A5 +1129 +1021 +10C6 +0000 +0000 +ENDCHAR +STARTCHAR U+79A6 +ENCODING 31142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +13F8 +2D28 +4FE8 +1128 +35E8 +5528 +15F8 +1E20 +1FF0 +0000 +7FFC +1930 +630C +0000 +ENDCHAR +STARTCHAR U+79A7 +ENCODING 31143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FFC +0020 +00F8 +7E00 +08F8 +2A88 +2AF8 +2A50 +2BFC +2AF8 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+79A8 +ENCODING 31144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2122 +2224 +26AD +F922 +0A25 +1AAF +17A4 +3022 +23FF +7220 +AA12 +2314 +2288 +2695 +2427 +2CC2 +ENDCHAR +STARTCHAR U+79A9 +ENCODING 31145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1122 +FD22 +05FE +0D22 +0922 +19FE +3048 +7DFE +D448 +1048 +13FF +1048 +10CC +1387 +ENDCHAR +STARTCHAR U+79AA +ENCODING 31146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FDC +0154 +01DC +7E00 +08F8 +2AA8 +2AF8 +2AA8 +2AF8 +2A20 +2BFC +4820 +0820 +0000 +ENDCHAR +STARTCHAR U+79AB +ENCODING 31147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FF +1050 +FDFE +0552 +0DFE +0800 +18FC +3084 +7CFC +D484 +10FC +1020 +13FF +1020 +1020 +ENDCHAR +STARTCHAR U+79AC +ENCODING 31148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +2028 +0044 +7CBA +0501 +09FF +1155 +31FF +5800 +14FE +1082 +10FE +1082 +10FE +0000 +0000 +ENDCHAR +STARTCHAR U+79AD +ENCODING 31149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2242 +1124 +08FF +7C10 +07B0 +0949 +1116 +3224 +514C +1916 +1525 +110C +1280 +107F +0000 +0000 +ENDCHAR +STARTCHAR U+79AE +ENCODING 31150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3FF8 +02A8 +03F8 +7EA8 +13F8 +3400 +37FC +35F0 +3510 +35F0 +30A0 +57FC +1000 +0000 +ENDCHAR +STARTCHAR U+79AF +ENCODING 31151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +10FE +10AA +FCFE +04AA +0CFE +0800 +19FF +3100 +7D7E +D700 +11FF +1152 +115A +126C +10C7 +ENDCHAR +STARTCHAR U+79B0 +ENCODING 31152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1150 +7E4C +07F8 +0AD8 +0BF8 +1AD8 +3768 +56D8 +13F8 +12D8 +1368 +1258 +0000 +ENDCHAR +STARTCHAR U+79B1 +ENCODING 31153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3EFE +0010 +01FF +0000 +7FFF +0801 +08FE +2A10 +2AFE +2BFF +2A04 +2AFF +2AD4 +0804 +080C +ENDCHAR +STARTCHAR U+79B2 +ENCODING 31154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FF +1224 +0AFF +7E24 +0A7E +124A +327E +5A4A +167E +1208 +12FF +1289 +10BD +1087 +0000 +0000 +ENDCHAR +STARTCHAR U+79B3 +ENCODING 31155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3FFC +03B8 +02A8 +7FB8 +10A0 +37F8 +35F0 +34A0 +37FC +34C8 +3730 +51D0 +130C +0000 +ENDCHAR +STARTCHAR U+79B4 +ENCODING 31156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +106C +FCC6 +05BB +0C00 +09FF +1929 +31FF +7800 +D4FE +10AA +10FE +10AA +10AA +10AA +ENDCHAR +STARTCHAR U+79B6 +ENCODING 31158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +214A +11EF +0842 +7DEF +094A +1063 +34FE +5882 +14FE +1082 +10FE +1082 +10FE +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+79B7 +ENCODING 31159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +409F +24A4 +02DF +7FF1 +09D1 +12BF +3491 +5811 +14BF +1091 +13F1 +109F +114A +1231 +0000 +0000 +ENDCHAR +STARTCHAR U+79B8 +ENCODING 31160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0100 +7FFE +4102 +4102 +4302 +4222 +4622 +4FF2 +581A +4002 +4002 +4002 +4002 +400E +ENDCHAR +STARTCHAR U+79B9 +ENCODING 31161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3FC0 +0100 +1FF0 +1110 +1110 +1FF0 +0100 +3FF8 +2148 +2168 +3F98 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+79BA +ENCODING 31162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1FF0 +1110 +1FF0 +0100 +3FF8 +2148 +2168 +3F98 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+79BB +ENCODING 31163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0440 +1290 +1110 +1290 +1450 +1FF0 +0104 +7FFE +4204 +4444 +4FE4 +4014 +4008 +ENDCHAR +STARTCHAR U+79BD +ENCODING 31165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0540 +1FF0 +6AAC +09A0 +0E60 +0FE0 +0100 +1FF0 +1290 +1FD0 +1050 +1030 +0000 +ENDCHAR +STARTCHAR U+79BE +ENCODING 31166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +01C0 +1F00 +0100 +0100 +7FFC +0100 +0380 +0540 +1930 +610C +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+79BF +ENCODING 31167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +7FFC +0380 +0540 +1930 +610C +0480 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+79C0 +ENCODING 31168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +7FFC +0380 +0540 +1930 +6FCC +0240 +0278 +0448 +0408 +1808 +6070 +0000 +ENDCHAR +STARTCHAR U+79C1 +ENCODING 31169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +0620 +3C20 +0420 +0420 +7F20 +0C40 +0E40 +1560 +1550 +2488 +4498 +07E4 +0404 +0000 +ENDCHAR +STARTCHAR U+79C2 +ENCODING 31170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +00F8 +3F80 +0100 +FFFF +0520 +0D30 +381C +E107 +0100 +0380 +02C0 +0640 +0C60 +1838 +F00F +ENDCHAR +STARTCHAR U+79C3 +ENCODING 31171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F0 +3F00 +0100 +0104 +FFFE +0540 +0920 +1110 +27CE +4444 +0440 +0440 +0842 +0842 +103E +6000 +ENDCHAR +STARTCHAR U+79C4 +ENCODING 31172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0600 +1CFF +F006 +100C +1018 +FE10 +1010 +10FF +3810 +3410 +5210 +5010 +9010 +1010 +1010 +1070 +ENDCHAR +STARTCHAR U+79C5 +ENCODING 31173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +7838 +11E0 +1020 +7C20 +1020 +13FE +3820 +5420 +1020 +1020 +1021 +103F +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+79C6 +ENCODING 31174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1DFC +F020 +1020 +1020 +FC20 +1024 +3BFE +3420 +5020 +5020 +9020 +1020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+79C7 +ENCODING 31175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +1C40 +F040 +1040 +11F8 +FC48 +1048 +1048 +3948 +34C8 +5448 +50E8 +9088 +1089 +1189 +1307 +ENDCHAR +STARTCHAR U+79C8 +ENCODING 31176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C20 +F020 +1020 +1122 +FD22 +1122 +1122 +3922 +3522 +5522 +5122 +9122 +1122 +11FE +1000 +ENDCHAR +STARTCHAR U+79C9 +ENCODING 31177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0070 +1F80 +7FFC +0100 +1FF0 +0110 +7FFC +0110 +1FF0 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+79CA +ENCODING 31178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007C +1F80 +0080 +0080 +7FFF +02A0 +0498 +1887 +60F8 +1F80 +0080 +0080 +7FFF +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+79CB +ENCODING 31179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0C20 +3820 +0824 +08A4 +7EA8 +08B0 +1D20 +1A20 +2A60 +4850 +0890 +0908 +0A04 +0000 +ENDCHAR +STARTCHAR U+79CD +ENCODING 31181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1C20 +F020 +1024 +11FE +FF24 +1124 +3924 +3524 +55FC +5124 +9020 +1020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+79CE +ENCODING 31182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +7082 +1101 +1000 +7C00 +11FE +1022 +3822 +5422 +1022 +1042 +1082 +1104 +1018 +0000 +0000 +ENDCHAR +STARTCHAR U+79CF +ENCODING 31183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +040C +1C38 +F0E0 +1020 +1020 +FCFC +1020 +1020 +3820 +35FF +5420 +5020 +9020 +1021 +1033 +101E +ENDCHAR +STARTCHAR U+79D1 +ENCODING 31185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +0C90 +3850 +0850 +0910 +7E90 +0890 +1C1C +1A70 +2B90 +4810 +0810 +0810 +0810 +0000 +ENDCHAR +STARTCHAR U+79D2 +ENCODING 31186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0C20 +3820 +08B0 +08A8 +7EA4 +08A4 +1D28 +1A68 +2A30 +4810 +0820 +08C0 +0B00 +0000 +ENDCHAR +STARTCHAR U+79D4 +ENCODING 31188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C20 +F020 +13FF +1000 +FC00 +10F8 +1088 +3888 +3488 +5488 +5088 +9188 +1109 +1309 +1607 +ENDCHAR +STARTCHAR U+79D5 +ENCODING 31189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0320 +0520 +3920 +0920 +0924 +7FE8 +0930 +1D20 +1B20 +2B20 +4920 +0964 +09A4 +0B1C +0000 +ENDCHAR +STARTCHAR U+79D6 +ENCODING 31190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0406 +1C1C +F1F0 +1110 +1110 +FD10 +1110 +11FF +3910 +3518 +5508 +5108 +910C +1105 +11E7 +1702 +ENDCHAR +STARTCHAR U+79D8 +ENCODING 31192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1820 +7028 +1088 +1088 +7E90 +1290 +1AB0 +36A8 +34C4 +5084 +1188 +1288 +1478 +0000 +ENDCHAR +STARTCHAR U+79DA +ENCODING 31194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1C92 +F0D6 +1054 +1010 +FCFE +1010 +1010 +3810 +35FF +5410 +5010 +9010 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+79DC +ENCODING 31196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +05FF +7901 +1101 +11FF +1100 +7D00 +1140 +3940 +5540 +117E +1140 +1241 +1441 +107F +0000 +0000 +ENDCHAR +STARTCHAR U+79DD +ENCODING 31197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0606 +1C1C +F0F0 +1010 +1010 +FEFF +1010 +1010 +3838 +3434 +5252 +5051 +9090 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+79DE +ENCODING 31198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1C10 +F010 +1010 +11FF +FD11 +1111 +1111 +3911 +35FF +5511 +5111 +9111 +1111 +11FF +1000 +ENDCHAR +STARTCHAR U+79DF +ENCODING 31199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0CF8 +3888 +0888 +0888 +7FF8 +0888 +1C88 +1AF8 +2A88 +4888 +0888 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+79E0 +ENCODING 31200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +1DFE +F010 +1010 +1030 +FC20 +1068 +10EC +39A6 +3523 +5420 +5020 +9020 +1000 +13FF +1000 +ENDCHAR +STARTCHAR U+79E1 +ENCODING 31201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +0450 +3848 +0848 +09FC +7E40 +0848 +1C68 +1A68 +2AB0 +4890 +0930 +0A48 +0C84 +0000 +ENDCHAR +STARTCHAR U+79E2 +ENCODING 31202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C70 +F0D8 +118C +1307 +FCF8 +1000 +1000 +39FE +3422 +5422 +5022 +9022 +102E +1020 +1020 +ENDCHAR +STARTCHAR U+79E3 +ENCODING 31203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0420 +3820 +09FC +0820 +7E20 +08F8 +1C20 +1A70 +2A70 +48A8 +0924 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+79E4 +ENCODING 31204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0DFC +3820 +0928 +08A8 +7EB0 +0820 +1DFC +1A20 +2A20 +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+79E5 +ENCODING 31205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C20 +F020 +1020 +103F +FC20 +1020 +1020 +3820 +35FE +5502 +5102 +9102 +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+79E6 +ENCODING 31206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0280 +7FFC +0440 +0FA0 +1110 +6FEC +0380 +0D60 +3118 +0100 +0000 +ENDCHAR +STARTCHAR U+79E7 +ENCODING 31207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0420 +3820 +08F8 +08A8 +7EA8 +08A8 +1DFC +1A20 +2A60 +4850 +0890 +0908 +0A04 +0000 +ENDCHAR +STARTCHAR U+79E9 +ENCODING 31209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0420 +38A0 +08A0 +08F8 +7EA0 +0920 +1DFC +1A20 +2A60 +4850 +0890 +0908 +0A04 +0000 +ENDCHAR +STARTCHAR U+79EA +ENCODING 31210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0406 +1C1C +F1F0 +1110 +1110 +FD10 +11FF +1110 +3910 +3518 +5508 +5108 +91EC +1705 +1007 +17E2 +ENDCHAR +STARTCHAR U+79EB +ENCODING 31211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0C50 +F048 +1048 +17FE +FC40 +1040 +30C0 +38E0 +5550 +5150 +9148 +124E +1444 +1840 +1040 +ENDCHAR +STARTCHAR U+79EC +ENCODING 31212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +04FC +3880 +0880 +08F8 +7F88 +0888 +1C88 +1AF8 +2A88 +4880 +0880 +08FC +0880 +0000 +ENDCHAR +STARTCHAR U+79ED +ENCODING 31213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0C50 +F078 +13C0 +1240 +FE40 +1244 +33FE +3844 +54C4 +5144 +9254 +1448 +1040 +1040 +1040 +ENDCHAR +STARTCHAR U+79EE +ENCODING 31214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7820 +1044 +1082 +7DFF +1001 +1000 +38FE +5482 +1082 +1082 +1082 +10FE +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+79EF +ENCODING 31215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0E04 +78FE +0884 +0884 +FE84 +0884 +1884 +1CFC +2A84 +2800 +4888 +88C4 +0906 +0A02 +0800 +ENDCHAR +STARTCHAR U+79F0 +ENCODING 31216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +0C80 +3880 +09FC +0920 +7E20 +08B0 +1CA8 +1AA8 +2B24 +4924 +0A24 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+79F1 +ENCODING 31217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +1DFE +F102 +1102 +117A +FD02 +1102 +117A +394A +354A +554A +517A +9102 +1102 +1102 +1106 +ENDCHAR +STARTCHAR U+79F6 +ENCODING 31222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +79FF +0222 +0020 +1050 +7B8E +0010 +0FE0 +0080 +7FFF +0080 +0490 +788F +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+79F7 +ENCODING 31223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +79FF +1010 +1024 +1042 +7CFF +1011 +1010 +3814 +54FE +1010 +1010 +1012 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+79F8 +ENCODING 31224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0E20 +7824 +0BFE +0820 +FE20 +0828 +19FC +1C00 +2A04 +29FE +4904 +8904 +0904 +09FC +0904 +ENDCHAR +STARTCHAR U+79FA +ENCODING 31226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7810 +11FF +1101 +7D05 +10F8 +1020 +3820 +55FE +1020 +1020 +1021 +1021 +103F +0000 +0000 +ENDCHAR +STARTCHAR U+79FB +ENCODING 31227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +0C78 +3888 +0950 +0820 +7E40 +09A0 +1C3C +1A44 +2AA8 +4918 +0810 +0860 +0B80 +0000 +ENDCHAR +STARTCHAR U+79FC +ENCODING 31228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1C90 +F090 +10FE +1190 +FD10 +1010 +11FF +3854 +3454 +5454 +50D6 +9092 +1193 +1311 +1010 +ENDCHAR +STARTCHAR U+79FD +ENCODING 31229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1C20 +F124 +1124 +1124 +FDFC +1144 +3840 +34FE +5104 +5284 +9048 +1030 +1020 +10C0 +1700 +ENDCHAR +STARTCHAR U+7A00 +ENCODING 31232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +0CD0 +3830 +09C8 +0840 +7FFC +08A0 +1CF8 +1BA8 +2AA8 +48A8 +08B8 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+7A02 +ENCODING 31234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0C48 +F3FC +1208 +1208 +FFF8 +1208 +3208 +3BF8 +5684 +524C +9250 +1220 +1290 +130E +1204 +ENDCHAR +STARTCHAR U+7A03 +ENCODING 31235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0C3C +F7C0 +1248 +1150 +FC00 +13F8 +3010 +3860 +5444 +57FE +9040 +1040 +1040 +1140 +1080 +ENDCHAR +STARTCHAR U+7A04 +ENCODING 31236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7044 +1082 +11FF +1044 +7C84 +1122 +127D +38C4 +5544 +1028 +1010 +1028 +10C7 +0000 +0000 +ENDCHAR +STARTCHAR U+7A05 +ENCODING 31237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0638 +3804 +0844 +0882 +7F01 +0AFE +1882 +1C82 +2A82 +28FE +2828 +4828 +0848 +0889 +090F +0A00 +ENDCHAR +STARTCHAR U+7A06 +ENCODING 31238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0DFC +F108 +1108 +1108 +FD08 +11F8 +3000 +3804 +57FE +5204 +9204 +1204 +1204 +13FC +1204 +ENDCHAR +STARTCHAR U+7A07 +ENCODING 31239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +1DFF +F101 +1111 +1111 +FD7D +1111 +1139 +3939 +3555 +5555 +5111 +9111 +1101 +11FF +1000 +ENDCHAR +STARTCHAR U+7A08 +ENCODING 31240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +04F8 +3888 +08F8 +0888 +7EF8 +0800 +1CF8 +1A20 +2A20 +49FC +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+7A09 +ENCODING 31241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +1FFF +F020 +11FE +1122 +FD22 +11FE +1122 +3922 +35FE +5420 +50A0 +9060 +1070 +10DC +1387 +ENDCHAR +STARTCHAR U+7A0A +ENCODING 31242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0484 +1CCC +F048 +11FE +1022 +FC22 +11FE +1120 +3920 +35FF +5461 +5061 +90A3 +11A2 +132E +1020 +ENDCHAR +STARTCHAR U+7A0B +ENCODING 31243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0DF8 +3908 +0908 +09F8 +7E00 +09F8 +1C40 +1A40 +2BF8 +4840 +0840 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7A0C +ENCODING 31244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C70 +F050 +10D8 +118C +FF06 +12FB +1020 +3820 +35FE +5420 +5124 +9124 +1326 +1623 +10E0 +ENDCHAR +STARTCHAR U+7A0D +ENCODING 31245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +04B0 +38A8 +0924 +0820 +7EF8 +0888 +1CF8 +1A88 +2AF8 +4888 +0888 +0888 +0898 +0000 +ENDCHAR +STARTCHAR U+7A0E +ENCODING 31246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0310 +0490 +38A0 +09F8 +0908 +7F08 +09F8 +1D68 +1A60 +2AA0 +48A0 +0924 +0A24 +0C1C +0000 +ENDCHAR +STARTCHAR U+7A10 +ENCODING 31248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7028 +1044 +1082 +7D7D +1000 +10FE +38AA +54AA +10FE +10AA +10AA +1082 +1086 +0000 +0000 +ENDCHAR +STARTCHAR U+7A11 +ENCODING 31249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1C10 +F0FE +1010 +1010 +FDFF +1044 +1044 +3987 +3410 +5410 +50FE +9010 +1010 +11FF +1000 +ENDCHAR +STARTCHAR U+7A12 +ENCODING 31250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +05FF +7901 +1111 +1111 +7DFF +1111 +1111 +397D +5545 +1145 +117D +1101 +11FF +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+7A13 +ENCODING 31251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0124 +7E24 +08FF +0824 +7F24 +08FF +0800 +1C7E +2A42 +497E +0842 +0842 +087E +0842 +0000 +0000 +ENDCHAR +STARTCHAR U+7A14 +ENCODING 31252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1840 +70A0 +1110 +12E8 +7C04 +13F8 +1810 +3460 +3428 +52A4 +1284 +1490 +1070 +0000 +ENDCHAR +STARTCHAR U+7A15 +ENCODING 31253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C20 +F3FF +1000 +10FC +FC84 +10FC +1000 +39FE +340C +5410 +53FF +9020 +1020 +1020 +10E0 +ENDCHAR +STARTCHAR U+7A17 +ENCODING 31255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1880 +73F8 +1248 +13F8 +7E48 +13F8 +18A8 +3520 +37FC +5020 +1020 +1020 +1020 +0000 +ENDCHAR +STARTCHAR U+7A18 +ENCODING 31256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0290 +0490 +3890 +0BFC +0890 +7EF0 +0C90 +1AF0 +1A90 +2890 +4BFC +0890 +0908 +0A08 +0000 +ENDCHAR +STARTCHAR U+7A19 +ENCODING 31257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0420 +39FC +0820 +0978 +7F48 +0978 +1D48 +1B78 +2B48 +4978 +0900 +09FC +0900 +0000 +ENDCHAR +STARTCHAR U+7A1A +ENCODING 31258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0290 +0C90 +38A0 +09FC +0B20 +7F20 +09F8 +1D20 +1B20 +2BF8 +4920 +0920 +09FC +0900 +0000 +ENDCHAR +STARTCHAR U+7A1B +ENCODING 31259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +1DFF +F101 +111D +1171 +FD11 +117D +1111 +3939 +3555 +5555 +5111 +9111 +1101 +11FF +1000 +ENDCHAR +STARTCHAR U+7A1C +ENCODING 31260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1840 +73F8 +1040 +17FC +7CA0 +1124 +1A9C +34F0 +3590 +5260 +1060 +1190 +1E0C +0000 +ENDCHAR +STARTCHAR U+7A1E +ENCODING 31262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +0FFE +F124 +1124 +15FC +FF24 +1124 +31FC +3820 +57FE +5020 +9070 +10A8 +1126 +1224 +1020 +ENDCHAR +STARTCHAR U+7A1F +ENCODING 31263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +1FF0 +17D0 +1450 +17D0 +1FF0 +0060 +1F80 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+7A20 +ENCODING 31264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +05F8 +3948 +0948 +09F8 +7F48 +09F8 +1D08 +1BE8 +2BA8 +49A8 +0AE8 +0AA8 +0C18 +0000 +ENDCHAR +STARTCHAR U+7A21 +ENCODING 31265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1C10 +F1FF +1000 +1044 +FC44 +10EE +11AB +3800 +3410 +55FF +5010 +9010 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+7A22 +ENCODING 31266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +040A +7809 +13FF +1008 +7DE8 +1128 +1128 +3928 +55E8 +100A +13EC +1009 +1015 +1003 +0000 +0000 +ENDCHAR +STARTCHAR U+7A23 +ENCODING 31267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +201C +3DE0 +4820 +9020 +7C24 +57FE +5420 +7C70 +5468 +54A8 +7D26 +0224 +1C20 +E020 +4020 +ENDCHAR +STARTCHAR U+7A26 +ENCODING 31270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +70FE +1012 +11FF +7C00 +10FE +3882 +54FE +1010 +10FF +1090 +11FF +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+7A27 +ENCODING 31271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +3FDF +E109 +2109 +27C9 +F909 +2119 +21D1 +7737 +6800 +A040 +A7FF +2088 +218C +2306 +2603 +ENDCHAR +STARTCHAR U+7A28 +ENCODING 31272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +71FF +1100 +11FF +7D01 +11FF +1100 +397F +5555 +117F +1155 +1255 +1055 +1043 +0000 +0000 +ENDCHAR +STARTCHAR U+7A2B +ENCODING 31275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +1DFF +F000 +10FE +1082 +FC82 +10FE +1000 +3800 +35FF +5511 +5111 +91FF +1111 +1111 +11FF +ENDCHAR +STARTCHAR U+7A2D +ENCODING 31277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0510 +1D13 +F1DE +1110 +1110 +FD11 +11CF +1310 +3820 +35FE +5502 +5102 +91FE +1102 +1102 +11FE +ENDCHAR +STARTCHAR U+7A2E +ENCODING 31278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +19F0 +7040 +17FC +1040 +7FF8 +1248 +1BF8 +3648 +37F8 +5040 +13F8 +1040 +17FC +0000 +ENDCHAR +STARTCHAR U+7A2F +ENCODING 31279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0482 +1CAA +F092 +10AA +1082 +FCFE +1048 +10C8 +39A7 +347C +54C4 +51AC +9028 +1018 +1076 +11C3 +ENDCHAR +STARTCHAR U+7A30 +ENCODING 31280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +1DFF +F011 +109E +1090 +FCD0 +11BF +1000 +38FE +3482 +54FE +5082 +90FE +1082 +1082 +1086 +ENDCHAR +STARTCHAR U+7A31 +ENCODING 31281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0218 +04F0 +38A8 +08A4 +0904 +7E20 +0CF8 +1AA8 +1AF8 +28A8 +49FC +0888 +0888 +0898 +0000 +ENDCHAR +STARTCHAR U+7A32 +ENCODING 31282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0218 +0FE4 +3A44 +0928 +0930 +7E00 +1978 +1D48 +2B48 +2B78 +4948 +0948 +0978 +0948 +0000 +ENDCHAR +STARTCHAR U+7A33 +ENCODING 31283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +1C40 +F0F8 +1110 +1224 +FFFE +1004 +33FC +3804 +57FC +5040 +9524 +1522 +190A +10F8 +1000 +ENDCHAR +STARTCHAR U+7A34 +ENCODING 31284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0504 +1C88 +F3FF +1050 +11FE +FC52 +1052 +13FF +3852 +3452 +55FE +5058 +90D4 +1156 +1253 +1050 +ENDCHAR +STARTCHAR U+7A35 +ENCODING 31285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0484 +1C84 +F084 +13FF +1084 +FC84 +1108 +1108 +3A52 +354A +5484 +5084 +914A +114A +13DF +1251 +ENDCHAR +STARTCHAR U+7A36 +ENCODING 31286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C28 +7024 +1020 +17FF +7C20 +13A4 +32A8 +3AB2 +77B4 +50D9 +5332 +10D4 +1708 +1015 +1063 +1381 +ENDCHAR +STARTCHAR U+7A37 +ENCODING 31287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +05F8 +3948 +09F8 +0948 +7FF8 +08A0 +1D24 +1A5C +2AF0 +4B90 +0860 +08F0 +0B0C +0000 +ENDCHAR +STARTCHAR U+7A38 +ENCODING 31288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C20 +F3FF +1020 +1048 +FDF2 +1022 +13FF +3800 +35FE +5522 +5122 +91FE +1122 +1122 +11FE +ENDCHAR +STARTCHAR U+7A39 +ENCODING 31289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0C48 +F7FC +1040 +13F8 +FE08 +13F8 +3208 +3BF8 +5608 +53F8 +9208 +1FFE +1110 +120C +1404 +ENDCHAR +STARTCHAR U+7A3A +ENCODING 31290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +1DFE +F102 +1102 +11FE +FD10 +1110 +11FF +3944 +3528 +51FF +5110 +9310 +12FE +1610 +1010 +ENDCHAR +STARTCHAR U+7A3B +ENCODING 31291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +0430 +39C8 +0924 +0A24 +7E40 +09B8 +1D08 +1B08 +2BB8 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+7A3C +ENCODING 31292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1840 +73FC +1208 +17F8 +7C40 +10E4 +3B68 +34B0 +5770 +50A8 +1324 +1020 +10C0 +0000 +ENDCHAR +STARTCHAR U+7A3D +ENCODING 31293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0228 +0DFC +7860 +08A4 +099C +7EF0 +0884 +1C7C +1AF8 +2A88 +48F8 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7A3E +ENCODING 31294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0FE0 +0820 +0FE0 +3FF8 +27C8 +2448 +27F8 +1FC0 +7FFC +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+7A3F +ENCODING 31295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1BF8 +7000 +11F0 +1110 +7DF0 +1000 +1BF8 +3608 +36E8 +52A8 +12E8 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+7A40 +ENCODING 31296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7FF0 +0890 +3E94 +0094 +3F0C +2600 +79F8 +0888 +7F50 +1C50 +2A20 +48D0 +0B0C +0000 +ENDCHAR +STARTCHAR U+7A42 +ENCODING 31298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1840 +77FC +1040 +13F8 +7E48 +13F8 +1A48 +37F8 +3440 +52A8 +1284 +1494 +1070 +0000 +ENDCHAR +STARTCHAR U+7A43 +ENCODING 31299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0420 +39FC +0908 +0A90 +7EA8 +0924 +1C50 +1A88 +2BFC +4A88 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7A44 +ENCODING 31300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +39DE +E322 +26A6 +2154 +F888 +2104 +26FB +7000 +6800 +A3FE +A020 +2124 +2326 +2623 +20E0 +ENDCHAR +STARTCHAR U+7A45 +ENCODING 31301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1C10 +F1FF +1110 +117E +FD12 +11FF +1112 +397E +3510 +5592 +5154 +9338 +1254 +1693 +1030 +ENDCHAR +STARTCHAR U+7A46 +ENCODING 31302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +19F8 +7108 +11F8 +1108 +7DF8 +1040 +1958 +3664 +3590 +5060 +1188 +1030 +13C0 +0000 +ENDCHAR +STARTCHAR U+7A47 +ENCODING 31303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C48 +F078 +1084 +1129 +FDEF +1010 +1028 +38C6 +3593 +5420 +50C8 +9032 +10C6 +101C +11F0 +ENDCHAR +STARTCHAR U+7A48 +ENCODING 31304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4208 +5FBF +460C +4B1A +52A9 +401C +47F0 +4040 +4FFE +C150 +875C +9C47 +01C0 +ENDCHAR +STARTCHAR U+7A49 +ENCODING 31305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +05F8 +3908 +09F8 +0920 +7FAC +09AC +1D20 +1B60 +2B78 +49A0 +0BFC +0A20 +0C20 +0000 +ENDCHAR +STARTCHAR U+7A4A +ENCODING 31306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BDF +7254 +1254 +13D4 +7E54 +1254 +13DF +3A04 +5604 +1204 +128C +12D4 +1325 +1207 +0000 +0000 +ENDCHAR +STARTCHAR U+7A4B +ENCODING 31307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17BC +E4A4 +2294 +24A4 +F948 +20A0 +7110 +AE2E +20C4 +2320 +20C8 +2310 +2060 +2380 +0000 +0000 +ENDCHAR +STARTCHAR U+7A4C +ENCODING 31308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +3E0C +6278 +4408 +FF08 +49FF +4908 +7F08 +491C +491A +7F2B +0029 +5548 +5508 +D508 +8008 +ENDCHAR +STARTCHAR U+7A4D +ENCODING 31309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1BFC +7040 +13F8 +1040 +7FFC +11F8 +1908 +35F8 +35F8 +5108 +11F8 +1198 +1604 +0000 +ENDCHAR +STARTCHAR U+7A4E +ENCODING 31310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +25FC +3820 +2240 +1CF8 +0288 +3CF8 +0888 +7EF8 +1888 +1CF8 +2A50 +4888 +0B04 +0000 +ENDCHAR +STARTCHAR U+7A4F +ENCODING 31311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0418 +1BE8 +7248 +1110 +11F8 +7C08 +11F8 +1808 +35F8 +3440 +52A8 +1284 +1494 +1070 +0000 +ENDCHAR +STARTCHAR U+7A50 +ENCODING 31312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +19F0 +7620 +11F0 +1150 +7DF0 +11F0 +1BF8 +3648 +37F8 +5248 +13FC +1244 +103C +0000 +ENDCHAR +STARTCHAR U+7A51 +ENCODING 31313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0C48 +F7FC +1040 +1248 +F950 +17FE +3004 +3FFE +5404 +55F4 +9514 +15F4 +1404 +17FC +1404 +ENDCHAR +STARTCHAR U+7A54 +ENCODING 31316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +71FC +1088 +10F8 +7C00 +17FF +1000 +11FC +3924 +55FC +1124 +11FC +1088 +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+7A55 +ENCODING 31317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0448 +1C90 +F1FE +1310 +11FC +FD10 +11FC +1110 +39FE +3420 +57FF +50A4 +90A4 +11A6 +1323 +1020 +ENDCHAR +STARTCHAR U+7A56 +ENCODING 31318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0922 +3A24 +E6AD +2122 +2225 +FAAF +27A4 +2022 +73FF +6A20 +A212 +A314 +2288 +2695 +2427 +2CC2 +ENDCHAR +STARTCHAR U+7A57 +ENCODING 31319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +05FC +38F8 +08A8 +08F8 +7EA8 +08F8 +1C28 +1BF4 +2A40 +48A8 +09A4 +0A94 +0870 +0000 +ENDCHAR +STARTCHAR U+7A58 +ENCODING 31320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +78FE +1010 +11FF +7C44 +11EF +3044 +59EF +1400 +11FF +1048 +1048 +1089 +110F +0000 +0000 +ENDCHAR +STARTCHAR U+7A59 +ENCODING 31321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0428 +1D29 +F0AA +1028 +11FF +FC44 +1028 +11FF +3810 +34FE +5410 +53FF +9028 +106C +10C6 +1383 +ENDCHAR +STARTCHAR U+7A5A +ENCODING 31322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +7020 +17FF +1088 +7D74 +1252 +1471 +3800 +57FE +1202 +1272 +1252 +1272 +1206 +0000 +0000 +ENDCHAR +STARTCHAR U+7A5B +ENCODING 31323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0920 +7110 +13FE +1510 +11FC +7D10 +11FC +3910 +55FE +1100 +1000 +124A +124A +1249 +0000 +0000 +ENDCHAR +STARTCHAR U+7A5C +ENCODING 31324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1C20 +F1FE +1084 +1048 +FBFF +1000 +11FC +3924 +35FC +5524 +51FC +9020 +11FE +1020 +13FF +ENDCHAR +STARTCHAR U+7A5D +ENCODING 31325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +04FE +1C82 +F0FE +1082 +10FE +FC00 +13FF +1120 +39FE +352A +55EA +512E +9124 +11EE +133B +1020 +ENDCHAR +STARTCHAR U+7A5F +ENCODING 31327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0842 +3866 +E224 +23FF +2110 +F821 +2053 +2012 +7328 +694C +A11A +A129 +2148 +2318 +2280 +267F +ENDCHAR +STARTCHAR U+7A60 +ENCODING 31328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0428 +1CFE +F0AA +10FE +10AA +FCFE +1000 +11FF +3900 +357E +5500 +51FF +9152 +135A +166C +10C7 +ENDCHAR +STARTCHAR U+7A61 +ENCODING 31329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0840 +77FC +1150 +1150 +7EE8 +17FC +3800 +37F8 +56E8 +52A8 +12E8 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+7A62 +ENCODING 31330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0940 +7178 +1140 +17FC +7C28 +13FC +3A20 +37E8 +56D8 +53B4 +16DC +14AC +1B44 +0000 +ENDCHAR +STARTCHAR U+7A63 +ENCODING 31331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1BFC +7110 +12A8 +17FC +7CA0 +13F8 +18A0 +37FC +34E8 +5790 +10B0 +10C8 +1304 +0000 +ENDCHAR +STARTCHAR U+7A65 +ENCODING 31333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0980 +3B4E +E272 +2242 +2346 +FA72 +2212 +2356 +7252 +6A52 +A252 +A7FF +2000 +2104 +2306 +2603 +ENDCHAR +STARTCHAR U+7A67 +ENCODING 31335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +3820 +E7FF +2050 +27AF +FAAA +22AA +25AD +7000 +6A02 +A3FE +A202 +23FE +2202 +2602 +2402 +ENDCHAR +STARTCHAR U+7A68 +ENCODING 31336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +7CFE +1092 +7CFE +1010 +39FF +54FE +1082 +38FE +2882 +28FE +2882 +2AFE +4EC6 +0000 +0000 +ENDCHAR +STARTCHAR U+7A69 +ENCODING 31337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0408 +09F0 +7148 +13F4 +1040 +7DF0 +11F8 +3BFC +3408 +55F8 +5040 +12A8 +1494 +1070 +0000 +ENDCHAR +STARTCHAR U+7A6A +ENCODING 31338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +3FFF +E124 +2222 +27FF +FA22 +2376 +22AA +7376 +6A22 +A376 +A2AA +2376 +2222 +2222 +2226 +ENDCHAR +STARTCHAR U+7A6B +ENCODING 31339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0490 +0BFC +70B0 +11FC +1320 +7DF8 +11F8 +1920 +35FC +37F8 +5090 +1060 +10F0 +170C +0000 +ENDCHAR +STARTCHAR U+7A6C +ENCODING 31340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +79FF +1124 +11FF +7D24 +113C +11FF +3100 +597E +154A +117E +124A +107E +1081 +0000 +0000 +ENDCHAR +STARTCHAR U+7A6D +ENCODING 31341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +1CF8 +F190 +10FE +1092 +FCFE +1092 +10FE +38AA +3529 +5400 +50FE +9082 +10FE +1082 +10FE +ENDCHAR +STARTCHAR U+7A6E +ENCODING 31342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +79FF +1100 +1128 +11FF +7D29 +11FF +1144 +3177 +5944 +1577 +1100 +1155 +1255 +0000 +0000 +ENDCHAR +STARTCHAR U+7A70 +ENCODING 31344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0FFC +73B8 +12A8 +13B8 +7CA0 +13F8 +39F0 +34A0 +57FC +50C8 +1730 +11D0 +130C +0000 +ENDCHAR +STARTCHAR U+7A71 +ENCODING 31345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +78FC +1092 +11FF +7D45 +11FF +1000 +31E2 +5922 +15FF +1122 +11EA +11C2 +1126 +0000 +0000 +ENDCHAR +STARTCHAR U+7A74 +ENCODING 31348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2008 +4000 +01C0 +0440 +0440 +0440 +0820 +0820 +1010 +2008 +4004 +0000 +ENDCHAR +STARTCHAR U+7A75 +ENCODING 31349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +383F +E000 +1FF8 +0070 +01C0 +0700 +1C00 +3000 +2002 +3006 +1FFC +ENDCHAR +STARTCHAR U+7A76 +ENCODING 31350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2488 +4480 +0488 +0978 +1100 +3FC0 +0240 +0240 +0444 +0844 +303C +0000 +ENDCHAR +STARTCHAR U+7A77 +ENCODING 31351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4002 +8444 +0C30 +1210 +0208 +3FFC +0208 +0208 +0408 +0408 +0888 +1050 +2020 +ENDCHAR +STARTCHAR U+7A78 +ENCODING 31352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4100 +7FFE +4002 +8824 +1210 +2208 +07F0 +0810 +1420 +2240 +0180 +0100 +0600 +1800 +6000 +ENDCHAR +STARTCHAR U+7A79 +ENCODING 31353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2288 +4C88 +3078 +1FF0 +0010 +1FF0 +1000 +3FF8 +2008 +0008 +00F0 +0000 +ENDCHAR +STARTCHAR U+7A7A +ENCODING 31354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2488 +4480 +0888 +1078 +0000 +1FF0 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7A7B +ENCODING 31355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +4808 +1004 +07F0 +0080 +0080 +3FFE +0080 +0080 +0480 +0280 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+7A7D +ENCODING 31357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2288 +4C88 +3478 +0440 +3FF8 +0440 +0440 +7FFC +0440 +0840 +3040 +0000 +ENDCHAR +STARTCHAR U+7A7E +ENCODING 31358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +383F +E000 +01F8 +3F00 +0100 +FFFF +0240 +0660 +0C30 +381C +E007 +ENDCHAR +STARTCHAR U+7A7F +ENCODING 31359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2488 +4888 +1078 +0FF0 +0840 +0840 +7FFC +0340 +0C40 +7040 +00C0 +0000 +ENDCHAR +STARTCHAR U+7A80 +ENCODING 31360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4100 +7FFE +4822 +9114 +0100 +FFFE +0100 +1110 +1110 +1110 +1FF0 +0110 +0102 +0102 +00FE +ENDCHAR +STARTCHAR U+7A81 +ENCODING 31361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2488 +4480 +0888 +1178 +0100 +7FFC +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+7A82 +ENCODING 31362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +383F +E000 +0900 +1FFC +3100 +E100 +0100 +FFFF +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+7A83 +ENCODING 31363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2488 +4488 +0878 +1000 +13F8 +1C48 +7048 +1088 +1288 +0F08 +0230 +0000 +ENDCHAR +STARTCHAR U+7A84 +ENCODING 31364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2488 +4488 +0A78 +1200 +07FC +1900 +61F8 +0100 +01F8 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7A85 +ENCODING 31365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4442 +4442 +0C40 +387F +E000 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+7A86 +ENCODING 31366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4100 +7FFE +4822 +9014 +0070 +1F80 +0200 +0120 +3FF0 +0040 +0180 +0E00 +3000 +4806 +07FC +ENDCHAR +STARTCHAR U+7A87 +ENCODING 31367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4809 +5405 +27FA +0808 +1008 +2FC8 +0848 +0FC8 +0810 +0802 +0802 +0FFE +0000 +0000 +ENDCHAR +STARTCHAR U+7A88 +ENCODING 31368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2288 +4C88 +3078 +0840 +0A40 +73F8 +1448 +0C48 +0A88 +1F08 +6230 +0000 +ENDCHAR +STARTCHAR U+7A89 +ENCODING 31369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0080 +7FFF +4411 +580D +0000 +3FFE +0080 +3FFE +2082 +2142 +2222 +200A +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+7A8A +ENCODING 31370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +383F +E000 +007C +1FC0 +1108 +1108 +1128 +312C +21F4 +6F16 +C003 +ENDCHAR +STARTCHAR U+7A8B +ENCODING 31371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +383F +E100 +0100 +1108 +1108 +1FF8 +0100 +2104 +2104 +2104 +3FFC +ENDCHAR +STARTCHAR U+7A8C +ENCODING 31372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +4809 +1004 +0400 +38FF +2221 +2221 +3E21 +022E +0420 +0820 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+7A8D +ENCODING 31373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4442 +8834 +1010 +03FC +7E80 +0888 +09FC +0808 +0808 +0E08 +7888 +2050 +0020 +ENDCHAR +STARTCHAR U+7A8F +ENCODING 31375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4221 +4411 +1000 +08FE +2410 +1010 +09FF +0410 +0810 +3810 +0850 +0820 +0000 +0000 +ENDCHAR +STARTCHAR U+7A90 +ENCODING 31376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +383F +E100 +0100 +1FF8 +0100 +7FFE +0000 +0100 +1FF8 +0100 +7FFE +ENDCHAR +STARTCHAR U+7A91 +ENCODING 31377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4822 +9014 +2808 +0FF0 +1100 +2104 +FFFE +0100 +2108 +2108 +2108 +3FF8 +2008 +ENDCHAR +STARTCHAR U+7A92 +ENCODING 31378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2488 +4490 +0870 +3FF8 +0240 +0470 +3F88 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7A93 +ENCODING 31379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2448 +4538 +0940 +1230 +0FC8 +0100 +1490 +1488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+7A94 +ENCODING 31380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +383F +E100 +0100 +FFFF +0810 +1818 +742E +0660 +03C0 +0E70 +F81F +ENDCHAR +STARTCHAR U+7A95 +ENCODING 31381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2488 +4888 +32F8 +0288 +32B0 +0AC0 +0EB0 +7488 +0484 +0884 +307C +0000 +ENDCHAR +STARTCHAR U+7A96 +ENCODING 31382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2288 +4C88 +3578 +0500 +0FF0 +1100 +7FFC +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7A97 +ENCODING 31383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2448 +4948 +3238 +1FF0 +1110 +17D0 +1E50 +1190 +1650 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7A98 +ENCODING 31384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2288 +4C88 +3078 +1FF0 +0210 +7FFC +0210 +1FF0 +07F8 +1C08 +67F8 +0408 +0000 +ENDCHAR +STARTCHAR U+7A99 +ENCODING 31385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4221 +4491 +1FFC +00A0 +7FFF +0100 +03F0 +0420 +0BFC +3040 +0040 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+7A9C +ENCODING 31388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4442 +9934 +0100 +3FF8 +2108 +3FF8 +0100 +7FFC +4104 +7FFC +4104 +0100 +0100 +ENDCHAR +STARTCHAR U+7A9D +ENCODING 31389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4442 +8824 +1FF0 +2828 +0820 +0FE0 +0108 +3FFC +2108 +2288 +2C68 +2028 +2010 +ENDCHAR +STARTCHAR U+7A9E +ENCODING 31390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +381F +E400 +0FFC +1804 +303C +0700 +3C7C +2004 +3E7C +2004 +3FFC +ENDCHAR +STARTCHAR U+7A9F +ENCODING 31391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2688 +5878 +1FF8 +1008 +1FF8 +1490 +1490 +17F0 +2888 +2888 +4FF8 +0808 +0000 +ENDCHAR +STARTCHAR U+7AA0 +ENCODING 31392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +7FFE +4822 +9014 +3FF8 +1110 +1FF0 +1110 +1FF0 +0104 +FFFE +0380 +0560 +191E +6108 +0100 +ENDCHAR +STARTCHAR U+7AA2 +ENCODING 31394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +4809 +0022 +7FFF +0020 +3FA0 +20A2 +3F94 +0008 +7F95 +0023 +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+7AA3 +ENCODING 31395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +4422 +4C22 +383F +E100 +3FFC +0810 +0810 +1C38 +366C +0100 +FFFF +0100 +0100 +ENDCHAR +STARTCHAR U+7AA5 +ENCODING 31397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0100 +7FFE +4442 +8824 +08F8 +3E88 +08A8 +08A8 +7EA8 +08A8 +0830 +1452 +1252 +208E +4300 +ENDCHAR +STARTCHAR U+7AA6 +ENCODING 31398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +7FFE +4822 +9114 +2FE8 +0100 +3FFC +0884 +0488 +1280 +0884 +FFFE +0140 +0230 +0C18 +3008 +ENDCHAR +STARTCHAR U+7AA8 +ENCODING 31400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +7FFE +4822 +9214 +0100 +3FF8 +0820 +0444 +FFFE +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+7AA9 +ENCODING 31401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2288 +4C88 +3078 +0FE0 +09E0 +0920 +3FF8 +27C8 +2448 +27C8 +2458 +0000 +ENDCHAR +STARTCHAR U+7AAA +ENCODING 31402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2488 +4488 +0878 +1040 +0BF8 +4840 +27FC +2040 +0BF8 +0840 +17FC +2000 +0000 +ENDCHAR +STARTCHAR U+7AAB +ENCODING 31403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +4809 +7F00 +087F +7F09 +0809 +7F17 +0880 +7FFF +0220 +0410 +380E +0000 +0000 +ENDCHAR +STARTCHAR U+7AAC +ENCODING 31404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +7FFE +4822 +9114 +2288 +0440 +0FF0 +300E +DE14 +1290 +1E90 +1290 +1E90 +1290 +1210 +1630 +ENDCHAR +STARTCHAR U+7AAD +ENCODING 31405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +7FFE +4922 +9114 +2928 +0540 +7FFC +0920 +3118 +0204 +FFFE +0420 +0E40 +0180 +0670 +3808 +ENDCHAR +STARTCHAR U+7AAE +ENCODING 31406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2488 +4890 +1470 +1EF0 +1210 +1EF0 +1E80 +12F8 +7E88 +0608 +1A08 +6630 +0000 +ENDCHAR +STARTCHAR U+7AAF +ENCODING 31407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2448 +4C48 +12B8 +3FF0 +0100 +0FE0 +0100 +3FF8 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7AB0 +ENCODING 31408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2288 +4C88 +3278 +07F0 +3A60 +0B80 +7FF0 +0900 +7FFC +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7AB1 +ENCODING 31409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +781F +0480 +08FE +7144 +1410 +15EF +1410 +15FF +1054 +1193 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+7AB2 +ENCODING 31410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +4809 +0000 +0C24 +1814 +2A04 +1C24 +7F14 +0804 +2A7F +4904 +0804 +0000 +0000 +ENDCHAR +STARTCHAR U+7AB3 +ENCODING 31411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +7FFE +4822 +9014 +2618 +38E8 +2CA8 +2CA8 +2AA8 +2AA8 +29A8 +29A8 +34A4 +5D54 +8172 +0200 +ENDCHAR +STARTCHAR U+7AB4 +ENCODING 31412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +0888 +7FFF +0FF8 +0808 +0FF8 +0FF8 +0808 +0FF8 +0808 +7FFF +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+7AB5 +ENCODING 31413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4422 +F83F +0100 +1FF8 +1008 +1FF8 +1008 +1FF8 +1000 +1FFF +1000 +5FFE +4922 +8496 +ENDCHAR +STARTCHAR U+7AB6 +ENCODING 31414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2548 +7FF8 +0920 +7FFC +0FE0 +0FE0 +0920 +0FE0 +7FFC +0640 +01E0 +3E10 +0000 +ENDCHAR +STARTCHAR U+7AB7 +ENCODING 31415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +580D +0000 +7DDF +2529 +3D29 +2529 +3DE9 +242E +7C28 +0448 +0588 +0000 +0000 +ENDCHAR +STARTCHAR U+7AB8 +ENCODING 31416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +580D +0000 +1FF8 +2082 +188C +7FFF +02A0 +1C9C +4904 +488A +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+7AB9 +ENCODING 31417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4422 +F83F +0000 +45FF +4420 +7CFC +0444 +05FF +FC00 +24FE +2482 +6482 +4482 +C4FE +ENDCHAR +STARTCHAR U+7ABA +ENCODING 31418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2488 +4878 +19F0 +0910 +3FF0 +0910 +7FF0 +0910 +15F0 +14A4 +2124 +461C +0000 +ENDCHAR +STARTCHAR U+7ABB +ENCODING 31419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4422 +F93F +0200 +3FFC +2104 +25E4 +2E24 +2144 +2F84 +2044 +3FFC +0480 +644B +C3F9 +ENDCHAR +STARTCHAR U+7ABC +ENCODING 31420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4422 +F83F +2208 +1110 +3FFC +2104 +3FFC +2104 +3FFC +0100 +FFFF +0520 +1D38 +F10F +ENDCHAR +STARTCHAR U+7ABE +ENCODING 31422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4221 +4C1D +0408 +7FC8 +040F +3F91 +0025 +3F84 +0004 +7FC4 +248A +4C51 +0000 +0000 +ENDCHAR +STARTCHAR U+7ABF +ENCODING 31423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2288 +4C78 +3040 +3CF8 +2790 +38E0 +2B5C +25F8 +2640 +39F0 +2040 +27FC +0000 +ENDCHAR +STARTCHAR U+7AC0 +ENCODING 31424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4411 +0808 +003E +7FA2 +043E +0422 +173E +1422 +143E +1414 +7F95 +0067 +0000 +0000 +ENDCHAR +STARTCHAR U+7AC1 +ENCODING 31425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4829 +53C5 +07F0 +07F8 +0082 +007E +0200 +1C38 +3E7C +3E7C +0891 +078F +0000 +0000 +ENDCHAR +STARTCHAR U+7AC3 +ENCODING 31427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2D48 +77F8 +3FF8 +0FE0 +0FE0 +0920 +0FE0 +1FF0 +1FF0 +1114 +1FF4 +10FC +0000 +ENDCHAR +STARTCHAR U+7AC4 +ENCODING 31428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2488 +5978 +1EF0 +1010 +1EF0 +1FF0 +1110 +1DD0 +1DD4 +110C +1DCC +7304 +0000 +ENDCHAR +STARTCHAR U+7AC5 +ENCODING 31429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2288 +4C88 +3878 +3E40 +227C +3E88 +3F48 +0850 +7F30 +0E30 +12C8 +6704 +0000 +ENDCHAR +STARTCHAR U+7AC6 +ENCODING 31430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4422 +F83F +1000 +3EFE +2282 +3E82 +22FE +3E10 +2220 +FEFE +0A82 +3282 +C282 +0EFE +ENDCHAR +STARTCHAR U+7AC7 +ENCODING 31431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2648 +5978 +7FFC +0FE0 +3FF8 +2CE8 +3FF8 +1FF0 +1FD0 +17F0 +1FF0 +781C +0000 +ENDCHAR +STARTCHAR U+7AC8 +ENCODING 31432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2928 +77D8 +3FF8 +1FF0 +1290 +1EF0 +3EF8 +2288 +3EF8 +3EF8 +2284 +01FC +0000 +ENDCHAR +STARTCHAR U+7AC9 +ENCODING 31433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4422 +F83F +0840 +7F7F +2240 +147E +FF82 +227E +3E40 +227E +3E40 +227E +2241 +263F +ENDCHAR +STARTCHAR U+7ACA +ENCODING 31434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2688 +5878 +0620 +7A3C +2AF8 +1CA8 +7ED8 +19FC +1D54 +2BFC +4904 +090C +0000 +ENDCHAR +STARTCHAR U+7ACB +ENCODING 31435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +3FF8 +0020 +0820 +0420 +0420 +0220 +0240 +0240 +0080 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7ACC +ENCODING 31436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1078 +1048 +FE48 +0048 +4448 +4448 +6448 +2C48 +2848 +2848 +0E48 +38C8 +E089 +0189 +0307 +ENDCHAR +STARTCHAR U+7ACD +ENCODING 31437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7F20 +0220 +2220 +13FC +1220 +1420 +1420 +0620 +1820 +6020 +0020 +0000 +ENDCHAR +STARTCHAR U+7ACE +ENCODING 31438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +0010 +0810 +0C30 +0420 +FFFF +0000 +0420 +0420 +FFFF +0420 +0C20 +1820 +3020 +ENDCHAR +STARTCHAR U+7ACF +ENCODING 31439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +08E0 +7F20 +0220 +2220 +13FC +1220 +1420 +1420 +0620 +1820 +6020 +0020 +0000 +ENDCHAR +STARTCHAR U+7AD1 +ENCODING 31441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +FDFF +0020 +4420 +4420 +6468 +2C48 +2858 +28D0 +0E92 +39B2 +E022 +007F +00C1 +ENDCHAR +STARTCHAR U+7AD2 +ENCODING 31442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0820 +0420 +0440 +7FFC +0010 +1F10 +1110 +1110 +1F10 +1110 +0030 +0000 +ENDCHAR +STARTCHAR U+7AD3 +ENCODING 31443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +09E0 +7E40 +0440 +2478 +15C0 +1440 +147C +19C0 +0E40 +1844 +6044 +003C +0000 +ENDCHAR +STARTCHAR U+7AD5 +ENCODING 31445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +0810 +0850 +7E50 +0488 +2488 +15FC +1648 +1448 +1848 +0E88 +1888 +6108 +0230 +0000 +ENDCHAR +STARTCHAR U+7AD6 +ENCODING 31446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +25FC +2504 +2488 +2450 +2420 +2450 +248E +0704 +0110 +3FF8 +0820 +0820 +0444 +FFFE +0000 +ENDCHAR +STARTCHAR U+7AD7 +ENCODING 31447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1054 +1052 +7C91 +0090 +4510 +4411 +2811 +2812 +0072 +0E04 +7008 +0010 +0060 +0180 +ENDCHAR +STARTCHAR U+7AD8 +ENCODING 31448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +083F +0021 +7F41 +2201 +2279 +2249 +2249 +2279 +1449 +7F01 +000A +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+7AD9 +ENCODING 31449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +7F7C +0440 +2440 +1440 +15F8 +1508 +0908 +0F08 +1908 +61F8 +0108 +0000 +ENDCHAR +STARTCHAR U+7ADA +ENCODING 31450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7F08 +0600 +2400 +15FC +1420 +1420 +1820 +0E20 +1820 +6020 +0060 +0000 +ENDCHAR +STARTCHAR U+7ADB +ENCODING 31451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +106C +FEC6 +0183 +447C +4400 +6400 +2CFE +2822 +2822 +0E22 +3822 +E02E +0020 +0020 +ENDCHAR +STARTCHAR U+7ADC +ENCODING 31452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0440 +7FFC +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +1114 +0104 +00FC +0000 +ENDCHAR +STARTCHAR U+7ADD +ENCODING 31453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +7FFC +0208 +2288 +1248 +1248 +1450 +1450 +0610 +1820 +63FC +0000 +0000 +ENDCHAR +STARTCHAR U+7ADE +ENCODING 31454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0110 +3FF8 +0820 +0444 +FFFE +0010 +1FF8 +1010 +1010 +1FF0 +1450 +0440 +0442 +0842 +703E +ENDCHAR +STARTCHAR U+7ADF +ENCODING 31455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0440 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0284 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+7AE0 +ENCODING 31456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0440 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7AE1 +ENCODING 31457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +0820 +7E40 +05F8 +2508 +1508 +1508 +15F8 +0908 +0F08 +1908 +61F8 +0108 +0000 +ENDCHAR +STARTCHAR U+7AE2 +ENCODING 31458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0830 +7F48 +05F4 +2484 +14F8 +14A0 +1520 +09FC +0E20 +1850 +6088 +0304 +0000 +ENDCHAR +STARTCHAR U+7AE3 +ENCODING 31459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1050 +1088 +13FC +7EA4 +04A4 +459C +26F0 +2890 +2990 +0E60 +7060 +0190 +060C +0000 +ENDCHAR +STARTCHAR U+7AE4 +ENCODING 31460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +21FF +1101 +0901 +7E20 +2420 +25FF +2440 +2480 +2510 +2420 +7E42 +00FE +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+7AE5 +ENCODING 31461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0440 +7FFC +0FE0 +0920 +0FE0 +0920 +0FE0 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7AE6 +ENCODING 31462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +7E20 +04F8 +24A8 +14A8 +14F8 +1470 +0870 +0EA8 +1924 +6220 +0020 +0000 +ENDCHAR +STARTCHAR U+7AE8 +ENCODING 31464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103F +1020 +FDFE +0102 +4902 +49FE +4902 +5902 +51FE +1020 +1C20 +73FF +C020 +0020 +0020 +ENDCHAR +STARTCHAR U+7AE9 +ENCODING 31465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +FE01 +0201 +48FC +4884 +4884 +58FC +5084 +1084 +1CFC +7084 +C084 +03FF +0000 +ENDCHAR +STARTCHAR U+7AEA +ENCODING 31466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3E48 +2230 +3E30 +24C8 +3F04 +0100 +3FF8 +0820 +0440 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7AEB +ENCODING 31467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +103C +13E2 +FD26 +0094 +49FE +4822 +4822 +5BFF +5022 +1022 +1DFE +7020 +C020 +0020 +00E0 +ENDCHAR +STARTCHAR U+7AEC +ENCODING 31468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +103C +11E0 +FC20 +01FE +4922 +4922 +49FE +5820 +53FF +1221 +1E29 +723D +C2E5 +0201 +0207 +ENDCHAR +STARTCHAR U+7AED +ENCODING 31469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F0 +0910 +7FF0 +0510 +25F0 +1480 +14F8 +1548 +0B68 +0F98 +19F8 +6108 +0030 +0000 +ENDCHAR +STARTCHAR U+7AEE +ENCODING 31470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +2101 +11FF +0100 +7D42 +2924 +297E +2924 +2924 +29FF +2924 +2A24 +7C44 +0084 +0000 +0000 +ENDCHAR +STARTCHAR U+7AEF +ENCODING 31471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +1248 +1248 +13F8 +7C00 +0BFC +4840 +2BF8 +2AA8 +32A8 +1EA8 +72A8 +02A8 +0218 +0000 +ENDCHAR +STARTCHAR U+7AF0 +ENCODING 31472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1200 +7EF8 +0AA8 +4AF8 +2AA8 +2AF8 +2A20 +32F8 +1620 +1C20 +67FC +0800 +0000 +ENDCHAR +STARTCHAR U+7AF1 +ENCODING 31473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +13FF +FC20 +01FE +4922 +49FE +4922 +59FE +5024 +107E +1DC3 +7004 +C3FF +0084 +005C +ENDCHAR +STARTCHAR U+7AF4 +ENCODING 31476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +1084 +13FF +FC48 +01FE +494A +498E +4902 +59FE +5102 +11FE +1C04 +73FF +C084 +0044 +000C +ENDCHAR +STARTCHAR U+7AF6 +ENCODING 31478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +3FF8 +1450 +1450 +7FFC +0000 +3EF8 +2288 +3EF8 +1450 +1550 +2694 +450C +0000 +ENDCHAR +STARTCHAR U+7AF7 +ENCODING 31479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3F +2254 +1408 +7F14 +002A +3E7F +2228 +3E3E +3E28 +083E +7F54 +0808 +0877 +0000 +0000 +ENDCHAR +STARTCHAR U+7AF8 +ENCODING 31480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +3EF8 +1450 +7FFC +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +1450 +1554 +2694 +4D0C +0000 +ENDCHAR +STARTCHAR U+7AF9 +ENCODING 31481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +0840 +1FFC +1490 +2510 +4410 +0410 +0410 +0410 +0410 +0410 +0430 +0000 +ENDCHAR +STARTCHAR U+7AFA +ENCODING 31482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +1F7C +28A0 +2490 +4510 +0000 +1FF0 +0000 +0000 +0000 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7AFB +ENCODING 31483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +CC18 +0408 +0100 +0100 +7FFC +0104 +0304 +0204 +0604 +0C0C +1808 +7038 +ENDCHAR +STARTCHAR U+7AFD +ENCODING 31485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +4510 +8000 +3FF8 +0100 +0104 +FFFE +0100 +0100 +0100 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+7AFE +ENCODING 31486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +CC18 +0488 +1080 +109C +13F4 +1E84 +F084 +1084 +109C +1001 +1803 +0FFE +ENDCHAR +STARTCHAR U+7AFF +ENCODING 31487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1FFC +28A0 +2510 +4210 +3FF8 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7B00 +ENCODING 31488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +3F3F +4848 +0404 +0080 +0080 +7FFF +0800 +0800 +0800 +0800 +0800 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7B01 +ENCODING 31489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +3F3F +4848 +0404 +0000 +0004 +3FFE +0080 +0080 +0080 +0080 +0082 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+7B02 +ENCODING 31490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1EFC +2920 +4510 +0100 +3FE0 +0120 +0D20 +0320 +02A0 +0464 +1824 +601C +0000 +ENDCHAR +STARTCHAR U+7B03 +ENCODING 31491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +4510 +0020 +3FF0 +0820 +0820 +0824 +0FFE +0004 +7FF4 +0004 +0014 +0008 +ENDCHAR +STARTCHAR U+7B04 +ENCODING 31492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0000 +3FF8 +0440 +0440 +7FFC +0440 +0840 +1040 +6040 +0000 +ENDCHAR +STARTCHAR U+7B05 +ENCODING 31493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0804 +0210 +0120 +00C0 +0738 +0000 +0220 +0140 +0080 +0140 +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+7B06 +ENCODING 31494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0000 +1FF0 +1110 +1110 +1FF0 +1010 +1004 +1004 +0FFC +0000 +ENDCHAR +STARTCHAR U+7B07 +ENCODING 31495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +CC18 +0508 +0100 +FFFF +0100 +0100 +01E0 +0138 +010E +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+7B08 +ENCODING 31496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2310 +5FE0 +0420 +0440 +06F0 +0A10 +0920 +10C0 +2360 +4C1C +0000 +ENDCHAR +STARTCHAR U+7B09 +ENCODING 31497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0202 +0800 +1FFF +2001 +07E1 +0001 +0FF1 +0001 +0002 +0024 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+7B0A +ENCODING 31498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0018 +0FE0 +0920 +0920 +0920 +1110 +1110 +2108 +4104 +0000 +ENDCHAR +STARTCHAR U+7B0B +ENCODING 31499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +1FF0 +0110 +7FFC +0110 +1FF0 +0110 +0200 +0C00 +3000 +0000 +ENDCHAR +STARTCHAR U+7B0E +ENCODING 31502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0404 +0000 +1FFC +0000 +7FFF +0220 +0220 +0220 +0421 +0821 +303F +0000 +0000 +ENDCHAR +STARTCHAR U+7B0F +ENCODING 31503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0800 +0FF8 +1248 +2248 +4488 +0888 +1108 +0210 +0060 +0000 +ENDCHAR +STARTCHAR U+7B10 +ENCODING 31504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0404 +0080 +7FFF +0000 +07F0 +0410 +0410 +0410 +0411 +0811 +101F +0000 +0000 +ENDCHAR +STARTCHAR U+7B11 +ENCODING 31505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1FFC +28A0 +2510 +4210 +01E0 +1F00 +0100 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+7B12 +ENCODING 31506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0484 +0140 +0220 +0410 +79CF +0000 +1FFC +0010 +0020 +0040 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+7B13 +ENCODING 31507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +3F3F +4848 +0404 +2040 +2040 +2040 +3F7E +2040 +2040 +2141 +2241 +7C7F +0000 +0000 +ENDCHAR +STARTCHAR U+7B14 +ENCODING 31508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0A28 +1F7C +28A0 +4510 +007C +7F80 +0110 +0178 +3F80 +0108 +017C +FF80 +0102 +0102 +00FE +ENDCHAR +STARTCHAR U+7B15 +ENCODING 31509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +0010 +1FF8 +1010 +1110 +1110 +1190 +1290 +1290 +0482 +1882 +E07E +ENDCHAR +STARTCHAR U+7B18 +ENCODING 31512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0100 +01FC +0100 +0100 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7B19 +ENCODING 31513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0900 +0900 +1FF8 +1100 +2FE0 +4100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7B1A +ENCODING 31514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0404 +0000 +3FFE +2082 +3FFE +2082 +3FFE +2082 +0080 +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7B1B +ENCODING 31515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2310 +4100 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7B1D +ENCODING 31517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0404 +3FFE +2002 +27F2 +2412 +2222 +2082 +2142 +2E3A +2002 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+7B1E +ENCODING 31518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0200 +0260 +0438 +7FC4 +0000 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7B1F +ENCODING 31519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +69A0 +CC30 +041C +01F0 +1F08 +1008 +1108 +1108 +1128 +312C +21F4 +6F16 +C003 +ENDCHAR +STARTCHAR U+7B20 +ENCODING 31520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1FFC +18A0 +2510 +4510 +0100 +3FF8 +0020 +0820 +0440 +0480 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7B22 +ENCODING 31522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +3FFC +2004 +3FFC +2040 +3FFE +2040 +2220 +2411 +2809 +7007 +0000 +0000 +ENDCHAR +STARTCHAR U+7B23 +ENCODING 31523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +1000 +3FFC +6004 +DFC4 +1044 +104C +1FC8 +1038 +1001 +1803 +0FFE +ENDCHAR +STARTCHAR U+7B24 +ENCODING 31524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +3FF8 +0208 +0210 +0450 +0820 +3FF0 +D010 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+7B25 +ENCODING 31525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +0000 +7FF8 +0008 +3FE8 +0008 +1F88 +1088 +1F88 +1088 +0018 +0000 +ENDCHAR +STARTCHAR U+7B26 +ENCODING 31526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1FFC +28A0 +4510 +0810 +0810 +17FC +1110 +3090 +5090 +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+7B27 +ENCODING 31527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +CC18 +0408 +3FFC +2444 +2444 +2444 +FFFF +2444 +2444 +2444 +2444 +244C +ENDCHAR +STARTCHAR U+7B28 +ENCODING 31528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0100 +0100 +7FFC +0380 +0540 +1930 +67CC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7B29 +ENCODING 31529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0000 +0848 +184C +3044 +67FF +A040 +2060 +2030 +2019 +200F +2002 +ENDCHAR +STARTCHAR U+7B2A +ENCODING 31530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +1FF8 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +0004 +FFFE +0000 +ENDCHAR +STARTCHAR U+7B2B +ENCODING 31531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +0108 +3FF0 +2100 +2104 +3FFE +0304 +0504 +0944 +3128 +C110 +0100 +ENDCHAR +STARTCHAR U+7B2C +ENCODING 31532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1FF8 +2920 +4610 +3FF0 +0110 +3FF0 +2100 +3FF8 +2308 +0508 +1930 +6100 +0000 +ENDCHAR +STARTCHAR U+7B2D +ENCODING 31533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1FFF +2448 +4284 +0140 +0220 +0410 +180C +67F3 +0000 +0000 +0FF8 +0208 +0208 +0270 +0200 +ENDCHAR +STARTCHAR U+7B2E +ENCODING 31534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +0408 +0FFC +0A00 +1210 +23F8 +4200 +0208 +03FC +0200 +0200 +0200 +ENDCHAR +STARTCHAR U+7B2F +ENCODING 31535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0800 +08FE +FF42 +1142 +1166 +3324 +223C +7E18 +0B3C +3166 +E0C3 +ENDCHAR +STARTCHAR U+7B30 +ENCODING 31536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0440 +7FFC +0444 +7FFC +4440 +4440 +7FFE +0442 +0C42 +1846 +705C +ENDCHAR +STARTCHAR U+7B31 +ENCODING 31537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +0808 +0FFC +1008 +1048 +2FE8 +4848 +0848 +0FC8 +0808 +0028 +0010 +ENDCHAR +STARTCHAR U+7B32 +ENCODING 31538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1F1F +2424 +4202 +0410 +0808 +1FFC +0414 +0410 +7FFF +0410 +0810 +1010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+7B33 +ENCODING 31539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0800 +08F8 +7E88 +0A88 +0A88 +1288 +1288 +22F8 +4C88 +0000 +ENDCHAR +STARTCHAR U+7B34 +ENCODING 31540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0000 +FFFF +0008 +1F88 +1088 +1088 +1088 +1F88 +0008 +0008 +0038 +ENDCHAR +STARTCHAR U+7B35 +ENCODING 31541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +1000 +09F8 +4908 +2108 +2508 +0930 +1104 +2104 +20FC +0000 +ENDCHAR +STARTCHAR U+7B36 +ENCODING 31542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0800 +0FF8 +1100 +2100 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+7B38 +ENCODING 31544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +3FFC +2000 +2010 +27F8 +2410 +2410 +27F0 +2410 +2004 +3FFE +0000 +ENDCHAR +STARTCHAR U+7B39 +ENCODING 31545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2310 +4920 +0920 +7FFC +0920 +0920 +09E0 +0800 +0FF8 +0800 +0000 +ENDCHAR +STARTCHAR U+7B3A +ENCODING 31546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1448 +3EFC +4820 +0280 +0250 +7FF8 +0200 +0104 +7FFE +0110 +0120 +00C0 +0744 +3824 +001C +ENDCHAR +STARTCHAR U+7B3B +ENCODING 31547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0404 +0000 +7EFE +0842 +0842 +0942 +0944 +0A58 +7C40 +0040 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+7B3C +ENCODING 31548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +0240 +0224 +FFFE +0280 +0290 +0490 +04A0 +08C2 +0882 +1182 +267E +4000 +ENDCHAR +STARTCHAR U+7B3D +ENCODING 31549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +CC18 +0408 +0000 +3FFC +2444 +2444 +2444 +2444 +2444 +2444 +FFFF +0000 +ENDCHAR +STARTCHAR U+7B3E +ENCODING 31550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +2080 +1088 +07FC +7088 +1088 +1108 +1108 +1228 +2C10 +4406 +03FC +ENDCHAR +STARTCHAR U+7B3F +ENCODING 31551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +0408 +0FF0 +1830 +7660 +03C0 +1E78 +F00F +0000 +1FF8 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+7B40 +ENCODING 31552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0100 +3FFC +0100 +0100 +FFFF +0000 +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+7B41 +ENCODING 31553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6590 +C208 +0440 +0440 +7FFE +4442 +4442 +7FFE +4442 +4442 +4442 +7FFE +0000 +ENDCHAR +STARTCHAR U+7B44 +ENCODING 31556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0404 +0000 +0240 +1248 +0A50 +0660 +0650 +3A4E +0241 +0441 +783E +0000 +0000 +ENDCHAR +STARTCHAR U+7B45 +ENCODING 31557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0900 +0FF0 +1100 +7FFC +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+7B46 +ENCODING 31558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +2520 +5FF0 +0110 +7FFC +0110 +1FF0 +0100 +1FF0 +0100 +3FF8 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7B47 +ENCODING 31559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +4510 +0000 +7EFC +0888 +0890 +0890 +0888 +0EC4 +78A4 +2098 +0080 +0080 +ENDCHAR +STARTCHAR U+7B48 +ENCODING 31560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2318 +5FE0 +0100 +7FFC +0100 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7B49 +ENCODING 31561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1FFC +28A0 +4510 +1FF0 +0100 +3FF8 +0040 +7FFC +0840 +0440 +0440 +00C0 +0000 +ENDCHAR +STARTCHAR U+7B4A +ENCODING 31562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1F1F +2424 +0282 +0080 +7FFF +0808 +1024 +2222 +0140 +0080 +0140 +0220 +3C1E +0000 +0000 +ENDCHAR +STARTCHAR U+7B4B +ENCODING 31563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2310 +4040 +1E40 +13F8 +1E48 +1248 +1E48 +2288 +2288 +4730 +0000 +ENDCHAR +STARTCHAR U+7B4C +ENCODING 31564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0280 +0440 +1830 +6FEC +0100 +0FE0 +0100 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+7B4D +ENCODING 31565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0400 +0FF8 +1008 +6F88 +0888 +0F88 +0888 +0F88 +08B0 +0000 +ENDCHAR +STARTCHAR U+7B4E +ENCODING 31566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0800 +0800 +FF3E +1122 +1122 +3322 +2222 +7E22 +0B22 +31BE +E000 +ENDCHAR +STARTCHAR U+7B4F +ENCODING 31567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2310 +4450 +0448 +0BFC +1848 +2830 +4820 +08D4 +0B0C +0804 +0000 +ENDCHAR +STARTCHAR U+7B50 +ENCODING 31568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +3FFC +2000 +2FF8 +2080 +27F0 +2080 +2FF8 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+7B51 +ENCODING 31569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2310 +4210 +7FF0 +1110 +1190 +1150 +1E50 +7214 +0414 +080C +0000 +ENDCHAR +STARTCHAR U+7B52 +ENCODING 31570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2310 +5FF8 +1008 +17E8 +1008 +13C8 +1248 +1248 +13C8 +1018 +0000 +ENDCHAR +STARTCHAR U+7B54 +ENCODING 31572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +14A0 +2390 +4280 +0440 +1FF0 +600C +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7B55 +ENCODING 31573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0800 +39FE +E000 +0800 +1BFF +7008 +D008 +1008 +1008 +1008 +1038 +ENDCHAR +STARTCHAR U+7B56 +ENCODING 31574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1FFC +28A0 +4510 +7FFC +0100 +1FF0 +1110 +13E0 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+7B58 +ENCODING 31576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +0800 +0804 +FEFE +0884 +0884 +0E84 +7884 +0884 +08FC +2884 +1000 +ENDCHAR +STARTCHAR U+7B5A +ENCODING 31578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +1080 +1E98 +10E0 +1084 +1EFC +0100 +FFFE +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+7B5B +ENCODING 31579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1F7C +28A0 +4510 +0804 +4BFE +4820 +49FC +4924 +4924 +4924 +4924 +1134 +1128 +2020 +4020 +ENDCHAR +STARTCHAR U+7B5D +ENCODING 31581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +03E0 +0C80 +3FF0 +0110 +7FFC +0110 +1FF0 +0110 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+7B60 +ENCODING 31584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +1084 +10FE +7C84 +1144 +1224 +1004 +1C34 +E1C4 +4084 +0014 +0008 +ENDCHAR +STARTCHAR U+7B61 +ENCODING 31585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4844 +0000 +03E0 +0410 +0BE8 +1084 +6FFB +02A0 +0490 +0888 +7087 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7B62 +ENCODING 31586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +4510 +0804 +09FE +7F24 +0924 +0D24 +19FC +6904 +0900 +0902 +2902 +10FE +ENDCHAR +STARTCHAR U+7B63 +ENCODING 31587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0404 +0000 +3F82 +0412 +7FD2 +0412 +1512 +2492 +4442 +040A +0404 +0000 +0000 +ENDCHAR +STARTCHAR U+7B64 +ENCODING 31588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0100 +1FF8 +1008 +1FF8 +1008 +1FF8 +1046 +106C +1030 +1F1C +7007 +ENDCHAR +STARTCHAR U+7B65 +ENCODING 31589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +1FF0 +1010 +1010 +1FF0 +0200 +3FF8 +2008 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+7B66 +ENCODING 31590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0100 +7FFE +4002 +5FFA +0000 +0000 +FFFF +0440 +0C40 +1841 +3063 +E03E +ENDCHAR +STARTCHAR U+7B67 +ENCODING 31591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1FFC +2920 +4FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0284 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+7B69 +ENCODING 31593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0000 +3FFC +0010 +0220 +3FFE +2082 +3FFE +2082 +3FFE +2082 +6082 +408E +ENDCHAR +STARTCHAR U+7B6A +ENCODING 31594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +3FFE +2000 +27FC +2444 +27FC +2444 +2444 +27FC +2040 +2040 +3FFE +ENDCHAR +STARTCHAR U+7B6C +ENCODING 31596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0090 +1FFC +1088 +1E48 +1250 +1234 +1234 +2CCC +4304 +0000 +ENDCHAR +STARTCHAR U+7B6D +ENCODING 31597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +7FFE +0100 +3FFC +0100 +FFFF +0810 +0810 +FFFF +0810 +1810 +7010 +ENDCHAR +STARTCHAR U+7B6E +ENCODING 31598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +3FF8 +0920 +0920 +0D30 +1348 +2388 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7B6F +ENCODING 31599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0020 +3E20 +22FE +2222 +3E22 +2222 +3E22 +2262 +2242 +2F42 +F8CE +ENDCHAR +STARTCHAR U+7B70 +ENCODING 31600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0900 +09FC +1240 +347C +5040 +107C +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+7B71 +ENCODING 31601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0880 +0880 +14FC +3590 +5690 +1450 +1420 +14D0 +130C +0000 +ENDCHAR +STARTCHAR U+7B72 +ENCODING 31602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +C510 +0920 +0550 +1FF8 +1010 +1FF0 +1010 +1FF0 +1010 +1010 +1050 +1020 +ENDCHAR +STARTCHAR U+7B73 +ENCODING 31603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +000C +FDF8 +0820 +1020 +7FFF +0820 +4820 +59FC +3000 +6C00 +C3FF +ENDCHAR +STARTCHAR U+7B74 +ENCODING 31604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0100 +7FFC +0920 +0930 +16C8 +2288 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+7B75 +ENCODING 31605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +451C +7BF0 +0820 +113C +3D20 +4920 +2920 +18FC +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+7B76 +ENCODING 31606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0080 +0880 +0FF8 +1080 +0080 +7FFF +0000 +0FF8 +0808 +0808 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+7B77 +ENCODING 31607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1244 +1F7E +28A0 +4510 +9040 +1048 +13FC +5848 +5448 +5048 +97FE +1040 +10A0 +1110 +120E +1C04 +ENDCHAR +STARTCHAR U+7B78 +ENCODING 31608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3FBF +4448 +0204 +1FFC +1004 +1FFC +1FFC +0000 +1FFC +0080 +7FFF +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7B79 +ENCODING 31609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +0100 +7FFC +0200 +3FF8 +0400 +FFFE +0810 +1FFC +2410 +4210 +0250 +0020 +ENDCHAR +STARTCHAR U+7B7A +ENCODING 31610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +3FFC +2000 +2FF8 +2080 +27F0 +2090 +2FF8 +2000 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+7B7B +ENCODING 31611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7E +28A0 +4514 +FFFE +0100 +3FF8 +2108 +3FF8 +2108 +3FF8 +2908 +0500 +0300 +0CE0 +701E +ENDCHAR +STARTCHAR U+7B7D +ENCODING 31613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1FFF +2448 +4284 +0000 +27F8 +2408 +27F8 +2000 +3FFE +0080 +7FFF +0140 +0220 +0C18 +7007 +ENDCHAR +STARTCHAR U+7B7E +ENCODING 31614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +1F7C +28A0 +4510 +0280 +0440 +0830 +304E +CFE4 +0000 +1210 +0910 +0920 +0040 +3FF8 +ENDCHAR +STARTCHAR U+7B80 +ENCODING 31616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1244 +1F7E +28A0 +4510 +9008 +2BFC +2008 +27C8 +2448 +2448 +27C8 +2448 +2448 +27C8 +2028 +2010 +ENDCHAR +STARTCHAR U+7B82 +ENCODING 31618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +0080 +7FFF +0888 +1494 +22A2 +01C0 +0490 +388E +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7B84 +ENCODING 31620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0100 +3FFC +2104 +3FFC +2104 +3FFC +0420 +0820 +FFFF +0020 +0020 +ENDCHAR +STARTCHAR U+7B85 +ENCODING 31621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +4510 +1FF8 +1110 +1FF0 +1110 +1FF0 +0004 +FFFE +0820 +0820 +1020 +2020 +ENDCHAR +STARTCHAR U+7B86 +ENCODING 31622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +2490 +5FF0 +1110 +1290 +1450 +1088 +1F90 +10E0 +1384 +1C84 +707C +0000 +ENDCHAR +STARTCHAR U+7B87 +ENCODING 31623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4510 +3FF8 +2108 +2FE8 +2108 +27C8 +2448 +27C8 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+7B88 +ENCODING 31624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +6020 +1040 +0082 +63FF +1000 +09FE +1102 +6102 +21FE +2102 +0000 +0000 +ENDCHAR +STARTCHAR U+7B89 +ENCODING 31625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +2000 +21FC +F904 +2104 +21FC +2000 +3BFE +E042 +2042 +20C2 +2182 +670E +ENDCHAR +STARTCHAR U+7B8A +ENCODING 31626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0404 +0000 +0810 +0428 +7F44 +1083 +1E10 +120C +6220 +0210 +0C0C +0000 +0000 +ENDCHAR +STARTCHAR U+7B8B +ENCODING 31627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4518 +3FFC +0110 +00E0 +1FB4 +024C +7FF8 +0120 +00C4 +03B4 +3C0C +0000 +ENDCHAR +STARTCHAR U+7B8C +ENCODING 31628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +7FC1 +0809 +1089 +3F89 +0489 +0409 +3F89 +0401 +0405 +7FC2 +0000 +0000 +ENDCHAR +STARTCHAR U+7B8D +ENCODING 31629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +1000 +13FC +7E20 +12F8 +12A8 +1AA8 +72B8 +1220 +13FC +3200 +0000 +ENDCHAR +STARTCHAR U+7B8E +ENCODING 31630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C910 +0488 +00FC +0080 +3FFF +2101 +21F0 +2F04 +20FC +2000 +6220 +4221 +C633 +1C1E +ENDCHAR +STARTCHAR U+7B8F +ENCODING 31631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4518 +3FF0 +1108 +3FF4 +4110 +7FFC +0110 +1FF0 +0110 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+7B90 +ENCODING 31632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +68A0 +8510 +7FFC +0100 +3FF8 +0100 +FFFE +1010 +1FF0 +1010 +1FF0 +1010 +1030 +ENDCHAR +STARTCHAR U+7B91 +ENCODING 31633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0508 +FFFF +0100 +3FFC +0104 +FFFF +0104 +3FFC +1100 +11F8 +3900 +6D00 +C7FF +ENDCHAR +STARTCHAR U+7B92 +ENCODING 31634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +5FF0 +0010 +7FFC +1FF0 +3FFC +2108 +5FF0 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+7B94 +ENCODING 31636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +24A0 +4330 +1040 +09F8 +4108 +2908 +09F8 +1108 +1108 +21F8 +2108 +0000 +ENDCHAR +STARTCHAR U+7B95 +ENCODING 31637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4D30 +3FF8 +0820 +0FE0 +0820 +0FE0 +0820 +7FFC +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+7B96 +ENCODING 31638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C408 +0810 +0810 +FFFF +0810 +1C38 +1A38 +2954 +68D6 +C993 +0810 +0810 +ENDCHAR +STARTCHAR U+7B97 +ENCODING 31639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +2490 +4FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0440 +7FFC +0440 +1840 +0000 +ENDCHAR +STARTCHAR U+7B98 +ENCODING 31640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +3FF8 +2028 +2FC8 +2108 +3FF8 +27C8 +3938 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+7B99 +ENCODING 31641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +3DF8 +2508 +2530 +3DF8 +2548 +3D48 +2530 +2530 +25C8 +4D04 +0000 +ENDCHAR +STARTCHAR U+7B9A +ENCODING 31642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0408 +0648 +0948 +1FC8 +6048 +1F48 +1148 +1F08 +1118 +0000 +ENDCHAR +STARTCHAR U+7B9B +ENCODING 31643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +001E +FBF4 +0A04 +1244 +2244 +3A44 +E244 +2254 +2256 +267A +25CA +EC03 +ENDCHAR +STARTCHAR U+7B9C +ENCODING 31644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +0100 +3FFC +2288 +4C88 +3078 +0FE0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7B9D +ENCODING 31645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +0910 +0910 +7FFC +0910 +0DF0 +1910 +6910 +09F0 +1910 +0000 +ENDCHAR +STARTCHAR U+7B9E +ENCODING 31646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +1108 +0910 +3FFC +0240 +FFFF +0810 +1FF8 +302C +E027 +0FE0 +0804 +0C04 +07FC +ENDCHAR +STARTCHAR U+7B9F +ENCODING 31647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +1FF0 +1010 +1FF0 +1010 +1FF0 +1088 +1F90 +10E4 +1E84 +607C +0000 +ENDCHAR +STARTCHAR U+7BA0 +ENCODING 31648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0438 +3FE0 +0100 +7FFE +1108 +1108 +FFFF +1108 +1108 +7FFE +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+7BA1 +ENCODING 31649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +29A0 +4510 +3FFC +2008 +4FE0 +0820 +0FE0 +0800 +0FF0 +0810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+7BA2 +ENCODING 31650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1F7C +28A0 +4510 +0100 +7FFE +4802 +8EF4 +1290 +1290 +3290 +4CD0 +08A0 +1082 +2082 +407E +ENDCHAR +STARTCHAR U+7BA4 +ENCODING 31652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0080 +3FFE +0808 +1414 +2222 +0080 +7FFF +0080 +0080 +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7BA5 +ENCODING 31653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0010 +6010 +33FF +1211 +C210 +63FE +2282 +12C6 +366C +2438 +6C6C +C1C7 +ENDCHAR +STARTCHAR U+7BA6 +ENCODING 31654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1F7C +28A0 +4510 +7FFC +0100 +1FF8 +0100 +FFFE +0010 +1FF8 +1010 +1110 +12D0 +0430 +3808 +ENDCHAR +STARTCHAR U+7BA7 +ENCODING 31655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1244 +1F7E +28A0 +C510 +3FFC +2080 +2090 +2FF8 +2490 +22A0 +3FFC +2140 +2230 +2414 +3FFE +0000 +ENDCHAR +STARTCHAR U+7BA8 +ENCODING 31656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1244 +1F7E +28A0 +4510 +13F8 +1110 +FCE0 +1110 +124E +1DF4 +F040 +13F8 +1040 +5040 +2040 +ENDCHAR +STARTCHAR U+7BA9 +ENCODING 31657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2244 +3F7E +50A0 +8914 +7FFE +4444 +4444 +7FFC +4404 +0FF0 +1010 +2820 +0440 +0380 +0E00 +7000 +ENDCHAR +STARTCHAR U+7BAA +ENCODING 31658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +1210 +0920 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +7FFC +0100 +0000 +ENDCHAR +STARTCHAR U+7BAB +ENCODING 31659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1F7C +28A0 +4510 +3FF8 +0108 +FFFE +0108 +3FF8 +0100 +2548 +2528 +2928 +2918 +3118 +4108 +ENDCHAR +STARTCHAR U+7BAC +ENCODING 31660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1F7C +28A0 +C510 +0820 +7FFC +0A20 +0204 +FFFE +0410 +0FF8 +3810 +C810 +0810 +0FF0 +0810 +ENDCHAR +STARTCHAR U+7BAD +ENCODING 31661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4D30 +0440 +7FFC +0000 +3E48 +2248 +3E48 +2248 +3E48 +2208 +2618 +0000 +ENDCHAR +STARTCHAR U+7BAF +ENCODING 31663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0800 +0FFF +1820 +13FE +3222 +63FE +A222 +23FE +2020 +2360 +20C0 +27BF +ENDCHAR +STARTCHAR U+7BB0 +ENCODING 31664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +1408 +3FFE +E002 +0FF2 +0812 +0FF2 +0816 +3FFC +0040 +FFFF +0080 +0080 +0780 +ENDCHAR +STARTCHAR U+7BB1 +ENCODING 31665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +28A0 +4510 +0800 +08F8 +7F88 +08F8 +1C88 +1AF8 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7BB2 +ENCODING 31666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0020 +6120 +31FE +1320 +C620 +6020 +27FF +1088 +3088 +2189 +6309 +C607 +ENDCHAR +STARTCHAR U+7BB4 +ENCODING 31668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +0050 +1FFC +1048 +1FC8 +1048 +17B0 +14B4 +17B4 +244C +4184 +0000 +ENDCHAR +STARTCHAR U+7BB5 +ENCODING 31669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0100 +091C +3907 +E730 +00C0 +1FFC +F004 +1FFC +1004 +1FFC +1004 +1FFC +ENDCHAR +STARTCHAR U+7BB6 +ENCODING 31670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0800 +083E +FFA2 +0822 +083E +0822 +3E22 +223E +2222 +2262 +3E42 +00CE +ENDCHAR +STARTCHAR U+7BB7 +ENCODING 31671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +1100 +09FF +7E10 +2090 +3C90 +25FE +2492 +4490 +0481 +18FF +0000 +0000 +ENDCHAR +STARTCHAR U+7BB8 +ENCODING 31672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4510 +1FF8 +0120 +7FFC +0300 +0FF0 +7410 +07F0 +0410 +07F0 +0410 +0000 +ENDCHAR +STARTCHAR U+7BB9 +ENCODING 31673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +1040 +2240 +7CFF +0901 +1221 +7F11 +0809 +1C01 +6B01 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+7BBA +ENCODING 31674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0100 +7FFE +0100 +3FFC +0240 +FFFF +0810 +3FFC +E817 +0FF0 +0810 +0FF0 +ENDCHAR +STARTCHAR U+7BBB +ENCODING 31675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1020 +33FE +6022 +C7FF +1022 +33FE +6020 +E3FE +2020 +27FF +2020 +2020 +ENDCHAR +STARTCHAR U+7BBC +ENCODING 31676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +3FFE +2002 +3FFE +2000 +2FFE +2204 +247E +2FC2 +6040 +47FC +C040 +1FFF +ENDCHAR +STARTCHAR U+7BBD +ENCODING 31677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +1FF8 +0100 +FFFF +0100 +3FFC +2104 +3FFC +2104 +3FFC +0100 +3FFC +0100 +FFFF +ENDCHAR +STARTCHAR U+7BBE +ENCODING 31678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +0401 +2481 +1511 +3F91 +2091 +3F91 +2091 +3F81 +2081 +4182 +0000 +0000 +ENDCHAR +STARTCHAR U+7BC0 +ENCODING 31680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1FFC +28A0 +4510 +1E78 +1248 +1E48 +1248 +1E48 +1448 +1270 +1D40 +7040 +0000 +ENDCHAR +STARTCHAR U+7BC1 +ENCODING 31681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +29A0 +4710 +0FE0 +0820 +0FE0 +0FE0 +3FF8 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7BC2 +ENCODING 31682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +1100 +3FFC +6100 +1FF8 +0100 +FFFF +ENDCHAR +STARTCHAR U+7BC4 +ENCODING 31684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4D10 +7FF8 +0888 +3E88 +2A88 +3E88 +2AB0 +3E80 +0884 +7F84 +087C +0000 +ENDCHAR +STARTCHAR U+7BC5 +ENCODING 31685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +3EFF +6990 +C508 +2104 +2104 +3FFC +0000 +FFFF +0200 +3FFC +2444 +2444 +2444 +245C +ENDCHAR +STARTCHAR U+7BC6 +ENCODING 31686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2890 +47E0 +0440 +0FC0 +7FFC +0388 +7DD0 +07E0 +39A0 +0690 +388C +0300 +0000 +ENDCHAR +STARTCHAR U+7BC7 +ENCODING 31687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +2490 +7FFC +0000 +1FF8 +1008 +1FF8 +1000 +1FF8 +2948 +2FF8 +4948 +0958 +0000 +ENDCHAR +STARTCHAR U+7BC8 +ENCODING 31688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0804 +0804 +7F04 +087F +FF84 +0004 +0844 +7F64 +0824 +0804 +1F04 +F01C +ENDCHAR +STARTCHAR U+7BC9 +ENCODING 31689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4510 +7EF0 +0890 +0ED4 +712C +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+7BCA +ENCODING 31690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0000 +6088 +3088 +13FE +C088 +6088 +2088 +17FF +3000 +2088 +618C +C306 +ENDCHAR +STARTCHAR U+7BCB +ENCODING 31691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +3FFC +2080 +2FF8 +2490 +26B0 +2948 +2220 +2C18 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+7BCC +ENCODING 31692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +09F0 +0810 +17FC +1100 +31F8 +5240 +17FC +10A0 +1110 +160C +0000 +ENDCHAR +STARTCHAR U+7BCE +ENCODING 31694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +7820 +4820 +48A8 +7924 +4A22 +4820 +7824 +4824 +4808 +7BF0 +0000 +0000 +ENDCHAR +STARTCHAR U+7BCF +ENCODING 31695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +1240 +1240 +7FFC +12A4 +1F28 +1270 +1250 +1E88 +1304 +0000 +ENDCHAR +STARTCHAR U+7BD1 +ENCODING 31697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1F7C +28A0 +4108 +3FFC +2108 +3FF8 +0100 +FFFE +0010 +1FF8 +1010 +1110 +1110 +0660 +3818 +ENDCHAR +STARTCHAR U+7BD2 +ENCODING 31698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1FFF +2448 +4284 +0180 +02E0 +0D18 +7FFF +0808 +0FF8 +0808 +0FF8 +0884 +0868 +0BD0 +7C0F +ENDCHAR +STARTCHAR U+7BD3 +ENCODING 31699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +0920 +0548 +7FFC +0540 +0920 +1114 +FFFE +0420 +0C40 +0380 +0460 +3810 +ENDCHAR +STARTCHAR U+7BD4 +ENCODING 31700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1FF8 +1008 +1FF8 +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +700E +ENDCHAR +STARTCHAR U+7BD5 +ENCODING 31701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0080 +1FFC +0080 +3FFE +0104 +1FFE +0000 +1FFC +1224 +1224 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+7BD6 +ENCODING 31702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0488 +0080 +3FFF +2040 +27FC +2044 +3FFF +2044 +27FC +6000 +47FC +C404 +07FC +ENDCHAR +STARTCHAR U+7BD7 +ENCODING 31703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1040 +1FFE +3080 +DFFC +1080 +1FFC +1080 +7FFE +0C18 +03E0 +0E38 +780F +ENDCHAR +STARTCHAR U+7BD8 +ENCODING 31704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0800 +17FE +3122 +5FE2 +021E +0800 +1FFF +3111 +5FF1 +0201 +1C1E +0000 +0000 +ENDCHAR +STARTCHAR U+7BD9 +ENCODING 31705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +3E7C +5090 +8100 +7FFC +0000 +1FF0 +1010 +1FF0 +0004 +7FFE +4004 +4FE4 +4824 +4FE4 +400C +ENDCHAR +STARTCHAR U+7BDA +ENCODING 31706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +3FFC +2240 +2250 +3E78 +2240 +3E78 +2240 +3E78 +2240 +2248 +3FFC +0000 +ENDCHAR +STARTCHAR U+7BDB +ENCODING 31707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +FEFE +0202 +7E7E +4040 +7E7E +2222 +1212 +0E0E +3232 +C6C6 +0404 +1C1C +ENDCHAR +STARTCHAR U+7BDC +ENCODING 31708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +1FF8 +0010 +01E1 +3EBE +04A0 +389F +0080 +3FFE +4411 +4411 +0000 +0000 +ENDCHAR +STARTCHAR U+7BDD +ENCODING 31709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2890 +4548 +3FF8 +1FF0 +0440 +7FFC +0FE0 +0FE0 +0920 +7FFC +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+7BDE +ENCODING 31710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1F3F +64C4 +0000 +33FE +1202 +43FE +3202 +13FE +0020 +13FE +6020 +2020 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+7BDF +ENCODING 31711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3F7E +48A8 +09FC +1020 +31FC +5020 +13FE +11FC +1104 +11FC +1104 +11FC +120C +0000 +0000 +ENDCHAR +STARTCHAR U+7BE0 +ENCODING 31712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4510 +0840 +0CF8 +1790 +14E0 +375C +55F8 +14E0 +1550 +164C +1040 +0000 +ENDCHAR +STARTCHAR U+7BE1 +ENCODING 31713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +5FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +0404 +FFFE +0A20 +329E +C444 +0FE0 +ENDCHAR +STARTCHAR U+7BE2 +ENCODING 31714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +1FFC +0080 +7FFF +1FFC +1004 +1FFC +1004 +1FFC +1004 +1FFC +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+7BE3 +ENCODING 31715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0080 +3FFE +0808 +7FFF +4081 +1FFC +0400 +07FC +0404 +0804 +107C +0000 +0000 +ENDCHAR +STARTCHAR U+7BE4 +ENCODING 31716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4510 +0FF8 +0880 +0FF0 +0880 +0FF0 +0880 +0FFC +2924 +2494 +4018 +0000 +ENDCHAR +STARTCHAR U+7BE5 +ENCODING 31717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +7FFC +0440 +3FF8 +2448 +3FF8 +0100 +7FFC +07C0 +793C +0100 +0000 +ENDCHAR +STARTCHAR U+7BE6 +ENCODING 31718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +29A0 +4710 +3FF8 +2648 +21C8 +2E28 +3FF8 +1088 +1F90 +10E4 +1E84 +707C +0000 +ENDCHAR +STARTCHAR U+7BE7 +ENCODING 31719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3F7E +4488 +0204 +7FFE +4842 +1FFC +2840 +0FFC +0840 +0FFC +0840 +0FFC +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+7BE8 +ENCODING 31720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0020 +7C70 +44D8 +498C +5306 +56FB +4820 +4BFE +4820 +5924 +4326 +4663 +ENDCHAR +STARTCHAR U+7BE9 +ENCODING 31721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1F7C +28A0 +4510 +09FC +3E20 +22F8 +3EA8 +20A8 +3EA8 +22A8 +3EB8 +2220 +0000 +ENDCHAR +STARTCHAR U+7BEA +ENCODING 31722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1F7E +28A0 +45FC +1E80 +10F0 +1080 +17FE +1444 +15F0 +2448 +2438 +29E0 +4922 +9122 +261E +ENDCHAR +STARTCHAR U+7BEB +ENCODING 31723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +3F3F +4444 +3E3C +082D +7F47 +0010 +0FE0 +0080 +3FF8 +0080 +7FFC +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+7BED +ENCODING 31725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +29A0 +4510 +3FF8 +0440 +7FFC +1FF0 +1110 +1FF0 +1110 +1FF4 +1104 +00FC +0000 +ENDCHAR +STARTCHAR U+7BEE +ENCODING 31726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1F7C +28A0 +4510 +8480 +24FC +2540 +2620 +2420 +0408 +3FFC +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+7BF0 +ENCODING 31728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +0400 +3FBF +1112 +0A14 +7FD6 +0011 +1F11 +1119 +1116 +1F10 +0000 +0000 +ENDCHAR +STARTCHAR U+7BF1 +ENCODING 31729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1F7C +28A0 +4510 +0104 +FFFE +1450 +1390 +1450 +1FF0 +0108 +3FFC +2248 +27E8 +2028 +2010 +ENDCHAR +STARTCHAR U+7BF2 +ENCODING 31730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1008 +FE7F +1008 +FE7F +1008 +FE7F +1008 +7FFE +0002 +FFFF +0002 +7FFE +ENDCHAR +STARTCHAR U+7BF3 +ENCODING 31731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +5FF0 +1110 +1FF0 +1110 +1FF0 +7FFC +0920 +3FF8 +0100 +3FF8 +0100 +0000 +ENDCHAR +STARTCHAR U+7BF4 +ENCODING 31732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +6000 +33FE +1080 +0342 +04A6 +F334 +1468 +11A4 +1623 +30E0 +6800 +C7FF +ENDCHAR +STARTCHAR U+7BF5 +ENCODING 31733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1104 +3104 +628A +C6DB +1000 +3020 +6020 +E13E +2120 +2320 +26A0 +2C7F +ENDCHAR +STARTCHAR U+7BF6 +ENCODING 31734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +7FF8 +0100 +09F0 +0900 +7FFC +07F0 +0400 +0FF8 +2A48 +2528 +4030 +0000 +ENDCHAR +STARTCHAR U+7BF7 +ENCODING 31735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4590 +10F0 +0BA0 +40E0 +275C +03F8 +71F0 +13F8 +1040 +2C40 +43FC +0000 +ENDCHAR +STARTCHAR U+7BF8 +ENCODING 31736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +7E7F +C9C8 +1224 +0FF0 +1020 +2444 +7EFE +0180 +0660 +18D8 +EF07 +00E0 +0F08 +0070 +1F80 +ENDCHAR +STARTCHAR U+7BF9 +ENCODING 31737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +FFFF +1018 +3FF4 +D003 +1008 +0FF8 +ENDCHAR +STARTCHAR U+7BFA +ENCODING 31738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1040 +11FE +FD22 +1122 +11FE +1122 +1DFE +F048 +1088 +13FF +1008 +7008 +ENDCHAR +STARTCHAR U+7BFB +ENCODING 31739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +3FFE +0220 +1FFC +1224 +1FFC +0000 +1FFC +0000 +7FFF +0888 +3086 +0000 +0000 +ENDCHAR +STARTCHAR U+7BFC +ENCODING 31740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +0A08 +37FC +2448 +27C8 +2448 +2FC8 +3038 +0440 +0440 +0442 +0842 +703E +ENDCHAR +STARTCHAR U+7BFD +ENCODING 31741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0000 +1000 +121F +2BE9 +4C89 +13E9 +3089 +52E9 +128E +17F8 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+7BFE +ENCODING 31742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +3FF8 +2448 +2448 +3FF8 +0140 +3FFC +2110 +28A0 +2440 +40A2 +431A +8C06 +ENDCHAR +STARTCHAR U+7BFF +ENCODING 31743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +48C8 +7FFF +1FFC +1084 +1FFC +1084 +1FFD +3FFF +0008 +7FFF +0408 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+7C00 +ENCODING 31744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +29A0 +4510 +3FF8 +1FF0 +7FFC +0FE0 +0820 +0FE0 +0FE0 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+7C01 +ENCODING 31745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1020 +3120 +613E +C120 +17FF +3020 +6020 +E13E +2120 +2320 +26A0 +2C7F +ENDCHAR +STARTCHAR U+7C02 +ENCODING 31746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0000 +7FFE +404A +5FFA +4042 +4F4A +494A +4F52 +402A +5F6A +4092 +7FFE +ENDCHAR +STARTCHAR U+7C03 +ENCODING 31747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0620 +1C7E +F0C6 +11AC +FE18 +10F0 +381F +3431 +52EB +9006 +101C +11F0 +ENDCHAR +STARTCHAR U+7C04 +ENCODING 31748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +FFFF +0000 +3FFE +2002 +3FFE +2408 +2FFC +2844 +6FFC +4801 +CC03 +07FE +ENDCHAR +STARTCHAR U+7C05 +ENCODING 31749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3E +4444 +0080 +07F0 +0220 +1FFC +1440 +1440 +17F8 +1840 +13F8 +2040 +47FC +0000 +0000 +ENDCHAR +STARTCHAR U+7C06 +ENCODING 31750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0080 +7FFE +4002 +3C20 +00FE +FF24 +2444 +24E8 +2418 +246D +6603 +C3FE +ENDCHAR +STARTCHAR U+7C07 +ENCODING 31751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +0880 +08FC +7F80 +08F8 +0F20 +13FC +1220 +2250 +4488 +1F04 +0000 +ENDCHAR +STARTCHAR U+7C09 +ENCODING 31753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +6120 +31FE +1220 +0020 +07FF +F000 +11FC +1104 +1104 +31FC +6800 +C7FF +ENDCHAR +STARTCHAR U+7C0A +ENCODING 31754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0414 +3FFE +0410 +07F0 +07F0 +0410 +7FFF +1084 +27F2 +4081 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+7C0B +ENCODING 31755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +5FF0 +1010 +1FF0 +1010 +1FF8 +1110 +14E0 +181C +3FF8 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+7C0C +ENCODING 31756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4550 +0840 +FF7E +0882 +7F24 +4920 +7F20 +4920 +1C50 +2A50 +4A88 +888E +0904 +ENDCHAR +STARTCHAR U+7C0D +ENCODING 31757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2590 +4FE0 +0920 +7FFC +0FE0 +0FE0 +0920 +0FE0 +7FFC +0E40 +01E0 +3E10 +0000 +ENDCHAR +STARTCHAR U+7C0E +ENCODING 31758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +2088 +23FE +F888 +2088 +27FF +2000 +39FC +E104 +21FC +2104 +2104 +61FC +ENDCHAR +STARTCHAR U+7C0F +ENCODING 31759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +0100 +3FFC +2240 +3FF8 +2248 +2248 +3FF8 +2844 +2F48 +4872 +4942 +8E3E +ENDCHAR +STARTCHAR U+7C10 +ENCODING 31760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +0410 +7FD0 +041F +3F95 +24A5 +3F85 +2484 +3F84 +0404 +7FCA +0411 +0000 +0000 +ENDCHAR +STARTCHAR U+7C11 +ENCODING 31761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +29A0 +4510 +7FFC +0FE0 +0820 +7FFC +0820 +0FE8 +0690 +7C60 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+7C12 +ENCODING 31762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +5FF0 +1010 +1FD0 +17F0 +1FF0 +0200 +7FFC +1AB0 +64CC +1920 +07D0 +0000 +ENDCHAR +STARTCHAR U+7C13 +ENCODING 31763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +3F90 +2490 +3FA8 +24C8 +3F90 +24A4 +2E84 +2A88 +2E90 +41A0 +0000 +ENDCHAR +STARTCHAR U+7C14 +ENCODING 31764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +29A0 +4510 +7FFC +3FF8 +0820 +7FFC +0820 +3FF8 +0690 +7C60 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+7C16 +ENCODING 31766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +080C +6AF0 +5C80 +4884 +7EFE +4890 +5890 +6A90 +4890 +7E90 +0110 +0010 +ENDCHAR +STARTCHAR U+7C17 +ENCODING 31767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +13F0 +4898 +2294 +1514 +2360 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+7C19 +ENCODING 31769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +2022 +27FF +2020 +23FE +FA22 +23FE +2222 +23FE +2004 +27FF +2104 +209C +ENDCHAR +STARTCHAR U+7C1B +ENCODING 31771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0000 +240E +2478 +FF40 +2440 +3C7F +2448 +3C48 +2448 +FF48 +0088 +2488 +C208 +ENDCHAR +STARTCHAR U+7C1C +ENCODING 31772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +04FE +4082 +30FE +1082 +40FE +31FF +1080 +04FF +0925 +3049 +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+7C1D +ENCODING 31773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +48C8 +3FFE +0948 +0630 +0410 +0FF8 +1414 +27F2 +4411 +07F0 +0888 +1184 +0000 +0000 +ENDCHAR +STARTCHAR U+7C1E +ENCODING 31774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3FFF +4890 +0408 +3F7E +2142 +3F7E +0000 +1FFC +1084 +1FFC +1084 +1FFC +0080 +7FFF +0080 +ENDCHAR +STARTCHAR U+7C1F +ENCODING 31775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +7FFC +1FF0 +1290 +1FF0 +0FE0 +0820 +0FE0 +0FE0 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7C20 +ENCODING 31776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0508 +7FFE +0100 +3FFC +2104 +3FFC +2104 +3FFC +2104 +3FFC +2444 +2444 +FFFF +ENDCHAR +STARTCHAR U+7C21 +ENCODING 31777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4510 +3EF8 +2288 +3EF8 +2288 +3FF8 +2448 +27C8 +2448 +27C8 +2418 +0000 +ENDCHAR +STARTCHAR U+7C22 +ENCODING 31778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +7F7F +4141 +7F7F +4141 +7F7F +4081 +4FF9 +4141 +4081 +4141 +4E3B +0000 +0000 +ENDCHAR +STARTCHAR U+7C23 +ENCODING 31779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2990 +4FE0 +0920 +0FE0 +7FFC +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+7C25 +ENCODING 31781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0478 +3FC0 +0200 +FFFF +0810 +37EC +C423 +7FFE +4002 +4FF2 +4812 +4FF2 +400E +ENDCHAR +STARTCHAR U+7C26 +ENCODING 31782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4510 +3EA0 +02C8 +1450 +0FE0 +1010 +2FEE +C824 +0FE0 +0440 +0288 +7FFC +0000 +ENDCHAR +STARTCHAR U+7C27 +ENCODING 31783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +24D0 +7FF8 +0440 +07C0 +7FFC +1FF0 +1110 +1FF0 +1110 +1FF0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+7C28 +ENCODING 31784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +7E7E +0202 +7E7E +4040 +4242 +3E3E +0420 +3FFE +0420 +FFFF +0810 +700E +ENDCHAR +STARTCHAR U+7C29 +ENCODING 31785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4848 +1554 +0E38 +0410 +0A28 +7FFF +4101 +1FFC +0104 +0104 +0204 +0418 +0000 +0000 +ENDCHAR +STARTCHAR U+7C2A +ENCODING 31786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +7EF8 +1450 +7FFC +0E30 +14D4 +7FFC +1010 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7C2B +ENCODING 31787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2590 +5FF0 +0110 +7FFC +1FF0 +1550 +1D70 +1110 +1FF0 +1D70 +2550 +4550 +0000 +ENDCHAR +STARTCHAR U+7C2C +ENCODING 31788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +0040 +7C7C +44C4 +45AC +7C38 +106C +5DC7 +5000 +50FE +5C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+7C2D +ENCODING 31789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +0080 +1FFC +1084 +288A +7D5F +0220 +780F +07F0 +0410 +0410 +07F0 +0000 +0000 +ENDCHAR +STARTCHAR U+7C30 +ENCODING 31792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +2440 +24FE +2592 +3CFE +2092 +20FE +3C30 +2450 +25FF +2410 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+7C31 +ENCODING 31793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1044 +1044 +FDFF +2044 +207C +3C44 +247C +2444 +25FF +6400 +4444 +DD83 +ENDCHAR +STARTCHAR U+7C33 +ENCODING 31795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1010 +FE38 +106C +7CC6 +457D +7C10 +4410 +7DFF +1010 +FE10 +1010 +1010 +ENDCHAR +STARTCHAR U+7C34 +ENCODING 31796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C910 +05F8 +0100 +3FFE +2202 +23F0 +2E04 +21FC +2120 +2924 +6528 +5FFF +C120 +0E1C +ENDCHAR +STARTCHAR U+7C36 +ENCODING 31798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +11FC +FC04 +05FC +0804 +13FF +3820 +3522 +54A4 +9074 +10AC +1323 +10E0 +ENDCHAR +STARTCHAR U+7C37 +ENCODING 31799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2590 +43E0 +0C80 +7FFC +1224 +1DFC +17F8 +11E0 +11E0 +13F0 +2210 +43F0 +0000 +ENDCHAR +STARTCHAR U+7C38 +ENCODING 31800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +28A0 +4510 +1220 +7FFC +12A8 +1EB0 +12F8 +1EC8 +12A8 +7F90 +1568 +6384 +0000 +ENDCHAR +STARTCHAR U+7C39 +ENCODING 31801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0508 +1110 +7FFE +4002 +5FFA +0000 +0FF0 +0810 +3FFC +2104 +3FFC +2104 +3FFC +ENDCHAR +STARTCHAR U+7C3A +ENCODING 31802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0508 +7FFE +4422 +3FFC +0420 +3FFC +0420 +FFFF +0810 +310C +CFF3 +0100 +7FFE +ENDCHAR +STARTCHAR U+7C3B +ENCODING 31803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +3E3E +4848 +41F8 +2108 +0178 +7148 +13FC +2204 +12F4 +1294 +22F4 +520C +0FFF +0000 +0000 +ENDCHAR +STARTCHAR U+7C3C +ENCODING 31804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3F7E +4890 +1044 +11FF +7C44 +11FF +19FF +10FE +3092 +50FE +1092 +11FF +3082 +0000 +0000 +ENDCHAR +STARTCHAR U+7C3D +ENCODING 31805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4510 +0280 +0C60 +77DC +0000 +1EF0 +1290 +1EF0 +0C60 +1290 +6108 +0000 +ENDCHAR +STARTCHAR U+7C3E +ENCODING 31806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +5FFC +1220 +1FFC +17F0 +1150 +1FFC +1150 +2FF0 +2770 +594C +0140 +0000 +ENDCHAR +STARTCHAR U+7C3F +ENCODING 31807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2890 +4558 +17FC +09F0 +4950 +21F0 +2950 +09F0 +17FC +1110 +2090 +2030 +0000 +ENDCHAR +STARTCHAR U+7C40 +ENCODING 31808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +5140 +13BC +7E94 +12E4 +1758 +13F8 +1E48 +73F8 +1248 +13F8 +3208 +0000 +ENDCHAR +STARTCHAR U+7C41 +ENCODING 31809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1F7C +28A0 +4550 +0840 +7F78 +0890 +3FFC +2A84 +2A94 +3E94 +18A4 +2CB4 +4A48 +8846 +0882 +ENDCHAR +STARTCHAR U+7C43 +ENCODING 31811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +7F40 +247C +3E80 +3F00 +2478 +3F00 +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7C45 +ENCODING 31813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1F3E +2448 +0000 +0900 +09CC +3104 +1DDC +1144 +1D5C +1284 +7FFF +0808 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+7C46 +ENCODING 31814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0420 +FFFF +0420 +1FFE +1080 +3FFC +D080 +1FFC +1080 +7FFE +0C18 +03E0 +7C1F +ENDCHAR +STARTCHAR U+7C47 +ENCODING 31815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +48C8 +7FFF +07F0 +0410 +07F0 +7FFF +4FF9 +4789 +0950 +1260 +04D0 +1948 +0000 +0000 +ENDCHAR +STARTCHAR U+7C48 +ENCODING 31816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1F1F +2424 +0000 +7F7F +1420 +7F20 +557E +5522 +7F32 +082A +3E26 +0833 +7F21 +0000 +0000 +ENDCHAR +STARTCHAR U+7C49 +ENCODING 31817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3EBF +5FFC +07F0 +07F0 +0410 +07F0 +7FFF +4FF9 +4211 +07F0 +1FFC +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+7C4A +ENCODING 31818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +FEFE +2626 +1A1A +E262 +0840 +1FFE +3080 +DFFC +1080 +1FFC +1080 +1FFF +ENDCHAR +STARTCHAR U+7C4C +ENCODING 31820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2590 +7FFC +1FF0 +7FFC +1FE8 +0100 +1FE0 +7FFC +1E10 +13FC +1E90 +1030 +0000 +ENDCHAR +STARTCHAR U+7C4D +ENCODING 31821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4550 +0850 +7FFC +0850 +3FFC +0800 +7FF8 +1C88 +2AF8 +4988 +08F8 +0000 +ENDCHAR +STARTCHAR U+7C4F +ENCODING 31823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +28A0 +4D90 +09FC +7E90 +13FC +1C90 +14F0 +14F0 +1490 +27FC +2490 +5B08 +0000 +ENDCHAR +STARTCHAR U+7C50 +ENCODING 31824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2890 +4550 +3E48 +27FC +24A0 +3FFC +2550 +3F58 +24E4 +2750 +244C +4CC0 +0000 +ENDCHAR +STARTCHAR U+7C51 +ENCODING 31825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1FF8 +1008 +1FF8 +1008 +FFFF +1818 +2FF4 +C813 +0FF0 +084C +0F30 +380E +ENDCHAR +STARTCHAR U+7C52 +ENCODING 31826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +11FF +1028 +FDEF +1129 +11EF +1028 +1DFF +F111 +11FF +1111 +1111 +71FF +ENDCHAR +STARTCHAR U+7C53 +ENCODING 31827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +601E +33F0 +0124 +00A8 +C7FF +60A8 +0124 +17FF +3124 +21FC +6124 +C1FC +ENDCHAR +STARTCHAR U+7C54 +ENCODING 31828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +5F20 +1520 +7FFC +1F48 +1FC8 +1528 +1F30 +7F90 +1A30 +0648 +3984 +0000 +ENDCHAR +STARTCHAR U+7C55 +ENCODING 31829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1060 +11CF +FD29 +1129 +31AB +3848 +55FF +5511 +91FF +1111 +1111 +11FF +ENDCHAR +STARTCHAR U+7C56 +ENCODING 31830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +4440 +3FD0 +0448 +7FFC +0A28 +3BA8 +3BB0 +0A14 +3BB4 +0FCC +7084 +0000 +ENDCHAR +STARTCHAR U+7C57 +ENCODING 31831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +4444 +1FFC +7FFF +58B1 +468D +0840 +1FFE +7040 +1FFC +1FFC +1040 +1FFE +0000 +0000 +ENDCHAR +STARTCHAR U+7C58 +ENCODING 31832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +4150 +3FF8 +24A4 +27FC +3D50 +27AC +3CD0 +27F8 +2554 +2548 +4E48 +0000 +ENDCHAR +STARTCHAR U+7C59 +ENCODING 31833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +10FC +3804 +44FC +FE04 +11FF +FC10 +1092 +9454 +5438 +5E54 +7193 +C070 +ENDCHAR +STARTCHAR U+7C5A +ENCODING 31834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C910 +05F8 +0100 +3FFE +2102 +2FF0 +2104 +27FC +2490 +27F0 +6490 +4FFC +C924 +3FFF +ENDCHAR +STARTCHAR U+7C5B +ENCODING 31835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1044 +387E +2DE8 +4030 +FC59 +118F +FC44 +107E +95E8 +5030 +3C59 +E18F +ENDCHAR +STARTCHAR U+7C5C +ENCODING 31836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +23FE +2252 +FBFE +2020 +27FF +2104 +3888 +E7FF +2020 +23FE +2020 +6020 +ENDCHAR +STARTCHAR U+7C5D +ENCODING 31837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0508 +FFFF +2000 +1FFC +1008 +1FF8 +7A3C +4FA4 +7AA4 +4AB4 +7B2D +49A5 +8A47 +ENDCHAR +STARTCHAR U+7C5E +ENCODING 31838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +120F +33E9 +E489 +17E9 +3289 +E2EB +2788 +2008 +7FFE +0000 +FFFF +1110 +E70F +ENDCHAR +STARTCHAR U+7C5F +ENCODING 31839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +49F8 +7F48 +0898 +3EF8 +2A88 +2AF8 +3EF8 +1C88 +2AF8 +4848 +0984 +0000 +ENDCHAR +STARTCHAR U+7C60 +ENCODING 31840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +4940 +7E7C +1478 +7F08 +3E78 +2240 +3E78 +2278 +3E78 +2244 +263C +0000 +ENDCHAR +STARTCHAR U+7C61 +ENCODING 31841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +1020 +1070 +10D8 +FD8C +1377 +1000 +1FDE +F252 +13DE +1104 +128A +7451 +ENDCHAR +STARTCHAR U+7C63 +ENCODING 31843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +7E7E +4242 +7E7E +4242 +7E7E +4102 +5FFA +4912 +4FF2 +4912 +4FF2 +4542 +5936 +ENDCHAR +STARTCHAR U+7C64 +ENCODING 31844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +5240 +1250 +2D48 +7FFC +0A28 +3BA8 +3BB0 +0A10 +3BB4 +0FCC +7884 +0000 +ENDCHAR +STARTCHAR U+7C65 +ENCODING 31845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +29A0 +4690 +0C60 +77DC +3BB8 +2AA8 +3BB8 +3FF8 +2448 +3FF8 +2448 +2458 +0000 +ENDCHAR +STARTCHAR U+7C66 +ENCODING 31846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1F1F +2424 +10F8 +2810 +45FF +0010 +7CFE +1092 +7CFE +1092 +54FE +38FE +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+7C67 +ENCODING 31847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +043E +6020 +33FF +1221 +02F8 +0222 +F3FF +1262 +12B4 +145C +31AB +6858 +C7FF +ENDCHAR +STARTCHAR U+7C69 +ENCODING 31849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0420 +61FC +3104 +11FC +0104 +07FF +F489 +1124 +17FF +1080 +30FC +6904 +C7FF +ENDCHAR +STARTCHAR U+7C6A +ENCODING 31850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1F1F +2424 +14A1 +79DE +54B0 +7DF0 +401F +7FD2 +54B2 +79D2 +54B2 +7DE2 +7FE2 +0000 +0000 +ENDCHAR +STARTCHAR U+7C6B +ENCODING 31851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3F +5468 +1F3E +2448 +3F7E +152A +274E +0FF8 +0808 +0FE8 +0FE8 +0FF8 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+7C6C +ENCODING 31852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1F7C +2490 +4948 +7F50 +267C +3AD0 +3778 +3E50 +7F78 +4D50 +7F50 +417C +4340 +0000 +ENDCHAR +STARTCHAR U+7C6D +ENCODING 31853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +FE7F +4422 +552A +7FFF +4420 +7FFE +4422 +7FFE +4840 +CF7D +8841 +3F3E +ENDCHAR +STARTCHAR U+7C6E +ENCODING 31854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0408 +3FFC +2244 +3FFC +1022 +6444 +28FF +1588 +FEFE +1288 +54FE +D688 +92FF +ENDCHAR +STARTCHAR U+7C6F +ENCODING 31855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1F3F +24C8 +3FFE +0FFC +07F0 +0410 +07F0 +3DEE +3DEA +25EE +3D2B +25EB +4E13 +0000 +0000 +ENDCHAR +STARTCHAR U+7C70 +ENCODING 31856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +0508 +7C7C +4444 +7C7C +4444 +7FFE +2100 +3FFC +2100 +FFFF +381C +0FF0 +F81F +ENDCHAR +STARTCHAR U+7C72 +ENCODING 31858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +C990 +1E08 +73BF +DEC8 +003F +EEE1 +AABF +EEE1 +003F +7FA1 +54A1 +7FBF +5492 +55A1 +ENDCHAR +STARTCHAR U+7C73 +ENCODING 31859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +0910 +0920 +0100 +7FFC +0380 +0380 +0540 +1930 +610C +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7C74 +ENCODING 31860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0600 +0100 +0280 +0C60 +3118 +C106 +1110 +0920 +0108 +7FFC +0380 +0540 +0920 +111C +6108 +0100 +ENDCHAR +STARTCHAR U+7C75 +ENCODING 31861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4A20 +2A20 +2C20 +0820 +7FFC +0820 +1C20 +1A20 +2A20 +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+7C78 +ENCODING 31864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +5444 +5444 +3844 +1044 +7DFC +1044 +3844 +5444 +1044 +1044 +1085 +1105 +1207 +0000 +0000 +ENDCHAR +STARTCHAR U+7C79 +ENCODING 31865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +9220 +D620 +5420 +11FF +FE44 +1044 +1044 +38CC +3488 +5288 +51F8 +901C +1076 +10C3 +1381 +ENDCHAR +STARTCHAR U+7C7A +ENCODING 31866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +4920 +2A7F +1C80 +0800 +7F3E +0802 +1C04 +2A08 +4910 +0821 +0841 +087F +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+7C7B +ENCODING 31867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1110 +0920 +0108 +7FFC +0100 +0540 +0930 +1110 +0104 +FFFE +0280 +0440 +0820 +101C +6008 +ENDCHAR +STARTCHAR U+7C7C +ENCODING 31868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +9420 +5420 +5924 +1124 +FF24 +3124 +3924 +5524 +5524 +9124 +1124 +11FC +1004 +1000 +ENDCHAR +STARTCHAR U+7C7D +ENCODING 31869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +5204 +3408 +1810 +FE20 +1024 +33FE +3820 +5420 +5420 +9020 +1020 +1020 +10A0 +1040 +ENDCHAR +STARTCHAR U+7C7E +ENCODING 31870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +4A48 +2A48 +2C48 +0948 +7EC8 +0C68 +1A58 +1A48 +2888 +4888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+7C7F +ENCODING 31871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +4902 +2A02 +1C7F +0802 +7F02 +0822 +0812 +1C0A +2A02 +4902 +0802 +080A +0804 +0000 +0000 +ENDCHAR +STARTCHAR U+7C80 +ENCODING 31872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +5408 +5408 +39FF +1008 +7C88 +1088 +3848 +5428 +1010 +1028 +1044 +1082 +1301 +0000 +0000 +ENDCHAR +STARTCHAR U+7C81 +ENCODING 31873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +4A10 +2AE0 +2C20 +0820 +7E20 +09FC +1C20 +1A20 +2A20 +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+7C82 +ENCODING 31874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +07E0 +1840 +01C0 +0730 +792C +0920 +0540 +3FF8 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+7C83 +ENCODING 31875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +5520 +3520 +3920 +1124 +7DE8 +1130 +3920 +3520 +5520 +5120 +1164 +11A4 +161C +0000 +ENDCHAR +STARTCHAR U+7C84 +ENCODING 31876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +55FE +5480 +3880 +10BE +7CA2 +10A2 +10A2 +3894 +5488 +1094 +1122 +1041 +1081 +0000 +0000 +ENDCHAR +STARTCHAR U+7C85 +ENCODING 31877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +5440 +54FF +3929 +1029 +7C29 +1029 +1029 +3829 +5449 +5491 +1021 +100A +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+7C86 +ENCODING 31878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +9420 +D420 +54A8 +10AC +FDA6 +1123 +1320 +3822 +3422 +54E6 +5004 +900C +1018 +1070 +11C0 +ENDCHAR +STARTCHAR U+7C87 +ENCODING 31879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +9410 +D410 +55FF +1000 +FC7C +1044 +1044 +3844 +3444 +5444 +5044 +9044 +10C5 +1085 +1183 +ENDCHAR +STARTCHAR U+7C88 +ENCODING 31880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +4912 +2A12 +1C12 +0812 +7F12 +087F +1C12 +2A12 +4912 +0812 +0812 +0812 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+7C89 +ENCODING 31881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08E0 +4A20 +2AA0 +2CA0 +0890 +7F10 +09F8 +1E54 +1A50 +2A50 +4890 +0890 +0910 +0A60 +0000 +ENDCHAR +STARTCHAR U+7C8A +ENCODING 31882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +3F7E +2040 +2141 +7E7F +0888 +0490 +7FFF +01C0 +02A0 +0490 +388E +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7C8B +ENCODING 31883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4A40 +2BF0 +2C50 +0854 +7E94 +092C +1C20 +1A20 +2BFC +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+7C8C +ENCODING 31884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +55F9 +5409 +3809 +11F9 +7D01 +1101 +11F9 +3809 +5409 +1009 +1009 +1011 +10E1 +0000 +0000 +ENDCHAR +STARTCHAR U+7C8D +ENCODING 31885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +4A30 +2BC0 +2C40 +0840 +7FF8 +0840 +1C40 +1BFC +2A40 +4840 +0844 +0844 +083C +0000 +ENDCHAR +STARTCHAR U+7C8F +ENCODING 31887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +9420 +D420 +5420 +1020 +FDFF +1050 +1050 +3858 +3448 +54C8 +508C +90A4 +10B4 +1196 +1303 +ENDCHAR +STARTCHAR U+7C90 +ENCODING 31888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BFC +2A00 +2CF8 +0888 +7E88 +0888 +1CF8 +1A88 +2A80 +4900 +0900 +0A00 +0C00 +0000 +ENDCHAR +STARTCHAR U+7C91 +ENCODING 31889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +95FE +5524 +5924 +1124 +FF24 +3124 +39FC +5504 +5500 +9100 +1102 +1102 +10FE +1000 +ENDCHAR +STARTCHAR U+7C92 +ENCODING 31890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4A20 +2A20 +2C20 +09FC +7E08 +0888 +1C48 +1A48 +2A50 +4850 +0820 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7C94 +ENCODING 31892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +95FF +D500 +5500 +1100 +FDFE +1102 +1102 +3902 +35FE +5500 +5100 +9100 +1100 +11FF +1000 +ENDCHAR +STARTCHAR U+7C95 +ENCODING 31893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4A20 +2A40 +2CF8 +0888 +7E88 +0888 +1CF8 +1A88 +2A88 +4888 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7C96 +ENCODING 31894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +55FF +3810 +1010 +7CFE +1010 +1038 +3854 +5492 +1111 +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+7C97 +ENCODING 31895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4AF8 +2A88 +2C88 +0888 +7EF8 +0888 +1C88 +1AF8 +2A88 +4888 +0888 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7C98 +ENCODING 31896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4A40 +2A40 +2C7C +0840 +7E40 +0840 +1DF8 +1B08 +2B08 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+7C9B +ENCODING 31899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0110 +7FFC +0110 +1FF0 +2928 +2548 +3FF8 +2388 +2548 +3938 +2108 +4108 +0000 +ENDCHAR +STARTCHAR U+7C9C +ENCODING 31900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1110 +1110 +1FF0 +2108 +2108 +3FF8 +1110 +0930 +0544 +FFFE +0380 +0560 +191C +6108 +0100 +ENDCHAR +STARTCHAR U+7C9D +ENCODING 31901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +95FE +5500 +5904 +11FE +FF40 +3144 +397E +5544 +5544 +9144 +1244 +1244 +1494 +1108 +ENDCHAR +STARTCHAR U+7C9E +ENCODING 31902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +97FE +5490 +5890 +1094 +FFFE +3294 +3A94 +5694 +569C +9304 +1204 +1204 +13FC +1204 +ENDCHAR +STARTCHAR U+7C9F +ENCODING 31903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0280 +1FF0 +1290 +1290 +1FF0 +0920 +0540 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+7CA0 +ENCODING 31904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +9488 +D488 +5488 +13FE +FC88 +1088 +1088 +3888 +3488 +57FF +5000 +9088 +1088 +118C +1306 +ENDCHAR +STARTCHAR U+7CA1 +ENCODING 31905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +57F8 +3608 +3A08 +13F8 +7E08 +12E8 +3AA8 +36A8 +56E8 +52A8 +1208 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+7CA2 +ENCODING 31906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7C80 +01FC +0248 +0CC0 +7130 +132C +0920 +0940 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+7CA3 +ENCODING 31907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +10AA +54AA +38AA +10AA +7DFF +10AA +10AA +38AA +54AA +10AA +10AA +1132 +2044 +0000 +0000 +ENDCHAR +STARTCHAR U+7CA4 +ENCODING 31908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +1FF0 +1550 +1390 +1FF0 +1390 +1D50 +1FF0 +0000 +7FFC +0800 +0FF0 +1010 +00E0 +0000 +ENDCHAR +STARTCHAR U+7CA5 +ENCODING 31909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7138 +1948 +1548 +75B8 +4120 +4FE0 +7138 +53A8 +1348 +1548 +1908 +1108 +6130 +0000 +ENDCHAR +STARTCHAR U+7CA6 +ENCODING 31910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +0910 +0100 +FFFF +0540 +0D60 +3938 +E10F +1008 +1EFF +7248 +D248 +0FFF +0C08 +3808 +E008 +ENDCHAR +STARTCHAR U+7CA7 +ENCODING 31911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4A20 +2BFC +2D00 +0920 +7F20 +0920 +1DF8 +1B20 +2B20 +4920 +0A20 +0BFC +0C00 +0000 +ENDCHAR +STARTCHAR U+7CA8 +ENCODING 31912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BFC +2A20 +2C20 +0840 +7FF8 +0888 +1C88 +1AF8 +2A88 +4888 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7CAA +ENCODING 31914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +0D30 +0540 +7FFC +0380 +0540 +193C +0448 +0440 +3FF8 +0440 +0444 +FFFE +0820 +1818 +2008 +ENDCHAR +STARTCHAR U+7CAB +ENCODING 31915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +57FC +3440 +3840 +1080 +7FF8 +12A8 +3AA8 +36A8 +56A8 +52A8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+7CAD +ENCODING 31917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +4A40 +2AA0 +2CA0 +0910 +7FF8 +0804 +1C00 +1BF8 +2B08 +4908 +0908 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+7CAE +ENCODING 31918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4A20 +2AF8 +2C88 +0888 +7FF8 +0888 +1CF8 +1AA4 +2AA8 +4890 +0890 +08E8 +0B04 +0000 +ENDCHAR +STARTCHAR U+7CAF +ENCODING 31919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +0842 +4942 +2A7E +0842 +7F7E +0842 +1C42 +2A7E +4924 +0824 +0824 +0845 +0887 +0000 +0000 +ENDCHAR +STARTCHAR U+7CB0 +ENCODING 31920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +941C +D5F2 +5526 +11B4 +FC94 +11FE +1004 +3808 +3410 +57FF +5010 +9010 +1010 +1010 +1070 +ENDCHAR +STARTCHAR U+7CB1 +ENCODING 31921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +4090 +2A98 +1294 +2514 +2260 +1110 +0920 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+7CB2 +ENCODING 31922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0EF8 +0848 +1F50 +7220 +0CD0 +730C +1110 +0920 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+7CB3 +ENCODING 31923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4BFC +2A40 +2DF8 +0948 +7FF8 +0948 +1DF8 +1B48 +2B80 +4880 +0940 +0A30 +0C0C +0000 +ENDCHAR +STARTCHAR U+7CB4 +ENCODING 31924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +0849 +4949 +2A7F +0849 +7F49 +087F +1C08 +2A08 +497F +0808 +0808 +0808 +08FF +0000 +0000 +ENDCHAR +STARTCHAR U+7CB5 +ENCODING 31925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3FF8 +2FC8 +2548 +2FE8 +2388 +2548 +3FF8 +FFFE +0400 +0FF0 +0010 +0010 +0FE0 +0000 +0000 +ENDCHAR +STARTCHAR U+7CB6 +ENCODING 31926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +94FC +D404 +54FC +1004 +FC04 +13FF +1010 +3992 +34D6 +5414 +5038 +905C +10D6 +1193 +1030 +ENDCHAR +STARTCHAR U+7CB7 +ENCODING 31927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +9480 +D4FF +5501 +1221 +FD25 +10A9 +11FD +3821 +3471 +5469 +50A5 +90A1 +1123 +1022 +100E +ENDCHAR +STARTCHAR U+7CB9 +ENCODING 31929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4A20 +2BFC +2C90 +0890 +7ED8 +0924 +1E24 +1A20 +2BFC +4820 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+7CBA +ENCODING 31930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +9440 +D5FE +5522 +1122 +FDFE +1122 +1122 +39FE +3490 +5510 +53FF +9010 +1010 +1010 +1010 +ENDCHAR +STARTCHAR U+7CBB +ENCODING 31931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +95FE +D500 +55FC +1100 +FDFC +1100 +1100 +3BFF +3522 +5536 +5114 +9118 +110C +11E6 +1303 +ENDCHAR +STARTCHAR U+7CBC +ENCODING 31932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +4912 +2A12 +FF92 +1C24 +2A24 +4924 +4948 +7FA4 +9524 +5524 +3792 +2112 +4112 +8112 +0100 +ENDCHAR +STARTCHAR U+7CBD +ENCODING 31933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4A20 +2AFC +2C88 +09F8 +7E00 +0800 +1DFC +1A20 +2AB0 +48A8 +0924 +0A24 +0860 +0000 +ENDCHAR +STARTCHAR U+7CBE +ENCODING 31934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4BFC +2A20 +2CF8 +0820 +7FFC +0800 +1CF8 +1A88 +2AF8 +4888 +08F8 +0888 +0898 +0000 +ENDCHAR +STARTCHAR U+7CBF +ENCODING 31935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +95FE +D522 +5522 +11FE +FD22 +1122 +11FE +3820 +37FF +54A8 +50AC +91A4 +1126 +1323 +1020 +ENDCHAR +STARTCHAR U+7CC0 +ENCODING 31936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +5490 +37FC +3890 +10A0 +7CA0 +1124 +3928 +3730 +5560 +5120 +1124 +1124 +111C +0000 +ENDCHAR +STARTCHAR U+7CC1 +ENCODING 31937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1040 +9488 +55FC +5840 +13FE +FE50 +3098 +3924 +56CA +5410 +9064 +1188 +1030 +10C0 +1700 +ENDCHAR +STARTCHAR U+7CC2 +ENCODING 31938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +4A90 +2BFC +2C90 +08F0 +7E90 +08F0 +1C90 +1BFC +2B50 +4954 +098C +09FC +0900 +0000 +ENDCHAR +STARTCHAR U+7CC4 +ENCODING 31940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +95FF +D400 +54FE +1082 +FC82 +10FE +1080 +38FE +34AA +54AA +51FE +91AA +12AA +10AA +1086 +ENDCHAR +STARTCHAR U+7CC5 +ENCODING 31941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +55F8 +3450 +3820 +13FC +7CE8 +1330 +3860 +3440 +57FC +50E0 +1150 +164C +1040 +0000 +ENDCHAR +STARTCHAR U+7CC7 +ENCODING 31943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10F8 +9488 +5508 +59FE +1340 +FD40 +317C +3990 +5514 +55FE +9110 +1110 +1128 +1124 +11C2 +ENDCHAR +STARTCHAR U+7CC8 +ENCODING 31944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +9424 +54A0 +58BC +12E0 +FD3E +3200 +39FC +5504 +55FC +9104 +11FC +1104 +1114 +1108 +ENDCHAR +STARTCHAR U+7CC9 +ENCODING 31945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +954A +D532 +554A +1102 +FDFE +1088 +1188 +3B47 +34FC +5584 +534C +9058 +1030 +10EC +1387 +ENDCHAR +STARTCHAR U+7CCA +ENCODING 31946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +5538 +3528 +3928 +17E8 +7D38 +1128 +1BA8 +36B8 +36A8 +53C8 +1248 +1088 +1118 +0000 +ENDCHAR +STARTCHAR U+7CCB +ENCODING 31947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +5428 +55FF +3800 +11E1 +7D29 +1129 +11E9 +3929 +5529 +11E9 +1121 +1121 +1263 +0000 +0000 +ENDCHAR +STARTCHAR U+7CCC +ENCODING 31948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +95D0 +5558 +5A54 +1150 +FE90 +3156 +3A3C +5408 +55FC +9108 +11F8 +1108 +11F8 +1108 +ENDCHAR +STARTCHAR U+7CCD +ENCODING 31949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1088 +9450 +5404 +5BFE +1000 +FE88 +3088 +3954 +57FC +5488 +9088 +1110 +1154 +13FE +1022 +ENDCHAR +STARTCHAR U+7CCE +ENCODING 31950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +57FC +3600 +3AF8 +12A8 +7EF8 +12A8 +1AF8 +3620 +36F8 +5220 +1420 +17FC +1800 +0000 +ENDCHAR +STARTCHAR U+7CCF +ENCODING 31951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +ABFF +AA01 +2201 +23FF +FA10 +2292 +2254 +72FE +6A82 +AAFE +A282 +22FE +2682 +2482 +2086 +ENDCHAR +STARTCHAR U+7CD0 +ENCODING 31952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1012 +55FF +5410 +38FE +1092 +10FE +7C92 +10FE +1092 +3804 +55FF +1044 +1024 +100C +0000 +0000 +ENDCHAR +STARTCHAR U+7CD1 +ENCODING 31953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +5421 +5421 +39EF +1108 +7DEF +1021 +10E7 +3821 +55EF +1021 +1021 +1021 +10C6 +0000 +0000 +ENDCHAR +STARTCHAR U+7CD2 +ENCODING 31954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +57FC +3490 +3800 +13FC +7E00 +12F8 +3AA8 +36F8 +56A8 +52F8 +14A8 +14A8 +1898 +0000 +ENDCHAR +STARTCHAR U+7CD3 +ENCODING 31955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +083C +FF24 +0824 +7E24 +0047 +FF00 +817E +BD22 +0822 +4936 +2A1C +FF08 +2A1C +6B36 +4963 +ENDCHAR +STARTCHAR U+7CD4 +ENCODING 31956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +95FE +D4A2 +5494 +1148 +FD30 +10DC +1307 +3820 +35FE +5522 +51FE +9020 +1022 +103F +11E1 +ENDCHAR +STARTCHAR U+7CD5 +ENCODING 31957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +9250 +55FC +3820 +1020 +FE28 +11FC +3820 +3420 +5424 +53FE +9000 +12A4 +1292 +1402 +ENDCHAR +STARTCHAR U+7CD6 +ENCODING 31958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +57FC +3640 +3BF8 +1248 +7FFC +1248 +1BF8 +3600 +37F8 +5308 +1508 +15F8 +1908 +0000 +ENDCHAR +STARTCHAR U+7CD7 +ENCODING 31959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1084 +95FE +5504 +59FC +1104 +FFFC +3104 +39FC +5428 +5024 +97FE +1050 +1050 +108E +1304 +ENDCHAR +STARTCHAR U+7CD8 +ENCODING 31960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +4A20 +2BFC +2D08 +0BFC +7E40 +09E4 +1C68 +1BB0 +2A70 +48A8 +0B24 +0820 +08C0 +0000 +ENDCHAR +STARTCHAR U+7CD9 +ENCODING 31961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1050 +5550 +397C +1090 +FC10 +10FE +3304 +397E +5544 +9144 +1144 +117C +1280 +147E +1000 +ENDCHAR +STARTCHAR U+7CDA +ENCODING 31962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +A888 +AFFF +2088 +2000 +F888 +2488 +2688 +72FF +6888 +A888 +A388 +2688 +2488 +20BE +2080 +ENDCHAR +STARTCHAR U+7CDC +ENCODING 31964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1210 +1FFC +16B8 +16BC +1A54 +1490 +12A0 +1FFC +11C0 +26B0 +388C +4080 +0000 +ENDCHAR +STARTCHAR U+7CDD +ENCODING 31965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +A888 +A8F8 +2104 +2249 +FBCF +2020 +2050 +718C +6B27 +A840 +A190 +2066 +218C +2038 +23E0 +ENDCHAR +STARTCHAR U+7CDE +ENCODING 31966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +3FF8 +07C0 +1930 +6FFC +0920 +0FE0 +0920 +0FE0 +3FF8 +0440 +7FFC +0C60 +3018 +0000 +ENDCHAR +STARTCHAR U+7CDF +ENCODING 31967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +57FC +34A0 +3BF8 +12A8 +7FF8 +12A8 +3BF8 +35F0 +5510 +51F0 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+7CE0 +ENCODING 31968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +57FC +3620 +3AF8 +1228 +7FFC +1228 +1AF8 +3724 +36A8 +5270 +14A8 +1724 +1860 +0000 +ENDCHAR +STARTCHAR U+7CE2 +ENCODING 31970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +5490 +37FC +3890 +11F8 +7F08 +11F8 +3908 +35F8 +5440 +53FC +10A0 +1110 +160C +0000 +ENDCHAR +STARTCHAR U+7CE6 +ENCODING 31974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +95FF +D410 +54FE +1000 +FCFE +1082 +10FE +3844 +3428 +55FF +5000 +90FE +1082 +1082 +10FE +ENDCHAR +STARTCHAR U+7CE7 +ENCODING 31975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +55F0 +35F0 +3910 +11F0 +7FFC +11F0 +1950 +35F0 +35F0 +53F8 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+7CE8 +ENCODING 31976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +2F7E +2144 +A944 +717C +2710 +FC14 +247E +7754 +6954 +A97C +2110 +2110 +2114 +2AFE +2402 +ENDCHAR +STARTCHAR U+7CE9 +ENCODING 31977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +A850 +A98C +2777 +2000 +FBFE +2222 +22AA +7222 +6BFE +A800 +A1FC +2104 +21FC +2104 +21FC +ENDCHAR +STARTCHAR U+7CEA +ENCODING 31978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E10 +22FE +3E44 +20FE +3E10 +53FF +1210 +1E10 +0490 +02A0 +7FFF +0888 +1084 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7CEB +ENCODING 31979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +94FE +D4AA +54AA +10FE +FC00 +11FF +1000 +38FE +3482 +54FE +5029 +906A +11CC +1066 +10C3 +ENDCHAR +STARTCHAR U+7CEC +ENCODING 31980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1249 +57FF +3820 +11FE +7C28 +13FF +1020 +307E +58C2 +177E +1042 +107E +1042 +0000 +0000 +ENDCHAR +STARTCHAR U+7CEE +ENCODING 31982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09F4 +0944 +4BF7 +2D14 +19F4 +7F4A +09F1 +1C00 +1AFE +29AA +48AA +08AA +08AA +09FF +0000 +0000 +ENDCHAR +STARTCHAR U+7CEF +ENCODING 31983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +57FC +3440 +3BFC +1358 +7DF8 +1040 +3BFC +3480 +57F8 +52A8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+7CF0 +ENCODING 31984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +2222 +ABFE +72FA +22AA +FAFA +22FA +2226 +62FE +B20A +2BFE +224A +2212 +23FE +0000 +0000 +ENDCHAR +STARTCHAR U+7CF1 +ENCODING 31985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4910 +7F10 +10FE +3E44 +2244 +3FFF +2010 +3EFE +2210 +3E90 +02A0 +3FFE +02A0 +0490 +0000 +0000 +ENDCHAR +STARTCHAR U+7CF2 +ENCODING 31986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +57FC +3650 +3BFC +12F8 +7EA8 +12F8 +3AA8 +36F8 +57FC +5334 +15FC +1504 +190C +0000 +ENDCHAR +STARTCHAR U+7CF4 +ENCODING 31988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +39F8 +08D8 +0968 +14D8 +2368 +4850 +2AFC +1D90 +7EF8 +1CF8 +2A90 +48FC +0880 +0000 +ENDCHAR +STARTCHAR U+7CF5 +ENCODING 31989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1010 +7EFE +4244 +7E28 +40FE +7E10 +427C +7F10 +1108 +FFFF +0D60 +3938 +E10F +ENDCHAR +STARTCHAR U+7CF6 +ENCODING 31990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +2BF8 +2AD8 +3F68 +4AD8 +7F68 +4A50 +2AFC +1D90 +7EF8 +1CF8 +2A90 +48FC +0880 +0000 +ENDCHAR +STARTCHAR U+7CF7 +ENCODING 31991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11EF +5444 +39EF +1129 +7DEF +1129 +39EF +557D +1111 +117D +1155 +117D +1157 +0000 +0000 +ENDCHAR +STARTCHAR U+7CF8 +ENCODING 31992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0120 +0220 +1C40 +0380 +0120 +0218 +7FE4 +0100 +0920 +0910 +1108 +2108 +0100 +0000 +ENDCHAR +STARTCHAR U+7CFA +ENCODING 31994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A40 +7240 +1440 +0C40 +1240 +7D40 +0840 +2A40 +2940 +2944 +4844 +083C +0000 +ENDCHAR +STARTCHAR U+7CFB +ENCODING 31995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3FC0 +0220 +0220 +1C40 +0390 +0108 +7FFC +0104 +0920 +0910 +1108 +2108 +0100 +0000 +ENDCHAR +STARTCHAR U+7CFD +ENCODING 31997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +21FF +4210 +7C10 +0810 +1010 +2210 +7F10 +0910 +1C10 +2A10 +4910 +0850 +0820 +0000 +0000 +ENDCHAR +STARTCHAR U+7CFE +ENCODING 31998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0890 +0A90 +7290 +1490 +0C90 +1290 +7D90 +089C +2CF0 +2B90 +2A10 +4810 +0810 +0000 +ENDCHAR +STARTCHAR U+7D00 +ENCODING 32000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A08 +7208 +1408 +0CF8 +1288 +7D80 +0880 +2C80 +2A80 +2A84 +4884 +087C +0000 +ENDCHAR +STARTCHAR U+7D01 +ENCODING 32001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1002 +2002 +4A42 +7A22 +1212 +2104 +4488 +7C50 +1220 +3850 +5488 +1104 +1203 +0000 +0000 +ENDCHAR +STARTCHAR U+7D02 +ENCODING 32002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +0A10 +7210 +15FC +0C10 +1290 +7D50 +0850 +2C10 +2A10 +2A10 +4810 +0830 +0000 +ENDCHAR +STARTCHAR U+7D03 +ENCODING 32003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +3092 +6092 +C492 +6C92 +1892 +3092 +6492 +FE92 +1292 +1092 +5492 +5492 +D582 +9102 +1302 +ENDCHAR +STARTCHAR U+7D04 +ENCODING 32004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A40 +72F8 +1488 +0D08 +1288 +7E48 +0848 +2C08 +2A08 +2A08 +4808 +0830 +0000 +ENDCHAR +STARTCHAR U+7D05 +ENCODING 32005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0A20 +7220 +1420 +0C20 +1220 +7D20 +0820 +2C20 +2A20 +2A20 +4BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7D06 +ENCODING 32006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A20 +7220 +1420 +0C20 +13FC +7E20 +0820 +2C20 +2A20 +2A20 +4820 +0860 +0000 +ENDCHAR +STARTCHAR U+7D07 +ENCODING 32007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +2480 +45FF +2A00 +1400 +7E00 +12FE +100C +5410 +5420 +5440 +5480 +5501 +11FF +1000 +ENDCHAR +STARTCHAR U+7D08 +ENCODING 32008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +2440 +45F8 +2848 +1048 +2448 +7EC8 +1268 +1058 +5448 +5448 +5489 +5489 +110F +1200 +ENDCHAR +STARTCHAR U+7D09 +ENCODING 32009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FF +6021 +C421 +6C21 +1821 +31A1 +64E1 +FC61 +1471 +1059 +5449 +54C3 +D482 +9182 +130E +ENDCHAR +STARTCHAR U+7D0A +ENCODING 32010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0440 +0380 +0D60 +711C +0240 +1EA0 +0318 +7FE4 +0540 +0930 +3108 +0000 +ENDCHAR +STARTCHAR U+7D0B +ENCODING 32011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A20 +73FC +1488 +0C88 +1288 +7E50 +0C50 +2A20 +2A20 +2850 +4988 +0E04 +0000 +ENDCHAR +STARTCHAR U+7D0C +ENCODING 32012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1042 +2040 +4BFF +7040 +2050 +4850 +4450 +7C50 +1050 +3891 +5511 +1211 +141F +0000 +0000 +ENDCHAR +STARTCHAR U+7D0D +ENCODING 32013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1440 +67F8 +1A48 +1A48 +2648 +7EA8 +1298 +1B18 +3608 +3608 +5208 +1218 +0000 +ENDCHAR +STARTCHAR U+7D0E +ENCODING 32014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1014 +2012 +4410 +79FF +1010 +2410 +7E10 +1210 +1028 +3844 +5482 +1101 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+7D0F +ENCODING 32015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +3064 +6034 +C414 +6C04 +18C4 +3064 +6424 +FE04 +1207 +103C +55E4 +5604 +D204 +9004 +1004 +ENDCHAR +STARTCHAR U+7D10 +ENCODING 32016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0A48 +7248 +1448 +0C48 +13FC +7E48 +0848 +2C48 +2A48 +2A48 +49FC +0800 +0000 +ENDCHAR +STARTCHAR U+7D11 +ENCODING 32017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +33FF +6010 +C410 +6C30 +1820 +3068 +64EC +FDA6 +1523 +1020 +5420 +5620 +D220 +9020 +1020 +ENDCHAR +STARTCHAR U+7D12 +ENCODING 32018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3038 +6028 +C46C +6CC6 +19C7 +3345 +6444 +FC44 +1444 +1044 +5444 +54C4 +D484 +9184 +1304 +ENDCHAR +STARTCHAR U+7D13 +ENCODING 32019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FE +6002 +C464 +6C38 +1810 +31FF +6411 +FE13 +1212 +1010 +5410 +5610 +D210 +9010 +1070 +ENDCHAR +STARTCHAR U+7D14 +ENCODING 32020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +084C +0A70 +73C0 +1448 +0D48 +1348 +7F48 +09F8 +2D48 +2A40 +2A44 +4844 +083C +0000 +ENDCHAR +STARTCHAR U+7D15 +ENCODING 32021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +1520 +6520 +1924 +19E8 +2530 +7D20 +1120 +3920 +3520 +3564 +51A4 +161C +0000 +ENDCHAR +STARTCHAR U+7D16 +ENCODING 32022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +33E2 +2022 +C822 +5822 +33E2 +2202 +4A02 +FA02 +2BE2 +2022 +A822 +A862 +A842 +20C2 +2382 +ENDCHAR +STARTCHAR U+7D17 +ENCODING 32023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A20 +72B0 +14A8 +0CA8 +12A4 +7F24 +0928 +2C78 +2A10 +2A20 +48C0 +0B00 +0000 +ENDCHAR +STARTCHAR U+7D18 +ENCODING 32024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A40 +73FC +1440 +0C40 +1250 +7E90 +0C90 +2AA0 +2B30 +2948 +4BF4 +0C04 +0000 +ENDCHAR +STARTCHAR U+7D19 +ENCODING 32025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +0AE0 +72A0 +14A0 +0CFC +12A0 +7EA0 +0890 +2C90 +2A94 +2AAC +48CC +0B04 +0000 +ENDCHAR +STARTCHAR U+7D1A +ENCODING 32026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A88 +7290 +1490 +0CB8 +12C8 +7EC8 +08A8 +2CB0 +2A90 +2B30 +4948 +0A84 +0000 +ENDCHAR +STARTCHAR U+7D1B +ENCODING 32027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08E0 +0820 +0AA0 +72A0 +1490 +0D10 +13F8 +7E54 +0C50 +2A50 +2A90 +2890 +4910 +0A60 +0000 +ENDCHAR +STARTCHAR U+7D1C +ENCODING 32028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A00 +7200 +1400 +0DFC +1220 +7D20 +0820 +2C50 +2A48 +2A98 +4BE4 +0804 +0000 +ENDCHAR +STARTCHAR U+7D1D +ENCODING 32029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +301C +60F0 +C410 +6C10 +1810 +3010 +65FF +FE10 +1210 +1010 +5410 +5610 +D210 +90FE +1000 +ENDCHAR +STARTCHAR U+7D1E +ENCODING 32030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +6020 +C5FE +6D22 +1922 +3122 +6420 +FC70 +1450 +1050 +5450 +54D0 +D491 +919B +130E +ENDCHAR +STARTCHAR U+7D1F +ENCODING 32031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1028 +2044 +4482 +7901 +107C +2000 +4400 +7DFE +1002 +3804 +5408 +1010 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+7D20 +ENCODING 32032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0100 +7FFC +0240 +0CC0 +0330 +7FC8 +0540 +1930 +6108 +0100 +0000 +ENDCHAR +STARTCHAR U+7D21 +ENCODING 32033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A20 +73FC +1440 +0C40 +1278 +7D48 +0C48 +2A48 +2A88 +2888 +4908 +0A30 +0000 +ENDCHAR +STARTCHAR U+7D22 +ENCODING 32034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +3FFC +2248 +4C80 +0340 +0230 +7FC8 +0540 +1930 +6108 +0100 +0000 +ENDCHAR +STARTCHAR U+7D23 +ENCODING 32035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3040 +61F8 +C448 +6C48 +18C9 +3089 +6587 +FC20 +1420 +13FF +5420 +5420 +D420 +9020 +1020 +ENDCHAR +STARTCHAR U+7D26 +ENCODING 32038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +6122 +C522 +6D22 +1922 +3122 +65FE +FD00 +1500 +1100 +5500 +5501 +D583 +90FE +1000 +ENDCHAR +STARTCHAR U+7D27 +ENCODING 32039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +25F8 +2510 +24A0 +2440 +24B0 +070E +0424 +1FC0 +0100 +0210 +7FF8 +0108 +0920 +1118 +6308 +ENDCHAR +STARTCHAR U+7D28 +ENCODING 32040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1022 +2042 +44BF +7D82 +0A82 +10A2 +2492 +7C8A +1482 +1082 +5482 +5482 +548A +1084 +0000 +0000 +ENDCHAR +STARTCHAR U+7D29 +ENCODING 32041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +2290 +7CFF +0910 +1010 +2410 +7DFF +1010 +5428 +5444 +5482 +1101 +1201 +0000 +0000 +ENDCHAR +STARTCHAR U+7D2A +ENCODING 32042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +3090 +2090 +CA90 +5A90 +3290 +22F3 +4A9E +FA90 +2A90 +2290 +AA90 +AA90 +AAF1 +239B +260E +ENDCHAR +STARTCHAR U+7D2B +ENCODING 32043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0898 +2FE0 +2880 +2884 +2F7C +7240 +0CC0 +0330 +7FC8 +0540 +1930 +6108 +0100 +0000 +ENDCHAR +STARTCHAR U+7D2C +ENCODING 32044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1440 +6440 +1BF8 +1A48 +2648 +7E48 +13F8 +1A48 +3648 +3648 +53F8 +1208 +0000 +ENDCHAR +STARTCHAR U+7D2D +ENCODING 32045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +33C4 +2044 +C844 +5844 +33CC +2208 +4A08 +FA08 +2BCA +204A +A85A +A8D2 +A892 +219F +2331 +ENDCHAR +STARTCHAR U+7D2E +ENCODING 32046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +1C40 +1A44 +2944 +493C +0240 +1EA0 +0318 +7FE4 +0540 +0930 +3108 +0000 +ENDCHAR +STARTCHAR U+7D2F +ENCODING 32047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +0240 +1CC0 +0330 +7FC8 +0540 +1930 +6108 +0100 +0000 +ENDCHAR +STARTCHAR U+7D30 +ENCODING 32048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0AA8 +72A8 +14A8 +0CA8 +12F8 +7EA8 +08A8 +2CA8 +2AA8 +2AF8 +4888 +0800 +0000 +ENDCHAR +STARTCHAR U+7D31 +ENCODING 32049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +304C +2044 +CBFF +5840 +3040 +2044 +48E4 +F8AC +29A8 +2138 +AB10 +A838 +A86C +20C6 +2183 +ENDCHAR +STARTCHAR U+7D32 +ENCODING 32050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A8 +08A8 +0AA8 +72A8 +15FC +0CA8 +12A8 +7EA8 +08B8 +2CA8 +2A80 +2A80 +48FC +0880 +0000 +ENDCHAR +STARTCHAR U+7D33 +ENCODING 32051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1440 +67F8 +1A48 +1A48 +27F8 +7E48 +1248 +1BF8 +3648 +3440 +5040 +1040 +0000 +ENDCHAR +STARTCHAR U+7D35 +ENCODING 32053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0AFC +7288 +0D00 +0C00 +13FC +7E20 +0820 +2C20 +2A20 +2A20 +4820 +0860 +0000 +ENDCHAR +STARTCHAR U+7D36 +ENCODING 32054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +20FE +4410 +7C10 +0810 +11FF +2410 +7C20 +1020 +3844 +5482 +11FF +1001 +0000 +0000 +ENDCHAR +STARTCHAR U+7D38 +ENCODING 32056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1010 +20FE +4210 +7C10 +0810 +1210 +7EFE +0810 +1C10 +2A10 +4810 +0812 +09FF +0000 +0000 +ENDCHAR +STARTCHAR U+7D39 +ENCODING 32057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BF8 +0A48 +7248 +1448 +0C88 +12B0 +7F00 +09F8 +2D08 +2B08 +2B08 +49F8 +0908 +0000 +ENDCHAR +STARTCHAR U+7D3A +ENCODING 32058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0888 +0A88 +7288 +17FC +0C88 +1288 +7E88 +08F8 +2C88 +2A88 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7D3B +ENCODING 32059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2010 +4410 +7CFE +0892 +1092 +2492 +7DFF +1010 +1028 +5444 +5482 +5501 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+7D3C +ENCODING 32060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +3090 +23FE +C892 +5892 +33FE +2290 +4A90 +FBFF +2891 +2091 +A893 +A992 +A916 +2310 +2610 +ENDCHAR +STARTCHAR U+7D3D +ENCODING 32061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3010 +6010 +C5FF +6D01 +1901 +3040 +6446 +FC5C +1470 +1040 +5440 +5440 +D441 +9063 +103E +ENDCHAR +STARTCHAR U+7D3E +ENCODING 32062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3038 +6028 +C46C +6CC6 +1993 +3030 +6464 +FECC +1218 +1031 +54E3 +5606 +D20C +9038 +10E0 +ENDCHAR +STARTCHAR U+7D3F +ENCODING 32063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A40 +7240 +1490 +0C88 +13F4 +7E04 +09F8 +2D08 +2B08 +2B08 +49F8 +0908 +0000 +ENDCHAR +STARTCHAR U+7D40 +ENCODING 32064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3111 +6111 +C511 +6D11 +1911 +31FF +6410 +FC10 +1511 +1111 +5511 +5511 +D511 +91FF +1000 +ENDCHAR +STARTCHAR U+7D41 +ENCODING 32065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +3080 +6080 +C5FF +6D00 +1A10 +3096 +649A +FCB2 +14D2 +1196 +5490 +5490 +D481 +90C3 +107E +ENDCHAR +STARTCHAR U+7D42 +ENCODING 32066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A78 +72C8 +1530 +0C20 +12D0 +7F08 +0864 +2C10 +2A00 +2AC0 +4830 +0808 +0000 +ENDCHAR +STARTCHAR U+7D43 +ENCODING 32067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A20 +73FC +1420 +0D28 +12C8 +7E50 +0C30 +2A20 +2A30 +2848 +4BFC +0804 +0000 +ENDCHAR +STARTCHAR U+7D44 +ENCODING 32068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A88 +7288 +1488 +0CF8 +1288 +7F88 +0CF8 +2A88 +2A88 +2888 +4BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7D45 +ENCODING 32069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1608 +6608 +1AE8 +1AA8 +26A8 +7EA8 +12E8 +1AA8 +3608 +3608 +5208 +1218 +0000 +ENDCHAR +STARTCHAR U+7D46 +ENCODING 32070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0AA8 +72A4 +1524 +0CF8 +1220 +7E20 +09FC +2C20 +2A20 +2A20 +4820 +0820 +0000 +ENDCHAR +STARTCHAR U+7D47 +ENCODING 32071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3040 +6040 +C4FF +6C81 +1981 +3079 +6449 +FE49 +1249 +1049 +5479 +5601 +D203 +9002 +100E +ENDCHAR +STARTCHAR U+7D48 +ENCODING 32072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3030 +6020 +C4FE +6C82 +1882 +3082 +6482 +FEFE +1282 +1082 +5482 +5682 +D282 +90FE +1000 +ENDCHAR +STARTCHAR U+7D4A +ENCODING 32074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1010 +2010 +45FF +7C10 +0838 +1054 +2492 +7D11 +1010 +54FE +5410 +5410 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+7D4B +ENCODING 32075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A20 +73FC +1500 +0D20 +1320 +7F20 +0D20 +2B30 +2B48 +2958 +4BE4 +0C04 +0000 +ENDCHAR +STARTCHAR U+7D4C +ENCODING 32076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0A88 +7250 +1420 +0C70 +13AC +7F20 +0CF8 +2A20 +2A20 +2820 +4BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7D4D +ENCODING 32077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1086 +308C +20B8 +C988 +5908 +3308 +2508 +497F +F908 +2908 +2108 +A908 +A908 +A908 +213E +2100 +ENDCHAR +STARTCHAR U+7D4E +ENCODING 32078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F8 +1500 +6500 +1A80 +18FC +2490 +7D10 +1310 +1910 +3510 +3510 +5110 +1130 +0000 +ENDCHAR +STARTCHAR U+7D4F +ENCODING 32079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BF8 +7348 +15F8 +0D48 +13F8 +7F48 +0C48 +2A30 +2A24 +28D4 +4B0C +0804 +0000 +ENDCHAR +STARTCHAR U+7D50 +ENCODING 32080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A20 +73FC +1420 +0C20 +12F8 +7E00 +08F8 +2C88 +2A88 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7D51 +ENCODING 32081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3050 +6050 +C4FE +6C90 +1990 +3010 +65FF +FC54 +1454 +1054 +54D6 +5492 +D593 +9010 +1010 +ENDCHAR +STARTCHAR U+7D52 +ENCODING 32082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1101 +1111 +2111 +4911 +7911 +0D55 +1333 +2911 +7D11 +1111 +1111 +3911 +5511 +1201 +0000 +0000 +ENDCHAR +STARTCHAR U+7D53 +ENCODING 32083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3010 +60FE +C410 +6C10 +1810 +31FF +6400 +FC10 +1410 +10FE +5410 +5410 +D410 +91FF +1000 +ENDCHAR +STARTCHAR U+7D54 +ENCODING 32084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +11FF +2010 +4222 +7CFF +0882 +1082 +2282 +7EFE +0882 +1C82 +2A82 +49FE +0882 +0000 +0000 +ENDCHAR +STARTCHAR U+7D55 +ENCODING 32085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +2044 +4444 +FC54 +0888 +11FC +2524 +FD24 +11FC +5500 +5502 +5502 +10FE +0000 +0000 +ENDCHAR +STARTCHAR U+7D56 +ENCODING 32086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0B24 +72A4 +14A8 +0C20 +13FC +7E50 +0C50 +2A50 +2A90 +2894 +4914 +0A0C +0000 +ENDCHAR +STARTCHAR U+7D57 +ENCODING 32087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +6102 +C502 +6D02 +197A +314A +654A +FD4A +154A +114A +557A +5502 +D502 +9102 +11FE +ENDCHAR +STARTCHAR U+7D58 +ENCODING 32088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +1040 +207F +4849 +7809 +1388 +2008 +4808 +7C88 +13C8 +1008 +3814 +5422 +1041 +0000 +0000 +ENDCHAR +STARTCHAR U+7D59 +ENCODING 32089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +6000 +C400 +6CFC +1884 +3084 +64FC +FC84 +1484 +1084 +54FC +5400 +D400 +93FF +1000 +ENDCHAR +STARTCHAR U+7D5A +ENCODING 32090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +33FE +6080 +C480 +6CFC +1884 +30A4 +6494 +FC84 +14A4 +1094 +5484 +5404 +D404 +93FF +1000 +ENDCHAR +STARTCHAR U+7D5B +ENCODING 32091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08FC +0990 +1660 +14F0 +374C +5450 +15B0 +1448 +17FC +1550 +1548 +1248 +1040 +0000 +ENDCHAR +STARTCHAR U+7D5C +ENCODING 32092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +FF7E +0812 +7F12 +0832 +0822 +3F66 +E10C +0220 +0C40 +0482 +FFFF +0101 +1918 +710E +ENDCHAR +STARTCHAR U+7D5D +ENCODING 32093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3010 +61FF +C428 +6C44 +1983 +307C +6400 +FDFF +1420 +1040 +54FE +5402 +D402 +9006 +101C +ENDCHAR +STARTCHAR U+7D5E +ENCODING 32094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0BFC +7290 +1488 +0D94 +1294 +7E50 +0C60 +2A20 +2A60 +2890 +4908 +0A04 +0000 +ENDCHAR +STARTCHAR U+7D5F +ENCODING 32095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1028 +2044 +4482 +7D7D +0810 +1010 +2210 +7E7C +0810 +1C10 +2A10 +4912 +08FF +0000 +0000 +ENDCHAR +STARTCHAR U+7D61 +ENCODING 32097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A78 +7288 +14D0 +0D20 +1250 +7E88 +09FC +2C88 +2A88 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7D62 +ENCODING 32098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1500 +65F8 +1A08 +13E8 +2928 +7DE8 +1528 +19E8 +3528 +3408 +5008 +1030 +0000 +ENDCHAR +STARTCHAR U+7D63 +ENCODING 32099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0848 +0A50 +73FC +1450 +0C50 +1250 +7FFC +0C50 +2A50 +2A90 +2890 +4910 +0A10 +0000 +ENDCHAR +STARTCHAR U+7D65 +ENCODING 32101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +308A +208B +C989 +5908 +337F +2508 +4908 +F908 +291C +2114 +A914 +A914 +A936 +2122 +2163 +ENDCHAR +STARTCHAR U+7D66 +ENCODING 32102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A50 +7250 +1488 +0DFC +1200 +7E00 +08F8 +2C88 +2A88 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7D67 +ENCODING 32103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +6102 +C502 +6D7A +1902 +3102 +657A +FD4A +154A +114A +557A +5502 +D502 +9102 +1106 +ENDCHAR +STARTCHAR U+7D68 +ENCODING 32104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1028 +1424 +6424 +1BFC +18A0 +24A8 +7CE8 +13A8 +3890 +3514 +352C +524C +1084 +0000 +ENDCHAR +STARTCHAR U+7D69 +ENCODING 32105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +1050 +2050 +4A52 +7954 +08D8 +1050 +24D8 +7D54 +1253 +1050 +3850 +5491 +131F +0000 +0000 +ENDCHAR +STARTCHAR U+7D6A +ENCODING 32106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +2511 +4511 +2911 +11FF +2511 +7F11 +1329 +1129 +5545 +5583 +5501 +5501 +11FF +1101 +ENDCHAR +STARTCHAR U+7D6B +ENCODING 32107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0110 +03F0 +0810 +1122 +3F7E +0102 +0240 +0788 +0104 +3FFE +0491 +0888 +1084 +0000 +0000 +ENDCHAR +STARTCHAR U+7D6D +ENCODING 32109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +3FFE +0200 +7FFF +0888 +1104 +2222 +4FC1 +0088 +3FFC +0492 +0888 +3086 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7D6E +ENCODING 32110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7EF8 +1288 +1288 +3C88 +04F8 +1B88 +6240 +1CA0 +0318 +7FE4 +0540 +0930 +3108 +0000 +ENDCHAR +STARTCHAR U+7D6F +ENCODING 32111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1020 +23FF +4440 +7C88 +0910 +13E0 +2444 +7C88 +1110 +1220 +3850 +5488 +1107 +0000 +0000 +ENDCHAR +STARTCHAR U+7D70 +ENCODING 32112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +6040 +C4C4 +6C84 +189E +31F2 +6400 +FC20 +1420 +11FE +5420 +5420 +D420 +93FF +1000 +ENDCHAR +STARTCHAR U+7D71 +ENCODING 32113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0BFC +7240 +1450 +0C98 +13E4 +7E50 +0C50 +2A50 +2A90 +2894 +4914 +0A0C +0000 +ENDCHAR +STARTCHAR U+7D72 +ENCODING 32114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A28 +73C8 +1450 +0C30 +1248 +7FFC +0924 +2CB0 +2AA8 +2AA4 +4924 +0820 +0000 +ENDCHAR +STARTCHAR U+7D73 +ENCODING 32115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A78 +7288 +0D50 +0C30 +12DC +7F10 +08F8 +2C90 +2A90 +2BFC +4810 +0810 +0000 +ENDCHAR +STARTCHAR U+7D75 +ENCODING 32117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A50 +7250 +1488 +0D74 +1200 +7E00 +09FC +2C40 +2A50 +2A98 +49E4 +0804 +0000 +ENDCHAR +STARTCHAR U+7D76 +ENCODING 32118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0A78 +7290 +1520 +0CF8 +12A8 +7EA8 +08F8 +2C88 +2A80 +2A84 +4884 +087C +0000 +ENDCHAR +STARTCHAR U+7D77 +ENCODING 32119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +FEFC +0848 +3EC8 +C86A +298A +1226 +1FC0 +0100 +0210 +3FF8 +0920 +1118 +2108 +0300 +ENDCHAR +STARTCHAR U+7D78 +ENCODING 32120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FE +6082 +C482 +6CFE +1882 +3082 +64FE +FC82 +1482 +10FE +5448 +5448 +D4C9 +9189 +1307 +ENDCHAR +STARTCHAR U+7D79 +ENCODING 32121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A88 +7288 +14F8 +0C00 +12F8 +7E88 +08F8 +2C88 +2AF8 +2A88 +4888 +0898 +0000 +ENDCHAR +STARTCHAR U+7D7A +ENCODING 32122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10C4 +306C +6038 +C46C +6DC6 +1820 +31FF +6440 +FC90 +15FE +1092 +5492 +5492 +D492 +9096 +1010 +ENDCHAR +STARTCHAR U+7D7B +ENCODING 32123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +307C +6044 +C4CC +6D88 +18FE +3092 +6492 +FC92 +14FE +1048 +5448 +5448 +D4C9 +9189 +1307 +ENDCHAR +STARTCHAR U+7D7C +ENCODING 32124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +11F2 +2014 +4448 +7830 +102C +21CA +4412 +7CE6 +100A +3872 +5402 +1014 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+7D7D +ENCODING 32125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A88 +7288 +1488 +0CF8 +1220 +7E40 +09FC +2D04 +2B04 +2B04 +49FC +0904 +0000 +ENDCHAR +STARTCHAR U+7D7F +ENCODING 32127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0814 +0812 +1010 +6410 +24FF +1810 +1292 +2654 +7938 +0818 +2A14 +2A34 +2A54 +2A92 +0912 +0871 +ENDCHAR +STARTCHAR U+7D80 +ENCODING 32128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +2010 +4410 +7DFF +1111 +2111 +49FF +7C10 +1054 +3892 +5511 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+7D81 +ENCODING 32129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +309F +23D1 +C893 +5892 +33D6 +2094 +4892 +F891 +2BF1 +2091 +A891 +A997 +A910 +2310 +2610 +ENDCHAR +STARTCHAR U+7D82 +ENCODING 32130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +63FF +C400 +6C00 +19FE +3102 +6502 +FD02 +15FE +1048 +5448 +54C8 +D489 +9189 +1307 +ENDCHAR +STARTCHAR U+7D83 +ENCODING 32131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3111 +6193 +C492 +6C10 +18FE +3082 +6482 +FEFE +1282 +1082 +54FE +5682 +D282 +9082 +108E +ENDCHAR +STARTCHAR U+7D84 +ENCODING 32132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +23FF +4A01 +7A01 +10FC +2000 +4BFF +7850 +1050 +3850 +5491 +1111 +121F +0000 +0000 +ENDCHAR +STARTCHAR U+7D85 +ENCODING 32133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FC +6004 +C4FC +6C04 +18FC +3000 +65FF +FD01 +15FD +1044 +546C +5438 +D410 +907C +11C7 +ENDCHAR +STARTCHAR U+7D86 +ENCODING 32134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +33FF +6020 +C5FE +6D22 +1922 +31FE +6522 +FD22 +15FE +1020 +5520 +54A0 +D470 +90DC +1387 +ENDCHAR +STARTCHAR U+7D88 +ENCODING 32136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +3048 +61FE +C422 +6C22 +19FE +3120 +6520 +FDFF +1461 +1061 +54A3 +55A2 +D52E +9220 +1020 +ENDCHAR +STARTCHAR U+7D89 +ENCODING 32137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +08F0 +0A20 +73FC +1470 +0CA8 +1324 +7EF0 +0C50 +2A50 +2A9C +2884 +4904 +0A18 +0000 +ENDCHAR +STARTCHAR U+7D8B +ENCODING 32139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +61FE +C502 +6D22 +1820 +33FF +6440 +FC40 +14D0 +1090 +54B0 +55A4 +D564 +934E +10FB +ENDCHAR +STARTCHAR U+7D8C +ENCODING 32140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3044 +60C6 +C583 +6C10 +1838 +306C +64C6 +FD83 +1400 +10FE +5482 +5482 +D482 +9082 +10FE +ENDCHAR +STARTCHAR U+7D8D +ENCODING 32141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +63FF +C420 +6C20 +19FE +3102 +6502 +FCFC +1408 +1010 +57FF +5410 +D410 +9010 +1070 +ENDCHAR +STARTCHAR U+7D8E +ENCODING 32142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11E3 +243C +4444 +2844 +1084 +25E4 +7E3F +1424 +1124 +5544 +54C4 +549F +54C0 +113F +1200 +ENDCHAR +STARTCHAR U+7D8F +ENCODING 32143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +0BE8 +72A4 +1494 +0D20 +1220 +7FFC +0848 +2C48 +2AF0 +2A10 +4868 +0984 +0000 +ENDCHAR +STARTCHAR U+7D91 +ENCODING 32145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FF +6101 +C511 +6D11 +197D +3111 +6539 +FD39 +1555 +1155 +5511 +5511 +D501 +91FF +1000 +ENDCHAR +STARTCHAR U+7D92 +ENCODING 32146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2054 +4492 +7D11 +08FE +1004 +2008 +49FF +7C08 +1008 +3808 +5408 +1028 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+7D93 +ENCODING 32147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0AA8 +72A8 +1550 +0CA8 +12A8 +7E00 +0DF8 +2A20 +2A20 +2820 +4BFC +0800 +0000 +ENDCHAR +STARTCHAR U+7D94 +ENCODING 32148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +7F10 +2212 +4122 +007C +3E08 +0011 +7F7F +2008 +3F2A +012A +012A +0A49 +0418 +0000 +0000 +ENDCHAR +STARTCHAR U+7D96 +ENCODING 32150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +378E +20B8 +C908 +5A08 +37A8 +20AF +48A8 +F8A8 +2AA8 +22A8 +AB28 +A97F +AB80 +26E0 +2C3F +ENDCHAR +STARTCHAR U+7D97 +ENCODING 32151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +6152 +C552 +6D52 +194E +3182 +6502 +FD7A +154A +114A +554A +557A +D502 +9102 +110E +ENDCHAR +STARTCHAR U+7D99 +ENCODING 32153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0920 +0BA8 +7368 +1570 +0D20 +13FC +7F20 +0970 +2DA8 +2B28 +2B20 +49FC +0900 +0000 +ENDCHAR +STARTCHAR U+7D9A +ENCODING 32154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0BFC +7220 +14F8 +0C00 +13FC +7F08 +0950 +2C50 +2A50 +2A94 +4894 +090C +0000 +ENDCHAR +STARTCHAR U+7D9B +ENCODING 32155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1448 +6448 +29C8 +18A8 +2530 +7E40 +18A0 +35A8 +3584 +3284 +5490 +1070 +0000 +ENDCHAR +STARTCHAR U+7D9C +ENCODING 32156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0AFC +7288 +1500 +0CF8 +1200 +7FFC +0C20 +2AA8 +2AA4 +2924 +4820 +0860 +0000 +ENDCHAR +STARTCHAR U+7D9D +ENCODING 32157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +3084 +2084 +CBFF +5884 +3084 +2084 +49CE +F9CE +2AB5 +2295 +A884 +A884 +A884 +2084 +2084 +ENDCHAR +STARTCHAR U+7D9E +ENCODING 32158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +301C +60F0 +C410 +6DFF +1892 +3092 +6492 +FDFF +1492 +1092 +5492 +55FF +D410 +9010 +11FF +ENDCHAR +STARTCHAR U+7D9F +ENCODING 32159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1400 +65F8 +1908 +19F8 +2520 +7D20 +19FC +3520 +3530 +3250 +5388 +1604 +0000 +ENDCHAR +STARTCHAR U+7DA0 +ENCODING 32160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103E +6442 +2444 +18FC +1488 +2208 +7FFF +1210 +1092 +5454 +5438 +5454 +5494 +1112 +1231 +ENDCHAR +STARTCHAR U+7DA1 +ENCODING 32161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1010 +21FF +4400 +7CFE +1082 +2082 +44FE +7C10 +1038 +5454 +5492 +5511 +1030 +0000 +0000 +ENDCHAR +STARTCHAR U+7DA2 +ENCODING 32162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1648 +6648 +1BF8 +1A48 +27F8 +7E48 +1AE8 +36A8 +36E8 +32A8 +5408 +1818 +0000 +ENDCHAR +STARTCHAR U+7DA3 +ENCODING 32163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A8 +0AA4 +73FC +1420 +0DFC +1250 +7E88 +09F4 +2C90 +2A90 +2AB4 +4884 +087C +0000 +ENDCHAR +STARTCHAR U+7DA6 +ENCODING 32166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0828 +7FFC +0A20 +0920 +08A4 +FFFE +0920 +1230 +2FEE +C104 +0210 +3FF8 +0920 +1118 +2308 +ENDCHAR +STARTCHAR U+7DA7 +ENCODING 32167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3010 +61FF +C400 +6CFE +1882 +30FE +6400 +FCFE +140C +1010 +55FF +5410 +D410 +9010 +1070 +ENDCHAR +STARTCHAR U+7DA9 +ENCODING 32169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1010 +23FF +4601 +7E81 +1080 +20EE +452A +7D2A +10AA +544E +5489 +5509 +120F +0000 +0000 +ENDCHAR +STARTCHAR U+7DAA +ENCODING 32170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3010 +61FF +C610 +6CFE +1810 +31FF +6400 +FCFE +1482 +10FE +5482 +54FE +D482 +9082 +108E +ENDCHAR +STARTCHAR U+7DAB +ENCODING 32171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +0A7C +73E8 +1428 +0C34 +12CC +7E50 +085C +2DE8 +2A28 +2A14 +486C +0984 +0000 +ENDCHAR +STARTCHAR U+7DAC +ENCODING 32172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +09F4 +0B44 +72A8 +1490 +0DFC +1308 +7FF0 +0C90 +2A90 +2A60 +2860 +4990 +0E0C +0000 +ENDCHAR +STARTCHAR U+7DAD +ENCODING 32173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0848 +0A90 +72FC +1590 +0890 +14F8 +7E90 +0A90 +2CF8 +2A90 +2A90 +48FC +0880 +0000 +ENDCHAR +STARTCHAR U+7DAE +ENCODING 32174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +00FC +3F90 +2250 +3E60 +2390 +224C +4EC0 +0130 +7FC8 +0D60 +3118 +0100 +0000 +ENDCHAR +STARTCHAR U+7DAF +ENCODING 32175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1480 +65F8 +1B08 +19E8 +2688 +7FF8 +1088 +3AA8 +36A8 +37E8 +5228 +1030 +0000 +ENDCHAR +STARTCHAR U+7DB0 +ENCODING 32176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0BFC +7308 +16F0 +0C90 +1290 +7EF0 +0880 +2CF8 +2A88 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7DB1 +ENCODING 32177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1728 +66A8 +1AC8 +1BF8 +2648 +7F58 +1358 +3B58 +37F8 +3718 +5208 +1218 +0000 +ENDCHAR +STARTCHAR U+7DB2 +ENCODING 32178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1728 +66A8 +1AC8 +1BF8 +2648 +7FF8 +1288 +3A88 +3688 +3678 +5208 +1218 +0000 +ENDCHAR +STARTCHAR U+7DB3 +ENCODING 32179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +33CF +2249 +CA49 +5A49 +33CF +2249 +4A49 +FA49 +2BCF +2249 +AA49 +AA49 +AA49 +2249 +24D3 +ENDCHAR +STARTCHAR U+7DB4 +ENCODING 32180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1648 +65B0 +1890 +1168 +2A48 +7FF8 +1A48 +3568 +34B0 +3190 +5228 +1444 +0000 +ENDCHAR +STARTCHAR U+7DB5 +ENCODING 32181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +0AE8 +72A4 +0C94 +0D10 +1220 +7E20 +09FC +2C70 +2A70 +2AA8 +4924 +0820 +0000 +ENDCHAR +STARTCHAR U+7DB6 +ENCODING 32182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +6122 +C522 +6DFE +1922 +3122 +65FE +FC20 +15FF +10A8 +54AC +55A4 +D526 +9323 +1020 +ENDCHAR +STARTCHAR U+7DB7 +ENCODING 32183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +23FF +C800 +5888 +3088 +21DC +4B56 +F800 +2820 +23FF +A820 +A820 +A820 +2020 +2020 +ENDCHAR +STARTCHAR U+7DB8 +ENCODING 32184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +14A0 +64A0 +1910 +1BF8 +2404 +7FF8 +12A8 +3BF8 +36A8 +36A8 +52A8 +1218 +0000 +ENDCHAR +STARTCHAR U+7DB9 +ENCODING 32185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +31E8 +2128 +CB28 +5A6E +37C9 +2088 +49C8 +FB70 +2E1F +2000 +A9FC +A904 +A904 +2104 +21FC +ENDCHAR +STARTCHAR U+7DBA +ENCODING 32186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0BFC +7260 +1450 +0C88 +13FC +7E08 +08E8 +2CA8 +2AE8 +2AA8 +4808 +0818 +0000 +ENDCHAR +STARTCHAR U+7DBB +ENCODING 32187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0AFC +7288 +1500 +0DFC +1220 +7EA0 +08B8 +2CA0 +2AA0 +2B60 +4930 +0A0C +0000 +ENDCHAR +STARTCHAR U+7DBC +ENCODING 32188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1080 +21FE +4492 +7CFE +0892 +1092 +24FE +7C28 +1048 +3888 +55FF +1008 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+7DBD +ENCODING 32189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0A3C +7220 +14F8 +0C88 +12F8 +7E88 +08F8 +2C20 +2BFC +2A20 +4820 +0820 +0000 +ENDCHAR +STARTCHAR U+7DBE +ENCODING 32190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17F8 +6440 +1FFC +10A0 +2924 +7E9C +14F0 +3990 +36A0 +3440 +51B0 +160C +0000 +ENDCHAR +STARTCHAR U+7DBF +ENCODING 32191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +15F0 +6510 +19F0 +1910 +25F0 +7C40 +13F8 +3A48 +3648 +3248 +5270 +1040 +0000 +ENDCHAR +STARTCHAR U+7DC0 +ENCODING 32192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +21FF +4410 +7CFE +1012 +21FF +4412 +7CFE +1054 +55FF +5444 +5428 +1010 +10EE +0000 +0000 +ENDCHAR +STARTCHAR U+7DC1 +ENCODING 32193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +27FF +4820 +7BFE +1022 +27FF +4822 +7BFE +1020 +3920 +553E +11A0 +1260 +143F +0000 +0000 +ENDCHAR +STARTCHAR U+7DC2 +ENCODING 32194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3091 +6093 +C5BA +6D28 +186C +30C6 +6593 +FC10 +1491 +1093 +55BA +5528 +D46C +90C6 +1183 +ENDCHAR +STARTCHAR U+7DC3 +ENCODING 32195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +3084 +6084 +C5CE +6D4A +1B7B +3000 +6410 +FC10 +1490 +109E +5490 +5490 +D5D0 +9170 +131F +ENDCHAR +STARTCHAR U+7DC4 +ENCODING 32196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FC +6104 +C504 +6DFC +1904 +3104 +65FC +FC00 +1510 +1116 +55DC +5510 +D511 +91D3 +130E +ENDCHAR +STARTCHAR U+7DC5 +ENCODING 32197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +37FF +2240 +CA40 +5A7F +33D1 +2251 +4A5B +FA4A +2BCA +224E +AA44 +AA4E +ABCA +265B +2051 +ENDCHAR +STARTCHAR U+7DC6 +ENCODING 32198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FC +6084 +C484 +6CFC +1884 +3084 +64FC +FC40 +14FF +1195 +5725 +5449 +D593 +9022 +10CE +ENDCHAR +STARTCHAR U+7DC7 +ENCODING 32199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1248 +1490 +6648 +1A48 +1800 +27F8 +7E48 +1248 +3BF8 +3648 +3648 +53F8 +1208 +0000 +ENDCHAR +STARTCHAR U+7DC9 +ENCODING 32201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +2010 +4410 +7DFF +1111 +2111 +4599 +7D55 +11BB +5511 +5511 +5501 +1107 +0000 +0000 +ENDCHAR +STARTCHAR U+7DCA +ENCODING 32202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +3E50 +2220 +3ED0 +3F0C +2120 +0E60 +0198 +7FE4 +0D30 +3108 +0100 +0000 +ENDCHAR +STARTCHAR U+7DCB +ENCODING 32203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A0 +14A0 +67BC +18A0 +10A0 +2BBC +7CA0 +18A0 +37BC +3520 +3120 +5220 +1420 +0000 +ENDCHAR +STARTCHAR U+7DCC +ENCODING 32204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +301C +60F0 +C410 +6DFF +1854 +30D6 +6593 +FC10 +1420 +11FF +5442 +5484 +D4F8 +901E +11E3 +ENDCHAR +STARTCHAR U+7DCD +ENCODING 32205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +30F8 +6088 +C488 +6CFF +1888 +3088 +64E5 +FD83 +14FE +1082 +5482 +54FE +D482 +9082 +10FE +ENDCHAR +STARTCHAR U+7DCE +ENCODING 32206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +3012 +6012 +C5FF +6C10 +1810 +31F9 +6529 +FD2B +152A +11EE +5404 +54EC +D595 +9027 +10C2 +ENDCHAR +STARTCHAR U+7DCF +ENCODING 32207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0830 +0890 +0A90 +72A8 +1524 +0C50 +12F8 +7E48 +0C20 +2AE8 +2AC4 +2954 +4A50 +0830 +0000 +ENDCHAR +STARTCHAR U+7DD1 +ENCODING 32209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1410 +65F0 +1810 +1BFC +2640 +7D64 +1968 +34D0 +3550 +3648 +5044 +10C0 +0000 +ENDCHAR +STARTCHAR U+7DD2 +ENCODING 32210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0848 +0BF8 +7250 +0C50 +0FFC +1240 +7EF8 +0988 +2EF8 +2A88 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7DD5 +ENCODING 32213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0BFC +7288 +1450 +0C70 +138C +7E88 +0CF8 +2A88 +2AF8 +2888 +4908 +0A08 +0000 +ENDCHAR +STARTCHAR U+7DD6 +ENCODING 32214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1021 +25FE +2422 +4824 +33FF +2408 +7E14 +1260 +11FE +5682 +54FE +5482 +5482 +10FE +1082 +ENDCHAR +STARTCHAR U+7DD7 +ENCODING 32215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +309F +2091 +CBF1 +5891 +309F +2191 +49D1 +F9D1 +2ABF +2291 +A891 +A891 +A891 +209F +2080 +ENDCHAR +STARTCHAR U+7DD8 +ENCODING 32216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1028 +1424 +67FC +2A20 +1BE8 +2628 +7FE8 +1350 +3B54 +37DC +336C +5444 +1884 +0000 +ENDCHAR +STARTCHAR U+7DD9 +ENCODING 32217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +3084 +63FF +C484 +6C84 +18FC +3020 +65FE +FD22 +1522 +11FE +5420 +57FF +D420 +9020 +1020 +ENDCHAR +STARTCHAR U+7DDA +ENCODING 32218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +0AF8 +7288 +14F8 +0C88 +12F8 +7F20 +0DE4 +2A78 +2AB0 +2928 +4A24 +0860 +0000 +ENDCHAR +STARTCHAR U+7DDB +ENCODING 32219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +2020 +4040 +7BFF +1249 +2249 +4A03 +7C20 +1020 +13FF +3850 +5488 +1104 +1202 +0000 +0000 +ENDCHAR +STARTCHAR U+7DDC +ENCODING 32220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +080C +11F0 +3E20 +22C8 +3E50 +2230 +3E48 +09FC +7E24 +4AB0 +4AA8 +4AA4 +4F24 +0820 +0000 +ENDCHAR +STARTCHAR U+7DDD +ENCODING 32221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A88 +72F8 +1400 +0FFC +1288 +7EF8 +0C88 +2AF8 +2A88 +28F8 +4B88 +0808 +0000 +ENDCHAR +STARTCHAR U+7DDE +ENCODING 32222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1370 +1650 +6654 +2BD4 +1A4C +2680 +7FF8 +1248 +3A28 +37B0 +3610 +5228 +12C4 +0000 +ENDCHAR +STARTCHAR U+7DDF +ENCODING 32223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +13FC +2020 +4BFE +7820 +11FC +2124 +49FC +7D24 +11FC +3820 +55FC +1020 +13FE +0000 +0000 +ENDCHAR +STARTCHAR U+7DE0 +ENCODING 32224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +6510 +28A0 +1BFC +2248 +7C40 +13F8 +3A48 +3648 +3648 +5258 +1040 +0000 +ENDCHAR +STARTCHAR U+7DE1 +ENCODING 32225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1508 +65F8 +2920 +19FC +2510 +7DCC +13FC +3908 +35F8 +3508 +51F8 +1108 +0000 +ENDCHAR +STARTCHAR U+7DE2 +ENCODING 32226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +3084 +23FF +C884 +5884 +3000 +2000 +49FE +F922 +2922 +2122 +A9FE +A922 +A922 +2122 +21FE +ENDCHAR +STARTCHAR U+7DE3 +ENCODING 32227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +20FC +4884 +29F8 +1108 +27FF +7C40 +14A2 +1134 +5658 +5498 +5734 +5454 +5492 +1112 +1661 +ENDCHAR +STARTCHAR U+7DE4 +ENCODING 32228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A8 +08A8 +0BFC +72A8 +14B8 +0C80 +12FC +7E20 +09FC +2C70 +2A70 +2AA8 +4924 +0820 +0000 +ENDCHAR +STARTCHAR U+7DE5 +ENCODING 32229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +30BE +20A2 +C9A2 +5922 +333E +2508 +4908 +F97F +2908 +211C +A91C +A92A +A92A +2149 +2108 +ENDCHAR +STARTCHAR U+7DE6 +ENCODING 32230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +2122 +C922 +59FE +3122 +2122 +4922 +F9FE +2800 +2010 +A858 +A94A +A943 +2345 +223C +ENDCHAR +STARTCHAR U+7DE7 +ENCODING 32231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +1044 +25FF +4828 +7828 +11FF +2129 +4929 +7D49 +118F +1101 +3939 +5501 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+7DE8 +ENCODING 32232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1400 +65F8 +1908 +19F8 +2500 +7FFC +1154 +3BFC +3754 +3554 +5154 +110C +0000 +ENDCHAR +STARTCHAR U+7DE9 +ENCODING 32233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +081C +09E4 +0AA8 +7250 +17FC +0C40 +13FC +7E40 +0C78 +2AC8 +2AB0 +2930 +4AC8 +0B04 +0000 +ENDCHAR +STARTCHAR U+7DEA +ENCODING 32234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +317F +2110 +C910 +591E +3392 +235A +4D26 +F922 +2932 +214C +A904 +A904 +A904 +217F +2100 +ENDCHAR +STARTCHAR U+7DEB +ENCODING 32235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +3080 +21FE +C952 +5A52 +30D2 +213E +4844 +F88C +2800 +2060 +A8B0 +AA86 +AA8B +2299 +2270 +ENDCHAR +STARTCHAR U+7DEC +ENCODING 32236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1440 +6480 +1BF8 +1AA8 +26A8 +7EE8 +12A8 +3AE8 +36A8 +36A8 +53F8 +1208 +0000 +ENDCHAR +STARTCHAR U+7DED +ENCODING 32237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FF +6111 +C5FF +6D11 +1911 +31FF +6400 +FCFE +1482 +10FE +5482 +54FE +D482 +9082 +108E +ENDCHAR +STARTCHAR U+7DEE +ENCODING 32238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A00 +13FE +2000 +4DFC +7904 +11FC +2104 +49FC +7C80 +11FC +3A88 +5450 +1020 +13DE +0000 +0000 +ENDCHAR +STARTCHAR U+7DEF +ENCODING 32239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09F8 +0A48 +73FC +1400 +0CF8 +1288 +7EF8 +0810 +2CF8 +2A90 +2BFC +4810 +0810 +0000 +ENDCHAR +STARTCHAR U+7DF0 +ENCODING 32240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10F8 +2104 +4A02 +7CF9 +1000 +23C2 +4A52 +7FD2 +1252 +3BD2 +5642 +1242 +1242 +1446 +0000 +0000 +ENDCHAR +STARTCHAR U+7DF1 +ENCODING 32241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +317E +2102 +CB02 +5AFF +3640 +2240 +4AFE +FB10 +2A10 +23FF +AA10 +AA38 +AA28 +226C +22C7 +ENDCHAR +STARTCHAR U+7DF2 +ENCODING 32242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1390 +1690 +66B8 +2BB8 +1AB4 +26D4 +7FD4 +12B8 +3A88 +3790 +36A0 +5040 +1080 +0000 +ENDCHAR +STARTCHAR U+7DF3 +ENCODING 32243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2200 +2F9E +2F8A +3FCA +2212 +2084 +2110 +23E0 +2088 +27FC +4154 +0248 +0000 +0000 +ENDCHAR +STARTCHAR U+7DF4 +ENCODING 32244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +6440 +1BF8 +1A48 +27F8 +7E48 +1BF8 +34E0 +3550 +3248 +5444 +1040 +0000 +ENDCHAR +STARTCHAR U+7DF5 +ENCODING 32245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +30AA +6092 +C4AA +6C82 +18FE +3048 +64C8 +FDA7 +147C +10C4 +55AC +5428 +D418 +9076 +11C3 +ENDCHAR +STARTCHAR U+7DF6 +ENCODING 32246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +31FF +2110 +CBFF +5A91 +3691 +22FF +4A91 +FA91 +2AFF +2210 +AA90 +AA70 +AA20 +2278 +22CF +ENDCHAR +STARTCHAR U+7DF7 +ENCODING 32247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17FF +2421 +45FC +7820 +13FE +2222 +4BFE +7E22 +13FE +3820 +57FF +1020 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+7DF9 +ENCODING 32249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FC +6084 +C4FC +6C84 +1884 +30FC +6400 +FDFF +1410 +1090 +549E +5490 +D5D0 +9170 +121F +ENDCHAR +STARTCHAR U+7DFA +ENCODING 32250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FE +6082 +C49E +6C92 +1892 +3092 +65FF +FD01 +157D +1145 +5545 +5545 +D57D +9101 +1107 +ENDCHAR +STARTCHAR U+7DFB +ENCODING 32251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +17E0 +1120 +6920 +2ABC +1AC8 +2768 +7D28 +17E8 +3910 +3550 +31A8 +5648 +1084 +0000 +ENDCHAR +STARTCHAR U+7E00 +ENCODING 32256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +33DF +2241 +CA41 +5A41 +33DF +2200 +4A3F +FBD1 +2A13 +221A +ABCE +AA04 +AA0E +221A +2233 +ENDCHAR +STARTCHAR U+7E01 +ENCODING 32257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1410 +65F0 +1810 +1BFC +2440 +7CE4 +1368 +38B0 +3770 +34A8 +5324 +10C0 +0000 +ENDCHAR +STARTCHAR U+7E03 +ENCODING 32259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +2021 +493C +7920 +12FF +2000 +45FE +7D02 +11FE +3902 +55FE +1102 +1102 +1206 +0000 +0000 +ENDCHAR +STARTCHAR U+7E04 +ENCODING 32260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1648 +67F8 +2A48 +1BF8 +2440 +7FF8 +1248 +3BF8 +3648 +37FC +5244 +103C +0000 +ENDCHAR +STARTCHAR U+7E05 +ENCODING 32261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1028 +1424 +67FC +2A20 +1BE8 +26A8 +7FE8 +1358 +3B50 +3794 +34EC +552C +1A44 +0000 +ENDCHAR +STARTCHAR U+7E08 +ENCODING 32264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2952 +2A54 +1428 +2244 +0000 +7FFE +4102 +4622 +18C0 +0502 +FFFF +0101 +0910 +391C +E107 +ENDCHAR +STARTCHAR U+7E09 +ENCODING 32265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1490 +6490 +2968 +1BFC +2400 +7FFC +11F8 +3908 +35F8 +3508 +51F8 +1108 +0000 +ENDCHAR +STARTCHAR U+7E0A +ENCODING 32266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10F0 +1010 +1490 +65F8 +2A04 +18B0 +2490 +7D08 +13FC +3968 +3568 +3568 +53FC +1000 +0000 +ENDCHAR +STARTCHAR U+7E0B +ENCODING 32267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +1120 +1578 +6448 +2A48 +1978 +2540 +7C78 +1348 +3948 +3578 +3548 +52C0 +143C +0000 +ENDCHAR +STARTCHAR U+7E0C +ENCODING 32268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1041 +2222 +4514 +7C7F +1008 +23AA +44AA +7CBE +1088 +5488 +5490 +54A0 +1140 +123F +0000 +0000 +ENDCHAR +STARTCHAR U+7E0D +ENCODING 32269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +21FE +4488 +7C50 +13FF +2201 +4621 +7DFE +1080 +54FE +5482 +5482 +1102 +100C +0000 +0000 +ENDCHAR +STARTCHAR U+7E0E +ENCODING 32270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +2044 +445C +7C54 +11FF +2101 +457D +7C44 +107C +5444 +547C +5444 +1044 +108C +0000 +0000 +ENDCHAR +STARTCHAR U+7E0F +ENCODING 32271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103C +7F24 +2925 +2547 +7FBE +2914 +2508 +4377 +0220 +0FC0 +0108 +3FFC +0888 +1084 +0000 +0000 +ENDCHAR +STARTCHAR U+7E10 +ENCODING 32272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +30FE +6122 +C4AA +6CAA +18FA +3046 +648C +FE40 +12FE +1122 +54AA +56AA +D2FA +9046 +108C +ENDCHAR +STARTCHAR U+7E11 +ENCODING 32273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +3088 +23FF +C890 +5BFE +3092 +2092 +4FFF +F892 +2892 +23FE +A898 +A994 +AA96 +2493 +2090 +ENDCHAR +STARTCHAR U+7E12 +ENCODING 32274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0848 +0A50 +73FC +1420 +0CF8 +1220 +7FFC +0C80 +2AF8 +2B20 +2A20 +4FFC +0800 +0000 +ENDCHAR +STARTCHAR U+7E13 +ENCODING 32275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2120 +457E +7DC2 +1142 +217E +4542 +7D42 +117E +552C +564A +5489 +1008 +1018 +0000 +0000 +ENDCHAR +STARTCHAR U+7E14 +ENCODING 32276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +1050 +2020 +4FDF +7A8A +1104 +228A +4C71 +7820 +17FF +38A8 +5524 +1222 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+7E15 +ENCODING 32277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +2524 +4524 +2954 +118C +25FC +7D04 +1400 +53FE +5652 +5652 +5652 +5252 +17FF +1000 +ENDCHAR +STARTCHAR U+7E16 +ENCODING 32278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +17FF +2401 +4C21 +7BFE +1020 +23FE +4820 +7BFE +1000 +3BFE +5602 +1202 +13FE +0000 +0000 +ENDCHAR +STARTCHAR U+7E17 +ENCODING 32279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +23FE +C800 +59FC +3104 +27FF +4904 +F9FC +28A2 +20B6 +A994 +AA98 +A88C +20E6 +2383 +ENDCHAR +STARTCHAR U+7E1A +ENCODING 32282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +2124 +4924 +7E23 +1080 +2300 +4A07 +7A01 +1201 +13CF +3A01 +5601 +1201 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+7E1B +ENCODING 32283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1048 +17FC +6440 +2BF8 +1A48 +27F8 +7E48 +13F8 +3810 +37FC +3510 +5090 +1030 +0000 +ENDCHAR +STARTCHAR U+7E1C +ENCODING 32284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FE +6082 +C482 +6CFE +1800 +30FE +6482 +FEFE +1282 +10FE +5482 +56FE +D244 +90C6 +1183 +ENDCHAR +STARTCHAR U+7E1D +ENCODING 32285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +111E +11F0 +2501 +45FF +2800 +117E +2542 +7F7E +1342 +117E +5542 +557E +5500 +55FF +1082 +1101 +ENDCHAR +STARTCHAR U+7E1E +ENCODING 32286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0BFC +0A00 +72F0 +1490 +0CF0 +1200 +7FF8 +0908 +2DE8 +2BA8 +2BE8 +4908 +0918 +0000 +ENDCHAR +STARTCHAR U+7E1F +ENCODING 32287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1600 +67F8 +2A00 +1BFC +26A8 +7EF0 +139C +3A10 +37FC +3490 +5850 +1030 +0000 +ENDCHAR +STARTCHAR U+7E20 +ENCODING 32288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +083C +FF24 +0824 +7E24 +0047 +FF00 +817E +BD22 +4822 +D036 +221C +FD08 +101C +5436 +9263 +ENDCHAR +STARTCHAR U+7E21 +ENCODING 32289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +6648 +2C40 +1BF8 +2510 +7CA0 +13FC +3840 +37F8 +3440 +5040 +1040 +0000 +ENDCHAR +STARTCHAR U+7E22 +ENCODING 32290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3950 +29F8 +2AA4 +2FFC +3950 +2A58 +2DB4 +3848 +2FFC +2950 +2948 +2A48 +5840 +0000 +ENDCHAR +STARTCHAR U+7E23 +ENCODING 32291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0004 +1EF8 +5220 +5EC8 +5250 +5E30 +5248 +5FFC +4024 +7EB0 +2CA8 +2AA4 +4B24 +0820 +0000 +ENDCHAR +STARTCHAR U+7E24 +ENCODING 32292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +21FF +4410 +7DFF +1010 +21FF +4410 +7C22 +10FC +5408 +55FF +5454 +1092 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+7E25 +ENCODING 32293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +2020 +4BFE +7850 +13FE +2104 +4AFA +7C21 +11FC +38A8 +5524 +1222 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+7E26 +ENCODING 32294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1088 +10C8 +1528 +6530 +2AFC +1890 +2490 +7D50 +135C +3950 +3550 +35B0 +5190 +110C +0000 +ENDCHAR +STARTCHAR U+7E27 +ENCODING 32295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1120 +3120 +213F +CB62 +5A56 +329C +2688 +4ABC +FAE7 +2A88 +22FF +AA88 +AA9C +AAAA +2249 +2208 +ENDCHAR +STARTCHAR U+7E28 +ENCODING 32296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FE +6082 +C4FE +6C82 +18FE +3111 +6593 +FC92 +15FF +1048 +5448 +5448 +D4C9 +9089 +1187 +ENDCHAR +STARTCHAR U+7E29 +ENCODING 32297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +21DE +2352 +4CCC +7A84 +0902 +12F9 +2800 +7DFC +1020 +38A8 +5726 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+7E2A +ENCODING 32298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2111 +45FF +7D11 +11FF +2092 +45FF +7C92 +11FF +5410 +55FF +5410 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+7E2B +ENCODING 32299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1238 +15C8 +6530 +28E8 +1824 +27F8 +7D20 +19F8 +3520 +35FC +3120 +52E0 +143C +0000 +ENDCHAR +STARTCHAR U+7E2C +ENCODING 32300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +3009 +2008 +CBFF +5A08 +3248 +2279 +4A49 +FBFB +2A4A +22EE +AAD4 +AB55 +AA4D +22D7 +2422 +ENDCHAR +STARTCHAR U+7E2D +ENCODING 32301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3010 +61FF +C400 +6CAA +1892 +30AA +6482 +FCFE +1420 +11FF +5521 +5529 +D575 +9101 +1103 +ENDCHAR +STARTCHAR U+7E2E +ENCODING 32302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +15FC +6508 +2A80 +18F8 +24A0 +7D78 +1348 +3978 +3548 +3548 +5178 +1148 +0000 +ENDCHAR +STARTCHAR U+7E2F +ENCODING 32303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +25FF +4501 +2800 +11FF +2410 +7EFE +1292 +1092 +54FE +5492 +5492 +54FE +1082 +1101 +ENDCHAR +STARTCHAR U+7E30 +ENCODING 32304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +20AE +20A8 +4928 +7AFF +0C88 +1108 +2B08 +7D2E +1128 +1128 +3928 +5558 +118F +0000 +0000 +ENDCHAR +STARTCHAR U+7E31 +ENCODING 32305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1150 +1150 +1250 +6A50 +2DB8 +19A4 +2524 +7EA0 +16A0 +3AB8 +36A0 +36E0 +5320 +121C +0000 +ENDCHAR +STARTCHAR U+7E32 +ENCODING 32306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1648 +67F8 +2A48 +1BF8 +2490 +7DB0 +1048 +3BF4 +3550 +3548 +5248 +1040 +0000 +ENDCHAR +STARTCHAR U+7E33 +ENCODING 32307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +23FF +C820 +59FE +3122 +21FE +4922 +F9FE +2824 +207E +ABC3 +A804 +ABFF +2084 +205C +ENDCHAR +STARTCHAR U+7E34 +ENCODING 32308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1020 +23FE +4048 +88F0 +F020 +23FE +4A4A +F8F8 +2120 +ABFC +A820 +ABFE +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+7E35 +ENCODING 32309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A88 +72F8 +1488 +0CF8 +13FC +7F54 +09FC +2DF8 +2A90 +2A60 +48F0 +0B0C +0000 +ENDCHAR +STARTCHAR U+7E36 +ENCODING 32310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7E20 +08FC +FF24 +2264 +FF24 +0855 +7E95 +0803 +0100 +0A20 +0442 +FFFF +0101 +1918 +710E +ENDCHAR +STARTCHAR U+7E37 +ENCODING 32311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +0AA8 +73FC +14A8 +0CF8 +12F8 +7EA8 +08F8 +2DFC +2A48 +2AF0 +4828 +09C4 +0000 +ENDCHAR +STARTCHAR U+7E38 +ENCODING 32312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +21FF +4444 +7DFF +1101 +21FF +4501 +7DFF +1010 +1010 +55FF +5428 +5444 +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+7E39 +ENCODING 32313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +10A0 +6BF8 +2AA8 +1BF8 +2400 +7DF0 +1000 +3BFC +3550 +3548 +5248 +10C0 +0000 +ENDCHAR +STARTCHAR U+7E3A +ENCODING 32314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1120 +15FC +6420 +2AF8 +19A8 +25F8 +7CA8 +13F8 +3920 +35FC +3520 +52E0 +143C +0000 +ENDCHAR +STARTCHAR U+7E3B +ENCODING 32315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1210 +1FFC +16B8 +16BC +1AD4 +1120 +1760 +1098 +1FE4 +22B0 +2C88 +4080 +0000 +ENDCHAR +STARTCHAR U+7E3C +ENCODING 32316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +211F +4FE0 +7A5F +0B8A +1288 +2A88 +7EAE +12A8 +12A8 +3AA8 +56A8 +10B4 +1143 +0000 +0000 +ENDCHAR +STARTCHAR U+7E3D +ENCODING 32317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +13F8 +1648 +66F8 +2BA8 +1A68 +2698 +7FF8 +1840 +34A8 +36A4 +3284 +5490 +1070 +0000 +ENDCHAR +STARTCHAR U+7E3E +ENCODING 32318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +0A20 +72F8 +1420 +0FFC +12F8 +7E88 +08F8 +2CF8 +2A88 +2AF8 +48C8 +0B04 +0000 +ENDCHAR +STARTCHAR U+7E3F +ENCODING 32319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3088 +20F8 +C904 +5A49 +37CF +2020 +4850 +F98C +2F27 +2040 +A990 +A866 +A98C +2038 +23E0 +ENDCHAR +STARTCHAR U+7E40 +ENCODING 32320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2111 +45FF +7C20 +1048 +20FF +4588 +7CFF +1088 +54FF +5488 +5488 +10FF +1080 +0000 +0000 +ENDCHAR +STARTCHAR U+7E41 +ENCODING 32321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +3FC0 +5F7C +15C8 +7F48 +1530 +3FD8 +2344 +0CC0 +0330 +3FC8 +0D60 +3118 +0100 +0000 +ENDCHAR +STARTCHAR U+7E42 +ENCODING 32322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +23FE +2020 +4A52 +7974 +0820 +1154 +2A72 +7C20 +17FF +3820 +5420 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+7E43 +ENCODING 32323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1248 +1648 +67F8 +2800 +1BB8 +26A8 +7EA8 +13B8 +3AA8 +37B8 +34A8 +54C8 +1998 +0000 +ENDCHAR +STARTCHAR U+7E44 +ENCODING 32324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FBC +5024 +5F27 +6440 +5F3E +4A12 +510C +7FB3 +0100 +0A20 +0442 +FFFF +0101 +1918 +710E +ENDCHAR +STARTCHAR U+7E45 +ENCODING 32325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1242 +3366 +6124 +C5FE +6D22 +19FE +3122 +6522 +FDFE +1420 +13FF +5468 +54AC +D5A6 +9323 +1020 +ENDCHAR +STARTCHAR U+7E46 +ENCODING 32326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +14CC +6774 +28CC +1B74 +2444 +7CA0 +1370 +399C +3468 +3590 +5060 +1380 +0000 +ENDCHAR +STARTCHAR U+7E47 +ENCODING 32327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +021C +0DE0 +F020 +9440 +5484 +49F8 +7E10 +9020 +1044 +FDFE +1020 +54A8 +5526 +5622 +7CA0 +0040 +ENDCHAR +STARTCHAR U+7E48 +ENCODING 32328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1388 +2090 +40A2 +8BBE +F208 +223E +4BAA +F8AA +20BE +A888 +A88A +AABE +2102 +0000 +0000 +ENDCHAR +STARTCHAR U+7E49 +ENCODING 32329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +2082 +44FE +7C82 +10FE +2082 +44FE +7C00 +1444 +1145 +54C6 +5545 +5484 +1107 +0000 +0000 +ENDCHAR +STARTCHAR U+7E4A +ENCODING 32330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1098 +17F4 +6494 +1890 +1BFC +2550 +7D74 +1374 +3B58 +3578 +3194 +562C +1044 +0000 +ENDCHAR +STARTCHAR U+7E4B +ENCODING 32331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7F70 +3E54 +2A8C +3FF8 +2A90 +3E60 +7FB0 +0A4C +0EC0 +0170 +7F88 +0D30 +3108 +0000 +ENDCHAR +STARTCHAR U+7E4C +ENCODING 32332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +21FC +2354 +4924 +7954 +09FC +1088 +2104 +4440 +7EFE +1148 +3830 +5430 +11CE +0000 +0000 +ENDCHAR +STARTCHAR U+7E4D +ENCODING 32333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13F8 +1448 +67FC +2848 +1BF8 +2648 +7F58 +12E8 +3BF8 +36E8 +3758 +5258 +1448 +0000 +ENDCHAR +STARTCHAR U+7E4E +ENCODING 32334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +110A +3109 +21E8 +C93F +5AA8 +3268 +255C +48D4 +F996 +2B23 +2000 +A800 +AA92 +A292 +26DB +2449 +ENDCHAR +STARTCHAR U+7E50 +ENCODING 32336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3020 +23FF +C820 +59FE +3122 +21FE +4922 +F9FE +2824 +20FE +AB83 +A820 +A952 +2145 +223C +ENDCHAR +STARTCHAR U+7E51 +ENCODING 32337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +10FC +2010 +45FF +7C28 +107C +20C6 +457D +7DFF +1101 +557D +5545 +557D +1103 +0000 +0000 +ENDCHAR +STARTCHAR U+7E52 +ENCODING 32338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1018 +1044 +2482 +4701 +29FF +1111 +2555 +7F39 +13FF +1000 +54FE +5482 +54FE +5482 +50FE +1082 +ENDCHAR +STARTCHAR U+7E53 +ENCODING 32339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +20FE +4482 +7CFE +1000 +23FF +4520 +7DEF +1121 +55EA +5524 +57EA +1031 +0000 +0000 +ENDCHAR +STARTCHAR U+7E54 +ENCODING 32340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1130 +17E8 +66A8 +2AA0 +1BFC +2420 +7FA8 +12A8 +3B90 +3690 +37B4 +524C +1084 +0000 +ENDCHAR +STARTCHAR U+7E55 +ENCODING 32341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +09FC +0A20 +72F8 +1420 +0FFC +12A8 +7E70 +09FC +2C00 +2AF8 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7E56 +ENCODING 32342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +12A0 +12A0 +17E0 +6AA0 +2FFC +1848 +2BA8 +7EA8 +13A8 +3A90 +3790 +36A8 +52C8 +1284 +0000 +ENDCHAR +STARTCHAR U+7E57 +ENCODING 32343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +1054 +21FF +4438 +7C54 +1092 +2111 +4442 +7CFF +1132 +54D2 +54BF +5502 +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+7E58 +ENCODING 32344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +31FE +6044 +C428 +6FFF +1852 +3094 +6530 +FDFF +1529 +1149 +55FF +5549 +D549 +9179 +1103 +ENDCHAR +STARTCHAR U+7E59 +ENCODING 32345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +09E8 +0AA8 +7270 +17FC +0C70 +12A8 +7F24 +08F8 +2CA8 +2AF8 +2AA8 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+7E5A +ENCODING 32346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0BFC +7354 +1488 +0DFC +1288 +7EF8 +0888 +2CF8 +2AA8 +2AA4 +4924 +0860 +0000 +ENDCHAR +STARTCHAR U+7E5C +ENCODING 32348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +1044 +21FF +4428 +7CFE +10AA +20C6 +44BA +7C82 +10FE +5404 +55FF +5424 +100C +0000 +0000 +ENDCHAR +STARTCHAR U+7E5D +ENCODING 32349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +16A8 +67B8 +2AA8 +1BB8 +26E8 +7EA8 +12E8 +3AA8 +36E8 +36A8 +5368 +1208 +0000 +ENDCHAR +STARTCHAR U+7E5E +ENCODING 32350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +11F8 +1440 +67FC +2910 +1BB8 +2510 +7DFC +1300 +3BFC +34A0 +34A4 +5124 +121C +0000 +ENDCHAR +STARTCHAR U+7E5F +ENCODING 32351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +3129 +61EF +C400 +6CFE +1892 +3092 +64FE +FE92 +1292 +10FE +5410 +57FF +D210 +9010 +1010 +ENDCHAR +STARTCHAR U+7E60 +ENCODING 32352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0510 +0540 +0108 +00F8 +5111 +5414 +1111 +0F4F +0080 +0720 +00C4 +3FFE +0248 +0444 +0000 +0000 +ENDCHAR +STARTCHAR U+7E61 +ENCODING 32353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +2012 +49FF +2812 +10FE +2410 +7D55 +1555 +11D7 +5511 +55FF +5511 +55D7 +1155 +1255 +ENDCHAR +STARTCHAR U+7E62 +ENCODING 32354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +30FE +6092 +C4FE +6C10 +19FF +3000 +64FE +FC82 +14FE +1082 +54FE +5482 +D4FE +9044 +1183 +ENDCHAR +STARTCHAR U+7E63 +ENCODING 32355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +21FF +4412 +7CFE +10FE +2010 +45FF +7CFE +1092 +54FE +5492 +54FE +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+7E65 +ENCODING 32357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3010 +61FF +C410 +6CFE +1800 +30FE +6482 +FCFE +1444 +1028 +55FF +5400 +D4FE +9082 +10FE +ENDCHAR +STARTCHAR U+7E66 +ENCODING 32358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1778 +1148 +6948 +2F78 +1420 +2CF8 +7FA8 +15A8 +39F8 +3530 +3528 +51FC +1604 +0000 +ENDCHAR +STARTCHAR U+7E67 +ENCODING 32359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1440 +67FC +2B58 +1BF8 +2440 +7DF8 +1000 +3BFC +3450 +3488 +53F4 +1004 +0000 +ENDCHAR +STARTCHAR U+7E68 +ENCODING 32360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +227E +4508 +7CFF +1022 +237F +4508 +7E3E +1108 +557F +5508 +5508 +1280 +147F +0000 +0000 +ENDCHAR +STARTCHAR U+7E69 +ENCODING 32361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +16A8 +67B8 +29A0 +1AB8 +26A8 +7FB8 +12A8 +3AA8 +37B8 +36A4 +5084 +107C +0000 +ENDCHAR +STARTCHAR U+7E6A +ENCODING 32362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +14A0 +65F0 +2A08 +1BFC +2758 +7EE8 +13F8 +39F0 +3510 +35F0 +5110 +11F0 +0000 +ENDCHAR +STARTCHAR U+7E6B +ENCODING 32363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7F7C +0845 +7F47 +4980 +7FFE +4942 +7F24 +4918 +7F57 +04A4 +033E +7FC1 +0888 +1084 +2082 +ENDCHAR +STARTCHAR U+7E6D +ENCODING 32365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FF8 +2948 +2BF8 +3BD8 +25D8 +2BF8 +3F68 +2558 +2FF8 +3508 +2518 +0000 +ENDCHAR +STARTCHAR U+7E6E +ENCODING 32366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +37FF +2000 +C9FC +5924 +31FC +2124 +4FFF +F800 +29FC +2124 +A9FC +A924 +A9FC +2000 +27FF +ENDCHAR +STARTCHAR U+7E6F +ENCODING 32367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +30FE +60AA +C4AA +6CFE +1800 +31FF +6400 +FCFE +1482 +10FE +5429 +546A +D5CC +9066 +10C3 +ENDCHAR +STARTCHAR U+7E70 +ENCODING 32368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0A88 +72F8 +1400 +0DDC +1354 +7FDC +0820 +2DFC +2A70 +2AA8 +4924 +0820 +0000 +ENDCHAR +STARTCHAR U+7E72 +ENCODING 32370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +109F +21E9 +4A49 +7891 +13E2 +22A0 +4AAA +7BEF +12B2 +3AA2 +57EF +1222 +1222 +1222 +0000 +0000 +ENDCHAR +STARTCHAR U+7E73 +ENCODING 32371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +3108 +23C8 +C25F +53D2 +3272 +23D2 +491A +FBEA +290E +21E4 +A924 +AB2E +AA6A +265B +2CD1 +ENDCHAR +STARTCHAR U+7E74 +ENCODING 32372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1E10 +12FE +1E28 +10FE +1E10 +327C +5F10 +0250 +07C0 +0108 +1FFC +0490 +0888 +1084 +0000 +0000 +ENDCHAR +STARTCHAR U+7E75 +ENCODING 32373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +20FE +44BA +78AA +10BA +20FE +4400 +7EFE +1082 +38FE +54FE +1000 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+7E76 +ENCODING 32374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FE +2048 +4BFF +7800 +20FC +4884 +7CFC +1084 +38FC +5422 +1291 +1284 +147C +0000 +0000 +ENDCHAR +STARTCHAR U+7E77 +ENCODING 32375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +11FF +2129 +45FF +7D29 +11FF +21FF +4500 +7DFF +1100 +55FF +554A +5544 +106B +0000 +0000 +ENDCHAR +STARTCHAR U+7E78 +ENCODING 32376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1042 +3066 +2224 +CBFF +5910 +3021 +2053 +4812 +FB28 +294C +211A +A929 +A948 +AB18 +2280 +267F +ENDCHAR +STARTCHAR U+7E79 +ENCODING 32377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +16A8 +67F8 +2840 +1BF8 +2440 +7FFC +1110 +3FFC +3440 +37F8 +5040 +1040 +0000 +ENDCHAR +STARTCHAR U+7E7A +ENCODING 32378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +20E8 +452F +7C51 +1001 +21EA +4424 +7DEA +1031 +55E0 +5400 +54A5 +10A5 +1125 +0000 +0000 +ENDCHAR +STARTCHAR U+7E7B +ENCODING 32379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1440 +67FC +2B58 +1F58 +2440 +7FFC +1040 +3BF8 +36A8 +36A8 +52A8 +1218 +0000 +ENDCHAR +STARTCHAR U+7E7C +ENCODING 32380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +12D8 +1768 +66D0 +2AA8 +1BF8 +27FC +7ED8 +1368 +3A90 +3768 +37F8 +53FC +1200 +0000 +ENDCHAR +STARTCHAR U+7E7D +ENCODING 32381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +0B08 +73FC +14A8 +0D70 +1278 +7F88 +08F8 +2CF8 +2A88 +2AF8 +4888 +0B04 +0000 +ENDCHAR +STARTCHAR U+7E7E +ENCODING 32382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +307E +2252 +CB7E +5910 +30FF +2000 +487E +FB42 +297E +2140 +A97E +A942 +AB7E +2280 +267F +ENDCHAR +STARTCHAR U+7E7F +ENCODING 32383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +13D0 +1690 +67DC +2A60 +1BC0 +26B8 +7FC0 +1800 +37F8 +36A8 +32A8 +57FC +1000 +0000 +ENDCHAR +STARTCHAR U+7E80 +ENCODING 32384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20D5 +28B6 +4914 +7BFF +1D22 +1114 +297E +4908 +797E +1108 +39FF +5514 +1122 +1141 +0000 +0000 +ENDCHAR +STARTCHAR U+7E81 +ENCODING 32385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +31F0 +2020 +CFFF +5820 +31FC +2124 +49FC +F924 +29FC +2020 +ABFE +A820 +AFFF +2292 +2449 +ENDCHAR +STARTCHAR U+7E82 +ENCODING 32386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1FFC +2490 +4FE0 +0820 +0FE0 +0FE0 +0FE0 +7FFC +1690 +636C +3FF0 +0D60 +3118 +0000 +ENDCHAR +STARTCHAR U+7E83 +ENCODING 32387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +17FC +68A4 +2FF8 +12E8 +2AF8 +7DE4 +1110 +39F0 +3510 +35F0 +5210 +1410 +0000 +ENDCHAR +STARTCHAR U+7E86 +ENCODING 32390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +3124 +21FC +C924 +59FC +3020 +21FC +4820 +FBFE +2952 +2249 +A820 +ABFE +A820 +2020 +27FF +ENDCHAR +STARTCHAR U+7E87 +ENCODING 32391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +92FF +5410 +FE7E +1042 +5442 +927E +1042 +2042 +487E +D042 +2242 +FD7E +1024 +5466 +92C3 +ENDCHAR +STARTCHAR U+7E88 +ENCODING 32392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +117C +1510 +67D0 +2938 +1928 +27B8 +7C28 +13B8 +3AA8 +36B8 +37A8 +52A4 +1044 +0000 +ENDCHAR +STARTCHAR U+7E89 +ENCODING 32393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +13B8 +1510 +67FC +2910 +1AA8 +25F4 +7D10 +11F0 +39F0 +3510 +35F0 +5090 +1308 +0000 +ENDCHAR +STARTCHAR U+7E8A +ENCODING 32394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3010 +23FF +CA44 +5AFE +3244 +23FF +4A10 +FAFE +2A92 +22FE +AA92 +AA92 +AAFE +2444 +2183 +ENDCHAR +STARTCHAR U+7E8B +ENCODING 32395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1020 +20FC +44F4 +7CBC +13FF +2353 +4544 +7C7C +1020 +547C +54A8 +5410 +10EE +0000 +0000 +ENDCHAR +STARTCHAR U+7E8C +ENCODING 32396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +17FC +11F0 +67F8 +2AB8 +1B38 +27F8 +7FF0 +11F0 +39F0 +3510 +35F0 +5190 +1608 +0000 +ENDCHAR +STARTCHAR U+7E8D +ENCODING 32397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF0 +0910 +0FF0 +0910 +7FFE +5252 +7E7E +5252 +7E7E +0100 +0A20 +0442 +FFFF +0101 +1918 +710E +ENDCHAR +STARTCHAR U+7E8E +ENCODING 32398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1130 +17E8 +6928 +2FFC +1AA0 +2EE8 +7AA8 +16E8 +3AD0 +3E90 +33F4 +564C +1084 +0000 +ENDCHAR +STARTCHAR U+7E8F +ENCODING 32399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +13FC +16F8 +66A8 +2AF8 +1AA8 +26F8 +7EF8 +13FC +3AB4 +372C +36F8 +5220 +15FC +0000 +ENDCHAR +STARTCHAR U+7E90 +ENCODING 32400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +117C +1510 +67D0 +2AB8 +1A68 +24F8 +7EA8 +19B8 +35A8 +3578 +3268 +5424 +1044 +0000 +ENDCHAR +STARTCHAR U+7E91 +ENCODING 32401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +303E +2020 +CBFF +5A21 +32FC +2221 +4AFF +FA92 +2AFE +2292 +AAFE +AC00 +A9FE +2152 +23FF +ENDCHAR +STARTCHAR U+7E92 +ENCODING 32402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +16F8 +66A8 +2AF8 +1AA8 +26F8 +7EF8 +13FC +3AA8 +3774 +34F8 +5420 +1BFC +0000 +ENDCHAR +STARTCHAR U+7E93 +ENCODING 32403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +16A8 +67B8 +2BB8 +1AA8 +27B8 +7DA8 +1244 +3BFC +3490 +35E0 +5070 +1388 +0000 +ENDCHAR +STARTCHAR U+7E94 +ENCODING 32404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10F0 +1120 +17F8 +65F8 +29E4 +1938 +25E4 +7F5C +10F0 +3BF0 +3550 +35F8 +50A4 +171C +0000 +ENDCHAR +STARTCHAR U+7E95 +ENCODING 32405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +33FF +2000 +C9DC +5954 +31DC +2088 +49FE +F888 +29FE +2088 +ABFF +A848 +AB8A +20E4 +2383 +ENDCHAR +STARTCHAR U+7E96 +ENCODING 32406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +12A0 +12B0 +13A8 +6D68 +2FFC +1AA0 +2EE8 +7AA8 +16E8 +3AD0 +3E90 +33F4 +564C +1084 +0000 +ENDCHAR +STARTCHAR U+7E97 +ENCODING 32407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +21FE +4448 +7CFE +0988 +10FE +20FE +4488 +7CFE +11FF +5529 +55FF +5529 +1139 +0000 +0000 +ENDCHAR +STARTCHAR U+7E98 +ENCODING 32408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +12A8 +13FE +2488 +47FF +2954 +1155 +2A67 +7DFC +1504 +11FC +5504 +55FC +5504 +55FC +1104 +1202 +ENDCHAR +STARTCHAR U+7E99 +ENCODING 32409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1129 +21FF +444A +7C9F +1132 +21D2 +445F +7CB2 +11F2 +541F +5572 +5572 +101F +0000 +0000 +ENDCHAR +STARTCHAR U+7E9A +ENCODING 32410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13DF +3000 +23DF +CA51 +5AD5 +3020 +23FF +4A48 +FBFE +2A4A +23FE +AA88 +AAEE +AA88 +24E9 +2187 +ENDCHAR +STARTCHAR U+7E9B +ENCODING 32411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0FE0 +7FFC +0FE0 +7FFC +1FE0 +2EDC +2FF8 +2ED0 +2E28 +3FFC +2A58 +4994 +0000 +ENDCHAR +STARTCHAR U+7E9C +ENCODING 32412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +17BC +1540 +6FF8 +2FFC +1574 +2FFC +7DF0 +19F0 +35F0 +3510 +31F4 +50A4 +171C +0000 +ENDCHAR +STARTCHAR U+7E9D +ENCODING 32413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FC +3124 +21FC +C924 +5FFF +3555 +27DF +4555 +FFDF +2848 +2190 +A8A2 +AFFF +A821 +2124 +2326 +ENDCHAR +STARTCHAR U+7E9E +ENCODING 32414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1132 +3204 +22B5 +C902 +5AB5 +3387 +2132 +4902 +FBF7 +2D5A +2172 +A800 +A822 +A951 +2145 +223C +ENDCHAR +STARTCHAR U+7E9F +ENCODING 32415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +1000 +1200 +2400 +7C00 +0800 +1000 +2000 +7E00 +2000 +0000 +0E00 +7000 +2000 +0000 +ENDCHAR +STARTCHAR U+7EA0 +ENCODING 32416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1008 +2008 +2108 +4508 +FD08 +0908 +1108 +2108 +FD78 +4188 +0008 +1C08 +E008 +4008 +0008 +ENDCHAR +STARTCHAR U+7EA1 +ENCODING 32417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +10FC +1120 +2220 +7E20 +0824 +13FE +2020 +7E20 +2020 +0020 +0E20 +7020 +20A0 +0040 +ENDCHAR +STARTCHAR U+7EA2 +ENCODING 32418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +23FC +2020 +4420 +F820 +1020 +2020 +4020 +FC20 +4020 +0020 +1C20 +E024 +47FE +0000 +ENDCHAR +STARTCHAR U+7EA3 +ENCODING 32419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +1008 +1208 +2408 +7DFE +0808 +1008 +2088 +7E48 +2048 +0008 +0E08 +7008 +2028 +0010 +ENDCHAR +STARTCHAR U+7EA4 +ENCODING 32420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +081C +11E0 +1020 +2220 +7E20 +0824 +13FE +2020 +7E20 +0020 +0020 +1E20 +E020 +4020 +0020 +ENDCHAR +STARTCHAR U+7EA5 +ENCODING 32421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0880 +1084 +12FE +2500 +7C00 +09F8 +1008 +2010 +7E20 +2040 +0080 +0F02 +7102 +20FE +0000 +ENDCHAR +STARTCHAR U+7EA6 +ENCODING 32422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +2080 +2104 +45FE +FA04 +1404 +2084 +4064 +FC24 +0004 +0004 +1C04 +E044 +4028 +0010 +ENDCHAR +STARTCHAR U+7EA7 +ENCODING 32423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +2108 +2108 +4910 +F910 +113C +2184 +4188 +F948 +0250 +0220 +1A50 +E488 +490E +0204 +ENDCHAR +STARTCHAR U+7EA8 +ENCODING 32424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1040 +1248 +25FC +7C48 +0848 +1148 +20C8 +7E48 +20A8 +0088 +0E8A +710A +210A +0204 +ENDCHAR +STARTCHAR U+7EA9 +ENCODING 32425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0820 +1024 +13FE +2500 +7D00 +0900 +1100 +2100 +7D00 +2100 +0100 +0E00 +7200 +2400 +0800 +ENDCHAR +STARTCHAR U+7EAA +ENCODING 32426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +13FE +1004 +2404 +FC04 +0804 +11FC +2104 +FD00 +4100 +0100 +1D02 +E102 +40FE +0000 +ENDCHAR +STARTCHAR U+7EAB +ENCODING 32427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +23FE +2044 +4444 +F944 +1144 +2244 +4044 +FC44 +0084 +0084 +1C84 +E104 +4228 +0410 +ENDCHAR +STARTCHAR U+7EAC +ENCODING 32428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +2044 +27FE +4840 +F848 +17FC +2040 +4044 +FFFE +0044 +0044 +1C54 +E048 +4040 +0040 +ENDCHAR +STARTCHAR U+7EAD +ENCODING 32429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +11FC +1200 +2400 +7C04 +0BFE +1040 +2040 +7E40 +2080 +0080 +0E88 +7104 +21FC +0004 +ENDCHAR +STARTCHAR U+7EAF +ENCODING 32431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +2044 +27FE +4840 +FA48 +1248 +2248 +4248 +FBF8 +4248 +0040 +1842 +E042 +403E +0000 +ENDCHAR +STARTCHAR U+7EB0 +ENCODING 32432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0920 +0920 +1120 +1320 +2524 +7D2C +09F0 +1120 +2120 +7F20 +2120 +0120 +0F62 +71A2 +211E +0000 +ENDCHAR +STARTCHAR U+7EB1 +ENCODING 32433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +2040 +2040 +4950 +F948 +1246 +2242 +4448 +F848 +0050 +0020 +1840 +E080 +4300 +0C00 +ENDCHAR +STARTCHAR U+7EB2 +ENCODING 32434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +2204 +4A04 +4B0C +F28C +1254 +2224 +4224 +FA54 +428C +030C +1A04 +E204 +4214 +0208 +ENDCHAR +STARTCHAR U+7EB3 +ENCODING 32435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +2044 +23FE +4A44 +FA44 +1244 +2244 +42A4 +FA94 +0314 +0204 +1A04 +E204 +4214 +0208 +ENDCHAR +STARTCHAR U+7EB5 +ENCODING 32437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +2110 +2110 +4510 +F910 +1110 +2110 +4110 +FD10 +42A8 +02A8 +1C48 +E444 +4882 +1100 +ENDCHAR +STARTCHAR U+7EB6 +ENCODING 32438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +20A0 +2510 +7E0E +0404 +0900 +1110 +7D30 +01C0 +0100 +0D04 +7104 +20FC +0000 +ENDCHAR +STARTCHAR U+7EB7 +ENCODING 32439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +10A0 +20A0 +2090 +4890 +F908 +110E +2204 +45F8 +F888 +4088 +0088 +1908 +E108 +4228 +0410 +ENDCHAR +STARTCHAR U+7EB8 +ENCODING 32440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +103C +23E0 +2220 +4620 +FA20 +1228 +23FC +4220 +FE20 +0220 +0220 +1E10 +E292 +430A +0206 +ENDCHAR +STARTCHAR U+7EB9 +ENCODING 32441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +2040 +2004 +4FFE +FA08 +1110 +2110 +40A0 +FCA0 +0040 +00A0 +1CA0 +E110 +420E +0404 +ENDCHAR +STARTCHAR U+7EBA +ENCODING 32442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +2040 +2004 +47FE +FC80 +1088 +20FC +4088 +FC88 +4088 +0088 +1D08 +E108 +4250 +0420 +ENDCHAR +STARTCHAR U+7EBD +ENCODING 32445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +2108 +2108 +4908 +F908 +1108 +27F8 +4108 +F908 +0108 +0108 +1908 +E108 +47FE +0000 +ENDCHAR +STARTCHAR U+7EBE +ENCODING 32446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +09FC +1008 +1050 +2420 +7C10 +09FE +1022 +2024 +7E20 +2020 +0020 +0E20 +7020 +20A0 +0040 +ENDCHAR +STARTCHAR U+7EBF +ENCODING 32447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0850 +1048 +1040 +227C +7FC0 +0844 +107E +23C0 +7C48 +0050 +0020 +1C60 +E092 +430A +0006 +ENDCHAR +STARTCHAR U+7EC0 +ENCODING 32448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +0888 +1088 +1288 +27FE +7C88 +0888 +1088 +2088 +7EF8 +2088 +0088 +0E88 +7088 +20F8 +0088 +ENDCHAR +STARTCHAR U+7EC1 +ENCODING 32449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +1148 +2148 +2548 +4948 +FFFE +1148 +2148 +4148 +FD48 +4148 +0178 +1D00 +E100 +41FC +0000 +ENDCHAR +STARTCHAR U+7EC2 +ENCODING 32450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A0 +1090 +2090 +2484 +4FFE +F880 +1080 +21F8 +4108 +FD08 +4290 +0260 +1C20 +E450 +488E +1304 +ENDCHAR +STARTCHAR U+7EC3 +ENCODING 32451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +27FC +4080 +48A0 +FBF0 +1120 +2120 +4224 +FBFE +0020 +00A8 +3926 +C222 +44A0 +0040 +ENDCHAR +STARTCHAR U+7EC4 +ENCODING 32452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +21FC +2108 +4508 +F908 +11F8 +2108 +4108 +FD08 +41F8 +0108 +1D08 +E108 +47FE +0000 +ENDCHAR +STARTCHAR U+7EC5 +ENCODING 32453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +2024 +21FE +4524 +F924 +1124 +21FC +4124 +FD24 +0124 +01FC +1D24 +E020 +4020 +0020 +ENDCHAR +STARTCHAR U+7EC6 +ENCODING 32454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +21FE +2124 +4524 +F924 +1124 +2124 +41FC +FD24 +0124 +0124 +1D24 +E124 +41FC +0104 +ENDCHAR +STARTCHAR U+7EC7 +ENCODING 32455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +21FE +2104 +4504 +F904 +1104 +2104 +41FC +FD04 +4000 +0050 +1C48 +E084 +4102 +0202 +ENDCHAR +STARTCHAR U+7EC8 +ENCODING 32456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +20FC +2108 +4590 +FA50 +1020 +2050 +4088 +FD0E +0264 +0010 +1C08 +E0C0 +4030 +0008 +ENDCHAR +STARTCHAR U+7EC9 +ENCODING 32457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +20F8 +2508 +4A10 +F824 +13FE +2004 +4004 +FC04 +41FC +0004 +1C04 +E004 +43FC +0004 +ENDCHAR +STARTCHAR U+7ECA +ENCODING 32458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +2124 +20AC +44B0 +F828 +11FC +2020 +4020 +FC24 +03FE +0020 +1C20 +E020 +4020 +0020 +ENDCHAR +STARTCHAR U+7ECB +ENCODING 32459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1090 +2094 +27FE +4894 +F894 +13FC +2290 +4690 +FBFE +4092 +0092 +1C9A +E114 +4110 +0210 +ENDCHAR +STARTCHAR U+7ECC +ENCODING 32460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1124 +1124 +2524 +7D24 +09FC +1020 +2124 +7D24 +2124 +0124 +0D24 +71FC +2004 +0000 +ENDCHAR +STARTCHAR U+7ECD +ENCODING 32461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +2084 +2084 +4484 +F904 +1104 +2214 +4408 +FC04 +01FE +0104 +1D04 +E104 +41FC +0104 +ENDCHAR +STARTCHAR U+7ECE +ENCODING 32462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +2088 +2050 +4420 +F850 +108E +2324 +4020 +FDFC +0020 +0024 +1DFE +E020 +4020 +0020 +ENDCHAR +STARTCHAR U+7ECF +ENCODING 32463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FC +2008 +2010 +4430 +FC48 +0886 +1302 +2000 +41FC +FC20 +0020 +1C20 +E024 +47FE +0000 +ENDCHAR +STARTCHAR U+7ED0 +ENCODING 32464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +2040 +2040 +4888 +F904 +13FE +2002 +4000 +FDFC +4104 +0104 +1D04 +E104 +41FC +0104 +ENDCHAR +STARTCHAR U+7ED1 +ENCODING 32465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +113E +2122 +27E4 +4924 +F128 +27E4 +4124 +F922 +47E2 +0122 +1934 +E228 +4220 +0420 +0020 +ENDCHAR +STARTCHAR U+7ED2 +ENCODING 32466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1030 +2028 +27FE +4420 +F924 +1124 +2128 +47E8 +F928 +0130 +0120 +1A50 +E292 +450A +0006 +ENDCHAR +STARTCHAR U+7ED3 +ENCODING 32467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1024 +23FE +4420 +7820 +09FC +1000 +2004 +7DFE +0104 +0104 +0D04 +7104 +21FC +0104 +ENDCHAR +STARTCHAR U+7ED4 +ENCODING 32468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +27FE +24A0 +48A0 +F910 +13F8 +2406 +43FC +FD00 +41F8 +0008 +1C08 +E088 +4050 +0020 +ENDCHAR +STARTCHAR U+7ED5 +ENCODING 32469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +2088 +20FC +4780 +F850 +1022 +20D2 +470E +F808 +07FC +0120 +1920 +E122 +4222 +0C1E +ENDCHAR +STARTCHAR U+7ED7 +ENCODING 32471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1088 +217C +2500 +7FFF +F884 +11FE +2308 +4508 +F908 +4108 +0108 +1D08 +E108 +4128 +0110 +ENDCHAR +STARTCHAR U+7ED8 +ENCODING 32472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +20A0 +20A0 +4910 +FA0E +15F4 +2000 +4008 +FBFC +0040 +0040 +1890 +E108 +43FC +0004 +ENDCHAR +STARTCHAR U+7ED9 +ENCODING 32473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +20A0 +20A0 +4910 +FA0E +1404 +23F8 +4000 +F808 +43FC +0208 +1A08 +E208 +43F8 +0208 +ENDCHAR +STARTCHAR U+7EDA +ENCODING 32474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +2084 +20FE +4504 +FA04 +11F4 +2114 +4114 +FDF4 +0114 +0114 +1DF4 +E004 +4014 +0008 +ENDCHAR +STARTCHAR U+7EDB +ENCODING 32475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +11F8 +2310 +24A0 +4040 +F8A0 +1158 +2646 +43F8 +FA40 +4248 +07FC +1840 +E040 +4040 +0040 +ENDCHAR +STARTCHAR U+7EDC +ENCODING 32476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +20FC +2104 +4A88 +F850 +1020 +2050 +418E +FBFC +0504 +0104 +1904 +E104 +41FC +0104 +ENDCHAR +STARTCHAR U+7EDD +ENCODING 32477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1078 +2090 +4524 +FFFE +0924 +1124 +2124 +FDFC +4104 +0100 +1D00 +E102 +4102 +00FE +ENDCHAR +STARTCHAR U+7EDE +ENCODING 32478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +2024 +23FE +4400 +F888 +1106 +2202 +4088 +FC50 +0020 +0050 +1C50 +E088 +4106 +0204 +ENDCHAR +STARTCHAR U+7EDF +ENCODING 32479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +2048 +27FC +4880 +F910 +1208 +27FC +4124 +F920 +4120 +0120 +1A22 +E222 +441E +0800 +ENDCHAR +STARTCHAR U+7EE0 +ENCODING 32480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +2040 +23F8 +4A48 +FA48 +13F8 +2248 +4248 +FBF8 +4240 +0140 +1880 +E160 +421E +0404 +ENDCHAR +STARTCHAR U+7EE1 +ENCODING 32481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0924 +10A8 +10B0 +2424 +7DFE +0904 +1104 +21FC +7F04 +2104 +01FC +0F04 +7104 +2114 +0108 +ENDCHAR +STARTCHAR U+7EE2 +ENCODING 32482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +09FE +1104 +2104 +45FC +FC00 +09FC +1104 +2104 +FDFC +4104 +0104 +1DFC +E104 +4114 +0108 +ENDCHAR +STARTCHAR U+7EE3 +ENCODING 32483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1018 +13E0 +2040 +2048 +4FFC +F8E0 +1150 +224E +45F8 +F888 +0090 +009C +1904 +E104 +4228 +0410 +ENDCHAR +STARTCHAR U+7EE5 +ENCODING 32485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +17E0 +2000 +2248 +4150 +F820 +1084 +2FFE +4108 +F908 +4210 +0110 +18A0 +E040 +41B0 +0608 +ENDCHAR +STARTCHAR U+7EE6 +ENCODING 32486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +21F8 +2310 +4CA0 +F840 +10A0 +2110 +464E +F844 +47FC +0040 +1950 +E24C +4544 +0080 +ENDCHAR +STARTCHAR U+7EE7 +ENCODING 32487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1220 +2220 +2324 +4AAC +FA70 +1220 +23FC +4220 +FA70 +42AC +0324 +1A20 +E224 +43FE +0000 +ENDCHAR +STARTCHAR U+7EE8 +ENCODING 32488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1110 +20A0 +27F8 +4848 +F848 +13F8 +2240 +4244 +FBFE +40C4 +04C4 +1954 +E248 +4440 +0840 +ENDCHAR +STARTCHAR U+7EE9 +ENCODING 32489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +27FC +2040 +49F0 +F840 +17FE +2008 +43FC +FA08 +0248 +0248 +1A48 +E090 +410C +0604 +ENDCHAR +STARTCHAR U+7EEA +ENCODING 32490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +23F8 +2050 +4860 +F844 +17FE +2108 +43FC +FD08 +0908 +01F8 +1D08 +E108 +41F8 +0108 +ENDCHAR +STARTCHAR U+7EEB +ENCODING 32491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1028 +21FC +2420 +4824 +FBFE +1088 +2146 +427A +FC88 +4090 +0150 +1C20 +E050 +418E +0604 +ENDCHAR +STARTCHAR U+7EED +ENCODING 32493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +23F8 +2040 +4840 +FFFC +1124 +20A8 +4220 +F924 +07FE +0040 +1C60 +E090 +410C +0204 +ENDCHAR +STARTCHAR U+7EEE +ENCODING 32494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +27FC +2040 +48B0 +F914 +17FE +2008 +43C8 +FA48 +4248 +0248 +1BC8 +E208 +4028 +0010 +ENDCHAR +STARTCHAR U+7EEF +ENCODING 32495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +1050 +2054 +23DE +4850 +F850 +1054 +23DE +4050 +FC50 +4054 +03DE +1C50 +E050 +4050 +0050 +ENDCHAR +STARTCHAR U+7EF0 +ENCODING 32496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +107C +2040 +2048 +4BFC +FA08 +13F8 +2208 +43F8 +F840 +4044 +07FE +1840 +E040 +4040 +0040 +ENDCHAR +STARTCHAR U+7EF1 +ENCODING 32497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +2148 +2150 +4844 +FFFE +1404 +2404 +45F4 +FD14 +4514 +0514 +1DF4 +E404 +4414 +0408 +ENDCHAR +STARTCHAR U+7EF2 +ENCODING 32498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +09FE +1104 +1304 +25FC +7D04 +0904 +11FC +2010 +7D12 +2116 +01D8 +0D10 +7152 +2192 +010E +ENDCHAR +STARTCHAR U+7EF3 +ENCODING 32499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +2208 +2208 +4BF8 +F844 +17FE +2444 +4444 +FFFC +4444 +0444 +1FFC +E440 +4042 +003E +ENDCHAR +STARTCHAR U+7EF4 +ENCODING 32500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10A0 +2094 +21FE +4910 +FB10 +15FC +2110 +4110 +FDFC +0110 +0110 +1D14 +E1FE +4100 +0100 +ENDCHAR +STARTCHAR U+7EF5 +ENCODING 32501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1088 +23FC +2208 +4BF8 +FA08 +13F8 +2044 +47FE +FC44 +0444 +0444 +1C54 +E448 +4040 +0040 +ENDCHAR +STARTCHAR U+7EF6 +ENCODING 32502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +17E0 +2000 +2248 +4150 +F7FE +1402 +2804 +41F0 +FC10 +4110 +00A0 +1C40 +E0A0 +411E +0604 +ENDCHAR +STARTCHAR U+7EF7 +ENCODING 32503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17BE +24A4 +24A4 +44A4 +FFBC +14A4 +24A4 +44A4 +FFBC +44A4 +04A4 +1CA4 +E4C4 +4A94 +1108 +ENDCHAR +STARTCHAR U+7EF8 +ENCODING 32504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +2444 +2444 +4DF4 +FC44 +1444 +25F4 +4404 +FDF4 +0514 +0514 +1D14 +E5F4 +4814 +1008 +ENDCHAR +STARTCHAR U+7EFA +ENCODING 32506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +21D0 +2558 +4A56 +FB52 +1490 +2150 +423E +FC08 +41FC +0108 +1D08 +E108 +41F8 +0108 +ENDCHAR +STARTCHAR U+7EFB +ENCODING 32507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +2150 +2040 +47FC +F840 +1FFE +20A0 +4110 +FBFE +4514 +0110 +1D50 +E124 +4104 +00FC +ENDCHAR +STARTCHAR U+7EFC +ENCODING 32508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +23FE +2202 +4404 +F9FC +1000 +2004 +43FE +F820 +00A8 +0124 +1922 +E222 +40A0 +0040 +ENDCHAR +STARTCHAR U+7EFD +ENCODING 32509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +23FE +2202 +4404 +F800 +13FE +2020 +40A8 +FCBC +40A0 +0120 +1DA0 +E266 +441C +0000 +ENDCHAR +STARTCHAR U+7EFE +ENCODING 32510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1040 +2440 +27FE +4C02 +F3F8 +1208 +2208 +43F8 +FE00 +43FC +0204 +1E04 +E204 +43FC +0204 +ENDCHAR +STARTCHAR U+7EFF +ENCODING 32511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +2008 +21F8 +4408 +FFFE +1040 +2244 +414C +F950 +00E0 +0150 +1A48 +E44E +4144 +0080 +ENDCHAR +STARTCHAR U+7F00 +ENCODING 32512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17BC +24A4 +22A8 +4110 +FAA8 +12A6 +2440 +47BC +FCA4 +04A4 +02A8 +1910 +E2A8 +4446 +0804 +ENDCHAR +STARTCHAR U+7F01 +ENCODING 32513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +1124 +2248 +2490 +4A48 +F924 +1124 +2004 +47FE +FC44 +4444 +07FC +1C44 +E444 +47FC +0404 +ENDCHAR +STARTCHAR U+7F02 +ENCODING 32514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1114 +2FFE +2110 +49F0 +F840 +13F8 +2248 +4248 +FBF8 +4040 +07FE +1840 +E040 +4040 +0040 +ENDCHAR +STARTCHAR U+7F03 +ENCODING 32515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1104 +213E +2124 +4FE4 +F924 +133C +23A4 +4564 +FD24 +493C +0124 +1D24 +E124 +413C +0124 +ENDCHAR +STARTCHAR U+7F04 +ENCODING 32516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1018 +2014 +27FE +4410 +FC10 +15D0 +2414 +45D4 +FD54 +4554 +0558 +1DD0 +E52A +4846 +1082 +ENDCHAR +STARTCHAR U+7F05 +ENCODING 32517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +2040 +2084 +4BFE +FA94 +1294 +22F4 +4294 +FA94 +02F4 +0294 +1A94 +E294 +43FC +0204 +ENDCHAR +STARTCHAR U+7F06 +ENCODING 32518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1290 +229E +22A8 +42C4 +FE84 +0888 +13FC +2208 +FE48 +0248 +0268 +1CA0 +E0A2 +4122 +0E1E +ENDCHAR +STARTCHAR U+7F07 +ENCODING 32519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13F8 +1208 +2208 +23F8 +4A08 +FA08 +13F8 +2000 +47FE +F840 +0248 +027C +1A40 +E340 +44C6 +183C +ENDCHAR +STARTCHAR U+7F08 +ENCODING 32520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +27D0 +2490 +4CB8 +FCB6 +17D2 +2490 +4494 +FF94 +4498 +0488 +1C90 +E7A0 +4440 +0180 +ENDCHAR +STARTCHAR U+7F09 +ENCODING 32521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +2108 +2108 +49F8 +F804 +17FE +2108 +41F8 +F908 +01F8 +0108 +1908 +E7FE +4008 +0008 +ENDCHAR +STARTCHAR U+7F0B +ENCODING 32523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +23FC +2248 +4BF8 +F840 +17FE +2000 +43F8 +FA08 +4248 +0248 +1A88 +E0B0 +410C +0604 +ENDCHAR +STARTCHAR U+7F0C +ENCODING 32524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +23FC +2248 +4A48 +FBF8 +1248 +2248 +43F8 +F880 +4140 +0524 +1D02 +E50A +48F8 +0000 +ENDCHAR +STARTCHAR U+7F0D +ENCODING 32525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1018 +13E0 +2044 +2FFE +4950 +F950 +1150 +27FC +4150 +F950 +4154 +07FE +1840 +E048 +47FC +0000 +ENDCHAR +STARTCHAR U+7F0E +ENCODING 32526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2188 +267C +2448 +4448 +4F48 +F448 +2486 +4700 +45FC +FC88 +0450 +0F20 +3450 +C488 +050E +0604 +ENDCHAR +STARTCHAR U+7F0F +ENCODING 32527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +13FE +2220 +25FC +4D24 +F524 +15FC +2524 +4524 +FDFC +44A0 +04A0 +1C40 +E460 +4498 +0706 +ENDCHAR +STARTCHAR U+7F11 +ENCODING 32529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +117C +2108 +2208 +4BFE +F640 +1A48 +22FC +4320 +FA24 +43FE +0220 +1A20 +E250 +428E +0304 +ENDCHAR +STARTCHAR U+7F12 +ENCODING 32530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1448 +22FC +2288 +4888 +F888 +16F8 +2280 +42F8 +FA88 +4288 +0288 +1AF8 +E500 +4886 +007C +ENDCHAR +STARTCHAR U+7F13 +ENCODING 32531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +13F0 +2248 +2150 +4420 +FBFC +1040 +27FE +4080 +FCFC +0188 +0150 +1A20 +E450 +498E +0204 +ENDCHAR +STARTCHAR U+7F14 +ENCODING 32532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1048 +27FC +2110 +48A0 +FFFE +1442 +2844 +43F8 +FA48 +4248 +0248 +1A48 +E258 +4040 +0040 +ENDCHAR +STARTCHAR U+7F15 +ENCODING 32533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +2150 +2040 +47FE +F950 +124C +2444 +4080 +FFFE +0108 +0208 +19B0 +E040 +41B0 +0608 +ENDCHAR +STARTCHAR U+7F16 +ENCODING 32534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1048 +23FC +2208 +4A08 +FBF8 +1200 +2204 +43FE +F694 +4A94 +03FC +1A94 +E294 +4294 +020C +ENDCHAR +STARTCHAR U+7F17 +ENCODING 32535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +2208 +27F8 +4A40 +FBFC +1220 +2292 +430E +FDF8 +4108 +0108 +1DF8 +E108 +4108 +01F8 +ENDCHAR +STARTCHAR U+7F18 +ENCODING 32536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10F8 +2108 +23F0 +4814 +FFFE +1080 +2188 +4250 +FCE0 +0160 +0250 +1CC8 +E14E +4644 +00C0 +ENDCHAR +STARTCHAR U+7F19 +ENCODING 32537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +2090 +2294 +4998 +F890 +17FE +2008 +41FC +FD08 +4108 +01F8 +1D08 +E108 +41F8 +0108 +ENDCHAR +STARTCHAR U+7F1A +ENCODING 32538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +1048 +27FC +2040 +43F8 +FA48 +13F8 +2248 +43F8 +FA48 +4010 +07FE +1A10 +E110 +4010 +0020 +ENDCHAR +STARTCHAR U+7F1B +ENCODING 32539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +2400 +25F8 +4C00 +F7FE +1548 +2530 +458E +FC10 +47FE +0490 +1C50 +E410 +4850 +0020 +ENDCHAR +STARTCHAR U+7F1C +ENCODING 32540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +27FC +2040 +4BF8 +FA08 +13F8 +2208 +43F8 +FA08 +43F8 +0208 +1FFE +E110 +420C +0404 +ENDCHAR +STARTCHAR U+7F1D +ENCODING 32541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +107C +2488 +2350 +4A20 +F8D8 +1726 +22F8 +4220 +FAF8 +4220 +03FC +1A20 +E220 +4526 +08FC +ENDCHAR +STARTCHAR U+7F1F +ENCODING 32543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +27FE +2000 +49F8 +F908 +11F8 +2004 +43FE +FA04 +42F4 +0294 +1A94 +E2F4 +4214 +0208 +ENDCHAR +STARTCHAR U+7F20 +ENCODING 32544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +27FE +2400 +4DFC +F524 +2524 +45FC +FD24 +0524 +05FC +1C20 +E5FC +4820 +13FE +2000 +ENDCHAR +STARTCHAR U+7F21 +ENCODING 32545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1044 +2FFE +2110 +4AA8 +FA48 +12A8 +23F8 +4044 +FFFE +4444 +0494 +1DF4 +E404 +4414 +0408 +ENDCHAR +STARTCHAR U+7F22 +ENCODING 32546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1208 +2110 +2000 +4BFC +F800 +1110 +2208 +4404 +FBF8 +42A8 +02A8 +1AA8 +E2A8 +4FFE +0000 +ENDCHAR +STARTCHAR U+7F23 +ENCODING 32547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +10A4 +2FFE +20A0 +4BF8 +F8A8 +17FE +20A8 +40A8 +FBF8 +40A0 +01B0 +1AA8 +E4AE +48A4 +00A0 +ENDCHAR +STARTCHAR U+7F24 +ENCODING 32548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +27FE +2402 +4834 +F9C0 +1108 +21FC +4110 +F910 +4114 +07FE +1800 +E110 +420C +0404 +ENDCHAR +STARTCHAR U+7F25 +ENCODING 32549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +20A0 +28A4 +4FFE +F4A4 +14A4 +27FC +4000 +FBF8 +4000 +0FFE +1950 +E24C +4544 +0080 +ENDCHAR +STARTCHAR U+7F26 +ENCODING 32550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13F8 +1208 +23F8 +2208 +4BF8 +F800 +17FC +24A4 +47FC +F800 +43F8 +0208 +19B0 +E040 +43B0 +0C0E +ENDCHAR +STARTCHAR U+7F27 +ENCODING 32551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +2444 +2FFC +5444 +F7FC +1484 +2110 +43E0 +F840 +4088 +07FC +1950 +E24C +4544 +0080 +ENDCHAR +STARTCHAR U+7F28 +ENCODING 32552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +17BC +24A4 +25AC +45AC +FEB4 +1318 +24A4 +4080 +FFFE +0090 +0110 +1CA0 +E040 +41B0 +0608 +ENDCHAR +STARTCHAR U+7F29 +ENCODING 32553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2020 +27FE +4402 +4904 +F1FE +1220 +2644 +4AFE +FA84 +4284 +02FC +1A84 +E284 +42FC +0284 +ENDCHAR +STARTCHAR U+7F2A +ENCODING 32554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17BE +24A4 +2294 +4A94 +F4A4 +1050 +2088 +4124 +FA42 +4590 +0060 +1988 +E030 +40C0 +0700 +ENDCHAR +STARTCHAR U+7F2B +ENCODING 32555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +1248 +2490 +2248 +4A48 +F7FC +1444 +27FC +4444 +F7FC +4040 +0FFE +18E0 +E150 +464E +0040 +ENDCHAR +STARTCHAR U+7F2C +ENCODING 32556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +12FE +2210 +2FA4 +427E +FA44 +1754 +2054 +4754 +FD54 +4554 +0554 +1D54 +E728 +4026 +00C2 +ENDCHAR +STARTCHAR U+7F2D +ENCODING 32557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +2FFE +20A0 +4AA8 +F910 +13FE +220C +43F8 +FA08 +43F8 +0150 +1A4C +E444 +4140 +0080 +ENDCHAR +STARTCHAR U+7F2E +ENCODING 32558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1110 +27FC +2040 +4BF8 +F840 +17FC +2248 +4150 +FFFE +4008 +03FC +1A08 +E208 +43F8 +0208 +ENDCHAR +STARTCHAR U+7F2F +ENCODING 32559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1110 +27FC +2444 +4D54 +FC44 +17FC +2404 +43F8 +FA08 +4208 +03F8 +1A08 +E208 +43F8 +0208 +ENDCHAR +STARTCHAR U+7F30 +ENCODING 32560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1FFE +2000 +27FC +4C44 +FFFC +1444 +27FC +4000 +FFFE +4444 +07FC +1C44 +E7FC +4000 +0FFE +ENDCHAR +STARTCHAR U+7F31 +ENCODING 32561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +11FE +2524 +23FC +4A20 +F9FE +1000 +2EF8 +4288 +FAF8 +4280 +02F8 +1A88 +E5F8 +4886 +007C +ENDCHAR +STARTCHAR U+7F32 +ENCODING 32562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11F8 +2110 +2510 +49F0 +F800 +17BC +24A4 +44A4 +FFBC +4040 +07FE +18E0 +E150 +464E +0040 +ENDCHAR +STARTCHAR U+7F33 +ENCODING 32563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +13FC +22A8 +26A8 +4BF8 +F804 +17FE +2000 +43F8 +FA08 +43F8 +0144 +1B48 +E530 +498E +0104 +ENDCHAR +STARTCHAR U+7F34 +ENCODING 32564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2490 +2FD0 +4894 +4FBE +F8C4 +1FA4 +2228 +5FE8 +8428 +F790 +0490 +34A8 +C8A8 +49C6 +1084 +ENDCHAR +STARTCHAR U+7F35 +ENCODING 32565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1528 +27BC +2948 +47BE +FB18 +152A +294E +43F8 +FA08 +4248 +0248 +1A48 +E0B0 +410C +0604 +ENDCHAR +STARTCHAR U+7F36 +ENCODING 32566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +0800 +1FF8 +1100 +2100 +7FFC +0100 +1110 +1110 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7F38 +ENCODING 32568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11FC +1E20 +2820 +4820 +7F20 +0820 +2A20 +2A20 +2A20 +2A20 +3E20 +23FC +2000 +0000 +ENDCHAR +STARTCHAR U+7F39 +ENCODING 32569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0804 +1FFE +2080 +0082 +7FFF +0080 +1084 +1084 +1FFC +0000 +1222 +2111 +4111 +0000 +0000 +ENDCHAR +STARTCHAR U+7F3A +ENCODING 32570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +1E20 +28F8 +4828 +7F28 +0828 +2BFC +2A20 +2A60 +2A50 +3E90 +2308 +2204 +0000 +ENDCHAR +STARTCHAR U+7F3B +ENCODING 32571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +7C40 +D040 +1040 +10FC +FE84 +1084 +10A4 +54B4 +5494 +5584 +5504 +7D75 +01C5 +0703 +ENDCHAR +STARTCHAR U+7F3C +ENCODING 32572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +7E40 +D0FF +1081 +1193 +FF12 +1010 +1010 +5238 +5228 +5228 +526C +7E44 +00C6 +0183 +ENDCHAR +STARTCHAR U+7F3D +ENCODING 32573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +7C20 +D020 +13FE +10A8 +FCA8 +10A8 +10A8 +55AC +5524 +5726 +54FB +7C20 +0020 +0020 +ENDCHAR +STARTCHAR U+7F3E +ENCODING 32574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +20C6 +7C44 +D1FF +1044 +1044 +FE44 +1044 +13FF +5444 +5444 +5444 +54C4 +7C84 +0184 +0104 +ENDCHAR +STARTCHAR U+7F3F +ENCODING 32575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +201C +7DF0 +D100 +1100 +11FF +FD00 +1100 +1100 +557E +5542 +5542 +5542 +7D42 +0342 +067E +ENDCHAR +STARTCHAR U+7F42 +ENCODING 32578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3EF8 +2288 +2AA8 +2AA8 +2AA8 +1450 +2288 +0820 +0FF0 +1100 +0104 +FFFE +0100 +1110 +1110 +1FF0 +ENDCHAR +STARTCHAR U+7F43 +ENCODING 32579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2952 +2A54 +1428 +2244 +0000 +7FFE +4002 +5002 +1FF8 +2100 +0100 +FFFF +0100 +2104 +3FFC +ENDCHAR +STARTCHAR U+7F44 +ENCODING 32580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0878 +7F48 +084E +3E80 +0078 +7F48 +4930 +7F48 +4486 +4FF0 +9100 +0104 +FFFE +0100 +1110 +1FF0 +ENDCHAR +STARTCHAR U+7F45 +ENCODING 32581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1078 +11FC +3F58 +29E8 +4938 +7F18 +09E8 +2DA8 +2D70 +2DFC +3E20 +2620 +2460 +0000 +ENDCHAR +STARTCHAR U+7F47 +ENCODING 32583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4084 +4048 +FBFF +A050 +21FE +2152 +FD9E +2102 +21FE +A902 +A9FE +A804 +ABFF +F884 +0044 +001C +ENDCHAR +STARTCHAR U+7F48 +ENCODING 32584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +4050 +7BFE +A252 +23FE +21FC +F904 +21FC +A904 +A9FC +A820 +FBFE +8820 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+7F4A +ENCODING 32586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083C +7F25 +3E47 +3E00 +2A7C +3E28 +7F10 +496F +7F00 +07FC +0880 +7FFF +1084 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7F4B +ENCODING 32587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +1148 +3EFE +097E +3F48 +047E +0848 +187E +0FFC +0840 +17FC +2844 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7F4C +ENCODING 32588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +3EF8 +1450 +668C +0FF0 +1100 +7FFC +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7F4D +ENCODING 32589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0920 +0FE0 +0FE0 +3EF8 +3EF8 +2AA8 +3EF8 +0FE0 +7FFC +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7F4E +ENCODING 32590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11F0 +1110 +11F0 +3FF0 +2BF8 +4840 +7FFC +0B78 +2DD8 +2CF0 +2FFC +3C90 +24F8 +2308 +0000 +ENDCHAR +STARTCHAR U+7F4F +ENCODING 32591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +403E +F820 +A3FF +2221 +22FC +FE21 +22FF +2292 +AAFE +AA92 +AAFE +AC00 +F9FE +014A +03FF +ENDCHAR +STARTCHAR U+7F50 +ENCODING 32592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +13FC +1090 +3FF8 +2968 +49F8 +7E90 +09FC +2F20 +2DF8 +2DF8 +3D20 +25FC +2100 +0000 +ENDCHAR +STARTCHAR U+7F51 +ENCODING 32593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +4448 +4448 +4448 +6648 +5548 +4888 +4CC8 +4CC8 +5328 +5128 +6208 +4018 +0000 +ENDCHAR +STARTCHAR U+7F52 +ENCODING 32594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +7FFE +4442 +4442 +4442 +4442 +4442 +4442 +4442 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+7F53 +ENCODING 32595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +7FFE +4002 +4C32 +4762 +41C2 +4362 +4E32 +581A +4002 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+7F54 +ENCODING 32596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +2248 +2288 +3FF8 +2108 +27E8 +2408 +2408 +2408 +23C8 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+7F55 +ENCODING 32597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2488 +4488 +0878 +1000 +1FF0 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7F57 +ENCODING 32599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4444 +4444 +4444 +7FFC +4204 +0200 +07F0 +0810 +1420 +62C0 +0100 +0600 +1800 +E000 +ENDCHAR +STARTCHAR U+7F58 +ENCODING 32600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +2448 +3FF8 +0000 +7FFC +0080 +0180 +0760 +1918 +6104 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7F5A +ENCODING 32602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4444 +4444 +7FFC +2000 +1808 +0888 +0088 +F088 +1088 +1288 +1488 +1808 +1028 +0010 +ENDCHAR +STARTCHAR U+7F5B +ENCODING 32603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +7FFE +0000 +00FC +3F88 +2008 +2108 +2108 +2128 +212C +61F4 +4F16 +C003 +ENDCHAR +STARTCHAR U+7F5C +ENCODING 32604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +7FFE +0200 +0100 +7FFE +0100 +0100 +0100 +3FFC +0100 +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+7F5D +ENCODING 32605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +7FFE +0000 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +1FF8 +1008 +1008 +FFFF +ENDCHAR +STARTCHAR U+7F5E +ENCODING 32606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +3FFE +0000 +0FF8 +0010 +00A0 +0040 +7FFF +0242 +0444 +0840 +3140 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7F5F +ENCODING 32607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +2448 +3FF8 +2108 +0100 +7FFC +0100 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+7F60 +ENCODING 32608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0000 +1FF0 +1010 +1FF0 +1100 +1FF8 +1080 +1044 +1F34 +700C +0000 +ENDCHAR +STARTCHAR U+7F61 +ENCODING 32609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2448 +2448 +2448 +3FF8 +0000 +3FFC +0100 +1110 +11F8 +1100 +1100 +1104 +FFFE +0000 +ENDCHAR +STARTCHAR U+7F62 +ENCODING 32610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2448 +2448 +3FF8 +0100 +0110 +3FF8 +0100 +0104 +FFFE +0200 +0420 +0810 +1FF8 +0008 +ENDCHAR +STARTCHAR U+7F63 +ENCODING 32611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +7FFE +0100 +0100 +3FFC +0100 +FFFF +0100 +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+7F64 +ENCODING 32612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +7FFE +0810 +0420 +7FFC +0104 +7FFC +4100 +7FFE +0502 +1D02 +F106 +011C +ENDCHAR +STARTCHAR U+7F65 +ENCODING 32613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4442 +4442 +7FFE +0000 +1FF8 +1008 +1FF8 +0000 +3FFC +2004 +3FFC +2004 +3FFC +2004 +201C +ENDCHAR +STARTCHAR U+7F66 +ENCODING 32614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +7FFE +0000 +7FFE +1108 +0890 +3FF8 +0020 +00C0 +FFFF +0100 +0100 +0700 +ENDCHAR +STARTCHAR U+7F67 +ENCODING 32615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +2448 +3FF8 +0820 +0820 +7FFC +1C70 +1A70 +2AA8 +4924 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+7F68 +ENCODING 32616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0200 +7FFC +0920 +1FF0 +692C +0FE0 +0920 +0FE8 +0908 +00F8 +0000 +ENDCHAR +STARTCHAR U+7F69 +ENCODING 32617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0100 +01F8 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7F6A +ENCODING 32618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +2448 +3FF8 +0240 +3E78 +0240 +3E78 +0240 +1C7C +6440 +0840 +1040 +0000 +ENDCHAR +STARTCHAR U+7F6B +ENCODING 32619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0420 +3F20 +0430 +7FA8 +0424 +3F24 +0420 +07A0 +7820 +0020 +0000 +ENDCHAR +STARTCHAR U+7F6C +ENCODING 32620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +2222 +3FFE +0000 +3E3E +1414 +0808 +3636 +0000 +3E3E +1414 +0808 +3636 +0000 +0000 +ENDCHAR +STARTCHAR U+7F6D +ENCODING 32621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4442 +4442 +7FFE +0008 +0044 +FFFF +0040 +7E64 +422C +4238 +7E11 +0039 +1E6F +F1C2 +ENDCHAR +STARTCHAR U+7F6E +ENCODING 32622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0080 +7FFC +07E0 +2420 +27E0 +27E0 +2420 +27E0 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+7F70 +ENCODING 32624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0000 +1E48 +7FC8 +0048 +1E48 +1E48 +3F48 +2148 +3F08 +2118 +0000 +ENDCHAR +STARTCHAR U+7F71 +ENCODING 32625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4444 +4444 +7FFC +0100 +FFFE +0108 +3FFC +2448 +2FE8 +2108 +3FF8 +2108 +2128 +2010 +ENDCHAR +STARTCHAR U+7F72 +ENCODING 32626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0110 +1FE0 +0140 +7FFC +07E0 +1C20 +67E0 +0420 +07E0 +0420 +0000 +ENDCHAR +STARTCHAR U+7F73 +ENCODING 32627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +3FFE +0000 +1FFC +1084 +1FFC +1084 +1FFC +0000 +0104 +2882 +2809 +4FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+7F74 +ENCODING 32628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4444 +4444 +7FFC +0100 +3FF8 +0100 +FFFE +0200 +0420 +1FF0 +0000 +2488 +2244 +4244 +ENDCHAR +STARTCHAR U+7F75 +ENCODING 32629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0FF8 +0880 +0FF0 +0880 +0FF0 +0880 +0FFC +2924 +2494 +4038 +0000 +ENDCHAR +STARTCHAR U+7F76 +ENCODING 32630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +3FFE +0000 +0100 +7E7E +2022 +2242 +7D9C +1FFC +1084 +1FFC +1084 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7F77 +ENCODING 32631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0840 +1258 +7F60 +3E44 +223C +3E40 +2258 +3E60 +2244 +263C +0000 +ENDCHAR +STARTCHAR U+7F78 +ENCODING 32632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0010 +1C10 +7FFC +0010 +1C90 +1C50 +3E50 +2210 +3E10 +2230 +0000 +ENDCHAR +STARTCHAR U+7F79 +ENCODING 32633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +1110 +1120 +1BF8 +3640 +37F0 +5240 +13F0 +1240 +13FC +1200 +0000 +ENDCHAR +STARTCHAR U+7F7A +ENCODING 32634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +3FFE +0888 +1110 +0888 +1FFC +1084 +1FFC +1084 +1FFC +7FFF +0490 +0888 +0000 +0000 +ENDCHAR +STARTCHAR U+7F7B +ENCODING 32635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +3FFE +0000 +3FC2 +205F +3FC2 +2002 +2F92 +200A +5FC2 +0A82 +1242 +020C +0000 +0000 +ENDCHAR +STARTCHAR U+7F7C +ENCODING 32636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +3FFE +1FFC +1084 +1FFC +1084 +1FFC +0888 +3FFE +0888 +7FFF +3FFE +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+7F7D +ENCODING 32637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4442 +4442 +7FFE +0000 +7FFE +4000 +4A42 +5292 +4512 +58D2 +4212 +4A52 +5282 +C502 +98CE +ENDCHAR +STARTCHAR U+7F7E +ENCODING 32638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2448 +3FF8 +0820 +7FFC +5114 +4924 +7FFC +4004 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+7F7F +ENCODING 32639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +4442 +4442 +7FFE +0100 +FFFF +0420 +FFFF +0000 +3FFC +2104 +3FFC +2104 +3FFC +0100 +FFFF +ENDCHAR +STARTCHAR U+7F80 +ENCODING 32640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +524A +4C32 +524A +0000 +FFFF +0440 +7C7E +4442 +7C7E +0840 +7FFE +4102 +7FFE +4102 +7FFE +ENDCHAR +STARTCHAR U+7F81 +ENCODING 32641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +4444 +7FFC +2200 +FFF8 +2208 +3E48 +0848 +7F48 +497C +7F04 +08F4 +FF04 +0814 +0808 +ENDCHAR +STARTCHAR U+7F82 +ENCODING 32642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +10F0 +1490 +64F0 +19F8 +1508 +7FF8 +2D08 +2BF8 +4908 +0918 +0000 +ENDCHAR +STARTCHAR U+7F83 +ENCODING 32643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +7FFC +0FE0 +0820 +0FE0 +0FE0 +7FFC +1FF0 +692C +0960 +0100 +0000 +ENDCHAR +STARTCHAR U+7F85 +ENCODING 32645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +1088 +1490 +64FC +1990 +16F8 +7E90 +2CF8 +2A90 +48FC +0880 +0000 +ENDCHAR +STARTCHAR U+7F86 +ENCODING 32646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +1490 +7EE0 +3E88 +2278 +3E90 +3EE0 +2288 +2678 +2488 +4244 +0000 +ENDCHAR +STARTCHAR U+7F87 +ENCODING 32647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +1420 +7FF8 +1460 +1C90 +3FFC +2AE8 +3EA8 +7FE8 +0888 +0818 +0000 +ENDCHAR +STARTCHAR U+7F88 +ENCODING 32648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +14FC +7FA0 +14F8 +1CA0 +3EF8 +2AA0 +3EFC +7FD4 +096C +0A18 +0000 +ENDCHAR +STARTCHAR U+7F89 +ENCODING 32649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +2222 +3FFE +0000 +0882 +13E4 +2409 +79DE +1004 +25C9 +7C1F +01C0 +5555 +55D5 +0000 +0000 +ENDCHAR +STARTCHAR U+7F8A +ENCODING 32650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +3FF8 +0100 +0100 +1FF0 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7F8B +ENCODING 32651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0910 +0910 +F91F +0910 +0910 +0000 +0100 +0100 +7FFE +0100 +0100 +0100 +FFFF +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+7F8C +ENCODING 32652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0480 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+7F8D +ENCODING 32653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +0420 +0810 +342C +E667 +0240 +3FFC +0100 +1FF8 +0100 +0100 +FFFF +0100 +0100 +ENDCHAR +STARTCHAR U+7F8E +ENCODING 32654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0100 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+7F8F +ENCODING 32655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4404 +6C0C +2818 +FE30 +10E2 +1006 +7C0C +1018 +1030 +1EE1 +F003 +1006 +300C +2018 +6070 +C1C0 +ENDCHAR +STARTCHAR U+7F90 +ENCODING 32656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0100 +3FFC +0100 +0100 +FFFF +0200 +07F0 +1C30 +7060 +00C0 +03E0 +1E38 +F00F +ENDCHAR +STARTCHAR U+7F91 +ENCODING 32657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0420 +7FFE +0100 +3FFC +0100 +FFFF +0200 +07F0 +0C10 +1830 +7060 +01C0 +0760 +1C38 +F00F +ENDCHAR +STARTCHAR U+7F92 +ENCODING 32658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +2828 +7C44 +1082 +1101 +7C00 +11FE +1022 +7C22 +1022 +1042 +2082 +4114 +0208 +0000 +0000 +ENDCHAR +STARTCHAR U+7F94 +ENCODING 32660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +3FF8 +0100 +0100 +1FF0 +0100 +0100 +7FFC +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+7F95 +ENCODING 32661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0410 +3FFE +0080 +3FFE +0080 +7FFF +0384 +00B8 +3EC0 +04A0 +0890 +728F +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+7F96 +ENCODING 32662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4400 +6C7C +2844 +FE44 +1044 +10C4 +7D87 +1000 +10FE +1E42 +F066 +102C +3018 +203C +6066 +C1C3 +ENDCHAR +STARTCHAR U+7F97 +ENCODING 32663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0420 +7FFE +0100 +3FFC +0100 +0100 +FFFF +0480 +0490 +0494 +0CA6 +08BA +1881 +30C3 +E07E +ENDCHAR +STARTCHAR U+7F9A +ENCODING 32666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1220 +1450 +7F50 +0888 +09FC +3E00 +09F8 +0E48 +7848 +1048 +1070 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+7F9B +ENCODING 32667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3FFE +0080 +1FFC +0080 +7FFF +0220 +3FFE +0222 +3FFE +2220 +3FFF +0421 +1822 +0000 +0000 +ENDCHAR +STARTCHAR U+7F9C +ENCODING 32668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +6C10 +29FF +FF01 +1101 +1000 +7DFF +1010 +1010 +1E10 +F010 +1010 +3010 +2010 +6010 +C070 +ENDCHAR +STARTCHAR U+7F9D +ENCODING 32669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2208 +1210 +14E0 +7FA0 +08A0 +08A0 +3EFC +0890 +0E90 +7894 +10CC +118C +27F4 +4004 +0000 +ENDCHAR +STARTCHAR U+7F9E +ENCODING 32670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0800 +0FE0 +1120 +2FF8 +4220 +3FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7F9F +ENCODING 32671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4408 +25FC +2808 +FE10 +1020 +1050 +7C88 +1106 +1200 +FEF8 +1020 +1020 +2020 +2024 +43FE +8000 +ENDCHAR +STARTCHAR U+7FA0 +ENCODING 32672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +29FF +1010 +7CFE +1012 +7DFE +1110 +7DFF +1011 +1011 +102B +1044 +2082 +4101 +0000 +0000 +ENDCHAR +STARTCHAR U+7FA1 +ENCODING 32673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0288 +7FFC +0100 +3FF8 +0100 +FFFE +0080 +44FC +2904 +1248 +2040 +60A0 +2090 +230E +2C04 +ENDCHAR +STARTCHAR U+7FA2 +ENCODING 32674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +440A +6C0B +2809 +FE08 +11FF +1008 +7C48 +1048 +11F9 +1E4B +F04A +10CE +3084 +218D +6317 +C062 +ENDCHAR +STARTCHAR U+7FA3 +ENCODING 32675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0110 +7FFC +1FF0 +07F8 +1C08 +67F8 +0440 +3FF8 +1FF0 +0100 +7FFC +0100 +0000 +ENDCHAR +STARTCHAR U+7FA4 +ENCODING 32676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +3E48 +1250 +13FC +7F20 +1220 +3EF8 +1020 +1E20 +33FC +3220 +5220 +1E20 +1020 +0000 +ENDCHAR +STARTCHAR U+7FA5 +ENCODING 32677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4402 +29FF +1049 +7C92 +1124 +7C92 +1049 +1000 +7DFF +1010 +1010 +1010 +2012 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+7FA6 +ENCODING 32678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +6C10 +29FF +FF01 +1101 +10FE +7C00 +1000 +11FF +1E48 +F048 +1048 +30C8 +2089 +6189 +C307 +ENDCHAR +STARTCHAR U+7FA7 +ENCODING 32679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4420 +2420 +2850 +FE88 +11FC +1088 +7D06 +1282 +10F8 +FE88 +1088 +1150 +2220 +2050 +408E +8304 +ENDCHAR +STARTCHAR U+7FA8 +ENCODING 32680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0100 +0FF0 +0100 +7FFC +1080 +0880 +41FC +2248 +0C50 +10A0 +2110 +260C +0000 +ENDCHAR +STARTCHAR U+7FA9 +ENCODING 32681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0690 +3888 +7FFC +0848 +0E50 +7824 +08D4 +1B0C +0000 +ENDCHAR +STARTCHAR U+7FAA +ENCODING 32682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +6C10 +28FE +FE82 +1082 +10FE +7C82 +1082 +10FE +1E91 +F093 +109A +3088 +208C +60F6 +C383 +ENDCHAR +STARTCHAR U+7FAC +ENCODING 32684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4406 +2805 +11FF +7D04 +11FC +7D04 +1174 +7D54 +1154 +1155 +1176 +1104 +210B +4201 +0000 +0000 +ENDCHAR +STARTCHAR U+7FAD +ENCODING 32685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +8820 +D870 +50D8 +F98C +2377 +2000 +FBC2 +2252 +2252 +3BD2 +E252 +2252 +23C2 +6242 +4242 +C2CE +ENDCHAR +STARTCHAR U+7FAE +ENCODING 32686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +2488 +4244 +3FF8 +0FE0 +0100 +7FFC +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+7FAF +ENCODING 32687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +12F8 +1488 +7FF8 +0888 +08F8 +3E40 +08FC +0F24 +7964 +1194 +11F4 +2104 +4018 +0000 +ENDCHAR +STARTCHAR U+7FB0 +ENCODING 32688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4420 +2524 +2924 +FD24 +11FC +1080 +7C84 +13FE +1090 +FE90 +1154 +1158 +22A8 +2228 +4444 +8882 +ENDCHAR +STARTCHAR U+7FB1 +ENCODING 32689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +45FF +2908 +7D10 +117E +1142 +7D7E +1142 +117E +7D08 +112A +112A +1249 +2408 +4018 +0000 +0000 +ENDCHAR +STARTCHAR U+7FB2 +ENCODING 32690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0650 +3848 +7FFC +1A28 +7F28 +1E14 +026C +0D84 +0000 +ENDCHAR +STARTCHAR U+7FB3 +ENCODING 32691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4402 +29FC +0092 +7C54 +11FF +1038 +7C54 +1092 +1111 +7DFF +1111 +11FF +2111 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+7FB4 +ENCODING 32692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0420 +7FFE +0100 +3FFC +0100 +FFFF +0100 +4442 +2824 +FEFF +1010 +7C7E +1010 +FEFF +1010 +ENDCHAR +STARTCHAR U+7FB5 +ENCODING 32693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +29FF +0054 +7DFF +1044 +10FE +7C82 +10FE +1082 +7CFE +1082 +10FE +2082 +4101 +0000 +0000 +ENDCHAR +STARTCHAR U+7FB6 +ENCODING 32694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4440 +2BFC +7FF8 +12E8 +12A8 +3AE8 +13F8 +1DF0 +7110 +11F0 +2110 +21F0 +47FC +0000 +0000 +ENDCHAR +STARTCHAR U+7FB7 +ENCODING 32695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4210 +2428 +0044 +7E82 +0901 +7EFE +0800 +7EEE +08AA +08EE +0800 +0844 +10AA +6111 +0000 +0000 +ENDCHAR +STARTCHAR U+7FB8 +ENCODING 32696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2000 +1FF8 +1FF0 +1010 +1FF0 +3AB8 +2FE8 +3BA8 +2938 +3FEC +292C +5944 +0000 +ENDCHAR +STARTCHAR U+7FB9 +ENCODING 32697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0100 +1FF0 +7FFC +2488 +4A64 +3FF8 +0FE0 +7FFC +0100 +7FFC +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+7FBA +ENCODING 32698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +42FE +2410 +19FF +7F55 +0939 +0955 +7E00 +08FE +0820 +7FFF +0929 +0929 +1129 +6103 +0000 +0000 +ENDCHAR +STARTCHAR U+7FBB +ENCODING 32699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +2BFF +7E44 +13FE +1246 +7FFE +13FF +1351 +134B +7E7C +127C +14A8 +2010 +41EE +0000 +0000 +ENDCHAR +STARTCHAR U+7FBC +ENCODING 32700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFC +2004 +3FFC +2220 +2FF8 +2080 +27F0 +2080 +3FFC +2AA8 +3F7C +2410 +5F7C +4410 +BFFE +0410 +ENDCHAR +STARTCHAR U+7FBD +ENCODING 32701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0208 +0208 +2288 +1248 +1248 +0208 +0618 +1A68 +6388 +0208 +0208 +0618 +0000 +ENDCHAR +STARTCHAR U+7FBE +ENCODING 32702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7700 +117F +1108 +5508 +5508 +3308 +1108 +3308 +5508 +1108 +1108 +110A +557F +2200 +0000 +0000 +ENDCHAR +STARTCHAR U+7FBF +ENCODING 32703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +7FFC +2288 +1248 +0208 +1A68 +6388 +0A28 +0410 +0824 +FFFE +0820 +0820 +0820 +1020 +2020 +ENDCHAR +STARTCHAR U+7FC0 +ENCODING 32704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +F788 +1088 +10BF +94A9 +D6A9 +52A9 +10A9 +10A9 +10A9 +73BF +D688 +1088 +1088 +1088 +7388 +ENDCHAR +STARTCHAR U+7FC1 +ENCODING 32705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +05E0 +0420 +1910 +61CC +0260 +3F90 +0000 +7FF8 +2288 +1248 +0618 +1A68 +6388 +0618 +0000 +ENDCHAR +STARTCHAR U+7FC2 +ENCODING 32706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7314 +1122 +1141 +5500 +337F +1111 +1111 +3311 +5511 +1111 +1111 +1121 +554A +2204 +0000 +0000 +ENDCHAR +STARTCHAR U+7FC3 +ENCODING 32707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13EF +1021 +1021 +FD29 +21AD +20A5 +2821 +6821 +4821 +58E7 +D1AD +9421 +9421 +3E21 +62E7 +ENDCHAR +STARTCHAR U+7FC5 +ENCODING 32709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +10D8 +7CD8 +1168 +1248 +7CD8 +24D8 +1568 +1A48 +0848 +14D8 +2300 +40FC +0000 +ENDCHAR +STARTCHAR U+7FC6 +ENCODING 32710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +0A28 +36D8 +0A28 +32C8 +0200 +3FC0 +0444 +093C +3100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7FC7 +ENCODING 32711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +0202 +3232 +0202 +7272 +0C0C +0402 +7FFF +1010 +2210 +4120 +00C0 +0120 +3E1E +0000 +0000 +ENDCHAR +STARTCHAR U+7FC8 +ENCODING 32712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FDEF +9421 +9421 +9529 +FDAD +94A5 +9421 +9421 +9421 +FCE7 +11AD +1021 +1021 +1021 +10E7 +ENDCHAR +STARTCHAR U+7FC9 +ENCODING 32713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0877 +0811 +7F11 +0855 +0833 +1C11 +2A11 +4933 +0855 +0811 +3E11 +0811 +08A5 +0842 +0000 +0000 +ENDCHAR +STARTCHAR U+7FCA +ENCODING 32714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17F8 +1088 +7D98 +0998 +4AA8 +2CC8 +2898 +2998 +11A8 +1AC8 +6488 +0088 +0198 +0000 +ENDCHAR +STARTCHAR U+7FCB +ENCODING 32715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7308 +1108 +1108 +557F +3322 +1122 +1122 +3322 +5522 +1122 +1122 +1122 +557F +2200 +0000 +0000 +ENDCHAR +STARTCHAR U+7FCC +ENCODING 32716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1248 +0A28 +0E38 +32C8 +0718 +0100 +3FF8 +0440 +0240 +0280 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+7FCD +ENCODING 32717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7708 +1108 +117F +5549 +3349 +1148 +117F +3361 +5551 +114A +1144 +114A +5291 +2421 +0000 +0000 +ENDCHAR +STARTCHAR U+7FCE +ENCODING 32718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1044 +2BFE +2444 +5044 +8A64 +0154 +7CCC +0444 +08CC +4954 +3264 +1044 +0844 +0954 +0088 +ENDCHAR +STARTCHAR U+7FCF +ENCODING 32719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +4242 +2626 +1A1A +E262 +0382 +0EE0 +3838 +E18F +0700 +1CE0 +038C +1E38 +01E0 +3F00 +ENDCHAR +STARTCHAR U+7FD0 +ENCODING 32720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7708 +1128 +113E +5548 +3308 +1108 +117F +3308 +5508 +1108 +1114 +1122 +5541 +2241 +0000 +0000 +ENDCHAR +STARTCHAR U+7FD1 +ENCODING 32721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7720 +1120 +113F +5521 +5541 +333D +1125 +3325 +5525 +113D +1101 +1101 +550A +2204 +0000 +0000 +ENDCHAR +STARTCHAR U+7FD2 +ENCODING 32722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +2288 +1658 +1A68 +6388 +0618 +0FE0 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+7FD4 +ENCODING 32724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4400 +27F8 +2888 +7C88 +12C8 +11A8 +3DA8 +1088 +1998 +72A8 +14C8 +1088 +2088 +4198 +0000 +ENDCHAR +STARTCHAR U+7FD5 +ENCODING 32725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0FE0 +701C +0FE0 +0820 +0FE0 +0000 +7FF8 +0A28 +36D8 +0A28 +32C8 +0618 +0000 +ENDCHAR +STARTCHAR U+7FD7 +ENCODING 32727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1F77 +2211 +5411 +0811 +1055 +2433 +0F91 +1111 +2A33 +0455 +0811 +1055 +2022 +0000 +0000 +ENDCHAR +STARTCHAR U+7FD8 +ENCODING 32728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21DE +FE44 +2844 +1154 +2ACC +C644 +00CC +FD54 +2A64 +2844 +2954 +2888 +2802 +47FE +8000 +ENDCHAR +STARTCHAR U+7FDB +ENCODING 32731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0880 +19FF +110C +32D8 +2870 +68DC +AB87 +2800 +2BDF +2841 +2B4D +28C3 +2945 +2249 +20C3 +ENDCHAR +STARTCHAR U+7FDC +ENCODING 32732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F3F +0101 +1111 +0909 +1111 +0606 +0080 +3FFE +0888 +1494 +2362 +0220 +0410 +780F +0000 +0000 +ENDCHAR +STARTCHAR U+7FDE +ENCODING 32734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E20 +1210 +13FF +1200 +5A00 +36FE +1282 +1282 +5AFE +3610 +1254 +1292 +1311 +6C30 +0000 +0000 +ENDCHAR +STARTCHAR U+7FDF +ENCODING 32735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7EFC +0208 +2248 +1A38 +1228 +2348 +0880 +1FFC +3080 +5FF8 +9080 +1FF8 +1080 +1FFE +1000 +ENDCHAR +STARTCHAR U+7FE0 +ENCODING 32736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +1248 +0E38 +32C8 +0718 +0100 +3FF8 +0420 +0B50 +1188 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+7FE1 +ENCODING 32737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +7CFC +0480 +3CF8 +0480 +7CFC +0880 +7FF8 +0618 +1A68 +6798 +1A68 +6388 +0618 +0000 +ENDCHAR +STARTCHAR U+7FE2 +ENCODING 32738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F77 +4911 +5D11 +4955 +4933 +5D11 +4111 +5D33 +5555 +5511 +5D11 +4111 +4111 +4366 +0000 +0000 +ENDCHAR +STARTCHAR U+7FE3 +ENCODING 32739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +4242 +2626 +1A1A +E262 +0100 +7FFE +0810 +FFFF +0400 +FFFF +0810 +1E20 +03E0 +3E3E +ENDCHAR +STARTCHAR U+7FE5 +ENCODING 32741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +1FC0 +0284 +FFFE +0200 +0FF8 +3808 +CFF8 +0808 +0FF8 +0004 +7EFE +2244 +1A34 +62C4 +060C +ENDCHAR +STARTCHAR U+7FE6 +ENCODING 32742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +3E08 +3A48 +2648 +3A48 +2648 +2618 +7FF8 +0A28 +36D8 +0A28 +32C8 +0618 +0000 +ENDCHAR +STARTCHAR U+7FE8 +ENCODING 32744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +4242 +2626 +1A1A +E262 +0002 +1FF8 +1008 +1FF8 +1008 +7FFE +0900 +09FC +1500 +63FF +ENDCHAR +STARTCHAR U+7FE9 +ENCODING 32745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0048 +3ED8 +22D8 +3F68 +2048 +3ED8 +2ED8 +7F68 +6E48 +2E48 +2E48 +26D8 +0000 +ENDCHAR +STARTCHAR U+7FEA +ENCODING 32746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7714 +1149 +1155 +1163 +5541 +337F +1124 +3342 +5591 +113E +1162 +1114 +1108 +6677 +0000 +0000 +ENDCHAR +STARTCHAR U+7FEB +ENCODING 32747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +4C80 +2A80 +1B80 +6CFC +19B0 +0830 +3F30 +2130 +3F50 +2154 +3F94 +210C +0000 +ENDCHAR +STARTCHAR U+7FEC +ENCODING 32748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FEFE +4242 +2626 +1A1A +E262 +0002 +FFFF +8101 +BFFD +0100 +3FFC +2104 +3FFC +2104 +FFFF +0100 +ENDCHAR +STARTCHAR U+7FED +ENCODING 32749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +772E +1142 +11C2 +557F +3340 +1150 +115F +3364 +5544 +117F +1144 +1144 +114A +6651 +0000 +0000 +ENDCHAR +STARTCHAR U+7FEE +ENCODING 32750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0224 +7FFE +0024 +3E24 +2224 +3EB4 +006C +7F24 +4124 +556C +55B4 +7F24 +4924 +4924 +43B4 +0048 +ENDCHAR +STARTCHAR U+7FEF +ENCODING 32751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FEFE +4242 +2626 +1A1A +E262 +0100 +7FFE +0000 +0FF0 +0810 +7FFE +4002 +4FF2 +4812 +4FF2 +4006 +ENDCHAR +STARTCHAR U+7FF0 +ENCODING 32752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7FA0 +0890 +3F08 +23FC +3E48 +2368 +3ED8 +08D8 +7F68 +0968 +0848 +08D8 +0000 +ENDCHAR +STARTCHAR U+7FF1 +ENCODING 32753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2004 +7DDE +4444 +7C44 +4554 +7CCC +1044 +FE44 +28CC +5554 +9244 +7C44 +1044 +1154 +1088 +ENDCHAR +STARTCHAR U+7FF2 +ENCODING 32754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEEF +2821 +FE21 +AAA9 +AAED +FE65 +0021 +7C21 +0021 +FE67 +10ED +5421 +5421 +9221 +3067 +ENDCHAR +STARTCHAR U+7FF3 +ENCODING 32755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F70 +2E54 +348C +3FF8 +2C50 +3230 +3FCC +3EF8 +0A28 +36D8 +0A28 +32C8 +0618 +0000 +ENDCHAR +STARTCHAR U+7FF4 +ENCODING 32756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E08 +123E +1288 +123E +37AA +5ABE +12AA +373E +5A88 +12BE +1288 +1288 +1280 +257F +0000 +0000 +ENDCHAR +STARTCHAR U+7FF5 +ENCODING 32757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7710 +113E +1162 +553E +3322 +113E +3320 +553F +1120 +113F +1155 +11AB +1101 +660E +0000 +0000 +ENDCHAR +STARTCHAR U+7FF7 +ENCODING 32759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +24BF +1509 +0E09 +7FED +151B +2489 +4449 +209B +3BED +4A89 +2A89 +13C9 +6089 +00B6 +0000 +0000 +ENDCHAR +STARTCHAR U+7FF8 +ENCODING 32760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +043F +7FC9 +1509 +7FED +111B +3F89 +2089 +3F9B +20AD +3F89 +2089 +3F89 +2089 +4076 +0000 +0000 +ENDCHAR +STARTCHAR U+7FF9 +ENCODING 32761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +3DF8 +08D8 +7ED8 +2568 +7E48 +24D8 +3ED8 +4168 +7E48 +1448 +14DC +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+7FFA +ENCODING 32762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +20EF +FE21 +8221 +FEA9 +82ED +FE65 +8221 +FE21 +1021 +D667 +10ED +D621 +1021 +FE21 +1067 +ENDCHAR +STARTCHAR U+7FFB +ENCODING 32763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +7BF8 +2A48 +1C48 +7F68 +1CD8 +1AD8 +2A48 +7ED8 +2B68 +3E48 +2A48 +3E48 +22D8 +0000 +ENDCHAR +STARTCHAR U+7FFC +ENCODING 32764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +1298 +1A68 +6FF8 +0920 +0FE0 +0920 +0FE0 +1FF0 +0440 +7FFC +0C60 +7018 +0000 +ENDCHAR +STARTCHAR U+7FFD +ENCODING 32765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +2F77 +2811 +FF91 +0355 +02B3 +7F91 +4111 +7F11 +4933 +5D55 +6B91 +4D11 +5111 +4311 +8CB3 +ENDCHAR +STARTCHAR U+7FFE +ENCODING 32766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F77 +5511 +5511 +7F55 +0033 +FF91 +0011 +7F11 +4133 +7F55 +1411 +3491 +E691 +3311 +61B3 +ENDCHAR +STARTCHAR U+7FFF +ENCODING 32767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +FEF7 +1011 +7C11 +0055 +FF33 +0111 +7D11 +1011 +7C33 +0055 +FF11 +0211 +FF11 +AA11 +E633 +ENDCHAR +STARTCHAR U+8000 +ENCODING 32768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +4A48 +2BF8 +2C48 +09F8 +7E90 +19FC +1B20 +19F8 +1BF8 +2D20 +29FC +4100 +0000 +ENDCHAR +STARTCHAR U+8001 +ENCODING 32769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0110 +1FF0 +0120 +0140 +7FFC +0300 +0200 +0630 +1BC0 +6200 +0208 +0208 +01F8 +0000 +ENDCHAR +STARTCHAR U+8003 +ENCODING 32771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0110 +1FF0 +0120 +7FFC +0080 +0300 +0FF8 +7200 +03F0 +0210 +0010 +0010 +00E0 +0000 +ENDCHAR +STARTCHAR U+8004 +ENCODING 32772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +1FE0 +0240 +7FFC +0330 +0FC8 +7208 +01F8 +1F80 +03F0 +3E00 +03FC +7E04 +01FC +0000 +ENDCHAR +STARTCHAR U+8005 +ENCODING 32773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0110 +1FF0 +0120 +0140 +7FFC +0100 +07F0 +1C10 +67F0 +0410 +0410 +07F0 +0410 +0000 +ENDCHAR +STARTCHAR U+8006 +ENCODING 32774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +1FE0 +0240 +7FFC +0330 +0FC8 +7208 +01F8 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8007 +ENCODING 32775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +0106 +3FFC +0118 +0120 +FFFF +0300 +1C00 +E7FE +0C02 +1BE2 +7222 +0222 +03E6 +0004 +001C +ENDCHAR +STARTCHAR U+8008 +ENCODING 32776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +040C +3FF0 +0440 +FFFF +0200 +1FF8 +E202 +11FE +1000 +3FFE +6002 +CFC2 +0842 +0842 +0FC6 +001C +ENDCHAR +STARTCHAR U+8009 +ENCODING 32777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +1FF8 +0120 +7FFF +0180 +063E +1FC0 +6800 +1FFC +0004 +0FE4 +0824 +0FE4 +0008 +0070 +ENDCHAR +STARTCHAR U+800A +ENCODING 32778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +0106 +3FFC +0118 +0120 +FFFF +0180 +0600 +1FFC +E400 +0810 +1FF8 +0100 +3FFC +0100 +FFFF +ENDCHAR +STARTCHAR U+800B +ENCODING 32779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +1FE0 +0240 +7FFC +0330 +0FC4 +71FC +3FF8 +0220 +3FF8 +0FE0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+800C +ENCODING 32780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0100 +0200 +3FF0 +2490 +2490 +2490 +2490 +2490 +2490 +2490 +2490 +2030 +0000 +ENDCHAR +STARTCHAR U+800D +ENCODING 32781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0200 +3FF8 +2448 +2448 +2448 +2218 +0204 +FFFE +0420 +0820 +0440 +0380 +0C60 +3010 +ENDCHAR +STARTCHAR U+800E +ENCODING 32782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFFF +0200 +7FFE +4442 +4442 +4442 +4442 +4446 +0100 +FFFF +0280 +06C0 +0C70 +381C +E007 +ENDCHAR +STARTCHAR U+800F +ENCODING 32783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FF8C +0818 +1030 +7F62 +5506 +550C +5518 +5530 +5561 +5503 +5506 +550C +5518 +5530 +4160 +ENDCHAR +STARTCHAR U+8010 +ENCODING 32784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F08 +0808 +1008 +7FFC +5508 +5548 +5528 +5528 +5508 +5508 +5508 +5508 +4318 +0000 +ENDCHAR +STARTCHAR U+8011 +ENCODING 32785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +4102 +7FFE +0000 +FFFF +0100 +0200 +7FFE +4442 +4442 +4442 +4442 +4442 +4446 +ENDCHAR +STARTCHAR U+8012 +ENCODING 32786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0118 +01E0 +3F00 +0100 +1FF0 +0100 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8013 +ENCODING 32787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +FE10 +1010 +1010 +7C10 +1010 +1010 +FE10 +1010 +3810 +3410 +5410 +9010 +1010 +1070 +ENDCHAR +STARTCHAR U+8014 +ENCODING 32788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +15FC +FE08 +1010 +7C20 +1020 +FE24 +33FE +3820 +5420 +5020 +9020 +1020 +10A0 +1040 +ENDCHAR +STARTCHAR U+8015 +ENCODING 32789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0848 +7F48 +08FC +3E48 +0848 +7F48 +0848 +1DFC +1A48 +2A88 +4888 +0908 +0A08 +0000 +ENDCHAR +STARTCHAR U+8016 +ENCODING 32790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1420 +FE20 +10A8 +10A4 +7CA2 +1122 +FD28 +302C +3810 +5420 +5040 +9080 +1100 +1600 +ENDCHAR +STARTCHAR U+8017 +ENCODING 32791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +7FC0 +0840 +7E58 +09E0 +7E40 +085C +1DE0 +1A40 +2A40 +4844 +0844 +083C +0000 +ENDCHAR +STARTCHAR U+8018 +ENCODING 32792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0EF8 +7800 +0800 +3E00 +09FC +7E20 +0820 +1C20 +1A30 +2A48 +4858 +09E4 +0804 +0000 +ENDCHAR +STARTCHAR U+8019 +ENCODING 32793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0EF8 +78A8 +08A8 +3EA8 +08A8 +7FF8 +0888 +1C80 +1A80 +2A80 +4884 +0884 +087C +0000 +ENDCHAR +STARTCHAR U+801B +ENCODING 32795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0908 +7E08 +0812 +7F21 +087F +7F01 +0800 +1C7F +2A41 +4941 +0841 +087F +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+801C +ENCODING 32796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0EF0 +7890 +0890 +3E90 +08F0 +7E90 +0880 +1CF8 +1A88 +2A88 +4888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+801D +ENCODING 32797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +FE84 +1084 +1084 +7CFC +1084 +1084 +FE84 +10FC +3884 +3484 +5484 +9084 +13FF +1000 +ENDCHAR +STARTCHAR U+801E +ENCODING 32798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2100 +F900 +210F +27E9 +F929 +2129 +2129 +F929 +2129 +7329 +6A29 +AA69 +A649 +244F +2DC0 +ENDCHAR +STARTCHAR U+801F +ENCODING 32799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FF +FE80 +1080 +1080 +7CFE +1082 +1082 +FE82 +10FE +3880 +3480 +5480 +9080 +10FF +1000 +ENDCHAR +STARTCHAR U+8020 +ENCODING 32800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +14A0 +FE90 +1108 +7E2E +11F4 +FE00 +3008 +39FC +5508 +5508 +9108 +1108 +11F8 +1108 +ENDCHAR +STARTCHAR U+8021 +ENCODING 32801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1FA0 +72A0 +12A0 +3BF8 +12A8 +7EA8 +1BA8 +36A8 +36E8 +53C8 +1648 +1088 +1130 +0000 +ENDCHAR +STARTCHAR U+8022 +ENCODING 32802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FE +FC88 +1088 +7FFE +1202 +FC84 +3080 +3BF8 +5488 +5488 +9108 +1108 +1228 +1410 +ENDCHAR +STARTCHAR U+8024 +ENCODING 32804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +FE44 +10FE +1044 +7C44 +1044 +11FF +FE00 +10FE +3882 +3482 +54FE +9082 +1082 +10FE +ENDCHAR +STARTCHAR U+8025 +ENCODING 32805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +114C +FD48 +1150 +7C44 +13FE +FE04 +32F4 +3A94 +5694 +5694 +92F4 +1204 +1214 +1208 +ENDCHAR +STARTCHAR U+8026 +ENCODING 32806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1524 +FF24 +11FC +7D24 +1124 +FDFC +3020 +3BFE +5622 +562A +92FA +1202 +120A +1204 +ENDCHAR +STARTCHAR U+8027 +ENCODING 32807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +1150 +FC44 +13FE +7D50 +124C +FC44 +3880 +37FE +5110 +5210 +91A0 +1040 +11B0 +160C +ENDCHAR +STARTCHAR U+8028 +ENCODING 32808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FFC +7900 +09F8 +3F00 +09FC +7F54 +0D78 +1BCC +1BFC +2948 +4A28 +0808 +0818 +0000 +ENDCHAR +STARTCHAR U+8029 +ENCODING 32809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1110 +17FC +F910 +13F8 +7910 +17FE +F840 +33F8 +3A48 +57F8 +5248 +9FFE +1208 +1228 +1210 +ENDCHAR +STARTCHAR U+802A +ENCODING 32810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +FC88 +1050 +7FFE +1242 +FC24 +13FE +3880 +34F8 +5088 +9088 +1108 +1228 +1410 +ENDCHAR +STARTCHAR U+802C +ENCODING 32812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +FE92 +11FF +1092 +7CFE +1010 +10FE +FE92 +10FE +3810 +35FF +5442 +90E4 +103C +11E7 +ENDCHAR +STARTCHAR U+802D +ENCODING 32813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1148 +1148 +7E52 +14E2 +7F5C +1148 +127F +7FE8 +1044 +37FF +3922 +5524 +5298 +5419 +1065 +1183 +ENDCHAR +STARTCHAR U+802E +ENCODING 32814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +12A9 +FEDA +118C +1252 +7800 +13FF +1201 +FE21 +11FE +3822 +3422 +5462 +9046 +10C4 +119C +ENDCHAR +STARTCHAR U+8030 +ENCODING 32816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FF +1020 +FCFC +1084 +10FC +7884 +13FF +1211 +FD4A +1145 +3A3C +3440 +54FC +9344 +1038 +13C7 +ENDCHAR +STARTCHAR U+8031 +ENCODING 32817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +FE48 +13FE +7E58 +12EC +FF4A +3248 +3BFE +5640 +52FC +9284 +1584 +1AFC +1084 +ENDCHAR +STARTCHAR U+8033 +ENCODING 32819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0820 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0838 +0FE0 +7820 +0020 +0020 +0000 +ENDCHAR +STARTCHAR U+8034 +ENCODING 32820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FE40 +4440 +4440 +7C40 +4440 +4440 +4440 +7C40 +4440 +4440 +4440 +7C40 +C441 +0463 +043E +ENDCHAR +STARTCHAR U+8035 +ENCODING 32821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +FF04 +25FE +2420 +3C20 +2420 +2420 +3C20 +2420 +2420 +2720 +3C20 +E420 +4420 +04A0 +0440 +ENDCHAR +STARTCHAR U+8036 +ENCODING 32822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +1248 +1250 +1E50 +1260 +1250 +1E48 +1244 +1344 +1E64 +6258 +0240 +0240 +0000 +ENDCHAR +STARTCHAR U+8037 +ENCODING 32823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0104 +FFFE +0280 +0440 +0820 +3FF8 +C826 +0FE0 +0820 +0FE0 +0828 +08FC +7F20 +0020 +0020 +ENDCHAR +STARTCHAR U+8038 +ENCODING 32824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1850 +2488 +4306 +8200 +7FFC +1010 +1FF0 +1010 +1FF0 +1014 +10FE +FF10 +0010 +0010 +ENDCHAR +STARTCHAR U+8039 +ENCODING 32825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FE70 +4450 +44D8 +7C8C +4586 +477B +4400 +7C00 +44FC +4404 +440C +7C08 +C418 +0410 +0430 +ENDCHAR +STARTCHAR U+803A +ENCODING 32826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +4400 +4400 +7C00 +4400 +45FF +4420 +7C20 +4420 +4464 +4444 +7C46 +C442 +045E +04F3 +ENDCHAR +STARTCHAR U+803B +ENCODING 32827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +2420 +2420 +3CA0 +24B8 +24A0 +3CA0 +24A0 +24A0 +3CA0 +64A0 +07FC +0400 +0000 +ENDCHAR +STARTCHAR U+803C +ENCODING 32828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FCFC +4884 +4884 +7884 +4BFF +4884 +4884 +7884 +4BFF +4884 +4884 +7884 +C884 +0884 +089C +ENDCHAR +STARTCHAR U+803D +ENCODING 32829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +2440 +25FC +3D48 +2640 +2440 +3C60 +2460 +2660 +3CA0 +64A4 +0524 +061C +0000 +ENDCHAR +STARTCHAR U+803E +ENCODING 32830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FE20 +4420 +45FF +7C20 +4420 +4420 +4468 +7C48 +4458 +44D0 +4492 +7DB2 +C422 +047F +04C1 +ENDCHAR +STARTCHAR U+803F +ENCODING 32831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F20 +1220 +1224 +1EA4 +12A8 +12B0 +1F20 +1230 +1250 +1E50 +7288 +0308 +0204 +0000 +ENDCHAR +STARTCHAR U+8040 +ENCODING 32832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +FE26 +4422 +4420 +7DFF +4420 +4422 +4426 +7C2C +4438 +4410 +4438 +7C68 +C4CD +0787 +0402 +ENDCHAR +STARTCHAR U+8042 +ENCODING 32834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7FFC +0820 +0FE0 +0820 +0FE0 +0828 +7FFC +0020 +7EFC +0204 +2448 +1428 +0810 +162E +62C4 +ENDCHAR +STARTCHAR U+8043 +ENCODING 32835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +FF20 +2424 +25FE +3D24 +2524 +25FC +3D24 +2524 +27FE +2504 +3F04 +E504 +4504 +0514 +0508 +ENDCHAR +STARTCHAR U+8044 +ENCODING 32836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE38 +4428 +446C +7CC6 +4593 +4430 +4464 +7CCC +4418 +4431 +44E3 +7C06 +C40C +0438 +04E0 +ENDCHAR +STARTCHAR U+8046 +ENCODING 32838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +24A0 +24A0 +3D10 +27F8 +2404 +3FF8 +2448 +2448 +3C48 +6470 +0440 +0440 +0000 +ENDCHAR +STARTCHAR U+8047 +ENCODING 32839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +7EFF +2408 +2408 +3C08 +2448 +244F +3C48 +2448 +2448 +7C48 +0448 +0448 +04FF +0000 +0000 +ENDCHAR +STARTCHAR U+8048 +ENCODING 32840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E08 +2488 +24BF +3D49 +27C9 +2449 +3C89 +2529 +27E9 +7C09 +0411 +0421 +04CA +0404 +0000 +0000 +ENDCHAR +STARTCHAR U+804A +ENCODING 32842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7F38 +2AA8 +2AA8 +3AA8 +2AA8 +2AA8 +3AA8 +2AA8 +2BA8 +3EB8 +68A0 +0920 +0A20 +0000 +ENDCHAR +STARTCHAR U+804B +ENCODING 32843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +0224 +FFFE +02A0 +04C4 +18FC +2300 +7FFC +0820 +0FE0 +0820 +0FE0 +0824 +FFFE +0020 +0020 +ENDCHAR +STARTCHAR U+804C +ENCODING 32844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +FE04 +24FE +2484 +3C84 +2484 +2484 +3C84 +24FC +2484 +2748 +FC48 +4484 +0486 +0502 +0400 +ENDCHAR +STARTCHAR U+804D +ENCODING 32845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +FF20 +2420 +25FE +3D02 +2604 +2400 +3FFE +2420 +2420 +2720 +3C20 +E420 +4420 +04A0 +0440 +ENDCHAR +STARTCHAR U+804F +ENCODING 32847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +2208 +2210 +2220 +3E7F +2255 +2255 +3E55 +2255 +2255 +7F55 +0255 +0255 +0243 +0000 +0000 +ENDCHAR +STARTCHAR U+8050 +ENCODING 32848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F08 +2208 +227F +3E08 +2208 +227F +3E00 +2200 +227F +7F41 +0241 +0241 +027F +0241 +0000 +0000 +ENDCHAR +STARTCHAR U+8051 +ENCODING 32849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +2222 +2222 +3E3E +2222 +2222 +3E3E +2222 +2222 +2222 +7F7F +0202 +0202 +0202 +0000 +0000 +ENDCHAR +STARTCHAR U+8052 +ENCODING 32850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7E10 +24E0 +2420 +3C20 +25FC +2420 +3C20 +24F8 +2488 +3C88 +6488 +04F8 +0488 +0000 +ENDCHAR +STARTCHAR U+8054 +ENCODING 32852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +FECC +2450 +2400 +3DFC +2420 +2420 +2424 +3FFE +2420 +2420 +2450 +3E50 +E488 +050E +0604 +ENDCHAR +STARTCHAR U+8056 +ENCODING 32854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F80 +1278 +1E48 +1E48 +1378 +7E48 +0200 +3FF8 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8058 +ENCODING 32856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FF8 +2548 +25F8 +3D48 +25F8 +2400 +3FFC +2440 +2478 +3C88 +6408 +0408 +0430 +0000 +ENDCHAR +STARTCHAR U+805A +ENCODING 32858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F00 +12F8 +1E48 +1E30 +1270 +1F88 +7244 +0390 +0990 +3560 +0930 +310C +0100 +0000 +ENDCHAR +STARTCHAR U+805C +ENCODING 32860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7E10 +25FF +2501 +3D29 +2428 +24C6 +3C00 +24FE +2410 +7C10 +0410 +05FF +0400 +0000 +0000 +ENDCHAR +STARTCHAR U+805D +ENCODING 32861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E0A +2409 +27FF +3C08 +25E8 +2528 +3D28 +2528 +25E9 +7C0A +05EC +040D +0413 +0421 +0000 +0000 +ENDCHAR +STARTCHAR U+805E +ENCODING 32862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2FE8 +2448 +27C8 +2448 +27C8 +2448 +2FC8 +2058 +0000 +ENDCHAR +STARTCHAR U+805F +ENCODING 32863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1EF8 +2888 +7F88 +0CF8 +1288 +2000 +7FFC +0820 +0FE0 +0FE0 +083C +7FE0 +0020 +0000 +ENDCHAR +STARTCHAR U+8060 +ENCODING 32864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +FEC6 +4444 +45FF +7C44 +4444 +4444 +4444 +7DFF +4444 +4444 +4444 +7CC4 +C484 +0484 +0584 +ENDCHAR +STARTCHAR U+8061 +ENCODING 32865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0070 +7E90 +2490 +2548 +3E64 +2490 +25F8 +3C48 +24A0 +25A8 +3D84 +6694 +0490 +0470 +0000 +ENDCHAR +STARTCHAR U+8062 +ENCODING 32866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +25FC +2508 +3E00 +25FC +2420 +3CA0 +24B8 +24A0 +3CA0 +64E0 +0520 +061C +0000 +ENDCHAR +STARTCHAR U+8064 +ENCODING 32868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FC20 +4BFF +4800 +78FC +4884 +48FC +4800 +7BFF +4A01 +4AFD +4810 +7810 +C810 +0810 +0870 +ENDCHAR +STARTCHAR U+8066 +ENCODING 32870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +FC80 +48FE +49AA +794A +4A72 +489A +4924 +784C +4800 +4830 +4858 +7942 +C943 +0B45 +0A38 +ENDCHAR +STARTCHAR U+8067 +ENCODING 32871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FE8 +242A +252C +3D45 +2482 +257D +3C10 +2410 +24FE +7E10 +0410 +0428 +0444 +0482 +0000 +0000 +ENDCHAR +STARTCHAR U+8068 +ENCODING 32872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +7D10 +2EE8 +2AA8 +3910 +2AA8 +2FFC +3844 +2890 +2FFC +3890 +6890 +0910 +0A10 +0000 +ENDCHAR +STARTCHAR U+8069 +ENCODING 32873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +FF24 +25FE +2524 +3DFC +2420 +27FE +3C00 +25FC +2504 +2724 +3D24 +E524 +4450 +048C +0504 +ENDCHAR +STARTCHAR U+806A +ENCODING 32874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0504 +FECC +2450 +2404 +3DFE +2504 +2504 +2504 +3DFC +2544 +2420 +24A4 +FD8A +068A +0478 +0400 +ENDCHAR +STARTCHAR U+806C +ENCODING 32876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E44 +2492 +2521 +3C44 +24FE +2400 +3DEF +2421 +25EF +7E21 +05EF +0421 +0421 +04C6 +0000 +0000 +ENDCHAR +STARTCHAR U+806D +ENCODING 32877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FE40 +45FE +4522 +7D22 +45FE +4522 +4522 +7DFE +4450 +4454 +4455 +7CDF +C490 +0591 +070F +ENDCHAR +STARTCHAR U+806F +ENCODING 32879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +7D10 +2EE8 +2AA8 +3910 +2AA8 +2FFC +38A4 +2AA8 +2EA8 +3BB8 +6AA8 +0920 +0A20 +0000 +ENDCHAR +STARTCHAR U+8070 +ENCODING 32880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FF8 +2548 +2578 +3DA8 +2568 +2598 +3DF8 +2440 +25A8 +3DA4 +6684 +0490 +0470 +0000 +ENDCHAR +STARTCHAR U+8071 +ENCODING 32881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7F44 +087E +7F44 +08A8 +FF10 +1028 +2E46 +4284 +BFF8 +0C20 +0BA0 +0864 +FFFE +0020 +0020 +ENDCHAR +STARTCHAR U+8072 +ENCODING 32882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +7F50 +0854 +3E8C +3EF8 +2A50 +3E30 +21CC +5FF8 +0FE0 +0FE0 +0838 +7FE0 +0020 +0000 +ENDCHAR +STARTCHAR U+8073 +ENCODING 32883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +3190 +0A68 +1544 +7178 +12C0 +147C +7FFC +0820 +0FE0 +0FE0 +083C +7FE0 +0020 +0000 +ENDCHAR +STARTCHAR U+8074 +ENCODING 32884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +2BFC +2840 +3BF8 +2AA8 +2AA8 +3BF8 +2A48 +2CA0 +3AA8 +6A84 +0C94 +0870 +0000 +ENDCHAR +STARTCHAR U+8075 +ENCODING 32885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FEFE +4492 +44FE +7C10 +47FF +4400 +44FE +7C82 +44FE +4482 +44FE +7C82 +C4FE +0444 +0583 +ENDCHAR +STARTCHAR U+8076 +ENCODING 32886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0440 +07C0 +07C0 +3FC0 +0040 +7FFC +1290 +1EF0 +1EF0 +1290 +7FF0 +0210 +0000 +ENDCHAR +STARTCHAR U+8077 +ENCODING 32887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +7D30 +2FE8 +2AA8 +3AA0 +2FFC +2820 +3BA8 +2AA8 +2FB0 +3A90 +6BB4 +0A4C +0884 +0000 +ENDCHAR +STARTCHAR U+8078 +ENCODING 32888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7EFC +2408 +25FF +3D44 +2592 +25FF +3D00 +25FE +25FE +7F00 +06FE +0482 +04FE +0000 +0000 +ENDCHAR +STARTCHAR U+8079 +ENCODING 32889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FFC +2A48 +2DA8 +3A94 +2C70 +2BF8 +3AA8 +2FFC +2800 +3FFC +6840 +0840 +08C0 +0000 +ENDCHAR +STARTCHAR U+807D +ENCODING 32893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +2FFC +3840 +3BF8 +2AA8 +3BF8 +6800 +7FFC +2840 +7AA8 +3AA4 +6C94 +0870 +0000 +ENDCHAR +STARTCHAR U+807E +ENCODING 32894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +3FF8 +0AF0 +7F10 +1EF0 +12F0 +1EF0 +1EF4 +167C +7FFC +07C0 +07F8 +7FC0 +0040 +0000 +ENDCHAR +STARTCHAR U+807F +ENCODING 32895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1FF0 +0110 +7FFC +0110 +1FF0 +0100 +1FF0 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8080 +ENCODING 32896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +3FFC +0108 +FFFE +0108 +3FF8 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+8081 +ENCODING 32897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +0000 +3FFE +2002 +3FFE +2080 +2FFC +2084 +3FFF +2084 +2FFC +2080 +6FFC +4080 +DFFF +0080 +ENDCHAR +STARTCHAR U+8082 +ENCODING 32898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +0008 +7F7E +080A +08FF +0F0A +117E +3108 +4A7E +0408 +08FF +1008 +2008 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+8083 +ENCODING 32899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +3FFC +0108 +FFFE +0108 +3FF8 +0100 +2108 +2548 +2548 +2528 +2928 +2108 +4108 +8108 +ENDCHAR +STARTCHAR U+8084 +ENCODING 32900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2020 +2620 +38F8 +2228 +1FFC +1028 +1EF8 +2820 +7EF8 +0820 +15FC +1220 +2220 +4020 +0000 +ENDCHAR +STARTCHAR U+8085 +ENCODING 32901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0110 +7FFC +0110 +1FF0 +1550 +1D70 +1110 +1FF0 +1110 +1D70 +2550 +4550 +0000 +ENDCHAR +STARTCHAR U+8086 +ENCODING 32902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +20F8 +3C28 +21FC +3C28 +20F8 +7E20 +10F8 +1820 +25FC +2A20 +7220 +0020 +0000 +ENDCHAR +STARTCHAR U+8087 +ENCODING 32903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +3EFC +2348 +3E30 +21CC +4FE0 +7FFC +0120 +0FE0 +3FF8 +0100 +7FFC +0100 +0000 +ENDCHAR +STARTCHAR U+8088 +ENCODING 32904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FF24 +00FF +7E22 +4234 +7E19 +416F +9FF8 +0108 +FFFF +0108 +1FF8 +0100 +3FFC +0100 +FFFF +0100 +ENDCHAR +STARTCHAR U+8089 +ENCODING 32905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +2108 +2188 +2248 +2528 +2928 +2188 +2248 +2428 +2828 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+808A +ENCODING 32906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3F80 +217F +2101 +3F01 +2102 +2104 +3F08 +2110 +2120 +2140 +2141 +2541 +427F +0000 +0000 +ENDCHAR +STARTCHAR U+808B +ENCODING 32907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +2440 +27F8 +3C48 +2448 +2448 +3C48 +2448 +2488 +2488 +2508 +4E30 +0000 +ENDCHAR +STARTCHAR U+808C +ENCODING 32908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF0 +2490 +2490 +3C90 +2490 +2490 +3C90 +2490 +2490 +2494 +2514 +2514 +4E0C +0000 +ENDCHAR +STARTCHAR U+808E +ENCODING 32910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4002 +0FF0 +0810 +0810 +0FF0 +0810 +0810 +0FF0 +0810 +0810 +1810 +1010 +3070 +ENDCHAR +STARTCHAR U+808F +ENCODING 32911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0180 +00C0 +0120 +0E1C +0080 +3FFE +2082 +2082 +2142 +2632 +2082 +2142 +2632 +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+8090 +ENCODING 32912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F10 +2120 +217F +2180 +3F00 +213E +2104 +3F08 +2110 +2120 +2141 +2141 +457F +0200 +0000 +0000 +ENDCHAR +STARTCHAR U+8092 +ENCODING 32914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E40 +2240 +2244 +22FE +3E44 +2244 +2244 +3E64 +2254 +2244 +2244 +2245 +4A45 +0487 +0000 +0000 +ENDCHAR +STARTCHAR U+8093 +ENCODING 32915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2000 +2000 +1FF8 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+8095 +ENCODING 32917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3F7F +2111 +2111 +3F11 +2151 +2131 +3F19 +2111 +2111 +2121 +2141 +450A +0204 +0000 +0000 +ENDCHAR +STARTCHAR U+8096 +ENCODING 32918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2108 +1108 +1110 +0100 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+8098 +ENCODING 32920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3C10 +2410 +2410 +27FC +3C10 +2510 +2490 +3C90 +2410 +2410 +2410 +2410 +4C30 +0000 +ENDCHAR +STARTCHAR U+8099 +ENCODING 32921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1004 +1004 +1FFC +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +1004 +2014 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+809A +ENCODING 32922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +2440 +2440 +3FF8 +2440 +2440 +3C40 +2440 +2440 +2440 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+809B +ENCODING 32923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2440 +2440 +2440 +3C40 +2440 +2440 +3C40 +2440 +2440 +2440 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+809C +ENCODING 32924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +3F18 +2220 +2240 +2284 +3E0C +2210 +2220 +2240 +3E80 +2204 +220C +4210 +4220 +8A40 +0480 +ENDCHAR +STARTCHAR U+809D +ENCODING 32925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2440 +2440 +2440 +3C40 +27FC +2440 +3C40 +2440 +2440 +2440 +2440 +4C40 +0000 +ENDCHAR +STARTCHAR U+809E +ENCODING 32926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7904 +4944 +4924 +49A4 +788C +4A88 +4AD8 +4C50 +7870 +4820 +4870 +48D8 +488C +C986 +9B03 +ENDCHAR +STARTCHAR U+809F +ENCODING 32927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +3EFC +2400 +2400 +2404 +3FFE +2480 +2480 +2484 +3CFE +2404 +2404 +4404 +4444 +9428 +0810 +ENDCHAR +STARTCHAR U+80A0 +ENCODING 32928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7FF8 +4820 +4840 +4880 +7904 +4BFE +4894 +4894 +7924 +4924 +4A44 +4C44 +4884 +4928 +9810 +ENDCHAR +STARTCHAR U+80A1 +ENCODING 32929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF0 +2490 +2490 +3C94 +2514 +260C +3DF8 +2488 +2490 +2460 +2460 +2590 +4E0C +0000 +ENDCHAR +STARTCHAR U+80A2 +ENCODING 32930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +27FC +3C40 +2440 +27F8 +3D08 +2490 +2490 +2460 +2460 +2590 +4E0C +0000 +ENDCHAR +STARTCHAR U+80A3 +ENCODING 32931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E10 +2228 +2244 +3E82 +2301 +227C +3E00 +2200 +22FE +2202 +2204 +2208 +4A10 +0420 +0000 +0000 +ENDCHAR +STARTCHAR U+80A4 +ENCODING 32932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E20 +2428 +25FC +2420 +3C20 +2424 +27FE +2420 +3C20 +2450 +2450 +2488 +2488 +4D06 +8604 +ENDCHAR +STARTCHAR U+80A5 +ENCODING 32933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2548 +2548 +2548 +3D48 +25F8 +2508 +3D00 +2500 +2500 +2504 +2504 +4CFC +0000 +ENDCHAR +STARTCHAR U+80A6 +ENCODING 32934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +7888 +498C +4904 +4B06 +7E03 +49FC +4844 +4844 +7844 +4844 +4844 +48C4 +488C +C988 +9B38 +ENDCHAR +STARTCHAR U+80A7 +ENCODING 32935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +4820 +4820 +4860 +7840 +48D0 +49D8 +4B4C +7E47 +4840 +4840 +4840 +4840 +C840 +9840 +ENDCHAR +STARTCHAR U+80A9 +ENCODING 32937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +0FF0 +0810 +0FF0 +0800 +0FF0 +1410 +17F0 +2410 +47F0 +0410 +0430 +0000 +ENDCHAR +STARTCHAR U+80AA +ENCODING 32938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +27FC +3C40 +2440 +2478 +3C48 +2448 +2488 +2488 +2508 +2608 +4C30 +0000 +ENDCHAR +STARTCHAR U+80AB +ENCODING 32939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E20 +2424 +27FE +2420 +3D24 +2524 +2524 +2524 +3DFC +2424 +2420 +4422 +4422 +941E +0800 +ENDCHAR +STARTCHAR U+80AC +ENCODING 32940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3C48 +2448 +27FC +2440 +3C40 +2460 +2460 +3C60 +24A0 +24A0 +2524 +2624 +4C1C +0000 +ENDCHAR +STARTCHAR U+80AD +ENCODING 32941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +3C40 +2440 +25F8 +2548 +3D48 +2548 +2568 +3D98 +2518 +2508 +2508 +2508 +4D18 +0000 +ENDCHAR +STARTCHAR U+80AE +ENCODING 32942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E20 +2404 +27FE +2410 +3CF8 +2490 +2490 +2490 +3C90 +2490 +2490 +2492 +4512 +960E +0800 +ENDCHAR +STARTCHAR U+80AF +ENCODING 32943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +09F0 +0900 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+80B1 +ENCODING 32945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +27FC +2440 +3C40 +24A0 +24A0 +3CA0 +2530 +2548 +2658 +25E4 +4C04 +0000 +ENDCHAR +STARTCHAR U+80B2 +ENCODING 32946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0220 +0470 +3F88 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+80B4 +ENCODING 32948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +01C0 +1F60 +0110 +7FFC +0200 +07F0 +0C10 +17F0 +6410 +07F0 +0410 +0410 +0430 +0000 +ENDCHAR +STARTCHAR U+80B5 +ENCODING 32949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E02 +22FC +2240 +3E40 +227F +2244 +3E44 +2244 +2244 +2244 +2284 +2204 +4A04 +0404 +0000 +0000 +ENDCHAR +STARTCHAR U+80B7 +ENCODING 32951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +3E80 +2480 +24FE +2482 +3D24 +2620 +2420 +2420 +3C20 +2450 +2450 +4488 +4488 +9506 +0A04 +ENDCHAR +STARTCHAR U+80B8 +ENCODING 32952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7888 +4888 +4888 +498C +7B06 +4E03 +4820 +4820 +7820 +4FFF +4820 +4820 +4820 +C820 +9820 +ENDCHAR +STARTCHAR U+80B9 +ENCODING 32953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7888 +4888 +498C +4B06 +7E03 +48F8 +4800 +4BFE +7840 +4880 +49FC +4804 +4804 +C80C +9838 +ENDCHAR +STARTCHAR U+80BA +ENCODING 32954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +2420 +27FC +3C20 +2420 +25FC +3D24 +2524 +2524 +2524 +252C +2420 +4C20 +0000 +ENDCHAR +STARTCHAR U+80BC +ENCODING 32956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0488 +3E88 +2488 +2488 +25FE +3C88 +2488 +2488 +27FE +3C88 +2488 +2488 +4488 +4508 +9508 +0A08 +ENDCHAR +STARTCHAR U+80BD +ENCODING 32957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E20 +2420 +2420 +2424 +3FFE +2420 +2450 +2450 +3C50 +2450 +2488 +44C8 +44A8 +9506 +0A04 +ENDCHAR +STARTCHAR U+80BE +ENCODING 32958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +4BF8 +4910 +48A0 +4840 +48A0 +4910 +4A0E +1FF4 +1010 +1FF0 +1010 +1FF0 +1010 +1050 +1020 +ENDCHAR +STARTCHAR U+80BF +ENCODING 32959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E20 +2420 +2424 +25FE +3D24 +2524 +2524 +2524 +3DFC +2524 +2420 +2420 +4420 +9420 +0820 +ENDCHAR +STARTCHAR U+80C0 +ENCODING 32960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +3E84 +2484 +2488 +2490 +3CA0 +2484 +27FE +24A0 +3CA0 +2490 +2490 +2488 +448E +94C4 +0880 +ENDCHAR +STARTCHAR U+80C1 +ENCODING 32961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +7C80 +4880 +4888 +4BFC +7888 +4888 +4A8C +4A8A +7A8A +4D08 +4908 +4908 +4A08 +4C28 +9810 +ENDCHAR +STARTCHAR U+80C2 +ENCODING 32962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3C20 +2424 +25FE +2524 +3D24 +2524 +25FC +2524 +3D24 +2524 +25FC +4524 +4420 +9420 +0820 +ENDCHAR +STARTCHAR U+80C3 +ENCODING 32963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2108 +3FF8 +2108 +3FF8 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+80C4 +ENCODING 32964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +2108 +3FF8 +2108 +3FF8 +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+80C5 +ENCODING 32965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C10 +2490 +24FE +2510 +3C10 +2410 +25FF +3C10 +2410 +2410 +2428 +2444 +2482 +4D01 +0000 +0000 +ENDCHAR +STARTCHAR U+80C6 +ENCODING 32966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF0 +2510 +2510 +3D10 +25F0 +2510 +3D10 +2510 +25F0 +2510 +2400 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+80C7 +ENCODING 32967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C48 +2448 +25FF +2449 +3C49 +25FF +2548 +3D48 +25FF +2449 +2449 +2489 +250A +4C08 +0000 +0000 +ENDCHAR +STARTCHAR U+80C8 +ENCODING 32968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +784C +4844 +4BFF +4840 +7840 +4844 +4844 +48EC +78A8 +49B8 +4910 +4B38 +4E6C +C8C6 +9983 +ENDCHAR +STARTCHAR U+80C9 +ENCODING 32969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E08 +2210 +2220 +227F +3E41 +2241 +2241 +3E7F +2241 +2241 +2241 +2241 +227F +4641 +0000 +0000 +ENDCHAR +STARTCHAR U+80CA +ENCODING 32970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E40 +2240 +227F +2281 +3E01 +227D +2245 +3E45 +227D +2245 +2201 +2201 +2202 +440C +0000 +0000 +ENDCHAR +STARTCHAR U+80CC +ENCODING 32972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +0488 +7CF0 +0480 +1C84 +647C +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+80CD +ENCODING 32973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +3E1C +25E0 +2510 +2550 +3D50 +2550 +2550 +2548 +3D48 +2548 +2544 +4554 +4554 +9672 +0800 +ENDCHAR +STARTCHAR U+80CE +ENCODING 32974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +2450 +3C88 +249C +27E4 +3C00 +25F8 +2508 +2508 +2508 +25F8 +4D08 +0000 +ENDCHAR +STARTCHAR U+80CF +ENCODING 32975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4820 +49FE +4920 +7920 +4920 +4920 +49FF +7821 +4861 +4861 +48A1 +4921 +CA23 +9826 +ENDCHAR +STARTCHAR U+80D0 +ENCODING 32976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F08 +2149 +2149 +2149 +3F49 +217F +2108 +3F08 +2149 +2149 +2149 +2149 +217F +4341 +0000 +0000 +ENDCHAR +STARTCHAR U+80D1 +ENCODING 32977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E00 +227F +2241 +3E41 +2241 +227F +3E41 +2200 +2200 +2222 +2222 +2222 +4A42 +0481 +0000 +0000 +ENDCHAR +STARTCHAR U+80D2 +ENCODING 32978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +4904 +4904 +4904 +79FC +4940 +4940 +494C +7978 +4940 +4B40 +4A40 +4E42 +C866 +983C +ENDCHAR +STARTCHAR U+80D4 +ENCODING 32980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +4846 +4F7C +4840 +4841 +4F63 +783E +C100 +3FFC +2244 +2D34 +2104 +2284 +2C74 +2004 +200C +ENDCHAR +STARTCHAR U+80D5 +ENCODING 32981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +7884 +4884 +4984 +497F +7904 +4B04 +4D24 +4934 +7914 +4904 +4904 +4904 +4904 +C904 +991C +ENDCHAR +STARTCHAR U+80D6 +ENCODING 32982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2550 +2548 +2644 +3FF8 +2440 +2440 +3FFC +2440 +2440 +2440 +2440 +4C40 +0000 +ENDCHAR +STARTCHAR U+80D7 +ENCODING 32983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E40 +24A0 +24A0 +2518 +3E36 +2440 +2488 +2510 +3C20 +2444 +2588 +4410 +4420 +94C0 +0B00 +ENDCHAR +STARTCHAR U+80D8 +ENCODING 32984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4820 +4BFF +4820 +7860 +48C4 +498C +48C8 +7858 +4830 +4864 +4846 +48C2 +C99F +9BF1 +ENDCHAR +STARTCHAR U+80D9 +ENCODING 32985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +2480 +24FC +2540 +3E40 +247C +2440 +3C40 +247C +2440 +2440 +2440 +4C40 +0000 +ENDCHAR +STARTCHAR U+80DA +ENCODING 32986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2420 +2420 +2440 +3C60 +24D0 +2548 +3E44 +2444 +2440 +2440 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+80DB +ENCODING 32987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2548 +2548 +25F8 +3D48 +2548 +25F8 +3D48 +2440 +2440 +2440 +2440 +4C40 +0000 +ENDCHAR +STARTCHAR U+80DC +ENCODING 32988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7C20 +4920 +4920 +4928 +79FC +4A20 +4C20 +4828 +79FC +4820 +4820 +4820 +4824 +4BFE +9800 +ENDCHAR +STARTCHAR U+80DD +ENCODING 32989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3C30 +25E0 +2520 +2520 +3DFC +2520 +2520 +3D20 +25D4 +2714 +240C +27FC +4C04 +0000 +ENDCHAR +STARTCHAR U+80DE +ENCODING 32990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +24FC +2504 +3DE4 +2624 +2424 +3DE4 +2538 +2500 +2500 +2504 +2504 +4CFC +0000 +ENDCHAR +STARTCHAR U+80E0 +ENCODING 32992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4820 +4BFE +4820 +7820 +4820 +4FFF +4840 +7840 +48C4 +4886 +4882 +499F +C9F1 +9B01 +ENDCHAR +STARTCHAR U+80E1 +ENCODING 32993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +7F88 +08F8 +0888 +0888 +3EF8 +2288 +2288 +2288 +3F08 +2308 +0218 +0000 +ENDCHAR +STARTCHAR U+80E3 +ENCODING 32995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C40 +2480 +25FF +2400 +3C10 +2490 +2490 +3DFF +2492 +2492 +2490 +2481 +2481 +4CFF +0000 +0000 +ENDCHAR +STARTCHAR U+80E4 +ENCODING 32996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1150 +1E50 +1290 +1150 +1FF0 +1030 +17D0 +1450 +17D0 +1450 +27D4 +2454 +44CC +0000 +ENDCHAR +STARTCHAR U+80E5 +ENCODING 32997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0910 +09F8 +1700 +61FC +0000 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+80E6 +ENCODING 32998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3C10 +2410 +24FE +3C92 +2492 +2492 +3DFF +2410 +2410 +2428 +2444 +2482 +4D01 +0000 +0000 +ENDCHAR +STARTCHAR U+80E7 +ENCODING 32999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +3EA0 +2490 +2494 +27FE +3CA0 +24A4 +24A4 +24A8 +3CA8 +24B0 +24A0 +4562 +4522 +961E +0800 +ENDCHAR +STARTCHAR U+80E8 +ENCODING 33000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E40 +2444 +27FE +2480 +3CA0 +2520 +2524 +27FE +3C20 +24A8 +24A4 +4526 +4622 +94A0 +0840 +ENDCHAR +STARTCHAR U+80E9 +ENCODING 33001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E40 +2448 +247C +2440 +3C40 +2444 +27FE +2440 +3C40 +2460 +2450 +444C +4444 +9440 +0840 +ENDCHAR +STARTCHAR U+80EA +ENCODING 33002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0424 +3E3E +2420 +2424 +25FE +3D04 +2504 +2504 +25FC +3D04 +2500 +2500 +4500 +4500 +9500 +0A00 +ENDCHAR +STARTCHAR U+80EB +ENCODING 33003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +3FFC +2408 +2410 +2420 +3C58 +2486 +2702 +2400 +3DFC +2420 +2420 +4420 +4424 +97FE +0800 +ENDCHAR +STARTCHAR U+80EC +ENCODING 33004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +FEFC +1208 +3450 +0C20 +32D8 +C106 +3FF8 +2108 +2288 +2448 +2108 +2288 +2448 +2018 +ENDCHAR +STARTCHAR U+80ED +ENCODING 33005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3DFE +2504 +2524 +2524 +3D24 +25FC +2524 +2524 +3D24 +2554 +254C +458C +4504 +95FC +0904 +ENDCHAR +STARTCHAR U+80EE +ENCODING 33006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +48FC +4984 +4B48 +7830 +48DC +4B87 +4810 +79FE +4890 +4890 +4BFF +4810 +C810 +9810 +ENDCHAR +STARTCHAR U+80EF +ENCODING 33007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +24A0 +2510 +3EE8 +2404 +27F8 +3C40 +2478 +2488 +2408 +2408 +4C30 +0000 +ENDCHAR +STARTCHAR U+80F0 +ENCODING 33008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7844 +4FFE +4840 +4BF8 +7848 +4BF8 +4A48 +4A40 +7BFE +4842 +484A +48A4 +4890 +890E +1E04 +ENDCHAR +STARTCHAR U+80F1 +ENCODING 33009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C48 +2648 +2550 +2560 +3C40 +27FC +24A0 +3CA0 +24A0 +2520 +2524 +2624 +4C1C +0000 +ENDCHAR +STARTCHAR U+80F2 +ENCODING 33010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E20 +2404 +27FE +2440 +3C48 +2488 +25F4 +2424 +3C48 +2488 +2510 +4428 +4444 +9482 +0902 +ENDCHAR +STARTCHAR U+80F3 +ENCODING 33011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E40 +247C +2484 +2488 +3D50 +2620 +2450 +248E +3D04 +26F8 +2488 +2488 +4488 +94F8 +0888 +ENDCHAR +STARTCHAR U+80F4 +ENCODING 33012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +2504 +2504 +3DFC +2504 +2574 +3D54 +2554 +2554 +2574 +2544 +2504 +4D0C +0000 +ENDCHAR +STARTCHAR U+80F5 +ENCODING 33013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7DFF +4420 +4444 +7C82 +45FF +4411 +7C10 +4414 +44FE +4410 +4410 +4412 +4DFF +0000 +0000 +ENDCHAR +STARTCHAR U+80F6 +ENCODING 33014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E20 +2424 +27FE +2400 +3C88 +2506 +2602 +2488 +3C50 +2420 +2450 +2450 +4488 +950E +0A04 +ENDCHAR +STARTCHAR U+80F8 +ENCODING 33016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +2480 +25FC +2524 +3E24 +25D4 +2574 +3DB4 +2514 +25F4 +2514 +2404 +4C18 +0000 +ENDCHAR +STARTCHAR U+80F9 +ENCODING 33017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFF +4820 +4840 +4BFF +7A49 +4A49 +4A49 +4A49 +7A49 +4A49 +4A49 +4A49 +4A49 +CA49 +9A03 +ENDCHAR +STARTCHAR U+80FA +ENCODING 33018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E20 +2400 +25FE +2502 +3E44 +2440 +27FE +2488 +3C88 +2508 +2490 +2460 +4450 +948C +0904 +ENDCHAR +STARTCHAR U+80FB +ENCODING 33019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +78BF +4880 +4900 +7A80 +48BF +4904 +4B04 +7904 +4904 +4904 +4904 +4904 +4914 +5908 +0000 +0000 +ENDCHAR +STARTCHAR U+80FC +ENCODING 33020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +3C88 +2490 +27FC +2490 +3C90 +2490 +27FC +3C90 +2490 +2490 +2510 +2510 +4E10 +0000 +ENDCHAR +STARTCHAR U+80FD +ENCODING 33021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0C4C +1270 +7D44 +0144 +3E3C +2240 +3E4C +2270 +3E40 +2244 +2244 +263C +0000 +ENDCHAR +STARTCHAR U+80FE +ENCODING 33022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +0826 +7F22 +0820 +FFFF +0020 +0820 +7FB2 +4896 +5494 +6B9C +4888 +549D +6395 +40B7 +41A2 +ENDCHAR +STARTCHAR U+8100 +ENCODING 33024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FE0 +0044 +1EB8 +0490 +388E +7FFF +0000 +0FF8 +0808 +0FF8 +0808 +0FF8 +1008 +2018 +0000 +0000 +ENDCHAR +STARTCHAR U+8101 +ENCODING 33025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +7850 +4A52 +4954 +78D8 +4850 +48D8 +7954 +4A52 +4850 +4850 +4850 +4891 +5B1F +0000 +0000 +ENDCHAR +STARTCHAR U+8102 +ENCODING 33026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3D18 +25E0 +2504 +2504 +3CFC +2400 +24F8 +3C88 +24F8 +2488 +2488 +24F8 +4C88 +0000 +ENDCHAR +STARTCHAR U+8103 +ENCODING 33027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4842 +48C2 +4986 +790C +4BFE +4A22 +4A22 +7A22 +4BFE +4A00 +4A00 +4A01 +CB03 +99FE +ENDCHAR +STARTCHAR U+8105 +ENCODING 33029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +0FC0 +0240 +0CC0 +7FF8 +1248 +2698 +4FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+8106 +ENCODING 33030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C78 +2490 +2520 +27FC +3D00 +2578 +2548 +3D48 +2570 +2540 +2544 +2644 +4C3C +0000 +ENDCHAR +STARTCHAR U+8107 +ENCODING 33031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +25F8 +2448 +3C48 +2488 +2530 +3D10 +27FC +2554 +2554 +2554 +2664 +4CCC +0000 +ENDCHAR +STARTCHAR U+8108 +ENCODING 33032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3DE0 +2500 +250C +3D70 +2564 +2564 +3D68 +2550 +2550 +2550 +2648 +2644 +4C40 +0000 +ENDCHAR +STARTCHAR U+8109 +ENCODING 33033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C20 +2420 +25C0 +2448 +3FE8 +24F0 +24E0 +3D50 +2550 +2648 +2444 +2440 +4CC0 +0000 +ENDCHAR +STARTCHAR U+810A +ENCODING 33034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3938 +0100 +3AB8 +0240 +0420 +1FF0 +682C +0FE0 +0820 +0FE0 +0820 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+810B +ENCODING 33035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +0304 +3C38 +0000 +FE7F +2211 +CC66 +0000 +3FFC +2004 +3FFC +2004 +3FFC +2004 +201C +ENDCHAR +STARTCHAR U+810D +ENCODING 33037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E20 +2450 +2488 +2506 +3E10 +24F8 +2400 +2404 +3FFE +2440 +2440 +4448 +4484 +95FC +0804 +ENDCHAR +STARTCHAR U+810E +ENCODING 33038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3D08 +2490 +2460 +2450 +3C8C +2524 +2420 +27FE +3C20 +24A8 +2526 +4622 +4420 +94A0 +0840 +ENDCHAR +STARTCHAR U+810F +ENCODING 33039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E14 +25FE +2500 +2510 +3D10 +2514 +25FE +2510 +3D10 +2510 +2510 +2510 +4514 +95FE +0A00 +ENDCHAR +STARTCHAR U+8110 +ENCODING 33040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7848 +4FFC +4910 +48A0 +7840 +48B0 +490E +4E14 +7910 +4910 +4910 +4910 +4A10 +8C10 +1810 +ENDCHAR +STARTCHAR U+8111 +ENCODING 33041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +7C40 +4804 +4FFE +4800 +7A14 +4B14 +4AA4 +4AA4 +7A44 +4AA4 +4B1C +4A0C +4A04 +4BFC +9A04 +ENDCHAR +STARTCHAR U+8112 +ENCODING 33042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E20 +2524 +24A4 +24A8 +3C20 +27FE +2420 +2460 +3C70 +24A8 +24A8 +4526 +4624 +9420 +0820 +ENDCHAR +STARTCHAR U+8113 +ENCODING 33043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C40 +4BFC +4A44 +4C48 +7880 +4884 +494C +4B50 +7D20 +4920 +4910 +490E +4944 +4980 +9900 +ENDCHAR +STARTCHAR U+8114 +ENCODING 33044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFE +0440 +1450 +244C +4544 +0100 +3FF8 +2288 +2468 +2928 +2288 +2468 +2828 +2028 +2010 +ENDCHAR +STARTCHAR U+8115 +ENCODING 33045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7C7F +4882 +4904 +79FF +4911 +4911 +79FF +4848 +4848 +4848 +4889 +4909 +5A0F +0000 +0000 +ENDCHAR +STARTCHAR U+8116 +ENCODING 33046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C48 +4BFC +4840 +4BFC +7A04 +4C08 +49F0 +4820 +7844 +4FFE +4840 +4840 +4840 +4940 +9880 +ENDCHAR +STARTCHAR U+8117 +ENCODING 33047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7900 +4BFE +4A52 +4C92 +7922 +4A46 +4884 +491C +7800 +49FC +4904 +4904 +4904 +C904 +99FC +ENDCHAR +STARTCHAR U+8118 +ENCODING 33048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +3E20 +25FE +2502 +2614 +3CF8 +2400 +2404 +27FE +3C90 +2490 +2490 +4492 +4512 +960E +0800 +ENDCHAR +STARTCHAR U+8119 +ENCODING 33049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +7C12 +4410 +45FF +7C10 +4492 +4454 +7C54 +4492 +4511 +4410 +4410 +5450 +0820 +0000 +0000 +ENDCHAR +STARTCHAR U+811A +ENCODING 33050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3938 +2928 +2FE8 +3928 +2928 +2FE8 +3928 +2928 +2AA8 +2AF8 +2F20 +2820 +5820 +0000 +ENDCHAR +STARTCHAR U+811B +ENCODING 33051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +24A8 +24A8 +2550 +3D50 +24A8 +2400 +3DF8 +2440 +2440 +2440 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+811C +ENCODING 33052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FF +4810 +4810 +4820 +78FE +4882 +4882 +48FE +7882 +4882 +48FE +4882 +4882 +C8FE +9882 +ENDCHAR +STARTCHAR U+811D +ENCODING 33053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4400 +44FE +7C82 +44FE +4400 +7CFE +4404 +4408 +4408 +4448 +5428 +4810 +0000 +0000 +ENDCHAR +STARTCHAR U+811E +ENCODING 33054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E20 +24A8 +24A8 +24A8 +3D74 +2622 +2420 +2428 +3DFC +2420 +2420 +4420 +4424 +97FE +0800 +ENDCHAR +STARTCHAR U+811F +ENCODING 33055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C02 +44FC +4454 +4492 +7D11 +4404 +4404 +7DFF +4404 +4484 +4444 +4404 +5414 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+8120 +ENCODING 33056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7B8E +48B8 +4888 +4908 +7BA8 +48AF +48A8 +48A8 +7AA8 +4AA8 +4BA8 +497F +4B80 +CAE0 +9E3F +ENDCHAR +STARTCHAR U+8121 +ENCODING 33057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7801 +4BBE +4888 +4908 +7A08 +4B08 +493E +7908 +4908 +4B08 +493E +4980 +4940 +523F +0000 +0000 +ENDCHAR +STARTCHAR U+8122 +ENCODING 33058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7902 +4BFF +4C00 +49FE +7922 +4912 +4BFF +7922 +4912 +4902 +49FF +4804 +5818 +0000 +0000 +ENDCHAR +STARTCHAR U+8123 +ENCODING 33059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1FF0 +1000 +1FFC +1490 +3760 +2C1C +5FF0 +1010 +1FF0 +1FF0 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+8124 +ENCODING 33060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FF +4900 +4900 +497E +7900 +4900 +49FF +4948 +7949 +494B +494A +4B4C +4A44 +CE76 +98C3 +ENDCHAR +STARTCHAR U+8125 +ENCODING 33061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +45FF +4410 +7C92 +4492 +4492 +7D55 +4410 +4410 +4428 +4444 +5482 +4901 +0000 +0000 +ENDCHAR +STARTCHAR U+8127 +ENCODING 33063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +78C4 +4884 +4BFE +4892 +7890 +499F +4B40 +487C +78C4 +498C +4B58 +4830 +4878 +C8CC +9B87 +ENDCHAR +STARTCHAR U+8129 +ENCODING 33065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08FC +1590 +1660 +34F0 +570C +14F8 +1488 +14F8 +1488 +14F8 +1488 +1098 +0000 +ENDCHAR +STARTCHAR U+812B +ENCODING 33067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +3C04 +2482 +2501 +27FE +3D02 +2502 +2502 +25FE +3C48 +2448 +2448 +2448 +2449 +448F +4D00 +ENDCHAR +STARTCHAR U+812C +ENCODING 33068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +3E1C +25E0 +2504 +24A4 +3CA8 +25FC +2410 +2420 +3C24 +27FE +2420 +4420 +4420 +94A0 +0840 +ENDCHAR +STARTCHAR U+812D +ENCODING 33069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +7EFF +4482 +4482 +7CFE +4400 +4402 +7CFC +4410 +4410 +44FE +4410 +5410 +49FF +0000 +0000 +ENDCHAR +STARTCHAR U+812F +ENCODING 33071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3C48 +27FC +2440 +25F8 +3D48 +2548 +25F8 +3D48 +2548 +25F8 +2548 +2548 +4D58 +0000 +ENDCHAR +STARTCHAR U+8130 +ENCODING 33072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4800 +4800 +49FC +7904 +4904 +4904 +49FC +7800 +4904 +498C +4888 +4808 +CBFE +9800 +ENDCHAR +STARTCHAR U+8131 +ENCODING 33073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +3C88 +2490 +25F8 +2508 +3D08 +25F8 +2568 +3C60 +2460 +24A0 +24A4 +2524 +4E1C +0000 +ENDCHAR +STARTCHAR U+8132 +ENCODING 33074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7BFE +4A04 +4A04 +4BFC +7A20 +4A24 +4BA8 +4AB0 +7AA8 +4AA8 +4AA4 +4B24 +4A22 +ACA0 +1040 +ENDCHAR +STARTCHAR U+8133 +ENCODING 33075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +3E48 +2548 +2510 +3C20 +2518 +2598 +3D68 +2528 +2558 +2598 +2508 +25F8 +4D08 +0000 +ENDCHAR +STARTCHAR U+8135 +ENCODING 33077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +4904 +4904 +4904 +79FC +4800 +4BFE +4820 +7820 +4FFF +4850 +4858 +48CC +C986 +9B03 +ENDCHAR +STARTCHAR U+8136 +ENCODING 33078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3DFE +2504 +2504 +2504 +3DFC +2420 +2424 +25FE +3D24 +2524 +2554 +458C +4504 +9514 +0908 +ENDCHAR +STARTCHAR U+8138 +ENCODING 33080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C40 +48A0 +48A0 +4910 +7A0E +4DF4 +4800 +4A88 +7A48 +4948 +4950 +4950 +4824 +4FFE +9800 +ENDCHAR +STARTCHAR U+8139 +ENCODING 33081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF8 +2480 +24F0 +3C80 +24F0 +2480 +3FFC +24C8 +24A8 +2490 +24B0 +24C8 +4F04 +0000 +ENDCHAR +STARTCHAR U+813A +ENCODING 33082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +49FE +4800 +4884 +7884 +49CE +4B7B +4800 +7820 +4BFF +4820 +4820 +4820 +C820 +9820 +ENDCHAR +STARTCHAR U+813C +ENCODING 33084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +4820 +4820 +4BFE +7A22 +4A22 +4BBA +4AAA +7AAA +4AAA +4B76 +4A22 +4A22 +CA22 +9A26 +ENDCHAR +STARTCHAR U+813D +ENCODING 33085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C48 +2488 +25FF +2688 +3C88 +24FF +2488 +2488 +3CFF +2488 +2488 +2488 +24FF +4480 +0000 +0000 +ENDCHAR +STARTCHAR U+813E +ENCODING 33086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C80 +25F8 +2548 +25F8 +3D48 +2548 +25F8 +3C50 +2490 +27FC +2410 +2410 +4C10 +0000 +ENDCHAR +STARTCHAR U+8143 +ENCODING 33091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C92 +4454 +4438 +45FF +7C10 +45FF +4428 +4444 +7CFE +4545 +4444 +4449 +4441 +4C7F +0000 +0000 +ENDCHAR +STARTCHAR U+8144 +ENCODING 33092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C02 +24FC +2410 +2410 +3DFF +2454 +2454 +25FF +3C54 +2454 +25FF +2410 +2410 +4DFF +0000 +0000 +ENDCHAR +STARTCHAR U+8145 +ENCODING 33093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7922 +4926 +4B74 +4A50 +78D8 +498C +4B27 +4820 +7922 +4926 +4B74 +4A50 +48D8 +C98C +9B07 +ENDCHAR +STARTCHAR U+8146 +ENCODING 33094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +38A0 +28A0 +2BF8 +2AA8 +3AA8 +2BF8 +2AA8 +3AA8 +2FFC +28A0 +2890 +2908 +5A08 +0000 +ENDCHAR +STARTCHAR U+8147 +ENCODING 33095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +7BFC +4820 +4FFF +48A8 +79AC +4B26 +4E23 +4820 +7840 +4FFF +4888 +4918 +4BF0 +C85C +9B86 +ENDCHAR +STARTCHAR U+8148 +ENCODING 33096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3E24 +27FE +2420 +25FC +3C20 +27FE +2400 +25FC +3D04 +25FC +2504 +45FC +4504 +9514 +0908 +ENDCHAR +STARTCHAR U+814A +ENCODING 33098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0890 +7C90 +4890 +4BFC +4890 +7894 +4FFE +4808 +49FC +7908 +4908 +49F8 +4908 +4908 +89F8 +1908 +ENDCHAR +STARTCHAR U+814B +ENCODING 33099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +24A0 +24A0 +3D38 +2548 +2768 +3DD0 +2550 +2520 +2550 +2588 +4D04 +0000 +ENDCHAR +STARTCHAR U+814C +ENCODING 33100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C40 +4844 +4FFE +48A0 +7910 +4A48 +4FFE +4A48 +7BF8 +4A48 +4BF8 +4A48 +4840 +A844 +103C +ENDCHAR +STARTCHAR U+814D +ENCODING 33101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +4428 +4444 +4482 +7D39 +4400 +44FE +4404 +4408 +7D32 +4549 +4540 +4442 +4C7E +0000 +0000 +ENDCHAR +STARTCHAR U+814E +ENCODING 33102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +3E50 +2260 +3F90 +3F0C +2FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+814F +ENCODING 33103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FDF +4C51 +4C51 +7A8A +4904 +4A8A +4C51 +7FDF +4C51 +4C51 +4C51 +4A8A +4904 +5EDB +0000 +0000 +ENDCHAR +STARTCHAR U+8150 +ENCODING 33104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1110 +13FC +1690 +1A50 +1250 +12B0 +2FF8 +29C8 +4AA8 +0948 +0A28 +0818 +0000 +ENDCHAR +STARTCHAR U+8151 +ENCODING 33105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3820 +2BFC +2A48 +2A48 +3A88 +2AFC +2BC8 +3AA8 +2AA8 +2A88 +2C88 +2C88 +5898 +0000 +ENDCHAR +STARTCHAR U+8152 +ENCODING 33106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4A02 +4A02 +4BFE +7A10 +4A10 +4BFF +4A10 +7A10 +4AFE +4A82 +4A82 +4C82 +C882 +98FE +ENDCHAR +STARTCHAR U+8153 +ENCODING 33107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3CA0 +24A0 +27BC +24A0 +3CA0 +27BC +24A0 +3CE0 +27BC +24A0 +2520 +2520 +4E20 +0000 +ENDCHAR +STARTCHAR U+8154 +ENCODING 33108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +26A8 +24A0 +3CA8 +2518 +2600 +3FF8 +2440 +2440 +2440 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+8155 +ENCODING 33109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2608 +2500 +3DF8 +2568 +2768 +3EE8 +24B8 +24A0 +2524 +2624 +4C1C +0000 +ENDCHAR +STARTCHAR U+8157 +ENCODING 33111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BFE +4A22 +4A22 +4BFE +7A22 +4A22 +4BFE +4800 +7BFF +4844 +4844 +48C4 +4884 +C984 +9B04 +ENDCHAR +STARTCHAR U+8159 +ENCODING 33113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A20 +4BFE +4A02 +4C04 +79FC +4800 +4804 +4BFE +7820 +4920 +4928 +4926 +4A22 +A8A0 +1040 +ENDCHAR +STARTCHAR U+815A +ENCODING 33114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7820 +4BFE +4A02 +4C04 +7800 +4BFE +4820 +4820 +7928 +493C +4920 +4920 +4AA6 +AC7C +1000 +ENDCHAR +STARTCHAR U+815B +ENCODING 33115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3DFF +2501 +2501 +25FF +3D00 +257E +2510 +2522 +3D7E +2508 +253E +2508 +2608 +4C7F +0000 +0000 +ENDCHAR +STARTCHAR U+815C +ENCODING 33116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0444 +3DFF +2444 +247C +3C44 +247C +2410 +3DFF +2410 +2454 +2492 +2511 +2410 +4C10 +0000 +0000 +ENDCHAR +STARTCHAR U+815E +ENCODING 33118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C20 +243C +2444 +24F8 +3C10 +27FF +2441 +3CFA +252C +265C +24AA +2449 +2488 +4C30 +0000 +0000 +ENDCHAR +STARTCHAR U+815F +ENCODING 33119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2608 +27FC +3C50 +2488 +27F4 +3C40 +25F8 +2440 +2440 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+8160 +ENCODING 33120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C48 +4BFC +4840 +4BFC +7840 +4FFE +48A0 +4910 +7BF8 +4C46 +4BF8 +4840 +48A0 +A898 +1308 +ENDCHAR +STARTCHAR U+8161 +ENCODING 33121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +4904 +493C +4924 +7924 +4924 +4BFE +4A02 +7A7A +4A4A +4A4A +4A4A +4A7A +CA02 +9A06 +ENDCHAR +STARTCHAR U+8162 +ENCODING 33122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3CFE +2492 +24FE +2492 +3CFE +2492 +2410 +3DFF +2511 +2511 +2515 +257D +2501 +4D03 +0000 +0000 +ENDCHAR +STARTCHAR U+8164 +ENCODING 33124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3C10 +25FF +2444 +3C44 +2444 +25FF +3C00 +24FE +2482 +24FE +2482 +24FE +4C82 +0000 +0000 +ENDCHAR +STARTCHAR U+8165 +ENCODING 33125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2508 +25F8 +2508 +3DF8 +24A0 +24A0 +3DFC +2620 +25F8 +2420 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+8166 +ENCODING 33126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A8 +3CA8 +2550 +2550 +24A8 +3C40 +25F8 +2528 +3DE8 +2528 +2558 +2588 +25F8 +4D08 +0000 +ENDCHAR +STARTCHAR U+8167 +ENCODING 33127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C40 +48A0 +4910 +4BF8 +7C06 +4BC4 +4A54 +4A54 +7BD4 +4A54 +4A54 +4BD4 +4A44 +AA54 +12C8 +ENDCHAR +STARTCHAR U+8168 +ENCODING 33128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7A21 +4A21 +4A21 +4BFF +7800 +4BFF +4820 +4840 +7BFF +4A49 +4A49 +4A49 +4A49 +CA49 +9A4B +ENDCHAR +STARTCHAR U+8169 +ENCODING 33129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3C24 +27FE +2420 +2424 +3DFE +2504 +2554 +25FC +3D24 +2524 +25FC +4524 +4524 +9524 +090C +ENDCHAR +STARTCHAR U+816B +ENCODING 33131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3BF0 +2840 +2FFC +3840 +2BF8 +2A48 +3BF8 +2A48 +2BF8 +2840 +2BF8 +2840 +4FFC +0000 +ENDCHAR +STARTCHAR U+816D +ENCODING 33133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7BBC +4AA8 +4AA8 +4BB8 +7800 +4BF8 +4800 +4FFE +7900 +49F8 +4808 +4808 +4888 +A850 +1020 +ENDCHAR +STARTCHAR U+816E +ENCODING 33134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2548 +2548 +25F8 +3D48 +2548 +25F8 +3C40 +25A8 +25A4 +2684 +2490 +4C70 +0000 +ENDCHAR +STARTCHAR U+816F +ENCODING 33135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +783C +4BE0 +4A10 +4BFF +7A10 +4AFE +4A82 +4A82 +7AFE +4A82 +4A82 +4AFE +4C82 +C882 +98FE +ENDCHAR +STARTCHAR U+8170 +ENCODING 33136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +28A0 +2BF8 +2AA8 +3AA8 +2BF8 +2840 +3FFC +2890 +29D0 +2820 +28D0 +5B08 +0000 +ENDCHAR +STARTCHAR U+8171 +ENCODING 33137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3820 +2FF8 +2928 +2AFC +3A28 +2FF8 +2920 +3DF8 +2D20 +2BFC +2B20 +2CE0 +583C +0000 +ENDCHAR +STARTCHAR U+8172 +ENCODING 33138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3CFE +2492 +2492 +24FE +3C92 +2492 +24FE +3C00 +25FF +2492 +2494 +2488 +2484 +4DE3 +0000 +0000 +ENDCHAR +STARTCHAR U+8173 +ENCODING 33139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +F000 +929E +9452 +9012 +F012 +9292 +9452 +F012 +97D6 +9452 +9450 +97D0 +9450 +2010 +0000 +0000 +ENDCHAR +STARTCHAR U+8174 +ENCODING 33140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3D58 +2648 +2648 +2758 +3E48 +2648 +2758 +3E48 +2460 +24A0 +2490 +2508 +4E04 +0000 +ENDCHAR +STARTCHAR U+8176 +ENCODING 33142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C2E +27CA +250A +250A +3DEB +2510 +250F +3DE1 +2509 +2509 +27EA +2504 +250A +4D11 +0000 +0000 +ENDCHAR +STARTCHAR U+8177 +ENCODING 33143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4800 +49FC +4904 +7904 +49FC +4800 +4800 +7BFE +4A22 +4A22 +4BFE +4A22 +CA22 +9BFE +ENDCHAR +STARTCHAR U+8178 +ENCODING 33144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF0 +2510 +25F0 +2510 +3DF0 +2400 +27FC +3D00 +25F8 +26A8 +2528 +2648 +4CB0 +0000 +ENDCHAR +STARTCHAR U+8179 +ENCODING 33145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +24FC +25F8 +3E88 +24F8 +2488 +3CF8 +2440 +24F8 +2750 +2420 +24D0 +4F0C +0000 +ENDCHAR +STARTCHAR U+817A +ENCODING 33146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C40 +25F8 +2508 +25F8 +3D08 +25F8 +2420 +3DE4 +2478 +24B0 +2528 +2624 +4C60 +0000 +ENDCHAR +STARTCHAR U+817B +ENCODING 33147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +7810 +4FFE +4810 +4BD0 +7810 +4FF0 +4810 +4BE8 +7A28 +4AA8 +4AA8 +4AAA +4AAA +494A +9A24 +ENDCHAR +STARTCHAR U+817C +ENCODING 33148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7C04 +4BFE +4840 +4884 +7BFE +4A94 +4A94 +4AF4 +7A94 +4A94 +4AF4 +4A94 +4A94 +ABFC +1204 +ENDCHAR +STARTCHAR U+817D +ENCODING 33149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7DFC +4908 +4908 +49F8 +7908 +4908 +49F8 +4800 +7BFC +4A94 +4A94 +4A94 +4A94 +AFFE +1000 +ENDCHAR +STARTCHAR U+817E +ENCODING 33150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A48 +4950 +4BFC +4880 +7FFE +4910 +4A0E +4DF4 +7810 +4914 +49FE +4804 +4FE4 +8814 +1808 +ENDCHAR +STARTCHAR U+817F +ENCODING 33151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3E78 +2548 +2548 +2478 +3C48 +2478 +2764 +3D58 +2550 +2568 +2584 +2680 +4C7C +0000 +ENDCHAR +STARTCHAR U+8180 +ENCODING 33152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2510 +24A0 +3FFC +2648 +27FC +3C40 +2478 +2448 +2488 +2508 +4E30 +0000 +ENDCHAR +STARTCHAR U+8181 +ENCODING 33153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +7888 +4FFF +4890 +4BFE +7892 +4892 +4FFF +4892 +7892 +4BFE +4898 +4994 +4A96 +CC93 +9890 +ENDCHAR +STARTCHAR U+8182 +ENCODING 33154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +7EFC +1120 +1EE8 +1490 +24E8 +3984 +4FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+8183 +ENCODING 33155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2528 +2528 +2558 +3D88 +25F8 +2400 +3DF8 +2568 +2568 +2568 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+8184 +ENCODING 33156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +79A0 +4B2E +4A22 +4A22 +7BAE +4A22 +4A22 +4BFE +7820 +4FFE +4904 +4898 +4870 +C9DC +9F07 +ENDCHAR +STARTCHAR U+8185 +ENCODING 33157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4BFF +4A10 +4AFE +7A12 +4BFF +4A12 +4A12 +7AFE +4A00 +4AFE +4A82 +4C82 +C882 +98FE +ENDCHAR +STARTCHAR U+8186 +ENCODING 33158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BFE +4820 +49FC +4820 +7FFF +4820 +4848 +4990 +7864 +4BFE +4822 +48A8 +49AC +CB26 +9820 +ENDCHAR +STARTCHAR U+8187 +ENCODING 33159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C08 +2510 +253E +24E2 +3C22 +25BE +24A0 +24A0 +3D3E +2522 +24A2 +24BE +24C0 +4D3F +0000 +0000 +ENDCHAR +STARTCHAR U+8188 +ENCODING 33160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3BF8 +2800 +29F0 +2910 +39F0 +2800 +2BF8 +3AA8 +2B38 +2AE8 +2A48 +2A48 +5A18 +0000 +ENDCHAR +STARTCHAR U+8189 +ENCODING 33161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3D01 +2482 +2444 +3DFF +2428 +2444 +3C82 +2501 +26FE +24AA +24AA +24AA +24AA +4DFF +0000 +0000 +ENDCHAR +STARTCHAR U+818A +ENCODING 33162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3FFC +25F8 +2548 +25F8 +3D48 +25F8 +2548 +3D58 +2410 +27FC +2510 +2490 +4C30 +0000 +ENDCHAR +STARTCHAR U+818B +ENCODING 33163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2952 +2A54 +1428 +2244 +0000 +7FFE +4002 +4002 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1038 +ENDCHAR +STARTCHAR U+818C +ENCODING 33164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C10 +2492 +2454 +2511 +3CAA +2444 +24FE +2583 +3CFE +2482 +24FE +2482 +2482 +4D06 +0000 +0000 +ENDCHAR +STARTCHAR U+818D +ENCODING 33165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C40 +2480 +25FE +26C6 +3CAA +2492 +24AA +24C6 +3CFE +2508 +2508 +25CE +2529 +4DEF +0000 +0000 +ENDCHAR +STARTCHAR U+818E +ENCODING 33166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +783C +49E1 +4A33 +4B12 +7940 +4890 +4920 +48C4 +787E +4BC3 +4820 +4BFF +4850 +C88C +9B07 +ENDCHAR +STARTCHAR U+818F +ENCODING 33167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +07C0 +0440 +07C0 +3FFC +27C8 +47C0 +0FE0 +0820 +0FE0 +0FE0 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+8190 +ENCODING 33168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +FEFF +2180 +3C7E +2449 +644A +446C +DCC6 +0103 +3FFC +2244 +2D34 +2284 +2C74 +2004 +200C +ENDCHAR +STARTCHAR U+8191 +ENCODING 33169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C20 +4BFE +4A02 +4C34 +79C0 +4908 +49FC +4910 +7910 +4914 +4FFE +4800 +4890 +A90C +1204 +ENDCHAR +STARTCHAR U+8193 +ENCODING 33171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +25FC +27F0 +2510 +3DF0 +2510 +25F0 +3FFC +2500 +25F8 +26A8 +2548 +4CB0 +0000 +ENDCHAR +STARTCHAR U+8195 +ENCODING 33173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3BF8 +2A38 +2A28 +2BF8 +3A28 +2BE8 +2B78 +3BF8 +2A68 +2BB8 +2A58 +2BF8 +5A08 +0000 +ENDCHAR +STARTCHAR U+8196 +ENCODING 33174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7A3E +4B62 +4954 +481C +7836 +48E3 +4808 +4F7F +7908 +497F +4908 +497F +4908 +CB80 +9E7F +ENDCHAR +STARTCHAR U+8197 +ENCODING 33175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3D11 +25FF +2428 +2448 +3CFF +2548 +247E +2448 +3C48 +247E +2448 +2448 +447F +0000 +0000 +ENDCHAR +STARTCHAR U+8198 +ENCODING 33176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7BFE +4850 +4854 +49FE +7954 +4954 +49FC +4800 +79FC +4800 +4BFE +48A8 +4924 +4A22 +9860 +ENDCHAR +STARTCHAR U+8199 +ENCODING 33177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7B90 +4890 +48A1 +48FF +7B88 +4A08 +4A7F +7BC9 +48C9 +48FF +4888 +4888 +4889 +5B7F +0000 +0000 +ENDCHAR +STARTCHAR U+819A +ENCODING 33178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F0 +1FFC +1728 +11E0 +17F8 +17F8 +1488 +17F8 +13F0 +2210 +23F0 +43F0 +0230 +0000 +ENDCHAR +STARTCHAR U+819B +ENCODING 33179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7D24 +48A8 +4BFE +4A02 +7DFC +4904 +4904 +49FC +7820 +4828 +49FC +4820 +4824 +8BFE +1800 +ENDCHAR +STARTCHAR U+819C +ENCODING 33180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3C90 +27FC +2490 +25F8 +3D08 +25F8 +2508 +3DF8 +2440 +27FC +24A0 +2510 +4E0C +0000 +ENDCHAR +STARTCHAR U+819D +ENCODING 33181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +24E0 +3D50 +264C +24A0 +3F58 +264C +2550 +24E0 +2758 +2444 +4CC0 +0000 +ENDCHAR +STARTCHAR U+819E +ENCODING 33182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4FFF +4820 +4BFE +7A22 +4BFE +4A22 +4BFE +7824 +48FE +4F83 +4804 +4FFF +C904 +989C +ENDCHAR +STARTCHAR U+819F +ENCODING 33183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C10 +25FF +2410 +2521 +3CC6 +2478 +2408 +3C92 +2525 +247C +2410 +25FF +2410 +4C10 +0000 +0000 +ENDCHAR +STARTCHAR U+81A0 +ENCODING 33184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +25A8 +26D8 +25A8 +3EC8 +2440 +25B0 +3E4C +25A0 +2448 +2590 +2460 +4F80 +0000 +ENDCHAR +STARTCHAR U+81A2 +ENCODING 33186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +79FC +4924 +4FFF +4924 +79FC +4820 +49FC +4924 +79FC +4840 +4FFF +4884 +49C8 +C878 +9BCE +ENDCHAR +STARTCHAR U+81A3 +ENCODING 33187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +26A8 +24A4 +3D1C +27F8 +2490 +3DF8 +2440 +25F8 +2440 +27FC +4C00 +0000 +ENDCHAR +STARTCHAR U+81A4 +ENCODING 33188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2440 +27FC +2648 +3F58 +2758 +2400 +3DF8 +2408 +27FC +2408 +25F8 +4C08 +0000 +ENDCHAR +STARTCHAR U+81A6 +ENCODING 33190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A48 +4950 +4FFC +48E0 +7950 +4A48 +4A08 +4BBE +7AA8 +4CA8 +4B28 +497E +4A08 +AC08 +1008 +ENDCHAR +STARTCHAR U+81A7 +ENCODING 33191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C10 +25FF +2444 +25FF +3C00 +24FE +2492 +24FE +3C92 +24FE +2410 +24FE +2410 +4DFF +0000 +0000 +ENDCHAR +STARTCHAR U+81A8 +ENCODING 33192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +3908 +2FD0 +2910 +2FE0 +3808 +2BC8 +2A50 +3BE4 +2A44 +2988 +29C8 +2E10 +5820 +0000 +ENDCHAR +STARTCHAR U+81A9 +ENCODING 33193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0028 +3824 +2FFC +2BE0 +2820 +3FE0 +2BE0 +2A50 +3BD0 +2BD4 +2A4C +2BCC +2984 +5A44 +0000 +ENDCHAR +STARTCHAR U+81AA +ENCODING 33194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7DFC +4888 +4850 +4BFE +7A22 +4DFC +4924 +4924 +792C +4820 +49FC +4904 +4904 +A9FC +1104 +ENDCHAR +STARTCHAR U+81AB +ENCODING 33195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7820 +4FFF +4850 +4C89 +7B06 +4BFE +4D05 +49FC +7904 +49FC +4820 +48A8 +4924 +5A62 +0000 +0000 +ENDCHAR +STARTCHAR U+81AC +ENCODING 33196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7804 +48F8 +49FC +4820 +79FC +4821 +483F +4841 +7B9E +4BDE +4908 +4BDE +4929 +59EF +0000 +0000 +ENDCHAR +STARTCHAR U+81AE +ENCODING 33198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +79FC +4820 +4BFE +4800 +7904 +4FDF +4904 +49C4 +7F1F +4800 +4FFF +4888 +4889 +C989 +9F07 +ENDCHAR +STARTCHAR U+81B0 +ENCODING 33200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3FE8 +2548 +24D0 +27FC +3CE0 +2550 +264C +3DF8 +2548 +25F8 +2548 +25F8 +4D08 +0000 +ENDCHAR +STARTCHAR U+81B1 +ENCODING 33201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7908 +4888 +4FEA +4A49 +7A48 +4FFF +4808 +4BC8 +7A49 +4BC9 +4A4A +4BC5 +4A4B +5811 +0000 +0000 +ENDCHAR +STARTCHAR U+81B2 +ENCODING 33202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +7890 +49FE +4920 +4B20 +7DFC +4920 +4920 +49FC +7920 +4920 +49FE +4800 +4954 +CB56 +9E53 +ENDCHAR +STARTCHAR U+81B3 +ENCODING 33203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3CA0 +27FC +2440 +25F8 +3C40 +27FC +2550 +3FFC +2400 +25F8 +2508 +25F8 +4D08 +0000 +ENDCHAR +STARTCHAR U+81B4 +ENCODING 33204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7880 +49FF +4BAA +48AA +78AA +4BFF +48AA +48AA +78AA +4BFF +4800 +4800 +48AA +C9AB +9B29 +ENDCHAR +STARTCHAR U+81B5 +ENCODING 33205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3C90 +27FC +24D0 +2440 +3FFC +2550 +2550 +3EE8 +2440 +27FC +2440 +2440 +4C40 +0000 +ENDCHAR +STARTCHAR U+81B7 +ENCODING 33207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7440 +544F +54F9 +5999 +7FFA +529C +54FA +7989 +5F89 +518D +52CA +54A8 +58D8 +5088 +0000 +0000 +ENDCHAR +STARTCHAR U+81B8 +ENCODING 33208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +3DFC +2540 +2478 +2690 +3DFC +2578 +2448 +3F78 +2548 +2578 +2548 +26D8 +4C7C +0000 +ENDCHAR +STARTCHAR U+81B9 +ENCODING 33209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C10 +25FF +2454 +25FF +3C44 +24FE +2482 +24FE +3C82 +24FE +2482 +24FE +2444 +4C82 +0000 +0000 +ENDCHAR +STARTCHAR U+81BA +ENCODING 33210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1290 +12FC +15F8 +1EF8 +1490 +14FC +13F0 +1210 +13F0 +23F0 +2210 +4230 +0000 +ENDCHAR +STARTCHAR U+81BB +ENCODING 33211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7FFE +4800 +4BFC +4A94 +7AF4 +4A94 +4BFC +4800 +7BFC +4A04 +4BFC +4A04 +4BFC +A800 +17FE +ENDCHAR +STARTCHAR U+81BC +ENCODING 33212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C3E +2622 +252E +3C2A +277F +2541 +265D +3D55 +2555 +255D +2541 +2543 +2680 +4C7F +0000 +0000 +ENDCHAR +STARTCHAR U+81BD +ENCODING 33213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3CF0 +2520 +27FC +2554 +3D8C +2570 +25FC +3D70 +2570 +25F8 +2688 +26F8 +4C88 +0000 +ENDCHAR +STARTCHAR U+81BE +ENCODING 33214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3CA0 +25F0 +2608 +27FC +3F58 +26E8 +27F8 +3DF0 +2510 +25F0 +2510 +25F0 +4D10 +0000 +ENDCHAR +STARTCHAR U+81BF +ENCODING 33215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3BF8 +2AA8 +2BF8 +3AA8 +2BF8 +2BFC +3AF8 +2A00 +2BFC +2AC8 +2AB0 +2CD0 +5B0C +0000 +ENDCHAR +STARTCHAR U+81C0 +ENCODING 33216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F70 +2154 +3F9C +3FF8 +2A50 +3F30 +52CC +3FF0 +1010 +1FF0 +1FF0 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+81C1 +ENCODING 33217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C24 +4BFE +4A88 +4BFE +7A50 +4BFC +4A54 +4BFE +7A54 +4BFC +4A50 +4AD8 +4AD4 +AD52 +1050 +ENDCHAR +STARTCHAR U+81C2 +ENCODING 33218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EF8 +2250 +3FFC +3E20 +32F8 +5E20 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+81C3 +ENCODING 33219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7824 +4FFE +4910 +4A28 +7ABE +4F68 +4928 +4ABE +7CA8 +4FA8 +48BE +48A8 +4928 +4A3E +9C20 +ENDCHAR +STARTCHAR U+81C4 +ENCODING 33220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C1C +2410 +25FF +2511 +3D7E +251C +257C +3D10 +257A +252C +25DA +2669 +2408 +4C10 +0000 +0000 +ENDCHAR +STARTCHAR U+81C5 +ENCODING 33221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4A92 +4A92 +4BFE +7900 +4BFF +4E41 +49F9 +7949 +4949 +49F9 +4851 +48FB +CB8A +9806 +ENDCHAR +STARTCHAR U+81C6 +ENCODING 33222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FFC +2490 +27FC +3C00 +25F8 +2508 +3DF8 +2508 +25F8 +24A8 +25A4 +2694 +4C70 +0000 +ENDCHAR +STARTCHAR U+81C7 +ENCODING 33223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C48 +24FF +2588 +3CFE +2488 +24FE +2488 +3CFF +2400 +25CF +2549 +2579 +2501 +4D03 +0000 +0000 +ENDCHAR +STARTCHAR U+81C8 +ENCODING 33224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3CA0 +27FC +25F0 +2510 +3DF0 +2510 +25F0 +3CF8 +2748 +2568 +2598 +25F8 +4D30 +0000 +ENDCHAR +STARTCHAR U+81C9 +ENCODING 33225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +24A0 +2510 +27F8 +3C04 +27B8 +26A8 +3EA8 +27B8 +2510 +2598 +2664 +4C44 +0000 +ENDCHAR +STARTCHAR U+81CA +ENCODING 33226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +7D04 +4904 +49FC +4800 +7BDE +4A52 +4A52 +4BDE +7820 +4FFE +4870 +48A8 +492E +AA24 +1020 +ENDCHAR +STARTCHAR U+81CB +ENCODING 33227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F3C +4124 +7F47 +5200 +7F7E +5222 +FF9C +9263 +2100 +3FFC +2244 +2D34 +2284 +2C74 +2004 +200C +ENDCHAR +STARTCHAR U+81CC +ENCODING 33228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7908 +4FC8 +493E +4B88 +7808 +4BBE +4AA2 +4AA2 +7A94 +4B94 +4808 +4A88 +49D4 +AE14 +1062 +ENDCHAR +STARTCHAR U+81CD +ENCODING 33229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3840 +2FFC +28A4 +2FF8 +3AE8 +2BF8 +2C44 +3910 +29F0 +2910 +29F0 +2A10 +5C10 +0000 +ENDCHAR +STARTCHAR U+81CE +ENCODING 33230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BDE +4842 +494A +48C6 +794A +4842 +4820 +4BFE +7888 +498C +4B56 +4820 +4BFF +C820 +9820 +ENDCHAR +STARTCHAR U+81CF +ENCODING 33231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BFF +4A01 +49FE +48A4 +7B2B +4830 +49FE +4F02 +79FE +4902 +49FE +4902 +49FE +C884 +9B03 +ENDCHAR +STARTCHAR U+81D0 +ENCODING 33232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C04 +2478 +2410 +25FF +3C10 +24FE +24D6 +24BA +3CFE +2410 +24FE +2410 +25FF +4D29 +0000 +0000 +ENDCHAR +STARTCHAR U+81D1 +ENCODING 33233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3BF8 +2840 +2BFC +2A48 +3F58 +2B58 +2840 +3BF8 +2880 +2BF8 +2AA8 +2AA8 +5AB8 +0000 +ENDCHAR +STARTCHAR U+81D2 +ENCODING 33234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C44 +25FF +2454 +24FE +3D88 +24FE +2488 +24FE +3C88 +24FE +24FE +2444 +2438 +4DC7 +0000 +0000 +ENDCHAR +STARTCHAR U+81D3 +ENCODING 33235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +3FFC +2928 +2824 +3BFC +2A20 +2BE8 +3BA8 +2BE8 +2B50 +2BD4 +2B9C +2DEC +5844 +0000 +ENDCHAR +STARTCHAR U+81D5 +ENCODING 33237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7BFF +4A48 +4BFF +4A49 +7A49 +4BFF +4A88 +4AEF +7A88 +4AA9 +4A67 +4A00 +4CAA +C9AB +9929 +ENDCHAR +STARTCHAR U+81D7 +ENCODING 33239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BFF +4A51 +49FD +4850 +79FC +4904 +49FC +4904 +79FC +4904 +4904 +49FC +4890 +C999 +9B0F +ENDCHAR +STARTCHAR U+81D8 +ENCODING 33240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0248 +3A48 +2C90 +2A48 +2BF8 +3A68 +2AE8 +2BF8 +3B68 +2AD8 +2B68 +2AD8 +2B6C +5EC4 +0000 +ENDCHAR +STARTCHAR U+81D9 +ENCODING 33241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3FFC +28A0 +28E0 +2910 +3FF4 +29B8 +29B0 +3BF4 +2DAC +2800 +2AA8 +2A54 +5C54 +0000 +ENDCHAR +STARTCHAR U+81DA +ENCODING 33242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3878 +2BFC +2A68 +2BB8 +3AF8 +2AA8 +2AF8 +3AA8 +2AF8 +2BF8 +2B68 +2D68 +5BFC +0000 +ENDCHAR +STARTCHAR U+81DB +ENCODING 33243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03FE +7820 +4BFE +4A22 +4AAA +7A22 +48A8 +4800 +4888 +79FE +4B10 +4DFC +4910 +49FC +C910 +99FF +ENDCHAR +STARTCHAR U+81DD +ENCODING 33245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +1000 +1FFC +0000 +1FF8 +1008 +1FF8 +0000 +7BEE +4AAA +7BEA +4AAE +7BEA +49CA +9AAB +ENDCHAR +STARTCHAR U+81DE +ENCODING 33246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BDF +4841 +4BDF +4841 +7BDF +4908 +4A10 +4FFF +7A20 +4BFE +4A20 +4BFE +4A20 +CA20 +9BFF +ENDCHAR +STARTCHAR U+81DF +ENCODING 33247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3FFC +2918 +2814 +2DFC +3D10 +2FF4 +29D4 +3FF8 +2BB8 +2BF4 +2DDC +2AEC +5C44 +0000 +ENDCHAR +STARTCHAR U+81E0 +ENCODING 33248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +6FE8 +1390 +2BA8 +7FFC +3AB8 +57D4 +0100 +3FF8 +22C8 +2D28 +22C8 +2C28 +2018 +0000 +ENDCHAR +STARTCHAR U+81E1 +ENCODING 33249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1424 +7F48 +14FE +7F48 +497E +7F48 +087E +7F48 +227E +4100 +3FFC +2244 +2D34 +2284 +2C74 +200C +ENDCHAR +STARTCHAR U+81E2 +ENCODING 33250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +F514 +979E +9924 +97DE +F554 +99A6 +93FC +9204 +F3FC +9204 +93FC +9204 +93FC +2402 +0000 +0000 +ENDCHAR +STARTCHAR U+81E3 +ENCODING 33251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2100 +2100 +3FF0 +2010 +2010 +2010 +3FF0 +2110 +2100 +2100 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+81E4 +ENCODING 33252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +9042 +9042 +9042 +FE46 +8264 +822C +8228 +FE38 +9010 +9038 +9028 +906C +FEC6 +0183 +ENDCHAR +STARTCHAR U+81E5 +ENCODING 33253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FA0 +2420 +2420 +3F20 +2120 +2120 +2160 +3F50 +2450 +2490 +3F88 +2108 +0204 +0000 +ENDCHAR +STARTCHAR U+81E6 +ENCODING 33254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +0948 +0948 +0948 +7F7F +4141 +4141 +4141 +4141 +7F7F +0948 +0948 +0948 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+81E7 +ENCODING 33255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +2FFC +2840 +2FC8 +3D48 +2FC8 +0CA8 +7CB0 +2FB0 +2D14 +57F4 +144C +2084 +0000 +ENDCHAR +STARTCHAR U+81E8 +ENCODING 33256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7D00 +51F8 +5200 +7BF0 +4D10 +4910 +49F0 +7800 +53B8 +52A8 +7EA8 +43B8 +02A8 +0000 +ENDCHAR +STARTCHAR U+81E9 +ENCODING 33257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +0948 +3F7E +2142 +3F7E +0948 +7F7F +0080 +7FFF +0220 +0550 +0948 +3146 +0240 +0000 +0000 +ENDCHAR +STARTCHAR U+81EA +ENCODING 33258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0200 +1FF0 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+81EB +ENCODING 33259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1040 +7E40 +4240 +4240 +4240 +7E40 +4240 +4240 +4240 +7E40 +4240 +4241 +4263 +7E3E +ENDCHAR +STARTCHAR U+81EC +ENCODING 33260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0410 +1FF8 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +0104 +FFFE +0380 +0560 +191C +6108 +0100 +ENDCHAR +STARTCHAR U+81ED +ENCODING 33261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0100 +7FFC +0280 +0C60 +3018 +0000 +ENDCHAR +STARTCHAR U+81EE +ENCODING 33262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0800 +1FFC +3004 +5FFC +1004 +1FFC +1004 +1FFC +0010 +17E4 +288A +4491 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+81F0 +ENCODING 33264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +3FFC +2004 +3FFC +2004 +3FFC +2004 +3FFC +0000 +FFFF +1040 +3E47 +E27C +1641 +0C61 +F83F +ENDCHAR +STARTCHAR U+81F1 +ENCODING 33265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +3FFC +2004 +3FFC +2004 +3FFC +0100 +7FFE +4422 +4912 +3FFC +0200 +03FC +0604 +0C0C +3878 +ENDCHAR +STARTCHAR U+81F2 +ENCODING 33266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +20FC +FD88 +8510 +FFFF +8500 +FD00 +857C +FD44 +2144 +FD44 +214C +7140 +6941 +A663 +203E +ENDCHAR +STARTCHAR U+81F3 +ENCODING 33267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0200 +0240 +0430 +3FC8 +0100 +0100 +1FF0 +0100 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+81F4 +ENCODING 33268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7F80 +1080 +14FC +2310 +7F90 +0A90 +0850 +3E60 +0820 +0860 +0E90 +7108 +0604 +0000 +ENDCHAR +STARTCHAR U+81F5 +ENCODING 33269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FE40 +20FF +6884 +498C +7C58 +C430 +106C +11C7 +7C00 +10FE +1082 +1C82 +7082 +C082 +00FE +ENDCHAR +STARTCHAR U+81F6 +ENCODING 33270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FE40 +21FF +6840 +4880 +7CBE +C584 +1188 +1288 +7CFF +1088 +1088 +1C88 +7088 +C088 +0098 +ENDCHAR +STARTCHAR U+81F7 +ENCODING 33271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0414 +3F92 +0410 +7FFF +0010 +7FD0 +0810 +1090 +3F92 +0494 +3F88 +0415 +7FC3 +0000 +0000 +ENDCHAR +STARTCHAR U+81F8 +ENCODING 33272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFF +2020 +6464 +4444 +7E7E +C2C3 +1010 +1010 +7EFE +1010 +1010 +1F10 +7010 +C1FF +0000 +ENDCHAR +STARTCHAR U+81F9 +ENCODING 33273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +FE16 +2012 +69FF +4910 +7D10 +C7FA +112A +112A +7D2A +112E +1124 +1D24 +736D +C21B +0632 +ENDCHAR +STARTCHAR U+81FA +ENCODING 33274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0FE0 +0FE0 +0820 +0FE0 +3FFC +2FE8 +4240 +1FF0 +0FE0 +0100 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+81FB +ENCODING 33275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7C40 +13FC +1840 +25F8 +7CA0 +13FC +1130 +7EC8 +13FC +10E0 +1D50 +624C +0040 +0000 +ENDCHAR +STARTCHAR U+81FC +ENCODING 33276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0600 +38F8 +2008 +2008 +2008 +2008 +3EF8 +2008 +2008 +2008 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+81FD +ENCODING 33277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +0FF8 +0808 +1818 +3010 +6070 +0600 +3C7C +2004 +2004 +3E7C +2004 +2004 +2004 +3FFC +ENDCHAR +STARTCHAR U+81FE +ENCODING 33278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0500 +3978 +2108 +2108 +3D78 +2108 +2108 +3D78 +2188 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+81FF +ENCODING 33279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0018 +00F0 +3F80 +0100 +0100 +7FFE +0100 +0D00 +393C +2104 +2104 +3D3C +2104 +2104 +2104 +3FFC +ENDCHAR +STARTCHAR U+8200 +ENCODING 33280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0078 +7F80 +0208 +2108 +1110 +1120 +0408 +38FC +2008 +2008 +3EF8 +2008 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+8201 +ENCODING 33281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +1CF0 +1010 +1EF0 +1010 +1010 +1FF0 +1250 +0240 +7FFC +0240 +0440 +0840 +3040 +0000 +ENDCHAR +STARTCHAR U+8202 +ENCODING 33282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0280 +7FFC +0440 +1A30 +6CEC +0820 +0EE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8203 +ENCODING 33283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0600 +3C7C +2004 +2004 +3E7C +2004 +2004 +3FFC +1000 +1FFF +1000 +1FFF +4001 +4921 +CDB3 +8496 +ENDCHAR +STARTCHAR U+8204 +ENCODING 33284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0608 +38FC +2008 +2008 +3EF8 +2008 +2008 +3FF8 +0804 +1FFE +2004 +E924 +2494 +2484 +4014 +0008 +ENDCHAR +STARTCHAR U+8205 +ENCODING 33285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +3CF8 +3EF8 +2008 +3FF8 +1FF0 +1110 +1FF0 +1110 +1FF0 +7FF8 +0208 +0C08 +7070 +0000 +ENDCHAR +STARTCHAR U+8206 +ENCODING 33286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0908 +313C +27C8 +2208 +3D38 +27C8 +2108 +3938 +27C8 +2108 +FFFE +0000 +1010 +300C +4004 +ENDCHAR +STARTCHAR U+8207 +ENCODING 33287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A00 +3238 +2388 +2208 +3BB8 +2088 +3AB8 +2288 +2288 +7FFC +0000 +0460 +1818 +6004 +0000 +ENDCHAR +STARTCHAR U+8208 +ENCODING 33288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +37F8 +2448 +27C8 +3C78 +27C8 +3EF8 +27C8 +2448 +7FFC +0000 +0460 +1810 +6008 +0000 +ENDCHAR +STARTCHAR U+8209 +ENCODING 33289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +1BB0 +1210 +1BB0 +1290 +1AB0 +1290 +7FFC +0920 +17D0 +610C +1FF0 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+820A +ENCODING 33290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0CC0 +1FF8 +7100 +1FE0 +1FE0 +1FF8 +0200 +1CF0 +1EF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+820B +ENCODING 33291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF0 +3416 +25D2 +3C1E +25D2 +3D5E +25D2 +7FFF +4FF9 +0808 +0FF8 +0FF8 +0808 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+820C +ENCODING 33292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +00C0 +1F00 +0100 +0100 +7FFC +0100 +0100 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+820D +ENCODING 33293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1830 +6FEC +0100 +0100 +3FF8 +0100 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+820E +ENCODING 33294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1930 +610C +0FE0 +0100 +3FF8 +0000 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+820F +ENCODING 33295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0604 +1C44 +F044 +1044 +1044 +1044 +FE44 +1044 +1044 +1047 +7C7C +45C4 +4404 +4404 +4404 +7C04 +ENDCHAR +STARTCHAR U+8210 +ENCODING 33296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +0410 +38E0 +08A0 +08A0 +7FA0 +08FC +08A0 +3EA0 +2290 +2294 +22AC +3ECC +2304 +0000 +ENDCHAR +STARTCHAR U+8211 +ENCODING 33297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7810 +10FE +1092 +1492 +7EFE +1092 +1092 +7C92 +45FF +4482 +4482 +7C8A +4484 +0000 +0000 +ENDCHAR +STARTCHAR U+8212 +ENCODING 33298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1490 +1260 +2220 +7FFC +0824 +7E28 +0830 +3E20 +2220 +2220 +3E20 +2060 +0000 +ENDCHAR +STARTCHAR U+8213 +ENCODING 33299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0600 +1CFE +F082 +1082 +10FE +1082 +FE82 +10FE +1020 +107F +7D95 +4425 +44C9 +4413 +4462 +7C0E +ENDCHAR +STARTCHAR U+8214 +ENCODING 33300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C08 +F3FC +1040 +1044 +13FE +FE90 +1088 +1148 +7D46 +4644 +4548 +4564 +4654 +7C54 +4540 +0080 +ENDCHAR +STARTCHAR U+8215 +ENCODING 33301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7892 +1092 +1054 +7C10 +1044 +1183 +1000 +7C10 +4492 +4492 +4454 +4428 +7DC7 +0000 +0000 +ENDCHAR +STARTCHAR U+8216 +ENCODING 33302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +15FC +1240 +3FF8 +4948 +0948 +7FF8 +0948 +3D48 +25F8 +2548 +3D48 +2558 +0000 +ENDCHAR +STARTCHAR U+8217 +ENCODING 33303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +17FC +1A40 +29F8 +7F48 +0948 +7FF8 +0148 +3D48 +25F8 +2548 +3D48 +2558 +0000 +ENDCHAR +STARTCHAR U+8218 +ENCODING 33304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1308 +22F0 +7E90 +0890 +7EF0 +0880 +3EF8 +2288 +2288 +3EF8 +2288 +0000 +ENDCHAR +STARTCHAR U+8219 +ENCODING 33305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F8 +1F80 +0100 +FFFF +0100 +1FF8 +1008 +1FF8 +0606 +7878 +0810 +FEFF +0810 +7EFE +4282 +7EFE +ENDCHAR +STARTCHAR U+821A +ENCODING 33306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0CF8 +3910 +E7FF +2244 +2387 +227C +FE00 +23FF +2200 +227C +7A00 +4A7C +4A00 +4CFE +4882 +78FE +ENDCHAR +STARTCHAR U+821B +ENCODING 33307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +0810 +0EFC +1290 +1290 +3290 +4A90 +05FC +0410 +0410 +0810 +1010 +2010 +0000 +ENDCHAR +STARTCHAR U+821C +ENCODING 33308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +01D0 +3E10 +1120 +0940 +3FFC +2818 +4EF8 +1290 +3290 +0DFC +0410 +1810 +6010 +0000 +ENDCHAR +STARTCHAR U+821D +ENCODING 33309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFC +0204 +FFFF +0888 +1110 +0888 +7FFE +4402 +4812 +1FF8 +008C +1FF0 +1080 +7FFE +0080 +ENDCHAR +STARTCHAR U+821E +ENCODING 33310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +1FF8 +2AA0 +7FFC +0AA0 +3FF8 +0820 +0FF8 +12A0 +6AA0 +0DFC +1820 +6020 +0000 +ENDCHAR +STARTCHAR U+821F +ENCODING 33311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +0FE0 +0A20 +0920 +0920 +0820 +7FFC +0920 +0920 +1120 +1120 +2120 +4060 +0000 +ENDCHAR +STARTCHAR U+8220 +ENCODING 33312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +207F +7F11 +2111 +2911 +2511 +7F91 +2111 +2911 +2511 +2111 +2121 +454A +0204 +0000 +0000 +ENDCHAR +STARTCHAR U+8221 +ENCODING 33313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2008 +7DFC +4420 +6420 +5420 +4420 +FC20 +4420 +6420 +5420 +5420 +4420 +4424 +57FE +8800 +ENDCHAR +STARTCHAR U+8222 +ENCODING 33314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2420 +7E20 +4420 +6524 +5524 +4524 +FD24 +4524 +6524 +5524 +5524 +4524 +4524 +55FC +8804 +ENDCHAR +STARTCHAR U+8223 +ENCODING 33315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2444 +7E24 +4524 +6528 +5488 +4488 +FC90 +4450 +6420 +5450 +5450 +4488 +450E +5604 +8800 +ENDCHAR +STARTCHAR U+8225 +ENCODING 33317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +207F +7F49 +2949 +2549 +2149 +7FFF +2140 +2940 +2540 +2140 +2141 +2141 +437F +0000 +0000 +ENDCHAR +STARTCHAR U+8228 +ENCODING 33320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +241C +7FE0 +4500 +6500 +55FC +4544 +FD44 +4544 +6528 +5528 +5510 +4528 +4648 +5484 +8902 +ENDCHAR +STARTCHAR U+8229 +ENCODING 33321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0470 +0810 +1E50 +1250 +1A88 +1688 +1724 +1F20 +7220 +1A50 +1A48 +2A98 +23E4 +4604 +0000 +ENDCHAR +STARTCHAR U+822A +ENCODING 33322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0820 +1E20 +13FC +1A00 +1670 +1650 +7F50 +1250 +1A50 +1A90 +2A94 +2314 +460C +0000 +ENDCHAR +STARTCHAR U+822B +ENCODING 33323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0820 +1E20 +13FC +1A40 +1640 +1678 +1F48 +7248 +1A48 +1A88 +2A88 +2308 +4630 +0000 +ENDCHAR +STARTCHAR U+822C +ENCODING 33324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0870 +1E50 +1250 +1A54 +1694 +170C +7FF8 +1288 +1A50 +1A50 +2A20 +2250 +478C +0000 +ENDCHAR +STARTCHAR U+822D +ENCODING 33325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2520 +7F20 +4520 +6520 +5524 +45EC +FD30 +4520 +6520 +5520 +5520 +4562 +45A2 +551E +8800 +ENDCHAR +STARTCHAR U+822E +ENCODING 33326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +09FC +1E00 +12F8 +1A88 +1688 +1688 +1FF8 +7288 +1A80 +1A80 +2A80 +2300 +4700 +0000 +ENDCHAR +STARTCHAR U+822F +ENCODING 33327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2420 +7E24 +45FE +6524 +5524 +4524 +FD24 +4524 +6524 +55FC +5524 +4420 +4420 +5420 +8820 +ENDCHAR +STARTCHAR U+8230 +ENCODING 33328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1004 +3EFE +2284 +2294 +3294 +2A94 +2294 +FEA4 +22A4 +3220 +2A50 +2250 +2252 +4A92 +850E +ENDCHAR +STARTCHAR U+8231 +ENCODING 33329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1020 +3C50 +2450 +3488 +2D06 +2604 +FCF8 +2488 +3488 +2CA8 +2490 +2480 +2484 +5484 +887C +ENDCHAR +STARTCHAR U+8232 +ENCODING 33330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1038 +7C28 +446C +54C6 +55BB +4400 +FE00 +44FE +5422 +5422 +5422 +542E +4420 +C420 +8C20 +ENDCHAR +STARTCHAR U+8233 +ENCODING 33331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0820 +1E20 +1220 +1AF8 +16A8 +16A8 +1FA8 +72F8 +1AA8 +1AA8 +2AA8 +22F8 +4688 +0000 +ENDCHAR +STARTCHAR U+8234 +ENCODING 33332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +2480 +7E84 +44FE +6540 +5540 +4650 +FC78 +4440 +6440 +5448 +547C +4440 +4440 +5440 +8840 +ENDCHAR +STARTCHAR U+8235 +ENCODING 33333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0820 +1EFC +1288 +1B40 +1640 +1648 +7F50 +1260 +1A40 +1A40 +2A44 +2244 +463C +0000 +ENDCHAR +STARTCHAR U+8236 +ENCODING 33334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0820 +1E40 +12F8 +1A88 +1688 +1688 +7FF8 +1288 +1A88 +1A88 +2A88 +22F8 +4688 +0000 +ENDCHAR +STARTCHAR U+8237 +ENCODING 33335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0820 +1E20 +13FC +1A20 +1628 +17C8 +7F50 +1230 +1A10 +1A28 +2A48 +23F4 +4604 +0000 +ENDCHAR +STARTCHAR U+8238 +ENCODING 33336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +09FC +1E08 +1208 +1AE8 +16A8 +16A8 +1FA8 +72E8 +1AA8 +1A08 +2A08 +2208 +4618 +0000 +ENDCHAR +STARTCHAR U+8239 +ENCODING 33337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0470 +0810 +1E50 +1250 +1A88 +1688 +1704 +1EF8 +7288 +1A88 +1A88 +2A88 +22F8 +4688 +0000 +ENDCHAR +STARTCHAR U+823A +ENCODING 33338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +11FF +7D11 +4511 +5511 +55FF +4511 +FF11 +4511 +55FF +5410 +5410 +5410 +4410 +C410 +8C10 +ENDCHAR +STARTCHAR U+823B +ENCODING 33339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2424 +7E3E +4420 +6424 +55FE +4504 +FD04 +4504 +65FC +5500 +5500 +4500 +4500 +5500 +8A00 +ENDCHAR +STARTCHAR U+823C +ENCODING 33340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2044 +7E44 +2244 +33FF +2A44 +2244 +7E44 +2244 +33FF +2A00 +2244 +2282 +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+823D +ENCODING 33341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20FC +7F44 +2228 +2210 +3228 +2AC6 +7F10 +22FF +3290 +2A90 +22FE +2210 +4610 +0000 +0000 +ENDCHAR +STARTCHAR U+823E +ENCODING 33342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +21FE +7C50 +4450 +6454 +55FE +4554 +FD54 +4554 +6554 +555C +5584 +4504 +4504 +55FC +8904 +ENDCHAR +STARTCHAR U+823F +ENCODING 33343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +7E10 +2228 +3244 +2B83 +227C +7E00 +23FF +3240 +2A7C +2204 +2204 +4638 +0000 +0000 +ENDCHAR +STARTCHAR U+8240 +ENCODING 33344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +040C +09F0 +1EA8 +12A4 +1B24 +1610 +17F8 +1E10 +7220 +1BFC +1A20 +2A20 +2220 +4660 +0000 +ENDCHAR +STARTCHAR U+8242 +ENCODING 33346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20FE +7F44 +2228 +2A10 +26EE +7F10 +22FE +2A10 +26FE +2210 +23FF +2210 +4610 +0000 +0000 +ENDCHAR +STARTCHAR U+8243 +ENCODING 33347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +10FE +7C92 +4492 +54FE +5492 +4492 +FE92 +44FE +5410 +5410 +54FE +5410 +4410 +C410 +8DFF +ENDCHAR +STARTCHAR U+8244 +ENCODING 33348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2524 +7EA8 +44B0 +6424 +55FE +4504 +FD04 +45FC +6504 +5504 +55FC +4504 +4504 +5514 +8908 +ENDCHAR +STARTCHAR U+8245 +ENCODING 33349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1028 +3E44 +2282 +2B01 +2A00 +22FE +2F10 +7210 +2BFF +2A10 +2A54 +2A92 +2312 +4211 +4630 +ENDCHAR +STARTCHAR U+8246 +ENCODING 33350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1010 +7CFE +4482 +5482 +54FE +4482 +FE82 +44FE +5491 +5493 +549E +5488 +448C +C4E6 +8D83 +ENDCHAR +STARTCHAR U+8247 +ENCODING 33351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +138C +3CF0 +2510 +3510 +2F90 +2CFC +7E90 +2690 +2D10 +2D7C +2E80 +2460 +4C1C +0000 +ENDCHAR +STARTCHAR U+8249 +ENCODING 33353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +25FE +7F04 +4504 +65FC +5500 +45FC +FD20 +45FC +6520 +55FE +5520 +4520 +4522 +5622 +881E +ENDCHAR +STARTCHAR U+824B +ENCODING 33355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +24FC +7E10 +4420 +6424 +57FE +4420 +FCA0 +4444 +65FE +5554 +5554 +4554 +4554 +57FE +8800 +ENDCHAR +STARTCHAR U+824E +ENCODING 33358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1040 +7CFE +4482 +54FE +5482 +44FE +FE00 +45FF +5410 +5410 +54FE +5410 +4410 +C5FF +8C00 +ENDCHAR +STARTCHAR U+824F +ENCODING 33359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +2088 +7C50 +47FE +6420 +5444 +45FE +FD04 +4504 +65FC +5504 +55FC +4504 +4504 +55FC +8904 +ENDCHAR +STARTCHAR U+8250 +ENCODING 33360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3D29 +6511 +3529 +2D45 +25FF +2444 +7E82 +2440 +34FE +2D28 +2410 +2428 +59C7 +0000 +0000 +ENDCHAR +STARTCHAR U+8251 +ENCODING 33361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +11FF +7C00 +44FE +5482 +5482 +44FE +FE80 +44FE +54AA +54AA +55FE +55AA +46AA +C4AA +8C86 +ENDCHAR +STARTCHAR U+8252 +ENCODING 33362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +3D01 +657D +3501 +2D7D +2400 +7EFE +2482 +34FE +2C82 +24FE +2482 +24FE +4C82 +0000 +0000 +ENDCHAR +STARTCHAR U+8253 +ENCODING 33363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A4 +3CA4 +65FF +34A4 +2CBC +2480 +7EFF +2410 +35FF +2C54 +2492 +2511 +2410 +4C10 +0000 +0000 +ENDCHAR +STARTCHAR U+8255 +ENCODING 33365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +11FF +7C44 +2444 +35FF +2D11 +7F11 +24FE +3440 +2C7E +2442 +2482 +2502 +441C +0000 +0000 +ENDCHAR +STARTCHAR U+8256 +ENCODING 33366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0884 +1048 +7DFE +4420 +5420 +54FC +4420 +FC20 +45FE +5440 +5480 +55FE +5710 +4410 +C410 +8DFF +ENDCHAR +STARTCHAR U+8257 +ENCODING 33367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +7E44 +23FF +3228 +2A28 +2244 +7E82 +2301 +3200 +2AFE +22AA +22AA +22AA +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8258 +ENCODING 33368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +10C0 +3D58 +2548 +35D8 +2D48 +2DD8 +3F48 +6440 +37F8 +3490 +3460 +25B0 +4E0C +0000 +ENDCHAR +STARTCHAR U+8259 +ENCODING 33369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0820 +1E50 +12F8 +1B04 +16F8 +16F8 +1E88 +72F8 +1A80 +1BF8 +2B88 +22F8 +4688 +0000 +ENDCHAR +STARTCHAR U+825A +ENCODING 33370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +13FC +3CA0 +27F8 +36A8 +2FF8 +2EA8 +3FF8 +65F0 +3510 +35F0 +3510 +25F0 +4D10 +0000 +ENDCHAR +STARTCHAR U+825B +ENCODING 33371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3CFE +6492 +35FF +2C92 +24FE +7EFE +2492 +34FE +2C54 +25FF +2428 +2410 +49EF +0000 +0000 +ENDCHAR +STARTCHAR U+825C +ENCODING 33372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1154 +2154 +FBFF +8954 +A954 +AA77 +8800 +FFFF +8A21 +AA21 +A9FE +A922 +A922 +8926 +8820 +9820 +ENDCHAR +STARTCHAR U+825D +ENCODING 33373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +11F8 +3C40 +27FC +3648 +2DD8 +2DD8 +3E40 +65F8 +3408 +37FC +3408 +25F8 +4C08 +0000 +ENDCHAR +STARTCHAR U+825E +ENCODING 33374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +3DFF +6652 +3400 +2C50 +2452 +7F54 +24D8 +3450 +2CD8 +2555 +2653 +2491 +590F +0000 +0000 +ENDCHAR +STARTCHAR U+825F +ENCODING 33375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +08F8 +1E50 +13FC +1AF8 +16A8 +16F8 +1EA8 +72F8 +1A20 +1AF8 +2A20 +23FC +4600 +0000 +ENDCHAR +STARTCHAR U+8260 +ENCODING 33376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +11E8 +7E31 +454A +5484 +577B +4400 +FCFC +4484 +5484 +54FC +5400 +5484 +44CC +C448 +8FFF +ENDCHAR +STARTCHAR U+8261 +ENCODING 33377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2092 +2054 +7DFF +2501 +357D +2C44 +7C7C +2400 +35FF +2D11 +25FF +2511 +25FF +4D01 +0000 +0000 +ENDCHAR +STARTCHAR U+8262 +ENCODING 33378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +1040 +3FFC +2550 +3550 +2EE8 +2FFC +3C00 +67F8 +36E8 +36A8 +36E8 +27F8 +4E08 +0000 +ENDCHAR +STARTCHAR U+8263 +ENCODING 33379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +203C +F820 +8BFF +AA21 +ABFE +8A21 +FEFF +8A92 +AAFE +AA92 +AAFE +AA20 +8DFE +8822 +98CE +ENDCHAR +STARTCHAR U+8264 +ENCODING 33380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +10A0 +3FF8 +2440 +35F0 +2C40 +2FFC +3C68 +65A4 +37FC +34E8 +3794 +24EC +4D84 +0000 +ENDCHAR +STARTCHAR U+8266 +ENCODING 33382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +11F0 +3D50 +25FC +3530 +2DE0 +2D5C +7FE0 +2400 +2DF8 +2D68 +2D68 +2568 +4FFC +0000 +ENDCHAR +STARTCHAR U+8267 +ENCODING 33383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +23FF +F888 +8890 +A9FF +AB10 +89FE +FD10 +89FE +A910 +A9FF +A800 +ABFE +8884 +8878 +9B87 +ENDCHAR +STARTCHAR U+8268 +ENCODING 33384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +13FC +3C90 +27FC +36E8 +2C00 +2FFC +3C48 +67E8 +34B0 +3770 +34A8 +2724 +4CC0 +0000 +ENDCHAR +STARTCHAR U+8269 +ENCODING 33385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +21FF +7C44 +25EF +34D6 +2CD6 +2515 +7E82 +34FE +2C82 +24FE +2482 +2482 +4C82 +0000 +0000 +ENDCHAR +STARTCHAR U+826A +ENCODING 33386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +10F0 +3F20 +25F8 +3548 +2DF8 +2DF8 +3DA8 +6654 +35F8 +35F8 +3508 +25F8 +4D08 +0000 +ENDCHAR +STARTCHAR U+826B +ENCODING 33387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +1078 +3DFC +2568 +35B8 +2DF8 +2DA8 +3DF8 +65A8 +35F8 +35F8 +36E8 +26E8 +4DFC +0000 +ENDCHAR +STARTCHAR U+826C +ENCODING 33388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +3D08 +65FF +3501 +2DFF +24F7 +7E84 +24FF +3508 +2DFF +2511 +25FF +2449 +598F +0000 +0000 +ENDCHAR +STARTCHAR U+826D +ENCODING 33389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +114A +2294 +FBDF +8EB4 +ABDF +AA94 +8BDF +FE94 +8BDF +A800 +ABFE +A884 +A858 +8870 +88DC +9B87 +ENDCHAR +STARTCHAR U+826E +ENCODING 33390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FE0 +1020 +1020 +1FE0 +1020 +1020 +1FE8 +1108 +1110 +10A0 +1340 +1C30 +700C +0000 +ENDCHAR +STARTCHAR U+826F +ENCODING 33391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0FE0 +0820 +0820 +0FE0 +0820 +0FF0 +0A10 +0920 +08C0 +0840 +0E30 +700C +0000 +ENDCHAR +STARTCHAR U+8270 +ENCODING 33392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +01FC +7D08 +0508 +45F8 +2908 +2908 +11F8 +1144 +294C +2930 +4520 +8510 +014E +0184 +0100 +ENDCHAR +STARTCHAR U+8271 +ENCODING 33393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +7FF8 +1488 +1C88 +3EF8 +2A88 +3EF8 +08A4 +3EA4 +08A8 +7E90 +1490 +22E8 +4184 +0000 +ENDCHAR +STARTCHAR U+8272 +ENCODING 33394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +07E0 +0840 +1080 +7FF0 +1110 +1110 +1110 +1FF0 +1010 +1000 +1004 +1004 +0FFC +0000 +ENDCHAR +STARTCHAR U+8273 +ENCODING 33395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10F8 +FF10 +1124 +13FE +7D24 +1124 +1124 +FFFC +1104 +1100 +1102 +1102 +10FE +1000 +ENDCHAR +STARTCHAR U+8274 +ENCODING 33396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1420 +1420 +7F3C +1548 +1590 +7F7C +5454 +5454 +5454 +7F7C +1544 +1540 +1542 +2742 +243E +4400 +ENDCHAR +STARTCHAR U+8275 +ENCODING 33397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +121F +0C22 +3F44 +127F +1249 +1249 +7FC9 +127F +1240 +1240 +1241 +2241 +427F +0000 +0000 +ENDCHAR +STARTCHAR U+8276 +ENCODING 33398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +7F20 +5578 +7F90 +5520 +7FF8 +00A8 +7FA8 +3EF8 +2288 +3E80 +2484 +1E84 +607C +0000 +ENDCHAR +STARTCHAR U+8277 +ENCODING 33399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +5B40 +7F78 +5B90 +7F20 +7FF8 +5BA8 +7FA8 +00A8 +7FF8 +3E88 +2280 +3E84 +1684 +787C +0000 +ENDCHAR +STARTCHAR U+8278 +ENCODING 33400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +2AA8 +2AA8 +2AA8 +2AA8 +2AA8 +3EF8 +2AA8 +0820 +0820 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+8279 +ENCODING 33401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0440 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+827A +ENCODING 33402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0000 +3FC0 +0080 +0100 +0200 +0400 +0800 +1000 +2002 +2002 +2002 +1FFE +ENDCHAR +STARTCHAR U+827B +ENCODING 33403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0100 +0100 +3FFC +0104 +0104 +0304 +0204 +0604 +0C0C +1808 +7038 +ENDCHAR +STARTCHAR U+827C +ENCODING 33404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0410 +0002 +7FFF +0080 +0080 +0080 +0080 +0080 +0480 +0280 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+827D +ENCODING 33405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0640 +0200 +0220 +7FF0 +0220 +0420 +0420 +0420 +0822 +0822 +101E +6000 +ENDCHAR +STARTCHAR U+827E +ENCODING 33406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0020 +0820 +0820 +0440 +0440 +0280 +0100 +02C0 +0C30 +700C +0000 +ENDCHAR +STARTCHAR U+827F +ENCODING 33407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0440 +3FF0 +0410 +0420 +0448 +08FC +0808 +0808 +1008 +1088 +2050 +4020 +ENDCHAR +STARTCHAR U+8280 +ENCODING 33408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0000 +3FFC +0204 +0204 +0204 +0604 +0404 +0C04 +180C +3008 +E038 +ENDCHAR +STARTCHAR U+8281 +ENCODING 33409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0000 +07E0 +0420 +0420 +0420 +0420 +0C20 +0820 +1821 +3033 +E01E +ENDCHAR +STARTCHAR U+8282 +ENCODING 33410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0448 +7FFC +0208 +0208 +0208 +0208 +0248 +0228 +0210 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U+8283 +ENCODING 33411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0000 +0FE0 +0820 +0820 +0B20 +09A0 +08A0 +0820 +1821 +3033 +E01E +ENDCHAR +STARTCHAR U+8284 +ENCODING 33412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0640 +0220 +3FF0 +0220 +1A20 +0420 +0620 +0520 +08A2 +0822 +101E +6000 +ENDCHAR +STARTCHAR U+8285 +ENCODING 33413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0410 +0100 +0102 +0101 +7FFE +0100 +0080 +0040 +0020 +0011 +0009 +0007 +0000 +0000 +ENDCHAR +STARTCHAR U+8287 +ENCODING 33415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0100 +0100 +3FFC +2104 +2104 +2104 +2104 +2104 +211C +0100 +0100 +ENDCHAR +STARTCHAR U+8288 +ENCODING 33416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0920 +0928 +793C +0920 +0920 +0928 +7FFC +0100 +0100 +0104 +FFFE +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+8289 +ENCODING 33417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0000 +3FFC +0100 +0100 +0100 +FFFF +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+828A +ENCODING 33418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0450 +00F8 +3F00 +0100 +0100 +0104 +FFFE +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+828B +ENCODING 33419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0000 +1FF0 +0100 +0100 +7FFC +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+828D +ENCODING 33421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +0800 +1FF8 +1008 +2208 +4108 +0108 +0008 +0010 +0060 +0000 +ENDCHAR +STARTCHAR U+828E +ENCODING 33422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0450 +3FF8 +0010 +0010 +1FF0 +1000 +2008 +3FFC +0008 +0008 +0050 +0020 +ENDCHAR +STARTCHAR U+828F +ENCODING 33423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0440 +0100 +0100 +0108 +7FFC +0100 +0100 +0100 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+8290 +ENCODING 33424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0222 +7FFF +0220 +0004 +3FFE +0080 +0080 +00A0 +0098 +0088 +0080 +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8291 +ENCODING 33425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0450 +3FF8 +0010 +0010 +1FF0 +1010 +1000 +1000 +1004 +1004 +0FFC +0000 +ENDCHAR +STARTCHAR U+8292 +ENCODING 33426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0100 +7FFC +1000 +1000 +1000 +1000 +1000 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+8293 +ENCODING 33427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0FF8 +0010 +0020 +00C0 +0080 +7FFF +0080 +0080 +0080 +0280 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+8294 +ENCODING 33428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1108 +1108 +1108 +1FF8 +0100 +0A08 +0808 +4949 +4949 +4949 +7F7F +0808 +1808 +3008 +E008 +ENDCHAR +STARTCHAR U+8296 +ENCODING 33430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0100 +0100 +FFFF +0100 +0380 +02C0 +0660 +0C30 +381C +E007 +0000 +ENDCHAR +STARTCHAR U+8297 +ENCODING 33431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0200 +0420 +1FC0 +0080 +0320 +0C20 +3FC0 +0040 +0080 +0100 +0E00 +7000 +ENDCHAR +STARTCHAR U+8298 +ENCODING 33432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0440 +2080 +2088 +2498 +3EA0 +20C0 +2080 +2080 +2684 +3884 +207C +0000 +ENDCHAR +STARTCHAR U+8299 +ENCODING 33433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0100 +1FF0 +0100 +7FFC +0100 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+829A +ENCODING 33434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0100 +010F +03F0 +7D08 +2108 +2108 +2108 +3FF8 +2108 +0101 +0101 +01FF +0000 +ENDCHAR +STARTCHAR U+829B +ENCODING 33435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +3FFC +0104 +0104 +FFFF +0104 +0104 +3FFC +0100 +0300 +0600 +1C00 +ENDCHAR +STARTCHAR U+829C +ENCODING 33436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0000 +3FF0 +0200 +0208 +7FFC +0280 +0280 +0480 +0482 +0882 +107E +6000 +ENDCHAR +STARTCHAR U+829D +ENCODING 33437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0100 +3FF8 +0010 +0020 +00C0 +1300 +1C00 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+829E +ENCODING 33438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1000 +1FF8 +2000 +0FF0 +0000 +7FF8 +0008 +0008 +0009 +0005 +0003 +0000 +0000 +ENDCHAR +STARTCHAR U+829F +ENCODING 33439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +07C0 +0448 +0448 +0838 +3FE0 +0440 +0280 +0380 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+82A0 +ENCODING 33440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0100 +FFFF +0810 +0810 +0C30 +0660 +02C0 +03C0 +0660 +1C38 +F00F +ENDCHAR +STARTCHAR U+82A1 +ENCODING 33441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0C40 +0800 +0FF8 +1110 +1120 +2100 +0280 +0280 +0440 +0830 +100E +6004 +ENDCHAR +STARTCHAR U+82A2 +ENCODING 33442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0400 +0808 +11FC +3000 +5000 +1000 +1002 +13FF +1000 +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+82A3 +ENCODING 33443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0000 +FFFF +0080 +0180 +0340 +0F70 +391C +E107 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+82A4 +ENCODING 33444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0000 +7F40 +0240 +0C40 +0840 +0F40 +F840 +4840 +0842 +0842 +283E +1000 +ENDCHAR +STARTCHAR U+82A5 +ENCODING 33445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0280 +0440 +1C70 +644C +0440 +0840 +0840 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+82A6 +ENCODING 33446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3FF8 +0000 +1FF0 +1010 +1010 +1FF0 +1010 +1000 +2000 +4000 +0000 +ENDCHAR +STARTCHAR U+82A7 +ENCODING 33447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +1FF8 +0030 +0440 +0280 +FFFF +0082 +0084 +0080 +0080 +0080 +0380 +ENDCHAR +STARTCHAR U+82A8 +ENCODING 33448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0440 +3FF0 +0820 +0840 +0CF0 +1210 +1220 +1120 +20C0 +20B0 +430E +0C04 +ENDCHAR +STARTCHAR U+82A9 +ENCODING 33449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0280 +0440 +0830 +330E +C084 +0020 +1FF0 +0020 +0040 +0040 +0080 +0100 +ENDCHAR +STARTCHAR U+82AA +ENCODING 33450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +00F8 +1F80 +1080 +1080 +1088 +1FFC +1080 +1040 +1040 +1422 +1812 +100E +ENDCHAR +STARTCHAR U+82AB +ENCODING 33451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0000 +1FF0 +0000 +7FFC +0480 +0480 +0480 +0884 +1084 +607C +0000 +ENDCHAR +STARTCHAR U+82AC +ENCODING 33452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +07C0 +0440 +0820 +1010 +7FEC +0220 +0220 +0420 +0820 +30C0 +0000 +ENDCHAR +STARTCHAR U+82AD +ENCODING 33453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0440 +1FF0 +1110 +1110 +1FF0 +1010 +1000 +1004 +1004 +0FFC +0000 +ENDCHAR +STARTCHAR U+82AE +ENCODING 33454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0540 +0108 +3FFC +2108 +2108 +2288 +2248 +2468 +2828 +2008 +2028 +2010 +ENDCHAR +STARTCHAR U+82AF +ENCODING 33455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0440 +0000 +0100 +0490 +1448 +1444 +2404 +4420 +0420 +03E0 +0000 +ENDCHAR +STARTCHAR U+82B0 +ENCODING 33456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0104 +FFFE +0100 +0100 +3FF0 +0820 +0440 +0280 +0100 +06C0 +1830 +E00E +ENDCHAR +STARTCHAR U+82B1 +ENCODING 33457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0440 +0480 +0888 +0890 +18E0 +2880 +4880 +0884 +0884 +087C +0000 +ENDCHAR +STARTCHAR U+82B2 +ENCODING 33458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0380 +06C0 +0C70 +381C +E867 +09C0 +0F00 +0800 +0804 +0C0C +07F8 +ENDCHAR +STARTCHAR U+82B3 +ENCODING 33459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0100 +7FFC +0100 +01F0 +0210 +0210 +0410 +1810 +6060 +0000 +ENDCHAR +STARTCHAR U+82B4 +ENCODING 33460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0800 +0808 +0FFC +1248 +2248 +4448 +0488 +0888 +1108 +2208 +0450 +0020 +ENDCHAR +STARTCHAR U+82B5 +ENCODING 33461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +0080 +1FFC +0084 +0084 +7FFF +0140 +0220 +0410 +0808 +7007 +0000 +0000 +ENDCHAR +STARTCHAR U+82B6 +ENCODING 33462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7FFE +0420 +1000 +1000 +1FFE +2002 +4202 +0402 +0882 +1FC2 +0044 +0008 +0070 +0000 +0000 +ENDCHAR +STARTCHAR U+82B7 +ENCODING 33463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0540 +0100 +0900 +0910 +09F8 +0900 +0900 +0900 +0900 +0904 +FFFE +0000 +ENDCHAR +STARTCHAR U+82B8 +ENCODING 33464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0440 +1FF0 +0000 +0000 +7FFC +0240 +0220 +04F0 +3F08 +0008 +0000 +ENDCHAR +STARTCHAR U+82B9 +ENCODING 33465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0470 +0FC0 +0800 +0FFC +0840 +0840 +1040 +1040 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+82BA +ENCODING 33466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0000 +0078 +3FC0 +0100 +0100 +FFFF +0240 +0660 +0C30 +381C +E007 +ENDCHAR +STARTCHAR U+82BB +ENCODING 33467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +1248 +7248 +1FC8 +1248 +0C30 +3800 +0FF8 +1248 +7248 +1FC8 +0448 +3830 +0000 +ENDCHAR +STARTCHAR U+82BC +ENCODING 33468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0410 +0038 +03C0 +1D00 +01FC +3F00 +0100 +01FE +7F00 +0100 +0101 +01FF +ENDCHAR +STARTCHAR U+82BD +ENCODING 33469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +0840 +0840 +7FFC +00C0 +0140 +0640 +1840 +6040 +00C0 +0000 +ENDCHAR +STARTCHAR U+82BE +ENCODING 33470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0104 +FFFE +0100 +0110 +1FF8 +1110 +1110 +1110 +1150 +1120 +0100 +0100 +ENDCHAR +STARTCHAR U+82BF +ENCODING 33471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0800 +0BF8 +1088 +309F +3091 +5081 +1081 +1081 +1101 +1101 +1202 +140C +ENDCHAR +STARTCHAR U+82C0 +ENCODING 33472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +0080 +7FFF +0000 +07F0 +0410 +0410 +0410 +0811 +1011 +201F +0000 +0000 +ENDCHAR +STARTCHAR U+82C1 +ENCODING 33473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0440 +0820 +0820 +0820 +0820 +0850 +0850 +1450 +1288 +2088 +4104 +0202 +ENDCHAR +STARTCHAR U+82C2 +ENCODING 33474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0080 +1084 +1084 +0888 +0080 +0140 +0220 +0410 +0808 +7007 +0000 +0000 +ENDCHAR +STARTCHAR U+82C3 +ENCODING 33475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0422 +7FFF +0420 +0104 +7FFF +0200 +03F8 +0510 +04A0 +0840 +10B0 +230E +0C04 +0000 +0000 +ENDCHAR +STARTCHAR U+82C4 +ENCODING 33476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0640 +0104 +FFFE +0100 +0100 +0140 +0130 +0110 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+82C5 +ENCODING 33477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0440 +0208 +2248 +1248 +0C48 +0448 +0C48 +1248 +2208 +4018 +0000 +ENDCHAR +STARTCHAR U+82C6 +ENCODING 33478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +2000 +23FE +2C42 +3842 +E042 +2042 +2242 +26C2 +1C86 +0184 +031C +ENDCHAR +STARTCHAR U+82C7 +ENCODING 33479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0920 +0108 +7FFC +0100 +3FF8 +0100 +FFFC +0104 +0104 +0104 +0128 +0110 +0100 +ENDCHAR +STARTCHAR U+82C8 +ENCODING 33480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0448 +3FFC +2100 +2108 +2FFC +2108 +2108 +2208 +4208 +4408 +8850 +1020 +ENDCHAR +STARTCHAR U+82CA +ENCODING 33482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0448 +1FFC +1000 +1020 +17F0 +1420 +1420 +24A0 +2440 +4404 +8404 +03FC +ENDCHAR +STARTCHAR U+82CB +ENCODING 33483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0010 +1FF8 +1010 +1110 +1110 +1190 +1290 +1290 +0480 +0884 +3084 +C07C +ENDCHAR +STARTCHAR U+82CC +ENCODING 33484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0820 +08C0 +0B00 +0804 +FFFE +0A00 +0900 +0880 +0840 +0A20 +0C1C +0808 +ENDCHAR +STARTCHAR U+82CD +ENCODING 33485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0100 +0280 +0440 +1830 +6FEE +8824 +08A0 +0840 +0810 +0810 +07F0 +0000 +ENDCHAR +STARTCHAR U+82CE +ENCODING 33486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0640 +4100 +7FFE +4002 +8004 +0000 +0000 +0000 +0000 +0008 +7FFC +0000 +ENDCHAR +STARTCHAR U+82CF +ENCODING 33487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0820 +0A20 +0210 +3FF8 +0210 +0210 +2218 +2416 +4412 +0810 +1010 +2050 +4020 +ENDCHAR +STARTCHAR U+82D0 +ENCODING 33488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FFFF +0820 +0000 +7FFC +0104 +7FFC +4100 +4100 +7FFE +0502 +0D02 +3906 +E11C +0100 +ENDCHAR +STARTCHAR U+82D1 +ENCODING 33489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +08F8 +1E88 +1288 +2288 +54B0 +0C80 +0884 +1084 +207C +0000 +ENDCHAR +STARTCHAR U+82D2 +ENCODING 33490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0100 +1FF0 +1110 +1FF0 +1110 +1110 +7FFC +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+82D3 +ENCODING 33491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0280 +0440 +1FF0 +600C +1FF0 +0110 +0110 +0160 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+82D4 +ENCODING 33492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +0240 +0430 +7FC8 +0004 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+82D5 +ENCODING 33493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +3FF8 +0408 +0408 +0808 +1050 +6020 +1FF0 +1010 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+82D6 +ENCODING 33494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +0080 +0080 +3FFE +2082 +2082 +3FFE +2082 +2082 +3FFE +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+82D7 +ENCODING 33495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0440 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+82D8 +ENCODING 33496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0008 +3FFC +2008 +2048 +27E8 +2448 +2448 +2448 +27C8 +2448 +2028 +2010 +ENDCHAR +STARTCHAR U+82D9 +ENCODING 33497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0100 +3FF8 +0020 +0820 +0440 +0440 +0480 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+82DA +ENCODING 33498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +3FFE +2082 +2082 +3FFE +2082 +2082 +3FFE +2082 +6082 +4082 +C08E +ENDCHAR +STARTCHAR U+82DB +ENCODING 33499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0000 +7FFC +0010 +1F10 +1110 +1110 +1F10 +1110 +0010 +0030 +0000 +ENDCHAR +STARTCHAR U+82DC +ENCODING 33500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +1010 +1010 +1FF0 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+82DE +ENCODING 33502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +0FF8 +1008 +2F88 +4888 +0F88 +08B0 +0804 +0804 +07FC +0000 +ENDCHAR +STARTCHAR U+82DF +ENCODING 33503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +0FF8 +1008 +2F88 +4888 +0888 +0F88 +0888 +0008 +0030 +0000 +ENDCHAR +STARTCHAR U+82E0 +ENCODING 33504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +3FF8 +2008 +2008 +3FF8 +2080 +2088 +3FFC +2040 +2040 +2822 +3012 +200E +ENDCHAR +STARTCHAR U+82E1 +ENCODING 33505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0440 +1010 +1210 +1110 +1110 +1010 +1030 +1628 +18C4 +6304 +0000 +ENDCHAR +STARTCHAR U+82E2 +ENCODING 33506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +1FF8 +1008 +1008 +1FF8 +1000 +1000 +1FFC +1004 +1004 +1004 +1FFC +ENDCHAR +STARTCHAR U+82E3 +ENCODING 33507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF8 +1000 +1FF0 +1010 +1010 +1FF0 +1010 +1000 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+82E4 +ENCODING 33508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0004 +7FFE +0080 +0100 +0300 +0560 +1918 +6104 +0100 +0104 +FFFE +0000 +ENDCHAR +STARTCHAR U+82E5 +ENCODING 33509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0100 +0100 +7FFC +0200 +07F0 +1C10 +6410 +0410 +07F0 +0410 +0000 +ENDCHAR +STARTCHAR U+82E6 +ENCODING 33510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0100 +7FFC +0100 +0100 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+82E7 +ENCODING 33511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +3FFC +2008 +4000 +7FFC +0100 +0100 +0100 +0100 +0300 +0000 +ENDCHAR +STARTCHAR U+82E8 +ENCODING 33512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +3FFE +2002 +3FFE +2000 +2200 +221C +23F0 +6200 +4201 +C303 +01FE +ENDCHAR +STARTCHAR U+82EA +ENCODING 33514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0000 +FFFF +0100 +3FFC +2104 +2384 +26E4 +2C34 +2004 +2004 +201C +ENDCHAR +STARTCHAR U+82EB +ENCODING 33515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0100 +01F8 +0100 +0100 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+82EC +ENCODING 33516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +7FFF +4001 +4081 +4081 +4141 +4221 +4C19 +4001 +7FFF +4001 +0000 +0000 +ENDCHAR +STARTCHAR U+82ED +ENCODING 33517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +1020 +1020 +34FE +6422 +CC22 +6822 +1A22 +3262 +2646 +7AC4 +C19C +ENDCHAR +STARTCHAR U+82EF +ENCODING 33519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0100 +0104 +FFFE +0380 +0540 +0920 +1110 +2FEE +C104 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+82F0 +ENCODING 33520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +7C00 +0410 +7C10 +4010 +7C20 +0440 +0444 +0482 +29FF +1001 +0000 +0000 +ENDCHAR +STARTCHAR U+82F1 +ENCODING 33521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0100 +1FF0 +1110 +1110 +1110 +7FFC +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+82F2 +ENCODING 33522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1000 +1000 +1FFE +2100 +4100 +01FC +0100 +0100 +01FC +0100 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+82F3 +ENCODING 33523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0640 +03E0 +0C40 +3280 +0380 +0E60 +711C +0100 +0040 +0180 +0600 +0000 +ENDCHAR +STARTCHAR U+82F4 +ENCODING 33524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0FE0 +0820 +0820 +0FE0 +0820 +0FE0 +0820 +0820 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+82F5 +ENCODING 33525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +0880 +17FC +2080 +0080 +7FFF +0140 +0220 +0410 +0808 +7007 +0000 +0000 +ENDCHAR +STARTCHAR U+82F6 +ENCODING 33526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0380 +06C0 +0C70 +381C +E107 +0100 +1110 +3118 +610C +C107 +0700 +ENDCHAR +STARTCHAR U+82F7 +ENCODING 33527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0820 +0824 +FFFE +0820 +0820 +0820 +0FE0 +0820 +0820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR U+82F9 +ENCODING 33529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3FF8 +0920 +0910 +1108 +2108 +7FFC +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+82FA +ENCODING 33530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0FE0 +0A20 +0920 +7FFC +1220 +1120 +1120 +3FF8 +2040 +0180 +0000 +ENDCHAR +STARTCHAR U+82FB +ENCODING 33531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0810 +0810 +17FC +1010 +3110 +5090 +1090 +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+82FD +ENCODING 33533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0078 +1F90 +1010 +1110 +1110 +1108 +1148 +1128 +21E4 +2714 +200A +4001 +ENDCHAR +STARTCHAR U+82FE +ENCODING 33534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0410 +0104 +0084 +0248 +0210 +1222 +1242 +2281 +2305 +0604 +1BFC +6000 +ENDCHAR +STARTCHAR U+8300 +ENCODING 33536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +FFFF +0820 +0000 +0440 +7FFC +0444 +7FFC +4440 +4440 +7FFE +0442 +0C42 +1846 +705C +ENDCHAR +STARTCHAR U+8301 +ENCODING 33537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0820 +0100 +2108 +2108 +2108 +3FF8 +0100 +4104 +4104 +4104 +4104 +7FFC +4004 +ENDCHAR +STARTCHAR U+8302 +ENCODING 33538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0110 +0108 +1FFC +1100 +1090 +1090 +1060 +1064 +219C +4604 +0000 +ENDCHAR +STARTCHAR U+8303 +ENCODING 33539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1000 +09F8 +4908 +2108 +2108 +0930 +1100 +1104 +2104 +20FC +0000 +ENDCHAR +STARTCHAR U+8304 +ENCODING 33540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1440 +1000 +7EF8 +1288 +1288 +1288 +1288 +2288 +22F8 +4C88 +0000 +ENDCHAR +STARTCHAR U+8305 +ENCODING 33541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +04C0 +0300 +7FFC +0118 +0360 +0500 +1900 +6100 +0300 +0000 +ENDCHAR +STARTCHAR U+8306 +ENCODING 33542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0600 +38F8 +2488 +2488 +2488 +2488 +3C88 +64F0 +0880 +1080 +0000 +ENDCHAR +STARTCHAR U+8307 +ENCODING 33543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0240 +0224 +FFFE +0400 +0400 +07F0 +0A20 +0940 +1080 +2160 +461C +1808 +ENDCHAR +STARTCHAR U+8308 +ENCODING 33544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0000 +0440 +2444 +274C +2450 +2460 +2440 +2440 +2742 +F842 +403E +0000 +ENDCHAR +STARTCHAR U+8309 +ENCODING 33545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +0100 +7FFC +0100 +3FF8 +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+830A +ENCODING 33546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +0018 +01F0 +1F00 +1000 +1FFE +1010 +1010 +1010 +1010 +1010 +FFFF +ENDCHAR +STARTCHAR U+830B +ENCODING 33547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +007C +3FC0 +2040 +2040 +3FFF +2040 +2060 +3E20 +E031 +001B +7F8E +ENDCHAR +STARTCHAR U+830C +ENCODING 33548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0424 +FFFE +0420 +0840 +0840 +1044 +1FFE +3040 +5040 +9040 +1040 +1048 +17FC +1000 +1000 +ENDCHAR +STARTCHAR U+830D +ENCODING 33549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1000 +3FFF +4001 +0001 +0FC1 +0841 +0841 +0FC1 +0842 +0004 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+830E +ENCODING 33550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +0460 +0380 +0D60 +711C +0FE0 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+830F +ENCODING 33551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0220 +0214 +FFFE +0280 +0288 +0498 +04A0 +08C0 +0882 +1182 +267E +4000 +ENDCHAR +STARTCHAR U+8311 +ENCODING 33553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0220 +0FF0 +0820 +0A20 +0960 +0808 +0FFC +0008 +FFC8 +0008 +0050 +0020 +ENDCHAR +STARTCHAR U+8314 +ENCODING 33556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0000 +7FFE +4102 +8104 +0110 +3FF8 +0100 +0100 +0100 +0108 +7FFC +0000 +ENDCHAR +STARTCHAR U+8315 +ENCODING 33557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0000 +7FFE +4002 +9FE4 +0420 +0520 +3FA0 +0420 +0420 +0424 +0414 +0408 +ENDCHAR +STARTCHAR U+8316 +ENCODING 33558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0100 +03E0 +3C40 +0380 +0660 +7FFC +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8317 +ENCODING 33559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0100 +03F0 +0E20 +3140 +0180 +0FF8 +7408 +0408 +07F8 +0408 +0000 +ENDCHAR +STARTCHAR U+8318 +ENCODING 33560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +0110 +0610 +1860 +0000 +7FF8 +1248 +1248 +2288 +4D30 +0000 +ENDCHAR +STARTCHAR U+8319 +ENCODING 33561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0004 +0012 +7FFF +0410 +0411 +7F92 +0414 +0809 +1015 +2023 +0041 +0000 +0000 +ENDCHAR +STARTCHAR U+831A +ENCODING 33562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0608 +38FC +2088 +2088 +3E88 +2088 +2088 +26A8 +3890 +2080 +0080 +0080 +ENDCHAR +STARTCHAR U+831B +ENCODING 33563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1FF0 +1010 +1FF0 +1010 +1FF8 +1410 +1220 +1140 +1080 +1460 +181C +1008 +ENDCHAR +STARTCHAR U+831C +ENCODING 33564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +7FFC +0480 +3FF8 +2488 +2498 +2878 +3008 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+831D +ENCODING 33565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +3FFE +2080 +2080 +24FC +2404 +2404 +24FC +2080 +2080 +2080 +3FFE +ENDCHAR +STARTCHAR U+831E +ENCODING 33566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +3FFE +2080 +2080 +3FFC +2004 +2004 +3FFC +2080 +2080 +2080 +3FFE +ENDCHAR +STARTCHAR U+831F +ENCODING 33567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0100 +3FFC +0104 +FFFF +0104 +3FFC +0100 +3FFC +0100 +FFFF +0100 +0100 +ENDCHAR +STARTCHAR U+8320 +ENCODING 33568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7F7F +0410 +0220 +0420 +09FE +1820 +2870 +48A8 +0924 +0A22 +0821 +0820 +0000 +0000 +ENDCHAR +STARTCHAR U+8321 +ENCODING 33569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0100 +7FFE +4002 +5FFA +0030 +00C0 +FFFF +0100 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U+8322 +ENCODING 33570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0002 +7F92 +0812 +0812 +1F12 +1112 +3312 +6A12 +0602 +0C02 +1802 +700E +ENDCHAR +STARTCHAR U+8323 +ENCODING 33571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +13F0 +1210 +13F0 +1000 +1FF0 +0110 +7FFC +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+8324 +ENCODING 33572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0490 +0510 +03E0 +0440 +0290 +0120 +027C +1CC8 +0030 +0020 +0040 +0F80 +0000 +0000 +ENDCHAR +STARTCHAR U+8325 +ENCODING 33573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +1FFC +0080 +0082 +7FFF +0080 +0088 +1FFC +0080 +0082 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8326 +ENCODING 33574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0080 +7FFF +0080 +1FFC +1084 +11CC +02A0 +0490 +0888 +7087 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8327 +ENCODING 33575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0820 +0920 +0108 +3FFC +2108 +2108 +2108 +3FF8 +2100 +0110 +01F8 +7F04 +0004 +ENDCHAR +STARTCHAR U+8328 +ENCODING 33576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0540 +2100 +11FC +1148 +0250 +0440 +18A0 +6110 +0608 +1804 +0000 +ENDCHAR +STARTCHAR U+8329 +ENCODING 33577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0002 +3FFC +1000 +1FFE +1000 +17FC +1404 +1404 +2404 +47FC +0404 +0000 +0000 +ENDCHAR +STARTCHAR U+832A +ENCODING 33578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +0888 +0490 +02A0 +7FFF +0220 +0220 +0420 +0821 +1021 +203F +0000 +0000 +ENDCHAR +STARTCHAR U+832B +ENCODING 33579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1040 +0840 +4BFC +2200 +2200 +0A00 +1200 +1200 +21F8 +2000 +0000 +ENDCHAR +STARTCHAR U+832C +ENCODING 33580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0A20 +0204 +FFFE +0400 +0840 +1048 +17FC +3040 +5040 +9040 +1044 +1FFE +1000 +ENDCHAR +STARTCHAR U+832D +ENCODING 33581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0108 +7FFC +0800 +0810 +144C +2444 +4280 +0100 +0280 +0460 +181C +6008 +ENDCHAR +STARTCHAR U+832E +ENCODING 33582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0100 +01F8 +0100 +0100 +FFFF +0100 +1110 +3118 +610C +C107 +0700 +ENDCHAR +STARTCHAR U+832F +ENCODING 33583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0850 +0848 +1040 +17FC +3040 +5060 +10A0 +1090 +1308 +1C04 +0000 +ENDCHAR +STARTCHAR U+8330 +ENCODING 33584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0100 +3FFC +2104 +3FFC +2104 +3FFC +0900 +0700 +0380 +1CF0 +F01F +ENDCHAR +STARTCHAR U+8331 +ENCODING 33585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0900 +0900 +1FF0 +2100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+8332 +ENCODING 33586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0820 +0820 +32C8 +1248 +0C30 +0410 +0C30 +1248 +7FF4 +0104 +0000 +ENDCHAR +STARTCHAR U+8333 +ENCODING 33587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +2000 +1808 +0BFC +4040 +2040 +2840 +1040 +2040 +6040 +2044 +2FFE +2000 +ENDCHAR +STARTCHAR U+8334 +ENCODING 33588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0000 +3FF8 +2008 +27C8 +2448 +2448 +27C8 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+8335 +ENCODING 33589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0000 +3FF8 +2108 +2FE8 +2108 +2288 +2448 +2848 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+8336 +ENCODING 33590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0280 +0440 +1930 +610C +1FF0 +0100 +0540 +1930 +6108 +0100 +0000 +ENDCHAR +STARTCHAR U+8337 +ENCODING 33591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +0844 +0846 +1842 +33FF +7024 +D02C +1038 +1010 +1039 +10ED +1387 +ENDCHAR +STARTCHAR U+8338 +ENCODING 33592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +7FFC +0820 +0FE0 +0820 +0FE0 +0838 +0FE0 +7820 +0020 +0020 +0000 +ENDCHAR +STARTCHAR U+8339 +ENCODING 33593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +08F8 +7E88 +1288 +1288 +3A88 +2488 +06F8 +1A88 +6000 +0000 +ENDCHAR +STARTCHAR U+833A +ENCODING 33594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0104 +FFFE +0200 +0440 +0820 +1FF0 +0490 +0480 +0480 +0884 +1084 +607C +ENDCHAR +STARTCHAR U+833B +ENCODING 33595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +4949 +4949 +7F7F +1010 +2020 +4848 +4949 +4949 +7F7F +1010 +2020 +4040 +0000 +0000 +ENDCHAR +STARTCHAR U+833C +ENCODING 33596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +3FF8 +2008 +2FE8 +2008 +27C8 +2448 +2448 +2448 +27C8 +2008 +2028 +2010 +ENDCHAR +STARTCHAR U+833D +ENCODING 33597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +0820 +0820 +1BFF +3221 +7221 +D221 +1221 +13FF +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+833F +ENCODING 33599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0000 +7DF8 +1048 +1148 +10C8 +1068 +1448 +1889 +7109 +020F +0000 +0000 +ENDCHAR +STARTCHAR U+8340 +ENCODING 33600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +0FF8 +1008 +2F88 +4888 +0F88 +0888 +0F88 +0888 +0030 +0000 +ENDCHAR +STARTCHAR U+8341 +ENCODING 33601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0000 +3FFE +0000 +0FF8 +0808 +0FF8 +0808 +0FF8 +0000 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8342 +ENCODING 33602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0100 +FFFF +0660 +0810 +37EC +C003 +3FFC +0400 +0FF8 +0008 +0018 +0070 +ENDCHAR +STARTCHAR U+8343 +ENCODING 33603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0280 +0440 +0830 +300E +DFF4 +0100 +0120 +1FF0 +0100 +0108 +7FFC +0000 +ENDCHAR +STARTCHAR U+8344 +ENCODING 33604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0100 +FFFF +0300 +3640 +18C8 +0D98 +0330 +0EE0 +79B0 +071C +7C06 +ENDCHAR +STARTCHAR U+8345 +ENCODING 33605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0280 +0440 +1830 +6FEC +0000 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+8346 +ENCODING 33606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +1284 +FFC4 +1224 +0024 +7FA4 +1224 +12A4 +FFE4 +1224 +1224 +1224 +1224 +2204 +4214 +0208 +ENDCHAR +STARTCHAR U+8347 +ENCODING 33607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0408 +09FC +1000 +6404 +0BFE +1810 +2810 +C810 +0810 +0810 +0850 +0820 +ENDCHAR +STARTCHAR U+8348 +ENCODING 33608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0804 +0804 +1F3F +2124 +4124 +1124 +0A7F +0404 +0804 +1004 +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+8349 +ENCODING 33609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +1010 +1FF0 +1010 +1FF0 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+834A +ENCODING 33610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0000 +3F48 +1248 +1248 +7FC8 +1248 +1248 +1248 +2208 +4218 +0000 +ENDCHAR +STARTCHAR U+834B +ENCODING 33611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +3FFE +0080 +0100 +3FFE +2222 +2222 +2222 +2222 +222A +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+834C +ENCODING 33612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +7FFF +4401 +0410 +3FFE +0410 +0220 +0140 +0080 +0140 +7E3F +0000 +0000 +ENDCHAR +STARTCHAR U+834D +ENCODING 33613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +0440 +4440 +44FF +4484 +4544 +446C +5C38 +7410 +C438 +046C +05C7 +ENDCHAR +STARTCHAR U+834E +ENCODING 33614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +7FFE +0400 +0C10 +09F8 +3F0C +0000 +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+834F +ENCODING 33615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0818 +0BE0 +1040 +1040 +37FC +5040 +1040 +1040 +13F8 +1000 +0000 +ENDCHAR +STARTCHAR U+8350 +ENCODING 33616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0100 +7FFC +0200 +0FF0 +0820 +1840 +6FFC +0840 +0840 +08C0 +0000 +ENDCHAR +STARTCHAR U+8351 +ENCODING 33617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0104 +FFFE +0100 +3FF8 +0108 +3FF8 +2100 +3FFC +0284 +0C4C +3030 +C00E +ENDCHAR +STARTCHAR U+8352 +ENCODING 33618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +7FFC +0800 +0800 +07F0 +0920 +0920 +0924 +1124 +601C +0000 +ENDCHAR +STARTCHAR U+8353 +ENCODING 33619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +1008 +1818 +0810 +7FFE +0810 +0810 +0810 +FFFF +0810 +1810 +3010 +6010 +ENDCHAR +STARTCHAR U+8354 +ENCODING 33620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FFFE +0A20 +0200 +1FF0 +0410 +0490 +0860 +1020 +1024 +7EFE +1224 +1224 +2244 +4A94 +8508 +ENDCHAR +STARTCHAR U+8355 +ENCODING 33621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0020 +3E20 +22FE +2222 +3E22 +2222 +2222 +3E22 +2262 +6242 +C6CE +ENDCHAR +STARTCHAR U+8356 +ENCODING 33622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0104 +3FFC +0108 +0130 +FFFF +00C0 +0780 +3C1C +E7F0 +0401 +0603 +03FE +ENDCHAR +STARTCHAR U+8357 +ENCODING 33623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0088 +0084 +3FFF +2040 +2048 +2858 +2C70 +2620 +6271 +40DB +C38E +ENDCHAR +STARTCHAR U+8358 +ENCODING 33624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0840 +4840 +2840 +2FFC +0840 +1840 +2840 +4840 +0BF8 +0800 +0000 +ENDCHAR +STARTCHAR U+835A +ENCODING 33626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0108 +7FFC +0100 +0920 +0544 +FFFE +0100 +0280 +0440 +0830 +300E +C004 +ENDCHAR +STARTCHAR U+835B +ENCODING 33627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0100 +01F8 +7F20 +0144 +0384 +3C7C +0010 +7FF8 +0480 +0482 +0882 +707E +ENDCHAR +STARTCHAR U+835C +ENCODING 33628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +2080 +2098 +3EE0 +2080 +2684 +397C +0100 +FFFE +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+835E +ENCODING 33630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +01F0 +3E00 +0204 +FFFE +0440 +0830 +344E +C444 +0440 +0440 +0840 +1040 +ENDCHAR +STARTCHAR U+835F +ENCODING 33631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0280 +0440 +0830 +304E +CFE4 +0000 +3FF8 +0200 +0440 +0820 +1FF0 +0010 +ENDCHAR +STARTCHAR U+8360 +ENCODING 33632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0108 +7FFC +0820 +06C0 +0100 +02C0 +0C70 +344E +C444 +0440 +0840 +1040 +ENDCHAR +STARTCHAR U+8361 +ENCODING 33633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0820 +47F0 +3040 +1080 +8104 +47FE +1124 +2124 +E244 +2244 +2484 +2928 +2010 +ENDCHAR +STARTCHAR U+8363 +ENCODING 33635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0000 +7FFE +4102 +8104 +0100 +7FFC +0380 +0540 +0920 +111C +6108 +0100 +ENDCHAR +STARTCHAR U+8364 +ENCODING 33636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0448 +7FFC +0440 +7FFE +4204 +8208 +3FF8 +0500 +0920 +1FF0 +0104 +FFFE +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+8365 +ENCODING 33637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +4000 +7FFE +4102 +4114 +BD20 +05C0 +0940 +0920 +1120 +611C +0500 +0200 +ENDCHAR +STARTCHAR U+8366 +ENCODING 33638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +4000 +7FFE +4102 +8924 +0FF0 +1100 +2108 +7FFC +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+8367 +ENCODING 33639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0448 +7FFC +0440 +0440 +7FFE +4102 +8114 +0930 +0940 +1100 +0280 +0240 +0430 +180E +6004 +ENDCHAR +STARTCHAR U+8368 +ENCODING 33640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1FF0 +0010 +0FF0 +0010 +1FF0 +0024 +FFFE +0820 +0420 +0420 +00A0 +0040 +ENDCHAR +STARTCHAR U+8369 +ENCODING 33641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1FF0 +1010 +1010 +1FF0 +1040 +1220 +1190 +208E +2004 +4300 +80C0 +0020 +ENDCHAR +STARTCHAR U+836A +ENCODING 33642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0020 +7E20 +0420 +08A0 +0EA8 +38A4 +C924 +0922 +0A22 +0820 +28A0 +1040 +ENDCHAR +STARTCHAR U+836B +ENCODING 33643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0820 +7CFC +4484 +4884 +50FC +4884 +4484 +44FC +6484 +5904 +4104 +4214 +4408 +ENDCHAR +STARTCHAR U+836C +ENCODING 33644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0000 +3FF8 +0008 +0C90 +0280 +1880 +0484 +FFFE +0100 +0260 +0C18 +3004 +ENDCHAR +STARTCHAR U+836D +ENCODING 33645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1000 +1008 +23FC +7C20 +0820 +1020 +2620 +7820 +2020 +0E24 +73FE +2000 +ENDCHAR +STARTCHAR U+836E +ENCODING 33646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1008 +1008 +2208 +7DFE +0808 +1088 +2648 +7848 +0008 +0E08 +7028 +2010 +ENDCHAR +STARTCHAR U+836F +ENCODING 33647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0840 +1044 +227E +7C84 +0904 +1044 +7E24 +0024 +0E04 +7004 +2028 +0010 +ENDCHAR +STARTCHAR U+8370 +ENCODING 33648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +1010 +1010 +FE10 +1010 +30FE +3810 +5410 +5210 +9010 +1010 +11FF +ENDCHAR +STARTCHAR U+8373 +ENCODING 33651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3FF8 +0000 +0FE0 +0820 +0820 +0FE0 +0440 +0280 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8374 +ENCODING 33652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7FFF +0808 +1010 +1010 +7CFE +1010 +1410 +19FF +7010 +1028 +1044 +5082 +2101 +0000 +0000 +ENDCHAR +STARTCHAR U+8375 +ENCODING 33653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3FF0 +0210 +0E10 +0590 +1860 +6100 +2488 +2484 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+8376 +ENCODING 33654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0070 +7888 +4B06 +4CF9 +4800 +4BFE +4804 +7808 +4810 +0020 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+8377 +ENCODING 33655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +0BFC +1010 +13D0 +3250 +5250 +13D0 +1210 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+8378 +ENCODING 33656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0110 +3FF8 +0100 +7FFE +4002 +9FE4 +0080 +0108 +7FFC +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+837A +ENCODING 33658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1080 +11FF +1201 +7CF1 +1001 +1001 +15F9 +1801 +7002 +0024 +0018 +0000 +0000 +ENDCHAR +STARTCHAR U+837B +ENCODING 33659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0420 +3428 +08A8 +18B0 +6520 +0D60 +1450 +6490 +0508 +1A04 +0000 +ENDCHAR +STARTCHAR U+837C +ENCODING 33660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0280 +0440 +1FF0 +610C +1FF0 +0100 +0540 +1930 +6108 +0300 +0000 +ENDCHAR +STARTCHAR U+837D +ENCODING 33661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +00F8 +3F10 +1110 +0920 +0204 +FFFE +0420 +0820 +0640 +0180 +0660 +3810 +ENDCHAR +STARTCHAR U+837E +ENCODING 33662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0200 +0404 +3FFE +0812 +1208 +67F7 +0A20 +1140 +0080 +0140 +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+837F +ENCODING 33663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +0088 +0084 +3FFF +2040 +2048 +3E58 +2270 +2220 +6671 +4CDB +C38E +ENDCHAR +STARTCHAR U+8380 +ENCODING 33664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +3FFF +2000 +27FC +2000 +3FFF +2440 +2466 +242C +6430 +479C +DC07 +ENDCHAR +STARTCHAR U+8381 +ENCODING 33665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0410 +0004 +3FFE +0080 +0888 +0888 +1494 +22A2 +0080 +0082 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8382 +ENCODING 33666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +7F02 +4122 +4122 +7F22 +1022 +1F22 +1122 +3122 +2102 +6302 +CE0E +ENDCHAR +STARTCHAR U+8383 +ENCODING 33667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0140 +0080 +0140 +7FFF +0240 +07FC +7C44 +0444 +0444 +0448 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+8384 +ENCODING 33668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +FFFF +0100 +3FFC +2104 +3FFC +2104 +3FFC +0500 +0380 +1CF0 +F01F +ENDCHAR +STARTCHAR U+8385 +ENCODING 33669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0880 +0880 +17F8 +1010 +3210 +5120 +1120 +1140 +1FFC +1000 +0000 +ENDCHAR +STARTCHAR U+8386 +ENCODING 33670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0448 +7FFC +0440 +0550 +0108 +FFFE +0110 +1FF8 +1110 +1FF0 +1110 +1FF0 +1110 +1150 +1120 +ENDCHAR +STARTCHAR U+8387 +ENCODING 33671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3C40 +2440 +25F8 +3C48 +2448 +3C48 +2488 +2688 +3908 +6230 +0000 +ENDCHAR +STARTCHAR U+8388 +ENCODING 33672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7FFF +0810 +2040 +107E +0842 +4084 +2108 +10FE +0044 +0828 +1010 +206C +4183 +0000 +0000 +ENDCHAR +STARTCHAR U+8389 +ENCODING 33673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0608 +3848 +0848 +7F48 +1C48 +1A48 +2A48 +4848 +0808 +0818 +0000 +ENDCHAR +STARTCHAR U+838A +ENCODING 33674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +2440 +2440 +3C40 +27FC +0440 +7C40 +1440 +1440 +27F8 +4400 +0000 +ENDCHAR +STARTCHAR U+838B +ENCODING 33675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0880 +0882 +11FF +3240 +507F +1040 +1040 +107F +1040 +1040 +1040 +0000 +0000 +ENDCHAR +STARTCHAR U+838C +ENCODING 33676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +0410 +0808 +1FFC +680B +0808 +0FF8 +0220 +0220 +0421 +0821 +303F +0000 +0000 +ENDCHAR +STARTCHAR U+838D +ENCODING 33677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0108 +0104 +FFFF +0100 +310C +1918 +09B0 +05C0 +0D70 +391C +E107 +0700 +ENDCHAR +STARTCHAR U+838E +ENCODING 33678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1040 +0950 +4948 +2244 +224C +0CD0 +1020 +1040 +2180 +2600 +0000 +ENDCHAR +STARTCHAR U+838F +ENCODING 33679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1020 +7C28 +10A4 +1122 +1221 +1824 +7024 +1008 +1010 +5020 +27C0 +0000 +0000 +ENDCHAR +STARTCHAR U+8390 +ENCODING 33680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +2020 +13FE +4A22 +2222 +1020 +0050 +1090 +2111 +4211 +040F +0000 +0000 +ENDCHAR +STARTCHAR U+8392 +ENCODING 33682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1FF0 +1010 +1010 +1010 +1FF0 +0008 +3FFC +2008 +2008 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+8393 +ENCODING 33683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1000 +1FFC +2000 +4FE0 +0920 +08A0 +7FFC +1220 +1120 +3FF8 +00C0 +0000 +ENDCHAR +STARTCHAR U+8394 +ENCODING 33684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +7FFE +4422 +4422 +4C22 +783E +4002 +47E2 +4422 +4422 +4422 +7FFE +ENDCHAR +STARTCHAR U+8395 +ENCODING 33685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0910 +0100 +FFFF +0540 +0D70 +391C +E107 +1FF8 +1008 +1008 +1008 +1FF8 +ENDCHAR +STARTCHAR U+8396 +ENCODING 33686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +7FFC +0888 +1110 +3330 +0888 +3FF8 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8397 +ENCODING 33687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7FFF +0888 +3FFE +0080 +1FFC +1084 +1FFC +1084 +1FFC +0080 +7FFF +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8398 +ENCODING 33688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0110 +3FF8 +0820 +0440 +0484 +FFFE +0100 +0110 +3FF8 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+8399 +ENCODING 33689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +3FFC +0204 +FFFF +0204 +3FFC +0400 +0FFE +3802 +E802 +0802 +0FFE +ENDCHAR +STARTCHAR U+839A +ENCODING 33690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +7818 +0BE0 +1040 +3A40 +0A78 +4A40 +3240 +11F8 +2C00 +43FC +0000 +ENDCHAR +STARTCHAR U+839B +ENCODING 33691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +001C +7DE0 +0420 +0824 +13FE +3C20 +0420 +2428 +19FC +0C00 +3206 +C1FC +ENDCHAR +STARTCHAR U+839C +ENCODING 33692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0880 +0884 +14FE +1588 +3688 +5450 +9450 +1420 +1450 +1088 +110E +1204 +ENDCHAR +STARTCHAR U+839D +ENCODING 33693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0100 +1110 +1110 +3938 +2D6C +6546 +C103 +0100 +3FFC +0100 +0100 +FFFF +ENDCHAR +STARTCHAR U+839E +ENCODING 33694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0100 +3FFC +2008 +4FE0 +0000 +3FFC +0280 +0484 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+839F +ENCODING 33695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0280 +0440 +1FF0 +600C +1FE0 +0040 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+83A0 +ENCODING 33696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0470 +1FC0 +0100 +7FFC +0540 +1930 +6FCC +0240 +0270 +0C10 +30E0 +0000 +ENDCHAR +STARTCHAR U+83A2 +ENCODING 33698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +7FFC +0920 +0930 +1548 +2388 +0280 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+83A3 +ENCODING 33699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +7FFF +0800 +0800 +0FFC +0000 +2500 +2484 +2442 +4409 +07F8 +0000 +0000 +ENDCHAR +STARTCHAR U+83A4 +ENCODING 33700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +3FFE +0220 +0220 +3FFE +2222 +243E +2802 +27F2 +2002 +3FFE +2002 +0000 +0000 +ENDCHAR +STARTCHAR U+83A5 +ENCODING 33701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +44FC +2824 +1024 +2824 +4424 +0CFF +1424 +2424 +0424 +2824 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+83A6 +ENCODING 33702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +2104 +310C +1918 +0100 +3FFC +2004 +3FFC +2004 +3FFC +2004 +2004 +201C +ENDCHAR +STARTCHAR U+83A7 +ENCODING 33703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +0420 +0C20 +1833 +F01E +ENDCHAR +STARTCHAR U+83A8 +ENCODING 33704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +1FF0 +1010 +1FF0 +1010 +1FF8 +1110 +10A0 +1E60 +701C +0000 +ENDCHAR +STARTCHAR U+83A9 +ENCODING 33705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +00F8 +7F10 +1110 +0920 +3FF0 +0040 +0180 +0104 +FFFE +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+83AA +ENCODING 33706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0650 +3848 +0840 +7FFC +0848 +0E30 +7820 +08D4 +0B0C +1804 +0000 +ENDCHAR +STARTCHAR U+83AB +ENCODING 33707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +1010 +1FF0 +1010 +1FF0 +0100 +7FFC +0280 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+83AC +ENCODING 33708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0400 +0FF0 +1820 +7040 +3FFC +2104 +2104 +3FFC +0440 +0C41 +3863 +E03E +ENDCHAR +STARTCHAR U+83AD +ENCODING 33709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +7E7E +4242 +7E42 +4242 +7E42 +4042 +4442 +444E +7E40 +C240 +0040 +ENDCHAR +STARTCHAR U+83AE +ENCODING 33710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1FFC +1084 +1FFC +1084 +1FFC +0100 +3FFE +0202 +0402 +0814 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+83AF +ENCODING 33711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +2020 +1020 +4BFE +2020 +1070 +00A8 +0924 +1222 +2421 +4020 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+83B0 +ENCODING 33712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1080 +1084 +10FE +FD04 +1248 +1040 +1040 +10A0 +1CA0 +E110 +420E +0404 +ENDCHAR +STARTCHAR U+83B1 +ENCODING 33713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +3FF8 +0920 +0540 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+83B2 +ENCODING 33714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +2440 +1090 +17F8 +0100 +7150 +13F8 +1040 +1048 +17FC +1040 +2846 +47FC +0000 +ENDCHAR +STARTCHAR U+83B3 +ENCODING 33715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0010 +7C10 +4414 +47FE +4410 +7C90 +4450 +4450 +4410 +7C10 +4450 +0020 +ENDCHAR +STARTCHAR U+83B4 +ENCODING 33716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0FE0 +0820 +0820 +0FE0 +0108 +3FFC +2108 +2108 +22C8 +2C48 +2028 +2010 +ENDCHAR +STARTCHAR U+83B5 +ENCODING 33717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0200 +1FF0 +1110 +1110 +1FF0 +1110 +0340 +0524 +1924 +60FC +0000 +ENDCHAR +STARTCHAR U+83B6 +ENCODING 33718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0280 +0440 +0830 +3FEE +C004 +0210 +1110 +0920 +0920 +0048 +7FFC +0000 +ENDCHAR +STARTCHAR U+83B7 +ENCODING 33719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +2428 +1824 +1020 +2BFE +4820 +0820 +1820 +2850 +C850 +0888 +2906 +1204 +ENDCHAR +STARTCHAR U+83B8 +ENCODING 33720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +2050 +1448 +0BFE +1440 +6460 +0CA0 +14A0 +24A0 +C522 +0522 +2A1E +1400 +ENDCHAR +STARTCHAR U+83B9 +ENCODING 33721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0448 +7FFC +0440 +0440 +7FFE +4002 +BFF4 +0100 +0110 +3FF8 +0100 +0140 +0124 +FFFE +0000 +ENDCHAR +STARTCHAR U+83BA +ENCODING 33722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +7FFE +4202 +8FE4 +0820 +0B20 +08A0 +0848 +0FFC +0008 +7FC8 +0028 +0010 +ENDCHAR +STARTCHAR U+83BC +ENCODING 33724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1048 +17FC +2040 +7E48 +0A48 +1248 +23F8 +7C48 +0040 +0E42 +7042 +203E +ENDCHAR +STARTCHAR U+83BD +ENCODING 33725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0100 +7FFC +0280 +0440 +1C70 +644C +3FF8 +0440 +0840 +3040 +0000 +ENDCHAR +STARTCHAR U+83BE +ENCODING 33726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0100 +FFFF +0420 +0D30 +391C +EFF7 +0100 +0910 +FFFF +0810 +1810 +7010 +ENDCHAR +STARTCHAR U+83BF +ENCODING 33727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +0802 +FF92 +0812 +7F92 +4892 +4892 +5D92 +3A02 +6982 +C802 +080E +ENDCHAR +STARTCHAR U+83C0 +ENCODING 33728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +4100 +7FFE +5002 +9EFC +1288 +2288 +5288 +0CA8 +0492 +0882 +307E +4000 +ENDCHAR +STARTCHAR U+83C1 +ENCODING 33729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +3FF8 +0100 +1FF0 +0100 +7FFC +1FF0 +1110 +1FF0 +1010 +1010 +1030 +0000 +ENDCHAR +STARTCHAR U+83C2 +ENCODING 33730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +1020 +207F +7F81 +2101 +2121 +3F11 +2101 +2101 +3F12 +210C +0000 +0000 +ENDCHAR +STARTCHAR U+83C3 +ENCODING 33731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +2000 +11FF +0900 +4100 +21FE +1102 +0502 +09FE +1100 +2100 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+83C4 +ENCODING 33732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +3FFE +0080 +1FFC +1084 +1FFC +1084 +1FFC +0490 +0888 +3086 +0000 +0000 +ENDCHAR +STARTCHAR U+83C5 +ENCODING 33733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +3FFC +2008 +4FE0 +0820 +0FE0 +0800 +0FF0 +0810 +0FF0 +0810 +0000 +ENDCHAR +STARTCHAR U+83C6 +ENCODING 33734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +7F00 +223E +3E22 +2222 +3E14 +2208 +7F14 +0222 +0241 +0200 +0000 +0000 +ENDCHAR +STARTCHAR U+83C7 +ENCODING 33735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1020 +1024 +FFFE +1220 +1224 +22FE +2284 +1484 +0884 +1484 +22FC +4084 +ENDCHAR +STARTCHAR U+83C8 +ENCODING 33736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +7F7F +0808 +0000 +0810 +0810 +7EFE +0800 +0C44 +1844 +2844 +0844 +19FF +0000 +0000 +ENDCHAR +STARTCHAR U+83C9 +ENCODING 33737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0400 +07FC +0808 +0808 +1FF0 +1010 +7FFF +0086 +11D8 +0AA0 +0490 +188C +6183 +ENDCHAR +STARTCHAR U+83CA +ENCODING 33738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0C40 +0800 +1FF8 +1248 +2A48 +4A88 +3FE8 +0708 +0AC8 +3228 +0230 +0000 +ENDCHAR +STARTCHAR U+83CB +ENCODING 33739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0010 +7CFE +4410 +45FF +4410 +4438 +4454 +7C92 +4511 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+83CC +ENCODING 33740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FF8 +2068 +2F88 +2108 +3FF8 +2388 +2548 +3928 +2108 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+83CE +ENCODING 33742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +1010 +1FF0 +1010 +1FF0 +1098 +1EE0 +1084 +1E84 +607C +0000 +ENDCHAR +STARTCHAR U+83CF +ENCODING 33743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0820 +4004 +3FFE +1008 +8048 +63E8 +2248 +0A48 +1248 +E3C8 +2208 +2028 +2010 +ENDCHAR +STARTCHAR U+83D0 +ENCODING 33744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2244 +324C +1248 +FFFF +0810 +0C30 +0420 +7FFE +0100 +3FFC +0100 +FFFF +0240 +0660 +1C38 +F00F +ENDCHAR +STARTCHAR U+83D1 +ENCODING 33745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +1084 +318C +6318 +318C +1084 +3FFC +2104 +2104 +3FFC +2104 +2104 +3FFC +ENDCHAR +STARTCHAR U+83D3 +ENCODING 33747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+83D4 +ENCODING 33748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +3DF8 +2508 +2548 +3D30 +2500 +25F8 +3D88 +2550 +2520 +4550 +558E +8904 +ENDCHAR +STARTCHAR U+83D5 +ENCODING 33749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +03E0 +0410 +0808 +17F4 +2002 +5FFD +1224 +1FFC +1224 +1224 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+83D6 +ENCODING 33750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0820 +0FE0 +0820 +0FE0 +3FF8 +2008 +3FF8 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+83D7 +ENCODING 33751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0800 +0810 +7E10 +09FF +0B11 +0D11 +79FF +0911 +0911 +29FF +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+83D8 +ENCODING 33752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0870 +0810 +7E90 +0888 +1D44 +1A40 +2A50 +4888 +0BFC +0804 +0000 +ENDCHAR +STARTCHAR U+83D9 +ENCODING 33753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +1FF8 +0080 +7FFF +0888 +3FFE +0888 +0888 +7FFF +0080 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+83DB +ENCODING 33755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +3F7E +2142 +3F7E +2142 +3F7E +2002 +2002 +2002 +200A +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+83DC +ENCODING 33756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0470 +3F90 +1210 +0920 +0840 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+83DD +ENCODING 33757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1090 +1088 +FFFE +1100 +11F8 +1D88 +F290 +5250 +1420 +1850 +508E +2304 +ENDCHAR +STARTCHAR U+83DE +ENCODING 33758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0220 +7C20 +087F +0891 +7F11 +0811 +1C11 +2A11 +4921 +084E +0000 +0000 +ENDCHAR +STARTCHAR U+83DF +ENCODING 33759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +07E0 +1880 +7FF0 +1110 +1110 +1FF0 +1310 +0544 +1924 +60FC +0000 +ENDCHAR +STARTCHAR U+83E0 +ENCODING 33760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1040 +0BFC +4A48 +2250 +23F8 +0A88 +1250 +1220 +24D0 +2B0C +0000 +ENDCHAR +STARTCHAR U+83E1 +ENCODING 33761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1FE0 +0020 +4044 +5194 +4924 +4544 +4544 +4934 +5314 +4104 +7FFC +4004 +ENDCHAR +STARTCHAR U+83E2 +ENCODING 33762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0840 +08FE +7F02 +09F2 +0B12 +0DF2 +7902 +091C +0901 +2901 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+83E3 +ENCODING 33763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +7E00 +483E +4822 +7E22 +4222 +4222 +7E14 +4808 +4814 +7E63 +0000 +0000 +ENDCHAR +STARTCHAR U+83E4 +ENCODING 33764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0888 +0490 +3FFE +0080 +7FFF +0410 +0FE8 +1424 +2462 +0404 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+83E5 +ENCODING 33765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +081C +08E0 +FE80 +0884 +1CFE +1A90 +2890 +4890 +8910 +0910 +0A10 +0810 +ENDCHAR +STARTCHAR U+83E7 +ENCODING 33767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0040 +3FFF +2002 +2FFC +2420 +27FE +2420 +2410 +2509 +2605 +4C73 +0000 +0000 +ENDCHAR +STARTCHAR U+83E8 +ENCODING 33768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0100 +7FFE +0810 +0420 +FFFF +0200 +FFFF +0410 +0860 +1FC0 +01F8 +7E0E +ENDCHAR +STARTCHAR U+83E9 +ENCODING 33769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0100 +3FF8 +0820 +0440 +7FFC +0000 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+83EA +ENCODING 33770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +4100 +7FFE +4002 +8004 +7FFC +0400 +0410 +0FF8 +1810 +2810 +4810 +0FF0 +0810 +ENDCHAR +STARTCHAR U+83EB +ENCODING 33771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +7FFC +1FF0 +1110 +1FF0 +0100 +3FF8 +0100 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+83EC +ENCODING 33772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +27FF +1041 +0841 +4089 +2106 +17FF +0401 +0C01 +17FF +6401 +0000 +0000 +ENDCHAR +STARTCHAR U+83EE +ENCODING 33774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0040 +3FFF +2040 +27FC +2044 +2FFF +2044 +27FC +4110 +0208 +0C06 +0000 +0000 +ENDCHAR +STARTCHAR U+83EF +ENCODING 33775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1FF0 +0920 +7FFC +0920 +1FF8 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+83F0 +ENCODING 33776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0018 +3FF0 +0550 +0950 +0D50 +1950 +6968 +0A58 +0BF4 +1C14 +0000 +ENDCHAR +STARTCHAR U+83F1 +ENCODING 33777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +3FF0 +0100 +7FFC +0488 +1A78 +63E0 +0640 +1980 +0380 +0C60 +701C +0000 +ENDCHAR +STARTCHAR U+83F2 +ENCODING 33778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0280 +0280 +3EF8 +0280 +3EF8 +0380 +7EFC +0480 +1880 +6080 +0000 +ENDCHAR +STARTCHAR U+83F3 +ENCODING 33779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +7FFF +0808 +03E0 +0410 +0808 +17F4 +2082 +5FFD +1084 +0888 +0490 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+83F4 +ENCODING 33780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +7FFC +0540 +1FF0 +692C +0FE0 +0920 +0FE8 +0908 +00F8 +0000 +ENDCHAR +STARTCHAR U+83F5 +ENCODING 33781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +3FFE +2222 +2FFA +2082 +27F2 +2402 +27F2 +2002 +200A +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+83F6 +ENCODING 33782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0100 +7FFE +0100 +3FFC +0240 +FFFF +0C30 +310C +CFF3 +0100 +7FFE +0100 +0100 +ENDCHAR +STARTCHAR U+83F7 +ENCODING 33783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0020 +7FFC +0020 +0FE0 +3FFC +2108 +5FF0 +1110 +1130 +0100 +0000 +ENDCHAR +STARTCHAR U+83F8 +ENCODING 33784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1020 +0820 +FF50 +1050 +1E8E +1304 +1260 +2210 +2200 +42C0 +8A30 +0408 +ENDCHAR +STARTCHAR U+83F9 +ENCODING 33785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +4010 +33F8 +1210 +8210 +4BF0 +1210 +2210 +E3F0 +2210 +2214 +3FFE +2000 +ENDCHAR +STARTCHAR U+83FA +ENCODING 33786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0414 +1FF8 +1000 +1FFE +1002 +1FFE +1000 +2FFC +4FFC +0FFC +0804 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+83FB +ENCODING 33787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0820 +0820 +7FFC +0820 +1C70 +1A70 +2AA8 +4924 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+83FC +ENCODING 33788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +110C +3118 +2380 +0EF0 +781E +0100 +110C +3118 +6380 +06C0 +1C70 +F01F +ENDCHAR +STARTCHAR U+83FD +ENCODING 33789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +0EF8 +0848 +7F48 +0850 +2C30 +2A20 +2A50 +4888 +1904 +0000 +ENDCHAR +STARTCHAR U+83FE +ENCODING 33790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0004 +1FF8 +0200 +7FFF +0888 +1084 +6483 +0494 +0894 +0280 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+83FF +ENCODING 33791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0002 +7FC2 +0812 +1092 +3F92 +0492 +0412 +3F92 +0402 +040A +7FC4 +0000 +0000 +ENDCHAR +STARTCHAR U+8401 +ENCODING 33793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0828 +7FFC +0820 +0FE0 +0820 +0FE0 +0820 +0824 +FFFE +0440 +0830 +3008 +ENDCHAR +STARTCHAR U+8403 +ENCODING 33795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +3FF8 +0420 +0A50 +3188 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8404 +ENCODING 33796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0C40 +0800 +1FF8 +2408 +4FC8 +1208 +3FE8 +1248 +1248 +1FC8 +1030 +0000 +ENDCHAR +STARTCHAR U+8406 +ENCODING 33798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0208 +3FFC +2108 +3FF8 +2208 +3FF8 +0500 +0904 +FFFE +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+8407 +ENCODING 33799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FF0 +0800 +0FE0 +0800 +0FE0 +0800 +7FFC +0910 +08A0 +0E60 +301C +0000 +ENDCHAR +STARTCHAR U+8409 +ENCODING 33801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +3F7F +2149 +2149 +3F49 +217F +3F41 +2140 +2140 +2541 +427F +0000 +0000 +ENDCHAR +STARTCHAR U+840A +ENCODING 33802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +0080 +7FFF +0080 +0888 +0888 +1494 +22A2 +41C0 +02A0 +0490 +188C +6083 +ENDCHAR +STARTCHAR U+840B +ENCODING 33803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +3FF8 +1FE0 +0120 +7FFC +0120 +1FE0 +7FFC +0440 +0FC0 +0360 +3C10 +0000 +ENDCHAR +STARTCHAR U+840C +ENCODING 33804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +7CF8 +4488 +4488 +7CF8 +4488 +4488 +7CF8 +4488 +4108 +0218 +0000 +ENDCHAR +STARTCHAR U+840D +ENCODING 33805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +13F8 +0950 +4948 +2248 +2040 +0FFC +1040 +1040 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+840E +ENCODING 33806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0460 +1FC0 +0100 +7FFC +0540 +1930 +620C +3FF8 +0440 +0F80 +0360 +3C10 +0000 +ENDCHAR +STARTCHAR U+840F +ENCODING 33807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0800 +0FF0 +1020 +2648 +78FC +A008 +2408 +3EF8 +2008 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+8410 +ENCODING 33808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0490 +7FFF +0080 +1FF8 +0088 +3FFE +0088 +1FF8 +0080 +08F8 +1480 +63FF +0000 +0000 +ENDCHAR +STARTCHAR U+8411 +ENCODING 33809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +0900 +0888 +1FFC +1080 +3090 +5FF8 +9080 +1090 +1FF8 +1080 +1088 +1FFC +1000 +ENDCHAR +STARTCHAR U+8412 +ENCODING 33810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +7FFF +0808 +1104 +2222 +0410 +0FF8 +0224 +0421 +0821 +703F +0000 +0000 +ENDCHAR +STARTCHAR U+8413 +ENCODING 33811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +3FFC +2008 +4FE0 +0820 +0FE0 +0820 +0FE0 +0820 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8415 +ENCODING 33813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0100 +FFFF +0810 +0660 +03C0 +1E78 +F00F +1FF8 +1008 +1FF8 +3008 +6038 +ENDCHAR +STARTCHAR U+8418 +ENCODING 33816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0108 +7FFC +0280 +0440 +0FF0 +300E +DFF4 +0100 +0920 +1118 +2508 +0200 +ENDCHAR +STARTCHAR U+8419 +ENCODING 33817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +1020 +1020 +FDFE +1122 +3020 +3820 +5470 +5450 +90D1 +1193 +130E +ENDCHAR +STARTCHAR U+841B +ENCODING 33819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0FF8 +0808 +0FF8 +0808 +0FF8 +0808 +0FF8 +0410 +3FFE +0410 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+841C +ENCODING 33820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1020 +1024 +7C3E +5420 +5424 +55FE +5504 +5504 +5D04 +1104 +11FC +1104 +ENDCHAR +STARTCHAR U+841D +ENCODING 33821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0448 +3FFC +2448 +2448 +3FF8 +0200 +07F8 +1808 +6410 +0260 +0180 +0600 +7800 +ENDCHAR +STARTCHAR U+8420 +ENCODING 33824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1E78 +1248 +1A68 +1658 +1248 +1A68 +1658 +1248 +2288 +4718 +0000 +ENDCHAR +STARTCHAR U+8422 +ENCODING 33826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1100 +09F8 +4A08 +27C8 +2048 +0BC8 +1270 +1204 +2204 +21FC +0000 +ENDCHAR +STARTCHAR U+8423 +ENCODING 33827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0080 +7FFF +4001 +0FF8 +0080 +0880 +08F8 +0C80 +1280 +21FF +0000 +0000 +ENDCHAR +STARTCHAR U+8424 +ENCODING 33828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0448 +7FFC +0440 +0440 +7FFE +4102 +8114 +1FF8 +1110 +1110 +1FF0 +0100 +0110 +3FF8 +0008 +ENDCHAR +STARTCHAR U+8425 +ENCODING 33829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0448 +7FFC +0440 +7FFE +4002 +8FE4 +0820 +0820 +0FE0 +0000 +1FF0 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+8426 +ENCODING 33830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +4000 +7FFE +4202 +8424 +1FC0 +0100 +0220 +1FF0 +0920 +0918 +3108 +0300 +ENDCHAR +STARTCHAR U+8427 +ENCODING 33831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +FFFE +0920 +3FF8 +0108 +FFFE +0108 +3FF8 +0100 +2108 +2548 +2528 +2528 +2928 +4108 +0108 +ENDCHAR +STARTCHAR U+8428 +ENCODING 33832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +7C20 +45FC +4888 +5050 +49FE +4500 +4500 +6500 +5900 +4100 +4200 +4400 +ENDCHAR +STARTCHAR U+8429 +ENCODING 33833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0620 +3824 +08A4 +7EA8 +1CB0 +1B20 +2A50 +4850 +0888 +0904 +0000 +ENDCHAR +STARTCHAR U+842A +ENCODING 33834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0648 +3828 +0828 +7E88 +1C48 +1A4C +2A38 +48C8 +0808 +0808 +0000 +ENDCHAR +STARTCHAR U+842B +ENCODING 33835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +1FFC +0080 +7FFF +0888 +1084 +7FFF +1004 +1FFC +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+842C +ENCODING 33836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0920 +0FE0 +0920 +0FE0 +0100 +3FF8 +2148 +21E8 +2E28 +2018 +0000 +ENDCHAR +STARTCHAR U+842D +ENCODING 33837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +1FFC +0080 +3FFE +2082 +3FFE +0080 +7FFF +4091 +4FF9 +400A +0000 +0000 +ENDCHAR +STARTCHAR U+842F +ENCODING 33839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0400 +0FF0 +1820 +7040 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +0810 +700E +ENDCHAR +STARTCHAR U+8430 +ENCODING 33840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +3FFE +0080 +1FFC +1494 +12A4 +1FFC +0490 +0888 +7087 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8431 +ENCODING 33841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +3FFC +2008 +7FF8 +0FE0 +0820 +0FE0 +0820 +0FE0 +0000 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8432 +ENCODING 33842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +3FFC +0888 +37F6 +0080 +7FFF +0400 +0BF8 +10A0 +6040 +00A0 +3F1F +0000 +0000 +ENDCHAR +STARTCHAR U+8433 +ENCODING 33843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +7FFF +0080 +3FFE +2222 +2142 +27F2 +2082 +2FFA +2082 +2084 +0000 +0000 +ENDCHAR +STARTCHAR U+8434 +ENCODING 33844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +3F82 +2082 +3F92 +2092 +3F92 +2092 +3F92 +1102 +208A +4044 +0000 +0000 +ENDCHAR +STARTCHAR U+8435 +ENCODING 33845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0820 +09E0 +0920 +3FF8 +2008 +27C8 +2448 +27C8 +2448 +2018 +0000 +ENDCHAR +STARTCHAR U+8436 +ENCODING 33846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0490 +3FFE +0080 +3FFE +0080 +7FFF +0808 +1FFC +280A +4FF9 +0808 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+8437 +ENCODING 33847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +2482 +1512 +3F92 +2092 +3F92 +2092 +3F92 +2082 +208A +4184 +0000 +0000 +ENDCHAR +STARTCHAR U+8438 +ENCODING 33848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0500 +1970 +1110 +1D70 +1110 +1D70 +1290 +0440 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+8439 +ENCODING 33849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +FFFF +0000 +3FFC +2004 +3FFC +2000 +2FFC +6924 +4FFC +C924 +092C +ENDCHAR +STARTCHAR U+843A +ENCODING 33850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +7FFF +5FFD +7FFF +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+843B +ENCODING 33851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0080 +3FFE +0808 +7FFF +0000 +1FFC +1004 +1FFC +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+843C +ENCODING 33852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1EF0 +1290 +1EF0 +0000 +1FF0 +0000 +7FFC +0400 +07F0 +0810 +00E0 +0000 +ENDCHAR +STARTCHAR U+843D +ENCODING 33853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +04C0 +10F0 +0990 +4A60 +2060 +2590 +0FFC +1110 +1110 +21F0 +2110 +0000 +ENDCHAR +STARTCHAR U+843F +ENCODING 33855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +7FFF +0210 +2000 +1802 +0BFC +4020 +37FF +1020 +03FE +1202 +6202 +23FE +2202 +0000 +0000 +ENDCHAR +STARTCHAR U+8440 +ENCODING 33856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7FFF +0408 +1000 +1001 +7EFE +1010 +11FF +1410 +18FE +7082 +1082 +10FE +3082 +0000 +0000 +ENDCHAR +STARTCHAR U+8442 +ENCODING 33858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1000 +1020 +3E20 +44FE +3E22 +2A22 +3E42 +1484 +1518 +2401 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8443 +ENCODING 33859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0040 +7C40 +44FF +4520 +7C20 +443E +4420 +443E +7C20 +4420 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+8444 +ENCODING 33860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0040 +3F40 +217F +2150 +3F90 +211F +2110 +3F1F +2110 +2110 +4310 +0000 +0000 +ENDCHAR +STARTCHAR U+8445 +ENCODING 33861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +107C +1044 +3844 +6C7C +C644 +0044 +107C +1044 +3844 +6C44 +C6FF +ENDCHAR +STARTCHAR U+8446 +ENCODING 33862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +09F0 +0910 +11F0 +1040 +37FC +50E0 +1150 +164C +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+8447 +ENCODING 33863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +3FF8 +0230 +7FFE +0284 +0C88 +7880 +0100 +FFFF +0520 +1918 +F10F +ENDCHAR +STARTCHAR U+8448 +ENCODING 33864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0200 +0418 +1FEE +7000 +1FF8 +1008 +1FF8 +0100 +FFFF +0520 +1918 +F10F +ENDCHAR +STARTCHAR U+8449 +ENCODING 33865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0920 +7FFC +0920 +09E0 +0FF0 +0100 +3FF8 +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+844A +ENCODING 33866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0100 +06E0 +1818 +EFF7 +0000 +1FF8 +1008 +1FF8 +0410 +FFFF +0410 +0810 +ENDCHAR +STARTCHAR U+844B +ENCODING 33867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0040 +3E40 +227F +2281 +3E7D +2245 +2245 +3E7D +2245 +2201 +4606 +0000 +0000 +ENDCHAR +STARTCHAR U+844C +ENCODING 33868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0220 +1FFC +0140 +0080 +0770 +2222 +7F7F +1414 +0808 +7777 +0000 +0000 +ENDCHAR +STARTCHAR U+844D +ENCODING 33869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +7FFE +0000 +1FF8 +1008 +1FF8 +0000 +3FFC +2104 +3FFC +2104 +3FFC +ENDCHAR +STARTCHAR U+844E +ENCODING 33870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +04C0 +13F0 +1090 +2FFC +4890 +13F0 +3080 +57F8 +1080 +1FFC +1080 +1080 +0000 +ENDCHAR +STARTCHAR U+844F +ENCODING 33871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +6020 +33FE +1022 +C7FF +6022 +23FE +0820 +1BFE +3020 +67FF +C020 +ENDCHAR +STARTCHAR U+8450 +ENCODING 33872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +03E0 +0410 +0808 +17F4 +6113 +0210 +0420 +1FFC +1224 +1224 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8451 +ENCODING 33873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0808 +7F08 +08FE +0808 +7F48 +0028 +0828 +7F08 +0808 +0F08 +7828 +2010 +ENDCHAR +STARTCHAR U+8452 +ENCODING 33874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +1420 +3000 +64FE +2C10 +1810 +3210 +FE10 +1210 +5410 +5210 +D1FF +9000 +ENDCHAR +STARTCHAR U+8454 +ENCODING 33876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +047C +0804 +11FF +3080 +51FE +1010 +13FF +1028 +1044 +1383 +0000 +0000 +ENDCHAR +STARTCHAR U+8456 +ENCODING 33878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0100 +7FFE +4442 +4442 +0C7C +7800 +0100 +FFFF +0240 +0660 +1C38 +F00F +ENDCHAR +STARTCHAR U+8457 +ENCODING 33879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +7FFC +0920 +0108 +1FF0 +0120 +7FFC +0100 +07F0 +1C10 +67F0 +0410 +07F0 +0410 +0000 +ENDCHAR +STARTCHAR U+8458 +ENCODING 33880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0888 +1110 +FFFF +2220 +1110 +0888 +3FFC +2104 +3FFC +2104 +2104 +3FFC +ENDCHAR +STARTCHAR U+8459 +ENCODING 33881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0804 +08FE +7E84 +0884 +18FC +1C84 +2A84 +28FC +4884 +8884 +08FC +0884 +ENDCHAR +STARTCHAR U+845A +ENCODING 33882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +0820 +3FF8 +0820 +0FE0 +0820 +0FE0 +0824 +FFFE +1280 +1440 +1010 +1FF8 +0000 +ENDCHAR +STARTCHAR U+845B +ENCODING 33883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0820 +0FE0 +0820 +0FE0 +07F8 +18C8 +6F08 +0848 +07C8 +0070 +0000 +ENDCHAR +STARTCHAR U+845C +ENCODING 33884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +0808 +7EFC +0848 +3E48 +0848 +7EA8 +0910 +0104 +FFFE +0280 +0440 +1830 +600C +ENDCHAR +STARTCHAR U+845D +ENCODING 33885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +7FC8 +1248 +249F +4909 +2489 +1249 +7FC9 +0411 +0421 +7FC6 +0000 +0000 +ENDCHAR +STARTCHAR U+845E +ENCODING 33886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +7DFF +0444 +7C7C +4044 +7C7C +4444 +05FF +0404 +2804 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+845F +ENCODING 33887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1FFC +3004 +5FFC +1004 +1FFC +0000 +1FFC +0080 +1FFC +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8460 +ENCODING 33888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +09FC +0804 +1BFE +1004 +31FC +6000 +A7FF +2401 +25FD +2098 +2070 +239F +ENDCHAR +STARTCHAR U+8461 +ENCODING 33889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +1440 +1FF8 +1248 +3FE8 +2228 +5FC8 +1248 +1FC8 +1248 +1FC8 +1248 +12F0 +0000 +ENDCHAR +STARTCHAR U+8462 +ENCODING 33890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +3FF8 +0440 +1930 +608C +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8463 +ENCODING 33891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0F80 +7FFC +0FE0 +0920 +0FE0 +0920 +0FE0 +3FF8 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8464 +ENCODING 33892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +1004 +3004 +6404 +2CFF +1804 +3244 +FE64 +1224 +5404 +5604 +D204 +901C +ENDCHAR +STARTCHAR U+8465 +ENCODING 33893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0810 +0420 +FFFF +0000 +3E04 +2244 +3E44 +2244 +3E44 +2204 +2204 +261C +ENDCHAR +STARTCHAR U+8466 +ENCODING 33894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0FE0 +0220 +7FFC +0FE0 +0820 +0FE0 +0FF0 +0840 +7FFC +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+8467 +ENCODING 33895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0810 +FF90 +087E +FF92 +8092 +3E12 +0432 +0FA2 +F822 +0866 +08C4 +399C +ENDCHAR +STARTCHAR U+8468 +ENCODING 33896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1FFC +1084 +1FFC +1084 +1FFC +0000 +7FFF +1028 +1210 +1428 +3807 +0000 +0000 +ENDCHAR +STARTCHAR U+8469 +ENCODING 33897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +11F8 +3D48 +2548 +25F8 +3D08 +2500 +2504 +3D04 +20FC +0000 +ENDCHAR +STARTCHAR U+846A +ENCODING 33898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +2002 +3E22 +4422 +FF22 +4922 +7F22 +4922 +7F22 +4102 +4102 +C102 +870E +ENDCHAR +STARTCHAR U+846B +ENCODING 33899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0800 +0878 +7F48 +0848 +0878 +3E48 +2278 +2288 +3E88 +2318 +0000 +ENDCHAR +STARTCHAR U+846C +ENCODING 33900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +7FFC +0880 +1F98 +72E0 +0C84 +747C +0440 +7FFC +0440 +0840 +3040 +0000 +ENDCHAR +STARTCHAR U+846D +ENCODING 33901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3EF8 +2208 +3EF8 +2000 +3EF8 +2088 +3E50 +2020 +20D0 +230C +0000 +ENDCHAR +STARTCHAR U+846E +ENCODING 33902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0640 +1CF0 +1094 +1E94 +110C +1FF8 +1088 +1E50 +7020 +10D0 +130C +0000 +ENDCHAR +STARTCHAR U+846F +ENCODING 33903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +1080 +1480 +64F8 +1908 +1688 +7E48 +2C48 +2A08 +4808 +0830 +0000 +ENDCHAR +STARTCHAR U+8470 +ENCODING 33904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0880 +0904 +1BFA +1090 +311F +6680 +A1FC +230C +2698 +2070 +21D8 +270F +ENDCHAR +STARTCHAR U+8471 +ENCODING 33905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0C40 +0FF8 +1248 +2FC8 +44E8 +0908 +1330 +0080 +2488 +2424 +4424 +03E0 +0000 +ENDCHAR +STARTCHAR U+8473 +ENCODING 33907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0450 +0048 +3FFC +2040 +3FC8 +2448 +3FD0 +2520 +2920 +2A60 +44A2 +5B12 +800E +ENDCHAR +STARTCHAR U+8474 +ENCODING 33908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +FFFF +0410 +0414 +0022 +3FFF +2020 +2FA0 +2032 +2F96 +289C +2888 +6F9D +4077 +C1C2 +ENDCHAR +STARTCHAR U+8475 +ENCODING 33909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0720 +1128 +0AC8 +0450 +1FF0 +610C +1FF0 +0100 +0280 +0C60 +3018 +0000 +ENDCHAR +STARTCHAR U+8476 +ENCODING 33910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0540 +7FFC +0000 +1FF0 +1010 +1FF0 +4000 +7FFE +4002 +9FF4 +0100 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U+8477 +ENCODING 33911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FFC +2108 +7FF8 +0FE0 +0920 +0FE0 +0920 +0FE0 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8478 +ENCODING 33912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +0200 +2908 +2924 +4824 +07E0 +ENDCHAR +STARTCHAR U+8479 +ENCODING 33913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0880 +08FC +7F20 +08B8 +0EE8 +13A8 +12B8 +22A4 +4284 +0C7C +0000 +ENDCHAR +STARTCHAR U+847A +ENCODING 33914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0FE0 +0820 +0FE0 +7FFC +0820 +0FE0 +0820 +0FE0 +083C +7FE0 +0020 +0000 +ENDCHAR +STARTCHAR U+847C +ENCODING 33916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +2664 +2184 +2664 +2004 +3FFC +0240 +0C7F +F400 +0FF8 +F460 +03C0 +FC3F +ENDCHAR +STARTCHAR U+847D +ENCODING 33917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +FFFF +0440 +3FFC +2444 +2444 +3FFC +0400 +FFFF +0810 +1E30 +03E0 +7E3E +ENDCHAR +STARTCHAR U+847E +ENCODING 33918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1000 +3F7E +4222 +142E +0821 +703F +0102 +2881 +2845 +4804 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+8481 +ENCODING 33921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +6088 +37FF +1088 +0088 +0024 +0022 +F7FF +10A8 +10A8 +11AC +1326 +1623 +3020 +6800 +C7FF +ENDCHAR +STARTCHAR U+8482 +ENCODING 33922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +3FF8 +0440 +3FFC +2108 +4FE0 +0920 +0920 +09C0 +0100 +0000 +ENDCHAR +STARTCHAR U+8484 +ENCODING 33924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3FFC +2018 +5E10 +01FC +7E90 +1450 +1450 +1414 +2434 +43FC +0000 +ENDCHAR +STARTCHAR U+8485 +ENCODING 33925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +3080 +1BF8 +C088 +6088 +1988 +7309 +C607 +0100 +FFFF +0540 +0D60 +3938 +E10F +ENDCHAR +STARTCHAR U+8486 +ENCODING 33926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +00FC +7F24 +0874 +7F47 +0000 +0410 +7FFF +0220 +0140 +0080 +3F7E +0000 +0000 +ENDCHAR +STARTCHAR U+8487 +ENCODING 33927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0450 +0028 +3FFC +2020 +2FA0 +28A4 +2AA4 +2AA8 +2AA8 +2A90 +4532 +44CA +9886 +ENDCHAR +STARTCHAR U+8488 +ENCODING 33928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +2080 +3E98 +20E0 +2E84 +727C +0410 +1FF8 +1010 +1FF0 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+8489 +ENCODING 33929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0540 +1FF0 +1110 +1FF0 +0104 +FFFE +0010 +1FF8 +1010 +1110 +1110 +1290 +0C60 +301C +ENDCHAR +STARTCHAR U+848B +ENCODING 33931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +083C +0FC8 +4A48 +2930 +2810 +0BFC +1910 +6890 +0890 +0810 +0830 +0000 +ENDCHAR +STARTCHAR U+848C +ENCODING 33932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1110 +0920 +7FFC +0540 +3938 +0200 +FFFE +0440 +0C40 +0380 +0660 +3818 +ENDCHAR +STARTCHAR U+848D +ENCODING 33933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0420 +0240 +0FF8 +0108 +07FC +0804 +1FFF +7249 +1249 +2249 +000E +0000 +0000 +ENDCHAR +STARTCHAR U+848E +ENCODING 33934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +201C +1BE0 +4A0C +22F0 +0AA4 +12A8 +2290 +6490 +2490 +24A8 +28CE +3084 +ENDCHAR +STARTCHAR U+848F +ENCODING 33935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +7FFF +4001 +5FFD +0140 +1FFC +1144 +1244 +143C +13E4 +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8490 +ENCODING 33936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0200 +1FF0 +1110 +1FF0 +1110 +1FF0 +0520 +0550 +09FC +1104 +60FC +0000 +ENDCHAR +STARTCHAR U+8491 +ENCODING 33937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0510 +7E3C +3F25 +2125 +3F47 +2100 +3F3F +2021 +3F12 +210C +2112 +4661 +0000 +0000 +ENDCHAR +STARTCHAR U+8492 +ENCODING 33938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0800 +11FF +7C10 +4410 +44FE +7C92 +4092 +7C92 +4492 +4492 +4496 +7C10 +ENDCHAR +STARTCHAR U+8493 +ENCODING 33939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +1013 +301E +65F0 +2C10 +1892 +3492 +FA92 +10FE +5410 +5611 +D213 +900E +ENDCHAR +STARTCHAR U+8494 +ENCODING 33940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0040 +3DF8 +2440 +27FC +3C10 +27FC +2510 +3C90 +2090 +0030 +0000 +ENDCHAR +STARTCHAR U+8495 +ENCODING 33941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +1FF8 +1088 +1108 +1288 +1468 +1FF8 +0000 +3FFC +2244 +2244 +FFFF +ENDCHAR +STARTCHAR U+8497 +ENCODING 33943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0480 +2048 +1BFC +0A08 +43F8 +2608 +0BF8 +1288 +7250 +1220 +1290 +130E +1204 +ENDCHAR +STARTCHAR U+8498 +ENCODING 33944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +223E +7F22 +1422 +083E +3608 +0FF0 +1FFC +0080 +3FFE +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+8499 +ENCODING 33945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FFC +2FE8 +4000 +7FFC +0348 +3DD0 +06A0 +3990 +0688 +7884 +0300 +0000 +ENDCHAR +STARTCHAR U+849A +ENCODING 33946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +7FFF +0000 +0FF8 +0808 +0FF8 +0000 +3FFE +2412 +2FFA +2082 +209E +0000 +0000 +ENDCHAR +STARTCHAR U+849B +ENCODING 33947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0000 +2008 +3F3E +240A +240A +5F0A +047F +1508 +1514 +1522 +1F41 +0000 +0000 +ENDCHAR +STARTCHAR U+849C +ENCODING 33948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3EF8 +0000 +7FFC +0820 +2CB0 +2AA8 +2AA4 +4924 +0820 +1860 +0000 +ENDCHAR +STARTCHAR U+849D +ENCODING 33949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +3FFF +2100 +23FE +2602 +23FE +2202 +23FE +20A8 +2124 +4622 +0060 +0000 +0000 +ENDCHAR +STARTCHAR U+849E +ENCODING 33950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +6210 +3210 +16FE +C400 +6482 +2CC6 +1444 +344C +2408 +65FF +C400 +ENDCHAR +STARTCHAR U+849F +ENCODING 33951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +04C0 +0880 +08F8 +7F08 +06E8 +24A8 +14A8 +18E8 +1E88 +7008 +0030 +0000 +ENDCHAR +STARTCHAR U+84A0 +ENCODING 33952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0400 +0FF8 +1808 +2FF8 +0808 +0FF8 +0808 +0FF8 +2884 +284A +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+84A1 +ENCODING 33953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0100 +3FF8 +0440 +3FFC +2108 +7FF8 +0100 +01F0 +0210 +0C10 +3060 +0000 +ENDCHAR +STARTCHAR U+84A2 +ENCODING 33954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0430 +7850 +5088 +6104 +52FA +4C21 +6BFE +5070 +40A8 +4124 +4623 +4060 +0000 +0000 +ENDCHAR +STARTCHAR U+84A4 +ENCODING 33956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0430 +3050 +1088 +4104 +32FA +1421 +03FE +1020 +60A8 +2727 +2020 +2060 +0000 +0000 +ENDCHAR +STARTCHAR U+84A6 +ENCODING 33958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1040 +3FFE +6080 +BFFC +2080 +3FFC +2080 +3FFF +0000 +7FFC +0808 +07F0 +FC1F +ENDCHAR +STARTCHAR U+84A7 +ENCODING 33959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0012 +3FFF +2210 +2390 +2210 +2F92 +2894 +2888 +2F95 +4023 +0000 +0000 +ENDCHAR +STARTCHAR U+84A8 +ENCODING 33960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0820 +0BFE +1820 +11FC +3020 +27FF +6104 +A1FC +2104 +21FC +2104 +211C +ENDCHAR +STARTCHAR U+84A9 +ENCODING 33961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +0C00 +78FC +1084 +FC84 +10FC +3884 +3484 +50FC +9084 +1084 +13FF +ENDCHAR +STARTCHAR U+84AA +ENCODING 33962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0428 +0104 +FFFF +0100 +3FFC +2104 +3FFC +2104 +3FFC +0010 +FFFF +0810 +0410 +0070 +ENDCHAR +STARTCHAR U+84AB +ENCODING 33963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +0410 +3FFE +0080 +3FFE +0080 +7FFF +0400 +0BFE +1020 +2020 +4FFF +0000 +0000 +ENDCHAR +STARTCHAR U+84AC +ENCODING 33964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F7E +0410 +7FFF +4101 +43E1 +0440 +1FFC +1084 +1FFC +0140 +0252 +044A +387E +0000 +0000 +ENDCHAR +STARTCHAR U+84AD +ENCODING 33965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0640 +1FF8 +7248 +1FC8 +0C48 +3430 +0FF8 +1248 +7248 +1FC8 +0C48 +7038 +0000 +ENDCHAR +STARTCHAR U+84AE +ENCODING 33966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0080 +7FFF +4201 +4421 +0FFC +1420 +07FC +0420 +07FC +0420 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+84AF +ENCODING 33967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1144 +FFE4 +1114 +7BD4 +4A54 +4A54 +7BD4 +4A54 +4A54 +7BD4 +4A44 +4A44 +4A44 +9CD4 +0848 +ENDCHAR +STARTCHAR U+84B0 +ENCODING 33968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +083C +1024 +3F25 +3147 +2900 +253E +7FA2 +3114 +2908 +2514 +4323 +0000 +0000 +ENDCHAR +STARTCHAR U+84B1 +ENCODING 33969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +2024 +2022 +27FF +F820 +23FE +2222 +3BFE +E222 +23FE +2222 +2222 +6226 +ENDCHAR +STARTCHAR U+84B2 +ENCODING 33970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0450 +1048 +0FFC +4840 +23F8 +2A48 +0BF8 +1248 +13F8 +2248 +2258 +0000 +ENDCHAR +STARTCHAR U+84B4 +ENCODING 33972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +227C +1444 +FFC4 +087C +4944 +4944 +7F7C +0944 +0844 +0884 +1094 +2108 +ENDCHAR +STARTCHAR U+84B6 +ENCODING 33974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0000 +0808 +1224 +2442 +7881 +107E +2222 +7E22 +0022 +5442 +548C +0000 +0000 +ENDCHAR +STARTCHAR U+84B8 +ENCODING 33976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FE0 +0048 +3D88 +0550 +1930 +630C +0FE0 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+84B9 +ENCODING 33977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0660 +0CC0 +7FFC +1FF0 +0290 +7FFC +0290 +1FF0 +06C0 +1AB0 +628C +0280 +0000 +ENDCHAR +STARTCHAR U+84BA +ENCODING 33978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +7FFE +0540 +1FFC +9200 +5210 +13F8 +3440 +5044 +9FFE +10A0 +20A0 +2110 +420E +0C04 +ENDCHAR +STARTCHAR U+84BB +ENCODING 33979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3EF8 +0208 +3EF8 +2080 +3EF8 +0A28 +36D8 +0A28 +32C8 +0618 +0000 +ENDCHAR +STARTCHAR U+84BC +ENCODING 33980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +7FFC +0920 +0280 +0FE0 +7FFC +0820 +0FE0 +0820 +0FE0 +17F0 +1410 +27F0 +4410 +0000 +ENDCHAR +STARTCHAR U+84BD +ENCODING 33981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +1FF0 +1110 +1110 +1FF0 +1110 +1290 +1450 +1FF0 +2908 +2884 +4824 +07E0 +ENDCHAR +STARTCHAR U+84BE +ENCODING 33982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0020 +6222 +3326 +1124 +0020 +07FF +F0A8 +11AC +1326 +1623 +3020 +6800 +C7FF +ENDCHAR +STARTCHAR U+84BF +ENCODING 33983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0100 +7FFC +0FE0 +0820 +0FE0 +3FF8 +2008 +27C8 +2448 +27C8 +2018 +0000 +ENDCHAR +STARTCHAR U+84C0 +ENCODING 33984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0006 +3E78 +0410 +08A4 +0848 +0B32 +1C3F +6BE1 +0820 +08A4 +0922 +0A21 +1820 +ENDCHAR +STARTCHAR U+84C1 +ENCODING 33985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +3FF8 +0100 +1FF0 +7FFC +04C0 +1F30 +6FEC +03C0 +0D30 +3108 +0100 +0000 +ENDCHAR +STARTCHAR U+84C2 +ENCODING 33986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +7FFF +4001 +0FF8 +0808 +0FF8 +0808 +0FF8 +0080 +7FFF +0000 +0808 +1004 +2002 +ENDCHAR +STARTCHAR U+84C4 +ENCODING 33988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +7FF8 +0240 +0CC0 +0330 +7FC8 +0FE0 +0920 +0FE0 +0920 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+84C5 +ENCODING 33989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +4040 +3020 +17FF +4080 +3104 +13FE +0124 +1124 +6124 +2224 +2407 +0000 +0000 +ENDCHAR +STARTCHAR U+84C6 +ENCODING 33990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +04C0 +3FFC +2220 +3FFC +2220 +23E0 +2080 +2FF8 +2888 +2888 +48B0 +0080 +0000 +ENDCHAR +STARTCHAR U+84C7 +ENCODING 33991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1FF8 +1008 +11F8 +1108 +FFFF +8001 +9FF9 +1008 +1FF8 +1008 +1FF8 +1008 +1038 +ENDCHAR +STARTCHAR U+84C8 +ENCODING 33992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +1000 +7E7E +4242 +7E42 +427E +7E42 +4042 +447E +4442 +5EC2 +7282 +C18E +ENDCHAR +STARTCHAR U+84C9 +ENCODING 33993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0100 +3FFC +2448 +4920 +1290 +0440 +1FF0 +682C +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+84CA +ENCODING 33994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +05C0 +1930 +624C +1FE0 +0000 +3EF8 +0A28 +36D8 +0A28 +32C8 +0618 +0000 +ENDCHAR +STARTCHAR U+84CB +ENCODING 33995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +1FF0 +0100 +7FFC +0240 +3FF0 +0008 +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+84CC +ENCODING 33996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0100 +1110 +392C +C547 +1FF8 +0100 +FFFF +0400 +1FF8 +F460 +03C0 +FC3F +ENDCHAR +STARTCHAR U+84CD +ENCODING 33997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0550 +1FE0 +0140 +7FFC +07E0 +1E08 +63F8 +0FE0 +0820 +0FE0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+84CE +ENCODING 33998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0450 +3FFF +2040 +3FFC +2044 +3FFF +2044 +3FFC +2040 +2FFE +4802 +0FFE +0000 +0000 +ENDCHAR +STARTCHAR U+84CF +ENCODING 33999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +FFFF +0410 +0306 +0E1C +3A74 +2A54 +2A54 +2A54 +2B54 +29D4 +2A54 +6EDD +5AB7 +C182 +ENDCHAR +STARTCHAR U+84D0 +ENCODING 34000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FFC +17F0 +1000 +1FFC +1248 +13B0 +1E2C +3FFC +2220 +4120 +0060 +0000 +ENDCHAR +STARTCHAR U+84D1 +ENCODING 34001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0100 +7FFC +0FE0 +0820 +7FFC +0820 +0FE0 +0C88 +7450 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+84D2 +ENCODING 34002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0800 +7F02 +083C +7F08 +4908 +7F7F +4908 +7F08 +0808 +7F08 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+84D3 +ENCODING 34003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0480 +0848 +0FFC +1000 +1110 +30A4 +5FFE +9000 +13F8 +1208 +1208 +13F8 +1208 +ENDCHAR +STARTCHAR U+84D4 +ENCODING 34004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0808 +0410 +3FFE +0080 +3FFE +0080 +7FFF +0000 +2222 +4221 +4221 +0000 +0000 +ENDCHAR +STARTCHAR U+84D6 +ENCODING 34006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0100 +1FF0 +1250 +1190 +1650 +1FF0 +1098 +1EE0 +1080 +1E84 +707C +0000 +ENDCHAR +STARTCHAR U+84D7 +ENCODING 34007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +1020 +2020 +4BFE +1020 +37FF +5120 +113E +11A0 +1260 +143F +0000 +0000 +ENDCHAR +STARTCHAR U+84D9 +ENCODING 34009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0540 +0100 +3FF8 +2520 +2520 +2B50 +3188 +2FF0 +2100 +5FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+84DA +ENCODING 34010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0CC0 +08FC +1590 +1660 +34D0 +572C +14C0 +1430 +14C8 +1430 +11C0 +0000 +ENDCHAR +STARTCHAR U+84DB +ENCODING 34011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0820 +7F20 +083F +7F42 +4912 +4912 +1C12 +2A0C +490C +0812 +1021 +0000 +0000 +ENDCHAR +STARTCHAR U+84DC +ENCODING 34012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +FFBE +1402 +7F02 +5502 +553E +5520 +6720 +4121 +7F21 +4133 +7F1E +ENDCHAR +STARTCHAR U+84DD +ENCODING 34013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0824 +FFFE +0820 +0490 +24F8 +2500 +2640 +2420 +0408 +3FFC +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+84DF +ENCODING 34015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0804 +1F24 +2224 +7FA4 +24A4 +3FA4 +24A4 +3FA4 +2004 +0384 +7C14 +0008 +ENDCHAR +STARTCHAR U+84E0 +ENCODING 34016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +0104 +FFFE +1450 +1390 +1450 +1FF0 +0104 +7FFE +4204 +4424 +4FF4 +4014 +4008 +ENDCHAR +STARTCHAR U+84E3 +ENCODING 34019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +7DFE +0420 +2844 +11FE +FD04 +1524 +1124 +1124 +1144 +1058 +5084 +2302 +ENDCHAR +STARTCHAR U+84E5 +ENCODING 34021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +7FFE +4102 +8284 +0C60 +37DE +C104 +1FF0 +0100 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+84E6 +ENCODING 34022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +1FF0 +1010 +1FF0 +1014 +FFFE +0820 +3FF8 +C026 +0820 +0FF8 +0008 +3FC8 +0030 +ENDCHAR +STARTCHAR U+84E7 +ENCODING 34023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +1080 +11FF +2B04 +2888 +6870 +AB8F +2820 +2BFF +28A8 +29AC +2327 +2020 +ENDCHAR +STARTCHAR U+84E8 +ENCODING 34024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0840 +107E +34A4 +5418 +1424 +14FE +1444 +147C +1444 +107C +108C +0000 +0000 +ENDCHAR +STARTCHAR U+84E9 +ENCODING 34025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +3E40 +047E +18A4 +3E18 +0AE7 +1810 +287E +4812 +0822 +1846 +0000 +0000 +ENDCHAR +STARTCHAR U+84EA +ENCODING 34026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0000 +67FE +308C +1050 +03FE +0222 +F3FE +1222 +13FE +1222 +3226 +6800 +C7FF +ENDCHAR +STARTCHAR U+84EB +ENCODING 34027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +27FC +10C0 +7B64 +10B8 +2120 +4660 +20B0 +172E +10C0 +6FFF +0000 +0000 +ENDCHAR +STARTCHAR U+84EC +ENCODING 34028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +04C0 +21F0 +1F20 +10E0 +035C +7FF8 +1040 +13F8 +1040 +17FC +2C40 +43FC +0000 +ENDCHAR +STARTCHAR U+84EE +ENCODING 34030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +2040 +17FC +13F8 +0248 +73F8 +1248 +13F8 +17FC +1840 +2640 +41FC +0000 +ENDCHAR +STARTCHAR U+84EF +ENCODING 34031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +1104 +3104 +628A +C6DB +1000 +3020 +6020 +E13E +2320 +26A0 +2C7F +ENDCHAR +STARTCHAR U+84F0 +ENCODING 34032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0848 +117C +2540 +4944 +17FE +3040 +5248 +927C +1340 +12C0 +143E +1808 +ENDCHAR +STARTCHAR U+84F1 +ENCODING 34033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +6102 +3084 +17FF +C084 +6084 +2084 +07FF +1084 +3184 +6304 +C604 +ENDCHAR +STARTCHAR U+84F2 +ENCODING 34034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +7FFE +4000 +47F0 +4410 +47F0 +4000 +5F7C +5144 +5F7C +4000 +7FFE +ENDCHAR +STARTCHAR U+84F3 +ENCODING 34035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0A28 +7FFF +0220 +03E0 +3FFE +2082 +3FFE +0080 +1FFC +0080 +3FFE +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+84F4 +ENCODING 34036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +7FFC +1FF0 +1110 +1FF0 +1FF0 +0110 +3FF8 +0020 +7FFC +0420 +0260 +0000 +ENDCHAR +STARTCHAR U+84F6 +ENCODING 34038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0048 +0088 +3DFF +2488 +24FF +2488 +24FF +3C88 +24FF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+84F7 +ENCODING 34039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +2044 +2088 +21FF +FB10 +2510 +21FE +3910 +E110 +21FE +2110 +2110 +61FF +ENDCHAR +STARTCHAR U+84F9 +ENCODING 34041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1200 +220F +47F9 +1089 +37F9 +5089 +14E9 +148E +17F8 +1008 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+84FA +ENCODING 34042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0420 +0810 +0810 +7F10 +087C +FF94 +2214 +4B94 +BE74 +0824 +1F75 +F0D3 +ENDCHAR +STARTCHAR U+84FB +ENCODING 34043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0810 +1020 +1020 +7E20 +10FC +FF24 +2424 +FF24 +10E4 +7E44 +10E5 +11A3 +ENDCHAR +STARTCHAR U+84FC +ENCODING 34044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3EF8 +0A28 +36D8 +0B28 +32C8 +0D60 +765C +01A0 +0E40 +0180 +1E00 +0000 +ENDCHAR +STARTCHAR U+84FD +ENCODING 34045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +3FFC +2104 +3FFC +2104 +3FFC +0910 +FFFF +0910 +7FFE +0100 +3FFC +0100 +ENDCHAR +STARTCHAR U+84FE +ENCODING 34046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0510 +01F8 +0100 +3FFE +2492 +2222 +2142 +2492 +2142 +2222 +2492 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+84FF +ENCODING 34047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0100 +3FFC +2808 +4FF8 +1080 +13F0 +3210 +53F0 +1210 +13F0 +1210 +0000 +ENDCHAR +STARTCHAR U+8500 +ENCODING 34048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0800 +0878 +7F48 +2250 +1450 +7F48 +0044 +3E44 +2244 +3E58 +2240 +0000 +ENDCHAR +STARTCHAR U+8502 +ENCODING 34050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +3FFC +2104 +3FFC +2104 +3FFC +0100 +0A20 +0442 +FFFF +0101 +1918 +710E +ENDCHAR +STARTCHAR U+8503 +ENCODING 34051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0080 +F984 +093E +0BE3 +7820 +43FE +4222 +7A22 +0BFE +0820 +1822 +10FF +7781 +ENDCHAR +STARTCHAR U+8506 +ENCODING 34054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1040 +0BF8 +4840 +27FC +2124 +169C +11F0 +2320 +24C0 +41B0 +4E0C +0000 +ENDCHAR +STARTCHAR U+8507 +ENCODING 34055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0000 +7EFE +4248 +7E48 +4248 +7FFF +4008 +4418 +4438 +7E69 +C2C9 +0187 +ENDCHAR +STARTCHAR U+8508 +ENCODING 34056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +7FFF +0220 +3FFE +2222 +3FFE +0000 +1FFC +0000 +7FFF +0888 +1384 +0000 +0000 +ENDCHAR +STARTCHAR U+8509 +ENCODING 34057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +7FFF +0808 +17F4 +2412 +0410 +07F0 +0C24 +3418 +0488 +1F07 +0000 +0000 +ENDCHAR +STARTCHAR U+850A +ENCODING 34058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +10FE +1082 +58FE +5482 +50FE +1000 +10FE +1010 +29FF +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+850B +ENCODING 34059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +4100 +31DF +1111 +47D1 +3111 +1391 +054A +1104 +610A +2311 +0000 +0000 +ENDCHAR +STARTCHAR U+850C +ENCODING 34060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0920 +FFA4 +087E +7F44 +49A8 +4920 +7F20 +1820 +1C50 +2A48 +C88E +0904 +ENDCHAR +STARTCHAR U+850D +ENCODING 34061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +3FFF +2210 +3FFE +2212 +3FFE +2810 +2F1E +4810 +0810 +0F9F +0000 +0000 +ENDCHAR +STARTCHAR U+850E +ENCODING 34062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +78F8 +0088 +FC88 +0188 +7B0F +0000 +79FC +0084 +7858 +4870 +48DC +7B87 +ENDCHAR +STARTCHAR U+850F +ENCODING 34063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0080 +7FFF +0410 +3FFE +2222 +2422 +381E +23E2 +2222 +23E2 +200E +0000 +0000 +ENDCHAR +STARTCHAR U+8510 +ENCODING 34064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0100 +FFFF +0810 +0420 +7FFE +4102 +5FFA +4102 +47E2 +4422 +47E2 +400E +ENDCHAR +STARTCHAR U+8511 +ENCODING 34065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FF8 +1248 +1FF8 +0090 +1FFC +1048 +1448 +1230 +2234 +20CC +4304 +0000 +ENDCHAR +STARTCHAR U+8512 +ENCODING 34066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1FFC +0084 +7FFF +0104 +1FFC +0800 +17FC +2404 +07FC +2222 +2222 +0000 +0000 +ENDCHAR +STARTCHAR U+8513 +ENCODING 34067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0FE0 +0820 +0FE0 +0FE0 +1FF0 +1290 +1FF0 +3FE0 +0440 +0280 +0780 +7878 +0000 +ENDCHAR +STARTCHAR U+8514 +ENCODING 34068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +1440 +1FF8 +1008 +3FE8 +4F88 +0888 +0F88 +1FC8 +1FC8 +1248 +1FC8 +1030 +0000 +ENDCHAR +STARTCHAR U+8515 +ENCODING 34069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0AA0 +7FFC +0AA4 +339C +3FFC +2108 +5FF0 +1110 +1110 +1160 +0100 +0000 +ENDCHAR +STARTCHAR U+8516 +ENCODING 34070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F7E +0490 +00F8 +1FFE +1102 +17F4 +11E0 +17F8 +1408 +27F8 +4408 +07F8 +1FFE +0000 +0000 +ENDCHAR +STARTCHAR U+8517 +ENCODING 34071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0100 +1FF8 +1240 +1240 +1FF0 +1240 +1240 +1FF8 +2000 +2A48 +5124 +0000 +ENDCHAR +STARTCHAR U+8518 +ENCODING 34072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0280 +17D0 +2928 +7EFC +0440 +19B0 +6E4C +0190 +0E60 +0180 +1E00 +0000 +ENDCHAR +STARTCHAR U+8519 +ENCODING 34073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +2080 +11FF +7C00 +20FE +3C12 +2410 +249C +2490 +4490 +0550 +1A3F +0000 +0000 +ENDCHAR +STARTCHAR U+851A +ENCODING 34074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3F08 +2108 +3FFC +2008 +2E48 +2028 +3F28 +2E08 +2D08 +5508 +0C18 +0000 +ENDCHAR +STARTCHAR U+851C +ENCODING 34076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +0810 +7F10 +083F +FFA2 +0866 +FF94 +101C +1F08 +111C +3136 +E763 +ENDCHAR +STARTCHAR U+851D +ENCODING 34077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +7924 +4924 +48A8 +7BFE +4820 +78A8 +4924 +4A22 +7C21 +4820 +0000 +0000 +ENDCHAR +STARTCHAR U+851E +ENCODING 34078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1FFC +1084 +7FFF +1084 +1FFC +1FFC +1084 +1FFC +0200 +7FFF +0810 +17E0 +7E3F +ENDCHAR +STARTCHAR U+851F +ENCODING 34079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +04C0 +0880 +09FC +7E80 +08F8 +0F20 +13FC +1230 +2250 +4288 +0D04 +0000 +ENDCHAR +STARTCHAR U+8520 +ENCODING 34080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F7E +0410 +0820 +113E +2262 +3C14 +0808 +1114 +2163 +3F08 +0004 +2A10 +2A08 +0000 +0000 +ENDCHAR +STARTCHAR U+8521 +ENCODING 34081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0F78 +1990 +6660 +1430 +1FCC +6000 +1FF0 +0100 +0930 +3108 +0300 +0000 +ENDCHAR +STARTCHAR U+8522 +ENCODING 34082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +3020 +1BFE +C222 +63FC +0684 +6C78 +C3CF +0400 +FFFF +0810 +1F20 +01F8 +7F0E +ENDCHAR +STARTCHAR U+8523 +ENCODING 34083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +2220 +227E +2294 +3F48 +2234 +0264 +0384 +7FFF +1204 +1244 +2224 +2204 +420C +ENDCHAR +STARTCHAR U+8524 +ENCODING 34084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0100 +7FFE +4102 +44A0 +2446 +648B +0FF8 +F800 +0100 +2104 +2104 +2104 +3FFC +ENDCHAR +STARTCHAR U+8525 +ENCODING 34085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0490 +0100 +1FFC +1104 +13E4 +1E44 +1184 +1674 +1FFC +0200 +2900 +2882 +4809 +4FF9 +ENDCHAR +STARTCHAR U+8526 +ENCODING 34086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0FE0 +0820 +0FE0 +0820 +0FE0 +0FFC +0800 +0FFC +2924 +2494 +4018 +0000 +ENDCHAR +STARTCHAR U+8527 +ENCODING 34087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1008 +FE7F +1008 +7C3E +1008 +FE7F +1008 +0000 +3FFC +0004 +FFFF +0004 +3FFC +ENDCHAR +STARTCHAR U+8528 +ENCODING 34088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F7E +0410 +3FFE +22A2 +2FFA +2082 +2FFA +2222 +27D2 +2A4A +2212 +23F2 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+8529 +ENCODING 34089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F7E +0490 +7FFF +4001 +4FF9 +0080 +0FF8 +0888 +0FF8 +0888 +0FF8 +0808 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+852A +ENCODING 34090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0802 +FF8E +0838 +7F20 +493F +7F24 +4924 +7F24 +0824 +FFE4 +0844 +08C4 +ENDCHAR +STARTCHAR U+852B +ENCODING 34091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +FFFE +0820 +3FF8 +0100 +09F0 +0904 +FFFE +1000 +1FF8 +1000 +1FFC +2924 +2494 +4494 +000C +ENDCHAR +STARTCHAR U+852C +ENCODING 34092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0020 +7FFC +0A20 +0C48 +29FC +2E00 +2950 +2950 +2D54 +3A54 +640C +0000 +ENDCHAR +STARTCHAR U+852D +ENCODING 34093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3CA0 +27F0 +2C0C +31F0 +2820 +25F8 +2400 +27FC +38A0 +2130 +23C8 +0000 +ENDCHAR +STARTCHAR U+852E +ENCODING 34094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +7FFF +4025 +5FFD +4021 +4FA5 +48A9 +4FB1 +4051 +5F8B +4007 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+852F +ENCODING 34095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0020 +3C20 +27FE +2820 +29FC +2524 +25FC +2524 +25FC +2470 +38A8 +2124 +2623 +ENDCHAR +STARTCHAR U+8530 +ENCODING 34096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F7E +0430 +1FC0 +1FFC +1004 +1FFC +13F8 +1208 +13F8 +17FC +1444 +27FD +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+8531 +ENCODING 34097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +143C +0824 +3625 +0067 +0900 +7F3E +2A22 +2A14 +4908 +0877 +0000 +0000 +ENDCHAR +STARTCHAR U+8532 +ENCODING 34098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0100 +FFFF +8001 +8021 +7E20 +007F +FF44 +24AC +2418 +2476 +6601 +C3FF +ENDCHAR +STARTCHAR U+8533 +ENCODING 34099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +6020 +33FE +1020 +C1FC +6020 +27FF +0104 +11FC +3104 +21FC +6104 +4104 +C11C +ENDCHAR +STARTCHAR U+8534 +ENCODING 34100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0080 +7FFF +4000 +4208 +5FBF +4208 +471C +4AAA +CA2A +9249 +8208 +0208 +ENDCHAR +STARTCHAR U+8535 +ENCODING 34101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0450 +0048 +1FFC +1040 +1FC8 +1928 +1FA8 +18B0 +1F90 +2934 +2FCC +4884 +0000 +ENDCHAR +STARTCHAR U+8536 +ENCODING 34102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0520 +3FFC +0100 +1FF8 +0100 +FFFF +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +0810 +700E +ENDCHAR +STARTCHAR U+8537 +ENCODING 34103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0828 +7FFC +0920 +0108 +7FFC +0920 +0544 +FFFE +0010 +1FF8 +1010 +17D0 +1450 +17D0 +1010 +1FF0 +ENDCHAR +STARTCHAR U+8538 +ENCODING 34104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0540 +0A08 +37FC +2448 +27C8 +2448 +2FC8 +3038 +0440 +0440 +0842 +3042 +C03E +ENDCHAR +STARTCHAR U+8539 +ENCODING 34105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +0820 +1424 +223E +4144 +BEA4 +0024 +4924 +2928 +2A10 +0728 +7846 +2084 +ENDCHAR +STARTCHAR U+853A +ENCODING 34106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +17FC +4504 +44A4 +4FF4 +5884 +6FE4 +4884 +4FE4 +4884 +4FF4 +4814 +4008 +ENDCHAR +STARTCHAR U+853B +ENCODING 34107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +0100 +7FFE +4042 +8474 +3E40 +00F8 +FF08 +1450 +1420 +1450 +258A +4402 +83FE +ENDCHAR +STARTCHAR U+853C +ENCODING 34108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +FFFE +0820 +43F8 +3208 +13F8 +0208 +F3F8 +1104 +13FE +1444 +1244 +16A4 +1A04 +13D4 +0008 +ENDCHAR +STARTCHAR U+853D +ENCODING 34109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +4D40 +297C +2AC8 +7F48 +4928 +5D30 +5B10 +6B30 +4948 +4B84 +0000 +ENDCHAR +STARTCHAR U+853E +ENCODING 34110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F7E +0410 +0220 +3C3E +0852 +7F12 +2A22 +49CC +0080 +7FFF +0490 +0888 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+853F +ENCODING 34111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +01F8 +1F08 +1084 +2040 +5FF8 +1008 +1FFE +1002 +1FFF +2009 +2925 +2891 +5006 +ENDCHAR +STARTCHAR U+8540 +ENCODING 34112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0820 +7FFC +0820 +3EF8 +2AA8 +2AA8 +2EB8 +1C70 +2AA8 +4924 +0820 +0000 +ENDCHAR +STARTCHAR U+8541 +ENCODING 34113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FF0 +0010 +7FFC +1FF0 +3EF8 +0888 +3EF8 +7FFC +0840 +0440 +00C0 +0000 +ENDCHAR +STARTCHAR U+8543 +ENCODING 34115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0460 +1FD0 +0920 +7FFC +0540 +1930 +6FEC +0920 +0FE0 +0920 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8544 +ENCODING 34116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +7F7F +4141 +7F7F +4141 +7F7F +4001 +4A89 +4A45 +4A11 +41F1 +4003 +0000 +0000 +ENDCHAR +STARTCHAR U+8545 +ENCODING 34117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +33FE +1222 +43FE +3222 +13FE +0020 +17FF +6425 +25FD +2405 +2401 +0000 +0000 +ENDCHAR +STARTCHAR U+8546 +ENCODING 34118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0428 +0044 +7FFF +4040 +5F40 +5164 +5F2C +5138 +5F10 +5138 +DF6D +8AC7 +9102 +ENDCHAR +STARTCHAR U+8547 +ENCODING 34119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +3E3E +2222 +3E3E +1FFC +1084 +1FFC +1084 +1FFC +0080 +7FFF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8548 +ENCODING 34120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +7FFC +1FF0 +1290 +1FF0 +0FE0 +0FE0 +0820 +0FE0 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8549 +ENCODING 34121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0880 +0FF8 +1880 +1FF0 +2880 +4FF0 +0880 +0FF8 +1490 +2248 +4244 +0000 +ENDCHAR +STARTCHAR U+854A +ENCODING 34122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0100 +1490 +1488 +2428 +03E0 +0820 +36D8 +35D4 +5144 +5550 +0C30 +0000 +ENDCHAR +STARTCHAR U+854B +ENCODING 34123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +0900 +09F0 +0900 +3FF8 +0820 +08A0 +2EB8 +28A0 +2EA0 +39FC +6000 +0000 +ENDCHAR +STARTCHAR U+854D +ENCODING 34125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +4070 +3088 +11FC +4603 +31E2 +112A +01EA +112A +61EA +2122 +2266 +0000 +0000 +ENDCHAR +STARTCHAR U+854E +ENCODING 34126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0460 +1FC0 +0100 +3FF8 +07C0 +1C70 +67CC +1FF0 +17D0 +1450 +17D0 +1030 +0000 +ENDCHAR +STARTCHAR U+854F +ENCODING 34127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0840 +8842 +53FE +2044 +5048 +97FF +3040 +51FC +9704 +11FC +3104 +E1FC +ENDCHAR +STARTCHAR U+8550 +ENCODING 34128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +FFFF +1110 +2928 +4546 +1110 +2928 +4546 +0100 +FFFF +0100 +3FFC +0100 +ENDCHAR +STARTCHAR U+8551 +ENCODING 34129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +7E7E +4242 +7E7E +4242 +7E7E +4002 +47E2 +4422 +47E2 +4422 +4422 +47E6 +ENDCHAR +STARTCHAR U+8552 +ENCODING 34130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0000 +7FFE +4442 +7FFE +0000 +3FFC +2004 +3FFC +2004 +3FFC +2004 +3FFC +6006 +ENDCHAR +STARTCHAR U+8553 +ENCODING 34131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1FFC +0080 +7FFF +4081 +1EBC +1EBC +0000 +0FFC +0000 +7FFF +0408 +08FC +3F02 +ENDCHAR +STARTCHAR U+8554 +ENCODING 34132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +047F +3FA1 +0421 +7FE6 +1120 +7FEF +0429 +3FA9 +042A +0424 +044B +0000 +0000 +ENDCHAR +STARTCHAR U+8555 +ENCODING 34133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +08F0 +6910 +13F8 +14A4 +2BF8 +4AA8 +1B38 +2BF8 +4A08 +0BF8 +3208 +0000 +ENDCHAR +STARTCHAR U+8556 +ENCODING 34134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +2440 +13FC +4200 +2BF8 +1208 +63F8 +2200 +23FC +0100 +FFFE +0540 +1930 +610C +0100 +ENDCHAR +STARTCHAR U+8557 +ENCODING 34135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +3E78 +22C8 +2350 +3E30 +08C8 +2FFC +2888 +2E88 +38F8 +6088 +0000 +ENDCHAR +STARTCHAR U+8558 +ENCODING 34136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +1FF0 +0100 +7FFC +0820 +3EF8 +0E20 +71FC +3FF8 +0480 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+8559 +ENCODING 34137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0540 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0108 +7FFC +1200 +5114 +5012 +8FF2 +ENDCHAR +STARTCHAR U+855A +ENCODING 34138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0FE0 +0820 +0FE0 +3EF8 +2288 +3EF8 +0FE0 +7FFC +0800 +0FF0 +1010 +00E0 +0000 +ENDCHAR +STARTCHAR U+855B +ENCODING 34139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0241 +3C22 +087F +7F09 +087F +1C48 +2A7F +4919 +0829 +084B +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+855C +ENCODING 34140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +FFFF +0810 +0440 +7C7E +0440 +7C7E +0440 +FC7F +0840 +3040 +0100 +2486 +6413 +C3F1 +ENDCHAR +STARTCHAR U+855D +ENCODING 34141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +1040 +307C +64C4 +2D88 +18FE +3092 +FE92 +10FE +5480 +5681 +D2C3 +907E +ENDCHAR +STARTCHAR U+855E +ENCODING 34142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +1FF0 +1010 +1FF0 +1014 +FFFE +2100 +3F7C +2144 +3F28 +2110 +FFA8 +014E +0184 +ENDCHAR +STARTCHAR U+855F +ENCODING 34143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1F88 +4252 +2424 +1818 +E007 +3CF8 +0488 +3C8E +2100 +3CFC +0444 +0C38 +39C7 +ENDCHAR +STARTCHAR U+8560 +ENCODING 34144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1000 +FF7E +2142 +4342 +7642 +0C7E +3900 +EA20 +0442 +FFFF +0101 +1918 +710E +ENDCHAR +STARTCHAR U+8561 +ENCODING 34145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0520 +3FFC +0910 +FFFF +0810 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +0810 +700E +ENDCHAR +STARTCHAR U+8562 +ENCODING 34146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0520 +1FF8 +1108 +1FF8 +0100 +FFFF +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +0810 +700E +ENDCHAR +STARTCHAR U+8563 +ENCODING 34147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0470 +3F90 +1220 +0940 +3FFC +2828 +4EF8 +12A0 +2AA0 +05FC +1820 +6020 +0000 +ENDCHAR +STARTCHAR U+8564 +ENCODING 34148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +FF10 +1050 +317C +4A90 +9610 +257C +4D10 +1514 +25FE +4480 +8440 +283E +100C +ENDCHAR +STARTCHAR U+8565 +ENCODING 34149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0024 +7F44 +24FF +2544 +7F7F +0C44 +147F +6444 +047F +1C40 +0000 +0000 +ENDCHAR +STARTCHAR U+8566 +ENCODING 34150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7FFF +0808 +41FF +3020 +10FE +4082 +30FE +0082 +08FE +1082 +60FE +2044 +2082 +0000 +0000 +ENDCHAR +STARTCHAR U+8567 +ENCODING 34151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0848 +08FE +1100 +247E +4842 +187A +287E +0820 +087E +08A4 +0818 +08E7 +0000 +0000 +ENDCHAR +STARTCHAR U+8568 +ENCODING 34152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FFC +14A0 +1320 +1FFC +1AB4 +1AD8 +1F90 +1AB0 +1230 +2448 +4884 +0000 +ENDCHAR +STARTCHAR U+8569 +ENCODING 34153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +11F0 +0910 +49F0 +2110 +21F0 +0FFC +0900 +13F8 +1CA8 +2348 +20B0 +0000 +ENDCHAR +STARTCHAR U+856A +ENCODING 34154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1000 +1FF8 +2AA0 +4AA0 +7FFC +0AA0 +0AA0 +7FFC +1490 +2248 +4244 +0000 +ENDCHAR +STARTCHAR U+856B +ENCODING 34155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0910 +7FFE +0420 +FFFF +0000 +1FF8 +1108 +1FF8 +1108 +1FF8 +0100 +3FFC +0100 +FFFF +ENDCHAR +STARTCHAR U+856C +ENCODING 34156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0000 +1010 +2222 +7C7C +0808 +1111 +7F7F +0808 +4949 +4949 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+856D +ENCODING 34157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +1FF0 +0110 +7FFC +1FF0 +1550 +1D70 +1FF0 +1110 +1D70 +2550 +4550 +0000 +ENDCHAR +STARTCHAR U+856E +ENCODING 34158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0000 +101C +3004 +1E3C +1004 +1FFC +0800 +1FFF +3249 +1249 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+856F +ENCODING 34159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0080 +79FC +490C +4A98 +5070 +50DC +4B87 +48A0 +49FE +5A20 +41FC +4020 +47FF +ENDCHAR +STARTCHAR U+8571 +ENCODING 34161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +0892 +7092 +1054 +7CFE +1082 +38FE +5482 +10FE +1082 +1082 +0000 +0000 +ENDCHAR +STARTCHAR U+8572 +ENCODING 34162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +220C +1470 +7F40 +4940 +7F7E +4948 +7F48 +0848 +FF48 +0888 +0888 +0908 +0808 +ENDCHAR +STARTCHAR U+8574 +ENCODING 34164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0448 +11FC +2108 +45F8 +7908 +11F8 +2000 +7FFC +0294 +1E94 +E294 +47FE +0000 +ENDCHAR +STARTCHAR U+8575 +ENCODING 34165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1028 +1054 +1E92 +237D +5244 +0A7C +0444 +087C +104A +2054 +0062 +0000 +0000 +ENDCHAR +STARTCHAR U+8576 +ENCODING 34166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +1FFC +7FFF +4889 +4491 +0BE8 +0410 +09C8 +7007 +07F0 +0120 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+8577 +ENCODING 34167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FFC +1420 +08F8 +7F88 +0AF8 +0C88 +08F8 +0888 +08F8 +0858 +1984 +0000 +ENDCHAR +STARTCHAR U+8578 +ENCODING 34168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +03DF +2241 +13DF +0200 +73DF +1211 +13CA +1204 +121B +6800 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+8579 +ENCODING 34169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0440 +FFFE +0540 +FFFE +10A0 +1494 +25FE +7A90 +10FC +2490 +7CFC +0490 +0894 +10FE +6080 +ENDCHAR +STARTCHAR U+857A +ENCODING 34170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +3E10 +2248 +3E48 +0040 +FFFE +2240 +3E48 +2248 +3E30 +2220 +FF52 +028A +0204 +ENDCHAR +STARTCHAR U+857B +ENCODING 34171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +0444 +FFFE +0440 +3E90 +2090 +3DFC +2090 +3C90 +2094 +FFFE +1000 +2490 +2488 +7D04 +0204 +ENDCHAR +STARTCHAR U+857C +ENCODING 34172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +7F7E +2012 +3EFF +2012 +3E7E +2010 +7EFF +1010 +22FE +7E10 +0210 +0000 +0000 +ENDCHAR +STARTCHAR U+857D +ENCODING 34173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0240 +1FFC +1244 +1FFC +1244 +3FFE +2000 +2FFC +2000 +3FFF +6444 +C738 +1C0F +ENDCHAR +STARTCHAR U+857E +ENCODING 34174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FF8 +0100 +3FFC +2D68 +4D60 +1FF0 +1110 +1FF0 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+857F +ENCODING 34175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +100E +13F8 +1522 +5494 +55FE +D020 +93FF +1040 +38FC +2984 +6F58 +4430 +C3CF +ENDCHAR +STARTCHAR U+8580 +ENCODING 34176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +13F0 +0A90 +4AD0 +2330 +23F0 +1000 +17F8 +2528 +2528 +4FFC +4000 +0000 +ENDCHAR +STARTCHAR U+8581 +ENCODING 34177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0100 +3FFC +2034 +2FE4 +2544 +3FFC +2344 +2524 +2914 +FFFF +0660 +1C38 +F00F +ENDCHAR +STARTCHAR U+8582 +ENCODING 34178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +1810 +3F20 +6120 +3F3F +2124 +3F44 +0804 +7F24 +1014 +3F08 +4114 +0763 +0000 +0000 +ENDCHAR +STARTCHAR U+8583 +ENCODING 34179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0020 +63FF +20FC +0084 +60FC +2000 +0BFF +1279 +6249 +2279 +2203 +0000 +0000 +ENDCHAR +STARTCHAR U+8584 +ENCODING 34180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0450 +1048 +0FFC +4BF8 +2248 +23F8 +1248 +13F8 +2FFC +2110 +4090 +4030 +0000 +ENDCHAR +STARTCHAR U+8585 +ENCODING 34181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +2440 +23FC +2200 +FAF8 +4A00 +4BFE +4AA8 +9290 +52CE +2208 +55FE +4C88 +8848 +1018 +ENDCHAR +STARTCHAR U+8586 +ENCODING 34182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +001C +7FF2 +1104 +FFFF +8101 +148D +3416 +67F2 +0800 +3FF8 +EC30 +07E0 +FC3F +ENDCHAR +STARTCHAR U+8587 +ENCODING 34183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +2220 +2AA0 +4AA0 +1FFC +1048 +2FA8 +6030 +2710 +25B0 +2948 +3084 +0000 +ENDCHAR +STARTCHAR U+8588 +ENCODING 34184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +7FFC +0920 +06C0 +1FF0 +7FFC +1930 +1550 +1FF0 +0FE0 +0820 +0FE0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+8589 +ENCODING 34185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0080 +10FE +1080 +FFFF +0024 +3FFE +2020 +2FB2 +2216 +2A9C +6A89 +423D +C6C7 +ENDCHAR +STARTCHAR U+858A +ENCODING 34186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0C40 +0F08 +1248 +3F48 +5548 +1F48 +1548 +1F48 +1548 +2AC8 +2A88 +4018 +0000 +ENDCHAR +STARTCHAR U+858B +ENCODING 34187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +6080 +39FE +0322 +1854 +7088 +DFFF +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +700E +ENDCHAR +STARTCHAR U+858C +ENCODING 34188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +2000 +67DF +C451 +97D3 +7456 +2454 +47D2 +F411 +1491 +35D1 +6757 +CC10 +ENDCHAR +STARTCHAR U+858D +ENCODING 34189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0888 +3F00 +1290 +3F90 +0910 +7FD0 +4950 +5F50 +5F51 +4A51 +4451 +4A5F +0000 +0000 +ENDCHAR +STARTCHAR U+858E +ENCODING 34190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +3FFE +2222 +3FFE +0000 +7FFF +4449 +49FD +1840 +2850 +0822 +085C +0000 +0000 +ENDCHAR +STARTCHAR U+858F +ENCODING 34191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0540 +3FF8 +0820 +FFFE +0010 +1FF8 +1010 +1FF0 +1010 +1FF0 +0900 +2888 +2824 +47E4 +ENDCHAR +STARTCHAR U+8590 +ENCODING 34192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0640 +39F8 +0840 +7FFC +08A4 +1D5C +1A70 +2990 +4860 +08F0 +0B0C +0000 +ENDCHAR +STARTCHAR U+8591 +ENCODING 34193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +7FFC +1FF0 +1FF0 +1110 +1FF0 +7FFC +1FF0 +1FF0 +1110 +1FF0 +7FFC +0000 +ENDCHAR +STARTCHAR U+8593 +ENCODING 34195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +61FC +3004 +17FF +C004 +67FF +2421 +05FD +1124 +3020 +23FE +618C +4070 +C78F +ENDCHAR +STARTCHAR U+8594 +ENCODING 34196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +3FF8 +0920 +0D30 +1348 +7FFC +1FF0 +17D0 +1450 +17D0 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+8595 +ENCODING 34197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0450 +3FFF +2104 +2FFF +2110 +27FE +2112 +2FFF +2112 +27FE +2318 +4514 +0000 +0000 +ENDCHAR +STARTCHAR U+8596 +ENCODING 34198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +20F8 +1088 +00B8 +78A8 +13FE +2202 +12FA +0A8A +0AFA +1A02 +27FF +0000 +0000 +ENDCHAR +STARTCHAR U+8597 +ENCODING 34199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FF8 +2108 +27C8 +3FF8 +2448 +27E8 +23A8 +2E48 +2228 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+8598 +ENCODING 34200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0020 +61FC +3020 +17FF +0088 +07FF +F020 +13FE +1020 +17FF +3020 +6800 +C7FF +ENDCHAR +STARTCHAR U+8599 +ENCODING 34201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +1440 +1048 +3E90 +28FC +4990 +7EF8 +0890 +14F8 +1290 +22FC +4080 +0000 +ENDCHAR +STARTCHAR U+859A +ENCODING 34202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +7E7E +1042 +107E +1E42 +127E +2200 +54FF +0840 +10FF +2129 +4052 +0000 +0000 +ENDCHAR +STARTCHAR U+859B +ENCODING 34203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0C60 +1020 +3DFC +2488 +3C50 +21FC +3C20 +25FC +2420 +3C20 +2020 +0000 +ENDCHAR +STARTCHAR U+859C +ENCODING 34204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0460 +3C20 +25FC +2488 +3C50 +21FC +3C20 +65FC +2420 +3C20 +2020 +0000 +ENDCHAR +STARTCHAR U+859D +ENCODING 34205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +03F8 +0410 +3FFF +2108 +22E8 +3C07 +27FC +2000 +23F0 +6000 +47F8 +C408 +07F8 +ENDCHAR +STARTCHAR U+859E +ENCODING 34206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +001C +7F22 +10C9 +1E7E +2242 +527E +0C42 +087E +104A +2054 +4063 +0000 +0000 +ENDCHAR +STARTCHAR U+859F +ENCODING 34207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +FFFF +0908 +0380 +06C0 +0C70 +381C +E7E7 +0000 +3E7C +2244 +3E7C +0810 +1C38 +366C +E0C7 +ENDCHAR +STARTCHAR U+85A0 +ENCODING 34208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +1000 +11FF +1210 +56FE +D482 +90FE +1082 +38FE +2882 +6CFE +4644 +C1C7 +ENDCHAR +STARTCHAR U+85A1 +ENCODING 34209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0FF8 +0808 +0FF8 +0FF8 +0808 +2FFA +2222 +3E3E +0220 +7E3F +2222 +0000 +0000 +ENDCHAR +STARTCHAR U+85A2 +ENCODING 34210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +2000 +3CFE +4822 +FF62 +49CE +7F00 +4928 +7F7E +4108 +41FF +C108 +8308 +ENDCHAR +STARTCHAR U+85A3 +ENCODING 34211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0000 +0408 +7FC8 +047F +3F88 +003E +3FA2 +2094 +3F88 +1114 +7FE2 +0000 +0000 +ENDCHAR +STARTCHAR U+85A4 +ENCODING 34212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +7EA0 +10A0 +1FB8 +14A0 +27B8 +58A0 +0BB8 +10A0 +27FC +4000 +0000 +ENDCHAR +STARTCHAR U+85A5 +ENCODING 34213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0000 +7FFE +4442 +7FFE +0800 +1FFE +3202 +FFE2 +2222 +3FE2 +0246 +03E4 +3E2C +ENDCHAR +STARTCHAR U+85A6 +ENCODING 34214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +1FFC +1240 +1FF8 +1248 +1FF8 +13FC +1200 +23FC +2AA4 +4954 +1018 +0000 +ENDCHAR +STARTCHAR U+85A7 +ENCODING 34215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0520 +FFFF +1008 +1FF8 +0000 +FFFF +8001 +BFFD +0840 +3E46 +E27C +3441 +1843 +E03E +ENDCHAR +STARTCHAR U+85A8 +ENCODING 34216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1FF0 +1290 +1FF0 +3FFC +2008 +7FF8 +1E98 +72E0 +0C84 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+85A9 +ENCODING 34217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0460 +3FFC +2488 +2850 +31FC +2960 +25F8 +2520 +25F8 +3A20 +25FC +2000 +0000 +ENDCHAR +STARTCHAR U+85AA +ENCODING 34218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +080C +3F70 +1240 +1440 +7F7C +0848 +7F48 +1C48 +2A88 +4A88 +0908 +0000 +ENDCHAR +STARTCHAR U+85AB +ENCODING 34219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0460 +0FC0 +7FFC +0FE0 +0920 +0FE0 +0920 +0FE0 +1FF0 +7FFC +1248 +6124 +0000 +ENDCHAR +STARTCHAR U+85AC +ENCODING 34220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +27C8 +1450 +0FE0 +1458 +67C4 +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+85AD +ENCODING 34221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0010 +1C20 +F1FE +1122 +11FE +FD22 +11FE +3848 +3488 +53FF +9008 +1008 +1008 +ENDCHAR +STARTCHAR U+85AE +ENCODING 34222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0C40 +2A40 +1C40 +7F7C +1C90 +2A90 +7F50 +1260 +3C20 +0450 +1A88 +6304 +0000 +ENDCHAR +STARTCHAR U+85AF +ENCODING 34223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +1FF0 +1290 +1FF0 +0FF0 +0140 +7FFC +07F0 +1C10 +67F0 +0410 +07F0 +0410 +0000 +ENDCHAR +STARTCHAR U+85B0 +ENCODING 34224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +3FF8 +0100 +FFFE +0100 +3FF8 +2548 +3FF8 +0100 +3FF8 +0100 +7FFC +2488 +4244 +ENDCHAR +STARTCHAR U+85B1 +ENCODING 34225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0000 +4A44 +2A84 +7FFF +2084 +1104 +3FA4 +0414 +3F84 +0404 +7FDC +0000 +0000 +ENDCHAR +STARTCHAR U+85B3 +ENCODING 34227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +4020 +21FC +0020 +7BFE +10F8 +2088 +40F8 +20C4 +1158 +2064 +5FFF +0000 +0000 +ENDCHAR +STARTCHAR U+85B4 +ENCODING 34228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0910 +7FFE +4102 +548A +342C +67E6 +0000 +3FFC +2444 +3FFC +0000 +FFFF +0100 +0700 +ENDCHAR +STARTCHAR U+85B5 +ENCODING 34229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0490 +3FFE +0080 +1FFC +3FFE +0002 +1FFE +0080 +7FFF +3EFF +2224 +3E0C +0000 +0000 +ENDCHAR +STARTCHAR U+85B6 +ENCODING 34230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1000 +2AFE +C492 +2892 +10FE +E892 +0892 +34FE +C410 +0CFE +3410 +C410 +19FF +ENDCHAR +STARTCHAR U+85B7 +ENCODING 34231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +7FFC +0100 +7FFE +5112 +8D64 +1110 +7FFC +0200 +3FF8 +2448 +2448 +2448 +2018 +ENDCHAR +STARTCHAR U+85B8 +ENCODING 34232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +67FF +3090 +03FE +C292 +63FE +0000 +13FE +3000 +27FF +6020 +4326 +C6E3 +ENDCHAR +STARTCHAR U+85B9 +ENCODING 34233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +3FF8 +1FF0 +0820 +0FE0 +3FFC +2FE8 +4240 +0FF0 +1FF0 +0100 +3FF8 +0000 +ENDCHAR +STARTCHAR U+85BA +ENCODING 34234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +7FFC +0288 +7D70 +1550 +2DF8 +4924 +0FE0 +0820 +0FE0 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+85BC +ENCODING 34236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0890 +3FFF +2220 +3FFE +2222 +3FFE +2420 +67BC +4421 +DF9E +0100 +3FFC +0100 +FFFF +ENDCHAR +STARTCHAR U+85BD +ENCODING 34237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +FFFF +1440 +7F40 +557C +7F44 +0864 +7F54 +0854 +0F45 +387D +E1C3 +ENDCHAR +STARTCHAR U+85BE +ENCODING 34238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +FFFF +2104 +7FFE +C103 +552A +4912 +552A +4102 +552A +4912 +552A +4102 +410E +ENDCHAR +STARTCHAR U+85BF +ENCODING 34239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +4EFE +7804 +4228 +3E10 +40FF +7E12 +8850 +7F5E +18D0 +34B0 +629C +C187 +ENDCHAR +STARTCHAR U+85C0 +ENCODING 34240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +2492 +1554 +0410 +0A28 +1144 +7FFF +4081 +1084 +0948 +0220 +1C1C +0000 +0000 +ENDCHAR +STARTCHAR U+85C1 +ENCODING 34241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +7FFC +07C0 +07C0 +3FF8 +27C8 +2448 +27D8 +7FFC +0540 +1930 +610C +0000 +ENDCHAR +STARTCHAR U+85C2 +ENCODING 34242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +FF7E +2222 +3E36 +221C +3E1C +2376 +3E03 +E0F0 +0780 +7106 +C1DC +3970 +E11F +ENDCHAR +STARTCHAR U+85C3 +ENCODING 34243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0820 +7FA0 +003F +3F41 +2189 +3F09 +7F88 +4088 +5E94 +52A2 +5EC1 +0000 +0000 +ENDCHAR +STARTCHAR U+85C4 +ENCODING 34244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0C18 +1FFC +0410 +07F0 +07F0 +0410 +3FFE +0928 +13C4 +208A +4FF9 +0490 +0000 +0000 +ENDCHAR +STARTCHAR U+85C5 +ENCODING 34245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +3FFE +2222 +3FFE +0800 +7F02 +3E22 +3E22 +0022 +3E22 +2202 +3E0E +0000 +0000 +ENDCHAR +STARTCHAR U+85C6 +ENCODING 34246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0888 +7FFF +4221 +4FF9 +1FFC +3FFE +1014 +27E2 +4FF9 +1FFC +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+85C7 +ENCODING 34247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1800 +721E +43C2 +7A1E +43C2 +4042 +7A5E +4242 +4242 +FFFF +0810 +381C +E007 +ENDCHAR +STARTCHAR U+85C8 +ENCODING 34248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0002 +7DEC +4429 +454A +7C84 +457E +4611 +7DFF +4428 +4444 +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+85C9 +ENCODING 34249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0C50 +0E50 +78F8 +0850 +3FFC +0800 +7EF8 +1C88 +1AF8 +2A88 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+85CA +ENCODING 34250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +1C00 +F3FF +1000 +11FC +FD04 +11FC +3900 +35FE +5552 +93FE +1352 +1552 +1156 +ENDCHAR +STARTCHAR U+85CB +ENCODING 34251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +FEFE +4242 +2626 +1A1A +E262 +0840 +1FFE +3080 +DFFC +1080 +1FFC +1080 +1FFF +ENDCHAR +STARTCHAR U+85CD +ENCODING 34253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3F40 +247C +3E80 +3F00 +2478 +3F00 +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+85CE +ENCODING 34254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0490 +1FFC +0084 +7FFF +0084 +1FFC +0080 +7FFF +2422 +4211 +1FFC +1224 +1224 +7FFF +ENDCHAR +STARTCHAR U+85CF +ENCODING 34255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0450 +0048 +2FFC +2840 +3FC8 +0D48 +7FA8 +2CB0 +2F90 +5534 +17CC +2484 +0000 +ENDCHAR +STARTCHAR U+85D0 +ENCODING 34256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0E80 +73F8 +5508 +29F8 +1908 +6DF8 +14A0 +6CA0 +14A4 +6524 +1A1C +0000 +ENDCHAR +STARTCHAR U+85D1 +ENCODING 34257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0908 +03F8 +0410 +3FFE +2222 +0FF8 +0FE8 +0FE8 +07F0 +0A20 +01C0 +0E38 +0000 +0000 +ENDCHAR +STARTCHAR U+85D2 +ENCODING 34258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +027E +3C42 +087A +7F7E +0840 +1C7F +2A91 +49A9 +0881 +08F9 +0807 +0000 +0000 +ENDCHAR +STARTCHAR U+85D3 +ENCODING 34259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +1440 +1044 +3E28 +44FE +8810 +7F10 +497C +7F10 +4910 +7FFE +0010 +0F10 +F010 +0010 +ENDCHAR +STARTCHAR U+85D5 +ENCODING 34261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0C40 +0BF8 +7CA8 +08F8 +3EA8 +08F8 +7E20 +1DFC +1B34 +2BFC +4904 +090C +0000 +ENDCHAR +STARTCHAR U+85D7 +ENCODING 34263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +4108 +27C8 +010F +77D5 +1545 +27C4 +7104 +138C +1552 +2121 +5FFF +0000 +0000 +ENDCHAR +STARTCHAR U+85D8 +ENCODING 34264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0910 +01F8 +0100 +3FFE +2102 +2FF0 +2104 +27FC +2490 +27F0 +6490 +4FF6 +DA0B +31F9 +ENDCHAR +STARTCHAR U+85D9 +ENCODING 34265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +081E +7F92 +1213 +7FA3 +1840 +2C9F +5311 +2611 +4B0A +1284 +264A +0000 +0000 +ENDCHAR +STARTCHAR U+85DA +ENCODING 34266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0100 +FFFF +0100 +7FFE +4442 +7FFE +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +700E +ENDCHAR +STARTCHAR U+85DC +ENCODING 34268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +06C0 +38F8 +0928 +7E48 +1D88 +6AB0 +0E40 +1930 +654C +07C0 +3938 +0300 +0000 +ENDCHAR +STARTCHAR U+85DD +ENCODING 34269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0C40 +3EF0 +7F50 +2DD0 +5F74 +0E94 +390C +1FF0 +7FFC +0220 +07F0 +3808 +0000 +ENDCHAR +STARTCHAR U+85DE +ENCODING 34270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +3FFE +0400 +0FFC +1404 +07FC +7E7F +1010 +3E1E +5232 +1252 +1E1E +0000 +0000 +ENDCHAR +STARTCHAR U+85DF +ENCODING 34271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0420 +FFFF +0420 +0000 +0FF0 +0910 +0FF0 +0910 +0FF0 +0000 +7E7E +5252 +7E7E +5252 +7E7E +ENDCHAR +STARTCHAR U+85E0 +ENCODING 34272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +04A0 +0100 +0FF0 +0810 +0FF0 +0810 +0FF0 +1008 +2010 +7E7E +4242 +7E7E +4242 +7E7E +ENDCHAR +STARTCHAR U+85E1 +ENCODING 34273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0430 +21FC +1088 +03FE +7A22 +0AFA +1222 +2272 +1252 +1272 +2202 +5FFF +0000 +0000 +ENDCHAR +STARTCHAR U+85E2 +ENCODING 34274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +12A8 +26AF +4BF1 +1001 +33E9 +5009 +13E9 +108A +13E4 +108A +13F1 +0000 +0000 +ENDCHAR +STARTCHAR U+85E3 +ENCODING 34275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +3FFE +2222 +3FFE +1020 +20BE +7FA0 +3FBF +2080 +3FBE +3FA0 +41BF +0000 +0000 +ENDCHAR +STARTCHAR U+85E4 +ENCODING 34276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3950 +28E0 +2BF8 +38A0 +2FFC +2950 +3B58 +2CE4 +2B50 +2848 +58C0 +0000 +ENDCHAR +STARTCHAR U+85E5 +ENCODING 34277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +1550 +6BE8 +2AA8 +1390 +2AA8 +7FFC +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+85E6 +ENCODING 34278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0890 +7FFF +4208 +5FBF +471C +4AAA +521D +47F0 +4040 +4FFF +C040 +9FFF +8040 +01C0 +ENDCHAR +STARTCHAR U+85E8 +ENCODING 34280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0890 +3FFF +2220 +3FFE +2222 +3FFE +2820 +2F3C +2821 +3F3F +6000 +4924 +D9B6 +3093 +ENDCHAR +STARTCHAR U+85E9 +ENCODING 34281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1038 +0BC8 +4950 +27FC +20E0 +0BF8 +0D54 +11F0 +1150 +21F0 +2110 +0000 +ENDCHAR +STARTCHAR U+85EA +ENCODING 34282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1F20 +1520 +7FFC +1F48 +1FC8 +1528 +1F30 +7F90 +1A30 +0648 +3984 +0000 +ENDCHAR +STARTCHAR U+85EB +ENCODING 34283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +47FF +33FE +1252 +43FE +31FC +1104 +09FC +11FC +6020 +23FE +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+85EC +ENCODING 34284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +3EFE +2292 +24FE +2810 +25FF +22FE +32FE +2A82 +24FE +20FE +2183 +0000 +0000 +ENDCHAR +STARTCHAR U+85ED +ENCODING 34285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0910 +7FFE +4422 +183F +E400 +3F7E +2102 +3F7E +2140 +3F7E +2102 +FF02 +1106 +E71C +ENDCHAR +STARTCHAR U+85EF +ENCODING 34287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +3F84 +2084 +3FBF +2704 +2FA4 +2714 +5AC4 +020C +2880 +284A +4FF9 +0000 +0000 +ENDCHAR +STARTCHAR U+85F0 +ENCODING 34288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +0801 +73E1 +4929 +7669 +0A09 +1109 +3F89 +4449 +3F89 +1501 +7FC7 +0000 +0000 +ENDCHAR +STARTCHAR U+85F1 +ENCODING 34289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F7E +0490 +1FFE +1100 +57FC +3444 +17FC +3444 +57FC +10A9 +113F +2221 +043F +0000 +0000 +ENDCHAR +STARTCHAR U+85F2 +ENCODING 34290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1000 +13FE +1200 +7E78 +1248 +3278 +5AEE +16AA +12EE +1200 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+85F3 +ENCODING 34291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0520 +FFFF +1008 +1FF8 +0000 +FFFF +9009 +9FF9 +0006 +7FF8 +0100 +FFFF +0910 +710E +ENDCHAR +STARTCHAR U+85F6 +ENCODING 34294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +7FFF +4000 +5FBE +4208 +5FBF +471C +4AAA +5209 +C040 +847E +8440 +3FFF +ENDCHAR +STARTCHAR U+85F7 +ENCODING 34295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3C48 +01F8 +7E50 +03FC +3C40 +3CF8 +0188 +3EF8 +2488 +3CF8 +2088 +0000 +ENDCHAR +STARTCHAR U+85F8 +ENCODING 34296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +7F10 +107F +2812 +4D14 +16FF +2410 +4E3E +1562 +24BE +4422 +183E +0000 +0000 +ENDCHAR +STARTCHAR U+85F9 +ENCODING 34297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3CF8 +0088 +7EF8 +0088 +3CF8 +3CFC +0144 +3F64 +2594 +3DF4 +2118 +0000 +ENDCHAR +STARTCHAR U+85FA +ENCODING 34298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3EF8 +2288 +3EF8 +3EF8 +2488 +27E8 +2FC8 +37C8 +2488 +27E8 +2418 +0000 +ENDCHAR +STARTCHAR U+85FB +ENCODING 34299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +11F0 +0910 +49F0 +23B8 +22A8 +0BF8 +0840 +17FC +11F0 +264C +2040 +0000 +ENDCHAR +STARTCHAR U+85FC +ENCODING 34300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0100 +7FFE +4102 +5FFA +0100 +1FF8 +0100 +FFFF +2444 +3FFC +1486 +6453 +C3F1 +ENDCHAR +STARTCHAR U+85FD +ENCODING 34301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +087C +7F44 +227C +7F44 +087C +7F44 +087C +2A29 +4949 +0887 +0000 +0000 +ENDCHAR +STARTCHAR U+85FE +ENCODING 34302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0C40 +09F8 +7E48 +0898 +3FF8 +2A88 +3EF8 +1CF8 +1A88 +2AF8 +4858 +0984 +0000 +ENDCHAR +STARTCHAR U+85FF +ENCODING 34303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +3FF8 +0100 +7FFE +5112 +8D64 +1090 +1FFC +3080 +5FF8 +9080 +1FF8 +1080 +1FFC +ENDCHAR +STARTCHAR U+8600 +ENCODING 34304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0000 +23FE +2292 +23FE +F820 +23FE +2020 +27FF +3888 +E3FE +2020 +21FC +6020 +ENDCHAR +STARTCHAR U+8601 +ENCODING 34305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +7FFF +0080 +3EBE +22A2 +3EBE +7FFF +0080 +3EBE +22A2 +3EBE +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8602 +ENCODING 34306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +14B0 +1448 +23C0 +1A68 +35D4 +5554 +0D30 +7FFC +0540 +1930 +610C +0000 +ENDCHAR +STARTCHAR U+8604 +ENCODING 34308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0003 +F78E +94B8 +F7A0 +0020 +7F3F +4924 +7F24 +4924 +7F24 +0864 +FF44 +08C4 +ENDCHAR +STARTCHAR U+8605 +ENCODING 34309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +1200 +13DC +2480 +4FC0 +957E +27C8 +6548 +A7C8 +2108 +2FE8 +2108 +2288 +2C58 +ENDCHAR +STARTCHAR U+8606 +ENCODING 34310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0540 +01F8 +1FFC +11C8 +1EF8 +17F0 +1490 +17F0 +17F0 +2FF8 +2948 +5FFC +0000 +ENDCHAR +STARTCHAR U+8607 +ENCODING 34311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +1018 +1EE0 +2420 +7E20 +2BFC +3E70 +2A70 +3EA8 +3B24 +2D20 +4020 +0000 +ENDCHAR +STARTCHAR U+8609 +ENCODING 34313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +1FFC +1224 +1FFC +7FFF +49F9 +5009 +33FE +51F8 +17FE +15F2 +1040 +17BC +0000 +0000 +ENDCHAR +STARTCHAR U+860A +ENCODING 34314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +11F8 +1548 +6568 +1998 +15F8 +7E00 +09F8 +2D68 +2B68 +4BFC +0800 +0000 +ENDCHAR +STARTCHAR U+860B +ENCODING 34315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +09FC +2820 +2EF8 +2888 +7FF8 +2888 +2AF8 +5A88 +04F8 +1888 +6304 +0000 +ENDCHAR +STARTCHAR U+860C +ENCODING 34316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +220F +4BE9 +1489 +37FB +52A8 +13E8 +1FFC +0000 +3FFE +0490 +0888 +0000 +0000 +ENDCHAR +STARTCHAR U+860D +ENCODING 34317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +7E10 +0810 +FF90 +497F +7F11 +4911 +7F11 +0811 +7F11 +0831 +FFA3 +5562 +94CE +ENDCHAR +STARTCHAR U+860E +ENCODING 34318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +3FFC +0100 +7FFE +4102 +5D7A +0100 +7CFE +4492 +7C92 +44FE +7C80 +4481 +8C7E +ENDCHAR +STARTCHAR U+8610 +ENCODING 34320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +000E +7BF8 +0122 +FC94 +01FE +7820 +03FF +7840 +00FC +7984 +4B58 +4830 +7BCF +ENDCHAR +STARTCHAR U+8611 +ENCODING 34321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +FFFE +0920 +7FFC +4420 +7FFC +4C70 +56AE +6524 +7FFC +4200 +4408 +4FFC +7408 +8408 +07F8 +ENDCHAR +STARTCHAR U+8612 +ENCODING 34322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +1C7C +F088 +13FC +10A4 +FCFC +10A4 +39FE +3522 +55FE +9122 +11FE +1021 +101F +ENDCHAR +STARTCHAR U+8613 +ENCODING 34323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +0670 +38A0 +09F8 +7EA8 +08F8 +1CA8 +1AF8 +2A00 +49A8 +0954 +0A54 +0000 +ENDCHAR +STARTCHAR U+8616 +ENCODING 34326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +1460 +3EF8 +2250 +3FFC +3E20 +22F8 +3F20 +0100 +7FFC +07C0 +793C +0100 +0000 +ENDCHAR +STARTCHAR U+8617 +ENCODING 34327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0460 +3EF8 +2250 +3FFC +3E20 +32F8 +5F20 +0100 +7FFC +07C0 +793C +0100 +0000 +ENDCHAR +STARTCHAR U+8618 +ENCODING 34328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0520 +FFFF +1008 +742E +CFF3 +0420 +1FFC +0420 +FFFF +0484 +18C8 +E870 +0F1C +3807 +ENDCHAR +STARTCHAR U+8619 +ENCODING 34329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +7FBC +5027 +5F40 +643E +5F12 +4A0C +7FB3 +0000 +FEFE +0202 +6A6A +1212 +6666 +ENDCHAR +STARTCHAR U+861A +ENCODING 34330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0CC8 +0F48 +1250 +3FFC +5520 +1FF8 +1520 +1F20 +16FC +2B20 +2B20 +4020 +0000 +ENDCHAR +STARTCHAR U+861B +ENCODING 34331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +2208 +FF7F +2210 +3E22 +227F +3E01 +223E +FFA2 +543E +5422 +673E +4022 +7F26 +ENDCHAR +STARTCHAR U+861C +ENCODING 34332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +1440 +7F7F +1481 +1D11 +0855 +3E39 +2AFF +3E39 +0855 +7F93 +0806 +0000 +0000 +ENDCHAR +STARTCHAR U+861E +ENCODING 34334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0810 +1C10 +3610 +631F +DDB2 +0022 +7766 +5514 +771C +0008 +221C +7736 +D563 +ENDCHAR +STARTCHAR U+861F +ENCODING 34335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0414 +7DF8 +4492 +48FE +5010 +49FF +44FE +4402 +54FE +48FE +4152 +407C +0000 +0000 +ENDCHAR +STARTCHAR U+8620 +ENCODING 34336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +2410 +24FE +2492 +3D55 +05FF +7C00 +24FE +24BA +24AA +44BA +04FE +0000 +0000 +ENDCHAR +STARTCHAR U+8621 +ENCODING 34337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +7E7E +4242 +7E7E +4242 +7E7E +4242 +7E7E +2424 +FFFF +0810 +1F20 +01F8 +7F0E +ENDCHAR +STARTCHAR U+8622 +ENCODING 34338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0CC0 +3EFC +14F8 +7E08 +00F8 +3C80 +24F8 +3CF8 +2480 +3CFC +2484 +2C7C +0000 +ENDCHAR +STARTCHAR U+8623 +ENCODING 34339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +1200 +7F88 +1208 +1E7F +7F88 +3F08 +253E +3F08 +2508 +3F7F +4080 +0000 +0000 +ENDCHAR +STARTCHAR U+8624 +ENCODING 34340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +1110 +20A0 +7C78 +4488 +45FC +4604 +7FFF +4401 +4555 +4555 +7C07 +0000 +0000 +ENDCHAR +STARTCHAR U+8625 +ENCODING 34341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +05D0 +0220 +07F0 +0808 +1DDC +3556 +5DDD +0000 +1FFC +1224 +1FFC +122C +0000 +0000 +ENDCHAR +STARTCHAR U+8626 +ENCODING 34342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0000 +3FFE +0080 +7FFF +4489 +4291 +0488 +39CE +294A +294A +39CE +0000 +0000 +ENDCHAR +STARTCHAR U+8627 +ENCODING 34343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +0440 +4078 +3040 +17FC +0444 +05F0 +F444 +153C +16A8 +1568 +14A8 +1924 +2840 +47FE +ENDCHAR +STARTCHAR U+8629 +ENCODING 34345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FFFE +2420 +3FA4 +407E +BF84 +2924 +FFA8 +2510 +3F2E +0244 +0FE0 +0220 +1FF0 +0540 +3938 +ENDCHAR +STARTCHAR U+862A +ENCODING 34346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0490 +3FFF +2220 +3FFE +3FFE +2F3C +48A2 +0FBE +0490 +3FFE +0490 +0888 +0000 +0000 +ENDCHAR +STARTCHAR U+862C +ENCODING 34348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7EFF +2410 +7EFE +4202 +7E7E +4002 +7EFE +43FF +7F11 +08FE +2E92 +289E +7E10 +0000 +0000 +ENDCHAR +STARTCHAR U+862D +ENCODING 34349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +3EF8 +2288 +3EF8 +3EF8 +2108 +2FE8 +27C8 +27C8 +27C8 +2388 +2D68 +2118 +0000 +ENDCHAR +STARTCHAR U+862E +ENCODING 34350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +1FFC +1224 +1FFC +0000 +3FFF +2A82 +2512 +2892 +2A92 +4502 +18C6 +0000 +0000 +ENDCHAR +STARTCHAR U+862F +ENCODING 34351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +23F0 +13D0 +43F0 +2FFC +13F8 +2D48 +42B0 +1FF0 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8630 +ENCODING 34352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0CF8 +0A88 +72F8 +14F8 +0DFC +1354 +7FFC +0DF8 +2A90 +2A60 +48F0 +0B0C +0000 +ENDCHAR +STARTCHAR U+8631 +ENCODING 34353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +497F +2A08 +7F3E +1C22 +2A3E +4922 +0A3E +7F22 +143E +2222 +4141 +0000 +0000 +ENDCHAR +STARTCHAR U+8632 +ENCODING 34354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0FF8 +0490 +07F0 +07F0 +3E3E +2A2A +3E3E +3EBE +0080 +0FF8 +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8633 +ENCODING 34355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +1208 +7F88 +123E +1E08 +7F7F +3F08 +2508 +3F3E +2508 +3F7F +4080 +0000 +0000 +ENDCHAR +STARTCHAR U+8634 +ENCODING 34356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +3F7E +0888 +5EBD +5EBD +5EBD +4491 +7FFF +1FFC +0FF8 +0808 +0FF8 +0410 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8635 +ENCODING 34357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +7E44 +25FE +3CA5 +24A4 +27FF +3C04 +25E5 +2526 +7DE5 +052B +05F1 +0000 +0000 +ENDCHAR +STARTCHAR U+8636 +ENCODING 34358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +1C20 +F040 +11FE +FF22 +55FE +9322 +11FE +2050 +FF55 +445F +78D0 +2C91 +C58F +ENDCHAR +STARTCHAR U+8638 +ENCODING 34360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FFFE +0820 +FE90 +2890 +29FE +7E90 +54FC +5490 +54FC +6C90 +44FE +7C00 +4554 +7D52 +4602 +ENDCHAR +STARTCHAR U+8639 +ENCODING 34361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0818 +11FF +1000 +51FF +7D29 +51FF +50D6 +1010 +10D6 +10CA +1144 +1263 +0000 +0000 +ENDCHAR +STARTCHAR U+863A +ENCODING 34362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +1024 +FE6C +0048 +AAFF +9348 +AA48 +FE7E +1048 +FE48 +A27E +AE48 +F248 +867F +ENDCHAR +STARTCHAR U+863B +ENCODING 34363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0C3C +7FA5 +3F47 +297C +3F28 +3F10 +48A8 +7FC7 +0220 +07C8 +3FF8 +0490 +0000 +0000 +ENDCHAR +STARTCHAR U+863C +ENCODING 34364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7FFE +02A0 +3FFC +2210 +3FFE +2B54 +3292 +2120 +2F3C +2120 +2F3C +4120 +5F3E +8120 +0120 +ENDCHAR +STARTCHAR U+863D +ENCODING 34365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0FF0 +0910 +0FF0 +0910 +7FFE +542A +7C3E +542A +7D3E +0100 +FFFF +1918 +F10F +ENDCHAR +STARTCHAR U+863E +ENCODING 34366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0818 +11FF +1000 +11FF +7D29 +11FF +10D6 +1010 +10D6 +7CCA +0144 +0263 +0000 +0000 +ENDCHAR +STARTCHAR U+863F +ENCODING 34367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0440 +3FF8 +2448 +3FF8 +1490 +74FC +1B90 +7EF8 +2CF8 +2A90 +48FC +0880 +0000 +ENDCHAR +STARTCHAR U+8640 +ENCODING 34368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0910 +FFFF +0440 +7ABE +2924 +D933 +0240 +7E7C +0240 +3E7C +0240 +3E7C +0240 +FFFF +ENDCHAR +STARTCHAR U+8641 +ENCODING 34369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +FFFF +1100 +13DE +5E52 +53DE +5E51 +F3CF +0C30 +0400 +1FF8 +F460 +03C0 +FC3F +ENDCHAR +STARTCHAR U+8642 +ENCODING 34370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +7FFE +0100 +FFFF +8101 +BD7D +0120 +7C7C +45C4 +7C38 +11C7 +5CFE +5082 +FCFE +ENDCHAR +STARTCHAR U+8643 +ENCODING 34371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +0808 +2126 +12D5 +07FF +4144 +3774 +1144 +0775 +1146 +6775 +214B +27F9 +0000 +0000 +ENDCHAR +STARTCHAR U+8646 +ENCODING 34374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +0FF0 +0910 +0FF0 +0910 +7FFE +542A +7D3E +566A +7CBE +0502 +FFFD +0910 +710E +ENDCHAR +STARTCHAR U+8647 +ENCODING 34375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +088C +7BFF +0884 +09CE +794A +41CE +79FF +0B10 +09FE +09FE +1110 +61FF +0000 +0000 +ENDCHAR +STARTCHAR U+8648 +ENCODING 34376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +07F0 +790F +4BE9 +4A29 +7BEF +0220 +7BEF +4A29 +4BE9 +794F +0220 +0000 +0000 +ENDCHAR +STARTCHAR U+864B +ENCODING 34379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7FFF +13F4 +1EDC +1FDC +1254 +7FFF +5FFD +0FF8 +0E78 +09C8 +0FF8 +13E4 +2122 +0000 +0000 +ENDCHAR +STARTCHAR U+864C +ENCODING 34380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +1D28 +3FBE +2EC8 +35B6 +1FFC +1224 +1E3C +3E3E +2222 +3E3F +3E3F +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+864D +ENCODING 34381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F8 +0100 +1FFC +1108 +1110 +111C +11E0 +1F00 +1100 +1100 +2104 +2104 +40FC +0000 +ENDCHAR +STARTCHAR U+864E +ENCODING 34382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F8 +0100 +1FFC +1108 +11F0 +1F08 +10F8 +1240 +1240 +2240 +2444 +4844 +103C +0000 +ENDCHAR +STARTCHAR U+864F +ENCODING 34383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +01F8 +0100 +3FFE +2102 +21F4 +2F00 +2108 +20F8 +2100 +2FF8 +2108 +4108 +4108 +8228 +1C10 +ENDCHAR +STARTCHAR U+8650 +ENCODING 34384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F8 +0100 +1FFC +12E8 +1F10 +11F0 +1000 +17F8 +1400 +27F8 +2400 +47F8 +0400 +0000 +ENDCHAR +STARTCHAR U+8651 +ENCODING 34385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +01F8 +0100 +3FFE +2102 +21F4 +2F00 +2108 +20F8 +2000 +2080 +2A48 +4A46 +5212 +81F0 +0000 +ENDCHAR +STARTCHAR U+8652 +ENCODING 34386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001E +7FF0 +4080 +40FC +4080 +5FFF +5101 +51FA +5702 +50FE +5000 +5120 +5120 +5121 +D333 +2E1E +ENDCHAR +STARTCHAR U+8653 +ENCODING 34387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +201E +2010 +FCFF +2481 +2490 +249E +24F0 +2491 +248F +2480 +24A4 +27A4 +6CA5 +4125 +C043 +ENDCHAR +STARTCHAR U+8654 +ENCODING 34388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F8 +0100 +1FFC +11E8 +1F08 +10F8 +1080 +1FFC +1220 +1140 +2080 +2360 +5C1C +0000 +ENDCHAR +STARTCHAR U+8655 +ENCODING 34389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F8 +0100 +1FFC +12E8 +1F10 +11F0 +1400 +1770 +1554 +1D54 +22CC +2580 +587C +0000 +ENDCHAR +STARTCHAR U+8656 +ENCODING 34390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FE +0080 +3FFF +2101 +21FA +2F02 +20FE +2000 +207C +27C8 +2250 +7FFF +4040 +C040 +01C0 +ENDCHAR +STARTCHAR U+8657 +ENCODING 34391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FE +0080 +3FFF +2101 +21FA +2F02 +20FE +2000 +2070 +2780 +2400 +67FE +4410 +C410 +1FFF +ENDCHAR +STARTCHAR U+8658 +ENCODING 34392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FE +0080 +3FFF +2101 +21FA +2F02 +20FE +2000 +27FC +2404 +27FC +6404 +47FC +C404 +1FFF +ENDCHAR +STARTCHAR U+8659 +ENCODING 34393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FE +0080 +3FFF +2101 +21FA +2F00 +2102 +20FE +2040 +2160 +2526 +6D13 +5965 +C3CC +1E78 +ENDCHAR +STARTCHAR U+865A +ENCODING 34394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F8 +0100 +1FFC +11E8 +1F08 +11F8 +1140 +1948 +1548 +2550 +2140 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+865B +ENCODING 34395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FC +0080 +3FFF +2102 +21FC +3F02 +21FE +2000 +2924 +2924 +2924 +2F3C +2120 +5FFF +4000 +ENDCHAR +STARTCHAR U+865C +ENCODING 34396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F0 +1FFC +1728 +11E0 +17F0 +1490 +17F0 +1490 +17F0 +2FF8 +2088 +4308 +0C30 +0000 +ENDCHAR +STARTCHAR U+865D +ENCODING 34397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1E40 +107F +7F55 +4155 +48D5 +4E95 +78B5 +492D +4769 +405B +5212 +5202 +520F +9301 +21FF +ENDCHAR +STARTCHAR U+865E +ENCODING 34398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01F0 +1FFC +11E8 +1F08 +10F8 +15F0 +1510 +15F0 +17E0 +2020 +3FFC +4630 +180C +0000 +ENDCHAR +STARTCHAR U+865F +ENCODING 34399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C78 +2440 +25FC +3D48 +0170 +7FC4 +113C +1D50 +2550 +0550 +0A54 +0A94 +350C +0000 +ENDCHAR +STARTCHAR U+8660 +ENCODING 34400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +101E +1010 +FFFF +2481 +6690 +C39E +24F0 +2491 +188F +0880 +18A4 +34A4 +26A5 +6325 +C043 +ENDCHAR +STARTCHAR U+8661 +ENCODING 34401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FE +0080 +3FFF +2101 +21FA +2F02 +20FE +2110 +2912 +2912 +2F1E +6110 +5FFF +C208 +0C06 +ENDCHAR +STARTCHAR U+8662 +ENCODING 34402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0424 +0E3E +F020 +03FE +9322 +55F8 +0124 +093C +FF00 +0978 +4948 +2948 +0948 +0A4A +2C8A +1106 +ENDCHAR +STARTCHAR U+8663 +ENCODING 34403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +751E +0510 +04FF +FF81 +0490 +149E +54F0 +5C91 +548F +5480 +54A4 +54A4 +7DA5 +C525 +0243 +ENDCHAR +STARTCHAR U+8664 +ENCODING 34404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0E1E +0810 +7FFF +4081 +4890 +4E9E +78F0 +4891 +478F +4080 +52A4 +52A4 +53A5 +90A5 +2143 +ENDCHAR +STARTCHAR U+8665 +ENCODING 34405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0821 +0EFF +0820 +7F14 +4909 +4975 +7E03 +4800 +4E42 +40FF +5422 +1515 +1509 +6777 +0000 +0000 +ENDCHAR +STARTCHAR U+8667 +ENCODING 34407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0F78 +3FA0 +2F20 +3920 +27FC +2A40 +2FC0 +3A78 +2F48 +2F08 +2A08 +4F88 +0830 +0000 +ENDCHAR +STARTCHAR U+8668 +ENCODING 34408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0700 +0401 +7FE1 +2422 +2FA4 +2419 +2701 +2482 +2FC4 +2499 +2D81 +36C2 +4484 +0498 +0000 +0000 +ENDCHAR +STARTCHAR U+8669 +ENCODING 34409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2A1E +6B10 +C9FF +0841 +7F50 +415E +7F70 +4151 +7F4F +0840 +2A54 +2A54 +6B55 +C995 +3863 +ENDCHAR +STARTCHAR U+866A +ENCODING 34410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +1C9F +112A +7F04 +554A +795F +515D +5957 +415F +6944 +295F +2904 +2D1F +4915 +0000 +0000 +ENDCHAR +STARTCHAR U+866B +ENCODING 34411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +1FF0 +1110 +1110 +1110 +1FF0 +1110 +0120 +0110 +01F8 +7E04 +0004 +0000 +ENDCHAR +STARTCHAR U+866C +ENCODING 34412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0840 +0940 +7FC0 +4940 +4940 +4940 +4940 +7F40 +4840 +0940 +0F42 +F142 +403E +0000 +ENDCHAR +STARTCHAR U+866D +ENCODING 34413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F11 +4911 +4911 +4911 +7F11 +4911 +0811 +0821 +0A41 +7F11 +010A +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+866E +ENCODING 34414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1010 +10F8 +1490 +7E90 +5490 +5490 +5490 +5490 +7C90 +5090 +1490 +1D12 +E512 +420E +0400 +ENDCHAR +STARTCHAR U+866F +ENCODING 34415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1044 +1044 +FE44 +9244 +9244 +9244 +9244 +FE44 +1047 +107C +15C4 +1404 +1E04 +7204 +C004 +ENDCHAR +STARTCHAR U+8670 +ENCODING 34416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0802 +7F7F +4908 +4908 +4908 +7F08 +4908 +0808 +0808 +0908 +7F08 +0128 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+8671 +ENCODING 34417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FE0 +00A0 +0320 +3C20 +0420 +3FA0 +24A0 +24A0 +3FA0 +2514 +0494 +074C +7844 +0000 +ENDCHAR +STARTCHAR U+8673 +ENCODING 34419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +083F +7F21 +4941 +4901 +4921 +7F11 +4909 +0801 +0A01 +7F11 +010A +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+8674 +ENCODING 34420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +087F +0810 +7F10 +4910 +4910 +497F +7F10 +0810 +0810 +0A11 +7F11 +0111 +001F +0000 +0000 +ENDCHAR +STARTCHAR U+8675 +ENCODING 34421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +FE96 +929A +92B2 +92D2 +9392 +FE92 +1092 +1096 +1490 +1480 +1E81 +72C3 +C07E +ENDCHAR +STARTCHAR U+8676 +ENCODING 34422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1010 +FE10 +9210 +9210 +93FF +9210 +FE10 +1010 +1010 +1410 +1410 +1E10 +7210 +C070 +ENDCHAR +STARTCHAR U+8677 +ENCODING 34423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1010 +FE10 +9210 +9210 +9210 +93FF +FE10 +1010 +1010 +1410 +1410 +1E10 +7210 +C010 +ENDCHAR +STARTCHAR U+8679 +ENCODING 34425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +09FC +3E20 +2A20 +2A20 +2A20 +2A20 +3E20 +2C20 +0A20 +0F20 +19FC +6000 +0000 +ENDCHAR +STARTCHAR U+867A +ENCODING 34426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0220 +FF20 +2424 +25FE +2524 +2524 +2524 +25FC +2420 +2424 +243C +25C6 +4402 +43FE +8000 +ENDCHAR +STARTCHAR U+867B +ENCODING 34427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +3E20 +2BFC +2A80 +2A80 +3E80 +2880 +0C80 +0A80 +0F80 +7180 +0078 +0000 +ENDCHAR +STARTCHAR U+867C +ENCODING 34428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1088 +15FC +7E00 +5400 +55F8 +5408 +5410 +7C20 +5040 +1480 +1D02 +E502 +40FE +0000 +ENDCHAR +STARTCHAR U+867D +ENCODING 34429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1010 +1FF0 +0100 +0108 +3FFC +2108 +2108 +3FF8 +0100 +0110 +01FC +7F04 +0000 +ENDCHAR +STARTCHAR U+867E +ENCODING 34430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +13FE +1420 +7E20 +5420 +5430 +5428 +5424 +7C24 +5020 +1420 +1E20 +F220 +4020 +0020 +ENDCHAR +STARTCHAR U+867F +ENCODING 34431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0400 +0410 +07F8 +0810 +3150 +C128 +3FFC +2108 +2108 +3FF8 +0100 +0108 +7FFC +0004 +ENDCHAR +STARTCHAR U+8680 +ENCODING 34432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2024 +3DFE +2524 +4924 +4124 +A124 +2124 +21FC +2124 +2420 +2824 +303E +23C2 +0100 +ENDCHAR +STARTCHAR U+8681 +ENCODING 34433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1080 +1064 +1224 +7E04 +5508 +5508 +5510 +5490 +7CA0 +1040 +14A0 +1C90 +F508 +420E +0C04 +ENDCHAR +STARTCHAR U+8682 +ENCODING 34434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +13F8 +1010 +7D10 +5510 +5510 +5510 +5510 +55FC +7C04 +1024 +17F4 +1C04 +E404 +4014 +0008 +ENDCHAR +STARTCHAR U+8685 +ENCODING 34437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1007 +10F8 +1080 +7CBE +54A2 +54A2 +54A2 +7CAA +10A4 +10A0 +14A0 +7D21 +0621 +003F +0000 +0000 +ENDCHAR +STARTCHAR U+8686 +ENCODING 34438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +0849 +7F49 +4949 +4949 +497F +7F40 +0840 +0840 +0941 +7F41 +0141 +003F +0000 +0000 +ENDCHAR +STARTCHAR U+8687 +ENCODING 34439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +7C82 +5482 +54FE +5480 +7C80 +10A0 +1090 +1488 +1504 +7E02 +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+8688 +ENCODING 34440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23EF +2084 +FC84 +A484 +A484 +A4E4 +A79F +FC84 +2084 +2084 +2884 +2884 +7D84 +C504 +0204 +ENDCHAR +STARTCHAR U+868A +ENCODING 34442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +3FFC +2A88 +2A88 +2A88 +3E50 +2A50 +0C20 +0A20 +0F50 +7088 +0104 +0000 +ENDCHAR +STARTCHAR U+868B +ENCODING 34443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0860 +0820 +0820 +3EF8 +2AA8 +2AA8 +2AA8 +3ED8 +2AD8 +0C88 +0A88 +0F88 +7088 +0098 +0000 +ENDCHAR +STARTCHAR U+868C +ENCODING 34444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +3FFC +2A20 +2A20 +2AF8 +3E20 +2A20 +0DFC +0A20 +0F20 +7020 +0020 +0000 +ENDCHAR +STARTCHAR U+868D +ENCODING 34445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1120 +1120 +1520 +7F24 +55EC +5530 +5520 +5520 +7D20 +5120 +1520 +1D62 +E5A2 +411E +0000 +ENDCHAR +STARTCHAR U+868E +ENCODING 34446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F41 +4941 +4941 +4941 +497F +7F41 +4941 +0841 +0941 +7F41 +017F +0041 +0000 +0000 +ENDCHAR +STARTCHAR U+8690 +ENCODING 34448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +107F +7C81 +5501 +5479 +5401 +7C01 +107D +1001 +1401 +7C01 +0412 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+8691 +ENCODING 34449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +2020 +FFFF +A420 +A420 +A5FC +A484 +FC8C +20D8 +2070 +2820 +2870 +7CD8 +C58C +0307 +ENDCHAR +STARTCHAR U+8693 +ENCODING 34451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +11E8 +1028 +7C28 +55E8 +5508 +5508 +7DE8 +5528 +1828 +1428 +1E28 +6228 +01C8 +0000 +ENDCHAR +STARTCHAR U+8694 +ENCODING 34452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +11FE +1084 +7C84 +5484 +54FF +5484 +7C84 +1084 +1084 +1495 +7CA5 +04C3 +0181 +0000 +0000 +ENDCHAR +STARTCHAR U+8695 +ENCODING 34453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +1FF0 +0280 +0540 +1930 +6FEC +0920 +0920 +0FE0 +0920 +01F0 +3E08 +0000 +ENDCHAR +STARTCHAR U+8696 +ENCODING 34454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +20FE +2000 +FC00 +A400 +A400 +A5FF +A448 +FC48 +2048 +2048 +2848 +28C8 +7C89 +C589 +0307 +ENDCHAR +STARTCHAR U+8697 +ENCODING 34455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +7CFE +5412 +5412 +5412 +7DFF +1010 +1010 +1428 +7C44 +0482 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+8698 +ENCODING 34456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2024 +2026 +2022 +FC20 +A5FF +A420 +A420 +A420 +FC70 +2050 +2050 +2850 +28D0 +7C91 +C593 +030E +ENDCHAR +STARTCHAR U+8699 +ENCODING 34457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +7C82 +5579 +5400 +5400 +7DFE +1002 +1004 +1408 +7C10 +0420 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+869A +ENCODING 34458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +201C +20F0 +FC80 +A480 +A4FF +A484 +A484 +FC84 +2084 +2084 +2884 +2984 +7D04 +C504 +0004 +ENDCHAR +STARTCHAR U+869C +ENCODING 34460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1408 +7E88 +5488 +5508 +5508 +57FE +7C28 +1028 +1448 +1C48 +F488 +4108 +0228 +0010 +ENDCHAR +STARTCHAR U+869D +ENCODING 34461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +13E0 +1440 +7E48 +547C +57C0 +5440 +5444 +7C7E +53C0 +1440 +1C40 +E442 +4042 +003E +ENDCHAR +STARTCHAR U+869E +ENCODING 34462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +080A +7F7F +4908 +4908 +4908 +7F1C +082A +0849 +0A08 +7F08 +0108 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+86A1 +ENCODING 34465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +2048 +2048 +FCCC +A484 +A586 +A703 +A4FC +FC24 +2024 +2064 +2844 +2844 +7CCC +C588 +0338 +ENDCHAR +STARTCHAR U+86A2 +ENCODING 34466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0808 +08FF +0800 +7F3C +4924 +4924 +7F24 +0824 +0824 +0A24 +7F25 +0125 +0047 +0000 +0000 +ENDCHAR +STARTCHAR U+86A3 +ENCODING 34467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +0810 +0850 +3E50 +2A88 +2A88 +2B24 +3E20 +2A20 +0C30 +0A48 +0F58 +71E4 +0004 +0000 +ENDCHAR +STARTCHAR U+86A4 +ENCODING 34468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0490 +1260 +0980 +07C0 +1930 +6FEC +0920 +0920 +0FE0 +0110 +01F8 +7E04 +0000 +ENDCHAR +STARTCHAR U+86A5 +ENCODING 34469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0814 +0822 +0841 +7F00 +4922 +4922 +4922 +7F22 +0814 +0808 +0A14 +7F22 +0141 +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+86A6 +ENCODING 34470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +20FC +2084 +FC84 +A484 +A7FF +A484 +A484 +A484 +FFFF +2084 +2884 +2884 +7C84 +C484 +009C +ENDCHAR +STARTCHAR U+86A7 +ENCODING 34471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1050 +1450 +7E88 +550E +5604 +5488 +5488 +7C88 +5088 +1488 +1C88 +E488 +4108 +0208 +ENDCHAR +STARTCHAR U+86A8 +ENCODING 34472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1428 +7DFC +5420 +5420 +5424 +57FE +7C20 +5050 +1450 +1C88 +E488 +4106 +0604 +ENDCHAR +STARTCHAR U+86A9 +ENCODING 34473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1FF0 +0200 +7FFC +0100 +1FF0 +1110 +1110 +1FF0 +1110 +01F8 +7E04 +0000 +ENDCHAR +STARTCHAR U+86AA +ENCODING 34474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0848 +0828 +3E28 +2A88 +2A48 +2A48 +3E0C +2A38 +0CC8 +0A08 +0F08 +7108 +0008 +0000 +ENDCHAR +STARTCHAR U+86AB +ENCODING 34475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +0840 +3EF8 +2A88 +2BE8 +2AA8 +3EA8 +2AE8 +0CB0 +0A80 +0E84 +7084 +007C +0000 +ENDCHAR +STARTCHAR U+86AC +ENCODING 34476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1528 +7F28 +5528 +5528 +5548 +5548 +7D48 +51A8 +14A0 +1CA0 +E522 +4222 +0C1E +ENDCHAR +STARTCHAR U+86AD +ENCODING 34477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +20FE +2082 +FC82 +A482 +A4FE +A480 +A4A0 +FCA6 +20AC +20B8 +28A0 +29A0 +7D21 +C733 +001E +ENDCHAR +STARTCHAR U+86AF +ENCODING 34479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +08E0 +3E80 +2A80 +2AFC +2A90 +3E90 +2A90 +0C90 +0A90 +0E90 +71FC +0000 +0000 +ENDCHAR +STARTCHAR U+86B0 +ENCODING 34480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +3EF8 +2AA8 +2AA8 +2AA8 +3EF8 +2AA8 +0CA8 +0AA8 +0FA8 +70F8 +0088 +0000 +ENDCHAR +STARTCHAR U+86B1 +ENCODING 34481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10C0 +1084 +14FE +7F40 +5540 +5648 +547C +5440 +7C40 +5044 +147E +1C40 +E440 +4040 +0040 +ENDCHAR +STARTCHAR U+86B3 +ENCODING 34483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2002 +200E +20F8 +FC88 +A488 +A488 +A4FF +A488 +FC88 +2088 +2088 +28EC +2984 +7C05 +C5F7 +0002 +ENDCHAR +STARTCHAR U+86B4 +ENCODING 34484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +1494 +7EBE +5514 +5554 +57D4 +5494 +7C94 +5154 +17F4 +1C24 +E444 +4094 +0108 +ENDCHAR +STARTCHAR U+86B5 +ENCODING 34485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +17FE +1408 +7E08 +55E8 +5528 +5528 +5528 +7D28 +51E8 +1528 +1C08 +E408 +4028 +0010 +ENDCHAR +STARTCHAR U+86B6 +ENCODING 34486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0888 +0888 +3FFC +2A88 +2A88 +2A88 +3EF8 +2A88 +0C88 +0A88 +0F88 +70F8 +0088 +0000 +ENDCHAR +STARTCHAR U+86B7 +ENCODING 34487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FF +1080 +FE80 +9280 +92FE +9282 +9282 +FE82 +10FE +1080 +1480 +1480 +1E80 +72FF +C000 +ENDCHAR +STARTCHAR U+86B8 +ENCODING 34488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +201C +20F0 +FC80 +A480 +A4FF +A488 +A488 +A4B8 +FC8E +208B +2888 +2988 +7D08 +C508 +0008 +ENDCHAR +STARTCHAR U+86B9 +ENCODING 34489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +2084 +2084 +F984 +A97F +A904 +AB04 +AD24 +A934 +F914 +2104 +2904 +2904 +7904 +C904 +011C +ENDCHAR +STARTCHAR U+86BA +ENCODING 34490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +15FE +7F24 +5524 +5524 +55FC +5524 +7D24 +5124 +17FE +1D04 +E504 +4114 +0108 +ENDCHAR +STARTCHAR U+86BB +ENCODING 34491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7F40 +0840 +1C40 +6B41 +0841 +083F +0080 +1FFC +1084 +1FFC +0082 +3FFE +0002 +0000 +0000 +ENDCHAR +STARTCHAR U+86BC +ENCODING 34492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +107F +7C81 +5501 +5479 +5449 +5449 +7C49 +1079 +1049 +1401 +7C01 +0406 +0000 +0000 +ENDCHAR +STARTCHAR U+86BD +ENCODING 34493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1004 +1008 +7C10 +5420 +5450 +5494 +5514 +7C12 +1011 +1010 +1410 +7DFF +0400 +0000 +0000 +ENDCHAR +STARTCHAR U+86BE +ENCODING 34494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1008 +10FF +7C89 +548A +5488 +54BE +54A2 +7CA2 +1094 +1088 +1494 +7D22 +0441 +0000 +0000 +ENDCHAR +STARTCHAR U+86BF +ENCODING 34495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +FEFF +9210 +9230 +9220 +9264 +FECC +1068 +1038 +1410 +1432 +1E62 +724F +C1F9 +ENDCHAR +STARTCHAR U+86C0 +ENCODING 34496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1024 +15FE +7E20 +5420 +5420 +5428 +55FC +7C20 +5420 +1020 +1420 +FC24 +47FE +0000 +ENDCHAR +STARTCHAR U+86C1 +ENCODING 34497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2042 +FC42 +A4C2 +A486 +A584 +A51C +FC00 +21FE +2102 +2902 +2902 +7D02 +C502 +01FE +ENDCHAR +STARTCHAR U+86C2 +ENCODING 34498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1022 +1021 +11FF +7C20 +5420 +5422 +5442 +5482 +7D02 +1044 +1028 +1410 +7C28 +04C6 +0000 +0000 +ENDCHAR +STARTCHAR U+86C3 +ENCODING 34499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2020 +FC20 +A5FE +A522 +A522 +A572 +FD52 +215A +218A +2902 +2902 +7D02 +C502 +010E +ENDCHAR +STARTCHAR U+86C4 +ENCODING 34500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +3FFC +2A20 +2A20 +2A20 +3EF8 +2A88 +0C88 +0A88 +0F88 +70F8 +0088 +0000 +ENDCHAR +STARTCHAR U+86C5 +ENCODING 34501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +FE10 +921F +9210 +9210 +9210 +FE10 +10FE +1082 +1482 +1482 +1E82 +7282 +C0FE +ENDCHAR +STARTCHAR U+86C6 +ENCODING 34502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +3E88 +2A88 +2AF8 +2A88 +3E88 +2AF8 +0C88 +0A88 +0F88 +71FC +0000 +0000 +ENDCHAR +STARTCHAR U+86C7 +ENCODING 34503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +3EFC +2A88 +2B40 +2A48 +3E48 +2A50 +0C60 +0A40 +0F44 +7144 +003C +0000 +ENDCHAR +STARTCHAR U+86C8 +ENCODING 34504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +10FE +7C90 +5510 +5410 +5410 +55FF +7C10 +5410 +1028 +1444 +7C82 +0501 +0000 +0000 +ENDCHAR +STARTCHAR U+86C9 +ENCODING 34505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0850 +3E50 +2A88 +2B74 +2A00 +3EFC +2A24 +0C24 +0A24 +0F38 +7020 +0020 +0000 +ENDCHAR +STARTCHAR U+86CA +ENCODING 34506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0110 +1FF8 +1110 +1110 +1FF0 +1100 +0108 +3FFC +0004 +3FF8 +2448 +2448 +2448 +FFFE +0000 +ENDCHAR +STARTCHAR U+86CB +ENCODING 34507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0910 +09F0 +1D00 +23FC +4100 +0FE0 +0920 +0920 +0FE0 +0920 +01F0 +3E08 +0000 +ENDCHAR +STARTCHAR U+86CC +ENCODING 34508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +11FC +1080 +7C84 +54A4 +54A4 +54A4 +54A4 +7CA4 +10AC +10AC +14B4 +7CA2 +0501 +0000 +0000 +ENDCHAR +STARTCHAR U+86CD +ENCODING 34509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0910 +0920 +3FFC +2108 +4100 +0FE0 +0920 +0920 +0FE0 +0920 +0110 +01F8 +3E08 +0000 +ENDCHAR +STARTCHAR U+86CE +ENCODING 34510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08FC +0880 +3E80 +2AFC +2AA0 +2AA0 +3EBC +2AA4 +0CA4 +0B44 +0F44 +7284 +0118 +0000 +ENDCHAR +STARTCHAR U+86CF +ENCODING 34511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1104 +1488 +7E50 +5420 +5450 +548E +5724 +7C20 +51FC +1420 +1C20 +E424 +43FE +0000 +ENDCHAR +STARTCHAR U+86D0 +ENCODING 34512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +1050 +1050 +1454 +7FFE +5554 +5554 +5554 +5554 +7DFC +5154 +1554 +1D54 +E554 +41FC +0104 +ENDCHAR +STARTCHAR U+86D1 +ENCODING 34513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1040 +1488 +7FFC +5420 +54A8 +54FC +5520 +7C24 +53FE +1420 +1C20 +E420 +4020 +0020 +ENDCHAR +STARTCHAR U+86D2 +ENCODING 34514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +20FC +FD8C +A758 +A430 +A460 +A4D8 +FF8F +2000 +21FC +2904 +2904 +7D04 +C504 +01FC +ENDCHAR +STARTCHAR U+86D3 +ENCODING 34515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0414 +3F92 +0410 +0410 +7FFF +0410 +3F90 +2492 +2494 +3F88 +0415 +04A3 +7FC1 +0000 +0000 +ENDCHAR +STARTCHAR U+86D4 +ENCODING 34516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +3F08 +2BE8 +2BA8 +2BA8 +3FA8 +29E8 +0DA8 +0B08 +0F08 +71F8 +0108 +0000 +ENDCHAR +STARTCHAR U+86D5 +ENCODING 34517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +23FF +FC40 +A440 +A4FE +A482 +A582 +FEFE +2082 +2082 +28FE +2882 +7C82 +C482 +008E +ENDCHAR +STARTCHAR U+86D6 +ENCODING 34518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10A1 +1082 +7DE4 +5488 +5481 +54A2 +7CA4 +10A1 +10A2 +10A4 +14A9 +7D21 +043F +0000 +0000 +ENDCHAR +STARTCHAR U+86D7 +ENCODING 34519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0100 +3FFC +2004 +3FFC +2000 +3FFC +2004 +3FFC +0100 +3FFC +2104 +3FFC +0104 +01FE +FF03 +ENDCHAR +STARTCHAR U+86D8 +ENCODING 34520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +108C +1050 +1004 +7DFE +5420 +5420 +55FC +5420 +7C24 +53FE +1420 +1C20 +E420 +4020 +0020 +ENDCHAR +STARTCHAR U+86D9 +ENCODING 34521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0820 +3EF8 +2A20 +2A20 +2BFC +3E20 +2A20 +0CF8 +0A20 +0E20 +73FC +0000 +0000 +ENDCHAR +STARTCHAR U+86DA +ENCODING 34522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +23F1 +2081 +FC89 +A489 +A5E9 +A529 +A529 +FFA9 +20E9 +2021 +2821 +2861 +7C41 +C4C1 +0187 +ENDCHAR +STARTCHAR U+86DB +ENCODING 34523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A0 +08A0 +3EF8 +2AA0 +2B20 +2BFC +3E70 +2A70 +0CA8 +0AA8 +0F24 +7220 +0060 +0000 +ENDCHAR +STARTCHAR U+86DC +ENCODING 34524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +20FE +2092 +F992 +A912 +A9FF +AB12 +AD12 +A912 +F97E +2110 +2910 +2930 +7920 +C960 +0140 +ENDCHAR +STARTCHAR U+86DD +ENCODING 34525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +0841 +0841 +7F7F +4941 +4941 +497F +7F40 +4941 +0852 +084C +0A54 +7F62 +0141 +0000 +0000 +ENDCHAR +STARTCHAR U+86DE +ENCODING 34526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +08E0 +3E20 +2A20 +2BFC +2A20 +3E20 +2AF8 +0C88 +0A88 +0F88 +70F8 +0088 +0000 +ENDCHAR +STARTCHAR U+86DF +ENCODING 34527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +3E50 +2A48 +2A94 +2B54 +3E50 +2A60 +0C20 +0A20 +0F50 +7088 +0304 +0000 +ENDCHAR +STARTCHAR U+86E0 +ENCODING 34528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +23FC +F844 +A8C4 +A98C +AB18 +A800 +A908 +FFFF +2149 +2949 +2949 +7B59 +CA53 +06F6 +ENDCHAR +STARTCHAR U+86E2 +ENCODING 34530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +1028 +7CFE +5444 +5444 +5444 +7DFF +1044 +1044 +1044 +1444 +7C84 +0104 +0000 +0000 +ENDCHAR +STARTCHAR U+86E3 +ENCODING 34531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +FFFF +9210 +9210 +9210 +92FE +FE00 +1000 +10FE +1482 +1482 +1E82 +7282 +C0FE +ENDCHAR +STARTCHAR U+86E4 +ENCODING 34532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0850 +3E50 +2A88 +2BFC +2A00 +3E00 +2AF8 +0C88 +0A88 +0F88 +70F8 +0088 +0000 +ENDCHAR +STARTCHAR U+86E5 +ENCODING 34533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103E +1062 +FEC6 +93AC +9218 +9230 +92E8 +FE1F +1031 +1063 +15DA +1406 +1E0C +7238 +C1E0 +ENDCHAR +STARTCHAR U+86E6 +ENCODING 34534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +1010 +7CFE +5412 +55FE +5510 +7DFF +1011 +1011 +142A +7C44 +0583 +0000 +0000 +ENDCHAR +STARTCHAR U+86E7 +ENCODING 34535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2201 +FBFD +AA25 +AAA5 +AAA5 +AAB5 +FA49 +2269 +2295 +2A93 +2B21 +7A01 +CA01 +0203 +ENDCHAR +STARTCHAR U+86E8 +ENCODING 34536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +0808 +7F10 +4920 +497F +4941 +7F41 +087F +0841 +0841 +0841 +097F +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+86E9 +ENCODING 34537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7DF0 +1110 +1190 +1154 +1E54 +640C +0100 +1FF0 +1110 +1FF0 +1110 +01F8 +7E04 +0000 +ENDCHAR +STARTCHAR U+86EA +ENCODING 34538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +3FBF +0409 +3F89 +0409 +3F91 +0425 +0842 +0080 +1FFC +1084 +1FFC +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+86EB +ENCODING 34539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FC +1104 +7C08 +54FF +5480 +54FE +54A2 +7CA2 +10A4 +10A0 +14A1 +1521 +7E3F +0000 +0000 +ENDCHAR +STARTCHAR U+86EC +ENCODING 34540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +3FF8 +0440 +7FFC +0540 +1930 +6FEC +0920 +0920 +0FE0 +0920 +01F0 +3E08 +0000 +ENDCHAR +STARTCHAR U+86ED +ENCODING 34541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0840 +3E50 +2A88 +2BFC +2A24 +3E20 +2AF8 +0C20 +0A20 +0E20 +73FC +0000 +0000 +ENDCHAR +STARTCHAR U+86EE +ENCODING 34542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +1250 +1248 +2444 +49C4 +0FE0 +0920 +0920 +0FE0 +0920 +01F0 +3E08 +0000 +ENDCHAR +STARTCHAR U+86EF +ENCODING 34543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +08FC +3E24 +2A28 +2BFC +2A10 +3E60 +2A4C +0CF0 +0B40 +0E44 +7044 +003C +0000 +ENDCHAR +STARTCHAR U+86F0 +ENCODING 34544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +FFFC +0848 +0EC8 +7848 +086A +298A +1106 +1FF0 +1110 +1110 +1FF0 +0104 +7FFC +0004 +ENDCHAR +STARTCHAR U+86F1 +ENCODING 34545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1028 +15FC +7E20 +5524 +54AC +54B0 +5424 +7FFE +5050 +1450 +1C90 +E488 +4106 +0204 +ENDCHAR +STARTCHAR U+86F2 +ENCODING 34546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +105C +15E0 +7E50 +5422 +54D2 +570E +5400 +7DFC +5090 +1490 +1C92 +E492 +410E +0200 +ENDCHAR +STARTCHAR U+86F3 +ENCODING 34547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2084 +22BE +2A88 +FE88 +AABE +AAAA +AAAA +AAAA +FAAA +A2AA +2AAA +38AE +C908 +0108 +0208 +ENDCHAR +STARTCHAR U+86F4 +ENCODING 34548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1024 +15FE +7E88 +5450 +5420 +54D8 +5706 +7C88 +5088 +1488 +1C88 +E488 +4108 +0208 +ENDCHAR +STARTCHAR U+86F5 +ENCODING 34549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1000 +1049 +7C92 +5524 +5492 +5449 +7C00 +11FF +1010 +1010 +1410 +7C10 +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+86F6 +ENCODING 34550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +11FC +1121 +7C92 +5454 +5404 +55FF +5484 +7C44 +1024 +1004 +1404 +7C14 +0408 +0000 +0000 +ENDCHAR +STARTCHAR U+86F7 +ENCODING 34551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0012 +1011 +11FF +7C10 +5410 +5492 +5454 +7C38 +1054 +1092 +1511 +7C10 +0450 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+86F8 +ENCODING 34552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0924 +08A4 +3EA8 +2A20 +2AF8 +2A88 +3EF8 +2888 +0CF8 +0A88 +0F88 +7088 +0098 +0000 +ENDCHAR +STARTCHAR U+86F9 +ENCODING 34553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0850 +3E20 +2AF8 +2AA8 +2AA8 +3EF8 +2AA8 +0CF8 +0AA8 +0FA8 +70A8 +0098 +0000 +ENDCHAR +STARTCHAR U+86FA +ENCODING 34554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +21FF +FC10 +A492 +A492 +A492 +A555 +FD55 +2038 +2028 +2828 +286C +7C44 +C4C6 +0183 +ENDCHAR +STARTCHAR U+86FB +ENCODING 34555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +0810 +0850 +3E48 +2A88 +2BFC +2A88 +3E88 +2AF8 +0C50 +0A50 +0E94 +7114 +020C +0000 +ENDCHAR +STARTCHAR U+86FC +ENCODING 34556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +FC20 +A5FE +A522 +A522 +A5FE +FD22 +2122 +21FE +2820 +2BFF +7C20 +C420 +0020 +ENDCHAR +STARTCHAR U+86FD +ENCODING 34557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +FE82 +9282 +92FE +9282 +9282 +FE82 +10FE +1082 +1482 +1482 +1EFE +7244 +C183 +ENDCHAR +STARTCHAR U+86FE +ENCODING 34558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1060 +10B0 +13A8 +7CA8 +54A0 +57FC +54A0 +7CA8 +50E8 +1BB0 +1490 +1EB4 +60CC +0184 +0000 +ENDCHAR +STARTCHAR U+8700 +ENCODING 34560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0800 +0FF8 +1208 +3FC8 +5248 +1FC8 +1248 +03E8 +7C28 +0070 +0000 +ENDCHAR +STARTCHAR U+8701 +ENCODING 34561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10FF +7D00 +5400 +54FF +5411 +7C12 +1010 +109E +1490 +1490 +7D50 +063F +0000 +0000 +ENDCHAR +STARTCHAR U+8702 +ENCODING 34562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0878 +08D0 +3F20 +2A70 +2BAC +2AF8 +3E20 +28F8 +0C20 +0BFC +0E20 +7020 +0020 +0000 +ENDCHAR +STARTCHAR U+8703 +ENCODING 34563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +17F0 +1000 +1FFC +1490 +2760 +791C +0FE0 +0920 +0FE0 +0920 +01F0 +3E08 +0000 +ENDCHAR +STARTCHAR U+8704 +ENCODING 34564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FF +2100 +FD00 +A57E +A500 +A500 +A5FF +FD48 +2149 +214B +294A +2B4C +7E44 +C476 +00C3 +ENDCHAR +STARTCHAR U+8705 +ENCODING 34565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2024 +2022 +23FF +FC20 +A420 +A5FE +A522 +A522 +FDFE +2122 +2122 +29FE +2922 +7D22 +C522 +0126 +ENDCHAR +STARTCHAR U+8706 +ENCODING 34566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +3E88 +2AF8 +2A88 +2AF8 +3E88 +2AF8 +0CE8 +0A60 +0EA4 +7124 +021C +0000 +ENDCHAR +STARTCHAR U+8707 +ENCODING 34567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +08F8 +FE80 +0884 +0EFE +F890 +0910 +2A10 +1110 +3FF8 +2108 +2108 +3FF8 +0104 +7FFC +0002 +ENDCHAR +STARTCHAR U+8708 +ENCODING 34568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0838 +08A8 +3EA8 +2AA8 +2AB8 +2A80 +3EF8 +2AA8 +0C28 +0BFC +0E50 +7088 +0304 +0000 +ENDCHAR +STARTCHAR U+8709 +ENCODING 34569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0830 +09D0 +3EA8 +2AA4 +2B04 +2AF8 +3E10 +2820 +0DFC +0A20 +0F20 +7020 +0060 +0000 +ENDCHAR +STARTCHAR U+870A +ENCODING 34570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +1088 +13A8 +7CA8 +54A8 +57E8 +54A8 +7DA8 +51E8 +1AE8 +14A8 +1C88 +6088 +0098 +0000 +ENDCHAR +STARTCHAR U+870B +ENCODING 34571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +21FC +FD04 +A504 +A5FC +A504 +A504 +FDFD +2113 +2116 +2918 +2908 +7D0C +C5E6 +0303 +ENDCHAR +STARTCHAR U+870C +ENCODING 34572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1108 +1108 +7DEF +5508 +5508 +5529 +5549 +7D8F +1010 +10FE +1410 +7C10 +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+870D +ENCODING 34573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0850 +3E50 +2A88 +2BFC +2A20 +3FFC +2A20 +0CB0 +0AA8 +0F24 +7224 +0060 +0000 +ENDCHAR +STARTCHAR U+870E +ENCODING 34574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +FE82 +92FE +9200 +92FE +9282 +FE82 +10FE +1082 +1482 +14FE +1E82 +7282 +C08E +ENDCHAR +STARTCHAR U+870F +ENCODING 34575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +10F0 +FE10 +93FF +9254 +92D6 +9393 +FE00 +11FC +1024 +1427 +1461 +1E41 +72C1 +C187 +ENDCHAR +STARTCHAR U+8710 +ENCODING 34576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2108 +2108 +FFC8 +A93F +A909 +A909 +A909 +AFE9 +F909 +2119 +2B51 +2A51 +7AD3 +CBB2 +0626 +ENDCHAR +STARTCHAR U+8711 +ENCODING 34577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000C +7DF0 +0820 +3D3C +1520 +08FC +1E00 +61FC +1FF0 +1110 +1FF0 +1110 +01F8 +7E04 +0000 +ENDCHAR +STARTCHAR U+8712 +ENCODING 34578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1004 +1388 +10F0 +7C90 +5510 +555C +57D0 +7CD0 +52D0 +1AD0 +153C +1D80 +6260 +041C +0000 +ENDCHAR +STARTCHAR U+8713 +ENCODING 34579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +200C +2770 +2910 +FD10 +AA14 +AAFE +AF10 +A910 +F910 +A510 +2B7C +3900 +CA86 +047C +0800 +ENDCHAR +STARTCHAR U+8714 +ENCODING 34580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2080 +FDFF +A501 +A701 +A4F9 +A4A9 +FCA9 +20F9 +20A9 +28A9 +28F9 +7C03 +C402 +000E +ENDCHAR +STARTCHAR U+8715 +ENCODING 34581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1108 +1090 +1408 +7FFC +5508 +5508 +5508 +55F8 +7C90 +5090 +1490 +1D12 +F512 +420E +0400 +ENDCHAR +STARTCHAR U+8717 +ENCODING 34583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +10FC +1088 +1488 +7E88 +54F8 +5424 +55FE +7D24 +5524 +1154 +158C +1D04 +E504 +4114 +0108 +ENDCHAR +STARTCHAR U+8718 +ENCODING 34584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +1138 +7DE8 +56A8 +56A8 +54A8 +7FE8 +50A8 +18A8 +1568 +1F78 +6228 +0400 +0000 +ENDCHAR +STARTCHAR U+8719 +ENCODING 34585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2124 +2124 +2124 +FFA4 +A966 +A942 +A953 +AB90 +AB10 +FD10 +2130 +2922 +2922 +792E +C93A +0163 +ENDCHAR +STARTCHAR U+871A +ENCODING 34586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +3E7C +0240 +1E78 +0340 +7E7C +0440 +0940 +1FF0 +1110 +1FF0 +1110 +01F8 +7E04 +0000 +ENDCHAR +STARTCHAR U+871B +ENCODING 34587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FF +1081 +10FF +7C88 +5488 +54FF +5488 +5488 +7CBF +1121 +1421 +7C21 +043F +0021 +0000 +0000 +ENDCHAR +STARTCHAR U+871C +ENCODING 34588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FFC +2348 +5490 +1528 +27E4 +1900 +0FE0 +0920 +0FE0 +0120 +01F0 +3E08 +0000 +ENDCHAR +STARTCHAR U+871E +ENCODING 34590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FE +1488 +7E88 +54F8 +5488 +5488 +54F8 +7C88 +5088 +17FE +1C00 +E488 +4106 +0202 +ENDCHAR +STARTCHAR U+871F +ENCODING 34591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +21FF +FC40 +A442 +A49F +A5E1 +A400 +FCFE +2082 +20FE +2882 +28FE +7C82 +C482 +0086 +ENDCHAR +STARTCHAR U+8720 +ENCODING 34592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1101 +7D7D +5511 +5511 +55FF +7D11 +1139 +1155 +1193 +1511 +1511 +7D01 +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+8721 +ENCODING 34593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1090 +1090 +13FC +7C90 +5494 +57FE +5408 +55FC +7D08 +5108 +15F8 +1D08 +F508 +41F8 +0108 +ENDCHAR +STARTCHAR U+8722 +ENCODING 34594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1008 +1430 +7E24 +55FE +5420 +54A0 +5444 +7DFE +5154 +1554 +1D54 +E554 +43FE +0000 +ENDCHAR +STARTCHAR U+8723 +ENCODING 34595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +13FE +1420 +7E28 +55FC +5420 +5424 +57FE +7C50 +5050 +1450 +1C92 +E492 +410E +0600 +ENDCHAR +STARTCHAR U+8724 +ENCODING 34596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +7F7C +0840 +087F +1C44 +6B44 +0884 +0884 +1FFC +1084 +1FFC +0082 +3FFE +0002 +0000 +0000 +ENDCHAR +STARTCHAR U+8725 +ENCODING 34597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1084 +1088 +10B0 +7FE0 +54A0 +55BC +55E8 +7DE8 +52A8 +1AA8 +14C8 +1CC8 +6488 +0088 +0000 +ENDCHAR +STARTCHAR U+8726 +ENCODING 34598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +1044 +7C82 +557D +5400 +54FE +7CAA +10AA +10FE +10AA +14AA +7C82 +0084 +0000 +0000 +ENDCHAR +STARTCHAR U+8727 +ENCODING 34599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +11FE +1100 +7DFF +5501 +55FF +5510 +7D12 +11FF +1110 +1110 +1528 +7E44 +0483 +0000 +0000 +ENDCHAR +STARTCHAR U+8728 +ENCODING 34600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +21FF +FC10 +A4FE +A412 +A5FF +A412 +FCFE +2010 +2090 +289E +2890 +7DD0 +C570 +033F +ENDCHAR +STARTCHAR U+8729 +ENCODING 34601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1148 +7D48 +55F8 +5548 +55F8 +7D48 +55E8 +19A8 +15E8 +1EA8 +6208 +0418 +0000 +ENDCHAR +STARTCHAR U+872A +ENCODING 34602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10FF +7D01 +5641 +5441 +55FD +7C21 +11FD +1021 +1125 +1525 +15FD +7C01 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+872C +ENCODING 34604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +1004 +1008 +7C10 +5410 +5513 +55FD +5539 +7D55 +1193 +1511 +1511 +7D01 +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+872D +ENCODING 34605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FE +1102 +7C04 +5408 +5400 +5450 +548F +7D01 +1101 +11EF +1501 +7D01 +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+872E +ENCODING 34606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2028 +2024 +27FE +F820 +A820 +ABA4 +AAA4 +AAA4 +FAA8 +A3A8 +2810 +39B2 +CE52 +048A +0004 +ENDCHAR +STARTCHAR U+872F +ENCODING 34607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FE +FC20 +A5FC +A450 +A7FF +A488 +FD24 +2223 +21FC +2820 +2BFE +7C20 +C420 +0020 +ENDCHAR +STARTCHAR U+8730 +ENCODING 34608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F7F +2149 +3F49 +217F +3F40 +2141 +437F +0080 +1FFC +1084 +1FFC +0082 +3FFE +0002 +0000 +0000 +ENDCHAR +STARTCHAR U+8731 +ENCODING 34609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1044 +11FE +1524 +7F24 +55FC +5524 +5544 +55FC +7C50 +5094 +17FE +1C10 +E410 +4010 +0010 +ENDCHAR +STARTCHAR U+8732 +ENCODING 34610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200C +20F8 +2020 +FFFF +A4A8 +A4AC +A5A6 +A723 +FC20 +2040 +23FF +2844 +288C +7DF8 +C46C +01C6 +ENDCHAR +STARTCHAR U+8733 +ENCODING 34611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1000 +7CFE +5482 +54FE +5400 +547C +7C08 +1010 +11FF +1408 +7C08 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+8734 +ENCODING 34612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +3EF8 +2A88 +2AF8 +2A40 +3EFC +2954 +0E54 +0A94 +0F24 +7044 +0018 +0000 +ENDCHAR +STARTCHAR U+8735 +ENCODING 34613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1129 +1129 +1129 +7D29 +55EF +5501 +55FF +7D01 +11EF +1129 +1529 +1529 +7D29 +0201 +0000 +0000 +ENDCHAR +STARTCHAR U+8737 +ENCODING 34615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A8 +08A4 +3F24 +2AF8 +2A50 +2BFC +3E88 +29F4 +0E90 +0A90 +0EB4 +7084 +007C +0000 +ENDCHAR +STARTCHAR U+8738 +ENCODING 34616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4842 +7E42 +4224 +7E18 +4818 +7EE7 +0080 +1FFC +1084 +1FFC +0081 +7FFF +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+8739 +ENCODING 34617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +23FF +FC88 +A420 +A420 +A5FE +A522 +FD22 +2172 +2152 +295A +298A +7D02 +C502 +010E +ENDCHAR +STARTCHAR U+873A +ENCODING 34618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2060 +21CE +2102 +FD02 +A5CE +A502 +A502 +A5FE +FC48 +2048 +2048 +2848 +28C8 +7C89 +C589 +0307 +ENDCHAR +STARTCHAR U+873B +ENCODING 34619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +0820 +3EF8 +2A20 +2BFC +2A00 +3EF8 +2AA8 +0CA8 +0AF8 +0F88 +7088 +0098 +0000 +ENDCHAR +STARTCHAR U+873C +ENCODING 34620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2088 +2198 +FD10 +A5FF +A710 +A510 +A5FE +FD10 +2110 +2110 +29FE +2910 +7D10 +C510 +01FF +ENDCHAR +STARTCHAR U+873D +ENCODING 34621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +27FF +2020 +F820 +ABFE +AA22 +AA22 +ABBA +FAAA +22AA +22AA +2B76 +2A22 +7A22 +CA22 +0226 +ENDCHAR +STARTCHAR U+873E +ENCODING 34622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1124 +1524 +7FFC +5524 +5524 +55FC +5420 +7FFE +5020 +1470 +1CA8 +E52E +4224 +0020 +ENDCHAR +STARTCHAR U+873F +ENCODING 34623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +11FC +7D88 +5680 +54F8 +54E8 +7D68 +5768 +18F8 +14A0 +1EA4 +6124 +021C +0000 +ENDCHAR +STARTCHAR U+8740 +ENCODING 34624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +FC20 +A5FE +A522 +A5FE +A522 +FD22 +21FE +20A8 +28A8 +28AC +7DA6 +C523 +0020 +ENDCHAR +STARTCHAR U+8741 +ENCODING 34625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0220 +1E3C +1004 +1E3C +0220 +3FFE +0000 +0080 +1FFC +1084 +1FFC +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8742 +ENCODING 34626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1141 +115E +1150 +7D50 +55D0 +551E +551A +7DDA +115A +115A +115A +1564 +7D4A +0551 +0000 +0000 +ENDCHAR +STARTCHAR U+8743 +ENCODING 34627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2042 +FB5A +A884 +A94A +AA11 +A800 +ABDE +F842 +2242 +2994 +2894 +7948 +CA54 +0423 +ENDCHAR +STARTCHAR U+8745 +ENCODING 34629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFF +0810 +0810 +7E7E +1428 +2244 +C183 +0100 +3FFC +2104 +2104 +3FFC +0104 +01FE +FF03 +ENDCHAR +STARTCHAR U+8746 +ENCODING 34630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1054 +1054 +7DD7 +5454 +5410 +54FE +7C10 +1010 +11FF +1010 +1410 +7C10 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+8747 +ENCODING 34631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +10FC +1488 +7E88 +54F8 +5404 +55FE +5524 +5524 +7DFC +1124 +1524 +1DFC +F420 +4022 +001E +ENDCHAR +STARTCHAR U+8748 +ENCODING 34632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1104 +1514 +7FFC +5524 +5524 +55FC +5524 +7D34 +512C +15FC +1D04 +E504 +41FC +0104 +ENDCHAR +STARTCHAR U+8749 +ENCODING 34633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0844 +0924 +08A8 +3E90 +2AF8 +2AA8 +2AF8 +3EA8 +28F8 +0C20 +0BFC +0E20 +7020 +0020 +0000 +ENDCHAR +STARTCHAR U+874B +ENCODING 34635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1088 +1248 +1150 +7DF0 +5550 +5550 +55F0 +7D50 +5150 +19F0 +1554 +1D4C +624C +0444 +0000 +ENDCHAR +STARTCHAR U+874C +ENCODING 34636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +10A8 +1398 +7C98 +5488 +57E8 +5498 +7D98 +51CC +1AB8 +16A8 +1C88 +6088 +0088 +0000 +ENDCHAR +STARTCHAR U+874D +ENCODING 34637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23EF +2229 +FA29 +ABE9 +AA29 +AA29 +AA29 +FBE9 +2209 +2249 +2A49 +2AEB +7BA8 +CA08 +0008 +ENDCHAR +STARTCHAR U+874E +ENCODING 34638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +3EF8 +2A88 +2AF8 +2A40 +3EFC +29A4 +0CB4 +0ACC +0FFC +7084 +0018 +0000 +ENDCHAR +STARTCHAR U+874F +ENCODING 34639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1000 +7CFE +5482 +54FE +5400 +7DFF +1101 +157D +1C10 +7010 +0010 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+8750 +ENCODING 34640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1101 +11FF +7D01 +55FF +5400 +54FE +7C82 +10FE +1482 +1CFE +7082 +00FE +0082 +0000 +0000 +ENDCHAR +STARTCHAR U+8751 +ENCODING 34641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1011 +7C9E +54D0 +553F +5400 +7CFE +1082 +10FE +1482 +1CFE +7082 +0082 +0106 +0000 +0000 +ENDCHAR +STARTCHAR U+8752 +ENCODING 34642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1020 +1040 +7DFF +5529 +5529 +7D39 +1129 +1129 +1139 +1529 +1D29 +71FF +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+8753 +ENCODING 34643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10E0 +1020 +1050 +7C90 +55F8 +5604 +57A8 +7EA8 +53A8 +1AD0 +17D0 +1EA8 +62A8 +02A8 +0000 +ENDCHAR +STARTCHAR U+8754 +ENCODING 34644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1108 +11EF +7D08 +5529 +55CF +5400 +5440 +7CFE +1182 +10FE +1482 +1CFE +7082 +0000 +0000 +ENDCHAR +STARTCHAR U+8755 +ENCODING 34645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0C20 +1220 +2AF8 +48A8 +3EA8 +22A8 +3EF8 +22A8 +3E20 +2430 +2628 +3A3C +61C4 +0000 +ENDCHAR +STARTCHAR U+8756 +ENCODING 34646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1101 +7D01 +54FE +5400 +54FE +7C82 +10FE +1082 +10FE +1400 +7C00 +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+8757 +ENCODING 34647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +08F8 +3E88 +2AF8 +2A88 +2AF8 +3E00 +29FC +0C20 +0AF8 +0E20 +73FC +0000 +0000 +ENDCHAR +STARTCHAR U+8758 +ENCODING 34648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2200 +FAFE +AA82 +AAFE +AA82 +AAFE +AA20 +FBFF +2244 +2AE8 +2A3C +7AE6 +CA00 +03FF +ENDCHAR +STARTCHAR U+8759 +ENCODING 34649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1000 +7DF8 +5508 +55F8 +5500 +7DF8 +5168 +1968 +17F8 +1F68 +6568 +0118 +0000 +ENDCHAR +STARTCHAR U+875A +ENCODING 34650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +1004 +1028 +7DFF +5429 +544A +5488 +7C18 +11FF +1054 +1492 +1D11 +7010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+875B +ENCODING 34651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1005 +11FF +1104 +7DFC +5504 +5554 +7DFC +1155 +1154 +1156 +1554 +1D2D +7253 +0089 +0000 +0000 +ENDCHAR +STARTCHAR U+875C +ENCODING 34652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FE +1104 +7C08 +54FE +5482 +54FE +7C82 +10FE +1082 +14FE +1C44 +7082 +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+875D +ENCODING 34653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +2004 +FDFC +A404 +A7FF +A440 +A4A2 +FD34 +2058 +2090 +2938 +2854 +7C92 +C511 +0060 +ENDCHAR +STARTCHAR U+875E +ENCODING 34654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11FF +1111 +7D11 +55FF +5500 +557F +7D41 +117F +1141 +157F +1D41 +727F +0041 +0000 +0000 +ENDCHAR +STARTCHAR U+875F +ENCODING 34655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0924 +3FFC +2B24 +2BFC +2A00 +3EF8 +2A88 +0CF8 +0A88 +0FF8 +7088 +0098 +0000 +ENDCHAR +STARTCHAR U+8760 +ENCODING 34656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0800 +3EF0 +2A90 +2AF0 +2A00 +3FF8 +2948 +0DF8 +0B48 +0F48 +71F8 +0108 +0000 +ENDCHAR +STARTCHAR U+8761 +ENCODING 34657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FF +2020 +FDFF +A529 +A529 +A529 +A52B +FC00 +2010 +21FF +2828 +2828 +7C6C +C4C6 +0183 +ENDCHAR +STARTCHAR U+8762 +ENCODING 34658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1010 +1020 +7CFE +5482 +54FE +5482 +7CFE +1082 +10FE +1000 +1444 +7C82 +0502 +0000 +0000 +ENDCHAR +STARTCHAR U+8763 +ENCODING 34659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +1120 +7D3C +57C0 +557C +5508 +7DD0 +5150 +197C +1550 +1E50 +6250 +05B0 +0000 +ENDCHAR +STARTCHAR U+8764 +ENCODING 34660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1088 +1050 +13FE +7C50 +5454 +55FE +5554 +5554 +7D54 +519C +1504 +1D74 +E504 +41FC +0104 +ENDCHAR +STARTCHAR U+8765 +ENCODING 34661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7E44 +147E +08C8 +FF28 +1A10 +2828 +4946 +1908 +3FFC +2108 +2108 +3FF8 +0104 +FFFC +0002 +ENDCHAR +STARTCHAR U+8766 +ENCODING 34662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11D8 +1148 +7D48 +55D8 +5508 +5500 +7DF8 +5128 +1928 +15D0 +1D10 +6528 +0144 +0000 +ENDCHAR +STARTCHAR U+8767 +ENCODING 34663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +7C10 +5410 +54FE +5492 +7C92 +11FF +1010 +1428 +1C44 +7082 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+8768 +ENCODING 34664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FE0 +0220 +3FE4 +0214 +040C +0824 +3EF8 +2AA8 +2AA8 +3EF8 +2AA8 +0F3C +71C4 +0000 +ENDCHAR +STARTCHAR U+8769 +ENCODING 34665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11FE +1010 +11FF +7C10 +54FE +5492 +54FE +7C92 +10FE +1410 +1CFE +7010 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+876A +ENCODING 34666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0888 +3EF8 +2A88 +2AF8 +2A00 +3FFC +2880 +0DFC +0A54 +0E94 +7124 +0058 +0000 +ENDCHAR +STARTCHAR U+876B +ENCODING 34667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1010 +10FE +7C12 +5414 +55FF +5420 +7C7E +10C2 +1142 +107E +1442 +7C42 +047E +0000 +0000 +ENDCHAR +STARTCHAR U+876C +ENCODING 34668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +1092 +10AA +7CC6 +54FE +5444 +5482 +7D21 +107C +14C4 +1C28 +7010 +0028 +00C6 +0000 +0000 +ENDCHAR +STARTCHAR U+876D +ENCODING 34669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +10FE +7C82 +54FE +5400 +55FF +7C10 +1010 +1090 +149E +1C90 +7150 +023F +0000 +0000 +ENDCHAR +STARTCHAR U+876E +ENCODING 34670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +08FC +3FF8 +2A88 +2AF8 +2A88 +3EF8 +2A40 +0CF8 +0B90 +0E60 +70F0 +070C +0000 +ENDCHAR +STARTCHAR U+876F +ENCODING 34671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +203C +23E2 +FD26 +A494 +A7FF +A440 +A7FF +FC40 +20FC +2084 +29CC +2B68 +7C38 +C46C +01C7 +ENDCHAR +STARTCHAR U+8770 +ENCODING 34672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +13FE +7C50 +5488 +5526 +56F8 +5420 +7DFC +5020 +14F8 +1C20 +E424 +43FE +0000 +ENDCHAR +STARTCHAR U+8771 +ENCODING 34673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +2000 +2000 +2000 +1FFC +0000 +1010 +7E7E +5252 +5252 +7E7E +1414 +3E3E +E2E3 +ENDCHAR +STARTCHAR U+8772 +ENCODING 34674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +2082 +208A +FBEA +A88A +ABEA +AAAA +AAAA +FAAA +22AA +208A +29C2 +29A2 +7AA2 +CAA2 +008E +ENDCHAR +STARTCHAR U+8773 +ENCODING 34675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1010 +11FF +7C10 +55FF +54FE +54A2 +7C92 +11FF +1092 +148A +7CFF +041C +0000 +0000 +ENDCHAR +STARTCHAR U+8774 +ENCODING 34676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1138 +1128 +7D28 +57E8 +5538 +5528 +7FA8 +52B8 +1AA8 +17C8 +1E48 +6088 +0118 +0000 +ENDCHAR +STARTCHAR U+8775 +ENCODING 34677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7E2A +082A +7F1C +1C08 +2A14 +4963 +0080 +1FFC +1084 +1FFC +0081 +7FFF +0001 +0000 +0000 +ENDCHAR +STARTCHAR U+8776 +ENCODING 34678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A8 +08A8 +09FC +3EA8 +2AA8 +2AB8 +2A80 +3EFC +2820 +0DFC +0A70 +0EA8 +7324 +0020 +0000 +ENDCHAR +STARTCHAR U+8777 +ENCODING 34679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FF +1100 +7D41 +5522 +55FF +5508 +7D49 +1149 +117F +1108 +1508 +7E10 +0420 +0000 +0000 +ENDCHAR +STARTCHAR U+8778 +ENCODING 34680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F0 +0890 +3EF0 +2AD0 +2AD0 +2BF8 +3F08 +29E8 +0DA8 +0BA8 +0FE8 +7108 +0118 +0000 +ENDCHAR +STARTCHAR U+8779 +ENCODING 34681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +7C92 +5492 +54AA +54C6 +54FE +7C00 +10FE +10AA +10AA +14AA +7CAA +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+877A +ENCODING 34682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +1010 +10FE +7C92 +5492 +54FE +5410 +7DFF +1111 +1515 +1D7D +7105 +0101 +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+877B +ENCODING 34683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +13FE +7C20 +5424 +55FE +5504 +5554 +7DFC +5124 +15FC +1D24 +E524 +4124 +010C +ENDCHAR +STARTCHAR U+877C +ENCODING 34684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2248 +2150 +2840 +FFFC +A8E0 +A958 +AA48 +A880 +FFFE +A110 +2A10 +39A0 +E840 +01B0 +0608 +ENDCHAR +STARTCHAR U+877D +ENCODING 34685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2048 +27FC +2040 +FBF8 +A880 +AFFE +A910 +ABF8 +FE0C +AA0A +23F8 +3A08 +CA08 +03F8 +0208 +ENDCHAR +STARTCHAR U+877E +ENCODING 34686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FE +1088 +7C88 +57FE +5602 +5424 +55FC +7C20 +5070 +1468 +1CA8 +E526 +4224 +0020 +ENDCHAR +STARTCHAR U+877F +ENCODING 34687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +08A8 +3EF8 +2AA8 +2AF8 +2A20 +3EF8 +28A8 +0CF8 +0AA8 +0FF8 +70A4 +001C +0000 +ENDCHAR +STARTCHAR U+8781 +ENCODING 34689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +109E +1012 +7DDE +5452 +549E +5510 +7C94 +1055 +1052 +1055 +1458 +7C80 +057F +0000 +0000 +ENDCHAR +STARTCHAR U+8782 +ENCODING 34690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1138 +13A8 +7EA8 +56B0 +57B0 +56A8 +7FA8 +5264 +1BA4 +16B8 +1EE0 +6360 +0C20 +0000 +ENDCHAR +STARTCHAR U+8783 +ENCODING 34691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +13FE +1088 +7C50 +57FE +5642 +5420 +57FE +7C80 +50F8 +1488 +1C88 +E508 +4228 +0410 +ENDCHAR +STARTCHAR U+8784 +ENCODING 34692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +223F +2388 +FA88 +AABF +AAA9 +ABA9 +AA29 +FA29 +23A9 +22A9 +2AA9 +2AA9 +7AAB +CB88 +0008 +ENDCHAR +STARTCHAR U+8785 +ENCODING 34693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1088 +11FC +1508 +7FF8 +5508 +55F8 +5508 +5508 +7DF8 +5148 +1420 +1CA4 +E682 +428A +0478 +ENDCHAR +STARTCHAR U+8786 +ENCODING 34694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +2084 +2084 +FBFF +A884 +A884 +A908 +A908 +AA52 +F94A +2084 +2884 +294A +794A +CBDF +0251 +ENDCHAR +STARTCHAR U+8787 +ENCODING 34695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +203C +21C2 +FA66 +AB24 +A940 +A8C8 +A990 +A8A4 +F87E +21C3 +2820 +2BFF +7850 +C8CC +0387 +ENDCHAR +STARTCHAR U+8788 +ENCODING 34696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1110 +1524 +7F7E +5544 +5544 +557C +5544 +7D44 +517C +1510 +1D58 +E656 +4292 +0430 +ENDCHAR +STARTCHAR U+8789 +ENCODING 34697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +2104 +FE43 +A448 +A484 +A5FE +A402 +FFDF +2041 +234D +28C3 +2945 +7E49 +C451 +01C7 +ENDCHAR +STARTCHAR U+878B +ENCODING 34699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +10AC +1124 +1524 +7FAC +5524 +5524 +55FC +5420 +7DFC +5088 +1450 +1C20 +E450 +408E +0304 +ENDCHAR +STARTCHAR U+878C +ENCODING 34700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +3E7C +2244 +2A47 +FF80 +227E +2A42 +2A24 +6218 +C667 +0100 +3FFC +2104 +3FFC +0102 +FFFD +ENDCHAR +STARTCHAR U+878D +ENCODING 34701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F20 +0020 +3EF8 +22A8 +3EA8 +00A8 +7FF8 +55A8 +6730 +5F28 +4938 +49E4 +4B04 +0000 +ENDCHAR +STARTCHAR U+878F +ENCODING 34703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +10FF +10A0 +7CA0 +54FF +5688 +5588 +7CFF +1188 +1288 +1088 +1494 +1D22 +7041 +0000 +0000 +ENDCHAR +STARTCHAR U+8790 +ENCODING 34704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2040 +21FC +FD04 +A504 +A504 +A5FC +A500 +FDFF +2100 +21FF +2801 +2955 +7D55 +C503 +000E +ENDCHAR +STARTCHAR U+8791 +ENCODING 34705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +10FE +1182 +7CFE +5482 +54FE +5482 +7CFE +1011 +11FF +1010 +1428 +7C44 +0583 +0000 +0000 +ENDCHAR +STARTCHAR U+8792 +ENCODING 34706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1010 +7C28 +1044 +7C92 +4511 +7CFE +4492 +7C92 +10FE +7C10 +1011 +11FF +1001 +0000 +0000 +ENDCHAR +STARTCHAR U+8793 +ENCODING 34707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2048 +27FC +2840 +FFF8 +A840 +AFFE +A8A0 +A910 +FBE8 +A446 +2BF8 +3840 +C950 +0248 +0040 +ENDCHAR +STARTCHAR U+8794 +ENCODING 34708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FE +1110 +7D1E +5510 +557F +5549 +557E +7D48 +114E +1140 +1154 +1655 +7C95 +0467 +0000 +0000 +ENDCHAR +STARTCHAR U+8795 +ENCODING 34709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2040 +21FE +FD02 +A54A +A532 +A54A +A502 +FDFE +2000 +2110 +29D3 +291E +7D10 +C5D1 +030F +ENDCHAR +STARTCHAR U+8796 +ENCODING 34710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +1044 +105C +7C54 +55FF +5501 +547C +7C44 +107C +1044 +107C +1444 +7C44 +048C +0000 +0000 +ENDCHAR +STARTCHAR U+8797 +ENCODING 34711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1014 +11FE +1510 +7F7C +5514 +55FE +5514 +557C +7D10 +517C +1544 +1D44 +E644 +427C +0444 +ENDCHAR +STARTCHAR U+8798 +ENCODING 34712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2111 +2111 +FDFF +A400 +A5FF +A400 +A4FE +FC82 +2082 +20FE +2844 +286C +7C28 +C5FF +0000 +ENDCHAR +STARTCHAR U+8799 +ENCODING 34713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +7FFE +0540 +0D60 +1938 +710E +0100 +1110 +7E7E +5252 +5252 +7E7E +1414 +3E3E +E2E3 +ENDCHAR +STARTCHAR U+879A +ENCODING 34714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2140 +7F7C +0142 +3E7E +2200 +3E40 +227D +3E41 +46FF +1FFC +1084 +1FFC +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+879B +ENCODING 34715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1111 +7C7C +5410 +547C +5410 +55FF +7C00 +10FE +1082 +1482 +7CFE +0482 +0000 +0000 +ENDCHAR +STARTCHAR U+879C +ENCODING 34716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083C +7F25 +0847 +3E3C +0024 +7F18 +4124 +3EC3 +0080 +1FFC +1084 +1FFC +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+879D +ENCODING 34717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10FE +7D92 +5492 +54FE +5492 +7C92 +10FE +1048 +104A +144F +7C89 +050F +0000 +0000 +ENDCHAR +STARTCHAR U+879E +ENCODING 34718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FF +2110 +FD10 +A5FE +A510 +A510 +A5FE +FD10 +2110 +21FF +2801 +2955 +7D55 +C503 +0006 +ENDCHAR +STARTCHAR U+879F +ENCODING 34719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0908 +3EF8 +2A88 +2AF8 +2A88 +3EF8 +2820 +0DFC +0A00 +0F50 +7088 +0304 +0000 +ENDCHAR +STARTCHAR U+87A0 +ENCODING 34720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +218C +2088 +FFFE +A488 +A488 +A58C +A506 +FF03 +2000 +21FE +2952 +2952 +7D52 +C552 +03FF +ENDCHAR +STARTCHAR U+87A2 +ENCODING 34722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +2AA8 +2CB0 +4930 +1448 +2288 +3FFC +2108 +5FF0 +1110 +1FF0 +1110 +01F8 +7E04 +0000 +ENDCHAR +STARTCHAR U+87A3 +ENCODING 34723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A44 +4948 +4840 +4BFE +7890 +4890 +4FFF +494C +7B46 +4DFB +4948 +49F8 +4848 +C87C +9BC6 +ENDCHAR +STARTCHAR U+87A4 +ENCODING 34724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1117 +7F11 +4511 +29FF +1111 +2911 +45FF +1010 +7C10 +5410 +7C28 +1244 +7E82 +0000 +0000 +ENDCHAR +STARTCHAR U+87A7 +ENCODING 34727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2044 +21F4 +FC48 +A7FF +A420 +A4CC +A770 +FC41 +203F +2000 +29FC +2904 +7DFC +C504 +01FC +ENDCHAR +STARTCHAR U+87A8 +ENCODING 34728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +2094 +27FE +2890 +FC90 +ABFC +A890 +AA94 +ABFE +FA94 +A294 +2B6C +3A44 +CA04 +0214 +0208 +ENDCHAR +STARTCHAR U+87AA +ENCODING 34730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1044 +7C28 +55FF +5529 +5529 +7DC7 +1101 +117D +1545 +157D +7D01 +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+87AB +ENCODING 34731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3F40 +047C +7FC8 +2B28 +2A90 +5668 +2184 +1FF0 +1110 +1FF0 +1110 +01F8 +7E04 +0000 +ENDCHAR +STARTCHAR U+87AC +ENCODING 34732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +2094 +27FE +2090 +FBFC +AA94 +ABFC +AA94 +ABFC +F800 +A1F8 +2908 +39F8 +C908 +01F8 +0108 +ENDCHAR +STARTCHAR U+87AD +ENCODING 34733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +13FE +1000 +7D54 +5524 +5554 +55FC +5424 +7DFE +5124 +1554 +1D74 +E504 +4114 +0108 +ENDCHAR +STARTCHAR U+87AE +ENCODING 34734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2154 +2154 +23FF +F954 +A954 +AA77 +A800 +ABFF +AA21 +FA21 +21FE +2922 +2922 +7926 +C820 +0020 +ENDCHAR +STARTCHAR U+87AF +ENCODING 34735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +7F7C +0890 +7F50 +0E20 +1250 +678C +1FF0 +1110 +1FF0 +1110 +01F8 +7E04 +0000 +ENDCHAR +STARTCHAR U+87B0 +ENCODING 34736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1128 +7DFF +5529 +5529 +55FF +5500 +7D44 +1155 +1166 +1544 +7E55 +0477 +0000 +0000 +ENDCHAR +STARTCHAR U+87B1 +ENCODING 34737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F04 +4104 +7F7F +4004 +5F44 +4424 +D524 +9504 +2C1C +0100 +3FFC +2104 +3FFC +0104 +01FE +FF03 +ENDCHAR +STARTCHAR U+87B2 +ENCODING 34738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +11FF +1129 +7D45 +5482 +5400 +54FE +5420 +7C44 +10FE +1410 +14FE +7C10 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+87B3 +ENCODING 34739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0924 +08A8 +3FFC +2B08 +2AF8 +2A88 +3EF8 +2820 +0CF8 +0A20 +0E20 +73FC +0000 +0000 +ENDCHAR +STARTCHAR U+87B4 +ENCODING 34740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +22FE +2C10 +22FE +2292 +22FE +3492 +28FE +2054 +2092 +1FFC +1084 +1FFD +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+87B5 +ENCODING 34741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1050 +1054 +7DFE +5554 +5554 +55FC +5400 +7CF8 +5000 +17FE +1CA8 +E526 +4222 +0060 +ENDCHAR +STARTCHAR U+87B6 +ENCODING 34742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1000 +1FF8 +1008 +1FF8 +1000 +1FFC +0000 +0808 +3E3E +2A2A +3E3E +0909 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+87B7 +ENCODING 34743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2200 +27FC +2C44 +27F4 +27FC +2240 +2FFC +2040 +27FC +2444 +47FD +0FFF +0000 +0000 +ENDCHAR +STARTCHAR U+87B8 +ENCODING 34744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +211F +1221 +2105 +5E84 +1204 +120A +1E31 +0080 +1FFC +1084 +1FFC +0082 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+87B9 +ENCODING 34745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +11F1 +1046 +7C44 +55F4 +5557 +55F5 +7D55 +11F5 +1045 +11F5 +1449 +7C51 +0441 +0000 +0000 +ENDCHAR +STARTCHAR U+87BA +ENCODING 34746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +08A8 +3EF8 +2AA8 +2AF8 +2A48 +3ED0 +2828 +0DFC +0AA4 +0EA8 +7124 +0020 +0000 +ENDCHAR +STARTCHAR U+87BB +ENCODING 34747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +08A8 +3FFC +2AA8 +2AF8 +2AF8 +3EA8 +28F8 +0DFC +0A50 +0EF0 +7078 +0384 +0000 +ENDCHAR +STARTCHAR U+87BC +ENCODING 34748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +107C +7C10 +54FE +5492 +54FE +7C10 +10FE +1410 +15FF +7C10 +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+87BD +ENCODING 34749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +03E0 +1E40 +0180 +0760 +789C +0380 +0860 +3EF8 +2AA8 +3EF8 +2AA8 +0F3C +71C4 +0000 +ENDCHAR +STARTCHAR U+87BE +ENCODING 34750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +FE01 +A4FD +A420 +A5FE +A522 +FD22 +21FE +2122 +2922 +29FE +7C84 +C586 +0303 +ENDCHAR +STARTCHAR U+87BF +ENCODING 34751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +447E +45D2 +7C5C +05F0 +FC04 +27FF +2484 +64C4 +C44C +3FFC +2104 +3FFC +0104 +01FE +FF03 +ENDCHAR +STARTCHAR U+87C0 +ENCODING 34752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +09FC +3E20 +2AA8 +2B54 +2A20 +3ED8 +2B74 +0C20 +0BFC +0E20 +7020 +0020 +0000 +ENDCHAR +STARTCHAR U+87C1 +ENCODING 34753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFC +2004 +3FFC +2080 +3FFF +2040 +2F32 +F80E +1010 +7E7E +5252 +5252 +7E7E +1414 +3E3E +E2E3 +ENDCHAR +STARTCHAR U+87C2 +ENCODING 34754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +107C +10C4 +7C7C +5444 +547C +547F +5440 +7C7F +1021 +15FD +1471 +7CA9 +0526 +0000 +0000 +ENDCHAR +STARTCHAR U+87C3 +ENCODING 34755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +1044 +7C7C +547C +5400 +55FF +5529 +7DFF +1000 +107E +1004 +1424 +7C18 +04E7 +0000 +0000 +ENDCHAR +STARTCHAR U+87C4 +ENCODING 34756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +09F0 +7F50 +14D0 +7F74 +3E94 +090C +1FF0 +1110 +1FF0 +1110 +01F8 +3E08 +0000 +ENDCHAR +STARTCHAR U+87C5 +ENCODING 34757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1100 +7D24 +5524 +55FF +5524 +5524 +7D24 +113C +1200 +14AA +7CAA +0529 +0000 +0000 +ENDCHAR +STARTCHAR U+87C6 +ENCODING 34758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +09FC +3E50 +2AF8 +2A88 +2AF8 +3E88 +28F8 +0C20 +0BFC +0E50 +7088 +0304 +0000 +ENDCHAR +STARTCHAR U+87C7 +ENCODING 34759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0FE0 +0820 +0FE0 +0FE0 +0200 +7FFC +0920 +1FF0 +692C +0FE0 +01F0 +3E08 +0000 +ENDCHAR +STARTCHAR U+87C8 +ENCODING 34760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2215 +FA15 +ABFF +AA11 +AAE9 +AAA9 +AAA9 +FAEB +2205 +2AED +2A1B +7A73 +CA01 +03FF +ENDCHAR +STARTCHAR U+87C9 +ENCODING 34761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DE +2042 +FD4A +A4C6 +A54A +A422 +A470 +FDDC +2307 +2020 +29C8 +2832 +7DC4 +C418 +01E0 +ENDCHAR +STARTCHAR U+87CA +ENCODING 34762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF0 +0220 +0140 +7FFE +0282 +0C84 +3080 +CAA0 +0928 +3EFC +2AA8 +3EF8 +0924 +7FFC +0104 +ENDCHAR +STARTCHAR U+87CB +ENCODING 34763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +09E8 +08A8 +3E70 +2BFC +2A70 +2AA8 +3F24 +2840 +0C28 +0AC4 +0ED4 +7150 +0030 +0000 +ENDCHAR +STARTCHAR U+87CC +ENCODING 34764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FE +118A +7CD6 +54AA +54D2 +54AE +7CFE +1000 +1152 +1549 +1540 +7D42 +043E +0000 +0000 +ENDCHAR +STARTCHAR U+87CE +ENCODING 34766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +2048 +21FF +FC48 +A448 +A478 +A410 +A5FF +FD11 +21DD +2155 +2955 +29BB +7D11 +C511 +0103 +ENDCHAR +STARTCHAR U+87D0 +ENCODING 34768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0924 +08A8 +09FC +3F08 +2AF8 +2A88 +2AF8 +3E20 +29FC +0D24 +0B24 +0F24 +7138 +0020 +0000 +ENDCHAR +STARTCHAR U+87D1 +ENCODING 34769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +11FC +1088 +1450 +7FFE +5404 +55FE +5504 +55FC +7D04 +51FC +1420 +1FFE +E420 +4020 +0020 +ENDCHAR +STARTCHAR U+87D2 +ENCODING 34770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +09FC +3E50 +2A20 +2BFC +2A50 +3E88 +2954 +0C50 +0BFC +0E50 +7090 +0110 +0000 +ENDCHAR +STARTCHAR U+87D3 +ENCODING 34771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10F8 +1110 +13FC +7D24 +5524 +55FC +5440 +54C4 +7D28 +5270 +14B0 +1F68 +E4AE +4324 +0060 +ENDCHAR +STARTCHAR U+87D4 +ENCODING 34772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1092 +10D6 +7CBA +5492 +54FE +5410 +54FE +7C10 +11FF +1400 +7CAA +04AA +0129 +0000 +0000 +ENDCHAR +STARTCHAR U+87D5 +ENCODING 34773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +214B +217E +FD48 +A579 +A7C7 +A478 +A490 +FDFE +2122 +21FE +2922 +29FE +7D02 +C502 +020E +ENDCHAR +STARTCHAR U+87D6 +ENCODING 34774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2243 +2246 +225C +FFF0 +AA50 +ABDF +AA52 +AA52 +ABD2 +FA52 +2252 +2FF2 +2A52 +7A52 +CE62 +0422 +ENDCHAR +STARTCHAR U+87D7 +ENCODING 34775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +1FFC +0FF8 +0888 +0FF8 +7FFF +4081 +5FFD +1FFC +3FFE +2082 +3FFE +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+87D8 +ENCODING 34776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +104A +10DF +1148 +7C45 +5442 +54FE +5482 +54FE +7C82 +10FE +1482 +7CFE +0501 +0000 +0000 +ENDCHAR +STARTCHAR U+87D9 +ENCODING 34777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +208A +23EB +F809 +AA28 +A948 +AFFF +A808 +ABEA +FE2A +222E +2BE4 +2A24 +7A25 +CBEF +001A +ENDCHAR +STARTCHAR U+87DA +ENCODING 34778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7F98 +0464 +7F8C +2118 +3F72 +1206 +179C +7C70 +0100 +3FFC +2104 +3FFC +0104 +01FE +FF03 +ENDCHAR +STARTCHAR U+87DB +ENCODING 34779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +20A2 +27F4 +2084 +FBE8 +A812 +ABE2 +AA24 +AA28 +FBF0 +A002 +2A22 +3944 +CFE8 +0010 +0060 +ENDCHAR +STARTCHAR U+87DC +ENCODING 34780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +201C +21F0 +2020 +FFFF +A448 +A4FC +A74B +A478 +FC00 +21FE +2102 +297A +294A +7D7A +C502 +0106 +ENDCHAR +STARTCHAR U+87DD +ENCODING 34781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +111F +1090 +111F +7C91 +541F +5450 +549F +5510 +7DFF +1054 +1492 +7D11 +0410 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+87DE +ENCODING 34782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1510 +249F +4462 +3F92 +2492 +2E8C +358C +24B3 +0080 +1FFC +1084 +1FFC +0082 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+87DF +ENCODING 34783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +23FF +FC48 +A54A +A484 +A4FE +A585 +FEFC +2084 +20FC +2820 +2924 +7B26 +C623 +00E0 +ENDCHAR +STARTCHAR U+87E0 +ENCODING 34784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +09E8 +08A8 +3E70 +2BFC +2A70 +2AA8 +3F24 +28F8 +0CA8 +0AF8 +0FA8 +70F8 +0088 +0000 +ENDCHAR +STARTCHAR U+87E1 +ENCODING 34785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1044 +7C28 +55FC +5424 +5448 +55FE +7C82 +11FF +1601 +1155 +1555 +7C01 +0406 +0000 +0000 +ENDCHAR +STARTCHAR U+87E2 +ENCODING 34786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FF +2020 +FDFE +A400 +A5FE +A502 +A5FE +FC84 +2048 +23FF +2800 +29FE +7D02 +C502 +01FE +ENDCHAR +STARTCHAR U+87E3 +ENCODING 34787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2122 +2224 +26AD +F922 +AA25 +AAAF +AFA4 +A822 +ABFF +FA20 +2212 +2B14 +2A88 +7A95 +CE27 +04C2 +ENDCHAR +STARTCHAR U+87E4 +ENCODING 34788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23DF +2041 +FBDF +AA10 +AA51 +A9CF +A800 +F848 +21FE +2048 +2848 +2BFF +7C48 +C4CC +0387 +ENDCHAR +STARTCHAR U+87E5 +ENCODING 34789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FE +1088 +7C88 +57FE +5420 +55FC +5524 +7DFC +5124 +15FC +1C00 +E488 +4106 +0202 +ENDCHAR +STARTCHAR U+87E6 +ENCODING 34790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1054 +11FF +7C44 +54FE +5482 +54FE +5482 +7CFE +1082 +14FE +7C82 +0501 +0000 +0000 +ENDCHAR +STARTCHAR U+87E7 +ENCODING 34791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1155 +10EE +7CAA +5511 +5400 +55FF +5501 +7C10 +107E +1412 +1412 +7C22 +00CC +0000 +0000 +ENDCHAR +STARTCHAR U+87E8 +ENCODING 34792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2890 +2510 +3FDF +2229 +2A88 +2F94 +2262 +2441 +4FFC +0444 +07FC +0042 +0FFE +0000 +0000 +ENDCHAR +STARTCHAR U+87EA +ENCODING 34794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1024 +13FE +1024 +7DFE +5524 +55FC +5524 +55FC +7C22 +53FE +1442 +1CA0 +E6A4 +428A +0078 +ENDCHAR +STARTCHAR U+87EB +ENCODING 34795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FF +2050 +FDFE +A552 +A5FE +A400 +A5FE +FD02 +21FE +2102 +29FE +2820 +7FFF +C420 +0020 +ENDCHAR +STARTCHAR U+87EC +ENCODING 34796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10EE +10AA +7CAA +54EE +5400 +54FE +5492 +7CFE +5092 +10FE +1092 +1410 +1FFF +6210 +0010 +ENDCHAR +STARTCHAR U+87ED +ENCODING 34797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +2088 +2190 +FFFE +A510 +A510 +A5FE +A510 +FDFE +2110 +2110 +29FF +2800 +7D52 +C75B +0249 +ENDCHAR +STARTCHAR U+87EE +ENCODING 34798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1050 +13FE +1020 +7DFC +5420 +57FE +5524 +54A8 +7FFE +5004 +15FE +1D04 +E504 +41FC +0104 +ENDCHAR +STARTCHAR U+87EF +ENCODING 34799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +0820 +3FFC +2A88 +2BDC +2A88 +3EFC +2900 +0DFC +0A50 +0E54 +7094 +030C +0000 +ENDCHAR +STARTCHAR U+87F1 +ENCODING 34801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +21FF +FDAA +A6AA +A4AA +A7FF +A4AA +FCAA +20AA +21FF +2800 +2800 +7CAA +C5AB +0129 +ENDCHAR +STARTCHAR U+87F2 +ENCODING 34802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +1110 +1FF0 +1110 +01F8 +3E08 +0820 +3EF8 +2AA8 +3EF8 +2AA8 +0F3C +71C4 +0000 +ENDCHAR +STARTCHAR U+87F3 +ENCODING 34803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FC +2004 +23FF +F804 +A9FC +A800 +ABDE +A892 +A8D2 +FB9E +2004 +2BFF +2884 +78C4 +C844 +001C +ENDCHAR +STARTCHAR U+87F4 +ENCODING 34804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2202 +7F7C +2240 +3E40 +227E +3E48 +2248 +7F88 +4188 +1FFC +1084 +1FFC +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+87F6 +ENCODING 34806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13E0 +115C +7DD4 +55D4 +5554 +57DC +7C58 +51E0 +1820 +14F8 +1C20 +63FC +0000 +0000 +ENDCHAR +STARTCHAR U+87F7 +ENCODING 34807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0924 +08A8 +09FC +3F08 +2AF0 +2A90 +2AF0 +3E00 +29F8 +0D48 +0BF8 +0F48 +71F8 +0108 +0000 +ENDCHAR +STARTCHAR U+87F8 +ENCODING 34808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFE +0300 +0D80 +734E +0CF0 +7340 +0CF0 +739E +1010 +7E7E +5252 +5252 +7E7E +1414 +3E3E +E2E3 +ENDCHAR +STARTCHAR U+87F9 +ENCODING 34809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1DF8 +2848 +7E98 +2BA0 +3EF8 +2B20 +3FFC +2320 +5FF0 +1110 +1FF0 +01F0 +3F08 +0000 +ENDCHAR +STARTCHAR U+87FA +ENCODING 34810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FF +2000 +FDFE +A502 +A57A +A54A +A57A +FD02 +21FE +2084 +28FC +2884 +7CFC +C484 +03FF +ENDCHAR +STARTCHAR U+87FB +ENCODING 34811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +13FC +1040 +7DF8 +5440 +57FC +54A8 +7FA4 +53FC +18A8 +14D8 +1F94 +60EC +0184 +0000 +ENDCHAR +STARTCHAR U+87FC +ENCODING 34812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1220 +7FA0 +123F +1F22 +2122 +1D54 +1508 +1D14 +06A2 +0FF8 +0888 +0FFA +0082 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+87FE +ENCODING 34814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10F0 +1120 +7FFC +5554 +559C +5578 +7DFC +5170 +1970 +16F8 +1E88 +64F8 +0088 +0000 +ENDCHAR +STARTCHAR U+87FF +ENCODING 34815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083C +7F24 +0825 +7F67 +4900 +7F7F +4922 +FF9C +4936 +7F63 +0100 +3FFC +2104 +3FFC +0102 +FFFD +ENDCHAR +STARTCHAR U+8800 +ENCODING 34816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +109F +1025 +7C8A +5511 +54FE +5482 +7CFE +1082 +10FE +1482 +14FE +7C44 +0183 +0000 +0000 +ENDCHAR +STARTCHAR U+8801 +ENCODING 34817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +37DF +6451 +D7D2 +7456 +27D1 +F411 +1457 +33D0 +E110 +3FFC +2104 +3FFC +0104 +01FE +FF03 +ENDCHAR +STARTCHAR U+8802 +ENCODING 34818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +7CA4 +55FE +54A4 +54BC +5480 +7CFF +1010 +15FF +1454 +7C92 +0111 +0000 +0000 +ENDCHAR +STARTCHAR U+8803 +ENCODING 34819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFE +2000 +3FF8 +0000 +1FF0 +1010 +1FF0 +711C +57D4 +7554 +57DC +7114 +5154 +57D4 +B022 +ENDCHAR +STARTCHAR U+8805 +ENCODING 34821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +12A8 +7FB8 +54A0 +55B8 +56A8 +7FB8 +52A8 +1BB8 +16A8 +1CA0 +6084 +007C +0000 +ENDCHAR +STARTCHAR U+8806 +ENCODING 34822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +1FF8 +1108 +1FF8 +1108 +7FFE +4122 +4FF2 +4012 +3FFC +2104 +3FFC +0102 +FFFD +ENDCHAR +STARTCHAR U+8808 +ENCODING 34824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E0C +220A +3EFF +2248 +3E48 +22E9 +3E4A +1445 +228A +1FFC +1084 +1FFC +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8809 +ENCODING 34825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FE +2152 +FD52 +A5FE +A400 +A7FF +A400 +FDFE +2102 +21FE +2861 +28B2 +7DAC +C723 +0020 +ENDCHAR +STARTCHAR U+880A +ENCODING 34826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FE +2288 +2A50 +FFFE +AA50 +AAFC +AA54 +ABFE +FA54 +A2FC +2A50 +3AD8 +CD54 +0652 +0850 +ENDCHAR +STARTCHAR U+880B +ENCODING 34827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23FE +2252 +FA52 +ABFE +A900 +ABFF +AA41 +FFF9 +2149 +2149 +29F9 +2851 +78FB +CB8A +0006 +ENDCHAR +STARTCHAR U+880C +ENCODING 34828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1129 +11FF +7C10 +54FE +5410 +55FF +7C44 +10FE +1410 +15FF +7C10 +0010 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+880D +ENCODING 34829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +13D0 +1250 +7FD0 +567C +57F4 +5518 +7FD0 +5350 +1F50 +16E8 +1FE8 +6244 +00C4 +0000 +ENDCHAR +STARTCHAR U+880E +ENCODING 34830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +09FC +0850 +3E20 +2BFC +2A50 +2AA8 +3FFC +2820 +0CA8 +0BFC +0E88 +7108 +0208 +0000 +ENDCHAR +STARTCHAR U+880F +ENCODING 34831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +11FC +1254 +7C94 +57EC +56C8 +56D8 +7FDC +52E8 +1AC8 +17FC +1C48 +6448 +08C8 +0000 +ENDCHAR +STARTCHAR U+8810 +ENCODING 34832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +F850 +AFAF +AAAA +AAAA +ADAD +A800 +F902 +21FE +2902 +29FE +7902 +CB02 +0602 +ENDCHAR +STARTCHAR U+8811 +ENCODING 34833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +11F4 +12F8 +7C90 +5568 +5644 +55FC +7D28 +5220 +1BFC +1470 +1CA8 +6324 +0020 +0000 +ENDCHAR +STARTCHAR U+8812 +ENCODING 34834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +2104 +7FFE +D52B +4912 +552A +4102 +552A +4912 +552A +0100 +3FFC +2104 +3FFC +0102 +FFFD +ENDCHAR +STARTCHAR U+8813 +ENCODING 34835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +2094 +27FE +2090 +FBFE +AA02 +ADF4 +A800 +AFFE +F840 +A3A4 +2878 +3BB0 +E868 +43A6 +0060 +ENDCHAR +STARTCHAR U+8814 +ENCODING 34836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FF +2000 +F9FC +A904 +A9FC +A800 +ABFF +AA01 +FAFD +2060 +29B2 +2854 +79B8 +C854 +03B3 +ENDCHAR +STARTCHAR U+8815 +ENCODING 34837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +3FFC +2B28 +2BAC +2BAC +3FFC +2820 +0DFC +0B54 +0F54 +7154 +010C +0000 +ENDCHAR +STARTCHAR U+8816 +ENCODING 34838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +09FC +0850 +3EFC +2BA0 +2AF8 +2AF8 +3EA0 +28FC +0DF8 +0A90 +0E60 +70F0 +030C +0000 +ENDCHAR +STARTCHAR U+8817 +ENCODING 34839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +10A5 +116B +7CA5 +5421 +54C6 +5490 +7DFF +1310 +11FE +1510 +15FE +7D10 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+8818 +ENCODING 34840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +208A +208B +23E9 +F888 +AFFF +A928 +A948 +ABF8 +AE4C +FA44 +23F4 +2A44 +2BF4 +7A45 +CA47 +03F2 +ENDCHAR +STARTCHAR U+8819 +ENCODING 34841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FF +2201 +F9FE +A8A4 +AB2B +A830 +A9FE +AB02 +F9FE +2102 +29FE +2902 +79FE +C884 +0303 +ENDCHAR +STARTCHAR U+881A +ENCODING 34842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +FFFF +0810 +0200 +FFFF +0800 +3FFC +C804 +0FFC +1010 +7E7E +5252 +7E7E +1414 +3E3E +E2E3 +ENDCHAR +STARTCHAR U+881B +ENCODING 34843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +13FE +1088 +7DFC +5554 +5554 +55FC +5428 +7DFE +5120 +1524 +1D98 +E552 +422A +0446 +ENDCHAR +STARTCHAR U+881C +ENCODING 34844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +2244 +F99F +2244 +700E +6A56 +A185 +2244 +2804 +FFFF +0910 +3FFC +E917 +0FF0 +0104 +7FFA +ENDCHAR +STARTCHAR U+881D +ENCODING 34845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1092 +1092 +7CFE +5492 +54FE +5400 +55EF +7DAD +11AD +15EF +15AD +7DAD +01EF +0000 +0000 +ENDCHAR +STARTCHAR U+881E +ENCODING 34846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +7EFF +4890 +FE7E +4242 +7E42 +4242 +7E42 +444E +7A40 +C100 +3FFC +2104 +3FFC +0102 +FFFD +ENDCHAR +STARTCHAR U+881F +ENCODING 34847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1092 +1124 +1092 +7DFE +5552 +552A +55FE +7D22 +1122 +11FA +1522 +1FFA +6122 +01BA +0261 +ENDCHAR +STARTCHAR U+8820 +ENCODING 34848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0400 +3FFE +2222 +23E2 +23E2 +2222 +3FFE +0808 +3E3E +2A2A +3E3E +0909 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+8821 +ENCODING 34849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +07E0 +0FC0 +7FFC +0790 +3BE0 +1DB0 +3E8C +0B20 +3EF8 +2AA8 +3EF8 +0E38 +71C4 +0000 +ENDCHAR +STARTCHAR U+8822 +ENCODING 34850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0FE0 +7FFC +07C0 +1C70 +67CC +07C0 +0820 +3EF8 +2AA8 +3EF8 +0E38 +71C4 +0000 +ENDCHAR +STARTCHAR U+8823 +ENCODING 34851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0950 +3FFC +2BF8 +2BA8 +2BF8 +3FA8 +29F8 +0DFC +0B34 +0FFC +7304 +050C +0000 +ENDCHAR +STARTCHAR U+8824 +ENCODING 34852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0220 +3FFE +2412 +380E +23E2 +3FFE +0808 +3E3E +2A2A +3E3E +0909 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+8825 +ENCODING 34853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4910 +7F10 +10FE +3E44 +22FE +3E10 +3EFE +2210 +3E90 +1FFC +1084 +1FFD +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8826 +ENCODING 34854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1038 +11FF +1121 +7DFC +553C +557C +5554 +557C +7D54 +117C +14FE +7CAA +05FF +0000 +0000 +ENDCHAR +STARTCHAR U+8827 +ENCODING 34855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0FE0 +3FFC +2FF8 +47E0 +1C20 +67E0 +0820 +3EF8 +2AA8 +3EF8 +0E38 +71C4 +0000 +ENDCHAR +STARTCHAR U+8828 +ENCODING 34856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +27FF +2088 +F820 +ABFE +A822 +AFFF +A822 +ABFE +F820 +22AA +2A22 +2BFE +7A72 +CEAA +0422 +ENDCHAR +STARTCHAR U+8829 +ENCODING 34857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1084 +13FF +7C05 +55E6 +541F +55E8 +7C12 +11EF +1529 +152F +7D29 +05EF +0129 +0000 +0000 +ENDCHAR +STARTCHAR U+882A +ENCODING 34858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087C +7F40 +227E +7F02 +3E7E +3E7C +227C +3E41 +46FF +1FFC +1084 +1FFD +0081 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+882B +ENCODING 34859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0201 +7C01 +2911 +7E11 +1711 +2A91 +1481 +0887 +0B08 +3E3E +2A2A +3E3E +0909 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+882C +ENCODING 34860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +13EF +1148 +13EF +7C01 +55EF +5528 +552F +55E8 +7D2F +112F +15E8 +7D29 +056F +0000 +0000 +ENDCHAR +STARTCHAR U+882D +ENCODING 34861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +60F8 +3188 +1670 +00CC +F723 +11FC +1020 +33FE +6820 +C7FF +1010 +7E7E +5252 +7E7E +1414 +FAFB +ENDCHAR +STARTCHAR U+882E +ENCODING 34862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23EE +228A +FAEB +AB50 +AAEE +AA4A +AAA4 +ABEB +F800 +23DF +2841 +2ADB +7945 +CA59 +00C3 +ENDCHAR +STARTCHAR U+882F +ENCODING 34863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +27FC +2C44 +27FC +27FC +2220 +2FFF +4428 +1F3E +152A +1F3E +0489 +3FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8830 +ENCODING 34864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +27FF +2000 +F9DC +A954 +A9DC +A888 +ABFE +F888 +23FE +2088 +2FFF +2848 +7B8A +C8E4 +0383 +ENDCHAR +STARTCHAR U+8831 +ENCODING 34865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0920 +0FF0 +3FF8 +0820 +3EF8 +3EF8 +0E38 +71C4 +1FF0 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8832 +ENCODING 34866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +45FE +2954 +FF54 +01FC +2884 +44FE +0144 +7FF4 +4554 +6554 +55F4 +4C54 +4474 +FF94 +0008 +ENDCHAR +STARTCHAR U+8833 +ENCODING 34867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13DE +1252 +13DE +1252 +7FDE +5652 +57DE +5652 +54A9 +7FFF +1050 +1420 +7C50 +078E +0000 +0000 +ENDCHAR +STARTCHAR U+8835 +ENCODING 34869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2222 +2222 +23FE +F910 +ABFE +AD20 +A9FE +A920 +F9FE +2120 +23FF +2A92 +2AFE +7B92 +CAF2 +0206 +ENDCHAR +STARTCHAR U+8836 +ENCODING 34870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +1450 +7FFC +1E74 +6FEC +0FE0 +0820 +0FE0 +3EF8 +2AA8 +3EF8 +0E38 +71C4 +0000 +ENDCHAR +STARTCHAR U+8837 +ENCODING 34871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +1129 +11EF +11EF +7D29 +55EF +5448 +54FF +5588 +7CFF +1088 +14FF +7C88 +04FF +0000 +0000 +ENDCHAR +STARTCHAR U+8838 +ENCODING 34872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +1044 +11EF +7D29 +55EF +5488 +55FF +5488 +7CFF +1088 +14FF +7C88 +04FF +0000 +0000 +ENDCHAR +STARTCHAR U+8839 +ENCODING 34873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0FE0 +0FE0 +3FFC +2FF8 +47E0 +3A20 +0BE0 +3EF8 +2AA8 +3EF8 +0E38 +71C4 +0000 +ENDCHAR +STARTCHAR U+883A +ENCODING 34874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3EFC +0810 +7EFE +1428 +2244 +FFFF +2004 +3FFC +2004 +3FFC +1010 +7E7E +5252 +7E7E +1414 +FAFB +ENDCHAR +STARTCHAR U+883B +ENCODING 34875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +17D4 +6BA8 +1798 +7C7C +3BB8 +36D4 +5394 +1FF0 +1110 +1FF0 +1110 +01F8 +3E08 +0000 +ENDCHAR +STARTCHAR U+883C +ENCODING 34876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27BC +26B4 +25AC +27BC +F940 +ABFC +AE40 +ABF8 +AA40 +FA7C +A000 +2BF8 +3910 +C8E0 +0110 +060E +ENDCHAR +STARTCHAR U+883D +ENCODING 34877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2514 +4692 +0A7F +1F90 +3212 +5F94 +1F89 +1215 +1FA3 +3E3E +2A2A +3E3E +0909 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+883E +ENCODING 34878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1102 +11FE +1198 +7D54 +55FE +55AA +55FE +55FF +7DFD +11A5 +16FD +7C21 +04FF +0000 +0000 +ENDCHAR +STARTCHAR U+883F +ENCODING 34879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1225 +3C79 +0915 +3F7D +7FFF +1225 +3C79 +0915 +3F7D +7FFF +3E3E +2A2A +3E3E +0909 +0000 +0000 +ENDCHAR +STARTCHAR U+8840 +ENCODING 34880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +0200 +1FF0 +1290 +1290 +1290 +1290 +1290 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8841 +ENCODING 34881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +2000 +2000 +2000 +1FFC +0100 +0200 +3FFC +2444 +2444 +2444 +2444 +FFFF +0000 +ENDCHAR +STARTCHAR U+8842 +ENCODING 34882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1048 +3F48 +2D48 +2DC8 +2D48 +2D68 +2D58 +2D4C +2F88 +3C88 +6108 +0230 +0000 +ENDCHAR +STARTCHAR U+8843 +ENCODING 34883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +19FF +1004 +7F0C +5518 +5530 +5558 +5596 +5512 +5511 +5510 +5790 +7C10 +C010 +0010 +0010 +ENDCHAR +STARTCHAR U+8844 +ENCODING 34884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1048 +3F48 +2D48 +2D48 +2DFC +2D48 +2D48 +2D48 +2FC8 +3C48 +61FC +0000 +0000 +ENDCHAR +STARTCHAR U+8845 +ENCODING 34885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0892 +1054 +7F54 +5510 +55FE +5510 +5510 +5514 +55FE +5510 +5790 +F810 +4010 +0010 +0010 +ENDCHAR +STARTCHAR U+8846 +ENCODING 34886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +1FF0 +1290 +1290 +7FFC +0040 +0988 +1790 +6160 +0940 +1130 +610C +0100 +0000 +ENDCHAR +STARTCHAR U+8848 +ENCODING 34888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +18FF +1042 +7F42 +557E +5542 +5542 +5542 +557E +5542 +5542 +57C2 +7C7F +C0C2 +0002 +0002 +ENDCHAR +STARTCHAR U+8849 +ENCODING 34889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1820 +107E +7F42 +55E6 +552C +5518 +553C +5566 +55C3 +557E +57C2 +7C42 +C042 +0042 +007E +ENDCHAR +STARTCHAR U+884A +ENCODING 34890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0848 +1848 +11FF +7F48 +55FE +5552 +5552 +55FE +5509 +55FF +5508 +57CA +7D6C +C119 +0135 +0263 +ENDCHAR +STARTCHAR U+884B +ENCODING 34891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFC +0104 +FFFF +0104 +3FFC +2120 +7FFE +4242 +7E7E +4242 +7E7E +0100 +3FFC +2244 +FFFF +ENDCHAR +STARTCHAR U+884C +ENCODING 34892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1000 +2400 +0400 +0BFC +0820 +1820 +2820 +4820 +0820 +0820 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+884D +ENCODING 34893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1178 +2100 +4800 +0C00 +12FC +1210 +3010 +5110 +1110 +1210 +1210 +1410 +1430 +0000 +ENDCHAR +STARTCHAR U+884E +ENCODING 34894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +37EF +6080 +C080 +0080 +1080 +37EF +6082 +E082 +2082 +2082 +2082 +2082 +2082 +2082 +2086 +ENDCHAR +STARTCHAR U+8851 +ENCODING 34897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +310F +6380 +C2C0 +0660 +1C30 +33CF +6002 +E002 +27E2 +2122 +2122 +2122 +2162 +2102 +2106 +ENDCHAR +STARTCHAR U+8852 +ENCODING 34898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1238 +2200 +4FC0 +0A00 +12FC +1C90 +3510 +5310 +1310 +1490 +1F50 +1050 +1030 +0000 +ENDCHAR +STARTCHAR U+8853 +ENCODING 34899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +11BC +2140 +4940 +0FC0 +113C +1188 +3588 +5548 +1548 +1548 +1908 +1108 +1118 +0000 +ENDCHAR +STARTCHAR U+8854 +ENCODING 34900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +093E +1100 +23C0 +4204 +0C7E +1388 +3108 +5108 +97C8 +1108 +1148 +1188 +1108 +1028 +1010 +ENDCHAR +STARTCHAR U+8855 +ENCODING 34901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3FFF +6820 +C820 +0BA0 +1820 +383F +6BA2 +EAA2 +2AA2 +2AA2 +2BA2 +2822 +2822 +2822 +2866 +ENDCHAR +STARTCHAR U+8856 +ENCODING 34902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1240 +324F +6240 +C240 +0FF0 +1240 +324F +6242 +E242 +2242 +2FF2 +2002 +2242 +2662 +2422 +2C36 +ENDCHAR +STARTCHAR U+8857 +ENCODING 34903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +113C +27C0 +4900 +0900 +17FC +1108 +3108 +57C8 +1108 +1108 +11C8 +1608 +1018 +0000 +ENDCHAR +STARTCHAR U+8858 +ENCODING 34904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1200 +320F +23E0 +6480 +C480 +1080 +37EF +2082 +6082 +E4F2 +2482 +2482 +24F2 +2782 +2C02 +2006 +ENDCHAR +STARTCHAR U+8859 +ENCODING 34905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1FF8 +2200 +4F80 +0A80 +12BC +1FD0 +3010 +5790 +1490 +1490 +1790 +1490 +1030 +0000 +ENDCHAR +STARTCHAR U+885A +ENCODING 34906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2400 +24F7 +6490 +4490 +DF90 +24F0 +249F +6492 +4E92 +CAF2 +4A92 +4A92 +4A92 +4A92 +4E92 +4136 +ENDCHAR +STARTCHAR U+885B +ENCODING 34907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +17B8 +2280 +4FC0 +087C +1790 +1490 +3790 +5110 +1790 +1510 +1FD0 +1110 +1130 +0000 +ENDCHAR +STARTCHAR U+885C +ENCODING 34908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1420 +366F +2240 +6FF0 +C100 +1200 +37EF +2422 +6422 +E7E2 +2422 +2422 +27E2 +2422 +2422 +27E6 +ENDCHAR +STARTCHAR U+885D +ENCODING 34909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10C0 +173C +2100 +4FC0 +0FFC +1548 +17C8 +3548 +57C8 +1108 +17C8 +1188 +1E08 +1018 +0000 +ENDCHAR +STARTCHAR U+885E +ENCODING 34910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +17FC +2240 +4FE0 +0FC0 +147C +17C8 +3FE8 +5108 +17C8 +1548 +1548 +15C8 +1118 +0000 +ENDCHAR +STARTCHAR U+885F +ENCODING 34911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +12A0 +32AF +2540 +6540 +C2A0 +12A0 +300F +27E2 +6202 +E7E2 +2422 +27E2 +2422 +27E2 +2422 +27E6 +ENDCHAR +STARTCHAR U+8860 +ENCODING 34912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1460 +358F +2610 +63F0 +C000 +1BE0 +3A2F +2BE2 +6A22 +EBE2 +2A22 +2BE2 +2802 +2FFA +2242 +2436 +ENDCHAR +STARTCHAR U+8861 +ENCODING 34913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +13BC +2480 +4900 +0FFC +1548 +37C8 +5548 +17C8 +1108 +1FE8 +1188 +1248 +1418 +0000 +ENDCHAR +STARTCHAR U+8862 +ENCODING 34914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1EFC +2AA0 +4EE0 +1EE0 +1ABC +2EE8 +27E8 +6C88 +37C8 +27C8 +2488 +27E8 +2418 +0000 +ENDCHAR +STARTCHAR U+8863 +ENCODING 34915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0100 +7FFC +0100 +0308 +0488 +1C90 +6460 +0440 +0420 +0590 +0608 +3804 +0000 +ENDCHAR +STARTCHAR U+8864 +ENCODING 34916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +1000 +1000 +0000 +FC00 +0800 +1000 +3400 +5800 +9400 +1000 +1000 +1000 +1000 +1000 +1000 +ENDCHAR +STARTCHAR U+8865 +ENCODING 34917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +0840 +0840 +0240 +FE40 +0440 +0860 +0A50 +1C4C +2A44 +4840 +8840 +0840 +0840 +0840 +0840 +ENDCHAR +STARTCHAR U+8867 +ENCODING 34919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +08FE +0010 +7E10 +0410 +08FF +1E10 +6810 +0C10 +0A10 +0810 +0810 +0850 +0820 +0000 +0000 +ENDCHAR +STARTCHAR U+8868 +ENCODING 34920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +1FF0 +0100 +7FFC +0310 +0490 +1CA0 +6440 +0420 +0710 +380C +0000 +ENDCHAR +STARTCHAR U+8869 +ENCODING 34921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +1004 +13FE +0004 +FD44 +08A8 +10A8 +3488 +5850 +9450 +1020 +1050 +1090 +1108 +1206 +1404 +ENDCHAR +STARTCHAR U+886A +ENCODING 34922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +2090 +1090 +7C90 +09FF +1091 +3491 +5892 +1890 +1490 +1081 +1081 +1081 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+886B +ENCODING 34923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0810 +0820 +7E28 +0448 +0590 +0910 +1E24 +2A44 +4988 +0808 +0810 +0860 +0980 +0000 +ENDCHAR +STARTCHAR U+886C +ENCODING 34924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1010 +1010 +0010 +FC14 +0BFE +1010 +3410 +5910 +9490 +1090 +1010 +1010 +1010 +1050 +1020 +ENDCHAR +STARTCHAR U+886D +ENCODING 34925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1010 +00FE +7C10 +0810 +1010 +35FF +5810 +1410 +1010 +1028 +1044 +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+886E +ENCODING 34926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0820 +1218 +224C +4424 +1FF0 +0200 +0618 +0D10 +14A0 +2440 +C530 +060E +0404 +ENDCHAR +STARTCHAR U+886F +ENCODING 34927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2028 +1044 +0082 +7D01 +0800 +11FE +3422 +5822 +1422 +1022 +1042 +1082 +1114 +1208 +0000 +0000 +ENDCHAR +STARTCHAR U+8870 +ENCODING 34928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0000 +0FE0 +0820 +7FFC +0820 +0FE0 +0310 +0D10 +74A0 +0440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+8871 +ENCODING 34929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1044 +FC4C +0448 +0C5E +1842 +10E2 +34A6 +78B4 +D49C +1188 +111C +1334 +1066 +10C3 +ENDCHAR +STARTCHAR U+8872 +ENCODING 34930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10C0 +1040 +1040 +7DF8 +0948 +0B48 +1348 +3DA8 +55A8 +1318 +1108 +1108 +1108 +1118 +0000 +ENDCHAR +STARTCHAR U+8874 +ENCODING 34932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +09FF +7D21 +0521 +0828 +1C28 +2A28 +4C28 +0A28 +0849 +0889 +0909 +0A0F +0000 +0000 +ENDCHAR +STARTCHAR U+8875 +ENCODING 34933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7D08 +0908 +0B08 +13F8 +3D08 +5508 +1308 +1108 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+8876 +ENCODING 34934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1010 +0010 +7DFF +0911 +1111 +3511 +59FF +1511 +1010 +1010 +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+8877 +ENCODING 34935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +0308 +0CB0 +74C0 +0440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+8879 +ENCODING 34937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +FD10 +0510 +0D10 +1910 +11FF +3510 +7918 +D508 +1108 +110C +1105 +11E7 +1702 +ENDCHAR +STARTCHAR U+887B +ENCODING 34939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FC +1084 +FC84 +0484 +0DFF +1884 +1084 +3484 +79FF +D484 +1084 +1084 +1084 +1084 +109C +ENDCHAR +STARTCHAR U+887C +ENCODING 34940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +2010 +11FF +7C10 +0810 +10FE +3482 +5844 +1428 +1010 +1028 +1044 +1082 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+887D +ENCODING 34941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1030 +11E0 +7C20 +0820 +0A20 +13FC +3C20 +5420 +1220 +1020 +1020 +11FC +1000 +0000 +ENDCHAR +STARTCHAR U+887E +ENCODING 34942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0C60 +77DC +0000 +1FF0 +0020 +0140 +7FFC +0310 +0CA0 +7440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+887F +ENCODING 34943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1060 +7CA0 +0890 +0BF8 +1204 +3C00 +55F8 +1210 +1010 +1020 +1020 +1020 +0000 +ENDCHAR +STARTCHAR U+8880 +ENCODING 34944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +FCFF +0481 +0D81 +1879 +1001 +3401 +7819 +D471 +10C1 +1003 +1002 +1006 +101C +ENDCHAR +STARTCHAR U+8881 +ENCODING 34945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0288 +0C88 +7450 +0460 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+8882 +ENCODING 34946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7DF8 +0848 +0A48 +1248 +3DFC +5440 +1260 +10A0 +1090 +1108 +1204 +0000 +ENDCHAR +STARTCHAR U+8883 +ENCODING 34947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107F +1011 +7F11 +1011 +1211 +1421 +1906 +0080 +7FFF +0C44 +14A8 +6510 +0608 +1C07 +0000 +0000 +ENDCHAR +STARTCHAR U+8884 +ENCODING 34948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1038 +13C0 +FC40 +0840 +1040 +1044 +37FE +5840 +9440 +1040 +10A0 +10A0 +1110 +120E +1404 +ENDCHAR +STARTCHAR U+8885 +ENCODING 34949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +1FF0 +1020 +1420 +12A0 +1044 +1FFE +0204 +0124 +FFF4 +0514 +0CA8 +1440 +653C +0608 +0400 +ENDCHAR +STARTCHAR U+8888 +ENCODING 34952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +10F8 +7E88 +1288 +1288 +22F8 +4D88 +0100 +7FFC +0310 +0CA0 +7440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+8889 +ENCODING 34953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1010 +01FF +7D01 +0501 +0840 +1040 +3442 +5844 +1478 +1040 +1040 +1041 +107F +0000 +0000 +ENDCHAR +STARTCHAR U+888B +ENCODING 34955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0290 +0488 +187C +6FC0 +0820 +0914 +090C +7FFC +0310 +0C90 +74A0 +0440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+888C +ENCODING 34956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0400 +0FF8 +3F88 +1088 +1FB8 +1002 +1FFE +0440 +0C24 +3518 +0608 +0C06 +0000 +0000 +ENDCHAR +STARTCHAR U+888D +ENCODING 34957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +7DF8 +0908 +0BE8 +1328 +3D28 +55E8 +1330 +1100 +1104 +1104 +10FC +0000 +ENDCHAR +STARTCHAR U+888E +ENCODING 34958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1004 +0044 +7C5F +0485 +0925 +11E5 +3445 +5885 +1525 +11E5 +1029 +1011 +1026 +0000 +0000 +ENDCHAR +STARTCHAR U+8891 +ENCODING 34961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +107F +0011 +7E11 +0411 +0821 +1A41 +2C06 +4A00 +087F +0841 +0841 +0841 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+8892 +ENCODING 34962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7D10 +0910 +0BF0 +1310 +3D10 +5510 +13F0 +1110 +1000 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+8893 +ENCODING 34963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +10FC +0084 +7C84 +0484 +08FC +1484 +3884 +5484 +10FC +1084 +1084 +1084 +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+8895 +ENCODING 34965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1010 +0010 +7DFF +0501 +0901 +1000 +3448 +5848 +1448 +1048 +1084 +1102 +1201 +0000 +0000 +ENDCHAR +STARTCHAR U+8896 +ENCODING 34966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1040 +7C40 +09F8 +0B48 +1348 +3D48 +55F8 +1348 +1148 +1148 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+8897 +ENCODING 34967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1060 +7CA0 +0890 +0B28 +1244 +3D90 +5420 +1248 +1190 +1020 +10C0 +1300 +0000 +ENDCHAR +STARTCHAR U+8898 +ENCODING 34968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1080 +FDFF +0500 +0D10 +1A96 +109A +34B2 +78D2 +D596 +1090 +1090 +1081 +10C3 +107E +ENDCHAR +STARTCHAR U+8899 +ENCODING 34969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1080 +7DF8 +0908 +0B08 +1308 +3DF8 +5508 +1308 +1108 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+889A +ENCODING 34970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +104C +1044 +FDFF +0440 +0C40 +1844 +10E4 +34AC +78A8 +D5B8 +1110 +1338 +166C +10C6 +1183 +ENDCHAR +STARTCHAR U+889B +ENCODING 34971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +101C +11F0 +FD10 +0510 +0D10 +19FF +1110 +3510 +7918 +D508 +11C8 +130D +1005 +13F7 +1002 +ENDCHAR +STARTCHAR U+889C +ENCODING 34972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3040 +1044 +07FE +FC40 +0840 +1048 +37FC +58E0 +94D0 +1148 +114E +1244 +1440 +1040 +1040 +ENDCHAR +STARTCHAR U+889E +ENCODING 34974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0460 +1818 +6FE4 +0820 +0820 +0FE0 +0688 +7C50 +0460 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+889F +ENCODING 34975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1090 +1090 +FCFE +0590 +0D10 +1810 +11FF +3410 +7810 +D438 +1228 +106C +1044 +10C6 +1183 +ENDCHAR +STARTCHAR U+88A0 +ENCODING 34976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +FFFF +1100 +1FF8 +2100 +FFFF +06C0 +0C60 +3838 +E28F +0EC4 +3868 +E830 +0F1C +3807 +ENDCHAR +STARTCHAR U+88A1 +ENCODING 34977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1010 +00FE +7C92 +0892 +10FE +3492 +5892 +15FF +1082 +1082 +1082 +108A +1084 +0000 +0000 +ENDCHAR +STARTCHAR U+88A2 +ENCODING 34978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +10A8 +10A4 +7D24 +08F8 +0A20 +1220 +3DFC +5420 +1220 +1020 +1020 +1020 +1020 +0000 +ENDCHAR +STARTCHAR U+88A4 +ENCODING 34980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0FE0 +0280 +7FFC +0330 +0D00 +7300 +0100 +7FFC +0390 +7C60 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88A7 +ENCODING 34983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +1080 +00FF +7C81 +0501 +08F9 +1089 +3489 +5889 +14F9 +1089 +1001 +1002 +100C +0000 +0000 +ENDCHAR +STARTCHAR U+88A8 +ENCODING 34984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +FDFF +0410 +0C30 +1860 +10C4 +346C +7838 +D410 +1030 +1062 +1042 +10DF +11F1 +ENDCHAR +STARTCHAR U+88AA +ENCODING 34986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +FCFE +0410 +0C10 +1810 +1010 +35FF +7820 +D420 +1064 +1044 +105E +10F2 +1183 +ENDCHAR +STARTCHAR U+88AB +ENCODING 34987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +1020 +7DFC +0928 +0B30 +13F8 +3D88 +5550 +1350 +1220 +1250 +1588 +1E04 +0000 +ENDCHAR +STARTCHAR U+88AC +ENCODING 34988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0220 +0410 +0FF8 +1417 +6410 +07F0 +0240 +0422 +0C14 +3508 +0604 +0C03 +0000 +0000 +ENDCHAR +STARTCHAR U+88AD +ENCODING 34989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +0228 +7FFC +0480 +04F0 +0B84 +107C +2200 +0104 +FFFE +0508 +0910 +38A0 +CA60 +0C1C +0808 +ENDCHAR +STARTCHAR U+88AE +ENCODING 34990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +1080 +1080 +7C80 +08FC +0B20 +1220 +3CB0 +54A8 +12A8 +1124 +1224 +1020 +1060 +0000 +ENDCHAR +STARTCHAR U+88B0 +ENCODING 34992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07F0 +0490 +7FFC +0910 +0890 +1FFC +0160 +0100 +7FFC +0388 +7C50 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88B1 +ENCODING 34993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10A8 +10A4 +7D24 +0920 +0BFC +1520 +3920 +5520 +1550 +1150 +1188 +1188 +1104 +0000 +ENDCHAR +STARTCHAR U+88B2 +ENCODING 34994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0200 +07E0 +1A40 +01A0 +1E7E +01A4 +0018 +07E0 +0444 +0C28 +3510 +060E +0000 +0000 +ENDCHAR +STARTCHAR U+88B4 +ENCODING 34996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +11FC +7C50 +0888 +0BFC +1200 +3DFC +5440 +1278 +1088 +1008 +1008 +1030 +0000 +ENDCHAR +STARTCHAR U+88B5 +ENCODING 34997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +108C +10F0 +7D10 +0910 +0B10 +1310 +3DFC +5510 +1310 +1110 +1110 +117C +1100 +0000 +ENDCHAR +STARTCHAR U+88B6 +ENCODING 34998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10FE +7D44 +0428 +0810 +1028 +35C7 +5810 +15FE +1090 +1090 +13FF +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+88B7 +ENCODING 34999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +10A0 +7CA0 +0910 +0BF8 +1204 +3C00 +55F0 +1310 +1110 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+88B8 +ENCODING 35000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +09FF +7C20 +0840 +109F +3581 +5886 +14BF +1084 +1084 +1084 +1084 +108C +0000 +0000 +ENDCHAR +STARTCHAR U+88B9 +ENCODING 35001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +09FF +0010 +7E20 +0440 +08FE +1A82 +2C82 +4AFE +0882 +0882 +0882 +08FE +0882 +0000 +0000 +ENDCHAR +STARTCHAR U+88BA +ENCODING 35002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +FDFF +0410 +0C10 +1810 +10FE +3400 +7800 +D4FE +1082 +1082 +1082 +1082 +10FE +ENDCHAR +STARTCHAR U+88BC +ENCODING 35004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +1088 +10FC +0188 +FD50 +0A20 +1050 +3488 +5B06 +95F8 +1108 +1108 +1108 +1108 +11F8 +1108 +ENDCHAR +STARTCHAR U+88BD +ENCODING 35005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +208F +F889 +0FE9 +1929 +3129 +2129 +6B29 +B269 +2A49 +27C9 +20A9 +21A9 +230F +2600 +ENDCHAR +STARTCHAR U+88BE +ENCODING 35006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1050 +1050 +FCFE +0490 +0D90 +1810 +11FF +3454 +7854 +D454 +10D6 +1092 +1193 +1010 +1010 +ENDCHAR +STARTCHAR U+88BF +ENCODING 35007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +11F8 +7C40 +0840 +0BFC +1240 +3C40 +55F8 +1240 +1040 +1040 +13FC +1000 +0000 +ENDCHAR +STARTCHAR U+88C0 +ENCODING 35008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +FD11 +0511 +0D7D +1911 +1111 +3539 +7929 +D529 +1145 +1101 +1101 +11FF +1000 +ENDCHAR +STARTCHAR U+88C1 +ENCODING 35009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +3F48 +0848 +7FFC +0840 +7F48 +0848 +1950 +3630 +5224 +1554 +198C +6004 +0000 +ENDCHAR +STARTCHAR U+88C2 +ENCODING 35010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3FC8 +0848 +0F48 +1948 +2648 +0D48 +3118 +7FFC +0310 +0CA0 +74C0 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88C3 +ENCODING 35011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1078 +7C40 +0840 +0BFC +1200 +3DFC +5440 +1270 +1048 +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+88C4 +ENCODING 35012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10B8 +1100 +7E00 +0880 +08FC +1510 +3910 +5710 +1510 +1110 +1110 +1110 +1130 +0000 +ENDCHAR +STARTCHAR U+88C5 +ENCODING 35013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +2440 +17FC +0440 +1C40 +65F8 +0500 +0100 +7FFC +0490 +1C90 +6460 +0730 +180C +0000 +ENDCHAR +STARTCHAR U+88C6 +ENCODING 35014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +1124 +00AC +FCB0 +0824 +11FE +3404 +5804 +9404 +11FC +1004 +1004 +1004 +13FC +1004 +ENDCHAR +STARTCHAR U+88C9 +ENCODING 35017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +11FC +1108 +0108 +FDF8 +0908 +1108 +35F8 +5944 +9548 +1130 +1120 +1110 +114E +1184 +1100 +ENDCHAR +STARTCHAR U+88CA +ENCODING 35018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FF8 +2008 +3FF8 +2008 +3FFF +2000 +3FFE +0002 +010E +FFFF +0444 +1868 +E830 +0F1C +7807 +ENDCHAR +STARTCHAR U+88CB +ENCODING 35019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1000 +FC00 +04FC +0C84 +1884 +1084 +34FC +7800 +D484 +10CC +1048 +1008 +13FF +1000 +ENDCHAR +STARTCHAR U+88CC +ENCODING 35020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FC10 +0492 +0C92 +1892 +1155 +3555 +7838 +D428 +1228 +106C +1044 +10C6 +1183 +ENDCHAR +STARTCHAR U+88CD +ENCODING 35021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +FD11 +0511 +0D7D +1911 +1139 +3539 +7955 +D555 +1111 +1111 +1101 +11FF +1000 +ENDCHAR +STARTCHAR U+88CE +ENCODING 35022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +11FE +1104 +0104 +FD04 +09FC +1000 +35FC +5820 +9420 +11FC +1020 +1020 +1024 +17FE +1000 +ENDCHAR +STARTCHAR U+88CF +ENCODING 35023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0FE0 +0920 +0FE0 +0920 +0FE0 +3FF8 +0100 +7FFC +0C90 +7460 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88D0 +ENCODING 35024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +207E +1042 +0842 +7E7E +0400 +08FF +1281 +34FF +5881 +14FF +1281 +1081 +1081 +1103 +0000 +0000 +ENDCHAR +STARTCHAR U+88D1 +ENCODING 35025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +10FC +FC84 +0484 +0CFC +1884 +1284 +34FC +7884 +D487 +13FC +1014 +1064 +1384 +101C +ENDCHAR +STARTCHAR U+88D2 +ENCODING 35026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFE +0210 +1CF8 +1010 +1010 +1CF0 +1010 +1010 +1FF0 +0508 +0890 +1860 +2A30 +CC0E +0804 +ENDCHAR +STARTCHAR U+88D3 +ENCODING 35027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +1012 +1010 +FDFF +0410 +0D50 +1952 +1152 +37F6 +7954 +D55C +1148 +111D +1235 +1067 +11C2 +ENDCHAR +STARTCHAR U+88D4 +ENCODING 35028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0288 +0C50 +7460 +0730 +380C +3FF8 +2498 +2878 +37C8 +2448 +27C8 +2018 +0000 +ENDCHAR +STARTCHAR U+88D5 +ENCODING 35029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +1090 +1108 +7E48 +0840 +0AA0 +14A0 +1910 +37F8 +5514 +1110 +1110 +11F0 +1110 +0000 +ENDCHAR +STARTCHAR U+88D6 +ENCODING 35030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FE +1100 +097E +7D00 +05FE +0900 +1140 +3540 +5952 +1554 +1148 +1254 +1462 +10C1 +0000 +0000 +ENDCHAR +STARTCHAR U+88D7 +ENCODING 35031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1020 +03FF +7C20 +0444 +09FE +1000 +3524 +5924 +1524 +1124 +1124 +1124 +1207 +0000 +0000 +ENDCHAR +STARTCHAR U+88D8 +ENCODING 35032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +7FFC +0108 +39B0 +0760 +1918 +6304 +0100 +7FFC +0310 +0CA0 +7440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88D9 +ENCODING 35033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1048 +7C48 +0BFC +0848 +13F8 +3C80 +54F8 +1388 +1288 +1488 +10F8 +1088 +0000 +ENDCHAR +STARTCHAR U+88DA +ENCODING 35034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +087C +7F40 +0A7F +0C48 +7888 +0908 +1888 +7FFF +0C42 +1424 +2498 +4508 +0E07 +0000 +0000 +ENDCHAR +STARTCHAR U+88DB +ENCODING 35035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +0000 +1FF8 +1008 +3FFC +2104 +3FFC +2000 +3002 +1FFE +02C4 +0E68 +F830 +0F1C +7807 +ENDCHAR +STARTCHAR U+88DC +ENCODING 35036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1048 +13FC +7C40 +0BF8 +0A48 +1648 +3BF8 +5648 +1648 +13F8 +1248 +1248 +1258 +0000 +ENDCHAR +STARTCHAR U+88DD +ENCODING 35037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2440 +2440 +3FFC +0440 +7C40 +25F8 +4500 +0100 +7FFC +0310 +0CA0 +7440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88DE +ENCODING 35038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +1186 +1084 +FDFE +0502 +0D02 +1902 +1102 +35FE +7848 +D448 +1048 +10C8 +1089 +1189 +1307 +ENDCHAR +STARTCHAR U+88DF +ENCODING 35039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0950 +4948 +224C +2CD4 +0860 +1780 +2100 +7FFC +0290 +0C90 +7460 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88E1 +ENCODING 35041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +7E48 +0BF8 +0A48 +1648 +1BF8 +3440 +57F8 +1040 +1040 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+88E2 +ENCODING 35042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2420 +2228 +02FC +F840 +1050 +2690 +2AFC +7210 +AA14 +22FE +2210 +2210 +2516 +28FC +2000 +ENDCHAR +STARTCHAR U+88E3 +ENCODING 35043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1040 +10A0 +0110 +FD10 +0A28 +15F6 +3400 +5A48 +9548 +1148 +1150 +1150 +1024 +17FE +1000 +ENDCHAR +STARTCHAR U+88E4 +ENCODING 35044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +3024 +13FE +0240 +FE48 +0BFC +1280 +3728 +5BFC +9620 +1224 +13FE +1220 +1420 +1820 +1020 +ENDCHAR +STARTCHAR U+88E5 +ENCODING 35045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2204 +11BE +1084 +0204 +FE04 +0AF4 +1294 +3694 +5AF4 +9694 +1294 +12F4 +1204 +1204 +1214 +1208 +ENDCHAR +STARTCHAR U+88E7 +ENCODING 35047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1091 +1093 +FDBA +0528 +0C6C +18C6 +1193 +3410 +7891 +D493 +11BA +1128 +106C +10C6 +1183 +ENDCHAR +STARTCHAR U+88E8 +ENCODING 35048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +11F8 +7D48 +0948 +0BF8 +1348 +1DF8 +3450 +5290 +13FC +1010 +1010 +1010 +0000 +ENDCHAR +STARTCHAR U+88EB +ENCODING 35051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2101 +1129 +0929 +7D29 +0529 +09EF +1101 +31FF +5D01 +11EF +1D29 +1129 +1129 +1229 +0000 +0000 +ENDCHAR +STARTCHAR U+88EC +ENCODING 35052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1010 +00FE +7810 +09FF +1082 +3542 +5A43 +14FE +1104 +1028 +1010 +106C +1383 +0000 +0000 +ENDCHAR +STARTCHAR U+88EE +ENCODING 35054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FE +1102 +01FE +7902 +09FE +1000 +3BFF +5601 +1201 +1BFF +1601 +1201 +13FF +1201 +0000 +0000 +ENDCHAR +STARTCHAR U+88EF +ENCODING 35055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +FD11 +057D +0D11 +1911 +117D +3501 +797D +D545 +1145 +117D +1101 +1101 +1207 +ENDCHAR +STARTCHAR U+88F0 +ENCODING 35056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +2FFC +2084 +0528 +FA10 +1528 +20C4 +6800 +B7BC +2884 +24C4 +2528 +2210 +2528 +28CE +3084 +ENDCHAR +STARTCHAR U+88F1 +ENCODING 35057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1040 +1048 +03FC +FC40 +09F8 +1040 +37FE +5844 +94A8 +1130 +1320 +1510 +1148 +118E +1104 +ENDCHAR +STARTCHAR U+88F2 +ENCODING 35058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +1040 +7FF8 +0A48 +0BF8 +16D8 +3AD8 +56D8 +1768 +1248 +1248 +1248 +1218 +0000 +ENDCHAR +STARTCHAR U+88F3 +ENCODING 35059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0920 +3FFC +2008 +4FE0 +0820 +0FE0 +0100 +7FFC +0290 +0CA0 +7440 +0730 +180C +0000 +ENDCHAR +STARTCHAR U+88F4 +ENCODING 35060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +7E7C +0240 +3E78 +0340 +7E7C +0440 +0940 +7FFC +0310 +0CA0 +7440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88F5 +ENCODING 35061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0220 +7E3F +0220 +3E3E +03A0 +7E3F +0420 +09A0 +3244 +0628 +1A10 +620C +03E3 +1C00 +ENDCHAR +STARTCHAR U+88F6 +ENCODING 35062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +0848 +0048 +7FCF +0848 +1048 +37CF +5848 +1448 +13CF +1048 +1048 +1088 +1108 +0000 +0000 +ENDCHAR +STARTCHAR U+88F7 +ENCODING 35063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1122 +10A4 +FC20 +05FE +0C48 +1848 +13FF +3484 +7902 +DAFD +1404 +10FC +1080 +1082 +107E +ENDCHAR +STARTCHAR U+88F8 +ENCODING 35064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1248 +7E48 +0BF8 +0A48 +17F8 +1840 +37FC +54E0 +1150 +1248 +1444 +1040 +0000 +ENDCHAR +STARTCHAR U+88F9 +ENCODING 35065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0FE0 +0920 +0FE0 +0920 +0FE0 +7FFC +1130 +6328 +0CC4 +7440 +0730 +180C +0000 +ENDCHAR +STARTCHAR U+88FA +ENCODING 35066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2020 +03FE +7C88 +0504 +0A22 +15FD +3524 +59FC +1524 +11FC +1021 +1021 +103F +0000 +0000 +ENDCHAR +STARTCHAR U+88FB +ENCODING 35067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +07BE +0422 +7FE2 +0E14 +1508 +24B6 +0080 +7FFF +0488 +0C50 +3520 +0610 +040E +0000 +0000 +ENDCHAR +STARTCHAR U+88FC +ENCODING 35068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7DF8 +0908 +0BF8 +1280 +3CFC +5554 +1254 +1494 +1124 +1044 +1018 +0000 +ENDCHAR +STARTCHAR U+88FD +ENCODING 35069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1408 +1F48 +2448 +7FC8 +3FC8 +24C8 +2718 +0100 +7FFC +0310 +0CA0 +7440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+88FE +ENCODING 35070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7DF8 +0920 +0B20 +13FC +1D20 +3520 +53F8 +1288 +1288 +14F8 +1088 +0000 +ENDCHAR +STARTCHAR U+8901 +ENCODING 35073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFC +2104 +3FFC +2104 +3FFC +0100 +FFFF +0520 +1918 +E107 +028C +0ED8 +F870 +0F1C +7807 +ENDCHAR +STARTCHAR U+8902 +ENCODING 35074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +13F0 +7C90 +0890 +0BF8 +1494 +1894 +37F0 +5490 +1090 +10F0 +1390 +1010 +0000 +ENDCHAR +STARTCHAR U+8904 +ENCODING 35076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1040 +7DF8 +0848 +0BFC +1448 +19F8 +3440 +57FC +1090 +11E0 +1070 +1388 +0000 +ENDCHAR +STARTCHAR U+8905 +ENCODING 35077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +11FF +0044 +7C44 +09FF +1111 +3111 +54FE +1892 +1492 +1096 +1010 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+8906 +ENCODING 35078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1082 +FCFE +0482 +0C82 +18FE +1000 +35FF +7810 +D490 +109E +1090 +11D0 +1370 +161F +ENDCHAR +STARTCHAR U+8907 +ENCODING 35079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1100 +13FC +7DF0 +0910 +0BF0 +1310 +1DF0 +3480 +51F0 +16A0 +1040 +11B0 +160C +0000 +ENDCHAR +STARTCHAR U+8909 +ENCODING 35081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +13EF +0085 +7FE5 +0885 +13E5 +348A +5800 +1420 +13FE +1020 +1050 +1088 +1306 +0000 +0000 +ENDCHAR +STARTCHAR U+890A +ENCODING 35082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E0 +1200 +7FF8 +0A08 +0BF8 +1600 +1BF8 +36A8 +56A8 +17F8 +1AA8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+890B +ENCODING 35083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2148 +1148 +03FE +7D48 +0978 +1100 +35FE +5820 +17FE +10A8 +1124 +1222 +1020 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+890C +ENCODING 35084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1248 +7FFC +0840 +0BF8 +1548 +19F8 +3548 +55F8 +1040 +13FC +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+890D +ENCODING 35085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1111 +1111 +FD11 +05FF +0C00 +19FF +1010 +3420 +79FF +D549 +1149 +1149 +1149 +1149 +114B +ENDCHAR +STARTCHAR U+890E +ENCODING 35086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +0000 +0C1C +78F0 +4010 +7DFF +4054 +40D6 +7D93 +0010 +038C +0ED8 +F870 +0F1C +7807 +ENDCHAR +STARTCHAR U+890F +ENCODING 35087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +0020 +0C20 +79FE +4122 +7D22 +41FE +4122 +7DFE +0000 +038C +0ED8 +F870 +0F1C +7807 +ENDCHAR +STARTCHAR U+8910 +ENCODING 35088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +7DF0 +0910 +0BF0 +1480 +19F8 +3728 +55C8 +1108 +1128 +10E8 +1030 +0000 +ENDCHAR +STARTCHAR U+8911 +ENCODING 35089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FC +10A8 +7D24 +0A22 +11FC +3440 +5BFE +1480 +11FC +1288 +1450 +1020 +1050 +178F +0000 +0000 +ENDCHAR +STARTCHAR U+8912 +ENCODING 35090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +09F0 +0910 +11F0 +77FC +1150 +164C +1140 +0310 +0CA0 +7440 +0730 +180C +0000 +ENDCHAR +STARTCHAR U+8913 +ENCODING 35091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +10F8 +10C8 +7D48 +0948 +0B78 +1520 +39FC +5570 +1570 +11A8 +1124 +1120 +1120 +0000 +ENDCHAR +STARTCHAR U+8914 +ENCODING 35092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +1000 +00FE +7C82 +0882 +10FE +3400 +59FF +1511 +1111 +11FF +1111 +1111 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+8915 +ENCODING 35093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1070 +10D8 +FD8C +0777 +0C00 +19E2 +112A +352A +79EA +D52A +112A +11E2 +1122 +1122 +1166 +ENDCHAR +STARTCHAR U+8916 +ENCODING 35094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1004 +FDFC +0404 +0FFF +1840 +10A2 +3534 +7858 +D490 +1138 +1054 +1092 +1111 +1060 +ENDCHAR +STARTCHAR U+8917 +ENCODING 35095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FF +1200 +02FE +7E82 +06FE +0A82 +12FE +3644 +5BFF +1644 +1228 +1210 +12EE +13FF +0000 +0000 +ENDCHAR +STARTCHAR U+8918 +ENCODING 35096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FC +7C44 +07FF +0800 +09FC +1504 +39FC +5420 +13FE +1120 +17FF +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+8919 +ENCODING 35097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +1094 +1398 +0090 +FC92 +0B8E +1008 +35FC +5908 +95F8 +1108 +11F8 +1108 +1108 +1128 +1110 +ENDCHAR +STARTCHAR U+891A +ENCODING 35098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +1080 +1088 +03F8 +FC90 +08A4 +13FE +3440 +59F8 +9508 +1308 +15F8 +1908 +1108 +11F8 +1108 +ENDCHAR +STARTCHAR U+891B +ENCODING 35099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1248 +1150 +0044 +FFFE +0950 +1248 +3446 +5880 +97FE +1910 +1210 +11A0 +1040 +11B0 +160C +ENDCHAR +STARTCHAR U+891C +ENCODING 35100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C80 +44FE +4502 +7DF2 +4612 +7CF2 +448E +C4C1 +9C7F +0100 +FFFF +0444 +1868 +E830 +0F1C +7807 +ENDCHAR +STARTCHAR U+891D +ENCODING 35101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1088 +1248 +1150 +7D20 +09F8 +0B48 +15F8 +1948 +35F8 +5440 +17FC +1040 +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+891E +ENCODING 35102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1150 +7D50 +09B0 +0B10 +15F0 +3800 +57F8 +12A8 +12A8 +12A8 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+891F +ENCODING 35103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +41FE +2102 +01FE +7D02 +09FE +1000 +31EF +5421 +1929 +14A5 +1063 +11AD +1021 +10C6 +0000 +0000 +ENDCHAR +STARTCHAR U+8920 +ENCODING 35104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +1048 +13FF +FC48 +05FE +0C48 +1BFF +1020 +35FE +7922 +D5FE +1122 +13FF +1122 +1122 +112E +ENDCHAR +STARTCHAR U+8921 +ENCODING 35105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +1114 +17FE +0110 +FC40 +08A0 +1110 +3A08 +55F6 +9800 +13F8 +1208 +1208 +1208 +13F8 +1208 +ENDCHAR +STARTCHAR U+8922 +ENCODING 35106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0FF8 +1888 +2FF8 +0888 +0FF8 +02A4 +04FD +0881 +30FF +0C48 +1430 +271E +0000 +0000 +ENDCHAR +STARTCHAR U+8923 +ENCODING 35107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +17FF +0401 +7C89 +0904 +1252 +3888 +5504 +1202 +19FC +1504 +1104 +11FC +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+8925 +ENCODING 35109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +12F8 +7E00 +0BFC +0AA8 +16F0 +3B8C +5610 +17FC +1290 +1450 +1810 +1030 +0000 +ENDCHAR +STARTCHAR U+8926 +ENCODING 35110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2116 +235C +FA50 +0FB1 +1813 +33CE +2240 +6A40 +B3D0 +2A56 +225C +23D0 +2251 +2253 +22CE +ENDCHAR +STARTCHAR U+8927 +ENCODING 35111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE10 +4491 +7C93 +45BA +7D28 +446C +7CC6 +C483 +0100 +FFFF +0444 +1868 +E830 +0F1C +7807 +ENDCHAR +STARTCHAR U+8928 +ENCODING 35112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1048 +11FE +FC20 +0420 +0CFC +1820 +1020 +35FE +7820 +D440 +10FE +1190 +1010 +1010 +11FF +ENDCHAR +STARTCHAR U+8929 +ENCODING 35113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083C +3F25 +2947 +253E +7F94 +2908 +2514 +4363 +0080 +7FFF +0C44 +1428 +2450 +470E +0000 +0000 +ENDCHAR +STARTCHAR U+892A +ENCODING 35114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1178 +1148 +7C48 +0A78 +0948 +157C +3844 +5758 +1548 +1174 +11C4 +12C0 +143C +0000 +ENDCHAR +STARTCHAR U+892B +ENCODING 35115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +13E0 +1238 +7E20 +0AFC +0AB8 +16E4 +1A9C +36F0 +52D0 +1550 +1554 +1A94 +110C +0000 +ENDCHAR +STARTCHAR U+892C +ENCODING 35116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20F8 +1050 +0020 +7CD8 +0800 +17DF +3A8A +5104 +16DB +1820 +17FF +10A8 +1124 +1222 +0000 +0000 +ENDCHAR +STARTCHAR U+892D +ENCODING 35117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0FF8 +0FF8 +0840 +0FF8 +0840 +0FFE +2492 +124A +0444 +0C28 +1510 +060E +0000 +0000 +ENDCHAR +STARTCHAR U+892E +ENCODING 35118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4949 +2A2A +0808 +1414 +2222 +0000 +7FFF +4081 +1FFC +0400 +0C44 +3428 +0410 +070E +0000 +0000 +ENDCHAR +STARTCHAR U+892F +ENCODING 35119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1010 +03FF +7E44 +0BFF +1244 +367C +5A10 +16FE +1292 +1292 +1296 +1410 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+8930 +ENCODING 35120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4442 +9FF4 +0440 +1FF0 +0444 +FFFE +0920 +1FF0 +221E +C4A4 +0C40 +3520 +061C +0408 +ENDCHAR +STARTCHAR U+8931 +ENCODING 35121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +0000 +3FFC +2444 +3FFC +0100 +3D3C +0100 +3D3C +0102 +0CC6 +386C +E830 +0F1C +3807 +ENDCHAR +STARTCHAR U+8932 +ENCODING 35122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +11FF +FD00 +0510 +0DFF +1910 +117E +3552 +797E +D552 +117E +1310 +12FF +1610 +1010 +ENDCHAR +STARTCHAR U+8933 +ENCODING 35123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +113E +0088 +783E +0BAA +10AA +393E +522A +192A +10BE +1088 +10BE +1188 +127F +0000 +0000 +ENDCHAR +STARTCHAR U+8934 +ENCODING 35124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +1290 +1294 +02BE +FEA0 +0AD0 +1288 +3480 +5804 +97FE +1294 +1294 +1294 +1294 +17FE +1000 +ENDCHAR +STARTCHAR U+8935 +ENCODING 35125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +11FF +FC00 +04AA +0C92 +18AA +1082 +34FE +7810 +D5FF +1121 +1129 +1175 +1101 +1103 +ENDCHAR +STARTCHAR U+8936 +ENCODING 35126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +10CC +7D54 +0AEC +0954 +1664 +1880 +35F8 +5508 +11F8 +1108 +11F8 +1108 +0000 +ENDCHAR +STARTCHAR U+8937 +ENCODING 35127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +1088 +08AE +7928 +0AA8 +14FF +3108 +5B08 +1528 +192F +1528 +1128 +1158 +118F +0000 +0000 +ENDCHAR +STARTCHAR U+8938 +ENCODING 35128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +11F8 +1148 +7FFC +0948 +09F8 +15F8 +3948 +55F8 +17FC +1090 +11E0 +1070 +1388 +0000 +ENDCHAR +STARTCHAR U+8939 +ENCODING 35129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2108 +27C8 +F908 +093E +1FCA +328A +228A +6CEA +B11A +290E +27CA +211A +2112 +27D2 +2033 +ENDCHAR +STARTCHAR U+893A +ENCODING 35130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7F10 +087C +FF94 +2254 +7F34 +082D +7F65 +08C3 +0100 +FFFF +0444 +1868 +E830 +0F1C +7807 +ENDCHAR +STARTCHAR U+893B +ENCODING 35131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0840 +3EF0 +7F50 +2DD0 +4B70 +3E54 +0E94 +318C +0690 +7C60 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+893C +ENCODING 35132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +2050 +13FE +7A52 +0BFE +1020 +3BFE +5488 +1904 +16FB +1088 +10F2 +1082 +10FE +0000 +0000 +ENDCHAR +STARTCHAR U+893D +ENCODING 35133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F84 +4084 +7FBE +5F04 +7FA4 +4414 +5504 +6494 +8588 +FFFE +1444 +24A8 +C510 +0E0E +0000 +0000 +ENDCHAR +STARTCHAR U+893E +ENCODING 35134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1048 +FDFF +0549 +0D49 +19FF +1000 +34FE +7800 +D5FF +1010 +1094 +1196 +1313 +1070 +ENDCHAR +STARTCHAR U+8940 +ENCODING 35136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1010 +FCFE +0410 +0DFF +1800 +10FE +3482 +78FE +D482 +10FE +1082 +10FE +1044 +1183 +ENDCHAR +STARTCHAR U+8941 +ENCODING 35137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2020 +2730 +2148 +79FC +1724 +14F8 +2CA8 +37A8 +6DF8 +29A8 +2130 +2128 +21F4 +2604 +0000 +ENDCHAR +STARTCHAR U+8942 +ENCODING 35138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1048 +1078 +FC84 +0529 +0DEF +1810 +1028 +3444 +7993 +D420 +10C8 +1036 +10CC +1038 +11E0 +ENDCHAR +STARTCHAR U+8943 +ENCODING 35139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +04F8 +3888 +20F8 +3DFC +2070 +3DAC +2120 +0310 +0CA0 +7440 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+8944 +ENCODING 35140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +1EF0 +1290 +1EF0 +0440 +3FF8 +1FF0 +0440 +7FFC +0690 +7C60 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+8945 +ENCODING 35141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1111 +FDFF +0511 +0DFF +1892 +1092 +35FF +7892 +D492 +11FF +1010 +11FF +1010 +1010 +ENDCHAR +STARTCHAR U+8946 +ENCODING 35142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +1129 +10AA +FC28 +05FF +0C82 +1844 +10FE +3410 +78FE +D410 +11FF +1028 +106C +10C6 +1183 +ENDCHAR +STARTCHAR U+8949 +ENCODING 35145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11EF +1129 +FDEF +0529 +0DEF +1901 +117D +3545 +7945 +D57D +1145 +1145 +117D +1101 +1103 +ENDCHAR +STARTCHAR U+894B +ENCODING 35147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +1084 +0BFF +7C84 +0BFF +12B5 +32B5 +5EB5 +1084 +1DC4 +12AE +1495 +1084 +1084 +0000 +0000 +ENDCHAR +STARTCHAR U+894C +ENCODING 35148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +12A8 +7FB8 +0800 +0BF0 +1550 +19F0 +3550 +55F0 +1040 +17FC +1040 +1040 +0000 +ENDCHAR +STARTCHAR U+894D +ENCODING 35149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +10A0 +11FC +7F20 +09F8 +0BF8 +1520 +39FC +5440 +17FC +10E0 +1150 +164C +1040 +0000 +ENDCHAR +STARTCHAR U+894F +ENCODING 35151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21E4 +2029 +2352 +F88C +0F03 +1800 +339C +2094 +6B95 +B223 +2B80 +20FF +20A2 +2094 +2188 +2377 +ENDCHAR +STARTCHAR U+8950 +ENCODING 35152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +10FE +0904 +7DFF +0911 +11FF +3040 +5CA2 +1134 +1E4C +109A +1129 +1048 +1098 +0000 +0000 +ENDCHAR +STARTCHAR U+8951 +ENCODING 35153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FE +1002 +08FE +0002 +7DFE +0800 +11EF +3089 +5DEF +1004 +1DFF +1084 +1044 +100C +0000 +0000 +ENDCHAR +STARTCHAR U+8952 +ENCODING 35154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +2494 +26B7 +FAAD +0889 +1FF5 +3495 +2495 +6C97 +B5D2 +2EB2 +2492 +2496 +2495 +2495 +2439 +ENDCHAR +STARTCHAR U+8953 +ENCODING 35155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +10FE +0810 +7DFF +0844 +11EF +3044 +5DEF +1000 +1DFF +1048 +1048 +1089 +110F +0000 +0000 +ENDCHAR +STARTCHAR U+8956 +ENCODING 35158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +13F8 +7F58 +0AE8 +0BF8 +16E8 +1B58 +3648 +57FC +1040 +10A0 +1310 +1C0C +0000 +ENDCHAR +STARTCHAR U+8957 +ENCODING 35159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1152 +FDFE +0420 +0DFE +1820 +13FF +3484 +7848 +D5FF +1020 +11FE +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+8958 +ENCODING 35160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4070 +2088 +0174 +7A02 +0FFF +12AA +3272 +5BFE +1400 +19FC +1504 +11FC +1104 +11FC +0000 +0000 +ENDCHAR +STARTCHAR U+8959 +ENCODING 35161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +40F8 +2088 +00F8 +7C00 +0BDE +1252 +3BDE +5420 +1BFE +14A8 +1124 +1222 +1421 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+895A +ENCODING 35162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2042 +2066 +2224 +FBFF +0910 +1821 +3053 +2012 +6B28 +B14C +291A +2129 +2148 +2318 +2280 +267F +ENDCHAR +STARTCHAR U+895B +ENCODING 35163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +10FE +10AA +FCFE +04AA +0CFE +1800 +11FF +3500 +797E +D500 +11FF +1152 +115A +126C +10C7 +ENDCHAR +STARTCHAR U+895C +ENCODING 35164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1078 +1090 +13FF +FD24 +05C7 +0D3C +1900 +11FF +3500 +793C +D500 +113C +1100 +117E +1242 +107E +ENDCHAR +STARTCHAR U+895D +ENCODING 35165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2050 +1088 +7D04 +0A02 +14F9 +3000 +5BDE +1252 +1BDE +1000 +1104 +128A +1451 +0000 +0000 +ENDCHAR +STARTCHAR U+895E +ENCODING 35166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FFC +2288 +3E50 +21FC +3E20 +53FC +1E20 +1120 +7FFC +0690 +7C60 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+895F +ENCODING 35167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +13FC +7CD0 +09B8 +0AD4 +1490 +19F8 +3400 +57FC +1128 +1124 +1224 +1060 +0000 +ENDCHAR +STARTCHAR U+8960 +ENCODING 35168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1150 +13FC +7E08 +09F0 +0B10 +15F0 +1800 +37F8 +5648 +13F8 +1248 +13F8 +1208 +0000 +ENDCHAR +STARTCHAR U+8961 +ENCODING 35169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1152 +FD52 +05FE +0C40 +18FF +11A1 +34F9 +78A9 +D4A9 +12F9 +1029 +107B +11CA +1006 +ENDCHAR +STARTCHAR U+8962 +ENCODING 35170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +1000 +FCFE +0482 +0CBA +18AA +12BA +3482 +78FE +D444 +127C +1044 +107C +1044 +11FE +ENDCHAR +STARTCHAR U+8963 +ENCODING 35171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +10FC +1084 +FCFC +0484 +0CFC +1884 +11FE +3522 +79FE +D522 +11FE +1048 +13FF +1088 +1108 +ENDCHAR +STARTCHAR U+8964 +ENCODING 35172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +13D0 +1290 +7FDC +0A60 +0BC0 +16B8 +3BC0 +5400 +17F8 +12A8 +12A8 +17FC +1000 +0000 +ENDCHAR +STARTCHAR U+8966 +ENCODING 35174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1040 +7FFC +0A48 +0B58 +1758 +1BF8 +3480 +57F8 +12A8 +12A8 +12A8 +12B8 +0000 +ENDCHAR +STARTCHAR U+8969 +ENCODING 35177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +10FE +0810 +7CFE +09FF +1129 +31FF +5CFE +1082 +1CFE +10FE +1082 +10FE +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+896A +ENCODING 35178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +17FC +10A0 +7FF8 +0AA8 +0BF8 +1428 +1BFC +3628 +57A8 +1210 +1234 +14CC +1804 +0000 +ENDCHAR +STARTCHAR U+896B +ENCODING 35179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +27FF +F820 +0BAE +1924 +33AE +22AA +6BAE +B2AA +2AAA +23FE +2050 +20D8 +218C +2707 +ENDCHAR +STARTCHAR U+896C +ENCODING 35180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FE +FA52 +0BFE +1110 +225E +6BD0 +B012 +2BDE +2240 +23D0 +225E +23D0 +2252 +24DE +0000 +0000 +ENDCHAR +STARTCHAR U+896D +ENCODING 35181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +117C +1110 +7FE0 +0938 +0928 +17F8 +1828 +37B8 +56A8 +12B8 +1398 +12A4 +1044 +0000 +ENDCHAR +STARTCHAR U+896E +ENCODING 35182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +1084 +10FC +FC84 +04FC +0C48 +19FE +1048 +35FF +7848 +D4A4 +13AB +1070 +11AC +1326 +1060 +ENDCHAR +STARTCHAR U+896F +ENCODING 35183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +1028 +7FE8 +0AB8 +0EA8 +17F8 +1928 +37F8 +57B0 +1370 +1534 +1154 +118C +0000 +ENDCHAR +STARTCHAR U+8970 +ENCODING 35184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +213F +27C9 +F113 +17C0 +155F +3551 +255F +6FD1 +B11F +2B11 +2391 +255F +254A +291B +2111 +ENDCHAR +STARTCHAR U+8971 +ENCODING 35185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +13EE +0948 +7FEE +0802 +13EE +3228 +5E2E +13E8 +1E2E +1228 +13EE +1229 +126F +0000 +0000 +ENDCHAR +STARTCHAR U+8972 +ENCODING 35186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3F7C +1278 +7F88 +1E78 +1E70 +1E70 +1274 +173C +7FFC +0690 +7C60 +0730 +380C +0000 +ENDCHAR +STARTCHAR U+8973 +ENCODING 35187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2148 +214A +22AB +FAA9 +0808 +1BFF +3148 +236A +694A +B36A +294E +2364 +214C +21ED +2717 +2022 +ENDCHAR +STARTCHAR U+8974 +ENCODING 35188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +27BC +24A4 +7FBC +14A4 +17BC +2C44 +37FC +6DF4 +2DF4 +25F4 +24E4 +275C +244C +0000 +ENDCHAR +STARTCHAR U+8975 +ENCODING 35189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FC +2090 +20F0 +F890 +08F0 +189C +33F0 +2010 +6FFF +B294 +2B9C +2294 +239C +2294 +27BC +2084 +ENDCHAR +STARTCHAR U+8976 +ENCODING 35190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +108A +13E9 +1088 +7FFF +0BE8 +12A8 +33E8 +5EA8 +13E8 +1D49 +13EA +1145 +13EB +1231 +0000 +0000 +ENDCHAR +STARTCHAR U+8977 +ENCODING 35191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +11F8 +12E8 +7F38 +0BB8 +0AA8 +17FC +1930 +36C8 +55F4 +1040 +13F8 +1040 +10C0 +0000 +ENDCHAR +STARTCHAR U+8979 +ENCODING 35193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FF +13DE +0B5A +7ED6 +0420 +0BFF +1248 +33FF +5A49 +13FF +1288 +12EE +1499 +10FF +0000 +0000 +ENDCHAR +STARTCHAR U+897A +ENCODING 35194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +27FF +2088 +F800 +0FFF +1CA9 +3529 +277F +6CAB +B52B +2FFF +24A9 +25ED +26BB +24A1 +2423 +ENDCHAR +STARTCHAR U+897B +ENCODING 35195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +42A8 +2248 +2FBE +02A8 +F75C +2AAA +2208 +77FE +A110 +33F8 +2444 +29F2 +2040 +27FC +2040 +20C0 +ENDCHAR +STARTCHAR U+897C +ENCODING 35196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +27FF +2090 +F908 +0BC8 +191E +37EA +225A +6D6E +B38A +310A +2BD3 +2000 +27FF +2104 +23FA +ENDCHAR +STARTCHAR U+897D +ENCODING 35197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +23FF +2048 +FBCF +0A49 +1BCF +3249 +23CF +6A21 +B3FF +2AA5 +22FD +22A5 +22FD +2271 +22AB +ENDCHAR +STARTCHAR U+897E +ENCODING 35198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0440 +0440 +3FF8 +2448 +2448 +2448 +27C8 +2448 +2008 +2008 +2008 +2008 +0000 +ENDCHAR +STARTCHAR U+897F +ENCODING 35199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0480 +0480 +0480 +3FF8 +2488 +2488 +2898 +2898 +3078 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+8981 +ENCODING 35201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0280 +1FF0 +1290 +1290 +1FF0 +0200 +7FFC +0440 +0F40 +08C0 +0330 +3C08 +0000 +ENDCHAR +STARTCHAR U+8982 +ENCODING 35202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0220 +3FFE +2222 +3FFE +0004 +1FF8 +0080 +1FFC +0008 +0070 +0380 +1C00 +23FF +0000 +0000 +ENDCHAR +STARTCHAR U+8983 +ENCODING 35203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0440 +3FF8 +2448 +27C8 +0FE0 +0820 +0FE0 +0820 +0FE0 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8985 +ENCODING 35205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F20 +1420 +143F +7F35 +5555 +5515 +7F15 +2215 +7F15 +2215 +1425 +0849 +1411 +630E +0000 +0000 +ENDCHAR +STARTCHAR U+8986 +ENCODING 35206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1FF0 +1290 +1FF0 +1100 +29FC +4BF0 +15F0 +31F0 +50F0 +13A0 +10E0 +171C +0000 +ENDCHAR +STARTCHAR U+8987 +ENCODING 35207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1FF0 +1290 +1FF0 +1400 +7FF8 +1C88 +3EF8 +2A88 +3EF8 +7F88 +0908 +0A18 +0000 +ENDCHAR +STARTCHAR U+8988 +ENCODING 35208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0440 +3FF8 +27C8 +0840 +3E40 +22FC +3E90 +3F90 +7F60 +1E20 +2250 +4D8C +0000 +ENDCHAR +STARTCHAR U+8989 +ENCODING 35209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +0440 +7FFE +4442 +7FFE +2410 +FF7F +2424 +3C43 +1000 +7EFF +5202 +7E72 +1052 +FF72 +1006 +ENDCHAR +STARTCHAR U+898A +ENCODING 35210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0440 +3FF8 +27C8 +14FC +7FA0 +1CF8 +3EF8 +2AA0 +3EFC +7FD4 +096C +0A18 +0000 +ENDCHAR +STARTCHAR U+898B +ENCODING 35211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0AA0 +0280 +0484 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+898D +ENCODING 35213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0910 +1918 +710E +C103 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +0420 +0C21 +1833 +F01E +ENDCHAR +STARTCHAR U+898F +ENCODING 35215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +0908 +3FF8 +0908 +09F8 +7F08 +09F8 +09A8 +08A0 +1520 +1524 +2224 +441C +0000 +ENDCHAR +STARTCHAR U+8990 +ENCODING 35216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F22 +4114 +4108 +7F14 +4122 +4140 +7F00 +4122 +4114 +7F08 +2414 +2422 +2441 +6601 +C3FF +ENDCHAR +STARTCHAR U+8993 +ENCODING 35219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3FD0 +1108 +2104 +4FE4 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0284 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+8994 +ENCODING 35220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +0520 +0D30 +1918 +710E +DFFB +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +0420 +0C21 +1833 +F01E +ENDCHAR +STARTCHAR U+8995 +ENCODING 35221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3000 +187E +0842 +2242 +227E +2642 +2442 +AC7E +AA42 +BB42 +B17E +2028 +6028 +A229 +3669 +1CC7 +ENDCHAR +STARTCHAR U+8996 +ENCODING 35222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F8 +1108 +7DF8 +0908 +09F8 +1108 +19F8 +35A8 +54A0 +1120 +1124 +1224 +141C +0000 +ENDCHAR +STARTCHAR U+8997 +ENCODING 35223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7EF8 +0288 +7E88 +02F8 +3A88 +2AF8 +2A88 +2AF8 +3A50 +2A50 +0254 +0294 +0D0C +0000 +ENDCHAR +STARTCHAR U+8998 +ENCODING 35224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +11F0 +1110 +1F10 +11F0 +1110 +7DF0 +4510 +45F0 +44A0 +7CA0 +4524 +0224 +0C1C +0000 +ENDCHAR +STARTCHAR U+899A +ENCODING 35226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0920 +3FFC +2008 +4FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0284 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+899B +ENCODING 35227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0300 +0E7E +7842 +4042 +477E +5C42 +5042 +517E +5B42 +5A42 +5C7E +5428 +D628 +9229 +9369 +10C7 +ENDCHAR +STARTCHAR U+899C +ENCODING 35228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1400 +143E +14A2 +D5A2 +753E +1422 +1422 +143E +1722 +75A2 +D43E +1414 +3414 +2495 +65B5 +C363 +ENDCHAR +STARTCHAR U+899D +ENCODING 35229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E7E +0842 +087E +7F42 +087E +0842 +007E +4914 +2A14 +0814 +1425 +2245 +4187 +0000 +0000 +ENDCHAR +STARTCHAR U+899E +ENCODING 35230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +4141 +7F7F +4141 +7F7F +4141 +4141 +7F7F +1414 +1414 +1414 +2525 +4747 +0000 +0000 +ENDCHAR +STARTCHAR U+899F +ENCODING 35231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +083E +0822 +FFA2 +083E +0822 +0822 +7F3E +0022 +0822 +2D3E +A594 +A094 +A215 +B235 +1E63 +ENDCHAR +STARTCHAR U+89A0 +ENCODING 35232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +1242 +1242 +FFFE +1242 +1242 +7E7E +1042 +1042 +3F7E +6128 +A128 +2129 +2169 +3FC7 +ENDCHAR +STARTCHAR U+89A1 +ENCODING 35233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +00F8 +7F88 +0888 +2AF8 +2A88 +2AF8 +2A88 +3FF8 +5D50 +4850 +0E94 +7114 +060C +0000 +ENDCHAR +STARTCHAR U+89A2 +ENCODING 35234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083E +4922 +2A22 +083E +1422 +2222 +413E +0022 +0822 +493E +2A14 +1415 +2215 +4167 +0000 +0000 +ENDCHAR +STARTCHAR U+89A3 +ENCODING 35235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +013E +7E22 +0822 +7F3E +1C22 +2A22 +493E +1422 +7F22 +143E +1414 +0814 +1415 +6367 +0000 +0000 +ENDCHAR +STARTCHAR U+89A4 +ENCODING 35236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +043E +0722 +0422 +3FBE +28A2 +3F22 +283E +2F22 +2022 +2A3E +2A14 +2A95 +4A95 +13A7 +0000 +0000 +ENDCHAR +STARTCHAR U+89A5 +ENCODING 35237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1400 +147E +1442 +7F42 +557E +5542 +5542 +7F7E +5542 +5542 +557E +FFA8 +0028 +2229 +6369 +C147 +ENDCHAR +STARTCHAR U+89A6 +ENCODING 35238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +0678 +0948 +10C8 +3FF8 +4048 +3AF8 +2AC8 +3AF8 +2D30 +3D30 +2AB4 +2AD4 +2A8C +0000 +ENDCHAR +STARTCHAR U+89A7 +ENCODING 35239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E40 +48FC +7D00 +7C78 +7E00 +4FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0684 +387C +0000 +ENDCHAR +STARTCHAR U+89A9 +ENCODING 35241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +3F88 +0A88 +0AF8 +7F88 +0CF8 +1288 +3EF8 +5250 +1E50 +1294 +1F14 +120C +0000 +ENDCHAR +STARTCHAR U+89AA +ENCODING 35242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7F88 +2288 +14F8 +7F88 +08F8 +7F88 +1CF8 +1A68 +2A60 +48A4 +0924 +0A1C +0000 +ENDCHAR +STARTCHAR U+89AC +ENCODING 35244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +2AF8 +2A88 +3E88 +00F8 +7F88 +00F8 +3E88 +22F8 +3E50 +2250 +1454 +1E94 +610C +0000 +ENDCHAR +STARTCHAR U+89AD +ENCODING 35245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FDE +4052 +5F52 +111E +1F12 +1112 +1F1E +1112 +0412 +041E +7FC4 +000C +1115 +20A3 +0000 +0000 +ENDCHAR +STARTCHAR U+89AE +ENCODING 35246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2A2A +0808 +1414 +2222 +7FFF +47F1 +0410 +07F0 +0410 +07F0 +0410 +07F0 +0242 +1C7E +0000 +0000 +ENDCHAR +STARTCHAR U+89AF +ENCODING 35247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +7FF8 +1488 +3E88 +14F8 +7F88 +08F8 +3E88 +2AF8 +3E50 +2A50 +7F54 +2294 +270C +0000 +ENDCHAR +STARTCHAR U+89B0 +ENCODING 35248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0F3E +0822 +7FA2 +48BE +4E22 +78A2 +4FBE +4022 +5F22 +513E +5F14 +D114 +9F15 +9135 +3FA3 +ENDCHAR +STARTCHAR U+89B2 +ENCODING 35250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +7FF8 +1488 +1C88 +08F8 +3E88 +2AF8 +3E88 +08F8 +3E50 +0850 +3E54 +0C94 +710C +0000 +ENDCHAR +STARTCHAR U+89B3 +ENCODING 35251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +10F8 +3E88 +4888 +7FF8 +1488 +3FF8 +6888 +3EF8 +2850 +3E50 +2894 +3F14 +220C +0000 +ENDCHAR +STARTCHAR U+89B4 +ENCODING 35252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +F47E +98C2 +5542 +227E +5D42 +80C2 +3E7E +2242 +2242 +3E7E +0028 +2228 +3429 +1F69 +F0C7 +ENDCHAR +STARTCHAR U+89B5 +ENCODING 35253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +E73E +A522 +E722 +A53E +E722 +8122 +BD3E +A522 +A522 +BD3E +A514 +A514 +BD15 +8135 +8163 +ENDCHAR +STARTCHAR U+89B6 +ENCODING 35254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +FE3E +48A2 +2522 +7FBE +00A2 +7FA2 +083E +7FA2 +52A2 +5DBE +4094 +7E94 +5295 +4CB5 +52E3 +ENDCHAR +STARTCHAR U+89B7 +ENCODING 35255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0F3E +0822 +7FA2 +48BE +4F22 +7822 +48BE +47A2 +4022 +4A3E +6A94 +EA94 +9B15 +8A35 +3FE3 +ENDCHAR +STARTCHAR U+89B9 +ENCODING 35257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C00 +24A4 +2574 +3EF7 +2509 +2771 +3D05 +2575 +2555 +3D52 +1555 +1498 +2401 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+89BA +ENCODING 35258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +1B70 +1290 +1AB0 +1930 +1290 +3FFC +2FE8 +4820 +0FE0 +0FE0 +0FE4 +0644 +783C +0000 +ENDCHAR +STARTCHAR U+89BC +ENCODING 35260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FFBE +2A22 +4922 +FFBE +88A2 +DDA2 +AABE +DDA2 +88A2 +DDBE +AA94 +DD94 +8895 +88B5 +8BE3 +ENDCHAR +STARTCHAR U+89BD +ENCODING 35261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7EFC +4900 +7EF8 +7DFC +4954 +7FFC +4FE0 +0820 +0FE0 +0FE0 +0FE4 +0684 +787C +0000 +ENDCHAR +STARTCHAR U+89BE +ENCODING 35262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041F +7FD1 +4151 +3E1F +1511 +0E11 +7FDF +1511 +2491 +7FDF +248A +3F8A +248B +3FB3 +0000 +0000 +ENDCHAR +STARTCHAR U+89BF +ENCODING 35263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7F78 +3E48 +7F48 +5778 +7F48 +3E78 +2248 +3E78 +3E30 +2230 +3E54 +1494 +630C +0000 +ENDCHAR +STARTCHAR U+89C0 +ENCODING 35264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +7F78 +1448 +7748 +5578 +7748 +1478 +3F48 +6478 +3F30 +3F30 +2454 +3F94 +210C +0000 +ENDCHAR +STARTCHAR U+89C1 +ENCODING 35265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1110 +1110 +1110 +1110 +1110 +1110 +1210 +1290 +0480 +0482 +0882 +307E +C000 +ENDCHAR +STARTCHAR U+89C2 +ENCODING 35266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +01FC +7D08 +0528 +4528 +2928 +2928 +1148 +1148 +2948 +2568 +44A0 +80A0 +0122 +0622 +181E +ENDCHAR +STARTCHAR U+89C4 +ENCODING 35268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1008 +11FC +1128 +7D28 +1128 +1528 +FF48 +1148 +1148 +1040 +2890 +2490 +4112 +8212 +040E +ENDCHAR +STARTCHAR U+89C5 +ENCODING 35269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FC +7F00 +1110 +0920 +0010 +1FF8 +1010 +1110 +1110 +1110 +1110 +1290 +0280 +0482 +1882 +607E +ENDCHAR +STARTCHAR U+89C6 +ENCODING 35270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +13FC +1208 +0248 +FE48 +0A48 +1248 +3248 +5A48 +9668 +12A8 +10A0 +1122 +1122 +121E +1400 +ENDCHAR +STARTCHAR U+89C7 +ENCODING 35271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1504 +1F24 +1124 +1124 +1524 +7F24 +4524 +4524 +4534 +4450 +7C50 +4492 +0112 +060E +ENDCHAR +STARTCHAR U+89C8 +ENCODING 35272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +4884 +48FE +4920 +4A10 +4810 +1FF8 +1010 +1110 +1110 +1110 +1190 +1290 +0482 +1882 +E07E +ENDCHAR +STARTCHAR U+89C9 +ENCODING 35273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +0910 +0920 +7FFE +4002 +8014 +1FF8 +1010 +1110 +1110 +1190 +1290 +1290 +0484 +0884 +707C +ENDCHAR +STARTCHAR U+89CA +ENCODING 35274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +497E +4944 +4954 +7F54 +0054 +7F54 +0154 +0154 +3F54 +2118 +2028 +2328 +2C4A +308A +0306 +ENDCHAR +STARTCHAR U+89CB +ENCODING 35275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +017E +FFC4 +0854 +0854 +2A54 +2A54 +2A54 +5D54 +88D4 +0818 +0FA8 +F828 +404A +008A +0306 +ENDCHAR +STARTCHAR U+89CC +ENCODING 35276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0A7E +7F44 +0854 +0854 +FFD4 +2554 +1454 +6454 +1454 +FF18 +0428 +0828 +0C4A +128A +6106 +ENDCHAR +STARTCHAR U+89CE +ENCODING 35278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +087E +1444 +1454 +2254 +7F54 +80D4 +7154 +5554 +7554 +5518 +7528 +5128 +554A +528A +0306 +ENDCHAR +STARTCHAR U+89CF +ENCODING 35279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1404 +147E +7F44 +1454 +7F54 +1454 +FFD4 +0854 +7F54 +4954 +7F18 +4928 +FFA8 +414A +458A +4306 +ENDCHAR +STARTCHAR U+89D0 +ENCODING 35280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2204 +227E +FFC4 +2254 +3E54 +0854 +7F54 +4954 +7F54 +0854 +7F18 +0828 +7F28 +084A +FF8A +0106 +ENDCHAR +STARTCHAR U+89D1 +ENCODING 35281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A04 +0F7E +0844 +7FD4 +4954 +4E54 +7954 +4F54 +4054 +4A54 +6A98 +5B28 +4A28 +4A4A +BF8A +0106 +ENDCHAR +STARTCHAR U+89D2 +ENCODING 35282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +07E0 +1880 +6100 +1FF0 +1110 +1FF0 +1110 +1110 +1FF0 +1010 +1010 +2010 +4030 +0000 +ENDCHAR +STARTCHAR U+89D3 +ENCODING 35283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +3E42 +4242 +0442 +7F42 +4942 +7F42 +497E +7F02 +4102 +4102 +4102 +4502 +4202 +0000 +0000 +ENDCHAR +STARTCHAR U+89D4 +ENCODING 35284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3C10 +6410 +4810 +FEFF +5211 +5211 +7E11 +5211 +5211 +7E11 +4231 +4221 +4263 +C2C2 +8F8E +ENDCHAR +STARTCHAR U+89D5 +ENCODING 35285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +283C +2864 +2848 +7EFF +4891 +C891 +08FF +0E91 +3891 +E8FF +0881 +0881 +0881 +0981 +0907 +ENDCHAR +STARTCHAR U+89D6 +ENCODING 35286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1E20 +2424 +28FE +7E24 +AA24 +2A24 +3E24 +2BFE +2A20 +3E20 +2A50 +4A48 +4286 +8704 +ENDCHAR +STARTCHAR U+89D7 +ENCODING 35287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2006 +3C1C +64F0 +4890 +FC90 +5490 +5490 +7CFF +5490 +5498 +7C88 +4488 +448C +4485 +C4E7 +8F82 +ENDCHAR +STARTCHAR U+89D8 +ENCODING 35288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3C10 +6410 +4854 +FE54 +52D6 +5292 +7F93 +5210 +5272 +7E06 +4204 +420C +4218 +C230 +8EE0 +ENDCHAR +STARTCHAR U+89D9 +ENCODING 35289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3DFE +4482 +0884 +7C88 +549E +5482 +7C82 +54A2 +5494 +7C88 +4494 +4522 +4841 +0000 +0000 +ENDCHAR +STARTCHAR U+89DA +ENCODING 35290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1E30 +25D0 +4950 +3F50 +2B50 +2B50 +3F50 +2B50 +3F70 +2358 +2378 +2394 +4604 +0000 +ENDCHAR +STARTCHAR U+89DB +ENCODING 35291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +7E7E +0242 +0442 +7F7E +4942 +7F42 +4942 +497E +7F42 +4100 +4100 +41FF +4300 +0000 +0000 +ENDCHAR +STARTCHAR U+89DC +ENCODING 35292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +2F98 +28E4 +2F84 +727C +07C0 +1880 +6FF0 +0910 +0FF0 +0910 +0FF0 +1010 +2030 +0000 +ENDCHAR +STARTCHAR U+89DD +ENCODING 35293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1E10 +24E0 +48A0 +3EA0 +2AFC +2AA0 +3EA0 +2A90 +3EF4 +238C +220C +23F4 +4604 +0000 +ENDCHAR +STARTCHAR U+89DE +ENCODING 35294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1084 +1EFE +2500 +28F8 +7E20 +AA44 +2AFE +3E54 +2A54 +2A54 +3E94 +2AA4 +4B24 +4254 +8608 +ENDCHAR +STARTCHAR U+89DF +ENCODING 35295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1F08 +213E +0208 +3F88 +2488 +24FF +3F88 +2488 +24BE +3F88 +2088 +2088 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+89E0 +ENCODING 35296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +3FFE +0200 +7FFF +0410 +0908 +13F4 +6423 +1FFC +1084 +13E4 +1084 +17F4 +1008 +0000 +0000 +ENDCHAR +STARTCHAR U+89E1 +ENCODING 35297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3F3F +0161 +0212 +3F8C +248C +2492 +3FA1 +2480 +24BF +3FA1 +20A1 +20A1 +41BF +0000 +0000 +ENDCHAR +STARTCHAR U+89E2 +ENCODING 35298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7F7F +3E11 +0811 +7F21 +0A06 +03F0 +0420 +3FFE +2082 +2FFA +3FFE +2002 +4004 +0000 +0000 +ENDCHAR +STARTCHAR U+89E3 +ENCODING 35299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1FF8 +2448 +4888 +3F30 +2AA0 +2AF8 +3F20 +2A20 +3FFC +2220 +2220 +2220 +4620 +0000 +ENDCHAR +STARTCHAR U+89E4 +ENCODING 35300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3E7E +4484 +0808 +7F7F +4940 +4940 +7F7E +4952 +4952 +7F56 +4190 +4111 +431F +0000 +0000 +ENDCHAR +STARTCHAR U+89E5 +ENCODING 35301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1D24 +24AC +28B0 +7E20 +AA24 +2BFE +3E50 +2A50 +2A50 +3E50 +2A52 +4A92 +428E +8700 +ENDCHAR +STARTCHAR U+89E6 +ENCODING 35302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1E20 +2420 +48F8 +3EA8 +2AA8 +3EA8 +2AF8 +2AA8 +3E20 +2230 +2228 +223C +47C4 +0000 +ENDCHAR +STARTCHAR U+89E7 +ENCODING 35303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1088 +1E48 +2450 +49FC +3E20 +2A20 +2AF8 +3E20 +2A20 +3FFC +2220 +2220 +2220 +4620 +0000 +ENDCHAR +STARTCHAR U+89E8 +ENCODING 35304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +3C10 +4410 +08FE +3E10 +2A12 +2AF4 +3E38 +2A54 +2A92 +3F11 +2210 +2210 +4630 +0000 +0000 +ENDCHAR +STARTCHAR U+89E9 +ENCODING 35305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2024 +3C26 +6422 +4BFF +FC20 +5522 +55A6 +7CAC +5420 +5430 +7CB8 +44AC +45A6 +4723 +C420 +8CE0 +ENDCHAR +STARTCHAR U+89EB +ENCODING 35307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2024 +3DFE +4820 +5024 +FDFE +5524 +5524 +7DFC +5524 +5470 +7CA8 +5526 +5624 +4420 +8C20 +ENDCHAR +STARTCHAR U+89EC +ENCODING 35308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1E23 +2441 +08C1 +7F77 +4941 +4941 +7F7F +4924 +4924 +7F25 +4125 +4145 +4387 +0000 +0000 +ENDCHAR +STARTCHAR U+89ED +ENCODING 35309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3C10 +64FF +4810 +FE28 +5244 +5200 +7EFF +5202 +5272 +7E52 +4252 +4272 +4202 +C202 +8E0E +ENDCHAR +STARTCHAR U+89EF +ENCODING 35311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +2088 +3C50 +49FC +5124 +FD24 +55FC +5524 +7D24 +55FC +5420 +7FFE +5420 +5420 +4420 +8C20 +ENDCHAR +STARTCHAR U+89F0 +ENCODING 35312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1F08 +213F +0209 +3F8A +24BF +3F88 +249F +3FB1 +20D1 +209F +2091 +2091 +419F +0000 +0000 +ENDCHAR +STARTCHAR U+89F1 +ENCODING 35313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0042 +7FFF +4040 +5F64 +402C +5F30 +5119 +DFED +8427 +1FFC +1084 +1FFC +1084 +3FFC +6004 +C01C +ENDCHAR +STARTCHAR U+89F2 +ENCODING 35314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1022 +1E14 +227F +0408 +7F7F +4908 +497F +7F08 +4948 +497F +7F88 +417F +4108 +4308 +0000 +0000 +ENDCHAR +STARTCHAR U+89F3 +ENCODING 35315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7FFC +0888 +3E88 +0088 +FF88 +9106 +9C00 +25FC +7E84 +AA88 +3E50 +2A20 +3E50 +4A8E +8B04 +ENDCHAR +STARTCHAR U+89F4 +ENCODING 35316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1E40 +24FC +49F0 +3E90 +2AF0 +2A90 +3EF0 +2BFC +3EF8 +2368 +22A8 +2348 +4630 +0000 +ENDCHAR +STARTCHAR U+89F6 +ENCODING 35318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +3DEF +6529 +49EF +FE00 +52FE +5292 +7E92 +52FE +5292 +7E92 +42FE +4210 +43FF +C210 +8E10 +ENDCHAR +STARTCHAR U+89F7 +ENCODING 35319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +114E +2082 +394E +388E +2142 +7FFF +47F1 +4821 +1FFC +1084 +17F4 +1FFC +1004 +200C +0000 +0000 +ENDCHAR +STARTCHAR U+89F8 +ENCODING 35320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1FF8 +2568 +49F8 +3E80 +2AF8 +2B48 +3FF8 +2B58 +3FF8 +2268 +2278 +2388 +4630 +0000 +ENDCHAR +STARTCHAR U+89F9 +ENCODING 35321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +3C48 +64FF +4948 +FE7E +5248 +527E +7E48 +527F +5200 +7EE7 +42A5 +42BD +4281 +C281 +8E87 +ENDCHAR +STARTCHAR U+89FA +ENCODING 35322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E3E +3F14 +3E7F +4809 +7F2E +1428 +225F +07F0 +0820 +1FFC +1084 +17F4 +1FFC +200C +0000 +0000 +ENDCHAR +STARTCHAR U+89FB +ENCODING 35323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2092 +3CBA +492C +11EF +7CBA +556D +55EF +7C38 +5410 +55FF +7C54 +4492 +4511 +4C10 +0000 +0000 +ENDCHAR +STARTCHAR U+89FC +ENCODING 35324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4080 +79F8 +4A10 +13FE +FA52 +ABFE +A904 +F9F4 +A97C +A9FC +F8F8 +8950 +8A20 +9BDE +0000 +0000 +ENDCHAR +STARTCHAR U+89FD +ENCODING 35325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3D11 +65FF +4844 +FE48 +52FF +5348 +7E7E +5248 +527E +7E48 +42FF +42A5 +42BD +C281 +8E87 +ENDCHAR +STARTCHAR U+89FE +ENCODING 35326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +7DFF +0844 +107C +7C00 +54BA +54AA +7DAB +54AA +54AA +7DBB +4400 +4529 +4D29 +0000 +0000 +ENDCHAR +STARTCHAR U+89FF +ENCODING 35327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3D11 +65FF +4844 +FE48 +52FF +5348 +7E7E +5248 +527E +7E48 +42FF +42A5 +42BF +C2E5 +8EBD +ENDCHAR +STARTCHAR U+8A00 +ENCODING 35328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0000 +7FFC +0000 +0FE0 +0000 +0FE0 +0000 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8A02 +ENCODING 35330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3C00 +01FC +7E20 +0020 +3C20 +0020 +3C20 +0020 +3C20 +2420 +2420 +3C20 +2460 +0000 +ENDCHAR +STARTCHAR U+8A03 +ENCODING 35331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +0020 +7F20 +0020 +3E30 +0028 +3E24 +0024 +3E20 +2220 +2220 +3E20 +2220 +0000 +ENDCHAR +STARTCHAR U+8A04 +ENCODING 35332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2078 +2000 +21FE +FC00 +2478 +2400 +2478 +2400 +2478 +2448 +2448 +2478 +6401 +4603 +C3FE +ENDCHAR +STARTCHAR U+8A05 +ENCODING 35333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C20 +0020 +FE20 +00FC +7C24 +0024 +0024 +7C24 +0024 +0024 +7C64 +4444 +4445 +44C5 +7D83 +ENDCHAR +STARTCHAR U+8A07 +ENCODING 35335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +1FFE +2404 +4244 +BFE4 +0004 +1FC4 +0004 +1FC4 +0004 +1FC4 +1044 +1044 +1FD4 +0008 +ENDCHAR +STARTCHAR U+8A08 +ENCODING 35336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +0020 +7E20 +01FC +3C20 +0020 +3C20 +0020 +3C20 +2420 +2420 +3C20 +2420 +0000 +ENDCHAR +STARTCHAR U+8A0A +ENCODING 35338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF0 +0090 +7E90 +0090 +3C90 +00B0 +3CD0 +0190 +3C90 +2494 +250C +3D0C +2204 +0000 +ENDCHAR +STARTCHAR U+8A0C +ENCODING 35340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0040 +7E40 +0040 +3C40 +0040 +3C40 +0040 +3C40 +2440 +2440 +3FFC +2400 +0000 +ENDCHAR +STARTCHAR U+8A0E +ENCODING 35342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3C10 +0010 +7E10 +01FC +3C10 +0110 +3C90 +0090 +3C10 +2410 +2410 +3C10 +2430 +0000 +ENDCHAR +STARTCHAR U+8A0F +ENCODING 35343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFE +0010 +FE10 +0010 +7C10 +0010 +01FF +7C10 +0010 +0010 +7C10 +4410 +4410 +4410 +7C70 +ENDCHAR +STARTCHAR U+8A10 +ENCODING 35344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF8 +0020 +7E20 +0020 +3C20 +01FC +3C20 +0020 +3C20 +2420 +2420 +3C20 +2420 +0000 +ENDCHAR +STARTCHAR U+8A11 +ENCODING 35345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +0090 +FE96 +009A +7CB2 +00D2 +0192 +7C92 +0096 +0090 +7C80 +4480 +4481 +44C3 +7C7E +ENDCHAR +STARTCHAR U+8A12 +ENCODING 35346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFF +0021 +FE21 +0021 +7C21 +01A1 +00E1 +7C61 +0071 +0059 +7C49 +4443 +44C2 +4482 +7D8E +ENDCHAR +STARTCHAR U+8A13 +ENCODING 35347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3E88 +00A8 +7FA8 +00A8 +3EA8 +00A8 +3EA8 +00A8 +3EA8 +22A8 +2308 +3F08 +2208 +0000 +ENDCHAR +STARTCHAR U+8A14 +ENCODING 35348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4102 +4102 +7FFE +0000 +1FF8 +0000 +FFFF +0000 +1FF8 +0000 +1FF8 +0000 +3FFC +2004 +3FFC +ENDCHAR +STARTCHAR U+8A15 +ENCODING 35349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +0010 +FE10 +0092 +7C92 +0092 +0092 +7C92 +0092 +0092 +7C92 +4492 +4492 +44FE +7C00 +ENDCHAR +STARTCHAR U+8A16 +ENCODING 35350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +0080 +7EFC +0100 +3FF8 +0010 +3C20 +0040 +3C80 +2500 +2504 +3D04 +24FC +0000 +ENDCHAR +STARTCHAR U+8A17 +ENCODING 35351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3C30 +01C0 +7E40 +0040 +3C40 +007C +3DC0 +0040 +3C40 +2440 +2444 +3C44 +203C +0000 +ENDCHAR +STARTCHAR U+8A18 +ENCODING 35352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +0008 +7F08 +0008 +3EF8 +0088 +3E80 +0080 +3E80 +2280 +2284 +3E84 +227C +0000 +ENDCHAR +STARTCHAR U+8A1B +ENCODING 35355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3CA0 +00A0 +7EA4 +0124 +3D28 +0328 +3D30 +0160 +3D20 +2524 +2524 +3D24 +251C +0000 +ENDCHAR +STARTCHAR U+8A1D +ENCODING 35357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0010 +7E90 +0090 +3C90 +03FC +3C30 +0030 +3C50 +2490 +2510 +3E10 +2430 +0000 +ENDCHAR +STARTCHAR U+8A1E +ENCODING 35358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +7C1C +00F0 +FE10 +0010 +7C10 +01FF +0010 +7C10 +0038 +0028 +7C28 +446C +4444 +44C6 +7D83 +ENDCHAR +STARTCHAR U+8A1F +ENCODING 35359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +3C20 +00A0 +7E90 +0090 +3D48 +0148 +3E44 +0040 +3C60 +2490 +2490 +3FE8 +2008 +0000 +ENDCHAR +STARTCHAR U+8A20 +ENCODING 35360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7DF2 +0012 +FE12 +0012 +7CF2 +0082 +0082 +7C82 +00F2 +0012 +7C12 +4432 +4422 +4462 +7DC2 +ENDCHAR +STARTCHAR U+8A22 +ENCODING 35362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +7C1C +00F0 +FE80 +0080 +7CFF +0088 +0088 +7C88 +0088 +0088 +7C88 +4588 +4508 +4708 +7C08 +ENDCHAR +STARTCHAR U+8A23 +ENCODING 35363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +0040 +7FF8 +0048 +3C48 +0048 +3FFC +0040 +3CA0 +24A0 +2510 +3E08 +2404 +0000 +ENDCHAR +STARTCHAR U+8A24 +ENCODING 35364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7CC6 +006C +FE38 +006C +7CC6 +0182 +0000 +7C84 +00CC +0048 +7C78 +4430 +4478 +44CC +7D87 +ENDCHAR +STARTCHAR U+8A25 +ENCODING 35365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00C0 +3C40 +0040 +7FF8 +0148 +3D48 +0148 +3D68 +01A8 +3D98 +2508 +2508 +3D08 +2518 +0000 +ENDCHAR +STARTCHAR U+8A26 +ENCODING 35366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +0020 +FDFE +0122 +7922 +0122 +0020 +7870 +0050 +0050 +78D0 +4890 +4891 +499B +7B0E +ENDCHAR +STARTCHAR U+8A27 +ENCODING 35367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1024 +0022 +7EFF +0020 +3C20 +0028 +3C28 +0028 +7E28 +4229 +4229 +7E49 +428F +0000 +0000 +ENDCHAR +STARTCHAR U+8A2A +ENCODING 35370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +0040 +7FFC +0040 +3C40 +0078 +3C48 +0048 +3C88 +2488 +2508 +3E08 +2430 +0000 +ENDCHAR +STARTCHAR U+8A2B +ENCODING 35371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0060 +7C20 +0030 +FE10 +0040 +7C40 +0040 +0040 +7D46 +0142 +0143 +7D41 +4544 +4444 +446C +7C38 +ENDCHAR +STARTCHAR U+8A2C +ENCODING 35372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7810 +0010 +FC94 +0096 +7993 +0111 +0310 +7812 +0076 +0004 +780C +4818 +4830 +48E0 +7B80 +ENDCHAR +STARTCHAR U+8A2D +ENCODING 35373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF0 +0090 +7E94 +0094 +3D0C +0200 +3DF8 +0088 +3C90 +2450 +2420 +3CD0 +230C +0000 +ENDCHAR +STARTCHAR U+8A2F +ENCODING 35375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DFC +0044 +FE4C +0048 +7C5E +0042 +00E2 +7CA6 +00B4 +009C +7D88 +451C +4734 +4466 +7CC3 +ENDCHAR +STARTCHAR U+8A30 +ENCODING 35376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +0808 +007F +7F08 +0049 +3E49 +0049 +3E49 +007F +7F08 +4108 +4109 +7F09 +410F +0000 +0000 +ENDCHAR +STARTCHAR U+8A31 +ENCODING 35377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +0080 +7FF8 +0140 +3E40 +0040 +3FFC +0040 +3C40 +2440 +2440 +3C40 +2440 +0000 +ENDCHAR +STARTCHAR U+8A33 +ENCODING 35379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF8 +0088 +7E88 +0088 +3CF8 +00A8 +3CA0 +00A0 +3CA0 +2510 +2510 +3E08 +2404 +0000 +ENDCHAR +STARTCHAR U+8A34 +ENCODING 35380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3C30 +00C0 +7E80 +0080 +3CFC +0090 +3C90 +00B0 +3C98 +2514 +2510 +3E10 +2410 +0000 +ENDCHAR +STARTCHAR U+8A35 +ENCODING 35381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7800 +01FF +FD29 +0129 +7929 +0129 +0129 +7969 +014F +01C1 +7901 +4901 +4901 +49FF +7800 +ENDCHAR +STARTCHAR U+8A36 +ENCODING 35382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +0008 +7E08 +01E8 +3D28 +0128 +3D28 +01E8 +3D28 +2408 +2408 +3C08 +2418 +0000 +ENDCHAR +STARTCHAR U+8A37 +ENCODING 35383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +0010 +FEFF +0091 +7C91 +0091 +00FF +7C91 +0091 +0091 +7CFF +4410 +4410 +4410 +7C10 +ENDCHAR +STARTCHAR U+8A39 +ENCODING 35385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0812 +0811 +7EFF +0010 +3C10 +0054 +3C54 +0054 +3C54 +2454 +2494 +2517 +2410 +3C10 +0000 +0000 +ENDCHAR +STARTCHAR U+8A3A +ENCODING 35386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +0060 +7EA0 +0090 +3D28 +0244 +3D90 +0020 +3C44 +2588 +2410 +3C60 +2380 +0000 +ENDCHAR +STARTCHAR U+8A3B +ENCODING 35387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C40 +0040 +7FFC +0040 +3C40 +0040 +3FF8 +0040 +3C40 +2440 +2440 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+8A3C +ENCODING 35388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +0020 +7E20 +00A0 +3CA0 +00B8 +3CA0 +00A0 +3CA0 +24A0 +24A0 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+8A3D +ENCODING 35389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C40 +0040 +FEFF +0081 +7D01 +00F9 +0089 +7C89 +0089 +0089 +7CF9 +4401 +4403 +4402 +7C0E +ENDCHAR +STARTCHAR U+8A3E +ENCODING 35390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +2F58 +2860 +2F44 +7A7C +0100 +FFFE +0000 +1FF0 +0000 +1FF0 +0000 +1FF0 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+8A3F +ENCODING 35391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +0848 +7E48 +0048 +3C48 +007F +3C48 +0048 +3D48 +2548 +2548 +2559 +3D69 +25CF +0000 +0000 +ENDCHAR +STARTCHAR U+8A40 +ENCODING 35392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +0010 +FE10 +001F +7C10 +0010 +0010 +7C10 +00FE +0082 +7C82 +4482 +4482 +4482 +7CFE +ENDCHAR +STARTCHAR U+8A41 +ENCODING 35393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +0020 +7FFC +0020 +3C20 +0020 +3CF8 +0088 +3C88 +2488 +2488 +3CF8 +2488 +0000 +ENDCHAR +STARTCHAR U+8A43 +ENCODING 35395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +0010 +FEFF +0010 +7C30 +0020 +0064 +7CCC +0068 +0038 +7C10 +4432 +4462 +444F +7DF9 +ENDCHAR +STARTCHAR U+8A44 +ENCODING 35396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0890 +0090 +7EFE +0090 +3D10 +0010 +3DFF +0010 +3C10 +2428 +2444 +2482 +3D01 +0000 +0000 +ENDCHAR +STARTCHAR U+8A45 +ENCODING 35397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C38 +0028 +FE6C +00C6 +7DBB +0000 +0000 +7CFE +0022 +0022 +7C22 +4422 +442E +4420 +7C20 +ENDCHAR +STARTCHAR U+8A46 +ENCODING 35398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3C30 +01E0 +7F20 +0120 +3DFC +0120 +3D20 +0110 +3DD0 +2714 +240C +3FEC +2404 +0000 +ENDCHAR +STARTCHAR U+8A47 +ENCODING 35399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +0020 +FCFC +00A4 +78A4 +00A4 +00A4 +7BFF +0050 +0050 +78D8 +4888 +498C +4906 +7B03 +ENDCHAR +STARTCHAR U+8A48 +ENCODING 35400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0FE0 +0000 +7FFC +0FE0 +0FE0 +0000 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+8A49 +ENCODING 35401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +711F +0109 +FBE9 +0129 +7129 +012B +032A +726A +064E +0344 +71C4 +508E +51CA +535B +7631 +ENDCHAR +STARTCHAR U+8A4A +ENCODING 35402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +0808 +0049 +7F49 +002A +3E08 +007F +3E08 +0008 +3E7F +2208 +2208 +3E08 +2208 +0000 +0000 +ENDCHAR +STARTCHAR U+8A4C +ENCODING 35404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0842 +0842 +7F42 +00FF +3E42 +0042 +3E42 +007E +3E42 +2242 +2242 +2242 +3E7E +2242 +0000 +0000 +ENDCHAR +STARTCHAR U+8A4D +ENCODING 35405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7924 +0124 +FD24 +0124 +7BFF +0124 +0124 +7924 +0124 +013C +7900 +4900 +4900 +49FE +7800 +ENDCHAR +STARTCHAR U+8A4E +ENCODING 35406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFF +0080 +FE80 +0080 +7CFE +0082 +0082 +7C82 +00FE +0080 +7C80 +4480 +4480 +44FF +7C00 +ENDCHAR +STARTCHAR U+8A4F +ENCODING 35407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +1048 +0048 +7C5F +0089 +3929 +01E9 +3849 +0089 +7D09 +4529 +45E9 +7C21 +440E +0000 +0000 +ENDCHAR +STARTCHAR U+8A50 +ENCODING 35408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +0080 +7EFC +0140 +3D40 +027C +3C40 +0040 +3C7C +2440 +2440 +3C40 +2440 +0000 +ENDCHAR +STARTCHAR U+8A51 +ENCODING 35409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +0020 +7FFC +0108 +3E80 +0080 +3C98 +00E0 +3C80 +2480 +2484 +3C84 +207C +0000 +ENDCHAR +STARTCHAR U+8A52 +ENCODING 35410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +0020 +7E50 +0048 +3C88 +03F4 +3C04 +00F8 +3C88 +2488 +2488 +3CF8 +2488 +0000 +ENDCHAR +STARTCHAR U+8A53 +ENCODING 35411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +0020 +FDFE +0020 +7820 +0020 +0020 +7BFF +0040 +0040 +78C4 +4884 +48BE +49E2 +7B03 +ENDCHAR +STARTCHAR U+8A54 +ENCODING 35412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0048 +7E48 +0088 +3C88 +0130 +3E00 +01F8 +3D08 +2508 +2508 +3DF8 +2108 +0000 +ENDCHAR +STARTCHAR U+8A55 +ENCODING 35413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +0020 +7F28 +00A8 +3CB0 +0020 +3FFC +0020 +3C20 +2420 +2420 +3C20 +2420 +0000 +ENDCHAR +STARTCHAR U+8A56 +ENCODING 35414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7810 +0010 +FDFF +0111 +7912 +0110 +01FE +7942 +0146 +0164 +792C +4B18 +4A3C +4E66 +78C3 +ENDCHAR +STARTCHAR U+8A57 +ENCODING 35415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FE +0102 +FD02 +017A +794A +014A +014A +794A +014A +014A +797A +4902 +4902 +4902 +790E +ENDCHAR +STARTCHAR U+8A58 +ENCODING 35416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7810 +0111 +FD11 +0111 +7911 +01FF +0010 +7810 +0010 +0111 +7911 +4911 +4911 +49FF +7800 +ENDCHAR +STARTCHAR U+8A59 +ENCODING 35417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1012 +0811 +7EFF +0010 +3C20 +0042 +3C82 +0122 +3C24 +2418 +2418 +2424 +3C42 +2481 +0000 +0000 +ENDCHAR +STARTCHAR U+8A5B +ENCODING 35419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF0 +0090 +7E90 +0090 +3CF0 +0090 +3C90 +00F0 +3C90 +2490 +2490 +3FFC +2400 +0000 +ENDCHAR +STARTCHAR U+8A5C +ENCODING 35420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7D11 +0111 +FDFF +0010 +7C10 +01FE +0082 +7CC6 +006C +0038 +7C10 +4438 +446C +44C6 +7D83 +ENDCHAR +STARTCHAR U+8A5D +ENCODING 35421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +01FF +FF01 +0101 +7C00 +01FF +0010 +7C10 +0010 +0010 +7C10 +4410 +4410 +4410 +7C70 +ENDCHAR +STARTCHAR U+8A5E +ENCODING 35422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0008 +7E08 +01F8 +3C08 +01E8 +3D28 +0128 +3DE8 +2508 +2408 +3C08 +2030 +0000 +ENDCHAR +STARTCHAR U+8A60 +ENCODING 35424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C20 +0020 +7EE0 +0028 +3C28 +01F0 +3C70 +00B0 +3CA8 +2528 +2624 +3C20 +2060 +0000 +ENDCHAR +STARTCHAR U+8A61 +ENCODING 35425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79EF +0021 +FC21 +0129 +79AD +00A5 +0021 +7821 +0021 +00E7 +79AD +4821 +4821 +4821 +78E7 +ENDCHAR +STARTCHAR U+8A62 +ENCODING 35426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +0080 +7EF8 +0108 +3FE8 +0128 +3DE8 +0128 +3DE8 +2528 +2408 +3C08 +2430 +0000 +ENDCHAR +STARTCHAR U+8A63 +ENCODING 35427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C98 +00E0 +7E80 +0084 +3C7C +0000 +3CF8 +0088 +3CF8 +2488 +2488 +3CF8 +2488 +0000 +ENDCHAR +STARTCHAR U+8A65 +ENCODING 35429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C38 +0028 +FE6C +00C6 +7D83 +0000 +00FE +7C00 +0000 +00FE +7C82 +4482 +4482 +4482 +7CFE +ENDCHAR +STARTCHAR U+8A66 +ENCODING 35430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3C28 +0028 +7FFC +0020 +3C20 +03E0 +3CA0 +0090 +3CB0 +24D4 +270C +3C0C +2004 +0000 +ENDCHAR +STARTCHAR U+8A67 +ENCODING 35431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1F7E +3182 +6BC6 +C66C +2DB0 +1818 +3FFC +E007 +0FF0 +0000 +0FF0 +0000 +3FFC +2004 +3FFC +ENDCHAR +STARTCHAR U+8A68 +ENCODING 35432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +1020 +FDFE +0088 +7904 +020A +7888 +0088 +7850 +4820 +4850 +488C +7906 +4A02 +0000 +0000 +ENDCHAR +STARTCHAR U+8A69 +ENCODING 35433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +01F8 +7E40 +0040 +3FFC +0010 +3C10 +03FC +3D10 +2490 +2490 +3C10 +2030 +0000 +ENDCHAR +STARTCHAR U+8A6B +ENCODING 35435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +01FC +7F08 +0218 +3DE0 +0040 +3C7C +03C0 +3C40 +2440 +2444 +3C44 +243C +0000 +ENDCHAR +STARTCHAR U+8A6C +ENCODING 35436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3DE0 +0100 +7F00 +01FC +3D00 +0100 +3DF8 +0188 +3D88 +2688 +2688 +3CF8 +2488 +0000 +ENDCHAR +STARTCHAR U+8A6D +ENCODING 35437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C78 +0090 +7F20 +01FC +3D00 +0178 +3D48 +0148 +3D70 +2540 +2644 +3E44 +243C +0000 +ENDCHAR +STARTCHAR U+8A6E +ENCODING 35438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +00A0 +7EA0 +0110 +3E08 +03FC +3C40 +0040 +3DF0 +2440 +2440 +3FFC +2400 +0000 +ENDCHAR +STARTCHAR U+8A70 +ENCODING 35440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +0040 +7FFC +0040 +3C40 +01F8 +3C00 +01F8 +3D08 +2508 +2508 +3DF8 +2508 +0000 +ENDCHAR +STARTCHAR U+8A71 +ENCODING 35441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3C30 +01C0 +7E40 +0040 +3FFC +0040 +3C40 +01F8 +3D08 +2508 +2508 +3DF8 +2508 +0000 +ENDCHAR +STARTCHAR U+8A72 +ENCODING 35442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +03FC +7C40 +0050 +3D90 +00A0 +3C68 +0048 +3C90 +2530 +2448 +3D84 +2604 +0000 +ENDCHAR +STARTCHAR U+8A73 +ENCODING 35443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3C90 +00A0 +7FFC +0040 +3C40 +03F8 +3C40 +0040 +3FFC +2440 +2440 +3C40 +2040 +0000 +ENDCHAR +STARTCHAR U+8A74 +ENCODING 35444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +7DFF +0020 +7C7E +00C2 +7D42 +007E +7C42 +447E +4442 +4442 +7C42 +4486 +0000 +0000 +ENDCHAR +STARTCHAR U+8A75 +ENCODING 35445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3C50 +0050 +7E90 +00FE +0090 +3D10 +0010 +3DFF +0048 +0048 +3C48 +2448 +2489 +3C89 +250F +ENDCHAR +STARTCHAR U+8A76 +ENCODING 35446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +7892 +0092 +FC92 +0092 +7ADA +02B6 +0292 +7892 +0092 +0092 +7892 +4992 +4912 +4902 +7B02 +ENDCHAR +STARTCHAR U+8A77 +ENCODING 35447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FE +0102 +FD02 +017A +7902 +0102 +017A +794A +014A +014A +797A +4902 +4902 +4902 +7906 +ENDCHAR +STARTCHAR U+8A79 +ENCODING 35449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1FF0 +2044 +7FFE +A510 +2888 +3FFE +2000 +27F8 +2000 +27F8 +2008 +47FC +4408 +87F8 +0408 +ENDCHAR +STARTCHAR U+8A7A +ENCODING 35450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C20 +003E +FE62 +0046 +7CE4 +01AC +0018 +7C10 +003F +00E1 +7C21 +4421 +4421 +4421 +7C3F +ENDCHAR +STARTCHAR U+8A7B +ENCODING 35451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +00FC +FC84 +01CC +7B58 +0030 +0078 +78CC +0387 +00FC +7884 +4884 +4884 +4884 +78FC +ENDCHAR +STARTCHAR U+8A7C +ENCODING 35452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +01FC +7E40 +00A0 +3CA4 +0124 +3EA8 +00B0 +3D20 +2450 +2450 +3C88 +2504 +0000 +ENDCHAR +STARTCHAR U+8A7E +ENCODING 35454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7880 +01FF +FD01 +0301 +7851 +0155 +0125 +7925 +0155 +0155 +7905 +49FD +4803 +4802 +780E +ENDCHAR +STARTCHAR U+8A7F +ENCODING 35455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +00FE +FE10 +0010 +7C10 +01FF +0000 +7C10 +0010 +00FE +7C10 +4410 +4410 +45FF +7C00 +ENDCHAR +STARTCHAR U+8A80 +ENCODING 35456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFF +0084 +FC84 +00FC +7884 +0084 +0084 +78FC +0084 +0084 +7887 +48FC +4B84 +4804 +7804 +ENDCHAR +STARTCHAR U+8A81 +ENCODING 35457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +7C44 +00FE +7C44 +0044 +7C44 +01FF +7C44 +4444 +4444 +4444 +7C84 +4504 +0000 +0000 +ENDCHAR +STARTCHAR U+8A82 +ENCODING 35458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +38A0 +00A0 +7EA8 +01A8 +39B0 +00B0 +39A8 +06A4 +38A4 +2920 +2924 +3A24 +2C1C +0000 +ENDCHAR +STARTCHAR U+8A83 +ENCODING 35459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C3E +0062 +FEC6 +01AC +7C18 +0030 +00E8 +7C0F +0019 +0033 +7CEA +4406 +440C +4438 +7DE0 +ENDCHAR +STARTCHAR U+8A84 +ENCODING 35460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C58 +03E0 +7C40 +01F8 +3C40 +03FC +3CE0 +00E0 +3D50 +2648 +2444 +3C40 +2440 +0000 +ENDCHAR +STARTCHAR U+8A85 +ENCODING 35461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3CA0 +00A0 +7EF8 +0120 +3E20 +03FC +3C70 +0070 +3CA8 +2528 +2624 +3C20 +2420 +0000 +ENDCHAR +STARTCHAR U+8A86 +ENCODING 35462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FF +0100 +FD7E +0110 +7910 +0110 +013C +7910 +0110 +0110 +7910 +497E +4900 +49FF +7800 +ENDCHAR +STARTCHAR U+8A87 +ENCODING 35463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +03FC +7CA0 +0110 +3EF8 +0004 +3DF8 +0040 +3C78 +2488 +2408 +3C08 +2030 +0000 +ENDCHAR +STARTCHAR U+8A89 +ENCODING 35465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0920 +7FFC +1020 +17D0 +3FF8 +4004 +07C0 +07C0 +0000 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8A8A +ENCODING 35466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +0920 +7FFC +0200 +FFFE +0440 +0920 +3FFE +C004 +1FF0 +0000 +1FF0 +0000 +1FF0 +1010 +1FF0 +ENDCHAR +STARTCHAR U+8A8B +ENCODING 35467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +0004 +FC04 +01FC +7900 +0102 +0102 +78FE +0000 +0020 +7932 +4953 +4945 +4B44 +7A3C +ENDCHAR +STARTCHAR U+8A8C +ENCODING 35468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +0040 +7FFC +0040 +3C40 +03F8 +3C40 +00B0 +3DA8 +2584 +2694 +3C90 +2070 +0000 +ENDCHAR +STARTCHAR U+8A8D +ENCODING 35469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0048 +7FC8 +0068 +3C88 +0130 +3C40 +00A0 +3DA8 +2584 +2694 +3C90 +2470 +0000 +ENDCHAR +STARTCHAR U+8A8F +ENCODING 35471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +01FC +FD04 +0104 +79FC +0104 +0104 +79FC +0121 +0133 +7916 +4918 +490C +49E6 +7B03 +ENDCHAR +STARTCHAR U+8A90 +ENCODING 35472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0054 +7896 +0392 +FC90 +0090 +7BFF +0090 +0092 +7892 +00D6 +0394 +788C +4888 +489D +4897 +79B2 +ENDCHAR +STARTCHAR U+8A91 +ENCODING 35473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +38FC +0290 +7D10 +0110 +3F10 +00FC +3990 +0190 +3A90 +2C90 +2890 +38FC +2B00 +0000 +ENDCHAR +STARTCHAR U+8A92 +ENCODING 35474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +0044 +FC84 +01FE +7882 +0080 +00FE +7920 +0020 +03FF +7848 +4848 +48CC +4986 +7B03 +ENDCHAR +STARTCHAR U+8A93 +ENCODING 35475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +7EE0 +0880 +0EFC +7890 +1910 +07C0 +7FFC +07C0 +07C0 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8A95 +ENCODING 35477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F0C +01F0 +7D10 +0250 +3A50 +075C +3950 +0550 +3B50 +2AFC +2B00 +3CC0 +283C +0000 +ENDCHAR +STARTCHAR U+8A96 +ENCODING 35478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +01FF +FE10 +0010 +7DFF +0101 +0101 +7CFE +0004 +0008 +7DFF +4410 +4410 +4410 +7C70 +ENDCHAR +STARTCHAR U+8A97 +ENCODING 35479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0021 +78E1 +0389 +FC89 +0089 +7BE9 +0089 +0089 +79C9 +01A9 +02A9 +7A81 +4881 +4881 +4881 +7887 +ENDCHAR +STARTCHAR U+8A98 +ENCODING 35480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3DE0 +0040 +7FFC +00E0 +3D50 +0248 +3DE4 +00A0 +3CB8 +24A8 +2508 +3D08 +2230 +0000 +ENDCHAR +STARTCHAR U+8A99 +ENCODING 35481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FE +0000 +FC92 +0092 +7924 +0124 +0092 +7892 +0000 +01FE +7810 +4810 +4810 +4BFF +7800 +ENDCHAR +STARTCHAR U+8A9A +ENCODING 35482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3CB0 +00A8 +7F24 +0224 +3DF8 +0108 +3DF8 +0108 +3DF8 +2508 +2508 +3D08 +2518 +0000 +ENDCHAR +STARTCHAR U+8A9E +ENCODING 35486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0040 +7E40 +01F0 +3C90 +0090 +3FFC +0000 +3DF8 +2508 +2508 +3DF8 +2508 +0000 +ENDCHAR +STARTCHAR U+8A9F +ENCODING 35487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7822 +00FA +FC24 +0028 +7BFF +0020 +00C0 +7B7C +0008 +0010 +79FF +4810 +4810 +4810 +7870 +ENDCHAR +STARTCHAR U+8AA0 +ENCODING 35488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C28 +0024 +7FFC +0120 +3D28 +01E8 +3D68 +0150 +3D50 +2554 +26EC +3E4C +2484 +0000 +ENDCHAR +STARTCHAR U+8AA1 +ENCODING 35489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0028 +3824 +0024 +7FFC +0020 +3AA8 +02A8 +3FE8 +02B8 +3A90 +2A94 +2AAC +3C4C +2884 +0000 +ENDCHAR +STARTCHAR U+8AA3 +ENCODING 35491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3BFC +0040 +7D50 +0150 +3950 +0150 +3950 +02E8 +3AE4 +2C44 +2840 +3FFC +2800 +0000 +ENDCHAR +STARTCHAR U+8AA4 +ENCODING 35492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3C78 +0148 +7F48 +0178 +3D00 +01F8 +3D08 +0008 +3FFC +2450 +2448 +3C84 +2504 +0000 +ENDCHAR +STARTCHAR U+8AA5 +ENCODING 35493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3CA0 +00A0 +7EFC +0120 +3E20 +03FC +3C20 +00F8 +3C88 +2488 +2488 +3CF8 +2488 +0000 +ENDCHAR +STARTCHAR U+8AA6 +ENCODING 35494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0050 +7E20 +01F8 +3D48 +0148 +3DF8 +0148 +3D48 +25F8 +2548 +3D48 +2558 +0000 +ENDCHAR +STARTCHAR U+8AA7 +ENCODING 35495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +7822 +03FF +FC20 +0020 +79FE +0122 +0122 +79FE +0122 +0122 +79FE +4922 +4922 +4922 +7926 +ENDCHAR +STARTCHAR U+8AA8 +ENCODING 35496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3C80 +00FC +7F00 +02F8 +3CC8 +00A8 +3FFC +0148 +3D28 +2528 +27FC +3C08 +2430 +0000 +ENDCHAR +STARTCHAR U+8AA9 +ENCODING 35497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7C7C +0000 +FEFF +0000 +7C7C +0000 +0000 +7C7C +0000 +0000 +7C7C +4444 +4444 +4444 +7C7C +ENDCHAR +STARTCHAR U+8AAA +ENCODING 35498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3C38 +0084 +7E82 +0101 +02FC +3C84 +0084 +3C84 +00FC +0048 +3C48 +2448 +2489 +3C8F +2500 +ENDCHAR +STARTCHAR U+8AAB +ENCODING 35499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FF +1080 +7C80 +00BE +3880 +0080 +38FF +00A0 +7CA5 +44A6 +44A4 +44AC +7D32 +4461 +0000 +0000 +ENDCHAR +STARTCHAR U+8AAC +ENCODING 35500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3C90 +00A0 +7FF8 +0108 +3D08 +01F8 +3D68 +0060 +3C60 +24A0 +24A4 +3D24 +261C +0000 +ENDCHAR +STARTCHAR U+8AAD +ENCODING 35501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +03FC +7C40 +01F8 +3C00 +01FC +3D08 +02A0 +3CA0 +24A0 +24A4 +3D24 +261C +0000 +ENDCHAR +STARTCHAR U+8AAE +ENCODING 35502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +7848 +03FF +FC48 +0048 +7800 +0050 +0050 +7893 +009E +0190 +7A90 +4890 +4891 +4899 +788F +ENDCHAR +STARTCHAR U+8AAF +ENCODING 35503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7C7E +0042 +FE42 +007E +7C42 +0042 +007E +7C00 +00FF +0081 +7C81 +44FF +4481 +4481 +7CFF +ENDCHAR +STARTCHAR U+8AB0 +ENCODING 35504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3C90 +00A0 +7FFC +0120 +3F20 +01F8 +3D20 +0120 +3DF8 +2520 +2520 +3DFC +2100 +0000 +ENDCHAR +STARTCHAR U+8AB2 +ENCODING 35506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0148 +7F48 +01F8 +3D48 +01F8 +3C40 +03FC +3CE0 +2550 +2648 +3C44 +2440 +0000 +ENDCHAR +STARTCHAR U+8AB3 +ENCODING 35507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFF +0081 +FE81 +00FF +7C80 +0088 +00A9 +7CA9 +00BF +0088 +7C88 +45A9 +4529 +4729 +7C3F +ENDCHAR +STARTCHAR U+8AB6 +ENCODING 35510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +03FE +FC00 +0088 +7888 +01DC +0356 +7800 +0020 +07FF +7820 +4820 +4820 +4820 +7820 +ENDCHAR +STARTCHAR U+8AB7 +ENCODING 35511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FF +0101 +FD45 +0129 +79FF +0111 +0111 +79FF +0121 +0121 +7921 +493D +4901 +4901 +7907 +ENDCHAR +STARTCHAR U+8AB8 +ENCODING 35512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13C4 +7C44 +007F +7FC0 +0208 +7E09 +03D1 +7C7E +4444 +4448 +4451 +7C7F +4581 +0000 +0000 +ENDCHAR +STARTCHAR U+8AB9 +ENCODING 35513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3C50 +0050 +7FDC +0050 +3C50 +03DC +3C50 +0050 +3CDC +2790 +2490 +3D10 +2610 +0000 +ENDCHAR +STARTCHAR U+8ABA +ENCODING 35514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +7DFF +0010 +7C92 +0092 +7D55 +0010 +7C38 +4454 +4492 +4511 +7C10 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+8ABB +ENCODING 35515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C12 +01D6 +FE58 +005C +7CD6 +0193 +0030 +7C00 +00FE +0082 +7C82 +44FE +4482 +4482 +7CFE +ENDCHAR +STARTCHAR U+8ABC +ENCODING 35516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +03FC +7E08 +03F0 +3D10 +0110 +3DF0 +0110 +3DF0 +2510 +2510 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+8ABD +ENCODING 35517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1046 +7C82 +0182 +7CEE +0082 +7C82 +00FE +7C48 +4448 +4448 +4449 +7C89 +450F +0000 +0000 +ENDCHAR +STARTCHAR U+8ABE +ENCODING 35518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +47E2 +5FFA +4002 +47E2 +47E2 +4002 +47E2 +4422 +47E2 +4006 +ENDCHAR +STARTCHAR U+8ABF +ENCODING 35519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0148 +7F48 +01F8 +3D48 +01F8 +3D08 +01E8 +3DA8 +25A8 +26E8 +3E08 +2418 +0000 +ENDCHAR +STARTCHAR U+8AC0 +ENCODING 35520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FE +7D92 +00FE +7C92 +00FE +7C20 +0048 +7C88 +45FF +4408 +4408 +7C08 +4408 +0000 +0000 +ENDCHAR +STARTCHAR U+8AC2 +ENCODING 35522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +0078 +7E88 +0088 +3D30 +0040 +3DB8 +0108 +3DB8 +2508 +2508 +3DF8 +2508 +0000 +ENDCHAR +STARTCHAR U+8AC3 +ENCODING 35523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +7884 +0084 +FDDF +0084 +7884 +01CE +01AE +7A95 +0295 +0295 +7884 +4884 +4884 +4884 +7884 +ENDCHAR +STARTCHAR U+8AC4 +ENCODING 35524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +01FC +7E00 +00F8 +3C88 +00F8 +3C00 +00F8 +3C10 +25FC +2420 +3C20 +2460 +0000 +ENDCHAR +STARTCHAR U+8AC5 +ENCODING 35525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +3FFE +0FF8 +0FF8 +0808 +7FFF +0888 +17F4 +2002 +47F1 +07F0 +0FF8 +0808 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+8AC6 +ENCODING 35526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7C44 +01FF +FE44 +0044 +7C7C +0044 +0044 +7C7C +0044 +0044 +7DFF +4400 +4444 +44C6 +7D83 +ENDCHAR +STARTCHAR U+8AC7 +ENCODING 35527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C28 +00A8 +7EB0 +0120 +3C50 +0088 +3C24 +00A4 +3CA8 +2530 +2450 +3C88 +2704 +0000 +ENDCHAR +STARTCHAR U+8AC8 +ENCODING 35528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +7838 +01E0 +FC20 +03FE +7924 +0124 +03FF +7924 +0124 +0124 +7BFE +4820 +4820 +4BFF +7800 +ENDCHAR +STARTCHAR U+8AC9 +ENCODING 35529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +78F8 +0020 +FDFF +00A8 +78AC +01A6 +0323 +7820 +0040 +03FF +7844 +488C +49F8 +486C +79C6 +ENDCHAR +STARTCHAR U+8ACA +ENCODING 35530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7880 +00FF +FD01 +0221 +7925 +00A9 +01FD +7821 +0071 +0069 +78A5 +48A1 +4923 +4822 +780E +ENDCHAR +STARTCHAR U+8ACB +ENCODING 35531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3DFC +0020 +7EF8 +0020 +3FFC +0000 +3CF8 +0088 +3CF8 +2488 +24F8 +3C88 +2498 +0000 +ENDCHAR +STARTCHAR U+8ACC +ENCODING 35532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +03FC +7C40 +01F8 +3D48 +01F8 +3D48 +01F8 +3CE0 +2550 +2648 +3C44 +2440 +0000 +ENDCHAR +STARTCHAR U+8ACD +ENCODING 35533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3DF0 +0148 +7F24 +0204 +3DF8 +0048 +3FFC +0048 +3DF8 +2448 +2440 +3C40 +24C0 +0000 +ENDCHAR +STARTCHAR U+8ACF +ENCODING 35535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FC0 +02F8 +7AA8 +03A8 +3AA8 +02A8 +3B98 +0290 +3AD0 +2BB0 +2EA8 +38C8 +2084 +0000 +ENDCHAR +STARTCHAR U+8AD1 +ENCODING 35537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFF +0040 +FCC0 +01A2 +7B26 +0074 +00D0 +7990 +0338 +0058 +78D4 +4996 +4B13 +4E30 +78E0 +ENDCHAR +STARTCHAR U+8AD2 +ENCODING 35538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +01FC +7E00 +00F8 +3C88 +0088 +3CF8 +0020 +3CB0 +24A8 +2524 +3E24 +2060 +0000 +ENDCHAR +STARTCHAR U+8AD3 +ENCODING 35539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +7844 +007E +FDE0 +0036 +7818 +006D +0187 +7848 +0044 +007E +7BE0 +4836 +4818 +486D +7B87 +ENDCHAR +STARTCHAR U+8AD4 +ENCODING 35540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +713E +0112 +F9D2 +0112 +7116 +0114 +07D4 +711C +0108 +0548 +755C +5554 +5556 +5112 +7333 +ENDCHAR +STARTCHAR U+8AD5 +ENCODING 35541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +783E +0020 +FDFF +0101 +7922 +0138 +01E0 +7922 +011E +0100 +7928 +4B28 +4A29 +4E69 +78C7 +ENDCHAR +STARTCHAR U+8AD6 +ENCODING 35542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3840 +00A0 +7CA0 +0110 +3BF8 +0404 +3BF8 +02A8 +3AA8 +2BF8 +2AA8 +3AA8 +2218 +0000 +ENDCHAR +STARTCHAR U+8AD7 +ENCODING 35543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7870 +00D8 +FD8E +0303 +78F8 +0000 +01FE +7804 +0008 +0020 +7830 +4952 +4943 +4B45 +7A3C +ENDCHAR +STARTCHAR U+8AD8 +ENCODING 35544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +7C10 +00FE +7C10 +01FF +7C20 +0041 +7CCA +454C +4444 +4452 +7C61 +44C0 +0000 +0000 +ENDCHAR +STARTCHAR U+8AD9 +ENCODING 35545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +1084 +7C84 +00FF +7C84 +00A4 +7CC3 +0181 +7C00 +44FE +4482 +44FE +7C82 +44FE +0000 +0000 +ENDCHAR +STARTCHAR U+8ADA +ENCODING 35546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +01FC +7F08 +0200 +3DFC +0020 +3CA0 +00B8 +3CA0 +24A0 +24E0 +3D30 +260C +0000 +ENDCHAR +STARTCHAR U+8ADB +ENCODING 35547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00C0 +3B58 +0248 +7E48 +0358 +3A48 +0248 +3BF8 +0248 +38A0 +28A0 +2910 +3A08 +2C04 +0000 +ENDCHAR +STARTCHAR U+8ADC +ENCODING 35548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0150 +3D50 +03FC +7D50 +0150 +3D70 +0100 +3DF8 +0040 +3FFC +24E0 +2550 +3E4C +2440 +0000 +ENDCHAR +STARTCHAR U+8ADD +ENCODING 35549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DFF +0011 +FE9E +0090 +7CD0 +01BF +0000 +7CFE +0082 +00FE +7C82 +44FE +4482 +4482 +7C86 +ENDCHAR +STARTCHAR U+8ADE +ENCODING 35550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +7FF8 +0208 +3BF8 +0200 +3BF8 +02A8 +3FF8 +2AA8 +2AA8 +3AA8 +2A18 +0000 +ENDCHAR +STARTCHAR U+8ADF +ENCODING 35551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +78FC +0084 +FCFC +0084 +7884 +00FC +0000 +7BFF +0020 +0020 +78BE +48A0 +48A0 +4970 +7A1F +ENDCHAR +STARTCHAR U+8AE0 +ENCODING 35552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +01FC +7F08 +03FC +3C00 +00F8 +3C88 +00F8 +3C88 +24F8 +2400 +3FFC +2400 +0000 +ENDCHAR +STARTCHAR U+8AE1 +ENCODING 35553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF0 +0090 +7DF8 +0244 +3CF0 +0010 +3C60 +01F8 +3D68 +2568 +2568 +3FFC +2400 +0000 +ENDCHAR +STARTCHAR U+8AE2 +ENCODING 35554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +0148 +7FFC +0040 +3DF8 +0148 +3DF8 +0148 +3DF8 +2440 +27FC +3C40 +2440 +0000 +ENDCHAR +STARTCHAR U+8AE4 +ENCODING 35556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DDC +0154 +7FDC +0000 +3CF8 +0000 +3DFC +0040 +3C78 +2488 +2408 +3C08 +2430 +0000 +ENDCHAR +STARTCHAR U+8AE6 +ENCODING 35558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +01FC +7E88 +0050 +3DFC +0124 +3EF8 +00A8 +3CA8 +24A8 +24B8 +3C20 +2420 +0000 +ENDCHAR +STARTCHAR U+8AE7 +ENCODING 35559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +3D24 +01F8 +7F20 +0124 +3DE4 +033C +3C40 +01F8 +3D08 +25F8 +2508 +3DF8 +2508 +0000 +ENDCHAR +STARTCHAR U+8AE8 +ENCODING 35560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +08FE +7E00 +007C +3C44 +007C +3C00 +01FF +3D11 +2511 +25FF +2511 +3D11 +25FF +0000 +0000 +ENDCHAR +STARTCHAR U+8AEA +ENCODING 35562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3C10 +01FF +7E00 +00FE +0082 +3CFE +0000 +3CFE +0004 +0008 +3C10 +27FF +2410 +3C10 +2430 +ENDCHAR +STARTCHAR U+8AEB +ENCODING 35563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +03FC +7C40 +03F8 +3F58 +02D8 +3EE8 +03F8 +3CE0 +2550 +2648 +3C44 +2440 +0000 +ENDCHAR +STARTCHAR U+8AEC +ENCODING 35564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0224 +3C22 +08FF +FE20 +1C71 +2A99 +480F +07E0 +0000 +FFFF +0000 +1FF8 +0000 +1FF8 +1008 +1FF8 +ENDCHAR +STARTCHAR U+8AED +ENCODING 35565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3840 +00A0 +7D10 +03F8 +3C04 +03A8 +3AA8 +03A8 +3AA8 +2BA8 +2AA8 +3A88 +2A98 +0000 +ENDCHAR +STARTCHAR U+8AEE +ENCODING 35566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +017C +7DA4 +0028 +3CB0 +0350 +3C48 +0084 +3DF8 +2508 +2508 +3DF8 +2108 +0000 +ENDCHAR +STARTCHAR U+8AEF +ENCODING 35567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0892 +7E92 +00FE +3C00 +01FF +3C10 +0020 +3DFF +2529 +2529 +2529 +3D29 +2503 +0000 +0000 +ENDCHAR +STARTCHAR U+8AF0 +ENCODING 35568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FE +0122 +FD22 +01FE +7922 +0122 +0122 +79FE +0000 +0020 +7830 +4952 +4943 +4B45 +7A3C +ENDCHAR +STARTCHAR U+8AF1 +ENCODING 35569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3DF8 +0048 +7FFC +0000 +3CF8 +0088 +3CF8 +0010 +3CF8 +2490 +27FC +3C10 +2410 +0000 +ENDCHAR +STARTCHAR U+8AF2 +ENCODING 35570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1028 +7C28 +01FF +7D29 +0129 +7DFF +0000 +7C10 +4410 +44FE +4410 +7C10 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+8AF3 +ENCODING 35571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +01FC +7E88 +0048 +3C50 +01FC +3C00 +00F8 +3C88 +24F8 +2488 +3CF8 +2488 +0000 +ENDCHAR +STARTCHAR U+8AF4 +ENCODING 35572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000A +7809 +0009 +FFFF +0208 +7AE9 +0209 +02EB +7AAA +02AE +02A4 +7AE4 +4A0D +4A1D +4C37 +7862 +ENDCHAR +STARTCHAR U+8AF5 +ENCODING 35573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7810 +01FF +FC10 +0010 +79FF +0101 +0145 +7929 +017D +0111 +797D +4911 +4911 +4911 +7903 +ENDCHAR +STARTCHAR U+8AF6 +ENCODING 35574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +3C84 +0084 +7FFF +0084 +00FC +3C84 +00FC +3C84 +03FF +0148 +3D4A +258E +2500 +3DFF +2500 +ENDCHAR +STARTCHAR U+8AF7 +ENCODING 35575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3BF0 +0230 +7FD0 +0290 +3BF0 +03B0 +3BB0 +03F0 +3A90 +2AB4 +2CFC +3F1C +2804 +0000 +ENDCHAR +STARTCHAR U+8AF8 +ENCODING 35576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +01F8 +7C48 +0050 +3FFC +0040 +3CF8 +0188 +3EF8 +2488 +2488 +3CF8 +2088 +0000 +ENDCHAR +STARTCHAR U+8AFA +ENCODING 35578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +03FC +7C88 +0050 +3DFC +0110 +3D20 +01C8 +3D10 +2564 +2608 +3E30 +25C0 +0000 +ENDCHAR +STARTCHAR U+8AFB +ENCODING 35579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +09FE +7E82 +00FE +3C82 +00FE +3C00 +00FE +3C10 +2410 +24FE +2410 +3C10 +25FF +0000 +0000 +ENDCHAR +STARTCHAR U+8AFC +ENCODING 35580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +783C +03E2 +FD26 +0094 +7BFF +0040 +03FF +7840 +007C +0044 +78EC +4BA8 +4838 +486C +7BC7 +ENDCHAR +STARTCHAR U+8AFE +ENCODING 35582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3C90 +01FC +7ED0 +0040 +3FFC +0040 +3C80 +00F8 +3D88 +2688 +2488 +3CF8 +2088 +0000 +ENDCHAR +STARTCHAR U+8AFF +ENCODING 35583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +78FC +0084 +FC84 +00FC +7800 +03FF +0084 +78FC +0084 +00FC +7887 +48FC +4B84 +4804 +7804 +ENDCHAR +STARTCHAR U+8B00 +ENCODING 35584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3910 +03FC +7D10 +01F0 +3D10 +01F0 +3C40 +03FC +3CE0 +2550 +2648 +3C44 +2040 +0000 +ENDCHAR +STARTCHAR U+8B01 +ENCODING 35585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF0 +0110 +7FF0 +0110 +3DF0 +0080 +3DF8 +0328 +3DC8 +2528 +24E8 +3C08 +2030 +0000 +ENDCHAR +STARTCHAR U+8B02 +ENCODING 35586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +0124 +7FFC +0124 +3DFC +0000 +3CF8 +0088 +3CF8 +2488 +24F8 +3C88 +2498 +0000 +ENDCHAR +STARTCHAR U+8B04 +ENCODING 35588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0248 +3D50 +27F8 +24A0 +3FFC +2510 +26F8 +27FC +3CF0 +24F0 +25F8 +2508 +25F8 +4D08 +0000 +ENDCHAR +STARTCHAR U+8B05 +ENCODING 35589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +79FE +0242 +FD52 +0152 +79F2 +0086 +011C +7880 +01FE +0242 +7952 +4952 +49F2 +4886 +791C +ENDCHAR +STARTCHAR U+8B06 +ENCODING 35590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFF +0000 +FDFE +0102 +7902 +01FE +0100 +79EF +0121 +01A9 +7965 +4B23 +4A65 +4EA9 +7863 +ENDCHAR +STARTCHAR U+8B07 +ENCODING 35591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2288 +5FF8 +0FE0 +7FFC +0440 +1FF0 +6FEC +07C0 +07C0 +0FE0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+8B08 +ENCODING 35592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07F0 +05D0 +07F0 +0220 +1FFC +0220 +3FFE +0490 +0FF8 +33E6 +03E0 +07F0 +0410 +07F0 +0000 +0000 +ENDCHAR +STARTCHAR U+8B0A +ENCODING 35594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +7884 +03FF +FC84 +0020 +7BFF +0080 +0080 +787E +0000 +00A4 +78A4 +48A4 +48A5 +49A5 +7B03 +ENDCHAR +STARTCHAR U+8B0B +ENCODING 35595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +79E2 +013F +FBAA +02EA +784A +00DF +0182 +7B02 +0020 +03FF +78A8 +48AC +49A6 +4B23 +7820 +ENDCHAR +STARTCHAR U+8B0C +ENCODING 35596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +0008 +7EE8 +00A8 +3CE8 +0018 +3DFC +0008 +3CE8 +24A8 +24E8 +3C08 +2418 +0000 +ENDCHAR +STARTCHAR U+8B0D +ENCODING 35597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2A2A +0808 +1414 +2222 +7FFF +4081 +4FF9 +0000 +07F0 +07F0 +0000 +0FF8 +0808 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+8B0E +ENCODING 35598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3A28 +01A8 +7D70 +0020 +38FC +0770 +3970 +01A8 +39A4 +2920 +2B20 +3CC0 +283C +0000 +ENDCHAR +STARTCHAR U+8B0F +ENCODING 35599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +0857 +7F91 +0111 +3DD7 +0111 +3DD7 +0010 +3CFE +2404 +2468 +2410 +3C28 +24C7 +0000 +0000 +ENDCHAR +STARTCHAR U+8B10 +ENCODING 35600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3828 +00A8 +7E90 +0298 +3AA4 +04D4 +38F0 +03F8 +3AA8 +2AA8 +2AA8 +3FFC +2800 +0000 +ENDCHAR +STARTCHAR U+8B11 +ENCODING 35601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +7C1C +00F1 +FD1B +018A +7CA0 +0048 +0090 +7C64 +003E +01E3 +7C10 +45FF +4428 +4444 +7D83 +ENDCHAR +STARTCHAR U+8B12 +ENCODING 35602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +0828 +7E44 +0092 +3D7D +0044 +3C7C +0044 +3C7C +2480 +257E +2642 +3C42 +247E +0000 +0000 +ENDCHAR +STARTCHAR U+8B13 +ENCODING 35603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +7C10 +00FE +7C82 +00FE +7C82 +00FE +7C82 +44FE +4482 +45FF +7C82 +4501 +0000 +0000 +ENDCHAR +STARTCHAR U+8B14 +ENCODING 35604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C3C +0020 +7FFC +0138 +3DE4 +011C +3D00 +017C +3D40 +25FC +2640 +3E7C +2440 +0000 +ENDCHAR +STARTCHAR U+8B15 +ENCODING 35605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +09FE +7E88 +008E +3CBF +00A9 +3CBE +00A8 +3CAE +24A0 +24BC +24B4 +3D55 +2623 +0000 +0000 +ENDCHAR +STARTCHAR U+8B16 +ENCODING 35606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +0148 +7FF8 +0148 +3DF8 +00A4 +3D5C +0240 +3CF8 +2790 +2460 +3CF0 +270C +0000 +ENDCHAR +STARTCHAR U+8B17 +ENCODING 35607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +01FC +7E88 +0050 +3DFC +0128 +3E20 +01FC +3C20 +2438 +2448 +3C88 +2530 +0000 +ENDCHAR +STARTCHAR U+8B18 +ENCODING 35608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FF +0881 +7EFF +0088 +3C88 +00FF +3CA2 +0094 +3CFF +2488 +2488 +257F +3E08 +2408 +0000 +0000 +ENDCHAR +STARTCHAR U+8B19 +ENCODING 35609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +38A0 +03FC +7CA0 +03F8 +38A8 +07FC +38A8 +03F8 +38A0 +29B0 +2AA8 +3CA4 +20A0 +0000 +ENDCHAR +STARTCHAR U+8B1A +ENCODING 35610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00F0 +3C90 +0108 +7FF4 +0000 +3CF0 +0090 +3D08 +03FC +3D68 +2568 +2568 +3FFC +2400 +0000 +ENDCHAR +STARTCHAR U+8B1B +ENCODING 35611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3FF8 +00A0 +7FF8 +00A0 +3FFC +0040 +3DF8 +0148 +3DF8 +2548 +27FC +3D08 +2518 +0000 +ENDCHAR +STARTCHAR U+8B1C +ENCODING 35612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FF +0108 +FD10 +017E +7942 +0142 +017E +7942 +0142 +017E +7910 +4B54 +4AD6 +4E93 +7830 +ENDCHAR +STARTCHAR U+8B1D +ENCODING 35613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +3908 +03C8 +7E48 +03FC +3A48 +03E8 +3A78 +07D8 +38C8 +2948 +2E48 +3848 +20D8 +0000 +ENDCHAR +STARTCHAR U+8B1E +ENCODING 35614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +03FF +FC00 +00FC +7884 +00FC +0000 +79FE +0102 +017A +794A +494A +497A +4902 +7906 +ENDCHAR +STARTCHAR U+8B1F +ENCODING 35615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +783C +01E0 +FC21 +0133 +7996 +0084 +0060 +79CE +0102 +0102 +79CE +4902 +4902 +4902 +79FE +ENDCHAR +STARTCHAR U+8B20 +ENCODING 35616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3CF8 +0348 +7EB0 +00E0 +3F80 +00F8 +3D20 +03FC +3C20 +2528 +2528 +3DF8 +2508 +0000 +ENDCHAR +STARTCHAR U+8B21 +ENCODING 35617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3C30 +03C8 +7E48 +0150 +3D20 +03F8 +3C40 +03FC +3840 +2A48 +2A48 +3BF8 +2208 +0000 +ENDCHAR +STARTCHAR U+8B22 +ENCODING 35618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +087F +7E88 +01FE +3C88 +00FE +3C88 +00FF +3C00 +247E +2424 +2418 +3C18 +24E7 +0000 +0000 +ENDCHAR +STARTCHAR U+8B23 +ENCODING 35619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1010 +7DFF +0195 +7D53 +0084 +7CFE +0000 +7DFF +4440 +447E +4402 +7C02 +441E +0000 +0000 +ENDCHAR +STARTCHAR U+8B24 +ENCODING 35620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1028 +7DFF +0129 +7DFF +0000 +7CFE +0000 +7DFF +4454 +4492 +4511 +7C10 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+8B25 +ENCODING 35621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FE +7D8A +00D2 +7CA6 +00DA +009A +7CA6 +00FE +7C20 +4512 +4541 +4644 +7C7C +0000 +0000 +ENDCHAR +STARTCHAR U+8B26 +ENCODING 35622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +7F50 +3E94 +3FFC +2A90 +3E60 +239C +47C0 +3FF8 +07C0 +07C0 +0FE0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+8B27 +ENCODING 35623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +09FF +7EAA +0092 +3CAA +0082 +3CFE +0010 +3DFF +2511 +2525 +257D +3D01 +2503 +0000 +0000 +ENDCHAR +STARTCHAR U+8B28 +ENCODING 35624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3C90 +03FC +7E90 +01F8 +3D08 +01F8 +3D08 +01F8 +3C40 +27FC +24A0 +3D10 +260C +0000 +ENDCHAR +STARTCHAR U+8B2A +ENCODING 35626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +7C82 +0044 +7DFF +0129 +7D49 +0187 +7D7D +4545 +457D +4501 +7D01 +4507 +0000 +0000 +ENDCHAR +STARTCHAR U+8B2B +ENCODING 35627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3840 +07FC +7D10 +00A0 +3BF8 +0248 +3BF8 +0248 +3AE8 +2AA8 +2AE8 +3AA8 +2A18 +0000 +ENDCHAR +STARTCHAR U+8B2C +ENCODING 35628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +04C8 +7BB8 +02A8 +3CC8 +0198 +38C0 +0330 +3DCC +2820 +29C8 +3830 +2BC0 +0000 +ENDCHAR +STARTCHAR U+8B2D +ENCODING 35629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +7BFF +0000 +FDE2 +012A +79EA +012A +01E2 +7922 +016E +0000 +7BFF +4841 +4841 +48C3 +798E +ENDCHAR +STARTCHAR U+8B2E +ENCODING 35630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +0010 +7DFF +0010 +7DFF +00FE +7C82 +00FE +7C82 +44FE +4482 +44FE +7D83 +0000 +0000 +ENDCHAR +STARTCHAR U+8B2F +ENCODING 35631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +101C +7C10 +01FF +7D11 +017E +7D10 +011E +7D7E +4542 +457E +467E +7C42 +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+8B30 +ENCODING 35632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7210 +03FF +F910 +007E +7052 +0052 +077E +7152 +0152 +017E +7110 +51FF +5310 +5290 +767F +ENDCHAR +STARTCHAR U+8B31 +ENCODING 35633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +7C92 +01FF +7C92 +00FE +7DFF +0111 +7DFF +4454 +45FF +4428 +7C10 +45EF +0000 +0000 +ENDCHAR +STARTCHAR U+8B33 +ENCODING 35635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3BFC +0200 +7EF0 +0290 +3AF0 +0200 +3BF8 +0368 +3B68 +2BF8 +2A00 +3BFC +2A00 +0000 +ENDCHAR +STARTCHAR U+8B35 +ENCODING 35637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +0821 +7EA5 +016B +3CA5 +0021 +3CC6 +0000 +3C20 +24FE +2442 +247E +3C42 +247E +0000 +0000 +ENDCHAR +STARTCHAR U+8B36 +ENCODING 35638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1010 +01FF +7D00 +0144 +7D44 +01FF +7D44 +0144 +7D7C +4500 +45A9 +46A9 +7CA9 +0000 +0000 +ENDCHAR +STARTCHAR U+8B37 +ENCODING 35639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F20 +087F +FFC2 +1036 +3F1C +6136 +C7E3 +0000 +FFFF +0000 +0FF0 +0000 +1FF8 +1008 +1FF8 +ENDCHAR +STARTCHAR U+8B39 +ENCODING 35641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3C90 +03FC +7C90 +03F8 +3E48 +03F8 +3C40 +03F8 +3C40 +27F8 +2440 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+8B3A +ENCODING 35642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +3E7C +0814 +7F54 +2235 +7F25 +7F47 +0880 +3FFE +0FF8 +0FF8 +1FFC +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8B3B +ENCODING 35643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +13CF +7C91 +00A1 +7C8A +03E4 +0088 +7C94 +01CF +7EB1 +44A5 +4482 +4484 +7CB8 +0000 +0000 +ENDCHAR +STARTCHAR U+8B3C +ENCODING 35644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +783E +0020 +FDFF +0121 +79FD +0122 +011E +7904 +01F8 +0152 +7934 +4BFF +4A10 +4E10 +7870 +ENDCHAR +STARTCHAR U+8B3D +ENCODING 35645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E44 +02FE +3E10 +20FE +3E92 +02FE +0211 +0CFF +1FFC +07F0 +07F0 +0FF8 +0808 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+8B3E +ENCODING 35646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3CF8 +0088 +7EF8 +0088 +3CF8 +01FC +3D54 +01FC +3DF8 +2490 +2460 +3CF0 +270C +0000 +ENDCHAR +STARTCHAR U+8B40 +ENCODING 35648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11E0 +0848 +7E88 +03EF +3D50 +0142 +3DCA +014A +3D4A +25CA +254A +2544 +3FCA +2451 +0000 +0000 +ENDCHAR +STARTCHAR U+8B41 +ENCODING 35649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +38A0 +07FC +7CA0 +03F8 +3950 +07FC +3950 +03F8 +3840 +2FFC +2840 +3840 +2840 +0000 +ENDCHAR +STARTCHAR U+8B42 +ENCODING 35650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79EF +0129 +FDEF +0000 +78FE +0092 +0092 +78FE +0092 +0092 +78FE +4810 +49FF +4810 +7810 +ENDCHAR +STARTCHAR U+8B43 +ENCODING 35651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +783E +0020 +FDFF +0121 +79FD +0122 +011E +7900 +0114 +0155 +7955 +4B55 +4A36 +4E14 +78FF +ENDCHAR +STARTCHAR U+8B44 +ENCODING 35652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0082 +7844 +01FF +FD11 +0111 +79FF +0111 +0111 +79FF +0000 +00FE +7882 +48FE +4882 +4882 +78FE +ENDCHAR +STARTCHAR U+8B45 +ENCODING 35653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +77DF +0249 +FA49 +0659 +734D +0249 +04D3 +7000 +0104 +05D7 +7514 +5514 +55D4 +573F +7C00 +ENDCHAR +STARTCHAR U+8B46 +ENCODING 35654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +0010 +FEFE +0000 +7CFE +0082 +00FE +7C44 +0028 +01FF +7C00 +44FE +4482 +4482 +7CFE +ENDCHAR +STARTCHAR U+8B47 +ENCODING 35655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +7C28 +0054 +3892 +017D +3818 +01FF +7C20 +447F +44C1 +457F +7C41 +447F +0000 +0000 +ENDCHAR +STARTCHAR U+8B48 +ENCODING 35656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +7888 +03E8 +FC0F +03EA +7A32 +03EA +000A +7BEA +004E +0084 +78E4 +4B8E +488A +489B +7B91 +ENDCHAR +STARTCHAR U+8B49 +ENCODING 35657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C8 +3868 +02B4 +7D94 +01F8 +3A08 +05F4 +3910 +0110 +39F0 +2910 +28A0 +3FFC +2800 +0000 +ENDCHAR +STARTCHAR U+8B4A +ENCODING 35658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +08FE +7E10 +01FF +3C44 +00EE +3C44 +01FF +3C00 +25FF +2428 +2448 +3C89 +250F +0000 +0000 +ENDCHAR +STARTCHAR U+8B4B +ENCODING 35659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +0929 +7FEF +0129 +3DEF +0139 +3D29 +0139 +3D29 +2539 +2529 +2529 +3D49 +2503 +0000 +0000 +ENDCHAR +STARTCHAR U+8B4C +ENCODING 35660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3BF0 +0148 +7D24 +03E4 +3920 +01F0 +3910 +01FC +3A04 +2AD4 +2D6C +3944 +2A18 +0000 +ENDCHAR +STARTCHAR U+8B4D +ENCODING 35661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4488 +49FE +5B10 +69FE +4910 +49FF +4000 +7FFF +4000 +47F8 +C000 +8FFC +8804 +0FFC +ENDCHAR +STARTCHAR U+8B4E +ENCODING 35662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3BF0 +00A0 +7C40 +07FC +38C8 +0350 +38C0 +03F8 +3AB8 +2BF8 +2AA8 +3AE8 +2A18 +0000 +ENDCHAR +STARTCHAR U+8B4F +ENCODING 35663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0148 +3948 +06F4 +7ED4 +0148 +3AD4 +07FC +3850 +03FC +3928 +29A8 +2A94 +3A2C +2CC4 +0000 +ENDCHAR +STARTCHAR U+8B50 +ENCODING 35664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +09FF +7E28 +00FE +3CAA +00CE +3CBA +0082 +3CFE +2404 +25FF +2484 +3C44 +241C +0000 +0000 +ENDCHAR +STARTCHAR U+8B51 +ENCODING 35665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +08FC +7E10 +01FF +3C44 +00BA +3D29 +0038 +3C00 +24FE +24BA +24AA +3CBA +2482 +0000 +0000 +ENDCHAR +STARTCHAR U+8B52 +ENCODING 35666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +7838 +03E0 +FD24 +00A8 +7BFF +00A8 +01AC +7B26 +0603 +01FC +7924 +49FC +4924 +4924 +79FC +ENDCHAR +STARTCHAR U+8B53 +ENCODING 35667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BFF +0020 +FDFE +0122 +79FE +0122 +01FE +7824 +03FE +0023 +78B0 +4A92 +4A83 +4AC5 +7A7C +ENDCHAR +STARTCHAR U+8B54 +ENCODING 35668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79EF +0021 +FDEF +0108 +7929 +00E7 +0000 +7848 +01FE +0048 +7848 +4BFF +4848 +48CC +7B87 +ENDCHAR +STARTCHAR U+8B55 +ENCODING 35669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +0840 +7EFF +01AA +3CAA +01FF +3CAA +00AA +3CAA +25FF +2400 +252A +3D29 +2529 +0000 +0000 +ENDCHAR +STARTCHAR U+8B56 +ENCODING 35670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +3BFC +02A8 +7EA8 +03FC +39D8 +01AC +3A4C +05F8 +3908 +29F8 +2908 +39F8 +2908 +0000 +ENDCHAR +STARTCHAR U+8B57 +ENCODING 35671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +09EF +7E52 +0028 +3C44 +0082 +3D7D +0000 +3CFE +2482 +2482 +2482 +3CFE +2482 +0000 +0000 +ENDCHAR +STARTCHAR U+8B58 +ENCODING 35672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +3930 +07E8 +7AA8 +02A0 +3FFC +0028 +3BA8 +02B0 +3B90 +2AB4 +2BAC +3A4C +2084 +0000 +ENDCHAR +STARTCHAR U+8B59 +ENCODING 35673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +7890 +01FF +FD10 +0310 +79FE +0110 +0110 +79FE +0110 +0110 +79FF +4800 +4952 +4B5B +7A49 +ENDCHAR +STARTCHAR U+8B5A +ENCODING 35674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +00A0 +7FF8 +02A8 +3BF8 +01F0 +3910 +01F0 +3910 +29F0 +2FFC +3840 +2840 +0000 +ENDCHAR +STARTCHAR U+8B5B +ENCODING 35675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3910 +07FC +7910 +07FC +3910 +02A8 +3C44 +01F0 +3910 +29F0 +2910 +39F0 +2910 +0000 +ENDCHAR +STARTCHAR U+8B5C +ENCODING 35676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0108 +3C90 +03FC +7EA8 +01A8 +3DB0 +03FC +3C00 +01F8 +3D08 +25F8 +2508 +3DF8 +2108 +0000 +ENDCHAR +STARTCHAR U+8B5D +ENCODING 35677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +0929 +7FEF +0028 +3DEF +0129 +3DEF +0129 +3D29 +25EF +2420 +2420 +3C21 +241F +0000 +0000 +ENDCHAR +STARTCHAR U+8B5E +ENCODING 35678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFE +00AA +FEAA +00FE +7C00 +01FF +0000 +7CFE +0082 +00FE +7C29 +446A +45CC +4466 +7CC3 +ENDCHAR +STARTCHAR U+8B5F +ENCODING 35679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +39F0 +0110 +7DF0 +0000 +3BB8 +02A8 +3BB8 +0040 +3FFC +28E0 +2950 +3E4C +2840 +0000 +ENDCHAR +STARTCHAR U+8B60 +ENCODING 35680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +09FF +7EFE +00BA +3CAA +00BA +3CFE +007C +3C44 +247C +2444 +247C +3C44 +25FF +0000 +0000 +ENDCHAR +STARTCHAR U+8B63 +ENCODING 35683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7870 +00D8 +FD8C +0307 +78F8 +0000 +01DE +7952 +0152 +01DE +7800 +4884 +4884 +498E +7B5B +ENDCHAR +STARTCHAR U+8B65 +ENCODING 35685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +7F10 +3D1F +3F62 +0812 +7F8C +2233 +4C80 +3FFE +0FF8 +0FF8 +0FF8 +0808 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+8B66 +ENCODING 35686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1240 +7FFC +1FC8 +3D50 +5530 +1ECC +07C0 +7FFC +07C0 +07C0 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8B67 +ENCODING 35687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +7D44 +01FF +7D28 +01FE +7D2A +01FF +7D2A +45FE +466C +44AA +7D29 +4428 +0000 +0000 +ENDCHAR +STARTCHAR U+8B68 +ENCODING 35688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +11FF +7D29 +01FF +7D29 +01FF +01FF +7D00 +01FF +7D00 +45FF +454A +4544 +7C6B +0000 +0000 +ENDCHAR +STARTCHAR U+8B6A +ENCODING 35690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11FF +7C44 +00FE +7C82 +00FE +0082 +7CFE +0040 +7CFF +4591 +44A9 +44FD +7C02 +0000 +0000 +ENDCHAR +STARTCHAR U+8B6B +ENCODING 35691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +38F8 +0320 +7FFC +0254 +3B8C +0270 +3BFC +0270 +3A70 +2AF8 +2A88 +3CF8 +2888 +0000 +ENDCHAR +STARTCHAR U+8B6C +ENCODING 35692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EF8 +2250 +3FFC +3E20 +33FC +5E20 +0FE0 +7FFC +07C0 +07C0 +0FE0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+8B6D +ENCODING 35693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +76DC +0454 +FC54 +06D4 +7467 +0440 +07FE +7112 +0116 +07D4 +711C +5108 +51DC +5736 +7063 +ENDCHAR +STARTCHAR U+8B6F +ENCODING 35695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3BF8 +02A8 +7FF8 +0040 +3BF8 +0040 +3FFC +0110 +3FFC +2840 +2BF8 +3840 +2840 +0000 +ENDCHAR +STARTCHAR U+8B70 +ENCODING 35696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +38A0 +07FC +7840 +03F8 +3840 +07FC +3BA8 +0124 +3FFC +29A8 +2F14 +396C +2B04 +0000 +ENDCHAR +STARTCHAR U+8B71 +ENCODING 35697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +3FF8 +0100 +1FF0 +7FFC +0100 +1930 +7FFC +1930 +1930 +3D78 +2548 +3D78 +2548 +0000 +ENDCHAR +STARTCHAR U+8B72 +ENCODING 35698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3FFC +0110 +7EA8 +03FC +3CA0 +01F8 +3CA0 +03FC +3CE8 +2790 +24B0 +3CC8 +2704 +0000 +ENDCHAR +STARTCHAR U+8B74 +ENCODING 35700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3AF8 +01A8 +79F8 +0420 +3BFC +02F0 +3890 +06F0 +3AF8 +2A88 +2AF8 +3D80 +28FC +0000 +ENDCHAR +STARTCHAR U+8B76 +ENCODING 35702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF8 +0000 +FFFF +0000 +0FF0 +0000 +1FF8 +1008 +1FF8 +FE7F +0000 +3C3C +0000 +7E7E +4242 +7E7E +ENDCHAR +STARTCHAR U+8B77 +ENCODING 35703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3BFC +00B0 +7DFC +0320 +3DF8 +01F8 +3D20 +01FC +3FF8 +2490 +2460 +3CF0 +270C +0000 +ENDCHAR +STARTCHAR U+8B78 +ENCODING 35704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +79FE +0020 +FCFC +0000 +7BFF +0001 +00FD +7820 +01FE +0000 +7BFF +4802 +49FF +4952 +79C6 +ENDCHAR +STARTCHAR U+8B79 +ENCODING 35705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BFF +0000 +FCFC +0084 +78FC +0000 +03FF +7A01 +02FD +0040 +79A2 +4854 +49B8 +4854 +79B3 +ENDCHAR +STARTCHAR U+8B7A +ENCODING 35706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +09EF +7F02 +01EC +3C3F +0105 +3DE4 +0297 +3C94 +27F4 +2494 +2494 +3D5C +2627 +0000 +0000 +ENDCHAR +STARTCHAR U+8B7B +ENCODING 35707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E3E +2222 +3E3E +3E3E +2222 +3E3E +41C1 +7FFF +0FF8 +0000 +0FF8 +0FF8 +0808 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+8B7C +ENCODING 35708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E80 +48FF +7E80 +437E +4200 +7EFE +48AA +7EFE +0000 +FFFF +0000 +0FF0 +0000 +1FF8 +1008 +1FF8 +ENDCHAR +STARTCHAR U+8B7D +ENCODING 35709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +1BF0 +1390 +1CF0 +1EF0 +1290 +7FFC +17D0 +3FF8 +47C4 +07C0 +0FE0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+8B7E +ENCODING 35710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +7BFF +0000 +FDE2 +012A +79EA +012A +01E2 +792E +0000 +03DF +7851 +4ACB +4945 +4A59 +78C3 +ENDCHAR +STARTCHAR U+8B7F +ENCODING 35711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +11EF +7C44 +01EF +7DEF +0044 +7CFE +0002 +01FF +7C02 +44FE +4552 +4545 +7C7C +0000 +0000 +ENDCHAR +STARTCHAR U+8B80 +ENCODING 35712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3FFC +01F0 +7FF8 +02A8 +3B38 +03F8 +39F0 +0110 +39F0 +29F0 +29F0 +3990 +2E08 +0000 +ENDCHAR +STARTCHAR U+8B81 +ENCODING 35713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7410 +06FF +FA42 +0024 +70FF +0E91 +02FF +7291 +02BD +02A5 +72BD +5281 +5683 +5500 +7CFF +ENDCHAR +STARTCHAR U+8B82 +ENCODING 35714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FC +7D08 +01FF +7D29 +01FF +7C82 +00FE +7CFE +4482 +44FE +447C +7C90 +45EF +0000 +0000 +ENDCHAR +STARTCHAR U+8B83 +ENCODING 35715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3BF8 +0110 +7FFC +02A8 +3FF4 +0110 +3DF0 +0110 +3DF0 +2510 +25F0 +3D90 +260C +0000 +ENDCHAR +STARTCHAR U+8B84 +ENCODING 35716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FC +0124 +FD24 +01FC +7124 +0124 +01FC +7000 +07DF +0555 +7555 +57DF +5555 +5555 +77DF +ENDCHAR +STARTCHAR U+8B85 +ENCODING 35717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BFF +0201 +FA1D +01F0 +7924 +00A8 +03FF +78A8 +0124 +03FF +7922 +49FE +4922 +4922 +79FE +ENDCHAR +STARTCHAR U+8B86 +ENCODING 35718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +13EF +2FF0 +53EF +33E2 +57E2 +17F2 +1086 +3FFE +0FF8 +0FF8 +1FFC +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8B88 +ENCODING 35720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +0912 +7F6C +0124 +3DFF +0124 +3D76 +01AD +3D24 +2500 +2508 +252E +3E28 +24FF +0000 +0000 +ENDCHAR +STARTCHAR U+8B8A +ENCODING 35722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +1FD8 +6868 +1390 +2BA8 +7FFC +3AB8 +57D4 +1210 +07F8 +3C40 +0380 +0E60 +701C +0000 +ENDCHAR +STARTCHAR U+8B8B +ENCODING 35723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3F +2220 +FFBE +2202 +3E3E +2220 +3E3C +2221 +FFFF +0000 +0FF0 +0000 +1FF8 +1008 +1FF8 +ENDCHAR +STARTCHAR U+8B8C +ENCODING 35724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +38A0 +07FC +7CA0 +01F0 +3F14 +01F8 +3BB0 +05F4 +39AC +2800 +2AA8 +3A54 +2C54 +0000 +ENDCHAR +STARTCHAR U+8B8D +ENCODING 35725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +77FF +0020 +FBAE +02AA +73AE +0020 +03FE +7020 +0020 +03AE +72AA +53AE +5020 +57FF +7000 +ENDCHAR +STARTCHAR U+8B8E +ENCODING 35726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1414 +1794 +2828 +3FFC +6868 +2BA8 +3C3C +2BA8 +2828 +3FBC +2AA8 +2BA8 +3EBC +2020 +0000 +ENDCHAR +STARTCHAR U+8B8F +ENCODING 35727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +27EF +4220 +97F0 +210F +67E2 +A522 +2566 +0100 +FFFF +0000 +0FF0 +0000 +1FF8 +1008 +1FF8 +ENDCHAR +STARTCHAR U+8B90 +ENCODING 35728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1F7C +34D0 +5F78 +1E78 +1FFC +07C0 +7FFC +07C0 +07C0 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8B92 +ENCODING 35730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +38F8 +07F0 +7D10 +01F4 +39B8 +01E4 +3B7C +00A0 +3BF0 +2950 +29F4 +38AC +2F1C +0000 +ENDCHAR +STARTCHAR U+8B93 +ENCODING 35731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3FFC +03B8 +7EA8 +03B8 +38A0 +07FC +3BF8 +00A0 +3FFC +29A8 +2F30 +39D0 +2E0C +0000 +ENDCHAR +STARTCHAR U+8B94 +ENCODING 35732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0006 +777C +0551 +FD2A +077E +7610 +06FF +0500 +757E +0502 +057E +7702 +547E +54AA +54A5 +751C +ENDCHAR +STARTCHAR U+8B95 +ENCODING 35733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03DE +7252 +03DE +FA52 +03DE +7222 +02FA +0222 +72FA +02AA +02FA +72AA +52FA +5272 +52AA +7226 +ENDCHAR +STARTCHAR U+8B96 +ENCODING 35734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +02A0 +3AB0 +02A8 +7D68 +07FC +3AA0 +06E8 +3AA8 +06E8 +3AD0 +2E94 +2BFC +3E4C +2884 +0000 +ENDCHAR +STARTCHAR U+8B98 +ENCODING 35736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1044 +7C7C +007C +7C44 +01FF +7C04 +01FF +00AA +7CEE +44EE +44AA +45FE +7C22 +0000 +0000 +ENDCHAR +STARTCHAR U+8B99 +ENCODING 35737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3FFC +00A0 +7FB8 +02A8 +3BB8 +0090 +39FC +0320 +3DF8 +29F8 +2920 +39FC +2900 +0000 +ENDCHAR +STARTCHAR U+8B9A +ENCODING 35738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0330 +3BB8 +0550 +7FFC +0330 +3BB4 +054C +39F0 +0110 +39F0 +29F0 +29F0 +3990 +2E08 +0000 +ENDCHAR +STARTCHAR U+8B9C +ENCODING 35740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0222 +7124 +07FF +FD05 +05FD +7000 +03FE +0222 +73FE +0222 +03FE +7020 +57FF +5000 +5292 +7449 +ENDCHAR +STARTCHAR U+8B9E +ENCODING 35742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +71E5 +0105 +FFF4 +0514 +77EF +0514 +07F4 +7524 +05E4 +040E +77FA +5D52 +5632 +55D3 +74B1 +ENDCHAR +STARTCHAR U+8B9F +ENCODING 35743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +77EE +0100 +FBDF +0000 +6FF6 +0A90 +0FF0 +6426 +07E0 +0420 +77EE +542A +57EA +524A +742E +ENDCHAR +STARTCHAR U+8BA0 +ENCODING 35744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +3000 +1000 +0000 +0000 +F000 +1000 +1000 +1000 +1000 +1000 +1400 +1800 +1000 +0000 +ENDCHAR +STARTCHAR U+8BA1 +ENCODING 35745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +2040 +1040 +1040 +0040 +0044 +F7FE +1040 +1040 +1040 +1040 +1240 +1440 +1840 +1040 +0040 +ENDCHAR +STARTCHAR U+8BA2 +ENCODING 35746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +27FE +2020 +0020 +0020 +F020 +1020 +1020 +1020 +1020 +1020 +1420 +1820 +10A0 +0040 +ENDCHAR +STARTCHAR U+8BA3 +ENCODING 35747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +2040 +1840 +0840 +0040 +F050 +1048 +1046 +1042 +1040 +1040 +1240 +1440 +1840 +1040 +0040 +ENDCHAR +STARTCHAR U+8BA4 +ENCODING 35748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3040 +1040 +0040 +0040 +F0A0 +10A0 +10A0 +1110 +1110 +1510 +1A08 +1208 +0406 +0804 +ENDCHAR +STARTCHAR U+8BA5 +ENCODING 35749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2010 +11F8 +1110 +0110 +F110 +1110 +1110 +1110 +1110 +1110 +1510 +1912 +1212 +040E +0800 +ENDCHAR +STARTCHAR U+8BA6 +ENCODING 35750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3040 +1040 +0040 +0040 +F044 +17FE +1040 +1040 +1040 +1040 +1440 +1840 +1040 +0040 +ENDCHAR +STARTCHAR U+8BA7 +ENCODING 35751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4008 +37FC +1040 +0040 +0040 +F040 +1040 +1040 +1040 +1040 +1240 +1444 +1FFE +1000 +0000 +ENDCHAR +STARTCHAR U+8BA8 +ENCODING 35752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +4008 +3008 +1008 +07FE +0008 +F008 +1108 +1088 +1088 +1008 +1008 +1408 +1808 +1028 +0010 +ENDCHAR +STARTCHAR U+8BA9 +ENCODING 35753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3040 +1040 +0048 +007C +F040 +1040 +1040 +1040 +1040 +1240 +1440 +1844 +17FE +0000 +ENDCHAR +STARTCHAR U+8BAA +ENCODING 35754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +2040 +2040 +0444 +0444 +E444 +2444 +2444 +2444 +2444 +2444 +2C44 +37FC +2004 +0000 +ENDCHAR +STARTCHAR U+8BAB +ENCODING 35755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4108 +21FC +2200 +0200 +0400 +EBF0 +2010 +2020 +2040 +2080 +2100 +2A02 +3202 +21FE +0000 +ENDCHAR +STARTCHAR U+8BAD +ENCODING 35757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +4104 +3124 +1124 +0124 +0124 +F124 +1124 +1124 +1124 +1124 +1124 +1624 +1A04 +1404 +0804 +ENDCHAR +STARTCHAR U+8BAE +ENCODING 35758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4080 +3044 +1244 +0204 +0208 +F108 +1110 +1090 +10A0 +1040 +14A0 +1910 +1208 +040E +0804 +ENDCHAR +STARTCHAR U+8BAF +ENCODING 35759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +47F8 +3010 +1110 +0110 +0110 +F110 +1150 +17F0 +1110 +1110 +1110 +150A +190A +1106 +0100 +ENDCHAR +STARTCHAR U+8BB0 +ENCODING 35760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2008 +17FC +1008 +0008 +0008 +F008 +13F8 +1208 +1200 +1200 +1202 +1602 +1A02 +11FE +0000 +ENDCHAR +STARTCHAR U+8BB2 +ENCODING 35762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +2110 +1110 +17FC +0110 +0110 +F110 +1114 +1FFE +1110 +1110 +1510 +1910 +1110 +0210 +0010 +ENDCHAR +STARTCHAR U+8BB3 +ENCODING 35763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4044 +2FFE +2040 +0048 +07FC +E040 +2044 +2FFE +2044 +2044 +2444 +2854 +3048 +2040 +0040 +ENDCHAR +STARTCHAR U+8BB4 +ENCODING 35764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +2400 +2404 +0504 +0488 +E450 +2420 +2450 +2488 +250C +2604 +2C00 +3404 +27FE +0000 +ENDCHAR +STARTCHAR U+8BB5 +ENCODING 35765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +3200 +1200 +0208 +03FC +F208 +1208 +1208 +13F8 +1208 +1200 +1600 +1A04 +13FE +0000 +ENDCHAR +STARTCHAR U+8BB6 +ENCODING 35766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +2010 +2210 +0210 +0414 +EFFE +2010 +2030 +2050 +2490 +2910 +3210 +2410 +0850 +0020 +ENDCHAR +STARTCHAR U+8BB7 +ENCODING 35767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +2040 +2044 +07FE +0444 +E444 +2444 +24A4 +24A4 +2514 +2514 +2E0C +3404 +2414 +0408 +ENDCHAR +STARTCHAR U+8BB8 +ENCODING 35768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4208 +33FC +1240 +0440 +0040 +F044 +1FFE +1040 +1040 +1040 +1240 +1440 +1840 +1040 +0040 +ENDCHAR +STARTCHAR U+8BB9 +ENCODING 35769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +4120 +3120 +1124 +012C +0330 +F520 +1960 +11A0 +1120 +1120 +1120 +1522 +1922 +111E +0100 +ENDCHAR +STARTCHAR U+8BBA +ENCODING 35770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +30A0 +10A0 +0110 +020E +F404 +1100 +1110 +1130 +11C0 +1100 +1504 +1904 +10FC +0000 +ENDCHAR +STARTCHAR U+8BBC +ENCODING 35772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4020 +3120 +1120 +0110 +0208 +F20E +1444 +1840 +1040 +1080 +1090 +1508 +1BF8 +1008 +0000 +ENDCHAR +STARTCHAR U+8BBD +ENCODING 35773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +2408 +2408 +0618 +0518 +E4A8 +2448 +2448 +24A8 +2518 +2E18 +3408 +240A +080A +1006 +ENDCHAR +STARTCHAR U+8BBE +ENCODING 35774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01F0 +2110 +1110 +1110 +0110 +020E +F400 +13F8 +1108 +1110 +1090 +10A0 +1440 +18B0 +130E +0C04 +ENDCHAR +STARTCHAR U+8BBF +ENCODING 35775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2040 +1040 +1004 +07FE +0080 +F088 +10FC +1088 +1088 +1088 +1088 +1508 +1908 +1250 +0420 +ENDCHAR +STARTCHAR U+8BC0 +ENCODING 35776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +3080 +1088 +07FC +0088 +F088 +1088 +1088 +1FFE +1080 +1540 +1920 +1210 +040E +0804 +ENDCHAR +STARTCHAR U+8BC1 +ENCODING 35777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +1020 +0020 +0020 +F020 +1124 +113E +1120 +1120 +1120 +1120 +1520 +1924 +17FE +0000 +ENDCHAR +STARTCHAR U+8BC2 +ENCODING 35778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3040 +1044 +07FE +0040 +F040 +1048 +13FC +1208 +1208 +1208 +1608 +1A08 +13F8 +0208 +ENDCHAR +STARTCHAR U+8BC3 +ENCODING 35779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +37FE +1008 +0048 +03E8 +F248 +1248 +1248 +1248 +13C8 +1008 +1408 +1808 +1028 +0010 +ENDCHAR +STARTCHAR U+8BC4 +ENCODING 35780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +3040 +1040 +0444 +034C +F150 +1044 +1FFE +1040 +1040 +1040 +1440 +1840 +1040 +0040 +ENDCHAR +STARTCHAR U+8BC5 +ENCODING 35781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +3008 +11FC +0108 +0108 +F108 +11F8 +1108 +1108 +1108 +11F8 +1308 +1508 +1908 +17FE +0000 +ENDCHAR +STARTCHAR U+8BC6 +ENCODING 35782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +13FC +1208 +0208 +0208 +F208 +1208 +1208 +13F8 +1208 +1000 +1520 +1910 +1208 +0404 +0804 +ENDCHAR +STARTCHAR U+8BC8 +ENCODING 35784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +3104 +11FE +0280 +0280 +F488 +10FC +1080 +1080 +1084 +10FE +1480 +1880 +1080 +0080 +ENDCHAR +STARTCHAR U+8BC9 +ENCODING 35785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001C +43E0 +3200 +1200 +0200 +0204 +F3FE +1220 +1220 +1220 +1260 +1630 +1A2C +1424 +0820 +0020 +ENDCHAR +STARTCHAR U+8BCA +ENCODING 35786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +20A0 +2120 +0210 +042E +E844 +2090 +2320 +2040 +2088 +2310 +2820 +30C0 +2300 +0C00 +ENDCHAR +STARTCHAR U+8BCB +ENCODING 35787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4078 +27C0 +2440 +0440 +0448 +E7FC +2440 +2440 +2440 +2420 +24A0 +2D12 +3692 +244A +0006 +ENDCHAR +STARTCHAR U+8BCC +ENCODING 35788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +21F8 +2210 +0420 +0844 +E7FE +2004 +2004 +2004 +23FC +2004 +2804 +3004 +27FC +0004 +ENDCHAR +STARTCHAR U+8BCD +ENCODING 35789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +13FE +1004 +0024 +07F4 +F004 +1024 +13F4 +1224 +1224 +1224 +13E4 +1624 +1804 +1014 +0008 +ENDCHAR +STARTCHAR U+8BCE +ENCODING 35790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +2248 +2248 +0248 +0248 +E248 +23F8 +2040 +2444 +2444 +2444 +2C44 +3444 +27FC +0004 +ENDCHAR +STARTCHAR U+8BCF +ENCODING 35791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +3084 +1084 +0084 +0104 +F114 +1208 +1400 +11FC +1104 +1104 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+8BD1 +ENCODING 35793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +47FC +2208 +21B0 +0040 +00A0 +E31E +2C44 +2050 +23F8 +2040 +2448 +2FFC +3040 +2040 +0040 +ENDCHAR +STARTCHAR U+8BD2 +ENCODING 35794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3080 +1108 +0204 +07FE +F002 +1004 +13FE +1204 +1204 +1204 +1604 +1A04 +13FC +0204 +ENDCHAR +STARTCHAR U+8BD3 +ENCODING 35795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +3200 +1208 +03FC +0220 +F220 +12F8 +1220 +1220 +1228 +13FC +1600 +1A04 +13FE +0000 +ENDCHAR +STARTCHAR U+8BD4 +ENCODING 35796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4048 +37FC +1040 +0050 +03F8 +F040 +1044 +1FFE +10C0 +10E0 +1550 +1948 +124E +0444 +0040 +ENDCHAR +STARTCHAR U+8BD5 +ENCODING 35797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4028 +2024 +2020 +0FFE +0020 +E020 +27E0 +2120 +2110 +2110 +2110 +29D2 +3712 +220A +0004 +ENDCHAR +STARTCHAR U+8BD6 +ENCODING 35798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4050 +33F8 +1040 +0040 +0048 +F7FC +1000 +1040 +1050 +13F8 +1040 +1440 +1844 +17FE +0000 +ENDCHAR +STARTCHAR U+8BD7 +ENCODING 35799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +2048 +13FC +1040 +0044 +07FE +F010 +1014 +17FE +1010 +1110 +1090 +1410 +1810 +1050 +0020 +ENDCHAR +STARTCHAR U+8BD8 +ENCODING 35800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3044 +1FFE +0040 +0048 +F7FC +1000 +1008 +13FC +1208 +1208 +1608 +1A08 +13F8 +0208 +ENDCHAR +STARTCHAR U+8BD9 +ENCODING 35801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +3084 +17FE +0100 +0120 +F120 +12A4 +12AC +14B0 +1920 +1050 +1450 +1888 +110E +0204 +ENDCHAR +STARTCHAR U+8BDA +ENCODING 35802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4028 +2024 +27FE +0420 +0420 +E424 +27A4 +24A8 +24A8 +2490 +2E90 +3530 +244A +088A +1006 +ENDCHAR +STARTCHAR U+8BDB +ENCODING 35803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4240 +2248 +23FC +0240 +0440 +E044 +2FFE +20C0 +20E0 +2160 +2950 +324E +2444 +0840 +0040 +ENDCHAR +STARTCHAR U+8BDC +ENCODING 35804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4240 +3248 +13FC +0440 +0040 +F044 +1FFE +1110 +1110 +1110 +1510 +1A12 +1212 +040E +0800 +ENDCHAR +STARTCHAR U+8BDD +ENCODING 35805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4038 +33C0 +1040 +0040 +0044 +F7FE +1040 +1048 +13FC +1208 +1208 +1608 +1A08 +13F8 +0208 +ENDCHAR +STARTCHAR U+8BDE +ENCODING 35806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +401C +2F70 +2110 +0210 +0410 +EF5C +2150 +2950 +2550 +2250 +2A7C +3300 +2480 +0846 +103C +ENDCHAR +STARTCHAR U+8BDF +ENCODING 35807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +401C +33E0 +1200 +0204 +03FE +F200 +1204 +12FE +1284 +1284 +1684 +1A84 +1284 +04FC +0884 +ENDCHAR +STARTCHAR U+8BE0 +ENCODING 35808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +30A0 +1110 +020E +0C04 +F3F8 +1040 +1040 +1050 +13F8 +1040 +1440 +1848 +17FC +0000 +ENDCHAR +STARTCHAR U+8BE1 +ENCODING 35809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +21F0 +2220 +0444 +0BFE +E200 +22F8 +2288 +2288 +22A8 +2690 +2A82 +3282 +247E +0800 +ENDCHAR +STARTCHAR U+8BE2 +ENCODING 35810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4204 +33FE +1404 +0404 +09F4 +F114 +1114 +11F4 +1114 +1114 +13F4 +1514 +1804 +1014 +0008 +ENDCHAR +STARTCHAR U+8BE3 +ENCODING 35811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4238 +33C0 +1202 +0202 +01FE +F000 +1004 +13FE +1204 +1204 +13FC +1604 +1A04 +13FC +0204 +ENDCHAR +STARTCHAR U+8BE4 +ENCODING 35812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +31F0 +1220 +0448 +0BFC +F048 +1048 +1FFE +1048 +1048 +13F8 +1448 +1840 +1140 +0080 +ENDCHAR +STARTCHAR U+8BE5 +ENCODING 35813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4084 +2FFE +0080 +0100 +0110 +E210 +27E0 +2048 +2048 +2090 +2520 +2A50 +3088 +2304 +0C04 +ENDCHAR +STARTCHAR U+8BE6 +ENCODING 35814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +4110 +30A0 +17FC +0040 +0050 +F3F8 +1040 +1040 +1044 +1FFE +1040 +1440 +1840 +1040 +0040 +ENDCHAR +STARTCHAR U+8BE7 +ENCODING 35815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +37FE +1402 +0024 +0070 +F780 +1080 +1088 +10FC +1780 +1080 +1482 +1882 +107E +0000 +ENDCHAR +STARTCHAR U+8BE8 +ENCODING 35816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +47FC +3484 +1888 +07FC +0100 +F140 +1248 +17FC +1040 +1044 +1FFE +1040 +1440 +1840 +0040 +ENDCHAR +STARTCHAR U+8BE9 +ENCODING 35817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +37BE +1084 +0084 +04A4 +F294 +1294 +1084 +118C +16B4 +1084 +1484 +1884 +1294 +0108 +ENDCHAR +STARTCHAR U+8BEB +ENCODING 35819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4028 +2024 +2FFE +0020 +E520 +2524 +2524 +2FE8 +2528 +2530 +2D20 +3560 +2492 +090A +0004 +ENDCHAR +STARTCHAR U+8BEC +ENCODING 35820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4008 +37FC +1040 +0040 +0248 +E248 +2248 +2248 +2554 +2964 +2040 +2840 +3040 +2044 +1FFE +0000 +ENDCHAR +STARTCHAR U+8BED +ENCODING 35821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +4FFC +2100 +2110 +07F8 +0210 +E214 +3FFE +2000 +2008 +27FC +2408 +2C08 +3408 +27F8 +0408 +ENDCHAR +STARTCHAR U+8BEE +ENCODING 35822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4248 +3158 +1160 +0048 +03FC +F208 +1208 +13F8 +1208 +1208 +13F8 +1608 +1A08 +1228 +0210 +ENDCHAR +STARTCHAR U+8BEF +ENCODING 35823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +3208 +1208 +03F8 +0000 +E7FC +2040 +2044 +2FFE +2040 +20A0 +28A0 +3110 +220E +0404 +ENDCHAR +STARTCHAR U+8BF0 +ENCODING 35824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4240 +3248 +13FC +0440 +0844 +F7FE +1000 +1008 +13FC +1208 +1208 +1608 +1A08 +13F8 +0208 +ENDCHAR +STARTCHAR U+8BF1 +ENCODING 35825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +47C0 +2040 +2044 +0FFE +0160 +E250 +244E +2BF4 +2110 +2120 +213C +2A04 +3204 +2428 +0810 +ENDCHAR +STARTCHAR U+8BF2 +ENCODING 35826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4108 +31FC +1200 +05F8 +0108 +F148 +1128 +17FE +1208 +1288 +1248 +17FC +1808 +1028 +0010 +ENDCHAR +STARTCHAR U+8BF3 +ENCODING 35827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +4504 +32FE +1510 +0910 +0110 +F110 +1310 +157C +1910 +1110 +1110 +1510 +1914 +15FE +0200 +ENDCHAR +STARTCHAR U+8BF4 +ENCODING 35828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2208 +1110 +10A0 +03F8 +0208 +F208 +1208 +13F8 +12A8 +10A0 +10A0 +1522 +1922 +121E +0400 +ENDCHAR +STARTCHAR U+8BF5 +ENCODING 35829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +47F8 +2010 +20A0 +0044 +07FE +E444 +2444 +27FC +2444 +2444 +27FC +2C44 +3444 +2454 +0448 +ENDCHAR +STARTCHAR U+8BF6 +ENCODING 35830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +3110 +1208 +07FC +0104 +F110 +11F8 +1240 +1044 +1FFE +1040 +14A0 +1890 +110E +0604 +ENDCHAR +STARTCHAR U+8BF7 +ENCODING 35831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +47FC +2040 +23F8 +0040 +EFFE +2008 +23FC +2208 +23F8 +2208 +23F8 +2A08 +3208 +2228 +0210 +ENDCHAR +STARTCHAR U+8BF8 +ENCODING 35832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +2044 +1BF8 +0850 +0064 +07FE +F080 +1108 +13FC +1508 +1908 +11F8 +1508 +1908 +11F8 +0108 +ENDCHAR +STARTCHAR U+8BF9 +ENCODING 35833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +5FFE +2480 +2480 +07BE +0482 +E4A2 +2794 +2494 +2494 +2488 +2FC8 +2894 +3094 +20A2 +00C0 +ENDCHAR +STARTCHAR U+8BFA +ENCODING 35834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4110 +37FC +1110 +0150 +0044 +EFFE +2080 +2108 +23FC +2D08 +2108 +2908 +3108 +21F8 +0108 +ENDCHAR +STARTCHAR U+8BFB +ENCODING 35835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2028 +13FC +1020 +0020 +07FE +F092 +1054 +1110 +1094 +17FE +1020 +1420 +1850 +108C +0304 +ENDCHAR +STARTCHAR U+8BFC +ENCODING 35836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +4FFE +2080 +2100 +0304 +048C +E8D0 +2560 +2260 +2650 +29D0 +2148 +2A4E +3444 +2140 +0080 +ENDCHAR +STARTCHAR U+8BFD +ENCODING 35837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +1090 +1094 +079E +0090 +F090 +1090 +139C +1090 +1090 +1094 +179E +1490 +1890 +1090 +0090 +ENDCHAR +STARTCHAR U+8BFE +ENCODING 35838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +2248 +2248 +03F8 +0248 +E248 +23F8 +2040 +2FFE +20E0 +2950 +3248 +244E +0844 +0040 +ENDCHAR +STARTCHAR U+8BFF +ENCODING 35839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +003C +43C0 +3040 +1048 +07FC +0150 +F24E +1444 +1080 +1FFE +1110 +1110 +14A0 +1860 +1198 +0604 +ENDCHAR +STARTCHAR U+8C00 +ENCODING 35840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4144 +365E +1444 +0444 +075C +F444 +1444 +17FC +1444 +10A0 +10A0 +1510 +1908 +120E +0C04 +ENDCHAR +STARTCHAR U+8C01 +ENCODING 35841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +20A0 +1114 +11FE +0310 +0510 +F1FC +1110 +1110 +11FC +1110 +1110 +1514 +19FE +1100 +0100 +ENDCHAR +STARTCHAR U+8C02 +ENCODING 35842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +20A0 +2110 +0288 +0446 +E804 +23F0 +2010 +2020 +2100 +2D48 +3524 +2504 +0910 +00F0 +ENDCHAR +STARTCHAR U+8C03 +ENCODING 35843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4004 +27FE +2444 +0444 +05F4 +E444 +2454 +27FC +2404 +25F4 +2514 +2D14 +35F4 +2504 +0814 +1008 +ENDCHAR +STARTCHAR U+8C04 +ENCODING 35844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +30FC +1108 +0210 +0420 +F084 +133E +1204 +1204 +13BC +1204 +1604 +1A04 +13FC +0204 +ENDCHAR +STARTCHAR U+8C05 +ENCODING 35845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4044 +2FFE +2008 +03FC +0208 +E208 +2208 +23F8 +2040 +2440 +2950 +324C +2446 +0942 +0080 +ENDCHAR +STARTCHAR U+8C06 +ENCODING 35846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +4FFE +3008 +13FC +0208 +0208 +F3F8 +1000 +13F8 +1020 +1044 +17FE +1440 +1840 +1140 +0080 +ENDCHAR +STARTCHAR U+8C07 +ENCODING 35847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4048 +37FC +1110 +0110 +0110 +F2A8 +1444 +1040 +1FFE +1040 +1040 +1440 +1840 +1040 +0040 +ENDCHAR +STARTCHAR U+8C08 +ENCODING 35848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4040 +3248 +1150 +00A0 +0090 +F10E +1644 +1040 +1248 +1150 +10A0 +14A0 +1910 +120E +0404 +ENDCHAR +STARTCHAR U+8C0A +ENCODING 35850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +2FFE +2802 +1004 +03F8 +E208 +2208 +23F8 +2208 +2208 +23F8 +2A08 +3208 +2FFE +0000 +ENDCHAR +STARTCHAR U+8C0B +ENCODING 35851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +4208 +3FFE +1208 +03F8 +0208 +F208 +13F8 +1044 +1FFE +1040 +10E0 +1550 +1A4E +1444 +0040 +ENDCHAR +STARTCHAR U+8C0C +ENCODING 35852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4110 +37FC +1110 +01F0 +0110 +F1F0 +1110 +1114 +1FFE +1200 +1290 +1708 +1A00 +13FC +0000 +ENDCHAR +STARTCHAR U+8C0D +ENCODING 35853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +4150 +3154 +17FE +0150 +0150 +F170 +1100 +11FC +1020 +17FE +1070 +14A8 +1926 +1224 +0020 +ENDCHAR +STARTCHAR U+8C0E +ENCODING 35854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4114 +2FFE +2110 +0044 +0FFE +E200 +2208 +23FC +2000 +2248 +2248 +2A48 +324A +244A +0846 +ENDCHAR +STARTCHAR U+8C0F +ENCODING 35855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4044 +2FFE +2040 +07FC +0444 +E554 +24E4 +2444 +27FC +2160 +2950 +3248 +244E +0844 +0040 +ENDCHAR +STARTCHAR U+8C10 +ENCODING 35856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +2424 +17A8 +1430 +0422 +05A2 +F65E +1088 +13FC +1208 +1208 +13F8 +1608 +1A08 +13F8 +0208 +ENDCHAR +STARTCHAR U+8C11 +ENCODING 35857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +407C +2040 +27FE +0442 +047C +E7C0 +2444 +247C +2400 +25FC +2D00 +37FE +2900 +09FC +1000 +ENDCHAR +STARTCHAR U+8C12 +ENCODING 35858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +2208 +23F8 +0208 +03F8 +E104 +23FE +2444 +2844 +22B4 +2314 +2A04 +33F4 +2014 +0008 +ENDCHAR +STARTCHAR U+8C13 +ENCODING 35859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +2444 +27FC +0444 +07FC +E008 +23FC +2208 +23F8 +2208 +23F8 +2A08 +3208 +2228 +0210 +ENDCHAR +STARTCHAR U+8C14 +ENCODING 35860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47BE +24A4 +24A4 +07BC +0000 +E3F8 +2000 +2FFE +2100 +21F8 +2408 +2808 +3088 +2050 +0020 +ENDCHAR +STARTCHAR U+8C15 +ENCODING 35861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +2140 +2220 +0410 +0BEE +F004 +2788 +24A8 +27A8 +24A8 +27A8 +2CA8 +3488 +24A8 +0590 +ENDCHAR +STARTCHAR U+8C16 +ENCODING 35862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +003C +47C0 +2088 +2248 +0150 +0FFC +E080 +2084 +2FFE +2100 +21F0 +2B10 +32A0 +2440 +08B0 +030C +ENDCHAR +STARTCHAR U+8C17 +ENCODING 35863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +2100 +11F0 +1220 +07F8 +0248 +F248 +13F8 +10A2 +1122 +161E +10C0 +1030 +1580 +1860 +0010 +ENDCHAR +STARTCHAR U+8C18 +ENCODING 35864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4880 +2480 +24FC +0104 +0648 +E840 +30A0 +2110 +220E +27FC +2208 +2A08 +3208 +23F8 +0208 +ENDCHAR +STARTCHAR U+8C19 +ENCODING 35865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4048 +37FC +1210 +0110 +00A4 +F7FE +1008 +13FC +1208 +1208 +13F8 +1608 +1A08 +13F8 +0208 +ENDCHAR +STARTCHAR U+8C1A +ENCODING 35866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4024 +33FE +1088 +0050 +03FE +F210 +1220 +1248 +1290 +1224 +1244 +1688 +1A10 +1460 +0980 +ENDCHAR +STARTCHAR U+8C1B +ENCODING 35867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4048 +37FC +1110 +00A0 +07FE +F442 +1844 +13F8 +1248 +1248 +1248 +1648 +1A58 +1040 +0040 +ENDCHAR +STARTCHAR U+8C1C +ENCODING 35868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4020 +2924 +24A8 +0420 +0024 +E3FE +2C20 +2470 +2468 +24A4 +2D24 +3420 +2420 +0A06 +11FC +ENDCHAR +STARTCHAR U+8C1D +ENCODING 35869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4048 +27FC +2408 +0408 +07F8 +E400 +2404 +27FE +24A4 +2CA4 +37FC +24A4 +2CA4 +34B4 +0408 +ENDCHAR +STARTCHAR U+8C1F +ENCODING 35871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +4114 +37FE +1110 +0008 +03FC +F208 +13F8 +1208 +13F8 +1044 +1FFE +10A0 +1910 +120E +0C04 +ENDCHAR +STARTCHAR U+8C20 +ENCODING 35872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4248 +2150 +2FFE +0802 +13FC +E208 +2208 +2208 +23F8 +20A0 +2120 +2922 +3222 +241E +0800 +ENDCHAR +STARTCHAR U+8C21 +ENCODING 35873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +2444 +27FC +0444 +07FC +E208 +2504 +29FA +2208 +2510 +20A0 +2840 +30B0 +230E +0C04 +ENDCHAR +STARTCHAR U+8C22 +ENCODING 35874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +4488 +2FC8 +2888 +0F88 +08FE +EF88 +2888 +28C8 +3FA8 +21A8 +2A88 +3488 +2888 +12A8 +0110 +ENDCHAR +STARTCHAR U+8C23 +ENCODING 35875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +403C +27C0 +2248 +0148 +0150 +E200 +23FC +2440 +2044 +2FFE +2040 +2A48 +3248 +23F8 +0208 +ENDCHAR +STARTCHAR U+8C24 +ENCODING 35876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4048 +37FC +1110 +00A0 +0FFE +E884 +2040 +2FFE +2100 +21F0 +2110 +2910 +3110 +2250 +0420 +ENDCHAR +STARTCHAR U+8C25 +ENCODING 35877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +4208 +2110 +2FFE +0000 +0110 +E20C +2404 +23F8 +22A8 +22A8 +22A8 +2AA8 +32A8 +2FFE +0000 +ENDCHAR +STARTCHAR U+8C26 +ENCODING 35878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4210 +2120 +2FFC +0120 +07F8 +E128 +2128 +3FFE +2128 +2128 +27F8 +2920 +3330 +252E +0924 +0120 +ENDCHAR +STARTCHAR U+8C27 +ENCODING 35879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +40C8 +3048 +1514 +0522 +0942 +F188 +12F8 +1400 +13F8 +12A8 +12A8 +16A8 +1AA8 +17FE +0000 +ENDCHAR +STARTCHAR U+8C28 +ENCODING 35880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4110 +2114 +2FFE +0110 +01F0 +E044 +27FE +2444 +27FC +2040 +27FC +2040 +2BF8 +3040 +2FFE +0000 +ENDCHAR +STARTCHAR U+8C29 +ENCODING 35881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +47F8 +2408 +27F8 +0408 +07F8 +E004 +2FFE +2924 +2FFC +2804 +23F0 +2210 +2920 +30C0 +2330 +0C0E +ENDCHAR +STARTCHAR U+8C2A +ENCODING 35882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4044 +2FFE +2110 +00A4 +07FE +E444 +2454 +27FC +2444 +25F4 +2514 +2D14 +35F4 +2514 +0408 +ENDCHAR +STARTCHAR U+8C2B +ENCODING 35883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +4090 +37FE +1000 +03D4 +0254 +F3D4 +1254 +13C4 +124C +1000 +13FC +1484 +1884 +1114 +0608 +ENDCHAR +STARTCHAR U+8C2C +ENCODING 35884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +4FFE +24A4 +2294 +04A4 +E0C4 +2120 +2250 +2C8E +2124 +2240 +2090 +2B20 +3040 +2080 +0300 +ENDCHAR +STARTCHAR U+8C2D +ENCODING 35885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4004 +2FFE +20A0 +07FC +04A4 +E7FC +2008 +23FC +2208 +23F8 +2208 +23F8 +2840 +37FE +2040 +0040 +ENDCHAR +STARTCHAR U+8C2E +ENCODING 35886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +4FBE +2208 +2A28 +0FBE +0208 +E698 +2B2A +324E +2008 +23FC +2208 +2BF8 +3208 +23F8 +0208 +ENDCHAR +STARTCHAR U+8C2F +ENCODING 35887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0140 +4124 +23FE +2220 +0628 +0BFC +E220 +2228 +23FC +2220 +2224 +23FE +2A00 +3524 +2492 +0802 +ENDCHAR +STARTCHAR U+8C30 +ENCODING 35888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +417E +2504 +2454 +07FC +0444 +E5F4 +2554 +25F4 +2554 +25F4 +24E4 +2D54 +364C +2444 +040C +ENDCHAR +STARTCHAR U+8C31 +ENCODING 35889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +40A0 +27FC +20A0 +02A8 +01B0 +EFFE +2008 +23FC +2208 +2208 +23F8 +2A08 +3208 +23F8 +0208 +ENDCHAR +STARTCHAR U+8C32 +ENCODING 35890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +47F8 +2090 +2060 +0FFE +0144 +E240 +2CC4 +27FE +24A4 +271C +25F4 +2D14 +35F4 +2414 +0408 +ENDCHAR +STARTCHAR U+8C33 +ENCODING 35891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +4108 +214C +2FE8 +013E +0108 +EFE8 +2AA8 +2AA8 +2FE8 +2928 +2FE8 +2928 +3974 +2824 +0042 +ENDCHAR +STARTCHAR U+8C34 +ENCODING 35892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +21FC +2924 +05FC +0020 +EFFE +2400 +25FC +2504 +25FC +2500 +2DFC +3504 +25FC +0A00 +11FE +ENDCHAR +STARTCHAR U+8C35 +ENCODING 35893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +41F8 +2210 +27FE +0C88 +0524 +E7FE +2400 +25FC +2400 +25FC +2C00 +35FC +2504 +09FC +0104 +ENDCHAR +STARTCHAR U+8C36 +ENCODING 35894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4490 +2498 +2B54 +0010 +1FFE +E290 +2EF0 +2294 +2EF4 +2294 +2EE8 +2A9A +32AA +2FE6 +0002 +ENDCHAR +STARTCHAR U+8C37 +ENCODING 35895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0420 +0810 +1110 +0100 +0280 +0440 +1830 +6FEC +0820 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8C38 +ENCODING 35896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0644 +1C44 +F0C6 +1183 +1010 +1038 +FE6C +10C6 +1183 +1000 +10FE +3082 +2082 +2082 +6082 +C0FE +ENDCHAR +STARTCHAR U+8C39 +ENCODING 35897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2410 +2410 +6610 +C37F +1010 +3810 +2C30 +6624 +C324 +006C +7E48 +42CA +439A +4212 +421F +7E71 +ENDCHAR +STARTCHAR U+8C3A +ENCODING 35898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +12F8 +2290 +4890 +0890 +1490 +13FC +2230 +7E30 +2250 +2290 +3F10 +2210 +2030 +0000 +ENDCHAR +STARTCHAR U+8C3B +ENCODING 35899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11F8 +2808 +4448 +0048 +11F8 +2848 +4448 +0048 +7DF8 +4448 +4448 +4449 +7C45 +4443 +0000 +0000 +ENDCHAR +STARTCHAR U+8C3C +ENCODING 35900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2424 +4224 +0024 +00FF +1824 +2424 +4224 +00FF +7E00 +4200 +4224 +4242 +7E81 +4200 +0000 +0000 +ENDCHAR +STARTCHAR U+8C3D +ENCODING 35901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2410 +2438 +6628 +C36C +10C6 +38BB +2C00 +667E +C308 +0018 +7E10 +427E +4242 +4242 +4242 +7E7E +ENDCHAR +STARTCHAR U+8C3E +ENCODING 35902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2810 +2810 +6DFF +C701 +1149 +3848 +28CF +6D80 +C600 +0000 +7CFE +4410 +4410 +4410 +45FF +7C00 +ENDCHAR +STARTCHAR U+8C3F +ENCODING 35903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0250 +3E48 +2988 +4920 +0A20 +3250 +0C50 +0A88 +3FFC +0888 +7F88 +0C88 +12F8 +6088 +0000 +ENDCHAR +STARTCHAR U+8C41 +ENCODING 35905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +3F48 +2A88 +7EA0 +0920 +3E50 +0850 +7F88 +08FC +3E88 +2288 +2288 +3EF8 +2288 +0000 +ENDCHAR +STARTCHAR U+8C42 +ENCODING 35906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +2929 +44A5 +013B +10E8 +2844 +448A +0111 +7C24 +44C8 +4412 +44E4 +4408 +7DF0 +0000 +0000 +ENDCHAR +STARTCHAR U+8C43 +ENCODING 35907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01E4 +2844 +448F +03F2 +1122 +29E2 +452A +01EA +7D2A +452A +47EA +4424 +7C2A +4431 +0000 +0000 +ENDCHAR +STARTCHAR U+8C45 +ENCODING 35909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2888 +2888 +6BFF +CD28 +112F +3BF1 +280F +6DE8 +C52F +01E8 +7D2F +45E8 +452F +4528 +4529 +7D67 +ENDCHAR +STARTCHAR U+8C46 +ENCODING 35910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0000 +1FF0 +1010 +1010 +1FF0 +1010 +0820 +0420 +0440 +0080 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8C47 +ENCODING 35911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FF08 +01FC +0020 +7E20 +4220 +4220 +4220 +7E20 +0020 +4420 +2420 +2820 +0E24 +F1FE +4000 +ENDCHAR +STARTCHAR U+8C48 +ENCODING 35912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1110 +1110 +1FF0 +0000 +7FFC +0000 +0FE0 +0820 +0FE0 +0440 +0280 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8C49 +ENCODING 35913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +FF20 +0024 +01FE +7E20 +4220 +42F8 +4208 +7E88 +0050 +4450 +2420 +2850 +0E48 +F08E +4304 +ENDCHAR +STARTCHAR U+8C4A +ENCODING 35914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +1FF0 +1290 +1FF0 +1290 +1FF0 +0000 +7FFC +0FE0 +0820 +0FE0 +0440 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8C4B +ENCODING 35915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1F7E +3182 +6BC6 +C66C +2C30 +1818 +3FFC +E007 +1FF8 +1008 +1008 +1FF8 +0810 +0420 +FFFF +ENDCHAR +STARTCHAR U+8C4C +ENCODING 35916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E20 +01FC +3D08 +2680 +24B8 +24E8 +3D68 +2768 +14F8 +18A0 +1CA4 +6124 +021C +0000 +ENDCHAR +STARTCHAR U+8C4D +ENCODING 35917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7CFE +0192 +00FE +7C92 +44FE +4440 +7C88 +0108 +4408 +45FF +2808 +7C08 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+8C4E +ENCODING 35918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +3E50 +3E20 +24D0 +3F0C +3FF8 +0FE0 +0820 +0FE0 +0440 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8C4F +ENCODING 35919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +FC88 +03FF +7850 +49FE +4852 +4852 +7BFF +0052 +4852 +49FE +6858 +28D4 +3D56 +E253 +0050 +ENDCHAR +STARTCHAR U+8C50 +ENCODING 35920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2548 +2FE8 +2548 +2FE8 +2FE8 +2548 +3FF8 +7FFC +0FE0 +0820 +0FE0 +0440 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+8C51 +ENCODING 35921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2844 +FE28 +AAFE +FE12 +AA12 +FEFE +0090 +FE90 +00FF +FE31 +8231 +FE53 +4452 +6CD6 +2990 +FE10 +ENDCHAR +STARTCHAR U+8C53 +ENCODING 35923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +AA88 +FF88 +AA88 +FFFF +AA88 +FF94 +AA94 +FFA2 +0049 +FF84 +007F +7F55 +4155 +7F55 +2255 +FFFF +ENDCHAR +STARTCHAR U+8C54 +ENCODING 35924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +AA88 +FF88 +AABE +FF88 +AA88 +FFFF +AA90 +FFA2 +007D +FF80 +007F +7F55 +4155 +7F55 +2255 +FFFF +ENDCHAR +STARTCHAR U+8C55 +ENCODING 35925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0200 +0E48 +7348 +0550 +19A0 +62A0 +0490 +1888 +6084 +0100 +0600 +0000 +ENDCHAR +STARTCHAR U+8C56 +ENCODING 35926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7FFF +0300 +0480 +78C8 +0170 +0A40 +0460 +3AD0 +0148 +02C4 +0443 +3940 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8C57 +ENCODING 35927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE00 +29FC +2820 +2844 +28CC +2928 +2850 +2890 +2938 +2854 +2892 +2930 +6861 +4C01 +C7FF +ENDCHAR +STARTCHAR U+8C58 +ENCODING 35928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE13 +101E +33F0 +6610 +D492 +3892 +6892 +CC92 +1A92 +38FE +6810 +C810 +0811 +1813 +700E +ENDCHAR +STARTCHAR U+8C59 +ENCODING 35929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +3FFC +0810 +0C30 +0420 +FFFF +0200 +0F04 +718C +0698 +78E0 +01B0 +0E9C +F887 +0380 +ENDCHAR +STARTCHAR U+8C5A +ENCODING 35930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2440 +2488 +2748 +3C70 +24A0 +2730 +3C70 +24A8 +2724 +2420 +2420 +4CC0 +0000 +ENDCHAR +STARTCHAR U+8C5B +ENCODING 35931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE78 +1048 +3248 +6648 +D4C8 +398F +6800 +CCFC +1A44 +386C +6838 +C810 +0838 +186C +71C7 +ENDCHAR +STARTCHAR U+8C5C +ENCODING 35932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E00 +08FF +0824 +1024 +3224 +4C24 +18FF +2C24 +4A24 +1924 +2824 +4824 +0844 +3004 +0000 +0000 +ENDCHAR +STARTCHAR U+8C5D +ENCODING 35933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +1092 +3292 +6692 +D492 +3892 +68FE +CC80 +1A80 +3880 +6880 +C880 +0881 +18C3 +707E +ENDCHAR +STARTCHAR U+8C5F +ENCODING 35935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7EFE +1080 +20FF +5281 +0CFF +1880 +6CBE +0A82 +1884 +6888 +0890 +0921 +323F +0000 +0000 +ENDCHAR +STARTCHAR U+8C61 +ENCODING 35937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +07E0 +18C0 +7FF0 +1110 +1FF0 +1318 +0D90 +72A0 +0DC0 +32A0 +0C98 +3084 +0300 +0000 +ENDCHAR +STARTCHAR U+8C62 +ENCODING 35938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0910 +1FF8 +0280 +7FFC +0440 +1FF0 +631C +3D90 +06A0 +39E0 +0698 +3884 +0300 +0000 +ENDCHAR +STARTCHAR U+8C63 +ENCODING 35939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FDEF +1084 +2084 +4484 +A884 +30E4 +519F +9884 +1484 +3084 +5084 +9184 +1104 +3104 +6304 +ENDCHAR +STARTCHAR U+8C64 +ENCODING 35940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFC +1084 +3284 +66FC +D484 +3884 +68FC +CC91 +1A93 +399E +6888 +C88C +0884 +18F6 +7383 +ENDCHAR +STARTCHAR U+8C65 +ENCODING 35941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7E10 +11FF +2020 +5244 +0C88 +19F2 +2824 +4C48 +1A90 +2930 +4848 +0884 +3103 +0000 +0000 +ENDCHAR +STARTCHAR U+8C66 +ENCODING 35942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +01FC +0100 +7FFF +4201 +43F8 +5E02 +41FE +4000 +5FFE +4300 +5CC6 +C36C +9CD0 +8358 +1CCE +ENDCHAR +STARTCHAR U+8C68 +ENCODING 35944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00C4 +FE6C +1038 +326C +66C6 +D420 +39FF +6840 +CC90 +1AFE +3992 +6A92 +C892 +0892 +1896 +7010 +ENDCHAR +STARTCHAR U+8C69 +ENCODING 35945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +1010 +3232 +6666 +D4D4 +3838 +6868 +CCCC +1A1A +383B +6868 +C8C8 +0808 +1818 +7070 +ENDCHAR +STARTCHAR U+8C6A +ENCODING 35946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0FE0 +0820 +0FE0 +3FFC +2008 +7FF8 +0788 +3AD0 +1DE0 +06B0 +388C +0300 +0000 +ENDCHAR +STARTCHAR U+8C6B +ENCODING 35947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E78 +2490 +19F8 +08A8 +7EA8 +12FC +1464 +1BF8 +10B0 +1370 +10A8 +1324 +30C0 +0000 +ENDCHAR +STARTCHAR U+8C6C +ENCODING 35948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E48 +11F8 +1050 +3250 +4BFC +1C30 +2C48 +4AF8 +1B88 +2AF8 +4888 +08F8 +3088 +0000 +ENDCHAR +STARTCHAR U+8C6D +ENCODING 35949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FDEF +1121 +2121 +4521 +A9EF +3100 +511F +99E9 +150B +310A +51EE +9104 +110E +311B +6131 +ENDCHAR +STARTCHAR U+8C6F +ENCODING 35951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E01 +09FE +1092 +6911 +0620 +0C44 +16F8 +2524 +4CFE +0D10 +15FF +6428 +0844 +3082 +0000 +0000 +ENDCHAR +STARTCHAR U+8C70 +ENCODING 35952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +3F9C +0414 +1F14 +7FD5 +5F67 +0000 +3F9F +0C11 +1691 +2B0A +1704 +0A8A +1611 +0000 +0000 +ENDCHAR +STARTCHAR U+8C71 +ENCODING 35953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7C +0854 +1054 +6A6C +0E44 +147C +2600 +4DFE +0CAA +14AA +64AA +04AA +08AA +33FF +0000 +0000 +ENDCHAR +STARTCHAR U+8C72 +ENCODING 35954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7EFF +0888 +10BE +6AA2 +0EBE +14A2 +26BE +4DAA +0C88 +149C +64AA +0549 +0808 +3018 +0000 +0000 +ENDCHAR +STARTCHAR U+8C73 +ENCODING 35955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +4514 +7FFC +5144 +5964 +6BAC +5D74 +69A4 +5D74 +6BAC +4924 +5964 +4104 +7FFC +4004 +ENDCHAR +STARTCHAR U+8C75 +ENCODING 35957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0122 +F922 +1322 +2255 +4655 +A900 +3108 +5308 +9A48 +164E +3248 +5248 +9248 +1268 +3258 +628F +ENDCHAR +STARTCHAR U+8C76 +ENCODING 35958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FEFE +1010 +3244 +67FF +D444 +3800 +68FE +CC82 +1AFE +3882 +68FE +C882 +08FE +1844 +7183 +ENDCHAR +STARTCHAR U+8C77 +ENCODING 35959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7EFE +0810 +10FE +29FF +4B01 +1D7D +2800 +4C7C +0A44 +187C +2844 +4828 +19FF +0000 +0000 +ENDCHAR +STARTCHAR U+8C78 +ENCODING 35960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +0388 +3C50 +0260 +0380 +7C80 +0140 +0660 +38A0 +0120 +0620 +3840 +0180 +0000 +ENDCHAR +STARTCHAR U+8C79 +ENCODING 35961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +1880 +6680 +14F8 +1908 +6A08 +0C88 +1448 +6448 +0C08 +1408 +6408 +0408 +1830 +0000 +ENDCHAR +STARTCHAR U+8C7A +ENCODING 35962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0410 +1810 +6A10 +2410 +1BFC +7030 +0830 +1C50 +6450 +0C90 +1510 +6610 +0410 +1830 +0000 +ENDCHAR +STARTCHAR U+8C7B +ENCODING 35963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +30FE +CA10 +2410 +0810 +3010 +C810 +09FF +1410 +2410 +CC10 +1410 +2410 +C410 +0C10 +3810 +ENDCHAR +STARTCHAR U+8C7C +ENCODING 35964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0520 +1920 +6B20 +2520 +1924 +69E8 +0D30 +1520 +6520 +0D20 +1524 +6564 +05A4 +1E1C +0000 +ENDCHAR +STARTCHAR U+8C7D +ENCODING 35965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +0010 +1210 +4DFF +2911 +1911 +2529 +4D45 +1545 +2D01 +1501 +2501 +0505 +1902 +0000 +0000 +ENDCHAR +STARTCHAR U+8C7E +ENCODING 35966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +31FE +CA10 +2410 +0830 +3020 +C868 +086C +14A6 +25A3 +CC20 +1420 +2420 +C400 +0DFF +3800 +ENDCHAR +STARTCHAR U+8C80 +ENCODING 35968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +1292 +4C92 +2892 +10FE +2892 +4C10 +1511 +2511 +0D11 +3511 +05FF +3901 +0000 +0000 +ENDCHAR +STARTCHAR U+8C81 +ENCODING 35969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C00 +0020 +1210 +4DFF +2901 +1001 +2800 +4C48 +1248 +2648 +4A48 +1248 +6284 +0D03 +0000 +0000 +ENDCHAR +STARTCHAR U+8C82 +ENCODING 35970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +19F8 +6A48 +2448 +1848 +6888 +0D30 +1400 +65F8 +0D08 +1508 +6508 +05F8 +1908 +0000 +ENDCHAR +STARTCHAR U+8C84 +ENCODING 35972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7810 +2010 +12FE +4C12 +29FF +1812 +24FE +4A10 +12FE +6610 +0BFF +7210 +0410 +1810 +0000 +0000 +ENDCHAR +STARTCHAR U+8C85 +ENCODING 35973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +1120 +6D20 +2920 +13FC +7220 +1E70 +2A70 +4AA8 +1AA8 +2B24 +4A20 +0A20 +3220 +0000 +ENDCHAR +STARTCHAR U+8C86 +ENCODING 35974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +31FE +CA00 +2400 +08FC +3084 +C884 +08FC +1484 +2484 +CC84 +14FC +2400 +C400 +0FFF +3800 +ENDCHAR +STARTCHAR U+8C87 +ENCODING 35975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +30FC +CA84 +2484 +08FC +3084 +C884 +08FC +1491 +2493 +CC9E +1488 +248C +C484 +0CF6 +3B83 +ENDCHAR +STARTCHAR U+8C89 +ENCODING 35977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1840 +6AF8 +2488 +1990 +6A60 +0C60 +1590 +660C +0DF8 +1508 +6508 +05F8 +1908 +0000 +ENDCHAR +STARTCHAR U+8C8A +ENCODING 35978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +19FC +6A20 +2420 +1840 +68F8 +0C88 +1488 +64F8 +0C88 +1488 +6488 +04F8 +1888 +0000 +ENDCHAR +STARTCHAR U+8C8B +ENCODING 35979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +30FE +CA82 +24FE +0882 +3082 +C8FE +0800 +14FE +2410 +CC10 +15FF +2410 +C410 +0C10 +3810 +ENDCHAR +STARTCHAR U+8C8C +ENCODING 35980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1840 +6A80 +25F8 +1908 +69F8 +0D08 +15F8 +6568 +0C60 +14A0 +64A4 +0524 +1A1C +0000 +ENDCHAR +STARTCHAR U+8C8D +ENCODING 35981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +19F8 +6B48 +2548 +19F8 +6948 +0D48 +15F8 +6440 +0DF8 +1440 +6440 +07FC +1800 +0000 +ENDCHAR +STARTCHAR U+8C8E +ENCODING 35982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +19B8 +6B08 +2508 +19B8 +6908 +0D08 +15F8 +64A0 +0CA0 +14A0 +64A4 +0524 +1A1C +0000 +ENDCHAR +STARTCHAR U+8C8F +ENCODING 35983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C40 +70FE +1192 +4CFE +2892 +10FE +2820 +4C48 +1688 +6AFE +1208 +6208 +0408 +1808 +0000 +0000 +ENDCHAR +STARTCHAR U+8C90 +ENCODING 35984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +3070 +C8D8 +258C +0B77 +3000 +C9E2 +092A +152A +25EA +CD2A +152A +25E2 +C522 +0D22 +396E +ENDCHAR +STARTCHAR U+8C91 +ENCODING 35985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +11EF +2AA1 +64A9 +18E6 +1482 +6280 +06E7 +1A81 +0689 +3AE9 +0286 +0486 +3899 +0000 +0000 +ENDCHAR +STARTCHAR U+8C92 +ENCODING 35986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +3111 +CB11 +2511 +09FF +3000 +C9FF +0810 +1420 +25FF +CD49 +1549 +2549 +C549 +0D49 +394B +ENDCHAR +STARTCHAR U+8C93 +ENCODING 35987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +3044 +CBFF +2444 +0844 +3000 +C800 +08FE +1492 +2492 +CC92 +14FE +2492 +C492 +0C92 +38FE +ENDCHAR +STARTCHAR U+8C94 +ENCODING 35988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1880 +6BF8 +2528 +19E8 +6958 +0D88 +15F8 +6524 +0DF8 +1520 +6524 +05E4 +1E1C +0000 +ENDCHAR +STARTCHAR U+8C95 +ENCODING 35989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0401 +79FE +5410 +2911 +10B2 +2840 +4884 +18F8 +2811 +49FF +1810 +29FF +4844 +1882 +0000 +0000 +ENDCHAR +STARTCHAR U+8C97 +ENCODING 35991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +08FE +7092 +15FF +4892 +30FE +28FE +4892 +18FE +2854 +59FF +2828 +4810 +31EF +0000 +0000 +ENDCHAR +STARTCHAR U+8C98 +ENCODING 35992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0490 +1BFC +6890 +25F8 +1908 +69F8 +0D08 +15F8 +6440 +0FFC +1440 +64A0 +0510 +1E0C +0000 +ENDCHAR +STARTCHAR U+8C99 +ENCODING 35993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +31FF +CB00 +253C +0924 +3124 +C93C +0900 +1500 +2577 +CD55 +1555 +2555 +C577 +0D00 +39FF +ENDCHAR +STARTCHAR U+8C9A +ENCODING 35994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +11EF +6929 +25EF +1800 +10FE +6892 +18FE +2892 +48FE +1810 +29FF +4810 +1810 +0000 +0000 +ENDCHAR +STARTCHAR U+8C9B +ENCODING 35995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +31FF +CA44 +24EE +08AA +30EE +C844 +0848 +14FE +2588 +CEFC +1488 +24FC +C488 +0C88 +38FF +ENDCHAR +STARTCHAR U+8C9C +ENCODING 35996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0BDE +3252 +CBDE +2652 +0BDE +3252 +E3FF +1620 +1BFE +2A20 +CBFE +1A20 +2FFF +C908 +18F0 +370F +ENDCHAR +STARTCHAR U+8C9D +ENCODING 35997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +1010 +1FF0 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+8C9E +ENCODING 35998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +01F8 +0100 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+8CA0 +ENCODING 36000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +07E0 +18C0 +6100 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1FF0 +0240 +0C30 +7008 +0000 +ENDCHAR +STARTCHAR U+8CA1 +ENCODING 36001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3E10 +2210 +2210 +3FFC +2230 +3E30 +2250 +2250 +3E90 +1510 +1210 +2210 +4030 +0000 +ENDCHAR +STARTCHAR U+8CA2 +ENCODING 36002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CA3 +ENCODING 36003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7FFE +0040 +0021 +001F +3FF8 +2008 +3FF8 +2008 +3FF8 +2008 +3FF8 +2008 +4004 +0000 +0000 +ENDCHAR +STARTCHAR U+8CA4 +ENCODING 36004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C90 +4490 +4496 +7C9A +44B2 +44D2 +4792 +7C92 +4492 +4496 +4490 +7C80 +2881 +6CC3 +C47E +ENDCHAR +STARTCHAR U+8CA5 +ENCODING 36005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C12 +45FF +4400 +7C00 +447C +4444 +7C44 +4444 +4444 +4444 +7C45 +2885 +4507 +0000 +0000 +ENDCHAR +STARTCHAR U+8CA7 +ENCODING 36007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0180 +0440 +1FF0 +624C +0CC0 +3FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CA8 +ENCODING 36008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +048C +18F0 +6884 +087C +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CA9 +ENCODING 36009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EFC +2280 +2280 +3EF8 +22C8 +3EC8 +22C8 +22A8 +3EB0 +1910 +1530 +22C8 +4704 +0000 +ENDCHAR +STARTCHAR U+8CAA +ENCODING 36010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0FE0 +701C +0FE0 +0040 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CAB +ENCODING 36011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0920 +7FFC +1240 +1FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CAC +ENCODING 36012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0100 +7FFC +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CAD +ENCODING 36013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +1FE0 +1080 +1FFC +1080 +17F0 +1410 +17F0 +1410 +17F0 +2410 +27F0 +4330 +1C0C +0000 +ENDCHAR +STARTCHAR U+8CAE +ENCODING 36014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +1F48 +0048 +7FFC +0040 +1F40 +1140 +1F40 +1120 +1F20 +1114 +1F14 +190C +6084 +0000 +ENDCHAR +STARTCHAR U+8CAF +ENCODING 36015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +25FC +2508 +3E00 +2400 +3DFC +2420 +2420 +3C20 +1820 +1420 +2420 +4060 +0000 +ENDCHAR +STARTCHAR U+8CB0 +ENCODING 36016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +7FFC +0920 +09E0 +0FF8 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CB2 +ENCODING 36018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +2F98 +28E0 +2E84 +787C +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CB3 +ENCODING 36019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +0048 +7FFC +1F40 +0040 +7FC0 +1F40 +1140 +1F20 +1F20 +1114 +1F14 +190C +6084 +0000 +ENDCHAR +STARTCHAR U+8CB4 +ENCODING 36020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0920 +0FE0 +7FFC +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CB5 +ENCODING 36021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0210 +0FF8 +0204 +7FFF +1FFC +280A +4FF9 +0808 +0FF8 +0808 +0FF8 +0410 +180C +0000 +0000 +ENDCHAR +STARTCHAR U+8CB6 +ENCODING 36022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3C30 +27C0 +2440 +3C40 +27F8 +3C08 +2410 +2410 +3C20 +1940 +1580 +2240 +443C +0000 +ENDCHAR +STARTCHAR U+8CB7 +ENCODING 36023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +3FF8 +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CB8 +ENCODING 36024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0290 +0488 +1BFC +6840 +0834 +0FEC +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CB9 +ENCODING 36025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C90 +4490 +4490 +7CFE +4590 +4510 +4410 +7C10 +44FE +4410 +4410 +7C10 +2810 +6DFF +C400 +ENDCHAR +STARTCHAR U+8CBA +ENCODING 36026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DFE +4502 +4502 +7D02 +4502 +4502 +45FE +7C48 +4448 +4448 +4448 +7CC8 +2889 +6D89 +C707 +ENDCHAR +STARTCHAR U+8CBB +ENCODING 36027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +3FF8 +0288 +3FF8 +3FFC +4484 +1FF8 +6820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CBC +ENCODING 36028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +2220 +223C +3E20 +2220 +3E20 +22F8 +2288 +3E88 +1488 +1288 +22F8 +4088 +0000 +ENDCHAR +STARTCHAR U+8CBD +ENCODING 36029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +2220 +2250 +3E48 +2288 +3FF4 +2204 +22F8 +3E88 +1488 +1288 +22F8 +4088 +0000 +ENDCHAR +STARTCHAR U+8CBE +ENCODING 36030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FE +7C80 +4488 +4488 +7C88 +44FF +4488 +7C88 +4488 +4488 +7CA8 +00C8 +2885 +457B +0000 +0000 +ENDCHAR +STARTCHAR U+8CBF +ENCODING 36031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +38F8 +2448 +2648 +3A88 +6FF8 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CC0 +ENCODING 36032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7E88 +12F8 +1688 +2FE0 +4820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CC1 +ENCODING 36033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +0540 +7FFC +0440 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CC2 +ENCODING 36034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +2278 +2288 +3ED0 +2350 +3E20 +2250 +23FC +3E88 +1488 +1288 +22F8 +4088 +0000 +ENDCHAR +STARTCHAR U+8CC3 +ENCODING 36035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0430 +19C0 +77FC +1040 +13F8 +1FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CC4 +ENCODING 36036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2440 +3C40 +24F8 +3C88 +25F8 +2688 +3CF8 +1888 +1488 +2488 +4098 +0000 +ENDCHAR +STARTCHAR U+8CC5 +ENCODING 36037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +4410 +45FF +7C20 +4460 +44C4 +446C +7C18 +4432 +4466 +45CC +7C18 +2834 +6C66 +C5C3 +ENDCHAR +STARTCHAR U+8CC6 +ENCODING 36038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +7CCC +4448 +45FE +7C48 +4448 +4448 +4448 +7FFF +4448 +4448 +4448 +7CC8 +2888 +6D88 +C708 +ENDCHAR +STARTCHAR U+8CC7 +ENCODING 36039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +09F8 +0A50 +04E0 +1930 +6FEC +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CC8 +ENCODING 36040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0440 +3FF8 +2448 +3FF8 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CC9 +ENCODING 36041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C30 +4420 +44FE +7CAA +44AA +44AA +44AA +7CAA +44AA +44AA +44AA +7CAA +28AA +6DFF +C400 +ENDCHAR +STARTCHAR U+8CCA +ENCODING 36042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C28 +2424 +27FC +3C20 +24A8 +3CA8 +27E8 +2490 +3C90 +18B4 +14AC +24CC +4084 +0000 +ENDCHAR +STARTCHAR U+8CCB +ENCODING 36043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +4410 +45FF +7C44 +44C6 +4583 +4444 +7C44 +446C +4438 +4410 +7C38 +286C +6CC6 +C583 +ENDCHAR +STARTCHAR U+8CCC +ENCODING 36044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0440 +0F90 +0120 +3E50 +018E +1FFC +1124 +1244 +1484 +1FFC +0808 +3006 +0000 +0000 +ENDCHAR +STARTCHAR U+8CCD +ENCODING 36045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +25FC +2520 +3D20 +2520 +3DF8 +2520 +2520 +3D20 +1A20 +1620 +27FC +4000 +0000 +ENDCHAR +STARTCHAR U+8CCE +ENCODING 36046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3C48 +247C +27C0 +3C78 +27C0 +3C7C +27C8 +2448 +3C30 +1824 +14D4 +270C +4004 +0000 +ENDCHAR +STARTCHAR U+8CCF +ENCODING 36047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +4242 +7E7E +4242 +4242 +4242 +7E7E +4242 +4242 +4242 +7E7E +2424 +6666 +C2C3 +ENDCHAR +STARTCHAR U+8CD1 +ENCODING 36049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +2500 +2500 +3D78 +2500 +3DFC +2560 +2564 +3D58 +1950 +1550 +2268 +4584 +0000 +ENDCHAR +STARTCHAR U+8CD2 +ENCODING 36050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C20 +4450 +4488 +7D06 +46F8 +4400 +7C04 +47FE +4420 +7CA8 +29A6 +2622 +4420 +8020 +0000 +0000 +ENDCHAR +STARTCHAR U+8CD3 +ENCODING 36051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2008 +5FF0 +0930 +33C8 +7FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CD5 +ENCODING 36053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +7C26 +4422 +47FF +7C20 +4522 +45A6 +44AC +7C20 +4430 +44B8 +44AC +7DA6 +2B23 +6C20 +C4E0 +ENDCHAR +STARTCHAR U+8CD6 +ENCODING 36054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C70 +4450 +44D8 +7C8C +4586 +477B +4420 +7C20 +45FE +4420 +44A8 +7CA8 +29AC +6D26 +C460 +ENDCHAR +STARTCHAR U+8CD7 +ENCODING 36055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +44FE +4492 +7C92 +44FE +4410 +7DFF +4511 +4511 +7DFF +2810 +4410 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+8CD9 +ENCODING 36057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFF +4481 +4491 +7CBD +4491 +4491 +44BD +7C81 +44BD +44A5 +44A5 +7CBD +2881 +6D81 +C507 +ENDCHAR +STARTCHAR U+8CDA +ENCODING 36058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0910 +17A8 +2548 +1930 +6FEC +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CDB +ENCODING 36059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +3FF8 +0420 +7FFC +0A50 +1FE8 +6824 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CDC +ENCODING 36060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF0 +2510 +25F0 +3D10 +25F0 +3C00 +27FC +2500 +3DF8 +1AA8 +14A8 +2548 +42B0 +0000 +ENDCHAR +STARTCHAR U+8CDD +ENCODING 36061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BFE +4A52 +4A52 +78D0 +499F +4B00 +4820 +7820 +4BFF +48A8 +48A8 +79AC +2926 +6F23 +C420 +ENDCHAR +STARTCHAR U+8CDE +ENCODING 36062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +0920 +3FFC +27C8 +4440 +07C0 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CDF +ENCODING 36063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +7C28 +44FE +44AA +7CAA +44AA +44FE +7CAA +44AA +44AA +7DFF +2844 +2482 +4701 +0000 +0000 +ENDCHAR +STARTCHAR U+8CE0 +ENCODING 36064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +23FC +2288 +3E48 +2250 +3FFC +2200 +22F8 +3E88 +1488 +1288 +22F8 +4088 +0000 +ENDCHAR +STARTCHAR U+8CE1 +ENCODING 36065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2080 +2FFC +2084 +3FFF +2144 +2FFC +2408 +2FFC +340B +27F8 +6408 +47F8 +C210 +0C0C +ENDCHAR +STARTCHAR U+8CE2 +ENCODING 36066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +3E50 +3E70 +3F8C +2FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CE3 +ENCODING 36067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +1FF0 +3FF8 +2448 +3FF8 +0FE0 +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CE4 +ENCODING 36068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3C48 +247C +27C8 +3C30 +2474 +3D8C +2454 +247C +3FC8 +1830 +1434 +24CC +4304 +0000 +ENDCHAR +STARTCHAR U+8CE5 +ENCODING 36069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4444 +4444 +7CC6 +4529 +4410 +7C10 +45FF +4410 +7C10 +2810 +2410 +4610 +0000 +0000 +ENDCHAR +STARTCHAR U+8CE6 +ENCODING 36070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3DF8 +2414 +2414 +3FFC +2450 +3D50 +2570 +2550 +3D50 +1974 +15CC +270C +4004 +0000 +ENDCHAR +STARTCHAR U+8CE7 +ENCODING 36071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3E12 +2256 +2258 +3E90 +2226 +22D2 +3E10 +2254 +2298 +3E28 +1424 +2247 +4382 +0000 +0000 +ENDCHAR +STARTCHAR U+8CE8 +ENCODING 36072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4002 +4FF2 +0000 +3FFC +0910 +330C +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +700E +ENDCHAR +STARTCHAR U+8CEA +ENCODING 36074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0630 +38C0 +3FFC +2490 +2510 +4FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CEC +ENCODING 36076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7CFE +4480 +44FC +7C80 +44FC +4480 +4480 +7FFF +4492 +4496 +449C +7C88 +288C +6CE6 +C583 +ENDCHAR +STARTCHAR U+8CED +ENCODING 36077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C48 +27F8 +2450 +3C50 +27FC +3C40 +24F8 +2588 +3EF8 +1888 +1488 +24F8 +4088 +0000 +ENDCHAR +STARTCHAR U+8CEE +ENCODING 36078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0FF8 +7FFF +1FF8 +0080 +7FFF +2222 +0FF8 +0808 +0FF8 +0FF8 +0808 +0FF8 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+8CEF +ENCODING 36079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7C80 +45FF +4701 +7CF9 +4489 +44F9 +4489 +7CFB +4400 +45FE +4408 +7FFF +2810 +6C10 +C470 +ENDCHAR +STARTCHAR U+8CF0 +ENCODING 36080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C20 +45FE +4420 +7CFC +4450 +47FF +4448 +7C84 +45FE +4685 +4484 +7CFC +2884 +6C84 +C4FC +ENDCHAR +STARTCHAR U+8CF1 +ENCODING 36081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4511 +457D +7C10 +44FE +4492 +7CFE +4492 +44FE +7C10 +01FF +2810 +2410 +4610 +0000 +0000 +ENDCHAR +STARTCHAR U+8CF2 +ENCODING 36082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +1904 +31FC +6020 +A7FF +2124 +2222 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +0810 +700E +ENDCHAR +STARTCHAR U+8CF3 +ENCODING 36083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C48 +444C +45FA +7C48 +4448 +47FF +7C08 +45E8 +4529 +7D2A +012C +29E8 +2415 +4623 +0000 +0000 +ENDCHAR +STARTCHAR U+8CF4 +ENCODING 36084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F11 +0811 +0826 +7F40 +49FF +4941 +7F7F +0841 +1C7F +1A41 +297F +2800 +4822 +0841 +ENDCHAR +STARTCHAR U+8CF5 +ENCODING 36085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DFF +4501 +45FF +7D01 +45FF +4400 +44FE +7C82 +44FE +4482 +4482 +7CFE +2882 +6C82 +C4FE +ENDCHAR +STARTCHAR U+8CF7 +ENCODING 36087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFF +0100 +7D7C +4544 +7D7C +0100 +FFFF +9009 +9FF9 +1008 +1FF8 +1008 +1FF8 +0810 +700E +ENDCHAR +STARTCHAR U+8CF8 +ENCODING 36088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A44 +4948 +4BFE +4890 +7890 +4FFF +4908 +4BFC +7D0B +49F8 +4908 +49F8 +4908 +C9F8 +9B0E +ENDCHAR +STARTCHAR U+8CF9 +ENCODING 36089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C82 +4444 +4400 +7DFF +4428 +4444 +7C82 +4501 +44FE +7CAA +00AA +20AA +28AA +45FF +0000 +0000 +ENDCHAR +STARTCHAR U+8CFA +ENCODING 36090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +3DB0 +27FC +24A0 +3FF8 +24A8 +3FFC +24A8 +27F8 +3DB0 +19B0 +16A8 +24A4 +40A0 +0000 +ENDCHAR +STARTCHAR U+8CFB +ENCODING 36091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3FFC +2440 +25F8 +3D48 +25F8 +3D48 +25F8 +2548 +3C10 +1BFC +1510 +2490 +4030 +0000 +ENDCHAR +STARTCHAR U+8CFC +ENCODING 36092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3FFC +24A0 +27F8 +3CA0 +27FC +3C40 +25F8 +2548 +3DF8 +1948 +17FC +2508 +4118 +0000 +ENDCHAR +STARTCHAR U+8CFD +ENCODING 36093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2448 +7FFC +1FF0 +0440 +7FFC +0FE0 +1830 +6FEC +0FE0 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8CFE +ENCODING 36094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FEFF +8810 +887E +8810 +AEFF +A200 +A27E +A242 +AE7E +8842 +887E +8842 +887E +FE24 +00C3 +ENDCHAR +STARTCHAR U+8CFF +ENCODING 36095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DDE +4442 +454A +7CC6 +454A +4422 +4470 +7DDC +4707 +4420 +44C8 +7C32 +28C4 +6C18 +C4E0 +ENDCHAR +STARTCHAR U+8D00 +ENCODING 36096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F3C +5024 +7E47 +487C +7F28 +5410 +7F2E +0FF8 +0808 +0FF8 +0FF8 +0808 +0FF8 +180C +0000 +0000 +ENDCHAR +STARTCHAR U+8D01 +ENCODING 36097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C40 +4440 +7C40 +44FF +7C84 +4584 +7C44 +826C +7C28 +4438 +7C10 +4438 +7C28 +446C +7CC6 +8283 +ENDCHAR +STARTCHAR U+8D02 +ENCODING 36098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C82 +45FE +4444 +7CA9 +45FF +4428 +7C4C +4492 +4525 +7C48 +1012 +2804 +44F8 +0000 +0000 +ENDCHAR +STARTCHAR U+8D03 +ENCODING 36099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7CFE +4492 +4492 +7CFE +4410 +44FE +4492 +7C92 +44FE +4410 +440A +7CA5 +28A0 +6DB2 +C51E +ENDCHAR +STARTCHAR U+8D04 +ENCODING 36100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +7FF0 +1450 +7FD4 +3EB4 +090C +0FE0 +0820 +0FE0 +0FE0 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8D05 +ENCODING 36101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +7EFC +0990 +7F50 +1E70 +278C +4FE0 +0820 +0FE0 +0FE0 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8D06 +ENCODING 36102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C14 +4414 +44FE +7C10 +4428 +4444 +7C00 +44A5 +44A5 +7FFF +0084 +1144 +2A2A +4411 +0000 +0000 +ENDCHAR +STARTCHAR U+8D07 +ENCODING 36103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08D4 +7FFC +1270 +0D50 +1D74 +638C +0FE4 +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8D08 +ENCODING 36104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3CA0 +25F8 +2548 +3DF8 +2548 +3DF8 +2400 +25F0 +3D10 +19F0 +1510 +25F0 +4110 +0000 +ENDCHAR +STARTCHAR U+8D09 +ENCODING 36105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DFF +4450 +45FE +7D52 +45FE +4400 +44FC +7C84 +44FC +4484 +44FC +7C20 +2BFF +6C20 +C420 +ENDCHAR +STARTCHAR U+8D0A +ENCODING 36106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +14A0 +1FF8 +2520 +7FFC +1650 +2594 +4FEC +0820 +0FE0 +0FE0 +0820 +0FE0 +0660 +3818 +0000 +ENDCHAR +STARTCHAR U+8D0B +ENCODING 36107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1290 +14FC +1DF8 +16F8 +14FC +13F0 +13F0 +13F0 +2210 +23F0 +4330 +1C0C +0000 +ENDCHAR +STARTCHAR U+8D0D +ENCODING 36109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3CF0 +2720 +25FC +3D54 +258C +3D70 +25FC +2570 +3D70 +1AF8 +1688 +24F8 +4088 +0000 +ENDCHAR +STARTCHAR U+8D0F +ENCODING 36111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0800 +07F0 +1FF0 +1010 +1FF0 +3BB8 +2AA8 +3BB8 +2BB8 +3BAC +2B4C +5C84 +0000 +ENDCHAR +STARTCHAR U+8D10 +ENCODING 36112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3DF8 +2448 +27FC +3DF8 +2440 +3FFC +25A8 +2654 +3DF8 +1968 +1568 +27FC +4000 +0000 +ENDCHAR +STARTCHAR U+8D12 +ENCODING 36114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F10 +48FE +7E92 +42FE +7E15 +48A2 +7FBE +0000 +1FF8 +1008 +1FF8 +1008 +1FF8 +1008 +1FF8 +700E +ENDCHAR +STARTCHAR U+8D13 +ENCODING 36115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3814 +2DFC +2D10 +3DF4 +2FD4 +39F4 +2FB8 +2DF8 +3DDC +15FC +1A9C +2A24 +4444 +0000 +ENDCHAR +STARTCHAR U+8D14 +ENCODING 36116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0FE0 +0FE0 +1830 +3EF8 +2288 +3EF8 +3EF8 +3EF8 +1448 +6384 +0000 +ENDCHAR +STARTCHAR U+8D15 +ENCODING 36117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +277F +4508 +453E +557F +7755 +557F +553E +7522 +573E +143E +2422 +443E +0441 +0000 +0000 +ENDCHAR +STARTCHAR U+8D16 +ENCODING 36118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3DFC +24F8 +25FC +3D54 +259C +3DFC +24F8 +2488 +3CF8 +18F8 +14F8 +24C8 +4304 +0000 +ENDCHAR +STARTCHAR U+8D17 +ENCODING 36119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +4420 +49FC +5904 +69FE +4900 +49FF +CAA9 +8A55 +1FF8 +1008 +1FF8 +1008 +1FF8 +0810 +700E +ENDCHAR +STARTCHAR U+8D19 +ENCODING 36121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0E0E +7F7F +4949 +7E7E +4E4E +5555 +2727 +0FF8 +0808 +0FF8 +0FF8 +0808 +0FF8 +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+8D1B +ENCODING 36123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +FE7F +44A4 +2818 +FEE7 +0000 +7CFE +4410 +7DFF +4482 +7CFE +1082 +FEFE +1082 +10FE +1183 +ENDCHAR +STARTCHAR U+8D1D +ENCODING 36125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1110 +1110 +1110 +1110 +1110 +1110 +1110 +1110 +1210 +0240 +0420 +0818 +3008 +ENDCHAR +STARTCHAR U+8D1E +ENCODING 36126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +01FC +0100 +0110 +1FF8 +1010 +1110 +1110 +1110 +1110 +1110 +0240 +0430 +1808 +6004 +ENDCHAR +STARTCHAR U+8D1F +ENCODING 36127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +0FE0 +1040 +2090 +5FF8 +1010 +1110 +1110 +1110 +1110 +1110 +02C0 +0430 +1818 +6008 +ENDCHAR +STARTCHAR U+8D21 +ENCODING 36129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +0100 +0104 +FFFE +0010 +1FF8 +1010 +1110 +1110 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D22 +ENCODING 36130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7E10 +4410 +5414 +57FE +5410 +5430 +5430 +5450 +5490 +5510 +2A10 +2410 +4410 +8050 +0020 +ENDCHAR +STARTCHAR U+8D23 +ENCODING 36131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0110 +3FF8 +0100 +1FF0 +0104 +FFFE +0010 +1FF8 +1010 +1110 +1110 +1210 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D24 +ENCODING 36132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +4BF8 +4910 +48A0 +4840 +48A0 +4B1E +1FF4 +1010 +1110 +1110 +1110 +1210 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D25 +ENCODING 36133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E40 +4444 +547E +5488 +5508 +5448 +5448 +5448 +5450 +5450 +1020 +2850 +248E +4504 +8200 +ENDCHAR +STARTCHAR U+8D26 +ENCODING 36134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +7E84 +4484 +5488 +5490 +54A0 +5484 +57FE +54A0 +54A0 +5490 +5490 +1088 +288E +44C4 +8080 +ENDCHAR +STARTCHAR U+8D27 +ENCODING 36135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0888 +1098 +30E0 +5782 +9082 +107E +1010 +1FF8 +1010 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D28 +ENCODING 36136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0078 +3F80 +2080 +2084 +3FFE +2080 +2088 +2FFC +2808 +2888 +2888 +2888 +4908 +4270 +8C0C +3004 +ENDCHAR +STARTCHAR U+8D29 +ENCODING 36137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7E1C +45E0 +5500 +5500 +55FC +5504 +5548 +5548 +5550 +5530 +5520 +1150 +2A48 +448E +8104 +ENDCHAR +STARTCHAR U+8D2A +ENCODING 36138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0280 +0640 +0930 +37CE +C044 +0090 +1FF8 +1010 +1110 +1110 +1110 +1210 +04C0 +0830 +3008 +ENDCHAR +STARTCHAR U+8D2B +ENCODING 36139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0440 +0820 +1FD0 +244E +C444 +0940 +3090 +1FF8 +1010 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D2C +ENCODING 36140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7E1C +45E0 +5400 +5440 +5420 +55FC +5404 +5408 +5410 +5420 +1040 +2880 +4746 +823C +0000 +ENDCHAR +STARTCHAR U+8D2D +ENCODING 36141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +7E80 +4484 +54FE +5504 +5604 +5444 +5444 +5484 +54A4 +5514 +55F4 +1014 +2804 +4428 +8410 +ENDCHAR +STARTCHAR U+8D2E +ENCODING 36142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E20 +4420 +5400 +55FE +5502 +5604 +5400 +5400 +5400 +5400 +5400 +1004 +2BFE +4400 +8400 +ENDCHAR +STARTCHAR U+8D2F +ENCODING 36143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1110 +1114 +FFFE +1110 +1FF0 +0000 +1FF0 +1010 +1110 +1110 +1110 +0260 +0C18 +3008 +ENDCHAR +STARTCHAR U+8D30 +ENCODING 36144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +0024 +FFFE +0020 +3FA0 +0020 +7FE0 +0020 +3FA0 +2090 +2490 +2490 +2492 +0A0A +118A +6084 +ENDCHAR +STARTCHAR U+8D31 +ENCODING 36145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E50 +4448 +5440 +547C +55C0 +5448 +547C +57C0 +5448 +5450 +5420 +1060 +2892 +470A +8406 +ENDCHAR +STARTCHAR U+8D32 +ENCODING 36146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0110 +3FF8 +0100 +0824 +FFFE +0820 +0820 +1FF0 +1010 +1110 +1110 +1110 +02C0 +0420 +3818 +ENDCHAR +STARTCHAR U+8D33 +ENCODING 36147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1220 +1224 +FFFE +1220 +13E0 +1000 +1FF8 +0000 +1FF0 +1010 +1110 +1110 +1110 +02C0 +0420 +3818 +ENDCHAR +STARTCHAR U+8D34 +ENCODING 36148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E40 +4444 +547E +5440 +5440 +5444 +55FE +5504 +5504 +5504 +5504 +1104 +2904 +45FC +8104 +ENDCHAR +STARTCHAR U+8D35 +ENCODING 36149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +3FFC +2108 +3FF8 +0100 +FFFE +0010 +1FF8 +1010 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D36 +ENCODING 36150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7DFC +4508 +5508 +5508 +5508 +5508 +55F8 +5490 +5490 +5490 +1090 +2892 +2512 +4212 +841E +ENDCHAR +STARTCHAR U+8D37 +ENCODING 36151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08A0 +0890 +10BC +37C0 +5042 +9032 +100E +1FF0 +1010 +1110 +1110 +1110 +1110 +02C0 +0C30 +3010 +ENDCHAR +STARTCHAR U+8D38 +ENCODING 36152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0604 +78FE +4044 +4844 +4E54 +7288 +C110 +1FF8 +1010 +1110 +1110 +1110 +1110 +02C0 +0C38 +7008 +ENDCHAR +STARTCHAR U+8D39 +ENCODING 36153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0448 +7FFC +0448 +7FF8 +4440 +7FFE +0442 +084A +3FF4 +D010 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D3A +ENCODING 36154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +7F7E +1144 +1144 +257C +4210 +9FF8 +1010 +1110 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D3B +ENCODING 36155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E20 +4440 +5488 +5504 +57FE +5400 +5404 +55FE +5504 +5504 +1104 +2904 +2504 +45FC +8104 +ENDCHAR +STARTCHAR U+8D3C +ENCODING 36156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E28 +4424 +5420 +57FE +54A0 +54A0 +5494 +57F4 +5498 +5498 +5490 +2928 +252A +424A +8486 +ENDCHAR +STARTCHAR U+8D3D +ENCODING 36157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +FDFC +1048 +1DC8 +F0A8 +110A +6206 +1FF0 +1010 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D3E +ENCODING 36158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0440 +7FFC +4444 +4444 +7FFC +0010 +1FF8 +1010 +1110 +1110 +1110 +0260 +0C18 +3008 +ENDCHAR +STARTCHAR U+8D3F +ENCODING 36159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E20 +4424 +57FE +5440 +5484 +55FE +5684 +5484 +54FC +5484 +5484 +28FC +2484 +4494 +8088 +ENDCHAR +STARTCHAR U+8D40 +ENCODING 36160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +0884 +2E98 +28E0 +2882 +2E82 +F07E +0010 +1FF8 +1010 +1110 +1110 +1110 +02C0 +0430 +3808 +ENDCHAR +STARTCHAR U+8D41 +ENCODING 36161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0818 +17E0 +3044 +5FFE +9040 +17FC +0010 +1FF8 +1010 +1110 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D42 +ENCODING 36162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E40 +44FC +5588 +5650 +5420 +5450 +548E +5704 +55FE +5504 +5504 +2904 +2504 +45FC +8104 +ENDCHAR +STARTCHAR U+8D43 +ENCODING 36163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E14 +45FE +5500 +5510 +5510 +5514 +55FE +5510 +5510 +5510 +5510 +5510 +2914 +45FE +8200 +ENDCHAR +STARTCHAR U+8D44 +ENCODING 36164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +2100 +21FC +0A44 +3448 +E0A0 +2110 +260E +1FF4 +1010 +1110 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D45 +ENCODING 36165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E20 +4404 +57FE +5440 +5444 +5488 +55F4 +5424 +5448 +5488 +1110 +2828 +2444 +4482 +8102 +ENDCHAR +STARTCHAR U+8D46 +ENCODING 36166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +7EFE +4484 +5484 +54FC +54A0 +5490 +5508 +554E +5624 +5420 +1000 +28C0 +2430 +4418 +8008 +ENDCHAR +STARTCHAR U+8D47 +ENCODING 36167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E28 +4424 +57FE +5420 +5524 +54A8 +54B0 +5430 +5468 +54A8 +1324 +2822 +2420 +44A0 +8040 +ENDCHAR +STARTCHAR U+8D48 +ENCODING 36168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7DFE +4500 +5500 +557C +5500 +5500 +55FE +5552 +5554 +5548 +1148 +2A44 +2454 +4862 +8040 +ENDCHAR +STARTCHAR U+8D49 +ENCODING 36169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +7FFC +0920 +0544 +FFFE +0540 +0920 +3FF8 +D016 +1110 +1110 +1110 +12C0 +0420 +3818 +ENDCHAR +STARTCHAR U+8D4A +ENCODING 36170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E20 +4450 +5488 +5506 +56F8 +5400 +5404 +57FE +5420 +5420 +10A8 +29A6 +2622 +44A0 +8040 +ENDCHAR +STARTCHAR U+8D4B +ENCODING 36171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7E08 +442C +55FA +5408 +5408 +57FE +5448 +5548 +5578 +5548 +1148 +2978 +27CA +450A +8004 +ENDCHAR +STARTCHAR U+8D4C +ENCODING 36172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E40 +4444 +55F8 +5448 +5450 +57FE +5448 +54FC +5588 +5688 +54F8 +1088 +2888 +44F8 +8488 +ENDCHAR +STARTCHAR U+8D4D +ENCODING 36173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0108 +7FFC +0920 +0920 +1550 +7FFE +4002 +9FF4 +1010 +1110 +1110 +1110 +02C0 +0420 +3818 +ENDCHAR +STARTCHAR U+8D4E +ENCODING 36174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E28 +45FC +5420 +5420 +57FE +5482 +5454 +5510 +5490 +5414 +55FE +2820 +2450 +448C +8304 +ENDCHAR +STARTCHAR U+8D4F +ENCODING 36175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1110 +0920 +7FFE +4002 +8FE4 +0820 +0FE0 +0010 +1FF8 +1010 +1110 +1110 +02C0 +0C30 +3008 +ENDCHAR +STARTCHAR U+8D50 +ENCODING 36176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7DFC +4508 +55F8 +5508 +5508 +55F8 +5484 +55FE +5654 +5494 +1124 +2A44 +4484 +8128 +0010 +ENDCHAR +STARTCHAR U+8D53 +ENCODING 36179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2080 +2FF8 +2088 +3FFE +2108 +2FF8 +2220 +27F0 +2C1E +3494 +2490 +4140 +4230 +8C08 +ENDCHAR +STARTCHAR U+8D54 +ENCODING 36180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C20 +45FC +5400 +5488 +5450 +5404 +57FE +5404 +55FE +5504 +5504 +1104 +2904 +45FC +8104 +ENDCHAR +STARTCHAR U+8D55 +ENCODING 36181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E24 +44AC +54B0 +5520 +5450 +544C +55A4 +5420 +54A4 +54A8 +1130 +2850 +2448 +448E +8304 +ENDCHAR +STARTCHAR U+8D56 +ENCODING 36182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1420 +FE7C +1088 +7D14 +56FE +5484 +5494 +7C94 +1094 +38A4 +34A4 +5420 +9058 +1084 +1302 +ENDCHAR +STARTCHAR U+8D58 +ENCODING 36184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7F44 +087E +3E84 +08C4 +FF28 +1010 +1E28 +2246 +CC90 +1FF8 +1010 +1110 +1110 +06C0 +3838 +ENDCHAR +STARTCHAR U+8D59 +ENCODING 36185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0030 +7C28 +47FE +5420 +55FC +5524 +55FC +5524 +55FC +5524 +5408 +13FE +2908 +2488 +44A8 +8010 +ENDCHAR +STARTCHAR U+8D5A +ENCODING 36186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +7C50 +47FE +5450 +55FC +5454 +5454 +57FE +5454 +5454 +55FC +5450 +10D8 +2956 +4654 +8050 +ENDCHAR +STARTCHAR U+8D5B +ENCODING 36187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4442 +9FF4 +0440 +1FF0 +0440 +7FFC +0820 +1FF0 +282E +C924 +0920 +0100 +06C0 +1830 +ENDCHAR +STARTCHAR U+8D5C +ENCODING 36188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0424 +7FFE +4820 +49FC +4820 +5FFE +5404 +55FE +5504 +5D24 +4924 +4924 +4850 +7E4C +0184 +ENDCHAR +STARTCHAR U+8D5D +ENCODING 36189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2250 +24FC +2D90 +36FC +2490 +249E +2480 +2FF8 +2808 +2888 +4888 +4160 +8618 +1804 +ENDCHAR +STARTCHAR U+8D5E +ENCODING 36190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +2850 +3E7C +4890 +FFFE +1428 +1628 +244A +4086 +1FF0 +1010 +1110 +1110 +1290 +0C60 +3018 +ENDCHAR +STARTCHAR U+8D60 +ENCODING 36192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +7C88 +4450 +5404 +55FE +5524 +55AC +5524 +55FC +5408 +54FC +5488 +20F8 +2888 +44F8 +8088 +ENDCHAR +STARTCHAR U+8D61 +ENCODING 36193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7CFC +4508 +57FE +5544 +5592 +55FE +5500 +557C +5500 +557C +5500 +557C +2A44 +4444 +887C +ENDCHAR +STARTCHAR U+8D62 +ENCODING 36194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFE +1000 +1FF0 +0000 +1FF0 +1010 +1FF0 +0000 +77DC +5454 +7554 +555C +7114 +5296 +B462 +ENDCHAR +STARTCHAR U+8D63 +ENCODING 36195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +FE78 +44D0 +2920 +FE58 +0186 +7CF8 +4420 +7DFC +4400 +7CF8 +1088 +FEA8 +10A8 +1058 +1184 +ENDCHAR +STARTCHAR U+8D64 +ENCODING 36196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1FF0 +0100 +0100 +7FFC +0240 +1250 +1248 +2244 +4444 +0440 +0840 +10C0 +0000 +ENDCHAR +STARTCHAR U+8D65 +ENCODING 36197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +7C40 +10FF +1081 +1193 +FF12 +2810 +2810 +2838 +6C28 +AA28 +286C +6844 +48C6 +D983 +ENDCHAR +STARTCHAR U+8D66 +ENCODING 36198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +3E40 +087C +0888 +7F48 +1448 +3650 +3530 +5520 +1430 +2450 +2488 +4D04 +0000 +ENDCHAR +STARTCHAR U+8D67 +ENCODING 36199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +3E88 +0888 +08F8 +7F80 +14F8 +36C8 +36A8 +35B0 +5590 +14B0 +24C8 +4C84 +0000 +ENDCHAR +STARTCHAR U+8D68 +ENCODING 36200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +3E08 +087F +0849 +7F49 +1449 +147F +5508 +5508 +5508 +1409 +247F +0401 +0000 +0000 +ENDCHAR +STARTCHAR U+8D69 +ENCODING 36201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +107C +7CC4 +1088 +11FE +1092 +FE92 +2892 +2892 +28FE +6C80 +AA80 +2880 +6881 +48C3 +D87E +ENDCHAR +STARTCHAR U+8D6B +ENCODING 36203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +3EF8 +0820 +0820 +7FFC +1450 +36D0 +35D8 +5554 +1654 +2490 +2490 +4D30 +0000 +ENDCHAR +STARTCHAR U+8D6C +ENCODING 36204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +7C1F +1010 +10FE +1082 +FE82 +28FE +2882 +2882 +6CFE +AA82 +2882 +68FE +4844 +D983 +ENDCHAR +STARTCHAR U+8D6D +ENCODING 36205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0848 +3FF8 +0850 +0850 +7FFC +1450 +3688 +37F8 +3588 +55F8 +1488 +24F8 +4C88 +0000 +ENDCHAR +STARTCHAR U+8D6E +ENCODING 36206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11EF +7D21 +1121 +1121 +11EF +FF00 +291F +29E9 +290B +6D0A +AB0E +29E4 +690E +491B +D931 +ENDCHAR +STARTCHAR U+8D6F +ENCODING 36207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11FF +7C88 +10BE +7E8A +28FF +688A +6CBE +2A88 +28BE +28A2 +48A2 +093E +0A22 +0000 +0000 +ENDCHAR +STARTCHAR U+8D70 +ENCODING 36208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +0100 +7FFC +0100 +0900 +09F8 +0900 +0900 +1500 +2300 +40FC +0000 +ENDCHAR +STARTCHAR U+8D71 +ENCODING 36209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1FF0 +0100 +0100 +7FFC +0820 +0420 +0440 +1080 +1B00 +1400 +2300 +40FC +0000 +ENDCHAR +STARTCHAR U+8D72 +ENCODING 36210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +3E7F +0811 +0811 +7F11 +0811 +2811 +2F21 +2841 +288A +3804 +4400 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D73 +ENCODING 36211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +0890 +3E90 +0890 +0890 +7F90 +0890 +289C +2EF0 +2990 +3810 +2810 +4600 +41FC +0000 +ENDCHAR +STARTCHAR U+8D74 +ENCODING 36212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0420 +3FA0 +0420 +0420 +7FF0 +0428 +1424 +17A4 +1420 +1420 +2C20 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8D75 +ENCODING 36213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +0888 +7E88 +0850 +0A50 +FF20 +0820 +2850 +2E48 +288C +3904 +4800 +4406 +83FC +0000 +ENDCHAR +STARTCHAR U+8D76 +ENCODING 36214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +09FC +7E20 +0820 +0820 +FE24 +09FE +2820 +2820 +2E20 +2820 +2820 +3820 +4806 +87FC +ENDCHAR +STARTCHAR U+8D77 +ENCODING 36215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +3E08 +0808 +0808 +7FF8 +0888 +2880 +2F80 +2884 +3884 +287C +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8D78 +ENCODING 36216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +3E08 +0849 +0849 +7F49 +0849 +2849 +2F49 +287F +3841 +2800 +4400 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D79 +ENCODING 36217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +3E7F +0881 +0801 +0839 +7F01 +0801 +287D +2E01 +2802 +381C +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D7B +ENCODING 36219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +3E54 +0852 +0891 +7F10 +0812 +2812 +2E04 +2808 +2810 +38E0 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D7D +ENCODING 36221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +3E7E +0812 +0812 +7F12 +0812 +08FF +2810 +2E28 +2844 +2983 +3800 +4FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8D7F +ENCODING 36223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +080C +7E78 +0848 +0848 +0848 +FF7F +0848 +4848 +4E4C +4844 +4844 +4875 +69C3 +DC00 +87FF +ENDCHAR +STARTCHAR U+8D80 +ENCODING 36224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +3EFE +0890 +0890 +7EFF +0811 +0831 +2E51 +2895 +2912 +3810 +2400 +43FE +0000 +0000 +ENDCHAR +STARTCHAR U+8D81 +ENCODING 36225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +3E50 +0850 +0888 +7F24 +0840 +2890 +2E24 +28C8 +3810 +2860 +4780 +41FC +0000 +ENDCHAR +STARTCHAR U+8D82 +ENCODING 36226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +7E20 +087E +08D0 +0810 +FF10 +0854 +4854 +4E54 +48D6 +4892 +4810 +6830 +DC00 +87FF +ENDCHAR +STARTCHAR U+8D84 +ENCODING 36228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +08FC +7F88 +0888 +0AF8 +FF88 +0888 +28F8 +2888 +2E88 +2888 +2BFE +5800 +4806 +87FC +0000 +ENDCHAR +STARTCHAR U+8D85 +ENCODING 36229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +3E48 +0848 +0888 +7EB0 +0900 +28F8 +2E88 +2888 +38F8 +2888 +4600 +41FC +0000 +ENDCHAR +STARTCHAR U+8D88 +ENCODING 36232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +7E10 +081F +0810 +0810 +FF10 +0810 +48FE +4E82 +4882 +4882 +4882 +68FE +DC00 +87FF +ENDCHAR +STARTCHAR U+8D89 +ENCODING 36233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +0849 +3E49 +0849 +087F +7F08 +0808 +2849 +2E49 +2849 +387F +2400 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D8A +ENCODING 36234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0828 +3E24 +09FC +0920 +7F28 +0928 +2930 +2F50 +2994 +3B2C +2844 +4600 +41FC +0000 +ENDCHAR +STARTCHAR U+8D8B +ENCODING 36235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +0878 +7E88 +0910 +0824 +FFFE +0804 +2804 +2EFC +2804 +2804 +29FC +5800 +8806 +07FC +ENDCHAR +STARTCHAR U+8D8C +ENCODING 36236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +09FF +3E10 +0810 +08FE +7F00 +08FE +0882 +2F82 +28FE +3882 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D8D +ENCODING 36237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +083C +7E64 +08AC +0818 +0830 +FFE8 +080F +4811 +4E23 +48D6 +480C +4838 +69E0 +DC00 +87FF +ENDCHAR +STARTCHAR U+8D8E +ENCODING 36238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0890 +0890 +3EFE +0910 +0810 +7EFF +0810 +2854 +2E92 +3911 +2810 +2400 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D8F +ENCODING 36239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +08FC +0810 +3E10 +09FF +0810 +7F10 +08FE +2E82 +2882 +28FE +3882 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D90 +ENCODING 36240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +08EF +7E21 +0821 +08A9 +0865 +FF21 +0823 +4865 +4EA9 +4821 +4821 +4821 +68E7 +DC00 +87FF +ENDCHAR +STARTCHAR U+8D91 +ENCODING 36241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1220 +7D20 +117E +1482 +FE14 +1090 +5090 +5110 +5D28 +5226 +7242 +5080 +4806 +87FC +0000 +ENDCHAR +STARTCHAR U+8D92 +ENCODING 36242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0828 +0828 +3EAA +08AA +086C +7F28 +086C +28AA +2E28 +2849 +388F +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D93 +ENCODING 36243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087C +0844 +3E44 +0845 +0887 +7F10 +08FF +2E10 +2854 +2892 +3911 +2830 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D94 +ENCODING 36244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +17E4 +7D04 +1114 +11D4 +FD54 +1254 +5554 +50D4 +5C94 +5104 +7214 +5008 +4806 +87FC +0000 +ENDCHAR +STARTCHAR U+8D95 +ENCODING 36245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +0842 +7E7E +0842 +0842 +087E +FF00 +08FF +4810 +4E10 +48FF +4810 +4810 +6810 +DC00 +87FF +ENDCHAR +STARTCHAR U+8D96 +ENCODING 36246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0854 +3E54 +08D6 +0939 +7F10 +0810 +08FE +2E10 +2810 +39FF +2800 +4400 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D99 +ENCODING 36249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A8 +3EA4 +0924 +08F8 +7F88 +08F8 +2888 +2EF8 +2888 +3888 +2898 +4600 +41FC +0000 +ENDCHAR +STARTCHAR U+8D9B +ENCODING 36251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0838 +0844 +3E82 +087C +0810 +7F10 +087C +2810 +2E54 +2838 +2810 +38FE +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D9C +ENCODING 36252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +3EFF +0893 +0855 +7F11 +087D +0811 +2E55 +2893 +2811 +3806 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8D9E +ENCODING 36254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0848 +0848 +7EFE +0848 +0848 +09FF +FE00 +08FC +4884 +4E84 +48FC +4884 +4884 +68FC +DC00 +87FF +ENDCHAR +STARTCHAR U+8D9F +ENCODING 36255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +1148 +7D50 +1044 +13FE +FE04 +12F4 +5294 +5E94 +5294 +72F4 +520C +4806 +87FC +0000 +ENDCHAR +STARTCHAR U+8DA0 +ENCODING 36256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +7E1E +0810 +08FE +0882 +FFFE +0882 +48FE +4E10 +4810 +49FF +4810 +6810 +DC00 +87FF +ENDCHAR +STARTCHAR U+8DA1 +ENCODING 36257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +0844 +3EFF +0944 +0844 +7F7F +0844 +0844 +2E7F +2844 +2844 +387F +2840 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8DA3 +ENCODING 36259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +3D40 +0978 +09C8 +7F68 +0958 +29D0 +2F58 +2968 +3BE4 +2844 +2640 +41FC +0000 +ENDCHAR +STARTCHAR U+8DA5 +ENCODING 36261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +0828 +3FFF +0828 +09FF +7F29 +0929 +29C7 +2901 +2F7D +2901 +39FF +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8DA6 +ENCODING 36262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0910 +7D9F +08A1 +082A +0808 +FE9C +0894 +49A2 +4D7F +4922 +4822 +4822 +683E +DC00 +87FF +ENDCHAR +STARTCHAR U+8DA7 +ENCODING 36263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +0842 +3E7E +0842 +087E +7F00 +08FF +0808 +2E4E +2848 +2848 +38BF +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8DA8 +ENCODING 36264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08F8 +3F48 +0958 +09F8 +7E88 +09B0 +28F8 +2F48 +2958 +39F8 +2888 +2730 +41FC +0000 +ENDCHAR +STARTCHAR U+8DAA +ENCODING 36266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +09FF +3E44 +087C +09FF +7F00 +08FE +0892 +0EFE +2892 +28FE +2983 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8DAB +ENCODING 36267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +0810 +7EFF +0824 +087E +08A5 +FF3C +0800 +48FF +4E81 +48BD +48A5 +48BD +6883 +DC00 +87FF +ENDCHAR +STARTCHAR U+8DAC +ENCODING 36268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +08FE +7C10 +09FF +0844 +09EF +FE44 +09EF +4800 +4DFF +4848 +4849 +48C9 +6987 +DC00 +87FF +ENDCHAR +STARTCHAR U+8DAD +ENCODING 36269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0848 +0888 +3FFF +0888 +08FE +7F88 +08FE +0888 +2EFF +2800 +292A +2929 +3800 +4FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8DAE +ENCODING 36270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FE +0882 +3EFE +0800 +09EF +7F29 +09FF +0810 +2FFF +2854 +2892 +3911 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8DAF +ENCODING 36271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09EF +08A5 +7E63 +08A5 +0929 +0863 +FE88 +09FF +4888 +4EFF +4888 +48FF +4888 +68FF +DC00 +87FF +ENDCHAR +STARTCHAR U+8DB1 +ENCODING 36273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1528 +7FBC +1948 +17FE +FB18 +15AA +594E +57F8 +5A08 +5248 +7248 +52B8 +4908 +8606 +03FC +ENDCHAR +STARTCHAR U+8DB2 +ENCODING 36274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +094A +09EF +7C42 +09EF +094A +0863 +FEFE +0882 +48FE +4C82 +48FE +4882 +48FE +6901 +DC00 +87FF +ENDCHAR +STARTCHAR U+8DB3 +ENCODING 36275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1010 +1FF0 +1110 +0100 +1100 +11F0 +1100 +1900 +1500 +2300 +40FC +0000 +ENDCHAR +STARTCHAR U+8DB4 +ENCODING 36276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7E90 +4490 +4490 +4490 +7C90 +1090 +1090 +5C90 +5110 +5110 +5110 +5E08 +E20E +4404 +0800 +ENDCHAR +STARTCHAR U+8DB5 +ENCODING 36277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +7E80 +4484 +44FE +4504 +7D04 +5604 +1084 +5044 +5C44 +5004 +5004 +5C04 +F044 +4028 +0010 +ENDCHAR +STARTCHAR U+8DB6 +ENCODING 36278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFE +4410 +4410 +4410 +7C10 +55FF +1010 +1010 +5E10 +5010 +5010 +5210 +7C50 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+8DB7 +ENCODING 36279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C40 +4442 +44FF +4500 +7C00 +107C +1004 +1C08 +5010 +5020 +5040 +5481 +7901 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+8DB8 +ENCODING 36280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0400 +07F0 +0410 +0890 +3060 +DFF0 +1010 +1010 +1FF0 +0900 +09F8 +1900 +2706 +C0FC +ENDCHAR +STARTCHAR U+8DB9 +ENCODING 36281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3E10 +22FE +2212 +2212 +3E12 +0812 +09FF +0810 +2E10 +2828 +2A44 +2C82 +7901 +0000 +0000 +ENDCHAR +STARTCHAR U+8DBA +ENCODING 36282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +2220 +22F8 +3E20 +0820 +29FC +2E20 +2820 +2860 +2E50 +3890 +6108 +0604 +0000 +ENDCHAR +STARTCHAR U+8DBB +ENCODING 36283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1E30 +1F30 +1A78 +1A4C +1EC6 +1EFF +1D03 +1FFC +1C0C +1C08 +1E18 +1E18 +1818 +0000 +ENDCHAR +STARTCHAR U+8DBC +ENCODING 36284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +7FFE +4488 +4488 +4488 +7C88 +1088 +13FE +5088 +5C88 +5088 +5108 +5D08 +F108 +4208 +0408 +ENDCHAR +STARTCHAR U+8DBE +ENCODING 36286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +2220 +2220 +3EA0 +08BC +28A0 +2EA0 +28A0 +28A0 +2EA0 +38A0 +63FC +0000 +0000 +ENDCHAR +STARTCHAR U+8DBF +ENCODING 36287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +7FFC +4484 +4488 +4488 +7C90 +54BC +1084 +50C4 +5CA8 +5128 +5110 +5D28 +F228 +4446 +0984 +ENDCHAR +STARTCHAR U+8DC0 +ENCODING 36288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F3F +4121 +4121 +4121 +7F3F +0821 +0821 +0821 +2E3F +2821 +2821 +2821 +2E41 +7841 +0083 +ENDCHAR +STARTCHAR U+8DC1 +ENCODING 36289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3EFE +2292 +2292 +2292 +3E92 +0892 +08FE +0882 +2E80 +2880 +2880 +2A81 +2C81 +78FF +0000 +0000 +ENDCHAR +STARTCHAR U+8DC2 +ENCODING 36290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +2220 +23FC +3E20 +0820 +29F8 +2E88 +2850 +2850 +2E20 +3850 +6188 +0604 +0000 +ENDCHAR +STARTCHAR U+8DC3 +ENCODING 36291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7C1C +47E0 +4440 +4440 +7C40 +1044 +13FE +5C40 +50A0 +50A0 +5110 +5D10 +F208 +440E +0804 +ENDCHAR +STARTCHAR U+8DC4 +ENCODING 36292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E40 +44A0 +44A0 +4490 +7D08 +5616 +11F8 +5110 +5D10 +5110 +5150 +5D20 +F104 +4104 +00FC +ENDCHAR +STARTCHAR U+8DC5 +ENCODING 36293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +7DFE +4440 +4440 +7C40 +107F +1048 +1C4C +104A +5049 +5488 +5908 +7008 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+8DC6 +ENCODING 36294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E40 +4480 +4490 +4508 +7FFC +5402 +1008 +51FC +5D08 +5108 +5108 +5D08 +F108 +41F8 +0108 +ENDCHAR +STARTCHAR U+8DC7 +ENCODING 36295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C92 +4492 +4492 +4492 +7DFF +1092 +1092 +1092 +5C92 +509E +5080 +5080 +50FF +7C80 +0000 +0000 +ENDCHAR +STARTCHAR U+8DC8 +ENCODING 36296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C28 +4444 +4482 +4509 +7C10 +1020 +1048 +5C10 +5022 +5044 +5008 +5010 +7DE0 +0000 +0000 +ENDCHAR +STARTCHAR U+8DCA +ENCODING 36298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3E10 +2210 +22FE +2210 +3E10 +0810 +09FF +2810 +2E38 +2838 +2854 +2854 +2E92 +7911 +0010 +ENDCHAR +STARTCHAR U+8DCB +ENCODING 36299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3E48 +2248 +23FC +3E40 +0848 +2848 +2EC8 +28B0 +28B0 +2F30 +3A50 +6488 +0B04 +0000 +ENDCHAR +STARTCHAR U+8DCC +ENCODING 36300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EA0 +22A0 +22F8 +3EA0 +0920 +2BFC +2E20 +2820 +2860 +2E50 +3890 +6108 +0604 +0000 +ENDCHAR +STARTCHAR U+8DCD +ENCODING 36301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +4410 +45FF +7C10 +1010 +1010 +10FE +1C82 +5082 +5082 +5082 +50FE +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+8DCE +ENCODING 36302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E20 +4420 +45FE +4502 +7E04 +5480 +1088 +5098 +5CA0 +50C0 +5280 +5C82 +F082 +407E +0000 +ENDCHAR +STARTCHAR U+8DCF +ENCODING 36303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3D00 +251C +27D4 +3D54 +0954 +2954 +2D54 +2954 +2954 +2E54 +3A5C +6454 +0980 +0000 +ENDCHAR +STARTCHAR U+8DD0 +ENCODING 36304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +7C48 +4448 +4448 +7C48 +107F +1048 +1148 +5148 +5D48 +5148 +5149 +5149 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+8DD1 +ENCODING 36305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +7E84 +44FE +4504 +4524 +7FF4 +1524 +1124 +5D24 +51E4 +5114 +5108 +5D02 +E102 +40FE +0000 +ENDCHAR +STARTCHAR U+8DD3 +ENCODING 36307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C10 +4408 +45FF +7C10 +1010 +1010 +10FE +1C10 +5010 +5010 +5010 +5010 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+8DD4 +ENCODING 36308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00C0 +3EC0 +36FF +3703 +3603 +3EF3 +0D93 +1F93 +3F93 +3DF2 +3C86 +3E06 +3C0E +381C +0008 +ENDCHAR +STARTCHAR U+8DD5 +ENCODING 36309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C20 +4420 +443E +7C20 +1020 +1020 +11FE +1D02 +5102 +5502 +5902 +71FE +0102 +0000 +0000 +ENDCHAR +STARTCHAR U+8DD6 +ENCODING 36310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2240 +2240 +3E40 +0880 +28F8 +2F88 +2988 +2A88 +2888 +2E88 +38F8 +6088 +0000 +ENDCHAR +STARTCHAR U+8DD7 +ENCODING 36311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0488 +7E88 +4488 +4508 +4508 +7FFE +5508 +1108 +5148 +5D28 +5128 +5108 +5D08 +F108 +4128 +0110 +ENDCHAR +STARTCHAR U+8DD8 +ENCODING 36312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +4492 +4454 +7C10 +10FE +1010 +1010 +5DFF +5010 +5010 +5010 +7C10 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+8DD9 +ENCODING 36313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C7E +4442 +4442 +4442 +7C7E +1042 +1042 +1042 +5C7E +5042 +5042 +5042 +5042 +7EFF +0000 +0000 +ENDCHAR +STARTCHAR U+8DDA +ENCODING 36314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7BF8 +4AA8 +4AA8 +7AA8 +12A8 +57FC +5EA8 +52A8 +52A8 +5EA8 +72A8 +42A8 +0218 +0000 +ENDCHAR +STARTCHAR U+8DDB +ENCODING 36315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +25FC +2528 +3D20 +0920 +29F8 +2F88 +2950 +2950 +2E20 +3A50 +6588 +0E04 +0000 +ENDCHAR +STARTCHAR U+8DDC +ENCODING 36316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFF +4481 +4481 +4481 +7CFF +5480 +10A0 +10A0 +1CA0 +50BE +50A0 +54A1 +5921 +723F +0000 +0000 +ENDCHAR +STARTCHAR U+8DDD +ENCODING 36317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EFC +2280 +2280 +3EF8 +0888 +2888 +2E88 +28F8 +2888 +2880 +2E80 +38FC +6080 +0000 +ENDCHAR +STARTCHAR U+8DDE +ENCODING 36318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041C +7FE0 +4500 +4520 +4520 +7D20 +5524 +11FE +5020 +5C20 +50A8 +5126 +5E22 +F020 +40A0 +0040 +ENDCHAR +STARTCHAR U+8DDF +ENCODING 36319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +2288 +3EF8 +0888 +28F8 +2EA4 +28A4 +28A8 +2890 +2EB0 +38C8 +6304 +0000 +ENDCHAR +STARTCHAR U+8DE0 +ENCODING 36320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +45FF +4410 +44FE +7C12 +11FE +1110 +11FF +5C11 +5011 +5011 +502B +5044 +7D83 +0000 +0000 +ENDCHAR +STARTCHAR U+8DE1 +ENCODING 36321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +2220 +23FC +3E50 +0850 +28D8 +2ED8 +2954 +2A54 +2E90 +3890 +6110 +0230 +0000 +ENDCHAR +STARTCHAR U+8DE2 +ENCODING 36322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C7E +4444 +44A8 +4510 +7C20 +11C8 +101F +5021 +5C52 +5094 +5008 +5010 +7CE0 +0000 +0000 +ENDCHAR +STARTCHAR U+8DE3 +ENCODING 36323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EA0 +22A0 +22F8 +3EA0 +0920 +29FC +2E50 +2850 +2850 +2E90 +3894 +6114 +020C +0000 +ENDCHAR +STARTCHAR U+8DE4 +ENCODING 36324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E20 +4404 +47FE +4400 +7C88 +5506 +128A +5088 +5C50 +5050 +5020 +5C50 +F088 +410E +0204 +ENDCHAR +STARTCHAR U+8DE5 +ENCODING 36325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3400 +24FC +2448 +245A +245F +3CC2 +3886 +3EAC +3820 +39FE +3870 +3CF8 +31AE +2226 +0000 +ENDCHAR +STARTCHAR U+8DE6 +ENCODING 36326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C50 +4450 +447C +7C90 +5510 +1010 +11FE +5C10 +5038 +5054 +5C92 +E110 +4010 +0000 +0000 +ENDCHAR +STARTCHAR U+8DE7 +ENCODING 36327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C28 +4444 +4482 +7D7D +1010 +1010 +1010 +5CFE +5010 +5010 +5010 +5010 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+8DE8 +ENCODING 36328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +23FC +2250 +3E88 +0974 +2800 +2FFC +2840 +2878 +2888 +2E88 +3808 +6030 +0000 +ENDCHAR +STARTCHAR U+8DE9 +ENCODING 36329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +45FF +4511 +7DFF +1111 +11FF +1010 +5011 +5E12 +5014 +5009 +5015 +7CE3 +0000 +0000 +ENDCHAR +STARTCHAR U+8DEA +ENCODING 36330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C78 +2490 +2720 +3DFC +0900 +2978 +2F48 +2948 +2970 +2E40 +3A44 +6444 +083C +0000 +ENDCHAR +STARTCHAR U+8DEB +ENCODING 36331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +0910 +0990 +0F54 +7154 +020C +1FF0 +1010 +1FF0 +0900 +09F0 +1500 +63FC +0000 +ENDCHAR +STARTCHAR U+8DEC +ENCODING 36332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E20 +4428 +45FC +4420 +7C24 +53FE +1000 +5020 +5C28 +51FC +5020 +5C20 +F024 +43FE +0000 +ENDCHAR +STARTCHAR U+8DEE +ENCODING 36334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4410 +4410 +4420 +7C44 +10FE +1010 +5010 +5C10 +50FE +5010 +5010 +5010 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+8DEF +ENCODING 36335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +2278 +2288 +3ED0 +0920 +0850 +2E88 +29FC +2888 +2888 +2E88 +38F8 +6088 +0000 +ENDCHAR +STARTCHAR U+8DF0 +ENCODING 36336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7C44 +4428 +44FE +7C44 +1044 +1044 +11FF +5C44 +5044 +5044 +5044 +5084 +7D04 +0000 +0000 +ENDCHAR +STARTCHAR U+8DF1 +ENCODING 36337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +44FE +4410 +7C10 +11FF +1004 +1004 +51FF +5C84 +5044 +5024 +5004 +7C18 +0000 +0000 +ENDCHAR +STARTCHAR U+8DF2 +ENCODING 36338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C28 +4444 +4482 +7D01 +107C +1000 +1000 +5CFE +5082 +5082 +5082 +50FE +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+8DF3 +ENCODING 36339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3CA0 +24A8 +26A8 +3DB0 +09A0 +28B0 +2DA8 +2AA4 +28A4 +2D20 +3924 +6224 +041C +0000 +ENDCHAR +STARTCHAR U+8DF4 +ENCODING 36340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4428 +4428 +4428 +7DFF +1129 +1129 +1129 +5D29 +514F +5101 +5101 +51FF +7D01 +0000 +0000 +ENDCHAR +STARTCHAR U+8DF5 +ENCODING 36341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3E48 +2278 +23C0 +3E78 +09C0 +287C +2FC8 +2848 +2830 +2E24 +3854 +618C +0604 +0000 +ENDCHAR +STARTCHAR U+8DF7 +ENCODING 36343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E48 +447C +47C0 +4450 +7C22 +54D2 +130E +5008 +5DFC +50A0 +50A0 +5CA0 +F122 +4222 +041E +ENDCHAR +STARTCHAR U+8DF8 +ENCODING 36344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7D10 +4512 +45D4 +4518 +7D12 +5552 +118E +5020 +5C24 +53FE +5020 +5C20 +F020 +4020 +0020 +ENDCHAR +STARTCHAR U+8DF9 +ENCODING 36345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +7E0C +4570 +4510 +4410 +7C14 +57FE +1110 +5110 +5D10 +5110 +5110 +5D10 +F286 +447C +0000 +ENDCHAR +STARTCHAR U+8DFA +ENCODING 36346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7DF8 +4910 +4910 +4910 +4910 +7A0C +1040 +17FE +58C0 +50E0 +5150 +5D4E +E244 +4440 +0040 +ENDCHAR +STARTCHAR U+8DFB +ENCODING 36347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C24 +47FE +4488 +4450 +7C20 +5450 +108E +5304 +5C88 +5088 +5088 +5C88 +F088 +4108 +0208 +ENDCHAR +STARTCHAR U+8DFC +ENCODING 36348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2508 +2508 +3DF8 +0900 +29FC +2F04 +29F4 +2994 +2EF4 +3A94 +6404 +0818 +0000 +ENDCHAR +STARTCHAR U+8DFD +ENCODING 36349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7DFC +4408 +4408 +45F8 +7D00 +5504 +1104 +50FC +5C00 +5040 +52A4 +5EA2 +F48A +4078 +0000 +ENDCHAR +STARTCHAR U+8DFE +ENCODING 36350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0420 +083F +72C4 +1228 +1210 +106E +0FF8 +0808 +0FF8 +1080 +18FC +2480 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+8DFF +ENCODING 36351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +22F8 +2220 +3E20 +09FC +2820 +2EA0 +28B8 +28A0 +2FA0 +3960 +6230 +040C +0000 +ENDCHAR +STARTCHAR U+8E00 +ENCODING 36352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFE +4482 +4482 +4482 +7CFE +1010 +1010 +1C90 +509E +5090 +5090 +5490 +7950 +023F +0000 +0000 +ENDCHAR +STARTCHAR U+8E01 +ENCODING 36353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1E00 +1FFE +16D6 +16A4 +1768 +1EB4 +1CD4 +1E00 +1CFE +1C30 +1C30 +1FFE +39FE +0000 +0000 +ENDCHAR +STARTCHAR U+8E02 +ENCODING 36354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DF4 +4524 +45E4 +7D24 +1124 +11E4 +1124 +1D24 +5124 +53E4 +5025 +5425 +7827 +0000 +0000 +ENDCHAR +STARTCHAR U+8E03 +ENCODING 36355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +4492 +4492 +4454 +7C10 +10FE +1082 +10FE +1C82 +50FE +5082 +5082 +7C82 +0106 +0000 +0000 +ENDCHAR +STARTCHAR U+8E04 +ENCODING 36356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +445E +4450 +4450 +7DFF +1010 +1050 +1C92 +5112 +5004 +5008 +5410 +79E0 +0000 +0000 +ENDCHAR +STARTCHAR U+8E05 +ENCODING 36357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080C +08F0 +FE84 +08FE +1E90 +E890 +0910 +1FF0 +1010 +1010 +1FF0 +0900 +09F8 +0D00 +3306 +C0FC +ENDCHAR +STARTCHAR U+8E06 +ENCODING 36358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C20 +4442 +45FF +4444 +7C82 +1141 +1040 +1CFE +5144 +5044 +5028 +5410 +7828 +01C7 +0000 +0000 +ENDCHAR +STARTCHAR U+8E07 +ENCODING 36359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7CFF +4500 +44FE +4482 +7CA2 +1092 +11FF +1C82 +50A2 +5092 +50FF +5404 +7818 +0000 +0000 +ENDCHAR +STARTCHAR U+8E08 +ENCODING 36360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +23FC +2220 +3EF8 +08A8 +28A8 +2EF8 +2870 +2870 +2EA8 +3924 +6220 +0020 +0000 +ENDCHAR +STARTCHAR U+8E09 +ENCODING 36361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +22F8 +2288 +3E88 +28F8 +0888 +2EF8 +28A4 +28A8 +2890 +2EB0 +38C8 +6304 +0000 +ENDCHAR +STARTCHAR U+8E0A +ENCODING 36362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +24A0 +2440 +3DF8 +2948 +0948 +2FF8 +2948 +2948 +29F8 +2F48 +3948 +6158 +0000 +ENDCHAR +STARTCHAR U+8E0B +ENCODING 36363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7C8F +4489 +47E9 +4489 +7C89 +1089 +13E9 +5089 +5C89 +5089 +5109 +512B +5DE8 +7328 +0008 +ENDCHAR +STARTCHAR U+8E0C +ENCODING 36364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C48 +47FC +4440 +47F8 +4440 +7FFE +1080 +1088 +5FFE +5108 +5148 +5A28 +E408 +4828 +0010 +ENDCHAR +STARTCHAR U+8E0D +ENCODING 36365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C20 +44FC +4422 +7C24 +11FF +1010 +107C +1C84 +5108 +50FF +5008 +5408 +7828 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+8E0F +ENCODING 36367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E24 +23F8 +2270 +3EA8 +2924 +0860 +2EF8 +2888 +28F8 +2888 +2E88 +38F8 +6088 +0000 +ENDCHAR +STARTCHAR U+8E10 +ENCODING 36368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3E48 +227C +23C8 +3E30 +0874 +298C +2E54 +287C +29C8 +2E30 +3824 +60DC +0304 +0000 +ENDCHAR +STARTCHAR U+8E11 +ENCODING 36369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7C44 +45FF +4444 +7C44 +107C +1044 +1C7C +5044 +5044 +51FF +5444 +7882 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+8E12 +ENCODING 36370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7CFC +4410 +45FF +7C92 +1111 +1050 +1044 +5DFF +5044 +5028 +5010 +7C28 +01C7 +0000 +0000 +ENDCHAR +STARTCHAR U+8E13 +ENCODING 36371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C48 +4484 +45FF +7E88 +1088 +10FF +1C88 +5088 +50FF +5088 +5488 +78FF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8E14 +ENCODING 36372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0424 +7E3E +4420 +4420 +45FC +7D04 +55FC +1104 +51FC +5C20 +5024 +53FE +5C20 +F020 +4020 +0020 +ENDCHAR +STARTCHAR U+8E15 +ENCODING 36373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4410 +44FE +7C12 +11FF +1012 +10FE +1C10 +5090 +509E +5090 +7D50 +023F +0000 +0000 +ENDCHAR +STARTCHAR U+8E16 +ENCODING 36374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7C44 +45FF +4444 +7C44 +11FF +1000 +1CFE +5082 +5082 +50FE +5082 +7C82 +00FE +0000 +0000 +ENDCHAR +STARTCHAR U+8E17 +ENCODING 36375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C28 +4444 +44BA +7D01 +10FE +1004 +1008 +1C10 +1002 +5151 +5148 +5242 +7C7E +0000 +0000 +ENDCHAR +STARTCHAR U+8E18 +ENCODING 36376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C40 +447F +4481 +7D25 +10A9 +1021 +10F9 +1C21 +50A9 +5125 +5021 +7C21 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+8E19 +ENCODING 36377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03F0 +7D20 +452F +45E9 +7D29 +1129 +1129 +11E9 +1D29 +5126 +53E6 +5429 +7820 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+8E1A +ENCODING 36378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +7C44 +4482 +4501 +7CFE +1000 +11FF +1129 +5D29 +51FF +5129 +5129 +7D29 +0103 +0000 +0000 +ENDCHAR +STARTCHAR U+8E1B +ENCODING 36379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +44FE +4410 +7C10 +11FF +1044 +1082 +1D11 +5010 +50FE +5010 +5410 +79FF +0000 +0000 +ENDCHAR +STARTCHAR U+8E1C +ENCODING 36380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +44FE +4410 +7DFF +1044 +1084 +1147 +1C7C +50C4 +5028 +5010 +7C28 +00C6 +0000 +0000 +ENDCHAR +STARTCHAR U+8E1D +ENCODING 36381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +22A8 +22A8 +3EF8 +08A8 +28F8 +2E20 +29FC +2870 +2EA8 +3924 +6220 +0020 +0000 +ENDCHAR +STARTCHAR U+8E1E +ENCODING 36382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2508 +2508 +3DF8 +0928 +2920 +2FFC +2920 +29F8 +2E88 +3A88 +64F8 +0888 +0000 +ENDCHAR +STARTCHAR U+8E1F +ENCODING 36383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3D00 +2538 +25E8 +3DA8 +0AA8 +28A8 +2FE8 +28A8 +28A8 +2F68 +3978 +6228 +0400 +0000 +ENDCHAR +STARTCHAR U+8E20 +ENCODING 36384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7C10 +47FF +4601 +4480 +7C8E +10EA +112A +5D2A +50AE +5068 +5049 +5089 +7D0F +0000 +0000 +ENDCHAR +STARTCHAR U+8E21 +ENCODING 36385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C92 +4454 +4438 +45FF +7C10 +11FF +1044 +5082 +517D +5C44 +5044 +5049 +7C41 +003F +0000 +0000 +ENDCHAR +STARTCHAR U+8E22 +ENCODING 36386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7DFC +4508 +4508 +45F8 +7D08 +1108 +11F8 +5C84 +51FE +52A4 +54A4 +5CA4 +F124 +4254 +0088 +ENDCHAR +STARTCHAR U+8E23 +ENCODING 36387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E28 +45FC +4400 +4488 +7C50 +5404 +13FE +5000 +5DFC +5104 +5104 +5D04 +F104 +41FC +0104 +ENDCHAR +STARTCHAR U+8E24 +ENCODING 36388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4400 +4444 +7C44 +10C6 +1129 +1C10 +1010 +51FF +5010 +5010 +7C10 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+8E25 +ENCODING 36389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +45FF +4444 +7C44 +11FF +1040 +1044 +1DFF +5044 +5028 +5010 +7C28 +00C6 +0000 +0000 +ENDCHAR +STARTCHAR U+8E26 +ENCODING 36390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4428 +4444 +7C82 +11FF +1002 +1CFA +508A +508A +50FA +5402 +7802 +000E +0000 +0000 +ENDCHAR +STARTCHAR U+8E27 +ENCODING 36391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7C80 +44EF +4489 +7C89 +13E9 +1089 +1C89 +51C9 +52A9 +5086 +5486 +7889 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+8E29 +ENCODING 36393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041C +7FE0 +4444 +4526 +44A8 +7C00 +1024 +13FE +5C20 +5060 +5070 +50A8 +5D26 +E224 +4020 +0020 +ENDCHAR +STARTCHAR U+8E2A +ENCODING 36394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +23FC +2308 +3E00 +28F8 +0800 +2FFC +2820 +28B0 +28A8 +2D24 +3A24 +6060 +0000 +ENDCHAR +STARTCHAR U+8E2B +ENCODING 36395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +7C84 +4448 +45FE +7C48 +5048 +1048 +124A +5D4A +50CC +5048 +5C48 +F048 +43FE +0000 +0000 +ENDCHAR +STARTCHAR U+8E2C +ENCODING 36396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +040C +7FF0 +4510 +4514 +45FE +7D10 +557C +1144 +5154 +5D54 +5154 +5154 +5E20 +F228 +4446 +0082 +ENDCHAR +STARTCHAR U+8E2E +ENCODING 36398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E10 +45FE +4520 +4524 +7D3E +5520 +1120 +5124 +5DFE +5284 +5284 +5C84 +F484 +48FC +0084 +ENDCHAR +STARTCHAR U+8E2F +ENCODING 36399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7A5E +4A92 +4814 +4FD4 +7918 +5114 +1154 +5FF2 +5912 +511A +5114 +5A90 +F250 +4450 +0010 +ENDCHAR +STARTCHAR U+8E30 +ENCODING 36400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00E0 +3C60 +2490 +2508 +3EF4 +2800 +0BA8 +2EA8 +2BA8 +2AD0 +2BD0 +2EA8 +3AA8 +62A8 +0000 +ENDCHAR +STARTCHAR U+8E31 +ENCODING 36401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E14 +45FE +4548 +4548 +7DFE +5548 +1178 +5100 +5DFC +5104 +5148 +5E30 +F228 +44C6 +0B04 +ENDCHAR +STARTCHAR U+8E33 +ENCODING 36403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7CFE +4410 +44FE +7C10 +55FF +1044 +1082 +5D7D +5044 +547C +5844 +707C +0044 +0000 +0000 +ENDCHAR +STARTCHAR U+8E34 +ENCODING 36404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2250 +2220 +3EF8 +28A8 +08F8 +2EA8 +28F8 +2820 +2BFC +2C44 +3884 +6318 +0000 +ENDCHAR +STARTCHAR U+8E35 +ENCODING 36405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3EE0 +23FC +2220 +3EF8 +08A8 +28F8 +2EA8 +28F8 +2820 +2EF8 +3820 +63FC +0000 +0000 +ENDCHAR +STARTCHAR U+8E36 +ENCODING 36406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007C +7C44 +447C +4444 +7C7C +5400 +11FF +1010 +1010 +5C50 +505E +5450 +58B0 +711F +0000 +0000 +ENDCHAR +STARTCHAR U+8E37 +ENCODING 36407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3C44 +2444 +25FC +2458 +2C7E +3C70 +1860 +3CF8 +3988 +3A88 +38F8 +3C88 +3888 +30F8 +0088 +ENDCHAR +STARTCHAR U+8E38 +ENCODING 36408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7CFE +4444 +447C +7C44 +547C +1044 +11FF +5C94 +5094 +54E7 +5880 +7080 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+8E39 +ENCODING 36409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7C40 +4A48 +4A48 +4BF8 +7800 +57FE +1040 +5884 +57FE +54A4 +54A4 +5CA4 +F4A4 +44A4 +040C +ENDCHAR +STARTCHAR U+8E3A +ENCODING 36410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7810 +4F7C +4914 +49FE +7A14 +577C +1110 +517C +5D10 +55FE +5310 +5D10 +F296 +447C +0800 +ENDCHAR +STARTCHAR U+8E3C +ENCODING 36412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007C +7C44 +447C +4444 +7C7C +5400 +11FF +1040 +5CFF +5149 +5449 +5849 +7091 +000E +0000 +0000 +ENDCHAR +STARTCHAR U+8E3D +ENCODING 36413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000C +7DF0 +4424 +45FE +4524 +7D24 +55FC +1124 +5020 +5FFE +5222 +522A +5EFA +F202 +420A +0204 +ENDCHAR +STARTCHAR U+8E3E +ENCODING 36414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFE +4400 +447C +7C44 +107C +1000 +11FF +5D11 +5111 +51FF +5511 +5911 +71FF +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+8E3F +ENCODING 36415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +7DC4 +4484 +4495 +7C95 +57F5 +108E +1084 +5DC4 +52A4 +5494 +5884 +708A +0091 +0000 +0000 +ENDCHAR +STARTCHAR U+8E40 +ENCODING 36416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +7D48 +47FE +4548 +4548 +7D78 +5500 +11FC +5020 +5C24 +53FE +5070 +5CA8 +F126 +4224 +0020 +ENDCHAR +STARTCHAR U+8E41 +ENCODING 36417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E24 +45FE +4504 +4504 +7DFC +5504 +1100 +51FE +5DAA +52AA +52FE +5CAA +F4AA +48AA +0084 +ENDCHAR +STARTCHAR U+8E42 +ENCODING 36418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2250 +2220 +3FFC +2868 +09A0 +2E60 +2820 +29FC +2870 +2EA8 +3924 +6020 +0000 +ENDCHAR +STARTCHAR U+8E44 +ENCODING 36420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +23FC +2288 +3E50 +29FC +0928 +2FF8 +28A8 +28A8 +28A8 +2EB8 +3820 +6020 +0000 +ENDCHAR +STARTCHAR U+8E45 +ENCODING 36421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +45FF +4454 +7C92 +5511 +1010 +10FE +1082 +5CFE +5082 +54FE +5800 +71FF +0000 +0000 +ENDCHAR +STARTCHAR U+8E47 +ENCODING 36423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2448 +7FF8 +1FF0 +0440 +7FFC +0FE0 +1450 +67CC +0900 +09E0 +1700 +61FC +0000 +ENDCHAR +STARTCHAR U+8E48 +ENCODING 36424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3DF0 +2548 +2524 +3E24 +2840 +09B8 +2F08 +2908 +29B8 +2908 +2F08 +39F8 +6108 +0000 +ENDCHAR +STARTCHAR U+8E49 +ENCODING 36425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3CA0 +27FC +2440 +3DF8 +0840 +2BFC +2C80 +28F8 +28A0 +2F20 +3A20 +67FC +0000 +0000 +ENDCHAR +STARTCHAR U+8E4A +ENCODING 36426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3DF0 +2548 +2524 +3E54 +0990 +2860 +2E50 +29F8 +2840 +2FFC +38A0 +6110 +060C +0000 +ENDCHAR +STARTCHAR U+8E4B +ENCODING 36427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7DFE +4504 +45FC +4504 +7DFC +1000 +13DC +5C44 +5154 +50CC +5154 +5E64 +F044 +4154 +0088 +ENDCHAR +STARTCHAR U+8E4C +ENCODING 36428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +24A0 +25F0 +3E08 +09F4 +2910 +2FF0 +29F0 +2900 +2FF8 +3B08 +65F8 +0108 +0000 +ENDCHAR +STARTCHAR U+8E4D +ENCODING 36429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FE +7C82 +44FE +44A4 +7CFE +54A4 +10A4 +10FF +10A0 +5CB1 +50AA +54A4 +5932 +7221 +0000 +0000 +ENDCHAR +STARTCHAR U+8E4E +ENCODING 36430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4410 +44FE +4482 +7CFE +1082 +10FE +5C82 +50FE +5082 +51FF +5044 +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+8E4F +ENCODING 36431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000C +3C3C +27F0 +273C +277E +2FF6 +3FF8 +3BF0 +3FDE +3BE8 +3BE8 +3BE8 +3FE8 +334E +208E +ENDCHAR +STARTCHAR U+8E50 +ENCODING 36432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3F58 +2440 +2758 +3CA0 +2910 +0BF8 +2F14 +29F0 +2910 +29F0 +2F10 +3910 +6130 +0000 +ENDCHAR +STARTCHAR U+8E51 +ENCODING 36433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +7FFE +4908 +49F8 +4908 +79F8 +5108 +17FE +5008 +5FBE +54A2 +5294 +5908 +F294 +4424 +0842 +ENDCHAR +STARTCHAR U+8E52 +ENCODING 36434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0890 +7C90 +4BFC +4890 +4894 +7FFE +5090 +13FC +5294 +5E94 +5294 +536C +5F2C +F244 +4214 +0208 +ENDCHAR +STARTCHAR U+8E53 +ENCODING 36435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7DCF +4505 +4525 +7D69 +5596 +1000 +10FE +5C92 +5092 +54FE +5892 +7092 +00FE +0000 +0000 +ENDCHAR +STARTCHAR U+8E54 +ENCODING 36436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7FD0 +3FA0 +24BF +3FA4 +24A4 +3FA4 +7FC4 +1FFC +1004 +1FFC +10F8 +2880 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8E55 +ENCODING 36437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2648 +27F8 +3E48 +2BF8 +0950 +2FFC +2950 +2BF8 +2840 +2FFC +3840 +6040 +0000 +ENDCHAR +STARTCHAR U+8E56 +ENCODING 36438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7CFE +4410 +44FE +7C10 +55FF +1044 +1082 +1D21 +50CE +5082 +54EE +5882 +70FE +0000 +0000 +ENDCHAR +STARTCHAR U+8E57 +ENCODING 36439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7CFF +4480 +4494 +7CFF +5495 +10FF +1080 +5CC4 +50F7 +54C4 +5955 +7055 +0077 +0000 +0000 +ENDCHAR +STARTCHAR U+8E59 +ENCODING 36441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +1FFC +1248 +13A8 +1FF0 +1730 +1AD4 +220C +4FE4 +0820 +0FE0 +09F0 +1700 +21F8 +0000 +ENDCHAR +STARTCHAR U+8E5A +ENCODING 36442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C92 +4454 +45FF +7D01 +557D +1044 +107C +5C10 +5010 +50FE +5410 +5810 +71FF +0000 +0000 +ENDCHAR +STARTCHAR U+8E5B +ENCODING 36443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00AA +7DFF +44AA +44AA +7D3B +5400 +11FF +1111 +5CFE +5092 +5092 +5492 +5896 +7010 +0000 +0000 +ENDCHAR +STARTCHAR U+8E5C +ENCODING 36444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4501 +4440 +7CBF +5508 +129F +1091 +1C91 +509F +5091 +5491 +589F +7091 +0000 +0000 +ENDCHAR +STARTCHAR U+8E5D +ENCODING 36445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7C84 +4517 +4454 +7C94 +55BF +1284 +1094 +5C97 +5094 +5094 +5494 +5894 +70AF +0000 +0000 +ENDCHAR +STARTCHAR U+8E5E +ENCODING 36446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +003F +7D04 +451E +4512 +7D12 +551E +11D2 +1112 +1D1E +5152 +5152 +55DE +5812 +7021 +0000 +0000 +ENDCHAR +STARTCHAR U+8E5F +ENCODING 36447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3DFC +2420 +24F8 +3C20 +2BFC +08F8 +2E88 +28F8 +28F8 +2888 +2EF8 +38C8 +6304 +0000 +ENDCHAR +STARTCHAR U+8E60 +ENCODING 36448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +25FC +2550 +3D50 +09FC +2950 +2D50 +2970 +2950 +2E00 +3BA8 +6554 +0A54 +0000 +ENDCHAR +STARTCHAR U+8E61 +ENCODING 36449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +004F +7D49 +4555 +454A +7D44 +55D8 +1042 +105F +1DC2 +5152 +514A +5542 +5942 +7246 +0000 +0000 +ENDCHAR +STARTCHAR U+8E62 +ENCODING 36450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7CFE +4444 +4428 +7DFF +5511 +117D +1111 +5D7D +5145 +5145 +557D +5903 +7101 +0000 +0000 +ENDCHAR +STARTCHAR U+8E63 +ENCODING 36451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3CA0 +27FC +24A0 +3CE0 +2840 +0BF8 +2E48 +2BF8 +2AD8 +2AD8 +2F68 +3A48 +6258 +0000 +ENDCHAR +STARTCHAR U+8E64 +ENCODING 36452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A8 +3CA8 +2528 +2654 +3CD4 +0890 +2910 +2F50 +2B5C +2950 +2950 +2FB0 +3990 +610C +0000 +ENDCHAR +STARTCHAR U+8E65 +ENCODING 36453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +7C9F +4444 +441F +7DD5 +5455 +109F +1115 +5C95 +505F +5044 +549F +5984 +727F +0000 +0000 +ENDCHAR +STARTCHAR U+8E66 +ENCODING 36454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7A44 +4A44 +4BFC +4804 +7BBE +12A4 +12A4 +13BC +5AA4 +52A4 +53BC +5AA4 +E2A4 +44A4 +09CC +ENDCHAR +STARTCHAR U+8E67 +ENCODING 36455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +7DFE +4448 +45FE +7D4A +55FE +114A +11FE +1C00 +50FC +5084 +54FC +5884 +70FC +0000 +0000 +ENDCHAR +STARTCHAR U+8E69 +ENCODING 36457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4920 +2A24 +7F3E +4944 +5DA8 +6B10 +496E +1FF0 +1010 +1010 +1FF0 +0900 +09F8 +0D00 +3306 +C0FC +ENDCHAR +STARTCHAR U+8E6A +ENCODING 36458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7CFE +4492 +44FE +7C10 +55FF +10FE +1082 +5CFE +50FE +5482 +58FE +7082 +0101 +0000 +0000 +ENDCHAR +STARTCHAR U+8E6C +ENCODING 36460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7FA8 +48B0 +4AA4 +4918 +4910 +7BF8 +1406 +13F8 +5A08 +5208 +53F8 +5D10 +E0A4 +4FFE +0000 +ENDCHAR +STARTCHAR U+8E6D +ENCODING 36461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +0850 +7C00 +4BFE +4A22 +4AAA +7A72 +1222 +53FE +5C04 +51FE +5104 +5DFC +F104 +41FC +0104 +ENDCHAR +STARTCHAR U+8E6F +ENCODING 36463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041C +7FE0 +4524 +44A8 +47FE +7C70 +54AE +1324 +51FE +5D24 +5124 +51FC +5D24 +F124 +41FC +0104 +ENDCHAR +STARTCHAR U+8E70 +ENCODING 36464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +7FFE +4A00 +4BF4 +4A04 +7AE4 +52BE +12A4 +52B4 +5AEC +520C +52A4 +5CA4 +F5F4 +4814 +0008 +ENDCHAR +STARTCHAR U+8E71 +ENCODING 36465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +45FF +4444 +4444 +7DFF +1000 +10FE +5092 +5CFE +5092 +50FE +5010 +5CFE +6010 +01FF +ENDCHAR +STARTCHAR U+8E72 +ENCODING 36466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00F0 +3C90 +25F8 +2664 +3DF8 +2978 +0998 +2FF8 +29F8 +2810 +2BFC +2C90 +3850 +6030 +0000 +ENDCHAR +STARTCHAR U+8E73 +ENCODING 36467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01F2 +7C2D +45C6 +4482 +7D01 +56EE +102A +11EA +5D13 +51EE +542A +5824 +702A +01D1 +0000 +0000 +ENDCHAR +STARTCHAR U+8E74 +ENCODING 36468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3D18 +27D4 +2414 +3F90 +0AFC +2A90 +2F90 +2930 +2BB0 +2B70 +3D54 +6194 +030C +0000 +ENDCHAR +STARTCHAR U+8E76 +ENCODING 36470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2730 +26B0 +3ED0 +0BFC +2AB4 +2FF8 +2BD0 +2BD0 +2F98 +3CA8 +6524 +0A44 +0000 +ENDCHAR +STARTCHAR U+8E78 +ENCODING 36472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0092 +7C54 +4438 +45FF +7C54 +5492 +1111 +1042 +5CEF +512A +54DF +5882 +7102 +0002 +0000 +0000 +ENDCHAR +STARTCHAR U+8E79 +ENCODING 36473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3C70 +24D8 +25FE +2C06 +3CFC +188C +30FC +3C4C +3046 +31DE +3046 +3B7E +7246 +00C6 +0004 +ENDCHAR +STARTCHAR U+8E7A +ENCODING 36474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7CFE +4410 +45FF +7C44 +11FF +1044 +5DFF +5000 +51FF +5048 +5C49 +7049 +0387 +0000 +0000 +ENDCHAR +STARTCHAR U+8E7B +ENCODING 36475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7CFC +4410 +45FF +7C44 +54BA +1129 +1038 +5C00 +50FE +50BA +54AA +58BA +7086 +0000 +0000 +ENDCHAR +STARTCHAR U+8E7C +ENCODING 36476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3EA8 +25B0 +27FC +3D10 +08A0 +2BF8 +2C40 +29F0 +2840 +2FFC +38A0 +6110 +060C +0000 +ENDCHAR +STARTCHAR U+8E7F +ENCODING 36479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7820 +4BFE +4A8A +4D24 +7820 +11FC +1124 +5DFC +5020 +53FE +5222 +5FFE +E222 +4020 +0020 +ENDCHAR +STARTCHAR U+8E81 +ENCODING 36481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +22F8 +3E00 +09DC +2954 +2FDC +2820 +29FC +2E70 +38A8 +6324 +0020 +0000 +ENDCHAR +STARTCHAR U+8E82 +ENCODING 36482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7C7F +4508 +457F +7D22 +5414 +13FF +1088 +1D7F +5088 +50FF +5088 +5D48 +723F +0000 +0000 +ENDCHAR +STARTCHAR U+8E83 +ENCODING 36483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7948 +4B48 +4B7E +4B54 +6BD4 +7B1A +733E +7FC8 +7348 +735E +7348 +7FC8 +7548 +4008 +0008 +ENDCHAR +STARTCHAR U+8E84 +ENCODING 36484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EF8 +2250 +3FFC +3E20 +32F8 +5E20 +1FE0 +0820 +0FE0 +0900 +09F0 +1700 +21F8 +0000 +ENDCHAR +STARTCHAR U+8E85 +ENCODING 36485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2568 +25F8 +3C80 +09FC +2944 +2FF4 +2954 +29F4 +2E54 +387C +638C +0018 +0000 +ENDCHAR +STARTCHAR U+8E86 +ENCODING 36486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +003C +7C20 +45FF +4521 +7DFE +5520 +1138 +11FE +5D30 +5159 +51AE +5556 +5965 +7218 +0000 +0000 +ENDCHAR +STARTCHAR U+8E87 +ENCODING 36487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3FFC +2490 +2448 +3DF8 +2850 +0BFC +2E50 +28F8 +2B88 +28F8 +2E88 +38F8 +6088 +0000 +ENDCHAR +STARTCHAR U+8E88 +ENCODING 36488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +7DEF +4722 +45E2 +7D22 +55EA +104A +11FA +5C8A +50EA +50AA +54A6 +5926 +7049 +0000 +0000 +ENDCHAR +STARTCHAR U+8E89 +ENCODING 36489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +1FFC +1FFC +1084 +1FFC +3FFE +208A +27FA +2FFE +0808 +0FF8 +08F0 +17FE +0000 +0000 +ENDCHAR +STARTCHAR U+8E8A +ENCODING 36490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3FFC +2440 +25F0 +3FFC +29E8 +0840 +2FF0 +2BFC +2808 +2BFC +2EC8 +3BA8 +6218 +0000 +ENDCHAR +STARTCHAR U+8E8B +ENCODING 36491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3FFC +24A8 +27F0 +3EE8 +0BF8 +2C64 +2F10 +29F0 +2910 +2FF0 +3910 +6210 +0410 +0000 +ENDCHAR +STARTCHAR U+8E8C +ENCODING 36492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7DFF +46AA +45FF +44AA +7CAA +55FF +1042 +10EF +5D2A +50EA +545F +5882 +7102 +0000 +0000 +ENDCHAR +STARTCHAR U+8E8D +ENCODING 36493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2448 +27F8 +3C48 +2BF8 +0890 +2DFC +2B20 +29F8 +2920 +2FF8 +3920 +61FC +0000 +ENDCHAR +STARTCHAR U+8E8E +ENCODING 36494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4454 +4492 +45FF +7D11 +11BB +1155 +5DBB +5111 +51BB +5155 +51BB +7D11 +0111 +0000 +0000 +ENDCHAR +STARTCHAR U+8E8F +ENCODING 36495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +FFFE +9110 +9404 +92FE +F544 +A5F4 +2544 +A5F4 +BD44 +A5F4 +A544 +BDFC +E504 +8414 +0408 +ENDCHAR +STARTCHAR U+8E90 +ENCODING 36496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0924 +7D24 +4A48 +4924 +4BFE +7A94 +5264 +1294 +53FC +5E48 +5368 +5248 +5F68 +F24A +436A +0246 +ENDCHAR +STARTCHAR U+8E91 +ENCODING 36497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +7A78 +4FE8 +49A8 +7FF0 +15F0 +56E8 +5FE8 +57E4 +5124 +5FE4 +72B8 +4460 +0820 +0000 +ENDCHAR +STARTCHAR U+8E92 +ENCODING 36498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0092 +7CBA +452C +45EF +44BA +7D6D +11EF +1038 +5C10 +51FF +5038 +5054 +5092 +7D11 +0000 +0000 +ENDCHAR +STARTCHAR U+8E93 +ENCODING 36499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +3DB0 +2520 +25FC +3D68 +2A48 +09F0 +2F10 +29F0 +29F0 +2F10 +39F0 +6190 +0608 +0000 +ENDCHAR +STARTCHAR U+8E94 +ENCODING 36500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FFC +26F8 +26A8 +3EF8 +0AA8 +2AF8 +2EF8 +2BFC +2AAC +2FFC +3C20 +6BFC +0000 +0000 +ENDCHAR +STARTCHAR U+8E95 +ENCODING 36501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +3DFF +2520 +25FA +3D72 +290F +0972 +295A +2D56 +2976 +2E52 +7AFA +240A +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+8E96 +ENCODING 36502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C85 +452B +45DD +44AB +7DFF +1001 +11FF +5C89 +5133 +51DD +50AB +51FF +5001 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+8E97 +ENCODING 36503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +13EF +2FF0 +53E0 +322F +53E2 +17E2 +17F2 +1086 +07F0 +0410 +17F0 +28F8 +47FE +0000 +0000 +ENDCHAR +STARTCHAR U+8E98 +ENCODING 36504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +7FEE +4548 +47EE +4402 +7DEE +1128 +112E +5DE8 +512E +5128 +51EE +5129 +7D6F +0000 +0000 +ENDCHAR +STARTCHAR U+8E99 +ENCODING 36505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FB8 +26A8 +27B8 +3EA8 +2BB8 +0A68 +2EF8 +2BA8 +2AF8 +2AF8 +2EA8 +3AF8 +6218 +0000 +ENDCHAR +STARTCHAR U+8E9A +ENCODING 36506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007F +7C14 +457F +4555 +447F +7C08 +13FF +10A2 +5D5F +5212 +5116 +5110 +511F +7EFF +0000 +0000 +ENDCHAR +STARTCHAR U+8E9B +ENCODING 36507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +09C0 +1FE2 +1FFE +33C4 +1FF4 +17E4 +17EC +0FF0 +0810 +0FF0 +0D80 +0DF8 +1F80 +31FC +0000 +ENDCHAR +STARTCHAR U+8E9C +ENCODING 36508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +F528 +97BC +9948 +97BE +F318 +A5AA +294E +A3F8 +BA0C +A248 +A248 +BA48 +E0B0 +810C +0604 +ENDCHAR +STARTCHAR U+8E9D +ENCODING 36509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DEF +4529 +45EF +4529 +45EF +7D11 +11FF +1111 +5DFF +51BB +51FF +5155 +5193 +7D11 +0000 +0000 +ENDCHAR +STARTCHAR U+8E9E +ENCODING 36510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +FFFE +9000 +95F4 +9404 +F7F6 +AC0C +25F4 +AB1A +B1F2 +A000 +A3F8 +B910 +E0E0 +8310 +0C0E +ENDCHAR +STARTCHAR U+8E9F +ENCODING 36511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +45EF +4529 +45EF +7C44 +11FF +1044 +5DFF +5044 +51FF +518A +5084 +7DCB +0000 +0000 +ENDCHAR +STARTCHAR U+8EA0 +ENCODING 36512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F7F +3F10 +217C +3F28 +3FFF +51FE +1F10 +07F0 +0410 +07F0 +10FC +2880 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8EA1 +ENCODING 36513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2490 +24F0 +3CF0 +09F0 +2810 +2FFC +2AA8 +2BB8 +2FB8 +3BB8 +66E8 +0088 +0000 +ENDCHAR +STARTCHAR U+8EA2 +ENCODING 36514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +7D29 +45EF +4529 +45EF +7D01 +117D +1145 +517D +5D01 +51FD +516D +51B5 +5D6D +61B5 +016D +ENDCHAR +STARTCHAR U+8EA3 +ENCODING 36515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DEF +4529 +45EF +45EF +7D29 +11EF +1048 +5CFF +5188 +50FF +5088 +50FF +5088 +7CFF +0000 +0000 +ENDCHAR +STARTCHAR U+8EA4 +ENCODING 36516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7DFF +4444 +4400 +7C4A +55FF +104A +11FF +5C40 +51FF +5049 +54EF +5959 +704F +0000 +0000 +ENDCHAR +STARTCHAR U+8EA5 +ENCODING 36517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4545 +4446 +4482 +7CEE +1082 +10FE +5D24 +51B4 +5124 +51B5 +5123 +7DB9 +0000 +0000 +ENDCHAR +STARTCHAR U+8EA6 +ENCODING 36518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7A94 +4BDE +4CA4 +4BDF +798C +52D5 +14A7 +51FC +5DF4 +51F4 +5D04 +71FC +4086 +0302 +0000 +0000 +ENDCHAR +STARTCHAR U+8EA7 +ENCODING 36519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +1754 +17F4 +17FC +1420 +1DFC +0950 +1FFC +195C +39F8 +39F4 +3DF0 +3AD0 +229C +0000 +ENDCHAR +STARTCHAR U+8EA8 +ENCODING 36520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7850 +4BFE +4820 +4977 +4955 +7DF7 +1574 +1555 +5FF7 +5108 +52FC +5150 +5220 +79DE +0000 +0000 +ENDCHAR +STARTCHAR U+8EA9 +ENCODING 36521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DEF +4529 +45EF +45EF +7D29 +11EF +1084 +5CFE +51BC +508E +5084 +50FE +5038 +7DEF +0000 +0000 +ENDCHAR +STARTCHAR U+8EAA +ENCODING 36522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +3FFC +24A0 +27B8 +3EA8 +2BB8 +0BB8 +2E68 +2AF8 +2BF8 +2AF8 +2EA8 +3AF8 +6218 +0000 +ENDCHAR +STARTCHAR U+8EAB +ENCODING 36523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +0FE0 +0820 +0FE0 +0824 +0FE8 +0830 +0FE0 +7860 +01A0 +0620 +3820 +0060 +0000 +ENDCHAR +STARTCHAR U+8EAC +ENCODING 36524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +11F0 +3C10 +2410 +3DF0 +2510 +3D00 +27F8 +7D08 +0D08 +1408 +6408 +0410 +0C60 +0000 +ENDCHAR +STARTCHAR U+8EAD +ENCODING 36525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +1820 +3E22 +37FF +3F26 +3724 +3E30 +3670 +3E70 +7E70 +0E70 +16F0 +26B2 +473E +041E +ENDCHAR +STARTCHAR U+8EAE +ENCODING 36526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0878 +1008 +3C04 +2444 +2442 +3C82 +2501 +3CFE +2422 +2C22 +3522 +6622 +0C42 +1442 +2482 +4D0C +ENDCHAR +STARTCHAR U+8EAF +ENCODING 36527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +10FC +3E80 +2288 +3E88 +22C8 +3EB0 +2390 +3E90 +66A8 +0AC8 +1280 +62FC +0680 +0000 +ENDCHAR +STARTCHAR U+8EB0 +ENCODING 36528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +1040 +3C40 +27FC +3CE0 +24E0 +3D50 +2750 +7E48 +0DF4 +1440 +6440 +0440 +0C40 +0000 +ENDCHAR +STARTCHAR U+8EB1 +ENCODING 36529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +11E0 +3CA0 +24B8 +3CA8 +2508 +3E70 +2640 +7FFC +0CE0 +1550 +664C +0440 +0C40 +0000 +ENDCHAR +STARTCHAR U+8EB2 +ENCODING 36530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +10FC +3C88 +2488 +3C88 +2488 +3D26 +2424 +FFFE +1460 +1470 +24B0 +24A8 +4526 +9624 +0820 +ENDCHAR +STARTCHAR U+8EB3 +ENCODING 36531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0CFE +1EC6 +12C6 +1EC6 +12FE +1EB4 +12A2 +16FE +3E86 +0E86 +1AFE +06FE +0282 +0000 +ENDCHAR +STARTCHAR U+8EB5 +ENCODING 36533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +10FE +3C12 +2512 +2492 +3CA2 +2422 +3C4C +2480 +2410 +2E08 +7428 +0CA2 +14A1 +24A5 +4D1C +ENDCHAR +STARTCHAR U+8EBA +ENCODING 36538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +2248 +7948 +4950 +4844 +7BFE +4A04 +7A04 +4AF4 +4A94 +FA94 +2A94 +4AF4 +8A84 +2A14 +1208 +ENDCHAR +STARTCHAR U+8EBB +ENCODING 36539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1010 +3C10 +25FF +2501 +3D29 +2428 +3C29 +2447 +2C80 +3400 +66FE +0C10 +1410 +2410 +4DFF +ENDCHAR +STARTCHAR U+8EBD +ENCODING 36541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +3D00 +657E +3D42 +257E +3D42 +257E +7D24 +0DFF +1524 +2518 +4566 +0500 +0DFF +0000 +0000 +ENDCHAR +STARTCHAR U+8EBE +ENCODING 36542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0910 +10A0 +3FF8 +2440 +3DF0 +2440 +3FFC +2640 +7C40 +0FFC +1440 +64A0 +0510 +0E0C +0000 +ENDCHAR +STARTCHAR U+8EC0 +ENCODING 36544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +11FF +3D00 +2500 +257E +3D42 +257E +2500 +3D7E +255A +275A +3D5A +657E +0500 +05FF +0D00 +ENDCHAR +STARTCHAR U+8EC1 +ENCODING 36545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +10FE +3C92 +25FF +2492 +3CFE +2410 +3CFE +2492 +2CFE +3420 +66FF +0C44 +1448 +2430 +4DCE +ENDCHAR +STARTCHAR U+8EC2 +ENCODING 36546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +3EB5 +65CE +3C84 +254A +3E31 +2400 +27FF +7E21 +0CFC +1424 +2424 +4444 +1898 +0000 +0000 +ENDCHAR +STARTCHAR U+8EC3 +ENCODING 36547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C00 +08FE +1BBA +12BE +1EBE +12FC +12B6 +12FC +12B4 +3EFC +2EB0 +0BFE +1230 +0630 +0400 +0000 +ENDCHAR +STARTCHAR U+8EC4 +ENCODING 36548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1810 +3D9C +2FF4 +2F54 +2DD6 +2C10 +2FF6 +3E5E +3FDC +1E58 +177E +2F66 +0E46 +0000 +ENDCHAR +STARTCHAR U+8EC5 +ENCODING 36549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +13FC +3AA8 +2AA8 +3AB0 +2B7C +3BD0 +2F78 +7B50 +1B78 +2D50 +4D50 +097C +1940 +0000 +ENDCHAR +STARTCHAR U+8EC6 +ENCODING 36550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A0 +13F8 +3EA8 +27F8 +3EA8 +27F8 +3C00 +27FC +7DF0 +0D10 +15F0 +64A0 +07FC +0C00 +0000 +ENDCHAR +STARTCHAR U+8EC7 +ENCODING 36551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +11FF +3C10 +24FE +2400 +3DFF +2401 +3C7C +2410 +2CFE +3400 +66FF +0C02 +15DF +2562 +4DD6 +ENDCHAR +STARTCHAR U+8EC8 +ENCODING 36552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +13FC +3AA8 +2AFC +3BD0 +2B78 +3B78 +2F50 +7B7C +1A40 +2DA8 +4DA4 +0A94 +1870 +0000 +ENDCHAR +STARTCHAR U+8EC9 +ENCODING 36553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3DFF +6511 +3DFF +2444 +3DFF +2455 +25FF +7C7C +0C44 +147C +247C +447C +0C82 +0000 +0000 +ENDCHAR +STARTCHAR U+8ECA +ENCODING 36554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8ECB +ENCODING 36555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0840 +3E40 +2A40 +3E40 +2A40 +3E40 +0840 +7F40 +0844 +0844 +083C +0000 +ENDCHAR +STARTCHAR U+8ECC +ENCODING 36556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0870 +3FD0 +2A50 +3E50 +2A50 +3E50 +0850 +7F90 +0894 +0914 +0A0C +0000 +ENDCHAR +STARTCHAR U+8ECD +ENCODING 36557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2108 +7FF8 +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +7FFC +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8ECE +ENCODING 36558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFC +0100 +3FF8 +2108 +3FF8 +2108 +3FF8 +0100 +FFFE +0110 +1FF8 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+8ECF +ENCODING 36559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +7F7F +0824 +7F24 +4924 +7F24 +4924 +7F24 +0824 +7F24 +0825 +0825 +08C7 +0000 +0000 +ENDCHAR +STARTCHAR U+8ED1 +ENCODING 36561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F08 +0808 +7F7F +4908 +7F08 +4908 +7F08 +0808 +7F08 +0814 +0822 +0841 +0881 +0000 +0000 +ENDCHAR +STARTCHAR U+8ED2 +ENCODING 36562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7F20 +0820 +3E20 +2A20 +3FFC +2A20 +3E20 +0820 +7F20 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+8ED3 +ENCODING 36563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087C +7F44 +0844 +7F44 +4944 +7F64 +4954 +7F44 +0844 +7F44 +0845 +0885 +0907 +0000 +0000 +ENDCHAR +STARTCHAR U+8ED4 +ENCODING 36564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +7F7F +0811 +7F11 +4951 +7F31 +4911 +7F11 +0811 +7F11 +0821 +0842 +088C +0000 +0000 +ENDCHAR +STARTCHAR U+8ED7 +ENCODING 36567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083C +0824 +7F24 +0825 +7F47 +4900 +7F3E +4922 +7F22 +0822 +7F14 +0808 +0814 +0863 +0000 +0000 +ENDCHAR +STARTCHAR U+8ED8 +ENCODING 36568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +7F08 +087F +7F08 +4949 +7F49 +4949 +7F49 +087F +7F08 +0808 +0809 +080F +0000 +0000 +ENDCHAR +STARTCHAR U+8EDB +ENCODING 36571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08FC +7F80 +0880 +3EF8 +2AC8 +3EC8 +2AC8 +3ED8 +08C0 +7F40 +0944 +0A44 +0C3C +0000 +ENDCHAR +STARTCHAR U+8EDC +ENCODING 36572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +7F08 +0808 +7F7F +4949 +7F49 +4955 +7F63 +0841 +7F41 +0841 +0845 +0842 +0000 +0000 +ENDCHAR +STARTCHAR U+8EDD +ENCODING 36573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +11FE +7C88 +1088 +7C88 +5488 +7CFF +5488 +7C88 +5488 +10A8 +7CC5 +1083 +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+8EDE +ENCODING 36574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +080C +7F70 +0810 +7F10 +497E +7F10 +4910 +7F7E +0810 +7F10 +0810 +0811 +081F +0000 +0000 +ENDCHAR +STARTCHAR U+8EDF +ENCODING 36575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F40 +0840 +3EFC +2AA8 +3F30 +2A20 +3E20 +0860 +7F50 +0890 +0908 +0A04 +0000 +ENDCHAR +STARTCHAR U+8EE0 +ENCODING 36576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0803 +080C +7F78 +0808 +7F08 +4908 +7F08 +497F +7F08 +0808 +7F08 +0808 +0808 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+8EE1 +ENCODING 36577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1028 +7C44 +1082 +7D01 +547C +7C00 +5400 +7CFE +1002 +7C04 +1008 +1010 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+8EE2 +ENCODING 36578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7F00 +0800 +3E00 +2BFC +3E20 +2A20 +3E20 +0850 +7F48 +0878 +09C4 +0804 +0000 +ENDCHAR +STARTCHAR U+8EE3 +ENCODING 36579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0FE0 +0920 +0FE0 +0920 +0FE0 +7FFC +0100 +3118 +0C60 +06C0 +1830 +600C +0000 +ENDCHAR +STARTCHAR U+8EE5 +ENCODING 36581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +7F3F +0821 +7F41 +4901 +7F3D +4925 +7F25 +083D +7F01 +0801 +0801 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+8EE6 +ENCODING 36582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087E +7F42 +0842 +7F42 +4942 +7F7E +4924 +7F24 +0824 +7F24 +0845 +0885 +0907 +0000 +0000 +ENDCHAR +STARTCHAR U+8EE7 +ENCODING 36583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +08FE +7F48 +0848 +7F48 +4948 +7F7F +4948 +7F48 +0848 +7F48 +0845 +0843 +08ED +0000 +0000 +ENDCHAR +STARTCHAR U+8EE8 +ENCODING 36584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0814 +7F22 +0841 +7F1E +4900 +7F00 +493F +7F01 +0801 +7F02 +0814 +0808 +0804 +0000 +0000 +ENDCHAR +STARTCHAR U+8EE9 +ENCODING 36585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0808 +7F08 +0810 +7F21 +497F +7F01 +4900 +7F7F +0841 +7F41 +0841 +087F +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+8EEB +ENCODING 36587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F50 +0850 +3E88 +2B24 +3EC0 +2A10 +3E20 +08C4 +7E08 +0810 +0860 +0980 +0000 +ENDCHAR +STARTCHAR U+8EEC +ENCODING 36588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +1FFC +0100 +7FFF +0490 +0FF8 +7087 +0FF8 +0FE8 +0888 +0FF8 +0080 +1FFC +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8EED +ENCODING 36589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +08FF +0880 +7F80 +08BE +3E88 +2A88 +3E88 +2ABE +3E88 +0888 +7F88 +08BE +0880 +08FF +0880 +ENDCHAR +STARTCHAR U+8EEE +ENCODING 36590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +7F08 +083E +7F2A +492A +7F2A +492A +7F7F +0808 +7F08 +0814 +0822 +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+8EEF +ENCODING 36591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F08 +0849 +7F49 +492A +7F08 +497F +7F08 +0808 +7F08 +0808 +0808 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+8EF0 +ENCODING 36592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +06DC +1EF0 +06C4 +1EFC +19FC +1FF8 +0FF0 +0990 +0FF0 +0FF0 +3FFC +1FFC +0180 +0000 +ENDCHAR +STARTCHAR U+8EF1 +ENCODING 36593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +08FE +7F40 +0842 +7F42 +4952 +7F52 +4952 +7F52 +0852 +7F56 +0856 +0899 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+8EF4 +ENCODING 36596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1010 +7C00 +10FE +7C10 +5410 +7C10 +54FE +7C10 +1010 +7C10 +1010 +11FF +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+8EF5 +ENCODING 36597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +7C84 +1104 +7CBF +5484 +7C84 +54A4 +7C94 +1084 +7C84 +1084 +1094 +1088 +0000 +0000 +ENDCHAR +STARTCHAR U+8EF6 +ENCODING 36598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +10FE +7C80 +10FE +7C82 +54FE +7C80 +54BE +7C84 +1088 +7C90 +1121 +1221 +103F +0000 +0000 +ENDCHAR +STARTCHAR U+8EF7 +ENCODING 36599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0812 +0811 +7FFF +0810 +7F10 +4922 +7F42 +4982 +7F22 +0814 +7F08 +0814 +0822 +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+8EF8 +ENCODING 36600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F20 +0820 +3EF8 +2AA8 +3EA8 +2AA8 +3EF8 +08A8 +7FA8 +08A8 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+8EF9 +ENCODING 36601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +7F7F +0841 +7F41 +4941 +7F41 +497F +7F00 +0814 +7F14 +0822 +0841 +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+8EFA +ENCODING 36602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F11 +0811 +7F11 +4922 +7F00 +497F +7F41 +0841 +7F41 +0841 +087F +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+8EFB +ENCODING 36603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7F08 +0808 +3EE8 +2AA8 +3EA8 +2AA8 +3EE8 +08A8 +7F08 +0808 +0808 +0818 +0000 +ENDCHAR +STARTCHAR U+8EFC +ENCODING 36604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A0 +7FA0 +08A0 +3EF8 +2AA0 +3F20 +2BFC +3E20 +0860 +7F50 +0890 +0908 +0A04 +0000 +ENDCHAR +STARTCHAR U+8EFD +ENCODING 36605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +7E88 +0850 +3E20 +2AF0 +3F2C +2A20 +3EF8 +0820 +7F20 +0820 +09FC +0800 +0000 +ENDCHAR +STARTCHAR U+8EFE +ENCODING 36606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0828 +0824 +7F24 +09FC +3E20 +2A20 +3FE0 +2AA0 +3E90 +0890 +7EB4 +08CC +0B0C +0804 +0000 +ENDCHAR +STARTCHAR U+8EFF +ENCODING 36607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1044 +7C44 +1028 +7CFE +5444 +7C44 +5444 +7DFF +1044 +7C44 +1044 +1084 +1104 +0000 +0000 +ENDCHAR +STARTCHAR U+8F00 +ENCODING 36608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0802 +7F7F +0808 +7F10 +4920 +7F7F +4955 +7F55 +0855 +7F55 +0855 +0855 +0843 +0000 +0000 +ENDCHAR +STARTCHAR U+8F01 +ENCODING 36609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +0824 +7F24 +087E +7F24 +4924 +7F24 +4924 +7F24 +08FF +7F00 +0824 +0842 +0881 +0000 +0000 +ENDCHAR +STARTCHAR U+8F02 +ENCODING 36610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1FFC +0410 +7FFF +0888 +17F4 +2082 +4FF9 +0FE8 +0888 +0FF8 +0080 +3FFE +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8F03 +ENCODING 36611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F20 +09FC +3E50 +2A88 +3F94 +2A90 +3E50 +0860 +7F20 +0850 +0888 +0904 +0000 +ENDCHAR +STARTCHAR U+8F05 +ENCODING 36613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F78 +0888 +3ED0 +2B20 +3E50 +2A88 +3FFC +0888 +7F88 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+8F06 +ENCODING 36614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1010 +7DFF +1020 +7C44 +5488 +7D90 +5464 +7C48 +1190 +7C28 +1044 +1082 +1301 +0000 +0000 +ENDCHAR +STARTCHAR U+8F07 +ENCODING 36615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0814 +7F22 +0841 +7F3E +4908 +7F08 +4908 +7F3E +0808 +7F08 +0808 +087F +0800 +0000 +0000 +ENDCHAR +STARTCHAR U+8F08 +ENCODING 36616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +7F7E +08A2 +7F32 +492A +7F22 +497F +7F32 +082A +7F22 +0822 +082A +0844 +0000 +0000 +ENDCHAR +STARTCHAR U+8F09 +ENCODING 36617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1F50 +0448 +7FFC +0440 +7FC8 +1F48 +1548 +1F50 +1530 +1F24 +7FD4 +048C +0404 +0000 +ENDCHAR +STARTCHAR U+8F0A +ENCODING 36618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7F20 +0830 +3E48 +2BF4 +3E24 +2A20 +3EF8 +0820 +7F20 +0820 +09FC +0800 +0000 +ENDCHAR +STARTCHAR U+8F0B +ENCODING 36619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2082 +3FFE +0080 +7FFF +0490 +0FF8 +7087 +0FF8 +0FE8 +0888 +0FF8 +0080 +3FFE +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8F0C +ENCODING 36620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +7C40 +1040 +7FF8 +5648 +7F58 +5758 +7F58 +13F8 +7F18 +1208 +1208 +1218 +0000 +ENDCHAR +STARTCHAR U+8F0D +ENCODING 36621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0824 +7F42 +0881 +7F18 +4924 +7F42 +4981 +7F7E +0842 +7F42 +0842 +087E +0842 +0000 +0000 +ENDCHAR +STARTCHAR U+8F0E +ENCODING 36622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0849 +7F2A +0808 +7F7F +4941 +7F41 +497F +7F41 +0841 +7F7F +0841 +0841 +0883 +0000 +0000 +ENDCHAR +STARTCHAR U+8F0F +ENCODING 36623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +08FF +7F28 +0828 +3E28 +2AFF +2AA9 +3EA9 +2AAB +2ACF +3E81 +08BD +7F81 +0881 +08FF +0881 +ENDCHAR +STARTCHAR U+8F10 +ENCODING 36624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +7DFF +1101 +7C00 +54FE +7C00 +5400 +7DFF +1048 +7C48 +1048 +1089 +110F +0000 +0000 +ENDCHAR +STARTCHAR U+8F11 +ENCODING 36625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087E +7F12 +0812 +7FFF +4912 +7F12 +497E +7F20 +08FF +7F41 +0841 +0841 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+8F12 +ENCODING 36626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +7F50 +0950 +3DD0 +2D50 +3D50 +2DD0 +3D50 +0950 +7FD4 +0B54 +0854 +084C +0000 +ENDCHAR +STARTCHAR U+8F13 +ENCODING 36627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0878 +7F90 +0920 +3EF8 +2AA8 +3EA8 +2AA8 +3EF8 +0850 +7F50 +0894 +0914 +0A0C +0000 +ENDCHAR +STARTCHAR U+8F14 +ENCODING 36628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0828 +0824 +7FFC +0820 +3EF8 +2AA8 +3EA8 +2AF8 +3EA8 +08A8 +7FF8 +08A8 +08A8 +08B8 +0000 +ENDCHAR +STARTCHAR U+8F15 +ENCODING 36629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7FA8 +08A8 +3F50 +2AA8 +3EA8 +2A00 +3EF8 +0820 +7F20 +0820 +09FC +0800 +0000 +ENDCHAR +STARTCHAR U+8F16 +ENCODING 36630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1111 +7D7D +1111 +7D7D +5501 +7D7D +5545 +7D45 +117D +7D45 +1101 +1101 +1203 +0000 +0000 +ENDCHAR +STARTCHAR U+8F17 +ENCODING 36631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1046 +7C82 +1182 +7CEE +5482 +7C82 +54FE +7C48 +1048 +7C48 +1089 +1109 +120F +0000 +0000 +ENDCHAR +STARTCHAR U+8F18 +ENCODING 36632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +7CFE +1010 +7DFF +5444 +7C84 +5547 +7CFC +1144 +7C28 +1010 +1028 +11C7 +0000 +0000 +ENDCHAR +STARTCHAR U+8F19 +ENCODING 36633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0BFC +7F40 +0940 +3FF8 +2B68 +3F68 +2BE8 +3F50 +0950 +7FD8 +0B68 +0844 +0840 +0000 +ENDCHAR +STARTCHAR U+8F1A +ENCODING 36634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0814 +087F +7F14 +0809 +7F75 +4903 +7F00 +4914 +7F7F +0812 +7F14 +0809 +0875 +0803 +0000 +0000 +ENDCHAR +STARTCHAR U+8F1B +ENCODING 36635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +7C40 +1040 +7FF8 +5648 +7FF8 +56D8 +7ED8 +1368 +7E48 +1248 +1248 +1258 +0000 +ENDCHAR +STARTCHAR U+8F1C +ENCODING 36636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A8 +08A8 +7F50 +0950 +3EA8 +2AA8 +3E00 +2AF8 +3EA8 +08F8 +7FA8 +08A8 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+8F1D +ENCODING 36637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +4B28 +2BFC +2C20 +08F8 +7FA8 +14F8 +14A8 +15F8 +1620 +25FC +2020 +4020 +0000 +ENDCHAR +STARTCHAR U+8F1E +ENCODING 36638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1101 +7D45 +1129 +7DFF +5511 +7DFF +5541 +7D41 +1141 +117D +7D01 +1101 +1101 +1103 +ENDCHAR +STARTCHAR U+8F1F +ENCODING 36639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +7E48 +0968 +3E90 +2AD8 +3F24 +2BF8 +3E68 +0968 +7F90 +0890 +0968 +0A44 +0000 +ENDCHAR +STARTCHAR U+8F20 +ENCODING 36640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +7C92 +1092 +7CFE +5492 +7C92 +54FE +7C10 +11FF +7C54 +1092 +1111 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+8F21 +ENCODING 36641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1864 +187E +7E84 +190C +7E28 +7E60 +7FDE +7D02 +7D02 +7DDE +1D02 +7D02 +19FE +1902 +0000 +ENDCHAR +STARTCHAR U+8F23 +ENCODING 36643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +1129 +7D29 +1129 +7DEF +5529 +7D29 +5529 +7DEF +1129 +7D29 +1129 +1129 +1273 +0000 +0000 +ENDCHAR +STARTCHAR U+8F24 +ENCODING 36644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +7DFF +1010 +7DFF +5410 +55FF +7C00 +54FE +5482 +7CFE +1082 +7CFE +1082 +1106 +0000 +0000 +ENDCHAR +STARTCHAR U+8F25 +ENCODING 36645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +7C82 +10FE +7C82 +54FE +7C00 +5508 +7D08 +11EF +7D08 +1119 +1129 +13CF +0000 +0000 +ENDCHAR +STARTCHAR U+8F26 +ENCODING 36646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +3EF8 +0820 +7FFC +1450 +2388 +5FF4 +0FE0 +0920 +0FE0 +0920 +0FE0 +7FFC +0100 +0000 +ENDCHAR +STARTCHAR U+8F27 +ENCODING 36647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +7C88 +13FF +1088 +7C88 +5488 +7C88 +54E8 +7FBF +1088 +1088 +7D08 +1108 +1108 +1208 +ENDCHAR +STARTCHAR U+8F28 +ENCODING 36648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0830 +09FE +3F06 +0984 +3EFC +3E8C +3E8C +3EFC +2A80 +3EFE +0884 +3E84 +08FC +0884 +0800 +ENDCHAR +STARTCHAR U+8F29 +ENCODING 36649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +7E7C +0240 +3E78 +7F7C +0540 +7FFC +0FE0 +0920 +0FE0 +0920 +0FE0 +7FFC +0100 +0000 +ENDCHAR +STARTCHAR U+8F2A +ENCODING 36650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +7EA0 +10A0 +7D10 +57F8 +7C04 +57F8 +7EA8 +12A8 +7FF8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+8F2C +ENCODING 36652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +7DFF +1000 +7CFE +5482 +7C82 +54FE +7C10 +1054 +7C92 +1111 +1010 +1050 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+8F2D +ENCODING 36653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1802 +1820 +3E60 +19FE +7D5E +7F5E +7F5E +7F70 +7E22 +7FFE +1830 +3E78 +18CC +1907 +0002 +ENDCHAR +STARTCHAR U+8F2E +ENCODING 36654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087C +7F04 +0828 +09FF +7F32 +4948 +7F88 +4930 +7FFE +0810 +7F54 +0892 +0911 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+8F2F +ENCODING 36655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7F88 +08F8 +3E00 +2BFC +3E88 +2AF8 +3E88 +08F8 +7F8C +08F8 +0B88 +0808 +0000 +ENDCHAR +STARTCHAR U+8F32 +ENCODING 36658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1111 +7D11 +11FF +7C00 +55FF +7C10 +5420 +7DFF +1129 +7D29 +1129 +1129 +1103 +0000 +0000 +ENDCHAR +STARTCHAR U+8F33 +ENCODING 36659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +0820 +3EF8 +2A20 +3FFC +2A50 +3EF8 +0924 +7EF8 +0830 +0848 +0984 +0000 +ENDCHAR +STARTCHAR U+8F34 +ENCODING 36660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +08FE +7E88 +0888 +7EBE +4A88 +7EBE +4AA2 +7EBE +08A2 +7EBE +0922 +0A3E +0822 +0000 +0000 +ENDCHAR +STARTCHAR U+8F35 +ENCODING 36661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +7CFE +1082 +7CFE +5440 +7CFF +5511 +7F11 +1129 +7D45 +1101 +11F1 +100E +0000 +0000 +ENDCHAR +STARTCHAR U+8F36 +ENCODING 36662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0822 +0814 +7F7F +0814 +7F14 +497F +7F55 +4955 +7F55 +0867 +7F41 +085D +0841 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+8F37 +ENCODING 36663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +087F +7E91 +08FF +7E01 +4A7D +7E01 +4A7D +7E01 +087D +7E45 +087D +0801 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+8F38 +ENCODING 36664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +7EA0 +10A0 +7D10 +57F8 +7C04 +57A8 +7EA8 +13A8 +7EA8 +13A8 +1288 +1298 +0000 +ENDCHAR +STARTCHAR U+8F39 +ENCODING 36665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +7FFC +09F0 +3E90 +2AF0 +3E90 +2AF0 +3E40 +08F8 +7F90 +0860 +08F0 +0B0C +0000 +ENDCHAR +STARTCHAR U+8F3A +ENCODING 36666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1800 +187E +3E54 +18AA +3FFE +3EFC +3E54 +3E50 +3EFE +3CB6 +18B6 +18B6 +18B6 +19FE +0000 +0000 +ENDCHAR +STARTCHAR U+8F3B +ENCODING 36667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +7E00 +08F0 +3E90 +2A90 +3EF0 +2A00 +3FF8 +0948 +7FF8 +0948 +09F8 +0908 +0000 +ENDCHAR +STARTCHAR U+8F3E +ENCODING 36670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +7F08 +0908 +3FF8 +2B50 +3FF8 +2B50 +3F50 +09FC +7FA8 +0A90 +0CE8 +0984 +0000 +ENDCHAR +STARTCHAR U+8F3F +ENCODING 36671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +3138 +2FE8 +27C8 +3558 +27C8 +2548 +37D8 +2FE8 +2108 +7FFC +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+8F40 +ENCODING 36672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +7C92 +1092 +7CAA +54C6 +7CFE +5400 +5400 +7CFE +10AA +7CAA +10AA +10AA +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+8F41 +ENCODING 36673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +187C +1FE4 +1926 +3FAC +3FA8 +3C40 +3DDE +3D06 +3DEE +1D06 +1906 +19FE +1904 +0000 +ENDCHAR +STARTCHAR U+8F42 +ENCODING 36674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7F70 +0850 +3E50 +3F54 +5E94 +7F0C +3EF8 +2A48 +3E50 +2A30 +3E20 +7F50 +098C +0000 +ENDCHAR +STARTCHAR U+8F43 +ENCODING 36675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +7DFF +1010 +7DFF +5410 +7DFF +5444 +5486 +7D79 +1010 +7DFF +1054 +1092 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+8F44 +ENCODING 36676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +0924 +3FF8 +2A20 +3EF8 +2A20 +3FFC +0800 +7FF8 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+8F45 +ENCODING 36677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +7E20 +09FC +3E00 +2AF8 +3E88 +2AF8 +3E24 +0864 +7FD8 +0850 +0868 +0984 +0000 +ENDCHAR +STARTCHAR U+8F46 +ENCODING 36678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +7FFC +12A0 +7FF8 +56A8 +7EA8 +57F8 +7F24 +13E8 +7F30 +1564 +15A4 +1A1C +0000 +ENDCHAR +STARTCHAR U+8F47 +ENCODING 36679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +7C25 +1123 +7CA5 +5533 +54E8 +7C44 +548A +5511 +7C24 +10C8 +7C32 +1004 +10F8 +0000 +0000 +ENDCHAR +STARTCHAR U+8F48 +ENCODING 36680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0892 +0924 +7E92 +0800 +7EFE +4A92 +7EFE +4A92 +7EFE +0810 +7FFF +0854 +0892 +0911 +0000 +0000 +ENDCHAR +STARTCHAR U+8F49 +ENCODING 36681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0828 +09FC +7E20 +08F8 +3EA8 +2AF8 +3EA8 +2AF8 +3E38 +09E8 +7FFC +0890 +0850 +0830 +0000 +ENDCHAR +STARTCHAR U+8F4B +ENCODING 36683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +109F +7C44 +101F +7DD5 +545F +7C55 +549F +7D04 +109F +7C44 +1044 +10A0 +111F +0000 +0000 +ENDCHAR +STARTCHAR U+8F4C +ENCODING 36684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7E20 +09FC +3F28 +2BAC +3FAC +2A00 +3EF8 +0808 +7FFC +0808 +08F8 +0808 +0000 +ENDCHAR +STARTCHAR U+8F4D +ENCODING 36685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +7FE0 +1120 +7EBC +57C8 +7C68 +57A8 +7EA8 +1390 +7E90 +13B0 +12C8 +1284 +0000 +ENDCHAR +STARTCHAR U+8F4E +ENCODING 36686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08E0 +7E20 +09FC +3E50 +2AF8 +3F54 +2A70 +3FFC +0904 +7F74 +0954 +0974 +090C +0000 +ENDCHAR +STARTCHAR U+8F4F +ENCODING 36687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +7D01 +11FF +7D00 +553E +5504 +7D7F +5508 +5508 +7D77 +1111 +7CFF +1022 +1066 +0000 +0000 +ENDCHAR +STARTCHAR U+8F50 +ENCODING 36688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08AA +086C +7FFF +0844 +7E28 +4AFE +7E10 +4AFE +7E10 +09FF +7E10 +0828 +0844 +0983 +0000 +0000 +ENDCHAR +STARTCHAR U+8F51 +ENCODING 36689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +7DFF +1028 +7D45 +5482 +5501 +7CFE +5482 +54FE +7C82 +10FE +7C54 +1092 +1131 +0000 +0000 +ENDCHAR +STARTCHAR U+8F52 +ENCODING 36690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +087C +7E92 +09FF +7E82 +4AFE +7E82 +4AFE +7E82 +08FE +7E82 +08FE +0844 +0882 +0000 +0000 +ENDCHAR +STARTCHAR U+8F53 +ENCODING 36691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +08FC +7E92 +0854 +7E38 +4BFF +7E54 +4A92 +7FFF +0892 +7EFE +0892 +08FE +0882 +0000 +0000 +ENDCHAR +STARTCHAR U+8F54 +ENCODING 36692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1092 +7C54 +11FF +7C54 +5492 +7D11 +5442 +7CAF +112A +7D4A +10BF +1102 +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+8F55 +ENCODING 36693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +7DFF +1044 +7CFE +5482 +54FE +7C82 +54FE +5440 +7CFF +1191 +7CA9 +10FD +1002 +0000 +0000 +ENDCHAR +STARTCHAR U+8F56 +ENCODING 36694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +7DFF +1092 +7D55 +5410 +55FF +7C00 +55FF +5501 +7D7D +1145 +7D7D +1101 +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+8F57 +ENCODING 36695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1028 +1024 +7FFC +1228 +7FE8 +5610 +7FD4 +576C +7DC4 +1040 +7EA8 +1284 +1494 +1070 +0000 +ENDCHAR +STARTCHAR U+8F58 +ENCODING 36696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +7D29 +11FF +7C00 +55FF +7C00 +54FE +5482 +7CFE +1040 +7C4A +10CC +1144 +1062 +0000 +0000 +ENDCHAR +STARTCHAR U+8F59 +ENCODING 36697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0882 +0844 +7EFE +0810 +7EFE +4A10 +4BFF +7ECA +4A49 +7FFF +0869 +7ECA +095D +08C7 +0000 +0000 +ENDCHAR +STARTCHAR U+8F5A +ENCODING 36698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041C +7FD5 +1F27 +1F1C +5554 +5F48 +7FD6 +0080 +3FFE +0FF8 +0FE8 +0FF8 +7FFF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+8F5B +ENCODING 36699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10C2 +12D2 +7DE2 +10CF +7FF2 +5522 +7CCA +55F6 +7C42 +11F2 +7C42 +1042 +13FA +1006 +0000 +0000 +ENDCHAR +STARTCHAR U+8F5C +ENCODING 36700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +7C40 +13FC +7E48 +5758 +7F58 +57FC +7C80 +13F8 +7EA8 +12A8 +12A8 +1218 +0000 +ENDCHAR +STARTCHAR U+8F5D +ENCODING 36701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +16EC +1884 +1CEC +10A4 +1CAC +7FFF +0C88 +1FFC +6083 +1FFC +1084 +1FFC +1084 +1FFC +7FFF +0080 +ENDCHAR +STARTCHAR U+8F5E +ENCODING 36702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08F4 +08A4 +7EF7 +0894 +7EF8 +4AA7 +7EF0 +4A00 +7EFE +08AA +7EAA +08AA +08AA +09FF +0000 +0000 +ENDCHAR +STARTCHAR U+8F5F +ENCODING 36703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FF0 +07C0 +07C0 +07C0 +3FF8 +0920 +7FFC +3EF8 +3EF8 +2AA8 +3EF8 +7FFC +0820 +0000 +ENDCHAR +STARTCHAR U+8F60 +ENCODING 36704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1092 +7CFE +1092 +7CFE +5400 +7FFF +56B5 +7EB5 +13FF +7EB5 +12B5 +13FF +1000 +0000 +0000 +ENDCHAR +STARTCHAR U+8F61 +ENCODING 36705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2110 +2FD4 +4FE4 +3558 +2FD4 +7D7C +37D8 +5FF4 +1110 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+8F62 +ENCODING 36706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1248 +7DF4 +15B4 +7AE8 +5AA8 +7DF4 +5F5C +7840 +17FC +78E0 +1150 +164C +1040 +0000 +ENDCHAR +STARTCHAR U+8F63 +ENCODING 36707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +7E48 +13B0 +7FFC +56D0 +7FB8 +5694 +7E20 +12B8 +7EA0 +14A0 +17FC +1800 +0000 +ENDCHAR +STARTCHAR U+8F64 +ENCODING 36708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1078 +7FFC +1268 +7FB8 +57F0 +7F50 +57F0 +7F50 +13F0 +7FF8 +1568 +1568 +1BFC +0000 +ENDCHAR +STARTCHAR U+8F65 +ENCODING 36709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +088E +09DE +3E88 +09FE +3F7A +2F7A +3FFE +3F62 +2F7A +3FF2 +097A +3D7A +097A +0906 +0000 +ENDCHAR +STARTCHAR U+8F66 +ENCODING 36710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0208 +7FFC +0400 +0900 +1100 +2120 +3FF0 +0100 +0104 +FFFE +0100 +0100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+8F67 +ENCODING 36711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1240 +FF40 +2040 +2840 +4A40 +7F40 +0840 +0840 +0F40 +F840 +4842 +0842 +083E +0800 +ENDCHAR +STARTCHAR U+8F68 +ENCODING 36712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1440 +FE48 +21FC +2848 +4848 +7E48 +0848 +0848 +0848 +FE88 +088A +088A +0906 +0A00 +ENDCHAR +STARTCHAR U+8F69 +ENCODING 36713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1420 +FE20 +2020 +2820 +4824 +7FFE +0820 +0820 +0E20 +F820 +4820 +0820 +0820 +0820 +ENDCHAR +STARTCHAR U+8F6B +ENCODING 36715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +15FE +FE24 +2024 +28A4 +48A4 +7EA4 +0924 +0824 +0E24 +F844 +4844 +0884 +0928 +0810 +ENDCHAR +STARTCHAR U+8F6C +ENCODING 36716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1048 +FDFC +2040 +2844 +4BFE +7C80 +0880 +09FC +1C08 +E810 +4890 +0860 +0820 +0810 +ENDCHAR +STARTCHAR U+8F6D +ENCODING 36717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +2900 +FD00 +4104 +517E +9144 +FD44 +1144 +1154 +1D48 +F240 +5242 +1442 +183E +1000 +ENDCHAR +STARTCHAR U+8F6E +ENCODING 36718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +20A0 +FCA0 +2110 +5108 +520E +FD04 +1110 +1130 +1DC0 +F100 +5104 +1104 +10FC +1000 +ENDCHAR +STARTCHAR U+8F6F +ENCODING 36719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1440 +FE7C +2084 +2908 +4820 +7E20 +0820 +0820 +0E50 +F850 +4888 +0888 +0906 +0A04 +ENDCHAR +STARTCHAR U+8F70 +ENCODING 36720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +7FFC +0800 +1100 +3FF8 +0100 +FFFE +0100 +0100 +7EFC +2288 +1450 +0820 +1450 +228E +C104 +ENDCHAR +STARTCHAR U+8F71 +ENCODING 36721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1420 +FE24 +23FE +2820 +4820 +7E24 +09FE +0904 +0F04 +F904 +4904 +0904 +09FC +0904 +ENDCHAR +STARTCHAR U+8F72 +ENCODING 36722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +15FE +FE08 +2008 +29E8 +4928 +7F28 +0928 +0928 +0FE8 +F928 +4808 +0808 +0828 +0810 +ENDCHAR +STARTCHAR U+8F73 +ENCODING 36723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1024 +143E +FE20 +2024 +29FE +4904 +7F04 +09FC +0904 +0F00 +F900 +4900 +0A00 +0A00 +0C00 +ENDCHAR +STARTCHAR U+8F74 +ENCODING 36724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1420 +FE24 +21FE +2124 +4924 +7F24 +09FC +0924 +0F24 +F924 +4924 +09FC +0904 +0800 +ENDCHAR +STARTCHAR U+8F75 +ENCODING 36725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +14FE +FE84 +2084 +2884 +4884 +7E84 +08FC +0884 +0E00 +F848 +4848 +0884 +0906 +0A02 +ENDCHAR +STARTCHAR U+8F76 +ENCODING 36726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +10A0 +14A0 +FEA8 +20FC +2920 +4820 +7E24 +09FE +0820 +0E20 +F850 +4850 +0888 +088E +0B04 +ENDCHAR +STARTCHAR U+8F77 +ENCODING 36727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +15E0 +FE20 +2024 +2924 +48A8 +7E20 +0824 +09FE +0E20 +F820 +4820 +0820 +08A0 +0840 +ENDCHAR +STARTCHAR U+8F78 +ENCODING 36728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +28A0 +FCA0 +4118 +5226 +9440 +FC80 +1110 +1020 +1840 +F188 +5010 +1060 +1180 +1600 +ENDCHAR +STARTCHAR U+8F79 +ENCODING 36729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +15E0 +FF00 +2120 +2920 +4920 +7F24 +09FE +0820 +0EA8 +F8A4 +4926 +0A22 +08A0 +0840 +ENDCHAR +STARTCHAR U+8F7A +ENCODING 36730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1444 +FE44 +2044 +2844 +4894 +7E88 +0904 +08FE +0E84 +F884 +4884 +0884 +08FC +0884 +ENDCHAR +STARTCHAR U+8F7B +ENCODING 36731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FC +1408 +FE10 +2038 +28CC +4B02 +7C00 +0808 +09FC +0E20 +F820 +4820 +0824 +0BFE +0800 +ENDCHAR +STARTCHAR U+8F7C +ENCODING 36732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1018 +1414 +FE14 +21FE +2810 +4810 +7DF0 +0890 +0890 +0E90 +F8F0 +4B88 +080A +0806 +0802 +ENDCHAR +STARTCHAR U+8F7D +ENCODING 36733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0A50 +7F48 +0848 +0840 +FFFE +1040 +FF40 +2048 +2848 +7E30 +0820 +0F60 +F892 +090A +0A06 +ENDCHAR +STARTCHAR U+8F7E +ENCODING 36734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1440 +FE40 +2088 +2904 +49FE +7E22 +0820 +0828 +0FFC +F820 +4820 +0824 +0BFE +0800 +ENDCHAR +STARTCHAR U+8F7F +ENCODING 36735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +13F0 +2040 +FC40 +2044 +57FE +5090 +FD18 +131E +1514 +1D10 +F110 +5110 +1110 +1210 +1410 +ENDCHAR +STARTCHAR U+8F81 +ENCODING 36737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1450 +FE50 +2088 +2904 +4AFA +7E20 +0820 +0820 +0EF8 +F820 +4820 +0824 +0BFE +0800 +ENDCHAR +STARTCHAR U+8F82 +ENCODING 36738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +14FC +FF04 +2188 +2A50 +4820 +7E50 +0888 +0906 +0FFC +F904 +4904 +0904 +09FC +0904 +ENDCHAR +STARTCHAR U+8F83 +ENCODING 36739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +2024 +FFFE +2000 +5088 +5106 +FE02 +1088 +1050 +1E20 +F050 +5050 +1088 +110E +1204 +ENDCHAR +STARTCHAR U+8F84 +ENCODING 36740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1520 +FF28 +21E8 +2928 +4928 +7F28 +09E8 +0928 +0F28 +F93A +4BEA +092E +0820 +0820 +ENDCHAR +STARTCHAR U+8F85 +ENCODING 36741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +1024 +15FE +FE20 +2024 +29FE +4924 +7F24 +09FC +0924 +0F24 +F9FC +4924 +0924 +0924 +090C +ENDCHAR +STARTCHAR U+8F86 +ENCODING 36742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +FC90 +2094 +33FE +5294 +5294 +FE94 +1294 +1294 +1F54 +F22C +5204 +1204 +1214 +1208 +ENDCHAR +STARTCHAR U+8F87 +ENCODING 36743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +7EFC +0820 +7EFC +1450 +2288 +4206 +3FF8 +0500 +0920 +1FF0 +0104 +FFFE +0100 +0100 +ENDCHAR +STARTCHAR U+8F88 +ENCODING 36744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0488 +7CFC +0480 +7CFC +0480 +7CFC +0680 +0410 +3FF8 +0900 +1FF0 +0104 +FFFE +0100 +0100 +0100 +ENDCHAR +STARTCHAR U+8F89 +ENCODING 36745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +9504 +5640 +3848 +11FC +FE80 +2920 +29FC +2820 +2824 +2BFE +4C20 +4820 +8020 +0020 +ENDCHAR +STARTCHAR U+8F8A +ENCODING 36746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +2208 +FE08 +43F8 +4208 +9208 +FFF8 +1224 +122C +1FB0 +F220 +5222 +12A2 +131E +1000 +ENDCHAR +STARTCHAR U+8F8B +ENCODING 36747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2004 +2BFE +FE04 +4294 +5294 +93FC +FE44 +1224 +13FC +1E84 +F284 +52F4 +1204 +1214 +1208 +ENDCHAR +STARTCHAR U+8F8D +ENCODING 36749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2FFC +24A4 +FD28 +4210 +5528 +90C4 +F800 +17BC +1084 +18C4 +F528 +5210 +1528 +18CE +1084 +ENDCHAR +STARTCHAR U+8F8E +ENCODING 36750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2124 +2924 +FE48 +4248 +5124 +9124 +FC04 +11FE +1124 +1D24 +F1FC +5124 +1124 +11FC +1104 +ENDCHAR +STARTCHAR U+8F8F +ENCODING 36751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1024 +13FE +FE20 +21FC +2820 +4BFE +7E50 +0888 +09FC +0E22 +F9FC +4820 +0858 +0886 +0B02 +ENDCHAR +STARTCHAR U+8F90 +ENCODING 36752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +17FC +2000 +FBF8 +2208 +5208 +53F8 +F804 +17FE +1444 +FC44 +17FC +1444 +1444 +17FC +1404 +ENDCHAR +STARTCHAR U+8F91 +ENCODING 36753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +FD08 +21F8 +2804 +4BFE +7D08 +09F8 +0908 +0FF8 +F908 +4908 +0FFE +0808 +0808 +ENDCHAR +STARTCHAR U+8F93 +ENCODING 36755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20A0 +28A0 +FD10 +220E +45F4 +5000 +93C4 +FA54 +13D4 +3A54 +D3D4 +1254 +1244 +1244 +12CC +ENDCHAR +STARTCHAR U+8F94 +ENCODING 36756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1108 +27D0 +2210 +7D3C +17C8 +2110 +793C +07C0 +F93E +0110 +1FF8 +1010 +1010 +1FF0 +1010 +ENDCHAR +STARTCHAR U+8F95 +ENCODING 36757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +23FC +FC40 +27FE +4008 +93FC +FE08 +1208 +13F8 +1D44 +F128 +5310 +154E +1184 +1100 +ENDCHAR +STARTCHAR U+8F96 +ENCODING 36758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +23FE +FE22 +25FC +5020 +51F8 +FC20 +13FE +1004 +1DFE +F104 +5104 +1104 +11FC +1104 +ENDCHAR +STARTCHAR U+8F97 +ENCODING 36759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +2A04 +FFFC +4250 +5250 +93FC +FE50 +1254 +13FE +1EA4 +F2A8 +5490 +1488 +18CE +1084 +ENDCHAR +STARTCHAR U+8F98 +ENCODING 36760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2024 +2BFE +FE50 +4254 +53FE +9254 +FE54 +13FC +1292 +1E94 +F2F8 +5290 +12B2 +14D2 +108E +ENDCHAR +STARTCHAR U+8F99 +ENCODING 36761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +2120 +27E4 +FA3E +24C4 +57A4 +50A4 +FFA4 +14A4 +17A8 +1C90 +F790 +54A8 +14A8 +14C6 +1584 +ENDCHAR +STARTCHAR U+8F9A +ENCODING 36762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2248 +2950 +FFFE +4150 +524C +9444 +FA08 +13BE +1288 +1AA8 +F5A8 +513E +1108 +1208 +1408 +ENDCHAR +STARTCHAR U+8F9B +ENCODING 36763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0820 +0420 +0440 +7FFC +0100 +0100 +3FF8 +0100 +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8F9C +ENCODING 36764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0100 +1FF0 +1010 +1FF0 +0100 +3FF8 +0820 +7FFC +0100 +3FF8 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+8F9D +ENCODING 36765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0C30 +09FE +180C +10CC +3268 +7FFE +7B7E +0030 +7FFE +637C +6330 +6330 +7F30 +0030 +0000 +ENDCHAR +STARTCHAR U+8F9E +ENCODING 36766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0420 +39FC +0888 +0848 +7E50 +09FC +0820 +3E20 +23FC +2220 +2220 +3E20 +2220 +0000 +ENDCHAR +STARTCHAR U+8F9F +ENCODING 36767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +1E20 +13FC +1288 +1248 +1E50 +13FC +1020 +3E20 +33FC +5220 +1E20 +1220 +1020 +0000 +ENDCHAR +STARTCHAR U+8FA0 +ENCODING 36768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +07F8 +07F8 +07F8 +07F8 +07F8 +0490 +1FFE +1FFE +0618 +3FFF +3FFF +0180 +1FFC +0180 +0180 +ENDCHAR +STARTCHAR U+8FA1 +ENCODING 36769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +1830 +3FFE +060C +366C +1C78 +3F7E +3F7C +1A30 +3CFC +787C +1830 +1030 +3030 +2030 +0000 +ENDCHAR +STARTCHAR U+8FA3 +ENCODING 36771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7FFC +2440 +15F8 +1948 +7F48 +09F8 +0EE0 +78E0 +0950 +1248 +1044 +2040 +0000 +ENDCHAR +STARTCHAR U+8FA4 +ENCODING 36772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0F10 +3918 +2B7E +3E06 +0126 +3FBC +6238 +00FF +3F18 +1610 +0CFE +0C10 +1E10 +2610 +0010 +ENDCHAR +STARTCHAR U+8FA5 +ENCODING 36773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0830 +2E10 +2BFF +2B04 +3FC4 +0848 +3F42 +23FF +2310 +3F12 +3EFE +2310 +2310 +3F10 +2310 +0010 +ENDCHAR +STARTCHAR U+8FA6 +ENCODING 36774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1104 +1104 +7D3F +03C0 +4551 +294A +7F5F +1144 +1144 +1D44 +715F +1244 +2244 +2444 +498C +ENDCHAR +STARTCHAR U+8FA7 +ENCODING 36775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1010 +7FFC +2AA8 +2AA8 +2AA8 +7EFC +1290 +1E90 +72FC +1290 +1490 +2490 +4990 +0000 +ENDCHAR +STARTCHAR U+8FA8 +ENCODING 36776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +7CFC +28A8 +2AA8 +2AA8 +7EFC +1290 +1E90 +70FC +1090 +1110 +2110 +4210 +0000 +ENDCHAR +STARTCHAR U+8FA9 +ENCODING 36777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1210 +1110 +7D7C +0808 +2F28 +2928 +FD7E +1110 +1110 +FD7C +1110 +1150 +1190 +2110 +4010 +ENDCHAR +STARTCHAR U+8FAB +ENCODING 36779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +1088 +1088 +7D3E +0904 +2BD4 +2854 +FCBE +1108 +13C8 +FC3E +1008 +10C8 +1308 +2008 +4008 +ENDCHAR +STARTCHAR U+8FAD +ENCODING 36781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0310 +3E10 +29FC +3F48 +4A28 +0430 +3FFC +2B10 +3F10 +3FFC +2B10 +2510 +3B10 +2310 +0000 +ENDCHAR +STARTCHAR U+8FAE +ENCODING 36782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +1110 +7D7C +2EA8 +2AA8 +2928 +7EFC +13D0 +1D10 +75FC +1550 +2550 +2910 +4110 +0000 +ENDCHAR +STARTCHAR U+8FAF +ENCODING 36783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1390 +7C7C +2FE8 +2828 +2BA8 +7C7C +1390 +1C10 +73FC +1290 +2390 +2290 +4010 +0000 +ENDCHAR +STARTCHAR U+8FB0 +ENCODING 36784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1000 +17F8 +1000 +1000 +1FFC +1288 +1248 +1250 +2220 +2290 +4308 +0C04 +0000 +ENDCHAR +STARTCHAR U+8FB1 +ENCODING 36785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1000 +17F0 +1000 +1FFC +1248 +23B0 +5C2C +0020 +7FFC +0420 +0220 +0060 +0000 +ENDCHAR +STARTCHAR U+8FB2 +ENCODING 36786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +1FF0 +1290 +1FF0 +1290 +1FF0 +1FF8 +17F0 +1000 +1FFC +1290 +1260 +23B0 +5C0C +0000 +ENDCHAR +STARTCHAR U+8FB4 +ENCODING 36788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +777F +5540 +775E +0040 +7F7F +4950 +7F50 +4955 +7F56 +0854 +7F54 +0852 +0899 +0930 +0000 +0000 +ENDCHAR +STARTCHAR U+8FB5 +ENCODING 36789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +01C0 +03B0 +0E70 +09C0 +0738 +1CF0 +07C0 +1D80 +0188 +0DF8 +1980 +1F80 +33FE +207E +0000 +ENDCHAR +STARTCHAR U+8FB6 +ENCODING 36790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +3000 +1000 +0000 +0000 +F000 +1000 +1000 +1000 +1000 +1000 +1000 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FB7 +ENCODING 36791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0800 +0800 +2000 +1000 +17F8 +0000 +7000 +1000 +1000 +1000 +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FB8 +ENCODING 36792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11FC +19FC +00D8 +38D8 +389F +119F +3183 +3906 +1906 +1B06 +1A0C +1C3C +1C18 +07FE +03FE +ENDCHAR +STARTCHAR U+8FB9 +ENCODING 36793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2080 +1080 +1088 +07FC +0088 +F088 +1088 +1108 +1108 +1108 +1250 +1420 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FBA +ENCODING 36794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2000 +17F8 +1088 +0088 +0088 +7088 +1108 +1108 +1208 +1430 +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FBB +ENCODING 36795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2040 +1040 +1040 +0040 +07FC +7040 +1040 +1040 +1040 +1040 +1840 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FBC +ENCODING 36796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +21C0 +1040 +1040 +0040 +00C0 +70A0 +1120 +1110 +1210 +1408 +1804 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FBD +ENCODING 36797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +37FC +1008 +0010 +0060 +7040 +1040 +1040 +1040 +1040 +1040 +1140 +1080 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FBE +ENCODING 36798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +2080 +2080 +0088 +0FFC +E080 +2100 +2140 +2220 +2210 +2418 +2808 +5006 +8FFC +0000 +ENDCHAR +STARTCHAR U+8FBF +ENCODING 36799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2040 +1248 +1248 +0248 +0248 +7248 +1248 +1248 +13F8 +1208 +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FC0 +ENCODING 36800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +20FE +1010 +0010 +4010 +2010 +01FF +0010 +0010 +7010 +1010 +1010 +1010 +2810 +4600 +01FF +ENDCHAR +STARTCHAR U+8FC1 +ENCODING 36801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4038 +33C0 +1040 +0040 +0048 +F7FC +1040 +1040 +1040 +1040 +1040 +1040 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FC2 +ENCODING 36802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +23F8 +1040 +1040 +0040 +07FC +7040 +1040 +1040 +1040 +1040 +18C0 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FC4 +ENCODING 36804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2100 +11FC +1200 +07F0 +0040 +7080 +1100 +1204 +1204 +11FC +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FC5 +ENCODING 36805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27E0 +1120 +1120 +0120 +0120 +0FE0 +7120 +1110 +1114 +110C +1904 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FC6 +ENCODING 36806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2220 +1221 +77FF +1222 +2222 +4224 +2220 +1220 +1201 +1201 +11FF +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FC7 +ENCODING 36807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4010 +2010 +17FC +0010 +0010 +F110 +1090 +1090 +1010 +1010 +1050 +1020 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FC8 +ENCODING 36808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +3100 +1108 +01FC +0108 +F108 +1108 +1108 +1108 +1208 +1450 +1020 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FC9 +ENCODING 36809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +41FF +2102 +1102 +0102 +71FE +1100 +2100 +4100 +2100 +1100 +1200 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FCA +ENCODING 36810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000C +17FE +1040 +0258 +3BFC +1A4C +124C +324C +3A4C +1A5C +1A58 +1040 +1840 +07FC +03F8 +ENDCHAR +STARTCHAR U+8FCB +ENCODING 36811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +2002 +17FF +0020 +7820 +0820 +13FE +2020 +4020 +2020 +17FF +1000 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FCD +ENCODING 36813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2020 +07FF +7820 +1222 +2222 +4222 +23FE +1020 +1021 +1021 +303F +4800 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FCE +ENCODING 36814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2080 +1378 +1248 +0248 +0248 +7248 +1248 +13C8 +1E70 +1040 +1840 +2640 +41FC +0000 +ENDCHAR +STARTCHAR U+8FD0 +ENCODING 36816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +43F8 +3000 +1000 +0008 +07FC +F080 +1080 +1100 +1120 +1210 +17F8 +1008 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FD1 +ENCODING 36817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +2060 +1380 +1200 +0200 +03FC +0220 +7220 +1220 +1420 +1420 +1820 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FD2 +ENCODING 36818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2020 +03FE +7C00 +08F8 +1088 +2088 +1088 +0888 +0889 +0889 +130F +6800 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FD3 +ENCODING 36819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4008 +37FC +1010 +0210 +0214 +F7FE +1050 +1050 +1090 +1110 +1210 +1450 +2826 +47FC +0000 +ENDCHAR +STARTCHAR U+8FD4 +ENCODING 36820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +23FC +1200 +1200 +03F0 +0310 +7290 +1260 +1220 +14D0 +1708 +1808 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FD5 +ENCODING 36821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4108 +31FC +1240 +0440 +0040 +F044 +1FFE +1040 +1040 +1040 +1040 +1040 +2846 +47FC +0000 +ENDCHAR +STARTCHAR U+8FD6 +ENCODING 36822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4028 +2024 +0020 +7BFF +1020 +2020 +4050 +2088 +1104 +1202 +1202 +2800 +4400 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FD7 +ENCODING 36823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +21FC +0020 +7820 +0820 +13FE +2020 +7020 +0850 +0888 +1104 +3202 +4800 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FD8 +ENCODING 36824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4004 +2FFE +2040 +0040 +E080 +2080 +21A0 +2298 +248C +2884 +2080 +2080 +5006 +8FFC +0000 +ENDCHAR +STARTCHAR U+8FD9 +ENCODING 36825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +3048 +17FC +0010 +0210 +F120 +10A0 +1040 +1040 +10A0 +1110 +1210 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FDA +ENCODING 36826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +23F8 +1248 +1248 +0248 +73F8 +1248 +1040 +1040 +1840 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FDB +ENCODING 36827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +4220 +2228 +2FFC +0220 +0220 +E220 +2228 +2FFC +2220 +2220 +2220 +2420 +5026 +8FFC +0000 +ENDCHAR +STARTCHAR U+8FDC +ENCODING 36828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +43F8 +3000 +1000 +0008 +07FC +F120 +1120 +1120 +1124 +1224 +121C +1400 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FDD +ENCODING 36829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4088 +2FFC +2080 +0090 +07F8 +E080 +2088 +2FFC +2088 +2088 +20A8 +2090 +5086 +8FFC +0000 +ENDCHAR +STARTCHAR U+8FDE +ENCODING 36830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4088 +2FFC +2100 +0140 +0250 +E7F8 +2040 +2040 +2048 +2FFC +2040 +2040 +5046 +8FFC +0000 +ENDCHAR +STARTCHAR U+8FDF +ENCODING 36831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +43FC +2208 +2208 +0208 +03F8 +E208 +2280 +2280 +2240 +2220 +241C +2800 +5006 +8FFC +0000 +ENDCHAR +STARTCHAR U+8FE0 +ENCODING 36832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +083E +0020 +7C20 +09FE +1102 +2102 +1102 +0902 +09FE +1502 +2200 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FE1 +ENCODING 36833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +2202 +13FE +0200 +7240 +1240 +2240 +427E +2240 +1441 +1041 +107F +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FE2 +ENCODING 36834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0888 +2088 +1088 +1130 +0200 +71F8 +1108 +1108 +11F8 +1108 +2C00 +43FC +0000 +ENDCHAR +STARTCHAR U+8FE3 +ENCODING 36835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4124 +2124 +1124 +7BFF +0924 +1124 +2124 +113C +0900 +0900 +09FF +1800 +2400 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FE4 +ENCODING 36836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +4208 +33FC +1440 +0848 +027C +F3C8 +1648 +1268 +1250 +1204 +11FC +1000 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FE5 +ENCODING 36837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +2208 +12E8 +12A8 +02A8 +72E8 +12A8 +1208 +1208 +1A18 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FE6 +ENCODING 36838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +2200 +1238 +1FA8 +02A8 +02A8 +72A8 +12A8 +14A8 +14A8 +18B8 +1B28 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FE8 +ENCODING 36840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4080 +3110 +1208 +0404 +07FC +F000 +13F8 +1208 +1208 +1208 +13F8 +1208 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FE9 +ENCODING 36841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +2100 +1100 +13FC +0240 +0440 +7950 +1148 +1244 +1444 +1040 +18C0 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FEA +ENCODING 36842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2040 +1040 +13F8 +0248 +0248 +73F8 +1248 +1248 +13F8 +1208 +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FEB +ENCODING 36843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +2080 +1100 +13F0 +0210 +0210 +73F0 +1210 +1210 +1210 +13F0 +1A10 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FED +ENCODING 36845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2240 +1240 +13F8 +0440 +0840 +7FFC +10C0 +10A0 +1110 +1208 +1808 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FEE +ENCODING 36846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +4100 +3108 +11FC +0280 +0490 +F0F8 +1080 +1090 +10F8 +1080 +1080 +1080 +2886 +47FC +0000 +ENDCHAR +STARTCHAR U+8FEF +ENCODING 36847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2220 +1220 +1220 +43A0 +24B0 +24A8 +0AA4 +7124 +1120 +1220 +1420 +1820 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FF0 +ENCODING 36848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +2090 +1088 +1FFC +0080 +02A0 +7290 +1290 +1488 +1488 +1888 +1880 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FF1 +ENCODING 36849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3060 +1860 +07FF +3786 +3D84 +1180 +319C +39B0 +19E0 +1982 +1182 +11FE +3C00 +07FE +00FC +ENDCHAR +STARTCHAR U+8FF2 +ENCODING 36850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +0020 +03FE +4020 +2020 +0020 +0FFF +0040 +7048 +1084 +113E +17C1 +1800 +27FF +4000 +ENDCHAR +STARTCHAR U+8FF3 +ENCODING 36851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +43F8 +3010 +1060 +0198 +0604 +F010 +13F8 +1040 +1040 +1048 +17FC +1000 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+8FF4 +ENCODING 36852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +22E8 +12A8 +12A8 +02A8 +72A8 +12E8 +1208 +13F8 +1A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FF5 +ENCODING 36853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +23FE +1202 +02FA +7A02 +0AFA +128A +228A +12FA +0A8A +0A02 +1204 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FF6 +ENCODING 36854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +2040 +13FF +0080 +79FE +0A82 +14FE +6082 +10FE +0882 +0882 +1106 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FF7 +ENCODING 36855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +2490 +1290 +12A0 +0080 +0FF8 +71C0 +11A0 +1290 +1488 +1080 +1880 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FF8 +ENCODING 36856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2210 +1110 +1120 +47F8 +2120 +2120 +0FFC +7120 +1120 +1220 +1420 +1820 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FF9 +ENCODING 36857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0840 +27FC +10A0 +12B0 +02A8 +74A4 +18A4 +1120 +1120 +1A60 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FFA +ENCODING 36858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +08A0 +20A0 +13F8 +12A8 +02B8 +72B8 +1318 +1208 +13F8 +1A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FFB +ENCODING 36859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +20FC +1184 +0648 +7030 +17E0 +207E +4082 +2344 +1028 +1010 +23E0 +5000 +0FFF +0000 +0000 +ENDCHAR +STARTCHAR U+8FFC +ENCODING 36860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2020 +13FE +0020 +7820 +09FC +1000 +21FC +1104 +0904 +09FC +1104 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FFD +ENCODING 36861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2080 +13F0 +1210 +0210 +03F0 +7200 +13F0 +1210 +1210 +13F0 +1A10 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+8FFE +ENCODING 36862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4FE2 +2202 +1212 +03D2 +7252 +1452 +2A52 +4152 +2082 +1102 +120A +2804 +4400 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+8FFF +ENCODING 36863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +2100 +13FF +0401 +79F9 +0909 +11F9 +2109 +11F9 +0801 +080A +1004 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9000 +ENCODING 36864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +23F0 +1210 +13F0 +0210 +03F0 +7288 +1248 +1230 +12D0 +1F08 +1808 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9001 +ENCODING 36865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +2110 +1120 +17F8 +0080 +0080 +7FFC +10C0 +1120 +1110 +1208 +1C08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9002 +ENCODING 36866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0038 +47C0 +3040 +1044 +0FFE +0040 +F048 +13FC +1208 +1208 +1208 +13F8 +1208 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+9003 +ENCODING 36867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +20A0 +14A8 +12A8 +02B0 +00A0 +71B0 +12A8 +1D28 +1124 +1224 +1C1C +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9004 +ENCODING 36868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +41F8 +3110 +12A0 +0440 +01B0 +F64E +1040 +13F8 +1240 +1248 +17FC +1040 +2846 +47FC +0000 +ENDCHAR +STARTCHAR U+9005 +ENCODING 36869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +0BE0 +0A00 +2200 +13FC +1200 +0200 +73F8 +1508 +1508 +19F8 +1908 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9006 +ENCODING 36870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +2110 +1120 +17FC +0040 +0248 +0248 +7248 +13F8 +1248 +1040 +1880 +2700 +41FC +0000 +ENDCHAR +STARTCHAR U+9008 +ENCODING 36872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1040 +07FE +4402 +2402 +04F2 +0492 +0492 +04F2 +7492 +1402 +1402 +1406 +1800 +27FF +4000 +ENDCHAR +STARTCHAR U+9009 +ENCODING 36873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4240 +3248 +13FC +0240 +0444 +F7FE +10A0 +10A0 +10A0 +1122 +1122 +121E +2C00 +4406 +03FC +ENDCHAR +STARTCHAR U+900A +ENCODING 36874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4010 +3F10 +2110 +0210 +0410 +E458 +2754 +3C94 +2492 +2512 +2450 +2C20 +5400 +8806 +07FC +ENDCHAR +STARTCHAR U+900B +ENCODING 36875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +0848 +0FFC +2040 +13F8 +1248 +03F8 +7248 +13F8 +1248 +1248 +1A58 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+900C +ENCODING 36876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2020 +103E +0020 +7BFF +1201 +2201 +43F9 +2209 +13F9 +1201 +13FF +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+900D +ENCODING 36877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0950 +0948 +2244 +15F4 +1110 +01F0 +7110 +11F0 +1110 +1110 +1930 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+900E +ENCODING 36878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +08A0 +23F8 +12A8 +12A8 +02B8 +7318 +12E8 +1208 +13F8 +1A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+900F +ENCODING 36879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +23E0 +1040 +17FC +00E0 +0150 +77EC +10A0 +10B8 +1128 +1208 +1C30 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9010 +ENCODING 36880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27FC +1080 +1188 +0EC8 +0150 +7660 +10D0 +1348 +1C44 +1044 +1980 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9011 +ENCODING 36881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +0848 +0848 +27FC +1040 +1248 +0148 +7170 +11D0 +1648 +1048 +18C0 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9012 +ENCODING 36882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +4228 +2FFC +2088 +0088 +0FF8 +E880 +2888 +2FFC +2188 +2288 +24A8 +2890 +5080 +8886 +07FC +ENDCHAR +STARTCHAR U+9013 +ENCODING 36883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +27E0 +1440 +17FC +0440 +07FC +0440 +77F8 +1A48 +1A48 +1270 +1840 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9014 +ENCODING 36884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +2080 +1140 +1120 +0210 +0FF8 +7084 +1FF8 +12A0 +1290 +1488 +1988 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9015 +ENCODING 36885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17FC +1248 +4248 +2490 +2248 +0000 +73F8 +1040 +1040 +17FC +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9016 +ENCODING 36886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2120 +1120 +1620 +4228 +2668 +2B70 +03A0 +7520 +1950 +1150 +1188 +1E04 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9017 +ENCODING 36887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27FC +1000 +13F8 +0208 +0208 +73F8 +1210 +1110 +1120 +17FC +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9018 +ENCODING 36888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +2040 +1088 +0084 +413E +27E2 +0100 +01FC +0220 +7020 +13FE +1050 +1088 +2904 +4600 +01FF +ENDCHAR +STARTCHAR U+9019 +ENCODING 36889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +21F0 +1000 +17FC +0000 +01F0 +7000 +11F0 +1000 +11F0 +1110 +19F0 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+901A +ENCODING 36890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27F8 +1120 +10C0 +03F8 +0248 +73F8 +1248 +13F8 +1248 +1248 +1A58 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+901B +ENCODING 36891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +2908 +27FC +0220 +0620 +EA20 +22F8 +2620 +2A20 +3220 +2228 +2BFC +2400 +5006 +8FFC +0000 +ENDCHAR +STARTCHAR U+901C +ENCODING 36892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +47FF +2040 +03FE +7842 +1042 +27FF +4000 +23FE +1202 +1202 +13FE +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+901D +ENCODING 36893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0208 +2210 +1260 +1FC0 +027C +0250 +03D0 +7E50 +1290 +1290 +1710 +1810 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+901E +ENCODING 36894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +09F0 +0910 +2110 +11F0 +1000 +03F8 +7040 +11F0 +1040 +17FC +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+901F +ENCODING 36895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2040 +17FC +1040 +03F8 +0248 +7248 +13F8 +10E0 +1150 +164C +1840 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9020 +ENCODING 36896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2240 +1240 +13F8 +0440 +0FFC +7000 +13F0 +1210 +1210 +13F0 +1A10 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9021 +ENCODING 36897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +08A0 +0918 +27E4 +1120 +1124 +029C +74F0 +1190 +1260 +10D0 +1B08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9022 +ENCODING 36898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +21F8 +1690 +1060 +01F0 +0E4C +73F8 +1040 +13F8 +1040 +17FC +1840 +2640 +41FC +0000 +ENDCHAR +STARTCHAR U+9023 +ENCODING 36899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2040 +17FC +1040 +03F8 +0248 +73F8 +1248 +13F8 +1040 +17FC +1840 +2640 +41FC +0000 +ENDCHAR +STARTCHAR U+9024 +ENCODING 36900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0410 +4210 +2054 +0452 +7291 +1012 +2012 +1112 +1204 +1408 +10F0 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9026 +ENCODING 36902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +4FFE +3000 +17BC +04A4 +04A4 +F6B4 +15AC +14A4 +14A4 +14A4 +15AC +14A4 +2802 +47FC +0000 +ENDCHAR +STARTCHAR U+9027 +ENCODING 36903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +0890 +0908 +2248 +1040 +10A0 +0110 +73F8 +1514 +1110 +11F0 +1910 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9028 +ENCODING 36904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2020 +13FF +0124 +4124 +22AA +02AA +0471 +0020 +7070 +10A8 +1124 +1222 +2820 +4600 +01FF +ENDCHAR +STARTCHAR U+9029 +ENCODING 36905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3060 +17FE +01D0 +11F8 +337E +3466 +2168 +31CA +13DE +1108 +1108 +2208 +3800 +0FFC +0000 +ENDCHAR +STARTCHAR U+902A +ENCODING 36906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10C8 +08DE +01FC +0898 +38DB +1804 +11FC +190C +090C +09FC +090C +198C +1D8C +07FE +00FE +ENDCHAR +STARTCHAR U+902C +ENCODING 36908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0042 +2042 +1084 +0108 +43EF +2084 +0084 +00E4 +139F +7884 +1084 +1084 +1104 +1204 +3800 +47FF +ENDCHAR +STARTCHAR U+902D +ENCODING 36909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +4040 +2FFE +2802 +13F4 +0210 +E210 +23F0 +2200 +23F8 +2208 +2208 +23F8 +5206 +8FFC +0000 +ENDCHAR +STARTCHAR U+902E +ENCODING 36910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +23F8 +1048 +17FC +0048 +03F8 +7448 +1250 +12E0 +1150 +1648 +18C8 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+902F +ENCODING 36911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +47FC +2008 +13F8 +0008 +0FFE +F040 +1244 +1168 +1150 +1248 +1444 +1140 +2886 +47FC +0000 +ENDCHAR +STARTCHAR U+9031 +ENCODING 36913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +23F8 +1248 +13F8 +0248 +03F8 +7208 +13E8 +1528 +15E8 +1928 +1818 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9032 +ENCODING 36914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +2110 +1220 +13FC +0620 +0A20 +73F8 +1220 +13F8 +1220 +13FC +1A00 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9033 +ENCODING 36915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1860 +0BFE +0080 +391C +0BFC +19FC +11FC +39FC +099C +09FC +09CC +199C +3F08 +03FE +000C +ENDCHAR +STARTCHAR U+9034 +ENCODING 36916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +203E +1020 +01FC +7904 +09FC +1104 +21FC +4020 +23FE +1020 +1020 +2820 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9035 +ENCODING 36917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0BF8 +0840 +27FC +1120 +1124 +025C +7440 +11F0 +1040 +17FC +1800 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9036 +ENCODING 36918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +0BE0 +0840 +27FC +10E0 +1150 +0248 +77FC +1090 +11D0 +1070 +1B88 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9037 +ENCODING 36919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23F8 +1318 +1318 +03F8 +3318 +13F8 +2184 +33FE +16F4 +15AC +134C +1098 +3018 +3FFE +07FE +ENDCHAR +STARTCHAR U+9038 +ENCODING 36920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +20F0 +1120 +1240 +07F8 +0248 +7248 +13F8 +12C8 +10C0 +1144 +1A3C +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9039 +ENCODING 36921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0BF8 +2040 +17FC +1110 +00A0 +77FC +1040 +13F8 +1040 +1840 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+903B +ENCODING 36923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +4FFE +2924 +2924 +0FFC +0884 +E100 +23F8 +2608 +2910 +20A0 +20C0 +2700 +5006 +8FFC +0000 +ENDCHAR +STARTCHAR U+903C +ENCODING 36924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27FC +1000 +11F0 +0110 +01F0 +7000 +13F8 +1248 +13F8 +1248 +13F8 +2C00 +43FC +0000 +ENDCHAR +STARTCHAR U+903D +ENCODING 36925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4084 +2084 +03FF +7884 +0820 +1020 +23FF +4040 +20FE +1182 +1282 +10FE +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+903E +ENCODING 36926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11C0 +08A0 +0910 +23F8 +1404 +13A8 +02A8 +73D0 +12D0 +13A8 +12A8 +1AA8 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+903F +ENCODING 36927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +41FC +2104 +01FC +7904 +09FC +1000 +27FF +2100 +13FF +1451 +10A1 +294A +4404 +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+9041 +ENCODING 36929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +23E0 +1220 +13FC +0220 +02F8 +7288 +12F8 +1288 +14F8 +1488 +18F8 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9042 +ENCODING 36930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +2120 +17FC +1080 +0188 +0EC8 +7170 +16E0 +1150 +1648 +1044 +1980 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9043 +ENCODING 36931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +33FC +11FC +0070 +30F0 +3BFE +1230 +2270 +3398 +1278 +17D8 +1478 +35E0 +3800 +07FC +0018 +ENDCHAR +STARTCHAR U+9044 +ENCODING 36932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4248 +3248 +1248 +03F8 +0000 +F7FE +1080 +17FC +14A4 +14A4 +14A4 +14AC +2802 +47FC +0000 +ENDCHAR +STARTCHAR U+9045 +ENCODING 36933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27F8 +1408 +17F8 +0510 +04A0 +77F8 +1440 +15F0 +1440 +1BF8 +1840 +2640 +41FC +0000 +ENDCHAR +STARTCHAR U+9047 +ENCODING 36935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +23F0 +1290 +13F0 +0290 +03F0 +7080 +17F8 +14A8 +14F8 +1708 +1C18 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9049 +ENCODING 36937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1080 +08F8 +0880 +23F0 +1210 +13F0 +0210 +73F0 +1210 +13F0 +1330 +1C08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+904A +ENCODING 36938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +2220 +1220 +1FFC +0240 +027C +7388 +1290 +12FC +1490 +1490 +19B0 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+904B +ENCODING 36939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27FC +1448 +1FFC +0040 +03F8 +7248 +13F8 +1248 +13F8 +1040 +17FC +2C40 +43FC +0000 +ENDCHAR +STARTCHAR U+904C +ENCODING 36940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FC +12FC +03FC +12A4 +3BFC +1000 +37FE +3080 +18FC +100C +1018 +3038 +3830 +0FFC +01F8 +ENDCHAR +STARTCHAR U+904D +ENCODING 36941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27FC +1000 +13F8 +0208 +03F8 +7200 +13F8 +16A8 +17F8 +1AA8 +1AA8 +2618 +41FC +0000 +ENDCHAR +STARTCHAR U+904E +ENCODING 36942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +23F0 +1210 +12F0 +0290 +07F8 +7408 +15E8 +1528 +15E8 +1528 +1C18 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+904F +ENCODING 36943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF0 +0A10 +23F0 +1210 +13F0 +0100 +73F8 +1648 +12A8 +1328 +1BF8 +2610 +41FC +0000 +ENDCHAR +STARTCHAR U+9050 +ENCODING 36944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BB8 +0A88 +2288 +13B8 +1200 +03F8 +7228 +1210 +1390 +1228 +1A48 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9051 +ENCODING 36945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +09F0 +0910 +21F0 +1110 +11F0 +0000 +73F8 +1040 +11F0 +1040 +1FFC +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9052 +ENCODING 36946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +11F0 +0910 +0A08 +27FC +10A0 +13F8 +02A8 +7338 +12E8 +1208 +13F8 +1A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9053 +ENCODING 36947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +2120 +1FFC +1080 +03F0 +0210 +73F0 +1210 +13F0 +1210 +13F0 +1A10 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9054 +ENCODING 36948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +23F8 +1040 +17FC +0110 +00A0 +77FC +1040 +13F8 +1040 +17FC +1840 +2640 +41FC +0000 +ENDCHAR +STARTCHAR U+9055 +ENCODING 36949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +23F0 +1090 +17FC +01F0 +0110 +71F0 +1020 +11F8 +1120 +17FC +1820 +2620 +41FC +0000 +ENDCHAR +STARTCHAR U+9056 +ENCODING 36950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +0840 +0FFC +2040 +13F8 +1318 +02A8 +73F8 +1248 +13F8 +1248 +1A58 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9057 +ENCODING 36951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +43FC +3248 +13F8 +0040 +0FFE +F008 +13FC +1208 +1248 +1248 +10A0 +1118 +2A08 +4406 +03FC +ENDCHAR +STARTCHAR U+9058 +ENCODING 36952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +0FFC +08A0 +23F8 +10A0 +17FC +01F0 +7150 +11F0 +1150 +17FC +1910 +2730 +41FC +0000 +ENDCHAR +STARTCHAR U+9059 +ENCODING 36953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +10F8 +1190 +4660 +2180 +2FF8 +0240 +77FC +1248 +1248 +13F8 +1A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+905B +ENCODING 36955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +46FE +3424 +1524 +0654 +0488 +F3F8 +1248 +1248 +13F8 +1248 +1248 +13F8 +2806 +47FC +0000 +ENDCHAR +STARTCHAR U+905C +ENCODING 36956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000C +2FF0 +1128 +1248 +02D0 +0330 +0E48 +72FC +12A8 +12A4 +1324 +1E20 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+905D +ENCODING 36957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FE +0492 +0492 +4FFF +2040 +0244 +0442 +0040 +7148 +1244 +1442 +10C0 +2800 +47FF +0000 +ENDCHAR +STARTCHAR U+905E +ENCODING 36958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1018 +0BE0 +0A38 +22FC +12A8 +12B8 +02E4 +729C +1550 +1554 +1A54 +188C +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9060 +ENCODING 36960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +23F8 +1040 +17FC +0000 +03F8 +7208 +13F8 +1088 +11D0 +1EB0 +1888 +2680 +41FC +0000 +ENDCHAR +STARTCHAR U+9061 +ENCODING 36961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0480 +22B8 +1328 +1FE8 +0138 +0568 +0568 +77F8 +1528 +1148 +1248 +1C98 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9062 +ENCODING 36962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03F8 +4208 +33F8 +1208 +03F8 +0000 +F7BC +1084 +14A4 +1294 +1294 +14A4 +118C +2886 +47FC +0000 +ENDCHAR +STARTCHAR U+9063 +ENCODING 36963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +23F8 +1248 +13F8 +0040 +0FFC +71F0 +1110 +11F0 +11F8 +1108 +19F8 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9065 +ENCODING 36965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +003C +27C8 +1248 +1150 +0120 +03F8 +7040 +17FC +1248 +1248 +13F8 +1A08 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9066 +ENCODING 36966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +11FC +19FF +01F8 +19F8 +19F8 +1108 +31F8 +39F8 +1908 +19F8 +1998 +110C +3C04 +07FC +0000 +ENDCHAR +STARTCHAR U+9067 +ENCODING 36967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +27FF +0088 +77FF +1000 +23FE +4202 +23FE +1202 +13FE +1020 +17FF +2820 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9068 +ENCODING 36968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0BA0 +0920 +27FC +1148 +17E8 +0118 +7190 +1298 +12A8 +14C4 +1984 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9069 +ENCODING 36969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2040 +17FC +10A0 +03F8 +0248 +73F8 +1248 +12E8 +12A8 +12E8 +1A18 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+906B +ENCODING 36971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4108 +27D0 +011F +77C2 +1542 +2552 +47D2 +2112 +138A +1544 +110A +1111 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+906C +ENCODING 36972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +2330 +3FF0 +0220 +027E +7FF8 +2AB0 +2FB0 +7EA0 +1730 +1FF0 +1AD8 +328C +3304 +4FFE +0000 +ENDCHAR +STARTCHAR U+906D +ENCODING 36973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00A0 +27FC +13F8 +12A8 +03F8 +02A8 +73F8 +11F0 +1110 +11F0 +1110 +19F0 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+906E +ENCODING 36974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2040 +13FC +1290 +03FC +0290 +72F0 +1290 +1400 +15A8 +1954 +1A54 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+906F +ENCODING 36975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17FC +1520 +4564 +27B4 +2538 +05D8 +7738 +15D4 +1514 +1910 +1B60 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9070 +ENCODING 36976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4252 +27FF +0252 +7473 +1000 +17FF +2421 +4020 +23FE +1222 +1226 +1020 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9072 +ENCODING 36978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0A08 +23F8 +1220 +13AC +03AC +72A0 +12F8 +1520 +17FC +1820 +2620 +41FC +0000 +ENDCHAR +STARTCHAR U+9073 +ENCODING 36979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +17FF +0088 +7800 +0924 +1124 +22AA +4471 +2020 +11FC +1020 +13FE +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9074 +ENCODING 36980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +4248 +3150 +17FC +00E0 +0150 +F64C +1208 +13FE +14A8 +1AA8 +113E +1208 +2C08 +47FE +0000 +ENDCHAR +STARTCHAR U+9075 +ENCODING 36981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +20A0 +17FC +10C0 +03F8 +02D8 +7338 +13F8 +13F8 +1010 +1FFC +1890 +2630 +41FC +0000 +ENDCHAR +STARTCHAR U+9076 +ENCODING 36982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +09F0 +0840 +27FC +1110 +17B8 +0190 +763C +13F8 +10A0 +1124 +1A1C +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9077 +ENCODING 36983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27FC +10A0 +13F8 +02A8 +03F8 +7080 +1FFC +13F0 +1C28 +11E4 +1910 +26F0 +41FC +0000 +ENDCHAR +STARTCHAR U+9078 +ENCODING 36984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27F8 +1088 +17F8 +0444 +03FC +7120 +17F8 +1120 +1FFC +10A0 +1B18 +2604 +41FC +0000 +ENDCHAR +STARTCHAR U+9079 +ENCODING 36985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +40FC +2028 +03FF +78B1 +0B12 +1070 +23FF +4245 +2387 +1279 +1249 +1279 +2A03 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+907A +ENCODING 36986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +21F0 +1150 +11F0 +07FC +01F0 +7110 +11F0 +11F0 +1110 +11F0 +1B10 +2608 +41FC +0000 +ENDCHAR +STARTCHAR U+907B +ENCODING 36987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43CF +2249 +03CF +7882 +0844 +13FF +2010 +4111 +2111 +11FF +1020 +11C0 +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+907C +ENCODING 36988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +2040 +17FC +12A8 +0110 +03F8 +7514 +11F0 +1110 +11F0 +1248 +1444 +2CC0 +43FC +0000 +ENDCHAR +STARTCHAR U+907D +ENCODING 36989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2080 +10F0 +17FC +44E8 +2790 +2470 +07F8 +74C8 +1768 +14B0 +1B68 +19A4 +26C0 +41FC +0000 +ENDCHAR +STARTCHAR U+907E +ENCODING 36990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4208 +23CF +0492 +0000 +77FF +1020 +1124 +2124 +42AA +2471 +1020 +17FF +3000 +4FFF +0000 +0000 +ENDCHAR +STARTCHAR U+907F +ENCODING 36991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +2790 +14FC +14C8 +07A8 +0430 +77FC +1C90 +1490 +14FC +1790 +1C10 +2610 +41FC +0000 +ENDCHAR +STARTCHAR U+9080 +ENCODING 36992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +0FA0 +0CA0 +27BC +14C8 +17C8 +0228 +7FD0 +1398 +12A8 +14C4 +1984 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9081 +ENCODING 36993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +0FFC +08A0 +21F0 +1150 +11F0 +0150 +71F0 +13F8 +1268 +13F8 +1A08 +2618 +41FC +0000 +ENDCHAR +STARTCHAR U+9082 +ENCODING 36994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2200 +13F8 +14A8 +4928 +27D8 +25B0 +07B8 +75D0 +17FC +1490 +1490 +1990 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9083 +ENCODING 36995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +17FC +14AC +4B3C +20A0 +27FC +00C8 +77E8 +10F0 +1370 +10A8 +1328 +2CC0 +43FC +0000 +ENDCHAR +STARTCHAR U+9084 +ENCODING 36996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27F8 +1528 +17F8 +0000 +0FFC +73F0 +1210 +13F8 +10C8 +17B0 +1888 +2680 +41FC +0000 +ENDCHAR +STARTCHAR U+9085 +ENCODING 36997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +23FE +13FE +02FA +7A8A +0AFA +13FE +21FC +1104 +11FC +11FC +1104 +2BFE +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9086 +ENCODING 36998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43E4 +266A +0D9C +730C +1607 +23FC +4000 +21F8 +1108 +11F8 +1090 +13FC +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9087 +ENCODING 36999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +17FC +1148 +4244 +27FC +22D8 +0368 +73F8 +12D8 +1368 +13F8 +1248 +2A58 +47FC +0000 +ENDCHAR +STARTCHAR U+9088 +ENCODING 37000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +4324 +3CFE +2AC4 +0544 +067C +EB44 +2544 +397C +2328 +2528 +392A +254E +5280 +8FFE +0000 +ENDCHAR +STARTCHAR U+9089 +ENCODING 37001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +09F0 +0910 +21D0 +11D0 +11F0 +03FC +72E8 +1510 +17FC +1110 +19F0 +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+908A +ENCODING 37002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +09F0 +0910 +21F0 +11F0 +11F0 +03FC +72A8 +1578 +17FC +10F0 +1910 +2660 +41FC +0000 +ENDCHAR +STARTCHAR U+908B +ENCODING 37003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0248 +4490 +2248 +2FFC +0924 +08C4 +E924 +2FFC +2490 +26D0 +2490 +26D4 +2494 +56DC +8800 +07FE +ENDCHAR +STARTCHAR U+908C +ENCODING 37004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +31F0 +13B0 +037E +1FF4 +17AC +17EC +2BD8 +31F8 +175E +19F0 +13F0 +16D8 +38C8 +07FE +0000 +ENDCHAR +STARTCHAR U+908D +ENCODING 37005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +43FE +4050 +27AF +03FE +7222 +12FA +23FE +40F8 +2110 +17FE +10F8 +13AF +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+908E +ENCODING 37006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000C +37D8 +1790 +0724 +767C +3F98 +2F3C +3BF4 +13B0 +1EF4 +1AD4 +2F90 +3800 +0FFC +0000 +ENDCHAR +STARTCHAR U+908F +ENCODING 37007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0BF8 +0AA8 +23F8 +1228 +1D7C +0350 +72FC +17D0 +137C +15D0 +197C +2600 +41FC +0000 +ENDCHAR +STARTCHAR U+9090 +ENCODING 37008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07DF +679E +2EB6 +07FF +7448 +17FF +1449 +27FF +1508 +15CE +1529 +15EF +2800 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9091 +ENCODING 37009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0820 +0FE0 +0000 +3FF8 +2108 +2108 +3FF8 +2008 +2000 +2004 +1FFC +0000 +ENDCHAR +STARTCHAR U+9093 +ENCODING 37011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFC +0284 +4288 +2488 +2490 +18A0 +0898 +1884 +1484 +2484 +22C4 +42A8 +8090 +0080 +0080 +ENDCHAR +STARTCHAR U+9094 +ENCODING 37012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7F7F +0122 +0124 +0128 +7F24 +4122 +4021 +4031 +402A +40A4 +40A0 +7FA0 +0020 +0000 +0000 +ENDCHAR +STARTCHAR U+9095 +ENCODING 37013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +2108 +4210 +2108 +1088 +1FF0 +1010 +1FF0 +0008 +3FFC +2108 +2108 +3FF8 +200A +2002 +1FFE +ENDCHAR +STARTCHAR U+9097 +ENCODING 37015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +7F7C +0844 +0844 +0848 +0948 +FFD0 +0848 +0844 +0842 +0842 +0862 +0854 +0848 +0840 +0840 +ENDCHAR +STARTCHAR U+9098 +ENCODING 37016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +7F7F +0822 +0824 +0A28 +7F24 +0822 +0821 +0831 +082A +0824 +4820 +2820 +1020 +0000 +0000 +ENDCHAR +STARTCHAR U+9099 +ENCODING 37017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +087C +0944 +FFC4 +2048 +2048 +2050 +2048 +2044 +2042 +2242 +3F62 +0054 +0048 +0040 +0040 +ENDCHAR +STARTCHAR U+909B +ENCODING 37019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +027C +7F44 +0844 +0848 +0848 +0850 +0848 +0844 +0842 +0842 +0F62 +F854 +4048 +0040 +0040 +ENDCHAR +STARTCHAR U+909D +ENCODING 37021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +027C +3FC4 +2044 +2048 +2048 +2050 +2048 +2044 +2042 +2042 +2062 +4054 +4048 +8040 +0040 +ENDCHAR +STARTCHAR U+909E +ENCODING 37022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +043F +3F91 +0412 +0414 +0412 +7FD1 +0411 +0419 +0415 +0A12 +1110 +2090 +4050 +0000 +0000 +ENDCHAR +STARTCHAR U+909F +ENCODING 37023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F22 +0024 +0028 +3E24 +2222 +2221 +2231 +222A +2224 +22A0 +42A0 +03A0 +0000 +0000 +ENDCHAR +STARTCHAR U+90A0 +ENCODING 37024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A00 +113F +2091 +4051 +0012 +3F94 +0892 +0891 +0891 +089A +0894 +1090 +2490 +0310 +0000 +0000 +ENDCHAR +STARTCHAR U+90A1 +ENCODING 37025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +087C +0944 +FFC4 +1048 +1248 +1F50 +1248 +1244 +1242 +1242 +2262 +2254 +4A48 +8440 +0040 +ENDCHAR +STARTCHAR U+90A2 +ENCODING 37026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F7C +1244 +1244 +1248 +1248 +1250 +FFC8 +1244 +1242 +1242 +1262 +2254 +2248 +4240 +0240 +ENDCHAR +STARTCHAR U+90A3 +ENCODING 37027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F78 +0948 +0950 +3F50 +0960 +0950 +3F48 +0944 +0944 +1164 +1158 +2140 +4640 +0000 +ENDCHAR +STARTCHAR U+90A5 +ENCODING 37029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +103F +7F12 +5114 +5118 +1014 +1412 +1411 +1411 +141A +2454 +4450 +07D0 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+90A6 +ENCODING 37030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0478 +3FC8 +0450 +0450 +3FE0 +0450 +0448 +7FC4 +0444 +0864 +0858 +1040 +2040 +0000 +ENDCHAR +STARTCHAR U+90A7 +ENCODING 37031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +7F7F +0022 +0024 +012C +7FA2 +2421 +2421 +2431 +242A +2424 +24A0 +44A0 +07A0 +0000 +0000 +ENDCHAR +STARTCHAR U+90A8 +ENCODING 37032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +0F88 +7890 +0A90 +2AA0 +2A90 +2A88 +3E88 +2A88 +0888 +0AF0 +0C80 +0880 +0000 +ENDCHAR +STARTCHAR U+90AA +ENCODING 37034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F78 +1248 +1250 +1250 +7F60 +0650 +0648 +0A44 +0A44 +1264 +2258 +4240 +0640 +0000 +ENDCHAR +STARTCHAR U+90AC +ENCODING 37036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +123C +3F24 +2224 +2228 +2228 +2A30 +2428 +20A4 +3FE2 +00A2 +04A2 +FEB4 +00A8 +02A0 +0120 +ENDCHAR +STARTCHAR U+90AE +ENCODING 37038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +097C +7FC4 +4948 +4948 +4950 +4948 +7F44 +4942 +4942 +4962 +4954 +7F48 +4140 +0040 +ENDCHAR +STARTCHAR U+90AF +ENCODING 37039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1200 +1278 +1248 +1250 +7FD0 +1260 +1250 +1250 +1E48 +1248 +1248 +1270 +1E40 +1240 +0000 +ENDCHAR +STARTCHAR U+90B0 +ENCODING 37040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +107C +2044 +2444 +4248 +FF48 +0050 +0248 +7F44 +4242 +4242 +4262 +4254 +7E48 +4240 +0040 +ENDCHAR +STARTCHAR U+90B1 +ENCODING 37041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +06F8 +3888 +2090 +2090 +3FA0 +2490 +2488 +2488 +2488 +2788 +38F0 +6080 +0080 +0000 +ENDCHAR +STARTCHAR U+90B2 +ENCODING 37042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +043F +1211 +5012 +5014 +5094 +5252 +1251 +1419 +1815 +1092 +3090 +4F90 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+90B3 +ENCODING 37043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFC +0444 +0844 +1848 +1C48 +2A50 +2948 +4944 +8842 +0842 +0862 +0F54 +F848 +4040 +0040 +ENDCHAR +STARTCHAR U+90B4 +ENCODING 37044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFC +0844 +0844 +0948 +7FC8 +4950 +4948 +4944 +5542 +6342 +4162 +4154 +4548 +4240 +0040 +ENDCHAR +STARTCHAR U+90B5 +ENCODING 37045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7EF8 +1288 +1290 +1290 +22A0 +4C90 +0088 +3E88 +2288 +2288 +22F0 +3E80 +2280 +0000 +ENDCHAR +STARTCHAR U+90B6 +ENCODING 37046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1400 +147C +1444 +1444 +1548 +F7C8 +1450 +1448 +1444 +1442 +14C2 +3562 +D654 +1448 +0040 +0040 +ENDCHAR +STARTCHAR U+90B8 +ENCODING 37048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +3C78 +2448 +2450 +2450 +3FE0 +2450 +2448 +2244 +3AC4 +61E4 +00D8 +7E40 +0040 +0000 +ENDCHAR +STARTCHAR U+90B9 +ENCODING 37049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +107C +1044 +3F44 +4248 +8448 +7F50 +0148 +0144 +3F42 +0142 +0162 +7F54 +0148 +0040 +0040 +ENDCHAR +STARTCHAR U+90BA +ENCODING 37050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1400 +147C +1444 +1444 +94C8 +54C8 +5550 +3548 +3644 +1442 +1442 +17E2 +F854 +4048 +0040 +0040 +ENDCHAR +STARTCHAR U+90BB +ENCODING 37051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087C +1444 +1244 +21C8 +50C8 +8850 +0048 +7F44 +0142 +0242 +1462 +0854 +0448 +0440 +0040 +ENDCHAR +STARTCHAR U+90BD +ENCODING 37053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +043F +3F91 +0412 +0414 +0412 +7FD1 +0411 +0411 +3F9A +0414 +0410 +0410 +7FD0 +0000 +0000 +ENDCHAR +STARTCHAR U+90BE +ENCODING 37054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087C +4A44 +7F44 +4848 +8848 +0950 +FFC8 +0844 +1C42 +1C42 +2A62 +2954 +4848 +8840 +0840 +ENDCHAR +STARTCHAR U+90BF +ENCODING 37055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +043F +1F11 +0412 +0414 +3F92 +0111 +0111 +7FD9 +1115 +0912 +0110 +0510 +0210 +0000 +0000 +ENDCHAR +STARTCHAR U+90C1 +ENCODING 37057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0478 +7FC8 +0850 +0850 +1F60 +1150 +3F48 +5144 +1F44 +1164 +1158 +1140 +1340 +0000 +ENDCHAR +STARTCHAR U+90C3 +ENCODING 37059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +043F +0A11 +1112 +2094 +4052 +3F91 +0011 +0011 +3F99 +2095 +2092 +2090 +3F90 +2090 +0000 +0000 +ENDCHAR +STARTCHAR U+90C4 +ENCODING 37060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +227C +1444 +0844 +1448 +6348 +1050 +FFC8 +1044 +2442 +2842 +4862 +9254 +3F48 +0140 +0040 +ENDCHAR +STARTCHAR U+90C5 +ENCODING 37061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +FF7C +1044 +1044 +2248 +4148 +7F50 +0848 +0844 +7F42 +0842 +0862 +0FD4 +F848 +4040 +0040 +ENDCHAR +STARTCHAR U+90C7 +ENCODING 37063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +217C +3FC4 +4144 +4148 +BD48 +2550 +2548 +3D44 +2542 +2542 +3D62 +2554 +0148 +0A40 +0440 +ENDCHAR +STARTCHAR U+90C8 +ENCODING 37064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3F3F +2012 +2014 +3F94 +2012 +2011 +2F91 +2891 +2899 +2896 +4890 +0F90 +0890 +0000 +0000 +ENDCHAR +STARTCHAR U+90CA +ENCODING 37066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +0478 +0448 +7FD0 +1250 +1160 +22D0 +52C8 +0C44 +0444 +0A64 +1258 +2040 +4040 +0000 +ENDCHAR +STARTCHAR U+90CB +ENCODING 37067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +103F +3F91 +6092 +2094 +3F92 +2091 +2091 +3F91 +209A +2094 +2090 +3F90 +2090 +0000 +0000 +ENDCHAR +STARTCHAR U+90CC +ENCODING 37068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +0841 +3E41 +087F +0800 +087F +7F49 +0849 +087F +0840 +3E40 +0841 +0841 +0F41 +783F +ENDCHAR +STARTCHAR U+90CE +ENCODING 37070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0878 +3E48 +2250 +2250 +3E60 +2250 +3E48 +2444 +2244 +2764 +3958 +6040 +0040 +0000 +ENDCHAR +STARTCHAR U+90CF +ENCODING 37071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087C +0944 +FFC4 +0848 +4948 +2950 +2A48 +FFC4 +0842 +0842 +1462 +1254 +2348 +C140 +0040 +ENDCHAR +STARTCHAR U+90D0 +ENCODING 37072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087C +1444 +1244 +2148 +2048 +7FD0 +8048 +0144 +FFC2 +1042 +1462 +2254 +7F48 +2140 +0040 +ENDCHAR +STARTCHAR U+90D1 +ENCODING 37073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +227C +1444 +7F44 +0848 +0848 +0950 +FFC8 +0844 +0842 +0842 +1462 +1254 +2248 +4040 +0040 +ENDCHAR +STARTCHAR U+90D2 +ENCODING 37074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087E +3E42 +2242 +227E +3E00 +227F +2249 +3E49 +2049 +287F +2440 +2240 +2641 +3941 +613F +ENDCHAR +STARTCHAR U+90D3 +ENCODING 37075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFC +50C4 +9144 +3F48 +1048 +1450 +2548 +7FC4 +0442 +0442 +07E2 +FC54 +4448 +0440 +0440 +ENDCHAR +STARTCHAR U+90D4 +ENCODING 37076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7BDF +0889 +108A +228A +22E9 +1289 +1289 +128D +57EA +3008 +3008 +4FE8 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+90D5 +ENCODING 37077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0140 +011F +3FC9 +210A +210C +3D0A +2549 +2589 +2509 +250D +2AAA +2468 +4028 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+90D6 +ENCODING 37078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +7F7F +0021 +0022 +7F24 +4122 +4121 +4121 +7F21 +0031 +412A +2224 +1420 +7F20 +0000 +0000 +ENDCHAR +STARTCHAR U+90D7 +ENCODING 37079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +113C +0E24 +1124 +28A8 +0828 +FFF0 +1428 +24A4 +7FE2 +A4A2 +24A2 +24B4 +25A8 +24A0 +0420 +ENDCHAR +STARTCHAR U+90D8 +ENCODING 37080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FBF +2091 +2092 +3F94 +2492 +0811 +1011 +7FD1 +405A +4054 +4050 +7FD0 +4050 +0000 +0000 +ENDCHAR +STARTCHAR U+90D9 +ENCODING 37081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +043F +7FD1 +0412 +7F94 +4492 +7F91 +4491 +7F91 +449A +4494 +4490 +4490 +4110 +0000 +0000 +ENDCHAR +STARTCHAR U+90DA +ENCODING 37082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FBF +0811 +3F92 +0914 +0912 +0911 +7FD1 +0011 +3F9A +2094 +2090 +3F90 +2090 +0000 +0000 +ENDCHAR +STARTCHAR U+90DB +ENCODING 37083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +3CF8 +3288 +2990 +2990 +40A0 +3E90 +0488 +0888 +0E88 +78C8 +08B0 +0880 +1880 +0000 +ENDCHAR +STARTCHAR U+90DC +ENCODING 37084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +287C +2A44 +3F44 +4848 +8848 +0950 +FFC8 +0044 +7F42 +4142 +4162 +4154 +7F48 +4140 +0040 +ENDCHAR +STARTCHAR U+90DD +ENCODING 37085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087C +0A44 +7F44 +0848 +0948 +FFD0 +1448 +1444 +5642 +5542 +9562 +2454 +2448 +4C40 +8040 +ENDCHAR +STARTCHAR U+90DE +ENCODING 37086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0800 +3F3E +2122 +2122 +3F24 +2122 +2121 +3F21 +2021 +20A1 +2521 +2221 +2F2E +7120 +0020 +ENDCHAR +STARTCHAR U+90DF +ENCODING 37087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +041F +7FD1 +0412 +2494 +2494 +5552 +4E31 +0411 +0A19 +0916 +1090 +2050 +4050 +0000 +0000 +ENDCHAR +STARTCHAR U+90E0 +ENCODING 37088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +7F7F +0821 +7F22 +4924 +7F24 +4922 +7F21 +0821 +2831 +182A +1824 +2420 +4220 +0000 +0000 +ENDCHAR +STARTCHAR U+90E1 +ENCODING 37089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F78 +0948 +0950 +7FD0 +0960 +3F50 +0848 +0F44 +1944 +1964 +2958 +4F40 +0940 +0000 +ENDCHAR +STARTCHAR U+90E2 +ENCODING 37090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +2290 +3E90 +00A0 +7E90 +0888 +0888 +3E88 +08C8 +08B0 +0E80 +7080 +0000 +ENDCHAR +STARTCHAR U+90E3 +ENCODING 37091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +7FDF +0411 +7FD2 +4054 +5F54 +0212 +0411 +7FD1 +041A +0414 +0410 +1410 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+90E4 +ENCODING 37092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +12F8 +2288 +4890 +0890 +14A0 +1290 +2288 +7E88 +2288 +22C8 +3EB0 +2280 +2080 +0000 +ENDCHAR +STARTCHAR U+90E5 +ENCODING 37093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +7F7F +4222 +4224 +7E28 +4224 +4222 +7E21 +4231 +422A +7E24 +1820 +2420 +4220 +0000 +0000 +ENDCHAR +STARTCHAR U+90E6 +ENCODING 37094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FFFE +0012 +0052 +7BF4 +4A54 +4A58 +4A54 +6B54 +5AD2 +4A52 +4A5A +4A54 +4A50 +5AD0 +0010 +ENDCHAR +STARTCHAR U+90E7 +ENCODING 37095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +3F7C +2244 +2248 +3E48 +0150 +7FC8 +4144 +4942 +4942 +4962 +4954 +1448 +1240 +2140 +4140 +ENDCHAR +STARTCHAR U+90E8 +ENCODING 37096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0878 +7F48 +2250 +1250 +1460 +7F50 +0048 +3E44 +2244 +2264 +2258 +3E40 +2240 +0000 +ENDCHAR +STARTCHAR U+90E9 +ENCODING 37097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +113F +0A11 +0412 +0A14 +1514 +7FD2 +0811 +1F91 +3091 +5F99 +1096 +1F90 +1090 +1110 +0000 +0000 +ENDCHAR +STARTCHAR U+90EA +ENCODING 37098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +043F +7F91 +0412 +3F94 +0494 +7FD2 +0491 +3F91 +1011 +7FD9 +1115 +0A12 +0410 +3B90 +0000 +0000 +ENDCHAR +STARTCHAR U+90EB +ENCODING 37099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +117C +7FC4 +4944 +4948 +7F48 +4950 +5148 +7F44 +1042 +2942 +FFE2 +0854 +0848 +0840 +0840 +ENDCHAR +STARTCHAR U+90EC +ENCODING 37100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +7FDF +0411 +3F92 +0414 +7FD4 +0012 +3F91 +2091 +3F99 +2095 +3F92 +2090 +2110 +0000 +0000 +ENDCHAR +STARTCHAR U+90ED +ENCODING 37101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +7FF8 +0048 +1F50 +1150 +1F60 +0050 +3F48 +0244 +0744 +7C64 +0458 +0440 +0C40 +0000 +ENDCHAR +STARTCHAR U+90EF +ENCODING 37103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +297C +2A44 +4C44 +9448 +1248 +2150 +C848 +0844 +2942 +2A42 +5462 +1254 +2148 +C140 +0040 +ENDCHAR +STARTCHAR U+90F0 +ENCODING 37104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E1F +2409 +2409 +25E9 +3D2A +252C +252A +3D29 +2529 +2529 +24CD +7CCA +0528 +0408 +0000 +0000 +ENDCHAR +STARTCHAR U+90F1 +ENCODING 37105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +113F +0A11 +3F92 +1114 +1112 +1111 +7FD1 +1111 +111A +1114 +2110 +4110 +0110 +0000 +0000 +ENDCHAR +STARTCHAR U+90F2 +ENCODING 37106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +043F +3F91 +0411 +1512 +1514 +3592 +4E51 +0411 +0E19 +1515 +2492 +4450 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+90F3 +ENCODING 37107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11BF +2091 +6092 +3B94 +2094 +2092 +3F91 +1211 +1219 +1215 +1252 +2250 +43D0 +0000 +0000 +ENDCHAR +STARTCHAR U+90F4 +ENCODING 37108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +113E +1122 +1124 +FFE4 +1128 +3328 +3BA4 +5562 +5522 +9922 +1132 +112A +1124 +1120 +1120 +ENDCHAR +STARTCHAR U+90F5 +ENCODING 37109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0180 +3E78 +0448 +3FD0 +1550 +1560 +7FD0 +1548 +1544 +3FC4 +0464 +0458 +0740 +3840 +0000 +ENDCHAR +STARTCHAR U+90F6 +ENCODING 37110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +087C +0F4C +324C +12CC +1CFE +3F94 +0094 +3FFC +2280 +2280 +22C2 +3EFE +227C +0000 +ENDCHAR +STARTCHAR U+90F7 +ENCODING 37111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13B8 +16A8 +66A8 +2BB0 +1AB0 +12A8 +1BA8 +2B24 +7AA4 +12E4 +1378 +2C20 +4020 +0000 +ENDCHAR +STARTCHAR U+90F8 +ENCODING 37112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4100 +227C +1444 +7F48 +4948 +4950 +7F50 +4948 +4944 +7F44 +0844 +0864 +FFD4 +0848 +0840 +0840 +ENDCHAR +STARTCHAR U+90F9 +ENCODING 37113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F7E +2122 +3F24 +2128 +3F30 +2128 +3F24 +0A22 +0922 +7FAA +0824 +0C20 +1220 +2120 +0000 +0000 +ENDCHAR +STARTCHAR U+90FA +ENCODING 37114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +3D24 +4492 +2400 +19FE +1102 +61FE +1000 +3DFF +4511 +25FF +1900 +1101 +61FF +0000 +0000 +ENDCHAR +STARTCHAR U+90FB +ENCODING 37115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F00 +113F +1F11 +1112 +1F14 +111C +5F12 +4011 +7FD9 +1255 +2493 +4910 +2490 +1250 +0000 +0000 +ENDCHAR +STARTCHAR U+90FC +ENCODING 37116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +3FBF +0491 +7FD2 +0014 +3F92 +2091 +3F91 +0411 +3F99 +2415 +7FD2 +0410 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+90FD +ENCODING 37117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0878 +3F48 +0950 +0A50 +7FE0 +0850 +1F48 +3144 +5F44 +1164 +1158 +1F40 +1140 +0000 +ENDCHAR +STARTCHAR U+90FE +ENCODING 37118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FBC +4024 +5F24 +5128 +5F28 +5130 +5F28 +4824 +7FE2 +4922 +5222 +4E34 +5128 +7FA0 +0020 +ENDCHAR +STARTCHAR U+90FF +ENCODING 37119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FBF +2491 +2492 +3F94 +2012 +2F91 +2891 +2891 +2F99 +2895 +2F92 +2890 +4890 +0F90 +0000 +0000 +ENDCHAR +STARTCHAR U+9100 +ENCODING 37120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +113F +1111 +7FD1 +1112 +0814 +0812 +7FD1 +0811 +1F91 +3099 +5096 +1090 +1F90 +1090 +0000 +0000 +ENDCHAR +STARTCHAR U+9101 +ENCODING 37121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A1F +0A11 +7BD1 +0A12 +0A14 +7BD2 +0011 +3F91 +2091 +3F99 +2096 +3F90 +2090 +4190 +0000 +0000 +ENDCHAR +STARTCHAR U+9102 +ENCODING 37122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7778 +5548 +5550 +7750 +0060 +3E50 +0048 +7F48 +1048 +1E48 +2270 +0240 +0C40 +0000 +ENDCHAR +STARTCHAR U+9103 +ENCODING 37123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0E00 +113F +2091 +5F52 +0014 +3892 +2A91 +3A91 +2A99 +3A95 +2A92 +2890 +2890 +5910 +0000 +0000 +ENDCHAR +STARTCHAR U+9104 +ENCODING 37124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFC +1444 +1544 +7FC8 +5548 +5550 +5548 +7F44 +4942 +0842 +7F62 +0854 +0F48 +F840 +4040 +ENDCHAR +STARTCHAR U+9105 +ENCODING 37125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03BF +3C11 +0411 +3F92 +2494 +2492 +3F91 +0411 +7FD1 +4559 +5F56 +4150 +4050 +4090 +0000 +0000 +ENDCHAR +STARTCHAR U+9106 +ENCODING 37126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FC0 +447F +1F11 +0412 +3F94 +2494 +3F92 +2491 +3F91 +0415 +7FD2 +0410 +0410 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+9107 +ENCODING 37127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0BDF +1049 +304A +57EC +120A +1209 +13E9 +1489 +1089 +13ED +114A +1228 +1418 +0000 +0000 +ENDCHAR +STARTCHAR U+9108 +ENCODING 37128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7BDF +0A11 +4A52 +3194 +2094 +4052 +3F91 +0419 +0415 +3F92 +0410 +0410 +0A10 +3190 +0000 +0000 +ENDCHAR +STARTCHAR U+9109 +ENCODING 37129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1200 +213E +47D2 +9454 +F7D8 +2454 +4452 +97D2 +F412 +1512 +149A +2554 +4610 +8410 +0000 +0000 +ENDCHAR +STARTCHAR U+910B +ENCODING 37131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +153F +6491 +4452 +75D4 +4454 +75D2 +0411 +3FD1 +0091 +1115 +0A12 +0410 +0A10 +71D0 +0000 +0000 +ENDCHAR +STARTCHAR U+910D +ENCODING 37133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FC0 +405F +5F51 +5152 +1F14 +1112 +1F11 +1511 +0411 +7FD9 +1116 +2090 +4050 +4050 +0000 +0000 +ENDCHAR +STARTCHAR U+910E +ENCODING 37134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +081F +3FD1 +2052 +3FD4 +2052 +3FD1 +2051 +3FD1 +0A99 +2955 +2812 +4850 +0790 +0000 +0000 +ENDCHAR +STARTCHAR U+910F +ENCODING 37135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FDF +2011 +3F92 +2014 +3FD2 +3291 +5111 +1491 +1859 +0096 +7FF0 +1090 +0890 +0310 +0000 +0000 +ENDCHAR +STARTCHAR U+9110 +ENCODING 37136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +7FDF +0812 +1114 +3E14 +0412 +0891 +7FD1 +0011 +3F91 +249A +3F94 +2490 +3F90 +0000 +0000 +ENDCHAR +STARTCHAR U+9111 +ENCODING 37137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FC0 +003F +1111 +2A52 +7BD4 +0014 +7FD2 +0011 +3F91 +2091 +3F9A +2094 +3F90 +2090 +0000 +0000 +ENDCHAR +STARTCHAR U+9112 +ENCODING 37138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1F78 +2948 +6B50 +3F50 +2960 +0E50 +1048 +1F48 +2948 +6B48 +3F70 +2940 +1640 +0000 +ENDCHAR +STARTCHAR U+9114 +ENCODING 37140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1FBF +3091 +5092 +1F94 +1012 +1F91 +1011 +1FD1 +0059 +5556 +5550 +0050 +0190 +0000 +0000 +ENDCHAR +STARTCHAR U+9115 +ENCODING 37141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +108F +23E9 +2229 +4BEA +2A29 +13E9 +1229 +2C09 +7609 +0669 +0B89 +0A0E +1228 +23E8 +4008 +ENDCHAR +STARTCHAR U+9116 +ENCODING 37142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FBF +2091 +2091 +3F92 +0014 +3F92 +2091 +3F91 +2091 +3F99 +2096 +3F90 +1110 +60D0 +0000 +0000 +ENDCHAR +STARTCHAR U+9117 +ENCODING 37143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +043F +7FD1 +0012 +1F14 +1112 +1F11 +0011 +7FD1 +4051 +5F55 +5152 +5F50 +4050 +4050 +0000 +0000 +ENDCHAR +STARTCHAR U+9118 +ENCODING 37144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +3FDF +2209 +3FCA +3FEC +224A +3FC9 +2209 +3FC9 +3249 +3FCD +324A +5FC8 +1248 +0000 +0000 +ENDCHAR +STARTCHAR U+9119 +ENCODING 37145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F78 +2148 +3F50 +7FD0 +0860 +3F50 +2148 +2F48 +2B48 +2F48 +2170 +3F40 +2140 +0000 +ENDCHAR +STARTCHAR U+911A +ENCODING 37146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +7FFF +1111 +0012 +3F94 +2092 +3F91 +2091 +3F9A +0414 +7FD0 +0A10 +1110 +60D0 +0000 +0000 +ENDCHAR +STARTCHAR U+911B +ENCODING 37147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +24BF +4911 +2492 +1254 +3F92 +2491 +3F91 +2491 +3F9A +0414 +7FD0 +1510 +2490 +4450 +0000 +0000 +ENDCHAR +STARTCHAR U+911C +ENCODING 37148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0200 +3FFF +2911 +3FD2 +2954 +2952 +3FD1 +3111 +3559 +3995 +3112 +5550 +1DD0 +0000 +0000 +ENDCHAR +STARTCHAR U+911D +ENCODING 37149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7BFF +0851 +6B52 +0854 +6B52 +35D1 +0A11 +1111 +229A +4D54 +0110 +1E90 +0110 +7E10 +0000 +0000 +ENDCHAR +STARTCHAR U+911E +ENCODING 37150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +FFFC +2244 +3E44 +0848 +7F48 +4950 +7F48 +0844 +7F42 +0842 +3E62 +0854 +0F48 +7840 +2040 +ENDCHAR +STARTCHAR U+911F +ENCODING 37151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +7FFF +0411 +3F92 +2494 +3F92 +2491 +3F91 +0451 +7FD1 +0119 +7FD5 +2112 +0310 +0000 +0000 +ENDCHAR +STARTCHAR U+9120 +ENCODING 37152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FC0 +043F +7FD1 +5552 +5554 +0014 +1F12 +0011 +7FD1 +101A +1F14 +0110 +0110 +0610 +0000 +0000 +ENDCHAR +STARTCHAR U+9121 +ENCODING 37153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +3F9F +2092 +3F94 +2092 +3F91 +2011 +3F11 +2011 +3FD9 +0855 +7F52 +2A50 +4990 +0000 +0000 +ENDCHAR +STARTCHAR U+9122 +ENCODING 37154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FBC +0424 +17A4 +1428 +FFE8 +2030 +3F28 +2024 +3FA2 +00A2 +AAA2 +AAB4 +00A8 +02A0 +0120 +ENDCHAR +STARTCHAR U+9123 +ENCODING 37155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +7F7C +2244 +1444 +FFC8 +0048 +7F50 +4148 +7F44 +4142 +7F42 +0862 +FFD4 +0848 +0840 +0840 +ENDCHAR +STARTCHAR U+9124 +ENCODING 37156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F80 +209F +3F91 +2092 +3F94 +0012 +7FD1 +4A51 +7FD1 +0019 +3F95 +0A12 +0410 +3B90 +0000 +0000 +ENDCHAR +STARTCHAR U+9125 +ENCODING 37157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +063E +04B6 +3FB4 +20B4 +3EB8 +20B4 +30B4 +3FF2 +30F2 +3372 +05FE +0AFC +28F0 +23B0 +0100 +ENDCHAR +STARTCHAR U+9126 +ENCODING 37158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +101F +3FD1 +6A92 +2A94 +7FD2 +2A91 +2A91 +7FD1 +001A +2A94 +4A50 +4A50 +0010 +0000 +0000 +ENDCHAR +STARTCHAR U+9127 +ENCODING 37159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E5F +0291 +2532 +18D4 +6072 +3F91 +0011 +3F91 +2091 +2091 +3F91 +1111 +0BF6 +7C10 +0010 +ENDCHAR +STARTCHAR U+9128 +ENCODING 37160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2A10 +7F3E +4954 +5D08 +6B14 +4922 +3FF8 +2008 +3FF8 +7FFC +4104 +7FFC +4001 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+9129 +ENCODING 37161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F80 +00BF +7F91 +0092 +3F94 +0012 +7B91 +2291 +7B91 +0119 +7F95 +2112 +1110 +0310 +0000 +0000 +ENDCHAR +STARTCHAR U+912A +ENCODING 37162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +3FFF +0951 +7FD2 +4914 +7FF2 +1171 +3FD1 +2051 +3FD9 +3FD5 +2052 +3FD0 +4030 +0000 +0000 +ENDCHAR +STARTCHAR U+912B +ENCODING 37163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +113F +7FD1 +5552 +4E54 +7FD2 +0011 +3F91 +2091 +209A +3F94 +2090 +2090 +3F90 +0000 +0000 +ENDCHAR +STARTCHAR U+912C +ENCODING 37164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +211F +1211 +3F92 +0494 +0912 +3F91 +1091 +2111 +7FD9 +0056 +5550 +5550 +0050 +0190 +0000 +0000 +ENDCHAR +STARTCHAR U+912D +ENCODING 37165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +0A78 +7FC8 +0C50 +3F50 +2F60 +3350 +3F48 +3F44 +0444 +7FE4 +0A58 +1140 +2040 +0000 +ENDCHAR +STARTCHAR U+912E +ENCODING 37166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +17C0 +617F +5152 +5A54 +64D2 +3F91 +2091 +3F99 +2095 +3F92 +2090 +3F90 +1110 +2090 +0000 +0000 +ENDCHAR +STARTCHAR U+912F +ENCODING 37167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +0A3C +7FE4 +0424 +3FA8 +0428 +7FF0 +24A8 +1524 +FFE2 +0022 +3FA2 +20B4 +20A8 +3FA0 +20A0 +ENDCHAR +STARTCHAR U+9130 +ENCODING 37168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +2578 +1648 +7FD0 +0E50 +1560 +75D0 +1FC8 +2D48 +6D48 +1FC8 +1170 +2140 +4140 +0000 +ENDCHAR +STARTCHAR U+9131 +ENCODING 37169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0380 +7C3C +24A4 +1524 +7FE8 +0C28 +1530 +24A8 +FFE4 +24A2 +24A2 +3FA2 +24B4 +24A8 +3FA0 +20A0 +ENDCHAR +STARTCHAR U+9132 +ENCODING 37170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7778 +5548 +7750 +0050 +3E60 +2A50 +3E48 +2A48 +3E48 +0848 +7F70 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+9133 +ENCODING 37171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F9F +5291 +5292 +7394 +1218 +7394 +5292 +7391 +5291 +7399 +1016 +1050 +1050 +1FD0 +0000 +0000 +ENDCHAR +STARTCHAR U+9134 +ENCODING 37172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A00 +4A7F +2A91 +7FD2 +1114 +7FD2 +0411 +7FD1 +0411 +7FD9 +1516 +2490 +4450 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+9135 +ENCODING 37173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F1F +1111 +1F12 +0014 +7BD8 +4A54 +7BD2 +0011 +0411 +7FD9 +1516 +2490 +4C50 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+9136 +ENCODING 37174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +070F +0889 +1749 +202A +7FFC +2AAA +2729 +3FE9 +0009 +1FCD +104A +1FC8 +1048 +1FC8 +0000 +0000 +ENDCHAR +STARTCHAR U+9137 +ENCODING 37175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0F12 +3FF6 +3BF6 +3FF4 +3FF4 +30F4 +3FE4 +1FA2 +10A2 +1FB2 +11BE +09A4 +0B20 +3FE0 +0000 +ENDCHAR +STARTCHAR U+9138 +ENCODING 37176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +7FDF +1109 +3F8A +2A8C +3F8E +0009 +7FC9 +4449 +4749 +190D +050A +0208 +1C08 +0000 +0000 +ENDCHAR +STARTCHAR U+9139 +ENCODING 37177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FF80 +483C +7BA4 +4AA4 +7AA8 +4928 +FAB0 +0828 +7F24 +14A2 +2522 +4E22 +15B4 +24A8 +C420 +0420 +ENDCHAR +STARTCHAR U+913A +ENCODING 37178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +3FEF +2489 +3FEA +248C +3FEA +2009 +2FE9 +2929 +2FED +292A +4FE8 +0448 +0828 +0000 +0000 +ENDCHAR +STARTCHAR U+913B +ENCODING 37179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +7FFF +1111 +7FD2 +1114 +2A92 +7FF1 +3F91 +2491 +3F99 +2495 +3F92 +7FD0 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+913C +ENCODING 37180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0012 +199E +3FD6 +1114 +3FFC +3AD4 +2C56 +1F92 +1092 +1F96 +1F9E +1094 +1F90 +0990 +1890 +0000 +ENDCHAR +STARTCHAR U+913D +ENCODING 37181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +3FEF +2009 +2FE9 +292A +2FEA +292C +2FEA +2109 +3FE9 +2489 +296E +2108 +47C8 +4108 +0FE8 +ENDCHAR +STARTCHAR U+913E +ENCODING 37182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FE0 +043F +1F91 +1E92 +1394 +7FF2 +6A71 +2891 +0F91 +0419 +0F95 +1512 +0210 +1DD0 +0000 +0000 +ENDCHAR +STARTCHAR U+913F +ENCODING 37183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +7FDF +1111 +7BD2 +4A54 +7BD2 +3F91 +2491 +3F99 +2495 +3F92 +0410 +7FD0 +0410 +0000 +0000 +ENDCHAR +STARTCHAR U+9140 +ENCODING 37184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +113F +7FD1 +1111 +1F12 +0014 +2E94 +2A92 +6AD1 +2A91 +6ED5 +0012 +4A50 +4A50 +0000 +0000 +ENDCHAR +STARTCHAR U+9141 +ENCODING 37185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F00 +423F +7FD1 +4052 +7FD4 +3DD2 +2111 +3FD1 +4211 +7FD9 +4455 +7FD2 +1298 +63D0 +0000 +0000 +ENDCHAR +STARTCHAR U+9143 +ENCODING 37187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +7F7C +0844 +7FC4 +48C8 +AA48 +0850 +2A48 +0044 +7F42 +5542 +5562 +5554 +5548 +7F40 +0040 +ENDCHAR +STARTCHAR U+9144 +ENCODING 37188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +7FFF +1111 +7BD2 +4A54 +7BD2 +2211 +7FD1 +2219 +3FD5 +2212 +3FD0 +2210 +3FD0 +0000 +0000 +ENDCHAR +STARTCHAR U+9145 +ENCODING 37189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2480 +3FBF +1211 +3F92 +6214 +3F92 +3F91 +2211 +3F91 +7FD9 +5155 +6ED2 +4A50 +4ED0 +0000 +0000 +ENDCHAR +STARTCHAR U+9146 +ENCODING 37190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2A00 +7F3C +AAA4 +FFA4 +AAA8 +FFA8 +AAB0 +FFA8 +0024 +FFA2 +0122 +7FA2 +4134 +7F28 +2220 +FFA0 +ENDCHAR +STARTCHAR U+9147 +ENCODING 37191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +5280 +7BDF +1092 +7BD4 +5292 +18D1 +3F91 +2091 +3F99 +2095 +3F92 +2090 +3F90 +4050 +0000 +0000 +ENDCHAR +STARTCHAR U+9148 +ENCODING 37192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FE0 +3DEF +35AA +2D6C +020A +3FE9 +2489 +3FE9 +24A9 +3FED +310A +3DC8 +5128 +1DE8 +0000 +0000 +ENDCHAR +STARTCHAR U+9149 +ENCODING 37193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0480 +0480 +3FF8 +2488 +2498 +2498 +2878 +3008 +3FF8 +2008 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+914A +ENCODING 37194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F80 +0CFC +0C10 +3F10 +2D10 +2D10 +3710 +3710 +2310 +3F10 +2110 +3F10 +2130 +0000 +ENDCHAR +STARTCHAR U+914B +ENCODING 37195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0420 +0440 +7FFC +0280 +1FF0 +1290 +14B0 +1870 +1010 +1FF0 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+914C +ENCODING 37196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FC0 +0C40 +0C78 +3F88 +2D88 +2D48 +3728 +3728 +2308 +3F08 +2108 +3F08 +2130 +0000 +ENDCHAR +STARTCHAR U+914D +ENCODING 37197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0C08 +0C08 +3F08 +2D78 +2D48 +3740 +3740 +2340 +3F40 +2144 +3F44 +213C +0000 +ENDCHAR +STARTCHAR U+914E +ENCODING 37198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7F88 +0C08 +0C08 +3FFC +2D08 +2D48 +3728 +3728 +2308 +3F08 +2108 +3F08 +2118 +0000 +ENDCHAR +STARTCHAR U+914F +ENCODING 37199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE20 +2820 +2824 +FEA6 +AABC +AAE4 +ABA4 +AEA4 +C2B4 +82A8 +FEA0 +8282 +8282 +FE7E +8200 +ENDCHAR +STARTCHAR U+9150 +ENCODING 37200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FF88 +147C +1510 +7F90 +5510 +5514 +55FE +5710 +6110 +4110 +7F10 +4110 +4110 +7F10 +4110 +ENDCHAR +STARTCHAR U+9152 +ENCODING 37202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +0FFC +0940 +4140 +27F8 +2548 +0548 +1558 +1638 +1408 +27F8 +2408 +47F8 +4408 +0000 +ENDCHAR +STARTCHAR U+9153 +ENCODING 37203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +03C0 +0E70 +381C +E3C7 +0000 +1FF8 +0010 +FFFF +0240 +3FFC +2244 +3C7C +2004 +3FFC +2004 +3FFC +ENDCHAR +STARTCHAR U+9154 +ENCODING 37204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7F40 +0CF0 +0C50 +3F50 +2D54 +2D94 +372C +3720 +23FC +3F20 +2120 +3F20 +2120 +0000 +ENDCHAR +STARTCHAR U+9155 +ENCODING 37205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F01 +147E +1408 +1408 +7F7F +5508 +5508 +677F +4108 +4108 +7F08 +4108 +4109 +7F0F +0000 +0000 +ENDCHAR +STARTCHAR U+9156 +ENCODING 37206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FA0 +0C20 +0C20 +3FFC +2DA8 +2D20 +2F20 +3330 +3130 +3F50 +2154 +3F94 +210C +0000 +ENDCHAR +STARTCHAR U+9157 +ENCODING 37207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +FE00 +2844 +2844 +FEAA +AAAA +AAAA +AE92 +A292 +C2AA +82AA +FEA6 +82C6 +8282 +FEFE +8282 +ENDCHAR +STARTCHAR U+9158 +ENCODING 37208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF0 +0C50 +0C50 +3F54 +2D94 +2D0C +37F8 +3748 +2350 +3F30 +2130 +3F48 +2184 +0000 +ENDCHAR +STARTCHAR U+9159 +ENCODING 37209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FE64 +2834 +2814 +FE04 +AAC4 +AA64 +AA24 +CE04 +8207 +823C +FEE4 +8204 +8204 +FE04 +0004 +ENDCHAR +STARTCHAR U+915A +ENCODING 37210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +FE48 +2848 +2848 +FE84 +AA84 +AB02 +AEFC +C244 +8244 +FE44 +8244 +8244 +FE44 +8294 +0108 +ENDCHAR +STARTCHAR U+915B +ENCODING 37211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE7E +2800 +2800 +FE00 +AA00 +AAFF +AA24 +CE24 +8224 +8224 +FE24 +8224 +8265 +FE45 +00C3 +ENDCHAR +STARTCHAR U+915D +ENCODING 37213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FF88 +147C +1400 +7F00 +5504 +55FE +5510 +5310 +6110 +4120 +7F20 +4144 +41FE +7F02 +4100 +ENDCHAR +STARTCHAR U+915E +ENCODING 37214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +FF90 +1410 +1410 +7F14 +55FE +5510 +5510 +5728 +6128 +4128 +7F28 +4144 +4154 +7F82 +4100 +ENDCHAR +STARTCHAR U+915F +ENCODING 37215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F08 +1408 +1408 +140F +7F08 +5508 +5508 +557F +6741 +4141 +7F41 +4141 +417F +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+9160 +ENCODING 37216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +14FF +1402 +1402 +7F7A +554A +554A +554A +674A +417A +7F02 +4102 +4102 +7F0C +0000 +0000 +ENDCHAR +STARTCHAR U+9161 +ENCODING 37217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +FF90 +1410 +147E +7F42 +5584 +5520 +5520 +5724 +6128 +4130 +7F20 +4122 +4122 +7F1E +4100 +ENDCHAR +STARTCHAR U+9162 +ENCODING 37218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FC0 +0C40 +0C7C +3FA0 +2DA0 +2D3C +3720 +3720 +233C +3F20 +2120 +3F20 +2120 +0000 +ENDCHAR +STARTCHAR U+9163 +ENCODING 37219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +7FC8 +0C48 +0C48 +3FFC +2D48 +2D48 +3748 +3778 +2348 +3F48 +2148 +3F78 +2148 +0000 +ENDCHAR +STARTCHAR U+9164 +ENCODING 37220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE20 +2820 +2824 +FFFE +AA20 +AA20 +AA28 +AEFC +C288 +8288 +FE88 +8288 +8288 +FEF8 +8288 +ENDCHAR +STARTCHAR U+9165 +ENCODING 37221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7FB0 +0CE0 +0C20 +3F20 +2DFC +2D70 +3770 +3770 +23A8 +3FA8 +2124 +3F20 +2120 +0000 +ENDCHAR +STARTCHAR U+9167 +ENCODING 37223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +28FF +2881 +FE81 +AA04 +AA04 +AAFF +CE04 +8264 +8234 +FE14 +8204 +8204 +FE04 +001C +ENDCHAR +STARTCHAR U+9168 +ENCODING 37224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0412 +3F92 +0410 +7FFF +0010 +7FD0 +0A10 +7FD0 +4A52 +53D4 +6049 +5F55 +4043 +7FC1 +0000 +0000 +ENDCHAR +STARTCHAR U+9169 +ENCODING 37225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FA0 +0C38 +0C48 +3FD0 +2D30 +2D20 +3740 +37F8 +2348 +3F48 +2148 +3F78 +2148 +0000 +ENDCHAR +STARTCHAR U+916A +ENCODING 37226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FA0 +0C38 +0C48 +3FD0 +2D30 +2D30 +3748 +37FC +2348 +3F48 +2148 +3F78 +2148 +0000 +ENDCHAR +STARTCHAR U+916C +ENCODING 37228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +7E88 +18A8 +18A8 +7EA8 +5BF8 +5BF8 +5EA8 +6EA8 +46A8 +7EA8 +4328 +7F28 +4208 +0000 +ENDCHAR +STARTCHAR U+916D +ENCODING 37229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FF10 +28FF +2820 +FE60 +AA7E +AAC2 +ABC2 +CE7E +8242 +8242 +FE7E +8242 +8242 +FE42 +004E +ENDCHAR +STARTCHAR U+916E +ENCODING 37230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +FEFE +2882 +2882 +FEFE +AA82 +AA82 +AEBA +C2AA +82AA +82AA +FEBA +8282 +8282 +FE8A +8284 +ENDCHAR +STARTCHAR U+916F +ENCODING 37231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0140 +FFC4 +144C +1450 +7F62 +5542 +557E +5504 +577E +6144 +4144 +7F7C +4144 +4144 +7F7C +4144 +ENDCHAR +STARTCHAR U+9170 +ENCODING 37232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +FF90 +1450 +147C +7F50 +5590 +5514 +55FE +5728 +6128 +4128 +7F28 +412A +414A +7F86 +4100 +ENDCHAR +STARTCHAR U+9171 +ENCODING 37233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +44F8 +2488 +0D90 +1660 +6440 +0484 +FFFE +0440 +3FF8 +2448 +3838 +27C8 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+9172 +ENCODING 37234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0C48 +0C48 +3F48 +2D78 +2D08 +2FF0 +3720 +33F8 +3F20 +2120 +3FFC +2100 +0000 +ENDCHAR +STARTCHAR U+9173 +ENCODING 37235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F28 +0CC8 +0C30 +3F28 +2DFC +2D04 +3778 +3748 +2378 +3F48 +2178 +3F48 +2158 +0000 +ENDCHAR +STARTCHAR U+9174 +ENCODING 37236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE20 +2850 +2850 +FE8E +AB04 +AAF8 +AA20 +AE24 +C3FE +8220 +FE70 +82AC +8324 +FEA0 +8240 +ENDCHAR +STARTCHAR U+9175 +ENCODING 37237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F24 +0CFC +0C28 +3F28 +2DFC +2D20 +37F8 +3788 +2310 +3FFC +2110 +3F10 +2130 +0000 +ENDCHAR +STARTCHAR U+9176 +ENCODING 37238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +FF44 +287E +2A80 +FF04 +AA7E +AA44 +AE64 +C254 +83FE +8284 +FEA4 +8294 +82FC +FE04 +8218 +ENDCHAR +STARTCHAR U+9177 +ENCODING 37239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +7FD0 +0C50 +0C7C +3F90 +2D10 +2DFC +3700 +3778 +2348 +3F48 +2148 +3F78 +2148 +0000 +ENDCHAR +STARTCHAR U+9178 +ENCODING 37240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FB0 +0C28 +0CFC +3F50 +2D54 +2DAC +3738 +3748 +2350 +3FB0 +2130 +3F48 +2184 +0000 +ENDCHAR +STARTCHAR U+9179 +ENCODING 37241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +FE1C +29E0 +2804 +FF24 +AAA8 +AA08 +ABFE +AE08 +C288 +8248 +FE48 +8208 +8208 +FE28 +8210 +ENDCHAR +STARTCHAR U+917A +ENCODING 37242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +FE12 +29FF +2810 +FE10 +AAFE +AA92 +AA92 +CEFE +8292 +8292 +FEFE +8292 +8292 +FE92 +0096 +ENDCHAR +STARTCHAR U+917B +ENCODING 37243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0003 +FE0E +29F8 +2891 +FEDB +AA4A +AAFF +AA01 +CE06 +8208 +82FF +FE08 +8208 +8208 +FE08 +0038 +ENDCHAR +STARTCHAR U+917D +ENCODING 37245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +FFFE +2828 +28AA +FE6C +AA28 +AAFE +AA80 +AE80 +C280 +8280 +FE80 +8280 +8280 +FF00 +8200 +ENDCHAR +STARTCHAR U+917E +ENCODING 37246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +FFFE +2800 +2804 +7DDE +5554 +5554 +5554 +6D54 +45DC +4554 +7D54 +4554 +4554 +7D54 +4554 +ENDCHAR +STARTCHAR U+917F +ENCODING 37247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +FF94 +147E +1444 +7F44 +557C +5544 +5744 +617C +4160 +4152 +7F54 +4148 +4148 +7F64 +4142 +ENDCHAR +STARTCHAR U+9180 +ENCODING 37248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7F24 +1444 +14FF +7F44 +5544 +557F +5544 +6744 +417F +5D44 +4144 +7F7F +4140 +0000 +0000 +ENDCHAR +STARTCHAR U+9181 +ENCODING 37249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +FE7C +28C4 +288C +FEF8 +AA08 +ABFF +AA10 +CE92 +82D6 +825C +FE38 +825C +82D6 +FF93 +0070 +ENDCHAR +STARTCHAR U+9182 +ENCODING 37250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +7F90 +0C90 +0C90 +3FFC +2E90 +2ED8 +37F8 +37B8 +22D4 +3ED4 +2290 +3E90 +2290 +0000 +ENDCHAR +STARTCHAR U+9183 +ENCODING 37251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +29FF +2844 +FE54 +AA92 +ABFF +AB93 +CE92 +82FE +8292 +FE92 +82FE +8211 +FE13 +000E +ENDCHAR +STARTCHAR U+9184 +ENCODING 37252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F40 +147F +1481 +7F21 +557D +5511 +5511 +637D +4111 +4155 +5D55 +417D +7F01 +4102 +0000 +0000 +ENDCHAR +STARTCHAR U+9185 +ENCODING 37253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE10 +2814 +29FE +FE00 +AA84 +AA48 +ABFE +AE00 +C204 +82FE +FE84 +8284 +8284 +FEFC +8284 +ENDCHAR +STARTCHAR U+9186 +ENCODING 37254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0048 +FE44 +287E +29E0 +FE36 +AA18 +AA6D +AB87 +CE48 +8244 +827E +FFE0 +8236 +8218 +FE6D +0187 +ENDCHAR +STARTCHAR U+9187 +ENCODING 37255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FFC +0C00 +0C78 +3F48 +2D78 +2D00 +3778 +3708 +2310 +3FFC +2110 +3F10 +2130 +0000 +ENDCHAR +STARTCHAR U+9189 +ENCODING 37257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F20 +0CFC +0C48 +3F48 +2D68 +2DB4 +3724 +3320 +23FC +3F20 +2120 +3F20 +2120 +0000 +ENDCHAR +STARTCHAR U+918A +ENCODING 37258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEEE +2822 +28AA +FE44 +AAAA +AAAA +AA00 +CEEE +8222 +82AA +FEAA +8244 +82AA +FEAA +0111 +ENDCHAR +STARTCHAR U+918B +ENCODING 37259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +7FD0 +0C50 +0CF8 +3F50 +2D50 +2DFC +3700 +3778 +2348 +3F78 +2148 +3F78 +2148 +0000 +ENDCHAR +STARTCHAR U+918C +ENCODING 37260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +FEFE +2884 +2884 +FEFC +AA84 +AA84 +AAFC +AE10 +C290 +8292 +FEF4 +8298 +82B2 +FED2 +828E +ENDCHAR +STARTCHAR U+918D +ENCODING 37261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0C48 +0C78 +3F48 +2D78 +2D00 +2FFC +3710 +2350 +3F5C +2150 +3FB0 +211C +0000 +ENDCHAR +STARTCHAR U+918E +ENCODING 37262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0005 +FF05 +2804 +28FF +FE84 +AAF4 +AA84 +AAF5 +CE95 +8296 +8296 +FEF4 +828C +828D +FE97 +0112 +ENDCHAR +STARTCHAR U+918F +ENCODING 37263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F10 +1410 +14FE +7F11 +5512 +55FF +5530 +677E +41A2 +4122 +5D3E +4122 +7F22 +413E +0000 +0000 +ENDCHAR +STARTCHAR U+9190 +ENCODING 37264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7FB8 +0CA8 +0CA8 +3FE8 +2EB8 +2EA8 +3FE8 +3778 +2768 +3FE8 +2348 +3E48 +2298 +0000 +ENDCHAR +STARTCHAR U+9191 +ENCODING 37265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +FEFE +2812 +2850 +FE5C +AA50 +AAB0 +AB0E +AE7C +C244 +827C +FE44 +827C +8244 +FE54 +8248 +ENDCHAR +STARTCHAR U+9192 +ENCODING 37266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0C48 +0C78 +3F48 +2D78 +2D50 +377C +3790 +2378 +3F10 +2110 +3FFC +2100 +0000 +ENDCHAR +STARTCHAR U+9193 +ENCODING 37267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +28FE +2892 +FE92 +AA10 +AA38 +AA29 +CE6B +82CE +8200 +FEFE +82AA +82AA +FEAA +01FF +ENDCHAR +STARTCHAR U+9194 +ENCODING 37268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C10 +7891 +1093 +FDBA +3928 +746C +D0C6 +1383 +0000 +FFFF +0240 +7FFE +4242 +7C7E +4002 +7FFE +ENDCHAR +STARTCHAR U+9195 +ENCODING 37269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +28FF +2800 +FE7E +AA42 +AA42 +AA7E +CE00 +82FF +8281 +FE81 +82FF +8281 +FE81 +00FF +ENDCHAR +STARTCHAR U+9197 +ENCODING 37271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0068 +7F28 +0CD4 +0C54 +3F88 +2DFC +2D50 +3750 +37FC +2150 +3F50 +2194 +3F94 +210C +0000 +ENDCHAR +STARTCHAR U+9198 +ENCODING 37272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +287C +2810 +FEFE +AA20 +AA64 +AA4E +CEFA +8200 +82FE +FEAA +82AA +82AA +FEAA +01FF +ENDCHAR +STARTCHAR U+9199 +ENCODING 37273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0050 +7C57 +2991 +2911 +7DD7 +6D11 +6DD7 +6C00 +6CFE +4444 +7C28 +4410 +7C28 +44C6 +0000 +0000 +ENDCHAR +STARTCHAR U+919A +ENCODING 37274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +FF10 +2852 +2934 +FEB8 +AA10 +AA7E +AF90 +C2B0 +82B8 +82D6 +FE92 +8290 +8290 +FF46 +823C +ENDCHAR +STARTCHAR U+919B +ENCODING 37275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0488 +FE88 +2BFE +2888 +FE20 +AA50 +AA8E +AB04 +C6F8 +8220 +FE20 +82F8 +8220 +FE24 +83FE +0000 +ENDCHAR +STARTCHAR U+919C +ENCODING 37276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F40 +0CF8 +0CA8 +3FF8 +2DA8 +2DF8 +3760 +3768 +2368 +3FB4 +21BC +3F24 +211C +0000 +ENDCHAR +STARTCHAR U+919D +ENCODING 37277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E42 +2824 +28FF +7E10 +6AFF +6A10 +6A10 +66FF +4220 +7E7F +4288 +4208 +7E08 +42FF +0000 +0000 +ENDCHAR +STARTCHAR U+919E +ENCODING 37278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FE7C +2844 +2844 +FE7C +AA44 +AA44 +AA7C +CE00 +82FE +82AA +FEAA +82AA +82AA +FEAA +01FF +ENDCHAR +STARTCHAR U+919F +ENCODING 37279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +2A2A +0808 +1414 +2222 +7FFF +4001 +5FFD +0220 +1FFC +1414 +1BEC +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+91A0 +ENCODING 37280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +2810 +28FE +7E92 +6A92 +6BFF +6A28 +6644 +4382 +7EFF +42AA +42AA +7EAA +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+91A1 +ENCODING 37281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE10 +29FF +2925 +FE65 +AAC4 +AB87 +AA40 +CE7F +82D0 +839E +FE10 +821E +8210 +FE10 +0010 +ENDCHAR +STARTCHAR U+91A2 +ENCODING 37282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +7E80 +18FC +1900 +7EF0 +5A90 +5AF0 +7E00 +67F8 +4768 +7F68 +4368 +7FFC +4200 +0000 +ENDCHAR +STARTCHAR U+91A3 +ENCODING 37283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FE14 +29FE +2910 +7D7C +5514 +55FE +5514 +6D7C +4510 +457C +7D44 +4544 +4544 +7E7C +4444 +ENDCHAR +STARTCHAR U+91A4 +ENCODING 37284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +083C +4FC8 +2950 +1FFC +6910 +08B0 +7FFC +0280 +1FF0 +14B0 +18F0 +1FF0 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+91A5 +ENCODING 37285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +2828 +29FF +7F29 +6B29 +6BFF +6A00 +66FE +4200 +7FFF +4238 +4254 +7E92 +4311 +0000 +0000 +ENDCHAR +STARTCHAR U+91A6 +ENCODING 37286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FE48 +2878 +2884 +FF29 +ABEF +AA10 +AA28 +CE44 +8393 +8220 +FEC8 +8232 +82C6 +FE1C +00F0 +ENDCHAR +STARTCHAR U+91A7 +ENCODING 37287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +2900 +293E +7D22 +6D22 +6D3E +6D00 +6D77 +6D55 +4555 +4555 +7D77 +4500 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+91A8 +ENCODING 37288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +FF88 +147F +1400 +7F55 +5549 +5555 +557F +6708 +417F +4151 +7F55 +417B +4141 +7F41 +0043 +ENDCHAR +STARTCHAR U+91AA +ENCODING 37290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0CD8 +0D68 +3ED8 +2F68 +2E20 +36D0 +372C +22D0 +3E20 +22C8 +3E30 +22C0 +0000 +ENDCHAR +STARTCHAR U+91AB +ENCODING 37291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F70 +2E54 +359C +3FF8 +2A70 +3FD8 +7FFC +0280 +1FF0 +14D0 +1FF0 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+91AC +ENCODING 37292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4420 +44FE +7F4C +44B4 +05C4 +7FFF +2424 +441C +4404 +7FFF +3FFE +2142 +3E7E +3FFE +2002 +3FFE +ENDCHAR +STARTCHAR U+91AD +ENCODING 37293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0250 +FF54 +28D8 +2850 +FFFE +AA88 +AA50 +AAFC +AE20 +C2FC +8220 +FFFE +8220 +8250 +FE8E +8304 +ENDCHAR +STARTCHAR U+91AE +ENCODING 37294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FE60 +2894 +28FE +FF90 +AAFC +AA90 +AA90 +AEFC +C290 +8294 +FEFE +8280 +8354 +FF52 +8202 +ENDCHAR +STARTCHAR U+91AF +ENCODING 37295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FFC +0C50 +0DF8 +3E00 +2EA8 +2EA8 +36AC +3704 +22F8 +3EE8 +22E8 +3FFC +2200 +0000 +ENDCHAR +STARTCHAR U+91B0 +ENCODING 37296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEFE +2828 +28FE +FEAA +AABA +AA00 +AA7C +CE44 +827C +8244 +FE7C +8210 +83FF +FE10 +0010 +ENDCHAR +STARTCHAR U+91B1 +ENCODING 37297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DF4 +1029 +1146 +1083 +7F00 +55DC +5455 +6DD7 +4520 +45FF +7D52 +444C +444C +7C52 +45A1 +ENDCHAR +STARTCHAR U+91B2 +ENCODING 37298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +FEFE +28AA +28FE +FEAA +AAFE +AA00 +AAFF +CE80 +82BE +8280 +FEFF +82AA +82AC +FF36 +0063 +ENDCHAR +STARTCHAR U+91B3 +ENCODING 37299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +FF29 +29FF +2810 +FEFE +AA10 +ABFF +AA44 +CE6C +8228 +83FF +FE10 +82FE +8210 +FE10 +0010 +ENDCHAR +STARTCHAR U+91B4 +ENCODING 37300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +7FF8 +0D68 +0DF8 +3F68 +2FF8 +2E00 +37FC +36F8 +2288 +3EF8 +2250 +3FFC +2200 +0000 +ENDCHAR +STARTCHAR U+91B5 +ENCODING 37301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F38 +0CFC +0CB8 +3EE8 +2E98 +2EFC +36A0 +36F4 +22B8 +3ED8 +2334 +3F54 +2230 +0000 +ENDCHAR +STARTCHAR U+91B6 +ENCODING 37302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE38 +286C +28C6 +FE83 +AA7C +AA00 +AAEE +CEAA +82AA +82EE +FE00 +8244 +8244 +FEEE +01AB +ENDCHAR +STARTCHAR U+91B7 +ENCODING 37303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +29FF +2844 +7FFF +6A00 +6AFE +6A82 +66FE +4282 +42FE +7E00 +4352 +7F4D +427C +0000 +0000 +ENDCHAR +STARTCHAR U+91B8 +ENCODING 37304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FFC +0C88 +0D54 +3FFC +2E50 +2EF8 +3650 +37FC +2268 +3FD0 +2250 +3E68 +2384 +0000 +ENDCHAR +STARTCHAR U+91B9 +ENCODING 37305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +2810 +29FF +7F55 +6B39 +6A54 +6A00 +67FF +4220 +7FFF +4329 +4329 +7F29 +432B +0000 +0000 +ENDCHAR +STARTCHAR U+91BA +ENCODING 37306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +7FE0 +0DFC +0C20 +3EF8 +2EB8 +2EE8 +36F8 +3620 +22F8 +3FFC +2200 +3EE8 +2354 +0000 +ENDCHAR +STARTCHAR U+91BB +ENCODING 37307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FEFE +2810 +287C +FE00 +AAFF +AA01 +AA7D +CE10 +82FE +8200 +FEFF +8202 +82FF +FEAA +00E6 +ENDCHAR +STARTCHAR U+91BC +ENCODING 37308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +FE44 +29FF +2844 +FE7C +AA82 +AABB +ABAA +CEAA +82AA +82BA +FF83 +8200 +82AA +FFAB +0101 +ENDCHAR +STARTCHAR U+91BD +ENCODING 37309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FF7F +1408 +147F +7F49 +556D +5548 +5524 +6700 +417F +4155 +7F55 +4155 +4155 +7F55 +007F +ENDCHAR +STARTCHAR U+91BE +ENCODING 37310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7DFF +2924 +29FF +7D6E +6DB5 +6D24 +6D92 +6D54 +45FF +7D38 +4554 +7E92 +4410 +0000 +0000 +ENDCHAR +STARTCHAR U+91BF +ENCODING 37311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +FEFF +28A2 +28F7 +FEA2 +AAF7 +AAAA +AAA2 +CE90 +82A4 +82A8 +FE92 +82FD +8308 +FE2A +0049 +ENDCHAR +STARTCHAR U+91C0 +ENCODING 37312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7FFC +0DDC +0D54 +3FDC +2E50 +2FFC +36F8 +3650 +23FC +3E68 +23D0 +3E68 +2384 +0000 +ENDCHAR +STARTCHAR U+91C1 +ENCODING 37313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1BB0 +1290 +1BB0 +1BB0 +3FFC +2FE8 +5FF0 +14D0 +1FF0 +1FF0 +07C0 +0FF0 +724C +0CC0 +0000 +ENDCHAR +STARTCHAR U+91C2 +ENCODING 37314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0003 +FDFE +2922 +2894 +FEFE +AAAA +AAFE +AA00 +CEE2 +82AF +82E2 +FEAA +82EA +8282 +FEE2 +0086 +ENDCHAR +STARTCHAR U+91C3 +ENCODING 37315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FEEF +2800 +28EF +FEA9 +AA10 +AAFF +AAA8 +CEFF +82A9 +82FF +FEA4 +82B7 +8324 +FE35 +0063 +ENDCHAR +STARTCHAR U+91C5 +ENCODING 37317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +FD29 +29EF +2800 +FFFF +AA00 +AAF4 +AA44 +CFF7 +829D +82F5 +FE97 +82F2 +8297 +FEF5 +0595 +ENDCHAR +STARTCHAR U+91C6 +ENCODING 37318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +01C0 +3F10 +1110 +0920 +0940 +7FFC +0100 +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+91C7 +ENCODING 37319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +00E8 +3F08 +1110 +08A0 +0840 +0100 +7FFC +0380 +0540 +1930 +610C +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+91C8 +ENCODING 37320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +0CF8 +7988 +4988 +2A88 +2CF8 +7FA8 +08A0 +1CA0 +1AA0 +2A90 +4910 +0908 +0A04 +0000 +ENDCHAR +STARTCHAR U+91C9 +ENCODING 37321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0320 +7D20 +4920 +2A20 +2CF8 +7FA8 +18A8 +1CA8 +1AF8 +29A8 +29A8 +48A8 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+91CA +ENCODING 37322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +F9FC +1088 +5450 +3820 +1050 +FE8E +1324 +3020 +39FC +5420 +5024 +93FE +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+91CB +ENCODING 37323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +7DF8 +4B68 +2BF8 +2C40 +7FF8 +1840 +1DFC +1A90 +2BFC +2840 +49F8 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+91CC +ENCODING 37324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF0 +0100 +3FF8 +0100 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+91CD +ENCODING 37325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +3FF8 +0100 +7FFC +0000 +ENDCHAR +STARTCHAR U+91CE +ENCODING 37326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2A90 +2A60 +3E20 +2BFC +2A28 +3E30 +0820 +3E20 +0820 +0E20 +7020 +0060 +0000 +ENDCHAR +STARTCHAR U+91CF +ENCODING 37327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +0FE0 +0FE0 +7FFC +0FE0 +0920 +0FE0 +0FE0 +1FF0 +0100 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+91D0 +ENCODING 37328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E7C +7FD0 +1C30 +2ACC +5FF8 +17F0 +1490 +17F0 +17F0 +1FF8 +2080 +5FFC +0000 +0000 +ENDCHAR +STARTCHAR U+91D1 +ENCODING 37329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1830 +67CC +0100 +3FF8 +0100 +0920 +0520 +0540 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+91D3 +ENCODING 37331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +1C40 +1640 +3340 +2140 +7E40 +C840 +0840 +7F40 +0840 +4A40 +6A40 +2840 +0F41 +3863 +E03E +ENDCHAR +STARTCHAR U+91D4 +ENCODING 37332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C7E +1604 +330C +2008 +7E18 +C810 +0830 +7F20 +0820 +4A60 +6A40 +2840 +0F41 +3863 +E03E +ENDCHAR +STARTCHAR U+91D5 +ENCODING 37333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +14FF +2202 +4104 +3E08 +0808 +0808 +7F08 +0808 +0808 +2A08 +1C08 +0828 +7F10 +0000 +0000 +ENDCHAR +STARTCHAR U+91D6 +ENCODING 37334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1448 +1248 +2248 +5C48 +0848 +7E48 +0848 +2A48 +1C88 +1888 +0F08 +7230 +0000 +ENDCHAR +STARTCHAR U+91D7 +ENCODING 37335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +1422 +2222 +4022 +0022 +3E22 +0822 +0822 +7F22 +0922 +4A22 +2A22 +2822 +0F82 +7002 +0006 +ENDCHAR +STARTCHAR U+91D8 +ENCODING 37336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1420 +1220 +2220 +5C20 +0820 +7E20 +0820 +2A20 +1C20 +1820 +0E20 +7060 +0000 +ENDCHAR +STARTCHAR U+91D9 +ENCODING 37337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1C20 +1620 +3320 +2120 +7E30 +C838 +082C +7F26 +0823 +4A20 +6A20 +2820 +0F20 +3820 +E020 +ENDCHAR +STARTCHAR U+91DA +ENCODING 37338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1C20 +1620 +3320 +20FC +7E24 +C824 +0824 +7F24 +0824 +4A64 +6A44 +2844 +0EC5 +3885 +E183 +ENDCHAR +STARTCHAR U+91DB +ENCODING 37339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +1240 +23F8 +5C48 +0848 +7E48 +0848 +2A48 +1C88 +1888 +0F08 +7230 +0000 +ENDCHAR +STARTCHAR U+91DC +ENCODING 37340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +0C30 +3248 +0180 +02C0 +0C30 +7FEC +0100 +1FF0 +0920 +0520 +0540 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+91DD +ENCODING 37341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1420 +1220 +2220 +5DFC +0820 +7E20 +0820 +2A20 +1C20 +1820 +0E20 +7020 +0000 +ENDCHAR +STARTCHAR U+91DE +ENCODING 37342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0870 +1C10 +1610 +3310 +2010 +7E10 +C810 +0810 +7F38 +0828 +4A28 +6A28 +286C +0F44 +38C6 +E183 +ENDCHAR +STARTCHAR U+91DF +ENCODING 37343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0870 +1410 +1210 +2250 +5C50 +0850 +7E50 +0890 +2A88 +1C88 +1908 +0F04 +7204 +0000 +ENDCHAR +STARTCHAR U+91E1 +ENCODING 37345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0420 +0910 +1110 +0280 +0440 +1FF0 +610C +1FF0 +0920 +0520 +0540 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+91E2 +ENCODING 37346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +2842 +4444 +0048 +7C4F +1041 +1041 +7C41 +1041 +5441 +3881 +1102 +7C14 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+91E3 +ENCODING 37347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +1278 +2288 +5C88 +0948 +7E28 +0828 +2A08 +1C08 +1808 +0E08 +7030 +0000 +ENDCHAR +STARTCHAR U+91E4 +ENCODING 37348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +1C0C +1618 +3330 +2062 +7E06 +C80C +0818 +7F30 +0861 +4A03 +6A06 +280C +0F18 +3830 +E0E0 +ENDCHAR +STARTCHAR U+91E5 +ENCODING 37349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +6610 +4010 +FC54 +1054 +1054 +FED6 +1092 +9593 +D511 +5010 +1E10 +7010 +C070 +ENDCHAR +STARTCHAR U+91E6 +ENCODING 37350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0800 +14F8 +1288 +2288 +5C88 +0888 +7E88 +0888 +2A88 +1C88 +1888 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+91E7 +ENCODING 37351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0888 +14A8 +12A8 +22A8 +5CA8 +08A8 +7EA8 +08A8 +2AA8 +1D28 +1928 +0E08 +7408 +0000 +ENDCHAR +STARTCHAR U+91E8 +ENCODING 37352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083E +1402 +2202 +4104 +3E08 +0808 +08FF +0808 +3E08 +0808 +2A08 +1C08 +0828 +7F10 +0000 +0000 +ENDCHAR +STARTCHAR U+91E9 +ENCODING 37353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C7C +1644 +3344 +2044 +7E54 +C854 +0854 +7F54 +0844 +4A44 +6A44 +2844 +0EC5 +3885 +E183 +ENDCHAR +STARTCHAR U+91EA +ENCODING 37354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +29FE +4410 +0010 +0010 +7C10 +1010 +13FF +7C10 +1010 +1410 +5410 +5010 +1E10 +7010 +0030 +ENDCHAR +STARTCHAR U+91EB +ENCODING 37355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1400 +223E +4100 +0000 +3E7F +0820 +0820 +3E3F +0801 +2A01 +1C02 +0814 +7F08 +0000 +0000 +ENDCHAR +STARTCHAR U+91EC +ENCODING 37356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C7F +1608 +3308 +2008 +7E08 +C808 +087F +7F08 +0808 +4A08 +6A08 +2808 +0F08 +3808 +E008 +ENDCHAR +STARTCHAR U+91ED +ENCODING 37357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C00 +16FE +3310 +2010 +7E10 +C810 +0810 +7F10 +0810 +4A10 +6A10 +2810 +0E10 +39FF +E000 +ENDCHAR +STARTCHAR U+91EE +ENCODING 37358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +1C04 +1604 +3304 +20FF +7E14 +C814 +0814 +7F34 +0824 +4A24 +6A64 +28C4 +0E04 +3804 +E01C +ENDCHAR +STARTCHAR U+91EF +ENCODING 37359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +6610 +41FF +FC40 +1040 +1040 +FC40 +1040 +9440 +D440 +5040 +1C60 +703E +C000 +ENDCHAR +STARTCHAR U+91F0 +ENCODING 37360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1CFE +1612 +3312 +2052 +7E52 +C852 +08D2 +7E92 +0812 +4A32 +6A22 +2822 +0F66 +38C4 +E19C +ENDCHAR +STARTCHAR U+91F1 +ENCODING 37361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1610 +3310 +20FF +7E10 +C810 +0810 +7F10 +0838 +4A28 +6A28 +286C +0F44 +38C6 +E183 +ENDCHAR +STARTCHAR U+91F3 +ENCODING 37363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1440 +22FF +4100 +0000 +3E3E +0802 +0804 +3E08 +0810 +2A20 +1C41 +0841 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+91F4 +ENCODING 37364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1414 +2212 +4110 +3E7F +0810 +0810 +7F10 +0810 +4910 +2A10 +1C09 +0805 +7F03 +0000 +0000 +ENDCHAR +STARTCHAR U+91F5 +ENCODING 37365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1488 +12C8 +22A8 +5C90 +0850 +7E50 +0860 +2A20 +1C60 +1890 +0F08 +7204 +0000 +ENDCHAR +STARTCHAR U+91F6 +ENCODING 37366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A0 +14A0 +12A8 +22B8 +5CE8 +09A8 +7EA8 +08A8 +2AB8 +1CA0 +1884 +0E84 +707C +0000 +ENDCHAR +STARTCHAR U+91F7 +ENCODING 37367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1610 +3310 +2010 +7E10 +C8FE +0810 +7F10 +0810 +4A10 +6A10 +2810 +0E10 +39FF +E000 +ENDCHAR +STARTCHAR U+91F8 +ENCODING 37368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2820 +4420 +003F +7C21 +1041 +1081 +1141 +7C22 +1014 +5408 +3810 +1020 +7DC0 +0000 +0000 +ENDCHAR +STARTCHAR U+91F9 +ENCODING 37369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1610 +3310 +20FF +7E22 +C822 +0822 +7F66 +0844 +4A44 +6AFC +280E +0F1B +3831 +E0E0 +ENDCHAR +STARTCHAR U+91FB +ENCODING 37371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1C20 +1620 +3320 +20FC +7E24 +C824 +08A4 +7F64 +0824 +4A34 +6A54 +2854 +0EC5 +3885 +E183 +ENDCHAR +STARTCHAR U+91FC +ENCODING 37372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1448 +1248 +2348 +5CC8 +0848 +7E68 +0858 +2A4C +1C88 +1888 +0F08 +7230 +0000 +ENDCHAR +STARTCHAR U+91FD +ENCODING 37373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +3838 +2CE8 +6488 +40A8 +FCA8 +10A8 +10A8 +FCA8 +10AC +94A4 +D4A4 +50A4 +1DA6 +7122 +C303 +ENDCHAR +STARTCHAR U+91FF +ENCODING 37375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +14E0 +1280 +2280 +5CFC +0890 +7E90 +0890 +2A90 +1D10 +1910 +0E10 +7010 +0000 +ENDCHAR +STARTCHAR U+9200 +ENCODING 37376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C92 +6692 +4092 +FC92 +1092 +10FE +FE80 +1080 +9480 +D480 +5081 +1EC3 +707E +C000 +ENDCHAR +STARTCHAR U+9201 +ENCODING 37377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1610 +32FF +2020 +7E20 +C820 +083E +7F22 +0822 +4A22 +6A62 +2846 +0F44 +38C4 +E19C +ENDCHAR +STARTCHAR U+9202 +ENCODING 37378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +4410 +01FF +7D11 +1111 +1111 +1010 +7C10 +1010 +5428 +3849 +1089 +7D0F +0000 +0000 +ENDCHAR +STARTCHAR U+9203 +ENCODING 37379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +29FF +4444 +0044 +7C44 +1044 +11FF +1044 +7C44 +1044 +5444 +3884 +1104 +7C04 +0000 +0000 +ENDCHAR +STARTCHAR U+9204 +ENCODING 37380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +1C04 +1664 +3334 +2014 +7E04 +C864 +0834 +7F14 +0804 +4A07 +6A3C +28E4 +0E04 +3804 +E004 +ENDCHAR +STARTCHAR U+9205 +ENCODING 37381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C3E +1622 +3322 +2022 +7E3E +C822 +0822 +7F22 +083E +4A22 +6A22 +2822 +0F62 +3842 +E0CE +ENDCHAR +STARTCHAR U+9206 +ENCODING 37382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C24 +1624 +3324 +2066 +7E42 +C842 +08C3 +7E00 +0820 +4A24 +6A24 +2866 +0F42 +384E +E0FB +ENDCHAR +STARTCHAR U+9207 +ENCODING 37383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +66FE +4010 +FC10 +1010 +1010 +FDFF +1010 +9438 +D428 +506C +1E44 +70C6 +C183 +ENDCHAR +STARTCHAR U+9209 +ENCODING 37385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1030 +3810 +2C10 +66FE +4092 +FC92 +1092 +10BA +FCAA +10AA +94C6 +D482 +5082 +1C82 +7082 +C086 +ENDCHAR +STARTCHAR U+920A +ENCODING 37386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3818 +2C08 +6608 +4020 +FC20 +1020 +1022 +FCA3 +10A1 +94A1 +D5A0 +5122 +1C22 +7032 +C01E +ENDCHAR +STARTCHAR U+920C +ENCODING 37388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1610 +32FE +2012 +7E12 +C812 +0812 +7EFF +0828 +4A28 +6A28 +286C +0E44 +38C6 +E183 +ENDCHAR +STARTCHAR U+920D +ENCODING 37389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +143C +13E0 +2228 +5CA8 +08A8 +7EA8 +08F8 +2AA8 +1CA0 +1824 +0E24 +701C +0000 +ENDCHAR +STARTCHAR U+920E +ENCODING 37390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +1480 +12F8 +2308 +5E48 +0848 +7EC8 +08A8 +2BD8 +1C08 +1808 +0E08 +7030 +0000 +ENDCHAR +STARTCHAR U+920F +ENCODING 37391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11F9 +2809 +4409 +0009 +01F9 +7D01 +1101 +11F9 +7C09 +1009 +5409 +3809 +1011 +7CE1 +0000 +0000 +ENDCHAR +STARTCHAR U+9210 +ENCODING 37392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1428 +2244 +4082 +0101 +3E7C +0800 +0800 +7F00 +08FE +4A02 +2A02 +2804 +0F04 +7008 +0008 +ENDCHAR +STARTCHAR U+9211 +ENCODING 37393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08FC +1480 +1280 +22F8 +5CC8 +08C8 +7EA8 +08B0 +2A90 +1CB0 +1928 +0F48 +7284 +0000 +ENDCHAR +STARTCHAR U+9212 +ENCODING 37394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +14FC +2244 +4044 +3E48 +0848 +085E +7F42 +08A2 +0AA4 +4A94 +2A88 +2888 +0F14 +7922 +0241 +ENDCHAR +STARTCHAR U+9213 +ENCODING 37395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +381C +2CF0 +6610 +4010 +FC10 +1010 +11FF +FC10 +1010 +9410 +D410 +5010 +1E10 +70FE +C000 +ENDCHAR +STARTCHAR U+9214 +ENCODING 37396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1420 +12B0 +22A8 +5CA8 +0924 +7F2C +0868 +2A10 +1C10 +1820 +0EC0 +7300 +0000 +ENDCHAR +STARTCHAR U+9215 +ENCODING 37397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F0 +1490 +1290 +2290 +5C90 +09FC +7E90 +0890 +2A90 +1C90 +1890 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+9216 +ENCODING 37398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +3848 +2C48 +64CC +4084 +FD86 +1303 +10FC +FC24 +1024 +9424 +D464 +5044 +1CCC +7188 +C338 +ENDCHAR +STARTCHAR U+9217 +ENCODING 37399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2820 +4440 +0084 +7D02 +123E +17C9 +7C88 +1088 +5488 +5488 +5488 +1109 +1D09 +620F +0C00 +ENDCHAR +STARTCHAR U+9218 +ENCODING 37400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +65FF +4010 +FC10 +11FE +1082 +FCC6 +106C +9438 +D410 +5038 +1C6C +70C6 +C183 +ENDCHAR +STARTCHAR U+9219 +ENCODING 37401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1410 +221F +4110 +3E10 +087F +0841 +0841 +3E22 +0814 +2A08 +1C14 +0822 +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+921A +ENCODING 37402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +2908 +4508 +0108 +7D08 +1108 +11CE +1108 +7D08 +1108 +5529 +3929 +1129 +7DEF +0000 +0000 +ENDCHAR +STARTCHAR U+921C +ENCODING 37404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3820 +2C20 +65FF +4020 +FC20 +1020 +1068 +FC48 +1058 +94D0 +D492 +51B2 +1C22 +707F +C0C1 +ENDCHAR +STARTCHAR U+921D +ENCODING 37405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3850 +2C50 +6650 +40FE +FC90 +1110 +1010 +FC10 +11FF +9410 +D410 +5010 +1C10 +7010 +C010 +ENDCHAR +STARTCHAR U+921E +ENCODING 37406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +12F8 +2288 +5D08 +08E8 +7E08 +0828 +2AC8 +1C08 +1808 +0E08 +7030 +0000 +ENDCHAR +STARTCHAR U+9223 +ENCODING 37411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2C10 +6410 +4090 +FC9E +1090 +1090 +FCFE +1002 +9402 +D402 +5002 +1C06 +7004 +C01C +ENDCHAR +STARTCHAR U+9224 +ENCODING 37412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C7E +1642 +3342 +2042 +7E42 +C842 +087E +7F42 +0842 +4A42 +6A42 +2842 +0F42 +387E +E000 +ENDCHAR +STARTCHAR U+9225 +ENCODING 37413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C11 +6491 +4093 +FC92 +1192 +1110 +FC38 +1028 +9428 +D428 +506C +1C44 +70C6 +C183 +ENDCHAR +STARTCHAR U+9226 +ENCODING 37414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1610 +3310 +20FF +7E10 +C810 +0810 +7F38 +0828 +4A28 +6A6C +2844 +0F64 +38D6 +E193 +ENDCHAR +STARTCHAR U+9227 +ENCODING 37415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +45FF +0000 +7C00 +107C +1044 +1044 +7C44 +1044 +5444 +3845 +1085 +7D07 +0000 +0000 +ENDCHAR +STARTCHAR U+9228 +ENCODING 37416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C7E +1600 +3300 +2000 +7E00 +C8FF +0824 +7F24 +0824 +4A24 +6A24 +2824 +0F65 +3845 +E0C3 +ENDCHAR +STARTCHAR U+9229 +ENCODING 37417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1400 +12F8 +2288 +5C88 +0888 +7EF8 +0888 +2A80 +1C80 +1900 +0F00 +7200 +0000 +ENDCHAR +STARTCHAR U+922C +ENCODING 37420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1488 +1288 +2288 +5CF8 +08A8 +7EA0 +08A0 +2AA0 +1C90 +1910 +0F08 +7204 +0000 +ENDCHAR +STARTCHAR U+922D +ENCODING 37421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +2420 +27BE +2421 +7FBF +0080 +0140 +0220 +0FF8 +7087 +0FF8 +1084 +0888 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+922E +ENCODING 37422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +4082 +FCFE +1080 +10A0 +FCA6 +10AC +94B8 +D4A0 +51A0 +1D21 +7333 +C01E +ENDCHAR +STARTCHAR U+922F +ENCODING 37423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1692 +3292 +2092 +7E92 +C8FE +0810 +7E10 +0810 +4A92 +6A92 +2892 +0E92 +38FE +E000 +ENDCHAR +STARTCHAR U+9230 +ENCODING 37424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6400 +4010 +FC10 +10FE +1092 +FC92 +1092 +9492 +D492 +5096 +1C10 +7010 +C010 +ENDCHAR +STARTCHAR U+9231 +ENCODING 37425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +2882 +4482 +00FE +7C88 +1088 +1088 +10FF +7C88 +1088 +5488 +3888 +10A5 +7DC3 +0000 +0000 +ENDCHAR +STARTCHAR U+9232 +ENCODING 37426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +2802 +45FC +0080 +7C84 +10A4 +10A4 +10A4 +7CA4 +10A4 +54AC +38AC +10B2 +7D01 +0000 +0000 +ENDCHAR +STARTCHAR U+9233 +ENCODING 37427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2C04 +6404 +40F4 +FC94 +1094 +1094 +FC94 +1094 +94F4 +D404 +5004 +1C04 +7004 +C01C +ENDCHAR +STARTCHAR U+9234 +ENCODING 37428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +14A0 +12A0 +2310 +5DE8 +0804 +7FF8 +0848 +2A48 +1C48 +1870 +0E40 +7040 +0000 +ENDCHAR +STARTCHAR U+9235 +ENCODING 37429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2C10 +6610 +40FE +FC92 +1092 +10BA +FCAA +10AA +94C6 +D482 +5082 +1C82 +7082 +C08E +ENDCHAR +STARTCHAR U+9236 +ENCODING 37430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3820 +2C64 +6646 +40C2 +FC9F +11F1 +1000 +FC00 +10FE +9482 +D482 +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+9237 +ENCODING 37431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1420 +1220 +23FC +5C20 +0820 +7EF8 +0888 +2A88 +1C88 +1888 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+9238 +ENCODING 37432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +3826 +2C22 +65FF +4020 +FC20 +1022 +1072 +FC56 +10D4 +949C +D588 +531C +1C34 +7066 +C1C3 +ENDCHAR +STARTCHAR U+9239 +ENCODING 37433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +65FF +4111 +FD12 +1110 +11FE +FD42 +1146 +9564 +D52C +5118 +1D34 +7266 +C0C3 +ENDCHAR +STARTCHAR U+923A +ENCODING 37434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2800 +45FF +0010 +7C10 +1010 +1010 +7E10 +11FE +1410 +5414 +5412 +5010 +1E10 +71FF +0000 +ENDCHAR +STARTCHAR U+923C +ENCODING 37436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1C20 +1620 +337F +2050 +7ED0 +C890 +081E +7F10 +0810 +4A10 +6A1E +2810 +0F10 +3810 +E010 +ENDCHAR +STARTCHAR U+923D +ENCODING 37437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2820 +45FE +8250 +7C90 +11FE +1292 +7C92 +1092 +1092 +5496 +3892 +1010 +FE10 +0000 +0000 +ENDCHAR +STARTCHAR U+923E +ENCODING 37438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1610 +3210 +20FE +7E92 +C892 +0892 +7E92 +08FE +4A92 +6A92 +2892 +0E92 +3892 +E0FE +ENDCHAR +STARTCHAR U+923F +ENCODING 37439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +14A8 +12A8 +22A8 +5CA8 +08F8 +7EA8 +08A8 +2AA8 +1CA8 +18F8 +0E88 +7000 +0000 +ENDCHAR +STARTCHAR U+9240 +ENCODING 37440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +147F +1249 +2149 +4049 +3E49 +087F +0849 +7F49 +0849 +4949 +4A7F +2808 +0F08 +7008 +0008 +ENDCHAR +STARTCHAR U+9242 +ENCODING 37442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +65FF +4111 +FD11 +1111 +11FF +FC10 +1090 +94D0 +D470 +5030 +1C78 +70CC +C387 +ENDCHAR +STARTCHAR U+9243 +ENCODING 37443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +3880 +2CFE +6590 +4110 +FC10 +1010 +11FF +FC10 +1010 +9438 +D428 +506C +1C44 +70C6 +C183 +ENDCHAR +STARTCHAR U+9244 +ENCODING 37444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +14A0 +12A0 +22F8 +5CA0 +0920 +7FFC +0820 +2A60 +1C50 +1890 +0F08 +7204 +0000 +ENDCHAR +STARTCHAR U+9245 +ENCODING 37445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1480 +1280 +22F8 +5C88 +0888 +7E88 +08F8 +2A88 +1C80 +1880 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+9246 +ENCODING 37446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +1610 +3310 +201F +7E10 +C810 +0810 +7F10 +087E +4A42 +6A42 +2842 +0F42 +3842 +E07E +ENDCHAR +STARTCHAR U+9247 +ENCODING 37447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +3880 +2C80 +65FF +4100 +FD10 +1296 +109A +FCB2 +10D2 +9596 +D490 +5090 +1C81 +70C3 +C07E +ENDCHAR +STARTCHAR U+9248 +ENCODING 37448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1420 +12FC +2288 +5D40 +0840 +7E48 +0870 +2A40 +1C40 +1844 +0E44 +703C +0000 +ENDCHAR +STARTCHAR U+9249 +ENCODING 37449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1420 +13FC +2220 +5D28 +08C8 +7E50 +0830 +2A20 +1C30 +1848 +0FF4 +7004 +0000 +ENDCHAR +STARTCHAR U+924A +ENCODING 37450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FE +2C22 +6622 +4062 +FC46 +10C4 +119C +FC00 +10FE +9482 +D482 +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+924B +ENCODING 37451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +12F8 +2288 +5DE8 +08A8 +7EA8 +08E8 +2AB0 +1C80 +1884 +0E84 +707C +0000 +ENDCHAR +STARTCHAR U+924C +ENCODING 37452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +28FC +4410 +0010 +7C10 +11FF +1010 +1038 +7C54 +1092 +5511 +3810 +1010 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+924D +ENCODING 37453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1060 +3830 +2C10 +6442 +4042 +FC46 +1044 +114C +FD4A +115B +9551 +D560 +5040 +1CC2 +7366 +C03C +ENDCHAR +STARTCHAR U+924E +ENCODING 37454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3890 +2C90 +6490 +40FE +FD90 +1110 +1010 +FC10 +10FE +9410 +D410 +5010 +1C10 +71FF +C000 +ENDCHAR +STARTCHAR U+924F +ENCODING 37455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C7C +1644 +3344 +2044 +7E7C +C844 +0844 +7F44 +0844 +4A7C +6A44 +2844 +0F44 +3844 +E1FF +ENDCHAR +STARTCHAR U+9250 +ENCODING 37456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1440 +1240 +2240 +5C80 +08F8 +7F88 +0888 +2A88 +1C88 +1888 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+9251 +ENCODING 37457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1C18 +1610 +337E +2042 +7E42 +C842 +0842 +7F7E +0842 +4A42 +6A42 +2842 +0F42 +387E +E000 +ENDCHAR +STARTCHAR U+9252 +ENCODING 37458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1410 +2208 +417F +3E08 +0808 +0808 +0808 +3E7F +0808 +2A08 +1C08 +0808 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+9253 +ENCODING 37459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +1440 +227F +4148 +3E88 +0808 +087F +0849 +3E49 +0849 +2A49 +1C4B +0808 +7F08 +0000 +0000 +ENDCHAR +STARTCHAR U+9254 +ENCODING 37460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2900 +4508 +0108 +7D08 +117F +1149 +1149 +7D49 +1149 +554B +3908 +1108 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+9256 +ENCODING 37462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +28FE +4544 +0028 +7C10 +1028 +1044 +1082 +7D11 +1008 +5444 +3820 +1010 +7C08 +0000 +0000 +ENDCHAR +STARTCHAR U+9257 +ENCODING 37463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +1490 +1290 +23FC +5C90 +0890 +7E90 +08F0 +2A90 +1C90 +1890 +0EF0 +7090 +0000 +ENDCHAR +STARTCHAR U+9258 +ENCODING 37464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0828 +1C28 +16FE +322A +202A +7EFE +C8A8 +08A8 +7EFF +0829 +4A29 +6A29 +286B +0E48 +38C8 +E188 +ENDCHAR +STARTCHAR U+9259 +ENCODING 37465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1CFE +1682 +3282 +2082 +7E82 +C882 +0882 +FE82 +08FE +4A00 +6A44 +2844 +0EC6 +3882 +E183 +ENDCHAR +STARTCHAR U+925A +ENCODING 37466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +1B38 +2AA8 +26A8 +7AA8 +12A8 +7EA8 +12A8 +57A8 +38B8 +3120 +1D20 +6220 +0000 +ENDCHAR +STARTCHAR U+925B +ENCODING 37467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +0810 +1490 +1290 +2288 +5D08 +0904 +7EF8 +0888 +2A88 +1C88 +1888 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+925C +ENCODING 37468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3844 +2CC4 +6484 +40BF +FD84 +11A4 +12B4 +FC94 +1094 +9484 +D484 +5084 +1C84 +7084 +C09C +ENDCHAR +STARTCHAR U+925D +ENCODING 37469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3820 +2C20 +65FE +4000 +FC84 +1084 +1084 +FCCC +1048 +9448 +D448 +5048 +1C08 +73FF +C000 +ENDCHAR +STARTCHAR U+925E +ENCODING 37470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0828 +1424 +12FC +22A0 +5CA8 +08A8 +7EA8 +0898 +2A90 +1C94 +18EC +0FAC +7244 +0000 +ENDCHAR +STARTCHAR U+9260 +ENCODING 37472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +64FE +4092 +FC92 +1092 +1092 +FDFF +1028 +9428 +D428 +506C +1C44 +70C6 +C183 +ENDCHAR +STARTCHAR U+9261 +ENCODING 37473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3892 +2CD6 +6654 +4010 +FCFE +1010 +1010 +FC10 +11FF +9410 +D410 +5010 +1C10 +7010 +C010 +ENDCHAR +STARTCHAR U+9262 +ENCODING 37474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1420 +1220 +23FC +5C70 +0870 +7EA8 +08A8 +2B24 +1CF8 +1820 +0E20 +7020 +0000 +ENDCHAR +STARTCHAR U+9263 +ENCODING 37475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +4410 +00FE +7C10 +1010 +1010 +11FF +7C10 +1020 +5444 +3882 +11FF +7C01 +0000 +0000 +ENDCHAR +STARTCHAR U+9264 +ENCODING 37476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +12F8 +2288 +5DE8 +08A8 +7EA8 +08E8 +2AA8 +1C08 +1808 +0E08 +7030 +0000 +ENDCHAR +STARTCHAR U+9265 +ENCODING 37477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2828 +4424 +0020 +7FFF +1020 +1020 +7CA8 +10A8 +14A8 +54A8 +54A8 +5128 +1D29 +722F +0420 +ENDCHAR +STARTCHAR U+9266 +ENCODING 37478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1420 +1220 +22A0 +5CA0 +08B8 +7EA0 +08A0 +2AA0 +1CA0 +18A0 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+9267 +ENCODING 37479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +64B2 +409A +FC8A +1082 +13FF +FD02 +1162 +9532 +D512 +5102 +1DFF +7004 +C01C +ENDCHAR +STARTCHAR U+9268 +ENCODING 37480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3840 +2C40 +66FF +4091 +FD91 +1012 +1010 +FC92 +1092 +9492 +D593 +5111 +1C10 +7010 +C070 +ENDCHAR +STARTCHAR U+9269 +ENCODING 37481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3838 +2C28 +666C +40C6 +FD93 +1010 +1010 +FC92 +1092 +9492 +D593 +5111 +1C10 +7010 +C070 +ENDCHAR +STARTCHAR U+926C +ENCODING 37484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +147F +2241 +4141 +3E41 +087F +0841 +0841 +3E41 +087F +2A41 +1C41 +0841 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+926D +ENCODING 37485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +147E +2242 +4142 +3E42 +087E +0842 +0842 +3E42 +087E +2A42 +1C00 +0800 +3EFF +0000 +0000 +ENDCHAR +STARTCHAR U+926E +ENCODING 37486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1C08 +1608 +337F +2049 +7E49 +C849 +087F +7F49 +0849 +4A49 +6A7F +2808 +0F08 +3808 +E008 +ENDCHAR +STARTCHAR U+926F +ENCODING 37487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +3904 +2D04 +6504 +4164 +FD34 +1114 +1104 +FD04 +110C +9508 +D508 +511C +1DD6 +7332 +C662 +ENDCHAR +STARTCHAR U+9270 +ENCODING 37488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FE +2C02 +6402 +40F2 +FC02 +1002 +10F2 +FC92 +1092 +9492 +D4F2 +5002 +1C02 +7002 +C00E +ENDCHAR +STARTCHAR U+9271 +ENCODING 37489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1420 +12FC +2280 +5CA0 +08A0 +7EA0 +08A0 +2AB0 +1D48 +1958 +0FE4 +7204 +0000 +ENDCHAR +STARTCHAR U+9272 +ENCODING 37490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1410 +221E +4110 +3E10 +08FF +0810 +0818 +3E14 +0812 +2A10 +1C10 +0810 +7F10 +0000 +0000 +ENDCHAR +STARTCHAR U+9274 +ENCODING 37492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +2448 +24FC +2540 +2630 +2510 +0100 +06C0 +1830 +6FEE +8104 +1FF0 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+9275 +ENCODING 37493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +65FF +4111 +FD11 +1111 +1111 +FD11 +11FF +9410 +D412 +5012 +1C1E +7073 +C1C1 +ENDCHAR +STARTCHAR U+9276 +ENCODING 37494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +73E9 +5949 +C949 +0149 +F949 +23E9 +2149 +F949 +2149 +A949 +A941 +A141 +3B41 +6241 +C647 +ENDCHAR +STARTCHAR U+9277 +ENCODING 37495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3844 +2C44 +6444 +40FE +FC44 +1044 +1044 +FC44 +1044 +95FF +D400 +5044 +1C44 +70C6 +C183 +ENDCHAR +STARTCHAR U+9278 +ENCODING 37496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +65FF +4044 +FCC6 +1183 +1044 +FC44 +106C +9438 +D410 +5038 +1C6C +70C6 +C183 +ENDCHAR +STARTCHAR U+9279 +ENCODING 37497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +383E +2C62 +64C6 +41AC +FC18 +1030 +10E8 +FC0F +1019 +9433 +D4EA +5006 +1C0C +7038 +C1E0 +ENDCHAR +STARTCHAR U+927A +ENCODING 37498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +29FF +4444 +0044 +7C7C +1044 +1044 +7C7C +1044 +1044 +55FF +3804 +1004 +7C04 +0000 +0000 +ENDCHAR +STARTCHAR U+927B +ENCODING 37499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3840 +2C7C +64C4 +418C +FC68 +1038 +106C +FDC7 +1000 +94FE +D482 +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+927C +ENCODING 37500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +38C6 +2C44 +65FF +4044 +FC44 +1044 +1044 +FDFF +1044 +9444 +D444 +5044 +1CC4 +7084 +C184 +ENDCHAR +STARTCHAR U+927D +ENCODING 37501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +380B +2C09 +6408 +41FF +FC08 +1008 +11F8 +FC48 +1048 +9448 +D44C +5074 +1DC5 +7007 +C002 +ENDCHAR +STARTCHAR U+927E +ENCODING 37502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1450 +1288 +23F4 +5CA0 +08A0 +7FF8 +0920 +2A20 +1DFC +1820 +0E20 +7020 +0000 +ENDCHAR +STARTCHAR U+927F +ENCODING 37503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3838 +2C28 +666C +40C6 +FD83 +1000 +10FE +FC00 +1000 +94FE +D482 +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+9280 +ENCODING 37504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1488 +1288 +22F8 +5C88 +0888 +7EF8 +08A4 +2AA8 +1C90 +18B0 +0EC8 +7304 +0000 +ENDCHAR +STARTCHAR U+9282 +ENCODING 37506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1041 +2849 +4449 +0049 +7D6D +10DB +1049 +7C49 +1049 +1049 +5449 +3849 +1049 +7C81 +0000 +0000 +ENDCHAR +STARTCHAR U+9283 +ENCODING 37507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1250 +2248 +5C9C +09F4 +7E50 +0850 +2A50 +1C90 +1894 +0F14 +720C +0000 +ENDCHAR +STARTCHAR U+9285 +ENCODING 37509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1508 +1308 +23F8 +5D08 +09E8 +7FA8 +09A8 +2BA8 +1DE8 +1908 +0F08 +7118 +0000 +ENDCHAR +STARTCHAR U+9286 +ENCODING 37510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +147F +2210 +4110 +3E20 +087F +0841 +3E41 +0841 +087F +2A41 +1C41 +0841 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+9287 +ENCODING 37511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1409 +227E +4108 +3E7F +0808 +087F +3E08 +081C +082A +2A49 +1C08 +0808 +7F08 +0000 +0000 +ENDCHAR +STARTCHAR U+9288 +ENCODING 37512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2CFE +6610 +4010 +FC10 +11FF +1000 +FC10 +1010 +94FE +D410 +5010 +1C10 +7010 +C1FF +ENDCHAR +STARTCHAR U+9289 +ENCODING 37513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +38FE +2C12 +6412 +41FF +FC12 +1012 +10FE +FC10 +1010 +94FE +D410 +5010 +1DFF +7010 +C010 +ENDCHAR +STARTCHAR U+928A +ENCODING 37514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +3816 +2C12 +65FF +4110 +FD10 +1192 +1152 +FD56 +1114 +951C +D508 +511D +1D35 +7167 +C202 +ENDCHAR +STARTCHAR U+928B +ENCODING 37515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +2842 +44BC +0188 +7C88 +1088 +10FF +7C88 +1088 +1088 +5488 +3888 +10BE +7C80 +0000 +0000 +ENDCHAR +STARTCHAR U+928C +ENCODING 37516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2820 +45FF +0020 +7C3E +1042 +10C4 +7D48 +107F +1044 +5444 +3844 +1044 +7C4C +0000 +0000 +ENDCHAR +STARTCHAR U+928D +ENCODING 37517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2C40 +6444 +40C4 +FC9E +11F3 +1000 +FC10 +1010 +94FE +D410 +5010 +1C10 +7010 +C1FF +ENDCHAR +STARTCHAR U+928E +ENCODING 37518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7EFC +1088 +10C8 +1EAA +710E +0280 +0C60 +37DE +C104 +1FF0 +0100 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+9291 +ENCODING 37521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +14A0 +12A0 +22F8 +5CA0 +0920 +7FFC +0850 +2A50 +1C90 +1894 +0F14 +720C +0000 +ENDCHAR +STARTCHAR U+9292 +ENCODING 37522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39EF +2C44 +6644 +4044 +FC44 +1074 +11CF +FC44 +1044 +9444 +D444 +50C4 +1C84 +7184 +C304 +ENDCHAR +STARTCHAR U+9293 +ENCODING 37523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08E0 +0820 +1450 +1250 +2288 +5DFC +0820 +7E20 +08F8 +2A20 +1C20 +1820 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+9294 +ENCODING 37524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +14FE +2210 +4134 +3E53 +0891 +0810 +3E00 +0810 +09FF +2A10 +1C10 +0810 +7F10 +0000 +0000 +ENDCHAR +STARTCHAR U+9295 +ENCODING 37525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1220 +23F8 +5C28 +09F8 +7F20 +09FC +2B24 +1C58 +1850 +0E88 +7104 +0000 +ENDCHAR +STARTCHAR U+9296 +ENCODING 37526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A0 +14A0 +12F8 +22A0 +5D20 +09FC +7E70 +0870 +2AA8 +1CA8 +1924 +0E20 +7020 +0000 +ENDCHAR +STARTCHAR U+9297 +ENCODING 37527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +381C +2CF0 +6680 +4080 +FCFF +1080 +1080 +FCBE +10A2 +94A2 +D4A2 +51A2 +1D22 +7322 +C03E +ENDCHAR +STARTCHAR U+9298 +ENCODING 37528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1478 +1288 +2290 +5D50 +0820 +7E40 +08F8 +2B88 +1C88 +1888 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+9299 +ENCODING 37529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6428 +4044 +FD83 +107C +1000 +FDFF +1020 +9440 +D4FE +5002 +1C02 +7006 +C01C +ENDCHAR +STARTCHAR U+929A +ENCODING 37530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +1450 +1354 +22D4 +5CD8 +0850 +7ED8 +0954 +2A54 +1C90 +1894 +0F14 +720C +0000 +ENDCHAR +STARTCHAR U+929B +ENCODING 37531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +14E0 +1220 +2220 +5DFC +0820 +7E20 +08F8 +2A88 +1C88 +1888 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+929C +ENCODING 37532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +113C +2280 +4A40 +0FFC +1108 +17C8 +3108 +5548 +1388 +1308 +11C8 +1608 +1018 +0000 +ENDCHAR +STARTCHAR U+929D +ENCODING 37533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +2888 +4588 +02FF +7C88 +1088 +1088 +7C9C +10AA +10C9 +5488 +3888 +1088 +7C88 +0000 +0000 +ENDCHAR +STARTCHAR U+929F +ENCODING 37535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3911 +2D11 +65FF +4000 +FC10 +1010 +11FF +FD11 +1111 +9511 +D511 +5111 +1D17 +7010 +C010 +ENDCHAR +STARTCHAR U+92A0 +ENCODING 37536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3822 +2CFE +6624 +402C +FC28 +11FF +1010 +FC30 +1060 +95C6 +D47C +5040 +1C41 +7063 +C03E +ENDCHAR +STARTCHAR U+92A1 +ENCODING 37537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1408 +227F +4108 +3E08 +0808 +087F +3E00 +087F +0841 +2A41 +1C41 +087F +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+92A2 +ENCODING 37538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +2800 +4400 +00FE +7C10 +1012 +11F4 +7C38 +1038 +1054 +5492 +3911 +1050 +7C20 +0000 +0000 +ENDCHAR +STARTCHAR U+92A3 +ENCODING 37539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +2900 +4520 +012F +7FF9 +1129 +1129 +7D29 +1129 +1129 +54AF +3849 +10A0 +7D10 +0000 +0000 +ENDCHAR +STARTCHAR U+92A4 +ENCODING 37540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C92 +66D2 +4056 +FC54 +1010 +11FF +FC10 +1038 +9438 +D454 +5054 +1C92 +7111 +C010 +ENDCHAR +STARTCHAR U+92A5 +ENCODING 37541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +65FF +4020 +FC20 +1072 +1052 +FCD6 +1154 +945C +D448 +504C +1C44 +7076 +C1C3 +ENDCHAR +STARTCHAR U+92A6 +ENCODING 37542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +1441 +2249 +4149 +3E7F +0849 +0849 +3E49 +0849 +0849 +2A55 +1C63 +0841 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+92A7 +ENCODING 37543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3892 +2CD6 +6454 +4054 +FC10 +1010 +11FF +FC48 +1048 +9448 +D448 +5048 +1CC9 +7089 +C187 +ENDCHAR +STARTCHAR U+92A8 +ENCODING 37544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2CFE +6682 +40A2 +FC20 +11FF +1024 +FC64 +104C +9448 +D4E8 +5038 +1C2C +7066 +C0C2 +ENDCHAR +STARTCHAR U+92A9 +ENCODING 37545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +28F8 +4410 +0010 +7CFE +1010 +1010 +7DFF +1010 +1010 +5420 +3842 +10FE +7C02 +0000 +0000 +ENDCHAR +STARTCHAR U+92AA +ENCODING 37546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1420 +23FF +4020 +3E7E +08C2 +0942 +3E7E +0842 +0842 +2A7E +1C42 +0842 +7F86 +0000 +0000 +ENDCHAR +STARTCHAR U+92AB +ENCODING 37547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1C3E +1622 +3366 +20C4 +7E7F +C849 +0849 +7F49 +087F +4A40 +6A40 +2840 +0F41 +3841 +E03F +ENDCHAR +STARTCHAR U+92AC +ENCODING 37548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2820 +45FE +8224 +7C28 +13FE +1040 +FEFC +1120 +127E +5402 +3802 +1024 +FC18 +0000 +0000 +ENDCHAR +STARTCHAR U+92AD +ENCODING 37549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0850 +1448 +13FC +2240 +5DF8 +0840 +7FFC +0848 +2A28 +1C30 +1834 +0ECC +7304 +0000 +ENDCHAR +STARTCHAR U+92AE +ENCODING 37550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +7FFC +0440 +1450 +254C +4284 +0C30 +37EE +C104 +1FF0 +0100 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+92AF +ENCODING 37551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C30 +1660 +32C2 +2066 +7E2C +C818 +0832 +7EFF +0811 +4A10 +6A52 +2852 +0ED3 +3891 +E010 +ENDCHAR +STARTCHAR U+92B2 +ENCODING 37554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +66FE +4082 +FC82 +10FE +1000 +FCFE +1010 +9410 +D5FF +5010 +1C10 +7010 +C010 +ENDCHAR +STARTCHAR U+92B3 +ENCODING 37555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1018 +2848 +4444 +0082 +7D01 +12FC +1084 +7C84 +1084 +14FC +5448 +5448 +5048 +1C49 +608F +0300 +ENDCHAR +STARTCHAR U+92B4 +ENCODING 37556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +087C +7E40 +087F +0C44 +3884 +0944 +1A24 +07F0 +0888 +17F4 +2492 +02A0 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+92B5 +ENCODING 37557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +28FC +4584 +00FC +7C84 +10FD +1086 +7DFC +100C +1014 +5424 +3844 +1084 +7C0C +0000 +0000 +ENDCHAR +STARTCHAR U+92B6 +ENCODING 37558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2814 +4412 +0010 +7DFF +1010 +1111 +7C92 +1054 +1438 +5438 +5454 +5054 +1C92 +6112 +0231 +ENDCHAR +STARTCHAR U+92B7 +ENCODING 37559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +14A8 +12A4 +2324 +5CF8 +0888 +7EF8 +0888 +2AF8 +1C88 +1888 +0E88 +7098 +0000 +ENDCHAR +STARTCHAR U+92B8 +ENCODING 37560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3BFF +2CA4 +64A4 +40E4 +FCA4 +10A4 +10A4 +FCE4 +10A4 +94A4 +D4A4 +50E4 +1DA5 +7025 +C023 +ENDCHAR +STARTCHAR U+92B9 +ENCODING 37561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08E0 +1420 +13FC +2270 +5CA8 +0924 +7EF0 +0850 +2A5C +1C94 +1884 +0F04 +7218 +0000 +ENDCHAR +STARTCHAR U+92BA +ENCODING 37562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +4410 +7DFF +0410 +FC10 +2410 +64FE +C400 +0100 +06C0 +1838 +EFE7 +0100 +3FFC +0920 +FFFF +ENDCHAR +STARTCHAR U+92BB +ENCODING 37563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +3848 +2DFE +6412 +4012 +FCFE +1090 +1090 +FCFF +1031 +9431 +D451 +5051 +1CD7 +7190 +C010 +ENDCHAR +STARTCHAR U+92BC +ENCODING 37564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3854 +2C54 +6654 +4054 +FCBA +1092 +1111 +FC10 +1010 +94FE +D410 +5010 +1C10 +71FF +C000 +ENDCHAR +STARTCHAR U+92BD +ENCODING 37565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +38F8 +2C90 +6690 +40FF +FC88 +1088 +10E5 +FD83 +1000 +94FE +D482 +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+92BF +ENCODING 37567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FE +2C04 +6468 +4010 +FDFF +1111 +1111 +FDFF +1111 +9511 +D5FF +5111 +1D11 +7111 +C113 +ENDCHAR +STARTCHAR U+92C0 +ENCODING 37568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2C00 +6400 +40FE +FC82 +1082 +1082 +FCFE +1000 +9482 +D4C6 +5044 +1C04 +71FF +C000 +ENDCHAR +STARTCHAR U+92C1 +ENCODING 37569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +4082 +FC82 +10FE +1010 +FC30 +1020 +94FE +D482 +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+92C2 +ENCODING 37570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3840 +2CFF +6480 +4180 +FC7E +1052 +1052 +FC52 +11FF +9492 +D492 +5092 +1CFF +7004 +C01C +ENDCHAR +STARTCHAR U+92C3 +ENCODING 37571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3820 +2DFC +6504 +4104 +FDFC +1104 +1104 +FDFD +1113 +9516 +D518 +5108 +1D0C +71E6 +C303 +ENDCHAR +STARTCHAR U+92C4 +ENCODING 37572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +2800 +4492 +0054 +7C10 +1028 +1044 +7D83 +107C +1044 +5428 +3810 +1028 +7DC7 +0000 +0000 +ENDCHAR +STARTCHAR U+92C5 +ENCODING 37573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2CFE +6600 +4082 +FCC6 +1044 +11FF +FC10 +1010 +9410 +D4FE +5010 +1C10 +7010 +C010 +ENDCHAR +STARTCHAR U+92C6 +ENCODING 37574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2100 +23FF +FA01 +26F1 +2001 +21FB +3802 +E10E +06C0 +1838 +E7E7 +0100 +3FFC +0910 +FFFF +ENDCHAR +STARTCHAR U+92C7 +ENCODING 37575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +40FE +FC82 +1082 +1082 +FCFE +1082 +9482 +D482 +50FE +1C44 +70C6 +C183 +ENDCHAR +STARTCHAR U+92C8 +ENCODING 37576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2038 +13C0 +4048 +27FC +08A0 +7318 +2288 +2C60 +37DE +C104 +1FF0 +0100 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+92C9 +ENCODING 37577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4410 +00FE +7C92 +1092 +10FE +7C10 +1038 +1054 +5492 +3911 +1010 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+92CA +ENCODING 37578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +2882 +4501 +0028 +7C44 +1082 +1101 +1000 +7CFE +1082 +5482 +3882 +10FE +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+92CB +ENCODING 37579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +39C7 +2C5C +6444 +4084 +FC94 +11D7 +1054 +FD54 +1154 +9554 +D5D4 +50BF +1C80 +71E0 +C33F +ENDCHAR +STARTCHAR U+92CC +ENCODING 37580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +29E3 +443C +0044 +7C44 +1084 +11E4 +7E3F +1024 +1524 +5544 +5544 +509F +1CC0 +713F +0200 +ENDCHAR +STARTCHAR U+92CD +ENCODING 37581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6410 +4010 +FDFF +1101 +1101 +FCFE +1004 +9408 +D5FF +5010 +1C10 +7010 +C030 +ENDCHAR +STARTCHAR U+92CE +ENCODING 37582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6501 +4101 +FCFE +1000 +1000 +FDFF +1048 +9448 +D448 +50C8 +1C89 +7189 +C307 +ENDCHAR +STARTCHAR U+92CF +ENCODING 37583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1220 +22A8 +5CA8 +08A8 +7F74 +0924 +2A60 +1C50 +1890 +0F08 +7204 +0000 +ENDCHAR +STARTCHAR U+92D0 +ENCODING 37584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3820 +2DFE +6502 +4122 +FC20 +13FF +1040 +FC40 +1048 +94C8 +D498 +5192 +1D32 +7327 +C07D +ENDCHAR +STARTCHAR U+92D1 +ENCODING 37585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2820 +4442 +01FF +7C44 +1082 +1101 +1020 +7C7C +10C4 +5544 +3828 +1010 +7CEE +0000 +0000 +ENDCHAR +STARTCHAR U+92D2 +ENCODING 37586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0878 +14D0 +1320 +2270 +5DAC +08F8 +7E20 +08F8 +2A20 +1DFC +1820 +0E20 +7020 +0000 +ENDCHAR +STARTCHAR U+92D3 +ENCODING 37587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2022 +70E2 +5B8A +C88A +008A +FBEA +208A +208A +F9CA +21AA +AAAA +AA8A +A082 +3882 +6082 +C086 +ENDCHAR +STARTCHAR U+92D5 +ENCODING 37589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2C10 +65FF +4010 +FC10 +1010 +10FE +FC00 +1010 +9418 +D42A +50A3 +1CA5 +71A4 +C11C +ENDCHAR +STARTCHAR U+92D7 +ENCODING 37591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +40FE +FC00 +10FE +1082 +FC82 +10FE +9482 +D482 +50FE +1C82 +7082 +C08E +ENDCHAR +STARTCHAR U+92D8 +ENCODING 37592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38BC +2CA4 +66A4 +40A4 +FCBC +1080 +1080 +FCFE +1002 +9402 +D5FF +5000 +1C44 +70C6 +C183 +ENDCHAR +STARTCHAR U+92D9 +ENCODING 37593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FE +2C20 +6420 +40FC +FC44 +1044 +1044 +FDFF +1000 +94FE +D482 +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+92DC +ENCODING 37596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +4082 +FC82 +10FE +1010 +FC10 +1090 +949E +D490 +5190 +1D50 +7338 +C60F +ENDCHAR +STARTCHAR U+92DD +ENCODING 37597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +381C +2DF1 +6423 +4136 +FD94 +1080 +1004 +FDFF +1004 +9444 +D464 +5024 +1C04 +7004 +C01C +ENDCHAR +STARTCHAR U+92DE +ENCODING 37598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2800 +4449 +0092 +7D24 +1092 +1049 +7C00 +10FE +1010 +5410 +3810 +1010 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+92DF +ENCODING 37599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C02 +66FE +4002 +FCFE +1000 +11FF +FD01 +10FE +9442 +D466 +502C +1C38 +706C +C1C7 +ENDCHAR +STARTCHAR U+92E0 +ENCODING 37600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2D00 +6500 +417E +FD00 +1100 +11FF +FD48 +1149 +954B +D54A +514C +1D44 +7176 +C2C3 +ENDCHAR +STARTCHAR U+92E1 +ENCODING 37601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3838 +2C6C +64C6 +41BB +FC00 +10FE +1004 +FC08 +1010 +94FE +D482 +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+92E3 +ENCODING 37603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +73EF +5A49 +CA49 +0249 +FA4A +224A +27EA +F949 +2149 +A949 +A949 +A149 +3B4B +6248 +C6C8 +ENDCHAR +STARTCHAR U+92E4 +ENCODING 37604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +13A0 +1AA0 +26F8 +27A8 +7AA8 +12A8 +7FA8 +12A8 +56E8 +3BC8 +3648 +1C88 +6130 +0000 +ENDCHAR +STARTCHAR U+92E5 +ENCODING 37605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +4082 +FCFE +1000 +1000 +FCFE +1010 +9410 +D4FE +5010 +1C10 +71FF +C000 +ENDCHAR +STARTCHAR U+92E6 +ENCODING 37606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FE +2902 +4502 +01FE +7D00 +11FF +1101 +117D +7D45 +1145 +557D +3945 +1201 +7C02 +0000 +0000 +ENDCHAR +STARTCHAR U+92E7 +ENCODING 37607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +40FE +FC82 +1082 +10FE +FC82 +1082 +94FE +D428 +5068 +1C49 +70C9 +C187 +ENDCHAR +STARTCHAR U+92E8 +ENCODING 37608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +102A +3849 +2DC9 +6448 +4048 +FDFF +1048 +1049 +FC49 +106A +95CA +D44C +5045 +1C45 +704B +C1D1 +ENDCHAR +STARTCHAR U+92E9 +ENCODING 37609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +15FC +1290 +2220 +5C20 +09FC +7E80 +0880 +2A80 +1C80 +1880 +0E80 +7078 +0000 +ENDCHAR +STARTCHAR U+92EA +ENCODING 37610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0828 +0824 +15FC +1220 +22F8 +5CA8 +08A8 +7EF8 +08A8 +2AA8 +1CF8 +18A8 +0EA8 +7098 +0000 +ENDCHAR +STARTCHAR U+92EC +ENCODING 37612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +1100 +FDFE +1146 +116C +1D38 +F310 +1238 +166C +71C7 +0000 +07C0 +1930 +EFEF +1110 +FFFF +ENDCHAR +STARTCHAR U+92ED +ENCODING 37613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0848 +1450 +12F8 +2288 +5C88 +0888 +7EF8 +0850 +2A50 +1C90 +1894 +0F14 +720C +0000 +ENDCHAR +STARTCHAR U+92EE +ENCODING 37614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2014 +7016 +5812 +CBFF +0210 +FA10 +23D2 +2252 +FA56 +2254 +AA5C +AA48 +A25C +3AD5 +6237 +C462 +ENDCHAR +STARTCHAR U+92EF +ENCODING 37615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2890 +44FE +0110 +7C10 +1010 +11FF +7C00 +10FE +1082 +5482 +3882 +10FE +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+92F0 +ENCODING 37616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C92 +6692 +40FE +FC92 +1092 +1092 +FCFE +1010 +9410 +D4FE +5010 +1C10 +7010 +C1FF +ENDCHAR +STARTCHAR U+92F1 +ENCODING 37617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1005 +2805 +45FF +0004 +7C24 +1024 +1114 +7D54 +1154 +1044 +5444 +3845 +1053 +7C71 +0000 +0000 +ENDCHAR +STARTCHAR U+92F2 +ENCODING 37618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +08F0 +1480 +1280 +22FC +5C90 +0890 +7E90 +09FC +2A00 +1C50 +1848 +0E84 +7104 +0000 +ENDCHAR +STARTCHAR U+92F3 +ENCODING 37619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1220 +22F8 +5C20 +09FC +7E48 +09FC +2A48 +1CA8 +1928 +0E08 +7018 +0000 +ENDCHAR +STARTCHAR U+92F7 +ENCODING 37623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2BF0 +452F +0121 +7DE9 +1129 +1129 +7DE9 +1129 +1129 +57E9 +3826 +1026 +7C29 +0000 +0000 +ENDCHAR +STARTCHAR U+92F8 +ENCODING 37624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1508 +1308 +23F8 +5D20 +09FC +7F20 +0920 +2BF8 +1D88 +1988 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+92F9 +ENCODING 37625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +387E +2C40 +667C +4040 +FC7C +1040 +1040 +FDFF +1050 +9451 +D45B +504A +1C4C +7076 +C0C3 +ENDCHAR +STARTCHAR U+92FA +ENCODING 37626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +19FC +2508 +2700 +7DF8 +1168 +7D68 +12E8 +54B8 +38A0 +3124 +1E24 +641C +0000 +ENDCHAR +STARTCHAR U+92FB +ENCODING 37627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7E +4822 +7E36 +4214 +7E1C +4836 +7F63 +0000 +0100 +06C0 +1838 +EFE7 +0100 +3FFC +0920 +FFFF +ENDCHAR +STARTCHAR U+92FC +ENCODING 37628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1B28 +26A8 +26C8 +7BF8 +1248 +7F58 +1358 +5758 +3BF8 +3318 +1E08 +6218 +0000 +ENDCHAR +STARTCHAR U+92FE +ENCODING 37630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +2840 +447F +0081 +7D21 +107D +1091 +7C11 +107D +1011 +5455 +387D +1001 +7C1E +0000 +0000 +ENDCHAR +STARTCHAR U+92FF +ENCODING 37631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3911 +2D93 +64D6 +4054 +FDFF +1101 +1101 +FD7D +1145 +9545 +D545 +517D +1D01 +7101 +C107 +ENDCHAR +STARTCHAR U+9300 +ENCODING 37632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3870 +2CD8 +658C +4307 +FCF8 +1000 +1000 +FDFE +1152 +9552 +D5FE +5152 +1D52 +7152 +C156 +ENDCHAR +STARTCHAR U+9301 +ENCODING 37633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +2892 +44FE +0092 +7CFE +1010 +11FF +7C10 +1010 +1038 +5454 +3892 +1111 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9302 +ENCODING 37634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3820 +2DFE +6420 +43FF +FC48 +10C8 +118F +FC40 +107C +94C4 +D58C +5058 +1C30 +70EC +C387 +ENDCHAR +STARTCHAR U+9304 +ENCODING 37636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +28FC +4404 +00FC +7C04 +1004 +11FF +7C10 +1112 +1494 +5458 +5438 +5054 +1C94 +6112 +0631 +ENDCHAR +STARTCHAR U+9306 +ENCODING 37638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +1420 +12F8 +2220 +5DFC +0800 +7EF8 +0888 +2AF8 +1C88 +18F8 +0E88 +7098 +0000 +ENDCHAR +STARTCHAR U+9308 +ENCODING 37640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +38D6 +2C54 +66FE +4028 +FC28 +11FF +1028 +FC44 +10FE +958B +D408 +5078 +1C42 +7046 +C03C +ENDCHAR +STARTCHAR U+9309 +ENCODING 37641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +29FE +4488 +00BE +7C88 +10A5 +10C3 +7D81 +1000 +10FE +5482 +38FE +1082 +7CFE +0000 +0000 +ENDCHAR +STARTCHAR U+930B +ENCODING 37643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +2929 +4529 +0129 +7DEF +1129 +1129 +7DEF +1129 +1129 +5529 +3929 +127B +7C21 +0000 +0000 +ENDCHAR +STARTCHAR U+930C +ENCODING 37644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2892 +4492 +00FE +7C00 +11FF +1080 +7CBE +1088 +1088 +557F +3908 +1208 +7C08 +0000 +0000 +ENDCHAR +STARTCHAR U+930D +ENCODING 37645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3820 +2CFE +6692 +4092 +FCFE +1092 +1092 +FCFE +1024 +9444 +D5FF +5004 +1C04 +7004 +C004 +ENDCHAR +STARTCHAR U+930E +ENCODING 37646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2820 +447E +0084 +7D08 +1000 +104F +7C81 +1101 +1101 +55EF +3901 +1101 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+930F +ENCODING 37647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +18A0 +24A0 +27B8 +7E08 +1208 +7FB8 +12A8 +54A0 +38A0 +30A0 +1FFC +6000 +0000 +ENDCHAR +STARTCHAR U+9310 +ENCODING 37648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0848 +1490 +12FC +2390 +5E90 +08F8 +7E90 +0890 +2AF8 +1C90 +1890 +0EFC +7080 +0000 +ENDCHAR +STARTCHAR U+9311 +ENCODING 37649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1003 +39FE +2D00 +65FF +4101 +FD01 +11FF +1114 +FD12 +11FF +9510 +D538 +5128 +1D6C +72C6 +C183 +ENDCHAR +STARTCHAR U+9312 +ENCODING 37650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11DF +2942 +4542 +01BA +7DEA +116A +116A +7D7A +1142 +1142 +5582 +3902 +1106 +7D02 +0000 +0000 +ENDCHAR +STARTCHAR U+9313 +ENCODING 37651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +2828 +44FE +0010 +7C10 +10FE +1010 +7C10 +11FF +1048 +5448 +3848 +1089 +7D07 +0000 +0000 +ENDCHAR +STARTCHAR U+9314 +ENCODING 37652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3812 +2DD6 +6458 +405C +FCD6 +1193 +1030 +FC00 +10FE +9482 +D482 +50FE +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+9315 +ENCODING 37653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +40FE +FC82 +1082 +10FE +FC00 +1088 +948B +D4EE +5088 +1C89 +70E9 +C187 +ENDCHAR +STARTCHAR U+9316 +ENCODING 37654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0E7F +0822 +7F14 +0808 +2A94 +4963 +0220 +07F0 +188C +07F0 +02A0 +01C0 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+9318 +ENCODING 37656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +09E0 +1420 +13FC +22A8 +5CA8 +09FC +7EA8 +08A8 +2BFC +1C20 +1820 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+9319 +ENCODING 37657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A8 +08A8 +1550 +1350 +22A8 +5CA8 +0800 +7EF8 +08A8 +2AF8 +1CA8 +18A8 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+931A +ENCODING 37658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +080C +09F0 +14A8 +12A4 +2304 +5CF8 +0828 +7FFC +0828 +2AF8 +1C28 +1820 +0E20 +7060 +0000 +ENDCHAR +STARTCHAR U+931B +ENCODING 37659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +45FF +0028 +7C54 +1092 +117D +7C10 +1054 +11FF +5444 +3844 +1044 +7C84 +0000 +0000 +ENDCHAR +STARTCHAR U+931C +ENCODING 37660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3838 +2C6C +64C6 +41BB +FC00 +10FE +1004 +FC08 +1010 +9418 +D428 +50A2 +1CA3 +70A5 +C11C +ENDCHAR +STARTCHAR U+931D +ENCODING 37661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6501 +4101 +FCFE +1000 +1000 +FDFF +1010 +9454 +D454 +50D6 +1D93 +7010 +C070 +ENDCHAR +STARTCHAR U+931E +ENCODING 37662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +45FF +0000 +00FE +7C82 +10FE +1082 +7C00 +10FC +1408 +5410 +53FF +1C10 +7010 +0030 +ENDCHAR +STARTCHAR U+931F +ENCODING 37663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2822 +4524 +0128 +7C20 +1050 +108C +7F23 +1024 +5528 +5530 +5450 +1050 +1C88 +6104 +0603 +ENDCHAR +STARTCHAR U+9320 +ENCODING 37664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1308 +2200 +5DFC +0820 +7EA0 +08B8 +2AA0 +1CA0 +1960 +0F20 +721C +0000 +ENDCHAR +STARTCHAR U+9321 +ENCODING 37665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +4410 +01FF +0028 +7C44 +1183 +1000 +7DFF +1002 +14F2 +5492 +54F2 +5002 +1C02 +600E +ENDCHAR +STARTCHAR U+9322 +ENCODING 37666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +147C +13C8 +2230 +5C74 +098C +7E50 +087C +2BC8 +1C30 +1864 +0F9C +7004 +0000 +ENDCHAR +STARTCHAR U+9323 +ENCODING 37667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1448 +1368 +2290 +5CD0 +0928 +7FF8 +0848 +2B68 +1C90 +1890 +0F68 +7244 +0000 +ENDCHAR +STARTCHAR U+9324 +ENCODING 37668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +2844 +4444 +01FF +0044 +7C44 +107C +1044 +7C44 +107C +1444 +5444 +55FF +5000 +1C44 +6082 +ENDCHAR +STARTCHAR U+9325 +ENCODING 37669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6440 +4044 +FCFE +1183 +1000 +FCFE +1082 +94FE +D482 +50FE +1C82 +7082 +C08E +ENDCHAR +STARTCHAR U+9326 +ENCODING 37670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +14F8 +1288 +22F8 +5C88 +08F8 +7E20 +09FC +2B24 +1D24 +1924 +0F38 +7020 +0000 +ENDCHAR +STARTCHAR U+9327 +ENCODING 37671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6501 +4101 +FC7C +1044 +1044 +FC7C +1040 +9440 +D47E +5042 +1C42 +7042 +C07E +ENDCHAR +STARTCHAR U+9328 +ENCODING 37672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +15FC +1290 +2290 +7C00 +09F8 +7F48 +0948 +2BF8 +1D48 +1948 +0FF8 +7108 +0000 +ENDCHAR +STARTCHAR U+9329 +ENCODING 37673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +6682 +40FE +FC82 +1082 +10FE +FC00 +11FF +9501 +D501 +51FF +1D01 +7101 +C1FF +ENDCHAR +STARTCHAR U+932A +ENCODING 37674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +3828 +2C28 +66FE +40AA +FCAA +10AA +10FE +FCAA +10AA +94AA +D5FF +5000 +1C44 +70C6 +C183 +ENDCHAR +STARTCHAR U+932B +ENCODING 37675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1508 +13F8 +2308 +5DF8 +0880 +7EFC +0954 +2A54 +1C94 +1924 +0E44 +7018 +0000 +ENDCHAR +STARTCHAR U+932C +ENCODING 37676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1220 +22F8 +5CA8 +08F8 +7EA8 +08F8 +2A70 +1CA8 +1924 +0E20 +7020 +0000 +ENDCHAR +STARTCHAR U+932D +ENCODING 37677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2911 +4511 +017D +7D11 +11FF +1101 +7D7D +1145 +1145 +557D +3901 +1101 +7D07 +0000 +0000 +ENDCHAR +STARTCHAR U+932E +ENCODING 37678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1548 +1348 +23F8 +5D48 +0948 +7FE8 +09A8 +2BA8 +1DE8 +1908 +0FF8 +7108 +0000 +ENDCHAR +STARTCHAR U+932F +ENCODING 37679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +1450 +13FC +2250 +5C50 +09FC +7E00 +08F8 +2A88 +1CF8 +1888 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+9332 +ENCODING 37682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1408 +12F8 +2208 +5DFC +0820 +7F24 +08B8 +2A70 +1C68 +19A4 +0E20 +7060 +0000 +ENDCHAR +STARTCHAR U+9333 +ENCODING 37683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C04 +6608 +4010 +FDFF +1010 +1010 +FC70 +1000 +94FE +D4AA +50AA +1CAA +71FF +C000 +ENDCHAR +STARTCHAR U+9334 +ENCODING 37684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2CFE +6610 +4010 +FDFF +1044 +1044 +FD87 +1010 +9410 +D4FE +5010 +1C10 +71FF +C000 +ENDCHAR +STARTCHAR U+9335 +ENCODING 37685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +15FC +1250 +2260 +5C60 +08A4 +7EA8 +09B0 +2AA0 +1CA0 +18A4 +0EA4 +709C +0000 +ENDCHAR +STARTCHAR U+9336 +ENCODING 37686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2CFE +6610 +40FE +FC10 +1010 +11FF +FC28 +1069 +94CB +D5CA +504C +1C44 +70F6 +C383 +ENDCHAR +STARTCHAR U+9337 +ENCODING 37687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +7088 +5BE8 +C888 +03E8 +FAA8 +22A8 +23E8 +FAA8 +22A8 +ABE8 +A888 +A3E9 +3889 +6089 +C087 +ENDCHAR +STARTCHAR U+9338 +ENCODING 37688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +28FE +4410 +0052 +7C52 +10D6 +1139 +7C10 +1010 +1038 +5454 +3892 +1111 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9339 +ENCODING 37689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2850 +445E +0050 +7DFF +1000 +107E +7C42 +107E +1042 +547E +3842 +1042 +7C86 +0000 +0000 +ENDCHAR +STARTCHAR U+933A +ENCODING 37690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +15FC +1250 +2220 +5C20 +09FC +7E20 +0838 +2A28 +1C48 +1848 +0E88 +7130 +0000 +ENDCHAR +STARTCHAR U+933B +ENCODING 37691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0810 +08F8 +1414 +1214 +23FC +5C50 +0950 +7F70 +0950 +2B50 +1D74 +19CC +0F0C +7004 +0000 +ENDCHAR +STARTCHAR U+933C +ENCODING 37692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +45FF +0044 +7C82 +1101 +10FE +7C00 +11FF +1010 +5454 +3892 +1111 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+933E +ENCODING 37694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080C +7EF0 +1080 +2888 +7EFC +0890 +7D10 +0A90 +0C60 +37DE +C104 +1FF0 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+9344 +ENCODING 37700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1200 +22F8 +5C88 +0888 +7EF8 +0820 +2AB0 +1CA8 +1924 +0E24 +7060 +0000 +ENDCHAR +STARTCHAR U+9346 +ENCODING 37702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11EF +2929 +45EF +0129 +7DEF +1101 +1101 +7D01 +1101 +1101 +5501 +3901 +1103 +7D01 +0000 +0000 +ENDCHAR +STARTCHAR U+9347 +ENCODING 37703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +3916 +2DDC +6510 +4111 +FD13 +11CE +1310 +FC20 +11FE +9502 +D502 +51FE +1D02 +7102 +C1FE +ENDCHAR +STARTCHAR U+9348 +ENCODING 37704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +2844 +45FF +0044 +7C54 +1010 +10FE +7C92 +1092 +1492 +55FF +5428 +5028 +1C44 +7082 +0301 +ENDCHAR +STARTCHAR U+9349 +ENCODING 37705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +64FE +4082 +FC82 +10FE +1000 +FDFF +1010 +9490 +D49E +5090 +1DD0 +7170 +C31F +ENDCHAR +STARTCHAR U+934A +ENCODING 37706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +4410 +01FF +0010 +7CFE +1092 +10D6 +7CBA +10FE +5410 +5438 +5054 +1C94 +6112 +0211 +ENDCHAR +STARTCHAR U+934B +ENCODING 37707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1488 +12B8 +22A8 +5CA8 +09FC +7F04 +0974 +2B54 +1D54 +1974 +0F04 +710C +0000 +ENDCHAR +STARTCHAR U+934C +ENCODING 37708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4120 +3120 +03FC +4020 +33FE +0890 +1151 +662F +0410 +0BE8 +3086 +07F0 +02A0 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+934D +ENCODING 37709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1350 +23FC +7D50 +0970 +7F00 +09F8 +2B48 +1D50 +1A20 +0E50 +758C +0000 +ENDCHAR +STARTCHAR U+934E +ENCODING 37710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +29FE +4508 +017F +7D08 +117E +1142 +7D7E +1142 +1142 +557E +3942 +1242 +7C7E +0000 +0000 +ENDCHAR +STARTCHAR U+934F +ENCODING 37711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +28FE +4412 +01FF +7C00 +10FC +1084 +7CFC +1010 +10FE +5490 +39FF +1010 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9350 +ENCODING 37712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1145 +3929 +2D11 +6529 +4145 +FD01 +11FF +1044 +FCC4 +1187 +9440 +D4FE +51A4 +1C18 +706C +C1C7 +ENDCHAR +STARTCHAR U+9351 +ENCODING 37713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3840 +2CFF +6580 +407C +FC44 +107C +1044 +FC7C +1020 +947C +D4C4 +51AC +1C38 +706C +C1C7 +ENDCHAR +STARTCHAR U+9352 +ENCODING 37714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C44 +6428 +41FF +FC52 +10D4 +1190 +FC00 +1010 +95FF +D454 +5054 +1CD6 +7193 +C010 +ENDCHAR +STARTCHAR U+9354 +ENCODING 37716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09DC +1554 +13DC +2200 +5CF8 +0800 +7FFC +0840 +2A78 +1C88 +1808 +0E08 +7030 +0000 +ENDCHAR +STARTCHAR U+9355 +ENCODING 37717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2D01 +6511 +40FE +FC10 +10FE +1092 +FCFE +1092 +9492 +D4FE +5010 +1DFF +7010 +C010 +ENDCHAR +STARTCHAR U+9356 +ENCODING 37718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1090 +1090 +1BFC +2490 +24F0 +7890 +10F0 +7C90 +13FC +5550 +3954 +318C +1DFC +6100 +0000 +ENDCHAR +STARTCHAR U+9357 +ENCODING 37719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6444 +406C +FC28 +11FF +1111 +FD11 +10FE +9492 +D492 +5092 +1C96 +7010 +C010 +ENDCHAR +STARTCHAR U+9358 +ENCODING 37720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +39EA +2D2A +652A +41EA +FD2A +112A +112A +FDEA +112A +952A +D52A +51E2 +1D22 +3332 +E216 +ENDCHAR +STARTCHAR U+9359 +ENCODING 37721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +0BFC +3090 +07FE +1108 +6204 +0080 +0360 +3C1E +07F0 +0080 +07F0 +02A0 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+935A +ENCODING 37722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C82 +66FE +4082 +FC82 +10FE +1000 +FDFF +1040 +94FF +D595 +5025 +10C9 +3C11 +E067 +ENDCHAR +STARTCHAR U+935B +ENCODING 37723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +08B8 +1528 +1328 +23E8 +5D4C +0904 +7FF8 +0948 +2B28 +1DF0 +1B10 +0D28 +71C4 +0000 +ENDCHAR +STARTCHAR U+935C +ENCODING 37724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1548 +1348 +23D8 +5D48 +0900 +7FF8 +0928 +2B28 +1DD0 +1910 +0F28 +7144 +0000 +ENDCHAR +STARTCHAR U+935E +ENCODING 37726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +161F +3210 +20FE +7E82 +C882 +08FE +7E82 +0882 +4AFE +6A82 +2882 +0EFE +3844 +E183 +ENDCHAR +STARTCHAR U+9360 +ENCODING 37728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +14F8 +1288 +22F8 +5C88 +08F8 +7E00 +09FC +2A20 +1CF8 +1820 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+9361 +ENCODING 37729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +28FE +4492 +00FE +7C92 +10FE +1000 +7DFF +1080 +1092 +5494 +3898 +10C8 +7D87 +0000 +0000 +ENDCHAR +STARTCHAR U+9363 +ENCODING 37731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +29FF +4444 +0000 +7CFE +1022 +1022 +7C22 +10CC +1000 +54FE +3882 +1082 +7CFE +0000 +0000 +ENDCHAR +STARTCHAR U+9364 +ENCODING 37732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +381C +2CF0 +6610 +4010 +FDFF +1010 +10D0 +FD97 +1111 +9511 +D5D7 +5111 +1D11 +71FF +C000 +ENDCHAR +STARTCHAR U+9365 +ENCODING 37733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +73EF +5885 +C885 +03E5 +F885 +208D +20E9 +FB9B +2000 +A820 +ABFF +A050 +38D8 +618C +C307 +ENDCHAR +STARTCHAR U+9367 +ENCODING 37735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +3880 +2CFF +6581 +4379 +FC01 +10FD +1001 +FC79 +1001 +9479 +D401 +5079 +1C49 +7079 +C007 +ENDCHAR +STARTCHAR U+9369 +ENCODING 37737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3844 +2DFF +6444 +4044 +FC20 +1020 +11FF +FC40 +1040 +94FE +D542 +5042 +1C42 +7042 +C07E +ENDCHAR +STARTCHAR U+936A +ENCODING 37738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7E44 +147E +08C8 +FE48 +1A30 +2948 +4A86 +0C60 +37DE +C104 +1FF0 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+936C +ENCODING 37740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1050 +1090 +1B90 +2494 +24B4 +7BF4 +10B8 +7DD0 +11B0 +5598 +3AA8 +30A8 +1CC4 +6084 +0000 +ENDCHAR +STARTCHAR U+936D +ENCODING 37741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +38BE +2C82 +6582 +417F +FD20 +1320 +117E +FD48 +1108 +957F +D514 +5114 +1D36 +7122 +C163 +ENDCHAR +STARTCHAR U+936E +ENCODING 37742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10C0 +1040 +18A0 +2510 +27F8 +7804 +13A8 +7EA8 +13A8 +56D0 +3BD0 +32A8 +1EA8 +62A8 +0000 +ENDCHAR +STARTCHAR U+936F +ENCODING 37743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +3880 +2CFF +65A9 +4329 +FCE9 +1071 +109B +FD22 +104E +9400 +D410 +515A +1D4B +7365 +C23C +ENDCHAR +STARTCHAR U+9370 +ENCODING 37744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +383C +2DE2 +6526 +4094 +FDFF +1040 +11FF +FC40 +107C +9444 +D4EC +50B8 +1D90 +733C +C0E7 +ENDCHAR +STARTCHAR U+9371 +ENCODING 37745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1094 +3894 +2DFF +6494 +4094 +FC9C +1080 +10FE +FC10 +11FF +9454 +D454 +50D6 +1C92 +7193 +C010 +ENDCHAR +STARTCHAR U+9373 +ENCODING 37747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F20 +4820 +7E7F +4240 +7EC0 +4800 +7E3E +0100 +06C0 +1838 +EFE7 +0100 +3FFC +0910 +0520 +FFFF +ENDCHAR +STARTCHAR U+9374 +ENCODING 37748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3911 +2D11 +6511 +41FF +FC00 +11FF +1010 +FC20 +11FF +9549 +D549 +5149 +1D49 +7149 +C14B +ENDCHAR +STARTCHAR U+9375 +ENCODING 37749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +1BF8 +24A8 +25FC +7928 +13F8 +7CA0 +12F8 +56A0 +39FC +3120 +1AA0 +647C +0000 +ENDCHAR +STARTCHAR U+9376 +ENCODING 37750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C92 +6692 +40FE +FC92 +1092 +1092 +FCFE +1010 +9418 +D428 +50A2 +1CA3 +70A5 +C11C +ENDCHAR +STARTCHAR U+9377 +ENCODING 37751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4428 +0044 +7C92 +1111 +107C +7C10 +10FE +1010 +5410 +387C +1010 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+9379 +ENCODING 37753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FE +4502 +0102 +7CFC +1000 +10FC +7C84 +10FC +1084 +54FC +3884 +1000 +7DFE +0000 +0000 +ENDCHAR +STARTCHAR U+937A +ENCODING 37754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1022 +3822 +2CFE +6624 +402C +FC28 +11FF +1020 +FC40 +10FE +9542 +D442 +507E +1C42 +7042 +C07E +ENDCHAR +STARTCHAR U+937B +ENCODING 37755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107E +2842 +447E +0042 +7C7E +1080 +10FF +7D11 +1011 +1091 +54A9 +38C5 +10F1 +7C0E +0000 +0000 +ENDCHAR +STARTCHAR U+937C +ENCODING 37756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1028 +1824 +1424 +27FC +2220 +7BE8 +1228 +7FE8 +1350 +5750 +3BF4 +322C +1C4C +6484 +0000 +ENDCHAR +STARTCHAR U+937D +ENCODING 37757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1007 +38FC +2C80 +66FF +4081 +FC81 +10FF +1080 +FCFF +10A9 +95A9 +D5FF +52A9 +1CA9 +70A9 +C0AB +ENDCHAR +STARTCHAR U+937E +ENCODING 37758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08E0 +15FC +1220 +22F8 +5CA8 +08F8 +7EA8 +08F8 +2A20 +1CF8 +1820 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+937F +ENCODING 37759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +3892 +2D24 +67FF +4124 +FC92 +1092 +1000 +FCFE +1092 +9492 +D4FE +5092 +1C92 +7092 +C0FE +ENDCHAR +STARTCHAR U+9380 +ENCODING 37760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2120 +7120 +597F +CBC2 +0236 +FA9C +26B6 +22E3 +FA88 +2298 +AAB6 +AA8C +A2B9 +3A83 +620E +C238 +ENDCHAR +STARTCHAR U+9381 +ENCODING 37761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +77EF +5A49 +CA49 +03C9 +FA4A +224A +224A +FBC9 +2249 +AA49 +AA49 +A3C9 +264B +7848 +C048 +ENDCHAR +STARTCHAR U+9382 +ENCODING 37762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3828 +2CFE +6610 +4010 +FCFE +1010 +1010 +FDFF +1000 +9410 +D5FF +5028 +1C6C +70C6 +C183 +ENDCHAR +STARTCHAR U+9383 +ENCODING 37763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +2884 +44B8 +0022 +7D2C +1128 +10AA +7C2A +10AC +10A8 +54AC +392A +1229 +7C48 +0000 +0000 +ENDCHAR +STARTCHAR U+9388 +ENCODING 37768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +3848 +2DFE +6420 +4020 +FCFC +1020 +1020 +FDFE +1020 +9440 +D4FE +5190 +1C10 +7010 +C1FF +ENDCHAR +STARTCHAR U+9389 +ENCODING 37769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +2882 +44FE +0082 +7CFE +1000 +11EF +7C21 +1129 +10A5 +5421 +38A5 +1129 +7C42 +0000 +0000 +ENDCHAR +STARTCHAR U+938A +ENCODING 37770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6444 +4028 +FDFF +1101 +1111 +FC10 +11FF +9420 +D43E +5062 +1C42 +70C2 +C18E +ENDCHAR +STARTCHAR U+938B +ENCODING 37771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6501 +4111 +FCFE +1010 +10FE +FC10 +11FF +9400 +D4FE +5082 +1C82 +7082 +C0FE +ENDCHAR +STARTCHAR U+938C +ENCODING 37772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1110 +10A0 +1BFC +24A0 +27F8 +78A8 +13FC +7CA8 +13F8 +54A8 +39B0 +32A8 +1CA4 +60A0 +0000 +ENDCHAR +STARTCHAR U+938D +ENCODING 37773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3810 +2DFF +6410 +4010 +FDFF +1101 +1111 +FC24 +10C8 +9452 +D5FF +5011 +1C54 +70D6 +C193 +ENDCHAR +STARTCHAR U+938E +ENCODING 37774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +29FC +4600 +00F8 +7DFC +1044 +1254 +7D64 +13F4 +10C4 +5565 +3A55 +1045 +7CC7 +0000 +0000 +ENDCHAR +STARTCHAR U+938F +ENCODING 37775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +17FE +4090 +23F8 +0950 +7150 +2352 +228E +0C60 +37DE +C104 +1FF0 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+9391 +ENCODING 37777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +28FE +4410 +01FF +7C20 +1044 +10FE +7C02 +1000 +10FE +54AA +38AA +10AA +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+9392 +ENCODING 37778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +73FF +5A00 +CA7E +0200 +FAFF +2252 +2254 +FA48 +2264 +AAC3 +AA04 +A2FF +3A44 +6464 +C02C +ENDCHAR +STARTCHAR U+9394 +ENCODING 37780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1358 +2248 +5CA8 +0920 +7C50 +0888 +2BFC +1C88 +1888 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+9395 +ENCODING 37781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +7010 +5BFF +CA20 +02FE +FA22 +23FF +2222 +FA22 +22FE +AA00 +AAFE +A282 +3A82 +6482 +C0FE +ENDCHAR +STARTCHAR U+9396 +ENCODING 37782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0924 +14A4 +12A8 +22F8 +5C88 +08F8 +7E88 +08F8 +2A88 +1CF8 +1850 +0E88 +7304 +0000 +ENDCHAR +STARTCHAR U+9397 +ENCODING 37783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1450 +12F8 +2304 +5CF8 +0888 +7EF8 +08F8 +2A80 +1DFC +1984 +0EFC +7084 +0000 +ENDCHAR +STARTCHAR U+9398 +ENCODING 37784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2C00 +64FE +4082 +FCFE +1000 +11FF +FD29 +1149 +9587 +D501 +517D +1D11 +7111 +C113 +ENDCHAR +STARTCHAR U+9399 +ENCODING 37785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1007 +2915 +44A5 +01F7 +7C45 +1155 +1157 +7DF5 +1045 +1045 +5445 +3845 +1089 +7D11 +0000 +0000 +ENDCHAR +STARTCHAR U+939A +ENCODING 37786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1220 +1978 +2548 +2448 +7878 +1340 +7D78 +1148 +5548 +3978 +3148 +1E80 +647C +0000 +ENDCHAR +STARTCHAR U+939B +ENCODING 37787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +3812 +2DFF +6410 +40FE +FC92 +10FE +1092 +FCFE +1092 +9404 +D5FF +5044 +1C24 +7004 +C01C +ENDCHAR +STARTCHAR U+939D +ENCODING 37789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +29FF +4444 +0010 +7C28 +1044 +1082 +7D7D +1000 +10FE +5482 +3882 +10FE +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+939E +ENCODING 37790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3820 +2CFE +6682 +40AA +FC92 +10AA +1082 +FCFE +1000 +9488 +D4EB +508E +1C88 +70E9 +C387 +ENDCHAR +STARTCHAR U+939F +ENCODING 37791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FC +2848 +4430 +0048 +7C00 +11EF +114A +7C84 +114A +1010 +55FF +3854 +1092 +7D11 +0000 +0000 +ENDCHAR +STARTCHAR U+93A1 +ENCODING 37793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +70CC +5848 +CBFF +0084 +F884 +2108 +2108 +FA52 +214A +A884 +A884 +A14A +394A +63DF +C251 +ENDCHAR +STARTCHAR U+93A2 +ENCODING 37794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +2080 +53FC +8A04 +03FC +FA00 +23FC +2200 +FBFE +2002 +22AA +AAAA +7004 +F818 +0000 +0000 +ENDCHAR +STARTCHAR U+93A3 +ENCODING 37795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +2A29 +2C2A +494C +1414 +2222 +4141 +7FFF +41C1 +02A0 +0FF8 +7087 +1FFC +0888 +0490 +7FFF +ENDCHAR +STARTCHAR U+93A4 +ENCODING 37796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +3882 +2CFE +6682 +40FE +FC00 +1092 +10D6 +FC54 +11FF +9448 +D448 +5048 +1CC9 +7089 +C187 +ENDCHAR +STARTCHAR U+93A5 +ENCODING 37797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +10A8 +3110 +5428 +1454 +14FE +1454 +11D2 +1220 +07F0 +0888 +17F4 +22A2 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+93A6 +ENCODING 37798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1060 +39DF +2D05 +6505 +414D +FD49 +11FB +1320 +FC00 +10FE +9492 +D492 +50FE +1C92 +7092 +C0FE +ENDCHAR +STARTCHAR U+93A7 +ENCODING 37799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A8 +14A8 +12F8 +2200 +5DFC +0800 +7EF8 +0888 +2AF8 +1C88 +1850 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+93A8 +ENCODING 37800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +3848 +2CFE +6590 +40FE +FC90 +10FE +1090 +FC90 +10FE +9400 +D410 +51FF +1C10 +7010 +C010 +ENDCHAR +STARTCHAR U+93A9 +ENCODING 37801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +204E +724A +594A +C88A +014A +FA13 +2000 +209F +F889 +23EB +A88A +A9CE +A1A4 +3AAE +648A +C09B +ENDCHAR +STARTCHAR U+93AA +ENCODING 37802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +2913 +4511 +01D7 +7D11 +11FF +1010 +7C7C +1044 +1044 +5428 +3810 +1028 +7DC7 +0000 +0000 +ENDCHAR +STARTCHAR U+93AB +ENCODING 37803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +39FF +2D01 +657D +4125 +FD19 +1165 +1000 +FC44 +1187 +9440 +D4FE +51A4 +1C18 +706C +C1C7 +ENDCHAR +STARTCHAR U+93AC +ENCODING 37804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1200 +22F8 +5C88 +08F8 +7E00 +09FC +2B04 +1D74 +1954 +0F74 +710C +0000 +ENDCHAR +STARTCHAR U+93AD +ENCODING 37805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0898 +08E0 +1484 +127C +2378 +5D48 +0978 +7F48 +0978 +2B48 +1D78 +19FC +0EC8 +7304 +0000 +ENDCHAR +STARTCHAR U+93AE +ENCODING 37806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +1420 +12F8 +2288 +5CF8 +0888 +7EF8 +0888 +2AF8 +1DFC +1850 +0E88 +7104 +0000 +ENDCHAR +STARTCHAR U+93AF +ENCODING 37807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +285F +45E9 +012A +7DEC +112A +11E9 +7D09 +1109 +1109 +554D +394A +11A8 +7D08 +0000 +0000 +ENDCHAR +STARTCHAR U+93B0 +ENCODING 37808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08F0 +0890 +1508 +13FC +2200 +7CF0 +0890 +7F08 +09FC +2B68 +1D68 +1968 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+93B1 +ENCODING 37809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +28FE +4410 +01FF +7C00 +10FE +1082 +7CFE +1000 +1041 +54CA +394C +1054 +7CE3 +0000 +0000 +ENDCHAR +STARTCHAR U+93B2 +ENCODING 37810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2892 +4454 +01FF +7D01 +117D +1044 +7C44 +107C +1048 +5448 +3848 +1089 +7D07 +0000 +0000 +ENDCHAR +STARTCHAR U+93B3 +ENCODING 37811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +21FC +5304 +89FC +0104 +F9FC +2104 +21FC +F820 +23FE +A8A8 +7124 +2222 +F820 +0000 +0000 +ENDCHAR +STARTCHAR U+93B4 +ENCODING 37812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3840 +2DFE +6502 +41FE +FD02 +11FE +1102 +FD02 +11FE +9420 +D430 +5052 +1D43 +7145 +C23C +ENDCHAR +STARTCHAR U+93B5 +ENCODING 37813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +7020 +5BFE +CA02 +0000 +F9FC +2040 +20A2 +FB26 +2054 +A890 +AB38 +A054 +3896 +6313 +C060 +ENDCHAR +STARTCHAR U+93B6 +ENCODING 37814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3BFF +2C04 +65E4 +4124 +FD24 +11E4 +100C +FC00 +13FF +9404 +D5E4 +5124 +1D24 +71E4 +C00C +ENDCHAR +STARTCHAR U+93B7 +ENCODING 37815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +2888 +4488 +00FE +7C88 +10FE +1088 +7C88 +10FF +1001 +5555 +3955 +1155 +7C03 +0000 +0000 +ENDCHAR +STARTCHAR U+93B9 +ENCODING 37817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1270 +1110 +1950 +2648 +2584 +7D78 +1020 +7CFC +1320 +5530 +3948 +3188 +1E80 +647C +0000 +ENDCHAR +STARTCHAR U+93BA +ENCODING 37818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +711E +5912 +CFD2 +0052 +F8DE +2092 +2192 +F912 +2392 +AD5E +A912 +A112 +3912 +6112 +C13F +ENDCHAR +STARTCHAR U+93C0 +ENCODING 37824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +283E +4420 +01FF +7D01 +1111 +1145 +7D29 +1193 +1129 +5545 +3993 +1101 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+93C1 +ENCODING 37825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A2 +3856 +2C54 +66FE +4092 +FCFE +1092 +1092 +FCFE +1010 +95FF +D454 +5054 +1CD6 +7193 +C010 +ENDCHAR +STARTCHAR U+93C2 +ENCODING 37826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +29FF +4500 +013E +7D22 +113E +1100 +7D77 +1155 +1155 +5555 +3977 +1100 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+93C3 +ENCODING 37827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +1920 +257C +27E0 +7920 +11BC +7DD0 +11FC +5590 +3AA8 +32A8 +1CC4 +6184 +0000 +ENDCHAR +STARTCHAR U+93C4 +ENCODING 37828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +39FF +2C10 +64FE +4092 +FCFE +1092 +10FE +FC14 +107E +95C3 +D404 +51FF +1C44 +7064 +C02C +ENDCHAR +STARTCHAR U+93C5 +ENCODING 37829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +7110 +593F +CB62 +0216 +FA9C +26B6 +22E3 +FABE +22A2 +AABE +AAA2 +A2BE +3AA2 +6222 +C226 +ENDCHAR +STARTCHAR U+93C6 +ENCODING 37830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C92 +65FF +4092 +FCFE +1000 +10FE +FC82 +10FE +9482 +D4FE +5082 +1CFE +7044 +C183 +ENDCHAR +STARTCHAR U+93C7 +ENCODING 37831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2090 +7090 +589F +CBD0 +0120 +F91F +21C5 +2145 +F954 +2154 +A957 +A954 +A354 +3A54 +62DC +C627 +ENDCHAR +STARTCHAR U+93C8 +ENCODING 37832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1120 +19FC +2420 +26F8 +79A8 +11F8 +7CA8 +13F8 +5520 +39FC +3120 +1EA0 +647C +0000 +ENDCHAR +STARTCHAR U+93C9 +ENCODING 37833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +7088 +5BE8 +C88F +03EA +FABA +22AA +22AA +FBEA +208E +A884 +A9C4 +A1AE +3A8A +648A +C09B +ENDCHAR +STARTCHAR U+93CA +ENCODING 37834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7F44 +087E +3EC8 +0948 +FE30 +1148 +1E86 +2440 +DFF0 +310E +DFF4 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+93CB +ENCODING 37835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +7088 +5BFF +C888 +0088 +F8F8 +2020 +23FF +FA21 +23AD +AAA5 +AAA5 +A36B +3A21 +6221 +C223 +ENDCHAR +STARTCHAR U+93CC +ENCODING 37836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +7088 +5BFF +C888 +0088 +F9FC +2104 +21FC +F904 +21FC +A820 +ABFF +A050 +38D8 +618C +C707 +ENDCHAR +STARTCHAR U+93CD +ENCODING 37837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2D11 +65FF +4111 +FDFF +1020 +1048 +FCD0 +1022 +95FF +D411 +5054 +1CD6 +7193 +C010 +ENDCHAR +STARTCHAR U+93CE +ENCODING 37838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +2892 +44FE +0092 +7CFE +1054 +11FF +7C54 +11FF +1010 +55FF +3810 +1010 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+93CF +ENCODING 37839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +29EF +4444 +01EF +7C44 +11EF +1044 +7C44 +1000 +10FE +5402 +39FF +1002 +7CFE +0000 +0000 +ENDCHAR +STARTCHAR U+93D0 +ENCODING 37840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +14D8 +1368 +22D8 +5D68 +0840 +7EA0 +0930 +2ACC +1C20 +18C8 +0E30 +71C0 +0000 +ENDCHAR +STARTCHAR U+93D1 +ENCODING 37841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1040 +1BFC +2510 +24A0 +7BF8 +1248 +7FF8 +1248 +56E8 +3AA8 +32E8 +1E08 +6218 +0000 +ENDCHAR +STARTCHAR U+93D2 +ENCODING 37842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2824 +447E +0084 +7D29 +13FF +1044 +7C92 +1125 +1048 +5410 +3864 +1008 +7CF0 +0000 +0000 +ENDCHAR +STARTCHAR U+93D3 +ENCODING 37843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3820 +2DFE +6522 +41BA +FD4A +11AA +1112 +FD2A +1102 +95FE +D410 +515A +1D4B +7145 +C23C +ENDCHAR +STARTCHAR U+93D4 +ENCODING 37844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4501 +00FE +7C10 +10FE +1092 +7C92 +10FE +1092 +5492 +38FE +1082 +7D01 +0000 +0000 +ENDCHAR +STARTCHAR U+93D5 +ENCODING 37845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4548 +01FE +7D4A +114A +11FE +7D00 +1144 +1144 +5577 +3944 +1144 +7E33 +0000 +0000 +ENDCHAR +STARTCHAR U+93D6 +ENCODING 37846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1FF8 +1248 +1FF8 +1758 +27E4 +593C +0EE0 +77DC +1FF0 +0920 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+93D7 +ENCODING 37847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1AA8 +27E8 +2650 +7BD0 +12A8 +7FC4 +1240 +55F8 +3840 +3040 +1FFC +6000 +0000 +ENDCHAR +STARTCHAR U+93D8 +ENCODING 37848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +12B8 +1AA8 +26E8 +27D0 +7AB0 +10A8 +7CC8 +13FC +56C8 +3AA8 +32A8 +1C88 +6098 +0000 +ENDCHAR +STARTCHAR U+93D9 +ENCODING 37849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3922 +2D22 +65FE +4048 +FC50 +10FE +1090 +FD90 +12FE +9490 +D490 +50FE +1C90 +7090 +C0FF +ENDCHAR +STARTCHAR U+93DA +ENCODING 37850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1006 +2805 +45FF +0124 +7D3C +1124 +11FC +7D24 +1124 +1175 +55AE +3925 +116B +7E21 +0000 +0000 +ENDCHAR +STARTCHAR U+93DC +ENCODING 37852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +38D6 +2C54 +6410 +41FF +FD01 +117D +1044 +FC44 +107C +9410 +D410 +50FE +1C10 +7010 +C1FF +ENDCHAR +STARTCHAR U+93DD +ENCODING 37853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1488 +12F8 +2288 +5CF8 +09FC +7F54 +09FC +2BF8 +1C88 +1850 +0E70 +738C +0000 +ENDCHAR +STARTCHAR U+93DE +ENCODING 37854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2BFF +4610 +02FE +7E12 +13FF +1212 +7EFE +1210 +12FE +5692 +5AFE +5292 +1EFE +6292 +0496 +ENDCHAR +STARTCHAR U+93DF +ENCODING 37855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +7020 +5BFF +C884 +00CC +F848 +23FF +2200 +FA90 +22FE +AB10 +AA10 +A2FE +3A10 +6410 +C1FF +ENDCHAR +STARTCHAR U+93E1 +ENCODING 37857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09F8 +1490 +13FC +2200 +5CF8 +0888 +7EF8 +0888 +2AF8 +1C50 +1854 +0E94 +730C +0000 +ENDCHAR +STARTCHAR U+93E2 +ENCODING 37858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39FF +2C28 +66FE +40AA +FCAA +10FE +1000 +FCFE +1000 +95FF +D410 +5054 +1CD6 +7193 +C030 +ENDCHAR +STARTCHAR U+93E3 +ENCODING 37859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4500 +0124 +7DFF +1124 +1124 +7D24 +113C +1100 +5500 +3955 +1155 +7E55 +0000 +0000 +ENDCHAR +STARTCHAR U+93E4 +ENCODING 37860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +14A8 +13FC +22A8 +5CF8 +08F8 +7EA8 +08F8 +2BFC +1C50 +18D0 +0E30 +71C8 +0000 +ENDCHAR +STARTCHAR U+93E5 +ENCODING 37861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1308 +2280 +5CFC +0920 +7F78 +0B48 +2B78 +1D48 +1948 +0F78 +7148 +0000 +ENDCHAR +STARTCHAR U+93E6 +ENCODING 37862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20A2 +70B6 +5914 +C900 +027F +F888 +2088 +2108 +FB2E +2128 +A928 +A928 +A128 +3938 +616C +C147 +ENDCHAR +STARTCHAR U+93E7 +ENCODING 37863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083C +FFA4 +0847 +7F00 +007E +7F22 +491C +7F63 +4100 +86C0 +1838 +EFE7 +0100 +3FFC +0920 +FFFF +ENDCHAR +STARTCHAR U+93E8 +ENCODING 37864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +7FE0 +3E80 +3EFC +2A90 +3E90 +7F10 +0910 +06C0 +7BBC +1FF0 +0920 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+93EC +ENCODING 37868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +2810 +45FF +017D +7D10 +111C +1101 +7D7E +1108 +112A +551C +397F +1208 +7C18 +0000 +0000 +ENDCHAR +STARTCHAR U+93EE +ENCODING 37870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4508 +017E +7D0A +117F +110A +7D7E +1108 +1108 +557A +392C +114A +7E19 +0000 +0000 +ENDCHAR +STARTCHAR U+93F5 +ENCODING 37877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +28FE +4444 +01FF +7C54 +1054 +11FF +7C54 +11FF +1010 +54FE +3810 +1010 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+93F6 +ENCODING 37878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +2890 +45FE +0310 +7FFE +1510 +11FE +7D10 +11FF +1510 +5410 +55FF +5038 +1C54 +6092 +0311 +ENDCHAR +STARTCHAR U+93F7 +ENCODING 37879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +3929 +2CAA +6428 +41FF +FC82 +1044 +10FE +FC10 +10FE +9410 +D5FF +5028 +1C6C +70C6 +C183 +ENDCHAR +STARTCHAR U+93F8 +ENCODING 37880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +7020 +5BFF +C820 +01FE +F922 +21FE +2122 +F9FE +2024 +A8FE +AB83 +A020 +3952 +6145 +C23C +ENDCHAR +STARTCHAR U+93F9 +ENCODING 37881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +77B2 +58A2 +C8FF +0089 +FB88 +223E +222A +FA2A +23AA +A8BE +A888 +A08A +398A +611F +C771 +ENDCHAR +STARTCHAR U+93FA +ENCODING 37882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2002 +71FC +5A49 +C94A +00CC +F986 +2303 +20FC +F848 +2048 +ABFF +A848 +A048 +38C9 +6189 +C307 +ENDCHAR +STARTCHAR U+93FB +ENCODING 37883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +3854 +2C10 +65FF +4054 +FCD6 +1193 +1090 +FCE2 +11BF +952A +D4EA +507F +1CC2 +7182 +C302 +ENDCHAR +STARTCHAR U+93FC +ENCODING 37884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0884 +14F7 +22A5 +4129 +3E10 +09FF +0810 +3EFE +0892 +0892 +2A38 +1C54 +0892 +7F11 +0000 +0000 +ENDCHAR +STARTCHAR U+93FD +ENCODING 37885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +71FC +5824 +CBFF +0024 +F9FC +2020 +22AA +FBAE +2222 +ABFE +AA22 +A3AE +3AAA +62AA +C422 +ENDCHAR +STARTCHAR U+93FE +ENCODING 37886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1140 +2944 +47E4 +014F +7D52 +13E2 +1002 +11EA +7D2A +11EA +552A +39E4 +112A +7D31 +0000 +0000 +ENDCHAR +STARTCHAR U+93FF +ENCODING 37887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2892 +4454 +01FF +7D00 +117C +1044 +7C7C +1010 +11FF +5454 +3892 +1111 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9400 +ENCODING 37888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +28FE +4492 +00FE +7DFF +1000 +10FE +7C82 +10FE +1082 +54FE +3882 +10FE +7D83 +0000 +0000 +ENDCHAR +STARTCHAR U+9401 +ENCODING 37889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2241 +7243 +5FEE +CA48 +0248 +FBCF +224A +224A +FBCA +224A +AA4A +AFEA +A28A +3ACA +6652 +C442 +ENDCHAR +STARTCHAR U+9402 +ENCODING 37890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +77FF +5850 +CBDE +0252 +FA52 +2252 +23DE +F850 +23FE +AA22 +AA22 +A3FE +3A22 +6222 +C3FE +ENDCHAR +STARTCHAR U+9403 +ENCODING 37891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +11F8 +1840 +27FC +2510 +7BB8 +1110 +7DBC +1300 +57FC +38A0 +30A4 +1D24 +621C +0000 +ENDCHAR +STARTCHAR U+9404 +ENCODING 37892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +2844 +45FF +0044 +7C7C +1010 +11FF +7C10 +11FF +1511 +55FF +5511 +51FF +1C00 +6082 +0101 +ENDCHAR +STARTCHAR U+9406 +ENCODING 37894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E24 +24FF +2822 +245C +2228 +325C +2CAA +21D9 +0220 +05D0 +0888 +17F4 +02A0 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+9407 +ENCODING 37895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +09E8 +14A8 +1270 +23FC +5C70 +08A8 +7F24 +08F8 +2AA8 +1CF8 +18A8 +0EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+9408 +ENCODING 37896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +38F0 +2C20 +65FF +4048 +FCFC +134B +1078 +FC00 +11FE +9502 +D57A +514A +1D7A +7102 +C10E +ENDCHAR +STARTCHAR U+9409 +ENCODING 37897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39CE +2C42 +65CE +4108 +FD29 +10E7 +1000 +FC48 +11FE +9448 +D448 +53FF +1C84 +7186 +C303 +ENDCHAR +STARTCHAR U+940A +ENCODING 37898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11DE +2952 +459E +0192 +7D5E +1140 +117F +7D50 +11BF +112B +554B +3915 +1129 +7D06 +0000 +0000 +ENDCHAR +STARTCHAR U+940B +ENCODING 37899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +123E +29A2 +44BE +0222 +7DBE +1080 +107F +7C10 +10BF +1355 +5515 +3915 +1169 +7D06 +0000 +0000 +ENDCHAR +STARTCHAR U+940C +ENCODING 37900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +28FC +4508 +00FE +7C92 +10FE +1010 +7C22 +11D2 +1034 +55D8 +3834 +11D3 +7C30 +0000 +0000 +ENDCHAR +STARTCHAR U+940D +ENCODING 37901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +71FE +5844 +C828 +03FF +F852 +2094 +2130 +FBFF +2249 +AA89 +AB7F +A249 +3A49 +6279 +C203 +ENDCHAR +STARTCHAR U+940E +ENCODING 37902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +3850 +2CFF +6490 +4190 +FCFE +1090 +1090 +FCFE +1090 +9490 +D4FF +5000 +1CAA +71AB +C129 +ENDCHAR +STARTCHAR U+940F +ENCODING 37903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +3844 +2DFF +6428 +40FE +FCAA +10CE +1082 +FCFE +1082 +94FE +D404 +51FF +1C44 +7024 +C00C +ENDCHAR +STARTCHAR U+9410 +ENCODING 37904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1354 +2288 +5DFC +0888 +7EF8 +0888 +2AF8 +1CA8 +18A4 +0F24 +7060 +0000 +ENDCHAR +STARTCHAR U+9411 +ENCODING 37905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +2844 +449F +0124 +7DE4 +1044 +109F +7D20 +11E0 +105F +54F1 +3951 +1051 +7C5F +0000 +0000 +ENDCHAR +STARTCHAR U+9412 +ENCODING 37906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +2955 +44EE +0044 +7CAA +1111 +1000 +11FF +7D21 +10FE +5422 +3822 +1042 +7C1C +0000 +0000 +ENDCHAR +STARTCHAR U+9413 +ENCODING 37907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1120 +1120 +1FE0 +27A0 +26BC +7AE8 +13E8 +7FA8 +1090 +55D0 +3B30 +3128 +1D48 +6384 +0000 +ENDCHAR +STARTCHAR U+9414 +ENCODING 37908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +18A0 +27F8 +26A8 +7BF8 +11F0 +7D10 +11F0 +5510 +39F0 +33FC +1C40 +6040 +0000 +ENDCHAR +STARTCHAR U+9415 +ENCODING 37909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2042 +73FF +594A +C94A +03FF +F8C6 +216A +2253 +F800 +21FE +A902 +A902 +A1FE +3902 +6102 +C1FE +ENDCHAR +STARTCHAR U+9416 +ENCODING 37910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +3996 +2D14 +6555 +4092 +FD14 +1155 +11D7 +FC12 +11FF +9510 +D512 +5194 +1D49 +7115 +C223 +ENDCHAR +STARTCHAR U+9417 +ENCODING 37911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +39EF +2D29 +65EF +4129 +FDEF +1101 +117D +FD45 +1145 +957D +D545 +5145 +1D7D +7101 +C103 +ENDCHAR +STARTCHAR U+9418 +ENCODING 37912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09F8 +1490 +13FC +22F8 +5CA8 +08F8 +7EA8 +08F8 +2A20 +1DF8 +1820 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+9419 +ENCODING 37913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08E8 +0868 +1574 +1294 +22F8 +5D08 +09FC +7E88 +08F8 +2A90 +1C50 +1860 +0FFC +7000 +0000 +ENDCHAR +STARTCHAR U+941A +ENCODING 37914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +18A0 +27B8 +2608 +7FB8 +12A8 +7CA0 +13FC +5440 +3AA8 +32A4 +1C94 +6070 +0000 +ENDCHAR +STARTCHAR U+941F +ENCODING 37919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +7084 +5BDF +C884 +0084 +FBDF +2084 +214A +FA01 +21FE +A902 +A902 +A1FE +3902 +6102 +C1FE +ENDCHAR +STARTCHAR U+9420 +ENCODING 37920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1082 +2844 +45FF +0028 +7CAA +106C +11FF +7C00 +10FE +1082 +54FE +3882 +10FE +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+9421 +ENCODING 37921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +10B0 +1BE8 +24A8 +27FC +7820 +13E8 +7E68 +13D8 +5650 +3994 +31EC +1E2C +6044 +0000 +ENDCHAR +STARTCHAR U+9425 +ENCODING 37925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1042 +2824 +45FF +0010 +00FE +7C10 +11FF +1092 +7C54 +13FF +5400 +54FE +5082 +1C82 +60FE +0082 +ENDCHAR +STARTCHAR U+9428 +ENCODING 37928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +29FE +444A +01FE +7D48 +11FF +108B +7CFC +1084 +10FC +54FC +3884 +10FC +7D02 +0000 +0000 +ENDCHAR +STARTCHAR U+9429 +ENCODING 37929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1041 +2A22 +457F +0008 +7DB4 +108D +1136 +7D0E +10B5 +1084 +5484 +3898 +10C0 +7D3F +0000 +0000 +ENDCHAR +STARTCHAR U+942A +ENCODING 37930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2838 +47FF +0221 +7EFC +123C +127C +7E54 +127C +1254 +567C +39FF +1041 +7D86 +0000 +0000 +ENDCHAR +STARTCHAR U+942B +ENCODING 37931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +15FC +1320 +23F8 +5DF8 +0920 +7FFC +0800 +2BDC +1D54 +1974 +0F04 +710C +0000 +ENDCHAR +STARTCHAR U+942C +ENCODING 37932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +285E +4450 +01FF +7C05 +11FF +1100 +11F4 +7D24 +116D +55B6 +3925 +12CB +7C01 +0000 +0000 +ENDCHAR +STARTCHAR U+942E +ENCODING 37934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +7010 +5BFF +CA44 +03FF +FA28 +22FE +222A +FBFF +222A +AAFE +AA28 +A26C +3AAA +6529 +C028 +ENDCHAR +STARTCHAR U+942F +ENCODING 37935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +3848 +2DFF +6448 +4022 +FCFE +1024 +1028 +FDFF +1010 +947E +D5C2 +507E +1C42 +7042 +C07E +ENDCHAR +STARTCHAR U+9430 +ENCODING 37936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +2844 +447C +0000 +7DEF +1129 +11EF +7C10 +11FF +1010 +5454 +3892 +1111 +7C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9431 +ENCODING 37937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +7070 +58D8 +C98C +0307 +F8F8 +2000 +23DE +FA52 +2252 +ABDE +A800 +A104 +3904 +638E +C6DB +ENDCHAR +STARTCHAR U+9432 +ENCODING 37938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +71FF +5949 +C949 +01FF +F880 +21FF +2321 +F9FD +2125 +A9FD +A821 +A029 +387B +61CA +C006 +ENDCHAR +STARTCHAR U+9433 +ENCODING 37939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +38FE +2C10 +65FF +4111 +FD55 +1111 +1054 +FC00 +10FE +9492 +D492 +50FE +1C92 +7092 +C0FE +ENDCHAR +STARTCHAR U+9434 +ENCODING 37940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +71C4 +595F +C940 +0151 +F95B +21CA +211F +F904 +21C4 +AB5F +AB44 +A544 +2144 +79C4 +C004 +ENDCHAR +STARTCHAR U+9435 +ENCODING 37941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1130 +13E8 +1928 +27FC +2420 +7BA8 +12A8 +7FA8 +13D8 +5510 +3B94 +31EC +1F4C +6084 +0000 +ENDCHAR +STARTCHAR U+9436 +ENCODING 37942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1554 +13FC +2200 +5DFC +0800 +7EF8 +0888 +2AF8 +1C64 +19D8 +0E68 +7184 +0000 +ENDCHAR +STARTCHAR U+9437 +ENCODING 37943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +29FF +4444 +00A4 +7DFF +10A4 +10BC +1080 +7CFF +1010 +55FF +3854 +1092 +7D11 +0000 +0000 +ENDCHAR +STARTCHAR U+9438 +ENCODING 37944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1554 +13FC +2220 +5CF8 +0820 +7FFC +0850 +2BFC +1C20 +18F8 +0E20 +7020 +0000 +ENDCHAR +STARTCHAR U+9439 +ENCODING 37945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +293E +44A2 +002E +7DAA +10FF +1141 +7D5D +10D5 +10D5 +54DD +38C3 +1080 +7D7F +0000 +0000 +ENDCHAR +STARTCHAR U+943A +ENCODING 37946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0924 +08A8 +15FC +1308 +22F8 +5C88 +08F8 +7E00 +09FC +2B24 +1DFC +1924 +0FFC +7104 +0000 +ENDCHAR +STARTCHAR U+943B +ENCODING 37947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +703E +5820 +CBFF +0221 +FAFC +2221 +221F +FA00 +23FF +AA20 +AAD1 +A22A +3ADC +622A +C4D9 +ENDCHAR +STARTCHAR U+943C +ENCODING 37948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4454 +01FF +7C44 +10FE +1082 +7CFE +1082 +10FE +5482 +38FE +1044 +7C82 +0000 +0000 +ENDCHAR +STARTCHAR U+943D +ENCODING 37949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +7208 +5B7F +C908 +007F +F822 +2014 +207F +FB08 +217F +A908 +A97F +A108 +3908 +6380 +C67F +ENDCHAR +STARTCHAR U+943E +ENCODING 37950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F10 +217C +3F28 +20FE +3F10 +517C +9F10 +0290 +0C60 +37DE +C104 +1FF0 +0920 +0548 +7FFC +0000 +ENDCHAR +STARTCHAR U+943F +ENCODING 37951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3820 +2DFE +6484 +4048 +FDFF +1000 +10FC +FC84 +10FC +9484 +D4FC +5020 +1D52 +7145 +C23C +ENDCHAR +STARTCHAR U+9440 +ENCODING 37952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +29FE +4454 +0092 +7DFF +112D +10D2 +7D3E +1040 +107E +54A4 +3824 +1018 +7CE7 +0000 +0000 +ENDCHAR +STARTCHAR U+9441 +ENCODING 37953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +093C +15D4 +13B4 +236C +5D94 +09FC +7E54 +09CC +2A70 +1CD0 +1920 +0C50 +718C +0000 +ENDCHAR +STARTCHAR U+9443 +ENCODING 37955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +71EF +5821 +C9EF +0021 +F9EF +2088 +2110 +FBFF +2510 +A9FE +A910 +A1FE +3910 +6110 +C1FF +ENDCHAR +STARTCHAR U+9444 +ENCODING 37956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +13FC +1840 +25F0 +27FC +79E8 +1040 +7DF0 +13FC +5408 +3BFC +32C8 +1FA8 +6018 +0000 +ENDCHAR +STARTCHAR U+9445 +ENCODING 37957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +7555 +5955 +CA8A +0451 +F800 +23FE +2202 +F820 +27FF +A8A8 +A8A8 +A1AC +3B26 +6623 +C020 +ENDCHAR +STARTCHAR U+9446 +ENCODING 37958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1062 +296A +44F2 +0062 +7DF2 +111F +10A2 +7DFA +1046 +1042 +55F2 +3842 +1042 +7DF6 +0000 +0000 +ENDCHAR +STARTCHAR U+9447 +ENCODING 37959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4444 +01EF +7D56 +1255 +1196 +7C82 +10FE +1082 +54FE +3882 +1082 +7D02 +0000 +0000 +ENDCHAR +STARTCHAR U+9448 +ENCODING 37960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +77FF +5924 +CA22 +07FF +FA22 +2376 +22AA +FB76 +2222 +AB76 +AAAA +A376 +3A22 +6222 +C226 +ENDCHAR +STARTCHAR U+9449 +ENCODING 37961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +29FF +4454 +00FE +7C10 +11FF +1044 +7DFE +1001 +10FE +54AA +38AA +10AA +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+944A +ENCODING 37962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +73FF +5844 +C890 +01FF +FB10 +21FE +2110 +F9FE +2110 +A9FF +A800 +A3FE +3884 +6078 +C387 +ENDCHAR +STARTCHAR U+944B +ENCODING 37963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +043E +7FC0 +3F95 +24AA +3F95 +3F9F +7FC4 +05DF +0220 +07F0 +0888 +17F4 +2492 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+944C +ENCODING 37964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +73FF +5A01 +C9FE +00A4 +FB2B +2030 +21FE +FB02 +21FE +A902 +A9FE +A102 +39FE +6084 +C303 +ENDCHAR +STARTCHAR U+944F +ENCODING 37967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2BFF +4601 +02B5 +7CAA +103C +11FE +7D4A +13FF +1000 +55FE +3810 +1010 +7C30 +0000 +0000 +ENDCHAR +STARTCHAR U+9450 +ENCODING 37968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2810 +45FF +0155 +7D33 +1000 +11FF +7C20 +11FF +1129 +5529 +3929 +1129 +7D03 +0000 +0000 +ENDCHAR +STARTCHAR U+9451 +ENCODING 37969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +13D0 +1A90 +27DC +2660 +7BC0 +129C +7FC0 +1200 +55F8 +3968 +3168 +1FFC +6000 +0000 +ENDCHAR +STARTCHAR U+9452 +ENCODING 37970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3E80 +29FC +3E00 +25F8 +3D68 +29F8 +3F00 +06C0 +7BBC +1FF0 +0920 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+9453 +ENCODING 37971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +12F8 +19A8 +25F8 +2420 +79FC +1070 +7F50 +1170 +5578 +3948 +3178 +1EC0 +647C +0000 +ENDCHAR +STARTCHAR U+9455 +ENCODING 37973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2063 +71CE +5908 +C9EF +014A +FA52 +2000 +21FE +F902 +21FE +A902 +A9FE +A102 +39FE +6084 +C303 +ENDCHAR +STARTCHAR U+9457 +ENCODING 37975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +2B88 +449F +03E5 +7DC5 +12A5 +108B +7C70 +10A8 +112C +57F2 +3871 +10A8 +7D24 +0000 +0000 +ENDCHAR +STARTCHAR U+9459 +ENCODING 37977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20CA +7789 +593F +C914 +07D4 +F927 +2190 +235E +FB50 +251F +A800 +A9FE +A102 +39FE +6102 +C1FE +ENDCHAR +STARTCHAR U+945A +ENCODING 37978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +09F8 +1490 +13FC +22D0 +5D28 +08FC +7E88 +08F8 +2AF8 +1C88 +18F8 +0EC8 +7304 +0000 +ENDCHAR +STARTCHAR U+945B +ENCODING 37979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +13FC +1A50 +27FC +2650 +7A70 +13FC +7EF8 +12A8 +56F8 +3AA8 +32F8 +1CC8 +6704 +0000 +ENDCHAR +STARTCHAR U+945C +ENCODING 37980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +3854 +2DFF +6501 +417D +FC44 +107C +1000 +FCFE +1082 +94FE +D482 +50FE +1C82 +70FE +C183 +ENDCHAR +STARTCHAR U+945D +ENCODING 37981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1042 +2AF7 +4562 +003E +7C54 +1388 +1094 +7CAA +117F +10BE +5488 +38FF +1308 +7CFF +0000 +0000 +ENDCHAR +STARTCHAR U+945E +ENCODING 37982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1150 +1150 +1AA0 +2550 +27F8 +7AE8 +1398 +7FF8 +1368 +56D8 +3B68 +32DC +1F64 +6484 +0000 +ENDCHAR +STARTCHAR U+945F +ENCODING 37983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +39FF +2C10 +64FE +4000 +FDFF +1149 +11FF +FC82 +10FE +9482 +D4FE +5082 +1CFE +7044 +C183 +ENDCHAR +STARTCHAR U+9460 +ENCODING 37984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1288 +15F4 +2DB4 +26E8 +7AA8 +15F4 +7F5C +1040 +57FC +38E0 +3150 +1E4C +6040 +0000 +ENDCHAR +STARTCHAR U+9461 +ENCODING 37985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3850 +2C5E +6450 +4050 +FDFF +1082 +10D6 +FCBA +1092 +94FE +D492 +50BA +1CD6 +7082 +C0FE +ENDCHAR +STARTCHAR U+9462 +ENCODING 37986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1078 +1BFC +2668 +27B8 +7AF8 +12A8 +7EF8 +12A8 +56F8 +3A28 +32D4 +1CCC +6538 +0000 +ENDCHAR +STARTCHAR U+9463 +ENCODING 37987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +39FF +2D48 +65FF +4149 +FDFF +1100 +114B +FD7E +1148 +9548 +D579 +51C7 +1D00 +72AA +C095 +ENDCHAR +STARTCHAR U+9464 +ENCODING 37988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FC +51F4 +8904 +01FC +F888 +23FE +2088 +FBFE +2124 +22AA +A870 +70A8 +2366 +F822 +0000 +0000 +ENDCHAR +STARTCHAR U+9468 +ENCODING 37992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +7088 +5BEF +C948 +014E +FBE2 +200E +23E8 +FA2E +23E8 +AA2E +ABE8 +A22E +3A29 +622D +C267 +ENDCHAR +STARTCHAR U+9469 +ENCODING 37993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2810 +45D7 +0155 +7DD7 +1010 +11FF +7C10 +1010 +11D7 +5555 +39D7 +1010 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+946A +ENCODING 37994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1078 +1BFC +2668 +27B8 +7AF8 +12A8 +7EF8 +12A8 +56F8 +3BF8 +3568 +1D68 +67FC +0000 +ENDCHAR +STARTCHAR U+946B +ENCODING 37995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +06C0 +1830 +EFEE +0100 +1FF0 +0540 +3FF8 +1010 +2828 +7C7C +9392 +7C7C +1010 +5454 +FEFE +ENDCHAR +STARTCHAR U+946D +ENCODING 37997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23DE +7252 +5BDE +CA52 +03DE +FA22 +22FA +2222 +FAFA +22AA +AAFA +AAAA +A2FA +3A72 +62AA +C226 +ENDCHAR +STARTCHAR U+946E +ENCODING 37998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +77FF +5888 +C802 +0209 +F97F +2108 +247F +FA49 +227F +A849 +A97F +A102 +3A7F +6222 +C616 +ENDCHAR +STARTCHAR U+946F +ENCODING 37999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2128 +712A +5ADB +CAD9 +0008 +FFFF +2148 +236A +F94A +236A +A94E +AB64 +A14C +39ED +6717 +C022 +ENDCHAR +STARTCHAR U+9470 +ENCODING 38000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +10A0 +1910 +27FC +2400 +7FFC +15B4 +7FFC +13F8 +56A8 +3BF8 +32A8 +1EA8 +62B8 +0000 +ENDCHAR +STARTCHAR U+9471 +ENCODING 38001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1078 +3890 +2FFE +6502 +41FE +FC88 +10EE +1089 +FDE7 +1000 +95FE +D522 +51FE +1C54 +60D1 +C18F +ENDCHAR +STARTCHAR U+9472 +ENCODING 38002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +77FF +5800 +C9DC +0154 +F9DC +2088 +23FE +F888 +23FE +A888 +ABFF +A048 +3B8A +60E4 +C383 +ENDCHAR +STARTCHAR U+9473 +ENCODING 38003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +29FF +4529 +01FF +7CFE +1028 +10FE +7C44 +10FE +1145 +547C +389C +1090 +7D7E +0000 +0000 +ENDCHAR +STARTCHAR U+9474 +ENCODING 38004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1111 +29FF +4448 +00FE +7D88 +10FE +10FE +7C88 +10FE +11FF +5529 +39FF +1145 +7D7D +0000 +0000 +ENDCHAR +STARTCHAR U+9475 +ENCODING 38005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10A0 +17FC +18A0 +27B8 +26A8 +7BB8 +1090 +7DFC +1320 +55F8 +39F8 +3120 +1DFC +6100 +0000 +ENDCHAR +STARTCHAR U+9476 +ENCODING 38006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +2BFF +4448 +0005 +7EFF +1284 +13FC +7CD4 +13FC +12CD +56FE +3955 +1253 +7C79 +0000 +0000 +ENDCHAR +STARTCHAR U+9477 +ENCODING 38007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13FC +1890 +24F0 +24F0 +7BF0 +1010 +7FFC +12A8 +57B8 +3BB8 +32A8 +1FF8 +6088 +0000 +ENDCHAR +STARTCHAR U+9478 +ENCODING 38008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +2892 +44FE +0092 +7CFE +11EF +116D +7DEF +116D +11EF +5410 +38FE +1010 +7DFF +0000 +0000 +ENDCHAR +STARTCHAR U+947C +ENCODING 38012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F8 +1AA8 +27F8 +2528 +7950 +16FC +7D50 +12F8 +57D0 +3978 +33D0 +1D7C +6140 +0000 +ENDCHAR +STARTCHAR U+947D +ENCODING 38013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1198 +11FC +1AA8 +27FC +25D8 +7AAC +11FC +7D08 +11F8 +55F8 +3908 +31F8 +1D98 +6604 +0000 +ENDCHAR +STARTCHAR U+947E +ENCODING 38014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +17D4 +6BE8 +1798 +7FFC +3AB8 +57D4 +1110 +06C0 +7BBC +1FF0 +0920 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+947F +ENCODING 38015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2D70 +7FD0 +1254 +3F8C +7FF8 +2B50 +3BF0 +3F0C +06C0 +7BBC +1FF0 +0920 +3FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+9480 +ENCODING 38016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +29E6 +47E5 +053F +7FC4 +15C4 +17E4 +7DC4 +1144 +11C4 +57E4 +3EA4 +17EA +7D31 +0000 +0000 +ENDCHAR +STARTCHAR U+9481 +ENCODING 38017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +13B8 +12A8 +1BB8 +27B8 +27B8 +79FC +13F8 +7DF8 +1120 +55FC +3BF8 +3090 +1C60 +639C +0000 +ENDCHAR +STARTCHAR U+9482 +ENCODING 38018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1092 +29FF +4501 +017D +7C44 +107C +10FE +7CBA +10FE +1010 +54FE +3810 +11FF +7D29 +0000 +0000 +ENDCHAR +STARTCHAR U+9483 +ENCODING 38019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FF +7201 +5BFF +CA10 +02D6 +FA10 +22FE +22AA +FAFF +2251 +ABFD +AAA5 +A2FD +3A29 +647D +C1C7 +ENDCHAR +STARTCHAR U+9484 +ENCODING 38020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2088 +77FF +5888 +CBDE +0252 +FBDE +2252 +23DE +FA22 +23FE +AAAA +AAFA +A2AA +3AFA +6272 +C3AE +ENDCHAR +STARTCHAR U+9485 +ENCODING 38021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1400 +1E00 +2000 +2000 +7C00 +9000 +1400 +FE00 +1000 +1000 +1200 +1400 +1800 +1000 +0000 +ENDCHAR +STARTCHAR U+9486 +ENCODING 38022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1480 +1E80 +2080 +2080 +7C80 +9080 +1480 +FE80 +1080 +1080 +1282 +1482 +1882 +107E +0000 +ENDCHAR +STARTCHAR U+9487 +ENCODING 38023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1400 +1EFC +2008 +2010 +7C20 +9020 +1440 +FE40 +1080 +1080 +1100 +1502 +1902 +10FE +0000 +ENDCHAR +STARTCHAR U+9488 +ENCODING 38024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1E20 +2020 +2024 +7DFE +9020 +1020 +FE20 +1020 +1220 +1420 +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+9489 +ENCODING 38025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +13FE +1C20 +2020 +2020 +7C20 +9020 +1020 +FC20 +1020 +1220 +1420 +1820 +10A0 +0040 +ENDCHAR +STARTCHAR U+948A +ENCODING 38026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1204 +1F04 +2044 +2444 +7E44 +9044 +1244 +FF44 +1044 +1044 +1244 +1404 +1804 +1014 +0008 +ENDCHAR +STARTCHAR U+948B +ENCODING 38027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1440 +1E40 +2040 +2040 +7C60 +9050 +1448 +FE44 +1044 +1040 +1240 +1440 +1840 +1040 +0040 +ENDCHAR +STARTCHAR U+948C +ENCODING 38028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1400 +1EFC +2004 +2008 +7C30 +9020 +1420 +FE20 +1020 +1020 +1220 +1420 +1820 +10A0 +0040 +ENDCHAR +STARTCHAR U+948D +ENCODING 38029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1420 +1E20 +2020 +2020 +7C28 +91FC +1420 +FE20 +1020 +1020 +1220 +1420 +1824 +13FE +0000 +ENDCHAR +STARTCHAR U+948E +ENCODING 38030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +11E0 +1C20 +2020 +4020 +BC24 +13FE +1020 +FC20 +1020 +1020 +1420 +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+948F +ENCODING 38031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1504 +1F24 +2124 +2124 +7D24 +9124 +1524 +FF24 +1124 +1124 +1324 +1524 +1924 +1204 +0404 +ENDCHAR +STARTCHAR U+9490 +ENCODING 38032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +120C +1F10 +2020 +2440 +7E84 +900C +1210 +FF20 +1042 +1006 +1208 +1410 +1860 +1180 +0600 +ENDCHAR +STARTCHAR U+9492 +ENCODING 38034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +11F8 +3D10 +2110 +4110 +FD90 +1150 +1150 +FD10 +1110 +1110 +1510 +1A12 +1212 +040E +0800 +ENDCHAR +STARTCHAR U+9493 +ENCODING 38035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1044 +1C7E +2084 +2104 +7C04 +9084 +1064 +FC24 +1004 +1204 +1404 +1844 +1028 +0010 +ENDCHAR +STARTCHAR U+9494 +ENCODING 38036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +117E +1C84 +2204 +2204 +7E04 +9204 +1204 +FE04 +1204 +1204 +1204 +1604 +1A04 +1214 +0208 +ENDCHAR +STARTCHAR U+9495 +ENCODING 38037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1440 +1E40 +2040 +2044 +7FFE +9088 +1488 +FE88 +1108 +1088 +1250 +1420 +1850 +118C +0604 +ENDCHAR +STARTCHAR U+9497 +ENCODING 38039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1404 +1EFE +2004 +2144 +7CA8 +90A8 +1448 +FE50 +1020 +1050 +1250 +1488 +1888 +1106 +0604 +ENDCHAR +STARTCHAR U+9499 +ENCODING 38041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1020 +1C28 +213C +2120 +7D20 +9124 +11FE +7C04 +1004 +1004 +1404 +1844 +1028 +0010 +ENDCHAR +STARTCHAR U+949A +ENCODING 38042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1404 +1FFE +2010 +2010 +7C20 +9020 +1460 +FEA8 +1126 +1222 +1020 +1420 +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+949B +ENCODING 38043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1440 +1E40 +2040 +2044 +7FFE +9040 +1440 +FEA0 +10A0 +1090 +1510 +1988 +1248 +0446 +0804 +ENDCHAR +STARTCHAR U+949C +ENCODING 38044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +15FC +1F00 +2100 +2108 +7DFC +9108 +1508 +FF08 +11F8 +1100 +1100 +1500 +1904 +11FE +0000 +ENDCHAR +STARTCHAR U+949D +ENCODING 38045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1C24 +23FE +2020 +7D24 +9124 +1124 +FD24 +11FC +1124 +1020 +1422 +1822 +101E +0000 +ENDCHAR +STARTCHAR U+949E +ENCODING 38046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +1C40 +2150 +2148 +7D46 +9242 +1248 +7C48 +1048 +1050 +1410 +1820 +10C0 +0700 +ENDCHAR +STARTCHAR U+949F +ENCODING 38047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1C24 +21FE +2124 +7D24 +9124 +1124 +FDFC +1124 +1020 +1420 +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+94A0 +ENCODING 38048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +3844 +23FE +4244 +7A44 +A244 +2244 +FAA4 +2294 +2314 +2204 +2A04 +3204 +2214 +0208 +ENDCHAR +STARTCHAR U+94A1 +ENCODING 38049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +11FE +1D04 +2124 +4124 +BD24 +1124 +1124 +FD24 +1124 +1144 +1450 +1888 +1106 +0202 +ENDCHAR +STARTCHAR U+94A2 +ENCODING 38050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1204 +1E04 +230C +228C +7E54 +9224 +1224 +7E54 +128C +130C +1604 +1A04 +1214 +0208 +ENDCHAR +STARTCHAR U+94A3 +ENCODING 38051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +141C +1FE0 +2100 +2100 +7DFC +9104 +1544 +FF48 +1148 +1130 +1110 +1528 +1A48 +1286 +0504 +ENDCHAR +STARTCHAR U+94A4 +ENCODING 38052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1440 +1EA0 +20A0 +2110 +7E8E +9444 +1040 +FE00 +11F8 +1008 +1210 +1410 +1820 +1040 +0080 +ENDCHAR +STARTCHAR U+94A5 +ENCODING 38053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1D08 +2108 +21F8 +7D08 +9108 +1108 +FDF8 +1108 +1108 +1508 +1908 +1228 +0410 +ENDCHAR +STARTCHAR U+94A6 +ENCODING 38054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1040 +1C7C +2084 +2108 +7E20 +9020 +1020 +FC20 +1050 +1250 +1488 +188E +1104 +0200 +ENDCHAR +STARTCHAR U+94A7 +ENCODING 38055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1484 +1EFE +2104 +4104 +BE84 +1044 +1014 +7C24 +1044 +1184 +1484 +1804 +1028 +0010 +ENDCHAR +STARTCHAR U+94A8 +ENCODING 38056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1088 +11FC +1D08 +2108 +2108 +7D28 +9110 +1104 +7DFE +1004 +1024 +17F4 +1804 +1014 +0008 +ENDCHAR +STARTCHAR U+94A9 +ENCODING 38057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1084 +1CFE +2104 +2204 +7C44 +9044 +1084 +7CA4 +11F4 +1014 +1404 +1804 +1028 +0010 +ENDCHAR +STARTCHAR U+94AA +ENCODING 38058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1420 +1E04 +21FE +2000 +7C10 +90F8 +1490 +FE90 +1090 +1090 +1290 +1512 +1912 +120E +0400 +ENDCHAR +STARTCHAR U+94AB +ENCODING 38059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1420 +1E24 +21FE +2040 +7C44 +907E +1444 +FE44 +1044 +1084 +1084 +1504 +1904 +1228 +0410 +ENDCHAR +STARTCHAR U+94AC +ENCODING 38060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1420 +1E20 +2020 +20A4 +7CAC +90B0 +1120 +FE20 +1050 +1050 +1250 +1488 +1888 +1106 +0204 +ENDCHAR +STARTCHAR U+94AD +ENCODING 38061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1488 +1E48 +2048 +2408 +7E88 +9048 +1448 +FE0E +1078 +1388 +1008 +1408 +1808 +1008 +0008 +ENDCHAR +STARTCHAR U+94AE +ENCODING 38062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +27FC +3908 +4108 +8108 +7908 +2108 +27F8 +F908 +2108 +2108 +2908 +3108 +2108 +0FFE +0000 +ENDCHAR +STARTCHAR U+94AF +ENCODING 38063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F24 +2124 +2124 +7D24 +9124 +11FC +FF04 +1100 +1100 +1300 +1502 +1902 +10FE +0000 +ENDCHAR +STARTCHAR U+94B0 +ENCODING 38064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1E20 +2020 +2020 +7C20 +9028 +11FC +FE20 +1030 +1028 +1228 +1420 +1824 +13FE +0000 +ENDCHAR +STARTCHAR U+94B1 +ENCODING 38065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +1048 +3C7C +43C0 +8040 +3C44 +107E +13C0 +FC44 +104C +1030 +1420 +1852 +118A +0006 +ENDCHAR +STARTCHAR U+94B2 +ENCODING 38066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1E20 +2020 +2020 +7C20 +9124 +113E +FD20 +1120 +1120 +1120 +1520 +1924 +17FE +0000 +ENDCHAR +STARTCHAR U+94B3 +ENCODING 38067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +1088 +1C88 +23FE +4088 +BC88 +1088 +1088 +FCF8 +1088 +1088 +1488 +1888 +10F8 +0088 +ENDCHAR +STARTCHAR U+94B4 +ENCODING 38068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1420 +1E20 +2024 +23FE +7C20 +9020 +1024 +FDFE +1104 +1104 +1104 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+94B5 +ENCODING 38069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2040 +3848 +47FC +8040 +78E0 +20D0 +2148 +FA4E +2444 +21F0 +2840 +3040 +2040 +0040 +ENDCHAR +STARTCHAR U+94B6 +ENCODING 38070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1404 +1FFE +2008 +2008 +7DE8 +9128 +1128 +FF28 +1128 +11E8 +1108 +1408 +1808 +1028 +0010 +ENDCHAR +STARTCHAR U+94B7 +ENCODING 38071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F00 +2108 +217C +7D48 +9148 +1148 +FF48 +1148 +1178 +1148 +1500 +1904 +11FE +0000 +ENDCHAR +STARTCHAR U+94B8 +ENCODING 38072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1E44 +23FE +2080 +7CA0 +9124 +13FE +FD24 +1124 +1124 +1124 +1534 +1928 +1020 +0020 +ENDCHAR +STARTCHAR U+94B9 +ENCODING 38073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1450 +1E48 +2048 +23FE +7C40 +9040 +14FC +FE84 +10A4 +10A8 +1328 +1510 +1928 +1246 +0484 +ENDCHAR +STARTCHAR U+94BA +ENCODING 38074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1428 +1E24 +2020 +21FE +7D20 +9120 +1524 +FF24 +1124 +1118 +1350 +1592 +192A +104A +0084 +ENDCHAR +STARTCHAR U+94BB +ENCODING 38075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +1E3E +2020 +2020 +7C24 +91FE +1104 +FF04 +1104 +1304 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+94BC +ENCODING 38076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F04 +2104 +2104 +7DFC +9104 +1104 +FF04 +11FC +1104 +1304 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+94BD +ENCODING 38077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1404 +1FFE +2104 +2104 +7D04 +91FC +1104 +FF04 +1104 +11FC +1104 +1400 +1800 +13FE +0000 +ENDCHAR +STARTCHAR U+94BE +ENCODING 38078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +11FE +1D24 +2124 +2124 +7DFC +9124 +1124 +FD24 +11FC +1124 +1420 +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+94BF +ENCODING 38079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1404 +1FFE +2124 +2124 +7D24 +9124 +1124 +FDFC +1124 +1124 +1124 +1524 +1924 +11FC +0104 +ENDCHAR +STARTCHAR U+94C0 +ENCODING 38080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1024 +1DFE +2124 +2124 +7D24 +9124 +11FC +7D24 +1124 +1124 +1524 +19FC +1104 +0000 +ENDCHAR +STARTCHAR U+94C1 +ENCODING 38081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1140 +1150 +1DF8 +2140 +2240 +7C48 +93FC +1040 +7C40 +10A0 +10A0 +1510 +1910 +120E +0404 +ENDCHAR +STARTCHAR U+94C2 +ENCODING 38082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1084 +1DFE +2104 +2104 +7D04 +9104 +11FC +7D04 +1104 +1104 +1504 +19FC +1104 +0000 +ENDCHAR +STARTCHAR U+94C3 +ENCODING 38083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +10A0 +1CA0 +2110 +2288 +7C4E +9044 +1000 +7DF8 +1008 +1010 +14A0 +1840 +1020 +0020 +ENDCHAR +STARTCHAR U+94C4 +ENCODING 38084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +101C +1DE0 +2100 +2120 +7D20 +9124 +15FE +FE20 +1020 +10A8 +10A4 +1526 +1A22 +10A0 +0040 +ENDCHAR +STARTCHAR U+94C5 +ENCODING 38085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +10FC +1088 +1C88 +2088 +4088 +BD06 +1200 +1004 +FDFE +1104 +1104 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+94C6 +ENCODING 38086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +263E +3CA4 +44A4 +84A4 +7CA4 +24A4 +24A4 +FDA4 +26B4 +24A8 +20A0 +2920 +3120 +2220 +0420 +ENDCHAR +STARTCHAR U+94C8 +ENCODING 38088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1E24 +23FE +2020 +7C24 +91FE +1524 +FF24 +1124 +1124 +1124 +1524 +192C +1020 +0020 +ENDCHAR +STARTCHAR U+94C9 +ENCODING 38089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1E24 +23FE +2040 +7C40 +9088 +1108 +FDF0 +1020 +1040 +1240 +1488 +1904 +13FC +0004 +ENDCHAR +STARTCHAR U+94CA +ENCODING 38090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1E20 +23FE +2202 +7C84 +9080 +1490 +FCB0 +10C0 +1080 +1080 +1482 +1882 +107E +0000 +ENDCHAR +STARTCHAR U+94CB +ENCODING 38091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1444 +1E24 +2028 +2088 +7C90 +9090 +12A4 +FEA2 +12C2 +1482 +1080 +1584 +1A84 +147C +0000 +ENDCHAR +STARTCHAR U+94CC +ENCODING 38092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F04 +2104 +21FC +7D00 +9140 +1544 +FF4C +1150 +1160 +1140 +1542 +1942 +123E +0400 +ENDCHAR +STARTCHAR U+94CD +ENCODING 38093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1420 +1E20 +21FE +2122 +7D24 +9120 +15FC +FF08 +1148 +1150 +1120 +1550 +1A48 +128E +0504 +ENDCHAR +STARTCHAR U+94CE +ENCODING 38094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +15FC +1E88 +2050 +2020 +7C50 +908E +1324 +FEF8 +1020 +1028 +11FC +1420 +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+94D0 +ENCODING 38096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1444 +1FF8 +2050 +2464 +7FFE +9040 +1088 +FDFC +1240 +147C +1204 +1404 +1844 +1028 +0010 +ENDCHAR +STARTCHAR U+94D1 +ENCODING 38097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +1DFC +2048 +2050 +7C64 +93FE +1080 +FD88 +1298 +14A0 +10C0 +1484 +1884 +107C +0000 +ENDCHAR +STARTCHAR U+94D2 +ENCODING 38098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +17FE +1D08 +2108 +2108 +7DF8 +9108 +1108 +FDF8 +1108 +1108 +113E +17C8 +1808 +1008 +0008 +ENDCHAR +STARTCHAR U+94D5 +ENCODING 38101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1484 +1FFE +2080 +2108 +7DFC +9308 +1508 +FDF8 +1108 +1108 +11F8 +1508 +1908 +1128 +0110 +ENDCHAR +STARTCHAR U+94D6 +ENCODING 38102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1018 +1C14 +23FE +2210 +7E10 +9210 +13D4 +FE54 +1254 +1254 +1758 +1A88 +120A +040A +0806 +ENDCHAR +STARTCHAR U+94D7 +ENCODING 38103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1E48 +23FC +2040 +7E48 +9150 +1044 +FFFE +1040 +10A0 +10A0 +1510 +1910 +120E +0C04 +ENDCHAR +STARTCHAR U+94D8 +ENCODING 38104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2FFC +38A4 +22A4 +42A4 +7CA8 +A4A4 +27E4 +F9A2 +21A2 +22A2 +2AB4 +34A8 +24A0 +0AA0 +0120 +ENDCHAR +STARTCHAR U+94D9 +ENCODING 38105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1E5C +23E0 +2028 +7C32 +91CE +1400 +FFFC +1090 +1090 +1090 +1512 +1912 +120E +0400 +ENDCHAR +STARTCHAR U+94DB +ENCODING 38107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1524 +1EA4 +20A8 +20B0 +7C24 +93FE +1004 +FE04 +1004 +11FC +1004 +1404 +1804 +13FC +0004 +ENDCHAR +STARTCHAR U+94DC +ENCODING 38108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +3E04 +4204 +82F4 +7A04 +2204 +22F4 +FA94 +2294 +2294 +26F4 +2A04 +3204 +2214 +0208 +ENDCHAR +STARTCHAR U+94DD +ENCODING 38109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1D08 +2108 +2108 +7D08 +91F8 +1000 +7C04 +13FE +1204 +1204 +1604 +1A04 +13FC +0204 +ENDCHAR +STARTCHAR U+94DE +ENCODING 38110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +3A08 +2208 +43F8 +7840 +A044 +27FE +FC44 +2444 +2444 +2444 +2C54 +3448 +2040 +0040 +ENDCHAR +STARTCHAR U+94DF +ENCODING 38111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27FE +3C04 +2444 +4444 +7C54 +A7FC +2444 +FC44 +24A4 +2494 +2514 +2C04 +3404 +27FC +0404 +ENDCHAR +STARTCHAR U+94E0 +ENCODING 38112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1524 +1F24 +2124 +21FC +7C00 +91FC +1404 +FE04 +11FC +1104 +1100 +1502 +1902 +10FE +0000 +ENDCHAR +STARTCHAR U+94E1 +ENCODING 38113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +27E4 +3C44 +4554 +8554 +7D54 +2554 +2554 +FD54 +2554 +2554 +2114 +2A84 +3244 +2454 +0808 +ENDCHAR +STARTCHAR U+94E2 +ENCODING 38114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1120 +1D28 +21FC +2220 +7E20 +9024 +13FE +FC60 +1070 +10A8 +14A8 +1924 +1226 +0420 +0020 +ENDCHAR +STARTCHAR U+94E3 +ENCODING 38115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1120 +1128 +1DFC +2120 +2220 +7C24 +93FE +1050 +7C50 +1050 +1090 +1492 +1912 +120E +0400 +ENDCHAR +STARTCHAR U+94E4 +ENCODING 38116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +100C +1C70 +2790 +2090 +7D14 +927E +1390 +FC90 +1090 +1494 +12FE +1500 +1980 +1246 +043C +ENDCHAR +STARTCHAR U+94E5 +ENCODING 38117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +103C +1DE0 +2020 +2020 +7DFC +9020 +1020 +FC24 +13FE +1040 +1240 +1490 +1908 +13FC +0004 +ENDCHAR +STARTCHAR U+94E7 +ENCODING 38119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +1050 +1C94 +2098 +2190 +7EB0 +94D2 +108E +FCA0 +1024 +13FE +1020 +1420 +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+94E8 +ENCODING 38120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1CA0 +2110 +2208 +7FFE +9044 +1040 +FC40 +13F8 +1040 +1040 +1440 +1848 +17FC +0000 +ENDCHAR +STARTCHAR U+94E9 +ENCODING 38121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +148C +1E50 +2020 +2050 +7C8C +9124 +1020 +FDFE +1020 +10A8 +12A4 +1522 +1A22 +10A0 +0040 +ENDCHAR +STARTCHAR U+94EA +ENCODING 38122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1E50 +2088 +2104 +7E02 +91FC +1000 +FE04 +11FE +1104 +1104 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+94EB +ENCODING 38123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +14A0 +1EA0 +20A0 +24A4 +7EAC +91B0 +10A0 +FCA0 +11B0 +16A8 +10A8 +1522 +1922 +121E +0400 +ENDCHAR +STARTCHAR U+94EC +ENCODING 38124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +1CFC +1104 +2188 +3E50 +5020 +9050 +7C8E +1304 +11FE +1104 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+94ED +ENCODING 38125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1040 +1EFC +2084 +2188 +7E50 +9020 +1040 +7C84 +11FE +1284 +1084 +1484 +1884 +10FC +0084 +ENDCHAR +STARTCHAR U+94EE +ENCODING 38126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1440 +1EF8 +2110 +2024 +7DFE +9024 +1024 +FDFC +1024 +1024 +11FC +1424 +1820 +10A0 +0040 +ENDCHAR +STARTCHAR U+94EF +ENCODING 38127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1480 +1EF8 +2110 +2224 +7DFE +9124 +1524 +FF24 +11FC +1104 +1300 +1502 +1902 +10FE +0000 +ENDCHAR +STARTCHAR U+94F0 +ENCODING 38128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1024 +1FFE +2000 +2088 +7D06 +9202 +1088 +7C50 +1020 +1050 +1450 +1888 +110E +0204 +ENDCHAR +STARTCHAR U+94F1 +ENCODING 38129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1024 +1FFE +2040 +2040 +7CA0 +90A4 +11A8 +7E90 +1490 +1088 +148E +18A4 +10C0 +0080 +ENDCHAR +STARTCHAR U+94F2 +ENCODING 38130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1010 +1004 +1DFE +2000 +2084 +7C48 +91FE +1100 +FD00 +1100 +1100 +1500 +1900 +1200 +0400 +ENDCHAR +STARTCHAR U+94F3 +ENCODING 38131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1420 +1E24 +23FE +2040 +7C88 +9084 +15FC +FE90 +1090 +1090 +1290 +1492 +1912 +120E +0000 +ENDCHAR +STARTCHAR U+94F4 +ENCODING 38132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +24FC +3B08 +4110 +4020 +7444 +A2FE +2254 +F854 +2154 +2254 +2294 +2CA4 +3524 +2254 +0088 +ENDCHAR +STARTCHAR U+94F5 +ENCODING 38133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1E20 +23FE +2202 +7C44 +9040 +17FE +FC88 +1088 +1108 +1090 +1460 +1890 +110C +0204 +ENDCHAR +STARTCHAR U+94F6 +ENCODING 38134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +3D08 +21F8 +2108 +7D08 +91F8 +1104 +FD8C +1150 +1320 +1510 +194E +1184 +0100 +ENDCHAR +STARTCHAR U+94F7 +ENCODING 38135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1100 +1D04 +27DE +2154 +7D54 +9154 +1154 +FD54 +1254 +1154 +1494 +1954 +125C +0414 +0000 +ENDCHAR +STARTCHAR U+94F8 +ENCODING 38136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1048 +13FC +1C40 +2048 +23FC +7C80 +9084 +13FE +FD08 +1208 +15FE +1008 +1488 +1848 +0018 +ENDCHAR +STARTCHAR U+94F9 +ENCODING 38137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +1FFE +2088 +2088 +7BFE +9242 +1244 +FDFE +1044 +1044 +1044 +1484 +1884 +1128 +0210 +ENDCHAR +STARTCHAR U+94FA +ENCODING 38138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1028 +1C24 +23FE +2020 +7DFC +9124 +1124 +7DFC +1124 +1124 +11FC +1524 +1924 +1134 +0128 +ENDCHAR +STARTCHAR U+94FC +ENCODING 38140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +3BFC +4040 +4248 +7950 +A044 +27FE +F840 +20E0 +2150 +2150 +2A48 +3446 +2844 +0040 +ENDCHAR +STARTCHAR U+94FD +ENCODING 38141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2028 +3824 +47FE +4020 +7A20 +A1A0 +20A0 +FA10 +2290 +2650 +2A50 +2A90 +328A +2186 +0002 +ENDCHAR +STARTCHAR U+94FE +ENCODING 38142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2414 +3AFE +4220 +4050 +F894 +26FE +2210 +FA10 +2214 +23FE +2A10 +3210 +2516 +08FC +0000 +ENDCHAR +STARTCHAR U+94FF +ENCODING 38143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +22FC +3AA4 +42A8 +4290 +7AA8 +A2A6 +22C4 +F880 +20A0 +2028 +25FC +2820 +3024 +23FE +0000 +ENDCHAR +STARTCHAR U+9500 +ENCODING 38144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +10A8 +3C24 +21FE +4104 +BD04 +11FC +1104 +FD04 +11FC +1104 +1504 +1904 +1114 +0108 +ENDCHAR +STARTCHAR U+9501 +ENCODING 38145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +10A4 +1CA8 +2024 +21FE +7D04 +9124 +1124 +7D24 +1124 +1124 +1420 +1858 +1184 +0602 +ENDCHAR +STARTCHAR U+9502 +ENCODING 38146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F24 +2124 +21FC +7D24 +9124 +11FC +FF24 +1020 +11FC +1020 +1420 +1824 +13FE +0000 +ENDCHAR +STARTCHAR U+9503 +ENCODING 38147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F04 +2104 +2104 +7DFC +9000 +13FE +FC20 +1020 +11FC +1020 +1420 +1824 +13FE +0000 +ENDCHAR +STARTCHAR U+9504 +ENCODING 38148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +23D0 +7A54 +827E +0254 +FBD4 +2254 +2254 +FBD4 +2254 +2254 +2FF4 +3024 +2054 +0088 +ENDCHAR +STARTCHAR U+9505 +ENCODING 38149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1D08 +2108 +21F8 +7D40 +9044 +13FE +FE44 +1264 +129C +170C +1A04 +1214 +0208 +ENDCHAR +STARTCHAR U+9506 +ENCODING 38150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +10A0 +1CA4 +21FE +2120 +7E20 +9024 +13FE +FC00 +11FC +1104 +1104 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+9507 +ENCODING 38151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1058 +1C94 +2390 +2090 +7FFE +9090 +1094 +FCD4 +1198 +1290 +10B0 +14D2 +1892 +128A +0104 +ENDCHAR +STARTCHAR U+9508 +ENCODING 38152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1018 +13E0 +1C40 +2048 +27FC +7CE0 +9150 +124E +7DF8 +1088 +1090 +109C +1504 +1904 +1228 +0410 +ENDCHAR +STARTCHAR U+9509 +ENCODING 38153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1420 +1E20 +2124 +2124 +7D28 +91AC +1272 +FC20 +1028 +11FC +1020 +1420 +1824 +13FE +0000 +ENDCHAR +STARTCHAR U+950A +ENCODING 38154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +141C +1FE0 +2044 +2124 +7CA8 +9090 +1008 +FDFE +1008 +1108 +1088 +1488 +1808 +1028 +0010 +ENDCHAR +STARTCHAR U+950B +ENCODING 38155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +10FC +1D88 +2250 +2020 +7CDE +9324 +10F8 +FC20 +11FC +1020 +15FC +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+950C +ENCODING 38156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1DFC +2000 +2088 +7C50 +93FE +1020 +7C20 +1028 +11FC +1020 +1420 +1820 +1020 +0020 +ENDCHAR +STARTCHAR U+950D +ENCODING 38157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1424 +1FFE +2080 +2090 +7D08 +93FC +1004 +FD50 +1150 +1150 +1150 +1552 +1952 +124E +0400 +ENDCHAR +STARTCHAR U+950E +ENCODING 38158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +117E +1C84 +2204 +2204 +7FFC +9294 +1294 +FE94 +13FC +1294 +1294 +1694 +1B14 +1204 +020C +ENDCHAR +STARTCHAR U+950F +ENCODING 38159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +117E +1C84 +2204 +2204 +7EF4 +9294 +1294 +FEF4 +1294 +1294 +12F4 +1694 +1A04 +1214 +0208 +ENDCHAR +STARTCHAR U+9510 +ENCODING 38160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +1050 +1C04 +21FE +2104 +7D04 +9104 +11FC +7C90 +1090 +1090 +1512 +1912 +120E +0400 +ENDCHAR +STARTCHAR U+9511 +ENCODING 38161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +2110 +38A0 +43F8 +8048 +7848 +23F8 +2240 +FA44 +23FE +20C4 +2944 +3254 +2448 +0840 +0040 +ENDCHAR +STARTCHAR U+9512 +ENCODING 38162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1428 +1FFC +2108 +2108 +7DF8 +9108 +1108 +FDFC +1148 +1150 +1320 +1510 +1948 +1186 +0100 +ENDCHAR +STARTCHAR U+9513 +ENCODING 38163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1E04 +20FC +2004 +7DFC +9000 +13FE +FE02 +14FC +1088 +1250 +1420 +1850 +108E +0304 +ENDCHAR +STARTCHAR U+9514 +ENCODING 38164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1E04 +2204 +23FC +7E00 +9204 +13FE +FE04 +12F4 +1294 +1694 +1AF4 +1204 +0414 +0808 +ENDCHAR +STARTCHAR U+9515 +ENCODING 38165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2704 +3DFE +4504 +4504 +7E74 +A554 +2554 +FD54 +2554 +2754 +2574 +2C44 +3404 +2414 +0408 +ENDCHAR +STARTCHAR U+9516 +ENCODING 38166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1424 +1FFE +2020 +21FC +7C20 +93FE +1000 +FDFC +1104 +11FC +1104 +15FC +1904 +1114 +0108 +ENDCHAR +STARTCHAR U+9517 +ENCODING 38167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +13F8 +1C50 +2064 +23FE +7C80 +9108 +13FC +FD08 +1108 +11F8 +1508 +1908 +11F8 +0108 +ENDCHAR +STARTCHAR U+9518 +ENCODING 38168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +1FFE +2088 +2040 +7C44 +97FE +1080 +FC84 +11FE +1304 +1504 +1104 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+9519 +ENCODING 38169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1090 +1090 +1090 +1FFC +2090 +2094 +7FFE +9008 +11FC +7D08 +1108 +11F8 +1508 +1908 +11F8 +0108 +ENDCHAR +STARTCHAR U+951A +ENCODING 38170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2110 +3914 +27FE +4110 +7914 +A7FE +2444 +FC44 +2444 +27FC +2444 +2C44 +3444 +27FC +0404 +ENDCHAR +STARTCHAR U+951B +ENCODING 38171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1044 +1FFE +20A0 +2110 +7E4E +95F4 +1040 +FD50 +1114 +1FFE +1110 +1510 +1910 +1210 +0410 +ENDCHAR +STARTCHAR U+951D +ENCODING 38173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F04 +21FC +2104 +7DFC +9000 +15FC +FE08 +1008 +13FE +1088 +1448 +1808 +1028 +0010 +ENDCHAR +STARTCHAR U+951E +ENCODING 38174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F24 +2124 +21FC +7D24 +9124 +11FC +FC20 +13FE +1020 +1070 +14A8 +1926 +1224 +0020 +ENDCHAR +STARTCHAR U+951F +ENCODING 38175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F04 +2104 +21FC +7D04 +9104 +11FC +FE10 +1114 +11D8 +1310 +1512 +1952 +118E +0000 +ENDCHAR +STARTCHAR U+9521 +ENCODING 38177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +1108 +1DF8 +2108 +2108 +7DF8 +9104 +11FE +7D54 +1254 +10A4 +1524 +1A44 +10A8 +0010 +ENDCHAR +STARTCHAR U+9522 +ENCODING 38178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F04 +2124 +2124 +7DFC +9124 +1124 +FF74 +1154 +1154 +1374 +1554 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+9523 +ENCODING 38179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +2294 +3E94 +4294 +83FC +7E44 +1080 +10FC +7D04 +1308 +1090 +1460 +1840 +1180 +0600 +ENDCHAR +STARTCHAR U+9524 +ENCODING 38180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +103C +13C0 +1C40 +2048 +23FC +7D50 +9154 +17FE +7950 +1150 +13FC +1440 +1850 +13F8 +0000 +ENDCHAR +STARTCHAR U+9525 +ENCODING 38181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A0 +10A0 +1084 +1DFE +2120 +2328 +7DFC +9120 +1128 +FDFC +1120 +1120 +1524 +19FE +1100 +0100 +ENDCHAR +STARTCHAR U+9526 +ENCODING 38182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2088 +3BFC +4208 +83F8 +7A08 +23F8 +2040 +FFFC +2444 +2444 +2444 +2C54 +3048 +2040 +0040 +ENDCHAR +STARTCHAR U+9528 +ENCODING 38184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2090 +2710 +3C20 +443E +8442 +7F94 +2510 +2510 +FD10 +2528 +2528 +2D28 +3544 +2944 +0082 +ENDCHAR +STARTCHAR U+9529 +ENCODING 38185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1248 +1D50 +2040 +23FC +7C40 +97FE +10A0 +FD10 +13F8 +1516 +1110 +1550 +1924 +1104 +00FC +ENDCHAR +STARTCHAR U+952A +ENCODING 38186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +1104 +1DFE +2294 +2294 +7CA4 +9124 +1154 +FE08 +1040 +1328 +1326 +150A +1908 +10F8 +0000 +ENDCHAR +STARTCHAR U+952B +ENCODING 38187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1428 +1FFC +2000 +2108 +7C90 +9004 +13FE +FC00 +11FC +1104 +1104 +1504 +1904 +11FC +0104 +ENDCHAR +STARTCHAR U+952C +ENCODING 38188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1424 +1EAC +20B0 +2120 +7C58 +9086 +1322 +FE20 +10A4 +10AC +1130 +1450 +1850 +108E +0304 +ENDCHAR +STARTCHAR U+952D +ENCODING 38189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1020 +1DFE +2102 +2204 +7DFC +9020 +1028 +7D3C +1120 +1120 +1520 +1AA0 +1466 +083C +ENDCHAR +STARTCHAR U+952E +ENCODING 38190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2710 +397C +4114 +82FE +7A14 +247C +2710 +F97C +2110 +2514 +22FE +2A10 +3510 +2896 +007C +ENDCHAR +STARTCHAR U+952F +ENCODING 38191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +3D04 +4104 +81FC +7D20 +2124 +21FE +FD20 +2124 +25FE +2A84 +3284 +2484 +08FC +0084 +ENDCHAR +STARTCHAR U+9530 +ENCODING 38192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23F8 +3810 +4060 +8048 +7BFC +2040 +2140 +F888 +23FC +22A8 +22A8 +2AA8 +32A8 +2FFE +0000 +ENDCHAR +STARTCHAR U+9531 +ENCODING 38193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2124 +2124 +3A48 +4490 +4248 +7924 +A124 +27FE +FC44 +2444 +27FC +2444 +2C44 +3444 +27FC +0404 +ENDCHAR +STARTCHAR U+9532 +ENCODING 38194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2104 +3FFE +4114 +47D4 +7914 +A7D4 +2124 +F94C +2040 +27FE +2040 +28A0 +3090 +210E +0604 +ENDCHAR +STARTCHAR U+9534 +ENCODING 38196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1224 +1FA8 +2230 +2222 +7EA2 +935E +1088 +FDFC +1108 +1108 +11F8 +1508 +1908 +11F8 +0108 +ENDCHAR +STARTCHAR U+9535 +ENCODING 38197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2120 +2120 +393C +4544 +43A8 +7910 +A128 +2148 +FBFE +2508 +2948 +2128 +2928 +3108 +2128 +0110 +ENDCHAR +STARTCHAR U+9536 +ENCODING 38198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1D24 +2124 +21FC +7D24 +9124 +11FC +FD04 +1040 +12A8 +12A4 +148A +188A +1078 +0000 +ENDCHAR +STARTCHAR U+9537 +ENCODING 38199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +15DC +1F54 +2154 +21DC +7C08 +91FC +1000 +FFFE +1080 +10F8 +1008 +1408 +1808 +1050 +0020 +ENDCHAR +STARTCHAR U+9538 +ENCODING 38200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +207C +3BC0 +4040 +4844 +7FFE +A040 +2144 +FE5E +2444 +2444 +275C +2C44 +3444 +27FC +0404 +ENDCHAR +STARTCHAR U+9539 +ENCODING 38201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20D0 +2710 +3910 +4152 +4134 +FFD8 +2110 +2310 +FB90 +2550 +2928 +2128 +2944 +3144 +2182 +0100 +ENDCHAR +STARTCHAR U+953A +ENCODING 38202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +201C +3BE0 +4044 +4FFE +7840 +A3F8 +2A48 +FFF8 +2248 +23F8 +2040 +2BF8 +3040 +2FFE +0000 +ENDCHAR +STARTCHAR U+953B +ENCODING 38203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2188 +267C +3C48 +4448 +8748 +7C48 +2486 +2700 +FDFC +2488 +2450 +2720 +2C50 +3488 +250E +0604 +ENDCHAR +STARTCHAR U+953C +ENCODING 38204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +10AC +1D24 +2124 +21AC +7D24 +9124 +11FC +FE20 +11FC +1088 +1250 +1420 +1850 +118E +0604 +ENDCHAR +STARTCHAR U+953E +ENCODING 38206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103C +13C0 +1C24 +2124 +20A8 +7DFC +9040 +13FE +FC80 +10FC +1188 +1150 +1620 +1A50 +148E +0104 +ENDCHAR +STARTCHAR U+953F +ENCODING 38207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1424 +1FFE +2000 +21FC +7D04 +9104 +11FC +FE40 +1044 +10A8 +1090 +1590 +1AA8 +14C6 +0084 +ENDCHAR +STARTCHAR U+9540 +ENCODING 38208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2024 +3BFE +4250 +8250 +7BFC +2250 +2270 +FA00 +23F8 +2288 +2A50 +3420 +2450 +088E +0304 +ENDCHAR +STARTCHAR U+9541 +ENCODING 38209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +20A0 +3FFC +2040 +43F8 +7840 +A048 +27FC +F840 +2044 +2FFE +2040 +28A0 +3110 +220E +0C04 +ENDCHAR +STARTCHAR U+9542 +ENCODING 38210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +1CA8 +2020 +23FE +7C70 +90A8 +1126 +FC40 +13FE +1088 +1108 +14D0 +1830 +10CC +0304 +ENDCHAR +STARTCHAR U+9544 +ENCODING 38212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2114 +3FFE +4114 +47FC +7D10 +A7FE +2112 +FBFE +2208 +2248 +2248 +2A48 +30B0 +210C +0604 +ENDCHAR +STARTCHAR U+9545 +ENCODING 38213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1F24 +2124 +21FC +7D00 +91FC +1184 +FE84 +12FC +1284 +16FC +1A84 +1284 +04FC +0884 +ENDCHAR +STARTCHAR U+9546 +ENCODING 38214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +1114 +1FFE +2110 +23F8 +7E08 +93F8 +1208 +FFF8 +1040 +1044 +17FE +1440 +18A0 +111C +0608 +ENDCHAR +STARTCHAR U+9547 +ENCODING 38215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1024 +13FE +1C20 +21FC +2104 +7DFC +9104 +11FC +FD04 +11FC +1104 +17FE +1888 +1106 +0202 +ENDCHAR +STARTCHAR U+9549 +ENCODING 38217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +27FC +3800 +43F8 +4208 +7A08 +A3F8 +2004 +FFFE +2514 +24A4 +27FC +2C44 +3444 +2454 +0408 +ENDCHAR +STARTCHAR U+954A +ENCODING 38218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FC +2108 +39F8 +4108 +81F8 +7908 +27FE +2008 +FFFE +2462 +2294 +2294 +2908 +3298 +22A4 +0C42 +ENDCHAR +STARTCHAR U+954C +ENCODING 38220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A0 +10A8 +1DFC +2120 +23F8 +7D20 +91F8 +1120 +FDFE +1100 +13F8 +1088 +149C +1904 +1228 +0410 +ENDCHAR +STARTCHAR U+954D +ENCODING 38221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2108 +3BFC +4208 +83F8 +7A08 +23F8 +2208 +FBF8 +2044 +2FFE +20E0 +2950 +324E +2444 +0040 +ENDCHAR +STARTCHAR U+954E +ENCODING 38222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20A0 +3910 +43F8 +4406 +7BF8 +A208 +23F8 +F81C +27E0 +2040 +23F8 +2840 +37FE +2040 +00C0 +ENDCHAR +STARTCHAR U+954F +ENCODING 38223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +277E +3C24 +4424 +4524 +7DA4 +A654 +2088 +FFFC +2444 +2444 +27FC +2C44 +3444 +27FC +0404 +ENDCHAR +STARTCHAR U+9550 +ENCODING 38224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1024 +1FFE +2000 +21F8 +7D08 +9108 +11F8 +7C04 +13FE +1204 +12F4 +1694 +1AF4 +1204 +020C +ENDCHAR +STARTCHAR U+9551 +ENCODING 38225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1028 +11FC +1C88 +2050 +23FE +7E44 +9020 +13FE +7C80 +10F8 +1088 +1488 +1888 +1128 +0210 +ENDCHAR +STARTCHAR U+9552 +ENCODING 38226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1488 +1E50 +2004 +23FE +7C50 +908C +1504 +FE00 +11FC +1154 +1154 +1554 +1954 +13FE +0000 +ENDCHAR +STARTCHAR U+9553 +ENCODING 38227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1220 +1FFE +2202 +2404 +7FFE +9040 +10C4 +FF68 +10B0 +1330 +1068 +14A8 +1B26 +10A4 +0040 +ENDCHAR +STARTCHAR U+9554 +ENCODING 38228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1220 +1FFE +2202 +2434 +7DC0 +9108 +11FC +FD10 +1110 +1114 +17FE +1400 +1910 +120C +0404 +ENDCHAR +STARTCHAR U+9556 +ENCODING 38230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1C50 +2054 +21FE +7D54 +9154 +15FC +FE00 +11FC +1000 +13FE +14A8 +1926 +1222 +0060 +ENDCHAR +STARTCHAR U+9557 +ENCODING 38231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2248 +3950 +4040 +47FE +7C02 +A9F4 +2110 +F910 +21F0 +2040 +23F8 +2840 +3044 +2FFE +0000 +ENDCHAR +STARTCHAR U+9558 +ENCODING 38232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +3A08 +43F8 +4208 +7BF8 +A004 +27FE +FCA4 +27FC +2000 +23F8 +2910 +30E0 +2310 +0C0E +ENDCHAR +STARTCHAR U+9559 +ENCODING 38233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27FE +3C44 +47FC +4444 +7FFC +A080 +2108 +FBF0 +2020 +2048 +27FC +2950 +324C +2444 +00C0 +ENDCHAR +STARTCHAR U+955B +ENCODING 38235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +27FE +3C20 +45FC +4424 +7FFE +A424 +25FC +FC20 +25FC +2524 +25FC +2D24 +35FC +2924 +112C +ENDCHAR +STARTCHAR U+955C +ENCODING 38236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2048 +27FC +7910 +40A4 +87FE +7808 +23FC +2208 +FBF8 +2208 +23F8 +2920 +3122 +2222 +0C1E +ENDCHAR +STARTCHAR U+955D +ENCODING 38237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2844 +3FFE +4110 +40A4 +7FFE +A444 +2454 +FFFC +2444 +25F4 +2514 +2D14 +35F4 +2404 +040C +ENDCHAR +STARTCHAR U+955E +ENCODING 38238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +2120 +3924 +47FE +4240 +7A20 +A3BC +22D0 +FA94 +22FE +2290 +2290 +2CA8 +34A6 +29C2 +0000 +ENDCHAR +STARTCHAR U+955F +ENCODING 38239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2440 +2240 +3844 +4FFE +4480 +7C00 +A77E +2514 +FD10 +2554 +255E +2D50 +3550 +2570 +0B9E +1104 +ENDCHAR +STARTCHAR U+9561 +ENCODING 38241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1C50 +21FC +2154 +7DFC +9000 +15FC +FF04 +11FC +1104 +11FC +1420 +1BFE +1020 +0020 +ENDCHAR +STARTCHAR U+9562 +ENCODING 38242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +2FFE +3808 +4A28 +4948 +7FEE +A892 +2AA4 +FAA8 +2AA8 +2BE8 +28A8 +3894 +2914 +1224 +2442 +ENDCHAR +STARTCHAR U+9563 +ENCODING 38243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2044 +3FFE +4040 +82A8 +7910 +23F8 +260E +FBF8 +2208 +23F8 +2040 +2950 +324C +2544 +0080 +ENDCHAR +STARTCHAR U+9564 +ENCODING 38244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20A0 +24A4 +3AA8 +40A0 +4FFE +7910 +A0A0 +27FC +F840 +23F8 +2040 +27FC +2840 +30A0 +211C +0608 +ENDCHAR +STARTCHAR U+9565 +ENCODING 38245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10F8 +1D10 +23FC +2124 +7DFC +9124 +11FC +FC00 +13FE +1000 +11FC +1504 +19FC +1104 +01FC +ENDCHAR +STARTCHAR U+9566 +ENCODING 38246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2110 +3FF4 +401E +47E4 +7C54 +A454 +27D4 +F814 +27C8 +2088 +21D4 +2F14 +3124 +2522 +0240 +ENDCHAR +STARTCHAR U+9567 +ENCODING 38247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2404 +22FE +3944 +4454 +47FC +7C44 +A5F4 +2554 +FDF4 +2554 +25F4 +24E4 +2D54 +364C +2444 +044C +ENDCHAR +STARTCHAR U+9568 +ENCODING 38248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1090 +1FFC +2090 +2294 +7D98 +9090 +17FE +FC08 +11FC +1108 +1108 +15F8 +1908 +1108 +01F8 +ENDCHAR +STARTCHAR U+9569 +ENCODING 38249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2040 +3FFE +4512 +4A4C +7840 +A3F8 +2248 +FBF8 +2040 +23F8 +2248 +2BF8 +3248 +2040 +0040 +ENDCHAR +STARTCHAR U+956A +ENCODING 38250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +277E +3944 +4144 +417C +7F10 +A4FE +2492 +FC92 +2792 +21FE +2110 +2910 +3114 +2AFE +0442 +ENDCHAR +STARTCHAR U+956B +ENCODING 38251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2028 +23B0 +38A4 +4298 +4110 +7BF8 +A404 +23FA +FA08 +2208 +23F8 +2000 +2910 +30A4 +2FFE +0000 +ENDCHAR +STARTCHAR U+956C +ENCODING 38252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +27FE +3928 +41FE +4220 +7FFC +A220 +23FC +FA20 +23FE +2200 +23F8 +2910 +30E0 +2318 +0C06 +ENDCHAR +STARTCHAR U+956D +ENCODING 38253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +3840 +47FE +8442 +7B58 +2040 +2358 +F840 +27FC +2444 +2444 +2FFC +3444 +2444 +07FC +ENDCHAR +STARTCHAR U+956F +ENCODING 38255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27FE +3CA4 +44A4 +47FC +7900 +A3FC +2484 +F884 +27F4 +2494 +27F4 +2884 +30A4 +27F4 +0008 +ENDCHAR +STARTCHAR U+9570 +ENCODING 38256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +27FE +2508 +3FFE +4490 +85FC +7C94 +27FE +2494 +FDFC +2494 +2598 +2D98 +3696 +2890 +0090 +ENDCHAR +STARTCHAR U+9571 +ENCODING 38257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2848 +3FFC +4110 +48A4 +7FFE +A008 +23FC +FE08 +23F8 +2208 +2BF8 +3040 +2524 +090A +00F8 +ENDCHAR +STARTCHAR U+9572 +ENCODING 38258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2040 +3FFE +4502 +41BC +7AA4 +A7A8 +2D10 +F3F8 +2406 +2BF8 +2040 +2950 +324C +2444 +00C0 +ENDCHAR +STARTCHAR U+9573 +ENCODING 38259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2024 +3FFE +4490 +47FC +7C94 +A7FC +2510 +FDD4 +2518 +2552 +2D8E +3400 +2554 +0952 +1202 +ENDCHAR +STARTCHAR U+9576 +ENCODING 38262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +27FC +3800 +43B8 +82A8 +7BB8 +2110 +27FC +F910 +23F8 +2110 +2FFE +2948 +3330 +2D8E +0104 +ENDCHAR +STARTCHAR U+9577 +ENCODING 38263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FF0 +0800 +0FE0 +0800 +0FE0 +0800 +7FFC +0910 +0890 +08A0 +0840 +0F30 +700C +0000 +ENDCHAR +STARTCHAR U+9578 +ENCODING 38264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +1000 +1FF8 +1000 +1FF8 +1000 +1000 +FFFF +0400 +0C08 +080C +1804 +107E +1FC3 +7001 +ENDCHAR +STARTCHAR U+9579 +ENCODING 38265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3E40 +207C +3C44 +20C4 +208C +3D88 +2008 +2018 +FE10 +2038 +2428 +646C +4E44 +FAC6 +0183 +ENDCHAR +STARTCHAR U+957A +ENCODING 38266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +3E7E +2008 +3E08 +2008 +3E7F +2008 +7F08 +0808 +1008 +2008 +4214 +7F22 +0141 +0000 +0000 +ENDCHAR +STARTCHAR U+957B +ENCODING 38267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7E90 +20FE +2090 +3D10 +2010 +3DFF +2010 +7E10 +1010 +2028 +4244 +7E82 +0301 +0000 +0000 +ENDCHAR +STARTCHAR U+957C +ENCODING 38268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3DFF +2101 +2101 +3DFF +2100 +2108 +3D49 +2149 +217F +7F08 +1149 +2549 +4549 +7E7F +0000 +0000 +ENDCHAR +STARTCHAR U+957D +ENCODING 38269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7EFE +2028 +3D45 +20FE +3D45 +207C +7E44 +107C +2010 +4454 +7E92 +0210 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+957E +ENCODING 38270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3DFF +2092 +3D11 +21FF +2111 +3DBB +2155 +21BB +FD11 +21BB +2555 +65BB +4F11 +FB11 +0103 +ENDCHAR +STARTCHAR U+957F +ENCODING 38271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0810 +0830 +0840 +0880 +0900 +0804 +FFFE +0900 +0900 +0880 +0840 +0820 +091C +0E08 +0800 +ENDCHAR +STARTCHAR U+9580 +ENCODING 38272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+9582 +ENCODING 38274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +2008 +2FE8 +2008 +2008 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+9583 +ENCODING 38275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +2108 +2288 +2288 +2448 +2828 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+9584 +ENCODING 38276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +F788 +9488 +9488 +F788 +9488 +949C +F794 +8094 +8094 +8094 +80B6 +80A2 +80A2 +80E3 +83C1 +ENDCHAR +STARTCHAR U+9586 +ENCODING 38278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4001 +4001 +47F1 +4001 +43E1 +4001 +4FF9 +4001 +4006 +0000 +0000 +ENDCHAR +STARTCHAR U+9587 +ENCODING 38279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +2FE8 +2108 +2188 +2148 +2108 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+9588 +ENCODING 38280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +7E7E +4242 +4242 +7E7E +4002 +47E2 +4102 +4102 +4FF2 +4102 +4102 +4102 +400E +ENDCHAR +STARTCHAR U+9589 +ENCODING 38281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2088 +2088 +2FE8 +2188 +2288 +2488 +2888 +2198 +0000 +ENDCHAR +STARTCHAR U+958A +ENCODING 38282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +2928 +2928 +2928 +2928 +2FE8 +2828 +2018 +0000 +ENDCHAR +STARTCHAR U+958B +ENCODING 38283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +2FE8 +2288 +3FF8 +2288 +2488 +2888 +2018 +0000 +ENDCHAR +STARTCHAR U+958C +ENCODING 38284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +7E7E +4242 +7E7E +4102 +4102 +5FF2 +4002 +47C2 +4442 +4442 +4452 +5832 +4006 +ENDCHAR +STARTCHAR U+958D +ENCODING 38285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +7E7E +4242 +7E7E +4102 +4102 +5FF2 +4202 +43E2 +4222 +4222 +4422 +48C2 +400E +ENDCHAR +STARTCHAR U+958E +ENCODING 38286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +7E7E +4242 +7E7E +4102 +4102 +5FF2 +4402 +4502 +4922 +4A22 +5272 +4792 +400E +ENDCHAR +STARTCHAR U+958F +ENCODING 38287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +2FE8 +2108 +27C8 +2108 +2FE8 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+9590 +ENCODING 38288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4009 +4FF1 +4081 +47F1 +4081 +4FF9 +4081 +4089 +40FB +0000 +0000 +ENDCHAR +STARTCHAR U+9591 +ENCODING 38289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +2108 +2FE8 +2388 +2548 +2928 +2108 +2018 +0000 +ENDCHAR +STARTCHAR U+9592 +ENCODING 38290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +7E7E +4242 +7E7E +4002 +47E2 +4422 +47E2 +4422 +47E2 +4422 +4422 +4862 +4006 +ENDCHAR +STARTCHAR U+9593 +ENCODING 38291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +27C8 +2448 +27C8 +2448 +27C8 +2448 +2018 +0000 +ENDCHAR +STARTCHAR U+9594 +ENCODING 38292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +2108 +2FE8 +2288 +2108 +2288 +2C68 +2018 +0000 +ENDCHAR +STARTCHAR U+9596 +ENCODING 38294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +2128 +2FC8 +2388 +2548 +2928 +2308 +2018 +0000 +ENDCHAR +STARTCHAR U+9598 +ENCODING 38296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +27C8 +2548 +27C8 +2548 +27C8 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+9599 +ENCODING 38297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +3FF8 +2108 +2FE8 +2928 +2928 +29C8 +2118 +0000 +ENDCHAR +STARTCHAR U+959B +ENCODING 38299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4001 +4FF9 +4491 +42A1 +5FFD +4081 +4081 +4085 +4002 +0000 +0000 +ENDCHAR +STARTCHAR U+959C +ENCODING 38300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4001 +4FF9 +4011 +4791 +4491 +4791 +4011 +4065 +4002 +0000 +0000 +ENDCHAR +STARTCHAR U+959D +ENCODING 38301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4102 +4382 +4EE2 +5832 +47C2 +4002 +4FE2 +4122 +4122 +4162 +410E +ENDCHAR +STARTCHAR U+959E +ENCODING 38302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4202 +4622 +44F2 +4F92 +4242 +4242 +5FFA +4242 +4642 +4C42 +400E +ENDCHAR +STARTCHAR U+959F +ENCODING 38303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4102 +41A2 +42A2 +4A62 +4A52 +5ADA +538A +4212 +4732 +5DE2 +400E +ENDCHAR +STARTCHAR U+95A0 +ENCODING 38304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +2FE8 +2108 +27C8 +2188 +2148 +2FE8 +2018 +0000 +ENDCHAR +STARTCHAR U+95A1 +ENCODING 38305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4102 +5FFA +4302 +4A42 +4CD2 +45B2 +4362 +4EC2 +41A2 +4732 +5C16 +ENDCHAR +STARTCHAR U+95A2 +ENCODING 38306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2448 +2288 +27C8 +2108 +2FE8 +2288 +2448 +2818 +0000 +ENDCHAR +STARTCHAR U+95A3 +ENCODING 38307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +23C8 +2E48 +2188 +22C8 +3FF8 +2448 +27C8 +2458 +0000 +ENDCHAR +STARTCHAR U+95A4 +ENCODING 38308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +2288 +2FE8 +3018 +27C8 +2448 +27C8 +2458 +0000 +ENDCHAR +STARTCHAR U+95A5 +ENCODING 38309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2548 +2528 +29E8 +3F48 +28A8 +2B68 +2828 +2018 +0000 +ENDCHAR +STARTCHAR U+95A6 +ENCODING 38310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4182 +43C2 +4E72 +581A +4422 +4422 +4422 +4E72 +5BDA +518A +4006 +ENDCHAR +STARTCHAR U+95A7 +ENCODING 38311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2008 +2288 +2FE8 +2288 +2FE8 +2288 +2C48 +2018 +0000 +ENDCHAR +STARTCHAR U+95A8 +ENCODING 38312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +27C8 +2108 +2FE8 +27C8 +2108 +2FE8 +2018 +0000 +ENDCHAR +STARTCHAR U+95A9 +ENCODING 38313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4102 +4102 +4FF2 +4912 +4912 +4FF2 +4102 +4122 +43F2 +5E12 +400E +ENDCHAR +STARTCHAR U+95AB +ENCODING 38315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +5FFA +510A +510A +5FEA +538A +554A +592A +510A +5FFA +4006 +ENDCHAR +STARTCHAR U+95AC +ENCODING 38316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4102 +4FE2 +4822 +4FE2 +4822 +4FE2 +48B2 +4BC2 +4E62 +5832 +400E +ENDCHAR +STARTCHAR U+95AD +ENCODING 38317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +27C8 +2448 +27C8 +2208 +27C8 +2448 +27C8 +2458 +0000 +ENDCHAR +STARTCHAR U+95AE +ENCODING 38318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4001 +5DF9 +4421 +49FD +4421 +54F9 +4801 +57FD +4003 +0000 +0000 +ENDCHAR +STARTCHAR U+95B0 +ENCODING 38320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4001 +4401 +4839 +4809 +4E39 +4809 +4809 +4FF9 +4003 +0000 +0000 +ENDCHAR +STARTCHAR U+95B1 +ENCODING 38321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +7E7E +4242 +7E7E +4002 +47E2 +4422 +4422 +47E2 +4242 +4242 +444A +587A +4006 +ENDCHAR +STARTCHAR U+95B2 +ENCODING 38322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2448 +2288 +27C8 +2448 +27C8 +2288 +24A8 +2878 +0000 +ENDCHAR +STARTCHAR U+95B4 +ENCODING 38324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +4FF2 +4812 +4FF2 +4812 +4FF2 +4812 +4FF2 +4422 +4C32 +581A +ENDCHAR +STARTCHAR U+95B5 +ENCODING 38325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4001 +4421 +4FF9 +5421 +47F9 +4421 +47F9 +4421 +47FB +0000 +0000 +ENDCHAR +STARTCHAR U+95B6 +ENCODING 38326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +47E2 +4422 +47E2 +4422 +4FF2 +4812 +4FF2 +4812 +4FF2 +400E +ENDCHAR +STARTCHAR U+95B7 +ENCODING 38327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01EF +4529 +2929 +11EF +2929 +4529 +11EF +1511 +7D11 +1111 +1129 +3945 +5501 +1103 +0000 +0000 +ENDCHAR +STARTCHAR U+95B9 +ENCODING 38329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2108 +3FF8 +27C8 +2D68 +37D8 +27C8 +2528 +20F8 +0000 +ENDCHAR +STARTCHAR U+95BA +ENCODING 38330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7FFE +4822 +4FE2 +4822 +4FE2 +4102 +5FF2 +4442 +4282 +4102 +4282 +4C6E +ENDCHAR +STARTCHAR U+95BB +ENCODING 38331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +23C8 +2448 +2988 +26C8 +26C8 +2448 +27C8 +2458 +0000 +ENDCHAR +STARTCHAR U+95BC +ENCODING 38332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2448 +3F48 +24A8 +27D8 +2528 +29C8 +3628 +2018 +0000 +ENDCHAR +STARTCHAR U+95BD +ENCODING 38333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7EFE +4F82 +4882 +4FE2 +4882 +4852 +5FF2 +4822 +4FE2 +4822 +4FE2 +400E +ENDCHAR +STARTCHAR U+95BE +ENCODING 38334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +20A8 +3FF8 +2EA8 +2AC8 +2E68 +26E8 +3928 +2018 +0000 +ENDCHAR +STARTCHAR U+95BF +ENCODING 38335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +43C2 +5E22 +4942 +5FF2 +5012 +57D2 +4042 +4282 +4102 +46C2 +400E +ENDCHAR +STARTCHAR U+95C0 +ENCODING 38336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E3F +4221 +7E3F +4221 +7E3F +4221 +47F1 +4221 +4FF9 +4411 +4BE9 +5225 +43C9 +43F3 +0000 +0000 +ENDCHAR +STARTCHAR U+95C3 +ENCODING 38339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +27C8 +2448 +27C8 +27C8 +27C8 +2148 +2FE8 +2288 +2C78 +0000 +ENDCHAR +STARTCHAR U+95C5 +ENCODING 38341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E3F +4221 +7E3F +4221 +7E3F +47F1 +47D1 +47D1 +47F1 +4081 +47F1 +4141 +4081 +4773 +0000 +0000 +ENDCHAR +STARTCHAR U+95C6 +ENCODING 38342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +47C2 +4442 +4442 +47C2 +4002 +5EF2 +5292 +5292 +5EF2 +400E +ENDCHAR +STARTCHAR U+95C7 +ENCODING 38343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +2108 +2FE8 +2288 +3FF8 +27C8 +2448 +27C8 +27C8 +2458 +0000 +ENDCHAR +STARTCHAR U+95C8 +ENCODING 38344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4102 +4FE2 +4122 +5FFA +4422 +47E2 +4042 +4FF2 +4442 +5FFA +4046 +ENDCHAR +STARTCHAR U+95C9 +ENCODING 38345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +4FF2 +4242 +4FF2 +4A52 +4FF2 +4102 +47E2 +4102 +4FF2 +400E +ENDCHAR +STARTCHAR U+95CA +ENCODING 38346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2868 +2588 +33F8 +2888 +25E8 +2528 +29E8 +2938 +0000 +ENDCHAR +STARTCHAR U+95CB +ENCODING 38347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7F7E +51A2 +4B4A +4672 +581A +47C2 +4102 +5FF2 +4282 +4EE2 +5832 +400E +ENDCHAR +STARTCHAR U+95CC +ENCODING 38348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +2108 +2FE8 +27C8 +2548 +27C8 +27C8 +2388 +2D68 +2118 +0000 +ENDCHAR +STARTCHAR U+95CD +ENCODING 38349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +2128 +27C8 +2FE8 +2148 +27E8 +3BC8 +2248 +23C8 +2258 +0000 +ENDCHAR +STARTCHAR U+95D0 +ENCODING 38352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +48C2 +4F82 +4832 +47E2 +5422 +57A2 +54E2 +5422 +5FFA +4242 +4C36 +ENDCHAR +STARTCHAR U+95D1 +ENCODING 38353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4202 +4FE2 +4822 +4F22 +49E2 +4822 +5FF2 +4382 +4542 +5932 +400E +ENDCHAR +STARTCHAR U+95D2 +ENCODING 38354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7FFE +4422 +47E2 +4422 +5FF2 +4212 +5AD2 +4632 +5AD2 +4212 +4632 +400E +ENDCHAR +STARTCHAR U+95D3 +ENCODING 38355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4102 +4912 +4912 +4FF2 +4002 +4FF2 +4422 +47E2 +4242 +5FFA +4006 +ENDCHAR +STARTCHAR U+95D4 +ENCODING 38356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +2108 +27C8 +2FE8 +2248 +2FE8 +27C8 +2748 +2FE8 +2018 +0000 +ENDCHAR +STARTCHAR U+95D5 +ENCODING 38357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2988 +2688 +3FF8 +2568 +2D48 +2F48 +24A8 +2918 +0000 +ENDCHAR +STARTCHAR U+95D6 +ENCODING 38358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +27E8 +2508 +27C8 +27C8 +2508 +27E8 +2EA8 +2D68 +30D8 +0000 +ENDCHAR +STARTCHAR U+95D8 +ENCODING 38360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2028 +3F28 +2FF8 +2AA8 +2EA8 +2A28 +2728 +3878 +0000 +ENDCHAR +STARTCHAR U+95D9 +ENCODING 38361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4402 +4882 +5FFA +5152 +5F52 +5072 +5F22 +5172 +5F52 +60DA +4006 +ENDCHAR +STARTCHAR U+95DA +ENCODING 38362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +44FA +5E8A +44FA +448A +5EFA +448A +4EFA +4A52 +5B5A +4006 +ENDCHAR +STARTCHAR U+95DB +ENCODING 38363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E3F +4221 +7E3F +4221 +7E3F +4491 +4FF9 +4BE9 +4221 +43E1 +4081 +47F1 +4081 +4FFB +0000 +0000 +ENDCHAR +STARTCHAR U+95DC +ENCODING 38364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2448 +3BA8 +2668 +3FF8 +2AA8 +2EE8 +2488 +2898 +0000 +ENDCHAR +STARTCHAR U+95DD +ENCODING 38365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +5F42 +517A +5FD2 +5152 +5F72 +5122 +5F72 +4A52 +515A +4006 +ENDCHAR +STARTCHAR U+95DE +ENCODING 38366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +5E82 +44FA +7F52 +5152 +5D72 +5722 +5172 +5F52 +715A +4006 +ENDCHAR +STARTCHAR U+95DF +ENCODING 38367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7FFE +46C2 +5C72 +47C2 +4442 +5FF2 +4212 +5AD2 +4632 +5AD2 +4632 +4006 +ENDCHAR +STARTCHAR U+95E0 +ENCODING 38368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4102 +47E2 +4522 +5FFA +4422 +4722 +45E2 +4422 +47E2 +4242 +442E +ENDCHAR +STARTCHAR U+95E1 +ENCODING 38369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +2EE8 +2AA8 +2EE8 +27C8 +2548 +27C8 +27C8 +3FF8 +2118 +0000 +ENDCHAR +STARTCHAR U+95E2 +ENCODING 38370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +2288 +3EF8 +2E48 +2BF8 +2EA8 +29F8 +2E48 +3BF8 +2E48 +2858 +0000 +ENDCHAR +STARTCHAR U+95E3 +ENCODING 38371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4141 +7F7F +4141 +7F7F +4491 +5FFD +53E5 +5225 +43E1 +4FF9 +4FE9 +4889 +4FFB +0000 +0000 +ENDCHAR +STARTCHAR U+95E4 +ENCODING 38372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4002 +4FE2 +4AA2 +5FF2 +4442 +57D2 +5932 +4DC2 +4762 +5D32 +410E +ENDCHAR +STARTCHAR U+95E5 +ENCODING 38373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2288 +3EF8 +3EF8 +2888 +25C8 +2BE8 +2548 +23E8 +2DC8 +27E8 +2488 +2BF8 +0000 +ENDCHAR +STARTCHAR U+95E6 +ENCODING 38374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4242 +4FF2 +4A52 +4FF2 +4A52 +5FFA +4422 +47E2 +4242 +5FFA +4006 +ENDCHAR +STARTCHAR U+95E8 +ENCODING 38376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4804 +4004 +4004 +4004 +4004 +4004 +4004 +4004 +4004 +4004 +4004 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95E9 +ENCODING 38377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4004 +4004 +4004 +4024 +5FF4 +4004 +4004 +4004 +4004 +4004 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95EA +ENCODING 38378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +0804 +4004 +4104 +4104 +4104 +4104 +4284 +4244 +4424 +4824 +4004 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95EB +ENCODING 38379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4024 +5FF4 +4004 +4004 +4044 +4FE4 +4004 +4004 +4024 +5FF4 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95ED +ENCODING 38381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +0804 +4084 +40A4 +5FF4 +4084 +4184 +4284 +4484 +4884 +5084 +4084 +4284 +4114 +4008 +ENDCHAR +STARTCHAR U+95EE +ENCODING 38382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +0804 +4004 +4024 +4FF4 +4824 +4824 +4824 +4824 +4824 +4FE4 +4824 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95EF +ENCODING 38383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +5004 +4044 +4FE4 +4044 +4444 +4444 +4444 +47F4 +4014 +5FD4 +4014 +4054 +4024 +400C +ENDCHAR +STARTCHAR U+95F0 +ENCODING 38384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +0804 +4024 +5FF4 +4104 +4104 +4144 +4FE4 +4104 +4104 +4124 +5FF4 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95F1 +ENCODING 38385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4104 +4124 +5FF4 +4104 +4144 +4FE4 +4104 +4114 +5FFC +4114 +4154 +4124 +410C +4104 +ENDCHAR +STARTCHAR U+95F2 +ENCODING 38386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4804 +4104 +4104 +4124 +5FF4 +4104 +4384 +4544 +4934 +5114 +4104 +4104 +4014 +4008 +ENDCHAR +STARTCHAR U+95F3 +ENCODING 38387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4204 +4204 +4224 +5FF4 +4204 +4484 +4504 +4904 +4A44 +5224 +67E4 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95F4 +ENCODING 38388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +0804 +4024 +4FF4 +4824 +4824 +4824 +4FE4 +4824 +4824 +4824 +4FE4 +4824 +4014 +4008 +ENDCHAR +STARTCHAR U+95F5 +ENCODING 38389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4204 +4124 +5FF4 +4044 +4444 +4284 +4104 +4284 +4464 +4824 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95F6 +ENCODING 38390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4204 +4124 +5FF4 +4004 +47C4 +4444 +4444 +4444 +4454 +4874 +5004 +4014 +4008 +ENDCHAR +STARTCHAR U+95F7 +ENCODING 38391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4804 +4204 +4104 +4484 +5494 +540C +640C +4424 +4424 +43E4 +4004 +4004 +4014 +4008 +ENDCHAR +STARTCHAR U+95F8 +ENCODING 38392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4804 +4024 +4FF4 +4924 +4924 +4FE4 +4924 +4924 +4FE4 +4924 +4104 +4104 +4114 +4008 +ENDCHAR +STARTCHAR U+95F9 +ENCODING 38393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4004 +37FE +1004 +4204 +4124 +5FF4 +4104 +4124 +4FF4 +4924 +4924 +4924 +4964 +4104 +4114 +4008 +ENDCHAR +STARTCHAR U+95FA +ENCODING 38394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4904 +4144 +4FE4 +4104 +4124 +5FF4 +4104 +4144 +4FE4 +4104 +4124 +5FF4 +4004 +400C +ENDCHAR +STARTCHAR U+95FB +ENCODING 38395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4804 +4024 +5FF4 +4444 +47C4 +4444 +47C4 +4444 +4444 +5FF4 +4044 +4044 +4054 +4008 +ENDCHAR +STARTCHAR U+95FC +ENCODING 38396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +5084 +48A4 +47F4 +4084 +5884 +4944 +4934 +4A14 +4C04 +53FC +6004 +4014 +4008 +ENDCHAR +STARTCHAR U+95FD +ENCODING 38397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4804 +4104 +4124 +4FF4 +4924 +4924 +4924 +4FE4 +4904 +4124 +41F4 +5F14 +4014 +4008 +ENDCHAR +STARTCHAR U+95FE +ENCODING 38398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4044 +47E4 +4444 +4444 +47C4 +4004 +4FE4 +4824 +4824 +4824 +4FE4 +4814 +4008 +ENDCHAR +STARTCHAR U+9600 +ENCODING 38400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +1004 +4544 +4524 +4904 +49F4 +5F04 +6924 +48C4 +4884 +4944 +4A54 +4834 +4804 +400C +ENDCHAR +STARTCHAR U+9601 +ENCODING 38401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4A04 +4204 +47E4 +4C44 +5284 +4104 +46C4 +583C +6014 +4FE4 +4824 +4824 +4FF4 +4008 +ENDCHAR +STARTCHAR U+9602 +ENCODING 38402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4804 +4204 +4124 +5FF4 +4104 +4244 +4484 +4F24 +4244 +4484 +4984 +5264 +4424 +400C +ENDCHAR +STARTCHAR U+9603 +ENCODING 38403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4004 +5FF4 +5114 +5154 +5FF4 +5114 +5394 +5554 +5934 +5114 +5FF4 +5014 +4008 +ENDCHAR +STARTCHAR U+9604 +ENCODING 38404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4204 +47C4 +4884 +5124 +4FF4 +4924 +4FE4 +4924 +4FE4 +4104 +4114 +40F4 +4004 +400C +ENDCHAR +STARTCHAR U+9605 +ENCODING 38405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +5004 +4444 +4284 +4FE4 +4824 +4824 +4FE4 +4AA4 +4284 +4294 +4494 +4874 +5004 +400C +ENDCHAR +STARTCHAR U+9606 +ENCODING 38406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4204 +4124 +4FF4 +4824 +4FE4 +4824 +4FE4 +4A14 +4924 +48C4 +4A44 +4C34 +4804 +400C +ENDCHAR +STARTCHAR U+9608 +ENCODING 38408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +40A4 +4094 +7FFC +4084 +5E84 +5294 +5254 +5264 +5E44 +4054 +7EB4 +4114 +4204 +400C +ENDCHAR +STARTCHAR U+9609 +ENCODING 38409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4904 +4124 +5FF4 +4284 +4444 +4924 +5FFC +6924 +4FE4 +4924 +4FE4 +4114 +40F4 +4008 +ENDCHAR +STARTCHAR U+960A +ENCODING 38410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4FE4 +4824 +4FE4 +4824 +4FE4 +4004 +5FF4 +5014 +5FF4 +5014 +5FF4 +4014 +4008 +ENDCHAR +STARTCHAR U+960B +ENCODING 38411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4224 +4CF4 +4824 +4EE4 +4824 +4FE4 +4284 +4284 +4494 +4494 +4874 +5004 +400C +ENDCHAR +STARTCHAR U+960C +ENCODING 38412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4024 +40F4 +5F04 +4924 +4544 +5FFC +500C +67D4 +4444 +4284 +4104 +46C4 +5834 +4008 +ENDCHAR +STARTCHAR U+960D +ENCODING 38413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4FE4 +4904 +4FF4 +4884 +4A54 +4C34 +4004 +4FE4 +4824 +4FE4 +4824 +4FF4 +4008 +ENDCHAR +STARTCHAR U+960E +ENCODING 38414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4A04 +4204 +47C4 +4884 +5124 +4EF4 +4824 +4824 +4EE4 +4824 +4824 +4FE4 +4014 +4008 +ENDCHAR +STARTCHAR U+960F +ENCODING 38415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4804 +4444 +4444 +7FA4 +48A4 +4914 +4E8C +4A64 +4A24 +5204 +5284 +6664 +4024 +400C +ENDCHAR +STARTCHAR U+9610 +ENCODING 38416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +5004 +4444 +4284 +4FE4 +4924 +4FE4 +4924 +4FE4 +4104 +5FF4 +4104 +4104 +4104 +400C +ENDCHAR +STARTCHAR U+9611 +ENCODING 38417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +1BFE +4904 +4114 +7FFC +4104 +5FF4 +5934 +5554 +5114 +5FF4 +4384 +4544 +4934 +5114 +410C +ENDCHAR +STARTCHAR U+9612 +ENCODING 38418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +4FE4 +4824 +4FE4 +4824 +4FE4 +4824 +4FE4 +4144 +7FFC +4104 +46C4 +5834 +400C +ENDCHAR +STARTCHAR U+9614 +ENCODING 38420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +0DFE +4404 +5064 +4B84 +4084 +60A4 +57F4 +4084 +48A4 +53F4 +7224 +5224 +53E4 +5214 +4008 +ENDCHAR +STARTCHAR U+9615 +ENCODING 38421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4084 +5EA4 +52CC +4A94 +4464 +4FE4 +711C +4104 +5FF4 +4104 +42C4 +4434 +5814 +4008 +ENDCHAR +STARTCHAR U+9616 +ENCODING 38422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4104 +4FE4 +4104 +5FF4 +4204 +4444 +4FE4 +4004 +4FE4 +4AA4 +4AA4 +4AA4 +5FF4 +4008 +ENDCHAR +STARTCHAR U+9617 +ENCODING 38423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4104 +5FF4 +4104 +4FE4 +4824 +4FE4 +4824 +4FE4 +4824 +4FE4 +4824 +7FFC +4444 +482C +ENDCHAR +STARTCHAR U+9619 +ENCODING 38425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +5144 +4A44 +7FFC +4494 +5544 +5544 +5F44 +5444 +44A4 +48A4 +5114 +4014 +4008 +ENDCHAR +STARTCHAR U+961A +ENCODING 38426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +17FE +4004 +5C44 +4444 +7EFC +5314 +5E94 +52A4 +5EA4 +5244 +7EA4 +431C +4204 +4214 +4008 +ENDCHAR +STARTCHAR U+961C +ENCODING 38428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +0FE0 +0820 +0FE0 +0800 +0FF0 +0810 +0FF0 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+961D +ENCODING 38429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7800 +4800 +4800 +5000 +5000 +6000 +5000 +5000 +4800 +4800 +6800 +5000 +4000 +4000 +4000 +ENDCHAR +STARTCHAR U+961E +ENCODING 38430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C20 +4420 +4820 +51FF +4821 +4421 +4421 +4421 +6421 +5841 +4081 +4102 +4214 +4008 +0000 +0000 +ENDCHAR +STARTCHAR U+961F +ENCODING 38431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C40 +4440 +4840 +4840 +5040 +4840 +4840 +44A0 +44A0 +44A0 +6910 +5110 +4208 +4406 +4804 +ENDCHAR +STARTCHAR U+9620 +ENCODING 38432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7BF8 +4888 +5088 +6088 +5088 +4BE8 +4888 +4888 +4888 +6888 +5089 +4089 +408F +0000 +0000 +ENDCHAR +STARTCHAR U+9621 +ENCODING 38433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3C30 +25E0 +2820 +3020 +2820 +27FC +2420 +2420 +2420 +3820 +2020 +2020 +2020 +0000 +ENDCHAR +STARTCHAR U+9622 +ENCODING 38434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7804 +4FFE +4920 +5120 +5120 +6120 +5120 +5120 +4920 +4920 +6920 +5222 +4222 +441E +4800 +ENDCHAR +STARTCHAR U+9623 +ENCODING 38435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C80 +4482 +48FF +5100 +4800 +44FE +4404 +4408 +4410 +5420 +4840 +4081 +4101 +40FF +0000 +0000 +ENDCHAR +STARTCHAR U+9624 +ENCODING 38436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +4910 +5110 +6111 +57FF +4911 +4912 +4914 +4910 +6910 +5101 +4101 +41FF +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+9625 +ENCODING 38437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C20 +4420 +4820 +4831 +53B6 +48A8 +44A8 +44A8 +44A4 +44A4 +4924 +7122 +4222 +4021 +40E0 +ENDCHAR +STARTCHAR U+9626 +ENCODING 38438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3C30 +2C30 +2836 +283C +2938 +29A0 +25A0 +2470 +2670 +3C58 +2888 +218E +2307 +2000 +ENDCHAR +STARTCHAR U+9628 +ENCODING 38440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +2500 +2900 +3178 +2948 +2548 +2548 +2548 +2570 +3A40 +2244 +2444 +283C +0000 +ENDCHAR +STARTCHAR U+962A +ENCODING 38442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DFC +2500 +2900 +29F8 +3188 +2988 +2550 +2550 +2520 +3A20 +2250 +2588 +2E04 +0000 +ENDCHAR +STARTCHAR U+962C +ENCODING 38444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C10 +49FF +5000 +4800 +447C +4444 +4444 +4444 +6444 +5844 +4045 +4085 +4307 +0000 +0000 +ENDCHAR +STARTCHAR U+962D +ENCODING 38445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7820 +4820 +5040 +6080 +5102 +4BFF +4891 +4890 +6890 +5090 +4090 +4111 +4211 +441F +0000 +0000 +ENDCHAR +STARTCHAR U+962E +ENCODING 38446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2400 +2800 +3000 +2BFC +24A0 +24A0 +24A0 +24A0 +3924 +2124 +2224 +241C +0000 +ENDCHAR +STARTCHAR U+962F +ENCODING 38447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +2940 +3140 +2978 +2540 +2540 +2540 +2540 +3940 +2140 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+9630 +ENCODING 38448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7D08 +4508 +4908 +5108 +49EF +4508 +4508 +4508 +5508 +4928 +4149 +4189 +410F +0000 +0000 +ENDCHAR +STARTCHAR U+9631 +ENCODING 38449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +7910 +4910 +4910 +57FC +5110 +6110 +5110 +5114 +4FFE +4910 +6910 +5110 +4210 +4210 +4410 +ENDCHAR +STARTCHAR U+9632 +ENCODING 38450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +2BFC +2840 +3040 +2878 +2448 +2448 +2488 +2488 +3908 +2208 +2430 +0000 +ENDCHAR +STARTCHAR U+9633 +ENCODING 38451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7DFE +4504 +4904 +4904 +5104 +4904 +49FC +4504 +4504 +4504 +6904 +5104 +4104 +41FC +4104 +ENDCHAR +STARTCHAR U+9634 +ENCODING 38452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7CFE +4484 +4884 +4884 +50FC +4884 +4884 +4484 +44FC +4484 +6884 +5104 +4104 +4214 +4408 +ENDCHAR +STARTCHAR U+9635 +ENCODING 38453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7884 +4FFE +5080 +50A0 +6120 +5128 +4BFC +4820 +4820 +6824 +57FE +4020 +4020 +4020 +4020 +ENDCHAR +STARTCHAR U+9636 +ENCODING 38454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +48A0 +50A0 +5110 +620E +5514 +4910 +4910 +4910 +6910 +5110 +4110 +4110 +4210 +4410 +ENDCHAR +STARTCHAR U+9637 +ENCODING 38455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DFE +4410 +4810 +4810 +5010 +4890 +449E +4490 +4490 +4490 +4890 +7090 +4090 +4090 +47FF +ENDCHAR +STARTCHAR U+9638 +ENCODING 38456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3F36 +2586 +2906 +29FE +2900 +25F8 +2718 +2730 +2720 +3F60 +2AC0 +26FE +20FE +0000 +ENDCHAR +STARTCHAR U+9639 +ENCODING 38457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7820 +4820 +53FE +6020 +5020 +4820 +4BFE +4840 +4880 +6904 +5202 +47FF +4001 +4000 +0000 +0000 +ENDCHAR +STARTCHAR U+963A +ENCODING 38458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7801 +4BFE +5108 +6108 +5108 +49FF +4908 +4908 +6908 +5108 +4125 +4143 +4181 +4339 +0000 +0000 +ENDCHAR +STARTCHAR U+963B +ENCODING 38459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF0 +2510 +2910 +2910 +31F0 +2910 +2510 +25F0 +2510 +3910 +2110 +2FFC +2000 +0000 +ENDCHAR +STARTCHAR U+963C +ENCODING 38460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7D00 +4504 +49FE +4A80 +5280 +4C88 +48FC +4480 +4480 +4488 +68FC +5080 +4080 +4080 +4080 +ENDCHAR +STARTCHAR U+963D +ENCODING 38461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C40 +4444 +487E +4840 +5040 +4844 +49FE +4504 +4504 +4504 +6904 +5104 +4104 +41FC +4104 +ENDCHAR +STARTCHAR U+963F +ENCODING 38463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2408 +2808 +31E8 +2928 +2528 +2528 +25E8 +2528 +3808 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+9640 +ENCODING 38464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +2420 +29FC +2908 +3280 +2880 +2498 +24E0 +2480 +2480 +3884 +2084 +207C +0000 +ENDCHAR +STARTCHAR U+9641 +ENCODING 38465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2980 +2D80 +2984 +3BE0 +3220 +29A0 +2D7C +27EC +2D28 +3D28 +2930 +2120 +2186 +20FC +0000 +ENDCHAR +STARTCHAR U+9642 +ENCODING 38466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +2420 +29FC +3128 +2920 +25F8 +2588 +2550 +2550 +3A20 +2230 +24C8 +2B04 +0000 +ENDCHAR +STARTCHAR U+9643 +ENCODING 38467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4410 +4810 +5010 +4810 +45FF +4511 +4511 +4529 +6945 +5101 +4101 +4105 +4102 +0000 +0000 +ENDCHAR +STARTCHAR U+9644 +ENCODING 38468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +3C88 +2488 +2908 +29FC +3308 +2B48 +2528 +2528 +2508 +2508 +3908 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+9645 +ENCODING 38469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7DFC +4400 +4800 +4800 +5004 +4BFE +4820 +4420 +44A8 +44A4 +6922 +5222 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U+9646 +ENCODING 38470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C20 +4428 +49FC +4820 +5020 +4824 +4BFE +4420 +4524 +4524 +6924 +5124 +4124 +41FC +4104 +ENDCHAR +STARTCHAR U+9647 +ENCODING 38471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7CA0 +4490 +4890 +4884 +57FE +48A0 +48A0 +4524 +4524 +6528 +5A32 +4222 +4462 +449E +4800 +ENDCHAR +STARTCHAR U+9648 +ENCODING 38472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +4844 +57FE +5080 +60A0 +5120 +4A28 +4BFC +4820 +6928 +5124 +4226 +4422 +40A0 +4040 +ENDCHAR +STARTCHAR U+9649 +ENCODING 38473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7BF8 +4810 +4820 +5040 +50B0 +610C +5604 +5010 +4BF8 +4840 +6840 +5040 +4044 +4FFE +4000 +ENDCHAR +STARTCHAR U+964A +ENCODING 38474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7880 +49FC +5210 +6120 +50C0 +4880 +4B20 +487E +6884 +5148 +4030 +4020 +4040 +4780 +0000 +0000 +ENDCHAR +STARTCHAR U+964B +ENCODING 38475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +39FC +2820 +2AF8 +32A8 +32A8 +2AA8 +2AD8 +2A98 +2A88 +3A98 +2200 +23FC +2200 +0000 +ENDCHAR +STARTCHAR U+964C +ENCODING 38476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2440 +2840 +3080 +29F8 +2508 +2508 +25F8 +2508 +3908 +2108 +21F8 +2108 +0000 +ENDCHAR +STARTCHAR U+964D +ENCODING 38477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C78 +2488 +2950 +3230 +28DC +2710 +24F8 +2490 +2490 +3BFC +2010 +2010 +2010 +0000 +ENDCHAR +STARTCHAR U+964E +ENCODING 38478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7920 +4920 +51FC +6220 +5020 +4820 +4BFE +4870 +68A8 +5124 +4222 +4421 +4020 +4020 +0000 +0000 +ENDCHAR +STARTCHAR U+964F +ENCODING 38479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +2BFC +3080 +28F8 +2588 +26F8 +2488 +24F8 +3888 +2088 +2088 +2098 +0000 +ENDCHAR +STARTCHAR U+9650 +ENCODING 38480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF0 +2510 +2910 +31F0 +2910 +25F0 +2548 +2548 +2530 +3920 +2150 +2188 +2604 +0000 +ENDCHAR +STARTCHAR U+9651 +ENCODING 38481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4410 +4820 +5040 +51FF +4929 +4529 +4529 +4529 +5529 +4929 +4129 +4129 +4102 +0000 +0000 +ENDCHAR +STARTCHAR U+9652 +ENCODING 38482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3CC0 +2CF8 +2910 +2930 +2BFE +2B00 +2778 +27F8 +27C8 +2FF8 +2BD8 +22C2 +227E +207E +0000 +ENDCHAR +STARTCHAR U+9653 +ENCODING 38483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7820 +4BFE +5020 +6050 +5088 +4974 +4A02 +4DFD +6880 +50FC +4004 +4004 +4008 +4070 +0000 +0000 +ENDCHAR +STARTCHAR U+9654 +ENCODING 38484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7840 +4844 +4FFE +5080 +5090 +6110 +53E0 +5128 +4848 +4890 +6B10 +5020 +40D8 +4306 +4C02 +ENDCHAR +STARTCHAR U+9655 +ENCODING 38485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +4848 +57FC +5040 +6248 +5150 +4844 +4FFE +4840 +68A0 +50A0 +4110 +4208 +440E +4804 +ENDCHAR +STARTCHAR U+9656 +ENCODING 38486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7880 +6998 +7BFC +73E0 +71A0 +693C +6AD8 +6CF8 +6D90 +7BF0 +6060 +60F0 +631E +6004 +0000 +ENDCHAR +STARTCHAR U+9657 +ENCODING 38487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3C20 +2D26 +29AC +30F8 +30FC +288C +2CFC +249C +2C8C +3CFC +288C +208C +209C +2098 +0000 +ENDCHAR +STARTCHAR U+9658 +ENCODING 38488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7BFE +4800 +5092 +6124 +5248 +4924 +4892 +4800 +6BFE +5020 +4020 +4020 +4022 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+965B +ENCODING 38491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +3D24 +2528 +29F0 +2920 +3124 +29E4 +275C +2440 +27F8 +3840 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+965C +ENCODING 38492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +2BFC +3150 +2950 +2550 +26E8 +2448 +24A0 +38A0 +2110 +2208 +2404 +0000 +ENDCHAR +STARTCHAR U+965D +ENCODING 38493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +2440 +2BFC +3040 +2B58 +2548 +2548 +26D4 +24A4 +38A0 +2110 +2208 +2404 +0000 +ENDCHAR +STARTCHAR U+965E +ENCODING 38494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3DD0 +2490 +2890 +33FC +2890 +2510 +2650 +2440 +27F8 +3840 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+965F +ENCODING 38495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3C20 +24B8 +28A0 +30A0 +2BFC +2420 +24A4 +24A4 +2528 +3A70 +2020 +20C0 +2300 +0000 +ENDCHAR +STARTCHAR U+9661 +ENCODING 38497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +4850 +53F8 +5040 +6048 +57FC +4840 +4A50 +4A78 +6A40 +5240 +4540 +44C6 +483C +4000 +ENDCHAR +STARTCHAR U+9662 +ENCODING 38498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2A08 +3000 +2BF8 +2400 +27FC +24A0 +24A0 +3920 +2124 +2224 +241C +0000 +ENDCHAR +STARTCHAR U+9663 +ENCODING 38499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2840 +2BF8 +3248 +2BF8 +2648 +27F8 +2440 +27FC +3840 +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+9664 +ENCODING 38500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +24A0 +2890 +3108 +2BF4 +2440 +27FC +2440 +2550 +3948 +2244 +2444 +20C0 +0000 +ENDCHAR +STARTCHAR U+9665 +ENCODING 38501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +24F8 +2890 +3110 +2A20 +2578 +2548 +2548 +2578 +3948 +2148 +2178 +2148 +0000 +ENDCHAR +STARTCHAR U+9666 +ENCODING 38502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2840 +31F8 +2840 +27FC +2490 +27FC +3990 +2250 +2450 +2010 +2030 +0000 +ENDCHAR +STARTCHAR U+9667 +ENCODING 38503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7BFC +4A08 +4A08 +53F8 +5208 +6208 +53F8 +5248 +4840 +4BF8 +6840 +5040 +4044 +4FFE +4000 +ENDCHAR +STARTCHAR U+9668 +ENCODING 38504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7CFC +4488 +4888 +48F8 +5004 +49FE +4904 +4524 +4524 +4524 +6924 +5050 +4048 +4084 +4304 +ENDCHAR +STARTCHAR U+9669 +ENCODING 38505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +48A0 +5110 +522E +65F4 +5000 +4A48 +4A48 +4948 +6948 +5150 +4150 +4024 +4FFE +4000 +ENDCHAR +STARTCHAR U+966A +ENCODING 38506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2910 +2890 +30A0 +2BFC +2400 +25F8 +2508 +3908 +2108 +21F8 +2108 +0000 +ENDCHAR +STARTCHAR U+966B +ENCODING 38507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C28 +2428 +2828 +31EF +2828 +2428 +25EF +2428 +3428 +29EF +2028 +2028 +2048 +2088 +0000 +0000 +ENDCHAR +STARTCHAR U+966C +ENCODING 38508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2A80 +2A80 +33F8 +32A8 +2AA8 +2BA8 +2AB0 +2A90 +3BB0 +24A8 +20C8 +2084 +0000 +ENDCHAR +STARTCHAR U+966D +ENCODING 38509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +44FE +4410 +4828 +5044 +4882 +45FF +4402 +44F2 +6892 +5092 +40F2 +4002 +400C +0000 +0000 +ENDCHAR +STARTCHAR U+966E +ENCODING 38510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3ED0 +2490 +2D9E +29B0 +2B90 +25FC +2590 +27B0 +27FE +3DB0 +3DB0 +21FE +2180 +2000 +ENDCHAR +STARTCHAR U+966F +ENCODING 38511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7820 +4850 +5088 +6104 +5202 +4CF9 +4800 +4BFE +4A52 +6A52 +5BFE +4252 +4252 +4206 +0000 +0000 +ENDCHAR +STARTCHAR U+9670 +ENCODING 38512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +24A0 +2910 +32E8 +2804 +25F0 +2420 +25F0 +2400 +3FFC +20A0 +2130 +27C8 +0000 +ENDCHAR +STARTCHAR U+9671 +ENCODING 38513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7880 +4880 +51FF +6201 +4041 +5249 +4951 +4841 +4BF9 +48E1 +6951 +5249 +4041 +404E +0000 +0000 +ENDCHAR +STARTCHAR U+9672 +ENCODING 38514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3DE0 +2440 +2BF8 +3150 +2950 +27FC +2550 +2550 +27F8 +3840 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+9673 +ENCODING 38515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27FC +2840 +2BF8 +3248 +2BF8 +2648 +27F8 +24E0 +3950 +2248 +2444 +2040 +0000 +ENDCHAR +STARTCHAR U+9674 +ENCODING 38516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7908 +4BFC +4A48 +5248 +53F8 +6248 +5248 +53F8 +48A0 +4924 +6FFE +5020 +4020 +4020 +4020 +ENDCHAR +STARTCHAR U+9675 +ENCODING 38517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +25F8 +2840 +33FC +28A0 +2524 +269C +24F0 +2510 +3AA0 +2040 +21B0 +2E0C +0000 +ENDCHAR +STARTCHAR U+9676 +ENCODING 38518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7900 +4900 +53F8 +6508 +59E8 +4A88 +4FF8 +4888 +4AA8 +72A8 +43E8 +4228 +4030 +0000 +ENDCHAR +STARTCHAR U+9677 +ENCODING 38519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3CF8 +2488 +2908 +3108 +2A30 +2440 +25B8 +2508 +25B8 +3908 +2108 +21F8 +2108 +0000 +ENDCHAR +STARTCHAR U+9678 +ENCODING 38520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +27F8 +2840 +2BFC +30A0 +2924 +265C +2440 +27F8 +3840 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+967A +ENCODING 38522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +24A0 +2910 +2BF8 +3044 +2BF8 +2648 +2648 +27F8 +3840 +20A0 +2110 +260C +0000 +ENDCHAR +STARTCHAR U+967B +ENCODING 38523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +3DFE +28F0 +2BFC +33F4 +2BBC +2B9C +27FC +2664 +2DF8 +29F8 +2060 +27FE +6002 +0000 +ENDCHAR +STARTCHAR U+967C +ENCODING 38524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +44FE +4411 +4812 +5014 +49FF +4420 +447E +44C2 +6942 +527E +4042 +4042 +407E +0000 +0000 +ENDCHAR +STARTCHAR U+967D +ENCODING 38525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF0 +2510 +29F0 +2910 +31F0 +2800 +27FC +2500 +25F8 +3AA8 +24A8 +2148 +22B0 +0000 +ENDCHAR +STARTCHAR U+967E +ENCODING 38526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7BFE +4820 +5040 +63FE +5252 +4A52 +4A56 +4820 +4FFF +6820 +5050 +4088 +4104 +4E03 +0000 +0000 +ENDCHAR +STARTCHAR U+967F +ENCODING 38527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0004 +3E00 +2A20 +2A24 +33FC +32EC +2AA8 +2FFC +27F4 +2E50 +3AD8 +228C +230E +2200 +0000 +ENDCHAR +STARTCHAR U+9680 +ENCODING 38528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7CF8 +4410 +49FF +5010 +48FE +4492 +44FE +4492 +54FE +4810 +40FE +4010 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+9681 +ENCODING 38529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFE +6F84 +6BCC +73FC +728C +6AFC +6A28 +67FE +66D8 +6EF8 +7A38 +624C +63FE +0000 +ENDCHAR +STARTCHAR U+9682 +ENCODING 38530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3E70 +24D8 +2D8E +2BFF +3880 +2CFC +2484 +26FC +2683 +3E60 +3C44 +2086 +21F6 +0082 +ENDCHAR +STARTCHAR U+9683 +ENCODING 38531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7870 +4888 +5104 +62FA +5401 +4BC2 +4A42 +4A52 +4BD2 +4A52 +6BD2 +5252 +4242 +44C6 +0000 +0000 +ENDCHAR +STARTCHAR U+9684 +ENCODING 38532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7BFE +4A02 +53FE +6202 +53FE +4800 +4FFF +4820 +4920 +693E +5120 +41A0 +4260 +443F +0000 +0000 +ENDCHAR +STARTCHAR U+9685 +ENCODING 38533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2548 +2948 +31F8 +2948 +25F8 +2440 +27FC +2654 +3A7C +238C +2204 +220C +0000 +ENDCHAR +STARTCHAR U+9686 +ENCODING 38534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C40 +24F8 +2990 +2A60 +30F0 +2B4C +2540 +25F8 +2640 +39F8 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+9687 +ENCODING 38535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +780A +4809 +53FF +6208 +53F8 +4A88 +4AA8 +4BF8 +6AA8 +52AA +42AC +444D +48B3 +5111 +0000 +0000 +ENDCHAR +STARTCHAR U+9688 +ENCODING 38536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2548 +29F8 +3148 +29F8 +2400 +27FC +2548 +2530 +3920 +2150 +2188 +2604 +0000 +ENDCHAR +STARTCHAR U+9689 +ENCODING 38537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7900 +490E +5202 +6602 +53DE +4A02 +4A02 +4BFE +4800 +6820 +53FE +4020 +4020 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+968A +ENCODING 38538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +3C90 +24A0 +2BFC +2840 +30E8 +2B68 +24B0 +2730 +2470 +38A8 +2324 +2020 +20C0 +0000 +ENDCHAR +STARTCHAR U+968B +ENCODING 38539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3FFC +2480 +28F8 +2920 +32FC +2800 +25F8 +2508 +25F8 +3908 +21F8 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+968D +ENCODING 38541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C80 +25F8 +2908 +31F8 +2908 +25F8 +2400 +27FC +2440 +39F8 +2040 +27FC +2000 +0000 +ENDCHAR +STARTCHAR U+968E +ENCODING 38542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +3D24 +25F8 +2920 +3124 +29BC +2640 +25F8 +2508 +25F8 +3908 +2108 +21F8 +2108 +0000 +ENDCHAR +STARTCHAR U+968F +ENCODING 38543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +25FC +2940 +3078 +28C8 +2778 +2548 +2578 +2548 +3948 +2158 +2280 +247C +0000 +ENDCHAR +STARTCHAR U+9690 +ENCODING 38544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7880 +48F0 +5110 +5224 +67FE +5004 +4BFC +4804 +4BFC +6804 +5280 +4260 +462C +4A0A +41F8 +ENDCHAR +STARTCHAR U+9691 +ENCODING 38545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7D11 +4511 +49FF +5000 +49FF +4400 +44FE +4482 +4482 +54FE +4844 +4044 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+9692 +ENCODING 38546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7904 +4888 +57FF +6050 +53FE +4852 +4FFF +4852 +4BFE +6850 +5154 +4252 +4451 +4050 +0000 +0000 +ENDCHAR +STARTCHAR U+9693 +ENCODING 38547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C10 +45FF +4840 +50FE +4910 +45FF +4420 +45FF +4440 +68FE +5110 +4210 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+9694 +ENCODING 38548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2400 +29F0 +2910 +31F0 +2800 +27F8 +26A8 +2738 +3AF8 +2248 +2248 +2258 +0000 +ENDCHAR +STARTCHAR U+9695 +ENCODING 38549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2508 +29F8 +3000 +29F8 +2508 +25F8 +2508 +25F8 +3908 +21F8 +2198 +2604 +0000 +ENDCHAR +STARTCHAR U+9696 +ENCODING 38550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2460 +3DE4 +2DFC +2984 +29FC +2984 +2DFE +2580 +2502 +25FE +3C2E +29FE +2356 +221C +0008 +ENDCHAR +STARTCHAR U+9697 +ENCODING 38551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3C80 +25F8 +2948 +3148 +29F8 +2548 +25F8 +24D0 +24D0 +38E8 +217C +2244 +243C +0000 +ENDCHAR +STARTCHAR U+9698 +ENCODING 38552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +00F0 +3C90 +2508 +2AF4 +3000 +28F0 +2490 +2508 +27FC +2568 +3968 +2168 +23FC +2000 +0000 +ENDCHAR +STARTCHAR U+9699 +ENCODING 38553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3D50 +2548 +2A48 +31F0 +2910 +25F0 +2510 +25F0 +2550 +3948 +2244 +2444 +20C0 +0000 +ENDCHAR +STARTCHAR U+969A +ENCODING 38554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7924 +48A8 +53FE +5202 +6202 +51FC +4904 +4904 +49FC +4820 +7020 +41FC +4020 +4020 +47FF +ENDCHAR +STARTCHAR U+969B +ENCODING 38555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3DF8 +2548 +2AE8 +32B0 +2D90 +25F8 +2604 +27F8 +2440 +3950 +2148 +2248 +20C0 +0000 +ENDCHAR +STARTCHAR U+969C +ENCODING 38556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3FF8 +2490 +2BFC +2800 +31F0 +2910 +25F0 +2510 +25F0 +3840 +27FC +2040 +2040 +0000 +ENDCHAR +STARTCHAR U+969D +ENCODING 38557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7820 +49FC +5104 +51FC +6104 +51FC +5100 +49FE +4900 +49FF +4829 +7295 +4255 +4241 +4406 +ENDCHAR +STARTCHAR U+969E +ENCODING 38558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7888 +4890 +57FF +5082 +4FF2 +4882 +4FF2 +4A0A +6BEA +522A +422A +4224 +442A +41D1 +0000 +0000 +ENDCHAR +STARTCHAR U+969F +ENCODING 38559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +24A4 +2D28 +2D28 +28AC +31FC +2124 +29AC +2DAC +25AC +2C7E +2C70 +20F8 +21AE +2224 +0000 +ENDCHAR +STARTCHAR U+96A0 +ENCODING 38560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3FE4 +2644 +2928 +31F8 +2808 +25F8 +2408 +25F8 +2440 +3AA8 +22A4 +2494 +2070 +0000 +ENDCHAR +STARTCHAR U+96A1 +ENCODING 38561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7810 +4BFE +5084 +63FF +5210 +4A90 +4AFE +4B10 +4A10 +6AFE +5210 +4410 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+96A2 +ENCODING 38562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7820 +4BFE +5020 +67FF +5104 +4FDF +4904 +4FDF +6800 +57FF +4090 +4111 +4211 +441F +0000 +0000 +ENDCHAR +STARTCHAR U+96A3 +ENCODING 38563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E48 +2550 +2BFC +30E0 +2950 +264C +2548 +25FC +2668 +3BA8 +24FC +2108 +2608 +0000 +ENDCHAR +STARTCHAR U+96A4 +ENCODING 38564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7CFE +4892 +50FE +4810 +45FF +44FE +4482 +44FE +4482 +54FE +4882 +40FE +4101 +0000 +0000 +ENDCHAR +STARTCHAR U+96A5 +ENCODING 38565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7804 +6BCC +78D6 +7198 +7198 +69FE +68FE +6DF8 +6D88 +79F8 +6008 +6098 +60F0 +63FE +0000 +ENDCHAR +STARTCHAR U+96A6 +ENCODING 38566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7808 +4BC8 +527F +5252 +6252 +53D2 +527F +4A08 +4BC8 +4A48 +4E7F +7648 +4BC8 +4248 +4008 +ENDCHAR +STARTCHAR U+96A7 +ENCODING 38567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0470 +3A50 +2A88 +29FC +3420 +3264 +2BB4 +2858 +2FB8 +2A54 +3B94 +2210 +2560 +28FC +0000 +ENDCHAR +STARTCHAR U+96A8 +ENCODING 38568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +3920 +29FC +2C78 +3290 +33FC +2878 +2F48 +2578 +2578 +2548 +3958 +2280 +247C +0000 +ENDCHAR +STARTCHAR U+96A9 +ENCODING 38569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7900 +4BFE +4E02 +520A +63F2 +52AA +4A72 +4BFE +4A72 +4AAA +77FF +4050 +408C +4303 +0000 +0000 +ENDCHAR +STARTCHAR U+96AA +ENCODING 38570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3840 +28A0 +2910 +33F8 +3404 +2BB8 +2AA8 +2AA8 +2BB8 +3910 +2198 +2264 +2444 +0000 +ENDCHAR +STARTCHAR U+96AC +ENCODING 38572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4454 +4892 +51FF +4911 +45BB +4555 +45BB +4511 +55BB +4955 +41BB +4111 +4111 +0000 +0000 +ENDCHAR +STARTCHAR U+96AE +ENCODING 38574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +45FF +4829 +50D6 +4854 +44D6 +4515 +4482 +44FE +5482 +48FE +4082 +4082 +4102 +0000 +0000 +ENDCHAR +STARTCHAR U+96AF +ENCODING 38575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7DFF +4410 +48FE +4800 +53FF +4801 +48FC +4410 +45FE +4400 +4BFF +7002 +43DF +4262 +43D6 +ENDCHAR +STARTCHAR U+96B0 +ENCODING 38576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2508 +29F8 +3108 +29F8 +2488 +2774 +2488 +2554 +3BFC +2000 +22A8 +2454 +0000 +ENDCHAR +STARTCHAR U+96B1 +ENCODING 38577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3DE8 +2524 +2BF4 +3040 +29F0 +25F8 +2408 +27FC +25F8 +3848 +22A4 +2294 +2470 +0000 +ENDCHAR +STARTCHAR U+96B2 +ENCODING 38578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3CA8 +256C +2A34 +31C0 +29FC +2520 +25F8 +25F8 +2520 +39FC +2354 +22AC +2418 +0000 +ENDCHAR +STARTCHAR U+96B3 +ENCODING 38579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C40 +27FC +2480 +29F8 +2688 +24F8 +3488 +28F8 +2188 +26C0 +1830 +E10E +0950 +1128 +2528 +0200 +ENDCHAR +STARTCHAR U+96B4 +ENCODING 38580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0120 +3920 +2FFC +2AA0 +37F8 +3008 +2BB8 +2AA0 +2BB8 +3AB8 +23A0 +22B8 +22A4 +229C +0000 +ENDCHAR +STARTCHAR U+96B6 +ENCODING 38582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +1FF0 +0110 +7FFC +0110 +1FF0 +1110 +0990 +0BA0 +0D40 +7130 +010C +0300 +0000 +ENDCHAR +STARTCHAR U+96B7 +ENCODING 38583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7EF8 +0828 +3FFC +0028 +3EF8 +0120 +7EA4 +08B8 +2C70 +2BA8 +4A24 +1860 +0000 +ENDCHAR +STARTCHAR U+96B8 +ENCODING 38584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7EF8 +1C28 +1BFC +2A28 +48F8 +3E28 +00A4 +7E78 +2C70 +2BA8 +4A24 +1860 +0000 +ENDCHAR +STARTCHAR U+96B9 +ENCODING 38585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0420 +0440 +0FFC +0840 +1840 +2FF8 +4840 +0840 +0FF8 +0840 +0840 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+96BA +ENCODING 38586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +030E +3FFE +368C +24C0 +0FF8 +1CC0 +3CF8 +6FF0 +0CC0 +0FF8 +0FC0 +0CC0 +0FFE +0C00 +ENDCHAR +STARTCHAR U+96BB +ENCODING 38587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0FF8 +1880 +1FF0 +2880 +4FF0 +0880 +0FFC +0800 +3FF0 +0260 +0180 +0760 +381C +0000 +ENDCHAR +STARTCHAR U+96BC +ENCODING 38588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0880 +0FF8 +1880 +2FF0 +4880 +0FF0 +0880 +0FF8 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+96BD +ENCODING 38589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0888 +1FFC +1080 +3FF8 +5080 +9FF8 +1080 +1FFC +1000 +7FE0 +0428 +047C +0808 +1028 +6010 +ENDCHAR +STARTCHAR U+96BE +ENCODING 38590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0060 +0450 +FE44 +04FE +4490 +4590 +2AFC +2890 +1090 +10FC +2890 +2490 +4494 +80FE +0080 +0080 +ENDCHAR +STARTCHAR U+96BF +ENCODING 38591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +1444 +12FF +1044 +7E44 +107F +1044 +1044 +107F +1044 +1044 +0944 +057F +0340 +0000 +0000 +ENDCHAR +STARTCHAR U+96C0 +ENCODING 38592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0560 +1918 +6324 +00C0 +0340 +0FF8 +7880 +0FF0 +0880 +0FF0 +0880 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+96C1 +ENCODING 38593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1248 +1250 +14FC +1490 +1D90 +16F8 +1490 +14F8 +2490 +2490 +44FC +0480 +0000 +ENDCHAR +STARTCHAR U+96C2 +ENCODING 38594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1424 +2222 +417F +00A4 +1E24 +003F +3F24 +0124 +023F +0424 +0824 +1024 +003F +0000 +0000 +ENDCHAR +STARTCHAR U+96C3 +ENCODING 38595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +7FA4 +127F +12A4 +1224 +123F +7FA4 +1224 +123F +1224 +1224 +1224 +223F +0220 +0000 +0000 +ENDCHAR +STARTCHAR U+96C4 +ENCODING 38596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0848 +0890 +7FFC +0990 +0A90 +0CF8 +0C90 +1490 +16F8 +2990 +4F90 +38FC +0080 +0000 +ENDCHAR +STARTCHAR U+96C5 +ENCODING 38597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +3E48 +2490 +24FC +2590 +7E90 +0CFC +0C90 +1490 +14FC +2490 +4490 +04FC +0C80 +0000 +ENDCHAR +STARTCHAR U+96C6 +ENCODING 38598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0FF8 +1880 +1FF0 +2880 +4FF0 +0880 +0FF8 +0100 +7FFC +0380 +0D60 +711C +0100 +0000 +ENDCHAR +STARTCHAR U+96C7 +ENCODING 38599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +1FF8 +1008 +1FF8 +1220 +17FC +1C40 +17F0 +27F0 +2440 +47FC +0400 +0000 +ENDCHAR +STARTCHAR U+96C8 +ENCODING 38600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0820 +0820 +13FE +7020 +17FF +1020 +13FE +1020 +1020 +17FF +0000 +0000 +ENDCHAR +STARTCHAR U+96C9 +ENCODING 38601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +1048 +1050 +1EFC +2890 +4990 +7FF8 +0890 +0890 +14F8 +1290 +2290 +40FC +0080 +0000 +ENDCHAR +STARTCHAR U+96CA +ENCODING 38602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2024 +2022 +3F40 +21FF +2144 +4144 +3D7F +2544 +2544 +3D7F +2544 +0144 +097F +0640 +0000 +0000 +ENDCHAR +STARTCHAR U+96CB +ENCODING 38603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0440 +0FFC +0840 +1FF0 +2840 +4FF0 +0840 +0FFC +1E78 +1248 +13C8 +1248 +1018 +0000 +ENDCHAR +STARTCHAR U+96CC +ENCODING 38604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0A48 +0A48 +0A50 +0AFC +2A90 +2F90 +2AF8 +2A90 +2A90 +2AF8 +2F90 +3B90 +61FC +0080 +0000 +ENDCHAR +STARTCHAR U+96CD +ENCODING 38605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +1090 +1490 +65FC +2920 +1BF8 +1520 +1DF8 +6520 +0920 +11FC +2100 +0000 +ENDCHAR +STARTCHAR U+96CE +ENCODING 38606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +3C48 +2450 +24FC +3C90 +2590 +26F8 +3C90 +2490 +24F8 +2690 +3890 +60FC +0080 +0000 +ENDCHAR +STARTCHAR U+96CF +ENCODING 38607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1050 +2094 +3CFE +4590 +8A90 +14FC +FE90 +0490 +04FC +7C90 +0490 +0494 +FCFE +0480 +0080 +ENDCHAR +STARTCHAR U+96D1 +ENCODING 38609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0848 +7C90 +14FC +1590 +2390 +48F8 +0890 +7F90 +1CF8 +1A90 +2990 +48FC +0880 +0000 +ENDCHAR +STARTCHAR U+96D2 +ENCODING 38610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1060 +1050 +1E84 +22FE +6590 +9990 +0AFC +1490 +2290 +7FFC +A290 +2290 +2294 +3EFE +2280 +0080 +ENDCHAR +STARTCHAR U+96D3 +ENCODING 38611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1414 +2224 +417F +3EC4 +0944 +087F +7F44 +0844 +1C7F +2A44 +4944 +087F +0840 +0000 +0000 +ENDCHAR +STARTCHAR U+96D4 +ENCODING 38612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2828 +6464 +3F3F +2424 +2424 +3F3F +2424 +2424 +3F3F +2424 +2424 +3F3F +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+96D5 +ENCODING 38613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +3F48 +2550 +257C +3FD0 +25D0 +3F78 +2550 +2F50 +2B78 +2F50 +2B50 +217C +4340 +0000 +ENDCHAR +STARTCHAR U+96D6 +ENCODING 38614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +3E48 +2250 +3EFC +0890 +3F90 +2AF8 +2A90 +3E90 +28F8 +0A90 +0F90 +71FC +0080 +0000 +ENDCHAR +STARTCHAR U+96D7 +ENCODING 38615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0828 +7F44 +0883 +3F28 +2248 +3EFF +2348 +3E7E +0848 +087E +7F48 +087F +0840 +0000 +0000 +ENDCHAR +STARTCHAR U+96D8 +ENCODING 38616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +3EFF +2234 +2A7F +2AC8 +2A7E +7F48 +227E +2248 +227F +223E +2214 +2208 +4677 +0000 +0000 +ENDCHAR +STARTCHAR U+96D9 +ENCODING 38617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1248 +1FFC +2490 +7FF8 +2490 +3EF8 +2490 +3FFC +2080 +1FF0 +0260 +0180 +06E0 +381C +0000 +ENDCHAR +STARTCHAR U+96DA +ENCODING 38618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F7F +0410 +3F7E +2142 +3F7E +1040 +3FFE +5040 +1FFE +1040 +1FFE +1040 +1FFE +0000 +0000 +ENDCHAR +STARTCHAR U+96DB +ENCODING 38619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1048 +1048 +3E90 +52FC +5790 +7F90 +52F8 +2C90 +3E90 +52F8 +5690 +7E90 +52FC +2C80 +0000 +ENDCHAR +STARTCHAR U+96DC +ENCODING 38620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0848 +7F50 +12FC +1290 +2D90 +49F8 +0890 +7F90 +1CF8 +1A90 +2A90 +48FC +0880 +0000 +ENDCHAR +STARTCHAR U+96DD +ENCODING 38621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +2494 +4932 +249F +3F92 +2092 +3F9F +0012 +7F92 +449F +7F92 +4012 +405F +7FD0 +0000 +0000 +ENDCHAR +STARTCHAR U+96DE +ENCODING 38622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +7E48 +08C4 +497F +2A44 +1044 +247F +7844 +1244 +3E7F +0844 +7F44 +147F +2240 +0000 +0000 +ENDCHAR +STARTCHAR U+96DF +ENCODING 38623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1FFC +0520 +0FF8 +1820 +2FF8 +0FF8 +0820 +0FF8 +3FFE +2222 +27F2 +2C1A +27F6 +0000 +0000 +ENDCHAR +STARTCHAR U+96E0 +ENCODING 38624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3218 +2110 +3D3E +5068 +D728 +793E +5128 +5128 +7D3E +5128 +5168 +51A8 +7D3E +4020 +4020 +ENDCHAR +STARTCHAR U+96E1 +ENCODING 38625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7BD2 +2952 +5AFF +2952 +3592 +0A1F +1512 +2492 +4A5F +0412 +1912 +021F +0410 +3810 +0000 +0000 +ENDCHAR +STARTCHAR U+96E2 +ENCODING 38626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0848 +7F50 +26FC +3AD0 +3750 +3E78 +0850 +7F50 +4D78 +5350 +7F50 +417C +4340 +0000 +ENDCHAR +STARTCHAR U+96E3 +ENCODING 38627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1448 +1448 +7F50 +14FC +3E90 +2B90 +3EF8 +0890 +3E90 +08F8 +7F90 +1490 +22FC +4080 +0000 +ENDCHAR +STARTCHAR U+96E5 +ENCODING 38629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0240 +07F8 +0C40 +07F8 +07F8 +0440 +07F8 +1414 +3F3F +6464 +3F3F +3F3F +2424 +3F3F +0000 +0000 +ENDCHAR +STARTCHAR U+96E8 +ENCODING 38632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0100 +3FF8 +2948 +2528 +2528 +2108 +2948 +2528 +2528 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+96E9 +ENCODING 38633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0100 +7FFE +5112 +8D64 +1110 +0100 +3FF8 +0000 +FFFE +0800 +0FF0 +0010 +0010 +00A0 +0040 +ENDCHAR +STARTCHAR U+96EA +ENCODING 38634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +0100 +1FF0 +0010 +1FF0 +0010 +1FF0 +0010 +0000 +ENDCHAR +STARTCHAR U+96EB +ENCODING 38635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +0000 +7FFC +0180 +0160 +0110 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+96EF +ENCODING 38639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0100 +7FFE +5112 +8D64 +1110 +0200 +0104 +FFFE +0820 +0440 +0280 +0100 +06C0 +183C +6008 +ENDCHAR +STARTCHAR U+96F0 +ENCODING 38640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +07C0 +0440 +1830 +6FEC +0220 +0420 +18C0 +0000 +ENDCHAR +STARTCHAR U+96F1 +ENCODING 38641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +0000 +0080 +7FFF +0400 +07FC +0404 +0804 +1048 +2030 +0000 +0000 +ENDCHAR +STARTCHAR U+96F2 +ENCODING 38642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +2104 +3D78 +4F38 +0000 +1FF0 +0000 +7FFC +0220 +04F0 +3F08 +0000 +ENDCHAR +STARTCHAR U+96F3 +ENCODING 38643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0100 +7FFE +5112 +8D64 +1110 +3FFC +2100 +2108 +2FFC +2108 +2108 +2108 +4208 +4C50 +9020 +ENDCHAR +STARTCHAR U+96F5 +ENCODING 38645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +0890 +0080 +1FFC +1084 +1084 +7FFF +0220 +0410 +380E +0000 +0000 +ENDCHAR +STARTCHAR U+96F6 +ENCODING 38646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +0280 +0FE0 +701C +1FF0 +0110 +0160 +0100 +0000 +ENDCHAR +STARTCHAR U+96F7 +ENCODING 38647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+96F8 +ENCODING 38648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +0080 +0808 +0808 +7FFF +0808 +0FF8 +0808 +0FF8 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+96F9 +ENCODING 38649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0200 +07F0 +1810 +6F90 +0890 +0FE4 +0804 +07FC +0000 +ENDCHAR +STARTCHAR U+96FA +ENCODING 38650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +0000 +0FF8 +0120 +00C0 +7FFF +0242 +0444 +3940 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+96FB +ENCODING 38651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +1FF0 +1110 +1FF0 +1110 +1FF4 +1104 +00FC +0000 +ENDCHAR +STARTCHAR U+96FD +ENCODING 38653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +0080 +0004 +1FF8 +1084 +0C98 +7FFF +0080 +0080 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+96FE +ENCODING 38654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FF8 +0100 +7FFE +5112 +8924 +1410 +07E0 +0C40 +1380 +0C60 +F21E +0FE4 +0220 +0420 +08A0 +3040 +ENDCHAR +STARTCHAR U+96FF +ENCODING 38655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4889 +4491 +0808 +0420 +2424 +1428 +0C30 +0420 +3C3C +0821 +703F +0000 +0000 +ENDCHAR +STARTCHAR U+9700 +ENCODING 38656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +7FFC +0200 +3FF8 +2448 +2448 +2448 +2458 +0000 +ENDCHAR +STARTCHAR U+9701 +ENCODING 38657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0100 +7FFE +5112 +8D64 +1210 +0100 +7FFC +0820 +0440 +0380 +1C70 +E82E +0820 +1020 +2020 +ENDCHAR +STARTCHAR U+9702 +ENCODING 38658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4889 +4491 +0888 +0020 +2020 +17FF +40A8 +3124 +0623 +1020 +6020 +0000 +0000 +ENDCHAR +STARTCHAR U+9703 +ENCODING 38659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3FFC +3FFC +3D3C +65F0 +1D10 +2040 +3044 +6FFC +3CC8 +14E0 +20C0 +2140 +3264 +347C +0000 +ENDCHAR +STARTCHAR U+9704 +ENCODING 38660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0560 +1918 +6FE4 +0820 +0FE0 +0FE0 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+9705 +ENCODING 38661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4889 +4491 +0888 +7FFF +1FFC +1FFC +0000 +1FFC +1004 +1FFC +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+9706 +ENCODING 38662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0018 +3DE0 +0820 +3FFC +1220 +0CF8 +1E00 +61FC +0000 +ENDCHAR +STARTCHAR U+9707 +ENCODING 38663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +0000 +1FF8 +13E0 +1FFC +1490 +2760 +581C +0000 +ENDCHAR +STARTCHAR U+9708 +ENCODING 38664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +2108 +5D70 +1D70 +1040 +4FFC +2040 +0BF8 +1248 +2270 +2040 +0000 +ENDCHAR +STARTCHAR U+9709 +ENCODING 38665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0100 +7FFE +4922 +8544 +0920 +1000 +1FF8 +2000 +5FF0 +1214 +FFFE +2090 +3FF8 +0010 +0030 +ENDCHAR +STARTCHAR U+970A +ENCODING 38666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +2108 +5D70 +1D70 +0FE0 +0000 +3FF8 +1290 +0AA0 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+970B +ENCODING 38667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +7FFF +4891 +4489 +1FFC +0080 +1FFC +7FFF +0084 +1FFC +3FFE +0220 +01C0 +1E3C +0000 +0000 +ENDCHAR +STARTCHAR U+970D +ENCODING 38669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +3D78 +5D70 +0540 +0FF8 +1880 +6FF0 +0FF0 +0880 +0FFC +0800 +0000 +ENDCHAR +STARTCHAR U+970E +ENCODING 38670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0100 +3FF8 +0440 +7FFC +3FF8 +0E40 +03C0 +3C30 +0000 +ENDCHAR +STARTCHAR U+970F +ENCODING 38671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +2108 +5D70 +1D70 +0280 +3EF8 +0280 +3EF8 +0280 +7CFC +0880 +0000 +ENDCHAR +STARTCHAR U+9710 +ENCODING 38672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +54A9 +4A95 +0000 +23E0 +1024 +43E4 +3208 +0BEA +1029 +223F +61C1 +0000 +0000 +ENDCHAR +STARTCHAR U+9711 +ENCODING 38673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +2108 +5D70 +1D70 +1040 +487C +2040 +0BF8 +1208 +23F8 +2208 +0000 +ENDCHAR +STARTCHAR U+9712 +ENCODING 38674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F10 +0828 +7F44 +6B82 +5D00 +6B3C +0000 +3E00 +007E +7F02 +1002 +2204 +7E08 +0210 +0000 +0000 +ENDCHAR +STARTCHAR U+9713 +ENCODING 38675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0300 +1CF0 +1EF0 +1010 +1FF0 +0284 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+9716 +ENCODING 38678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +2108 +5D70 +1D70 +0820 +7FFC +1C70 +1A70 +2AA8 +4924 +0820 +0000 +ENDCHAR +STARTCHAR U+9718 +ENCODING 38680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +4489 +5AB5 +0000 +33FE +0A02 +42FA +3202 +02FA +0A8A +12FA +6202 +0000 +0000 +ENDCHAR +STARTCHAR U+9719 +ENCODING 38681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0440 +7FFC +0540 +0FE0 +0920 +7FFC +06C0 +3838 +0000 +ENDCHAR +STARTCHAR U+971A +ENCODING 38682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFE +1FFE +169E +1FF8 +0FF8 +0360 +0E7E +1FCC +0FB8 +0E38 +1C38 +144C +0D86 +0000 +ENDCHAR +STARTCHAR U+971B +ENCODING 38683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +1FFC +1FFE +369E +2EB8 +0C88 +1FFE +0442 +3DDE +3712 +2FFE +0C46 +0CC6 +19CC +118C +0000 +ENDCHAR +STARTCHAR U+971C +ENCODING 38684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +3D78 +5D70 +0000 +08F8 +7F88 +1CF8 +1AF8 +2988 +48F8 +0888 +0000 +ENDCHAR +STARTCHAR U+971D +ENCODING 38685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +5089 +4891 +44A1 +4891 +0000 +39CE +294A +294A +294A +294A +39CE +0000 +0000 +ENDCHAR +STARTCHAR U+971E +ENCODING 38686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0100 +3EF8 +2208 +3EF8 +3DF8 +2050 +3C70 +218C +0000 +ENDCHAR +STARTCHAR U+971F +ENCODING 38687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +4489 +4A95 +51A3 +2000 +1090 +47FE +2090 +07FE +0800 +1088 +6306 +0000 +0000 +ENDCHAR +STARTCHAR U+9720 +ENCODING 38688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +0080 +3FFF +2889 +4492 +0808 +0018 +0824 +3E42 +14BD +1400 +147E +7F04 +0008 +0000 +0000 +ENDCHAR +STARTCHAR U+9721 +ENCODING 38689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0006 +3FFE +1FFE +2EBE +26F8 +1CB8 +3C60 +3420 +3CE0 +3C64 +3DF8 +34B8 +252C +4C66 +0020 +ENDCHAR +STARTCHAR U+9722 +ENCODING 38690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +0004 +3EF8 +2282 +3EBC +22A0 +3EAA +22AB +232E +4649 +0000 +0000 +ENDCHAR +STARTCHAR U+9723 +ENCODING 38691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +0FF8 +0808 +0FF8 +1FFC +1004 +1FF4 +1FF4 +1FFC +3006 +0000 +0000 +ENDCHAR +STARTCHAR U+9724 +ENCODING 38692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +1EF8 +1248 +3D98 +0FE0 +0FE0 +0920 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+9725 +ENCODING 38693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +4891 +0488 +3FFF +2FF9 +5FFE +0140 +1EAC +0170 +1EA8 +3F27 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+9726 +ENCODING 38694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +1041 +1042 +7DF4 +1049 +38E2 +5554 +1049 +1042 +1044 +0000 +0000 +ENDCHAR +STARTCHAR U+9727 +ENCODING 38695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0140 +3E7C +14D0 +7F70 +1BAC +2CF8 +4848 +1998 +0000 +ENDCHAR +STARTCHAR U+9728 +ENCODING 38696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +3FC2 +2042 +3FC2 +2FBF +2012 +3FCA +2A82 +5242 +060E +0000 +0000 +ENDCHAR +STARTCHAR U+9729 +ENCODING 38697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +047F +7F91 +3F92 +2094 +3F92 +1F11 +0211 +7FD5 +0412 +0C10 +0000 +0000 +ENDCHAR +STARTCHAR U+972A +ENCODING 38698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +1018 +0BF0 +464C +21F0 +0FFC +1040 +23F8 +2000 +0000 +ENDCHAR +STARTCHAR U+972B +ENCODING 38699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +4489 +3F7E +1122 +0912 +1224 +1FFC +1084 +1FFC +1084 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+972C +ENCODING 38700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +1FFC +1084 +1FFC +1084 +1FFC +0410 +3FFE +0410 +7FFF +180C +0000 +0000 +ENDCHAR +STARTCHAR U+972D +ENCODING 38701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0100 +7FFE +5112 +8D64 +1110 +23F8 +1288 +0248 +F3F8 +1100 +13FC +1C44 +12A4 +1BF4 +1008 +ENDCHAR +STARTCHAR U+972E +ENCODING 38702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4889 +1084 +41FE +3084 +10FC +40FC +2084 +0BFF +1110 +6128 +21FE +0000 +0000 +ENDCHAR +STARTCHAR U+972F +ENCODING 38703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4891 +1F48 +0232 +2414 +1BE8 +1004 +27F2 +0410 +07F0 +0220 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+9730 +ENCODING 38704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +3F40 +147C +7F90 +1F50 +1E20 +1E30 +12C8 +1704 +0000 +ENDCHAR +STARTCHAR U+9731 +ENCODING 38705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FF8 +3FFC +7D7C +5968 +1FE0 +01C8 +3FF8 +1F10 +0300 +3FF8 +3EF8 +37D8 +36D8 +34D8 +0010 +ENDCHAR +STARTCHAR U+9732 +ENCODING 38706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0100 +3FFC +3D78 +5D70 +0100 +3E78 +23D0 +3E70 +0FFC +2888 +2EF8 +7088 +0000 +ENDCHAR +STARTCHAR U+9733 +ENCODING 38707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3FFC +13FC +3FBC +27F0 +1810 +3E88 +35F8 +3B70 +34FC +37F8 +35F8 +3D30 +3420 +31FC +0000 +ENDCHAR +STARTCHAR U+9735 +ENCODING 38709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4889 +3E10 +2214 +3E12 +7F7F +2210 +3E11 +3E12 +220D +7F8D +0213 +0000 +0000 +ENDCHAR +STARTCHAR U+9738 +ENCODING 38712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3DE8 +4F70 +1500 +7FF8 +1488 +3EF8 +2A88 +3EF8 +7F88 +0918 +0000 +ENDCHAR +STARTCHAR U+9739 +ENCODING 38713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +1E20 +12F8 +1E50 +11FC +3E20 +53FC +1E20 +1020 +0000 +ENDCHAR +STARTCHAR U+973A +ENCODING 38714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4889 +4491 +1008 +22AF +4BEA +1012 +33E2 +500A +1144 +126A +1451 +0000 +0000 +ENDCHAR +STARTCHAR U+973D +ENCODING 38717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0100 +7FFC +3EF8 +1550 +6D7C +07E0 +0FE0 +3020 +0000 +ENDCHAR +STARTCHAR U+973E +ENCODING 38718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +0DF0 +7950 +2FF0 +79F0 +35F8 +1C40 +67FC +1800 +0000 +ENDCHAR +STARTCHAR U+973F +ENCODING 38719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +4889 +4491 +3E7D +15A8 +0810 +7F28 +197C +28FE +4844 +087C +187C +0000 +0000 +ENDCHAR +STARTCHAR U+9741 +ENCODING 38721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3FF0 +3FFC +4D3C +4560 +1010 +1FF0 +1B30 +1B30 +1FF0 +5000 +7EFC +7FB4 +5FB4 +7FFC +0004 +ENDCHAR +STARTCHAR U+9742 +ENCODING 38722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +3FFC +2E70 +3FFC +2E70 +35A8 +24F0 +2480 +5FFC +0000 +ENDCHAR +STARTCHAR U+9743 +ENCODING 38723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +7FFF +4889 +4491 +2414 +7F3F +2464 +3F3F +2424 +3F3F +2424 +3F3F +2020 +0000 +0000 +ENDCHAR +STARTCHAR U+9744 +ENCODING 38724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +1CF8 +7F88 +1CF8 +1CF8 +3E7C +23D4 +3EFC +2298 +0000 +ENDCHAR +STARTCHAR U+9746 +ENCODING 38726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F10 +08F8 +3E98 +2A7C +7F18 +3EF8 +08D4 +3C38 +01B8 +7ED4 +1494 +3EF0 +433C +0000 +ENDCHAR +STARTCHAR U+9747 +ENCODING 38727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +4889 +4491 +087C +7F40 +227E +7F02 +3E7E +3E49 +2252 +3E65 +467F +0000 +0000 +ENDCHAR +STARTCHAR U+9748 +ENCODING 38728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0100 +3FFC +3D78 +5D70 +3BB8 +2AA8 +3BB8 +3FF8 +0930 +3548 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+9749 +ENCODING 38729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000C +3EF4 +08A8 +3E50 +2BFC +7F28 +3ED8 +08F4 +3D44 +0078 +7EC8 +1530 +1E70 +638C +0000 +ENDCHAR +STARTCHAR U+974A +ENCODING 38730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +0080 +7FFF +4081 +5CB9 +060C +2490 +2EBA +2492 +2EBA +2492 +7FFF +0808 +0FF8 +0410 +7FFF +ENDCHAR +STARTCHAR U+974B +ENCODING 38731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +0080 +3FFE +32CA +29A6 +27FF +17DF +4D04 +27DF +178E +0555 +149E +2890 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+974E +ENCODING 38734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +0080 +7FFF +4081 +5CB9 +068C +0C20 +127C +2144 +5E7C +0844 +3F7F +0940 +2A7F +2F55 +7892 +ENDCHAR +STARTCHAR U+974F +ENCODING 38735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +0080 +7FFF +4081 +5CB9 +068C +0810 +3FBE +2AA2 +143E +3FA2 +543F +1F20 +143F +1FD5 +1052 +ENDCHAR +STARTCHAR U+9751 +ENCODING 38737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFE +0080 +1FFC +0080 +7FFF +0000 +1FFC +1084 +1084 +1FFC +1004 +1004 +1004 +100C +ENDCHAR +STARTCHAR U+9752 +ENCODING 38738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FF8 +0100 +1FF0 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+9753 +ENCODING 38739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1408 +FEFC +1088 +7CA8 +10A8 +FEA8 +00A8 +7CA8 +44A8 +7CA8 +4450 +7C52 +4492 +550E +4A00 +ENDCHAR +STARTCHAR U+9755 +ENCODING 38741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0010 +007E +7FFC +087C +087E +2FFE +2E7C +2844 +287C +2B7C +3E74 +7044 +404C +0044 +0000 +ENDCHAR +STARTCHAR U+9756 +ENCODING 38742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +09FC +0820 +08F8 +7E20 +05FC +2400 +14F8 +1488 +08F8 +0E88 +70F8 +0088 +0098 +0000 +ENDCHAR +STARTCHAR U+9757 +ENCODING 38743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1830 +7E36 +08F6 +3EFC +0878 +7FFF +2078 +7E78 +6258 +7E58 +6258 +62D8 +629A +671E +000E +ENDCHAR +STARTCHAR U+9758 +ENCODING 38744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7FC8 +040F +7FD2 +0404 +7FDF +0015 +3F95 +2095 +3F95 +209F +3F90 +2091 +419F +0000 +0000 +ENDCHAR +STARTCHAR U+9759 +ENCODING 38745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +7F40 +0878 +3E90 +0920 +7FF8 +0028 +3FFC +2228 +3EF8 +2228 +3E20 +2220 +2660 +0000 +ENDCHAR +STARTCHAR U+975A +ENCODING 38746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087C +7F44 +0844 +3E7C +0844 +7F44 +3E7C +2244 +3E44 +227C +3E28 +2249 +2A89 +2507 +0000 +0000 +ENDCHAR +STARTCHAR U+975B +ENCODING 38747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +7C20 +11FE +7D02 +1204 +FFFE +0420 +7E20 +44A8 +7CBC +44A0 +7CA0 +44A0 +4560 +5626 +481C +ENDCHAR +STARTCHAR U+975C +ENCODING 38748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08F0 +7FA8 +08A4 +3F04 +08F8 +7F28 +3FFC +2A28 +2AF8 +3E28 +2220 +2220 +2660 +0000 +ENDCHAR +STARTCHAR U+975E +ENCODING 38750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +0240 +0240 +3E7C +0240 +0240 +3E7C +0240 +0240 +7E7C +0440 +0440 +0840 +1040 +0000 +ENDCHAR +STARTCHAR U+9760 +ENCODING 38752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0900 +0FF0 +1100 +7FFC +0FE0 +0820 +0FE0 +7EFC +0280 +3EF8 +0380 +7CFC +0C80 +3080 +0000 +ENDCHAR +STARTCHAR U+9761 +ENCODING 38753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1210 +1FFC +1738 +17BC +1AD4 +1140 +1F7C +1F78 +21C0 +3F7C +4240 +0C40 +0000 +ENDCHAR +STARTCHAR U+9762 +ENCODING 38754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0200 +3FF8 +2448 +2448 +27C8 +2448 +27C8 +2448 +2448 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+9763 +ENCODING 38755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +0380 +0300 +1FFC +1FFC +102C +17EC +162C +162C +17EC +17EC +100C +1FFC +1004 +0000 +ENDCHAR +STARTCHAR U+9764 +ENCODING 38756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7FC0 +0840 +1078 +3F88 +2BF8 +2B58 +2F58 +2B78 +2F50 +2B40 +2B44 +3F44 +213C +0000 +ENDCHAR +STARTCHAR U+9765 +ENCODING 38757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +20A0 +2FFC +2140 +2630 +380E +2FFC +2080 +2FFC +2924 +29E4 +4924 +49E4 +8924 +0FFC +ENDCHAR +STARTCHAR U+9766 +ENCODING 38758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +0848 +0848 +3FF8 +2AC8 +2AF8 +2EC8 +2AF8 +2EB0 +2AB0 +2AD4 +3FD4 +208C +0000 +ENDCHAR +STARTCHAR U+9767 +ENCODING 38759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0012 +0EFE +0896 +10FE +7FFE +7700 +77FE +77FE +7786 +7FFE +77FE +77E4 +7F6C +4186 +0002 +ENDCHAR +STARTCHAR U+9768 +ENCODING 38760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1718 +1714 +1FFC +2F90 +4FA8 +09C4 +7FFC +1FF0 +1390 +1390 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+9769 +ENCODING 38761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +07C0 +0100 +1FF0 +1110 +1FF0 +0100 +7FFC +0100 +0100 +0100 +0000 +ENDCHAR +STARTCHAR U+976A +ENCODING 38762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +2202 +7F7F +2208 +3E08 +0808 +7F08 +4908 +4908 +7F08 +0808 +7F08 +0828 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+976B +ENCODING 38763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +15F8 +7EC8 +14A8 +1CA8 +0848 +3E50 +2A50 +3E20 +0820 +7F50 +0890 +0908 +0A04 +0000 +ENDCHAR +STARTCHAR U+976C +ENCODING 38764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +7F3E +2208 +2208 +3E08 +0808 +7F7F +4908 +7F08 +0808 +7F08 +0808 +0808 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+976D +ENCODING 38765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +15F8 +7F48 +1448 +1C48 +08C8 +3E68 +2A58 +3E48 +0848 +7F88 +0888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+976E +ENCODING 38766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +7F20 +223F +2221 +3E41 +0801 +7F21 +4911 +7F09 +0801 +7F01 +0801 +080A +0804 +0000 +0000 +ENDCHAR +STARTCHAR U+9770 +ENCODING 38768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +7F00 +22FF +3E24 +0824 +7F24 +4924 +4924 +7F24 +0824 +7F24 +0825 +0845 +0887 +0000 +0000 +ENDCHAR +STARTCHAR U+9771 +ENCODING 38769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +15F8 +7E48 +1448 +1D48 +08C8 +3E48 +2A68 +3E58 +084C +7FC8 +0888 +0908 +0A30 +0000 +ENDCHAR +STARTCHAR U+9772 +ENCODING 38770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2210 +7F28 +2244 +3E82 +0939 +3E00 +2A00 +2AFE +3E02 +0802 +7F04 +0808 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+9773 +ENCODING 38771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2202 +2206 +FFF8 +2240 +3E40 +0844 +7F7E +4948 +4948 +7F48 +0848 +FFC8 +0848 +0888 +0908 +0808 +ENDCHAR +STARTCHAR U+9774 +ENCODING 38772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1460 +1460 +7F60 +14A4 +1CA4 +09A8 +3EB0 +2AA0 +3EA0 +08A0 +7FA0 +08A4 +08A4 +089C +0000 +ENDCHAR +STARTCHAR U+9776 +ENCODING 38774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2800 +2804 +FFFE +2924 +3924 +1124 +7D24 +55FC +5504 +7D00 +1100 +FF00 +1102 +1102 +10FE +1000 +ENDCHAR +STARTCHAR U+9777 +ENCODING 38775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2201 +22F9 +7F09 +2209 +3E09 +2A79 +0841 +7F81 +49F9 +4909 +7F09 +0809 +0809 +7F09 +0809 +0831 +ENDCHAR +STARTCHAR U+9778 +ENCODING 38776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +227E +7F42 +2242 +3E44 +0848 +7F5F +4941 +4951 +7F4A +0844 +7F4A +0891 +0821 +0000 +0000 +ENDCHAR +STARTCHAR U+9779 +ENCODING 38777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +14C0 +1440 +7F40 +15F8 +1D48 +0948 +3F68 +2B98 +3F98 +0908 +7F08 +0908 +0908 +0918 +0000 +ENDCHAR +STARTCHAR U+977A +ENCODING 38778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +1420 +7F20 +15FC +1C20 +0820 +3EF8 +2A70 +3E70 +08A8 +7F24 +0820 +0820 +0820 +0000 +ENDCHAR +STARTCHAR U+977B +ENCODING 38779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +223E +7F22 +2222 +3E22 +083E +7F22 +4922 +4922 +7F3E +0822 +7F22 +0822 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+977C +ENCODING 38780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +14F8 +7F88 +1488 +1C88 +08F8 +3E88 +2A88 +3E88 +08F8 +7F88 +0800 +0BFC +0800 +0000 +ENDCHAR +STARTCHAR U+977D +ENCODING 38781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2249 +7F49 +2249 +3E2A +0808 +7F7F +4908 +4908 +7F7F +0808 +7F08 +0808 +0808 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+977E +ENCODING 38782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2240 +2252 +7F52 +2252 +3EFF +0852 +7F52 +4952 +4952 +7F5E +0840 +7F40 +0840 +087F +0000 +0000 +ENDCHAR +STARTCHAR U+977F +ENCODING 38783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2808 +2808 +7C08 +289F +3889 +1089 +7D29 +55E9 +7C49 +10A9 +7DE9 +1011 +1021 +100E +0000 +0000 +ENDCHAR +STARTCHAR U+9780 +ENCODING 38784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +227F +2211 +7F11 +2211 +3E11 +0821 +7F4E +4900 +497F +7F41 +0841 +7F41 +087F +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+9781 +ENCODING 38785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +1420 +7FFC +14A8 +1CB0 +08A0 +3EF8 +2AC8 +3EC8 +08B0 +7F30 +0950 +0A88 +0904 +0000 +ENDCHAR +STARTCHAR U+9782 +ENCODING 38786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2201 +7F7E +2208 +3E08 +0808 +7F7F +4908 +4908 +7F1C +082A +7F49 +0808 +0808 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+9783 +ENCODING 38787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +29C0 +2844 +7C44 +2844 +39C4 +1104 +7D04 +55C4 +7C44 +1048 +7C51 +107F +1041 +1180 +0000 +0000 +ENDCHAR +STARTCHAR U+9784 +ENCODING 38788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +1440 +7FF8 +1488 +1DE8 +0828 +3E28 +2AE8 +3EB0 +0880 +7F80 +0884 +0884 +087C +0000 +ENDCHAR +STARTCHAR U+9785 +ENCODING 38789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +1420 +7F20 +14F8 +1CA8 +08A8 +3EA8 +2BFC +3E20 +0860 +7F50 +0890 +0908 +0A04 +0000 +ENDCHAR +STARTCHAR U+9786 +ENCODING 38790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +15FC +7E40 +1440 +1DF8 +0948 +3F48 +2B68 +3F98 +0998 +7F08 +0908 +0908 +0918 +0000 +ENDCHAR +STARTCHAR U+9788 +ENCODING 38792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +7F14 +2222 +3E41 +0800 +7F3E +4900 +7F00 +087F +0841 +7F41 +0841 +087F +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+9789 +ENCODING 38793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +3450 +3E50 +3452 +3DD6 +08D8 +3E50 +2ED8 +3FD6 +3FD6 +18D0 +3E92 +091E +080E +0000 +ENDCHAR +STARTCHAR U+978A +ENCODING 38794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +7F08 +2208 +3E7F +0808 +7F08 +497F +7F00 +087F +0841 +7F41 +0841 +087F +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+978B +ENCODING 38795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +1420 +7FF8 +1420 +1C20 +09FC +3E20 +2A20 +3EF8 +0820 +7F20 +0820 +09FC +0800 +0000 +ENDCHAR +STARTCHAR U+978D +ENCODING 38797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +1420 +7FFC +1488 +1D20 +0820 +3FFC +2A48 +3E48 +08F0 +7E90 +0828 +0844 +0984 +0000 +ENDCHAR +STARTCHAR U+978E +ENCODING 38798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +7F7F +2241 +3E7F +0841 +7F7F +4941 +7F52 +0854 +0848 +7F44 +0842 +0859 +08E0 +0000 +0000 +ENDCHAR +STARTCHAR U+978F +ENCODING 38799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF0 +0990 +0954 +0F54 +720C +0440 +7FFC +07C0 +0FE0 +0920 +0FE0 +7FFC +0100 +0000 +ENDCHAR +STARTCHAR U+9790 +ENCODING 38800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +1440 +7F78 +1440 +1C40 +09FC +3E00 +2BFC +3E60 +0850 +7F50 +0840 +0840 +0840 +0000 +ENDCHAR +STARTCHAR U+9791 +ENCODING 38801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2810 +2810 +FE10 +2910 +397C +1010 +7F10 +5510 +5528 +7D28 +1124 +FD44 +1100 +1286 +147C +1000 +ENDCHAR +STARTCHAR U+9792 +ENCODING 38802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +281C +29E0 +FE20 +2824 +3BFE +1050 +7C88 +5506 +5688 +7C88 +1088 +FE88 +1088 +1088 +1108 +1208 +ENDCHAR +STARTCHAR U+9794 +ENCODING 38804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2840 +2840 +FE78 +2890 +3924 +13FE +7D24 +5524 +5524 +7DFC +1050 +FE50 +1090 +1092 +1112 +120E +ENDCHAR +STARTCHAR U+9795 +ENCODING 38805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +141C +15F8 +7F28 +75F8 +1DA8 +0BF8 +3EA8 +2EF8 +3DE0 +2EC0 +7C60 +0890 +0B0E +0A00 +0000 +ENDCHAR +STARTCHAR U+9796 +ENCODING 38806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2418 +34F0 +7F08 +75A8 +3CB0 +1EC0 +7E50 +6FFE +7F90 +1EB0 +78E0 +08F0 +1998 +0E04 +0000 +ENDCHAR +STARTCHAR U+9797 +ENCODING 38807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +08FE +1128 +3010 +5428 +146C +14FE +1529 +1438 +14FE +1492 +14FE +11FF +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+9798 +ENCODING 38808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +1524 +7FA4 +14A8 +1C20 +08F8 +3E88 +2AF8 +3E88 +08F8 +7F88 +0888 +0888 +0898 +0000 +ENDCHAR +STARTCHAR U+9799 +ENCODING 38809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +227E +2242 +7F7E +2200 +3E7E +0842 +7F7E +4942 +7F7E +0842 +7F42 +0842 +0842 +0886 +0000 +0000 +ENDCHAR +STARTCHAR U+979A +ENCODING 38810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2208 +7F7F +2255 +3E95 +0814 +7F63 +4900 +7F7E +0808 +7F08 +0808 +0808 +08FF +0000 +0000 +ENDCHAR +STARTCHAR U+979C +ENCODING 38812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +1424 +7FF8 +1470 +1CA8 +0924 +3E60 +2AF8 +3E88 +08F8 +7F88 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+979D +ENCODING 38813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2291 +7F52 +2234 +3E10 +08FF +7F81 +49BD +7FA5 +08A5 +7FBD +0881 +0881 +0881 +0000 +0000 +ENDCHAR +STARTCHAR U+979E +ENCODING 38814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2240 +22FE +7F92 +22FE +3E92 +08FE +7F10 +4928 +7F48 +08FF +7F08 +0808 +0808 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+979F +ENCODING 38815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1610 +3636 +3F00 +14CC +1CCC +3EFC +3ECC +2AFC +3E18 +2A30 +1AFE +1820 +1820 +1860 +0020 +ENDCHAR +STARTCHAR U+97A0 +ENCODING 38816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1480 +1480 +7FF8 +14C8 +1D58 +0B58 +3EE8 +2BF8 +3EE8 +08D8 +7F58 +0A48 +0848 +0830 +0000 +ENDCHAR +STARTCHAR U+97A1 +ENCODING 38817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2200 +2248 +7F44 +225F +3EEA +084A +7F4A +496A +7F4A +08CA +7F4A +084A +084A +08DF +0000 +0000 +ENDCHAR +STARTCHAR U+97A2 +ENCODING 38818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +28A4 +7CA4 +29FF +38A4 +10BC +7C80 +54FF +7C10 +11FF +7C54 +1092 +1111 +1010 +1010 +0000 +0000 +ENDCHAR +STARTCHAR U+97A3 +ENCODING 38819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +15F8 +7E50 +1420 +1DFC +0868 +3EB0 +2B60 +3E20 +09FC +7F70 +08A8 +0924 +0820 +0000 +ENDCHAR +STARTCHAR U+97A4 +ENCODING 38820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +3FBF +7FD2 +3F8A +7FC6 +0410 +3FFF +0410 +07F0 +1FFC +1084 +1FFC +7FFF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+97A5 +ENCODING 38821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2218 +2224 +7F42 +22BD +3E00 +087E +7F42 +497E +7F24 +08FF +7F24 +0824 +0824 +0844 +0000 +0000 +ENDCHAR +STARTCHAR U+97A6 +ENCODING 38822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2850 +2890 +7F90 +2894 +38B4 +13F4 +7CB8 +55D0 +7DD0 +12E8 +7EA8 +14A8 +10C4 +1084 +0000 +ENDCHAR +STARTCHAR U+97A8 +ENCODING 38824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +14F8 +7E88 +14F8 +1C88 +08F8 +3E40 +2AFC +3FA4 +08B4 +7ECC +08FC +0884 +0818 +0000 +ENDCHAR +STARTCHAR U+97AA +ENCODING 38826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F20 +0A3F +0442 +7F94 +1508 +2477 +7FFF +0410 +07F0 +1FFC +1084 +1FFC +7FFF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+97AB +ENCODING 38827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1480 +7F80 +14F8 +1D08 +0BE8 +3FF8 +2A08 +2AE8 +3EE8 +0808 +7FE8 +08A8 +08E8 +0830 +0000 +ENDCHAR +STARTCHAR U+97AC +ENCODING 38828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2808 +2808 +7FBE +288A +397F +120A +7D3E +5488 +7CBE +1088 +7EBE +1108 +1288 +107F +0000 +0000 +ENDCHAR +STARTCHAR U+97AD +ENCODING 38829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2880 +28FC +7C90 +297C +3954 +137C +7D54 +557C +5554 +7D50 +1120 +7D30 +1148 +1184 +0000 +ENDCHAR +STARTCHAR U+97AE +ENCODING 38830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +287C +2844 +7C7C +2844 +387C +1044 +7C00 +55FF +7C10 +1050 +7C5E +1050 +10B0 +111F +0000 +0000 +ENDCHAR +STARTCHAR U+97AF +ENCODING 38831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2890 +2890 +FFFC +2890 +3844 +13FE +7C80 +54FC +5508 +7F10 +11FE +FF10 +1110 +1110 +1150 +1120 +ENDCHAR +STARTCHAR U+97B1 +ENCODING 38833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0404 +343C +3EC0 +3426 +3CB4 +1894 +7EE0 +7FFE +7F06 +7F06 +19FE +7F06 +1906 +19FE +1000 +ENDCHAR +STARTCHAR U+97B2 +ENCODING 38834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2888 +2888 +FFFE +2888 +39FC +1088 +7FFE +5420 +55FC +7D24 +11FC +FD24 +13FE +1104 +1114 +1108 +ENDCHAR +STARTCHAR U+97B3 +ENCODING 38835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1450 +1450 +7FFC +1450 +1C20 +0850 +3E88 +2BFC +3E00 +08F8 +7F88 +0888 +08F8 +0888 +0000 +ENDCHAR +STARTCHAR U+97B4 +ENCODING 38836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2890 +2890 +7FFC +2890 +39FC +1100 +7DF8 +55A8 +7DF8 +11A8 +7EF8 +12A8 +14A8 +1098 +0000 +ENDCHAR +STARTCHAR U+97B5 +ENCODING 38837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +041C +347C +3EB6 +34DC +3C78 +1858 +7EF0 +3E4C +3EFC +3EB0 +19F6 +7E70 +184C +18C6 +1086 +ENDCHAR +STARTCHAR U+97B6 +ENCODING 38838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +103C +3E25 +2AC7 +7F38 +2A10 +226C +0410 +3FFE +07F0 +1FFC +1084 +1FFC +7FFF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+97B7 +ENCODING 38839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +07F0 +07F0 +3FFE +2222 +2FFA +0490 +3FFE +07F0 +1FFC +1084 +1FFC +7FFF +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+97B8 +ENCODING 38840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +273E +2F66 +7FFE +2D66 +3FFE +19A8 +7FFE +74A8 +77AE +7C20 +102C +7E20 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+97B9 +ENCODING 38841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +284F +29F5 +7C05 +29F5 +3916 +11F5 +7C05 +54F5 +7C25 +1045 +7DF6 +1044 +1044 +10C4 +0000 +0000 +ENDCHAR +STARTCHAR U+97BA +ENCODING 38842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3434 +3EFC +3C72 +3DFE +3D00 +3DFC +7E84 +548C +7CFC +1430 +1EFE +1830 +1030 +11FF +0000 +ENDCHAR +STARTCHAR U+97BB +ENCODING 38843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2810 +28FE +7C92 +29FF +3892 +10FE +7CFE +5492 +7CFE +1054 +7DFF +1028 +1010 +11EF +0000 +0000 +ENDCHAR +STARTCHAR U+97BC +ENCODING 38844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1430 +14FC +3EB4 +14FC +1CB4 +19FE +3EFC +2A84 +3EFC +28FC +1A84 +18DC +08CC +0986 +0000 +ENDCHAR +STARTCHAR U+97BE +ENCODING 38846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +34C8 +35FE +3EC8 +34CE +3DBC +1DAC +7FFE +7FAC +7FFE +3C20 +1A20 +183E +1820 +1820 +0020 +ENDCHAR +STARTCHAR U+97BF +ENCODING 38847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2800 +2924 +7E68 +2BBE +3924 +12AA +7FBE +5422 +7FFF +1122 +7D14 +1288 +1455 +1023 +0000 +0000 +ENDCHAR +STARTCHAR U+97C1 +ENCODING 38849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2400 +25FF +7EFE +2492 +3CFE +1092 +7EFE +53FF +7EFE +1092 +7EFE +1092 +10FE +11FF +0000 +0000 +ENDCHAR +STARTCHAR U+97C3 +ENCODING 38851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2A20 +2920 +7DF8 +2820 +3AFC +1150 +7DFC +5420 +7FF8 +1120 +7DFC +1120 +12A0 +147C +0000 +ENDCHAR +STARTCHAR U+97C4 +ENCODING 38852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2482 +7FFF +2482 +3C50 +08FF +3F88 +2AFE +2AFE +2A88 +3EFF +087E +7E24 +0818 +09E7 +0000 +0000 +ENDCHAR +STARTCHAR U+97C5 +ENCODING 38853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +247E +7E42 +247E +3C42 +087E +7E42 +4AA5 +4AEF +7E42 +08A5 +7EEF +0800 +08A5 +08A5 +0000 +0000 +ENDCHAR +STARTCHAR U+97C6 +ENCODING 38854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2A00 +29FC +7D30 +28FC +3AB4 +11FC +7D20 +54FC +7F78 +11D4 +7D70 +1148 +12B8 +147C +0000 +ENDCHAR +STARTCHAR U+97C7 +ENCODING 38855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2810 +28FE +7C10 +28FE +39FF +1129 +7DFF +54FE +7C82 +10FE +7CFE +1082 +10FE +1101 +0000 +0000 +ENDCHAR +STARTCHAR U+97C8 +ENCODING 38856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +28A0 +2FFC +7CA0 +2BF8 +3AA8 +13F8 +7C48 +57FC +7E48 +1328 +7EB0 +1294 +142C +1444 +0000 +ENDCHAR +STARTCHAR U+97C9 +ENCODING 38857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2844 +29EF +7C54 +29FF +3928 +11FF +7D29 +55FF +5540 +7D7E +1140 +7D7F +1155 +1257 +0000 +0000 +ENDCHAR +STARTCHAR U+97CA +ENCODING 38858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0448 +34FE +3E4A +35FE +3DFE +19FE +3FB6 +3FFE +3FFE +3DFE +19FE +3F76 +19AE +1926 +0000 +ENDCHAR +STARTCHAR U+97CB +ENCODING 38859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FE0 +0220 +7FFC +0000 +0FE0 +0820 +0FE0 +0040 +0FF8 +0840 +7FFC +0040 +0040 +0000 +ENDCHAR +STARTCHAR U+97CC +ENCODING 38860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +3F7F +0909 +7F89 +0009 +1F49 +1129 +1F19 +0409 +3F89 +2409 +3F89 +0411 +0422 +0000 +0000 +ENDCHAR +STARTCHAR U+97CD +ENCODING 38861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1022 +7E21 +12FF +7E20 +0020 +7E24 +4244 +7E84 +0824 +7E28 +4810 +7E28 +0844 +0983 +0000 +0000 +ENDCHAR +STARTCHAR U+97CE +ENCODING 38862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +7E10 +13FF +7E10 +0010 +7EFE +4210 +7E10 +0838 +7E54 +4892 +7E10 +0810 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+97CF +ENCODING 38863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0490 +1FFC +0100 +3FFE +0490 +0BE8 +10A4 +27F2 +03E0 +03E0 +07F0 +0480 +0FF8 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+97D0 +ENCODING 38864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +3F94 +04A2 +3FC1 +0000 +3F9C +2080 +3F80 +043E +3FA2 +2422 +7FA2 +043E +0422 +0000 +0000 +ENDCHAR +STARTCHAR U+97D1 +ENCODING 38865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0820 +2A78 +3EF8 +1DFE +0BF8 +7EF8 +1CF8 +1CFC +1DFE +2DFC +2C26 +4426 +47FE +0000 +ENDCHAR +STARTCHAR U+97D3 +ENCODING 38867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +7E28 +09FC +3E00 +22F8 +3E88 +22F8 +3E10 +08F8 +7E90 +09FC +0810 +0810 +0000 +ENDCHAR +STARTCHAR U+97D4 +ENCODING 38868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FE +3E40 +0A7C +7F40 +007C +3E40 +23FF +3E40 +0849 +3E4A +284C +7F44 +0862 +08C1 +0000 +0000 +ENDCHAR +STARTCHAR U+97D5 +ENCODING 38869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3DFF +1400 +7EFE +0082 +3CFE +2400 +3C7C +0808 +7E10 +29FF +7E10 +0810 +0830 +0000 +0000 +ENDCHAR +STARTCHAR U+97D6 +ENCODING 38870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +3E08 +0A50 +7FFF +0032 +3EC8 +2238 +3E10 +09FF +3E38 +2854 +7F92 +0810 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+97D7 +ENCODING 38871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FF +3E89 +0A7E +7F08 +007E +3E4A +227E +3E4A +087E +3E08 +28FF +7F08 +0808 +0808 +0000 +0000 +ENDCHAR +STARTCHAR U+97D8 +ENCODING 38872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0854 +3E54 +0AFF +7F54 +005C +3E40 +227E +3E10 +09FF +3E38 +2854 +7F92 +0810 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+97D9 +ENCODING 38873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E10 +227E +3E12 +23FF +3E7E +0042 +7F7E +0810 +2E7E +2850 +29FF +2810 +3810 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+97DB +ENCODING 38875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0A48 +0A7C +0A48 +3E5E +3E60 +22C4 +3EF6 +0EB6 +3CB6 +28B6 +3EB6 +0896 +089E +0894 +ENDCHAR +STARTCHAR U+97DC +ENCODING 38876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +3EF0 +12A8 +7FA4 +0104 +3E20 +22D8 +3E88 +0488 +3ED8 +2488 +7F88 +04F8 +0488 +0000 +ENDCHAR +STARTCHAR U+97DD +ENCODING 38877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3CFE +1444 +7EFE +0044 +3DFF +2410 +3CFE +0892 +7EFE +2892 +7FFF +0882 +088E +0000 +0000 +ENDCHAR +STARTCHAR U+97DE +ENCODING 38878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +3E7C +0A54 +7F54 +006C +3E44 +227C +3E00 +08FE +3EAA +28AA +7EAA +08AA +09FF +0000 +0000 +ENDCHAR +STARTCHAR U+97DF +ENCODING 38879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +3EFC +0A44 +7F7C +0044 +3E7C +2244 +3E10 +00FE +3E54 +2892 +7F39 +0810 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+97E0 +ENCODING 38880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +008C +1CFC +3EBC +37BC +00FC +3EA0 +26A8 +3FFE +28A8 +7E20 +29FE +3EFC +0820 +0820 +0820 +ENDCHAR +STARTCHAR U+97E1 +ENCODING 38881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3DFF +1444 +7FFF +0054 +3C54 +25FF +3C54 +09FF +3C10 +28FE +7E10 +0810 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+97E3 +ENCODING 38883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +3E55 +0A55 +7F7F +0080 +3EFF +2311 +3E7D +0855 +3E7D +2815 +7F7D +0801 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+97E4 +ENCODING 38884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +105C +3DDC +1458 +7FFE +3D54 +2574 +253C +2428 +09BC +3F20 +29FC +3FD8 +1A3A +184E +0004 +ENDCHAR +STARTCHAR U+97E5 +ENCODING 38885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3CFE +1410 +7EFE +01FF +3D29 +25FF +3CFE +0882 +7EFE +48FE +7E82 +08FE +0901 +0000 +0000 +ENDCHAR +STARTCHAR U+97E6 +ENCODING 38886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0100 +0104 +FFFE +0100 +0110 +3FF8 +0100 +0104 +7FFE +0104 +0104 +0104 +0128 +0110 +0100 +ENDCHAR +STARTCHAR U+97E7 +ENCODING 38887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +15FE +FE24 +1024 +10A4 +7CA4 +10A4 +1124 +FE24 +1224 +1244 +1A44 +1484 +1094 +1308 +ENDCHAR +STARTCHAR U+97E9 +ENCODING 38889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0A20 +FF24 +08FE +0820 +7F28 +41FC +7F20 +4120 +7FFE +0822 +0922 +FFAA +0824 +0820 +0820 +ENDCHAR +STARTCHAR U+97EA +ENCODING 38890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3E28 +22FC +3E20 +2228 +3EFC +0020 +FF24 +09FE +2824 +2F24 +2834 +3828 +4820 +8426 +03FC +ENDCHAR +STARTCHAR U+97EB +ENCODING 38891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +2208 +FA08 +23F8 +2208 +FA08 +23F8 +2000 +FBF8 +2AA8 +2AA8 +3AA8 +22A8 +2FFE +2000 +ENDCHAR +STARTCHAR U+97EC +ENCODING 38892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +203C +27C0 +FA48 +2148 +2150 +F884 +233E +2204 +FA04 +2BBC +2A04 +3A04 +2204 +23FC +2204 +ENDCHAR +STARTCHAR U+97ED +ENCODING 38893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +0240 +0240 +3E78 +0240 +0240 +3E78 +0240 +0240 +3E78 +0240 +0240 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+97EE +ENCODING 38894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +7FFC +0440 +0000 +0440 +3C78 +0440 +3C78 +0440 +3C78 +0440 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+97EF +ENCODING 38895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0638 +1FBC +0436 +0436 +3FFE +0F76 +3F16 +3FDC +0E18 +3FF8 +0FFE +3ECE +3186 +0200 +0000 +ENDCHAR +STARTCHAR U+97F0 +ENCODING 38896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0F3F +0812 +1F0C +3212 +4C21 +0220 +1E3C +0220 +1E3C +0220 +1E3C +0220 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+97F1 +ENCODING 38897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1088 +294A +4628 +7FFF +0908 +79E8 +0908 +79E8 +090A +79EC +0908 +7FF5 +0023 +0000 +0000 +ENDCHAR +STARTCHAR U+97F2 +ENCODING 38898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0288 +3D70 +1550 +2DE8 +4284 +3EF8 +0280 +1EF0 +1EF0 +0280 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+97F3 +ENCODING 38899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0820 +0440 +7FFC +0000 +0FE0 +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+97F4 +ENCODING 38900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0804 +04FC +1F30 +3E34 +16FC +1FB4 +7EB4 +02F4 +3FFC +323C +1E30 +1230 +1E30 +1A30 +0000 +ENDCHAR +STARTCHAR U+97F5 +ENCODING 38901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +7E80 +24F8 +1508 +1908 +7EE8 +0008 +3E28 +22C8 +3E08 +2208 +3E08 +2230 +0000 +ENDCHAR +STARTCHAR U+97F6 +ENCODING 38902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +7E48 +2448 +1448 +1888 +7F30 +0000 +3EF8 +2288 +3E88 +2288 +3EF8 +2288 +0000 +ENDCHAR +STARTCHAR U+97F7 +ENCODING 38903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0830 +0830 +0FB4 +3EB4 +14B4 +1FBC +7CFC +3E30 +36B4 +3FB6 +37B4 +3FB4 +3DFC +00FC +0000 +ENDCHAR +STARTCHAR U+97F8 +ENCODING 38904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +087F +7FA4 +2218 +1424 +7F53 +0010 +3EFE +2210 +22FE +3E10 +23FF +2210 +3E10 +0000 +0000 +ENDCHAR +STARTCHAR U+97F9 +ENCODING 38905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1040 +FEFC +4484 +24FC +2884 +FEFC +0000 +7CFC +4410 +7CFC +4410 +7DFE +4400 +0000 +0000 +ENDCHAR +STARTCHAR U+97FA +ENCODING 38906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +0844 +7FFF +2444 +2410 +18FE +7E92 +0092 +3DFF +2410 +3C28 +2444 +3C82 +2501 +0000 +0000 +ENDCHAR +STARTCHAR U+97FB +ENCODING 38907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7F88 +22F8 +1400 +7FF8 +0088 +3CF8 +2488 +3CF8 +2488 +24F8 +3CC8 +2704 +0000 +ENDCHAR +STARTCHAR U+97FD +ENCODING 38909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +147F +2A00 +5D22 +0414 +08FF +7F00 +143E +7F22 +5522 +633E +5D22 +4122 +7F3E +0000 +0000 +ENDCHAR +STARTCHAR U+97FE +ENCODING 38910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083C +7F25 +0847 +7F7C +3F28 +2910 +3F6F +2080 +7FFE +0410 +7FFF +1FFC +1FF4 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+97FF +ENCODING 38911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +13B8 +6AA8 +2BB8 +1FA4 +6AF8 +1360 +3FF8 +0440 +7FFC +0FE0 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+9800 +ENCODING 38912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +09FF +7F44 +2248 +14FF +1490 +7FFE +0290 +3EFE +2290 +22FF +3E80 +22FE +2244 +3E38 +23C7 +ENDCHAR +STARTCHAR U+9801 +ENCODING 38913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0100 +0200 +0FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0FE0 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+9802 +ENCODING 38914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +1040 +1080 +11F8 +1108 +11F8 +1108 +11F8 +1108 +11F8 +1090 +3308 +0C04 +0000 +ENDCHAR +STARTCHAR U+9803 +ENCODING 38915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +27FC +2040 +2080 +27F8 +3908 +21F8 +2108 +25F8 +2508 +1DF8 +0090 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+9804 +ENCODING 38916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FF +1008 +1010 +7C7E +1442 +147E +1442 +147E +1442 +1542 +157E +2524 +4742 +0081 +0000 +0000 +ENDCHAR +STARTCHAR U+9805 +ENCODING 38917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07FC +0040 +7C80 +11F8 +1108 +11F8 +1108 +15F8 +1908 +61F8 +0090 +0308 +0C04 +0000 +ENDCHAR +STARTCHAR U+9806 +ENCODING 38918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +23FC +2A20 +2A40 +2AF8 +2A88 +2AF8 +2A88 +2AF8 +2A88 +2AF8 +2230 +22C8 +4304 +0000 +ENDCHAR +STARTCHAR U+9807 +ENCODING 38919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +01FF +3E10 +0820 +08FE +0882 +7FFE +0882 +08FE +0882 +0882 +08FE +0844 +0882 +0901 +0000 +0000 +ENDCHAR +STARTCHAR U+9808 +ENCODING 38920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +17FC +2040 +4880 +09F8 +1108 +25F8 +4508 +09F8 +0908 +11F8 +2090 +4308 +0C04 +0000 +ENDCHAR +STARTCHAR U+980A +ENCODING 38922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FF +7C10 +1020 +10FE +1082 +1082 +7CFE +1082 +1082 +10FE +1C82 +6082 +00FE +0082 +0101 +ENDCHAR +STARTCHAR U+980C +ENCODING 38924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1DFC +0420 +1440 +12F8 +2288 +49F8 +0888 +08F8 +1488 +16F8 +7A50 +0088 +0304 +0000 +ENDCHAR +STARTCHAR U+980D +ENCODING 38925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F08 +0810 +087F +3E41 +027F +2241 +227F +2241 +1441 +087F +1422 +2241 +0000 +0000 +ENDCHAR +STARTCHAR U+980E +ENCODING 38926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +05FF +3810 +2020 +20FE +3F82 +24FE +2482 +24FE +2482 +24FE +4428 +0446 +0182 +0000 +0000 +ENDCHAR +STARTCHAR U+980F +ENCODING 38927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +7F40 +00F8 +1C88 +14F8 +1488 +14F8 +1588 +15F8 +2350 +2088 +4304 +0000 +ENDCHAR +STARTCHAR U+9810 +ENCODING 38928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +1220 +0C40 +08F8 +7F88 +09F8 +0A88 +0CF8 +0888 +08F8 +0850 +0888 +1B04 +0000 +ENDCHAR +STARTCHAR U+9811 +ENCODING 38929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +01FC +3E20 +0040 +00F8 +7F88 +14F8 +1488 +14F8 +1588 +23F8 +2050 +4188 +0604 +0000 +ENDCHAR +STARTCHAR U+9812 +ENCODING 38930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1C00 +05FC +1420 +1440 +12F8 +2288 +3FF8 +5288 +12F8 +1288 +12F8 +2250 +2D88 +4204 +0000 +ENDCHAR +STARTCHAR U+9813 +ENCODING 38931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0F20 +7840 +08F8 +2A88 +2AF8 +2A88 +2AF8 +3E88 +28F8 +0A50 +0A88 +0704 +0000 +ENDCHAR +STARTCHAR U+9814 +ENCODING 38932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +0830 +0820 +08FC +09C4 +69C4 +49C4 +49C4 +7FFC +49C4 +49C4 +49FC +696C +6146 +4186 +0000 +ENDCHAR +STARTCHAR U+9816 +ENCODING 38934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +4908 +4910 +2A7F +7F41 +087F +0841 +7F7F +0841 +087F +1014 +2022 +4041 +0000 +0000 +ENDCHAR +STARTCHAR U+9817 +ENCODING 38935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +3F20 +2A40 +2CF8 +2888 +3EF8 +2288 +32F8 +2C88 +24F8 +2A50 +3288 +4304 +0000 +ENDCHAR +STARTCHAR U+9818 +ENCODING 38936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1420 +1240 +22F8 +5C88 +00F8 +7E88 +12F8 +1288 +12F8 +1C50 +1088 +1304 +0000 +ENDCHAR +STARTCHAR U+9819 +ENCODING 38937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FF8 +3620 +0CFC +0888 +2AF8 +3E88 +38F8 +3898 +3AF8 +3CD0 +70C8 +408C +0104 +0000 +ENDCHAR +STARTCHAR U+981A +ENCODING 38938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0220 +3440 +0CF8 +1A88 +29F8 +4888 +3EF8 +0888 +08F8 +0E50 +7088 +0304 +0000 +ENDCHAR +STARTCHAR U+981B +ENCODING 38939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0F7F +7808 +0810 +7F7F +0841 +7F7F +0841 +1C7F +2A41 +497F +0814 +0822 +0841 +0000 +0000 +ENDCHAR +STARTCHAR U+981C +ENCODING 38940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +1408 +1312 +217F +4042 +3E42 +007E +0042 +3E7E +2242 +2242 +3E7E +2244 +0183 +0000 +0000 +ENDCHAR +STARTCHAR U+981D +ENCODING 38941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +043F +7FC4 +0008 +113F +20A1 +407F +1121 +113F +0A21 +043F +0A14 +1122 +20C1 +0000 +0000 +ENDCHAR +STARTCHAR U+981E +ENCODING 38942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F08 +4110 +417F +2241 +227F +7F41 +227F +2241 +147F +0814 +1422 +2241 +0000 +0000 +ENDCHAR +STARTCHAR U+9820 +ENCODING 38944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1F3F +2108 +4210 +3FBF +2021 +2FBF +28A1 +28BF +2BA1 +283F +2844 +484A +0FD1 +0000 +0000 +ENDCHAR +STARTCHAR U+9821 +ENCODING 38945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +7F40 +08F8 +0888 +3EF8 +0088 +3EF8 +2288 +22F8 +2250 +3E88 +2304 +0000 +ENDCHAR +STARTCHAR U+9823 +ENCODING 38947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3EFE +2830 +28E4 +3AFE +2284 +22FC +2284 +3E84 +3AFC +6884 +68CC +7EFC +0068 +00C4 +0006 +ENDCHAR +STARTCHAR U+9824 +ENCODING 38948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2420 +2440 +2EF8 +2A88 +2AF8 +2A88 +2EF8 +2488 +24F8 +2450 +3E88 +2304 +0000 +ENDCHAR +STARTCHAR U+9825 +ENCODING 38949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +5FBF +5208 +5210 +523E +5FA2 +50A2 +50BE +50A2 +5FBE +5222 +5222 +523E +5214 +5FA2 +0041 +ENDCHAR +STARTCHAR U+9826 +ENCODING 38950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +7F08 +0810 +107F +2241 +7C7F +0841 +107F +2241 +447F +0C14 +1222 +6143 +0000 +0000 +ENDCHAR +STARTCHAR U+9827 +ENCODING 38951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +107F +2010 +7E20 +427F +4241 +7E7F +4041 +407F +7E41 +427F +4214 +7E22 +4041 +0000 +0000 +ENDCHAR +STARTCHAR U+9828 +ENCODING 38952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7700 +117F +1108 +5510 +337F +1141 +337F +5541 +117F +1141 +117F +1114 +1122 +6643 +0000 +0000 +ENDCHAR +STARTCHAR U+9829 +ENCODING 38953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +113F +0A04 +3F88 +113F +1121 +113F +7FE1 +113F +1121 +113F +1114 +2122 +4143 +0000 +0000 +ENDCHAR +STARTCHAR U+982B +ENCODING 38955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +14FF +1410 +1420 +557F +3641 +147F +3641 +557F +1441 +147F +1500 +2522 +4341 +0000 +0000 +ENDCHAR +STARTCHAR U+982C +ENCODING 38956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +0820 +7F40 +0AF8 +4A88 +2CF8 +2888 +7FF8 +0C88 +12F8 +1250 +2088 +4304 +0000 +ENDCHAR +STARTCHAR U+982D +ENCODING 38957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0020 +3E40 +22F8 +2288 +3EF8 +2288 +12F8 +1488 +08F8 +0E50 +7188 +0604 +0000 +ENDCHAR +STARTCHAR U+982E +ENCODING 38958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +067F +0F98 +0F76 +1E66 +1742 +24FE +0042 +0A66 +0BE6 +0A42 +0A7E +1A76 +1226 +2243 +0000 +ENDCHAR +STARTCHAR U+982F +ENCODING 38959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +1F88 +3110 +4A3F +2C21 +183F +1021 +6921 +093F +3FA1 +0921 +093F +1112 +2121 +0000 +0000 +ENDCHAR +STARTCHAR U+9830 +ENCODING 38960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +08FF +0808 +7F10 +087E +2A42 +2A42 +2A7E +5D42 +48C2 +087E +1442 +1442 +227E +2124 +40C2 +ENDCHAR +STARTCHAR U+9832 +ENCODING 38962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +773F +1208 +2210 +423F +6FA1 +223F +2221 +223F +2FA1 +603F +3000 +2812 +47A1 +0000 +0000 +ENDCHAR +STARTCHAR U+9833 +ENCODING 38963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +047F +0418 +0F76 +0466 +0446 +3FFE +0A46 +1A46 +3B7E +2BC6 +2A7E +1266 +0626 +0042 +0000 +ENDCHAR +STARTCHAR U+9834 +ENCODING 38964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +25FC +3820 +2240 +1EF8 +0088 +3EF8 +0088 +7FF8 +0C88 +2AF8 +2A50 +4888 +1B04 +0000 +ENDCHAR +STARTCHAR U+9835 +ENCODING 38965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F80 +04BF +0488 +7FD0 +04BF +04A1 +3FBF +0821 +103F +3FA1 +50BF +1092 +1F92 +10A1 +0000 +0000 +ENDCHAR +STARTCHAR U+9837 +ENCODING 38967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1420 +1240 +3EF8 +4088 +3EF8 +0488 +08F8 +3E88 +22F8 +2250 +3E88 +2304 +0000 +ENDCHAR +STARTCHAR U+9838 +ENCODING 38968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +2A20 +2A40 +54F8 +2A88 +2AF8 +0088 +7EF8 +0888 +08F8 +0E50 +7088 +0304 +0000 +ENDCHAR +STARTCHAR U+9839 +ENCODING 38969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0600 +387F +0808 +7F10 +1C3E +2A22 +29A2 +483E +0022 +1222 +123E +1222 +1222 +23BE +2C22 +2041 +ENDCHAR +STARTCHAR U+983B +ENCODING 38971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +2E20 +2840 +28F8 +7F88 +0CF8 +2A88 +29F8 +4988 +1AF8 +0450 +1888 +6304 +0000 +ENDCHAR +STARTCHAR U+983C +ENCODING 38972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7F20 +0840 +3EF8 +2A88 +2AF8 +3E88 +1CF8 +1A88 +2AF8 +4850 +0888 +0B04 +0000 +ENDCHAR +STARTCHAR U+983D +ENCODING 38973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +3DFC +0820 +7F40 +1CF8 +2A88 +4AF8 +1C88 +14F8 +1488 +15F8 +1650 +2488 +4304 +0000 +ENDCHAR +STARTCHAR U+983E +ENCODING 38974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +05FE +0C34 +1CFE +2CFE +14FE +0CFC +30EC +0084 +0CC0 +3880 +3FFC +3880 +3C82 +78FE +201E +ENDCHAR +STARTCHAR U+9841 +ENCODING 38977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +7F10 +4120 +417E +3E42 +087E +0842 +2842 +2E7E +2842 +2842 +387E +2824 +4742 +0000 +0000 +ENDCHAR +STARTCHAR U+9843 +ENCODING 38979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +24BF +2488 +1510 +0A3F +1121 +60FF +0421 +24BF +24A1 +153F +0A00 +1112 +60E1 +0000 +0000 +ENDCHAR +STARTCHAR U+9844 +ENCODING 38980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F00 +013F +0208 +0410 +44BF +44A1 +44BF +65A1 +56BF +4EA1 +55A1 +64BF +4492 +7FA1 +0000 +0000 +ENDCHAR +STARTCHAR U+9845 +ENCODING 38981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3E3F +2004 +3F88 +20BF +3FA1 +203F +2F21 +293F +2F21 +293F +4F00 +0912 +1321 +0000 +0000 +ENDCHAR +STARTCHAR U+9846 +ENCODING 38982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2A20 +3E40 +2AF8 +3E88 +08F8 +7F88 +1CF8 +1A88 +2AF8 +4850 +0888 +0B04 +0000 +ENDCHAR +STARTCHAR U+9847 +ENCODING 38983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +08FE +0F30 +16FE +36C6 +36C6 +3FFC +49C4 +18C4 +08FC +7FC4 +08FC +08FC +086C +08C6 +0802 +ENDCHAR +STARTCHAR U+9848 +ENCODING 38984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +213F +3E08 +2090 +3FBF +0921 +123F +3C21 +08BF +7FA1 +1C3F +2A00 +4912 +0821 +0000 +0000 +ENDCHAR +STARTCHAR U+9849 +ENCODING 38985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +1408 +2210 +417E +3E42 +087E +0842 +3E42 +087E +0842 +2A42 +1C7E +0824 +7F42 +0000 +0000 +ENDCHAR +STARTCHAR U+984A +ENCODING 38986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +103F +3F08 +6110 +3F3F +2021 +3F3F +2121 +3F3F +0421 +7FA1 +043F +0412 +0421 +0000 +0000 +ENDCHAR +STARTCHAR U+984B +ENCODING 38987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2A20 +2A40 +3EF8 +2A88 +3EF8 +0888 +06F8 +3588 +31F8 +5450 +5488 +0F04 +0000 +ENDCHAR +STARTCHAR U+984C +ENCODING 38988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2220 +3EF8 +2288 +3EF8 +0088 +7FF8 +0888 +2EF8 +2850 +3888 +2D08 +43FC +0000 +ENDCHAR +STARTCHAR U+984D +ENCODING 38989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +3F20 +2940 +4EF8 +1288 +34F8 +0C88 +12F8 +3F88 +52F8 +1250 +1E88 +1304 +0000 +ENDCHAR +STARTCHAR U+984E +ENCODING 38990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +77FC +5520 +5540 +77F8 +0088 +3EF8 +0088 +7FF8 +1088 +1EF8 +2250 +0288 +0F04 +0000 +ENDCHAR +STARTCHAR U+984F +ENCODING 38991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7F20 +1440 +0CF8 +1288 +3FF8 +2488 +3AF8 +2488 +39F8 +2250 +4C88 +3304 +0000 +ENDCHAR +STARTCHAR U+9850 +ENCODING 38992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FDF +4448 +3F9F +0411 +3F91 +249F +3F91 +2491 +3F9F +0411 +7FD1 +041F +040A +0411 +0000 +0000 +ENDCHAR +STARTCHAR U+9851 +ENCODING 38993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00DF +0088 +3FDF +2091 +2E91 +209F +2EB1 +2AD1 +2E9F +2191 +2291 +2C9F +40AA +0051 +0000 +0000 +ENDCHAR +STARTCHAR U+9852 +ENCODING 38994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F9F +2488 +3F9F +2491 +3F91 +249F +0411 +7FD1 +445F +4551 +5F51 +405F +404A +40D1 +0000 +0000 +ENDCHAR +STARTCHAR U+9853 +ENCODING 38995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +24BF +2490 +3FBE +0022 +7FFE +0422 +3FBE +2AA2 +2AA2 +2ABE +2A94 +21A3 +0041 +0000 +0000 +ENDCHAR +STARTCHAR U+9854 +ENCODING 38996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7F20 +2240 +14F8 +3F88 +24F8 +2888 +32F8 +2488 +39F8 +2250 +4C88 +3304 +0000 +ENDCHAR +STARTCHAR U+9855 +ENCODING 38997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2220 +3E40 +22F8 +3E88 +14F8 +1588 +55F8 +3688 +34F8 +1650 +1888 +6304 +0000 +ENDCHAR +STARTCHAR U+9856 +ENCODING 38998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +2930 +2720 +2DFC +2DC4 +2FCC +21CC +3FC4 +31FC +14C4 +35FC +71EC +5B6C +0EC6 +0000 +0000 +ENDCHAR +STARTCHAR U+9857 +ENCODING 38999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041F +2488 +249F +3F91 +0011 +3F9F +0011 +3F91 +209F +3F91 +0011 +111F +0A0A +7FD1 +0000 +0000 +ENDCHAR +STARTCHAR U+9858 +ENCODING 39000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2210 +2420 +2F78 +2948 +2F78 +2948 +2F78 +2648 +2D78 +3530 +4448 +0D84 +0000 +ENDCHAR +STARTCHAR U+9859 +ENCODING 39001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F7F +0A08 +0410 +0A3E +3BA2 +2ABE +1122 +2ABE +0422 +7FFE +1610 +2594 +44A3 +0441 +0000 +0000 +ENDCHAR +STARTCHAR U+985A +ENCODING 39002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4700 +78FF +4108 +7F10 +007E +1F42 +5142 +5F7E +5142 +5F42 +517E +5F42 +4042 +7FFE +2242 +4181 +ENDCHAR +STARTCHAR U+985B +ENCODING 39003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7F20 +0840 +3EF8 +2288 +3EF8 +3E88 +22F8 +3E88 +7FF8 +0C50 +1288 +6304 +0000 +ENDCHAR +STARTCHAR U+985C +ENCODING 39004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +113F +3F88 +1110 +3FBF +1121 +7FFF +0421 +3FBF +24A1 +3FA1 +24BF +7FC4 +208A +2391 +0000 +0000 +ENDCHAR +STARTCHAR U+985D +ENCODING 39005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F1F +1108 +171F +1511 +7FD1 +405F +5F51 +1111 +1F1F +1111 +1F11 +111F +110A +1311 +0000 +0000 +ENDCHAR +STARTCHAR U+985E +ENCODING 39006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +4AFC +2A20 +2C40 +7FF8 +1C88 +1AF8 +2A88 +48F8 +7F88 +08F8 +1450 +2288 +4304 +0000 +ENDCHAR +STARTCHAR U+985F +ENCODING 39007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7BDF +2948 +5ADF +2951 +1691 +091F +1291 +2451 +493F +0211 +0C91 +011F +020A +1C11 +0000 +0000 +ENDCHAR +STARTCHAR U+9860 +ENCODING 39008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F9F +0A08 +3F9F +2A91 +2A91 +3F9F +0011 +1F11 +001F +7FD1 +1511 +249F +444A +0C11 +0000 +0000 +ENDCHAR +STARTCHAR U+9862 +ENCODING 39010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +111F +7FC8 +111F +1111 +1F11 +041F +7FD1 +4451 +555F +5551 +6ED1 +445F +444A +40D1 +0000 +0000 +ENDCHAR +STARTCHAR U+9863 +ENCODING 39011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +011F +0148 +3FDF +2911 +2D11 +291F +3F11 +2951 +3D5F +2991 +3F11 +2B5F +4CCA +0851 +0000 +0000 +ENDCHAR +STARTCHAR U+9864 +ENCODING 39012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041F +1F08 +041F +3F91 +1111 +7FDF +1111 +7FD1 +001F +7FD1 +1211 +121F +124A +63D1 +0000 +0000 +ENDCHAR +STARTCHAR U+9865 +ENCODING 39013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FFF +4108 +7F10 +417E +7F42 +0842 +7FFE +0042 +7F42 +417E +4142 +7F42 +087E +2A00 +4942 +1881 +ENDCHAR +STARTCHAR U+9866 +ENCODING 39014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +18FE +1430 +14E4 +3FCC +7CC4 +7EFC +2884 +3E84 +28FC +2E84 +20FC +3AFC +7E68 +5084 +0004 +ENDCHAR +STARTCHAR U+9867 +ENCODING 39015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0010 +3F20 +2178 +3F48 +2A78 +2FC8 +3A78 +2F48 +2F78 +4A30 +4FC8 +0884 +0000 +ENDCHAR +STARTCHAR U+9869 +ENCODING 39017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041F +0A08 +111F +2091 +5F51 +001F +3B91 +2A91 +2A9F +3B91 +0011 +111F +2A8A +4451 +0000 +0000 +ENDCHAR +STARTCHAR U+986A +ENCODING 39018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +041F +1788 +1410 +7FDF +0151 +3FDF +2111 +3D11 +291F +3D51 +3D91 +2D5F +4ACA +1051 +0000 +0000 +ENDCHAR +STARTCHAR U+986B +ENCODING 39019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +7FFC +3F10 +2F20 +2B78 +2F48 +3F78 +1E48 +1278 +1E48 +1278 +1E30 +0E48 +7184 +0000 +ENDCHAR +STARTCHAR U+986C +ENCODING 39020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +0D30 +3FFC +3EC4 +0EC4 +3AFC +3FC4 +08CC +30FC +3FC4 +35FC +3500 +356C +37C4 +0204 +ENDCHAR +STARTCHAR U+986F +ENCODING 39023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2110 +3F20 +2178 +3F48 +1278 +6D48 +2D78 +1B48 +7FF8 +3530 +2AC8 +4A84 +0000 +ENDCHAR +STARTCHAR U+9870 +ENCODING 39024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +2FFC +28F8 +7F88 +2AF8 +5CF8 +1AF8 +6FEC +0920 +0FE0 +0FE0 +0440 +7FFC +0040 +0000 +ENDCHAR +STARTCHAR U+9871 +ENCODING 39025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +07FC +3F90 +2D20 +3778 +3F48 +3578 +3F48 +3F78 +2048 +3F78 +5730 +17C8 +3884 +0000 +ENDCHAR +STARTCHAR U+9872 +ENCODING 39026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2A3F +1408 +2210 +2A3F +1421 +223F +4121 +7FBF +1021 +7FA1 +5EBF +5284 +5E8A +7F91 +0000 +0000 +ENDCHAR +STARTCHAR U+9873 +ENCODING 39027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0910 +0F20 +0F78 +3F48 +0178 +7FC8 +2AF8 +3BC8 +3BF8 +2AB0 +7FA8 +08C4 +0000 +ENDCHAR +STARTCHAR U+9874 +ENCODING 39028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1400 +7FFC +1410 +7720 +5578 +7748 +1478 +3F48 +6478 +3E48 +3E78 +2430 +3F48 +2184 +0000 +ENDCHAR +STARTCHAR U+9875 +ENCODING 39029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0200 +0410 +1FF8 +1010 +1110 +1110 +1110 +1110 +1110 +1110 +1290 +0460 +0818 +3008 +ENDCHAR +STARTCHAR U+9876 +ENCODING 39030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0BFE +FC20 +1044 +11FE +1104 +1124 +1124 +1124 +1124 +1124 +1124 +1040 +5058 +2084 +0302 +ENDCHAR +STARTCHAR U+9877 +ENCODING 39031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +4FFE +4040 +4088 +53FC +7A08 +4248 +4248 +4248 +4A48 +5248 +6288 +40A0 +0118 +020C +0C04 +ENDCHAR +STARTCHAR U+9878 +ENCODING 39032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0BFE +7C20 +1044 +11FE +1104 +1524 +FF24 +1124 +1124 +1124 +1124 +1144 +1058 +1086 +1302 +ENDCHAR +STARTCHAR U+9879 +ENCODING 39033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0BFE +FC20 +1044 +11FE +1104 +1124 +1124 +1124 +1124 +1D24 +F124 +4124 +0058 +0084 +0302 +ENDCHAR +STARTCHAR U+987A +ENCODING 39034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +47FE +5420 +5444 +55FE +5504 +5524 +5524 +5524 +5524 +5524 +5524 +5420 +4458 +8484 +0302 +ENDCHAR +STARTCHAR U+987B +ENCODING 39035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +0BFE +1020 +2044 +41FE +0504 +0924 +1124 +2124 +4124 +0524 +0924 +1144 +2058 +4086 +0302 +ENDCHAR +STARTCHAR U+987C +ENCODING 39036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +0BFE +7C20 +1040 +11FC +1104 +7D24 +1124 +1124 +1124 +1124 +1D24 +7050 +2048 +0086 +0302 +ENDCHAR +STARTCHAR U+987D +ENCODING 39037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +7DFE +0010 +0024 +04FE +FE84 +2894 +2894 +2894 +28A4 +28A4 +2AA4 +2C58 +4844 +8082 +0102 +ENDCHAR +STARTCHAR U+987E +ENCODING 39038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +7FFE +4020 +4044 +5EFE +5284 +5294 +5294 +5A94 +54A4 +50A4 +52A4 +5430 +584C +8086 +0102 +ENDCHAR +STARTCHAR U+987F +ENCODING 39039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +1420 +FE44 +11FE +5504 +5524 +5524 +5524 +7D24 +5524 +1124 +1420 +1850 +108C +0304 +ENDCHAR +STARTCHAR U+9880 +ENCODING 39040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +0FFE +7020 +4044 +41FE +4104 +7F24 +4924 +4924 +4924 +4924 +4924 +4944 +8858 +0886 +0302 +ENDCHAR +STARTCHAR U+9881 +ENCODING 39041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +2BFE +2820 +2444 +45FE +4304 +8524 +7F24 +2524 +2524 +2524 +2524 +2450 +2448 +4C86 +8302 +ENDCHAR +STARTCHAR U+9882 +ENCODING 39042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +2BFE +2820 +2844 +45FE +5304 +9124 +1124 +2124 +2124 +2924 +4524 +7C20 +0458 +0084 +0302 +ENDCHAR +STARTCHAR U+9883 +ENCODING 39043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +13FE +1020 +FE44 +01FE +0904 +7D24 +4924 +4924 +4924 +4924 +4924 +4D44 +4858 +8086 +0302 +ENDCHAR +STARTCHAR U+9884 +ENCODING 39044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7DFE +0420 +0844 +29FE +1104 +FF24 +1524 +1124 +1124 +1124 +1124 +1124 +1058 +5084 +2302 +ENDCHAR +STARTCHAR U+9885 +ENCODING 39045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +1E20 +1044 +12FE +7F84 +4294 +4294 +4294 +7EA4 +42A4 +40A4 +4050 +4048 +8086 +0302 +ENDCHAR +STARTCHAR U+9886 +ENCODING 39046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +2820 +2444 +43FE +A104 +1124 +0124 +FF24 +0324 +0524 +2924 +1050 +0848 +0886 +0302 +ENDCHAR +STARTCHAR U+9887 +ENCODING 39047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +09FE +0820 +7F44 +49FE +4A84 +4894 +7E94 +4294 +54A4 +54A4 +48A4 +5420 +5250 +A28C +0104 +ENDCHAR +STARTCHAR U+9888 +ENCODING 39048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FDFE +0410 +0824 +18FE +2684 +C294 +0094 +7C94 +10A4 +10A4 +10A4 +1E20 +E058 +4084 +0302 +ENDCHAR +STARTCHAR U+9889 +ENCODING 39049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1020 +FE44 +11FE +1104 +7D24 +0124 +7D24 +4524 +4524 +4524 +4450 +7C48 +4086 +0302 +ENDCHAR +STARTCHAR U+988A +ENCODING 39050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1020 +FE44 +11FE +5504 +3924 +1124 +FF24 +1124 +1124 +2944 +2554 +448C +8104 +0202 +ENDCHAR +STARTCHAR U+988C +ENCODING 39052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +1020 +2844 +45FE +8104 +7D24 +0124 +7D24 +4524 +4524 +4524 +4450 +7C48 +4086 +0302 +ENDCHAR +STARTCHAR U+988D +ENCODING 39053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4004 +45FE +4820 +7044 +45FE +7D04 +0124 +1324 +F524 +3924 +3924 +5524 +5450 +9048 +3086 +0302 +ENDCHAR +STARTCHAR U+988F +ENCODING 39055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +13FE +1020 +FE44 +11FE +1104 +2524 +7D24 +0924 +1124 +2524 +C924 +1850 +2448 +C286 +0302 +ENDCHAR +STARTCHAR U+9890 +ENCODING 39056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0404 +7FFE +4820 +4844 +48FE +5E84 +5294 +5294 +5294 +5E94 +48A4 +48A4 +48A4 +4858 +7E86 +0102 +ENDCHAR +STARTCHAR U+9891 +ENCODING 39057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +5420 +5E44 +51FE +5504 +FF24 +1124 +5524 +5524 +5524 +9524 +0820 +1050 +208C +4304 +ENDCHAR +STARTCHAR U+9893 +ENCODING 39059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C04 +F1FE +1020 +1444 +FEFE +1084 +3894 +5694 +9294 +38A4 +28A4 +2820 +2A58 +4C44 +4882 +8102 +ENDCHAR +STARTCHAR U+9894 +ENCODING 39060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13FE +2820 +2644 +53FE +8104 +7D24 +0524 +0924 +7D24 +4524 +4524 +4450 +7C48 +4486 +0302 +ENDCHAR +STARTCHAR U+9896 +ENCODING 39062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4004 +4BFE +7020 +4044 +45FE +3D04 +0124 +1D24 +F124 +1524 +FF24 +1124 +3820 +5458 +9184 +1602 +ENDCHAR +STARTCHAR U+9897 +ENCODING 39063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7FFE +5440 +5484 +7DFE +5504 +5524 +7D24 +1124 +FF24 +3124 +3924 +5524 +5450 +908C +1304 +ENDCHAR +STARTCHAR U+9898 +ENCODING 39064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E04 +23FE +2220 +3E44 +22FE +2284 +3E94 +0094 +FF94 +08A4 +2AA4 +2F20 +2858 +5884 +4906 +87FC +ENDCHAR +STARTCHAR U+989A +ENCODING 39066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +77FE +5510 +5524 +777E +0044 +3E54 +0054 +FF54 +2054 +3E54 +0254 +0264 +0228 +1446 +0982 +ENDCHAR +STARTCHAR U+989B +ENCODING 39067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +49FE +4910 +4924 +7F7E +0044 +FF54 +0854 +7F54 +5554 +5554 +5554 +5564 +5528 +4346 +0082 +ENDCHAR +STARTCHAR U+989C +ENCODING 39068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +09FE +7F20 +2244 +14FE +7F84 +4494 +4894 +5294 +44A4 +48A4 +52A4 +44A4 +4848 +9086 +2102 +ENDCHAR +STARTCHAR U+989D +ENCODING 39069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +08FE +7F10 +4124 +927E +1E44 +2254 +5454 +0854 +1454 +2254 +7F54 +A210 +2228 +3E46 +2082 +ENDCHAR +STARTCHAR U+989E +ENCODING 39070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +FFFE +2210 +3E24 +227E +3E44 +2254 +FFD4 +0254 +7754 +1154 +5554 +2264 +2228 +5546 +8882 +ENDCHAR +STARTCHAR U+989F +ENCODING 39071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2404 +24FE +FF10 +2424 +027E +FF44 +2454 +2454 +FF54 +A554 +A554 +DB54 +8120 +8528 +8246 +0082 +ENDCHAR +STARTCHAR U+98A0 +ENCODING 39072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +15FE +FE20 +1044 +7CFE +4484 +7C94 +4494 +7C94 +44A4 +7CA4 +44A4 +FE40 +0048 +2886 +4502 +ENDCHAR +STARTCHAR U+98A1 +ENCODING 39073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +3EFE +1410 +0824 +147E +7744 +5554 +2254 +5554 +0854 +FFD4 +1854 +2C20 +4B28 +8946 +0882 +ENDCHAR +STARTCHAR U+98A2 +ENCODING 39074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +3FFE +2210 +3E24 +227E +3E44 +0854 +FFD4 +0054 +3E54 +2254 +3E54 +0820 +2A28 +4946 +1882 +ENDCHAR +STARTCHAR U+98A4 +ENCODING 39076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FFFE +0010 +7F24 +557E +5D44 +5554 +7F54 +0054 +3E54 +3254 +2A54 +3E10 +0028 +FF46 +0082 +ENDCHAR +STARTCHAR U+98A5 +ENCODING 39077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0204 +7FFE +0810 +FFA4 +88FE +6B44 +0854 +6B54 +0854 +FFD4 +1054 +7F54 +5520 +5528 +5546 +4382 +ENDCHAR +STARTCHAR U+98A6 +ENCODING 39078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FE +2E20 +28FC +FF94 +4A94 +0C28 +32C4 +DFF0 +1110 +1FF0 +1210 +1FF0 +0504 +FFFE +0100 +0100 +ENDCHAR +STARTCHAR U+98A7 +ENCODING 39079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2204 +22FE +FF90 +2224 +777E +5544 +7754 +2454 +3F54 +6454 +BF54 +2454 +3F10 +2428 +3F46 +2082 +ENDCHAR +STARTCHAR U+98A8 +ENCODING 39080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +10D0 +1F10 +1110 +17D0 +1550 +1550 +17D0 +1510 +1154 +21EC +2E2C +4004 +0000 +ENDCHAR +STARTCHAR U+98A9 +ENCODING 39081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FC0 +4041 +4142 +5E44 +4459 +5F42 +5544 +5559 +5F42 +4444 +4458 +4541 +5F41 +417F +0000 +0000 +ENDCHAR +STARTCHAR U+98AA +ENCODING 39082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +01C0 +0120 +0100 +1FF0 +10D0 +1F10 +17D0 +1550 +17D4 +116C +2F9C +4004 +0000 +ENDCHAR +STARTCHAR U+98AB +ENCODING 39083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F10 +217E +3FF0 +2B3C +3F7C +3F74 +3FF4 +39FC +2F34 +7FB0 +4092 +407E +001E +0000 +ENDCHAR +STARTCHAR U+98AC +ENCODING 39084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FC0 +415F +5E52 +4452 +445F +5F42 +5546 +554A +5F52 +4442 +4544 +5F40 +4141 +407F +0000 +0000 +ENDCHAR +STARTCHAR U+98AD +ENCODING 39085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FC4 +4044 +4147 +5E44 +4444 +5F5F +5551 +5551 +5F51 +44DF +7FD1 +40C0 +4041 +007F +0000 +0000 +ENDCHAR +STARTCHAR U+98AE +ENCODING 39086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F90 +40BF +4281 +7CBD +48A5 +7EA5 +6ABD +6AA1 +7EA6 +49A1 +7FBF +4180 +4081 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+98AF +ENCODING 39087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +13F0 +1230 +13D0 +7E90 +0BF0 +4BB0 +2BB0 +2BF0 +32D0 +1CB4 +64EC +0B1C +1004 +0000 +ENDCHAR +STARTCHAR U+98B0 +ENCODING 39088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +2138 +3F28 +2F7C +3FF0 +2F78 +3F78 +3F70 +3FB0 +3FAC +2FCE +7B82 +40E6 +403E +0000 +ENDCHAR +STARTCHAR U+98B1 +ENCODING 39089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +1FA0 +11B0 +1EA8 +14CC +1FF4 +1D80 +1DF8 +1FC8 +16C8 +1578 +27C4 +38B4 +400C +0000 +ENDCHAR +STARTCHAR U+98B2 +ENCODING 39090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FF9 +4141 +4545 +7975 +4955 +7F95 +6B55 +6B55 +7F15 +4921 +4BC3 +7F00 +4101 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+98B3 +ENCODING 39091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +FF80 +8082 +BEBC +8888 +88BE +BE88 +AABE +BEA2 +88A2 +88BE +8A80 +BE40 +803E +0000 +0000 +ENDCHAR +STARTCHAR U+98B4 +ENCODING 39092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +3F64 +2170 +3F80 +217E +3D14 +3F70 +3F5E +3FD0 +3FF0 +2D3E +2380 +3FE2 +593E +0000 +ENDCHAR +STARTCHAR U+98B6 +ENCODING 39094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FB8 +13A8 +1CB8 +14A8 +1FB8 +1DA8 +1DB8 +1FFC +1698 +1564 +27C4 +38B4 +400C +0000 +ENDCHAR +STARTCHAR U+98B7 +ENCODING 39095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +4620 +7FA8 +6EF0 +7A70 +5ED8 +7E28 +7EE8 +7EF0 +7A50 +5E88 +7F04 +8184 +80FC +0038 +ENDCHAR +STARTCHAR U+98B8 +ENCODING 39096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F80 +20BE +22AA +3CBE +24AA +3FBE +3580 +3FA5 +24D5 +2690 +3F8F +2080 +2080 +407F +0000 +0000 +ENDCHAR +STARTCHAR U+98BA +ENCODING 39098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007E +7F42 +417E +4342 +7D7E +4900 +7FFF +6B20 +7F3F +4955 +4B29 +7F52 +4301 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+98BB +ENCODING 39099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +1082 +3E86 +52FA +2A92 +14FE +78D6 +20D6 +7EFE +0892 +7E96 +08BE +4A86 +7F01 +0000 +0000 +ENDCHAR +STARTCHAR U+98BC +ENCODING 39100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FE10 +8256 +BA92 +92D6 +9292 +FED6 +D610 +FE7C +9244 +9628 +FE10 +8628 +8144 +00FE +0000 +0000 +ENDCHAR +STARTCHAR U+98BD +ENCODING 39101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +5282 +5286 +7EFA +0092 +7EFE +00D6 +7ED6 +42FE +7E92 +0096 +24BE +1907 +7E01 +0000 +0000 +ENDCHAR +STARTCHAR U+98BE +ENCODING 39102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4152 +4724 +7958 +49E7 +7F08 +6B7F +7F49 +497F +4B08 +7F09 +417F +4100 +40FF +0000 +0000 +ENDCHAR +STARTCHAR U+98BF +ENCODING 39103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7EFE +4882 +4886 +7EFA +4892 +7EFE +48D6 +48D6 +7FFE +2592 +2596 +5BBE +0102 +0E01 +0000 +0000 +ENDCHAR +STARTCHAR U+98C0 +ENCODING 39104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F10 +2127 +2141 +3F49 +2551 +3F76 +3500 +3F7F +2549 +277F +3F49 +217F +2100 +40FF +0000 +0000 +ENDCHAR +STARTCHAR U+98C1 +ENCODING 39105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +777F +3341 +557F +3349 +5549 +117F +226B +107F +3F49 +214B +3F5F +2141 +3F81 +2101 +0000 +0000 +ENDCHAR +STARTCHAR U+98C2 +ENCODING 39106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00FF +7F55 +4133 +4355 +5D33 +4908 +7F14 +6B2A +6B51 +7F28 +4B14 +4B29 +3F11 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+98C3 +ENCODING 39107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2330 +3DFC +29B4 +3FFC +3B78 +3B00 +3FFC +2D58 +2A94 +2FB4 +3164 +401C +0000 +ENDCHAR +STARTCHAR U+98C4 +ENCODING 39108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FF8 +1918 +7FE8 +5B48 +7FF8 +01D8 +3DD8 +01F8 +7F6C +2D5C +2A74 +4B94 +1C04 +0000 +ENDCHAR +STARTCHAR U+98C5 +ENCODING 39109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FC +7E54 +43DE +7F5C +43DC +7FFC +7F24 +7FFC +7F24 +7BFC +4300 +4780 +7EE4 +B27C +0000 +ENDCHAR +STARTCHAR U+98C6 +ENCODING 39110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C00 +0BF8 +3F18 +09E8 +1548 +13F8 +35D8 +2FD8 +7FF8 +256C +375C +2A74 +4B94 +5404 +0000 +ENDCHAR +STARTCHAR U+98C7 +ENCODING 39111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000A +7F88 +4EFF +7888 +4894 +48A2 +7EC9 +6A8A +6A88 +7EFF +4894 +4AA2 +4EC1 +7980 +407F +4000 +ENDCHAR +STARTCHAR U+98C8 +ENCODING 39112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3F3C +2278 +3E78 +2A4C +3E48 +3FFC +3EDC +3FD8 +3FB4 +2B80 +2FC4 +7B7C +0000 +0000 +ENDCHAR +STARTCHAR U+98C9 +ENCODING 39113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F08 +217F +2108 +3F55 +2522 +25FF +3F22 +353E +3522 +3F3E +252C +274B +5F08 +00FF +0000 +0000 +ENDCHAR +STARTCHAR U+98CB +ENCODING 39115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E00 +4277 +4622 +7A77 +4A22 +4A77 +7E00 +6AAA +7EA3 +4A24 +4A19 +7E67 +4200 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+98CC +ENCODING 39116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +227E +7F42 +2246 +777A +5552 +777E +2256 +7F56 +227E +3F53 +2253 +3F93 +2215 +3F7C +0000 +0000 +ENDCHAR +STARTCHAR U+98CE +ENCODING 39118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3FF8 +2010 +2850 +2450 +2290 +2290 +2110 +2110 +2290 +2290 +2450 +2850 +3012 +400A +8006 +ENDCHAR +STARTCHAR U+98D1 +ENCODING 39121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +7E88 +44FC +4508 +4608 +6DE8 +6D28 +5528 +55E8 +5528 +6D10 +6D04 +44FE +4402 +43FE +8000 +ENDCHAR +STARTCHAR U+98D2 +ENCODING 39122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +23FC +1208 +1208 +FF18 +0298 +4AA8 +4AA8 +4A48 +5248 +52A8 +1E98 +F31A +440A +040A +1804 +ENDCHAR +STARTCHAR U+98D3 +ENCODING 39123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7EFC +4488 +44F8 +4488 +6CF8 +6C88 +54F8 +5488 +5488 +6FFE +6C50 +448A +4402 +43FE +8000 +ENDCHAR +STARTCHAR U+98D5 +ENCODING 39125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7DAC +4524 +45AC +4524 +6D24 +6DFC +5420 +55FC +5488 +6C50 +6C20 +4452 +448A +43FE +8000 +ENDCHAR +STARTCHAR U+98D8 +ENCODING 39128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +FEFC +2888 +FE88 +AA88 +AAD8 +FED8 +00A8 +7CA8 +00D8 +FED8 +1088 +588A +550A +9206 +3400 +ENDCHAR +STARTCHAR U+98D9 +ENCODING 39129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +18FC +1488 +FE88 +1088 +28D8 +44D8 +82A8 +24A8 +36A8 +FFD8 +24D8 +248A +5A8A +490A +9204 +ENDCHAR +STARTCHAR U+98DA +ENCODING 39130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E20 +44A4 +44A8 +4550 +6C88 +6D06 +5488 +56AA +55DC +6C88 +6D54 +4622 +4402 +43FE +8000 +ENDCHAR +STARTCHAR U+98DB +ENCODING 39131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FC8 +0270 +0E50 +3248 +1228 +1218 +7FC8 +1250 +1270 +2228 +2224 +4214 +020C +0000 +ENDCHAR +STARTCHAR U+98DC +ENCODING 39132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0600 +7BF4 +2A78 +1CB8 +7FB4 +1CAC +1AA4 +29F4 +7EB8 +2AB8 +3EB4 +2AAC +3F2C +2224 +0000 +ENDCHAR +STARTCHAR U+98DE +ENCODING 39134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +FFF0 +0020 +0024 +002C +0030 +0020 +0030 +002C +0024 +0020 +0020 +0010 +0012 +000A +0004 +ENDCHAR +STARTCHAR U+98DF +ENCODING 39135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +0280 +0440 +1930 +6FEC +0820 +0FE0 +0820 +0FF0 +0910 +08A0 +0E60 +701C +0000 +ENDCHAR +STARTCHAR U+98E1 +ENCODING 39137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4060 +2090 +0108 +0204 +0C23 +0040 +03FC +1204 +13FC +1204 +23FC +2222 +2224 +2218 +43EC +4E03 +ENDCHAR +STARTCHAR U+98E2 +ENCODING 39138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F0 +1490 +1A90 +2890 +7E90 +2290 +3E90 +2290 +3E90 +2890 +2514 +3B14 +620C +0000 +ENDCHAR +STARTCHAR U+98E3 +ENCODING 39139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1402 +22FF +4908 +3E08 +2208 +3E08 +2208 +3E08 +2808 +2408 +2A08 +3128 +6090 +0000 +0000 +ENDCHAR +STARTCHAR U+98E5 +ENCODING 39141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C01 +127E +2910 +4890 +3E10 +2212 +3EFF +2210 +3E10 +2810 +2410 +2A11 +3111 +608F +0000 +0000 +ENDCHAR +STARTCHAR U+98E6 +ENCODING 39142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1800 +1DFC +17FC +3C60 +3C60 +3C60 +3FFC +3460 +3C60 +3460 +3460 +3660 +3E60 +3260 +0020 +ENDCHAR +STARTCHAR U+98E7 +ENCODING 39143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +20A0 +2110 +3A8E +4C44 +4BF8 +4A08 +ABF8 +1208 +13F8 +2248 +2230 +4290 +830C +0204 +ENDCHAR +STARTCHAR U+98E8 +ENCODING 39144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +20A0 +48A0 +4990 +F248 +27FF +4A08 +FBF8 +0A08 +13F8 +1288 +2250 +4220 +831E +0204 +ENDCHAR +STARTCHAR U+98E9 +ENCODING 39145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +143C +1FE0 +2220 +7CA8 +24A8 +3CA8 +24A8 +3CF8 +3CA8 +2024 +3E24 +201C +0000 +ENDCHAR +STARTCHAR U+98EA +ENCODING 39146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C00 +1206 +2138 +4488 +3F08 +2108 +3F08 +217F +3F08 +2808 +2408 +2208 +2508 +38BE +0000 +0000 +ENDCHAR +STARTCHAR U+98EB +ENCODING 39147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +0810 +14E0 +1E20 +2220 +7C20 +25FC +3C20 +2420 +3C60 +3E50 +2090 +3F08 +2204 +0000 +ENDCHAR +STARTCHAR U+98ED +ENCODING 39149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0880 +1480 +1EFC +2340 +7E40 +23F8 +3E48 +2248 +3E48 +3E48 +2088 +3E88 +2130 +0000 +ENDCHAR +STARTCHAR U+98EE +ENCODING 39150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0C40 +1240 +1E40 +20FC +7EA4 +2328 +3E30 +2220 +3E20 +3E50 +2050 +3E88 +2104 +0000 +ENDCHAR +STARTCHAR U+98EF +ENCODING 39151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0CFC +1280 +2A80 +48F8 +3EC8 +22C8 +3EC8 +22A8 +3EB0 +2490 +2730 +39C8 +6304 +0000 +ENDCHAR +STARTCHAR U+98F2 +ENCODING 39154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +1A40 +29FC +7EA8 +2330 +3E20 +2220 +3E60 +2850 +2490 +3B08 +6204 +0000 +ENDCHAR +STARTCHAR U+98F3 +ENCODING 39155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1800 +1820 +3426 +3DFE +2020 +3C20 +3C20 +3DFC +3C20 +3C20 +2820 +2C30 +3FFE +25FE +0000 +ENDCHAR +STARTCHAR U+98F4 +ENCODING 39156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0C20 +1220 +2A50 +4848 +3E9C +23E4 +3E00 +22F8 +3E88 +2488 +2688 +3AF8 +6088 +0000 +ENDCHAR +STARTCHAR U+98F6 +ENCODING 39158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1400 +2224 +49A2 +3EA1 +22A4 +3EA4 +22A8 +3EB2 +2021 +2820 +2460 +2AA1 +301F +0000 +0000 +ENDCHAR +STARTCHAR U+98F9 +ENCODING 39161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +289F +4509 +1109 +7D29 +4529 +7D29 +4529 +7DEE +4028 +5028 +4828 +5448 +6088 +0000 +0000 +ENDCHAR +STARTCHAR U+98FA +ENCODING 39162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +173C +1421 +7FBF +0080 +0140 +02A0 +07F0 +0C98 +17F4 +2402 +04D0 +0520 +0618 +0000 +0000 +ENDCHAR +STARTCHAR U+98FC +ENCODING 39164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1408 +1AF8 +2A08 +7EE8 +22A8 +3EA8 +22A8 +3EE8 +24A8 +2608 +3A08 +6018 +0000 +ENDCHAR +STARTCHAR U+98FD +ENCODING 39165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0C40 +1278 +2A88 +49E8 +3E28 +2228 +3EE8 +22B0 +3E80 +2480 +2684 +3A84 +607C +0000 +ENDCHAR +STARTCHAR U+98FE +ENCODING 39166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1440 +12FC +2920 +7E20 +22F8 +3EA8 +22A8 +3EA8 +24A8 +26B8 +3A20 +6020 +0000 +ENDCHAR +STARTCHAR U+9900 +ENCODING 39168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0822 +1422 +227F +4922 +3E22 +2200 +3E22 +2222 +3E22 +2022 +2814 +2408 +2A14 +7063 +0000 +0000 +ENDCHAR +STARTCHAR U+9902 +ENCODING 39170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +14FC +2210 +4910 +3EFE +2210 +3E10 +22FE +3E82 +2082 +2482 +2682 +28FE +7082 +0000 +0000 +ENDCHAR +STARTCHAR U+9903 +ENCODING 39171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1E50 +2248 +7C94 +2554 +3C50 +2460 +3C20 +3E20 +2050 +3E88 +2304 +0000 +ENDCHAR +STARTCHAR U+9905 +ENCODING 39173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0908 +0C88 +1290 +2BFC +4890 +3C90 +2490 +3FFC +2490 +3C90 +2890 +2510 +3B10 +6210 +0000 +ENDCHAR +STARTCHAR U+9907 +ENCODING 39175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11FF +2901 +4501 +117D +7D01 +457D +7D45 +4545 +7D7D +4145 +5101 +4901 +5501 +6103 +0000 +0000 +ENDCHAR +STARTCHAR U+9908 +ENCODING 39176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +047F +3E41 +0088 +0414 +3EA2 +0141 +0220 +0490 +0FF8 +1494 +27F2 +4451 +04A0 +071C +0000 +0000 +ENDCHAR +STARTCHAR U+9909 +ENCODING 39177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1440 +1FF8 +2108 +7DE8 +25A8 +3DA8 +25A8 +3DE8 +3FA8 +2108 +3F08 +2118 +0000 +ENDCHAR +STARTCHAR U+990A +ENCODING 39178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +3FF8 +0100 +1FF0 +0100 +7FFC +0540 +1FF0 +67CC +0440 +07E0 +0520 +06C0 +3838 +0000 +ENDCHAR +STARTCHAR U+990C +ENCODING 39180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0DFC +1248 +2A48 +4878 +3E48 +2248 +3E78 +2248 +3E4C +2478 +2788 +3A08 +6008 +0000 +ENDCHAR +STARTCHAR U+990D +ENCODING 39181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFC +2090 +3FFC +2140 +2630 +388E +2144 +26B0 +2FF8 +3416 +27F0 +2410 +47F4 +4448 +8530 +060C +ENDCHAR +STARTCHAR U+9910 +ENCODING 39184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +0FF8 +1F48 +7230 +0D48 +3384 +0D60 +77DC +0440 +07C0 +07D0 +04A0 +0760 +3818 +0000 +ENDCHAR +STARTCHAR U+9911 +ENCODING 39185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +14FE +2A10 +49FF +3D01 +257D +3C04 +2418 +3C10 +21FF +2810 +2410 +2B10 +3030 +0000 +0000 +ENDCHAR +STARTCHAR U+9912 +ENCODING 39186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +08F0 +14A8 +1EA4 +2304 +7E20 +2220 +3FFC +2248 +3E48 +3EF0 +2010 +3E68 +2384 +0000 +ENDCHAR +STARTCHAR U+9913 +ENCODING 39187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0868 +17A4 +1AA4 +28A0 +7FFC +24A0 +3CA8 +24E8 +3F90 +2894 +24AC +3ECC +6184 +0000 +ENDCHAR +STARTCHAR U+9914 +ENCODING 39188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +17FC +1E40 +23F8 +7D48 +2548 +3DF8 +2548 +3D48 +3FF8 +2148 +3F48 +2158 +0000 +ENDCHAR +STARTCHAR U+9915 +ENCODING 39189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1442 +2282 +49FE +3C44 +2482 +3D41 +247E +3C84 +2024 +2A28 +2410 +2A28 +30C6 +0000 +0000 +ENDCHAR +STARTCHAR U+9916 +ENCODING 39190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +14FF +2200 +4900 +3E7E +2242 +3E42 +2242 +3E7E +2000 +2881 +2442 +2A24 +31FF +0000 +0000 +ENDCHAR +STARTCHAR U+9917 +ENCODING 39191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +15FF +2210 +4910 +3EFE +2292 +3E92 +2292 +3EFE +2010 +2854 +2492 +2B11 +7010 +0000 +0000 +ENDCHAR +STARTCHAR U+9918 +ENCODING 39192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1450 +1E50 +2288 +7DFC +2420 +3DFC +2420 +3CB0 +3EA8 +2124 +3E24 +2060 +0000 +ENDCHAR +STARTCHAR U+991A +ENCODING 39194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1822 +2414 +5208 +0834 +7EFF +4220 +7E7E +42A2 +7E3E +4822 +443E +4A22 +514A +6004 +0000 +0000 +ENDCHAR +STARTCHAR U+991B +ENCODING 39195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +18FE +2482 +52FE +0882 +7EFE +4282 +7E00 +4288 +7E88 +50AA +48CC +4488 +4A89 +7067 +0000 +0000 +ENDCHAR +STARTCHAR U+991C +ENCODING 39196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +08FE +1CB6 +16FE +1EB6 +24B6 +3EB6 +3430 +35FF +3C70 +3478 +30BC +3536 +3C32 +3430 +0000 +ENDCHAR +STARTCHAR U+991D +ENCODING 39197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +15FC +1E50 +2220 +7C20 +25FC +3C20 +2438 +3C48 +3E48 +2088 +3F08 +2230 +0000 +ENDCHAR +STARTCHAR U+991E +ENCODING 39198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0848 +147C +1FC8 +2230 +7C74 +258C +3C54 +247C +3DC8 +3E30 +2074 +3F8C +2004 +0000 +ENDCHAR +STARTCHAR U+991F +ENCODING 39199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +19EF +2529 +42A5 +10C6 +7D29 +4610 +7C00 +45EF +7D29 +4129 +40C6 +48C6 +5529 +6211 +0000 +0000 +ENDCHAR +STARTCHAR U+9920 +ENCODING 39200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +1520 +1FFC +2290 +7C90 +2490 +3CD0 +27BC +3C90 +3E90 +2110 +3F10 +2210 +0000 +ENDCHAR +STARTCHAR U+9921 +ENCODING 39201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08F8 +1488 +1E88 +2308 +7E30 +2440 +3D98 +2508 +3DD8 +3F08 +2108 +3FF8 +2108 +0000 +ENDCHAR +STARTCHAR U+9922 +ENCODING 39202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C20 +0830 +1E10 +1FFC +3C88 +3E58 +525E +1FFE +1E00 +1CFC +1688 +1E88 +18F8 +10F0 +0000 +ENDCHAR +STARTCHAR U+9924 +ENCODING 39204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0824 +14A4 +1EA8 +2370 +7C50 +2488 +3D24 +24A4 +3CA8 +3F70 +2050 +3E88 +2104 +0000 +ENDCHAR +STARTCHAR U+9925 +ENCODING 39205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7E3F +0220 +7E3F +0220 +7E3F +05E0 +02A0 +07F0 +0C98 +17F4 +04D0 +0520 +0618 +0000 +0000 +ENDCHAR +STARTCHAR U+9926 +ENCODING 39206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +19FC +3D80 +3DFC +6980 +6DF8 +3D80 +2D8E +3DA0 +29AC +21B8 +2990 +3DD8 +2D0C +0000 +ENDCHAR +STARTCHAR U+9927 +ENCODING 39207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +15FE +3210 +49FF +3C38 +2454 +3C92 +2444 +3DFF +2844 +2428 +2A10 +3028 +61C7 +0000 +0000 +ENDCHAR +STARTCHAR U+9928 +ENCODING 39208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +15FC +1B08 +28F0 +7E90 +2290 +3EF0 +2280 +3EF8 +2488 +2688 +39F8 +6088 +0000 +ENDCHAR +STARTCHAR U+9929 +ENCODING 39209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1428 +2244 +4992 +0011 +3EFE +2210 +3E22 +2244 +3EF8 +2012 +2424 +2C4A +3191 +0000 +0000 +ENDCHAR +STARTCHAR U+992A +ENCODING 39210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +18FE +2410 +4220 +11FF +7D29 +4529 +7D2B +4410 +7C10 +41FF +4810 +4828 +5444 +6183 +0000 +0000 +ENDCHAR +STARTCHAR U+992B +ENCODING 39211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +19FF +2511 +437D +1010 +7CFE +4492 +7CFE +4492 +7CFE +4010 +49FF +4810 +5410 +6210 +0000 +0000 +ENDCHAR +STARTCHAR U+992C +ENCODING 39212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +1138 +1928 +27E8 +3D28 +7938 +2BA8 +3AA8 +2AB8 +3AA8 +3FC8 +2248 +3C88 +2118 +0000 +ENDCHAR +STARTCHAR U+992D +ENCODING 39213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1880 +25FE +4282 +10FE +7C82 +44FE +7C00 +44FE +7C10 +4010 +40FE +4810 +5410 +61FF +0000 +0000 +ENDCHAR +STARTCHAR U+992E +ENCODING 39214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F50 +09AC +1ED0 +7468 +1970 +6280 +0FE0 +77FC +0440 +07C0 +07D0 +07E0 +3C38 +0000 +ENDCHAR +STARTCHAR U+992F +ENCODING 39215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +183E +2464 +4298 +1010 +7DFF +4460 +7C72 +44AC +7D2C +405A +48A9 +5448 +6030 +0000 +0000 +ENDCHAR +STARTCHAR U+9930 +ENCODING 39216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1840 +2447 +4280 +1110 +7C4F +44A2 +7D92 +4682 +7C8A +40B2 +40A2 +4882 +5486 +6082 +0000 +0000 +ENDCHAR +STARTCHAR U+9931 +ENCODING 39217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1840 +245E +4282 +11BF +7E80 +44A0 +7CBE +44C8 +7C88 +40BF +4088 +4894 +54A2 +60C1 +0000 +0000 +ENDCHAR +STARTCHAR U+9932 +ENCODING 39218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +187E +2442 +427E +1042 +7C7E +4480 +7CFF +4491 +7D11 +40A9 +40C5 +4881 +54F9 +600E +0000 +0000 +ENDCHAR +STARTCHAR U+9933 +ENCODING 39219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +187E +2442 +427E +1042 +7C7E +4400 +7DFF +4440 +7CFF +4129 +4029 +4829 +5451 +600E +0000 +0000 +ENDCHAR +STARTCHAR U+9934 +ENCODING 39220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1030 +386E +2CF0 +38F8 +7D2E +2FFC +3CA8 +2CA8 +3C88 +23FE +2188 +2908 +7F08 +2408 +0008 +ENDCHAR +STARTCHAR U+9935 +ENCODING 39221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +18FE +2492 +4292 +18FE +7E92 +42FE +7E00 +43FF +7E92 +5094 +4888 +4CA4 +52C2 +6081 +0000 +0000 +ENDCHAR +STARTCHAR U+9939 +ENCODING 39225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +393E +2D20 +3928 +492C +7D2E +692C +692C +7B28 +63A8 +6A8C +6A88 +7E88 +6CF8 +0000 +ENDCHAR +STARTCHAR U+993A +ENCODING 39226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0812 +15FF +2210 +48FE +3C92 +24FE +3C92 +24FE +3C92 +2004 +29FF +2444 +2A24 +700C +0000 +0000 +ENDCHAR +STARTCHAR U+993B +ENCODING 39227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +188C +18D8 +34DC +3FE0 +2020 +3C20 +25FC +3C20 +2C20 +3C66 +2000 +2954 +2D56 +375B +0253 +ENDCHAR +STARTCHAR U+993C +ENCODING 39228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1840 +24FE +4378 +10FE +7C22 +44AA +7C72 +45FE +7C22 +4072 +48AA +4927 +5423 +6001 +0000 +0000 +ENDCHAR +STARTCHAR U+993D +ENCODING 39229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0880 +15F8 +1F48 +23F8 +7D48 +25F8 +3DC8 +24D0 +3CD0 +3F68 +217C +3E44 +243C +0000 +ENDCHAR +STARTCHAR U+993E +ENCODING 39230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +09BC +1514 +1F94 +2354 +7DD4 +272C +3C40 +25F8 +3D48 +3FF8 +2148 +3FF8 +2108 +0000 +ENDCHAR +STARTCHAR U+993F +ENCODING 39231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10A0 +292C +4524 +B9AC +0124 +7924 +49AC +7820 +48F8 +7888 +5050 +4860 +5490 +630E +0000 +0000 +ENDCHAR +STARTCHAR U+9940 +ENCODING 39232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +180C +1CFE +3E06 +2126 +7DB4 +2400 +3DFE +2506 +3D06 +21FE +2106 +2506 +3DFE +3506 +0000 +ENDCHAR +STARTCHAR U+9941 +ENCODING 39233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1810 +24FE +4210 +11FF +7C20 +4444 +7CFE +4402 +7C00 +40FE +40AA +48AA +54AA +61FF +0000 +0000 +ENDCHAR +STARTCHAR U+9942 +ENCODING 39234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1548 +1F68 +2398 +7D18 +25F8 +3C00 +25F8 +3D68 +3F68 +2168 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+9943 +ENCODING 39235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +29FF +4444 +1000 +7CFE +4482 +7CFE +4482 +7CFE +4010 +41FF +4844 +5482 +6101 +0000 +0000 +ENDCHAR +STARTCHAR U+9945 +ENCODING 39237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1488 +1EF8 +2288 +7CF8 +25FC +3D54 +25FC +3CF8 +3E50 +2020 +3ED0 +230C +0000 +ENDCHAR +STARTCHAR U+9946 +ENCODING 39238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1102 +19FE +1D36 +3D36 +21FE +7D20 +25A6 +3DEF +2524 +3DFE +2020 +2834 +2C30 +3C20 +2420 +0020 +ENDCHAR +STARTCHAR U+9947 +ENCODING 39239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +29FF +4500 +113E +7D22 +453E +7D00 +4577 +7D55 +4155 +4155 +4977 +5500 +61FF +0000 +0000 +ENDCHAR +STARTCHAR U+9948 +ENCODING 39240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +2848 +45FE +1020 +7DFE +4420 +7DFE +4420 +7C40 +40FC +4114 +487E +5414 +61FE +0000 +0000 +ENDCHAR +STARTCHAR U+9949 +ENCODING 39241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +09FC +1450 +1E70 +22F8 +7CA8 +24F8 +3C20 +25FC +3C20 +3EF8 +2020 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+994B +ENCODING 39243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +14A8 +1EF8 +23FC +7CF8 +2488 +3CF8 +2488 +3CF8 +3E88 +20F8 +3EC8 +2304 +0000 +ENDCHAR +STARTCHAR U+994C +ENCODING 39244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1568 +1FF8 +2320 +7D64 +24DC +3C50 +25F8 +3C50 +3FFC +2050 +3E88 +2108 +0000 +ENDCHAR +STARTCHAR U+994D +ENCODING 39245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1042 +2824 +45FF +0010 +7CFE +0010 +7DFF +4492 +7C54 +45FF +7C00 +40FE +7C82 +4082 +7CFE +4082 +ENDCHAR +STARTCHAR U+994E +ENCODING 39246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +15FF +3210 +48FE +3C00 +24FE +3C82 +24FE +3C28 +21FF +2828 +24FE +2A82 +30FE +0000 +0000 +ENDCHAR +STARTCHAR U+9950 +ENCODING 39248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +1420 +1EF8 +23FC +7D08 +27FC +3CF8 +2488 +3CF8 +3E88 +2050 +3FFC +2000 +0000 +ENDCHAR +STARTCHAR U+9951 +ENCODING 39249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1148 +1148 +1AF4 +25D4 +3D48 +7AD4 +2BFC +3848 +2BFC +3B48 +3EA8 +2234 +3ECC +2404 +0000 +ENDCHAR +STARTCHAR U+9952 +ENCODING 39250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +14F8 +1E20 +23FC +7C90 +27FC +3C90 +24FC +3F00 +3FFC +2050 +3C94 +230C +0000 +ENDCHAR +STARTCHAR U+9953 +ENCODING 39251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2892 +4454 +21FF +7D01 +457D +7C44 +447C +7C10 +41FF +4054 +4892 +5511 +6010 +0000 +0000 +ENDCHAR +STARTCHAR U+9954 +ENCODING 39252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +7FFE +0890 +12FC +7D90 +0AFC +7C90 +099E +3280 +4540 +0FF0 +392E +CFE4 +0A20 +09C0 +0C30 +ENDCHAR +STARTCHAR U+9955 +ENCODING 39253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1E38 +12FC +1EA8 +7FD8 +1EB0 +2334 +0ECC +0FE0 +77DC +0440 +07C0 +07D0 +06E0 +3838 +0000 +ENDCHAR +STARTCHAR U+9956 +ENCODING 39254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1810 +245E +4250 +21FF +7C05 +45FF +7D04 +45FC +7D25 +4125 +416D +49AE +5635 +62CB +0000 +0000 +ENDCHAR +STARTCHAR U+9957 +ENCODING 39255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1138 +5BA8 +2BB0 +16A8 +7FE4 +0BF8 +33A0 +07C0 +1FF0 +67CC +07C0 +04B0 +0760 +3818 +0000 +ENDCHAR +STARTCHAR U+9958 +ENCODING 39256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +15FF +3200 +48FE +3CBA +24AA +3CBA +24FE +3C7C +2044 +287C +2444 +2A7C +31FF +0000 +0000 +ENDCHAR +STARTCHAR U+9959 +ENCODING 39257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +15FF +3254 +49FF +3C44 +24FE +3C82 +24FE +3C82 +20FE +2882 +24FE +2A44 +3182 +0000 +0000 +ENDCHAR +STARTCHAR U+995B +ENCODING 39259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +14FF +3244 +49FF +3D01 +2478 +3CFC +2422 +3CD4 +2038 +29D4 +2432 +2BD3 +3030 +0000 +0000 +ENDCHAR +STARTCHAR U+995C +ENCODING 39260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2F8A +2A89 +2FBE +2F94 +2AA2 +49C1 +02A0 +07F0 +0C98 +37F6 +04D0 +0520 +0E1C +0000 +0000 +ENDCHAR +STARTCHAR U+995E +ENCODING 39262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FC +1508 +33FF +4101 +3DFF +2484 +3CF7 +24FF +3D08 +21FF +2911 +25FF +2A2A +30CF +0000 +0000 +ENDCHAR +STARTCHAR U+995F +ENCODING 39263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +15FF +33EF +4929 +3DEF +2444 +3DFF +2444 +3DFF +2044 +29FF +258A +2A84 +30CB +0000 +0000 +ENDCHAR +STARTCHAR U+9960 +ENCODING 39264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +13FE +3BD6 +2F56 +3BFE +4198 +7DBE +6BFC +6BFE +6978 +6BFE +6038 +697E +7BF0 +6F30 +0000 +ENDCHAR +STARTCHAR U+9961 +ENCODING 39265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +094A +17EF +3242 +49EF +3D4A +2463 +3CFE +2482 +3CFE +2882 +24FE +2A82 +30FE +6101 +0000 +0000 +ENDCHAR +STARTCHAR U+9963 +ENCODING 39267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +1000 +1E00 +2400 +2800 +4000 +9000 +1000 +1000 +1000 +1200 +1400 +1800 +1000 +0000 +ENDCHAR +STARTCHAR U+9965 +ENCODING 39269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2010 +21F8 +3D10 +2510 +4910 +4110 +A110 +2110 +2110 +2110 +2510 +2912 +3212 +240E +0800 +ENDCHAR +STARTCHAR U+9967 +ENCODING 39271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +23F8 +2020 +3C40 +4480 +8904 +23FE +2094 +2094 +2094 +2124 +2524 +2A44 +3244 +24A8 +0010 +ENDCHAR +STARTCHAR U+9968 +ENCODING 39272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2044 +3FFE +4440 +8A48 +2248 +2248 +2248 +2248 +23F8 +2048 +2840 +3042 +2042 +003E +ENDCHAR +STARTCHAR U+9969 +ENCODING 39273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +2100 +2104 +3DFE +4600 +89F8 +2000 +23F8 +2008 +2008 +2008 +2408 +2808 +300A +200A +0006 +ENDCHAR +STARTCHAR U+996A +ENCODING 39274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +203C +23C0 +3C40 +4440 +8840 +2040 +2044 +2FFE +2040 +2040 +2440 +2840 +3048 +27FC +0000 +ENDCHAR +STARTCHAR U+996B +ENCODING 39275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +203C +23C0 +3C40 +4440 +8840 +2044 +2FFE +2040 +2040 +20A0 +24A0 +2910 +3108 +220E +0C04 +ENDCHAR +STARTCHAR U+996C +ENCODING 39276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2084 +21FE +3D40 +4640 +8844 +23FE +2044 +2044 +2044 +2044 +2444 +2884 +3084 +2128 +0610 +ENDCHAR +STARTCHAR U+996D +ENCODING 39277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +201C +21E0 +3D00 +2500 +49FC +4104 +A148 +2148 +2150 +2130 +2520 +2950 +3248 +248E +0904 +ENDCHAR +STARTCHAR U+996E +ENCODING 39278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1040 +1E7E +2282 +2524 +5020 +9020 +1020 +1050 +1250 +1490 +1888 +110E +0204 +ENDCHAR +STARTCHAR U+996F +ENCODING 39279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2050 +2048 +3C40 +247C +4BC0 +4048 +A07C +23C0 +2048 +2050 +2420 +2860 +3092 +230A +0006 +ENDCHAR +STARTCHAR U+9970 +ENCODING 39280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2084 +3CFE +2520 +4A24 +41FE +A124 +2124 +2124 +2124 +2524 +2934 +3128 +2020 +0020 +ENDCHAR +STARTCHAR U+9971 +ENCODING 39281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2084 +3CFE +2504 +4A14 +45FC +A114 +2114 +21F4 +2114 +2508 +2902 +3102 +20FE +0000 +ENDCHAR +STARTCHAR U+9972 +ENCODING 39282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +2004 +3C24 +27F4 +4804 +4004 +A3F4 +2224 +2224 +2224 +2624 +2BE4 +3204 +2014 +0008 +ENDCHAR +STARTCHAR U+9974 +ENCODING 39284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2080 +3C80 +4510 +8A08 +27FC +2004 +2008 +23FC +2208 +2608 +2A08 +3208 +23F8 +0208 +ENDCHAR +STARTCHAR U+9975 +ENCODING 39285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +2108 +3D08 +25F8 +4908 +4108 +A1F8 +2108 +2108 +27FE +2008 +2808 +3008 +2008 +0008 +ENDCHAR +STARTCHAR U+9976 +ENCODING 39286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +2088 +38FC +4F80 +5050 +8022 +20D2 +270E +2008 +27FC +2120 +2920 +3122 +2222 +0C1E +ENDCHAR +STARTCHAR U+9977 +ENCODING 39287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +2084 +3FFE +4604 +8A04 +22F4 +2294 +2294 +2294 +2294 +26F4 +2A04 +3204 +2214 +0208 +ENDCHAR +STARTCHAR U+997A +ENCODING 39290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2020 +2024 +3FFE +2400 +4888 +4106 +A202 +2088 +2050 +2020 +2450 +2850 +3088 +2106 +0204 +ENDCHAR +STARTCHAR U+997C +ENCODING 39292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2108 +2090 +3C00 +47FC +4890 +A090 +2094 +27FE +2090 +2090 +2490 +2890 +3110 +2210 +0410 +ENDCHAR +STARTCHAR U+997D +ENCODING 39293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2048 +23FC +3C40 +4440 +8BFC +2204 +2408 +21F0 +2020 +2044 +27FE +2840 +3040 +2140 +0080 +ENDCHAR +STARTCHAR U+997F +ENCODING 39295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +20D0 +2394 +3C92 +2490 +4BFE +4090 +A090 +20D4 +2198 +2290 +20A8 +28C8 +308A +2286 +0102 +ENDCHAR +STARTCHAR U+9980 +ENCODING 39296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +20A0 +3CA0 +4510 +8A08 +25F6 +2040 +2048 +27FC +2040 +2150 +2A4C +3444 +2140 +0080 +ENDCHAR +STARTCHAR U+9981 +ENCODING 39297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +201C +27E0 +2000 +3A44 +4924 +5128 +8080 +2084 +2FFE +2108 +2208 +2110 +28A0 +30E0 +2118 +0608 +ENDCHAR +STARTCHAR U+9984 +ENCODING 39300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +23FC +2208 +3E08 +47F8 +8A08 +2208 +23F8 +2220 +2224 +23A8 +2630 +2A22 +32A2 +231E +0000 +ENDCHAR +STARTCHAR U+9985 +ENCODING 39301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +20F8 +3D08 +2610 +4824 +419E +A204 +2204 +2204 +239C +2604 +2A04 +3204 +23FC +0204 +ENDCHAR +STARTCHAR U+9986 +ENCODING 39302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2040 +23FE +3A02 +4C04 +51F8 +8108 +2108 +21F8 +2100 +21F8 +2508 +2908 +3108 +21F8 +0100 +ENDCHAR +STARTCHAR U+9987 +ENCODING 39303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2048 +27FC +3CE0 +4550 +8A48 +2446 +2BF8 +2208 +23F8 +2208 +23F8 +2A08 +3000 +27FC +0000 +ENDCHAR +STARTCHAR U+9988 +ENCODING 39304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2048 +23FC +3A48 +4BF8 +5040 +8FFE +2008 +23FC +2208 +2248 +2248 +2A48 +30B0 +210C +0604 +ENDCHAR +STARTCHAR U+998A +ENCODING 39306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +20A4 +212E +3D24 +4524 +89AC +2124 +2124 +21FC +2020 +23FC +2088 +2850 +3020 +20D8 +0706 +ENDCHAR +STARTCHAR U+998B +ENCODING 39307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2080 +20F0 +3920 +4BF8 +5648 +8248 +23F8 +20A2 +2122 +261E +20C0 +2830 +3180 +2060 +0010 +ENDCHAR +STARTCHAR U+998D +ENCODING 39309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2114 +27FE +3910 +4910 +93F8 +0208 +23F8 +2208 +23F8 +2000 +27FE +28A0 +3110 +220E +0C04 +ENDCHAR +STARTCHAR U+998F +ENCODING 39311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2084 +277E +2424 +3D24 +4CA4 +5524 +8654 +2088 +27FC +2444 +2444 +27FC +2C44 +3444 +27FC +0404 +ENDCHAR +STARTCHAR U+9990 +ENCODING 39312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +20A0 +27FC +3840 +4BFC +9040 +0FFE +2088 +21FC +2148 +2248 +2BF8 +3488 +2888 +17FE +0000 +ENDCHAR +STARTCHAR U+9991 +ENCODING 39313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2110 +2114 +27FE +3910 +49F0 +9040 +03F8 +2248 +23F8 +2040 +27FC +2040 +2BF8 +3040 +2FFE +0000 +ENDCHAR +STARTCHAR U+9992 +ENCODING 39314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +23FC +2204 +23FC +3A04 +2BFC +4800 +57FE +8492 +27FE +2000 +23FC +2108 +2890 +3060 +219E +0604 +ENDCHAR +STARTCHAR U+9993 +ENCODING 39315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2288 +2288 +2288 +3FD0 +4A9E +92A4 +0FF4 +2014 +27D4 +2454 +27C8 +2448 +2FD4 +3454 +2564 +0482 +ENDCHAR +STARTCHAR U+9994 +ENCODING 39316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +27BE +24A4 +3CA4 +4FBC +9420 +04A4 +27BC +2110 +27FC +2110 +2114 +2FFE +3110 +220C +0404 +ENDCHAR +STARTCHAR U+9995 +ENCODING 39317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2FFE +2040 +3BF8 +4A48 +97FE +0512 +2BFC +2110 +23F8 +2110 +27FE +2948 +3330 +2D8E +0104 +ENDCHAR +STARTCHAR U+9996 +ENCODING 39318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0440 +7FFC +0100 +0200 +1FF0 +1010 +1FF0 +1010 +1FF0 +1010 +1010 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+9997 +ENCODING 39319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0850 +09FC +0840 +7EF8 +0A88 +0AF8 +0A88 +0AF8 +0A88 +12F8 +128C +2204 +41FC +0000 +ENDCHAR +STARTCHAR U+9998 +ENCODING 39320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2430 +1428 +1828 +7FFC +0820 +11E8 +3D68 +2568 +3DD0 +2510 +3C74 +27AC +3C4C +2484 +0000 +ENDCHAR +STARTCHAR U+9999 +ENCODING 39321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +7FFC +0380 +0540 +1930 +6FEC +0820 +0FE0 +0820 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+999B +ENCODING 39323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0630 +3C38 +0868 +3FFE +1C60 +2E64 +086C +3E6C +24D8 +2498 +24B8 +256C +3EC6 +2700 +0000 +ENDCHAR +STARTCHAR U+999C +ENCODING 39324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +017F +7E41 +0841 +7F7F +0840 +1C50 +6B50 +0850 +085E +3E50 +2250 +3E51 +2291 +3E1F +0000 +0000 +ENDCHAR +STARTCHAR U+999D +ENCODING 39325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0620 +3812 +080A +7F02 +1C24 +2A24 +2924 +4824 +3E28 +22AA +22B1 +3EB1 +2222 +2222 +3E7E +2280 +ENDCHAR +STARTCHAR U+999E +ENCODING 39326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +3E7F +0808 +08FF +7F81 +1C81 +2A3E +4904 +0008 +3E7F +2204 +3E04 +2224 +3E18 +0000 +0000 +ENDCHAR +STARTCHAR U+999F +ENCODING 39327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +0EF0 +794C +0FA8 +7C88 +1EF8 +2B90 +6E60 +3CFE +3FE0 +3C30 +3C30 +3C60 +0060 +0000 +ENDCHAR +STARTCHAR U+99A1 +ENCODING 39329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0214 +3C14 +0877 +7F14 +2A14 +4977 +0814 +3E14 +2277 +2214 +3E14 +2214 +2224 +3E44 +0000 +0000 +ENDCHAR +STARTCHAR U+99A3 +ENCODING 39331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +3CFE +0828 +7F44 +2A92 +497D +0854 +3E7C +2254 +227C +3E10 +2210 +2210 +3E0F +0000 +0000 +ENDCHAR +STARTCHAR U+99A5 +ENCODING 39333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0680 +3880 +08FC +7FF8 +1C88 +1AF8 +2A88 +48F8 +3E40 +22F8 +3F90 +2260 +3EF0 +230C +0000 +ENDCHAR +STARTCHAR U+99A6 +ENCODING 39334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0122 +7E14 +087F +7F14 +1C7F +2A15 +497F +0815 +3E7F +2214 +3E36 +2255 +3E14 +2214 +0000 +0000 +ENDCHAR +STARTCHAR U+99A7 +ENCODING 39335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7E7C +0854 +7F54 +1C6C +2A44 +497C +3E00 +22FE +22AA +3EAA +22AA +22AA +3FFF +0000 +0000 +ENDCHAR +STARTCHAR U+99A8 +ENCODING 39336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +7F54 +3E9C +3EF0 +2A50 +3E70 +27CC +4100 +7FFC +0540 +1FF0 +67CC +0440 +07C0 +0000 +ENDCHAR +STARTCHAR U+99AB +ENCODING 39339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +07E0 +0080 +1FFC +0888 +17F4 +07D0 +07F0 +3E3E +0808 +7F7F +2A2A +7F7F +3A3A +3E3E +0000 +0000 +ENDCHAR +STARTCHAR U+99AC +ENCODING 39340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +1100 +1FF0 +1100 +1FF0 +1100 +1FFC +0004 +0924 +2494 +2404 +2004 +4038 +0000 +ENDCHAR +STARTCHAR U+99AD +ENCODING 39341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2488 +3E88 +2488 +3E50 +2450 +3F70 +0520 +3B20 +2F50 +2D50 +4288 +0D04 +0000 +ENDCHAR +STARTCHAR U+99AE +ENCODING 39342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03F8 +2240 +13F0 +1240 +03F0 +0A40 +0BFC +1024 +1694 +2554 +2544 +2808 +0030 +0000 +ENDCHAR +STARTCHAR U+99AF +ENCODING 39343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F3E +4408 +4408 +7F08 +4408 +7F7F +4408 +4408 +7F88 +2488 +2488 +5A88 +0088 +0708 +0000 +0000 +ENDCHAR +STARTCHAR U+99B0 +ENCODING 39344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F20 +4420 +443F +7F21 +4441 +7F01 +4411 +4409 +7F85 +2481 +2481 +5A81 +008A +0704 +0000 +0000 +ENDCHAR +STARTCHAR U+99B1 +ENCODING 39345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7E10 +4810 +4810 +7E10 +48FE +7E10 +4810 +4810 +7F10 +4528 +0B28 +2524 +5144 +4242 +4C81 +ENDCHAR +STARTCHAR U+99B2 +ENCODING 39346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F01 +447F +4410 +7F10 +4410 +7F10 +447F +4410 +7F90 +2490 +2490 +5A91 +0091 +071F +0000 +0000 +ENDCHAR +STARTCHAR U+99B3 +ENCODING 39347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FA0 +28A8 +3EB8 +28E8 +3FA8 +28A8 +3EA8 +0AA8 +3EB8 +3EA0 +3284 +4284 +0C7C +0000 +ENDCHAR +STARTCHAR U+99B4 +ENCODING 39348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F88 +28A8 +3EA8 +28A8 +3EA8 +28A8 +3EA8 +0AA8 +3EA8 +3EA8 +32A8 +4508 +1A08 +0000 +ENDCHAR +STARTCHAR U+99B5 +ENCODING 39349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFE +1040 +1FFE +1040 +1FFE +1040 +1FFF +4921 +4921 +000E +0410 +7FFF +0410 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+99B9 +ENCODING 39353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3F3E +2422 +2422 +3F22 +2422 +3F22 +243E +2422 +3FA2 +22A2 +09A2 +24A2 +10BE +4122 +4620 +ENDCHAR +STARTCHAR U+99BA +ENCODING 39354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +48FF +4821 +7F21 +4822 +7F24 +482F +4821 +7F21 +2531 +254A +5B84 +010A +0731 +0000 +0000 +ENDCHAR +STARTCHAR U+99BB +ENCODING 39355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F08 +4808 +4810 +7E20 +4841 +7EFF +4825 +4824 +7F24 +0124 +2524 +2525 +5B45 +0687 +0000 +0000 +ENDCHAR +STARTCHAR U+99BC +ENCODING 39356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +2820 +3FFC +2888 +3E88 +2888 +3E50 +0A50 +3E30 +3E20 +3250 +4288 +0D04 +0000 +ENDCHAR +STARTCHAR U+99BD +ENCODING 39357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF8 +0840 +0FF8 +0840 +0FF8 +0840 +0FFE +2492 +0080 +1FFC +1084 +1FFC +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+99BF +ENCODING 39359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3F02 +3C1F +3E78 +3C42 +3E7F +3C42 +3C42 +3F46 +06C6 +1EC0 +3E80 +3A80 +2680 +0D00 +0000 +ENDCHAR +STARTCHAR U+99C1 +ENCODING 39361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F08 +28D0 +3E30 +2828 +3E44 +2888 +3F48 +0A50 +3E30 +3A20 +3250 +4288 +0D04 +0000 +ENDCHAR +STARTCHAR U+99C2 +ENCODING 39362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +40FF +4088 +7CFE +4088 +40FE +7C88 +10FF +1001 +7D55 +1155 +1155 +1001 +1001 +1006 +0000 +0000 +ENDCHAR +STARTCHAR U+99C3 +ENCODING 39363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F10 +4810 +4810 +7F7E +4812 +7F12 +4812 +48FF +7F10 +2510 +2528 +5B44 +0182 +0701 +0000 +0000 +ENDCHAR +STARTCHAR U+99C4 +ENCODING 39364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +2820 +3E20 +29FC +3E20 +2820 +3E70 +0A50 +3E50 +3EC8 +32A8 +4524 +1A04 +0000 +ENDCHAR +STARTCHAR U+99C5 +ENCODING 39365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2888 +3E88 +2888 +3EF8 +28A8 +3EA0 +0AA0 +3E90 +3A90 +3308 +4508 +1A04 +0000 +ENDCHAR +STARTCHAR U+99C6 +ENCODING 39366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2888 +3E88 +28C8 +3EB0 +2890 +3E90 +0AA8 +3EA8 +3EC0 +3280 +42FC +0C80 +0000 +ENDCHAR +STARTCHAR U+99C7 +ENCODING 39367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F88 +2208 +2208 +3F9F +2220 +2202 +3F92 +2212 +2212 +3FD2 +004A +5544 +554A +00D1 +0000 +0000 +ENDCHAR +STARTCHAR U+99C8 +ENCODING 39368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3F10 +28E0 +3E80 +2880 +3EFC +2890 +3E90 +0A90 +3E90 +3E90 +3290 +43FC +0C00 +0000 +ENDCHAR +STARTCHAR U+99C9 +ENCODING 39369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7EFF +4881 +4881 +7E81 +48BD +7EA5 +48A5 +48A5 +7EA5 +2ABD +2AA5 +5681 +0281 +0C83 +0000 +0000 +ENDCHAR +STARTCHAR U+99CB +ENCODING 39371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4811 +4811 +7E11 +4811 +7E22 +484C +4800 +7F7F +2541 +2541 +5B41 +017F +0E41 +0000 +0000 +ENDCHAR +STARTCHAR U+99CC +ENCODING 39372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F7E +2142 +5244 +0C41 +387F +1FF8 +1080 +1FF8 +1080 +1FF8 +1080 +1FFE +2492 +2496 +0000 +0000 +ENDCHAR +STARTCHAR U+99CD +ENCODING 39373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4808 +4808 +7E49 +4849 +7E2A +4808 +487F +7F08 +2508 +2508 +5B08 +0108 +0E08 +0000 +0000 +ENDCHAR +STARTCHAR U+99CE +ENCODING 39374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +4808 +4808 +7E08 +487F +7E49 +4849 +4849 +7F7F +2549 +2549 +5B49 +017F +0E41 +0000 +0000 +ENDCHAR +STARTCHAR U+99CF +ENCODING 39375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +487F +4840 +7E40 +4840 +7E7F +4841 +4841 +7F41 +257F +2540 +5B40 +0140 +0E7F +0000 +0000 +ENDCHAR +STARTCHAR U+99D0 +ENCODING 39376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3F20 +2820 +3FFC +2820 +3E20 +2820 +3EF8 +0A20 +3E20 +3E20 +3220 +43FC +0C00 +0000 +ENDCHAR +STARTCHAR U+99D1 +ENCODING 39377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7EF8 +1248 +3A30 +0CC8 +77F4 +0480 +07E0 +07E0 +0480 +07F8 +1548 +12A8 +2030 +0000 +ENDCHAR +STARTCHAR U+99D2 +ENCODING 39378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3F40 +2840 +3EF8 +2888 +3FE8 +28A8 +3EA8 +0AE8 +3EA8 +3E08 +3208 +4208 +0C30 +0000 +ENDCHAR +STARTCHAR U+99D3 +ENCODING 39379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +487F +4808 +7F08 +4808 +7F10 +4828 +484A +7F09 +2508 +2508 +5B08 +0108 +0E7F +0000 +0000 +ENDCHAR +STARTCHAR U+99D4 +ENCODING 39380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +483E +4822 +7E22 +4822 +7E3E +4822 +4822 +7F22 +253E +2522 +5B22 +0122 +0E7F +0000 +0000 +ENDCHAR +STARTCHAR U+99D5 +ENCODING 39381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7EF8 +1288 +12F8 +2688 +5FF0 +1100 +1FE0 +1FE0 +1100 +1FF8 +2A48 +2528 +4030 +0000 +ENDCHAR +STARTCHAR U+99D6 +ENCODING 39382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +4808 +4814 +7E22 +4841 +7E1C +4800 +4800 +7F7F +2501 +2502 +5B14 +0108 +0E08 +0000 +0000 +ENDCHAR +STARTCHAR U+99D7 +ENCODING 39383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F00 +4808 +4808 +7E14 +4822 +7E45 +4808 +4832 +7F04 +2508 +2571 +5B02 +0104 +0E78 +0000 +0000 +ENDCHAR +STARTCHAR U+99D8 +ENCODING 39384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +2820 +3E20 +2850 +3E48 +29F4 +3E04 +0AF8 +3E88 +3E88 +3288 +42F8 +0C88 +0000 +ENDCHAR +STARTCHAR U+99D9 +ENCODING 39385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0024 +7E24 +5044 +5044 +7EFF +5144 +5044 +7E54 +504C +5044 +7F44 +4544 +0B44 +1544 +5144 +464C +ENDCHAR +STARTCHAR U+99DA +ENCODING 39386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +7E60 +6860 +7C68 +79F8 +7D68 +7958 +7F7E +07F0 +7E60 +7490 +4590 +1D0C +0E0E +0000 +ENDCHAR +STARTCHAR U+99DB +ENCODING 39387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +2820 +3EF8 +28A8 +3EA8 +28A8 +3EF8 +0BA8 +3EA0 +3E40 +3260 +4298 +0D04 +0000 +ENDCHAR +STARTCHAR U+99DC +ENCODING 39388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E00 +4808 +4808 +7E25 +48A1 +7EA1 +48A0 +48A4 +7EA4 +2A28 +2A30 +5620 +0261 +1C9F +0000 +0000 +ENDCHAR +STARTCHAR U+99DD +ENCODING 39389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +2820 +3EFC +2888 +3F40 +2840 +3E4C +0A70 +3E40 +3E40 +3240 +4244 +0C3C +0000 +ENDCHAR +STARTCHAR U+99DE +ENCODING 39390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E60 +28C6 +3EC0 +2890 +3ED0 +285E +3FF6 +2254 +0E54 +1E54 +3A50 +2652 +0C7E +0800 +ENDCHAR +STARTCHAR U+99DF +ENCODING 39391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2968 +3D68 +2968 +3D68 +2968 +3F78 +0BB8 +3F98 +3F08 +3308 +45F8 +1908 +0000 +ENDCHAR +STARTCHAR U+99E2 +ENCODING 39394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0088 +3F48 +2850 +3FFC +2850 +3E50 +2850 +3FFC +0A50 +3E50 +3E90 +3290 +4510 +1A10 +0000 +ENDCHAR +STARTCHAR U+99E3 +ENCODING 39395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E08 +4828 +7E2A +48AC +4868 +7E28 +4828 +486C +7FAA +2528 +2528 +5B48 +0189 +0E0F +0000 +0000 +ENDCHAR +STARTCHAR U+99E4 +ENCODING 39396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E00 +487F +7E08 +4810 +4822 +7E7F +4801 +4808 +7F08 +253E +2508 +5B08 +0108 +0E7F +0000 +0000 +ENDCHAR +STARTCHAR U+99E5 +ENCODING 39397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E04 +4805 +7EFF +4844 +4844 +7E74 +48C5 +4845 +7F46 +2544 +254C +5B55 +0183 +0E01 +0000 +0000 +ENDCHAR +STARTCHAR U+99E7 +ENCODING 39399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7F +4841 +7E41 +487F +4841 +7E5D +4855 +4855 +7F55 +255D +2555 +5B41 +0143 +0E41 +0000 +0000 +ENDCHAR +STARTCHAR U+99E9 +ENCODING 39401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E08 +4814 +7E22 +4841 +4880 +7E3E +4808 +4808 +7F08 +253E +2508 +5B08 +0108 +0E7F +0000 +0000 +ENDCHAR +STARTCHAR U+99EA +ENCODING 39402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E48 +4848 +7E7E +4888 +4808 +7E08 +48FF +4824 +7F24 +2524 +2524 +5B25 +0145 +0E87 +0000 +0000 +ENDCHAR +STARTCHAR U+99EB +ENCODING 39403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2410 +3816 +3CD4 +3854 +2858 +39FE +2868 +3E68 +0648 +0E48 +3E48 +76CA +648A +1D0E +0800 +ENDCHAR +STARTCHAR U+99EC +ENCODING 39404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E00 +487F +7E22 +4822 +483E +7E22 +4822 +483E +7F22 +2522 +257F +5B02 +0102 +0E02 +0000 +0000 +ENDCHAR +STARTCHAR U+99ED +ENCODING 39405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +29FC +3E40 +2850 +3F90 +2860 +3E28 +0A48 +3E90 +3E10 +3228 +44C4 +1B04 +0000 +ENDCHAR +STARTCHAR U+99EE +ENCODING 39406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +29FC +3E50 +2848 +3E94 +2954 +3E50 +0A60 +3E20 +3E20 +3250 +4288 +0D04 +0000 +ENDCHAR +STARTCHAR U+99F0 +ENCODING 39408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7F +4841 +7E49 +4849 +485D +7E49 +4849 +4849 +7F49 +2555 +2563 +5B41 +0141 +0E7F +0000 +0000 +ENDCHAR +STARTCHAR U+99F1 +ENCODING 39409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3F40 +2878 +3E88 +28D0 +3F20 +2850 +3E88 +0BFC +3E88 +3E88 +3288 +42F8 +0C88 +0000 +ENDCHAR +STARTCHAR U+99F2 +ENCODING 39410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3E88 +28A8 +3CA8 +28A8 +3CF8 +29F8 +3FA8 +0AA8 +3EA8 +3EA8 +3328 +4528 +1A08 +0000 +ENDCHAR +STARTCHAR U+99F4 +ENCODING 39412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E04 +4805 +4804 +7EFF +4804 +7E54 +4854 +48FD +7F55 +2556 +2554 +5B4D +0153 +0E81 +0000 +0000 +ENDCHAR +STARTCHAR U+99F5 +ENCODING 39413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0402 +39F8 +2870 +3870 +287A +3DFB +2972 +3F72 +23DE +0E50 +1ED0 +3690 +6410 +1C10 +0810 +ENDCHAR +STARTCHAR U+99F6 +ENCODING 39414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4842 +4842 +7E7E +4840 +7E7F +4841 +485D +7F55 +2555 +255D +5B41 +0141 +0E8E +0000 +0000 +ENDCHAR +STARTCHAR U+99F7 +ENCODING 39415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +48FE +4810 +7E10 +48FE +7E92 +4892 +48FE +7F10 +2538 +2554 +5B92 +0111 +0E10 +0000 +0000 +ENDCHAR +STARTCHAR U+99F8 +ENCODING 39416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2808 +3FFC +2808 +3EF8 +2800 +3FFC +0B08 +3EF8 +3E50 +3220 +44D0 +1B0C +0000 +ENDCHAR +STARTCHAR U+99F9 +ENCODING 39417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E44 +4842 +49FF +7E42 +4844 +7E49 +4842 +4854 +7F59 +2552 +2554 +5B59 +0151 +0E8F +0000 +0000 +ENDCHAR +STARTCHAR U+99FA +ENCODING 39418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +4808 +487E +7E42 +487E +7E42 +487E +4840 +7F52 +2554 +2548 +5B54 +0163 +0EC0 +0000 +0000 +ENDCHAR +STARTCHAR U+99FB +ENCODING 39419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2888 +3EF8 +2888 +3EF8 +2800 +3EF8 +0A20 +3FFC +3E20 +3220 +4220 +0C20 +0000 +ENDCHAR +STARTCHAR U+99FC +ENCODING 39420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +4828 +4844 +7E82 +4901 +7E7C +4810 +48FF +7F10 +2538 +2554 +5B92 +0111 +0E30 +0000 +0000 +ENDCHAR +STARTCHAR U+99FD +ENCODING 39421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E3F +4821 +4821 +7E3F +4800 +7E3F +4821 +483F +7F21 +253F +2521 +5B21 +0123 +0E41 +0000 +0000 +ENDCHAR +STARTCHAR U+99FE +ENCODING 39422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E28 +4844 +4883 +7E00 +487C +7E44 +4844 +4844 +7F7C +2528 +2528 +5B29 +0149 +0E8F +0000 +0000 +ENDCHAR +STARTCHAR U+99FF +ENCODING 39423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F30 +2848 +3FF4 +2850 +3E54 +28CC +3F78 +0A48 +3ED0 +3F30 +3230 +44C8 +1B04 +0000 +ENDCHAR +STARTCHAR U+9A01 +ENCODING 39425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FF8 +28A8 +3EF8 +28A8 +3EF8 +2800 +3FFC +0A40 +3E78 +3E88 +3208 +4208 +0C30 +0000 +ENDCHAR +STARTCHAR U+9A02 +ENCODING 39426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E08 +4808 +487F +7E00 +4822 +7E22 +4814 +48FF +7F08 +2508 +257F +5B08 +0108 +0E08 +0000 +0000 +ENDCHAR +STARTCHAR U+9A03 +ENCODING 39427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E08 +4810 +4820 +7E42 +48FF +7E20 +483E +4848 +7F08 +257F +2508 +5B14 +0122 +0E41 +0000 +0000 +ENDCHAR +STARTCHAR U+9A04 +ENCODING 39428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +483E +48C2 +7E14 +4808 +7FFF +4810 +4892 +7F54 +2538 +2538 +5B54 +0192 +0E31 +0000 +0000 +ENDCHAR +STARTCHAR U+9A05 +ENCODING 39429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +3F48 +2850 +3EFC +2890 +3F90 +28F8 +3E90 +0A90 +3EF8 +3E90 +3290 +42FC +0C80 +0000 +ENDCHAR +STARTCHAR U+9A06 +ENCODING 39430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7F +4841 +4849 +7E5D +4849 +7E7F +4841 +485D +7F55 +2555 +255D +5B41 +0143 +0F81 +0000 +0000 +ENDCHAR +STARTCHAR U+9A07 +ENCODING 39431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +4828 +4844 +7E82 +497D +7E10 +4810 +48FE +7F10 +257C +2544 +5B44 +0144 +0E7C +0000 +0000 +ENDCHAR +STARTCHAR U+9A08 +ENCODING 39432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E22 +5022 +5044 +7FFF +5044 +5044 +7E44 +5044 +5074 +7FDF +4A44 +0644 +1244 +4A84 +A284 +8D04 +ENDCHAR +STARTCHAR U+9A09 +ENCODING 39433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4842 +487E +7E42 +487E +7E00 +4844 +4844 +7F45 +2576 +2544 +5B45 +0145 +0F73 +0000 +0000 +ENDCHAR +STARTCHAR U+9A0A +ENCODING 39434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E40 +4840 +487F +7E81 +4821 +7E7D +4891 +4811 +7F7D +2511 +2555 +5B7D +0101 +0E0E +0000 +0000 +ENDCHAR +STARTCHAR U+9A0B +ENCODING 39435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +4810 +48FE +7E10 +4854 +7E54 +4854 +48BA +7F10 +2538 +2554 +5B92 +0111 +0E10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A0C +ENCODING 39436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E20 +3C30 +2DFE +3F0C +2C08 +3CF8 +2800 +3E04 +26FC +0EA0 +1FAC +3724 +2526 +0C20 +0000 +ENDCHAR +STARTCHAR U+9A0D +ENCODING 39437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7EFE +4892 +48FE +7E92 +48FE +7E10 +4810 +48FE +7F10 +2538 +2554 +5B92 +0111 +0E10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A0E +ENCODING 39438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +29FC +3E20 +2850 +3E88 +29FC +3E08 +0AE8 +3EA8 +3EE8 +32A8 +4208 +0C18 +0000 +ENDCHAR +STARTCHAR U+9A0F +ENCODING 39439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0048 +3F48 +2848 +3EFC +2848 +3E78 +2848 +3E78 +0A48 +3FFC +3E50 +3248 +4284 +0D04 +0000 +ENDCHAR +STARTCHAR U+9A10 +ENCODING 39440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2660 +3860 +2C50 +3CD8 +28FC +3F06 +29FC +3E18 +2610 +0EF0 +3ED4 +77C6 +67CE +1F78 +0800 +ENDCHAR +STARTCHAR U+9A11 +ENCODING 39441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E14 +4814 +4814 +7E77 +4814 +7E14 +4877 +4814 +7F14 +2577 +2514 +5B14 +0114 +0E24 +0000 +0000 +ENDCHAR +STARTCHAR U+9A12 +ENCODING 39442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2888 +3E50 +2870 +3FAC +2820 +3EF8 +0AA8 +3EF8 +3EA8 +3228 +423C +0DC4 +0000 +ENDCHAR +STARTCHAR U+9A13 +ENCODING 39443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +2850 +3E88 +29FC +3E20 +28F8 +3EA8 +0AA8 +3EF8 +3E60 +3250 +4288 +0D04 +0000 +ENDCHAR +STARTCHAR U+9A14 +ENCODING 39444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C7E +4842 +487E +7C42 +487E +7C80 +48FF +4909 +7E89 +2A95 +2AA3 +5681 +02F9 +1C0E +0000 +0000 +ENDCHAR +STARTCHAR U+9A15 +ENCODING 39445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4828 +49FF +7D29 +4929 +7DFF +4820 +4824 +7EFF +2A24 +2A24 +5618 +0218 +1CE7 +0000 +0000 +ENDCHAR +STARTCHAR U+9A16 +ENCODING 39446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E40 +0440 +1C7E +7FA8 +2910 +482E +1FF8 +1FF0 +1FF0 +1100 +1FFE +2522 +2522 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+9A19 +ENCODING 39449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2800 +3EF8 +2888 +3EF8 +2880 +3EFC +0AB4 +3FFC +3FB4 +32B4 +42B4 +0C8C +0000 +ENDCHAR +STARTCHAR U+9A1A +ENCODING 39450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C44 +4828 +49FF +7C00 +48F1 +7C95 +4895 +48F5 +7E95 +2AF5 +2A91 +5691 +0293 +0D31 +0000 +0000 +ENDCHAR +STARTCHAR U+9A1B +ENCODING 39451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFC +4815 +4836 +7DD5 +4855 +7C53 +49FD +4856 +7E55 +2A54 +2A55 +5693 +0311 +1C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A1C +ENCODING 39452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C40 +48FE +4942 +7C7E +4842 +7C7E +4800 +48FF +7E08 +2A08 +2A7E +5608 +0208 +1CFF +0000 +0000 +ENDCHAR +STARTCHAR U+9A1D +ENCODING 39453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C08 +483E +498A +7CBF +488A +7C8A +493E +4888 +7EBE +2A88 +2ABE +5788 +0280 +1D7F +0000 +0000 +ENDCHAR +STARTCHAR U+9A1E +ENCODING 39454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C12 +48FC +4810 +7CFE +4810 +7DFF +4810 +49FF +7E20 +2A40 +2AFE +5742 +0242 +1C7E +0000 +0000 +ENDCHAR +STARTCHAR U+9A20 +ENCODING 39456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C7C +4844 +487C +7C44 +487C +7C00 +49FF +4810 +7E10 +2A5E +2A50 +5650 +02B0 +1D1F +0000 +0000 +ENDCHAR +STARTCHAR U+9A22 +ENCODING 39458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C00 +48EF +48A1 +7CA1 +48E6 +7C80 +488F +48E1 +7E89 +2A89 +2AEA +5684 +028A +1C91 +0000 +0000 +ENDCHAR +STARTCHAR U+9A23 +ENCODING 39459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C44 +48AA +4892 +7CAA +4882 +7CFE +4844 +48A2 +7F21 +2A7E +2AA4 +5618 +0218 +1CE7 +0000 +0000 +ENDCHAR +STARTCHAR U+9A24 +ENCODING 39460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CE9 +4A2A +4945 +7C82 +4901 +7C7C +4810 +4810 +7EFE +2A10 +2A10 +5628 +0244 +1C83 +0000 +0000 +ENDCHAR +STARTCHAR U+9A25 +ENCODING 39461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C7C +5004 +5028 +7DFF +5049 +7C8A +5030 +5000 +7E10 +2BFF +2A54 +5692 +0311 +0C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A27 +ENCODING 39463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C7E +4842 +485E +7C52 +4852 +7CFF +4881 +48BD +7EA5 +2AA5 +2AA5 +56BD +0281 +1C83 +0000 +0000 +ENDCHAR +STARTCHAR U+9A28 +ENCODING 39464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0044 +3F24 +28A8 +3E90 +28F8 +3EA8 +28F8 +3EA8 +0AF8 +3E20 +3FFC +3220 +4220 +0C20 +0000 +ENDCHAR +STARTCHAR U+9A29 +ENCODING 39465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E20 +4840 +48FE +7E92 +4892 +7EFE +4892 +4892 +7EFE +2A48 +2A4A +564F +0289 +0D07 +0000 +0000 +ENDCHAR +STARTCHAR U+9A2A +ENCODING 39466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E00 +4856 +4891 +7E91 +48D7 +7E91 +48D7 +4810 +7E7E +2A04 +2A68 +5610 +0228 +0CC7 +0000 +0000 +ENDCHAR +STARTCHAR U+9A2B +ENCODING 39467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3FFC +2288 +7FF8 +1FE0 +0280 +7FFC +0FF0 +17D0 +67CC +0500 +07F0 +1A90 +2560 +0000 +ENDCHAR +STARTCHAR U+9A2C +ENCODING 39468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E02 +48FC +4810 +7EFF +4854 +7ED6 +4854 +48D7 +7E10 +2A38 +2A54 +5692 +0211 +0C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A2D +ENCODING 39469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +245E +2850 +24FF +3292 +2C14 +21F8 +0FF8 +0840 +0FF8 +0FF8 +0FFF +2491 +4496 +0000 +0000 +ENDCHAR +STARTCHAR U+9A2E +ENCODING 39470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E20 +48CF +7E85 +4885 +48A9 +7EC2 +4800 +48FE +7E92 +2A92 +2AFE +5692 +0292 +0CFE +0000 +0000 +ENDCHAR +STARTCHAR U+9A30 +ENCODING 39472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0248 +3950 +2BF8 +28A0 +2FFC +39F0 +2B48 +2DF4 +39F0 +2940 +29FC +2B54 +2AAC +5C18 +0000 +ENDCHAR +STARTCHAR U+9A31 +ENCODING 39473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E01 +48FE +4854 +7E92 +4921 +7E48 +487C +4810 +7E24 +2AFE +2A10 +57FF +0228 +0CC6 +0000 +0000 +ENDCHAR +STARTCHAR U+9A32 +ENCODING 39474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E24 +48FF +4824 +7E00 +487E +7E42 +487E +4842 +7E7E +2A08 +2AFF +5608 +0208 +0C08 +0000 +0000 +ENDCHAR +STARTCHAR U+9A33 +ENCODING 39475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2000 +3FFC +2450 +3F7C +2C50 +3E7C +2DD0 +3FFE +2504 +7FFC +5B7C +430C +0E18 +0418 +0000 +ENDCHAR +STARTCHAR U+9A34 +ENCODING 39476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4842 +487E +7E42 +487E +7E08 +48FF +4891 +7F91 +2524 +25FF +5B24 +0118 +0E26 +0000 +0000 +ENDCHAR +STARTCHAR U+9A35 +ENCODING 39477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7EFF +4888 +7C90 +48BE +7CA2 +48BE +7EA2 +02BE +2A88 +2AAA +56A9 +02C9 +1508 +0810 +0000 +0000 +ENDCHAR +STARTCHAR U+9A36 +ENCODING 39478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3E20 +287F +2891 +3F55 +2A55 +287D +3E45 +2846 +287F +3F91 +2555 +0B7D +2545 +5101 +4606 +ENDCHAR +STARTCHAR U+9A37 +ENCODING 39479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +28A8 +3F50 +28A0 +3E70 +2BAC +3EF8 +0AA8 +3EF8 +3EB0 +3228 +423C +0DC4 +0000 +ENDCHAR +STARTCHAR U+9A38 +ENCODING 39480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E01 +48FE +4880 +7EFE +4882 +7EFE +4880 +48F7 +7E91 +2AB3 +2AD5 +56B3 +02D5 +0D11 +0000 +0000 +ENDCHAR +STARTCHAR U+9A39 +ENCODING 39481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C44 +49FF +4844 +7C7C +4810 +7CFE +4892 +7EFE +0210 +2AFE +2A10 +56FE +0210 +1DFF +0000 +0000 +ENDCHAR +STARTCHAR U+9A3A +ENCODING 39482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3FBC +7FD4 +1134 +7FDD +3F15 +0423 +1FF8 +1080 +1FF8 +1FF8 +1FFE +0AA2 +12AE +0000 +0000 +ENDCHAR +STARTCHAR U+9A3D +ENCODING 39485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DEF +4821 +49ED +7C21 +49ED +7C21 +48C6 +4800 +7E40 +2AFE +2B82 +56FE +0282 +1CFE +0000 +0000 +ENDCHAR +STARTCHAR U+9A3E +ENCODING 39486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +28A8 +3EF8 +28A8 +3EF8 +2850 +3ED0 +0A28 +3FFC +3EA8 +32A4 +4324 +0C20 +0000 +ENDCHAR +STARTCHAR U+9A3F +ENCODING 39487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +49FF +4844 +7C44 +49FF +7CFE +4882 +7EFE +0282 +2AFE +2A10 +57FF +0210 +1C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A40 +ENCODING 39488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +7FFC +0FE0 +0820 +0FE0 +0FE0 +7FFC +07C0 +1D30 +67CC +07C0 +07F8 +1A88 +2570 +0000 +ENDCHAR +STARTCHAR U+9A41 +ENCODING 39489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7F9F +3F64 +7F94 +3F08 +4137 +0300 +1FF8 +1080 +1FF8 +1FF8 +1FFE +0AA2 +12AE +0000 +0000 +ENDCHAR +STARTCHAR U+9A42 +ENCODING 39490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E90 +29F8 +3C90 +2968 +3FFC +2860 +3E90 +0B2C +3EC0 +3E20 +32C8 +4230 +0DC0 +0000 +ENDCHAR +STARTCHAR U+9A43 +ENCODING 39491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2850 +3FFC +2954 +3FFC +2800 +3EF8 +0A00 +3FFC +3EA8 +32A4 +4324 +0C60 +0000 +ENDCHAR +STARTCHAR U+9A44 +ENCODING 39492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C40 +48FE +496A +7C56 +486A +7C56 +4862 +4842 +7E7E +2A10 +2AAA +56A1 +02A2 +1C1E +0000 +0000 +ENDCHAR +STARTCHAR U+9A45 +ENCODING 39493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2900 +3D78 +2948 +3D78 +2900 +3FFC +0BB4 +3FB4 +3FFC +3300 +45FC +1900 +0000 +ENDCHAR +STARTCHAR U+9A46 +ENCODING 39494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFE +4892 +48FE +7C92 +48FE +7C54 +49FF +4854 +7E54 +2BFF +2A10 +56FE +0210 +1C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A47 +ENCODING 39495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +3F7C +0814 +7F54 +2AA5 +5DB5 +0843 +3E81 +0FF8 +0880 +0FF8 +0880 +0FFE +0042 +2922 +490C +ENDCHAR +STARTCHAR U+9A48 +ENCODING 39496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C7E +4804 +4828 +7DFF +4829 +7CC8 +4818 +48FF +7EA5 +2AE7 +2ABD +56A5 +02BD +1C83 +0000 +0000 +ENDCHAR +STARTCHAR U+9A49 +ENCODING 39497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +481E +4810 +7CFF +4891 +7CFE +4890 +489E +7E80 +2A94 +2B55 +5677 +0214 +1C7F +0000 +0000 +ENDCHAR +STARTCHAR U+9A4A +ENCODING 39498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C44 +49FF +4844 +7DFF +4854 +7DFF +4854 +4854 +7FFF +2A10 +2AFE +5610 +0210 +1C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A4B +ENCODING 39499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0008 +3FF8 +2954 +3D88 +2888 +3CFE +2B68 +3FEC +2768 +7DF8 +7470 +44D0 +0DAC +08C4 +0000 +ENDCHAR +STARTCHAR U+9A4C +ENCODING 39500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +48FE +4812 +7DFF +48FE +7C10 +4955 +4955 +7FD7 +2B11 +2BFF +5711 +03D7 +1D55 +0000 +0000 +ENDCHAR +STARTCHAR U+9A4D +ENCODING 39501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FF8 +2820 +3FFC +2888 +3FDC +2888 +3EDC +0B00 +3FFC +3E50 +3250 +4294 +0D0C +0000 +ENDCHAR +STARTCHAR U+9A4E +ENCODING 39502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C92 +4854 +4838 +7DFF +4854 +7C92 +4800 +4842 +7EEF +2B2A +2AAA +566A +024F +1C82 +0000 +0000 +ENDCHAR +STARTCHAR U+9A4F +ENCODING 39503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFE +4882 +48FE +7CBE +4888 +7CFF +4888 +4898 +7E80 +2AF7 +2AA2 +56FF +0322 +1C66 +0000 +0000 +ENDCHAR +STARTCHAR U+9A50 +ENCODING 39504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C48 +4BF8 +480F +7DEA +4932 +7DEA +480A +49FA +7E2A +2A4A +2BFA +5644 +024A +1CD1 +0000 +0000 +ENDCHAR +STARTCHAR U+9A51 +ENCODING 39505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7EFF +4828 +48EE +7EAA +48AA +48EE +7E28 +48FE +4892 +7E92 +02FE +1692 +5292 +42FE +4C82 +ENDCHAR +STARTCHAR U+9A52 +ENCODING 39506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CEE +48AA +48EE +7C00 +48FE +7C92 +48FE +4892 +7EFE +2A10 +2AFE +5610 +0210 +1C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A53 +ENCODING 39507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C82 +4844 +49FF +7D11 +4955 +7D39 +49FF +4800 +7EFE +2A82 +2AFE +5682 +02FE +1C82 +0000 +0000 +ENDCHAR +STARTCHAR U+9A54 +ENCODING 39508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7DFF +4828 +49FF +7D29 +49FF +7CFE +4882 +48FE +7E82 +2AFE +2A10 +57FF +0210 +1C10 +0000 +0000 +ENDCHAR +STARTCHAR U+9A55 +ENCODING 39509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0018 +3FE0 +2820 +3FFC +2850 +3EF8 +2954 +3E70 +0BFC +3F74 +3F54 +3374 +4504 +190C +0000 +ENDCHAR +STARTCHAR U+9A56 +ENCODING 39510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C44 +49F5 +4844 +7DFF +4804 +7DF4 +4914 +49F5 +7E05 +2BF6 +2A4C +57F5 +0243 +1DF9 +0000 +0000 +ENDCHAR +STARTCHAR U+9A57 +ENCODING 39511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +2850 +3E50 +2888 +3FFC +2800 +3FF8 +0B68 +3FF8 +3E90 +32D8 +4524 +1A44 +0000 +ENDCHAR +STARTCHAR U+9A59 +ENCODING 39513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +49FF +48FE +7CBA +48AA +7CBA +48FE +7E7C +0244 +2A7C +2A44 +567C +0200 +1DFF +0000 +0000 +ENDCHAR +STARTCHAR U+9A5A +ENCODING 39514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1440 +7F40 +14FC +3F48 +7A30 +2ACC +3FF0 +0880 +0FE0 +0FE0 +0FF8 +2A48 +2528 +4030 +0000 +ENDCHAR +STARTCHAR U+9A5B +ENCODING 39515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +2954 +3FFC +2820 +3EF8 +2820 +3FFC +0A50 +3FFC +3E20 +32F8 +4220 +0C20 +0000 +ENDCHAR +STARTCHAR U+9A5D +ENCODING 39517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3E3C +28F8 +3E7C +29FC +3FF8 +2AEC +3EE8 +2278 +7E24 +FEF8 +04F0 +0DAC +0C24 +0020 +ENDCHAR +STARTCHAR U+9A5E +ENCODING 39518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E10 +49FF +4901 +7F7D +4858 +7E90 +49FC +4844 +7E7C +0244 +2A7C +5644 +027C +0E82 +0000 +0000 +ENDCHAR +STARTCHAR U+9A5F +ENCODING 39519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FE0 +297C +3DD4 +29C8 +3D54 +2BE4 +3E50 +0A64 +3FB8 +3E70 +32A8 +4324 +0C20 +0000 +ENDCHAR +STARTCHAR U+9A60 +ENCODING 39520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C44 +4844 +49FF +7C44 +487C +7C82 +48BA +49AB +7EAA +2AAA +2BBB +5600 +02A9 +1D29 +0000 +0000 +ENDCHAR +STARTCHAR U+9A62 +ENCODING 39522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E38 +29FC +3F28 +29D8 +3FF8 +29A8 +3FF8 +0BA8 +3FF8 +3FF8 +33E8 +46E8 +19FC +0000 +ENDCHAR +STARTCHAR U+9A64 +ENCODING 39524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FFC +29DC +3F54 +29DC +3E50 +29FC +3EF8 +0A50 +3FFC +3E68 +3390 +44E8 +1984 +0000 +ENDCHAR +STARTCHAR U+9A65 +ENCODING 39525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3FD4 +2858 +3ED4 +294C +3EF8 +28A8 +3EF8 +0AF8 +3E50 +3EF8 +33FC +4248 +0D84 +0000 +ENDCHAR +STARTCHAR U+9A66 +ENCODING 39526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7CFE +4810 +49FF +7D93 +4955 +7C92 +484F +7FF9 +2ACF +2B69 +565F +02C9 +1C4F +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+9A67 +ENCODING 39527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7D48 +53E8 +514F +7D51 +51EB +7C9D +53E9 +7EBF +2FF9 +2CAD +548B +07E1 +188E +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+9A68 +ENCODING 39528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C91 +48FF +4848 +7CFF +4988 +7CFE +48FE +7EFF +2AFF +2AA5 +56FB +02A9 +1CBB +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+9A69 +ENCODING 39529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0050 +3FFC +2850 +3DDC +2954 +3DDC +2850 +3EFC +0B90 +3EF8 +3EF8 +3290 +42FC +0C80 +0000 +ENDCHAR +STARTCHAR U+9A6A +ENCODING 39530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FDC +29DC +3FDC +2954 +3E20 +29FC +3F50 +0BF8 +3F58 +3FFC +33D8 +46F4 +198C +0000 +ENDCHAR +STARTCHAR U+9A6B +ENCODING 39531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +07C0 +07C0 +07F0 +0E90 +1560 +3FFC +28A0 +3EF8 +3EF8 +3FFC +3DF4 +5758 +0000 +ENDCHAR +STARTCHAR U+9A6C +ENCODING 39532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3FF0 +0020 +0820 +0820 +0820 +0820 +0824 +0FFE +0004 +0024 +FFF4 +0004 +0004 +0028 +0010 +ENDCHAR +STARTCHAR U+9A6D +ENCODING 39533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +7E00 +05FC +2404 +2404 +2484 +2484 +2488 +3E88 +0250 +0220 +1E50 +E250 +4288 +148E +0B04 +ENDCHAR +STARTCHAR U+9A6E +ENCODING 39534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E20 +0420 +2420 +2424 +27FE +2420 +2420 +3E20 +0250 +0250 +1A50 +E290 +4288 +150E +0A04 +ENDCHAR +STARTCHAR U+9A6F +ENCODING 39535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +FD24 +0924 +4924 +4924 +4924 +4924 +4924 +7D24 +0524 +1D24 +E524 +4524 +1524 +0A04 +0404 +ENDCHAR +STARTCHAR U+9A70 +ENCODING 39536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FC20 +0920 +4920 +4924 +493E +49E4 +4B24 +7D24 +0524 +0534 +1D28 +E522 +0502 +28FE +1000 +ENDCHAR +STARTCHAR U+9A71 +ENCODING 39537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FDFE +0900 +4944 +4944 +4928 +4928 +4910 +7D10 +0528 +0528 +1D44 +E584 +4500 +15FE +0800 +ENDCHAR +STARTCHAR U+9A73 +ENCODING 39539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +7F08 +0488 +2450 +2420 +2450 +2488 +2508 +3E04 +028C +0250 +1E20 +E250 +428E +0B04 +0400 +ENDCHAR +STARTCHAR U+9A74 +ENCODING 39540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC24 +09FE +4904 +4904 +4904 +4904 +49FC +7D04 +0500 +0500 +1D00 +E500 +0500 +2A00 +1400 +ENDCHAR +STARTCHAR U+9A75 +ENCODING 39541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +FDFC +0908 +4908 +4908 +49F8 +4908 +4908 +7D08 +05F8 +0508 +1D08 +E508 +0508 +17FE +0800 +ENDCHAR +STARTCHAR U+9A76 +ENCODING 39542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FC20 +0824 +49FE +4924 +4924 +4924 +4924 +7DFC +0420 +04A0 +1C40 +E460 +4490 +150E +0A04 +ENDCHAR +STARTCHAR U+9A77 +ENCODING 39543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +FC04 +09FE +4954 +4954 +4954 +4954 +4954 +7D54 +0554 +059C +1D04 +E504 +05FC +1504 +0800 +ENDCHAR +STARTCHAR U+9A78 +ENCODING 39544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +FC88 +0888 +4908 +4908 +4BFE +4D08 +4948 +7D28 +0528 +0508 +1D08 +E508 +0508 +1528 +0910 +ENDCHAR +STARTCHAR U+9A79 +ENCODING 39545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +FC80 +0904 +49FE +4A04 +4C24 +49F4 +4924 +4924 +7D24 +0524 +1DE4 +E524 +0404 +2814 +1008 +ENDCHAR +STARTCHAR U+9A7A +ENCODING 39546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +FC80 +08F8 +4908 +4A10 +4824 +4BFE +4804 +7C04 +0404 +05FC +1C04 +E404 +0404 +17FC +0804 +ENDCHAR +STARTCHAR U+9A7B +ENCODING 39547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC20 +0824 +4BFE +4820 +4820 +4820 +4828 +7DFC +0420 +0420 +1C20 +E420 +4424 +17FE +0800 +ENDCHAR +STARTCHAR U+9A7C +ENCODING 39548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E20 +0400 +25FE +2502 +2604 +2480 +2488 +3E90 +02E0 +0280 +1A80 +E282 +4282 +147E +0800 +ENDCHAR +STARTCHAR U+9A7D +ENCODING 39549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +FEFC +1208 +3450 +0C20 +32D8 +C106 +1FE0 +0020 +0824 +0FFE +0004 +7FF4 +0014 +0008 +ENDCHAR +STARTCHAR U+9A7E +ENCODING 39550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1004 +7F7E +1144 +1144 +257C +4244 +9FE0 +0020 +0820 +0824 +0FFE +0004 +7FC4 +0014 +0008 +ENDCHAR +STARTCHAR U+9A7F +ENCODING 39551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +FDFC +0888 +4850 +4820 +4850 +488E +4B24 +7C20 +05FC +0420 +1C24 +E7FE +0420 +1420 +0820 +ENDCHAR +STARTCHAR U+9A80 +ENCODING 39552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FC20 +0840 +4888 +4904 +4BFE +4800 +4804 +7DFE +0504 +0504 +1D04 +E504 +0504 +15FC +0904 +ENDCHAR +STARTCHAR U+9A81 +ENCODING 39553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +FC80 +08BC +4BC0 +4850 +4824 +48D4 +4B0C +7C00 +07FC +0490 +1C90 +E490 +0512 +1512 +0A0E +ENDCHAR +STARTCHAR U+9A82 +ENCODING 39554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7EFC +4284 +4284 +7EFC +0020 +3FF0 +0020 +0820 +0820 +0824 +0FFE +0004 +0024 +FFF4 +0014 +0008 +ENDCHAR +STARTCHAR U+9A84 +ENCODING 39556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +080C +FDF0 +0820 +4824 +4BFE +4850 +4888 +4906 +7E8C +0488 +1C88 +E488 +4488 +1488 +0908 +0208 +ENDCHAR +STARTCHAR U+9A85 +ENCODING 39557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08A0 +FCA0 +0924 +4928 +4B30 +4D60 +49A2 +491E +7D20 +0424 +07FE +1C20 +E420 +0420 +1420 +0820 +ENDCHAR +STARTCHAR U+9A86 +ENCODING 39558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +FC80 +08FC +4904 +4A88 +4850 +4820 +4850 +7D8E +07FC +0504 +1D04 +E504 +4504 +15FC +0904 +ENDCHAR +STARTCHAR U+9A87 +ENCODING 39559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +FC40 +0844 +4FFE +4840 +4880 +4908 +4BF8 +7D10 +0424 +044C +1D90 +E620 +4458 +158C +0A04 +ENDCHAR +STARTCHAR U+9A88 +ENCODING 39560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0904 +FC88 +0850 +4BFE +4888 +4888 +4888 +4888 +7FFE +0488 +0488 +1C88 +E488 +0488 +1508 +0A08 +ENDCHAR +STARTCHAR U+9A8A +ENCODING 39562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FBFE +0800 +4800 +49DC +4954 +4954 +4954 +7DDC +0554 +0554 +1D54 +E554 +0554 +1554 +0800 +ENDCHAR +STARTCHAR U+9A8B +ENCODING 39563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FC24 +09FE +4924 +49FC +4924 +49FC +4804 +7FFE +0480 +05FC +1C04 +E404 +4404 +1428 +0810 +ENDCHAR +STARTCHAR U+9A8C +ENCODING 39564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC40 +08A0 +48A0 +4910 +4A0E +4DF4 +4800 +7C48 +0648 +0548 +1D50 +E510 +4424 +17FE +0800 +ENDCHAR +STARTCHAR U+9A8F +ENCODING 39567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FC20 +0848 +4884 +4BFE +4888 +4906 +4A82 +48F8 +7D08 +0688 +0450 +3420 +C450 +148E +0B04 +ENDCHAR +STARTCHAR U+9A90 +ENCODING 39568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +FC88 +0BFE +4888 +4888 +48F8 +4888 +4888 +7CF8 +0488 +0488 +1FFE +E400 +0488 +1506 +0A02 +ENDCHAR +STARTCHAR U+9A91 +ENCODING 39569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC48 +0BFC +4840 +48B0 +4914 +4FFE +4808 +7DE8 +0528 +0528 +1D28 +E5E8 +4508 +1428 +0810 +ENDCHAR +STARTCHAR U+9A92 +ENCODING 39570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FDFE +0924 +4924 +49FC +4924 +4924 +49FC +7C20 +07FE +0470 +1CA8 +E52E +0624 +1420 +0820 +ENDCHAR +STARTCHAR U+9A93 +ENCODING 39571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08A0 +FC90 +0904 +49FE +4B10 +4D10 +49FC +4910 +7D10 +05FC +0510 +1D10 +E514 +05FE +1500 +0900 +ENDCHAR +STARTCHAR U+9A96 +ENCODING 39574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FC80 +0908 +4BFC +4844 +4FFE +4890 +4928 +7E46 +0590 +0420 +1C44 +E588 +0430 +14C0 +0B00 +ENDCHAR +STARTCHAR U+9A97 +ENCODING 39575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +F828 +13FC +5208 +5208 +53F8 +5200 +5204 +7BFE +0A94 +0A94 +3BFC +CE94 +0A94 +2A94 +120C +ENDCHAR +STARTCHAR U+9A98 +ENCODING 39576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +797C +4940 +57FE +4848 +6950 +5660 +4180 +5FE0 +0020 +0824 +0FFE +0004 +7FF4 +0014 +0008 +ENDCHAR +STARTCHAR U+9A9A +ENCODING 39578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +FFFC +0924 +4888 +4870 +4888 +4B26 +4824 +7DFE +0524 +1D24 +E5FC +4520 +0428 +15FC +0804 +ENDCHAR +STARTCHAR U+9A9B +ENCODING 39579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +FE88 +14FC +0888 +FE50 +1A20 +28D0 +490E +1FE0 +0020 +0824 +0FFE +0004 +7FF4 +0014 +0008 +ENDCHAR +STARTCHAR U+9A9C +ENCODING 39580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7E44 +08FE +7E88 +0850 +FF20 +1058 +3E86 +4200 +9FF0 +0010 +0814 +0FFE +0004 +7FF4 +0008 +ENDCHAR +STARTCHAR U+9A9D +ENCODING 39581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +FFBE +0A12 +4A12 +4A92 +4B2A +4A44 +4800 +7DFC +0524 +0524 +1DFC +E524 +0524 +15FC +0904 +ENDCHAR +STARTCHAR U+9A9E +ENCODING 39582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4442 +9FF4 +0440 +1FF0 +0444 +FFFE +0820 +1FD0 +E44E +0440 +07F8 +0008 +3FE8 +0010 +ENDCHAR +STARTCHAR U+9A9F +ENCODING 39583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FC10 +09FE +4902 +49FE +4900 +49EE +4922 +7D22 +05AA +0566 +1D66 +E5AA +0522 +16AA +0844 +ENDCHAR +STARTCHAR U+9AA0 +ENCODING 39584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FDFE +0850 +4854 +49FE +4954 +4954 +49FC +7C00 +05FC +0400 +1FFE +E4A8 +0526 +1622 +0860 +ENDCHAR +STARTCHAR U+9AA1 +ENCODING 39585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +FDFE +0924 +49FC +4924 +49FC +4820 +4848 +7DF0 +0424 +05FC +1C20 +E4A8 +4526 +16A2 +0840 +ENDCHAR +STARTCHAR U+9AA2 +ENCODING 39586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +FC44 +09FE +4944 +4974 +4954 +49B4 +4924 +7D44 +05FC +0400 +1CA0 +E5A4 +068A +1488 +0878 +ENDCHAR +STARTCHAR U+9AA3 +ENCODING 39587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +13FC +FA04 +13FC +5200 +52F8 +5210 +53FE +5220 +7A60 +0BDC +0A44 +3A88 +CBFE +0A88 +2C88 +1198 +ENDCHAR +STARTCHAR U+9AA4 +ENCODING 39588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +FFFC +1244 +53D4 +5248 +53D4 +5262 +57D8 +7860 +0BA4 +0868 +3BB0 +C868 +09A6 +2E20 +1020 +ENDCHAR +STARTCHAR U+9AA5 +ENCODING 39589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0850 +FDDC +0850 +4BDE +4800 +49FC +4924 +49FC +7D24 +05FC +0488 +1DFC +E488 +07FE +1488 +0904 +ENDCHAR +STARTCHAR U+9AA7 +ENCODING 39591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +FFFE +1000 +57BC +54A4 +57BC +5110 +53F8 +7910 +0BF8 +0910 +3FFE +C948 +0B30 +2D8E +1104 +ENDCHAR +STARTCHAR U+9AA8 +ENCODING 39592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +0820 +09E0 +0920 +3FFC +2008 +4FE0 +0820 +0FE0 +0820 +0FE0 +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+9AAA +ENCODING 39594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +3E80 +3EF8 +3ED8 +3FD8 +7DD8 +7EF8 +3AF8 +3ED8 +3690 +3E92 +3692 +371A +370E +0000 +ENDCHAR +STARTCHAR U+9AAB +ENCODING 39595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E20 +2220 +2E20 +2A7C +7F24 +4124 +3E34 +222C +3E24 +2224 +3E24 +2225 +2225 +4647 +0000 +0000 +ENDCHAR +STARTCHAR U+9AAC +ENCODING 39596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E3C +3AFC +3E20 +3B20 +7F20 +73FE +7FA0 +3E20 +3E20 +3E20 +3E20 +3620 +3EE0 +3660 +0020 +ENDCHAR +STARTCHAR U+9AAD +ENCODING 39597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3EF8 +2220 +2E20 +2A20 +7FFC +4220 +3E20 +2220 +3E20 +2220 +3E20 +2220 +2620 +0000 +ENDCHAR +STARTCHAR U+9AAE +ENCODING 39598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3C80 +7CD0 +3CD8 +34C8 +7EC0 +7EF8 +BFE0 +2440 +3C40 +2C60 +3C20 +2C34 +2C1C +2C0E +0004 +ENDCHAR +STARTCHAR U+9AAF +ENCODING 39599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +3F10 +220A +2EFF +2A00 +7F3C +4124 +3E24 +2224 +3E24 +2224 +3E25 +2245 +4283 +0000 +0000 +ENDCHAR +STARTCHAR U+9AB0 +ENCODING 39600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3E70 +2250 +2E54 +2A54 +7E8C +4300 +3FF8 +2248 +3E50 +2230 +3E20 +22D0 +270C +0000 +ENDCHAR +STARTCHAR U+9AB1 +ENCODING 39601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +3F20 +2250 +3A50 +2A88 +7F06 +4148 +BE48 +2248 +3E48 +2248 +3E48 +2248 +2248 +2A88 +2508 +ENDCHAR +STARTCHAR U+9AB2 +ENCODING 39602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1E20 +1660 +1E66 +1E46 +3E82 +237E +765E +365E +1E56 +164C +1E40 +1642 +167E +367E +0000 +ENDCHAR +STARTCHAR U+9AB3 +ENCODING 39603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E08 +2208 +2E7F +2A49 +7F48 +4148 +3E7E +2242 +3E62 +2254 +3E88 +2214 +2222 +4641 +0000 +0000 +ENDCHAR +STARTCHAR U+9AB4 +ENCODING 39604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E00 +2224 +2E24 +2A24 +7F24 +413C +3E67 +2264 +3E64 +2264 +3E6C +2275 +2265 +46C7 +0000 +0000 +ENDCHAR +STARTCHAR U+9AB5 +ENCODING 39605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3E10 +2210 +2E10 +2AFF +7F10 +4138 +4238 +3E54 +2254 +3E54 +2292 +3E92 +237D +2210 +2610 +ENDCHAR +STARTCHAR U+9AB6 +ENCODING 39606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7E1C +45E0 +7520 +5520 +FF20 +8324 +7DFE +4520 +7D20 +4510 +7D10 +4528 +454A +55A6 +4912 +ENDCHAR +STARTCHAR U+9AB7 +ENCODING 39607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +3F20 +2220 +3A24 +2AFE +7F20 +4120 +BE24 +22FE +3E84 +2284 +3E84 +2284 +2284 +2AFC +2484 +ENDCHAR +STARTCHAR U+9AB8 +ENCODING 39608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +23FC +2E40 +2A50 +7F90 +42A0 +7E68 +2248 +3E90 +2230 +3E48 +2284 +2704 +0000 +ENDCHAR +STARTCHAR U+9AB9 +ENCODING 39609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E10 +2208 +2EFF +2A00 +7F24 +4142 +3E85 +2224 +3E24 +2224 +3E18 +2218 +2224 +46C3 +0000 +0000 +ENDCHAR +STARTCHAR U+9ABA +ENCODING 39610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7E1C +45E0 +7500 +5504 +FFFE +8300 +7D04 +457E +7D44 +4544 +7D44 +4544 +4544 +567C +4844 +ENDCHAR +STARTCHAR U+9ABB +ENCODING 39611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E10 +22FE +2E10 +2A28 +7F44 +4183 +3E7C +2200 +3EFE +2220 +3E7E +2202 +2202 +461C +0000 +0000 +ENDCHAR +STARTCHAR U+9ABC +ENCODING 39612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +2278 +2E88 +2AD0 +7F20 +4250 +3E88 +23FC +3E88 +2288 +3E88 +22F8 +2688 +0000 +ENDCHAR +STARTCHAR U+9ABE +ENCODING 39614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E7F +2208 +2E7F +2A49 +7F7F +4149 +3E7F +2249 +3E08 +2228 +3E18 +2208 +2214 +46E3 +0000 +0000 +ENDCHAR +STARTCHAR U+9ABF +ENCODING 39615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E44 +2244 +2E28 +2A7E +7F24 +4124 +3E24 +22FF +3E24 +2224 +3E24 +2224 +2244 +4684 +0000 +0000 +ENDCHAR +STARTCHAR U+9AC0 +ENCODING 39616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E40 +22F8 +2EA8 +2AF8 +7FA8 +42F8 +3E50 +2290 +3FFC +2210 +3E10 +2210 +2610 +0000 +ENDCHAR +STARTCHAR U+9AC1 +ENCODING 39617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +7DFE +4524 +7524 +55FC +FF24 +8324 +7DFC +4420 +7FFE +4460 +7C70 +44A8 +4526 +5624 +4820 +ENDCHAR +STARTCHAR U+9AC2 +ENCODING 39618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E20 +45FE +7542 +547C +FE88 +8350 +7C20 +4450 +7D8E +44F8 +7C88 +4488 +4488 +54F8 +4888 +ENDCHAR +STARTCHAR U+9AC3 +ENCODING 39619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E80 +24FC +2CBC +2CBC +3EAC +62BC +7C20 +25FE +3526 +253E +3D7E +2546 +2506 +2D0C +0000 +ENDCHAR +STARTCHAR U+9AC4 +ENCODING 39620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E20 +25FC +2D20 +2C78 +7E48 +43F8 +7D48 +2578 +3D48 +2548 +3D58 +2680 +2C7C +0000 +ENDCHAR +STARTCHAR U+9AC5 +ENCODING 39621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7D24 +44A8 +7420 +55FE +FE20 +82A8 +7D24 +4440 +7FFE +4448 +7C88 +4470 +4450 +548C +4904 +ENDCHAR +STARTCHAR U+9AC6 +ENCODING 39622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E12 +22FF +2E10 +2AFE +7F92 +41FE +3E92 +22FE +3E92 +2204 +3EFF +2244 +2224 +460C +0000 +0000 +ENDCHAR +STARTCHAR U+9AC7 +ENCODING 39623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E08 +22FF +2E00 +2A3C +7F24 +413C +3E00 +22FF +3E81 +22BD +3EA5 +22BD +2281 +4683 +0000 +0000 +ENDCHAR +STARTCHAR U+9AC8 +ENCODING 39624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E20 +3630 +3EFE +3E4C +3E6A +3FFE +75B0 +3616 +3E20 +3E3C +3E64 +3644 +368C +3618 +0018 +ENDCHAR +STARTCHAR U+9ACA +ENCODING 39626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E22 +2214 +2E7F +2A08 +7F7F +4108 +3EFF +2220 +3E7E +2288 +3F08 +2208 +2208 +46FF +0000 +0000 +ENDCHAR +STARTCHAR U+9ACB +ENCODING 39627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E10 +45FE +7502 +5448 +FFFE +8248 +7CFC +4494 +7C94 +44A4 +7CA4 +4450 +4452 +5492 +490E +ENDCHAR +STARTCHAR U+9ACC +ENCODING 39628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +7E20 +45FE +7502 +541C +FEE0 +8284 +7CFE +4488 +7C88 +4488 +7FFE +4400 +4488 +5506 +4A02 +ENDCHAR +STARTCHAR U+9ACD +ENCODING 39629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E08 +22FF +2E80 +2A92 +7F92 +41FF +1E92 +12BE +1EB7 +12B7 +1EDB +1292 +1312 +2212 +0000 +0000 +ENDCHAR +STARTCHAR U+9ACE +ENCODING 39630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFE +16BE +1E6E +1EFE +3FBE +2366 +7E30 +1658 +1EBC +166C +1E38 +166E +1638 +14C0 +0000 +ENDCHAR +STARTCHAR U+9ACF +ENCODING 39631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3EF8 +22A8 +2FFC +2AA8 +7FF8 +42F8 +3EA8 +22F8 +3FFC +2250 +3ED0 +2230 +27C8 +0000 +ENDCHAR +STARTCHAR U+9AD0 +ENCODING 39632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E10 +22FE +2E10 +2AFE +7F44 +41EF +3E44 +22EE +3E00 +23FF +3E48 +2248 +2289 +470F +0000 +0000 +ENDCHAR +STARTCHAR U+9AD1 +ENCODING 39633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3DF8 +2568 +3DF8 +3480 +7EF8 +4548 +3FF8 +2558 +3DF8 +2568 +3C78 +2788 +2C30 +0000 +ENDCHAR +STARTCHAR U+9AD2 +ENCODING 39634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C44 +25FF +2C44 +35FF +2448 +7EF9 +435A +3C2C +2448 +3D8F +2442 +3DFF +2442 +4C82 +0000 +0000 +ENDCHAR +STARTCHAR U+9AD3 +ENCODING 39635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +3DFC +2540 +3C78 +3690 +7FFC +4578 +3C48 +2778 +3D48 +2578 +3D48 +26D8 +2C7C +0000 +ENDCHAR +STARTCHAR U+9AD4 +ENCODING 39636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0060 +3DF8 +2568 +3DF8 +3568 +7FF8 +4200 +3FFC +25F8 +3D08 +25F8 +3C90 +27FC +2C00 +0000 +ENDCHAR +STARTCHAR U+9AD5 +ENCODING 39637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C10 +25FF +2D01 +357D +7E58 +4290 +3DFC +2444 +3C7C +2444 +3C7C +2444 +247C +4C82 +0000 +0000 +ENDCHAR +STARTCHAR U+9AD6 +ENCODING 39638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3DFF +2551 +34FC +2C50 +7EFC +4284 +3CFC +2484 +3CFC +2484 +3CFD +2453 +2C9F +0000 +0000 +ENDCHAR +STARTCHAR U+9AD7 +ENCODING 39639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2420 +3C3C +2D2C +2DF4 +3FF8 +7EBC +7D98 +2578 +3D78 +2D78 +356C +24F4 +26B4 +2DFE +0000 +ENDCHAR +STARTCHAR U+9AD8 +ENCODING 39640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0000 +0FE0 +0820 +0FE0 +0000 +3FF8 +2008 +27C8 +2448 +27C8 +2018 +0000 +ENDCHAR +STARTCHAR U+9ADB +ENCODING 39643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0884 +08FC +3FC4 +76FC +1EF0 +1CF0 +11BC +3FF8 +3FA8 +3FA8 +3FAA +334A +27CA +238E +0000 +ENDCHAR +STARTCHAR U+9ADC +ENCODING 39644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +7F42 +007E +3E42 +227E +3E10 +00E2 +7F22 +41FF +5D22 +5522 +5D22 +4122 +4142 +0000 +0000 +ENDCHAR +STARTCHAR U+9ADE +ENCODING 39646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +7E88 +3CF8 +2400 +3DDC +0154 +7FDC +4220 +5FFC +5670 +5EA8 +4324 +4620 +0000 +ENDCHAR +STARTCHAR U+9ADF +ENCODING 39647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F10 +1020 +1028 +1E48 +1090 +1E10 +1024 +7F44 +1408 +1208 +2710 +7960 +0180 +0000 +ENDCHAR +STARTCHAR U+9AE0 +ENCODING 39648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1008 +1F18 +1F6C +1F1C +3FFE +1B1C +3D60 +0000 +0FE0 +0C60 +0C60 +0C60 +0862 +103E +0000 +ENDCHAR +STARTCHAR U+9AE1 +ENCODING 39649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0104 +3F88 +2010 +3F24 +2048 +3F10 +2024 +FF88 +1210 +3F60 +0004 +FFFE +0440 +0442 +1842 +603E +ENDCHAR +STARTCHAR U+9AE2 +ENCODING 39650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0900 +09F0 +0F10 +7910 +0964 +0804 +07FC +0000 +ENDCHAR +STARTCHAR U+9AE3 +ENCODING 39651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0100 +7FFC +0100 +01F0 +0210 +0C10 +30E0 +0000 +ENDCHAR +STARTCHAR U+9AE4 +ENCODING 39652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1F88 +1F3C +1F6E +1F1E +1FEE +1F3C +1D60 +0000 +0180 +3FFC +0580 +0D98 +198C +2180 +0100 +ENDCHAR +STARTCHAR U+9AE5 +ENCODING 39653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F82 +1004 +1F89 +1FB2 +100C +7FF1 +1082 +27CC +7840 +1FFC +1004 +7FFF +1004 +7FFF +1004 +100C +ENDCHAR +STARTCHAR U+9AE6 +ENCODING 39654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +00C0 +0F00 +1FF0 +0200 +7FFC +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+9AE7 +ENCODING 39655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F01 +3E3E +3E01 +203E +7F01 +113E +7F80 +0000 +0100 +7FFF +4101 +0220 +0421 +183F +0000 +0000 +ENDCHAR +STARTCHAR U+9AE9 +ENCODING 39657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3F18 +3F78 +3FDC +3F74 +3FDC +7F78 +2004 +3FFC +0DC0 +0DE0 +0FF0 +0FF0 +0030 +0030 +0000 +ENDCHAR +STARTCHAR U+9AEA +ENCODING 39658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0100 +7FFC +0200 +07F0 +1A20 +61C0 +1E7C +0000 +ENDCHAR +STARTCHAR U+9AEB +ENCODING 39659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3DE0 +1FF0 +0310 +0C60 +7FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+9AEC +ENCODING 39660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F01 +3E3E +3E01 +7FBE +1201 +7F3E +0000 +7FFF +0090 +0188 +0284 +7C83 +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+9AED +ENCODING 39661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0480 +1498 +17E0 +1480 +1484 +1784 +787C +0000 +ENDCHAR +STARTCHAR U+9AEE +ENCODING 39662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FF0 +0108 +7FFC +0220 +0540 +1980 +6660 +181C +0000 +ENDCHAR +STARTCHAR U+9AEF +ENCODING 39663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0100 +0FE0 +0FE0 +0920 +7FFC +0820 +0860 +0000 +ENDCHAR +STARTCHAR U+9AF1 +ENCODING 39665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0200 +0FF0 +7F90 +0890 +0FE4 +0804 +07FC +0000 +ENDCHAR +STARTCHAR U+9AF2 +ENCODING 39666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F01 +3E3E +3E01 +7FBE +1101 +3F3E +0080 +1FFC +1084 +13E0 +1220 +1140 +2080 +0F78 +0000 +0000 +ENDCHAR +STARTCHAR U+9AF3 +ENCODING 39667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F01 +3E3E +3E01 +7FBE +1201 +7F3E +0000 +0FF8 +0010 +01E0 +7FFF +0222 +3C20 +00E0 +0000 +0000 +ENDCHAR +STARTCHAR U+9AF4 +ENCODING 39668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +1FF0 +0490 +3FF0 +3FFC +2484 +1898 +6080 +0000 +ENDCHAR +STARTCHAR U+9AF5 +ENCODING 39669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +1F9C +1F36 +1F0C +3FB6 +191E +3FB0 +2000 +3FFE +0308 +1FFC +124C +124C +1258 +1258 +0000 +ENDCHAR +STARTCHAR U+9AF6 +ENCODING 39670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +2412 +2924 +7F89 +1102 +7F3C +3FFE +1004 +1FFC +1004 +1FFC +1004 +7FFF +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+9AF7 +ENCODING 39671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0280 +1FF0 +1290 +1FF0 +1290 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+9AF9 +ENCODING 39673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +1410 +1864 +1208 +FF72 +1004 +2218 +7F60 +0440 +0844 +17FE +30E0 +D150 +124E +1444 +1040 +ENDCHAR +STARTCHAR U+9AFA +ENCODING 39674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +2412 +2924 +7F89 +1102 +7F3C +0008 +1FF0 +0080 +7FFF +0080 +1FFC +1004 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+9AFB +ENCODING 39675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0100 +7FFC +1FF0 +0FE0 +0820 +0FE0 +0820 +0000 +ENDCHAR +STARTCHAR U+9AFC +ENCODING 39676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F94 +2A29 +7F92 +1124 +7F18 +07F0 +0A20 +01C0 +02A0 +07F0 +388E +07F0 +0FF8 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+9AFD +ENCODING 39677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F08 +3E32 +3E04 +7F39 +2202 +7F3C +0080 +0888 +0888 +1494 +22A2 +1FFC +0080 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+9AFE +ENCODING 39678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +2412 +2924 +7F89 +1102 +7F3C +1084 +0888 +1FFC +1FFC +1004 +1FFC +1004 +200C +0000 +0000 +ENDCHAR +STARTCHAR U+9AFF +ENCODING 39679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1F98 +1F3C +1F6C +1FBE +1FCE +1FF8 +1860 +0860 +19EC +1566 +0A7E +1838 +18E0 +1B80 +0000 +ENDCHAR +STARTCHAR U+9B00 +ENCODING 39680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0018 +1F38 +1F6C +1F1C +3FEE +1B38 +1D70 +0270 +1FF8 +0FF8 +0C8C +0B8C +068C +0C98 +0080 +0000 +ENDCHAR +STARTCHAR U+9B01 +ENCODING 39681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F08 +3E32 +3E04 +7F39 +2202 +7F3C +0000 +1E02 +0412 +3F92 +0E12 +1502 +2482 +0406 +0000 +0000 +ENDCHAR +STARTCHAR U+9B02 +ENCODING 39682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1F98 +1F3C +1FEC +1FBE +1FCE +1FF8 +1810 +0BF0 +0F0C +0C60 +0840 +1FFE +0618 +1C0C +0004 +ENDCHAR +STARTCHAR U+9B03 +ENCODING 39683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +1318 +1C64 +1018 +7F64 +1418 +3E60 +0100 +7FFE +4002 +9FF4 +0000 +7FFC +0920 +1118 +2308 +ENDCHAR +STARTCHAR U+9B04 +ENCODING 39684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +2412 +2924 +7F89 +1102 +7F3C +1FFC +1004 +1FFC +1FFC +0800 +1FFE +2222 +044C +0000 +0000 +ENDCHAR +STARTCHAR U+9B05 +ENCODING 39685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +2412 +2924 +7F89 +1102 +7F3C +0000 +3F7E +2142 +3F7E +2142 +3F7E +2142 +4386 +0000 +0000 +ENDCHAR +STARTCHAR U+9B06 +ENCODING 39686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0878 +7E88 +18A4 +1D30 +2A48 +49F4 +0804 +0000 +ENDCHAR +STARTCHAR U+9B08 +ENCODING 39688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +14F0 +1808 +FEF0 +2404 +7EF8 +1110 +0920 +3FF8 +0200 +7FFC +0820 +3FD8 +C846 +08D0 +07F0 +ENDCHAR +STARTCHAR U+9B09 +ENCODING 39689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +090C +1F3C +1F5C +3FFE +0F3C +1F60 +09C8 +0B68 +0FF8 +0E38 +07F0 +0BE0 +11E0 +0E3C +0000 +ENDCHAR +STARTCHAR U+9B0A +ENCODING 39690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F24 +7F89 +1102 +7F3C +0080 +3FFE +3FFE +7FFF +0808 +1FFC +2FEA +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+9B0B +ENCODING 39691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F24 +7F89 +1102 +7F3C +0410 +7FFF +3F02 +2122 +3F22 +2122 +3F22 +430E +0000 +0000 +ENDCHAR +STARTCHAR U+9B0C +ENCODING 39692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F8A +3F14 +3F09 +7F82 +3F3C +0400 +3FFE +0BFC +1040 +2FFE +07FC +07F4 +07F4 +040C +0000 +0000 +ENDCHAR +STARTCHAR U+9B0D +ENCODING 39693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F82 +3F3C +2002 +3F3C +7F82 +113C +7F80 +043E +3FA2 +043E +3FA2 +20BE +3FA2 +20A4 +0000 +0000 +ENDCHAR +STARTCHAR U+9B0E +ENCODING 39694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F04 +3E3A +3E04 +7F3A +1204 +7F38 +0202 +3FE2 +0202 +1FCA +124A +1FCA +0A82 +3266 +0000 +0000 +ENDCHAR +STARTCHAR U+9B0F +ENCODING 39695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1218 +14E0 +1818 +FEE4 +2408 +7EF0 +0020 +0624 +78AC +08B0 +FF20 +1850 +2C50 +CA88 +0886 +0904 +ENDCHAR +STARTCHAR U+9B10 +ENCODING 39696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F05 +7F82 +3F3C +0080 +1FFC +3FFE +05F0 +09FC +17F8 +0408 +07E8 +07F8 +0000 +0000 +ENDCHAR +STARTCHAR U+9B11 +ENCODING 39697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F24 +7F89 +1102 +7F3C +0808 +7FFF +0220 +1FFC +7FFF +1FFC +0A28 +1224 +0000 +0000 +ENDCHAR +STARTCHAR U+9B12 +ENCODING 39698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F24 +7F89 +1102 +7FBC +0080 +7FFF +0FF8 +0FE8 +0FE8 +0FE8 +7FFF +1004 +0000 +0000 +ENDCHAR +STARTCHAR U+9B13 +ENCODING 39699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1218 +14E0 +1818 +FEE4 +2408 +7EF0 +0100 +7FFE +4062 +8F84 +0820 +0FF0 +0844 +FFFE +0820 +3018 +ENDCHAR +STARTCHAR U+9B15 +ENCODING 39701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F08 +3E32 +3E05 +7FBA +223C +7E08 +3F7E +0410 +07F0 +05D0 +07F0 +7FFF +0220 +3C1E +0000 +0000 +ENDCHAR +STARTCHAR U+9B16 +ENCODING 39702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F24 +7F89 +1102 +7F3C +0410 +0FF0 +1122 +3F7E +03C0 +0560 +0AB0 +1548 +0000 +0000 +ENDCHAR +STARTCHAR U+9B17 +ENCODING 39703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F24 +7F89 +1102 +7F3C +0410 +7FFF +0410 +07F0 +3FFE +2492 +269A +29A6 +0000 +0000 +ENDCHAR +STARTCHAR U+9B18 +ENCODING 39704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E90 +1E64 +7F98 +1660 +3FC0 +07C0 +07C0 +1FF0 +1FF0 +0FE0 +0380 +3C78 +0000 +ENDCHAR +STARTCHAR U+9B19 +ENCODING 39705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +2412 +2924 +7F89 +1102 +7F3C +0410 +7FFF +4889 +7FFF +1FFC +1004 +1FFC +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+9B1A +ENCODING 39706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E88 +1E30 +7FC4 +1218 +3FE0 +0FFC +71F0 +0910 +31F0 +05F0 +19F0 +671C +0000 +ENDCHAR +STARTCHAR U+9B1B +ENCODING 39707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F0C +1030 +1F06 +1018 +7FC3 +113C +3F80 +0080 +3FFE +2272 +2182 +3FFE +2084 +3CF5 +239B +7CE1 +ENDCHAR +STARTCHAR U+9B1C +ENCODING 39708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1F0C +1F3E +111E +1F87 +0BBC +1880 +1F7C +134C +127C +166C +17E4 +1724 +17EC +146C +0000 +ENDCHAR +STARTCHAR U+9B1E +ENCODING 39710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F24 +7F89 +1102 +7F3C +1FFC +1FFC +1224 +1FFC +0FFC +0FF0 +1428 +271F +0000 +0000 +ENDCHAR +STARTCHAR U+9B1F +ENCODING 39711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E90 +1E64 +7F98 +16E0 +3FE0 +0FE0 +7FFC +07C0 +07D8 +7CE0 +0760 +181C +0000 +ENDCHAR +STARTCHAR U+9B20 +ENCODING 39712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F89 +3F12 +3F24 +7F89 +1102 +7FBC +0140 +03E0 +07F0 +0AA8 +1FFC +27F2 +07D0 +07F0 +0000 +0000 +ENDCHAR +STARTCHAR U+9B22 +ENCODING 39714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E90 +1E64 +7F18 +16E0 +3FFC +2FE8 +4B40 +37E0 +3FE0 +07E0 +07E0 +3C38 +0000 +ENDCHAR +STARTCHAR U+9B23 +ENCODING 39715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +1F60 +1E90 +1E64 +7F18 +16E8 +3930 +0488 +1FF0 +1390 +1FF0 +1DD4 +1DCC +7304 +0000 +ENDCHAR +STARTCHAR U+9B24 +ENCODING 39716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F8A +2914 +7FA9 +1102 +7FBC +3FFE +1E3C +1224 +1E3C +0410 +1FFC +1FFC +7FFF +0C28 +0000 +0000 +ENDCHAR +STARTCHAR U+9B25 +ENCODING 39717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2EE8 +2448 +2EE8 +2448 +2EE8 +2008 +2008 +2008 +2008 +2008 +2008 +2008 +2018 +0000 +ENDCHAR +STARTCHAR U+9B26 +ENCODING 39718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +5F7D +4411 +5F7D +4411 +5F7D +4001 +4221 +4121 +4021 +4421 +4239 +40E1 +4F21 +4021 +4027 +ENDCHAR +STARTCHAR U+9B27 +ENCODING 39719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2EE8 +2448 +2EE8 +2448 +2EE8 +2108 +3FF8 +2108 +2FE8 +2928 +2928 +29C8 +2118 +0000 +ENDCHAR +STARTCHAR U+9B28 +ENCODING 39720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2EE8 +2448 +2EE8 +2448 +2EE8 +2008 +2288 +2FE8 +2288 +3FF8 +2288 +2448 +2858 +0000 +ENDCHAR +STARTCHAR U+9B29 +ENCODING 39721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2EE8 +2448 +2EE8 +2448 +2EE8 +2208 +24C8 +26C8 +2448 +27C8 +2288 +24A8 +2878 +0000 +ENDCHAR +STARTCHAR U+9B2A +ENCODING 39722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2EE8 +2448 +2EE8 +2448 +2EE8 +2028 +3F28 +2FF8 +29A8 +2F68 +2A28 +2728 +3878 +0000 +ENDCHAR +STARTCHAR U+9B2B +ENCODING 39723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E3F +4809 +7E3F +4809 +7E3F +47A1 +4121 +4FE1 +44BD +47C9 +4789 +44A9 +4F91 +40AB +0000 +0000 +ENDCHAR +STARTCHAR U+9B2D +ENCODING 39725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0007 +3F7F +273F +2632 +3F7E +3F9A +3FE2 +3FE6 +37FA +39EA +3FCA +264A +274A +380E +0000 +ENDCHAR +STARTCHAR U+9B2E +ENCODING 39726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +2EE8 +2448 +2EE8 +2EE8 +2388 +3FE8 +2EE8 +3AF8 +3EB8 +3AF8 +3AF8 +3E98 +39F8 +0000 +ENDCHAR +STARTCHAR U+9B2F +ENCODING 39727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0240 +2148 +2CA8 +3398 +2948 +2328 +2C88 +3FF8 +2808 +0870 +0F80 +0804 +0804 +07FC +0000 +ENDCHAR +STARTCHAR U+9B31 +ENCODING 39729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +7FFC +17D0 +3D78 +57D4 +3FFC +2A88 +7B90 +36E8 +2B90 +3FE4 +2608 +38B0 +1FC0 +0000 +ENDCHAR +STARTCHAR U+9B32 +ENCODING 39730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +0000 +0FE0 +0820 +0FE0 +0000 +3FF8 +2288 +2C98 +37F8 +2108 +2108 +2118 +0000 +ENDCHAR +STARTCHAR U+9B33 +ENCODING 39731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00F8 +3FFF +2101 +27F2 +21F0 +27FC +23F8 +2208 +23F8 +2FFE +4912 +0BFA +0842 +0000 +0000 +ENDCHAR +STARTCHAR U+9B34 +ENCODING 39732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F97 +3FFF +3210 +3EFE +22D6 +3FDE +33D6 +3FD6 +2FFE +3FD6 +29D6 +29DE +2994 +0000 +ENDCHAR +STARTCHAR U+9B35 +ENCODING 39733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4848 +7F7F +0C18 +376F +0000 +7FFF +0FF8 +0808 +0FF8 +3FFE +2412 +2FFA +209E +0000 +0000 +ENDCHAR +STARTCHAR U+9B37 +ENCODING 39735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F55 +0049 +3E55 +2241 +3E7F +0014 +7FE7 +4140 +637F +55A2 +7F14 +4908 +4914 +4B63 +0000 +0000 +ENDCHAR +STARTCHAR U+9B39 +ENCODING 39737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +04CC +1FFC +04FC +1FFC +0E7A +19DE +108E +0FF8 +0418 +07F8 +1FFE +1924 +1FF4 +188C +0084 +ENDCHAR +STARTCHAR U+9B3A +ENCODING 39738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F40 +007F +3E80 +223E +2222 +3E3E +003E +7F7F +5520 +493F +7F55 +4925 +4949 +4212 +0000 +0000 +ENDCHAR +STARTCHAR U+9B3B +ENCODING 39739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3D78 +0B48 +3FF8 +3BB8 +0D48 +3130 +7FFC +0FE0 +0820 +0FE0 +3FF8 +2458 +3FF8 +2118 +0000 +ENDCHAR +STARTCHAR U+9B3C +ENCODING 39740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +1FF0 +1110 +1FF0 +1110 +1FF0 +1510 +0520 +0520 +0950 +09FC +1104 +20FC +0000 +ENDCHAR +STARTCHAR U+9B3D +ENCODING 39741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0C00 +3F0C +3F08 +3F10 +3F06 +3F18 +3F30 +3E06 +1F0C +1F10 +17A0 +1780 +1603 +27FF +01FE +ENDCHAR +STARTCHAR U+9B3E +ENCODING 39742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3F88 +64FF +2488 +3F88 +24BE +24A2 +3F94 +1248 +12B4 +13E3 +2220 +4201 +01FF +0000 +0000 +ENDCHAR +STARTCHAR U+9B3F +ENCODING 39743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +107E +3FA0 +64A0 +24BF +3FA2 +24A2 +24A2 +3FA2 +1242 +12A2 +13E0 +2201 +41FF +0000 +0000 +ENDCHAR +STARTCHAR U+9B41 +ENCODING 39745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +1050 +3E50 +2B10 +3E90 +2A90 +3E1C +2DF0 +0D10 +0D10 +1690 +17D4 +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+9B42 +ENCODING 39746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +3FF8 +0248 +03F8 +7E48 +13F8 +1AC8 +14D0 +2750 +7B68 +027C +0C44 +303C +0000 +ENDCHAR +STARTCHAR U+9B43 +ENCODING 39747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +1050 +3E48 +2BFC +3E40 +2A50 +3E50 +1850 +1AA0 +1AA0 +1D50 +2F88 +2904 +47FC +0000 +ENDCHAR +STARTCHAR U+9B44 +ENCODING 39748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0880 +11F8 +3D48 +25F8 +2548 +3DF8 +2548 +24D0 +24D0 +3D68 +2578 +0644 +183C +0000 +ENDCHAR +STARTCHAR U+9B45 +ENCODING 39749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +1020 +3EF8 +2A20 +3E20 +2BFC +3E70 +2C70 +0DA8 +0D24 +16A0 +17A0 +2404 +43FC +0000 +ENDCHAR +STARTCHAR U+9B46 +ENCODING 39750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100A +3E09 +6A7F +3E48 +2A48 +3E4A +144C +1648 +1458 +1545 +1763 +2441 +4401 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+9B47 +ENCODING 39751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFC +20A0 +2094 +3FFE +2140 +2630 +390E +27F8 +2488 +27F8 +2488 +27F8 +4140 +4252 +8442 +183E +ENDCHAR +STARTCHAR U+9B48 +ENCODING 39752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2524 +7EA8 +5420 +54F8 +7C88 +54F8 +5488 +7CF8 +1088 +1888 +2AA8 +2892 +4802 +87FE +0000 +ENDCHAR +STARTCHAR U+9B49 +ENCODING 39753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +25FC +7E50 +5454 +55FE +7D54 +5554 +5554 +7D54 +11AC +1904 +2D04 +290C +4802 +87FE +0000 +ENDCHAR +STARTCHAR U+9B4A +ENCODING 39754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +3E0A +6BFE +3E08 +2AE8 +2AA8 +3EAA +14EC +1608 +1515 +17E3 +1500 +2401 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9B4B +ENCODING 39755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1014 +1024 +3E7F +6AA4 +3E24 +2A3F +3E24 +1524 +153F +16A4 +17A4 +143F +2400 +43FF +0000 +0000 +ENDCHAR +STARTCHAR U+9B4C +ENCODING 39756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1022 +2022 +7E7F +2A22 +3E3E +2A22 +3E3E +1522 +157F +1680 +17A2 +1441 +2401 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9B4D +ENCODING 39757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +10F8 +3ED8 +2AB8 +3EA8 +2AF8 +3EA8 +18F8 +1AC8 +1AB8 +1D88 +2F9C +2804 +47FC +0000 +ENDCHAR +STARTCHAR U+9B4E +ENCODING 39758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +11FC +3E40 +2BF8 +3F48 +2BF8 +3FD8 +19D8 +1BE8 +1B48 +1D48 +2F1C +2804 +47FC +0000 +ENDCHAR +STARTCHAR U+9B4F +ENCODING 39759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0620 +3840 +08F8 +7FA8 +1CF8 +1AA8 +2AF8 +48A0 +7E68 +1268 +3AB4 +04BC +1B24 +621C +0000 +ENDCHAR +STARTCHAR U+9B51 +ENCODING 39761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +11FC +3E98 +2AE8 +3ED8 +2AF8 +3E20 +19FC +1D54 +1DFC +1B04 +2F0C +2804 +47FC +0000 +ENDCHAR +STARTCHAR U+9B52 +ENCODING 39762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FF +3E24 +6AFF +3EA5 +2AFF +2A00 +3EFE +1600 +15FF +1738 +1454 +1493 +2400 +47FF +0000 +0000 +ENDCHAR +STARTCHAR U+9B54 +ENCODING 39764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +1FFC +1220 +1FFC +1770 +1AA8 +17F4 +1490 +17F0 +17F0 +25A8 +22FC +4C84 +307C +0000 +ENDCHAR +STARTCHAR U+9B55 +ENCODING 39765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +104A +3EAD +6AEF +2A4A +3EAD +2AEF +2A0A +3EFF +1408 +1428 +155A +1785 +244B +43D1 +0000 +0000 +ENDCHAR +STARTCHAR U+9B56 +ENCODING 39766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3E1C +6A10 +3FFF +2B11 +2B7E +3F10 +153E +17A5 +15E7 +1724 +27FF +4401 +07FF +0000 +0000 +ENDCHAR +STARTCHAR U+9B57 +ENCODING 39767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0030 +1020 +1FFE +1DA6 +01A4 +0FFC +19A4 +1DFC +0020 +3E64 +72EC +5FAE +5ABA +7F30 +563F +001E +ENDCHAR +STARTCHAR U+9B58 +ENCODING 39768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1718 +1714 +1FFC +1F90 +1FA8 +19C4 +17F0 +17F0 +27F0 +21A8 +46FC +387C +0000 +ENDCHAR +STARTCHAR U+9B59 +ENCODING 39769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2081 +17FE +43E8 +22AF +03EA +13EA +67F2 +2482 +0FF8 +0FE8 +0FF8 +01A4 +02BD +3CFF +0000 +0000 +ENDCHAR +STARTCHAR U+9B5A +ENCODING 39770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +07C0 +0880 +1100 +3FF0 +5110 +1FF0 +1110 +1110 +1FF0 +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+9B5B +ENCODING 39771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3F7F +4211 +0411 +0811 +7F11 +4911 +7F11 +4911 +7F11 +0011 +5521 +5545 +5502 +0000 +0000 +ENDCHAR +STARTCHAR U+9B5E +ENCODING 39774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1C00 +2478 +4808 +1008 +7E08 +5208 +5208 +7E14 +5214 +5214 +7E22 +0222 +5542 +5541 +5081 +ENDCHAR +STARTCHAR U+9B5F +ENCODING 39775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2000 +7F00 +027F +7F08 +4908 +4908 +7F08 +4908 +4908 +7F08 +0008 +557F +5500 +0000 +0000 +ENDCHAR +STARTCHAR U+9B60 +ENCODING 39776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +7F7F +0210 +7F10 +4910 +4910 +7F7F +4910 +4910 +7F10 +0010 +5511 +5511 +551F +0000 +0000 +ENDCHAR +STARTCHAR U+9B61 +ENCODING 39777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2020 +7F20 +023F +7F21 +4941 +4901 +7F11 +4909 +4905 +7F01 +0001 +5501 +550E +0000 +0000 +ENDCHAR +STARTCHAR U+9B63 +ENCODING 39779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +18FC +1E0C +1438 +3E18 +3FFE +3F1E +3F18 +3F18 +3F18 +2018 +2D18 +2F38 +2A30 +0000 +ENDCHAR +STARTCHAR U+9B64 +ENCODING 39780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2030 +3E50 +44D0 +0850 +7F50 +4950 +4950 +7F5F +4950 +4950 +7F50 +0051 +5551 +555F +0000 +0000 +ENDCHAR +STARTCHAR U+9B65 +ENCODING 39781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1800 +11F8 +1DD8 +2890 +7E90 +6AFC +3EC8 +3FD8 +3F30 +2130 +0F30 +3E58 +5688 +4F0E +0000 +ENDCHAR +STARTCHAR U+9B66 +ENCODING 39782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +7F08 +0208 +042A +7F49 +4949 +4908 +7F08 +490A +490A +7F02 +0004 +5508 +5570 +0000 +0000 +ENDCHAR +STARTCHAR U+9B67 +ENCODING 39783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +7F08 +0200 +047E +7F00 +493C +4924 +7F24 +4924 +4924 +7F24 +0025 +5525 +5547 +0000 +0000 +ENDCHAR +STARTCHAR U+9B68 +ENCODING 39784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3F08 +027F +0408 +7F08 +4949 +4949 +7F49 +497F +4908 +7F08 +0009 +5509 +550F +0000 +0000 +ENDCHAR +STARTCHAR U+9B6A +ENCODING 39786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1818 +1818 +1E38 +1424 +3F47 +3F26 +3F24 +3F24 +3F24 +3F24 +3E24 +0064 +2D44 +2F84 +2804 +ENDCHAR +STARTCHAR U+9B6B +ENCODING 39787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3020 +3C20 +2C20 +28FE +7FFE +7F20 +7E20 +7E70 +7E70 +7E70 +20F0 +0AB0 +5F33 +563F +0000 +ENDCHAR +STARTCHAR U+9B6C +ENCODING 39788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2001 +3EFE +4440 +0840 +7F5E +4952 +4952 +7F52 +4952 +4952 +7F4C +008C +5512 +5521 +0000 +0000 +ENDCHAR +STARTCHAR U+9B6D +ENCODING 39789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +3CFC +2C00 +2800 +7E00 +6BFE +7ED0 +6AD0 +6AD0 +7ED0 +0090 +1F90 +7712 +541E +000C +ENDCHAR +STARTCHAR U+9B6E +ENCODING 39790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1898 +1C90 +3490 +2890 +3E90 +2AFE +3E90 +2A90 +2A90 +3E90 +0090 +3EB0 +7FFA +549E +0000 +ENDCHAR +STARTCHAR U+9B6F +ENCODING 39791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +07C0 +1900 +7FF0 +1110 +1FF0 +1110 +1FF0 +1248 +6FE4 +0820 +0FE0 +0820 +0FE0 +0000 +ENDCHAR +STARTCHAR U+9B70 +ENCODING 39792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3F08 +0208 +047F +7F22 +4922 +4922 +7F22 +4922 +4922 +7F14 +0008 +5514 +5563 +0000 +0000 +ENDCHAR +STARTCHAR U+9B71 +ENCODING 39793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107F +1E10 +2410 +0810 +7F3E +4922 +4922 +7F22 +4922 +497E +7F02 +0004 +5508 +557F +0000 +0000 +ENDCHAR +STARTCHAR U+9B73 +ENCODING 39795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1004 +11FE +3D20 +2820 +7FFC +7FEC +3FAC +3DAC +3DA8 +21B8 +0FA8 +3C20 +5020 +4020 +0020 +ENDCHAR +STARTCHAR U+9B74 +ENCODING 39796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1E20 +24FC +7E20 +2A20 +3E38 +2A28 +3E28 +0448 +3A48 +2E88 +2908 +4230 +0000 +ENDCHAR +STARTCHAR U+9B75 +ENCODING 39797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3F18 +0224 +0442 +7F81 +497E +4912 +7F12 +4912 +4912 +7F12 +0022 +5542 +551C +0000 +0000 +ENDCHAR +STARTCHAR U+9B76 +ENCODING 39798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +7F08 +0208 +047F +7F49 +4949 +4949 +7F49 +4955 +4963 +7F41 +0041 +5541 +5543 +0000 +0000 +ENDCHAR +STARTCHAR U+9B77 +ENCODING 39799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +3E22 +0420 +09FF +3E20 +2A20 +3E30 +2A30 +3E30 +2230 +0050 +5591 +5511 +548F +0000 +0000 +ENDCHAR +STARTCHAR U+9B78 +ENCODING 39800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1C48 +2448 +4848 +1048 +7E7F +5240 +5240 +7E40 +527C +5244 +7E44 +0244 +5584 +5484 +5104 +ENDCHAR +STARTCHAR U+9B79 +ENCODING 39801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1C0C +24F0 +4810 +1010 +7E1E +52F0 +5210 +7E10 +521F +52F0 +7E10 +0210 +5511 +5511 +500F +ENDCHAR +STARTCHAR U+9B7A +ENCODING 39802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3EFF +4402 +0802 +7F7A +494A +494A +7F4A +497A +494A +7F02 +0002 +5502 +5506 +0000 +0000 +ENDCHAR +STARTCHAR U+9B7B +ENCODING 39803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3E7F +4449 +0849 +7F7F +4949 +4949 +7F7F +4908 +4908 +7F08 +0008 +5508 +5488 +0000 +0000 +ENDCHAR +STARTCHAR U+9B7C +ENCODING 39804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E08 +443E +0808 +7F08 +4908 +497F +7F08 +4908 +4910 +7F22 +0042 +557F +5501 +0000 +0000 +ENDCHAR +STARTCHAR U+9B7D +ENCODING 39805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3E24 +4424 +08FF +7F24 +4924 +4924 +7F24 +493C +4924 +7F24 +0024 +5524 +553C +0000 +0000 +ENDCHAR +STARTCHAR U+9B7E +ENCODING 39806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3EFF +4404 +0808 +7F18 +4934 +49D2 +7F11 +4910 +4910 +7F10 +0010 +55FF +5500 +0000 +0000 +ENDCHAR +STARTCHAR U+9B7F +ENCODING 39807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1830 +1E38 +1428 +3464 +3F7E +2F83 +3F02 +3E7E +2A04 +3E08 +2030 +3718 +3F18 +7D08 +0000 +ENDCHAR +STARTCHAR U+9B80 +ENCODING 39808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E08 +447F +0841 +7F41 +4910 +4912 +7F14 +4918 +4910 +7F10 +0010 +5511 +550F +0000 +0000 +ENDCHAR +STARTCHAR U+9B82 +ENCODING 39810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3E7F +4441 +0841 +7F49 +4949 +4949 +7F49 +4955 +4963 +7F41 +0041 +5541 +557F +0000 +0000 +ENDCHAR +STARTCHAR U+9B83 +ENCODING 39811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1E20 +24A8 +7EA4 +2B24 +3E20 +2BFC +3E20 +0420 +3A20 +2E20 +2820 +4020 +0000 +ENDCHAR +STARTCHAR U+9B84 +ENCODING 39812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0828 +1E28 +162A +147E +3F2A +357E +17FE +1FE8 +15FF +1FAB +002B +056F +2B4A +2AC8 +0008 +ENDCHAR +STARTCHAR U+9B85 +ENCODING 39813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3E08 +4426 +0820 +7EA2 +4AA2 +4AA4 +7EA9 +4AB1 +4A22 +7EE0 +0020 +5521 +551F +0000 +0000 +ENDCHAR +STARTCHAR U+9B86 +ENCODING 39814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +2E7C +2842 +7F3E +0000 +0100 +0FF8 +0020 +0FF8 +0888 +0FF8 +0888 +0FF8 +124C +0000 +0000 +ENDCHAR +STARTCHAR U+9B87 +ENCODING 39815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E08 +443E +0808 +7F08 +497F +4908 +7F08 +491C +492A +7F49 +0008 +5508 +5508 +0000 +0000 +ENDCHAR +STARTCHAR U+9B88 +ENCODING 39816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3E40 +447F +0841 +7F81 +493D +4925 +7F25 +493D +4925 +7F01 +0001 +5501 +550E +0000 +0000 +ENDCHAR +STARTCHAR U+9B89 +ENCODING 39817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1800 +1CFC +1C24 +2C64 +3E64 +2A44 +3E9C +2AFC +2A84 +3E84 +0084 +3684 +7DFC +0084 +0000 +ENDCHAR +STARTCHAR U+9B8A +ENCODING 39818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1030 +1C20 +34FC +28FE +3E86 +2A86 +3E86 +3AFE +2A86 +3E86 +2086 +16FE +77FE +5480 +0000 +ENDCHAR +STARTCHAR U+9B8B +ENCODING 39819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1010 +1C10 +2410 +28FE +2E96 +2A96 +3E96 +2AFE +2A96 +3E96 +0096 +26FE +7586 +5402 +0000 +ENDCHAR +STARTCHAR U+9B8D +ENCODING 39821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1010 +1410 +3CFE +28D6 +2AD0 +2ADC +2AC6 +3EC4 +2AEC +3E9C +2098 +029C +57A6 +5502 +0000 +ENDCHAR +STARTCHAR U+9B8E +ENCODING 39822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1E20 +243C +7E20 +2A20 +3E20 +2AF8 +3E88 +0488 +3A88 +2E88 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9B8F +ENCODING 39823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1030 +1C30 +34F0 +28B0 +3EFC +2BB0 +3F30 +3E30 +2A34 +3E7C +2030 +0230 +7730 +5DFE +01FE +ENDCHAR +STARTCHAR U+9B90 +ENCODING 39824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E08 +4410 +0820 +7F42 +49FF +4901 +7F7E +4942 +4942 +7F42 +0042 +557E +5542 +0000 +0000 +ENDCHAR +STARTCHAR U+9B91 +ENCODING 39825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1E40 +2478 +7E88 +2BE8 +3EA8 +2AA8 +3EE8 +04B0 +3A80 +2E84 +2884 +407C +0000 +ENDCHAR +STARTCHAR U+9B92 +ENCODING 39826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0848 +1E48 +2488 +7EFC +2B88 +3EC8 +2AA8 +3EA8 +0488 +3A88 +2E88 +2888 +4098 +0000 +ENDCHAR +STARTCHAR U+9B93 +ENCODING 39827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1E40 +247C +7EA0 +2AA0 +3F3C +2A20 +3E20 +043C +3A20 +2E20 +2820 +4020 +0000 +ENDCHAR +STARTCHAR U+9B94 +ENCODING 39828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +180C +1DFC +34C0 +3FC0 +7AFC +3EC8 +3AC8 +3EF8 +30F0 +02C0 +36C0 +60FE +41F0 +0000 +ENDCHAR +STARTCHAR U+9B95 +ENCODING 39829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E08 +4408 +087F +7F08 +4908 +4908 +7F7F +4941 +4941 +7F41 +0041 +557F +5541 +0000 +0000 +ENDCHAR +STARTCHAR U+9B96 +ENCODING 39830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1E20 +2420 +7E20 +2A40 +3E40 +2AF8 +3F88 +0488 +3A88 +2E88 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9B97 +ENCODING 39831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1E78 +2488 +7F50 +2A20 +3E50 +2AC8 +3F24 +0420 +3A00 +2EC0 +2830 +4008 +0000 +ENDCHAR +STARTCHAR U+9B9A +ENCODING 39834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E08 +447F +0808 +7F08 +4908 +493E +7F00 +493E +4922 +7F22 +0022 +553E +5522 +0000 +0000 +ENDCHAR +STARTCHAR U+9B9B +ENCODING 39835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E08 +440E +0808 +7F08 +497F +4908 +7F1C +492A +4949 +7F08 +0008 +5528 +5510 +0000 +0000 +ENDCHAR +STARTCHAR U+9B9D +ENCODING 39837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +04B0 +07A8 +0FF8 +0204 +1FFC +0B30 +17FC +0FFC +0FF0 +0FF0 +0FF0 +0858 +1664 +2426 +0000 +ENDCHAR +STARTCHAR U+9B9E +ENCODING 39838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3E7F +4408 +0810 +7F20 +497F +4955 +7F55 +4955 +4955 +7F55 +0055 +5541 +5543 +0000 +0000 +ENDCHAR +STARTCHAR U+9B9F +ENCODING 39839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1EFC +2488 +7F20 +2A20 +3FFC +2A48 +3E48 +04F0 +3A90 +2E38 +28C4 +4304 +0000 +ENDCHAR +STARTCHAR U+9BA0 +ENCODING 39840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1E78 +2490 +7FFC +2A80 +3EF8 +2AC8 +3EC8 +04C8 +3AD8 +2F44 +2944 +423C +0000 +ENDCHAR +STARTCHAR U+9BA1 +ENCODING 39841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E28 +4428 +08AA +7E6A +4A6C +4A28 +7E6C +4AAA +4A28 +7E28 +0029 +5549 +5587 +0000 +0000 +ENDCHAR +STARTCHAR U+9BA2 +ENCODING 39842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +3E50 +447E +0890 +7E10 +4BFF +4A10 +7E38 +4A54 +4A92 +7F13 +0010 +5510 +5510 +0000 +0000 +ENDCHAR +STARTCHAR U+9BA4 +ENCODING 39844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F82 +0402 +0F12 +1212 +2C12 +0912 +71E6 +0242 +0FF8 +0888 +0FF8 +0888 +0FF8 +124C +0000 +0000 +ENDCHAR +STARTCHAR U+9BA5 +ENCODING 39845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3E20 +443F +0844 +7EA4 +4A24 +4A18 +7E24 +4AC3 +4A00 +7E3E +0022 +5522 +553E +0000 +0000 +ENDCHAR +STARTCHAR U+9BA6 +ENCODING 39846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107F +3E41 +4441 +085D +7F41 +495D +4955 +7F55 +495D +4941 +7F41 +0041 +5541 +5543 +0000 +0000 +ENDCHAR +STARTCHAR U+9BA7 +ENCODING 39847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1010 +1CFE +2430 +28FE +2A36 +2AB6 +3EB6 +2AA2 +2BB6 +2336 +0076 +165C +558C +5006 +0000 +ENDCHAR +STARTCHAR U+9BA8 +ENCODING 39848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +0898 +1EE0 +2480 +7E84 +2A7C +3E00 +2AF8 +3E88 +04F8 +3A88 +2E88 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9BA9 +ENCODING 39849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1806 +1C4C +1428 +347E +3F2C +2B2C +3E2C +3FFF +2A2C +3E24 +2064 +3744 +2D44 +7D04 +0000 +ENDCHAR +STARTCHAR U+9BAA +ENCODING 39850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1E20 +25FC +7E40 +2A78 +3EC8 +2AF8 +3F48 +0478 +3A48 +2E48 +2848 +4058 +0000 +ENDCHAR +STARTCHAR U+9BAB +ENCODING 39851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1E20 +25FC +7E50 +2A48 +3E94 +2B54 +3E50 +0420 +3A30 +2E50 +2888 +4304 +0000 +ENDCHAR +STARTCHAR U+9BAC +ENCODING 39852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1030 +1820 +1FFF +3470 +2C48 +3FDC +2B86 +3F06 +2B60 +2A7C +3E06 +0004 +370C +7D08 +5430 +0000 +ENDCHAR +STARTCHAR U+9BAD +ENCODING 39853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1EF8 +2420 +7E20 +2BFC +3E20 +2A20 +3EF8 +0420 +3A20 +2E20 +29FC +4000 +0000 +ENDCHAR +STARTCHAR U+9BAE +ENCODING 39854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0848 +1E50 +25FC +7E20 +2A20 +3EF8 +2A20 +3E20 +05FC +3A20 +2E20 +2820 +4020 +0000 +ENDCHAR +STARTCHAR U+9BAF +ENCODING 39855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1018 +3E24 +44C3 +0800 +7F7E +4900 +4900 +7F7E +4942 +4942 +7F42 +0042 +557E +5542 +0000 +0000 +ENDCHAR +STARTCHAR U+9BB0 +ENCODING 39856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +19FF +1D02 +2D02 +097E +3F4A +2D4A +3D4A +2D4A +3F6A +2742 +0102 +17FE +2D02 +0100 +0000 +ENDCHAR +STARTCHAR U+9BB1 +ENCODING 39857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3810 +28FD +4812 +1014 +7DFF +5410 +5420 +7C60 +55A2 +543C +7C20 +0020 +5421 +5421 +501F +ENDCHAR +STARTCHAR U+9BB2 +ENCODING 39858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +3848 +284A +4889 +1088 +7DFF +5688 +5488 +7C88 +5494 +5494 +7C94 +00A2 +54A2 +54C1 +5081 +ENDCHAR +STARTCHAR U+9BB4 +ENCODING 39860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +1E50 +2490 +7EFC +2B90 +3EB8 +2AB8 +3EB8 +04D4 +3AD4 +2E90 +2890 +4090 +0000 +ENDCHAR +STARTCHAR U+9BB5 +ENCODING 39861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3E82 +4501 +087C +7E44 +4A44 +4A44 +7E7C +4A28 +4A28 +7E48 +0048 +5689 +550F +0000 +0000 +ENDCHAR +STARTCHAR U+9BB6 +ENCODING 39862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +3E22 +4422 +09FF +7E22 +4AFE +4A20 +7E40 +4AFF +4B41 +7E41 +0041 +557F +5541 +0000 +0000 +ENDCHAR +STARTCHAR U+9BB7 +ENCODING 39863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1808 +1458 +3C54 +2AFC +7E2C +6AFC +3EA0 +2AFE +3FE4 +2064 +1AB4 +752C +4220 +0020 +0000 +ENDCHAR +STARTCHAR U+9BB8 +ENCODING 39864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3E7E +4484 +0808 +7EFE +4A92 +4A92 +7EFE +4A48 +4A48 +7E48 +0048 +5689 +550F +0000 +0000 +ENDCHAR +STARTCHAR U+9BB9 +ENCODING 39865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1EA8 +24A4 +7F24 +2AF8 +3E88 +2AF8 +3E88 +04F8 +3A88 +2E88 +2888 +4098 +0000 +ENDCHAR +STARTCHAR U+9BBB +ENCODING 39867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1830 +1E60 +1446 +2CFA +3F68 +2B48 +3E4F +3E60 +2A7E +3E6C +2098 +3618 +3D2E +7DC7 +0000 +ENDCHAR +STARTCHAR U+9BBC +ENCODING 39868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +10FE +1C04 +24FE +2804 +2AFC +2A04 +2AFF +2B06 +2ACC +3E4C +0038 +0230 +577C +558C +0000 +ENDCHAR +STARTCHAR U+9BBD +ENCODING 39869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3E28 +4444 +0882 +7F01 +4A7C +4A10 +7EFE +4A10 +4A38 +7E54 +0092 +5511 +5510 +0000 +0000 +ENDCHAR +STARTCHAR U+9BBE +ENCODING 39870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +181E +1CFC +14A6 +24F4 +3ED8 +2B20 +2E24 +3F6E +2BEC +3EC8 +22D8 +3238 +776E +7DC2 +0000 +ENDCHAR +STARTCHAR U+9BBF +ENCODING 39871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11F4 +3EA4 +44A4 +08E4 +7EA4 +4AA4 +4AE4 +7EA4 +4AA4 +4AA4 +7FFC +0025 +5525 +5527 +0000 +0000 +ENDCHAR +STARTCHAR U+9BC0 +ENCODING 39872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +080C +09F0 +1E20 +2428 +7EC8 +2A30 +3E30 +2A48 +3FF4 +0420 +3AA8 +2EA4 +2924 +4020 +0000 +ENDCHAR +STARTCHAR U+9BC1 +ENCODING 39873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107F +3E08 +447F +0849 +7F7F +4949 +7F7F +4908 +4908 +7F28 +0018 +5518 +5524 +5543 +0000 +0000 +ENDCHAR +STARTCHAR U+9BC3 +ENCODING 39875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FF +3E10 +4410 +087E +7E12 +4A12 +4AFF +7E00 +4A7E +4A42 +7E42 +0042 +557E +5542 +0000 +0000 +ENDCHAR +STARTCHAR U+9BC4 +ENCODING 39876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1012 +3E11 +45FF +0810 +7E10 +4A92 +4A54 +7E38 +4A54 +4A94 +7F12 +0011 +5530 +5510 +0000 +0000 +ENDCHAR +STARTCHAR U+9BC6 +ENCODING 39878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0828 +0824 +1FFC +2420 +7EF8 +2AA8 +3EA8 +2AF8 +3EA8 +04F8 +3AA8 +2EA8 +28A8 +4098 +0000 +ENDCHAR +STARTCHAR U+9BC7 +ENCODING 39879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3E10 +44FF +0881 +7E00 +4A7E +4A00 +7EFF +4A28 +4A28 +7E28 +0028 +5549 +5587 +0000 +0000 +ENDCHAR +STARTCHAR U+9BC8 +ENCODING 39880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +09FC +1288 +2450 +6020 +2850 +28A8 +297C +2B92 +29FC +2924 +29FC +2124 +21FC +2252 +0000 +0000 +ENDCHAR +STARTCHAR U+9BC9 +ENCODING 39881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1EA8 +24A8 +7EF8 +2AA8 +3EA8 +2AF8 +3E20 +04F8 +3A20 +2E20 +29FC +4000 +0000 +ENDCHAR +STARTCHAR U+9BCA +ENCODING 39882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +4950 +2148 +0AD4 +1464 +2380 +27C0 +0880 +3FE0 +0920 +0FE0 +0FE0 +1490 +2248 +0000 +ENDCHAR +STARTCHAR U+9BCE +ENCODING 39886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2014 +3812 +2810 +49FE +1110 +7D10 +5510 +55E9 +7D29 +552A +552A +7D24 +02CD +5615 +5423 +5041 +ENDCHAR +STARTCHAR U+9BCF +ENCODING 39887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0848 +0888 +1FA8 +24A8 +7EA8 +2BE8 +3EA8 +2AE8 +3FE8 +05A8 +3AA8 +2E88 +2888 +4098 +0000 +ENDCHAR +STARTCHAR U+9BD0 +ENCODING 39888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3810 +28FE +4810 +1010 +7C10 +55FF +5410 +7C10 +5490 +549F +7C90 +0090 +5550 +5530 +520F +ENDCHAR +STARTCHAR U+9BD1 +ENCODING 39889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0808 +08D0 +1E70 +25A8 +7E20 +2BFC +3E60 +2AA0 +3FF8 +04A8 +3AA8 +2EA8 +28B8 +4020 +0000 +ENDCHAR +STARTCHAR U+9BD2 +ENCODING 39890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1E50 +2420 +7EF8 +2AA8 +3EA8 +2AF8 +3EA8 +04F8 +3AA8 +2EA8 +28A8 +40B8 +0000 +ENDCHAR +STARTCHAR U+9BD3 +ENCODING 39891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3E7C +44C4 +0844 +7E7C +4A44 +4A7C +7E45 +4A46 +4AFC +7E14 +0024 +5544 +550C +0000 +0000 +ENDCHAR +STARTCHAR U+9BD4 +ENCODING 39892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A8 +08A8 +1F50 +2550 +7EA8 +2AA8 +3E00 +2AF8 +3EA8 +04F8 +3AA8 +2EA8 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9BD5 +ENCODING 39893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1022 +3E22 +447F +0822 +7E22 +4A3E +4A22 +7E22 +4A3E +4A22 +7E22 +007F +5522 +5541 +0000 +0000 +ENDCHAR +STARTCHAR U+9BD6 +ENCODING 39894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +1E20 +24F8 +7E20 +2BFC +3E00 +2AF8 +3E88 +04F8 +3A88 +2EF8 +2888 +4098 +0000 +ENDCHAR +STARTCHAR U+9BD7 +ENCODING 39895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +1FFC +3FFC +0080 +7FFF +1104 +23F2 +4421 +0FF8 +0888 +0FF8 +0888 +0FF8 +2122 +0000 +0000 +ENDCHAR +STARTCHAR U+9BD8 +ENCODING 39896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0818 +18F0 +1C24 +2DFC +7E70 +7AA8 +3F24 +3A28 +3EFE +03F0 +3AB0 +74E0 +50D8 +018C +0200 +ENDCHAR +STARTCHAR U+9BD9 +ENCODING 39897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +3E7F +4400 +083E +7F22 +493E +4900 +7F3E +4904 +4908 +7F7F +0008 +5508 +5518 +0000 +0000 +ENDCHAR +STARTCHAR U+9BDA +ENCODING 39898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +3EFC +4410 +0810 +7EFF +4A52 +4A91 +7E7C +4A08 +4A10 +7EFF +0010 +5510 +5530 +0000 +0000 +ENDCHAR +STARTCHAR U+9BDB +ENCODING 39899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1EA8 +24A8 +7EF8 +2AA8 +3EF8 +2A88 +3EF8 +04D8 +3AF8 +2F58 +2908 +4218 +0000 +ENDCHAR +STARTCHAR U+9BDC +ENCODING 39900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3E10 +44FE +0844 +7E28 +4BFF +4A40 +7E44 +4BFF +4A44 +7E44 +0028 +5510 +556E +0000 +0000 +ENDCHAR +STARTCHAR U+9BDD +ENCODING 39901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +3C96 +2C96 +28FE +2A96 +2ABE +3EEE +2ACE +2ACE +3EFE +00C6 +0286 +5786 +5400 +0000 +ENDCHAR +STARTCHAR U+9BDE +ENCODING 39902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +3E04 +44FF +0804 +7E7C +4A00 +4AFF +7E91 +4A7E +4A52 +7E52 +0052 +5556 +5510 +0000 +0000 +ENDCHAR +STARTCHAR U+9BDF +ENCODING 39903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1030 +1436 +2430 +28B4 +3EF6 +2AB6 +2AF6 +2AB6 +2AFE +3E38 +007C +02B6 +5730 +5430 +0000 +ENDCHAR +STARTCHAR U+9BE0 +ENCODING 39904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3EFF +4410 +0852 +7E52 +4A52 +7EB5 +4A10 +4A10 +4A38 +7E54 +0092 +5511 +5510 +0000 +0000 +ENDCHAR +STARTCHAR U+9BE1 +ENCODING 39905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0850 +0850 +1E50 +25DC +7E50 +2A50 +3FDC +2A50 +3E70 +05DC +3A90 +2E90 +2910 +4210 +0000 +ENDCHAR +STARTCHAR U+9BE2 +ENCODING 39906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +1E98 +2488 +7ED8 +2A88 +3E88 +2AF8 +3E68 +0460 +3AA0 +2EA4 +2924 +421C +0000 +ENDCHAR +STARTCHAR U+9BE3 +ENCODING 39907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1E88 +24F8 +7E88 +2AF8 +3E40 +2AFC +3F54 +0454 +3A94 +2F24 +2844 +4018 +0000 +ENDCHAR +STARTCHAR U+9BE4 +ENCODING 39908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1E88 +2488 +7EF8 +2A88 +3EF8 +2A90 +3E94 +04F8 +3A90 +2E94 +28D4 +430C +0000 +ENDCHAR +STARTCHAR U+9BE5 +ENCODING 39909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3E10 +44FE +0810 +7E10 +4BFF +4A44 +7E44 +4B93 +4A10 +7E7E +0010 +5510 +55FF +0000 +0000 +ENDCHAR +STARTCHAR U+9BE6 +ENCODING 39910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3E42 +447A +0892 +7E12 +4A95 +4A60 +7F9F +4A00 +4A7E +7E42 +0042 +5542 +557E +0000 +0000 +ENDCHAR +STARTCHAR U+9BE7 +ENCODING 39911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +7E7E +0842 +7E7E +5242 +527E +7E00 +52FF +5281 +7EFF +2481 +2481 +2AFF +5181 +0000 +0000 +ENDCHAR +STARTCHAR U+9BE8 +ENCODING 39912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1FFC +2400 +7EF8 +2A88 +3E88 +2AF8 +3E20 +04B0 +3AA8 +2EA4 +2924 +4060 +0000 +ENDCHAR +STARTCHAR U+9BEA +ENCODING 39914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3E10 +44FE +0810 +7FFF +4A44 +7EA3 +4A7E +4A84 +4A24 +7E24 +0018 +5518 +5567 +0000 +0000 +ENDCHAR +STARTCHAR U+9BEB +ENCODING 39915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3EF0 +44AE +08A2 +7EEA +4AAA +7EAA +4AEA +4AAA +4AAA +7EAA +00E4 +552A +5531 +0000 +0000 +ENDCHAR +STARTCHAR U+9BEC +ENCODING 39916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +3C20 +083F +7F49 +2A11 +4903 +03F0 +0420 +0FF8 +0888 +0FF8 +0888 +0FF8 +4211 +0000 +0000 +ENDCHAR +STARTCHAR U+9BEF +ENCODING 39919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0804 +1046 +1DC2 +2968 +2FEA +7E48 +2FEA +3C7A +2DFA +312A +0B22 +3B62 +5108 +4084 +0004 +ENDCHAR +STARTCHAR U+9BF0 +ENCODING 39920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1E50 +2488 +7F74 +2A00 +3EF8 +2A10 +3E20 +0458 +3AD4 +2EC4 +2950 +4030 +0000 +ENDCHAR +STARTCHAR U+9BF1 +ENCODING 39921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0838 +1E20 +24FC +7EA8 +2AF8 +3EA4 +2A9C +3EF0 +04D0 +3B50 +2F54 +2A94 +410C +0000 +ENDCHAR +STARTCHAR U+9BF2 +ENCODING 39922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0890 +0890 +1E90 +24A8 +7FE8 +2A84 +3E94 +2AC8 +3EC8 +04C0 +3B50 +2F48 +2A44 +4184 +0000 +ENDCHAR +STARTCHAR U+9BF3 +ENCODING 39923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1830 +1010 +1CFE +2CCC +3EF8 +6AD0 +3ED0 +2BFC +3FF0 +2150 +3F48 +7F68 +52CE +407E +0002 +ENDCHAR +STARTCHAR U+9BF5 +ENCODING 39925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0830 +1E48 +25F4 +7E20 +2BFC +3E50 +2A98 +3F64 +0410 +3A64 +2E08 +2830 +41C0 +0000 +ENDCHAR +STARTCHAR U+9BF7 +ENCODING 39927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107E +3E42 +447E +0842 +7E7E +4A00 +4AFF +7E08 +4A48 +4A4E +7E48 +0048 +5568 +559F +0000 +0000 +ENDCHAR +STARTCHAR U+9BF8 +ENCODING 39928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +105E +3E42 +4482 +09BF +7E80 +4A90 +4A9F +7EA4 +4A84 +4A84 +7EBF +0084 +568A +5591 +0000 +0000 +ENDCHAR +STARTCHAR U+9BF9 +ENCODING 39929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +148C +1C84 +2CCC +3E84 +2AFC +2AB0 +2AB0 +2AFC +3F30 +00FC +3230 +7730 +50FC +0000 +ENDCHAR +STARTCHAR U+9BFA +ENCODING 39930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0860 +1860 +1C6C +3CF8 +3E78 +7AFE +3FE0 +3AFC +3FF8 +1388 +0AF8 +36C8 +70F8 +00C8 +0000 +ENDCHAR +STARTCHAR U+9BFD +ENCODING 39933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +21EF +7D29 +0929 +7DE9 +5529 +5529 +7DE9 +5529 +550D +7D4A +0148 +29A8 +5508 +0000 +0000 +ENDCHAR +STARTCHAR U+9BFF +ENCODING 39935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100E +1CF8 +1482 +24FF +3E82 +2AFE +2E82 +2EFF +2BAB +2FAF +21FF +07AB +3FAB +52AF +0000 +0000 +ENDCHAR +STARTCHAR U+9C00 +ENCODING 39936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +100C +1C7C +3CA6 +2CB4 +3E9C +2AF0 +2A60 +2BFE +2A40 +3E7C +00E8 +3E98 +7738 +54CC +0000 +ENDCHAR +STARTCHAR U+9C02 +ENCODING 39938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0002 +1806 +1DEE +352E +29EE +7F2E +2B2E +3FEE +2B2E +3FEE +230E +1686 +3F26 +3D16 +2000 +ENDCHAR +STARTCHAR U+9C04 +ENCODING 39940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1030 +1028 +1C28 +2BFC +7E20 +2FE8 +3EA8 +2FE8 +3F78 +0B50 +3E94 +3EDC +352C +4844 +0000 +ENDCHAR +STARTCHAR U+9C05 +ENCODING 39941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107E +3E52 +447E +0852 +7E52 +4A7E +4A10 +7EFF +4A91 +4A91 +7E95 +00BD +5581 +5483 +0000 +0000 +ENDCHAR +STARTCHAR U+9C06 +ENCODING 39942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1FFC +2420 +7EF8 +2A20 +3FFC +2A50 +3EF8 +058C +3AF8 +2E88 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9C07 +ENCODING 39943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107F +1E14 +2408 +087F +7F29 +4948 +4918 +7F08 +497F +4908 +7F2A +0049 +5508 +5508 +0000 +0000 +ENDCHAR +STARTCHAR U+9C08 +ENCODING 39944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08A8 +08A8 +1FFC +24A8 +7EB8 +2A80 +3EFC +2A20 +3FFC +0470 +3A70 +2EA8 +2924 +4020 +0000 +ENDCHAR +STARTCHAR U+9C09 +ENCODING 39945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +1EF8 +2488 +7EF8 +2A88 +3EF8 +2A00 +3FFC +0420 +3AF8 +2E20 +29FC +4000 +0000 +ENDCHAR +STARTCHAR U+9C0A +ENCODING 39946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1FFC +2420 +7EF8 +2AB8 +3EE8 +2AF8 +3E70 +0470 +3AA8 +2F24 +2820 +4020 +0000 +ENDCHAR +STARTCHAR U+9C0B +ENCODING 39947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +2100 +3D7F +4941 +117F +7D41 +557F +7D22 +55FF +7D24 +0118 +2924 +5543 +55FF +0000 +0000 +ENDCHAR +STARTCHAR U+9C0C +ENCODING 39948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0870 +0850 +1E50 +2488 +7FFC +2A30 +3EF8 +2AB8 +3ED8 +0488 +3AF8 +2E88 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9C0D +ENCODING 39949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0830 +09D0 +1E90 +2494 +7EB4 +2BF4 +3EB8 +2AD0 +3FF0 +05A8 +3AA8 +2EC8 +28C4 +4084 +0000 +ENDCHAR +STARTCHAR U+9C0E +ENCODING 39950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3C3E +4B8A +108A +7D3F +578A +54BE +7C88 +54BE +5488 +7DBE +0088 +2948 +543F +0000 +0000 +ENDCHAR +STARTCHAR U+9C0F +ENCODING 39951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +14FE +3400 +287C +3E4C +2A7C +2E4C +2EFE +2A96 +3EB6 +00B6 +0296 +75FE +5582 +0000 +ENDCHAR +STARTCHAR U+9C10 +ENCODING 39952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09DC +1F54 +25DC +7E00 +2AF8 +3E00 +2BFC +3E40 +0478 +3A88 +2E08 +2808 +4030 +0000 +ENDCHAR +STARTCHAR U+9C11 +ENCODING 39953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +18FE +1EC4 +34FC +28C4 +3FFC +2A00 +3FFE +2AFF +2BEB +3E52 +00B2 +3766 +7D0C +5000 +0000 +ENDCHAR +STARTCHAR U+9C12 +ENCODING 39954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1EFC +25F8 +7E88 +2AF8 +3E88 +2AF8 +3E40 +04F8 +3B50 +2E20 +28D0 +430C +0000 +ENDCHAR +STARTCHAR U+9C13 +ENCODING 39955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1EA8 +24A8 +7EF8 +2AA8 +3EF8 +2A20 +3E50 +04D8 +3AC4 +2F54 +2950 +4030 +0000 +ENDCHAR +STARTCHAR U+9C14 +ENCODING 39956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0828 +0824 +1E24 +25FC +7F20 +2BE8 +3F28 +2BE8 +3FB0 +05F0 +3B94 +2F2C +2A4C +4284 +0000 +ENDCHAR +STARTCHAR U+9C15 +ENCODING 39957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1F48 +2548 +7FD8 +2B48 +3F00 +2BF8 +3F28 +0528 +3BD0 +2F10 +2928 +4144 +0000 +ENDCHAR +STARTCHAR U+9C16 +ENCODING 39958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +1860 +1CFE +3DC0 +3EF8 +7ABE +3FFC +3AFC +3EEC +10BC +369C +34EC +609C +008C +0080 +ENDCHAR +STARTCHAR U+9C17 +ENCODING 39959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +104F +3E49 +4449 +09FF +7E49 +4A49 +4AEF +7EA9 +4AA9 +4AA9 +7EA9 +00A9 +56E9 +550B +0000 +0000 +ENDCHAR +STARTCHAR U+9C18 +ENCODING 39960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3810 +29FF +4901 +1000 +7CFE +5420 +5444 +7C5E +54F2 +5410 +7C10 +00FE +5410 +5410 +51FF +ENDCHAR +STARTCHAR U+9C19 +ENCODING 39961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +3844 +29EF +4844 +1054 +7C10 +55FF +5420 +7C40 +54FE +5542 +7C42 +0042 +5442 +547E +5042 +ENDCHAR +STARTCHAR U+9C1A +ENCODING 39962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3810 +29FF +4901 +1101 +7CFE +5400 +54FE +7C82 +5482 +54FE +7C82 +0082 +54FE +5400 +53FF +ENDCHAR +STARTCHAR U+9C1B +ENCODING 39963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1E88 +2488 +7EF8 +2A88 +3EF8 +2A00 +3EF8 +04E8 +3AE8 +2EE8 +29FC +4000 +0000 +ENDCHAR +STARTCHAR U+9C1C +ENCODING 39964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3E28 +45FF +0828 +7EFE +4A2A +4BFF +7E2A +4AFE +4A28 +7E28 +006C +56AA +5529 +0000 +0000 +ENDCHAR +STARTCHAR U+9C1D +ENCODING 39965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3EFF +4400 +083C +7E24 +4A3C +4A00 +7EFF +4A81 +4ABD +7EA5 +00A5 +56BD +5581 +0000 +0000 +ENDCHAR +STARTCHAR U+9C1E +ENCODING 39966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1860 +1060 +3CF8 +2CF8 +7EB8 +2EF0 +3EFC +2EC4 +3EFC +2494 +5BFC +5B68 +4008 +0038 +0010 +ENDCHAR +STARTCHAR U+9C21 +ENCODING 39969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +1FFC +2594 +7F54 +2BF4 +3F2C +2A40 +3EF8 +04A8 +3AF8 +2EA8 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9C22 +ENCODING 39970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +187C +1CF0 +3CB8 +2EF8 +7EFC +2EF0 +3EFE +3EE4 +38F4 +02FC +3FCC +7508 +4018 +0000 +ENDCHAR +STARTCHAR U+9C23 +ENCODING 39971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +7C3E +09C8 +1148 +7D48 +557F +55C2 +7D42 +557F +5542 +7D52 +01CA +5402 +5406 +0000 +0000 +ENDCHAR +STARTCHAR U+9C24 +ENCODING 39972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08FC +1F10 +25D0 +7F7C +2B74 +3FF4 +2B34 +3FF4 +0574 +3B7C +2FD0 +2910 +4010 +0000 +ENDCHAR +STARTCHAR U+9C25 +ENCODING 39973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1F54 +2554 +7FFC +2A20 +3EA8 +2AA8 +3F24 +0470 +3AA8 +2F24 +2820 +4020 +0000 +ENDCHAR +STARTCHAR U+9C26 +ENCODING 39974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3000 +3098 +3FDE +2898 +7C08 +7F98 +7F54 +7FDC +7FDC +7E88 +6598 +015C +7FF6 +7E00 +5000 +ENDCHAR +STARTCHAR U+9C27 +ENCODING 39975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +35F8 +3CF0 +35F8 +3484 +3FFC +35F8 +35EC +3F50 +3DD8 +2FF0 +2FF0 +2C10 +3EA8 +4EA8 +0000 +ENDCHAR +STARTCHAR U+9C28 +ENCODING 39976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107E +3E42 +447E +0842 +7E7E +4A00 +4BEF +7EA5 +4B29 +4A21 +7E63 +00A5 +5621 +5542 +0000 +0000 +ENDCHAR +STARTCHAR U+9C29 +ENCODING 39977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E1F +4469 +0826 +7E1C +4AF0 +4A20 +7E7E +4B88 +4A08 +7EFF +0008 +5649 +557F +0000 +0000 +ENDCHAR +STARTCHAR U+9C2A +ENCODING 39978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1000 +1020 +1420 +3CF8 +2E24 +7FF8 +2C50 +3DF8 +3D88 +31F8 +0FE8 +5B68 +5178 +47FE +0000 +ENDCHAR +STARTCHAR U+9C2B +ENCODING 39979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3E10 +45FF +0929 +7F45 +4A92 +4A28 +7E44 +4B83 +4A7C +7E44 +0044 +557C +5544 +0000 +0000 +ENDCHAR +STARTCHAR U+9C2C +ENCODING 39980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +101C +3E10 +44FF +0891 +7EFE +4A90 +4A9C +7E88 +4AFF +4AA4 +7EA4 +0118 +5618 +5567 +0000 +0000 +ENDCHAR +STARTCHAR U+9C2D +ENCODING 39981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08F8 +1E28 +25FC +7E68 +2A70 +3EC4 +2B3C +3EF8 +0488 +3AF8 +2E88 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9C2E +ENCODING 39982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1EA8 +24A8 +7ED8 +2A88 +3EF8 +2A00 +3EF8 +04E8 +3AE8 +2EE8 +29FC +4000 +0000 +ENDCHAR +STARTCHAR U+9C2F +ENCODING 39983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09F8 +1E48 +2448 +7FF8 +2B20 +3FF8 +2A48 +3F68 +04D8 +3AD8 +2F68 +2848 +41B0 +0000 +ENDCHAR +STARTCHAR U+9C30 +ENCODING 39984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +11D0 +1C10 +283C +7FF4 +2AB4 +3FFC +2BF4 +3FF4 +05FC +3FB4 +2E90 +2890 +4090 +0000 +ENDCHAR +STARTCHAR U+9C31 +ENCODING 39985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +227F +3D08 +48FF +7C49 +547F +5749 +7D49 +557F +7D08 +017F +5708 +5488 +547F +0000 +0000 +ENDCHAR +STARTCHAR U+9C32 +ENCODING 39986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +7F7C +08C8 +7F28 +1E30 +26C8 +4784 +3FE0 +0920 +0FE0 +0FE0 +1490 +2248 +0000 +ENDCHAR +STARTCHAR U+9C33 +ENCODING 39987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20A4 +3DF4 +48A4 +10EF +7C45 +55F5 +5555 +7DF5 +5445 +55F5 +7C45 +2845 +5449 +5442 +0000 +0000 +ENDCHAR +STARTCHAR U+9C34 +ENCODING 39988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +22A8 +43EF +0802 +17F2 +31E2 +5242 +13E2 +12A2 +13E2 +12AA +13E4 +100A +1551 +0000 +0000 +ENDCHAR +STARTCHAR U+9C35 +ENCODING 39989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1040 +1FFE +1FD8 +3F30 +3E7C +0686 +0780 +0FF8 +0FF8 +0998 +0818 +126C +2326 +0122 +0000 +ENDCHAR +STARTCHAR U+9C36 +ENCODING 39990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2042 +3CF4 +4999 +1266 +7D42 +5481 +557C +7E00 +54FE +5454 +7C92 +2911 +5410 +5410 +0000 +0000 +ENDCHAR +STARTCHAR U+9C37 +ENCODING 39991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2050 +7C9F +0922 +1312 +7D4C +554C +5553 +7D48 +557F +5548 +7D1C +012A +5549 +5508 +0000 +0000 +ENDCHAR +STARTCHAR U+9C39 +ENCODING 39993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1F44 +25F4 +7F28 +2BE8 +3F54 +2BE4 +3E20 +04F8 +3A20 +2E20 +29FC +4000 +0000 +ENDCHAR +STARTCHAR U+9C3A +ENCODING 39994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0850 +1EF8 +2490 +7F68 +2BFC +3E60 +2BB0 +3ECC +0420 +3AC8 +2E10 +2860 +4180 +0000 +ENDCHAR +STARTCHAR U+9C3B +ENCODING 39995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1E88 +24F8 +7E88 +2AF8 +3FFC +2B54 +3FFC +04F8 +3A50 +2E20 +28D0 +430C +0000 +ENDCHAR +STARTCHAR U+9C3C +ENCODING 39996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21EF +7CA5 +0929 +1063 +7EA5 +4A21 +4AD6 +7E00 +4A20 +4A7E +7E42 +007E +5542 +557E +0000 +0000 +ENDCHAR +STARTCHAR U+9C3D +ENCODING 39997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +21FF +3C44 +49FF +1145 +7DFF +5545 +7DFF +5400 +7CFE +0082 +28FE +5482 +54FE +0000 +0000 +ENDCHAR +STARTCHAR U+9C3E +ENCODING 39998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +1E50 +25FC +7F54 +2BFC +3E00 +2AF8 +3E00 +05FC +3AA8 +2EA4 +2924 +4060 +0000 +ENDCHAR +STARTCHAR U+9C3F +ENCODING 39999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3EFE +4410 +08FE +7E10 +4BFF +4A7E +7E42 +4A7E +4A42 +7E7E +0042 +557E +55C3 +0000 +0000 +ENDCHAR +STARTCHAR U+9C40 +ENCODING 40000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3EFC +2290 +3AFC +3E32 +2852 +349E +03F0 +0420 +0FF8 +0888 +0FE8 +0FF8 +2222 +2222 +0000 +0000 +ENDCHAR +STARTCHAR U+9C41 +ENCODING 40001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +3D3F +4884 +1038 +7DC5 +544D +54B6 +7D0D +54B4 +5484 +7C84 +008C +2900 +56FF +0000 +0000 +ENDCHAR +STARTCHAR U+9C43 +ENCODING 40003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +104C +1C68 +24FE +2810 +3E7E +2A12 +2AFE +3EFC +2AF4 +2AF4 +22FF +00A4 +57A4 +5566 +5000 +0000 +ENDCHAR +STARTCHAR U+9C44 +ENCODING 40004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +21FF +3C10 +48FE +1092 +7CFE +5492 +7CFE +5411 +7DFF +0004 +29FF +5444 +542C +0000 +0000 +ENDCHAR +STARTCHAR U+9C45 +ENCODING 40005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1010 +1D3E +3DB4 +29FC +3FFE +3FFC +3FB4 +3FF4 +3FF4 +3FF4 +25F4 +3FF4 +3EB4 +20B4 +0000 +ENDCHAR +STARTCHAR U+9C46 +ENCODING 40006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1EF8 +2450 +7FFC +2AF8 +3E88 +2AF8 +3E88 +04F8 +3A20 +2FFC +2820 +4020 +0000 +ENDCHAR +STARTCHAR U+9C47 +ENCODING 40007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +1EFC +24A0 +7EF8 +2AA8 +3EFC +2AA8 +3EF8 +04A8 +3AF0 +2F68 +29A4 +4260 +0000 +ENDCHAR +STARTCHAR U+9C48 +ENCODING 40008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +08F8 +1E20 +25FC +7F24 +2AF8 +3EF8 +2A20 +3EF8 +0408 +3BFC +2E08 +28F8 +4008 +0000 +ENDCHAR +STARTCHAR U+9C49 +ENCODING 40009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2A10 +4910 +083F +7F42 +5DA4 +6B18 +4914 +4B63 +0FF8 +1020 +3FFC +5084 +1FFC +1084 +1FFE +6091 +ENDCHAR +STARTCHAR U+9C4A +ENCODING 40010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +3E08 +4450 +09FF +7E4A +4A88 +4A38 +7EFF +4AA5 +4AE7 +7EB9 +00A9 +56B9 +5583 +0000 +0000 +ENDCHAR +STARTCHAR U+9C4B +ENCODING 40011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3E1E +4410 +08FF +7E91 +4AFE +4A90 +7E8E +4A80 +4A94 +7ED5 +0177 +5614 +557F +0000 +0000 +ENDCHAR +STARTCHAR U+9C4C +ENCODING 40012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3EFE +4508 +08FE +7E92 +4AFE +4A30 +7EC9 +4A1A +4AEC +7E1C +00EA +5609 +5530 +0000 +0000 +ENDCHAR +STARTCHAR U+9C4D +ENCODING 40013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10F8 +3E9A +4465 +0842 +7E81 +4AEE +4A2A +7EEB +4A90 +4A80 +7EEF +002A +5524 +55DB +0000 +0000 +ENDCHAR +STARTCHAR U+9C4E +ENCODING 40014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +3EFC +4410 +09FF +7E44 +4ABA +4B29 +7E38 +4A00 +4AFE +7EBA +00AA +56BA +5586 +0000 +0000 +ENDCHAR +STARTCHAR U+9C4F +ENCODING 40015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0002 +18FE +1EFE +14FE +24BE +3FFE +3F84 +3FC4 +3FFC +3FCC +32B4 +00FE +2D10 +2F10 +2810 +ENDCHAR +STARTCHAR U+9C50 +ENCODING 40016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3CFE +4812 +11FF +7C12 +54FE +5555 +7DD7 +5511 +55FF +7D11 +29D7 +5555 +5555 +0000 +0000 +ENDCHAR +STARTCHAR U+9C52 +ENCODING 40018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0850 +1FFC +2430 +7EF8 +2AB8 +3ED8 +2AF8 +3EF8 +0410 +3BFC +2E90 +2850 +4030 +0000 +ENDCHAR +STARTCHAR U+9C53 +ENCODING 40019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +08BE +0ABE +0EBE +1AFE +1744 +17F4 +1574 +1F74 +1554 +1F74 +10FE +0210 +1690 +1610 +0000 +ENDCHAR +STARTCHAR U+9C54 +ENCODING 40020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +3DFF +4810 +11FF +7C10 +55FF +5444 +7C44 +55FF +5444 +7DFF +0101 +5501 +55FF +0000 +0000 +ENDCHAR +STARTCHAR U+9C55 +ENCODING 40021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1002 +3EFC +4412 +0894 +7E58 +4BFF +4A54 +7E92 +4BFF +4A92 +7EFE +0092 +56FE +5582 +0000 +0000 +ENDCHAR +STARTCHAR U+9C56 +ENCODING 40022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +23FF +3E00 +4B14 +12A4 +7FF7 +5649 +7F52 +5752 +7F52 +03F2 +5442 +5485 +5509 +0000 +0000 +ENDCHAR +STARTCHAR U+9C57 +ENCODING 40023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08A8 +1E70 +25FC +7E70 +2AA8 +3F24 +2AA8 +3EFC +0568 +3BE8 +2E7C +2888 +4108 +0000 +ENDCHAR +STARTCHAR U+9C58 +ENCODING 40024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +10FE +3E02 +45FF +0802 +7EFE +4A00 +4AEF +7E49 +4AEF +4A04 +7EFF +0044 +5524 +550C +0000 +0000 +ENDCHAR +STARTCHAR U+9C59 +ENCODING 40025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3E7E +4408 +08FF +7E42 +4AE7 +4A42 +7EEF +4A00 +4AFF +7E24 +0024 +5525 +5547 +0000 +0000 +ENDCHAR +STARTCHAR U+9C5A +ENCODING 40026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +09FC +1E20 +24F8 +7E00 +2AF8 +3E88 +2AF8 +3E50 +05FC +3AF8 +2E88 +28F8 +4088 +0000 +ENDCHAR +STARTCHAR U+9C5B +ENCODING 40027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20BC +3904 +2A02 +4DFD +1124 +7DAC +5574 +5524 +7DFC +5400 +55FC +7D04 +01FC +5504 +5504 +51FC +ENDCHAR +STARTCHAR U+9C5C +ENCODING 40028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2120 +3977 +2A55 +4AD5 +12F6 +7D56 +5554 +56F6 +7F85 +54A5 +54BD +7CA5 +00A6 +552C +5514 +5204 +ENDCHAR +STARTCHAR U+9C5D +ENCODING 40029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +18FF +1E54 +14FF +3444 +3F44 +35FE +3FFE +35C6 +3FFE +33C6 +00FE +2D64 +2FC3 +2803 +0000 +ENDCHAR +STARTCHAR U+9C5E +ENCODING 40030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +3D29 +49FF +1000 +7DFF +5400 +54FE +7C82 +54FE +5440 +7CC9 +294A +5444 +54E3 +0000 +0000 +ENDCHAR +STARTCHAR U+9C5F +ENCODING 40031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +114E +2082 +3D5E +2142 +3C9E +2142 +7FFF +47F1 +0820 +1FFC +17F4 +1084 +1FFC +2222 +0000 +0000 +ENDCHAR +STARTCHAR U+9C60 +ENCODING 40032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0860 +1E90 +25F8 +7FFC +2BD8 +3F68 +2BF8 +3EF0 +0490 +3AF0 +2E90 +28F0 +4090 +0000 +ENDCHAR +STARTCHAR U+9C62 +ENCODING 40034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +207C +7C44 +087C +1000 +7DEF +5529 +55EF +7C10 +5410 +55FF +7C54 +0092 +2911 +5410 +0000 +0000 +ENDCHAR +STARTCHAR U+9C63 +ENCODING 40035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3FFF +44FE +08BA +7EAA +4ABA +4AFE +7E7C +4A44 +4A7C +7E44 +007C +5600 +55FF +0000 +0000 +ENDCHAR +STARTCHAR U+9C66 +ENCODING 40038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +7D29 +0929 +11EF +7C28 +55EF +5529 +7DEF +5529 +55EF +7C20 +0020 +2821 +543F +0000 +0000 +ENDCHAR +STARTCHAR U+9C67 +ENCODING 40039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0860 +09F8 +1F68 +25F8 +7F68 +2BF8 +3E00 +2BFC +3EF8 +0488 +3AF8 +2E50 +29FC +4000 +0000 +ENDCHAR +STARTCHAR U+9C68 +ENCODING 40040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2092 +21FF +3D01 +497D +1044 +7C7C +5488 +7C92 +54FE +7CFE +0082 +28FE +5482 +54FE +0000 +0000 +ENDCHAR +STARTCHAR U+9C69 +ENCODING 40041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +3BFF +2820 +4BFF +1221 +7EAD +5420 +55AC +7C00 +55FE +5522 +7D22 +01FE +5522 +5522 +51FE +ENDCHAR +STARTCHAR U+9C6A +ENCODING 40042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FE +3882 +28FE +4882 +10FE +7C22 +55FC +5428 +7FFF +5428 +5444 +7CFE +0182 +56FE +5482 +50FE +ENDCHAR +STARTCHAR U+9C6B +ENCODING 40043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200E +3BF0 +2922 +4894 +13FF +7E21 +5552 +5545 +7E3D +5440 +557C +7EC4 +0148 +5430 +54CC +5303 +ENDCHAR +STARTCHAR U+9C6D +ENCODING 40045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3FFF +4428 +09D7 +7ED4 +4B56 +4A95 +7E82 +4AFE +4A82 +7EFE +0082 +5682 +5582 +0000 +0000 +ENDCHAR +STARTCHAR U+9C6E +ENCODING 40046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3E56 +449A +0892 +7ED6 +4A9A +4ACE +7E9A +4AAA +4A92 +7E82 +01FF +5624 +5542 +0000 +0000 +ENDCHAR +STARTCHAR U+9C70 +ENCODING 40048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +39FF +2929 +4929 +11FF +7C22 +55FC +5428 +7FFF +5428 +5444 +7CFE +0382 +54FE +5482 +50FE +ENDCHAR +STARTCHAR U+9C71 +ENCODING 40049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +21FF +7D24 +09FF +1124 +7D7E +554A +557E +7D4A +557E +5508 +7D7F +014B +295F +5641 +0000 +0000 +ENDCHAR +STARTCHAR U+9C72 +ENCODING 40050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1052 +1456 +1CA4 +24B4 +2A56 +3BFE +2AB2 +3EFE +2AB4 +2AFC +22B4 +00FC +37B6 +75F2 +0002 +ENDCHAR +STARTCHAR U+9C73 +ENCODING 40051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +7CBA +08AA +116D +7DFF +54AA +556D +7DFF +5410 +55FF +7C10 +0054 +5492 +5511 +0000 +0000 +ENDCHAR +STARTCHAR U+9C74 +ENCODING 40052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +3EFF +4424 +08FF +7EA5 +4AFF +4A0A +7EFF +4A88 +4A88 +7EEA +008C +568D +5513 +0000 +0000 +ENDCHAR +STARTCHAR U+9C75 +ENCODING 40053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +7DEF +0A52 +1004 +7C05 +55FF +5504 +7D74 +5504 +5575 +7D56 +0175 +290B +5601 +0000 +0000 +ENDCHAR +STARTCHAR U+9C76 +ENCODING 40054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0888 +0850 +1FFC +2420 +7EF8 +2BFC +3ED0 +2BF8 +3E94 +04F0 +3AF0 +2EA8 +28D0 +430C +0000 +ENDCHAR +STARTCHAR U+9C77 +ENCODING 40055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +39FF +4810 +11D7 +7D55 +55D7 +5410 +7CFF +5410 +55D7 +7D55 +01D7 +2810 +55FF +0000 +0000 +ENDCHAR +STARTCHAR U+9C78 +ENCODING 40056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0838 +1FFC +2568 +7FD8 +2BF8 +3FA8 +2BF8 +3FA8 +05F8 +3BF8 +2FE8 +2AE8 +41FC +0000 +ENDCHAR +STARTCHAR U+9C79 +ENCODING 40057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2044 +21FF +3C44 +49EF +1129 +7DEF +5484 +7DFF +5484 +7CFF +0084 +54FF +5484 +54FF +0000 +0000 +ENDCHAR +STARTCHAR U+9C7A +ENCODING 40058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +27FF +279E +3E96 +4E96 +1420 +7FFF +5448 +7FFF +5449 +7FFF +0508 +55CE +5529 +55EF +0000 +0000 +ENDCHAR +STARTCHAR U+9C7B +ENCODING 40059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0300 +07C0 +0FF8 +0FF0 +0FF0 +024C +3226 +0820 +1E78 +1F7C +1E7C +1E7C +1A6C +2BAE +029A +0000 +ENDCHAR +STARTCHAR U+9C7C +ENCODING 40060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +0FE0 +1040 +2088 +7FFC +A108 +2108 +3FF8 +2108 +2108 +3FF8 +2008 +0004 +FFFE +0000 +ENDCHAR +STARTCHAR U+9C7F +ENCODING 40063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2060 +3C50 +4850 +9044 +7FFE +5440 +5450 +7C50 +5450 +5450 +7C90 +0090 +1D12 +E212 +440E +ENDCHAR +STARTCHAR U+9C81 +ENCODING 40065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0FE0 +1088 +3FFC +E108 +3FF8 +2108 +3FF8 +0000 +FFFE +0010 +1FF8 +1010 +1FF0 +1010 +1FF0 +ENDCHAR +STARTCHAR U+9C82 +ENCODING 40066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2020 +3C20 +4804 +93FE +7C80 +5488 +54FC +7C88 +5488 +5488 +7C88 +0088 +1D08 +E128 +4210 +ENDCHAR +STARTCHAR U+9C85 +ENCODING 40069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2060 +3C50 +4844 +93FE +7C80 +5480 +54FC +7C84 +54C4 +5548 +7D28 +0110 +1E28 +E246 +4584 +ENDCHAR +STARTCHAR U+9C86 +ENCODING 40070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2008 +3DFC +4820 +9124 +7CA8 +54A8 +5420 +7C24 +57FE +5420 +7C20 +0020 +1C20 +E020 +4020 +ENDCHAR +STARTCHAR U+9C87 +ENCODING 40071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +3C48 +487C +9040 +7C40 +5440 +5448 +7DFC +5508 +5508 +7D08 +0108 +1D08 +E1F8 +4108 +ENDCHAR +STARTCHAR U+9C88 +ENCODING 40072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2044 +3C7E +4840 +9044 +7DFE +5504 +5504 +7D04 +55FC +5504 +7D00 +0100 +1D00 +E200 +4400 +ENDCHAR +STARTCHAR U+9C8B +ENCODING 40075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +2048 +3C48 +4888 +9088 +7DFE +5688 +5488 +7CC8 +54A8 +54A8 +7C88 +0088 +1C88 +E0A8 +4090 +ENDCHAR +STARTCHAR U+9C8D +ENCODING 40077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +1E44 +147E +2884 +7F14 +AAF4 +2A94 +3E94 +2AF4 +2A94 +3E88 +0082 +0E82 +707E +2000 +ENDCHAR +STARTCHAR U+9C8E +ENCODING 40078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +0920 +4940 +7FFE +4402 +8404 +0FC0 +1090 +3FF8 +5110 +1FF0 +1110 +1FF0 +0004 +FFFE +0000 +ENDCHAR +STARTCHAR U+9C90 +ENCODING 40080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +3C40 +4888 +9104 +7FFE +5400 +5404 +7DFE +5504 +5504 +7D04 +0104 +1D04 +E1FC +4104 +ENDCHAR +STARTCHAR U+9C91 +ENCODING 40081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2028 +3DFC +4820 +9020 +7C24 +57FE +5420 +7C20 +5428 +55FC +7C20 +0020 +1C24 +E3FE +4000 +ENDCHAR +STARTCHAR U+9C92 +ENCODING 40082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +3C24 +4BFE +9020 +7C28 +55FC +5400 +7C04 +55FE +5504 +7D04 +0104 +1D04 +E1FC +4104 +ENDCHAR +STARTCHAR U+9C94 +ENCODING 40084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +3C44 +4BFE +9080 +7C88 +55FC +5688 +7C88 +54F8 +5488 +7C88 +00F8 +1C88 +E0A8 +4090 +ENDCHAR +STARTCHAR U+9C95 +ENCODING 40085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +3C20 +4820 +9044 +7DFE +5554 +5554 +7D54 +5554 +5554 +7D54 +0154 +1D04 +E114 +4008 +ENDCHAR +STARTCHAR U+9C9A +ENCODING 40090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2020 +3C04 +4BFE +9088 +7C50 +5420 +5450 +7C8E +5704 +5488 +7C88 +0088 +1C88 +E108 +4208 +ENDCHAR +STARTCHAR U+9C9B +ENCODING 40091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2020 +3C04 +4BFE +9000 +7C88 +5506 +568A +7C88 +5450 +5450 +7C20 +0050 +1C88 +E106 +4604 +ENDCHAR +STARTCHAR U+9C9C +ENCODING 40092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1104 +1088 +1E54 +25FE +2820 +7E20 +AA28 +2BFC +3E20 +2A20 +2A24 +3FFE +0020 +0E20 +F020 +4020 +ENDCHAR +STARTCHAR U+9C9E +ENCODING 40094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0920 +0540 +3FF8 +0200 +FFFE +0440 +0A30 +37CE +C884 +1FF0 +3110 +1FF0 +1110 +1FF0 +0000 +7FFC +ENDCHAR +STARTCHAR U+9C9F +ENCODING 40095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +3C04 +4804 +91FC +7C04 +5404 +55FC +7C08 +5408 +57FE +7C88 +0048 +1C08 +E028 +4010 +ENDCHAR +STARTCHAR U+9CA0 +ENCODING 40096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +3C20 +4824 +91FE +7D24 +5524 +55FC +7D24 +5524 +55FC +7CA0 +00A0 +1C40 +E0B0 +430E +ENDCHAR +STARTCHAR U+9CA1 +ENCODING 40097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +3C00 +4804 +91DE +7D54 +5554 +5554 +7D54 +55DC +5554 +7D54 +0154 +1D54 +E154 +4154 +ENDCHAR +STARTCHAR U+9CA2 +ENCODING 40098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +3C24 +4AFE +9120 +7D20 +5450 +5750 +7DFC +5510 +5514 +7DFE +0110 +1D10 +E296 +447C +ENDCHAR +STARTCHAR U+9CA3 +ENCODING 40099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +3D7E +4962 +9154 +7D48 +5554 +5562 +7C20 +5428 +55FC +7C20 +0020 +1C24 +E3FE +4000 +ENDCHAR +STARTCHAR U+9CA4 +ENCODING 40100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2004 +3DFE +4924 +9524 +7FFC +5524 +5524 +7DFC +5420 +5428 +7DFC +0020 +1C24 +E3FE +4000 +ENDCHAR +STARTCHAR U+9CA5 +ENCODING 40101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +2044 +3DE4 +4944 +9144 +7D7E +5544 +55C4 +7D64 +5554 +5554 +7D44 +01C4 +1D44 +E014 +4008 +ENDCHAR +STARTCHAR U+9CA6 +ENCODING 40102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2040 +3C7C +4888 +9150 +7C20 +5450 +548E +7F24 +5420 +55FC +7C20 +00A8 +1D26 +E2A2 +4040 +ENDCHAR +STARTCHAR U+9CA7 +ENCODING 40103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +201C +21E0 +3C40 +4840 +9088 +7DF0 +5420 +5440 +7C88 +55FC +5420 +7CA8 +0126 +1E22 +E0A0 +4040 +ENDCHAR +STARTCHAR U+9CA8 +ENCODING 40104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +10A8 +40A6 +253A +0860 +7780 +2200 +27C0 +0890 +1FF8 +3110 +5FF0 +1110 +1FF0 +0004 +FFFE +ENDCHAR +STARTCHAR U+9CA9 +ENCODING 40105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2020 +3C20 +4BFE +9202 +7C14 +54F8 +5400 +7C04 +57FE +5490 +7C90 +0090 +1C92 +E112 +460E +ENDCHAR +STARTCHAR U+9CAB +ENCODING 40107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2004 +3DDE +4954 +9154 +7DD4 +5554 +5554 +7DD4 +5514 +5594 +7D54 +015C +1D90 +E010 +4010 +ENDCHAR +STARTCHAR U+9CAD +ENCODING 40109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2028 +3DFC +4820 +90F8 +7C20 +57FE +5400 +7DFC +5504 +55FC +7D04 +01FC +1D04 +E114 +4108 +ENDCHAR +STARTCHAR U+9CAE +ENCODING 40110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2028 +3DFC +4820 +9024 +7FFE +5488 +5546 +7E7A +5488 +5548 +7E50 +0020 +1C50 +E08E +4304 +ENDCHAR +STARTCHAR U+9CB0 +ENCODING 40112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23F0 +3D44 +497E +9144 +7DD4 +5554 +5554 +7D54 +55D4 +5554 +7D68 +01C8 +1F54 +E052 +4060 +ENDCHAR +STARTCHAR U+9CB1 +ENCODING 40113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2050 +2050 +3C54 +4BDE +9050 +7C50 +5450 +55DC +7C50 +5450 +5454 +7FDE +0050 +1C50 +E050 +4050 +ENDCHAR +STARTCHAR U+9CB2 +ENCODING 40114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +3D04 +4904 +91FC +7D04 +5504 +55FC +7C10 +5512 +55D6 +7D18 +0110 +1D52 +E192 +410E +ENDCHAR +STARTCHAR U+9CB3 +ENCODING 40115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +20FC +3C88 +48F8 +9088 +7C88 +54F8 +5404 +7DFE +5504 +5504 +7DFC +0104 +1D04 +E1FC +4104 +ENDCHAR +STARTCHAR U+9CB4 +ENCODING 40116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +3D04 +4924 +9124 +7DFC +5524 +5524 +7D74 +5554 +5554 +7D74 +0104 +1D04 +E1FC +4104 +ENDCHAR +STARTCHAR U+9CB5 +ENCODING 40117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2044 +3D8E +4904 +9104 +7DDC +5504 +5504 +7DFC +5554 +5450 +7C50 +0090 +1C92 +E112 +460E +ENDCHAR +STARTCHAR U+9CB6 +ENCODING 40118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2020 +3C50 +4888 +9146 +7E24 +5420 +55F8 +7C08 +5410 +5440 +7CA0 +01A4 +1E8A +E28A +4078 +ENDCHAR +STARTCHAR U+9CB7 +ENCODING 40119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +3D24 +4924 +9174 +7D24 +5524 +55FC +7D04 +5574 +5554 +7D54 +0174 +1D04 +E214 +4408 +ENDCHAR +STARTCHAR U+9CB8 +ENCODING 40120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +1020 +1E24 +25FE +4808 +BEFC +2A88 +2A88 +3E88 +2AF8 +2A20 +3E70 +00AC +0F24 +70A0 +2040 +ENDCHAR +STARTCHAR U+9CBA +ENCODING 40122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +3C04 +4874 +91C4 +7C44 +55F4 +5554 +7D54 +5554 +55F4 +7C44 +0054 +1C76 +E1CA +4000 +ENDCHAR +STARTCHAR U+9CBB +ENCODING 40123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +2092 +3C92 +4924 +9248 +7D24 +5492 +5404 +7DFE +5524 +5524 +7DFC +0124 +1D24 +E1FC +4104 +ENDCHAR +STARTCHAR U+9CBC +ENCODING 40124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +21FC +3C20 +4888 +93FE +7C88 +5404 +55FE +7D04 +5524 +5524 +7D24 +0124 +1C58 +E086 +4302 +ENDCHAR +STARTCHAR U+9CBD +ENCODING 40125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +2148 +3D48 +4BFE +9148 +7D48 +5578 +5500 +7DFC +5420 +57FE +7C70 +00A8 +1D26 +E224 +4020 +ENDCHAR +STARTCHAR U+9CC3 +ENCODING 40131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +7D24 +8924 +11FC +7D24 +5524 +55FC +7D04 +5400 +5440 +7EA4 +02A2 +1C8A +E088 +4078 +ENDCHAR +STARTCHAR U+9CC4 +ENCODING 40132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21DE +3D54 +4954 +9154 +7DDC +5400 +55FC +7C00 +57FE +5480 +7CFC +0004 +1C04 +E028 +4010 +ENDCHAR +STARTCHAR U+9CC5 +ENCODING 40133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +2068 +3B88 +4888 +908A +7FEA +549C +5588 +7DC8 +55A8 +5688 +7C88 +0094 +1C94 +E0A2 +40C0 +ENDCHAR +STARTCHAR U+9CC6 +ENCODING 40134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2080 +2084 +3CFE +4900 +93F8 +7D08 +55F8 +5508 +7DF8 +5480 +54F8 +7D88 +0250 +1C20 +E0D0 +430E +ENDCHAR +STARTCHAR U+9CC7 +ENCODING 40135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2044 +3DFE +4904 +91FC +7D04 +55FC +5400 +7DFC +5420 +5428 +7DFC +0020 +1C24 +E3FE +4000 +ENDCHAR +STARTCHAR U+9CCA +ENCODING 40138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2024 +3DFE +4904 +9104 +7DFC +5500 +5504 +7DFE +5554 +5754 +7DFC +0154 +1D54 +E154 +410C +ENDCHAR +STARTCHAR U+9CCB +ENCODING 40139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +21FC +3D24 +4888 +9070 +7C88 +5526 +5624 +7DFE +5524 +5524 +7DFC +0020 +1C24 +E3FC +4002 +ENDCHAR +STARTCHAR U+9CCC +ENCODING 40140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7F44 +087E +FEC8 +1148 +1E30 +2248 +4FC6 +8890 +1FF8 +3110 +5FF0 +1110 +1FF0 +0004 +FFFC +ENDCHAR +STARTCHAR U+9CCD +ENCODING 40141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +2048 +3DF8 +4850 +93FE +7C40 +54F0 +5584 +7EFC +5400 +55F8 +7D08 +01F8 +1D08 +E1F8 +4108 +ENDCHAR +STARTCHAR U+9CCE +ENCODING 40142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +3D04 +49FC +9104 +7DFC +5400 +57DE +7C42 +5652 +55CE +7D4A +0252 +1C42 +E14A +4084 +ENDCHAR +STARTCHAR U+9CCF +ENCODING 40143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +21FE +3D54 +4954 +9154 +7DFC +5420 +54A8 +7CA8 +5524 +5420 +7CA8 +00A4 +1D22 +E222 +4020 +ENDCHAR +STARTCHAR U+9CD0 +ENCODING 40144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +201C +3DE0 +4804 +9124 +7CA8 +5480 +54FC +7D20 +5424 +57FE +7C20 +0124 +1D24 +E1FC +4104 +ENDCHAR +STARTCHAR U+9CD3 +ENCODING 40147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2148 +2148 +7FF8 +9148 +21C8 +F89E +ABEA +AAAA +FAAA +AAAA +ABEA +F88A +07EA +188A +E092 +40A6 +ENDCHAR +STARTCHAR U+9CD4 +ENCODING 40148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +3C50 +4854 +91FE +7D54 +5554 +55FC +7C00 +55FC +5400 +7FFE +00A8 +1D26 +E222 +4060 +ENDCHAR +STARTCHAR U+9CD5 +ENCODING 40149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +21FC +3C20 +4BFE +9222 +7DAC +5420 +55AC +7C20 +5404 +55FE +7C04 +00FC +1C04 +E1FC +4004 +ENDCHAR +STARTCHAR U+9CD6 +ENCODING 40150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +2A24 +1C3E +7F44 +49A8 +5D10 +6B2E +47C4 +0890 +3FF8 +5110 +1FF0 +1110 +1FF0 +0004 +FFFE +ENDCHAR +STARTCHAR U+9CD7 +ENCODING 40151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FC +2084 +3CFC +4884 +90FC +7C00 +55FE +554A +7D4A +55FE +5400 +7CFC +0048 +1C30 +E0C8 +4306 +ENDCHAR +STARTCHAR U+9CD8 +ENCODING 40152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +3F44 +40FE +BF04 +2944 +FFA8 +2510 +3FE8 +0886 +1FF0 +3110 +5FF0 +1110 +1FF0 +0004 +FFFE +ENDCHAR +STARTCHAR U+9CD9 +ENCODING 40153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +23FE +7A20 +93FC +2224 +FBFE +AA24 +ABFC +FA20 +ABFC +AB24 +FBFC +0524 +1DFC +E524 +492C +ENDCHAR +STARTCHAR U+9CDC +ENCODING 40156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2004 +23FE +7A08 +92A8 +22AE +FA12 +ABF4 +AA44 +FB54 +AB54 +AB54 +FBF4 +0254 +1C4A +E48A +4910 +ENDCHAR +STARTCHAR U+9CDD +ENCODING 40157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +2088 +3FFE +4820 +91FC +7C20 +57FE +5524 +7CA8 +57FE +5404 +7DFE +0104 +1D04 +E1FC +4104 +ENDCHAR +STARTCHAR U+9CDE +ENCODING 40158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2124 +3CA8 +4BFE +9070 +7CA8 +5526 +56A4 +7C84 +55DE +5654 +7D54 +00BE +1D04 +E204 +4004 +ENDCHAR +STARTCHAR U+9CDF +ENCODING 40159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2104 +2088 +3FFE +4850 +91FC +7D54 +5554 +558C +7D74 +5504 +55FC +7C08 +03FE +1C88 +E048 +4018 +ENDCHAR +STARTCHAR U+9CE2 +ENCODING 40162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2050 +21FC +3D54 +49FC +9154 +7DFC +5400 +57FE +7C00 +55FC +5504 +7DFC +0088 +1C50 +E3FE +4000 +ENDCHAR +STARTCHAR U+9CE5 +ENCODING 40165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0200 +0FE0 +0820 +0FE0 +0820 +0FE0 +0FFC +0800 +0FFC +2924 +2494 +2404 +4018 +0000 +ENDCHAR +STARTCHAR U+9CE6 +ENCODING 40166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +3F80 +2080 +3FBF +2081 +3F81 +2002 +3F84 +2008 +3FD0 +0051 +5551 +2ADF +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+9CE7 +ENCODING 40167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0820 +0FE0 +0FE0 +0FFC +0FF8 +1548 +12A8 +2030 +07C0 +0440 +1844 +603C +0000 +ENDCHAR +STARTCHAR U+9CE9 +ENCODING 40169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1040 +1080 +11F0 +7D10 +15F0 +1510 +15F0 +17FC +1700 +13FC +2154 +22AC +4284 +0418 +0000 +ENDCHAR +STARTCHAR U+9CEA +ENCODING 40170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +20FC +2184 +20FC +3084 +28FC +2480 +20FE +2080 +20FF +22A9 +22A9 +2001 +200E +0000 +0000 +ENDCHAR +STARTCHAR U+9CEB +ENCODING 40171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1080 +13F0 +1210 +13F0 +13F0 +13FC +1200 +13FC +26A4 +2554 +4904 +1018 +0000 +ENDCHAR +STARTCHAR U+9CEC +ENCODING 40172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +1FE0 +1020 +1FE0 +1FE0 +1FFC +1000 +1FF8 +1008 +0788 +04F0 +0484 +1884 +607C +0000 +ENDCHAR +STARTCHAR U+9CED +ENCODING 40173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C7E +24C2 +247E +2442 +247E +2440 +247F +2440 +247F +2555 +4555 +1401 +0806 +0000 +0000 +ENDCHAR +STARTCHAR U+9CF0 +ENCODING 40176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +39F0 +0910 +09F0 +0910 +19F0 +15FC +1500 +23FC +20A4 +4354 +0284 +0418 +0000 +ENDCHAR +STARTCHAR U+9CF1 +ENCODING 40177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3E40 +08FE +0982 +08FE +0882 +08FE +7F80 +08FE +08FF +0801 +0955 +0955 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+9CF2 +ENCODING 40178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0020 +3F7E +21C2 +217E +2142 +3F7E +2040 +207E +207F +2001 +20AB +2155 +400E +0000 +0000 +ENDCHAR +STARTCHAR U+9CF3 +ENCODING 40179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1010 +1FF0 +1210 +17D0 +1450 +17D0 +17D0 +17F4 +140C +27FC +2D54 +52E4 +0000 +ENDCHAR +STARTCHAR U+9CF4 +ENCODING 40180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +7BF0 +4A10 +4BF0 +4A10 +4BF0 +4BFC +4A00 +7BFC +4AA4 +4554 +0504 +0818 +0000 +ENDCHAR +STARTCHAR U+9CF5 +ENCODING 40181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C40 +147E +14C2 +147E +1442 +147E +7C40 +147E +147F +1401 +1555 +2555 +460E +0000 +0000 +ENDCHAR +STARTCHAR U+9CF6 +ENCODING 40182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0110 +7FFC +0280 +0440 +1FE4 +1FDC +1044 +1FC0 +1FF0 +1000 +1FF8 +1548 +2528 +4030 +0000 +ENDCHAR +STARTCHAR U+9CF7 +ENCODING 40183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10FE +7D82 +10FE +1082 +7CFE +4480 +44FE +4480 +44FF +2801 +1155 +2955 +440E +0000 +0000 +ENDCHAR +STARTCHAR U+9CF9 +ENCODING 40185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +18FE +2582 +42FE +5D82 +00FE +0080 +7EFE +0280 +04FF +0401 +0955 +1155 +000E +0000 +0000 +ENDCHAR +STARTCHAR U+9CFA +ENCODING 40186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +087E +3EC2 +087E +0842 +087E +7F40 +087E +0840 +087F +0801 +0955 +1555 +220E +0000 +0000 +ENDCHAR +STARTCHAR U+9CFB +ENCODING 40187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0880 +15FE +2282 +41FE +0082 +3EFE +1280 +12FE +1280 +12FF +1201 +1355 +2355 +4C0E +0000 +0000 +ENDCHAR +STARTCHAR U+9CFC +ENCODING 40188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +087E +7EC2 +247E +2442 +247E +2440 +247E +2440 +247F +2401 +1955 +2555 +420E +0000 +0000 +ENDCHAR +STARTCHAR U+9CFD +ENCODING 40189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7E7E +24C2 +247E +2442 +247E +7E40 +247E +2440 +247F +2401 +2555 +2555 +440E +0000 +0000 +ENDCHAR +STARTCHAR U+9CFF +ENCODING 40191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7DFE +1082 +10FE +1082 +10FE +7C80 +10FE +1080 +10FF +1401 +1955 +6155 +000E +0000 +0000 +ENDCHAR +STARTCHAR U+9D00 +ENCODING 40192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7EFE +0982 +08FE +1082 +38FE +5480 +12FE +1080 +10FF +1001 +1155 +1155 +100E +0000 +0000 +ENDCHAR +STARTCHAR U+9D02 +ENCODING 40194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +08FC +08C4 +1EFC +0ACC +0AFC +0AC8 +3FFE +08C0 +08FE +1C1E +145E +16A6 +219C +000C +ENDCHAR +STARTCHAR U+9D03 +ENCODING 40195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +1020 +3E20 +22F8 +3E28 +2228 +3E28 +3FFC +2020 +3F20 +0D50 +3D50 +3288 +4D04 +0000 +ENDCHAR +STARTCHAR U+9D04 +ENCODING 40196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +01FE +7E82 +54FE +5482 +54FE +5480 +54FE +5480 +66FF +4001 +4155 +7F55 +000E +0000 +0000 +ENDCHAR +STARTCHAR U+9D05 +ENCODING 40197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E20 +227E +22C2 +2A7E +2A42 +2A7E +7F40 +227F +2240 +227F +2201 +2289 +2B55 +4402 +0000 +0000 +ENDCHAR +STARTCHAR U+9D06 +ENCODING 40198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +08F8 +0888 +3FF8 +2A88 +48F8 +0CFC +0C80 +15FC +1654 +25AC +4144 +0218 +0000 +ENDCHAR +STARTCHAR U+9D07 +ENCODING 40199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +2680 +39F0 +2110 +23F0 +1F10 +11F0 +11FC +7F00 +11FC +1154 +12AC +1284 +1418 +0000 +ENDCHAR +STARTCHAR U+9D08 +ENCODING 40200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1220 +12F8 +1288 +14F8 +14F8 +1CFC +1480 +14FC +2454 +25AC +4544 +0618 +0000 +ENDCHAR +STARTCHAR U+9D09 +ENCODING 40201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E40 +24F8 +2488 +24F8 +7E88 +0CF8 +0CFC +1480 +14FC +2454 +45AC +0544 +0E18 +0000 +ENDCHAR +STARTCHAR U+9D0B +ENCODING 40203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0830 +042C +047C +07FC +7EF8 +0CF8 +0FFC +0EDE +1AFE +122E +377C +3D54 +4C1C +0018 +0008 +ENDCHAR +STARTCHAR U+9D0E +ENCODING 40206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F40 +20F8 +2288 +22F8 +3288 +2CF8 +24FC +2680 +2AFC +3054 +21AC +3F44 +2218 +0000 +ENDCHAR +STARTCHAR U+9D10 +ENCODING 40208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +3FBE +08A2 +133E +0200 +07F0 +0410 +07F0 +0410 +07F0 +0400 +07F0 +07FE +4922 +0000 +0000 +ENDCHAR +STARTCHAR U+9D11 +ENCODING 40209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0438 +0FF8 +7E50 +0E60 +0F70 +198E +6FF6 +0FF0 +0FE0 +0FF8 +0FFC +1F08 +35A8 +2030 +0010 +ENDCHAR +STARTCHAR U+9D12 +ENCODING 40210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +14F8 +1288 +22F8 +7C88 +00F8 +7EFC +1280 +12FC +1254 +1DAC +1144 +1218 +0000 +ENDCHAR +STARTCHAR U+9D14 +ENCODING 40212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +087E +10C2 +297E +4442 +007E +7F40 +027E +0440 +087F +1001 +2155 +4155 +7F06 +0000 +0000 +ENDCHAR +STARTCHAR U+9D15 +ENCODING 40213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +1020 +3E20 +22FC +3E88 +2340 +3E40 +3F4C +2070 +3F40 +0D40 +3D44 +3144 +463C +0000 +ENDCHAR +STARTCHAR U+9D17 +ENCODING 40215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +10FE +1142 +7C7E +0042 +287E +2840 +287E +2840 +287F +2801 +7D55 +0155 +0006 +0000 +0000 +ENDCHAR +STARTCHAR U+9D18 +ENCODING 40216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +227E +42A2 +7E3E +0022 +243E +2420 +7E3E +2420 +243F +2401 +2555 +2555 +4406 +0000 +0000 +ENDCHAR +STARTCHAR U+9D19 +ENCODING 40217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +407E +40C2 +7E7E +4842 +487E +0840 +7E7E +0840 +087F +0801 +1555 +2355 +4106 +0000 +0000 +ENDCHAR +STARTCHAR U+9D1B +ENCODING 40219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +1FF8 +7288 +0CB0 +1A84 +6FFC +0BC0 +0FC0 +0FF8 +0800 +0FF8 +1548 +2528 +4030 +0000 +ENDCHAR +STARTCHAR U+9D1C +ENCODING 40220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +14C0 +17FC +14C4 +3EFE +717C +0B30 +0FF0 +0FF0 +0FF8 +1FFC +1FFC +17AC +32B8 +0010 +ENDCHAR +STARTCHAR U+9D1D +ENCODING 40221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +207E +3F22 +213E +4122 +013E +3D20 +253F +2520 +3D3F +2545 +01AB +0101 +0E0E +0000 +0000 +ENDCHAR +STARTCHAR U+9D1E +ENCODING 40222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C40 +44FC +4544 +7C7C +0044 +7E7C +2040 +207C +7C40 +047F +0401 +0555 +0555 +180E +0000 +0000 +ENDCHAR +STARTCHAR U+9D1F +ENCODING 40223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +0640 +38F8 +2888 +28F8 +3F88 +28F8 +2AFC +2680 +26FC +3A54 +63AC +3D44 +0218 +0000 +ENDCHAR +STARTCHAR U+9D20 +ENCODING 40224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3E7F +22C1 +227F +2241 +3E7F +2240 +227F +2240 +3E7F +0001 +0049 +7FB5 +0003 +0000 +0000 +ENDCHAR +STARTCHAR U+9D22 +ENCODING 40226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +227E +27A2 +22BE +2AA2 +4ABE +2AA0 +12BE +2AA0 +7ABF +0281 +04AB +08AB +1306 +0000 +0000 +ENDCHAR +STARTCHAR U+9D23 +ENCODING 40227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0880 +09F0 +0910 +7FF0 +0910 +09F0 +3DFC +2500 +25FC +2554 +3EAC +2284 +0418 +0000 +ENDCHAR +STARTCHAR U+9D25 +ENCODING 40229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +3F88 +60BF +3FA1 +20A1 +3F80 +2014 +3F94 +2014 +3FD4 +0054 +5554 +5562 +0181 +0000 +0000 +ENDCHAR +STARTCHAR U+9D26 +ENCODING 40230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0A20 +7FFC +0540 +1FF0 +644C +07C0 +07C0 +07FC +07F8 +1548 +12A8 +2030 +0000 +ENDCHAR +STARTCHAR U+9D28 +ENCODING 40232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7C40 +55F0 +5510 +7DF0 +5510 +55F0 +7DFC +5500 +11FC +1154 +12AC +1284 +1418 +0000 +ENDCHAR +STARTCHAR U+9D29 +ENCODING 40233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +287E +28C2 +3E7E +2842 +487E +0840 +7F7F +0840 +087F +0849 +1449 +22B5 +4102 +0000 +0000 +ENDCHAR +STARTCHAR U+9D2A +ENCODING 40234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +3FF8 +2288 +40F8 +1C88 +04F8 +14FC +1480 +14FC +2254 +23AC +4144 +0218 +0000 +ENDCHAR +STARTCHAR U+9D2B +ENCODING 40235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +0080 +7DF0 +5510 +55F0 +5510 +7DF0 +55FC +5500 +55FC +7D54 +42AC +0284 +0418 +0000 +ENDCHAR +STARTCHAR U+9D2C +ENCODING 40236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1210 +0920 +3FFC +2208 +4FE0 +0820 +0FE0 +0FE0 +0FFC +0800 +0FF8 +2948 +24A8 +4030 +0000 +ENDCHAR +STARTCHAR U+9D2D +ENCODING 40237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +103E +3E62 +623E +2222 +223E +3E20 +203E +2020 +3E3F +2201 +22AB +22AB +3E06 +0000 +0000 +ENDCHAR +STARTCHAR U+9D2E +ENCODING 40238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3F3E +1262 +213E +40A2 +3F3E +0020 +7FBF +1020 +1E3F +0255 +02AB +0201 +0C0E +0000 +0000 +ENDCHAR +STARTCHAR U+9D2F +ENCODING 40239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7F3E +0862 +103E +2022 +7F3E +5520 +553F +5520 +553F +5555 +55AB +4101 +430E +0000 +0000 +ENDCHAR +STARTCHAR U+9D30 +ENCODING 40240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +3E3E +0862 +083E +0822 +7F3E +0820 +083E +0820 +3E3F +2201 +22AB +22AB +3E06 +0000 +0000 +ENDCHAR +STARTCHAR U+9D31 +ENCODING 40241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +123E +7FA2 +123E +1222 +003E +0220 +223E +2220 +143F +0801 +14AB +22AB +4106 +0000 +0000 +ENDCHAR +STARTCHAR U+9D32 +ENCODING 40242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +2074 +207E +3F44 +2064 +3044 +3F7C +0042 +3F70 +237E +334A +333E +23B2 +3FB6 +210C +ENDCHAR +STARTCHAR U+9D33 +ENCODING 40243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FBE +40E2 +50BE +1222 +7FBE +1220 +123F +1220 +123F +1455 +08AB +1401 +638E +0000 +0000 +ENDCHAR +STARTCHAR U+9D34 +ENCODING 40244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1830 +17FE +2044 +007C +1844 +1FFC +3240 +327E +1263 +126F +123F +13FA +12F6 +100E +0000 +ENDCHAR +STARTCHAR U+9D36 +ENCODING 40246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +087E +7F22 +083E +0822 +3E3E +0020 +3E3F +2220 +223F +2255 +22AB +3E01 +220E +0000 +0000 +ENDCHAR +STARTCHAR U+9D37 +ENCODING 40247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F81 +1009 +3E09 +6509 +1A03 +77F8 +07C8 +07F8 +0400 +07FE +0400 +07FF +14A1 +2256 +0000 +0000 +ENDCHAR +STARTCHAR U+9D38 +ENCODING 40248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +243E +3F62 +243E +4422 +043E +7FA0 +043F +0C20 +163F +2555 +44AB +0401 +040E +0000 +0000 +ENDCHAR +STARTCHAR U+9D3A +ENCODING 40250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0410 +3FFE +0466 +3FFE +05E6 +3F7E +3D62 +3FFF +29E3 +0F6F +173F +127B +03D6 +0106 +0000 +ENDCHAR +STARTCHAR U+9D3B +ENCODING 40251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2040 +1080 +11F0 +0F10 +45F0 +2510 +25F0 +05FC +1500 +17FC +3954 +22AC +4284 +4418 +0000 +ENDCHAR +STARTCHAR U+9D3C +ENCODING 40252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +1260 +3E7C +3A78 +3EF8 +3F30 +3E30 +374C +3F9E +17F8 +7EC8 +7AC8 +4AF8 +0EC0 +0400 +ENDCHAR +STARTCHAR U+9D3D +ENCODING 40253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1100 +3FBC +0A24 +043C +1B00 +07F0 +0410 +07F0 +0410 +07F0 +07F8 +0400 +07FC +0AA4 +0000 +0000 +ENDCHAR +STARTCHAR U+9D3E +ENCODING 40254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0C40 +12F8 +7D88 +08F8 +2888 +3EF8 +28FC +4880 +7FFC +0854 +09AC +0944 +0A18 +0000 +ENDCHAR +STARTCHAR U+9D3F +ENCODING 40255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +14F8 +1288 +22F8 +7E88 +00F8 +3EFC +2280 +22FC +3E54 +23AC +2144 +0218 +0000 +ENDCHAR +STARTCHAR U+9D40 +ENCODING 40256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08F8 +1820 +2BFE +0820 +09FC +07F0 +0C10 +07F0 +0410 +07F0 +07F8 +0400 +07FC +0AA4 +0000 +0000 +ENDCHAR +STARTCHAR U+9D41 +ENCODING 40257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +08F0 +7F90 +14F0 +1290 +22F0 +54FC +0C80 +08FC +0C54 +15BC +2144 +4218 +0000 +ENDCHAR +STARTCHAR U+9D42 +ENCODING 40258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A10 +0A3E +1222 +323E +5FA2 +123E +1720 +1ABE +1260 +123F +1201 +12AB +12AB +1206 +0000 +0000 +ENDCHAR +STARTCHAR U+9D43 +ENCODING 40259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1F3E +3162 +593E +1522 +113E +7FE0 +113F +1120 +193F +1555 +11AB +1101 +230E +0000 +0000 +ENDCHAR +STARTCHAR U+9D44 +ENCODING 40260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +7E80 +11F0 +1910 +25F0 +7B10 +09F0 +09FC +3F00 +09FC +0954 +0EAC +7284 +0418 +0000 +ENDCHAR +STARTCHAR U+9D45 +ENCODING 40261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +203E +3E62 +223E +6222 +143E +0820 +143E +2220 +7F3F +2201 +22AB +22AB +3E06 +0000 +0000 +ENDCHAR +STARTCHAR U+9D46 +ENCODING 40262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1100 +123C +2780 +4C80 +0F80 +14BC +1788 +37E8 +5408 +17C8 +1348 +1F48 +1C48 +1198 +0000 +ENDCHAR +STARTCHAR U+9D47 +ENCODING 40263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1010 +107E +3F42 +247E +4442 +047E +3F40 +247F +2440 +247F +7F91 +044B +04A9 +04A1 +0506 +ENDCHAR +STARTCHAR U+9D48 +ENCODING 40264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E40 +24F8 +2488 +3CF8 +2488 +24F8 +3CFC +2480 +24FC +3C54 +65AC +0544 +0618 +0000 +ENDCHAR +STARTCHAR U+9D4A +ENCODING 40266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +047E +3FA2 +043E +24A2 +24BE +24A0 +557F +0420 +043F +0425 +0A5B +1101 +60CE +0000 +0000 +ENDCHAR +STARTCHAR U+9D4B +ENCODING 40267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3F7E +0122 +213E +3E22 +203E +20A0 +1FBF +0020 +003F +5525 +505B +1101 +1F07 +0000 +0000 +ENDCHAR +STARTCHAR U+9D4C +ENCODING 40268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +3E14 +6222 +3E41 +223E +3E08 +2008 +3F7F +2008 +3F1C +252A +5B49 +0108 +0E18 +0000 +0000 +ENDCHAR +STARTCHAR U+9D4F +ENCODING 40271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0A20 +093E +7F62 +083E +7F22 +493E +4920 +7F3F +4920 +493F +7F25 +495B +4901 +490E +0000 +0000 +ENDCHAR +STARTCHAR U+9D50 +ENCODING 40272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7F40 +08F8 +2A88 +2AF8 +2A88 +2AF8 +3DFC +4D80 +48FC +0854 +0FAC +7144 +0218 +0000 +ENDCHAR +STARTCHAR U+9D51 +ENCODING 40273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E40 +22F8 +3E88 +00F8 +3E88 +22F8 +3EFC +2280 +3EFC +2254 +23AC +2344 +2618 +0000 +ENDCHAR +STARTCHAR U+9D52 +ENCODING 40274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1220 +123E +2162 +4CBE +1222 +213E +40A0 +003F +3F20 +213F +2125 +215B +3F01 +210E +0000 +0000 +ENDCHAR +STARTCHAR U+9D53 +ENCODING 40275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +3F3E +0462 +7FBE +40A2 +5FBE +0220 +043F +3FA0 +043F +0425 +045B +1401 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+9D54 +ENCODING 40276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +3E24 +6242 +3EFF +2224 +3E42 +20A1 +3F3E +2040 +3F44 +2524 +5B18 +0118 +0E67 +0000 +0000 +ENDCHAR +STARTCHAR U+9D56 +ENCODING 40278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +207E +7E42 +427E +7E42 +427E +7E40 +207F +2240 +2C7F +7049 +21B7 +2101 +1F0E +0000 +0000 +ENDCHAR +STARTCHAR U+9D57 +ENCODING 40279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +143E +0862 +143E +2222 +083E +7F20 +283F +7F20 +293F +2925 +2A5B +0801 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+9D58 +ENCODING 40280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F20 +093E +0962 +7FBE +0922 +3F3E +1020 +203F +5F20 +113F +1125 +115B +1F01 +110E +0000 +0000 +ENDCHAR +STARTCHAR U+9D59 +ENCODING 40281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E40 +22F8 +2288 +3EF8 +2288 +3EF8 +22FC +2280 +3EFC +1854 +15AC +2544 +4218 +0000 +ENDCHAR +STARTCHAR U+9D5A +ENCODING 40282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +3E3E +0462 +043E +7FA2 +163E +2520 +44BF +0020 +1E3F +1215 +122B +2241 +43CE +0000 +0000 +ENDCHAR +STARTCHAR U+9D5B +ENCODING 40283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FA0 +007E +14A2 +293E +5222 +293E +14A0 +003F +0020 +3FBF +0425 +045B +0401 +7FCE +0000 +0000 +ENDCHAR +STARTCHAR U+9D5C +ENCODING 40284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2420 +1440 +18F8 +7E88 +0AF8 +3E88 +28F8 +3EFC +3A80 +1AFC +2E54 +49AC +0944 +0A18 +0000 +ENDCHAR +STARTCHAR U+9D5D +ENCODING 40285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C10 +1620 +7578 +1548 +1478 +7F48 +1578 +157C +1E40 +727C +1734 +1BF4 +11C4 +3118 +0000 +ENDCHAR +STARTCHAR U+9D5E +ENCODING 40286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0650 +3848 +7FFC +0C70 +79B4 +1FEC +0420 +07E0 +07E0 +07FC +07F8 +1548 +12A8 +2030 +0000 +ENDCHAR +STARTCHAR U+9D5F +ENCODING 40287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2800 +10FE +6810 +14FE +2410 +0AFE +37F0 +0F90 +07F0 +07F8 +07FF +1491 +224A +0004 +0000 +0000 +ENDCHAR +STARTCHAR U+9D60 +ENCODING 40288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +2840 +28F8 +3E88 +28F8 +4888 +7FF8 +00FC +3E80 +22FC +2254 +3FAC +2144 +0218 +0000 +ENDCHAR +STARTCHAR U+9D61 +ENCODING 40289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +3E40 +05F8 +0488 +7FF8 +1488 +14F8 +3CFC +3480 +34FC +3654 +3FAC +6344 +0218 +0000 +ENDCHAR +STARTCHAR U+9D62 +ENCODING 40290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C20 +0820 +3EF8 +12E8 +1BF8 +13F0 +1EF8 +36E4 +7EFE +0A94 +12FC +23EC +429C +0618 +0008 +ENDCHAR +STARTCHAR U+9D63 +ENCODING 40291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +0FF8 +7CE8 +2FF8 +3EF8 +2E88 +3CF0 +3EFE +1B84 +38FC +69FC +090C +0818 +0008 +ENDCHAR +STARTCHAR U+9D64 +ENCODING 40292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +1EF8 +2488 +7EF8 +2A88 +2AF8 +3EFC +2A80 +3EFC +2254 +23AC +2344 +4618 +0000 +ENDCHAR +STARTCHAR U+9D65 +ENCODING 40293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1502 +3F92 +0412 +7FD2 +0492 +0506 +0FF8 +0808 +0FF8 +0808 +0FF8 +0800 +0FFE +0242 +2922 +490C +ENDCHAR +STARTCHAR U+9D67 +ENCODING 40295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +227E +1422 +3F3E +1222 +123E +1220 +7FBF +1220 +123F +1255 +12AB +2201 +420E +0000 +0000 +ENDCHAR +STARTCHAR U+9D68 +ENCODING 40296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C10 +123E +2162 +40BE +3F22 +083E +0820 +7FBF +0820 +083F +3E25 +225B +2201 +3E0E +0000 +0000 +ENDCHAR +STARTCHAR U+9D69 +ENCODING 40297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7790 +54BE +54E2 +54BE +76A2 +553E +5420 +57BF +74A0 +54BF +56A5 +56DB +5501 +568E +0000 +0000 +ENDCHAR +STARTCHAR U+9D6A +ENCODING 40298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0820 +7F7E +1442 +227E +497E +3E40 +2A7E +3E7F +2A01 +3E55 +08AB +0901 +0706 +0000 +0000 +ENDCHAR +STARTCHAR U+9D6B +ENCODING 40299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0E3E +0862 +3E3E +2222 +3E3E +2220 +3E3F +0820 +083F +7F25 +085B +0801 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+9D6C +ENCODING 40300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F20 +2D78 +2D48 +2D78 +3F48 +2D78 +2D7C +2D40 +3F7C +2D34 +2DF4 +2DC4 +5B18 +0000 +ENDCHAR +STARTCHAR U+9D6F +ENCODING 40303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +1040 +3EF8 +2A88 +2AF8 +3E88 +2AF8 +3EFC +1480 +24FC +7E54 +05AC +0544 +0618 +0000 +ENDCHAR +STARTCHAR U+9D70 +ENCODING 40304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F90 +20BE +24E2 +24BE +2EA2 +24BE +2EA0 +20BF +2EA0 +2ABF +2AA5 +2EDB +2081 +418E +0000 +0000 +ENDCHAR +STARTCHAR U+9D71 +ENCODING 40305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +047E +3F22 +043E +0422 +7FBE +1220 +113F +64A0 +043F +3F25 +045B +0401 +7F8E +0000 +0000 +ENDCHAR +STARTCHAR U+9D72 +ENCODING 40306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1420 +1440 +14F8 +7F88 +14F8 +1488 +7FF8 +00FC +3E80 +22FC +3E54 +23AC +3F44 +2218 +0000 +ENDCHAR +STARTCHAR U+9D73 +ENCODING 40307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +3E3E +3F62 +213E +3F22 +203E +3F20 +313F +3F20 +313F +3F25 +315B +5101 +230E +0000 +0000 +ENDCHAR +STARTCHAR U+9D74 +ENCODING 40308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +107E +1FA2 +60BE +08A2 +2ABE +1CA0 +3EBF +08A0 +1CBF +2AA5 +08DB +0081 +031E +0000 +0000 +ENDCHAR +STARTCHAR U+9D75 +ENCODING 40309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3E +4262 +043E +7F22 +493E +4920 +7F3F +2420 +243F +2525 +245B +2481 +438E +0000 +0000 +ENDCHAR +STARTCHAR U+9D76 +ENCODING 40310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3FFE +1644 +167C +3744 +73FC +2140 +217E +7F42 +167F +161E +167A +3FE6 +000C +0000 +ENDCHAR +STARTCHAR U+9D77 +ENCODING 40311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +087E +7FA2 +40BE +40A2 +103E +13A0 +3ABF +2AA0 +2ABF +6B95 +1A2B +1241 +61C6 +0000 +0000 +ENDCHAR +STARTCHAR U+9D78 +ENCODING 40312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +3F3E +0862 +143E +6322 +003E +7FA0 +013F +3D20 +253F +2525 +3D5B +0101 +030E +0000 +0000 +ENDCHAR +STARTCHAR U+9D79 +ENCODING 40313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +1E3C +0454 +1F14 +0E24 +1558 +07F0 +07D0 +0410 +07F0 +07F8 +07FC +0AA4 +0AA8 +0000 +0000 +ENDCHAR +STARTCHAR U+9D7A +ENCODING 40314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +08F8 +7F88 +14F8 +1788 +29F8 +2EFC +7280 +2CFC +2654 +2BAC +3144 +2218 +0000 +ENDCHAR +STARTCHAR U+9D7B +ENCODING 40315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3E24 +6264 +3EBF +2224 +3E24 +203F +3F24 +2024 +3F3F +2524 +5B24 +013F +0E20 +0000 +0000 +ENDCHAR +STARTCHAR U+9D7C +ENCODING 40316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +FEFE +AA82 +AAFE +6882 +CEFE +0080 +00FF +7C80 +10FF +1001 +1D55 +7155 +C203 +0006 +ENDCHAR +STARTCHAR U+9D7D +ENCODING 40317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7710 +113E +5562 +553E +2222 +55BE +0020 +773F +1120 +553F +5525 +555B +2201 +558E +0000 +0000 +ENDCHAR +STARTCHAR U+9D7E +ENCODING 40318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7E10 +427E +4242 +7E7E +4242 +427E +7E40 +007F +8840 +8B7F +EE01 +8855 +8855 +E903 +8706 +ENDCHAR +STARTCHAR U+9D7F +ENCODING 40319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107E +3E42 +627E +3E42 +227E +3E14 +2064 +3F24 +2024 +3FFF +2524 +5B24 +0124 +0244 +0000 +0000 +ENDCHAR +STARTCHAR U+9D80 +ENCODING 40320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2024 +3E24 +627E +3E24 +2224 +3E3C +2024 +3F24 +203C +3F24 +2524 +5BFF +0124 +0E42 +0000 +0000 +ENDCHAR +STARTCHAR U+9D81 +ENCODING 40321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7FBE +0062 +3F3E +2122 +213E +3F20 +253F +0420 +043F +1625 +255B +4481 +0C0E +0000 +0000 +ENDCHAR +STARTCHAR U+9D82 +ENCODING 40322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +133E +2162 +613E +3B22 +213E +2120 +3F3F +0A20 +0A3F +0A25 +0A5B +1281 +618E +0000 +0000 +ENDCHAR +STARTCHAR U+9D83 +ENCODING 40323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0830 +1063 +7F41 +4141 +7F77 +4141 +7F41 +4041 +7F7F +4014 +7F94 +0094 +AAB4 +AAA4 +81A5 +0363 +ENDCHAR +STARTCHAR U+9D84 +ENCODING 40324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +7C20 +10FE +7C82 +10FE +FE82 +00FE +7C80 +54FF +5480 +54FF +7C01 +4555 +4555 +4403 +4C06 +ENDCHAR +STARTCHAR U+9D85 +ENCODING 40325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1250 +24BE +4962 +24BE +1262 +003E +7F20 +493F +4920 +7F3F +4925 +495B +7F01 +411E +0000 +0000 +ENDCHAR +STARTCHAR U+9D86 +ENCODING 40326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +FEFE +1082 +54FE +5482 +54FE +BA80 +92FF +3880 +38FF +5401 +D555 +9155 +9003 +1006 +ENDCHAR +STARTCHAR U+9D87 +ENCODING 40327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +7FF8 +0888 +3EF8 +2A88 +3EF8 +2AFC +3E80 +1CFC +1A54 +29AC +4944 +0A18 +0000 +ENDCHAR +STARTCHAR U+9D88 +ENCODING 40328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7FBE +0462 +3FBE +04A2 +7FFE +04A0 +3FBF +1220 +7FBF +1225 +125B +0C01 +3386 +0000 +0000 +ENDCHAR +STARTCHAR U+9D89 +ENCODING 40329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +7F40 +00F8 +3C88 +24F8 +3C88 +00F8 +3EFC +0480 +0EFC +7854 +09AC +0944 +1A18 +0000 +ENDCHAR +STARTCHAR U+9D8A +ENCODING 40330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +FEFE +9082 +FEFE +9282 +92FE +FF80 +92FF +9280 +FEFF +9001 +B955 +AD55 +6403 +4006 +ENDCHAR +STARTCHAR U+9D8B +ENCODING 40331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3F3E +2162 +3F3E +2022 +243E +3F20 +243F +2420 +3F3F +3125 +315B +5101 +1F0E +0000 +0000 +ENDCHAR +STARTCHAR U+9D8C +ENCODING 40332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F10 +213E +2162 +3F3E +2022 +243E +3520 +353F +3F20 +243F +3525 +355B +5501 +1F1E +0000 +0000 +ENDCHAR +STARTCHAR U+9D8D +ENCODING 40333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C20 +44FE +4482 +7CFE +4482 +44FE +7C80 +20FF +7E80 +AAFF +2A01 +4AA9 +12A9 +2683 +0C06 +ENDCHAR +STARTCHAR U+9D8E +ENCODING 40334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +FEFE +8282 +82FE +BA82 +00FE +0080 +FEFF +1080 +54FF +5401 +D555 +9355 +9203 +3006 +ENDCHAR +STARTCHAR U+9D8F +ENCODING 40335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0220 +0C40 +72F8 +4A88 +2CF8 +0888 +3EF8 +08FC +7E80 +08FC +1454 +13AC +2144 +4238 +0000 +ENDCHAR +STARTCHAR U+9D90 +ENCODING 40336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4220 +42BE +1FE2 +023E +6AA2 +2ABE +2AA0 +4ABF +2AA0 +2ABF +32D5 +222B +3001 +4FCE +0000 +0000 +ENDCHAR +STARTCHAR U+9D92 +ENCODING 40338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +2210 +FA3E +27A2 +FABE +AAA2 +AABE +FAA0 +22BF +72A0 +72BF +6A81 +AAD5 +A4D5 +A483 +2586 +ENDCHAR +STARTCHAR U+9D93 +ENCODING 40339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +4420 +FEFE +4482 +44FE +0082 +00FE +FE80 +92FF +9280 +92FF +FE01 +92A9 +92A9 +9283 +FE06 +ENDCHAR +STARTCHAR U+9D94 +ENCODING 40340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F20 +027E +1422 +7FBE +0AA2 +32BE +0E20 +043F +0420 +7FBF +0E15 +152B +2481 +040E +0000 +0000 +ENDCHAR +STARTCHAR U+9D95 +ENCODING 40341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +FEFE +4482 +6CFE +2882 +FEFE +0080 +7CFF +4480 +44FF +7C01 +4555 +4555 +7D03 +0006 +ENDCHAR +STARTCHAR U+9D96 +ENCODING 40342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FC10 +1093 +FD92 +1138 +386C +54C7 +9100 +0FF0 +0810 +0FF0 +0810 +0FFF +0800 +2FFE +6922 +4496 +ENDCHAR +STARTCHAR U+9D97 +ENCODING 40343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7E10 +427E +7E42 +427E +4242 +7E7E +0040 +FF7F +0840 +487F +4F01 +4855 +6855 +D802 +8FFF +ENDCHAR +STARTCHAR U+9D98 +ENCODING 40344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2788 +2490 +24BE +24A2 +FCBE +27A2 +24BE +24A0 +24BF +F7A0 +94BF +9481 +94D5 +94D5 +F483 +0986 +ENDCHAR +STARTCHAR U+9D99 +ENCODING 40345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +3FBE +1162 +0A3E +7FA2 +44BE +44A0 +3F3F +2520 +253F +2549 +25B5 +0401 +040E +0000 +0000 +ENDCHAR +STARTCHAR U+9D9A +ENCODING 40346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7740 +55F8 +7788 +00F8 +3C88 +00F8 +7EFC +1080 +1CFC +2454 +05AC +0544 +1A18 +0000 +ENDCHAR +STARTCHAR U+9D9B +ENCODING 40347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4420 +443E +7762 +443E +44A2 +77BE +0020 +103F +2020 +7F3F +2145 +3FAB +2101 +3F0E +0000 +0000 +ENDCHAR +STARTCHAR U+9D9C +ENCODING 40348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1220 +7FBE +1262 +003E +3F22 +023E +1420 +7FBF +0520 +0C3F +1455 +64AB +0401 +180E +0000 +0000 +ENDCHAR +STARTCHAR U+9D9D +ENCODING 40349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7F7E +0022 +3E3E +2222 +3E3E +0020 +7F3F +4920 +493F +7F55 +49AB +4901 +7F0E +0000 +0000 +ENDCHAR +STARTCHAR U+9D9E +ENCODING 40350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +7F7E +2222 +223E +3FA2 +223E +2FA0 +28BF +2FA0 +28BF +2FD5 +28AB +4F81 +088E +0000 +0000 +ENDCHAR +STARTCHAR U+9D9F +ENCODING 40351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +083E +7FA2 +40BE +52A2 +213E +48A0 +0A3F +0820 +7F3F +0849 +14B5 +2201 +410E +0000 +0000 +ENDCHAR +STARTCHAR U+9DA0 +ENCODING 40352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FA0 +407E +5F22 +513E +5F22 +513E +5F20 +4A3F +7FA0 +4A3F +4A15 +442B +5B01 +7F8E +0000 +0000 +ENDCHAR +STARTCHAR U+9DA1 +ENCODING 40353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7F10 +417E +7F42 +417E +7F42 +207E +3F40 +617F +CD40 +797F +4101 +4555 +3D55 +0103 +0306 +ENDCHAR +STARTCHAR U+9DA2 +ENCODING 40354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0120 +3E7E +1522 +24BE +7FA2 +083E +0820 +7FBE +1020 +3E3F +5255 +12AB +0C01 +338F +0000 +0000 +ENDCHAR +STARTCHAR U+9DA3 +ENCODING 40355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00A0 +3F3E +2062 +3F3E +2122 +3F3E +2020 +3FBF +2AA0 +2ABF +3F95 +2AAB +4A81 +0186 +0000 +0000 +ENDCHAR +STARTCHAR U+9DA4 +ENCODING 40356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F40 +2AF8 +7F88 +08F8 +3E88 +2AF8 +3EFC +2A80 +3EFC +0854 +7FAC +0944 +0A18 +0000 +ENDCHAR +STARTCHAR U+9DA6 +ENCODING 40358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083E +7F22 +083E +3E22 +223E +3EA2 +07F6 +07D0 +07F0 +07F8 +0400 +07FE +2542 +254C +0000 +0000 +ENDCHAR +STARTCHAR U+9DA7 +ENCODING 40359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1120 +7FFE +1122 +043E +0422 +3FBE +24A0 +24BF +24A0 +7FFF +0425 +0A5B +1101 +60CE +0000 +0000 +ENDCHAR +STARTCHAR U+9DA8 +ENCODING 40360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1FBE +6162 +1A3E +0422 +7FBE +0420 +383F +04A0 +3B3F +06A5 +3A5B +0201 +0C0E +0000 +0000 +ENDCHAR +STARTCHAR U+9DA9 +ENCODING 40361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E40 +14FC +7F90 +1A60 +299C +5FE0 +0420 +07E0 +07E0 +07FC +07F8 +1548 +22B0 +0000 +ENDCHAR +STARTCHAR U+9DAA +ENCODING 40362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C20 +44FE +7C82 +44FE +7C82 +44FE +7C80 +14FF +1280 +FFFF +1001 +3955 +6D55 +C603 +8006 +ENDCHAR +STARTCHAR U+9DAB +ENCODING 40363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +7FF8 +0888 +7FF8 +6B88 +5DF8 +7FFC +1880 +1CFC +2A54 +49AC +0944 +0A18 +0000 +ENDCHAR +STARTCHAR U+9DAC +ENCODING 40364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1C10 +367E +6342 +DDFE +0042 +7F7E +4140 +7F7F +4140 +7F7F +4001 +FF55 +A155 +A103 +3F06 +ENDCHAR +STARTCHAR U+9DAD +ENCODING 40365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +3C7F +0910 +3F1E +2A22 +4946 +1FF8 +2888 +0FF8 +0800 +0FFC +0FFE +2492 +2496 +0000 +0000 +ENDCHAR +STARTCHAR U+9DAE +ENCODING 40366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1020 +FEFE +0082 +7CFE +4482 +7CFE +0080 +FEFF +8280 +BAFF +AA01 +AB55 +BB55 +8303 +8606 +ENDCHAR +STARTCHAR U+9DAF +ENCODING 40367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +15A8 +0E70 +19C8 +3FFC +2108 +4FE0 +0820 +0FE0 +0FE0 +0FFC +0FF8 +2A48 +2528 +4030 +0000 +ENDCHAR +STARTCHAR U+9DB1 +ENCODING 40369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +7FFE +4422 +1FF8 +0420 +1FF8 +0420 +FFFF +0910 +3FEC +C823 +0FFC +0800 +0FFE +6922 +C496 +ENDCHAR +STARTCHAR U+9DB2 +ENCODING 40370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C20 +2440 +2AF8 +4988 +14F8 +3E88 +00F8 +7EFC +3680 +5AFC +3654 +5BAC +1344 +3618 +0000 +ENDCHAR +STARTCHAR U+9DB3 +ENCODING 40371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +3C9F +6504 +3DC4 +255F +3D55 +21D5 +3D15 +21D5 +3F55 +2B55 +57D7 +0304 +1D04 +0000 +0000 +ENDCHAR +STARTCHAR U+9DB4 +ENCODING 40372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1040 +7FF8 +5288 +14F8 +2888 +3EF8 +68FC +3E80 +28FC +3E54 +29AC +3F44 +2218 +0000 +ENDCHAR +STARTCHAR U+9DB5 +ENCODING 40373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2008 +7F10 +917E +5542 +557E +7D42 +237E +4640 +207F +7F40 +917F +5501 +5555 +7D55 +2303 +4606 +ENDCHAR +STARTCHAR U+9DB6 +ENCODING 40374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +3FFE +2222 +2FBE +22A2 +3FFE +22A0 +2FBF +2220 +223F +2FA5 +28DB +4881 +0F8E +0000 +0000 +ENDCHAR +STARTCHAR U+9DB7 +ENCODING 40375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3E +4162 +493E +3E22 +083E +3E20 +083F +7F20 +083F +3E55 +22AB +2201 +3E0E +0000 +0000 +ENDCHAR +STARTCHAR U+9DB8 +ENCODING 40376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +7E40 +12F8 +1288 +7EF8 +4888 +7EF8 +5AFC +3680 +5AFC +3654 +5BAC +1344 +6E18 +0000 +ENDCHAR +STARTCHAR U+9DB9 +ENCODING 40377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +4E20 +AAFE +AA82 +AAFE +AA82 +EEFE +2880 +48FF +FE80 +92FF +9201 +FEA9 +92A9 +9203 +FE06 +ENDCHAR +STARTCHAR U+9DBA +ENCODING 40378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +6B40 +08F8 +6F88 +14F8 +1288 +3FF8 +52FC +1E80 +12FC +1E54 +13AC +1344 +1618 +0000 +ENDCHAR +STARTCHAR U+9DBB +ENCODING 40379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3E40 +22F8 +2E88 +2AF8 +7F88 +41F8 +3EFC +2280 +3EFC +2254 +3FAC +2344 +2618 +0000 +ENDCHAR +STARTCHAR U+9DBC +ENCODING 40380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +2410 +FFBE +1422 +7FBE +14A2 +14BE +FFE0 +14BF +14A0 +7FBF +1401 +3655 +5555 +9483 +1406 +ENDCHAR +STARTCHAR U+9DBE +ENCODING 40382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0818 +7F24 +0852 +08BD +3E64 +223C +3E3C +2220 +3E3E +0820 +083F +7F29 +0855 +0802 +0000 +0000 +ENDCHAR +STARTCHAR U+9DBF +ENCODING 40383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +1010 +2424 +6868 +1212 +7D7D +0100 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9DC1 +ENCODING 40385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1C20 +1440 +22F8 +3D88 +40F8 +1C88 +14F8 +22FC +7F80 +2EFC +2E54 +2FAC +7144 +0218 +0000 +ENDCHAR +STARTCHAR U+9DC2 +ENCODING 40386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1E40 +1AF8 +2488 +54F8 +1888 +7EF8 +28FC +7F80 +2AFC +2A54 +3FAC +2144 +2218 +0000 +ENDCHAR +STARTCHAR U+9DC3 +ENCODING 40387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7F10 +413E +7F22 +413E +7F22 +083E +FFA0 +80BF +1020 +FFBF +1401 +2455 +6855 +1C03 +E306 +ENDCHAR +STARTCHAR U+9DC4 +ENCODING 40388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0620 +3C40 +2AF8 +4988 +14F8 +3C88 +08F8 +14FC +3E80 +08FC +7E54 +0DAC +1344 +6218 +0000 +ENDCHAR +STARTCHAR U+9DC5 +ENCODING 40389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FA0 +0A7E +0A22 +3FBE +2AA2 +2ABE +3FA0 +043F +3FA0 +043F +0E25 +155B +2481 +444E +0000 +0000 +ENDCHAR +STARTCHAR U+9DC6 +ENCODING 40390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1320 +1C40 +11F8 +0F88 +2EF8 +2A88 +2EF8 +2EFC +2A80 +2EFC +3F54 +2DAC +1344 +6218 +0000 +ENDCHAR +STARTCHAR U+9DC7 +ENCODING 40391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +FF3C +1024 +7E24 +0024 +FF47 +8100 +7E7E +1022 +7E26 +4224 +7F2C +4018 +7F3C +A966 +9543 +ENDCHAR +STARTCHAR U+9DC8 +ENCODING 40392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1001 +3E7E +624E +3E48 +227F +3E69 +207F +3F68 +206E +3F60 +257C +5BB4 +0155 +0E27 +0000 +0000 +ENDCHAR +STARTCHAR U+9DC9 +ENCODING 40393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0188 +1F10 +F43E +87A2 +843E +BFA2 +A8BE +AE20 +B93F +AF20 +A03F +AA01 +AA55 +2A55 +5A83 +3386 +ENDCHAR +STARTCHAR U+9DCA +ENCODING 40394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +FE20 +00FE +7C82 +44FE +7C82 +00FE +FE80 +82FF +AA80 +92FF +AA01 +8355 +BB55 +9303 +9606 +ENDCHAR +STARTCHAR U+9DCB +ENCODING 40395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +3FBE +1162 +043E +0A22 +113E +2EA0 +447F +1F20 +043F +0E55 +152B +2481 +0C02 +0000 +0000 +ENDCHAR +STARTCHAR U+9DCC +ENCODING 40396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107E +3E48 +6248 +3E7E +2248 +3E7E +2048 +3F48 +207F +3F25 +2525 +5B5B +0101 +0E0E +0000 +0000 +ENDCHAR +STARTCHAR U+9DCD +ENCODING 40397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +3F3E +6162 +3F3E +2122 +3F3E +2120 +3F3F +0420 +7FBF +0C25 +165B +6581 +040E +0000 +0000 +ENDCHAR +STARTCHAR U+9DCE +ENCODING 40398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3F3E +5162 +1F3E +1122 +1F3E +0420 +3FBF +0420 +0E3F +1515 +64EB +1F01 +040E +0000 +0000 +ENDCHAR +STARTCHAR U+9DCF +ENCODING 40399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +7F40 +08F8 +3E88 +22F8 +3E88 +3EF8 +22FC +3E80 +00FC +7F54 +0DAC +1344 +6218 +0000 +ENDCHAR +STARTCHAR U+9DD0 +ENCODING 40400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1F10 +113E +1F62 +113E +1F22 +3FBE +2020 +2F3F +2020 +3FBF +2A55 +2AAB +4901 +1CCE +0000 +0000 +ENDCHAR +STARTCHAR U+9DD1 +ENCODING 40401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +3BBE +5562 +003E +1022 +083E +0420 +3F3F +0020 +123F +1255 +12AB +0C01 +7F8E +0000 +0000 +ENDCHAR +STARTCHAR U+9DD2 +ENCODING 40402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FDE +0432 +3F9E +2492 +3F9E +3F90 +045F +7FD0 +011F +7FD5 +212B +1101 +030E +0000 +0000 +ENDCHAR +STARTCHAR U+9DD3 +ENCODING 40403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +0440 +3FF8 +2A88 +2AF8 +3F88 +2AF8 +2EFC +2A80 +20FC +3E54 +57EC +57C4 +2118 +0000 +ENDCHAR +STARTCHAR U+9DD4 +ENCODING 40404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7F10 +083F +FFE2 +1036 +1F1C +3134 +6766 +C103 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9DD5 +ENCODING 40405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0088 +79FF +4B10 +4DFE +4910 +49FE +7910 +01FF +0100 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9DD6 +ENCODING 40406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FBC +4824 +4F27 +5440 +7FBE +4A14 +5108 +7FB6 +0100 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9DD7 +ENCODING 40407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7F10 +407E +4E42 +4A7E +4E42 +407E +4040 +5F7F +5540 +557F +5F45 +400B +4025 +7F51 +4046 +ENDCHAR +STARTCHAR U+9DD8 +ENCODING 40408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7FE0 +3FBF +24D4 +3F88 +1514 +24A3 +1FF8 +2888 +0FF8 +0800 +0FFC +0FFE +2492 +0000 +0000 +ENDCHAR +STARTCHAR U+9DD9 +ENCODING 40409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +3E40 +7FF0 +1450 +7FD4 +3EB4 +090C +0FE0 +0FE0 +0FE0 +0FFC +0FF8 +1548 +22B0 +0000 +ENDCHAR +STARTCHAR U+9DDA +ENCODING 40410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +F790 +10BE +94A2 +52BE +94A2 +083E +1420 +223F +C9A0 +103F +6401 +1955 +6255 +0C03 +7006 +ENDCHAR +STARTCHAR U+9DDB +ENCODING 40411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +3FDE +2232 +2FDE +3FF2 +2FDE +2210 +3FDF +3250 +3FDF +3255 +3FEB +5241 +1242 +0000 +0000 +ENDCHAR +STARTCHAR U+9DDC +ENCODING 40412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +3F3E +2962 +7FBE +2922 +3F3E +7FA0 +48BF +7FA0 +123F +7F95 +122B +0C01 +330E +0000 +0000 +ENDCHAR +STARTCHAR U+9DDD +ENCODING 40413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FA0 +24FE +3FA2 +24BE +3FA2 +153E +7FE0 +153F +7FE0 +043F +3F95 +042B +0401 +040E +0000 +0000 +ENDCHAR +STARTCHAR U+9DDE +ENCODING 40414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0810 +FFBE +0822 +AABE +4922 +AABE +0820 +AABF +4920 +AABF +1C01 +1455 +3655 +6303 +C186 +ENDCHAR +STARTCHAR U+9DDF +ENCODING 40415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +FDFF +2340 +3CFE +2490 +25FF +6428 +CDC7 +0100 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9DE0 +ENCODING 40416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +3C20 +64FE +4882 +FEFE +5282 +52FE +7E80 +52FF +5280 +7EFF +0001 +A955 +AB55 +AA03 +8006 +ENDCHAR +STARTCHAR U+9DE1 +ENCODING 40417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +203E +7FD2 +2A9E +2A92 +2A9E +7FD0 +2A9F +2A90 +2A9F +7FD5 +002B +4A81 +4A46 +0000 +0000 +ENDCHAR +STARTCHAR U+9DE2 +ENCODING 40418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2520 +3FBF +2249 +2A88 +2F94 +4422 +1FF8 +2888 +0FF8 +0800 +0FFC +0FFE +2492 +0000 +0000 +ENDCHAR +STARTCHAR U+9DE3 +ENCODING 40419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FA0 +127E +7FA2 +52BE +7FA2 +003E +3F20 +213F +3F20 +213F +3F55 +082B +7F81 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+9DE4 +ENCODING 40420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7710 +553E +7762 +003E +7F22 +493E +7F20 +493F +7F20 +083F +7F25 +085B +0801 +080E +0000 +0000 +ENDCHAR +STARTCHAR U+9DE5 +ENCODING 40421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2424 +6868 +1212 +7D7D +0808 +2A2A +4949 +0100 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9DE6 +ENCODING 40422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1440 +3FF8 +6888 +3EF8 +2888 +3EF8 +28FC +3F80 +04FC +3E54 +2FAC +2944 +4218 +0000 +ENDCHAR +STARTCHAR U+9DE7 +ENCODING 40423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +FE20 +10FE +7C82 +00FE +FE82 +82FE +7C80 +00FF +7C80 +44FF +7C01 +4555 +2955 +3E03 +E006 +ENDCHAR +STARTCHAR U+9DE8 +ENCODING 40424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1110 +7FDE +1132 +7FDE +1512 +151E +7FD0 +151F +7FD0 +041F +3F95 +042B +0401 +0406 +0000 +0000 +ENDCHAR +STARTCHAR U+9DE9 +ENCODING 40425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4910 +2A1F +FFB2 +8896 +AA9C +AAB6 +8983 +1FF0 +1010 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9DEB +ENCODING 40427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F10 +093E +FFE2 +093E +7F22 +083E +AAA0 +EBBF +88A0 +FFBF +8881 +EBD5 +AAD5 +AA83 +8886 +ENDCHAR +STARTCHAR U+9DEC +ENCODING 40428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1220 +3F7E +1222 +1E3E +0022 +7FBE +0020 +3F3F +2520 +3F3F +2525 +3F5B +1201 +210E +0000 +0000 +ENDCHAR +STARTCHAR U+9DED +ENCODING 40429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0620 +3A40 +2AF8 +1C88 +7FF8 +1C88 +2AF8 +7EFC +2A80 +3EFC +2A54 +3FAC +2144 +2218 +0000 +ENDCHAR +STARTCHAR U+9DEE +ENCODING 40430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0610 +1C20 +F07E +1042 +FF7E +2442 +7E7E +A540 +3C7F +0040 +FF7F +8101 +BD55 +A555 +BD03 +8306 +ENDCHAR +STARTCHAR U+9DEF +ENCODING 40431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0840 +7FF8 +5588 +32F8 +3F88 +62F8 +3EFC +2280 +3EFC +2A54 +29AC +4944 +1A18 +0000 +ENDCHAR +STARTCHAR U+9DF0 +ENCODING 40432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +FFFF +0420 +07E0 +1009 +F3CE +1248 +33C9 +D10F +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9DF2 +ENCODING 40434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0830 +7F28 +3FFC +2260 +3EA4 +2B1C +5FE0 +0820 +0FE0 +0FE0 +0FFC +0FFC +2924 +4498 +0000 +ENDCHAR +STARTCHAR U+9DF3 +ENCODING 40435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +F790 +94BE +F7A2 +94BE +F7A2 +80BE +BEA0 +A2BF +BEA0 +A2BF +BE81 +A2D5 +E2D5 +C683 +8186 +ENDCHAR +STARTCHAR U+9DF4 +ENCODING 40436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +F790 +94BE +F7A2 +94BE +F7A2 +80BE +88A0 +BEBF +88A0 +9CBF +9C81 +AAD5 +AAD5 +8883 +8186 +ENDCHAR +STARTCHAR U+9DF5 +ENCODING 40437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FA0 +20FE +3FA2 +24BE +3FA2 +253E +3FE0 +243F +2FA0 +28BF +3FA5 +28DB +4F81 +088E +0000 +0000 +ENDCHAR +STARTCHAR U+9DF6 +ENCODING 40438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FA0 +52FE +7FA2 +003E +3F22 +213E +3F20 +213F +3F20 +213F +3F25 +005B +1201 +210E +0000 +0000 +ENDCHAR +STARTCHAR U+9DF7 +ENCODING 40439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +7F3E +1462 +7F3E +5522 +673E +5D20 +413F +7F20 +043F +7F55 +04AB +2401 +0C0E +0000 +0000 +ENDCHAR +STARTCHAR U+9DF8 +ENCODING 40440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F20 +0A78 +0448 +7FF8 +1D48 +6478 +3F7C +2D40 +377C +2F34 +2BF4 +2FC4 +2318 +0000 +ENDCHAR +STARTCHAR U+9DF9 +ENCODING 40441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +12A0 +15FC +1FF0 +15F0 +15FC +13E0 +13E0 +13E0 +23F8 +23F8 +4D48 +12B0 +0000 +ENDCHAR +STARTCHAR U+9DFA +ENCODING 40442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0040 +3E78 +2390 +3E70 +2FFC +3E70 +6FE0 +0820 +0FE0 +0FE0 +0FFC +0FF8 +2A88 +4570 +0000 +ENDCHAR +STARTCHAR U+9DFB +ENCODING 40443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +3DF8 +641F +3DF2 +2512 +3DF2 +200A +3DEA +202A +3E4A +2BFA +564A +0244 +0CCB +0000 +0000 +ENDCHAR +STARTCHAR U+9DFD +ENCODING 40445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0AB0 +1190 +1AB0 +19B0 +3FFC +2108 +4FE0 +0FE0 +0820 +0FE0 +0FFC +0FF8 +1548 +22B0 +0000 +ENDCHAR +STARTCHAR U+9DFE +ENCODING 40446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0820 +7F7E +2242 +147E +FFC2 +007E +3E40 +227F +3E40 +227F +3E01 +0855 +5555 +5283 +8E06 +ENDCHAR +STARTCHAR U+9DFF +ENCODING 40447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F88 +20BE +3F94 +207F +3F88 +50BE +1F88 +0800 +1FF8 +2888 +0FF8 +0FFC +0FFE +2492 +0000 +0000 +ENDCHAR +STARTCHAR U+9E00 +ENCODING 40448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F90 +2ABE +2AE2 +3FBE +2022 +3FBE +48A0 +3EBF +2AA0 +3EBF +09A9 +7FA9 +00D5 +0302 +0000 +0000 +ENDCHAR +STARTCHAR U+9E01 +ENCODING 40449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +1000 +1FFC +0FF8 +0808 +0FF8 +3C8E +25EA +3D6A +25EE +3DEA +25FB +4D53 +0000 +0000 +ENDCHAR +STARTCHAR U+9E02 +ENCODING 40450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0308 +9E10 +D53E +52A2 +043E +8C22 +D93E +4A20 +04BF +4FA0 +58BF +4401 +DF55 +8455 +8A03 +9106 +ENDCHAR +STARTCHAR U+9E03 +ENCODING 40451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +3E28 +62FF +3E10 +22FE +3E10 +20FF +3E22 +20C9 +3E48 +2BFF +56CA +0345 +06CB +0000 +0000 +ENDCHAR +STARTCHAR U+9E04 +ENCODING 40452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +7E3F +3E52 +3E12 +7F8C +210C +4E33 +0200 +07F0 +0FD0 +07F0 +07F8 +07FE +1256 +0000 +0000 +ENDCHAR +STARTCHAR U+9E05 +ENCODING 40453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FC8 +4A5F +7FD1 +041F +3F91 +041F +7FD0 +111F +3F90 +041F +7FD5 +0415 +042B +0402 +0000 +0000 +ENDCHAR +STARTCHAR U+9E06 +ENCODING 40454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +079F +3FD1 +245F +3F91 +271F +2F90 +289F +2F90 +3F9F +4495 +3FD5 +112B +2082 +0000 +0000 +ENDCHAR +STARTCHAR U+9E07 +ENCODING 40455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +FF90 +003E +7F22 +413E +5D22 +553E +5D20 +413F +7F20 +223F +3E01 +2255 +3E55 +0003 +FF86 +ENDCHAR +STARTCHAR U+9E09 +ENCODING 40457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +083E +0822 +7F3E +083E +1CFF +2A7F +49A5 +0849 +1FFB +2888 +0FF8 +0FFC +0FFE +2492 +0000 +0000 +ENDCHAR +STARTCHAR U+9E0A +ENCODING 40458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0108 +7910 +4FFE +4822 +4C7E +4EE2 +7ABE +47E0 +413F +7920 +CFFF +C901 +C955 +4955 +7903 +0106 +ENDCHAR +STARTCHAR U+9E0B +ENCODING 40459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +7FDF +4071 +6CDF +4911 +0F1F +0010 +3F9F +2A90 +7FDF +0005 +3F89 +0411 +1C23 +0000 +0000 +ENDCHAR +STARTCHAR U+9E0D +ENCODING 40461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FD0 +153E +2492 +7FDE +4452 +6EDE +5550 +6EDF +4450 +6EDF +5555 +6EEB +4441 +4446 +0000 +0000 +ENDCHAR +STARTCHAR U+9E0E +ENCODING 40462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7E7E +4242 +7E7E +4242 +7E7E +4242 +7E7E +2424 +4242 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9E0F +ENCODING 40463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +7BDF +1131 +7FDF +4051 +1F1F +0010 +3FDF +0A90 +171F +0B03 +1685 +2A49 +1613 +0000 +0000 +ENDCHAR +STARTCHAR U+9E10 +ENCODING 40464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +F790 +52BE +94A2 +52BE +94A2 +243E +4820 +FFBF +4820 +7F3F +4801 +7F55 +4855 +4803 +7F86 +ENDCHAR +STARTCHAR U+9E11 +ENCODING 40465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2905 +17E4 +E81F +0BC4 +380E +CBCA +1A5B +F3D1 +0100 +1FF0 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9E12 +ENCODING 40466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +391C +21C4 +391C +21C4 +3A5C +2244 +FFFF +1818 +310C +DFF3 +1010 +1FFF +1000 +5FFE +C922 +8496 +ENDCHAR +STARTCHAR U+9E13 +ENCODING 40467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F88 +249F +3FB1 +249F +3F91 +001F +7BD0 +5B5F +5B50 +5B5F +7BC9 +5B51 +5B61 +7BC3 +0000 +0000 +ENDCHAR +STARTCHAR U+9E14 +ENCODING 40468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FC +2084 +3CFC +4884 +10FC +7C48 +54FC +7C48 +55FE +7C84 +0122 +2AA9 +5470 +54A8 +0000 +0000 +ENDCHAR +STARTCHAR U+9E15 +ENCODING 40469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0F10 +083E +7FA2 +48BE +7F22 +48BE +5FA0 +553F +5F20 +553F +5F01 +4055 +BFD5 +AA83 +7FC6 +ENDCHAR +STARTCHAR U+9E16 +ENCODING 40470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F08 +0810 +FFBE +88A2 +EEBE +88A2 +663E +0020 +243F +7FA0 +C83F +7F01 +4855 +7F55 +4803 +7F86 +ENDCHAR +STARTCHAR U+9E17 +ENCODING 40471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087C +7F40 +147C +7F04 +3E7D +3E4A +3E55 +467F +1FF8 +0888 +0FF8 +0FFC +0FFE +2496 +0000 +0000 +ENDCHAR +STARTCHAR U+9E19 +ENCODING 40473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +1C10 +363E +6322 +DDBE +0022 +FFBE +94A0 +FFBF +0020 +7F3F +5501 +7F55 +5555 +5503 +5506 +ENDCHAR +STARTCHAR U+9E1A +ENCODING 40474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3BA0 +2AB8 +3BA8 +3BB8 +2AA8 +3BB8 +1B3C +24A0 +7FBC +0A34 +1EF4 +0DC4 +3118 +0000 +ENDCHAR +STARTCHAR U+9E1B +ENCODING 40475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1410 +7F20 +1478 +7748 +5578 +7748 +1478 +3F7C +6840 +3E7C +3E34 +28FC +3FC4 +2118 +0000 +ENDCHAR +STARTCHAR U+9E1C +ENCODING 40476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +F788 +9490 +F7BE +94A2 +F7BE +94A2 +F7BE +1020 +243F +7FA0 +C83F +7F01 +4855 +7F55 +4803 +7F86 +ENDCHAR +STARTCHAR U+9E1D +ENCODING 40477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +F788 +0010 +F7BE +94A2 +D6BE +0822 +FFBE +9420 +FFBF +94A0 +FFBF +A401 +BF55 +A455 +AC83 +7306 +ENDCHAR +STARTCHAR U+9E1E +ENCODING 40478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1390 +17D4 +6BE8 +1B98 +7FFC +3AB8 +57D4 +1FF0 +0FE0 +0FE0 +0FFC +0FF8 +1548 +22B0 +0000 +ENDCHAR +STARTCHAR U+9E1F +ENCODING 40479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0420 +1FF0 +1020 +1420 +1220 +1220 +10A0 +1044 +1FFE +0004 +0024 +FFF4 +0004 +0028 +0010 +ENDCHAR +STARTCHAR U+9E20 +ENCODING 40480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2048 +21FC +2908 +FD48 +2908 +2928 +2910 +2904 +29FE +2804 +2A24 +4DF4 +4804 +8014 +0008 +ENDCHAR +STARTCHAR U+9E21 +ENCODING 40481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0088 +01FC +FD08 +0548 +4908 +2928 +1110 +1104 +29FE +2404 +4024 +87F4 +0004 +0014 +0008 +ENDCHAR +STARTCHAR U+9E22 +ENCODING 40482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0480 +0444 +027E +FF80 +0082 +0462 +1FFE +1420 +1220 +10A0 +1044 +1FFE +0004 +7FE4 +0014 +0008 +ENDCHAR +STARTCHAR U+9E23 +ENCODING 40483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0888 +7DFC +4908 +4948 +4908 +4928 +4910 +4904 +49FE +7804 +4824 +07F4 +0004 +0014 +0008 +ENDCHAR +STARTCHAR U+9E25 +ENCODING 40485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7E24 +40FE +4284 +62A4 +5484 +5494 +4888 +5480 +52FE +6202 +4012 +45FA +7E02 +0014 +0008 +ENDCHAR +STARTCHAR U+9E26 +ENCODING 40486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0440 +FE88 +09FC +2908 +2948 +4908 +FF28 +0910 +1904 +29FE +4804 +8824 +0BF4 +0804 +2814 +1008 +ENDCHAR +STARTCHAR U+9E28 +ENCODING 40488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +4048 +49FC +5908 +6148 +4508 +4528 +3D10 +1104 +11FE +FE04 +1024 +13F4 +1004 +1014 +1008 +ENDCHAR +STARTCHAR U+9E29 +ENCODING 40489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1048 +11FC +5108 +7F48 +5308 +9528 +1110 +1104 +29FE +2804 +2A24 +4DF4 +4804 +8014 +0008 +ENDCHAR +STARTCHAR U+9E2A +ENCODING 40490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1048 +11FC +1508 +FF48 +1108 +1128 +1110 +7D04 +45FE +4404 +4424 +47F4 +7C04 +4414 +0008 +ENDCHAR +STARTCHAR U+9E2B +ENCODING 40491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1048 +15FC +FF08 +2148 +5108 +9528 +FF10 +1104 +39FE +3404 +5424 +93F4 +1004 +5014 +2008 +ENDCHAR +STARTCHAR U+9E2C +ENCODING 40492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1448 +1FFC +1108 +1548 +7F08 +4528 +4510 +7D04 +45FE +4004 +4024 +43F4 +4004 +8014 +0008 +ENDCHAR +STARTCHAR U+9E2D +ENCODING 40493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +FF44 +92FE +9284 +92A4 +FE84 +9294 +9288 +9280 +FEFE +9202 +1012 +11FA +1002 +100A +1004 +ENDCHAR +STARTCHAR U+9E2F +ENCODING 40495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +1FF8 +1110 +1114 +FFFE +0440 +0A30 +3FEE +CA24 +08A0 +0844 +0FFE +0004 +7FC4 +0014 +0008 +ENDCHAR +STARTCHAR U+9E31 +ENCODING 40497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0648 +79FC +5108 +5148 +5508 +7F28 +4910 +4904 +49FE +4804 +4424 +45F4 +5404 +6A94 +0108 +ENDCHAR +STARTCHAR U+9E32 +ENCODING 40498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +2048 +25FC +7F08 +8548 +0508 +7528 +5510 +5504 +55FE +7404 +5424 +05F4 +0804 +2814 +1008 +ENDCHAR +STARTCHAR U+9E33 +ENCODING 40499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +1EFC +2288 +52A8 +1498 +0882 +127E +EFE0 +0A20 +08A0 +0848 +0FFC +0008 +7FE8 +0008 +0018 +ENDCHAR +STARTCHAR U+9E35 +ENCODING 40501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +2020 +7C00 +45FE +5502 +4604 +5480 +4888 +4090 +7EE0 +0280 +1280 +FA82 +0282 +147E +0800 +ENDCHAR +STARTCHAR U+9E36 +ENCODING 40502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +32C8 +0C30 +1040 +3EF8 +0004 +FFFE +0200 +1FF0 +1210 +1124 +1FFE +0004 +7FE4 +000C +ENDCHAR +STARTCHAR U+9E37 +ENCODING 40503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0848 +FEFC +0848 +0EC8 +78AA +090A +1A06 +1FE0 +1220 +1144 +1FFE +0004 +7FF4 +0004 +0018 +ENDCHAR +STARTCHAR U+9E38 +ENCODING 40504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0124 +FFFE +0844 +1054 +7F44 +5554 +5548 +5540 +557E +5502 +5512 +55FA +4102 +430A +0004 +ENDCHAR +STARTCHAR U+9E39 +ENCODING 40505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0C48 +71FC +1108 +1148 +1508 +FF28 +1110 +1504 +7FFE +4404 +4424 +47F4 +7C04 +4414 +0008 +ENDCHAR +STARTCHAR U+9E3A +ENCODING 40506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +1224 +127E +2244 +3FD4 +6244 +A654 +2748 +2AC0 +2A7E +3202 +2212 +22FA +2202 +220A +2204 +ENDCHAR +STARTCHAR U+9E3D +ENCODING 40509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1048 +29FC +2908 +2548 +4328 +8928 +7D10 +0104 +7DFE +4404 +4424 +47F4 +4404 +7C14 +4008 +ENDCHAR +STARTCHAR U+9E3E +ENCODING 40510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0104 +FFFE +0440 +1450 +254C +4644 +1FE0 +1220 +1120 +1044 +1FFE +0004 +7FF4 +0004 +0018 +ENDCHAR +STARTCHAR U+9E3F +ENCODING 40511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +3048 +10FC +0288 +9FA8 +6488 +24A8 +0490 +1484 +14FE +E704 +3C24 +29F4 +2004 +2014 +2008 +ENDCHAR +STARTCHAR U+9E41 +ENCODING 40513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0A48 +7FFC +0888 +48A8 +7F88 +41A8 +8290 +3E84 +04FE +0804 +FE24 +0BF4 +0804 +2814 +1008 +ENDCHAR +STARTCHAR U+9E42 +ENCODING 40514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0124 +FFFE +0044 +0054 +7744 +5554 +5548 +5540 +777E +5502 +5512 +55FA +5502 +550A +0004 +ENDCHAR +STARTCHAR U+9E43 +ENCODING 40515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7F44 +42FE +4284 +7EA4 +0084 +7E94 +4288 +4280 +7EFE +4202 +4212 +7FFA +4202 +4A14 +4408 +ENDCHAR +STARTCHAR U+9E44 +ENCODING 40516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +2848 +2AFC +3F88 +48A8 +8888 +0AA8 +FF90 +0084 +3EFE +2204 +2224 +23F4 +2204 +3E14 +2208 +ENDCHAR +STARTCHAR U+9E45 +ENCODING 40517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +3848 +ECFC +2A88 +28A8 +FE88 +28A8 +2890 +3880 +EAFE +2C02 +2812 +35FA +2402 +A514 +4208 +ENDCHAR +STARTCHAR U+9E46 +ENCODING 40518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +2848 +45FC +9308 +1148 +2908 +4528 +8310 +7D04 +45FE +4404 +4424 +47F4 +7C04 +4414 +0008 +ENDCHAR +STARTCHAR U+9E47 +ENCODING 40519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4010 +2F24 +117E +4944 +4954 +7F44 +4954 +5948 +5D40 +5B7E +6902 +4912 +49FA +4102 +450A +4204 +ENDCHAR +STARTCHAR U+9E48 +ENCODING 40520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +1424 +7F7E +0944 +0954 +7F44 +4854 +4848 +7F40 +097E +1902 +1D12 +2AFA +C802 +080A +0804 +ENDCHAR +STARTCHAR U+9E49 +ENCODING 40521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0624 +7D7E +0444 +0454 +FF44 +1454 +5448 +5C40 +547E +5202 +5212 +5EFA +F182 +408A +0004 +ENDCHAR +STARTCHAR U+9E4A +ENCODING 40522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2420 +2448 +24FC +7E88 +24A8 +2488 +FFA8 +0090 +7E84 +42FE +4204 +7E14 +43FC +4204 +7E14 +4208 +ENDCHAR +STARTCHAR U+9E4B +ENCODING 40523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +2224 +FFFE +2244 +2254 +0044 +7F54 +4948 +4940 +497E +7F02 +4912 +49FA +4902 +7F0A +4104 +ENDCHAR +STARTCHAR U+9E4C +ENCODING 40524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0924 +FFFE +1444 +1254 +2944 +7FD4 +C948 +7F40 +497E +4902 +7F12 +08FA +0A02 +0C0A +0804 +ENDCHAR +STARTCHAR U+9E4E +ENCODING 40526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1124 +7FFE +4944 +4954 +7F44 +4954 +5148 +7F40 +107E +2902 +FF92 +08FA +0802 +080A +0804 +ENDCHAR +STARTCHAR U+9E4F +ENCODING 40527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7724 +557E +5544 +5554 +7744 +5554 +5548 +5540 +777E +5502 +550A +55FE +5502 +8B0A +0004 +ENDCHAR +STARTCHAR U+9E51 +ENCODING 40529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +0A48 +FFFC +0088 +3EA8 +2288 +22A8 +3E90 +0084 +7EFE +0404 +FF24 +09F4 +0804 +2814 +1008 +ENDCHAR +STARTCHAR U+9E55 +ENCODING 40533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2724 +257E +FD44 +2554 +2744 +2554 +7548 +5540 +577E +5502 +5512 +75FA +4902 +130A +0004 +ENDCHAR +STARTCHAR U+9E57 +ENCODING 40535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7724 +557E +5544 +7754 +0044 +7F54 +0048 +FFC0 +207E +3E02 +0212 +02FA +0202 +140A +0804 +ENDCHAR +STARTCHAR U+9E58 +ENCODING 40536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E48 +44FC +7488 +54A8 +FE88 +82A8 +7C90 +4484 +7CFE +4404 +7C24 +45F4 +4404 +5428 +4810 +ENDCHAR +STARTCHAR U+9E5A +ENCODING 40538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +4124 +227E +0044 +FFD4 +0044 +2254 +2248 +5540 +FF7E +2202 +2212 +55FA +FF02 +110A +0004 +ENDCHAR +STARTCHAR U+9E5B +ENCODING 40539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +7FA4 +497E +4944 +7F54 +4044 +5F54 +5148 +5140 +5F7E +5102 +5F12 +51FA +5102 +9F0A +1104 +ENDCHAR +STARTCHAR U+9E5C +ENCODING 40540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C80 +08FE +FF88 +3250 +5420 +9150 +328E +1FE0 +1220 +1120 +1044 +1FFE +0004 +7FF4 +0004 +0018 +ENDCHAR +STARTCHAR U+9E5E +ENCODING 40542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +0724 +F87E +4144 +2A54 +2A44 +4054 +7E48 +8840 +097E +FF82 +0812 +49FA +4902 +7F0A +0104 +ENDCHAR +STARTCHAR U+9E63 +ENCODING 40547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +1424 +7F7E +1444 +7F54 +1544 +FFD4 +1548 +7F40 +147E +3602 +5512 +94FA +1402 +140A +1404 +ENDCHAR +STARTCHAR U+9E64 +ENCODING 40548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0848 +7FFC +5288 +90A8 +2888 +7EA8 +A890 +3E84 +28FE +3E04 +2824 +29F4 +3E04 +2014 +2008 +ENDCHAR +STARTCHAR U+9E66 +ENCODING 40550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7724 +557E +5544 +5554 +5544 +2254 +5548 +1040 +FFFE +2202 +2212 +14FA +0802 +160A +6104 +ENDCHAR +STARTCHAR U+9E67 +ENCODING 40551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0524 +7FFE +5244 +5254 +5244 +7FD4 +5248 +5240 +5E7E +4002 +5212 +52FA +6D02 +800A +0004 +ENDCHAR +STARTCHAR U+9E68 +ENCODING 40552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +EE48 +22FC +AA88 +66A8 +AA88 +32A8 +1090 +2884 +46FE +9A04 +6024 +19F4 +6404 +0814 +7008 +ENDCHAR +STARTCHAR U+9E69 +ENCODING 40553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0924 +FFFE +5544 +2254 +4144 +BED4 +2248 +3E40 +227E +3E02 +0812 +2AFA +4902 +888A +1804 +ENDCHAR +STARTCHAR U+9E6A +ENCODING 40554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1410 +1424 +3F7E +2444 +6454 +BF44 +2454 +2448 +3F40 +247E +2402 +3F12 +20FA +5502 +548A +8084 +ENDCHAR +STARTCHAR U+9E6B +ENCODING 40555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0828 +FFA4 +22FE +3E20 +2A52 +4992 +9A0E +1FE0 +1220 +1120 +1044 +1FFE +0004 +7FE4 +0014 +0008 +ENDCHAR +STARTCHAR U+9E6C +ENCODING 40556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +7F24 +147E +0844 +FF54 +1A44 +2854 +4948 +7FC0 +557E +6302 +5D12 +55FA +5D02 +410A +4304 +ENDCHAR +STARTCHAR U+9E6D +ENCODING 40557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7CF8 +4550 +7C20 +1050 +5DFE +5088 +FEF8 +0400 +1FE0 +1220 +1144 +1FFE +0004 +7FE4 +0018 +ENDCHAR +STARTCHAR U+9E70 +ENCODING 40560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2250 +247C +2CD0 +357C +2450 +245C +2100 +27F0 +2490 +2420 +47FC +4004 +9FE4 +000C +ENDCHAR +STARTCHAR U+9E71 +ENCODING 40561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +23FE +7CA8 +45FC +5720 +45FC +5520 +49FC +4120 +7FFE +0200 +12F8 +FA48 +0230 +0A48 +0586 +ENDCHAR +STARTCHAR U+9E73 +ENCODING 40563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2210 +FFA4 +227E +7744 +5554 +7744 +2454 +3F48 +6440 +BF7E +2402 +3F12 +24FA +2402 +3F8A +2004 +ENDCHAR +STARTCHAR U+9E75 +ENCODING 40565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +01FC +0100 +3FF8 +2248 +2148 +2C68 +2398 +3898 +2548 +2328 +2488 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+9E78 +ENCODING 40568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1020 +1020 +1E50 +1088 +7FFC +5220 +4EF8 +76A8 +6EA8 +5AF8 +7620 +4A50 +7E88 +4304 +0000 +ENDCHAR +STARTCHAR U+9E79 +ENCODING 40569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1030 +1028 +1E28 +11FC +7F20 +57E8 +4F28 +7BE8 +6FB0 +57F0 +73B4 +4B2C +7E4C +4204 +0000 +ENDCHAR +STARTCHAR U+9E7A +ENCODING 40570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1042 +1024 +1EFF +1010 +1010 +FE7E +9210 +8210 +AAFF +9210 +D620 +927E +AAC8 +8208 +9208 +FEFF +ENDCHAR +STARTCHAR U+9E7B +ENCODING 40571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1024 +1048 +1EFE +1028 +10FE +FE2A +922A +82FF +AA2A +922A +D6FE +9228 +AA6C +82AA +92AB +FE28 +ENDCHAR +STARTCHAR U+9E7C +ENCODING 40572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +1E6C +11C7 +1000 +FE7C +9200 +82EE +AAAA +92AA +D6EE +9200 +AA44 +8244 +92EE +FEAB +ENDCHAR +STARTCHAR U+9E7D +ENCODING 40573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +3DFC +2A7C +3FF8 +26D8 +3F78 +2BA8 +3FF8 +2208 +1FF0 +1290 +1290 +7FFC +0000 +0000 +ENDCHAR +STARTCHAR U+9E7E +ENCODING 40574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +1090 +1FFE +1040 +7DFC +4440 +47FE +6C80 +5488 +54FC +5520 +6D20 +4620 +4424 +7FFE +4400 +ENDCHAR +STARTCHAR U+9E7F +ENCODING 40575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1240 +1FF8 +1248 +1248 +1FF8 +1440 +17C8 +2470 +2444 +4744 +183C +0000 +ENDCHAR +STARTCHAR U+9E80 +ENCODING 40576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +2820 +2F3C +2821 +3F3F +2400 +243C +6FE0 +4400 +C606 +03FC +ENDCHAR +STARTCHAR U+9E81 +ENCODING 40577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +03E0 +0C40 +7180 +1FFC +1240 +1FF8 +1248 +1FF8 +144C +17F0 +2440 +2744 +583C +0000 +ENDCHAR +STARTCHAR U+9E82 +ENCODING 40578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFC +2440 +3FF8 +2448 +3FF8 +2840 +2F78 +2844 +2F3C +2020 +27F8 +4420 +4422 +8422 +181E +ENDCHAR +STARTCHAR U+9E83 +ENCODING 40579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +3FFF +2220 +3FFE +2222 +3FFE +2420 +27A4 +2439 +27A3 +3C1E +6000 +4524 +CDB6 +1893 +ENDCHAR +STARTCHAR U+9E84 +ENCODING 40580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +0810 +3FFC +E217 +0410 +1870 +7080 +3FFF +2220 +3FFE +2222 +3FFE +6820 +4F3C +C821 +1FBF +ENDCHAR +STARTCHAR U+9E85 +ENCODING 40581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +2820 +6F3C +4821 +DFFF +0804 +1FC4 +6844 +0FDC +0803 +07FE +ENDCHAR +STARTCHAR U+9E86 +ENCODING 40582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2220 +2FFC +2224 +2FFE +27BC +2420 +27BC +27F8 +47E8 +05F8 +0408 +3FFE +0000 +0000 +ENDCHAR +STARTCHAR U+9E87 +ENCODING 40583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FFE +2440 +3FF8 +2448 +3FF8 +2A50 +2C64 +2F7C +2030 +27C0 +2088 +5FFC +42A0 +9C9C +0080 +ENDCHAR +STARTCHAR U+9E88 +ENCODING 40584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1240 +1FF8 +1248 +1FF8 +1770 +1744 +1CBC +2FF8 +27F0 +4080 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+9E89 +ENCODING 40585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +1E3C +0408 +3FBF +0488 +3FFF +2220 +2FFE +2222 +3FFE +2420 +27BC +4421 +07BF +0000 +0000 +ENDCHAR +STARTCHAR U+9E8A +ENCODING 40586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +0490 +3FFE +0490 +0988 +3FFE +2220 +2FFC +2224 +3FFE +2420 +27B8 +4422 +07BE +0000 +0000 +ENDCHAR +STARTCHAR U+9E8B +ENCODING 40587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1240 +1FF8 +1248 +1FF8 +2770 +4744 +193C +0920 +7FFC +07C0 +793C +0100 +0000 +ENDCHAR +STARTCHAR U+9E8C +ENCODING 40588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1FF8 +1248 +1FF8 +2774 +5E3C +07E0 +1420 +17E0 +1FF0 +7FFC +0660 +781C +0000 +ENDCHAR +STARTCHAR U+9E8D +ENCODING 40589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2220 +2FFC +2224 +3FFC +27B8 +4420 +07BC +3FFE +0408 +0FF8 +0491 +389F +0000 +0000 +ENDCHAR +STARTCHAR U+9E8E +ENCODING 40590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +2820 +2F3C +2821 +3FFF +6800 +4BFE +C800 +0FFF +1A24 +33DF +ENDCHAR +STARTCHAR U+9E8F +ENCODING 40591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +2820 +2F3C +2821 +3FFF +2104 +2FFF +6104 +4FFE +C282 +0CFE +ENDCHAR +STARTCHAR U+9E91 +ENCODING 40593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1FF8 +1248 +1FF8 +2F70 +4E44 +323C +1CF0 +1EF0 +1010 +1FF0 +0C84 +707C +0000 +ENDCHAR +STARTCHAR U+9E92 +ENCODING 40594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0448 +0448 +3F48 +2AFC +3F48 +2B78 +2B48 +3F78 +3448 +3DFC +3650 +5448 +5D84 +3304 +0000 +ENDCHAR +STARTCHAR U+9E93 +ENCODING 40595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +7FFC +0E70 +15A8 +2524 +5FFC +1240 +1FF8 +1248 +1FF8 +1758 +2460 +4744 +183C +0000 +ENDCHAR +STARTCHAR U+9E94 +ENCODING 40596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2FFC +2224 +3FFC +2738 +4FBC +1F90 +2528 +0244 +1DFE +0FF8 +0808 +0FF8 +0000 +0000 +ENDCHAR +STARTCHAR U+9E95 +ENCODING 40597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1FF8 +1248 +1FF8 +23E4 +4E3C +1FF0 +17D0 +1FF0 +1390 +1D50 +1FF0 +1010 +0000 +ENDCHAR +STARTCHAR U+9E96 +ENCODING 40598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +2820 +2F3C +2821 +3F3F +2040 +2FFE +6208 +43F8 +C444 +0CC6 +ENDCHAR +STARTCHAR U+9E97 +ENCODING 40599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFC +3EF8 +2288 +2BA8 +1FFC +1240 +1FF8 +1248 +1FF8 +1758 +2460 +4744 +183C +0000 +ENDCHAR +STARTCHAR U+9E98 +ENCODING 40600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +2820 +2F3C +2821 +3FFF +2040 +2FFE +6248 +47FC +DA0B +03F8 +ENDCHAR +STARTCHAR U+9E99 +ENCODING 40601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2FFE +2FFE +279E +2451 +47DF +0012 +1FFF +1010 +1F94 +1F88 +2895 +4FA3 +0000 +0000 +ENDCHAR +STARTCHAR U+9E9A +ENCODING 40602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2FFE +2FFE +279E +4451 +07DF +3F3E +2102 +3F3E +203E +3F14 +3F08 +2077 +0000 +0000 +ENDCHAR +STARTCHAR U+9E9B +ENCODING 40603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +2820 +2F3C +2821 +3FFF +2122 +2F3E +6822 +4F3E +C162 +0702 +ENDCHAR +STARTCHAR U+9E9C +ENCODING 40604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2220 +2FFC +2FFC +279C +27DE +3FFF +4220 +1FFC +1224 +1FFC +3FFF +0888 +0000 +0000 +ENDCHAR +STARTCHAR U+9E9D +ENCODING 40605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1FF8 +1248 +1FF8 +2774 +4E3C +1E10 +13FC +1E90 +1E50 +7E50 +1A10 +6630 +0000 +ENDCHAR +STARTCHAR U+9E9E +ENCODING 40606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +6820 +4F3C +C8A1 +1FFF +0220 +3FFE +0410 +07F0 +3FFE +0080 +ENDCHAR +STARTCHAR U+9E9F +ENCODING 40607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +04A8 +3F70 +2AFC +3F70 +2BA8 +2B64 +3F48 +2AFC +2FA8 +2AA8 +2A7C +2F88 +5908 +0000 +ENDCHAR +STARTCHAR U+9EA0 +ENCODING 40608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2210 +2FFE +2FFE +27DF +2FFE +23F8 +43F8 +03F8 +0FFE +07FC +0444 +07FC +0000 +0000 +ENDCHAR +STARTCHAR U+9EA1 +ENCODING 40609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2FFE +279E +24D1 +7FFF +0142 +1EBC +12A4 +2CB2 +1004 +1FFC +1FFC +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+9EA4 +ENCODING 40612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFF +2220 +3FFE +2222 +3FFE +6820 +4F3C +C821 +7FFF +5454 +7F7F +5555 +7F7F +A4A4 +B6B7 +ENDCHAR +STARTCHAR U+9EA5 +ENCODING 40613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +7FFC +0920 +1930 +27C8 +0540 +1930 +63EC +0E20 +3140 +01C0 +0620 +3800 +0000 +ENDCHAR +STARTCHAR U+9EA6 +ENCODING 40614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0100 +3FF8 +0100 +1FF0 +0100 +7FFC +0100 +03F0 +0E20 +3140 +0180 +0660 +781C +0000 +ENDCHAR +STARTCHAR U+9EA7 +ENCODING 40615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0408 +7FD0 +24BF +2480 +555E +0A02 +1102 +2484 +4A48 +1911 +061F +0900 +30FF +0000 +0000 +ENDCHAR +STARTCHAR U+9EA8 +ENCODING 40616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +FE10 +5454 +5456 +BAD3 +1190 +3812 +5412 +A276 +3C04 +440C +AC18 +1830 +30E0 +6C00 +C3FF +ENDCHAR +STARTCHAR U+9EA9 +ENCODING 40617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F20 +2AF8 +2A20 +5D20 +1AFC +2920 +4E50 +1250 +2C88 +4508 +1B00 +60FC +0000 +ENDCHAR +STARTCHAR U+9EAA +ENCODING 40618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7F20 +2AA0 +2AB8 +5DA8 +1CA8 +2AA8 +4EF8 +1288 +2C08 +4408 +1A08 +6030 +0000 +ENDCHAR +STARTCHAR U+9EAC +ENCODING 40620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +FE08 +5408 +54FF +BA89 +108A +3888 +54FE +A2A2 +3CB6 +4494 +AC9C +1888 +309C +6D36 +C463 +ENDCHAR +STARTCHAR U+9EAD +ENCODING 40621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7F78 +2A88 +2AE8 +5DA8 +1CA8 +2AE8 +4EB0 +1280 +2C84 +447C +1B00 +60FC +0000 +ENDCHAR +STARTCHAR U+9EAE +ENCODING 40622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +FE10 +5410 +54FE +BA10 +1010 +3810 +5410 +A3FF +3C20 +4420 +AC64 +1844 +305E +6CF2 +C583 +ENDCHAR +STARTCHAR U+9EAF +ENCODING 40623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1028 +FE28 +5428 +54FE +BAAA +10AA +38AA +54FE +A2AA +3CAA +44AA +ACAA +18FE +3000 +6C00 +C3FF +ENDCHAR +STARTCHAR U+9EB0 +ENCODING 40624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +FE20 +5464 +5444 +BAFE +1002 +3810 +5490 +A2FE +3D10 +4410 +ADFF +1810 +3010 +6C10 +C3FF +ENDCHAR +STARTCHAR U+9EB3 +ENCODING 40627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +FE10 +55FF +5410 +BA54 +1054 +3854 +54FE +A2BA +3D93 +4438 +AC7C +18D6 +3193 +6D11 +C410 +ENDCHAR +STARTCHAR U+9EB4 +ENCODING 40628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1480 +FE84 +10FE +5504 +BA4C +1154 +28E4 +67FC +BC44 +24E4 +2954 +5A4C +1044 +2054 +C048 +ENDCHAR +STARTCHAR U+9EB5 +ENCODING 40629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +08FF +7F08 +0810 +2A7F +2A55 +2A55 +555D +2255 +4A5D +1F55 +2155 +527F +0E40 +1BFF +6000 +ENDCHAR +STARTCHAR U+9EB6 +ENCODING 40630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7EFF +0866 +2A5A +2A5A +5D66 +0842 +147E +2210 +51FF +3E91 +5495 +08BD +3683 +0000 +0000 +ENDCHAR +STARTCHAR U+9EB7 +ENCODING 40631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1155 +11FF +7D55 +11FF +35FF +5955 +35FF +11FF +28FE +5482 +3CFE +6444 +19FF +67FF +0000 +0000 +ENDCHAR +STARTCHAR U+9EB8 +ENCODING 40632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7F20 +08F8 +3E20 +0820 +7FFC +1020 +1E50 +3250 +4C88 +0508 +1B00 +60FC +0000 +ENDCHAR +STARTCHAR U+9EB9 +ENCODING 40633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0840 +0840 +7FFC +08A4 +3F2C +08B4 +7F64 +08FC +1E74 +12AC +2D2C +4438 +1B00 +60FC +0000 +ENDCHAR +STARTCHAR U+9EBA +ENCODING 40634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +09FC +7E40 +0880 +3FFC +0954 +7F74 +1154 +1D74 +2554 +55FC +0904 +1600 +61FC +0000 +ENDCHAR +STARTCHAR U+9EBB +ENCODING 40635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +0080 +1FFC +1220 +1220 +1FFC +1220 +1770 +16F0 +1AA8 +1324 +2220 +4220 +0220 +0000 +ENDCHAR +STARTCHAR U+9EBC +ENCODING 40636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1220 +1FFC +1668 +16EC +1AEC +12A0 +1110 +1720 +10D0 +2108 +2FFC +4004 +0000 +ENDCHAR +STARTCHAR U+9EBD +ENCODING 40637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0084 +3FFE +2210 +3FFC +2210 +2738 +2AD6 +3210 +2100 +2240 +2480 +4910 +4208 +87FC +0004 +ENDCHAR +STARTCHAR U+9EBE +ENCODING 40638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +3FFC +2420 +3FFC +26B0 +36B4 +372C +2460 +2780 +21F0 +2F00 +21FC +3F04 +40FC +0000 +ENDCHAR +STARTCHAR U+9EBF +ENCODING 40639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0080 +1FFC +1210 +1FFC +1330 +16D8 +1BF4 +1210 +13F0 +1080 +27F8 +2408 +47F8 +0408 +0000 +ENDCHAR +STARTCHAR U+9EC0 +ENCODING 40640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +3FFE +2208 +2FBE +271C +2AAA +2FDE +2492 +4792 +0492 +0794 +0488 +0FD4 +00A2 +0000 +0000 +ENDCHAR +STARTCHAR U+9EC2 +ENCODING 40642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2208 +2FBE +2AAA +27FC +2444 +3F1F +4404 +07F8 +07F8 +0408 +07F8 +0804 +0000 +0000 +ENDCHAR +STARTCHAR U+9EC3 +ENCODING 40643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +07F0 +0000 +7FFF +0080 +1FFC +1084 +1FFC +1084 +1FFC +0000 +1004 +2002 +ENDCHAR +STARTCHAR U+9EC4 +ENCODING 40644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +0440 +3FF8 +0440 +7FFC +0100 +1FF0 +1110 +1FF0 +1110 +1FF0 +0440 +1830 +6008 +0000 +ENDCHAR +STARTCHAR U+9EC6 +ENCODING 40646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +7F08 +2208 +3E7F +0049 +FFC9 +0808 +7F08 +491C +4914 +7F14 +4914 +4934 +7F25 +2265 +C1C3 +ENDCHAR +STARTCHAR U+9EC8 +ENCODING 40648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +7F08 +2208 +3E7F +0008 +FF88 +0808 +7F08 +493E +4908 +7F08 +4908 +4908 +7F08 +227F +C180 +ENDCHAR +STARTCHAR U+9EC9 +ENCODING 40649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2208 +1110 +7FFE +4442 +9FF4 +0440 +FFFE +0110 +1FF8 +1110 +1FF0 +1110 +1FF0 +0440 +1830 +2008 +ENDCHAR +STARTCHAR U+9ECB +ENCODING 40651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +10FE +9244 +D67C +5400 +11FF +1010 +FEFE +2892 +28FE +2892 +28FE +2844 +6983 +4801 +C7FF +ENDCHAR +STARTCHAR U+9ECC +ENCODING 40652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0AB0 +1190 +1AB0 +19B0 +3FFC +2448 +5FF0 +07C0 +7FFC +0FE0 +0FE0 +0920 +0FE0 +3838 +0000 +ENDCHAR +STARTCHAR U+9ECD +ENCODING 40653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +1FC0 +0100 +7FFC +0380 +0D60 +711C +0380 +0D60 +793C +07C0 +0D60 +3118 +0300 +0000 +ENDCHAR +STARTCHAR U+9ECE +ENCODING 40654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0640 +3840 +08F8 +7F28 +1C48 +2A88 +4930 +0A80 +0D60 +793C +05C0 +0760 +3918 +0300 +0000 +ENDCHAR +STARTCHAR U+9ECF +ENCODING 40655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0620 +3820 +0820 +7F20 +1C3C +2A20 +4D20 +1CF8 +6B88 +2E88 +1C88 +6B88 +08F8 +1888 +0000 +ENDCHAR +STARTCHAR U+9ED0 +ENCODING 40656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0620 +3820 +09FC +7F98 +1CE8 +2AB8 +49C8 +1CF8 +2A20 +6DFC +1D54 +6BEC +0904 +190C +0000 +ENDCHAR +STARTCHAR U+9ED1 +ENCODING 40657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +3FFC +2108 +3128 +2D38 +2548 +2108 +3FF8 +0100 +7FFC +0100 +FFFE +0000 +2890 +244C +4444 +ENDCHAR +STARTCHAR U+9ED2 +ENCODING 40658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +1110 +1FF0 +1110 +1FF0 +0100 +3FF8 +0100 +7FFC +0000 +2488 +2244 +4244 +0000 +ENDCHAR +STARTCHAR U+9ED3 +ENCODING 40659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FCA +4449 +5548 +4E7F +4448 +7FC8 +0408 +3F88 +0408 +0408 +7FC8 +0004 +4A43 +4A41 +0000 +0000 +ENDCHAR +STARTCHAR U+9ED4 +ENCODING 40660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +3520 +2F50 +2D50 +3F88 +0474 +3F00 +06F0 +7810 +1A10 +2D10 +2D10 +4010 +0000 +ENDCHAR +STARTCHAR U+9ED5 +ENCODING 40661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7F08 +4908 +6B7F +5B49 +5D49 +4908 +7F08 +081C +7F14 +0814 +0F94 +F834 +0525 +5565 +90C3 +ENDCHAR +STARTCHAR U+9ED6 +ENCODING 40662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4908 +6B28 +5D28 +4948 +7F48 +087F +7F0C +080C +7F0C +0014 +5524 +5545 +5587 +0000 +0000 +ENDCHAR +STARTCHAR U+9ED8 +ENCODING 40664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F98 +3594 +2E94 +2C90 +3FFC +0410 +3F90 +0410 +0790 +7828 +1528 +2AC4 +4084 +0000 +ENDCHAR +STARTCHAR U+9ED9 +ENCODING 40665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0030 +3F28 +2528 +3FFC +2520 +3F20 +0450 +3F50 +0688 +7804 +1490 +1248 +2244 +4004 +0000 +ENDCHAR +STARTCHAR U+9EDA +ENCODING 40666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F22 +4922 +6B22 +5D22 +497F +4922 +7F22 +0822 +3E3E +0822 +7F22 +0022 +553E +5522 +0000 +0000 +ENDCHAR +STARTCHAR U+9EDB +ENCODING 40667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0290 +04BC +1FC0 +6824 +081C +1FF4 +1110 +1FF0 +1FF0 +3FF8 +0100 +7FFC +2488 +4244 +0000 +ENDCHAR +STARTCHAR U+9EDC +ENCODING 40668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +35A8 +2FA8 +2DA8 +3FF8 +04A8 +3F20 +06A8 +78A8 +1AA8 +2DA8 +2DF8 +4088 +0000 +ENDCHAR +STARTCHAR U+9EDD +ENCODING 40669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0090 +3E90 +2A90 +2E90 +3B50 +3F7C +08D4 +3E94 +0CD4 +7154 +1FE4 +2E24 +2E44 +4098 +0000 +ENDCHAR +STARTCHAR U+9EDE +ENCODING 40670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +3520 +2F3C +2D20 +3F20 +0420 +3FF8 +0688 +7888 +1A88 +2D88 +2DF8 +4088 +0000 +ENDCHAR +STARTCHAR U+9EDF +ENCODING 40671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E20 +547C +5484 +7D48 +5430 +5460 +7D90 +103E +7C42 +10C4 +FF28 +0010 +AA20 +AA40 +0180 +ENDCHAR +STARTCHAR U+9EE0 +ENCODING 40672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +3520 +2FFC +2D20 +3F20 +04F8 +3F00 +06F8 +7888 +1A88 +2D88 +2DF8 +4088 +0000 +ENDCHAR +STARTCHAR U+9EE2 +ENCODING 40674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E20 +5440 +5488 +7DFC +5488 +5506 +7E82 +10F8 +7C88 +1188 +FE50 +0020 +AA50 +AA8E +0104 +ENDCHAR +STARTCHAR U+9EE4 +ENCODING 40676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7C40 +57FF +7C88 +7CA8 +5524 +55FC +7F26 +1125 +7DFC +1124 +1D24 +F1FC +0A20 +AA22 +A01E +ENDCHAR +STARTCHAR U+9EE5 +ENCODING 40677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0010 +3F10 +35FC +2F00 +2D78 +3F48 +0448 +3F78 +0610 +7858 +1A54 +2D94 +2D10 +4030 +0000 +ENDCHAR +STARTCHAR U+9EE6 +ENCODING 40678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7C10 +55FF +5D01 +7480 +5480 +7CEE +112A +10AA +38AA +106E +7C48 +0089 +5509 +540F +0000 +0000 +ENDCHAR +STARTCHAR U+9EE7 +ENCODING 40679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E44 +087E +FEA4 +1C24 +2A54 +4888 +1FF0 +1930 +1550 +1FF0 +0100 +3FF8 +0100 +FFFE +2448 +4444 +ENDCHAR +STARTCHAR U+9EE8 +ENCODING 40680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0920 +0540 +3FFC +27C8 +47C0 +1FF0 +1930 +1550 +1FF0 +3FF8 +0100 +7FFC +2488 +4244 +0000 +ENDCHAR +STARTCHAR U+9EE9 +ENCODING 40681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E28 +55FC +5420 +7C20 +57FE +5492 +7C54 +1110 +7C94 +13FE +FC20 +0020 +AA58 +AA86 +0102 +ENDCHAR +STARTCHAR U+9EEA +ENCODING 40682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0420 +7E40 +5488 +55FC +7C20 +5424 +57FE +7C50 +1098 +7D26 +10C8 +FE30 +00C4 +AA18 +AA60 +0180 +ENDCHAR +STARTCHAR U+9EEB +ENCODING 40683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4914 +6B14 +5D7F +7F55 +0855 +3E7F +0800 +0808 +7F08 +007F +5508 +5508 +557F +0000 +0000 +ENDCHAR +STARTCHAR U+9EEC +ENCODING 40684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +000A +7C09 +5408 +7CFF +7C88 +54E8 +5489 +7CE9 +10AB +7CAA +10AE +1EE4 +F085 +0A8D +AA97 +A122 +ENDCHAR +STARTCHAR U+9EED +ENCODING 40685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0008 +7F1C +4936 +6B63 +5B3E +5D00 +493E +7F22 +083E +7F00 +0814 +0F94 +F87F +0514 +54B4 +9064 +ENDCHAR +STARTCHAR U+9EEE +ENCODING 40686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +7C44 +55FF +7C44 +7C7C +5444 +547C +7C44 +1044 +7DFF +10A8 +1CA8 +F0AE +0AC0 +AA80 +A0FF +ENDCHAR +STARTCHAR U+9EEF +ENCODING 40687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3F20 +35FC +2F48 +2D30 +3FFC +0400 +3F78 +0648 +7878 +1A48 +2D48 +2D78 +4048 +0000 +ENDCHAR +STARTCHAR U+9EF0 +ENCODING 40688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0046 +7C7C +5441 +7C3F +7C00 +54BE +54A2 +7CBE +10A2 +7CBE +10A2 +1CBE +F080 +0AFF +AA24 +A0C3 +ENDCHAR +STARTCHAR U+9EF1 +ENCODING 40689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0124 +7A22 +4BFE +4888 +4FFF +6904 +5BFE +4D25 +49AC +6924 +59FC +4820 +49FC +4820 +CBFE +9A52 +ENDCHAR +STARTCHAR U+9EF2 +ENCODING 40690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C48 +5478 +7C84 +7D29 +55EF +5410 +7C28 +1044 +7D93 +1020 +1CC8 +F032 +0AC6 +AA1C +A0F0 +ENDCHAR +STARTCHAR U+9EF3 +ENCODING 40691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FBC +4825 +5F47 +647C +5F28 +4A10 +7FEF +1FFC +1494 +1FFC +0080 +1FFC +7FFF +4411 +0000 +0000 +ENDCHAR +STARTCHAR U+9EF4 +ENCODING 40692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1220 +1AA0 +2FA0 +5FE0 +1FBC +1BE8 +2EE8 +6FA8 +2F98 +2210 +3FD8 +2FA8 +2BC4 +3084 +0000 +ENDCHAR +STARTCHAR U+9EF5 +ENCODING 40693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +007C +7C88 +57FF +7D24 +7DC7 +553C +5500 +7DFF +1100 +7D3C +1100 +1D3C +F100 +0B7E +AA42 +A07E +ENDCHAR +STARTCHAR U+9EF6 +ENCODING 40694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FFC +1714 +177C +1F90 +2FB0 +4FC8 +0FE4 +0D60 +0FE0 +1FF0 +7FFC +2488 +4244 +0000 +ENDCHAR +STARTCHAR U+9EF7 +ENCODING 40695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0020 +3FFC +2A20 +2EF8 +3BFC +3F5C +09FC +3EF8 +0C88 +70F8 +1EF8 +2EF8 +28C8 +4304 +0000 +ENDCHAR +STARTCHAR U+9EF8 +ENCODING 40696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7C1E +5410 +7DFF +7D11 +557C +5511 +7D7F +1152 +7D7E +1152 +1D7E +F200 +0AFE +AAAA +A1FF +ENDCHAR +STARTCHAR U+9EF9 +ENCODING 40697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0280 +1290 +0AA0 +7FFC +1110 +1108 +3FF4 +5114 +1550 +1550 +1550 +1950 +1110 +1130 +0000 +ENDCHAR +STARTCHAR U+9EFA +ENCODING 40698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +141C +5524 +3624 +1442 +7F81 +2A00 +497E +7F12 +4912 +6B12 +6B12 +6B12 +4922 +4B4E +0000 +0000 +ENDCHAR +STARTCHAR U+9EFB +ENCODING 40699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1430 +5528 +3628 +7F20 +0AFC +2920 +7F28 +2A28 +3E68 +3E70 +3E90 +2B30 +2AC8 +2704 +0000 +ENDCHAR +STARTCHAR U+9EFC +ENCODING 40700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1428 +5524 +36FC +7F20 +0AF8 +29A8 +7FA8 +2AF8 +3EA8 +3EF8 +3EA8 +2AA8 +2AA8 +2698 +0000 +ENDCHAR +STARTCHAR U+9EFD +ENCODING 40701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +2288 +3EF8 +0280 +3EF8 +2288 +3EF8 +2288 +2288 +3EF8 +2288 +0204 +01FC +0000 +ENDCHAR +STARTCHAR U+9EFE +ENCODING 40702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +1FF8 +1010 +1FF0 +0108 +3FFC +2108 +2108 +3FF8 +2108 +2108 +3FF8 +2108 +0102 +0102 +00FE +ENDCHAR +STARTCHAR U+9EFF +ENCODING 40703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF8 +0000 +7FFE +0420 +1C33 +701E +0000 +3FFC +2244 +7E7E +4242 +7E7E +4242 +7E7E +0241 +03FF +ENDCHAR +STARTCHAR U+9F00 +ENCODING 40704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0FF8 +0080 +3FFE +0410 +0808 +7FFF +4221 +7E3F +3E3E +322A +2A26 +3E3F +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+9F01 +ENCODING 40705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0FF8 +0080 +3FFE +0410 +0FF8 +7FFF +4221 +7E3F +3E3E +322A +2A26 +3E3F +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+9F02 +ENCODING 40706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1FF8 +1008 +7FFE +0000 +3FFC +2244 +7E7E +4242 +7E7E +4242 +7E7E +0241 +03FF +ENDCHAR +STARTCHAR U+9F03 +ENCODING 40707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1FF0 +0100 +7FFC +0100 +1FF0 +0100 +FFFF +2244 +7E7E +4242 +7E7E +4242 +7E7E +0241 +03FF +ENDCHAR +STARTCHAR U+9F06 +ENCODING 40710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +4155 +3E55 +2277 +3E14 +2277 +3E55 +0877 +0855 +7F77 +0010 +1411 +2211 +411F +0000 +0000 +ENDCHAR +STARTCHAR U+9F07 +ENCODING 40711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +3E20 +7F7C +08C8 +7F30 +1E30 +26CC +5FF0 +1EF0 +3EF8 +3EF8 +2288 +3EFC +21FC +0000 +ENDCHAR +STARTCHAR U+9F08 +ENCODING 40712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +2A40 +497C +7FC8 +5D28 +6B30 +49CC +1FF0 +1EF0 +32F8 +2288 +3AF8 +3AF8 +2284 +01FC +0000 +ENDCHAR +STARTCHAR U+9F09 +ENCODING 40713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C78 +2448 +2448 +3FF8 +1110 +1FF0 +1110 +FFFF +2244 +7E7E +4242 +7E7E +4242 +7E7E +0241 +03FF +ENDCHAR +STARTCHAR U+9F0A +ENCODING 40714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3F08 +217F +3F14 +3FFF +517F +1F08 +1FFC +1224 +1E3C +3E3E +2222 +3E3E +3E3F +03FF +0000 +0000 +ENDCHAR +STARTCHAR U+9F0B +ENCODING 40715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FF0 +0004 +FFFE +0440 +783C +1FF0 +1010 +1FF0 +0108 +3FFC +2108 +3FF8 +2108 +3FFA +0102 +00FE +ENDCHAR +STARTCHAR U+9F0D +ENCODING 40717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3EF8 +2288 +3EF8 +1FF0 +1110 +1FF0 +1114 +FFFE +0100 +1FF0 +1110 +1FF0 +1110 +1FF4 +0104 +00FC +ENDCHAR +STARTCHAR U+9F0E +ENCODING 40718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07C0 +2448 +27C8 +27C8 +2448 +27C8 +3EF8 +0280 +7EFC +1290 +1290 +2290 +4290 +0000 +ENDCHAR +STARTCHAR U+9F0F +ENCODING 40719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +FFFF +8001 +8FF1 +2814 +2FF4 +2814 +2FF4 +2814 +2FF4 +2004 +3E7C +0240 +FE7E +2242 +6242 +C242 +ENDCHAR +STARTCHAR U+9F10 +ENCODING 40720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7FF0 +1010 +17D4 +145E +27C4 +2444 +57D4 +945C +17D0 +1010 +1EF0 +0280 +7EF8 +1288 +1288 +6288 +ENDCHAR +STARTCHAR U+9F11 +ENCODING 40721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +01F0 +0100 +2FF4 +2814 +2FF4 +2814 +2FF4 +2814 +2FF4 +2004 +3E7C +0240 +FE7E +3242 +6242 +ENDCHAR +STARTCHAR U+9F12 +ENCODING 40722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7FFE +01E0 +0E40 +38C0 +0FF0 +2814 +2FF4 +2814 +2FF4 +2814 +3FFC +0240 +FE7F +3244 +6244 +ENDCHAR +STARTCHAR U+9F13 +ENCODING 40723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +0820 +7FFC +0820 +3E20 +01F8 +3E88 +2288 +3E50 +2270 +1420 +1650 +1888 +6304 +0000 +ENDCHAR +STARTCHAR U+9F14 +ENCODING 40724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +FE1F +1010 +7C10 +00FE +7C42 +4446 +4464 +7C2C +0038 +4410 +6438 +2E6C +38C6 +E183 +ENDCHAR +STARTCHAR U+9F15 +ENCODING 40725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +7FFC +3E20 +1EF8 +1250 +1E70 +0F8C +73E0 +0640 +1980 +07E0 +799C +00C0 +0700 +0000 +ENDCHAR +STARTCHAR U+9F16 +ENCODING 40726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +3FF8 +1110 +FFFE +1010 +1010 +FEFE +1010 +7C10 +00FC +7C44 +446C +7C38 +2810 +2E38 +F8EE +ENDCHAR +STARTCHAR U+9F17 +ENCODING 40727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1248 +0A50 +1248 +0244 +3C3C +0820 +7E28 +09FC +FF20 +00F8 +3E88 +2288 +3E50 +1420 +7E50 +018E +ENDCHAR +STARTCHAR U+9F18 +ENCODING 40728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7FBE +3F08 +3E3E +2214 +3E08 +1414 +7F23 +1144 +1F7C +1FFC +1004 +1F7C +2144 +0000 +0000 +ENDCHAR +STARTCHAR U+9F19 +ENCODING 40729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7F10 +08FE +FF10 +227C +3E28 +1410 +7F6E +0200 +1FF0 +1110 +1FF0 +1214 +FFFE +0100 +0100 +ENDCHAR +STARTCHAR U+9F1A +ENCODING 40730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +FF88 +087F +7F08 +227E +3E22 +141C +FF63 +0FF8 +0800 +0FF0 +0800 +7FFE +1238 +11C0 +1E3C +ENDCHAR +STARTCHAR U+9F1B +ENCODING 40731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +FF88 +087F +7F08 +227E +3E22 +141C +FF63 +3220 +E63C +1C20 +3620 +EFFF +0810 +0810 +0FF0 +ENDCHAR +STARTCHAR U+9F1C +ENCODING 40732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7FBE +3F08 +3E3E +3E14 +141C +7F23 +0FF8 +0630 +3EBE +07F0 +0490 +07F4 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+9F1E +ENCODING 40734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +7F3E +3E08 +223E +3E14 +1408 +7FB7 +0490 +3FFE +27F2 +07F0 +0080 +1FFC +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+9F1F +ENCODING 40735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +FF88 +087F +7F08 +227E +3E22 +141C +FF63 +13D0 +0E74 +3BDC +EFF7 +0810 +0FF0 +0240 +3FFC +ENDCHAR +STARTCHAR U+9F20 +ENCODING 40736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0300 +1CF0 +1010 +1EF0 +1010 +1FF0 +0000 +1550 +1330 +1990 +1554 +154C +198C +6604 +0000 +ENDCHAR +STARTCHAR U+9F21 +ENCODING 40737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0210 +1110 +0920 +0840 +1FF0 +1110 +1110 +1FF0 +1110 +1110 +1FF4 +210C +210C +4104 +0000 +ENDCHAR +STARTCHAR U+9F22 +ENCODING 40738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1210 +6F50 +4250 +6E50 +4288 +7E88 +0106 +54F8 +7C48 +5448 +7C48 +5448 +5448 +7D88 +52A8 +0110 +ENDCHAR +STARTCHAR U+9F23 +ENCODING 40739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +670A +4109 +7708 +417F +7F08 +0008 +6D08 +5B08 +6D14 +5B22 +4941 +4900 +6CFF +0000 +0000 +ENDCHAR +STARTCHAR U+9F24 +ENCODING 40740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +6710 +417E +7704 +4104 +7F24 +0024 +6D24 +5B18 +6D18 +5B24 +49C3 +4900 +6CFF +0000 +0000 +ENDCHAR +STARTCHAR U+9F25 +ENCODING 40741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +200A +2709 +417F +7710 +4120 +7FC2 +0002 +4922 +6D22 +5B14 +6D08 +5B54 +4962 +6CC1 +0000 +0000 +ENDCHAR +STARTCHAR U+9F26 +ENCODING 40742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +307E +6712 +4112 +7732 +4122 +7F66 +0000 +493E +6D22 +5B22 +4922 +6D22 +5B3E +4981 +6EC3 +D87E +ENDCHAR +STARTCHAR U+9F28 +ENCODING 40744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +273E +4122 +7722 +4154 +7F08 +0014 +4922 +6D49 +5B04 +6D10 +5B09 +4901 +6CFF +0000 +0000 +ENDCHAR +STARTCHAR U+9F29 +ENCODING 40745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2720 +413F +7721 +4141 +7F3D +0025 +493D +6D01 +5B0A +6D04 +5B01 +4901 +6CFF +0000 +0000 +ENDCHAR +STARTCHAR U+9F2A +ENCODING 40746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3008 +6748 +4148 +777F +41C8 +7F88 +0008 +493E +6D08 +5B08 +4908 +6D7F +5B00 +4981 +6EC3 +D87E +ENDCHAR +STARTCHAR U+9F2B +ENCODING 40747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3000 +677F +4110 +7710 +4130 +7F20 +003E +4962 +6DE2 +5BA2 +4922 +6D22 +5B3E +4981 +6EC3 +D87E +ENDCHAR +STARTCHAR U+9F2C +ENCODING 40748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0820 +3620 +2220 +36F8 +22A8 +3EA8 +2AF8 +2AA8 +3EA8 +2AF8 +3D88 +2904 +3EC4 +483C +0000 +ENDCHAR +STARTCHAR U+9F2D +ENCODING 40749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2010 +46FF +4210 +7610 +427E +7E04 +00FF +4A04 +7E44 +4A24 +7E04 +4A54 +6DC8 +0000 +0000 +ENDCHAR +STARTCHAR U+9F2E +ENCODING 40750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +2701 +411E +7764 +4124 +7F3F +0024 +4944 +6D24 +5B3F +6D20 +5B5F +4980 +6CFF +0000 +0000 +ENDCHAR +STARTCHAR U+9F2F +ENCODING 40751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1208 +6FFC +4240 +6E48 +42FC +7E48 +0048 +55FE +7C00 +54FC +7C84 +5484 +5484 +7D84 +52FC +0084 +ENDCHAR +STARTCHAR U+9F30 +ENCODING 40752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107C +2744 +4144 +777C +4144 +7F44 +007C +4944 +6D44 +5B7C +6D29 +5B45 +4901 +6CFF +0000 +0000 +ENDCHAR +STARTCHAR U+9F31 +ENCODING 40753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +6010 +CEFE +8210 +EE7C +8210 +FFFF +0000 +927C +DA54 +B654 +9254 +DA7C +B644 +9244 +B644 +DB4C +ENDCHAR +STARTCHAR U+9F32 +ENCODING 40754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +61FF +CF01 +8311 +EEFE +8210 +FEFE +0092 +9292 +DAFE +B692 +9292 +DAFE +B610 +93FF +B610 +DB10 +ENDCHAR +STARTCHAR U+9F33 +ENCODING 40755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +107E +2042 +477E +4142 +777E +4142 +7F7E +4908 +490A +6D7F +5B08 +6D54 +5B62 +6CC1 +0000 +0000 +ENDCHAR +STARTCHAR U+9F34 +ENCODING 40756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +60FF +CE80 +82BE +EEA2 +82BE +FEA2 +00BE +9290 +DAFF +B6A2 +929C +DAA2 +B6FF +9301 +DD83 +B0FE +ENDCHAR +STARTCHAR U+9F35 +ENCODING 40757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +2010 +4EFF +42A9 +6EC5 +4210 +7E14 +4A12 +4A7E +6E10 +5A10 +6E28 +5B44 +6D82 +0000 +0000 +ENDCHAR +STARTCHAR U+9F36 +ENCODING 40758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20FE +4E88 +428E +6E88 +42BF +7EA9 +00BE +4AA8 +6AAE +5EA0 +6ABC +5F54 +4A15 +6DA7 +0000 +0000 +ENDCHAR +STARTCHAR U+9F37 +ENCODING 40759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +121C +6FE0 +42A4 +6EA8 +4250 +7E84 +01F8 +5420 +7C48 +55FC +7C20 +57FE +5420 +7D50 +524E +0184 +ENDCHAR +STARTCHAR U+9F38 +ENCODING 40760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2048 +47FF +4248 +76FE +424A +43FF +7E4A +54FE +5448 +7CCC +554A +7C49 +5201 +79FF +0000 +0000 +ENDCHAR +STARTCHAR U+9F39 +ENCODING 40761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1204 +6FFE +4284 +6EFC +4284 +7EFC +0020 +55FE +7D22 +5624 +7FFE +5448 +5488 +7E70 +5258 +0184 +ENDCHAR +STARTCHAR U+9F3A +ENCODING 40762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3000 +673E +412A +772A +413E +7F2A +002A +493E +6D00 +5B77 +4955 +6D55 +5B77 +4955 +5B55 +EDF7 +ENDCHAR +STARTCHAR U+9F3B +ENCODING 40763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0FE0 +0820 +0FE0 +0FE0 +0FE0 +1FF0 +1110 +1FF0 +1FF0 +0440 +7FFC +0440 +1840 +0000 +ENDCHAR +STARTCHAR U+9F3C +ENCODING 40764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0802 +3E02 +2222 +3E22 +2222 +3E22 +2222 +7F22 +4922 +7F2E +493A +7F62 +0002 +FF82 +2202 +4202 +ENDCHAR +STARTCHAR U+9F3D +ENCODING 40765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1040 +3E40 +3240 +2A48 +3EFC +0048 +7F48 +4948 +7F48 +4948 +7F48 +0048 +FF4A +228A +2286 +4300 +ENDCHAR +STARTCHAR U+9F3E +ENCODING 40766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +1EF8 +1220 +1E20 +1E20 +1E20 +3FFC +3F20 +2520 +3F20 +7FA0 +1220 +1220 +2220 +0000 +ENDCHAR +STARTCHAR U+9F3F +ENCODING 40767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +3E7F +2214 +3E14 +2214 +3E14 +2214 +7F14 +4934 +7F24 +4924 +7F24 +0024 +FFA4 +2265 +42C3 +ENDCHAR +STARTCHAR U+9F40 +ENCODING 40768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1F7E +3120 +5F20 +1F3C +1124 +1F34 +3FAC +3EA4 +24A4 +3FAD +0A35 +7FE5 +1207 +0000 +0000 +ENDCHAR +STARTCHAR U+9F41 +ENCODING 40769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +3E20 +223F +3E61 +2241 +3EFD +2225 +7F25 +4925 +7F25 +493D +7F01 +0001 +FF83 +2202 +420E +ENDCHAR +STARTCHAR U+9F42 +ENCODING 40770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2010 +7E7E +3A12 +3AFF +3E12 +7F7E +4910 +7F12 +49F4 +7F38 +2454 +7F92 +2411 +2430 +0000 +0000 +ENDCHAR +STARTCHAR U+9F43 +ENCODING 40771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087E +3E42 +2242 +3E7E +2242 +3E42 +227E +7F20 +497F +7FC9 +4949 +7F55 +0063 +FF7D +2203 +4206 +ENDCHAR +STARTCHAR U+9F44 +ENCODING 40772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +3E14 +32FE +2A10 +3E38 +0056 +7F90 +497C +7F44 +497C +7F44 +007C +FF44 +2200 +22FE +4200 +ENDCHAR +STARTCHAR U+9F45 +ENCODING 40773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +3E7C +2244 +3E7C +2244 +3E7C +2244 +7F7C +4914 +7F12 +49FF +7F10 +0038 +FFAC +2266 +42C3 +ENDCHAR +STARTCHAR U+9F46 +ENCODING 40774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0849 +3E92 +2324 +3E92 +2249 +3E7E +2242 +7F7E +4900 +7F7F +4949 +7F49 +007F +FFC0 +2241 +423F +ENDCHAR +STARTCHAR U+9F47 +ENCODING 40775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +3E0F +2208 +3E7F +2249 +3E5E +2249 +7F4F +4940 +7F5E +4952 +7F5E +0052 +FFDE +2252 +42BF +ENDCHAR +STARTCHAR U+9F48 +ENCODING 40776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C28 +65FF +3D29 +25FF +3D29 +25FF +7FFF +5300 +7FFF +5300 +7FFF +254A +7F44 +446A +0000 +0000 +ENDCHAR +STARTCHAR U+9F49 +ENCODING 40777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3C10 +65FF +3CFE +2492 +3CFE +25FF +7FEF +52AA +7EEE +52FE +7E28 +25FF +7ECA +2567 +0000 +0000 +ENDCHAR +STARTCHAR U+9F4A +ENCODING 40778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0288 +7D70 +1550 +1550 +2DE8 +4824 +0FE0 +0820 +0FE0 +0820 +1020 +2020 +0000 +ENDCHAR +STARTCHAR U+9F4B +ENCODING 40779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +0298 +7D70 +1550 +1550 +2DE8 +5014 +1FF0 +1010 +1FF0 +1550 +2530 +4910 +0000 +ENDCHAR +STARTCHAR U+9F4C +ENCODING 40780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +3E3E +1558 +2494 +589A +1004 +1FFC +1004 +1FFC +12A4 +11C4 +2144 +4634 +0000 +0000 +ENDCHAR +STARTCHAR U+9F4D +ENCODING 40781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0142 +1EBC +12A4 +2CB2 +1004 +13E4 +17F4 +1004 +17F4 +1554 +17F4 +2004 +0000 +0000 +ENDCHAR +STARTCHAR U+9F4E +ENCODING 40782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +3EF8 +1550 +1D78 +3FF4 +5FF0 +17D0 +1450 +17D0 +17D0 +17D0 +2290 +4C50 +0000 +ENDCHAR +STARTCHAR U+9F4F +ENCODING 40783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +7FFC +3EF8 +1550 +2D68 +5114 +1FF0 +1FF0 +1290 +16D0 +16D0 +16D0 +2FF0 +4010 +0000 +ENDCHAR +STARTCHAR U+9F50 +ENCODING 40784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0108 +7FFC +0820 +0440 +0280 +0100 +06C0 +1830 +202E +C824 +0820 +0820 +0820 +1020 +2020 +ENDCHAR +STARTCHAR U+9F51 +ENCODING 40785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +FFFE +1830 +06C0 +0100 +0EE0 +F29E +2EE8 +2288 +2EE8 +2288 +2EE8 +2288 +3FF8 +2008 +4008 +ENDCHAR +STARTCHAR U+9F52 +ENCODING 40786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0900 +09F0 +0900 +7FFC +2448 +2AA8 +3328 +3FF8 +2448 +2AA8 +3328 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+9F53 +ENCODING 40787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +2F20 +2820 +2820 +FFA0 +5520 +5520 +6B20 +4120 +7F20 +5520 +5520 +6B21 +4133 +7F1E +ENDCHAR +STARTCHAR U+9F54 +ENCODING 40788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +1420 +17A0 +1420 +7FE4 +2AA4 +2AA8 +35B0 +3FA0 +2AA0 +2AA0 +35A4 +3FA4 +209C +0000 +ENDCHAR +STARTCHAR U+9F55 +ENCODING 40789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +2F20 +287F +2840 +FFC0 +553F +5506 +6B0C +4118 +7F30 +5560 +5540 +6B41 +4163 +7F3E +ENDCHAR +STARTCHAR U+9F56 +ENCODING 40790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +2F22 +2822 +2822 +FFA2 +5522 +55FF +6B0A +410A +7F1A +5512 +5532 +6B22 +4162 +7F06 +ENDCHAR +STARTCHAR U+9F57 +ENCODING 40791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0806 +080C +2F38 +2820 +2820 +FFBF +5524 +5524 +6B24 +4124 +7F24 +5564 +5544 +6BC4 +4104 +7F04 +ENDCHAR +STARTCHAR U+9F58 +ENCODING 40792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1038 +5E28 +506C +50C6 +FFC7 +AA44 +AA44 +D644 +8244 +FE44 +AAC4 +AA84 +D684 +8384 +FF04 +ENDCHAR +STARTCHAR U+9F59 +ENCODING 40793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +2F3F +2821 +7F41 +003D +5525 +5525 +6B3D +4121 +7F21 +5526 +5520 +6B21 +7F1F +0000 +0000 +ENDCHAR +STARTCHAR U+9F5A +ENCODING 40794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +2F10 +283F +2868 +FFC8 +5508 +550F +6B08 +4108 +7F08 +550F +5508 +6B08 +4108 +7F08 +ENDCHAR +STARTCHAR U+9F5B +ENCODING 40795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +2E2A +282A +7F2A +007F +552A +552A +6B2A +412A +7F2A +552E +5520 +6B20 +7F3F +0000 +0000 +ENDCHAR +STARTCHAR U+9F5C +ENCODING 40796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1048 +5048 +5C48 +5048 +FE7E +1048 +AC48 +C548 +FD4A +854A +954A +AD4A +FD7A +878E +0000 +0000 +ENDCHAR +STARTCHAR U+9F5D +ENCODING 40797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +2F30 +2820 +2822 +FF62 +554F +55F9 +6B00 +417E +7F42 +5542 +5542 +6B42 +4142 +7F7E +ENDCHAR +STARTCHAR U+9F5E +ENCODING 40798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +087F +2F41 +2841 +2841 +FFC1 +5541 +5541 +6B7F +4100 +7F00 +5514 +5514 +6B36 +4122 +7F63 +ENDCHAR +STARTCHAR U+9F5F +ENCODING 40799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +1478 +1748 +1448 +7FC8 +2B78 +2B48 +3548 +3F78 +2B48 +2B48 +3548 +3FFC +2100 +0000 +ENDCHAR +STARTCHAR U+9F60 +ENCODING 40800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +14F8 +1728 +1428 +7FA8 +2B48 +2BB0 +3500 +3F78 +2B48 +2B48 +3548 +3F78 +2148 +0000 +ENDCHAR +STARTCHAR U+9F61 +ENCODING 40801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0420 +1420 +1750 +1450 +7F88 +2B74 +2B00 +35F8 +3F28 +2B28 +2B30 +3520 +3F20 +2120 +0000 +ENDCHAR +STARTCHAR U+9F62 +ENCODING 40802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0410 +1410 +17A8 +1428 +7FC4 +24FC +3580 +2EFC +3F94 +2E94 +3598 +2490 +3F90 +2090 +0000 +ENDCHAR +STARTCHAR U+9F63 +ENCODING 40803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +1440 +1740 +1478 +7F88 +2BE8 +2BA8 +35A8 +3FE8 +2BA8 +2B08 +3508 +3F08 +2130 +0000 +ENDCHAR +STARTCHAR U+9F64 +ENCODING 40804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0888 +0490 +1FFC +3FFE +0490 +08E8 +1484 +2FFA +4221 +1554 +1FFC +1224 +1554 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+9F65 +ENCODING 40805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +2F08 +287F +7F49 +007F +5549 +5549 +6B7F +4108 +7F09 +550A +550D +6B19 +7F67 +0000 +0000 +ENDCHAR +STARTCHAR U+9F66 +ENCODING 40806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +1478 +1748 +1448 +7FF8 +2B48 +2B48 +3578 +3F64 +2B68 +2B50 +3550 +3F68 +2184 +0000 +ENDCHAR +STARTCHAR U+9F67 +ENCODING 40807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0800 +7FF8 +3E48 +0E88 +7930 +09F0 +7FFC +2648 +29A8 +3FF8 +2648 +29A8 +3FF8 +2008 +0000 +ENDCHAR +STARTCHAR U+9F68 +ENCODING 40808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0810 +2F30 +2867 +2841 +FFC1 +5541 +5541 +6B77 +4141 +7F41 +5541 +5541 +6B41 +417F +7F00 +ENDCHAR +STARTCHAR U+9F69 +ENCODING 40809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +2F08 +287F +2814 +FFB6 +5563 +5500 +6B22 +4122 +7F36 +551C +5508 +6B1C +4136 +7F63 +ENDCHAR +STARTCHAR U+9F6A +ENCODING 40810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +1478 +1748 +1448 +7FC8 +2B78 +2B10 +3550 +3F5C +2B50 +2B50 +3570 +3F90 +210C +0000 +ENDCHAR +STARTCHAR U+9F6B +ENCODING 40811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +2F41 +2849 +7F49 +007F +5549 +5549 +6B5D +415D +7F6B +5549 +5549 +6B49 +7F7F +0000 +0000 +ENDCHAR +STARTCHAR U+9F6C +ENCODING 40812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +14FC +1720 +1420 +7FF8 +2B48 +2B48 +35FC +3F00 +2B78 +2B48 +3548 +3F78 +2148 +0000 +ENDCHAR +STARTCHAR U+9F6D +ENCODING 40813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1066 +10CC +5E88 +5088 +50E8 +FFAF +AAAA +AAAA +D6EA +828A +FE8A +AA9A +AB92 +D712 +8312 +FF02 +ENDCHAR +STARTCHAR U+9F6E +ENCODING 40814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +2F7F +2814 +2836 +FFE3 +5500 +557F +6B02 +413A +7F2A +552A +552A +6B3A +4102 +7F06 +ENDCHAR +STARTCHAR U+9F6F +ENCODING 40815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0830 +0863 +2F41 +2841 +2877 +FFC1 +5541 +5541 +6B7F +4114 +7F14 +5514 +5534 +6B24 +4125 +7F63 +ENDCHAR +STARTCHAR U+9F70 +ENCODING 40816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0824 +0824 +2EFF +2824 +2824 +FF24 +55FF +5500 +6B00 +417E +7F42 +5542 +557E +6B42 +4142 +7F7E +ENDCHAR +STARTCHAR U+9F71 +ENCODING 40817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +5EA0 +50A0 +50BF +FEE9 +AAA9 +AAAB +D6AA +82EE +FEA4 +AAA4 +AAAE +D6EA +83B3 +FE21 +ENDCHAR +STARTCHAR U+9F72 +ENCODING 40818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0418 +14E0 +1720 +14F8 +7FA8 +2BA8 +2BF8 +3520 +3FFC +2BD4 +2BFC +3584 +3F84 +218C +0000 +ENDCHAR +STARTCHAR U+9F73 +ENCODING 40819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +0841 +2F49 +283E +2808 +FFFF +5549 +5549 +6B7F +4149 +7F49 +557F +5508 +6B7F +4108 +7F08 +ENDCHAR +STARTCHAR U+9F74 +ENCODING 40820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +2E3F +2812 +7F0C +007F +5544 +5544 +6B48 +4152 +7F44 +5549 +5592 +6B04 +7F18 +0000 +0000 +ENDCHAR +STARTCHAR U+9F75 +ENCODING 40821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +087F +0849 +2F49 +287F +2849 +FFC9 +557F +5508 +6B08 +417F +7F49 +554B +554F +6B7B +4141 +7F43 +ENDCHAR +STARTCHAR U+9F76 +ENCODING 40822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +14FC +17B4 +14FC +7F00 +2B78 +2B00 +35FC +3F20 +2B38 +2B48 +3508 +3F08 +2130 +0000 +ENDCHAR +STARTCHAR U+9F77 +ENCODING 40823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0400 +1478 +1748 +1478 +7FC0 +2B7C +2B58 +3554 +3F7C +2B50 +2B7C +3590 +3FFC +2100 +0000 +ENDCHAR +STARTCHAR U+9F78 +ENCODING 40824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0841 +2E22 +287F +7F14 +0022 +5541 +6B00 +417F +7F55 +4155 +5555 +6B55 +4155 +7FFF +0000 +0000 +ENDCHAR +STARTCHAR U+9F79 +ENCODING 40825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +1FFC +0FF8 +3FFE +0BF8 +1040 +2FFE +04F8 +3FFE +1554 +1FFC +1224 +1554 +1FFC +0000 +0000 +ENDCHAR +STARTCHAR U+9F7A +ENCODING 40826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +087F +2E91 +2855 +2855 +FF7D +5523 +5546 +6B20 +417F +7F91 +5555 +5555 +6B7D +4123 +7F46 +ENDCHAR +STARTCHAR U+9F7B +ENCODING 40827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +2E7F +2808 +7F3E +0022 +553E +5522 +6B3E +4122 +7F3E +5522 +55FF +6B22 +7F41 +0000 +0000 +ENDCHAR +STARTCHAR U+9F7D +ENCODING 40829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1044 +1044 +5DFF +5044 +50EE +FF55 +AA44 +AA00 +D6FE +8200 +FFFF +AA10 +AA54 +D6D6 +8393 +FE30 +ENDCHAR +STARTCHAR U+9F7E +ENCODING 40830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +078A +3FC9 +247F +2F08 +3FC8 +3554 +3FE2 +3241 +54F8 +3FFE +1554 +1FFC +1224 +1554 +0000 +0000 +ENDCHAR +STARTCHAR U+9F7F +ENCODING 40831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +1120 +11F0 +1100 +1100 +1104 +FFFE +0000 +2108 +2108 +2288 +2468 +2828 +2008 +3FF8 +2008 +ENDCHAR +STARTCHAR U+9F80 +ENCODING 40832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +2A40 +2F40 +2840 +2944 +FFCC +0050 +4960 +4940 +4940 +5540 +6342 +4142 +7F3E +0100 +ENDCHAR +STARTCHAR U+9F83 +ENCODING 40835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0804 +2A7E +2F44 +2844 +2944 +FFFC +0044 +4944 +4944 +497C +5544 +6344 +4144 +7FFE +0100 +ENDCHAR +STARTCHAR U+9F84 +ENCODING 40836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +2820 +2850 +2F50 +2888 +294E +FF24 +0020 +4900 +49FC +4904 +5508 +6350 +4120 +7F10 +4110 +ENDCHAR +STARTCHAR U+9F85 +ENCODING 40837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +1080 +5084 +5DFE +5204 +5024 +FFF4 +0124 +5524 +55E4 +5514 +6D08 +4502 +4502 +7CFE +0400 +ENDCHAR +STARTCHAR U+9F86 +ENCODING 40838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +5044 +5C44 +5044 +5444 +FE94 +0108 +5400 +54FC +5484 +6C84 +4484 +4484 +7CFC +0484 +ENDCHAR +STARTCHAR U+9F87 +ENCODING 40839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1050 +1050 +5050 +5D50 +5152 +5574 +FF58 +0150 +5550 +5550 +5550 +6D50 +4550 +4572 +7F92 +040E +ENDCHAR +STARTCHAR U+9F88 +ENCODING 40840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +5108 +5D08 +51F8 +5508 +FF08 +01F8 +5544 +5548 +5530 +6D20 +4510 +454E +7D84 +0500 +ENDCHAR +STARTCHAR U+9F89 +ENCODING 40841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +11FC +5020 +5C28 +51FC +5448 +FE48 +0048 +57FE +5404 +54FE +6C84 +4484 +4484 +7CFC +0484 +ENDCHAR +STARTCHAR U+9F8A +ENCODING 40842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1008 +10FC +5088 +5C88 +5088 +5488 +FEF8 +00A0 +5428 +54BC +54A0 +6CA0 +44A0 +4566 +7E3C +0400 +ENDCHAR +STARTCHAR U+9F8B +ENCODING 40843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +100C +13F0 +1024 +5DFE +5124 +5124 +FDFC +0020 +55FC +5524 +5524 +6D54 +4574 +7D04 +4514 +0108 +ENDCHAR +STARTCHAR U+9F8C +ENCODING 40844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +11FE +5104 +5D04 +51FC +5500 +FFFE +0120 +5548 +55FC +5510 +6D7C +4510 +4514 +7EFE +0400 +ENDCHAR +STARTCHAR U+9F8D +ENCODING 40845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0880 +08F8 +7F80 +22F8 +1408 +7FF8 +0080 +3EF8 +2280 +3EF8 +2280 +3EF8 +2284 +267C +0000 +ENDCHAR +STARTCHAR U+9F8F +ENCODING 40847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3F +2220 +FFBE +2202 +3E3E +2220 +3E3C +2221 +261F +0410 +0410 +7FFF +0410 +0C10 +3810 +ENDCHAR +STARTCHAR U+9F90 +ENCODING 40848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2220 +2FBE +2920 +253E +3FC2 +203E +2FA0 +28BE +2FA0 +28BE +2FA0 +48BE +48A1 +49BF +ENDCHAR +STARTCHAR U+9F91 +ENCODING 40849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3F +2220 +FFBE +2202 +3E3E +2220 +3E3C +2221 +261F +1FFC +0080 +7FFF +0220 +0E38 +380E +ENDCHAR +STARTCHAR U+9F92 +ENCODING 40850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3F +2220 +FFBE +2202 +3E3E +2220 +3E3C +2221 +261F +0FF8 +0000 +7FFF +0080 +0C98 +398E +ENDCHAR +STARTCHAR U+9F94 +ENCODING 40852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +7F3F +2220 +FFBE +2202 +3E3E +2220 +3E3C +2221 +261F +0420 +1FF8 +0420 +7FFE +0C30 +300C +ENDCHAR +STARTCHAR U+9F95 +ENCODING 40853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0FE0 +7FFC +0820 +0FE0 +3FF8 +12F0 +7F10 +1EF0 +1EF0 +1EF0 +12F4 +167C +0000 +ENDCHAR +STARTCHAR U+9F96 +ENCODING 40854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2424 +2424 +FFFF +5454 +5757 +F9F9 +0707 +7474 +5757 +5454 +7777 +5454 +5757 +7474 +5555 +5353 +ENDCHAR +STARTCHAR U+9F97 +ENCODING 40855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +4081 +5EBD +0000 +39CE +0820 +7F3F +2220 +FF9E +2220 +3E3E +223E +3E21 +221F +ENDCHAR +STARTCHAR U+9F98 +ENCODING 40856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0878 +3F7C +1404 +7F7C +3E78 +3E7A +2242 +267E +1727 +7C7C +5757 +7FFF +7474 +7575 +0000 +0000 +ENDCHAR +STARTCHAR U+9F99 +ENCODING 40857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +0240 +0220 +0204 +FFFE +0280 +0288 +0488 +0490 +04A0 +08C0 +0882 +1182 +1682 +207E +4000 +ENDCHAR +STARTCHAR U+9F9A +ENCODING 40858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0214 +FFFE +0500 +0564 +0984 +32FC +C820 +0820 +3FF8 +0820 +0824 +FFFE +0820 +1818 +2008 +ENDCHAR +STARTCHAR U+9F9B +ENCODING 40859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0100 +0280 +0C60 +3FF8 +C006 +1FF0 +1010 +1FF0 +0224 +FFFE +0280 +04A0 +04C0 +0984 +1284 +607C +ENDCHAR +STARTCHAR U+9F9C +ENCODING 40860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0200 +07C0 +1900 +7FF0 +1290 +1EF0 +3A80 +7EF8 +3AD8 +3AA8 +7ED8 +0AFC +3A84 +01FC +0000 +ENDCHAR +STARTCHAR U+9F9D +ENCODING 40861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0440 +09F0 +7620 +13F8 +12A8 +7FB8 +13A0 +3FBC +37BC +54AC +53B4 +17BC +1384 +107C +0000 +ENDCHAR +STARTCHAR U+9F9E +ENCODING 40862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4910 +FF9F +88B2 +AA8A +AA8C +0FF3 +1820 +FFFC +2284 +7EFC +1280 +FFFE +129A +FFFE +1281 +73FF +ENDCHAR +STARTCHAR U+9F9F +ENCODING 40863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +1FE0 +1040 +2088 +7FFC +A108 +2108 +3FF8 +2108 +2108 +3FF8 +210A +0102 +0102 +00FE +ENDCHAR +STARTCHAR U+9FA0 +ENCODING 40864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0100 +0280 +0440 +1FF0 +600C +3BB8 +2AA8 +3BB8 +0000 +1FF0 +1290 +1FF0 +1290 +12B0 +0000 +ENDCHAR +STARTCHAR U+9FA1 +ENCODING 40865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C10 +3610 +631F +DDB1 +002B +FFEA +9488 +FF88 +0008 +7F1C +5514 +7F14 +5536 +5522 +5563 +ENDCHAR +STARTCHAR U+9FA2 +ENCODING 40866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +1C0F +3678 +6308 +DD88 +007F +FF88 +949C +FF9C +002A +7F2A +552B +7F69 +5549 +5549 +5508 +ENDCHAR +STARTCHAR U+9FA3 +ENCODING 40867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1C1F +3631 +6323 +DDBE +0004 +FFFF +9488 +FFC9 +006B +7F2A +551C +7F2E +556B +55C9 +5518 +ENDCHAR +STARTCHAR U+9FA4 +ENCODING 40868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0844 +1444 +2277 +5D44 +0044 +7F77 +5510 +7F7F +0041 +7F41 +557F +7F41 +5541 +437F +0000 +0000 +ENDCHAR +STARTCHAR U+9FA5 +ENCODING 40869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +1C7F +3608 +633E +DDA2 +0022 +FFBE +94A2 +FFA2 +003E +7F22 +5522 +7F3E +5514 +5536 +5563 +ENDCHAR +STARTCHAR U+AC00 +ENCODING 44032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AC01 +ENCODING 44033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AC02 +ENCODING 44034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AC03 +ENCODING 44035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AC04 +ENCODING 44036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AC05 +ENCODING 44037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AC06 +ENCODING 44038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AC07 +ENCODING 44039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AC08 +ENCODING 44040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AC09 +ENCODING 44041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AC0A +ENCODING 44042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AC0B +ENCODING 44043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AC0C +ENCODING 44044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AC0D +ENCODING 44045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AC0E +ENCODING 44046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AC0F +ENCODING 44047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AC10 +ENCODING 44048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AC11 +ENCODING 44049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AC12 +ENCODING 44050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AC13 +ENCODING 44051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC14 +ENCODING 44052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AC15 +ENCODING 44053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AC16 +ENCODING 44054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC17 +ENCODING 44055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC18 +ENCODING 44056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AC19 +ENCODING 44057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AC1A +ENCODING 44058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AC1B +ENCODING 44059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +031F +0618 +0C18 +3018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AC1C +ENCODING 44060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3FB6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AC1D +ENCODING 44061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AC1E +ENCODING 44062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+AC1F +ENCODING 44063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+AC20 +ENCODING 44064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AC21 +ENCODING 44065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+AC22 +ENCODING 44066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+AC23 +ENCODING 44067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AC24 +ENCODING 44068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AC25 +ENCODING 44069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+AC26 +ENCODING 44070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AC27 +ENCODING 44071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AC28 +ENCODING 44072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+AC29 +ENCODING 44073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+AC2A +ENCODING 44074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AC2B +ENCODING 44075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AC2C +ENCODING 44076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AC2D +ENCODING 44077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AC2E +ENCODING 44078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AC2F +ENCODING 44079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+AC30 +ENCODING 44080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AC31 +ENCODING 44081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+AC32 +ENCODING 44082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AC33 +ENCODING 44083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AC34 +ENCODING 44084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AC35 +ENCODING 44085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+AC36 +ENCODING 44086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+AC37 +ENCODING 44087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +033E +0636 +0C36 +3036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AC38 +ENCODING 44088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +3F98 +0198 +019F +0318 +0618 +0C1F +3018 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AC39 +ENCODING 44089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AC3A +ENCODING 44090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AC3B +ENCODING 44091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AC3C +ENCODING 44092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AC3D +ENCODING 44093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AC3E +ENCODING 44094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AC3F +ENCODING 44095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AC40 +ENCODING 44096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AC41 +ENCODING 44097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AC42 +ENCODING 44098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AC43 +ENCODING 44099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AC44 +ENCODING 44100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AC45 +ENCODING 44101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AC46 +ENCODING 44102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AC47 +ENCODING 44103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AC48 +ENCODING 44104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AC49 +ENCODING 44105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AC4A +ENCODING 44106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AC4B +ENCODING 44107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC4C +ENCODING 44108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AC4D +ENCODING 44109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AC4E +ENCODING 44110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC4F +ENCODING 44111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC50 +ENCODING 44112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AC51 +ENCODING 44113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AC52 +ENCODING 44114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AC53 +ENCODING 44115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +0318 +061F +0C18 +3018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AC54 +ENCODING 44116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3FB6 +01B6 +01BE +0336 +0636 +0C3E +3036 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AC55 +ENCODING 44117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AC56 +ENCODING 44118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+AC57 +ENCODING 44119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+AC58 +ENCODING 44120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AC59 +ENCODING 44121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+AC5A +ENCODING 44122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+AC5B +ENCODING 44123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AC5C +ENCODING 44124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AC5D +ENCODING 44125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+AC5E +ENCODING 44126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AC5F +ENCODING 44127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AC60 +ENCODING 44128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+AC61 +ENCODING 44129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+AC62 +ENCODING 44130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AC63 +ENCODING 44131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AC64 +ENCODING 44132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AC65 +ENCODING 44133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AC66 +ENCODING 44134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AC67 +ENCODING 44135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+AC68 +ENCODING 44136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AC69 +ENCODING 44137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+AC6A +ENCODING 44138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AC6B +ENCODING 44139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AC6C +ENCODING 44140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AC6D +ENCODING 44141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+AC6E +ENCODING 44142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+AC6F +ENCODING 44143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +0336 +063E +0C36 +3036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AC70 +ENCODING 44144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +3F8C +018C +018C +037C +060C +0C0C +300C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AC71 +ENCODING 44145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AC72 +ENCODING 44146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+AC73 +ENCODING 44147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+AC74 +ENCODING 44148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +037C +060C +0C0C +300C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AC75 +ENCODING 44149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+AC76 +ENCODING 44150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+AC77 +ENCODING 44151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AC78 +ENCODING 44152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+AC79 +ENCODING 44153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+AC7A +ENCODING 44154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AC7B +ENCODING 44155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AC7C +ENCODING 44156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AC7D +ENCODING 44157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AC7E +ENCODING 44158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AC7F +ENCODING 44159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AC80 +ENCODING 44160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AC81 +ENCODING 44161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AC82 +ENCODING 44162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AC83 +ENCODING 44163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC84 +ENCODING 44164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AC85 +ENCODING 44165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AC86 +ENCODING 44166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC87 +ENCODING 44167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AC88 +ENCODING 44168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AC89 +ENCODING 44169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AC8A +ENCODING 44170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AC8B +ENCODING 44171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +03FC +060C +0C0C +300C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AC8C +ENCODING 44172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3FB6 +01B6 +01B6 +0376 +0636 +0C36 +3036 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AC8D +ENCODING 44173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AC8E +ENCODING 44174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+AC8F +ENCODING 44175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+AC90 +ENCODING 44176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +0376 +0636 +0C36 +3036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AC91 +ENCODING 44177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+AC92 +ENCODING 44178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+AC93 +ENCODING 44179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AC94 +ENCODING 44180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AC95 +ENCODING 44181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+AC96 +ENCODING 44182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AC97 +ENCODING 44183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AC98 +ENCODING 44184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+AC99 +ENCODING 44185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+AC9A +ENCODING 44186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AC9B +ENCODING 44187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AC9C +ENCODING 44188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AC9D +ENCODING 44189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AC9E +ENCODING 44190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AC9F +ENCODING 44191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+ACA0 +ENCODING 44192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+ACA1 +ENCODING 44193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+ACA2 +ENCODING 44194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+ACA3 +ENCODING 44195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+ACA4 +ENCODING 44196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+ACA5 +ENCODING 44197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+ACA6 +ENCODING 44198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+ACA7 +ENCODING 44199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +03F6 +0636 +0C36 +3036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ACA8 +ENCODING 44200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +3F8C +018C +01FC +030C +067C +0C0C +300C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+ACA9 +ENCODING 44201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+ACAA +ENCODING 44202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+ACAB +ENCODING 44203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+ACAC +ENCODING 44204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ACAD +ENCODING 44205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+ACAE +ENCODING 44206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+ACAF +ENCODING 44207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ACB0 +ENCODING 44208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+ACB1 +ENCODING 44209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+ACB2 +ENCODING 44210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+ACB3 +ENCODING 44211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+ACB4 +ENCODING 44212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+ACB5 +ENCODING 44213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+ACB6 +ENCODING 44214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+ACB7 +ENCODING 44215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+ACB8 +ENCODING 44216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+ACB9 +ENCODING 44217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+ACBA +ENCODING 44218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+ACBB +ENCODING 44219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+ACBC +ENCODING 44220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+ACBD +ENCODING 44221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ACBE +ENCODING 44222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+ACBF +ENCODING 44223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+ACC0 +ENCODING 44224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+ACC1 +ENCODING 44225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ACC2 +ENCODING 44226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+ACC3 +ENCODING 44227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +030C +067C +0C0C +300C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ACC4 +ENCODING 44228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3FB6 +01B6 +01F6 +0336 +0676 +0C36 +3036 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+ACC5 +ENCODING 44229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+ACC6 +ENCODING 44230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+ACC7 +ENCODING 44231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+ACC8 +ENCODING 44232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +0676 +0C36 +3036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+ACC9 +ENCODING 44233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+ACCA +ENCODING 44234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+ACCB +ENCODING 44235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ACCC +ENCODING 44236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+ACCD +ENCODING 44237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+ACCE +ENCODING 44238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+ACCF +ENCODING 44239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+ACD0 +ENCODING 44240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+ACD1 +ENCODING 44241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+ACD2 +ENCODING 44242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+ACD3 +ENCODING 44243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+ACD4 +ENCODING 44244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+ACD5 +ENCODING 44245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+ACD6 +ENCODING 44246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+ACD7 +ENCODING 44247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+ACD8 +ENCODING 44248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+ACD9 +ENCODING 44249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+ACDA +ENCODING 44250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+ACDB +ENCODING 44251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+ACDC +ENCODING 44252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+ACDD +ENCODING 44253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+ACDE +ENCODING 44254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+ACDF +ENCODING 44255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +0336 +06F6 +0C36 +3036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ACE0 +ENCODING 44256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0030 +0030 +0030 +0030 +0020 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+ACE1 +ENCODING 44257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+ACE2 +ENCODING 44258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+ACE3 +ENCODING 44259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+ACE4 +ENCODING 44260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ACE5 +ENCODING 44261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+ACE6 +ENCODING 44262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+ACE7 +ENCODING 44263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ACE8 +ENCODING 44264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ACE9 +ENCODING 44265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+ACEA +ENCODING 44266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+ACEB +ENCODING 44267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+ACEC +ENCODING 44268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+ACED +ENCODING 44269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+ACEE +ENCODING 44270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+ACEF +ENCODING 44271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+ACF0 +ENCODING 44272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ACF1 +ENCODING 44273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+ACF2 +ENCODING 44274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+ACF3 +ENCODING 44275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+ACF4 +ENCODING 44276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+ACF5 +ENCODING 44277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+ACF6 +ENCODING 44278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+ACF7 +ENCODING 44279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+ACF8 +ENCODING 44280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+ACF9 +ENCODING 44281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+ACFA +ENCODING 44282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+ACFB +ENCODING 44283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0190 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+ACFC +ENCODING 44284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +0198 +0198 +011F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+ACFD +ENCODING 44285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+ACFE +ENCODING 44286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+ACFF +ENCODING 44287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AD00 +ENCODING 44288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AD01 +ENCODING 44289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AD02 +ENCODING 44290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AD03 +ENCODING 44291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AD04 +ENCODING 44292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD05 +ENCODING 44293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AD06 +ENCODING 44294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD07 +ENCODING 44295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD08 +ENCODING 44296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AD09 +ENCODING 44297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AD0A +ENCODING 44298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AD0B +ENCODING 44299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AD0C +ENCODING 44300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD0D +ENCODING 44301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD0E +ENCODING 44302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AD0F +ENCODING 44303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD10 +ENCODING 44304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AD11 +ENCODING 44305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AD12 +ENCODING 44306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD13 +ENCODING 44307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD14 +ENCODING 44308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD15 +ENCODING 44309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AD16 +ENCODING 44310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AD17 +ENCODING 44311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +019F +0D18 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AD18 +ENCODING 44312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01BE +0136 +1836 +1836 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AD19 +ENCODING 44313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD1A +ENCODING 44314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AD1B +ENCODING 44315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AD1C +ENCODING 44316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AD1D +ENCODING 44317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AD1E +ENCODING 44318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AD1F +ENCODING 44319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AD20 +ENCODING 44320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD21 +ENCODING 44321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AD22 +ENCODING 44322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD23 +ENCODING 44323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD24 +ENCODING 44324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AD25 +ENCODING 44325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AD26 +ENCODING 44326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AD27 +ENCODING 44327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AD28 +ENCODING 44328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD29 +ENCODING 44329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD2A +ENCODING 44330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AD2B +ENCODING 44331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD2C +ENCODING 44332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AD2D +ENCODING 44333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AD2E +ENCODING 44334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD2F +ENCODING 44335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD30 +ENCODING 44336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD31 +ENCODING 44337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AD32 +ENCODING 44338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AD33 +ENCODING 44339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01BE +1936 +1836 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AD34 +ENCODING 44340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +018C +010C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AD35 +ENCODING 44341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD36 +ENCODING 44342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AD37 +ENCODING 44343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AD38 +ENCODING 44344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AD39 +ENCODING 44345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AD3A +ENCODING 44346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AD3B +ENCODING 44347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AD3C +ENCODING 44348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD3D +ENCODING 44349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AD3E +ENCODING 44350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD3F +ENCODING 44351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD40 +ENCODING 44352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AD41 +ENCODING 44353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AD42 +ENCODING 44354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AD43 +ENCODING 44355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AD44 +ENCODING 44356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD45 +ENCODING 44357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD46 +ENCODING 44358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AD47 +ENCODING 44359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD48 +ENCODING 44360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AD49 +ENCODING 44361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AD4A +ENCODING 44362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD4B +ENCODING 44363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD4C +ENCODING 44364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD4D +ENCODING 44365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AD4E +ENCODING 44366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AD4F +ENCODING 44367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +0D0C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AD50 +ENCODING 44368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0030 +0030 +0030 +0030 +0020 +0CE0 +0C60 +0C60 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+AD51 +ENCODING 44369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD52 +ENCODING 44370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+AD53 +ENCODING 44371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AD54 +ENCODING 44372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AD55 +ENCODING 44373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+AD56 +ENCODING 44374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+AD57 +ENCODING 44375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AD58 +ENCODING 44376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AD59 +ENCODING 44377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+AD5A +ENCODING 44378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+AD5B +ENCODING 44379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD5C +ENCODING 44380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+AD5D +ENCODING 44381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AD5E +ENCODING 44382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AD5F +ENCODING 44383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+AD60 +ENCODING 44384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AD61 +ENCODING 44385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AD62 +ENCODING 44386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+AD63 +ENCODING 44387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+AD64 +ENCODING 44388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+AD65 +ENCODING 44389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AD66 +ENCODING 44390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AD67 +ENCODING 44391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AD68 +ENCODING 44392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD69 +ENCODING 44393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD6A +ENCODING 44394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AD6B +ENCODING 44395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0C70 +0C60 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AD6C +ENCODING 44396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0030 +0030 +0030 +0030 +0020 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+AD6D +ENCODING 44397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD6E +ENCODING 44398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+AD6F +ENCODING 44399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AD70 +ENCODING 44400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AD71 +ENCODING 44401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+AD72 +ENCODING 44402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+AD73 +ENCODING 44403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AD74 +ENCODING 44404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AD75 +ENCODING 44405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+AD76 +ENCODING 44406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+AD77 +ENCODING 44407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD78 +ENCODING 44408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+AD79 +ENCODING 44409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AD7A +ENCODING 44410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AD7B +ENCODING 44411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+AD7C +ENCODING 44412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AD7D +ENCODING 44413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AD7E +ENCODING 44414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+AD7F +ENCODING 44415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+AD80 +ENCODING 44416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+AD81 +ENCODING 44417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AD82 +ENCODING 44418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AD83 +ENCODING 44419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AD84 +ENCODING 44420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AD85 +ENCODING 44421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AD86 +ENCODING 44422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AD87 +ENCODING 44423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AD88 +ENCODING 44424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +018C +010C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+AD89 +ENCODING 44425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AD8A +ENCODING 44426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+AD8B +ENCODING 44427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+AD8C +ENCODING 44428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AD8D +ENCODING 44429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+AD8E +ENCODING 44430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+AD8F +ENCODING 44431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AD90 +ENCODING 44432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+AD91 +ENCODING 44433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+AD92 +ENCODING 44434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD93 +ENCODING 44435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AD94 +ENCODING 44436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AD95 +ENCODING 44437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AD96 +ENCODING 44438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AD97 +ENCODING 44439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AD98 +ENCODING 44440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AD99 +ENCODING 44441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AD9A +ENCODING 44442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AD9B +ENCODING 44443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD9C +ENCODING 44444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AD9D +ENCODING 44445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AD9E +ENCODING 44446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AD9F +ENCODING 44447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+ADA0 +ENCODING 44448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+ADA1 +ENCODING 44449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ADA2 +ENCODING 44450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+ADA3 +ENCODING 44451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +018C +018C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ADA4 +ENCODING 44452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01B6 +0136 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+ADA5 +ENCODING 44453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+ADA6 +ENCODING 44454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+ADA7 +ENCODING 44455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+ADA8 +ENCODING 44456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01F6 +0136 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ADA9 +ENCODING 44457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+ADAA +ENCODING 44458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+ADAB +ENCODING 44459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ADAC +ENCODING 44460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+ADAD +ENCODING 44461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+ADAE +ENCODING 44462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+ADAF +ENCODING 44463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+ADB0 +ENCODING 44464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+ADB1 +ENCODING 44465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+ADB2 +ENCODING 44466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+ADB3 +ENCODING 44467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+ADB4 +ENCODING 44468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+ADB5 +ENCODING 44469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+ADB6 +ENCODING 44470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+ADB7 +ENCODING 44471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+ADB8 +ENCODING 44472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+ADB9 +ENCODING 44473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ADBA +ENCODING 44474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+ADBB +ENCODING 44475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+ADBC +ENCODING 44476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+ADBD +ENCODING 44477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ADBE +ENCODING 44478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+ADBF +ENCODING 44479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +01B6 +01F6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ADC0 +ENCODING 44480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +018C +010C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+ADC1 +ENCODING 44481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+ADC2 +ENCODING 44482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+ADC3 +ENCODING 44483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+ADC4 +ENCODING 44484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ADC5 +ENCODING 44485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+ADC6 +ENCODING 44486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+ADC7 +ENCODING 44487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ADC8 +ENCODING 44488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+ADC9 +ENCODING 44489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+ADCA +ENCODING 44490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+ADCB +ENCODING 44491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+ADCC +ENCODING 44492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+ADCD +ENCODING 44493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+ADCE +ENCODING 44494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+ADCF +ENCODING 44495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+ADD0 +ENCODING 44496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+ADD1 +ENCODING 44497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+ADD2 +ENCODING 44498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+ADD3 +ENCODING 44499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+ADD4 +ENCODING 44500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+ADD5 +ENCODING 44501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ADD6 +ENCODING 44502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+ADD7 +ENCODING 44503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+ADD8 +ENCODING 44504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+ADD9 +ENCODING 44505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+ADDA +ENCODING 44506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+ADDB +ENCODING 44507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +0186 +0186 +0106 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+ADDC +ENCODING 44508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0030 +0030 +0030 +0030 +0020 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+ADDD +ENCODING 44509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+ADDE +ENCODING 44510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+ADDF +ENCODING 44511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+ADE0 +ENCODING 44512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ADE1 +ENCODING 44513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+ADE2 +ENCODING 44514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+ADE3 +ENCODING 44515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ADE4 +ENCODING 44516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ADE5 +ENCODING 44517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+ADE6 +ENCODING 44518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+ADE7 +ENCODING 44519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+ADE8 +ENCODING 44520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+ADE9 +ENCODING 44521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+ADEA +ENCODING 44522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+ADEB +ENCODING 44523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+ADEC +ENCODING 44524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ADED +ENCODING 44525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+ADEE +ENCODING 44526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+ADEF +ENCODING 44527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+ADF0 +ENCODING 44528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+ADF1 +ENCODING 44529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+ADF2 +ENCODING 44530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+ADF3 +ENCODING 44531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+ADF4 +ENCODING 44532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+ADF5 +ENCODING 44533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+ADF6 +ENCODING 44534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+ADF7 +ENCODING 44535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+ADF8 +ENCODING 44536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0030 +0030 +0030 +0030 +0020 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+ADF9 +ENCODING 44537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+ADFA +ENCODING 44538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+ADFB +ENCODING 44539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+ADFC +ENCODING 44540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+ADFD +ENCODING 44541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+ADFE +ENCODING 44542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+ADFF +ENCODING 44543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AE00 +ENCODING 44544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AE01 +ENCODING 44545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+AE02 +ENCODING 44546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+AE03 +ENCODING 44547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE04 +ENCODING 44548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+AE05 +ENCODING 44549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AE06 +ENCODING 44550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AE07 +ENCODING 44551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+AE08 +ENCODING 44552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AE09 +ENCODING 44553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AE0A +ENCODING 44554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+AE0B +ENCODING 44555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+AE0C +ENCODING 44556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+AE0D +ENCODING 44557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AE0E +ENCODING 44558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AE0F +ENCODING 44559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AE10 +ENCODING 44560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE11 +ENCODING 44561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE12 +ENCODING 44562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AE13 +ENCODING 44563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AE14 +ENCODING 44564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +018C +010C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AE15 +ENCODING 44565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE16 +ENCODING 44566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AE17 +ENCODING 44567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AE18 +ENCODING 44568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AE19 +ENCODING 44569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AE1A +ENCODING 44570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AE1B +ENCODING 44571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AE1C +ENCODING 44572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE1D +ENCODING 44573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AE1E +ENCODING 44574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE1F +ENCODING 44575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE20 +ENCODING 44576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AE21 +ENCODING 44577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AE22 +ENCODING 44578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AE23 +ENCODING 44579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AE24 +ENCODING 44580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE25 +ENCODING 44581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE26 +ENCODING 44582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AE27 +ENCODING 44583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE28 +ENCODING 44584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AE29 +ENCODING 44585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AE2A +ENCODING 44586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE2B +ENCODING 44587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE2C +ENCODING 44588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE2D +ENCODING 44589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AE2E +ENCODING 44590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AE2F +ENCODING 44591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +018C +010C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AE30 +ENCODING 44592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +3F8C +018C +018C +030C +060C +0C0C +300C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AE31 +ENCODING 44593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AE32 +ENCODING 44594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+AE33 +ENCODING 44595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+AE34 +ENCODING 44596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AE35 +ENCODING 44597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+AE36 +ENCODING 44598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+AE37 +ENCODING 44599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AE38 +ENCODING 44600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+AE39 +ENCODING 44601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+AE3A +ENCODING 44602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE3B +ENCODING 44603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE3C +ENCODING 44604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AE3D +ENCODING 44605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AE3E +ENCODING 44606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AE3F +ENCODING 44607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AE40 +ENCODING 44608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AE41 +ENCODING 44609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AE42 +ENCODING 44610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AE43 +ENCODING 44611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE44 +ENCODING 44612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AE45 +ENCODING 44613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AE46 +ENCODING 44614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE47 +ENCODING 44615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE48 +ENCODING 44616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AE49 +ENCODING 44617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AE4A +ENCODING 44618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AE4B +ENCODING 44619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +030C +060C +0C0C +300C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AE4C +ENCODING 44620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE4D +ENCODING 44621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE4E +ENCODING 44622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AE4F +ENCODING 44623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AE50 +ENCODING 44624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AE51 +ENCODING 44625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AE52 +ENCODING 44626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AE53 +ENCODING 44627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AE54 +ENCODING 44628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE55 +ENCODING 44629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AE56 +ENCODING 44630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE57 +ENCODING 44631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE58 +ENCODING 44632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AE59 +ENCODING 44633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AE5A +ENCODING 44634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AE5B +ENCODING 44635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AE5C +ENCODING 44636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE5D +ENCODING 44637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE5E +ENCODING 44638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AE5F +ENCODING 44639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE60 +ENCODING 44640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AE61 +ENCODING 44641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AE62 +ENCODING 44642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE63 +ENCODING 44643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE64 +ENCODING 44644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE65 +ENCODING 44645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AE66 +ENCODING 44646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AE67 +ENCODING 44647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +1B18 +3618 +4818 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AE68 +ENCODING 44648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AE69 +ENCODING 44649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AE6A +ENCODING 44650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+AE6B +ENCODING 44651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+AE6C +ENCODING 44652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AE6D +ENCODING 44653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+AE6E +ENCODING 44654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+AE6F +ENCODING 44655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AE70 +ENCODING 44656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AE71 +ENCODING 44657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+AE72 +ENCODING 44658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AE73 +ENCODING 44659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AE74 +ENCODING 44660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+AE75 +ENCODING 44661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+AE76 +ENCODING 44662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AE77 +ENCODING 44663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AE78 +ENCODING 44664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AE79 +ENCODING 44665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AE7A +ENCODING 44666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AE7B +ENCODING 44667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+AE7C +ENCODING 44668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AE7D +ENCODING 44669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+AE7E +ENCODING 44670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AE7F +ENCODING 44671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AE80 +ENCODING 44672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AE81 +ENCODING 44673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+AE82 +ENCODING 44674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+AE83 +ENCODING 44675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +1B36 +3636 +4836 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AE84 +ENCODING 44676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +0D98 +0D9F +1B18 +1B18 +361F +4818 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE85 +ENCODING 44677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE86 +ENCODING 44678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AE87 +ENCODING 44679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AE88 +ENCODING 44680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AE89 +ENCODING 44681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AE8A +ENCODING 44682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AE8B +ENCODING 44683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AE8C +ENCODING 44684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE8D +ENCODING 44685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AE8E +ENCODING 44686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE8F +ENCODING 44687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AE90 +ENCODING 44688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AE91 +ENCODING 44689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AE92 +ENCODING 44690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AE93 +ENCODING 44691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AE94 +ENCODING 44692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE95 +ENCODING 44693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AE96 +ENCODING 44694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AE97 +ENCODING 44695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE98 +ENCODING 44696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AE99 +ENCODING 44697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AE9A +ENCODING 44698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE9B +ENCODING 44699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AE9C +ENCODING 44700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AE9D +ENCODING 44701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AE9E +ENCODING 44702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AE9F +ENCODING 44703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +1B1F +3618 +4818 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AEA0 +ENCODING 44704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +0DB6 +0DBE +1B36 +1B36 +363E +4836 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AEA1 +ENCODING 44705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AEA2 +ENCODING 44706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+AEA3 +ENCODING 44707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+AEA4 +ENCODING 44708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AEA5 +ENCODING 44709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+AEA6 +ENCODING 44710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+AEA7 +ENCODING 44711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AEA8 +ENCODING 44712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AEA9 +ENCODING 44713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+AEAA +ENCODING 44714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AEAB +ENCODING 44715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AEAC +ENCODING 44716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+AEAD +ENCODING 44717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+AEAE +ENCODING 44718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AEAF +ENCODING 44719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AEB0 +ENCODING 44720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AEB1 +ENCODING 44721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AEB2 +ENCODING 44722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AEB3 +ENCODING 44723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+AEB4 +ENCODING 44724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AEB5 +ENCODING 44725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+AEB6 +ENCODING 44726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AEB7 +ENCODING 44727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AEB8 +ENCODING 44728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AEB9 +ENCODING 44729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+AEBA +ENCODING 44730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+AEBB +ENCODING 44731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +1B3E +3636 +4836 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AEBC +ENCODING 44732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +0D8C +0D8C +1B7C +1B0C +360C +480C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AEBD +ENCODING 44733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AEBE +ENCODING 44734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+AEBF +ENCODING 44735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+AEC0 +ENCODING 44736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B7C +1B0C +360C +480C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AEC1 +ENCODING 44737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+AEC2 +ENCODING 44738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+AEC3 +ENCODING 44739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AEC4 +ENCODING 44740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+AEC5 +ENCODING 44741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+AEC6 +ENCODING 44742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AEC7 +ENCODING 44743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AEC8 +ENCODING 44744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AEC9 +ENCODING 44745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AECA +ENCODING 44746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AECB +ENCODING 44747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AECC +ENCODING 44748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AECD +ENCODING 44749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AECE +ENCODING 44750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AECF +ENCODING 44751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AED0 +ENCODING 44752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AED1 +ENCODING 44753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AED2 +ENCODING 44754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AED3 +ENCODING 44755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AED4 +ENCODING 44756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AED5 +ENCODING 44757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AED6 +ENCODING 44758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AED7 +ENCODING 44759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +1B0C +360C +480C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AED8 +ENCODING 44760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +0DB6 +0DB6 +1B76 +1B36 +3636 +4836 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AED9 +ENCODING 44761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AEDA +ENCODING 44762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+AEDB +ENCODING 44763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+AEDC +ENCODING 44764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B76 +1B36 +3636 +4836 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AEDD +ENCODING 44765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+AEDE +ENCODING 44766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+AEDF +ENCODING 44767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AEE0 +ENCODING 44768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AEE1 +ENCODING 44769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+AEE2 +ENCODING 44770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AEE3 +ENCODING 44771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AEE4 +ENCODING 44772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+AEE5 +ENCODING 44773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+AEE6 +ENCODING 44774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AEE7 +ENCODING 44775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AEE8 +ENCODING 44776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AEE9 +ENCODING 44777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AEEA +ENCODING 44778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AEEB +ENCODING 44779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+AEEC +ENCODING 44780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AEED +ENCODING 44781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+AEEE +ENCODING 44782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AEEF +ENCODING 44783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AEF0 +ENCODING 44784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AEF1 +ENCODING 44785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+AEF2 +ENCODING 44786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+AEF3 +ENCODING 44787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +1B36 +3636 +4836 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AEF4 +ENCODING 44788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AEF5 +ENCODING 44789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AEF6 +ENCODING 44790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+AEF7 +ENCODING 44791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+AEF8 +ENCODING 44792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AEF9 +ENCODING 44793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+AEFA +ENCODING 44794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+AEFB +ENCODING 44795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AEFC +ENCODING 44796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+AEFD +ENCODING 44797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+AEFE +ENCODING 44798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AEFF +ENCODING 44799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AF00 +ENCODING 44800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AF01 +ENCODING 44801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AF02 +ENCODING 44802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AF03 +ENCODING 44803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AF04 +ENCODING 44804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AF05 +ENCODING 44805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AF06 +ENCODING 44806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AF07 +ENCODING 44807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF08 +ENCODING 44808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AF09 +ENCODING 44809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AF0A +ENCODING 44810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF0B +ENCODING 44811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF0C +ENCODING 44812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AF0D +ENCODING 44813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AF0E +ENCODING 44814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AF0F +ENCODING 44815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +1B7C +360C +480C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AF10 +ENCODING 44816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +0DB6 +0DF6 +1B36 +1B76 +3636 +4836 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AF11 +ENCODING 44817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AF12 +ENCODING 44818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+AF13 +ENCODING 44819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+AF14 +ENCODING 44820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1B76 +3636 +4836 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AF15 +ENCODING 44821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+AF16 +ENCODING 44822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+AF17 +ENCODING 44823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AF18 +ENCODING 44824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+AF19 +ENCODING 44825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+AF1A +ENCODING 44826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AF1B +ENCODING 44827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+AF1C +ENCODING 44828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+AF1D +ENCODING 44829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+AF1E +ENCODING 44830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AF1F +ENCODING 44831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AF20 +ENCODING 44832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AF21 +ENCODING 44833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+AF22 +ENCODING 44834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AF23 +ENCODING 44835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+AF24 +ENCODING 44836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AF25 +ENCODING 44837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+AF26 +ENCODING 44838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AF27 +ENCODING 44839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+AF28 +ENCODING 44840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+AF29 +ENCODING 44841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+AF2A +ENCODING 44842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+AF2B +ENCODING 44843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +1BF6 +3636 +4836 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AF2C +ENCODING 44844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0318 +0318 +0318 +0318 +0210 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+AF2D +ENCODING 44845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF2E +ENCODING 44846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+AF2F +ENCODING 44847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AF30 +ENCODING 44848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AF31 +ENCODING 44849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+AF32 +ENCODING 44850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+AF33 +ENCODING 44851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AF34 +ENCODING 44852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AF35 +ENCODING 44853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+AF36 +ENCODING 44854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+AF37 +ENCODING 44855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AF38 +ENCODING 44856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+AF39 +ENCODING 44857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AF3A +ENCODING 44858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AF3B +ENCODING 44859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+AF3C +ENCODING 44860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AF3D +ENCODING 44861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AF3E +ENCODING 44862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+AF3F +ENCODING 44863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+AF40 +ENCODING 44864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+AF41 +ENCODING 44865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AF42 +ENCODING 44866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AF43 +ENCODING 44867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AF44 +ENCODING 44868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF45 +ENCODING 44869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF46 +ENCODING 44870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AF47 +ENCODING 44871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0590 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AF48 +ENCODING 44872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3FD8 +0CD8 +0CD8 +0CD8 +0CD8 +089F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF49 +ENCODING 44873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF4A +ENCODING 44874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AF4B +ENCODING 44875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AF4C +ENCODING 44876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AF4D +ENCODING 44877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AF4E +ENCODING 44878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AF4F +ENCODING 44879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AF50 +ENCODING 44880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF51 +ENCODING 44881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AF52 +ENCODING 44882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AF53 +ENCODING 44883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AF54 +ENCODING 44884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AF55 +ENCODING 44885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AF56 +ENCODING 44886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AF57 +ENCODING 44887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AF58 +ENCODING 44888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF59 +ENCODING 44889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF5A +ENCODING 44890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AF5B +ENCODING 44891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF5C +ENCODING 44892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AF5D +ENCODING 44893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AF5E +ENCODING 44894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF5F +ENCODING 44895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF60 +ENCODING 44896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF61 +ENCODING 44897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AF62 +ENCODING 44898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AF63 +ENCODING 44899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +1998 +1998 +199F +1D18 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AF64 +ENCODING 44900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0CF6 +0CF6 +0CF6 +0CFE +08B6 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AF65 +ENCODING 44901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF66 +ENCODING 44902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AF67 +ENCODING 44903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AF68 +ENCODING 44904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AF69 +ENCODING 44905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AF6A +ENCODING 44906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AF6B +ENCODING 44907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AF6C +ENCODING 44908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF6D +ENCODING 44909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AF6E +ENCODING 44910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AF6F +ENCODING 44911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AF70 +ENCODING 44912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AF71 +ENCODING 44913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AF72 +ENCODING 44914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AF73 +ENCODING 44915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AF74 +ENCODING 44916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF75 +ENCODING 44917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF76 +ENCODING 44918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AF77 +ENCODING 44919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF78 +ENCODING 44920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AF79 +ENCODING 44921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AF7A +ENCODING 44922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF7B +ENCODING 44923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF7C +ENCODING 44924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF7D +ENCODING 44925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AF7E +ENCODING 44926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AF7F +ENCODING 44927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19BE +1D36 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AF80 +ENCODING 44928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +0CCC +0CCC +0CCC +0CCC +088C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AF81 +ENCODING 44929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF82 +ENCODING 44930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+AF83 +ENCODING 44931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AF84 +ENCODING 44932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AF85 +ENCODING 44933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+AF86 +ENCODING 44934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+AF87 +ENCODING 44935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AF88 +ENCODING 44936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF89 +ENCODING 44937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+AF8A +ENCODING 44938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AF8B +ENCODING 44939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AF8C +ENCODING 44940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AF8D +ENCODING 44941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AF8E +ENCODING 44942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AF8F +ENCODING 44943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AF90 +ENCODING 44944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF91 +ENCODING 44945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+AF92 +ENCODING 44946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AF93 +ENCODING 44947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF94 +ENCODING 44948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+AF95 +ENCODING 44949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AF96 +ENCODING 44950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF97 +ENCODING 44951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AF98 +ENCODING 44952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF99 +ENCODING 44953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+AF9A +ENCODING 44954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AF9B +ENCODING 44955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +1D0C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+AF9C +ENCODING 44956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0318 +0318 +0318 +0318 +0210 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+AF9D +ENCODING 44957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AF9E +ENCODING 44958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+AF9F +ENCODING 44959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AFA0 +ENCODING 44960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AFA1 +ENCODING 44961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+AFA2 +ENCODING 44962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+AFA3 +ENCODING 44963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AFA4 +ENCODING 44964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AFA5 +ENCODING 44965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+AFA6 +ENCODING 44966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+AFA7 +ENCODING 44967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AFA8 +ENCODING 44968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+AFA9 +ENCODING 44969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AFAA +ENCODING 44970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AFAB +ENCODING 44971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+AFAC +ENCODING 44972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AFAD +ENCODING 44973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AFAE +ENCODING 44974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+AFAF +ENCODING 44975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+AFB0 +ENCODING 44976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+AFB1 +ENCODING 44977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AFB2 +ENCODING 44978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AFB3 +ENCODING 44979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AFB4 +ENCODING 44980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AFB5 +ENCODING 44981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AFB6 +ENCODING 44982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AFB7 +ENCODING 44983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0670 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AFB8 +ENCODING 44984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0318 +0318 +0318 +0210 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+AFB9 +ENCODING 44985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AFBA +ENCODING 44986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+AFBB +ENCODING 44987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+AFBC +ENCODING 44988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AFBD +ENCODING 44989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+AFBE +ENCODING 44990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+AFBF +ENCODING 44991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AFC0 +ENCODING 44992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AFC1 +ENCODING 44993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+AFC2 +ENCODING 44994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+AFC3 +ENCODING 44995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AFC4 +ENCODING 44996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+AFC5 +ENCODING 44997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AFC6 +ENCODING 44998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AFC7 +ENCODING 44999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+AFC8 +ENCODING 45000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+AFC9 +ENCODING 45001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AFCA +ENCODING 45002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+AFCB +ENCODING 45003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+AFCC +ENCODING 45004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+AFCD +ENCODING 45005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AFCE +ENCODING 45006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AFCF +ENCODING 45007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+AFD0 +ENCODING 45008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+AFD1 +ENCODING 45009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+AFD2 +ENCODING 45010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+AFD3 +ENCODING 45011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+AFD4 +ENCODING 45012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +0CCC +0CCC +0CCC +0CCC +088C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+AFD5 +ENCODING 45013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AFD6 +ENCODING 45014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+AFD7 +ENCODING 45015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+AFD8 +ENCODING 45016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AFD9 +ENCODING 45017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+AFDA +ENCODING 45018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+AFDB +ENCODING 45019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AFDC +ENCODING 45020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+AFDD +ENCODING 45021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+AFDE +ENCODING 45022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AFDF +ENCODING 45023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AFE0 +ENCODING 45024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AFE1 +ENCODING 45025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AFE2 +ENCODING 45026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AFE3 +ENCODING 45027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+AFE4 +ENCODING 45028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AFE5 +ENCODING 45029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+AFE6 +ENCODING 45030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+AFE7 +ENCODING 45031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+AFE8 +ENCODING 45032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+AFE9 +ENCODING 45033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AFEA +ENCODING 45034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AFEB +ENCODING 45035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+AFEC +ENCODING 45036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AFED +ENCODING 45037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AFEE +ENCODING 45038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+AFEF +ENCODING 45039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +198C +198C +198C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+AFF0 +ENCODING 45040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0CF6 +0CF6 +0CF6 +0CF6 +08B6 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+AFF1 +ENCODING 45041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+AFF2 +ENCODING 45042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+AFF3 +ENCODING 45043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+AFF4 +ENCODING 45044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19F6 +1136 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AFF5 +ENCODING 45045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+AFF6 +ENCODING 45046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+AFF7 +ENCODING 45047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+AFF8 +ENCODING 45048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+AFF9 +ENCODING 45049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+AFFA +ENCODING 45050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AFFB +ENCODING 45051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+AFFC +ENCODING 45052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+AFFD +ENCODING 45053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+AFFE +ENCODING 45054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+AFFF +ENCODING 45055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B000 +ENCODING 45056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B001 +ENCODING 45057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B002 +ENCODING 45058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B003 +ENCODING 45059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B004 +ENCODING 45060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B005 +ENCODING 45061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B006 +ENCODING 45062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B007 +ENCODING 45063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B008 +ENCODING 45064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B009 +ENCODING 45065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B00A +ENCODING 45066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B00B +ENCODING 45067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +19B6 +19B6 +19B6 +11F6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B00C +ENCODING 45068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +0CCC +0CCC +0CCC +0CCC +088C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B00D +ENCODING 45069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B00E +ENCODING 45070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B00F +ENCODING 45071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B010 +ENCODING 45072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B011 +ENCODING 45073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B012 +ENCODING 45074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B013 +ENCODING 45075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B014 +ENCODING 45076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B015 +ENCODING 45077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B016 +ENCODING 45078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B017 +ENCODING 45079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B018 +ENCODING 45080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B019 +ENCODING 45081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B01A +ENCODING 45082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B01B +ENCODING 45083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B01C +ENCODING 45084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B01D +ENCODING 45085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B01E +ENCODING 45086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B01F +ENCODING 45087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B020 +ENCODING 45088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B021 +ENCODING 45089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B022 +ENCODING 45090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B023 +ENCODING 45091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B024 +ENCODING 45092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B025 +ENCODING 45093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B026 +ENCODING 45094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B027 +ENCODING 45095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +1986 +1986 +1986 +1106 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B028 +ENCODING 45096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0318 +0318 +0318 +0210 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+B029 +ENCODING 45097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B02A +ENCODING 45098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B02B +ENCODING 45099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B02C +ENCODING 45100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B02D +ENCODING 45101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B02E +ENCODING 45102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B02F +ENCODING 45103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B030 +ENCODING 45104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B031 +ENCODING 45105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B032 +ENCODING 45106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B033 +ENCODING 45107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B034 +ENCODING 45108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B035 +ENCODING 45109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B036 +ENCODING 45110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B037 +ENCODING 45111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B038 +ENCODING 45112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B039 +ENCODING 45113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B03A +ENCODING 45114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B03B +ENCODING 45115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B03C +ENCODING 45116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B03D +ENCODING 45117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B03E +ENCODING 45118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B03F +ENCODING 45119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B040 +ENCODING 45120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B041 +ENCODING 45121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B042 +ENCODING 45122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B043 +ENCODING 45123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B044 +ENCODING 45124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0318 +0318 +0318 +0318 +0210 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B045 +ENCODING 45125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B046 +ENCODING 45126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B047 +ENCODING 45127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B048 +ENCODING 45128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B049 +ENCODING 45129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B04A +ENCODING 45130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B04B +ENCODING 45131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B04C +ENCODING 45132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B04D +ENCODING 45133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B04E +ENCODING 45134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B04F +ENCODING 45135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B050 +ENCODING 45136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B051 +ENCODING 45137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B052 +ENCODING 45138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B053 +ENCODING 45139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B054 +ENCODING 45140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B055 +ENCODING 45141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B056 +ENCODING 45142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B057 +ENCODING 45143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B058 +ENCODING 45144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B059 +ENCODING 45145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B05A +ENCODING 45146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B05B +ENCODING 45147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B05C +ENCODING 45148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B05D +ENCODING 45149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B05E +ENCODING 45150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B05F +ENCODING 45151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0618 +0618 +0618 +0410 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B060 +ENCODING 45152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +0CCC +0CCC +0CCC +0CCC +088C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B061 +ENCODING 45153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B062 +ENCODING 45154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B063 +ENCODING 45155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B064 +ENCODING 45156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B065 +ENCODING 45157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B066 +ENCODING 45158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B067 +ENCODING 45159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B068 +ENCODING 45160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B069 +ENCODING 45161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B06A +ENCODING 45162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B06B +ENCODING 45163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B06C +ENCODING 45164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B06D +ENCODING 45165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B06E +ENCODING 45166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B06F +ENCODING 45167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B070 +ENCODING 45168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B071 +ENCODING 45169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B072 +ENCODING 45170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B073 +ENCODING 45171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B074 +ENCODING 45172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B075 +ENCODING 45173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B076 +ENCODING 45174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B077 +ENCODING 45175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B078 +ENCODING 45176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B079 +ENCODING 45177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B07A +ENCODING 45178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B07B +ENCODING 45179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +198C +198C +198C +110C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B07C +ENCODING 45180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B07D +ENCODING 45181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B07E +ENCODING 45182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B07F +ENCODING 45183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B080 +ENCODING 45184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B081 +ENCODING 45185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B082 +ENCODING 45186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B083 +ENCODING 45187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B084 +ENCODING 45188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B085 +ENCODING 45189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B086 +ENCODING 45190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B087 +ENCODING 45191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B088 +ENCODING 45192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B089 +ENCODING 45193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B08A +ENCODING 45194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B08B +ENCODING 45195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B08C +ENCODING 45196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B08D +ENCODING 45197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B08E +ENCODING 45198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B08F +ENCODING 45199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B090 +ENCODING 45200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B091 +ENCODING 45201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B092 +ENCODING 45202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B093 +ENCODING 45203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B094 +ENCODING 45204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B095 +ENCODING 45205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B096 +ENCODING 45206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B097 +ENCODING 45207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +1B0C +360C +480C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B098 +ENCODING 45208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7018 +3018 +3018 +301F +3018 +3018 +1FD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B099 +ENCODING 45209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B09A +ENCODING 45210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B09B +ENCODING 45211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B09C +ENCODING 45212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B09D +ENCODING 45213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B09E +ENCODING 45214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B09F +ENCODING 45215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B0A0 +ENCODING 45216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B0A1 +ENCODING 45217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B0A2 +ENCODING 45218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B0A3 +ENCODING 45219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B0A4 +ENCODING 45220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B0A5 +ENCODING 45221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B0A6 +ENCODING 45222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B0A7 +ENCODING 45223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B0A8 +ENCODING 45224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B0A9 +ENCODING 45225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B0AA +ENCODING 45226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B0AB +ENCODING 45227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B0AC +ENCODING 45228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B0AD +ENCODING 45229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B0AE +ENCODING 45230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B0AF +ENCODING 45231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B0B0 +ENCODING 45232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B0B1 +ENCODING 45233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B0B2 +ENCODING 45234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B0B3 +ENCODING 45235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B0B4 +ENCODING 45236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7036 +3036 +3036 +303E +3036 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B0B5 +ENCODING 45237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B0B6 +ENCODING 45238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B0B7 +ENCODING 45239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B0B8 +ENCODING 45240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B0B9 +ENCODING 45241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B0BA +ENCODING 45242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B0BB +ENCODING 45243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B0BC +ENCODING 45244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B0BD +ENCODING 45245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B0BE +ENCODING 45246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B0BF +ENCODING 45247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B0C0 +ENCODING 45248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B0C1 +ENCODING 45249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B0C2 +ENCODING 45250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B0C3 +ENCODING 45251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B0C4 +ENCODING 45252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B0C5 +ENCODING 45253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B0C6 +ENCODING 45254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B0C7 +ENCODING 45255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B0C8 +ENCODING 45256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B0C9 +ENCODING 45257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B0CA +ENCODING 45258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B0CB +ENCODING 45259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B0CC +ENCODING 45260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B0CD +ENCODING 45261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B0CE +ENCODING 45262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B0CF +ENCODING 45263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B0D0 +ENCODING 45264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7018 +3018 +301F +3018 +3018 +301F +1FD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B0D1 +ENCODING 45265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B0D2 +ENCODING 45266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B0D3 +ENCODING 45267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B0D4 +ENCODING 45268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B0D5 +ENCODING 45269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B0D6 +ENCODING 45270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B0D7 +ENCODING 45271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B0D8 +ENCODING 45272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B0D9 +ENCODING 45273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B0DA +ENCODING 45274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B0DB +ENCODING 45275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B0DC +ENCODING 45276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B0DD +ENCODING 45277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B0DE +ENCODING 45278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B0DF +ENCODING 45279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B0E0 +ENCODING 45280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B0E1 +ENCODING 45281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B0E2 +ENCODING 45282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B0E3 +ENCODING 45283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B0E4 +ENCODING 45284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B0E5 +ENCODING 45285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B0E6 +ENCODING 45286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B0E7 +ENCODING 45287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B0E8 +ENCODING 45288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B0E9 +ENCODING 45289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B0EA +ENCODING 45290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B0EB +ENCODING 45291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +301F +3018 +301F +1F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B0EC +ENCODING 45292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7036 +3036 +303E +3036 +3036 +303E +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B0ED +ENCODING 45293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B0EE +ENCODING 45294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B0EF +ENCODING 45295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B0F0 +ENCODING 45296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B0F1 +ENCODING 45297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B0F2 +ENCODING 45298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B0F3 +ENCODING 45299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B0F4 +ENCODING 45300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B0F5 +ENCODING 45301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B0F6 +ENCODING 45302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B0F7 +ENCODING 45303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B0F8 +ENCODING 45304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B0F9 +ENCODING 45305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B0FA +ENCODING 45306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B0FB +ENCODING 45307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B0FC +ENCODING 45308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B0FD +ENCODING 45309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B0FE +ENCODING 45310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B0FF +ENCODING 45311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B100 +ENCODING 45312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B101 +ENCODING 45313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B102 +ENCODING 45314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B103 +ENCODING 45315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B104 +ENCODING 45316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B105 +ENCODING 45317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B106 +ENCODING 45318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B107 +ENCODING 45319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B108 +ENCODING 45320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +700C +300C +300C +307C +300C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B109 +ENCODING 45321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B10A +ENCODING 45322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B10B +ENCODING 45323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B10C +ENCODING 45324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +307C +300C +1F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B10D +ENCODING 45325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B10E +ENCODING 45326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B10F +ENCODING 45327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B110 +ENCODING 45328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B111 +ENCODING 45329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B112 +ENCODING 45330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B113 +ENCODING 45331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B114 +ENCODING 45332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B115 +ENCODING 45333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B116 +ENCODING 45334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B117 +ENCODING 45335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B118 +ENCODING 45336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B119 +ENCODING 45337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B11A +ENCODING 45338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B11B +ENCODING 45339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B11C +ENCODING 45340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B11D +ENCODING 45341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B11E +ENCODING 45342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B11F +ENCODING 45343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B120 +ENCODING 45344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B121 +ENCODING 45345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B122 +ENCODING 45346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B123 +ENCODING 45347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +30FC +300C +1F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B124 +ENCODING 45348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7036 +3036 +3036 +3076 +3036 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B125 +ENCODING 45349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B126 +ENCODING 45350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B127 +ENCODING 45351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B128 +ENCODING 45352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3076 +3036 +1FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B129 +ENCODING 45353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B12A +ENCODING 45354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B12B +ENCODING 45355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B12C +ENCODING 45356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B12D +ENCODING 45357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B12E +ENCODING 45358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B12F +ENCODING 45359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B130 +ENCODING 45360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B131 +ENCODING 45361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B132 +ENCODING 45362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B133 +ENCODING 45363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B134 +ENCODING 45364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B135 +ENCODING 45365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B136 +ENCODING 45366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B137 +ENCODING 45367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B138 +ENCODING 45368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B139 +ENCODING 45369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B13A +ENCODING 45370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B13B +ENCODING 45371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B13C +ENCODING 45372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B13D +ENCODING 45373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B13E +ENCODING 45374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B13F +ENCODING 45375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B140 +ENCODING 45376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +700C +300C +307C +300C +307C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B141 +ENCODING 45377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B142 +ENCODING 45378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B143 +ENCODING 45379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B144 +ENCODING 45380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B145 +ENCODING 45381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B146 +ENCODING 45382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B147 +ENCODING 45383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B148 +ENCODING 45384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B149 +ENCODING 45385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B14A +ENCODING 45386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B14B +ENCODING 45387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B14C +ENCODING 45388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B14D +ENCODING 45389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B14E +ENCODING 45390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B14F +ENCODING 45391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B150 +ENCODING 45392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B151 +ENCODING 45393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B152 +ENCODING 45394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B153 +ENCODING 45395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B154 +ENCODING 45396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B155 +ENCODING 45397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B156 +ENCODING 45398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B157 +ENCODING 45399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B158 +ENCODING 45400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B159 +ENCODING 45401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B15A +ENCODING 45402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B15B +ENCODING 45403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +307C +300C +307C +1F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B15C +ENCODING 45404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7036 +3036 +3076 +3036 +3076 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B15D +ENCODING 45405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B15E +ENCODING 45406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B15F +ENCODING 45407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B160 +ENCODING 45408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3076 +3036 +3076 +1FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B161 +ENCODING 45409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B162 +ENCODING 45410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B163 +ENCODING 45411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B164 +ENCODING 45412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B165 +ENCODING 45413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B166 +ENCODING 45414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B167 +ENCODING 45415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B168 +ENCODING 45416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B169 +ENCODING 45417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B16A +ENCODING 45418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B16B +ENCODING 45419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B16C +ENCODING 45420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B16D +ENCODING 45421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B16E +ENCODING 45422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B16F +ENCODING 45423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B170 +ENCODING 45424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B171 +ENCODING 45425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B172 +ENCODING 45426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B173 +ENCODING 45427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B174 +ENCODING 45428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B175 +ENCODING 45429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B176 +ENCODING 45430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B177 +ENCODING 45431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B178 +ENCODING 45432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B179 +ENCODING 45433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B17A +ENCODING 45434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B17B +ENCODING 45435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B17C +ENCODING 45436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B17D +ENCODING 45437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B17E +ENCODING 45438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B17F +ENCODING 45439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B180 +ENCODING 45440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B181 +ENCODING 45441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B182 +ENCODING 45442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B183 +ENCODING 45443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B184 +ENCODING 45444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B185 +ENCODING 45445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B186 +ENCODING 45446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B187 +ENCODING 45447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B188 +ENCODING 45448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B189 +ENCODING 45449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B18A +ENCODING 45450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B18B +ENCODING 45451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B18C +ENCODING 45452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B18D +ENCODING 45453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B18E +ENCODING 45454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B18F +ENCODING 45455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B190 +ENCODING 45456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B191 +ENCODING 45457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B192 +ENCODING 45458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B193 +ENCODING 45459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B194 +ENCODING 45460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +3018 +1FD8 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B195 +ENCODING 45461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B196 +ENCODING 45462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B197 +ENCODING 45463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B198 +ENCODING 45464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B199 +ENCODING 45465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B19A +ENCODING 45466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B19B +ENCODING 45467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B19C +ENCODING 45468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B19D +ENCODING 45469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B19E +ENCODING 45470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B19F +ENCODING 45471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B1A0 +ENCODING 45472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B1A1 +ENCODING 45473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B1A2 +ENCODING 45474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B1A3 +ENCODING 45475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B1A4 +ENCODING 45476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B1A5 +ENCODING 45477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B1A6 +ENCODING 45478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B1A7 +ENCODING 45479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1A8 +ENCODING 45480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B1A9 +ENCODING 45481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B1AA +ENCODING 45482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1AB +ENCODING 45483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1AC +ENCODING 45484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B1AD +ENCODING 45485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B1AE +ENCODING 45486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B1AF +ENCODING 45487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7018 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B1B0 +ENCODING 45488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FFE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B1B1 +ENCODING 45489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B1B2 +ENCODING 45490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B1B3 +ENCODING 45491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B1B4 +ENCODING 45492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B1B5 +ENCODING 45493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B1B6 +ENCODING 45494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B1B7 +ENCODING 45495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B1B8 +ENCODING 45496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B1B9 +ENCODING 45497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B1BA +ENCODING 45498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B1BB +ENCODING 45499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B1BC +ENCODING 45500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B1BD +ENCODING 45501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B1BE +ENCODING 45502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B1BF +ENCODING 45503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B1C0 +ENCODING 45504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B1C1 +ENCODING 45505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B1C2 +ENCODING 45506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B1C3 +ENCODING 45507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1C4 +ENCODING 45508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B1C5 +ENCODING 45509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B1C6 +ENCODING 45510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1C7 +ENCODING 45511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1C8 +ENCODING 45512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B1C9 +ENCODING 45513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B1CA +ENCODING 45514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B1CB +ENCODING 45515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B1CC +ENCODING 45516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1FCC +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B1CD +ENCODING 45517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B1CE +ENCODING 45518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B1CF +ENCODING 45519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B1D0 +ENCODING 45520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B1D1 +ENCODING 45521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B1D2 +ENCODING 45522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B1D3 +ENCODING 45523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B1D4 +ENCODING 45524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B1D5 +ENCODING 45525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B1D6 +ENCODING 45526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B1D7 +ENCODING 45527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B1D8 +ENCODING 45528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B1D9 +ENCODING 45529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B1DA +ENCODING 45530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B1DB +ENCODING 45531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B1DC +ENCODING 45532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B1DD +ENCODING 45533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B1DE +ENCODING 45534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B1DF +ENCODING 45535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1E0 +ENCODING 45536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B1E1 +ENCODING 45537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B1E2 +ENCODING 45538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1E3 +ENCODING 45539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B1E4 +ENCODING 45540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B1E5 +ENCODING 45541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B1E6 +ENCODING 45542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B1E7 +ENCODING 45543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B1E8 +ENCODING 45544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B1E9 +ENCODING 45545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B1EA +ENCODING 45546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B1EB +ENCODING 45547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B1EC +ENCODING 45548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B1ED +ENCODING 45549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B1EE +ENCODING 45550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B1EF +ENCODING 45551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B1F0 +ENCODING 45552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B1F1 +ENCODING 45553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B1F2 +ENCODING 45554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B1F3 +ENCODING 45555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B1F4 +ENCODING 45556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B1F5 +ENCODING 45557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B1F6 +ENCODING 45558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B1F7 +ENCODING 45559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B1F8 +ENCODING 45560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B1F9 +ENCODING 45561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B1FA +ENCODING 45562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B1FB +ENCODING 45563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B1FC +ENCODING 45564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B1FD +ENCODING 45565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B1FE +ENCODING 45566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B1FF +ENCODING 45567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B200 +ENCODING 45568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B201 +ENCODING 45569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B202 +ENCODING 45570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B203 +ENCODING 45571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B204 +ENCODING 45572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+B205 +ENCODING 45573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B206 +ENCODING 45574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B207 +ENCODING 45575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B208 +ENCODING 45576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B209 +ENCODING 45577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B20A +ENCODING 45578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B20B +ENCODING 45579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B20C +ENCODING 45580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B20D +ENCODING 45581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B20E +ENCODING 45582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B20F +ENCODING 45583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B210 +ENCODING 45584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B211 +ENCODING 45585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B212 +ENCODING 45586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B213 +ENCODING 45587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B214 +ENCODING 45588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B215 +ENCODING 45589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B216 +ENCODING 45590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B217 +ENCODING 45591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B218 +ENCODING 45592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B219 +ENCODING 45593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B21A +ENCODING 45594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B21B +ENCODING 45595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B21C +ENCODING 45596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B21D +ENCODING 45597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B21E +ENCODING 45598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B21F +ENCODING 45599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B220 +ENCODING 45600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1FCC +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B221 +ENCODING 45601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B222 +ENCODING 45602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B223 +ENCODING 45603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B224 +ENCODING 45604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B225 +ENCODING 45605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B226 +ENCODING 45606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B227 +ENCODING 45607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B228 +ENCODING 45608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B229 +ENCODING 45609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B22A +ENCODING 45610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B22B +ENCODING 45611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B22C +ENCODING 45612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B22D +ENCODING 45613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B22E +ENCODING 45614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B22F +ENCODING 45615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B230 +ENCODING 45616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B231 +ENCODING 45617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B232 +ENCODING 45618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B233 +ENCODING 45619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B234 +ENCODING 45620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B235 +ENCODING 45621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B236 +ENCODING 45622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B237 +ENCODING 45623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B238 +ENCODING 45624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B239 +ENCODING 45625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B23A +ENCODING 45626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B23B +ENCODING 45627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +701C +300C +300C +300C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B23C +ENCODING 45628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B23D +ENCODING 45629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B23E +ENCODING 45630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B23F +ENCODING 45631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B240 +ENCODING 45632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +30F6 +1FB6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B241 +ENCODING 45633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B242 +ENCODING 45634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B243 +ENCODING 45635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B244 +ENCODING 45636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B245 +ENCODING 45637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B246 +ENCODING 45638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B247 +ENCODING 45639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B248 +ENCODING 45640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B249 +ENCODING 45641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B24A +ENCODING 45642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B24B +ENCODING 45643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B24C +ENCODING 45644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B24D +ENCODING 45645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B24E +ENCODING 45646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B24F +ENCODING 45647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B250 +ENCODING 45648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B251 +ENCODING 45649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B252 +ENCODING 45650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B253 +ENCODING 45651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B254 +ENCODING 45652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B255 +ENCODING 45653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B256 +ENCODING 45654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B257 +ENCODING 45655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7076 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B258 +ENCODING 45656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1FCC +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B259 +ENCODING 45657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B25A +ENCODING 45658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B25B +ENCODING 45659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B25C +ENCODING 45660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B25D +ENCODING 45661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B25E +ENCODING 45662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B25F +ENCODING 45663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B260 +ENCODING 45664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B261 +ENCODING 45665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B262 +ENCODING 45666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B263 +ENCODING 45667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B264 +ENCODING 45668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B265 +ENCODING 45669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B266 +ENCODING 45670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B267 +ENCODING 45671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B268 +ENCODING 45672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B269 +ENCODING 45673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B26A +ENCODING 45674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B26B +ENCODING 45675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B26C +ENCODING 45676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B26D +ENCODING 45677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B26E +ENCODING 45678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B26F +ENCODING 45679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B270 +ENCODING 45680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B271 +ENCODING 45681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B272 +ENCODING 45682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B273 +ENCODING 45683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7006 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B274 +ENCODING 45684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+B275 +ENCODING 45685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B276 +ENCODING 45686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B277 +ENCODING 45687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B278 +ENCODING 45688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B279 +ENCODING 45689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B27A +ENCODING 45690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B27B +ENCODING 45691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B27C +ENCODING 45692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B27D +ENCODING 45693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B27E +ENCODING 45694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B27F +ENCODING 45695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B280 +ENCODING 45696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B281 +ENCODING 45697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B282 +ENCODING 45698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B283 +ENCODING 45699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B284 +ENCODING 45700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B285 +ENCODING 45701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B286 +ENCODING 45702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B287 +ENCODING 45703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B288 +ENCODING 45704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B289 +ENCODING 45705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B28A +ENCODING 45706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B28B +ENCODING 45707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B28C +ENCODING 45708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B28D +ENCODING 45709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B28E +ENCODING 45710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B28F +ENCODING 45711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B290 +ENCODING 45712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B291 +ENCODING 45713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B292 +ENCODING 45714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B293 +ENCODING 45715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B294 +ENCODING 45716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B295 +ENCODING 45717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B296 +ENCODING 45718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B297 +ENCODING 45719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B298 +ENCODING 45720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B299 +ENCODING 45721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B29A +ENCODING 45722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B29B +ENCODING 45723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B29C +ENCODING 45724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B29D +ENCODING 45725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B29E +ENCODING 45726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B29F +ENCODING 45727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B2A0 +ENCODING 45728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B2A1 +ENCODING 45729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B2A2 +ENCODING 45730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B2A3 +ENCODING 45731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B2A4 +ENCODING 45732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B2A5 +ENCODING 45733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B2A6 +ENCODING 45734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B2A7 +ENCODING 45735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B2A8 +ENCODING 45736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B2A9 +ENCODING 45737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B2AA +ENCODING 45738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B2AB +ENCODING 45739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3800 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B2AC +ENCODING 45740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1FCC +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B2AD +ENCODING 45741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B2AE +ENCODING 45742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B2AF +ENCODING 45743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B2B0 +ENCODING 45744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B2B1 +ENCODING 45745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B2B2 +ENCODING 45746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B2B3 +ENCODING 45747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B2B4 +ENCODING 45748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B2B5 +ENCODING 45749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B2B6 +ENCODING 45750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B2B7 +ENCODING 45751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B2B8 +ENCODING 45752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B2B9 +ENCODING 45753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B2BA +ENCODING 45754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B2BB +ENCODING 45755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B2BC +ENCODING 45756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B2BD +ENCODING 45757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B2BE +ENCODING 45758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B2BF +ENCODING 45759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2C0 +ENCODING 45760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B2C1 +ENCODING 45761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B2C2 +ENCODING 45762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2C3 +ENCODING 45763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2C4 +ENCODING 45764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B2C5 +ENCODING 45765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B2C6 +ENCODING 45766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B2C7 +ENCODING 45767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +1F8C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B2C8 +ENCODING 45768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +700C +300C +300C +300C +300C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B2C9 +ENCODING 45769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B2CA +ENCODING 45770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B2CB +ENCODING 45771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B2CC +ENCODING 45772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B2CD +ENCODING 45773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B2CE +ENCODING 45774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B2CF +ENCODING 45775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B2D0 +ENCODING 45776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B2D1 +ENCODING 45777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B2D2 +ENCODING 45778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B2D3 +ENCODING 45779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B2D4 +ENCODING 45780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B2D5 +ENCODING 45781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B2D6 +ENCODING 45782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B2D7 +ENCODING 45783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B2D8 +ENCODING 45784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B2D9 +ENCODING 45785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B2DA +ENCODING 45786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B2DB +ENCODING 45787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2DC +ENCODING 45788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B2DD +ENCODING 45789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B2DE +ENCODING 45790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2DF +ENCODING 45791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2E0 +ENCODING 45792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B2E1 +ENCODING 45793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B2E2 +ENCODING 45794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B2E3 +ENCODING 45795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +700C +300C +300C +300C +300C +1F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B2E4 +ENCODING 45796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F18 +3018 +3018 +301F +3018 +3018 +1F98 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B2E5 +ENCODING 45797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B2E6 +ENCODING 45798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B2E7 +ENCODING 45799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B2E8 +ENCODING 45800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B2E9 +ENCODING 45801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B2EA +ENCODING 45802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B2EB +ENCODING 45803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B2EC +ENCODING 45804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B2ED +ENCODING 45805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B2EE +ENCODING 45806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B2EF +ENCODING 45807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B2F0 +ENCODING 45808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B2F1 +ENCODING 45809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B2F2 +ENCODING 45810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B2F3 +ENCODING 45811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B2F4 +ENCODING 45812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B2F5 +ENCODING 45813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B2F6 +ENCODING 45814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B2F7 +ENCODING 45815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2F8 +ENCODING 45816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B2F9 +ENCODING 45817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B2FA +ENCODING 45818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2FB +ENCODING 45819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B2FC +ENCODING 45820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B2FD +ENCODING 45821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B2FE +ENCODING 45822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B2FF +ENCODING 45823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +301F +3018 +1F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B300 +ENCODING 45824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7F36 +3036 +3036 +303E +3036 +3036 +1FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B301 +ENCODING 45825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B302 +ENCODING 45826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B303 +ENCODING 45827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B304 +ENCODING 45828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B305 +ENCODING 45829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B306 +ENCODING 45830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B307 +ENCODING 45831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B308 +ENCODING 45832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B309 +ENCODING 45833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B30A +ENCODING 45834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B30B +ENCODING 45835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B30C +ENCODING 45836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B30D +ENCODING 45837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B30E +ENCODING 45838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B30F +ENCODING 45839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B310 +ENCODING 45840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B311 +ENCODING 45841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B312 +ENCODING 45842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B313 +ENCODING 45843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B314 +ENCODING 45844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B315 +ENCODING 45845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B316 +ENCODING 45846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B317 +ENCODING 45847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B318 +ENCODING 45848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B319 +ENCODING 45849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B31A +ENCODING 45850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B31B +ENCODING 45851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +303E +3036 +1FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B31C +ENCODING 45852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F18 +3018 +301F +3018 +3018 +301F +1F98 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B31D +ENCODING 45853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B31E +ENCODING 45854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B31F +ENCODING 45855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B320 +ENCODING 45856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B321 +ENCODING 45857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B322 +ENCODING 45858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B323 +ENCODING 45859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B324 +ENCODING 45860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B325 +ENCODING 45861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B326 +ENCODING 45862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B327 +ENCODING 45863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B328 +ENCODING 45864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B329 +ENCODING 45865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B32A +ENCODING 45866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B32B +ENCODING 45867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B32C +ENCODING 45868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B32D +ENCODING 45869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B32E +ENCODING 45870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B32F +ENCODING 45871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B330 +ENCODING 45872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B331 +ENCODING 45873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B332 +ENCODING 45874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B333 +ENCODING 45875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B334 +ENCODING 45876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B335 +ENCODING 45877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B336 +ENCODING 45878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B337 +ENCODING 45879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3018 +301F +1F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B338 +ENCODING 45880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7F36 +3036 +303E +3036 +3036 +303E +1FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B339 +ENCODING 45881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B33A +ENCODING 45882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B33B +ENCODING 45883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B33C +ENCODING 45884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B33D +ENCODING 45885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B33E +ENCODING 45886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B33F +ENCODING 45887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B340 +ENCODING 45888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B341 +ENCODING 45889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B342 +ENCODING 45890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B343 +ENCODING 45891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B344 +ENCODING 45892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B345 +ENCODING 45893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B346 +ENCODING 45894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B347 +ENCODING 45895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B348 +ENCODING 45896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B349 +ENCODING 45897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B34A +ENCODING 45898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B34B +ENCODING 45899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B34C +ENCODING 45900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B34D +ENCODING 45901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B34E +ENCODING 45902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B34F +ENCODING 45903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B350 +ENCODING 45904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B351 +ENCODING 45905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B352 +ENCODING 45906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B353 +ENCODING 45907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3036 +303E +1FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B354 +ENCODING 45908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F0C +300C +300C +307C +300C +300C +1F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B355 +ENCODING 45909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B356 +ENCODING 45910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B357 +ENCODING 45911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B358 +ENCODING 45912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +307C +300C +1F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B359 +ENCODING 45913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B35A +ENCODING 45914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B35B +ENCODING 45915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B35C +ENCODING 45916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B35D +ENCODING 45917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B35E +ENCODING 45918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B35F +ENCODING 45919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B360 +ENCODING 45920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B361 +ENCODING 45921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B362 +ENCODING 45922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B363 +ENCODING 45923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B364 +ENCODING 45924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B365 +ENCODING 45925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B366 +ENCODING 45926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B367 +ENCODING 45927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B368 +ENCODING 45928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B369 +ENCODING 45929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B36A +ENCODING 45930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B36B +ENCODING 45931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B36C +ENCODING 45932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B36D +ENCODING 45933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B36E +ENCODING 45934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B36F +ENCODING 45935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +30FC +300C +1F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B370 +ENCODING 45936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7F36 +3036 +3036 +3076 +3036 +3036 +1FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B371 +ENCODING 45937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B372 +ENCODING 45938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B373 +ENCODING 45939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B374 +ENCODING 45940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3076 +3036 +1FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B375 +ENCODING 45941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B376 +ENCODING 45942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B377 +ENCODING 45943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B378 +ENCODING 45944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B379 +ENCODING 45945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B37A +ENCODING 45946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B37B +ENCODING 45947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B37C +ENCODING 45948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B37D +ENCODING 45949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B37E +ENCODING 45950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B37F +ENCODING 45951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B380 +ENCODING 45952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B381 +ENCODING 45953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B382 +ENCODING 45954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B383 +ENCODING 45955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B384 +ENCODING 45956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B385 +ENCODING 45957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B386 +ENCODING 45958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B387 +ENCODING 45959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B388 +ENCODING 45960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B389 +ENCODING 45961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B38A +ENCODING 45962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B38B +ENCODING 45963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +30F6 +3036 +1FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B38C +ENCODING 45964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F0C +300C +307C +300C +307C +300C +1F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B38D +ENCODING 45965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B38E +ENCODING 45966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B38F +ENCODING 45967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B390 +ENCODING 45968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B391 +ENCODING 45969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B392 +ENCODING 45970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B393 +ENCODING 45971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B394 +ENCODING 45972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B395 +ENCODING 45973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B396 +ENCODING 45974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B397 +ENCODING 45975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B398 +ENCODING 45976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B399 +ENCODING 45977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B39A +ENCODING 45978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B39B +ENCODING 45979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B39C +ENCODING 45980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B39D +ENCODING 45981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B39E +ENCODING 45982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B39F +ENCODING 45983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B3A0 +ENCODING 45984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B3A1 +ENCODING 45985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B3A2 +ENCODING 45986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B3A3 +ENCODING 45987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B3A4 +ENCODING 45988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B3A5 +ENCODING 45989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B3A6 +ENCODING 45990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B3A7 +ENCODING 45991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +300C +307C +1F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B3A8 +ENCODING 45992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7F36 +3036 +3076 +3036 +3076 +3036 +1FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B3A9 +ENCODING 45993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B3AA +ENCODING 45994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B3AB +ENCODING 45995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B3AC +ENCODING 45996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3076 +3036 +3076 +1FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B3AD +ENCODING 45997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B3AE +ENCODING 45998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B3AF +ENCODING 45999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B3B0 +ENCODING 46000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B3B1 +ENCODING 46001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B3B2 +ENCODING 46002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B3B3 +ENCODING 46003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B3B4 +ENCODING 46004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B3B5 +ENCODING 46005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B3B6 +ENCODING 46006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B3B7 +ENCODING 46007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B3B8 +ENCODING 46008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B3B9 +ENCODING 46009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B3BA +ENCODING 46010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B3BB +ENCODING 46011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B3BC +ENCODING 46012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B3BD +ENCODING 46013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B3BE +ENCODING 46014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B3BF +ENCODING 46015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B3C0 +ENCODING 46016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B3C1 +ENCODING 46017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B3C2 +ENCODING 46018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B3C3 +ENCODING 46019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3036 +30F6 +1FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B3C4 +ENCODING 46020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1800 +1800 +1800 +0FF0 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B3C5 +ENCODING 46021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B3C6 +ENCODING 46022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B3C7 +ENCODING 46023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B3C8 +ENCODING 46024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B3C9 +ENCODING 46025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B3CA +ENCODING 46026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B3CB +ENCODING 46027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B3CC +ENCODING 46028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B3CD +ENCODING 46029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B3CE +ENCODING 46030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B3CF +ENCODING 46031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B3D0 +ENCODING 46032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B3D1 +ENCODING 46033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B3D2 +ENCODING 46034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B3D3 +ENCODING 46035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B3D4 +ENCODING 46036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B3D5 +ENCODING 46037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B3D6 +ENCODING 46038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B3D7 +ENCODING 46039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B3D8 +ENCODING 46040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B3D9 +ENCODING 46041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B3DA +ENCODING 46042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B3DB +ENCODING 46043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B3DC +ENCODING 46044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B3DD +ENCODING 46045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B3DE +ENCODING 46046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B3DF +ENCODING 46047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0180 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B3E0 +ENCODING 46048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +3018 +1F98 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B3E1 +ENCODING 46049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B3E2 +ENCODING 46050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B3E3 +ENCODING 46051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B3E4 +ENCODING 46052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B3E5 +ENCODING 46053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B3E6 +ENCODING 46054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B3E7 +ENCODING 46055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B3E8 +ENCODING 46056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B3E9 +ENCODING 46057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B3EA +ENCODING 46058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B3EB +ENCODING 46059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B3EC +ENCODING 46060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B3ED +ENCODING 46061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B3EE +ENCODING 46062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B3EF +ENCODING 46063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B3F0 +ENCODING 46064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B3F1 +ENCODING 46065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B3F2 +ENCODING 46066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B3F3 +ENCODING 46067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B3F4 +ENCODING 46068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B3F5 +ENCODING 46069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B3F6 +ENCODING 46070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B3F7 +ENCODING 46071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B3F8 +ENCODING 46072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B3F9 +ENCODING 46073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B3FA +ENCODING 46074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B3FB +ENCODING 46075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3018 +301F +1F98 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B3FC +ENCODING 46076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FBE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B3FD +ENCODING 46077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B3FE +ENCODING 46078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B3FF +ENCODING 46079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B400 +ENCODING 46080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B401 +ENCODING 46081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B402 +ENCODING 46082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B403 +ENCODING 46083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B404 +ENCODING 46084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B405 +ENCODING 46085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B406 +ENCODING 46086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B407 +ENCODING 46087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B408 +ENCODING 46088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B409 +ENCODING 46089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B40A +ENCODING 46090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B40B +ENCODING 46091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B40C +ENCODING 46092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B40D +ENCODING 46093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B40E +ENCODING 46094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B40F +ENCODING 46095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B410 +ENCODING 46096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B411 +ENCODING 46097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B412 +ENCODING 46098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B413 +ENCODING 46099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B414 +ENCODING 46100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B415 +ENCODING 46101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B416 +ENCODING 46102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B417 +ENCODING 46103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +303E +1FB6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B418 +ENCODING 46104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B419 +ENCODING 46105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B41A +ENCODING 46106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B41B +ENCODING 46107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B41C +ENCODING 46108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B41D +ENCODING 46109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B41E +ENCODING 46110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B41F +ENCODING 46111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B420 +ENCODING 46112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B421 +ENCODING 46113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B422 +ENCODING 46114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B423 +ENCODING 46115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B424 +ENCODING 46116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B425 +ENCODING 46117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B426 +ENCODING 46118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B427 +ENCODING 46119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B428 +ENCODING 46120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B429 +ENCODING 46121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B42A +ENCODING 46122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B42B +ENCODING 46123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B42C +ENCODING 46124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B42D +ENCODING 46125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B42E +ENCODING 46126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B42F +ENCODING 46127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B430 +ENCODING 46128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B431 +ENCODING 46129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B432 +ENCODING 46130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B433 +ENCODING 46131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B434 +ENCODING 46132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1800 +1800 +1800 +0FF0 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B435 +ENCODING 46133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B436 +ENCODING 46134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B437 +ENCODING 46135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B438 +ENCODING 46136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B439 +ENCODING 46137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B43A +ENCODING 46138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B43B +ENCODING 46139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B43C +ENCODING 46140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B43D +ENCODING 46141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B43E +ENCODING 46142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B43F +ENCODING 46143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B440 +ENCODING 46144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B441 +ENCODING 46145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B442 +ENCODING 46146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B443 +ENCODING 46147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B444 +ENCODING 46148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B445 +ENCODING 46149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B446 +ENCODING 46150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B447 +ENCODING 46151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B448 +ENCODING 46152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B449 +ENCODING 46153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B44A +ENCODING 46154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B44B +ENCODING 46155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B44C +ENCODING 46156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B44D +ENCODING 46157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B44E +ENCODING 46158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B44F +ENCODING 46159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0660 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B450 +ENCODING 46160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1800 +1800 +1800 +0FF0 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+B451 +ENCODING 46161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B452 +ENCODING 46162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B453 +ENCODING 46163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B454 +ENCODING 46164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B455 +ENCODING 46165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B456 +ENCODING 46166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B457 +ENCODING 46167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B458 +ENCODING 46168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B459 +ENCODING 46169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B45A +ENCODING 46170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B45B +ENCODING 46171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B45C +ENCODING 46172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B45D +ENCODING 46173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B45E +ENCODING 46174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B45F +ENCODING 46175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B460 +ENCODING 46176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B461 +ENCODING 46177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B462 +ENCODING 46178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B463 +ENCODING 46179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B464 +ENCODING 46180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B465 +ENCODING 46181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B466 +ENCODING 46182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B467 +ENCODING 46183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B468 +ENCODING 46184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B469 +ENCODING 46185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B46A +ENCODING 46186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B46B +ENCODING 46187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B46C +ENCODING 46188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B46D +ENCODING 46189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B46E +ENCODING 46190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B46F +ENCODING 46191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B470 +ENCODING 46192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B471 +ENCODING 46193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B472 +ENCODING 46194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B473 +ENCODING 46195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B474 +ENCODING 46196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B475 +ENCODING 46197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B476 +ENCODING 46198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B477 +ENCODING 46199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B478 +ENCODING 46200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B479 +ENCODING 46201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B47A +ENCODING 46202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B47B +ENCODING 46203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B47C +ENCODING 46204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B47D +ENCODING 46205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B47E +ENCODING 46206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B47F +ENCODING 46207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B480 +ENCODING 46208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B481 +ENCODING 46209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B482 +ENCODING 46210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B483 +ENCODING 46211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B484 +ENCODING 46212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B485 +ENCODING 46213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B486 +ENCODING 46214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B487 +ENCODING 46215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +300C +300C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B488 +ENCODING 46216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FB6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B489 +ENCODING 46217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B48A +ENCODING 46218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B48B +ENCODING 46219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B48C +ENCODING 46220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +30F6 +1FB6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B48D +ENCODING 46221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B48E +ENCODING 46222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B48F +ENCODING 46223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B490 +ENCODING 46224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B491 +ENCODING 46225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B492 +ENCODING 46226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B493 +ENCODING 46227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B494 +ENCODING 46228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B495 +ENCODING 46229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B496 +ENCODING 46230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B497 +ENCODING 46231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B498 +ENCODING 46232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B499 +ENCODING 46233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B49A +ENCODING 46234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B49B +ENCODING 46235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B49C +ENCODING 46236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B49D +ENCODING 46237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B49E +ENCODING 46238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B49F +ENCODING 46239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B4A0 +ENCODING 46240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B4A1 +ENCODING 46241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B4A2 +ENCODING 46242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B4A3 +ENCODING 46243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3036 +3036 +1FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B4A4 +ENCODING 46244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B4A5 +ENCODING 46245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B4A6 +ENCODING 46246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B4A7 +ENCODING 46247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B4A8 +ENCODING 46248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B4A9 +ENCODING 46249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B4AA +ENCODING 46250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B4AB +ENCODING 46251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B4AC +ENCODING 46252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B4AD +ENCODING 46253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B4AE +ENCODING 46254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B4AF +ENCODING 46255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B4B0 +ENCODING 46256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B4B1 +ENCODING 46257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B4B2 +ENCODING 46258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B4B3 +ENCODING 46259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B4B4 +ENCODING 46260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B4B5 +ENCODING 46261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B4B6 +ENCODING 46262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B4B7 +ENCODING 46263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B4B8 +ENCODING 46264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B4B9 +ENCODING 46265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B4BA +ENCODING 46266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B4BB +ENCODING 46267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B4BC +ENCODING 46268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B4BD +ENCODING 46269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B4BE +ENCODING 46270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B4BF +ENCODING 46271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3006 +3006 +1F86 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B4C0 +ENCODING 46272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1800 +1800 +1800 +0FF0 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+B4C1 +ENCODING 46273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B4C2 +ENCODING 46274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B4C3 +ENCODING 46275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B4C4 +ENCODING 46276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B4C5 +ENCODING 46277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B4C6 +ENCODING 46278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B4C7 +ENCODING 46279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B4C8 +ENCODING 46280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B4C9 +ENCODING 46281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B4CA +ENCODING 46282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B4CB +ENCODING 46283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B4CC +ENCODING 46284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B4CD +ENCODING 46285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B4CE +ENCODING 46286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B4CF +ENCODING 46287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B4D0 +ENCODING 46288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B4D1 +ENCODING 46289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B4D2 +ENCODING 46290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B4D3 +ENCODING 46291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B4D4 +ENCODING 46292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B4D5 +ENCODING 46293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B4D6 +ENCODING 46294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B4D7 +ENCODING 46295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B4D8 +ENCODING 46296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B4D9 +ENCODING 46297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B4DA +ENCODING 46298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B4DB +ENCODING 46299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B4DC +ENCODING 46300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1800 +1800 +1800 +0FF0 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B4DD +ENCODING 46301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B4DE +ENCODING 46302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B4DF +ENCODING 46303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B4E0 +ENCODING 46304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B4E1 +ENCODING 46305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B4E2 +ENCODING 46306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B4E3 +ENCODING 46307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B4E4 +ENCODING 46308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B4E5 +ENCODING 46309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B4E6 +ENCODING 46310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B4E7 +ENCODING 46311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B4E8 +ENCODING 46312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B4E9 +ENCODING 46313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B4EA +ENCODING 46314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B4EB +ENCODING 46315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B4EC +ENCODING 46316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B4ED +ENCODING 46317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B4EE +ENCODING 46318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B4EF +ENCODING 46319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B4F0 +ENCODING 46320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B4F1 +ENCODING 46321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B4F2 +ENCODING 46322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B4F3 +ENCODING 46323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B4F4 +ENCODING 46324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B4F5 +ENCODING 46325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B4F6 +ENCODING 46326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B4F7 +ENCODING 46327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B4F8 +ENCODING 46328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B4F9 +ENCODING 46329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B4FA +ENCODING 46330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B4FB +ENCODING 46331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B4FC +ENCODING 46332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B4FD +ENCODING 46333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B4FE +ENCODING 46334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B4FF +ENCODING 46335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B500 +ENCODING 46336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B501 +ENCODING 46337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B502 +ENCODING 46338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B503 +ENCODING 46339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B504 +ENCODING 46340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B505 +ENCODING 46341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B506 +ENCODING 46342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B507 +ENCODING 46343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B508 +ENCODING 46344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B509 +ENCODING 46345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B50A +ENCODING 46346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B50B +ENCODING 46347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B50C +ENCODING 46348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B50D +ENCODING 46349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B50E +ENCODING 46350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B50F +ENCODING 46351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B510 +ENCODING 46352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B511 +ENCODING 46353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B512 +ENCODING 46354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B513 +ENCODING 46355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +300C +300C +1F8C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B514 +ENCODING 46356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F0C +300C +300C +300C +300C +300C +1F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B515 +ENCODING 46357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B516 +ENCODING 46358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B517 +ENCODING 46359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B518 +ENCODING 46360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B519 +ENCODING 46361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B51A +ENCODING 46362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B51B +ENCODING 46363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B51C +ENCODING 46364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B51D +ENCODING 46365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B51E +ENCODING 46366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B51F +ENCODING 46367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B520 +ENCODING 46368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B521 +ENCODING 46369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B522 +ENCODING 46370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B523 +ENCODING 46371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B524 +ENCODING 46372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B525 +ENCODING 46373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B526 +ENCODING 46374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B527 +ENCODING 46375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B528 +ENCODING 46376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B529 +ENCODING 46377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B52A +ENCODING 46378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B52B +ENCODING 46379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B52C +ENCODING 46380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B52D +ENCODING 46381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B52E +ENCODING 46382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B52F +ENCODING 46383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +300C +300C +1F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B530 +ENCODING 46384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +3618 +3618 +361F +3618 +3618 +1BD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B531 +ENCODING 46385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B532 +ENCODING 46386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B533 +ENCODING 46387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B534 +ENCODING 46388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B535 +ENCODING 46389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B536 +ENCODING 46390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B537 +ENCODING 46391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B538 +ENCODING 46392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B539 +ENCODING 46393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B53A +ENCODING 46394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B53B +ENCODING 46395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B53C +ENCODING 46396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B53D +ENCODING 46397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B53E +ENCODING 46398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B53F +ENCODING 46399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B540 +ENCODING 46400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B541 +ENCODING 46401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B542 +ENCODING 46402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B543 +ENCODING 46403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B544 +ENCODING 46404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B545 +ENCODING 46405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B546 +ENCODING 46406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B547 +ENCODING 46407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B548 +ENCODING 46408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B549 +ENCODING 46409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B54A +ENCODING 46410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B54B +ENCODING 46411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +3618 +361F +3618 +1BD8 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B54C +ENCODING 46412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +3636 +3636 +363E +3636 +3636 +1BF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B54D +ENCODING 46413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B54E +ENCODING 46414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B54F +ENCODING 46415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B550 +ENCODING 46416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B551 +ENCODING 46417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B552 +ENCODING 46418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B553 +ENCODING 46419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B554 +ENCODING 46420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B555 +ENCODING 46421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B556 +ENCODING 46422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B557 +ENCODING 46423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B558 +ENCODING 46424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B559 +ENCODING 46425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B55A +ENCODING 46426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B55B +ENCODING 46427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B55C +ENCODING 46428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B55D +ENCODING 46429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B55E +ENCODING 46430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B55F +ENCODING 46431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B560 +ENCODING 46432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B561 +ENCODING 46433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B562 +ENCODING 46434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B563 +ENCODING 46435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B564 +ENCODING 46436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B565 +ENCODING 46437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B566 +ENCODING 46438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B567 +ENCODING 46439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +363E +3636 +1BF6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B568 +ENCODING 46440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +3618 +361F +3618 +3618 +361F +1BD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B569 +ENCODING 46441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B56A +ENCODING 46442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B56B +ENCODING 46443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B56C +ENCODING 46444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B56D +ENCODING 46445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B56E +ENCODING 46446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B56F +ENCODING 46447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B570 +ENCODING 46448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B571 +ENCODING 46449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B572 +ENCODING 46450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B573 +ENCODING 46451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B574 +ENCODING 46452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B575 +ENCODING 46453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B576 +ENCODING 46454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B577 +ENCODING 46455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B578 +ENCODING 46456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B579 +ENCODING 46457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B57A +ENCODING 46458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B57B +ENCODING 46459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B57C +ENCODING 46460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B57D +ENCODING 46461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B57E +ENCODING 46462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B57F +ENCODING 46463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B580 +ENCODING 46464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B581 +ENCODING 46465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B582 +ENCODING 46466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B583 +ENCODING 46467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3618 +361F +3618 +361F +1BD8 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B584 +ENCODING 46468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +3636 +363E +3636 +3636 +363E +1BF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B585 +ENCODING 46469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B586 +ENCODING 46470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B587 +ENCODING 46471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B588 +ENCODING 46472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B589 +ENCODING 46473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B58A +ENCODING 46474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B58B +ENCODING 46475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B58C +ENCODING 46476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B58D +ENCODING 46477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B58E +ENCODING 46478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B58F +ENCODING 46479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B590 +ENCODING 46480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B591 +ENCODING 46481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B592 +ENCODING 46482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B593 +ENCODING 46483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B594 +ENCODING 46484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B595 +ENCODING 46485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B596 +ENCODING 46486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B597 +ENCODING 46487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B598 +ENCODING 46488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B599 +ENCODING 46489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B59A +ENCODING 46490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B59B +ENCODING 46491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B59C +ENCODING 46492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B59D +ENCODING 46493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B59E +ENCODING 46494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B59F +ENCODING 46495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +363E +3636 +363E +1BF6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B5A0 +ENCODING 46496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +360C +360C +367C +360C +360C +1BCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B5A1 +ENCODING 46497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B5A2 +ENCODING 46498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B5A3 +ENCODING 46499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B5A4 +ENCODING 46500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +367C +360C +1BCC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B5A5 +ENCODING 46501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B5A6 +ENCODING 46502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B5A7 +ENCODING 46503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B5A8 +ENCODING 46504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B5A9 +ENCODING 46505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B5AA +ENCODING 46506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B5AB +ENCODING 46507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B5AC +ENCODING 46508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B5AD +ENCODING 46509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B5AE +ENCODING 46510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B5AF +ENCODING 46511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B5B0 +ENCODING 46512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B5B1 +ENCODING 46513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B5B2 +ENCODING 46514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B5B3 +ENCODING 46515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B5B4 +ENCODING 46516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B5B5 +ENCODING 46517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B5B6 +ENCODING 46518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B5B7 +ENCODING 46519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B5B8 +ENCODING 46520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B5B9 +ENCODING 46521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B5BA +ENCODING 46522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B5BB +ENCODING 46523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +36FC +360C +1BCC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B5BC +ENCODING 46524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +3636 +3636 +3676 +3636 +3636 +1BF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B5BD +ENCODING 46525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B5BE +ENCODING 46526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B5BF +ENCODING 46527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B5C0 +ENCODING 46528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +3676 +3636 +1BF6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B5C1 +ENCODING 46529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B5C2 +ENCODING 46530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B5C3 +ENCODING 46531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B5C4 +ENCODING 46532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B5C5 +ENCODING 46533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B5C6 +ENCODING 46534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B5C7 +ENCODING 46535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B5C8 +ENCODING 46536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B5C9 +ENCODING 46537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B5CA +ENCODING 46538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B5CB +ENCODING 46539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B5CC +ENCODING 46540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B5CD +ENCODING 46541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B5CE +ENCODING 46542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B5CF +ENCODING 46543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B5D0 +ENCODING 46544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B5D1 +ENCODING 46545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B5D2 +ENCODING 46546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B5D3 +ENCODING 46547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B5D4 +ENCODING 46548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B5D5 +ENCODING 46549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B5D6 +ENCODING 46550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B5D7 +ENCODING 46551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3636 +36F6 +3636 +1BF6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B5D8 +ENCODING 46552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +360C +367C +360C +367C +360C +1BCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B5D9 +ENCODING 46553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B5DA +ENCODING 46554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B5DB +ENCODING 46555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B5DC +ENCODING 46556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B5DD +ENCODING 46557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B5DE +ENCODING 46558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B5DF +ENCODING 46559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B5E0 +ENCODING 46560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B5E1 +ENCODING 46561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B5E2 +ENCODING 46562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B5E3 +ENCODING 46563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B5E4 +ENCODING 46564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B5E5 +ENCODING 46565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B5E6 +ENCODING 46566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B5E7 +ENCODING 46567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B5E8 +ENCODING 46568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B5E9 +ENCODING 46569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B5EA +ENCODING 46570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B5EB +ENCODING 46571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B5EC +ENCODING 46572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B5ED +ENCODING 46573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B5EE +ENCODING 46574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B5EF +ENCODING 46575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B5F0 +ENCODING 46576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B5F1 +ENCODING 46577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B5F2 +ENCODING 46578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B5F3 +ENCODING 46579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +367C +360C +367C +1BCC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B5F4 +ENCODING 46580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +3636 +3676 +3636 +3676 +3636 +1BF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B5F5 +ENCODING 46581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B5F6 +ENCODING 46582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B5F7 +ENCODING 46583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B5F8 +ENCODING 46584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +3676 +3636 +3676 +1BF6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B5F9 +ENCODING 46585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B5FA +ENCODING 46586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B5FB +ENCODING 46587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B5FC +ENCODING 46588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B5FD +ENCODING 46589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B5FE +ENCODING 46590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B5FF +ENCODING 46591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B600 +ENCODING 46592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B601 +ENCODING 46593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B602 +ENCODING 46594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B603 +ENCODING 46595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B604 +ENCODING 46596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B605 +ENCODING 46597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B606 +ENCODING 46598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B607 +ENCODING 46599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B608 +ENCODING 46600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B609 +ENCODING 46601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B60A +ENCODING 46602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B60B +ENCODING 46603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B60C +ENCODING 46604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B60D +ENCODING 46605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B60E +ENCODING 46606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B60F +ENCODING 46607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3636 +36F6 +3636 +36F6 +1BF6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B610 +ENCODING 46608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +18C0 +0F78 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B611 +ENCODING 46609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B612 +ENCODING 46610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B613 +ENCODING 46611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B614 +ENCODING 46612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B615 +ENCODING 46613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B616 +ENCODING 46614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B617 +ENCODING 46615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B618 +ENCODING 46616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B619 +ENCODING 46617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B61A +ENCODING 46618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B61B +ENCODING 46619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B61C +ENCODING 46620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B61D +ENCODING 46621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B61E +ENCODING 46622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B61F +ENCODING 46623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B620 +ENCODING 46624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B621 +ENCODING 46625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B622 +ENCODING 46626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B623 +ENCODING 46627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B624 +ENCODING 46628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B625 +ENCODING 46629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B626 +ENCODING 46630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B627 +ENCODING 46631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B628 +ENCODING 46632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B629 +ENCODING 46633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B62A +ENCODING 46634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B62B +ENCODING 46635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0180 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B62C +ENCODING 46636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +3318 +1DD8 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B62D +ENCODING 46637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B62E +ENCODING 46638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B62F +ENCODING 46639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B630 +ENCODING 46640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B631 +ENCODING 46641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B632 +ENCODING 46642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B633 +ENCODING 46643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B634 +ENCODING 46644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B635 +ENCODING 46645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B636 +ENCODING 46646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B637 +ENCODING 46647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B638 +ENCODING 46648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B639 +ENCODING 46649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B63A +ENCODING 46650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B63B +ENCODING 46651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B63C +ENCODING 46652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B63D +ENCODING 46653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B63E +ENCODING 46654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B63F +ENCODING 46655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B640 +ENCODING 46656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B641 +ENCODING 46657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B642 +ENCODING 46658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B643 +ENCODING 46659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B644 +ENCODING 46660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B645 +ENCODING 46661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B646 +ENCODING 46662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B647 +ENCODING 46663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +1DD8 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B648 +ENCODING 46664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DFE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B649 +ENCODING 46665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B64A +ENCODING 46666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B64B +ENCODING 46667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B64C +ENCODING 46668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B64D +ENCODING 46669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B64E +ENCODING 46670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B64F +ENCODING 46671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B650 +ENCODING 46672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B651 +ENCODING 46673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B652 +ENCODING 46674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B653 +ENCODING 46675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B654 +ENCODING 46676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B655 +ENCODING 46677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B656 +ENCODING 46678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B657 +ENCODING 46679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B658 +ENCODING 46680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B659 +ENCODING 46681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B65A +ENCODING 46682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B65B +ENCODING 46683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B65C +ENCODING 46684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B65D +ENCODING 46685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B65E +ENCODING 46686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B65F +ENCODING 46687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B660 +ENCODING 46688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B661 +ENCODING 46689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B662 +ENCODING 46690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B663 +ENCODING 46691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +1DF6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B664 +ENCODING 46692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B665 +ENCODING 46693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B666 +ENCODING 46694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B667 +ENCODING 46695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B668 +ENCODING 46696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B669 +ENCODING 46697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B66A +ENCODING 46698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B66B +ENCODING 46699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B66C +ENCODING 46700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B66D +ENCODING 46701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B66E +ENCODING 46702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B66F +ENCODING 46703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B670 +ENCODING 46704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B671 +ENCODING 46705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B672 +ENCODING 46706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B673 +ENCODING 46707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B674 +ENCODING 46708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B675 +ENCODING 46709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B676 +ENCODING 46710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B677 +ENCODING 46711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B678 +ENCODING 46712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B679 +ENCODING 46713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B67A +ENCODING 46714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B67B +ENCODING 46715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B67C +ENCODING 46716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B67D +ENCODING 46717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B67E +ENCODING 46718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B67F +ENCODING 46719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B680 +ENCODING 46720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +18C0 +0F78 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B681 +ENCODING 46721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B682 +ENCODING 46722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B683 +ENCODING 46723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B684 +ENCODING 46724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B685 +ENCODING 46725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B686 +ENCODING 46726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B687 +ENCODING 46727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B688 +ENCODING 46728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B689 +ENCODING 46729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B68A +ENCODING 46730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B68B +ENCODING 46731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B68C +ENCODING 46732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B68D +ENCODING 46733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B68E +ENCODING 46734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B68F +ENCODING 46735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B690 +ENCODING 46736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B691 +ENCODING 46737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B692 +ENCODING 46738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B693 +ENCODING 46739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B694 +ENCODING 46740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B695 +ENCODING 46741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B696 +ENCODING 46742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B697 +ENCODING 46743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B698 +ENCODING 46744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B699 +ENCODING 46745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B69A +ENCODING 46746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B69B +ENCODING 46747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0660 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B69C +ENCODING 46748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+B69D +ENCODING 46749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B69E +ENCODING 46750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B69F +ENCODING 46751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B6A0 +ENCODING 46752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B6A1 +ENCODING 46753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B6A2 +ENCODING 46754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B6A3 +ENCODING 46755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B6A4 +ENCODING 46756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B6A5 +ENCODING 46757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B6A6 +ENCODING 46758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B6A7 +ENCODING 46759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B6A8 +ENCODING 46760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B6A9 +ENCODING 46761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B6AA +ENCODING 46762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B6AB +ENCODING 46763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B6AC +ENCODING 46764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B6AD +ENCODING 46765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B6AE +ENCODING 46766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B6AF +ENCODING 46767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B6B0 +ENCODING 46768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B6B1 +ENCODING 46769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B6B2 +ENCODING 46770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B6B3 +ENCODING 46771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B6B4 +ENCODING 46772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B6B5 +ENCODING 46773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B6B6 +ENCODING 46774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B6B7 +ENCODING 46775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B6B8 +ENCODING 46776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B6B9 +ENCODING 46777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B6BA +ENCODING 46778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B6BB +ENCODING 46779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B6BC +ENCODING 46780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B6BD +ENCODING 46781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B6BE +ENCODING 46782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B6BF +ENCODING 46783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B6C0 +ENCODING 46784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B6C1 +ENCODING 46785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B6C2 +ENCODING 46786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B6C3 +ENCODING 46787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B6C4 +ENCODING 46788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B6C5 +ENCODING 46789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B6C6 +ENCODING 46790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B6C7 +ENCODING 46791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B6C8 +ENCODING 46792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B6C9 +ENCODING 46793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B6CA +ENCODING 46794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B6CB +ENCODING 46795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B6CC +ENCODING 46796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B6CD +ENCODING 46797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B6CE +ENCODING 46798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B6CF +ENCODING 46799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B6D0 +ENCODING 46800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B6D1 +ENCODING 46801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B6D2 +ENCODING 46802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B6D3 +ENCODING 46803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +330C +330C +330C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B6D4 +ENCODING 46804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B6D5 +ENCODING 46805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B6D6 +ENCODING 46806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B6D7 +ENCODING 46807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B6D8 +ENCODING 46808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +1DF6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B6D9 +ENCODING 46809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B6DA +ENCODING 46810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B6DB +ENCODING 46811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B6DC +ENCODING 46812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B6DD +ENCODING 46813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B6DE +ENCODING 46814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B6DF +ENCODING 46815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B6E0 +ENCODING 46816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B6E1 +ENCODING 46817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B6E2 +ENCODING 46818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B6E3 +ENCODING 46819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B6E4 +ENCODING 46820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B6E5 +ENCODING 46821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B6E6 +ENCODING 46822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B6E7 +ENCODING 46823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B6E8 +ENCODING 46824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B6E9 +ENCODING 46825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B6EA +ENCODING 46826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B6EB +ENCODING 46827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B6EC +ENCODING 46828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B6ED +ENCODING 46829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B6EE +ENCODING 46830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B6EF +ENCODING 46831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +1DF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B6F0 +ENCODING 46832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B6F1 +ENCODING 46833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B6F2 +ENCODING 46834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B6F3 +ENCODING 46835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B6F4 +ENCODING 46836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B6F5 +ENCODING 46837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B6F6 +ENCODING 46838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B6F7 +ENCODING 46839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B6F8 +ENCODING 46840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B6F9 +ENCODING 46841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B6FA +ENCODING 46842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B6FB +ENCODING 46843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B6FC +ENCODING 46844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B6FD +ENCODING 46845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B6FE +ENCODING 46846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B6FF +ENCODING 46847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B700 +ENCODING 46848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B701 +ENCODING 46849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B702 +ENCODING 46850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B703 +ENCODING 46851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B704 +ENCODING 46852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B705 +ENCODING 46853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B706 +ENCODING 46854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B707 +ENCODING 46855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B708 +ENCODING 46856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B709 +ENCODING 46857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B70A +ENCODING 46858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B70B +ENCODING 46859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +3306 +3306 +3306 +1DC6 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B70C +ENCODING 46860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +18C0 +0F78 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+B70D +ENCODING 46861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B70E +ENCODING 46862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B70F +ENCODING 46863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B710 +ENCODING 46864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B711 +ENCODING 46865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B712 +ENCODING 46866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B713 +ENCODING 46867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B714 +ENCODING 46868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B715 +ENCODING 46869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B716 +ENCODING 46870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B717 +ENCODING 46871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B718 +ENCODING 46872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B719 +ENCODING 46873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B71A +ENCODING 46874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B71B +ENCODING 46875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B71C +ENCODING 46876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B71D +ENCODING 46877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B71E +ENCODING 46878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B71F +ENCODING 46879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B720 +ENCODING 46880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B721 +ENCODING 46881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B722 +ENCODING 46882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B723 +ENCODING 46883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B724 +ENCODING 46884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B725 +ENCODING 46885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B726 +ENCODING 46886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B727 +ENCODING 46887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B728 +ENCODING 46888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +18C0 +0F78 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B729 +ENCODING 46889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B72A +ENCODING 46890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B72B +ENCODING 46891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B72C +ENCODING 46892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B72D +ENCODING 46893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B72E +ENCODING 46894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B72F +ENCODING 46895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B730 +ENCODING 46896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B731 +ENCODING 46897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B732 +ENCODING 46898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B733 +ENCODING 46899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B734 +ENCODING 46900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B735 +ENCODING 46901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B736 +ENCODING 46902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B737 +ENCODING 46903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B738 +ENCODING 46904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B739 +ENCODING 46905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B73A +ENCODING 46906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B73B +ENCODING 46907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B73C +ENCODING 46908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B73D +ENCODING 46909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B73E +ENCODING 46910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B73F +ENCODING 46911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B740 +ENCODING 46912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B741 +ENCODING 46913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B742 +ENCODING 46914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B743 +ENCODING 46915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +18C0 +18C0 +0F78 +0000 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B744 +ENCODING 46916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B745 +ENCODING 46917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B746 +ENCODING 46918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B747 +ENCODING 46919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B748 +ENCODING 46920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B749 +ENCODING 46921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B74A +ENCODING 46922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B74B +ENCODING 46923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B74C +ENCODING 46924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B74D +ENCODING 46925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B74E +ENCODING 46926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B74F +ENCODING 46927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B750 +ENCODING 46928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B751 +ENCODING 46929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B752 +ENCODING 46930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B753 +ENCODING 46931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B754 +ENCODING 46932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B755 +ENCODING 46933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B756 +ENCODING 46934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B757 +ENCODING 46935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B758 +ENCODING 46936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B759 +ENCODING 46937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B75A +ENCODING 46938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B75B +ENCODING 46939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B75C +ENCODING 46940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B75D +ENCODING 46941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B75E +ENCODING 46942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B75F +ENCODING 46943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +1DCC +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B760 +ENCODING 46944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +360C +360C +360C +360C +360C +1BCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B761 +ENCODING 46945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B762 +ENCODING 46946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B763 +ENCODING 46947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B764 +ENCODING 46948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B765 +ENCODING 46949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B766 +ENCODING 46950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B767 +ENCODING 46951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B768 +ENCODING 46952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B769 +ENCODING 46953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B76A +ENCODING 46954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B76B +ENCODING 46955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B76C +ENCODING 46956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B76D +ENCODING 46957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B76E +ENCODING 46958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B76F +ENCODING 46959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B770 +ENCODING 46960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B771 +ENCODING 46961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B772 +ENCODING 46962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B773 +ENCODING 46963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B774 +ENCODING 46964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B775 +ENCODING 46965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B776 +ENCODING 46966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B777 +ENCODING 46967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B778 +ENCODING 46968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B779 +ENCODING 46969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B77A +ENCODING 46970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B77B +ENCODING 46971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +360C +360C +360C +360C +1BCC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B77C +ENCODING 46972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B77D +ENCODING 46973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B77E +ENCODING 46974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B77F +ENCODING 46975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B780 +ENCODING 46976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B781 +ENCODING 46977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B782 +ENCODING 46978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B783 +ENCODING 46979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B784 +ENCODING 46980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B785 +ENCODING 46981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B786 +ENCODING 46982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B787 +ENCODING 46983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B788 +ENCODING 46984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B789 +ENCODING 46985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B78A +ENCODING 46986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B78B +ENCODING 46987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B78C +ENCODING 46988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B78D +ENCODING 46989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B78E +ENCODING 46990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B78F +ENCODING 46991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B790 +ENCODING 46992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B791 +ENCODING 46993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B792 +ENCODING 46994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B793 +ENCODING 46995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B794 +ENCODING 46996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B795 +ENCODING 46997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B796 +ENCODING 46998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B797 +ENCODING 46999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0198 +3F9F +3018 +3018 +1FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B798 +ENCODING 47000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3FB6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B799 +ENCODING 47001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B79A +ENCODING 47002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B79B +ENCODING 47003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B79C +ENCODING 47004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B79D +ENCODING 47005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B79E +ENCODING 47006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B79F +ENCODING 47007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B7A0 +ENCODING 47008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B7A1 +ENCODING 47009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B7A2 +ENCODING 47010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B7A3 +ENCODING 47011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B7A4 +ENCODING 47012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B7A5 +ENCODING 47013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B7A6 +ENCODING 47014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B7A7 +ENCODING 47015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B7A8 +ENCODING 47016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B7A9 +ENCODING 47017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B7AA +ENCODING 47018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B7AB +ENCODING 47019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B7AC +ENCODING 47020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B7AD +ENCODING 47021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B7AE +ENCODING 47022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B7AF +ENCODING 47023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B7B0 +ENCODING 47024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B7B1 +ENCODING 47025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B7B2 +ENCODING 47026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B7B3 +ENCODING 47027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FBE +3036 +3036 +1FF6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B7B4 +ENCODING 47028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +3F98 +0198 +019F +3F98 +3018 +301F +1FD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B7B5 +ENCODING 47029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B7B6 +ENCODING 47030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B7B7 +ENCODING 47031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B7B8 +ENCODING 47032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B7B9 +ENCODING 47033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B7BA +ENCODING 47034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B7BB +ENCODING 47035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B7BC +ENCODING 47036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B7BD +ENCODING 47037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B7BE +ENCODING 47038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B7BF +ENCODING 47039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B7C0 +ENCODING 47040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B7C1 +ENCODING 47041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B7C2 +ENCODING 47042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B7C3 +ENCODING 47043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B7C4 +ENCODING 47044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B7C5 +ENCODING 47045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B7C6 +ENCODING 47046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B7C7 +ENCODING 47047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B7C8 +ENCODING 47048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B7C9 +ENCODING 47049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B7CA +ENCODING 47050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B7CB +ENCODING 47051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B7CC +ENCODING 47052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B7CD +ENCODING 47053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B7CE +ENCODING 47054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B7CF +ENCODING 47055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +019F +3F98 +301F +3018 +1FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B7D0 +ENCODING 47056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3FB6 +01B6 +01BE +3FB6 +3036 +303E +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B7D1 +ENCODING 47057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B7D2 +ENCODING 47058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B7D3 +ENCODING 47059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B7D4 +ENCODING 47060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B7D5 +ENCODING 47061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B7D6 +ENCODING 47062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B7D7 +ENCODING 47063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B7D8 +ENCODING 47064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B7D9 +ENCODING 47065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B7DA +ENCODING 47066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B7DB +ENCODING 47067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B7DC +ENCODING 47068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B7DD +ENCODING 47069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B7DE +ENCODING 47070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B7DF +ENCODING 47071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B7E0 +ENCODING 47072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B7E1 +ENCODING 47073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B7E2 +ENCODING 47074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B7E3 +ENCODING 47075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B7E4 +ENCODING 47076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B7E5 +ENCODING 47077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B7E6 +ENCODING 47078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B7E7 +ENCODING 47079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B7E8 +ENCODING 47080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B7E9 +ENCODING 47081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B7EA +ENCODING 47082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B7EB +ENCODING 47083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01BE +3FB6 +303E +3036 +1FF6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B7EC +ENCODING 47084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +3F8C +018C +018C +3FFC +300C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B7ED +ENCODING 47085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B7EE +ENCODING 47086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B7EF +ENCODING 47087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B7F0 +ENCODING 47088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B7F1 +ENCODING 47089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B7F2 +ENCODING 47090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B7F3 +ENCODING 47091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B7F4 +ENCODING 47092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B7F5 +ENCODING 47093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B7F6 +ENCODING 47094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B7F7 +ENCODING 47095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B7F8 +ENCODING 47096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B7F9 +ENCODING 47097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B7FA +ENCODING 47098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B7FB +ENCODING 47099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B7FC +ENCODING 47100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B7FD +ENCODING 47101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B7FE +ENCODING 47102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B7FF +ENCODING 47103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B800 +ENCODING 47104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B801 +ENCODING 47105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B802 +ENCODING 47106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B803 +ENCODING 47107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B804 +ENCODING 47108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B805 +ENCODING 47109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B806 +ENCODING 47110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B807 +ENCODING 47111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3FFC +300C +300C +1FCC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B808 +ENCODING 47112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3FB6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B809 +ENCODING 47113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B80A +ENCODING 47114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B80B +ENCODING 47115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B80C +ENCODING 47116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B80D +ENCODING 47117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B80E +ENCODING 47118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B80F +ENCODING 47119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B810 +ENCODING 47120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B811 +ENCODING 47121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B812 +ENCODING 47122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B813 +ENCODING 47123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B814 +ENCODING 47124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B815 +ENCODING 47125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B816 +ENCODING 47126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B817 +ENCODING 47127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B818 +ENCODING 47128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B819 +ENCODING 47129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B81A +ENCODING 47130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B81B +ENCODING 47131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B81C +ENCODING 47132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B81D +ENCODING 47133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B81E +ENCODING 47134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B81F +ENCODING 47135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B820 +ENCODING 47136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B821 +ENCODING 47137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B822 +ENCODING 47138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B823 +ENCODING 47139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01B6 +3FF6 +3036 +3036 +1FF6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B824 +ENCODING 47140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B825 +ENCODING 47141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B826 +ENCODING 47142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B827 +ENCODING 47143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B828 +ENCODING 47144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B829 +ENCODING 47145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B82A +ENCODING 47146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B82B +ENCODING 47147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B82C +ENCODING 47148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B82D +ENCODING 47149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B82E +ENCODING 47150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B82F +ENCODING 47151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B830 +ENCODING 47152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B831 +ENCODING 47153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B832 +ENCODING 47154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B833 +ENCODING 47155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B834 +ENCODING 47156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B835 +ENCODING 47157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B836 +ENCODING 47158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B837 +ENCODING 47159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B838 +ENCODING 47160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B839 +ENCODING 47161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B83A +ENCODING 47162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B83B +ENCODING 47163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B83C +ENCODING 47164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B83D +ENCODING 47165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B83E +ENCODING 47166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B83F +ENCODING 47167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +01FC +3F8C +307C +300C +1FCC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B840 +ENCODING 47168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3FB6 +01B6 +01F6 +3FB6 +3076 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B841 +ENCODING 47169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B842 +ENCODING 47170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B843 +ENCODING 47171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B844 +ENCODING 47172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +3076 +3036 +1FF6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B845 +ENCODING 47173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B846 +ENCODING 47174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B847 +ENCODING 47175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B848 +ENCODING 47176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B849 +ENCODING 47177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B84A +ENCODING 47178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B84B +ENCODING 47179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B84C +ENCODING 47180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B84D +ENCODING 47181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B84E +ENCODING 47182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B84F +ENCODING 47183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B850 +ENCODING 47184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B851 +ENCODING 47185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B852 +ENCODING 47186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B853 +ENCODING 47187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B854 +ENCODING 47188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B855 +ENCODING 47189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B856 +ENCODING 47190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B857 +ENCODING 47191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B858 +ENCODING 47192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B859 +ENCODING 47193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B85A +ENCODING 47194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B85B +ENCODING 47195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +01F6 +3FB6 +30F6 +3036 +1FF6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B85C +ENCODING 47196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B85D +ENCODING 47197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B85E +ENCODING 47198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B85F +ENCODING 47199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B860 +ENCODING 47200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B861 +ENCODING 47201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B862 +ENCODING 47202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B863 +ENCODING 47203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B864 +ENCODING 47204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B865 +ENCODING 47205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B866 +ENCODING 47206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B867 +ENCODING 47207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B868 +ENCODING 47208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B869 +ENCODING 47209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B86A +ENCODING 47210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B86B +ENCODING 47211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B86C +ENCODING 47212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B86D +ENCODING 47213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B86E +ENCODING 47214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B86F +ENCODING 47215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B870 +ENCODING 47216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B871 +ENCODING 47217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B872 +ENCODING 47218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B873 +ENCODING 47219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B874 +ENCODING 47220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B875 +ENCODING 47221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B876 +ENCODING 47222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B877 +ENCODING 47223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B878 +ENCODING 47224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +3018 +1F98 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B879 +ENCODING 47225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B87A +ENCODING 47226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B87B +ENCODING 47227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B87C +ENCODING 47228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B87D +ENCODING 47229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B87E +ENCODING 47230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B87F +ENCODING 47231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B880 +ENCODING 47232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B881 +ENCODING 47233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B882 +ENCODING 47234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B883 +ENCODING 47235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B884 +ENCODING 47236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B885 +ENCODING 47237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B886 +ENCODING 47238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B887 +ENCODING 47239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B888 +ENCODING 47240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B889 +ENCODING 47241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B88A +ENCODING 47242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B88B +ENCODING 47243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B88C +ENCODING 47244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B88D +ENCODING 47245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B88E +ENCODING 47246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B88F +ENCODING 47247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B890 +ENCODING 47248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B891 +ENCODING 47249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B892 +ENCODING 47250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B893 +ENCODING 47251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B894 +ENCODING 47252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FBE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B895 +ENCODING 47253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B896 +ENCODING 47254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B897 +ENCODING 47255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B898 +ENCODING 47256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B899 +ENCODING 47257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B89A +ENCODING 47258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B89B +ENCODING 47259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B89C +ENCODING 47260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B89D +ENCODING 47261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B89E +ENCODING 47262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B89F +ENCODING 47263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B8A0 +ENCODING 47264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B8A1 +ENCODING 47265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B8A2 +ENCODING 47266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B8A3 +ENCODING 47267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B8A4 +ENCODING 47268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B8A5 +ENCODING 47269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B8A6 +ENCODING 47270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B8A7 +ENCODING 47271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B8A8 +ENCODING 47272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B8A9 +ENCODING 47273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B8AA +ENCODING 47274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B8AB +ENCODING 47275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B8AC +ENCODING 47276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B8AD +ENCODING 47277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B8AE +ENCODING 47278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B8AF +ENCODING 47279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B8B0 +ENCODING 47280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B8B1 +ENCODING 47281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B8B2 +ENCODING 47282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B8B3 +ENCODING 47283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B8B4 +ENCODING 47284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B8B5 +ENCODING 47285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B8B6 +ENCODING 47286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B8B7 +ENCODING 47287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B8B8 +ENCODING 47288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B8B9 +ENCODING 47289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B8BA +ENCODING 47290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B8BB +ENCODING 47291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B8BC +ENCODING 47292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B8BD +ENCODING 47293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B8BE +ENCODING 47294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B8BF +ENCODING 47295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B8C0 +ENCODING 47296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B8C1 +ENCODING 47297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B8C2 +ENCODING 47298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B8C3 +ENCODING 47299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B8C4 +ENCODING 47300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B8C5 +ENCODING 47301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B8C6 +ENCODING 47302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B8C7 +ENCODING 47303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B8C8 +ENCODING 47304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B8C9 +ENCODING 47305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B8CA +ENCODING 47306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B8CB +ENCODING 47307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B8CC +ENCODING 47308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B8CD +ENCODING 47309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B8CE +ENCODING 47310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B8CF +ENCODING 47311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B8D0 +ENCODING 47312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B8D1 +ENCODING 47313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B8D2 +ENCODING 47314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B8D3 +ENCODING 47315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B8D4 +ENCODING 47316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B8D5 +ENCODING 47317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B8D6 +ENCODING 47318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B8D7 +ENCODING 47319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B8D8 +ENCODING 47320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B8D9 +ENCODING 47321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B8DA +ENCODING 47322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B8DB +ENCODING 47323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B8DC +ENCODING 47324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B8DD +ENCODING 47325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B8DE +ENCODING 47326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B8DF +ENCODING 47327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B8E0 +ENCODING 47328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B8E1 +ENCODING 47329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B8E2 +ENCODING 47330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B8E3 +ENCODING 47331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B8E4 +ENCODING 47332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B8E5 +ENCODING 47333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B8E6 +ENCODING 47334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B8E7 +ENCODING 47335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B8E8 +ENCODING 47336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+B8E9 +ENCODING 47337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B8EA +ENCODING 47338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B8EB +ENCODING 47339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B8EC +ENCODING 47340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B8ED +ENCODING 47341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B8EE +ENCODING 47342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B8EF +ENCODING 47343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B8F0 +ENCODING 47344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B8F1 +ENCODING 47345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B8F2 +ENCODING 47346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B8F3 +ENCODING 47347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B8F4 +ENCODING 47348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B8F5 +ENCODING 47349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B8F6 +ENCODING 47350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B8F7 +ENCODING 47351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B8F8 +ENCODING 47352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B8F9 +ENCODING 47353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B8FA +ENCODING 47354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B8FB +ENCODING 47355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B8FC +ENCODING 47356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B8FD +ENCODING 47357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B8FE +ENCODING 47358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B8FF +ENCODING 47359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B900 +ENCODING 47360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B901 +ENCODING 47361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B902 +ENCODING 47362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B903 +ENCODING 47363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B904 +ENCODING 47364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B905 +ENCODING 47365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B906 +ENCODING 47366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B907 +ENCODING 47367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B908 +ENCODING 47368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B909 +ENCODING 47369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B90A +ENCODING 47370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B90B +ENCODING 47371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B90C +ENCODING 47372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B90D +ENCODING 47373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B90E +ENCODING 47374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B90F +ENCODING 47375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B910 +ENCODING 47376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B911 +ENCODING 47377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B912 +ENCODING 47378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B913 +ENCODING 47379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B914 +ENCODING 47380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B915 +ENCODING 47381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B916 +ENCODING 47382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B917 +ENCODING 47383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B918 +ENCODING 47384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B919 +ENCODING 47385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B91A +ENCODING 47386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B91B +ENCODING 47387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B91C +ENCODING 47388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B91D +ENCODING 47389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B91E +ENCODING 47390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B91F +ENCODING 47391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +300C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B920 +ENCODING 47392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FB6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B921 +ENCODING 47393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B922 +ENCODING 47394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B923 +ENCODING 47395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B924 +ENCODING 47396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +30F6 +1FB6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B925 +ENCODING 47397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B926 +ENCODING 47398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B927 +ENCODING 47399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B928 +ENCODING 47400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B929 +ENCODING 47401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B92A +ENCODING 47402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B92B +ENCODING 47403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B92C +ENCODING 47404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B92D +ENCODING 47405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B92E +ENCODING 47406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B92F +ENCODING 47407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B930 +ENCODING 47408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B931 +ENCODING 47409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B932 +ENCODING 47410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B933 +ENCODING 47411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B934 +ENCODING 47412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B935 +ENCODING 47413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B936 +ENCODING 47414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B937 +ENCODING 47415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B938 +ENCODING 47416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B939 +ENCODING 47417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B93A +ENCODING 47418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B93B +ENCODING 47419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B93C +ENCODING 47420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+B93D +ENCODING 47421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B93E +ENCODING 47422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B93F +ENCODING 47423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B940 +ENCODING 47424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B941 +ENCODING 47425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B942 +ENCODING 47426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B943 +ENCODING 47427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B944 +ENCODING 47428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B945 +ENCODING 47429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B946 +ENCODING 47430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B947 +ENCODING 47431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B948 +ENCODING 47432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B949 +ENCODING 47433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B94A +ENCODING 47434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B94B +ENCODING 47435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B94C +ENCODING 47436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B94D +ENCODING 47437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B94E +ENCODING 47438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B94F +ENCODING 47439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B950 +ENCODING 47440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B951 +ENCODING 47441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B952 +ENCODING 47442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B953 +ENCODING 47443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B954 +ENCODING 47444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B955 +ENCODING 47445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B956 +ENCODING 47446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B957 +ENCODING 47447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B958 +ENCODING 47448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+B959 +ENCODING 47449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B95A +ENCODING 47450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B95B +ENCODING 47451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B95C +ENCODING 47452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B95D +ENCODING 47453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B95E +ENCODING 47454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B95F +ENCODING 47455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B960 +ENCODING 47456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B961 +ENCODING 47457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B962 +ENCODING 47458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B963 +ENCODING 47459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B964 +ENCODING 47460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B965 +ENCODING 47461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B966 +ENCODING 47462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B967 +ENCODING 47463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B968 +ENCODING 47464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B969 +ENCODING 47465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B96A +ENCODING 47466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B96B +ENCODING 47467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B96C +ENCODING 47468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B96D +ENCODING 47469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B96E +ENCODING 47470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B96F +ENCODING 47471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B970 +ENCODING 47472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B971 +ENCODING 47473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B972 +ENCODING 47474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B973 +ENCODING 47475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B974 +ENCODING 47476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+B975 +ENCODING 47477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B976 +ENCODING 47478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+B977 +ENCODING 47479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B978 +ENCODING 47480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B979 +ENCODING 47481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+B97A +ENCODING 47482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+B97B +ENCODING 47483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B97C +ENCODING 47484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B97D +ENCODING 47485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+B97E +ENCODING 47486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+B97F +ENCODING 47487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B980 +ENCODING 47488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+B981 +ENCODING 47489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B982 +ENCODING 47490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B983 +ENCODING 47491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+B984 +ENCODING 47492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+B985 +ENCODING 47493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B986 +ENCODING 47494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+B987 +ENCODING 47495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+B988 +ENCODING 47496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+B989 +ENCODING 47497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B98A +ENCODING 47498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B98B +ENCODING 47499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+B98C +ENCODING 47500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B98D +ENCODING 47501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B98E +ENCODING 47502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+B98F +ENCODING 47503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+B990 +ENCODING 47504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B991 +ENCODING 47505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B992 +ENCODING 47506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B993 +ENCODING 47507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B994 +ENCODING 47508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B995 +ENCODING 47509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B996 +ENCODING 47510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B997 +ENCODING 47511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B998 +ENCODING 47512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B999 +ENCODING 47513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B99A +ENCODING 47514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B99B +ENCODING 47515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B99C +ENCODING 47516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B99D +ENCODING 47517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B99E +ENCODING 47518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B99F +ENCODING 47519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B9A0 +ENCODING 47520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B9A1 +ENCODING 47521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B9A2 +ENCODING 47522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B9A3 +ENCODING 47523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9A4 +ENCODING 47524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B9A5 +ENCODING 47525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B9A6 +ENCODING 47526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9A7 +ENCODING 47527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9A8 +ENCODING 47528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B9A9 +ENCODING 47529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B9AA +ENCODING 47530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B9AB +ENCODING 47531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +300C +1F8C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B9AC +ENCODING 47532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +3F8C +018C +018C +3F8C +300C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B9AD +ENCODING 47533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B9AE +ENCODING 47534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+B9AF +ENCODING 47535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+B9B0 +ENCODING 47536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B9B1 +ENCODING 47537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+B9B2 +ENCODING 47538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+B9B3 +ENCODING 47539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B9B4 +ENCODING 47540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+B9B5 +ENCODING 47541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+B9B6 +ENCODING 47542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B9B7 +ENCODING 47543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B9B8 +ENCODING 47544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B9B9 +ENCODING 47545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B9BA +ENCODING 47546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B9BB +ENCODING 47547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B9BC +ENCODING 47548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B9BD +ENCODING 47549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+B9BE +ENCODING 47550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B9BF +ENCODING 47551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9C0 +ENCODING 47552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B9C1 +ENCODING 47553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B9C2 +ENCODING 47554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9C3 +ENCODING 47555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9C4 +ENCODING 47556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+B9C5 +ENCODING 47557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B9C6 +ENCODING 47558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B9C7 +ENCODING 47559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +018C +3F8C +300C +300C +1FCC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+B9C8 +ENCODING 47560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +3198 +3198 +319F +3198 +3198 +3F98 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B9C9 +ENCODING 47561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B9CA +ENCODING 47562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+B9CB +ENCODING 47563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+B9CC +ENCODING 47564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B9CD +ENCODING 47565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+B9CE +ENCODING 47566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+B9CF +ENCODING 47567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B9D0 +ENCODING 47568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+B9D1 +ENCODING 47569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+B9D2 +ENCODING 47570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B9D3 +ENCODING 47571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+B9D4 +ENCODING 47572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+B9D5 +ENCODING 47573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+B9D6 +ENCODING 47574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B9D7 +ENCODING 47575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B9D8 +ENCODING 47576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B9D9 +ENCODING 47577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+B9DA +ENCODING 47578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B9DB +ENCODING 47579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9DC +ENCODING 47580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+B9DD +ENCODING 47581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B9DE +ENCODING 47582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9DF +ENCODING 47583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+B9E0 +ENCODING 47584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+B9E1 +ENCODING 47585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+B9E2 +ENCODING 47586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+B9E3 +ENCODING 47587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3198 +3F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+B9E4 +ENCODING 47588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +31B6 +31B6 +31BE +31B6 +31B6 +3FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+B9E5 +ENCODING 47589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B9E6 +ENCODING 47590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+B9E7 +ENCODING 47591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+B9E8 +ENCODING 47592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B9E9 +ENCODING 47593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+B9EA +ENCODING 47594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+B9EB +ENCODING 47595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+B9EC +ENCODING 47596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+B9ED +ENCODING 47597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+B9EE +ENCODING 47598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B9EF +ENCODING 47599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+B9F0 +ENCODING 47600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+B9F1 +ENCODING 47601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+B9F2 +ENCODING 47602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+B9F3 +ENCODING 47603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+B9F4 +ENCODING 47604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B9F5 +ENCODING 47605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+B9F6 +ENCODING 47606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+B9F7 +ENCODING 47607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+B9F8 +ENCODING 47608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+B9F9 +ENCODING 47609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+B9FA +ENCODING 47610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B9FB +ENCODING 47611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+B9FC +ENCODING 47612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+B9FD +ENCODING 47613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+B9FE +ENCODING 47614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+B9FF +ENCODING 47615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +31B6 +3FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BA00 +ENCODING 47616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +3198 +319F +3198 +3198 +319F +3F98 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BA01 +ENCODING 47617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BA02 +ENCODING 47618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BA03 +ENCODING 47619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BA04 +ENCODING 47620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA05 +ENCODING 47621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BA06 +ENCODING 47622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BA07 +ENCODING 47623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BA08 +ENCODING 47624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BA09 +ENCODING 47625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BA0A +ENCODING 47626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BA0B +ENCODING 47627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BA0C +ENCODING 47628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BA0D +ENCODING 47629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BA0E +ENCODING 47630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BA0F +ENCODING 47631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BA10 +ENCODING 47632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BA11 +ENCODING 47633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BA12 +ENCODING 47634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BA13 +ENCODING 47635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA14 +ENCODING 47636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BA15 +ENCODING 47637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BA16 +ENCODING 47638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA17 +ENCODING 47639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA18 +ENCODING 47640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BA19 +ENCODING 47641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BA1A +ENCODING 47642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BA1B +ENCODING 47643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +319F +3198 +319F +3F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BA1C +ENCODING 47644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +31B6 +31BE +31B6 +31B6 +31BE +3FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BA1D +ENCODING 47645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BA1E +ENCODING 47646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BA1F +ENCODING 47647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BA20 +ENCODING 47648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BA21 +ENCODING 47649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BA22 +ENCODING 47650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BA23 +ENCODING 47651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA24 +ENCODING 47652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BA25 +ENCODING 47653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BA26 +ENCODING 47654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BA27 +ENCODING 47655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BA28 +ENCODING 47656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BA29 +ENCODING 47657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BA2A +ENCODING 47658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BA2B +ENCODING 47659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BA2C +ENCODING 47660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BA2D +ENCODING 47661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BA2E +ENCODING 47662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BA2F +ENCODING 47663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BA30 +ENCODING 47664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BA31 +ENCODING 47665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BA32 +ENCODING 47666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BA33 +ENCODING 47667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BA34 +ENCODING 47668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BA35 +ENCODING 47669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BA36 +ENCODING 47670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BA37 +ENCODING 47671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31BE +31B6 +31BE +3FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BA38 +ENCODING 47672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +318C +318C +31FC +318C +318C +3F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BA39 +ENCODING 47673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BA3A +ENCODING 47674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BA3B +ENCODING 47675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BA3C +ENCODING 47676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA3D +ENCODING 47677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BA3E +ENCODING 47678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BA3F +ENCODING 47679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA40 +ENCODING 47680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BA41 +ENCODING 47681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BA42 +ENCODING 47682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BA43 +ENCODING 47683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BA44 +ENCODING 47684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BA45 +ENCODING 47685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BA46 +ENCODING 47686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BA47 +ENCODING 47687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BA48 +ENCODING 47688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BA49 +ENCODING 47689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BA4A +ENCODING 47690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BA4B +ENCODING 47691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA4C +ENCODING 47692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BA4D +ENCODING 47693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BA4E +ENCODING 47694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA4F +ENCODING 47695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA50 +ENCODING 47696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BA51 +ENCODING 47697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA52 +ENCODING 47698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BA53 +ENCODING 47699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +31FC +318C +3F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BA54 +ENCODING 47700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +31B6 +31B6 +31F6 +31B6 +31B6 +3FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BA55 +ENCODING 47701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BA56 +ENCODING 47702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BA57 +ENCODING 47703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BA58 +ENCODING 47704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BA59 +ENCODING 47705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BA5A +ENCODING 47706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BA5B +ENCODING 47707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA5C +ENCODING 47708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BA5D +ENCODING 47709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BA5E +ENCODING 47710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BA5F +ENCODING 47711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BA60 +ENCODING 47712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BA61 +ENCODING 47713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BA62 +ENCODING 47714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BA63 +ENCODING 47715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BA64 +ENCODING 47716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BA65 +ENCODING 47717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BA66 +ENCODING 47718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BA67 +ENCODING 47719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BA68 +ENCODING 47720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BA69 +ENCODING 47721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BA6A +ENCODING 47722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BA6B +ENCODING 47723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BA6C +ENCODING 47724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BA6D +ENCODING 47725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BA6E +ENCODING 47726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BA6F +ENCODING 47727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +31B6 +3FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BA70 +ENCODING 47728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +318C +31FC +318C +31FC +318C +3F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BA71 +ENCODING 47729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BA72 +ENCODING 47730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BA73 +ENCODING 47731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BA74 +ENCODING 47732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA75 +ENCODING 47733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BA76 +ENCODING 47734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BA77 +ENCODING 47735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA78 +ENCODING 47736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BA79 +ENCODING 47737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BA7A +ENCODING 47738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BA7B +ENCODING 47739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BA7C +ENCODING 47740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BA7D +ENCODING 47741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BA7E +ENCODING 47742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BA7F +ENCODING 47743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BA80 +ENCODING 47744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BA81 +ENCODING 47745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BA82 +ENCODING 47746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BA83 +ENCODING 47747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA84 +ENCODING 47748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BA85 +ENCODING 47749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BA86 +ENCODING 47750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA87 +ENCODING 47751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BA88 +ENCODING 47752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BA89 +ENCODING 47753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA8A +ENCODING 47754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BA8B +ENCODING 47755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +31FC +318C +31FC +3F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BA8C +ENCODING 47756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +31B6 +31F6 +31B6 +31F6 +31B6 +3FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BA8D +ENCODING 47757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BA8E +ENCODING 47758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BA8F +ENCODING 47759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BA90 +ENCODING 47760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BA91 +ENCODING 47761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BA92 +ENCODING 47762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BA93 +ENCODING 47763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BA94 +ENCODING 47764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BA95 +ENCODING 47765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BA96 +ENCODING 47766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BA97 +ENCODING 47767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BA98 +ENCODING 47768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BA99 +ENCODING 47769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BA9A +ENCODING 47770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BA9B +ENCODING 47771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BA9C +ENCODING 47772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BA9D +ENCODING 47773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BA9E +ENCODING 47774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BA9F +ENCODING 47775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BAA0 +ENCODING 47776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BAA1 +ENCODING 47777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BAA2 +ENCODING 47778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BAA3 +ENCODING 47779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BAA4 +ENCODING 47780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BAA5 +ENCODING 47781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BAA6 +ENCODING 47782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BAA7 +ENCODING 47783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31F6 +31B6 +31F6 +3FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BAA8 +ENCODING 47784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1830 +1830 +1830 +1FF0 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+BAA9 +ENCODING 47785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BAAA +ENCODING 47786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BAAB +ENCODING 47787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BAAC +ENCODING 47788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BAAD +ENCODING 47789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BAAE +ENCODING 47790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BAAF +ENCODING 47791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BAB0 +ENCODING 47792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BAB1 +ENCODING 47793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BAB2 +ENCODING 47794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BAB3 +ENCODING 47795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BAB4 +ENCODING 47796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BAB5 +ENCODING 47797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BAB6 +ENCODING 47798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BAB7 +ENCODING 47799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BAB8 +ENCODING 47800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BAB9 +ENCODING 47801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BABA +ENCODING 47802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BABB +ENCODING 47803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BABC +ENCODING 47804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BABD +ENCODING 47805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BABE +ENCODING 47806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BABF +ENCODING 47807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BAC0 +ENCODING 47808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BAC1 +ENCODING 47809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BAC2 +ENCODING 47810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BAC3 +ENCODING 47811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0180 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BAC4 +ENCODING 47812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +3198 +3F98 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BAC5 +ENCODING 47813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BAC6 +ENCODING 47814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BAC7 +ENCODING 47815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BAC8 +ENCODING 47816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BAC9 +ENCODING 47817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BACA +ENCODING 47818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BACB +ENCODING 47819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BACC +ENCODING 47820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BACD +ENCODING 47821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BACE +ENCODING 47822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BACF +ENCODING 47823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BAD0 +ENCODING 47824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BAD1 +ENCODING 47825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BAD2 +ENCODING 47826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BAD3 +ENCODING 47827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BAD4 +ENCODING 47828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BAD5 +ENCODING 47829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BAD6 +ENCODING 47830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BAD7 +ENCODING 47831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BAD8 +ENCODING 47832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BAD9 +ENCODING 47833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BADA +ENCODING 47834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BADB +ENCODING 47835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BADC +ENCODING 47836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BADD +ENCODING 47837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BADE +ENCODING 47838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BADF +ENCODING 47839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3198 +3198 +319F +3F98 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BAE0 +ENCODING 47840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FBE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BAE1 +ENCODING 47841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BAE2 +ENCODING 47842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BAE3 +ENCODING 47843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BAE4 +ENCODING 47844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BAE5 +ENCODING 47845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BAE6 +ENCODING 47846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BAE7 +ENCODING 47847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BAE8 +ENCODING 47848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BAE9 +ENCODING 47849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BAEA +ENCODING 47850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BAEB +ENCODING 47851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BAEC +ENCODING 47852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BAED +ENCODING 47853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BAEE +ENCODING 47854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BAEF +ENCODING 47855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BAF0 +ENCODING 47856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BAF1 +ENCODING 47857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BAF2 +ENCODING 47858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BAF3 +ENCODING 47859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BAF4 +ENCODING 47860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BAF5 +ENCODING 47861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BAF6 +ENCODING 47862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BAF7 +ENCODING 47863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BAF8 +ENCODING 47864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BAF9 +ENCODING 47865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BAFA +ENCODING 47866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BAFB +ENCODING 47867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31BE +3FB6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BAFC +ENCODING 47868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BAFD +ENCODING 47869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BAFE +ENCODING 47870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BAFF +ENCODING 47871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BB00 +ENCODING 47872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB01 +ENCODING 47873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BB02 +ENCODING 47874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BB03 +ENCODING 47875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BB04 +ENCODING 47876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BB05 +ENCODING 47877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BB06 +ENCODING 47878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB07 +ENCODING 47879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB08 +ENCODING 47880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BB09 +ENCODING 47881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BB0A +ENCODING 47882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BB0B +ENCODING 47883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BB0C +ENCODING 47884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BB0D +ENCODING 47885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BB0E +ENCODING 47886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BB0F +ENCODING 47887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB10 +ENCODING 47888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BB11 +ENCODING 47889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BB12 +ENCODING 47890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB13 +ENCODING 47891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB14 +ENCODING 47892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BB15 +ENCODING 47893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BB16 +ENCODING 47894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BB17 +ENCODING 47895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BB18 +ENCODING 47896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1830 +1830 +1830 +1FF0 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+BB19 +ENCODING 47897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BB1A +ENCODING 47898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BB1B +ENCODING 47899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BB1C +ENCODING 47900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BB1D +ENCODING 47901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BB1E +ENCODING 47902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BB1F +ENCODING 47903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BB20 +ENCODING 47904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BB21 +ENCODING 47905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BB22 +ENCODING 47906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BB23 +ENCODING 47907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB24 +ENCODING 47908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BB25 +ENCODING 47909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BB26 +ENCODING 47910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BB27 +ENCODING 47911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BB28 +ENCODING 47912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BB29 +ENCODING 47913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BB2A +ENCODING 47914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BB2B +ENCODING 47915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BB2C +ENCODING 47916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BB2D +ENCODING 47917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BB2E +ENCODING 47918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BB2F +ENCODING 47919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BB30 +ENCODING 47920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BB31 +ENCODING 47921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BB32 +ENCODING 47922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BB33 +ENCODING 47923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0660 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BB34 +ENCODING 47924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1830 +1830 +1830 +1FF0 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+BB35 +ENCODING 47925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BB36 +ENCODING 47926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BB37 +ENCODING 47927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BB38 +ENCODING 47928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BB39 +ENCODING 47929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BB3A +ENCODING 47930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BB3B +ENCODING 47931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BB3C +ENCODING 47932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BB3D +ENCODING 47933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BB3E +ENCODING 47934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BB3F +ENCODING 47935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB40 +ENCODING 47936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BB41 +ENCODING 47937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BB42 +ENCODING 47938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BB43 +ENCODING 47939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BB44 +ENCODING 47940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BB45 +ENCODING 47941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BB46 +ENCODING 47942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BB47 +ENCODING 47943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BB48 +ENCODING 47944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BB49 +ENCODING 47945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BB4A +ENCODING 47946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BB4B +ENCODING 47947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BB4C +ENCODING 47948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BB4D +ENCODING 47949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BB4E +ENCODING 47950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BB4F +ENCODING 47951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BB50 +ENCODING 47952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+BB51 +ENCODING 47953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BB52 +ENCODING 47954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BB53 +ENCODING 47955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BB54 +ENCODING 47956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB55 +ENCODING 47957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BB56 +ENCODING 47958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BB57 +ENCODING 47959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB58 +ENCODING 47960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BB59 +ENCODING 47961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BB5A +ENCODING 47962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB5B +ENCODING 47963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB5C +ENCODING 47964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BB5D +ENCODING 47965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BB5E +ENCODING 47966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BB5F +ENCODING 47967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BB60 +ENCODING 47968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BB61 +ENCODING 47969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BB62 +ENCODING 47970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BB63 +ENCODING 47971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB64 +ENCODING 47972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BB65 +ENCODING 47973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BB66 +ENCODING 47974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB67 +ENCODING 47975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB68 +ENCODING 47976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BB69 +ENCODING 47977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB6A +ENCODING 47978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BB6B +ENCODING 47979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +318C +318C +318C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BB6C +ENCODING 47980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FB6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BB6D +ENCODING 47981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BB6E +ENCODING 47982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BB6F +ENCODING 47983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BB70 +ENCODING 47984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31F6 +3FB6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB71 +ENCODING 47985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BB72 +ENCODING 47986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BB73 +ENCODING 47987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB74 +ENCODING 47988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BB75 +ENCODING 47989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BB76 +ENCODING 47990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB77 +ENCODING 47991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB78 +ENCODING 47992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BB79 +ENCODING 47993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BB7A +ENCODING 47994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BB7B +ENCODING 47995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BB7C +ENCODING 47996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BB7D +ENCODING 47997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BB7E +ENCODING 47998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BB7F +ENCODING 47999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB80 +ENCODING 48000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BB81 +ENCODING 48001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BB82 +ENCODING 48002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB83 +ENCODING 48003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB84 +ENCODING 48004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BB85 +ENCODING 48005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB86 +ENCODING 48006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BB87 +ENCODING 48007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +31B6 +31B6 +31B6 +3FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BB88 +ENCODING 48008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+BB89 +ENCODING 48009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BB8A +ENCODING 48010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BB8B +ENCODING 48011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BB8C +ENCODING 48012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB8D +ENCODING 48013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BB8E +ENCODING 48014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BB8F +ENCODING 48015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BB90 +ENCODING 48016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BB91 +ENCODING 48017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BB92 +ENCODING 48018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB93 +ENCODING 48019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BB94 +ENCODING 48020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BB95 +ENCODING 48021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BB96 +ENCODING 48022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BB97 +ENCODING 48023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BB98 +ENCODING 48024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BB99 +ENCODING 48025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BB9A +ENCODING 48026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BB9B +ENCODING 48027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB9C +ENCODING 48028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BB9D +ENCODING 48029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BB9E +ENCODING 48030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BB9F +ENCODING 48031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BBA0 +ENCODING 48032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BBA1 +ENCODING 48033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BBA2 +ENCODING 48034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BBA3 +ENCODING 48035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3186 +3186 +3186 +3F86 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BBA4 +ENCODING 48036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1830 +1830 +1830 +1FF0 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+BBA5 +ENCODING 48037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BBA6 +ENCODING 48038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BBA7 +ENCODING 48039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BBA8 +ENCODING 48040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BBA9 +ENCODING 48041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BBAA +ENCODING 48042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BBAB +ENCODING 48043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BBAC +ENCODING 48044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BBAD +ENCODING 48045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BBAE +ENCODING 48046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BBAF +ENCODING 48047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BBB0 +ENCODING 48048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BBB1 +ENCODING 48049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BBB2 +ENCODING 48050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BBB3 +ENCODING 48051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BBB4 +ENCODING 48052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BBB5 +ENCODING 48053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BBB6 +ENCODING 48054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BBB7 +ENCODING 48055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BBB8 +ENCODING 48056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BBB9 +ENCODING 48057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BBBA +ENCODING 48058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BBBB +ENCODING 48059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BBBC +ENCODING 48060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BBBD +ENCODING 48061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BBBE +ENCODING 48062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BBBF +ENCODING 48063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BBC0 +ENCODING 48064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF0 +1830 +1830 +1830 +1FF0 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+BBC1 +ENCODING 48065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BBC2 +ENCODING 48066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BBC3 +ENCODING 48067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BBC4 +ENCODING 48068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BBC5 +ENCODING 48069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BBC6 +ENCODING 48070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BBC7 +ENCODING 48071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BBC8 +ENCODING 48072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BBC9 +ENCODING 48073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BBCA +ENCODING 48074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BBCB +ENCODING 48075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BBCC +ENCODING 48076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BBCD +ENCODING 48077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BBCE +ENCODING 48078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BBCF +ENCODING 48079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BBD0 +ENCODING 48080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BBD1 +ENCODING 48081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BBD2 +ENCODING 48082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BBD3 +ENCODING 48083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BBD4 +ENCODING 48084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BBD5 +ENCODING 48085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BBD6 +ENCODING 48086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BBD7 +ENCODING 48087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BBD8 +ENCODING 48088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BBD9 +ENCODING 48089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BBDA +ENCODING 48090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BBDB +ENCODING 48091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0C18 +0C18 +0FF8 +0000 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BBDC +ENCODING 48092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BBDD +ENCODING 48093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BBDE +ENCODING 48094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BBDF +ENCODING 48095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BBE0 +ENCODING 48096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BBE1 +ENCODING 48097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BBE2 +ENCODING 48098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BBE3 +ENCODING 48099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BBE4 +ENCODING 48100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BBE5 +ENCODING 48101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BBE6 +ENCODING 48102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BBE7 +ENCODING 48103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BBE8 +ENCODING 48104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BBE9 +ENCODING 48105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BBEA +ENCODING 48106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BBEB +ENCODING 48107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BBEC +ENCODING 48108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BBED +ENCODING 48109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BBEE +ENCODING 48110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BBEF +ENCODING 48111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BBF0 +ENCODING 48112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BBF1 +ENCODING 48113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BBF2 +ENCODING 48114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BBF3 +ENCODING 48115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BBF4 +ENCODING 48116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BBF5 +ENCODING 48117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BBF6 +ENCODING 48118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BBF7 +ENCODING 48119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +3F8C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BBF8 +ENCODING 48120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +318C +318C +318C +318C +318C +3F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BBF9 +ENCODING 48121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BBFA +ENCODING 48122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BBFB +ENCODING 48123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BBFC +ENCODING 48124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BBFD +ENCODING 48125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BBFE +ENCODING 48126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BBFF +ENCODING 48127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC00 +ENCODING 48128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BC01 +ENCODING 48129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BC02 +ENCODING 48130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BC03 +ENCODING 48131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BC04 +ENCODING 48132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BC05 +ENCODING 48133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BC06 +ENCODING 48134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BC07 +ENCODING 48135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BC08 +ENCODING 48136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BC09 +ENCODING 48137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BC0A +ENCODING 48138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BC0B +ENCODING 48139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC0C +ENCODING 48140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BC0D +ENCODING 48141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BC0E +ENCODING 48142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC0F +ENCODING 48143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC10 +ENCODING 48144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BC11 +ENCODING 48145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC12 +ENCODING 48146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BC13 +ENCODING 48147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +318C +318C +318C +318C +3F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BC14 +ENCODING 48148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +0398 +7198 +3198 +3F9F +3198 +3198 +3F98 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BC15 +ENCODING 48149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BC16 +ENCODING 48150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BC17 +ENCODING 48151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BC18 +ENCODING 48152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC19 +ENCODING 48153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BC1A +ENCODING 48154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BC1B +ENCODING 48155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BC1C +ENCODING 48156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BC1D +ENCODING 48157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BC1E +ENCODING 48158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BC1F +ENCODING 48159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BC20 +ENCODING 48160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BC21 +ENCODING 48161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BC22 +ENCODING 48162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BC23 +ENCODING 48163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BC24 +ENCODING 48164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BC25 +ENCODING 48165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BC26 +ENCODING 48166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BC27 +ENCODING 48167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC28 +ENCODING 48168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BC29 +ENCODING 48169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BC2A +ENCODING 48170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC2B +ENCODING 48171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC2C +ENCODING 48172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BC2D +ENCODING 48173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BC2E +ENCODING 48174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BC2F +ENCODING 48175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3198 +3F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BC30 +ENCODING 48176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +03B6 +71B6 +31B6 +3FBE +31B6 +31B6 +3FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BC31 +ENCODING 48177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BC32 +ENCODING 48178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BC33 +ENCODING 48179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BC34 +ENCODING 48180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BC35 +ENCODING 48181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BC36 +ENCODING 48182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BC37 +ENCODING 48183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC38 +ENCODING 48184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BC39 +ENCODING 48185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BC3A +ENCODING 48186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BC3B +ENCODING 48187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BC3C +ENCODING 48188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BC3D +ENCODING 48189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BC3E +ENCODING 48190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BC3F +ENCODING 48191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BC40 +ENCODING 48192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BC41 +ENCODING 48193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BC42 +ENCODING 48194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BC43 +ENCODING 48195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BC44 +ENCODING 48196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BC45 +ENCODING 48197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BC46 +ENCODING 48198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BC47 +ENCODING 48199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BC48 +ENCODING 48200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BC49 +ENCODING 48201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BC4A +ENCODING 48202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BC4B +ENCODING 48203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +31B6 +3FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BC4C +ENCODING 48204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +0398 +7198 +319F +3F98 +3198 +319F +3F98 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BC4D +ENCODING 48205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BC4E +ENCODING 48206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BC4F +ENCODING 48207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BC50 +ENCODING 48208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC51 +ENCODING 48209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BC52 +ENCODING 48210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BC53 +ENCODING 48211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BC54 +ENCODING 48212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BC55 +ENCODING 48213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BC56 +ENCODING 48214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BC57 +ENCODING 48215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BC58 +ENCODING 48216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BC59 +ENCODING 48217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BC5A +ENCODING 48218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BC5B +ENCODING 48219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BC5C +ENCODING 48220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BC5D +ENCODING 48221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BC5E +ENCODING 48222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BC5F +ENCODING 48223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC60 +ENCODING 48224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BC61 +ENCODING 48225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BC62 +ENCODING 48226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC63 +ENCODING 48227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC64 +ENCODING 48228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BC65 +ENCODING 48229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BC66 +ENCODING 48230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BC67 +ENCODING 48231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F9F +3198 +319F +3F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BC68 +ENCODING 48232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +03B6 +71B6 +31BE +3FB6 +31B6 +31BE +3FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BC69 +ENCODING 48233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BC6A +ENCODING 48234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BC6B +ENCODING 48235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BC6C +ENCODING 48236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BC6D +ENCODING 48237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BC6E +ENCODING 48238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BC6F +ENCODING 48239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC70 +ENCODING 48240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BC71 +ENCODING 48241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BC72 +ENCODING 48242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BC73 +ENCODING 48243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BC74 +ENCODING 48244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BC75 +ENCODING 48245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BC76 +ENCODING 48246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BC77 +ENCODING 48247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BC78 +ENCODING 48248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BC79 +ENCODING 48249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BC7A +ENCODING 48250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BC7B +ENCODING 48251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BC7C +ENCODING 48252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BC7D +ENCODING 48253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BC7E +ENCODING 48254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BC7F +ENCODING 48255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BC80 +ENCODING 48256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BC81 +ENCODING 48257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BC82 +ENCODING 48258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BC83 +ENCODING 48259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FBE +31B6 +31BE +3FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BC84 +ENCODING 48260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +038C +718C +318C +3FFC +318C +318C +3F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BC85 +ENCODING 48261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BC86 +ENCODING 48262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BC87 +ENCODING 48263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BC88 +ENCODING 48264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC89 +ENCODING 48265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BC8A +ENCODING 48266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BC8B +ENCODING 48267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC8C +ENCODING 48268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BC8D +ENCODING 48269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BC8E +ENCODING 48270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BC8F +ENCODING 48271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BC90 +ENCODING 48272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BC91 +ENCODING 48273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BC92 +ENCODING 48274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BC93 +ENCODING 48275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BC94 +ENCODING 48276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BC95 +ENCODING 48277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BC96 +ENCODING 48278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BC97 +ENCODING 48279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC98 +ENCODING 48280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BC99 +ENCODING 48281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BC9A +ENCODING 48282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC9B +ENCODING 48283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BC9C +ENCODING 48284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BC9D +ENCODING 48285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BC9E +ENCODING 48286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BC9F +ENCODING 48287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +31FC +318C +3F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BCA0 +ENCODING 48288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +03B6 +71B6 +31B6 +3FF6 +31B6 +31B6 +3FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BCA1 +ENCODING 48289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BCA2 +ENCODING 48290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BCA3 +ENCODING 48291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BCA4 +ENCODING 48292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BCA5 +ENCODING 48293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BCA6 +ENCODING 48294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BCA7 +ENCODING 48295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BCA8 +ENCODING 48296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BCA9 +ENCODING 48297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BCAA +ENCODING 48298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BCAB +ENCODING 48299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BCAC +ENCODING 48300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BCAD +ENCODING 48301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BCAE +ENCODING 48302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BCAF +ENCODING 48303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BCB0 +ENCODING 48304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BCB1 +ENCODING 48305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BCB2 +ENCODING 48306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BCB3 +ENCODING 48307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BCB4 +ENCODING 48308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BCB5 +ENCODING 48309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BCB6 +ENCODING 48310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BCB7 +ENCODING 48311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BCB8 +ENCODING 48312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BCB9 +ENCODING 48313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BCBA +ENCODING 48314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BCBB +ENCODING 48315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BCBC +ENCODING 48316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +038C +718C +31FC +3F8C +31FC +318C +3F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BCBD +ENCODING 48317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BCBE +ENCODING 48318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BCBF +ENCODING 48319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BCC0 +ENCODING 48320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BCC1 +ENCODING 48321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BCC2 +ENCODING 48322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BCC3 +ENCODING 48323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BCC4 +ENCODING 48324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BCC5 +ENCODING 48325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BCC6 +ENCODING 48326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BCC7 +ENCODING 48327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BCC8 +ENCODING 48328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BCC9 +ENCODING 48329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BCCA +ENCODING 48330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BCCB +ENCODING 48331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BCCC +ENCODING 48332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BCCD +ENCODING 48333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BCCE +ENCODING 48334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BCCF +ENCODING 48335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BCD0 +ENCODING 48336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BCD1 +ENCODING 48337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BCD2 +ENCODING 48338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BCD3 +ENCODING 48339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BCD4 +ENCODING 48340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BCD5 +ENCODING 48341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BCD6 +ENCODING 48342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BCD7 +ENCODING 48343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3FFC +318C +31FC +3F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BCD8 +ENCODING 48344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +03B6 +71B6 +31F6 +3FB6 +31F6 +31B6 +3FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BCD9 +ENCODING 48345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BCDA +ENCODING 48346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BCDB +ENCODING 48347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BCDC +ENCODING 48348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BCDD +ENCODING 48349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BCDE +ENCODING 48350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BCDF +ENCODING 48351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BCE0 +ENCODING 48352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BCE1 +ENCODING 48353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BCE2 +ENCODING 48354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BCE3 +ENCODING 48355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BCE4 +ENCODING 48356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BCE5 +ENCODING 48357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BCE6 +ENCODING 48358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BCE7 +ENCODING 48359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BCE8 +ENCODING 48360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BCE9 +ENCODING 48361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BCEA +ENCODING 48362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BCEB +ENCODING 48363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BCEC +ENCODING 48364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BCED +ENCODING 48365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BCEE +ENCODING 48366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BCEF +ENCODING 48367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BCF0 +ENCODING 48368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BCF1 +ENCODING 48369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BCF2 +ENCODING 48370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BCF3 +ENCODING 48371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FF6 +31B6 +31F6 +3FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BCF4 +ENCODING 48372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3870 +1830 +1FF0 +1830 +1FF0 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+BCF5 +ENCODING 48373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BCF6 +ENCODING 48374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BCF7 +ENCODING 48375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BCF8 +ENCODING 48376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BCF9 +ENCODING 48377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BCFA +ENCODING 48378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BCFB +ENCODING 48379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BCFC +ENCODING 48380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BCFD +ENCODING 48381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BCFE +ENCODING 48382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BCFF +ENCODING 48383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD00 +ENCODING 48384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BD01 +ENCODING 48385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BD02 +ENCODING 48386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BD03 +ENCODING 48387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BD04 +ENCODING 48388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD05 +ENCODING 48389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BD06 +ENCODING 48390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BD07 +ENCODING 48391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BD08 +ENCODING 48392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BD09 +ENCODING 48393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BD0A +ENCODING 48394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BD0B +ENCODING 48395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BD0C +ENCODING 48396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD0D +ENCODING 48397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD0E +ENCODING 48398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BD0F +ENCODING 48399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BD10 +ENCODING 48400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +3198 +3F98 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD11 +ENCODING 48401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD12 +ENCODING 48402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BD13 +ENCODING 48403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BD14 +ENCODING 48404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BD15 +ENCODING 48405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BD16 +ENCODING 48406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BD17 +ENCODING 48407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BD18 +ENCODING 48408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD19 +ENCODING 48409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BD1A +ENCODING 48410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD1B +ENCODING 48411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD1C +ENCODING 48412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BD1D +ENCODING 48413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BD1E +ENCODING 48414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BD1F +ENCODING 48415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BD20 +ENCODING 48416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD21 +ENCODING 48417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD22 +ENCODING 48418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BD23 +ENCODING 48419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD24 +ENCODING 48420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BD25 +ENCODING 48421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BD26 +ENCODING 48422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD27 +ENCODING 48423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD28 +ENCODING 48424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD29 +ENCODING 48425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BD2A +ENCODING 48426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BD2B +ENCODING 48427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7398 +3198 +3F98 +319F +3F98 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BD2C +ENCODING 48428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FBE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BD2D +ENCODING 48429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD2E +ENCODING 48430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BD2F +ENCODING 48431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BD30 +ENCODING 48432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BD31 +ENCODING 48433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BD32 +ENCODING 48434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BD33 +ENCODING 48435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BD34 +ENCODING 48436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD35 +ENCODING 48437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BD36 +ENCODING 48438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD37 +ENCODING 48439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD38 +ENCODING 48440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BD39 +ENCODING 48441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BD3A +ENCODING 48442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BD3B +ENCODING 48443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BD3C +ENCODING 48444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD3D +ENCODING 48445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD3E +ENCODING 48446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BD3F +ENCODING 48447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD40 +ENCODING 48448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BD41 +ENCODING 48449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BD42 +ENCODING 48450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD43 +ENCODING 48451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD44 +ENCODING 48452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD45 +ENCODING 48453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BD46 +ENCODING 48454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BD47 +ENCODING 48455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31BE +3FB6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BD48 +ENCODING 48456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BD49 +ENCODING 48457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD4A +ENCODING 48458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BD4B +ENCODING 48459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BD4C +ENCODING 48460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BD4D +ENCODING 48461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BD4E +ENCODING 48462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BD4F +ENCODING 48463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BD50 +ENCODING 48464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD51 +ENCODING 48465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BD52 +ENCODING 48466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD53 +ENCODING 48467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD54 +ENCODING 48468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BD55 +ENCODING 48469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BD56 +ENCODING 48470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BD57 +ENCODING 48471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BD58 +ENCODING 48472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD59 +ENCODING 48473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD5A +ENCODING 48474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BD5B +ENCODING 48475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD5C +ENCODING 48476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BD5D +ENCODING 48477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BD5E +ENCODING 48478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD5F +ENCODING 48479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BD60 +ENCODING 48480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD61 +ENCODING 48481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BD62 +ENCODING 48482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BD63 +ENCODING 48483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BD64 +ENCODING 48484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3870 +1830 +1FF0 +1830 +1FF0 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+BD65 +ENCODING 48485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD66 +ENCODING 48486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BD67 +ENCODING 48487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BD68 +ENCODING 48488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD69 +ENCODING 48489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BD6A +ENCODING 48490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BD6B +ENCODING 48491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD6C +ENCODING 48492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD6D +ENCODING 48493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BD6E +ENCODING 48494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BD6F +ENCODING 48495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD70 +ENCODING 48496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BD71 +ENCODING 48497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BD72 +ENCODING 48498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BD73 +ENCODING 48499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BD74 +ENCODING 48500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD75 +ENCODING 48501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BD76 +ENCODING 48502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BD77 +ENCODING 48503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BD78 +ENCODING 48504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BD79 +ENCODING 48505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BD7A +ENCODING 48506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BD7B +ENCODING 48507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BD7C +ENCODING 48508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD7D +ENCODING 48509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD7E +ENCODING 48510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BD7F +ENCODING 48511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BD80 +ENCODING 48512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3870 +1830 +1FF0 +1830 +1FF0 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+BD81 +ENCODING 48513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD82 +ENCODING 48514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BD83 +ENCODING 48515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BD84 +ENCODING 48516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD85 +ENCODING 48517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BD86 +ENCODING 48518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BD87 +ENCODING 48519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD88 +ENCODING 48520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD89 +ENCODING 48521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BD8A +ENCODING 48522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BD8B +ENCODING 48523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BD8C +ENCODING 48524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BD8D +ENCODING 48525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BD8E +ENCODING 48526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BD8F +ENCODING 48527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BD90 +ENCODING 48528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BD91 +ENCODING 48529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BD92 +ENCODING 48530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BD93 +ENCODING 48531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BD94 +ENCODING 48532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BD95 +ENCODING 48533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BD96 +ENCODING 48534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BD97 +ENCODING 48535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BD98 +ENCODING 48536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BD99 +ENCODING 48537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BD9A +ENCODING 48538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BD9B +ENCODING 48539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BD9C +ENCODING 48540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+BD9D +ENCODING 48541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BD9E +ENCODING 48542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BD9F +ENCODING 48543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BDA0 +ENCODING 48544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDA1 +ENCODING 48545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BDA2 +ENCODING 48546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BDA3 +ENCODING 48547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDA4 +ENCODING 48548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BDA5 +ENCODING 48549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BDA6 +ENCODING 48550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BDA7 +ENCODING 48551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BDA8 +ENCODING 48552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BDA9 +ENCODING 48553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BDAA +ENCODING 48554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BDAB +ENCODING 48555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BDAC +ENCODING 48556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BDAD +ENCODING 48557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BDAE +ENCODING 48558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BDAF +ENCODING 48559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDB0 +ENCODING 48560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BDB1 +ENCODING 48561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BDB2 +ENCODING 48562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDB3 +ENCODING 48563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDB4 +ENCODING 48564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BDB5 +ENCODING 48565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDB6 +ENCODING 48566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BDB7 +ENCODING 48567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +739C +318C +3F8C +318C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BDB8 +ENCODING 48568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FB6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BDB9 +ENCODING 48569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BDBA +ENCODING 48570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BDBB +ENCODING 48571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BDBC +ENCODING 48572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31F6 +3FB6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDBD +ENCODING 48573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BDBE +ENCODING 48574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BDBF +ENCODING 48575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDC0 +ENCODING 48576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BDC1 +ENCODING 48577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BDC2 +ENCODING 48578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BDC3 +ENCODING 48579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BDC4 +ENCODING 48580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BDC5 +ENCODING 48581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BDC6 +ENCODING 48582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BDC7 +ENCODING 48583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BDC8 +ENCODING 48584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BDC9 +ENCODING 48585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BDCA +ENCODING 48586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BDCB +ENCODING 48587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDCC +ENCODING 48588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BDCD +ENCODING 48589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BDCE +ENCODING 48590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDCF +ENCODING 48591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDD0 +ENCODING 48592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BDD1 +ENCODING 48593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDD2 +ENCODING 48594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BDD3 +ENCODING 48595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +73F6 +31B6 +3FB6 +31B6 +3FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BDD4 +ENCODING 48596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+BDD5 +ENCODING 48597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BDD6 +ENCODING 48598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BDD7 +ENCODING 48599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BDD8 +ENCODING 48600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDD9 +ENCODING 48601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BDDA +ENCODING 48602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BDDB +ENCODING 48603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDDC +ENCODING 48604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BDDD +ENCODING 48605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BDDE +ENCODING 48606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BDDF +ENCODING 48607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BDE0 +ENCODING 48608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BDE1 +ENCODING 48609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BDE2 +ENCODING 48610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BDE3 +ENCODING 48611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BDE4 +ENCODING 48612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BDE5 +ENCODING 48613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BDE6 +ENCODING 48614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BDE7 +ENCODING 48615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDE8 +ENCODING 48616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BDE9 +ENCODING 48617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BDEA +ENCODING 48618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDEB +ENCODING 48619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BDEC +ENCODING 48620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BDED +ENCODING 48621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BDEE +ENCODING 48622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BDEF +ENCODING 48623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7386 +3186 +3F86 +3186 +3F86 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BDF0 +ENCODING 48624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3870 +1830 +1FF0 +1830 +1FF0 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+BDF1 +ENCODING 48625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BDF2 +ENCODING 48626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BDF3 +ENCODING 48627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BDF4 +ENCODING 48628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BDF5 +ENCODING 48629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BDF6 +ENCODING 48630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BDF7 +ENCODING 48631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BDF8 +ENCODING 48632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BDF9 +ENCODING 48633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BDFA +ENCODING 48634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BDFB +ENCODING 48635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BDFC +ENCODING 48636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BDFD +ENCODING 48637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BDFE +ENCODING 48638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BDFF +ENCODING 48639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BE00 +ENCODING 48640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BE01 +ENCODING 48641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BE02 +ENCODING 48642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BE03 +ENCODING 48643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BE04 +ENCODING 48644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BE05 +ENCODING 48645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BE06 +ENCODING 48646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BE07 +ENCODING 48647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BE08 +ENCODING 48648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE09 +ENCODING 48649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BE0A +ENCODING 48650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BE0B +ENCODING 48651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BE0C +ENCODING 48652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3870 +1830 +1FF0 +1830 +1FF0 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+BE0D +ENCODING 48653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE0E +ENCODING 48654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BE0F +ENCODING 48655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BE10 +ENCODING 48656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BE11 +ENCODING 48657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BE12 +ENCODING 48658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BE13 +ENCODING 48659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BE14 +ENCODING 48660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BE15 +ENCODING 48661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BE16 +ENCODING 48662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BE17 +ENCODING 48663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BE18 +ENCODING 48664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BE19 +ENCODING 48665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BE1A +ENCODING 48666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BE1B +ENCODING 48667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BE1C +ENCODING 48668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BE1D +ENCODING 48669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BE1E +ENCODING 48670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BE1F +ENCODING 48671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BE20 +ENCODING 48672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BE21 +ENCODING 48673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BE22 +ENCODING 48674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BE23 +ENCODING 48675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BE24 +ENCODING 48676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE25 +ENCODING 48677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BE26 +ENCODING 48678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BE27 +ENCODING 48679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BE28 +ENCODING 48680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BE29 +ENCODING 48681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE2A +ENCODING 48682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BE2B +ENCODING 48683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BE2C +ENCODING 48684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BE2D +ENCODING 48685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BE2E +ENCODING 48686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BE2F +ENCODING 48687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BE30 +ENCODING 48688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BE31 +ENCODING 48689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BE32 +ENCODING 48690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BE33 +ENCODING 48691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BE34 +ENCODING 48692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BE35 +ENCODING 48693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BE36 +ENCODING 48694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BE37 +ENCODING 48695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BE38 +ENCODING 48696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BE39 +ENCODING 48697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BE3A +ENCODING 48698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BE3B +ENCODING 48699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE3C +ENCODING 48700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BE3D +ENCODING 48701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BE3E +ENCODING 48702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE3F +ENCODING 48703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE40 +ENCODING 48704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE41 +ENCODING 48705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BE42 +ENCODING 48706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BE43 +ENCODING 48707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +3F8C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BE44 +ENCODING 48708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +038C +718C +318C +3F8C +318C +318C +3F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BE45 +ENCODING 48709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BE46 +ENCODING 48710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BE47 +ENCODING 48711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BE48 +ENCODING 48712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BE49 +ENCODING 48713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BE4A +ENCODING 48714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BE4B +ENCODING 48715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BE4C +ENCODING 48716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BE4D +ENCODING 48717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BE4E +ENCODING 48718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BE4F +ENCODING 48719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BE50 +ENCODING 48720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BE51 +ENCODING 48721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BE52 +ENCODING 48722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BE53 +ENCODING 48723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BE54 +ENCODING 48724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BE55 +ENCODING 48725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BE56 +ENCODING 48726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BE57 +ENCODING 48727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE58 +ENCODING 48728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BE59 +ENCODING 48729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BE5A +ENCODING 48730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE5B +ENCODING 48731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE5C +ENCODING 48732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BE5D +ENCODING 48733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BE5E +ENCODING 48734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BE5F +ENCODING 48735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +738C +318C +3F8C +318C +318C +3F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BE60 +ENCODING 48736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +0398 +ED98 +6D98 +7F9F +6D98 +6D98 +7F98 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE61 +ENCODING 48737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE62 +ENCODING 48738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BE63 +ENCODING 48739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BE64 +ENCODING 48740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BE65 +ENCODING 48741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BE66 +ENCODING 48742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BE67 +ENCODING 48743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BE68 +ENCODING 48744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BE69 +ENCODING 48745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BE6A +ENCODING 48746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BE6B +ENCODING 48747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BE6C +ENCODING 48748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BE6D +ENCODING 48749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BE6E +ENCODING 48750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BE6F +ENCODING 48751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BE70 +ENCODING 48752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BE71 +ENCODING 48753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BE72 +ENCODING 48754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BE73 +ENCODING 48755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE74 +ENCODING 48756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BE75 +ENCODING 48757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BE76 +ENCODING 48758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE77 +ENCODING 48759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BE78 +ENCODING 48760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE79 +ENCODING 48761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BE7A +ENCODING 48762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BE7B +ENCODING 48763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F98 +6D9F +6D98 +7F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BE7C +ENCODING 48764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +03B6 +EDB6 +6DB6 +7FBE +6DB6 +6DB6 +7FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BE7D +ENCODING 48765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BE7E +ENCODING 48766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BE7F +ENCODING 48767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BE80 +ENCODING 48768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BE81 +ENCODING 48769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BE82 +ENCODING 48770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BE83 +ENCODING 48771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BE84 +ENCODING 48772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BE85 +ENCODING 48773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BE86 +ENCODING 48774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BE87 +ENCODING 48775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BE88 +ENCODING 48776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BE89 +ENCODING 48777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BE8A +ENCODING 48778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BE8B +ENCODING 48779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BE8C +ENCODING 48780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BE8D +ENCODING 48781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BE8E +ENCODING 48782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BE8F +ENCODING 48783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BE90 +ENCODING 48784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BE91 +ENCODING 48785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BE92 +ENCODING 48786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BE93 +ENCODING 48787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BE94 +ENCODING 48788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BE95 +ENCODING 48789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BE96 +ENCODING 48790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BE97 +ENCODING 48791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DBE +6DB6 +7FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BE98 +ENCODING 48792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +0398 +ED98 +6D9F +7F98 +6D98 +6D9F +7F98 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE99 +ENCODING 48793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BE9A +ENCODING 48794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BE9B +ENCODING 48795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BE9C +ENCODING 48796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BE9D +ENCODING 48797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BE9E +ENCODING 48798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BE9F +ENCODING 48799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BEA0 +ENCODING 48800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BEA1 +ENCODING 48801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BEA2 +ENCODING 48802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BEA3 +ENCODING 48803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BEA4 +ENCODING 48804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BEA5 +ENCODING 48805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BEA6 +ENCODING 48806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BEA7 +ENCODING 48807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BEA8 +ENCODING 48808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BEA9 +ENCODING 48809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BEAA +ENCODING 48810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BEAB +ENCODING 48811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BEAC +ENCODING 48812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BEAD +ENCODING 48813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BEAE +ENCODING 48814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BEAF +ENCODING 48815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BEB0 +ENCODING 48816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BEB1 +ENCODING 48817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BEB2 +ENCODING 48818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BEB3 +ENCODING 48819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +ED98 +6D98 +7F9F +6D98 +6D9F +7F98 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BEB4 +ENCODING 48820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +03B6 +EDB6 +6DBE +7FB6 +6DB6 +6DBE +7FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BEB5 +ENCODING 48821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BEB6 +ENCODING 48822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BEB7 +ENCODING 48823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BEB8 +ENCODING 48824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BEB9 +ENCODING 48825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BEBA +ENCODING 48826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BEBB +ENCODING 48827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BEBC +ENCODING 48828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BEBD +ENCODING 48829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BEBE +ENCODING 48830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BEBF +ENCODING 48831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BEC0 +ENCODING 48832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BEC1 +ENCODING 48833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BEC2 +ENCODING 48834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BEC3 +ENCODING 48835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BEC4 +ENCODING 48836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BEC5 +ENCODING 48837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BEC6 +ENCODING 48838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BEC7 +ENCODING 48839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BEC8 +ENCODING 48840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BEC9 +ENCODING 48841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BECA +ENCODING 48842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BECB +ENCODING 48843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BECC +ENCODING 48844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BECD +ENCODING 48845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BECE +ENCODING 48846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BECF +ENCODING 48847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FBE +6DB6 +6DBE +7FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BED0 +ENCODING 48848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +038C +ED8C +6D8C +7FFC +6D8C +6D8C +7F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BED1 +ENCODING 48849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BED2 +ENCODING 48850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BED3 +ENCODING 48851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BED4 +ENCODING 48852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BED5 +ENCODING 48853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BED6 +ENCODING 48854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BED7 +ENCODING 48855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BED8 +ENCODING 48856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BED9 +ENCODING 48857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BEDA +ENCODING 48858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BEDB +ENCODING 48859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BEDC +ENCODING 48860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BEDD +ENCODING 48861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BEDE +ENCODING 48862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BEDF +ENCODING 48863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BEE0 +ENCODING 48864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BEE1 +ENCODING 48865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BEE2 +ENCODING 48866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BEE3 +ENCODING 48867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BEE4 +ENCODING 48868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BEE5 +ENCODING 48869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BEE6 +ENCODING 48870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BEE7 +ENCODING 48871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BEE8 +ENCODING 48872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BEE9 +ENCODING 48873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BEEA +ENCODING 48874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BEEB +ENCODING 48875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6DFC +6D8C +7F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BEEC +ENCODING 48876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +03B6 +EDB6 +6DB6 +7FF6 +6DB6 +6DB6 +7FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BEED +ENCODING 48877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BEEE +ENCODING 48878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BEEF +ENCODING 48879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BEF0 +ENCODING 48880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BEF1 +ENCODING 48881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BEF2 +ENCODING 48882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BEF3 +ENCODING 48883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BEF4 +ENCODING 48884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BEF5 +ENCODING 48885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BEF6 +ENCODING 48886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BEF7 +ENCODING 48887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BEF8 +ENCODING 48888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BEF9 +ENCODING 48889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BEFA +ENCODING 48890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BEFB +ENCODING 48891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BEFC +ENCODING 48892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BEFD +ENCODING 48893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BEFE +ENCODING 48894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BEFF +ENCODING 48895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BF00 +ENCODING 48896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BF01 +ENCODING 48897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BF02 +ENCODING 48898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BF03 +ENCODING 48899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BF04 +ENCODING 48900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BF05 +ENCODING 48901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BF06 +ENCODING 48902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BF07 +ENCODING 48903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BF08 +ENCODING 48904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +038C +ED8C +6DFC +7F8C +6DFC +6D8C +7F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BF09 +ENCODING 48905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BF0A +ENCODING 48906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BF0B +ENCODING 48907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BF0C +ENCODING 48908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BF0D +ENCODING 48909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BF0E +ENCODING 48910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BF0F +ENCODING 48911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BF10 +ENCODING 48912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BF11 +ENCODING 48913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BF12 +ENCODING 48914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BF13 +ENCODING 48915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BF14 +ENCODING 48916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BF15 +ENCODING 48917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BF16 +ENCODING 48918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BF17 +ENCODING 48919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BF18 +ENCODING 48920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BF19 +ENCODING 48921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BF1A +ENCODING 48922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BF1B +ENCODING 48923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF1C +ENCODING 48924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BF1D +ENCODING 48925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BF1E +ENCODING 48926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF1F +ENCODING 48927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF20 +ENCODING 48928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BF21 +ENCODING 48929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BF22 +ENCODING 48930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BF23 +ENCODING 48931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7FFC +6D8C +6DFC +7F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BF24 +ENCODING 48932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +03B6 +EDB6 +6DF6 +7FB6 +6DF6 +6DB6 +7FB6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BF25 +ENCODING 48933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BF26 +ENCODING 48934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+BF27 +ENCODING 48935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+BF28 +ENCODING 48936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BF29 +ENCODING 48937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+BF2A +ENCODING 48938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+BF2B +ENCODING 48939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BF2C +ENCODING 48940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+BF2D +ENCODING 48941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+BF2E +ENCODING 48942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BF2F +ENCODING 48943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+BF30 +ENCODING 48944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+BF31 +ENCODING 48945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+BF32 +ENCODING 48946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BF33 +ENCODING 48947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BF34 +ENCODING 48948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BF35 +ENCODING 48949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+BF36 +ENCODING 48950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BF37 +ENCODING 48951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+BF38 +ENCODING 48952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BF39 +ENCODING 48953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+BF3A +ENCODING 48954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BF3B +ENCODING 48955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+BF3C +ENCODING 48956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+BF3D +ENCODING 48957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+BF3E +ENCODING 48958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+BF3F +ENCODING 48959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +EDF6 +6DB6 +7FF6 +6DB6 +6DF6 +7FB6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BF40 +ENCODING 48960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+BF41 +ENCODING 48961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BF42 +ENCODING 48962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BF43 +ENCODING 48963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BF44 +ENCODING 48964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BF45 +ENCODING 48965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BF46 +ENCODING 48966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BF47 +ENCODING 48967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BF48 +ENCODING 48968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BF49 +ENCODING 48969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BF4A +ENCODING 48970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BF4B +ENCODING 48971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BF4C +ENCODING 48972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BF4D +ENCODING 48973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BF4E +ENCODING 48974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BF4F +ENCODING 48975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BF50 +ENCODING 48976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BF51 +ENCODING 48977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BF52 +ENCODING 48978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BF53 +ENCODING 48979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BF54 +ENCODING 48980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BF55 +ENCODING 48981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BF56 +ENCODING 48982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BF57 +ENCODING 48983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BF58 +ENCODING 48984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BF59 +ENCODING 48985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BF5A +ENCODING 48986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BF5B +ENCODING 48987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BF5C +ENCODING 48988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36D8 +3FD8 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BF5D +ENCODING 48989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BF5E +ENCODING 48990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BF5F +ENCODING 48991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BF60 +ENCODING 48992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BF61 +ENCODING 48993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BF62 +ENCODING 48994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BF63 +ENCODING 48995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BF64 +ENCODING 48996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BF65 +ENCODING 48997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BF66 +ENCODING 48998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BF67 +ENCODING 48999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BF68 +ENCODING 49000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BF69 +ENCODING 49001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BF6A +ENCODING 49002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BF6B +ENCODING 49003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BF6C +ENCODING 49004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BF6D +ENCODING 49005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BF6E +ENCODING 49006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BF6F +ENCODING 49007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF70 +ENCODING 49008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BF71 +ENCODING 49009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BF72 +ENCODING 49010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF73 +ENCODING 49011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF74 +ENCODING 49012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BF75 +ENCODING 49013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BF76 +ENCODING 49014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BF77 +ENCODING 49015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +76D8 +36D8 +3FD8 +36DF +3FD8 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BF78 +ENCODING 49016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FFE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+BF79 +ENCODING 49017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BF7A +ENCODING 49018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BF7B +ENCODING 49019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BF7C +ENCODING 49020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BF7D +ENCODING 49021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BF7E +ENCODING 49022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BF7F +ENCODING 49023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BF80 +ENCODING 49024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BF81 +ENCODING 49025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BF82 +ENCODING 49026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BF83 +ENCODING 49027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BF84 +ENCODING 49028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BF85 +ENCODING 49029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BF86 +ENCODING 49030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BF87 +ENCODING 49031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BF88 +ENCODING 49032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BF89 +ENCODING 49033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BF8A +ENCODING 49034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BF8B +ENCODING 49035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF8C +ENCODING 49036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BF8D +ENCODING 49037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BF8E +ENCODING 49038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF8F +ENCODING 49039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BF90 +ENCODING 49040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BF91 +ENCODING 49041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BF92 +ENCODING 49042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BF93 +ENCODING 49043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36FE +3FF6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BF94 +ENCODING 49044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BF95 +ENCODING 49045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BF96 +ENCODING 49046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+BF97 +ENCODING 49047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BF98 +ENCODING 49048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BF99 +ENCODING 49049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+BF9A +ENCODING 49050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+BF9B +ENCODING 49051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BF9C +ENCODING 49052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BF9D +ENCODING 49053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+BF9E +ENCODING 49054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BF9F +ENCODING 49055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BFA0 +ENCODING 49056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BFA1 +ENCODING 49057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BFA2 +ENCODING 49058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BFA3 +ENCODING 49059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BFA4 +ENCODING 49060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BFA5 +ENCODING 49061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+BFA6 +ENCODING 49062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BFA7 +ENCODING 49063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BFA8 +ENCODING 49064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+BFA9 +ENCODING 49065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BFAA +ENCODING 49066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BFAB +ENCODING 49067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BFAC +ENCODING 49068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BFAD +ENCODING 49069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+BFAE +ENCODING 49070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+BFAF +ENCODING 49071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+BFB0 +ENCODING 49072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+BFB1 +ENCODING 49073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BFB2 +ENCODING 49074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BFB3 +ENCODING 49075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BFB4 +ENCODING 49076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BFB5 +ENCODING 49077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BFB6 +ENCODING 49078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BFB7 +ENCODING 49079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BFB8 +ENCODING 49080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BFB9 +ENCODING 49081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BFBA +ENCODING 49082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BFBB +ENCODING 49083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BFBC +ENCODING 49084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BFBD +ENCODING 49085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BFBE +ENCODING 49086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BFBF +ENCODING 49087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BFC0 +ENCODING 49088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BFC1 +ENCODING 49089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BFC2 +ENCODING 49090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BFC3 +ENCODING 49091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BFC4 +ENCODING 49092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BFC5 +ENCODING 49093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BFC6 +ENCODING 49094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BFC7 +ENCODING 49095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BFC8 +ENCODING 49096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BFC9 +ENCODING 49097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BFCA +ENCODING 49098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BFCB +ENCODING 49099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BFCC +ENCODING 49100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+BFCD +ENCODING 49101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BFCE +ENCODING 49102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+BFCF +ENCODING 49103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+BFD0 +ENCODING 49104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BFD1 +ENCODING 49105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+BFD2 +ENCODING 49106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+BFD3 +ENCODING 49107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BFD4 +ENCODING 49108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BFD5 +ENCODING 49109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+BFD6 +ENCODING 49110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+BFD7 +ENCODING 49111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BFD8 +ENCODING 49112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+BFD9 +ENCODING 49113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BFDA +ENCODING 49114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BFDB +ENCODING 49115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+BFDC +ENCODING 49116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+BFDD +ENCODING 49117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BFDE +ENCODING 49118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+BFDF +ENCODING 49119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+BFE0 +ENCODING 49120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+BFE1 +ENCODING 49121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BFE2 +ENCODING 49122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BFE3 +ENCODING 49123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+BFE4 +ENCODING 49124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+BFE5 +ENCODING 49125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+BFE6 +ENCODING 49126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+BFE7 +ENCODING 49127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+BFE8 +ENCODING 49128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+BFE9 +ENCODING 49129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+BFEA +ENCODING 49130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+BFEB +ENCODING 49131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+BFEC +ENCODING 49132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BFED +ENCODING 49133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+BFEE +ENCODING 49134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+BFEF +ENCODING 49135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+BFF0 +ENCODING 49136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+BFF1 +ENCODING 49137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+BFF2 +ENCODING 49138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BFF3 +ENCODING 49139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+BFF4 +ENCODING 49140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+BFF5 +ENCODING 49141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+BFF6 +ENCODING 49142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+BFF7 +ENCODING 49143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+BFF8 +ENCODING 49144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BFF9 +ENCODING 49145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+BFFA +ENCODING 49146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+BFFB +ENCODING 49147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+BFFC +ENCODING 49148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+BFFD +ENCODING 49149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+BFFE +ENCODING 49150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+BFFF +ENCODING 49151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C000 +ENCODING 49152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C001 +ENCODING 49153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C002 +ENCODING 49154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C003 +ENCODING 49155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +76DC +36CC +3FCC +36CC +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C004 +ENCODING 49156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C005 +ENCODING 49157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C006 +ENCODING 49158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C007 +ENCODING 49159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C008 +ENCODING 49160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C009 +ENCODING 49161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C00A +ENCODING 49162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C00B +ENCODING 49163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C00C +ENCODING 49164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C00D +ENCODING 49165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C00E +ENCODING 49166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C00F +ENCODING 49167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C010 +ENCODING 49168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C011 +ENCODING 49169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C012 +ENCODING 49170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C013 +ENCODING 49171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C014 +ENCODING 49172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C015 +ENCODING 49173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C016 +ENCODING 49174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C017 +ENCODING 49175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C018 +ENCODING 49176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C019 +ENCODING 49177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C01A +ENCODING 49178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C01B +ENCODING 49179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C01C +ENCODING 49180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C01D +ENCODING 49181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C01E +ENCODING 49182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C01F +ENCODING 49183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76F6 +36F6 +3FF6 +36F6 +3FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C020 +ENCODING 49184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C021 +ENCODING 49185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C022 +ENCODING 49186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C023 +ENCODING 49187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C024 +ENCODING 49188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C025 +ENCODING 49189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C026 +ENCODING 49190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C027 +ENCODING 49191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C028 +ENCODING 49192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C029 +ENCODING 49193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C02A +ENCODING 49194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C02B +ENCODING 49195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C02C +ENCODING 49196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C02D +ENCODING 49197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C02E +ENCODING 49198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C02F +ENCODING 49199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C030 +ENCODING 49200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C031 +ENCODING 49201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C032 +ENCODING 49202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C033 +ENCODING 49203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C034 +ENCODING 49204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C035 +ENCODING 49205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C036 +ENCODING 49206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C037 +ENCODING 49207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C038 +ENCODING 49208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C039 +ENCODING 49209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C03A +ENCODING 49210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C03B +ENCODING 49211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +76C6 +36C6 +3FC6 +36C6 +3FC6 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C03C +ENCODING 49212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+C03D +ENCODING 49213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C03E +ENCODING 49214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C03F +ENCODING 49215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C040 +ENCODING 49216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C041 +ENCODING 49217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C042 +ENCODING 49218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C043 +ENCODING 49219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C044 +ENCODING 49220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C045 +ENCODING 49221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C046 +ENCODING 49222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C047 +ENCODING 49223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C048 +ENCODING 49224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C049 +ENCODING 49225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C04A +ENCODING 49226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C04B +ENCODING 49227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C04C +ENCODING 49228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C04D +ENCODING 49229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C04E +ENCODING 49230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C04F +ENCODING 49231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C050 +ENCODING 49232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C051 +ENCODING 49233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C052 +ENCODING 49234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C053 +ENCODING 49235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C054 +ENCODING 49236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C055 +ENCODING 49237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C056 +ENCODING 49238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C057 +ENCODING 49239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C058 +ENCODING 49240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C059 +ENCODING 49241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C05A +ENCODING 49242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C05B +ENCODING 49243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C05C +ENCODING 49244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C05D +ENCODING 49245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C05E +ENCODING 49246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C05F +ENCODING 49247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C060 +ENCODING 49248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C061 +ENCODING 49249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C062 +ENCODING 49250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C063 +ENCODING 49251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C064 +ENCODING 49252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C065 +ENCODING 49253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C066 +ENCODING 49254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C067 +ENCODING 49255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C068 +ENCODING 49256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C069 +ENCODING 49257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C06A +ENCODING 49258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C06B +ENCODING 49259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C06C +ENCODING 49260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C06D +ENCODING 49261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C06E +ENCODING 49262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C06F +ENCODING 49263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C070 +ENCODING 49264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C071 +ENCODING 49265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C072 +ENCODING 49266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C073 +ENCODING 49267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3998 +1998 +1FF8 +1998 +1FF8 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C074 +ENCODING 49268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C075 +ENCODING 49269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C076 +ENCODING 49270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C077 +ENCODING 49271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C078 +ENCODING 49272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C079 +ENCODING 49273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C07A +ENCODING 49274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C07B +ENCODING 49275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C07C +ENCODING 49276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C07D +ENCODING 49277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C07E +ENCODING 49278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C07F +ENCODING 49279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C080 +ENCODING 49280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C081 +ENCODING 49281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C082 +ENCODING 49282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C083 +ENCODING 49283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C084 +ENCODING 49284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C085 +ENCODING 49285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C086 +ENCODING 49286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C087 +ENCODING 49287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C088 +ENCODING 49288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C089 +ENCODING 49289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C08A +ENCODING 49290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C08B +ENCODING 49291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C08C +ENCODING 49292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C08D +ENCODING 49293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C08E +ENCODING 49294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C08F +ENCODING 49295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +76CC +36CC +3FCC +36CC +3FCC +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C090 +ENCODING 49296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +038C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C091 +ENCODING 49297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C092 +ENCODING 49298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C093 +ENCODING 49299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C094 +ENCODING 49300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C095 +ENCODING 49301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C096 +ENCODING 49302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C097 +ENCODING 49303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C098 +ENCODING 49304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C099 +ENCODING 49305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C09A +ENCODING 49306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C09B +ENCODING 49307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C09C +ENCODING 49308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C09D +ENCODING 49309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C09E +ENCODING 49310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C09F +ENCODING 49311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C0A0 +ENCODING 49312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C0A1 +ENCODING 49313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C0A2 +ENCODING 49314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C0A3 +ENCODING 49315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0A4 +ENCODING 49316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C0A5 +ENCODING 49317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C0A6 +ENCODING 49318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0A7 +ENCODING 49319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0A8 +ENCODING 49320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C0A9 +ENCODING 49321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C0AA +ENCODING 49322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C0AB +ENCODING 49323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +ED8C +6D8C +7F8C +6D8C +6D8C +7F8C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C0AC +ENCODING 49324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C0AD +ENCODING 49325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C0AE +ENCODING 49326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C0AF +ENCODING 49327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C0B0 +ENCODING 49328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C0B1 +ENCODING 49329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C0B2 +ENCODING 49330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C0B3 +ENCODING 49331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C0B4 +ENCODING 49332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C0B5 +ENCODING 49333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C0B6 +ENCODING 49334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C0B7 +ENCODING 49335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C0B8 +ENCODING 49336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C0B9 +ENCODING 49337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C0BA +ENCODING 49338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C0BB +ENCODING 49339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C0BC +ENCODING 49340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C0BD +ENCODING 49341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C0BE +ENCODING 49342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C0BF +ENCODING 49343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0C0 +ENCODING 49344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C0C1 +ENCODING 49345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C0C2 +ENCODING 49346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0C3 +ENCODING 49347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0C4 +ENCODING 49348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C0C5 +ENCODING 49349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C0C6 +ENCODING 49350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C0C7 +ENCODING 49351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +0E1F +0B18 +1998 +60D8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C0C8 +ENCODING 49352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C0C9 +ENCODING 49353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C0CA +ENCODING 49354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C0CB +ENCODING 49355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C0CC +ENCODING 49356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C0CD +ENCODING 49357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C0CE +ENCODING 49358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C0CF +ENCODING 49359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C0D0 +ENCODING 49360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C0D1 +ENCODING 49361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C0D2 +ENCODING 49362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C0D3 +ENCODING 49363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C0D4 +ENCODING 49364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C0D5 +ENCODING 49365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C0D6 +ENCODING 49366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C0D7 +ENCODING 49367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C0D8 +ENCODING 49368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C0D9 +ENCODING 49369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C0DA +ENCODING 49370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C0DB +ENCODING 49371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C0DC +ENCODING 49372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C0DD +ENCODING 49373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C0DE +ENCODING 49374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C0DF +ENCODING 49375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C0E0 +ENCODING 49376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C0E1 +ENCODING 49377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C0E2 +ENCODING 49378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C0E3 +ENCODING 49379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E3E +0B36 +19B6 +60F6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C0E4 +ENCODING 49380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0618 +061F +0E18 +0B18 +199F +60D8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C0E5 +ENCODING 49381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C0E6 +ENCODING 49382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C0E7 +ENCODING 49383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C0E8 +ENCODING 49384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C0E9 +ENCODING 49385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C0EA +ENCODING 49386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C0EB +ENCODING 49387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C0EC +ENCODING 49388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C0ED +ENCODING 49389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C0EE +ENCODING 49390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C0EF +ENCODING 49391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C0F0 +ENCODING 49392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C0F1 +ENCODING 49393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C0F2 +ENCODING 49394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C0F3 +ENCODING 49395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C0F4 +ENCODING 49396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C0F5 +ENCODING 49397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C0F6 +ENCODING 49398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C0F7 +ENCODING 49399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0F8 +ENCODING 49400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C0F9 +ENCODING 49401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C0FA +ENCODING 49402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0FB +ENCODING 49403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C0FC +ENCODING 49404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C0FD +ENCODING 49405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C0FE +ENCODING 49406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C0FF +ENCODING 49407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +061F +0E18 +0B1F +1998 +60D8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C100 +ENCODING 49408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +063E +0E36 +0B36 +19BE +60F6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C101 +ENCODING 49409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C102 +ENCODING 49410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C103 +ENCODING 49411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C104 +ENCODING 49412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C105 +ENCODING 49413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C106 +ENCODING 49414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C107 +ENCODING 49415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C108 +ENCODING 49416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C109 +ENCODING 49417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C10A +ENCODING 49418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C10B +ENCODING 49419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C10C +ENCODING 49420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C10D +ENCODING 49421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C10E +ENCODING 49422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C10F +ENCODING 49423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C110 +ENCODING 49424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C111 +ENCODING 49425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C112 +ENCODING 49426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C113 +ENCODING 49427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C114 +ENCODING 49428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C115 +ENCODING 49429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C116 +ENCODING 49430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C117 +ENCODING 49431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C118 +ENCODING 49432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C119 +ENCODING 49433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C11A +ENCODING 49434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C11B +ENCODING 49435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +063E +0E36 +0B3E +19B6 +60F6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C11C +ENCODING 49436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +060C +0E7C +0B0C +198C +60CC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C11D +ENCODING 49437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C11E +ENCODING 49438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C11F +ENCODING 49439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C120 +ENCODING 49440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E7C +0B0C +198C +60CC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C121 +ENCODING 49441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C122 +ENCODING 49442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C123 +ENCODING 49443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C124 +ENCODING 49444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C125 +ENCODING 49445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C126 +ENCODING 49446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C127 +ENCODING 49447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C128 +ENCODING 49448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C129 +ENCODING 49449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C12A +ENCODING 49450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C12B +ENCODING 49451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C12C +ENCODING 49452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C12D +ENCODING 49453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C12E +ENCODING 49454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C12F +ENCODING 49455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C130 +ENCODING 49456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C131 +ENCODING 49457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C132 +ENCODING 49458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C133 +ENCODING 49459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C134 +ENCODING 49460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C135 +ENCODING 49461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C136 +ENCODING 49462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C137 +ENCODING 49463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0EFC +0B0C +198C +60CC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C138 +ENCODING 49464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0636 +0E76 +0B36 +19B6 +60F6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C139 +ENCODING 49465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C13A +ENCODING 49466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C13B +ENCODING 49467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C13C +ENCODING 49468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0E76 +0B36 +19B6 +60F6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C13D +ENCODING 49469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C13E +ENCODING 49470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C13F +ENCODING 49471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C140 +ENCODING 49472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C141 +ENCODING 49473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C142 +ENCODING 49474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C143 +ENCODING 49475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C144 +ENCODING 49476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C145 +ENCODING 49477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C146 +ENCODING 49478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C147 +ENCODING 49479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C148 +ENCODING 49480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C149 +ENCODING 49481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C14A +ENCODING 49482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C14B +ENCODING 49483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C14C +ENCODING 49484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C14D +ENCODING 49485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C14E +ENCODING 49486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C14F +ENCODING 49487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C150 +ENCODING 49488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C151 +ENCODING 49489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C152 +ENCODING 49490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C153 +ENCODING 49491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0EF6 +0B36 +19B6 +60F6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C154 +ENCODING 49492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +067C +0E0C +0B7C +198C +60CC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C155 +ENCODING 49493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C156 +ENCODING 49494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C157 +ENCODING 49495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C158 +ENCODING 49496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C159 +ENCODING 49497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C15A +ENCODING 49498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C15B +ENCODING 49499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C15C +ENCODING 49500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C15D +ENCODING 49501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C15E +ENCODING 49502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C15F +ENCODING 49503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C160 +ENCODING 49504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C161 +ENCODING 49505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C162 +ENCODING 49506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C163 +ENCODING 49507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C164 +ENCODING 49508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C165 +ENCODING 49509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C166 +ENCODING 49510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C167 +ENCODING 49511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C168 +ENCODING 49512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C169 +ENCODING 49513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C16A +ENCODING 49514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C16B +ENCODING 49515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C16C +ENCODING 49516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C16D +ENCODING 49517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C16E +ENCODING 49518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C16F +ENCODING 49519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +067C +0E0C +0B7C +198C +60CC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C170 +ENCODING 49520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0636 +0676 +0E36 +0B76 +19B6 +60F6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C171 +ENCODING 49521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C172 +ENCODING 49522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C173 +ENCODING 49523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C174 +ENCODING 49524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0676 +0E36 +0B76 +19B6 +60F6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C175 +ENCODING 49525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C176 +ENCODING 49526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C177 +ENCODING 49527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C178 +ENCODING 49528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C179 +ENCODING 49529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C17A +ENCODING 49530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C17B +ENCODING 49531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C17C +ENCODING 49532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C17D +ENCODING 49533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C17E +ENCODING 49534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C17F +ENCODING 49535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C180 +ENCODING 49536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C181 +ENCODING 49537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C182 +ENCODING 49538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C183 +ENCODING 49539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C184 +ENCODING 49540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C185 +ENCODING 49541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C186 +ENCODING 49542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C187 +ENCODING 49543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C188 +ENCODING 49544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C189 +ENCODING 49545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C18A +ENCODING 49546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C18B +ENCODING 49547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +06F6 +0E36 +0BF6 +19B6 +60F6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C18C +ENCODING 49548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C18D +ENCODING 49549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C18E +ENCODING 49550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C18F +ENCODING 49551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C190 +ENCODING 49552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C191 +ENCODING 49553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C192 +ENCODING 49554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C193 +ENCODING 49555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C194 +ENCODING 49556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C195 +ENCODING 49557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C196 +ENCODING 49558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C197 +ENCODING 49559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C198 +ENCODING 49560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C199 +ENCODING 49561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C19A +ENCODING 49562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C19B +ENCODING 49563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C19C +ENCODING 49564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C19D +ENCODING 49565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C19E +ENCODING 49566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C19F +ENCODING 49567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C1A0 +ENCODING 49568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C1A1 +ENCODING 49569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C1A2 +ENCODING 49570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C1A3 +ENCODING 49571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C1A4 +ENCODING 49572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1A5 +ENCODING 49573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1A6 +ENCODING 49574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C1A7 +ENCODING 49575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +318C +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C1A8 +ENCODING 49576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +0618 +0E18 +1998 +30D8 +407F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1A9 +ENCODING 49577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1AA +ENCODING 49578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C1AB +ENCODING 49579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C1AC +ENCODING 49580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C1AD +ENCODING 49581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C1AE +ENCODING 49582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C1AF +ENCODING 49583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C1B0 +ENCODING 49584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1B1 +ENCODING 49585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C1B2 +ENCODING 49586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C1B3 +ENCODING 49587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C1B4 +ENCODING 49588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C1B5 +ENCODING 49589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C1B6 +ENCODING 49590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C1B7 +ENCODING 49591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C1B8 +ENCODING 49592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1B9 +ENCODING 49593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1BA +ENCODING 49594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C1BB +ENCODING 49595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1BC +ENCODING 49596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C1BD +ENCODING 49597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C1BE +ENCODING 49598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1BF +ENCODING 49599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1C0 +ENCODING 49600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1C1 +ENCODING 49601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C1C2 +ENCODING 49602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C1C3 +ENCODING 49603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +0618 +0E18 +1998 +30DF +4C58 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C1C4 +ENCODING 49604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0E36 +19B6 +30FE +4076 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C1C5 +ENCODING 49605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1C6 +ENCODING 49606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C1C7 +ENCODING 49607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C1C8 +ENCODING 49608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C1C9 +ENCODING 49609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C1CA +ENCODING 49610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C1CB +ENCODING 49611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C1CC +ENCODING 49612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1CD +ENCODING 49613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C1CE +ENCODING 49614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C1CF +ENCODING 49615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C1D0 +ENCODING 49616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C1D1 +ENCODING 49617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C1D2 +ENCODING 49618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C1D3 +ENCODING 49619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C1D4 +ENCODING 49620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1D5 +ENCODING 49621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1D6 +ENCODING 49622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C1D7 +ENCODING 49623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1D8 +ENCODING 49624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C1D9 +ENCODING 49625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C1DA +ENCODING 49626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1DB +ENCODING 49627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1DC +ENCODING 49628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1DD +ENCODING 49629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C1DE +ENCODING 49630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C1DF +ENCODING 49631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30FE +4C76 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C1E0 +ENCODING 49632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +0E0C +198C +30CC +406C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C1E1 +ENCODING 49633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1E2 +ENCODING 49634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C1E3 +ENCODING 49635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C1E4 +ENCODING 49636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C1E5 +ENCODING 49637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C1E6 +ENCODING 49638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C1E7 +ENCODING 49639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C1E8 +ENCODING 49640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1E9 +ENCODING 49641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C1EA +ENCODING 49642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C1EB +ENCODING 49643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C1EC +ENCODING 49644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C1ED +ENCODING 49645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C1EE +ENCODING 49646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C1EF +ENCODING 49647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C1F0 +ENCODING 49648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1F1 +ENCODING 49649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C1F2 +ENCODING 49650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C1F3 +ENCODING 49651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1F4 +ENCODING 49652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C1F5 +ENCODING 49653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C1F6 +ENCODING 49654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1F7 +ENCODING 49655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C1F8 +ENCODING 49656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1F9 +ENCODING 49657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C1FA +ENCODING 49658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C1FB +ENCODING 49659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +4C4C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C1FC +ENCODING 49660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C1FD +ENCODING 49661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C1FE +ENCODING 49662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C1FF +ENCODING 49663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C200 +ENCODING 49664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C201 +ENCODING 49665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C202 +ENCODING 49666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C203 +ENCODING 49667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C204 +ENCODING 49668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C205 +ENCODING 49669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C206 +ENCODING 49670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C207 +ENCODING 49671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C208 +ENCODING 49672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C209 +ENCODING 49673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C20A +ENCODING 49674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C20B +ENCODING 49675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C20C +ENCODING 49676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C20D +ENCODING 49677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C20E +ENCODING 49678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C20F +ENCODING 49679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C210 +ENCODING 49680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C211 +ENCODING 49681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C212 +ENCODING 49682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C213 +ENCODING 49683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C214 +ENCODING 49684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C215 +ENCODING 49685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C216 +ENCODING 49686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C217 +ENCODING 49687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +366C +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C218 +ENCODING 49688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+C219 +ENCODING 49689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C21A +ENCODING 49690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C21B +ENCODING 49691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C21C +ENCODING 49692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C21D +ENCODING 49693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C21E +ENCODING 49694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C21F +ENCODING 49695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C220 +ENCODING 49696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C221 +ENCODING 49697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C222 +ENCODING 49698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C223 +ENCODING 49699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C224 +ENCODING 49700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C225 +ENCODING 49701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C226 +ENCODING 49702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C227 +ENCODING 49703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C228 +ENCODING 49704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C229 +ENCODING 49705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C22A +ENCODING 49706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C22B +ENCODING 49707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C22C +ENCODING 49708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C22D +ENCODING 49709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C22E +ENCODING 49710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C22F +ENCODING 49711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C230 +ENCODING 49712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C231 +ENCODING 49713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C232 +ENCODING 49714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C233 +ENCODING 49715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C234 +ENCODING 49716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +0E0C +198C +30CC +406C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C235 +ENCODING 49717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C236 +ENCODING 49718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C237 +ENCODING 49719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C238 +ENCODING 49720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C239 +ENCODING 49721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C23A +ENCODING 49722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C23B +ENCODING 49723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C23C +ENCODING 49724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C23D +ENCODING 49725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C23E +ENCODING 49726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C23F +ENCODING 49727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C240 +ENCODING 49728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C241 +ENCODING 49729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C242 +ENCODING 49730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C243 +ENCODING 49731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C244 +ENCODING 49732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C245 +ENCODING 49733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C246 +ENCODING 49734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C247 +ENCODING 49735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C248 +ENCODING 49736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C249 +ENCODING 49737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C24A +ENCODING 49738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C24B +ENCODING 49739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C24C +ENCODING 49740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C24D +ENCODING 49741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C24E +ENCODING 49742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C24F +ENCODING 49743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +061C +0E0C +198C +30CC +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C250 +ENCODING 49744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +0636 +0E36 +19B6 +30F6 +4076 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C251 +ENCODING 49745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C252 +ENCODING 49746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C253 +ENCODING 49747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C254 +ENCODING 49748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +4076 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C255 +ENCODING 49749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C256 +ENCODING 49750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C257 +ENCODING 49751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C258 +ENCODING 49752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C259 +ENCODING 49753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C25A +ENCODING 49754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C25B +ENCODING 49755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C25C +ENCODING 49756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C25D +ENCODING 49757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C25E +ENCODING 49758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C25F +ENCODING 49759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C260 +ENCODING 49760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C261 +ENCODING 49761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C262 +ENCODING 49762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C263 +ENCODING 49763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C264 +ENCODING 49764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C265 +ENCODING 49765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C266 +ENCODING 49766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C267 +ENCODING 49767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C268 +ENCODING 49768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C269 +ENCODING 49769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C26A +ENCODING 49770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C26B +ENCODING 49771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0676 +0E36 +19B6 +30F6 +40F6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C26C +ENCODING 49772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +0E0C +198C +30CC +406C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C26D +ENCODING 49773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C26E +ENCODING 49774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C26F +ENCODING 49775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C270 +ENCODING 49776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C271 +ENCODING 49777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C272 +ENCODING 49778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C273 +ENCODING 49779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C274 +ENCODING 49780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C275 +ENCODING 49781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C276 +ENCODING 49782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C277 +ENCODING 49783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C278 +ENCODING 49784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C279 +ENCODING 49785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C27A +ENCODING 49786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C27B +ENCODING 49787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C27C +ENCODING 49788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C27D +ENCODING 49789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C27E +ENCODING 49790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C27F +ENCODING 49791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C280 +ENCODING 49792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C281 +ENCODING 49793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C282 +ENCODING 49794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C283 +ENCODING 49795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C284 +ENCODING 49796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C285 +ENCODING 49797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C286 +ENCODING 49798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C287 +ENCODING 49799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +0606 +0E06 +1986 +30C6 +4046 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C288 +ENCODING 49800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+C289 +ENCODING 49801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C28A +ENCODING 49802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C28B +ENCODING 49803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C28C +ENCODING 49804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C28D +ENCODING 49805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C28E +ENCODING 49806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C28F +ENCODING 49807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C290 +ENCODING 49808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C291 +ENCODING 49809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C292 +ENCODING 49810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C293 +ENCODING 49811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C294 +ENCODING 49812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C295 +ENCODING 49813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C296 +ENCODING 49814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C297 +ENCODING 49815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C298 +ENCODING 49816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C299 +ENCODING 49817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C29A +ENCODING 49818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C29B +ENCODING 49819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C29C +ENCODING 49820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C29D +ENCODING 49821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C29E +ENCODING 49822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C29F +ENCODING 49823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C2A0 +ENCODING 49824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C2A1 +ENCODING 49825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C2A2 +ENCODING 49826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C2A3 +ENCODING 49827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C2A4 +ENCODING 49828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C2A5 +ENCODING 49829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C2A6 +ENCODING 49830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C2A7 +ENCODING 49831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C2A8 +ENCODING 49832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C2A9 +ENCODING 49833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C2AA +ENCODING 49834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C2AB +ENCODING 49835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C2AC +ENCODING 49836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C2AD +ENCODING 49837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C2AE +ENCODING 49838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C2AF +ENCODING 49839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C2B0 +ENCODING 49840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C2B1 +ENCODING 49841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C2B2 +ENCODING 49842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C2B3 +ENCODING 49843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C2B4 +ENCODING 49844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C2B5 +ENCODING 49845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C2B6 +ENCODING 49846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C2B7 +ENCODING 49847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C2B8 +ENCODING 49848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C2B9 +ENCODING 49849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C2BA +ENCODING 49850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C2BB +ENCODING 49851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C2BC +ENCODING 49852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C2BD +ENCODING 49853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C2BE +ENCODING 49854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C2BF +ENCODING 49855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0380 +0180 +03C0 +0630 +0C18 +300C +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C2C0 +ENCODING 49856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +0E0C +198C +30CC +406C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C2C1 +ENCODING 49857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C2C2 +ENCODING 49858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C2C3 +ENCODING 49859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C2C4 +ENCODING 49860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C2C5 +ENCODING 49861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C2C6 +ENCODING 49862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C2C7 +ENCODING 49863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C2C8 +ENCODING 49864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C2C9 +ENCODING 49865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C2CA +ENCODING 49866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C2CB +ENCODING 49867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C2CC +ENCODING 49868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C2CD +ENCODING 49869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C2CE +ENCODING 49870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C2CF +ENCODING 49871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C2D0 +ENCODING 49872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C2D1 +ENCODING 49873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C2D2 +ENCODING 49874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C2D3 +ENCODING 49875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C2D4 +ENCODING 49876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C2D5 +ENCODING 49877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C2D6 +ENCODING 49878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C2D7 +ENCODING 49879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C2D8 +ENCODING 49880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C2D9 +ENCODING 49881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C2DA +ENCODING 49882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C2DB +ENCODING 49883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +060C +0E0C +198C +30CC +404C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C2DC +ENCODING 49884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +060C +0E0C +0B0C +198C +60CC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C2DD +ENCODING 49885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C2DE +ENCODING 49886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C2DF +ENCODING 49887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C2E0 +ENCODING 49888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C2E1 +ENCODING 49889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C2E2 +ENCODING 49890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C2E3 +ENCODING 49891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C2E4 +ENCODING 49892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C2E5 +ENCODING 49893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C2E6 +ENCODING 49894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C2E7 +ENCODING 49895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C2E8 +ENCODING 49896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C2E9 +ENCODING 49897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C2EA +ENCODING 49898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C2EB +ENCODING 49899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C2EC +ENCODING 49900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C2ED +ENCODING 49901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C2EE +ENCODING 49902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C2EF +ENCODING 49903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C2F0 +ENCODING 49904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C2F1 +ENCODING 49905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C2F2 +ENCODING 49906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C2F3 +ENCODING 49907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C2F4 +ENCODING 49908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C2F5 +ENCODING 49909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C2F6 +ENCODING 49910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C2F7 +ENCODING 49911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +060C +060C +0E0C +0B0C +198C +60CC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C2F8 +ENCODING 49912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +3318 +3318 +3318 +331F +2D18 +6D98 +CCD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C2F9 +ENCODING 49913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C2FA +ENCODING 49914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C2FB +ENCODING 49915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C2FC +ENCODING 49916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C2FD +ENCODING 49917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C2FE +ENCODING 49918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C2FF +ENCODING 49919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C300 +ENCODING 49920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C301 +ENCODING 49921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C302 +ENCODING 49922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C303 +ENCODING 49923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C304 +ENCODING 49924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C305 +ENCODING 49925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C306 +ENCODING 49926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C307 +ENCODING 49927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C308 +ENCODING 49928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C309 +ENCODING 49929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C30A +ENCODING 49930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C30B +ENCODING 49931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C30C +ENCODING 49932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C30D +ENCODING 49933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C30E +ENCODING 49934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C30F +ENCODING 49935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C310 +ENCODING 49936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C311 +ENCODING 49937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C312 +ENCODING 49938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C313 +ENCODING 49939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B18 +151F +3598 +64D8 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C314 +ENCODING 49940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3336 +3336 +3336 +333E +2D36 +6DB6 +CCF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C315 +ENCODING 49941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C316 +ENCODING 49942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C317 +ENCODING 49943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C318 +ENCODING 49944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C319 +ENCODING 49945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C31A +ENCODING 49946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C31B +ENCODING 49947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C31C +ENCODING 49948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C31D +ENCODING 49949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C31E +ENCODING 49950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C31F +ENCODING 49951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C320 +ENCODING 49952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C321 +ENCODING 49953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C322 +ENCODING 49954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C323 +ENCODING 49955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C324 +ENCODING 49956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C325 +ENCODING 49957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C326 +ENCODING 49958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C327 +ENCODING 49959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C328 +ENCODING 49960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C329 +ENCODING 49961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C32A +ENCODING 49962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C32B +ENCODING 49963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C32C +ENCODING 49964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C32D +ENCODING 49965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C32E +ENCODING 49966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C32F +ENCODING 49967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +153E +35B6 +64F6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C330 +ENCODING 49968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +3318 +3318 +331F +3318 +2D18 +6D9F +CCD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C331 +ENCODING 49969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C332 +ENCODING 49970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C333 +ENCODING 49971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C334 +ENCODING 49972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C335 +ENCODING 49973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C336 +ENCODING 49974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C337 +ENCODING 49975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C338 +ENCODING 49976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C339 +ENCODING 49977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C33A +ENCODING 49978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C33B +ENCODING 49979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C33C +ENCODING 49980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C33D +ENCODING 49981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C33E +ENCODING 49982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C33F +ENCODING 49983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C340 +ENCODING 49984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C341 +ENCODING 49985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C342 +ENCODING 49986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C343 +ENCODING 49987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C344 +ENCODING 49988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C345 +ENCODING 49989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C346 +ENCODING 49990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C347 +ENCODING 49991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C348 +ENCODING 49992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C349 +ENCODING 49993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C34A +ENCODING 49994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C34B +ENCODING 49995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1B18 +1B18 +1B1F +1518 +359F +64D8 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C34C +ENCODING 49996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3336 +3336 +333E +3336 +2D36 +6DBE +CCF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C34D +ENCODING 49997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C34E +ENCODING 49998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C34F +ENCODING 49999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C350 +ENCODING 50000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C351 +ENCODING 50001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C352 +ENCODING 50002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C353 +ENCODING 50003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C354 +ENCODING 50004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C355 +ENCODING 50005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C356 +ENCODING 50006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C357 +ENCODING 50007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C358 +ENCODING 50008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C359 +ENCODING 50009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C35A +ENCODING 50010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C35B +ENCODING 50011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C35C +ENCODING 50012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C35D +ENCODING 50013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C35E +ENCODING 50014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C35F +ENCODING 50015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C360 +ENCODING 50016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C361 +ENCODING 50017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C362 +ENCODING 50018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C363 +ENCODING 50019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C364 +ENCODING 50020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C365 +ENCODING 50021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C366 +ENCODING 50022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C367 +ENCODING 50023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B3E +1536 +35BE +64F6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C368 +ENCODING 50024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +330C +330C +330C +337C +2D0C +6D8C +CCCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C369 +ENCODING 50025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C36A +ENCODING 50026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C36B +ENCODING 50027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C36C +ENCODING 50028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +157C +358C +64CC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C36D +ENCODING 50029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C36E +ENCODING 50030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C36F +ENCODING 50031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C370 +ENCODING 50032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C371 +ENCODING 50033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C372 +ENCODING 50034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C373 +ENCODING 50035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C374 +ENCODING 50036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C375 +ENCODING 50037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C376 +ENCODING 50038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C377 +ENCODING 50039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C378 +ENCODING 50040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C379 +ENCODING 50041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C37A +ENCODING 50042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C37B +ENCODING 50043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C37C +ENCODING 50044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C37D +ENCODING 50045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C37E +ENCODING 50046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C37F +ENCODING 50047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C380 +ENCODING 50048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C381 +ENCODING 50049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C382 +ENCODING 50050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C383 +ENCODING 50051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +15FC +358C +64CC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C384 +ENCODING 50052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3336 +3336 +3336 +3376 +2D36 +6DB6 +CCF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C385 +ENCODING 50053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C386 +ENCODING 50054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C387 +ENCODING 50055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C388 +ENCODING 50056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +1576 +35B6 +64F6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C389 +ENCODING 50057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C38A +ENCODING 50058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C38B +ENCODING 50059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C38C +ENCODING 50060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C38D +ENCODING 50061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C38E +ENCODING 50062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C38F +ENCODING 50063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C390 +ENCODING 50064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C391 +ENCODING 50065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C392 +ENCODING 50066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C393 +ENCODING 50067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C394 +ENCODING 50068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C395 +ENCODING 50069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C396 +ENCODING 50070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C397 +ENCODING 50071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C398 +ENCODING 50072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C399 +ENCODING 50073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C39A +ENCODING 50074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C39B +ENCODING 50075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C39C +ENCODING 50076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C39D +ENCODING 50077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C39E +ENCODING 50078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C39F +ENCODING 50079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B36 +15F6 +35B6 +64F6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C3A0 +ENCODING 50080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +330C +330C +337C +330C +2D7C +6D8C +CCCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C3A1 +ENCODING 50081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C3A2 +ENCODING 50082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C3A3 +ENCODING 50083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C3A4 +ENCODING 50084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C3A5 +ENCODING 50085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C3A6 +ENCODING 50086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C3A7 +ENCODING 50087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C3A8 +ENCODING 50088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C3A9 +ENCODING 50089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C3AA +ENCODING 50090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C3AB +ENCODING 50091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C3AC +ENCODING 50092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C3AD +ENCODING 50093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C3AE +ENCODING 50094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C3AF +ENCODING 50095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C3B0 +ENCODING 50096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C3B1 +ENCODING 50097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C3B2 +ENCODING 50098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C3B3 +ENCODING 50099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C3B4 +ENCODING 50100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C3B5 +ENCODING 50101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C3B6 +ENCODING 50102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C3B7 +ENCODING 50103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C3B8 +ENCODING 50104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C3B9 +ENCODING 50105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C3BA +ENCODING 50106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C3BB +ENCODING 50107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B7C +150C +35FC +64CC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C3BC +ENCODING 50108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +3336 +3336 +3376 +3336 +2D76 +6DB6 +CCF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C3BD +ENCODING 50109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C3BE +ENCODING 50110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C3BF +ENCODING 50111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C3C0 +ENCODING 50112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1B76 +1536 +35F6 +64F6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C3C1 +ENCODING 50113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C3C2 +ENCODING 50114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C3C3 +ENCODING 50115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C3C4 +ENCODING 50116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C3C5 +ENCODING 50117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C3C6 +ENCODING 50118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C3C7 +ENCODING 50119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C3C8 +ENCODING 50120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C3C9 +ENCODING 50121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C3CA +ENCODING 50122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C3CB +ENCODING 50123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C3CC +ENCODING 50124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C3CD +ENCODING 50125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C3CE +ENCODING 50126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C3CF +ENCODING 50127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C3D0 +ENCODING 50128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C3D1 +ENCODING 50129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C3D2 +ENCODING 50130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C3D3 +ENCODING 50131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C3D4 +ENCODING 50132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C3D5 +ENCODING 50133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C3D6 +ENCODING 50134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C3D7 +ENCODING 50135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1B76 +1B36 +1BF6 +1536 +35F6 +64F6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C3D8 +ENCODING 50136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C60 +0C60 +0E60 +1AF0 +3198 +630C +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C3D9 +ENCODING 50137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C3DA +ENCODING 50138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C3DB +ENCODING 50139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C3DC +ENCODING 50140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C3DD +ENCODING 50141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C3DE +ENCODING 50142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C3DF +ENCODING 50143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C3E0 +ENCODING 50144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C3E1 +ENCODING 50145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C3E2 +ENCODING 50146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C3E3 +ENCODING 50147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C3E4 +ENCODING 50148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C3E5 +ENCODING 50149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C3E6 +ENCODING 50150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C3E7 +ENCODING 50151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C3E8 +ENCODING 50152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C3E9 +ENCODING 50153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C3EA +ENCODING 50154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C3EB +ENCODING 50155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C3EC +ENCODING 50156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C3ED +ENCODING 50157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C3EE +ENCODING 50158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C3EF +ENCODING 50159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C3F0 +ENCODING 50160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C3F1 +ENCODING 50161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C3F2 +ENCODING 50162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C3F3 +ENCODING 50163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C3F4 +ENCODING 50164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1998 +1F98 +36D8 +667F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C3F5 +ENCODING 50165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C3F6 +ENCODING 50166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C3F7 +ENCODING 50167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C3F8 +ENCODING 50168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C3F9 +ENCODING 50169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C3FA +ENCODING 50170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C3FB +ENCODING 50171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C3FC +ENCODING 50172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C3FD +ENCODING 50173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C3FE +ENCODING 50174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C3FF +ENCODING 50175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C400 +ENCODING 50176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C401 +ENCODING 50177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C402 +ENCODING 50178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C403 +ENCODING 50179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C404 +ENCODING 50180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C405 +ENCODING 50181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C406 +ENCODING 50182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C407 +ENCODING 50183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C408 +ENCODING 50184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C409 +ENCODING 50185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C40A +ENCODING 50186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C40B +ENCODING 50187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C40C +ENCODING 50188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C40D +ENCODING 50189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C40E +ENCODING 50190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C40F +ENCODING 50191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1998 +1998 +1F98 +36DF +6E78 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C410 +ENCODING 50192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +19B6 +1FB6 +36FE +6676 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C411 +ENCODING 50193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C412 +ENCODING 50194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C413 +ENCODING 50195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C414 +ENCODING 50196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C415 +ENCODING 50197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C416 +ENCODING 50198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C417 +ENCODING 50199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C418 +ENCODING 50200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C419 +ENCODING 50201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C41A +ENCODING 50202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C41B +ENCODING 50203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C41C +ENCODING 50204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C41D +ENCODING 50205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C41E +ENCODING 50206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C41F +ENCODING 50207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C420 +ENCODING 50208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C421 +ENCODING 50209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C422 +ENCODING 50210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C423 +ENCODING 50211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C424 +ENCODING 50212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C425 +ENCODING 50213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C426 +ENCODING 50214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C427 +ENCODING 50215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C428 +ENCODING 50216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C429 +ENCODING 50217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C42A +ENCODING 50218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C42B +ENCODING 50219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36FE +6E76 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C42C +ENCODING 50220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +198C +1F8C +36CC +666C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C42D +ENCODING 50221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C42E +ENCODING 50222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C42F +ENCODING 50223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C430 +ENCODING 50224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C431 +ENCODING 50225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C432 +ENCODING 50226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C433 +ENCODING 50227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C434 +ENCODING 50228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C435 +ENCODING 50229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C436 +ENCODING 50230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C437 +ENCODING 50231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C438 +ENCODING 50232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C439 +ENCODING 50233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C43A +ENCODING 50234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C43B +ENCODING 50235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C43C +ENCODING 50236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C43D +ENCODING 50237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C43E +ENCODING 50238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C43F +ENCODING 50239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C440 +ENCODING 50240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C441 +ENCODING 50241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C442 +ENCODING 50242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C443 +ENCODING 50243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C444 +ENCODING 50244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C445 +ENCODING 50245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C446 +ENCODING 50246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C447 +ENCODING 50247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +6E6C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C448 +ENCODING 50248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C60 +0C60 +0E60 +1AF0 +3198 +630C +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C449 +ENCODING 50249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C44A +ENCODING 50250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C44B +ENCODING 50251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C44C +ENCODING 50252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C44D +ENCODING 50253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C44E +ENCODING 50254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C44F +ENCODING 50255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C450 +ENCODING 50256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C451 +ENCODING 50257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C452 +ENCODING 50258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C453 +ENCODING 50259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C454 +ENCODING 50260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C455 +ENCODING 50261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C456 +ENCODING 50262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C457 +ENCODING 50263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C458 +ENCODING 50264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C459 +ENCODING 50265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C45A +ENCODING 50266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C45B +ENCODING 50267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C45C +ENCODING 50268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C45D +ENCODING 50269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C45E +ENCODING 50270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C45F +ENCODING 50271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C460 +ENCODING 50272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C461 +ENCODING 50273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C462 +ENCODING 50274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C463 +ENCODING 50275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +67EC +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C464 +ENCODING 50276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0EE0 +1AB0 +3118 +610C +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+C465 +ENCODING 50277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C466 +ENCODING 50278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C467 +ENCODING 50279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C468 +ENCODING 50280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C469 +ENCODING 50281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C46A +ENCODING 50282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C46B +ENCODING 50283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C46C +ENCODING 50284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C46D +ENCODING 50285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C46E +ENCODING 50286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C46F +ENCODING 50287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C470 +ENCODING 50288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C471 +ENCODING 50289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C472 +ENCODING 50290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C473 +ENCODING 50291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C474 +ENCODING 50292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C475 +ENCODING 50293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C476 +ENCODING 50294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C477 +ENCODING 50295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C478 +ENCODING 50296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C479 +ENCODING 50297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C47A +ENCODING 50298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C47B +ENCODING 50299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C47C +ENCODING 50300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C47D +ENCODING 50301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C47E +ENCODING 50302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C47F +ENCODING 50303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C480 +ENCODING 50304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +198C +1F8C +36CC +666C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C481 +ENCODING 50305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C482 +ENCODING 50306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C483 +ENCODING 50307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C484 +ENCODING 50308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C485 +ENCODING 50309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C486 +ENCODING 50310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C487 +ENCODING 50311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C488 +ENCODING 50312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C489 +ENCODING 50313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C48A +ENCODING 50314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C48B +ENCODING 50315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C48C +ENCODING 50316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C48D +ENCODING 50317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C48E +ENCODING 50318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C48F +ENCODING 50319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C490 +ENCODING 50320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C491 +ENCODING 50321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C492 +ENCODING 50322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C493 +ENCODING 50323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C494 +ENCODING 50324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C495 +ENCODING 50325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C496 +ENCODING 50326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C497 +ENCODING 50327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C498 +ENCODING 50328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C499 +ENCODING 50329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C49A +ENCODING 50330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C49B +ENCODING 50331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +199C +198C +1F8C +36CC +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C49C +ENCODING 50332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +19B6 +1FB6 +36F6 +6676 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C49D +ENCODING 50333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C49E +ENCODING 50334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C49F +ENCODING 50335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C4A0 +ENCODING 50336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +6676 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C4A1 +ENCODING 50337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C4A2 +ENCODING 50338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C4A3 +ENCODING 50339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C4A4 +ENCODING 50340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C4A5 +ENCODING 50341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C4A6 +ENCODING 50342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C4A7 +ENCODING 50343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C4A8 +ENCODING 50344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C4A9 +ENCODING 50345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C4AA +ENCODING 50346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C4AB +ENCODING 50347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C4AC +ENCODING 50348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C4AD +ENCODING 50349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C4AE +ENCODING 50350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C4AF +ENCODING 50351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C4B0 +ENCODING 50352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C4B1 +ENCODING 50353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C4B2 +ENCODING 50354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C4B3 +ENCODING 50355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C4B4 +ENCODING 50356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C4B5 +ENCODING 50357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C4B6 +ENCODING 50358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C4B7 +ENCODING 50359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +19F6 +19B6 +1FB6 +36F6 +66F6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C4B8 +ENCODING 50360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +198C +1F8C +36CC +666C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C4B9 +ENCODING 50361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C4BA +ENCODING 50362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C4BB +ENCODING 50363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C4BC +ENCODING 50364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C4BD +ENCODING 50365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C4BE +ENCODING 50366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C4BF +ENCODING 50367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C4C0 +ENCODING 50368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C4C1 +ENCODING 50369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C4C2 +ENCODING 50370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C4C3 +ENCODING 50371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C4C4 +ENCODING 50372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C4C5 +ENCODING 50373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C4C6 +ENCODING 50374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C4C7 +ENCODING 50375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C4C8 +ENCODING 50376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C4C9 +ENCODING 50377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C4CA +ENCODING 50378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C4CB +ENCODING 50379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C4CC +ENCODING 50380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C4CD +ENCODING 50381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C4CE +ENCODING 50382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C4CF +ENCODING 50383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C4D0 +ENCODING 50384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C4D1 +ENCODING 50385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C4D2 +ENCODING 50386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C4D3 +ENCODING 50387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1986 +1986 +1F86 +36C6 +6666 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C4D4 +ENCODING 50388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0EE0 +1AB0 +3118 +610C +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+C4D5 +ENCODING 50389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C4D6 +ENCODING 50390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C4D7 +ENCODING 50391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C4D8 +ENCODING 50392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C4D9 +ENCODING 50393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C4DA +ENCODING 50394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C4DB +ENCODING 50395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C4DC +ENCODING 50396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C4DD +ENCODING 50397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C4DE +ENCODING 50398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C4DF +ENCODING 50399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C4E0 +ENCODING 50400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C4E1 +ENCODING 50401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C4E2 +ENCODING 50402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C4E3 +ENCODING 50403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C4E4 +ENCODING 50404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C4E5 +ENCODING 50405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C4E6 +ENCODING 50406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C4E7 +ENCODING 50407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C4E8 +ENCODING 50408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C4E9 +ENCODING 50409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C4EA +ENCODING 50410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C4EB +ENCODING 50411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C4EC +ENCODING 50412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C4ED +ENCODING 50413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C4EE +ENCODING 50414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C4EF +ENCODING 50415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C4F0 +ENCODING 50416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C60 +0C60 +0E60 +1AF0 +3198 +630C +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C4F1 +ENCODING 50417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C4F2 +ENCODING 50418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C4F3 +ENCODING 50419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C4F4 +ENCODING 50420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C4F5 +ENCODING 50421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C4F6 +ENCODING 50422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C4F7 +ENCODING 50423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C4F8 +ENCODING 50424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C4F9 +ENCODING 50425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C4FA +ENCODING 50426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C4FB +ENCODING 50427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C4FC +ENCODING 50428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C4FD +ENCODING 50429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C4FE +ENCODING 50430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C4FF +ENCODING 50431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C500 +ENCODING 50432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C501 +ENCODING 50433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C502 +ENCODING 50434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C503 +ENCODING 50435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C504 +ENCODING 50436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C505 +ENCODING 50437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C506 +ENCODING 50438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C507 +ENCODING 50439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C508 +ENCODING 50440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C509 +ENCODING 50441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C50A +ENCODING 50442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C50B +ENCODING 50443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C60 +0C60 +0E60 +1BF0 +3198 +618C +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C50C +ENCODING 50444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +198C +1F8C +36CC +666C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C50D +ENCODING 50445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C50E +ENCODING 50446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C50F +ENCODING 50447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C510 +ENCODING 50448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C511 +ENCODING 50449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C512 +ENCODING 50450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C513 +ENCODING 50451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C514 +ENCODING 50452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C515 +ENCODING 50453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C516 +ENCODING 50454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C517 +ENCODING 50455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C518 +ENCODING 50456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C519 +ENCODING 50457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C51A +ENCODING 50458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C51B +ENCODING 50459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C51C +ENCODING 50460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C51D +ENCODING 50461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C51E +ENCODING 50462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C51F +ENCODING 50463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C520 +ENCODING 50464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C521 +ENCODING 50465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C522 +ENCODING 50466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C523 +ENCODING 50467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C524 +ENCODING 50468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C525 +ENCODING 50469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C526 +ENCODING 50470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C527 +ENCODING 50471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +198C +198C +1F8C +36CC +666C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C528 +ENCODING 50472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +330C +330C +330C +330C +2D0C +6D8C +CCCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C529 +ENCODING 50473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C52A +ENCODING 50474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C52B +ENCODING 50475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C52C +ENCODING 50476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C52D +ENCODING 50477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C52E +ENCODING 50478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C52F +ENCODING 50479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C530 +ENCODING 50480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C531 +ENCODING 50481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C532 +ENCODING 50482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C533 +ENCODING 50483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C534 +ENCODING 50484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C535 +ENCODING 50485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C536 +ENCODING 50486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C537 +ENCODING 50487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C538 +ENCODING 50488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C539 +ENCODING 50489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C53A +ENCODING 50490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C53B +ENCODING 50491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C53C +ENCODING 50492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C53D +ENCODING 50493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C53E +ENCODING 50494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C53F +ENCODING 50495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C540 +ENCODING 50496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C541 +ENCODING 50497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C542 +ENCODING 50498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C543 +ENCODING 50499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1B0C +1B0C +1B0C +150C +358C +64CC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C544 +ENCODING 50500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +1E18 +3318 +6198 +619F +6198 +3318 +1E18 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C545 +ENCODING 50501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C546 +ENCODING 50502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C547 +ENCODING 50503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C548 +ENCODING 50504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C549 +ENCODING 50505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C54A +ENCODING 50506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C54B +ENCODING 50507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C54C +ENCODING 50508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C54D +ENCODING 50509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C54E +ENCODING 50510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C54F +ENCODING 50511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C550 +ENCODING 50512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C551 +ENCODING 50513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C552 +ENCODING 50514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C553 +ENCODING 50515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C554 +ENCODING 50516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C555 +ENCODING 50517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C556 +ENCODING 50518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C557 +ENCODING 50519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C558 +ENCODING 50520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C559 +ENCODING 50521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C55A +ENCODING 50522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C55B +ENCODING 50523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C55C +ENCODING 50524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C55D +ENCODING 50525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C55E +ENCODING 50526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C55F +ENCODING 50527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +3198 +1F18 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C560 +ENCODING 50528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +1E36 +3336 +61B6 +61BE +61B6 +3336 +1E36 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C561 +ENCODING 50529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C562 +ENCODING 50530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C563 +ENCODING 50531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C564 +ENCODING 50532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C565 +ENCODING 50533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C566 +ENCODING 50534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C567 +ENCODING 50535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C568 +ENCODING 50536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C569 +ENCODING 50537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C56A +ENCODING 50538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C56B +ENCODING 50539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C56C +ENCODING 50540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C56D +ENCODING 50541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C56E +ENCODING 50542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C56F +ENCODING 50543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C570 +ENCODING 50544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C571 +ENCODING 50545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C572 +ENCODING 50546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C573 +ENCODING 50547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C574 +ENCODING 50548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C575 +ENCODING 50549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C576 +ENCODING 50550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C577 +ENCODING 50551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C578 +ENCODING 50552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C579 +ENCODING 50553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C57A +ENCODING 50554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C57B +ENCODING 50555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +31B6 +1F36 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C57C +ENCODING 50556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +1E18 +3318 +619F +6198 +6198 +331F +1E18 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C57D +ENCODING 50557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C57E +ENCODING 50558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C57F +ENCODING 50559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C580 +ENCODING 50560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C581 +ENCODING 50561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C582 +ENCODING 50562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C583 +ENCODING 50563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C584 +ENCODING 50564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C585 +ENCODING 50565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C586 +ENCODING 50566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C587 +ENCODING 50567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C588 +ENCODING 50568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C589 +ENCODING 50569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C58A +ENCODING 50570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C58B +ENCODING 50571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C58C +ENCODING 50572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C58D +ENCODING 50573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C58E +ENCODING 50574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C58F +ENCODING 50575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C590 +ENCODING 50576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C591 +ENCODING 50577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C592 +ENCODING 50578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C593 +ENCODING 50579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C594 +ENCODING 50580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C595 +ENCODING 50581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C596 +ENCODING 50582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C597 +ENCODING 50583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +319F +3198 +319F +1F18 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C598 +ENCODING 50584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +1E36 +3336 +61BE +61B6 +61B6 +333E +1E36 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C599 +ENCODING 50585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C59A +ENCODING 50586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C59B +ENCODING 50587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C59C +ENCODING 50588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C59D +ENCODING 50589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C59E +ENCODING 50590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C59F +ENCODING 50591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C5A0 +ENCODING 50592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C5A1 +ENCODING 50593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C5A2 +ENCODING 50594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C5A3 +ENCODING 50595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C5A4 +ENCODING 50596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C5A5 +ENCODING 50597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C5A6 +ENCODING 50598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C5A7 +ENCODING 50599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C5A8 +ENCODING 50600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C5A9 +ENCODING 50601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C5AA +ENCODING 50602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C5AB +ENCODING 50603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C5AC +ENCODING 50604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C5AD +ENCODING 50605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C5AE +ENCODING 50606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C5AF +ENCODING 50607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C5B0 +ENCODING 50608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C5B1 +ENCODING 50609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C5B2 +ENCODING 50610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C5B3 +ENCODING 50611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31BE +31B6 +31BE +1F36 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C5B4 +ENCODING 50612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +1E0C +330C +618C +61FC +618C +330C +1E0C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C5B5 +ENCODING 50613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C5B6 +ENCODING 50614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C5B7 +ENCODING 50615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C5B8 +ENCODING 50616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C5B9 +ENCODING 50617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C5BA +ENCODING 50618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C5BB +ENCODING 50619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C5BC +ENCODING 50620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C5BD +ENCODING 50621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C5BE +ENCODING 50622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C5BF +ENCODING 50623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C5C0 +ENCODING 50624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C5C1 +ENCODING 50625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C5C2 +ENCODING 50626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C5C3 +ENCODING 50627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C5C4 +ENCODING 50628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C5C5 +ENCODING 50629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C5C6 +ENCODING 50630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C5C7 +ENCODING 50631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C5C8 +ENCODING 50632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C5C9 +ENCODING 50633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C5CA +ENCODING 50634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C5CB +ENCODING 50635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C5CC +ENCODING 50636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C5CD +ENCODING 50637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C5CE +ENCODING 50638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C5CF +ENCODING 50639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +31FC +318C +1F0C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C5D0 +ENCODING 50640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +1E36 +3336 +61B6 +61F6 +61B6 +3336 +1E36 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C5D1 +ENCODING 50641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C5D2 +ENCODING 50642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C5D3 +ENCODING 50643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C5D4 +ENCODING 50644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C5D5 +ENCODING 50645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C5D6 +ENCODING 50646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C5D7 +ENCODING 50647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C5D8 +ENCODING 50648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C5D9 +ENCODING 50649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C5DA +ENCODING 50650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C5DB +ENCODING 50651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C5DC +ENCODING 50652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C5DD +ENCODING 50653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C5DE +ENCODING 50654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C5DF +ENCODING 50655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C5E0 +ENCODING 50656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C5E1 +ENCODING 50657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C5E2 +ENCODING 50658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C5E3 +ENCODING 50659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C5E4 +ENCODING 50660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C5E5 +ENCODING 50661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C5E6 +ENCODING 50662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C5E7 +ENCODING 50663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C5E8 +ENCODING 50664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C5E9 +ENCODING 50665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C5EA +ENCODING 50666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C5EB +ENCODING 50667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +31B6 +1F36 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C5EC +ENCODING 50668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +1E0C +330C +61FC +618C +61FC +330C +1E0C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C5ED +ENCODING 50669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C5EE +ENCODING 50670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C5EF +ENCODING 50671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C5F0 +ENCODING 50672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C5F1 +ENCODING 50673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C5F2 +ENCODING 50674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C5F3 +ENCODING 50675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C5F4 +ENCODING 50676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C5F5 +ENCODING 50677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C5F6 +ENCODING 50678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C5F7 +ENCODING 50679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C5F8 +ENCODING 50680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C5F9 +ENCODING 50681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C5FA +ENCODING 50682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C5FB +ENCODING 50683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C5FC +ENCODING 50684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C5FD +ENCODING 50685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C5FE +ENCODING 50686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C5FF +ENCODING 50687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C600 +ENCODING 50688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C601 +ENCODING 50689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C602 +ENCODING 50690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C603 +ENCODING 50691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C604 +ENCODING 50692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C605 +ENCODING 50693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C606 +ENCODING 50694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C607 +ENCODING 50695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +31FC +318C +31FC +1F0C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C608 +ENCODING 50696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +1E36 +3336 +61F6 +61B6 +61F6 +3336 +1E36 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C609 +ENCODING 50697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C60A +ENCODING 50698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C60B +ENCODING 50699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C60C +ENCODING 50700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C60D +ENCODING 50701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C60E +ENCODING 50702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C60F +ENCODING 50703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C610 +ENCODING 50704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C611 +ENCODING 50705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C612 +ENCODING 50706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C613 +ENCODING 50707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C614 +ENCODING 50708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C615 +ENCODING 50709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C616 +ENCODING 50710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C617 +ENCODING 50711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C618 +ENCODING 50712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C619 +ENCODING 50713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C61A +ENCODING 50714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C61B +ENCODING 50715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C61C +ENCODING 50716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C61D +ENCODING 50717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C61E +ENCODING 50718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C61F +ENCODING 50719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C620 +ENCODING 50720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C621 +ENCODING 50721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C622 +ENCODING 50722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C623 +ENCODING 50723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31F6 +31B6 +31F6 +1F36 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C624 +ENCODING 50724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +1830 +1830 +1830 +0FE0 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C625 +ENCODING 50725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C626 +ENCODING 50726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C627 +ENCODING 50727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C628 +ENCODING 50728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C629 +ENCODING 50729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C62A +ENCODING 50730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C62B +ENCODING 50731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C62C +ENCODING 50732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C62D +ENCODING 50733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C62E +ENCODING 50734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C62F +ENCODING 50735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C630 +ENCODING 50736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C631 +ENCODING 50737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C632 +ENCODING 50738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C633 +ENCODING 50739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C634 +ENCODING 50740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C635 +ENCODING 50741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C636 +ENCODING 50742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C637 +ENCODING 50743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C638 +ENCODING 50744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C639 +ENCODING 50745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C63A +ENCODING 50746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C63B +ENCODING 50747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C63C +ENCODING 50748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C63D +ENCODING 50749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C63E +ENCODING 50750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C63F +ENCODING 50751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C640 +ENCODING 50752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +3198 +1F18 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C641 +ENCODING 50753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C642 +ENCODING 50754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C643 +ENCODING 50755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C644 +ENCODING 50756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C645 +ENCODING 50757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C646 +ENCODING 50758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C647 +ENCODING 50759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C648 +ENCODING 50760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C649 +ENCODING 50761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C64A +ENCODING 50762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C64B +ENCODING 50763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C64C +ENCODING 50764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C64D +ENCODING 50765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C64E +ENCODING 50766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C64F +ENCODING 50767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C650 +ENCODING 50768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C651 +ENCODING 50769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C652 +ENCODING 50770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C653 +ENCODING 50771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C654 +ENCODING 50772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C655 +ENCODING 50773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C656 +ENCODING 50774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C657 +ENCODING 50775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C658 +ENCODING 50776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C659 +ENCODING 50777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C65A +ENCODING 50778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C65B +ENCODING 50779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1F18 +3198 +3198 +319F +1F18 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C65C +ENCODING 50780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1F3E +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C65D +ENCODING 50781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C65E +ENCODING 50782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C65F +ENCODING 50783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C660 +ENCODING 50784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C661 +ENCODING 50785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C662 +ENCODING 50786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C663 +ENCODING 50787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C664 +ENCODING 50788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C665 +ENCODING 50789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C666 +ENCODING 50790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C667 +ENCODING 50791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C668 +ENCODING 50792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C669 +ENCODING 50793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C66A +ENCODING 50794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C66B +ENCODING 50795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C66C +ENCODING 50796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C66D +ENCODING 50797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C66E +ENCODING 50798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C66F +ENCODING 50799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C670 +ENCODING 50800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C671 +ENCODING 50801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C672 +ENCODING 50802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C673 +ENCODING 50803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C674 +ENCODING 50804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C675 +ENCODING 50805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C676 +ENCODING 50806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C677 +ENCODING 50807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C678 +ENCODING 50808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C679 +ENCODING 50809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C67A +ENCODING 50810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C67B +ENCODING 50811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C67C +ENCODING 50812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C67D +ENCODING 50813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C67E +ENCODING 50814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C67F +ENCODING 50815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C680 +ENCODING 50816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C681 +ENCODING 50817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C682 +ENCODING 50818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C683 +ENCODING 50819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C684 +ENCODING 50820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C685 +ENCODING 50821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C686 +ENCODING 50822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C687 +ENCODING 50823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C688 +ENCODING 50824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C689 +ENCODING 50825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C68A +ENCODING 50826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C68B +ENCODING 50827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C68C +ENCODING 50828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C68D +ENCODING 50829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C68E +ENCODING 50830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C68F +ENCODING 50831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C690 +ENCODING 50832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C691 +ENCODING 50833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C692 +ENCODING 50834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C693 +ENCODING 50835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C694 +ENCODING 50836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +1830 +1830 +1830 +0FE0 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C695 +ENCODING 50837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C696 +ENCODING 50838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C697 +ENCODING 50839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C698 +ENCODING 50840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C699 +ENCODING 50841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C69A +ENCODING 50842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C69B +ENCODING 50843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C69C +ENCODING 50844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C69D +ENCODING 50845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C69E +ENCODING 50846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C69F +ENCODING 50847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C6A0 +ENCODING 50848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C6A1 +ENCODING 50849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C6A2 +ENCODING 50850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C6A3 +ENCODING 50851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C6A4 +ENCODING 50852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C6A5 +ENCODING 50853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C6A6 +ENCODING 50854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C6A7 +ENCODING 50855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C6A8 +ENCODING 50856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C6A9 +ENCODING 50857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C6AA +ENCODING 50858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C6AB +ENCODING 50859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C6AC +ENCODING 50860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C6AD +ENCODING 50861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C6AE +ENCODING 50862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C6AF +ENCODING 50863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C6B0 +ENCODING 50864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+C6B1 +ENCODING 50865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C6B2 +ENCODING 50866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C6B3 +ENCODING 50867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C6B4 +ENCODING 50868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C6B5 +ENCODING 50869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C6B6 +ENCODING 50870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C6B7 +ENCODING 50871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C6B8 +ENCODING 50872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C6B9 +ENCODING 50873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C6BA +ENCODING 50874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C6BB +ENCODING 50875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C6BC +ENCODING 50876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C6BD +ENCODING 50877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C6BE +ENCODING 50878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C6BF +ENCODING 50879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C6C0 +ENCODING 50880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C6C1 +ENCODING 50881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C6C2 +ENCODING 50882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C6C3 +ENCODING 50883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C6C4 +ENCODING 50884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C6C5 +ENCODING 50885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C6C6 +ENCODING 50886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C6C7 +ENCODING 50887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C6C8 +ENCODING 50888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C6C9 +ENCODING 50889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C6CA +ENCODING 50890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C6CB +ENCODING 50891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C6CC +ENCODING 50892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C6CD +ENCODING 50893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C6CE +ENCODING 50894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C6CF +ENCODING 50895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C6D0 +ENCODING 50896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C6D1 +ENCODING 50897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C6D2 +ENCODING 50898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C6D3 +ENCODING 50899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C6D4 +ENCODING 50900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C6D5 +ENCODING 50901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C6D6 +ENCODING 50902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C6D7 +ENCODING 50903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C6D8 +ENCODING 50904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C6D9 +ENCODING 50905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C6DA +ENCODING 50906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C6DB +ENCODING 50907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C6DC +ENCODING 50908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C6DD +ENCODING 50909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C6DE +ENCODING 50910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C6DF +ENCODING 50911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C6E0 +ENCODING 50912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C6E1 +ENCODING 50913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C6E2 +ENCODING 50914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C6E3 +ENCODING 50915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C6E4 +ENCODING 50916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C6E5 +ENCODING 50917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C6E6 +ENCODING 50918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C6E7 +ENCODING 50919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1F1C +318C +318C +318C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C6E8 +ENCODING 50920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1F36 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C6E9 +ENCODING 50921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C6EA +ENCODING 50922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C6EB +ENCODING 50923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C6EC +ENCODING 50924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31F6 +1F36 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C6ED +ENCODING 50925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C6EE +ENCODING 50926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C6EF +ENCODING 50927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C6F0 +ENCODING 50928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C6F1 +ENCODING 50929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C6F2 +ENCODING 50930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C6F3 +ENCODING 50931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C6F4 +ENCODING 50932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C6F5 +ENCODING 50933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C6F6 +ENCODING 50934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C6F7 +ENCODING 50935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C6F8 +ENCODING 50936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C6F9 +ENCODING 50937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C6FA +ENCODING 50938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C6FB +ENCODING 50939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C6FC +ENCODING 50940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C6FD +ENCODING 50941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C6FE +ENCODING 50942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C6FF +ENCODING 50943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C700 +ENCODING 50944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C701 +ENCODING 50945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C702 +ENCODING 50946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C703 +ENCODING 50947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F76 +31B6 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C704 +ENCODING 50948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C705 +ENCODING 50949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C706 +ENCODING 50950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C707 +ENCODING 50951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C708 +ENCODING 50952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C709 +ENCODING 50953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C70A +ENCODING 50954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C70B +ENCODING 50955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C70C +ENCODING 50956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C70D +ENCODING 50957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C70E +ENCODING 50958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C70F +ENCODING 50959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C710 +ENCODING 50960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C711 +ENCODING 50961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C712 +ENCODING 50962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C713 +ENCODING 50963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C714 +ENCODING 50964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C715 +ENCODING 50965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C716 +ENCODING 50966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C717 +ENCODING 50967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C718 +ENCODING 50968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C719 +ENCODING 50969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C71A +ENCODING 50970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C71B +ENCODING 50971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C71C +ENCODING 50972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C71D +ENCODING 50973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C71E +ENCODING 50974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C71F +ENCODING 50975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1F06 +3186 +3186 +3186 +1F06 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C720 +ENCODING 50976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+C721 +ENCODING 50977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C722 +ENCODING 50978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C723 +ENCODING 50979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C724 +ENCODING 50980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C725 +ENCODING 50981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C726 +ENCODING 50982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C727 +ENCODING 50983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C728 +ENCODING 50984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C729 +ENCODING 50985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C72A +ENCODING 50986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C72B +ENCODING 50987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C72C +ENCODING 50988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C72D +ENCODING 50989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C72E +ENCODING 50990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C72F +ENCODING 50991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C730 +ENCODING 50992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C731 +ENCODING 50993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C732 +ENCODING 50994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C733 +ENCODING 50995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C734 +ENCODING 50996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C735 +ENCODING 50997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C736 +ENCODING 50998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C737 +ENCODING 50999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C738 +ENCODING 51000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C739 +ENCODING 51001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C73A +ENCODING 51002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C73B +ENCODING 51003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C73C +ENCODING 51004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0FE0 +1830 +1830 +1830 +0FE0 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C73D +ENCODING 51005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C73E +ENCODING 51006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C73F +ENCODING 51007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C740 +ENCODING 51008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C741 +ENCODING 51009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C742 +ENCODING 51010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C743 +ENCODING 51011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C744 +ENCODING 51012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C745 +ENCODING 51013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C746 +ENCODING 51014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C747 +ENCODING 51015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C748 +ENCODING 51016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C749 +ENCODING 51017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C74A +ENCODING 51018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C74B +ENCODING 51019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C74C +ENCODING 51020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C74D +ENCODING 51021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C74E +ENCODING 51022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C74F +ENCODING 51023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C750 +ENCODING 51024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C751 +ENCODING 51025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C752 +ENCODING 51026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C753 +ENCODING 51027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C754 +ENCODING 51028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C755 +ENCODING 51029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C756 +ENCODING 51030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C757 +ENCODING 51031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C758 +ENCODING 51032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C759 +ENCODING 51033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C75A +ENCODING 51034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C75B +ENCODING 51035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C75C +ENCODING 51036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C75D +ENCODING 51037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C75E +ENCODING 51038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C75F +ENCODING 51039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C760 +ENCODING 51040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C761 +ENCODING 51041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C762 +ENCODING 51042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C763 +ENCODING 51043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C764 +ENCODING 51044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C765 +ENCODING 51045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C766 +ENCODING 51046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C767 +ENCODING 51047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C768 +ENCODING 51048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C769 +ENCODING 51049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C76A +ENCODING 51050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C76B +ENCODING 51051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C76C +ENCODING 51052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C76D +ENCODING 51053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C76E +ENCODING 51054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C76F +ENCODING 51055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C770 +ENCODING 51056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C771 +ENCODING 51057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C772 +ENCODING 51058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C773 +ENCODING 51059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +1F0C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C774 +ENCODING 51060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +1E0C +330C +618C +618C +618C +330C +1E0C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C775 +ENCODING 51061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C776 +ENCODING 51062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C777 +ENCODING 51063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C778 +ENCODING 51064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C779 +ENCODING 51065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C77A +ENCODING 51066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C77B +ENCODING 51067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C77C +ENCODING 51068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C77D +ENCODING 51069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C77E +ENCODING 51070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C77F +ENCODING 51071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C780 +ENCODING 51072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C781 +ENCODING 51073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C782 +ENCODING 51074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C783 +ENCODING 51075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C784 +ENCODING 51076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C785 +ENCODING 51077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C786 +ENCODING 51078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C787 +ENCODING 51079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C788 +ENCODING 51080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C789 +ENCODING 51081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C78A +ENCODING 51082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C78B +ENCODING 51083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C78C +ENCODING 51084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C78D +ENCODING 51085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C78E +ENCODING 51086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C78F +ENCODING 51087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1F0C +318C +318C +318C +318C +1F0C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C790 +ENCODING 51088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F18 +0318 +0318 +061F +0C18 +1B18 +6198 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C791 +ENCODING 51089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C792 +ENCODING 51090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C793 +ENCODING 51091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C794 +ENCODING 51092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C795 +ENCODING 51093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C796 +ENCODING 51094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C797 +ENCODING 51095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C798 +ENCODING 51096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C799 +ENCODING 51097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C79A +ENCODING 51098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C79B +ENCODING 51099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C79C +ENCODING 51100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C79D +ENCODING 51101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C79E +ENCODING 51102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C79F +ENCODING 51103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C7A0 +ENCODING 51104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C7A1 +ENCODING 51105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C7A2 +ENCODING 51106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C7A3 +ENCODING 51107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C7A4 +ENCODING 51108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C7A5 +ENCODING 51109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C7A6 +ENCODING 51110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C7A7 +ENCODING 51111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C7A8 +ENCODING 51112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C7A9 +ENCODING 51113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C7AA +ENCODING 51114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C7AB +ENCODING 51115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +0318 +061F +0D98 +30D8 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C7AC +ENCODING 51116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7F36 +0336 +0336 +063E +0C36 +1B36 +61B6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C7AD +ENCODING 51117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C7AE +ENCODING 51118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C7AF +ENCODING 51119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C7B0 +ENCODING 51120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C7B1 +ENCODING 51121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C7B2 +ENCODING 51122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C7B3 +ENCODING 51123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C7B4 +ENCODING 51124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C7B5 +ENCODING 51125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C7B6 +ENCODING 51126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C7B7 +ENCODING 51127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C7B8 +ENCODING 51128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C7B9 +ENCODING 51129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C7BA +ENCODING 51130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C7BB +ENCODING 51131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C7BC +ENCODING 51132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C7BD +ENCODING 51133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C7BE +ENCODING 51134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C7BF +ENCODING 51135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C7C0 +ENCODING 51136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C7C1 +ENCODING 51137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C7C2 +ENCODING 51138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C7C3 +ENCODING 51139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C7C4 +ENCODING 51140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C7C5 +ENCODING 51141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C7C6 +ENCODING 51142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C7C7 +ENCODING 51143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +063E +0DB6 +30F6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C7C8 +ENCODING 51144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F18 +0318 +031F +0618 +0C18 +1B1F +6198 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C7C9 +ENCODING 51145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C7CA +ENCODING 51146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C7CB +ENCODING 51147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C7CC +ENCODING 51148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C7CD +ENCODING 51149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C7CE +ENCODING 51150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C7CF +ENCODING 51151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C7D0 +ENCODING 51152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C7D1 +ENCODING 51153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C7D2 +ENCODING 51154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C7D3 +ENCODING 51155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C7D4 +ENCODING 51156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C7D5 +ENCODING 51157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C7D6 +ENCODING 51158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C7D7 +ENCODING 51159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C7D8 +ENCODING 51160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C7D9 +ENCODING 51161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C7DA +ENCODING 51162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C7DB +ENCODING 51163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C7DC +ENCODING 51164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C7DD +ENCODING 51165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C7DE +ENCODING 51166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C7DF +ENCODING 51167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C7E0 +ENCODING 51168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C7E1 +ENCODING 51169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C7E2 +ENCODING 51170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C7E3 +ENCODING 51171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +031F +0618 +0D9F +30D8 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C7E4 +ENCODING 51172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7F36 +0336 +033E +0636 +0C36 +1B3E +61B6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C7E5 +ENCODING 51173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C7E6 +ENCODING 51174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C7E7 +ENCODING 51175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C7E8 +ENCODING 51176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C7E9 +ENCODING 51177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C7EA +ENCODING 51178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C7EB +ENCODING 51179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C7EC +ENCODING 51180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C7ED +ENCODING 51181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C7EE +ENCODING 51182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C7EF +ENCODING 51183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C7F0 +ENCODING 51184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C7F1 +ENCODING 51185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C7F2 +ENCODING 51186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C7F3 +ENCODING 51187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C7F4 +ENCODING 51188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C7F5 +ENCODING 51189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C7F6 +ENCODING 51190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C7F7 +ENCODING 51191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C7F8 +ENCODING 51192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C7F9 +ENCODING 51193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C7FA +ENCODING 51194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C7FB +ENCODING 51195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C7FC +ENCODING 51196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C7FD +ENCODING 51197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C7FE +ENCODING 51198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C7FF +ENCODING 51199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +033E +0636 +0DBE +30F6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C800 +ENCODING 51200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F0C +030C +030C +067C +0C0C +1B0C +618C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C801 +ENCODING 51201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C802 +ENCODING 51202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C803 +ENCODING 51203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C804 +ENCODING 51204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +067C +0D8C +30CC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C805 +ENCODING 51205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C806 +ENCODING 51206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C807 +ENCODING 51207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C808 +ENCODING 51208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C809 +ENCODING 51209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C80A +ENCODING 51210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C80B +ENCODING 51211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C80C +ENCODING 51212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C80D +ENCODING 51213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C80E +ENCODING 51214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C80F +ENCODING 51215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C810 +ENCODING 51216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C811 +ENCODING 51217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C812 +ENCODING 51218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C813 +ENCODING 51219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C814 +ENCODING 51220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C815 +ENCODING 51221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C816 +ENCODING 51222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C817 +ENCODING 51223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C818 +ENCODING 51224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C819 +ENCODING 51225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C81A +ENCODING 51226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C81B +ENCODING 51227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +06FC +0D8C +30CC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C81C +ENCODING 51228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7F36 +0336 +0336 +0676 +0C36 +1B36 +61B6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C81D +ENCODING 51229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C81E +ENCODING 51230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C81F +ENCODING 51231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C820 +ENCODING 51232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +0676 +0DB6 +30F6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C821 +ENCODING 51233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C822 +ENCODING 51234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C823 +ENCODING 51235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C824 +ENCODING 51236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C825 +ENCODING 51237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C826 +ENCODING 51238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C827 +ENCODING 51239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C828 +ENCODING 51240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C829 +ENCODING 51241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C82A +ENCODING 51242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C82B +ENCODING 51243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C82C +ENCODING 51244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C82D +ENCODING 51245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C82E +ENCODING 51246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C82F +ENCODING 51247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C830 +ENCODING 51248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C831 +ENCODING 51249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C832 +ENCODING 51250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C833 +ENCODING 51251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C834 +ENCODING 51252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C835 +ENCODING 51253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C836 +ENCODING 51254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C837 +ENCODING 51255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0336 +06F6 +0DB6 +30F6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C838 +ENCODING 51256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F0C +030C +037C +060C +0C7C +1B0C +618C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C839 +ENCODING 51257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C83A +ENCODING 51258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C83B +ENCODING 51259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C83C +ENCODING 51260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C83D +ENCODING 51261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C83E +ENCODING 51262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C83F +ENCODING 51263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C840 +ENCODING 51264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C841 +ENCODING 51265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C842 +ENCODING 51266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C843 +ENCODING 51267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C844 +ENCODING 51268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C845 +ENCODING 51269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C846 +ENCODING 51270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C847 +ENCODING 51271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C848 +ENCODING 51272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C849 +ENCODING 51273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C84A +ENCODING 51274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C84B +ENCODING 51275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C84C +ENCODING 51276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C84D +ENCODING 51277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C84E +ENCODING 51278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C84F +ENCODING 51279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C850 +ENCODING 51280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C851 +ENCODING 51281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C852 +ENCODING 51282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C853 +ENCODING 51283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +037C +060C +0DFC +30CC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C854 +ENCODING 51284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7F36 +0336 +0376 +0636 +0C76 +1B36 +61B6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C855 +ENCODING 51285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C856 +ENCODING 51286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C857 +ENCODING 51287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C858 +ENCODING 51288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +0376 +0636 +0DF6 +30F6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C859 +ENCODING 51289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C85A +ENCODING 51290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C85B +ENCODING 51291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C85C +ENCODING 51292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C85D +ENCODING 51293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+C85E +ENCODING 51294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C85F +ENCODING 51295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+C860 +ENCODING 51296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+C861 +ENCODING 51297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+C862 +ENCODING 51298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C863 +ENCODING 51299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C864 +ENCODING 51300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C865 +ENCODING 51301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+C866 +ENCODING 51302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C867 +ENCODING 51303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+C868 +ENCODING 51304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C869 +ENCODING 51305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+C86A +ENCODING 51306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C86B +ENCODING 51307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+C86C +ENCODING 51308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C86D +ENCODING 51309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+C86E +ENCODING 51310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+C86F +ENCODING 51311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +03F6 +0636 +0DF6 +30F6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C870 +ENCODING 51312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +0C18 +300C +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C871 +ENCODING 51313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C872 +ENCODING 51314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C873 +ENCODING 51315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C874 +ENCODING 51316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C875 +ENCODING 51317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C876 +ENCODING 51318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C877 +ENCODING 51319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C878 +ENCODING 51320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C879 +ENCODING 51321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C87A +ENCODING 51322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C87B +ENCODING 51323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C87C +ENCODING 51324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C87D +ENCODING 51325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C87E +ENCODING 51326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C87F +ENCODING 51327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C880 +ENCODING 51328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C881 +ENCODING 51329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C882 +ENCODING 51330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C883 +ENCODING 51331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C884 +ENCODING 51332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C885 +ENCODING 51333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C886 +ENCODING 51334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C887 +ENCODING 51335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C888 +ENCODING 51336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C889 +ENCODING 51337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C88A +ENCODING 51338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C88B +ENCODING 51339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1D98 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C88C +ENCODING 51340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +0D98 +30D8 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C88D +ENCODING 51341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C88E +ENCODING 51342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C88F +ENCODING 51343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C890 +ENCODING 51344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C891 +ENCODING 51345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C892 +ENCODING 51346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C893 +ENCODING 51347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C894 +ENCODING 51348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C895 +ENCODING 51349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C896 +ENCODING 51350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C897 +ENCODING 51351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C898 +ENCODING 51352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C899 +ENCODING 51353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C89A +ENCODING 51354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C89B +ENCODING 51355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C89C +ENCODING 51356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C89D +ENCODING 51357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C89E +ENCODING 51358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C89F +ENCODING 51359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8A0 +ENCODING 51360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C8A1 +ENCODING 51361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C8A2 +ENCODING 51362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8A3 +ENCODING 51363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8A4 +ENCODING 51364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C8A5 +ENCODING 51365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C8A6 +ENCODING 51366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C8A7 +ENCODING 51367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C8A8 +ENCODING 51368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +0DB6 +30FE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C8A9 +ENCODING 51369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C8AA +ENCODING 51370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C8AB +ENCODING 51371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C8AC +ENCODING 51372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C8AD +ENCODING 51373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C8AE +ENCODING 51374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C8AF +ENCODING 51375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C8B0 +ENCODING 51376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C8B1 +ENCODING 51377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C8B2 +ENCODING 51378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C8B3 +ENCODING 51379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C8B4 +ENCODING 51380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C8B5 +ENCODING 51381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C8B6 +ENCODING 51382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C8B7 +ENCODING 51383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C8B8 +ENCODING 51384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C8B9 +ENCODING 51385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C8BA +ENCODING 51386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C8BB +ENCODING 51387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8BC +ENCODING 51388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C8BD +ENCODING 51389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C8BE +ENCODING 51390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8BF +ENCODING 51391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8C0 +ENCODING 51392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C8C1 +ENCODING 51393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C8C2 +ENCODING 51394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C8C3 +ENCODING 51395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C8C4 +ENCODING 51396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +0D8C +30CC +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C8C5 +ENCODING 51397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C8C6 +ENCODING 51398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C8C7 +ENCODING 51399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C8C8 +ENCODING 51400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C8C9 +ENCODING 51401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C8CA +ENCODING 51402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C8CB +ENCODING 51403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C8CC +ENCODING 51404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C8CD +ENCODING 51405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C8CE +ENCODING 51406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C8CF +ENCODING 51407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C8D0 +ENCODING 51408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C8D1 +ENCODING 51409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C8D2 +ENCODING 51410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C8D3 +ENCODING 51411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C8D4 +ENCODING 51412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C8D5 +ENCODING 51413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C8D6 +ENCODING 51414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C8D7 +ENCODING 51415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8D8 +ENCODING 51416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C8D9 +ENCODING 51417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C8DA +ENCODING 51418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8DB +ENCODING 51419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C8DC +ENCODING 51420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C8DD +ENCODING 51421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C8DE +ENCODING 51422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C8DF +ENCODING 51423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C8E0 +ENCODING 51424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +0C18 +300C +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C8E1 +ENCODING 51425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C8E2 +ENCODING 51426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C8E3 +ENCODING 51427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C8E4 +ENCODING 51428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C8E5 +ENCODING 51429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C8E6 +ENCODING 51430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C8E7 +ENCODING 51431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C8E8 +ENCODING 51432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C8E9 +ENCODING 51433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C8EA +ENCODING 51434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C8EB +ENCODING 51435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C8EC +ENCODING 51436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C8ED +ENCODING 51437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C8EE +ENCODING 51438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C8EF +ENCODING 51439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C8F0 +ENCODING 51440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C8F1 +ENCODING 51441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C8F2 +ENCODING 51442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C8F3 +ENCODING 51443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C8F4 +ENCODING 51444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C8F5 +ENCODING 51445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C8F6 +ENCODING 51446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C8F7 +ENCODING 51447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C8F8 +ENCODING 51448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C8F9 +ENCODING 51449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C8FA +ENCODING 51450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C8FB +ENCODING 51451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1E78 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C8FC +ENCODING 51452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF0 +0060 +00C0 +0360 +0C18 +300C +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+C8FD +ENCODING 51453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C8FE +ENCODING 51454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C8FF +ENCODING 51455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C900 +ENCODING 51456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C901 +ENCODING 51457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C902 +ENCODING 51458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C903 +ENCODING 51459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C904 +ENCODING 51460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C905 +ENCODING 51461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C906 +ENCODING 51462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C907 +ENCODING 51463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C908 +ENCODING 51464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C909 +ENCODING 51465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C90A +ENCODING 51466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C90B +ENCODING 51467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C90C +ENCODING 51468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C90D +ENCODING 51469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C90E +ENCODING 51470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C90F +ENCODING 51471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C910 +ENCODING 51472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C911 +ENCODING 51473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C912 +ENCODING 51474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C913 +ENCODING 51475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C914 +ENCODING 51476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C915 +ENCODING 51477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C916 +ENCODING 51478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C917 +ENCODING 51479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C918 +ENCODING 51480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +0D8C +30CC +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C919 +ENCODING 51481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C91A +ENCODING 51482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C91B +ENCODING 51483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C91C +ENCODING 51484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C91D +ENCODING 51485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C91E +ENCODING 51486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C91F +ENCODING 51487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C920 +ENCODING 51488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C921 +ENCODING 51489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C922 +ENCODING 51490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C923 +ENCODING 51491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C924 +ENCODING 51492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C925 +ENCODING 51493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C926 +ENCODING 51494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C927 +ENCODING 51495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C928 +ENCODING 51496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C929 +ENCODING 51497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C92A +ENCODING 51498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C92B +ENCODING 51499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C92C +ENCODING 51500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C92D +ENCODING 51501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C92E +ENCODING 51502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C92F +ENCODING 51503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C930 +ENCODING 51504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C931 +ENCODING 51505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C932 +ENCODING 51506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C933 +ENCODING 51507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +030C +060C +198C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C934 +ENCODING 51508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +0DB6 +30F6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C935 +ENCODING 51509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C936 +ENCODING 51510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C937 +ENCODING 51511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C938 +ENCODING 51512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19F6 +60F6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C939 +ENCODING 51513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C93A +ENCODING 51514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C93B +ENCODING 51515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C93C +ENCODING 51516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C93D +ENCODING 51517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C93E +ENCODING 51518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C93F +ENCODING 51519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C940 +ENCODING 51520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C941 +ENCODING 51521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C942 +ENCODING 51522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C943 +ENCODING 51523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C944 +ENCODING 51524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C945 +ENCODING 51525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C946 +ENCODING 51526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C947 +ENCODING 51527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C948 +ENCODING 51528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C949 +ENCODING 51529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C94A +ENCODING 51530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C94B +ENCODING 51531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C94C +ENCODING 51532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C94D +ENCODING 51533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C94E +ENCODING 51534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C94F +ENCODING 51535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C950 +ENCODING 51536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +0D8C +30CC +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+C951 +ENCODING 51537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C952 +ENCODING 51538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C953 +ENCODING 51539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C954 +ENCODING 51540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C955 +ENCODING 51541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C956 +ENCODING 51542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C957 +ENCODING 51543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C958 +ENCODING 51544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C959 +ENCODING 51545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C95A +ENCODING 51546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C95B +ENCODING 51547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C95C +ENCODING 51548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C95D +ENCODING 51549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C95E +ENCODING 51550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C95F +ENCODING 51551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C960 +ENCODING 51552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C961 +ENCODING 51553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C962 +ENCODING 51554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C963 +ENCODING 51555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C964 +ENCODING 51556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C965 +ENCODING 51557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C966 +ENCODING 51558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C967 +ENCODING 51559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C968 +ENCODING 51560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C969 +ENCODING 51561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C96A +ENCODING 51562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C96B +ENCODING 51563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C96C +ENCODING 51564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF0 +0060 +00C0 +0360 +0C18 +300C +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+C96D +ENCODING 51565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C96E +ENCODING 51566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C96F +ENCODING 51567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C970 +ENCODING 51568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C971 +ENCODING 51569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C972 +ENCODING 51570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C973 +ENCODING 51571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C974 +ENCODING 51572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C975 +ENCODING 51573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C976 +ENCODING 51574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C977 +ENCODING 51575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C978 +ENCODING 51576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C979 +ENCODING 51577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C97A +ENCODING 51578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C97B +ENCODING 51579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C97C +ENCODING 51580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C97D +ENCODING 51581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C97E +ENCODING 51582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C97F +ENCODING 51583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C980 +ENCODING 51584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C981 +ENCODING 51585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C982 +ENCODING 51586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C983 +ENCODING 51587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C984 +ENCODING 51588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C985 +ENCODING 51589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C986 +ENCODING 51590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C987 +ENCODING 51591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C988 +ENCODING 51592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +0C18 +300C +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+C989 +ENCODING 51593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C98A +ENCODING 51594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+C98B +ENCODING 51595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C98C +ENCODING 51596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C98D +ENCODING 51597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+C98E +ENCODING 51598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+C98F +ENCODING 51599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C990 +ENCODING 51600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C991 +ENCODING 51601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+C992 +ENCODING 51602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+C993 +ENCODING 51603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C994 +ENCODING 51604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+C995 +ENCODING 51605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C996 +ENCODING 51606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C997 +ENCODING 51607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+C998 +ENCODING 51608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+C999 +ENCODING 51609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C99A +ENCODING 51610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+C99B +ENCODING 51611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+C99C +ENCODING 51612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+C99D +ENCODING 51613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C99E +ENCODING 51614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C99F +ENCODING 51615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+C9A0 +ENCODING 51616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C9A1 +ENCODING 51617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C9A2 +ENCODING 51618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+C9A3 +ENCODING 51619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF0 +0060 +00C0 +0360 +1C18 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+C9A4 +ENCODING 51620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +0D8C +30CC +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C9A5 +ENCODING 51621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C9A6 +ENCODING 51622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C9A7 +ENCODING 51623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C9A8 +ENCODING 51624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C9A9 +ENCODING 51625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C9AA +ENCODING 51626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C9AB +ENCODING 51627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C9AC +ENCODING 51628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C9AD +ENCODING 51629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C9AE +ENCODING 51630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C9AF +ENCODING 51631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C9B0 +ENCODING 51632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C9B1 +ENCODING 51633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C9B2 +ENCODING 51634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C9B3 +ENCODING 51635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C9B4 +ENCODING 51636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C9B5 +ENCODING 51637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C9B6 +ENCODING 51638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C9B7 +ENCODING 51639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9B8 +ENCODING 51640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C9B9 +ENCODING 51641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C9BA +ENCODING 51642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9BB +ENCODING 51643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9BC +ENCODING 51644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C9BD +ENCODING 51645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C9BE +ENCODING 51646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C9BF +ENCODING 51647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +030C +060C +198C +60CC +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C9C0 +ENCODING 51648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F0C +030C +030C +060C +0C0C +1B0C +618C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C9C1 +ENCODING 51649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C9C2 +ENCODING 51650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+C9C3 +ENCODING 51651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+C9C4 +ENCODING 51652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C9C5 +ENCODING 51653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+C9C6 +ENCODING 51654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+C9C7 +ENCODING 51655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C9C8 +ENCODING 51656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+C9C9 +ENCODING 51657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+C9CA +ENCODING 51658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C9CB +ENCODING 51659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C9CC +ENCODING 51660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C9CD +ENCODING 51661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C9CE +ENCODING 51662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C9CF +ENCODING 51663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C9D0 +ENCODING 51664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C9D1 +ENCODING 51665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+C9D2 +ENCODING 51666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C9D3 +ENCODING 51667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9D4 +ENCODING 51668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+C9D5 +ENCODING 51669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C9D6 +ENCODING 51670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9D7 +ENCODING 51671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9D8 +ENCODING 51672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+C9D9 +ENCODING 51673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C9DA +ENCODING 51674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C9DB +ENCODING 51675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +030C +060C +0D8C +30CC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+C9DC +ENCODING 51676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +D8D8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C9DD +ENCODING 51677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C9DE +ENCODING 51678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+C9DF +ENCODING 51679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+C9E0 +ENCODING 51680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+C9E1 +ENCODING 51681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+C9E2 +ENCODING 51682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+C9E3 +ENCODING 51683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C9E4 +ENCODING 51684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+C9E5 +ENCODING 51685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+C9E6 +ENCODING 51686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C9E7 +ENCODING 51687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+C9E8 +ENCODING 51688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+C9E9 +ENCODING 51689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+C9EA +ENCODING 51690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+C9EB +ENCODING 51691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+C9EC +ENCODING 51692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C9ED +ENCODING 51693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+C9EE +ENCODING 51694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+C9EF +ENCODING 51695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9F0 +ENCODING 51696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+C9F1 +ENCODING 51697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C9F2 +ENCODING 51698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9F3 +ENCODING 51699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+C9F4 +ENCODING 51700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+C9F5 +ENCODING 51701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+C9F6 +ENCODING 51702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+C9F7 +ENCODING 51703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D98 +1B1F +3F18 +6D98 +18D8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+C9F8 +ENCODING 51704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +D8F6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+C9F9 +ENCODING 51705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+C9FA +ENCODING 51706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+C9FB +ENCODING 51707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+C9FC +ENCODING 51708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+C9FD +ENCODING 51709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+C9FE +ENCODING 51710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+C9FF +ENCODING 51711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA00 +ENCODING 51712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CA01 +ENCODING 51713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CA02 +ENCODING 51714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CA03 +ENCODING 51715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CA04 +ENCODING 51716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CA05 +ENCODING 51717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CA06 +ENCODING 51718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CA07 +ENCODING 51719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CA08 +ENCODING 51720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CA09 +ENCODING 51721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CA0A +ENCODING 51722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CA0B +ENCODING 51723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CA0C +ENCODING 51724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CA0D +ENCODING 51725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CA0E +ENCODING 51726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CA0F +ENCODING 51727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CA10 +ENCODING 51728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CA11 +ENCODING 51729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CA12 +ENCODING 51730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CA13 +ENCODING 51731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B3E +3F36 +6DB6 +18F6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CA14 +ENCODING 51732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +0D98 +0D9F +1B18 +3F18 +6D9F +D8D8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CA15 +ENCODING 51733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CA16 +ENCODING 51734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CA17 +ENCODING 51735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CA18 +ENCODING 51736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA19 +ENCODING 51737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CA1A +ENCODING 51738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CA1B +ENCODING 51739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CA1C +ENCODING 51740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CA1D +ENCODING 51741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CA1E +ENCODING 51742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CA1F +ENCODING 51743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CA20 +ENCODING 51744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CA21 +ENCODING 51745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CA22 +ENCODING 51746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CA23 +ENCODING 51747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CA24 +ENCODING 51748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CA25 +ENCODING 51749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CA26 +ENCODING 51750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CA27 +ENCODING 51751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA28 +ENCODING 51752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CA29 +ENCODING 51753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CA2A +ENCODING 51754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA2B +ENCODING 51755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA2C +ENCODING 51756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CA2D +ENCODING 51757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CA2E +ENCODING 51758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CA2F +ENCODING 51759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +0D98 +0D9F +1B18 +3F1F +6D98 +18D8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CA30 +ENCODING 51760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +0DB6 +0DBE +1B36 +3F36 +6DBE +D8F6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CA31 +ENCODING 51761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CA32 +ENCODING 51762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CA33 +ENCODING 51763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CA34 +ENCODING 51764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CA35 +ENCODING 51765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CA36 +ENCODING 51766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CA37 +ENCODING 51767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA38 +ENCODING 51768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CA39 +ENCODING 51769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CA3A +ENCODING 51770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CA3B +ENCODING 51771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CA3C +ENCODING 51772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CA3D +ENCODING 51773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CA3E +ENCODING 51774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CA3F +ENCODING 51775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CA40 +ENCODING 51776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CA41 +ENCODING 51777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CA42 +ENCODING 51778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CA43 +ENCODING 51779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CA44 +ENCODING 51780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CA45 +ENCODING 51781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CA46 +ENCODING 51782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CA47 +ENCODING 51783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CA48 +ENCODING 51784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CA49 +ENCODING 51785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CA4A +ENCODING 51786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CA4B +ENCODING 51787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DBE +1B36 +3F3E +6DB6 +18F6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CA4C +ENCODING 51788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +0D8C +0D8C +1B7C +3F0C +6D8C +D8CC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CA4D +ENCODING 51789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CA4E +ENCODING 51790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CA4F +ENCODING 51791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CA50 +ENCODING 51792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B7C +3F0C +6D8C +18CC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA51 +ENCODING 51793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CA52 +ENCODING 51794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CA53 +ENCODING 51795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA54 +ENCODING 51796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CA55 +ENCODING 51797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CA56 +ENCODING 51798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CA57 +ENCODING 51799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CA58 +ENCODING 51800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CA59 +ENCODING 51801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CA5A +ENCODING 51802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CA5B +ENCODING 51803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CA5C +ENCODING 51804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CA5D +ENCODING 51805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CA5E +ENCODING 51806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CA5F +ENCODING 51807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA60 +ENCODING 51808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CA61 +ENCODING 51809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CA62 +ENCODING 51810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA63 +ENCODING 51811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA64 +ENCODING 51812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CA65 +ENCODING 51813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA66 +ENCODING 51814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CA67 +ENCODING 51815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1BFC +3F0C +6D8C +18CC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CA68 +ENCODING 51816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +0DB6 +0DB6 +1B76 +3F36 +6DB6 +D8F6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CA69 +ENCODING 51817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CA6A +ENCODING 51818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CA6B +ENCODING 51819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CA6C +ENCODING 51820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1B76 +3F36 +6DB6 +18F6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CA6D +ENCODING 51821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CA6E +ENCODING 51822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CA6F +ENCODING 51823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA70 +ENCODING 51824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CA71 +ENCODING 51825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CA72 +ENCODING 51826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CA73 +ENCODING 51827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CA74 +ENCODING 51828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CA75 +ENCODING 51829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CA76 +ENCODING 51830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CA77 +ENCODING 51831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CA78 +ENCODING 51832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CA79 +ENCODING 51833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CA7A +ENCODING 51834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CA7B +ENCODING 51835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CA7C +ENCODING 51836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CA7D +ENCODING 51837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CA7E +ENCODING 51838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CA7F +ENCODING 51839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CA80 +ENCODING 51840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CA81 +ENCODING 51841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CA82 +ENCODING 51842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CA83 +ENCODING 51843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DB6 +1BF6 +3F36 +6DB6 +18F6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CA84 +ENCODING 51844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +D8CC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CA85 +ENCODING 51845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CA86 +ENCODING 51846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CA87 +ENCODING 51847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CA88 +ENCODING 51848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA89 +ENCODING 51849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CA8A +ENCODING 51850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CA8B +ENCODING 51851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA8C +ENCODING 51852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CA8D +ENCODING 51853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CA8E +ENCODING 51854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CA8F +ENCODING 51855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CA90 +ENCODING 51856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CA91 +ENCODING 51857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CA92 +ENCODING 51858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CA93 +ENCODING 51859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CA94 +ENCODING 51860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CA95 +ENCODING 51861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CA96 +ENCODING 51862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CA97 +ENCODING 51863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA98 +ENCODING 51864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CA99 +ENCODING 51865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CA9A +ENCODING 51866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA9B +ENCODING 51867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CA9C +ENCODING 51868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CA9D +ENCODING 51869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CA9E +ENCODING 51870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CA9F +ENCODING 51871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0DFC +1B0C +3F7C +6D8C +18CC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CAA0 +ENCODING 51872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +0DB6 +0DF6 +1B36 +3F76 +6DB6 +D8F6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CAA1 +ENCODING 51873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CAA2 +ENCODING 51874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CAA3 +ENCODING 51875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CAA4 +ENCODING 51876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3F76 +6DB6 +18F6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CAA5 +ENCODING 51877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CAA6 +ENCODING 51878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CAA7 +ENCODING 51879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CAA8 +ENCODING 51880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CAA9 +ENCODING 51881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CAAA +ENCODING 51882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CAAB +ENCODING 51883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CAAC +ENCODING 51884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CAAD +ENCODING 51885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CAAE +ENCODING 51886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CAAF +ENCODING 51887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CAB0 +ENCODING 51888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CAB1 +ENCODING 51889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CAB2 +ENCODING 51890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CAB3 +ENCODING 51891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CAB4 +ENCODING 51892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CAB5 +ENCODING 51893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CAB6 +ENCODING 51894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CAB7 +ENCODING 51895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CAB8 +ENCODING 51896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CAB9 +ENCODING 51897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CABA +ENCODING 51898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CABB +ENCODING 51899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +0DF6 +1B36 +3FF6 +6DB6 +18F6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CABC +ENCODING 51900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+CABD +ENCODING 51901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CABE +ENCODING 51902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CABF +ENCODING 51903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CAC0 +ENCODING 51904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CAC1 +ENCODING 51905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CAC2 +ENCODING 51906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CAC3 +ENCODING 51907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CAC4 +ENCODING 51908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CAC5 +ENCODING 51909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CAC6 +ENCODING 51910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CAC7 +ENCODING 51911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CAC8 +ENCODING 51912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CAC9 +ENCODING 51913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CACA +ENCODING 51914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CACB +ENCODING 51915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CACC +ENCODING 51916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CACD +ENCODING 51917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CACE +ENCODING 51918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CACF +ENCODING 51919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CAD0 +ENCODING 51920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CAD1 +ENCODING 51921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CAD2 +ENCODING 51922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CAD3 +ENCODING 51923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CAD4 +ENCODING 51924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CAD5 +ENCODING 51925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CAD6 +ENCODING 51926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CAD7 +ENCODING 51927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CAD8 +ENCODING 51928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3FD8 +0D98 +1B18 +3F98 +64D8 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CAD9 +ENCODING 51929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CADA +ENCODING 51930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CADB +ENCODING 51931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CADC +ENCODING 51932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CADD +ENCODING 51933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CADE +ENCODING 51934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CADF +ENCODING 51935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CAE0 +ENCODING 51936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CAE1 +ENCODING 51937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CAE2 +ENCODING 51938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CAE3 +ENCODING 51939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CAE4 +ENCODING 51940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CAE5 +ENCODING 51941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CAE6 +ENCODING 51942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CAE7 +ENCODING 51943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CAE8 +ENCODING 51944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CAE9 +ENCODING 51945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CAEA +ENCODING 51946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CAEB +ENCODING 51947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CAEC +ENCODING 51948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CAED +ENCODING 51949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CAEE +ENCODING 51950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CAEF +ENCODING 51951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CAF0 +ENCODING 51952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CAF1 +ENCODING 51953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CAF2 +ENCODING 51954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CAF3 +ENCODING 51955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +0D98 +1B18 +3F9F +6CD8 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CAF4 +ENCODING 51956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0DB6 +1B36 +3FB6 +64FE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CAF5 +ENCODING 51957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CAF6 +ENCODING 51958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CAF7 +ENCODING 51959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CAF8 +ENCODING 51960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CAF9 +ENCODING 51961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CAFA +ENCODING 51962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CAFB +ENCODING 51963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CAFC +ENCODING 51964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CAFD +ENCODING 51965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CAFE +ENCODING 51966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CAFF +ENCODING 51967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB00 +ENCODING 51968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CB01 +ENCODING 51969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CB02 +ENCODING 51970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CB03 +ENCODING 51971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CB04 +ENCODING 51972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CB05 +ENCODING 51973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CB06 +ENCODING 51974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CB07 +ENCODING 51975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB08 +ENCODING 51976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CB09 +ENCODING 51977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CB0A +ENCODING 51978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB0B +ENCODING 51979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB0C +ENCODING 51980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CB0D +ENCODING 51981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CB0E +ENCODING 51982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CB0F +ENCODING 51983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FBE +6CF6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CB10 +ENCODING 51984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +0D8C +1B0C +3F8C +64CC +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CB11 +ENCODING 51985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CB12 +ENCODING 51986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CB13 +ENCODING 51987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CB14 +ENCODING 51988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CB15 +ENCODING 51989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CB16 +ENCODING 51990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CB17 +ENCODING 51991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CB18 +ENCODING 51992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CB19 +ENCODING 51993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CB1A +ENCODING 51994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB1B +ENCODING 51995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB1C +ENCODING 51996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CB1D +ENCODING 51997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CB1E +ENCODING 51998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CB1F +ENCODING 51999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CB20 +ENCODING 52000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CB21 +ENCODING 52001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CB22 +ENCODING 52002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CB23 +ENCODING 52003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB24 +ENCODING 52004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CB25 +ENCODING 52005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CB26 +ENCODING 52006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB27 +ENCODING 52007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB28 +ENCODING 52008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CB29 +ENCODING 52009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CB2A +ENCODING 52010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CB2B +ENCODING 52011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +6CCC +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CB2C +ENCODING 52012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+CB2D +ENCODING 52013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CB2E +ENCODING 52014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CB2F +ENCODING 52015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CB30 +ENCODING 52016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CB31 +ENCODING 52017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CB32 +ENCODING 52018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CB33 +ENCODING 52019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CB34 +ENCODING 52020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CB35 +ENCODING 52021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CB36 +ENCODING 52022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CB37 +ENCODING 52023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB38 +ENCODING 52024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CB39 +ENCODING 52025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CB3A +ENCODING 52026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CB3B +ENCODING 52027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CB3C +ENCODING 52028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CB3D +ENCODING 52029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CB3E +ENCODING 52030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CB3F +ENCODING 52031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CB40 +ENCODING 52032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CB41 +ENCODING 52033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CB42 +ENCODING 52034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CB43 +ENCODING 52035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CB44 +ENCODING 52036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CB45 +ENCODING 52037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CB46 +ENCODING 52038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CB47 +ENCODING 52039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +37EC +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CB48 +ENCODING 52040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+CB49 +ENCODING 52041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CB4A +ENCODING 52042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CB4B +ENCODING 52043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CB4C +ENCODING 52044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CB4D +ENCODING 52045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CB4E +ENCODING 52046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CB4F +ENCODING 52047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CB50 +ENCODING 52048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CB51 +ENCODING 52049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CB52 +ENCODING 52050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CB53 +ENCODING 52051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB54 +ENCODING 52052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CB55 +ENCODING 52053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CB56 +ENCODING 52054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CB57 +ENCODING 52055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CB58 +ENCODING 52056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CB59 +ENCODING 52057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CB5A +ENCODING 52058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CB5B +ENCODING 52059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CB5C +ENCODING 52060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CB5D +ENCODING 52061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CB5E +ENCODING 52062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CB5F +ENCODING 52063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CB60 +ENCODING 52064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CB61 +ENCODING 52065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CB62 +ENCODING 52066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CB63 +ENCODING 52067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CB64 +ENCODING 52068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+CB65 +ENCODING 52069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CB66 +ENCODING 52070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CB67 +ENCODING 52071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CB68 +ENCODING 52072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CB69 +ENCODING 52073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CB6A +ENCODING 52074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CB6B +ENCODING 52075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CB6C +ENCODING 52076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CB6D +ENCODING 52077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CB6E +ENCODING 52078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB6F +ENCODING 52079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB70 +ENCODING 52080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CB71 +ENCODING 52081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CB72 +ENCODING 52082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CB73 +ENCODING 52083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CB74 +ENCODING 52084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CB75 +ENCODING 52085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CB76 +ENCODING 52086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CB77 +ENCODING 52087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB78 +ENCODING 52088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CB79 +ENCODING 52089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CB7A +ENCODING 52090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB7B +ENCODING 52091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB7C +ENCODING 52092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CB7D +ENCODING 52093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CB7E +ENCODING 52094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CB7F +ENCODING 52095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FDC +0D8C +1B0C +3F8C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CB80 +ENCODING 52096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CB81 +ENCODING 52097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CB82 +ENCODING 52098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CB83 +ENCODING 52099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CB84 +ENCODING 52100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FF6 +64F6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CB85 +ENCODING 52101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CB86 +ENCODING 52102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CB87 +ENCODING 52103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CB88 +ENCODING 52104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CB89 +ENCODING 52105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CB8A +ENCODING 52106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB8B +ENCODING 52107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CB8C +ENCODING 52108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CB8D +ENCODING 52109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CB8E +ENCODING 52110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CB8F +ENCODING 52111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CB90 +ENCODING 52112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CB91 +ENCODING 52113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CB92 +ENCODING 52114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CB93 +ENCODING 52115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB94 +ENCODING 52116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CB95 +ENCODING 52117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CB96 +ENCODING 52118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB97 +ENCODING 52119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CB98 +ENCODING 52120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CB99 +ENCODING 52121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CB9A +ENCODING 52122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CB9B +ENCODING 52123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +0DB6 +1B36 +3FB6 +64F6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CB9C +ENCODING 52124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+CB9D +ENCODING 52125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CB9E +ENCODING 52126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CB9F +ENCODING 52127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CBA0 +ENCODING 52128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CBA1 +ENCODING 52129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CBA2 +ENCODING 52130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CBA3 +ENCODING 52131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CBA4 +ENCODING 52132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CBA5 +ENCODING 52133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CBA6 +ENCODING 52134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CBA7 +ENCODING 52135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CBA8 +ENCODING 52136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CBA9 +ENCODING 52137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CBAA +ENCODING 52138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CBAB +ENCODING 52139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CBAC +ENCODING 52140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CBAD +ENCODING 52141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CBAE +ENCODING 52142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CBAF +ENCODING 52143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CBB0 +ENCODING 52144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CBB1 +ENCODING 52145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CBB2 +ENCODING 52146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CBB3 +ENCODING 52147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CBB4 +ENCODING 52148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CBB5 +ENCODING 52149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CBB6 +ENCODING 52150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CBB7 +ENCODING 52151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FC6 +0D86 +1B06 +3F86 +64C6 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CBB8 +ENCODING 52152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+CBB9 +ENCODING 52153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CBBA +ENCODING 52154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CBBB +ENCODING 52155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CBBC +ENCODING 52156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CBBD +ENCODING 52157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CBBE +ENCODING 52158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CBBF +ENCODING 52159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CBC0 +ENCODING 52160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CBC1 +ENCODING 52161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CBC2 +ENCODING 52162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CBC3 +ENCODING 52163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CBC4 +ENCODING 52164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CBC5 +ENCODING 52165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CBC6 +ENCODING 52166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CBC7 +ENCODING 52167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CBC8 +ENCODING 52168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CBC9 +ENCODING 52169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CBCA +ENCODING 52170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CBCB +ENCODING 52171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CBCC +ENCODING 52172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CBCD +ENCODING 52173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CBCE +ENCODING 52174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CBCF +ENCODING 52175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CBD0 +ENCODING 52176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CBD1 +ENCODING 52177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CBD2 +ENCODING 52178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CBD3 +ENCODING 52179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CBD4 +ENCODING 52180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+CBD5 +ENCODING 52181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CBD6 +ENCODING 52182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CBD7 +ENCODING 52183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CBD8 +ENCODING 52184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CBD9 +ENCODING 52185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CBDA +ENCODING 52186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CBDB +ENCODING 52187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CBDC +ENCODING 52188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CBDD +ENCODING 52189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CBDE +ENCODING 52190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CBDF +ENCODING 52191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CBE0 +ENCODING 52192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CBE1 +ENCODING 52193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CBE2 +ENCODING 52194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CBE3 +ENCODING 52195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CBE4 +ENCODING 52196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CBE5 +ENCODING 52197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CBE6 +ENCODING 52198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CBE7 +ENCODING 52199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CBE8 +ENCODING 52200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CBE9 +ENCODING 52201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CBEA +ENCODING 52202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CBEB +ENCODING 52203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CBEC +ENCODING 52204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CBED +ENCODING 52205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CBEE +ENCODING 52206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CBEF +ENCODING 52207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +0660 +0E70 +1998 +318C +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CBF0 +ENCODING 52208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +0D8C +1B0C +3F8C +64CC +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CBF1 +ENCODING 52209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CBF2 +ENCODING 52210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CBF3 +ENCODING 52211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CBF4 +ENCODING 52212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CBF5 +ENCODING 52213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CBF6 +ENCODING 52214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CBF7 +ENCODING 52215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CBF8 +ENCODING 52216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CBF9 +ENCODING 52217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CBFA +ENCODING 52218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CBFB +ENCODING 52219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CBFC +ENCODING 52220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CBFD +ENCODING 52221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CBFE +ENCODING 52222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CBFF +ENCODING 52223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CC00 +ENCODING 52224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CC01 +ENCODING 52225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CC02 +ENCODING 52226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CC03 +ENCODING 52227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC04 +ENCODING 52228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CC05 +ENCODING 52229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CC06 +ENCODING 52230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC07 +ENCODING 52231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC08 +ENCODING 52232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CC09 +ENCODING 52233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CC0A +ENCODING 52234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CC0B +ENCODING 52235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +0D8C +1B0C +3F8C +64CC +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CC0C +ENCODING 52236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +D8CC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CC0D +ENCODING 52237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CC0E +ENCODING 52238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CC0F +ENCODING 52239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CC10 +ENCODING 52240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CC11 +ENCODING 52241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CC12 +ENCODING 52242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CC13 +ENCODING 52243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CC14 +ENCODING 52244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CC15 +ENCODING 52245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CC16 +ENCODING 52246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CC17 +ENCODING 52247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CC18 +ENCODING 52248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CC19 +ENCODING 52249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CC1A +ENCODING 52250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CC1B +ENCODING 52251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CC1C +ENCODING 52252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CC1D +ENCODING 52253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CC1E +ENCODING 52254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CC1F +ENCODING 52255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC20 +ENCODING 52256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CC21 +ENCODING 52257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CC22 +ENCODING 52258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC23 +ENCODING 52259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC24 +ENCODING 52260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CC25 +ENCODING 52261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CC26 +ENCODING 52262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CC27 +ENCODING 52263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +0D8C +0D8C +1B0C +3F0C +6D8C +18CC +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CC28 +ENCODING 52264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1E18 +0018 +7F18 +0318 +061F +0E18 +1B18 +6198 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CC29 +ENCODING 52265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CC2A +ENCODING 52266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CC2B +ENCODING 52267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CC2C +ENCODING 52268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CC2D +ENCODING 52269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CC2E +ENCODING 52270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CC2F +ENCODING 52271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CC30 +ENCODING 52272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CC31 +ENCODING 52273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CC32 +ENCODING 52274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CC33 +ENCODING 52275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CC34 +ENCODING 52276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CC35 +ENCODING 52277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CC36 +ENCODING 52278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CC37 +ENCODING 52279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CC38 +ENCODING 52280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CC39 +ENCODING 52281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CC3A +ENCODING 52282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CC3B +ENCODING 52283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC3C +ENCODING 52284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CC3D +ENCODING 52285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CC3E +ENCODING 52286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC3F +ENCODING 52287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC40 +ENCODING 52288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CC41 +ENCODING 52289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CC42 +ENCODING 52290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CC43 +ENCODING 52291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +0318 +061F +0E18 +1B18 +6198 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CC44 +ENCODING 52292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1E76 +0036 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CC45 +ENCODING 52293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CC46 +ENCODING 52294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CC47 +ENCODING 52295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CC48 +ENCODING 52296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CC49 +ENCODING 52297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CC4A +ENCODING 52298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CC4B +ENCODING 52299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CC4C +ENCODING 52300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CC4D +ENCODING 52301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CC4E +ENCODING 52302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CC4F +ENCODING 52303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CC50 +ENCODING 52304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CC51 +ENCODING 52305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CC52 +ENCODING 52306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CC53 +ENCODING 52307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CC54 +ENCODING 52308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CC55 +ENCODING 52309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CC56 +ENCODING 52310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CC57 +ENCODING 52311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CC58 +ENCODING 52312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CC59 +ENCODING 52313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CC5A +ENCODING 52314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CC5B +ENCODING 52315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CC5C +ENCODING 52316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CC5D +ENCODING 52317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CC5E +ENCODING 52318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CC5F +ENCODING 52319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +063E +0E36 +1B36 +61B6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CC60 +ENCODING 52320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1E18 +0018 +7F18 +031F +0618 +0E18 +1B1F +6198 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CC61 +ENCODING 52321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CC62 +ENCODING 52322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CC63 +ENCODING 52323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CC64 +ENCODING 52324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CC65 +ENCODING 52325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CC66 +ENCODING 52326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CC67 +ENCODING 52327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CC68 +ENCODING 52328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CC69 +ENCODING 52329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CC6A +ENCODING 52330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CC6B +ENCODING 52331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CC6C +ENCODING 52332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CC6D +ENCODING 52333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CC6E +ENCODING 52334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CC6F +ENCODING 52335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CC70 +ENCODING 52336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CC71 +ENCODING 52337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CC72 +ENCODING 52338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CC73 +ENCODING 52339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC74 +ENCODING 52340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CC75 +ENCODING 52341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CC76 +ENCODING 52342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC77 +ENCODING 52343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CC78 +ENCODING 52344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CC79 +ENCODING 52345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CC7A +ENCODING 52346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CC7B +ENCODING 52347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +1C18 +7F18 +031F +0618 +0E1F +1B18 +6198 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CC7C +ENCODING 52348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1E76 +0036 +7F36 +033E +0636 +0E36 +1B3E +61B6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CC7D +ENCODING 52349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CC7E +ENCODING 52350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CC7F +ENCODING 52351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CC80 +ENCODING 52352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CC81 +ENCODING 52353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CC82 +ENCODING 52354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CC83 +ENCODING 52355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CC84 +ENCODING 52356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CC85 +ENCODING 52357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CC86 +ENCODING 52358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CC87 +ENCODING 52359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CC88 +ENCODING 52360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CC89 +ENCODING 52361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CC8A +ENCODING 52362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CC8B +ENCODING 52363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CC8C +ENCODING 52364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CC8D +ENCODING 52365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CC8E +ENCODING 52366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CC8F +ENCODING 52367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CC90 +ENCODING 52368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CC91 +ENCODING 52369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CC92 +ENCODING 52370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CC93 +ENCODING 52371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CC94 +ENCODING 52372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CC95 +ENCODING 52373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CC96 +ENCODING 52374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CC97 +ENCODING 52375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +033E +0636 +0E3E +1B36 +61B6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CC98 +ENCODING 52376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1E0C +000C +7F0C +030C +067C +0E0C +1B0C +618C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CC99 +ENCODING 52377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CC9A +ENCODING 52378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CC9B +ENCODING 52379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CC9C +ENCODING 52380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +067C +0E0C +1B0C +618C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CC9D +ENCODING 52381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CC9E +ENCODING 52382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CC9F +ENCODING 52383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CCA0 +ENCODING 52384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CCA1 +ENCODING 52385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CCA2 +ENCODING 52386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CCA3 +ENCODING 52387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CCA4 +ENCODING 52388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CCA5 +ENCODING 52389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CCA6 +ENCODING 52390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CCA7 +ENCODING 52391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CCA8 +ENCODING 52392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CCA9 +ENCODING 52393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CCAA +ENCODING 52394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CCAB +ENCODING 52395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CCAC +ENCODING 52396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CCAD +ENCODING 52397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CCAE +ENCODING 52398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CCAF +ENCODING 52399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CCB0 +ENCODING 52400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CCB1 +ENCODING 52401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CCB2 +ENCODING 52402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CCB3 +ENCODING 52403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +06FC +0E0C +1B0C +618C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CCB4 +ENCODING 52404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1E76 +0036 +7F36 +0336 +0676 +0E36 +1B36 +61B6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CCB5 +ENCODING 52405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CCB6 +ENCODING 52406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CCB7 +ENCODING 52407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CCB8 +ENCODING 52408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +0676 +0E36 +1B36 +61B6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CCB9 +ENCODING 52409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CCBA +ENCODING 52410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CCBB +ENCODING 52411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CCBC +ENCODING 52412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CCBD +ENCODING 52413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CCBE +ENCODING 52414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CCBF +ENCODING 52415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CCC0 +ENCODING 52416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CCC1 +ENCODING 52417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CCC2 +ENCODING 52418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CCC3 +ENCODING 52419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CCC4 +ENCODING 52420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CCC5 +ENCODING 52421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CCC6 +ENCODING 52422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CCC7 +ENCODING 52423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CCC8 +ENCODING 52424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CCC9 +ENCODING 52425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CCCA +ENCODING 52426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CCCB +ENCODING 52427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CCCC +ENCODING 52428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CCCD +ENCODING 52429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CCCE +ENCODING 52430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CCCF +ENCODING 52431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0336 +06F6 +0E36 +1B36 +61B6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CCD0 +ENCODING 52432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1E0C +000C +7F0C +037C +060C +0E7C +1B0C +618C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CCD1 +ENCODING 52433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CCD2 +ENCODING 52434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CCD3 +ENCODING 52435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CCD4 +ENCODING 52436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CCD5 +ENCODING 52437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CCD6 +ENCODING 52438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CCD7 +ENCODING 52439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CCD8 +ENCODING 52440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CCD9 +ENCODING 52441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CCDA +ENCODING 52442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CCDB +ENCODING 52443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CCDC +ENCODING 52444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CCDD +ENCODING 52445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CCDE +ENCODING 52446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CCDF +ENCODING 52447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CCE0 +ENCODING 52448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CCE1 +ENCODING 52449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CCE2 +ENCODING 52450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CCE3 +ENCODING 52451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CCE4 +ENCODING 52452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CCE5 +ENCODING 52453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CCE6 +ENCODING 52454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CCE7 +ENCODING 52455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CCE8 +ENCODING 52456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CCE9 +ENCODING 52457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CCEA +ENCODING 52458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CCEB +ENCODING 52459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +037C +060C +0E7C +1B0C +618C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CCEC +ENCODING 52460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1E76 +0036 +7F36 +0376 +0636 +0E76 +1B36 +61B6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CCED +ENCODING 52461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CCEE +ENCODING 52462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CCEF +ENCODING 52463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CCF0 +ENCODING 52464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +0376 +0636 +0E76 +1B36 +61B6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CCF1 +ENCODING 52465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CCF2 +ENCODING 52466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CCF3 +ENCODING 52467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CCF4 +ENCODING 52468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CCF5 +ENCODING 52469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CCF6 +ENCODING 52470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CCF7 +ENCODING 52471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CCF8 +ENCODING 52472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CCF9 +ENCODING 52473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CCFA +ENCODING 52474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CCFB +ENCODING 52475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CCFC +ENCODING 52476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CCFD +ENCODING 52477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CCFE +ENCODING 52478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CCFF +ENCODING 52479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CD00 +ENCODING 52480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CD01 +ENCODING 52481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CD02 +ENCODING 52482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CD03 +ENCODING 52483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CD04 +ENCODING 52484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CD05 +ENCODING 52485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CD06 +ENCODING 52486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CD07 +ENCODING 52487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +1C76 +7F36 +03F6 +0636 +0EF6 +1B36 +61B6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CD08 +ENCODING 52488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +0000 +1FF8 +01C0 +0360 +0E18 +300C +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+CD09 +ENCODING 52489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD0A +ENCODING 52490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CD0B +ENCODING 52491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CD0C +ENCODING 52492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD0D +ENCODING 52493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CD0E +ENCODING 52494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CD0F +ENCODING 52495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD10 +ENCODING 52496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD11 +ENCODING 52497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CD12 +ENCODING 52498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CD13 +ENCODING 52499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CD14 +ENCODING 52500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CD15 +ENCODING 52501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CD16 +ENCODING 52502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CD17 +ENCODING 52503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CD18 +ENCODING 52504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD19 +ENCODING 52505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CD1A +ENCODING 52506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CD1B +ENCODING 52507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CD1C +ENCODING 52508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CD1D +ENCODING 52509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CD1E +ENCODING 52510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CD1F +ENCODING 52511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CD20 +ENCODING 52512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD21 +ENCODING 52513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD22 +ENCODING 52514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CD23 +ENCODING 52515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +198C +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CD24 +ENCODING 52516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +3F98 +0318 +0618 +0D98 +30DF +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD25 +ENCODING 52517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD26 +ENCODING 52518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CD27 +ENCODING 52519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CD28 +ENCODING 52520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CD29 +ENCODING 52521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CD2A +ENCODING 52522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CD2B +ENCODING 52523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CD2C +ENCODING 52524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD2D +ENCODING 52525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CD2E +ENCODING 52526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CD2F +ENCODING 52527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CD30 +ENCODING 52528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CD31 +ENCODING 52529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CD32 +ENCODING 52530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CD33 +ENCODING 52531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CD34 +ENCODING 52532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD35 +ENCODING 52533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD36 +ENCODING 52534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CD37 +ENCODING 52535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD38 +ENCODING 52536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CD39 +ENCODING 52537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CD3A +ENCODING 52538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD3B +ENCODING 52539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD3C +ENCODING 52540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD3D +ENCODING 52541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CD3E +ENCODING 52542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CD3F +ENCODING 52543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7F98 +0318 +0618 +199F +6CD8 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CD40 +ENCODING 52544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +3FB6 +0336 +0636 +0DBE +30F6 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CD41 +ENCODING 52545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD42 +ENCODING 52546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CD43 +ENCODING 52547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CD44 +ENCODING 52548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CD45 +ENCODING 52549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CD46 +ENCODING 52550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CD47 +ENCODING 52551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CD48 +ENCODING 52552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD49 +ENCODING 52553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CD4A +ENCODING 52554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CD4B +ENCODING 52555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CD4C +ENCODING 52556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CD4D +ENCODING 52557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CD4E +ENCODING 52558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CD4F +ENCODING 52559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CD50 +ENCODING 52560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD51 +ENCODING 52561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD52 +ENCODING 52562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CD53 +ENCODING 52563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD54 +ENCODING 52564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CD55 +ENCODING 52565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CD56 +ENCODING 52566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD57 +ENCODING 52567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD58 +ENCODING 52568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD59 +ENCODING 52569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CD5A +ENCODING 52570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CD5B +ENCODING 52571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19BE +6CF6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CD5C +ENCODING 52572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +3F8C +030C +060C +0D8C +30CC +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CD5D +ENCODING 52573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD5E +ENCODING 52574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CD5F +ENCODING 52575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CD60 +ENCODING 52576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CD61 +ENCODING 52577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CD62 +ENCODING 52578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CD63 +ENCODING 52579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CD64 +ENCODING 52580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD65 +ENCODING 52581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CD66 +ENCODING 52582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CD67 +ENCODING 52583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CD68 +ENCODING 52584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CD69 +ENCODING 52585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CD6A +ENCODING 52586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CD6B +ENCODING 52587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CD6C +ENCODING 52588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD6D +ENCODING 52589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD6E +ENCODING 52590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CD6F +ENCODING 52591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD70 +ENCODING 52592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CD71 +ENCODING 52593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CD72 +ENCODING 52594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD73 +ENCODING 52595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CD74 +ENCODING 52596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD75 +ENCODING 52597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CD76 +ENCODING 52598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CD77 +ENCODING 52599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +6CCC +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CD78 +ENCODING 52600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +0000 +1FF8 +01C0 +0360 +0E18 +300C +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+CD79 +ENCODING 52601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD7A +ENCODING 52602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CD7B +ENCODING 52603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CD7C +ENCODING 52604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD7D +ENCODING 52605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CD7E +ENCODING 52606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CD7F +ENCODING 52607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD80 +ENCODING 52608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD81 +ENCODING 52609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CD82 +ENCODING 52610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CD83 +ENCODING 52611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CD84 +ENCODING 52612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CD85 +ENCODING 52613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CD86 +ENCODING 52614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CD87 +ENCODING 52615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CD88 +ENCODING 52616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD89 +ENCODING 52617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CD8A +ENCODING 52618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CD8B +ENCODING 52619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CD8C +ENCODING 52620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CD8D +ENCODING 52621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CD8E +ENCODING 52622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CD8F +ENCODING 52623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CD90 +ENCODING 52624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD91 +ENCODING 52625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CD92 +ENCODING 52626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CD93 +ENCODING 52627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +1E6C +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CD94 +ENCODING 52628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +01C0 +0360 +0E18 +300C +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+CD95 +ENCODING 52629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CD96 +ENCODING 52630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CD97 +ENCODING 52631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CD98 +ENCODING 52632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD99 +ENCODING 52633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CD9A +ENCODING 52634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CD9B +ENCODING 52635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD9C +ENCODING 52636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CD9D +ENCODING 52637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CD9E +ENCODING 52638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CD9F +ENCODING 52639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CDA0 +ENCODING 52640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CDA1 +ENCODING 52641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CDA2 +ENCODING 52642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CDA3 +ENCODING 52643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CDA4 +ENCODING 52644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CDA5 +ENCODING 52645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CDA6 +ENCODING 52646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CDA7 +ENCODING 52647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CDA8 +ENCODING 52648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CDA9 +ENCODING 52649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CDAA +ENCODING 52650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CDAB +ENCODING 52651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CDAC +ENCODING 52652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CDAD +ENCODING 52653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CDAE +ENCODING 52654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CDAF +ENCODING 52655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CDB0 +ENCODING 52656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +3F8C +030C +060C +0D8C +30CC +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+CDB1 +ENCODING 52657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CDB2 +ENCODING 52658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CDB3 +ENCODING 52659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CDB4 +ENCODING 52660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CDB5 +ENCODING 52661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CDB6 +ENCODING 52662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CDB7 +ENCODING 52663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CDB8 +ENCODING 52664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CDB9 +ENCODING 52665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CDBA +ENCODING 52666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CDBB +ENCODING 52667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CDBC +ENCODING 52668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CDBD +ENCODING 52669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CDBE +ENCODING 52670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CDBF +ENCODING 52671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CDC0 +ENCODING 52672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CDC1 +ENCODING 52673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CDC2 +ENCODING 52674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CDC3 +ENCODING 52675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CDC4 +ENCODING 52676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CDC5 +ENCODING 52677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CDC6 +ENCODING 52678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CDC7 +ENCODING 52679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CDC8 +ENCODING 52680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CDC9 +ENCODING 52681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CDCA +ENCODING 52682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CDCB +ENCODING 52683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7F9C +030C +060C +198C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CDCC +ENCODING 52684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +3FB6 +0336 +0636 +0DB6 +30F6 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CDCD +ENCODING 52685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CDCE +ENCODING 52686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CDCF +ENCODING 52687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CDD0 +ENCODING 52688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19F6 +60F6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CDD1 +ENCODING 52689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CDD2 +ENCODING 52690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CDD3 +ENCODING 52691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CDD4 +ENCODING 52692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CDD5 +ENCODING 52693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CDD6 +ENCODING 52694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CDD7 +ENCODING 52695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CDD8 +ENCODING 52696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CDD9 +ENCODING 52697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CDDA +ENCODING 52698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CDDB +ENCODING 52699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CDDC +ENCODING 52700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CDDD +ENCODING 52701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CDDE +ENCODING 52702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CDDF +ENCODING 52703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CDE0 +ENCODING 52704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CDE1 +ENCODING 52705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CDE2 +ENCODING 52706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CDE3 +ENCODING 52707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CDE4 +ENCODING 52708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CDE5 +ENCODING 52709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CDE6 +ENCODING 52710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CDE7 +ENCODING 52711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +0336 +0636 +19B6 +60F6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CDE8 +ENCODING 52712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +3F8C +030C +060C +0D8C +30CC +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+CDE9 +ENCODING 52713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CDEA +ENCODING 52714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CDEB +ENCODING 52715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CDEC +ENCODING 52716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CDED +ENCODING 52717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CDEE +ENCODING 52718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CDEF +ENCODING 52719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CDF0 +ENCODING 52720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CDF1 +ENCODING 52721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CDF2 +ENCODING 52722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CDF3 +ENCODING 52723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CDF4 +ENCODING 52724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CDF5 +ENCODING 52725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CDF6 +ENCODING 52726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CDF7 +ENCODING 52727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CDF8 +ENCODING 52728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CDF9 +ENCODING 52729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CDFA +ENCODING 52730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CDFB +ENCODING 52731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CDFC +ENCODING 52732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CDFD +ENCODING 52733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CDFE +ENCODING 52734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CDFF +ENCODING 52735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE00 +ENCODING 52736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CE01 +ENCODING 52737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CE02 +ENCODING 52738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CE03 +ENCODING 52739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7F86 +0306 +0606 +1986 +60C6 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CE04 +ENCODING 52740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +01C0 +0360 +0E18 +300C +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+CE05 +ENCODING 52741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE06 +ENCODING 52742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CE07 +ENCODING 52743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CE08 +ENCODING 52744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CE09 +ENCODING 52745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CE0A +ENCODING 52746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CE0B +ENCODING 52747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CE0C +ENCODING 52748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CE0D +ENCODING 52749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CE0E +ENCODING 52750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CE0F +ENCODING 52751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CE10 +ENCODING 52752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CE11 +ENCODING 52753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CE12 +ENCODING 52754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CE13 +ENCODING 52755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CE14 +ENCODING 52756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CE15 +ENCODING 52757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CE16 +ENCODING 52758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CE17 +ENCODING 52759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CE18 +ENCODING 52760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CE19 +ENCODING 52761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CE1A +ENCODING 52762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CE1B +ENCODING 52763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CE1C +ENCODING 52764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE1D +ENCODING 52765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CE1E +ENCODING 52766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CE1F +ENCODING 52767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CE20 +ENCODING 52768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +0000 +1FF8 +01C0 +0360 +0E18 +300C +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+CE21 +ENCODING 52769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE22 +ENCODING 52770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CE23 +ENCODING 52771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CE24 +ENCODING 52772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CE25 +ENCODING 52773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CE26 +ENCODING 52774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CE27 +ENCODING 52775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CE28 +ENCODING 52776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CE29 +ENCODING 52777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CE2A +ENCODING 52778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CE2B +ENCODING 52779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CE2C +ENCODING 52780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CE2D +ENCODING 52781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CE2E +ENCODING 52782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CE2F +ENCODING 52783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CE30 +ENCODING 52784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CE31 +ENCODING 52785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CE32 +ENCODING 52786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CE33 +ENCODING 52787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CE34 +ENCODING 52788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CE35 +ENCODING 52789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CE36 +ENCODING 52790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CE37 +ENCODING 52791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CE38 +ENCODING 52792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE39 +ENCODING 52793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CE3A +ENCODING 52794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CE3B +ENCODING 52795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01C0 +1FF8 +01C0 +0360 +0630 +180C +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CE3C +ENCODING 52796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +3F8C +030C +060C +0D8C +30CC +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CE3D +ENCODING 52797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE3E +ENCODING 52798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CE3F +ENCODING 52799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CE40 +ENCODING 52800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CE41 +ENCODING 52801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CE42 +ENCODING 52802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CE43 +ENCODING 52803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CE44 +ENCODING 52804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CE45 +ENCODING 52805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CE46 +ENCODING 52806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CE47 +ENCODING 52807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CE48 +ENCODING 52808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CE49 +ENCODING 52809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CE4A +ENCODING 52810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CE4B +ENCODING 52811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CE4C +ENCODING 52812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CE4D +ENCODING 52813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CE4E +ENCODING 52814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CE4F +ENCODING 52815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE50 +ENCODING 52816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CE51 +ENCODING 52817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CE52 +ENCODING 52818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE53 +ENCODING 52819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE54 +ENCODING 52820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE55 +ENCODING 52821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CE56 +ENCODING 52822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CE57 +ENCODING 52823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7F8C +030C +060C +198C +60CC +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CE58 +ENCODING 52824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1E0C +000C +7F0C +030C +060C +0E0C +1B0C +618C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CE59 +ENCODING 52825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CE5A +ENCODING 52826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CE5B +ENCODING 52827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CE5C +ENCODING 52828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CE5D +ENCODING 52829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CE5E +ENCODING 52830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CE5F +ENCODING 52831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CE60 +ENCODING 52832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CE61 +ENCODING 52833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CE62 +ENCODING 52834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CE63 +ENCODING 52835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CE64 +ENCODING 52836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CE65 +ENCODING 52837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CE66 +ENCODING 52838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CE67 +ENCODING 52839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CE68 +ENCODING 52840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CE69 +ENCODING 52841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CE6A +ENCODING 52842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CE6B +ENCODING 52843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE6C +ENCODING 52844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CE6D +ENCODING 52845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CE6E +ENCODING 52846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE6F +ENCODING 52847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE70 +ENCODING 52848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CE71 +ENCODING 52849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CE72 +ENCODING 52850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CE73 +ENCODING 52851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +1C0C +7F0C +030C +060C +0E0C +1B0C +618C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CE74 +ENCODING 52852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +0198 +7F98 +031F +0618 +0C18 +7018 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE75 +ENCODING 52853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE76 +ENCODING 52854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CE77 +ENCODING 52855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CE78 +ENCODING 52856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CE79 +ENCODING 52857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CE7A +ENCODING 52858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CE7B +ENCODING 52859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CE7C +ENCODING 52860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CE7D +ENCODING 52861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CE7E +ENCODING 52862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CE7F +ENCODING 52863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CE80 +ENCODING 52864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CE81 +ENCODING 52865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CE82 +ENCODING 52866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CE83 +ENCODING 52867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CE84 +ENCODING 52868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CE85 +ENCODING 52869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CE86 +ENCODING 52870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CE87 +ENCODING 52871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE88 +ENCODING 52872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CE89 +ENCODING 52873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CE8A +ENCODING 52874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE8B +ENCODING 52875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CE8C +ENCODING 52876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CE8D +ENCODING 52877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CE8E +ENCODING 52878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CE8F +ENCODING 52879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +031F +0618 +0C18 +3018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CE90 +ENCODING 52880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +01B6 +7FB6 +033E +0636 +0C36 +7036 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CE91 +ENCODING 52881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CE92 +ENCODING 52882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CE93 +ENCODING 52883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CE94 +ENCODING 52884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CE95 +ENCODING 52885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CE96 +ENCODING 52886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CE97 +ENCODING 52887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CE98 +ENCODING 52888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CE99 +ENCODING 52889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CE9A +ENCODING 52890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CE9B +ENCODING 52891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CE9C +ENCODING 52892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CE9D +ENCODING 52893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CE9E +ENCODING 52894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CE9F +ENCODING 52895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CEA0 +ENCODING 52896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CEA1 +ENCODING 52897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CEA2 +ENCODING 52898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CEA3 +ENCODING 52899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CEA4 +ENCODING 52900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CEA5 +ENCODING 52901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CEA6 +ENCODING 52902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CEA7 +ENCODING 52903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CEA8 +ENCODING 52904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CEA9 +ENCODING 52905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CEAA +ENCODING 52906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CEAB +ENCODING 52907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +033E +0636 +0C36 +3036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CEAC +ENCODING 52908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +0198 +7F9F +0318 +0618 +0C1F +7018 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CEAD +ENCODING 52909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CEAE +ENCODING 52910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CEAF +ENCODING 52911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CEB0 +ENCODING 52912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CEB1 +ENCODING 52913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CEB2 +ENCODING 52914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CEB3 +ENCODING 52915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CEB4 +ENCODING 52916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CEB5 +ENCODING 52917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CEB6 +ENCODING 52918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CEB7 +ENCODING 52919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CEB8 +ENCODING 52920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CEB9 +ENCODING 52921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CEBA +ENCODING 52922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CEBB +ENCODING 52923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CEBC +ENCODING 52924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CEBD +ENCODING 52925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CEBE +ENCODING 52926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CEBF +ENCODING 52927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CEC0 +ENCODING 52928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CEC1 +ENCODING 52929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CEC2 +ENCODING 52930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CEC3 +ENCODING 52931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CEC4 +ENCODING 52932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CEC5 +ENCODING 52933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CEC6 +ENCODING 52934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CEC7 +ENCODING 52935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F9F +0318 +061F +0C18 +3018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CEC8 +ENCODING 52936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +01B6 +7FBE +0336 +0636 +0C3E +7036 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CEC9 +ENCODING 52937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CECA +ENCODING 52938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CECB +ENCODING 52939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CECC +ENCODING 52940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CECD +ENCODING 52941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CECE +ENCODING 52942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CECF +ENCODING 52943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CED0 +ENCODING 52944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CED1 +ENCODING 52945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CED2 +ENCODING 52946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CED3 +ENCODING 52947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CED4 +ENCODING 52948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CED5 +ENCODING 52949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CED6 +ENCODING 52950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CED7 +ENCODING 52951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CED8 +ENCODING 52952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CED9 +ENCODING 52953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CEDA +ENCODING 52954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CEDB +ENCODING 52955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CEDC +ENCODING 52956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CEDD +ENCODING 52957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CEDE +ENCODING 52958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CEDF +ENCODING 52959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CEE0 +ENCODING 52960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CEE1 +ENCODING 52961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CEE2 +ENCODING 52962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CEE3 +ENCODING 52963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FBE +0336 +063E +0C36 +3036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CEE4 +ENCODING 52964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +018C +7F8C +037C +060C +0C0C +700C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CEE5 +ENCODING 52965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CEE6 +ENCODING 52966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CEE7 +ENCODING 52967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CEE8 +ENCODING 52968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +037C +060C +0C0C +300C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CEE9 +ENCODING 52969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CEEA +ENCODING 52970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CEEB +ENCODING 52971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CEEC +ENCODING 52972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CEED +ENCODING 52973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CEEE +ENCODING 52974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CEEF +ENCODING 52975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CEF0 +ENCODING 52976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CEF1 +ENCODING 52977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CEF2 +ENCODING 52978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CEF3 +ENCODING 52979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CEF4 +ENCODING 52980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CEF5 +ENCODING 52981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CEF6 +ENCODING 52982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CEF7 +ENCODING 52983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CEF8 +ENCODING 52984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CEF9 +ENCODING 52985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CEFA +ENCODING 52986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CEFB +ENCODING 52987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CEFC +ENCODING 52988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CEFD +ENCODING 52989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CEFE +ENCODING 52990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CEFF +ENCODING 52991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +03FC +060C +0C0C +300C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CF00 +ENCODING 52992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +01B6 +7FB6 +0376 +0636 +0C36 +7036 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CF01 +ENCODING 52993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CF02 +ENCODING 52994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CF03 +ENCODING 52995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CF04 +ENCODING 52996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +0376 +0636 +0C36 +3036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CF05 +ENCODING 52997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CF06 +ENCODING 52998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CF07 +ENCODING 52999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CF08 +ENCODING 53000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CF09 +ENCODING 53001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CF0A +ENCODING 53002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CF0B +ENCODING 53003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CF0C +ENCODING 53004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CF0D +ENCODING 53005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CF0E +ENCODING 53006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CF0F +ENCODING 53007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CF10 +ENCODING 53008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CF11 +ENCODING 53009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CF12 +ENCODING 53010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CF13 +ENCODING 53011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CF14 +ENCODING 53012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CF15 +ENCODING 53013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CF16 +ENCODING 53014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CF17 +ENCODING 53015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CF18 +ENCODING 53016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CF19 +ENCODING 53017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CF1A +ENCODING 53018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CF1B +ENCODING 53019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +03F6 +0636 +0C36 +3036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CF1C +ENCODING 53020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +018C +7FFC +030C +067C +0C0C +700C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CF1D +ENCODING 53021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CF1E +ENCODING 53022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CF1F +ENCODING 53023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+CF20 +ENCODING 53024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CF21 +ENCODING 53025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+CF22 +ENCODING 53026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+CF23 +ENCODING 53027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CF24 +ENCODING 53028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+CF25 +ENCODING 53029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+CF26 +ENCODING 53030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CF27 +ENCODING 53031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CF28 +ENCODING 53032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CF29 +ENCODING 53033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CF2A +ENCODING 53034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CF2B +ENCODING 53035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CF2C +ENCODING 53036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CF2D +ENCODING 53037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+CF2E +ENCODING 53038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CF2F +ENCODING 53039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CF30 +ENCODING 53040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CF31 +ENCODING 53041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CF32 +ENCODING 53042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CF33 +ENCODING 53043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CF34 +ENCODING 53044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CF35 +ENCODING 53045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CF36 +ENCODING 53046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CF37 +ENCODING 53047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3FFC +030C +067C +0C0C +300C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CF38 +ENCODING 53048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +01B6 +7FF6 +0336 +0676 +0C36 +7036 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CF39 +ENCODING 53049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CF3A +ENCODING 53050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+CF3B +ENCODING 53051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+CF3C +ENCODING 53052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +0676 +0C36 +3036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CF3D +ENCODING 53053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+CF3E +ENCODING 53054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+CF3F +ENCODING 53055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CF40 +ENCODING 53056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+CF41 +ENCODING 53057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+CF42 +ENCODING 53058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CF43 +ENCODING 53059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+CF44 +ENCODING 53060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+CF45 +ENCODING 53061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+CF46 +ENCODING 53062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CF47 +ENCODING 53063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CF48 +ENCODING 53064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CF49 +ENCODING 53065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+CF4A +ENCODING 53066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CF4B +ENCODING 53067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+CF4C +ENCODING 53068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+CF4D +ENCODING 53069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+CF4E +ENCODING 53070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CF4F +ENCODING 53071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+CF50 +ENCODING 53072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+CF51 +ENCODING 53073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+CF52 +ENCODING 53074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+CF53 +ENCODING 53075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FF6 +0336 +06F6 +0C36 +3036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+CF54 +ENCODING 53076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +1FF8 +0018 +0018 +0190 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+CF55 +ENCODING 53077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CF56 +ENCODING 53078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CF57 +ENCODING 53079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CF58 +ENCODING 53080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CF59 +ENCODING 53081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CF5A +ENCODING 53082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CF5B +ENCODING 53083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CF5C +ENCODING 53084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CF5D +ENCODING 53085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CF5E +ENCODING 53086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CF5F +ENCODING 53087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CF60 +ENCODING 53088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CF61 +ENCODING 53089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CF62 +ENCODING 53090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CF63 +ENCODING 53091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CF64 +ENCODING 53092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CF65 +ENCODING 53093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CF66 +ENCODING 53094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CF67 +ENCODING 53095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CF68 +ENCODING 53096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CF69 +ENCODING 53097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CF6A +ENCODING 53098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CF6B +ENCODING 53099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CF6C +ENCODING 53100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CF6D +ENCODING 53101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CF6E +ENCODING 53102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CF6F +ENCODING 53103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0190 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CF70 +ENCODING 53104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3FD8 +00D8 +3FD8 +00D8 +00D8 +009F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CF71 +ENCODING 53105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CF72 +ENCODING 53106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CF73 +ENCODING 53107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CF74 +ENCODING 53108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CF75 +ENCODING 53109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CF76 +ENCODING 53110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CF77 +ENCODING 53111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CF78 +ENCODING 53112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CF79 +ENCODING 53113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CF7A +ENCODING 53114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CF7B +ENCODING 53115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CF7C +ENCODING 53116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CF7D +ENCODING 53117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CF7E +ENCODING 53118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CF7F +ENCODING 53119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CF80 +ENCODING 53120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CF81 +ENCODING 53121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CF82 +ENCODING 53122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CF83 +ENCODING 53123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CF84 +ENCODING 53124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CF85 +ENCODING 53125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CF86 +ENCODING 53126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CF87 +ENCODING 53127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CF88 +ENCODING 53128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CF89 +ENCODING 53129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CF8A +ENCODING 53130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CF8B +ENCODING 53131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3F98 +0198 +3F98 +019F +0D98 +0D18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CF8C +ENCODING 53132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +00F6 +3FF6 +00F6 +00FE +00B6 +1836 +1836 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+CF8D +ENCODING 53133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CF8E +ENCODING 53134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CF8F +ENCODING 53135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CF90 +ENCODING 53136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CF91 +ENCODING 53137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CF92 +ENCODING 53138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CF93 +ENCODING 53139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CF94 +ENCODING 53140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CF95 +ENCODING 53141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CF96 +ENCODING 53142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CF97 +ENCODING 53143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CF98 +ENCODING 53144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CF99 +ENCODING 53145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CF9A +ENCODING 53146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CF9B +ENCODING 53147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CF9C +ENCODING 53148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CF9D +ENCODING 53149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CF9E +ENCODING 53150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CF9F +ENCODING 53151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CFA0 +ENCODING 53152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CFA1 +ENCODING 53153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CFA2 +ENCODING 53154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CFA3 +ENCODING 53155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CFA4 +ENCODING 53156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CFA5 +ENCODING 53157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CFA6 +ENCODING 53158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CFA7 +ENCODING 53159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01BE +19B6 +1936 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CFA8 +ENCODING 53160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +00CC +3FCC +00CC +00CC +008C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CFA9 +ENCODING 53161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CFAA +ENCODING 53162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+CFAB +ENCODING 53163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CFAC +ENCODING 53164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+CFAD +ENCODING 53165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+CFAE +ENCODING 53166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+CFAF +ENCODING 53167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CFB0 +ENCODING 53168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CFB1 +ENCODING 53169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+CFB2 +ENCODING 53170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CFB3 +ENCODING 53171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CFB4 +ENCODING 53172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+CFB5 +ENCODING 53173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CFB6 +ENCODING 53174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CFB7 +ENCODING 53175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+CFB8 +ENCODING 53176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CFB9 +ENCODING 53177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+CFBA +ENCODING 53178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+CFBB +ENCODING 53179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+CFBC +ENCODING 53180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+CFBD +ENCODING 53181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CFBE +ENCODING 53182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CFBF +ENCODING 53183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+CFC0 +ENCODING 53184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CFC1 +ENCODING 53185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+CFC2 +ENCODING 53186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+CFC3 +ENCODING 53187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +0D8C +0D0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+CFC4 +ENCODING 53188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +1FF8 +0018 +0018 +0CF0 +0C60 +0C60 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+CFC5 +ENCODING 53189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CFC6 +ENCODING 53190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CFC7 +ENCODING 53191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CFC8 +ENCODING 53192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CFC9 +ENCODING 53193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CFCA +ENCODING 53194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CFCB +ENCODING 53195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CFCC +ENCODING 53196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CFCD +ENCODING 53197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CFCE +ENCODING 53198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CFCF +ENCODING 53199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CFD0 +ENCODING 53200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CFD1 +ENCODING 53201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CFD2 +ENCODING 53202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CFD3 +ENCODING 53203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CFD4 +ENCODING 53204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CFD5 +ENCODING 53205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CFD6 +ENCODING 53206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CFD7 +ENCODING 53207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CFD8 +ENCODING 53208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CFD9 +ENCODING 53209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CFDA +ENCODING 53210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CFDB +ENCODING 53211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CFDC +ENCODING 53212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CFDD +ENCODING 53213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CFDE +ENCODING 53214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CFDF +ENCODING 53215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0C70 +0C60 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CFE0 +ENCODING 53216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+CFE1 +ENCODING 53217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CFE2 +ENCODING 53218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+CFE3 +ENCODING 53219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+CFE4 +ENCODING 53220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CFE5 +ENCODING 53221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+CFE6 +ENCODING 53222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+CFE7 +ENCODING 53223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CFE8 +ENCODING 53224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CFE9 +ENCODING 53225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+CFEA +ENCODING 53226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+CFEB +ENCODING 53227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+CFEC +ENCODING 53228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+CFED +ENCODING 53229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+CFEE +ENCODING 53230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+CFEF +ENCODING 53231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+CFF0 +ENCODING 53232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+CFF1 +ENCODING 53233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CFF2 +ENCODING 53234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+CFF3 +ENCODING 53235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+CFF4 +ENCODING 53236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+CFF5 +ENCODING 53237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CFF6 +ENCODING 53238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CFF7 +ENCODING 53239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+CFF8 +ENCODING 53240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+CFF9 +ENCODING 53241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+CFFA +ENCODING 53242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+CFFB +ENCODING 53243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+CFFC +ENCODING 53244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +00CC +3FCC +00CC +00CC +008C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+CFFD +ENCODING 53245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+CFFE +ENCODING 53246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+CFFF +ENCODING 53247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D000 +ENCODING 53248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D001 +ENCODING 53249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D002 +ENCODING 53250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D003 +ENCODING 53251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D004 +ENCODING 53252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D005 +ENCODING 53253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D006 +ENCODING 53254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D007 +ENCODING 53255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D008 +ENCODING 53256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D009 +ENCODING 53257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D00A +ENCODING 53258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D00B +ENCODING 53259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D00C +ENCODING 53260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D00D +ENCODING 53261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D00E +ENCODING 53262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D00F +ENCODING 53263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D010 +ENCODING 53264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D011 +ENCODING 53265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D012 +ENCODING 53266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D013 +ENCODING 53267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D014 +ENCODING 53268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D015 +ENCODING 53269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D016 +ENCODING 53270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D017 +ENCODING 53271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3F9C +018C +3F8C +018C +7FEC +070C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D018 +ENCODING 53272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +00F6 +3FF6 +00F6 +00F6 +00B6 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D019 +ENCODING 53273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D01A +ENCODING 53274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D01B +ENCODING 53275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D01C +ENCODING 53276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01F6 +01B6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D01D +ENCODING 53277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D01E +ENCODING 53278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D01F +ENCODING 53279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D020 +ENCODING 53280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D021 +ENCODING 53281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D022 +ENCODING 53282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D023 +ENCODING 53283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D024 +ENCODING 53284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D025 +ENCODING 53285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D026 +ENCODING 53286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D027 +ENCODING 53287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D028 +ENCODING 53288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D029 +ENCODING 53289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D02A +ENCODING 53290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D02B +ENCODING 53291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D02C +ENCODING 53292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D02D +ENCODING 53293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D02E +ENCODING 53294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D02F +ENCODING 53295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D030 +ENCODING 53296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D031 +ENCODING 53297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D032 +ENCODING 53298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D033 +ENCODING 53299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +01B6 +3FB6 +01B6 +01F6 +0136 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D034 +ENCODING 53300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +00CC +3FCC +00CC +00CC +008C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+D035 +ENCODING 53301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D036 +ENCODING 53302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D037 +ENCODING 53303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D038 +ENCODING 53304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D039 +ENCODING 53305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D03A +ENCODING 53306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D03B +ENCODING 53307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D03C +ENCODING 53308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D03D +ENCODING 53309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D03E +ENCODING 53310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D03F +ENCODING 53311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D040 +ENCODING 53312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D041 +ENCODING 53313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D042 +ENCODING 53314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D043 +ENCODING 53315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D044 +ENCODING 53316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D045 +ENCODING 53317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D046 +ENCODING 53318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D047 +ENCODING 53319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D048 +ENCODING 53320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D049 +ENCODING 53321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D04A +ENCODING 53322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D04B +ENCODING 53323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D04C +ENCODING 53324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D04D +ENCODING 53325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D04E +ENCODING 53326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D04F +ENCODING 53327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3F86 +0186 +3F86 +0186 +0186 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D050 +ENCODING 53328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +1FF8 +0018 +0010 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+D051 +ENCODING 53329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D052 +ENCODING 53330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D053 +ENCODING 53331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D054 +ENCODING 53332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D055 +ENCODING 53333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D056 +ENCODING 53334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D057 +ENCODING 53335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D058 +ENCODING 53336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D059 +ENCODING 53337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D05A +ENCODING 53338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D05B +ENCODING 53339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D05C +ENCODING 53340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D05D +ENCODING 53341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D05E +ENCODING 53342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D05F +ENCODING 53343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D060 +ENCODING 53344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D061 +ENCODING 53345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D062 +ENCODING 53346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D063 +ENCODING 53347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D064 +ENCODING 53348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D065 +ENCODING 53349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D066 +ENCODING 53350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D067 +ENCODING 53351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D068 +ENCODING 53352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D069 +ENCODING 53353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D06A +ENCODING 53354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D06B +ENCODING 53355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D06C +ENCODING 53356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +0018 +1FF8 +0018 +0018 +0010 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D06D +ENCODING 53357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D06E +ENCODING 53358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D06F +ENCODING 53359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D070 +ENCODING 53360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D071 +ENCODING 53361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D072 +ENCODING 53362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D073 +ENCODING 53363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D074 +ENCODING 53364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D075 +ENCODING 53365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D076 +ENCODING 53366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D077 +ENCODING 53367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D078 +ENCODING 53368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D079 +ENCODING 53369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D07A +ENCODING 53370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D07B +ENCODING 53371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D07C +ENCODING 53372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D07D +ENCODING 53373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D07E +ENCODING 53374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D07F +ENCODING 53375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D080 +ENCODING 53376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D081 +ENCODING 53377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D082 +ENCODING 53378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D083 +ENCODING 53379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D084 +ENCODING 53380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D085 +ENCODING 53381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D086 +ENCODING 53382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D087 +ENCODING 53383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D088 +ENCODING 53384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +00CC +3FCC +00CC +00CC +008C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D089 +ENCODING 53385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D08A +ENCODING 53386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D08B +ENCODING 53387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D08C +ENCODING 53388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D08D +ENCODING 53389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D08E +ENCODING 53390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D08F +ENCODING 53391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D090 +ENCODING 53392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D091 +ENCODING 53393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D092 +ENCODING 53394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D093 +ENCODING 53395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D094 +ENCODING 53396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D095 +ENCODING 53397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D096 +ENCODING 53398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D097 +ENCODING 53399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D098 +ENCODING 53400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D099 +ENCODING 53401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D09A +ENCODING 53402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D09B +ENCODING 53403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D09C +ENCODING 53404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D09D +ENCODING 53405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D09E +ENCODING 53406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D09F +ENCODING 53407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D0A0 +ENCODING 53408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D0A1 +ENCODING 53409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D0A2 +ENCODING 53410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D0A3 +ENCODING 53411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +018C +018C +010C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D0A4 +ENCODING 53412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +018C +7F8C +030C +060C +0C0C +700C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D0A5 +ENCODING 53413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D0A6 +ENCODING 53414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D0A7 +ENCODING 53415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D0A8 +ENCODING 53416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D0A9 +ENCODING 53417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D0AA +ENCODING 53418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D0AB +ENCODING 53419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D0AC +ENCODING 53420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D0AD +ENCODING 53421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D0AE +ENCODING 53422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D0AF +ENCODING 53423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D0B0 +ENCODING 53424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D0B1 +ENCODING 53425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D0B2 +ENCODING 53426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D0B3 +ENCODING 53427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D0B4 +ENCODING 53428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D0B5 +ENCODING 53429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D0B6 +ENCODING 53430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D0B7 +ENCODING 53431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D0B8 +ENCODING 53432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D0B9 +ENCODING 53433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D0BA +ENCODING 53434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D0BB +ENCODING 53435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D0BC +ENCODING 53436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D0BD +ENCODING 53437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D0BE +ENCODING 53438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D0BF +ENCODING 53439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3F8C +018C +3F8C +030C +060C +0C0C +300C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D0C0 +ENCODING 53440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +3018 +3018 +3F9F +3018 +3018 +1FD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D0C1 +ENCODING 53441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D0C2 +ENCODING 53442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D0C3 +ENCODING 53443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D0C4 +ENCODING 53444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D0C5 +ENCODING 53445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D0C6 +ENCODING 53446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D0C7 +ENCODING 53447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D0C8 +ENCODING 53448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D0C9 +ENCODING 53449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D0CA +ENCODING 53450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D0CB +ENCODING 53451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D0CC +ENCODING 53452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D0CD +ENCODING 53453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D0CE +ENCODING 53454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D0CF +ENCODING 53455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D0D0 +ENCODING 53456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D0D1 +ENCODING 53457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D0D2 +ENCODING 53458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D0D3 +ENCODING 53459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D0D4 +ENCODING 53460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D0D5 +ENCODING 53461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D0D6 +ENCODING 53462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D0D7 +ENCODING 53463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D0D8 +ENCODING 53464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D0D9 +ENCODING 53465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D0DA +ENCODING 53466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D0DB +ENCODING 53467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +3018 +3F1F +3018 +3018 +1F98 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D0DC +ENCODING 53468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +3036 +3036 +3FBE +3036 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D0DD +ENCODING 53469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D0DE +ENCODING 53470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D0DF +ENCODING 53471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D0E0 +ENCODING 53472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D0E1 +ENCODING 53473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D0E2 +ENCODING 53474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D0E3 +ENCODING 53475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D0E4 +ENCODING 53476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D0E5 +ENCODING 53477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D0E6 +ENCODING 53478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D0E7 +ENCODING 53479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D0E8 +ENCODING 53480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D0E9 +ENCODING 53481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D0EA +ENCODING 53482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D0EB +ENCODING 53483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D0EC +ENCODING 53484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D0ED +ENCODING 53485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D0EE +ENCODING 53486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D0EF +ENCODING 53487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D0F0 +ENCODING 53488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D0F1 +ENCODING 53489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D0F2 +ENCODING 53490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D0F3 +ENCODING 53491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D0F4 +ENCODING 53492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D0F5 +ENCODING 53493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D0F6 +ENCODING 53494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D0F7 +ENCODING 53495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F3E +3036 +3036 +1FB6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D0F8 +ENCODING 53496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +7F98 +3018 +301F +3F98 +3018 +301F +1FD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D0F9 +ENCODING 53497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D0FA +ENCODING 53498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D0FB +ENCODING 53499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D0FC +ENCODING 53500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D0FD +ENCODING 53501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D0FE +ENCODING 53502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D0FF +ENCODING 53503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D100 +ENCODING 53504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D101 +ENCODING 53505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D102 +ENCODING 53506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D103 +ENCODING 53507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D104 +ENCODING 53508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D105 +ENCODING 53509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D106 +ENCODING 53510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D107 +ENCODING 53511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D108 +ENCODING 53512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D109 +ENCODING 53513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D10A +ENCODING 53514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D10B +ENCODING 53515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D10C +ENCODING 53516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D10D +ENCODING 53517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D10E +ENCODING 53518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D10F +ENCODING 53519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D110 +ENCODING 53520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D111 +ENCODING 53521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D112 +ENCODING 53522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D113 +ENCODING 53523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F18 +3018 +301F +3F18 +301F +3018 +1F98 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D114 +ENCODING 53524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +3036 +303E +3FB6 +3036 +303E +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D115 +ENCODING 53525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D116 +ENCODING 53526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D117 +ENCODING 53527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D118 +ENCODING 53528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D119 +ENCODING 53529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D11A +ENCODING 53530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D11B +ENCODING 53531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D11C +ENCODING 53532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D11D +ENCODING 53533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D11E +ENCODING 53534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D11F +ENCODING 53535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D120 +ENCODING 53536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D121 +ENCODING 53537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D122 +ENCODING 53538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D123 +ENCODING 53539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D124 +ENCODING 53540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D125 +ENCODING 53541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D126 +ENCODING 53542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D127 +ENCODING 53543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D128 +ENCODING 53544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D129 +ENCODING 53545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D12A +ENCODING 53546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D12B +ENCODING 53547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D12C +ENCODING 53548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D12D +ENCODING 53549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D12E +ENCODING 53550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D12F +ENCODING 53551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +303E +3F36 +303E +3036 +1FB6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D130 +ENCODING 53552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +300C +300C +3FFC +300C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D131 +ENCODING 53553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D132 +ENCODING 53554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D133 +ENCODING 53555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D134 +ENCODING 53556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F7C +300C +300C +1F8C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D135 +ENCODING 53557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D136 +ENCODING 53558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D137 +ENCODING 53559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D138 +ENCODING 53560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D139 +ENCODING 53561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D13A +ENCODING 53562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D13B +ENCODING 53563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D13C +ENCODING 53564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D13D +ENCODING 53565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D13E +ENCODING 53566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D13F +ENCODING 53567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D140 +ENCODING 53568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D141 +ENCODING 53569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D142 +ENCODING 53570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D143 +ENCODING 53571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D144 +ENCODING 53572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D145 +ENCODING 53573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D146 +ENCODING 53574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D147 +ENCODING 53575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D148 +ENCODING 53576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D149 +ENCODING 53577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D14A +ENCODING 53578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D14B +ENCODING 53579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3FFC +300C +300C +1F8C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D14C +ENCODING 53580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +3036 +3036 +3FF6 +3036 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D14D +ENCODING 53581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D14E +ENCODING 53582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D14F +ENCODING 53583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D150 +ENCODING 53584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3F76 +3036 +3036 +1FB6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D151 +ENCODING 53585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D152 +ENCODING 53586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D153 +ENCODING 53587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D154 +ENCODING 53588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D155 +ENCODING 53589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D156 +ENCODING 53590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D157 +ENCODING 53591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D158 +ENCODING 53592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D159 +ENCODING 53593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D15A +ENCODING 53594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D15B +ENCODING 53595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D15C +ENCODING 53596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D15D +ENCODING 53597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D15E +ENCODING 53598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D15F +ENCODING 53599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D160 +ENCODING 53600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D161 +ENCODING 53601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D162 +ENCODING 53602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D163 +ENCODING 53603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D164 +ENCODING 53604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D165 +ENCODING 53605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D166 +ENCODING 53606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D167 +ENCODING 53607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3036 +3FF6 +3036 +3036 +1FB6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D168 +ENCODING 53608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +300C +307C +3F8C +307C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D169 +ENCODING 53609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D16A +ENCODING 53610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D16B +ENCODING 53611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D16C +ENCODING 53612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D16D +ENCODING 53613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D16E +ENCODING 53614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D16F +ENCODING 53615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D170 +ENCODING 53616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D171 +ENCODING 53617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D172 +ENCODING 53618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D173 +ENCODING 53619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D174 +ENCODING 53620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D175 +ENCODING 53621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D176 +ENCODING 53622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D177 +ENCODING 53623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D178 +ENCODING 53624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D179 +ENCODING 53625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D17A +ENCODING 53626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D17B +ENCODING 53627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D17C +ENCODING 53628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D17D +ENCODING 53629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D17E +ENCODING 53630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D17F +ENCODING 53631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D180 +ENCODING 53632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D181 +ENCODING 53633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D182 +ENCODING 53634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D183 +ENCODING 53635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +307C +3F0C +307C +300C +1F8C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D184 +ENCODING 53636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +7FB6 +3036 +3076 +3FB6 +3076 +3036 +1FF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D185 +ENCODING 53637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D186 +ENCODING 53638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D187 +ENCODING 53639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D188 +ENCODING 53640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +3076 +3F36 +3076 +3036 +1FB6 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D189 +ENCODING 53641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D18A +ENCODING 53642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D18B +ENCODING 53643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D18C +ENCODING 53644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D18D +ENCODING 53645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D18E +ENCODING 53646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D18F +ENCODING 53647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D190 +ENCODING 53648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D191 +ENCODING 53649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D192 +ENCODING 53650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D193 +ENCODING 53651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D194 +ENCODING 53652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D195 +ENCODING 53653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D196 +ENCODING 53654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D197 +ENCODING 53655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D198 +ENCODING 53656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D199 +ENCODING 53657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D19A +ENCODING 53658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D19B +ENCODING 53659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D19C +ENCODING 53660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D19D +ENCODING 53661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D19E +ENCODING 53662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D19F +ENCODING 53663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F76 +3036 +30F6 +3F36 +30F6 +3036 +1FB6 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D1A0 +ENCODING 53664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D1A1 +ENCODING 53665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D1A2 +ENCODING 53666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D1A3 +ENCODING 53667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D1A4 +ENCODING 53668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D1A5 +ENCODING 53669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D1A6 +ENCODING 53670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D1A7 +ENCODING 53671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D1A8 +ENCODING 53672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D1A9 +ENCODING 53673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D1AA +ENCODING 53674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D1AB +ENCODING 53675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D1AC +ENCODING 53676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D1AD +ENCODING 53677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D1AE +ENCODING 53678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D1AF +ENCODING 53679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D1B0 +ENCODING 53680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D1B1 +ENCODING 53681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D1B2 +ENCODING 53682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D1B3 +ENCODING 53683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D1B4 +ENCODING 53684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D1B5 +ENCODING 53685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D1B6 +ENCODING 53686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D1B7 +ENCODING 53687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D1B8 +ENCODING 53688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D1B9 +ENCODING 53689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D1BA +ENCODING 53690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D1BB +ENCODING 53691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D1BC +ENCODING 53692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +3018 +1F98 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D1BD +ENCODING 53693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D1BE +ENCODING 53694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D1BF +ENCODING 53695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D1C0 +ENCODING 53696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D1C1 +ENCODING 53697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D1C2 +ENCODING 53698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D1C3 +ENCODING 53699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D1C4 +ENCODING 53700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D1C5 +ENCODING 53701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D1C6 +ENCODING 53702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D1C7 +ENCODING 53703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D1C8 +ENCODING 53704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D1C9 +ENCODING 53705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D1CA +ENCODING 53706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D1CB +ENCODING 53707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D1CC +ENCODING 53708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D1CD +ENCODING 53709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D1CE +ENCODING 53710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D1CF +ENCODING 53711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D1D0 +ENCODING 53712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D1D1 +ENCODING 53713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D1D2 +ENCODING 53714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D1D3 +ENCODING 53715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D1D4 +ENCODING 53716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D1D5 +ENCODING 53717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D1D6 +ENCODING 53718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D1D7 +ENCODING 53719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3018 +3F98 +301F +1F98 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D1D8 +ENCODING 53720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FBE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D1D9 +ENCODING 53721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D1DA +ENCODING 53722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D1DB +ENCODING 53723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D1DC +ENCODING 53724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D1DD +ENCODING 53725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D1DE +ENCODING 53726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D1DF +ENCODING 53727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D1E0 +ENCODING 53728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D1E1 +ENCODING 53729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D1E2 +ENCODING 53730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D1E3 +ENCODING 53731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D1E4 +ENCODING 53732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D1E5 +ENCODING 53733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D1E6 +ENCODING 53734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D1E7 +ENCODING 53735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D1E8 +ENCODING 53736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D1E9 +ENCODING 53737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D1EA +ENCODING 53738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D1EB +ENCODING 53739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D1EC +ENCODING 53740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D1ED +ENCODING 53741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D1EE +ENCODING 53742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D1EF +ENCODING 53743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D1F0 +ENCODING 53744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D1F1 +ENCODING 53745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D1F2 +ENCODING 53746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D1F3 +ENCODING 53747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +303E +1FB6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D1F4 +ENCODING 53748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D1F5 +ENCODING 53749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D1F6 +ENCODING 53750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D1F7 +ENCODING 53751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D1F8 +ENCODING 53752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D1F9 +ENCODING 53753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D1FA +ENCODING 53754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D1FB +ENCODING 53755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D1FC +ENCODING 53756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D1FD +ENCODING 53757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D1FE +ENCODING 53758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D1FF +ENCODING 53759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D200 +ENCODING 53760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D201 +ENCODING 53761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D202 +ENCODING 53762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D203 +ENCODING 53763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D204 +ENCODING 53764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D205 +ENCODING 53765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D206 +ENCODING 53766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D207 +ENCODING 53767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D208 +ENCODING 53768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D209 +ENCODING 53769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D20A +ENCODING 53770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D20B +ENCODING 53771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D20C +ENCODING 53772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D20D +ENCODING 53773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D20E +ENCODING 53774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D20F +ENCODING 53775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D210 +ENCODING 53776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D211 +ENCODING 53777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D212 +ENCODING 53778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D213 +ENCODING 53779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D214 +ENCODING 53780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D215 +ENCODING 53781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D216 +ENCODING 53782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D217 +ENCODING 53783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D218 +ENCODING 53784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D219 +ENCODING 53785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D21A +ENCODING 53786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D21B +ENCODING 53787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D21C +ENCODING 53788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D21D +ENCODING 53789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D21E +ENCODING 53790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D21F +ENCODING 53791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D220 +ENCODING 53792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D221 +ENCODING 53793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D222 +ENCODING 53794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D223 +ENCODING 53795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D224 +ENCODING 53796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D225 +ENCODING 53797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D226 +ENCODING 53798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D227 +ENCODING 53799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D228 +ENCODING 53800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D229 +ENCODING 53801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D22A +ENCODING 53802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D22B +ENCODING 53803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D22C +ENCODING 53804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+D22D +ENCODING 53805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D22E +ENCODING 53806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D22F +ENCODING 53807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D230 +ENCODING 53808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D231 +ENCODING 53809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D232 +ENCODING 53810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D233 +ENCODING 53811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D234 +ENCODING 53812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D235 +ENCODING 53813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D236 +ENCODING 53814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D237 +ENCODING 53815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D238 +ENCODING 53816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D239 +ENCODING 53817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D23A +ENCODING 53818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D23B +ENCODING 53819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D23C +ENCODING 53820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D23D +ENCODING 53821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D23E +ENCODING 53822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D23F +ENCODING 53823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D240 +ENCODING 53824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D241 +ENCODING 53825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D242 +ENCODING 53826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D243 +ENCODING 53827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D244 +ENCODING 53828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D245 +ENCODING 53829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D246 +ENCODING 53830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D247 +ENCODING 53831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D248 +ENCODING 53832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+D249 +ENCODING 53833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D24A +ENCODING 53834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D24B +ENCODING 53835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D24C +ENCODING 53836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D24D +ENCODING 53837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D24E +ENCODING 53838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D24F +ENCODING 53839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D250 +ENCODING 53840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D251 +ENCODING 53841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D252 +ENCODING 53842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D253 +ENCODING 53843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D254 +ENCODING 53844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D255 +ENCODING 53845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D256 +ENCODING 53846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D257 +ENCODING 53847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D258 +ENCODING 53848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D259 +ENCODING 53849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D25A +ENCODING 53850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D25B +ENCODING 53851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D25C +ENCODING 53852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D25D +ENCODING 53853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D25E +ENCODING 53854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D25F +ENCODING 53855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D260 +ENCODING 53856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D261 +ENCODING 53857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D262 +ENCODING 53858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D263 +ENCODING 53859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +300C +3F8C +300C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D264 +ENCODING 53860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FB6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D265 +ENCODING 53861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D266 +ENCODING 53862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D267 +ENCODING 53863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D268 +ENCODING 53864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +30F6 +1FB6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D269 +ENCODING 53865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D26A +ENCODING 53866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D26B +ENCODING 53867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D26C +ENCODING 53868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D26D +ENCODING 53869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D26E +ENCODING 53870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D26F +ENCODING 53871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D270 +ENCODING 53872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D271 +ENCODING 53873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D272 +ENCODING 53874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D273 +ENCODING 53875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D274 +ENCODING 53876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D275 +ENCODING 53877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D276 +ENCODING 53878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D277 +ENCODING 53879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D278 +ENCODING 53880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D279 +ENCODING 53881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D27A +ENCODING 53882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D27B +ENCODING 53883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D27C +ENCODING 53884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D27D +ENCODING 53885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D27E +ENCODING 53886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D27F +ENCODING 53887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3036 +3FB6 +3036 +1FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D280 +ENCODING 53888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+D281 +ENCODING 53889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D282 +ENCODING 53890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D283 +ENCODING 53891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D284 +ENCODING 53892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D285 +ENCODING 53893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D286 +ENCODING 53894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D287 +ENCODING 53895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D288 +ENCODING 53896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D289 +ENCODING 53897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D28A +ENCODING 53898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D28B +ENCODING 53899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D28C +ENCODING 53900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D28D +ENCODING 53901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D28E +ENCODING 53902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D28F +ENCODING 53903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D290 +ENCODING 53904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D291 +ENCODING 53905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D292 +ENCODING 53906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D293 +ENCODING 53907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D294 +ENCODING 53908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D295 +ENCODING 53909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D296 +ENCODING 53910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D297 +ENCODING 53911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D298 +ENCODING 53912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D299 +ENCODING 53913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D29A +ENCODING 53914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D29B +ENCODING 53915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3006 +3F86 +3006 +1F86 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D29C +ENCODING 53916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+D29D +ENCODING 53917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D29E +ENCODING 53918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D29F +ENCODING 53919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D2A0 +ENCODING 53920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D2A1 +ENCODING 53921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D2A2 +ENCODING 53922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D2A3 +ENCODING 53923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D2A4 +ENCODING 53924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D2A5 +ENCODING 53925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D2A6 +ENCODING 53926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D2A7 +ENCODING 53927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D2A8 +ENCODING 53928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D2A9 +ENCODING 53929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D2AA +ENCODING 53930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D2AB +ENCODING 53931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D2AC +ENCODING 53932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D2AD +ENCODING 53933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D2AE +ENCODING 53934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D2AF +ENCODING 53935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D2B0 +ENCODING 53936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D2B1 +ENCODING 53937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D2B2 +ENCODING 53938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D2B3 +ENCODING 53939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D2B4 +ENCODING 53940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D2B5 +ENCODING 53941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D2B6 +ENCODING 53942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D2B7 +ENCODING 53943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D2B8 +ENCODING 53944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D2B9 +ENCODING 53945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D2BA +ENCODING 53946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D2BB +ENCODING 53947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D2BC +ENCODING 53948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D2BD +ENCODING 53949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D2BE +ENCODING 53950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D2BF +ENCODING 53951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D2C0 +ENCODING 53952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D2C1 +ENCODING 53953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D2C2 +ENCODING 53954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D2C3 +ENCODING 53955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D2C4 +ENCODING 53956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D2C5 +ENCODING 53957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D2C6 +ENCODING 53958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D2C7 +ENCODING 53959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D2C8 +ENCODING 53960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D2C9 +ENCODING 53961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D2CA +ENCODING 53962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D2CB +ENCODING 53963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D2CC +ENCODING 53964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D2CD +ENCODING 53965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D2CE +ENCODING 53966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D2CF +ENCODING 53967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D2D0 +ENCODING 53968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D2D1 +ENCODING 53969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D2D2 +ENCODING 53970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D2D3 +ENCODING 53971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FF8 +1800 +1FF8 +1800 +0FF8 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D2D4 +ENCODING 53972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D2D5 +ENCODING 53973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D2D6 +ENCODING 53974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D2D7 +ENCODING 53975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D2D8 +ENCODING 53976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D2D9 +ENCODING 53977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D2DA +ENCODING 53978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D2DB +ENCODING 53979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D2DC +ENCODING 53980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D2DD +ENCODING 53981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D2DE +ENCODING 53982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D2DF +ENCODING 53983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D2E0 +ENCODING 53984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D2E1 +ENCODING 53985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D2E2 +ENCODING 53986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D2E3 +ENCODING 53987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D2E4 +ENCODING 53988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D2E5 +ENCODING 53989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D2E6 +ENCODING 53990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D2E7 +ENCODING 53991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D2E8 +ENCODING 53992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D2E9 +ENCODING 53993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D2EA +ENCODING 53994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D2EB +ENCODING 53995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D2EC +ENCODING 53996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D2ED +ENCODING 53997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D2EE +ENCODING 53998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D2EF +ENCODING 53999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +300C +3F8C +300C +1F8C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D2F0 +ENCODING 54000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +7F8C +300C +300C +3F8C +300C +300C +1FCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D2F1 +ENCODING 54001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D2F2 +ENCODING 54002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D2F3 +ENCODING 54003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D2F4 +ENCODING 54004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D2F5 +ENCODING 54005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D2F6 +ENCODING 54006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D2F7 +ENCODING 54007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D2F8 +ENCODING 54008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D2F9 +ENCODING 54009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D2FA +ENCODING 54010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D2FB +ENCODING 54011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D2FC +ENCODING 54012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D2FD +ENCODING 54013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D2FE +ENCODING 54014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D2FF +ENCODING 54015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D300 +ENCODING 54016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D301 +ENCODING 54017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D302 +ENCODING 54018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D303 +ENCODING 54019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D304 +ENCODING 54020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D305 +ENCODING 54021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D306 +ENCODING 54022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D307 +ENCODING 54023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D308 +ENCODING 54024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D309 +ENCODING 54025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D30A +ENCODING 54026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D30B +ENCODING 54027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F0C +300C +300C +3F0C +300C +300C +1F8C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D30C +ENCODING 54028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +FFD8 +3318 +3318 +331F +3318 +3318 +FFD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D30D +ENCODING 54029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D30E +ENCODING 54030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D30F +ENCODING 54031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D310 +ENCODING 54032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D311 +ENCODING 54033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D312 +ENCODING 54034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D313 +ENCODING 54035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D314 +ENCODING 54036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D315 +ENCODING 54037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D316 +ENCODING 54038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D317 +ENCODING 54039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D318 +ENCODING 54040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D319 +ENCODING 54041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D31A +ENCODING 54042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D31B +ENCODING 54043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D31C +ENCODING 54044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D31D +ENCODING 54045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D31E +ENCODING 54046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D31F +ENCODING 54047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D320 +ENCODING 54048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D321 +ENCODING 54049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D322 +ENCODING 54050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D323 +ENCODING 54051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D324 +ENCODING 54052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D325 +ENCODING 54053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D326 +ENCODING 54054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D327 +ENCODING 54055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +3318 +331F +3318 +7FD8 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D328 +ENCODING 54056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +FFF6 +3336 +3336 +333E +3336 +3336 +FFF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D329 +ENCODING 54057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D32A +ENCODING 54058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D32B +ENCODING 54059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D32C +ENCODING 54060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D32D +ENCODING 54061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D32E +ENCODING 54062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D32F +ENCODING 54063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D330 +ENCODING 54064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D331 +ENCODING 54065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D332 +ENCODING 54066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D333 +ENCODING 54067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D334 +ENCODING 54068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D335 +ENCODING 54069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D336 +ENCODING 54070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D337 +ENCODING 54071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D338 +ENCODING 54072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D339 +ENCODING 54073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D33A +ENCODING 54074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D33B +ENCODING 54075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D33C +ENCODING 54076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D33D +ENCODING 54077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D33E +ENCODING 54078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D33F +ENCODING 54079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D340 +ENCODING 54080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D341 +ENCODING 54081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D342 +ENCODING 54082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D343 +ENCODING 54083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +3336 +7FF6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D344 +ENCODING 54084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0018 +FFD8 +3318 +331F +3318 +3318 +331F +FFD8 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D345 +ENCODING 54085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D346 +ENCODING 54086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D347 +ENCODING 54087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D348 +ENCODING 54088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D349 +ENCODING 54089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D34A +ENCODING 54090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D34B +ENCODING 54091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D34C +ENCODING 54092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D34D +ENCODING 54093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D34E +ENCODING 54094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D34F +ENCODING 54095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D350 +ENCODING 54096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D351 +ENCODING 54097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D352 +ENCODING 54098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D353 +ENCODING 54099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D354 +ENCODING 54100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D355 +ENCODING 54101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D356 +ENCODING 54102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D357 +ENCODING 54103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D358 +ENCODING 54104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D359 +ENCODING 54105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D35A +ENCODING 54106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D35B +ENCODING 54107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D35C +ENCODING 54108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D35D +ENCODING 54109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D35E +ENCODING 54110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D35F +ENCODING 54111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7FD8 +3318 +331F +3318 +331F +7FD8 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D360 +ENCODING 54112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +FFF6 +3336 +333E +3336 +3336 +333E +FFF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D361 +ENCODING 54113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D362 +ENCODING 54114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D363 +ENCODING 54115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D364 +ENCODING 54116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D365 +ENCODING 54117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D366 +ENCODING 54118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D367 +ENCODING 54119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D368 +ENCODING 54120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D369 +ENCODING 54121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D36A +ENCODING 54122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D36B +ENCODING 54123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D36C +ENCODING 54124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D36D +ENCODING 54125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D36E +ENCODING 54126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D36F +ENCODING 54127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D370 +ENCODING 54128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D371 +ENCODING 54129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D372 +ENCODING 54130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D373 +ENCODING 54131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D374 +ENCODING 54132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D375 +ENCODING 54133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D376 +ENCODING 54134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D377 +ENCODING 54135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D378 +ENCODING 54136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D379 +ENCODING 54137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D37A +ENCODING 54138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D37B +ENCODING 54139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +333E +3336 +333E +7FF6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D37C +ENCODING 54140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +FFCC +330C +330C +337C +330C +330C +FFCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D37D +ENCODING 54141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D37E +ENCODING 54142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D37F +ENCODING 54143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D380 +ENCODING 54144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +337C +330C +7FCC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D381 +ENCODING 54145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D382 +ENCODING 54146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D383 +ENCODING 54147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D384 +ENCODING 54148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D385 +ENCODING 54149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D386 +ENCODING 54150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D387 +ENCODING 54151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D388 +ENCODING 54152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D389 +ENCODING 54153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D38A +ENCODING 54154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D38B +ENCODING 54155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D38C +ENCODING 54156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D38D +ENCODING 54157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D38E +ENCODING 54158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D38F +ENCODING 54159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D390 +ENCODING 54160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D391 +ENCODING 54161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D392 +ENCODING 54162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D393 +ENCODING 54163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D394 +ENCODING 54164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D395 +ENCODING 54165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D396 +ENCODING 54166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D397 +ENCODING 54167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +33FC +330C +7FCC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D398 +ENCODING 54168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +FFF6 +3336 +3336 +3376 +3336 +3336 +FFF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D399 +ENCODING 54169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D39A +ENCODING 54170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D39B +ENCODING 54171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D39C +ENCODING 54172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3376 +3336 +7FF6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D39D +ENCODING 54173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D39E +ENCODING 54174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D39F +ENCODING 54175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D3A0 +ENCODING 54176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D3A1 +ENCODING 54177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D3A2 +ENCODING 54178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D3A3 +ENCODING 54179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D3A4 +ENCODING 54180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D3A5 +ENCODING 54181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D3A6 +ENCODING 54182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D3A7 +ENCODING 54183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D3A8 +ENCODING 54184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D3A9 +ENCODING 54185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D3AA +ENCODING 54186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D3AB +ENCODING 54187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D3AC +ENCODING 54188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D3AD +ENCODING 54189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D3AE +ENCODING 54190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D3AF +ENCODING 54191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D3B0 +ENCODING 54192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D3B1 +ENCODING 54193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D3B2 +ENCODING 54194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D3B3 +ENCODING 54195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +3336 +7FF6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D3B4 +ENCODING 54196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +FFCC +330C +337C +330C +337C +330C +FFCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D3B5 +ENCODING 54197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D3B6 +ENCODING 54198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D3B7 +ENCODING 54199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D3B8 +ENCODING 54200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D3B9 +ENCODING 54201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D3BA +ENCODING 54202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D3BB +ENCODING 54203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D3BC +ENCODING 54204 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D3BD +ENCODING 54205 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D3BE +ENCODING 54206 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D3BF +ENCODING 54207 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D3C0 +ENCODING 54208 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D3C1 +ENCODING 54209 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D3C2 +ENCODING 54210 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D3C3 +ENCODING 54211 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D3C4 +ENCODING 54212 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D3C5 +ENCODING 54213 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D3C6 +ENCODING 54214 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D3C7 +ENCODING 54215 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D3C8 +ENCODING 54216 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D3C9 +ENCODING 54217 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D3CA +ENCODING 54218 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D3CB +ENCODING 54219 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D3CC +ENCODING 54220 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D3CD +ENCODING 54221 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D3CE +ENCODING 54222 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D3CF +ENCODING 54223 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +337C +330C +337C +7FCC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D3D0 +ENCODING 54224 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0076 +FFF6 +3336 +3376 +3336 +3376 +3336 +FFF6 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D3D1 +ENCODING 54225 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D3D2 +ENCODING 54226 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D3D3 +ENCODING 54227 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D3D4 +ENCODING 54228 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3376 +3336 +3376 +7FF6 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D3D5 +ENCODING 54229 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D3D6 +ENCODING 54230 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D3D7 +ENCODING 54231 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D3D8 +ENCODING 54232 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D3D9 +ENCODING 54233 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D3DA +ENCODING 54234 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D3DB +ENCODING 54235 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D3DC +ENCODING 54236 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D3DD +ENCODING 54237 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D3DE +ENCODING 54238 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D3DF +ENCODING 54239 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D3E0 +ENCODING 54240 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D3E1 +ENCODING 54241 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D3E2 +ENCODING 54242 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D3E3 +ENCODING 54243 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D3E4 +ENCODING 54244 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D3E5 +ENCODING 54245 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D3E6 +ENCODING 54246 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D3E7 +ENCODING 54247 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D3E8 +ENCODING 54248 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D3E9 +ENCODING 54249 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D3EA +ENCODING 54250 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D3EB +ENCODING 54251 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +33F6 +3336 +33F6 +7FF6 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D3EC +ENCODING 54252 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D3ED +ENCODING 54253 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D3EE +ENCODING 54254 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D3EF +ENCODING 54255 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D3F0 +ENCODING 54256 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D3F1 +ENCODING 54257 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D3F2 +ENCODING 54258 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D3F3 +ENCODING 54259 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D3F4 +ENCODING 54260 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D3F5 +ENCODING 54261 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D3F6 +ENCODING 54262 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D3F7 +ENCODING 54263 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D3F8 +ENCODING 54264 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D3F9 +ENCODING 54265 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D3FA +ENCODING 54266 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D3FB +ENCODING 54267 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D3FC +ENCODING 54268 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D3FD +ENCODING 54269 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D3FE +ENCODING 54270 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D3FF +ENCODING 54271 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D400 +ENCODING 54272 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D401 +ENCODING 54273 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D402 +ENCODING 54274 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D403 +ENCODING 54275 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D404 +ENCODING 54276 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D405 +ENCODING 54277 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D406 +ENCODING 54278 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D407 +ENCODING 54279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D408 +ENCODING 54280 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +3FD8 +1998 +1998 +1998 +3FD8 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D409 +ENCODING 54281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D40A +ENCODING 54282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D40B +ENCODING 54283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D40C +ENCODING 54284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D40D +ENCODING 54285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D40E +ENCODING 54286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D40F +ENCODING 54287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D410 +ENCODING 54288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D411 +ENCODING 54289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D412 +ENCODING 54290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D413 +ENCODING 54291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D414 +ENCODING 54292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D415 +ENCODING 54293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D416 +ENCODING 54294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D417 +ENCODING 54295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D418 +ENCODING 54296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D419 +ENCODING 54297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D41A +ENCODING 54298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D41B +ENCODING 54299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D41C +ENCODING 54300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D41D +ENCODING 54301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D41E +ENCODING 54302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D41F +ENCODING 54303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D420 +ENCODING 54304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D421 +ENCODING 54305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D422 +ENCODING 54306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D423 +ENCODING 54307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +7F98 +3318 +3318 +331F +7F98 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D424 +ENCODING 54308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +19B6 +19B6 +19B6 +3FFE +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D425 +ENCODING 54309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D426 +ENCODING 54310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D427 +ENCODING 54311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D428 +ENCODING 54312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D429 +ENCODING 54313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D42A +ENCODING 54314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D42B +ENCODING 54315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D42C +ENCODING 54316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D42D +ENCODING 54317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D42E +ENCODING 54318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D42F +ENCODING 54319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D430 +ENCODING 54320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D431 +ENCODING 54321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D432 +ENCODING 54322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D433 +ENCODING 54323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D434 +ENCODING 54324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D435 +ENCODING 54325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D436 +ENCODING 54326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D437 +ENCODING 54327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D438 +ENCODING 54328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D439 +ENCODING 54329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D43A +ENCODING 54330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D43B +ENCODING 54331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D43C +ENCODING 54332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D43D +ENCODING 54333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D43E +ENCODING 54334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D43F +ENCODING 54335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +333E +7FB6 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D440 +ENCODING 54336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +198C +198C +198C +3FCC +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D441 +ENCODING 54337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D442 +ENCODING 54338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D443 +ENCODING 54339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D444 +ENCODING 54340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D445 +ENCODING 54341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D446 +ENCODING 54342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D447 +ENCODING 54343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D448 +ENCODING 54344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D449 +ENCODING 54345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D44A +ENCODING 54346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D44B +ENCODING 54347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D44C +ENCODING 54348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D44D +ENCODING 54349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D44E +ENCODING 54350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D44F +ENCODING 54351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D450 +ENCODING 54352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D451 +ENCODING 54353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D452 +ENCODING 54354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D453 +ENCODING 54355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D454 +ENCODING 54356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D455 +ENCODING 54357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D456 +ENCODING 54358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D457 +ENCODING 54359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D458 +ENCODING 54360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D459 +ENCODING 54361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D45A +ENCODING 54362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D45B +ENCODING 54363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D45C +ENCODING 54364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D45D +ENCODING 54365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D45E +ENCODING 54366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D45F +ENCODING 54367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D460 +ENCODING 54368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D461 +ENCODING 54369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D462 +ENCODING 54370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D463 +ENCODING 54371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D464 +ENCODING 54372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D465 +ENCODING 54373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D466 +ENCODING 54374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D467 +ENCODING 54375 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D468 +ENCODING 54376 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D469 +ENCODING 54377 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D46A +ENCODING 54378 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D46B +ENCODING 54379 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D46C +ENCODING 54380 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D46D +ENCODING 54381 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D46E +ENCODING 54382 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D46F +ENCODING 54383 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D470 +ENCODING 54384 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D471 +ENCODING 54385 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D472 +ENCODING 54386 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D473 +ENCODING 54387 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D474 +ENCODING 54388 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D475 +ENCODING 54389 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D476 +ENCODING 54390 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D477 +ENCODING 54391 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D478 +ENCODING 54392 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+D479 +ENCODING 54393 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D47A +ENCODING 54394 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D47B +ENCODING 54395 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D47C +ENCODING 54396 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D47D +ENCODING 54397 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D47E +ENCODING 54398 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D47F +ENCODING 54399 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D480 +ENCODING 54400 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D481 +ENCODING 54401 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D482 +ENCODING 54402 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D483 +ENCODING 54403 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D484 +ENCODING 54404 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D485 +ENCODING 54405 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D486 +ENCODING 54406 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D487 +ENCODING 54407 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D488 +ENCODING 54408 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D489 +ENCODING 54409 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D48A +ENCODING 54410 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D48B +ENCODING 54411 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D48C +ENCODING 54412 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D48D +ENCODING 54413 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D48E +ENCODING 54414 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D48F +ENCODING 54415 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D490 +ENCODING 54416 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D491 +ENCODING 54417 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D492 +ENCODING 54418 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D493 +ENCODING 54419 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D494 +ENCODING 54420 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +198C +198C +198C +3FCC +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+D495 +ENCODING 54421 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D496 +ENCODING 54422 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D497 +ENCODING 54423 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D498 +ENCODING 54424 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D499 +ENCODING 54425 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D49A +ENCODING 54426 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D49B +ENCODING 54427 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D49C +ENCODING 54428 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D49D +ENCODING 54429 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D49E +ENCODING 54430 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D49F +ENCODING 54431 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D4A0 +ENCODING 54432 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D4A1 +ENCODING 54433 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D4A2 +ENCODING 54434 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D4A3 +ENCODING 54435 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D4A4 +ENCODING 54436 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D4A5 +ENCODING 54437 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D4A6 +ENCODING 54438 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D4A7 +ENCODING 54439 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4A8 +ENCODING 54440 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D4A9 +ENCODING 54441 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D4AA +ENCODING 54442 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4AB +ENCODING 54443 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4AC +ENCODING 54444 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D4AD +ENCODING 54445 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D4AE +ENCODING 54446 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D4AF +ENCODING 54447 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7F9C +330C +330C +330C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D4B0 +ENCODING 54448 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +3FF6 +19B6 +19B6 +19B6 +3FF6 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D4B1 +ENCODING 54449 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D4B2 +ENCODING 54450 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D4B3 +ENCODING 54451 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D4B4 +ENCODING 54452 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +33F6 +7FB6 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D4B5 +ENCODING 54453 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D4B6 +ENCODING 54454 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D4B7 +ENCODING 54455 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D4B8 +ENCODING 54456 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D4B9 +ENCODING 54457 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D4BA +ENCODING 54458 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D4BB +ENCODING 54459 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D4BC +ENCODING 54460 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D4BD +ENCODING 54461 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D4BE +ENCODING 54462 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D4BF +ENCODING 54463 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D4C0 +ENCODING 54464 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D4C1 +ENCODING 54465 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D4C2 +ENCODING 54466 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D4C3 +ENCODING 54467 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4C4 +ENCODING 54468 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D4C5 +ENCODING 54469 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D4C6 +ENCODING 54470 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4C7 +ENCODING 54471 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4C8 +ENCODING 54472 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D4C9 +ENCODING 54473 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D4CA +ENCODING 54474 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D4CB +ENCODING 54475 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7FF6 +3336 +3336 +3336 +7FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D4CC +ENCODING 54476 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +198C +198C +198C +3FCC +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+D4CD +ENCODING 54477 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D4CE +ENCODING 54478 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D4CF +ENCODING 54479 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D4D0 +ENCODING 54480 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D4D1 +ENCODING 54481 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D4D2 +ENCODING 54482 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D4D3 +ENCODING 54483 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D4D4 +ENCODING 54484 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D4D5 +ENCODING 54485 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D4D6 +ENCODING 54486 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D4D7 +ENCODING 54487 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D4D8 +ENCODING 54488 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D4D9 +ENCODING 54489 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D4DA +ENCODING 54490 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D4DB +ENCODING 54491 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D4DC +ENCODING 54492 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D4DD +ENCODING 54493 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D4DE +ENCODING 54494 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D4DF +ENCODING 54495 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4E0 +ENCODING 54496 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D4E1 +ENCODING 54497 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D4E2 +ENCODING 54498 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4E3 +ENCODING 54499 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D4E4 +ENCODING 54500 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D4E5 +ENCODING 54501 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D4E6 +ENCODING 54502 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D4E7 +ENCODING 54503 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +7F86 +3306 +3306 +3306 +7F86 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D4E8 +ENCODING 54504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+D4E9 +ENCODING 54505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D4EA +ENCODING 54506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D4EB +ENCODING 54507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D4EC +ENCODING 54508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D4ED +ENCODING 54509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D4EE +ENCODING 54510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D4EF +ENCODING 54511 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D4F0 +ENCODING 54512 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D4F1 +ENCODING 54513 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D4F2 +ENCODING 54514 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D4F3 +ENCODING 54515 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D4F4 +ENCODING 54516 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D4F5 +ENCODING 54517 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D4F6 +ENCODING 54518 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D4F7 +ENCODING 54519 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D4F8 +ENCODING 54520 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D4F9 +ENCODING 54521 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D4FA +ENCODING 54522 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D4FB +ENCODING 54523 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D4FC +ENCODING 54524 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D4FD +ENCODING 54525 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D4FE +ENCODING 54526 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D4FF +ENCODING 54527 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D500 +ENCODING 54528 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D501 +ENCODING 54529 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D502 +ENCODING 54530 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D503 +ENCODING 54531 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D504 +ENCODING 54532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D505 +ENCODING 54533 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D506 +ENCODING 54534 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D507 +ENCODING 54535 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D508 +ENCODING 54536 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D509 +ENCODING 54537 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D50A +ENCODING 54538 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D50B +ENCODING 54539 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D50C +ENCODING 54540 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D50D +ENCODING 54541 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D50E +ENCODING 54542 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D50F +ENCODING 54543 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D510 +ENCODING 54544 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D511 +ENCODING 54545 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D512 +ENCODING 54546 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D513 +ENCODING 54547 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D514 +ENCODING 54548 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D515 +ENCODING 54549 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D516 +ENCODING 54550 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D517 +ENCODING 54551 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D518 +ENCODING 54552 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D519 +ENCODING 54553 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D51A +ENCODING 54554 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D51B +ENCODING 54555 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D51C +ENCODING 54556 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D51D +ENCODING 54557 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D51E +ENCODING 54558 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D51F +ENCODING 54559 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D520 +ENCODING 54560 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +3FCC +198C +198C +198C +3FCC +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D521 +ENCODING 54561 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D522 +ENCODING 54562 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D523 +ENCODING 54563 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D524 +ENCODING 54564 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D525 +ENCODING 54565 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D526 +ENCODING 54566 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D527 +ENCODING 54567 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D528 +ENCODING 54568 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D529 +ENCODING 54569 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D52A +ENCODING 54570 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D52B +ENCODING 54571 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D52C +ENCODING 54572 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D52D +ENCODING 54573 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D52E +ENCODING 54574 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D52F +ENCODING 54575 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D530 +ENCODING 54576 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D531 +ENCODING 54577 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D532 +ENCODING 54578 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D533 +ENCODING 54579 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D534 +ENCODING 54580 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D535 +ENCODING 54581 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D536 +ENCODING 54582 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D537 +ENCODING 54583 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D538 +ENCODING 54584 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D539 +ENCODING 54585 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D53A +ENCODING 54586 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D53B +ENCODING 54587 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7F8C +330C +330C +330C +7F8C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D53C +ENCODING 54588 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +000C +FFCC +330C +330C +330C +330C +330C +FFCC +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D53D +ENCODING 54589 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D53E +ENCODING 54590 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D53F +ENCODING 54591 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D540 +ENCODING 54592 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D541 +ENCODING 54593 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D542 +ENCODING 54594 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D543 +ENCODING 54595 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D544 +ENCODING 54596 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D545 +ENCODING 54597 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D546 +ENCODING 54598 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D547 +ENCODING 54599 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D548 +ENCODING 54600 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D549 +ENCODING 54601 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D54A +ENCODING 54602 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D54B +ENCODING 54603 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D54C +ENCODING 54604 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D54D +ENCODING 54605 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D54E +ENCODING 54606 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D54F +ENCODING 54607 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D550 +ENCODING 54608 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D551 +ENCODING 54609 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D552 +ENCODING 54610 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D553 +ENCODING 54611 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D554 +ENCODING 54612 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D555 +ENCODING 54613 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D556 +ENCODING 54614 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D557 +ENCODING 54615 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +7FCC +330C +330C +330C +330C +7FCC +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D558 +ENCODING 54616 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +7FD8 +0018 +1F18 +319F +3198 +3198 +1F18 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D559 +ENCODING 54617 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D55A +ENCODING 54618 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D55B +ENCODING 54619 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D55C +ENCODING 54620 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D55D +ENCODING 54621 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D55E +ENCODING 54622 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D55F +ENCODING 54623 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D560 +ENCODING 54624 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D561 +ENCODING 54625 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D562 +ENCODING 54626 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D563 +ENCODING 54627 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D564 +ENCODING 54628 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D565 +ENCODING 54629 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D566 +ENCODING 54630 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D567 +ENCODING 54631 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D568 +ENCODING 54632 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D569 +ENCODING 54633 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D56A +ENCODING 54634 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D56B +ENCODING 54635 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D56C +ENCODING 54636 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D56D +ENCODING 54637 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D56E +ENCODING 54638 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D56F +ENCODING 54639 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D570 +ENCODING 54640 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D571 +ENCODING 54641 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D572 +ENCODING 54642 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D573 +ENCODING 54643 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +3318 +331F +3318 +1E18 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D574 +ENCODING 54644 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +7FF6 +0036 +1F36 +31BE +31B6 +31B6 +1F36 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D575 +ENCODING 54645 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D576 +ENCODING 54646 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D577 +ENCODING 54647 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D578 +ENCODING 54648 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D579 +ENCODING 54649 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D57A +ENCODING 54650 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D57B +ENCODING 54651 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D57C +ENCODING 54652 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D57D +ENCODING 54653 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D57E +ENCODING 54654 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D57F +ENCODING 54655 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D580 +ENCODING 54656 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D581 +ENCODING 54657 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D582 +ENCODING 54658 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D583 +ENCODING 54659 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D584 +ENCODING 54660 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D585 +ENCODING 54661 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D586 +ENCODING 54662 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D587 +ENCODING 54663 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D588 +ENCODING 54664 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D589 +ENCODING 54665 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D58A +ENCODING 54666 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D58B +ENCODING 54667 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D58C +ENCODING 54668 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D58D +ENCODING 54669 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D58E +ENCODING 54670 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D58F +ENCODING 54671 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +333E +3336 +1E36 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D590 +ENCODING 54672 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0038 +0E18 +7FD8 +0018 +1F1F +3198 +3198 +319F +1F18 +0018 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D591 +ENCODING 54673 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D592 +ENCODING 54674 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D593 +ENCODING 54675 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D594 +ENCODING 54676 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D595 +ENCODING 54677 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D596 +ENCODING 54678 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D597 +ENCODING 54679 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D598 +ENCODING 54680 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D599 +ENCODING 54681 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D59A +ENCODING 54682 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D59B +ENCODING 54683 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D59C +ENCODING 54684 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D59D +ENCODING 54685 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D59E +ENCODING 54686 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D59F +ENCODING 54687 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D5A0 +ENCODING 54688 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D5A1 +ENCODING 54689 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D5A2 +ENCODING 54690 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D5A3 +ENCODING 54691 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D5A4 +ENCODING 54692 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D5A5 +ENCODING 54693 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D5A6 +ENCODING 54694 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D5A7 +ENCODING 54695 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D5A8 +ENCODING 54696 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D5A9 +ENCODING 54697 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D5AA +ENCODING 54698 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D5AB +ENCODING 54699 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C38 +7F98 +1E18 +331F +3318 +331F +1E18 +0018 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D5AC +ENCODING 54700 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +7FF6 +0036 +1F3E +31B6 +31B6 +31BE +1F36 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D5AD +ENCODING 54701 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D5AE +ENCODING 54702 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D5AF +ENCODING 54703 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D5B0 +ENCODING 54704 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D5B1 +ENCODING 54705 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D5B2 +ENCODING 54706 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D5B3 +ENCODING 54707 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D5B4 +ENCODING 54708 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D5B5 +ENCODING 54709 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D5B6 +ENCODING 54710 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D5B7 +ENCODING 54711 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D5B8 +ENCODING 54712 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D5B9 +ENCODING 54713 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D5BA +ENCODING 54714 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D5BB +ENCODING 54715 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D5BC +ENCODING 54716 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D5BD +ENCODING 54717 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D5BE +ENCODING 54718 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D5BF +ENCODING 54719 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D5C0 +ENCODING 54720 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D5C1 +ENCODING 54721 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D5C2 +ENCODING 54722 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D5C3 +ENCODING 54723 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D5C4 +ENCODING 54724 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D5C5 +ENCODING 54725 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D5C6 +ENCODING 54726 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D5C7 +ENCODING 54727 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +333E +3336 +333E +1E36 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D5C8 +ENCODING 54728 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +7FCC +000C +1F0C +31FC +318C +318C +1F0C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D5C9 +ENCODING 54729 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D5CA +ENCODING 54730 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D5CB +ENCODING 54731 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D5CC +ENCODING 54732 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +337C +330C +1E0C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D5CD +ENCODING 54733 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D5CE +ENCODING 54734 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D5CF +ENCODING 54735 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D5D0 +ENCODING 54736 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D5D1 +ENCODING 54737 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D5D2 +ENCODING 54738 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D5D3 +ENCODING 54739 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D5D4 +ENCODING 54740 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D5D5 +ENCODING 54741 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D5D6 +ENCODING 54742 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D5D7 +ENCODING 54743 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D5D8 +ENCODING 54744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D5D9 +ENCODING 54745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D5DA +ENCODING 54746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D5DB +ENCODING 54747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D5DC +ENCODING 54748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D5DD +ENCODING 54749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D5DE +ENCODING 54750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D5DF +ENCODING 54751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D5E0 +ENCODING 54752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D5E1 +ENCODING 54753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D5E2 +ENCODING 54754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D5E3 +ENCODING 54755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +33FC +330C +1E0C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D5E4 +ENCODING 54756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +7FF6 +0036 +1F36 +31F6 +31B6 +31B6 +1F36 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D5E5 +ENCODING 54757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D5E6 +ENCODING 54758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D5E7 +ENCODING 54759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D5E8 +ENCODING 54760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +3376 +3336 +1E36 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D5E9 +ENCODING 54761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D5EA +ENCODING 54762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D5EB +ENCODING 54763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D5EC +ENCODING 54764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D5ED +ENCODING 54765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D5EE +ENCODING 54766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D5EF +ENCODING 54767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D5F0 +ENCODING 54768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D5F1 +ENCODING 54769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D5F2 +ENCODING 54770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D5F3 +ENCODING 54771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D5F4 +ENCODING 54772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D5F5 +ENCODING 54773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D5F6 +ENCODING 54774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D5F7 +ENCODING 54775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D5F8 +ENCODING 54776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D5F9 +ENCODING 54777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D5FA +ENCODING 54778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D5FB +ENCODING 54779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D5FC +ENCODING 54780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D5FD +ENCODING 54781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D5FE +ENCODING 54782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D5FF +ENCODING 54783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3336 +33F6 +3336 +1E36 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D600 +ENCODING 54784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +7FCC +000C +1F7C +318C +31FC +318C +1F0C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D601 +ENCODING 54785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D602 +ENCODING 54786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D603 +ENCODING 54787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D604 +ENCODING 54788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D605 +ENCODING 54789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D606 +ENCODING 54790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D607 +ENCODING 54791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D608 +ENCODING 54792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D609 +ENCODING 54793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D60A +ENCODING 54794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D60B +ENCODING 54795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D60C +ENCODING 54796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D60D +ENCODING 54797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D60E +ENCODING 54798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D60F +ENCODING 54799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D610 +ENCODING 54800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D611 +ENCODING 54801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D612 +ENCODING 54802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D613 +ENCODING 54803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D614 +ENCODING 54804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D615 +ENCODING 54805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D616 +ENCODING 54806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D617 +ENCODING 54807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D618 +ENCODING 54808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D619 +ENCODING 54809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D61A +ENCODING 54810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D61B +ENCODING 54811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +337C +330C +337C +1E0C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D61C +ENCODING 54812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +000E +0E76 +7FF6 +0036 +1F76 +31B6 +31F6 +31B6 +1F36 +0036 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D61D +ENCODING 54813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +07FE +0006 +0006 +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D61E +ENCODING 54814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0FFE +00C6 +00C6 +00C6 +0084 +0000 +ENDCHAR +STARTCHAR U+D61F +ENCODING 54815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0FCC +00CC +00CE +00DB +00B3 +0000 +ENDCHAR +STARTCHAR U+D620 +ENCODING 54816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +3376 +3336 +3376 +1E36 +0036 +0024 +0700 +0300 +0300 +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D621 +ENCODING 54817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +1C7E +0C18 +0C18 +0C3C +0766 +0000 +ENDCHAR +STARTCHAR U+D622 +ENCODING 54818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +1C18 +0C7E +0C3C +0C66 +07BC +0000 +ENDCHAR +STARTCHAR U+D623 +ENCODING 54819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D624 +ENCODING 54820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +03FE +0006 +03FE +0300 +01FE +0000 +ENDCHAR +STARTCHAR U+D625 +ENCODING 54821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +07DE +00C6 +07C6 +0606 +03C4 +0000 +ENDCHAR +STARTCHAR U+D626 +ENCODING 54822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0FBE +01B6 +0FB6 +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D627 +ENCODING 54823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0FB6 +01B6 +0FBE +0C36 +07BE +0000 +ENDCHAR +STARTCHAR U+D628 +ENCODING 54824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +07CC +00CC +07CC +061E +03D3 +0000 +ENDCHAR +STARTCHAR U+D629 +ENCODING 54825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0FBE +01B0 +0FBE +0C30 +07BE +0000 +ENDCHAR +STARTCHAR U+D62A +ENCODING 54826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D62B +ENCODING 54827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D62C +ENCODING 54828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +07FE +0306 +0306 +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D62D +ENCODING 54829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +070E +0306 +03FE +0306 +03FE +0000 +ENDCHAR +STARTCHAR U+D62E +ENCODING 54830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D62F +ENCODING 54831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0060 +0060 +00D8 +018C +0606 +0000 +ENDCHAR +STARTCHAR U+D630 +ENCODING 54832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D631 +ENCODING 54833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +00FC +0186 +0186 +0186 +00FC +0000 +ENDCHAR +STARTCHAR U+D632 +ENCODING 54834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +07FE +0060 +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D633 +ENCODING 54835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +0060 +07FE +00F0 +0198 +0606 +0000 +ENDCHAR +STARTCHAR U+D634 +ENCODING 54836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +03FE +0006 +03FE +0006 +0004 +0000 +ENDCHAR +STARTCHAR U+D635 +ENCODING 54837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +03FE +0180 +01FE +0180 +00FE +0000 +ENDCHAR +STARTCHAR U+D636 +ENCODING 54838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +07FE +0198 +0198 +0198 +07FE +0000 +ENDCHAR +STARTCHAR U+D637 +ENCODING 54839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C0E +7FF6 +1E36 +33F6 +3336 +33F6 +1E36 +0036 +0024 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D638 +ENCODING 54840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +0180 +0180 +0180 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D639 +ENCODING 54841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D63A +ENCODING 54842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D63B +ENCODING 54843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D63C +ENCODING 54844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D63D +ENCODING 54845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D63E +ENCODING 54846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D63F +ENCODING 54847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D640 +ENCODING 54848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D641 +ENCODING 54849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D642 +ENCODING 54850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D643 +ENCODING 54851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D644 +ENCODING 54852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D645 +ENCODING 54853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D646 +ENCODING 54854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D647 +ENCODING 54855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D648 +ENCODING 54856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D649 +ENCODING 54857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D64A +ENCODING 54858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D64B +ENCODING 54859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D64C +ENCODING 54860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D64D +ENCODING 54861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D64E +ENCODING 54862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D64F +ENCODING 54863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D650 +ENCODING 54864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D651 +ENCODING 54865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D652 +ENCODING 54866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D653 +ENCODING 54867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0180 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D654 +ENCODING 54868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +3198 +1F18 +001F +0C18 +0C18 +7FD8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D655 +ENCODING 54869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D656 +ENCODING 54870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D657 +ENCODING 54871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D658 +ENCODING 54872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D659 +ENCODING 54873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D65A +ENCODING 54874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D65B +ENCODING 54875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D65C +ENCODING 54876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D65D +ENCODING 54877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D65E +ENCODING 54878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D65F +ENCODING 54879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D660 +ENCODING 54880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D661 +ENCODING 54881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D662 +ENCODING 54882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D663 +ENCODING 54883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D664 +ENCODING 54884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D665 +ENCODING 54885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D666 +ENCODING 54886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D667 +ENCODING 54887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D668 +ENCODING 54888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D669 +ENCODING 54889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D66A +ENCODING 54890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D66B +ENCODING 54891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D66C +ENCODING 54892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D66D +ENCODING 54893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D66E +ENCODING 54894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D66F +ENCODING 54895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E38 +7FD8 +1F18 +3198 +319F +1F18 +0C18 +7FD8 +0010 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D670 +ENCODING 54896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1F3E +0036 +0C36 +0C36 +7FB6 +0036 +0036 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D671 +ENCODING 54897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D672 +ENCODING 54898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D673 +ENCODING 54899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D674 +ENCODING 54900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D675 +ENCODING 54901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D676 +ENCODING 54902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D677 +ENCODING 54903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D678 +ENCODING 54904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D679 +ENCODING 54905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D67A +ENCODING 54906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D67B +ENCODING 54907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D67C +ENCODING 54908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D67D +ENCODING 54909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D67E +ENCODING 54910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D67F +ENCODING 54911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D680 +ENCODING 54912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D681 +ENCODING 54913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D682 +ENCODING 54914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D683 +ENCODING 54915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D684 +ENCODING 54916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D685 +ENCODING 54917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D686 +ENCODING 54918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D687 +ENCODING 54919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D688 +ENCODING 54920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D689 +ENCODING 54921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D68A +ENCODING 54922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D68B +ENCODING 54923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31BE +1F36 +0C36 +7FA6 +0004 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D68C +ENCODING 54924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +0C0C +0C0C +7FEC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D68D +ENCODING 54925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D68E +ENCODING 54926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D68F +ENCODING 54927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D690 +ENCODING 54928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D691 +ENCODING 54929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D692 +ENCODING 54930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D693 +ENCODING 54931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D694 +ENCODING 54932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D695 +ENCODING 54933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D696 +ENCODING 54934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D697 +ENCODING 54935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D698 +ENCODING 54936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D699 +ENCODING 54937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D69A +ENCODING 54938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D69B +ENCODING 54939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D69C +ENCODING 54940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D69D +ENCODING 54941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D69E +ENCODING 54942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D69F +ENCODING 54943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D6A0 +ENCODING 54944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D6A1 +ENCODING 54945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D6A2 +ENCODING 54946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D6A3 +ENCODING 54947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D6A4 +ENCODING 54948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D6A5 +ENCODING 54949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D6A6 +ENCODING 54950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D6A7 +ENCODING 54951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +0C0C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D6A8 +ENCODING 54952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +0660 +0660 +0660 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D6A9 +ENCODING 54953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D6AA +ENCODING 54954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D6AB +ENCODING 54955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D6AC +ENCODING 54956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D6AD +ENCODING 54957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D6AE +ENCODING 54958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D6AF +ENCODING 54959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D6B0 +ENCODING 54960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D6B1 +ENCODING 54961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D6B2 +ENCODING 54962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D6B3 +ENCODING 54963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D6B4 +ENCODING 54964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D6B5 +ENCODING 54965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D6B6 +ENCODING 54966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D6B7 +ENCODING 54967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D6B8 +ENCODING 54968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D6B9 +ENCODING 54969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D6BA +ENCODING 54970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D6BB +ENCODING 54971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D6BC +ENCODING 54972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D6BD +ENCODING 54973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D6BE +ENCODING 54974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D6BF +ENCODING 54975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D6C0 +ENCODING 54976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D6C1 +ENCODING 54977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D6C2 +ENCODING 54978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D6C3 +ENCODING 54979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0660 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D6C4 +ENCODING 54980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0180 +0180 +0180 +0180 +0180 +0100 +0000 +ENDCHAR +STARTCHAR U+D6C5 +ENCODING 54981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D6C6 +ENCODING 54982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D6C7 +ENCODING 54983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D6C8 +ENCODING 54984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0180 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D6C9 +ENCODING 54985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D6CA +ENCODING 54986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D6CB +ENCODING 54987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D6CC +ENCODING 54988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D6CD +ENCODING 54989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D6CE +ENCODING 54990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D6CF +ENCODING 54991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D6D0 +ENCODING 54992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D6D1 +ENCODING 54993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D6D2 +ENCODING 54994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D6D3 +ENCODING 54995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D6D4 +ENCODING 54996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D6D5 +ENCODING 54997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D6D6 +ENCODING 54998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D6D7 +ENCODING 54999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D6D8 +ENCODING 55000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D6D9 +ENCODING 55001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D6DA +ENCODING 55002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D6DB +ENCODING 55003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D6DC +ENCODING 55004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D6DD +ENCODING 55005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D6DE +ENCODING 55006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D6DF +ENCODING 55007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +7FFE +0180 +0100 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D6E0 +ENCODING 55008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +060C +067C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+D6E1 +ENCODING 55009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D6E2 +ENCODING 55010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D6E3 +ENCODING 55011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D6E4 +ENCODING 55012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +061E +0606 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D6E5 +ENCODING 55013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D6E6 +ENCODING 55014 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D6E7 +ENCODING 55015 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D6E8 +ENCODING 55016 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D6E9 +ENCODING 55017 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D6EA +ENCODING 55018 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D6EB +ENCODING 55019 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D6EC +ENCODING 55020 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D6ED +ENCODING 55021 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D6EE +ENCODING 55022 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D6EF +ENCODING 55023 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D6F0 +ENCODING 55024 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D6F1 +ENCODING 55025 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D6F2 +ENCODING 55026 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D6F3 +ENCODING 55027 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +04C8 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D6F4 +ENCODING 55028 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0598 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D6F5 +ENCODING 55029 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +05F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D6F6 +ENCODING 55030 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D6F7 +ENCODING 55031 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +04C8 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D6F8 +ENCODING 55032 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +07FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D6F9 +ENCODING 55033 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D6FA +ENCODING 55034 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D6FB +ENCODING 55035 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E00 +7FDC +1F0C +318C +318C +7FEC +060C +067C +060C +04F8 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D6FC +ENCODING 55036 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1F36 +0036 +7FB6 +0C36 +0DF6 +0C36 +1836 +0026 +0004 +0000 +ENDCHAR +STARTCHAR U+D6FD +ENCODING 55037 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D6FE +ENCODING 55038 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D6FF +ENCODING 55039 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D700 +ENCODING 55040 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31F6 +1F36 +7FB6 +0C36 +0824 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D701 +ENCODING 55041 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D702 +ENCODING 55042 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0E3C +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D703 +ENCODING 55043 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D704 +ENCODING 55044 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D705 +ENCODING 55045 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D706 +ENCODING 55046 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D707 +ENCODING 55047 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D708 +ENCODING 55048 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FBC +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D709 +ENCODING 55049 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D70A +ENCODING 55050 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D70B +ENCODING 55051 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +1F3C +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D70C +ENCODING 55052 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D70D +ENCODING 55053 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0F3C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D70E +ENCODING 55054 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0DBC +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D70F +ENCODING 55055 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +08E4 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D710 +ENCODING 55056 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +09BC +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D711 +ENCODING 55057 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +09FC +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D712 +ENCODING 55058 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D713 +ENCODING 55059 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +08E4 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D714 +ENCODING 55060 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0BFC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D715 +ENCODING 55061 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D716 +ENCODING 55062 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D717 +ENCODING 55063 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FF6 +1F36 +31B6 +31B6 +1FF6 +0036 +7FB6 +0C36 +08F4 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D718 +ENCODING 55064 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +060C +060C +060C +060C +040C +0008 +0000 +ENDCHAR +STARTCHAR U+D719 +ENCODING 55065 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D71A +ENCODING 55066 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D71B +ENCODING 55067 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D71C +ENCODING 55068 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D71D +ENCODING 55069 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D71E +ENCODING 55070 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D71F +ENCODING 55071 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D720 +ENCODING 55072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D721 +ENCODING 55073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D722 +ENCODING 55074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D723 +ENCODING 55075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D724 +ENCODING 55076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D725 +ENCODING 55077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D726 +ENCODING 55078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D727 +ENCODING 55079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D728 +ENCODING 55080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D729 +ENCODING 55081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D72A +ENCODING 55082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D72B +ENCODING 55083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D72C +ENCODING 55084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D72D +ENCODING 55085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D72E +ENCODING 55086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D72F +ENCODING 55087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D730 +ENCODING 55088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D731 +ENCODING 55089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D732 +ENCODING 55090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D733 +ENCODING 55091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E0E +7FC6 +1F06 +3186 +3186 +1F06 +3FE6 +0606 +0604 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D734 +ENCODING 55092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0660 +0660 +0660 +0660 +0440 +0000 +ENDCHAR +STARTCHAR U+D735 +ENCODING 55093 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D736 +ENCODING 55094 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D737 +ENCODING 55095 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D738 +ENCODING 55096 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D739 +ENCODING 55097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D73A +ENCODING 55098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D73B +ENCODING 55099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D73C +ENCODING 55100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D73D +ENCODING 55101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D73E +ENCODING 55102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D73F +ENCODING 55103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D740 +ENCODING 55104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D741 +ENCODING 55105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D742 +ENCODING 55106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D743 +ENCODING 55107 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D744 +ENCODING 55108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D745 +ENCODING 55109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D746 +ENCODING 55110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D747 +ENCODING 55111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D748 +ENCODING 55112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D749 +ENCODING 55113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D74A +ENCODING 55114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D74B +ENCODING 55115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D74C +ENCODING 55116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D74D +ENCODING 55117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D74E +ENCODING 55118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D74F +ENCODING 55119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0660 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D750 +ENCODING 55120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +0000 +0000 +0000 +7FFE +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+D751 +ENCODING 55121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D752 +ENCODING 55122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3EF8 +0618 +0618 +0618 +0410 +0000 +ENDCHAR +STARTCHAR U+D753 +ENCODING 55123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D754 +ENCODING 55124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3800 +1800 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D755 +ENCODING 55125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +38FC +1830 +1830 +1878 +0ECC +0000 +ENDCHAR +STARTCHAR U+D756 +ENCODING 55126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3830 +18FC +1878 +18CC +0F78 +0000 +ENDCHAR +STARTCHAR U+D757 +ENCODING 55127 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +0000 +3FF8 +1800 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D758 +ENCODING 55128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +1800 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D759 +ENCODING 55129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F7C +030C +1F0C +180C +0F08 +0000 +ENDCHAR +STARTCHAR U+D75A +ENCODING 55130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3EFC +06CC +3ECC +30CC +1EFC +0000 +ENDCHAR +STARTCHAR U+D75B +ENCODING 55131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D75C +ENCODING 55132 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F18 +0318 +1F18 +183C +0F66 +0000 +ENDCHAR +STARTCHAR U+D75D +ENCODING 55133 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D75E +ENCODING 55134 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D75F +ENCODING 55135 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3E30 +06FC +3E78 +30CC +1E78 +0000 +ENDCHAR +STARTCHAR U+D760 +ENCODING 55136 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0C18 +0C18 +0C18 +0FF8 +0000 +ENDCHAR +STARTCHAR U+D761 +ENCODING 55137 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +3838 +1818 +1FF8 +1818 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D762 +ENCODING 55138 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1B30 +1B30 +1F30 +1B7C +1FCC +0000 +ENDCHAR +STARTCHAR U+D763 +ENCODING 55139 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +0180 +0180 +0360 +0630 +1818 +0000 +ENDCHAR +STARTCHAR U+D764 +ENCODING 55140 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +0C30 +0C30 +1E78 +33CC +6186 +0000 +ENDCHAR +STARTCHAR U+D765 +ENCODING 55141 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +07E0 +0C30 +0C30 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D766 +ENCODING 55142 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0180 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D767 +ENCODING 55143 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +0180 +1FF8 +03C0 +0660 +1818 +0000 +ENDCHAR +STARTCHAR U+D768 +ENCODING 55144 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0018 +1FF8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D769 +ENCODING 55145 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0C00 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D76A +ENCODING 55146 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +1FF8 +0660 +0660 +0660 +1FF8 +0000 +ENDCHAR +STARTCHAR U+D76B +ENCODING 55147 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03C0 +1FF8 +07E0 +0C30 +0C30 +07E0 +0000 +7FFE +0000 +03C0 +1FF8 +07E0 +0C30 +07E0 +0000 +ENDCHAR +STARTCHAR U+D76C +ENCODING 55148 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +000C +00EC +7F0C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D76D +ENCODING 55149 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0018 +0018 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D76E +ENCODING 55150 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1FF8 +0318 +0318 +0318 +0210 +0000 +ENDCHAR +STARTCHAR U+D76F +ENCODING 55151 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1F30 +0330 +0338 +036C +02CC +0000 +ENDCHAR +STARTCHAR U+D770 +ENCODING 55152 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D771 +ENCODING 55153 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1CFC +0C30 +0C30 +0C78 +07CC +0000 +ENDCHAR +STARTCHAR U+D772 +ENCODING 55154 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1C30 +0CFC +0C78 +0CCC +0778 +0000 +ENDCHAR +STARTCHAR U+D773 +ENCODING 55155 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0600 +0600 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D774 +ENCODING 55156 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0018 +0FF8 +0C00 +07F8 +0000 +ENDCHAR +STARTCHAR U+D775 +ENCODING 55157 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1F78 +0318 +1F18 +1818 +0F10 +0000 +ENDCHAR +STARTCHAR U+D776 +ENCODING 55158 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D777 +ENCODING 55159 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D778 +ENCODING 55160 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D779 +ENCODING 55161 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D77A +ENCODING 55162 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D77B +ENCODING 55163 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D77C +ENCODING 55164 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0618 +0618 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D77D +ENCODING 55165 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0E38 +0618 +07F8 +0618 +07F8 +0000 +ENDCHAR +STARTCHAR U+D77E +ENCODING 55166 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D77F +ENCODING 55167 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D780 +ENCODING 55168 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0330 +0330 +07F8 +0CCC +1986 +0000 +ENDCHAR +STARTCHAR U+D781 +ENCODING 55169 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +03F0 +0618 +0618 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D782 +ENCODING 55170 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D783 +ENCODING 55171 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D784 +ENCODING 55172 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +07F8 +0018 +07F8 +0018 +0010 +0000 +ENDCHAR +STARTCHAR U+D785 +ENCODING 55173 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0FF8 +0600 +07F8 +0600 +03F8 +0000 +ENDCHAR +STARTCHAR U+D786 +ENCODING 55174 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D787 +ENCODING 55175 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0E1C +7FCC +1F0C +318C +318C +1F0C +000C +7FEC +0008 +01E0 +0FFC +03F0 +0618 +03F0 +0000 +ENDCHAR +STARTCHAR U+D788 +ENCODING 55176 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +001C +0E0C +7FCC +000C +1F0C +318C +318C +318C +1F0C +000C +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D789 +ENCODING 55177 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +07FC +000C +000C +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D78A +ENCODING 55178 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0FFC +018C +018C +018C +0108 +0000 +ENDCHAR +STARTCHAR U+D78B +ENCODING 55179 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0F98 +0198 +019C +01B6 +0166 +0000 +ENDCHAR +STARTCHAR U+D78C +ENCODING 55180 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0700 +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D78D +ENCODING 55181 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0E7E +0618 +0618 +063C +03E6 +0000 +ENDCHAR +STARTCHAR U+D78E +ENCODING 55182 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0E18 +067E +063C +0666 +03BC +0000 +ENDCHAR +STARTCHAR U+D78F +ENCODING 55183 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +07FC +0300 +0300 +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D790 +ENCODING 55184 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +07FC +000C +07FC +0600 +03FC +0000 +ENDCHAR +STARTCHAR U+D791 +ENCODING 55185 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0FBC +018C +0F8C +0C0C +0788 +0000 +ENDCHAR +STARTCHAR U+D792 +ENCODING 55186 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +1F7C +036C +1F6C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D793 +ENCODING 55187 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +1F6C +036C +1F7C +186C +0F7C +0000 +ENDCHAR +STARTCHAR U+D794 +ENCODING 55188 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0F98 +0198 +0F98 +0C3C +07A6 +0000 +ENDCHAR +STARTCHAR U+D795 +ENCODING 55189 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +1F7C +0360 +1F7C +1860 +0F7C +0000 +ENDCHAR +STARTCHAR U+D796 +ENCODING 55190 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +1EFE +036C +1F6C +186C +0EFE +0000 +ENDCHAR +STARTCHAR U+D797 +ENCODING 55191 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +1F18 +037E +1F3C +1866 +0F3C +0000 +ENDCHAR +STARTCHAR U+D798 +ENCODING 55192 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +07FC +030C +030C +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D799 +ENCODING 55193 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +071C +030C +03FC +030C +03FC +0000 +ENDCHAR +STARTCHAR U+D79A +ENCODING 55194 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0D98 +0D98 +0F98 +0DBE +0FE6 +0000 +ENDCHAR +STARTCHAR U+D79B +ENCODING 55195 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +00C0 +00C0 +01B0 +0318 +0C0C +0000 +ENDCHAR +STARTCHAR U+D79C +ENCODING 55196 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0198 +0198 +03FC +0666 +0CC3 +0000 +ENDCHAR +STARTCHAR U+D79D +ENCODING 55197 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +01F8 +030C +030C +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+D79E +ENCODING 55198 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0FFC +00C0 +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D79F +ENCODING 55199 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +00C0 +0FFC +01E0 +0330 +0C0C +0000 +ENDCHAR +STARTCHAR U+D7A0 +ENCODING 55200 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +03FC +000C +03FC +000C +0008 +0000 +ENDCHAR +STARTCHAR U+D7A1 +ENCODING 55201 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +07FC +0300 +03FC +0300 +01FC +0000 +ENDCHAR +STARTCHAR U+D7A2 +ENCODING 55202 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +0FFC +0330 +0330 +0330 +0FFC +0000 +ENDCHAR +STARTCHAR U+D7A3 +ENCODING 55203 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C1C +7F8C +1E0C +330C +330C +330C +1E0C +000C +0008 +00F0 +07FE +01F8 +030C +01F8 +0000 +ENDCHAR +STARTCHAR U+F900 +ENCODING 63744 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +0000 +7FFF +0000 +1FFC +1004 +1004 +1FFC +0800 +0410 +0410 +7FFF +0000 +ENDCHAR +STARTCHAR U+F901 +ENCODING 63745 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +0080 +1FFC +1084 +1084 +1FFC +1084 +1084 +1FFC +1100 +0900 +0600 +0580 +187F +6000 +ENDCHAR +STARTCHAR U+F902 +ENCODING 63746 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0080 +1FFC +1084 +1084 +1FFC +1084 +1084 +1FFC +0080 +7FFF +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+F903 +ENCODING 63747 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +0220 +3FFE +2222 +3FFE +0000 +1FFC +1004 +1FFC +1004 +1FFC +1004 +1FFC +0808 +1004 +ENDCHAR +STARTCHAR U+F904 +ENCODING 63748 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +13FC +0204 +027C +4244 +2FFF +0801 +03FC +1204 +13FC +1204 +23FC +2204 +2204 +4204 +421C +ENDCHAR +STARTCHAR U+F905 +ENCODING 63749 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +1FFC +1084 +1084 +1FFC +0080 +0080 +3FFE +2082 +2082 +2082 +3FFE +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+F906 +ENCODING 63750 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0400 +0800 +1FFE +2002 +4002 +0002 +0FE2 +0822 +0822 +0FE2 +0822 +0002 +0004 +0008 +0070 +ENDCHAR +STARTCHAR U+F907 +ENCODING 63751 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0FE0 +1040 +3FFC +6284 +3EFC +7A80 +0AFE +7FC6 +0AAA +7ABA +0AC6 +7EFE +0A80 +7A81 +03FF +ENDCHAR +STARTCHAR U+F908 +ENCODING 63752 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0FE0 +1040 +3FFC +6284 +3EFC +7A80 +0AFE +7FC6 +0AAA +7ABA +0AC6 +7EFE +0A80 +7A81 +03FF +ENDCHAR +STARTCHAR U+F909 +ENCODING 63753 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +7F7E +0812 +7F22 +0822 +1F42 +688C +0980 +0080 +7FFF +0140 +0220 +0410 +180C +6003 +ENDCHAR +STARTCHAR U+F90A +ENCODING 63754 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0140 +0220 +0410 +180C +6003 +0FF8 +0080 +0080 +3FFE +0080 +1084 +0888 +0490 +7FFF +0000 +ENDCHAR +STARTCHAR U+F90B +ENCODING 63755 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0102 +0102 +710A +5FEA +510A +57CA +554A +554A +554A +57CA +710A +538A +054A +0922 +1102 +2106 +ENDCHAR +STARTCHAR U+F90C +ENCODING 63756 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0080 +7FFF +0220 +0410 +180C +6FFB +0000 +0000 +3FFE +0080 +0888 +1084 +2082 +0380 +ENDCHAR +STARTCHAR U+F90D +ENCODING 63757 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +109F +1485 +17E9 +548B +53F0 +52AF +12A9 +12AF +13E9 +118F +11C9 +12AF +1280 +148A +1091 +ENDCHAR +STARTCHAR U+F90E +ENCODING 63758 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +113E +57CA +3112 +17EC +155E +3552 +57DE +1112 +139E +2352 +251E +290A +4111 +ENDCHAR +STARTCHAR U+F90F +ENCODING 63759 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +2222 +3FFE +0000 +0824 +0A48 +32FF +1D48 +087F +7F48 +097F +2A48 +2A48 +2A7F +0840 +ENDCHAR +STARTCHAR U+F910 +ENCODING 63760 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7FFF +0220 +3FFE +2222 +3FFE +1048 +1490 +65FE +3A90 +12FE +7F90 +10FE +5490 +54FF +1080 +ENDCHAR +STARTCHAR U+F911 +ENCODING 63761 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1111 +7DFF +5511 +55FF +5424 +5524 +7CC8 +1052 +13FF +1011 +1454 +1E92 +6311 +0010 +ENDCHAR +STARTCHAR U+F912 +ENCODING 63762 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1092 +7C92 +04FE +0892 +0A92 +14FE +3810 +59FF +1410 +1038 +1054 +1094 +1112 +1211 +ENDCHAR +STARTCHAR U+F913 +ENCODING 63763 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FE +0492 +07FE +4214 +22A8 +0D7E +06A8 +627E +3FE8 +223E +2AA8 +2ABE +3220 +4FFE +0000 +ENDCHAR +STARTCHAR U+F914 +ENCODING 63764 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1088 +1108 +23D2 +6A72 +1BCC +1249 +2FD7 +7439 +0080 +0080 +7FFF +01C0 +02A0 +0490 +188C +6083 +ENDCHAR +STARTCHAR U+F915 +ENCODING 63765 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4040 +2040 +00FF +0082 +4144 +2228 +0410 +102C +1043 +1180 +2EFE +2082 +2082 +2082 +40FE +4082 +ENDCHAR +STARTCHAR U+F916 +ENCODING 63766 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +107F +1242 +54A4 +5918 +5218 +1024 +1043 +1180 +16FE +1082 +2882 +2882 +24FE +4082 +ENDCHAR +STARTCHAR U+F917 +ENCODING 63767 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7CFE +1084 +1148 +1128 +1210 +7C2C +1043 +1180 +16FE +1082 +1C82 +7082 +00FE +0082 +ENDCHAR +STARTCHAR U+F918 +ENCODING 63768 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +7FFF +0210 +2020 +1020 +007E +4084 +2148 +0A30 +0C68 +1187 +17FC +2104 +2104 +41FC +4104 +ENDCHAR +STARTCHAR U+F919 +ENCODING 63769 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7F20 +147F +1442 +14A4 +7F18 +5518 +5524 +6742 +4181 +417E +7F42 +4142 +4142 +7F7E +4142 +ENDCHAR +STARTCHAR U+F91A +ENCODING 63770 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7C20 +507F +5042 +7CA4 +5118 +5018 +7C24 +5043 +5180 +7E7E +4A42 +1642 +2A42 +447E +5842 +ENDCHAR +STARTCHAR U+F91B +ENCODING 63771 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0720 +7820 +0920 +24A0 +1020 +7FA0 +1120 +0A20 +7FA0 +44A0 +48A0 +52A0 +7EA1 +41A1 +40A1 +41BF +ENDCHAR +STARTCHAR U+F91C +ENCODING 63772 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0700 +383F +2021 +2121 +2121 +2929 +2525 +2121 +2121 +2121 +2F21 +7221 +0226 +0420 +0820 +3020 +ENDCHAR +STARTCHAR U+F91D +ENCODING 63773 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11EF +1129 +15EF +5529 +55EF +5111 +11FF +1111 +117D +1155 +117D +1139 +1155 +1193 +1113 +ENDCHAR +STARTCHAR U+F91E +ENCODING 63774 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11EF +1129 +15EF +1529 +55EF +5111 +51FF +1111 +117D +1155 +297D +2939 +2555 +4593 +4113 +ENDCHAR +STARTCHAR U+F91F +ENCODING 63775 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7FFF +0220 +3E3E +3E3E +2222 +3EBE +2082 +3FFE +2082 +27F2 +2492 +27F2 +21C2 +22BA +2C8E +ENDCHAR +STARTCHAR U+F920 +ENCODING 63776 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11C8 +1408 +65F2 +2812 +13EC +7E3F +55D5 +55D5 +3FFE +2080 +3FFE +3FFE +2080 +3FFF +2449 +444B +ENDCHAR +STARTCHAR U+F921 +ENCODING 63777 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +2108 +3FF8 +0000 +3FF8 +2008 +21E8 +2F08 +2108 +2FE8 +2928 +2FE8 +2128 +21F5 +5E0B +4001 +ENDCHAR +STARTCHAR U+F922 +ENCODING 63778 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4008 +27E8 +045F +07E0 +4420 +27E0 +0440 +17EF +1400 +1000 +23FE +2252 +2252 +2252 +47FF +4000 +ENDCHAR +STARTCHAR U+F923 +ENCODING 63779 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +7FFF +0210 +7F10 +4820 +7E3E +4240 +7E80 +4800 +7F7F +4000 +3FFE +2222 +2222 +7FFF +0000 +ENDCHAR +STARTCHAR U+F924 +ENCODING 63780 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1004 +13E4 +1248 +7FEF +0630 +0BE0 +1240 +17EF +3800 +5400 +11FE +114A +114A +114A +13FF +1000 +ENDCHAR +STARTCHAR U+F925 +ENCODING 63781 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1020 +1020 +7DFE +1000 +1004 +1104 +1108 +1C88 +7088 +1090 +1090 +1010 +17FF +3000 +ENDCHAR +STARTCHAR U+F926 +ENCODING 63782 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3892 +2924 +2892 +2820 +3BFE +2A56 +2AAA +2BFE +3A24 +2BBC +2A24 +2BBC +2A25 +4BBF +5E60 +ENDCHAR +STARTCHAR U+F927 +ENCODING 63783 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1092 +1124 +7C92 +5420 +5440 +55FE +552A +5552 +7DFE +1124 +11FC +1524 +1D24 +63BD +0667 +ENDCHAR +STARTCHAR U+F928 +ENCODING 63784 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +3FFF +2100 +2200 +2FBE +28A2 +2FA4 +28A4 +2FA2 +2A22 +2922 +2922 +4BAC +5C60 +4020 +ENDCHAR +STARTCHAR U+F929 +ENCODING 63785 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +081F +3F11 +2111 +2111 +3F1F +2111 +2111 +3F11 +241F +2491 +2311 +2211 +2F21 +70A1 +0047 +ENDCHAR +STARTCHAR U+F92A +ENCODING 63786 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1040 +03FC +0204 +4204 +23FC +0204 +1204 +13FC +1222 +2224 +2218 +2210 +22F8 +4F04 +4003 +ENDCHAR +STARTCHAR U+F92B +ENCODING 63787 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +4840 +31FC +1104 +3904 +49FC +0904 +0904 +19FC +1922 +2924 +4918 +0910 +09F8 +1704 +6003 +ENDCHAR +STARTCHAR U+F92C +ENCODING 63788 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0800 +3F3E +2122 +2122 +3F24 +2122 +2121 +3F21 +24A1 +2521 +2221 +2221 +3D2E +6120 +0020 +ENDCHAR +STARTCHAR U+F92D +ENCODING 63789 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0080 +7FFF +0080 +0888 +0888 +1494 +22A2 +0080 +01C0 +02A0 +0490 +0888 +1084 +6083 +ENDCHAR +STARTCHAR U+F92E +ENCODING 63790 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2050 +1088 +0104 +0603 +0000 +01FC +1000 +1000 +13FE +2042 +2042 +2042 +204C +4040 +4040 +ENDCHAR +STARTCHAR U+F92F +ENCODING 63791 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +24A9 +252A +4448 +0A14 +3162 +0000 +7FFF +4081 +0080 +3FFE +0102 +0102 +0202 +0C04 +7038 +ENDCHAR +STARTCHAR U+F930 +ENCODING 63792 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103E +1020 +7FFF +125E +13E0 +127F +16FE +1A92 +72FE +1292 +12FE +1210 +12FE +1422 +34CC +ENDCHAR +STARTCHAR U+F931 +ENCODING 63793 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1080 +10FC +1108 +13FE +7F22 +11FE +3922 +35FE +5152 +5229 +5000 +11FE +1102 +11FE +1102 +11FE +ENDCHAR +STARTCHAR U+F932 +ENCODING 63794 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +103E +1020 +13FF +162E +5BF0 +523F +52FE +1292 +12FE +1292 +12FE +2A00 +2AFE +22AA +45FF +ENDCHAR +STARTCHAR U+F933 +ENCODING 63795 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FC +0080 +3FFF +2179 +3F82 +21FE +27FC +2444 +27FC +2444 +27FC +2000 +2FFE +4912 +5FFF +ENDCHAR +STARTCHAR U+F934 +ENCODING 63796 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0081 +0082 +0084 +1FF8 +0090 +00A0 +7FFF +0180 +0600 +1C3C +67C0 +0400 +0401 +0401 +07FF +0000 +ENDCHAR +STARTCHAR U+F935 +ENCODING 63797 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +7FFF +02A0 +00FC +3FFF +2179 +3F82 +21FE +27FC +2444 +27FC +2444 +27FC +2FFE +4912 +5FFF +ENDCHAR +STARTCHAR U+F936 +ENCODING 63798 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FC +0080 +3FFF +2139 +3FC2 +20FE +27FC +2444 +3FFF +2444 +27FC +2040 +3FFE +4182 +4E0C +ENDCHAR +STARTCHAR U+F937 +ENCODING 63799 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3E20 +223E +2242 +2244 +3EA8 +0918 +0824 +0843 +2EC0 +297E +2842 +2842 +2F42 +707E +0042 +ENDCHAR +STARTCHAR U+F938 +ENCODING 63800 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +5EBD +0080 +1EBC +0010 +3E3E +2244 +3EA8 +0818 +2E27 +287C +2EA4 +7124 +003C +ENDCHAR +STARTCHAR U+F939 +ENCODING 63801 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0200 +07F0 +0820 +1FFC +3084 +5FFC +1084 +1FFC +1222 +2111 +4000 +0FFC +0804 +0FFC +0804 +0FFC +ENDCHAR +STARTCHAR U+F93A +ENCODING 63802 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3E40 +227E +3EC4 +0938 +2F4C +287B +7E78 +1FFC +1004 +1FFC +1000 +1FFE +1000 +1FFF +2491 +424A +ENDCHAR +STARTCHAR U+F93B +ENCODING 63803 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3F20 +087E +0842 +1084 +10E8 +1118 +3EFF +3210 +5292 +5254 +1238 +1238 +1254 +1E92 +1331 +ENDCHAR +STARTCHAR U+F93C +ENCODING 63804 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7E20 +007E +0042 +7E84 +10E8 +1118 +56FF +5410 +5492 +5454 +5438 +5438 +5454 +1092 +1131 +ENDCHAR +STARTCHAR U+F93D +ENCODING 63805 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +247E +4442 +2884 +10E8 +2518 +7EFF +1210 +1092 +5454 +5438 +5438 +5454 +1092 +1131 +ENDCHAR +STARTCHAR U+F93E +ENCODING 63806 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0408 +07F8 +0808 +0810 +1FF0 +0010 +7FFF +1088 +09D0 +06A0 +0490 +188C +6183 +ENDCHAR +STARTCHAR U+F93F +ENCODING 63807 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +2820 +447E +0042 +0084 +7CE8 +1118 +10FF +7E10 +1092 +5454 +5438 +5038 +1C54 +6192 +0631 +ENDCHAR +STARTCHAR U+F940 +ENCODING 63808 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +3FFF +2220 +3FFE +2222 +2222 +3FFE +2410 +24D3 +271C +2410 +2411 +27D1 +5C1F +4000 +ENDCHAR +STARTCHAR U+F941 +ENCODING 63809 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3C28 +0044 +7E82 +0101 +007C +3C00 +0000 +3CFE +00AA +00AA +3CFE +24AA +24AA +3CAA +2486 +ENDCHAR +STARTCHAR U+F942 +ENCODING 63810 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +087E +3E40 +147E +7F02 +3E7E +227C +3E48 +227E +3E49 +227F +2680 +0080 +3FFE +0080 +7FFF +ENDCHAR +STARTCHAR U+F943 +ENCODING 63811 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +0080 +0080 +1FFC +0080 +0080 +7FFF +0410 +0410 +0410 +7FFF +0810 +0810 +1010 +6010 +ENDCHAR +STARTCHAR U+F944 +ENCODING 63812 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +1FFF +2448 +4284 +0840 +7F7E +1440 +7F7E +0002 +3E7E +2248 +3E7E +2248 +3E7E +2249 +267F +ENDCHAR +STARTCHAR U+F945 +ENCODING 63813 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +7F7E +1440 +7F7E +3E02 +227E +3E48 +227E +3E49 +267F +3FFE +0808 +0FF8 +0808 +0BFF +7E08 +ENDCHAR +STARTCHAR U+F946 +ENCODING 63814 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4001 +4081 +0880 +0880 +1FFE +2080 +4080 +0080 +7FFF +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+F947 +ENCODING 63815 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +0400 +0FFC +1404 +2404 +47FC +0404 +0000 +7FFF +0810 +1020 +3F7E +51A2 +1122 +1F3E +ENDCHAR +STARTCHAR U+F948 +ENCODING 63816 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +3C20 +243E +2442 +2444 +3CA8 +2510 +262C +2443 +3CFE +2542 +2642 +2442 +2442 +447E +4C42 +ENDCHAR +STARTCHAR U+F949 +ENCODING 63817 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +0080 +7FFF +4081 +5EBD +0080 +1EBC +0000 +0000 +3FFE +2082 +3FFE +2082 +3FFE +2002 +ENDCHAR +STARTCHAR U+F94A +ENCODING 63818 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1084 +1FFC +1084 +1FFC +0000 +7F7F +4949 +7F7F +4949 +7F7F +0080 +0080 +3FFE +0080 +7FFF +ENDCHAR +STARTCHAR U+F94B +ENCODING 63819 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFE +1002 +1FFE +17FC +1444 +1FFF +1444 +17FC +1444 +17FC +1080 +1FFF +2208 +27D0 +2878 +5787 +ENDCHAR +STARTCHAR U+F94C +ENCODING 63820 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +13FE +1222 +7FFF +1222 +3BFE +3420 +73FE +5222 +53FE +5080 +1FFF +1208 +17B0 +10F8 +1707 +ENDCHAR +STARTCHAR U+F94D +ENCODING 63821 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FF +0000 +03FF +4201 +2201 +03FF +1210 +1210 +13FF +2210 +2228 +2228 +2444 +4482 +4901 +ENDCHAR +STARTCHAR U+F94E +ENCODING 63822 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FE +0402 +0402 +47FE +2400 +07FF +1420 +1420 +17FE +262A +26A6 +2662 +2B2A +4AA6 +5226 +ENDCHAR +STARTCHAR U+F94F +ENCODING 63823 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1084 +1FFC +1084 +1FFC +0100 +1220 +0C40 +0484 +037C +7F82 +0080 +1084 +2082 +4081 +0080 +ENDCHAR +STARTCHAR U+F950 +ENCODING 63824 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +10FE +2092 +4FFF +2892 +10FE +2410 +7EFE +1292 +10FE +5420 +57FF +5484 +55C8 +1038 +11C7 +ENDCHAR +STARTCHAR U+F951 +ENCODING 63825 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +79FF +4810 +5010 +5210 +4AFE +4A92 +4A92 +4AAA +4AC6 +4A82 +4A82 +4A86 +7200 +43FF +4200 +ENDCHAR +STARTCHAR U+F952 +ENCODING 63826 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2220 +2220 +7F20 +2220 +3EFE +0822 +7F22 +4922 +4922 +7F22 +0822 +0822 +7F42 +0842 +0884 +0B18 +ENDCHAR +STARTCHAR U+F953 +ENCODING 63827 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3E10 +2210 +2210 +22FF +3E11 +2211 +2211 +2211 +3E11 +2221 +2221 +2241 +2241 +4282 +4F0C +ENDCHAR +STARTCHAR U+F954 +ENCODING 63828 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2FFF +1000 +03FE +028A +02FA +0202 +13FE +103C +13E0 +2020 +2FFF +2060 +20B0 +432C +4C23 +ENDCHAR +STARTCHAR U+F955 +ENCODING 63829 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2020 +13FE +0020 +0FFF +0088 +0089 +110F +1680 +11FC +2208 +2D10 +20A0 +2060 +4198 +4E07 +ENDCHAR +STARTCHAR U+F956 +ENCODING 63830 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C20 +7020 +11FE +1020 +7FFF +1088 +3909 +360F +5880 +51FC +5208 +1510 +18A0 +1060 +1198 +1207 +ENDCHAR +STARTCHAR U+F957 +ENCODING 63831 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +25FE +4420 +2FFF +1048 +2489 +7D0F +1240 +54FE +5504 +5708 +5490 +5460 +10D8 +1307 +ENDCHAR +STARTCHAR U+F958 +ENCODING 63832 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0490 +0080 +1FFE +0080 +7FFF +0221 +0C3F +7100 +03FC +0408 +1A30 +61C0 +0760 +781F +ENDCHAR +STARTCHAR U+F959 +ENCODING 63833 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +F820 +8BFE +8820 +97FF +9090 +8891 +891F +8E00 +89FE +8884 +8848 +B030 +8070 +818C +8603 +ENDCHAR +STARTCHAR U+F95A +ENCODING 63834 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3DFF +0010 +7EFE +0000 +01FF +3D45 +01FF +3C00 +00FE +0082 +3CFE +2482 +24FE +3CFE +2583 +ENDCHAR +STARTCHAR U+F95B +ENCODING 63835 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +10FE +7F44 +2228 +5418 +0C27 +12C0 +6078 +1F80 +0080 +3FFE +0080 +7FFF +0080 +0080 +0180 +ENDCHAR +STARTCHAR U+F95C +ENCODING 63836 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1104 +63E8 +2A32 +1BEA +1224 +2FEB +743D +0088 +0080 +7FFF +01C0 +02A0 +0490 +188C +6083 +ENDCHAR +STARTCHAR U+F95D +ENCODING 63837 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0044 +3DFF +0044 +7E08 +0008 +0010 +3DFF +0020 +3C40 +00FE +0142 +3E42 +2442 +2442 +3C7E +2442 +ENDCHAR +STARTCHAR U+F95E +ENCODING 63838 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF8 +0808 +0908 +0888 +0848 +0808 +7FFF +0808 +0808 +0808 +0808 +1008 +1008 +2008 +4038 +ENDCHAR +STARTCHAR U+F95F +ENCODING 63839 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4101 +1484 +140A +27F9 +0000 +3FFE +2222 +7FFF +0000 +3FFE +0080 +0080 +0180 +ENDCHAR +STARTCHAR U+F960 +ENCODING 63840 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +08FE +7F42 +1124 +2218 +5418 +0C24 +12C2 +2101 +4400 +0200 +0904 +2802 +4809 +0FF8 +0000 +ENDCHAR +STARTCHAR U+F961 +ENCODING 63841 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4101 +1244 +0C48 +0288 +0924 +1272 +2F88 +0080 +0080 +7FFF +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+F962 +ENCODING 63842 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +1084 +1FFC +1084 +1FFC +0410 +0410 +3FFE +0410 +0410 +7FFF +0000 +0408 +0804 +1002 +ENDCHAR +STARTCHAR U+F963 +ENCODING 63843 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0220 +0220 +0220 +0220 +0223 +7E2C +0230 +0220 +0220 +0220 +0220 +0620 +1A21 +6221 +023F +0200 +ENDCHAR +STARTCHAR U+F964 +ENCODING 63844 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +001E +7FF0 +1122 +10A4 +17FF +2070 +20A8 +7D24 +6623 +6420 +25FE +2522 +25FE +2522 +3DFE +2502 +ENDCHAR +STARTCHAR U+F965 +ENCODING 63845 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0FFF +1020 +13FE +3222 +3222 +53FE +5222 +1222 +13FE +1020 +1120 +10C0 +1060 +1198 +1607 +ENDCHAR +STARTCHAR U+F966 +ENCODING 63846 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0900 +0900 +13FF +2400 +49FE +0902 +11FE +3102 +51FE +1040 +10FE +1184 +1648 +1030 +10D8 +1707 +ENDCHAR +STARTCHAR U+F967 +ENCODING 63847 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7FFF +0080 +0180 +0180 +0290 +0488 +0884 +1082 +2081 +4080 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+F968 +ENCODING 63848 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2100 +1084 +0044 +0004 +4088 +2088 +0288 +0290 +1492 +14A1 +10A1 +20C0 +2082 +2182 +46FE +5800 +ENDCHAR +STARTCHAR U+F969 +ENCODING 63849 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0408 +3F88 +2490 +7FDF +24A2 +3FC2 +04A2 +3FA4 +2494 +3F94 +1408 +7FC8 +2114 +5214 +0E22 +71C1 +ENDCHAR +STARTCHAR U+F96A +ENCODING 63850 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0080 +7FFF +4091 +4911 +0620 +0242 +01BF +7FC1 +0888 +1084 +2082 +4081 +0080 +ENDCHAR +STARTCHAR U+F96B +ENCODING 63851 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0110 +0208 +047C +3F82 +0810 +1224 +274E +79F1 +0220 +0C98 +7327 +0CC0 +030C +1C30 +01C0 +1E00 +ENDCHAR +STARTCHAR U+F96C +ENCODING 63852 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4221 +1FFC +0220 +1FFC +0220 +7FFF +0410 +188C +6083 +0FF8 +0080 +3FFE +0000 +ENDCHAR +STARTCHAR U+F96D +ENCODING 63853 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0884 +0882 +1089 +2091 +43A0 +00C0 +0300 +1FFC +6804 +0FFC +0804 +0FFC +0804 +0FFC +0804 +ENDCHAR +STARTCHAR U+F96E +ENCODING 63854 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +1210 +1210 +7FFF +1210 +13F0 +1000 +1FFE +0080 +7FFF +01C0 +02A0 +0C98 +7087 +ENDCHAR +STARTCHAR U+F96F +ENCODING 63855 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3C38 +0004 +7E82 +0101 +02FE +3C82 +0082 +3C82 +00FE +0028 +3C28 +2448 +2489 +3D0F +2600 +ENDCHAR +STARTCHAR U+F970 +ENCODING 63856 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +227C +1444 +0844 +1445 +2247 +4080 +0900 +0800 +7FFE +0842 +1C24 +1A28 +2810 +4828 +08C4 +0B03 +ENDCHAR +STARTCHAR U+F971 +ENCODING 63857 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +2000 +2000 +27FC +2000 +2000 +3FFF +2420 +2422 +2414 +2418 +2408 +25F4 +5E02 +4001 +ENDCHAR +STARTCHAR U+F972 +ENCODING 63858 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +0020 +0020 +47FF +2421 +0461 +1060 +1060 +1060 +10A0 +20A0 +2120 +2121 +423F +4400 +ENDCHAR +STARTCHAR U+F973 +ENCODING 63859 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1050 +1088 +7D04 +1202 +15FD +1000 +1000 +1C00 +71FC +1104 +1104 +1104 +1104 +11FC +3104 +ENDCHAR +STARTCHAR U+F974 +ENCODING 63860 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +0410 +7FFF +0410 +0490 +0080 +0100 +7FFF +0200 +0400 +0FFC +1404 +6404 +0404 +07FC +0404 +ENDCHAR +STARTCHAR U+F975 +ENCODING 63861 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +7DFF +1000 +10FE +1082 +1082 +1C82 +70FE +1010 +1010 +1054 +1092 +1111 +3030 +ENDCHAR +STARTCHAR U+F976 +ENCODING 63862 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +7CFE +5504 +5688 +5450 +5430 +7C4C +5583 +56FC +5484 +5484 +7C84 +4484 +00FC +0084 +ENDCHAR +STARTCHAR U+F977 +ENCODING 63863 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0000 +0FF8 +0808 +0FF8 +0000 +0000 +7FFF +4221 +0220 +0220 +0421 +083F +7000 +ENDCHAR +STARTCHAR U+F978 +ENCODING 63864 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +0080 +0080 +3FFE +2082 +2082 +2CB2 +2492 +2492 +2AAA +31C6 +2082 +2082 +2082 +2086 +ENDCHAR +STARTCHAR U+F979 +ENCODING 63865 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4020 +2020 +0FFF +0000 +03FE +0202 +0202 +0202 +13FE +1020 +1020 +2124 +2222 +2421 +4020 +4060 +ENDCHAR +STARTCHAR U+F97A +ENCODING 63866 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +13FC +0024 +4026 +2155 +0A4D +1085 +1138 +2600 +4080 +0080 +7FFF +01C0 +02A0 +0C98 +7087 +ENDCHAR +STARTCHAR U+F97B +ENCODING 63867 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +08FE +4A82 +2AFE +2C82 +7FFE +0800 +19FF +1CFE +2A92 +28FE +2892 +48FE +0810 +08FE +0810 +09FF +ENDCHAR +STARTCHAR U+F97C +ENCODING 63868 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0100 +1FFC +1004 +1004 +1FFC +1004 +1004 +1FFC +1100 +1084 +1048 +1030 +1010 +1F8C +7003 +ENDCHAR +STARTCHAR U+F97D +ENCODING 63869 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +3C10 +0010 +7FFF +0000 +00FE +3C82 +0082 +3CFE +0010 +0010 +3C54 +2492 +2511 +3C10 +2430 +ENDCHAR +STARTCHAR U+F97E +ENCODING 63870 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1004 +1FFC +1004 +1FFC +0000 +7FFF +1FFC +1084 +1FFC +1084 +1FFC +0080 +3FFE +0080 +7FFF +ENDCHAR +STARTCHAR U+F97F +ENCODING 63871 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FE8 +2888 +3FE8 +2888 +2FBF +2A89 +2F89 +2A89 +2F89 +2209 +3FC9 +3249 +33D1 +5C51 +5061 +50C6 +ENDCHAR +STARTCHAR U+F980 +ENCODING 63872 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FF8 +1008 +1008 +1008 +1008 +1FF8 +0100 +0200 +7FFE +4002 +4002 +4002 +4002 +7FFE +4002 +ENDCHAR +STARTCHAR U+F981 +ENCODING 63873 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0100 +0100 +0200 +7FFF +0408 +0808 +0810 +1010 +1C20 +2340 +00C0 +0130 +0208 +0C04 +7002 +ENDCHAR +STARTCHAR U+F982 +ENCODING 63874 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00FC +0080 +3FFF +2139 +2FC2 +21FE +27FC +2444 +27FC +2444 +27FC +2000 +2FFE +4912 +5FFF +ENDCHAR +STARTCHAR U+F983 +ENCODING 63875 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +0820 +7FFF +0880 +0806 +0F38 +0929 +092A +092C +1128 +1124 +1124 +213E +22E2 +4C01 +ENDCHAR +STARTCHAR U+F984 +ENCODING 63876 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2040 +107C +0040 +07FF +045E +47F1 +247F +05FC +1524 +15FC +1524 +25FC +2422 +2551 +4945 +4A7C +ENDCHAR +STARTCHAR U+F985 +ENCODING 63877 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +1244 +13FF +1244 +22FE +2292 +3AFE +6A92 +6AFE +6A10 +2BFF +2B15 +2B3F +3BE1 +2D03 +ENDCHAR +STARTCHAR U+F986 +ENCODING 63878 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7E7E +4242 +7E7E +4242 +7E7E +4002 +47E2 +4422 +47E2 +4102 +4FF2 +4812 +4FF2 +4812 +4006 +ENDCHAR +STARTCHAR U+F987 +ENCODING 63879 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +51EF +516B +7D6B +5010 +51FF +7D28 +51FE +512A +7DFE +5548 +2D7E +1548 +4579 +5ACF +ENDCHAR +STARTCHAR U+F988 +ENCODING 63880 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +7F7F +0000 +3E3E +2AAA +22A2 +3FFF +2220 +3FFE +2222 +3FFE +2420 +27BE +2420 +27E1 +5C3F +4000 +ENDCHAR +STARTCHAR U+F989 +ENCODING 63881 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0620 +3820 +087E +7F4A +0C92 +1B22 +28C4 +4818 +00C0 +03A0 +0C98 +748F +03D0 +06B0 +188C +6182 +ENDCHAR +STARTCHAR U+F98A +ENCODING 63882 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0080 +0080 +3FFE +0082 +0082 +0082 +0102 +0102 +0202 +0202 +0402 +0802 +1004 +6018 +ENDCHAR +STARTCHAR U+F98B +ENCODING 63883 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +238E +2E78 +2208 +3FFF +271C +2AAA +3249 +2208 +27FC +2404 +27FC +4404 +47FC +4404 +ENDCHAR +STARTCHAR U+F98C +ENCODING 63884 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFF +238E +2E78 +2208 +3FFF +271C +2AAA +3249 +2208 +2040 +2240 +227E +4240 +5FFF +4000 +ENDCHAR +STARTCHAR U+F98D +ENCODING 63885 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1124 +1124 +7D7A +12DA +7FD4 +5574 +56DB +7F5D +5470 +5420 +7FFF +1020 +7C70 +10A8 +1124 +1623 +ENDCHAR +STARTCHAR U+F98E +ENCODING 63886 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0400 +0800 +1000 +3FFE +4080 +1080 +1FFE +1080 +1080 +1080 +7FFF +0080 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+F98F +ENCODING 63887 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1222 +1124 +17FF +1870 +54A8 +5124 +5623 +1204 +13FE +1454 +1A94 +1114 +127F +1404 +1804 +ENDCHAR +STARTCHAR U+F990 +ENCODING 63888 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +11C8 +1008 +2BF4 +4814 +31C8 +25D2 +7E3E +13C9 +555A +55EA +5408 +1288 +0442 +2409 +27F9 +4000 +ENDCHAR +STARTCHAR U+F991 +ENCODING 63889 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1108 +110A +11E9 +7E48 +137F +1488 +1894 +1514 +1A22 +7442 +1081 +1000 +1202 +124A +1449 +3449 +ENDCHAR +STARTCHAR U+F992 +ENCODING 63890 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4800 +25FF +0111 +00FE +0810 +44FE +2092 +0EFE +1292 +12FE +1210 +23FF +2210 +2310 +44FF +4800 +ENDCHAR +STARTCHAR U+F993 +ENCODING 63891 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +1010 +15FF +1410 +54FE +5092 +50D6 +10BA +1092 +10FE +1018 +1838 +2454 +2492 +4111 +ENDCHAR +STARTCHAR U+F994 +ENCODING 63892 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0208 +0108 +7C7F +1008 +1008 +127F +1149 +7C7F +1049 +177F +1108 +1108 +1D7F +6188 +027F +0400 +ENDCHAR +STARTCHAR U+F995 +ENCODING 63893 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +00F8 +0F80 +0080 +7FFF +01C0 +02A0 +0C98 +7087 +00F8 +0F80 +0080 +0080 +7FFF +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+F996 +ENCODING 63894 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1010 +2410 +45FF +2810 +10FE +2492 +7ED6 +12BA +10FE +5492 +5438 +5454 +5454 +1092 +1111 +ENDCHAR +STARTCHAR U+F997 +ENCODING 63895 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0084 +7E84 +2528 +2732 +3D54 +2488 +2532 +3FFF +2400 +2529 +3D29 +6529 +05EF +0529 +0448 +0588 +ENDCHAR +STARTCHAR U+F998 +ENCODING 63896 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +7F7E +0810 +7FFF +1428 +2244 +7FFF +0080 +1FFC +1084 +1FFC +1084 +1FFC +0080 +7FFF +0080 +ENDCHAR +STARTCHAR U+F999 +ENCODING 63897 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +4020 +23FE +0020 +43FE +2222 +03FE +0222 +73FE +1020 +13FE +1820 +27FF +4000 +ENDCHAR +STARTCHAR U+F99A +ENCODING 63898 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +07FF +0020 +4020 +23FE +0222 +03FE +0222 +73FE +1020 +1020 +17FF +1820 +27FF +4000 +ENDCHAR +STARTCHAR U+F99B +ENCODING 63899 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2810 +4410 +01FF +7C10 +10FE +1092 +7CD6 +10BA +14FE +5410 +5438 +5054 +1E54 +7092 +0111 +ENDCHAR +STARTCHAR U+F99C +ENCODING 63900 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +0022 +7FE2 +0822 +0822 +0FA2 +10A2 +10A2 +2922 +4522 +0222 +0222 +0422 +0822 +1002 +6006 +ENDCHAR +STARTCHAR U+F99D +ENCODING 63901 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0484 +0882 +1081 +2088 +0390 +0060 +0380 +3C80 +0080 +3FFE +0082 +0102 +0202 +0C04 +7038 +ENDCHAR +STARTCHAR U+F99E +ENCODING 63902 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +01FF +7901 +4911 +4911 +49FF +4911 +4911 +4929 +4929 +4945 +7983 +4901 +0101 +01FF +0101 +ENDCHAR +STARTCHAR U+F99F +ENCODING 63903 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +3FD1 +0411 +0411 +0FD1 +0891 +1091 +2911 +4611 +0411 +0811 +1003 +6000 +0912 +1089 +2089 +ENDCHAR +STARTCHAR U+F9A0 +ENCODING 63904 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0002 +7FD2 +0812 +0F92 +1112 +6A12 +0412 +1886 +6080 +7FFF +0240 +0624 +1A18 +6208 +03E4 +3C03 +ENDCHAR +STARTCHAR U+F9A1 +ENCODING 63905 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3E3C +0004 +7F42 +0083 +01FE +3E82 +0082 +3E82 +00FE +0048 +3E48 +2249 +2289 +3E8F +2300 +ENDCHAR +STARTCHAR U+F9A2 +ENCODING 63906 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +21CE +2F70 +2120 +3FFF +2120 +2FFC +2124 +3FFF +2124 +2FFC +2130 +4328 +4524 +5923 +ENDCHAR +STARTCHAR U+F9A3 +ENCODING 63907 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +00C0 +0120 +0210 +040C +1BF3 +6000 +0FF8 +0008 +0010 +0120 +0482 +044A +2409 +27F9 +4000 +ENDCHAR +STARTCHAR U+F9A4 +ENCODING 63908 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +1050 +7C88 +1104 +1603 +11F8 +1400 +19F8 +7008 +1090 +1044 +1122 +1509 +15F9 +3400 +ENDCHAR +STARTCHAR U+F9A5 +ENCODING 63909 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7F28 +1044 +1082 +117D +3E00 +24EE +54AA +4CAA +08EE +0800 +1044 +1044 +20AC +2132 +4211 +ENDCHAR +STARTCHAR U+F9A6 +ENCODING 63910 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +1FFF +2428 +4244 +3FFF +20A0 +3FFF +20A0 +2FFC +20A4 +3FFF +21B4 +2FFC +41B0 +46AC +58A3 +ENDCHAR +STARTCHAR U+F9A7 +ENCODING 63911 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0892 +4924 +3248 +1124 +2892 +4BFE +0ADA +0BFE +1A24 +1BBC +2A24 +4A24 +0BBD +0A25 +0BBB +3661 +ENDCHAR +STARTCHAR U+F9A8 +ENCODING 63912 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0140 +0220 +0410 +180C +6003 +0FF8 +0000 +0000 +1FF8 +0208 +0208 +0208 +0230 +0200 +0200 +ENDCHAR +STARTCHAR U+F9A9 +ENCODING 63913 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4002 +4182 +4242 +4432 +480E +77E2 +4002 +4FF2 +4212 +4212 +4232 +4202 +7FFE +4002 +ENDCHAR +STARTCHAR U+F9AA +ENCODING 63914 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4101 +1482 +1409 +27F9 +0000 +1FFE +1122 +1122 +7FFF +0000 +3FFE +0080 +0080 +0180 +ENDCHAR +STARTCHAR U+F9AB +ENCODING 63915 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +2002 +09FF +1410 +227E +4142 +3E7E +0042 +3E7E +1242 +167E +1042 +1081 +ENDCHAR +STARTCHAR U+F9AC +ENCODING 63916 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1030 +1048 +1484 +1502 +5601 +51FC +5000 +1000 +13FE +1042 +1042 +1042 +104C +1040 +1040 +ENDCHAR +STARTCHAR U+F9AD +ENCODING 63917 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +0028 +7C44 +1082 +1101 +1000 +11FE +7C00 +1000 +11FE +1042 +1C42 +7042 +004C +0040 +0040 +ENDCHAR +STARTCHAR U+F9AE +ENCODING 63918 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +2929 +2A2A +4848 +1414 +2222 +4141 +7FFF +4001 +3FFE +0080 +0080 +1FFC +0090 +0088 +7FFF +ENDCHAR +STARTCHAR U+F9AF +ENCODING 63919 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4410 +4428 +2844 +7E82 +1101 +1000 +11FE +7C00 +1000 +11FE +1E42 +7042 +1042 +104C +2040 +4040 +ENDCHAR +STARTCHAR U+F9B0 +ENCODING 63920 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0010 +7F28 +2444 +2482 +3D01 +2400 +25FE +3C00 +2400 +25FE +3C42 +6442 +0442 +044C +0440 +0440 +ENDCHAR +STARTCHAR U+F9B1 +ENCODING 63921 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +2828 +4444 +0082 +7D01 +1000 +11FE +7C00 +1000 +15FE +5442 +5442 +5042 +1E4C +7040 +0040 +ENDCHAR +STARTCHAR U+F9B2 +ENCODING 63922 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +0080 +7FFF +4081 +1EBC +0080 +1EBC +0140 +0230 +0FEC +7003 +0FF8 +0208 +0230 +0200 +ENDCHAR +STARTCHAR U+F9B3 +ENCODING 63923 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFE +0080 +7FFF +4081 +1EBC +0080 +1EBC +0000 +3DDE +2552 +3DDE +0000 +3FFE +0C98 +12A4 +7FFF +ENDCHAR +STARTCHAR U+F9B4 +ENCODING 63924 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +15FF +2210 +4020 +007E +7E42 +0042 +007E +7E42 +2242 +227E +2242 +2242 +2C7E +2042 +2081 +ENDCHAR +STARTCHAR U+F9B5 +ENCODING 63925 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0801 +0809 +17F9 +1089 +3109 +31F9 +5219 +5329 +14A9 +1849 +1049 +1089 +1109 +1201 +1401 +1003 +ENDCHAR +STARTCHAR U+F9B6 +ENCODING 63926 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +3E28 +00FE +00AA +00FE +7FAA +08FE +0800 +2BFF +2A00 +2AFE +2A82 +4AFE +4A44 +0828 +09FF +ENDCHAR +STARTCHAR U+F9B7 +ENCODING 63927 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0028 +7E28 +18FE +18AA +18FE +7EAA +5AFE +5A00 +6FFF +4200 +42FE +7E82 +42FE +4244 +7E28 +43FF +ENDCHAR +STARTCHAR U+F9B8 +ENCODING 63928 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +7EFE +1812 +2DFF +2A12 +48FE +0810 +3E10 +0092 +7F54 +0838 +2A58 +2A94 +4912 +1831 +ENDCHAR +STARTCHAR U+F9B9 +ENCODING 63929 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +0220 +0220 +1E3C +1004 +1E3C +0220 +0220 +7FFF +0100 +0482 +1441 +1405 +27FC +4000 +ENDCHAR +STARTCHAR U+F9BA +ENCODING 63930 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +0008 +0010 +0020 +00C0 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0380 +ENDCHAR +STARTCHAR U+F9BB +ENCODING 63931 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +17FF +3252 +318C +5304 +5C03 +11FC +1104 +11FC +1104 +11FC +1020 +1128 +1224 +1462 +ENDCHAR +STARTCHAR U+F9BC +ENCODING 63932 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +4081 +3FFE +1144 +0E38 +780F +1FFC +1004 +1FFC +1004 +1FFC +0080 +0888 +1084 +2182 +ENDCHAR +STARTCHAR U+F9BD +ENCODING 63933 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +3FFE +2002 +2002 +3FFE +2040 +2042 +2FE4 +2168 +2150 +2250 +2248 +2448 +4844 +5042 +41C1 +ENDCHAR +STARTCHAR U+F9BE +ENCODING 63934 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0804 +0804 +2924 +2914 +2A04 +0804 +7F44 +0824 +1C07 +1A1C +28E4 +2804 +4804 +0804 +0804 +0804 +ENDCHAR +STARTCHAR U+F9BF +ENCODING 63935 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1084 +1104 +23E8 +4A32 +2BEA +122C +2A32 +7FFF +0491 +0080 +7FFF +01C0 +02A0 +0490 +188C +6083 +ENDCHAR +STARTCHAR U+F9C0 +ENCODING 63936 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +17FF +1122 +14D4 +598C +5603 +51FC +1104 +11FC +1104 +11FC +2820 +2924 +2A22 +4461 +ENDCHAR +STARTCHAR U+F9C1 +ENCODING 63937 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +1FFF +1040 +1FFF +54A4 +3318 +1C07 +17FC +3404 +57FC +1404 +17FC +1040 +2248 +2444 +48C2 +ENDCHAR +STARTCHAR U+F9C2 +ENCODING 63938 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +3FFE +0492 +09A6 +12CA +2492 +0B62 +0C58 +7187 +0620 +38C0 +070C +00F0 +1F00 +ENDCHAR +STARTCHAR U+F9C3 +ENCODING 63939 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +17FF +0252 +018C +4307 +2DFC +0104 +01FC +7104 +11FC +1020 +1124 +1222 +1860 +27FF +4000 +ENDCHAR +STARTCHAR U+F9C4 +ENCODING 63940 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0840 +0840 +7F7E +2240 +147E +7F02 +007E +3E40 +227E +3E40 +227E +3E40 +227E +2241 +227F +2640 +ENDCHAR +STARTCHAR U+F9C5 +ENCODING 63941 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0FF8 +0808 +0FF8 +0808 +0FF8 +7FFF +4081 +3FFE +1FFC +1084 +1FFC +1084 +1FFC +0080 +7FFF +0080 +ENDCHAR +STARTCHAR U+F9C6 +ENCODING 63942 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7C00 +45FE +4800 +5000 +4800 +47FF +4488 +4488 +4488 +4488 +4488 +5908 +4109 +420F +4C00 +ENDCHAR +STARTCHAR U+F9C7 +ENCODING 63943 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0001 +2DE9 +30A9 +20A9 +3D29 +62C9 +0609 +1989 +6069 +1F89 +0409 +7FC9 +0509 +2509 +17C1 +7803 +ENDCHAR +STARTCHAR U+F9C8 +ENCODING 63944 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +09FC +3E44 +0844 +1C44 +1A44 +1BFF +2844 +2844 +4844 +0844 +0844 +0844 +0BFF +0800 +ENDCHAR +STARTCHAR U+F9C9 +ENCODING 63945 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +116F +1189 +7D29 +1129 +3129 +3929 +7529 +5129 +51E9 +5349 +5049 +108B +1088 +1108 +1208 +ENDCHAR +STARTCHAR U+F9CA +ENCODING 63946 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2020 +1020 +0020 +0FFF +4080 +2104 +023E +07C1 +1000 +1124 +1124 +2124 +2124 +2124 +4225 +4C27 +ENDCHAR +STARTCHAR U+F9CB +ENCODING 63947 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +20C0 +133F +0209 +0209 +4249 +23F1 +062E +0040 +13FE +1222 +1222 +23FE +2222 +2222 +43FE +4202 +ENDCHAR +STARTCHAR U+F9CC +ENCODING 63948 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0020 +7C20 +13FF +1040 +1084 +113E +7FC1 +1000 +1124 +1124 +1D24 +6124 +0124 +0225 +0C27 +ENDCHAR +STARTCHAR U+F9CD +ENCODING 63949 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0700 +38FE +2022 +2022 +2022 +2F42 +709C +0100 +3FFE +2082 +2082 +3FFE +2082 +2082 +3FFE +2002 +ENDCHAR +STARTCHAR U+F9CE +ENCODING 63950 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7E20 +1020 +17FF +1040 +2084 +213E +7FC1 +6400 +64A4 +24A4 +24A4 +24A4 +24A5 +3D25 +2627 +ENDCHAR +STARTCHAR U+F9CF +ENCODING 63951 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +13FC +2044 +4844 +2844 +1044 +2444 +4FFF +7244 +1044 +5444 +5444 +5444 +5444 +53FF +1000 +ENDCHAR +STARTCHAR U+F9D0 +ENCODING 63952 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +2AFF +2A08 +0810 +7F7E +1C42 +2A42 +497E +0042 +0A42 +097E +7FC2 +0842 +147E +2242 +4181 +ENDCHAR +STARTCHAR U+F9D1 +ENCODING 63953 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0080 +7FFF +0000 +0000 +0000 +0410 +0410 +0808 +0808 +1004 +1002 +2002 +4001 +0000 +ENDCHAR +STARTCHAR U+F9D2 +ENCODING 63954 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0014 +7F92 +2A90 +4C97 +19F8 +2A90 +5D91 +0611 +1992 +6472 +1914 +6648 +1889 +6315 +0C63 +7181 +ENDCHAR +STARTCHAR U+F9D3 +ENCODING 63955 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7820 +4BFE +4820 +57FF +5090 +4891 +491F +4E20 +4820 +4820 +4BFE +5820 +4020 +47FF +4000 +ENDCHAR +STARTCHAR U+F9D4 +ENCODING 63956 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0860 +0890 +1108 +1204 +3C03 +33FC +5000 +5000 +17FE +1492 +1492 +17FE +1492 +1492 +1492 +1496 +ENDCHAR +STARTCHAR U+F9D5 +ENCODING 63957 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +2082 +2082 +3FFE +2082 +0140 +0220 +0C18 +77F7 +0000 +1FFC +1224 +1FFC +1224 +1224 +122C +ENDCHAR +STARTCHAR U+F9D6 +ENCODING 63958 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2060 +1090 +0108 +0204 +4C03 +23FC +0000 +0000 +17FE +1492 +1492 +27FE +2492 +2492 +4492 +4496 +ENDCHAR +STARTCHAR U+F9D7 +ENCODING 63959 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1030 +7C48 +1084 +1303 +7CFC +5400 +7DFE +554A +7D4A +114A +11FE +7D4A +114A +114A +1106 +ENDCHAR +STARTCHAR U+F9D8 +ENCODING 63960 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1020 +23FC +4024 +0FFF +0824 +13FC +3020 +5020 +13FE +1020 +1020 +17FF +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+F9D9 +ENCODING 63961 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FF +1028 +1428 +15FF +5529 +5129 +51FF +1111 +1010 +13FF +1030 +1058 +1094 +1313 +1010 +ENDCHAR +STARTCHAR U+F9DA +ENCODING 63962 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFF +0220 +0220 +3FFE +2222 +2222 +3FFE +0080 +0080 +7FFF +01C0 +02A0 +0490 +188C +6083 +ENDCHAR +STARTCHAR U+F9DB +ENCODING 63963 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4082 +2504 +1228 +0144 +1092 +2131 +47C8 +0080 +0080 +7FFF +0080 +0080 +0080 +ENDCHAR +STARTCHAR U+F9DC +ENCODING 63964 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +48FE +50C4 +4928 +4E30 +484C +4983 +4E50 +4890 +49FF +4A10 +70FE +4010 +43FF +4000 +ENDCHAR +STARTCHAR U+F9DD +ENCODING 63965 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0381 +3C11 +0411 +0411 +0411 +7FD1 +0C11 +0E11 +1511 +1491 +2411 +2411 +4411 +0411 +0401 +0403 +ENDCHAR +STARTCHAR U+F9DE +ENCODING 63966 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0080 +0080 +3FFE +2082 +2082 +2082 +3FFE +0080 +0880 +0500 +0300 +0CE0 +701F +ENDCHAR +STARTCHAR U+F9DF +ENCODING 63967 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +3FFF +2001 +3FFF +2440 +28FF +3100 +26FE +2C82 +34FE +24FE +2420 +247F +24C4 +2728 +4438 +45C7 +ENDCHAR +STARTCHAR U+F9E0 +ENCODING 63968 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0FF8 +0808 +0FF8 +0808 +0FF8 +0808 +0400 +0400 +0FFE +1112 +6222 +0442 +1882 +6304 +0C18 +ENDCHAR +STARTCHAR U+F9E1 +ENCODING 63969 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +01C0 +02A0 +0490 +188C +6083 +0000 +0FF8 +0060 +0080 +7FFF +0080 +0080 +0180 +ENDCHAR +STARTCHAR U+F9E2 +ENCODING 63970 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0782 +3C12 +0412 +7FD2 +0E12 +0D12 +1492 +2412 +4486 +0080 +7FFF +01C0 +02A0 +0490 +188C +6083 +ENDCHAR +STARTCHAR U+F9E3 +ENCODING 63971 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FE +0402 +0402 +0402 +47FE +2400 +0480 +1483 +149C +14E0 +2480 +2481 +2481 +48FF +4800 +ENDCHAR +STARTCHAR U+F9E4 +ENCODING 63972 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +03FE +7E22 +1222 +13FE +1222 +1222 +7FFE +1020 +1020 +1020 +13FE +1C20 +6020 +0FFF +0000 +ENDCHAR +STARTCHAR U+F9E5 +ENCODING 63973 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +1FFF +1000 +50C2 +3712 +1112 +1FF2 +1312 +3392 +5552 +1512 +1912 +2112 +2102 +4106 +ENDCHAR +STARTCHAR U+F9E6 +ENCODING 63974 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4422 +7FFE +1048 +1090 +11FE +1690 +5490 +54FE +5090 +10FE +1090 +1090 +10FF +1080 +ENDCHAR +STARTCHAR U+F9E7 +ENCODING 63975 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +7FFF +0080 +1FFC +1084 +1FFC +1084 +1FFC +0080 +3FFE +0080 +7FFF +0E24 +7418 +07EC +7803 +ENDCHAR +STARTCHAR U+F9E8 +ENCODING 63976 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +10FE +1092 +7C92 +04FE +0892 +1492 +38FE +5410 +1410 +1010 +10FE +1010 +1010 +11FF +1000 +ENDCHAR +STARTCHAR U+F9E9 +ENCODING 63977 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +1FFC +1084 +1084 +1FFC +1084 +1084 +1FFC +1084 +0080 +0080 +3FFE +0080 +0080 +7FFF +0000 +ENDCHAR +STARTCHAR U+F9EA +ENCODING 63978 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0412 +0412 +7FD4 +2AA4 +24FF +2AA4 +3FA4 +003F +7FA4 +48A4 +52A4 +67BF +79A4 +40A4 +40BF +41A0 +ENDCHAR +STARTCHAR U+F9EB +ENCODING 63979 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7FFE +4410 +7FFE +4490 +4100 +7FFE +4200 +4400 +4FF8 +7408 +47F8 +4408 +4000 +7FFF +4000 +ENDCHAR +STARTCHAR U+F9EC +ENCODING 63980 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17DF +0041 +0041 +47DF +2410 +0410 +17DF +1145 +1249 +2473 +38C5 +2149 +2271 +4C41 +4186 +ENDCHAR +STARTCHAR U+F9ED +ENCODING 63981 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +0410 +0220 +0140 +01C0 +0630 +780F +0000 +1FFC +1004 +1004 +1004 +1FFC +1004 +ENDCHAR +STARTCHAR U+F9EE +ENCODING 63982 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +14A8 +17FF +1470 +54A8 +5124 +5623 +50A4 +10FF +1134 +1354 +14FF +2884 +2904 +4204 +ENDCHAR +STARTCHAR U+F9EF +ENCODING 63983 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +0124 +7CA8 +17FF +1070 +10A8 +1124 +7E23 +10A4 +10FF +1134 +1354 +1CFF +6084 +0104 +0604 +ENDCHAR +STARTCHAR U+F9F0 +ENCODING 63984 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +3E3E +2222 +3E3E +2222 +3E3E +2242 +2482 +2FF2 +3482 +27F2 +2482 +27FA +2406 +ENDCHAR +STARTCHAR U+F9F1 +ENCODING 63985 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0020 +7924 +48A8 +57FF +5070 +48A8 +4924 +4E23 +48A4 +48FF +4934 +4B34 +74D4 +48FF +4104 +4604 +ENDCHAR +STARTCHAR U+F9F2 +ENCODING 63986 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1020 +1124 +3CA8 +47FF +0870 +7CA8 +5524 +5623 +7CA4 +54FF +5534 +7F54 +02D4 +14FF +5104 +4604 +ENDCHAR +STARTCHAR U+F9F3 +ENCODING 63987 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1092 +7E54 +5BFF +7E38 +5A54 +5A92 +7F11 +5484 +54FF +5F34 +55B4 +5654 +5EFF +7104 +4604 +ENDCHAR +STARTCHAR U+F9F4 +ENCODING 63988 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0808 +0808 +0808 +0808 +7FFF +081C +1C1C +1A2A +292A +284A +2849 +4889 +0808 +0808 +0808 +0808 +ENDCHAR +STARTCHAR U+F9F5 +ENCODING 63989 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2108 +1108 +0108 +0108 +4FFF +2108 +039C +035C +172A +152A +154A +2949 +2108 +2108 +4108 +4108 +ENDCHAR +STARTCHAR U+F9F6 +ENCODING 63990 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7E40 +50FF +5100 +52FE +7C82 +4482 +44FE +4400 +4400 +7DEF +5129 +5129 +5129 +7DEF +4129 +ENDCHAR +STARTCHAR U+F9F7 +ENCODING 63991 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +0080 +0080 +3FFE +0000 +0808 +0408 +0410 +0210 +0210 +0220 +0220 +0220 +7FFF +0000 +ENDCHAR +STARTCHAR U+F9F8 +ENCODING 63992 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0810 +0810 +1FFF +2424 +4242 +0000 +0080 +0080 +3FFE +0000 +0808 +0410 +0210 +0220 +7FFF +0000 +ENDCHAR +STARTCHAR U+F9F9 +ENCODING 63993 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +1210 +5210 +5410 +54FE +1000 +7C82 +1042 +3844 +3444 +7228 +5028 +5028 +5028 +11FF +1000 +ENDCHAR +STARTCHAR U+F9FA +ENCODING 63994 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0210 +2214 +2212 +2210 +2210 +3FFF +2210 +0210 +0210 +7E28 +2228 +2228 +2224 +2244 +4242 +4281 +ENDCHAR +STARTCHAR U+F9FB +ENCODING 63995 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0100 +03FC +0D08 +34B0 +0240 +0180 +0680 +7884 +0888 +0890 +1140 +0220 +0410 +180C +6003 +ENDCHAR +STARTCHAR U+F9FC +ENCODING 63996 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0090 +3894 +0092 +03F0 +7D50 +0150 +3FFF +0010 +39D2 +0152 +01D4 +3948 +29C9 +2955 +3863 +2981 +ENDCHAR +STARTCHAR U+F9FD +ENCODING 63997 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0820 +0820 +1020 +1020 +3020 +3020 +57FF +5020 +1020 +1020 +1020 +1020 +1020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U+F9FE +ENCODING 63998 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0410 +7FFF +0410 +0080 +0140 +0220 +0C18 +7087 +0080 +3FFE +0080 +0080 +0888 +1084 +2082 +4081 +ENDCHAR +STARTCHAR U+F9FF +ENCODING 63999 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0402 +0402 +7FD2 +0412 +0412 +7FD2 +4452 +4452 +4452 +4452 +4ED2 +0E12 +1512 +1512 +2482 +4446 +ENDCHAR +STARTCHAR U+FA00 +ENCODING 64000 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +11FE +1022 +1022 +1022 +1322 +1C22 +7022 +1022 +1022 +1122 +1142 +1F42 +0084 +0318 +0C00 +ENDCHAR +STARTCHAR U+FA01 +ENCODING 64001 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +0040 +3FFF +2210 +2210 +3FFE +2210 +23F0 +2000 +2FFC +2208 +2110 +20A0 +20C0 +4330 +5C0F +ENDCHAR +STARTCHAR U+FA02 +ENCODING 64002 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +11FF +7C20 +1040 +1040 +1080 +1480 +19FE +7282 +1482 +1082 +1082 +1082 +10FE +3082 +ENDCHAR +STARTCHAR U+FA03 +ENCODING 64003 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1010 +5410 +55FF +5510 +117E +7F12 +11FF +3112 +397E +7510 +5110 +517E +5142 +1142 +127E +1442 +ENDCHAR +STARTCHAR U+FA04 +ENCODING 64004 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0080 +0080 +7FFF +4001 +4001 +0038 +01C0 +1F00 +0107 +0178 +0780 +7900 +0101 +0101 +01FF +0000 +ENDCHAR +STARTCHAR U+FA05 +ENCODING 64005 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +2000 +17FF +0401 +0401 +05FD +4401 +2401 +04F9 +1489 +1489 +14F9 +2489 +2401 +2401 +4401 +4403 +ENDCHAR +STARTCHAR U+FA06 +ENCODING 64006 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1004 +1FFC +1004 +1FFC +0220 +0220 +3FFE +0220 +7FFF +0490 +1C9C +62E3 +03A0 +0C98 +7187 +ENDCHAR +STARTCHAR U+FA07 +ENCODING 64007 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1000 +1000 +7DFF +1000 +7CFE +5482 +54FE +7C00 +55FF +5511 +7D11 +11FF +1111 +7D11 +11FF +1101 +ENDCHAR +STARTCHAR U+FA08 +ENCODING 64008 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0800 +0800 +11FE +2400 +4400 +0800 +13FF +3010 +5010 +1010 +1010 +1010 +1010 +1010 +1010 +1030 +ENDCHAR +STARTCHAR U+FA09 +ENCODING 64009 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +7840 +48FC +4948 +5230 +4C28 +48C7 +4B10 +4810 +4BFE +4910 +7110 +4FFF +4010 +4010 +4010 +ENDCHAR +STARTCHAR U+FA0A +ENCODING 64010 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +1FFC +1004 +1004 +1FFC +1004 +1004 +1FFC +1004 +1004 +1FFC +0220 +0220 +0421 +0821 +103F +6000 +ENDCHAR +STARTCHAR U+FA0B +ENCODING 64011 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0040 +3FFF +2200 +221E +3FD2 +2012 +2F94 +2892 +2F92 +2012 +2F92 +2112 +23D2 +3E1C +4210 +4610 +ENDCHAR +STARTCHAR U+FA0C +ENCODING 64012 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0004 +FFFE +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0820 +0822 +1022 +2022 +401E +0000 +0000 +ENDCHAR +STARTCHAR U+FA0D +ENCODING 64013 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0878 +7F48 +0848 +3E48 +0048 +FF8E +8100 +BD7C +0004 +7E44 +4228 +4210 +7E28 +4246 +0000 +0000 +ENDCHAR +STARTCHAR U+FB00 +ENCODING 64256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +1B +24 +24 +24 +7E +24 +24 +24 +24 +24 +24 +00 +00 +ENDCHAR +STARTCHAR U+FB01 +ENCODING 64257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +1A +22 +20 +20 +7E +22 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+FB02 +ENCODING 64258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +1E +22 +22 +22 +7A +22 +22 +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+FB03 +ENCODING 64259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +16 +2A +28 +28 +7E +2A +2A +2A +2A +2A +2A +00 +00 +ENDCHAR +STARTCHAR U+FB04 +ENCODING 64260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +1E +2A +2A +2A +7E +2A +2A +2A +2A +2A +2A +00 +00 +ENDCHAR +STARTCHAR U+FB05 +ENCODING 64261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +38 +48 +48 +48 +5E +48 +48 +48 +48 +48 +46 +00 +00 +ENDCHAR +STARTCHAR U+FB06 +ENCODING 64262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +1C +24 +24 +24 +36 +44 +44 +24 +14 +14 +62 +00 +00 +ENDCHAR +STARTCHAR U+FB13 +ENCODING 64275 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +14 +30 +5D +55 +55 +55 +55 +55 +33 +00 +00 +ENDCHAR +STARTCHAR U+FB14 +ENCODING 64276 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +14 +14 +57 +54 +54 +55 +55 +55 +36 +00 +00 +ENDCHAR +STARTCHAR U+FB15 +ENCODING 64277 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +14 +14 +56 +55 +55 +55 +55 +55 +35 +04 +04 +ENDCHAR +STARTCHAR U+FB16 +ENCODING 64278 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +50 +3C +14 +55 +55 +55 +55 +55 +55 +33 +10 +1C +ENDCHAR +STARTCHAR U+FB17 +ENCODING 64279 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +18 +28 +28 +AD +AD +AD +AD +AD +AD +6A +08 +08 +ENDCHAR +STARTCHAR U+FB1E +ENCODING 64286 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +42 +42 +3C +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FB1F +ENCODING 64287 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +77 +11 +11 +11 +00 +3E +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FB20 +ENCODING 64288 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +44 +22 +12 +12 +12 +12 +12 +14 +F8 +00 +00 +ENDCHAR +STARTCHAR U+FB21 +ENCODING 64289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +303C +300C +0C0C +030C +0CF0 +30C0 +3030 +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FB22 +ENCODING 64290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3FFC +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+FB23 +ENCODING 64291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3FFC +000C +000C +0C0C +0C0C +0C0C +0C0C +0C0C +0C0C +0000 +0000 +ENDCHAR +STARTCHAR U+FB24 +ENCODING 64292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3FFC +000C +000C +000C +000C +000C +000C +000C +3FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FB25 +ENCODING 64293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0C00 +0C00 +0FFC +000C +000C +000C +000C +0030 +0030 +00C0 +0F00 +0000 +0000 +ENDCHAR +STARTCHAR U+FB26 +ENCODING 64294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +FFFC +0C0C +0C0C +0C0C +0C0C +0C0C +0C0C +0C0C +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FB27 +ENCODING 64295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3FFC +000C +000C +000C +000C +000C +000C +000C +000C +0000 +0000 +ENDCHAR +STARTCHAR U+FB28 +ENCODING 64296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0FFC +0C0C +0C0C +0C0C +0C0C +0C0C +0C0C +0C0C +3C0C +0000 +0000 +ENDCHAR +STARTCHAR U+FB29 +ENCODING 64297 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +08 +08 +08 +7F +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FB2A +ENCODING 64298 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +01 +00 +49 +49 +49 +49 +49 +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+FB2B +ENCODING 64299 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +00 +49 +49 +49 +49 +49 +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+FB2C +ENCODING 64300 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +01 +00 +49 +49 +49 +49 +4D +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+FB2D +ENCODING 64301 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +40 +00 +49 +49 +49 +49 +4D +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+FB2E +ENCODING 64302 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +46 +42 +22 +12 +2C +48 +44 +42 +41 +1C +00 +ENDCHAR +STARTCHAR U+FB2F +ENCODING 64303 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +46 +42 +22 +12 +2C +48 +44 +42 +41 +1C +08 +ENDCHAR +STARTCHAR U+FB30 +ENCODING 64304 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +46 +42 +22 +12 +2C +48 +44 +42 +41 +08 +00 +ENDCHAR +STARTCHAR U+FB31 +ENCODING 64305 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7C +04 +04 +04 +24 +04 +04 +04 +7F +00 +00 +ENDCHAR +STARTCHAR U+FB32 +ENCODING 64306 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +08 +08 +08 +44 +0C +14 +22 +42 +00 +00 +ENDCHAR +STARTCHAR U+FB33 +ENCODING 64307 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +04 +04 +04 +24 +04 +04 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+FB34 +ENCODING 64308 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +02 +02 +22 +2A +22 +22 +22 +22 +00 +00 +ENDCHAR +STARTCHAR U+FB35 +ENCODING 64309 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +08 +08 +08 +28 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+FB36 +ENCODING 64310 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +0C +0A +08 +28 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+FB38 +ENCODING 64312 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +46 +4A +42 +42 +52 +42 +42 +42 +7E +00 +00 +ENDCHAR +STARTCHAR U+FB39 +ENCODING 64313 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +38 +08 +08 +08 +20 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FB3A +ENCODING 64314 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +02 +02 +02 +12 +02 +02 +02 +02 +02 +02 +ENDCHAR +STARTCHAR U+FB3B +ENCODING 64315 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +02 +02 +02 +12 +02 +02 +02 +7C +00 +00 +ENDCHAR +STARTCHAR U+FB3C +ENCODING 64316 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +3E +02 +02 +02 +12 +04 +04 +08 +30 +00 +00 +ENDCHAR +STARTCHAR U+FB3E +ENCODING 64318 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +48 +48 +34 +14 +22 +22 +49 +41 +4F +00 +00 +ENDCHAR +STARTCHAR U+FB40 +ENCODING 64320 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +1C +04 +04 +04 +24 +04 +04 +04 +3C +00 +00 +ENDCHAR +STARTCHAR U+FB41 +ENCODING 64321 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +42 +42 +42 +52 +42 +42 +44 +78 +00 +00 +ENDCHAR +STARTCHAR U+FB43 +ENCODING 64323 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +42 +42 +42 +72 +02 +02 +12 +02 +02 +02 +ENDCHAR +STARTCHAR U+FB44 +ENCODING 64324 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +42 +42 +42 +72 +02 +12 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+FB46 +ENCODING 64326 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +42 +42 +24 +18 +08 +44 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+FB47 +ENCODING 64327 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +22 +2A +22 +24 +28 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U+FB48 +ENCODING 64328 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +7E +02 +02 +02 +12 +02 +02 +02 +02 +00 +00 +ENDCHAR +STARTCHAR U+FB49 +ENCODING 64329 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +49 +49 +49 +49 +4D +49 +49 +49 +7F +00 +00 +ENDCHAR +STARTCHAR U+FB4A +ENCODING 64330 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +3E +22 +22 +22 +2A +22 +22 +22 +62 +00 +00 +ENDCHAR +STARTCHAR U+FB4B +ENCODING 64331 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +00 +38 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +ENDCHAR +STARTCHAR U+FB4C +ENCODING 64332 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +70 +00 +7C +04 +04 +04 +04 +04 +04 +04 +7F +00 +00 +ENDCHAR +STARTCHAR U+FB4D +ENCODING 64333 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +70 +00 +7E +02 +02 +02 +02 +02 +02 +02 +7C +00 +00 +ENDCHAR +STARTCHAR U+FB4E +ENCODING 64334 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +70 +00 +7E +42 +42 +42 +72 +02 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+FB4F +ENCODING 64335 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +60 +20 +20 +46 +42 +22 +12 +2C +48 +44 +42 +42 +00 +00 +ENDCHAR +STARTCHAR U+FB56 +ENCODING 64342 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +04 +22 +42 +3C +00 +14 +00 +08 +00 +ENDCHAR +STARTCHAR U+FB57 +ENCODING 64343 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +04 +22 +42 +3F +00 +14 +00 +08 +00 +ENDCHAR +STARTCHAR U+FB58 +ENCODING 64344 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +04 +04 +F8 +00 +14 +00 +08 +00 +ENDCHAR +STARTCHAR U+FB59 +ENCODING 64345 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +04 +04 +FF +00 +14 +00 +08 +00 +ENDCHAR +STARTCHAR U+FB7A +ENCODING 64378 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +20 +40 +54 +40 +48 +22 +1C +ENDCHAR +STARTCHAR U+FB7B +ENCODING 64379 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +22 +41 +54 +40 +48 +21 +1E +ENDCHAR +STARTCHAR U+FB7C +ENCODING 64380 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +70 +0C +FC +00 +28 +00 +10 +00 +ENDCHAR +STARTCHAR U+FB7D +ENCODING 64381 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +70 +0C +FF +00 +28 +00 +10 +00 +ENDCHAR +STARTCHAR U+FB86 +ENCODING 64390 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +00 +28 +00 +08 +04 +02 +42 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FB87 +ENCODING 64391 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +00 +28 +00 +08 +04 +02 +42 +7F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FB8A +ENCODING 64394 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +14 +00 +00 +04 +02 +02 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FB8B +ENCODING 64395 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +14 +00 +00 +04 +02 +03 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FE20 +ENCODING 65056 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0F +30 +40 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE21 +ENCODING 65057 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +F0 +0C +02 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE22 +ENCODING 65058 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +1E +21 +40 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE23 +ENCODING 65059 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +84 +78 +00 +00 +24 +00 +42 +00 +24 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE30 +ENCODING 65072 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0180 +0180 +0000 +0000 +0000 +0000 +0180 +0180 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE31 +ENCODING 65073 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+FE32 +ENCODING 65074 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE33 +ENCODING 65075 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +0000 +ENDCHAR +STARTCHAR U+FE34 +ENCODING 65076 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +4000 +8000 +8000 +4000 +2000 +2000 +4000 +8000 +8000 +4000 +2000 +2000 +4000 +8000 +8000 +4000 +ENDCHAR +STARTCHAR U+FE35 +ENCODING 65077 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +07E0 +1818 +2004 +4002 +0000 +0000 +ENDCHAR +STARTCHAR U+FE36 +ENCODING 65078 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +4002 +2004 +1818 +07E0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE37 +ENCODING 65079 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +3E7C +4002 +0000 +0000 +ENDCHAR +STARTCHAR U+FE38 +ENCODING 65080 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +4002 +3E7C +0180 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE39 +ENCODING 65081 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +1FF8 +2004 +4002 +0000 +0000 +ENDCHAR +STARTCHAR U+FE3A +ENCODING 65082 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +4002 +2004 +1FF8 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE3B +ENCODING 65083 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFE +7FFE +781E +6006 +4002 +0000 +0000 +ENDCHAR +STARTCHAR U+FE3C +ENCODING 65084 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +4002 +6006 +781E +7FFE +7FFE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE3D +ENCODING 65085 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0660 +1818 +6186 +0660 +1818 +6006 +0000 +0000 +ENDCHAR +STARTCHAR U+FE3E +ENCODING 65086 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6006 +1818 +0660 +6186 +1818 +0660 +0180 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE3F +ENCODING 65087 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0660 +1818 +6006 +0000 +0000 +ENDCHAR +STARTCHAR U+FE40 +ENCODING 65088 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +6006 +1818 +0660 +0180 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE41 +ENCODING 65089 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFE +0002 +0002 +0002 +0002 +0002 +0000 +0000 +ENDCHAR +STARTCHAR U+FE42 +ENCODING 65090 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +4000 +4000 +4000 +4000 +4000 +7FFE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE43 +ENCODING 65091 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7FFE +4002 +7FFA +000A +000A +000A +000E +0000 +0000 +ENDCHAR +STARTCHAR U+FE44 +ENCODING 65092 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +7000 +5000 +5000 +5000 +5FFE +4002 +7FFE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE49 +ENCODING 65097 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +39CE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE4A +ENCODING 65098 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +7DBE +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE4B +ENCODING 65099 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C30 +9249 +6186 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE4C +ENCODING 65100 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0C30 +9249 +6186 +0C30 +9249 +6186 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE4D +ENCODING 65101 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +39CE +0000 +ENDCHAR +STARTCHAR U+FE4E +ENCODING 65102 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +7DBE +0000 +ENDCHAR +STARTCHAR U+FE4F +ENCODING 65103 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0C30 +9249 +6186 +ENDCHAR +STARTCHAR U+FE50 +ENCODING 65104 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+FE51 +ENCODING 65105 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0200 +0100 +0180 +0000 +ENDCHAR +STARTCHAR U+FE52 +ENCODING 65106 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+FE54 +ENCODING 65108 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0180 +0000 +0180 +0100 +0200 +0000 +ENDCHAR +STARTCHAR U+FE55 +ENCODING 65109 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0180 +0000 +0180 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+FE56 +ENCODING 65110 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0100 +0280 +0080 +0100 +0000 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+FE57 +ENCODING 65111 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0080 +0080 +0080 +0080 +0000 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+FE58 +ENCODING 65112 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +07C0 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE59 +ENCODING 65113 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0080 +0100 +0100 +0100 +0100 +0080 +0000 +0000 +ENDCHAR +STARTCHAR U+FE5A +ENCODING 65114 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0100 +0080 +0080 +0080 +0080 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+FE5B +ENCODING 65115 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0040 +0080 +0180 +0080 +0080 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+FE5C +ENCODING 65116 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0200 +0100 +0180 +0100 +0100 +0200 +0000 +0000 +ENDCHAR +STARTCHAR U+FE5D +ENCODING 65117 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +01C0 +0100 +0100 +0100 +0100 +01C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FE5E +ENCODING 65118 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0380 +0080 +0080 +0080 +0080 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+FE5F +ENCODING 65119 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0280 +07C0 +0280 +07C0 +0280 +0000 +0000 +ENDCHAR +STARTCHAR U+FE60 +ENCODING 65120 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0100 +0280 +0100 +0280 +0140 +0000 +0000 +ENDCHAR +STARTCHAR U+FE61 +ENCODING 65121 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0280 +0100 +0380 +0100 +0280 +0000 +0000 +ENDCHAR +STARTCHAR U+FE62 +ENCODING 65122 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0100 +0100 +07C0 +0100 +0100 +0000 +0000 +ENDCHAR +STARTCHAR U+FE63 +ENCODING 65123 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +03C0 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE64 +ENCODING 65124 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0040 +0080 +0100 +0080 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+FE65 +ENCODING 65125 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0200 +0100 +0080 +0100 +0200 +0000 +0000 +ENDCHAR +STARTCHAR U+FE66 +ENCODING 65126 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +03C0 +0000 +03C0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE68 +ENCODING 65128 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0200 +0100 +0080 +0040 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FE69 +ENCODING 65129 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0380 +0500 +0380 +0140 +0380 +0000 +0000 +ENDCHAR +STARTCHAR U+FE6A +ENCODING 65130 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0200 +0240 +0080 +0100 +0240 +0040 +0000 +0000 +ENDCHAR +STARTCHAR U+FE6B +ENCODING 65131 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0180 +0240 +02C0 +02C0 +0200 +0180 +0000 +0000 +ENDCHAR +STARTCHAR U+FE70 +ENCODING 65136 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0C +30 +0C +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE71 +ENCODING 65137 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +0C +30 +0C +30 +00 +00 +FF +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE72 +ENCODING 65138 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +06 +06 +32 +14 +38 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE74 +ENCODING 65140 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0C +30 +0C +30 +00 +00 +ENDCHAR +STARTCHAR U+FE76 +ENCODING 65142 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE77 +ENCODING 65143 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +0C +30 +00 +00 +00 +00 +00 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE78 +ENCODING 65144 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +28 +28 +1C +10 +20 +40 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE79 +ENCODING 65145 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +28 +28 +1C +10 +20 +40 +00 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE7A +ENCODING 65146 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +0C +30 +ENDCHAR +STARTCHAR U+FE7B +ENCODING 65147 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FF +00 +00 +00 +0C +30 +ENDCHAR +STARTCHAR U+FE7C +ENCODING 65148 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +14 +58 +60 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE7D +ENCODING 65149 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +14 +58 +60 +00 +00 +00 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE7E +ENCODING 65150 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +24 +24 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE7F +ENCODING 65151 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +24 +24 +18 +00 +00 +00 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE80 +ENCODING 65152 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +1C +20 +3C +10 +20 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE81 +ENCODING 65153 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +1C +00 +08 +08 +08 +08 +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE82 +ENCODING 65154 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +70 +00 +20 +20 +20 +20 +20 +20 +1F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE83 +ENCODING 65155 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +18 +20 +18 +00 +08 +08 +08 +08 +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE84 +ENCODING 65156 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +30 +40 +30 +00 +20 +20 +20 +20 +20 +20 +1F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE85 +ENCODING 65157 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +20 +18 +00 +0C +12 +12 +1E +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FE86 +ENCODING 65158 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +18 +20 +18 +00 +0C +12 +12 +1F +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FE87 +ENCODING 65159 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +00 +0C +10 +0C +00 +ENDCHAR +STARTCHAR U+FE88 +ENCODING 65160 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +20 +20 +20 +20 +20 +1F +00 +30 +40 +30 +00 +ENDCHAR +STARTCHAR U+FE89 +ENCODING 65161 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +40 +30 +00 +46 +48 +48 +46 +42 +3C +00 +ENDCHAR +STARTCHAR U+FE8A +ENCODING 65162 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +30 +40 +30 +00 +40 +43 +42 +42 +3C +00 +00 +ENDCHAR +STARTCHAR U+FE8B +ENCODING 65163 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +10 +0C +00 +04 +04 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE8C +ENCODING 65164 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +0C +10 +0C +00 +04 +04 +FB +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE8D +ENCODING 65165 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +08 +08 +08 +08 +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE8E +ENCODING 65166 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +20 +20 +20 +1F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE8F +ENCODING 65167 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +04 +22 +42 +3C +00 +00 +08 +00 +00 +ENDCHAR +STARTCHAR U+FE90 +ENCODING 65168 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +04 +22 +42 +3F +00 +00 +08 +00 +00 +ENDCHAR +STARTCHAR U+FE91 +ENCODING 65169 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +04 +04 +FC +00 +00 +10 +00 +00 +ENDCHAR +STARTCHAR U+FE92 +ENCODING 65170 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +04 +04 +FF +00 +00 +10 +00 +00 +ENDCHAR +STARTCHAR U+FE93 +ENCODING 65171 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +24 +00 +00 +18 +24 +22 +22 +1C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE94 +ENCODING 65172 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +12 +00 +04 +0C +14 +24 +3C +07 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE95 +ENCODING 65173 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +14 +00 +00 +04 +22 +42 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE96 +ENCODING 65174 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +14 +00 +00 +04 +22 +42 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE97 +ENCODING 65175 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +28 +00 +00 +08 +04 +04 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE98 +ENCODING 65176 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +28 +00 +00 +08 +04 +04 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE99 +ENCODING 65177 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +00 +24 +00 +00 +04 +22 +42 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE9A +ENCODING 65178 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +10 +00 +24 +00 +00 +04 +22 +42 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE9B +ENCODING 65179 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +20 +00 +48 +00 +00 +08 +04 +04 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE9C +ENCODING 65180 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +20 +00 +48 +00 +00 +08 +04 +04 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FE9D +ENCODING 65181 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +10 +20 +40 +48 +40 +22 +1C +ENDCHAR +STARTCHAR U+FE9E +ENCODING 65182 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +14 +23 +40 +48 +40 +21 +1E +ENDCHAR +STARTCHAR U+FE9F +ENCODING 65183 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +38 +06 +FE +00 +10 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEA0 +ENCODING 65184 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +38 +06 +FF +00 +10 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEA1 +ENCODING 65185 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +10 +20 +40 +40 +40 +22 +1C +ENDCHAR +STARTCHAR U+FEA2 +ENCODING 65186 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +7E +14 +23 +40 +40 +40 +21 +1E +ENDCHAR +STARTCHAR U+FEA3 +ENCODING 65187 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +70 +0C +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEA4 +ENCODING 65188 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +70 +0C +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEA5 +ENCODING 65189 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +7E +10 +20 +40 +40 +40 +22 +1C +ENDCHAR +STARTCHAR U+FEA6 +ENCODING 65190 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +7E +14 +23 +40 +40 +40 +21 +1E +ENDCHAR +STARTCHAR U+FEA7 +ENCODING 65191 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +00 +00 +70 +0C +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEA8 +ENCODING 65192 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +00 +00 +70 +0C +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEA9 +ENCODING 65193 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +04 +02 +42 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEAA +ENCODING 65194 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +04 +02 +42 +7F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEAB +ENCODING 65195 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +00 +08 +04 +02 +42 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEAC +ENCODING 65196 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +20 +00 +08 +04 +02 +42 +7F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEAD +ENCODING 65197 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +04 +02 +02 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FEAE +ENCODING 65198 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +04 +02 +03 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FEAF +ENCODING 65199 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +04 +02 +02 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FEB0 +ENCODING 65200 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +04 +02 +03 +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FEB1 +ENCODING 65201 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +01 +15 +15 +5E +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+FEB2 +ENCODING 65202 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +01 +15 +15 +5F +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+FEB3 +ENCODING 65203 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +02 +2A +2A +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEB4 +ENCODING 65204 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +02 +2A +2A +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEB5 +ENCODING 65205 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +12 +00 +00 +01 +15 +15 +5E +48 +48 +30 +00 +ENDCHAR +STARTCHAR U+FEB6 +ENCODING 65206 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +12 +00 +01 +15 +15 +5F +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+FEB7 +ENCODING 65207 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +00 +24 +00 +02 +2A +2A +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEB8 +ENCODING 65208 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +00 +24 +00 +02 +2A +2A +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEB9 +ENCODING 65209 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +06 +19 +4E +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+FEBA +ENCODING 65210 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +06 +19 +4F +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+FEBB +ENCODING 65211 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +0C +52 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEBC +ENCODING 65212 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +0C +52 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEBD +ENCODING 65213 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +04 +00 +00 +06 +19 +4E +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+FEBE +ENCODING 65214 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +04 +00 +00 +06 +19 +4F +48 +48 +30 +00 +00 +ENDCHAR +STARTCHAR U+FEBF +ENCODING 65215 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +00 +00 +0C +52 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC0 +ENCODING 65216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +00 +00 +0C +52 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC1 +ENCODING 65217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +2C +32 +22 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC2 +ENCODING 65218 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +2C +32 +22 +7F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC3 +ENCODING 65219 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +2C +32 +22 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC4 +ENCODING 65220 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +20 +20 +20 +2C +32 +22 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC5 +ENCODING 65221 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +24 +20 +20 +2C +32 +22 +7C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC6 +ENCODING 65222 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +24 +20 +20 +2C +32 +22 +7F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC7 +ENCODING 65223 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +24 +20 +20 +2C +32 +22 +FC +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC8 +ENCODING 65224 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +24 +20 +20 +2C +32 +22 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEC9 +ENCODING 65225 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +24 +20 +1C +20 +40 +40 +42 +3C +ENDCHAR +STARTCHAR U+FECA +ENCODING 65226 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +30 +30 +1F +20 +40 +40 +42 +3C +ENDCHAR +STARTCHAR U+FECB +ENCODING 65227 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +24 +20 +FE +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FECC +ENCODING 65228 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +18 +08 +F7 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FECD +ENCODING 65229 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +00 +00 +18 +24 +20 +1C +20 +40 +40 +42 +3C +ENDCHAR +STARTCHAR U+FECE +ENCODING 65230 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +30 +30 +1F +20 +40 +40 +42 +3C +ENDCHAR +STARTCHAR U+FECF +ENCODING 65231 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +00 +00 +18 +24 +20 +FE +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FED0 +ENCODING 65232 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +08 +00 +00 +18 +18 +08 +F7 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FED1 +ENCODING 65233 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +06 +0A +06 +42 +42 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FED2 +ENCODING 65234 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +08 +00 +06 +0A +06 +42 +42 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FED3 +ENCODING 65235 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +00 +00 +38 +24 +14 +0C +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FED4 +ENCODING 65236 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +10 +00 +00 +38 +24 +14 +0C +FB +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FED5 +ENCODING 65237 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +00 +00 +1C +12 +0A +26 +42 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+FED6 +ENCODING 65238 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +24 +00 +00 +1C +12 +0A +27 +42 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+FED7 +ENCODING 65239 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +48 +00 +00 +38 +24 +14 +0C +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FED8 +ENCODING 65240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +48 +00 +00 +38 +24 +14 +0C +FB +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FED9 +ENCODING 65241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +0A +12 +0A +22 +42 +42 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEDA +ENCODING 65242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +0A +12 +0A +22 +42 +42 +3F +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEDB +ENCODING 65243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +08 +10 +20 +40 +3C +02 +FE +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEDC +ENCODING 65244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +08 +10 +20 +40 +3C +02 +FF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEDD +ENCODING 65245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +02 +02 +02 +02 +22 +42 +42 +44 +3C +00 +00 +ENDCHAR +STARTCHAR U+FEDE +ENCODING 65246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +02 +02 +02 +02 +23 +42 +42 +44 +3C +00 +00 +ENDCHAR +STARTCHAR U+FEDF +ENCODING 65247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +04 +04 +04 +04 +04 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEE0 +ENCODING 65248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +04 +04 +04 +04 +04 +FB +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEE1 +ENCODING 65249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +1C +06 +1E +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U+FEE2 +ENCODING 65250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +1C +06 +1F +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U+FEE3 +ENCODING 65251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +14 +32 +EE +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEE4 +ENCODING 65252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +14 +32 +EF +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEE5 +ENCODING 65253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +04 +22 +42 +42 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+FEE6 +ENCODING 65254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +00 +00 +04 +22 +43 +42 +44 +38 +00 +00 +ENDCHAR +STARTCHAR U+FEE7 +ENCODING 65255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +00 +00 +08 +04 +04 +F8 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEE8 +ENCODING 65256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +10 +00 +00 +08 +04 +04 +FB +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEE9 +ENCODING 65257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +18 +24 +24 +3C +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEEA +ENCODING 65258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +04 +04 +0C +14 +24 +3C +07 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEEB +ENCODING 65259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +08 +3C +2A +3A +F6 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEEC +ENCODING 65260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0C +14 +14 +FF +14 +0C +00 +00 +00 +ENDCHAR +STARTCHAR U+FEED +ENCODING 65261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0C +12 +12 +1E +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FEEE +ENCODING 65262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +0C +12 +12 +1F +02 +04 +48 +30 +00 +ENDCHAR +STARTCHAR U+FEEF +ENCODING 65263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +04 +4A +48 +44 +42 +42 +3C +00 +ENDCHAR +STARTCHAR U+FEF0 +ENCODING 65264 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +43 +44 +42 +42 +3C +00 +ENDCHAR +STARTCHAR U+FEF1 +ENCODING 65265 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +04 +4A +48 +44 +42 +3C +00 +28 +ENDCHAR +STARTCHAR U+FEF2 +ENCODING 65266 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +43 +44 +42 +3C +00 +28 +ENDCHAR +STARTCHAR U+FEF3 +ENCODING 65267 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +08 +04 +F8 +00 +28 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEF4 +ENCODING 65268 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +08 +08 +04 +FB +00 +28 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEF5 +ENCODING 65269 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +72 +02 +22 +12 +0A +04 +0C +14 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEF6 +ENCODING 65270 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +72 +02 +22 +12 +0A +0E +0A +13 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEF7 +ENCODING 65271 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +42 +32 +02 +12 +0A +04 +0C +14 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEF8 +ENCODING 65272 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +30 +42 +32 +02 +12 +0A +0E +0A +13 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEF9 +ENCODING 65273 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +22 +12 +0A +04 +0C +14 +1C +00 +0C +10 +0C +ENDCHAR +STARTCHAR U+FEFA +ENCODING 65274 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +22 +12 +0A +0E +0A +13 +60 +0C +10 +0C +00 +ENDCHAR +STARTCHAR U+FEFB +ENCODING 65275 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +22 +12 +0A +04 +0C +14 +1C +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEFC +ENCODING 65276 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +02 +02 +22 +12 +0A +0E +0A +13 +60 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FEFF +ENCODING 65279 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3E88 +0488 +08A8 +10D8 +3E88 +0000 +22F0 +3288 +2AF0 +2688 +22F0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF01 +ENCODING 65281 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +0000 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF02 +ENCODING 65282 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0C0C +0C0C +0C0C +0C0C +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF03 +ENCODING 65283 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +030C +030C +030C +3FFC +0C30 +0C30 +3FFC +30C0 +30C0 +30C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF04 +ENCODING 65284 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00C0 +0FFC +30C3 +30C0 +0FC0 +00FC +00C3 +30C3 +0FFC +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF05 +ENCODING 65285 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0F03 +30CC +30CC +0F30 +00C0 +00C0 +033C +0CC3 +0CC3 +303C +0000 +0000 +ENDCHAR +STARTCHAR U+FF06 +ENCODING 65286 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +03F0 +0C0C +0C0C +0C0C +03F0 +0FC3 +3033 +300C +303C +0FC3 +0000 +0000 +ENDCHAR +STARTCHAR U+FF07 +ENCODING 65287 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF08 +ENCODING 65288 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0030 +00C0 +00C0 +0300 +0300 +0300 +0300 +0300 +0300 +00C0 +00C0 +0030 +0000 +ENDCHAR +STARTCHAR U+FF09 +ENCODING 65289 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0C00 +0300 +0300 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +0300 +0300 +0C00 +0000 +ENDCHAR +STARTCHAR U+FF0A +ENCODING 65290 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +00C0 +30C3 +0CCC +03F0 +0CCC +30C3 +00C0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF0B +ENCODING 65291 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +00C0 +00C0 +00C0 +3FFF +00C0 +00C0 +00C0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF0C +ENCODING 65292 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +03C0 +00C0 +00C0 +0300 +ENDCHAR +STARTCHAR U+FF0D +ENCODING 65293 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3FFC +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF0E +ENCODING 65294 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +03C0 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF0F +ENCODING 65295 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +000C +000C +0030 +00C0 +00C0 +0300 +0300 +0C00 +3000 +3000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF10 +ENCODING 65296 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +03C0 +0C30 +300C +300C +300C +300C +300C +300C +0C30 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF11 +ENCODING 65297 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00C0 +03C0 +0CC0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF12 +ENCODING 65298 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +000C +00F0 +0300 +0C00 +3000 +3000 +3FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF13 +ENCODING 65299 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +000C +03F0 +000C +000C +300C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF14 +ENCODING 65300 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0030 +00F0 +0330 +0C30 +3030 +3030 +3FFC +0030 +0030 +0030 +0000 +0000 +ENDCHAR +STARTCHAR U+FF15 +ENCODING 65301 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FFC +3000 +3000 +3000 +3FF0 +000C +000C +000C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF16 +ENCODING 65302 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +03F0 +0C00 +3000 +3000 +3FF0 +300C +300C +300C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF17 +ENCODING 65303 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FFC +000C +000C +0030 +0030 +0030 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF18 +ENCODING 65304 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +300C +0FF0 +300C +300C +300C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF19 +ENCODING 65305 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +300C +0FFC +000C +000C +000C +0030 +0FC0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF1A +ENCODING 65306 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +03C0 +03C0 +0000 +0000 +0000 +03C0 +03C0 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF1B +ENCODING 65307 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +03C0 +03C0 +0000 +0000 +0000 +03C0 +00C0 +00C0 +0300 +0000 +ENDCHAR +STARTCHAR U+FF1C +ENCODING 65308 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +000C +0030 +00C0 +0300 +0C00 +0300 +00C0 +0030 +000C +0000 +0000 +ENDCHAR +STARTCHAR U+FF1D +ENCODING 65309 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3FFC +0000 +0000 +0000 +3FFC +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF1E +ENCODING 65310 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +3000 +0C00 +0300 +00C0 +0030 +00C0 +0300 +0C00 +3000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF1F +ENCODING 65311 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +000C +0030 +00C0 +00C0 +0000 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF20 +ENCODING 65312 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +03F0 +0C0C +30CC +333C +330C +330C +330C +30FC +0C00 +03FC +0000 +0000 +ENDCHAR +STARTCHAR U+FF21 +ENCODING 65313 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +03C0 +0C30 +0C30 +300C +300C +3FFC +300C +300C +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF22 +ENCODING 65314 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FF0 +300C +300C +300C +3FF0 +300C +300C +300C +300C +3FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF23 +ENCODING 65315 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +3000 +3000 +3000 +3000 +300C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF24 +ENCODING 65316 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FC0 +3030 +300C +300C +300C +300C +300C +300C +3030 +3FC0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF25 +ENCODING 65317 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FFC +3000 +3000 +3000 +3FF0 +3000 +3000 +3000 +3000 +3FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF26 +ENCODING 65318 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FFC +3000 +3000 +3000 +3FF0 +3000 +3000 +3000 +3000 +3000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF27 +ENCODING 65319 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +3000 +3000 +30FC +300C +300C +303C +0FCC +0000 +0000 +ENDCHAR +STARTCHAR U+FF28 +ENCODING 65320 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +300C +300C +300C +300C +3FFC +300C +300C +300C +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF29 +ENCODING 65321 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FFC +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF2A +ENCODING 65322 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +03FF +0030 +0030 +0030 +0030 +0030 +0030 +3030 +3030 +0FC0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF2B +ENCODING 65323 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +300C +3030 +30C0 +3300 +3C00 +3C00 +3300 +30C0 +3030 +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF2C +ENCODING 65324 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF2D +ENCODING 65325 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +300C +300C +3C3C +3C3C +33CC +33CC +300C +300C +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF2E +ENCODING 65326 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +300C +3C0C +3C0C +330C +330C +30CC +30CC +303C +303C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF2F +ENCODING 65327 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +300C +300C +300C +300C +300C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF30 +ENCODING 65328 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FF0 +300C +300C +300C +3FF0 +3000 +3000 +3000 +3000 +3000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF31 +ENCODING 65329 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +300C +300C +300C +300C +33CC +3C3C +0FF0 +000F +0000 +ENDCHAR +STARTCHAR U+FF32 +ENCODING 65330 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FF0 +300C +300C +300C +3FF0 +30C0 +3030 +3030 +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF33 +ENCODING 65331 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0FF0 +300C +300C +3000 +0F00 +00F0 +000C +300C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF34 +ENCODING 65332 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FFF +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF35 +ENCODING 65333 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +300C +300C +300C +300C +300C +300C +300C +300C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF36 +ENCODING 65334 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3003 +3003 +3003 +0C0C +0C0C +0C0C +0330 +0330 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF37 +ENCODING 65335 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +300C +300C +300C +300C +33CC +33CC +3C3C +3C3C +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF38 +ENCODING 65336 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +300C +300C +0C30 +0C30 +03C0 +03C0 +0C30 +0C30 +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF39 +ENCODING 65337 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3003 +3003 +0C0C +0C0C +0330 +00C0 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF3A +ENCODING 65338 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3FFC +000C +000C +0030 +00C0 +0300 +0C00 +3000 +3000 +3FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF3B +ENCODING 65339 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +00FC +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00FC +0000 +ENDCHAR +STARTCHAR U+FF3C +ENCODING 65340 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3000 +3000 +0C00 +0300 +0300 +00C0 +00C0 +0030 +000C +000C +0000 +0000 +ENDCHAR +STARTCHAR U+FF3D +ENCODING 65341 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3F00 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +3F00 +0000 +ENDCHAR +STARTCHAR U+FF3E +ENCODING 65342 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +03C0 +0C30 +300C +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF3F +ENCODING 65343 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3FFF +0000 +ENDCHAR +STARTCHAR U+FF40 +ENCODING 65344 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0C00 +0300 +00C0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF41 +ENCODING 65345 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0FF0 +300C +000C +0FFC +300C +300C +303C +0FCC +0000 +0000 +ENDCHAR +STARTCHAR U+FF42 +ENCODING 65346 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3000 +3000 +3000 +33F0 +3C0C +300C +300C +300C +300C +3C0C +33F0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF43 +ENCODING 65347 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0FF0 +300C +3000 +3000 +3000 +3000 +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF44 +ENCODING 65348 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +000C +000C +000C +0FCC +303C +300C +300C +300C +300C +303C +0FCC +0000 +0000 +ENDCHAR +STARTCHAR U+FF45 +ENCODING 65349 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0FF0 +300C +300C +3FFC +3000 +3000 +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF46 +ENCODING 65350 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +00F0 +0300 +0300 +0300 +3FF0 +0300 +0300 +0300 +0300 +0300 +0300 +0000 +0000 +ENDCHAR +STARTCHAR U+FF47 +ENCODING 65351 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +000C +0FCC +3030 +3030 +3030 +0FC0 +0C00 +0FF0 +300C +300C +0FF0 +ENDCHAR +STARTCHAR U+FF48 +ENCODING 65352 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +3000 +3000 +3000 +33F0 +3C0C +300C +300C +300C +300C +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF49 +ENCODING 65353 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +00C0 +00C0 +0000 +03C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF4A +ENCODING 65354 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0030 +0030 +0000 +00F0 +0030 +0030 +0030 +0030 +0030 +0030 +0030 +30C0 +0F00 +ENDCHAR +STARTCHAR U+FF4B +ENCODING 65355 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3000 +3000 +3030 +30C0 +3300 +3C00 +3300 +30C0 +3030 +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF4C +ENCODING 65356 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +03C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +0FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF4D +ENCODING 65357 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +3F3C +30C3 +30C3 +30C3 +30C3 +30C3 +30C3 +30C3 +0000 +0000 +ENDCHAR +STARTCHAR U+FF4E +ENCODING 65358 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +33F0 +3C0C +300C +300C +300C +300C +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF4F +ENCODING 65359 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0FF0 +300C +300C +300C +300C +300C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF50 +ENCODING 65360 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +33F0 +3C0C +300C +300C +300C +300C +3C0C +33F0 +3000 +3000 +ENDCHAR +STARTCHAR U+FF51 +ENCODING 65361 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0FCC +303C +300C +300C +300C +300C +303C +0FCC +000C +000C +ENDCHAR +STARTCHAR U+FF52 +ENCODING 65362 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +33F0 +3C0C +300C +3000 +3000 +3000 +3000 +3000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF53 +ENCODING 65363 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0FF0 +300C +3000 +0F00 +00F0 +000C +300C +0FF0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF54 +ENCODING 65364 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0300 +0300 +3FF0 +0300 +0300 +0300 +0300 +0300 +0300 +00F0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF55 +ENCODING 65365 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +300C +300C +300C +300C +300C +300C +303C +0FCC +0000 +0000 +ENDCHAR +STARTCHAR U+FF56 +ENCODING 65366 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +300C +300C +300C +0C30 +0C30 +0C30 +03C0 +03C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FF57 +ENCODING 65367 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +3003 +30C3 +30C3 +30C3 +30C3 +30C3 +30C3 +0F3C +0000 +0000 +ENDCHAR +STARTCHAR U+FF58 +ENCODING 65368 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +300C +300C +0C30 +03C0 +03C0 +0C30 +300C +300C +0000 +0000 +ENDCHAR +STARTCHAR U+FF59 +ENCODING 65369 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +300C +300C +300C +300C +300C +0C3C +03CC +000C +000C +0FF0 +ENDCHAR +STARTCHAR U+FF5A +ENCODING 65370 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +3FFC +000C +0030 +00C0 +0300 +0C00 +3000 +3FFC +0000 +0000 +ENDCHAR +STARTCHAR U+FF5B +ENCODING 65371 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +00F0 +0300 +0300 +00C0 +00C0 +0300 +0300 +00C0 +00C0 +0300 +0300 +00F0 +0000 +ENDCHAR +STARTCHAR U+FF5C +ENCODING 65372 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +00C0 +ENDCHAR +STARTCHAR U+FF5D +ENCODING 65373 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0F00 +00C0 +00C0 +0300 +0300 +00C0 +00C0 +0300 +0300 +00C0 +00C0 +0F00 +0000 +ENDCHAR +STARTCHAR U+FF5E +ENCODING 65374 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0F03 +30C3 +303C +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FF61 +ENCODING 65377 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +50 +50 +20 +00 +ENDCHAR +STARTCHAR U+FF62 +ENCODING 65378 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +1E +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +00 +00 +ENDCHAR +STARTCHAR U+FF63 +ENCODING 65379 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +04 +3C +00 +ENDCHAR +STARTCHAR U+FF64 +ENCODING 65380 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +40 +60 +30 +18 +00 +00 +ENDCHAR +STARTCHAR U+FF65 +ENCODING 65381 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +18 +18 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FF66 +ENCODING 65382 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +02 +02 +02 +7E +02 +06 +04 +0C +08 +18 +30 +00 +00 +ENDCHAR +STARTCHAR U+FF67 +ENCODING 65383 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +7E +02 +16 +14 +10 +10 +10 +10 +30 +20 +ENDCHAR +STARTCHAR U+FF68 +ENCODING 65384 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +02 +04 +04 +08 +18 +68 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+FF69 +ENCODING 65385 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +10 +7E +42 +42 +02 +04 +04 +08 +10 +20 +ENDCHAR +STARTCHAR U+FF6A +ENCODING 65386 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7C +10 +10 +10 +10 +10 +10 +7E +00 +ENDCHAR +STARTCHAR U+FF6B +ENCODING 65387 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +7E +18 +18 +28 +28 +48 +08 +18 +ENDCHAR +STARTCHAR U+FF6C +ENCODING 65388 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +20 +22 +16 +1A +32 +48 +08 +08 +04 +04 +04 +ENDCHAR +STARTCHAR U+FF6D +ENCODING 65389 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +38 +08 +08 +08 +08 +08 +08 +7E +00 +ENDCHAR +STARTCHAR U+FF6E +ENCODING 65390 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +3C +04 +04 +04 +3C +04 +04 +04 +3C +00 +ENDCHAR +STARTCHAR U+FF6F +ENCODING 65391 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +10 +52 +4A +22 +04 +04 +08 +08 +10 +20 +ENDCHAR +STARTCHAR U+FF70 +ENCODING 65392 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +3C +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FF71 +ENCODING 65393 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +FF +01 +12 +14 +14 +10 +10 +10 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF72 +ENCODING 65394 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +02 +04 +04 +08 +18 +28 +C8 +08 +08 +08 +08 +08 +08 +00 +ENDCHAR +STARTCHAR U+FF73 +ENCODING 65395 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +7E +42 +42 +42 +42 +02 +02 +04 +04 +08 +10 +20 +00 +ENDCHAR +STARTCHAR U+FF74 +ENCODING 65396 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7E +10 +10 +10 +10 +10 +10 +10 +10 +FF +00 +00 +00 +ENDCHAR +STARTCHAR U+FF75 +ENCODING 65397 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +FF +08 +18 +18 +28 +28 +48 +48 +88 +08 +18 +00 +ENDCHAR +STARTCHAR U+FF76 +ENCODING 65398 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +10 +7E +12 +12 +12 +12 +12 +22 +22 +22 +42 +4E +00 +ENDCHAR +STARTCHAR U+FF77 +ENCODING 65399 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +20 +20 +20 +16 +18 +30 +D0 +13 +0C +38 +68 +08 +04 +04 +04 +04 +ENDCHAR +STARTCHAR U+FF78 +ENCODING 65400 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +1E +12 +22 +22 +44 +04 +04 +08 +08 +10 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF79 +ENCODING 65401 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +20 +20 +20 +20 +3F +44 +44 +84 +04 +08 +08 +08 +10 +10 +20 +00 +ENDCHAR +STARTCHAR U+FF7A +ENCODING 65402 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7E +02 +02 +02 +02 +02 +02 +02 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+FF7B +ENCODING 65403 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +24 +24 +24 +FF +24 +24 +24 +24 +04 +04 +08 +08 +10 +20 +00 +ENDCHAR +STARTCHAR U+FF7C +ENCODING 65404 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +20 +30 +10 +00 +41 +61 +22 +02 +04 +08 +10 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF7D +ENCODING 65405 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7C +04 +04 +04 +04 +08 +08 +18 +14 +24 +22 +42 +81 +00 +ENDCHAR +STARTCHAR U+FF7E +ENCODING 65406 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +20 +20 +20 +2E +32 +E2 +24 +20 +20 +20 +20 +20 +3E +00 +00 +ENDCHAR +STARTCHAR U+FF7F +ENCODING 65407 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +42 +42 +42 +22 +22 +02 +04 +04 +04 +08 +08 +10 +20 +00 +ENDCHAR +STARTCHAR U+FF80 +ENCODING 65408 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +1E +12 +22 +32 +4A +04 +04 +08 +08 +10 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF81 +ENCODING 65409 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +04 +78 +08 +08 +08 +FF +08 +08 +10 +10 +10 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF82 +ENCODING 65410 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +20 +A1 +91 +51 +52 +42 +02 +04 +04 +08 +08 +10 +20 +00 +ENDCHAR +STARTCHAR U+FF83 +ENCODING 65411 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +00 +00 +00 +FF +08 +08 +08 +10 +10 +10 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF84 +ENCODING 65412 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +18 +14 +12 +10 +10 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+FF85 +ENCODING 65413 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +08 +08 +08 +FF +08 +08 +08 +08 +10 +10 +10 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF86 +ENCODING 65414 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +7E +00 +00 +00 +00 +00 +00 +00 +FF +00 +00 +00 +ENDCHAR +STARTCHAR U+FF87 +ENCODING 65415 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +02 +02 +04 +24 +28 +18 +08 +14 +12 +22 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF88 +ENCODING 65416 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +10 +10 +7E +02 +04 +08 +18 +34 +52 +91 +10 +10 +10 +10 +00 +ENDCHAR +STARTCHAR U+FF89 +ENCODING 65417 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +02 +02 +04 +04 +04 +08 +08 +08 +10 +10 +20 +20 +40 +00 +ENDCHAR +STARTCHAR U+FF8A +ENCODING 65418 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +24 +24 +24 +22 +22 +22 +22 +42 +41 +41 +81 +00 +00 +ENDCHAR +STARTCHAR U+FF8B +ENCODING 65419 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +40 +40 +40 +46 +48 +70 +40 +40 +40 +40 +40 +20 +1E +00 +00 +ENDCHAR +STARTCHAR U+FF8C +ENCODING 65420 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +02 +02 +02 +04 +04 +04 +08 +08 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR U+FF8D +ENCODING 65421 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +20 +30 +30 +48 +48 +44 +84 +02 +02 +01 +00 +00 +00 +ENDCHAR +STARTCHAR U+FF8E +ENCODING 65422 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +FF +10 +10 +54 +52 +52 +52 +91 +91 +10 +30 +00 +ENDCHAR +STARTCHAR U+FF8F +ENCODING 65423 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +FF +01 +02 +04 +28 +10 +18 +08 +08 +04 +04 +00 +00 +ENDCHAR +STARTCHAR U+FF90 +ENCODING 65424 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +20 +18 +04 +00 +00 +20 +10 +0C +00 +00 +20 +10 +08 +04 +00 +ENDCHAR +STARTCHAR U+FF91 +ENCODING 65425 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +10 +10 +10 +10 +10 +20 +24 +24 +24 +22 +4E +72 +81 +00 +00 +ENDCHAR +STARTCHAR U+FF92 +ENCODING 65426 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +02 +02 +02 +04 +24 +24 +18 +08 +1C +14 +22 +20 +40 +80 +00 +ENDCHAR +STARTCHAR U+FF93 +ENCODING 65427 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +10 +10 +10 +10 +FE +10 +10 +10 +10 +10 +1E +00 +00 +ENDCHAR +STARTCHAR U+FF94 +ENCODING 65428 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +20 +20 +23 +2D +31 +D2 +12 +10 +08 +08 +08 +08 +08 +08 +00 +ENDCHAR +STARTCHAR U+FF95 +ENCODING 65429 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7C +04 +04 +04 +04 +04 +04 +04 +04 +FF +00 +00 +00 +ENDCHAR +STARTCHAR U+FF96 +ENCODING 65430 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +02 +02 +02 +02 +7E +02 +02 +02 +02 +02 +7E +00 +00 +ENDCHAR +STARTCHAR U+FF97 +ENCODING 65431 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +00 +00 +00 +7E +02 +02 +02 +04 +04 +08 +10 +20 +00 +ENDCHAR +STARTCHAR U+FF98 +ENCODING 65432 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +22 +22 +22 +22 +22 +22 +22 +22 +02 +04 +04 +04 +08 +10 +00 +ENDCHAR +STARTCHAR U+FF99 +ENCODING 65433 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +08 +28 +28 +28 +28 +28 +29 +29 +29 +2A +4A +4C +88 +00 +00 +ENDCHAR +STARTCHAR U+FF9A +ENCODING 65434 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +20 +20 +20 +20 +20 +21 +21 +22 +22 +24 +28 +30 +00 +00 +ENDCHAR +STARTCHAR U+FF9B +ENCODING 65435 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7E +42 +42 +42 +42 +42 +42 +42 +42 +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+FF9C +ENCODING 65436 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +7E +42 +42 +42 +02 +02 +02 +04 +04 +08 +10 +20 +00 +00 +ENDCHAR +STARTCHAR U+FF9D +ENCODING 65437 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +40 +20 +10 +01 +02 +02 +04 +04 +08 +10 +20 +40 +00 +00 +ENDCHAR +STARTCHAR U+FF9E +ENCODING 65438 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +28 +28 +28 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FF9F +ENCODING 65439 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +10 +28 +28 +10 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FFE0 +ENCODING 65504 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00C0 +00C0 +0FFC +30C3 +30C0 +30C0 +30C3 +0FFC +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FFE1 +ENCODING 65505 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00FC +0300 +0300 +0300 +3FF0 +0300 +0300 +0300 +0FFC +3C03 +0000 +0000 +ENDCHAR +STARTCHAR U+FFE2 +ENCODING 65506 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +3FFC +000C +000C +000C +0000 +0000 +ENDCHAR +STARTCHAR U+FFE3 +ENCODING 65507 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +3FFC +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +ENDCHAR +STARTCHAR U+FFE4 +ENCODING 65508 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +00C0 +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FFE5 +ENCODING 65509 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +3003 +0C0C +0330 +00C0 +3FFF +00C0 +3FFF +00C0 +00C0 +00C0 +0000 +0000 +ENDCHAR +STARTCHAR U+FFE6 +ENCODING 65510 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +0000 +0C0C +0C0C +0C0C +3FFF +0CCC +3FFF +0F3C +0F3C +0C0C +0C0C +0000 +0000 +ENDCHAR +STARTCHAR U+FFE8 +ENCODING 65512 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U+FFE9 +ENCODING 65513 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +10 +20 +7E +20 +10 +00 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FFEA +ENCODING 65514 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +1C +2A +08 +08 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FFEB +ENCODING 65515 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +08 +04 +7E +04 +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FFEC +ENCODING 65516 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +08 +08 +08 +2A +1C +08 +00 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FFED +ENCODING 65517 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +00 +7E +7E +7E +7E +7E +7E +00 +00 +00 +ENDCHAR +STARTCHAR U+FFEE +ENCODING 65518 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +00 +00 +00 +18 +24 +42 +42 +24 +18 +00 +00 +00 +00 +ENDCHAR +STARTCHAR U+FFFC +ENCODING 65532 +SWIDTH 1000 0 +DWIDTH 16 0 +BBX 16 16 0 -2 +BITMAP +0000 +0000 +0000 +7FFE +4002 +4002 +498A +554A +558A +554A +49B2 +4002 +4002 +7FFE +0000 +0000 +ENDCHAR +STARTCHAR U+FFFD +ENCODING 65533 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +00 +00 +00 +7E +66 +5A +5A +7A +76 +76 +7E +76 +76 +7E +00 +00 +ENDCHAR +ENDFONT diff --git a/src/3rdparty/freetype/ChangeLog b/src/3rdparty/freetype/ChangeLog new file mode 100644 index 0000000000..7de9ecfa7d --- /dev/null +++ b/src/3rdparty/freetype/ChangeLog @@ -0,0 +1,4956 @@ +2009-03-12 Werner Lemberg + + * Version 2.3.9 released. + ========================= + + + Tag sources with `VER-2-3-9'. + +2009-03-12 Werner Lemberg + + * builds/unix/freetype2.in: Move @FT2_EXTRA_LIBS@ to `Libs.private'. + +2009-03-12 Werner Lemberg + + Fix some FreeType Coverity issues as reported for Ghostscript. + + * src/base/ftobjs.c (FT_New_Face, FT_New_Memory_Face): Initialize + `args.stream' (#3874, #3875). + (open_face_PS_from_sfnt_stream): Improve error management (#3786). + * src/base/ftmm.c (ft_face_get_mm_service): Fix check of `aservice' + (#3870). + * src/base/ftstroke.c (ft_stroke_border_get_counts): Remove dead + code (#3790). + * src/base/ftrfork.c (raccess_guess_apple_generic): Check error + value of `FT_Stream_Skip' (#3784). + + * src/type1/t1gload.c (T1_Load_Glyph): Check `size' before accessing + it (#3872) + + * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Check `face' before accessing + it (#3871). + * src/pcf/pcfread.c (pcf_get_metrics): Handle return value of + `pcf_get_metric' (#3789, #3782). + (pcf_get_properties): Use FT_STREAM_SKIP (#3783). + + * src/cache/ftcmanag.c (FTC_Manager_RegisterCache): Fix check of + `acache' (#3797) + + * src/cff/cffdrivr.c (cff_ps_get_font_info): Fix check of `cff' + (#3796). + * src/cff/cffgload.c (cff_decoder_prepare): Check `size' (#3795). + * src/cff/cffload.c (cff_index_get_pointers): Add comment (#3794). + + * src/bdf/bdflib.c (_bdf_add_property): Check `fp->value.atom' + (#3793). + (_bdf_parse_start): Add comment (#3792). + + * src/raster/ftraster.c (Finalize_Profile_Table): Check + `ras.fProfile' (#3791). + + * src/sfnt/ttsbit.c (Load_SBit_Image): Use FT_STREAM_SKIP (#3785). + + * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Properly ignore + seek error (#3781). + +2009-03-11 Michael Toftdal + + Extend CID service functions to handle CID-keyed CFFs as CID fonts. + + * include/freetype/ftcid.h (FT_Get_CID_Is_Internally_CID_keyed, + FT_Get_CID_From_Glyph_Index): New functions. + + * include/freetype/internal/services/svcid.h + (FT_CID_GetIsInternallyCIDKeyedFunc, + FT_CID_GetCIDFromGlyphIndexFunc): New function typedefs. + (CID Service): Use them. + + * src/base/ftcid.c: Include FT_CID_H. + (FT_Get_CID_Is_Internally_CID_keyed, FT_Get_CID_From_Glyph_Index): + New functions. + + * src/cff/cffdrivr.c (cff_get_is_cid, cff_get_cid_from_glyph_index): + New functions. + (cff_service_cid_info): Add them. + * src/cff/cffload.c (cff_font_load): Don't free `font->charset.sids' + -- it is needed for access as a CID-keyed font. It gets deleted + later on. + + * src/cid/cidriver.c (cid_get_is_cid, cid_get_cid_from_glyph_index): + New functions. + (cid_service_cid_info): Add them. + + * docs/CHANGES: Updated. + +2009-03-11 Bram Tassyns + + Fix Savannah bug #25597. + + * src/cff/cffparse.c (cff_parse_real): Don't allow fraction_length + to become larger than 9. + +2009-03-11 Werner Lemberg + + Fix Savannah bug #25814. + + * builds/unix/freetype2.in: As suggested in the bug report, move + @LIBZ@ to `Libs.private'. + +2009-03-11 Werner Lemberg + + Fix Savannah bug #25781. + We now simply check for a valid `offset', no longer handling `delta + = 1' specially. + + * src/sfnt/ttcmap.c (tt_cmap4_validate): Don't check `delta' for + last segment. + (tt_cmap4_set_range, tt_cmap4_char_map_linear, + tt_cmap4_char_map_binary): Check offset. + +2009-03-11 Werner Lemberg + + * src/base/Jamfile: Fix handling of ftadvanc.c. + Reported by Oran Agra . + +2009-03-10 Vincent Richomme + + Restructure Win32 and Wince compiler support. + + * src/builds/win32: Remove files for WinCE. + Move VC 2005 support to a separate directory. + Add directory for VC 2008 support. + + * src/builds/wince: New directory hierarchy for WinCE compilers + (VC 2005 and VC 2008). + +2009-03-09 Werner Lemberg + + More preparations for 2.3.9 release. + + * docs/CHANGES: Updated. + + * Jamfile, README: s/2.3.8/2.3.9/, s/238/239/. + +2009-03-09 Werner Lemberg + + * src/sfnt/rules.mk (SFNT_DRV_H): Add ttsbit0.c. + +2009-03-09 Alexey Kryukov + + Fix handling of EBDT formats 8 and 9 (part 2). + + This patch fixes the following problems in ttsbit0.c: + + . Bitmaps for compound glyphs were never allocated. + + . `SBitDecoder' refused to load metrics if some other metrics have + already been loaded. This condition certainly makes no sense for + recursive calls, so I've just disabled it. Another possibility + would be resetting `decoder->metrics_loaded' to false before + loading each composite component. However, we must restore the + original metrics after finishing the recursion; otherwise we can + get a misaligned glyph. + + . `tt_sbit_decoder_load_bit_aligned' incorrectly handled `x_pos', + causing some glyph components to be shifted too far to the right + (especially noticeable for small sizes). + + Note that support for grayscale bitmaps (not necessarily compound) is + completely broken in ttsbit0.c. + + * src/sfnt/tt_sbit_decoder_load_metrics: Always load metrics. + (tt_sbit_decoder_load_bit_aligned): Handle `x_pos' correctly in case + of `h == height'. + (tt_sbit_decoder_load_compound): Reset metrics after loading + components. + Allocate bitmap. + +2009-03-09 Werner Lemberg + + * builds/unix/configure.raw (version_info): Set to 9:20:3. + +2009-03-03 David Turner + + Protect SFNT kerning table parser against malformed tables. + + This closes Savannah BUG #25750. + + * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): Fix a + bug where a malformed table would be successfully loaded but later + crash the engine during parsing. + +2009-03-03 David Turner + + Update documentation and bump version number to 2.3.9. + + * include/freetype/freetype.h: Bump patch version to 9. + * docs/CHANGES: Document the ABI break in 2.3.8. + * docs/VERSION.DLL: Update version numbers table for 2.3.9. + +2009-03-03 David Turner + + Remove ABI-breaking field in public PS_InfoFontRec definition. + + Instead, we define a new internal PS_FontExtraRec structure to + hold the additionnal field, then place it in various internal + positions of the corresponding FT_Face derived objects. + + * include/freetype/t1tables.h (PS_FontInfoRec): Remove the + `fs_type' field from the public structure. + * include/freetype/internal/psaux.h (T1_FieldLocation): New + enumeration `T1_FIELD_LOCATION_FONT_EXTRA'. + * include/freetype/internal/t1types.h (PS_FontExtraRec): New + structure. + (T1_FontRec, CID_FaceRec): Add it. + + * src/cid/cidload.c (cid_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c: + Adjust FT_STRUCTURE and T1CODE properly to handle `FSType'. + * src/type1/t1load.c (t1_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + + * include/freetype/internal/services/svpsinfo.h (PsInfo service): + Add `PS_GetFontExtraFunc' function typedef. + + * src/base/ftfstype.c: Include FT_INTERNAL_SERVICE_H and + FT_SERVICE_POSTSCRIPT_INFO_H. + (FT_Get_FSType_Flags): Use POSTSCRIPT_INFO service. + + * src/cff/cffdrivr.c (cff_service_ps_info): Updated. + * src/cid/cidriver.c (cid_ps_get_font_extra): New function. + (cid_service_ps_info): Updated. + * src/type1/t1driver.c (t1_ps_get_font_extra): New function. + (t1_service_ps_info): Updated. + * src/type42/t42drivr.c (t42_ps_get_font_extra): New function. + (t42_service_ps_info): Updated. + +2009-03-02 Alexey Kryukov + + Fix handling of EBDT formats 8 and 9. + + The main cycle in `blit_sbit' makes too many iterations: it actually + needs the count of lines in the source bitmap rather than in the + target image. + + * src/sfnt/ttsbit.c (blit_sbit) [FT_CONFIG_OPTION_OLD_INTERNALS]: + Add parameter `source_height' and use it for main loop. + (Load_SBit_Single) [FT_CONFIG_OPTION_OLD_INTERNALS]: Updated. + +2009-02-23 Werner Lemberg + + Fix Savannah bug #25669. + + * src/base/ftadvanc.h (FT_Get_Advances): Fix serious typo. + + * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics): Fix + scaling factor for non-scalable fonts. + + * src/cff/cffdrivr.c (cff_get_advances): Use correct advance width + value to prevent incorrect scaling. + + * docs/CHANGES: Document it. + +2009-02-15 Matt Godbolt + + Fix Savannah bug #25588. + + * builds/unix/ftconfig.in (FT_MulFix_arm): Use correct syntax for + `orr' instruction. + +2009-02-11 Werner Lemberg + + * src/truetype/ttobjs.c (tt_check_trickyness): Add `DFKaiShu'. + Reported by David Bevan . + +2009-02-09 Werner Lemberg + + Fix Savannah bug #25495. + + * src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before + setting metrics and bbox values. This ensures that the check for a + font with neither a `glyf' table nor bitmap strikes can be performed + early enough to set metrics and bbox values too. + +2009-02-04 Werner Lemberg + + Fix Savannah bug #25480. + + * builds/unix/freetype-config.in: For --ftversion, don't use $prefix + but $includedir. + +2009-01-31 Werner Lemberg + + Minor docmaker improvements. + + * src/tools/docmaker/content.py (DocBlock::__init__): Ignore empty + code blocks. + +2009-01-25 Werner Lemberg + + Fix SCANCTRL handling in TTFs. + Problem reported by Alexey Kryukov . + + * src/truetype/ttinterp.c (Ins_SCANCTRL): Fix threshold handling. + +2009-01-23 Werner Lemberg + + Move FT_Get_FSType_Flags to a separate file. + Problem reported by Mickey Gabel . + + * src/base/ftobjs.c (FT_Get_FSType_Flags): Move to... + * src/base/ftfstype.c: This new file. + + * modules.cfg (BASE_EXTENSION): Add ftfstype.c. + + * docs/INSTALL.ANY: Updated. + + * builds/mac/*.txt, builds/amiga/*makefile*, + builds/win32/{visualc,visualce}/freetype.*, builds/symbian/*: + Updated. + +2009-01-22 suzuki toshiya + + * builds/unix/ftsystem.c (FT_Stream_Open): Fix 2 error + messages ending without "\n". + +2009-01-22 suzuki toshiya + + Fix Savannah bug #25347. + + * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Rewind + the stream to the original position passed to this function, + when ft_lookup_PS_in_sfnt_stream() failed. + (Mac_Read_sfnt_Resource): Rewind the stream to the head of + sfnt resource body, when open_face_PS_from_sfnt_stream() + failed. + +2009-01-19 Michael Lotz + + Fix Savannah bug #25355. + + * include/freetype/config/ftconfig.h (FT_MulFix_i386): Make + assembler code work with gcc 2.95.3 (as used by the Haiku project). + Add `cc' register to the clobber list. + +2009-01-18 Werner Lemberg + + Protect FT_Get_Next_Char. + + * src/sfnt/ttcmap.c (tt_cmap4_set_range): Apply fix similar to + change from 2008-07-22. + + Patch from Ronen Ghoshal . + +2009-01-18 Werner Lemberg + + Implement FT_Get_Name_Index for SFNT driver. + + * src/sfnt/sfdriver.c (sfnt_get_name_index): New function. + (sfnt_service_glyph_dict): Use it. + + Problem reported by Truc Truong . + +2009-01-18 Werner Lemberg + + * include/freetype/ftstroke.h (FT_Outline_GetInsideBorder): Fix + documentation. Problem reported by Truc Truong . + + * docs/CHANGES: Updated. + +2009-01-14 Werner Lemberg + + * Version 2.3.8 released. + ========================= + + + Tag sources with `VER-2-3-8'. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.8. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.7/2.3.8/, s/237/238/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. + + * builds/unix/configure.raw (version_info): Set to 9:19:3. + + * docs/release: Updated. + +2009-01-14 Werner Lemberg + + * builds/toplevel.mk (dist): Compress better. + +2009-01-13 Werner Lemberg + + * src/base/ftobjs.c (FT_Get_FSType_Flags): Cast for compilation + with C++. + +2009-01-13 Werner Lemberg + + Don't use stdlib.h and friends directly. + Reported by Mickey Gabel . + + * src/base/ftdbgmem.c: s//FT_CONFIG_STANDARD_LIBRARY_H/. + + * src/gzip/ftgzip.c, src/lzw/ftlzw.c, src/raster/ftmisc.h: + s//FT_CONFIG_STANDARD_LIBRARY_H/. + + * src/autofit/aftypes.h, src/autofit/afhints.c, + src/pshinter/pshalgo.c: s//FT_CONFIG_STANDARD_LIBRARY_H/ + + * src/lzw/ftlzw.c, src/base/ftdbgmem.c: Don't include stdio.h. + +2009-01-12 Werner Lemberg + + Avoid compiler warnings. + + * */*: s/do ; while ( 0 )/do { } while ( 0 )/. + Reported by Sean McBride . + +2009-01-12 Werner Lemberg + + Fix stdlib dependencies. + + Problem reported by Mickey Gabel . + + * include/freetype/config/ftstdlib.h (ft_exit): Removed. Unused. + + * src/autofit/afhints.c, src/base/ftlcdfil.c, src/smooth/ftsmooth.c: + s/memcpy/ft_memcpy/. + * src/psaux/t1decode.c: s/memset/ft_memset/, s/memcpy/ft_memcpy/. + +2009-01-11 Werner Lemberg + + * docs/formats.txt: Add link to PCF specification. + + * include/freetype/ftbdf.h (FT_Get_BDF_Property): Improve + documentation. + +2009-01-09 suzuki toshiya + + * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, + FT_Get_Advances): Change the type of load_flags from FT_UInt32 to + FT_Int32, to match with the flags for FT_Load_Glyph(). + * src/cff/cffdrivr.c (cff_get_advances): Ditto. + * src/truetype/ttdriver.c (tt_get_advances): Ditto. + * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): + Ditto. + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + Ditto. + +2009-01-09 Daniel Zimmermann + + * src/gxvalid/gxvmort.c (gxv_mort_feature_validate): Fix wrong + length check. From Savannah patch #6682. + +2009-01-09 Werner Lemberg + + Fix problem with T1_FIELD_{NUM,FIXED}_TABLE2. + + * src/psaux/psobjs.c (ps_parser_load_field_table): Don't handle + `count_offset' if it is zero (i.e., unused). Otherwise, the first + element of the structure which holds the data is erroneously + modified. Problem reported by Chi Nguyen . + +2009-01-09 suzuki toshiya + + * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, + FT_Get_Advances): Extend the type of load_flags from FT_UInt to + FT_UInt32, to pass 32-bit flags on 16bit platforms. + * src/cff/cffdrivr.c (cff_get_advances): Ditto. + * src/truetype/ttdriver.c (tt_get_advances): Ditto. + * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): + Ditto. + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + Ditto. + +2009-01-09 suzuki toshiya + + * src/base/ftobjs.c (FT_Done_Library): Issue an error message when + FT_Done_Face() cannot free all faces. If the list of the opened + faces includes broken face which FT_Done_Face() cannot free, + FT_Done_Library() retries FT_Done_Face() and it can fall into + an endless loop. See the discussion: + http://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html + http://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html + +2009-01-07 Werner Lemberg + + * docs/CHANGES: Document new key `a' in ftdiff. + +2009-01-06 Werner Lemberg + + * autogen.sh: Don't use GNUisms while calling sed. Problem reported + by Sean McBride. + +2009-01-06 Werner Lemberg + + * src/base/ftbitmap.c (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_LCD + and FT_PIXEL_MODE_LCD_V. Problem reported by Chi Nguyen + . + +2009-01-06 Diego Pettenò + + * builds/unix/configure.raw: Don't call AC_CANONICAL_BUILD and + AC_CANONICAL_TARGET and use $host_os only. A nice explanation for + this change can be found at + http://blog.flameeyes.eu/s/canonical-target. + + From Savannah patch #6712. + +2009-01-06 Sean McBride + + * src/base/ftdbgmem.c (_debug_mem_dummy): Make it static. + + * src/base/ftmac.c: Remove some #undefs. + +2008-12-26 Werner Lemberg + + Set `face_index' field in FT_Face for all font formats. + + * cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init), + sfnt/sfobjs.c (sfnt_init_face): Do it. + + * docs/CHANGES: Document it. + +2008-12-22 Steve Grubb + + * builds/unix/ftsystem.c (FT_Stream_Open): Reject zero-length files. + Patch from Savannah bug #25151. + +2008-12-21 Werner Lemberg + + * src/pfr/pfrdrivr.c, src/winfonts/winfnt.c, src/cache/ftcmanag.c, + src/smooth/ftgrays.c, src/base/ftobjc.s, src/sfobjs.c: + s/_Err_Bad_Argument/_Err_Invalid_Argument/. The former is for + errors in the bytecode interpreter only. + +2008-12-21 Werner Lemberg + + * src/base/ftpfr.c (FT_Get_PFR_Metrics): Protect against NULL + arguments. + Fix return value for non-PFR fonts. Both problems reported by Chi + Nguyen . + +2008-12-21 anonymous + + FT_USE_MODULE declares things as: + + extern const FT_Module_Class + + (or similar for C++). However, the actual types of the variables + being declared are often different, e.g., FT_Driver_ClassRec or + FT_Renderer_Class. (Some are, indeed, FT_Module_Class.) + + This works with most C compilers (since those structs begin with an + FT_Module_Class struct), but technically it's undefined behavior. + + To quote the ISO/IEC 9899:TC2 final committee draft, section 6.2.7 + paragraph 2: + + All declarations that refer to the same object or function shall + have compatible type; otherwise, the behavior is undefined. + + (And they are not compatible types.) + + Most C compilers don't reject (or even detect!) code which has this + issue, but the GCC LTO development branch compiler does. (It + outputs the types of the objects while generating .o files, along + with a bunch of other information, then compares them when doing the + final link-time code generation pass.) + + Patch from Savannah bug #25133. + + * src/base/ftinit.c (FT_USE_MODULE): Include variable type. + + * builds/amiga/include/freetype/config/ftmodule.h, + include/freetype/config/ftmodule.h, */module.mk: Updated to declare + pass correct types to FT_USE_MODULE. + +2008-12-21 Hongbo Ni + + * src/autofit/aflatin.c (af_latin_hint_edges), + src/autofit/aflatin2.c (af_latin2_hint_edges), src/autofit/afcjk.c + (af_cjk_hint_edges): Protect against division by zero. This fixes + Savannah bug #25124. + +2008-12-18 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-12-18 Bevan, David + + Provide API for accessing embedding and subsetting restriction + information. + + * include/freetype.h (FT_FSTYPE_INSTALLABLE_EMBEDDING, + FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING, + FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING, FT_FSTYPE_EDITABLE_EMBEDDING, + FT_FSTYPE_NO_SUBSETTING, FT_FSTYPE_BITMAP_EMBEDDING_ONLY): New + macros. + (FT_Get_FSType_Flags): New function declaration. + + * src/base/ftobjs.c (FT_Get_FSType_Flags): New function. + + * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c + (t42_keywords): Handle `FSType'. + + * include/freetype/t1tables.h (PS_FontInfoRec): Add `fs_type' field. + +2008-12-17 Werner Lemberg + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Don't use internal + macros so that copying the source code into an application works + out of the box. + +2008-12-17 Werner Lemberg + + * include/freetype/ftsynth.h, src/base/ftsynth.c: Move + FT_GlyphSlot_Own_Bitmap to... + * include/freetype/ftbitmap.h, src/base/ftbitmap.c: These files. + + * docs/CHANGES: Document it. + +2008-12-10 Werner Lemberg + + Generalize the concept of `tricky' fonts by introducing + FT_FACE_FLAG_TRICKY to indicate that the font format's hinting + engine is necessary for correct rendering. + + At the same time, slightly modify the behaviour of tricky fonts: + FT_LOAD_NO_HINTING is now ignored. To really force raw loading + of tricky fonts (without hinting), both FT_LOAD_NO_HINTING and + FT_LOAD_NO_AUTOHINT must be used. + + Finally, tricky TrueType fonts always use the bytecode interpreter + even if the patented code is used. + + * include/freetype/freetype.h (FT_FACE_FLAG_TRICKY, FT_IS_TRICKY): + New macros. + + * src/truetype/ttdriver.c (Load_Glyph): Handle new load flags + semantics as described above. + + * src/truetype/ttobjs.c (tt_check_trickyness): New function, using + code of ... + (tt_face_init): This function, now simplified and updated to new + semantics. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't use autohinter for tricky + fonts. + + * docs/CHANGES: Document it. + +2008-12-09 Werner Lemberg + + Really fix Savannah bug #25010: An SFNT font with neither outlines + nor bitmaps can be considered as containing space `glyphs' only. + + * src/truetype/ttpload.c (tt_face_load_loca): Handle the case where + a `glyf' table is missing. + + * src/truetype/ttgload.c (load_truetype_glyph): Abort if we have no + `glyf' table but a non-zero `loca' entry. + (tt_loader_init): Handle missing `glyf' table. + + * src/base/ftobjs.c (FT_Load_Glyph): Undo change 2008-12-05. + + * src/sfnt/sfobjs.c (sfnt_load_face): A font with neither outlines + nor bitmaps is scalable. + +2008-12-05 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_uniranges): Add more ranges. This + fixes Savannah bug #21190 which also provides a basic patch. + +2008-12-05 Werner Lemberg + + * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value + 0x100 instead of 0x10000; the latter value is already occupied by + FT_LOAD_TARGET_LIGHT. Bug reported by James Cloos. + + + Handle SFNT with neither outlines nor bitmaps. This fixes Savannah + bug #25010. + + * src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither + outlines nor bitmaps. + + * src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there + is no table with glyphs. + + + * src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging + message. + +2008-12-01 Werner Lemberg + + GDEF tables need `glyph_count' too for validation. Problem reported + by Chi Nguyen . + + * src/otvalid/otvgdef.c (otv_GDEF_validate), src/otvalid/otvalid.h + (otv_GDEF_validate), src/otvalid/otvmod.c (otv_validate): Pass + `glyph_count'. + +2008-11-29 Werner Lemberg + + * src/autofit/afcjk.c, src/base/ftoutln.c, src/base/ftrfork.c, + src/bdf/bdfdrivr.c, src/gxvalid/gxvmorx.c, src/otvalid/otvmath.c, + src/pcf/pcfdrivr.c, src/psnames/pstables.h, src/smooth/ftgrays.c, + src/tools/glnames.py, src/truetype/ttinterp.c, src/type1/t1load.c, + src/type42/t42objs.c, src/winfonts/winfnt.c: Fix compiler warnings + (Atari PureC). + +2008-11-29 James Cloos + + * src/type/t1load.c (mm_axis_unmap): Revert previous patch and fix + it correctly by using FT_INT_TO_FIXED (FreeType expects 16.16 values + in the /BlendDesignMap space). + +2008-11-29 James Cloos + + * src/type1/t1load.c (mm_axis_unmap): `blend_points' is FT_Fixed*, + whereas `design_points' is FT_Long*. Therefore, return blend rather + than design points. + +2008-11-27 Werner Lemberg + + * src/cff/cffparse.c (cff_parse_real): Handle more than nine + significant digits correctly. This fixes Savannah bug #24953. + +2008-11-25 Daniel Zimmermann + + * src/base/ftstream.c (FT_Stream_ReadFields): Don't access stream + before the NULL check. From Savannah patch #6681. + +2008-11-24 Werner Lemberg + + Fixes from the gnuwin32 port. + + * src/base/ftlcdfil.c: s/EXPORT/EXPORT_DEF/. + + * src/base/ftotval.c: Include FT_OPENTYPE_VALIDATE_H. + + * src/psaux/psobjs.c (ps_table_add): Check `length'. + +2008-11-15 Werner Lemberg + + * src/truetype/ttinterp.c (tt_default_graphics_state): The default + value for `scan_type' is zero, as confirmed by Greg Hitchcock from + Microsoft. Problem reported by Michal Nowakowski + . + +2008-11-12 Tor Andersson + + * src/cff/cffdrivr.c (cff_get_cmap_info): Initialize `format' field. + This fixes Savannah bug #24819. + +2008-11-08 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Remove #if 0/#endif guards + since OpenType version 1.5 has been released. + + * include/ttnameid.h (TT_NAME_ID_WWS_FAMILY, + TT_NAME_ID_WWS_SUBFAMILY): New macros for OpenType 1.5. + (TT_URC_COPTIC, TT_URC_VAI, TT_URC_NKO, TT_URC_BALINESE, + TT_URC_PHAGSPA, TT_URC_NON_PLANE_0, TT_URC_PHOENICIAN, + TT_URC_TAI_LE, TT_URC_NEW_TAI_LUE, TT_URC_BUGINESE, + TT_URC_GLAGOLITIC, TT_URC_YIJING, TT_URC_SYLOTI_NAGRI, + TT_URC_LINEAR_B, TT_URC_ANCIENT_GREEK_NUMBERS, TT_URC_UGARITIC, + TT_URC_OLD_PERSIAN, TT_URC_SHAVIAN, TT_URC_OSMANYA, + TT_URC_CYPRIOT_SYLLABARY, TT_URC_KHAROSHTHI, TT_URC_TAI_XUAN_JING, + TT_URC_CUNEIFORM, TT_URC_COUNTING_ROD_NUMERALS, TT_URC_SUNDANESE, + TT_URC_LEPCHA, TT_URC_OL_CHIKI, TT_URC_SAURASHTRA, TT_URC_KAYAH_LI, + TT_URC_REJANG, TT_URC_CHAM, TT_URC_ANCIENT_SYMBOLS, + TT_URC_PHAISTOS_DISC, TT_URC_OLD_ANATOLIAN, TT_URC_GAME_TILES): New + macros for OpenType 1.5. + +2008-11-08 Wenlin Institute + + * src/base/ftobjs.c (ft_glyphslot_free_bitmap): Protect against + slot->internal == NULL. Reported by Graham Asher. + +2008-11-08 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error + code so that memory allocation problems can be distinguished from + missing table entries. Reported by Graham Asher. + (GET_NAME): New macro. + (sfnt_load_face): Use it. + +2008-11-05 Werner Lemberg + + * devel/ftoption.h, include/freetype/config/ftoption.h + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Undefine + TT_CONFIG_OPTION_UNPATENTED_HINTING. This fixes the return value of + `FT_Get_TrueType_Engine_Type' (and makes it work as documented). + Reported in bug #441638 of bugzilla.novell.com. + + * docs/CHANGES: Document it. + +2008-11-03 Werner Lemberg + + * src/type1/t1load.c (parse_subrs): Use an endless loop. There are + fonts (like HELVI.PFB version 003.001, used on OS/2) which define + some `subrs' elements more than once. Problem reported by Peter + Weilbacher . + +2008-10-15 Graham Asher + + * src/sfnt/ttpost.c (tt_post_default_names): Add `const'. + +2008-10-15 David Turner + + * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Disambiguate for + meddlesome compilers' warning against `for ( ...; ...; ...) ;'. + +2008-10-14 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Remove compiler warning. + Suggested by Bram Tassyns in Savannah patch #6651. + +2008-10-12 Graham Asher + + * src/sfnt/sfobjs.c (sfnt_load_face): Fix computation of + `underline_position'. + +2008-10-12 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-10-09 suzuki toshiya + + Fix Savannah bug #24468. + + According to include/freetype/internal/ftobjs.h, the appropriate + type to interchange single character codepoint is FT_UInt32. It + should be distinguished from FT_UInt which can be 16bit integer. + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Change the type + of the second argument `pcharcode' from FT_UInt* to FT_UInt32*. + (tt_cmap4_char_map_binary): Ditto. + (tt_cmap14_get_nondef_chars): Change the type of return value + from FT_UInt* to FT_UInt32*. + +2008-10-08 John Tytgat + + Fix Savannah bug #24485. + + * src/type1/t1load.c (parse_charstrings): Assure that we always have + a .notdef glyph. + +2008-10-05 suzuki toshiya + + * src/base/ftmac.c: Include FT_TRUETYPE_TAGS_H for multi build. + * builds/mac/ftmac.c: Ditto. + +2008-10-05 suzuki toshiya + + * include/freetype/tttags.h (TTAG_TYP1, TTAG_typ1): Fix definitions. + * src/base/ftobjs.c: Include FT_TRUETYPE_TAGS_H. + +2008-10-05 suzuki toshiya + + * src/sfnt/sfobjs.c (sfnt_open_font): Allow `typ1' version tag in + the beginning of sfnt container. + * src/sfnt/ttload.c (check_table_dir): Return + `SFNT_Err_Table_Missing' when sfnt table directory structure is + correct but essential tables for TrueType fonts (`head', `bhed' or + `SING') are missing. Other errors are returned by + SFNT_Err_Unknown_File_Format. + + * src/base/ftobjs.c (FT_Open_Face): When TrueType driver returns + `FT_Err_Table_Missing', try `open_face_PS_from_sfnt_stream'. It is + enabled only when old mac font support is configured. + +2008-10-04 suzuki toshiya + + * include/freetype/tttags.h (TTAG_CID, TTAG_FOND, TTAG_LWFN, + TTAG_POST, TTAG_sfnt, TTAG_TYP1, TTAG_typ1): New tags to simplify + the repeated calculations of these values in ftobjs.c and ftmac.c. + * src/base/ftobjs.c: Replace all FT_MAKE_TAG by new tags. + * src/base/ftmac.c: Ditto. + * builds/mac/ftmac.c: Ditto. + +2008-10-04 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt_stream): Remove wrong + initialization of *is_sfnt_cid. + +2008-10-04 Werner Lemberg + + * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Remove compiler + warnings. + +2008-10-04 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Replaced by... + (ft_lookup_PS_in_sfnt_stream): This. + (open_face_PS_from_sfnt_stream): New function. It checks whether + the stream is sfnt-wrapped Type1 PS font or sfnt-wrapped CID-keyed + font, then try to open a face for given face_index. + (Mac_Read_sfnt_Resource): Replace the combination of + `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' by + `open_face_PS_from_sfnt_stream'. + * src/base/ftmac.c (FT_New_Face_From_SFNT): Ditto. + * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. + * src/base/ftbase.h: Remove `ft_lookup_PS_in_sfnt' and add + `open_face_PS_from_sfnt_stream'. + +2008-10-03 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Set *is_sfnt_cid to + FALSE if neither `CID ' nor `TYP1' is found in the sfnt container. + +2008-10-03 suzuki toshiya + + * include/freetype/config/ftconfig.h: Define FT_MACINTOSH when SC or + MrC compiler of MPW is used. These compilers do not define the + macro __APPLE__ by themselves. + * builds/unix/ftconfig.in: Ditto. + * builds/vms/ftconfig.h: Ditto. + * src/base/ftbase.c: Use FT_MACINTOSH instead of __APPLE__, to + include ftmac.c if FreeType 2 is built by MPW. + * src/base/ftobjs.c: Use FT_MACINTOSH instead of __APPLE__, to + enable shared functions for ftmac.c if FreeType 2 is built by MPW. + + * builds/mac/ftmac.c: Include ftbase.h. + (memory_stream_close): Removed. + (new_memory_stream): Ditto. + (open_face_from_buffer): Removed. Use the implementation in + ftobjs.c. + (ft_lookup_PS_in_sfnt): Ditto. + + * builds/mac/FreeType.m68k_far.make.txt: Build ftmac.c as an + included part of ftbase.c, to share the functions in ftobjs.c. The + rule compiling ftmac.c separately is removed and the rule copying + ftbase.c from src/base/ftbase.c to builds/mac/ftbase.c is added. + * builds/mac/FreeType.m68k_cfm.make.txt: Ditto. + * builds/mac/FreeType.ppc_classic.make.txt: Ditto. + * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. + +2008-10-02 Bram Tassyns + + * src/cff/cffgload.c (cff_slot_load): Map CID 0 to GID 0. This + fixes Savannah bug #24430. + +2008-10-02 Werner Lemberg + + * builds/freetype.mk (BASE_H): Rename to... + (INTERNAL_H): This. + (FREETYPE_H): Updated. + * src/base/rules.mk: (BASE_OBJ_S, OBJ_DIR/%.$O): Add BASE_H. + * src/bdf/rules.mk (BDF_DRV_H): Add bdferror.h. + * src/cache/rules.mk (CACHE_DRV_H): Add ftccache.h and ftcsbits.h. + * src/pcf/rules.mk (PCF_DRV_H): Add pcfread.h. + * src/raster/rules.mk (RASTER_DRV_H): Add ftmisc.h. + * src/type42/rules.mk (T42_DRV_H): Add t42types.h. + +2008-10-02 suzuki toshiya + + * src/base/ftbase.h: New file to declare the private utility + functions shared by the sources of base modules. Currently, + `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' are declared to + share between ftobjs.c and ftmac.c. + + * src/base/rule.mk: Add ftbase.h. + + * src/base/ftobjs.c: Include ftbase.h. + (memory_stream_close): Build on any platform when old MacOS font + support is enabled. + (new_memory_stream): Ditto. + (open_face_from_buffer): Build on any platform when old MacOS font + support is enabled. The counting of the face in a font file is + slightly different between Carbon-dependent parser and Carbon-free + parser. They are merged with the platform-specific conditional. + (ft_lookup_PS_in_sfnt): Ditto. + + * src/base/ftmac.c: Include ftbase.h. + (memory_stream_close): Removed. + (new_memory_stream): Ditto. + (open_face_from_buffer): Removed. Use the implementation in + ftobjs.c. + (ft_lookup_PS_in_sfnt): Ditto. + +2008-10-02 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): `psnames_error' is only needed + if TT_CONFIG_OPTION_POSTSCRIPT_NAMES is defined. + +2008-10-01 Werner Lemberg + + * src/truetype/ttobjs.c (tt_face_done), src/cff/cffobjs.c + (cff_face_done), src/pfr/pfrobjs.c (pfr_face_done), + src/pcf/pcfdrivr.c (PCF_Face_Done), src/cid/cidobjs.c + (cid_face_done), src/bdf/bdfdrivr. (BDF_Face_Done), + src/sfnt/sfobjs.c (sfnt_face_done): Protect against face == 0. + Reported by Graham Asher. + +2008-09-30 suzuki toshiya + + * src/base/rules.mk: Add conditional source to BASE_SRC, for `make + multi' on Mac OS X. If the macro $(ftmac_c) is defined, + $(BASE_DIR)/$(ftmac_c) is added to BASE_SRC. In a normal build, the + lack of ftmac.c in BASE_SRC is not serious because ftbase.c includes + ftmac.c. + * builds/unix/unix-def.in: Add a macro definition of $(ftmac_c). + * builds/unix/configure.raw: Add procedure to set up appropriate + value of $(ftmac_c) with the consideration of the availability of + Carbon framework. + +2008-09-30 suzuki toshiya + + * src/base/Jamfile: Add target for multi build by jam on Mac OS X. + * src/base/ftobjs.c (FT_New_Face): Fix the condition to include this + function for MPW building. It is synchronized the condition to + include ftmac.c source into ftbase.c. + +2008-09-22 Werner Lemberg + + * src/cff/cffgload.c (CFF_Operator, cff_argument_counts, + cff_decoder_parse_charstrings): Handle (invalid) + `callothersubr' and `pop' instructions. + +2008-09-22 John Tytgat + + Fix Savannah bug #24307. + + * include/freetype/internal/t1types.h (CID_FaceRec), + src/type42/t42types.h (T42_FaceRec): Comment out `afm_data'. + +2008-09-21 Werner Lemberg + + * src/smooth/ftgrays.c (gray_raster_render): Don't dereference + `target_map' if FT_RASTER_FLAG_DIRECT is set. Problem reported by + Stephan T. Lavavej . + +2008-09-21 suzuki toshiya + + * src/otvalid/Jamfile: Add missing target `otvmath' for multi build + by jam. + * src/sfnt/Jamfile: Add missing target `ttmtx' for multi build by + jam. + +2008-09-20 Werner Lemberg + + * src/smooth/ftgrays.c (gray_find_cell): Fix threshold. The values + passed to this function are already `normalized'. Problem reported + by Stephan T. Lavavej . + + * docs/CHANGES: Document it. + +2008-09-20 Werner Lemberg + + * src/base/ftoutln.c: Include FT_INTERNAL_DEBUG_H. + (FT_Outline_Decompose): Decorate with tracing messages. + + * src/smooth/ftgrays.c [DEBUG_GRAYS]: Replace with + FT_DEBUG_LEVEL_TRACE. + [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: Include stdio.h and + stdarg.h. + + (FT_TRACE) [_STANDALONE_]: Remove. + (FT_Message) [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: New function. + (FT_TRACE5, FT_TRACE7) [_STANDALONE_]: New macros. + (FT_ERROR) [_STANDALONE_]: Updated. + + (gray_hline) [FT_DEBUG_LEVEL_TRACE]: Fix condition. + Use FT_TRACE7. + (gray_dump_cells): Make it `static void'. + (gray_convert_glyph): Use FT_TRACE7. + + (FT_Outline_Decompose) [_STANDALONE_]: Synchronize with version in + ftoutln.c. + + * src/base/ftadvanc.c (FT_Get_Advance, FT_Get_Advances): Use + FT_ERROR_BASE. + + * docs/formats.txt: Updated. + +2008-09-19 suzuki toshiya + + * src/base/ftmac.c: Import sfnt-wrapped Type1 and sfnt-wrapped + CID-keyed font support. + * builds/mac/ftmac.c: Ditto. + +2008-09-19 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Fix double free bug in + sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font support code. + `open_face_from_buffer' frees the passed buffer if it cannot open a + face from the buffer, so the caller must not free it. + +2008-09-19 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Add initial support + for sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font. + (ft_lookup_PS_in_sfnt): New function to look up `TYP1' or `CID ' + table in sfnt table directory. It is used before loading TrueType + font driver. + + * docs/CHANGES: Add note about the current status of sfnt-wrapped + Type1 and sfnt-wrapped CID-keyed font support. + +2008-09-18 Werner Lemberg + + * src/base/ftsystem.c (FT_Done_Memory): Use ft_sfree directly for + orthogonality (ft_free and ft_sfree could belong to different memory + pools). This fixes Savannah bug #24297. + +2008-09-18 suzuki toshiya + + * src/cff/cffobjs.c (cff_face_init): Use TTAG_OTTO defined + in ttags.h instead of numerical value 0x4F54544FL. + +2008-09-16 Werner Lemberg + + * src/cff/cffgload.h, src/cff/cffgload.c + (cff_decoder_set_width_only): Eliminate function call. + +2008-09-15 George Williams + + Fix Savannah bug #24179, reported by Bram Tassyns. + + * src/type1/t1load.c (mm_axis_unmap, T1_Get_MM_Var): Fix computation + of default values. + +2008-09-15 Werner Lemberg + + * src/tools/glnames.py (main): Surround `ft_get_adobe_glyph_index' + and `ft_adobe_glyph_list' with FT_CONFIG_OPTION_ADOBE_GLYPH_LIST to + prevent unconditional definition. This fixes Savannah bug #24241. + + * src/psnames/pstables.h: Regenerated. + +2008-09-13 Werner Lemberg + + * autogen.sh, builds/unix/configure.raw, + include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor + beautifying. + + * include/freetype/ftadvanc.h, include/freetype/ftgasp.h, + include/freetype/ftlcdfil.h: Protect against FreeType 1. + Some other minor fixes. + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + +2008-09-11 Werner Lemberg + + * src/base/ftbase.c: Include ftadvanc.c. + +2008-09-11 suzuki toshiya + + * builds/unix/ftconfig.in: Duplicate the cpp computation of + FT_SIZEOF_{INT|LONG} from include/freetype/config/ftconfig.h. + (FT_USE_AUTOCONF_SIZEOF_TYPES): New macro. If defined, the cpp + computation is disabled and the statically configured sizes are + used. This fixes Savannah bug #21250. + + * builds/unix/configure.raw: Add the checks to compare the cpp + computation results of the bit length of int and long versus the + sizes detected by running `configure'. If the results are + different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to prioritize the + results. + New option --{enable|disable}-biarch-config is added to define or + undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually. + +2008-09-05 suzuki toshiya + + * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or + ApplicationService framework is missing. Although this value is not + used in building of FreeType2, it is written in `freetype2.pc' and + `freetype-config'. + +2008-09-01 david turner + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap + index to mean `use default cached FT_Face's charmap'. This fixes + Savannah bug #22625. + * include/freetype/ftcache.h: Document it. + + + Make FT_MulFix an inlined function. This is done to speed up + FreeType a little (on x86 3% when loading+hinting, 10% when + rendering, ARM savings are more important though). Disable this by + undefining FT_CONFIG_OPTION_INLINE_MULFIX. + + Use of assembler code can now be controlled with + FT_CONFIG_OPTION_NO_ASSEMBLER. + + * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_arm): New assembler + implementation. + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_i386): Assembler + implementation taken from `ftcalc.c'. + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MULFIX_ASSEMBLER): New macro + which is defined to the platform-specific assembler implementation + of FT_MulFix. + [FT_CONFIG_OPTION_INLINE_MULFIX && FT_MULFIX_ASSEMBLER] + (FT_MULFIX_INLINED): New macro. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_NO_ASSEMBLER, + FT_CONFIG_OPTION_INLINE_MULFIX): New macros. + + * include/freetype/freetype.h: Updated to handle FT_MULFIX_INLINED. + + * src/base/ftcalc.c: Updated to use FT_MULFIX_ASSEMBLER and + FT_MULFIX_INLINED. + + + Add a new header named FT_ADVANCES_H declaring some new APIs to + extract the advances of one or more glyphs without necessarily + loading their outlines. Also provide `fast loaders' for the + TrueType, Type1, and CFF font drivers (more to come later). + + * src/base/ftadvanc.c, include/freetype/ftadvanc.h: New files. + + * include/freetype/config/ftheader.h (FT_ADVANCES_H): New macro. + * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): New macro. + + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + `flags' and `advances' are now of type `FT_UInt' and `FT_Fixed', + respectively. + + * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC): Add + ftadvanc.c. + + * src/cff/cffdrivr.c (cff_get_advances): New function. + (cff_driver_class): Register it. + + * src/cff/cffgload.c (cff_decoder_set_width_only): New function. + (cff_decoder_parse_charstrings): Handle `width_only'. + (cff_slot_load): Handle FT_LOAD_ADVANCE_ONLY. + + * src/cff/cffgload.h (cff_decoder): New element `width_only'. + (cff_decoder_set_width_only): New declaration. + + * src/truetype/ttdriver.c (tt_get_advances): New function. + (tt_driver_class): Register it. + + * src/truetype/ttgload.c (Get_HMetrics, Get_VMetrics): Renamed to... + (TT_Get_HMetrics, TT_Get_VMetrics): This. + Update callers. + * src/truetype/ttgload.h: Declare them. + + * src/type1/t1gload.h, src/type1/t1gload.c (T1_Get_Advances): New + function. + * src/type1/t1driver.c (t1_driver_class): Register T1_Get_Advances. + + + Add checks for minimum version of the `autotools' stuff. + + * autogen.sh: Implement it. + (get_major_version, get_minor_version, get_patch_version, + compare_to_minimum_version, check_tool_version): New auxiliary + functions. + + * README.CVS: Document it. + +2008-08-29 suzuki toshiya + + * src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in + ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ). + +2008-08-28 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Protect against infinite + loop. This fixes Savannah bug #24150 (where a patch has been posted + too). + +2008-08-23 Werner Lemberg + + * src/type/t1afm.c (compare_kern_pairs), src/pxaux/afmparse.c + (afm_compare_kern_pairs): Fix comparison. This fixes Savannah bug + #24119. + +2008-08-19 suzuki toshiya + + * src/base/ftobjs.c (FT_Stream_New): Initialize *astream always, + even if passed library or arguments are invalid. This fixes a bug + that an uninitialized stream is freed when an invalid library handle + is passed. Originally proposed by Mike Fabian, 2008/08/18 on + freetype-devel. + (FT_Open_Face): Ditto (stream). + (load_face_in_embedded_rfork): Ditto (stream2). + +2008-08-18 suzuki toshiya + + * src/base/ftmac.c: Add a fallback to guess the availability of the + `ResourceIndex' type. It is used when built without configure + (e.g., a build with Jam). + * builds/mac/ftmac.c: Ditto. + * builds/unix/configure.raw: Set HAVE_TYPE_RESOURCE_INDEX to 1 or 0 + explicitly, even if `ResourceIndex' is unavailable. + +2008-08-18 suzuki toshiya + + * builds/unix/configure.raw: In checking of Mac OS X features, + all-in-one header file `Carbon.h' is replaced by the minimum + header file `CoreServices.h', similar to current src/base/ftmac.c. + +2008-08-18 suzuki toshiya + + * src/sfnt/ttcmap.c (tt_cmap2_validate): Skip the validation of + sub-header when its code_count is 0. Many Japanese Dynalab fonts + include such an empty sub-header (code_count == 0, first_code == 0 + delta == 0, but offset != 0) as the second sub-header in SJIS cmap. + +2008-08-04 Werner Lemberg + + * src/type1/t1tokens.h: Handle `ForceBold' keyword. This fixes + Savannah bug #23995. + + * src/cid/cidload.c (parse_expansion_factor): New callback function. + (cid_field_records): Use it for `ExpansionFactor'. + * src/cod/cidtoken.h: Handle `ForceBold' keyword. + Don't handle `ExpansionFactor'. + +2008-08-04 Bram Tassyns + + * src/cff/cffparse.c (cff_parse_fixed_scaled): Fix thinko which + resulted in incorrect scaling. This fixes Savannah bug #23973. + +2008-08-04 Werner Lemberg + + Be more tolerant w.r.t. invalid entries in SFNT table directory. + + * src/sfnt/ttload.c (check_table_dir): Ignore invalid entries and + adjust table count. + Add more trace messages. + (tt_face_load_font_dir): Updated. + +2008-07-30 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): No longer + assume that the first argument on the stack is the bottom-most + element. Two reasons: + + o According to people from Adobe it is missing in the Type 2 + specification that pushing of additional, superfluous arguments + on the stack is prohibited. + + o Acroread in general handles fonts differently, namely by popping + the number of arguments needed for a particular operand (as a PS + interpreter would do). In case of buggy fonts this causes a + different interpretation which of the elements on the stack are + superfluous and which not. + + Since there are CFF subfonts (embedded in PDFs) which rely on + Acroread's behaviour, FreeType now does the same. + +2008-07-27 Werner Lemberg + + Add extra mappings for `Tcommaaccent' and `tcommaaccent'. This + fixes Savannah bug #23940. + + * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): Rename to... + (EXTRA_GLYPH_LIST_SIZE): This. + Increase by 2. + (ft_wgl_extra_unicodes): Rename to... + (ft_extra_glyph_unicodes): This. + Add two code values. + (ft_wgl_extra_glyph_names): Rename to... + (ft_extra_glyph_names): This. + Add two glyphs. + (ft_wgl_extra_glyph_name_offsets): Rename to... + (ft_extra_glyph_name_offsets): This. + Add two offsets. + + (ps_check_wgl_name, ps_check_wgl_unicode): Rename to... + (ps_check_extra_glyph_name, ps_check_extra_glyph_unicode): This. + Updated. + (ps_unicodes_init): Updated. + +2008-07-26 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_prepare, + cff_decoder_parse_charstrings): Improve debug output. + +2008-07-22 Martin McBride + + * src/sfnt/ttcmap.c (tt_cmap4_validate, tt_cmap4_char_map_linear, + tt_cmap4_char_map_binary): Handle fonts which treat the last segment + specially. According to the specification, such fonts would be + invalid but acroread accepts them. + +2008-07-16 Jon Foster + + * src/pfr/pfrdrivr.c (pfr_get_advance): Fix off-by-one error. + + * src/base/ftcalc.c (FT_MulFix): Fix portability issue. + + * src/sfnt/ttpost.c (MAC_NAME) [!FT_CONFIG_OPTION_POSTSCRIPT_NAMES]: + Fix compiler warning. + +2008-07-16 Werner Lemberg + + Handle CID-keyed fonts wrapped in an SFNT (with cmaps) correctly. + + * src/cff/cffload.c (cff_font_load): Pass `pure_cff'. + Invert sids table only if `pure_cff' is set. + * src/cff/cffload.h: Udpated. + + * src/cff/cffobjs.c (cff_face_init): Updated. + Set FT_FACE_FLAG_CID_KEYED only if pure_cff is set. + + * docs/CHANGES: Updated. + +2008-07-09 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_loca): Handle buggy fonts + where num_locations < num_glyphs. Problem reported by Ding Li. + +2008-07-05 Werner Lemberg + + Since FreeType uses `$(value ...)', we now need GNU make 3.80 or + newer. This fixes Savannah bug #23648. + + * configure: zsh doesn't like ${1+"$@"}. + Update needed GNU make version. + * builds/toplevel.mk: Check for `$(eval ...)'. + * docs/INSTALL.GNU, docs/INSTALL.CROSS, docs/INSTALL.UNIX: Document + it. + +2008-07-04 Werner Lemberg + + * src/raster/ftraster.c (Draw_Sweep): If span is smaller than one + pixel, only check for dropouts if neither start nor end point lies + on a pixel center. This fixes Savannah bug #23762. + +2008-06-29 Werner Lemberg + + * Version 2.3.7 released. + ========================= + + + Tag sources with `VER-2-3-7'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.7. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.6/2.3.7/, s/236/237/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. + + * builds/unix/configure.raw (version_info): Set to 9:18:3. + + * docs/release: Updated. + +2008-06-28 Werner Lemberg + + * src/ftglyph.c (FT_Matrix_Multiply, FT_Matrix_Invert): Move to... + * src/ftcalc.c: Here. This fixes Savannah bug #23729. + +2008-06-27 Werner Lemberg + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Test for intersections which + degenerate to a single point can be ignored; this has been confirmed + by Greg Hitchcock from Microsoft. (This was commented out code.) + +2008-06-26 Werner Lemberg + + Improve navigation in API reference. + + * src/tools/docmaker/tohtml.py (html_header_3): Renamed to... + (html_header_6): This. + (html_header_3, html_header_3i, html_header_4, html_header_5, + html_header_5t): New strings. + (toc_footer_start, toc_footer_end): New strings. + (HtmlFormatter::html_header): Updated. + (HtmlFormatter::html_index_header, HtmlFormatter::html_toc_header): + New strings. + (HtmlFormatter::index_enter): Use `html_index_header'. + (HtmlFormatter::index_exit): Print `html_footer'. + (HtmlFormatter::toc_enter): Use `html_toc_header'. + (HtmlFormatter::toc_exit): Print proper footer. + + Convert ~ to non-breakable space. + + * src/tools/docmaker/tohtml.py (make_html_para): Implement it. + Update header files accordingly. + +2008-06-24 suzuki toshiya + + * builds/unix/configure.raw: Check type `ResourceIndex' explicitly + and define HAVE_TYPE_RESOURCE_INDEX if it is defined. Mac OS X 10.5 + bundles 10.4u SDK with MAC_OS_X_VERSION_10_5 macro but without + ResourceIndex type definition. The macro does not inform the type + availability. + * src/base/ftmac.c: More parentheses are inserted to clarify the + conditionals to disable legacy APIs in `10.5 and later' cases. If + HAVE_TYPE_RESOURCE_INDEX is not defined, ResourceIndex is defined. + +2008-06-24 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_SCANTYPE): Don't check rendering + mode. + + * src/raster/ftraster.c (Render_Glyph, Render_Gray_Glyph, + Draw_Sweep): No-dropout mode is value 2, not value 0. + (Draw_Sweep): Really skip dropout handling for no-dropout mode. + +2008-06-24 Werner Lemberg + + * src/psaux/psobjs.c (t1_builder_close_contour): Don't add contour + if it consists of one point only. Based on a patch from Savannah + bug #23683 (from John Tytgat). + +2008-06-22 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Glyph): Protect bytecode stuff + with IS_HINTED. + + * docs/CHANGES: Updated. + +2008-06-22 suzuki toshiya + + * builds/unix/configure.raw: If CFLAGS has `-isysroot XXX' option + but LDFLAGS does not, import it to LDFLAGS. The option is used to + specify non-default SDK on Mac OS X (e.g., universal binary SDK for + Mac OS X 10.4 on PowerPC platform). Although Apple TechNote 2137 + recommends to add the option only to CFLAGS, LDFLAGS should include + it because libfreetype.la is built with -no-undefined. This fixes a + bug reported by Ryan Schmidt in MacPorts, + http://trac.macports.org/ticket/15331. + +2008-06-21 Werner Lemberg + + Enable access to the various dropout rules of the B&W rasterizer. + Pass dropout rules from the TT bytecode interpreter to the + rasterizer. + + * include/freetype/ftimage.h (FT_OUTLINE_SMART_DROPOUTS, + FT_OUTLINE_EXCLUDE_STUBS): New flags for for FT_Outline. + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Use same mode numbers as given in the + OpenType specification. + Fix mode 4 computation. + (Render_Glyph, Render_Gray_Glyph): Handle new outline flags. + + * src/truetype/ttgload.c (TT_Load_Glyph) Convert scan conversion + mode to FT_OUTLINE_XXX flags. + + * src/truetype/ttinterp.c (Ins_SCANCTRL): Enable ppem check. + +2008-06-19 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Compute final + `dict->units_per_em' value before assigning it to + `cffface->units_per_EM'. Otherwise, CFFs without subfonts are + scaled incorrectly if the font matrix is non-standard. This fixes + Savannah bug #23630. + + * docs/CHANGES: Updated. + +2008-06-19 Werner Lemberg + + * src/type/t1objs.c (T1_Face_Init): Slightly improve algorithm fix + from 2008-06-19. + +2008-06-18 Werner Lemberg + + * src/type/t1objs.c (T1_Face_Init): Fix change from 2008-03-21. + Reported by Peter Weilbacher . + + * docs/CHANGES: Updated. + +2008-06-15 George Williams + + * src/otvalid/otvgpos.c (otv_MarkBasePos_validate): Set + `valid->extra2' to 1. This is undocumented in the OpenType 1.5 + specification. + +2008-06-15 Werner Lemberg + + * src/base/ftcalc.c (FT_MulFix) : Protect registers correctly + from clobbering. Patch from Savannah bug report #23556. + + * docs/CHANGES: Document it. + +2008-06-10 Werner Lemberg + + * autogen.sh: Add option `--install' to libtoolize. + +2008-06-10 Werner Lemberg + + * Version 2.3.6 released. + ========================= + + + Tag sources with `VER-2-3-6'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.6. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.5/2.3.6/, s/235/236/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. + + * builds/unix/configure.raw (version_info): Set to 9:17:3. + + + * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `scale_x' + and `scale_y'. + * src/cff/cffgload.h (CFF_Builder): Remove `scale_x' and `scale_y'. + + + * src/cff/cffparse.c: Include FT_INTERNAL_DEBUG_H. + * src/cff/cffobjs.h: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + +2008-06-10 Werner Lemberg + + * src/base/ftobjs.c (open_face): Check `clazz->init_face' and + `clazz->done_face'. + +2008-06-09 VaDiM + + Support debugging on WinCE. From Savannah patch #6536; this fixes + bug #23497. + + * builds/win32/ftdebug.c (OutputDebugStringEx): New function/macro + as a replacement for OutputDebugStringA (which WinCE doesn't have). + Update all callers. + (ft_debug_init) [_WIN32_CE]: WinCE apparently doesn't have + environment variables. + +2008-06-09 Werner Lemberg + + * README.CVS: Updated. + + * builds/unix/configure.raw, builds/unix/freetype-config.in: Updated + for newer versions of autoconf and friends. + +2008-06-08 Werner Lemberg + + * src/type1/t1parse.h (T1_ParserRec): Make `base_len' and + `private_len' unsigned. + + * src/type1/t1parse.c (read_pfb_tag): Make `asize' unsigned and read + it as such. + (T1_New_Parser, T1_Get_Private_Dict): Make `size' unsigned. + + + * src/base/ftstream.c (FT_Stream_Skip): Reject negative values. + + + * src/type1/t1load.c (parse_blend_design_positions): Check `n_axis' + for sane value. + Fix typo. + + + * src/psaux/psobjs.c (ps_table_add): Check `idx' correctly. + + + * src/truetype/ttinterp (Ins_SHC): Use BOUNDS() to check + `last_point'. + + + * src/sfnt/ttload.c (tt_face_load_max_profile): Limit + `maxTwilightPoints'. + +2008-06-06 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_IP): Handle case `org_dist == 0' + correctly. This fixes glyphs `t' and `h' of Arial Narrow at 12ppem. + +2008-06-03 Werner Lemberg + + * include/freetype/ftcache.h (FTC_FaceID): Change type back to + FT_Pointer. Reported by Ian Britten . + +2008-06-02 Werner Lemberg + + Emit header info for defined FreeType objects in reference. + + * src/tools/docmaker/content.py (re_header_macro): New regexp. + (ContentProcessor::__init__): Initialize new dictionary `headers'. + (DocBlock::__init__): Collect macro header definitions. + + * src/tools/docmaker/tohtml.py (header_location_header, + header_location_footer): New strings. + (HtmlFormatter::__init__): Pass `headers' dictionary. + (HtmlFormatter::print_html_field): Don't emit paragraph tags. + (HtmlFormatter::print_html_field_list): Emit empty paragraph. + (HtmlFormatter::block_enter): Emit header info. + +2008-06-01 Werner Lemberg + + * include/freetype/config/ftheader.h (FT_UNPATENTED_HINTING_H, + FT_INCREMENTAL_H): Added. + +2008-05-28 Werner Lemberg + + * src/tools/docmaker/sources.py (SourceBlock::__init__): While + looking for markup tags, return immediately as soon a single one is + found. + +2008-05-28 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_MD): The MD instruction also uses + original, unscaled input values. Confirmed by Greg Hitchcock from + Microsoft. + +2008-05-27 Werner Lemberg + + * src/tools/docmaker/tohtml.py (block_footer_start, + block_footer_middle): Beautify output. + +2008-05-25 Werner Lemberg + + * src/raster/ftraster.c (fc_black_render): Return 0 when we are + trying to render into a zero-width/height bitmap, not an error code. + + * src/truetype/ttgload.c (load_truetype_glyph): Move initialization + of the graphics state for subglyphs to... + (TT_Hint_Glyph): This function. + Hinting instructions for a composite glyph apparently refer to the + just hinted subglyphs, not the unhinted, unscaled outline. This + seems to fix Savannah bugs #20973 and (at least partially) #23310. + +2008-05-20 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_Suitcase): Check if valid + `aface' is returned by FT_New_Face_From_FOND(). The patch was + proposed by an anonymous reporter of Savannah bug #23204. + +2008-05-18 Werner Lemberg + + * src/pshinter/pshalgo.c (ps_hints_apply): Reset scale values after + correction for pixel boundary. Without this patch, the effect can + be cumulative under certain circumstances, making glyphs taller and + taller after each call. This fixes Savannah bug #19976. + +2008-05-18 Werner Lemberg + + * src/base/ftdebug.c (FT_Message, FT_Panic): Send output to stderr. + This fixes Savannah bug #23280. + + * docs/CHANGES: Updated. + +2008-05-18 David Turner + + * src/psnames/psmodule.c (ft_wgl_extra_unicodes, + ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets, + ps_check_wgl_name, ps_check_wgl_unicode): Use `static' to make + declarations non-global. + + * src/type1/t1load.c: Add missing comment. + +2008-05-17 Sam Hocevar + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle zero-contour + glyphs correctly. Patch from Savannah bug #23277. + +2008-05-16 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-05-16 Sergey Tolstov + + Improve support for WGL4 encoded fonts. + + * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro. + (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names, + ft_wgl_extra_glyph_name_offsets): New arrays. + (ps_check_wgl_name, ps_check_wgl_unicode): New functions. + (ps_unicodes_init): Use them to add additional Unicode mappings. + +2008-05-15 Werner Lemberg + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : `closepath' without a path is a no-op, not an error + (cf. the PS reference manual). + + Reported by Martin McBride. + +2008-05-15 Werner Lemberg + + * builds/toplevel.mk (CONFIG_GUESS, CONFIG_SUB): Updated. + +2008-05-15 Werner Lemberg + + * src/type1/t1load.c (parse_subrs): Accept fonts with a subrs array + which contains a single but empty entry. This is technically + invalid (since it must end with `return'), but... + + Reported by Martin McBride. + +2008-05-14 Werner Lemberg + + Finish fix of scaling bug of CID-keyed CFF subfonts. + + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c + (FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled): New + functions. + + * src/cff/cffobjs.h (CFF_Internal): New struct. It is used to + provide global hinting data for both the top-font and all subfonts + (with proper scaling). + + * src/cff/cffobjs.c (cff_make_private_dict): New function, using + code from `cff_size_init'. + (cff_size_init, cff_size_done, cff_size_select, cff_size_request): + Use CFF_Internal and handle subfonts. + (cff_face_init): Handle top-dict and subfont matrices correctly; + apply some heuristic in case of unlikely matrix concatenation + results. This has been discussed with people from Adobe (thanks + goes mainly to David Lemon) who confirm that the CFF specs are fuzzy + and not correct. + + * src/cff/cffgload.h (cff_decoder_prepare): Add `size' argument. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_decoder_prepare): Handle hints globals for subfonts. + Update all callers. + (cff_slot_load): Handling scaling of subfonts properly. + + * src/cff/cffparse.c (cff_parse_fixed_dynamic): New function. + (cff_parse_font_matrix): Use it. + + * src/cff/cfftypes.h (CFF_FontDictRec): Make `units_per_em' + FT_ULong. + + * docs/CHANGES: Document it. + +2008-05-13 Werner Lemberg + + * src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init): + Handle case `face_index < 0'. + * docs/CHANGES: Document it. + +2008-05-04 Werner Lemberg + + First steps to fix the scaling bug of CID-keyed CFF subfonts, + reported by Ding Li on 2008/03/28 on freetype-devel. + + * src/base/cff/cffparse.c (power_tens): New array. + (cff_parse_real): Rewritten to introduce a fourth parameter which + returns the `scaling' of the real number so that we have no + precision loss. This is not used yet. + Update all callers. + (cff_parse_fixed_thousand): Replace with... + (cff_parse_fixed_scaled): This function. Update all callers. + +2008-05-03 Werner Lemberg + + * src/base/ftobjs.c (FT_Load_Glyph): Call the auto-hinter without + transformation since it recursively calls FT_Load_Glyph. This fixes + Savannah bug #23143. + +2008-04-26 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_BuilderRec): Mark `scale_x' + and `scale_y' as obsolete since they aren't used. + * src/psaux/psobjs.c (t1_builder_init): Updated. + + * src/cff/cffgload.h (CFF_Builder): Mark `scale_x' and `scale_y' as + obsolete since they aren't used. + * src/cff/cffgload.c (cff_builder_init): Updated. + +2008-04-14 Werner Lemberg + + * src/pcf/pcfdrivr.c (PCF_Face_Init): Protect call to + `FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZ'. From Savannah + bug #22909. + +2008-04-13 Werner Lemberg + + * src/psaux/psconv.c (PS_Conv_ToFixed): Increase precision if + integer part is zero. + +2008-04-01 Werner Lemberg + + Fix compilation with g++ 4.1 (with both `single' and `multi' + targets). + + * src/base/ftobjs.c (FT_Open_Face): Don't define a variable in block + which is crossed by a `goto'. + + * src/otvalid/otvalid.h (otv_MATH_validate): Add prototype. + +2008-03-31 Werner Lemberg + + Fix support for subsetted CID-keyed CFFs. + + * include/freetype/freetype.h (FT_FACE_FLAG_CID_KEYED, + FT_IS_CID_KEYED): New macros. + + * src/cff/cffobjs.c (cff_face_init): Set number of glyphs to the + maximum CID value in CID-keyed CFFs. + Handle FT_FACE_FLAG_CID_KEYED flag. + + * docs/CHANGES: Document it. + + + Fix CFF font matrix calculation and improve precision. + + * src/cff/cffparse.c (cff_parse_real): Increase precision if integer + part is zero. + (cff_parse_font_matrix): Simplify computation of `units_per_em'; + this prevents overflow also. + + + Support FT_Get_CID_Registry_Ordering_Supplement for PS CID fonts. + + * src/cid/cidriver.c: Include FT_SERVICE_CID_H. + (cid_get_ros): New function. + (cid_service_cid_info): New service structure. + (cid_services): Register it. + +2008-03-23 Werner Lemberg + + Adjustments for Visual C++ 8.0, as reported by Rainer Deyke. + + * builds/compiler/visualc.mk (CFLAGS): Remove /W5. + (ANSIFLAGS): Add _CRT_SECURE_NO_DEPRECATE. + +2008-03-21 Laurence Darby + + * src/type1/t1objs.c (T1_Face_Init): Use `/Weight'. Patch from + Savannah bug #22675. + +2008-03-13 Derek Clegg + + * src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix named style loop. + Patch from Savannah bug #22541. + +2008-03-03 Masatoshi Kimura + + * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, + tt_cmap14_find_variant): Return correct value. + (tt_cmap14_variant_chars): Fix check for `di'. + +2008-02-29 Wermer Lemberg + + * docs/CHANGES: Updated. + +2008-02-29 Wolf + + Add build support for symbian platform. From Savannah bug #22440. + + * builds/symbian/*: New files. + +2008-02-21 suzuki toshiya + + * src/base/ftmac.c (parse_fond): Fix a bug of PostScript font name + synthesis. For any face of a specified FOND, always the name for + the first face was used. Except of a FOND that refers multiple + Type1 font files, wrong synthesized font names are not used at all, + so this is an invisible bug. A few limit checks are added too. + + * builds/mac/ftmac.c: Ditto. + +2008-02-21 suzuki toshiya + + * builds/unix/configure.raw: Split compiler option to link Carbon + frameworks to one option for CoreServices framework and another + option for ApplicationServices framework. The split options can be + managed by GNU libtool to avoid unrequired duplication when FreeType + is linked with other applications. Suggested by Daniel Macks, + Savannah bug #22366. + +2008-02-18 Victor Stinner + + * src/truetype/ttinterp.c (Ins_IUP): Check number of points. Fix + from Savannah bug #22356. + +2008-02-17 Jonathan Blow + + * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): + Check for valid callback pointers. + +2008-02-15 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_SFNT): Check the sfnt resource + handle by its value instead of ResError(), fix provided by Deron + Kazmaier. According to the Resource Manager Reference, + GetResource(), Get1Resource(), GetNamedResource(), + Get1NamedResource() and RGetResource() set noErr but return NULL + handle when they can not find the requested resource. These + functions never return undefined values, so it is sufficient to + check if the handle is not NULL. + + * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. + +2008-02-14 suzuki toshiya + + * src/base/ftbase.c: is replaced by "ftmac.c" as other + inclusion styles. Now it always includes src/base/ftmac.c; + builds/mac/ftmac.c is never included in any configuration. + + * builds/unix/configure.raw: Print warning if configure is executed + with options to specify Carbon functionalities explicitly. + + * docs/INSTALL.MAC: Note that legacy builds/mac/ftmac.c is not + included automatically and manual replacement is required. + +2008-02-11 Werner Lemberg + + * builds/modules.mk (CLOSE_MODULE, REMOVE_MODULE), builds/detect.mk + (dos_setup), builds/freetype.mk (clean_project_dos, + distclean_project_dos): Don't use \ but $(SEP). Reported by Duncan + Murdoch. + +2008-01-18 Sylvain Pasche + + * src/base/ftlcdfil.c (_ft_lcd_filter_legacy): Updated comment to + mention intra-pixel algorithm. + + * include/freetype/freetype.h (FT_Render_Mode): Mention that + FT_Library_SetLcdFilter can be used to reduce fringes. + +2008-01-16 Werner Lemberg + + * src/raster/ftraster.c (ft_black_render): Check `outline' before + using it. Reported by Allan Yang. + +2008-01-12 Werner Lemberg + + * src/raster/ftraster.c (FT_CONFIG_OPTION_5_GRAY_LEVELS): Remove. + +2008-01-12 Allan Yang, Jian Hua - SH + + * src/raster/ftraster.c (ft_black_init) + [FT_RASTER_OPTION_ANTI_ALIASING]: Fix compilation. + +2008-01-10 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Handle the case + where the number of contours in a simple glyph is zero (and which + does contain an entry in the `glyf' table). This fixes Savannah bug + #21990. + +2008-01-04 suzuki toshiya + + Formatting suggested by Sean McBride. + + * builds/mac/ftmac.c: Formatting (tab expanded). + * src/autofit/afindic.c: Ditto. + * src/base/ftcid.c: Ditto. + * src/base/ftmac.c: Ditto. + +2007-12-30 Werner Lemberg + + * src/smooth/ftgrays.c (gray_raster_render): Check `outline' + correctly. + +2007-12-21 suzuki toshiya + + Improvement of POSIX resource-fork accessor to load unsorted + references in a resource. In HelveLTMM (resource-fork PostScript + Type1 font bundled with Mac OS X since 10.3.x), the appearance order + of PFB chunks is not sorted; sorting the chunks by reference IDs is + required. + + * include/freetype/internal/ftrfork.h (FT_RFork_Ref): New structure + type to store a pair of reference ID and offset to the chunk. + + * src/base/ftrfork.c (ft_raccess_sort_ref_by_id): New function to + sort FT_RFork_Ref by their reference IDs. + + (FT_Raccess_Get_DataOffsets): Returns an array of offsets that is + sorted by reference ID. + +2007-12-14 Werner Lemberg + + * src/cff/cffparse.c (cff_parse_real): Don't apply `power_ten' + division too early; otherwise the most significant digit(s) of the + final result are lost as the value is truncated to an integer. This + fixes Savannah bug #21794 (where the patch has been posted too). + +2007-12-06 Fix <4d876b82@gmail.com> + + Pass options from one configure script to another as-is (not + expanded). This is needed for options like + --includedir='${prefix}/include'. + + * builds/unix/detect.mk, configure: Prevent argument expansion in + call to the (real) `configure' script. + +2007-12-06 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation if + TT_USE_BYTECODE_INTERPRETER isn't defined. + +2007-12-06 Werner Lemberg + + There exist CFFs which contain opcodes for the Type 1 operators + `hsbw' and `closepath' which are both invalid in Type 2 charstrings. + However, it doesn't harm to support them. + + * src/cff/cffgload.c (CFF_Operator): Add `cff_op_hsbw' and + `cff_op_closepath.' + (cff_argument_counts): Ditto. + + (cff_decoder_parse_charstrings): Handle Type 1 opcodes 9 (closepath) + and 13 (hsbw) which are invalid in Type 2 charstrings. + +2007-12-06 suzuki toshiya + + * src/base/ftrfork.c (raccess_guess_darwin_newvfs): New function to + support new pathname syntax `..namedfork/rsrc' to access a resource + fork on Mac OS X. The legacy syntax `/rsrc' does not work on + case-sensitive HFS+. + (raccess_guess_darwin_hfsplus): Fix a bug in the calculation of + buffer size to store a pathname. + * include/freetype/internal/ftrfork.h: Increment the number of + resource fork guessing rule. + +2007-12-06 suzuki toshiya + + * builds/unix/configure.raw: Improve the compile tests to search + Carbon functions. + * builds/mac/ftmac.c: Import fixes for Carbon incompatibilities + proposed by Sean McBride from src/base/ftmac.c (see 2007-11-16). + +2007-12-06 suzuki toshiya + + The documents and comments for Mac OS X are improved by Sean + McBride. + + * src/base/ftmac.c: Fix a comment. + * include/freetype/ftmac.h: Ditto. + * docs/INSTALL.MAC: Improve English and add comment on lowest + system version specified by MACOSX_DEPLOYMENT_TARGET. + +2007-12-04 Werner Lemberg + + * src/cff/cffload.c (cff_subfont_load): Don't use logical OR to + concatenate error codes. + * src/sfnt/ttsbit.c (Load_SBit_Range): Ditto. + +2007-12-04 Graham Asher + + * src/truetype/ttobjs.c (tt_face_init): Don't use logical OR to + concatenate error codes. + +2007-12-04 Sean McBride + + * src/pfr/pfrgload.c (pfr_glyph_load_compound): Remove compiler + warning. + +2007-11-20 suzuki toshiya + + Fix MacOS legacy font support by Masatake Yamato on Mac OS X. It is + not working since 2.3.5. In FT_Open_New(), if FT_New_Stream() + cannot mmap() the specified file and cannot seek to head of the + specified file, it returns NULL stream and FT_Open_New() returns the + error immediately. On MacOS, most legacy MacOS fonts fall into such + a scenario because their data forks are zero-sized and cannot be + sought. To proceed to guessing of resource fork fonts, the + functions for legacy MacOS font must properly handle the NULL stream + returned by FT_New_Stream(). + + * src/base/ftobjs.c (IsMacBinary): Return error + FT_Err_Invalid_Stream_Operation immediately when NULL stream is + passed. + (FT_Open_Face): Even when FT_New_Stream() returns an error, proceed + to fallback. Originally, legacy MacOS font is tested in the cases + of FT_Err_Invalid_Stream_Operation (occurs when data fork is empty) + or FT_Err_Unknown_File_Format (occurs when AppleSingle header or + .dfont header is combined). Now the case of + FT_Err_Cannot_Open_Stream is included. + + * src/base/ftrfork.c (FT_Raccess_Guess): When passed stream is NULL, + skip FT_Stream_Seek(), which seeks to the head of stream, and + proceed to unit testing of raccess_guess_XXX(). FT_Stream_Seek() + for a NULL stream causes a Bus error on Mac OS X. + (raccess_guess_apple_double): Return FT_Err_Cannot_Open_Stream + immediately if passed stream is NULL. + (raccess_guess_apple_single): Ditto. + +2007-11-16 suzuki toshiya + + Fix for Carbon incompatibilities since Mac OS X 10.5, + proposed by Sean McBride. + + * doc/INSTALL.MAC: Comment on MACOSX_DEPLOYMENT_TARGET. + + * include/freetype/ftmac.h: Deprecate FT_New_Face_From_FOND and + FT_GetFilePath_From_Mac_ATS_Name. Since Mac OS X 10.5, calling + Carbon functions from a forked process is classified as unsafe + by Apple. All Carbon-dependent functions should be deprecated. + + * src/base/ftmac.c: Use essential header files + and + instead of + all-in-one header file . + + Include and replace HFS_MAXPATHLEN by Apple + genuine macro PATH_MAX. + + Add fallback macro for kATSOptionFlagsUnRestrictedScope which + is not found in Mac OS X 10.0. + + Multi-character constants ('POST', 'sfnt' etc) are replaced by + 64bit constants calculated by FT_MAKE_TAG() macro. + + For the index in the segment of resource fork, new portable + type ResourceIndex is introduced for better compatibility. + This type is since Mac OS X 10.5, so it is defined as short + when built on older platforms. + + (FT_ATSFontGetFileReference): If build target is only the systems + 10.5 and newer, it calls Apple genuine ATSFontGetFileReference(). + + (FT_GetFile_From_Mac_ATS_Name): Return an error if system is 10.5 + and newer or 64bit platform, because legacy type FSSpec type is + removed completely. + + (FT_New_Face_From_FSSpec): Ditto. + +2007-11-01 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_done_face): Check `sfnt' everywhere. This + fixes Savannah bug #21485. + +2007-10-29 Daniel Svoboda + + * src/winfonts/winfnt.c (FNT_Face_Init): Check first that the driver + can handle the font at all, then check `face_index'. Otherwise, the + driver might return the wrong error code. This fixes Savannah bug + #21468. + +2007-10-21 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Support bit 9 and prepare + support for bit 8 of the `fsSelection' field in the `OS/2' table. + MS is already using this; hopefully, this becomes part of OpenType + 1.5. + Prepare also support for `name' IDs 21 (WWS_FAMILY) and 22 + (WWS_SUBFAMILY). + +2007-10-20 Werner Lemberg + + * src/tools/docmaker/tohtml.py (html_header_2): Fix typo. + Add `td.left' element to CSS. + (toc_section_enter): Use it. + +2007-10-18 David Turner + + * include/freetype/freetype.h, src/base/ftobjs.c: Rename API + functions related to cmap type 14 support to the + `FT_Object_ActionName' scheme: + + FT_Get_Char_Variant_index -> FT_Face_GetCharVariantIndex + FT_Get_Char_Variant_IsDefault -> FT_Face_GetCharVariantIsDefault + FT_Get_Variant_Selectors -> FT_Face_GetVariantSelectors + FT_Get_Variants_Of_Char -> FT_Face_GetVariantsOfChar + FT_Get_Chars_Of_Variant -> FT_Face_GetCharsOfVariant + + Update documentation accordingly. + + * src/sfnt/ttcmap.c: Stronger cmap 14 validation. + Make the code a little more consistent with FreeType coding + conventions and modify the cmap14 functions that returned a newly + allocated array to use a persistent vector from the TT_CMap14 object + instead. + + (TT_CMap14Rec): Provide array and auxiliary data for result. + (tt_cmap14_done, tt_cmap14_ensure): New functions. + + (tt_cmap14_init, tt_cmap14_validate, tt_cmap14_char_map_def_binary, + tt_cmap14_char_map_nondef_binary, tt_cmap14_find_variant, + tt_cmap14_char_var_index, tt_cmap14_variants, + tt_cmap14_char_variants, tt_cmap14_def_char_count, + tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, + tt_cmap14_variant_chars, tt_cmap14_class_rec): Updated and improved. + +2007-10-15 George Williams + + Add support for cmap type 14. + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_CMAP_FORMAT_14): New macro. + + * include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc, + FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc, + FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New + support function prototypes. + (FT_CMap_ClassRec): Add them. + Update all users. + + * include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New + macro. + + * include/freetype/freetype.h (FT_Get_Char_Variant_Index, + FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors, + FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API + functions. + + * src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary + function. + (FT_Set_Charmap): Disallow cmaps of type 14. + (FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault, + FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char, + FT_Get_Chars_Of_Variant): New API functions. + + * src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros. + + (TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate, + tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info, + tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary, + tt_cmap14_find_variant, tt_cmap14_char_var_index, + tt_cmap14_char_var_isdefault, tt_cmap14_variants, + tt_cmap14_char_variants, tt_cmap14_def_char_count, + tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, + tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and + structures for cmap 14 support. + (tt_cmap_classes): Register tt_cmap14_class_rec. + (tt_face_build_cmaps): One more error message. + + * docs/CHANGES: Mention cmap 14 support. + +2007-10-01 Werner Lemberg + + * src/base/ftobjs.c (find_unicode_charmap): If search for a UCS-4 + charmap fails, do the loop again while searching a UCS-2 charmap. + This favours MS charmaps over Apple ones. + +2007-08-29 suzuki toshiya + + * src/base/ftmac.c: Introduction of abstract `short' data types, + ResFileRefNum and ResID. These types were introduced for Copland, + then backported to MPW. The variables exchanged with FileManager + QuickDraw frameworks are redefined by these data types. Patch was + proposed by Sean McBride. + * builds/mac/ftmac.c: Ditto. + +2007-08-18 Werner Lemberg + + * src/otvalid/otvcmmn.c (otv_x_y_ux_sy): Skip context glyphs. Found + by Imran Yousaf. Fixes Savannah bug #20773. + + (otv_Lookup_validate): Correct handling of LookupType. Found by + Imran Yousaf. Fixes Savannah bug #20782. + +2007-08-17 George Williams + + * src/otvalid/otvgsub.c (otv_SingleSubst_validate): Fix handling of + SingleSubstFormat1. + +2007-08-11 suzuki toshiya + + * builds/unix/configure.raw: Fix a bug which sets CC_BUILD by + ${build-gcc} (unchecked) instead of by ${build}-gcc (checked). + Found by Ryan Hill. + +2007-08-11 George Williams + + * src/otvalid/otvcommn.c, src/otvalid/otvcommn.h + (otv_Coverage_validate): Add fourth argument to pass an expected + count value. Update all users. + Check glyph IDs. + (otv_ClassDef_validate): Check `StartGlyph'. + + * src/otvalid/otvgsub.c (otv_SingleSubst_validate): More glyph ID + checks. + + * src/otvalid/otvmath.c (otv_MathConstants_validate): There are only + 56 constants. + (otv_GlyphAssembly_validate, otv_MathGlyphConstruction_validate): + Check glyph IDs. + +2007-08-08 Werner Lemberg + + * src/otvalid/otvbase.c, src/otvalid/otvcommn.c, + src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, + src/otvalid/otvjstf.c: s/FT_INVALID_DATA/FT_INVALID_FORMAT/ where + appropriate. Reported by George. + + * include/freetype/internal/fttrace.h: Define `trace_otvmath'. + + * src/otvalid/rules.mk (OTV_DRV_SRC): Add otvmath.c. + + * docs/CHANGES: Updated. + +2007-08-08 George Williams + + Add `MATH' validating support to otvalid module. + + * include/freetype/tttags.h (TTAG_MATH): New macro. + * include/freetype/ftotval.h (FT_VALIDATE_MATH): New macro. + (FT_VALIDATE_OT): Updated. + + * src/otvalid/otmath.c: New file. + + * src/otvalid/otvalid.c: Include otvmath.c. + * src/otvalid/otvmod.c (otv_validate): Handle `MATH' table. + +2007-08-04 Werner Lemberg + + * builds/unix/configure.raw: Add call to AC_LIBTOOL_WIN32_DLL. + Fixes Savannah bug #20686. + +2007-08-03 Werner Lemberg + + * src/psnames/psmodule.c: Fix usage of + FT_CONFIG_OPTION_POSTSCRIPT_NAMES macro. Reported by Graham Asher. + +2007-07-31 suzuki toshiya + + * src/base/ftmac.c (open_face_from_buffer): The argument + `driver_name' is typed as `const char*' to match with the + callers in FT_New_Face_From_LWFN and FT_New_Face_From_SFNT. + This is same with open_face_from_buffer in src/base/ftobjs.c. + Found and fixed by Sean McBride. + +2007-07-28 Werner Lemberg + + * src/raster/ftraster.c (count_table): Make it conditional. + * src/base/ftobjs.c (FT_New_Library): Check FT_RENDER_POOL_SIZE with + a preprocessor statement. + +2007-07-27 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Translate): Check `outline' before + first usage. From Savannah patch #6115. + +2007-07-16 Werner Lemberg + + * docs/CHANGES: Updated. + +2007-07-16 Derek Clegg + + Add new service for getting the ROS from a CID font. + + * include/freetype/config/ftheader.h (FT_CID_H): New macro. + * include/freetype/ftcid.h: New file. + + * include/freetype/internal/ftserv.h (FT_SERVIVE_CID_H): New macro. + * include/freetype/internal/services/svcid.h: New file. + + * src/base/ftcid.c: New file. + + * src/cff/cffdrivr.c: Include FT_SERVICE_CID_H. + (cff_get_ros): New function. + (cff_service_cid_info): New service structure. + (cff_services): Register it. + + * src/cff/cffload.c (cff_font_done): Free registry and ordering. + + * src/cff/cfftypes.h (CFF_FontRec): Add `registry' and `ordering'. + + * modules.cfg (BASE_EXTENSIONS): Add ftcid.c. + +2007-07-11 Derek Clegg + + Add support for postscript name service to CFF driver. + + * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_NAME_H. + (cff_get_ps_name): New function. + (cff_service_ps_name): New service structure. + (cff_services): Register it. + +2007-07-07 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_Copy): Fix initialization of + `target'. Reported by Sean McBride. + +2007-07-06 Werner Lemberg + + * src/pfr/pfrcmap.c: Include pfrerror.h. + + * src/autofit/afindic.c: Add some external declarations to pacify + `make multi' compilation. + + * src/cid/cidgload.c (cid_load_glyph): Pacify compiler. + + * src/cff/cffdrivr.c (cff_ps_get_font_info), src/cff/cffobjs.c + (cff_strcpy), include/freetype/internal/ftmemory.h (FT_MEM_STRDUP), + src/autofit/aflatin.c (af_latin_hints_compute_edges), + src/autofit/afcjk.c (af_cjk_hints_compute_edges), src/sfnt/ttmtx.c + (tt_face_get_metrics), src/base/ftobjs.c (open_face) + [FT_CONFIG_OPTION_INCREMENTAL]: Fix compilation with C++ compiler. + + * docs/release: Mention test compilation targets. + +2007-07-04 Werner Lemberg + + * docs/PROBLEMS: Mention that some PS based fonts can't be + handled correctly by FreeType. + + * src/truetype/ttgload.c (load_truetype_glyph): Always allow a + recursion depth of 1. This was the maximum value in TrueType 1.0, + and some older fonts don't set this field correctly. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substTable_validate): Fix tracing message. + +2007-07-03 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize + `round' to pacify compiler. + +2007-07-02 Werner Lemberg + + + * Version 2.3.5 released. + ========================= + + + Tag sources with `VER-2-3-5'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.5. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.4/2.3.5/, s/234/235/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. + + * builds/unix/configure.raw (version_info): Set to 9:16:3. + +2007-07-01 David Turner + + * include/freetype/freetype.h, src/base/ftpatent.c + (FT_Face_SetUnpatentedHinting): New function to dynamically change + the setting after a face is created. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Fix a small bug + that created distortions in the bytecode interpreter results. + +2007-06-30 David Turner + + * src/truetype/ttinterp.c (Ins_IUP): Add missing variable + initialization. + + * src/autofit/aflatin.c (af_latin_metric_init_blues): Get rid of an + infinite loop in the case of degenerate fonts. + +2007-06-26 Rahul Bhalerao + + Add autofit module for Indic scripts. This currently just reuses + the CJK-specific functions. + + * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_INDIC): New + macro. + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/autofit/afindic.c, src/autofit/afindic.h: New files. + + * src/autofit/afglobal.c, src/autofit/aftypes.h, + src/autofit/autofit.c: Updated. + + * src/autofit/Jamfile (_sources), * src/autofit/rules.mk + (AUTOF_DRV_SRC): Updated. + +2007-06-23 David Turner + + * src/truetype/ttgload.c (TT_Load_Simple): Fix change from + 2007-06-16 that prevented the TrueType module from loading most + glyphs. + +2007-06-20 Werner Lemberg + + * src/cff/cffgload.c (cff_slot_load): Fix logic of 2007-05-28 + change. + +2007-06-19 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Handle one more error. + +2007-06-19 Dmitry Timoshkov + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Return error + FNT_Err_Invalid_File_Format if file format was recognized but + the file doesn't contain any FNT(NE) or RT_FONT(PE) resources. + Add verbose debug logs to make it easier to debug failing load + attempts. + (FNT_Face_Init): A single FNT font can't contain more than 1 face, + so return an error if requested face index is > 0. + Do not do further attempt to load fonts if a previous attempt has + failed but returned error FNT_Err_Invalid_File_Format, i.e., the + file format has been recognized but no fonts found in the file. + +2007-07-19 suzuki toshiya + + * src/base/ftmac.c: Apply patches proposed by Sean McBride. + (FT_GetFile_From_Mac_Name): Insert FT_UNUSED macros to fix + the compiler warnings against unused arguments. + (FT_ATSFontGetFileReference): Ditto. + (FT_GetFile_From_Mac_ATS_Name): Ditto. + (FT_New_Face_From_FSSpec): Ditto. + (lookup_lwfn_by_fond): Fix wrong comment. + Replace `const StringPtr' by more appropriate type + `ConstStr255Param'. + FSRefMakePathPath always returns UTF8 POSIX pathname in + Mach-O, thus HFS pathname support is dropped. + (count_faces): Remove HLock and HUnlock which is not + required on Mac OS X anymore. + (FT_New_Face_From_SFNT): Ditto. + (FT_New_Face_From_FOND): Ditto. + * builds/mac/ftmac.c: Synchronize to src/base/ftmac.c, + except of HFS pathname support and HLock/HUnlock. + They are required on classic CFM environment. + +2007-06-18 Werner Lemberg + + * src/psaux/psobjs.c (ps_parser_skip_PS_token): Remove incorrect + assertion. + (ps_parser_to_bytes): Fix error message. + + * src/type42/t42objs.c (T42_Open_Face): Handle one more error. + * src/type42/t42parse.c (t42_parse_sfnts): s/alloc/allocated/. + Don't allow mixed binary and hex strings. + Handle string_size == 0 and string_buf == 0. + (t42_parse_encoding): Handle one more error. + +2007-06-18 Werner Lemberg + + * src/psaux/psobjs.c (ps_tofixedarray, ps_tocoordarray): Fix exit + logic. + (ps_parser_load_field) : Skip delimiters + correctly. + (ps_parser_load_field_table): Use `fields->array_max' instead of + T1_MAX_TABLE_ELEMENTS to limit the number of arguments. + + * src/cff/cffgload.c (cff_decoder_prepare): Fix change from + 2007-06-06. + +2007-06-17 Werner Lemberg + + * src/tools/ftrandom.c (font_size): New global variable. + (TestFace): Use it. + (main): Handle new option `--size' to set `font_size'. + (Usage): Updated. + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Exit in case of + invalid font. + (FNT_Load_Glyph): Protect against invalid bitmap width. + +2007-06-16 David Turner + + * src/smooth/ftgrays.c (gray_find_cell, gray_set_cell, gray_hline): + Prevent integer overflows when rendering very large outlines. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check the + well-formedness of the contours array when loading a glyph. + + * src/truetype/ttinterp.c (TT_Load_Context): Initialize `zp0', `zp1', + and `zp2'. + (Ins_IP): Check argument ranges to reject bogus operations properly. + (IUP_WorkerRec): Add `max_points' member. + (_iup_worker_interpolate): Check argument ranges. + (Ins_IUP): Ignore empty outlines. + +2007-06-16 Dmitry Timoshkov + + * src/winfonts/winfnt.h: Add necessary structures for PE resource + parsing. + (WinPE32_HeaderRec): New structure. + (WinPE32_SectionRec): New structure. + (WinPE_RsrcDirRec): New structure. + (WinPE_RsrcDirEntryRec): New structure. + (WinPE_RsrcDataEntryRec): New structure. + (FNT_FontRec): Remove unused `size_shift' field. + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Add support for + loading bitmap .fon files in PE format. + +2007-06-15 Dmitry Timoshkov + + * builds/win32/ftdebug.c: Unify debug level handling with other + platforms. + +2007-06-14 Dmitry Timoshkov + + * builds/win32/ftdebug.c (FT_Message): Send debug output to the + console as well as to the debugger. + +2007-06-14 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_uniranges): Expand structure to + cover all ranges which could possibly be handled by the aflatin + module (since the default fallback for unknown ranges is now the + afcjk module). It might be necessary to fine-tune this further by + splitting off modules for Greek, Cyrillic, or other blocks. + +2007-06-11 David Turner + + * src/autofit/aflatin.c (af_latin_hints_link_segments): Fix + incorrect segment linking computation. This was the root cause of + Savannah bug #19565. + + + * src/autofit/* [FT_OPTION_AUTOFIT2]: Some very experimental changes + to improve the Latin auto-hinter. Note that the new code is + disabled by default since it is not stabilized yet. + + * src/autofit/aflatin2.c, src/autofit/aflatin2.h: New files + (disabled currently). + + * src/autofit/afhints.c: Remove dead code. + (af_axis_hints_new_edge): Add argument to handle segment directions. + (af_edge_flags_to_string): New function. + (af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Handle + option flags. + (af_glyph_hints_reload): Add argument to handle inflections. + Simplify. + (af_direction_compute): Fine tuning. + (af_glyph_hints_align_edge_points): Fix logic. + (af_glyph_hints_align_strong_points): Do linear search for small + edge counts. + (af_glyph_hints_align_weak_points): Skip any touched neighbors. + (af_iup_shift): Handle zero `delta'. + + * src/autofit/afhints.h: Updated. + (AF_SORT_SEGMENTS): New macro (disabled). + (AF_AxisHintsRec) [AF_SORT_SEGMENTS]: New member `mid_segments'. + + * src/autofit/afglobal.c (af_face_globals_get_metrics): Add + argument to pass option flags for handling scripts. + * src/autofit/afglobal.h: Updated. + + * src/autofit/afcjk.c: Updated. + * src/autofit/aflatin.c: Updated. + (af_latin_metrics_scale_dim): Don't reduce scale by 2%. + + (af_latin_hints_compute_segments) [AF_HINT_METRICS]: Remove dead code. + (af_latin_hints_compute_edges) [AF_HINT_METRICS]: Remove dead code. + Don't set `edge->dir' + (af_latin_hint_edges): Add more logging. + + * src/autofit/afloader.c: Updated. + +2007-06-11 Werner Lemberg + + * docs/CHANGES: Document FT_Face_CheckTrueTypePatents. + +2007-06-10 David Turner + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Slight speed-up to + the TrueType glyph loader. + + * include/freetype/config/ftoption.h: Clarify documentation + regarding unpatented hinting. + + + Add new `FT_Face_CheckTrueTypePatents' API. + + * include/freetype/freetype.h (FT_Face_CheckTrueTypePatents): New + declaration. + + * include/freetype/internal/services/svttglyf.h, + src/base/ftpatent.c: New files. + + * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_GLYF_H): + New macro. + + * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_GLYF_H and + `ttpload.h'. + (tt_service_truetype_glyf): New service structure. + (tt_services): Register it. + + * modules.cfg (BASE_EXTENSIONS), src/base/Jamfile (_sources): Add + `ftpatent.c'. + +2007-06-08 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Undo change from 2007-04-28. + Fonts without a cmap must be handled correctly by FreeType (anything + else would be a bug). + + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Improve tracing message. + +2007-06-07 Werner Lemberg + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_init, + tt_sbit_decoder_load_image): Protect against integer overflows. + + + * src/pfr/pfrgload.c (pfr_glyph_load_simple): More bounding checks + for `x_control' and `y_control'. + +2007-06-06 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Decompose): Check `last'. + + + * src/pfr/pfrcmap.c (pfr_cmap_init): Convert assertion into normal + FreeType error. + + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Do a rough check of + `font_count'. + + + * src/type1/t1load.c (parse_font_matrix): Check `temp_scale'. + + + * src/cff/cffgload.c (cff_decoder_prepare): Change return type to + `FT_Error'. + Check `fd_index'. + (cff_slot_load): Updated. + * src/cff/cffgload.h: Updated. + +2007-06-05 Werner Lemberg + + * src/pfr/pfrgload.c (pfr_glyph_done): Comment out unused code. + (pfr_glyph_load_simple): Convert assertion into normal FreeType + error. + Check `idx'. + (pfr_glyph_load_compound, pfr_glyph_curve_to, pfr_glyph_line_to): + Convert assertion into normal FreeType error. + + * src/pfr/pfrtypes.h (PFR_GlyphRec): Comment out unused code. + + + * src/winfonts/winfnt.c (FNT_Face_Init): Check `family_size'. + + + * src/psaux/psobjs.c (ps_tocoordarray, ps_tofixedarray): Return -1 + in case of parsing error. + (ps_parser_load_field): Updated. + + * src/type1/t1load.c (parse_font_matrix): Updated. + +2007-06-04 Werner Lemberg + + * src/cid/cidgload.c (cid_load_glyph): Check `fd_select'. + + * src/tools/ftrandom/Makefile: Depend on `libfreetype.a'. + +2007-06-03 Werner Lemberg + + * src/tools/ftrandom/*: Add the `ftrandom' test program written by + George Williams (with some modifications). + +2007-06-03 Werner Lemberg + + * src/base/ftobjs.c (destroy_charmaps), src/type1/t1objs.c + (T1_Face_Done), src/winfonts/winfnt.c (FNT_Face_Done): Check for + face == NULL. Suggested by Graham Asher. + +2007-06-03 Ismail Dönmez + + * src/base/ftobjs.c (FT_Request_Metrics): Fix compiler warning. + +2007-06-02 Werner Lemberg + + * include/freetype/fterrdef.h (FT_Err_Corrupted_Font_Header, + FT_Err_Corrupted_Font_Glyphs): New error codes for BDF files. + + * src/bdf/bdflib.c (bdf_load_font): Use them. + + * src/bdf/bdflib.c (_bdf_parse_start): Check `FONT' better. + +2007-06-01 Werner Lemberg + + * src/base/ftobjs.c (FT_Request_Metrics), src/cache/ftccmap.c + (FTC_CMapCache_Lookup): Remove unused code. + +2007-06-01 Sean McBride + + * src/truetype/ttinterp.c (Null_Vector, NULL_Vector): Removed, + unused. + +2007-06-01 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Don't continue second search + pass for `StartData' if an error has occurred. + Exit properly if no `StartData' has been seen at all. + + * builds/unix/ftsystem.c (FT_Stream_Open): Don't use ULONG_MAX but + LONG_MAX to avoid compiler warning. Suggested by Sean McBride. + +2007-05-30 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Protect + against too small binary data strings. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Check `STARTCHAR' better. + +2007-05-28 David Turner + + * src/cff/cffgload.c (cff_slot_load): Do not apply the identity + transformation. This significantly reduces the loading time of CFF + glyphs. + + * docs/CHANGES: Updated. + + * src/autofit/afglobal.c (AF_SCRIPT_LIST_DEFAULT): Change default + hinting script to CJK, since it works well with more scripts than + latin. Thanks to Rahul Bhalerao for pointing + this out! + +2007-05-25 Werner Lemberg + + * docs/CHANGES: Updated. + +2007-05-24 Werner Lemberg + + * src/truetype/ttobjs.h (tt_size_ready_bytecode): Move declaration + into TT_USE_BYTECODE_INTERPRETER preprocessor block. + +2007-05-24 Graham Asher + + * src/truetype/ttobjs.c (tt_size_ready_bytecode) + [!TT_USE_BYTECODE_INTERPRETER]: Removed. Unused. + +2007-05-22 David Turner + + * src/truetype/ttgload.c (load_truetype_glyph): Fix last change to + avoid crashes in case the bytecode interpreter is not used. + + + Avoid heap blowup with very large .Z font files. This fixes + Savannah bug #19910. + + * src/lzw/ftzopen.h (FT_LzwStateRec): Remove `in_cursor', + `in_limit', `pad', `pad_bits', and `in_buff' members. + Add `buf_tab', `buf_offset', `buf_size', `buf_clear', and + `buf_total' members. + + * src/lzw/ftzopen.c (ft_lzwstate_get_code): Rewritten. It now takes + only one argument. + (ft_lzwstate_refill, ft_lzwstate_reset, ft_lzwstate_io): Updated. + +2007-05-20 Ismail Dönmez + + * src/pshinter/pshrec.c (ps_mask_table_set_bits): Add `const'. + (ps_dimension_set_mask_bits): Remove `const'. + +2007-05-19 Werner Lemberg + + * src/sfnt/ttmtx.c (tt_face_get_metrics) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Another type-punning fix. + +2007-05-19 Derek Clegg + + Savannah patch #5929. + + * include/freetype/tttables.h, src/base/ftobjcs.c + (FT_Get_CMap_Format): New function. + + * include/freetype/internal/services/svttcmap.c (TT_CMapInfo): Add + `format' member. + * src/sfnt/ttcmap.c (tt_cmap{0,2,4,6,8,10,12}_get_info): Set + cmap_info->format. + +2007-05-19 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Save graphics state + before handling subglyphs so that it can be reinitialized each time. + This fixes Savannah bug #19859. + +2007-05-16 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_mru_link, ftc_node_mru_unlink), + src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), src/cache/ftcglyph.h + (FTC_GCACHE_LOOKUP_CMP), src/pshinter/pshmod.c (ps_hinter_init), + src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_load_hhea, + tt_face_get_metrics): Fix type-punning issues. + +2007-05-15 David Turner + + * include/freetype/config/ftstdlib.h, + include/freetype/internal/ftobjs.h: As suggested by Graham Asher, + ensure that ft_isalnum, ft_isdigit, etc., use hard-coded values + instead on relying on the locale-dependent functions provided by + . + +2007-05-15 Graham Asher + + * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Remove unused + variable. + * src/autofit/afloader.c (af_loader_load_g): Ditto. + + * src/base/ftobjs.c (ft_validator_error): Use `ft_jmp_buf'. + (open_face_from_buffer): Initialize `stream'. + (FT_Request_Metrics): Remove unused variable. + Remove redundant `break' statements. + (FT_Get_Track_Kerning): Remove unused variable. + + * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs, + afm_parse_kern_data): Remove redundant + `break' statements. + (afm_parser_parse): Ditto. + Don't use uninitialized variables. + + * src/psnames/psmodule.c (VARIANT_BIT): Define as unsigned long. + Use `|' operator instead of `^' to set it. + Update all users. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Use `ft_jmp_buf'. + * src/sfnt/ttkern.c (tt_face_load_kern): Remove unused variable. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant + comparison. + (TT_Process_Simple_Glyph): Use FT_UInt for `n_points' and `i'. + (TT_Load_Glyph): Remove unused variable. + +2007-05-13 Derek Clegg + + * src/base/ftobjs.c (FT_New_Library): Only allocate rendering pool + if FT_RENDER_POOL_SIZE is > 0. From Savannah patch #5928. + +2007-05-11 David Turner + + * src/cache/ftbasic.c, include/freetype/ftcache.h + (FTC_ImageCache_LookupScaler, FTC_SBit_Cache_LookupScaler): Two new + functions that allow us to look up glyphs using an FTC_Scaler object + to specify the size, making it possible to use fractional pixel + sizes. + + * src/truetype/ttobjs.c (tt_size_ready_bytecode): Set + `size->cvt_ready'. Reported by Boris Letocha. + +2007-05-09 Graham Asher + + * src/truetype/ttinterp.c (Ins_IP), src/autofit/aflatin.c + (af_latin_metrics_scale_dim): Fix compiler warnings. + +2007-05-06 Werner Lemberg + + * builds/win32/visualce/freetype.sln: Removed, as requested by + Vincent. + +2007-05-04 Vincent RICHOMME + + * builds/win32/visualce/*: Add Visual C++ project files for Pocket + PC targets. + + * docs/CHANGES: Document them. + +2007-05-04 + + * builds/unix/ftsystem.c (FT_Stream_Open): Handle return value 0 of + mmap (which might happen on some RTOS). From Savannah patch #5909. + +2007-05-03 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Simplify code. + * include/freetype/freetype.h (FT_Set_Char_Size): Update + documentation. + +2007-04-28 Victor Stinner + + * src/sfnt/sfobjs.c (sfnt_load_face): Check error code after loading + `cmap'. + +2007-04-27 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check for negative + number of points in contours. Problem reported by Victor Stinner + . + (TT_Process_Simple_Glyph): Synchronize variable types. + +2007-04-26 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_Copy): Always set second argument to + zero in case of error. This fixes Savannah bug #19689. + +2007-04-25 Boris Letocha + + * src/truetype/ttobjs.c: Fix a typo that created a speed regression + in the TrueType bytecode loader. + +2007-04-10 Martin Horak + + * src/sfnt/sfobjs.c (sfnt_load_face) [FT_CONFIG_OPTION_INCREMENTAL]: + Ignore `hhea' table. This fixes Savannah bug #19261. + +2007-04-09 Werner Lemberg + + + * Version 2.3.4 released. + ========================= + + + Tag sources with `VER-2-3-4'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.4. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/2.3.3/2.3.4/, s/233/234/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. + + * builds/unix/configure.raw (version_info): Set to 9:15:3. + +2007-04-09 Martin Horak + + * src/truetype/ttgload.c (load_truetype_glyph): Save and restore + memory stream to avoid a crash with the incremental memory + interface (Savannah bug #19260). + +2007-04-06 David Turner + + * src/base/ftbimap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite bug + (Savannah bug #19536). + +2007-04-04 Werner Lemberg + + + * Version 2.3.3 released. + ========================= + + + Tag sources with `VER-2-3-3'. + + * docs/CHANGES: Mention CVE-2007-1351. + +2007-04-03 David Turner + + * src/base/ftobjs.c (FT_Set_Char_Size): As suggested by James Cloos, + if one of the resolution values is 0, treat it as if it were the + same as the other value. + +2007-04-02 David Turner + + Add special code to detect `extra-light' fonts and do not snap their + stem widths too much to avoid bizarre hinting effects. + + * src/autofit/aflatin.h (AF_LatinAxisRec): Add `standard_width' and + `extra_light' members. + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Initialize + them. + (af_latin_metrics_scale_dim): Set `extra_light'. + (af_latin_compute_stem_width): Use `extra_light'. + +2007-03-28 David Turner + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix zero-ing of the + padding. + +2007-03-28 Werner Lemberg + + * src/bdf/bdflib.c (setsbit, sbitset): Handle values >= 128 + gracefully. + (_bdf_set_default_spacing): Increase `name' buffer size to 256 and + issue an error for longer names. This fixes CVE-2007-1351. + (_bdf_parse_glyphs): Limit allowed number of glyphs in font to the + number of code points in Unicode. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, README: s/2.3.2/2.3.3/, + s/232/233/. + + * docs/CHANGES: Mention ftdiff. + +2007-03-26 David Turner + + * src/truetype/ttinterp.c [FIX_BYTECODE]: Remove it and + corresponding code. + (Ins_MD): Last regression fix. + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): Fix blues + computations in order to ignore single-point contours. These are + never rasterized and correspond in certain fonts to mark-attach + points that are very far from the glyph's real outline, ruining the + computation. + + * src/autofit/afloader.c (af_loader_load_g): In the case of + monospaced fonts, always set `rsb_delta' and `lsb_delta' to 0. + Otherwise code that uses them will most certainly ruin the fixed + advance property. + + * docs/CHANGES, docs/VERSION.DLL, README, Jamfile (RefDoc): Update + documentation and bump version number to 2.3.3. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. + + * builds/unix/configure.raw (version_info): Set to 9:14:3. + +2007-03-26 suzuki toshiya + + * builds/unix/ftconfig.in: Disable Carbon framework dependency on + 64bit ABI on Mac OS X 10.4.x (ppc & i386). Found by Sean McBride. + * builds/vms/ftconfig.h: Ditto. + * include/freetype/config/ftconfig.h: Ditto. + +2007-03-22 suzuki toshiya + + * builds/unix/ftsystem.c (FT_Stream_Open): Temporary fix to prevent + 32bit unsigned long overflow by 64bit filesize on LP64 platform, as + proposed by Sean McBride: + http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + +2007-03-22 suzuki toshiya + + * builds/unix/ftconfig.in: Suppress SGI compiler's warning against + setjmp, proposed by Sean McBride: + http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + +2007-03-19 suzuki toshiya + + * builds/unix/configure.raw: Dequote `OS_INLINE' in comment of + conftest.c, to avoid unexpected shell evaluation. Possibly it is a + bug or undocumented behaviour of autoconf. + +2007-03-18 David Turner + + * src/truetype/ttinterp.c (Ins_MDRP): Another bytecode regression + fix; testing still needed. + + * src/truetype/ttinterp.c (Ins_MD): Another bytecode regression fix. + +2007-03-17 David Turner + + * src/truetype/ttinterp.c (Ins_IP): Fix wrong handling of the + (undocumented) twilight zone special case. + +2007-03-09 Werner Lemberg + + + * Version 2.3.2 released. + ========================= + + + Tag sources with `VER-2-3-2'. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, README: s/2.3.1/2.3.2/, + s/231/232/. + +2007-03-08 David Turner + + * docs/CHANGES, docs/VERSION.DLL: Updated for upcoming release. + + * builds/unix/configure.raw (version_info): Set to 9:13:3. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. + + * README, Jamfile (RefDoc): s/2.3.1/2.3.2/. + + * src/base/ftutil.c (ft_mem_strcpyn): Fix a bug that prevented the + function to work properly, over-writing user-provided buffers in + some cases. Reported by James Cloos . + + +2007-03-05 Werner Lemberg + + * include/freetype/config/ftstdlib.h (ft_strstr): New wrapper + macro for `strstr'. + + * src/truetype/ttobjs.c (tt_face_init): Use ft_strstr for scanning + `trick_names', as suggested by Ivan Nincic. + +2007-03-05 David Turner + + * src/base/ftinit.c (FT_Init_FreeType): Fix a small memory leak in + case FT_Init_FreeType fails for some reason. Problem reported by + Maximilian Schwerin . + + * src/truetype/ttobs.c (tt_size_init_bytecode): Clear the `x_ppem' + and `y_ppem' fields of the `TT_Size.metrics' structure, not those of + `TT_Size.root.metrics'. Problem reported by Daniel Glöckner + . + + * src/type1/t1afm.c (T1_Read_PFM): Read kerning values as 16-bit + signed values, not unsigned ones. Problem reported by Johannes + Walther . + +2007-02-21 David Turner + + * src/pshinter/pshalgo.c (psh_hint_align): Fix a bug in the hinting + of small and ghost stems in the Postscript interpreter. + +2007-02-20 suzuki toshiya + + * src/base/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Fix memory + leak, patch by "Jjgod Jiang" . + * builds/mac/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Ditto. + +2007-02-16 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_MD): Remove unused variable. + * src/autofit/aflatin.c (af_latin_hints_link_segments): Ditto. + +2007-02-14 David Turner + + It seems that the following changes fix most of the known + interpreter problems with my fonts, but more testing is needed, + though. + + * src/truetype/ttinterp.c (FIX_BYTECODE): Activate. + (TT_MulFix14): Rewrite. + (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Improved and updated. + (Ins_MIRP): Ditto. + +2007-02-12 Werner Lemberg + + * src/truetype/ttinterp.c (Project_x, Project_y): Remove compiler + warnings. + + * src/pcf/pcfread.c (pcf_interpret_style), src/bdf/bdfdrivr.c + (bdf_interpret_style): Ditto. + +2007-02-12 David Turner + + Simplify projection and dual-projection code interface. + + * src/truetype/ttinterp.h (TT_Project_Func): Use `FT_Pos', not + FT_Vector' as argument type. + * src/truetype/ttinterp.c (CUR_Func_project, CUR_Func_dualproj): + Updated. + (CUR_fast_project, CUR_fast_dualproj): New macros. + (Project, Dual_Project, Project_x, Project_y): Updated. + (Ins_GC, Ins_SCFS, Ins_MDAP, Ins_MIAP, Ins_IP): Use new `fast' + macros. + + + * src/autofit/afloader.c (af_loader_load_g): Improve spacing + adjustments for the non-light auto-hinted modes. Gets rid of + `inter-letter spacing is too wide' problems. + + * src/autofit/aflatin.c (af_latin_hints_link_segments, + af_latin_hints_compute_edges): Slight optimization of the segment + linker and better handling of serif segments to get rid of broken + `9' in Arial at 9pt (96dpi). + + + Introduce new string functions and the corresponding macros to get + rid of various uses of strcpy and other `evil' functions, as well as + to simplify a few things. + + * include/freetype/internal/ftmemory.h (ft_mem_strdup, ft_mem_dup, + ft_mem_strcpyn): New declarations. + (FT_MEM_STRDUP, FT_STRDUP, FT_MEM_DUP, FT_DUP, FT_STRCPYN): New + macros. + * src/base/ftutil.c (ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn): New + functions. + + * src/bfd/bfddrivr.c (bdf_interpret_style, BDF_Face_Init), + src/bdf/bdflib.c (_bdf_add_property), src/pcf/pcfread.c + (pcf_get_properties, pcf_interpret_style, pcf_load_font), + src/cff/cffdrivr.c (cff_get_glyph_name), src/cff/cffload.c + (cff_index_get_sid_string), src/cff/cffobjs.c (cff_strcpy), + src/sfnt/sfdriver.c (sfnt_get_glyph_name), src/type1/t1driver.c + (t1_get_glyph_name), src/type42/t42drivr.c (t42_get_glyph_name, + t42_get_name_index): Use new functions and simplify code. + + * builds/mac/ftmac.c (FT_FSPathMakeSpec): Don't use FT_MIN. + +2007-02-11 Werner Lemberg + + * src/autofit/afloader.c (af_loader_load_g): Don't change width for + non-spacing glyphs. + +2007-02-07 Tom Parker + + * src/cff/cffdrivr.c (cff_get_name_index): Protect against NULL + pointer. + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h (FT_DEPRECATED_ATTRIBUTE): + Introduce __attribute((deprecated))__ to warn functions + which use non-ANSI data types in its interfaces. + (FT_GetFile_From_Mac_Name): Deprecated, using FSSpec. + (FT_GetFile_From_Mac_ATS_Name): Deprecated, using FSSpec. + (FT_New_Face_From_FSSpec): Deprecated, using FSSpec. + (FT_New_Face_From_FSRef): Deprecated, using FSRef. + + * src/base/ftmac.c: Predefine FT_DEPRECATED_ATTRIBUTE as void + to avoid warning in building FreeType. + * builds/mac/ftmac.c: Ditto. + +2007-02-05 suzuki toshiya + + * src/base/ftbase.c: Fix to use builds/mac/ftmac.c, if configured + `--with-fsspec' etc. Replace #include "ftmac.c" with + #include . + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h (FT_GetFilePath_From_Mac_ATS_Name): + Introduced as replacement of FT_GetFile_From_Mac_ATS_Name. + * src/base/ftmac.c (FT_GetFilePath_From_Mac_ATS_Name): Ditto. + (FT_GetFile_From_Mac_ATS_Name): Rewritten as wrapper of + FT_GetFilePath_From_Mac_ATS_Name. + * builds/mac/ftmac.c: Ditto. + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h: Fixed wrong comment: FSSpec of + FT_GetFile_From_Mac_Name, FT_GetFile_From_Mac_ATS_Name are + for passing to FT_New_Face_From_FSSpec. + +2007-02-05 suzuki toshiya + + * builds/unix/configure.raw: Check whether Mac OS X system headers + can be built under ANSI C mode. + + * src/base/ftmac.c (OS_INLINE): Redefine OS_INLINE by a version + compatible to ANSI C in case system headers are ANSI C incompatible. + * builds/mac/ftmac.c (OS_INLINE): Ditto. + +2007-02-01 Werner Lemberg + + * include/freetype/ttnameid.h (TT_MS_LANGID_DZONGHKA_BHUTAN): + Explain why applications shouldn't use it. Found by Alexei. + +2007-02-01 Alexei Podtelezhnikov + + * builds/unix/freetype2.m4 (AC_CHECK_FT2): Fix spelling of warning + message. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substTable_validate): Fix debugging + message. + +2007-01-31 Werner Lemberg + + + * Version 2.3.1 released. + ========================= + + + Tag sources with `VER-2-3-1-FINAL'. + + * builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/230/231/. + * builds/win32/visualc/index.html: s/221/231/. + + * vms_make.com: Add `ftgasp'. + +2007-01-30 David Turner + + Tag sources with VER-2-3-1 to prepare release. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. + + * docs/VERSION.DLL, docs/release, README, Jamfile (RefDoc): + s/2.3.0/2.3.1/. + + * builds/unix/configure.raw (version_info): Set to 9:12:3. + + + * src/autofit/aftypes.h (AF_USE_WARPER), src/autofit/afloader.c + (af_loader_load_g): Disable the warper (i.e., the light hinting + improvements) to make a 2.3.1 bugfix release before introducing a + new feature. This should give us more time to tune and improve the + warper for the next release. + + * docs/CHANGES: Update accordingly. + +2007-01-25 David Turner + + For light auto-hinting, improve glyph advance widths and resurrect + normal/full hinting to its normal quality. + + * src/autofit/afhints.h (AF_GlyphHintsRec): New members `xmin_delta' + and `xmax_delta'. + * src/autofit/afhints.c (af_glyph_hints_reload): Reset `xmin_delta' + and `xmax_delta'. + + * src/autofit/afloader.c (af_loader_load_g) : Replace + preprocessor conditional with if-clause, handling both light and + normal mode. + + * src/autofit/afwarp.c (AF_WarpScore): Fine-tune again. + (af_warper_compute): Handle `xmin_delta' and `xmax_delta'. + +2007-01-25 Werner Lemberg + + * docs/release: Updated -- Savannah uses a new uploading scheme. + +2007-01-25 David Turner + + * src/cff/cffload.c (cff_index_get_pointers): Improve previous fix. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Fix sanity check for empty + functions. + + * docs/CHANGES: Document light auto-hinting improvement. + +2007-01-25 Werner Lemberg + + * src/cff/cffload.c (cff_index_get_pointers): Handle last entry + correctly in a sanity check. Since this function is only used to + load local and global functions, any charstring that called the last + local/global function would fail otherwise. This fixes Savannah bug + #18867. + + * docs/CHANGES: Document it. + +2007-01-23 David Turner + + * src/truetype/ttobjs.c (tt_size_ready_bytecode): Fix typo that + prevented compilation when disabling both the unpatented and the + bytecode interpreter in the TrueType font driver. + + + Fix and enable the warper to improve `light' hinting mode. This is + not necessarily a final version, but it seems to work well. + + * src/autofit/aflatin.c (af_latin_hints_init) [AF_USE_WARPER]: + Disable code. + (af_latin_hints_apply) [AF_USE_WARPER]: Handle FT_RENDER_MODE_LIGHT. + * src/autofit/aftypes.h: Activate AF_USE_WARPER. + + * src/autofit/afwarp.c (AF_WarpScore): Tune table. + (af_warper_compute_line_best): Fix array size of `scores'. + (af_warper_compute): Better handling of border cases. + * src/autofit/afwarp.h (AF_WarperRec): Remove unused members `X1' + and `X2'. + +2007-01-21 Werner Lemberg + + * ChangeLog: Split off older entries into... + * ChangeLog.22: This new file. + +2007-01-21 Werner Lemberg + + * docs/CHANGES: Document SHZ fix. + +2007-01-21 George Williams + + * src/truetype/ttinterp.c (Ins_SHZ): SHZ doesn't move phantom + points. + +2007-01-21 Werner Lemberg + + * src/sfnt/ttmtx.c (tt_face_get_metrics) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Fix limit check. + +2007-01-17 Werner Lemberg + + + * Version 2.3.0 released. + ========================= + + + Tag sources with `VER-2-3-0-FINAL'. + +2007-01-17 Werner Lemberg + + * docs/release: Updated. + +2007-01-16 David Turner + + * src/autofit/aflatin.c (af_latin_hints_compute_segments), + src/cff/cffdriver.c (cff_ps_get_font_info), src/truetype/ttobjs.c + (tt_face_init), src/truetype/ttinterp.c (Ins_SHC): Fix compiler + warnings. + +2007-01-15 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile: Add `ftgasp.c' and `ftlcdfil.c'. + + * builds/amiga/include/freetype/config/ftconfig.h: Synchronize. + +2007-01-14 Detlef Würkner + + Fix various compiler warnings. + + * src/truetype/ttdriver.c (tt_size_select), src/cff/cffobjs.h, + src/cff/cffobjs.c (cff_size_request), src/type42/t42objs.h: + s/index/strike_index/. + * src/base/ftobjs.c (FT_Match_Size): s/index/size_index/. + + * src/gxvalid/gxvmorx5.c + (gxv_morx_subtable_type5_InsertList_validate): s/index/table_index/. + + * src/truetype/ttinterp.c (Compute_Point_Displacement), + src/pcf/pcfread.c (pcf_seek_to_table_type): Avoid possibly + uninitialized variables. + +2007-01-13 suzuki toshiya + + * docs/CHANGES, docs/INSTALL.MAC: Improvements. + +2007-01-13 Werner Lemberg + + * src/type1/t1afm.c (T1_Read_Metrics): MS Windows allows PFM + versions up to 0x3FF without complaining. + +2007-01-13 Derek Clegg + + Add FT_Get_PS_Font_Info interface to CFF driver. + + * src/cff/cfftypes.h: Include FT_TYPE1_TABLES_H. + (CFF_FontRec): Add `font_info' field. + + * src/cff/cffload.c: Include FT_TYPE1_TABLES_H. + (cff_font_done): Free font->font_info if necessary. + + * src/cff/cffdrvr.c (cff_ps_get_font_info): New function. + (cff_service_ps_info): Register cff_ps_get_font_info. + +2007-01-13 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Fix compilation + with C++ compiler. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments, + af_glyph_hints_dump_edges): Ditto. + + * src/base/rules.mk (BASE_SRC): Remove ftgasp.c (it's already in + `modules.cfg'). + + * src/sfnt/ttsbit0.h: Remove. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c. + +2007-01-12 David Turner + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix memory stomping + bug in the bitmap emboldener if the pitch of the source bitmap is + much larger than its width. + + * src/truetype/ttinterp.c (Update_Max): Fix aliasing-related + compilation warning. + +2007-01-12 Werner Lemberg + + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `automake' CVS module from sources.redhat.com. + +2007-01-11 Werner Lemberg + + * src/type1/t1load.c (is_space): Removed. + (parse_encoding, parse_charstrings): Use IS_PS_DELIM. + (parse_charstrings): Use IS_PS_TOKEN. + + + * autogen.sh: Avoid bash specific syntax. + +2007-01-11 David Turner + + * docs/CHANGES: Small update. + + * builds/unix/configure.raw (version_info): Set to 9:11:3. + + * src/base/ftobjs.c (IsMacResource): Fix a small bug that caused a + crash with some Mac OS X .dfont files. Submitted by Masatake + Yamato. + + * autogen.sh: Small fix to get it working on Mac OS X properly: + The issue is that GNU libtool is called `glibtool' on this platform, + and we must call `glibtoolize', since `libtoolize' doesn't exist. + +2007-01-10 David Turner + + * all-sources: Tag all sources with VER-2-3-0-RC1 and + VER-2-3-0. + + * Jamfile (RefDoc), README, builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, docs/VERSION.DLL: Update + version number to 2.3.0. + + * include/freetype/freetype.h (FREETYPE_MINOR): Set to 3. + (FREETYPE_PATCH): Set to 0. + + * include/freetype/ftchapters.h, include/freetype/ftgasp.h, + include/freetype/ftlcdfil.h: Update reference documentation with + GASP support and LCD filtering sections. + + * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix a typo + which created an endless loop with some malformed font files. + +2007-01-10 Derek Clegg + + * src/type1/t1load.c (T1_Get_MM_Var): Always return fixed point + values. + +2007-01-08 David Turner + + * docs/CHANGES: Updated. + + * include/freetype/ftgasp.h, src/base/ftgasp.c: New files which add + a new API `FT_Get_Gasp' to return entries of the `gasp' table + corresponding to a given character pixel size. + + * src/sfnt/ttload.c (tt_face_load_gasp): Add version check for the + `gasp' table, in order to avoid potential problems with later + versions. + + * include/freetype/config/ftheader.h (FT_GASP_H): New macro for + . + + * src/base/rules.mk (BASE_SRC), src/base/Jamfile (_sources), + modules.cfg (BASE_EXTENSIONS), builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: Add src/base/ftgasp.c to the + default build. + +2007-01-07 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Improve error message for + Type 11 fonts. + Scan for `/sfnts' token. + +2007-01-07 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Reject Type 11 fonts. + +2007-01-06 Werner Lemberg + + * src/cff/cffload.c (cff_index_init): Remove unused variable. + (cff_index_read_offset): s/perror/errorp/ to avoid global shadowing. + +2007-01-04 David Turner + + * src/pfr/pfrobjs.c (pfr_face_init): Detect non-scalable fonts + correctly. This fixes Savannah bug #17876. + + + Do not allocate interpreter-specific tables in memory if we are not + going to load glyphs with the bytecode interpreter anyway. + + * src/truetype/ttgload.c (tt_loader_init): Load execution context + only if glyph is hinted. + Updated. + * src/truetype/ttobjs.h (TT_SizeRec): Add members `bytecode_ready' + and `cvs_ready'. + Add `tt_size_ready_bytecode' declaration. + * src/truetype/ttobjs.c (tt_size_done_bytecode, + tt_size_init_bytecode, tt_size_ready_bytecode): New functions. + (tt_size_init): Move most code into `tt_size_init_bytecode'. + (tt_size_done): Move most code into `tt_size_done_bytecode'. + (tt_size_reset): Move some code to `tt_size_ready_bytecode'. + + + Don't extract the metrics table from the SFNT font file. Instead, + reparse it on each glyph load. The runtime difference is not + noticeable, and it can save a lot of heap memory when memory-mapped + files are not used. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add members + `horz_metrics_offset' and `vert_metrics_ofset'. + * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): + Updated. + + + * src/sfnt/ttcmap.c (tt_cmap4_validate): Slight optimization. + + + Do not load the CFF index offsets into memory, since this wastes a + *lot* of heap memory with large Asian CFF fonts. There is no + significant performance loss. + + * src/cff/cffload.h: Add `cff_charset_cid_to_gindex' declaration. + * src/cff/cfftypes.h (CFF_IndexRec): Add fields `start' and + `data_size'. + (CFF_CharsetRec): Add field `num_glyphs'. + + * src/cff/cffload.c (cff_index_read_offset, cff_index_load_offsets, + cff_charset_cid_to_gindex): New functions. + (cff_new_index): Renamed to... + (cff_index_init): This. Update all callers. + Updated -- some code has been moved to `cff_index_load_offsets'. + (cff_done_index): Renamed to... + (cff_index_done): This. Update all callers. + (cff_index_get_pointers, cff_index_access_element): Updated to use + stream offsets. + (cff_charset_compute_cids): Set `num_glyphs' field. + (cff_encoding_load): Updated. + + * src/cff/cffgload.c (cff_slot_load): Updated. + +2007-01-04 David Turner + + * docs/INSTALL.UNIX: Simplify some parts, add reference to + autogen.sh and pointer to README.CVS. + + * README.CVS: Add common problem description and solution + when running autogen.sh. + + * docs/INSTALL: Add reference to MacOS X. + + * docs/MAKEPP, docs/INSTALL.MAC: New documentation files. + + * docs/TODO: Remove obsolete items. + + * src/raster/ftraster.c: (TRaster_Instance): Replace it with... + (TWorker): This. + Remove `count_table' and `memory'. + Make `grays' a pointer. + (TRaster): New structure. + (count_table): New static array. + (RAS_ARGS, RAS_ARG, RAS_VARS, RAS_VAR, FT_UNUSED_RASTER, cur_ras, + Vertical_Gray_Sweep_Step, ft_black_new, ft_black_done, + ft_black_set_mode, ft_black_render): Updated. + (ft_black_init): Don't initialize `count_table'. + (ft_black_reset): Use the render pool. This saves about 6KB of + heap space for each FT_Library instance. + + * src/smooth/ftgrays.c (TRaster): Replaced with... + (TWorker): This. + Remove `memory'. + (TRaster): New structure. + + (RAS_ARG_, RAS_ARG, RAS_VAR_, RAS_VAR, ras, gray_render_line, + gray_move_to, gray_line_to, gray_conic_to, gray_cubic_to, + gray_render_span, gray_raster_render): Updated. + (gray_raster_reset): Use the render pool. This saves about 6KB of + heap space for each FT_Library instance. + + * src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h, + src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, + src/truetype/ttpload.c, include/freetype/config/ftoption.h: Remove + FT_OPTIMIZE_MEMORY macro (and code for !FT_OPTIMIZE_MEMORY) since + the optimization is no longer experimental. + + * src/pshinter/pshalgo.c (psh_glyph_interpolate_normal_points): + Remove a typo that results in no hinting and a memory leak with some + large Asian CFF fonts. + + * src/base/ftobjs.c (FT_Done_Library): Remove a subtle memory leak + which happens when FT_Done_Library is called with still opened + CFF_Faces in it. We need to close all faces before destroying the + modules, or else some bad things (memory leaks) may happen. + +2007-01-02 Werner Lemberg + + * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): + Remove compiler warning. + +2007-01-02 David Turner + + * src/sfnt/sfobjs.c: Add documentation comment. + +2006-12-31 Masatake YAMATO + + * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): New + function. + Check uniqueness of the gid pairs. + (gxv_kern_subtable_fmt0_validate): Move some code to + `gxv_kern_subtable_fmt0_pairs_validate'. + +2006-12-22 David Turner + + * src/autofit/aflatin.c, src/truetype/ttgload.c: Remove compiler + warnings. + + * builds/win32/visualc/freetype.vcproj: Add _CRT_SECURE_NO_DEPRECATE + to avoid deprecation warnings with Visual C++ 8. + +2006-12-16 Anders Kaseorg + + * src/base/ftlcdfil.c (FT_Library_SetLcdFilter) + [FT_FORCE_LIGHT_LCD_FILTER]: Fix typo. + +2006-12-15 suzuki toshiya + + * include/freetype/internal/services/svotval.h: Add `volatile' to + sync with the modification by Jens Claudius on 2006-08-22; cf. + http://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5 + +2006-12-15 suzuki toshiya + + * src/base/ftmac.c: Specialized for Mac OS X only. + * builds/unix/ftconfig.in: Fixed for ppc64 missing Carbon framework. + * builds/unix/configure.raw: Ditto. When explicit switches for + FSSpec/FSRef/QuickDraw/ATS availability are given to configure, + builds/mac/ftmac.c is used instead of default src/base/ftmac.c. + +2006-12-15 suzuki toshiya + + * builds/mac/ftmac.c: Copied src/base/ftmac.c for legacy system. + * builds/mac/FreeType.m68k_cfm.make.txt: Fix to use builds/mac/ftmac.c + instead of src/base/ftmac.c + * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. + * builds/mac/FreeType.ppc_classic.make.txt: Ditto. + * builds/mac/FreeType.m68k_far.make.txt: Ditto, and exclude gxvalid.c + that cannot be built at present. + +2006-12-15 suzuki toshiya + + * src/base/ftobjs.c: Improvement of resource fork handler for + POSIX, cf. + http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html + (Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font + format or .dfont, to simulate the face index number counted by ftmac.c. + (IsMacResource): Return the number of scalable faces correctly. + +2006-12-10 Werner Lemberg + + * builds/toplevel.mk (version): Protect against `distclean' target. + +2006-12-09 Werner Lemberg + + * builds/*/*def.mk, builds/*/detect.mk (CAT): Define to either `cat' + or `type'. + + * builds/freetype.mk (version): Extracted from freetype.h, using + GNU make's built-in string functions. + (refdoc): Use $(version) instead of static version number. + +2006-12-08 Werner Lemberg + + * builds/toplevel.mk (dist): Extract version number from freetype.h. + +2006-12-08 Vladimir Volovich + + * src/tools/apinames (State): Remove final comma in structure -- xlc + v5 under AIX 4.3 doesn't like this. + +2006-12-07 David Turner + + * src/autofit/afloader.c (af_loader_load_g): Small adjustment + to the spacing of auto-fitted glyphs. This only impacts rare + cases (e.g., Arial Bold at rather small character sizes). + +2006-12-03 Werner Lemberg + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. + +2006-12-01 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): All Unicode strings are + encoded in UTF-16BE. Patch from Rajeev Pahuja . + (tt_name_entry_ascii_from_ucs4): Removed. + + + * include/freetype/ftxf86.h: Fix and extend comment so that it + appears in the documentation. + + * include/freetype/ftchapters.h: Add `font_format' section. + + + * src/tools/docmaker/tohtml.py (HtmlFormatter::index_exit): Add link + to TOC in index page. + +2006-11-28 David Turner + + * src/smooth/ftgrays.c (gray_raster_render): Return 0 when we are + trying to render into a zero-width/height bitmap, not an error code. + + * src/truetype/ttobjs.c (tt_face_init): Fix typo in previous patch. + + * src/smooth/ftgrays.c: Remove hard-coded error values; use FreeType + ones instead. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments): Remove unused + variable. + +2006-11-26 Pierre Hanser + + * src/truetype/ttobjs.c (tt_face_init): Protect against NULL pointer. + +2006-11-25 David Turner + + * src/autofit/afhints.c (af_glyph_hints_dump_points, + af_glyph_hints_dump_segments, af_glyph_hints_dumpedges) [!AF_DEBUG]: + Add stubs to link the `ftgrid' test program when debugging is + disabled in the auto-hinter. + +2006-11-23 David Turner + + * src/autofit/afhints.c, src/autofit/afhints.h, src/autofit/aflatin.c, + src/autofit/aftypes.h: Miscellaneous auto-hinter improvements. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments) [AF_DEBUG]: + Emit more sensible information. + + * src/autofit/afhints.h (AF_SegmentRec): Add `height' member. + + * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Improve + rounding of blue values. + (af_latin_hints_compute_segments): Hint segment heights. + (af_latin_hints_link_segments): Reduce `len_score' value. + (af_latin_hints_compute_edges): Increase `segment_length_threshold' + value and use `height' member for comparisons. + (af_latin_hint_edges): Extend logging message. + Improve handling of remaining edges. + +2006-11-22 Werner Lemberg + + Fix Savannah bug #15553. + + * src/truetype/ttgload.c (tt_loader_init): Re-execute the CVT + program after a change from mono to grayscaling (and vice versa). + Use correct constant for comparison to get `exec->grayscale'. + +2006-11-18 Werner Lemberg + + Because FT_Load_Glyph expects CID values for CID-keyed fonts, the + test for a valid glyph index must be deferred to the font drivers. + This patch fixes Savannah bug #18301. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't check `glyph_index'. + * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/cff/cffgload.c + (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph), + src/pcf/pcfdrivr.c (PCF_Glyph_Load), src/pfr/pfrobjs.c + (pfr_slot_load), src/truetype/ttdriver.c (Load_Glyph), + src/type1/t1gload.c (T1_Load_Glyph), src/winfonts/winfnt.c + (FNT_Load_Glyph): Check validity of `glyph_index'. + +2006-11-13 David Turner + + * src/truetype/ttinterp.c (FIX_BYTECODE): Undefine. The interpreter + `enhancements' are still too buggy for general use. + + * src/base/ftlcdfil.c: Add support for FT_FORCE_LIGHT_LCD_FILTER and + FT_FORCE_LEGACY_LCD_FILTER at compile time. Define these macros + when building the library to change the default LCD filter to be + used. This is only useful for experimentation. + + * include/freetype/ftlcdfil.h: Update documentation. + +2006-11-10 David Turner + + * src/smooth/ftsmooth.c: API change for the LCD + filter. The FT_LcdFilter value is an enumeration describing which + filter to apply, with new values FT_LCD_FILTER_LIGHT and + FT_LCD_FILTER_LEGACY (the latter implements the LibXft original + algorithm which produces strong color fringes for everything + except very-well hinted text). + + * include/freetype/ftlcdfil.h (FT_Library_SetLcdFilter): Change + second parameter to an enum type. + + * src/base/ftlcdfil.c (USE_LEGACY): Define. + (_ft_lcd_filter): Rename to... + (_ft_lcd_filter_fir): This. + Update parameters. + (_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function. + (FT_Library_Set_LcdFilter): Update parameters. + Handle new filter modes. + + * include/internal/ftobjs.h: Include FT_LCD_FILTER_H. + (FT_Bitmap_LcdFilterFunc): Change third argument to `FT_Library'. + (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add filtering + callback and update other fields. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic) + [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Update. + Other minor improvements. + + * src/autofit/aflatin.c: Various tiny improvements that drastically + improve the handling of serif fonts and of LCD/LCD_V hinting modes. + (af_latin_hints_compute_edges): Fix typo. + (af_latin_compute_stem_width): Take better care of diagonal stems. + +2006-11-09 David Turner + + * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix + typo which created a variable-used-before-initialized bug. + +2006-11-07 Zhe Su + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle vertical layout + also. + +2006-11-03 Werner Lemberg + + * src/base/ftcalc.c: Don't use `long long' but `FT_Int64'. + +2006-11-02 David Turner + + Add a few tweaks to better handle serif fonts. + Add more debugging messages. + + * src/autofit/aflatin.c (af_latin_hints_compute_edges): Ignore + segments that are less than 1.5 pixels high. This gets rid of + *many* corner cases with serifs. + (af_latin_align_linked_edge): Add logging message. + (af_latin_hint_edges): Use AF_HINTS_DO_BLUES. + Add logging messages. + Handle AF_EDGE_FLAG flag specially. + + * src/autofit/afmodule.c [AF_DEBUG]: Add _af_debug, + _af_debug_disable_blue_hints, and _af_debug_hints variables. + + * src/autofit/aftypes.h (AF_LOG) [AF_DEBUG]: Use _af_debug. + Update external declarations. + (af_corner_orientation, af_corner_is_flat): Replaced by... + + * include/freetype/internal/ftcalc.h (ft_corner_orientation, + ft_corner_is_flat): These declarations. + + * src/autofit/afangles.c (af_corner_orientation, af_corner_is_flat): + Comment out. Replaced by... + + * src/base/ftcalc.h (ft_corner_orientation, ft_corner_is_flat): + These functions. Update all callers. + (FT_Add64) [!FT_LONG64]: Simplify. + + * src/autofit/afhints.c: Include FT_INTERNAL_CALC_H. + (af_direction_compute): Add a missing FT_ABS call. This bug caused + production of garbage by missing lots of segments. + + * src/autofit/afhints.h (AF_HINTS_DO_BLUES): New macro. + + * src/autofit/afloader.c (af_loader_init, af_loader_done) + [AF_DEBUG]: Set _af_debug_hints. + + + * src/pshinter/pshalgo.c: Include FT_INTERNAL_CALC_H. + (psh_corner_is_flat, psh_corner_orientation): Use ft_corner_is_flat + and ft_corner_orientation. + + + * src/gzip/inftrees.c (huft_build): Remove compiler warning. + +2006-10-24 Werner Lemberg + + * src/cff/cffload.c (cff_encoding_load): Remove unused variable. + + * src/base/ftobjs.c (FT_Select_Charmap): Disallow FT_ENCODING_NONE + as argument. + +2006-10-23 Zhe Su + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Re-implement to + better deal with broken Asian fonts with strange glyphs, having + self-intersections and other peculiarities. The used algorithm is + based on the nonzero winding rule. + +2006-10-23 David Turner + + Speed up the CFF font loader. With some large CFF fonts, + FT_Open_Face is now more than three times faster. + + * src/cff/cffload.c (cff_get_offset): Removed. + (cff_new_index): Inline functionality of `cff_get_offset'. + (cff_charset_compute_cids, cff_charset_free_cids): New functions. + (cff_charset_done): Call `cff_charset_free_cids'. + (cff_charset_load): Call `cff_charset_compute_cids'. + (cff_encoding_load) : Ditto, to replace inefficient loop. + + * src/sfnt/ttmtx.c (tt_face_load_hmtx): Replace calls to FT_GET_XXX + with FT_NEXT_XXX. + + + Speed up the Postscript hinter, with more than 100% speed increase + on my machine. + + * src/pshinter/pshalgo.c (psh_corner_is_flat, + psh_corner_orientation): New functions. + (psh_glyph_compute_inflections): Merge loops for efficiency. + Use `psh_corner_orientation'. + (psh_glyph_init): Use `psh_corner_is_flat'. + (psh_hint_table_find_strong_point): Renamed to... + (psh_hint_table_find_strong_points): This. + Rewrite, adding argument to handle all points at once. + Update all callers. + (PSH_MAX_STRONG_INTERNAL): New macro. + (psh_glyph_interpolate_normal_points): Rewrite for efficiency. + +2006-10-15 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_FOND): Initialize variable + `error' with FT_Err_Ok. + +2006-10-14 suzuki toshiya + + * docs/INSTALL.CROSS: New document file for cross-building. + + * builds/unix/configure.raw: Preliminary cross-building support. + Find native C compiler and pass it by CC_BUILD, and + find suffix for native executable and pass it by EXEEXT_BUILD. + Also suffix for target executable is passed by EXEEXT. + + * builds/unix/unix-cc.in (CCraw_build, E_BUILD): New variables to + build `apinames' which runs on building system. They are set by + CC_BUILD and EXEEXT_BUILD. + + * builds/exports.mk (APINAMES_EXE): Change the extension for + apinames from the suffix for target (E) to that for building host + (E_BUILD). + +2006-10-12 Werner Lemberg + + * docs/INSTALL.UNX, docs/UPGRADE.UNX: Renamed to... + * docs/INSTALL.UNIX, docs/UPGRADE.UNIX: This. Update all documents + which reference those files. + +2006-10-12 suzuki toshiya + + * builds/unix/configure.raw (FT2_EXTRA_LIBS): New variable. It is + embedded in freetype2.pc and freetype-config. Use it to record + Carbon dependency of MacOSX. + + * builds/unix/freetype2.in: Embed FT2_EXTRA_LIBS. + + * builds/unix/freetype-config.in: Ditto. + +2006-10-11 Werner Lemberg + + * devel/ftoption.h (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): Define for + development. + +2006-10-03 Jens Claudius + + * include/freetype/config/ftstdlib.h: Cast away volatileness from + argument to ft_setjmp. + + * include/freetype/internal/ftvalid.h: Add comment that + ft_validator_run must not be used. + +2006-10-01 Werner Lemberg + + * src/base/ftbase.c: Undo change from 2006-09-30. + + * src/base/rules.mk (BASE_SRC): Remove `ftlcdfil.c'. + +2006-09-30 David Turner + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): + s/unpatented_hinting/ignore_unpatented_hinter/. + Update all callers. + + * src/base/ftobjs.c (FT_Load_Glyph): Refine the algorithm whether + auto-hinting shall be used or not. + + * src/truetype/ttobjs.c (tt_face_init): Ditto. + +2006-09-30 Werner Lemberg + + * src/base/rules.mk (BASE_SRC): Remove `ftapi.c' (which is no longer + in use). + + * src/base/ftbase.c: Include `ftlcdfil.c'. + +2006-09-29 Werner Lemberg + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Fix algorithm for + overlapping segments. Bug reported by Stefan Koch. + +2006-09-28 David Turner + + Fix a bug in the automatic unpatented hinting support which prevents + normal bytecode hinting to work properly. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): + s/force_autohint/unpatented_hinting/. Update all callers. + + * src/base/ftobjs.c (FT_Load_Glyph): Updated code. + + * src/autofit/aftypes.h (AF_DEBUG): Undefine to get rid of traces. + +2006-09-27 David Turner + + * include/freetype/freetype.h (FT_FREETYPE_PATCH): Set to 2. + + + Add a new API to support color filtering of subpixel glyph bitmaps. + In a default build, the function `FT_Library_SetLcdFilter' returns + `FT_Err_Unimplemented_Feature'; you need to #define + FT_CONFIG_OPTION_SUBPIXEL_RENDERING in ftoption.h to compile the + real implementation. + + * include/freetype/ftlcdfil.h, src/base/ftlcdfil.c: New files. + + * include/freetype/internal/ftobjs.h (FT_Bitmap_LcdFilterFunc): New + typedef. + (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: New members + `lcd_filter_weights' and `lcd_filter'. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove arguments + `hmul' and `vmul'. + + Handle subpixel rendering. + Simplify function. + (ft_smooth_render_lcd): Use `FT_RENDER_MODE_LCD'. + (ft_smooth_render_lcd_v): Use `FT_RENDER_MODE_LCD_V'. + + * include/freetype/config/ftheader.h (FT_LCD_FILTER_H): New macro, + pointing to . + + * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC), + vms_make.com: Add `ftlcdfil.c' to the list of compiled source files. + + * modules.cfg (BASE_EXTENSIONS): Add ftlcdfil.c. + +2006-09-26 David Bustin + + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Skip adjustment bytes + correctly. Reported as Savannah bug #17843. + +2006-09-26 David Turner + + * src/autofit/afhints.h (AF_HINTS_DO_HORIZONTAL, + AF_HINTS_DO_VERTICAL, AF_HINTS_DO_ADVANCE): New macros to disable + horizontal and vertical hinting for the purpose of debugging the + auto-fitter. + + * src/autofit/afmodule.c (_af_debug_disable_horz_hints, + _af_debug_disable_vert_hints) [AF_DEBUG]: New global variables. + + * src/autofit/aftypes.h [AF_DEBUG]: Declare above variables. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): New macro to control whether + we want to compile LCD-optimized rendering code (à la ClearType) or + not. The macro *must* be disabled in default builds of the library + for patent reasons. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Disable + LCD-specific rendering when FT_CONFIG_OPTION_SUBPIXEL_RENDERING + isn't defined at compile time. This only changes the content of the + rendered glyph to match the one of normal gray-level rendering, + hence clients should not need to be modified. + + * docs/CHANGES: Updated. + +2006-09-18 Garrick Meeker + + * src/base/ftmac.c (FT_New_Face_From_FOND): Fall back to SFNT if + LWFN fails and both are available. + +2006-09-11 David Turner + + * src/sfnt/sfobjs.c (tt_face_get_name): Support some fonts which + report their English names through an Apple Roman + (platform,encoding) pair, with language_id != English. + + If the font uses another name entry with language_id == English, it + will be selected correctly, though. + + * src/truetype/ttobjs.c (tt_face_init): Add unpatented hinting + selection for `mingli.ttf'. + +2006-09-05 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_hdmx): Handle `record_size' + values which have the upper two bytes set to 0xFF instead of 0x00 + (as it happens in at least two CJKV fonts, `HAN NOM A.ttf' and + `HAN NOM B.ttf'). + + * src/smooth/ftgrays.c [GRAYS_USE_GAMMA]: Really remove all code. + +2006-09-05 David Turner + + Minor source cleanups and optimizations. + + * src/smooth/ftgrays.c (GRAYS_COMPACT): Removed. + (TRaster): Remove `count_ex' and `count_ey'. + (gray_find_cell): Remove 2nd and 3rd argument. + (gray_alloc_cell): Merged with `gray_find_cell'. + (gray_record_cell): Simplify. + (gray_set_cell): Rewrite. + (gray_start_cell): Apply offsets to `ras.ex' and `ras.ey'. + (gray_render_span): Don't use FT_MEM_SET for small values. + (gray_dump_cells) [DEBUG_GRAYS]: New function. + (gray_sweep): Avoid buffer overwrites when to drawing the end of a + bitmap scanline. + (gray_convert_glyph): Fix speed-up. + +2006-09-04 David Turner + + * src/smooth/ftgrays.c (gray_convert_glyphs): Make it work with + 64bit processors. + +2006-09-03 Werner Lemberg + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/smooth/ftgrays.c (gray_record_cell): Remove shadowing + variable declaration. + (gray_convert_glyph): Fix compiler warnings. + +2006-09-01 David Turner + + * src/truetype/ttobjs.c (tt_face_init): Update the TrueType loader + to recognize a few fonts that require the automatic unpatented + loader. + + * src/smooth/ftgrays.c: Optmize the performance of the anti-aliased + rasterizer. The speed improvement is between 15% and 25%, depending + on the font data. + + (GRAYS_USE_GAMMA, GRAYS_COMPACT): Removed, and all associated code. + (TCell): Redefine. + (TRaster): New members `buffer', `buffer_size', `ycells', `ycount'. + (gray_init_cells): Updated. + (gray_find_cell, gray_alloc_cell): New functions. + (gray_record_cell): Rewritten to use `gray_find_cell' and + `gray_alloc_cell'. + (PACK, LESS_THAN, SWAP_CELLS, DEBUG_SORT, QUICK_SORT, SHELL_SORT, + QSORT_THRESHOLD): + Removed. + (gray_shell_sort, gray_quick_sort, gray_check_sort, + gray_dump_cells): Removed. + (gray_sweep): Rewritten. + (gray_convert_glyph): Rewrite code which used one of the sorting + functions. + (gray_raster_render): Updated. + +2006-08-29 Dr. Werner Fink + + * configure: Make it possible to handle configure options which + have strings containing spaces. + +2006-08-27 David Turner + + * include/freetype/config/ftoption.h (TT_USE_BYTECODE_INTERPRETER): + New macro, defined if either TT_CONFIG_OPTION_BYTECODE_INTERPRETER + or TT_CONFIG_OPTION_UNPATENTED_HINTING is defined. + + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c, + src/truetype/truetype.c, src/truetype/ttdriver.c, + src/truetype/ttgload.c, src/truetype/ttgload.h, + src/truetype/ttinterp.c, src/truetype/ttobjs.c, + src/truetype/ttobjs.h, src/truetype/ttpload.c, src/type42/t42drivr.c: + s/TT_CONFIG_OPTION_BYTECODE_INTERPRETER/TT_USE_BYTECODE_INTERPRETER/. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New + member `force_autohint'. + + * src/base/ftobjs.c (FT_Load_Glyph): Use `force_autohint'. + + * src/truetype/ttobjs.c (tt_face_init): Prepare code for testing + against a list of font names which need the bytecode interpreter. + +2006-08-27 Jens Claudius + + Fix miscellaneous compiler warnings. + + * include/freetype/internal/ftobjs.h: Close comment with `*/' to + avoid `/* in comment' compiler warning. + + * src/base/ftdbgmem.c (ft_mem_table_get_source): Turn cast + `(FT_UInt32)(void*)' into `(FT_UInt32)(FT_PtrDist)(void*)' since on + 64-bit platforms void* is larger than FT_UInt32. + + * src/base/ftobjs.c (t_validator_error): Cast away + volatileness of argument to ft_longjmp. Spotted by Werner + `Putzfrau' Lemberg. + + * src/bdf/bdflib.c (bdf_load_font): Initialize local + variable `lineno'. + + * src/gxvalid/gxvmod.c (classic_kern_validate): Mark local variable + `error' as volatile. + +2006-08-27 Werner Lemberg + + * builds/unix/ftconfig.in: Synchronize with main ftconfig.h. + Reported by Jens. + +2006-08-22 Jens Claudius + + Fix for previous commit, which caused many compiler warnings/errors + about addresses of volatile objects passed as function arguments as + non-volatile pointers. + + * include/freetype/internal/ftvalid.h: Make FT_Validator typedef a + pointer to a volatile object. + + * src/gxvalid/gxvmod.c (gxv_load_table): Make function argument + `table' a pointer to a volatile object. + + * src/otvalid/otvmod.c (otv_load_table): Make function argument + `table' a pointer to a volatile object. + +2006-08-18 Jens Claudius + + * src/gxvalid/gxvmod.c (GXV_TABLE_DECL): Mark local variable `_sfnt' + as volatile since it must keep its value across a call to ft_setjmp. + (gxv_validate): Same for local variables `memory' and `valid'. + (classic_kern_validate): Same for local variables `memory', + `ckern', and `valid'. + + * src/otvalid/otvmod.c (otv_validate): Same for function parameter + `face' and local variables `base', `gdef', `gpos', `gsub', `jstf', + and 'valid'. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Same for local variable + `cmap'. + +2006-08-16 David Turner + + * src/cid/cidgload.c (cid_slot_load_glyph): Remove compiler + warnings. + + * src/base/ftobjs.c (ft_validator_run): Disable function; it is + buggy by design. Always return -1. + + + Improvements to native TrueType hinting. This is a first try, + controlled by the FIX_BYTECODE macro in src/truetype/ttinterp.c. + + * include/freetype/internal/ftgloadr.h (FT_GlyphLoadRec): Add member + `extra_points2'. + + * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add member + `orus'. + + * src/base/ftgloadr.c (FT_GlyphLoader_Reset, + FT_GlyphLoader_Adjust_Points, FT_GlyphLoader_CreateExtra, + FT_GlyphLoader_CheckPoints, FT_GlyphLoader_CopyPoints): Updated to + handle `extra_points2'. + + * src/truetype/ttgload.c (tt_prepare_zone): Handle `orus'. + Remove compiler warning. + (cur_to_arg): Remove macro. + (TT_Hint_Glyph): Updated. + (TT_Process_Simple_Glyph): Handle `orus'. + + * src/truetype/ttinterp.c (FIX_BYTECODE): New macro. + (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Handle `orus'. + (LOC_Ins_IUP): Renamed to... + (IUP_WorkerRec): This. + Add `orus' member. + (Shift): Renamed to... + (_iup_worker_shift): This. + Updated. + (Interp): Renamed to... + (_iup_worker_interpolate): This. + Updated to handle `orus'. + (Ins_IUP): Updated. + + * src/truetype/ttobjs.c (tt_glyphzone_done, tt_glyphzone_new): + Handle `orus'. + +2006-08-15 suzuki toshiya + + * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to + build ftvalid in ft2demos. This has been inadvertedly changed + 2006-08-13. + +2006-08-15 suzuki toshiya + + `ft_validator_run' wrapping `setjmp' can cause a crash, as found by + Jens: + http://lists.nongnu.org/archive/html/freetype-devel/2006-08/msg00004.htm. + + * src/otvalid/otvmod.c: Replace `ft_validator_run' by `ft_setjmp'. + It reverts the change introduced on 2005-08-20. + + * src/gxvalid/gxvmod.c: Ditto. + +2006-08-13 Jens Claudius + + * finclude/freetype/internal/psaux.h: (T1_TokenType): Add + T1_TOKEN_TYPE_KEY. + (T1_FieldRec): Add `dict'. + (T1_FIELD_DICT_FONTDICT, T1_FIELD_DICT_PRIVATE): New macros. + (T1_NEW_XXX, T1_FIELD_XXX): Update to take the dictionary where a PS + keyword is expected as an additional argument. + + * src/cid/cidload.c: (cid_field_records): Adjust invocations of + T1_FIELD_XXX. + + * src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX. + + * src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing. + (ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY, + not T1_TOKEN_TYPE_ANY. + (ps_parser_load_field): Make sure a token that should be a string or + name is really a string or name. + Avoid memory leak if a keyword has been already encountered and its + value is overwritten. + * src/type1/t1load.c: (t1_keywords): Adjust invocations of + T1_FIELD_XXX. + (parse_dict): Ignore keywords that occur in the wrong dictionary + (e.g., in `Private' instead of `FontDict'). + + * src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX. + + * src/type42/t42parse.c: (t42_keywords): Adjust invocations of + T1_FIELD_XXX. + +2006-07-18 Jens Claudius + + Move creation of field `buildchar' of T1_DecoderRec out of + `t1_decoder_init' and let the caller of `t1_decoder_init' take care + of it. + + Call the finisher for T1_Decoder in `cid_face_compute_max_advance' + and `T1_Compute_Max_Advance'. + + * include/freetype/internal/psaux.h (T1_DecoderRec): Remove field + `face', add `len_buildchar'. + + * include/freetype/internal/t1types.h (T1_FaceRec): Add field + `buildchar'. + + * src/cid/cidgload.c (cid_face_compute_max_advance): Call finisher + for T1_Decoder. + (cid_slot_load_glyph): Do not ignore failure when initializing the + T1_Decoder. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Updated. + (t1_decoder_init): Remove initialization of fields `buildchar' and + `len_buildchar'. + (t1_decoder_done): Remove deallocation of field `buildchar'. + + * freetype/src/type1/t1gload.c (T1_Compute_Max_Advance): Initialize + T1_Decoder's `buildchar' and `len_buildchar'; call finisher for + T1_Decoder. + (T1_Load_Glyph): Initialize T1_Decoder's `buildchar' and + `len_buildchar'; make sure to call finisher for T1_Decoder even in + case of error. + + * src/type1/t1load.c (T1_Open_Face): Allocate new field `buildchar' + of T1_FaceRec. + + * src/type1/t1objs.c (T1_Face_Done): Free new field `buildchar' of + T1_FaceRec. + +2006-07-14 Jens Claudius + + * include/freetype/internal/psaux.h: New macros IS_PS_NEWLINE, + IS_PS_SPACE, IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, + and IS_PS_BASE85 (from src/psaux/psconv.h). + (T1_FieldLocation): Add T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, and T1_FIELD_LOCATION_BLEND. + (T1_DecoderRec): New fields `buildchar' and `face'. + (IS_PS_TOKEN): New macro. + + * include/freetype/internal/t1types.h (T1_FaceRec): New fields + `ndv_idx', `cdv_idx', and `len_buildchar'. + + * include/freetype/t1tables.h (PS_BlendRec): New fields + `default_design_vector' and `num_default_design_vector'. + + * src/psaux/psconv.h: Move macros IS_PS_NEWLINE, IS_PS_SPACE, + IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, and + IS_PS_BASE85 to include/freetype/internal/psaux.h. + + * src/psaux/psobjs.c (ps_parser_to_token_array): Allow `token' + argument to be NULL if we want only to count the number of tokens. + (ps_tocoordarray): Allow `coords' argument to be NULL if we just + want to skip the array. + (ps_tofixedarray): Allow `values' argument to be NULL if we just + want to skip the array. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add support + for (partially commented out) othersubrs 19-25, 27, and 28. + (t1_decoder_init): Initialize new fields `face' and `buildchar'. + (t1_decoder_done): Release new field `buildchar'. + + * src/type1/t1load.c (parse_buildchar, parse_private): New + functions. + (t1_keywords): Register them. + (t1_allocate_blend): Updated. + (t1_load_keyword): Handle field types T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE and T1_FIELD_LOCATION_BLEND. + (parse_dict): Remove `keyword_flags' argument. + Use new macro IS_PS_TOKEN. + Changed function so that later PostScript definitions override + earlier ones. + (t1_init_loader): Initialize new field `keywords_encountered'. + (T1_Open_Face): Initialize new fields `ndv_idx', `cdv_idx', and + `len_buildchar'. + Remove `keywords_flags'. + + * src/type1/t1load.h (T1_LoaderRect): New field + `keywords_encountered'. + (T1_PRIVATE, T1_FONTDIR_AFTER_PRIVATE): New macros. + + * src/type1/t1tokens.h [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: New + entries for parsing /NDV, /CDV, and /DesignVector. + +2006-07-07 Werner Lemberg + + Add many checks to protect against malformed PCF files. + + * src/pcf/pcfdrivr.c (PCF_Face_Done): Protect against NULL pointers. + (PCF_Face_Init): Add calls to PCF_Face_Done in case of errors. + + * src/pcf/pcfread.c (pcf_read_TOC): Protect against malformed table + data and check that tables don't overlap (using a simple + bubblesort). + (PCF_METRIC_SIZE, PCF_COMPRESSED_METRIC_SIZE, PCF_PROPERTY_SIZE): + New macros which give the size of data structures in the data + stream. + (pcf_get_properties): Use rough estimates to get array size limits. + Assign `face->nprops' and `face->properties' earlier so that a call + to PCF_Face_Done can do the clean-up in case of error. + Protect against invalid string offsets. + (pcf_get_metrics): Clean up code. + Adjust tracing message levels. + Use rough estimate to get array size limit. + (pcf_get_bitmaps): Clean up code. + Adjust tracing message levels. + Use rough estimates to get offset limits. + (pcf_get_encodings): Adjust tracing message level. + (pcf_get_accel): Clean up code. + +2006-06-26 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Handle fonts correctly which + don't have a POINT_SIZE property. This fixes Savannah bug #16914. + +2006-06-26 Jens Claudius + + * src/psaux/t1decode.c (T1_Operator, t1_args_count): Add opcode 15. + (t1_decoder_parse_charstrings): Operator with + opcode 15 pops its two arguments. + Handle the case where the pops of an othersubr may be part of a + subroutine. + Handle unknown othersubrs gracefully: count their operands and let + the following pop operators push the operands as the results onto + the Type1 stack. + Improve handling of setcurrentpoint opcode. + +2006-06-25 Jens Claudius + + The Type 1 parser now skips over top-level procedures as required + for a `Simplified Parser'. This makes the parser more robust as it + doesn't poke around in PostScript code. Additionally, it makes the + FontDirectory hackery in src/type1/t1load.c unnecessary. + + * src/psaux/psobjs.c (IS_OCTAL_DIGIT): New macro. + (skip_literal_string): Add FT_Error as return value. + Handle escapes better. + (skip_string): Add FT_Error as return value. + Don't set `parser->error' but return error code directly. + (skip_procedure): New function. + (ps_parser_skip_PS_token): Handle procedures. + Update code. + (ps_parser_to_token): Update code. + (ps_parser_load_field_table): Handle bbox entries also. + + * src/type1/t1load.c (parse_dict): Remove FontDirectory hackery. + Add commented-out code for synthetic fonts. + +2006-06-24 Eugeniy Meshcheryakov + + Fix two hinting bugs as reported in + http://lists.nongnu.org/archive/html/freetype-devel/2006-06/msg00057.html. + + * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add + `first_point' member. + + * src/truetype/ttgload.c (tt_prepare_zone): Initialize + `first_point'. + (TT_Process_Composite_Glyph): Always untouch points. + + * src/truetype/ttinterp.c (Ins_SHC): Fix computation of + `first_point' and `last_point' in case of composite glyphs. + (Ins_IUP): Fix computation of `end_point'. + +2006-06-22 suzuki toshiya + + Insert EndianS16_BtoN and EndianS32_BtoN as workaround for Intel + Mac. The original patch was written by David Sachitano and Lawrence + Coopet, and modified by Sean McBride for MPW compatibility. Only + required data are converted; unused data are left in big endian. + + * src/base/ftmac.c: Include for byteorder macros for non + Mac OS X platforms. + (OS_INLINE): Undefine before definition. + (count_faces_sfnt): Insert EndianS16_BtoN to parse the header of + FontAssociation table in FOND resource. + (count_faces_scalable): Insert EndianS16_BtoN to parse the header + and fontSize at each entry of FontAssociation table in FOND + resource. + (parse_fond): Insert EndianS16_BtoN and EndianS32_BtoN to parse + ffStylOff of FamilyRecord header of FOND resource, the header, + fontSize, fontID at each entry of FontAssociation table, and + StyleMapping table. + (count_faces): Call `HUnlock' after all FOND utilization. + +2006-06-08 suzuki toshiya + + Public API of TrueTypeGX, OpenType, and classic kern table validator + should return `FT_Err_Unimplemented_Feature' if validation service + is unavailable (disabled in `modules.cfg'). It is originally + suggested by David Turner, cf. + http://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html + + * src/base/ftgxval.c (FT_TrueTypeGX_Validate): Return + FT_Err_Unimplemented_Feature if TrueTypeGX validation service is + unavailable. + (FT_ClassicKern_Validate): Return FT_Err_Unimplemented_Feature if + classic kern table validation service is unavailable. + + * src/base/ftotval.c (FT_OpenType_Validate): Return + FT_Err_Unimplemented_Feature if OpenType validation service is + unavailable. + +2006-06-08 Werner Lemberg + + * src/bdf/bdflib.c (bdf_load_font): Fix memory leaks in case of + errors. + +2006-06-07 David Turner + + * src/type1/t1afm.c (KERN_INDEX): Make it more robust. + (T1_Read_Metrics): Fix memory leak which happened when the metrics + file doesn't have kerning pairs. This fixes Savannah bug #16768. + +2006-06-06 David Turner + + Fix memory leak described in Savannah bug #16759. + + We change `ps_unicodes_init' so that it also takes a + `free_glyph_name' callback to release the glyph names returned by + `get_glyph_name' + + * include/freetype/internal/services/svpscmap.h (PS_Glyph_NameFunc): + Renamed to ... + (PS_GetGlyphNameFunc): This. + (PS_FreeGlyphNameFunc): New typedef. + (PS_Unicodes_InitFunc): Add variable for PS_FreeGlyphNameFunc. + + * src/cff/cffcmap.c (cff_sid_to_glyph_name): Use `TT_Face' for first + argument. + (cff_sid_free_glyph_name): New function. + (cff_cmap_unicode_init): Updated. + + * src/psaux/t1cmap.c (t1_cmap_unicode_init): Updated. + + * src/psnames/psmodule.c (ps_unicodes_init): Add variable for + PS_FreeGlyphNameFunc and use it. + + +2006-06-04 David Turner + + * src/base/ftutil.c (ft_mem_qrealloc): Fix the function to accept + `item_size == 0' as well -- though this sounds weird, it can + theoretically happen. This fixes Savannah bug #16669. + + * src/pfr/pfrobjs.c (pfr_face_init): Fix the computation + of `face->num_glyphs' which missed the last glyph, due to + the offset-by-1 computation, since the PFR format doesn't + guarantee that glyph index 0 corresponds to the `missing + glyph. This fixes Savannah bug #16668. + +2006-05-25 Werner Lemberg + + * builds/unix/unix-cc.in (LINK_LIBRARY): Don't comment out + `-no-undefined'. Reported by Christian Biesinger. + +2006-05-19 Brian Weed + + * builds/win32/visualc/freetype.dsp: Release libraries no longer + have debug information, and debug libraries use `C7 compatible' + debug info. + +2006-05-19 suzuki toshiya + + Apply patch by Derek Clegg to fix two memory leaks in the MacOS + resource fork handler. This fixes Savannah bug #16631. + + * src/base/ftobjs.c (load_face_in_embedded_rfork): Replace + `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. + + * src/base/ftrfrk.c (raccess_guess_linux_double_from_file_name): + Replace `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. + +2006-05-19 suzuki toshiya + + * build/unix/configure.raw: Add a fallback to disable Carbon + dependency, if configured with no options on Mac OS X. + +2006-05-19 suzuki toshiya + + * src/base/ftmac.c (open_face_from_buffer): Deallocate stream when + its content cannot be parsed as supported font. This fixes + the second part of Savannah bug #16590. + +2006-05-18 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Composite_Glyph) + [FT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again. + +2006-05-17 David Turner + + This is a major patch used to drastically improve the performance of + loading glyphs. This both speeds up loading the glyph vectors + themselves and the auto-fitter module. + + We now use inline assembler code with GCC to implement `FT_MulFix', + which is probably the most important function related to the + engine's performance. + + The resulting speed-up is about 25%. + + + * include/freetype/internal/tttypes.h (TT_LoaderRec): Add fields + `cursor' and `limit'. + + * src/autofit/afangles.c (af_corner_is_flat, af_corner_orientation): + New functions. + (AF_ATAN_BITS, af_arctan, af_angle_atan): Comment out. + [TEST]: Remove. + + * src/autofit/afcjk.c (AF_Script_UniRangeRec): Comment out test + code. + + * src/autofit/afhints.c (af_axis_hints_new_segment): Don't call + `FT_ZERO' + (af_direction_compute, af_glyph_hints_compute_inflections): Rewritten. + (af_glyph_hints_reload: Rewrite recognition of weak points. + + * src/autofit/aflatin.c (af_latin_hints_compute_segments): Move + constant values out of the loops. + + * src/autofit/aftypes.h: Updated. + + * src/base/ftcalc.c (FT_MulFix): Use inline assembler code. + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Use vector + product to get orientation. + + * src/gzip/ftgzip.c (ft_get_uncompressed_size): New function. + (FT_Stream_OpenGzip): Use it to handle small files directly in + memory. + + * src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_ConvEexecDecode): + Improve performance. + + * src/truetype/ttgload.c (TT_Access_Glyph_Frame): Set `cursor' and + `limit'. + + (TT_Load_Glyph_Header, TT_Load_Simple_Glyph, + TT_Load_Composite_Glyph): Updated. Add threshold to protect against + exceedingly large values of number of contours. Speed up by + reducing the number of loops. + + * src/type1/t1gload.c (T1_Load_Glyph): Don't apply unit matrix. + + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the threshold + used to detect rogue clients from 4 to 16. This is to prevent some + segmentation faults with fonts like `KozMinProVI-Regular.otf' which + comes from the Japanese Adobe Reader Asian Font pack. + +2007-05-17 Werner Lemberg + + * src/cff/cffload.c (cff_font_done): Deallocate subfont array. This + fixes the first part of Savannah bug #16590. + +2006-05-16 Werner Lemberg + + * docs/PROBLEMS: Updated icl issues. + +---------------------------------------------------------------------------- + +Copyright 2006, 2007, 2008, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/src/3rdparty/freetype/ChangeLog.20 b/src/3rdparty/freetype/ChangeLog.20 new file mode 100644 index 0000000000..8fcc5e70ab --- /dev/null +++ b/src/3rdparty/freetype/ChangeLog.20 @@ -0,0 +1,2613 @@ +2002-02-09 Werner Lemberg + + * README: Fix typo. + * docs/CHANGES: Minor fixes. + + + * Version 2.0.8 released. + ========================= + + +2002-02-08 David Turner + + * docs/CHANGES: Updating for 2.0.8. + + * include/freetype/freetype.h: Setting `PATCH_LEVEL' to 8 and + removing `FT_Get_Next_Char' from the API (temporarily). + + * include/freetype/freetype.h: Adding comments to FT_Get_Next_Char; + note that this function might temporarily be removed for the 2.0.8 + release. + +2002-02-07 David Turner + + * src/pcf/pcfread.c (pcf_load_font): Removed immature support of + the AVERAGE_WIDTH property. + +2002-02-06 David Turner + + * src/sfnt/sfobjs.c (SFNT_Load_Face): Since many fonts embedded in + PDF documents do not include 'cmap', 'post' and 'name' tables, the + SFNT face loader has been changed to not immediately report an + error if these are not present. + + Note that the specification _requires_ these tables, but Adobe + seems to ignore it completely. + + * src/sfnt/ttcmap.c: Removing compiler warnings. + + * src/pcf/pcfread.c (pcf_read_TOC): Use FT_UInt. + (pcf_parse_metric, pcf_parse_compressed_metric): Removed. Code + is now in ... + (pcf_get_metric): Here. + (pcfSeekToType): Renamed to ... + (pcf_seek_to_table_type): This. + Use FT_Int. + (pcfHasType): Renamed to ... + (pcf_has_table_type): This. + Use FT_Int. + (find_property): Renamed to ... + (pcf_find_property): This. + Use FT_Int. + (pcf_get_bitmaps, pcf_get_encodings): Handle invalid PCF fonts + better (delaying format checks out of FT_Access_Frame .. + FT_Forget_Frame blocks to avoid leaving the stream in an incorrect + state when encountering an invalid PCF font). + + * src/pcf/pcfdriver.c (PCF_Done_Face): Renamed to ... + (PCF_Face_Done): This. + (PCF_Init_Face): Renamed to ... + (PCF_Face_Init): This. + (PCF_Get_Char_Index): Renamed to ... + (PCF_Char_Get_Index): This. + (PCF_Get_Next_Char): Renamed to ... + (PCF_Char_Get_Next): This. + (pcf_driver_class): Updated. + + * src/pcf/pcf.h (PCF_Done_Face): Removed. + +2002-02-06 Detlef Würkner + + * src/pcf/pcfdriver.c (FT_Done_Face): Fixed small memory leak. + + * src/pcf/pcfread.c (pcf_load_font): Now handles the `AVERAGE_WIDTH' + property to return correct character pixel (width/height) pairs for + embedded bitmaps. + +2002-02-04 Keith Packard + + Adding the function `FT_Get_Next_Char', doing the obvious thing + w.r.t. the selected charmap. + + * include/freetype/freetype.h: Add prototype. + * include/freetype/internal/ftdriver.h: Add `FTDriver_getNextChar' + typedef. + (FT_Driver_Class): Use it. + * include/freetype/internal/psnames.h: Add `PS_Next_Unicode_Func' + typedef. + (PSNames_Interface): Use it. + * include/freetype/internal/tttypes.h: Add `TT_CharNext_Func' + typedef. + (TT_CMapTable): Use it. + + * src/base/ftobjs.c (FT_Get_Next_Char): New function, implementing + high-level API. + * src/cff/cffdrivr.c (cff_get_next_char): New function. + (cff_driver_class): Add it. + * src/cid/cidriver.c (Cid_Get_Next_Char): New function. + (t1cid_driver_class): Add it. + * src/pcf/pcfdriver.c (PCF_Get_Next_Char): New function. + (pcf_driver_class): Add it. + * src/psnames/psmodule.c (PS_Next_Unicode): New function. + (psnames_interface): Add it. + * src/sfnt/ttcmap.c (code_to_next0, code_to_next2, code_to_next4, + code_to_next6, code_to_next_8_12, code_to_next_10): New auxiliary + functions. + (TT_CharMap_Load): Use them. + * src/truetype/ttdriver.c (Get_Next_Char): New function. + (tt_driver_class): Add it. + * src/type1/t1driver.c (Get_Next_Char): New function. + (t1_driver_class): Add it. + * src/winfonts/winfnt.c (FNT_Get_Next_Char): New function. + (winfnt_driver_class): Add it. + + * src/pcf/pcfread.c (pcf_load_font): For now, report Unicode for + Unicode and Latin 1 encodings. + +2002-02-02 Keith Packard + + * builds/unix/freetype-config.in: Add missing `fi'. + + + * Version 2.0.7 released. + ========================= + + +2002-02-01 David Turner + + * include/freetype/freetype.h: Increasing FREETYPE_PATCH to 7 + for the new release. + +2002-01-31 David Turner + + * README, README.UNX, docs/CHANGES: Updating documentation for the + 2.0.7 release. + +2002-01-30 David Turner + + * INSTALL: Moved to ... + * docs/INSTALL: Here to avoid conflicts with the `install' script on + Windows, where the filesystem doesn't preserve case. + +2002-01-29 David Turner + + * configure: Fixed the script. It previously didn't accept more + than one argument correctly. For example, when typing: + + ./configure --disable-shared --disable-nls + + the `--disable-nls' was incorrectly sent to the `make' program. + +2002-01-29 Werner Lemberg + + * README.UNX: Fix typo. + * builds/unix/install.mk (uninstall): Fix library name for libtool. + +2002-01-28 Francesco Zappa Nardelli + + * src/pcf/pcfdriver.c (PCF_Done_Face): Fix incorrect destruction of + the face object (face->toc.tables, face->root.family_name, + face->root.available_size, face->charset_encoding, + face->charset_registry are now freed). Thanks to Niels Moseley. + +2002-01-28 Roberto Alameda + + * src/type1/t1load.c (parse_encoding): Set `loader->num_chars'. + +2002-01-28 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Use copy + of `base' string for decrypting to not modify the original data. + Based on a patch by Jakub Bogusz . + +2002-01-27 Giuliano Pochini + + * src/smooth/ftgrays.c (gray_render_scanline): Fix bug which caused + bad rendering of thin lines (less than one pixel thick). + +2002-01-25 Werner Lemberg + + * src/cff/cffdrivr.c (cff_get_name_index): Make last patch work + actually. + +2002-01-25 Martin Zinser + + * src/cache/ftccache.c (ftc_node_done, ftc_node_destroy): Fix + compilation warnings. + * src/base/descrip.mms (OBJS): Add `ftmm.obj'. + * src/cache/descrip.mms (ftcache.obj): Dependencies added. + +2002-01-25 WANG Yi + + * src/cff/cffdrivr.c (cff_get_name_index): Fix deallocation bug. + +2002-01-21 Antoine Leca + + * docs/PATENTS: Typo fixed (thanks to Detlef `Hawkeye' Würkner) in + the URL for the online resource. + +2002-01-18 Ian Brown + + * builds/win32/ftdebug.c: New file. + * builds/win32/visualc/freetype.dsp: Updated. + +2002-01-18 Detlef Würkner + + * builds/amiga/src/base/ftsystem.c: Updated for AmigaOS 3.9. + * builds/amiga/README: Updated. + +2002-01-18 Ian Brown + + * builds/win32/visualc/freetype.dsp: Updated. + +2002-01-13 Werner Lemberg + + * builds/unix/freetype2.a4: The script was still buggy. + * builds/unix/freetype-config.in: Make it really work for any install + prefix. + +2002-01-10 Werner Lemberg + + * builds/unix/freetype2.a4: Fix some serious bugs. + +2002-01-09 David Turner + + * builds/unix/configure.ac: Build top-level Jamfile. + +2002-01-09 Maxim Shemanarev + + * src/smooth/ftgrays.c (gray_render_line): Small optimization to + the smooth anti-aliased renderer that deals with vertical segments. + This results in a 5-7% speedup in rendering speed. + +2002-01-08 David Turner + + Added some wrapper scripts to make the installation more + Unix-friendly. + + * configure, install: New files. + + * INSTALL, README.UNX: Updated installation documentation to use the + new 'configure' and 'install' scripts. + +2002-01-07 David Turner + + + * Version 2.0.6 released. + ========================= + + + * docs/BUGS, docs/CHANGES: Updating documentation for 2.0.6 release. + + * src/tools/docmaker.py: Fixed HTML quoting in sources. + (html_format): Replaced with ... + (html_quote): New function. + (html_quote0): New function. + (DocCode::dump_html): Small improvement. + (DocParagraph::dump, DocBlock::html): Use html_quote0 and html_quote. + + * include/freetype/config/ftoption.h: Setting default options for + a release build (debugging off, bytecode interpreter off). + + * src/base/ftobjs.c, src/base/ftoutln.c, src/cache/ftccmap.c, + src/cff/cffload.c, src/cff/cffobjs.c, src/pshinter/pshalgo2.c, + src/sfnt/ttload.c, src/sfnt/ttsbit.c: Removing small compiler + warnings (in pedantic compilation modes). + +2002-01-05 David Turner + + * src/autohint/ahhint.c (ah_align_linked_edge): Modified computation + of auto-hinted stem widths; this avoids color fringes in + `ClearType-like' rendering. + + * src/truetype/ttgload.c (TT_Load_Glyph_Header, + TT_Load_Simple_Glyph, TT_Load_Composite_Glyph, load_truetype_glyph): + Modified the TrueType loader to make it more paranoid; this avoids + nasty buffer overflows in the case of invalid glyph data (as + encountered in the output of some buggy font converters). + +2002-01-04 David Turner + + * README.UNX: Added special README file for Unix users. + + * builds/unix/ftsystem.c (FT_New_Stream): Fixed typo. + + * src/base/ftobjs.c: Added #include FT_OUTLINE_H to get rid + of compiler warnings. + + * src/base/ftoutln.c (FT_Outline_Check): Remove compiler warning. + +2002-01-03 Werner Lemberg + + * src/type1/t1objs.c (T1_Face_Init): Add cast to avoid compiler + warning. + +2002-01-03 Keith Packard + + * builds/unix/ftsystem.c (FT_New_Stream): Added a fix to ensure that + all FreeType input streams are closed in child processes of a `fork' + on Unix systems. This is important to avoid (potential) access + control issues. + +2002-01-03 David Turner + + * src/type1/t1objs.c (T1_Face_Init): Fixed a bug that crashed the + library when dealing with certain weird fonts like `Stalingrad', in + `sadn.pfb' (this font has no full font name entry). + + * src/base/ftoutln.c, include/freetype/ftoutln.h (FT_Outline_Check): + New function to check the consistency of outline data. + + * src/base/ftobjs.c (FT_Load_Glyph): Use `FT_Outline_Check' to + ensure that loaded glyphs are valid. This allows certain fonts like + `tt1095m_.ttf' to be loaded even though it appears they contain + really funky glyphs. + + There still is a bug there, though. + + * src/truetype/ttgload.c (load_truetype_glyph): Fix error condition. + +2001-12-30 David Turner + + * src/autohint/ahhint.c (ah_hinter_load): Fix advance width + computation of auto-hinted glyphs. This noticeably improves the + spacing of letters in KDE and Gnome. + +2001-12-25 Antoine Leca + + * builds/dos/detect.mk: Correcting the order for Borland compilers: + 16-bit bcc was never selected, always overridden by 32-bit bcc32. + +2001-12-22 Francesco Zappa Nardelli + + * src/pfc/pcfread.c (pcf_load_font): Handle property `POINT_SIZE' + and fix incorrect computation of `available_sizes'. + +2001-12-22 David Turner + + * src/autohint/ahhint.c (ah_hinter_load): Auto-hinted glyphs had an + incorrect glyph advance in the case of mono-width fonts (like + Courier, Andale Mono, and others). + +2001-12-22 Detlef Würkner + + * builds/amiga/*: Adaptations to latest changes. + Support added for MorphOS. + +2001-12-22 Werner Lemberg + + * src/pshinter/pshrec.c (FT_COMPONENT): Redefine to `trace_pshrec'. + (ps_mask_table_merge, ps_hints_open, ps_hints_stem, + ps_hints_t1stem3, ps_hints_t2mask, ps_hints_t2counter): Fix + FT_ERROR messages. + * src/pshinter/pshalgo1.c (FT_COMPONENT): Define as + `trace_pshalgo1'. + * src/pshinter/pshalgo2.c (FT_COMPONENT): Define as + `trace_pshalgo2'. + * include/freetype/internal/ftdebug.h (FT_Trace): Updated. + + * docs/modules.txt: New file. + +2001-12-21 David Turner + + * src/pshinter/pshrec.c (ps_hints_t2mask, ps_hints_t2counter): + Ignore invalid `hintmask' and `cntrmask' operators (instead of + returning an error). Glyph 2028 of the CFF font `MSung-Light-Acro' + couldn't be rendered otherwise (it seems its charstring is buggy, + though this requires more analysis). + (FT_COMPONENT): Define. + + * src/cff/cffgload.c (CFF_Parse_CharStrings), src/psaux/t1decode.c + (T1_Decoder_Parse_Charstrings), src/pshinter/pshalgo2.c (*), Fixed a + bug where the X and Y axis where inverted in the postscript hinter. + This caused problem when displaying on non-square surfaces. + + * src/pshinter/pshalgo2.c: s/vertical/dimension/. + + * src/pshinter/pshglob.c (psh_globals_new): Replaced a floating + point constant with a fixed-float equivalent. For some reasons not + all compilers are capable of directly computing a floating pointer + constant casted to FT_Fixed, and will link a math library instead. + +2001-12-20 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_destroy, ftc_cache_lookup): Fix + tracing strings. + * src/cache/ftccmap.c (ftc_cmap_family_init): Ditto. + * src/cache/ftcmanag.c (ftc_family_table_alloc, + ftc_family_table_free, FTC_Manager_Check): Ditto. + * src/cache/ftcsbits.c (ftc_sbit_node_load): Ditto. + + * src/base/ftobjs.c (FT_Done_Library): Remove compiler warning. + +2001-12-20 David Turner + + Added PostScript hinter support to the CFF and CID drivers. + + * include/freetype/internal/cfftypes.h (CFF_Font): New member + `pshinter'. + * src/cff/cffload.c (CFF_Get_Standard_Encoding): New function. + * src/cff/cffload.h: Updated. + * src/cff/cffgload.c (CFF_Init_Builder): Renamed to ... + (CFF_Builder_Init): This. + Added new argument `hinting'. + (CFF_Done_Builder): Renamed to ... + (CFF_Builder_Done): This. + (CFF_Init_Decoder): Added new argument `hinting'. + (CFF_Parse_CharStrings): Implement vstem support. + (CFF_Load_Glyph): Updated. + Add hinting support. + (cff_lookup_glyph_by_stdcharcode): Use CFF_Get_Standard_Encoding(). + (cff_argument_counts): Updated. + * src/cff/cffgload.h: Updated. + * src/cff/cffobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + (CFF_Size_Get_Globals_Funcs, CFF_Size_Done, CFF_Size_Init, + CFF_Size_Reset, CFF_GlyphSlot_Done, CFF_GLyphSlot_Init): New + functions. + (CFF_Init_Face): Renamed to ... + (CFF_Face_Init): This. + Add hinter support. + (CFF_Done_Face): Renamed to ... + (CFF_Face_Done): This. + (CFF_Init_Driver): Renamed to ... + (CFF_Driver_Init): This. + (CFF_Done_Driver): Renamed to ... + (CFF_Driver_Done): This. + * src/cff/cffobjs.h: Updated. + * src/cff/cffdrivr.c (cff_driver_class): Updated. + + * include/freetype/internal/t1types.h (CID_FaceRec): New member + `pshinter'. + * src/cid/cidgload.c (CID_Load_Glyph): Add hinter support. + * src/cid/cidobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + (CID_GlyphSlot_Done, CID_GlyphSlot_Init, CID_Size_Get_Globals_Funcs, + CID_Size_Done, CID_Size_Init, CID_Size_Reset): New functions. + (CID_Done_Face): Renamed to ... + (CID_Face_Done): This. + (CID_Init_Face): Renamed to ... + (CID_Face_Init): This. + Add hinting support. + (CID_Init_Driver): Renamed to ... + (CID_Driver_Init): This. + (CID_Done_Driver): Renamed to ... + (CID_Driver_Done): This. + * src/cid/cidobjs.h: Updated. + * src/cidriver.c: Updated. + + * src/pshinter/pshrec.c (t2_hint_stems): Fixed. + + * src/base/ftobjs.c (FT_Done_Library): Fixed a stupid bug that + crashed the library on exit. + + * src/type1/t1gload.c (T1_Load_Glyph): Enable font matrix + transformation of hinted glyphs. + + * src/cid/cidload.c (cid_read_subrs): Fix error condition. + + * src/cid/cidobjs.c (CID_Face_Done): Fixed a memory leak; the subrs + routines were never released when CID faces were destroyed. + + * src/cff/cffload.h, src/cff/cffload.c, src/cff/cffgload.c: Updated + to move the definition of encoding tables back within `cffload.c' + instead of making them part of a shared header (causing problems in + `multi' builds). This reverts change 2001-08-08. + + * docs/CHANGES: Updated for 2.0.6 release. + * docs/TODO: Added `stem3 and counter hints support' to the TODO + list for the Postscript hinter. + * docs/BUGS: Closed the AUTOHINT-NO-SBITS bug. + +2001-12-19 David Turner + + * include/freetype/cache/ftcache.h: Added comments to indicate that + some of the exported functions should only be used by applications + that need to implement custom cache types. + + * src/truetype/ttgload.c (cur_to_org, org_to_cur): Fixed a nasty bug + that prevented composites from loading correctly, due to missing + parentheses around macro parameters. + + * src/sfnt/sfobjs.c (SFNT_Load_Face): Make the `post' and `name' + tables optional to load PCL fonts properly. + + * src/truetype/ttgload.c (TT_Load_Glyph), src/base/ftobjs.c + (FT_Load_Glyph), include/freetype/freetype.h (FT_LOAD_SBITS_ONLY): + `Fixed' the bug that prevented embedded bitmaps to be loaded when + the auto-hinter is used. This actually is a hack but will be enough + until the internal re-design scheduled for FreeType 2.1. + + * src/raster/ftrend1.c (ft_raster1_render): Fixed a nasty outline + shifting bug in the monochrome renderer. + + * README: Updated version numbers to 2.0.6. + +2001-12-17 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix test for invalid + glyph header. + +2001-12-15 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove compiler warning. + * include/freetype/ftcache.h (FTC_Node_Unref): Removed. It is + already in ftcmanag.h. + * src/cache/ftcsbits.c (ftc_sbit_node_load): Remove unused variable + `gfam'. + * src/cache/ftcmanag.c (ftc_family_table_alloc, + * ftc_family_table_free): Use FT_EXPORT_DEF. + * include/freetype/cache/ftcmanag.h: Updated. + * src/cache/ftccache.c (ftc_node_destroy): Use FT_EXPORT_DEF. + * src/cache/ftccmap.c (ftc_cmap_node_init): Remove unused variable + `cfam'. + Remove compiler warning. + (FTC_CMapCache_Lookup): Remove compiler warnings. + (ftc_cmap_family_init): Ditto. + (FTC_CMapCache_Lookup): Ditto. + + * builds/unix/configure.ac: Increase `version_info' to 8:0:2. + * builds/unix/configure: Regenerated. + +2001-12-14 Werner Lemberg + + * builds/mac/README: Updated. + +2001-12-14 Scott Long + + * src/truetype/ttgload.c (load_truetype_glyph): Fixing crash when + dealing with invalid fonts (i.e. glyph size < 10 bytes). + +2001-12-14 Sam Latinga + + * builds/mac/freetype.make: A new Makefile to build with MPW on + MacOS classic. + +2001-12-14 David Turner + + * src/truetype/ttgload.c (TT_Load_Glyph), src/type1/t1gload.c + (T1_Load_Glyph), src/cid/cidgload.c (CID_Load_Glyph), + src/cff/cffgload.c (CFF_Load_Glyph): Fixed a serious bug common to + all font drivers (the advance width was never hinted when it + should). + + * include/freetype/freetype.h (FREETYPE_PATCH): New macro. + * src/base/ftdbgmem.c (debug_mem_dummy) [!FT_DEBUG_MEMORY]: Don't + use `extern' keyword. + +2001-12-12 David Turner + + * src/pshinter/pshglob.c (psh_blues_scale_zones, psh_blues_snap_stem + psh_globals_new): Adding correct BlueScale/BlueShift support, plus + family blues processing. + * src/pshinter/pshglob.h (PSH_BluesRec): Updated. + + Started adding support for the Postscript hinter in the CFF module. + + * src/cff/cffgload.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + (CFF_Parse_CharStrings): Implement it. + * src/cff/cffgload.h: Updated. + +2001-12-12 Werner Lemberg + + * builds/unix/freetype2.m4: Some portability fixes. + +2001-12-11 Jouk Jansen + + * src/base/descrip.mms (OBJS): Add ftdebug.obj. + +2001-12-11 Werner Lemberg + + * src/sfnt/ttload.c (TT_Load_Generic_Header): Typos. + +2001-12-11 David Turner + + * builds/unix/freetype-config.in: Modified the script to prevent + passing `-L/usr/lib' to gcc. + + * docs/FTL.TXT: Simple fix (change `LICENSE.TXT' to `FTL.TXT'). + + * builds/unix/freetype2.m4: New file for checking configure paths. + We need to install it in $(prefix)/share/aclocal/freetype2.m4 but I + didn't modify builds/unix/install.mk yet. + + * INSTALL: Updated the instructions to build shared libraries with + Jam. They were simply wrong. + + * src/base/fttrigon.c (FT_Cos): Fixed a small bug that caused + slightly improper results for `FT_Cos' and `FT_Sin' (example: + FT_Sin(0) == -1!). + +2001-12-11 Detlef Würkner + + * include/freetype/internal/ftstream.h (GET_LongLE, GET_ULongLE): + Fixed incorrect argument types. + +2001-12-10 Francesco Zappa Nardelli + + * src/pcf/pcfdriver.c (PCF_Init_Face): Allow Xft to use PCF fonts + by setting the `face->metrics.max_advance' correctly. + +2001-12-07 David Turner + + * include/freetype/cache/ftccmap.h, src/cache/ftccmap.c: Added new + charmap cache. + * src/cache/ftcache.c: Updated. + + * src/autohint/ahhint.c (ah_hinter_hint_edges): s/UNUSED/FT_UNUSED/. + +2001-12-06 Leonard Rosenthol + + Added support for reading .dfont files on Mac OS X. Also added a + new routine which looks up a given font by name in the Mac OS and + returns the disk file where it resides. + + * src/base/ftmac.c: Include and . + (is_dfont): New auxiliary function. + (FT_New_Face_From_dfont): New function. + (FT_GetFile_From_Mac_Name): New exported function. + (FT_New_Face): Updated. + * include/freetype/ftmac.h: Updated. + +2001-12-06 David Turner + + * src/cache/Jamfile, src/cache/rules.mk: Updated. + +2001-12-06 Werner Lemberg + + * INSTALL: Small update. + +2001-12-05 David Turner + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Re-ordered code for + debugging purposes. + Comment out use of `origin'. + + * src/smooth/ftsmooth.c (ft_smooth_render): Fixed a nasty hidden bug + where outline shifting wasn't correctly undone after bitmap + rasterization. This created problems with certain glyphs (like '"' + of certain fonts) and the cache system. + + * src/pshinter/pshalgo1.c (psh1_hint_table_init): Fix typo. + * src/pshinter/pshalgo2.c (psh2_hint_table_init): Fix typo. + (ps2_hints_apply): Small fix. + +2001-12-05 David Turner + + * src/pshinter/pshalgo2.c (psh2_hint_table_init), + src/pshinter/pshalgo1.c (psh1_hint_table_init): Removed compiler + warnings. + + * include/freetype/ftcache.h, include/freetype/cache/*, src/cache/*: + Yet another massive rewrite of the caching sub-system in order to + both increase performance and allow simpler cache sub-classing. As + an example, the code for the image and sbit caches is now much + simpler. + + I still need to update the documentation in + www/freetype2/docs/cache.html to reflect the new design though. + + * include/freetype/config/ftheader.h (FT_CACHE_CHARMAP_H): New + macro. + (FT_CACHE_INTERNAL_CACHE_H): Updated. + +2001-12-05 David Krause + + * docs/license.txt: s/X Windows/X Window System/. + +2001-12-04 Werner Lemberg + + * src/raster/ftraster.c: Fix definition condition of MEM_Set(). + * src/smooth/ftgrays.c (M_Y): Change value to 192. + * src/base/ftdbgmem.c (ft_mem_table_destroy): Fix printf() parameter. + Remove unused variable. + * src/cache/ftcimage.c (ftc_image_node_init, + ftc_image_node_compare): Remove unused variables. + * src/cache/ftcsbits.c (ftc_sbit_node_weight): Remove unused + variable. + * src/raster/ftraster.c (MEM_Set): Move definition down to avoid + compiler warning. + * src/autohint/ahhint.c (ah_hinter_hint_edges): Use UNUSED() to + avoid compiler warnings. + * src/pcf/pcfread.c (tableNames): Use `const'. + (pcf_read_TOC): Change counter name to avoid compiler warning. + Use `const'. + * src/pshinter/pshrec.c (ps_hints_close): Remove redundant + declaration. + * src/pshinter/pshalgo1.c (psh1_hint_table_init): Rename variables + to avoid shadowing. + * src/pshinter/pshalgo2.c (psh2_hint_table_activate_mask): Ditto. + * src/type1/t1objs.h: Remove double declarations of `T1_Size_Init()' + and `T1_Size_Done()'. + +2001-11-20 Antoine Leca + + * include/freetype/ttnameid.h: Added some new Microsoft language + codes and LCIDs as found in MSDN (Passport SDK). Also added + comments about the meaning of bit 57 of the `OS/2' table + (TT_UCR_SURROGATES) which (with OpenType v.1.3) now means `there is + a character beyond 0xFFFF in this font'. Thanks to Detlef Würkner + for noticing this. + +2001-11-20 David Turner + + * src/pshinter/{pshalgo2.c, pshalgo1.c}: Fixed stupid bug in sorting + routine that created nasty alignment artefacts. + + * src/pshinter/pshrec.c, tests/gview.c: Debugging updates. + + * src/smooth/ftgrays.c: De-activated experimental gamma support. + Apparently, `optimal' gamma tables depend on the monitor type, + resolution and general karma, so it's better to compute them outside + of the rasterizer itself. + (gray_convert_glyph): Use `volatile' keyword. + +2001-10-29 David Turner + + Adding experimental `gamma' support. This produces smoother glyphs + at small sizes for very little cost. + + * src/smooth/ftgrays.c (grays_init_gamma): New function. + (gray_raster_new): Use it. + + Various fixes to the auto-hinter. They merely improve the output of + sans-serif fonts. Note that there are still problems with serifed + fonts and composites (accented characters). + + * src/autohint/ahglyph.c (ah_outline_load, + ah_outline_link_segments): Implement it. + Fix typos. + (ah_outline_save, ah_outline_compute_segments): Fix typos. + * src/autohint/ahhint.c (ah_align_serif_edge): New argument + `vertical'. Implement improvement. + (ah_hint_edges_3, ah_hinter_hint_edges): Implement it. + Fix typos. + (ah_hinter_align_strong_points, ah_hinter_align_weak_points): Fix + typos. + (ah_hinter_load): Set `ah_debug_hinter' if DEBUG_HINTER is defined. + * src/autohint/ahmodule.c: Implement support for DEBUG_HINTER macro. + * src/autohint/ahtypes.h: Ditto. + (AH_Hinter): Remove `disable_horz_edges' and `disable_vert_edges' + (making them global as `ah_debug_disable_horz' and + `ah_debug_disable_vert'). + Fix typos. + + * tests/gview.c: Updated the debugging glyph viewer to show the + hints generated by the `autohint' module. + +2001-10-27 David Turner + + * src/cache/ftcchunk.c (ftc_chunk_cache_lookup): Fixed a bug that + considerably lowered the performance of the abstract chunk cache. + +2001-10-26 David Turner + + * include/freetype/ftcache.h, include/freetype/cache/*.h, + src/cache/*.c: Major re-design of the cache sub-system to provide + better performance as well as an `Acquire'/`Release' API. Seems to + work well here, but probably needs a bit more testing. + +2001-10-26 Leonard Rosenthol + + * builds/mac/README: Updated to reflect my taking over the project + and that is now being actively maintained. + + * src/base/ftmac.c (parse_fond): Applied patches from Paul Miller + to support loading a face other than the + first from a FOND resource. + (FT_New_Face_From_FOND): Updated. + +2001-10-25 Leonard Rosenthol + + * builds/mac/ftlib.prj: Update of CodeWarrior project file for Mac + OS for latest version (7) of CWPro and for recent changes to the FT + source tree. + +2001-10-25 David Turner + + * include/freetype/config/ftoption.h: Updated comments to explain + precisely how to use project-specific macro definitions without + modifying this file manually. + + (FT_CONFIG_FORCE_INT64): Define. + + (FT_DEBUG_MEMORY): New macro. + +2001-10-24 Tom Kacvinsky + + * builds/unix/ftsystem.c (FT_New_Memory): Added a missing `{'. + +2001-10-23 David Turner + + * include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c: + Improvements to the memory debugger to report more information in + case of errors. Also, some allocations that occurred through REALLOC + couldn't be previously caught correctly. + + * src/autohint/ahglyph.c (ah_outline_compute_segments, + ah_outline_compute_edges), src/raster/ftraster.c (ft_black_new), + src/smooth/ftgrays.c (gray_render_span, gray_raster_new): Replaced + liberal uses of memset() by the MEM_Set() macro. + +2001-10-23 David Turner + + * src/raster/ftraster.c (Update): Removed to be inlined in ... + (Sort): Updated. + +2001-10-22 David Turner + + * builds/unix/ftsystem.c (FT_New_Memory, FT_Done_Memory), + builds/vms/ftsystem.c (FT_New_Memory, FT_Done_Memory), + builds/amiga/ftsystem.c (FT_New_Memory, FT_Done_Memory), + src/base/ftdbgmem.c: Updated the memory debugger and + platform-specific implementations of `ftsystem' in order to be able + to debug memory allocations on Unix, VMS and Amiga too! + + * src/pshinter/pshalgo2.c (psh2_hint_table_record_mask): Removed + some bogus warnings. + + * include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c: + Modified the debugging memory manager to report the location (source + file name + line number) where leaked memory blocks are allocated in + the source file. + + * src/base/ftdbgmem.c: New debugging memory manager. You must + define the FT_DEBUG_MEMORY macro in `ftoption.h' to enable it. It + will record every memory block allocated and report simple errors + like memory leaks and double deletes. + + * src/base/Jamfile: Include ftdbgmem. + * src/base/rules.mk: Ditto. + * src/base/ftbase.c: Include ftdbgmem.c. + + * include/freetype/config/ftoption.h: Added the FT_DEBUG_MEMORY + macro definition. + + * src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory): Modified the + base component to use the debugging memory manager when the macro + FT_DEBUG_MEMORY is defined. + +2001-10-21 Tom Kacvinsky + + * src/cff/cffload.c (CFF_Done_Font): Free subfonts array only if + we are working with a CID keyed CFF font. Otherwise, a variable + that was never allocated memory might freed. This is a correction + to the previous patch for freeing subfonts. + +2001-10-21 Tom Kacvinsky + + * src/cff/cffload.c (CFF_Done_Font): Free the subfonts array to + avoid a memory leak. + +2001-10-21 David Turner + + * src/pshinter/pshalgo2.c, src/pshinter/pshalgo1.c, + src/pshinter/pshglob.c: Removing compiler warnings in pedantic modes + (in multi-object compilation mode, mainly). + +2001-10-20 Tom Kacvinsky + + * src/type1/t1load.c (parse_encoding): Add a test to make sure + that custom encodings (i.e., neither StandardEncoding nor + ExpertEncoding) are not loaded twice when the Type 1 font is + synthetic. + + * src/type1/t1load.c (parse_font_name, parse_subrs): Added a test + for when loading synthetic fonts to make sure that the font name + and subroutines are not loaded twice. This is to remove a memory + leak that occurred because the original memory blocks for these + objects were not deallocated when the objects were parsed the + second time. + +2001-10-19 David Turner + + * src/smooth/ftgrays.c, src/pshinter/pshglob.h, + src/pshinter/pshrec.c, src/pshinter/pshalgo2.c: Getting rid of + compiler warnings. + + * src/pshinter/module.mk, src/pshinter/rules.mk: Adding control + files to build the PostScript hinter with the `old' build system. + +2001-10-19 Jacob Jansen + + * descrip.mms, src/pshinter/descrip.mms: Updates to the VMS build + files. + +2001-10-18 David Turner + + * src/psnames/pstables.h, src/tools/glnames.py: Rewrote the + `glnames.py' script used to generate the `pstables.h' header file. + The old one contained a serious bug that made FreeType return + incorrect glyph names for certain glyphs. + + * src/truetype/ttdriver.c (Set_Char_Sizes): Changing computation of + pixel size from character size to use rounding. This is an + experiment to see whether this gives values similar to Windows for + scaled ascent/descent/etc. + + * src/base/ftcalc.c (FT_Div64by32): Changed the implementation + slightly since the original code was mis-compiled on Mac machines + using the MPW C compiler. + + * src/base/ftobjs.c (FT_Realloc): When a memory block was grown + through FT_Realloc(), the new bytes were not set to 0, which created + some strange bugs in the PostScript hinter. + (destroy_face): Don't deallocate unconditionally. + + * src/cid/cidgload.c (CID_Compute_Max_Advance, CID_Load_Glyph): + Adding support to new PostScript hinter. + + * include/freetype/internal/psglobal.h, + include/freetype/internal/pshints.h, + include/freetype/config/ftmodule.h, src/pshinter/Jamfile, + src/pshinter/pshalgo.h, src/pshinter/pshalgo1.h, + src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.h, + src/pshinter/pshalgo2.c, src/pshinter/pshglob.h, + src/pshinter/pshglob.c, src/pshinter/pshinter.c, + src/pshinter/pshmod.c, src/pshinter/pshmod.h, src/pshinter/pshrec.c, + src/pshinter/pshrec.h: Adding new PostScript hinter module. + + * include/freetype/internal/ftobjs.h, + include/freetype/internal/internal.h, + include/freetype/internal/psaux.h, + include/freetype/internal/t1types.h, src/psaux/psobjs.c, + src/psaux/psobjs.h, src/psaux/t1decode.h, src/psaux/t1decode.c, + src/type1/t1driver.c, src/type1/t1gload.c, src/type1/t1objs.c, + src/type1/t1objs.h: Updates to use the new PostScript hinter. + + * tests/Jamfile, tests/gview.c: Adding a new glyph hinting + viewer/debugger to the source tree. Note that you will _not_ be + able to compile it since it depends on an unavailable graphics + library named `Nirvana' to render vector images. + +2001-10-17 David Turner + + + * Version 2.0.5 released. + ========================= + + + * include/freetype/freetype.h, include/internal/ftobjs.h, + src/base/ftobjs.c, src/type1/t1driver.c: Adding a new function named + 'FT_Get_Postscript_Name' to retrieve the PostScript name of a given + font. Should work with all formats except pure CFF/CEF fonts (this + will be added soon). + + * src/cid/cidriver (cid_get_postscript_name): New function. + (CID_Get_Interface): Handle `postscript_name' interface. + + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): New function. + (SFNT_Get_Interface): Handle `postscript_name' interface. + + * src/type1/t1driver.c (t1_get_ps_name): New function. + (Get_Interface): Handle `postscript_name' interface. + + * README, docs/CHANGES: Updated for 2.0.5 release. + +2001-10-08 David Turner + + Fixed a bug in `glnames.py' that prevented it from generating + correct glyph names tables. This resulted in the unavailability of + certain glyphs like `Cacute', `cacute' and `lslash' in Unicode + charmaps, even if these were present in the font (causing problems + for Polish users). + + * src/tools/glnames.py (mac_standard_names): Fixed. + (t1_standard_strings): Some fixes and renamed to ... + (sid_standard_names): This. + (t1_expert_encoding): Fixed. + (the_adobe_glyph_list): Renamed to ... + (adobe_glyph_names): This. + (the_adobe_glyphs): Renamed to ... + (adobe_glyph_values): This. + (dump_mac_indices, dump_glyph_list, dump_unicode_values, main): + Updated. + * src/psnames/pstables.h: Regenerated. + * src/psnames/psmodule.c (PS_Unicode_Value): Fix offset. + Fix return value. + Use `sid_standard_table' and `ps_names_to_unicode' instead of + `t1_standard_glyphs' and `names_to_unicode'. + (PS_Macintosh_Name): Use `ps_glyph_names' instead of + `standard_glyph_names'. + (PS_Standard_Strings): Use `sid_standard_names' instead of + `t1_standard_glyphs'. + + * doc/BUGS, doc/TODO: New documents. + +2001-10-07 Richard Barber + + * src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented + correct LRU behaviour. + +2001-10-07 David Turner + + setjmp() and longjmp() are now used for rollback (i.e. when memory + pool overflow occurs). + + Function names are now all uniformly prefixed with `gray_'. + + * src/smooth/ftgrays.c: Include . + (ErrRaster_MemoryOverflow): New macro. + (TArea): New type to store area values in each cell (using `int' was + too small on 16-bit systems). is included to properly + get the needed data type. + (TCell, TRaster): Use it. + (TRaster): New element `jump_buffer'. + (gray_compute_cbox): Use `RAS_ARG' as the only parameter and get + `outline' from it. + (gray_record_cell): Use longjmp(). + (gray_set_cell): Use gray_record_cell() for error handling. + (gray_render_line, gray_render_conic, gray_render_cubic): Simplify. + (gray_convert_glyph_inner): New function, using setjmp(). + (gray_convert_glyph): Use it. + +2001-10-07 David Turner + + Provide a public API to manage multiple size objects for a given + FT_Face in the new header file `ftsizes.h'. + + * include/freetype/ftsizes.h: New header file, + * include/freetype/internal/ftobjs.h: Use it. + Remove declarations of FT_New_Size and FT_Done_Size (moved to + ftsizes.h). + * include/freetype/config/ftheader.h (FT_SIZES_H): New macro. + * src/base/ftobjs.c (FT_Activate_Size): New function. + * src/cache/ftcmanag.c: Include ftsizes.h. + (ftc_manager_init_size, ftc_manager_flush_size): Use + FT_Activate_Size. + +2001-09-20 Detlef Würkner + + * builds/amiga/*: Added port to Amiga with the SAS/C compiler. + +2001-09-15 Detlef Würkner + + * src/type1/t1afm.c (T1_Done_AFM): Free `afm'. + +2001-09-10 Yao Zhang + + * src/sfnt/ttcmap.c (code_to_index2): Handle code values with + hi-byte == 0 correctly. + +2001-09-10 Werner Lemberg + + * builds/link-std.mk ($(PROJECT_LIBRARY)): Fix typo. + +2001-08-30 Martin Muskens + + * src/type1/t1load.c (parse_font_matrix): A new way to compute the + units per EM with greater accuracy (important for embedded T1 fonts + in PDF documents that were automatically generated from TrueType + ones). + + * src/type1/t1load.c (is_alpha): Now supports `+' in font names; + this is used in embedded fonts. + + * src/psaux/psobjs.c (PS_Table_Add): Fixed a reallocation bug that + generated a dangling pointer reference. + +2001-08-30 Anthony Feik + + * src/type1/t1afm.c (T1_Read_Afm): Now correctly sets the flag + FT_FACE_FLAG_KERNING when appropriate for Type1 + AFM files. + +2001-08-25 Werner Lemberg + + * src/sfnt/ttload.c (TT_Load_CMap): Fix frame length of + `cmap_rec_fields'. + + * include/freetype/fterrors.h [!FT_CONFIG_OPTION_USE_MODULE_ERRORS]: + Undefine FT_ERR_BASE before defining again. + +2001-08-22 Werner Lemberg + + * src/truetype/ttinterp.h: Fix prototype of TT_Move_Func. + +2001-08-21 Werner Lemberg + + * builds/dos/dos-def.mk (NO_OUTPUT): Don't use `&>' but `>'. + +2001-08-21 David Turner + + * include/freetype/config/ftoption.h: Changed the default setting + for FT_CONFIG_OPTION_USE_MODULE_ERRORS to undefined, since it breaks + source compatibility in a few cases. Updated the comment to explain + that too. + +2001-08-17 Martin Muskens + + * src/base/ftcalc.c (FT_MulDiv): Fixed serious typo. + +2001-08-12 Werner Lemberg + + Updating to OpenType 1.3. + + * include/freetype/internal/tttypes.h (TT_CMap0, TT_CMap2, TT_CMap4, + TT_CMap6): Adding field `language'. + (TT_CMapTable): Removing field `language'. + Type of `length' field changed to FT_ULong. + Adding fields for cmaps format 8, 10, and 12. + (TT_CMapGroup): New auxiliary structure. + (TT_CMap8_12, TT_CMap10): New structures. + * include/freetype/tttables.h (TT_HoriHeader, TT_VertHeader): + Removed last element of `Reserved' array. + * include/freetype/ttnameid.h (TT_PLATFORM_CUSTOM, TT_MS_ID_UCS_4, + TT_NAME_ID_CID_FINDFONT_NAME): New macros. + + * src/sfnt/ttcmap.c (TT_CharMap_Load): Updated loading of `language' + field to the new structures. + Fixed freeing of arrays in case of unsuccessful loads. + Added support for loading format 8, 10, and 12 cmaps. + (TT_CharMap_Free): Added support for freeing format 8, 10, and 12 + cmaps. + (code_to_index4): Small improvement. + (code_to_index6): Ditto. + (code_to_index8_12, code_to_index10): New functions. + * src/sfnt/ttload.c (TT_Load_Metrics_Header): Updated to new + structure. + (TT_Load_CMap): Ditto. + + * src/sfnt/sfobjs.c (tt_encodings): Add MS UCS4 table (before MS + Unicode). + +2001-08-11 Werner Lemberg + + * src/type1/t1driver.c (t1_get_name_index): Fix compiler warning. + +2001-08-09 Tom Kacvinsky + + * src/cff/cffdrivr.c (get_cff_glyph_name): Renamed to + cff_get_glyph_name for consistency. + + (cff_get_glyph_index): Minor documentation change. + + * src/type1/t1driver.c (t1_get_name_index): New function used in + Get_Interface as the function returned when the `name_index' + function is requested. + + (get_t1_glyph_name): Renamed to t1_get_glyph_name for consistency. + +2001-08-08 Tom Kacvinsky + + * src/cff/cffload.c: Removed definitions of cff_isoadobe_charset, + cff_expert_charset, cff_expertsubset_charset, cff_standard_encoding, + and cff_expert_encoding arrays to cffload.h. + + * src/cff/cffload.h: Added definitions of cff_isoadobe_charset, + cff_expert_charset, cff_expertsubset_charset, cff_standard_encoding, + and cff_expert_encoding arrays. + + * src/cff/cffdrivr.c (cff_get_name_index): New function, returned + when `cff_get_interface' is called with a request for the + `name_index' function. + + (cff_get_interface): Modified so that it returns the function + `cff_get_name_index' when the `name_index' function is requested. + + * src/base/ftobjs.c (FT_Get_Name_Index): New function, used to + return a glyph index for a given glyph name only if the driver + supports glyph names. + + * include/freetype/internal/ftobjs.h (FT_Name_Index_Requester): + New function pointer type definition used in the function + FT_Get_Name_Index. + + * include/freetype/freetype.h (FT_Get_Name_Index): Added + documentation and prototype. + +2001-07-26 Werner Lemberg + + * builds/cygwin/*: Removed. Use the unix stuff instead. + +2001-07-26 Jouk Jansen + + * builds/vms/ftconfig.h (FT_CALLBACK_DEF): Updated to change dated + 2001-06-27. + +2001-07-17 Werner Lemberg + + * include/freetype/internal/psaux.h (PS_Table): Use FT_Offset for + `cursor' and `capacity'. + * src/psaux/psobjc.c (reallocate_t1_table): Use FT_Long for second + parameter. + (PS_Table_Add): Use FT_Offset for `new_size'. + + Add support for version 0.5 maxp tables. + + * src/sfnt/ttload.c (TT_Load_MaxProfile): Implement it. + (TT_Load_OS2): Initialize some values. + +2001-07-13 Werner Lemberg + + * src/base/ftsynth.c: Include ftcalc.h unconditionally. + +2001-07-07 David Turner + + * src/truetype/ttgload.c, src/truetype/ttinterp.c, src/pcf/pcfread: + Removed pedantic compiler warnings when the bytecode interpreter is + compiled in. + +2001-07-03 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_align_weak_points): Remove + unused variable `edges'. + (ah_hinter_load): Remove unused variables `old_width' and + `new_width'. + * src/cid/cidload.c (cid_decrypt): Use `U' for constant (again). + * src/psaux/psobjs.c (T1_Decrypt): Ditto. + * src/type1/t1parse.c (T1_Get_Private_Dict): Ditto. + +2001-06-28 David Turner + + * include/internal/ftstream.h: Modified the definitions + of the FT_GET_XXXX and NEXT_XXXX macros for 16-bit correctness. + +2001-06-26 Werner Lemberg + + * src/cid/cidload.c, src/cid/cidload.h (cid_decrypt): Use FT_Offset + instead of FT_Int as type for `length' parameter. + * include/freetype/internal/psaux.h (PSAux_Interface): Updated. + +2001-06-27 Wolfgang Domröse + + * src/psaux/psobjs.c, src/psaux/psobjs.h (T1_Decrypt): Use FT_Offset + instead of FT_Int as type for `length' parameter. + + + * Version 2.0.4 released. + ========================= + + +2001-06-27 David Turner + + * builds/unix/ftconfig.in: Changed the definition of the + FT_CALLBACK_DEF macro. + + * include/freetype/ftconfig.h, src/*/*.c: Changed the definition and + use of the FT_CALLBACK_DEF macro in order to support 16-bit + compilers. + + * builds/unix/ftconfig.in: Changed the definition of the + FT_CALLBACK_DEF macro. + + * src/sfnt/ttload.c (TT_Load_Kern): The kern table loader now ensures + that the kerning table is correctly sorted (some problem fonts don't + have a correct kern table). + +2001-06-26 Wolfgang Domröse + + * include/freetype/internal/ftstream.h (FT_GET_OFF3_LE): Fix typo. + +2001-06-24 David Turner + + * src/base/ftcalc.c (ft_div64by32): Fixed the source to work + correctly on 16-bit systems. + +2001-06-23 Anthony Fok + + * debian/*: Added Debian package build directory for 2.0.4. + +2001-06-22 David Turner + + * docs/PATENTS: Added patents disclaimer. This one was missing! + + * docs/CHANGES, docs/todo: Updated for the upcoming 2.0.4 release. + +2001-06-20 Werner Lemberg + + * include/freetype/config/ftconfig.h: Add two more `L's to + constants. + Add missing semicolons. + + * builds/toplevel.mk: Do similar change as for + builds/unix/detect.mk. + + * include/freetype/freetype.h (FT_ENC_TAG): New version to make it + easier to redefine. + * include/freetype/ftimage.h (FT_IMAGE_TAG): Ditto. + + * src/pcf/pcfread.c (pcf_get_encodings): Add cast. + +2001-06-19 David Turner + + * builds/win32/visualc/freetype.dsp, builds/win32/visualc/index.html: + Updated the Visual C++ project (for the 2.0.4 release). + + * builds/unix/detect.mk: Added rule for AIX detection (which uses + /usr/sbin/init instead of /sbin/init). + + * include/freetype/fterrors.h, src/*/*err*.h: Updated some of the + error macros to simplify handling of new error scheme. + +2001-06-19 Werner Lemberg + + * include/freetype/fttypes.h (FT_ERROR_MODULE): New macro. + +2001-06-19 David Turner + + Removing _lots_ of compiler warnings when the most pedantic warning + levels of Visual C++ and Borland C++ are used. Too many files to be + listed here, but FT2 now compiles without warnings with VC++ and the + `/W4' warning level (lint-style). + + * include/freetype/freetype.h (FT_New_Memory_Face): Updated + documentation. + * include/freetype/fttypes.h (FT_BOOL): New macro. + * include/freetype/internal/ftdebug.h: Add #pragma for Visual C++ + to suppress warning. + * include/freetype/internal/ftstream.h (FT_GET_SHORT_{BE,LE}, + FT_GET_OFF3_{BE,LE}, FT_GET_LONG_{BE,LE}): New macros. + (NEXT_*): Use them. + * src/autohint/ahglobal.c: Include FT_INTERNAL_DEBUG_H. + (FT_New_Memory_Face): Add `const' to function declaration. + +2001-06-18 Werner Lemberg + + Minor cleanups to remove compiler warnings. + + * include/freetype/cache/ftcmanag.h (FTC_MAX_BYTES_DEFAULT): Use + `L' for constant. + * include/freetype/config/ftoption.h (FT_RENDER_POOL_SIZE): Ditto. + * src/base/ftcalc.c (FT_MulDiv): Use `L' for constant. + * src/base/ftglyph.c (FT_Glyph_Get_CBox): Remove `error' variable. + * src/base/fttrigon.c (ft_trig_arctan_table): Use `L' for constants. + * src/base/ftobjs.c (FT_Done_Size): Fix return value. + (FT_Set_Char_Size, FT_Set_Pixel_Sizes, FT_Get_Kerning): Remove + unused `memory' variable. + * src/autohint/ahglyph.c (ah_get_orientation): Use `L' for constant. + * src/autohint/ahhint.c (ah_hint_edges_3, + ah_hinter_align_edge_points): Remove unused `before' and `after' + variables. + (ah_hinter_align_weak_points): Remove unused `edge_limit' variable. + (ah_hinter_load): Remove unused `new_advance', `start_contour', + and `metrics' variables. + * src/cff/cffload.c (CFF_Load_Encoding): Remove dead code to avoid + compiler warning. + * src/cff/cffobjs.c (CFF_Init_Face): Remove unused `base_offset' + variable. + * src/cff/cffgload.c (CFF_Parse_CharStrings): Remove unused + `outline' variable. + (cff_compute_bias): Use `U' for constant. + * src/cid/cidload.c (cid_decrypt): Ditto. + * src/psaux/psobjs.c (T1_Decrypt): Ditto. + * src/psaux/t1decode.c (T1_Decoder_Parse_CharStrings): Ditto. + * src/sfnt/ttload.c (TT_Load_Kern): Remove unused `version' + variable. + * src/sfnt/ttsbit.c (TT_Load_SBit_Image): Remove unused `top' + variable. + * src/truetype/ttgload.c (load_truetype_glyph): Remove unused + `num_contours' and `ins_offset' variables. + (compute_glyph_metrics): Remove unused `Top' and `x_scale' + variables. + (TT_Load_Glyph): Remove unused `memory' variable. + * src/smooth/ftgrays.c (grays_raster_render): Use `L' for constants. + +2001-06-18 Werner Lemberg + + Make the new error scheme source compatible with older FT versions + by introducing another layer. + + * include/freetype/fterrors.h (FT_ERRORDEF_, FT_NOERRORDEF_): New + macros. + (FT_NOERRORDEF): Removed. + * include/*/*err*.h: Use FT_ERRORDEF_ and FT_NOERRORDEF_. + +2001-06-16 Werner Lemberg + + * include/freetype/freetype.h (FT_ENC_TAG): New macro. + (FT_Encoding_): Use it. + * include/freetype/ftimage.h (FT_IMAGE_TAG): Define it + conditionally. + +2001-06-14 David Turner + + Modified the TrueType interpreter to let it use the new + trigonometric functions provided in `fttrigon.h'. This gets rid of + some old 64-bit computation routines, as well as many warnings when + compiling the library with the `long long' 64-bit integer type. + + * include/freetype/config/ftoption.h: Undefine + FT_CONFIG_OPTION_OLD_CALCS. + * include/freetype/internal/ftcalc.h: Rearrange use of + FT_CONFIG_OPTION_OLD_CALCS. + * src/base/ftcalc.c: Add declaration of FT_Int64 if + FT_CONFIG_OPTION_OLD_CALCS isn't defined. + * src/truetype/ttinterp.c: Use FT_TRIGONOMETRY_H. + (Norm): Add a special version if FT_CONFIG_OPTION_OLD_CALCS isn't + defined. + (Current_Ratio, Normalize): Simplify code. + +2001-06-11 Mike Owens + + * src/base/ftcalc.c (FT_MulDiv, FT_DivFix, FT_Sqrt64): Remove + compiler warnings. + +2001-06-08 Werner Lemberg + + * builds/unix/configure.in: Renamed to ... + * builds/unix/configure.ac: This to make sure that autoconf 2.50 is + needed. + Run `autoupdate' on it. + Increase `version_info' to 7:0:1. + * builds/unix/configure: Regenerated. + +2001-06-08 David Turner + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Fixed a bug that + corrupted transformed glyphs that were auto-hinted (the transform + was applied twice). + + Fixed a bug that returned an invalid linear width for composite + TrueType glyphs. + + * include/internal/tttypes.h (TT_Loader_): Two new elements `linear' + and `linear_def'. + * src/truetype/ttgload.c (load_truetype_glyph, + compute_glyph_metrics): Use it. + + * include/fttypes.h (FT_ERROR_BASE): New macro. + * src/base/ftobjs.c (FT_Open_Face, FT_Render_Glyph_Internal): Use it + to make source code work with the new error scheme implemented by + Werner. + * src/base/ftoutln.c (FT_Outline_Render): Ditto. + +2001-06-07 Werner Lemberg + + Updating to libtool 1.4.0 and autoconf 2.50. + + * builds/unix/ltconfig: Removed. + * builds/unix/ltmain.sh, builds/unix/configure.in, + builds/unix/aclocal.m4: Updated. + * builds/unix/configure: Regenerated. + +2001-06-06 Werner Lemberg + + Complete redesign of error codes. Please check ftmoderr.h for more + details. + + * include/freetype/internal/cfferrs.h, + include/freetype/internal/tterrors.h, + include/freetype/internal/t1errors.h: Removed. Replaced with files + local to the module. All extra error codes have been moved to + `fterrors.h'. + + * src/sfnt/ttpost.h: Move error codes to `fterrors.h'. + + * src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h, + src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h, + src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h, + src/smooth/ftsmerrs.h, src/truetype/tterrors.h, + src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the + error names for the module it belongs to. + + * include/freetype/ftmoderr.h: New file, defining the module error + offsets. Its structure is similar to `fterrors.h'. + + * include/freetype/fterrors.h (FT_NOERRORDEF): New macro. + (FT_ERRORDEF): Redefined to use module error offsets. + All internal error codes are now public; unused error codes have + been removed, some are new. + + * include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New + macro. + * include/freetype/config/ftoption.h + (FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro. + + All other source files have been updated to use the new error codes; + some already existing (internal) error codes local to a module have + been renamed to give them the same name as in the base module. + + All make files have been updated to include the local error files. + +2001-06-06 Werner Lemberg + + * src/cid/cidtokens.h: Replaced with... + * src/cid/cidtoken.h: This file for 8+3 consistency. + + * src/raster/ftraster.c: Use macros for header file names. + + * src/include/freetype/tttables.h (TT_HoriHeader_, TT_VertHeader_): + Fix length of `Reserved' array. Note that this isn't the real fix + since recent OpenType specs have introduced a `CaretOffset' field + instead of the first reserved byte. + +2001-05-29 Werner Lemberg + + * INSTALL: Minor fixes. + + + * Version 2.0.3 released. + ========================= + + +2001-05-29 David Turner + + * INSTALL, docs/CHANGES: Updated. + +2001-05-25 David Turner + + Moved several documents from the top-level to the `docs' directory. + + * src/base/ftcalc.c (FT_DivFix): Small fix to return value. + +2001-05-16 David Turner + + * src/truetype/ttgload.c (load_truetype_glyph): Fixed a bug in the + composite loader. Spotted by Keith Packard. + * src/base/ftobjs.c (FT_GlyphLoader_Check_Points, + FT_GlyphLoader_Check_Subglyphs): Ditto. + +2001-05-14 David Turner + + Fixed the incorrect blue zone computations, and improved the + composite support. Note that these changes result in improved + rendering, while sometimes introducing their own artefacts. This is + probably the last big change to the autohinter before the + introduction of a complete replacement. + + * src/autohint/ahglobal.c (sort_values): Fix loop. + * src/autohint/ahglyph.c: Removed some obsolete code. + (ah_outline_compute_edges): Modify code to set the ah_edge_round + flag. + (ah_outline_compute_blue_edges): Add code to compute active blue + zones. + * src/autohint/ahhint.c (ah_hinter_glyph_load): Change load_flags + value. + + * src/base/ftcalc.c (FT_DivFix): Fixed a bug in the 64-bit code that + created incorrect scale factors! + (FT_Round_Fix, FT_CeilFix, FT_FloorFix): Minor improvements. + +2001-05-12 Werner Lemberg + + * include/freetype/ftbbox.h: FTBBOX_H -> __FTBBOX_H__. + * include/freetype/fttrigon.h: __FT_TRIGONOMETRY_H__ -> + __FTTRIGON_H__. + Include FT_FREETYPE_H. + Beautified; added copyright. + * src/base/fttrigon.c: Beautified; added copyright. + +2001-05-11 David Turner + + * src/cff/cffparse.c (cff_parse_font_matrix), src/cid/cidload.c + (parse_font_matrix), src/type1/t1load.c (parse_font_matrix): Fixed + the incorrect EM size computation. + + * include/freetype/fttrigon.h, src/base/fttrigon.c: New files, + adding trigonometric functions to the core API (using Cordic + algorithms). + * src/base/ftbase.c, src/base/Jamfile, src/base/rules.mk: Use them. + + * builds/newline: New file. + * builds/top_level.mk, builds/detect.mk: Use it. This fixes + problems with Make on Windows 2000, as well as problems when `make + distclean' is invoked on a non-Unix platform when there is no + `config.mk' in the current directory. + + * builds/freetype.mk: Fixed a problem with object deletions under + Dos/Windows/OS/2 systems. + + Added new directory to hold tools and test programs. + + * docs/docmaker.py, docs/glnames.py: Moved to... + * src/tools/docmaker.py, src/tools/glnames.py: This place. + * src/tools/cordic.py: New file used to compute arctangent table + needed by fttrigon.c. + * src/tools/test_bbox.c, src/tools/test_trig.c: New test files. + + * src/tools/docmaker.py: Improved the script to add the current date + at the footer of each web page (useful to distinguish between + versions). + + * Jamfile: Fixed incorrect HDRMACRO argument. + + * TODO: Removed the cubic arc bbox computation note, since it has been + fixed recently. + * src/base/ftbbox.c (test_cubic_zero): Renamed to... + (test_cubic_extrema): This function. Use `UL' for unsigned long + constants. + + * include/freetype/t1tables.h, include/freetype/config/ftoption.h: + Formatting. + +2001-05-10 David Turner + + * src/base/ftobjs.c (FT_Open_Face): Fixed a small memory leak + which happened when trying to open 0-size font files! + +2001-05-09 Werner Lemberg + + * include/freetype/internal/ftcalc.h: Move declaration of + FT_SqrtFixed() out of `#ifdef FT_LONG64'. + +2001-05-08 Francesco Zappa Nardelli + + * src/pcfdriver.c (PCF_Load_Glyph): Fixed incorrect bitmap width + computation. + +2001-05-08 David Turner + + * docs/docmaker.py: Updated the DocMaker script in order to add + command line options (--output,--prefix,--title), fix the erroneous + line numbers reported during errors and warnings, and other + formatting issues. + + * src/base/ftcalc.c (FT_MulDiv, FT_MulFix, FT_DivFix): Various tiny + fixes related to rounding in 64-bits routines and + pseudo-`optimizations'. + +2001-04-27 David Turner + + * src/base/ftbbox.c (BBox_Cubic_Check): Fixed the coefficient + normalization algorithm (invalid final bit position, and invalid + shift computation). + +2001-04-26 Werner Lemberg + + * builds/unix/config.guess, builds/unix/config.sub: Updated to + latest versions from gnu.org. + + * builds/compiler/gcc-dev.mk: Add `-Wno-long-long' flag. + + * include/freetype/internal/ftcalc.h: Define FT_SqrtFixed() + unconditionally. + * src/base/ftbbox.c: Include FT_INTERNAL_CALC_H. + Fix compiler warnings. + * src/base/ftcalc.c: Fix (potential) compiler warnings. + +2001-04-26 David Turner + + * src/base/ftcalc.c (FT_SqrtFixed): Corrected/optimized the 32-bit + fixed-point square root computation. It is now used even with + 64-bits integers, as it is _much_ faster than calling FT_Sqrt64 :-) + + * src/base/ftbbox.c: Removed invalid `#include FT_BEZIER_H' line. + +2001-04-25 David Turner + + * src/base/ftbbox.c (BBox_Cubic_Check): Rewrote function to use + direct computations with 16.16 values instead of sub-divisions. It + is now slower, but proves a point :-) + + * src/raster/ftraster.c, src/smooth/ftgrays.c, src/base/ftbbox.c: + Fixed the Bézier stack depths. + + * src/base/ftcalc.c (FT_MulFix): Minor rounding fix. + + * builds/beos: Added BeOS-specific files to the old build system + (no changes were necessary to support BeOS in the Jamfile though). + +2001-04-20 David Turner + + * ftconfig.h, ftoption.h: Updated `ftconfig.h' to detect 64-bit int + types on platforms where Autoconf is not available). Also removed + FTCALC_USE_LONG_LONG and replaced it with + FT_CONFIG_OPTION_FORCE_INT64. + + * builds/win32/freetype.dsp: Updated the Visual C++ project file. + Doesn't create a DLL yet. + + * cffgload.c: Removed a compilation warning. + +2001-04-10 Tom Kacvinsky + + * t1load.c (parse_charstrings): Changed code for placing .notdef + glyph into slot 0 so that we no longer have a memory access + violation. + + * t1load.h: In structure T1_Loader, added swap_table (of type + PS_Table) to facilitate placing the .notdef glyph into slot 0. + +2001-04-10 Francesco Zappa Nardelli + + * src/pcf/pcfdriver.c (PCF_Get_Char_Index): Fix return value. + +2001-04-09 Laurence Withers + + * builds/dos/detect.mk: Add support for bash. + +2001-04-05 Werner Lemberg + + * builds/os2/*.mk: These files have been forgotten to update to + the structure of similar makefiles. + * builds/dos/*.mk: Ditto. + * builds/ansi/*.mk: Ditto. + + * builds/win32/win32-def.mk (BUILD): Fix typo. + + * builds/compiler/*.mk (CLEAN_LIBRARY): Don't use NO_OUTPUT. + This is already used in the link_*.mk files. + +2001-04-03 Werner Lemberg + + * src/*/Jamfile: Slight changes to make files more cryptic. + +2001-04-03 Werner Lemberg + + * Jamfile, src/Jamfile, src/*/Jamfile: Formatted. Slight changes + to give files identical structure. + +2001-04-02 Werner Lemberg + + * CHANGES: Reformatted, minor fixes. + * TODO: Updated. + * README: Formatting. + * include/freetype/freetype.h: Formatting. + + * Jamfile: Fix typo. + + * src/cff/cffparse.c: Move error code #defines to... + * include/freetype/internal/cfferrs.h: This file. + * src/cff/cffdrivr.c, src/cff/cffobjs.c, src/cff/cffload.c: Replaced + `FT_Err_*' with `CFF_Err_*'. + * src/cid/cidparse.c: Replaced `FT_Err_*' with `T1_Err_*'. + * src/psaux/psobjs.c, src/psaux/t1decode.c: Ditto. + * src/sfnt/sfobcs.c, src/sfnt/ttload.c: Replaced `FT_Err_*' with + `TT_Err_*'. + * src/truetype/ttgload.c, src/truetype/ttobjs.c: Ditto. + * src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1objs.c, + src/type1/t1parse.c: Replaced `FT_Err_*' with `T1_Err_*'. + + * include/freetype/internal/cfferrs.h: Add + `CFF_Err_Unknown_File_Format'. + * include/freetype/internal/t1errors.h: Add + `T1_Err_Unknown_File_Format'. + * include/freetype/internal/tterrors.h: Add + `TT_Err_Unknown_File_Format'. + + * src/cff/cffload.h: Add `cff_*_encoding' and `cff_*_charset' + references. + * src/psaux/psobjs.c: Include `FT_INTERNAL_TYPE1_ERRORS_H'. + + * src/cff/cffobjs.c (CFF_Init_Face, CFF_Done_Face): Use + FT_LOCAL_DEF. + * src/cid/cidobjs.c (CID_Done_Driver): Ditto. + * src/trutype/ttobjs.c (TT_Init_Face, TT_Done_Face, TT_Init_Size): + Ditto. + * src/type1/t1objs.c (T1_Done_Driver): Ditto. + * src/pcf/pcfdriver.c (PCF_Done_Face): Ditto. + * src/pcf/pcf.h: Use FT_LOCAL for `PCF_Done_Face'. + +2001-04-02 Tom Kacvinsky + + * src/sfnt/ttload.c (TT_Load_Metrics): Fix an improper pointer + dereference. Submitted by Herbert Duerr . + +2001-03-26 Tom Kacvinsky + + * include/freetype/config/ftconfig.h: Changed hexadecimal + constants to use suffix U to avoid problems with HP-UX's c89 + compiler. Submitted by G.W. Lucas . + +2001-03-24 David Turner + + * Jamrules, Jamfile, src/Jamfile, src/*/Jamfile: Adding jamfiles to + the source tree. See www.freetype.org/jam/index.html for details. + + + * Version 2.0.2 released. + ========================= + + +2001-03-20 Werner Lemberg + + * builds/win32/detekt.mk: Fix .PHONY target for Intel compiler. + +2001-03-20 David Turner + + * include/freetype/config/ftheader.h, include/freetype/ftsnames.h: + Renamed `ftnames.h' to `ftsnames.h', and FT_NAMES_H to + FT_SFNT_NAMES_H. + + * docs/docmaker.py: Added generation of INDEX link in table of + contents. + + * INSTALL, docs/BUILD: Updated documentation to indicate that the + compilation process has changed slightly (no more `src' required in + the include path). + + * builds/*/*-def.mk: Changed the objects directory from `obj' to + `objs'. + + * include/freetype/config/ftheader.h: Removed obsolete macros like + FT_SOURCE_FILE, etc. and added cache-specific macro definitions that + were previously defined in . Added comments to + be included in a new API Reference section. + + * src/*/*: Removed the use of FT_SOURCE_FILE, etc. Now, each + component needs to add its own directory to the include path at + compile time. Modified all `rules.mk' and `descrip.mms' + accordingly. + +2001-03-20 Werner Lemberg + + * builds/unix/configure.in: Add $ft_version. + * builds/unix/freetype-config.in: Use it. + * builds/unix/configure: Updated. + +2001-03-19 Tom Kacvinsky + + * src/type1/t1load.c (parse_font_matrix): Assign the units per em + value an unsigned short value, first by shifting right 16 bits, + then by casting the results to FT_UShort. + + * src/cff/cffparse.c (cff_parse_font_bbox): Assign the units per em + value an unsigned short value, first by shifting right 16 bits, + then by casting the results to FT_UShort. + +2001-03-17 David Turner + + * src/cid/cidobjs.c, src/cid/cidload.c, src/pcf/pcfread.c, + src/type1/t1load.c, src/type1/t1objs.c: Added a few casts to remove + compiler warnings in pedantic modes. + + * include/config/ft2build.h, include/config/ftheader.h: The file + `ft2build.h' was renamed to `ftheader.h' to avoid conflicts with the + top-level . + + * include/config/ftheader.h: Added new section describing the #include + macros. + +2001-03-17 Tom Kacvinsky + + * src/cff/cffparse.c (cff_parse_font_bbox): Obtain rounded FT_Fixed + values for the bounding box numbers. + + * src/cff/cffobjs.c (CFF_Init_Face): When processing a CFF/CEF font, + set `root->ascender' (`root->descender') to the integer part of + `root->bbox.yMax' (`root->bbox.yMin', respectively). + +2001-03-16 Tom Kacvinsky + + * src/cff/cffdrivr.c (get_cff_glyph_name): New function. Used in + cff_get_interface to facilitate getting a glyph name for glyph index + via FT_Get_Glyph_Name(). + + (cff_get_interface): Added support for getting a glyph name via the + `glyph_name' module interface. Uses the new function + get_cff_glyph_name(). + Submitted by Sander van der Wal . + + * src/cff/cffobjs.c (CFF_Init_Face): Logical or the face flags with + FT_FACE_FLAG_GLYPH_NAMES only if FT_CONFIG_OPTION_NO_GLYPH_NAMES is + not defined. This is to add support for getting a glyph name from a + glyph index via FT_Get_Glyph_Name(). + Submitted by Sander van der Wal . + + * src/cff/cffgload.c (CFF_Parse_CharStrings): Added support for + deprecated operator `dotsection'. + Submitted by Sander van der Wal . + +2001-03-12 Werner Lemberg + + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix error + messages. + + * INSTALL, docs/BUILD: We need GNU make 3.78.1 or newer. + +2001-03-12 Tom Kacvinsky + + * include/freetype/internal/psaux.h: Changed the lenIV member of + the T1_Decoder_ struct to be an FT_Int instead of an FT_UInt. + + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Adjust + for lenIV seed bytes at the start of a decrypted subroutine. + + * src/cid/cidload.c (cid_read_subrs): Decrypt subroutines only + if lenIV >= 0. + + * src/cid/cidgload.c (cid_load_glyph): Decrypt charstrings only + if lenIV >= 0. + +2001-03-11 Werner Lemberg + + * TODO: Updated. + + * src/pcf/pcfread.c: Put READ_Fields() always in a conditional to + avoid compiler warnings. + +2001-03-10 Tom Kacvinsky + + * TODO: New file. + + * include/freetype/freetype.h: Added prototypes and notes for + three new functions: FT_RoundFix, FT_CeilFix, and FT_FloorFix. + * src/base/ftcalc.c (FT_RoundFix, FT_CeilFix, FT_FloorFix): Added + implementation code. + + * src/cid/cidobjs.c (CID_Init_Face): Use calculated units_per_EM, + and if that is not available, default to 1000 units per EM. Changed + assignment code for ascender and descender values. + * src/cid/cidload.c (parse_font_matrix): Added units_per_EM + processing. + (parse_font_bbox): Changed to use FT_Fixed number handling. + + * src/type1/t1objs.c (T1_Init_Face): Changed the assignment code + for ascender, descender, and max_advance_width. + * src/type1/t1load.c (parse_font_bbox): Changed to use FT_Fixed + number handling. + +2001-03-10 Henrik Grubbström + + * src/*/*.c: Added many casts to make code more 64bit-safe. + +2001-03-07 Werner Lemberg + + * INSTALL, docs/BUILD: We need GNU make 3.78 or newer. + +2001-03-07 Tom Kacvinsky + + * src/type1/t1objs.c (T1_Init_Face): Minor correction: We must wait + until parse_font_bbox is changed before we use logical shift rights + in the assignments of `root->ascender', `root->descender', and + `root->max_advance_width'. + + (T1_Done_Face): Free `char_name' table to avoid a memory leak. + Submitted by Sander van der Wal . + +2001-03-05 Tom Kacvinsky + + * src/cff/cffgload.c (CFF_Load_Glyph): Set glyph control data to the + the Type 2 glyph charstring (used by conversion programs). + Submitted by Ha Shao . + +2001-03-04 Antoine Leca + + * include/freetype/ttnameid.h: Correct a stupid typo which prevented + correct compilation (TT_MS_LANGID_TIGRIGNA_ETHIOPIA appeared twice). + +2001-03-04 Werner Lemberg + + * src/autohint/ahtypes.h (AH_Hinter): Add elements + `disable_horz_edges', `disable_vert_edges'. + * src/autohint/ahhint.c (ah_hint_edges_3, ah_hinter_hint_edges): Use + them (and remove static variables with the same names). + * src/pcf/pcfutil.c (BitOrderInvert): Add `const'. + * docs/glnames.py: Updated to latest pstables.h changes. + + * builds/unix/detect.mk: Add test for Hurd. + * builds/hurd/detect.mk: Removed. + +2001-03-04 Sander van der Wal + + * src/psnames/pstables.h: Add more `const'. + * src/pcf/pcfutil.c: Ditto. + +2001-03-04 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Fixing typo + (FT_Glyph_Done -> FT_Done_Glyph). + +2001-03-01 Antoine Leca + + * include/freetype/ttnameid.h: Added some new Microsoft language + codes and LCIDs as found in Office Xp. + +2001-02-28 David Turner + + * builds/hurd/detect.mk: New file. Added support to detect the GNU + Hurd operating system as Unix-like. Fix submitted by Anthony Fok + . + + * src/type1/t1gload.c (T1_Load_Glyph): Set glyph control data to the + the Type 1 glyph charstring (used by conversion programs). + Submitted by Ha Shao . + +2001-02-22 David Turner + + * src/base/ftgrays.c (grays_sweep): The function didn't exit + immediately if `num_cells' was 0 as it should. Thanks to Boris for + finding this out. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Fixed memory leak when + bitmap rendering fails (thanks to Graham Asher). + +2001-02-13 Werner Lemberg + + * docs/docmaker.py (DocSection::add_element): Use + `self.print_error()'. + + * builds/unix/config.{guess,sub}: Updated (from ftp.gnu.org). + +2001-02-13 David Turner + + * docs/docmaker.py, include/freetype/*.h: Updated the DocMaker + script to support chapters and section block ordering. Updated the + public header files accordingly. + + * src/base/ftglyph.c (FT_Glyph_Copy): Advance width and glyph format + were not correctly copied. + +2001-02-08 Tom Kacvinsky + + * src/cff/cffparse.c (cff_parse_font_matrix): Removed an + unnecessary fprintf( stderr, ... ). + +2001-02-07 Tom Kacvinsky + + * src/type1/t1objs.c (T1_Init_Face): Added code to get the + units_per_EM from the value assigned in parse_font_matrix, if + available. Default to 1000 if not available. + + * src/cff/cffparse.c (cff_parse_font_matrix): Added logic to get + the units_per_EM from the FontMatrix. + + (cff_parse_fixed_thousand): New function. Gets a real number from + the CFF font, but multiplies by 1000 (this is to avoid rounding + errors when placing this real number into a 16.16 fixed number). + + (cff_parse_real): Added code so that the integer part is moved + into the high sixteen bits of the 16.16 fixed number. + + * src/cff/cffobjs.c (CFF_Init_Face): Added logic to get the units + per EM from the CFF dictionary, if available. + + * include/freetype/internal/cfftypes.h: In struct CFF_Font_Dict_, + added a units_per_em member to facilitate passing of units_per_em + from function cff_parse_font_matrix. + + * src/type1/t1load.c (is_alpha): Make `-' a legal alphanumeric + character. This is so that font names with `-' are fully parsed, + etc... + +2001-02-02 Werner Lemberg + + * src/psaux/psobjs.c (shift_elements): Remove if clause (which is + obsolete now). + + (reallocate_t1_table, PS_Table_Done): Replace REALLOC() with ALLOC() + + MEM_Copy() to avoid a memory bug. + +2001-02-01 David Turner + + * docs/docmaker.py: Improved the index sorting routine to place + capital letters before small ones. Added the `' marker to + section blocks in order to give the order of blocks. + +2001-01-30 Antoine Leca + + * include/freetype/ttnameid.h: Latest updates to Microsoft language + ID codes. + +2001-01-24 Tom Kacvinsky + + * src/cff/t1load.c (parse_font_matrix): Added heuristic to get + units_per_EM from the font matrix. + + (parse_dict): Deleted test to see whether the FontInfo keyword has + been seen. Deletion of this test allows fonts without FontInfo + dictionaries to be parsed by the Type 1 driver. + + (T1_Open_Face): Deleted empty subroutines array test to make sure + fonts with no subroutines still are parsed. + +2001-01-17 Francesco Zappa Nardelli + + * src/pcfread.c (pcf_get_properties, pcf_get_metrics, + pcf_get_bitmaps): Fix compiler errors. + +2001-01-11 David Turner + + * src/pcf/pcfread.c: Removed some compilation warnings related + to comparison of signed vs. unsigned integers. + + * include/freetype/internal/ftdebug.h: Changed the debug trace + constants from trace_t2xxxx to trace_cffxxxx to be able to compile + the CFF driver in debug mode. + +2001-01-11 Matthew Crosby + + * builds/unix/freetype-config.in: Fix problems with separate + --prefix and --exec-prefix. + +2001-01-11 David Turner + + * docs/docmaker.py: Added cross-references generation as well as + more robust handling of pathname wildcard matching. + +2001-01-10 Werner Lemberg + + * docs/docmaker.py: Minor improvements to reduce unwanted spaces + and empty lines in output. + +2001-01-09 David Turner + + * docs/docmaker.py: Improved script to generate table of contents + and index pages. It also supports wildcards on non Unix systems. + + * include/freetype/*.h, include/freetype/cache/*.h: Updated comments + to include section definitions/delimitations for the API Reference + generator. + + * include/freetype/freetype.h: Moved declaration of + `FT_Generic_Finalizer' and the `FT_Generic' structure to... + * include/freetype/fttypes.h: here. + +2001-01-04 Werner Lemberg + + * include/freetype/ttnameid.h: Updated Unicode code range comments. + +2001-01-03 Tom Kacvinsky + + * src/cff/rules.mk: Use cffgload.{c,h} instead of t2gload.{c,h}. + + * include/freetype/internal/internal.h: Changed to use cfftypes.h + (cfferrs.h) instead of t2types.h (t2errors.h, respectively). + + * include/freetype/internal/cfftypes.h: Merged in changes from + t2types.h and made this the canonical `types' header for the CFF + driver. + + * include/freetype/internal/t2types.h: This file was merged with + cfftypes.h and is no longer necessary. + + * include/freetype/internal/t2errors.h: Renamed to cfferrs.h. + + * src/cff/cffobjs.c, src/cff/cffobjs.h, src/cff/cffparse.c, + src/cff/cffdrivr.c, src/cff/cff.c, src/cff/cffload.c, + src/cff/cffgload.c, src/cff/cffgload.h: Changed to use + cffgload.{c,h} instead of t2gload.{c,h}. All occurrences of t2_ + (T2_) were replaced with cff_ (CFF_, respectively). + + * src/cff/t2gload.h: Renamed cffgload.h. + + * src/cff/t2gload.c: Renamed cffgload.c + +2000-01-02 Jouk Jansen + + * builds/vms: Support files for VMS architecture added. + * descrip.mms, src/*/descrip.mms: VMS makefiles added. + * README.VMS: New file. + +2000-01-01 Werner Lemberg + + * LICENSE.TXT: Added info about PCF driver license. + +2001-01-01 Francesco Zappa Nardelli + + * src/pcf/*: New driver module for PCF font format (used in + X Window System). + * include/freetype/internal/ftdebug.h (FT_Trace): Added values for + PCF driver. + * include/freetype/internal/pcftypes.h: New file. + * include/freetype/config/ftmodule.h: Added PCF driver module. + +2001-01-01 Werner Lemberg + + * src/winfonts/winfnt.c (FNT_Get_Char_Index): Fix parameter type. + +2000-12-31 Werner Lemberg + + * builds/modules.mk (clean_module_list): Fixed deletion of module + file in case `make make_module_list' is called before `make setup'. + +2000-12-30 Werner Lemberg + + * src/cff/cffload.c (CFF_Load_Charset): Improved error messages. + (CFF_Load_Charset, CFF_Load_Encoding): Remove unnecessary variable + definition. + +2000-12-30 Tom Kacvinsky + + * include/freetype/internal/t2types.h, + include/freetype/internal/cfftypes.h: Changed the structures for + CFF_Encoding and CFF_Encoding for the new implementations of the + charset and encoding parsers in the CFF driver. + + * src/cff/t2gload.c (t2_lookup_glyph_by_stdcharcode, + t2_operator_seac): Added these functions for use in implementing the + seac emulation provided by the Type 2 endchar operator. + (T2_Parse_CharStrings): Added seac emulation for the endchar + operator. + + * src/cff/cffload.c (CFF_Load_Encoding, CFF_Load_Charset, + CFF_Done_Encoding, CFF_Done_Charset): Extended to load and parse the + charset/encoding tables, and free the memory used by them when the + CFF driver is finished with them. Added tables + + cff_isoadobe_charset + cff_expert_charset + cff_expertsubset_charset + cff_standard_encoding + cff_expert_encoding + + so that the encoding/charset parser can handle predefined encodings and + charsets. + +2000-12-24 Tom Kacvinsky + + * src/cff/t2gload.c (T2_Load_Glyph): Added code so that the font + transform is applied. + + * src/cff/cffparse.c (cff_parse_font_matrix): Added code so that + the font matrix numbers are scaled by 1/(matrix->yy). Also, the + offset vector now contains integer values instead of 16.16 fixed + numbers. + +2000-12-22 Tom Kacvinsky + + * src/autohint/ahhint.c (ah_hinter_load_glyph): + Removed unnecessary comments and commented-out code. + +2000-12-21 David Turner + + * src/cid/cidafm.c, src/cid/cidafm.h: removed un-needed files, + we'll work on supporting CID AFM files later I guess :-) + +2000-12-21 Tom Kacvinsky + + * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph): + Changed so that fonts with a non-standard FontMatrix render + correctly. Previously, the first glyph rendered from such a + font did not have the transformation matrix applied. + +2000-12-17 Werner Lemberg + + * *.mk: Added lots of `.PHONY' targets. + +2000-12-17 Karsten Fleischer + + * *.mk: Implemented `platform' target to disable auto-detection. + +2000-12-14 Werner Lemberg + + * docs/design/modules.html: Removed. Covered by design-*.html. + + * INSTALL: Added info about makepp. + +2000-12-14 David Turner + + Added support for clipped direct rendering in the smooth renderer. + This should not break binary compatibility of existing applications. + + * include/freetype/fttypes.h, include/freetype/ftimage.h: Move + definition of the FT_BBox structure from the former to the latter. + * include/freetype/ftimage.h: Add `ft_raster_flag_clip' value to + FT_Raster_Flag enumeration. + Add `clip_box' element to FT_Raster_Params structure. + * src/smooth/ftgrays.c (grays_convert_glyph): Implement it. + + * INSTALL: Updated installation instructions on Win32, listing the + new `make setup list' target used to list supported + compilers/targets. + + * src/raster/ftraster.c (ft_black_render): Test for unsupported + direct rendering before testing arguments. + +2000-12-13 David Turner + + * include/freetype/config/ft2build.h, + include/freetype/internal/internal.h: Fixed header inclusion macros + to use direct definitions. This is the only way to do these things + in a portable way :-( The rest of the code should follow shortly + though everything compiles now. + + * builds/compiler/intelc.mk, builds/compiler/watcom.mk: New files. + + * builds/win32/detect.mk: Added support for the Intel C/C++ + compiler, as well as _preliminary_ (read: doesn't work!) support for + Watcom. Also added a new setup target. Type `make setup list' for + a list of supported command-line compilers on Win32. + + * src/base/ftdebug.c: Added dummy symbol to avoid empty file if + conditionals are off. + +2000-12-13 Werner Lemberg + + * builds/unix/ftsystem.c: Fixed typos. Fixed inclusion of wrong + ftconfig.h file. + +2000-12-12 Werner Lemberg + + * include/freetype/config/ft2build.h (FT2_ROOT, FT2_CONFIG_ROOT): + Removed. ANSI C doesn't (explicitly) allow macro expansion in + arguments using `##'. + (FT2_PUBLIC_FILE, FT2_CONFIG_FILE, FT2_INTERNAL_FILE): Use directory + names directly. Make them configurable. Use `##' to strip leading + and trailing spaces from arguments. + + * builds/unix/ft2unix.h: Adapted. + + * src/base/ftsystem.c (ft_alloc, ft_realloc, ft_free, ft_io_stream, + ft_close_stream): Use FT_CALLBACK_DEF. + + * builds/unix/ftsystem.c: Use new header scheme. + (FT_Done_Memory): Use free() from FT_Memory structure. + + * src/base/ftinit.c, src/base/ftmac.c: Header scheme fixes. + +2000-12-11 Werner Lemberg + + * include/freetype/config/ft2build.h (FT2_CONFIG_ROOT, + FT2_PUBLIC_FILE, FT2_CONFIG_FILE, FT2_INTERNAL_FILE, + FT_SOURCE_FILE): Use `##' operator to be really ANSI C compliant. + +2000-12-09 Werner Lemberg + + * builds/unix/detect.mk: Remove unused USE_CFLAGS variable. + +2000-12-08 Werner Lemberg + + * */*.h: Changed body inclusion macro names to start and end with + `__' (those which haven't converted yet). Fixed minor conversion + issues. + + * src/winfonts/winfnt.c: Updated to new header inclusion scheme. + + * src/truetype/ttinterp.c: Remove unused CALC_Length() macro. + +2000-12-07 David Turner + + * */*.[ch]: Changed source files to adhere to the new + header inclusion scheme. Not completely tested but works for now + here. + + * src/cff/t2driver.c: Renamed and updated to... + * src/cff/cffdrivr.c: New file. + * src/cff/t2driver.h: Renamed and updated to... + * src/cff/cffdrivr.h: New file. + * src/cff/t2load.c: Renamed and updated to... + * src/cff/cffload.c: New file. + * src/cff/t2load.h: Renamed and updated to... + * src/cff/cffload.h: New file. + * src/cff/t2objs.c: Renamed and updated to... + * src/cff/cffobjs.c: New file. + * src/cff/t2objs.h: Renamed and updated to... + * src/cff/cffobjs.h: New file. + * src/cff/t2parse.c: Renamed and updated to... + * src/cff/cffparse.c: New file. + * src/cff/t2parse.h: Renamed and updated to... + * src/cff/cffparse.h: New file. + * src/cff/t2tokens.h: Renamed and updated to... + * src/cff/cfftoken.h: New file. + + * src/cff/cff.c, src/cff/rules.mk: Updated. + +2000-12-06 David Turner + + * src/cache/ftlru.c (FT_Lru_Done): Fixed memory leak. + +2000-12-06 Werner Lemberg + + * builds/module.mk: Replaced `xxx #' with `xxx$(space). + * builds/os2/detekt.mk, builds/win32/detekt.mk: Moved comment to + avoid trailing spaces in variable. + * builds/freetype.mk: Use $(D) instead of $D to make statement more + readable. + + * docs/docmaker.py: Formatting. + +2000-12-05 David Turner + + * src/psaux/psauxmod.c: Fixed a broken inclusion of component + header files (an FT_FLAT_COMPILE test was missing). + + * src/cache/ftcmanag.c (FTC_Manager_Done): Fixed a bug that caused + an occasional crash when the function was called (due to a dangling + pointer). + + * src/base/ftsystem.c (FT_Done_Memory): Fixed an obvious bug: + The ANSI `free()' function was called instead of `memory->free()'. + + * docs/docmaker.py: Added section filtering, multi-page generation + (index page generation is still missing though). + +2000-12-04 David Turner + + * builds/unix/install.mk, builds/unix/ft2unix.h: The file `ft2unix.h' + is now installed as for Unix systems. Note that we + still use the `freetype2/freetype' installation path for now. + + * */*.[ch]: Now using as the default build and setup + configuration file in all public headers. Internal source files + still need some changes though. + + * builds/devel/ft2build.h, builds/devel/ftoption.h: Created a new + directory to hold all development options for both the Unix and + Win32 developer builds. + + * builds/win32/detect.mk, builds/win32/w32-bccd.mk, + builds/win32/w32-dev.mk: Changed the developer build targets to + `devel-gcc' and `devel-bcc' in order to be able to develop with the + Borland C++ compiler. + +2000-12-01 David Turner + + + * Version 2.0.1 released. + ========================= + + + * builds/unix/configure.in, builds/unix/configure, + builds/cygwin/configure.in, builds/cygwin/configure: Setting + `version_info' to 6:1:0 for the 2.0.1 release. + + * CHANGES: Added a summary of changes between 2.0.1 and 2.0. + + * builds/unix/ftconfig.in, builds/cygwin/ftconfig.in: Changes + to allow compilation under Unix with the Unix-specific config + files. + +2000-12-01 Werner Lemberg + + * INSTALL: Revised. + * builds/compiler/bcc-dev.mk, builds/compiler/visualage.mk, + builds/compiler/bcc.mk, builds/win32/w32-bcc.mk, + builds/win32/w32-bccd.mk: Revised. + * include/freetype/config/ftbuild.h, + include/freetype/internal/internal.h: Revised. + * include/freetype/ftimage.h: Updated to new header inclusion scheme. + +2000-11-30 Werner Lemberg + + * builds/toplevel.mk (.PHONY): Adding `distclean'. + * builds/unix/detect.mk (.PHONY): Adding `devel', `unix', `lcc', + `setup'. + +2000-11-30 David Turner + + * INSTALL: Slightly updated the quick starter documentation to + include IDE compilation, prevent against BSD Make, and specify `make + setup' instead of a single `make' for build configuration. + + * include/config/ftbuild.h, include/internal/internal.h: Added new + configuration files used to determine the location of all public, + configuration, and internal header files for FreeType 2. Modified + all headers under `include/freetype' to reflect this change. Note + that we still need to change the library source files themselves + though. + + * builds/compiler/bcc.mk, builds/compiler/bcc-dev.mk, + builds/win32/w32-bcc.mk, builds/win32/w32-bccd.mk, + builds/win32/detect.mk: Added new files to support compilation with + the free Borland C++ command-line compiler. Modified the detection + rules to recognize the new `bcc32' target in `make setup bcc32'. + + * src/sfnt/ttcmap.c, src/sfnt/ttpost.c, src/sfnt/ttsbit.c, + src/truetype/ttobjs.c, src/truetype/ttgload.c, + src/truetype/ttinterp.c: Fixed a few comparisons that Borland C++ + didn't really like. Basically, this compiler complains when FT_UInt + is compared to FT_UShort (apparently, it promotes `UShort' to `Int' + in these cases). + +2000-11-30 Tom Kacvinsky + + * t2objs.c (T2_Init_Face): Added calculation of `face->height' for + pure CFF fonts. + + * t1objs.c (T1_Init_Face): Fixed computation of `face->height'. + +2000-11-29 David Turner + + * src/base/ftbbox.c (BBox_Conic_Check): Fixed a really stupid + bug in the formula used to compute the conic Bézier extrema + of non-monotonous arcs. + +2000-11-29 Werner Lemberg + + * src/base/ftcalc.c (FT_SqrtFixed), src/base/ftobjs.c + (FT_Set_Renderer): Use FT_EXPORT_DEF. + * src/cache/ftcimage.c (FTC_Image_Cache_Lookup), + src/cache/ftcmanag.c (FTC_Manager_Done, FTC_Manager_Reset, + FTC_Manager_Lookup_Face, FTC_Manager_Lookup_Size, + FTC_Manager_Register_Cache), src/cache/ftcsbits.c + (FTC_SBit_Cache_Lookup): Ditto. + + * src/include/freetype/cache/ftcglyph.h (FTC_GlyphNode_Init), + src/include/freetype/ftmac.h (FT_New_Face_From_FOND): Use FT_EXPORT. + +2000-11-29 Werner Lemberg + + * src/sfnt/sfdriver.c: Include ttsbit.h and ttpost.h only + conditionally. + + * src/truetype/ttdriver.c (Set_Char_Sizes, Set_Pixel_Sizes): Set + `size->strike_index' only conditionally. + + * src/type1/t1driver.c, src/type1/t1objs.c: Include t1afm.h only + conditionally. + + * src/winfonts/winfnt.h: Move all type definitions to... + * src/include/freetype/internal/fnttypes.h: New file. + * src/winfonts/winfnt.c: Use it. + +2000-11-29 ??? ??? + + * include/freetype/internal/ftdebug.h: Replaced FT_CAT and FT_XCAT + with a direct solution (which also satisfies picky compilers). + +2000-11-28 YAMANO-UCHI Hidetoshi + + * src/truetype/ttobjs.c (TT_Init_Size): Fix #ifdef's to work with + disabled interpreter also. + + * src/base/ftnames.c (FT_Get_Sfnt_Name_Count): Fix incorrect + parentheses. + +2000-11-26 Tom Kacvinsky + + * src/cff/t2gload.c (T2_Parse_CharStrings): Added logic to glyph + width setting code to take into account even/odd argument counts + and glyph width operand before endchar/hmoveto/vmoveto. + +2000-11-26 Werner Lemberg + + * builds/ansi/ansi.mk: Fix inclusion order of files. + +2000-11-26 Keith Packard + + * src/type1/t1objs.c (T1_Init_Face): Compute style flags. + +2000-11-26 Werner Lemberg + + * builds/compiler/ansi-cc.mk (CLEAN_LIBRARY): Fix rule and + conditional. + +2000-11-23 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Use decrypt + function from PSAux module. + + * src/type1/t1parse.c (T1_Done_Parse): Renamed to... + (T1_Finalize_Parser): New function (to avoid name clash with a + function in the PSAux module). + (T1_Decrypt): Removed since it is duplicated in the PSAux module. + (T1_Get_Private_Dict): Added `psaux' as new parameter; use decrypt + function from PSAux module. + + * src/type1/t1parse.h: Adapted. + +2000-11-22 Tom Kacvinsky + + * src/cff/t2objs.c (T2_Init_Face): For pure CFF fonts, set + `root->num_faces' to `cff->num_faces' and set `units_per_EM' + to 1000. + + * src/cff/t2parse.c (parse_t2_real): Fixed real number parsing + loop. + + * src/cff/t2load.c (T2_Get_String): Called T2_Get_Name with a + sid that was off by one. + +2000-11-16 David Turner + + * src/autohint/ahtypes.h (AH_Hinter): Added new fields to control + auto-hinting of synthetic Type 1 fonts. + + * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph): + Added auto-hinting support of synthetic Type 1 fonts. + +2000-11-12 Tom Kacvinsky + + * src/sfnt/ttload.c (TT_LookUp_Table, TT_Load_Generic_Table): Change + tracing output. + + * src/sfnt/sfobjs.c (SFNT_Load_Face): Set boolean variable + `has-outline' to true only if the font has a `glyf' or `CFF ' table. + +2000-11-11 Werner Lemberg + + * builds/win32/visualc/freetype.dsp: Fix raster1->raster and + type1z->type1. + +2000-11-11 Tom Kacvinsky + + * builds/unix/freetype-config.in, builds/cygwin/freetype-config.in: + Added a --libtool option. When freetype-config --libtool is + invoked, the absolute path to the libtool convenience library + is returned. + +2000-11-11 Werner Lemberg + + * builds/cygwin/cygwin-def.in: Same fix as previous. + +2000-11-10 Tom Kacvinsky + + * builds/unix/unix-def.in: Add + + INSTALL_PROGRAM := @INSTALL_PROGRAM@ + INSTALL_SCRIPT := @INSTALL_SCRIPT@ + + so that installation of freetype-config does not fail. + +2000-11-10 Werner Lemberg + + * builds/cygwin/freetype-config.in, builds/unix/freetype-config.in: + Move test down for empty --exec-prefix. + Fix --version. + + * builds/cygwin/install.mk, builds/unix/install.mk: Use + $(INSTALL_SCRIPT) for installation of freetype-config. + + * builds/cygwin/install.mk: Fix clean target names. + +2000-11-09 David Turner + + + * Version 2.0 released. + ======================= + +---------------------------------------------------------------------------- + +Copyright 2000, 2001, 2002, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/src/3rdparty/freetype/ChangeLog.21 b/src/3rdparty/freetype/ChangeLog.21 new file mode 100644 index 0000000000..d6371d1758 --- /dev/null +++ b/src/3rdparty/freetype/ChangeLog.21 @@ -0,0 +1,9439 @@ +2005-06-08 Werner Lemberg + + + * Version 2.1.10 released. + ========================== + + + * src/pcf/readme: Renamed to... + * src/pcf/README: This. + +2005-06-07 Detlef Würkner + + * builds/amiga/*: Added copyright notes, reworked some comments. + +2005-06-05 Werner Lemberg + + * Add copyright notices to all files which don't have one. + + * docs/license.txt: Renamed to... + * docs/LICENSE.TXT: This. + * docs/FTL.txt: Renamed to... + * docs/FTL.TXT: This. + * docs/GPL.txt: Renamed to... + * docs/GPL.TXT: This. + + * docs/PATENTS: Slightly reworded. Suggested by Sylvain Beucler + . + +2005-06-04 Werner Lemberg + + * include/freetype/ftimage.h (FT_Outline_MoveToFunc, + FT_Outline_LineToFunc, FT_Outline_ConicToFunc, + FT_Outline_CubicToFunc, FT_Raster_RenderFunc), + include/freetype/ftrender.h (FT_Glyph_TransformFunc, + FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Don't use + `const' to stay compatible with FreeType 2.1.9. + +2005-06-01 Adam D. Moss + + * src/base/ftstroke.c (ft_stroker_inside): Revert `sigma' patch from + 2004-07-11; this gives much better results under normal + circumstances. + +2005-05-30 Chia I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Minor + documentation improvements. + + * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix typos. + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Add support for bitmap + of pixel_mode FT_PIXEL_MODE_GRAY2 or FT_PIXEL_MODE_GRAY4. + If xstr is larger than 8 and bitmap is of pixel_mode + FT_PIXEL_MODE_MONO, set xstr to 8 instead of returning error. + +2005-05-29 Chia I Wu + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Fix emboldening bitmap + of mode FT_PIXEL_MODE_GRAY. Also add support for mode + FT_PIXEL_MODE_LCD and FT_PIXEL_MODE_LCD_V. + (ft_bitmap_assure_buffer): FT_PIXEL_MODE_LCD and FT_PIXEL_MODE_LCD_V + should have ppb (pixel per byte) 1. + Zero the padding when there's no need to allocate memory. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle slot->advance + too. + More suited emboldening strength. + +2005-05-28 Chia I Wu + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Handle negative pitch. + Handle FT_PIXEL_MODE_GRAY with num_gray != 256. + Improve speed for FT_PIXEL_MODE_GRAY. + (ft_bitmap_assure_buffer): Accept FT_PIXEL_MODE_LCD and + FT_PIXEL_MODE_LCD_V. + +2005-05-27 Chia I Wu + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Initialize `error'. + + * src/base/ftobjs.c (ft_cmap_done_internal): New function. + (FT_CMap_Done): Remove cmap from cmap list. + (destroy_charmaps, FT_CMap_New): Don't call FT_CMap_Done but + ft_cmap_done_internal. + +2005-05-26 Werner Lemberg + + * docs/GPL.txt: Update postal address of FSF. + +2005-05-26 Chia I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Improve + documentation. + + * src/base/ftsynth.c (FT_BOLD_THRESHOLD): Removed. + (FT_GlyphSlot_Embolden): Check whether slot is bitmap owner. + Always modify the metrics. + +2005-05-24 Werner Lemberg + + * docs/CHANGES: Updated. + +2005-05-24 Chia I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): New declaration. + + * include/freetype/ftoutln.h (FT_Outline_Embolden): New declaration. + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): New auxiliary + function. + (FT_Bitmap_Embolden): New function. + + * src/base/ftoutln.c (FT_Outline_Embolden): New function. + + * src/base/ftsynth.c: Don't include FT_INTERNAL_CALC_H and + FT_TRIGONOMETRY_H but FT_BITMAP_H. + (FT_GlyphSlot_Embolden): Use FT_Outline_Embolden or + FT_Bitmap_Embolden. + +2005-05-24 Werner Lemberg + + * configure: Always remove config.mk, builds/unix/unix-def.mk, and + builds/unix/unix-cc.mk. This fixes repeated calls of the script. + Reported by Nelson Beebe and Behdad Esfahbod. + + * README.CVS: Mention file permissions. + +2005-05-23 Werner Lemberg + + * builds/amiga/makefile.os4 (WARNINGS), builds/compiler/gcc-dev.mk + (CFLAGS), builds/compiler/gcc.mk (CFLAGS): Remove + -fno-strict-aliasing. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c -- + it is currently loaded from ttsbit.c. + +2005-05-23 Behdad Esfahbod + + Say you have `(Foo*)x' and want to assign, pass, or return it as + `(Bar*)'. If you simply say `x' or `(Bar*)x', then the C compiler + would warn you that type casting incompatible pointer types breaks + strict-aliasing. The solution is to cast to `(void*)' instead which + is the generic pointer type, so the compiler knows that it should + make no strict-aliasing assumption on `x'. But the problem with + `(void*)x' is that seems like in C++, unlike C, `void*' is not a + generic pointer type and assigning `void*' to `Bar*' without a cast + causes an error. The solution is to cast to `Bar*' too, with + `(Bar*)(void*)x' as the result -- this is what the patch does. + + * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), + include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Remove + cast on lvalue, use a temporary pointer instead. + Cast temporarily to (void*) to not break strict aliasing. + + * include/freetype/internal/ftmemory.h (FT_MEM_ALLOC, + FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, FT_MEM_FREE), + src/base/ftglyph.c (FT_Glyph_To_Bitmap): Cast temporarily to (void*) + to not break strict aliasing. + + * src/base/ftinit.c (FT_USE_MODULE): Fix wrong type information. + + * builds/unix/configure.ac (XX_CFLAGS): Remove -fno-strict-aliasing. + +2005-05-23 David Turner + + Fix Savannah bug #12213 (incorrect behaviour of the cache sub-system + in low-memory conditions). + + * include/freetype/cache/ftccache.h (FTC_CACHE_TRYLOOP, + FTC_CACHE_TRYLOOP_END): New macros. + + * src/cache/ftccache.c (FTC_Cache_NewNode), src/cache/ftcsbits.c + (ftc_snode_compare): Use FT_CACHE_TRYLOOP and FTC_CACE_TRYLOOP_END. + +2005-05-23 Werner Lemberg + + * src/base/rules.mk (BASE_SRC): Don't add ftsynth.c here but... + (BASE_EXT_SRC): Here. + +2005-05-22 Werner Lemberg + + * src/base/ftrfork.c (raccess_guess_apple_generic): Mark + `version_number' and `entry_length' as unused. + (raccess_guess_linux_double_from_file_name): Remove `memory'. + (raccess_make_file_name): Mark `error' as unused. + + * src/bdf/bdflib.c (_bdf_parse_properties): Remove `memory'. + + * src/cid/cidobjs.c (cid_face_init): Remove `psnames'. + + * src/sfnt/sfobjs.c (sfnt_load_face): Remove `memory'. + + * src/truetype/ttgxvar.c (ft_var_readpackedpoints, + ft_var_readpackeddeltas, ft_var_load_avar): Mark `error' as unused. + + * src/base/rules.mk (BASE_SRC): Add ftsynth.c. + +2005-05-21 David Turner + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Fix a bug that + produced unpleasant artefacts when trying to embolden very sharp + corners. + +2005-05-20 Werner Lemberg + + * docs/CHANGES: Updated. + +2005-05-20 Chia I Wu + + * src/base/ftbitmap.c: Don't include FT_FREETYPE_H and FT_IMAGE_H + but FT_BITMAP_H. + (FT_Bitmap_Copy): New function (from ftglyph.c). + + * include/freetype/ftbitmap.h (FT_Bitmap_Copy): New public + definition. + + * src/base/ftglyph.c: Include FT_BITMAP_H. + (ft_bitmap_copy): Move to ftbitmap.c. + (ft_bitmap_glyph_init): Remove `memory' variable. + Create new bitmap object if FT_GLYPH_OWN_BITMAP isn't set. + (ft_bitmap_glyph_copy): Use FT_Bitmap_Copy. + (ft_bitmap_glyph_done): Use FT_Bitmap_Done. + (ft_outline_glyph_init): Use FT_Outline_Copy. + + * src/base/ftoutln.c (FT_Outline_Copy): Handle source == target. + (FT_Outline_Done_Internal): Check for valid `memory' pointer. + (FT_Outline_Translate, FT_Outline_Reverse, FT_Outline_Render, + FT_Outline_Transform): Check for valid `outline' pointer. + + * src/base/ftobjs.c (FT_New_GlyphSlot): Prepend glyph slot to + face->glyph, otherwise a new second glyph slot cannot be created. + (FT_Done_GlyphSlot): Fix memory leak. + (FT_Open_Face): Updated -- face->glyph is already managed by + FT_New_GlyphSlot. + + * src/type42/t42objs.c (T42_GlyphSlot_Done): Updated. + +2005-05-20 Kirill Smelkov + + * include/freetype/ftimage.h (FT_Raster_Params), + include/freetype/ftoutln.h (FT_Outline_Translate, + FT_Outline_Transform), src/base/ftoutln.c (FT_Outline_Translate, + FT_Outline_Transform): Decorate parameters with `const' where + appropriate. + Update all callers. + + * src/raster/ftraster.c (ft_black_reset), src/smooth/ftgrays.c + (gray_raster_reset): Remove `const' from `pool_base' argument. + +2005-05-18 Kirill Smelkov + + * src/raster/ftmisc.h: New file. Only needed if ftraster.c is + compiled as stand-alone. + + * src/raster/ftraster.c: Add comment how to compile as stand-alone. + s/FT_CONFIG_OPTION_STATIC_RASTER/FT_STATIC_RASTER/. + s/TT_STATIC_RASTER/FT_STATIC_RASTER/. + [_STANDALONE_]: Include ftimage.h and ftmisc.h. + (FT_TRACE1, FT_TRACE6, ft_memset, FT_MEM_ZERO): Define + conditionally. + (Render_Glyph, Render_Gray_Glyph): Return Raster_Err_None (or + Raster_Err_Unsupported). + (ft_black_new) [_STANDALONE_]: Fix type of `the_raster'. + (ft_black_init, ft_black_reset, ft_black_set_mode, ft_black_render): + Use `ras', not `raster'. + (ft_black_done): Use FT_UNUSED_RASTER. + (Horizontal_Sweep_Init, Horizontal_Sweep_Step, + Horizontal_Gray_Sweep_Span): Use FT_UNUSED_RASTER. + +2005-05-18 Werner Lemberg + + * docs/announce: Start updating. + + * docs/CHANGES: Updated. + +2005-05-16 Vitaliy Pasternak + + * builds/win32/visualc/freetype.vcproj: Updated. + Exclude debug info for `Release' versions to reduce library size. + +2005-05-16 Werner Lemberg + + * src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this + is, ignore `aface' completely if face_index < 0. Reported by David + Osborn . + +2005-05-16 Kirill Smelkov + + * include/freetype/ftimage.h (FT_Outline_MoveToFunc, + FT_Outline_LineTo_Func, FT_Outline_ConicToFunc, + FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic, + gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to, + gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters + with `const' where appropriate. + +2005-05-11 Kirill Smelkov + + * include/freetype/ftimage.h (FT_Raster_RenderFunc), + include/freetype/ftrender.h (FT_Glyph_TransformFunc, + FT_Renderer_Render_Func, FT_Renderer_TransformFunc), + src/base/ftglyph.c (ft_outline_glyph_transform), + src/raster/ftrend1.c (ft_raster1_transform, ft_raster1_render), + src/smooth/ftgrays.c (FT_Outline_Decompose, gray_raster_render), + src/smooth/ftsmooth.c (ft_smooth_transform, + ft_smooth_render_generic, ft_smooth_render, ft_smooth_render_lcd, + ft_smooth_render_lcd_v): Decorate parameters with `const' where + appropriate. + + * src/raster/ftraster.c (RASTER_RENDER_POOL): Removed. Obsolete. + (ft_black_render): Decorate parameters with `const' where + appropriate. + +2005-05-11 Werner Lemberg + + * src/sfnt/ttcmap.c (tt_cmap4_set_range): Fix typo (FT_PEEK_SHORT -> + FT_PEEK_USHORT) which caused crashes. Reported by Ismail Donmez + . + +2005-05-08 Werner Lemberg + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_GLOBAL_SERVICE) + [__cplusplus]: Fix typo. + +2005-05-07 Werner Lemberg + + Handle unsorted SFNT type 4 cmaps correctly (reported by Dirck + Blaskey ). + + * src/sfnt/ttcmap.h (TT_CMap): Add member `unsorted'. + * src/sfnt/ttcmac.c: Use SFNT_Err_Ok where appropriate. + + (tt_cmap0_validate, tt_cmap2_validate, tt_cmap6_validate, + tt_cmap8_validate, tt_cmap10_validate, tt_cmap12_validate): Use + `FT_Error' as return type. + (tt_cmap4_validate): Use `FT_Error' as return type. + Return error code for unsorted cmap. + (tt_cmap4_char_index, tt_cmap4_char_next): Use old code for unsorted + cmaps. + (tt_face_build_cmaps): Set `unsorted' variable in cmap. + +2005-05-07 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_get_location): Fix typo. + +2005-05-06 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Set ppem value in top + dictionary for SFNT-based CFF. + +2005-05-05 Werner Lemberg + + Handle malformed `loca' table entries. + + * docs/TODO: Add some bugs which should be fixed. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add `glyf_len' + element. + + * src/truetype/ttpload.c (tt_face_load_loca): Get length of `glyf' + table. + (tt_face_get_location): Fix computation of `asize' for malformed + `loca' entries. + +2005-05-01 David Turner + + * Jamfile: Remove `otvalid' from the list of compiled modules. + + * include/freetype/internal/ftserv.h: Add compiler pragmas to get + rid of annoying warnings with Visual C++ compiler in maximum warning + mode. + + * src/autofit/afhints.c, src/autofit/aflatin.c, src/base/ftstroke.c, + src/bdf/bdfdrivr.c, src/cache/ftcbasic.c, src/cache/ftccmap.c, + src/cache/ftcmanag.c, src/cff/cffload.c, src/cid/cidload.c, + src/lzw/zopen.c, src/otvalid/otvgdef.c, src/pcf/pcfread.c, + src/sfnt/sfobjs.c, src/truetype/ttgxvar.c: Remove compiler warnings. + +2005-04-28 Werner Lemberg + + * docs/TODO: Updated. + +2005-04-24 Werner Lemberg + + * src/otvalid/otvcommn.c + (otv_GSUBGPOS_have_MarkAttachmentType_flag): Handle table == 0. + +2005-04-16 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Set default upem value in top + font dict also. + Handle font matrix settings in subfonts. + + * src/cff/cffgload.c (cff_slot_load): Use the correct font matrix + for CID-keyed fonts with subfonts. + + * docs/formats.txt: Updated. + +2005-04-14 Kirill Smelkov + + * include/freetype/freetype.h (FT_Vector_Transform), + include/freetype/ftimage.h (FT_Raster_Params), + include/freetype/ftoutln.h, src/base/ftoutln.c (FT_Outline_Get_CBox, + FT_Outline_Copy, FT_Outline_Transform, FT_Vector_Transform, + FT_Outline_Get_Bitmap), src/raster/ftraster.c (ft_black_render), + src/smooth/ftgrays.c (gray_raster_render): Decorate parameters with + `const' where appropriate. + +2005-04-14 Werner Lemberg + + * src/type1/t1load.c (parse_charstrings): Catch this non-standard + beginning of the /CharStrings dictionary: + + /CharStrings 118 dict def + Private begin + CharStrings begin + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Fix arguments + to call of tt_sbit_decoder_load_bitmap. + +2005-04-13 Werner Lemberg + + * docs/TODO: Updated. + + * autogen.sh: Use `--force' for all commands. + +2005-04-09 Werner Lemberg + + * src/pshinter/pshalgo.c (ps_hints_apply): Change scaling values + only if `fitted' is not zero. + +2005-04-06 Werner Lemberg + + * src/truetype/ttgload.c (tt_face_get_metrics) [FT_OPTIMIZE_MEMORY]: + Fix typo which sometimes causes wrong metrics for the last glyph. + +2005-04-04 David Turner + + * devel/ftoption.h, include/freetype/config/ftoption.h + (FT_OPTIMIZE_MEMORY): Comment out this macro for the upcoming 2.1.10 + release. + (*_CHESTER_*): Removed. No longer used. + + * src/autofit/afhints.c (af_axis_hints_new_segment, + af_axis_hints_new_edge): Small tweak to use less heap memory. + +2005-04-03 Werner Lemberg + + * src/type1/t1parse.c (T1_New_Parser): Relax the check for a valid + first line in the font. + +2005-04-03 Werner Lemberg + + * docs/CHANGES, include/freetype/freetype.h: Improve documentation + of FT_Set_Pixel_Sizes and FT_Set_Char_Size. + +2005-03-26 Detlef Würkner + + * builds/amiga/src/base/ftsystem.c (ft_amiga_stream_io): Fix buffer + offsets after a large read. + +2005-03-26 Werner Lemberg + + * src/autofit/afglobal.c (af_face_globals_get_metrics): + s/index/gidx/. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Fix compiler + warnings. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. + + * src/sfnt/ttsbit0.h: Dummy file for build with `make'. + +2005-03-26 Detlef Würkner + + Update of the Amiga port. + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile: Included the base extension files + (ftbitmap.c, ftotval.c, ftpfr.c, ftstroke.c, ftxf86.c). + +2005-03-25 Detlef Würkner + + Update of the Amiga port. + + * builds/amiga/makefile, builds/amiga/smakefile: Handle new modules. + + * builds/amiga/makefile.os4: Makefile for AmigaOS4 SDK. + + * builds/amiga/README: Updated. + + * builds/amiga/include/freetype/config/ftconfig.h: Handle gcc for + AmigaOS4. + + * builds/amiga/include/freetype/config/ftmodule.h: Handle new + modules. + + * builds/amiga/src/base/ftdebug.c: Updated to current version of + default ftdebug.c. + Add various include files and macros to have proper support for + both AmigaOS4 and older AmigaOS versions. + Don't declare KVPrintF explicitly. + Replace getenv with GetVar. + Actually enable debugging code. + + * builds/amiga/src/base/ftsystem.c: Major rewrite. + +2005-03-23 Werner Lemberg + + * tests/*: Removed. + +2005-03-23 Werner Lemberg + + * docs/CHANGES, docs/INSTALL.ANY: Updated. + + * include/freetype/ftmoderr.h: Replace `Autohint' with `Autofit'. + Add `OTvalid'. + + * src/autofit/aferrors.h: New file. + + * src/autofit/afglobal.c, src/autofit/afhints.c, + src/autofit/aflatin.c, src/autofit/afloader.c: s/FT_Err_/AF_Err_/. + Include aferrors.h. + + * src/autofit/rules.mk (AUTOF_DRV_H): Include aferrors.h. + + * src/otvalid/otverror.h: s/FT_Mod_Err_OTV/FT_Mod_Err_OTvalid/. + +2005-03-22 David Turner + + * src/autohint/*: Removed. + * Jamfile: Updated. + +2005-03-15 David Turner + + * src/bdf/bdflib.c: Remove compiler warnings. + (hash_rehash, hash_init): Don't call FT_MEM_ZERO. + (_bdf_list_t): Add `memory' field. + (_bdf_list_init, _bdf_list_done, _bdf_list_ensure): New functions. + (_bdf_shift, _bdf_join): Rename to... + (_bdf_list_shift, _bdf_list_join): This. + (_bdf_split): Renamed to... + (_bdf_list_split): This. Use new functions. + (bdf_internal_readstream): Removed. + (NO_SKIP): New macro. + (_bdf_readstream): Rewritten. + (bdf_create_property, _bdf_add_comment): Improve allocation. + (_bdf_set_default_spacing, _bdf_parse_glyphs): Updated. Improve + allocation. + (_bdf_parse_properties, _bdf_parse_start): Updated. + (bdf_load_font): Updated to use new functions. + + * src/type1/t1parse.c (check_type1_format): New function. + (T1_New_Parser): Use it to check font header before allocating + anything on the heap. + + * src/type42/t42parse.c (t42_parser_init): Modify functions to check + the font header before allocating anything on the heap. + + * include/freetype/internal/ftmemory.h (FT_ARRAY_MAX, + FT_ARRAY_CHECK): New macros. + + * src/base/ftstream.c (FT_Stream_TryRead): New function. + * include/freetype/internal/ftstream.h: Updated. + + * src/pcf/pcfread.c (pcf_read_TOC), src/pcf/pcfutil.c + (BitOrderInvert, TwoByteSwap, FourByteSwap): Minor fixes and + simplifications. Try to protect the PCF driver from doing stupid + things with broken fonts. + + * src/lzw/ftlzw.c (FT_Stream_OpenLZW): Check the LZW header before + doing anything else. This avoids unnecessary heap allocations + (400KByte of heap memory for the LZW decoder). + + * src/gzip/ftgzip.c (FT_Stream_OpenGZip): Ditto for the gzip + decoder, although the code savings are smaller. + + * docs/CHANGES: Updated. + +2005-03-10 David Turner + + * src/tools/glnames.py: Add comment to explain the compression + being used for the Adobe Glyph List. + +2005-03-10 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_cvt, tt_face_load_fpgm): + Fix serious typo which prevented correct TT rendering. + + * include/freetype/internal/ftmemory.h: Undo change from 2005-03-03. + To suppress warnings it is sufficient to use `-fno-strict-aliasing'. + +2005-03-10 Werner Lemberg + + * src/tools/glnames.py: Formatted. + Format output to be in sync with other FreeType code. + Import `re' and `os.path'. + (StringTable) <__init__>: Add parameter to initialize master table + name. + (StringTable) : Don't pass master table name. + (StringTable) : Emit explanatory comment. + Simplify and make output more human readable. + (t1_bias, glyph_list, adobe_glyph_names): Removed. Unused. + (main): Use `basename' for file name in header. + + * src/psnames/pstables.h: Regenerated. + +2005-03-09 David Turner + + * src/tools/glnames.py: Rewrite the generator for the `pstables.h' + header file which contains various constant tables related to glyph + names. It now uses a different, more compact storage scheme that + saves about 20KB. This also closes Savannah bug #12262. + + * src/psnames/pstables.h: Regenerated. + + * src/psnames/psmodule.c (ps_unicode_value): Use + `ft_get_adobe_glyph_index', a new function defined in `pstables.h'. + (ps_get_macintosh_name, ps_get_standard_strings): Updated. + + * src/base/ftobjs.c (FT_Set_Char_Sizes): Handle fractional sizes + more carefully. This fixes Savannah bug #12263. + +2005-03-06 David Turner + + * src/otvalid/otvgsub.c, src/otvalid/otvgpos.c: Make static tables + constant. + + * src/autofit/aflatin.c (af_latin_metrics_init): Fix Savannah bug + #12212 (auto-hinter refuses to work if no Unicode charmap in font). + +2005-03-05 Werner Lemberg + + * autogen.sh: New script for bootstrapping. + + * README.CVS: New file which documents bootstrapping. + + * builds/unix/aclocal.m4, builds/unix/config.guess, + builds/unix/config.sub, builds/unix/configure, + builds/unix/ltmain.sh: Removed. + +2005-03-04 Werner Lemberg + + * src/base/ftutil.c: Include FT_INTERNAL_OBJECTS_H. + +2005-03-03 Werner Lemberg + + Various fixes for C and C++ compiling. + + * src/autofit/*: Add copyright messages. + + * src/autofit/afhints.c (af_glyph_hints_done): Don't use + `AF_Dimension' but `int' for loop counter. + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Don't use + `AF_Dimension' but `int' for loop counter. + Use proper enumeration value for `render_mode'. + (af_latin_metrics_scale_dim): Don't shadow variables. + (af_latin_hints_compute_segments): Use proper cast for `major_dir' + and `segment_dir'. + (af_latin_align_linked_edge, af_latin_hint_edges): Fix arguments of call to + `af_latin_compute_stem_width'. + (af_latin_hints_apply): Don't use `AF_Dimension' but `int' for loop + counter. + + * src/base/ftdbgmem.c (ft_mem_table_get_source, FT_DumpMemory): Use + proper cast for memory allocation. + + * src/cff/cffdrivr.c (cff_get_kerning): Use proper cast for + initialization of `sfnt'. + + * src/sfnt/sfdriver.c: Include `ttkern.h'. + + * src/sfnt/ttkern.c (tt_face_get_kerning): Don't shadow variables. + + * src/truetype/ttgload.c: Include `ttpload.h'. + +2005-03-03 David Turner + + * include/freetype/internal/ftmemory.h (FT_ALLOC, FT_REALLOC, + FT_QALLOC, FT_QREALLOC) [gcc >= 3.3]: Provide macro versions which + avoid compiler warnings. + (FT_NEW, FT_NEW_ARRAY, FT_RENEW_ARRAY, FT_QNEW, FT_QNEW_ARRAY, + FT_QRENEW_ARRAY, FT_ALLOC_ARRAY, FT_REALLOC_ARRAY): Updated. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_FIND_GLOBAL_SERVICE, FT_FACE_LOOKUP_SERVICE) [__cplusplus]: + Provide macro versions which avoid compiler warnings. + + * src/base/ftutil.c (ft_highpow2): New utility function. + + * include/freetype/internal/ftobjs.h: Updated. + + * src/pfr/pfrload.c (pfr_get_gindex, pfr_compare_kern_pairs, + pfr_sort_kerning_pairs): Don't define if FT_OPTIMIZE_MEMORY is set. + (pfr_phy_font_done): Don't handle `kern_pairs' if FT_OPTIMIZE_MEMORY + is set. + (pfr_phy_font_load): Don't call `pfr_sort_kerning_pairs' if + FT_OPTIMIZE_MEMORY is set. + + * src/pfr/pfrobjs.c (pfr_slot_load): Comment out some code which + doesn't work with broken fonts. + (pfr_face_get_kerning) [FT_OPTIMIZE_MEMORY]: Implement. + + * src/pfr/pfrtypes.h (PFR_KernItemRec): Optimize member types. + (PFR_NEXT_KPAIR): New macro. + (PFR_PhyFontRec): Don't define `kern_pairs' if FT_OPTIMIZE_MEMORY is + set. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Introduce + temporary variable to avoid gcc warning. + (tt_face_load_sbit_image): Mark unused variables with FT_UNUSED. + + * src/truetype/ttpload.c (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]: + Remove redundant variable. + + * include/freetype/config/ftmodule.h: Moving the order of drivers to + speed up font loading. The PCF and BDF loaders are still slow and + consume far too much memory. + +2005-03-03 Werner Lemberg + + * devel/ftoption.h: Updated to recent changes. + +2005-03-02 Werner Lemberg + + * src/autofit/afdummy.c, src/autofit/afdummy.h + (af_dummy_script_class): Fix type. + + * src/autofit/aflatin.c, src/autofit/aflatin.h + (af_latin_script_class): Fix type. + + * src/autofit/rules.mk (AUTOF_DRV_SRC): Fix typo. + +2005-03-01 David Turner + + * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning), + src/sfnt/ttsbit0.c (tt_face_load_sbit_strikes, + tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_compound, + tt_sbit_decoder_load_image), src/sfnt/ttload.c + (tt_face_load_metrics): Remove compiler warnings + -- redundant variables, missing initializations, etc. + + * src/sfnt/ttsbit.h: Handle FT_OPTIMIZE_MEMORY. + + * src/autofit/rules.mk, src/autofit/module.mk, + src/autofit/afangles.h: New files. + + * src/autofit/afhints.c (af_axis_hints_new_segment, + af_axis_hints_new_edge): New functions. + (af_glyph_hints_done): Do proper deallocation. + (af_glyph_hints_reload): Only reallocate points array. This + drastically reduces heap usage. + + * src/autofit/afhints.h (AF_PointRec, AF_SegmentRec): Optimize + member types and positions. + (AF_AxisHintsRec): Add `max_segments' and `max_edges'. + (af_axis_hints_new_segment, af_axis_hints_new_edge): New prototypes. + + * src/autofit/aflatin.c (af_latin_metricsc_scale): Don't call + AF_SCALER_EQUAL_SCALES. + (af_latin_hints_compute_segments): Change return type to FT_Error. + Update all callers. + Improve segment allocation. + (af_latin_hints_compute_edges): Change return type to FT_Error. + Update all callers. + Improve edge allocation and link handling. + (af_latin_hints_detect_features): Change return type to FT_Error. + Update all callers. + + * src/autofit/aflatin.h: Updated. + + * src/autofit/afloader.c (af_loader_load_g) + : Assure axis->num_edges > 1. This fixes + a bug with certain fonts. + + * include/freetype/config/ftmodule.h: The auto-fitter is now the + only supported auto-hinting module. + + * include/freetype/config/ftstdlib.h (FT_INT_MAX): New macro. + +2005-02-28 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_loca): Fix typo. + + * src/sfnt/ttkern.c: Include `ttkern.h'. + (FT_COMPONENT): Updated. + + * include/freetype/internal/fttrace.h: Add entry for `ttkern'. + + * src/sfnt/ttsbit0.c: s/FT_Err_/SFNT_Err_/. + Decorate constants with `U' and `L' where necessary. + + * src/sfnt/ttcmap.c (tt_cmap4_next): Remove unused variable. + +2005-02-28 David Turner + + * src/base/ftdbgmem.c (FT_DumpMemory): Added sorting of memory + sources according to decreasing maximum cumulative allocations. + (ft_mem_source_compare): New auxiliary function. + + * src/sfnt/ttsbit0.c: New file, implementing a heap-optimized + embedded bitmap loader. + + * src/sfnt/ttsbit.c: Include `ft2build.h', FT_INTERNAL_DEBUG_H, + FT_INTERNAL_STREAM_H, FT_TRUETYPE_TAGS_H. + Load `ttsbit0.c' if FT_OPTIMIZE_MEMORY is set, otherwise use + file contents. + (tt_face_load_sbit_strikes): Set up root fields to indicate the + strikes. This fixes Savannah bug #12107. + Use `static' keyword for `sbit_line_metrics_field', + `strike_start_fields', `strike_end_fields'. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Define + `sbit_table', `sbit_table_size', `sbit_num_strikes' if + FT_OPTIMIZE_MEMORY is set. + Don't define `num_sbit_strikes' and `sbit_strikes' if + FT_OPTIMIZE_MEMORY is set. + + * src/cff/cffobjs.c (sbit_size_reset): Handle FT_OPTIMIZE_MEMORY. + + * src/sfnt/sfobjs.c (sfnt_load_face): Fixed bug that prevented + loading SFNT fonts without a `kern' table. + Properly pass root->face_flags. + Remove code for TT_CONFIG_OPTION_EMBEDDED_BITMAPS. + + * src/sfnt/sfdriver.c (sfnt_interface) + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Don't use `tt_find_sbit_image' + and `tt_load_sbit_metrics'. + + * src/sfnt/ttcmap.c: Optimize linear charmap scanning for Format 4. + (OPT_CMAP4): New macro. + (TT_CMap4Rec) [OPT_CMAP4]: New structure. + (tt_cmap4_init, tt_cmap4_set_range, tt_cmap4_next, tt_cmap4_reset) + [OPT_CMAP4]: New functions. + (tt_cmap4_char_next) [OPT_CMAP4]: Use `tt_cmap4_next' and + `tt_cmap4_reset'. + (tt_cmap4_class_rec) [OPT_CMAP4]: Use `TT_CMap4Rec' and + `tt_cmap4_init'. + + * src/truetype/ttobjs.c (Reset_SBit_Size): Handle + FT_OPTIMIZE_MEMORY. + + * src/autofit/afhints.h (AF_PointRec, AF_SegmentRec, AF_EdgeRec): + Optimize member types. + + * src/autofit/afloader.c (af_loader_done): Call + `af_glyph_hints_done'. + +2005-02-27 David Turner + + * src/sfnt/ttkern.c (tt_face_load_kern): Fix a small bug which + caused invalid (random) return values for the horizontal kerning. + +2005-02-25 David Turner + + Implement several memory optimizations to drastically reduce the + heap usage of FreeType, especially in the case of memory-mapped + files. The idea is to avoid loading and decoding tables in the + heap, and instead access the raw data whenever possible (i.e., when + it doesn't compromise performance). + + This has several benefits: For example, opening vera.ttf now uses + just a small amount of memory (even when the FT_Library footprint is + accounted for), until you start loading glyphs. Even then, you save + at least 20KB compared to the non-optimized case. Performance of + various operations, including open and close, has also been + dramatically improved. + + More optimizations to come, especially for the auto-hinter. + + * include/freetype/internal/sfnt.h (TT_Face_GetKerningFunc): New + function type. + (SFNT_Interface): Add it. + + * include/freetype/internal/tttypes.h (TT_HdmxEntryRec, TT_HdmxRec, + TT_Kern0_PairRec): Don't define if FT_OPTIMIZE_MEMORY is set. + (TT_FaceRec): Define `horz_metrics', `horz_metrics_size', + `vert_metrics', `vert_metrics_size', `hdmx_table', + `hdmx_table_size', `hdmx_record_count', `hdmx_record_size', + `hdmx_record_sizes', `kern_table', `kern_table_size, + `num_kern_tables', `kern_avail_bits', `kern_order_bits' if + FT_OPTIMIZE_MEMORY is set. + Don't define `hdmx', `num_kern_pairs', `kern_table_index', + `kern_pairs' if FT_OPTIMIZE_MEMORY is set. + + * src/base/ftdbgmem.c (ft_mem_table_set): Don't shadow variable. + Fix compiler warning. + + * src/cff/cffdrivr.c (Get_Kerning): Renamed to... + (cff_get_kerning): This. Simplify. + (cff_driver_class): Updated. + + * src/sfnt/Jamfile (_sources): Add `ttkern'. + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add `ttkern.c'. + + * src/sfnt/sfdriver.c (sfnt_interface): Add `tt_face_get_kerning'. + + * src/sfnt/sfnt.c: Include `ttkern.c'. + + * src/sfnt/sfobjs.c: Include `ttkern.h'. + (sfnt_load_face): Consider the `kern' and `gasp' table as optional. + (sfnt_done_face): Call `tt_face_done_kern'. + Handle horizontal metrics for FT_OPTIMIZE_MEMORY. + + * src/sfnt/ttkern.c, src/sfnt/ttkern.h: New files. Code has been + taken from `ttload.c' and `ttload.h'. + Provide special versions of `tt_face_load_kern', + `tt_face_get_kerning', and `tt_face_done_kern' for + FT_OPTIMIZE_MEMORY. + + * src/sfnt/ttload.c (tt_face_load_metrics, tt_face_load_hdmx, + tt_face_free_hdmx): Provide version for FT_OPTIMIZE_MEMORY. + (tt_face_load_kern, tt_kern_pair_compare, TT_KERN_INDEX): Moved to + `ttkern.c'. + + * src/sfnt/ttload.h: Updated. + + * src/sfnt/ttsbit.c (sbit_metrics_field): Add `static' keyword. + + * src/truetype/ttdriver.c (Get_Kerning): Renamed to... + (tt_get_kerning): This. Simplify. + (tt_driver_class): Updated. + + * src/truetype/ttgload.c (TT_Get_Metrics): Renamed to... + (tt_face_get_metrics): This. Provide version for FT_OPTIMIZE_MEMORY. + Update all callers. + (Get_Advance_Widths): Replaced with... + (Get_Advance_WidthPtr): This. Provide version for + FT_OPTIMIZE_MEMORY. + Update all callers. + + * src/truetype/ttgload.h: Updated. + +2005-02-22 David Turner + + * src/base/ftdbgmem.c: Partly rewritten. Added the ability to list + all allocation sites in the memory debugger. Also a new function + FT_DumpMemory() was added. It is only available in builds with + FT_DEBUG_MEMORY defined, and you must declare it in your own code to + use it, i.e., with something like: + + extern void FT_DumpMemory( FT_Memory ); + + ... + + FT_DumpMemory( memory ); + + * include/freetype/config/ftoption.h + (TT_CONFIG_OPTION_BYTECODE_INTERPRETER): Comment out definition -- + again. + (FT_OPTIMIZE_MEMORY): New configuration macro to control various + optimizations for reducing the heap footprint of memory-mapped + TrueType files. + + * include/freetype/internal/ftmemory.h (FT_ARRAY_ZERO): New + convenience macro. + + * include/freetype/internal/tttypes.h (TT_FaceRec) + [FT_OPTIMIZE_MEMORY]: Use optimized types for `num_locations' and + `glyph_locations'. + + * src/truetype/ttgload.c (load_truetype_glyph): Call + `tt_face_get_location'. + + * src/truetype/ttobjs.c (tt_face_init) + [FT_CONFIG_OPTION_INCREMENTAL]: Improve error handling. + (tt_face_done): Call `tt_face_done_loca'. + + * src/truetype/ttpload.c (tt_face_get_location, tt_face_done_loca): + New functions. If FT_OPTIMIZE_MEMORY is set, the locations table is + read directly from memory-mapped streams, instead of being decoded + into the heap. + (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]: New implementation. + (tt_face_load_cvt, tt_face_load_fpgm): Only load table if the + bytecode interpreter is compiled in. + + * src/truetype/ttpload.h: Updated. + + * src/autohint/ahglyph.c (ah_outline_load): Improve allocation + logic. + +2005-02-20 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.14. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.9.4. + + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at subversions.gnu.org. + +2005-02-14 Werner Lemberg + + * src/cff/cffcmap.c (cff_cmap_unicode_init): Don't try to build + a cmap for a CID-keyed font which doesn't have SIDs. + +2005-02-13 Werner Lemberg + + * src/type1/t1load.c (read_binary_data): Return more meaningful + value. + (parse_encoding, parse_subrs, parse_charstrings, parse_dict): Check + parser error value after call to T1_Skip_PS_Token (where necessary). + + * src/type1/t1parse.c (T1_Get_Private_Dict): Check parser error + value after call to T1_Skip_PS_Token. + + * src/cid/cidparse.c (cid_parser_new): Check parser error value + after call to cid_parser_skip_PS_token. + + * src/type42/t42parse.c (t42_parse_encoding, t42_parse_sfnts, + t42_parse_charstrings, t42_parse_dict): Check parser error value + after call to T1_Skip_PS_Token (where necessary). + + * src/psaux/psobjc.c (skip_string, ps_parser_skip_PS_token, + ps_tobytes): Add error messages. + +2005-02-12 Werner Lemberg + + * configure: Output more variables to the created Makefile so that + it can be used for ft2demos also (if the FT2DEMOS variable is + defined). + +2005-02-10 David Turner + + * src/pfr/pfrgload.c (pfr_glyph_load): Fix an unbounded growing + dynamic array when loading a glyph from a PFR font (Savannah bug + #11921). + + * src/base/ftbitmap.c (FT_Bitmap_Convert): Small improvements to the + conversion function (mainly stupid optimization). + + * src/base/Jamfile: Adding ftbitmap.c to the list of compiled files. + +2005-02-10 Werner Lemberg + + * builds/unix/freetype-config.in: Add new flag `--ftversion' to + return the FreeType version. Suggested by George Williams + . + + * docs/CHANGES: Updated. + +2005-02-09 Werner Lemberg + + * src/otvalid/otvmod.c (otv_validate): Deallocate arrays in case + of error. Reported by YAMANO-UCHI Hidetoshi . + +2005-02-08 Werner Lemberg + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : Accept `T1_Parse_Have_Moveto' state also which can + happen in empty glyphs. Reported by Ian Brown + (Savannah bug #11856). + +2005-02-04 Werner Lemberg + + * src/otlayout/*: Removed. Obsolete. + +2004-12-28 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.10. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.9.4. + * builds/unix/configure: Regenerated with autoconf 2.59b. + + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + + * builds/unix/install-sh: Updated from + `texinfo' CVS module at subversions.gnu.org. + + * builds/unix/ftsystem.c (FT_Stream_Open): Add proper cast for + ft_alloc. + Fix compiler warning. + +2004-12-27 Dirck Blaskey + + * src/cff/cffobjs.c (cff_face_init): Improve computation of + FT_STYLE_BOLD_FLAG. + +2004-12-27 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): A CFF within an SFNT can have + only a single font. This is undocumented but has been verified on + the opentype list. + +2004-12-26 Werner Lemberg + + * Jamfile (FT2_COMPONENTS): Add `otvalid'. + +2004-12-25 Werner Lemberg + + * src/base/ftbitmap.c (FT_Bitmap_Convert): Fix compiler warning. + +2004-12-15 Werner Lemberg + + * vms_make.com: Add ftbitmap.obj. + +2004-12-14 Werner Lemberg + + * src/base/ftbitmap.c, include/freetype/ftbitmap.h: New files for + handling various bitmap formats. + + * include/freetype/config/ftheader.h (FT_BITMAP_H): New macro. + + * src/base/rules.mk (BASE_EXT_SRC): Add ftbitmap.c. + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Don't convert bitmaps to 8bpp + but return them as-is. + + * docs/CHANGES: Mention new bitmap API. + * include/freetype/ftchapter.s: Updated. + +2004-12-11 Robert Clark + + * src/base/ftobjs.c (FT_Get_Kerning): Make kerning amount + dependent on ppem by scaling down for ppem < 25, then do normal + rounding. This gives slightly better results than rounding towards + zero. + +2004-12-09 Werner Lemberg + + * src/base/ftobjs.c (FT_Get_Kerning): Always round towards zero + for FT_KERNING_DEFAULT. This greatly enhances the kerning for + small ppem values. + +2004-12-08 Werner Lemberg + + * src/base/ftobjs.c (ft_glyphslot_clear): Reset `lsb_delta' and + `rsb_delta'. + +2004-12-05 Werner Lemberg + + * builds/unix/install.mk (install): Use $(OBJ_BUILD) for ftconfig.h. + +2004-12-03 Antoine Leca + + * include/freetype/ttnameid.h: Updated to latest + specifications from Microsoft. + +2004-11-26 Jouk Jansen + + * vms_make.com: Include ftbbox.c. + Fix `ccopt'. + Handle `otvalid' module. + Update `vmslib.dat' default values. + Fixes to `libs.opt'. + +2004-11-23 Anders Kaseorg + + * src/base/ftoutln.c (FT_OrientationExtremumRec, + ft_orientation_extremum_compute): Removed. + (FT_Outline_Get_Orientation): Rewritten, simplified. + + * src/autohint/ahglyph.c: Include FT_OUTLINE_H. + (ah_test_extremum, ah_get_orientation): Removed. + (ah_outline_load): Use FT_Outline_Get_Orientation. + + * src/base/ftsynth.c (ft_test_extrama, ft_get_orientation): Removed. + (FT_GlyphSlot_Embolden): Use FT_Outline_Get_Orientation. + +2004-11-23 Fernando Papa + + * src/truetype/ttinterp.h: Fix typo. + +2004-11-22 Antoine Leca + + * builds/win32/detect.mk: Corrected logic that detects Windows NT to + use the previous change even if win32 is forced. Corrected + detection of win32 on Win9X. + + * builds/dos/detect.mk: Added same correction as for win32 about + COPY on Windows NT. Detection of plain DOS 7.x. + +2004-11-22 Werner Lemberg + + * builds/detect.mk: Undo change from 2004-11-20. + * builds/win32/detect.mk: If the `OS' environment variable contains + `Windows_NT', use `cmd.exe /c copy' for copying files. + +2004-11-20 Werner Lemberg + + * builds/detect.mk (dos_setup): Use `cmd.exe' for copying + $(CONFIG_MK) to force lowercase file name under Windows. + +2004-11-19 Werner Lemberg + + Fix a serious bug in the TT hinter. + + * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Don't shift + points vertically before hinting. + + * docs/CHANGES: Updated. + + * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily, + FTC_GCache_Lookup): A new try to fix comparison with zero. + +2004-11-16 Werner Lemberg + + * builds/unix/configure.ac: Add `-fno-strict-aliasing' if gcc is + used. + * builds/unix/configure: Regenerated. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + +2004-11-16 Dr. Martin P.J. Zinser + + * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily, + FTC_GCache_Lookup): Fix comparison with zero. + + * docs/INSTALL.VMS: Updated. + + * vms_make.com: Updated. All `descrip.mms' files are now created + automatically. + + * src/*/descrip.mms: Removed. + +2004-11-16 Owen Taylor + + * builds/unix/freetype-config.in: Suppress -L$libdir for + /usr/lib64 as well as /usr/lib. (Reported by Dan Winship - + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=139199) + +2004-11-11 Werner Lemberg + + * src/cff/cffdrivr.c (cff_service_ps_info): Updated. + * src/cid/cidriver.c (cid_service_ps_info): Updated. + * src/type42/t42drivr.c (t42_ps_get_font_private): New function. + (t42_service_ps_info): Updated. + + * src/type42/t42parse.c (t42_parse_dict): Remove compiler warning. + +2004-11-11 David Bevan + + Add new function FT_Get_PS_Font_Private(). + + * include/freetype/internal/services/svpsinfo.h + (PS_GetFontPrivateFunc): New service function. + + * include/freetype/t1tables.h, src/base/fttype1.c + (FT_Get_PS_Font_Private): New function. + + * src/type1/t1driver.c (t1_ps_get_font_private): New function. + (t1_service_ps_info): Updated. + +2004-10-13 Werner Lemberg + + * include/freetype/config/ftstdlib.h: Include `stddef.h'. + (ft_ptrdiff_t): Define. + + * include/freetype/fttypes.h (FT_PtrDist): Use `ft_ptrdiff_t'. + + * src/cid/cidload.c (cid_parse_dict), src/type1/t1load.c + (parse_dict): Fix compiler warning. + +2004-10-11 Joshua Neal + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Check for pointer + overflow. + + * src/sfnt/ttload.c (tt_face_load_hdmx): Protect against bad input. + Don't use FT_QNEW_ARRAY but FT_NEW_ARRAY to make deallocation work + in case of failure. + + * src/sfnt/ttsbit.c (Load_SBit_Range): Check range intervals. + (tt_face_load_sbit_strikes): Allocate `strike_sbit_ranges' after + frame test. + + * src/truetype/ttgload.c (TTLoad_Simple_Glyph): Add assertion for + `flag'. + +2004-10-09 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-10-09 Boris Letocha + + Fix handling of NPUSHW if skipped in data stream. + + * src/truetype/ttinterp.c (opcode_length): Set value for NPUSHW + to -2. + (SkipCode, TT_RunIns): Use opcode_length value for computation of + bytes to be skipped. + +2004-09-10 Jouk Jansen + + * vms_make.com: Updated. + +2004-09-09 Werner Lemberg + + Adding OpenType validation module. The code is based on the + (unfinished) `otlayout' module but has been heavily modified to make + it much more compact. + + * src/otvalid/*: New module. + + * include/freetype/ftotval.h, src/base/ftotval.c, + include/freetype/internal/services/svotval.h: New files. + + * include/freetype/config/ftmodule.h: Add otv_module_class. + * include/freetype/config/ftheader.h (FT_OPENTYPE_VALIDATE_H): New + macro. + * include/freetype/internal/ftserv.h + (FT_SERVICE_OPENTYPE_VALIDATE_H): New macro. + * include/freetype/internal/fttrace.h (otvmodule, otvcommon, + otvbase, otvgdef, otvgpos, otvgsub, otvjstf): New trace components. + + * include/freetype/ftchapters.h: Updated. + + * src/base/Jamfile (Library), src/base/descrip.mms (OBJS), + src/base/rules.mk (BASE_EXT_SRC): Updated. + + * docs/CHANGES: Updated. + +2004-09-08 Werner Lemberg + + * src/tools/docmaker/sources.py (re_source_block_format2) : + Use lookahead assertion to not match `*/'. This removes spurious + insertions of `/' in the HTML output. + +2004-09-07 Werner Lemberg + + * src/truetype/ttgxvar.c (TT_Vary_Get_Glyph_Deltas): Fix call to + FT_NEW_ARRAY. + +2004-09-04 Werner Lemberg + + * include/freetype/internal/ftobjs.h: Don't include + FT_CONFIG_STANDARD_LIBRARY_H. + (FT_Validator, FT_ValidationLevel, FT_ValidatorRec, FT_VALIDATOR, + ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID, + FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT, + FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to... + + * include/freetype/internal/ftvalid.h: New file. + Make FT_INVALID return module-specific error codes. + + * include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New + macro. + + * include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if + FT_KEEP_ERR_PREFIX isn't defined. + + * src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H. + + * src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but + FT_INTERNAL_VALIDATE_H. + + * src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but + FT_INTERNAL_VALIDATE_H. + Include sferrors.h before FT_INTERNAL_VALIDATE_H. + s/FT_Err_Ok/SFNT_Err_Ok/. + + * src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX. + + * src/type1/t1afm.c: Include t1errors.h. + +2004-09-03 Werner Lemberg + + * src/base/ftdebug.c (ft_debug_init): Highest debug level is 7, + not 6. + * docs/DEBUG: Updated. + +2004-08-30 Werner Lemberg + + * include/freetype/tttags.h (TTAG_BASE, TTAG_GDEF, TTAG_GPOS, + TTAG_JSTF): New tags. + + * include/freetype/fttypes.h (FT_Bytes, FT_Tag): New typedefs. + (FT_Int): Add `signed'. + +2004-08-29 Werner Lemberg + + * src/otlayout/otlgpos.c (otl_gpos_subtable_validate): Add argument + to pass number of lookups. + Update all callers. + Don't call otl_lookup_list_validate but otl_lookup_validate. + (otl_gpos_validate): Call otl_lookup_list_validate instead of + otl_gpos_subtable_validate. + + * src/otlayout/otlgpos.h: Updated. + + * src/otlayout/otljstf.c (otl_jstf_max_validate): Add argument to + pass number of lookups. + Update all callers. + + + * src/cff/cffparse.c (cff_parse_real): s/exp/exponent/ to avoid + compiler warning. + + + * src/sfnt/ttcmap0.c, src/sfnt/ttcmap0.h: Renamed to... + * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: This. + * src/sfnt/Jamfile, src/sfnt/rules.mk, src/sfnt/sfdriver.c, + src/sfnt/sfnt.c, src/sfnt/sfobjs.c: Updated. + + + * builds/compiler/gcc-dev.mk (CFLAGS): Don't add `-Wnested-externs' + if compiler is g++ (v3.3.3 emits a warning otherwise). + +2004-08-28 Werner Lemberg + + * src/otlayout/otlgpos.c (otl_value_length): Return number of bytes, + not number of 16bit entities. + (otl_gpos_lookup2_validate): Check class definition tables for + format 2. + Fix loop for format 2. + (otl_liga_mark2_validate): Fix offset for otl_anchor_validate. + +2004-08-27 Werner Lemberg + + * src/base/ftmac.c: Don't include truetype/ttobjs.h. + Don't include type1/t1objs.h. + (FT_New_Face_From_FSSpec) [!__MWERKS__]: Remove compiler warnings. + +2004-08-27 Mathieu Malaterre + + * src/base/ftmac.c: Handle OS_INLINE for xlc compiler also. + +2004-08-27 Werner Lemberg + + * src/otlayout/otlayout.h: Add copyright. + (OTL_INVALID_OFFSET): Removed. + + * src/otlayout/otlgdef.h: Include otlayout.h. + Comment out inclusion of otltable.h. + + * src/otlayout/otlgpos.c (otl_gpos_lookup4_validate): Fix call + to otl_base_array_validate. + (otl_liga_mark2_validate): Fix `for' loop. + + * src/otlayout/otlgsub.c (otl_ligature_validate): Check `glyph_id', + not components array. + + * src/otlcommn.c (otl_lookup_get_count, otl_feature_get_count): + Comment out. + (otl_lookup_list_get_count, otl_feature_list_get_count): Activate. + (otl_feature_list_validate, otl_gsubgpos_get_lookup_count): + s/otl_lookup_get_count/otl_lookup_list_get_count/. + (otl_script_list_validate): + s/otl_feature_get_count/otl_feature_list_get_count/. + (otl_script_validate): Call otl_lang_validate for default language. + + * src/otlayout/otlcommn.h: Updated. + +2004-08-16 Werner Lemberg + + * src/otlayout/otlgpos.c (otl_gpos_lookup1_validate, + otl_gpos_lookup2_validate, otl_gpos_lookup3_validate, + otl_gpos_lookup4_validate, otl_gpos_lookup5_validate, + otl_gpos_lookup6_validate, otl_gpos_lookup9_validate, + otl_gpos_validate): Update + function arguments. + (otl_gpos_lookup7_validate, otl_gpos_lookup8_validate): Update + function arguments. + Handle NULL offsets correctly. + Check sequence and lookup indices for format 3. + (otl_pos_rule_validate, otl_chain_pos_rule_validate): Add argument + to pass lookup count. + Check sequence and glyph indices. + (otl_gpos_subtable_validate): Update function arguments. + Update callers. + + * src/otlayout/otlgpos.h: Updated. + + * src/otlayout/otlgsub.c (otl_gsub_lookup1_validate, + otl_gsub_lookup3_validate, otl_gsub_lookup8_validate): Update + function arguments. + Add glyph index checks. + (otl_sequence_validate, otl_alternate_set_validate, + otl_ligature_validate): Add argument to pass glyph count. + Update callers. + Add glyph index check. + (otl_gsub_lookup2_validate, otl_gsub_lookup4_validate): Update + function arguments. + (otl_ligature_set_validate): Add argument to pass glyph count. + Update caller. + (otl_sub_class_rule_validate, + otl_sub_class_rule_set_validate): Removed. + (otl_sub_rule_validate, otl_chain_sub_rule_validate): Add argument + to pass lookup count. + Update callers. + Add lookup index check. + (otl_sub_rule_set_validate, otl_chain_sub_rule_set_validate): Add + argument to pass lookup count. + Update callers. + (otl_gsub_lookup5_validate): Update function arguments. + Handle NULL offsets correctly. + Don't call otl_sub_class_rule_set_validate but + otl_sub_rule_set_validate. + Check sequence and lookup indices for format 3. + (otl_gsub_lookup6_validate): Update function arguments. + Handle NULL offsets correctly. + Check sequence and lookup indices for format 3. + (otl_gsub_lookup7_validate, otl_gsub_validate): Update function + arguments. + + * src/otlayout/otlgsub.h: Updated. + + * src/otlayout/otlbase.c (otl_base_validate): Handle NULL offsets + correctly. + + * src/otlayout/otlcommn.c (otl_class_definition_validate): Fix + compiler warning. + (otl_coverage_get_first, otl_coverage_get_last): New functions. + (otl_lookup_validate): Add arguments to pass lookup and glyph + counts. + Update callers. + (otl_lookup_list_validate): Add argument to pass glyph count. + Update callers. + + * src/otlayout/otlcommn.h: Updated. + + * src/otlayout/otljstf.c (otl_jstf_extender_validate, + otl_jstf_max_validate, otl_jstf_script_validate, + otl_jstf_priority_validate, otl_jstf_lang_validate): Add parameter + to validate glyph indices. + Update callers. + (otl_jstf_validate): Add parameter which specifies number of glyphs + in font. + + * src/otlayout/otljstf.h: Updated. + +2004-08-15 Werner Lemberg + + * src/otlayout/otlgpos.c (otl_liga_mark2_validate): Add parameter + to handle possible NULL values properly. + Update all callers. + +2004-08-15 Werner Lemberg + + * src/otlayout/gpos.c: Rename counting variables to be more + meaningful. + Add copyright. + (otl_liga_attach_validate): Renamed to... + (otl_liga_mark2_validate): This. + Update all callers. + (otl_mark2_array_validate): Removed. + (otl_gpos_lookup6_validate): Call otl_liga_mark2_validate, not + otl_mark2_array_validate. + (otl_pos_class_set_validate, otl_pos_class_rule_validate): Removed. + (otl_gpos_lookup7_validate): Complete code for format 2. + (otl_chain_pos_class_rule_validate, + otl_chain_pos_class_set_validate): Removed. + (otl_gpos_lookup8_validate): Don't call + otl_chain_pos_class_set_validate but + otl_chain_pos_rule_set_validate. + Simplify some code. + + * src/otlayout/otlgpos.h: Add copyright. + +2004-08-14 Werner Lemberg + + * src/otlayout/otljstf.c (otl_jstf_gsub_mods_validate): Removed. + (otl_jstf_gpos_mods_validate): Renamed to... + (otl_jstf_gsubgpos_mods_validate): This. + Test whether lookup_count is zero. + (otl_jstf_priority_validate): Use otl_jstf_gsubgpos_mods_validate. + (otl_jstf_validate): Initialize gsub_lookup_count and + gpos_lookup_count if gsub or gpos is zero. + + * src/otlayout/otlgsub.c: Rename counting variables to be more + meaningful. + Add copyright. + (otl_gsub_lookup1_validate): Simplify code. + (otl_gsub_lookup2_validate, otl_gsub_lookup3_validate, + otl_gsub_lookup4_validate, otl_gsub_lookup7_validate): Remove unused + variables. + (otl_gsub_lookup5_validate): Remove unused variable. + Fix call to otl_sub_rule_set_validate and + otl_sub_class_rule_set_validate. + (otl_chain_sub_class_rule_validate, + otl_chain_sub_class_set_validate): Removed. + (otl_gsub_lookup6_validate): Remove unused variable. + Fix call to otl_chain_sub_rule_set_validate. + (otl_gsub_lookup7_validate): Handle lookup type 8 also. + (otl_gsub_lookup8_validate: New function. + (otl_gsub_lookup1_apply, otl_gsub_lookup2_apply, + otl_gsub_lookup3_apply): Commented out. + (otl_gsub_validate_funcs): Add otl_gsub_lookup7_validate and + otl_gsub_lookup8_validate. + (otl_gsub_validate): Updated. + + * src/otlayout/otlgsub.h: Add copyright. + + * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h + (otl_coverage_get_index): Comment out. + +2004-08-13 Werner Lemberg + + * src/otlayout/otlcommn.c (otl_gsubgpos_get_lookup_count): New + function. + * src/otlayout/otlcommn.h: Updated. + + * src/otlayout/otlbase.c: Rename counting variables to be more + meaningful. + Add copyright message. + * src/otlayout/otlbase.h: Add copyright message. + + * src/otlayout/otlgdef.c: Rename counting variables to be more + meaningful. + Add copyright message. + Use OTL_CHECK everywhere. + (otl_caret_value_validate): Remove unused variable. + (otl_gdef_validate): All tables are optional. + * src/otlayout/otlgdef.h: Add copyright message. + + * src/otlayout/otljstf.c: Rename counting variables to be more + meaningful. + Add copyright message. + (otl_jstf_gsub_mods_validate, otl_jstf_gpos_mods_validate): Add + parameter to pass lookup count. + Update all callers. + Check lookup array. + (otl_jstf_max_validate): + s/otl_gpos_subtable_check/otl_gpos_subtable_validate/. + (otl_jstf_priority_validate, otl_jstf_lang_validate, + otl_jstf_script_validate): Add two parameters to pass lookup counts. + Update all callers. + (otl_jstf_validate): Add two parameters to pass GPOS and GSUB + table offsets; use otl_gsubgpos_get_lookup_count to convert extract + lookup counts. + Fix typo. + * src/otlayout/otljstf.h: Updated. + Add copyright message. + + * src/otlayout/otlgpos.c (otl_gpos_subtable_validate): New function. + (otl_gpos_validate): Use it. + * src/otlayout/otlgpos.h: Updated. + +2004-08-13 Werner Lemberg + + * src/otlayout/otcommn.c: Use OTL_CHECK everywhere. + (otl_coverage_validate): Initialize `p', + s/count/num_glyphs/. + s/start_cover/start_coverage/. + (otl_coverage_get_index): Return OTL_Long, not OTL_Int. + Remove unused variables. + (otl_class_definition_validate): s/count/num_glyphs/. + Remove unused variables. + (otl_class_definition_get_value, otl_device_table_get_start, + otl_device_table_get_end, otl_device_table_get_delta, + otl_lookup_get_table, otl_lookup_list_get_count, + otl_lookup_list_get_lookup, otl_lookup_list_get_table, + otl_feature_get_lookups, otl_feature_list_get_count, + otl_feature_list_get_feature, otl_lang_get_count, + otl_lang_get_req_feature, otl_lang_get_features): Commented out + temporarily until we really need it. + (otl_lookup_validate): Removed. + (otl_lookup_table_validate): Renamed to ... + (otl_lookup_validate): This. Update callers. + (otl_lookup_list_validate): Remove already commented out definition + and move the other definition up. + (otl_feature_validate): Add parameter to pass number of lookups. + Update callers. + Check lookup indices. + (otl_feature_list_validate): Add parameter to pass lookup table. + Update callers. + (otl_lang_validate): Add parameter to pass number of features. + Update callers. + Handle req_feature and check feature indices. + (otl_script_validate): Add parameter to pass number of features. + Update callers. + (otl_script_list_validate): Add parameter to pass feature table. + Update callers. + + * src/otlayout/otcommn.h: s/LOCALDEF/LOCAL/. + Comment out the same functions as in otcommn.c. + (otl_script_list_get_script): Removed. + + * src/otlayout/otlgsub.c (otl_gsub_lookup1_apply): Change `index' to + type OTL_Long. + (otl_gsub_lookup2_apply, otl_gsub_lookup3_apply): Change `index' to + type OTL_Long. + Fix test. + (otl_gsub_validate): Fix order of validation. + + * src/otlayout/otlgpos.c (otl_gpos_validate): Fix order of + validation. + +2004-08-12 Werner Lemberg + + Make otlayout module compile (without actually working). + + * src/otlayout/*: s/OTL_Valid/OTL_Validator/. + s/NULL/0/. + + * src/otlayout/otlayout.h: Fix various typos. + (OTL_Bool): New typedef. + (OTL_Int, OTL_Long, OTL_Int16, OTL_Int32): Use `signed' keyword. + (OTL_Err_InvalidArgument): Removed. + (OTL_Err_InvalidData, OTL_Err_InvalidSize): New enum values. + (OTL_MAKE_TAG): Add missing parenthesis. + (OTL_INVALID_DATA): Use OTL_Err_InvalidData. + (OTL_INVALID_TOO_SHORT): Use OTL_Err_InvalidSize. + (OTL_INVALID_FORMAT, OTL_INVALID_OFFSET): New macros. + + * src/otlayout/otlgpos.c: s/FT_/OTL_/. + s/OTL_Short/OTL_Int16/. + (otl_gpos_pairset_validate): Add return type. + (otl_base_array_validate): Fix call to otl_anchor_validate. + (otl_liga_array_validate): Fix call to otl_liga_attach_validate. + (otl_gpos_lookup5_validate): Fix typos. + (otl_gpos_lookup6_validate): Fix call to otl_mark2_array_validate. + (otl_gpos_lookup7_validate): Comment out unfinished code. + Fix typos. + + * src/otlayout/otlgsub.c: Add forward declaration for + otl_gsub_validate_funcs. + (otl_gsub_lookup1_apply, otl_gsub_lookup2_apply, + otl_gsub_lookup3_apply): Fix call to otl_parser_check_property. + s/otl_coverage_lookup/otl_coverage_get_index/. + (otl_ligature_validate): Add missing variable declaration. + (otl_sub_rule_validate): Fix typo. + (otl_sub_class_rule_validate): Add missing variable declaration. + Fix typo. + (otl_gsub_lookup5_validate): Fix typo. + (otl_gsub_lookup6_validate): Fix call to + otl_chain_sub_class_set_validate. + (otl_gsub_validate_funcs): Don't use `const'. + + * src/otlayout/otlcommn.c (otl_class_definition_get_value, + otl_device_table_validate, otl_device_table_get_delta, + otl_lookup_validate, otl_script_validate): Add missing + variable declarations. + (otl_lookup_list_validate): Comment out first definition. + (otl_lookup_list_foreach, otl_feature_list_foreach): Comment out. + (otl_feature_list_validate): + s/otl_feature_table_validate/otl_feature_validate/. + (otl_script_list_validate): + s/otl_script_table_validate/otl_script_validate/. + + * src/otlayout/otlcommn.h: Comment out first declaration. + (otl_lookup_list_foreach, otl_feature_list_foreach): Comment out. + + * src/otlayout/otlbase.c (otl_base_coord_validate): Fix call to + otl_device_table_validate. + (otl_base_script_validate): Add missing variable declarations. + (otl_base_script_list_validate): Fix call to + otl_base_script_validate. + (otl_axis_table_validate): Fix calls to otl_base_tag_list_validate + and otl_base_script_list_validate. + (otl_base_validate): Fix calls to otl_axis_table_validate. + + * src/otlayout/otlgdef.c (otl_attach_list_validate): Fix call to + otl_attach_point_validate. + (otl_caret_value_validate): Add missing variable declaration. + Fix call to otl_device_table_validate. + (otl_ligature_glyph_validate): Fix call to otl_caret_value_validate. + (otl_ligature_caret_list_validate): Fix call to + otl_ligature_glyph_validate. + (otl_gdef_validate): Fix calls to otl_class_definition_validate, + otl_attach_list_validate, otl_ligature_caret_list_validate, and + otl_class_definition_validate. + + * src/otlayout/otltable.h (otl_table_validate, otl_table_init, + otl_table_set_script): Comment out. + + * src/otlayout/otlparse.h (OTL_ParserRec): + s/OTL_Alternate/OTL_GSUB_Alternate/. + (OTL_ParseError): Add OTL_Err_Parser_Memory and + OTL_Err_Parser_Internal. + (otl_parser_error): Fix typo. + (otl_parser_check_property): Remove third argument. + + * src/otlayout/otlparse.c (otl_string_ensure): + s/OTL_Parse_Err_Memory/OTL_Err_Parser_Memory/. + (OTL_STRING_ENSURE, otl_parser_error, otl_parser_get_index, + otl_parser_replace_1, otl_parser_replace_n): Fix typos. + (OTL_PARSER_UNCOVERED): Removed. + (otl_parser_check_property): Remove third argument. + + * src/otlayout/otljstf.c (otl_jstf_priority_validate): Add missing + variable declaration. + + * src/otlayout/otlutils.h (OTL_MEM_REALLOC): Fix typo. + +2004-08-11 Danny + + * src/base/ftstream.c (FT_Stream_Close): Don't reset stream->close + to NULL. This allows custom close functions to delete the FT_STREAM + object. + +2004-08-11 Werner Lemberg + + Add API to get information about SFNT tables. + + * include/freetype/internal/services/svsfnt.h + (FT_SFNT_Table_Info_Func): New typedef. + (SFNT_Table): Add it. + + * src/base/ftobjs (FT_Sfnt_Table_Info): New function. + + * include/freetype/tttables.h: Updated. + + * src/sfnt/sfdriver.c (sfnt_table_info): New function. + (sfnt_service_sfnt_table): Add it. + + * docs/CHANGES: Updated. + + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. + + * builds/unix/configure.ac (version_info): Set to 9:8:3. + * builds/unix/configure: Updated. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. + + * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): + s/2.1.9/2.1.10/. + + * docs/CHANGES, docs/VERSION.DLL: Updated. + +2004-08-11 Detlef Würkner + + * src/base/ftrfork.c (FT_Raccess_Guess) + [!FT_CONFIG_OPTION_GUESSING_EMBEDDED_FORK]: Remove compiler + warnings. + +2004-08-06 Adam Piotrowski + + * src/pfr/pfrload.c (pfr_sort_kerning_pairs): Single-byte + adjustments are unsigned, not signed. + +2004-08-05 David Turner + + `Activate' gray-scale specifing hinting within the TrueType + bytecode interpreter. This is an experimental feature which + should probably be made optional. + + * src/truetype/ttgload.c (TT_Process_Simple_Glyph, + load_truetype_glyph): Move the code to set the pedantic_hinting flag + to... + (TT_Load_Glyph): Here. + Set `grayscale' flag except for `FT_LOAD_TARGET_MONO'. + + * src/truetyep/ttinterp.c (Ins_GETINFO): Return MS rasterizer + version 1.7. + Return rotation and stretching info only if glyph is rotated or + stretched, respectively. + Handle grayscale info. + + * src/truetype/ttinterp.h (TT_ExecContextRec): Add `grayscale' + member. + +2004-08-02 George Williams + + * src/base/ftobjs.c (FT_Attach_File): Initialize `open.stream'. + +2004-08-01 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-08-01 George Williams + + FreeType now can read kerning values from PFM files. + + * src/type1/t1afm.c (T1_Done_AFM): Renamed to... + (T1_Done_Metrics): This. + Update all callers. + (T1_Read_AFM): Make it static. + Don't enter and leave a frame. + (LITTLE_ENDIAN_USHORT, LITTLE_ENDIAN_UINT): New macros. + (T1_Read_PFM): New function. + (T1_Read_Metrics): New higher-level function to be used instead of + T1Read_AFM. + Update all callers. + +2004-07-31 Werner Lemberg + + * src/pcf/pcfread (pcf_load_font), src/bdf/bdfdrivr.c + (BDF_Face_Init), src/truetype/ttgxvar (TT_Get_MM_Var, + tt_face_vary_cvt): Fix compiler warnings. + +2004-07-26 Søren Sandmann + + * src/pcf/pcfread.c (pcf_interpret_style): Always allocate memory for + face->style_name. + * src/pcf/pcfdrivr.c (PCF_Face_Done): Free `style_name'. + +2004-07-26 Darren J Longhorn + + * include/freetype/config/ftconfig.h (FT_SIZEOF_LONG): Recognize + five-byte `long' (which is avoided then). + +2004-07-25 Detlef Würkner + + * src/pcf/pcfdrivr.c (PCF_Set_Pixel_Size): Compare heights, not + ppem values. + (PCF_Set_Point_Size): Don't call PCF_Set_Pixel_Size but provide own + code to compare ppem values. + * src/bdf/bdfdrivr.c (BDF_Set_Pixel_Size): Compare heights, not + ppem values. + (BDF_Set_Point_Size): Don't call BDF_Set_Pixel_Size but provide own + code to compare ppem values. + +2004-07-25 Kornfeld Eliyahu Peter + + * src/sfnt/sfobjs.c (sfnt_load_face): Handle + TT_NAME_ID_PREFERRED_FAMILY and TT_NAME_ID_PREFERRED_SUBFAMILY. + +2004-07-24 Derek B. Noonburg + + * src/cff/cffload.c (cff_font_load): Always create inverse mapping. + Even if the charstring count is the same as the CID count, it is + still possible that the font uses a different CID -> GID mapping. + +2004-07-23 Werner Lemberg + + * src/truetype/ttobjs.c (tt_face_init): Accept 0x00020000 format tag + found in some Arphic fonts made for Chinese version of Windows 3.1. + +2004-07-17 David Turner + + Fixed a dangling pointer bug in the cache code that happened in very + rare cases, i.e., when a new family object was destroyed by an + out-of-memory condition during a glyph node initialization. The + function FTC_Cache_Lookup would flush the cache and restart the + lookup with a bad pointer. + + * include/freetype/cache/ftcglyph.h (FTC_FAMILY_TREE): New macro. + (FTC_GCACHE_LOOKUP_CMP): Use it. + Handle reference count in `num_nodes' correctly. + + * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily): Use + FTC_FAMILY_FREE. + (FTC_GCache_Lookup): Handle reference count in `num_nodes' correctly. + + * src/cache/ftcmanag.c (FTC_Manager_FlushN): Fixed a cache flushing + bug. + + * src/truetype/ttinterp.c (Normalize): Fixed a bug that caused + long and unnecessary delays while normalizing huge vectors. + +2004-07-15 Werner Lemberg + + * docs/CHANGES: Updated. + + * src/base/ftstroke.c (FT_Stroker_ParseOutline): Fix compiler + warning. + +2004-07-15 David Turner + + * src/base/ftstroke.c (FT_Stroker_ParseOutline): Single points + are not stroked, preventing a bug with pala.ttf and other + fonts. + + * include/freetype/ftstroke.h: Updating documentation comments. + +2004-07-13 Werner Lemberg + + * src/base/ftstroke.c (ft_stroke_border_reverse): Removed. Unused. + +2004-07-12 David Turner + + * src/base/ftstroke.c (ft_stroke_border_close): Add second parameter + to indicate reversion of points. + Update all callers. + (ft_stroke_border_reverse): Fix initialization of `point1' and + `tag1'. + + * src/cache/ftcsbits.c (ftc_snode_load): Fixing advance computation + for transformed glyphs. + +2004-07-11 David Turner + + Fix bugs that prevented the stroker to correctly generate stroked + paths from closed paths, i.e., nearly all glyphs in vectorial fonts. + + The code is still _very_ buggy though; treat with special care. + + * src/base/ftstroke.c (FT_STROKE_TAG_BEGIN_END): New macro. + (ft_stroke_border_reverse): New function. + (ft_stroker_inside): Remove local variable `sigma'; use different + threshold. + (ft_stroker_add_reverse_left): Switch begin/end tags if necessary. + (FT_Stroker_EndSubPath): Call ft_stroker_inside and + ft_stroke_border_reverse. + +2004-06-26 Peter Kovar + + * src/truetype/ttgload.c (load_truetype_glyph): Fix typo. + +2004-06-25 Werner Lemberg + + * src/type1/t1afm.c (afm_atoindex): Fix boundary test. Reported + by Dirck Blaskey. + +2004-06-24 David Turner + + + * Version 2.1.9 released. + ========================= + + + * src/truetype/ttgload.c, src/truetype/ttxgvar.c: Removing + compiler warnings. + +2004-06-23 Werner Lemberg + + * include/freetype/internal/ftmemory.h [FT_DEBUG_MEMORY]: Declare + FT_QAlloc_Debug and FT_QRealloc_Debug. + + * src/base/ftutil.c (FT_QAlloc): Fix error and debug messages. + (FT_QRealloc): Call FT_QAlloc if original pointer is NULL. + Fix error message. + +2004-06-23 David Turner + + * include/freetype/internal/ftmemory.h, src/base/ftutil.c + (FT_QAlloc, FT_QRealloc), src/base/ftdbgmem.c (FT_QAlloc_Debug, + FT_QRealloc_Debug): New functions that perform allocation without + zero-ing out the corresponding blocks. + + * include/freetype/internal/ftmemory.h (FT_MEM_QALLOC, + FT_MEM_QREALLOC, FT_MEM_QNEW, FT_MEM_QNEW_ARRAY, + FT_MEM_QRENEW_ARRAY, FT_QALLOC, FT_QREALLOC, FT_QNEW, FT_QNEW_ARRAY, + FT_QRENEW_ARRAY): New macros. + + * src/base/ftstream.c (FT_Stream_EnterFrame): Use FT_QALLOC. + * src/gzip/ftgzip.c (FT_Stream_OpenGzip): Use FT_QNEW_ARRAY. + * src/sfnt/sfobjs.c (tt_face_get_name): Use FT_QNEW_ARRAY. + + * src/sfnt/ttload.c (tt_face_load_directory, tt_face_load_metrics, + tt_face_load_gasp): Use FT_QNEW_ARRAY. + (tt_face_load_kern): Use FT_QNEW_ARRAY. + Small optimization in the kerning table verifier; this speeds up + TrueType face opening by about 7%. + (tt_face_load_hdmx): Use FT_QNEW_ARRAY and FT_QALLOC. + + * include/freetype/config/ftmodule.h: Changed the order of modules, + putting TrueType and Type 1 first. This dramatically improves the + performance of face open/close operations. For example, putting the + TrueType driver first in the list results in a 5x speedup when + opening `Vera.ttf'. + + The very problem is that both the PCF and BDF drivers do a lot more + than necessary to detect that they cannot handle a font file. + +2004-06-22 Werner Lemberg + + * src/pcf/pcfread.c (pcf_read_TOC, pcf_get_properties, + pcf_get_metrics, pcf_get_bitmaps, pcf_get_encodings): Improve + debugging messages. + + * src/pcf/pcfdrivr.c (FT_COMPOMENT): Move up. + (PCF_Face_Init): Simplify code. + + * src/bdf/bdfdrivr.h (BDF_FaceRec): New element `default_glyph'. + + * src/bdf/bdflib.c (_bdf_add_property, _bdf_parse_start), + src/bdf/bdf.h (bdf_font_t): s/default_glyph/default_char/. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Fix number of glyphs. + Set `default_glyph'. + (BDF_Glyph_Load): Use `default_glyph' for undefined glyph. + + * docs/CHANGES: Updated. + +2004-06-21 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-06-21 David Turner + + * src/truetype/ttgload.c (TT_Process_Simple_Glyph, + load_truetype_glyph): Don't access (unrounded) + `TT_Size.root.metrics' but (rounded) `TT_Size.metrics'. This fixes + a scaling bug that caused incorrect rendering when the bytecode + interpreter was enabled. + +2004-06-14 Huw D M Davies + + * src/winfonts/winfnt.c (FNT_Face_Init): Set x_ppem and y_ppem + based on pixel_width and pixel_height. + (FNT_Size_Set_Pixels): Updated. + +2004-06-14 Werner Lemberg + + * src/lzw/zopen.c: Comment out inclusion of signal.h and unistd.h. + Reported by Hyvärinen Jyrki Juhani. + +2004-06-11 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-06-10 David Turner + + * src/base/ftobject.c, src/base/fthash.c, src/base/ftexcept.c, + src/base/ftsysio.c, src/base/ftsysmem.c, src/base/ftlist.c: Removed. + Obsolete. + + * src/raster/ftraster.c (Alignment, PAlignment): New union to fix + problems with 64bit systems. + (AlignProfileSize): Use it. + +2004-06-08 David Turner + + * include/freetype/freetype.h (FT_GlyphMetrics): Move `lsb_delta' + and `rsb_delta' elements to... + (FT_GlyphSlotRec): Here to retain binary compatibility with older + FreeType versions. + Update all users. + + * src/sfnt/sfobjs.c (tt_face_get_name): Remove compiler warning. + + * src/winfonts/winfnt.c (FNT_Load_Glyph): Add missing initialization + of slot->metrics.width and slot->metrics.height when loading a + Windows FNT glyph. Thanks to Huw Davies. + + * include/freetype/cache/ftcmru.h (FTC_MruNode_CompareFunc): Change + return type to FT_Bool. + + * src/cache/ftbasic.c (ftc_basic_family_compare): Change return + type to FT_Bool. + + * src/cache/ftccache.c (FTC_Cache_Init, ftc_cache_init): Make + the former call the latter, not vice versa. + (FTC_Cache_Done, ftc_cache_done): Ditto. + + * src/cache/ftcglyph.c (FTC_GNode_Compare, ftc_gnode_compare): Make + the former call the latter, not vice versa. + (FTC_GCache_Init, ftc_gcache_init): Ditto. + (FTC_GCache_Done, ftc_gcache_done): Ditto. + + * src/cache/ftcimage.c (FTC_INode_Free, ftc_inode_free): Make the + former call the latter, not vice versa. + (FTC_INode_Weight, ftc_inode_weight): Ditto. + + * src/cache/ftcmanag.c (ftc_size_node_compare, + ftc_size_node_compare_faceid, ftc_face_node_compare): Change return + type to FT_Bool. + + * src/cache/ftcsbits.c (FTC_SNode_Free, ftc_snode_free): Make the + former call the latter, not vice versa. + (FTC_SNode_Weight, ftc_snode_weight): Ditto. + (FTC_SNode_Compare, ftc_snode_compare): Ditto. + + * src/cache/ftcsbits.c: Fix some bugs and inefficiencies in the cache + sub-system. + +2004-06-05 Werner Lemberg + + * src/autofit/afloader.c (af_loader_load_g): Set `lsb_delta' and + `rsb_delta' in slot->metrics and tune side bearings slightly. + +2004-06-04 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-06-04 David Chester + + Improve inter-letter spacing for autohinted glyphs. + + * include/freetype/freetype.h (FT_Glyph_Metrics): Add elements + `lsb_delta' and `rsb_delta'. + + * src/autohint/ahhint.c (ah_hinter_load): Set `lsb_delta' and + `rsb_delta' in slot->metrics and tune side bearings slightly. + +2004-06-04 David Turner + + * src/autofit/*: Important fixes to the auto-fitter. The output + now seems to be 100% equivalent to the auto-hinter, while being + about 2% faster (which proves that script-specific algorithm + selection isn't a performance problem). + + To test it, change `autohint' to `autofit' in + and recompile. + + A few more testing is needed before making this the official + auto-hinting module. + +2004-06-02 Werner Lemberg + + * src/truetype/ttgload.c (compute_glyph_metrics): Fix compiler + warnings. + +2004-06-01 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): Make sure that an English + name record for the Apple platform is preferred to a non-English + entry for the Microsoft platform. Problem reported by HANDA + Ken'ichi. + +2004-05-19 George Williams + + * src/type1/t1load.c (mm_axis_unmap, mm_weights_unmap): New + auxiliary functions. + (T1_Get_MM_Var): Provide axis tags. + Use mm_axis_unmap and mm_weights_unmap to provide default values + for design and normalized axis coordinates. + + * include/freetype/t1tables.h (PS_DesignMapRec): Change type of + `design_points' to FT_Long. + Update all users. + +2004-05-17 Werner Lemberg + + * src/base/ftbbox.c (BBox_Conic_Check): Fix boundary cases. + Reported by Mikey Anbary . + +2004-05-15 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_done_face): Free face->postscript_name. + +2004-05-15 George Williams + + * src/sfnt/ttload.c (tt_face_load_max_profile): Always set + face->root.num_glyphs. + +2004-05-14 Masatake YAMATO + George Williams + + * src/sfnt/ttload.c (sfnt_dir_check): Handle `bhed' properly. + +2004-05-14 Werner Lemberg + + * src/cache/ftcbasic.c (ftc_basic_family_compare, + ftc_basic_family_init, ftc_basic_family_get_count, + ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph, + ftc_basic_gnode_compare_faceid): Adjust parameters and return types + to prototypes given in header files from include/freetype/cache. + Use casts to proper types locally. + (ftc_basic_image_family_class, ftc_basic_image_cache_class, + ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): Remove + casts. + + * src/cache/ftccback.h: Adjust parameters and return types to + prototypes given in header files from include/freetype/cache. + + * src/cache/ftcimage.c (ftc_inode_free, ftc_inode_new, + ftc_inode_weight): Adjust parameters and return types to prototypes + given in header files from include/freetype/cache. Use casts to + proper types locally. + + * src/cache/ftcsbits.c (ftc_snode_free, ftc_snode_new, + ftc_snode_weight, ftc_snode_compare): Adjust parameters and return + types to prototypes given in header files from + include/freetype/cache. Use casts to proper types locally. + + * src/cache/ftccmap.c (ftc_cmap_node_free, ftc_cmap_node_new, + ftc_cmap_node_weight, ftc_cmap_node_compare, + ftc_cmap_node_remove_faceid): Adjust parameters and return types to + prototypes given in header files from include/freetype/cache. Use + casts to proper types locally. + (ftc_cmap_cache_class): Remove casts. + + * src/cache/ftcglyph.c (ftc_gnode_compare, ftc_gcache_init, + ftc_gcache_done): Adjust parameters and return types to prototypes + given in header files from include/freetype/cache. Use casts to + proper types locally. + + * src/cache/ftcmanag.c (ftc_size_node_done, ftc_size_node_compare, + ftc_size_node_init, ftc_size_node_reset, + ftc_size_node_compare_faceid, ftc_face_node_init, + ftc_face_node_done, ftc_face_node_compare: Adjust parameters and + return types to prototypes given in header files from + include/freetype/cache. Use casts to proper types locally. + + (ftc_size_list_class, ftc_face_list_class): Remove casts. + +2004-05-13 Werner Lemberg + + * src/autohint/ahmodule.c (ft_autohinter_init, ft_autohinter_done): + Use FT_Module as parameter and do a cast to FT_AutoHinter locally. + (autohint_module_class): Remove casts. + + * src/base/ftglyph.c (ft_bitmap_glyph_init, ft_bitmap_glyph_copy, + ft_bitmap_glyph_done, ft_bitmap_glyph_bbox, ft_outline_glyph_init, + ft_outline_glyph_done, ft_outline_glyph_copy, + ft_outline_glyph_transform, ft_outline_glyph_bbox, + ft_outline_glyph_prepare): Use FT_Glyph as parameter and do a cast + to FT_XXXGlyph locally. + Use FT_CALLBACK_DEF throughout. + (ft_bitmap_glyph_class, ft_outline_glyph_class): Remove casts. + + * src/bdf/bdfdrivr.c (bdf_cmap_init, bdf_cmap_done, + bdf_cmap_char_index, bdf_cmap_char_next): Use FT_CMap as parameter + and do a cast to BDF_CMap locally. + (bdf_cmap_class): Remove casts. + +2004-05-12 Werner Lemberg + + * src/cff/cffgload.h (CFF_Builder): Remove `error'. + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Replace + `Memory_Error' with `Fail' und update all users. + +2004-05-11 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_ParseState): New + enumeration. + (T1_BuilderRec): Replace `path_begun' with `parse_state'. + Remove `error'. + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Replace + `Memory_Error' with `Fail' and update all users. + Don't use `builder->error'. + Replace `path_begun' with `parse_state' and check parsing states. + + * src/psaux/psobjs.c (t1_builder_init, t1_builder_start_point): + Replace `path_begun' with `parse_state' and check parsing states. + +2004-05-10 George Williams + + * src/truetype/ttxgvar.c (ft_var_load_avar): Do free arrays in case + of error -- `avar' is optional so we can't rely on tt_done_blend + being called automatically. + +2004-05-09 George Williams + + * src/truetype/ttxgvar.c (ft_var_load_avar, ft_var_load_gvar): Fix + error handling. + +2004-05-07 Werner Lemberg + + * src/pfr/pfrobjs.c, src/pfr/pfrobjs.h (pfr_face_init, + pfr_face_done, pfr_face_get_kerning, pfr_slot_init, pfr_slot_done, + pfr_slot_load): Don't use PFR_XXX but FT_XXX arguments which are + typecast to the proper PFR_XXX types within the function. + Update code accordingly. + + * src/pfr/pfrdrivr.c (pfr_get_kerning, pfr_get_advance, + pfr_get_metrics, pfr_get_service): Don't use PFR_XXX but FT_XXX + arguments which are typecast to the proper PFR_XXX types within the + function. + Update code accordingly. + Use FT_CALLBACK_DEF throughout. + (pfr_metrics_service_rec, pfr_driver_class): Remove casts. + +2004-05-06 Masatake YAMATO + + * src/truetype/ttgxvar.c (ft_var_load_gvar): Use FT_FACE_STREAM. + (*): Rename local variable OffsetToData to offsetToData. + +2004-05-06 Werner Lemberg + + * src/cff/cffobjs.c (cff_size_done, cff_size_init, cff_size_reset, + cff_slot_done, cff_slot_init, cff_face_init, cff_face_done): Access + root fields directly. + * src/cff/cffdrivr.c (Load_Glyph): Access root fields directly. + + * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Save current + frame before calling TT_Vary_Get_Glyph_Deltas. + + * src/pcf/pcfdrivr.c (PCF_CMapRec): Rename `cmap' to `root' for + consistency. + (pcf_cmap_init, pcf_cmap_done, pcf_cmap_char_index, + pcf_cmap_char_next): Don't use PCF_XXX but FT_XXX arguments which + are typecast to the proper PCF_XXX types within the function. + Update code accordingly. + (pcf_cmap_class): Remove casts. + (PCF_Face_Done, PCF_Face_Init, PCF_Set_Pixel_Size): Don't use + PCF_XXX but FT_XXX arguments which are typecast to the proper + PCF_XXX types within the function. + Update code accordingly. + Use FT_CALLBACK_DEF throughout. + (PCF_Set_Point_Size): New wrapper function. + (PCF_Glyph_Load, pcf_driver_requester): Use FT_CALLBACK_DEF. + (pcf_driver_class): Remove casts. + +2004-05-04 Steve Hartwell + + * src/truetype/ttobjs.c (tt_driver_done): Fix typo. + +2004-05-04 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Done, BDF_Face_Init, + BDF_Set_Pixel_Size): Don't use BDF_XXX but FT_XXX arguments which + are typecast to the proper BDF_XXX types within the function. + Update code accordingly. + Use FT_CALLBACK_DEF throughout. + (BDF_Set_Point_Size): New wrapper function. + (bdf_driver_class): Remove casts. + + * src/cff/cffdrivr.c (Get_Kerning, Load_Glyph, cff_get_interface): + Don't use CFF_XXX but FT_XXX arguments which are typecast to the + proper CFF_XXX types within the function. + Update code accordingly. + Use FT_CALLBACK_DEF throughout. + (cff_driver_class): Remove casts. + + * src/cff/cffobjs.h, src/cff/cffobjs.c (cff_size_done, + cff_size_init, cff_size_reset, cff_slot_done, cff_slot_init, + cff_face_init, cff_face_done, cff_driver_init, cff_driver_done): + Don't use CFF_XXX but FT_XXX arguments which are typecast to the + proper CFF_XXX types within the function. + Update code accordingly. + (cff_point_size_reset): New wrapper function. + + * src/cid/cidobjs.h, src/cid/cidobjs.c (cid_slot_done, + cid_slot_init, cid_size_done, cid_size_init, cid_size_reset, + cid_face_done, cid_face_init, cid_driver_init, cid_driver_done): + Don't use CID_XXX but FT_XXX arguments which are typecast to the + proper CID_XXX types within the function. + Update code accordingly. + (cid_point_size_reset): New wrapper function. + + * src/cid/cidgload.c, src/cid/cidgload.h (cid_slot_load_glyph): + Don't use CID_XXX but FT_XXX arguments which are typecast to the + proper CID_XXX types within the function. + Update code accordingly. + + * src/cid/cidriver.c (cid_get_interface): + Don't use CID_XXX but FT_XXX arguments which are typecast to the + proper CID_XXX types within the function. + Update code accordingly. + Use FT_CALLBACK_DEF. + (t1cid_driver_class): Remove casts. + + * src/truetype/ttdriver.c (tt_get_interface): Use FT_CALLBACK_DEF. + * src/truetype/ttgxvar.c (ft_var_load_avar): Don't free non-local + variables (this is done later). + (ft_var_load_avar): Fix call to FT_FRAME_ENTER. + (TT_Get_MM_Var): Fix size for `fvar_fields'. + (TT_Vary_Get_Glyph_Deltas): Handle deallocation of local variables + correctly. + + * src/base/ftdbgmem.c (ft_mem_debug_realloc): Don't abort if + current size is zero. + +2004-05-03 Steve Hartwell + + * src/truetype/ttobjs.h, src/truetype/ttobjs.c (tt_face_init, + tt_face_done, tt_size_init, tt_size_done, tt_driver_init, + tt_driver_done): Don't use TT_XXX but FT_XXX arguments which are + typecast to the proper TT_XXX types within the function. + Update code accordingly. + + * src/truetype/ttdriver.c (Get_Kerning, Set_Char_Sizes, + Set_Pixel_Sizes, Load_Glyph, tt_get_interface): Don't use TT_XXX but + FT_XXX arguments which are typecast to the proper TT_XXX types + within the function. + Update code accordingly. + (tt_driver_class): Remove casts. + +2004-05-02 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_free_names): Check that `table->names' + is not NULL. Reported by Gordon Childs . + +2004-04-29 Werner Lemberg + + * docs/formats.txt: Add more information on PFR format. + +2004-04-28 Werner Lemberg + + * docs/formats.txt: New file. + * docs/CHANGES: Updated. + +2004-04-28 Masatake YAMATO + + * include/freetype/internal/tttypes.h (GX_BlendRec_) + [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Fix a typo. + + * src/truetype/ttgxvar.h (GX_BlendRec_): Fix a typo. + +2004-04-27 Masatake YAMATO + + * src/truetype/ttgxvar.h: Use FT_LOCAL instead of FT_LOCAL_DEF + for function declarations. + +2004-04-25 George Williams + + * src/truetype/ttgxvar.c (ft_var_apply_tuple): Fix typo. + +2004-04-25 Werner Lemberg + + * src/truetype/Jamfile, docs/CHANGES: Updated. + +2004-04-24 Werner Lemberg + + * src/pcf/pcfdrivr.c: Revert change from 2004-04-17. + * src/pcf/pcfutil.c: Use FT_LOCAL_DEF. + * src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H. + Use FT_BEGIN_HEADER and FT_END_HEADER. + Use FT_LOCAL. + +2004-04-24 George Williams + + Add support for Apple's distortable font technology (in GX fonts). + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro. + + * include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style, + FT_MM_Var): New structures. + (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates, + FT_Set_Var_Blend_Coordinates): New function declarations. + + * include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func, + FT_Set_Var_Design_Func): New typedefs. + Update MultiMasters service. + + * include/freetype/internal/tttypes.h + [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H. + (GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef. + (TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend' + and `blend'. + + * include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New + macros. + + * include/freetype/internal/fttrace.h: Add `ttgxvar'. + + * src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates, + FT_Set_Var_Blend_Coordinates): New functions. + + * src/sfnt/sfobjs.c (sfnt_load_face) + [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS + flag for GX var fonts. + + * src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files. + + * src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + ttgxvar.c. + + * src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h. + (tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: + New service. + (tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated. + + * src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + ttgxvar.h. + (TT_Process_Simple_Glyph, load_truetype_glyph) + [TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts. + + * src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + ttgxvar.h. + (tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call + tt_done_blend. + + * src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + ttgxvar.h. + (tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call + tt_face_vary_cvt. + + * src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c. + + * src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var + and T1_Set_Var_Design. + + * src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros. + (T1_Get_MM_Var, T1_Set_Var_Design): New functions. + + * src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New + function declarations. + +2004-04-23 Werner Lemberg + + * include/freetype/ftcache.h (FT_Get_CharMap_Index): Rename + declaration and move to... + * include/freetype/freetype.h (FT_Get_Charmap_Index): Here. + (FREETYPE_PATCH): Set to 9. + + * src/base/ftobjs.c (FT_Get_Charmap_Index): New function. + + * builds/unix/configure.ac (version_info): Set to 9:7:3. + * builds/unix/configure: Updated. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/218/219/. + + * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): + s/2.1.8/2.1.9/. + + * docs/CHANGES, docs/VERSION.DLL: Updated. + +2004-04-21 Werner Lemberg + + * src/cff/cffparse.c (cff_parser_run), src/psaux/psobjs.c + (ps_parser_load_field): Use FT_CHAR_BIT. + +2004-04-21 David Turner + + + * Version 2.1.8 released. + ========================= + + + * src/cff/cffobjs.c (cff_face_init): Fix a small memory leak. + + * src/autofit/afloader.c (af_loader_load_g), src/autofit/afmodule.c + (af_autofitter_load_glyph), src/base/ftdebug.c (FT_Trace_Get_Name): + Remove compiler warnings. + + * src/autofit/aftypes.h: Undefine AF_DEBUG. + + * src/lzw/zopen.c (rmask), src/pcf/pcfdrivr.c (pcf_service_bdf, + pcf_services), src/pcf/pcfread.c (tableNames), src/psaux/psobjs.c + (ft_char_table), src/type42/t42drivr.c (t42_service_glyph_dict, + t42_service_ps_font_name): Decorate data arrays with `const' to + avoid populating the `.data' segment. + + * src/lzw/Jamfile: New file. + +2004-04-20 Werner Lemberg + + * src/psaux/psobjs.c (T1Radix): Renamed to... + (ps_radix): This. + Update current cursor position. + + * docs/CHANGES: Updated. + +2004-04-18 Werner Lemberg + + * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph), + src/ttdriver.c (Load_Glyph): Change type of `glyph_index' to + FT_UInt. From Lex Warners. + +2004-04-17 Chisato Yamauchi + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Really fix change + from 2004-03-19. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Use `ft_strlen'. + + * src/pcf/pcfutil.c, src/pcf/pcfutil.h: Decorate functions with + `static'. + Remove unused function `RepadBitmap'. + * src/pcf/pcfdrivr.c: Don't include pcfutil.h. + +2004-04-16 Werner Lemberg + + * builds/unix/freetype-config.in (usage): Fix and improve usage + information. + +2004-04-15 Werner Lemberg + + * builds/unix/ftconfig.in, builds/vms/ftconfig.h: Define + FT_CHAR_BIT. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't apply autohinting if + glyph is vertically distorted or mirrored. + + * src/cff/cffgload.c (cff_slot_load): Handle zero `size' properly + for embedded bitmaps. + + * docs/CHANGES: Updated. + +2004-04-15 bytesoftware + + * include/freetype/config/ftconfig.h, src/base/ftstream.c + (FT_Stream_ReadFields): More fixes using FT_CHAR_BIT. + +2004-04-14 Werner Lemberg + + * include/freetype/config/ftconfig.h (FT_CHAR_BIT): New macro. + +2004-04-14 Alex Strelnikov + + * src/cache/ftcsbits.c (ftc_snode_load): Initialize `*asize' in case + of error. + +2004-04-14 Werner Lemberg + + * src/base/ftmac.c [__GNUC__]: Define OS_INLINE. + * builds/unix/configure.ac: Don't try to remove `-ansi' compilation + switch on the Mac. + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.6. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + +2004-04-13 Werner Lemberg + + * include/freetype/config/ftconfig.h: Use CHAR_BIT to define + size of FT_SIZEOF_xxx. + +2004-04-12 Chisato Yamauchi + + * include/freetype/internal/sfnt.h (TT_Find_SBit_Image_Func, + TT_Load_SBit_Metrics_Func): New typedefs. + (SFNT_Interface): Add find_sbit_image and load_sbit_metrics. + + * src/sfnt/sfdriver.c (sfnt_interface): Updated. + * src/sfnt/ttsbit.h (tt_find_sbit_image, tt_load_sbit_metrics): New + declarations. + * src/sfnt/ttsbit.c (find_sbit_image): Renamed to... + (tt_find_sbit_image): This. + Updated all callers. + (load_sbit_metrics): Renamed to... + (tt_load_sbit_metrics): This. + Updated all callers. + +2004-04-12 Werner Lemberg + + * configure: Accept makepp also. + + * builds/unix/detect.mk: Use proper path to unix-def.mk. + * builds/unix/unix-def.in (BUILD_DIR, PLATFORM): Remove. + * builds/unix/unix.mk (BUILD_DIR, PLATFORM): Define. + Use BUILD_DIR. + + * docs/INSTALL, docs/INSTALL.GNU, docs/INSTALL.UNX: Update + documentation on makepp. + +2004-04-11 Werner Lemberg + + * src/lzw/zopen.c: Don't include sys/param.h and sys/stat.h. + +2004-04-10 Werner Lemberg + + * src/lzw/ftlzw.c: Include zopen.h dependent on + FT_CONFIG_OPTION_USE_LZW. + + * src/base/ftdebug.c: s/index/idx/ to avoid compiler warnings. + +2004-04-02 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.2. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + +2004-04-01 Werner Lemberg + + * builds/unix/ft-munmap.m4 (FT_MUNMAP_PARAM): Fix arguments of + AC_COMPILE_IFELSE. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at subversions.gnu.org. + * builds/freetype.mk (refdoc): Updated. + +2004-03-31 Werner Lemberg + + Handle broken FNT files which don't have a trailing NULL byte + in the face name string. + + * src/winfonts/winfnt.h (FNT_FontRec): New member `family_name'. + * src/winfonts/winfnt.c (fnt_font_done): Free font->family_name. + (FNT_Face_Init): Append a final zero byte to the font face name. + +2004-03-30 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from + 2004-03-19. + +2004-03-27 Werner Lemberg + + * src/base/descrip.mms (OBJS): Add ftbbox.obj. + +2004-03-26 George Williams + + Add vertical phantom points. + + * include/freetype/internal/tttypes.h (TT_LoaderRec): Add + `top_bearing', `vadvance', `pp3', and `pp4'. + + * src/autofit/afloader.c (af_loader_load_g): Handle two more points. + + * src/autohint/ahhint.c (ah_hinter_load): Handle two more points. + * src/truetype/ttgload.c (Get_VMetrics): New function. + (TT_Load_Simple_Glyph, TT_Process_Simple_Glyph): Handle two more + points. + (load_truetype_glyph): Use Get_VMetrics. + Handle two more points. + (compute_glyph_metrics): Thanks to vertical phantom points we now + can always compute `advance_height' and `top_bearing'. + * src/truetype/ttobjs.h (TT_SubglyphRec): Add vertical phantom + points. + + + * src/autohint/ahglyph.c (ah_outline_load): Fix allocation of + `news'. + +2004-03-21 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Fix left side bearing. + +2004-03-20 Steve Hartwell + + * src/cache/ftcmru.c (FTC_MruList_RemoveSelection): Handle a NULL + value for `selection' as `select all'. + +2004-03-19 Steve Hartwell + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Reject face_index + values > 0 if loading non-TTC fonts. + + * src/base/ftmac.c (open_face_from_buffer): Set positive face_index + to zero before calling FT_Open_Face. + + * docs/CHANGES: Updated. + +2004-03-04 Werner Lemberg + + * Jamfile, vms_make.com, builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype/vcproj, include/freetype/ftmoderr.h: + Add LZW module. + + * Jamfile.in: Removed. + + * docs/CHANGES: Updated. + + * include/freetype/internal/ftobjs.h: s/MIN/FT_MIN/, s/MAX/FT_MAX/, + s/ABS/FT_ABS/. Updated all callers. + + * src/type1/t1load.c (parse_dict), src/pcf/pcfdrivr.c + (PCF_Face_Init): Use FT_ERROR_BASE. + +2004-03-04 Albert Chin + + Add support for PCF fonts compressed with LZW (extension .pcf.Z, + created with `compress'). + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_USE_LZW): New macro. + + * include/freetype/ftlzw.h: New file. + * include/freetype/config/ftheader.h (FT_LZW_H): New macro for + ftlzw.h. + + * src/lzw/*: New files. + + * src/pcf/pcfdrivr.c: Include FT_LZW_H. + (PCF_Face_Init): Try LZW also. + + * src/gzip/ftgzip.c: s/0/Gzip_Err_Ok/ where appropriate. + Beautify. + +2004-03-03 Werner Lemberg + + * src/pshinter/pshalgo.c (psh_hint_table_init): Simplify code. + +2004-03-02 Werner Lemberg + + Add embedded bitmap support to CFF driver. + + * src/cff/cffobjs.h (CFF_SizeRec): New structure. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_slot_load): Updated. + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Load sbit. + + * src/cff/cffobjs.c (sbit_size_reset) + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: New function. + (cff_size_get_globals_funcs, cff_size_done, cff_size_init): Updated. + (cff_size_reset): Updated. + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Call sbit_size_reset. + + * src/cff/cffdrivr.c (Load_Glyph): Updated. + (cff_driver_class): Use CFF_SizeRec. + + * docs/CHANGES: Updated. + +2004-03-01 Werner Lemberg + + * src/pshinter/pshglob.c (psh_globals_scale_widths): Don't use + FT_RoundFix but FT_PIX_ROUND. + (psh_blues_snap_stem): Don't use blue_shift but blue_threshold. + + * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD_MAXIMUM): New macro. + (psh_glyph_find_string_points): Use PSH_STRONG_THRESHOLD_MAXIMUM. + (psh_glyph_find_blue_points): New function. Needed for fonts like + p052003l.pfb (URW Palladio L Roman) which have flex curves at the + base line within blue zones, but the flex curves aren't covered by + hints. + (ps_hints_apply): Use psh_glyph_find_blue_points. + +2004-02-27 Garrick Meeker + + * builds/unix/configure.ac: Fix compiler flags for + `--with-old-mac-fonts'. + * builds/unix/configure: Regenerated. + + * src/base/ftmac.c: s/TARGET_API_MAC_CARBON/!TARGET_API_MAC_OS8/. + (FT_New_Face_From_Resource): New function. + (FT_New_Face): Use FT_New_Face_From_Resource. + (FT_New_Face_From_FSSpec): Use FT_New_Face_From_Resource. + [__MWERKS__]: Don't include FSp_fopen.h. + +2004-02-26 Werner Lemberg + + * src/pshinter/pshglob.c (psh_globals_new): Fix value of + `dim->stdw.count'. + Don't assign default values to blue scale and blue shift. + +2004-02-25 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-02-25 Garrick Meeker + Steve Hartwell + + Improve MacOS fond support. Provide a new API + `FT_New_Face_From_FSSpec' similar to `FT_New_Face'. + + * src/base/ftmac.c [__MWERKS__]: Include FSp_fpopen.h. + STREAM_FILE [__MWERKS__]: New macro. + (ft_FSp_stream_close, ft_FSp_stream_io) [__MWERKS__]: New functions. + (file_spec_from_path) [__MWERKS__]: Updated #if statement. + (get_file_type, make_lwfn_spec): Use `const' for argument. + (is_dfont) [TARGET_API_MAC_CARBON]: Removed. + (count_face_sfnt, count_faces): New functions. + (parse_fond): Do some range checking. + (read_lwfn): Change type of second argument. + No longer call FSpOpenResFile. + (OpenFileAsResource): New function. + (FT_New_Face_From_LWFN): Use `const' for second argument. + Use OpenFileAsResource. + (FT_New_Face_From_Suitcase): Change type of second argument. + No longer call FSpOpenResFile. + Loop over all resource indices. + (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Removed. + (FT_GetFile_From_Mac_Name): Use `const' for first argument. + (ResourceForkSize): Removed. + (FT_New_Face): Updated to use new functions. + (FT_New_Face_From_FSSpec): New function. + + * include/freetype/ftmac.h: Updated. + +2004-02-24 Malcolm Taylor + + * src/autohint/ahhint.c (ah_hinter_load) : + Handle case where outline->num_vedges is zero while computing hinted + metrics. + +2004-02-24 Gordon Childs + + * src/cff/cffcmap.c (cff_cmap_unicode_init): Provide correct value + for `count'. + +2004-02-24 Werner Lemberg + + * include/freetype/t1tables.h (PS_PrivateRec): Add + `expansion_factor'. + + * src/pshinter/pshglob (psh_blues_scale_zones): Fix computation + of blues->no_overshoots -- `blues_scale' is stored with a + magnification of 1000, and `scale' returns fractional pixels. + + * src/type1/t1load.c (T1_Open_Face): Initialize `blue_shift', + `blue_fuzz', `expansion_factor', and `blue_scale' according to the + Type 1 specification. + + * src/type1/t1tokens.h: Handle `ExpansionFactor'. + + * docs/CHANGES: Updated. + +2004-02-24 Masatake YAMATO + + Provide generic access to MacOS resource forks. + + * src/base/ftrfork.c, include/freetype/internal/ftrfork.h: New + files. + + * src/base/ftobjs.c: Include FT_INTERNAL_RFORK_H. + (Mac_Read_POST_Resource, Mac_Read_sfnt_Resource): Remove arguments + `resource_listoffset' and `resource_data' and adapt code + accordingly. These values are calculated outside of the function + now. + Add new argument `offsets'. + (IsMacResource): Use `FT_Raccess_Get_HeaderInfo' and + `FT_Raccess_Get_DataOffsets'. + (load_face_in_embedded_rfork): New function. + (load_mac_face): Use load_face_in_embedded_rfork. + (ft_input_stream_new): Renamed to... + (FT_Stream_New): This. Use FT_BASE_DEF. Updated all callers. + (ft_input_stream_free): Renamed to... + (FT_Stream_Free): This. Use FT_BASE_DEF. Updated all callers. + + * src/base/ftbase.c: Include ftrfork.c. + + * src/base/rules.mk (BASE_SRC), src/base/Jamfile: Updated. + + * include/freetype/internal/internal.h (FT_INTERNAL_RFORK_H): + New macro. + + * include/freetype/internal/fttrace.h: Added `rfork' as a new + trace definition. + + * include/freetype/internal/ftstream.h: Declare FT_Stream_New and + FT_Stream_Free. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK): New option. + + * include/freetype/config/ftstdlib.h (ft_strrchr): New macro. + +2004-02-23 Werner Lemberg + + * docs/CHANGES: Updated. + + * include/freetype/internal/ftdebug.h: Include FT_FREETYPE_H. + +2004-02-23 Masatake YAMATO + + Provide a simple API to control FreeType's tracing levels. + + * include/freetype/internal/ftdebug.h (FT_Trace_Get_Count, + FT_Trace_Get_Name): New declarations. + + * src/base/ftdebug.c (FT_Trace_Get_Count, FT_Trace_Get_Name): New + functions. + +2004-02-23 David Turner + + * src/autofit/afhints.c, src/autofit/afhints.h, + src/autofit/aflatin.c, src/autofit/afloader.c, src/types.h: Grave + bugs have been fixed. The auto-fitter works, doesn't crash, but + still produces unexpected results... + +2004-02-21 Werner Lemberg + + * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD): Changed to hold + the accepted shift for strong points in fractional pixels (which + is a heuristic value). + (psh_glyph_find_strong_points): Compute threshold for + psh_hint_table_find_strong_points. + (psh_hint_table_find_strong_point): Add parameter to pass threshold. + +2004-02-20 Werner Lemberg + + * src/pshinter/pshrec.c (ps_mask_table_set_bits): Don't call + ps_mask_table_alloc but ps_mask_table_last. + (ps_hints_t2mask): Use correct position and number for vertical + and horizontal hinter mask bits. + + * docs/CHANGES: Updated. + +2004-02-19 Werner Lemberg + + * src/base/ftstroke.c (FT_Glyph_StrokeBorder): Fix enum handling. + * src/cff/cffdrivr.c (cff_get_cmap_info): Remove compiler warning. + +2004-02-18 Werner Lemberg + + * include/freetype/freetype.h: Document FT_LOAD_TARGET_XXX properly. + + * src/base/ftglyph.c (ft_bitmap_glyph_class, + ft_outline_glyph_class): Tag with FT_CALLBACK_TABLE_DEF. + + * src/smooth/ftsmooth.c (ft_smooth_render): Handle + FT_RENDER_MODE_LIGHT. + +2004-02-17 Werner Lemberg + + Fix callback functions in cache module. + + * src/cache/ftccback.h: New file for callback declarations. + + * src/cache/ftcbasic.c (ftc_basic_family_compare, + ftc_basic_family_init, ftc_basic_family_get_count, + ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph, + ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF. + (ftc_basic_image_family_class, ftc_basic_image_cache_class, + ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): + Use FT_CALLBACK_TABLE_DEF and local wrapper functions. + + * src/cache/ftccache.c: Include ftccback.h. + (ftc_cache_init, ftc_cache_done): New wrapper functions which use + FT_LOCAL_DEF. + + * src/cache/ftccmap.c: Include ftccback.h. + (ftc_cmap_cache_class): Use local wrapper functions. + + * src/cache/ftcglyph.c: Include ftccback.h. + (ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper + functions which use FT_LOCAL_DEF. + + * src/cache/ftcimage.c: Include ftccback.h. + (ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper + functions which use FT_LOCAL_DEF. + + * src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class): + Use FT_CALLBACK_TABLE_DEF. + + * src/cache;/ftcsbits.c: Include ftccback.h. + (ftc_snode_free, ftc_snode_new, ftc_snode_weight, + ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF. + + * src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h. + +2004-02-17 Masatake YAMATO + + * include/freetype/ftmac.h (FT_GetFile_From_Mac_Name): Fix a typo + (FT_EXPORT_DEF -> FT_EXPORT). + + * include/freetype/ftxf86.h (FT_Get_X11_Font_Format): Ditto. + +2004-02-15 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Fix typo. + +2004-02-14 Masatake YAMATO + + * builds/unix/ftsystem.c: Include errno.h. + (ft_close_stream): Renamed to... + (ft_close_stream_by_munmap): This. + (ft_close_stream_by_free): New function. + (FT_Stream_Open): Use fallback method if mmap fails. + Use proper function for closing the stream. + +2004-02-14 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Initialize `start_binary'. + +2004-02-13 Robert Etheridge + + * src/type42/t42objs.c (T42_Face_Init), src/type1/t1objs.c + (T1_Face_Init), src/cid/cidobjs.c (cid_face_init): Fix computation + of underline_position and underline_thickness. + +2004-02-12 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Return immediately if + ppem values don't change. Suggested by Graham Asher. + +2004-02-11 Werner Lemberg + + * src/cid/cidload.c (cid_face_open): Always allocate + face->cid_stream so that we can deallocate it safely. + +2004-02-10 Werner Lemberg + + Make the PS parser more tolerant w.r.t. non-standard font data. In + general, an error is only reported in case of a syntax error; a + wrong type is now simply ignored (if possible). To be independent + of the order of various MM-specific keywords, the parse_shared_dict + routine has been removed -- the PS parser is now capable to skip + this data. It no longer fails on parsing e.g. + + dup /WeightVector exch def + + Since the token following /WeightVector isn't `[' (starting an + array) it is simply ignored. + + * include/freetype/fterrdef.h: Define `FT_Err_Ignore' (0xA2) as a + new internal error value. + + * src/type1/t1load.c (parse_blend_axis_types, + parse_blend_design_positions, parse_blend_design_map): Return + T1_Err_Ignore if no proper array is following the keyword. + (parse_weight_vector): Use T1_ToTokenArray, initializing `blend' + structure, if necessary. + Return T1_Err_Ignore if no proper array is following the keyword. + (parse_shared_dict): Removed. + (parse_encoding): Set parser->root.error to return T1_Err_Ignore + if no result can be obtained. + Check for errors before accessing `elements' array. + (t1_keywords): Remove /shareddict. + (parse_dict): Reset error if t1_load_keyword returns T1_Err_Ignore. + Set keyword_flag only in case of success. + Check error code if skipping an unrecognized token. + (T1_Open_Face) [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: Call T1_Done_Blend + if blend commands haven't set up a proper MM font. + + * src/psaux/psobjs.c (ps_parser_load_field_table): Remove special + code for synthetic fonts. + Return PSaux_Err_Ignore if no proper value has been found. + +2004-02-09 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Preserve glyph width before calling + cff_operator_seac. + +2004-02-09 Martin Muskens + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Handle special + first argument for `hintmask' and `cntrmask' operators also. + +2004-02-08 Werner Lemberg + + * builds/unix/configure.in: Call AC_SUBST for `enable_shared', + `hardcode_libdir_flag_spec', and `wl'. + * builds/unix/configure: Regenerated. + + * builds/unix/freetype-config.in: Make --prefix and --exec-prefix + actually work. + Report a proper --rpath (or -R) value for --libs argument if a + shared library has been built. + + * docs/CHANGES: Updated. + +2004-02-07 Keith Packard + + * src/bdf/bdfdrivr.c (BDF_Face_Init, BDF_Set_Pixel_Size): Fix + computation of various vertical and horizontal metric values. + + * src/pcfdrivr.c (PCF_Set_Pixel_Size), src/pcfread (pcf_load_font): + Ditto. + +2004-02-07 Werner Lemberg + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.dsw, docs/CHANGES: Updated. + +2004-02-07 Vitaliy Pasternak + + * builds/win32/visualc/freetype.sln, + builds/win32/visualc/freetype.vcproj: New files for VS.NET 2003. + +2004-02-03 Werner Lemberg + + * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): + Initialize `node'. + * src/type1/t1load.c (parse_dict): Initialize `have_integer'. + +2004-02-02 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Handle `RD' and `-|' commands + outside of /Subrs or /CharStrings. This can happen if there is + additional code manipulating those two arrays so that FreeType + doesn't recognize them properly. + (T1_Open_Face): Improve an error message. + +2004-02-01 Werner Lemberg + + * src/type1/t1load.c (parse_charstrings): Exit immediately if + there are no elements in /CharStrings. This is needed for fonts + like Optima-Oblique which not only define /CharStrings but access it + also. + +2004-02-01 David Turner + + * src/sfnt/Jamfile: Removing `ttcmap' from the list of sources. + + * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) + : Provide macro version which doesn't use inline code. + * include/freetype/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP) + : Ditto. + Use FTC_MRULIST_LOOKUP_CMP. + * include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): New + macro. + (FTC_MRULIST_LOOKUP): Use it. + + * src/cache/Jamfile (_sources), src/cache/descrip.mms: Updated. + * src/cache/ftcbasic.c: Fix compiler warnings. + * src/cache/ftcmanag.c (FTC_Manager_LookupSize, + FTC_Manager_LookupFace) : Use FTC_MRULIST_LOOKUP_CMP. + * src/cache/ftcmru.c (FTC_MruList_Find): Fix a bug (found after + heavy testing). + + * Jamfile: Updating `refdoc' target, and adding `autohint' to the + list of modules to build. Both the autohinter and autofitter will + be built by default. But which one will be used is determined by + the content of `ftmodule.h'. + + * src/autofit/*: Many updates, but the code is still buggy... + +2004-01-31 Werner Lemberg + + * src/cff/cffgload.c (cff_operator_seac): Fix magnitude of + accent offset. + Update code similarly to the seac support for Type 1 fonts. + (cff_decoder_parse_charstrings) : Fix magnitude + of accent offset. + Don't hint glyphs twice if seac is emulated. + : Assign correct point tags. + * docs/CHANGES: Updated. + +2004-01-30 Werner Lemberg + + * src/type1/t1parse.c (T1_Get_Private_Dict): Use FT_MEM_MOVE, not + FT_MEM_COPY, for copying the private dict. + + * src/type1/t1load.c (parse_subrs): Assign number of subrs only + in first run. + (parse_charstrings): Parse /CharStrings in second run without + assigning values. + (parse_dict): Skip all /CharStrings arrays but the first. We need + this for non-standard fonts like `Optima' which have different + outlines depending on the resolution. Note that there is no + guarantee that we get fitting /Subrs and /CharStrings arrays; this + can only be done by a real PS interpreter. + +2004-01-29 Antoine Leca + + * builds/win32/visualc/index.html: New file, giving detailed + explanations about forcing CR+LF line endings for the VC++ project + files. + +2004-01-22 Garrick Meeker + + * src/cff/cffload.c (cff_subfont_load): Initialize `dict'. + +2004-01-22 Werner Lemberg + + Add support for the hexadecimal representation of binary data + started with `StartData' in CID-keyed Type 1 fonts. + + * include/freetype/internal/t1types.h (CID_FaceRec): Add new + members `binary_data' and `cid_stream'. + + * src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'. + (cid_hex_to_binary): New auxiliary function. + (cid_face_open): Add new argument `face_index' to return quickly + if less than zero. Updated all callers. + Call `cid_hex_to_binary', then open and assign memory stream to + `face->cid_stream' if `parser->binary_length' is non-zero. + * src/cid/cidload.h: Updated. + + * src/cid/cidobjs.c (cid_face_done): Free `binary_data' and + `cid_stream'. + + * src/cid/cidparse.c (cid_parser_new): Check arguments to + `StartData' and set parser->binary_length accordingly. + * src/cid/cidparse.h (CID_Parser): New member `binary_length'. + + * src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'. + + * docs/CHANGES: Updated. + +2004-01-21 Werner Lemberg + + include/freetype/config/ftstdlib.h (ft_atoi): Replaced with... + (ft_atol): This. + * src/base/ftdbgmem.c: s/atol/ft_atol/. + * src/type42/t42drivr.c: s/ft_atoi/ft_atol/. + +2004-01-20 Masatake YAMATO + + * include/freetype/ftcache.h: Delete duplicated definition of + FTC_FaceID. + + * src/cff/cffdrivr.c (cff_get_cmap_info): Call sfnt module's TT CMap + Info service function if the cmap comes from sfnt. Return 0 if the + cmap is sythesized in cff module. + +2004-01-20 David Turner + + * src/cache/ftcmanag.c (ftc_size_node_compare): Call + FT_Activate_Size. + +2004-01-20 Werner Lemberg + + * src/type1/t1parse.c (T1_Get_Private_Dict): Skip exactly one + CR, LF, or CR/LF after `eexec'. + +2004-01-18 David Turner + + * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Remove compiler + warning. + + * src/tools/docmaker/*: Updating beautifier tool. + +2004-01-15 David Turner + + * src/base/ftoutln.c (ft_orientation_extremum_compute): Fix + infinite loop bug. + + * include/freetype/ftstroke.h: Include FT_GLYPH_H. + (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_Glyph_StrokeBorder): New + declarations. + + * src/base/ftstroke.c: Include FT_INTERNAL_OBJECTS_H. + (FT_Outline_GetOutsideBorder): Inverse result. + (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_GlyphStrokeBorder): New + functions. + (FT_Stroker_EndSubPath): Close path if needed. + (FT_Stroker_Set, FT_Stroker_ParseOutline): Use FT_Stroker_Rewind. + + * include/freetype/cache/ftcmanag.h (FTC_ScalerRec, + FTC_Manager_LookupSize): Moved to... + * include/freetype/ftcache.h (FTC_ScalerRec, + FTC_Manager_LookupSize): Here. + + * src/tools/docmaker/docbeauty.py: New file to beautify the + documentation comments (e.g., to convert them to single block border + mode). + * src/tools/docmaker/docmaker.py (file_exists, make_file_list): + Moved to... + * src/tools/docmaker/utils.py (file_exists, make_file_list): Here. + +2004-01-14 David Turner + + * include/freetype/internal/ftmemory.h (FT_ARRAY_COPY, + FT_ARRAY_MOVE): New macros to make copying arrays easier. + Updated all relevant code to use them. + +2004-01-14 Werner Lemberg + + * src/cff/cffload.c (cff_font_load): Load charstrings_index earlier. + Use number of charstrings as argument to CFF_Load_FD_Select (as + documented in the CFF specs). + +2004-01-13 Graham Asher + + * src/pshinter/pshalgo.c (psh_glyph_init): Move assignment of + `glyph->memory' up to free arrays properly in case of failure. + +2004-01-10 Masatake YAMATO + + Make `FT_Get_CMap_Language_ID' work with CFF. Bug reported by + Steve Hartwell . + + * src/cff/cffdrivr.c: Include FT_SERVICE_TT_CMAP_H. + (cff_services): Added an entry for FT_SERVICE_ID_TT_CMAP. + (cff_get_cmap_info): New function. + (cff_service_get_cmap_info) New entry for cff_services. + + * src/sfnt/ttcmap0.c: Exit loop after a format match has been found. + Suggested by Steve Hartwell . + +2004-01-03 Masatake YAMATO + + * src/base/ftobjs.c (destroy_charmaps): New function. + (destroy_face, open_face): Use `destroy_charmaps'. + +2004-01-01 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-01-01 Michael Jansson + + * src/winfonts/winfnt.c (FNT_Size_Set_Pixels): Fix sign of + size->metrics.descender. + +2003-12-31 Wolfgang Domröse + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Use `%ld' in FT_TRACE4. + : Change type of dx and dy to FT_Pos and remove + cast for accessing arguments. + +2003-12-31 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Revert previous + change. It's not necessary. + +2003-12-29 Smith Charles + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle `repeated + flags set' correctly. + +2003-12-29 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Fix memory leak by deallocating + `full' and `weight' properly. + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Use `0x' as prefix for + tracing output. + +2003-12-26 Werner Lemberg + + * include/freetype/internal/sfnt.h (TT_Set_SBit_Strike_Func): + Use FT_UInt for ppem values. + * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use FT_UInt for + ppem values. + * src/sfnt/ttsbit.h: Updated. + + * src/base/ftobjs.c (FT_Set_Pixel_Sizes): Don't allow ppem values + larger than -0FFFF. + +2003-12-25 Werner Lemberg + + * src/base/fttrigon.c, src/base/ftgloadr.c: Inlude + FT_INTERNAL_OBJECTS_H. + + * src/base/ftstroke.c (FT_Outline_GetInsideBorder, + FT_Outline_GetOutsideBorder): s/or/o/ to make it compile with + C++ compilers. + + * src/cache/ftcmru.c, include/freetype/cache/ftcmru.h: + s/select/selection/ to avoid compiler warning. + * src/cff/cffload.h: s/select/ftselect/ to avoid potential + compiler warning. + +2003-12-24 Werner Lemberg + + * src/cache/ftcsbits.c (FTC_SNode_Weight): + s/FTC_SBIT_ITEM_PER_NODE/FTC_SBIT_ITEMS_PER_NODE/. + +2003-12-24 David Turner + + * Fixed compilation problems in the cache sub-system. + + * Partial updates to src/autofit. + + * Jamfile (FT2_COMPONENTS): Add autofit module. + +2003-12-23 Werner Lemberg + + * src/cff/cffgload.c (cff_lookup_glyph_by_stdcharcode): Handle + CID-keyed fonts. + +2003-12-23 David Turner + + * include/freetype/internal/ftobjs.h (FT_PAD_FLOOR, FT_PAD_ROUND, + FT_PAD_CEIL, FT_PIX_FLOOR, FT_PIX_ROUND, FT_CEIL): New macros. They + are used to avoid compiler warnings with very pedantic compilers. + Note that `(x) & -64' causes a warning if (x) is not signed. Use + `(x) & ~63' instead! + Updated all related code. + + Add support for extraction of `inside' and `outside' borders. + + * src/base/ftstroke.c (FT_StrokerBorder): New enumeration. + (FT_Outline_GetInsideBorder, FT_Outline_GetOutsideBorder, + FT_Stroker_GetBorderCounts, FT_Stroker_ExportBorder): New functions. + (FT_StrokeBorderRec): New boolean member `valid'. + (ft_stroke_border_get_counts): Updated. + * include/freetype/ftstroke.h: Updated. + +2003-12-22 Werner Lemberg + + * include/freetype/ftwinfnt.h (FT_WinFNT_ID_*): New definitions + to describe the `charset' field in FT_WinFNT_HeaderRec. + * src/winfonts/winfnt.c (FNT_Face_Init): Set encoding to + FT_ENCODING_NONE except for FT_WinFNT_ID_MAC. + + * include/freetype/freetype.h (FT_Encoding): Improve comment, + based on work by Detlef Würkner . + + * docs/CHANGES: Updated. + +2003-12-22 David Turner + + * include/freetype/ftcache.h, + include/freetype/cache/ftcmanag.h, + include/freetype/cache/ftccache.h, + include/freetype/cache/ftcmanag.h, + include/freetype/cache/ftcmru.h (added), + include/freetype/cache/ftlru.h (removed), + include/freetype/cache/ftcsbits.h, + include/freetype/cache/ftcimage.h, + include/freetype/cache/ftcglyph.h, + src/cache/ftcmru.c, + src/cache/ftcmanag.c, + src/cache/ftccache.c, + src/cache/ftcglyph.c, + src/cache/ftcimage.c, + src/cache/ftcsbits.c, + src/cache/ftccmap.c, + src/cache/ftcbasic.c (added), + src/cache/ftclru.c (removed): + + *Complete* rewrite of the cache sub-system to `solve' the + following points: + + - all public APIs have been moved to FT_CACHE_H, everything + under `include/freetype/cache' is only needed by client + applications that want to implement their own caches + + - a new function named FTC_Manager_RemoveFaceID to deal + with the uninstallation of FaceIDs + + - the image and sbit cache are now abstract classes, that + can be extended much more easily by client applications + + - better performance in certain areas. Further optimizations + to come shortly anyway... + + - the FTC_CMapCache_Lookup function has changed its signature, + charmaps can now only be retrieved by index + + - FTC_Manager_Lookup_Face => FTC_Manager_LookupFace + FTC_Manager_Lookup_Size => FTC_Manager_LookupSize (still in + private header for the moment) + +2003-12-21 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Stop parsing if `eexec' keyword + is encountered. + +2003-12-19 Werner Lemberg + + * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 32. For + example, the Japanese Hiragino font already contains 15 subfonts. + + * src/cff/cffload.c (cff_font_load): Deallocate `sids' array for + CID-keyed fonts. + + * devel/ftoption.h: Define FT_DEBUG_MEMORY. + +2003-12-18 Werner Lemberg + + * include/freetype/ttnameid.h (TT_ADOBE_ID_LATIN_1): New macro. + * src/type1/t1objs.c (T1_Face_Init): Use TT_ADOBE_ID* values. + +2003-12-18 Werner Lemberg + + * src/cff/cfftypes.h (CFF_FontRecDictRec): Change type of + `cid_count' to `FT_ULong'. + + * src/cff/cffgload.c (cff_slot_load): Take care of empty `cids' + array. + + * src/cff/cffload.c (cff_charset_done): Free `cids' array. + (cff_font_load): Create cids array only for CID-keyed fonts which + are subsetted. + + * src/cff/cffobjs.c (cff_face_init): Check the availability of + the PSNames modules for non-pure CFFs also. + Set FT_FACE_FLAG_GLYPH_NAMES for a non-pure CFF also if it isn't + CID-keyed. + + * src/cff/rules.mk (CFF_DRV_H): Add cfftypes.h. + +2003-12-17 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_init_face): Don't set + FT_FACE_FLAG_GLYPH_NAMES if the font contains a version 3.0 `post' + table. + + * docs/CHANGES: Updated. + +2003-12-17 Masatake YAMATO + + Add new function FT_Get_CMap_Language_ID to extract the language ID + for TrueType/sfnt fonts. + + * include/freetype/internal/services/svttcmap.h: New file. + * include/freetype/internal/ftserv.h (FT_SERVICE_TT_CMAP_H): Add + svttcmap.h. + + * src/sfnt/sfdriver.c: Include ttcmap0.h. + (tt_service_get_cmap_info): New service. + (sfnt_services): Updated. + + * src/sfnt/ttcmap0.c (tt_cmap*_get_info): New functions. + (tt_cmap*_class_rec): Add tt_cmap*_get_info members. + (tt_get_cmap_info): New function. + * src/sfnt/ttcmap0.h: Include FT_SERVICE_TT_CMAP_H. + (TT_CMap_ClassRec): New field `get_cmap_info'. + (tt_get_cmap_info): New declaration. + + * src/base/ftobjs.c: Include FT_SERVICE_TT_CMAP_H. + (FT_Get_CMap_Language_ID): New function implementation. + * include/freetype/tttables.h (FT_Get_CMap_Language_ID): New + function declaration. + +2003-12-16 Werner Lemberg + + * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: Removed. Obsolete. + + * include/freetype/internal/sfnt.h (SFNT_Interface): Remove + obsolete fields `load_charmap' and `free_charmap'. + (TT_CharMap_Load_Func, TT_CharMap_Free_Func): Removed. + * src/sfnt/sfnt.c: Don't include ttcmap.c. + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttcmap.c. + * src/sfnt/ttload.c: Don't include ttcmap.h. + * src/sfnt/sfdriver.c: Don't include ttcmap.h. + (sfnt_interface): Updated. + + * include/freetype/internal/tttypes.h (TT_TableDirRec, + TT_CMapDirRec, TT_CMapDirEntryRec, TT_CMap0, TT_CMap2SubHeaderRec, + TT_CMap2Rec, TT_CMap4Segment, TT_CMap4Rec, TT_CMap6, + TT_CMapGroupRec, TT_CMap8_12Rec, TT_CMap10Rec, TT_CharMap_Func, + TT_CharNext_Func, TT_CMapTableRec, TT_CharMapRec): Removed. + Obsolete. + * src/cff/cffobjs.h (CFF_CharMapRec): Removed. Obsolete. + +2003-12-15 Werner Lemberg + + * docs/CHANGES: Updated. + +2003-12-15 Wolfgang Domröse + + * builds/atari/*: New directory for building FreeType 2 on Atari + with the PureC compiler. + +2003-12-12 Wolfgang Domröse + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add + cast. + * src/cff/cffdrivr.c (cff_ps_has_glyph_names): Assure that return + value is either 0 or 1. + +2003-12-12 Werner Lemberg + + * src/cff/cffdrivr.c (cff_get_glyph_name): Improve error message. + (cff_get_name_index): Return if no PSNames service is available. + (cff_ps_has_glyph_names): Handle CID-keyed fonts correctly. + * src/cff/cfftypes.h (CFF_CharsetRec): New field `cids', used for + CID-keyed fonts. This is the inverse mapping of `sids'. + * src/cff/cffload.c (cff_charset_load): New argument `invert'. + Initialize charset->cids if `invert' is set. + (cff_font_load): In call to cff_charset_load, set `invert' to true + for CID-keyed fonts. + * src/cff/cffgload.c (cff_slot_load): Handle glyph index as CID + and map it to the real glyph index. + + * docs/CHANGES: Updated. + +2003-12-11 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Don't set + FT_FACE_FLAG_GLYPH_NAMES for CID-keyed fonts. + Don't construct a cmap for CID-keyed fonts. + +2003-12-10 Werner Lemberg + + Use implementation specific SID value 0xFFFF to indicate that + a dictionary element is missing. + + * src/cff/cffload.c (cff_subfont_load): Initialize all fields + which hold SIDs to 0xFFFF. + (cff_index_get_sid_string): Handle SID value 0xFFFF. + Handle case where `psnames' is zero. + (cff_font_load): Updated. + Don't load encoding for CID-keyed CFFs. + + * src/cff/cffobjs.c (cff_face_init): Updated. + Don't check for PSNames module if font is CID-keyed. + Compute style name properly (using the same algorithm as in the + CID driver). + Fix computation of style flags. + + * src/cff/cfftoken.h: Comment out handling of base_font_name. + Rename `postscript' field to `embedded_postscript' + * src/cff/cfftypes.h (CFF_FontRecDictRec): Remove `base_font_name' + and `postscript'. + +2003-12-10 Detlef Würkner + + * src/pcf/pcfdrivr.c (pcf_get_charset_id): New function (a clone + of the similar BDF function). + (pcf_service_bdf): Use it. + +2003-12-09 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Set FT_FACE_FLAG_GLYPH_NAMES + only if a `post' table is present. + +2003-12-09 George Williams + + * src/base/ftobjs.c (load_mac_face): Recent versions of Linux + support Mac's HFS+ file system, thus enable code to read /rsrc on + non-Macintosh platforms also. + +2003-12-08 Werner Lemberg + + * include/freetype/internal/psaux.h (PS_TableRec): Change type + of `lengths' to FT_PtrDist. + (T1_DecoderRec): Change type of `subrs_len' to FT_PtrDist. + * include/freetype/internal/t1types.h (T1_FontRec): Change type + of `subrs_len' and `charstrings_len' to FT_PtrDist. + + * src/base/ftobjs.c (Mac_Read_POST_Resource): Replace `junk' + variable with better solution. + (IsMacResource): Remove unused variable `map_len'. + Replace `junk' variable with better solution. + (FT_Open_Face) [!FT_MACINTOSH]: Add conditional + FT_CONFIG_OPTION_MAC_FONTS. + +2003-12-08 Wolfgang Domröse + + * src/autohint/ahhint.c (ah_hinter_hint_edges, + ah_hinter_align_strong_points): Add some casts. + + * src/base/ftoutln.c (FT_OrientationExtremumRec): Change type + of `pos' to FT_Long. + + * src/base/ftobjs.c (Mac_Read_POST_Resource, + Mac_Read_sfnt_Resource): Change type of `len' to FT_Long. + + * src/type42/t42parse.c (t42_parse_dict): Add cast for `n_keywords'. + +2003-12-07 Werner Lemberg + + * docs/raster.txt: New file, taken from FreeType 1 and completely + revised. + +2003-12-04 Masatake YAMATO + + * src/type1/t1driver.c (Get_Interface): Remove FT_UNUSED for + t1_interface. t1_interface is used. + +2003-11-27 David Turner + + * src/pfr/pfrdrivr.c (pfr_get_metrics): Revert incorrect change of + 2003-11-23: For PFR fonts, metrics->x_scale and metrics->y_scale are + the scaling values for outline units, not for metric units. + +2003-11-25 Werner Lemberg + + * src/base/ftcalc.c, include/freetype/internal/ftcalc.h + (FT_MulDiv_No_Round): Surround code with `#ifdef + TT_CONFIG_OPTION_BYTECODE_INTERPRETER ... #endif'. + +2003-11-23 Werner Lemberg + + * src/base/ftcalc.c (FT_MulDiv_No_Round): New function (32 and + 64 bit version). + * include/freetype/internal/ftcalc.h: Updated. + + * src/truetype/ttinterp.c (TT_MULDIV_NO_ROUND): New macro. + (TT_INT64): Removed. + (DO_DIV): Use TT_MULDIV_NO_ROUND. + + * src/pfr/pfrdrivr.c (pfr_get_metrics): Directly use + metrics->x_scale and metrics->y_scale. + +2003-11-22 Rogier van Dalen + + * src/truetype/ttinterp.c (CUR_Func_move_orig): New macro. + (Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New + functions. Similar to Direct_Move, Direct_Move_X, and + Direct_Move_Y but without touching. + (Compute_Funcs): Use new functions. + + (Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid, + Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, + Round_Super_45): Fix rounding of value zero. + + (DO_DIV): Don't use TT_MULDIV. + + (Ins_SHC): This instruction actually touches the points. + (Ins_MSIRP): Fix undocumented behaviour. + + * src/truetype/ttinterp.h (TT_ExecContextRec): Updated. + +2003-11-22 Werner Lemberg + + * docs/VERSION.DLL, docs/CHANGES: Updated. + + * src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and + metrics->y_scale really precise. + + (FT_Load_Glyph): Update computation of linearHoriAdvance and + linearVertAdvance. + + * src/truetype/ttinterp.c (Update_Max): Use FT_REALLOC. + +2003-11-22 David Turner + + * src/autofit/*: More updates. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. + * builds/unix/configure.ac (version_info): Set to 9:6:3. + * README: Updated. + +2003-11-13 John A. Boyd Jr. + + * src/bdf/bdfdrivr.c (bdf_interpret_style), src/pcf/pcfread.c + (pcf_interpret_style): Replace spaces with dashes in properties + SETWIDTH_NAME and ADD_STYLE_NAME to simplify parsing. + +2003-11-11 Werner Lemberg + + * docs/CHANGES: Updated. + +2003-11-11 John A. Boyd Jr. + + Handle SETWIDTH_NAME and ADD_STYLE_NAME properties for BDF and PCF + fonts. + + * src/bdf/bdfdrivr.c (bdf_interpret_style): New auxiliary function. + (BDF_Face_Init): Don't handle style properties but call + bdf_interpret_style. + + * src/pcf/pcfread.c (pcf_interpret_style): New auxiliary function. + (pcf_load_font): Don't handle style properties but call + pcf_interpret_style. + +2003-11-07 Werner Lemberg + + + * Version 2.1.7 released. + ========================= + + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. + + * builds/unix/ft2unix.h: Fix comments. + + * builds/unix/ftconfig.in: Synchronized with ANSI version. + Use `#undef' in templates as recommended in the autoconf + documentation. + Since real `#undef' lines don't survive during configuration, use + `/undef' instead; the postprocessing facility of the + AC_CONFIG_HEADERS autoconf macro converts them to `#undef'. + + * builds/unix/install.mk (install): Install Unix version of + `ftconfig.h'. + + * builds/unix/unix-cc.in (CFLAGS): Set FT_CONFIG_CONFIG_H macro + to include the correct `ftconfig.h' file. + + * builds/unix/ft-munmap.m4 (FT_MUNMAP_DECL): Removed. + (FT_MUNMAP_PARAM): Updated syntax to autoconf 2.59. + + * builds/unix/freetype2.m4: Updated syntax to autoconf 2.59. + + * builds/unix/configure.ac: Use AC_CONFIG_HEADERS instead of + AC_CONFIG_HEADER to create ftconfig.h, and use second argument + to replace `/undef' with `#undef'. + Don't use FT_MUNMAP_DECL but AC_CHECK_DECLS to check for munmap. + Use AS_HELP_STRING in AC_ARG_WITH. + Update syntax to autoconf 2.59. + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.7.8. + * builds/unix/configure: Regenerated with autoconf 2.59. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at subversions.gnu.org. + + * builds/vms/ftconfig.h: Synchronized with ANSI version. + + * docs/CUSTOMIZE: Fix documentation error. + * docs/CHANGES, docs/VERSION.DLL, docs/release: Updated. + + * builds/freetype.mk (refdoc): Updated --title. + +2003-11-07 David Turner + + + * Version 2.1.6 released. + ========================= + + + * install: Removed. Obsolete. + +2003-11-04 Werner Lemberg + + * src/sfnt/sfdriver.c: Include FT_SERVICE_SFNT_H. + (sfnt_service_sfnt_table): New service. + (sfnt_services): Updated. + + * docs/license.txt: Reworded. + +2003-11-03 Werner Lemberg + + * include/freetype/*: Add a guard to all public header files which + load FT_FREETYPE_H to reject freetype.h from FreeType 1. + +2003-11-02 Patrick Welche + + * builds/unix/freetype2.m4, builds/unix/ft-munmap.m4: Protect + first argument of AC_DEFUN with brackets to avoid possible + expansion. + +2003-11-02 Werner Lemberg + + * include/freetype/cache/ftcglyph.h: Don't include stddef.h. + + * include/freetype/freetype.h: Fix check for ft2build.h. + +2003-11-01 Werner Lemberg + + * include/freetype/freetype.h: Check that ft2build.h has been + loaded first. + + * src/base/fttype1.c (FT_Get_PS_Font_Info): Fix incorrectly applied + patch. + +2003-10-31 Detlef Würkner + + * src/base/fttype1.c (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): + Fix parameter order in calls to FT_FACE_FIND_SERVICE. + +2003-10-31 Werner Lemberg + + * include/freetype/internal/ftserv.h + (FT_SERVICE_POSTSCRIPT_NAMES_H): Removed. Unused. + + * src/type42/t42drivr.c (t42_services): Updated. + +2003-10-29 David Turner + + * include/freetype/internal/bdftypes.h: Removed. Obsolete. + * src/base/ftbdf.c: Updated. + + * include/freetype/internal/cfftypes.h: Moved to... + * src/cff/cfftypes.h: This place since no other module needs to + know about those types. + + * include/freetype/internal/t42types.h: Moved to... + * src/type42/t42types.h: This place since no other module needs to + know about those types. + + * include/freetype/internal/services/svbdf.h: Include FT_BDF_H. + + * include/freetype/internal/services/svpsname.h: Renamed to... + * include/freetype/internal/services/svpscmap.h: This. + Updated `FT_Service_PsNames' -> `FT_Service_PsCMaps' and + `POSTSCRIPT_NAMES' -> `POSTSCRIPT_CMAPS' everywhere. + + * include/freetype/internal/services/svpsinfo.h: New file, providing + PostScript info service. + + * include/freetype/internal/ftserv.h (FT_SERVICE_POSTSCRIPT_CMAPS_H, + FT_SERVICE_POSTSCRIPT_INFO_H): New macros for svpscmap.h and + svpsinfo.h. + * include/freetype/internal/internal.h (FT_INTERNAL_TYPE42_TYPES_H, + FT_INTERNAL_CFF_TYPES_H, FT_INTERNAL_BDF_TYPES_H): Removed. + + * src/base/fttype1.c: Don't include FT_INTERNAL_TYPE1_TYPES_H and + FT_INTERNAL_TYPE42_TYPES_H but FT_INTERNAL_SERVICE_H and + FT_SERVICE_POSTSCRIPT_INFO_H. + (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): Use new + POSTSCRIPT_INFO service. + + * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (cff_ps_has_glyph_names): New function. + (cff_service_ps_info): New service. + (cff_services): Updated. + + * src/cff/cffload.h, src/cff/cffobjs.h, src/cff/cffparse.h: Don't + include FT_INTERNAL_CFF_TYPES_H but cfftypes.h directly. + + * src/cif/cidriver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (cid_ps_get_font_info): New function. + (cid_service_ps_info): New service. + (cid_services): Updated. + + * src/type1/t1driver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (t1_ps_get_font_info, t1_ps_has_glyph_names): New functions. + (t1_service_ps_info): New service. + (t1_services): Updated. + + * src/type42/t42drivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (t42_ps_get_font_info, t42_ps_has_glyph_names): New functions. + (t42_service_ps_info): New service. + + * src/type42/t42objs.h: Don't include FT_INTERNAL_TYPE42_TYPES_H + but t42types.h directly. + + * src/psnames/psmodule.c (psnames_interface, psnames_services): + Renamed to... + (pscmaps_interface, pscmaps_services): This. + Updated all users. + + + * src/gzip/infblock.c (inflate_blocks): Remove compiler warning. + +2003-10-22 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Handle `/Encoding [ ... ]'. + + * src/type1/t1parse.c (T1_Get_Private_Dict): Test whether `eexec' + is real. + + * src/type42/t42parse.c (t42_parse_encoding): Improve boundary + checking while parsing. + + * docs/CHANGES: Updated. + +2003-10-21 Josselin Mouette + + * include/freetype/internal/t1types.h (T1_FontRec): `paint_type' + and `stroke_width' aren't pointers. + + * src/type42/t42objs.c (T42_Face_Done), src/type1/t1objs.c + (T1_Face_Done): Don't free `paint_type' and `stroke_width'. + +2003-10-20 Graham Asher + + * src/winfonts/winfnt.c (fnt_cmap_class): Fix position of `const'. + +2003-10-19 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Patch from + 2003-08-18 introduced a severe bug (FT_Render_Glyph was called + twice under some circumstances, causing strange results). This + is fixed now by clearing the FT_LOAD_RENDER bit of `load_flags'. + + * src/base/ftpfr.c (FT_Get_PFR_Metrics): Initialize `error'. + * src/psaux/psobjs.c (ps_tobytes): Initialize `n'. + * src/type42/t42parse.c (t42_parse_sfnts): Initialize `string_size'. + +2003-10-16 Werner Lemberg + + Completely revised Type 42 parser. It now handles both fonts + produced with ttftot42 (tested version 0.3.1) and + TrueTypeToType42.ps (tested version May 2001; it is necessary to + fix the broken header comment to be `%!PS-TrueTypeFont...'). + + * src/type42/t42objs.c (T42_GlyphSlot_Load): Change fourth + parameter to `FT_UInt'. + * src/type42/t42objs.h: Updated. + + * src/type42/t42parse.h (T42_ParserRec): Change type of `in_memory' + to FT_Bool. + (T42_Loader): Change type of `num_chars' and `num_glyphs' to + FT_UInt. + Add `swap_table' element. + * src/type42/t42parse.c (T42_KEYWORD_COUNT, T1_ToFixed, + T1_ToCoordArray, T1_ToTokenArray): Removed. + (T1_ToBytes): New macro. + (t42_is_alpha, t42_hexval): Removed. + (t42_is_space): Handle `\0'. + (t42_parse_encoding): Updated to use new PostScript parser routines + from psaux. + Handle `/Encoding [ ... ]' also. + (T42_Load_Status): New enumeration. + (t42_parse_sfnts): Updated to use new PostScript parser routines + from psaux. + (t42_parse_charstrings): Updated to use new PostScript parser + routines from psaux. + Handle `/CharStrings << ... >>' also. + Don't expect that /.notdef is the first element in dictionary. Copy + code from type1 module to handle this. + (t42_parse_dict): Updated to use new PostScript parser routines + from psaux. + Remove code for synthetic fonts (which can't occur in Type 42 + fonts). + (t42_loader_done): Release `swap_table'. + + * src/psaux/psobjs.c (skip_string): Increase `cur' properly. + + * src/type1/t1load.c (parse_charstrings): Make test for `.notdef' + faster. + +2003-10-15 Graham Asher + + * src/autohint/ahglobal.c (blue_chars), src/winfonts/winfnt.c + (fnt_cmap_class_rec, fnt_cmap_class), src/bdf/bdflib.c (empty, + _num_bdf_properties), src/gzip/infutil.c (inflate_mask), + src/gzip/inffixed.h (fixed_bl, fixed_bd, fixed_tl, fixed_td), + src/gzip/inftrees.h (inflate_trees_fixed), srf/gzip/inftrees.c + (inflate_trees_fixed): Decorate with more `const' to avoid + writable global variables which are disallowed on ARM. + +2003-10-08 Werner Lemberg + + * src/type1/t1load.c (parse_font_matrix, parse_charstrings): Remove + code specially for synthetic fonts; this is handled elsewhere. + (parse_encoding): Remove code specially for synthetic fonts; this is + handled elsewhere. + Improve boundary checking while parsing. + (parse_dict): Improve boundary checking while parsing. + Use ft_memcmp to simplify code. + +2003-10-07 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_dict): Handle synthetic + fonts properly. + (parse_charstrings): Copy correct number of characters into + `name_table'. + +2003-10-06 Werner Lemberg + + Heavy modification of the PS parser to handle comments and strings + correctly. This doesn't slow down the loading of PS fonts + significantly since charstrings aren't affected. + + * include/freetype/config/ftstdlib.h (ft_xdigit): Renamed to... + (ft_isxdigit): This. Updated all callers. + (ft_isdigit): New alias to `isdigit'. + + * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): Renamed + `skip_alpha' to `skip_PS_token'. + Add parameter to `to_bytes' and change some argument types. + + * src/psaux/psauxmod.c (ps_parser_funcs): Updated. + * src/psaux/psobjs.c (ft_char_table): New array to map character + codes (ASCII and EBCDIC) of digits to numbers. + (OP): New auxiliary macro holding either `>=' or `<' depending on + the character encoding. + (skip_comment): New function. + (skip_spaces): Use it. + (skip_alpha): Removed. + (skip_literal_string, skip_string): New functions. + (ps_parser_skip_PS_token): New function. This is a better + replacement of... + (ps_parser_skip_alpha): Removed. + (ps_parser_to_token, ps_parser_to_token_array): Updated. + (T1Radix): Rewritten, using `ft_char_table'. + (t1_toint): Renamed to... + (ps_toint): This. Update all callers. + Use `ft_char_table'. + (ps_tobytes): Add parameter to handle delimiters and change some + argument types. + Use `ft_char_table'. + (t1_tofixed): Renamed to... + (ps_tofixed): This. Update all callers. + Use `ft_char_table'. + (t1_tocoordarray): Renamed and updated to... + (ps_tocoordarray): This. Update all callers. + (t1_tofixedarray): Renamed and updated to... + (ps_tofixedarray): This. Update all callers. + (t1_tobool): Renamed to... + (ps_tobool): This. Update all callers. + (ps_parser_load_field): Updated. + (ps_parser_load_field_table): Use `T1_MAX_TABLE_ELEMENTS' + everywhere. + (ps_parser_to_int, ps_parser_to_fixed, ps_parser_to_coord_array, + ps_parser_to_fixed_array): Skip spaces. Updated. + (ps_parser_to_bytes): Add parameter to handle delimiters and change + some argument types. Updated. + * src/psaux/psobjs.h: Updated. + + * src/cid/cidload.c (cid_parse_dict): Updated. + * src/cid/cidparse.c (cid_parser_new): Check whether the `StartData' + token was really found. + * src/cid/cidparse.h (cid_parser_skip_alpha): Updated and renamed + to... + (cid_parser_skip_PS_token): This. + + * src/type1/t1parse.h (T1_ParserRec): Use `FT_Bool' for boolean + fields. + (T1_Skip_Alpha): Replaced with... + (T1_Skip_PS_Token): This new macro. + * src/type1/t1parse.c (hexa_value): Removed. + (T1_Get_Private_Dict): Use `ft_isxdigit' and + `psaux->ps_parser_funcs_to_bytes' for handling ASCII hexadecimal + encoding. + After decrypting, replace the four random bytes at the beginning + with whitespace. + * src/type1/t1load.c (t1_allocate_blend): Use proper error values. + (parser_blend_design_positions, parse_blend_design_map, + parse_weight_vector): Updated. + (is_space): Handle `\f' also. + (is_name_char): Removed. + (read_binary_data): Updated. + (parse_encoding): Use `ft_isdigit'. + Updated. + (parse_subrs): Updated. + (TABLE_EXTEND): New macro. + (parse_charstrings): Updated. + Provide a workaround for buggy fonts which have more entries in the + /CharStrings dictionary then expected; the function now adds some + slots and skips entries which still exceed the new limit. + (parse_dict): Updated. + Terminate on the token `closefile'. + + * src/type42/t42parse.c (T1_Skip_Alpha): Replaced with... + (T1_Skip_PS_Token): This new macro. Updated all callers. + (t42_parse_encoding): Use `ft_isdigit'. + + + * src/base/ftmm.c (ft_face_get_mm_service): Return FT_Err_OK if + success. + +2003-10-05 Werner Lemberg + + * include/freetype/ftmodule.h: Renamed to... + * include/freetype/ftmodapi.h: This to avoid duplicate file names. + * include/freetype/config/ftheader.h (FT_MODULE_H): Updated. + +2003-10-04 Werner Lemberg + + * src/base/ftoutln.c (FT_OrientationExtremumRec, + FT_Outline_Get_Orientation): Trivial typo fixes to make it compile. + +2003-10-02 Markus F.X.J. Oberhumer + + * src/winfonts/winfnt.c (FT_WinFNT_HeaderRec): `color_table_offset' + has four bytes, not two. + Fix all users. + (fnt_font_load, FNT_Load_Glyph): Add more font validity tests. + +2003-10-01 David Turner + + * src/autofit/*: Adding first source files of the new multi-script + `auto-fitter'. + + * include/freetype/ftoutln.h (FT_Orientation): New enumeration. + (FT_Outline_Get_Orientation): New declaration. + + * src/base/ftoutln.c (FT_OrientationExtremumRec): New structure. + (ft_orientation_extremum_compute): New auxiliary function. + (FT_Outline_Get_Orientation): New function to compute the fill + orientation of a given glyph outline. + + * include/freetype/internal/ftserv.h (FT_FACE_LOOKUP_SERVICE): Fixed + trivial bug which could crash the font engine when a cached service + pointer was retrieved. + +2003-09-30 Werner Lemberg + + * src/cid/cidload.c (cid_parse_dict): Skip token if no keyword is + found. + + * src/type1/t1parse.c (IS_T1_WHITESPACE, IS_T1_LINESPACE, + IS_T1_SPACE): Removed. + (PFB_Tag): Removed. + (read_pfb_tag): Don't use PFB_Tag. + + * src/type42/t42parse.c (t42_is_space): Handle `\f' also. + (t42_parse_encoding): Handle synthetic fonts. + +2003-09-29 Werner Lemberg + + * include/freetype/internal/t1types.h: Don't include + FT_INTERNAL_OBJECTS_H but FT_INTERNAL_SERVICE_H. + * src/truetype/ttobjs.c: Don't include + FT_SERVICE_POSTSCRIPT_NAMES_H. + +2003-09-29 David Turner + + Added new service to handle glyph name dictionaries, replacing the + old internal header named `psnames.h' by `services/svpsname.h'. + Note that this is different from `services/svpostnm.h' which only + handles the retrieval of PostScript font names for a given face. + (Should we merge these two services into a single header?) + + * include/freetype/internal/psnames.h: Removed. Most of its + contents is moved to... + * include/freetype/internal/services/svpsname.h: New file. + + * include/freetype/internal/services/svpostnm.h + (FT_SERVICE_ID_POSTSCRIPT_NAME): Replaced with... + (FT_SERVICE_ID_POSTSCRIPT_FONT_NAME): New macro. + (PsName): Service named changed to... + (PsFontName): This. + Updated `FT_Service_PsName' -> `FT_Service_PsFontName' and + `POSTSCRIPT_NAME' -> `POSTSCRIPT_FONT_NAME' everywhere. + + * include/freetype/internal/internal.h + (FT_INTERNAL_POSTSCRIPT_NAMES_H): Removed. + * include/freetype/internal/psaux.h: Include + FT_SERVICE_POSTSCRIPT_NAMES_H. + (T1_DecoderRec): Updated type of `psnames'. + * include/freetype/internal/t1types.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + Include FT_INTERNAL_OBJECTS_H. + * include/freetype/internal/t42types.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H. + * include/freetype/internal/tttypes.h (TT_FaceRec): Updated. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): Changed + order of parameters. All callers updated. + (FT_FACE_FIND_GLOBAL_SERVICE): New macro to look up a service + globally, checking all modules. + (FT_ServiceCacheRec): Updated. + (FT_SERVICE_POSTSCRIPT_NAMES_H): New macro for accessing + `svpsname.h'. + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c + (ft_module_get_service): New function. + + * src/cff/cffdrivr.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_get_glyph_name, cff_get_name_index): Use new POSTSCRIPT_NAMES + service. + * src/cff/cffcmap.c (cff_cmap_unicode_init): Updated. + * src/cff/cffload.c, src/cff/cffload.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_index_get_sid_string): Updated. + * src/cff/cffobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_face_init): Use new POSTSCRIPT_NAMES service. + * src/cff/cffobjs.h: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + + * src/cid/cidobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cid_face_init): Use new POSTSCRIPT_NAMES service. + * src/cid/cidriver.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H. + + * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Use + new POSTSCRIPT_NAMES service. + * src/psaux/t1decode.h (t1_lookup_glyph_by_stdcharcode, + t1_decode_init): Use new POSTSCRIPT_NAMES service. + * src/psaux/t1cmap.h, src/psaux/t1decode.h: Dont' include + FT_INTERNAL_POSTSCRIPT_NAMES_H. + + * src/psnames/psmodule.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (ps_build_unicode_table): Renamed to... + (ps_unicodes_init): This. + (ps_lookup_unicode): Renamed to... + (ps_unicodes_char_index): This. + (ps_next_unicode): Renamed to... + (ps_unicodes_char_next): This. + (psnames_interface): Updated. + (psnames_services): New services list. + (psnames_get_service): New function. + (psnames_module_class): Updated. + + * src/sfnt/sfobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (sfnt_init_face): Use new POSTSCRIPT_NAMES service. + * src/sfnt/ttpost.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (tt_face_get_ps_name): Updated. + + * src/truetype/ttobjs.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + + * src/type1/t1driver.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + * src/type1/t1objs.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (T1_Face_Init): Use new POSTSCRIPT_NAMES service. + + * src/type42/t42drivr.c (t42_get_ps_name): Renamed to... + (t42_get_ps_font_name): This. + (t42_service_ps_name): Renamed to... + (t42_service_ps_font_name): This. + (t42_services): Updated. + * src/type42/t42objs.c (T42_Face_Init): Use new POSTSCRIPT_NAMES + service. + * src/type42/t42objs.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + + + * src/base/ftglyph.c (FT_Get_Glyph): Don't access `slot' before + testing its validity. Reported by Henry Maddocks + . + +2003-09-21 Werner Lemberg + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): + Fix compilation warning (s/pptr/Pptr/). + + * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H, + FT_INTERNAL_FNT_TYPES_H): Removed. + +2003-09-21 David Turner + + Migrating the PFR and WINFNT drivers to the new service-based + internal API. + + * include/freetype/internal/fnttypes.h: Removed. Most of its data + are moved to winfnt.h and... + * include/freetype/internal/services/svwinfnt.h: New file. + + * include/freetype/internal/pfr.h: Removed. Most of its data are + moved to... + * include/freetype/internal/services/svpfr.h: New file. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_LOOKUP_SERVICE): Simplify fix of 2003-09-16 by removing + pointer type argument. + Updated all callers. + Update macro names of services header files. + + * src/base/ftobjs.c (FT_Get_Name_Index): Simplified code. + + * src/base/ftpfr.c: Include FT_SERVICE_PFR_H instead of + FT_INTERNAL_PFR_H. + (ft_pfr_check, FT_Get_PFR_Metrics, FT_Get_PFR_Kerning, + FT_Get_PFR_Advance): Use services provided in `PFR_METRICS'. + + * src/base/ftwinfnt.c: Include FT_SERVICE_WINFNT_H instead of + FT_INTERNAL_FNT_TYPES_H. + (FT_Get_WinFNT_Header): Use service provided in `WINFNT'. + + * src/pfr/pfrdrivr.c: Include FT_SERVICE_PFR_H and + FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_PFR_H. + (pfr_service_bdf): Updated. + (pfr_services): New services list. + (pfr_get_service): New function. + (pfr_driver_class): Updated. + + * src/winfonts/winfnt.c: Include FT_SERVICE_WINFNT_H and + FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_FNT_TYPES_H. + (winfnt_get_header, winfnt_get_service): New functions. + (winfnt_service_rec): New structure providing WINFNT services. + (winfnt_services): New services list. + (winfnt_driver_class): Updated. + * src/winfonts/winfnt.h: Add most of the removed fnttypes.h data. + + * src/sfnt/sfdriver.c (sfnt_service_ps_name): Fix typo. + + * src/type1/t1driver.c (t1_service_ps_name): Fix typo. + + * src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrsbit.c, + src/psaux/psobjs.c, src/sfnt/sfobjs.c, src/truetype/ttobjs.c, + src/type1/t1objs.c, src/type42/t42objs.c: Removing various compiler + warnings. + +2003-09-19 David Bevan + + * src/type1/t1parse.c (pfb_tag_fields): Removed. + (read_pfb_tag): Fix code so that it doesn't fail on end-of-file + indicator (0x8003). + * docs/CHANGES: Updated. + +2003-09-16 Werner Lemberg + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_LOOKUP_SERVICE): Add parameter to pass pointer type. + Ugly, I know, but this is needed for compilation with C++ -- + maybe someone knows a better solution? + Updated all callers. + + * src/base/ftobjs.c (FT_Get_Name_Index, FT_Get_Glyph_Name): Remove + C++ compiler warnings. + + * src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): + Fix order of arguments passed to FT_FACE_FIND_SERVICE. + +2003-09-15 Werner Lemberg + + Avoid header files with identical names. + + * include/freetype/internal/services/bdf.h: Renamed to... + * include/freetype/internal/services/svbdf.h: This. + Add copyright notice. + * include/freetype/internal/services/glyfdict.h: Renamed to... + * include/freetype/internal/services/svgldict.h: This. + Add copyright notice. + * include/freetype/internal/services/multmast.h: Renamed to... + * include/freetype/internal/services/svmm.h: This. + Add copyright notice. + Add FT_BEGIN_HEADER and FT_END_HEADER. + * include/freetype/internal/services/sfnt.h: Renamed to... + * include/freetype/internal/services/svsfnt.h: This. + Add copyright notice. + * include/freetype/internal/services/postname.h: Renamed to... + * include/freetype/internal/services/svpostnm.h: This. + Add copyright notice. + * include/freetype/internal/services/xf86name.h: Renamed to... + * include/freetype/internal/services/svxf86nm.h: This. + Add copyright notice. + + * include/freetype/internal/ftserv.h: Add FT_BEGIN_HEADER and + FT_END_HEADER. + Add copyright notice. + Update macro names of services header files. + + * builds/freetype.mk (SERVICES_DIR): New variable. + (BASE_H): Add services header files. + +2003-09-11 Werner Lemberg + + * builds/toplevel.mk (distclean): Remove `builds/unix/freetype2.pc'. + + * src/cff/cffdrivr.c: Don't load headers twice. + + * include/freetype/internal/ftserv.h (FT_SERVICE_SFNT_H): New macro. + * src/base/ftobjs.c: Include FT_SERVICE_SFNT_H. + + * src/cff/cffcmap.c: Include `cfferrs.h'. + * src/pfr/pfrdrivr.c: Include `pfrerror.h'. + * src/sfnt/sfdriver.c: Include `sferrors.h'. + * src/psaux/psobjs.h: Add declaration for `ps_parser_to_bytes'. + +2003-09-11 David Turner + + Introducing the concept of `module services'. This is the first + step towards a massive simplification of the engine's internals, in + order to get rid of various numbers of hacks. + + Note that these changes will break source & binary compatibility for + authors of external font drivers. + + * include/freetype/config/ftconfig.h (FT_BEGIN_STMNT, FT_END_STMNT, + FT_DUMMY_STMNT): New macros. + + * include/freetype/internal/ftserv.h: New file, containing the new + structures and macros to provide `services'. + + * include/freetype/internal/internal.h (FT_INTERNAL_EXTENSION_H, + FT_INTERNAL_EXTEND_H, FT_INTERNAL_HASH_H, FT_INTERNAL_OBJECT_H): + Removed, obsolete. + (FT_INTERNAL_SERVICE_H): New macro for `ftserv.h'. + + * include/freetype/internal/services/bdf.h, + include/freetype/internal/services/glyfdict.h, + include/freetype/internal/services/postname.h, + include/freetype/internal/services/xf86name.h: New files. + + * include/freetype/ftmm.h (FT_Get_MM_Func, FT_Set_MM_Design_Func, + FT_Set_MM_Blend_Func): Function pointers moved (in modified form) + to... + * include/freetype/internal/services/multmast.h: New file. + + * include/freetype/internal/sfnt.h (SFNT_Interface): `get_interface' + is now of type `FT_Module_Requester'. + (SFNT_Get_Interface_Func, SFNT_Load_Table_Func): Function pointers + moved (in modified form) to... + * include/freetype/internal/services/sfnt.h: New file. + + * include/freetype/tttables.h (FT_Get_Sfnt_Table_Func): Function + pointer moved (in modified form) to `services/sfnt.h'. + + * include/freetype/ftmodule.h (FT_Module_Interface): Make it a + a typedef to `FT_Pointer'. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add + `postscript_name'. + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove + `postscript_name'. + Add `services' element. + (FT_LibraryRec): Remove `meta_class'. + + * src/base/ftbdf.c: Include FT_SERVICE_BDF_H. + (test_font_type): Removed. + (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Use services + provided in `FT_SERVICE_ID_BDF'. + + * src/base/ftmm.c: Include FT_SERVICE_MULTIPLE_MASTERS_H. + (ft_face_get_mm_service): New auxiliary function to get services + from `FT_SERVICE_ID_MULTI_MASTERS'. + (FT_Get_Multi_Master, FT_Set_MM_Design_Coordinates, + FT_Set_MM_Blend_Coordinates): Use `ft_face_get_mm_service'. + + * src/base/ftobjs.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and + FT_SERVICE_GLYPH_DICT_H. + (ft_service_list_lookup): New function to get a specific service. + (destroy_face): Updated. + (Mac_Read_POST_Resource): Simplify some code. + (IsMacResource): Fix warnings. + (FT_Get_Name_Index, FT_Get_Glyph_Name): Use services provided in + `FT_SERVICE_ID_GLYPH_DICT'. + (FT_Get_Postscript_Name): Use service provided in + `FT_SERVICE_ID_POSTSCRIPT_NAME'. + (FT_Get_Sfnt_Table, FT_Load_Sfnt_Table): Use services provided in + `FT_SERVICE_ID_SFNT_TABLE'. + + * src/base/ftxf86.c: Include FT_SERVICE_XFREE86_NAME_H. + (FT_Get_X11_Font_Format): Use service provided in + `FT_SERVICE_ID_XF86_NAME'. + + * src/bdf/bdfdrivr.c: Include FT_SERVICE_BDF_H and + FT_SERVICE_XFREE86_NAME_H. + (bdf_get_charset_id): New function. + (bdf_service_bdf): New structure providing BDF services. + (bdf_services): New services list. + (bdf_driver_requester): Use `ft_service_list_lookup'. + + * src/cff/cffdrivr.c: Include FT_SERVICE_XFREE86_NAME_H and + FT_SERVICE_GLYPH_DICT_H. + (cff_service_glyph_dict): New structure providing CFF services. + (cff_services): New services list. + (cff_get_interface): Use `ft_service_list_lookup'. + + * src/cid/cidriver.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and + FT_SERVICE_XFREE86_NAME_H. + (cid_service_ps_name): New structure providing CID services. + (cid_services): New services list. + (cid_get_interface): Use `ft_service_list_lookup'. + + * src/pcf/pcfdrivr.c: Include FT_SERVICE_BDF_H and + FT_SERVICE_XFREE86_NAME_H. + (pcf_service_bdf): New structure providing PCF services. + (pcf_services): New services list. + (pcf_driver_requester): Use `ft_service_list_lookup'. + + * src/sfnt/sfdriver.c: Include FT_SERVICE_GLYPH_DICT_H and + FT_SERVICE_POSTSCRIPT_NAME_H. + (get_sfnt_glyph_name): Renamed to... + (sfnt_get_glyph_name): This. + (get_sfnt_postscript_name): Renamed to... + (sfnt_get_ps_name): This. + Updated. + (sfnt_service_glyph_dict, sfnt_service_ps_name): New structures + providing services. + (sfnt_services): New services list. + (sfnt_get_interface): Use `ft_service_list_lookup'. + + * src/truetype/ttdriver.c: Include FT_SERVICE_XFREE86_NAME_H. + (tt_services): New services list. + (tt_get_interface): Use `ft_service_list_lookup'. + + * src/type1/t1driver.c: Include FT_SERVICE_MULTIPLE_MASTERS_H, + FT_SERVICE_GLYPH_DICT_H, FT_SERVICE_XFREE86_NAME_H, and + FT_SERVICE_POSTSCRIPT_NAME_H. + (t1_service_glyph_dict, t1_service_ps_name, + t1_service_multi_masters): New structures providing Type 1 services. + (t1_services): New services list. + (Get_Interface): Use `ft_service_list_lookup'. + + * src/type42/t42drivr.c: Include FT_SERVICE_XFREE86_NAME_H, + FT_SERVICE_GLYPH_DICT_H, and FT_SERVICE_POSTSCRIPT_NAME_H. + (t42_service_glyph_dict, t42_service_ps_name): New strucures + providing Type 42 services. + (t42_services): New services list. + (T42_Get_Interface): Use `ft_service_list_lookup'. + + + * README, docs/CHANGES: Updating version numbers for 2.1.6, and + removing obsolete warnings in the documentation. + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. + * builds/unix/configure.ac (version_info): Set to 9:5:3. + * builds/unix/configure: Regenerated. + + * include/freetype/internal/ftcore.h, + include/freetype/internal/ftexcept.h, + include/freetype/internal/fthash.h, + include/freetype/internal/ftobject.h: Removed. Obsolete. + +2003-09-09 David Turner + + Fixing PFR kerning support. The tables within the font file contain + (charcode,charcode) kerning pairs, we need to convert them to + (gindex,gindex). + + * src/base/ftpfr.c (ft_pfr_check): Fix serious typo. + * src/pfr/prfload.c: Remove dead code. + (pfr_get_gindex, pfr_compare_kern_pairs, pfr_sort_kerning_pairs): + New functions. + (pfr_phy_font_done): Free `kern_pairs'. + (pfr_phy_font_load): Call `pfr_sort_kerning_pairs'. + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Fix kerning extraction. + * src/pfr/pfrtypes.h (PFR_KERN_PAIR_INDEX): New macro. + (PFR_KernPairRec): Make `kerning' an FT_Int. + (PFR_PhyFontRec): New element `kern_pairs'. + (PFR_KernFlags): Values of PFR_KERN_2BYTE_CHAR and + PFR_KERN_2BYTE_ADJ were erroneously reversed. + + * include/freetype/ftoption.h: Commenting out the macro + TT_CONFIG_OPTION_BYTECODE_INTERPRETER. + +2003-09-02 David Turner + + + * Version 2.1.5 released. + ========================= + + +2003-08-31 Manish Singh + + * src/bdf/bdflib.c (_bdf_readstream): Don't use FT_MEM_COPY but + FT_MEM_MOVE. + +2003-08-30 Werner Lemberg + + * include/freetype/freetype.h (FT_ENCODING_SJIS, FT_ENCODING_GB2312, + FT_ENCODING_BIG5, FT_ENCODING_WANSUNG, FT_ENCODING_JOHAB): New + enumerations of FT_Encoding. The FT_ENCODING_MS_* variants except + FT_ENCODING_MS_SYMBOL are now deprecated. + Updated all users. + * docs/CHANGES: Document it. + +2003-08-27 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Accept lowercase characters + for spacing. + +2003-08-27 Mike FABIAN + + * src/pcf/pcfread.c (pcf_load_font), src/bdf/bdfdrivr.c + (BDF_Face_Init): Accept lowercase characters for slant and weight. + +2003-08-18 David Turner + + * include/freetype/config/ftoption.h: Disabling TrueType bytecode + interpreter until the UNPATENTED_HINTING works as advertised. + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Use `|' for + setting `load_flags'. + + * Jamfile: Adding the `refdoc' target to the Jamfile in order to + build the API Reference in `docs/reference' automatically. + + * include/freetype/t1tables.h (PS_FontInfoRec), src/cid/cidtoken.h, + src/type1/t1tokens.h, src/type42/t42parse.c: Resetting the types of + `italic_angle', `underline_position', and `underline_thickness' to + their previous values (i.e., long, short, and ushort) in order to + avoid breaking binary compatibility. + + * include/freetype/ttunpat.h: Fixing documentation comment. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (TT_CONFIG_OPTION_OPTION_COMPILE_UNPATENTED_HINTING): Replaced + with... + (TT_CONFIG_OPTION_UNPATENTED_HINTING): This. Updated all users. + (TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): Removed. + + * include/freetype/internal/ftobjs.h (FT_DEBUG_HOOK_TYPE1): Removed. + (FT_DEBUG_HOOK_UNPATENTED_HINTING): New macro. Use this with + `FT_Set_Debug_Hook' to get the same effect as the removed + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING. + + * src/truetype/ttobjs.c (tt_face_init): Use + `FT_DEBUG_HOOK_UNPATENTED_HINTING'. + +2003-08-06 Werner Lemberg + + * src/type1/t1gload.c (T1_Load_Glyph), src/cff/cffgload.c + (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph): Fix + previous change. + +2003-08-05 Werner Lemberg + + * src/type1/t1gload.c (T1_Load_Glyph), src/cff/cffgload.c + (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph): Apply + font matrix to advance width also. + * docs/CHANGES: Updated. + +2003-07-26 Werner Lemberg + + * builds/unix/configure.ac (version_info): Set to 9:4:3. + * builds/unix/configure: Updated. + * docs/CHANGES, docs/VERSION.DLL: Updated. + + * include/freetype/freetype.h (FT_GlyphSlot): Change 2003-06-16 + also breaks binary compatibility. Reintroduce an unsigned integer + at the old position of `flags' called `reserved'. + +2003-07-25 Werner Lemberg + + Make API reference valid HTML 4.01 transitional. + + * src/tools/docmaker/tohtml.py (html_header_1): Add doctype + and charset. + (html_header_2): Fix style elements and add some more. + Fix syntax. + (block_header, block_footer, description_header, description_footer, + marker_header, marker_footer, source_header, source_footer, + chapter_header): Don't use
...
but `align=center' + table attribute. + (chapter_inter, chapter_footer): Add
  • and use special
      + class. + Use double quotes around table widths given in percent. + (keyword_prefix, keyword_suffix): Don't change font colour directly + but use a new class. + (section_synopsis_header, section_synopsis_footer): Don't change + colour. + (code_header, code_footer): Don't change font colour directly but + use a special
       class.
      +	(print_html_field):  gets the `valign' attribute, not .
      +	(print_html_field_list): Ditto.
      +	(index_exit): Don't use 
      ...
      but `align=center' + table attribute. + (section_enter): Ditto. + (toc_exit): Don't emit
      . + (block_enter): Use

      , not

      . + (__init__): Fix tag order in self.html_footer. + +2003-07-25 David Turner + + This change reimplements fix from 2003-05-30 without breaking + binary compatibility. + + * include/freetype/t1tables.h (PS_FontInfoRec): `italic_angle', + `is_fixed_pitch', `underline_position', `underline_thickness' are + reverted to be normal values. + + * include/freetype/internal/psaux.h (T1_FieldType): Remove + `T1_FIELD_TYPE_BOOL_P', `T1_FIELD_TYPE_INTEGER_P', + `T1_FIELD_TYPE_FIXED_P', `T1_FIELD_TYPE_FIXED_1000_P'. + (T1_FIELD_TYPE_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P, + T1_FIELD_FIXED_1000_P): Removed. + (T1_FIELD_TYPE_BOOL): Renamed to... + (T1_FIELD_BOOL): New macro. Updated all callers. + + * src/type42/t42parse.c: `italic_angle', `is_fixed_pitch', + `underline_position', `underline_thickness', `paint_type', + `stroke_width' are reverted to be normal values. + (T42_KEYWORD_COUNT): New macro. + (t42_parse_dict): New array `keyword_flags' to mark that a value has + already been assigned to a dictionary entry. + * src/type42/t42objs.c (T42_Face_Init, T42_Face_Done): Updated. + + * src/cid/cidtoken.h: `italic_angle', `is_fixed_pitch', + `underline_position', `underline_thickness' are reverted to be + normal values. + * src/cid/cidobjs.c (cid_face_done, cid_face_init): Updated. + + * src/psaux/psobjs.c (ps_parser_load_field): Updated. + + * src/type1/t1tokens.h: `italic_angle', `is_fixed_pitch', + `underline_position', `underline_thickness', `paint_type', + `stroke_width' are reverted to be normal values. + * src/type1/t1objs.c (T1_Face_Done, T1_Face_Init): Updated. + * src/type1/t1load.c (T1_FIELD_COUNT): New macro. + (parse_dict): Add parameter for keyword flags. + Record only first instance of a field. + (T1_Open_Face): New array `keyword_flags'. + +2003-07-24 Werner Lemberg + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. + * builds/unix/configure.ac (version_info): Set to 10:0:3. + * builds/unix/configure: Updated. + * builds/freetype.mk (refdoc): Fix --title. + + * docs/CHANGES, docs/VERSION.DLL, README: Updated. + + * src/tools/docmaker/sources.py (re_crossref): Fix regular + expression to handle trailing punctuation characters. + * src/tools/docmaker/tohtml.py (make_html_word): Updated. + + * docs/release: New file. + +2003-07-23 YAMANO-UCHI Hidetoshi + + * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): New + member function `to_bytes'. + + * src/psaux/psauxmod.c (ps_parser_funcs): New member + `ps_parser_to_bytes'. + (psaux_module_class): Increase version to 0x20000L. + + * src/psaux/psobjs.c (IS_T1_LINESPACE): Add \f. + (IS_T1_NULLSPACE): New macro. + (IS_T1_SPACE): Add it. + (skip_spaces, skip_alpha): New functions. + (ps_parser_skip_spaces, ps_parser_skip_alpha): Use them. + (ps_tobytes, ps_parser_to_bytes): New functions. + +2003-07-07 Werner Lemberg + + * builds/freetype.mk (DOC_DIR): New variable. + (refdoc): Use *_DIR variables. + (distclean): Remove documentation files. + + * builds/detect.mk (std_setup, dos_setup): Mention `make refdoc'. + + * configure: Set DOC_DIR variable. + +2003-07-07 Patrik Hägglund + + * builds/freetype.mk (refdoc): New target to build the + documentation. + (.PHONY): Updated. + + * include/freetype/freetype.h: Improve documentation of FT_CharMap. + * include/freetype/ftimage,h: Fix documentation of FT_OUTLINE_FLAGS. + * include/freetype/tttables.h: Document FT_Sfnt_Tag. + +2003-07-06 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfread.c + (pcf_load_font): Fix computation of height if PIXEL_SIZE property is + missing. + +2003-07-01 Werner Lemberg + + * src/cache/ftcsbits.c (ftc_sbit_node_compare): Only add `size' if + there is no error. Reported by Knut St. Osmundsen + . + +2003-06-30 Werner Lemberg + + A new try to synchronize bitmap font access. + + * include/freetype/freetype.h (FT_Bitmap_Size): `height' is now + defined to return the baseline-to-baseline distance. This was + already the value returned by the BDF and PCF drivers. + + The `width' field now gives the average width. I wasn't able to + find something better. It should be taken as informative only. + + New fields `size', `x_ppem', and `y_ppem'. + + * src/pcf/pcfread.c (pcf_load_font): Updated to properly fill + FT_Bitmap_Size. + Do proper rounding and conversion from 72.27 to 72 points. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Updated to properly fill + FT_Bitmap_Size. + Do proper rounding and conversion from 72.27 to 72 points. + + * src/sfnt/sfobjs.c (sfnt_load_face): Updated to properly fill + FT_Bitmap_Size. + + * src/winfonts/winfnt.c (FNT_Face_Init): Updated to properly fill + FT_Bitmap_Size. + +2003-06-29 Werner Lemberg + + Redesigning the FNT driver to return multiple faces, not multiple + strikes. At least one font (app850.fon from WinME) contains + different FNT charmaps for its subfonts. Consequently, the previous + design of having multiple bitmap strikes in a single font face fails + since we have only one charmap per face. + + * include/freetype/internal/fnttypes.h (FNT_Size_Rec): Removed. + (FNT_FaceRec): Remove `num_fonts' field and replace `fonts' with + `font'. + + * src/base/ftwinfnt.c (FT_Get_WinFNT_Header): Updated. + + * src/winfonts/winfnt.c (fnt_font_load): Don't set pixel_width equal + to pixel_height. + (fnt_face_done_fonts): Removed. + (fnt_face_get_dll_fonts): Renamed to... + (fnt_face_get_dll_font): This. Add second function argument to + select face index. + Updated to load just one subfont. + (fnt_font_done, FNT_Face_Done): Updated. + (FNT_Face_Init): Handle `face_index'. + Updated. + (FNT_Size_Set_Pixels): Simplified; similar to BDF and PCF, the + bitmap width is now ignored. + (FNT_Load_Glyph): Updated. + Fix glyph index computation. + (winfnt_driver_class): Updated. + +2003-06-25 Owen Taylor + + * src/sfnt/ttload.c (tt_face_load_hdmx): Don't assign + num_records until we actually decide to load the table, + otherwise, we'll segfault in tt_face_free_hdmx. + +2003-06-24 Werner Lemberg + + * src/cff/cffdrivr.c (cff_get_glyph_name): Protect against zero + glyph name pointer. Reported by Mikey Anbary . + +2003-06-23 Werner Lemberg + + * src/tools/glnames.py: Updated to AGL 2.0. + * src/psnames/pstables.h: Regenerated. + +2003-06-22 Werner Lemberg + + * include/freetype/cache/ftcglyph.h, include/freetype/ttnameid.h, + src/base/ftcalc.c, src/base/fttrigon.c, src/cff/cffgload.c, + src/otlayout/otlgsub.c, src/pshinter/pshrec.c, + src/psnames/psmodule.c, src/sfnt/sfobjs.c, src/truetype/ttdriver.c: + Decorate constants with `U' and `L' if appropriate. + + * include/freetype/ftmoderr.h: Updated to include recent module + additions. + + * src/pshinter/pshnterr.h (FT_ERR_BASE): Define as + `FT_Mod_Err_PShinter'. + * src/type42/t42error.h (FT_ERR_BASE): Define as + `FT_Mod_Err_Type42'. + + * src/pshinter/pshrec.h (PS_HINTS_MAGIC): Removed. Not used. + + * include/freetype/config/ftconfig.h [__MWERKS__]: Define FT_LONG64 + and FT_INT64. + +2003-06-21 Werner Lemberg + + * src/winfonts/winfnt.c (FNT_Load_Glyph): Use first_char in + computation of glyph_index. + (FNT_Size_Set_Pixels): To find a strike, first check pixel_height + only, then try to find a better hit by comparing pixel_width also. + Without this fix it isn't possible to access all strikes. + Also compute metrics.max_advance to be in sync with other bitmap + drivers. + + * src/base/ftobjs.c (FT_Set_Char_Size): Remove redundant code. + (FT_Set_Pixel_Size): Assign value to `metrics' after validation of + arguments. + +2003-06-20 Werner Lemberg + + Synchronize computation of height and width for bitmap strikes. The + `width' field in the FT_Bitmap_Size structure is now only useful to + enumerate different strikes. The `max_advance' field of the + FT_Size_Metrics structure should be used to get the (maximum) width + of a strike. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Don't use AVERAGE_WIDTH for + computing `available_sizes->width' but make it always equal to + `available_sizes->height'. + + * src/pcf/pcfread.c (pcf_load_font): Don't use RESOLUTION_X for + computing `available_sizes->width' but make it always equal to + `available_sizes->height'. + + * src/truetype/ttdriver.c (Set_Pixel_Sizes): Pass only single + argument to function. + + * src/psnames/psmodule.c (ps_unicode_value): Handle `.' after + `uniXXXX' and `uXXXX[X[X]]'. + +2003-06-19 Werner Lemberg + + * src/bdf/bdfdrivr.c: s/FT_Err_/BDF_Err/. + * src/cache/ftccache.c, src/cache/ftcsbits.c, src/cache/ftlru.c: + s/FT_Err_/FTC_Err_/. + * src/cff/cffcmap.c: s/FT_Err_/CFF_Err_/. + * src/pcf/pcfdrivr.c: s/FT_Err_/PCF_Err_/. + * src/psaux/t1cmap.c: Include psauxerr.h. + s/FT_Err_/PSaux_Err_/. + * src/pshinter/pshnterr.h: New file. + * src/pshinter/rules.mk: Updated. + * src/pshinter/pshalgo.c, src/pshinter/pshrec.c: Include pshnterr.h. + s/FT_Err_/PSH_Err_/. + * src/pfr/pfrdrivr.c, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c: + s/FT_Err_/PFR_Err_/. + * src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c, + src/sfnt/ttload.c: s/FT_Err_/SFNT_Err_/. + * src/truetype/ttgload.c: s/FT_Err_/TT_Err_/. + * src/gzip/ftgzip.c: Load FT_MODULE_ERRORS_H and define + FT_ERR_PREFIX and FT_ERR_BASE. + s/FT_Err_/Gzip_Err_/. + +2003-06-19 Dirck Blaskey + + * src/cff/cffload (cff_encoding_load): `nleft' must be FT_UInt, + otherwise adding 1 might wrap the result. + +2003-06-18 Werner Lemberg + + * src/psnames/psmodule.c (ps_unicode_value): Add support to + recognize `uXXXX[X[X]]' glyph names. + Don't handle glyph names starting with `uni' which have more than + four digits. + +2003-06-16 Werner Lemberg + + * include/freetype/freetype.h (FT_Open_Flags): Replaced with + #defines for the constants. + (FT_Open_Args): Change type of `flags' to FT_UInt. + (FT_GlyphSlot): Move `flags' to FT_Slot_Internal. + + * include/freetype/ftimage.h (FT_Outline_Flags, FT_Raster_Flag): + Replaced with #defines for the constants. + + * include/freetype/internal/ftobjs.h (FT_Slot_Internal): New + field `flags' (from FT_GlyphSlot). + Updated all affected source files. + (FT_GLYPH_OWN_BITMAP): New macro (from ftgloadr.h). + + * include/freetype/internal/ftgloadr.h (FT_GLYPH_OWN_BITMAP): Moved + to ftobjs.h. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Use dummy + FT_GlyphSlot_Internal object. + +2003-06-15 Werner Lemberg + + * builds/compiler/gcc.mk, builds/compiler/gcc-dev.mk (CFLAGS): + Add -fno-strict-aliasing to get rid of zillion warnings from gcc + version 3.3. + +2003-06-14 Werner Lemberg + + * include/freetype/ftglyph.h (ft_glyph_bbox_unscaled, + ft_glyph_bbox_subpixels, ft_glyph_bbox_gridfit, + ft_glyph_bbox_truncate, ft_glyph_bbox_pixels): Replaced with + FT_GLYPH_BBOX_UNSCALED, FT_GLYPH_BBOX_SUBPIXELS, + FT_GLYPH_BBIX_GRIDFIT, FT_GLYPH_BBOX_TRUNCATE, FT_GLYPH_BBOX_PIXELS. + The lowercase variants are now (deprecated aliases) to the uppercase + versions. + Updated all other files. + + * include/freetype/ftmodule.h (ft_module_font_driver, + ft_module_renderer, ft_module_hinter, ft_module_styler, + ft_module_driver_scalable, ft_module_driver_no_outlines, + ft_module_driver_has_hinter): Replaced with FT_MODULE_FONT_DRIVER, + FT_MODULE_RENDERER, FT_MODULE_HINTER, FT_MODULE_STYLER, + FT_MODULE_DRIVER_SCALABLE, FT_MODULE_DRIVER_NO_OUTLINES, + FT_MODULE_DRIVER_HAS_HINTER. + The lowercase variants are now (deprecated aliases) to the uppercase + versions. + Updated all other files. + + * src/base/ftglyph.c (FT_Glyph_Get_CBox): Handle bbox_mode better + as enumeration. + + * src/pcf/pcfdrivr.c (pcf_driver_class), src/winfonts/winfnt.c + (winfnt_driver_class), src/bdf/bdfdrivr.c (bdf_driver_class): Add + the FT_MODULE_DRIVER_NO_OUTLINES flag. + +2003-06-13 Detlef Würkner + + * src/pfr/pfrobjs.c (pfr_slot_load): Apply font matrix. + +2003-06-13 Werner Lemberg + + * builds/dos/detect.mk: Test not only for `Dos' but for `DOS' also. + + * builds/dos/dos-emx.mk, builds/compiler/emx.mk: New files for + EMX gcc compiler. + * builds/dos/detect.mk: Add target `emx'. + + * builds/compiler/watcom.mk (LINK_LIBRARY): GNU Make for DOS doesn't + like a trailing semicolon; add a dummy command. + + * src/cid/cidload.c: Remove parse_font_bbox code (already enclosed + with #if 0 ... #endif). + + * src/type1/t1tokens.h: Handle /FontName. + * src/type1/t1load.c (parse_font_name): Removed. + Remove parse_font_bbox code (already enclosed with #if 0 ... + #endif). + + * src/type42/t42parse.c (t42_parse_font_name): Removed. + Remove t42_parse_font_bbox code (already enclosed with #if 0 ... + #endif). + (t42_keywords): Handle /FontName with T1_FIELD_KEY. + +2003-06-12 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_FieldType): Add + T1_FIELD_TYPE_KEY. + (T1_FIELD_KEY): New macro. + * src/psaux/psobjs.c (ps_parser_load_field): Handle + T1_FIELD_TYPE_KEY. + + * src/cid/cidtoken.h: Use T1_FIELD_KEY for /CIDFontName. + +2003-06-11 Alexander Malmberg + + * src/cache/ftlru.c (FT_LruList_Remove_Selection): Decrease + number of nodes. + (FT_LruList_Lookup): Fix assertion for out-of-memory case. + +2003-06-11 Werner Lemberg + + * src/cid/cidload.c (cid_decrypt): Removed. + (cid_read_subrs): Use t1_decrypt from psaux module. + * src/cid/cidload.h: Updated. + * src/cid/cidgload.c (cid_load_glyph): Use t1_decrypt from psaux + module. + +2003-06-10 Werner Lemberg + + * src/cid/cidobjs.c: Apply change 2003-05-31 from . + Compute style flags. + Fix computation of root->height. + * src/cid/cidtoken.h: Handle FontBBox. + * src/cid/cidload.c (cid_load_keyword): Handle + T1_FIELD_LOCATION_BBOX. + (parse_font_bbox): Commented out. + (cid_field_record): Comment out element for parsing FontBBox. + + * src/type42/t42parse.c (t42_parse_font_bbox): Commented out. + (t42_keywords): Handle FontBBox with T1_FIELD_BBOX, not with + T1_FIELD_CALLBACK. + (t42_parse_font_bbox): Commented out. + (t42_load_keyword): Handle T1_FIELD_LOCATION_BBOX. + * src/type42/t42objs.c (T42_Face_Init): Apply change 2003-05-31 + from . + +2003-06-09 George Williams + + * src/truetype/ttinterp.c (SetSuperRound) <0x30>: Follow Apple's + TrueType specification. + (Ins_MDRP, Ins_MIRP): Fix single width cut-in test. + +2003-06-09 Detlef Würkner + + * src/gzip/ftgzip.c: (inflate_mask): Replaced with... + (NO_INFLATE_MASK): This. + * src/gzip/infutil.h: Declare `inflate_mask' conditionally by + NO_INFLATE_MASK. + +2003-06-09 Alexis S. L. Carvalho + + * src/gzip/ftgzip.c (ft_gzip_file_fill_output): Handle Z_STREAM_END + correctly. + +2003-06-09 Wolfgang Domröse + + * src/pshinter/pshglob.c (psh_globals_new): Change calculation of + dim->stdw.count to avoid compiler problem. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Move the block + variables to the beginning of the function to avoid compiler + problems. + Add casts necessary for 16bit compilers. + +2003-06-09 Werner Lemberg + + * src/pfr/rules.mk (PFR_DRV_SRC): Add pfrsbit.c. + (PFR_DRV_H): Add pfrtypes.h. + + * include/freetype/config/ftconfig.h: s/__MWKS__/__MWERKS__/. + +2003-06-08 Karl Schultz + + * src/pfr/pfrsbit.c (pfr_bitwriter_init): Change type of third + argument to FT_Bool. + (pfr_lookup_bitmap_data): Change type of third and fourth argument + to FT_UInt. Updated caller. + (pfr_load_bitmap_bits): Change type of fourth argument to FT_Bool. + +2003-06-08 Werner Lemberg + + Completely revised FreeType's make management. + + . In all makefiles `/' is used as the path separator. The + conversion to the real path separators is done as late as + possible using $(subst ...). + + . $(HOSTSEP) no longer exists. Now, $(SEP) gives the path separator + for the operating system, and the new $(COMPILER_SEP) the path + separator for the compiler tools. + + . $(BUILD) has been renamed to $(BUILD_DIR). In general, all + directory variables end with `_DIR'. The variants ending in `_' + (like `BASE_' have been removed). + + The following ChangeLog entries only describe changes which are + not related to the redesign. + + * builds/beos/beos-def.mk (BUILD_DIR): Fix typo. + * builds/compiler/watcom.mk (LINK_LIBRARY): Fix linker call to avoid + overlong arguments as suggested by J. Ali Harlow + . + * builds/dos/dos-wat.mk: New file. + * builds/freetype.mk (FREETYPE_H): Include header files from the + `devel' subdirectory. + + * builds/os2/os2-dev.mk, builds/unix/unixddef.mk, + builds/unix/unixddef.mk, builds/win32/w32-bccd.mk, + builds/win32/w32-dev.mk (BUILD_DIR): Fix path. + + * builds/unix/configure.ac, builds/unix/configure: Updated. + * builds/unix/unix-def.in (DISTCLEAN): Add `freetype2.pc'. + +2003-06-07 Werner Lemberg + + * src/base/ftmac.c (FT_New_Face_From_SFNT): s/rlen/sfnt_size/ to + make it compile. + + * devel/ftoption.h: Updated. + +2003-06-07 Detlef Würkner + + * include/freetype/internal/psaux.h, src/truetype/ttgload.h: + s/index/idx/ to fix compiler warnings. + + * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Use more `volatile' to + fix compiler warning. + + * src/gzip/ftgzip.c (BUILDFIXED): Removed. + * src/gzip/inftrees.c (inflate_trees_fixed) [!BUILDFIXED]: Use + FT_UNUSED to remove compiler warning. + +2003-06-06 Werner Lemberg + + * include/freetype/ftstroker.h: Renamed to... + * include/freetype/ftstroke.h: This. + + * src/base/ftstroker.c: Renamed to... + * src/base/ftstroke.c: This. + + * include/freetype/config/ftheader.h (FT_STROKER_H): Updated. + + * src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk: + Updated. + + * src/pcf/pcfdriver.c: Renamed to... + * src/pcf/pcfdrivr.c: This. + * src/pcf/pcfdriver.h: Renamed to... + * src/pcf/pcfdrivr.h: This. + + * src/pcf/Jamfile, src/pcf/rules.mk: Updated. + +2003-06-05 Wenlin Institute (Tom Bishop) + + * src/base/ftmac.c (file_spec_from_path) [TARGET_API_MAC_CARBON]: + Add `#if !defined(__MWERKS__)'. + +2003-06-05 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_FieldType): Add + T1_FIELD_TYPE_FIXED_1000 and T1_FIELD_TYPE_FIXED_1000_P. + (T1_FIELD_FIXED_1000, T1_FIELD_FIXED_1000_P): New macros. + * src/psaux/psobjs.c (ps_parser_load_field): Handle + T1_FIELD_TYPE_FIXED_1000 and T1_FIELD_TYPE_FIXED_1000_P. + + * src/cff/cffparse.c (cff_kind_fixed_thousand): New enumeration. + (CFF_FIELD_FIXED_1000): New macro. + (cff_parser_run): Handle cff_kind_fixed_thousand. + * src/cff/cfftoken.h: Use CFF_FIELD_FIXED_1000 for blue_scale. + * src/cff/cffload (cff_subfont_load): Fix default values of + expansion_factor and blue_scale. + + * src/cif/cidtoken.h, src/type1/t1tokens.h: Use T1_FIELD_FIXED_1000 + for blue_scale. + + * src/pshinter/pshglob.c (psh_globals_new): Fix default value of + blue_scale. + +2003-06-04 Wolfgang Domröse + + * include/freetype/internal/ftdriver.h, + include/freetype/internal/ftobjs.h, + include/freetype/internal/psaux.h, src/cid/cidgload.c, + src/psaux/psobjs.c, src/psaux/t1decode.c, src/psaux/psobjs.h, + src/pshinter/pshrec.c, src/pshinter/pshalgo.c, + src/psnames/psmodule.c, src/raster/ftraster.c, src/sfnt/sfobjs.c, + src/smooth/ftgrays.c, src/smooth/ftsmooth.c, src/truetype/ttobjs.c, + src/truetype/ttdriver.c, src/truetype/ttgload.c, src/type1/t1afm.c, + src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1load.c, + src/type1/t1objs.c, src/type42/t42parse.c, src/type42/t42parse.h: + Many casts and slight argument type changes to make it work with + a 16bit compiler. + +2003-06-04 Werner Lemberg + + * include/freetype/config/ftoption.h: Defining + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING by default is a bad idea + since some fonts (e.g. Arial) produce worse results than without + hinting. Reverted. + +2003-06-04 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Call + FT_GlyphLoader_CheckPoints before adding phantom points. This fixes + a segfault bug with fonts (e.g. htst3.ttf) which have nested + subglyphs more than one level deep. Reported by Anthony Fok. + + * include/freetype/config/ftoption.h: Define + TT_CONFIG_OPTION_BYTECODE_INTERPRETER, + TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, and + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING to make it the new + default. + +2003-06-03 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_hint_edges): Removed. Just a + wrapper for ah_hint_edges. + (ah_hint_edges): Renamed to... + (ah_hinter_hint_edges): This. + + * src/base/ftobjs.c (FT_Set_Hint_Flags): Removed. Unused. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec), + include/freetype/internal/psaux.h (T1_DecoderRec), + src/cff/cffgload.h (CFF_Builder): Remove `hint_flags' field. + Unused. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_decoder_parse_charstrings) : Call hinter->apply + with decoder->hint_mode instead of builder->hint_flags. + * src/psaux/t1decode.c (t1_decoder_init): Updated. + + * src/base/ftstroker.c (ft_stroke_border_export): s/index/idx/. + + * src/sfnt/sfobjs.c (sfnt_load_face): Commented out code which + increased root->height by 15% if the line gap was zero. There exist + fonts (containing e.g. form drawing characters) which intentionally + have a zero line gap value. + + * src/truetype/ttinterp.c (Free_Project, CUR_Func_freeProj): + Removed. Unused. + Updated all callers. + +2003-06-02 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Use symbolic names for + Adobe specific encoding IDs (there was a wrong EID value for custom + encoding). + + * src/cff/cffcmap.h (CFF_CMapStdRec): Remove `count'. + * src/cff/cffcmap.c (cff_cmap_encoding_init, + cff_cmap_encoding_done): Updated. + (cff_cmap_encoding_char_index, cff_cmap_encoding_char_next): Use + 256 as limit for character code. + +2003-06-01 Werner Lemberg + + * src/winfonts/winfnt.c (FNT_Load_Glyph): Revert change from + 2003-03-20. + +2003-05-31 Werner Lemberg + + * include/freetype/fttrigon.h (FT_Vector_Normalize): Removed. + +2003-05-31 + + * src/type1/t1objs.c (T1_Face_Init): Improve algorithm for guessing + the font style by ignoring spaces and hyphens. + + * builds/unix/freetype2.in: Fix `Version' field. + +2003-05-30 Werner Lemberg + + Avoid overwriting of numeric font dictionary entries for synthetic + fonts. Additionally, some entries were handled as `integer' instead + of `number'. + + * include/freetype/internal/psaux.h (T1_FieldType): Add + T1_FIELD_TYPE_BOOL_P, T1_FIELD_TYPE_INTEGER_P, and + T1_FIELD_TYPE_FIXED_P. + (T1_FIELD_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P): New macros. + * src/psaux/psobjs.c (ps_parser_load_field): Handle new field types. + + * include/freetype/internal/cfftypes.h (CFF_FontRecDict), + src/cff/cfftoken.h: Change type of underline_position and + underline_thickness to FT_Fixed. + * src/cff/cffload.c (cff_subfont_load): Fix default values of + underline_position and underline_thickness. + * src/cff/cffobjs.c (cff_face_init): Set underline_position + and underline_thickness in `root'. + + * include/freetype/internal/t1types.h (T1_Font): Change point_type + and stroke_width to pointers. + * include/freetype/t1tables.h (PS_FontInfo): Change italic_angle, + is_fixed_pitch, underline_position, and underline_thickness to + pointers. + * src/type1/t1tokens.h: Change italic_angle, is_fixed_pitch, + underline_position, and underline_thickness to pointers. Change + the type of the latter two to `fixed'. + Change type of stroke_width to `fixed' and make it a pointer. + Change paint_type to pointer. + * src/type1/t1objs.c (T1_Face_Done): Updated. + (T1_Face_Init): Updated. + Fix assignment of underline_position and underline_thickness. + + * src/cid/cidtoken.h: Change italic_angle, is_fixed_pitch, + underline_position, and underline_thickness to pointers. Change + the type of the latter two to `fixed'. + Change type of stroke_width to `fixed'. + * src/cid/cidobjs.c (cid_face_done): Updated. + (cid_face_init): Updated. + Fix assignment of underline_position and underline_thickness. + + * src/type42/t42parse.c: Change italic_angle, is_fixed_pitch, + underline_position, and underline_thickness to pointers. Change the + type of the latter two to `fixed'. + Change type of stroke_width to `fixed' and make it a pointer. + Change paint_type to pointer. + * src/type42/t42objs.c (T42_Face_Init): Updated. + Fix assignment of underline_position and underline_thickness. + (T42_Face_Done): Updated. + + * src/base/ftobjs.c (open_face_from_buffer): Fix compiler warning. + * src/pshinter/pshglob.c, src/pshinter/pshglob.h + (psh_globals_set_scale): Make it a local function. + + * test/gview.c: Fix renaming ps3->ps typo. + Formatting. + +2003-05-29 Werner Lemberg + + * src/pshinter/pshalgo1.[ch], src/pshinter/pshalgo2.[ch]: Removed. + * src/pshinter/pshalgo.h: Removed. + + * src/pshinter/pshalgo3.[ch]: Renamed to... + * src/pshinter/pshalgo.[ch]: New files. + s/PSH3/PSH/. + s/psh3/psh/. + s/ps3/ps/. + + * src/pshinter/pshrec.c, src/pshinter/pshinter.c: Updated. + * src/pshinter/rules.mk, src/pshinter/Jamfile: Updated. + + * src/pshinter/pshglob.[ch] (psh_dimension_snap_width): Commented + out. + + * tests/gview.c: Remove code for pshalgo1 and pshalgo2. + Updated. + +2003-05-28 Martin Zinser + + * vms_make.com: Reworked support for shareable images on VMS. The + first version was kind of a hack; the current implementation of the + procedure to extract the required symbols is much cleaner. + + Reworked creation of MMS files, avoiding a number of temporary files + which were created in the previous version. + + Further work on creating descrip.mms files on the fly. + + * builds/vms/descrip.mms, src/autohint/descrip.mms, + src/type1/descrip.mms: Removed. + +2003-05-28 Werner Lemberg + + * src/pshinter/pshalgo3.c (psh3_glyph_compute_extrema): Skip + contours with only a single point to avoid segfault. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Activate code for + handling `origin'. + +2003-05-24 Werner Lemberg + + * src/autohint/ahtypes.h (AH_OPTION_NO_STRONG_INTERPOLATION): + Removed since unused. + +2003-05-21 Werner Lemberg + + * include/freetype/config/ftstdlib.h (ft_strcat): New wrapper macro + for strcat. + + * src/base/ftmac.c (create_lwfn_name): s/isupper/ft_isupper/. + (parse_font): s/memcpy/ft_memcpy/. + (is_dfont) [TARGET_API_MAC_CARBON]: s/memcmp/ft_memcmp/. + * src/base/ftobjs.c (load_mac_face) [FT_MACINTOSH]: + s/strlen/ft_strlen/. + s/strcat/ft_strcat/. + s/strcpy/ft_strcpy/. + * src/gzip/zutil.h: s/memset/ft_memset/. + s/memcmp/ft_memcmp/. + + * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c + (PCF_Face_Init): Test for charset registry case-insensitively. + + * src/gzip/ftgzip.c (ft_gzip_fil_io): Revert change from yesterday; + it has already been fixed differently. + + * src/truetype/ttinterp.c (DO_SFVTL): Add missing braces around + if-clause. + +2003-05-21 Martin Zinser + + * t1load.c (parse_blend_axis_types): Fix compiler warning. + + * descrip.mms: Removed. Now created by... + + * vms_make.com: New file. + +2003-05-21 Weiqi Gao + + * src/gzip/ftgzip.c (ft_gzip_file_io): Avoid zero value of `delta' + to prevent infinite loop. + +2003-05-21 Lars Clausen + + * docs/VERSION.DLL: Provide better autoconf snippet to check + FreeType version. + +2003-05-21 Werner Lemberg + + * src/base/ftobjs.c (open_face): Free `internal' not + `face->internal' in case of error to avoid possible segfault. + + * src/pshinter/pshalgo3.c (ps3_hints_apply): Check whether we + actually have an outline. + +2003-05-20 David Chester + + * src/pshinter/pshalgo3.c (ps3_hints_apply): Try to optimize + y_scale so that the top of non-capital letters is aligned on a pixel + boundary whenever possible. + + * src/autohint/ahhint.c (ah_hint_edges): Make sure that lowercase + m's maintain their symmetry. + +2003-05-20 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Oops! David's + patch from yesterday has been resolved already in a different + way. Reverted. + +2003-05-19 David Chester + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Don't scale + y_scale locally but face->size->metrics.y_scale. + +2003-05-19 David Turner + + * src/sfnt/ttcmap0.c (tt_cmap4_char_next): Select proper start + value for `hi' to avoid infinite loop. + +2003-05-18 Yong Sun + + * src/raster/ftraster.c (Insert_Y_Turn): Fix overflow test. + +2003-05-18 Werner Lemberg + + * include/freetype/config/ftoption.h [FT_CONFIG_OPTION_MAC_FONTS]: + New macro. + * src/base/ftobjs.c: Use it to control mac font support on non-mac + platforms. + +2003-05-17 George Williams + + Implement partial support of Mac fonts on non-Mac platforms. + + * src/base/ftobjs.c (memory_stream_close, new_memory_stream, + open_face_from_buffer, Mac_Read_POST_Resource, + Mac_Read_sfnt_Resource, IsMacResource, IsMacBinary, load_mac_face) + [!FT_MACINTOSH]: New functions. + (FT_Open_Face) [!FT_MACINTOSH]: Use load_mac_face. + +2003-05-17 Werner Lemberg + + * src/base/ftobjs.c (FT_Load_Glyph): Scale linear advance width only + if FT_FACE_FLAG_SCALABLE is set (otherwise we have a division by + zero since FNT and friends don't define `face->units_per_EM'). + +2003-05-15 David Turner + + * src/base/fttrigon.c (FT_Vector_Rotate): Avoid rounding errors + for small values. + +2003-05-15 Werner Lemberg + + * src/autohint/ahtypes.h (AH_PointRec): Remove unused `in_angle' + and `out_angle' fields. + +2003-05-14 George Williams + + * src/base/ftmac.c (FT_New_Face_From_SFNT): Handle CFF files also. + +2003-05-14 Werner Lemberg + + * include/freetype/freetype.h: Fix typo in comment + (FT_HAS_FIXED_SIZES). + +2003-05-10 Dan Williams + + * builds/unix/aclocal.m4: Comment out definition of + `allow_undefined_flag' for Darwin 1.3. + * builds/unix/configure.ac: Add option --with-old-mac-fonts. + * builds/unix/ltmain.sh: Fix version numbering for Darwin 1.3. + * builds/unix/configure: Regenerated. + + * include/freetype/config/ftconfig.h: Fix conditions for defining + `FT_MACINTOSH'. + * src/base/ftbase.c: Include `ftmac.c' conditionally. + * src/base/ftmac.c: Handle __GNUC__. + +2003-05-07 YAMANO-UCHI Hidetoshi + + * src/cid/cidload.c (is_alpha): Removed. + (cid_parse_dict): Use `cid_parser_skip_alpha' instead of `is_alpha'. + +2003-05-07 Werner Lemberg + + * src/autohint/ahoptim.c, src/autohint/ahoptim.h: Obsolete, removed. + +2003-05-07 David Turner + + * src/autohint/ahglyph.c (ah_setup_uv): Exchange `for' loop and + `switch' statement to make it run faster. + (ah_outline_compute_segments): Reset `segment->score' and + `segment->link'. + (ah_outline_link_segments): Provide alternative code which does + the same but runs much faster. + Handle major direction also. + (ah_outline_compute_edges): Scale `edge_distance_threshold' down + after rounding instead of scaling comparison value in loop. + + * src/autohint/ahhint.c (ah_hinter_align_stong_points): Provide + alternative code which runs faster. + Handle `before->scale == 0'. + + * src/autohint/ahtypes.h (AH_SegmentRec): Move some fields down. + (AH_EdgeRec): Move some fields in structure. + New field `scale'. + + * src/sfnt/ttcmap0.c (tt_cmap4_char_next): Use binary search. + +2003-05-02 Werner Lemberg + + * src/autohint/ahoptim.c (LOG): Renamed to... + (AH_OPTIM_LOG): This. + (AH_Dump_Springs): Fix log message format. + + * src/autohint/ahhint.c (ah_hint_edges_3): Renamed to... + (ah_hint_edges): This. + +2002-05-02 Keith Packard + + * src/bdf/bdfdrivr.c (BDF_Set_Pixel_Size): Initialize `max_advance'. + +2003-05-01 Werner Lemberg + + * src/autohint/ahglyph.c (ah_test_extrema): Renamed to... + (ah_test_extremum): This. + +2003-04-28 Werner Lemberg + + * builds/unix/configure.ac: Generate `freetype.pc' from + `freetype.in'. + * builds/unix/configure: Regenerated. + * builds/unix/install.mk (install, uninstall): Handle `freetype.pc'. + +2003-04-28 Gustavo J. A. M. Carneiro + + * builds/unix/freetype2.in: New file. Contains building information + for the `pkg-config' package. + +2003-04-28 David Turner + + * src/base/ftobjs.c (FT_Load_Glyph): Fix boundary check for + `glyph_index'. + +2003-04-25: Graham Asher + + Added the optional unpatented hinting system for TrueType. It + allows typefaces which need hinting to produce correct glyph forms + (e.g., Chinese typefaces from Dynalab) to work acceptably without + infringing Apple patents. This system is compiled only if + TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING is defined in + ftoption.h. + + * include/freetype/ttunpat.h: New file. Defines + FT_PARAM_TAG_UNPATENTED_HINTING. + + * include/freetype/config/ftheader.h (FT_TRUETYPE_UNPATENTED_H): New + macro to use when including ttunpat.h. + + * include/freetype/config/ftoption.h + (TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): New configuration macros + (not defined, but in comments) for the unpatented hinting system. + + * include/freetype/internal/tttypes.h (TT_FaceRec) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: New element `FT_Bool + unpatented_hinting'. + + * src/truetype/ttinterp.c (NO_APPLE_PATENT, APPLE_THRESHOLD): + Removed. + (GUESS_VECTOR): New macro. + (TT_Run_Context) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: + Set `both_x_axis'. + (tt_default_graphics_state) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Updated. + (Current_Ratio) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: + Handle `unpatented_hinting'. + (Direct_Move) [NO_APPLE_PATENT]: Removed. + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Insert assertion. + (Project, FreeProject) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Insert assertion. + (Compute_Funcs) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: + Implement unpatented hinting. + (DO_SPVTCA, DO_SFVTCA, DO_SPVTL, DO_SFVTL, DO_SPVFS, DO_SFVFS, + Ins_SDPVTL): Call `GUESS_VECTOR'. + (DO_GPV, DO_GFV) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: + Handle `unpatented_hinting'. + (Compute_Point_Displacement) [NO_APPLE_PATENT]: Removed. + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Implement unpatented + hinting. + (Move_Zp2_Point, Ins_SHPIX, Ins_DELTAP, Ins_DELTAC) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Implement unpatented + hinting. + (TT_RunIns): Updated. + + * src/truetype/ttobjs.c + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Include + FT_TRUETYPE_UNPATENTED_H. + (tt_face_init) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING]: Check + FT_PARAM_TAG_UNPATENTED_HINTING. + + * src/truetype/ttobjs.h (TT_GraphicsState) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Add `both_x_axis'. + +2003-04-25 Werner Lemberg + + * src/bdf/bdflib.c (hash_bucket, hash_lookup): Use `const' for first + argument. + (bdf_get_font_property): Use `const' for third argument. + Updated all callers. + * src/bdf/bdfdrivr.c (BDF_Face_Init): Set pixel width and height + similar to the PCF driver. + * src/bdf/bdf.h (_hashnode): Use `const' for `key'. + Updated. + + * src/gzip/ftgzip.c: C++ doesn't like that the array `inflate_mask' + is declared twice. It is perhaps better to modify the zlib source + files directly instead of this hack. + (zcalloc, zfree, ft_gzip_stream_close, ft_gzip_stream_io): Add casts + to make build with g++ successful. + +2003-04-24 Manish Singh + + * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c + (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Split on `-' + also for searching the style name. + +2003-04-24 David Turner + + * src/pcf/pcfread.c (pcf_load_font): Fixed the computation of + face->num_glyphs. We must increase the value by 1 to respect the + convention that glyph index 0 always corresponds to the `missing + glyph'. + +2003-04-24 Werner Lemberg + + * builds/unix/unix-cc.in (CFLAGS): Add @CPPFLAGS@. + +2003-04-24 Dieter Baron + + * builds/unix/freetype-config.in (cflags): Emit FreeType 2's include + files first. Otherwise there are conflicts with FreeType 1 + installed simultaneously. + +2003-04-23 Werner Lemberg + + Fixing bugs reported by Nelson Beebe. + + * src/base/ftstroker.c (FT_Stroker_ParseOutline): Remove unused + variable `in_path'. + + * src/base/ftobjs (ft_glyphslot_set_bitmap): Change type of + second argument to `FT_Byte*'. + * include/freetype/internal/ftobjs.h: Updated. + + * src/bdf/bdflib.c (_bdf_readstream): Remove unused variable `res'. + (_bdf_parse_glyphs): Remove unused variable `next'. + Mark `call_data' as unused. + + * src/cache/ftlru.c (FT_LruList_Lookup): Remove unused variable + `plast'. + + * src/pcf/pcfread.c (pcf_seek_to_table_type): Slight recoding to + actually use `error'. + (pcf_load_font): Remove unused variable `avgw'. + + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Change return type + to `void'. + Mark `error' as unused. + * src/pfr/pfrobjs.h: Updated. + * src/pfr/pfrdrivr.c (pfr_get_kerning): Updated. + + * src/sfnt/ttload.c (sfnt_dir_check): Remove unused variable + `format_tag'. + + * src/sfnt/ttcmap0.c (tt_cmap6_validate, tt_cmap10_validate): Remove + unused variable `start'. + (tt_cmap10_char_next): Remove unused variable `result' + + * src/sfnt/sfobjs.c (tt_face_get_name): Mark `error' as unused. + + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Mark `error' as + unused. + + * src/type1/t1objs.c (T1_Face_Init): Remove unused variable + `pshinter'. + + * src/type1/t1gload.c (T1_Load_Glyph): Use `glyph_data_loaded' + only for FT_CONFIG_OPTION_INCREMENTAL. + +2003-04-23 Akito Hirai + + * src/sfnt/ttcmap0.c (tt_cmap4_validate): Provide a weak variant + of the glyph ID bounding check if FT_VALIDATE_TIGHT is not active. + Without this change, many CJK fonts from Dynalab are rejected. + +2003-04-23 Joe Marcus Clarke + + * src/base/ftbdf.c (FT_Get_BDF_Property): Check for valid + `get_interface'. + +2003-04-23 Paul Miller + + * src/base/ftmac.c (parse_fond): Fix handling of style names. + +2003-04-23 Werner Lemberg + + * src/pfr/pfrload.c (pfr_extra_item_load_font_id): Use FT_PtrDist + instead of FT_Uint for `len'. + +2003-04-22 Werner Lemberg + + * src/gzip/ftgzip.c (zcalloc) [!FT_CONFIG_OPTION_SYSTEM_ZLIB]: + Convert K&R format to modern C usage. + (FT_Stream_OpenGzip): Use long constant. + +2003-04-21 Werner Lemberg + + * src/cache/ftccache.c (ftc_cache_lookup): Remove shadow declaration + of `manager'. + +2003-04-20 Werner Lemberg + + * doc/INSTALL.UNX: Cleaned up. + +2003-04-09 Torrey Lyons + + * src/base/ftmac.c (open_face_from_buffer): Removed a double-free + bug that had nasty consequences when trying to open an `invalid' + font on a Mac. + +2003-04-09 Mike Fabian + + * src/bdf/bdfdrivr.h (BDF_encoding_el), src/pcf/pcf.h + (PCF_EncodingRec): Changed FT_Short to FT_UShort in order to be able + to access more than 32768 glyphs in fonts. + +2003-04-08 David Turner + + + * Version 2.1.4 released. + ========================= + + +2003-04-03 Martin Muskens + + * src/type1/t1load.c (T1_Open_Face): Fixed the code to make it + handle special cases where a font only contains a `.notdef' glyph + (happens in PDF-embedded fonts). Otherwise, FT_Panic was called. + +2003-03-27 David Turner + + * README: Udpated. + + * README.UNX: Removed (now replaced by docs/INSTALL.UNX). + + * src/pshinter/pshalgo3.c: The hinter now performs as in 2.1.3 and + will ignore stem quantization only when FT_LOAD_TARGET_SMOOTH is + used. + (psh3_dimension_quantize_len): Enabled. + (psh3_hint_align): Enable commented code. + (psh3_hint_align_light): Commented out. + + * src/base/ftobjs.c (FT_Set_Char_Size): Changed the default + computations to include rounding in all cases; this is required to + provide accurate kerning data when native TrueType hinting is + enabled. + + * src/type1/t1load.c (is_name_char): The Type 1 loader now accepts + more general names according to the PostScript specification (the + previous one was too restrictive). + (parse_font_name, parse_encoding, parse_charstrings, parse_dict): + Use `is_name_char'. + (parse_subrs): Handle empty arrays. + +2003-03-20 David Turner + + Serious rewriting of the documentation. + + * docs/BUGS, docs/BUILD: Removed. + * docs/DEBUG.TXT: Renamed to... + * docs/DEBUG: This. + * docs/CUSTOMIZE, docs/TRUETYPE, docs/UPGRADE.UNX: New files. + * docs/INSTALL.ANY, docs/INSTALL.UNX, docs/INSTALL.GNU New files, + containing platform specific information previously in INSTALL. + * docs/readme.vms: Renamed to... + * docs/INSTALL.VMS: This. + + * docs/*: Updated. + + Introduced three new functions to deal with glyph bitmaps within + FT_GlyphSlot objects: + + ft_glyphslot_free_bitmap + ft_glyphslot_alloc_bitmap + ft_glyphslot_set_bitmap + + These functions are much more convenient to use than managing the + FT_GLYPH_OWN_BITMAP flag manually. + + * include/freetype/internal/ftobjs.h (ft_glyphslot_free_bitmap, + ft_glyphslot_alloc_bitmap, ft_glyphslot_set_bitmap): New functions. + * src/base/ftobjs.c: Implement them. + (ft_glyphslot_done): Use ft_glyphslot_free_bitmap. + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/pcf/pcfdriver.c + (PCF_Glyph_Load): Remove unused variable `memory'. + Use `ft_glyphslot_*' functions. + Don't set `FT_GLYPH_OWN_BITMAP'. + + * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Use + `ft_glyphslot_alloc_bitmap'. + + * src/sfnt/ttsbit.c (Load_SBit_Image): Change 5th argument to type + `FT_GlyphSlot'. + Adding argument `depth' to handle recursive calls. + Use `ft_glyphslot_alloc_bitmap'. + (tt_face_load_sbit_image): Remove unused variable `memory'. + Don't handle `FT_GLYPH_OWN_BITMAP'. + Update call to Load_SBit_Image. + + * src/type42/t42objs.c (ft_glyphslot_clear): Renamed to... + (t42_glyphslot_clear): This. Updated caller. + Call `ft_glyphslot_free_bitmap'. + + * src/winfonts/winfnt.c (FNT_Load_Glyph): Use + `ft_glyphslot_set_bitmap'. + Don't handle `FT_GLYPH_OWN_BITMAP'. + + * src/cache/ftlru.c (FT_LruList_Lookup): Fixed an invalid assertion + check. + + * src/autohint/ahglyph.c (ah_outline_load): Add two scaling + arguments. + * src/autohint/ahglyph.h: Updated. + * src/autohint/ahhint.c (ah_hinter_load): Updated. + * src/autohint/ahglobal.c (ah_hinter_compute_widths): Updated. + + * src/cache/ftccache.c (ftc_family_done): Fixed small bug that could + crash the cache in rare circumstances (mostly with broken fonts). + +2003-03-15 David Turner + + * src/truetype/ttdriver.c (Set_Char_Sizes): Fixed a small rounding + bug. Actually, it seems that previous versions of FreeType didn't + perform TrueType rounding exactly as appropriate. + +2003-03-14 David Turner + + * src/truetype/ttdriver.c (Set_Char_Sizes): Fixing the small + TrueType native rendering glitches; they came from a small rounding + error. + +2003-03-13 David Turner + + Added new environment variables to control memory debugging with + FreeType. See the description of `FT2_DEBUG_MEMORY', + `FT2_ALLOC_TOTAL_MAX' and `FT2_ALLOC_COUNT_MAX' in DEBUG.TXT. + + * src/base/ftdbgmem.c (FT_MemTableRec): Add `alloc_count', + `bound_total', `alloc_total_max', `bound_count', `alloc_count_max'. + (ft_mem_debug_alloc): Handle new variables. + (ft_mem_debug_init): s/FT_DEBUG_MEMORY/FT2_DEBUG_MEMORY/. + Handle new environment variables. + * docs/DEBUG.TXT: Updated. + + Fixed the cache sub-system to correctly deal with out-of-memory + conditions. + + * src/cache/ftccache.c (ftc_node_destroy): Comment out generic + check. + (ftc_cache_lookup): Implement loop. + * src/cache/ftccmap.c: Define FT_COMPONENT. + * src/cache/ftcsbits.c (ftc_sbit_node_load): Handle + FT_Err_Out_Of_Memory. + * src/cache/ftlru.c: Include FT_INTERNAL_DEBUG_H. + (FT_LruList_Lookup): Implement loop. + + * src/pfr/pfrobjs.c (pfr_face_done): Fix memory leak. + (pfr_face_init): Fixing compiler warnings. + + * src/psaux/psobjs.c (reallocate_t1_table): Fixed a bug (memory + leak) that only happened when a try to resize an array would end in + an out-of-memory condition. + + * src/smooth/ftgrays.c (gray_convert_glyph): Removed compiler + warnings / volatile bug. + + * src/truetype/ttobjs.c (tt_glyphzone_done): Removed segmentation + fault that happened in tight memory environments. + +2003-02-28 Pixel + + * src/gzip/ftgzip.c (ft_gzip_file_done): Fixed memory leak: The ZLib + stream was not properly finalized. + +2003-02-25 Anthony Fok + + * src/cache/ftccmap.c: Include FT_TRUETYPE_IDS_H. + (ftc_cmap_family_init): The cmap cache now + supports UCS-4 charmaps when available in Asian fonts. + + * src/sfnt/ttload.c, src/base/ftobjs.c: Changed `asian' to `Asian' + in comments. + +2003-02-25 David Turner + + * src/gzip/ftgzip.c (ft_gzip_file_fill_output): Fixed a bug that + caused FreeType to loop endlessly when trying to read certain + compressed gzip files. The following test reveals the bug: + + touch 0123456789 ; gzip 0123456789 ; ftdump 0123456789.gz + + Several fixes to the PFR font driver: + + - The list of available embedded bitmaps was not correctly set in + the root FT_FaceRec structure describing the face. + + - The glyph loader always tried to load the outlines when + FT_LOAD_SBITS_ONLY was specified. + + - The table loaded now scans for *undocumented* elements of a + physical font's auxiliary data record. This is necessary to + retrieve the `real' family and style names. + + NOTE THAT THESE CHANGES THE FAMILY NAME OF MANY PFR FONTS! + + * src/pfr/pfrload.c (pfr_aux_name_load): New function. + (pfr_phy_font_done): Free `family_name' and `style_name' also. + Remove unused variables. + (pfr_phy_font_load): Extract useful information from the auxiliary + bytes. + + * src/pfr/pfrobjs.c (pfr_face_done): Set pointers to NULL. + (pfr_face_init): Provide fallback values for `family_name' and + `style_name'. + Handle strikes. + (pfr_slot_load): Handle FT_LOAD_SBITS_ONLY. + * src/pfr/pfrtypes.h (PFR_PhyFontRec): Add fields `ascent', + `descent', `leading', `family_name', and `style_name'. + + * src/truetype/ttdriver.c (Set_Char_Sizes): Fixed a rounding bug + when computing the scale factors for a given character size in + points with resolution. + + * devel/ft2build.h, devel/ftoption.h: New files (in a new directory) + which are special development versions of include/ft2build.h and + include/freetype/config/ftoption.h, respectively. + +2003-02-18 David Turner + + Fixing the slight distortion problem that occurred due to the latest + auto-hinter changes. + + * src/base/ftobjs.c (ft_recompute_scaled_metrics): Fix rounding. + + * src/truetype/ttdriver.c (Set_Char_Sizes): New variable `metrics2'. + [!TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Removed. + + * src/truetype/ttobjs.h (TT_SizeRec): New field `metrics'. + * src/truetype/ttobjs.c (Reset_Outline_Size): Fix initialization of + `metrics'. + [FT_CONFIG_CHESTER_ASCENDER]: Code removed. + (Reset_SBit_Size): Fix initialization of `metrics'. + + * src/truetype/ttinterp.c (TT_Load_Context): Fix initialization of + `exec->metrics'. + + * src/autohint/ahhint.c (ah_hinter_load): Disabled the advance width + `correction' which seemed to provide more trouble than benefits. + +2003-02-13 Graham Asher + + Changed the incremental loading interface in a way that makes it + simpler and allows glyph metrics to be changed (e.g., by adding a + constant, as required by CFF fonts) rather than just overridden. + This was required to make the GhostScript-to-FreeType bridge work. + + * src/cff/cffgload.c (cff_slot_load) [FT_CONFIG_OPTION_INCREMENTAL]: + Allow metrics to be overridden. + * src/cid/cidgload.c (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL]: + Ditto. + + * src/truetype/ttgload.c (load_truetype_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Simplify. + (compute_glyph_metrics) [FT_CONFIG_OPTION_INCREMENTAL]: Code block + moved down. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + + * include/freetype/ftincrem.h: Updated. + +2003-01-31 David Turner + + * docs/CHANGES, docs/VERSION.DLL, docs/TODO: Updating documentation + for the 2.1.4 release. + + * builds/win32/visualc/freetype.dsp, + builds/win32/visualc/index.html: Updating the project file for + 2.1.4. + + * src/gzip/adler32.c, src/gzip/ftgzip.c, src/gzip/infblock.c, + src/gzip/infcodes.c, src/gzip/inflate.c, src/gzip/inftrees.c, + src/gzip/infutil.c: Removed old-style (K&R)function definitions. + This avoids warnings with Visual C++ at its most pedantic mode. + + * src/pfr/pfrsbit.c: Removed compiler warnings. + + * src/cache/ftccmap.c (ftc_cmap_family_init): Changed an FT_ERROR + into an FT_TRACE1 since it caused `ftview' and others to dump too + much junk when trying to display a waterfall with a font without a + Unicode charmap (e.g. SYMBOL.TTF). + + Implemented FT_CONFIG_CHESTER_BLUE_SCALE, corresponding to the last + patch from David Chester, but with a much simpler (and saner) + implementation. + + * src/autohint/ahhint.c (ah_hinter_load_glyph) + [FT_CONFIG_CHESTER_BLUE_SCALE]: Try to optimize the y_scale so that + the top of non-capital letters is aligned on a pixel boundary + whenever possible. + + * src/base/ftobjs.c (FT_Set_Char_Size) + [FT_CONFIG_CHESTER_BLUE_SCALE]: Round differently. + * src/truetype/ttdriver.c (Set_Char_Sizes) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Do some rounding only + if this macro is defined. + + * src/truetype/ttobjs.c (Reset_Outline_Size) + [FT_CONFIG_CHESTER_ASCENDER]: Round differently. + + * src/pshinter/pshalgo3.c: Improved the Postscript hinter. Getting + rid of stem snapping seems to work well here (though the stems are + still slightly moved to increase contrast). + (psh3_dimension_quantize_len): Commented out. + (psh3_hint_align_light): New function. + (psh3_hint_align): Comment out some code. + + THIS IMPROVES ANTI-ALIASED RENDERING, BUT MONOCHROME AND LCD MODES + STILL SUCK. + +2003-01-22 David Chester + + * src/autohint/ahhint.c (ah_compute_stem_width): Small fix to the + stem width optimization. + +2003-01-22 David Turner + + Adding a new API `FT_Get_BDF_Property' to retrieve the BDF + properties of a given PCF or BDF font. + + * include/freetype/ftbdf.h (FT_PropertyType): New enumeration. + (BDF_Property, BDF_PropertyRec): New structure. + FT_Get_BDF_Property): New function. + * include/freetype/internal/bdftypes.h: Include FT_BDF_H. + (BDF_GetPropertyFunc): New function pointer. + + * src/base/ftbdf.c (test_font_type): New helper function. + (FT_Get_BDF_Charset_ID): Use `test_font_type'. + (FT_Get_BDF_Property): New function. + + * src/bdf/bdfdrivr.c: Include FT_BDF_H. + (bdf_get_bdf_property, bdf_driver_requester): New functions. + (bdf_driver_class): Use `bdf_driver_requester'. + + * src/pcf/pcfdrivr.c: Include FT_BDF_H. + (pcf_get_bdf_property, pdc_driver_requester): New functions + (pcf_driver_class): Use `pcf_driver_requester'. + + * src/pcf/pcfread.c: Include `pcfread.h'. + (pcf_find_property): Decorate it with FT_LOCAL_DEF. + * src/pcf/pcfread.h: New file, providing `pcf_find_property'. + + * src/sfnt/ttload.c (sfnt_dir_check): Relaxed the `head' table size + verification to accept a few broken fonts who pad the size + incorrectly (the table should be padded, but its `size' field + shouldn't according to the specification). + +2003-01-18 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.4.3. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.7.1. + * builds/unix/configure: Regenerated with autoconf 2.54. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `automake' CVS module at subversions.gnu.org. + +2003-01-15 David Turner + + * include/freetype/freetype.h: Fixed documentation for + FT_Size_Metrics. + +2003-01-15 James Su + + * src/gzip/ftgzip.c (ft_gzip_check_header): Bugfix: couldn't read + certain gzip-ed font files (typo: `&&' -> `&'). + +2003-01-15 Huw D M Davies + + Added a Windows .FNT specific API (mostly for Wine). Also fixed a + nasty bug in the header loader which would cause invalid memory + overwrites. + + * include/freetype/config/ftheader.h (FT_WINFONTS_H): New macro + for ftwinfnt.h. + * include/freetype/internal/fnttypes.h: Include FT_WINFONTS_H. + (FNT_FontRec): Updated. + Move Windows FNT definition to... + * include/freetype/ftwinfnt.h: This new file. + (FT_WinFNT_HeaderRec): Rename `reserved2' to `reserved1'. + * src/base/ftwinfnt.c: New file, providing `FT_Get_WinFNT_Header'. + * src/winfonts/winfnt.c (winfnt_header_fields): Updated. + Rename `reserved2' to `reserved1'. + (fnt_font_load): Updated. + + * src/base/Jamfile, src/base/descrip.mms, src/base/rules.mk: + Updated. + +2003-01-14 Graham Asher + + * include/freetype/ftglyph.h, src/base/ftglyph.c: Added `const' to + the type of the first argument to FT_Matrix_Multiply, which isn't + changed -- this adds documentation and convenience. + +2003-01-13 Graham Asher + + * src/sfnt/ttload.c (tt_face_load_metrics) + [FT_CONFIG_OPTION_INCREMENTAL]: TrueType typefaces without + horizontal metrics (without the `hmtx' table) are now tolerated if + an incremental interface has been specified that has a + get_glyph_metrics function, implying that metrics will be supplied + from outside. This happens for certain Type 42 fonts passed from + GhostScript. + +2003-01-11 David Chester + + Patches to the auto-hinter in order to slightly improve the output. + Note that everything is controlled through the new + FT_CONFIG_OPTION_CHESTER_HINTS defined in `ftoption.h'. There are + also individual FT_CONFIG_CHESTER_XXX macros to control individual + `features'. + + Note that all improvements are enabled by default, but can be + tweaked for optimization and testing purposes. The configuration + macros will most likely disappear in the short future. + + * include/freetype/config/ftoption.h + (FT_CONFIG_OPTION_CHESTER_HINTS): New macro. + (FT_CONFIG_CHESTER_{SMALL_F,ASCENDER,SERIF,STEM,BLUE_SCALE}) + [FT_CONFIG_OPTION_CHESTER_HINTS]: New macros to control individual + features. + + * src/autohint/ahglobal.c (blue_chars) [FT_CONFIG_CHESTER_SMALL_F]: + Add blue zone for `fijkdbh'. + * src/autohint/ahglobal.h (AH_IS_TOP_BLUE) + [FT_CONFIG_CHESTER_SMALL_F]: Use `AH_BLUE_SMALL_F_TOP'. + * src/autohint/ahglyph.c (ah_outline_compute_edges) + [FT_CONFIG_CHESTER_SERIF]: Use `AH_EDGE_SERIF'. + (ah_outline_compute_blue_edges) [FT_CONFIG_CHESTER_SMALL_F]: + Increase threshold for `best_dist'. + * src/autohint/ahhint.c (ah_compute_stem_width) + [FT_CONFIG_CHESTER_SERIF]: Provide new version for improved serif + handling. + (ah_align_linked_edge) [FT_CONFIG_CHESTER_SERIF]: Use special + version of `ah_compute_stem_width'. + (ah_hint_edges_3) [FT_CONFIG_CHESTER_STEM]: A new algorithm for stem + alignment when stem widths are less than 1.5 pixels wide centers the + stem slightly off-center of the center of a pixel (this increases + sharpness and consistency). + [FT_CONFIG_CHESTER_SERIF]: Use special version of + `ah_compute_stem_width'. + * src/autohint/ahtypes.h [FT_CONFIG_CHESTER_SMALL_F]: Add + `AH_BLUE_SMALL_F_TOP'. + +2003-01-11 David Turner + + * include/freetype/internal/fnttypes.h (WinFNT_HeaderRec): Increase + size of `reserved2' to avoid memory overwrites. + +2003-01-08 Huw Davies + + * src/winfonts/winfnt.c (winfnt_header_fields): Read 16 bytes into + `reserved2', not `reserved'. + + * src/base/ftobjs.c (find_unicode_charmap): Fixed the error code + returned when the font doesn't contain a Unicode charmap. This + allows FT2 to load `symbol.ttf' and a few others correctly since the + last release. + (open_face): Fix return value. + +2003-01-08 Owen Taylor + + Implemented the FT_RENDER_MODE_LIGHT hinting mode in the auto and + postscript hinters. + + * src/autohint/ahtypes.h (AH_HinterRec): Add `do_stem_adjust'. + * src/autohint/ahhint.c (ah_compute_stem_width): Handle + hinter->do_stem_adjust. + (ah_hinter_load_glyph): Set hinter->do_stem_adjust. + + * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Add `do_stem_adjust'. + * src/pshinter/pshalgo3.c (psh3_hint_align): Use `do_stem_adjust'. + (ps3_hints_apply): Handle FT_RENDER_MODE_LIGHT. + + * include/freetype/freetype.h (FT_Render_Mode): Add + FT_RENDER_MODE_LIGHT. + + * src/truetype/ttgload.c: Fixing the TrueType loader to handle + invalid composites correctly by limiting the recursion depth. + (TT_MAX_COMPOSITE_RECURSE): New macro. + (load_truetype_glyph): Add argument `recurse_count'. + Load a composite only if the numbers of contours is -1, emit error + otherwise. + (TT_Load_Glyph): Updated. + +2003-01-08 David Turner + + * Jamrules, Jamfile, Jamfile.in, src/*/Jamfile: Small changes to + support the compilation of FreeType 2 as part of larger projects + with their own configuration options (only with Jam). + +2003-01-07 David Turner + + * src/base/ftstroker.c: Probably the last bug-fixes to the stroker; + the API is likely to change, however. + (ft_stroke_border_close): Don't record empty paths. + (ft_stroke_border_get_counts): Increase `num_points' also in for loop. + (ft_stroke_border_export): Don't increase `write' twice in for loops. + (ft_stroker_outside): Handle `phi' together with `theta'. + (FT_Stroker_ParseOutline): New function. + + * src/base/fttrigon.c (FT_Angle_Diff): Fixing function: It returned + invalid values for large negative angle differences (resulting in + incorrect stroker computations, among other things). + + * src/cache/ftccache.c (ftc_node_hash_unlink): Removing incorrect + assertion, and changing code to avoid hash table size contraction. + + * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: Adding + `ftstroker' to default build, as optional component. + +2002-12-26 David Turner + + * src/gzip/adler32.c, src/gzip/infblock.c, src/gzip/inflate.c, + src/gzip/inftrees.c, src/gzip/zconf.h, src/gzip/zlib.h, + src/gzip/zutil.h: Updates to allow compilation without compiler + warnings with LCC-Win32. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. + * builds/unix/configure.ac (version_info): Increased to 9:3:3. + * builds/unix/configure: Regenerated. + * docs/VERSION.DLL: Updated. + +2002-12-23 Anthony Fok + + * builds/unix/configure.ac, builds/unix/unix-cc.in (LINK_LIBRARY), + builds/unix/unix-def.in (SYSTEM_ZLIB): Small fix to configure + sub-system on Unix to allow other programs to correctly link with + zlib when needed. + +2002-12-19 David Turner + + * include/freetype/internal/sfnt.h (SFNT_Load_Table_Func): New + function pointer. + + * include/freetype/tttables.h (FT_Load_Sfnt_Table): New function. + * src/base/ftobjs.c: Implement it. + + * src/sfnt/sfdriver.c (sfnt_get_interface): Handle `load_sfnt' + module request. + +2002-12-17 David Turner + + * src/base/ftobjs.c (find_unicode_charmap): Added some comments to + better explain what's happening there. + (open_face): Included Graham Asher's fix to prevent faces without + Unicode charmaps from loading. + + * src/winfonts/winfnt.c: Included George Williams's fix to support + version 2 fonts correctly. + (winfnt_header_fields): Updated. + (fnt_font_load): Handle version 2 fonts. + (FNT_Load_Glyph): Updated. + +2002-12-16 David Turner + + * docs/VERSION.DLL: Updating document to better explain the + differences between the three version numbers being used on Unix, as + well as providing an autoconf fragment provided by Lars Clausen. + + * src/smooth/ftgrays.c (gray_render_conic): Fixed small bug that + prevented Bézier arcs with negative vertical coordinates to be + rendered appropriately. + +2002-12-02 Antoine Leca + + * src/base/ftobjs.c: Modified the logic to get Unicode charmaps. + Now it loads UCS-4 charmaps when there is one. + (find_unicode_charmap): New function. + (open_face): Refer to the above one. + (FT_Select_Charmap): Idem. + +2002-11-29 Antoine Leca + + * include/freetype/ftgzip.h: Correct the name of the controlling + macro (was __FTXF86_H__ ...). + +2002-11-27 Vincent Caron + + * builds/unix/unix-def.in, builds/unix/freetype-config.in, + builds/unix/configure.ac, src/gzip/rules.mk, src/gzip/ftgzip.c + [FT_CONFIG_OPTION_SYSTEM_ZLIB]: Adding support for system zlib + installations if available on the target platform (Unix only). + +2002-11-23 David Turner + + * src/cff/cffload.c (cff_charset_load, cff_encoding_load): Modified + charset loader to accept pre-defined charsets, even when the font + contains fewer glyphs. Also enforced more checks to ensure that we + never overflow the character codes array in the encoding. + +2002-11-22 Antoine Leca + + * include/freetype/ttnameid.h: Updated to latest OpenType + specification. + +2002-11-18 David Turner + + + * Version 2.1.3 released. + ========================= + + +2002-11-07 David Turner + + * src/cache/ftcsbit.c (ftc_sbit_node_load): Fixed a small bug that + caused problems with embedded bitmaps. + + * src/otlayout/otlayout.h, src/otlyaout/otlconf.h, + src/otlayout/otlgsub.c, src/otlayout/otlgsub.h, + src/otlayout/otlparse.c, src/otlayout/otlparse.h, + src/otlayout/otlutils.h: Updating the OpenType Layout code, adding + support for the first GSUB lookups. Nothing that really compiles + for now though. + + * src/autohint/ahhint.c (ah_align_serif_edge): Disabled serif stem + width quantization. It produces slightly better shapes though this + is not distinguishable with many fonts. + Remove other dead code. + + * src/Jamfile, src/*/Jamfile: Simplified. + Use $(FT2_SRC_DIR). + +2002-11-06 David Turner + + * include/freetype/freetype.h (FT_LOAD_TARGET_LIGHT): New macro. + (FT_LOAD_TARGET, FT_LOAD_TARGET_MODE): Use `& 15' instead of `& 7'. + +2002-11-05 David Turner + + * include/freetype/config/ftoption.h, src/gzip/ftgzip.c: Added + support for the FT_CONFIG_OPTION_SYSTEM_ZLIB option, used to specify + the use of system-wide zlib. + + Note that this macro, as well as + TT_CONFIG_OPTION_BYTECODE_INTERPRETER, is not #undef-ed anymore. + This allows the build system to define them depending on the + configuration (typically by adding -D flags at compile time). + + * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Removed compiler + warnings in optimized mode relative to the `volatile' local + variables. This was not a compiler bug after all, but the fact that + a pointer to a volatile variable is not the same as a volatile + pointer to a variable :-) + + The fix was to change + `volatile FT_Byte* p' + into + `FT_Byte* volatile p'. + + * src/pfr/pfrload.c (pfr_phy_font_load), src/pfr/pfrdrivr.c + (pfr_get_metrics), src/gzip/inftrees.c: Removed compiler warnings in + optimized modes. + + * src/gzip/*.[hc]: Modified our zlib copy in order to prevent + exporting any zlib function names outside of the component. This + prevents linking problems on some platforms, when applications want + to link FreeType _and_ zlib together. + +2002-11-05 Juliusz + + * src/psaux/psobjs.c (ps_table_add): Modified increment loop in + order to implement exponential behaviour. + +2002-11-01 David Turner + + Added PFR-specific public API. Fixed the kerning retrievel routine + (it returned invalid values when the outline and metrics resolution + differ). + + * include/freetype/ftpfr.h, include/freetype/internal/pfr.h: New + files. + + * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H): New + macro for pfr.h. + + * src/base/ftpfr.c: New file. + * src/base/Jamfile, src/base/descrip.mms: Updated. + + * src/pfr/pfrdrivr.c: Include FT_INTERNAL_PFR_H. + (pfr_get_kerning, pfr_get_advance, pfr_get_metrics): New functions. + (pfr_service_rec): New format interface. + (pfr_driver_class): Use `pfr_service_rec'. + Replace `pfr_face_get_kerning' with `pfr_get_kerning'. + * src/pfr/pfrobjs.c: Remove dead code. + + * src/base/ftobjs.c (ft_glyphslot_clear): Small internal fix to + better support bitmap-based font formats. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Fix handling of + `scale'. + Fix arguments to `FT_Vector_From_Polar'. + +2002-10-31 David Turner + + Add support for automatic handling of gzip-compressed PCF files. + + * src/gzip/*: New files, taken from the zlib package (except + ftgzip.c). + + * include/freetype/ftgzip.h, src/gzip/ftgzip.c: New files. + * include/freetype/config/ftheader.h (FT_GZIP_H): New macro for + `ftgzip.h'. + + * src/pcf/pcfdriver.c: Include FT_GZIP_H and FT_ERRORS_H. + (PCF_Face_Init): If normal open fails, try to open gzip stream. + (PCF_Face_Done): Close gzip stream. + + * include/freetype/internal/pcftypes.h (PCF_Public_FaceRec), + src/pcf/pcf.h (PCF_FaceRec): Add `gzip_stream' and `gzip_source'. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_ZLIB): + New macro. + (T1_CONFIG_OPTION_DISABLE_HINTER, FT_CONFIG_OPTION_USE_CMAPS + FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS, + FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS): Removed. + + (FT_EXPORT, FT_EXPORT_DEF, FT_DEBUG_LEVEL_ERROR, + FT_DEBUG_LEVEL_TRACE, FT_DEBUG_MEMORY): Comment out definitions so + that platform specific configuration file can override. + + * include/freetype/internal/ftstream.h: Include FT_SYSTEM_H. + +2002-10-30 David Turner + + * FreeType 2.1.3rc3 released. + +2002-10-25 David Turner + + * include/freetype/ftcache.h (FT_POINTER_TO_ULONG): New macro. + (FTC_FACE_ID_HASH): Rewritten, using FT_POINTER_TO_ULONG. + +2002-10-22 Giuseppe Ghibò + + * include/freetype/freetype.h (FT_Encoding): Fix entry for latin-2. + +2002-10-07 Werner Lemberg + + * include/freetype/freetype.h (FT_Open_Face): Use `const' for `args' + (suggested by Graham). + * src/base/ftobjs.c (FT_Open_Face): Updated. + (ft_input_stream_new): Ditto. + +2002-10-05 David Turner + + Adding support for embedded bitmaps to the PFR driver, and rewriting + its kerning loader/handler to use all kerning pairs in a physical + font (and not just the first item). + + * src/pfr/pfr.c: Include `pfrsbit.c'. + * src/pfr/pfrgload.c: Include `pfrsbit.h'. + * src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): Rewritten. + (pfr_phy_font_done, pfr_phy_font_load): Updated. + * src/pfr/pfrobks.c: Include `pfrsbit.h'. + (pfr_face_init): Handle kerning and embedded bitmaps. + (pfr_slot_load): Load embedded bitmaps. + (PFR_KERN_INDEX): Removed. + (pfr_face_get_kerning): Rewritten. + * src/pfr/pfrsbit.c, src/pfr/pfrsbit.h: New files. + * src/pfr/pfrtypes.h (PFR_KernItemRec): New structure. + (PFR_KERN_INDEX): New macro. + (PFR_PhyFontRec): Add items for kerning and embedded bitmaps. + * src/pfr/Jamfile (_sources) [FT2_MULTI]: Add `pfrsbit'. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't load bitmap fonts if + FT_LOAD_NO_RECURSE is set. + Load embedded bitmaps only if FT_LOAD_NO_BITMAP isn't set. + + * src/tools/docmaker/content.py, src/tools/docmaker/sources.py, + src/tools/docmaker/tohtml.py: Fixing a few nasty bugs. + + * src/sfnt/ttcmap0.c (tt_cmap4_validate): The validator for format 4 + sub-tables is now capable of dealing with invalid `length' fields at + the start of the sub-table. This allows fonts like `mg______.ttf' + (i.e. Marriage) to return accurate charmaps. + + * docs/CHANGES: Updated. + +2002-10-05 Werner Lemberg + + * src/smooth/ftgrays.c (SUBPIXELS): Add cast to `TPos'. + Update all callers. + (TRUNC): Add cast to `TCoord'. + Update all callers. + (TRaster): Use `TPos' for min_ex, max_ex, min_ey, max_ey, and + last_ey. + Update all casts. + (gray_render_line): Fix casts for `p' and `first'. + +2002-10-02 Detlef Würkner + + * src/bdf/bdflib.c (bdf_load_font): Allocate the _bdf_parse_t + structure with FT_ALLOC instead of using the stack. + +2002-09-27 Werner Lemberg + + * src/include/freetype/internal/tttypes.h (num_sbit_strikes, + num_sbit_scales): Use `FT_ULong'. + * src/sfnt/sfobjs.c (sfnt_load_face): Updated accordingly. + * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Ditto. + (find_sbit_image): Remove cast. + * src/raster/ftrend1.c (ft_raster1_render): Fix cast. + +2002-09-27 Wolfgang Domröse + + * src/sfnt/ttload.c (tt_face_load_names): Use cast. + * src/sfnt/ttcmap.c (code_to_next2): Use long constant. + (code_to_index4): Use cast. + (code_to_index8_12): Fix cast. + * src/sfnt/ttcmap0.c (tt_cmap4_char_next, tt_cmap8_char_index, + tt_cmap12_char_index): Use cast for `result'. + (tt_face_build_cmaps): Use cast. + * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_ucs4): Use cast for + `code'. + (sfnt_load_face): Use FT_Int32 for `flags'. + + * src/smooth/ftgrays.c (gray_render_scanline, gray_render_line, + gray_compute_cbox, gray_convert_glyph, gray_raster_reset): Add casts + to `TCoord' and `int'. + More 16bit fixes. + s/FT_Pos/TPos/. + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Add casts. + +2002-09-26 Werner Lemberg + + * src/sfnt/ttpost.c (load_post_names, tt_face_free_ps_names, + tt_face_get_ps_name): Replace switch statement with if clauses to + make it more portable. + + * src/cff/cffobjs.c (cff_face_init): Ditto. + + * include/freetype/ftmodule.h (FT_Module_Class): Use `FT_Long' for + `module_size'. + * include/freetype/ftrender.h (FT_Glyph_Class_): Use `FT_Long' for + `glyph_size'. + + * src/base/ftobjs.c (FT_Render_Glyph): Change second parameter to + `FT_Render_Mode'. + (FT_Render_Glyph_Internal): Change third parameter to + `FT_Render_Mode'. + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Change second parameter + to `FT_Render_Mode'. + + * src/raster/ftrend1.c (ft_raster1_render): Change third parameter + to `FT_Render_Mode'. + * src/smooth/ftsmooth.c (ft_smooth_render, ft_smooth_render_lcd, + ft_smooth_render_lcd_v): Ditto. + (ft_smooth_render_generic): Change third and fifth parameter to + `FT_Render_Mode'. + + * include/freetype/freetype.h, include/freetype/internal/ftobjs.h, + include/freetype/ftglyph.h: Updated. + + * src/cff/cffdrivr.c (Load_Glyph), src/pcf/pcfdriver.c + (PCF_Glyph_Load), src/pfr/pfrobjs.c (pfr_slot_load), + src/winfonts/winfnt.c (FNT_Load_Glyph), src/t42/t42objs.c + (T42_GlyphSlot_Load), src/bdf/bdfdrivr.c (BDF_Glyph_Load): Change + fourth parameter to `FT_Int32'. + + * src/pfr/pfrobjs.c (pfr_face_init): Add two missing parameters + and declare them as unused. + + * src/cid/cidparse.h (CID_Parser): Use FT_Long for `postscript_len'. + + * src/psnames/psnames.h (PS_Unicode_Value_Func): Change return + value to FT_UInt32. + * src/psnames/psmodule.c (ps_unicode_value, ps_build_unicode_table): + Updated accordingly. + +2002-09-26 Wolfgang Domröse + + * src/cff/cffdrivr.c (Get_Kerning): Use FT_Long for `middle'. + (cff_get_glyph_name): Use cast for result of ft_strlen. + * src/cff/cffparse.c (cff_parse_real): User cast for assigning + `exp'. + * src/cff/cffload.c (cff_index_get_pointers): Use FT_ULong for + some local variables. + (cff_charset_load, cff_encoding_load): Use casts to FT_UInt for some + switch statements. + (cff_font_load): Use cast in call to CFF_Load_FD_Select. + * src/cff/cffobjs.c (cff_size_init): Use more casts. + (cff_face_init): Use FT_Int32 for `flags'. + * src/cff/cffgload.c (cff_operator_seac): Use cast for assigning + `adx' and `ady'. + (cff_decoder_parse_charstrings): Use FT_ULong for third parameter. + Use more casts. + * src/cff/cffcmap.c (cff_cmap_unicode_init): Use cast for `count'. + + * src/cid/cidload.c (cid_read_subrs): Use FT_ULong for `len'. + * src/cid/cidgload.c (cid_load_glyph): Add missing cast for + `cid_get_offset'. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) <18>: Use + cast for `num_points'. + (t1_decoder_init): Use cast for assigning `decoder->num_glyphs'. + + * src/base/ftdebug.c (ft_debug_init): Use FT_Int. + * include/freetype/internal/ftdriver.h (FT_Slot_LoadFunc): Use + `FT_Int32' for fourth parameter. + * src/base/ftobjs.c (open_face): Use cast for calling + clazz->init_face. + + * src/raster/ftraster.c (Set_High_Precision): Use `1' instead of + `1L'. + (Finalize_Profile_Table, Line_Up, ft_black_init): Use casts. + * src/raster/ftrend1.c (ft_raster1_render): Ditto. + + * src/sfnt/sfnt_dir_check: Compare `magic' with unsigned long + constant. + +2002-09-26 Detlef Würkner + + * builds/amiga/include/freetype/config/ftmodule.h: Updated. + +2002-09-25 David Turner + + * src/autohint/ahtypes.h (AH_HINT_METRICS): Disabling metrics + hinting in the auto-hinter. This produces much better anti-aliased + text. + + * docs/CHANGES: Updating the changes documentation. + +2002-09-25 Anthony Fok + + * src/sfnt/ttcmap0.c (tt_cmap4_validate, tt_cmap4_char_index, + tt_cmap4_char_next): Added support for opens___.ttf (it contains a + charmap that uses offset=0xFFFFU instead of 0x0000 to indicate a + missing glyph). + +2002-09-21 Wolfgang Domröse + + * src/truetype/ttdriver.c (Load_Glyph): Fourth parameter must be + FT_Int32. + * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph): + Ditto. + +2002-09-19 Wolfgang Domröse + + More 16bit fixes. + + * src/autohint/ahglobal.c (sort_values): Use FT_Pos for `swap'. + (ah_hinter_compute_widths): Use FT_Pos for `dist'. + Use AH_MAX_WIDTHS. + * src/autohint/ahglyph.c (ah_outline_scale_blue_edges): Use FT_Pos + for `delta'. + (ah_outline_compute_edges): Replace some ints with FT_Int and + FT_Pos. + (ah_test_extrema): Clean up code. + (ah_get_orientation): Use 4 FT_Int variables instead of FT_BBox to + hold indices. + * src/autohint/ahtypes.h (AH_SegmentRec): Change type of `score' + to FT_Pos. + +2002-09-19 Werner Lemberg + + * builds/unix/config.guess, builds/unix/config.sub: Updated to + recent versions. + +2002-09-18 David Turner + + * src/base/ftobjs.c (FT_Library_Version): Bugfix. + + * FreeType 2.1.3rc2 (release candidate 2) is released! + +2002-09-17 David Turner + + * include/freetype/freetype.h, include/freetype/ftimage.h, + include/freetype/ftstroker.h, include/freetype/ftsysio.h, + include/freetype/ftsysmem.h, include/freetype/ttnameid.h: Updating + the in-source documentation. + + * src/tools/docmaker/tohtml.py: Updating the HTML formatter in the + DocMaker tool. + + * src/tools/docmaker.py: Removed. + +2002-09-17 Werner Lemberg + + More 16bit fixes. + + * src/psaux/psobjs.c (reallocate_t1_table): Use FT_Long for + second parameter. + +2002-09-16 Werner Lemberg + + 16bit fixes from Wolfgang Domröse. + + * src/type1/t1parse.h (T1_ParserRec): Change type of `base_len' + and `private_len' to FT_Long. + * src/type1/t1parse.c (T1_Get_Private_Dict): Remove cast for + `private_len'. + * src/type1/t1load.c: Use FT_Int cast for most calls of T1_ToInt. + Use FT_PtrDist where appropriate. + (parse_encoding): Use FT_Long for `count' and `n'. + (read_binary_data): Use FT_Long* for second parameter. + * src/type1/t1afm.c (afm_atoindex): Use FT_PtrDist. + + * src/cache/ftcsbits.c (ftc_sbit_node_load): Remove unused label. + * src/pshinter/pshalgo3.c (psh3_hint_align): Remove unused variable. + +2002-09-14 Werner Lemberg + + Making ftgrays.c compile stand-alone again. + + * include/freetype/ftimage.h: Include ft2build.h only if _STANDALONE_ + isn't defined. + * src/smooth/ftgrays.c [_STANDALONE_]: Define ft_memset, + FT_BEGIN_HEADER, FT_END_HEADER. + (FT_MEM_ZERO): Define. + (TRaster) [GRAYS_USE_GAMMA]: Use `unsigned char' instead of FT_Byte. + (gray_render_span, gray_init_gamma): Don't use `FT_UInt'. + Don't cast with `FT_Byte'. + (grays_init_gamma): Don't use `FT_UInt'. + +2002-09-14 Werner Lemberg + + * src/base/ftinit.c (FT_Add_Default_Modules): Improve error message. + * src/pcf/pcfdriver.c (PCF_Face_Done): Improve tracing message. + * include/freetype/config/ftoption.h (FT_MAX_MODULES): Increased + to 32. + +2002-09-10 Werner Lemberg + + * builds/unix/configure.ac (version_info): Set to 9:2:3. + * builds/unix/configure: Regenerated. + * docs/VERSION.DLL: Updated. + +2002-09-09 David Turner + + * src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points), + src/pshinter/pshalgo3.c (psh3_glyph_find_strong_points): Adding fix + to prevent seg fault when hints are provided in an empty glyph. + + * src/cache/ftccache.i (GEN_CACHE_LOOKUP) [FT_DEBUG_LEVEL_ERROR]: + Removed conditional code. This fixes a bug that prevented + compilation in debug mode of template instantiation. + + * include/freetype/ftimage.h: Removed incorrect `zft_' definitions + and updated constants documentation comments. + + * src/cff/cffparse.c (cff_parser_run): Fixed the CFF table loader. + It didn't accept empty arrays, and this prevented the loading of + certain fonts. + + * include/freetype/freetype.h (FT_FaceRec): Updating documentation + comment. The `descender' value is always *negative*, not positive. + +2002-09-09 Owen Taylor + + * src/pcf/pcfdriver.c (PCF_Glyph_Load): Fixing incorrect computation + of bitmap metrics. + +2002-09-08 David Turner + + Various updates to correctly support sub-pixel rendering. + + * include/freetype/config/ftmodule.h: Add two renderers for LCD. + + * src/base/ftobjs.c (FT_Load_Glyph): Updated. + + * src/smooth/ftsmooth.c (ft_smooth_render_lcd, + ft_smooth_render_lcd_v): Set FT_PIXEL_MODE_LCD and + FT_PIXEL_MODE_LCD_V, respectively. + + * include/freetype/cache/ftcimage.h (FTC_ImageTypeRec): New + structure. + Updated all users. + (FTC_ImageDesc): Removed. + (FTC_ImageCache_Lookup): Second parameter is now of type + `FTC_ImageType'. + Updated all users. + (FTC_IMAGE_DESC_COMPARE): Updated and renamed to... + (FTC_IMAGE_TYPE_COMPARE): This. + (FTC_IMAGE_DESC_HASH): Updated and renamed to... + (FTC_IMAGE_TYPE_HASH): This. + + * include/freetype/cache/ftcsbits.h (FTC_SBitRec): Field `num_grays' + replaced with `max_grays'. + `pitch' is now FT_Short. + (FTC_SBitCache_Lookup): Second parameter is now of type + `FTC_ImageType'. + Updated all users. + + * src/cache/ftcimage.c (FTC_ImageQueryRec, FTC_ImageFamilyRec): + Updated. + (ftc_image_node_init): Updated. + Moved code to convert type flags to load flags to... + (FTC_Image_Cache_Lookup): This function. + (ftc_image_family_init): Updated. + + * src/cache/ftcsbit.c (FTC_SBitQueryRec, FTC_SBitFamilyRec): + Updated. + (ftc_sbit_node_load): Updated. + Moved code to convert type flags to load flags to... + (FTC_SBitCache_Lookup): This function. + + * src/autohint/ahtypes.h (AH_HinterRec): Replace `no_*_hints' with + `do_*_snapping'. + Update all users (with negation). + * src/autohint/ahhint.c (ah_compute_stem_width): Fix threshold for + `dist' for `delta' < 40. + + * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Replace `no_*_hints' with + `do_*_snapping'. + Update all users (with negation). + * src/pshinter/pshalgo3.c (psh3_dimension_quantize_len): New + function. + (psh3_hint_align): Use it. + Improve hinting code. + [STRONGER]: Removed. + (STRONGER): Removed. + + * include/freetype/freetype.h (FT_Set_Hint_Flags, FT_HINT_*): + Removed. + +2002-09-05 Werner Lemberg + + * src/cid/cidobjs.c (CID_Size_Init): Renamed to... + (cid_size_init): This. + * src/psaux/psobjs.c (T1_Builder_Add_Point1): Renamed to... + (t1_builder_add_point1): This. + + Updated all affected code. + + * src/pshinter/pshalgo3.c (psh3_hint_align): Fix compiler warnings. + * src/type1/t1gload.c (T1_Compute_Max_Advance): Ditto. + +2002-09-04 David Turner + + * include/freetype/freetype.h: Corrected the definition of + ft_encoding_symbol to be FT_ENCODING_MS_SYMBOL (instead of + the erroneous FT_ENCODING_SYMBOL). + + * builds/unix/unix-def.in (datadir): Initialize it (thanks to + Anthony Fok). + +2002-08-29 David Turner + + Slight modification to the Postscript hinter to slightly increase + the contrast of smooth hinting. This is very similar to what the + auto-hinter does when it comes to stem width computations. However, + it produces better results with well-hinted fonts. + + * include/freetype/internal/psaux.h (T1_Decoder_FuncsRec): Add hint + mode to `init' member function. + (T1_DecoderRec): Add hint mode. + * include/freetype/internal/pshints (T1_Hints_ApplyFunc, + T2_Hints_ApplyFunc): Pass `hint_mode', not `hint_flags'. + * src/psaux/t1decode.c (t1_decoder_init): Add hint mode argument. + * src/pshinter/pshalgo1.c (ps1_hints_apply): Pass hint mode, not + hint flags. + * src/pshinter/pshalgo2.c (ps2_hints_apply): Ditto. + * src/pshinter/pshalgo3.c (ps3_hints_apply): Ditto. + (STRONGER): New macro. + (psh3_hint_align, psh3_hint_table_align_hints): Pass `glyph' instead + of `hint_flags'. + Implement announced changes. + * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Add flags to control + vertical and horizontal hints and snapping. + + * README, docs/CHANGES: Updating for the 2.1.3 release. + +2002-08-27 David Turner + + * Massive re-formatting changes to many, many source files. I don't + want to list them all here. The operations performed were all + logical transformations of the sources: + + - trying to convert all enums and constants to CAPITALIZED_STYLE, + #with define definitions like + + #define my_old_constants MY_NEW_CONSTANT + + - big, big update of the documentation comments + + * include/freetype/freetype.h, src/base/ftobjs.c, + src/smooth/ftsmooth.c, include/freetype/ftimage.h: Adding support + for LCD-optimized rendering though the new constants/enums: + + FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V + FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V + + This is still work in progress, don't expect everything to work + correctly though most of the features have been implemented. + + * Adding new FT_LOAD_XXX flags, used to specify both hinting and + rendering targets: + + FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering + FT_LOAD_TARGET_MONO :: monochrome bitmaps + FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated + hinting & rendering + FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated + hinting & rendering + + Note that FT_LOAD_TARGET_NORMAL is 0, which means that the default + behaviour of the font engine is _unchanged_. + + * include/freetype/ftimage.h + (FT_Outline_{Move,Line,Conic,Cubic}To_Func): Renamed to... + (FT_Outline_{Move,Line,Conic,Cubic}ToFunc): This. + (FT_Raster_Span_Func): Renamed to ... + (FT_SpanFunc): This. + (FT_Raster_{New,Done,Reset,Set_Mode,Render}_Func): Renamed to ... + (FT_Raster_{New,Done,Reset,SetMode,Render}Func}: This. + + Updated all affected code. + + * include/freetype/ftrender.h + (FT_Glyph_{Init,Done,Transform,BBox,Copy,Prepare}_Func): Renamed + to ... + (FT_Glyph_{Init,Done,Transform,GetBBox,Copy,Prepare}Func): This. + (FTRenderer_{render,transform,getCBox,setMode}): Renamed to ... + (FT_Renderer_{RenderFunc,TransformFunc,GetCBoxFunc,SeteModeFunc}): + This. + + Updated all affected code. + + * src/autohint/ahtypes.h (AH_Point, AH_Segment, AH_Edge, AH_Globals, + AH_Face_Globals, AH_Outline, AH_Hinter): These typedefs are now + pointers to the corresponding `*Rec' structures. All source files + have been updated accordingly. + + * src/cff/cffgload.c (cff_decoder_init): Add hint mode as parameter. + * src/cff/cffgload.h (CFF_Decoder): Add `hint_mode' element. + + * src/cid/cidgload.c (CID_Compute_Max_Advance): Renamed to... + (cid_face_compute_max_advance): This. + (CID_Load_Glyph): Renamed to... + (cid_slot_load_glyph): This. + * src/cid/cidload.c (CID_Open_Face): Renamed to... + (cid_face_open): This. + * src/cid/cidobjs.c (CID_GlyphSlot_{Done,Init}): Renamed to... + (cid_slot_{done,init}): This. + (CID_Size_{Get_Globals_Funcs,Done,Reset): Renamed to... + (cid_size_{get_globals_funcs,done,reset): This. + (CID_Face_{Done,Init}): Renamed to... + (cid_face_{done,init}): This. + (CID_Driver_{Done,Init}: Renamed to... + (cid_driver_{done,init}: This. + * src/cid/cidparse.c (CID_{New,Done}_Parser): Renamed to... + (cid_parser_{new,done}): This. + * src/cid/cidparse.h (CID_Skip_{Spaces,Alpha}): Renamed to... + (cid_parser_skip_{spaces,alpha}): This. + (CID_To{Int,Fixed,CoordArray,FixedArray,Token,TokenArray}): Renamed + to... + (cid_parser_to_{int,fixed,coord_array,fixed_array,token,token_array}): + This. + (CID_Load_{Field,Field_Table): Renamed to... + (cid_parser_load_{field,field_table}): This. + * src/cid/cidriver.c (CID_Get_Interface): Renamed to... + (cid_get_interface): This. + + Updated all affected code. + + * src/psaux/psobjs.c (PS_Table_*): Renamed to... + (ps_table_*): This. + (T1_Builder_*): Renamed to... + (t1_builder_*): This. + * src/psaux/t1decode.c (T1_Decoder_*): Renamed to... + (t1_decoder_*): This. + + * src/psnames/psmodule.c (PS_*): Renamed to... + (ps_*): This. + + Updated all affected code. + + * src/sfnt/sfdriver (SFNT_Get_Interface): Renamed to... + (sfnt_get_interface): This. + * src/sfnt/sfobjs.c (SFNT_*): Renamed to... + (sfnt_*): This. + * src/sfnt/ttcmap.c (TT_CharMap_{Load,Free}): Renamed to... + (tt_face_{load,free}_charmap): This. + * src/sfnt/ttcmap0.c (TT_Build_CMaps): Renamed to... + (tt_face_build_cmaps): This. + * src/sfnt/ttload.c (TT_*): Renamed to... + (tt_face_*): This. + * src/sfnt/ttpost.c (TT_Post_Default_Names): Renamed to... + (tt_post_default_names): This. + (Load_*): Renamed to... + (load_*): This. + (TT_*): Renamed to... + (tt_face_*): This. + * src/sfnt/ttsbit.c (TT_*): Renamed to... + (tt_face_*): This. + ({Find,Load,Crop}_*): Renamed to... + ({find,load,crop}_*): This. + + Updated all affected code. + + * src/smooth/ftsmooth.c (ft_smooth_render): Renamed to... + (ft_smooth_render_generic): This. + Make function more generic by adding vertical and horizontal scaling + factors. + (ft_smooth_render, ft_smooth_render_lcd, ft_smooth_render_lcd_v): + New functions. + + (ft_smooth_locd_renderer_class, ft_smooth_lcdv_renderer_class): New + classes. + + * src/truetype/ttobjs.c (TT_{Done,New}_GlyphZone): Renamed to... + (tt_glyphzone_{done,new}): This. + (TT_{Face,Size,Driver}_*): Renamed to... + (tt_{face,size,driver}_*): This. + * src/truetype/ttpload.c (TT_Load_Locations): Renamed to... + (tt_face_load_loca): This. + (TT_Load_Programs): Renamed to... + (tt_face_load_fpgm): This. + (TT_*): Renamed to... + (tt_face_*): This. + +2002-08-27 Werner Lemberg + + * docs/VERSION.DLL: New file. + +2002-08-23 Graham Asher + + * src/cff/cffgload.c (cff_operator_seac) + [FT_CONFIG_OPTION_INCREMENTAL]: Incremental fonts (actually not + incremental in the case of CFF but just using callbacks to get glyph + recipes) pass the character code, not the glyph index, to the + get_glyph_data function; they have no valid charset table. + + * src/cff/cffload.c (cff_font_load): Removed special cases for + FT_CONFIG_OPTION_INCREMENTAL, which are no longer necessary; CFF + fonts provided via the incremental interface now have to conform + more closely to the CFF font format. + + * src/cff/cffload.h (cff_font_load): Removed argument now unneeded. + + * src/cff/cffobjs.c (cff_face_init): Changed call to cff_font_load + to conform with new signature. + +2002-08-22 David Turner + + * src/base/ftobject.c, src/base/ftsynth.c, src/base/ftstroker.c, + src/bdf/bdfdrivr.c: Removed compiler warnings. + +2002-08-21 Werner Lemberg + + * src/pshinter/pshalgo3.c (psh3_glyph_compute_inflections, + psh3_glyph_compute_extrema, psh3_hint_table_find_strong_point): Fix + compiler warnings and resolve shadowing of local variables. + +2002-08-21 David Turner + + The automatic and Postscript hinter now automatically detect + inflection points in glyph outlines and treats them specially. This + is very useful to prevent nasty effect like the disappearing + diagonals of `S' and `s' in many, many fonts. + + * src/autohint/ahtypes.h (ah_flag_inflection): New macro. + * src/autohint/ahangles.c (ah_angle_diff): New function. + * src/autohint/ahangles.h: Updated. + * src/autohint/ahglyph.c (ah_outline_compute_inflections): New + function. + (ah_outline_detect_features): Use it. + * src/autohint/ahhint.c (ah_hinter_align_strong_points) + [!AH_OPTION_NO_WEAK_INTERPOLATION]: Handle inflection. + + * src/tools/docmaker/docmaker.py, src/tools/docmaker/utils.py, + src/tools/docmaker/tohtml.py: Updating the DocMaker tool. + + * include/freetype/freetype.h: Changing the type of the `load_flags' + parameter from `FT_Int' to `FT_Int32', this in order to support more + options. This should only break binary and/or source compatibility + on 16-bit platforms (Atari?). + (FT_LOAD_NO_AUTOHINT): New macro. + + * src/base/ftobjs.c (FT_Load_Glyph): Updated. + Handle FT_LOAD_NO_AUTOHINT. + (FT_Load_Char): Updated. + + * src/pshinter/pshalgo3.c, src/base/ftobjs.c, src/base/ftobject.c, + src/autohint/ahglyph.c, include/freetype/freetype.h: Fixing typos + and removing compiler warnings. + +2002-08-20 Werner Lemberg + + * src/truetype/ttgload.c (TT_Get_Metrics): Add guard for k = 0. + +2002-08-20 David Turner + + * src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c, + src/pshinter/pshglob.c, src/pshinter/pshrec.c, + src/autohint/ahmodule.c [DEBUG_HINTER]: Removing compiler warnings + (only used in development builds anyway). + + Improve support of local extrema and stem edge points. + + * src/pshinter/pshalgo3.h (PSH3_Hint_TableRec): Use PSH3_ZoneRec + for `zones'. + (PSH3_DIR_UP, PSH3_DIR_DOWN): Exchange values. + (PSH3_DIR_HORIZONTAL, PSH3_DIR_VERTICAL): New macros. + (PSH3_DIR_COMPARE, PSH3_DIR_IS_HORIZONTAL, PSH3_IS_VERTICAL): New + macros. + (PSH3_POINT_INFLEX): New enum. + (psh3_point_{is,set}_{off,inflex}): New macros. + (PSH3_POINT_{EXTREMUM,POSITIVE,NEGATIVE,EDGE_MIN,EDGE_MAX): New + enum values. + (psh3_point_{is,set}_{extremum,positive,negative,edge_min,edge_max}): + New macros. + (PSH3_PointRec): New members `flags2' and `org_v'. + (PSH3_POINT_EQUAL_ARG, PSH3_POINT_ANGLE): New macros. + + * src/pshinter/pshalgo3.c [DEBUG_HINTER]: Removing compiler + warnings. + (COMPUTE_INFLEXS): New macro. + (psh3_hint_align): Simplify some basic arithmetic computations. + (psh3_point_is_extremum): Removed. + (psh3_glyph_compute_inflections) [COMPUTE_INFLEXS]: New function. + (psh3_glyph_init) [COMPUTE_INFLEXS]: Use it. + (psh3_glyph_compute_extrema): New function. + (PSH3_STRONG_THRESHOLD): Increased to 30. + (psh3_hint_table_find_strong_point): Improved. + (psh3_glyph_find_strong_points, + psh3_glyph_interpolate_strong_points): Updated. + (psh3_hints_apply): Use psh3_glyph_compute_extrema. + + * test/gview.c (draw_ps3_hint, ps3_draw_control_points): New + functions. + Other small updates. + + * Jamfile: Small updates. + +2002-08-18 Arkadiusz Miskiewicz + + * builds/unix/install.mk (install, uninstall): Add $(DESTDIR) to + make life easier for package maintainers. + +2002-08-18 Werner Lemberg + + * src/pcf/pcfdriver.c (PCF_Glyph_Load): Fix computation of + horiBearingX. + * src/bdf/bdfdrivr.c (BDF_GlyphLoad): Fix computation of + horiBearingY. + +2002-08-16 George Williams + + Add support for Apple composite glyphs. + + * include/freetype/config/ftoption.h + (TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED): New macro. + + * src/truetype/ttgload.c (OVERLAP_COMPOUND, SCALED_COMPONENT_OFFSET, + UNSCALED_COMPONENT_OFFSET): New macros for additional OpenType + glyph loading flags. + (load_truetype_glyph): Implement it. + +2002-08-16 Werner Lemberg + + * src/cff/cffgload.c (cff_free_glyph_data), + src/cff/cffload.c (cff_font_load): Use FT_UNUSED. + +2002-08-15 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Initialize `error'. + * src/sfnt/sfobjs.c (SFNT_Load_Face): Fix compiler warning. + +2002-08-15 Graham Asher + + Implemented the incremental font loading system for the CFF driver. + Tested using the GhostScript-to-FreeType bridge (under development). + + * src/cff/cffgload.c (cff_get_glyph_data, cff_free_glyph_data): New + functions. + (cff_operator_seac, cff_compute_max_advance, cff_slot_load): Use + them. + * src/cff/cffload.c (cff_font_load): Add `face' parameter. + Load charset and encoding only if there are glyphs. + [FT_CONFIG_OPTION_INCREMENTAL]: Incremental fonts don't need + character recipes. + * src/cff/cffload.h, src/cff/cffobjs.c: Updated. + + * src/cid/cidgload.c (cid_load_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Corrected the incremental font + loading implementation to use the new system introduced on + 2002-08-01. + +2002-08-06 Werner Lemberg + + * src/cff/cffcmap.c: Remove compiler warnings. + * src/cache/ftccache.c, src/cache/ftccache.i, + src/pfr/pfrload.c, src/pfr/pfrgload.c: s/index/idx/. + * src/cff/cffload.c: s/select/fdselect/. + * src/raster/ftraster.c: s/wait/waiting/. + +2002-08-01 Graham Asher + + * src/type1/t1load.c (T1_Open_Face): Tolerate a face with no + charstrings if there is an incremental loading interface. Type 1 + faces supplied by PostScript interpreters like GhostScript will + typically not provide any charstrings at load time, so this is + essential if they are to work. + +2002-08-01 Graham Asher + + Modified incremental loading interface to be closer to David's + preferences. The header freetype.h is not now affected, the + interface is specified via an FT_Parameter, the pointer to the + interface is hidden in an internal part of the face record, and all + the definitions are in ftincrem.h. + + * include/freetype/freetype.h [FT_CONFIG_OPTION_INCREMENTAL]: + Removed. + * include/freetype/internal/ftobjs.h [FT_CONFIG_OPTION_INCREMENTAL]: + Include FT_INCREMENTAL_H. + (FT_Face_InternalRec) [FT_CONFIG_OPTION_INCREMENTAL]: Add + `incremental_interface'. + + * src/base/ftobjs.c (open_face, FT_Open_Face) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + * src/sfnt/sfobjs.c (SFNT_Load_Face) [FT_CONFIG_OPTION_INCREMENTAL]: + Updated. + + * src/truetype/ttgload.c (load_truetype_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + Free loaded glyph data properly. + (compute_glyph_metrics, TT_Load_Glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + * src/truetype/ttobjs.c (TT_Face_Init) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + (T1_Parse_Glyph) [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + Free loaded glyph data properly. + (T1_Load_Glyph): Updated. + [FT_CONFIG_OPTION_INCREMENTAL]: Free loaded glyph data properly. + +2002-07-30 David Turner + + * include/freetype/ftincrem.h: Adding new experimental header file + to demonstrate a `cleaner' API to support incremental font loading. + + * include/freetype/config/ftheader.h (FT_INCREMENTAL_H): New macro. + + * src/tools/docmaker/*: Adding new (more advanced) version of + the DocMaker tool, using Python's sophisticated regexps. + +2002-07-28 Werner Lemberg + + s/ft_memset/FT_MEM_SET/. + s/FT_MEM_SET/FT_MEM_ZERO/ where appropriate. + +2002-07-27 Werner Lemberg + + * src/sfnt/ttload.c (sfnt_dir_check): Make it work with TTCs. + +2002-07-26 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: s/memset/ft_memset/. + + * src/autohint/ahhint.c (ah_hint_edges_3): Fix compiler warning. + * src/cff/cffload.c (cff_encoding_load): Remove `memory' variable. + * src/cff/cffcmap.c (cff_cmap_encoding_init): Remove `psnames' + variable. + * src/truetype/ttgload.c (load_truetype_glyph): Remove statement + without effect. + * src/truetype/ttdriver (Get_Char_Index, Get_Next_Char): Removed. + + * src/pshinter/pshalgo3.c (psh3_hint_table_record, + psh3_hint_table_init, psh3_hint_table_activate_mask): Fix error + message. + +2002-07-24 Graham Asher + + * src/truetype/ttobjs.c: Fix for bug reported by Sven Neumann + [sven@gimp.org] on the FreeType development forum: `If + FT_CONFIG_OPTION_INCREMENTAL is undefined (this is the default), the + TrueType loader crashes in line 852 of src/truetype/ttgload.c when + it tries to access face->glyph_locations.' + +2002-07-18 Graham Asher + + Added types and structures to support incremental typeface loading. + The FT_Incremental_Interface structure, defined in freetype.h, is + designed to be passed to FT_Open_Face to provide callback functions + to obtain glyph recipes and metrics, for fonts like those passed + from PostScript that do not necessarily provide all, or any, glyph + information, when first opened. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL): + New configuration macro to enable incremental face loading. By + default it is not defined. + + * include/freetype/freetype.h (FT_Basic_Glyph_Metrics, + FT_Get_Glyph_Data_Func, FT_Get_Glyph_Metrics_Func, + FT_Incremental_Interface_Funcs, FT_Incremental_Interface) + [FT_CONFIG_OPTION_INCREMENTAL]: New. + (FT_Open_Args, FT_FaceRec) [FT_CONFIG_OPTION_INCREMENTAL]: New field + `incremental_interface'. + (FT_Open_Flags) [FT_CONFIG_OPTION_INCREMENTAL]: New enum + `ft_open_incremental'. + + * include/freetype/fttypes.h: Include FT_CONFIG_CONFIG_H. + (FT_Data): New structure to represent binary data. + + * src/base/ftobjs.c (open_face) [FT_CONFIG_OPTION_INCREMENTAL]: + Add parameter for incremental loading. + (FT_Open_Face) [FT_CONFIG_OPTION_INCREMENTAL]: Use incremental + interface. + + * src/truetype/ttgload.c (load_truetype_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading system + for the TrueType driver. + (compute_glyph_metrics): Return FT_Error. + [FT_CONFIG_OPTION_INCREMENTAL]: Check for overriding metrics. + (TT_Load_Glyph) [FT_CONFIG_OPTION_INCREMENTAL]: Don't look for + the glyph table while handling an incremental font. + Get glyph offset. + + * src/truetype/ttobjs.c (TT_Face_Init) + [FT_CONFIG_OPTION_INCOREMENTAL]: Added the incremental loading + system for the TrueType driver. + + * src/cid/cidgload.c (cid_load_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading system + for the CID driver. + + * src/sfnt/sfobjs.c (SFNT_Load_Face) [FT_CONFIG_OPTION_INCREMENTAL]: + Changes to support incremental Type 42 fonts: Assume a font has + glyphs if it has an incremental interface object. + + * src/type1/t1gload.c (T1_Parse_Glyph): Renamed to... + (T1_Parse_Glyph_And_Get_Char_String): This. + [FT_CONFIG_OPTION_INCREMENTAL]: Added support for incrementally + loaded Type 1 faces. + (T1_Parse_Glyph): New function. + (T1_Load_Glyph): Updated. + +2002-07-17 David Turner + + Cleaning up the cache sub-system code; linear hashing is now the + default. + + * include/freetype/cache/ftccache.h, src/cache/ftccache.i, + src/cache/ftccache.c [!FTC_CACHE_USE_LINEAR_HASHING]: Removed. + (FTC_CACHE_USE_LINEAR_HASHING: Removed also. + + FT_CONFIG_OPTION_USE_CMAPS is now the default. + + * include/freetype/internal/ftdriver.h (FT_Driver_ClassRec): Remove + `get_char_index' and `get_next_char'. + + * include/freetype/config/ftoption.h, + include/freetype/internal/tttypes.h, src/base/ftobjs.c, + src/bdf/bdfdrivr.c, src/cff/cffobjs.c, src/pcf/pcfdrivr.c, + src/pfr/pfrdrivr.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c, + src/sfnt/ttcmap0.h, src/sfnt/ttload.c, src/type1/t1objs.c, + src/type42/t42objs.c, src/winfonts/winfnt.c + [!FT_CONFIG_OPTION_USE_CMAPS]: Removed. The new cmap code is now + the default. + + * src/type42/t42objs.c (T42_CMap_CharIndex, T42_CMap_CharNext): + Removed. + * src/type42/t42objs.h: Updated. + + * src/cid/cidriver.c (Cid_Get_Char_Index, Cid_Get_Next_Char): + Removed. + (t1_cid_driver_class): Updated. + * src/truetype/ttdriver.c (tt_driver_class): Updated. + * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Removed + (t1_driver_class): Updated. + * src/type42/t42drivr.c (t42_driver_class): Updated. + + * src/base/ftobjs.c (open_face): Select Unicode cmap by default. + + * src/sfnt/ttload.c (TT_Load_SFNT_Header): Fixed a recent bug that + prevented OpenType fonts to be recognized by FreeType. + +2002-07-11 David Turner + + Changing the SFNT loader to check for SFNT-based font files + differently. We now ignore the range `helper' fields and check the + `head' table's magic number instead. + + * include/freetype/internal/tttypes.h (SFNT_HeaderRec): Add `offset' + field. + + * src/sfnt/ttload.c (sfnt_dir_check): New function. + (TT_Load_SFNT_HeaderRec): Renamed to... + (TT_Load_SFNT_Header): This. + Implement new functionality. + * src/sfnt/ttload.h: Updated. + * src/sfnt/sfdriver.c (sfnt_interface): Updated. + + * src/base/ftobject.c, src/base/fthash.c: Updated object sub-system + and dynamic hash table implementation (still experimental, don't + use). + * include/freetype/internal/fthash.h: Updated. + * include/freetype/internal/ftobjs.h (FT_LibraryRec): New member + `meta_class'. + + Fixing a bug in the Type 1 loader that prevented valid font bounding + boxes to be loaded from multiple master fonts. + + * include/freetype/t1tables.h (PS_BlendRec): Add `bboxes' field. + + * include/freetype/internal/psaux.h (T1_FieldType): Add + `T1_FIELD_TYPE_BBOX'. + (T1_FieldLocation): Add `T1_FIELD_LOCATION_BBOX'. + (T1_FIELD_BBOX): New macro. + + * src/psaux/psobjs.c (PS_Parser_LoadField): Handle T1_FIELD_TYPE_BBOX. + * src/type1/t1load.c (t1_allocate_blend): Create blend->bboxes. + (T1_Done_Blend): Free blend->bboxes. + (t1_load_keyword): Handle T1_FIELD_LOCATION_BBOX. + (parse_font_bbox): Commented out. + (t1_keywords): Comment out `parse_font_bbox'. + * src/type1/t1tokens.h: Define `FontBBox' field. + +2002-07-10 David Turner + + * src/cff/cffobjs.c: Small fix to select the Unicode charmap by + default when needed. + Small fix to allow OpenType fonts to support Adobe charmaps when + needed. + + * src/cff/cffcmap.c, src/cff/cffcmap.h: New files to support + charmaps for CFF fonts. + + * src/cff/cff.c, src/cff/Jamfile, src/cff/rules.mk: Updated. + + * include/freetype/internal/cfftypes.h (CFF_EncodingRec): Use + fixed-length arrays for `sids' and `codes'. Add `count' member. + (CFF_FontRec): Add `psnames' member. + + * src/cff/cffdrivr.c, src/cff/cffload.c, src/cff/cffload.h, + src/cff/cffobjs.c, src/cff/cffobjs.h, src/cff/cffparse.c, + src/cffparse.h, src/cff/cffgload.c, src/cff/cffgload.h: Adding + support for CFF charmaps, reformatting the sources, and removing + some bugs in the Encoding and Charset loaders. + Many fonts renamed to use lowercase only: + + CFF_Builder_Init -> cff_builder_init + CFF_Builder_Done -> cff_builder_done + CFF_Init_Decoder -> cff_decoder_init + CFF_Parse_CharStrings -> cff_decoder_parse_charstrings + CFF_Load_Glyph -> cff_slot_load + CFF_Init_Decoder -> cff_decoder_init + CFF_Prepare_Decoder -> cff_decoder_prepare + CFF_Get_Standard_Encoding -> cff_get_standard_encoding + CFF_Access_Element -> cff_index_access_element + CFF_Forget_Element -> cff_index_forget_element + CFF_Get_Name -> cff_index_get_name + CFF_Get_String -> cff_index_get_sid_string + CFF_Get_FD -> cff_fd_select_get + CFF_Done_Charset -> cff_charset_done + CFF_Load_Charset -> cff_charset_load + CFF_Done_Encoding -> cff_encoding_done + CFF_Load_Encoding -> cff_encoding_load + CFF_Done_SubFont -> cff_subfont_done + CFF_Load_Font -> cff_font_load + CFF_Done_Font -> cff_font_done + CFF_Size_Get_Global_Funcs -> cff_size_get_global_funcs + CFF_Size_Done -> cff_size_done + CFF_Size_Init -> cff_size_init + CFF_Size_Reset -> cff_size_reset + CFF_GlyphSlot_Done -> cff_slot_done + CFF_GlyphSlot_Init -> cff_slot_init + CFF_StrCopy -> cff_strcpy + CFF_Face_Init -> cff_face_init + CFF_Face_Done -> cff_face_done + CFF_Driver_Init -> cff_driver_init + CFF_Driver_Done -> cff_driver_done + CFF_Parser_Init -> cff_parser_init + CFF_Parser_Run -> cff_parser_run + + add_point -> cff_builder_add_point + add_point1 -> cff_builder_add_point1 + add_contour -> cff_builder_add_contour + close_contour -> cff_builder_close_contour + cff_explicit_index -> cff_index_get_pointers + +2002-07-09 Owen Taylor + + * src/pshinter/pshglob.c (psh_globals_new): Fixed a bug that + prevented the hinter from using correct standard width and height + values, resulting in hinting bugs with certain fonts (e.g. Utopia). + +2002-07-07 David Turner + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Added code to return + successfully when the function is called with a bitmap glyph (the + previous code simply returned with an error). + + * docs/DEBUG.TXT: Adding debugging support documentation. + + * src/base/ftdebug.c (ft_debug_init), builds/win32/ftdebug.c + (ft_debug_init), builds/amiga/src/ftdebug.c (ft_debug_init): Changed + the syntax of the FT2_DEBUG environment variable used to control + debugging output (i.e. logging and error messages). It must now + look like: + + any:6 memory:4 io:3 or + any:6,memory:4,io:3 or + any:6;memory:4;io:3 + +2002-07-07 Owen Taylor + + * src/pshinter/pshglob.c (psh_blues_snap_stem): Adding support for + blue fuzz. + * src/pshinter/pshglob.h (PSH_BluesRec): Add `blue_fuzz' field. + * src/type1/t1load.c (T1_Open_Face): Initialize `blue_fuzz'. + + Adding support for hinter-specific bit flags, and the new + FT_Set_Hint_Flags high-level API. + + * include/freetype/freetype.h (FT_Set_Hint_Flags): New function. + (FT_HINT_NO_INTEGER_STEM, FT_HINT_NO_HSTEM_ALIGN, + FT_HINT_NO_VSTEM_ALIGN): New macros. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Add + `hint_flags' member. + + * src/base/ftobjs.c (FT_Set_Hint_Flags): New function. + + * include/freetype/internal/psaux.h (T1_DecoderRec): Add `hint_flags' + member. + + * include/freetype/internal/pshints.h (T1_Hints_ApplyFunc, + T2_Hints_ApplyFunc): Add parameter to pass hint flags. + + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings, + T1_Decoder_Init): Use decoder->hint_flags. + * src/cff/cffgload.h (CFF_Builder): Add `hint_flags' field. + * src/cff/cffgload.c (CFF_Builder_Init): Set builder->hint_flags. + (CFF_Parse_CharStrings): Updated. + * src/pshinter/pshalgo1.c (ps1_hints_apply): Add parameter to handle + hint flags (unused). + * src/pshinter/pshalgo1.h: Updated. + * src/pshinter/pshalgo2.c (ps2_hints_apply): Add parameter to handle + hint flags (unused). + * src/pshinter/pshalgo2.h: Updated. + * src/pshinter/pshalgo3.c (ps3_hints_apply): Add parameter to handle + hint flags. + * src/pshinter/pshalgo3.h: Updated. + +2002-07-04 David Turner + + * src/pfr/pfrobjs.c (pfr_slot_load): Fixed a small bug that returned + incorrect advances when the outline resolution was different from + the metrics resolution. + + * src/autohint/ahhint.c: Removing compiler warnings. + + * src/autohint/ahglyph.c: s/FT_MEM_SET/FT_ZERO/ where appropriate. + (ah_outline_link_segments): Slight improvements to the serif + detection code. More work is needed though. + +2002-07-03 David Turner + + Small improvements to the automatic hinter. Uneven stem-widths have + now disappeared and everything looks much better, even if there are + still issues with serifed fonts. + + * src/autohint/ahtypes.h (AH_Globals): Added `stds' array. + * src/autohint/ahhint.c (OPTIM_STEM_SNAP): New #define. + (ah_snap_width): Commented out. + (ah_align_linked_edge): Renamed to... + (ah_compute_stem_width): This. + Don't allow uneven stem-widths. + (ah_align_linked_edge): New function. + (ah_align_serifed_edge): Don't strengthen serifs. + (ah_hint_edges_3, ah_hinter_scale_globals): Updated. + +2002-07-03 Owen Taylor + + Adding new algorithm based on Owen Taylor's recent work. + + * src/pshinter/pshalgo3.c, src/pshinter/pshalgo3.h: New files. + * src/pshinter/pshalgo.h: Updated. + Use pshalgo3 by default. + * src/pshinter/pshinter.c: Include pshalgo3.c. + + * src/pshinter/Jamfile, src/pshinter/rules.mk: Updated. + +2002-07-01 Owen Taylor + + * src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points): Fix a bug + where, if a glyph has more than hint mask, the second mask gets + applied to points that should have been covered by the first mask. + +2002-07-01 Keith Packard + + * src/sfnt/ttcmap0.c (tt_cmap8_char_next, tt_cmap12_char_next): + Fixing the cmap 8 and 12 parsing routines. + +2002-07-01 David Turner + + * src/base/ftsynth.c: Include FT_TRIGONOMETRY_H. + (FT_Outline_Embolden): Renamed to... + (FT_GlyphSlot_Embolden): This. + Updated to new trigonometric functions. + (FT_Outline_Oblique): Renamed to... + (FT_GlyphSlot_Oblique): This. + (ft_norm): Removed. + * include/freetype/ftsynth.h: Updated. + +2002-06-26 David Turner + + * include/freetype/internal/ftobject.h: Updating the object + sub-system definitions (still experimental). + + * src/base/fthash.c (ft_hash_remove): Fixing a small reallocation + bug. + + * src/base/fttrigon.c (FT_Vector_From_Polar, FT_Angle_Diff): New + functions. + * include/freetype/fttrigon.h: Updated. + + + Adding path stroker component (work in progress). + + * include/freetype/ftstroker.h, src/base/ftstroker.c: New files. + * src/base/Jamfile: Updated. + + * include/freetype/config/ftheader.h (FT_STROKER_H): New macro. + + + * src/truetype/ttgload.c (TT_Load_Composite_Glyph), + src/base/ftoutln.c (FT_Vector_Transform): Fixed Werner's latest fix. + FT_Vector_Transform wasn't buggy, the TrueType composite loader was. + +2002-06-24 Werner Lemberg + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. + +2002-06-21 David Turner + + + * Version 2.1.2 released. + ========================= + + +2002-06-21 Roberto Alameda . + + * include/freetype/internal/t42types.h (T42_Font): Removed since + it is already in t42objs.h. + (T42_Face): Use T1_FontRec. + + * src/base/fttype1.c (FT_Get_PS_Font_Info): Updated. + (FT_Has_PS_Glyph_Names): Check for type42 driver name also. + * src/type42/t42objs.h: Include FT_INTERNAL_TYPE42_TYPES_H. + (T42_Face): Removed since it is already in t42types.h. + +2002-06-21 Detlef Würkner + + * src/pfrgload.c (pfr_glyph_load_compound): Fix loading of composite + glyphs. + +2002-06-21 Sven Neumann + + * src/prf/pfrtypes.h (PFR_KernPair): New structure. + (PFR_PhyFont): Use it. + (PFR_KernFlags): New enumeration. + * src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): New + function. + (pfr_phy_font_extra_items): Use it. + (pfr_phy_font_done): Updated. + * src/pfr/pfrobjs.c (pfr_face_init): Set kerning flag conditionally. + (pfr_face_get_kerning): New function. + * src/pfr/pfrobjs.h: Updated. + * src/pfr/pfrdrivr.c (pfr_driver_class): Updated. + +2002-06-21 David Turner + + * README, docs/CHANGES: Preparing the 2.1.2 release. + +2002-06-19 Detlef Würkner + + * src/base/fttype1.c: Include FT_INTERNAL_TYPE42_TYPES_H. + (t1_face_check_cast): Removed. + (FT_Get_PS_Font_Info): Make it work with CID and Type 42 drivers + also. + +2002-06-19 Sebastien BARRE + + * src/type42/t42parse.c (t42_parse_sfnts): Fix compiler warning. + +2002-06-19 Werner Lemberg + + * src/base/ftoutln.c (FT_Vector_Transform): Fix serious typo + (xy <-> yx). + * src/truetype/ttgload.c (load_truetype_glyph): Replace `|' with + `||' to make code easier to read. + +2002-06-18 Roberto Alameda . + + * src/type42/t42objs.c (t42_check_size_change): Removed. + (T42_Size_SetChars, T42_Size_SetPixels): Use FT_Activate_Size + instead. + (T42_GlyphSlot_Load): Remove call to t42_check_size_change. + +2002-06-18 Detlef Würkner + + * src/psaux/t1cmap.c (t1_cmap_custom_char_index, + t1_cmap_custom_char_next): Fix index computation -- indices start + with 0 and not with cmap->first. + + Provide default charmaps. + + * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c + (PCF_Face_Init), src/pfr/pfrobjs.c (pfr_face_init), + src/type1/t1objs (T1_Face_Init), src/winfonts/winfnt.c + (FNT_Face_Init): Implement it. + +2002-06-17 Sven Neumann + + * src/pfr/pfrobjs.c (pfr_face_init): Fix typo. + +2002-06-16 Leonard Rosenthol + + Updated Win32/VC++ projects to include the new PFR driver. + + * builds/win32/visualc/freetype.dsp: Updated. + +2002-06-16 Anthony Fok + + Install freetype2.m4. + + * builds/unix/install.mk (install, uninstall): Handle it. + +2002-06-16 Detlef Würkner + + Same fix for PFR driver. + + * src/pfr/pfrcmap.c (pfr_cmap_char_index, pfr_cmap_char_next): + Increase return value by 1. + * src/pfr/pfrobjs.c (pfr_slot_load): Decrease index by 1. + +2002-06-15 Detlef Würkner + + Fix glyph indices to make index zero always the undefined glyph. + + * src/bdf/bdfdrivr.c (bdf_cmap_init): Don't decrease + cmap->num_encodings. + (bdf_cmap_char_index, bdf_cmap_char_next, BDF_Get_Char_Index): + Increase result by 1 for normal cases. + (BDF_Glyph_Load): Decrease index by 1. + + * src/pcf/pcfdriver.c (pcf_cmap_char_index, pcf_cmap_char_next, + PCF_Char_Get_Index): Increase result by 1 for normal cases. + (PCF_Glyph_Load): Decrease index by 1. + * src/pcf/pcfread.c (pcf_get_encodings): Don't decrease j for + allocating `encoding'. + + * src/base/ftobjs.c (FT_Load_Glyph, FT_Get_Glyph_Name): Fix + bounding tests. + +2002-06-14 Detlef Würkner + + Add new cmap support to BDF driver. + + * src/bdf/bdfdrivr.c (BDF_CMapRec) [FT_CONFIG_OPTION_USE_CMAPS]: + New structure. + (bdf_cmap_init, bdf_cmap_done, bdf_cmap_char_index, + bdf_cmap_char_next) [FT_CONFIG_OPTION_USE_CMAPS]: New functions. + (BDF_Get_Char_Index) [!FT_CONFIG_OPTION_USE_CMAPS]: Use only + conditionally. + (BDF_Face_Init): Handle `AVERAGE_WIDTH' and `POINT_SIZE' keywords. + Implement new cmap handling. + (bdf_driver_class): Updated. + +2002-06-14 Werner Lemberg + + * Makefile, configure, */*.mk, builds/unix/unix-def.in, + docs/CHANGES, docs/INSTALL: s/TOP/TOP_DIR/. + +2002-06-12 Werner Lemberg + + * src/bdf/bdflib.c: s/FT_Short/short/ for consistency. + +2002-06-11 David Turner + + * builds/win32/ftdebug.c: Added a missing #endif. + + * src/sfnt/ttload.c, src/bdf/bdflib.c: Removing compiler warnings. + + Removed the bug in Type 42 driver that prevented un-hinted outlines + to be loaded. + + * src/type42/t42objs.c (T42_Face_Init): Call FT_Done_Size. + (T42_Size_Init): Call FT_Activate_Size. + (t42_check_size_change): New function. + (T42_Size_SetChars, T42_Size_SetPixels): Use it. + (ft_glyphslot_clear): Replace FT_MEM_SET with FT_ZERO. + (T42_GlyphSlot_Load): Use t42_check_size_change. + Initialize more fields of `glyph'. + + * builds/win32/visualc/freetype.dsp: Updated. + +2002-06-09 David Turner + + + * Version 2.1.1 released. + ========================= + + +2002-06-08 Juliusz Chroboczek + + * include/freetype/internal/ftobjs.h, src/autohint/ahglyph.c, + src/base/ftobjs.c, src/sfnt/ttcmap0.c, src/smooth/ftgrays.c: Don't + use `setjmp', `longjmp', and `jmp_buf' but `ft_setjmp', `ft_longjmp', + and `ft_jmp_buf'. + Removed direct references to and when + appropriate, to eventually replace them with a + FT_CONFIG_STANDARD_LIBRARY_H. Useful for the XFree86 Font Server + backend based on FT2. + + * src/base/fttype1.c (FT_Has_PS_Glyph_Names): Fix return value. + +2002-06-08 David Turner + + * src/pcf/pcfdriver.c (pcf_cmap_char_next): Fixed a bug that caused + the function to return invalid values. + + * src/cache/ftccache.i: Removing a typo that prevented + the source's compilation. + + * src/cache/ftccache.c (ftc_node_hash_unlink): Fixed a + bug that caused nasty memory overwrites. The hash table's + buckets array wasn't correctly resized when shrunk. + +2002-06-08 Detlef Würkner + + * builds/amiga/smakefile, builds/amiga/makefile: Updated. + +2002-06-08 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_hash_unlink, ftc_node_hash_link) + [FTC_CACHE_USE_LINEAR_HASHING]: Fix returned error code. + Fix debugging messages. + * src/cache/ftccache.i (GEN_CACHE_LOOKUP): Move declaration of + `family' and `hash' up to make it compilable with g++. + + * src/type42/t42error.h: New file. + * src/type42/t42drivr.c, src/type42/t42objs.c, + src/type42/t42parse.c: Use t42 error codes. + * src/type42/rules.mk: Updated. + + * src/base/ftnames.c: Include FT_INTERNAL_STREAM_H. + +2002-06-08 David Turner + + * src/cache/ftccmap.c: GEN_CACHE_FAMILY_COMPARE, + GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]: + New macros. + (ftc_cmap_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to + ftc_cache_lookup. + (FTC_CMapCache_Lookup): Updated. + + Adding various experimental optimizations to the cache manager. + + * include/freetype/cache/ftccache.h (FTC_CACHE_USE_INLINE, + FTC_CACHE_USE_LINEAR_HASHING): New options. + (FTC_CacheRec) [FTC_CACHE_USE_LINEAR_HASHING]: New elements `p', + `mask', and `slack'. + + * src/cache/ftccache.c (FTC_HASH_MAX_LOAD, FTC_HASH_MIN_LOAD, + FTC_HASH_SUB_LOAD) [FTC_CACHE_USE_LINEAR_HASHING, + FTC_HASH_INITIAL_SIZE]: New macros. + (ftc_node_mru_link, ftc_node_mru_up): Optimized. + (ftc_node_hash_unlink, ftc_node_hash_link) + [FTC_CACHE_USE_LINEAR_HASHING]: New variants. + (FTC_PRIMES_MIN, FTC_PRIMES_MAX, ftc_primes, ftc_prime_closest, + FTC_CACHE_RESIZE_TEST, ftc_cache_resize) + [!FTC_CACHE_USE_LINEAR_HASHING]: Define it conditionally. + (ftc_cache_init, ftc_cache_clear) [FTC_CACHE_USE_LINEAR_HASHING]: + Updated. + (ftc_cache_lookup) [FTC_CACHE_USE_LINEAR_HASHING]: Implement it. + + * src/cache/ftccache.i: New file. + + * src/cache/ftcsbits.c (GEN_CACHE_FAMILY_COMPARE, + GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]: + New macros. + (ftc_sbit_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to + ftc_cache_lookup. + (FTC_SBitCache_Lookup): Updated. + + * src/type42/t42parse.c: Removing duplicate function. + +2002-06-07 Graham Asher + + * src/base/ftobjs.c (FT_Render_Glyph_Internal): Changed definition + from FT_EXPORT_DEF to FT_BASE_DEF. + +2002-06-07 David Turner + + Fixed the bug that prevented the correct display of fonts with + `ftview'. + + * src/type42/t42drivr.c: Split into... + * src/type42/t42drivr.h, src/type42/t42parse.c, + src/type42/t42parse.h, src/type42/t42objs.h, src/type42/t42objs.c, + src/type42/type42.c: New files. + + (t42_get_glyph_name, t42_get_ps_name, t42_get_name_index): Use + `face->type1'. + + (Get_Interface): Renamed to... + (T42_Get_Interface): This. + Updated. + (T42_Open_Face, T42_Face_Done): Updated. + (T42_Face_Init): Add new cmap support. + Updated. + (T42_Driver_Init, T42_Driver_Done, T42_Size_Init, T42_Size_Done, + T42_GlyphSlot_Init, T42_GlyphSlot_Done): Updated. + (Get_Char_Index, Get_Next_Char): Renamed to... + (T42_CMap_CharIndex, T42_CMap_CharNext): This. + Updated. + (T42_Char_Size, T42_Pixel_Size): Renamed to... + (T42_Size_SetChars, T42_Size_SetPixels): This. + (T42_Load_Glyph): Renamed to... + (T42_GlyphSlot_Load): This. + + (t42_init_loader, t42_done_loader): Renamed to... + (t42_loader_init, t42_loader_done): This. + (T42_New_Parser, T42_Finalize_Parser): Renamed to... + (t42_parser_init, t42_parser_done): This. + (parse_dict): Renamed to... + (t42_parse_dict): This. + (is_alpha, is_space, hexval): Renamed to... + (t42_is_alpha, t42_is_space, t42_hexval): This. + (parse_font_name, parse_font_bbox, parse_font_matrix, + parse_encoding, parse_sfnts, parse_charstrings, parse_dict): + Renamed to... + (t42_parse_font_name, t42_parse_font_bbox, t42_parse_font_matrix, + t42_parse_encoding, t42_parse_sfnts, t42_parse_charstrings, + t42_parse_dict): This. + Updated. + + (t42_keywords): Updated. + + * src/type42/Jamfile, src/type42/descrip.mms: Updated. + +2002-06-03 Werner Lemberg + + Add 8bpp support to BDF driver. + + * src/bdf/bdflib.c (_bdf_parse_start): Handle 8bpp. + * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Ditto. + * src/bdf/README: Updated. + +2002-06-02 Detlef Würkner + + * src/pfr/pfrload.c (pfr_phy_font_done): Free `blue_values' array. + +2002-05-29 Detlef Würkner + + * src/bdf/bdflib.c (_bdf_readstream): Allocate `buf' dynamically. + (_bdf_parse_glyphs): Use correct size for allocating + `font->unencoded'. + (bdf_load_font): Free array conditionally. + Return proper error code in case of failure. + * src/bdf/bdfdrivr.c (BDF_Face_Init): Make it more robust against + unusual fonts. + +2002-05-29 Werner Lemberg + + * src/bdf/descrip.mms, src/type42/descrip.mms: New files. + * descrip.mms (all): Updated. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Fix typo which prevented + compilation. + * src/pshglob.c (psh_blues_scale_zones): Fix compiler warning. + +2002-05-28 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/smakefile, + amiga/include/freetype/config/ftmodule.h: Updated to include + support for BDF and Type42 drivers. + + * docs/modules.txt: Updated. + +2005-05-28 David Turner + + * docs/CHANGES: Updating file for next release (2.1.1). + + * src/bdf/bdflib.c: Removing compiler warnings. + + * include/freetype/ftxf86.h, src/base/ftxf86.c: New files. + They provide a new API (FT_Get_X11_Font_Format) to retrieve an + X11-compatible string describing the font format of a given face. + This was put in a new optional base source file, corresponding to a + new public header (named FT_XFREE86_H since this function should + only be used within the XFree86 font server IMO). + + * include/freetype/config/ftheader.h (FT_XFREE86_H): New macro (not + documented yet). + + * src/base/fttype1.c: New file, providing two new API functions + (FT_Get_PS_Font_Info and FT_Has_PS_Glyph_Names). + * include/freetype/t1tables.h: Updated. + + * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: + Updating build control files for the new files `ftxf86.c' and + `fttype1.c' in src/base. + + * src/pshinter/pshglob.c (psh_blues_scale_zones): Fixed a bug that + prevented family blue zones substitution from hapenning correctly. + + * include/freetype/ftbdf.h FT_Get_BDF_Charset_ID): Adding + documentation comment. + +2002-05-28 Werner Lemberg + + * src/base/ftnames.c (FT_Get_Sfnt_Name): Don't use FT_STREAM_READ_AT + but FT_STREAM_READ. + Declare `stream' variable. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Replace floating point math + with calls to `FT_MulDiv'. + +2002-05-28 David Turner + + Fixing the SFNT name table loader to support various buggy fonts. + It now ignores empty name entries, entries with invalid pointer + Offsets and certain fonts containing tables with broken + `storageOffset' fields. + + Name strings are now loaded on demand, which reduces the memory + requirements for a given FT_Face tremendously (for example, the name + table of Arial.ttf is about 10Kb and contains 70 names). + + This is a temporary fix. The whole name table loader and interface + will be rewritten in a much more cleanly way shortly, once CSEH have + been introduced in the sources. + + * include/freetype/internal/tttypes.h (TT_NameEntryRec): Change + type of `stringOffset' to FT_ULong. + (TT_NameTableRec): Change type of `numNameRecords' and + `storageOffset' to FT_UInt. + Replace `storage' with `stream'. + * src/base/ftnames.c (FT_Get_Sfnt_Name): Load name on demand. + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto. + Make code more robust. + * src/sfnt/sfobjs.c (TT_NameEntry_ConvertFunc): New typedef. + (tt_face_get_name): Use it. + Make code more robust. + * src/sfnt/ttload.c (TT_Load_Names): Use `static' for arrays. + Handle invalid `storageOffset' data better. + Set length fields to zero for invalid or ignored data. + Remove code within FT_DEBUG_LEVEL_TRACE. + (TT_Free_Names): Updated. + +2002-05-24 Tim Mooney + + * builds/unix/ft-munmap.m4: New file, extracted FT_MUNMAP_DECL and + FT_MUNMAP_PARAM from aclocal.m4 into here, so aclocal.m4 can be + rebuilt from sources. Set macro serial to 1, and use third argument + to AC_DEFINE for our two custom symbols, so ftconfig.in could one day + be rebuilt with autoheader (not recommended now, ftconfig.in is a + custom source file) + +2002-05-22 Werner Lemberg + + * include/freetype/config/ftheader.h (FT_BEZIER_H): Removed. + (FT_BDF_H): New macro for accessing `ftbdf.h'. + + * src/type42/t42drivr.c (hexval): Fix typo. + +2002-05-21 Martin Muskens + + * src/psaux/psobjs.c (T1Radix): New function. + (t1_toint): Use it to handle numbers in radix format. + + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Add dummy + for undocumented, obsolete opcode 15. + +2002-05-21 David Turner + + * src/bdf/bdflib.c: Removed compiler warning, and changed all tables + to the `static const' storage specifier (instead of simply + `static'). + + * src/type42/t42drivr.c (hexval): Use more efficient code. + Removing compiler warnings. + * src/bdf/bdfdrivr.c: Removing compiler warnings. + + * include/freetype/internal/ftbdf.h, src/base/ftbdf.c, + src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk + (FT_Get_BDF_Charset_ID): New API to retrieve BDF-specific strings + from a face. This is much cleaner than accessing the internal types + `BDF_Public_Face' defined in FT_INTERNAL_BDF_TYPES_H. + +2002-05-21 Werner Lemberg + + * src/bdf/README: Mention Microsoft's SBIT tool. + + * src/cff/cffdrivr.c, src/cid/cidriver.c, src/pcf/pcfdriver.c, + src/truetype/ttdriver.c, src/type1/t1driver.c, + src/winfonts/winfnt.c, src/type42/t42drivr.c, src/bdf/bdfdrivr.c + [FT_CONFIG_OPTION_DYNAMIC_DRIVERS]: Completely removed. It has + been never used. + +2002-05-21 Roberto Alameda . + + * src/type42/t42drivr.c: s/T42_ENCODING_TYPE_/T1_ENCODING_TYPE_/. + (parse_font_matrix): Remove unnecessary code. + (parse_sfnts): Initialize some variables. + (t42_driver_class) [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Use + ft_module_driver_has_hinter conditionally. + Moved some type 42 specific structure definitions to... + * include/freetype/internal/t42types.h: New file. + * include/freetype/internal/internal.h (FT_INTERNAL_T42_TYPES_H): + New macro. + +2002-05-20 Werner Lemberg + + * include/freetype/cache/ftcsbits.h (FTC_SBit): Added a new field + `num_grays' for specifying the number of used gray levels. + * src/cache/ftcsbits.c (ftc_sbit_node_load): Initialize it. + +2002-05-19 Werner Lemberg + + Adding a driver for BDF fonts written by Francesco Zappa Nardelli + . Heavily modified by me to + better adapt it to FreeType, removing unneeded stuff. Additionally, + it now supports Mark Leisher's BDF extension for anti-aliased + bitmap glyphs with 2 and 4 bpp. + + * src/bdf/*: New driver. + * include/freetype/internal/bdftypes.h: New file. + * include/freetype/internal/fttrace.h: Added BDF driver components. + * include/freetype/fterrdef.h: Added error codes for BDF driver. + * include/freetype/config/ftmodule.h, src/Jamfile: Updated. + * include/freetype/internal/internal.h (FT_INTERNAL_BDF_TYPES_H): + New macro. + + * include/freetype/config/ftstdlib.h (ft_sprintf): New alias for + sprintf. + +2002-05-18 Werner Lemberg + + * include/freetype/internal/fttrace.h: Added Type 42 driver + component. + * src/type42/t42drivr.c: Use it. + + * include/freetype/internal/internal.h (FT_INTERNAL_PCF_TYPES_H): + New macro. + +2002-05-17 Werner Lemberg + + * src/type42/Jamfile: New file. + +2002-05-14 Werner Lemberg + + Adding a driver for Type42 fonts written by Roberto Alameda + . + + * src/type42/*: New driver. + * include/freetype/config/ftmodule.h, src/Jamfile: Updated. + * include/freetype/config/ftstdlib.h (ft_xdigit, ft_memcmp, + ft_atoi): New aliases for xdigit, memcmp, and atoi, respectively. + +2002-05-12 Owen Taylor + + * src/sfnt/ttload.c (TT_LookUp_Table): Protect against tables + with a zero length value. + +2002-05-12 Michael Pfeiffer + + * builds/beos/beos.mk: Include `link-std.mk'. + +2002-05-12 Werner Lemberg + + * src/type1/t1load.h (T1_Loader): Renamed to... + (T1_LoaderRec): This. + (T1_Loader): Now pointer to T1_LoaderRec. + * src/type1/t1load.c: Updated. + + * include/freetype/internal/t1types.h, src/type1/t1load.c, + src/type1/t1objs.c: + s/T1_ENCODING_TYPE_EXPORT/T1_ENCODING_TYPE_EXPERT/. + +2002-05-06 Werner Lemberg + + * README: Add a note regarding libttf vs. libfreetype. + +2002-05-05 Werner Lemberg + + FreeType 2 can now be built in an external directory with the + configure script also. + + * builds/freetype.mk (INCLUDES): Add `OBJ_DIR'. + + * builds/unix/detect.mk (have_mk): New variable to test for + external build. + (unix-def.mk): Defined according to value of `have_mk'. + * builds/unix/unix.mk (have_mk): New variable to test for + external build. + Select include paths for unix-def.mk and unix-cc.mk according + to value of `have_mk'. + * builds/unix/unix-def.in (OBJ_BUILD): New variable. + (DISTCLEAN): Use it. + * builds/unix/unix-cc.in (LIBTOOL): Define default value only + if not yet defined. + * builds/unix/install.mk (install): Use `OBJ_BUILD' for installing + freetype-config. + + * configure: Don't depend on bash features. + (ft2_dir, abs_curr_dir, abs_ft2_dir): New variables (code + partially taken from Autoconf). + Build a dummy Makefile if not building in source tree. + + * docs/INSTALL: Document it. + +2002-05-04 David Turner + + * src/truetype/ttgload.c (TT_Load_Glyph): Finally fixing the last + bug that prevented FreeType 2.x and FreeType 1.x to produce + bit-by-bit identical monochrome glyph bitmaps with native TrueType + hinting. The culprit was a single-bit flag that wasn't set + correctly by the TrueType glyph loader. + + * src/otlayout/otlayout.h, src/otlayout/otlbase.c, + src/otlayout/otlbase.h, src/otlayout/otlconf.h, + src/otlayout/otlgdef.c, src/otlayout/otlgdef.h, + src/otlayout/otlgpos.c, src/otlayout/otlgpos.h, + src/otlayout/otlgsub.c, src/otlayout/otlgsub.h, + src/otlayout/otljstf.c, src/otlayout/otljstf.h, + src/otlayout/otltable.c, src/otlayout/otltable.h, + src/otlayout/otltags.h: New OpenType Layout source files. The + module is still incomplete. + +2002-05-02 Werner Lemberg + + * src/sfnt/ttcmap0.c (tt_cmap4_char_index): Fix serious typo + (0xFFFU -> 0xFFFFU). + +2002-05-01 Werner Lemberg + + * docs/INSTALL: Fix URL of makepp. + +2002-05-01 David Turner + + * src/sfnt/sfobjs.c (tt_face_get_name): Fixing a bug that caused + FreeType to crash when certain broken fonts (e.g. `hya6gb.ttf') + were opened. + + * src/sfnt/ttload.c (TT_Load_Names): Applied a small work-around to + manage fonts containing a broken name table (e.g. `hya6gb.ttf'). + + * src/sfnt/ttcmap0.c (tt_cmap4_validate): Fixed over-restrictive + validation test. The charmap validator now accepts overlapping + ranges in format 4 charmaps. + + * src/sfnt/ttcmap0.c (tt_cmap4_char_index): Switched to a binary + search algorithm. Certain fonts contain more than 170 distinct + segments! + + * include/freetype/config/ftstdlib.h: Adding an alias for the `exit' + function. This will be used in the near future to panic in case of + unexpected exception (which shouldn't happen in theory). + + * include/freetype/internal/fthash.h, src/base/fthash.c: New files. + This is generic implementation of dynamic hash tables using a linear + algorithm (to get rid of `stalls' during resizes). In the future + this will be used in at least three parts of the library: the cache + sub-system, the object sub-system, and the memory debugger. + + * src/base/Jamfile: Updated. + + * include/freetype/internal/internal.h (FT_INTERNAL_HASH_H, + FT_INTERNAL_OBJECT_H): New macros. + + * include/freetype/internal/ftcore.h: New file to group all new + definitions related to exception handling and memory management. It + is very likely that this file will disappear or be renamed in the + future. + + * include/freetype/internal/ftobject.h, include/freetype/ftsysmem.h: + Adding comments to better explain the object sub-system as well as + the new memory manager interface. + +2002-04-30 Wenlin Institute (Tom Bishop) + + * src/base/ftmac.c (p2c_str): Removed. + (file_spec_from_path) [TARGET_API_MAC_CARBON]: Added support for + OS X. + (is_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X. + Handle `nameLen' <= 6 also. + (parse_fond): Remove unused variable `name_table'. + Use functionality of old p2c_str directly. + Add safety checks. + (read_lwfn): Initialize `size_p'. + Check for size_p == NULL. + (new_memory_stream, open_face_from_buffer): Updated to FreeType 2.1. + (FT_New_Face_From_LWFN): Remove unused variable `memory'. + Remove some dead code. + (FT_New_Face_From_SFNT): Remove unused variable `stream'. + (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Define only for + OS X. + (FT_New_Face_From_FOND): Remove unused variable `error'. + (ResourceForkSize): New function. + (FT_New_Face): Use it. + Handle empty resource forks. + Conditionalize some code for OS X. + Add code to call normal loader as a fallback. + +2002-04-30 Werner Lemberg + + `interface' is reserved on the Mac. + + * include/freetype/ftoutln.h, include/freetype/internal/sfnt.h, + src/base/ftoutln.c: s/interface/func_interface/. + * src/base/ftbbox.c (FT_Outline_Get_BBox): + s/interface/bbox_interface/. + * src/cff/cffdrivr.c: s/interface/module_interface/. + * src/cff/cffload.c, src/cff/cffload.h: + s/interface/psnames_interface/. + * src/cid/cidriver.c: s/interface/cid_interface/. + * src/sfnt/sfdriver.c: s/interface/module_interface/. + * src/smooth/ftgrays.c: s/interface/func_interface/. + * src/truetype/ttdriver.c: s/interface/tt_interface/. + * src/type1/t1driver.c: s/interface/t1_interface/. + + Some more variable renames to avoid troubles on the Mac. + + * src/raster/ftraster.c: + s/Unknown|Ascending|Descending|Flat/\1_State/. + * src/smooth/ftgrays.c: s/TScan/TCoord/. + + Other changes for the Mac. + + * include/freetype/config/ftconfig.h: Define FT_MACINTOSH for + Mac platforms. + * src/base/ftobjs.c: s/macintosh/FT_MACINTOSH/. + + * src/raster/ftrend1.c (ft_raster1_render): Make `pitch' always + an even number. + +2002-04-29 Jouk Jansen + + * descrip.mms (all): Add pfr driver. + +2002-04-28 Werner Lemberg + + * src/pfr/pfrerror.h: New file. + * include/freetype/ftmoderr.h: Add PFR error codes. + * src/pfr/pfrgload.c: Include pfrerror.h. + Use PCF error codes. + (pfr_extra_item_load_stem_snaps): Fix debug message. + * src/pfr/pfrgload.c: Include pfrerror.h. + Use PCF error codes. + (pfr_extra_item_load_bitmap_info, pfr_glyph_load_simple, + pfr_glyph_load_compound): Fix debug message. + * src/pfr/pfrobjs.c: Include pfrerror.h. + Use PCF error codes. + (pfr_face_init): Return PFR_Err_Unknown_File_Format. + * src/pfr/rules.mk (PFR_DRV_H): Include pfrerror.h. + + * src/pcf/pcfdriver.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_CMAPS]: + `root' -> `face->root'. + * src/sfnt/ttcmap0.c (TT_Build_CMaps) [!FT_CONFIG_OPTION_USE_CMAPS]: + Removed. + * src/sfnt/ttcmap0.c: Declare TT_Build_CMaps only for + FT_CONFIG_OPTION_USE_CMAPS. + +2002-04-27 Werner Lemberg + + * src/cache/ftccache.c (ftc_cache_lookup), + src/cache/ftccmap.c (ftc_cmap_family_init), + src/cache/ftcmanag.c (ftc_family_table_alloc), + src/cache/ftcsbits.c (FTC_SBit_Cache_Lookup): Use FTC_Err_*. + src/cache/ftcimage.c (FTC_Image_Cache_Lookup): Use FTC_Err_*. + (FTC_ImageCache_Lookup): Fix handling of invalid arguments. + +2002-04-22 Werner Lemberg + + * builds/unix/configure.ac: Set `version_info' to 9:1:3 (FT2 + version 2.0.9 has 9:0:3). + * builds/unix/configure: Regenerated (using autoconf 2.53). + +2002-04-19 Werner Lemberg + + * src/pfr/pfrload.c (pfr_extra_items_farse): Fix debug message. + (pfr_phy_font_load): s/size/Size/ for local variable to avoid + compiler warning. + * src/pfr/pfrobjs.c (pfr_face_init): Fix debug message. + (pfr_slot_load): Remove redundant local variable. + +2002-04-19 David Turner + + Adding a PFR font driver to the FreeType sources. Note that it + doesn't support embedded bitmaps or kerning tables yet. + + src/pfr/*: New files. + + * include/freetype/config/ftmodule.h, + include/freetype/internal/fttrace.h, src/Jamefile: Updated. + + * src/type1/t1gload.h (T1_Load_Glyph), src/type1/t1gload.c + (T1_Load_Glyph): Fixed incorrect parameter sign-ness in callback + function. + + * include/freetype/internal/ftmemory.h (FT_MEM_ZERO, FT_ZERO): New + macros. + + * include/freetype/internal/ftstream.h (FT_NEXT_OFF3, FT_NEXT_UOFF3, + FT_NEXT_OFF3_LE, FT_NEXT_UOFF3_LE): New macros to parse in-memory + 24-bit integers. + +2002-04-18 David Turner + + * src/base/ftobjs.c, builds/win32/ftdebug.c, + builds/amiga/src/base/ftdebug.c: Version 2.1.0 couldn't be linked + against applications in Win32 and Amiga builds due to changes to + `src/base/ftdebug.c' that were not properly propagated to + `builds/win32' and `builds/amiga'. This has been fixed. + + * include/freetype/internal/ftobject.h, + include/freetype/internal/ftexcept.h, include/freetype/ftsysmem.h, + include/freetype/ftsysio.h, src/base/ftsysmem.c, src/base/ftsysio.c: + New experimental files. + +2002-04-17 David Turner + + + * Version 2.1.0 released. + ========================= + + +2002-04-17 Michael Jansson + + * src/type1/t1gload.c (T1_Compute_Max_Advance): Fixed a small bug + that prevented the function to return the correct value. + +2002-04-16 Francesco Zappa Nardelli + + * src/pcf/pcfread (pcf_get_accell): Fix parsing of accelerator + tables. + +2002-04-15 David Turner + + * docs/FTL.txt: Formatting. + + * include/freetype/config/ftoption.h: Reduce the size of the + render pool from 32kByte to 16kByte. + + * src/pcf/pcfread.c (pcf_seek_to_table_type): Remove compiler + warning. + + * include/freetype/config/ftoption.h (FT_MAX_EXTENSIONS): Removed. + + * docs/CHANGES: Preparing 2.1.0 release. + +2002-04-13 Werner LEMBERG + + * src/cff/cffgload.c (CFF_Parse_CharStrings): s/rand/Rand/ to avoid + compiler warning. + +2002-04-12 David Turner + + * README.UNX: Updated the Unix-specific quick-compilation guide to + warn about the GNU Make requirement at compile time. + + * include/freetype/config/ftstdlib.h, + include/freetype/config/ftconfig.h, + include/freetype/config/ftheader.h, + include/freetype/internal/ftmemory.h, + include/freetype/internal/ftobjs.h, + + src/autohint/ahoptim.c, + + src/base/ftdbgmem.c, src/base/ftdebug.c, src/base/ftmac.c, + src/base/ftobjs.c, src/base/ftsystem.c, + + src/cache/ftcimage.c, src/cache/ftcsbits.c, + + src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c, + + src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c, + + src/pcf/pcfdriver.c, src/pcf/pcfread.c, + + src/psaux/t1cmap.c, src/psaux/t1decode.c, + + src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c, + src/pshinter/pshrec.c, + + src/psnames/psmodule.c, + + src/raster/ftraster.c, + + src/sfnt/sfdriver.c, src/sfnt/ttload.c, + + src/smooth/ftgrays.c, + + src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c, + src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c, + + builds/unix/ftconfig.in, builds/vms/ftconfig.h, + + builds/amiga/src/base/ftdebug.c: + + Added the new configuration file `ftstdlib.h' used to define + aliases for all ISO C library functions used by the engine + (e.g. strlen, qsort, setjmp, etc.). + + This eases the porting of FreeType 2 to environments like + XFree86 modules/extensions. + + Also removed many #include , #include , etc. + from the engine's sources where they are not needed. + + * src/sfnt/ttpost.c: Use macro name for psnames.h. + +2002-04-12 Vincent Caron + + * configure, builds/detect.mk: Updated the build system to print + a warning message in case GNU Make isn't used to build the library. + +2002-04-11 David Turner + + * README, docs/CHANGES, Jamfile.in: Updates for the 2.1.0 release. + + * docs/FTL.txt: Updated license text to provide a preferred + disclaimer and adjust copyright dates/extents. + + * include/freetype/cache/ftcglyph.h: Removing obsolete (and + confusing) comment. + + * Jamfile.in: New file. + +2002-04-11 Maxim Shemanarev + + * src/smooth/ftgrays.c (gray_hline): Minor optimization. + +2002-04-02 Werner Lemberg + + Fixes from the stable branch: + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_OLD_CALCS): + Removed. + [FT_CONFIG_OPTION_OLD_CALCS]: Removed. + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c + [FT_CONFIG_OPTION_OLD_CALCS]: Removed. + + * src/base/fttrigon.c (FT_Vector_Length): Change algorithm to match + output of FreeType 1. + + * src/pshinter/pshglob.c (psh_globals_scale_widths): Fixed a small + bug that created un-even stem widths when hinting Postscript fonts. + + * src/type1/t1driver.c, src/type1/t1parse.c: 16bit fixes. + +2002-04-01 Werner Lemberg + + * src/truetype/ttgload.c: 16bit fixes. + (TT_Load_Simple_Glyph): Improve debug messages. + (load_truetype_glyph): Remove dead code. + * src/truetype/ttinterp.c: 16bit fixes. + * src/truetype/ttobjs.c: Ditto. + + * include/freetype/ftsnames.h, include/freetype/internal/sfnt.h, + src/cff/cffload.h, src/psaux/psobjs.h, src/truetype/ttinterp.[ch], + src/sfnt/ttpost.h: s/index/idx/. + +2002-03-31 Yao Zhang + + * src/truetype/ttobjs.c (TT_Size_Init): Fix typo. + +2002-03-31 Werner Lemberg + + * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h: s/index/idx/. + * src/psaux/t1cmap.c: Ditto. + * src/sfnt/ttcmap0.c: Ditto. + + * include/freetype/internal/tttypes.h, + include/freetype/internal/sfnt.h (TT_Goto_Table_Func): Renamed to ... + (TT_Loader_GotoTableFunc): This. + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix debug + messages. + * src/psnames/psmodule.c (psnames_interface) + [!FT_CONFIG_OPTION_ADOBE_GLYPH_LIST]: Fix typo. + * src/sfnt/sfdriver.c (get_sfnt_table): 16bit fix. + * src/sfnt/ttcmap.c: 16bit fixes (0xFFFF -> 0xFFFFU). + * src/sfnt/ttcmap0.c: 16bit fixes. + (TT_Build_CMaps): Simplify debug messages. + (tt_cmap12_char_next): Fix offset. + * src/sfnt/ttload.c (TT_Load_Names, TT_Load_CMap): Fix debug + messages. + (TT_Load_OS2): 16bit fix. + +2002-03-30 David Turner + + * include/freetype/internal/tttypes.h: Adding comments to some of + the TT_FaceRec fields. + + * src/sfnt/ttcmap0.c (TT_Build_CMaps): Removed compiler warnings. + + * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_{utf16,ucs4,other}: + New functions. + (tt_face_get_name): Use them to properly extract an ascii font name. + +2002-03-30 Werner Lemberg + + * include/freetype/t1tables.h (t1_blend_max): Fix typo. + * src/base/ftstream.c: Simplify FT_ERROR calls. + * src/cff/cffdrivr.c (cff_get_glyph_name): Fix debug message. + + * src/cff/cffobjs.c (CFF_Driver_Init, CFF_Driver_Done) + [TT_CONFIG_OPTION_EXTEND_ENGINE]: Removed. + * src/cff/sfobjs.c (SFNT_Load_Face) + [TT_CONFIG_OPTION_EXTEND_ENGINE]: Ditto. + * src/truetype/ttobjs.c (TT_Init_Driver, TT_Done_Driver) + [TT_CONFIG_OPTION_EXTEND_ENGINE]: Ditto. + + * src/truetype/ttdriver.c, src/truetype/ttobjs.c, + src/truetype/ttobjs.h: Renaming driver functions to the + FT__ scheme: + + TT_Init_Driver => TT_Driver_Init + TT_Done_Driver => TT_Driver_Done + TT_Init_Face => TT_Face_Init + TT_Done_Face => TT_Face_Done + TT_Init_Size => TT_Size_Init + TT_Done_Size => TT_Size_Done + TT_Reset_Size => TT_Size_Reset + +2002-03-29 Werner Lemberg + + * builds/vms/ftconfig.h: Rename LOCAL_DEF and LOCAL_FUNC to + FT_LOCAL and FT_LOCAL_DEF, respectively, as with other ftconfig.h + files. + * builds/unix/ftconfig.in: Add argument to FT_LOCAL and + FT_LOCAL_DEF. + * src/truetype/ttinterp.c: s/FT_Assert/FT_ASSERT/. + * builds/unix/configure.ac: Temporarily deactivate creation of + ../../Jamfile. + * builds/unix/configure: Updated. + +2002-03-28 KUSANO Takayuki + + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fix serious typos. + +2002-03-28 Werner Lemberg + + * include/freetype/internal/psaux.h (PSAux_ServiceRec): Fix + compiler warnings. + * include/freetype/internal/t1types.h (T1_FaceRec): Use `const' for + some members. + * src/base/ftapi.c (FT_New_Memory_Stream): Fix typos. + * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Add + cast. + (t1_cmap_{standard,expert,custom,unicode}_class_rec): Use + `FT_CALLBACK_TABLE_DEF'. + * src/psaux/t1cmap.h: Updated. + * src/sfnt/ttcmap0.c (TT_Build_CMaps): Use `ft_encoding_none' + instead of zero. + * src/type1/t1objs.c (T1_Face_Init): Use casts. + +2002-03-26 David Turner + + * src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c: + Fixed a small bug in the FT_CMaps support code. + +2002-03-25 David Turner + + * src/truetype/ttinterp.c (Norm): Replaced with... + (TT_VecLen): This. + (TT_MulFix14, TT_DotFix14): New functions. + (Project, Dual_Project, Free_Project, Compute_Point_Displacement, + Ins_SHPIX, Ins_MIAP, Ins_MIRP): Use them. + [FT_CONFIG_OPTION_OLD_CALCS]: Removed all code. + +2002-03-22 David Turner + + * src/base/ftobjs.c, src/sfnt/ttcmap0.c, src/type1/t1objs.c: + Various fixes to make the FT_CMaps support work correctly (more + tests are still needed). + + * include/freetype/internal/ftobjs.h, src/sfnt/Jamfile, + src/sfnt/rules.mk, src/sfnt/sfnt.c, src/sfnt/sfobjs.c, + src/sfnt/ttload.c, src/sfnt/ttcmap0.c, src/sfnt/ttcmap0.h: Updated + the SFNT charmap support to use FT_CMaps. + + * include/freetype/fterrdef.h: New file. + * include/freetype/fterrors.h: Include it. It contains all error + codes. + * include/freetype/config/ftheader.h (FT_ERROR_DEFINITIONS_H): New + macro. + + * include/freetype/internal/ftmemory.h, and a lot of other files: + Changed the names of memory macros. Examples: + + MEM_Set => FT_MEM_SET + MEM_Copy => FT_MEM_COPY + MEM_Move => FT_MEM_MOVE + + ALLOC => FT_ALLOC + FREE => FT_FREE + REALLOC = >FT_REALLOC + + FT_NEW was introduced to allocate a new object from a _typed_ + pointer. + + Note that ALLOC_ARRAY and REALLOC_ARRAY have been replaced by + FT_NEW_ARRAY and FT_RENEW_ARRAY which take _typed_ pointer + arguments. + + This results in _lots_ of sources being changed, but makes the code + more generic and less error-prone. + + * include/freetype/internal/ftstream.h, src/base/ftstream.c, + src/cff/cffload.c, src/pcf/pcfread.c, src/sfnt/ttcmap.c, + src/sfnt/ttcmap0.c, src/sfnt/ttload.c, src/sfnt/ttpost.c, + src/sfnt/ttsbit.c, src/truetype/ttgload.c, src/truetype/ttpload.c, + src/winfonts/winfnt.c: Changed the definitions of stream macros. + Examples: + + NEXT_Byte => FT_NEXT_BYTE + NEXT_Short => FT_NEXT_SHORT + NEXT_UShortLE => FT_NEXT_USHORT_LE + READ_Short => FT_READ_SHORT + GET_Long => FT_GET_LONG + etc. + + Also introduced the FT_PEEK_XXXX functions. + + * src/cff/cffobjs.c (CFF_Build_Unicode_Charmap): Removed commented + out function. + (find_encoding): Removed. + (CFF_Face_Init): Remove charmap support. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_CMAPS, + TT_CONFIG_CMAP_FORMAT{0,2,4,6,8,10,12}): New macros to fine-tune + support of cmaps. + +2002-03-21 David Turner + + * src/base/ftobjs.c, src/pcf/pcfdriver.c, src/pcf/pcfread.c: Updated + to new FT_CMap definitions. + + * src/psaux/t1cmap.h, src/psaux/t1cmap.c, src/type1/t1cmap.h, + src/type1/t1cmap.c: Updating and moving the Type 1 FT_CMap support + from `src/type1' to `src/psaux' since it is going to be shared by + the Type 1 and CID font drivers. + + * src/psaux/Jamfile, src/psaux/psaux.c, src/psaux/psauxmod.c, + src/psaux/rules.mk, include/freetype/internal/psaux.h: Added support + for Type 1 FT_CMaps. + +2002-03-20 David Turner + + * src/base/ftgloadr.c (FT_GlyphLoader_CheckSubGlyphs): Fixed a + memory allocation bug that was due to un-careful renaming of the + FT_SubGlyph type. + + * src/base/ftdbgmem.c (ft_mem_table_destroy): Fixed a small bug that + caused the library to crash with Electric Fence when memory + debugging is used. + + * Renaming stream macros. Examples: + + FILE_Skip => FT_STREAM_SKIP + FILE_Read => FT_STREAM_READ + ACCESS_Frame => FT_FRAME_ENTER + FORGET_Frame => FT_FRAME_EXIT + etc. + + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed memory leak. + + * include/freetype/internal/ftobjs.h: Changing the definition of + FT_CMap_CharNextFunc slightly. + + * src/cff/*.c: Updating CFF type definitions. + +2002-03-14 David Turner + + * include/freetype/internal/autohint.h, src/autohint/ahmodule.c, + src/base/ftapi.c, src/base/ftobjs.c: Updating the type definitions + for the auto-hinter module. + + FT_AutoHinter_Interface => FT_AutoHinter_ServiceRec + FT_AutoHinter_Interface* => FT_AutoHinter_Service + etc. + + FT_AutoHinter_Get_Global_Func => FT_AutoHinter_GlobalGetFunc + FT_AutoHinter_Done_Global_Func => FT_AutoHinter_GlobalDoneFunc + etc. + + * ahloader.h [_STANDALONE_]: Removed all conditional code. + + * include/freetype/internal/cfftypes.h, src/cff/*.c: Updating the + type definitions of the CFF font driver. + + CFF_Font => CFF_FontRec + CFF_Font* => CFF_Font + etc. + + * include/freetype/internal/fnttypes.h, src/winfonts/*.c: Updating + type definitions of the Windows FNT font driver. + + * include/freetype/internal/ftdriver.h, + include/freetype/internal/ftobjs.h, src/base/ftapi.c, + src/base/ftobjs.c, src/cff/cffdrivr.c, src/cff/cffdrivr.h, + src/cid/cidriver.c, src/cid/cidriver.h, src/pcf/pcfdriver.c, + src/pcf/pcfdriver.h, src/truetype/ttdriver.c, + src/truetype/ttdriver.h, src/type1/t1driver.c, src/type1/t1driver.h, + src/winfonts/winfnt.c, src/winfonts/winfnt.h: Updating type + definitions for font drivers. + + FTDriver_initFace => FT_Face_InitFunc + FTDriver_initGlyphSlot => FT_Slot_InitFunc + etc. + + * src/cid/cidobjs.c (CID_Face_Init): Remove dead code. + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c: Updated a + few face method definitions: + + FT_PSName_Requester => FT_Face_GetPostscriptNameFunc + FT_Glyph_Name_Requester => FT_Face_GetGlyphNameFunc + FT_Name_Index_Requester => FT_Face_GetGlyphNameIndexFunc + + * src/base/ftapi.c: New file. It contains backwards compatibility + functions. + + * include/freetype/internal/psaux.h, src/cid/cidload.c, + src/cidtoken.h, src/psaux/psobjs.c, src/psaux/psobjs.h, + src/psaux/t1decode.c, stc/type1/t1load.c, src/type1/t1tokens.h: + Updated common PostScript type definitions. + Renamed all enumeration values like to uppercase variants: + + t1_token_any => T1_TOKEN_TYPE_ANY + t1_field_cid_info => T1_FIELD_LOCATION_CID_INFO + etc. + + * include/freetype/internal/psglobals.h: Removed. + * include/freetype/internal/pshints.h, src/pshinter/pshglob.h: + Updated. + + * include/freetype/internal/tttypes.h, + include/freetype/internal/sfnt.h, src/base/ftnames.c, + src/cff/cffdrivr.c, src/sfnt/*.c, src/truetype/*.c: Updated + SFNT/TrueType type definitions. + + * include/freetype/freetype.h, include/freetype/internal/ftgloadr.h: + Updating type definitions for the glyph loader. + +2002-03-13 Antoine Leca + + * include/freetype/config/ftoption.h: Changed the automatic + detection of Microsoft C compilers to automatically support 64-bit + integers only since revision 9.00 (i.e. >= Visual C++ 2.0). + +2002-03-08 Werner Lemberg + + * src/base/ftutil.c (FT_Realloc): Use MEM_Set instead of memset. + +2002-03-07 Werner Lemberg + + * src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new, + ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free, + ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug, + FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings. + * src/base/ftcalc.c (FT_MulFix): Ditto. + * src/cff/cffdrivr.c (cff_get_name_index): Ditto. + * src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init, + CFF_GlyphSlot_Init): Ditto. + * src/cid/cidobjs.c (CID_GlyphSlot_Init, + CID_Size_Get_Globals_Funcs): Ditto. + * src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init): + Ditto. + * src/pshinter/pshmod.c (pshinter_interface): Use `static const'. + * src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused + variables. + + * include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed + to... + (T1_Builder_FuncsRec): This. + (T1_Builder_Funcs): New typedef. + (PSAux_Interface): Remove compiler warnings. + * src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h + (t1_builder_funcs): Updated. + + * src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ... + (PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines. + (PSH_AlignmentRec): Updated. + + * include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix + typo. + * include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto. + * src/base/ftstream (FT_Get_Char): Rename to... + (FT_Stream_Get_Char): This. + + * src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is + a built-in function in gcc, causing warning messages with gcc 3.0. + * src/autohint/ahglyph.c (ah_outline_load): Ditto. + * src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto. + * src/cache/ftcmanag.c (ftc_family_table_alloc, + ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache): + Ditto. + * src/cff/cffload.c (cff_new_index, cff_done_index, + cff_explicit_index, CFF_Access_Element, CFF_Forget_Element, + CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font, + CFF_Done_Font): Ditto. + * src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto. + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto. + * src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit, + ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3, + * src/pshinter/pshalgo1.c (psh1_hint_table_record, + psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto. + * src/pshinter/pshalgo2.c (psh2_hint_table_record, + psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto. + * src/sfnt/ttpost.c (Load_Format_20, Load_Format_25, + TT_Get_PS_Name): Ditto. + * src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics, + load_truetype_glyph): Ditto. + * src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto. + * src/type1/t1afm.c (T1_Get_Kerning): Ditto. + * include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto. + +2002-03-06 David Turner + + * src/type1/t1objs.c (T1_Face_Init), src/cid/cidobjs.c + (CID_Face_Init): Fixed another bug related to the + ascender/descender/text height of Postscript fonts. + + * src/pshinter/pshalgo2.c (print_zone): Renamed to ... + (psh2_print_zone): This. + * src/pshinter/pshalgo1.c (print_zone): Renamed to ... + (psh1_print_zone): This. + + * include/freetype/freetype.h, include/freetype/internal/ftobjs.h, + src/base/ftobjs.c: Adding the new FT_Library_Version API to return + the library's current version in dynamic links. + * src/base/ftinit.c (FT_Init_FreeType): Updated. + +2002-03-06 Werner Lemberg + + * src/pshinter/pshglob.h (PSH_DimensionRec): s/std/stdw/. + * src/pshinter/pshglob.c (psh_global_scale_widths, + psh_dimension_snap_width, psh_globals_destroy, psh_globals_new): + Ditto. + +2002-03-05 David Turner + + * src/type1/t1objs.c (T1_Face_Init), src/cff/cffobjs.c + (CFF_Face_Init), src/cid/cidobjs.c (CID_Face_Init): Removing the bug + that returned global BBox values in 16.16 fixed format (instead of + integer font units). + + * src/cid/cidriver.c (cid_get_postscript_name): Fixed a bug that + caused the CID driver to return Postscript font names with a leading + slash (`/') as in `/MOEKai-Regular'. + + * src/sfnt/ttload.c (TT_Load_Names), src/sfnt/sfobjs.c (Get_Name), + src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed the loader so + that it accepts broken fonts like `foxjump.ttf', which made FreeType + crash when trying to load them. + + Also improved the name table parser to be able to load + Windows-encoded entries before Macintosh or Unicode ones, since it + seems some fonts don't have reliable values here anyway. + + * include/freetype/internal/psnames.h: Add typedef for + `PSNames_Service'. + +2002-03-05 Werner Lemberg + + * builds/unix/aclocal.m4, builds/unix/ltmain.sh: Update to libtool + 1.4.2. + Apply a small patch for AIX to make shared libraries work (this + patch is already in the CVS version of libtool). + + * builds/unix/config.sub, builds/unix/config.guess: Updated to + recent versions. + + * builds/unix/configure.ac: Fix typo + (AC_CONFIG_FILE->AC_CONFIG_FILES). + + * builds/unix/configure: Regenerated. + +2002-02-28 David Turner + + * include/freetype/ftconfig.h: Changed `FT_LOCAL xxxx' to + `FT_LOCAL( xxxx )' everywhere in the source. The same goes for + `FT_LOCAL_DEF xxxx' which is translated to `FT_LOCAL_DEF( xxxxx )'. + + * include/freetype/freetype.h (FREETYPE_MINOR, FREETYPE_PATCH): + Changing version to 2.1.0 to indicate an unstable branch. + Added the declarations of FT_Get_First_Char and FT_Get_Next_Char. + + * src/base/ftobjs.c: Implement FT_Get_First_Char and + FT_Get_Next_Char. + + * include/freetype/t1tables.h: Renaming structure types. This + + typedef T1_Struct_ + { + } T1_Struct; + + becomes + + typedef PS_StructRec_ + { + } PS_StructRec, *PS_Struct; + + typedef PS_StructRec T1_Struct; /* backwards-compatibility */ + + Hence, we increase the coherency of the source code by effectively + using the `Rec' prefix for structure types. + +2002-02-27 David Turner + + * src/sfnt/ttload.c (TT_Load_Names): Simplifying and securing the + names table loader. Invalid individual name entries are now handled + correctly. This allows the loading of very buggy fonts like + `foxjump.ttf' without allocating tons of memory and causing crashes. + + * src/otlayout/otlcommon.h, src/otlayout/otlcommon.c: Adding (still + experimental) code for OpenType Layout tables validation and + parsing. + + * src/type1/t1cmap.h, src/type1/t1cmap.c: Adding (still + experimental) code for Type 1 charmap processing. + + * src/sfnt/ttcmap0.c: New file. It contains a new, still + experimental SFNT charmap processing support. + + * include/freetype/internal/ftobjs.h: Adding validation support as + well as internal charmap object definitions (FT_CMap != FT_CharMap). + +2002-02-24 David Turner + + * Renaming stream functions to the FT__ scheme: + + FT_Seek_Stream => FT_Stream_Seek + FT_Skip_Stream => FT_Stream_Skip + FT_Read_Stream => FT_Stream_Read + FT_Read_Stream_At => FT_Stream_Read_At + FT_Access_Frame => FT_Stream_Enter_Frame + FT_Forget_Frame => FT_Stream_Exit_Frame + FT_Extract_Frame => FT_Stream_Extract_Frame + FT_Release_Frame => FT_Stream_Release_Frame + FT_Get_XXXX => FT_Stream_Get_XXXX + FT_Read_XXXX => FT_Stream_Read_XXXX + + FT_New_Stream( filename, stream ) => + FT_Stream_Open( stream, filename ) + + (The function doesn't create the FT_Stream structure, it simply + initializes it for reading.) + + FT_New_Memory_Stream( library, FT_Byte* base, size, stream ) => + FT_Stream_Open_Memory( stream, const FT_Byte* base, size ) + + FT_Done_Stream => FT_Stream_Close + FT_Stream_IO => FT_Stream_IOFunc + FT_Stream_Close => FT_Stream_CloseFunc + + ft_close_stream => ft_ansi_stream_close (in base/ftsystem.c only) + ft_io_stream => ft_ansi_stream_io (in base/ftsystem.c only) + + * src/base/ftutil.c: New file. Contains all memory and list + management code (previously in `ftobjs.c' and `ftlist.c', + respectively). + + * include/freetype/internal/ftobjs.h: Moving all code related to + glyph loaders to ... + * include/freetype/internal/ftgloadr.h: This new file. + `FT_GlyphLoader' is now a pointer to the structure + `FT_GlyphLoaderRec'. + (ft_glyph_own_bitmap): Renamed to ... + (FT_GLYPH_OWN_BITMAP): This. + * src/base/ftobjs.c: Moving all code related to glyph loaders + to ... + * src/base/ftgloadr.c: This new file. + +2002-02-22 Werner Lemberg + + * include/freetype/internal/ftdebug.h (FT_Trace): Remove comma in + enum to avoid compiler warnings. + +2002-02-21 David Turner + + Modified the debug sub-system initialization. Trace levels can now + be specified within the `FT2_DEBUG' environment variable. See the + comments within `ftdebug.c' for more details. + + * src/base/ftdebug.c: (FT_SetTraceLevel): Removed. + (ft_debug_init): New function. + (ft_debug_dummy): Removed. + Updated to changes in ftdebug.h + + * include/freetype/internal/ftdebug.h: Always define + FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE is defined. + (FT_Assert): Renamed to ... + (FT_ASSERT): This. + Some stuff from ftdebug.h has been moved to ... + + * include/freetype/internal/fttrace.h: New file, to define the trace + levels used for debugging. It is used both to define enums and + toggle names for FT2_DEBUG. + + * include/freetype/internal/internal.h: Updated. + + * src/base/ftobjs.c, src/base/ftstream.c: Updated. + + * include/freetype/internal/ftextend.h, src/base/ftextend.c: + Removed. Both files are now completely obsolete. + * src/base/Jamfile, src/base/rules.mk: Updated. + + * include/freetype/fterrors.h: Adding `#undef FT_ERR_CAT' and + `#undef FT_ERR_XCAT' to avoid warnings with certain compilers (like + LCC). + + * src/pshinter/pshalgo2.c (print_zone): Renamed to ... + (psh2_print_zone): This to avoid errors during compilation of debug + library. + + * src/smooth/ftgrays.c (FT_COMPONENT): Change definition to as + `trace_smooth'. + +2002-02-20 David Turner + + * README: Adding `devel@freetype.org' address for bug reports. + +2002-02-20 Werner Lemberg + + * builds/unix/install.mk (check): New dummy target. + (.PHONY): Add it. + +2002-02-19 Werner Lemberg + + * builds/freetype.mk (FT_CFLAGS): Use $(INCLUDE_FLAGS) first. + + * src/cache/ftccache.c (ftc_cache_resize): Mark `error' as unused + to avoid compiler warning. + * src/cff/cffload.c (CFF_Get_String): Ditto. + * src/cff/cffobjs.c (CFF_StrCopy): Ditto. + * src/psaux/psobjs.c (PS_Table_Done): Ditto. + * src/pcf/pcfread.c (pcf_seek_to_table_type): Ditto. + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto. + (pcf_get_bitmaps): The same for `sizebitmaps'. + * src/psaux/t1decode.c (T1_Decode_Parse_Charstrings): The same for + `orig_y'. + (t1operator_seac): Comment out more dead code. + * src/pshinter/pshalgo2.c (ps2_hints_apply): Add `DEBUG_HINTER' + conditional. + * src/truetype/ttgload.c (TT_Process_Simple_Glyph, + load_truetype_glyph): Add `TT_CONFIG_OPTION_BYTECODE_INTERPRETER' + conditional. + +2002-02-18 Werner Lemberg + + * src/autohint/ahglyph.c (ah_outline_link_segments): Remove unused + variables. + * src/autohint/ahhint.c (ah_align_serif_edge): Use FT_UNUSED instead + of UNUSED. + * src/autohint/ahmodule.c (ft_autohinter_reset): Ditto. + * src/pshinter/pshrec.c (ps_mask_table_merge): Fix typo in variable + swapping code. + * src/pshinter/pshglob.h (PSH_Blue_Align): Add PSH_BLUE_ALIGN_NONE. + * src/pshinter/pshglob.c (psh_blues_snap_stem): Use it. + * src/pshinter/pshalgo1.c (psh1_hint_table_optimize): Ditto. + * src/pshinter/pshalgo2.c (psh2_hint_align): Ditto. + * include/freetype/internal/ftobjs.h (UNUSED): Removed. + +2002-02-10 Roberto Alameda + + Add support for ISOLatin1 PS encoding. + + * include/freetype/freetype.h (ft_encoding_latin_1): New tag + (`lat1'). + * include/freetype/internal/t1types.h (T1_Encoding_Type): Add + `t1_encoding_isolatin1'. + * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Handle + ft_encoding_latin_1. + * src/type1/t1load.c (parse_encoding): Handle `ISOLatin1Encoding'. + * src/type1/t1objs.c (T1_Face_Init): Handle `t1_encoding_isolatin1'. + +---------------------------------------------------------------------------- + +Copyright 2002, 2003, 2004, 2005, 2007, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/src/3rdparty/freetype/ChangeLog.22 b/src/3rdparty/freetype/ChangeLog.22 new file mode 100644 index 0000000000..4144288a5b --- /dev/null +++ b/src/3rdparty/freetype/ChangeLog.22 @@ -0,0 +1,2837 @@ +2006-05-12 Werner Lemberg + + + * Version 2.2.1 released. + ========================= + + + Tag sources with `VER-2-2-1'. + +2006-05-12 Werner Lemberg + + * src/tools/docmaker/sources.py (re_source_keywords): Add word + boundary markers. + * src/tools/docmaker/content.py (re_field): Allow `.' in field names + (but not at the beginning or end). + * src/tools/docmaker/tohtml.py (html_header_1): Use `utf-8' charset. + (block_footer): Split into... + (block_footer_start, block_footer_middle, block_footer_end): This to + add navigation buttons. + (HtmlFormatter::block_exit): Updated. + + * include/freetype/*: Many minor documentation improvements (adding + links, spelling errors, etc.). + +2006-05-11 Werner Lemberg + + * README: Minor updates. + + * include/freetype/*: s/scale/scaling value/ where appropriate. + Many other minor documentation improvements. + + * src/tools/docmaker/sources.py (re_italic, re_bold): Handle + trailing punctuation. + * src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_word): Add + warning message for undefined cross references. + Update handling of re_italic and re_bold. + +2006-05-11 Masatake YAMATO + + * builds/unix/ftsystem.c (FT_Stream_Open): Check errno only if + read system call returns -1. + Remove a redundant parenthesis. + +2006-05-10 Werner Lemberg + + * builds/unix/ftsystem.c (FT_Stream_Open): Avoid infinite loop if + given an empty, un-mmap()able file. Reported and suggested fix in + Savannah bug #16555. + + * builds/freetype.mk (refdoc): Write-protect the `docmaker' + directory to suppress generation of .pyc files. According to the + Python docs there isn't a more elegant solution (currently). + + * builds/toplevel.mk (dist): New target which builds .tar.gz, + .tar.bz2, and .zip files. Note that the version number is still + hard-coded. + (do-dist): Sub-target of `dist'. + (CONFIG_GUESS, CONFIG_SUB): New variables. + (.PHONY): Updated. + +2006-05-09 Rajeev Pahuja + + * builds/win32/visualc/freetype.sln, + builds/win32/visualc/freetype.vcproj: Upgraded to VS.NET 2005 from + VS.NET 2003 + Added files ftbbox.c, fttype1.c, ftwinfnt.c, ftsynth.c. + + * builds/win32/visualc/index.html: Updated. + +2006-05-07 Werner Lemberg + + Put version information into the configure script. Reported by Paul + Watson . + + * builds/unix/configure.ac: Renamed to... + * builds/unix/configure.raw: This which now serves (with appropriate + modifications) as a template for configure.ac. + + * version.sed: New script. + + * autogen.sh: Generate configure.ac from configure.raw, using + FREETYPE_MAJOR, FREETYPE_MINOR, and FREETYPE_PATCH from freetype.h. + +2006-05-06 Werner Lemberg + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. + + * builds/unix/configure.ac (version_info): Set to 9:10:3. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, builds/freetype.mk (refdoc), + Jamfile (RefDoc), README: s/220/221/, s/2.2.0/2.2.1/. + Minor updates. + + * docs/CHANGES, docs/VERSION.DLL, docs/PROBLEMS, README.CVS: + Updated. + + * builds/unix/install-sh: Updated from `texinfo' CVS module at + savannah.gnu.org. + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + +2006-05-04 Werner Lemberg + + * src/lzw/ftlzw2.c: Renamed to... + * src/lzw/ftlzw.c: This. + + * src/lzw/Jamfile, src/lzw/rules.mk: Updated. + + * builds/mac/FreeType.m68k_cfm.make.txt, + builds/mac/FreeType.m68k_far.make.txt, + builds/mac/FreeType.ppc_carbon.make.txt, + builds/mac/FreeType.ppc_classic.make.txt: Updated. + +2006-05-03 David Turner + + Allow compilation again with C++ compilers. + + * include/freetype/internal/ftmemory.h (FT_ASSIGNP, + FT_ASSIGNP_INNER): New macros which do the actual assignment, and + which exist in two variants (for C and C++). + Update callers accordingly. + +2006-05-03 Werner Lemberg + + * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): Removed. + +2006-05-02 Werner Lemberg + + * include/freetype/internal/ftmemory.h: s/new/newsz/ (for C++). + (FT_ALLOC): Remove redundant redefinition. + + * builds/compiler/gcc-dev.mk (CFLAGS) [g++]: Don't use + `-Wstrict-prototypes'. + + * src/base/ftstream.c (FT_Stream_EnterFrame): Add cast. + + * include/freetype/config/ftconfig.h (FT_BASE_DEF) [__cplusplus]: + Remove `extern'. + +2006-05-02 David Turner + + Update the memory management functions and macros to safely deal + with array size buffer overflows. This corresponds to attempts to + allocate arrays that are too large. For an example, consider the + following code: + + count = read_uint32_from_file(); array = malloc( sizeof ( Item ) * + count ); for ( nn = 0; nn < count; nn++ ) + array[nn] = read_item_from_file(); + + If `count' is larger than `FT_UINT_MAX/sizeof(Item)', the + multiplication overflows, and the array allocated os smaller than + the data read from the file. In this case, the heap will be + trashed, and this can be used as a denial-of-service attack, or make + the engine crash later. + + The FT_ARRAY_NEW and FT_ARRAY_RENEW macros now ensure that the new + count is no larger than `FT_INT_MAX/item_size', otherwise a new + error code `FT_Err_Array_Too_Large' will be returned. + + Note that the memory debugger now works again when FT_DEBUG_MEMORY + is defined. FT_STRICT_ALIASING has disappeared; the corresponding + code is now the default. + + + * include/freetype/config/ftconfig.h (FT_BASE_DEF) [!__cplusplus]: + Don't use `extern'. + + * include/freetype/fterrdef.h (FT_Err_Array_Too_Large): New error + code. + + * include/freetype/internal/ftmemory.h (FT_DEBUG_INNER) + [FT_DEBUG_MEMORY]: New macro. + (ft_mem_realloc, ft_mem_qrealloc): Pass new object size count also. + (ft_mem_alloc_debug, ft_mem_qalloc_debug, ft_mem_realloc_debug, + ft_mem_qrealloc_debug, ft_mem_free_debug): Removed. + (FT_MEM_ALLOC, FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, + FT_MEM_FREE): Redefine. + (FT_MEM_NEW_ARRAY, FT_MEM_RENEW_ARRAY, FT_MEM_QNEW_ARRAY, + FT_MEM_QRENEW_ARRAY): Redefine. + (FT_ALLOC_MULT, FT_REALLOC_MULT, FT_MEM_QALLOC_MULT, + FT_MEM_QREALLOC_MULT): New macros. Update callers where + appropriate. + (FT_MEM_SET_ERROR): Slightly redefine. + + + * src/base/ftdbgmem.c (_ft_debug_file, _ft_debug_lineno) + [FT_DEBUG_MEMORY]: New global variables, replacing... + (FT_MemTable_Rec) [FT_DEBUG_MEMORY]: Remove `filename' and + `line_no'. Update all callers. + (ft_mem_debug_alloc) [FT_DEBUG_MEMORY]: Avoid possible integer + overflow. + (ft_mem_alloc_debug, ft_mem_realloc_debug, ft_mem_qalloc_debug, + ft_mem_qrealloc_debug, ft_mem_free_debug): Removed. + + * src/base/ftmac.c (read_lwfn): Catch integer overflow. + * src/base/ftrfork.c (raccess_guess_darwin_hfsplus): Ditto. + * src/base/ftutil.c: Remove special code for FT_STRICT_ALIASING. + (ft_mem_alloc, ft_mem_realloc, ft_mem_qrealloc): Rewrite. + + + * include/freetype/ftstream.h (FT_FRAME_ENTER, FT_FRAME_EXIT, + FT_FRAME_EXTRACT, FT_FRAME_RELEASE): Use FT_DEBUG_INNER to report the + place where the frames were entered, extracted, exited or released + in the memory debugger. + + * src/base/ftstream.c (FT_Stream_ReleaseFrame) [FT_DEBUG_MEMORY]: + Call ft_mem_free. + (FT_Stream_EnterFrame) [FT_DEBUG_MEMORY]: Use ft_mem_qalloc. + (FT_Stream_ExitFrame) [FT_DEBUG_MEMORY]: Use ft_mem_free. + +2006-04-30 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_POST_Resource): Correct pfb_pos + initialization, remove extra cast to copy to pfb_lenpos. This fixes + parsing of PFB fonts with MacOS resource fork (bug introduced + 2003-09-11). Patch provided by Huib-Jan Imbens . + +2006-04-29 Werner Lemberg + + Further C library abstraction. Based on a patch from + msn2@bidyut.com. + + * include/freetype/config/ftstdlib.h (FT_CHAR_BIT, FT_FILE, + ft_fopen, ft_fclose, ft_fseek, ft_ftell, ft_fread, ft_smalloc, + ft_scalloc, ft_srealloc, ft_sfree, ft_labs): New wrapper macros for + C library functions. Update all users accordingly (and catch some + other places where the C library function was used instead of the + wrapper functions). + + * src/base/ftsystem.c: Don't include stdio.h and stdlib.h. + * src/gzip/zutil.h [MSDOS && !(__TURBOC__ || __BORLANDC__)]: Don't + include malloc.h. + + + * builds/unix/unix-def.in (datarootdir): Define, for autoconf 2.59c + and forthcoming versions. + +2006-04-28 Werner Lemberg + + * src/lzw/ftlzw.c, src/lzw/zopen.c, src/lzw/zopen.h: Removed, + obsolete. + +2006-04-27 yi luo + + * builds/win32/visualc/freetype.vcproj: Updated. + +2006-04-26 David Turner + + + * Version 2.2 released. + ======================= + + + Tag sources with `VER-2-2-0'. + +2006-04-26 Werner Lemberg + + * src/psaux/psobjs.c (shift_elements): Don't use FT_Long but + FT_PtrDiff for `delta'. Reported by Céline PILLET + . + +2006-04-21 David Turner + + * include/freetype/ftincrem.h: Documentation updates. + (FT_Incremental_Interface): New typedef. + + * include/freetype/ftmodapi.h, include/freetype/ftglyph.h: + Documentation updates. + + * include/freetype/freetype.h: Documentation update. + (FT_HAS_FAST_GLYPHS): Always set to 0. + + * include/freetype/ftstroke.h, src/base/ftstroke.c (FT_Stroker_New): + Take an FT_Library argument instead of FT_Memory. + + * src/sfnt/ttcmap.c: Remove compiler warnings (gcc-4.0.2). + +2006-04-13 David Turner + + * src/autofit/afloader.c (af_loader_init, af_loader_load_g): Remove + superfluous code in the auto-fitter's loader. + +2006-04-05 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile: Added FT2_BUILD_LIBRARY define. + +2006-04-03 luoyi + + * builds/compiler/intelc.mk (TE): New variable. + (ANSIFLAGS): Updated. + +2006-04-03 Werner Lemberg + + * builds/exports.mk (clean_symbols_list, clean_apinames): Removed. + (CLEAN): Add $(EXPORTS_LIST) and $(APINAMES_EXE). + (.PHONY): Updated. + + * configure.ac: Minor fixes to improve --help output. + + + * docs/PROBLEMS: New file. + +2006-04-01 David Turner + + * docs/CHANGES: Updated. + + * include/freetype/ftcache.h, include/freetype/config/ftheader.h: + Update documentation comments. + +2006-04-01 Werner Lemberg + + * builds/unix/install.mk (uninstall): Don't handle `cache' + directory which no longer exists. + +2006-03-29 Detlef Würkner + + * src/psaux/psconv.c: Changed some variables which are expected to + hold negative values from `char' to `FT_Char' to allow building with + a compiler where `char' is unsigned by default. + +2006-03-27 David Turner + + * src/sfnt/ttkern.c (tt_face_get_kerning): Fix a serious bug that + causes some programs to go into an infinite loop when dealing with + fonts that don't have a properly sorted kerning sub-table. + +2006-03-26 Werner Lemberg + + * src/bdf/bdflib.c (ERRMSG4): New macro. + (_bdf_parse_glyphs): Handle invalid BBX values. + + * include/freetype/fterrdef.h (FT_Err_Bbx_Too_Big): New error + macro. + +2006-03-23 Werner Lemberg + + * docs/CHANGES: Updated. + + + * src/tools/docmaker/tohtml.py (html_header_2): Add horizontal + padding between table elements. + (html_header_1): The `DOCTYPE' comment must be in uppercase. + (make_html_para): Convert `...' quotations into real left and + right single quotes. + Use `para_header' and `para_footer'. + + * src/tools/docmaker/sources.py (re_bold, re_italic): Accept "'" + also. + +2006-03-23 David Turner + + Add FT_Get_SubGlyph_Info API to retrieve subglyph data. Note that + we do not expose the FT_SubGlyphRec structure. + + * include/freetype/internal/ftgloadr.h (FT_SUBGLYPH_FLAGS_*): Moved + to... + * include/freetype/freetype.h (FT_SUBGLYPH_FLAGS_*): Here. + (FT_Get_SybGlyph_Info): New declaration. + + * src/base/ftobjs.c (FT_Get_SubGlyph_Info): New function. + + + * src/autofit/afloader.c (af_loader_load_g): Compute lsb_delta and + rsb_delta correctly in edge cases. + +2006-03-22 Werner Lemberg + + * src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup) + [!FTC_INLINE]: Compile conditionally. + * src/cache/ftccache.h: Updated. + + * src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily, + FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New): + s/FT_EXPORT/FT_LOCAL/. + (FTC_GCache_Init, FTC_GCache_Done): Commented out. + (FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally. + s/FT_EXPORT/FT_LOCAL/. + * src/cache/ftcglyph.h: Updated. + + * src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New): + s/FT_EXPORT/FT_LOCAL/. + (FTC_INode_Weight): Commented out. + * src/cache/ftcimage.h: Updated. + + * src/cache/ftmanag.c (FTC_Manager_Compress, + FTC_Manager_RegisterCache, FTC_Manager_FlushN): + s/FT_EXPORT/FT_LOCAL/. + * src/cache/ftmanag.h: Updated. + + * src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New, + FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/. + (FTC_SNode_Weight): Commented out. + * src/cache/ftcsbits.h: Updated. + +2006-03-22 Werner Lemberg + + * src/cache/ftccache.c, src/cache/ftccache.h (FTC_Node_Destroy): + Remove, unused. + + * src/cache/ftccmap.h: Remove, unused. + + * src/cache/rules.mk (CACHE_DRV_H): Remove ftccmap.h. + +2006-03-21 Zhe Su + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Improve + algorithm. + +2006-03-21 Werner Lemberg + + * src/cff/cfftypes.h (CFF_CharsetRec): Add `max_cid' member. + + * src/cff/cffload.c (cff_charset_load): Set `charset->max_cid'. + + * src/cff/cffgload.c (cff_slot_load): Change type of third parameter + to `FT_UInt'. + Check range of `glyph_index'. + * src/cff/cffgload.h: Updated. + + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Handle invalid offset + correctly. + + + * builds/freetype.mk (refdoc), docs/CHANGES, Jamfile (RefDoc), + README: s/2.1.10/2.2/. + +2006-03-21 David Turner + + * src/autofit/aflatin.c (af_latin_metrics_scale): Fix small bug + that crashes the auto-hinter (introduced by previous patch). + +2006-03-20 Werner Lemberg + + * builds/freetype.mk (CACHE_DIR, CACHE_H): Remove. + (FREETYPE_H): Updated. + + * src/cache/rules.mk (CACHE_H_DIR): Remove. + (CACHE_DRV_H): Updated. + +2006-03-20 David Turner + + * include/freetype/cache/ftccache.h, + include/freetype/cache/ftccmap.h, include/freetype/cache/ftcglyph.h + include/freetype/cache/ftcimage.h include/freetype/cache/ftcmanag.h + include/freetype/cache/ftcmru.h include/freetype/cache/ftcsbits.h: + Move to... + + * src/cache/ftccache.h, src/cache/ftcglyph.h, src/cache/ftcimage.h, + src/cache/ftcsbits.h, src/cache/ftcmanag.h, src/cache/ftccmap.h, + src/cache/ftcmru.h: This new location. + Update declarations according to the changes in the corresponding + source files. + + Note that these files are not used by FreeType clients; all public + APIs of the cache module have been already moved to + `include/freetype/ftcache.h', and all FT_CACHE_INTERNAL_XXXX_H + macros resolve to it. + + Reason for the move is to allow modifications of the internals + without interferences with rogue clients. Note that there are no + known clients that access the cache internals at the moment. + + * builds/unix/install.mk (install): Don't install headers from + $(CACHE_H). + Remove `freetype/cache' from the target directory. + + * include/freetype/config/ftheader.h (FT_CACHE_MANAGER_H, + FT_CACHE_INTERNAL_MRU_H, FT_CACHE_INTERNAL_MANAGER_H, + FT_CACHE_INTERNAL_CACHE_H, FT_CACHE_INTERNAL_GLYPH_H, + FT_CACHE_INTERNAL_IMAGE_H, FT_CACHE_INTERNAL_SBITS_H): Point to + FT_CACHE_H. + + * src/cache/ftcbasic.c, src/cache/ftccache.h, src/cache/ftccback.h, + src/cache/ftccmap.c, src/cache/ftcglyph.c, src/cache/ftcglyph.h, + src/cache/ftcimage.c, src/cache/ftcimage.h, src/cache/ftcmanag.c, + src/cache/ftcmanag.h, src/cache/ftcmru.h, src/cache/ftcsbits.c, + src/cache/ftcsbits.h: Don't use the FT_CACHE_INTERNAL_XXX_H macros + but include the headers directly (which are now in `src/cache'). + + * src/cache/ftccache.c: Don't use the FT_CACHE_INTERNAL_XXX_H + macros but include the headers directly. + (FTC_Cache_Init, FTC_Cache_Done, FTC_Cache_NewNode, + FTC_Cache_Lookup, FTC_Cache_RemoveFaceID): Declare as FT_LOCAL_DEF. + + * src/cache/ftccache.c: Don't use the FT_CACHE_INTERNAL_XXX_H + macros but include the headers directly. + (FTC_MruNode_Prepend, FTC_MruNode_Up, FTC_MruNode_Remove, + FTC_MruList_Init, FTC_MruList_Reset, FTC_MruList_Done, + FTC_MruList_New, FTC_MruList_Remove, FTC_MruList_RemoveSelection): + Declare as FT_LOCAL_DEF. + (FTC_MruListFind, FTC_MruList_Lookup) [!FTC_INLINE]: Compile + conditionally. + Declare as FT_LOCAL_DEF. + + + * builds/win32/visualc/freetype.dsp: Update project file, add + missing base source files (ftstroke.c, ftxf86.c, etc.). + + + * src/autofit/afcjk.c, src/autofit/aflatin.c, src/base/ftobjs.c, + src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrobjs.c, + src/sfnt/sfobjs.c, src/sfnt/ttmtx.c, src/type1/t1afm.c, + src/type1/t1objs.c: Remove compiler warnings when building with + Visual C++ 6 and /W4. + + * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal + hinting for italic/oblique fonts. + + + + * src/truetype/ttpload.c, src/truetype/ttpload.h + (tt_face_get_device_metrics): Change second argument to `FT_UInt'. + +2006-03-06 David Turner + + * src/cache/ftcmanag.c (FTC_Manager_Lookup_Size): Prevent crashes in + Mozilla/FireFox print preview in Ubuntu Hoary. + +2006-02-28 Chia-I Wu + + * src/base/ftutil.c (ft_mem_qalloc) [FT_STRICT_ALIASING]: Do not + return error when size == 0. + +2006-02-28 Chia-I Wu + + * src/base/ftobjs.c (FT_Done_Library): Remove modules in reverse + order so that type42 module is removed before truetype module. This + avoids double free in some occasions. + +2006-02-28 David Turner + + * Release candidate VER-2-2-0-RC4. + ---------------------------------- + + * docs/CHANGES: Documentation updates. + +2006-02-28 suzuki toshiya + + * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to + build ftvalid in ft2demos. It works as dummy ABI if gxvalid is not + built. + +2006-02-27 Werner Lemberg + + * include/freetype/cache/ftccache.h + [FT_CONFIG_OPTION_OLD_INTERNALS]: Remove declaration of + ftc_node_done. + + * src/cache/ftccache.c (ftc_node_destroy) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Mark as FT_LOCAL_DEF. This + should now fix all possible compilation options. + +2006-02-27 David Turner + + * src/base/ftutil.c (ft_mem_alloc, ft_mem_qalloc, ft_mem_realloc, + ft_mem_qrealloc): Return an error if a negative size is passed in + parameters. + + * src/cache/ftccache.c (ftc_node_destroy): Mark as FT_BASE_DEF since + it needs to be exported for rogue clients. + + * src/pshinter/pshglob.c (psh_blues_set_zones_0): Prevent problems + with malformed fonts which have an odd number of blue values (these + are broken according to the specs). + + * src/cff/cffload.c (cff_subfont_load), src/type1/t1load.c + (T1_Open_Face): Modify the loaders to force even-ness of + `num_blue_values'. + + (cff_index_access_element): Ignore invalid entries in index files. + +2006-02-27 Chia-I Wu + + * src/base/ftobjs.c (FT_Set_Char_Size): Check the case where width + or height is 0. + +2006-02-27 suzuki toshiya + + * builds/mac/FreeType.m68k_cfm.make.txt, + builds/mac/FreeType.m68k_far.make.txt, + builds/mac/FreeType.ppc_carbon.make.txt, + builds/mac/FreeType.ppc_classic.make.txt: Update to new header + inclusion introduced on 2006-02-16. + +2006-02-27 Chia-I Wu + + * src/base/ftobjs.c (GRID_FIT_METRICS): New macro. + (ft_glyphslot_grid_fit_metrics, FT_Load_Glyph) [GRID_FIT_METRICS]: + Re-enable glyph metrics grid-fitting. It is now done in the base + layer. + (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Make sure the width and + height are not too small or too large, just like we were doing in + 2.1.10. + + * src/autofit/afloader.c (af_loader_load_g): The vertical metrics + are not scaled. + +2006-02-26 Werner Lemberg + + * docs/release: Minor additions and clarifications. + + * docs/CHANGES: Updated to reflect many fixes for backwards + compatibility. Still incomplete. + +2006-02-26 David Turner + + * src/base/ftobjs.c (ft_recompute_scaled_metrics): Re-enable + conservative rounding of metrics to avoid breaking clients like + Pango (see http://bugzilla.gnome.org/show_bug.cgi?id=327852). + +2006-02-25 Werner Lemberg + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/cache/ftccache.c (ftc_node_destroy): Use FT_LOCAL_DEF (again). + +2006-02-25 David Turner + + Fix compiler warnings as well as C++ compilation problems. + Add missing prototypes. + + * src/autofit/afcjk.c, src/base/ftobjs.c, src/base/ftutil.c, + src/bdf/bdfdrivr.c, src/cff/cffcmap.c, src/cff/cffobjs.c, + src/psaux/afmparse.c,, src/psaux/t1cmap.c, src/smooth/ftgrays.c + src/tools/apinames.c, src/truetype/ttdriver.c: Add various casts, + initialize variables, and decorate functions with FT_CALLBACK_DEF, + etc., to fix compiler warnings (and C++ compiling errors). + + * src/cache/ftcbasic.c: Fix `-Wmissing-prototypes' warnings with + gcc. + + * builds/unix/ftsystem.c: Don't include FT_INTERNAL_OBJECTS_H but + FT_INTERNAL_STREAM_H. + + * src/base/ftsystem.c: Include FT_INTERNAL_STREAM_H. + + * include/freetype/config/ftheader.h (FT_PFR_H): New macro. + + * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): Don't + define for C++. + + * include/freetype/internal/services/svotval.h: Don't include + FT_OPENTYPE_VALIDATE_H but FT_INTERNAL_VALIDATE_H. + + * include/freetype/internal/services/svpfr.h: Include FT_PFR_H. + + * src/gzip/ftgzip.c: Include FT_GZIP_H. + + * src/lzw/ftlzw.c, src/lzw/ftlzw2.c: Include FT_LZW_H. + + * src/sfnt/ttbdf.c (tt_face_load_bdf_props): Rearrange code. + +2006-02-24 Chia-I Wu + + * src/base/ftoutln.c (FT_OUTLINE_GET_CONTOUR, ft_contour_has, + ft_contour_enclosed, ft_outline_get_orientation): Commented out. We + have to wait until `FT_GlyphSlot_Own_Bitmap' is stabilized. + (FT_Outline_Embolden): Use `FT_Outline_Get_Orientation'. + +2006-02-24 Chia-I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Update + documentation. + + * include/freetype/ftsynth.h (FT_GlyphSlot_Own_Bitmap), + src/base/ftsynth.c (FT_GlyphSlot_Own_Bitmap): New function to make + sure a glyph slot owns its bitmap. It is also marked experimental + and due to change. + (FT_GlyphSlot_Embolden): Undo the last change. It turns out that + rendering the outline confuses some applications. + +2006-02-24 David Turner + + * Release candidate VER-2-2-0-RC3. + ---------------------------------- + + * src/cache/ftcbasic.c: Correct compatibility hack bug. + +2006-02-24 Chia-I Wu + + * include/freetype/freetype.h (FT_Size_RequestRec): Change the type + of `width' and `height' to `FT_Long'. + (enum FT_Size_Request_Type), src/base/ftobjs.c (FT_Request_Metrics): + New request type `FT_SIZE_REQUEST_TYPE_SCALES' to specify the scales + directly. + +2006-02-23 David Turner + + Two BDF patches from Debian libfreetype6 for 2.1.10. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Fix a bug with zero-width + glyphs. + Fix a problem with large encodings. + + + Fix binary compatibility issues for gnustep-back (GNUstep backend + module) which still crashes under Sarge. + + * src/cache/ftccmap.c (FTC_OldCMapType, FTC_OldCMapIdRec, + FTC_OldCMapDesc) [FT_CONFIG_OPTION_OLD_INTERNALS]: New data + structures and enumerations. + (FTC_CMapCache_Lookup) [FT_CONFIG_OPTION_OLD_INTERNALS]: New + compatibility code. + + * src/cache/ftcbasic.c: Fix a silly bug that prevented our `hack' to + support rogue clients compiled against 2.1.7 to work correctly. + This probably explains the GNUstep crashes with the second release + candidate. + +2006-02-23 Chia-I Wu + + * include/freetype/ftoutln.h (enum FT_Orientation): New value + `FT_ORIENTATION_NONE'. + + * src/base/ftoutln.c (FT_OUTLINE_GET_CONTOUR, ft_contour_has, + ft_contour_enclosed, ft_outline_get_orientation): Another version of + `FT_Outline_Get_Orientation'. This version differs from the public + one in that each part (contour not enclosed in another contour) of the + outline is checked for orientation. + (FT_Outline_Embolden): Use `ft_outline_get_orientation'. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Render the outline and + use bitmap's embolden routine when the outline one failed. + +2006-02-22 Chia-I Wu + + * modules.cfg: Compile in ftotval.c and ftxf86.c by default for ABI + compatibility. + + * src/sfnt/sfobjs.c (sfnt_done_face): Fix a memory leak. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned, + tt_sbit_decoder_load_byte_aligned) [FT_OPTIMIZE_MEMORY]: Fix sbit + loading. (Only tested with bit aligned sbit with x_pos == 0.) + + * src/truetype/ttpload.c (tt_face_load_hdmx, + tt_face_get_device_metrics) [FT_OPTIMIZE_MEMORY]: `hdmx' is not + actually used. + +2006-02-21 David Turner + + Add a new API named FT_Get_TrueType_Engine_Type to determine whether + we have a patented, unpatented, or unimplemented TrueType bytecode + interpreter. + + The FT_Get_Module_Flags API was removed consequently. + + * include/freetype/ftmodapi.h (FT_Module_Get_Flags): Removed. + Replaced with... + (FT_Get_TrueType_Engine_Type): This. + (FT_TrueTypeEngineType): New enumeration. + + * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_ENGINE_H): + New macro. + + * src/base/ftobjs.c: Include FT_SERVICE_TRUETYPE_ENGINE_H. + (FT_Module_Get_Flags): Removed. Replaced with... + (FT_Get_TrueType_Engine_Type): This. + + * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_ENGINE_H. + (tt_service_truetype_engine): New service structure. + (tt_services): Register it. + + * include/freetype/internal/services/svtteng.h: New file. + + + * src/sfnt/sfobjs.c (sfnt_load_face): Fix silly bug that prevented + embedded bitmaps from being correctly listed and used. + + + * src/sfnt/ttmtx.c (tt_face_load_hmtx): Disable memory optimization + if FT_CONFIG_OPTION_OLD_INTERNALS is used. The is necessary because + libXfont is directly accessing the HMTX data, unfortunately. + Fix some compiler warnings. + (tt_face_get_metrics): Ditto. + + + * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Fix handling of + character advances. + +2006-02-20 David Turner + + Support binary compatibility with the X.Org server's Xfont library. + Note that this change unfortunately prevents memory optimizations + for the embedded bitmap loader. + + * include/freetype/internal/sfnt.h (SFNT_Interface): Move + `set_sbit_strike' and `load_sbit_metrics' fields to the location of + version 2.1.8. + + * src/sfnt/sfdriver.c (tt_face_set_sbit_strike_stub): Call + FT_Size_Request. + (sfnt_interface): Updated. + + * src/sfnt/ttsbit.c [FT_CONFIG_OPTION_OLD_INTERNALS]: Don't load + ttsbit0.c. + (tt_load_sbit_metrics): Make `sbit_small_metrics_fields' static. + + * src/sfnt/ttsbit.h: Updated. + +2006-02-17 David Turner + + * builds/unix/unix-cc.in (LINK_LIBRARY): Don't filter out exported + functions anymore. This ensures that all FT_BASE internal functions + are available for dynamic linking. + + * include/freetype/ftcache.h (FTC_IMAGE_TYPE_COMPARE, + FTC_IMAGE_TYPE_HASH), src/cache/ftcbasic.c (FTC_OldFontRec, + FTC_OldImageDescRec, FTC_ImageCache_Lookup, FTC_Image_Cache_New, + FTC_OldImage_Desc, FTC_OLD_IMAGE_FORMAT, ftc_old_image_xxx, + ftc_image_type_from_old_desc, FTC_Image_Cache_Lookup, + FTC_SBitCache_Lookup, FTC_SBit_Cache_New, FTC_SBit_Cache_Lookup) + [FT_CONFIG_OPTION_OLD_INTERNALS]: Try to revive old functions of the + cache sub-system. We try to recognize old legacy signatures with a + gross hack (hope it works). + +2006-02-17 Werner Lemberg + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + +2006-02-16 David Turner + + Massive changes to the internals to respect the internal object + layouts and exported functions of FreeType 2.1.7. Note that the + cache sub-system cannot be fully retrofitted, unfortunately. + + * include/freetype/config/ftoption.h + (FT_CONFIG_OPTION_OLD_INTERNALS): New macro. + + * include/freetype/ftcache.h, include/freetype/cache/ftccache.h, + include/freetype/cache/ftccmap.h, + include/freetype/internal/ftcalc.h, + include/freetype/internal/ftdriver.h, + include/freetype/internal/ftmemory.h, + include/freetype/internal/ftobjs.h, + include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h, + include/freetype/internal/t1types.h, + include/freetype/internal/tttypes.h, src/base/ftcalc.c, + src/base/ftdbgmem.c, src/base/ftobjs.c, src/base/ftutil.c, + src/bdf/bdfdrivr.c, src/cache/ftccache.c, src/cache/ftccback.h, + src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c, + src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c, + src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c, + src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c: + Use FT_CONFIG_OPTION_OLD_INTERNALS to revive old functions and data + structures. + + Move newly added structure elements to the end of the affected + structure and add stub fields (if FT_CONFIG_OPTION_OLD_INTERNALS is + defined) to assure binary compatibility with older FreeType + versions. + Use FT_CONFIG_OPTION_OLD_INTERNALS to add function stubs for old + functions: + + ft_stub_set_char_sizes + ft_stub_set_pixel_sizes + + Rename the following internal functions to provide the old function + names as stubs: + + FT_Alloc -> ft_mem_alloc + FT_QAlloc -> ft_mem_qalloc + FT_Realloc -> ft_mem_realloc + FT_QRealloc -> ft_mem_qrealloc + FT_Free -> ft_mem_free + FT_Alloc_Debug -> ft_mem_alloc_debug + FT_QAlloc_Debug -> ft_mem_qalloc_debug + FT_Realloc_Debug -> ft_mem_realloc_debug + FT_QRealloc_Debug -> ft_mem_qrealloc_debug + FT_Free_Debug -> ft_mem_free_debug + +2006-02-15 Chia-I Wu + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove + unused `max_points' and `max_contours'. + + * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c + (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused + `max_components'. + + * src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused + `loadSize' and `loadStack'. + + * src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context), + src/sfnt/ttload.c (tt_face_load_maxp): Update. + + * src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c + (sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix + compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not + defined. + + * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix + possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions. + (finally!) + + + For most OpenType tables, `tt_face_load_xxxx' simply loads the table + and `face->root' is set later in `sfnt_load_face'. Here, we try to + make this work for _all_ tables. Also improve tracing messages. + + * src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c, + src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and + then exit. Error handling or setting face->root is done later in + `sfnt_load_face'. + + * src/sfnt/sfobjs.c (sfnt_load_face): Work harder. + Mac bitmap-only fonts are not scalable. + Check that `face->header.Units_Per_EM' is not zero. + (LOAD_, LOADM_): Emit pretty trace messages. + + * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics + from `eblc'. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c + (load_format_20, load_format_25, tt_face_get_ps_name): Use + face->max_profile.numGlyphs, instead of face->root.num_glyphs. + +2006-02-14 Werner Lemberg + + * include/freetype/ftoutln.h (FT_Outline_Embolden): Mention in + documentation that negative strength values are possible. + Give an example call. + + * include/freetype/freetype.h (FT_GlyphSlotRec): Improve + documentation of `outline' field. + + * src/sfnt/sfobjc.s: Inckude FT_INTERNAL_DEBUG_H. + * src/sfnt/sfdriver.c: Include ttmtx.h. + + * src/autofit/afcjk.c: Include aftypes.h and aflatin.h. + +2006-02-14 Chia-I Wu + + * src/sfnt/ttmtx.c (tt_face_get_metrics): Typo. + +2006-02-14 Chia-I Wu + + * src/sfnt/ttmtx.c (tt_face_load_hhea, tt_face_load_hmtx): Simply + return error if table is missing. + Check table length in non-FT_OPTIMIZE_MEMORY'ed `tt_face_load_hmtx'. + + * src/sfnt/sfobjs.c (sfnt_load_face): Take care of missing metrics + tables. The last change makes Mac bitmap-only font not load and + this fixes it. + + * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation + error when FT_CONFIG_OPTION_INCREMENTAL is defined. + +2006-02-13 Chia-I Wu + + Clean up the SFNT_Interface. In this final pass, `load_hmtx' is + split from `load_hhea'. + + * include/freetype/internal/sfnt.h, src/sfnt/sfdriver.c, + src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: Split `hmtx' from `hhea'. + + * src/sfnt/sfobjs.c (sfnt_load_face): Update. + +2006-02-13 Chia-I Wu + + * src/sfnt/ttmtx.h, src/sfnt/ttmtx.c: Why are there two copies of + code... + +2006-02-13 Chia-I Wu + + Clean up the SFNT_Interface. In this pass, we want to treat the + font directory (offset table and table directory) as a normal table + like the others. This also means that TTCs are no longer recognized + there but in `init_face'. + + * include/freetype/internal/sfnt.h (SFNT_Interface), + src/sfnt/sfdriver.c: `load_sfnt_header' and `load_directory' are + combined and renamed to `load_font_dir'. + + * src/sfnt/ttload.h, src/sfnt/ttload.c: + s/sfnt_dir_check/check_table_dir/. + `sfnt_init' is moved to sfobjs.c and renamed to `sfnt_open_font'. + `tt_face_load_sfnt_header' and `tt_face_load_directory' are combined + and renamed to `tt_face_load_font_dir'. + + * src/sfnt/sfobjs.c (sfnt_init_face): Recognize TTC here. + +2006-02-13 Chia-I Wu + + Clean up the SFNT_Interface. Table loading functions are now named + after the tables' tags; `hdmx' is TrueType-specific and thus the + code is moved to the truetype module; `get_metrics' is moved here + from the truetype module so that the code can be shared with the cff + module. + + This pass involves no real changes. That is, the code is moved + verbatim mostly. The only exception is the return value of + `tt_face_get_metrics'. + + * include/freetype/internal/sfnt.h, src/sfnt/rules.mk, + src/sfnt/sfdriver.c, src/sfnt/sfnt.c, src/sfnt/sfobjs.c, + src/sfnt/ttload.c, src/sfnt/ttload.h, src/sfnt/ttsbit.c, + src/sfnt/ttsbit.h, src/sfnt/ttsbit0.c: Clean up the SFNT_Interface. + + * src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: New files. Metrics-related + tables' loading and parsing code is moved to here. + Move `tt_face_get_metrics' here from the truetype module. The + return value is changed from `void' to `FT_Error'. + + * include/freetype/internal/fttrace.h: New trace: ttmtx. + + * src/truetype/ttpload.c, src/truetype/ttpload.h: `hdmx' loading and + parsing code is moved here. + New function `tt_face_load_prep' split from `tt_face_load_fpgm'. + `tt_face_load_fpgm' returns `FT_Err_Ok' if `fpgm' doesn't exist. + + * src/cff/cffgload.c, src/cff/cffobjs.c: Update. + + * src/truetype/ttgload.c, src/truetype/ttobjs.c: Update. + +2006-02-11 Chia-I Wu + + * src/autofit/afcjk.c (af_cjk_metrics_init): Fix a stupid bug... + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Use + AF_LatinMetricsRec as the dummy metrics because we cast the metrics + to it later in `af_latin_hints_link_segments'. + +2006-02-11 Chia-I Wu + + * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_CJK): #define + to enable autofit CJK script support. (#define'd by default.) + + * src/autofit/aflatin.h (AF_LATIN_CONSTANT): New macro. + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Make sure + that `edge_distance_threshold' is always set. + (af_latin_hints_link_segments): Potential divide-by-zero bug. + Use latin constant in the scoring formula. + + * src/autofit/afcjk.c: Minor updates due to the above three changes. + + * docs/TODO, docs/CHANGES: Updated. + +2006-02-09 Chia-I Wu + + Introduce experimental autofit CJK module based on akito's autohint + patch. You need to #define AF_MOD_CJK in afcjk.c to enable it. + + * src/autofit/afglobal.c, src/autofit/afcjk.h, src/autofit/afcjk.c, + src/autofit/rules.mk, src/autofit/autofit.c, src/autofit/aftypes.h: + Add CJK module based on akito's autohint patch. + + * src/autofit/afhints.h (AF_SegmentRec): New field `len' for the + overlap length of the segments. + (AF_SEGMENT_LEN, AF_SEGMENT_DIST): New macros. + + * src/autofit/aflatin.h (af_latin_metrics_init_widths), + src/autofit/aflatin.c (af_latin_metrics_init_widths): Made + `FT_LOCAL'. + Use the character given by the caller. + (af_latin_metrics_init_widths, af_latin_hints_link_segments): Scale + the thresholds. + + * src/autofit/afloader.c (af_loader_load_g): Respect + AF_SCALER_FLAG_NO_ADVANCE. + +2006-02-09 Werner Lemberg + + * src/cid/cidparse.c (cid_parse_new): Remove shadowing variable. + +2006-02-09 suzuki toshiya + + * src/cid/cidparse.c (cid_parse_new): Fix for abnormally short or + broken CIDFont. Reported by Taek Kwan(TK) Lee (see ft-devel + 2005-11-02). + +2006-02-08 suzuki toshiya + + * builds/unix/configure.ac: Fix bug for `--with-old-mac-fonts' + option on UNIX platform. It has been broken since 2006-01-11. + +2006-02-01 Werner Lemberg + + * src/otvalid/module.mk: s/otvalid_module_class/otv_module_class/. + * src/gxvalid/module.mk: s/gxvalid_module_class/gxv_module_class/. + + * builds/unix/unixddef.mk: Actually do define PLATFORM (fixing + change from 2006-01-31). + (TOP_DIR, OBJ_DIR): Update. + + * builds/unix/install.mk (install): Fix path for ftmodule.h. + + * Makefile, *.mk, builds/unix/unix-cc.in, builds/unix-def.in: Use + `?=' where appropriate. + + * builds/detect.mk (TOP_DIR), builds/os2/os2-dev.mk (TOP_DIR), + builds/win32/w32-dev.mk (TOP_DIR): Removed. Defined elsewhere. + +2006-01-31 Werner Lemberg + + Implement new, simplified module selection. With GNU make it is now + sufficient to modify a single file, `modules.cfg', to control the + inclusion of modules and base extension files. + + This change also fixes the creation of ftmodule.h; it now depends on + `modules.cfg' and thus is rebuilt only if necessary. + + Finally, a version of `ftoption.h' in OBJ_DIR is preferred over the + default location. + + * modules.cfg: New file. + + * builds/freetype.mk: Don't include `modules.mk'. + Include all `rules.mk' files as specified in `modules.cfg'. + (FTOPTION_FLAG, FTOPTION_H): New variables. + (FT_CFLAGS): Add macro definition for FT_CONFIG_MODULES_H. + Add FTOPTION_FLAG. + ($(FT_INIT_OBJ)): Don't use FT_MODULE_LIST. + (CONFIG_H): Add FTMODULE_H and FTOPTION_H. + (INCLUDES): Add DEVEL_DIR. + (INCLUDE_FLAGS, FTSYS_SRC, FTSYS_OBJ, FTDEBUG_SRC, FTDEBUG_OBJ, + OBJ_M, OBJ_S): Use `:=', not `='. + (remove_ftmodule_h): New phony target to delete `ftmodule.h'. + (distclean): Add remove_ftmodule_h. + + * builds/modules.mk: (MODULE_LIST): Removed. + (make_module_list, clean_module_list): Replace targets + with... + (FTMODULE_H_INIT, FTMODULE_H_CREATE, FTMODULE_H_DONE): New + variables. Reason for the change is that it is not possible to have + a phony prerequisite which is run only if the target file must be + rebuilt (phony prerequisites act like subroutines and are *always* + executed). We only want to rebuild `ftmodule.h' if `module.cfg' is + changed. + Update all callers. + ($FTMODULE_H)): Rule to create `ftmodule.h', depending on + `modules.cfg'. + + * builds/toplevel.mk: Rewrite and simplify module handling. + (MODULES_CFG, FTMODULE_H): New variables. + Include MODULES_CFG. + (MODULES): New variable to include all `module.mk' and `rules.mk' + files. We no longer use make's `wildcard' function for this. + + * Makefile (USE_MODULES): Remove. Update all users. + (OBJ_DIR): Define it here. + + * src/*/module.mk: Change + + make_module_list: foo + foo: ... + + to + + FTMODULE_H_COMMANDS += FOO + define FOO + ... + endef + + in all files. `FTMODULE_H_COMMANDS' is used in `FTMODULE_H_CREATE'. + + * src/base/rules.mk (BASE_EXT_SRC): Use BASE_EXTENSIONS. + + * builds/unix/detect.mk (setup): Always execute `configure' script. + (have_mk): Rename to... + (have_Makefile): This. + Don't use `strip' function. + + * builds/unix/unix.mk: Include `install.mk' only if BUILD_PROJECT is + defined. + (have_mk): Don't use `strip' function. + Test for unix-def.mk in OBJ_DIR, not BUILD_DIR (and invert the test + accordingly). + + * builds/unix/install.mk (install, uninstall): Handle `ftmodule.h'. + + * builds/os2/os2-dev.mk, builds/unix/unix-dev.mk, + builds/win32/w32-bccd.mk, builds/win32/w32-dev.mk: Don't define + BUILD_DIR but DEVEL_DIR for development header files. + + * builds/ansi/ansi-def.mk (TOP_DIR, OBJ_DIR), + builds/beos/beos-def.mk (TOP_DIR, OBJ_DIR), builds/unix/unix-def.in + (TOP_DIR, OBJ_DIR): Removed. Defined elsewhere. + + * builds/dos/dos-def.mk (OBJ_DIR), builds/os2/os2-def.mk (OBJ_DIR), + builds/win32/win32-def.mk (OBJ_DIR): Removed. Defined elsewhere. + + * builds/unix/unixddef.mk: Don't define BUILD_DIR but DEVEL_DIR for + development header files. + Don't define PLATFORM. + + * configure: Copy `modules.cfg' to builddir if builddir != srcdir. + Update snippet taken from autoconf's m4sh.m4 to current CVS version. + Be more verbose. + + * include/freetype/config/ftmodule.h: Add comments -- this file is + no longer used if FreeType is built with GNU make. + + * docs/CHANGES, docs/CUSTOMIZE, docs/INSTALL, docs/INSTALL.ANY, + docs/INSTALL.GNU, docs/INSTALL.UNX: Document new build mechanism. + Other minor updates. + + * modules.txt: Removed. Contents included in `modules.cfg'. + + + * include/freetype/internal/ftmemory.h (FT_QAlloc_Debug, + FT_Free_Debug) [FT_STRICT_ALIASING]: Fix typos. + + * src/base/ftdbgmem.c (FT_Alloc_Debug, FT_Realloc_Debug, + FT_QAlloc_Debug, FT_QRealloc_Debug, FT_Free_Debug) + [FT_STRICT_ALIASING]: Implement. + +2006-01-31 Chia-I Wu + + * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c + (cid_face_init), src/pfr/pfrobjs.c (pfr_face_init), + src/type1/t1objs.c (T1_Face_Init): Set face->height to MAX(1.2 * + units_per_EM, ascender - descender). + +2006-01-31 Chia-I Wu + + * include/freetype/internal/t1types.h (AFM_FontInfo), + src/psaux/afmparse.c, src/tools/test_afm.c: Read `FontBBox', + `Ascender', and `Descender' from an AFM. + + * src/type1/t1afm.c (T1_Read_Metrics): Use the metrics from the AFM. + + * include/freetype/freetype.h (FT_FaceRec): Mention that fields may + be changed after file attachment. + +2006-01-28 Werner Lemberg + + * src/*/module.mk (.PHONY): Add. + +2006-01-27 Werner Lemberg + + * README, docs/FTL.TXT: Fix email address for bug reports. + Other minor formatting. + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/autofit/module.mk (add_autofit_module), src/bdf/module.mk + (add_bdf_module), src/type42/module.mk (add_type42_driver): Fix + whitespace. + + * src/smooth/module.mk (add_smooth_renderer): Add lcd and lcdv + renderer classes. + +2006-01-27 David Turner + + * builds/unix/configure.ac: Fix build problem on Cygwin. + + * builds/unix/install.mk (install): Don't install the internal + headers, and remove existing ones if found in the target install + directory. + + * src/autofit/afwarp.c: Add simple #ifdef to prevent compilation + if the warp hinter isn't active (it shouldn't, still experimental). + + * Jamfile, include/freetype/config/ftmodule.h: Remove `gxvalid' + and `otvalid' from the list of modules that are linked statically + to a given FreeType library. Functionality has been moved to the + `ftvalid' CVS module. + + Note also that current Make-based build system still compiles the + modules though. + + * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): New macro + which controls the definitions of the memory management functions to + avoid warnings with recent versions of GCC. This macro is only here + to be disabled, in case we detect problems with the new scheme. + + NOTE: Disable macro to use the memory debugger -- this will be fixed + later! + + * include/freetype/internal/ftmemory.h, src/base/ftutil.c (FT_Alloc, + FT_QAlloc, FT_Realloc, FT_QRealloc, FT_Free) [FT_STRICT_ALIASING]: + New versions. + + + * builds/win32/visualc/freetype.dsp: Updating project file to + define FT2_BUILD_LIBRARY, and remove gxvalid + otvalid modules from + compilation. + + + * builds/freetype.mk (FT_CFLAGS), Jamfile (DEFINES): Define the + macro FT2_BUILD_LIBRARY when compiling the library. + + * include/freetype/config/ftheader.h: Remove inclusions of internal + headers except if the macro FT2_BUILD_LIBRARY is defined. + + + * include/freetype/internal/psaux.h (AFM_KernPair, AFM_TrackKern, + AFM_FontInfo): Move structure declarations to... + * include/freetype/internal/t1types.h: This file. + + + * (many files): Fix compiler warnings. + Various minor reorganizations. + + + * src/cff/cffload.c (cff_font_done): Don't free static array + `subfonts'. + + * src/otvalid/otvcommn.c (otv_ClassDef_validate), + src/otvalid/otvgpos.c (otv_x_sxy): Fix debugging information. + + + Get rid of writable static variables (i.e., the string table) in + afmparse, and fix compilation in FT2_MULTI mode. + + * src/psaux/afmparse.c: Include ft2build.h and FT_FREETYPE_H. + (AFM_MAX_ARGUMENTS): Define... + * src/psaux/afmparse.h: Here. + * src/psaux/Jamfile (_sources): Add afmparse. + + * src/psaux/psconv.c: Include psconv.h. + + * src/type1/t1afm.c: Don't include FT_INTERNAL_TYPE1_TYPES_H but + FT_INTERNAL_POSTSCRIPT_AUX_H. + * src/type1/t1afm.h: Include FT_INTERNAL_TYPE1_TYPES_H. + +2006-01-23 Chia-I Wu + + * include/freetype/freetype.h (FT_Select_Size): Rename the second + argument from `idx' to `strike_index'. + (FT_Size_Request_Type): Add FT_SIZE_REQUEST_TYPE_MAX to the end of + this enum. + + * include/freetype/internal/ftobjs.h (FT_REQUEST_WIDTH, + FT_REQUEST_HEIGHT): New macros to get the width and height of a + request, in fractional pixels. + + * include/freetype/internal/ftobjs.h (FT_Select_Metrics, + FT_Request_Metrics), src/base/ftobjs.c (FT_Select_Metrics, + FT_Request_Metrics): New base functions to set the font metrics. They + were part of FT_Select_Size/FT_Request_Size and are made independent + functions so that metrics are not set again and again. + + * src/base/ftobjs.c (FT_Select_Size, FT_Request_Size): Metrics are set + only when driver's size_select/size_request is NULL. That is, drivers + should set the metrics themselves. + (FT_Match_Size): Round before matching. This was what we did and it + does cause some problems without rounding. + + * src/cff/cffobjs.c (cff_size_select), src/truetype/ttdriver.c + (tt_size_select): Set the font metrics. + s/index/strike_index/. + The scaled metrics are always preferred over strikes' metrics, even + when some strike is selected. This is done because the strikes' + metrics are not reliable, e.g., the sign of the descender is wrong for + some fonts. + + * src/cff/cffobjs.c (cff_size_request), src/truetype/ttdriver.c + (tt_size_request): Set the font metrics. + Call cff_size_select/tt_size_select when some strike is matched. + + * src/bdf/bdfdrivr.c, src/cff/cffobjs.c, src/cid/cidobjs.c, + src/pcf/pcfdrivr.c, src/truetype/ttdriver.c, src/type1/t1objs.c, + src/type1/t1objs.h, src/type42/t42objs.c, src/winfonts/winfnt.c: + Set the font metrics. + s/index/strike_index/. + + * src/tools/test_afm.c, src/psaux/psconv.c: Older versions of these + files were committed. Just a catch-up. + (PS_Conv_ToFixed): Remove the `goto'. + (PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Speed up a little. + + * src/sfnt/ttsbit.c (tt_face_load_sbit_strikes, + tt_face_load_strike_metrics), src/sfnt/ttsbit0.c + (tt_face_load_sbit_strikes, tt_face_load_strike_metrics): The + advertised metrics in `available_sizes' are different from those + actually used. + +2006-01-23 Chia-I Wu + + * src/psaux/psaux.c src/psaux/psauxmod.c src/type1/t1driver.c: Make + AFM parser optional, controlled by `T1_CONFIG_OPTION_NO_AFM'. + +2006-01-22 Werner Lemberg + + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at savannah.gnu.org. + +2006-01-21 Werner Lemberg + + * src/autofit/rules.mk (AUTOF_DRV_SRC): Add afwarp.c. + + * src/autofit/afloader.c (af_loader_load_g): Move AF_USE_WARPER up + to avoid compiler warnings. + + * src/autofit/afwarp.c (af_warper_compute_line_best): Remove + shadowing variable declarations. + Fix warning parameters and replace printf with AF_LOG. + (af_warper_compute): Remove unused variable. + +2006-01-20 David Turner + + Adding experimental implementation of `warp hinting' (new hinting + algorithm for gray-level and LCD rendering). It is disabled by + default, you need to #define AF_USE_WARPER in aftypes.h. + + * src/autofit/afhints.c (af_glyph_hints_scale_dim) [AF_USE_WARPER]: + New function. + * src/autofit/afhints.h: Updated. + + * src/autofit/aflatin.c [AF_USE_WARPER]: Include afwarp.h. + (af_latin_hints_init) [AF_USE_WARPER]: Reset mode to + FT_RENDER_MODE_NORMAL if an LCD mode is selected. + (af_latin_hints_apply) [AF_USE_WARPER]: Call af_warper_compute + appropriately. + + * src/autofit/afloader.c (af_loader_load_g) [!AF_USER_WARPER]: + Isolate code for adjusting metrics. + + * src/autofit/aftypes.h (AF_USE_WARPER): New macro (commented out by + default). + + * src/autofit/afwarp.c, src/autofit/afwarp.h: New files. + + * src/autofit/autofit.c [AF_USE_WARPER]: Include afwarp.c. + + * src/autofit/Jamfile (_sources): Add afwarp. + +2006-01-19 David Turner + + * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Fix small bug + that prevented compilation when FT_OPTIMIZE_MEMORY is defined. + +2006-01-19 Brian Weed + + * builds/win32/visualc/freetype.dsp: Updated. + +2006-01-17 Werner Lemberg + + Use pscmap service in CFF module. + + * src/cff/cffcmap.c (cff_cmap_uni_pair_compare): Removed. + (cff_sid_to_glyph_name): New function. + (cff_cmap_unicode_init, cff_cmap_unicode_done, + cff_cmap_unicode_char_index, cff_cmap_unicode_char next): Use pscmap + service. + (cff_cmap_unicode_class_rec): Updated. + * src/cff/cffcmap.h (CFF_CMapUnicode, CFF_CMap_UniPair): Removed. + + + * src/psnames/psmodule.c (ps_unicodes_char_next): Fix `unicode' + return value. + + + * src/psaux/afmparse.c (afm_parser_read_vals): Use double casting + to avoid compiler warnings regarding type-punning. + +2006-01-16 Chia-I Wu + + * src/psaux/afmparse.c, src/psaux/afmparse.h: New files which + implement an AFM parser. + + * src/psaux/psconv.c, src/psaux/psconv.h: New files to provide + conversion functions (e.g., PS real number => FT_Fixed) for the + PS_Parser and AFM_Parser. Some of the functions are taken, with + some modifications, from the file psobjs.c. + + * src/psaux/psobjs.c: Use functions from psconv.c. + + * include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Add + `AFM_Parser' to the `psaux' service. + + * src/psaux/psaux.c, src/psaux/rules.mk (PSAUX_DRV_SRC): Include + those new files. + + * src/tools/test_afm.c: A test program for AFM parser. + + * include/freetype/internal/services/svkern.h: New file providing a + `Kerning' service. It is currently only used to get the track + kerning information. + + * include/freetype/internal/ftserv.h (FT_SERVICE_KERNING_H): New + macro. + + * src/type1/t1driver.c, src/type1/t1objs.c, src/type1/t1afm.c, + src/type1/t1afm.h: Update to use the AFM parser. + Provide the `Kerning' service. + + * include/freetype/freetype.h, src/base/ftobjs.c: New API + `FT_Get_Track_Kerning'. + +2006-01-15 Chia-I Wu + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c, + src/bdf/bdfdrivr.c, src/cff/cffgload.c, src/cid/cidgload.c, + src/pcf/pcfdrivr.c, src/type1/t1gload.c, src/winfonts/winfnt.c: + s/ft_fake_vertical_metrics/ft_synthesize_vertical_metrics/. + + * docs/CHANGES: Mention that vertical metrics are synthesized for + fonts not having this info. + +2006-01-15 Chia-I Wu + + * include/freetype/internal/ftobjs.h (ft_fake_vertical_metrics), + src/base/ftobjs.c (ft_fake_vertical_metrics): New function to fake + vertical metrics. + + * src/cff/cffgload.c, src/cid/cidgload.c, src/pcf/pcfdrivr.c, + src/type1/t1gload.c, src/winfonts/winfnt.c: Fake vertical metrics, + which are monotone. + + * src/truetype/ttgload.c (compute_glyph_metrics): Some fixes and + formattings in vertical metrics faking. There is still room for + improvements (and so does the CFF module). + +2006-01-15 Chia-I Wu + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/pcf/pcfdrivr.c + (PCF_Glyph_Load), src/winfonts/winfnt.c (FNT_Load_Glyph): Don't set + the linear advance fields as they are only used by the outline + glyphs. + + * include/freetype/freetype.h: Documentation updates and + clarifications. + The meaning of FT_LOAD_FORCE_AUTOHINT is changed so that no real + change need be made to the code. + + * src/base/ftobjs.c (FT_Load_Glyph): Resolve flag dependencies and + decide whether to use the auto-hinter according to documentation. + There should to be no real difference. + Some checks (e.g., is text height positive?) after the glyph is + loaded. + (FT_Select_Size, FT_Request_Size): Scales are set to wrong values. + Be careful that scales won't be negative. + +2006-01-14 Chia-I Wu + + * docs/CHANGES: Mention the size selection change. + + * src/bdf/bdfdrivr.c (BDF_Size_Request, BDF_Size_Select), + src/pcf/pcfdrivr.c (PCF_Size_Request, PCF_Size_Select), + src/winfonts/winfnt.c (FNT_Size_Request, FNT_Size_Select): Do size + matching for requests of type NOMINAL and REAL_DIM. + + * src/winfonts/winfnt.c (FNT_Face_Init): Print trace message when + `pixel_height' is used for nominal height. + + * src/base/ftobjs.c (FT_Request_Size): Call `FT_Match_Size' if the + face is bitmap only and driver doesn't provide `request_size'. This + is added merely for completion as no driver satisfies the conditions. + +2006-01-13 Chia-I Wu + + Introduce new size selection interface. + + * include/freetype/internal/ftdriver.h (struct FT_Driver_ClassRec): + Replace `set_char_sizes' and `set_pixel_sizes' by `request_size' and + `select_size'. + + * include/freetype/freetype.h (FT_Select_Size, FT_Size_Request_Type, + FT_Size_Request, FT_Request_Size, FT_Select_Size), src/base/ftobjs.c + (FT_Select_Size, FT_Request_Size): API additions to export the new + size selection interface. + + * src/base/ftobjs.c (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Use + `FT_Request_Size'. + + * include/freetype/internal/ftobjs.h (FT_Match_Size), + src/base/ftobjs.c (FT_Match_Size): New function to match a size + request against `available_sizes'. Drivers supporting bitmap strikes + can use this function to implement `request_size'. + + * src/bdf/bdfdrivr.c, src/cid/cidobjs.c, src/cid/cidobjs.h, + src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/type1/t1driver.c, + src/type1/t1objs.c, src/type1/t1objs.h, src/type42/t42drivr.c, + src/type42/t42objs.c, src/type42/t42objs.h, src/winfonts/winfnt.c: + Update to new size selection interface. + + * src/cff/cffdrivr.c, src/cff/cffgload.c, src/cff/cffobjs.c, + src/cff/cffobjs.h, src/truetype/ttdriver.c, src/truetype/ttgload.c, + src/truetype/ttobjs.c, src/truetype/ttobjs.h: Update to new size + selection interface. + Make `strike_index' FT_ULong and always defined. + Use `load_strike_metrics' provided by SFNT interface. + +2006-01-13 Chia-I Wu + + * include/freetype/internal/sfnt.h (SFNT_Interface): New method + `load_strike_metrics' used to load the strike's metrics. + + * src/sfnt/sfdriver.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, + src/sfnt/ttsbit0.c: New function `tt_face_load_strike_metrics'. + + * src/pfr/pfrobjs.c (pfr_face_init): Set FT_Bitmap_Size correctly. + + * src/winfonts/winfnt.c (FNT_Face_Init): Use `nominal_point_size' for + nominal size unless it is obviously incorrect. + + * include/freetype/freetype.h (FT_Bitmap_Size): Update the comments on + FNT driver. + +2006-01-12 Werner Lemberg + + Prepare use of pscmap service within CFF module. + + * include/freetype/internal/services/svpscmap.h: Include + FT_INTERNAL_OBJECTS_H. + (PS_Unicode_Index_Func): Removed. Unused. + (PS_Macintosh_Name_Func): Renamed to... + (PS_Macintosh_NameFunc): This. + Update all callers. + (PS_Adobe_Std_Strings_Func): Renamed to... + (PS_Adobe_Std_StringsFunc): This. + Update all callers. + (PS_UnicodesRec): This is the former `PS_Unicodes' structure. + Add `cmap' member. + Update all callers. + (PS_Unicodes): This is now a typedef'd pointer to PS_UnicodesRec. + Update all callers. + (PS_Glyph_NameFunc): New typedef. + (PS_Unicodes_InitFunc): Change arguments to expect a function + and generic data pointer which returns a glyph name from a given + index. + + * src/psnames/psmodule.c (ps_unicodes_init, ps_unicodes_char_index, + ps_unicodes_char_next, pscmaps_interface): Updated. + + * include/freetype/internal/t1types.h (T1_FaceRec): Updated. + + * src/psaux/t1cmap.h (T1_CmapStdRec): Updated. + (T1_CmapUnicode, T1_CmapUnicodeRec): Removed. + + * src/psaux/t1cmap.c (t1_get_glyph_name): New callback function. + (t1_cmap_unicode_init, t1_cmap_unicode_done, + t1_cmap_unicode_char_index, t1_cmap_unicode_char_next, + t1_cmap_unicode_class_rec): Updated. + + * src/type42/t42types.h (T42_FaceRec): Updated. + +2006-01-11 suzuki toshiya + + * include/freetype/ftmac.h: Add declaration of new functions + FT_New_Face_From_FSRef and FT_GetFile_From_Mac_ATS_Name that + were introduced by the jumbo patch on 2006-01-11. + +2006-01-11 Werner Lemberg + + Fix Savannah bug #15056 and use pscmap service in psaux module. + + * include/freetype/internal/services/svpscmap.h (PS_UniMap): Use + FT_UInt32 for `glyph_index'. + (PS_Unicodes_InitFunc): Use FT_String for `glyph_names'. + (PS_Unicodes_CharIndexFunc): Use FT_UInt32 for `unicode'. + (PS_Unicodes_CharNextFunc): Make second argument a pointer to + FT_UInt32. + + * src/psnames/psmodule.c (VARIANT_BIT, BASE_GLYPH): New macros. + (ps_unicode_value): Set VARIANT_BIT in return value if glyph is a + variant glyph (this is, it has non-leading `.' in its name). + (compare_uni_maps): Sort base glyphs before variant glyphs. + (ps_unicodes_init): Use FT_String for `glyph_names' argument. + Reallocate only if number of used entries is much smaller. + Updated to handle variant glyphs. + (ps_unicodes_char_index, ps_unicodes_char_next): Prefer base glyphs + over variant glyphs. + Simplify code. + + * src/psaux/t1cmap.c (t1_cmap_uni_pair_compare): Removed. + (t1_cmap_unicode_init, t1_cmap_unicode_char_index, + t1_cmap_unicode_char_next): Use pscmap service. + (t1_cmap_unicode_done): Updated. + + * src/psaux/t1cmap.h (T1_CMapUniPair): Removed. + (T1_CMapUnicode): Use PS_Unicodes structure. + +2006-01-11 suzuki toshiya + + Jumbo patch to fix `deprecated' warning of cross-build for Tiger on + Intel, as reported by Sean McBride on + 2005-08-24. + + * src/base/ftmac.c: Heavy change to build without deprecated Carbon + functions on Tiger. + + * builds/unix/configure.ac: Add options and autochecks for Carbon + functions availabilities, for MacOS X. + + * builds/mac/ascii2mpw.py: Add converter for character `\305'. + * builds/mac/FreeType.m68k_{far|cfm}.make.txt: Add conditional + macros to avoid unavailable functions. + ftmac.c must be compiled without `-strict ansi', because it disables + cpp macro to use ToolBox system call. + + * builds/mac/FreeType.ppc_{classic|carbon}.make.txt: Add conditional + macros to avoid unavailable functions. + + * builds/mac/README: Detailed notes on function availabilities. + + * docs/CHANGES: Notes about (possible) incompatibilities. + +2006-01-08 Werner Lemberg + + * docs/CHANGES: Updated. + +2006-01-08 Huw D M Davies + + * include/freetype/ftmodapi.h (FT_Module_Get_Flags): New + declaration. + + * src/base/ftobjs.c (FT_Module_Get_Flags): New function. + +2006-01-07 Werner Lemberg + + * src/pcf/pcfread.c (pcf_get_bitmaps): Remove unused variable + `bitmaps'. Reported by Yu Lei . + + * src/base/ftutil.c (ft_highpow2): s/FT_BASE/FT_BASE_DEF/. + Reported by Niels Boldt . + +2005-12-28 suzuki toshiya + + * src/sfnt/sfnt/ttbdf.c: Add newline '\n' to the end of file, for + MPW compiler. + +2005-12-23 David Turner + + * Jamfile (RefDoc), docs/reference/README: Fix it so that `jam + refdoc' works correctly to generate the API reference in + `docs/reference'. + + * src/tools/docmaker/tohtml.py (print_html_field, + print_html_field_list): Update to output nicer fields lists in the + API reference. + + * src/base/ftobjs.c (FT_Load_Glyph): FT_LOAD_TARGET_LIGHT now + forces auto-hinting. + + * freetype/freetype.h: Updating the documentation for + FT_LOAD_TARGET_XXX and FT_Render_Mode values. + +2005-12-23 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_Suitcase): Count scalable faces + in supported formats (sfnt, LWFN) only, and ignore bitmap faces in + unsupported formats (fbit, NFNT). The number of available faces are + passed via face->num_faces. If bitmap faces are embedded in sfnt + resource, face->num_fixed_size is correctly set. In public API, + FT_New_Face() and FT_New_Face_From_FSSpec() count the faces as + FT_GetFile_From_Mac_Name(), which ignores NFNT resources. + + * doc/CHANGES: Mention the changes. + +2005-12-17 Chia-I Wu + + * src/truetype/ttinterp.c (Update_Max): Set current size of buffer + correctly (so that memory debug system won't panic). + +2005-12-16 Chia-I Wu + + * include/freetype/internal/ftobjs.h (ft_glyphslot_grid_fit_metrics), + src/base/ftobjs.c (ft_glyphslot_grid_fit_metrics): Removed. + + * src/base/ftobjs.c (ft_recompute_scaled_metrics): Do not round. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/truetype/ttgload.c (compute_glyph_metrics), + src/type1/t1gload.c (T1_Load_Glyph): Do not round glyph metrics. + + * doc/CHANGES: Mention the changes. + +2005-12-13 David Turner + + Change the implementation of the LIGHT hinting mode to completely + disable horizontal hinting. This is an experimental effort to + integrate David Chester's latest patch without affecting the other + hinting modes as well. + + Note that this doesn't force auto-hinting for all fonts, however. + + * src/autofit/afhints.c (af_glyph_hints_reload): Don't set + scaler_fiags here but... + (af_glyph_hints_rescale): Here. + + * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal + hinting for `light' hinting mode. + + + * Jamfile: Small fix to ensure that ftexport.sym is placed into the + same location as other generated objects (i.e., within the `objs' + directory of the current directory). + + + Add support for an embedded `BDF ' table within SFNT-based bitmap + font files. This is used to store atoms & properties from the + original BDF fonts that were used to generate the font file. + + The feature is controlled by TT_CONFIG_OPTION_BDF within + `ftoption.h' and is used to implement FT_Get_BDF_Property for these + font files. + + At the moment, this is still experimental, the BDF table format + isn't cast into stone yet. + + * include/freetype/config/ftoption.h (TT_CONFIG_OPTION_BDF): New + macro. + + * include/freetype/config/ftstdlib.h (ft_memchr): New macro. + + * include/freetype/internal/tttypes.h (TT_BDFRec, TT_BDF) + [TT_CONFIG_OPTION_BDF]: New structure. + (TT_FaceRec) [TT_CONFIG_OPTION_BDF]: New member `bdf'. + + * include/freetype/ttags.h (TTAG_BDF): New macro. + + * src/sfnt/Jamfile (_sources): Add ttbdf. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttbdf.c. + + * src/sfnt/sfdriver.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h and + FT_SERVICE_BDF_H. + (sfnt_get_charset_it) [TT_CONFIG_OPTION_BDF]: New function. + (sfnt_service_bdf) [TT_CONFIG_OPTION_BDF]: New service. + (sfnt_services) [TT_CONFIG_OPTION_BDF]: Add sfnt_service_bdf. + + * src/sfnt/sfnt.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.c. + + * src/sfnt/sfobjs.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h. + (sfnt_done_face) [TT_CONFIG_OPTION_BDF]: Call + tt_face_free_bdf_props. + + * src/sfnt/ttbdf.h, src/sfnt/ttbdf.c: New files. + +2005-12-07 Werner Lemberg + + * src/sfnt/sfobjc.c (sfnt_init_face): Move tag check to... + * src/sfnt/ttload.c (sfnt_init): Here, before handling TTCs. + +2005-12-06 Chia-I Wu + + * src/truetype/ttobjs.c (tt_size_init): size->ttmetrics.valid is + initialized twice. + size->strike_index is not initialized. + +2005-12-02 Taek Kwan(TK) Lee + + * src/type42/t42objs.c (T42_Face_Init): Replace call to + FT_New_Memory_Face with call to FT_Open_Face to pass `params'. + +2005-11-30 Werner Lemberg + + * docs/CHANGES: Document ftdump's `-v' option. + Document latest charmap code changes. + + * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: + s/TT_CMAP_FLAG_OVERLAPPED/TT_CMAP_FLAG_OVERLAPPING/. + +2005-11-30 Chia-I Wu + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary, + tt_cmap12_char_map_binary): Fix compiler warnings. + +2005-11-29 Chia-I Wu + + Major update to distinguish between unsorted and overlapping + segments for cmap format 4. For overlapping but sorted segments, + which is previously considered unsorted, we still use binary search. + + * src/sfnt/ttcmap.h (TT_CMapRec_): Replace `unsorted' by `flags'. + (TT_CMAP_FLAG_UNSORTED, TT_CMAP_FLAG_OVERLAPPED): New macros. + + * src/sfnt/ttcmap.c (OPT_CMAP4): Removed as it is always defined. + (TT_CMap4Rec_): Remove `old_charcode' and `table_length'. + (tt_cmap4_reset): Removed. + (tt_cmap4_init): Updated accordingly. + (tt_cmap4_next): Updated accordingly. + Take care of overlapping segments. + (tt_cmap4_validate): Make sure the subtable is large enough. + Do not check glyph_ids because some fonts set the length wrongly. + Also, if all segments have offset 0, glyph_ids is always invalid. + It does not cause any problem so far only because the check misses + equality. + Distinguish between unsorted and overlapping segments. + (tt_cmap4_char_map_linear, tt_cmap4_char_map_binary): New functions + to do `charcode => glyph index' by linear/binary search. + (tt_cmap4_char_index, tt_cmap4_char_next): Use + tt_cmap4_char_map_linear and tt_cmap4_char_map_binary. + (tt_face_build_cmaps): Treat the return value of validator as flags + for cmap. + +2005-11-29 Chia-I Wu + + * src/sfnt/ttcmap.c (TT_CMap12Rec_, tt_cmap12_init, tt_cmap12_next): + New structures and functions for fast `next char'. + (tt_cmap12_char_map_binary): New function to do `charcode => glyph + index' by binary search. + (tt_cmap12_char_index, tt_cmap12_char_next): Use + tt_cmap12_char_map_binary. + (tt_face_build_cmaps): Check table and offset correctly (equality is + missing). + +2005-11-15 Detlef Würkner + + * builds/amiga/smakefile: Adjusted the compiler options + to the current sources, now really builds the gxvalid, gzip + and psnames modules. + + * builds/amiga/src/base/ftsystem.c: The assumed Seek() position + in the file cache was off by one byte which could cause false + errors in font files. + +2005-11-24 suzuki toshiya + + * builds/mac/FreeType.m68k_far.make.txt, + builds/mac/FreeType.m68k_cfm.make.txt, + builds/mac/FreeType.ppc_classic.make.txt, + builds/mac/FreeType.ppc_carbon.make.txt: + Updated for MPW to build all available modules. + +2005-11-21 HÃ¥vard Wall + + * src/bdf/bdfdrivr.c (bdf_interpret_style, BDF_Face_Done): Fix small + memory leak. + +2005-11-21 Werner Lemberg + + * src/sfnt/ttload.c (sfnt_init): Add tracing message. + +2005-11-21 Chia-I Wu + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Image_offset was + added twice to image_start if image_format was 2 or 5. + +2005-11-21 Chia-I Wu + + * src/sfnt/sfobjs.c (sfnt_init_face): Check that format_tag is known + before loading the table directory. + + * src/sfnt/ttload.c (tt_face_load_sfnt_header, + tt_face_load_directory): Delay sfnt_dir_check from + tt_face_load_sfnt_header to tt_face_load_directory. + +2005-11-20 Chia-I Wu + + * src/sfnt/ttload.c (sfnt_dir_check): Clean up and return correct + error code. + (sfnt_init): New function to fill in face->ttc_header. A non-TTC font + is synthesized into a TTC font with one offset table. + (tt_face_load_sfnt_header): Use sfnt_init. + Fix an invalid access if the font is TTC and face_index is -1. + +2005-11-18 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_load_metrics): Ignore excess number + of metrics instead of aborting. Patch suggested by Derek Noonburg. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): Scale + the glyph properly if no hinter is available. + + * docs/CHANGES: Mention scaling bug. + +2005-11-18 susuzki toshiya + + * include/freetype/ftgxval.h, src/base/ftgxval.c + (FT_TrueTypeGX_Free, FT_ClassicKern_Free): New functions to free + buffers allocated by gxvalid module. + * include/freetype/ftotval.h, src/base/ftotval.c + (FT_OpenType_Free): New function to free buffer allocated by + otvalid module. + +2005-11-18 Chia-I Wu + + * builds/unix/ftsystem.c (FT_Stream_Open, FT_New_Memory, + FT_Done_Memory), builds/vms/ftsystem.c (FT_Stream_Open, FT_New_Memory, + FT_Done_Memory), builds/win32/ftdebug.c (FT_Message, FT_Panic): + s/FT_EXPORT/FT_BASE/. + +2005-11-17 Detlef Würkner + + * builds/amiga/src/base/ftdebug.c (FT_Trace_Get_Count, + FT_Trace_Get_Name, FT_Message, FT_Panic), + builds/amiga/src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory, + FT_Stream_Open): s/FT_EXPORT/FT_BASE/. + +2005-11-17 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile, + builds/amiga/include/freetype/config/ftmodule.h: Updated the Amiga + build files (added support for the gxvalid module). + +2005-11-17 Werner Lemberg + + Add vertical metrics support to OpenType CFF outlines. Based on a + patch from Mike Moening . + + * src/cff/cffgload.c (cff_face_get_vertical_metrics): New function. + (cff_slot_load): Use cff_face_get_vertical_metrics. + + * docs/CHANGES: Updated. + +2005-11-17 Chia-I Wu + + * src/base/ftcalc.c (FT_MulTo64): Commented out. + + * include/freetype/internal/ftcalc.h (FT_SqrtFixed), + src/base/ftcalc.c (FT_SqrtFixed), + include/freetype/internal/ftdebug.h (FT_Trace_Get_Count, + FT_Trace_Get_Name, FT_Message, FT_Panic), src/base/ftdebug.c + (FT_Trace_Get_Count, FT_Trace_Get_Name, FT_Message, FT_Panic), + include/freetype/internal/ftobjs.h (FT_New_Memory, FT_Done_Memory), + include/freetype/internal/ftstream.h (FT_Stream_Open), + src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory, FT_Stream_Open): + s/FT_EXPORT/FT_BASE/. + + * builds/exports.mk: Manually add TT_New_Context to EXPORTS_LIST + too. + +2005-11-15 David Turner + + * src/base/fttrigon.c (ft_trig_prenorm): Fix a bug that created + invalid computations, resulting in very weird bugs in TrueType + bytecode hinted fonts. + + * src/truetype/ttinterp.c (FT_UNUSED_EXEC): Don't perform a + structure copy each time. + +2005-11-11 Werner Lemberg + + * src/cache/ftccache.c (FTC_Cache_Clear), src/cache/ftcmanag.c + (FTC_Manager_Check): Remove FT_EXPORT_DEF tag. + + * src/base/ftcalc.c (FT_Add64): Remove FT_EXPORT_DEF tag. + (FT_Div64by32, FT_Sqrt32): Commented out. Unused. + + * include/freetype/internal/ftcalc.h (SQRT_32): Removed. Unused. + (FT_Sqrt32): Commented out. Unused. + + * include/freetype/cache/ftccache.h: + s/ftc_node_destroy/FTC_Node_Destroy/. + + * src/cache/ftccback.h (ftc_node_destroy): New declaration. + + * src/cache/ftccache.c (ftc_node_destroy): Use FT_LOCAL_DEF tag. + (FTC_Node_Destroy): New exported wrapper function for + ftc_node_destroy. + + * src/cache/ftcmanag.c: Include ftccback.c. + +2005-11-10 Werner Lemberg + + * src/autofit/afangles.c, src/autofit/aftypes.h (af_angle_diff): + Comment out. Unused. + + * builds/exports.mk ($(EXPORTS_LIST)): Add TT_RunIns. + +2005-11-10 Christian Biesinger + + * builds/beos/beos.mk: Call beos-def.mk before anything else to + define the separator. + + * builds/unix/unix-cc.in (LINK_LIBRARY): Add `-no-undefined' flag. + +2005-11-07 Werner Lemberg + + * src/type1/t1afm.c (T1_Read_PFM): Zero offset means `no kerning + table available'. From Sergey Tolstov . + +2005-11-03 Ville Syrjälä + + * src/base/ftobjs.c (FT_Open_Face): Avoid possible memory leak. + +2005-11-02 Werner Lemberg + + Make compiling instructions in docs/CUSTOMIZE work again. + + * builds/unix/unix-cc.in (CPPFLAGS): New variable. + (CFLAGS): Don't include @CPPFLAGS@. + * builds/freetype.mk (FT_CFLAGS): Add CPPFLAGS. + +2005-10-28 David Turner + + Update build system to support the generation of a list of exported + symbols or Windows .DEF files by parsing the public headers with the + `apinames' tool located in src/tools/apinames.c. + + Only tested on Unix at the moment. On Windows, the .DEF file is + generated but isn't used yet to generate a DLL. + + * builds/exports.mk: New file. + + * builds/freetype.mk: Include exports.mk. + (dll): New target. + (clean_project_dos): Fix rule. + + * builds/compiler/visualc.mk (TE), builds/dos/dos-def.mk (E), + builds/os2/os2-def.mk (E), builds/win32/win32-def.mk (E): New + variables for controlling executable extensions. + + * builds/unix/unix-cc.in (EXPORTS_LIST, CCexe), + builds/win32/w32-bcc.mk, builds/win32/w32-gcc.mk, + builds/win32/w32-icc.mk, builds/win32/w32-icc.mk, + builds/win32/w32-mingw32.mk, builds/win32/w32-vcc, + builds/win32/w32-wat.mk (EXPORTS_LIST, EXPORT_OPTIONS, + APINAMES_OPTIONS): New targets for controlling the `apinames' tool. + + * Jamfile (GenExportSymbols): Updated. + + + * src/pfr/pfrtypes.h, src/pfr/pfrload.c, src/pfr/pfrobjs.c + [!FT_OPTIMIZE_MEMORY]: Fold memory optimization code into + FT_OPTIMIZE_MEMORY chunks for better maintainability and simplicity. + + + * src/base/fttrigon.c (ft_trig_prenorm), src/base/ftcalc.c + (FT_MulFix): Performance optimizations. + + + * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P, + FT_GLYPHLOADER_CHECK_C, FT_GLYPHLOADER_CHECK_POINTS): New macros for + checking points and contours. Update callers to use + FT_GLYPHLOADER_CHECK_POINTS instead of FT_GlyphLoader_CheckPoints + at profile-detected hot-spots. + + * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Set `adjust' + to 0 to not call `AdjustPoints' every time. + + + * src/autofit/aftypes.h (AF_ANGLE_DIFF): New macro to inline + FT_Angle_Diff. + + * src/autofit/afhints.c (af_direction_compute): Re-implement. + (af_glyph_hints_compute_inflections, af_glyph_hints_reload): Use + AF_ANGLE_DIFF to speed up the detection of inflexions. + + + * src/tools/apinames.c: Include . + (OutputFormat): New enumeration. + (names_dump): Add two parameters to control output format and DLL + name. + (names_dump_windef): Removed. Code folded into `names_dump'. + (read_header_file): Use isalnum, not isalpha. Otherwise function + names with digits aren't read correctly. + (usage): Updated. + (main): New option `-o' to control output file name. + New option `-d' to indicate DLL file name. + Extend `-w' flag to handle Borland and Watcom compilers and linkers. + +2005-10-28 suzuki toshiya + + * builds/mac/ftlib.prj, builds/mac/freetype.mak: Removed. + ftlib.prj is unmaintained and incompatible with current tree. + freetype.mak is unrecoverably broken. + + * builds/mac/ftlib.prj.xml: Added. + Generated by Metrowerks CodeWarrior 9.0. + + * builds/mac/FreeType.m68k_far.make.txt, + builds/mac/FreeType.m68k_cfm.make.txt, + builds/mac/FreeType.ppc_classic.make.txt, + builds/mac/FreeType.ppc_carbon.make.txt: Added. + Skeleton files of MPW makefiles. + + * builds/mac/ascii2mpw.py: Added. + Python script to make MPW makefile from skeleton. + + * builds/mac/README: Updated. + Almost rewritten to use new files. + +2005-10-28 suzuki toshiya + + * src/base/ftmac.c: Fix invalid casts from NULL to integer typed + variables. Advised by David Turner, Masatake YAMATO, Sean McBride, + and George Williams. + +2005-10-27 Werner Lemberg + + * include/freetype/ftsysmem.h, include/freetype/ftsysio.h: Removed. + Obsolete. + +2005-10-25 Werner Lemberg + + * src/sfnt/sfdriver.c (sfnt_interface): Move out + `tt_face_get_kerning' from a #ifdef clause. Reported by Tony J. + Ibbs . + +2005-10-23 Werner Lemberg + + * src/base/ftdbgmem.c (ft_mem_debug_realloc): Make it compile with + C++. + +2005-10-21 David Turner + + * src/base/ftdbgmem.c (ft_mem_table_set, ft_mem_debug_realloc): + Another realloc memory counting bug fix. + + * src/tools/Jamfile: Add missing file. + + * src/lzw/Jamfile: Fix incorrect source file reference. + +2005-10-20 David Turner + + * src/base/ftdbgmem.c (ft_mem_table_set, ft_mem_table_remove, + ft_mem_debug_alloc, ft_mem_debug_free, ft_mem_debug_realloc): Fixes + to better account for memory reallocations. + + * src/lzw/ftlzw2.c, src/lzw/ftzopen.h, src/lzw/ftzopen.c, + src/lzw/rules.mk: First version of LZW loader re-implementation. + Apparently, this saves about 330 KB of heap memory when loading + timR24.pcf.Z. + +2005-10-20 Chia-I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Copy, FT_Bitmap_Embolden), + src/base/ftbdf.c (FT_Get_BDF_Property), src/cache/ftcmru.c + (FTC_MruList_Reset, FTC_MruList_Done, FTC_MruList_Lookup): Fix + FT_EXPORT/FT_EXPORT_DEF tagging. + +2005-10-19 Chia-I Wu + + * src/truetype/ttgload.c (TT_Load_Glyph): Allow size->ttmetrics to + be invalid when FT_LOAD_NO_SCALE is set. + +2005-10-17 David Turner + + * src/base/ftobjs.c (FT_Open_Face): Don't call FT_New_GlyphSlot and + FT_New_Size if we are opening a face with face_index < 0 (which is + only used for testing the format). + + * src/gxvalid/gxvmort0.c (gxv_mort_subtable_type0_entry_validate): + Remove compiler warning. + +2005-10-16 David Turner + + * src/tools/apinames.c: Add new tool to extract public API function + names from header files. + +2005-10-05 Werner Lemberg + + Add FT_FACE_FLAG_HINTER to indicate that a specific font driver has + a hinting engine of its own. + + * include/freetype/freetype.h (FT_FACE_FLAG_HINTER): New macro. + + * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c + (cid_face_init), src/truetype/ttobjs.c (tt_face_init) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER], src/type1/t1objs.c + (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Update face flags. + + * docs/CHANGES: Document it. + +2005-09-27 Werner Lemberg + + * builds/unix/freetype2.m4: Add license exception so that the file + can be used in any other autoconf script. + +2005-09-26 David Turner + + * src/autofit/aflatin.c (af_latin_compute_stem_width): Fix bad + computation of the `vertical' flag, causing ugly things in LCD mode + and others. + +2005-09-23 David Turner + + * src/autofit/aflatin.c (af_latin_hints_init): Fix a bug that + prevented internal hint mode bitflags from being computed correctly. + + * src/base/Jamfile: Adding src/base/ftgxval.c. + + * src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c, + src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, src/gxvalid/gxvkern.c, + src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c, + src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c, + src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c, + src/gxvalid/gxvmort5.c, src/gxvalid/gxvmorx.c, + src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c, + src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx5.c, + src/gxvalid/gxvopbd.c, src/gxvalid/gxvprop.c, + src/truetype/ttgload.c: Remove _many_ compiler warnings when + compiling with Visual C++ at maximum level (/W4). + + * src/autofit/afangles.c (af_angle_atan): Replaced CORDIC-based + implementation with one using lookup tables. This simple thing + speeds up glyph loading by 18%, according to ftbench! + + * src/sfnt/sfdriver.c (sfnt_get_interface): Don't check for + `get_sfnt' and `load_sfnt' module interfaces. + +2005-09-22 Werner Lemberg + + * docs/CHANGES: Mention SING Glyphlet support. + +2005-09-22 David Turner + + * src/base/Jamfile: Disable compilation of ftgxval module + temporarily. + +2005-09-19 David Somers + + * src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a + font to have no `head' table if tables `SING' and `META' are + present; this is to support `SING Glyphlet'. + + `SING Glyphlet' is an extension to OpenType developed by Adobe + primarily to facilitate adding supplemental glyphs to an OpenType + font (with emphasis on, but not necessarily limited to, gaiji to a + CJK font). A SING Glyphlet Font is an OpenType font that contains + the outline(s), either in a `glyf' or `CFF' table, for a glyph; + `cmap', `BASE', and `GSUB' tables are present with the same format + and functionaliy as a regular OpenType font; there are no `name', + `head', `OS/2', and `post' tables; there are two new tables, `SING' + which contains details about the glyphlet, and `META' which contains + metadata. + + Further information on the SING Glyphlet format can be found at: + + http://www.adobe.com/products/indesign/sing_gaiji.html + + * include/freetype/ttags.h (TTAG_SING, TTAG_META): New macros for + the OpenType tables `SING' and `META'. These two tables are used in + SING Glyphlet Format fonts. + +2005-09-09 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Reactivate code to set + FT_FACE_FLAG_KERNING which has been commented out erroneously. + + * docs/CHANGES: Document it. + +2005-09-05 Werner Lemberg + + Fixes for `make multi' and using C++ compiler. + + * src/gxvalid/gxvcommn.c (gxv_set_length_by_ushort_offset, + gxv_set_length_by_ulong_offset, gxv_array_getlimits_byte, + gxv_array_getlimits_ushort): Declare with FT_LOCAL_DEF. + (gxv_compare_ranges): Make it static. + (gxv_LookupTable_fmt0_validate, gxv_LookupTable_fmt2_validate, + gxv_LookupTable_fmt4_validate, gxv_LookupTable_fmt6_validate, + gxv_LookupTable_fmt8_validate, gxv_LookupTable_validate): Improve + trace messages. + (gxv_StateArray_validate, gxv_XStateArray_validate): s/class/clazz/. + (GXV_STATETABLE_HEADER_SIZE, GXV_STATEHEADER_SIZE, + GXV_XSTATETABLE_HEADER_SIZE, GXV_XSTATEHEADER_SIZE): Move to + gxvcommn.h. + + * src/gxvalid/gxvcommn.h: Add prototypes for + gxv_StateTable_subtable_setup, gxv_XStateTable_subtable_setup, + gxv_XStateTable_validate, gxv_array_getlimits_byte, + gxv_array_getlimits_ushort, gxv_set_length_by_ushort_offset, + gxv_set_length_by_ulong_offset, gxv_odtect_add_range, + gxv_odtect_validate. + (GXV_STATETABLE_HEADER_SIZE, GXV_STATEHEADER_SIZE, + GXV_XSTATETABLE_HEADER_SIZE, GXV_XSTATEHEADER_SIZE): Moved from + gxvcommn.c. + + * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate, + gxv_bsln_parts_fmt1_validate): Improve trace messages. + + * src/gxvalid/gxvfeat.c: Split off predefined registry stuff to... + * src/gxvalid/gxvfeat.h: New file. + + * src/gxvalid/gxvjust.c (gxv_just_wdc_entry_validate): Improve trace + message. + + * src/gxvalid/gxvkern.c (GXV_kern_Dialect): Add KERN_DIALECT_UNKNOWN. + (gxv_kern_subtable_fmt1_valueTable_load, + gxv_kern_subtable_fmt1_subtable_setup, + gxv_kern_subtable_fmt1_entry_validate): Fix C++ compiler errors. + (gxv_kern_coverage_validate): Use KERN_DIALECT_UNKWOWN. + Improve trace message. + (gxv_kern_validate_generic): Fix C++ compiler error. + Improve trace message. + (gxv_kern_validate_classic): Fix C++ compiler error. + + * src/gxvalid/gxvmort0.c (gxv_mort_subtable_type0_validate): Declare + with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substitutionTable_load, + gxv_mort_subtable_type1_subtable_setup): Fix C++ compiler errors. + (gxv_mort_subtable_type1_substTable_validate): Improve trace + message. + (gxv_mort_subtable_type1_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort2.c (gxv_mort_subtable_type2_opttable_load, + gxv_mort_subtable_type2_subtable_setup, + gxv_mort_subtable_type2_ligActionOffset_validate, + gxv_mort_subtable_type2_ligatureTable_validate): Fix C++ compiler + errors. + (gxv_mort_subtable_type2_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort4.c (gxv_mort_subtable_type4_validate): Declare + with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort5.c (gxv_mort_subtable_type5_subtable_setup, + gxv_mort_subtable_type5_InsertList_validate): Fix C++ compiler + errors. + (gxv_mort_subtable_type5_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort.c: Include gxvfeat.h. + (gxv_mort_featurearray_validate, gxv_mort_coverage_validate): + Declare with FT_LOCAL_DEF. + (gxv_mort_subtables_validate, gxv_mort_validate): Improve trace + messages. + + * src/gxvalid/gxvmort.h (gxv_mort_feature_validate): Remove. + + * src/gxvalid/gxvmorx0.c (gxv_morx_subtable_type0_validate): Declare + with FT_LOCAL_DEF. + + * src/gxvalid/gxvmorx1.c + (gxv_morx_subtable_type1_substitutionTable_load, + gxv_morx_subtable_type1_subtable_setup, + gxv_morx_subtable_type1_entry_validate, + gxv_morx_subtable_type1_substitutionTable_validate): Fix C++ + compiler errors. + (gxv_morx_subtable_type1_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmorx2.c (gxv_morx_subtable_type2_opttable_load, + gxv_morx_subtable_type2_subtable_setup, + gxv_morx_subtable_type2_ligActionIndex_validate, + gxv_morx_subtable_type2_ligatureTable_validate): Fix C++ compiler + errors. + (gxv_morx_subtable_type2_validate): Declare with FT_LOCAL_DEF. + Fix typo. + + * src/gxvalid/gxvmorx4.c (gxv_morx_subtable_type4_validate): Declare + with FT_LOCAL_DEF. + + * src/gxvalid/gxvmorx5.c (gxv_morx_subtable_type5_insertionGlyph_load, + gxv_morx_subtable_type5_subtable_setup): Fix C++ compiler error. + (gxv_morx_subtable_type5_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate, + gxv_morx_validate): Improve trace message. + + * src/gxvalid/gxvopbd.c (gxv_opbd_LookupFmt4_transit): Fix compiler + warnings. + (gxv_opbd_validate): Improve trace message. + + * src/gxvalid/gxvprop.c: Decorate constants with `U' and `L' where + appropriate. + (gxv_prop_zero_advance_validate, gxv_prop_validate): Improve trace + message. + + * src/gxvalid/gxvtrak.c (gxv_trak_trackTable_validate): Remove unused + parameter. Update all callers. + (gxv_trak_validate): Improve trace message. + + * rules.mk (GXV_DRV_H): Add gxvfeat.h. + +2005-09-01 Werner Lemberg + + * src/gxvalid/gxvbsln.c (GXV_BSLN_VALUE_EMPTY): Add `U'. + + * src/gxvalid/gxmort1.c (GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE), + src/gxvalid/gxmort2.c (GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE): Fix + typo. + + * src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c, + src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx4.c, + src/gxvalid/gxvmorx5.c, src/gxvalid/gxvmort.c: Improve trace + messages. + Decorate constants with `U' and `L' where appropriate. + Fix compiler warnings. + +2005-08-31 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix typo. + + * src/gxvalid/gxvbsln.c (gxv_bsln_validate): Fix trace message. + + * src/gxvalid/gxvcommn.c (gxv_odtect_add_range): Use `const'. + + * src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, + src/gxvalid/gxvkern.c, src/gxvalid/gxvlcar.c, src/gxvalid/gxvmod.c, + src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c, + src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c, + src/gxvalid/gxvmort5.c, src/gxvalid/gxvmort.c: Improve trace + messages. + Decorate constants with `U' and `L' where appropriate. + Fix compiler warnings. + +2005-08-30 Werner Lemberg + + * src/gxvalid/README: Revised. + * src/gxvalid/gxvbsln.c: Fix compiler warnings. + * src/gxvalid/gxvcommn.c: Fix compiler warnings. + (gxv_XEntryTable_validate, gxv_compare_ranges): Remove unused + parameter. Update all callers. + Improve trace messages. + Some formatting. + +2005-08-29 Werner Lemberg + + * include/freetype/freetype.h, include/freetype/ftchapters.h: Add + a preliminary section with some explanations about user allocation. + + * src/tools/docmaker/tohtml.py (HtmlFormatter.section_enter): + Don't abort if there are no data types, functions, etc., in a + section. + Print synopsis only if we have a data type, function, etc. + + * docs/INSTALL.ANY, docs/INSTALL, docs/INSTALL.UNX, docs/CUSTOMIZE, + docs/INSTALL.GNU, docs/TRUETYPE, docs/DEBUG, docs/UPGRADE.UNX, + docs/VERSION.DLL, docs/formats.txt: Revised, formatted. + +2005-08-28 George Williams + + * src/truetype/ttgload.c [TT_MAX_COMPOSITE_RECURSE]: Removed. + (load_truetype_glyph): Limit recursion depth by `maxComponentDepth'. + +2005-08-25 J. Ali Harlow + + * builds/unix/freetype2.in (CFlags): Add missing directory. + +2005-08-24 Werner Lemberg + + * docs/CHANGES: Mention gxvalid module. + +2005-08-23 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_scale): Initialize + render mode properly. Reported by chris@dokein.co.uk. + +2005-08-23 suzuki toshiya + + Add gxvalid module to validate TrueType GX/AAT tables. + + Modifications on existing files: + + * Jamfile: Register gxvalid module. + * src/base/Jamfile: Register ftgxval.c. + * src/base/rule.mk: Register ftgxval.c. + * docs/INSTALL.ANY: Register gxvalid/gxvalid.c. + + * include/freetype/config/ftheader.h (FT_GX_VALIDATE_H): New macro + to include gxvalid header file. + * include/freetype/config/ftmodule.h: Register gxv_module_class. + + * include/freetype/ftchapters.h: Add comment about gx_validation. + * include/freetype/ftotval.h: Change keyword FT_VALIDATE_XXX + to FT_VALIDATE_OTXXX to co-exist with gxvalid. + * include/freetype/tttags.h: Add tags for TrueType GX/AAT tables. + + * include/freetype/internal/ftserv.h (FT_SERVICE_GX_VALIDATE_H): New + macro for gxvalid service. + * include/freetype/internal/fttrace.h: Add trace facilities for + gxvalid. + + New files on existing directories: + + * include/freetype/internal/services/svgxval.h: Registration of + validation service for TrueType GX/AAT and classic kern table. + * include/freetype/ftgxval.h: Public API definition to use gxvalid. + * src/base/ftgxval.c: Public API of gxvalid. + + New files under src/gxvalid/: + + * src/gxvalid/Jamfile src/gxvalid/README src/gxvalid/module.mk + src/gxvalid/rules.mk src/gxvalid/gxvalid.c src/gxvalid/gxvalid.h + src/gxvalid/gxvbsln.c src/gxvalid/gxvcommn.c src/gxvalid/gxvcommn.h + src/gxvalid/gxverror.h src/gxvalid/gxvfeat.c src/gxvalid/gxvfgen.c + src/gxvalid/gxvjust.c src/gxvalid/gxvkern.c src/gxvalid/gxvlcar.c + src/gxvalid/gxvmod.c src/gxvalid/gxvmod.h src/gxvalid/gxvmort.c + src/gxvalid/gxvmort.h src/gxvalid/gxvmort0.c src/gxvalid/gxvmort1.c + src/gxvalid/gxvmort2.c src/gxvalid/gxvmort4.c src/gxvalid/gxvmort5.c + src/gxvalid/gxvmorx.c src/gxvalid/gxvmorx.h src/gxvalid/gxvmorx0.c + src/gxvalid/gxvmorx1.c src/gxvalid/gxvmorx2.c src/gxvalid/gxvmorx4.c + src/gxvalid/gxvmorx5.c src/gxvalid/gxvopbd.c src/gxvalid/gxvprop.c + src/gxvalid/gxvtrak.c: New files, gxvalid body. + +2005-08-21 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Glyph): Only translate outline + to (0,0) if bit 1 of the `head' table isn't set. This improves + rendering of buggy fonts. + +2005-08-20 Chia I Wu + + * src/truetype/ttdriver.c (Load_Glyph): Don't check the validity of + ttmetrics here. TrueType fonts with only sbits always have + ttmetrics.valid set to false. + + * src/truetype/ttgload.c (TT_Load_Glyph): Check that ttmetrics is + valid before loading outline glyph. + + * src/cache/ftcimage.c (FTC_INode_New): Fix a memory leak. + +2005-08-20 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_load_metrics_header): Ignore missing + `hhea' table for SFNT Mac fonts. Change based on a patch by + mpsuzuki@hiroshima-u.ac.jp. + +2005-08-20 Masatake YAMATO + + * src/otvalid/otvmod.c (otv_validate): Use ft_validator_run instead + of ft_setjmp. + +2005-08-19 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix compiler + warnings. + +2005-08-16 Chia I Wu + + * src/truetype/ttinterp.c, src/truetype/ttinterp.h: Update copyright + messages. + +2005-08-16 Chia I Wu + + * src/truetype/ttinterp.c, src/truetype/ttinterp.h: Remove original + TT_Done_Context and rename TT_Destroy_Context to TT_Done_Context + with slight changes. + Update all callers. + (TT_New_Context): Now takes TT_Driver argument directly. + Update all callers. + + * src/truetype/ttobjs.h (tt_slot_init): New function. + * src/truetype/ttobjs.c (tt_driver_init): Initialize execution + context here. + (tt_slot_init): New function to create extra points for the internal + glyph loader. We then use it directly, instead of face's glyph + loader, when loading glyph. + + * src/truetype/ttdriver.c (tt_driver_class): Use tt_slot_init for + glyph slot initialization. + (Load_Glyph): Load flag dependencies are handled here. Return error + if size is NULL. + + * src/truetype/ttgload.c: Heavy cleanup and refactoring. + (org_to_cur): Removed. + (TT_Load_Simple_Glyph): Call FT_GlyphLoader_CheckPoints. + (TT_Hint_Glyph): New function to hint a zone, prepared by caller. + (TT_Process_Simple_Glyph): s/load/loader/. + Use loader->pp values instead of recalculation. + Use TT_Hint_Glyph. + No need to save/restore loader->stream before and after + TT_Vary_Get_Glyph_Deltas now. + (TT_LOADER_SET_PP): New macro to calculate and set the four phantom + points. + (load_truetype_glyph): Never set exec->glyphSize to 0. This closes + Savannah bug #13107. + Forget glyph frame before calling TT_Process_Simple_Glyph. + Use TT_LOADER_SET_PP. + Scale all four phantom points. + Split off some functionality to ... + (TT_Process_Composite_Component, TT_Process_Composite_Glyph): These + new functions. + (TT_Load_Glyph): Set various fields of `glyph' here, not in + load_truetype_glyph and compute_glyph_metrics. + Split off some functionality to ... + (load_sbit_image, tt_loader_init): These new functions. + (compute_glyph_metrics): Call FT_Outline_Get_CBox. + +2005-08-08 Werner Lemberg + + * docs/INSTALL.ANY: Updated. + +2005-08-05 Werner Lemberg + + * src/cff/cffgload.c (cff_builder_close_contour), + src/psaux/psobjs.c (t1_builder_close_contour): Protect against + zero `outline' pointer. + + * src/base/ftgloadr.c (FT_GlyphLoader_Add): Protect against zero + `loader' address. + +2005-08-03 Werner Lemberg + + * src/sfnt/sfdriver.c (sfnt_interface) [FT_OPTIMIZE_MEMORY]: + Reactivate pointers to tt_find_sbit_image and tt_load_sbit_metrics + to make X work again. + +2005-08-02 Werner Lemberg + + * src/otvalid/otvcommn.h: Remove dead code. + +2005-07-31 Chia I Wu + + * src/truetype/ttobjs.h (tt_size_run_fpgm, tt_size_run_prep): New + functions. + + * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): New + functions. + (tt_size_init): Add 4, instead of 2, (phantom) points to twilight + zone. + Move code that runs fpgm to tt_size_run_fpgm. + (Reset_Outline_Size): Move code that runs prep to tt_size_run_prep. + (tt_glyphzone_new): Allocate right size of arrays. + Set max_points and max_contours properly. + +2005-07-26 Chia I Wu + + * src/truetype/ttdriver.c (Set_Char_Sizes): Avoid unnecessary + computations and clean up. + + * src/truetype/ttobjs.h (struct TT_SizeRec_): Comment on the + internal copy of metrics. + +2005-07-12 Werner Lemberg + + * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix prototype. + Reported by Xerxes. + +2005-07-04 Werner Lemberg + + * include/freetype/internal/ftmemory.h (FT_REALLOC_ARRAY): Fix typo. + Reported by Brett Hutley. + +2005-06-30 David Turner + + * src/sfnt/ftbitmap.c, src/truetype/ttgload.c, src/sfnt/ttcmap.c: + Removing compiler warnings (Visual C++ /W4). + + + Implement a work-around for broken C preprocessor in Visual C++ (it + has been confirmed by the MS developers that it is indeed a bug + which won't be fixed in the very near future). + + * Jamfile (FT2_COMPONENTS): Include otvalid (again). + + * src/otvalid/otvcommn.h (OTV_NAME, OTV_FUNC): New macros. + (OTV_NEST1, OTV_NEST2, OTV_NEST3): Use OTV_NAME and OTV_FUNC to + avoid argument expansion by argument prescan. + Append `Func' to all affected macros and change them to take just a + single argument. Example: `AttachList' is renamed to + `AttachListFunc'. + + * src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, + src/otvalid/otvgsub.c, src/otvjstf.c: Append `Func' to macros + affected by the changes to OTV_NESTx and modify them to take just a + single argument. + +2005-06-20 Chia I Wu + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c: New function + ft_glyphslot_grid_fit_metrics. + + * src/truetype/ttgload.c (compute_glyph_metrics): Use + ft_glyphslot_grid_fit_metrics. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): Use + ft_glyphslot_grid_fit_metrics. + FT_Outline_Get_CBox is called twice. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Modify metrics to more + reasonable values when emboldening outline glyphs. The theoretic + ones are unrealistic. + +2005-06-16 Chia I Wu + + * src/base/ftoutln.c (FT_Outline_Embolden): Strength should be + halved. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default + strength. + Don't increase slot->advance.y. + +2005-06-16 Werner Lemberg + + * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. + (FREETYPE_PATCH): Set to 0. + + * builds/unix/configure.ac (version_info): Set to 9:9:3. + Currently, we are still binary compatible. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. + + * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): + s/2.1.9/2.1.10/. + + * docs/CHANGES, docs/VERSION.DLL: Updated. + + * ChangeLog: Split off older entries into... + * ChangeLog.20, ChangeLog.21: These new files. + +2005-06-15 Kirill Smelkov + + The next release will be 2.2.0, so don't worry about source code + backwards compatibility. + + * include/freetype/ftimage.h (FT_Outline_MoveToFunc, + FT_Outline_LineToFunc, FT_Outline_ConicToFunc, + FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), + include/freetype/ftrender.h (FT_Glyph_TransformFunc, + FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate + parameters with `const' where appropriate. + +2005-06-15 Chia I Wu + + * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY + to make glyphs centered vertically. + + * src/truetype/ttgload.c (compute_glyph_metrics): Compute + vertBearingY to make glyphs centered vertically. + Fix some bugs in vertical metrics: + + . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font + units. + . As we use the glyph's cbox to calculate the top bearing now + there is no need to adjust `top'. + +2005-06-15 Werner Lemberg + + * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be + in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. + +2005-06-13 Werner Lemberg + + * docs/release: Update. + +---------------------------------------------------------------------------- + +Copyright 2005, 2006, 2007, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/src/3rdparty/freetype/Jamfile b/src/3rdparty/freetype/Jamfile new file mode 100644 index 0000000000..e5273d80bb --- /dev/null +++ b/src/3rdparty/freetype/Jamfile @@ -0,0 +1,203 @@ +# FreeType 2 top Jamfile. +# +# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# The HDRMACRO is already defined in FTJam and is used to add +# the content of certain macros to the list of included header +# files. +# +# We can compile FreeType 2 with classic Jam however thanks to +# the following code +# +if ! $(JAM_TOOLSET) +{ + rule HDRMACRO + { + # nothing + } +} + + +# We need to invoke a SubDir rule if the FT2 source directory top is not the +# current directory. This allows us to build FreeType 2 as part of a larger +# project easily. +# +if $(FT2_TOP) != $(DOT) +{ + SubDir FT2_TOP ; +} + + +# The following macros define the include directory, the source directory, +# and the final library name (without library extensions). They can be +# replaced by other definitions when the library is compiled as part of +# a larger project. +# + +# Name of FreeType include directory during compilation. +# This is relative to FT2_TOP. +# +FT2_INCLUDE_DIR ?= include ; + +# Name of FreeType source directory during compilation. +# This is relative to FT2_TOP. +# +FT2_SRC_DIR ?= src ; + +# Name of final library, without extension. +# +FT2_LIB ?= $(LIBPREFIX)freetype ; + + +# Define FT2_BUILD_INCLUDE to point to your build-specific directory. +# This is prepended to FT2_INCLUDE_DIR. It can be used to specify +# the location of a custom which will point to custom +# versions of `ftmodule.h' and `ftoption.h', for example. +# +FT2_BUILD_INCLUDE ?= ; + +# The list of modules to compile on any given build of the library. +# By default, this will contain _all_ modules defined in FT2_SRC_DIR. +# +# IMPORTANT: You'll need to change the content of `ftmodule.h' as well +# if you modify this list or provide your own. +# +FT2_COMPONENTS ?= autofit # auto-fitter + base # base component (public APIs) + bdf # BDF font driver + cache # cache sub-system + cff # CFF/CEF font driver + cid # PostScript CID-keyed font driver + gzip # support for gzip-compressed files + lzw # support for LZW-compressed files + pcf # PCF font driver + pfr # PFR/TrueDoc font driver + psaux # common PostScript routines module + pshinter # PostScript hinter module + psnames # PostScript names handling + raster # monochrome rasterizer + smooth # anti-aliased rasterizer + sfnt # SFNT-based format support routines + truetype # TrueType font driver + type1 # PostScript Type 1 font driver + type42 # PostScript Type 42 (embedded TrueType) driver + winfonts # Windows FON/FNT font driver + ; + + +# Don't touch. +# +FT2_INCLUDE = $(FT2_BUILD_INCLUDE) + [ FT2_SubDir $(FT2_INCLUDE_DIR) ] ; + +FT2_SRC = [ FT2_SubDir $(FT2_SRC_DIR) ] ; + +# Location of API Reference Documentation +# +if $(DOC_DIR) +{ + DOC_DIR = $(DOCDIR:T) ; +} +else +{ + DOC_DIR = docs/reference ; +} + + +# Only used by FreeType developers. +# +if $(DEBUG_HINTER) +{ + CCFLAGS += -DDEBUG_HINTER ; +} + + +# We need `freetype2/include' in the current include path in order to +# compile any part of FreeType 2. +#: updating documentation for upcoming release + +HDRS += $(FT2_INCLUDE) ; + + +# We need to #define FT2_BUILD_LIBRARY so that our sources find the +# internal headers +# +DEFINES += FT2_BUILD_LIBRARY ; + +# Uncomment the following line if you want to build individual source files +# for each FreeType 2 module. This is only useful during development, and +# is better defined as an environment variable anyway! +# +# FT2_MULTI = true ; + + +# The file is used to define macros that are +# later used in #include statements. It needs to be parsed in order to +# record these definitions. +# +HDRMACRO [ FT2_SubDir include freetype config ftheader.h ] ; +HDRMACRO [ FT2_SubDir include freetype internal internal.h ] ; + + +# Now include the Jamfile in `freetype2/src', used to drive the compilation +# of each FreeType 2 component and/or module. +# +SubInclude FT2_TOP $(FT2_SRC_DIR) ; + +# Handle the generation of the `ftexport.sym' file which contain the list +# of exported symbols. This can be used on Unix by libtool. +# +SubInclude FT2_TOP $(FT2_SRC_DIR) tools ; + +rule GenExportSymbols +{ + local apinames = apinames$(SUFEXE) ; + local headers = [ Glob $(2) : *.h ] ; + + LOCATE on $(1) = $(ALL_LOCATE_TARGET) ; + + APINAMES on $(1) = apinames$(SUFEXE) ; + + Depends $(1) : $(apinames) $(headers) ; + GenExportSymbols1 $(1) : $(headers) ; + Clean clean : $(1) ; +} + +actions GenExportSymbols1 bind APINAMES +{ + $(APINAMES) $(2) > $(1) +} + +GenExportSymbols ftexport.sym : include/freetype include/freetype/cache ; + +# Test files (hinter debugging). Only used by FreeType developers. +# +if $(DEBUG_HINTER) +{ + SubInclude FT2_TOP tests ; +} + +rule RefDoc +{ + Depends $1 : all ; + NotFile $1 ; + Always $1 ; +} + +actions RefDoc +{ + python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.3.9 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h +} + +RefDoc refdoc ; + + +# end of top Jamfile diff --git a/src/3rdparty/freetype/Jamrules b/src/3rdparty/freetype/Jamrules new file mode 100644 index 0000000000..d8d1c7e617 --- /dev/null +++ b/src/3rdparty/freetype/Jamrules @@ -0,0 +1,71 @@ +# FreeType 2 JamRules. +# +# Copyright 2001, 2002, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# This file contains the Jam rules needed to build the FreeType 2 library. +# It is shared by all Jamfiles and is included only once in the build +# process. +# + + +# Call SubDirHdrs on a list of directories. +# +rule AddSubDirHdrs +{ + local x ; + + for x in $(<) + { + SubDirHdrs $(x) ; + } +} + + +# Determine prefix of library file. We must use "libxxxxx" on Unix systems, +# while all other simply use the real name. +# +if $(UNIX) +{ + LIBPREFIX ?= lib ; +} +else +{ + LIBPREFIX ?= "" ; +} + +# FT2_TOP contains the location of the FreeType source directory. You can +# set it to a specific value if you want to compile the library as part of a +# larger project. +# +FT2_TOP ?= $(DOT) ; + +# Define a new rule used to declare a sub directory of the Nirvana source +# tree. +# +rule FT2_SubDir +{ + if $(FT2_TOP) = $(DOT) + { + return [ FDirName $(<) ] ; + } + else + { + return [ FDirName $(FT2_TOP) $(<) ] ; + } +} + +# We also set ALL_LOCATE_TARGET in order to place all object and library +# files in "objs". +# +ALL_LOCATE_TARGET ?= [ FT2_SubDir objs ] ; + + +# end of Jamrules diff --git a/src/3rdparty/freetype/Makefile b/src/3rdparty/freetype/Makefile new file mode 100644 index 0000000000..c1fa16cee5 --- /dev/null +++ b/src/3rdparty/freetype/Makefile @@ -0,0 +1,34 @@ +# +# FreeType 2 build system -- top-level Makefile +# + + +# Copyright 1996-2000, 2002, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Project names +# +PROJECT := freetype +PROJECT_TITLE := FreeType + +# The variable TOP_DIR holds the path to the topmost directory in the project +# engine source hierarchy. If it is not defined, default it to `.'. +# +TOP_DIR ?= . + +# The variable OBJ_DIR gives the location where object files and the +# FreeType library are built. +# +OBJ_DIR ?= $(TOP_DIR)/objs + + +include $(TOP_DIR)/builds/toplevel.mk + +# EOF diff --git a/src/3rdparty/freetype/README b/src/3rdparty/freetype/README new file mode 100644 index 0000000000..6e5ad46b13 --- /dev/null +++ b/src/3rdparty/freetype/README @@ -0,0 +1,64 @@ + Special notes to Unix users + =========================== + + Please read the file `docs/UPGRADE.UNIX'. It contains important + information regarding the installation of FreeType on Unix systems, + especially GNU based operating systems like GNU/Linux. + + FreeType 2's library is called `libfreetype', FreeType 1's library + is called `libttf'. They are *not* compatible! + + + FreeType 2.3.9 + ============== + + Please read the docs/CHANGES file, it contains IMPORTANT + INFORMATION. + + Read the files `docs/INSTALL' for installation instructions. + + The FreeType 2 API reference is located in `docs/reference'; use the + file `ft2-doc.html' as the top entry point. Additional + documentation is available as a separate package from our sites. Go + to + + http://download.savannah.gnu.org/releases/freetype/ + + and download one of the following files. + + freetype-doc-2.3.9.tar.bz2 + freetype-doc-2.3.9.tar.gz + ftdoc239.zip + + + Bugs + ==== + + Please report bugs by e-mail to `freetype-devel@nongnu.org'. Don't + forget to send a detailed explanation of the problem -- there is + nothing worse than receiving a terse message that only says `it + doesn't work'. + + Alternatively, you may submit a bug report at + + https://savannah.nongnu.org/bugs/?group=freetype + + + Enjoy! + + + The FreeType Team + +---------------------------------------------------------------------- + +Copyright 2006, 2007, 2008, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of README --- diff --git a/src/3rdparty/freetype/README.CVS b/src/3rdparty/freetype/README.CVS new file mode 100644 index 0000000000..ff1a2d0580 --- /dev/null +++ b/src/3rdparty/freetype/README.CVS @@ -0,0 +1,46 @@ +The CVS archive doesn't contain pre-built configuration scripts for +UNIXish platforms. To generate them say + + sh autogen.sh + +which in turn depends on the following packages: + + automake (1.10.1) + libtool (2.2.4) + autoconf (2.62) + +The versions given in parentheses are known to work. Newer versions +should work too, of course. Note that autogen.sh also sets up proper +file permissions for the `configure' and auxiliary scripts. + +The autogen.sh script now checks the version of above three packages +whether they match the numbers above. Otherwise it will complain and +suggest either upgrading or using an environment variable to point to +a more recent version of the required tool(s). + +Note that `aclocal' is provided by the `automake' package on Linux, +and that `libtoolize' is called `glibtoolize' on Darwin (OS X). + + +For static builds which don't use platform specific optimizations, no +configure script is necessary at all; saying + + make setup ansi + make + +should work on all platforms which have GNU make (or makepp). + + +---------------------------------------------------------------------- + +Copyright 2005, 2006, 2007, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of README.CVS --- diff --git a/src/3rdparty/freetype/autogen.sh b/src/3rdparty/freetype/autogen.sh new file mode 100644 index 0000000000..16c335fd5c --- /dev/null +++ b/src/3rdparty/freetype/autogen.sh @@ -0,0 +1,162 @@ +#!/bin/sh + +# Copyright 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +run () +{ + echo "running \`$*'" + eval $* + + if test $? != 0 ; then + echo "error while running \`$*'" + exit 1 + fi +} + +get_major_version () +{ + echo $1 | sed -e 's/\([0-9][0-9]*\)\..*/\1/g' +} + +get_minor_version () +{ + echo $1 | sed -e 's/[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/g' +} + +get_patch_version () +{ + # tricky: some version numbers don't include a patch + # separated with a point, but something like 1.4-p6 + patch=`echo $1 | sed -e 's/[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/g'` + if test "$patch" = "$1"; then + patch=`echo $1 | sed -e 's/[0-9][0-9]*\.[0-9][0-9]*\-p\([0-9][0-9]*\).*/\1/g'` + # if there isn't any patch number, default to 0 + if test "$patch" = "$1"; then + patch=0 + fi + fi + echo $patch +} + +# $1: version to check +# $2: minimum version + +compare_to_minimum_version () +{ + MAJOR1=`get_major_version $1` + MAJOR2=`get_major_version $2` + if test $MAJOR1 -lt $MAJOR2; then + echo 0 + return + else + if test $MAJOR1 -gt $MAJOR2; then + echo 1 + return + fi + fi + + MINOR1=`get_minor_version $1` + MINOR2=`get_minor_version $2` + if test $MINOR1 -lt $MINOR2; then + echo 0 + return + else + if test $MINOR1 -gt $MINOR2; then + echo 1 + return + fi + fi + + PATCH1=`get_patch_version $1` + PATCH2=`get_patch_version $2` + if test $PATCH1 -lt $PATCH2; then + echo 0 + else + echo 1 + fi +} + +# check the version of a given tool against a minimum version number +# +# $1: tool path +# $2: tool usual name (e.g. `aclocal') +# $3: tool variable (e.g. `ACLOCAL') +# $4: minimum version to check against +# $5: option field index used to extract the tool version from the +# output of --version + +check_tool_version () +{ + field=$5 + if test "$field"x = x; then + field=4 # default to 4 for all GNU autotools + fi + version=`$1 --version | head -1 | cut -d ' ' -f $field` + version_check=`compare_to_minimum_version $version $4` + if test "$version_check"x = 0x; then + echo "ERROR: Your version of the \`$2' tool is too old." + echo " Minimum version $4 is required (yours is version $version)." + echo " Please upgrade or use the $3 variable to point to a more recent one." + echo "" + exit 1 + fi +} + +if test ! -f ./builds/unix/configure.raw; then + echo "You must be in the same directory as \`autogen.sh'." + echo "Bootstrapping doesn't work if srcdir != builddir." + exit 1 +fi + +# On MacOS X, the GNU libtool is named `glibtool'. +HOSTOS=`uname` +LIBTOOLIZE=libtoolize +if test "$HOSTOS"x = Darwinx; then + LIBTOOLIZE=glibtoolize +fi + +if test "$ACLOCAL"x = x; then + ACLOCAL=aclocal +fi + +if test "$AUTOCONF"x = x; then + AUTOCONF=autoconf +fi + +check_tool_version $ACLOCAL aclocal ACLOCAL 1.10.1 +check_tool_version $LIBTOOLIZE libtoolize LIBTOOLIZE 2.2.4 +check_tool_version $AUTOCONF autoconf AUTOCONF 2.62 + +# This sets freetype_major, freetype_minor, and freetype_patch. +eval `sed -nf version.sed include/freetype/freetype.h` + +# We set freetype-patch to an empty value if it is zero. +if test "$freetype_patch" = ".0"; then + freetype_patch= +fi + +cd builds/unix + +echo "generating \`configure.ac'" +sed -e "s;@VERSION@;$freetype_major$freetype_minor$freetype_patch;" \ + < configure.raw > configure.ac + +run aclocal -I . --force +run $LIBTOOLIZE --force --copy --install +run autoconf --force + +chmod +x mkinstalldirs +chmod +x install-sh + +cd ../.. + +chmod +x ./configure + +# EOF diff --git a/src/3rdparty/freetype/builds/amiga/README b/src/3rdparty/freetype/builds/amiga/README new file mode 100644 index 0000000000..2b8f8e87db --- /dev/null +++ b/src/3rdparty/freetype/builds/amiga/README @@ -0,0 +1,110 @@ + +README for the builds/amiga subdirectory. + +Copyright 2005 by +Werner Lemberg and Detlef Würkner. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +The makefile.os4 is for the AmigaOS4 SDK. To use it, type +"make -f makefile.os4", it produces a link library libft2_ppc.a. + +The makefile is for ppc-morphos-gcc-2.95.3-bin.tgz (gcc 2.95.3 hosted on +68k-Amiga producing MorphOS-PPC-binaries from http://www.morphos.de). +To use it, type "make assign", then "make"; it produces a link library +libft2_ppc.a. + +The smakefile is a makefile for Amiga SAS/C 6.58 (no longer available, +latest sold version was 6.50, updates can be found in Aminet). It is +based on the version found in the sourcecode of ttf.library 0.83b for +FreeType 1.3.1 from Richard Griffith (ragriffi@sprynet.com, +http://ragriffi.home.sprynet.com). + +You will also need the latest include files and amiga.lib from the +Amiga web site (http://www.amiga.com/3.9/download/NDK3.9.lha) for +AmigaOS 3.9; the generated code should work under AmigaOS 2.04 and up. + +To use it, call "smake assign" and then "smake" from the builds/amiga +directory. The results are: + +- A link library "ft2_680x0.lib" (where x depends on the setting of + the CPU entry in the smakefile) containing all FreeType2 parts + except of the init code, debugging code, and the system interface + code. + +- ftsystem.o, an object module containing the standard version of the + system interface code which uses fopen() fclose() fread() fseek() + ftell() malloc() realloc() and free() from lib:sc.lib (not pure). + +- ftsystempure.o, an object module containing the pure version of the + system interface code which uses Open() Close() Read() Seek() + ExamineFH() AsmAllocPooled() AsmFreePooled() etc. This version can + be used in both normal programs and in Amiga run-time shared system + librarys (can be linked with lib:libinit.o, no copying of DATA and + BSS hunks for each OpenLibrary() necessary). Source code is in + src/base/ftsystem.c. + +- ftdebug.o, an object module containing the standard version of the + debugging code which uses vprintf() and exit() (not pure). + Debugging can be turned on in FT:include/freetype/config/ftoption.h + and with FT_SetTraceLevel(). + +- ftdebugpure.o, an object module containing the pure version of the + debugging code which uses KVPrintf() from lib:debug.lib and no + exit(). For debugging of Amiga run-time shared system libraries. + Source code is in src/base/ftdebug.c. + +- NO ftinit.o. Because linking with a link library should result in + linking only the needed object modules in it, but standard + ftsystem.o would force ALL FreeType2 modules to be linked to your + program, I decided to use a different scheme: You must #include + FT:src/base/ftinit.c in your sourcecode and specify with #define + statements which modules you need. See + include/freetype/config/ftmodule.h. + + +To use in your own programs: + +- Insert the #define and #include statements from top of + include/freetype/config/ftmodule.h in your source code and uncomment + the #define statements for the FreeType2 modules you need. + +- You can use either PARAMETERS=REGISTER or PARAMETERS=STACK for + calling the FreeType2 functions, because the link library and the + object files are compiled with PARAMETERS=BOTH. + +- "smake assign" (assign "FT:" to the FreeType2 main directory). + +- Compile your program. + +- Link with either ftsystem.o or ftsystempure.o, if debugging enabled + with either ftdebug.o or (ftdebugpure.o and lib:debug.lib), and with + ft2_680x0.lib as link library. + + +To adapt to other compilers: + +- The standard ANSI C maximum length of 31 significant characters in + identifiers is not enough for FreeType2. Check if your compiler has + a minimum length of 40 significant characters or can be switched to + it. "idlen=40" is the option for SAS/C. Setting #define + HAVE_LIMIT_ON_IDENTS in an include file may also work (not tested). + +- Make sure that the include directory in builds/amiga is searched + before the normal FreeType2 include directory, so you are able to + replace problematic include files with your own version (same may be + useful for the src directory). + +- An example of how to replace/workaround a problematic include file + is include/config/ftconfig.h; it changes a #define that would + prevent SAS/C from generating XDEF's where it should do that and + then includes the standard FreeType2 include file. + +Local Variables: +coding: latin-1 +End: diff --git a/src/3rdparty/freetype/builds/amiga/include/freetype/config/ftconfig.h b/src/3rdparty/freetype/builds/amiga/include/freetype/config/ftconfig.h new file mode 100644 index 0000000000..c2c2ac8dbb --- /dev/null +++ b/src/3rdparty/freetype/builds/amiga/include/freetype/config/ftconfig.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* Amiga-specific configuration file (specification only). */ +/* */ +/* Copyright 2005, 2006, 2007 by */ +/* Werner Lemberg and Detlef Würkner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/* + * This is an example how to override the default FreeType2 header files + * with Amiga-specific changes. When the compiler searches this directory + * before the default directory, we can do some modifications. + * + * Here we must change FT_EXPORT_DEF so that SAS/C does + * generate the needed XDEFs. + */ + +#if 0 +#define FT_EXPORT_DEF( x ) extern x +#endif + +#undef FT_EXPORT_DEF +#define FT_EXPORT_DEF( x ) x + +/* Now include the original file */ +#ifndef __MORPHOS__ +#ifdef __SASC +#include "FT:include/freetype/config/ftconfig.h" +#else +#include "/FT/include/freetype/config/ftconfig.h" +#endif +#else +/* We must define that, it seems that + * lib/gcc-lib/ppc-morphos/2.95.3/include/syslimits.h is missing in + * ppc-morphos-gcc-2.95.3-bin.tgz (gcc for 68k producing MorphOS PPC elf + * binaries from http://www.morphos.de) + */ +#define _LIBC_LIMITS_H_ +#include "/FT/include/freetype/config/ftconfig.h" +#endif + +/* +Local Variables: +coding: latin-1 +End: +*/ diff --git a/src/3rdparty/freetype/builds/amiga/include/freetype/config/ftmodule.h b/src/3rdparty/freetype/builds/amiga/include/freetype/config/ftmodule.h new file mode 100644 index 0000000000..5873bab74f --- /dev/null +++ b/src/3rdparty/freetype/builds/amiga/include/freetype/config/ftmodule.h @@ -0,0 +1,160 @@ +/***************************************************************************/ +/* */ +/* ftmodule.h */ +/* */ +/* Amiga-specific FreeType module selection. */ +/* */ +/* Copyright 2005 by */ +/* Werner Lemberg and Detlef Würkner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/* + * To avoid that all your programs include all FreeType modules, + * you copy the following piece of source code into your own + * source file and specify which modules you really need in your + * application by uncommenting the appropriate lines. + */ +/* +//#define FT_USE_AUTOFIT // autofitter +//#define FT_USE_RASTER // monochrome rasterizer +//#define FT_USE_SMOOTH // anti-aliasing rasterizer +//#define FT_USE_TT // truetype font driver +//#define FT_USE_T1 // type1 font driver +//#define FT_USE_T42 // type42 font driver +//#define FT_USE_T1CID // cid-keyed type1 font driver // no cmap support +//#define FT_USE_CFF // opentype font driver +//#define FT_USE_BDF // bdf bitmap font driver +//#define FT_USE_PCF // pcf bitmap font driver +//#define FT_USE_PFR // pfr font driver +//#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver +//#define FT_USE_OTV // opentype validator +//#define FT_USE_GXV // truetype gx validator +#include "FT:src/base/ftinit.c" +*/ + +/* Make sure that the needed support modules are built in. + * Dependencies can be found by searching for FT_Get_Module. + */ + +#ifdef FT_USE_T42 +#define FT_USE_TT +#endif + +#ifdef FT_USE_TT +#define FT_USE_SFNT +#endif + +#ifdef FT_USE_CFF +#define FT_USE_SFNT +#define FT_USE_PSHINT +#define FT_USE_PSNAMES +#endif + +#ifdef FT_USE_T1 +#define FT_USE_PSAUX +#define FT_USE_PSHINT +#define FT_USE_PSNAMES +#endif + +#ifdef FT_USE_T1CID +#define FT_USE_PSAUX +#define FT_USE_PSHINT +#define FT_USE_PSNAMES +#endif + +#ifdef FT_USE_PSAUX +#define FT_USE_PSNAMES +#endif + +#ifdef FT_USE_SFNT +#define FT_USE_PSNAMES +#endif + +/* Now include the modules */ + +#ifdef FT_USE_AUTOFIT +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +#endif + +#ifdef FT_USE_TT +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +#endif + +#ifdef FT_USE_T1 +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +#endif + +#ifdef FT_USE_CFF +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +#endif + +#ifdef FT_USE_T1CID +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +#endif + +#ifdef FT_USE_PFR +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +#endif + +#ifdef FT_USE_T42 +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +#endif + +#ifdef FT_USE_WINFNT +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +#endif + +#ifdef FT_USE_PCF +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +#endif + +#ifdef FT_USE_PSAUX +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +#endif + +#ifdef FT_USE_PSNAMES +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +#endif + +#ifdef FT_USE_PSHINT +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +#endif + +#ifdef FT_USE_RASTER +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +#endif + +#ifdef FT_USE_SFNT +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +#endif + +#ifdef FT_USE_SMOOTH +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) +#endif + +#ifdef FT_USE_OTV +FT_USE_MODULE( FT_Module_Class, otv_module_class ) +#endif + +#ifdef FT_USE_BDF +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) +#endif + +#ifdef FT_USE_GXV +FT_USE_MODULE( FT_Module_Class, gxv_module_class ) +#endif + +/* +Local Variables: +coding: latin-1 +End: +*/ diff --git a/src/3rdparty/freetype/builds/amiga/makefile b/src/3rdparty/freetype/builds/amiga/makefile new file mode 100644 index 0000000000..e874a1f292 --- /dev/null +++ b/src/3rdparty/freetype/builds/amiga/makefile @@ -0,0 +1,294 @@ +# +# Makefile for FreeType2 link library using ppc-morphos-gcc-2.95.3-bin.tgz +# (gcc 2.95.3 hosted on 68k-Amiga producing MorphOS-PPC-binaries from +# http://www.morphos.de) +# + + +# Copyright 2005, 2006, 2007, 2009 by +# Werner Lemberg and Detlef Würkner. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# +# to build from the builds/amiga directory call +# +# make assign +# make +# +# Your programs source code should start with this +# (uncomment the parts you do not need to keep the program small): +# ---8<--- +#define FT_USE_AUTOFIT // autofitter +#define FT_USE_RASTER // monochrome rasterizer +#define FT_USE_SMOOTH // anti-aliasing rasterizer +#define FT_USE_TT // truetype font driver +#define FT_USE_T1 // type1 font driver +#define FT_USE_T42 // type42 font driver +#define FT_USE_T1CID // cid-keyed type1 font driver +#define FT_USE_CFF // opentype font driver +#define FT_USE_BDF // bdf bitmap font driver +#define FT_USE_PCF // pcf bitmap font driver +#define FT_USE_PFR // pfr font driver +#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver +#define FT_USE_OTV // opentype validator +#define FT_USE_GXV // truetype gx validator +#include "FT:src/base/ftinit.c" +# ---8<--- +# +# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o +# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or +# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). + +all: libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o + +assign: + assign FT: // + +FTSRC = /FT/src + +CC = ppc-morphos-gcc +AR = ppc-morphos-ar rc +RANLIB = ppc-morphos-ranlib +LD = ppc-morphos-ld +CFLAGS = -DFT2_BUILD_LIBRARY -O2 -I/emu/emulinclude/includegcc -I/emu/include -Iinclude -I$(FTSRC) -I/FT/include + +# +# FreeType2 library base +# +ftbase.ppc.o: $(FTSRC)/base/ftbase.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftinit.ppc.o: $(FTSRC)/base/ftinit.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftsystem.ppc.o: $(FTSRC)/base/ftsystem.c + $(CC) -c $(CFLAGS) -o $@ $< + +# pure version for use in run-time library etc +ftsystempure.ppc.o: src/base/ftsystem.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftdebug.ppc.o: $(FTSRC)/base/ftdebug.c + $(CC) -c $(CFLAGS) -o $@ $< + +# pure version for use in run-time library etc +ftdebugpure.ppc.o: src/base/ftdebug.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library base extensions +# +ftbbox.ppc.o: $(FTSRC)/base/ftbbox.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftbdf.ppc.o: $(FTSRC)/base/ftbdf.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftbitmap.ppc.o: $(FTSRC)/base/ftbitmap.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftcid.ppc.o: $(FTSRC)/base/ftcid.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftfstype.ppc.o: $(FTSRC)/base/ftfstype.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftgasp.ppc.o: $(FTSRC)/base/ftgasp.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftglyph.ppc.o: $(FTSRC)/base/ftglyph.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftgxval.ppc.o: $(FTSRC)/base/ftgxval.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftlcdfil.ppc.o: $(FTSRC)/base/ftlcdfil.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftmm.ppc.o: $(FTSRC)/base/ftmm.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftotval.ppc.o: $(FTSRC)/base/ftotval.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftpatent.ppc.o: $(FTSRC)/base/ftpatent.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftpfr.ppc.o: $(FTSRC)/base/ftpfr.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftstroke.ppc.o: $(FTSRC)/base/ftstroke.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftsynth.ppc.o: $(FTSRC)/base/ftsynth.c + $(CC) -c $(CFLAGS) -o $@ $< + +fttype1.ppc.o: $(FTSRC)/base/fttype1.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftwinfnt.ppc.o: $(FTSRC)/base/ftwinfnt.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftxf86.ppc.o: $(FTSRC)/base/ftxf86.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library autofitting module +# +autofit.ppc.o: $(FTSRC)/autofit/autofit.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library postscript hinting module +# +pshinter.ppc.o: $(FTSRC)/pshinter/pshinter.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library PS support module +# +psaux.ppc.o: $(FTSRC)/psaux/psaux.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library PS glyph names module +# +psnames.ppc.o: $(FTSRC)/psnames/psnames.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library monochrome raster module +# +raster.ppc.o: $(FTSRC)/raster/raster.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library anti-aliasing raster module +# +smooth.ppc.o: $(FTSRC)/smooth/smooth.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library 'sfnt' module +# +sfnt.ppc.o: $(FTSRC)/sfnt/sfnt.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library glyph and image caching system +# +ftcache.ppc.o: $(FTSRC)/cache/ftcache.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library OpenType font driver +# +cff.ppc.o: $(FTSRC)/cff/cff.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library TrueType font driver +# +truetype.ppc.o: $(FTSRC)/truetype/truetype.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library Type1 font driver +# +type1.ppc.o: $(FTSRC)/type1/type1.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library Type42 font driver +# +type42.ppc.o: $(FTSRC)/type42/type42.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library CID-keyed Type1 font driver +# +type1cid.ppc.o: $(FTSRC)/cid/type1cid.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library BDF bitmap font driver +# +bdf.ppc.o: $(FTSRC)/bdf/bdf.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library PCF bitmap font driver +# +pcf.ppc.o: $(FTSRC)/pcf/pcf.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library gzip support for compressed PCF bitmap fonts +# +gzip.ppc.o: $(FTSRC)/gzip/ftgzip.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library compress support for compressed PCF bitmap fonts +# +lzw.ppc.o: $(FTSRC)/lzw/ftlzw.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library PFR font driver +# +pfr.ppc.o: $(FTSRC)/pfr/pfr.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library Windows FNT/FON bitmap font driver +# +winfnt.ppc.o: $(FTSRC)/winfonts/winfnt.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library TrueTypeGX Validator +# +gxvalid.ppc.o: $(FTSRC)/gxvalid/gxvalid.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library OpenType validator +# +otvalid.ppc.o: $(FTSRC)/otvalid/otvalid.c + $(CC) -c $(CFLAGS) -o $@ $< + +BASEPPC = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o \ + ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o ftgxval.ppc.o \ + ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o ftpatent.ppc.o ftpfr.ppc.o \ + ftstroke.ppc.o ftsynth.ppc.o fttype1.ppc.o ftwinfnt.ppc.o \ + ftxf86.ppc.o + +DEBUGPPC = ftdebug.ppc.o ftdebugpure.ppc.o + +AFITPPC = autofit.ppc.o + +GXVPPC = gxvalid.ppc.o + +OTVPPC = otvalid.ppc.o + +PSPPC = psaux.ppc.o psnames.ppc.o pshinter.ppc.o + +RASTERPPC = raster.ppc.o smooth.ppc.o + +FONTDPPC = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\ + bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o + +libft2_ppc.a: $(BASEPPC) $(AFITPPC) $(GXVPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o lzw.ppc.o + $(AR) $@ $(BASEPPC) $(AFITPPC) $(GXVPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o lzw.ppc.o + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +#Local Variables: +#coding: latin-1 +#End: diff --git a/src/3rdparty/freetype/builds/amiga/makefile.os4 b/src/3rdparty/freetype/builds/amiga/makefile.os4 new file mode 100644 index 0000000000..edd88eba94 --- /dev/null +++ b/src/3rdparty/freetype/builds/amiga/makefile.os4 @@ -0,0 +1,297 @@ +# +# Makefile for FreeType2 link library using gcc 4.0.3 from the +# AmigaOS4 SDK +# + + +# Copyright 2005, 2006, 2007, 2009 by +# Werner Lemberg and Detlef Würkner. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# to build from the builds/amiga directory call +# +# make -f makefile.os4 +# +# Your programs source code should start with this +# (uncomment the parts you do not need to keep the program small): +# ---8<--- +#define FT_USE_AUTOFIT // autofitter +#define FT_USE_RASTER // monochrome rasterizer +#define FT_USE_SMOOTH // anti-aliasing rasterizer +#define FT_USE_TT // truetype font driver +#define FT_USE_T1 // type1 font driver +#define FT_USE_T42 // type42 font driver +#define FT_USE_T1CID // cid-keyed type1 font driver +#define FT_USE_CFF // opentype font driver +#define FT_USE_BDF // bdf bitmap font driver +#define FT_USE_PCF // pcf bitmap font driver +#define FT_USE_PFR // pfr font driver +#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver +#define FT_USE_OTV // opentype validator +#define FT_USE_GXV // truetype gx validator +#include "FT:src/base/ftinit.c" +# ---8<--- +# +# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o +# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or +# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). + +all: assign libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o + +assign: + assign FT: // + +CC = ppc-amigaos-gcc +AR = ppc-amigaos-ar +RANLIB = ppc-amigaos-ranlib + +DIRFLAGS = -Iinclude -I/FT/src -I/FT/include -I/SDK/include + +WARNINGS = -Wall -W -Wundef -Wpointer-arith -Wbad-function-cast \ + -Waggregate-return -Wwrite-strings -Wshadow + +OPTIONS = -DFT2_BUILD_LIBRARY -DNDEBUG -fno-builtin +OPTIMIZE = -O2 -fomit-frame-pointer -fstrength-reduce -finline-functions + +CFLAGS = -mcrt=clib2 $(DIRFLAGS) $(WARNINGS) $(FT2FLAGS) $(OPTIONS) $(OPTIMIZE) + +# +# FreeType2 library base +# +ftbase.ppc.o: FT:src/base/ftbase.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbase.c + +ftinit.ppc.o: FT:src/base/ftinit.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftinit.c + +ftsystem.ppc.o: FT:src/base/ftsystem.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsystem.c + +# pure version for use in run-time library etc +ftsystempure.ppc.o: src/base/ftsystem.c + $(CC) -c $(CFLAGS) -o $@ src/base/ftsystem.c + +# +# FreeType2 library base extensions +# +ftbbox.ppc.o: FT:src/base/ftbbox.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbbox.c + +ftbdf.ppc.o: FT:src/base/ftbdf.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbdf.c + +ftbitmap.ppc.o: FT:src/base/ftbitmap.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbitmap.c + +ftcid.ppc.o: FT:src/base/ftcid.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftcid.c + +ftdebug.ppc.o: FT:src/base/ftdebug.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftdebug.c + +# pure version for use in run-time library etc +ftdebugpure.ppc.o: src/base/ftdebug.c + $(CC) -c $(CFLAGS) -o $@ src/base/ftdebug.c + +ftfstype.ppc.o: FT:src/base/ftfstype.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftfstype.c + +ftgasp.ppc.o: FT:src/base/ftgasp.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgasp.c + +ftglyph.ppc.o: FT:src/base/ftglyph.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftglyph.c + +ftgxval.ppc.o: FT:src/base/ftgxval.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgxval.c + +ftlcdfil.ppc.o: FT:src/base/ftlcdfil.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftlcdfil.c + +ftmm.ppc.o: FT:src/base/ftmm.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftmm.c + +ftotval.ppc.o: FT:src/base/ftotval.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftotval.c + +ftpatent.ppc.o: FT:src/base/ftpatent.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftpatent.c + +ftpfr.ppc.o: FT:src/base/ftpfr.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftpfr.c + +ftstroke.ppc.o: FT:src/base/ftstroke.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftstroke.c + +ftsynth.ppc.o: FT:src/base/ftsynth.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsynth.c + +fttype1.ppc.o: FT:src/base/fttype1.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/fttype1.c + +ftwinfnt.ppc.o: FT:src/base/ftwinfnt.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftwinfnt.c + +ftxf86.ppc.o: FT:src/base/ftxf86.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftxf86.c + +# +# FreeType2 library autofitting module +# +autofit.ppc.o: FT:src/autofit/autofit.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/autofit/autofit.c + +# +# FreeType2 library postscript hinting module +# +pshinter.ppc.o: FT:src/pshinter/pshinter.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/pshinter/pshinter.c + +# +# FreeType2 library PS support module +# +psaux.ppc.o: FT:src/psaux/psaux.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/psaux/psaux.c + +# +# FreeType2 library PS glyph names module +# +psnames.ppc.o: FT:src/psnames/psnames.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/psnames/psnames.c + +# +# FreeType2 library monochrome raster module +# +raster.ppc.o: FT:src/raster/raster.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/raster/raster.c + +# +# FreeType2 library anti-aliasing raster module +# +smooth.ppc.o: FT:src/smooth/smooth.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/smooth/smooth.c + +# +# FreeType2 library 'sfnt' module +# +sfnt.ppc.o: FT:src/sfnt/sfnt.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/sfnt/sfnt.c + +# +# FreeType2 library glyph and image caching system +# +ftcache.ppc.o: FT:src/cache/ftcache.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/cache/ftcache.c + +# +# FreeType2 library OpenType font driver +# +cff.ppc.o: FT:src/cff/cff.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/cff/cff.c + +# +# FreeType2 library TrueType font driver +# +truetype.ppc.o: FT:src/truetype/truetype.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/truetype/truetype.c + +# +# FreeType2 library Type1 font driver +# +type1.ppc.o: FT:src/type1/type1.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/type1/type1.c + +# +# FreeType2 library Type42 font driver +# +type42.ppc.o: FT:src/type42/type42.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/type42/type42.c + +# +# FreeType2 library CID-keyed Type1 font driver +# +type1cid.ppc.o: FT:src/cid/type1cid.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/cid/type1cid.c + +# +# FreeType2 library BDF bitmap font driver +# +bdf.ppc.o: FT:src/bdf/bdf.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/bdf/bdf.c + +# +# FreeType2 library PCF bitmap font driver +# +pcf.ppc.o: FT:src/pcf/pcf.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/pcf/pcf.c + +# +# FreeType2 library gzip support for compressed PCF bitmap fonts +# +gzip.ppc.o: FT:src/gzip/ftgzip.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/gzip/ftgzip.c + +# +# FreeType2 library compress support for compressed PCF bitmap fonts +# +lzw.ppc.o: FT:src/lzw/ftlzw.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/lzw/ftlzw.c + +# +# FreeType2 library PFR font driver +# +pfr.ppc.o: FT:src/pfr/pfr.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/pfr/pfr.c + +# +# FreeType2 library Windows FNT/FON bitmap font driver +# +winfnt.ppc.o: FT:src/winfonts/winfnt.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/winfonts/winfnt.c + +# +# FreeType2 library TrueTypeGX Validator +# +gxvalid.ppc.o: FT:src/gxvalid/gxvalid.c + $(CC) -c $(CFLAGS) -Wno-aggregate-return -o $@ /FT/src/gxvalid/gxvalid.c + +# +# FreeType2 library OpenType validator +# +otvalid.ppc.o: FT:src/otvalid/otvalid.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/otvalid/otvalid.c + +BASE = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o \ + ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o ftgxval.ppc.o \ + ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o ftpatent.ppc.o ftpfr.ppc.o \ + ftstroke.ppc.o ftsynth.ppc.o fttype1.ppc.o ftwinfnt.ppc.o \ + ftxf86.ppc.o + +DEBUG = ftdebug.ppc.o ftdebugpure.ppc.o + +AFIT = autofit.ppc.o + +GXV = gxvalid.ppc.o + +OTV = otvalid.ppc.o + +PS = psaux.ppc.o psnames.ppc.o pshinter.ppc.o + +RASTER = raster.ppc.o smooth.ppc.o + +FONTD = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\ + bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o + +libft2_ppc.a: $(BASE) $(AFIT) $(GXV) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o + $(AR) r $@ $(BASE) $(AFIT) $(GXV) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o + $(RANLIB) $@ + +#Local Variables: +#coding: latin-1 +#End: diff --git a/src/3rdparty/freetype/builds/amiga/smakefile b/src/3rdparty/freetype/builds/amiga/smakefile new file mode 100644 index 0000000000..2a561a8828 --- /dev/null +++ b/src/3rdparty/freetype/builds/amiga/smakefile @@ -0,0 +1,297 @@ +# +# Makefile for FreeType2 link library using Amiga SAS/C 6.58 +# + + +# Copyright 2005,2006, 2007, 2009 by +# Werner Lemberg and Detlef Würkner. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# to build from the builds/amiga directory call +# +# smake assign +# smake +# +# Your programs source code should start with this +# (uncomment the parts you do not need to keep the program small): +# ---8<--- +#define FT_USE_AUTOFIT // autofitter +#define FT_USE_RASTER // monochrome rasterizer +#define FT_USE_SMOOTH // anti-aliasing rasterizer +#define FT_USE_TT // truetype font driver +#define FT_USE_T1 // type1 font driver +#define FT_USE_T42 // type42 font driver +#define FT_USE_T1CID // cid-keyed type1 font driver +#define FT_USE_CFF // opentype font driver +#define FT_USE_BDF // bdf bitmap font driver +#define FT_USE_PCF // pcf bitmap font driver +#define FT_USE_PFR // pfr font driver +#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver +#define FT_USE_OTV // opentype validator +#define FT_USE_GXV // truetype gx validator +#include "FT:src/base/ftinit.c" +# ---8<--- +# +# link your programs with ft2_680x0.lib and either ftsystem.o or ftsystempure.o +# (and either ftdebug.o or ftdebugpure.o if you enabled FT_DEBUG_LEVEL_ERROR or +# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). + +OBJBASE = ftbase.o ftbbox.o ftbdf.o ftbitmap.o ftcid.o ftfstype.o ftgasp.o \ + ftglyph.o ftgxval.o ftlcdfil.o ftmm.o ftotval.o ftpatent.o ftpfr.o \ + ftstroke.o ftsynth.o fttype1.o ftwinfnt.o ftxf86.o + +OBJSYSTEM = ftsystem.o ftsystempure.o + +OBJDEBUG = ftdebug.o ftdebugpure.o + +OBJAFIT = autofit.o + +OBJGXV = gxvalid.o + +OBJOTV = otvalid.o + +OBJPS = psaux.o psnames.o pshinter.o + +OBJRASTER = raster.o smooth.o + +OBJSFNT = sfnt.o + +OBJCACHE = ftcache.o + +OBJFONTD = cff.o type1.o type42.o type1cid.o\ + truetype.o winfnt.o bdf.o pcf.o pfr.o + +CORE = FT:src/ + +CPU = 68000 +#CPU = 68020 +#CPU = 68030 +#CPU = 68040 +#CPU = 68060 + +OPTIMIZER = optinlocal + +SCFLAGS = optimize opttime optsched strmerge data=faronly idlen=50 cpu=$(CPU)\ + idir=include/ idir=$(CORE) idir=FT:include/ nostackcheck nochkabort\ + noicons ignore=79,85,110,306 parameters=both define=FT2_BUILD_LIBRARY + +LIB = ft2_$(CPU).lib + +# sample linker options +OPTS = link lib=$(LIB),lib:sc.lib,lib:amiga.lib,lib:debug.lib\ + smallcode smalldata noicons utillib + +# sample program entry +#myprog: myprog.c ftsystem.o $(LIB) +# sc $< programname=$@ ftsystem.o $(SCFLAGS) $(OPTS) + +all: $(LIB) $(OBJSYSTEM) $(OBJDEBUG) + +assign: + assign FT: // + +# uses separate object modules in lib to make for easier debugging +# also, can make smaller programs if entire engine is not used +ft2_$(CPU).lib: $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o gzip.o + oml $@ r $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o gzip.o + +clean: + -delete \#?.o + +realclean: clean + -delete ft2$(CPU).lib + +# +# freetype library base +# +ftbase.o: $(CORE)base/ftbase.c + sc $(SCFLAGS) objname=$@ $< +ftinit.o: $(CORE)base/ftinit.c + sc $(SCFLAGS) objname=$@ $< +ftsystem.o: $(CORE)base/ftsystem.c + sc $(SCFLAGS) objname=$@ $< +ftsystempure.o: src/base/ftsystem.c ## pure version for use in run-time library etc + sc $(SCFLAGS) objname=$@ $< +ftdebug.o: $(CORE)base/ftdebug.c + sc $(SCFLAGS) objname=$@ $< +ftdebugpure.o: src/base/ftdebug.c ## pure version for use in run-time library etc + sc $(SCFLAGS) objname=$@ $< +# +# freetype library base extensions +# +ftbbox.o: $(CORE)base/ftbbox.c + sc $(SCFLAGS) objname=$@ $< +ftbdf.o: $(CORE)base/ftbdf.c + sc $(SCFLAGS) objname=$@ $< +ftbitmap.o: $(CORE)base/ftbitmap.c + sc $(SCFLAGS) objname=$@ $< +ftcid.o: $(CORE)base/ftcid.c + sc $(SCFLAGS) objname=$@ $< +ftfstype.o: $(CORE)base/ftfstype.c + sc $(SCFLAGS) objname=$@ $< +ftgasp.o: $(CORE)base/ftgasp.c + sc $(SCFLAGS) objname=$@ $< +ftglyph.o: $(CORE)base/ftglyph.c + sc $(SCFLAGS) objname=$@ $< +ftgxval.o: $(CORE)base/ftgxval.c + sc $(SCFLAGS) objname=$@ $< +ftlcdfil.o: $(CORE)base/ftlcdfil.c + sc $(SCFLAGS) objname=$@ $< +ftmm.o: $(CORE)base/ftmm.c + sc $(SCFLAGS) objname=$@ $< +ftotval.o: $(CORE)base/ftotval.c + sc $(SCFLAGS) objname=$@ $< +ftpatent.o: $(CORE)base/ftpatent.c + sc $(SCFLAGS) objname=$@ $< +ftpfr.o: $(CORE)base/ftpfr.c + sc $(SCFLAGS) objname=$@ $< +ftstroke.o: $(CORE)base/ftstroke.c + sc $(SCFLAGS) objname=$@ $< +ftsynth.o: $(CORE)base/ftsynth.c + sc $(SCFLAGS) objname=$@ $< +fttype1.o: $(CORE)base/fttype1.c + sc $(SCFLAGS) objname=$@ $< +ftwinfnt.o: $(CORE)base/ftwinfnt.c + sc $(SCFLAGS) objname=$@ $< +ftxf86.o: $(CORE)base/ftxf86.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library autofitter module +# +autofit.o: $(CORE)autofit/autofit.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library PS hinting module +# +pshinter.o: $(CORE)pshinter/pshinter.c + sc $(SCFLAGS) objname=$@ $< +# +# freetype library PS support module +# +psaux.o: $(CORE)psaux/psaux.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library PS glyph names module +# +psnames.o: $(CORE)psnames/psnames.c + sc $(SCFLAGS) code=far objname=$@ $< + +# +# freetype library monochrome raster module +# +raster.o: $(CORE)raster/raster.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library anti-aliasing raster module +# +smooth.o: $(CORE)smooth/smooth.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library 'sfnt' module +# +sfnt.o: $(CORE)sfnt/sfnt.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library glyph and image caching system (still experimental) +# +ftcache.o: $(CORE)cache/ftcache.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library OpenType font driver +# +cff.o: $(CORE)cff/cff.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library TrueType font driver +# +truetype.o: $(CORE)truetype/truetype.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library Type1 font driver +# +type1.o: $(CORE)type1/type1.c + sc $(SCFLAGS) objname=$@ $< + +# +# FreeType2 library Type42 font driver +# +type42.o: $(CORE)type42/type42.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library CID-keyed Type1 font driver +# +type1cid.o: $(CORE)cid/type1cid.c + sc $(SCFLAGS) objname=$@ $< +# +# freetype library CID-keyed Type1 font driver extensions +# +#cidafm.o: $(CORE)cid/cidafm.c +# sc $(SCFLAGS) objname=$@ $< + +# +# freetype library BDF bitmap font driver +# +bdf.o: $(CORE)bdf/bdf.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library PCF bitmap font driver +# +pcf.o: $(CORE)pcf/pcf.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library gzip support for compressed PCF bitmap fonts +# +gzip.o: $(CORE)gzip/ftgzip.c + sc $(SCFLAGS) define FAR objname=$@ $< + +# +# freetype library compress support for compressed PCF bitmap fonts +# +lzw.o: $(CORE)lzw/ftlzw.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library PFR font driver +# +pfr.o: $(CORE)pfr/pfr.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library Windows FNT/FON bitmap font driver +# +winfnt.o: $(CORE)winfonts/winfnt.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library TrueTypeGX validator +# +gxvalid.o: $(CORE)gxvalid/gxvalid.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library OpenType validator +# +otvalid.o: $(CORE)otvalid/otvalid.c + sc $(SCFLAGS) objname=$@ $< + +#Local Variables: +#coding: latin-1 +#End: diff --git a/src/3rdparty/freetype/builds/amiga/src/base/ftdebug.c b/src/3rdparty/freetype/builds/amiga/src/base/ftdebug.c new file mode 100644 index 0000000000..5284e697ae --- /dev/null +++ b/src/3rdparty/freetype/builds/amiga/src/base/ftdebug.c @@ -0,0 +1,279 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +/* + * Based on the default ftdebug.c, + * replaced vprintf() with KVPrintF(), + * commented out exit(), + * replaced getenv() with GetVar(). + */ + +#include +#include +#include +#include +#define __NOLIBBASE__ +#define __NOLOBALIFACE__ +#define __USE_INLINE__ +#include +#include + +#ifndef __amigaos4__ +extern struct Library *DOSBase; +#else +extern struct DOSIFace *IDOS; +#endif + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H + + +#if defined( FT_DEBUG_LEVEL_ERROR ) + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); +/* vprintf( fmt, ap ); */ + KVPrintF( fmt, ap ); + va_end( ap ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); +/* vprintf( fmt, ap ); */ + KVPrintF( fmt, ap ); + va_end( ap ); + +/* exit( EXIT_FAILURE ); */ + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the `FT2_DEBUG' environment variable. It must be a list of */ + /* toggles, separated by spaces, `;', or `,'. Example: */ + /* */ + /* export FT2_DEBUG="any:3 memory:7 stream:5" */ + /* */ + /* This requests that all levels be set to 3, except the trace level for */ + /* the memory and stream components which are set to 7 and 5, */ + /* respectively. */ + /* */ + /* See the file for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 7; 0 means quiet (except for serious */ + /* runtime errors), and 7 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { +/* const char* ft2_debug = getenv( "FT2_DEBUG" ); */ + char buf[256]; + const char* ft2_debug = &buf[0]; + + +/* if ( ft2_debug ) */ + if ( GetVar( "FT2_DEBUG", (STRPTR)ft2_debug, 256, LV_VAR ) > 0 ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + +/* +Local Variables: +coding: latin-1 +End: +*/ +/* END */ diff --git a/src/3rdparty/freetype/builds/amiga/src/base/ftsystem.c b/src/3rdparty/freetype/builds/amiga/src/base/ftsystem.c new file mode 100644 index 0000000000..016f1e29e7 --- /dev/null +++ b/src/3rdparty/freetype/builds/amiga/src/base/ftsystem.c @@ -0,0 +1,522 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* Amiga-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file contains the Amiga interface used by FreeType to access */ + /* low-level, i.e. memory management, i/o access as well as thread */ + /* synchronisation. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Maintained by Detlef Würkner */ + /* */ + /* Based on the original ftsystem.c, */ + /* modified to avoid fopen(), fclose(), fread(), fseek(), ftell(), */ + /* malloc(), realloc(), and free(). */ + /* */ + /* Those C library functions are often not thread-safe or cant be */ + /* used in a shared Amiga library. If that's not a problem for you, */ + /* you can of course use the default ftsystem.c with C library calls */ + /* instead. */ + /* */ + /* This implementation needs exec V39+ because it uses AllocPooled() etc */ + /* */ + /*************************************************************************/ + +#define __NOLIBBASE__ +#define __NOGLOBALIFACE__ +#define __USE_INLINE__ +#include +#include +#include +#ifdef __amigaos4__ +extern struct ExecIFace *IExec; +extern struct DOSIFace *IDOS; +#else +extern struct Library *SysBase; +extern struct Library *DOSBase; +#endif + +#define IOBUF_SIZE 512 + +/* structure that helps us to avoid + * useless calls of Seek() and Read() + */ +struct SysFile +{ + BPTR file; + ULONG iobuf_start; + ULONG iobuf_end; + UBYTE iobuf[IOBUF_SIZE]; +}; + +#ifndef __amigaos4__ +/* C implementation of AllocVecPooled (see autodoc exec/AllocPooled) */ +APTR +Alloc_VecPooled( APTR poolHeader, + ULONG memSize ) +{ + ULONG newSize = memSize + sizeof ( ULONG ); + ULONG *mem = AllocPooled( poolHeader, newSize ); + + if ( !mem ) + return NULL; + *mem = newSize; + return mem + 1; +} + +/* C implementation of FreeVecPooled (see autodoc exec/AllocPooled) */ +void +Free_VecPooled( APTR poolHeader, + APTR memory ) +{ + ULONG *realmem = (ULONG *)memory - 1; + + FreePooled( poolHeader, realmem, *realmem ); +} +#endif + +#include +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* It is not necessary to do any error checking for the */ + /* allocation-related functions. This is done by the higher level */ + /* routines like ft_mem_alloc() or ft_mem_realloc(). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_alloc */ + /* */ + /* */ + /* The memory allocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { +#ifdef __amigaos4__ + return AllocVecPooled( memory->user, size ); +#else + return Alloc_VecPooled( memory->user, size ); +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_realloc */ + /* */ + /* */ + /* The memory reallocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + void* new_block; + +#ifdef __amigaos4__ + new_block = AllocVecPooled ( memory->user, new_size ); +#else + new_block = Alloc_VecPooled ( memory->user, new_size ); +#endif + if ( new_block != NULL ) + { + CopyMem ( block, new_block, + ( new_size > cur_size ) ? cur_size : new_size ); +#ifdef __amigaos4__ + FreeVecPooled ( memory->user, block ); +#else + Free_VecPooled ( memory->user, block ); +#endif + } + return new_block; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_free */ + /* */ + /* */ + /* The memory release function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { +#ifdef __amigaos4__ + FreeVecPooled( memory->user, block ); +#else + Free_VecPooled( memory->user, block ); +#endif + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (struct SysFile *)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* */ + /* ft_amiga_stream_close */ + /* */ + /* */ + /* The function to close a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_amiga_stream_close( FT_Stream stream ) + { + struct SysFile* sysfile; + + sysfile = STREAM_FILE( stream ); + Close ( sysfile->file ); + FreeMem ( sysfile, sizeof ( struct SysFile )); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_amiga_stream_io */ + /* */ + /* */ + /* The function to open a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + /* offset :: The position in the data stream to start reading. */ + /* */ + /* buffer :: The address of buffer to store the read data. */ + /* */ + /* count :: The number of bytes to read from the stream. */ + /* */ + /* */ + /* The number of bytes actually read. */ + /* */ + FT_CALLBACK_DEF( unsigned long ) + ft_amiga_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + struct SysFile* sysfile; + unsigned long read_bytes; + + if ( count != 0 ) + { + sysfile = STREAM_FILE( stream ); + + /* handle the seek */ + if ( (offset < sysfile->iobuf_start) || (offset + count > sysfile->iobuf_end) ) + { + /* requested offset implies we need a buffer refill */ + if ( !sysfile->iobuf_end || offset != sysfile->iobuf_end ) + { + /* a physical seek is necessary */ + Seek( sysfile->file, offset, OFFSET_BEGINNING ); + } + sysfile->iobuf_start = offset; + sysfile->iobuf_end = 0; /* trigger a buffer refill */ + } + + /* handle the read */ + if ( offset + count <= sysfile->iobuf_end ) + { + /* we have buffer and requested bytes are all inside our buffer */ + CopyMem( &sysfile->iobuf[offset - sysfile->iobuf_start], buffer, count ); + read_bytes = count; + } + else + { + /* (re)fill buffer */ + if ( count <= IOBUF_SIZE ) + { + /* requested bytes is a subset of the buffer */ + read_bytes = Read( sysfile->file, sysfile->iobuf, IOBUF_SIZE ); + if ( read_bytes == -1UL ) + { + /* error */ + read_bytes = 0; + } + else + { + sysfile->iobuf_end = offset + read_bytes; + CopyMem( sysfile->iobuf, buffer, count ); + if ( read_bytes > count ) + { + read_bytes = count; + } + } + } + else + { + /* we actually need more than our buffer can hold, so we decide + ** to do a single big read, and then copy the last IOBUF_SIZE + ** bytes of that to our internal buffer for later use */ + read_bytes = Read( sysfile->file, buffer, count ); + if ( read_bytes == -1UL ) + { + /* error */ + read_bytes = 0; + } + else + { + ULONG bufsize; + + bufsize = ( read_bytes > IOBUF_SIZE ) ? IOBUF_SIZE : read_bytes; + sysfile->iobuf_end = offset + read_bytes; + sysfile->iobuf_start = sysfile->iobuf_end - bufsize; + CopyMem( &buffer[read_bytes - bufsize] , sysfile->iobuf, bufsize ); + } + } + } + } + else + { + read_bytes = 0; + } + + return read_bytes; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + struct FileInfoBlock* fib; + struct SysFile* sysfile; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + +#ifdef __amigaos4__ + sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_SHARED ); +#else + sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_PUBLIC ); +#endif + if ( !sysfile ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + sysfile->file = Open( (STRPTR)filepathname, MODE_OLDFILE ); + if ( !sysfile->file ) + { + FreeMem ( sysfile, sizeof ( struct SysFile )); + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + + fib = AllocDosObject( DOS_FIB, NULL ); + if ( !fib ) + { + Close ( sysfile->file ); + FreeMem ( sysfile, sizeof ( struct SysFile )); + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + if ( !( ExamineFH( sysfile->file, fib ) ) ) + { + FreeDosObject( DOS_FIB, fib ); + Close ( sysfile->file ); + FreeMem ( sysfile, sizeof ( struct SysFile )); + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + stream->size = fib->fib_Size; + FreeDosObject( DOS_FIB, fib ); + + stream->descriptor.pointer = (void *)sysfile; + stream->pathname.pointer = (char*)filepathname; + sysfile->iobuf_start = 0; + sysfile->iobuf_end = 0; + stream->pos = 0; + + stream->read = ft_amiga_stream_io; + stream->close = ft_amiga_stream_close; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + +#ifdef __amigaos4__ + memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_SHARED ); +#else + memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_PUBLIC ); +#endif + if ( memory ) + { +#ifdef __amigaos4__ + memory->user = CreatePool( MEMF_SHARED, 16384, 16384 ); +#else + memory->user = CreatePool( MEMF_PUBLIC, 16384, 16384 ); +#endif + if ( memory->user == NULL ) + { + FreeVec( memory ); + memory = NULL; + } + else + { + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + + DeletePool( memory->user ); + FreeVec( memory ); + } + +/* +Local Variables: +coding: latin-1 +End: +*/ +/* END */ diff --git a/src/3rdparty/freetype/builds/ansi/ansi-def.mk b/src/3rdparty/freetype/builds/ansi/ansi-def.mk new file mode 100644 index 0000000000..2c58572951 --- /dev/null +++ b/src/3rdparty/freetype/builds/ansi/ansi-def.mk @@ -0,0 +1,74 @@ +# +# FreeType 2 configuration rules for a `normal' ANSI system +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := rm -f +CAT := cat +SEP := / +BUILD_DIR := $(TOP_DIR)/builds/ansi +PLATFORM := ansi + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := lib$(PROJECT) + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := + + +# EOF diff --git a/src/3rdparty/freetype/builds/ansi/ansi.mk b/src/3rdparty/freetype/builds/ansi/ansi.mk new file mode 100644 index 0000000000..32b3bac3e3 --- /dev/null +++ b/src/3rdparty/freetype/builds/ansi/ansi.mk @@ -0,0 +1,21 @@ +# +# FreeType 2 configuration rules for a `normal' pseudo ANSI compiler/system +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP_DIR)/builds/ansi/ansi-def.mk +include $(TOP_DIR)/builds/compiler/ansi-cc.mk +include $(TOP_DIR)/builds/link_std.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/atari/ATARI.H b/src/3rdparty/freetype/builds/atari/ATARI.H new file mode 100644 index 0000000000..bb6913803c --- /dev/null +++ b/src/3rdparty/freetype/builds/atari/ATARI.H @@ -0,0 +1,16 @@ +#ifndef ATARI_H +#define ATARI_H + +#pragma warn -stu + +/* PureC doesn't like 32bit enumerations */ + +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value +#endif /* FT_IMAGE_TAG */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) value +#endif /* FT_ENC_TAG */ + +#endif /* ATARI_H */ diff --git a/src/3rdparty/freetype/builds/atari/FNames.SIC b/src/3rdparty/freetype/builds/atari/FNames.SIC new file mode 100644 index 0000000000..f3657179d9 --- /dev/null +++ b/src/3rdparty/freetype/builds/atari/FNames.SIC @@ -0,0 +1,37 @@ +/* the following changes file names for PureC projects */ + +if (argc > 0) +{ + ordner = argv[0]; + if (basename(ordner) == "") /* ist Ordner */ + { + ChangeFilenames(ordner); + } +} + +proc ChangeFilenames(folder) +local i,entries,directory,file; +{ + entries = filelist(directory,folder); + for (i = 0; i < entries; ++i) + { + file = directory[i,0]; + if ((directory[i,3]&16) > 0) /* subdirectory */ + { + ChangeFilenames(folder+file+"\\"); + } + else + { + if ((stricmp(suffix(file),".h")==0)|(stricmp(suffix(file),".c")==0)) + ChangeFilename(folder,file); + } + } +} + +proc ChangeFilename(path,datei) +local newfile,err; +{ + newfile=datei; + newfile[0]=(newfile[0] | 32) ^ 32; + err=files.rename("-q",path+datei,newfile); +} diff --git a/src/3rdparty/freetype/builds/atari/FREETYPE.PRJ b/src/3rdparty/freetype/builds/atari/FREETYPE.PRJ new file mode 100644 index 0000000000..4776a5bc69 --- /dev/null +++ b/src/3rdparty/freetype/builds/atari/FREETYPE.PRJ @@ -0,0 +1,32 @@ +;FreeType project file + +FREETYPE.LIB + +.C [-K -P -R -A] +.L [-J -V] +.S + += + +..\..\src\base\ftsystem.c +..\..\src\base\ftdebug.c + +..\..\src\base\ftinit.c +..\..\src\base\ftglyph.c +..\..\src\base\ftmm +..\..\src\base\ftbbox + +..\..\src\base\ftbase.c +..\..\src\autohint\autohint.c +;..\..\src\cache\ftcache.c +..\..\src\cff\cff.c +..\..\src\cid\type1cid.c +..\..\src\psaux\psaux.c +..\..\src\pshinter\pshinter.c +..\..\src\psnames\psnames.c +..\..\src\raster\raster.c +..\..\src\sfnt\sfnt.c +..\..\src\smooth\smooth.c +..\..\src\truetype\truetype.c +..\..\src\type1\type1.c +..\..\src\type42\type42.c diff --git a/src/3rdparty/freetype/builds/atari/README.TXT b/src/3rdparty/freetype/builds/atari/README.TXT new file mode 100644 index 0000000000..04eec63519 --- /dev/null +++ b/src/3rdparty/freetype/builds/atari/README.TXT @@ -0,0 +1,51 @@ +Compiling FreeType 2 with PureC compiler +======================================== + +[See below for a German version.] + +To compile FreeType 2 as a library the following changes must be applied: + +- All *.c files must start with an uppercase letter. + (In case GEMSCRIPT is available: + Simply drag the whole FreeType 2 directory to the file `FNames.SIC'.) + +- You have to change the INCLUDE directory in PureC's compiler options + to contain both the `INCLUDE' and `freetype2\include' directory. + Example: + + INCLUDE;E:\freetype2\include + +- The file `freetype2/include/Ft2build.h' must be patched as follows to + include ATARI.H: + + #ifndef __FT2_BUILD_GENERIC_H__ + #define __FT2_BUILD_GENERIC_H__ + + #include "ATARI.H" + + + +Compilieren von FreeType 2 mit PureC +==================================== + +Um FreeType 2 als eine Bibliothek (library) zu compilieren, muss folgendes +ge„ndert werden: + +- Alle *.c-files mssen mit einem GROSSBUCHSTABEN beginnen. + (Falls GEMSCRIPT zur Verfgung steht: + Den kompletten Ordner freetype2 auf die Datei `FNames.SIC' draggen.) + +- In den Compiler-Optionen von PureC muss das INCLUDE directory auf INCLUDE + und freetype2\include verweisen. Z.B.: + + INCLUDE;E:\freetype2\include + +- In der Datei freetype2/include/Ft2build.h muss zu Beginn + ein #include "ATARI.H" wie folgt eingefgt werden: + + #ifndef __FT2_BUILD_GENERIC_H__ + #define __FT2_BUILD_GENERIC_H__ + + #include "ATARI.H" + +--- end of README.TXT --- diff --git a/src/3rdparty/freetype/builds/beos/beos-def.mk b/src/3rdparty/freetype/builds/beos/beos-def.mk new file mode 100644 index 0000000000..4371a30aa3 --- /dev/null +++ b/src/3rdparty/freetype/builds/beos/beos-def.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 configuration rules for a BeOS system +# +# this is similar to the "ansi-def.mk" file, except for BUILD and PLATFORM +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := rm -f +CAT := cat +SEP := / +BUILD_DIR := $(TOP_DIR)/builds/beos +PLATFORM := beos + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := lib$(PROJECT) + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := + + +# EOF diff --git a/src/3rdparty/freetype/builds/beos/beos.mk b/src/3rdparty/freetype/builds/beos/beos.mk new file mode 100644 index 0000000000..b5c8bdabe3 --- /dev/null +++ b/src/3rdparty/freetype/builds/beos/beos.mk @@ -0,0 +1,19 @@ +# +# FreeType 2 configuration rules for a BeOS system +# + +# Copyright 1996-2000, 2002, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +include $(TOP_DIR)/builds/beos/beos-def.mk +include $(TOP_DIR)/builds/compiler/ansi-cc.mk +include $(TOP_DIR)/builds/link_std.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/beos/detect.mk b/src/3rdparty/freetype/builds/beos/detect.mk new file mode 100644 index 0000000000..24a0878862 --- /dev/null +++ b/src/3rdparty/freetype/builds/beos/detect.mk @@ -0,0 +1,41 @@ +# +# FreeType 2 configuration file to detect an BeOS host platform. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +.PHONY: setup + + +ifeq ($(PLATFORM),ansi) + + ifdef BE_HOST_CPU + + PLATFORM := beos + + endif # test MACHTYPE beos +endif + +ifeq ($(PLATFORM),beos) + + DELETE := rm -f + CAT := cat + SEP := / + BUILD_DIR := $(TOP_DIR)/builds/beos + CONFIG_FILE := beos.mk + + setup: std_setup + +endif # test PLATFORM beos + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/ansi-cc.mk b/src/3rdparty/freetype/builds/compiler/ansi-cc.mk new file mode 100644 index 0000000000..3b668e2010 --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/ansi-cc.mk @@ -0,0 +1,80 @@ +# +# FreeType 2 generic pseudo ANSI compiler +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := cc +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# we assume the compiler is already strictly ANSI +# +ANSIFLAGS := + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(AR) -r $@ $(subst /,$(COMPILER_SEP),$(OBJECTS_LIST)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/bcc-dev.mk b/src/3rdparty/freetype/builds/compiler/bcc-dev.mk new file mode 100644 index 0000000000..ba1a88a302 --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/bcc-dev.mk @@ -0,0 +1,78 @@ +# +# FreeType 2 Borland C++-specific with NO OPTIMIZATIONS + DEBUGGING +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := bcc32 +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := + + +# Target flag -- no trailing space. +# +T := -o + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -q -c -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -A + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = tlib /u $(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST:%=+%)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/bcc.mk b/src/3rdparty/freetype/builds/compiler/bcc.mk new file mode 100644 index 0000000000..509cb72483 --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/bcc.mk @@ -0,0 +1,78 @@ +# +# FreeType 2 Borland C++-specific rules +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := bcc32 +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := + + +# Target flag -- no trailing space. +# +T := -o + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -q -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -A + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = tlib /u $(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST:%=+%)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/emx.mk b/src/3rdparty/freetype/builds/compiler/emx.mk new file mode 100644 index 0000000000..c237005cb1 --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/emx.mk @@ -0,0 +1,77 @@ +# +# FreeType 2 emx-specific definitions +# + + +# Copyright 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := set GCCOPT="-ansi -pedantic"; gcc +COMPILER_SEP := / + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -g -O6 -Wall + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(foreach m,$(OBJECTS_LIST),$(AR) -r $@ $(m);) echo > nul + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/gcc-dev.mk b/src/3rdparty/freetype/builds/compiler/gcc-dev.mk new file mode 100644 index 0000000000..c63e1262eb --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/gcc-dev.mk @@ -0,0 +1,95 @@ +# +# FreeType 2 gcc-specific with NO OPTIMIZATIONS + DEBUGGING +# + + +# Copyright 1996-2000, 2003, 2004, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := gcc +COMPILER_SEP := / + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + ifeq ($(findstring g++,$(CC)),) + nested_externs := -Wnested-externs + strict_prototypes := -Wstrict-prototypes + endif + + CFLAGS := -c -g -O0 \ + -Wall \ + -W \ + -Wundef \ + -Wshadow \ + -Wpointer-arith \ + -Wwrite-strings \ + -Wredundant-decls \ + -Wno-long-long \ + $(nested_externs) \ + $(strict_prototypes) +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -ansi -pedantic + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/gcc.mk b/src/3rdparty/freetype/builds/compiler/gcc.mk new file mode 100644 index 0000000000..e941443a02 --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/gcc.mk @@ -0,0 +1,77 @@ +# +# FreeType 2 gcc-specific definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := gcc +COMPILER_SEP := / + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -g -O6 -Wall + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -ansi -pedantic + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/intelc.mk b/src/3rdparty/freetype/builds/compiler/intelc.mk new file mode 100644 index 0000000000..413ce5bacc --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/intelc.mk @@ -0,0 +1,85 @@ +# +# FreeType 2 Intel C/C++ definitions (VC++ compatibility mode) +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# compiler command line name +# +CC := icl +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := /I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := /D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := /Fl + + +# Target flag. +# +T := /Fo +TE := /Fe + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +# Note that the Intel C/C++ compiler version 4.5 complains about +# the use of FT_FIELD_OFFSET with "value must be arithmetic type"! +# This really looks like a bug in the compiler because the macro +# _does_ compute an arithmetic value, so we disable this warning +# with "/Qwd32". +# +CFLAGS ?= /nologo /c /Ox /G5 /W3 /Qwd32 + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := /Qansi_alias /Za + +# Library linking +# +#CLEAN_LIBRARY = +LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/unix-lcc.mk b/src/3rdparty/freetype/builds/compiler/unix-lcc.mk new file mode 100644 index 0000000000..d79f50846c --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/unix-lcc.mk @@ -0,0 +1,83 @@ +# +# FreeType 2 Unix LCC specific definitions +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Command line name +# +CC := lcc +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -g + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# LCC is pure ANSI anyway! +# +# the "-A" flag simply increments verbosity about non ANSI code +# +ANSIFLAGS := -A + + +# library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(PROJECT_LIBRARY) +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/visualage.mk b/src/3rdparty/freetype/builds/compiler/visualage.mk new file mode 100644 index 0000000000..c109659bf7 --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/visualage.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 Visual Age C++ specific definitions +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# command line compiler name +# +CC := icc +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := /I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := /D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := /Fl + + +# Target flag. +# +T := /Fo + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +CFLAGS ?= /Q- /Gd+ /O2 /G5 /W3 /C + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSI_FLAGS := /Sa + + +# Library linking +# +#CLEAN_LIBRARY := +LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/visualc.mk b/src/3rdparty/freetype/builds/compiler/visualc.mk new file mode 100644 index 0000000000..2e19ef86a3 --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/visualc.mk @@ -0,0 +1,82 @@ +# +# FreeType 2 Visual C++ definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# compiler command line name +# +CC := cl +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := /I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := /D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := /Fl + + +# Target flag. +# +T := /Fo + +# Target executable flag +# +TE := /Fe + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= /nologo /c /Ox /W3 /WX + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := /Za /D_CRT_SECURE_NO_DEPRECATE + + +# Library linking +# +#CLEAN_LIBRARY = +LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/watcom.mk b/src/3rdparty/freetype/builds/compiler/watcom.mk new file mode 100644 index 0000000000..4db1e7fece --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/watcom.mk @@ -0,0 +1,81 @@ +# +# FreeType 2 Watcom-specific definitions +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := wcc386 +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I= + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -FO= + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -zq + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -za + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(subst /,$(COMPILER_SEP), \ + wlib -q -n $@; \ + $(foreach m, $(OBJECTS_LIST), wlib -q $@ +$(m);) \ + echo > nul) + +# EOF diff --git a/src/3rdparty/freetype/builds/compiler/win-lcc.mk b/src/3rdparty/freetype/builds/compiler/win-lcc.mk new file mode 100644 index 0000000000..5d02d82462 --- /dev/null +++ b/src/3rdparty/freetype/builds/compiler/win-lcc.mk @@ -0,0 +1,81 @@ +# +# FreeType 2 Win32-LCC specific definitions +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Command line name +# +CC := lcc +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -Fl + + +# Target flag. +# +T := -Fo + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -g2 -O + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# LCC is pure ANSI anyway! +# +ANSIFLAGS := + + +# library linking +# +#CLEAN_LIBRARY := +LINK_LIBRARY = lcclib /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/detect.mk b/src/3rdparty/freetype/builds/detect.mk new file mode 100644 index 0000000000..987ae51c41 --- /dev/null +++ b/src/3rdparty/freetype/builds/detect.mk @@ -0,0 +1,154 @@ +# +# FreeType 2 host platform detection rules +# + + +# Copyright 1996-2000, 2001, 2002, 2003, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# This sub-Makefile is in charge of detecting the current platform. It sets +# the following variables: +# +# BUILD_DIR The configuration and system-specific directory. Usually +# `freetype/builds/$(PLATFORM)' but can be different for +# custom builds of the library. +# +# The following variables must be defined in system specific `detect.mk' +# files: +# +# PLATFORM The detected platform. This will default to `ansi' if +# auto-detection fails. +# CONFIG_FILE The configuration sub-makefile to use. This usually depends +# on the compiler defined in the `CC' environment variable. +# DELETE The shell command used to remove a given file. +# COPY The shell command used to copy one file. +# SEP The platform-specific directory separator. +# COMPILER_SEP The separator used in arguments of the compilation tools. +# CC The compiler to use. +# +# You need to set the following variable(s) before calling it: +# +# TOP_DIR The top-most directory in the FreeType library source +# hierarchy. If not defined, it will default to `.'. + +# Set auto-detection default to `ansi' resp. UNIX-like operating systems. +# +PLATFORM := ansi +DELETE := $(RM) +COPY := cp +CAT := cat +SEP := / + +BUILD_CONFIG := $(TOP_DIR)/builds + +# These two assignments must be delayed. +BUILD_DIR = $(BUILD_CONFIG)/$(PLATFORM) +CONFIG_RULES = $(BUILD_DIR)/$(CONFIG_FILE) + +# We define the BACKSLASH variable to hold a single back-slash character. +# This is needed because a line like +# +# SEP := \ +# +# does not work with GNU Make (the backslash is interpreted as a line +# continuation). While a line like +# +# SEP := \\ +# +# really defines $(SEP) as `\' on Unix, and `\\' on Dos and Windows! +# +BACKSLASH := $(strip \ ) + +# Find all auto-detectable platforms. +# +PLATFORMS := $(notdir $(subst /detect.mk,,$(wildcard $(BUILD_CONFIG)/*/detect.mk))) +.PHONY: $(PLATFORMS) ansi + +# Filter out platform specified as setup target. +# +PLATFORM := $(firstword $(filter $(MAKECMDGOALS),$(PLATFORMS))) + +# If no setup target platform was specified, enable auto-detection/ +# default platform. +# +ifeq ($(PLATFORM),) + PLATFORM := ansi +endif + +# If the user has explicitly asked for `ansi' on the command line, +# disable auto-detection. +# +ifeq ($(findstring ansi,$(MAKECMDGOALS)),) + # Now, include all detection rule files found in the `builds/' + # directories. Note that the calling order of the various `detect.mk' + # files isn't predictable. + # + include $(wildcard $(BUILD_CONFIG)/*/detect.mk) +endif + +# In case no detection rule file was successful, use the default. +# +ifndef CONFIG_FILE + CONFIG_FILE := ansi.mk + setup: std_setup + .PHONY: setup +endif + +# The following targets are equivalent, with the exception that they use +# a slightly different syntax for the `echo' command. +# +# std_setup: defined for most (i.e. Unix-like) platforms +# dos_setup: defined for Dos-ish platforms like Dos, Windows & OS/2 +# +.PHONY: std_setup dos_setup + +std_setup: + @echo "" + @echo "$(PROJECT_TITLE) build system -- automatic system detection" + @echo "" + @echo "The following settings are used:" + @echo "" + @echo " platform $(PLATFORM)" + @echo " compiler $(CC)" + @echo " configuration directory $(BUILD_DIR)" + @echo " configuration rules $(CONFIG_RULES)" + @echo "" + @echo "If this does not correspond to your system or settings please remove the file" + @echo "\`$(CONFIG_MK)' from this directory then read the INSTALL file for help." + @echo "" + @echo "Otherwise, simply type \`$(MAKE)' again to build the library," + @echo "or \`$(MAKE) refdoc' to build the API reference (the latter needs python)." + @echo "" + @$(COPY) $(CONFIG_RULES) $(CONFIG_MK) + + +# Special case for Dos, Windows, OS/2, where echo "" doesn't work correctly! +# +dos_setup: + @type builds$(SEP)newline + @echo $(PROJECT_TITLE) build system -- automatic system detection + @type builds$(SEP)newline + @echo The following settings are used: + @type builds$(SEP)newline + @echo platformÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(PLATFORM) + @echo compilerÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(CC) + @echo configuration directoryÿÿÿÿÿÿ$(subst /,$(SEP),$(BUILD_DIR)) + @echo configuration rulesÿÿÿÿÿÿÿÿÿÿ$(subst /,$(SEP),$(CONFIG_RULES)) + @type builds$(SEP)newline + @echo If this does not correspond to your system or settings please remove the file + @echo '$(CONFIG_MK)' from this directory then read the INSTALL file for help. + @type builds$(SEP)newline + @echo Otherwise, simply type 'make' again to build the library. + @echo or 'make refdoc' to build the API reference (the latter needs python). + @type builds$(SEP)newline + @$(COPY) $(subst /,$(SEP),$(CONFIG_RULES) $(CONFIG_MK)) > nul + + +# EOF diff --git a/src/3rdparty/freetype/builds/dos/detect.mk b/src/3rdparty/freetype/builds/dos/detect.mk new file mode 100644 index 0000000000..700a122688 --- /dev/null +++ b/src/3rdparty/freetype/builds/dos/detect.mk @@ -0,0 +1,142 @@ +# +# FreeType 2 configuration file to detect a DOS host platform. +# + + +# Copyright 1996-2000, 2003, 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +.PHONY: setup + + +ifeq ($(PLATFORM),ansi) + + # Test for DJGPP by checking the DJGPP environment variable, which must be + # set in order to use the system (ie. it will always be present when the + # `make' utility is run). + # + # We test for the COMSPEC environment variable, then run the `ver' + # command-line program to see if its output contains the word `Dos' or + # `DOS'. + # + # If this is true, we are running a Dos-ish platform (or an emulation). + # + ifdef DJGPP + PLATFORM := dos + else + ifdef COMSPEC + is_dos := $(findstring DOS,$(subst Dos,DOS,$(shell ver))) + + # We try to recognize a Dos session under OS/2. The `ver' command + # returns `Operating System/2 ...' there, so `is_dos' should be empty. + # + # To recognize a Dos session under OS/2, we check COMSPEC for the + # substring `MDOS\COMMAND' + # + ifeq ($(is_dos),) + is_dos := $(findstring MDOS\COMMAND,$(COMSPEC)) + endif + + # We also try to recognize Dos 7.x without Windows 9X launched. + # See builds/win32/detect.mk for explanations about the logic. + # + ifeq ($(is_dos),) + ifdef winbootdir +#ifneq ($(OS),Windows_NT) + # If win32 is available, do not trigger this test. + ifndef windir + is_dos := $(findstring Windows,$(strip $(shell ver))) + endif +#endif + endif + endif + + endif # test COMSPEC + + ifneq ($(is_dos),) + + PLATFORM := dos + + endif # test Dos + endif # test DJGPP +endif # test PLATFORM ansi + +ifeq ($(PLATFORM),dos) + + # Use DJGPP (i.e. gcc) by default. + # + CONFIG_FILE := dos-gcc.mk + CC ?= gcc + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring emx,$(MAKECMDGOALS)),) # EMX gcc + CONFIG_FILE := dos-emx.mk + CC := gcc + emx: setup + .PHONY: emx + endif + + ifneq ($(findstring turboc,$(MAKECMDGOALS)),) # Turbo C + CONFIG_FILE := dos-tcc.mk + CC := tcc + turboc: setup + .PHONY: turboc + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := dos-wat.mk + CC := wcc386 + watcom: setup + .PHONY: watcom + endif + + ifneq ($(findstring borlandc,$(MAKECMDGOALS)),) # Borland C/C++ 32-bit + CONFIG_FILE := dos-bcc.mk + CC := bcc32 + borlandc: setup + .PHONY: borlandc + endif + + ifneq ($(findstring borlandc16,$(MAKECMDGOALS)),) # Borland C/C++ 16-bit + CONFIG_FILE := dos-bcc.mk + CC := bcc + borlandc16: setup + .PHONY: borlandc16 + endif + + ifneq ($(findstring bash,$(SHELL)),) # check for bash + SEP := / + DELETE := rm + COPY := cp + CAT := cat + setup: std_setup + else + SEP := $(BACKSLASH) + DELETE := del + CAT := type + + # Setting COPY is a bit trickier. We can be running DJGPP on some + # Windows NT derivatives, like XP. See builds/win32/detect.mk for + # explanations why we need hacking here. + # + ifeq ($(OS),Windows_NT) + COPY := cmd.exe /c copy + else + COPY := copy + endif # test NT + + setup: dos_setup + endif + +endif # test PLATFORM dos + + +# EOF diff --git a/src/3rdparty/freetype/builds/dos/dos-def.mk b/src/3rdparty/freetype/builds/dos/dos-def.mk new file mode 100644 index 0000000000..950f581a00 --- /dev/null +++ b/src/3rdparty/freetype/builds/dos/dos-def.mk @@ -0,0 +1,45 @@ +# +# FreeType 2 DOS specific definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := del +CAT := type +SEP := $(strip \ ) +BUILD_DIR := $(TOP_DIR)/builds/dos +PLATFORM := dos + + +# The executable file extension (for tools), *with* leading dot. +# +E := .exe + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := $(PROJECT) + + +# The NO_OUTPUT macro is used to ignore the output of commands. +# +NO_OUTPUT = > nul + + +# EOF diff --git a/src/3rdparty/freetype/builds/dos/dos-emx.mk b/src/3rdparty/freetype/builds/dos/dos-emx.mk new file mode 100644 index 0000000000..6ea8f6d872 --- /dev/null +++ b/src/3rdparty/freetype/builds/dos/dos-emx.mk @@ -0,0 +1,21 @@ +# +# FreeType 2 configuration rules for the EMX gcc compiler +# + + +# Copyright 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP_DIR)/builds/dos/dos-def.mk +include $(TOP_DIR)/builds/compiler/emx.mk +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/dos/dos-gcc.mk b/src/3rdparty/freetype/builds/dos/dos-gcc.mk new file mode 100644 index 0000000000..e14255c1f2 --- /dev/null +++ b/src/3rdparty/freetype/builds/dos/dos-gcc.mk @@ -0,0 +1,21 @@ +# +# FreeType 2 configuration rules for the DJGPP compiler +# + + +# Copyright 1996-2000, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP_DIR)/builds/dos/dos-def.mk +include $(TOP_DIR)/builds/compiler/gcc.mk +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/dos/dos-wat.mk b/src/3rdparty/freetype/builds/dos/dos-wat.mk new file mode 100644 index 0000000000..c763b163cd --- /dev/null +++ b/src/3rdparty/freetype/builds/dos/dos-wat.mk @@ -0,0 +1,20 @@ +# +# FreeType 2 configuration rules for the Watcom C/C++ compiler +# + + +# Copyright 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +include $(TOP_DIR)/builds/dos/dos-def.mk +include $(TOP_DIR)/builds/compiler/watcom.mk +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/exports.mk b/src/3rdparty/freetype/builds/exports.mk new file mode 100644 index 0000000000..5452b35715 --- /dev/null +++ b/src/3rdparty/freetype/builds/exports.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 exports sub-Makefile +# + + +# Copyright 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY +# OTHER MAKEFILES. + + +# This sub-Makefile is used to compute the list of exported symbols whenever +# the EXPORTS_LIST variable is defined by one of the platform or compiler +# specific build files. +# +# EXPORTS_LIST contains the name of the `list' file, for example a Windows +# .DEF file. +# +ifneq ($(EXPORTS_LIST),) + + # CCexe is the compiler used to compile the `apinames' tool program + # on the host machine. This isn't necessarily the same as the compiler + # which can be a cross-compiler for a different architecture, for example. + # + ifeq ($(CCexe),) + CCexe := $(CC) + endif + + # TE acts like T, but for executables instead of object files. + ifeq ($(TE),) + TE := $T + endif + + # The list of public headers we're going to parse. + PUBLIC_HEADERS := $(wildcard $(PUBLIC_DIR)/*.h) + + # The `apinames' source and executable. We use $E_BUILD as the host + # executable suffix, which *includes* the final dot. + # + # Note that $(APINAMES_OPTIONS) is empty, except for Windows compilers. + # + APINAMES_SRC := $(TOP_DIR)/src/tools/apinames.c + APINAMES_EXE := $(OBJ_DIR)/apinames$(E_BUILD) + + $(APINAMES_EXE): $(APINAMES_SRC) + $(CCexe) $(TE)$@ $< + + .PHONY: symbols_list + + symbols_list: $(EXPORTS_LIST) + + # We manually add TT_New_Context and TT_RunIns, which are needed by TT + # debuggers, to the EXPORTS_LIST. + # + $(EXPORTS_LIST): $(APINAMES_EXE) $(PUBLIC_HEADERS) + $(subst /,$(SEP),$(APINAMES_EXE)) -o$@ $(APINAMES_OPTIONS) $(PUBLIC_HEADERS) + @echo TT_New_Context >> $(EXPORTS_LIST) + @echo TT_RunIns >> $(EXPORTS_LIST) + + $(PROJECT_LIBRARY): $(EXPORTS_LIST) + + CLEAN += $(EXPORTS_LIST) \ + $(APINAMES_EXE) + +endif + + +# EOF diff --git a/src/3rdparty/freetype/builds/freetype.mk b/src/3rdparty/freetype/builds/freetype.mk new file mode 100644 index 0000000000..7a89c8e3d0 --- /dev/null +++ b/src/3rdparty/freetype/builds/freetype.mk @@ -0,0 +1,361 @@ +# +# FreeType 2 library sub-Makefile +# + + +# Copyright 1996-2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY +# OTHER MAKEFILES. + + +# The following variables (set by other Makefile components, in the +# environment, or on the command line) are used: +# +# BUILD_DIR The architecture dependent directory, +# e.g. `$(TOP_DIR)/builds/unix'. Added to INCLUDES also. +# +# OBJ_DIR The directory in which object files are created. +# +# LIB_DIR The directory in which the library is created. +# +# DOC_DIR The directory in which the API reference is created. +# +# INCLUDES A list of directories to be included additionally. +# +# DEVEL_DIR Development directory which is added to the INCLUDES +# variable before the standard include directories. +# +# CFLAGS Compilation flags. This overrides the default settings +# in the platform-specific configuration files. +# +# FTSYS_SRC If set, its value is used as the name of a replacement +# file for `src/base/ftsystem.c'. +# +# FTDEBUG_SRC If set, its value is used as the name of a replacement +# file for `src/base/ftdebug.c'. [For a normal build, this +# file does nothing.] +# +# FTMODULE_H The file which contains the list of module classes for +# the current build. Usually, this is automatically +# created by `modules.mk'. +# +# BASE_OBJ_S +# BASE_OBJ_M A list of base objects (for single object and multiple +# object builds, respectively). Set up in +# `src/base/rules.mk'. +# +# BASE_EXT_OBJ A list of base extension objects. Set up in +# `src/base/rules.mk'. +# +# DRV_OBJ_S +# DRV_OBJ_M A list of driver objects (for single object and multiple +# object builds, respectively). Set up cumulatively in +# `src//rules.mk'. +# +# CLEAN +# DISTCLEAN The sub-makefiles can append additional stuff to these two +# variables which is to be removed for the `clean' resp. +# `distclean' target. +# +# TOP_DIR, SEP, +# COMPILER_SEP, +# LIBRARY, CC, +# A, I, O, T Check `config.mk' for details. + + +# The targets `objects' and `library' are defined at the end of this +# Makefile after all other rules have been included. +# +.PHONY: single multi objects library refdoc + +# default target -- build single objects and library +# +single: objects library + +# `multi' target -- build multiple objects and library +# +multi: objects library + + +# The FreeType source directory, usually `./src'. +# +SRC_DIR := $(TOP_DIR)/src + +# The directory where the base layer components are placed, usually +# `./src/base'. +# +BASE_DIR := $(SRC_DIR)/base + +# Other derived directories. +# +PUBLIC_DIR := $(TOP_DIR)/include/freetype +INTERNAL_DIR := $(PUBLIC_DIR)/internal +SERVICES_DIR := $(INTERNAL_DIR)/services +CONFIG_DIR := $(PUBLIC_DIR)/config + +# The documentation directory. +# +DOC_DIR ?= $(TOP_DIR)/docs/reference + +# The final name of the library file. +# +PROJECT_LIBRARY := $(LIB_DIR)/$(LIBRARY).$A + + +# include paths +# +# IMPORTANT NOTE: The architecture-dependent directory must ALWAYS be placed +# before the standard include list. Porters are then able to +# put their own version of some of the FreeType components +# in the `freetype/builds/' directory, as these +# files will override the default sources. +# +INCLUDES := $(subst /,$(COMPILER_SEP),$(OBJ_DIR) \ + $(DEVEL_DIR) \ + $(BUILD_DIR) \ + $(TOP_DIR)/include) + +INCLUDE_FLAGS := $(INCLUDES:%=$I%) + + +# C flags used for the compilation of an object file. This must include at +# least the paths for the `base' and `builds/' directories; +# debug/optimization/warning flags + ansi compliance if needed. +# +# $(INCLUDE_FLAGS) should come before $(CFLAGS) to avoid problems with +# old FreeType versions. +# +# Note what we also define the macro FT2_BUILD_LIBRARY when building +# FreeType. This is required to let our sources include the internal +# headers (something forbidden by clients). +# +# Finally, we define FT_CONFIG_MODULES_H so that the compiler uses the +# generated version of `ftmodule.h' in $(OBJ_DIR). If there is an +# `ftoption.h' files in $(OBJ_DIR), define FT_CONFIG_OPTIONS_H too. +# +ifneq ($(wildcard $(OBJ_DIR)/ftoption.h),) + FTOPTION_H := $(OBJ_DIR)/ftoption.h + FTOPTION_FLAG := $DFT_CONFIG_OPTIONS_H="" +endif + +FT_CFLAGS = $(CPPFLAGS) \ + $(INCLUDE_FLAGS) \ + $(CFLAGS) \ + $DFT2_BUILD_LIBRARY \ + $DFT_CONFIG_MODULES_H="" \ + $(FTOPTION_FLAG) +FT_CC = $(CC) $(FT_CFLAGS) +FT_COMPILE = $(CC) $(ANSIFLAGS) $(FT_CFLAGS) + + +# Include the `exports' rules file. +# +include $(TOP_DIR)/builds/exports.mk + + +# Initialize the list of objects. +# +OBJECTS_LIST := + + +# Define $(PUBLIC_H) as the list of all public header files located in +# `$(TOP_DIR)/include/freetype'. $(INTERNAL_H), and $(CONFIG_H) are defined +# similarly. +# +# This is used to simplify the dependency rules -- if one of these files +# changes, the whole library is recompiled. +# +PUBLIC_H := $(wildcard $(PUBLIC_DIR)/*.h) +INTERNAL_H := $(wildcard $(INTERNAL_DIR)/*.h) \ + $(wildcard $(SERVICES_DIR)/*.h) +CONFIG_H := $(wildcard $(CONFIG_DIR)/*.h) \ + $(wildcard $(BUILD_DIR)/freetype/config/*.h) \ + $(FTMODULE_H) \ + $(FTOPTION_H) +DEVEL_H := $(wildcard $(TOP_DIR)/devel/*.h) + +FREETYPE_H := $(PUBLIC_H) $(INTERNAL_H) $(CONFIG_H) $(DEVEL_H) + + +# ftsystem component +# +FTSYS_SRC ?= $(BASE_DIR)/ftsystem.c + +FTSYS_OBJ := $(OBJ_DIR)/ftsystem.$O + +OBJECTS_LIST += $(FTSYS_OBJ) + +$(FTSYS_OBJ): $(FTSYS_SRC) $(FREETYPE_H) + $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# ftdebug component +# +FTDEBUG_SRC ?= $(BASE_DIR)/ftdebug.c + +FTDEBUG_OBJ := $(OBJ_DIR)/ftdebug.$O + +OBJECTS_LIST += $(FTDEBUG_OBJ) + +$(FTDEBUG_OBJ): $(FTDEBUG_SRC) $(FREETYPE_H) + $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# Include all rule files from FreeType components. +# +include $(SRC_DIR)/base/rules.mk +include $(patsubst %,$(SRC_DIR)/%/rules.mk,$(MODULES)) + + +# ftinit component +# +# The C source `ftinit.c' contains the FreeType initialization routines. +# It is able to automatically register one or more drivers when the API +# function FT_Init_FreeType() is called. +# +# The set of initial drivers is determined by the driver Makefiles +# includes above. Each driver Makefile updates the FTINIT_xxx lists +# which contain additional include paths and macros used to compile the +# single `ftinit.c' source. +# +FTINIT_SRC := $(BASE_DIR)/ftinit.c +FTINIT_OBJ := $(OBJ_DIR)/ftinit.$O + +OBJECTS_LIST += $(FTINIT_OBJ) + +$(FTINIT_OBJ): $(FTINIT_SRC) $(FREETYPE_H) + $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# All FreeType library objects. +# +OBJ_M := $(BASE_OBJ_M) $(BASE_EXT_OBJ) $(DRV_OBJS_M) +OBJ_S := $(BASE_OBJ_S) $(BASE_EXT_OBJ) $(DRV_OBJS_S) + + +# The target `multi' on the Make command line indicates that we want to +# compile each source file independently. +# +# Otherwise, each module/driver is compiled in a single object file through +# source file inclusion (see `src/base/ftbase.c' or +# `src/truetype/truetype.c' for examples). +# +BASE_OBJECTS := $(OBJECTS_LIST) + +ifneq ($(findstring multi,$(MAKECMDGOALS)),) + OBJECTS_LIST += $(OBJ_M) +else + OBJECTS_LIST += $(OBJ_S) +endif + +objects: $(OBJECTS_LIST) + +library: $(PROJECT_LIBRARY) + +dll: $(PROJECT_LIBRARY) exported_symbols + +.c.$O: + $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +ifneq ($(findstring refdoc,$(MAKECMDGOALS)),) + # poor man's `sed' emulation with make's built-in string functions + work := $(strip $(shell $(CAT) $(PUBLIC_DIR)/freetype.h)) + work := $(subst |,x,$(work)) + work := $(subst $(space),|,$(work)) + work := $(subst \#define|FREETYPE_MAJOR|,$(space),$(work)) + work := $(word 2,$(work)) + major := $(subst |,$(space),$(work)) + major := $(firstword $(major)) + + work := $(subst \#define|FREETYPE_MINOR|,$(space),$(work)) + work := $(word 2,$(work)) + minor := $(subst |,$(space),$(work)) + minor := $(firstword $(minor)) + + work := $(subst \#define|FREETYPE_PATCH|,$(space),$(work)) + work := $(word 2,$(work)) + patch := $(subst |,$(space),$(work)) + patch := $(firstword $(patch)) + + version := $(major).$(minor).$(patch) +endif + +# We write-protect the docmaker directory to suppress generation +# of .pyc files. +# +refdoc: + -chmod -w $(SRC_DIR)/tools/docmaker + python $(SRC_DIR)/tools/docmaker/docmaker.py \ + --prefix=ft2 \ + --title=FreeType-$(version) \ + --output=$(DOC_DIR) \ + $(PUBLIC_DIR)/*.h \ + $(PUBLIC_DIR)/config/*.h \ + $(PUBLIC_DIR)/cache/*.h + -chmod +w $(SRC_DIR)/tools/docmaker + + +.PHONY: clean_project_std distclean_project_std + +# Standard cleaning and distclean rules. These are not accepted +# on all systems though. +# +clean_project_std: + -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) $(CLEAN) + +distclean_project_std: clean_project_std + -$(DELETE) $(PROJECT_LIBRARY) + -$(DELETE) *.orig *~ core *.core $(DISTCLEAN) + + +.PHONY: clean_project_dos distclean_project_dos + +# The Dos command shell does not support very long list of arguments, so +# we are stuck with wildcards. +# +# Don't break the command lines with \; this prevents the "del" command from +# working correctly on Win9x. +# +clean_project_dos: + -$(DELETE) $(subst /,$(SEP),$(OBJ_DIR)/*.$O $(CLEAN) $(NO_OUTPUT)) + +distclean_project_dos: clean_project_dos + -$(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY) $(DISTCLEAN) $(NO_OUTPUT)) + + +.PHONY: remove_config_mk remove_ftmodule_h + +# Remove configuration file (used for distclean). +# +remove_config_mk: + -$(DELETE) $(subst /,$(SEP),$(CONFIG_MK) $(NO_OUTPUT)) + +# Remove module list (used for distclean). +# +remove_ftmodule_h: + -$(DELETE) $(subst /,$(SEP),$(FTMODULE_H) $(NO_OUTPUT)) + + +.PHONY: clean distclean + +# The `config.mk' file must define `clean_freetype' and +# `distclean_freetype'. Implementations may use to relay these to either +# the `std' or `dos' versions from above, or simply provide their own +# implementation. +# +clean: clean_project +distclean: distclean_project remove_config_mk remove_ftmodule_h + -$(DELETE) $(subst /,$(SEP),$(DOC_DIR)/*.html $(NO_OUTPUT)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/link_dos.mk b/src/3rdparty/freetype/builds/link_dos.mk new file mode 100644 index 0000000000..c37ac7e52c --- /dev/null +++ b/src/3rdparty/freetype/builds/link_dos.mk @@ -0,0 +1,42 @@ +# +# Link instructions for Dos-like systems (Dos, Win32, OS/2) +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +ifdef BUILD_PROJECT + + .PHONY: clean_project distclean_project + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP_DIR)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_dos + distclean_project: distclean_project_dos + + # This final rule is used to link all object files into a single library. + # this is compiler-specific + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + +endif + + +# EOF diff --git a/src/3rdparty/freetype/builds/link_std.mk b/src/3rdparty/freetype/builds/link_std.mk new file mode 100644 index 0000000000..0bd2163bb1 --- /dev/null +++ b/src/3rdparty/freetype/builds/link_std.mk @@ -0,0 +1,42 @@ +# +# Link instructions for standard systems +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +ifdef BUILD_PROJECT + + .PHONY: clean_project distclean_project + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP_DIR)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_std + distclean_project: distclean_project_std + + # This final rule is used to link all object files into a single library. + # this is compiler-specific + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + +endif + + +# EOF diff --git a/src/3rdparty/freetype/builds/mac/FreeType.m68k_cfm.make.txt b/src/3rdparty/freetype/builds/mac/FreeType.m68k_cfm.make.txt new file mode 100644 index 0000000000..3360d91767 --- /dev/null +++ b/src/3rdparty/freetype/builds/mac/FreeType.m68k_cfm.make.txt @@ -0,0 +1,208 @@ +# File: FreeType.m68k_cfm.make +# Target: FreeType.m68k_cfm +# Created: Thursday, October 27, 2005 09:23:25 PM + + +MAKEFILE = FreeType.m68k_cfm.make +\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = :objs: +Includes = \xB6 + -ansi strict \xB6 + -includes unix \xB6 + -i :include: \xB6 + -i :src: \xB6 + -i :include:freetype:config: + +Sym-68K = -sym off + +COptions = \xB6 + -d HAVE_FSSPEC=1 \xB6 + -d HAVE_FSREF=0 \xB6 + -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 + -d HAVE_QUICKDRAW_CARBON=0 \xB6 + -d HAVE_ATS=0 \xB6 + -d FT2_BUILD_LIBRARY \xB6 + -d FT_CONFIG_CONFIG_H="" \xB6 + -d FT_CONFIG_MODULES_H="" \xB6 + {Includes} {Sym-68K} -model cfmseg + + +### Source Files ### + +SrcFiles = \xB6 + :src:autofit:autofit.c \xB6 + :builds:mac:ftbase.c \xB6 + :src:base:ftbbox.c \xB6 + :src:base:ftbdf.c \xB6 + :src:base:ftbitmap.c \xB6 + :src:base:ftdebug.c \xB6 + :src:base:ftfstype.c \xB6 + :src:base:ftglyph.c \xB6 + :src:base:ftgxval.c \xB6 + :src:base:ftinit.c \xB6 + :src:base:ftmm.c \xB6 + :src:base:ftotval.c \xB6 + :src:base:ftpfr.c \xB6 + :src:base:ftstroke.c \xB6 + :src:base:ftsynth.c \xB6 + :src:base:ftsystem.c \xB6 + :src:base:fttype1.c \xB6 + :src:base:ftwinfnt.c \xB6 + :src:base:ftxf86.c \xB6 + :src:cache:ftcache.c \xB6 + :src:bdf:bdf.c \xB6 + :src:cff:cff.c \xB6 + :src:cid:type1cid.c \xB6 +# :src:gxvalid:gxvalid.c \xB6 + :src:gzip:ftgzip.c \xB6 + :src:lzw:ftlzw.c \xB6 + :src:otvalid:otvalid.c \xB6 + :src:pcf:pcf.c \xB6 + :src:pfr:pfr.c \xB6 + :src:psaux:psaux.c \xB6 + :src:pshinter:pshinter.c \xB6 + :src:psnames:psmodule.c \xB6 + :src:raster:raster.c \xB6 + :src:sfnt:sfnt.c \xB6 + :src:smooth:smooth.c \xB6 + :src:truetype:truetype.c \xB6 + :src:type1:type1.c \xB6 + :src:type42:type42.c \xB6 + :src:winfonts:winfnt.c + + +### Object Files ### + +ObjFiles-68K = \xB6 + "{ObjDir}autofit.c.o" \xB6 + "{ObjDir}ftbase.c.o" \xB6 + "{ObjDir}ftbbox.c.o" \xB6 + "{ObjDir}ftbdf.c.o" \xB6 + "{ObjDir}ftbitmap.c.o" \xB6 + "{ObjDir}ftdebug.c.o" \xB6 + "{ObjDir}ftfstype.c.o" \xB6 + "{ObjDir}ftglyph.c.o" \xB6 + "{ObjDir}ftgxval.c.o" \xB6 + "{ObjDir}ftinit.c.o" \xB6 + "{ObjDir}ftmm.c.o" \xB6 + "{ObjDir}ftotval.c.o" \xB6 + "{ObjDir}ftpfr.c.o" \xB6 + "{ObjDir}ftstroke.c.o" \xB6 + "{ObjDir}ftsynth.c.o" \xB6 + "{ObjDir}ftsystem.c.o" \xB6 + "{ObjDir}fttype1.c.o" \xB6 + "{ObjDir}ftwinfnt.c.o" \xB6 + "{ObjDir}ftxf86.c.o" \xB6 + "{ObjDir}ftcache.c.o" \xB6 + "{ObjDir}bdf.c.o" \xB6 + "{ObjDir}cff.c.o" \xB6 + "{ObjDir}type1cid.c.o" \xB6 +# "{ObjDir}gxvalid.c.o" \xB6 + "{ObjDir}ftgzip.c.o" \xB6 + "{ObjDir}ftlzw.c.o" \xB6 + "{ObjDir}otvalid.c.o" \xB6 + "{ObjDir}pcf.c.o" \xB6 + "{ObjDir}pfr.c.o" \xB6 + "{ObjDir}psaux.c.o" \xB6 + "{ObjDir}pshinter.c.o" \xB6 + "{ObjDir}psmodule.c.o" \xB6 + "{ObjDir}raster.c.o" \xB6 + "{ObjDir}sfnt.c.o" \xB6 + "{ObjDir}smooth.c.o" \xB6 + "{ObjDir}truetype.c.o" \xB6 + "{ObjDir}type1.c.o" \xB6 + "{ObjDir}type42.c.o" \xB6 + "{ObjDir}winfnt.c.o" + + +### Libraries ### + +LibFiles-68K = + + +### Default Rules ### + +.c.o \xC4 .c {\xA5MondoBuild\xA5} + {C} {depDir}{default}.c -o {targDir}{default}.c.o {COptions} + + +### Build Rules ### + +:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c + Duplicate :src:base:ftbase.c :builds:mac:ftbase.c + +"{ObjDir}ftbase.c.o" \xC4\xC4 :builds:mac:ftbase.c + {C} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.o" \xB6 + -i :builds:mac: \xB6 + -i :src:base: \xB6 + {COptions} + +FreeType.m68k_cfm \xC4\xC4 FreeType.m68k_cfm.o + +FreeType.m68k_cfm.o \xC4\xC4 {ObjFiles-68K} {LibFiles-68K} {\xA5MondoBuild\xA5} + Lib \xB6 + -o {Targ} \xB6 + {ObjFiles-68K} \xB6 + {LibFiles-68K} \xB6 + {Sym-68K} \xB6 + -mf -d + + + +### Required Dependencies ### + +"{ObjDir}autofit.c.o" \xC4 :src:autofit:autofit.c +# "{ObjDir}ftbase.c.o" \xC4 :src:base:ftbase.c +"{ObjDir}ftbbox.c.o" \xC4 :src:base:ftbbox.c +"{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c +"{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c +"{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c +"{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c +"{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c +"{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c +"{ObjDir}ftinit.c.o" \xC4 :src:base:ftinit.c +"{ObjDir}ftmm.c.o" \xC4 :src:base:ftmm.c +"{ObjDir}ftotval.c.o" \xC4 :src:base:ftotval.c +"{ObjDir}ftpfr.c.o" \xC4 :src:base:ftpfr.c +"{ObjDir}ftstroke.c.o" \xC4 :src:base:ftstroke.c +"{ObjDir}ftsynth.c.o" \xC4 :src:base:ftsynth.c +"{ObjDir}ftsystem.c.o" \xC4 :src:base:ftsystem.c +"{ObjDir}fttype1.c.o" \xC4 :src:base:fttype1.c +"{ObjDir}ftwinfnt.c.o" \xC4 :src:base:ftwinfnt.c +"{ObjDir}ftxf86.c.o" \xC4 :src:base:ftxf86.c +"{ObjDir}ftcache.c.o" \xC4 :src:cache:ftcache.c +"{ObjDir}bdf.c.o" \xC4 :src:bdf:bdf.c +"{ObjDir}cff.c.o" \xC4 :src:cff:cff.c +"{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c +# "{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c +"{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c +"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c +"{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c +"{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c +"{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c +"{ObjDir}psaux.c.o" \xC4 :src:psaux:psaux.c +"{ObjDir}pshinter.c.o" \xC4 :src:pshinter:pshinter.c +"{ObjDir}psmodule.c.o" \xC4 :src:psnames:psmodule.c +"{ObjDir}raster.c.o" \xC4 :src:raster:raster.c +"{ObjDir}sfnt.c.o" \xC4 :src:sfnt:sfnt.c +"{ObjDir}smooth.c.o" \xC4 :src:smooth:smooth.c +"{ObjDir}truetype.c.o" \xC4 :src:truetype:truetype.c +"{ObjDir}type1.c.o" \xC4 :src:type1:type1.c +"{ObjDir}type42.c.o" \xC4 :src:type42:type42.c +"{ObjDir}winfnt.c.o" \xC4 :src:winfonts:winfnt.c + + +### Optional Dependencies ### +### Build this target to generate "include file" dependencies. ### + +Dependencies \xC4 $OutOfDate + MakeDepend \xB6 + -append {MAKEFILE} \xB6 + -ignore "{CIncludes}" \xB6 + -objdir "{ObjDir}" \xB6 + -objext .o \xB6 + {Includes} \xB6 + {SrcFiles} + + diff --git a/src/3rdparty/freetype/builds/mac/FreeType.m68k_far.make.txt b/src/3rdparty/freetype/builds/mac/FreeType.m68k_far.make.txt new file mode 100644 index 0000000000..224f8e180b --- /dev/null +++ b/src/3rdparty/freetype/builds/mac/FreeType.m68k_far.make.txt @@ -0,0 +1,207 @@ +# File: FreeType.m68k_far.make +# Target: FreeType.m68k_far +# Created: Tuesday, October 25, 2005 03:34:05 PM + + +MAKEFILE = FreeType.m68k_far.make +\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = :objs: +Includes = \xB6 + -includes unix \xB6 + -i :include: \xB6 + -i :src: \xB6 + -i :include:freetype:config: + +Sym-68K = -sym off + +COptions = \xB6 + -d HAVE_FSSPEC=1 \xB6 + -d HAVE_FSREF=0 \xB6 + -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 + -d HAVE_QUICKDRAW_CARBON=0 \xB6 + -d HAVE_ATS=0 \xB6 + -d FT2_BUILD_LIBRARY \xB6 + -d FT_CONFIG_CONFIG_H="" \xB6 + -d FT_CONFIG_MODULES_H="" \xB6 + {Includes} {Sym-68K} -model far + + +### Source Files ### + +SrcFiles = \xB6 + :src:autofit:autofit.c \xB6 + :builds:mac:ftbase.c \xB6 + :src:base:ftbbox.c \xB6 + :src:base:ftbdf.c \xB6 + :src:base:ftbitmap.c \xB6 + :src:base:ftdebug.c \xB6 + :src:base:ftfstype.c \xB6 + :src:base:ftglyph.c \xB6 + :src:base:ftgxval.c \xB6 + :src:base:ftinit.c \xB6 + :src:base:ftmm.c \xB6 + :src:base:ftotval.c \xB6 + :src:base:ftpfr.c \xB6 + :src:base:ftstroke.c \xB6 + :src:base:ftsynth.c \xB6 + :src:base:ftsystem.c \xB6 + :src:base:fttype1.c \xB6 + :src:base:ftwinfnt.c \xB6 + :src:base:ftxf86.c \xB6 + :src:cache:ftcache.c \xB6 + :src:bdf:bdf.c \xB6 + :src:cff:cff.c \xB6 + :src:cid:type1cid.c \xB6 + :src:gxvalid:gxvalid.c \xB6 + :src:gzip:ftgzip.c \xB6 + :src:lzw:ftlzw.c \xB6 + :src:otvalid:otvalid.c \xB6 + :src:pcf:pcf.c \xB6 + :src:pfr:pfr.c \xB6 + :src:psaux:psaux.c \xB6 + :src:pshinter:pshinter.c \xB6 + :src:psnames:psmodule.c \xB6 + :src:raster:raster.c \xB6 + :src:sfnt:sfnt.c \xB6 + :src:smooth:smooth.c \xB6 + :src:truetype:truetype.c \xB6 + :src:type1:type1.c \xB6 + :src:type42:type42.c \xB6 + :src:winfonts:winfnt.c + + +### Object Files ### + +ObjFiles-68K = \xB6 + "{ObjDir}autofit.c.o" \xB6 + "{ObjDir}ftbase.c.o" \xB6 + "{ObjDir}ftbbox.c.o" \xB6 + "{ObjDir}ftbdf.c.o" \xB6 + "{ObjDir}ftbitmap.c.o" \xB6 + "{ObjDir}ftdebug.c.o" \xB6 + "{ObjDir}ftfstype.c.o" \xB6 + "{ObjDir}ftglyph.c.o" \xB6 + "{ObjDir}ftgxval.c.o" \xB6 + "{ObjDir}ftinit.c.o" \xB6 + "{ObjDir}ftmm.c.o" \xB6 + "{ObjDir}ftotval.c.o" \xB6 + "{ObjDir}ftpfr.c.o" \xB6 + "{ObjDir}ftstroke.c.o" \xB6 + "{ObjDir}ftsynth.c.o" \xB6 + "{ObjDir}ftsystem.c.o" \xB6 + "{ObjDir}fttype1.c.o" \xB6 + "{ObjDir}ftwinfnt.c.o" \xB6 + "{ObjDir}ftxf86.c.o" \xB6 + "{ObjDir}ftcache.c.o" \xB6 + "{ObjDir}bdf.c.o" \xB6 + "{ObjDir}cff.c.o" \xB6 + "{ObjDir}type1cid.c.o" \xB6 + "{ObjDir}gxvalid.c.o" \xB6 + "{ObjDir}ftgzip.c.o" \xB6 + "{ObjDir}ftlzw.c.o" \xB6 + "{ObjDir}otvalid.c.o" \xB6 + "{ObjDir}pcf.c.o" \xB6 + "{ObjDir}pfr.c.o" \xB6 + "{ObjDir}psaux.c.o" \xB6 + "{ObjDir}pshinter.c.o" \xB6 + "{ObjDir}psmodule.c.o" \xB6 + "{ObjDir}raster.c.o" \xB6 + "{ObjDir}sfnt.c.o" \xB6 + "{ObjDir}smooth.c.o" \xB6 + "{ObjDir}truetype.c.o" \xB6 + "{ObjDir}type1.c.o" \xB6 + "{ObjDir}type42.c.o" \xB6 + "{ObjDir}winfnt.c.o" + + +### Libraries ### + +LibFiles-68K = + + +### Default Rules ### + +.c.o \xC4 .c {\xA5MondoBuild\xA5} + {C} {depDir}{default}.c -o {targDir}{default}.c.o {COptions} \xB6 + -ansi strict + +### Build Rules ### + +:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c + Duplicate :src:base:ftbase.c :builds:mac:ftbase.c + +"{ObjDir}ftbase.c.o" \xC4\xC4 :builds:mac:ftbase.c + {C} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.o" \xB6 + -i :builds:mac: \xB6 + -i :src:base: \xB6 + {COptions} + +FreeType.m68k_far \xC4\xC4 FreeType.m68k_far.o + +FreeType.m68k_far.o \xC4\xC4 {ObjFiles-68K} {LibFiles-68K} {\xA5MondoBuild\xA5} + Lib \xB6 + -o {Targ} \xB6 + {ObjFiles-68K} \xB6 + {LibFiles-68K} \xB6 + {Sym-68K} \xB6 + -mf -d + + + +### Required Dependencies ### + +"{ObjDir}autofit.c.o" \xC4 :src:autofit:autofit.c +# "{ObjDir}ftbase.c.o" \xC4 :src:base:ftbase.c +"{ObjDir}ftbbox.c.o" \xC4 :src:base:ftbbox.c +"{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c +"{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c +"{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c +"{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c +"{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c +"{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c +"{ObjDir}ftinit.c.o" \xC4 :src:base:ftinit.c +"{ObjDir}ftmm.c.o" \xC4 :src:base:ftmm.c +"{ObjDir}ftotval.c.o" \xC4 :src:base:ftotval.c +"{ObjDir}ftpfr.c.o" \xC4 :src:base:ftpfr.c +"{ObjDir}ftstroke.c.o" \xC4 :src:base:ftstroke.c +"{ObjDir}ftsynth.c.o" \xC4 :src:base:ftsynth.c +"{ObjDir}ftsystem.c.o" \xC4 :src:base:ftsystem.c +"{ObjDir}fttype1.c.o" \xC4 :src:base:fttype1.c +"{ObjDir}ftwinfnt.c.o" \xC4 :src:base:ftwinfnt.c +"{ObjDir}ftxf86.c.o" \xC4 :src:base:ftxf86.c +"{ObjDir}ftcache.c.o" \xC4 :src:cache:ftcache.c +"{ObjDir}bdf.c.o" \xC4 :src:bdf:bdf.c +"{ObjDir}cff.c.o" \xC4 :src:cff:cff.c +"{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c +"{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c +"{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c +"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c +"{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c +"{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c +"{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c +"{ObjDir}psaux.c.o" \xC4 :src:psaux:psaux.c +"{ObjDir}pshinter.c.o" \xC4 :src:pshinter:pshinter.c +"{ObjDir}psmodule.c.o" \xC4 :src:psnames:psmodule.c +"{ObjDir}raster.c.o" \xC4 :src:raster:raster.c +"{ObjDir}sfnt.c.o" \xC4 :src:sfnt:sfnt.c +"{ObjDir}smooth.c.o" \xC4 :src:smooth:smooth.c +"{ObjDir}truetype.c.o" \xC4 :src:truetype:truetype.c +"{ObjDir}type1.c.o" \xC4 :src:type1:type1.c +"{ObjDir}type42.c.o" \xC4 :src:type42:type42.c +"{ObjDir}winfnt.c.o" \xC4 :src:winfonts:winfnt.c + + +### Optional Dependencies ### +### Build this target to generate "include file" dependencies. ### + +Dependencies \xC4 $OutOfDate + MakeDepend \xB6 + -append {MAKEFILE} \xB6 + -ignore "{CIncludes}" \xB6 + -objdir "{ObjDir}" \xB6 + -objext .o \xB6 + {Includes} \xB6 + {SrcFiles} + + diff --git a/src/3rdparty/freetype/builds/mac/FreeType.ppc_carbon.make.txt b/src/3rdparty/freetype/builds/mac/FreeType.ppc_carbon.make.txt new file mode 100644 index 0000000000..0b80deb4e9 --- /dev/null +++ b/src/3rdparty/freetype/builds/mac/FreeType.ppc_carbon.make.txt @@ -0,0 +1,211 @@ +# File: FreeType.ppc_carbon.make +# Target: FreeType.ppc_carbon +# Created: Friday, October 28, 2005 03:40:06 PM + + +MAKEFILE = FreeType.ppc_carbon.make +\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = :objs: +Includes = \xB6 + -ansi strict \xB6 + -includes unix \xB6 + -i :include: \xB6 + -i :src: \xB6 + -i :include:freetype:config: + +Sym-PPC = -sym off + +PPCCOptions = \xB6 + -d HAVE_FSSPEC=1 \xB6 + -d HAVE_FSREF=1 \xB6 + -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 + -d HAVE_QUICKDRAW_CARBON=1 \xB6 + -d HAVE_ATS=0 \xB6 + -d FT2_BUILD_LIBRARY \xB6 + -d FT_CONFIG_CONFIG_H="" \xB6 + -d FT_CONFIG_MODULES_H="" \xB6 + {Includes} {Sym-PPC} -d TARGET_API_MAC_CARBON=1 + + +### Source Files ### + +SrcFiles = \xB6 + :src:autofit:autofit.c \xB6 + :builds:mac:ftbase.c \xB6 + :src:base:ftbbox.c \xB6 + :src:base:ftbdf.c \xB6 + :src:base:ftbitmap.c \xB6 + :src:base:ftdebug.c \xB6 + :src:base:ftfstype.c \xB6 + :src:base:ftglyph.c \xB6 + :src:base:ftgxval.c \xB6 + :src:base:ftinit.c \xB6 + :src:base:ftmm.c \xB6 + :src:base:ftotval.c \xB6 + :src:base:ftpfr.c \xB6 + :src:base:ftstroke.c \xB6 + :src:base:ftsynth.c \xB6 + :src:base:ftsystem.c \xB6 + :src:base:fttype1.c \xB6 + :src:base:ftwinfnt.c \xB6 + :src:base:ftxf86.c \xB6 + :src:cache:ftcache.c \xB6 + :src:bdf:bdf.c \xB6 + :src:cff:cff.c \xB6 + :src:cid:type1cid.c \xB6 + :src:gxvalid:gxvalid.c \xB6 + :src:gzip:ftgzip.c \xB6 + :src:lzw:ftlzw.c \xB6 + :src:otvalid:otvalid.c \xB6 + :src:pcf:pcf.c \xB6 + :src:pfr:pfr.c \xB6 + :src:psaux:psaux.c \xB6 + :src:pshinter:pshinter.c \xB6 + :src:psnames:psmodule.c \xB6 + :src:raster:raster.c \xB6 + :src:sfnt:sfnt.c \xB6 + :src:smooth:smooth.c \xB6 + :src:truetype:truetype.c \xB6 + :src:type1:type1.c \xB6 + :src:type42:type42.c \xB6 + :src:winfonts:winfnt.c + + +### Object Files ### + +ObjFiles-PPC = \xB6 + "{ObjDir}autofit.c.x" \xB6 + "{ObjDir}ftbase.c.x" \xB6 + "{ObjDir}ftbbox.c.x" \xB6 + "{ObjDir}ftbdf.c.x" \xB6 + "{ObjDir}ftbitmap.c.x" \xB6 + "{ObjDir}ftdebug.c.x" \xB6 + "{ObjDir}ftfstype.c.x" \xB6 + "{ObjDir}ftglyph.c.x" \xB6 + "{ObjDir}ftgxval.c.x" \xB6 + "{ObjDir}ftinit.c.x" \xB6 + "{ObjDir}ftmm.c.x" \xB6 + "{ObjDir}ftotval.c.x" \xB6 + "{ObjDir}ftpfr.c.x" \xB6 + "{ObjDir}ftstroke.c.x" \xB6 + "{ObjDir}ftsynth.c.x" \xB6 + "{ObjDir}ftsystem.c.x" \xB6 + "{ObjDir}fttype1.c.x" \xB6 + "{ObjDir}ftwinfnt.c.x" \xB6 + "{ObjDir}ftxf86.c.x" \xB6 + "{ObjDir}ftcache.c.x" \xB6 + "{ObjDir}bdf.c.x" \xB6 + "{ObjDir}cff.c.x" \xB6 + "{ObjDir}type1cid.c.x" \xB6 + "{ObjDir}gxvalid.c.x" \xB6 + "{ObjDir}ftgzip.c.x" \xB6 + "{ObjDir}ftlzw.c.x" \xB6 + "{ObjDir}otvalid.c.x" \xB6 + "{ObjDir}pcf.c.x" \xB6 + "{ObjDir}pfr.c.x" \xB6 + "{ObjDir}psaux.c.x" \xB6 + "{ObjDir}pshinter.c.x" \xB6 + "{ObjDir}psmodule.c.x" \xB6 + "{ObjDir}raster.c.x" \xB6 + "{ObjDir}sfnt.c.x" \xB6 + "{ObjDir}smooth.c.x" \xB6 + "{ObjDir}truetype.c.x" \xB6 + "{ObjDir}type1.c.x" \xB6 + "{ObjDir}type42.c.x" \xB6 + "{ObjDir}winfnt.c.x" + + +### Libraries ### + +LibFiles-PPC = + + +### Default Rules ### + +.c.x \xC4 .c {\xA5MondoBuild\xA5} + {PPCC} {depDir}{default}.c -o {targDir}{default}.c.x {PPCCOptions} + + +### Build Rules ### + +:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c + Duplicate :src:base:ftbase.c :builds:mac:ftbase.c + +"{ObjDir}ftbase.c.x" \xC4\xC4 :builds:mac:ftbase.c + {PPCC} :builds:mac:ftbase.c -o {ObjDir}ftbase.c.x \xB6 + -i :builds:mac: \xB6 + -i :src:base: \xB6 + {PPCCOptions} + +FreeType.ppc_carbon \xC4\xC4 FreeType.ppc_carbon.o + +FreeType.ppc_carbon.o \xC4\xC4 {ObjFiles-PPC} {LibFiles-PPC} {\xA5MondoBuild\xA5} + PPCLink \xB6 + -o {Targ} \xB6 + {ObjFiles-PPC} \xB6 + {LibFiles-PPC} \xB6 + {Sym-PPC} \xB6 + -mf -d \xB6 + -t 'XCOF' \xB6 + -c 'MPS ' \xB6 + -xm l + + + +### Required Dependencies ### + +"{ObjDir}autofit.c.x" \xC4 :src:autofit:autofit.c +# "{ObjDir}ftbase.c.x" \xC4 :builds:mac:ftbase.c +"{ObjDir}ftbbox.c.x" \xC4 :src:base:ftbbox.c +"{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c +"{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c +"{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c +"{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c +"{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c +"{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c +"{ObjDir}ftinit.c.x" \xC4 :src:base:ftinit.c +"{ObjDir}ftmm.c.x" \xC4 :src:base:ftmm.c +"{ObjDir}ftotval.c.x" \xC4 :src:base:ftotval.c +"{ObjDir}ftpfr.c.x" \xC4 :src:base:ftpfr.c +"{ObjDir}ftstroke.c.x" \xC4 :src:base:ftstroke.c +"{ObjDir}ftsynth.c.x" \xC4 :src:base:ftsynth.c +"{ObjDir}ftsystem.c.x" \xC4 :src:base:ftsystem.c +"{ObjDir}fttype1.c.x" \xC4 :src:base:fttype1.c +"{ObjDir}ftwinfnt.c.x" \xC4 :src:base:ftwinfnt.c +"{ObjDir}ftxf86.c.x" \xC4 :src:base:ftxf86.c +"{ObjDir}ftcache.c.x" \xC4 :src:cache:ftcache.c +"{ObjDir}bdf.c.x" \xC4 :src:bdf:bdf.c +"{ObjDir}cff.c.x" \xC4 :src:cff:cff.c +"{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c +"{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c +"{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c +"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c +"{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c +"{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c +"{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c +"{ObjDir}psaux.c.x" \xC4 :src:psaux:psaux.c +"{ObjDir}pshinter.c.x" \xC4 :src:pshinter:pshinter.c +"{ObjDir}psmodule.c.x" \xC4 :src:psnames:psmodule.c +"{ObjDir}raster.c.x" \xC4 :src:raster:raster.c +"{ObjDir}sfnt.c.x" \xC4 :src:sfnt:sfnt.c +"{ObjDir}smooth.c.x" \xC4 :src:smooth:smooth.c +"{ObjDir}truetype.c.x" \xC4 :src:truetype:truetype.c +"{ObjDir}type1.c.x" \xC4 :src:type1:type1.c +"{ObjDir}type42.c.x" \xC4 :src:type42:type42.c +"{ObjDir}winfnt.c.x" \xC4 :src:winfonts:winfnt.c + + +### Optional Dependencies ### +### Build this target to generate "include file" dependencies. ### + +Dependencies \xC4 $OutOfDate + MakeDepend \xB6 + -append {MAKEFILE} \xB6 + -ignore "{CIncludes}" \xB6 + -objdir "{ObjDir}" \xB6 + -objext .x \xB6 + {Includes} \xB6 + {SrcFiles} + + diff --git a/src/3rdparty/freetype/builds/mac/FreeType.ppc_classic.make.txt b/src/3rdparty/freetype/builds/mac/FreeType.ppc_classic.make.txt new file mode 100644 index 0000000000..ffa23b2640 --- /dev/null +++ b/src/3rdparty/freetype/builds/mac/FreeType.ppc_classic.make.txt @@ -0,0 +1,212 @@ +# File: FreeType.ppc_classic.make +# Target: FreeType.ppc_classic +# Created: Thursday, October 27, 2005 07:42:43 PM + + +MAKEFILE = FreeType.ppc_classic.make +\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = :objs: +Includes = \xB6 + -ansi strict \xB6 + -includes unix \xB6 + -i :include: \xB6 + -i :src: \xB6 + -i :include:freetype:config: + +Sym-PPC = -sym off + +PPCCOptions = \xB6 + -d HAVE_FSSPEC=1 \xB6 + -d HAVE_FSREF=0 \xB6 + -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 + -d HAVE_QUICKDRAW_CARBON=0 \xB6 + -d HAVE_ATS=0 \xB6 + -d FT2_BUILD_LIBRARY \xB6 + -d FT_CONFIG_CONFIG_H="" \xB6 + -d FT_CONFIG_MODULES_H="" \xB6 + {Includes} {Sym-PPC} + + +### Source Files ### + +SrcFiles = \xB6 + :src:autofit:autofit.c \xB6 + :builds:mac:ftbase.c \xB6 + :src:base:ftbbox.c \xB6 + :src:base:ftbdf.c \xB6 + :src:base:ftbitmap.c \xB6 + :src:base:ftdebug.c \xB6 + :src:base:ftfstype.c \xB6 + :src:base:ftglyph.c \xB6 + :src:base:ftgxval.c \xB6 + :src:base:ftinit.c \xB6 + :src:base:ftmm.c \xB6 + :src:base:ftotval.c \xB6 + :src:base:ftpfr.c \xB6 + :src:base:ftstroke.c \xB6 + :src:base:ftsynth.c \xB6 + :src:base:ftsystem.c \xB6 + :src:base:fttype1.c \xB6 + :src:base:ftwinfnt.c \xB6 + :src:base:ftxf86.c \xB6 + :src:cache:ftcache.c \xB6 + :src:bdf:bdf.c \xB6 + :src:cff:cff.c \xB6 + :src:cid:type1cid.c \xB6 + :src:gxvalid:gxvalid.c \xB6 + :src:gzip:ftgzip.c \xB6 + :src:lzw:ftlzw.c \xB6 + :src:otvalid:otvalid.c \xB6 + :src:pcf:pcf.c \xB6 + :src:pfr:pfr.c \xB6 + :src:psaux:psaux.c \xB6 + :src:pshinter:pshinter.c \xB6 + :src:psnames:psmodule.c \xB6 + :src:raster:raster.c \xB6 + :src:sfnt:sfnt.c \xB6 + :src:smooth:smooth.c \xB6 + :src:truetype:truetype.c \xB6 + :src:type1:type1.c \xB6 + :src:type42:type42.c \xB6 + :src:winfonts:winfnt.c + + +### Object Files ### + +ObjFiles-PPC = \xB6 + "{ObjDir}autofit.c.x" \xB6 + "{ObjDir}ftbase.c.x" \xB6 + "{ObjDir}ftbbox.c.x" \xB6 + "{ObjDir}ftbdf.c.x" \xB6 + "{ObjDir}ftbitmap.c.x" \xB6 + "{ObjDir}ftdebug.c.x" \xB6 + "{ObjDir}ftfstype.c.x" \xB6 + "{ObjDir}ftglyph.c.x" \xB6 + "{ObjDir}ftgxval.c.x" \xB6 + "{ObjDir}ftinit.c.x" \xB6 + "{ObjDir}ftmm.c.x" \xB6 + "{ObjDir}ftotval.c.x" \xB6 + "{ObjDir}ftpfr.c.x" \xB6 + "{ObjDir}ftstroke.c.x" \xB6 + "{ObjDir}ftsynth.c.x" \xB6 + "{ObjDir}ftsystem.c.x" \xB6 + "{ObjDir}fttype1.c.x" \xB6 + "{ObjDir}ftwinfnt.c.x" \xB6 + "{ObjDir}ftxf86.c.x" \xB6 + "{ObjDir}ftcache.c.x" \xB6 + "{ObjDir}bdf.c.x" \xB6 + "{ObjDir}cff.c.x" \xB6 + "{ObjDir}type1cid.c.x" \xB6 + "{ObjDir}gxvalid.c.x" \xB6 + "{ObjDir}ftgzip.c.x" \xB6 + "{ObjDir}ftlzw.c.x" \xB6 + "{ObjDir}otvalid.c.x" \xB6 + "{ObjDir}pcf.c.x" \xB6 + "{ObjDir}pfr.c.x" \xB6 + "{ObjDir}psaux.c.x" \xB6 + "{ObjDir}pshinter.c.x" \xB6 + "{ObjDir}psmodule.c.x" \xB6 + "{ObjDir}raster.c.x" \xB6 + "{ObjDir}sfnt.c.x" \xB6 + "{ObjDir}smooth.c.x" \xB6 + "{ObjDir}truetype.c.x" \xB6 + "{ObjDir}type1.c.x" \xB6 + "{ObjDir}type42.c.x" \xB6 + "{ObjDir}winfnt.c.x" + + +### Libraries ### + +LibFiles-PPC = + + +### Default Rules ### + +.c.x \xC4 .c {\xA5MondoBuild\xA5} + {PPCC} {depDir}{default}.c -o {targDir}{default}.c.x {PPCCOptions} + + +### Build Rules ### + +:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c + Duplicate :src:base:ftbase.c :builds:mac:ftbase.c + +"{ObjDir}ftbase.c.x" \xC4\xC4 :builds:mac:ftbase.c + {PPCC} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.x" \xB6 + -i :builds:mac: \xB6 + -i :src:base: \xB6 + {PPCCOptions} + +FreeType.ppc_classic \xC4\xC4 FreeType.ppc_classic.o + +FreeType.ppc_classic.o \xC4\xC4 {ObjFiles-PPC} {LibFiles-PPC} {\xA5MondoBuild\xA5} + PPCLink \xB6 + -o {Targ} \xB6 + {ObjFiles-PPC} \xB6 + {LibFiles-PPC} \xB6 + {Sym-PPC} \xB6 + -mf -d \xB6 + -t 'XCOF' \xB6 + -c 'MPS ' \xB6 + -xm l + + + +### Required Dependencies ### + +"{ObjDir}autofit.c.x" \xC4 :src:autofit:autofit.c +# "{ObjDir}ftbase.c.x" \xC4 :builds:mac:ftbase.c +"{ObjDir}ftbbox.c.x" \xC4 :src:base:ftbbox.c +"{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c +"{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c +"{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c +"{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c +"{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c +"{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c +"{ObjDir}ftinit.c.x" \xC4 :src:base:ftinit.c +"{ObjDir}ftmm.c.x" \xC4 :src:base:ftmm.c +"{ObjDir}ftotval.c.x" \xC4 :src:base:ftotval.c +"{ObjDir}ftpfr.c.x" \xC4 :src:base:ftpfr.c +"{ObjDir}ftstroke.c.x" \xC4 :src:base:ftstroke.c +"{ObjDir}ftsynth.c.x" \xC4 :src:base:ftsynth.c +"{ObjDir}ftsystem.c.x" \xC4 :src:base:ftsystem.c +"{ObjDir}fttype1.c.x" \xC4 :src:base:fttype1.c +"{ObjDir}ftwinfnt.c.x" \xC4 :src:base:ftwinfnt.c +"{ObjDir}ftxf86.c.x" \xC4 :src:base:ftxf86.c +"{ObjDir}ftcache.c.x" \xC4 :src:cache:ftcache.c +"{ObjDir}bdf.c.x" \xC4 :src:bdf:bdf.c +"{ObjDir}cff.c.x" \xC4 :src:cff:cff.c +"{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c +"{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c +"{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c +"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c +"{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c +"{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c +"{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c +"{ObjDir}psaux.c.x" \xC4 :src:psaux:psaux.c +"{ObjDir}pshinter.c.x" \xC4 :src:pshinter:pshinter.c +"{ObjDir}psmodule.c.x" \xC4 :src:psnames:psmodule.c +"{ObjDir}raster.c.x" \xC4 :src:raster:raster.c +"{ObjDir}sfnt.c.x" \xC4 :src:sfnt:sfnt.c +"{ObjDir}smooth.c.x" \xC4 :src:smooth:smooth.c +"{ObjDir}truetype.c.x" \xC4 :src:truetype:truetype.c +"{ObjDir}type1.c.x" \xC4 :src:type1:type1.c +"{ObjDir}type42.c.x" \xC4 :src:type42:type42.c +"{ObjDir}winfnt.c.x" \xC4 :src:winfonts:winfnt.c + + + +### Optional Dependencies ### +### Build this target to generate "include file" dependencies. ### + +Dependencies \xC4 $OutOfDate + MakeDepend \xB6 + -append {MAKEFILE} \xB6 + -ignore "{CIncludes}" \xB6 + -objdir "{ObjDir}" \xB6 + -objext .x \xB6 + {Includes} \xB6 + {SrcFiles} + + diff --git a/src/3rdparty/freetype/builds/mac/README b/src/3rdparty/freetype/builds/mac/README new file mode 100644 index 0000000000..3bedfcac32 --- /dev/null +++ b/src/3rdparty/freetype/builds/mac/README @@ -0,0 +1,403 @@ +This folder contains + + * Makefile skeltons for Apple MPW (Macintosh's Programmers Workshop) + + * Python script to generate MPW makefile from skelton + + * Metrowerks CodeWarrior 9.0 project file in XML format + +------------------------------------------------------------ + +1. What is this +--------------- + +Files in this directory are designed to build FreeType +running on classic MacOS. To build FreeType running on +Mac OS X, build as the system is UNIX. + +However, Mac OS X is most useful to manipulate files in +vanilla FreeType to fit classic MacOS. + +The information about MacOS specific API is written in +appendix of this document. + +2. Requirement +-------------- + +You can use MPW: a free-charged developer environment +by Apple, or CodeWarrior: a commercial developer +environment by Metrowerks. GCC for MPW and Symantec +"Think C" are not tested at present. + + + 2-1. Apple MPW + -------------- + + Following C compilers are tested: + + m68k target: Apple SC 8.9.0d3e1 + ppc target: Apple MrC 5.0.0d3c1 + + The final MPW-GM (official release on 1999/Dec) is too + old and cannot compile FreeType, because bundled C + compilers cannot search header files in sub directories. + Updating by the final MPW-PR (pre-release on 2001/Feb) + is required. + + Required files are downloadable from: + + http://developer.apple.com/tools/mpw-tools/index.html + + Also you can find documents how to update by MPW-PR. + + Python is required to restore MPW makefiles from the + skeltons. Python bundled to Mac OS X is enough. For + classic MacOS, MacPython is available: + + http://homepages.cwi.nl/~jack/macpython/ + + MPW requires all files are typed by resource fork. + ResEdit bundled to MPW is enough. In Mac OS X, + /Developer/Tools/SetFile of DevTool is useful to + manipulate from commandline. + + 2-2. Metrowerks CodeWarrior + --------------------------- + + XML project file is generated and tested by + CodeWarrior 9.0. Older versions are not tested + at all. At present, static library for ppc target + is available in the project file. + + +3. How to build +--------------- + + 3-1. Apple MPW + -------------- + Detailed building procedure by Apple MPW is + described in following. + + 3-1-1. Generate MPW makefiles from the skeltons + ------------------------------------------------ + + Here are 4 skeltons for following targets are + included. + + - FreeType.m68k_far.make.txt + Ancient 32bit binary executable format for + m68k MacOS: System 6, with 32bit addressing + mode (far-pointer-model) So-called "Toolbox" + API is used. + + - FreeType.m68k_cfm.make.txt + CFM binary executable format for m68k MacOS: + System 7. So-called "Toolbox" API is used. + + - FreeType.ppc_classic.make.txt + CFM binary executable format for ppc MacOS: + System 7, MacOS 8, MacOS 9. So-called "Toolbox" + API is used. + + - FreeType.ppc_classic.make.txt + CFM binary executable format for ppc MacOS: + MacOS 9. Carbon API is used. + + At present, static library is only supported, + although targets except of m68k_far are capable + to use shared library. + + MPW makefile syntax uses 8bit characters. To keep + from violating them during version control, here + we store skeltons in pure ASCII format. You must + generate MPW makefile by Python script ascii2mpw.py. + + In Mac OS X terminal, you can convert as: + + python builds/mac/ascii2mpw.py \ + < builds/mac/FreeType.m68k_far.make.txt \ + > FreeType.m68k_far.make + + The skeltons are designed to use in the top + directory where there are builds, include, src etc. + You must name the generated MPW makefile by removing + ".txt" from source skelton name. + + 3-1-2. Add resource forks to related files + ------------------------------------------ + + MPW's Make and C compilers cannot recognize files + without resource fork. You have to add resource + fork to the files that MPW uses. In Mac OS X + terminal of the system, you can do as: + + find . -name '*.[ch]' -exec \ + /Developer/Tools/SetFile -a l -c "MPS " -t TEXT \{\} \; + + find . -name '*.make' -exec \ + /Developer/Tools/SetFile -a l -c "MPS " -t TEXT \{\} \; + + + 3-1-3. Open MPW shell and build + ------------------------------- + + Open MPW shell and go to the top directory that + FreeType sources are extracted (MPW makefile must + be located in there), from "Set Directory" in + "Directory" menu. + + Choose "Build" from "Build" menu, and type the + name of project by removing ".make" from MPW + makefile, as: FreeType.m68k_far + + If building is successfully finished, you can find + built library in objs/ directory. + + + 3-2. Metrowerks CodeWarrior + --------------------------- + + Detailed building procedure by Metrowerks + CodeWarrior (CW) 9.0 is described in following. + + 3-2-1. Import XML project file + ------------------------------ + + CW XML project file is not ready for double- + click. Start CodeWarrior IDE, and choose + "Import project" in "File" menu. Choose XML + project file: builds/mac/ftlib.prj.xml. + In next, you will be asked where to save CW + native project file: you must choose + "builds/mac/ftlib.prj". The project file is + designed with relative path from there. After + CW native project file is generated, it is + automatically loaded, small project window + titled "ftlib.prj" is displayed. + + 3-2-2. Building + --------------- + Choose "Make" from "Project" menu. If building + is successfully finished, you can find built + library at objs/FreeTypeLib. + +4. TODO +------- + + 4-1. All modules should be included + ----------------------------------- + + At present, MPW makefiles and CW project file are + just updated versions of these by Leonard. Some + modules are added after the last maintenance, they + are not included. + + 4-2. Working test with ftdemos + ------------------------------ + + At present, MPW makefiles and CW project file can + build FreeType for classic MacOS. But their working + behaviours are not tested at all. Building ftdemos + for classic MacOS and working test is required. + + 4-3. Porting Jam onto MPW + ------------------------- + + FreeType uses Jam (and FT-Jam) for unified cross- + platform building tool. At present, Jam is not ported + to MPW. To update classic MacOS support easily, + building by Jam is expected on MPW. + + +APPENDIX I +---------- + + A-1. Framework dependencies + --------------------------- + + src/base/ftmac.c adds two Mac-specific features to + FreeType. These features are based on MacOS libraries. + + * accessing resource-fork font + The fonts for classic MacOS store their graphical data + in resource forks which cannot be accessed via ANSI C + functions. FreeType2 provides functions to handle such + resource fork fonts, they are based on File Manager + framework of MacOS. In addition, HFS and HFS+ file + system driver of Linux is supported. Following + functions are for this purpose. + + FT_New_Face_From_Resource() + FT_New_Face_From_FSSpec() + FT_New_Face_From_FSRef() + + * resolving font name to font file + The font menu of MacOS application prefers font name + written in FOND resource than sfnt resource. FreeType2 + provides functions to find font file by name in MacOS + application, they are based on QuickDraw Font Manager + and Apple Type Service framework of MacOS. + + FT_GetFile_From_Mac_Name() + FT_GetFile_From_Mac_ATS_Name() + + Working functions for each MacOS are summarized as + following. + + upto MacOS 6: + not tested (you have to obtain MPW 2.x) + + MacOS 7.x, 8.x, 9.x (without CarbonLib): + FT_GetFile_From_Mac_Name() + FT_New_Face_From_Resource() + FT_New_Face_From_FSSpec() + + MacOS 9.x (with CarbonLib): + FT_GetFile_From_Mac_Name() + FT_New_Face_From_Resource() + FT_New_Face_From_FSSpec() + FT_New_Face_From_FSRef() + + Mac OS X upto 10.4.x: + FT_GetFile_From_Mac_Name() deprecated + FT_New_Face_From_FSSpec() deprecated + FT_GetFile_From_Mac_ATS_Name() deprecated? + FT_New_Face_From_FSRef() + + A-2. Deprecated Functions + ------------------------- + + A-2-1. FileManager + ------------------ + + For convenience to write MacOS application, ftmac.c + provides functions to specify a file by FSSpec and FSRef, + because the file identification pathname had ever been + unrecommended method in MacOS programming. + + Toward to MacOS X 10.4 & 5, Carbon functions using FSSpec + datatype is noticed as deprecated, and recommended to + migrate to FSRef datatype. The big differences of FSRef + against FSSpec are explained in Apple TechNotes 2078. + + http://developer.apple.com/technotes/tn2002/tn2078.html + + - filename length: the max length of file + name of FSRef is 255 chars (it is limit of HFS+), + that of FSSpec is 31 chars (it is limit of HFS). + + - filename encoding: FSSpec is localized by + legacy encoding for each language system, + FSRef is Unicode enabled. + + A-2-2. FontManager + ------------------ + + Following functions receive QuickDraw fontname: + + FT_GetFile_From_Mac_Name() + + QuickDraw is deprecated and replaced by Quartz + since Mac OS X 10.4. They are still kept for + backward compatibility. By undefinition of + HAVE_QUICKDRAW in building, you can change these + functions to return FT_Err_Unimplemented always. + + Replacement functions are added for migration. + + FT_GetFile_From_Mac_ATS_Name() + + They are usable on Mac OS X only. On older systems, + these functions return FT_Err_Unimplemented always. + + The detailed incompatibilities and possibility + of FontManager emulation without QuickDraw is + explained in + + http://www.gyve.org/~mpsuzuki/ats_benchmark.html + + A-3. Framework Availabilities + ----------------------------- + + The framework of MacOS are often revised, especially + when new format of binary executable is introduced. + Following table is the minimum version of frameworks + to use functions used in FreeType2. The table is + extracted from MPW header files for assembly language. + + *** NOTE *** + The conditional definition of available data type + in MPW compiler is insufficient. You can compile + program using FSRef data type for older systems + (MacOS 7, 8) that don't know FSRef data type. + + + +-------------------+-----------------------------+ + CPU | mc680x0 | PowerPC | + +---------+---------+---------+---------+---------+ + Binary Executable Format | Classic | 68K-CFM | CFM | CFM | Mach-O | + +---------+---------+---------+---------+---------+ + Framework API | Toolbox | Toolbox | Toolbox | Carbon | Carbon | + +---------+---------+---------+---------+---------+ + + +---------+---------+---------+---------+---------+ + | ?(*) |Interface|Interface|CarbonLib|Mac OS X | + | |Lib |Lib | | | +* Files.h +---------+---------+---------+---------+---------+ +PBGetFCBInfoSync() | o | 7.1- | 7.1- | 1.0- | o | +FSMakeFSSpec() | o | 7.1- | 7.1- | 1.0- | o | +FSGetForkCBInfo() | o | (**) | 9.0- | 1.0- | o | +FSpMakeFSRef() | o | (**) | 9.0- | 1.0- | o | +FSGetCatalogInfo() | o | (**) | 9.0- | 1.0- | -10.3 | +FSPathMakeRef() | x | x | x | 1.1- | -10.3 | + +---------+---------+---------+---------+---------+ + + +---------+---------+---------+---------+---------+ + | ?(*) |Font |Font |CarbonLib|Mac OS X | + | |Manager |Manager | | | +* Fonts.h +---------+---------+---------+---------+---------+ +FMCreateFontFamilyIterator() | x | x | 9.0- | 1.0- | -10.3 | +FMDisposeFontFamilyIterator() | x | x | 9.0- | 1.0- | -10.3 | +FMGetNextFontFamily() | x | x | 9.0- | 1.0- | -10.3 | +FMGetFontFamilyName() | x | x | 9.0- | 1.0- | -10.3 | +FMCreateFontFamilyInstanceIterator() | x | x | 9.0- | 1.0- | -10.3 | +FMDisposeFontFamilyInstanceIterator() | x | x | 9.0- | 1.0- | -10.3 | +FMGetNextFontFamilyInstance() | x | x | 9.0- | 1.0- | -10.3 | + +---------+---------+---------+---------+---------+ + + +---------+---------+---------+---------+---------+ + | - | - | - |CarbonLib|Mac OS X | +* ATSFont.h (***) +---------+---------+---------+---------+---------+ +ATSFontFindFromName() | x | x | x | x | o | +ATSFontGetFileSpecification() | x | x | x | x | o | + +---------+---------+---------+---------+---------+ + + (*) + In the "Classic": the original binary executable + format, these framework functions are directly + transformed to MacOS system call. Therefore, the + exact availability should be checked by running + system. + + (**) + InterfaceLib is bundled to MacOS and its version + is usually equal to MacOS. There's no separate + update for InterfaceLib. It is supposed that + there's no InterfaceLib 9.x for m68k platforms. + In fact, these functions are FSRef dependent. + + (***) + ATSUI framework is available on ATSUnicode 8.5 on + ppc Toolbox CFM, CarbonLib 1.0 too. But its base: + ATS font manager is not published in these versions. + +------------------------------------------------------------ +Last update: 2007-Feb-01, by Alexei Podtelezhnikov. + +Currently maintained by + suzuki toshiya, +Originally prepared by + Leonard Rosenthol, + Just van Rossum, + +This directory is now actively maintained as part of the FreeType Project. diff --git a/src/3rdparty/freetype/builds/mac/ascii2mpw.py b/src/3rdparty/freetype/builds/mac/ascii2mpw.py new file mode 100755 index 0000000000..ad32b21977 --- /dev/null +++ b/src/3rdparty/freetype/builds/mac/ascii2mpw.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +import sys +import string + +if len( sys.argv ) == 1 : + for asc_line in sys.stdin.readlines(): + mpw_line = string.replace(asc_line, "\\xA5", "\245") + mpw_line = string.replace(mpw_line, "\\xB6", "\266") + mpw_line = string.replace(mpw_line, "\\xC4", "\304") + mpw_line = string.replace(mpw_line, "\\xC5", "\305") + mpw_line = string.replace(mpw_line, "\\xFF", "\377") + mpw_line = string.replace(mpw_line, "\n", "\r") + mpw_line = string.replace(mpw_line, "\\n", "\n") + sys.stdout.write(mpw_line) +elif sys.argv[1] == "-r" : + for mpw_line in sys.stdin.readlines(): + asc_line = string.replace(mpw_line, "\n", "\\n") + asc_line = string.replace(asc_line, "\r", "\n") + asc_line = string.replace(asc_line, "\245", "\\xA5") + asc_line = string.replace(asc_line, "\266", "\\xB6") + asc_line = string.replace(asc_line, "\304", "\\xC4") + asc_line = string.replace(asc_line, "\305", "\\xC5") + asc_line = string.replace(asc_line, "\377", "\\xFF") + sys.stdout.write(asc_line) diff --git a/src/3rdparty/freetype/builds/mac/ftlib.prj.xml b/src/3rdparty/freetype/builds/mac/ftlib.prj.xml new file mode 100644 index 0000000000..cbbc45ee55 --- /dev/null +++ b/src/3rdparty/freetype/builds/mac/ftlib.prj.xml @@ -0,0 +1,1194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + FreeTypeLib + + + + UserSourceTrees + + + AlwaysSearchUserPathstrue + InterpretDOSAndUnixPathstrue + RequireFrameworkStyleIncludesfalse + SourceRelativeIncludesfalse + UserSearchPaths + + SearchPath + Path: + PathFormatMacOS + PathRootProject + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + SearchPath + Path:::include: + PathFormatMacOS + PathRootProject + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + SearchPath + Path:::src: + PathFormatMacOS + PathRootProject + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + SearchPath + Path:: + PathFormatMacOS + PathRootProject + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + SystemSearchPaths + + SearchPath + Path: + PathFormatMacOS + PathRootCodeWarrior + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + + + MWRuntimeSettings_WorkingDirectory + MWRuntimeSettings_CommandLine + MWRuntimeSettings_HostApplication + Path + PathFormatGeneric + PathRootAbsolute + + MWRuntimeSettings_EnvVars + + + LinkerMacOS PPC Linker + PreLinker + PostLinker + TargetnameFreeTypeLib + OutputDirectory + Path:::objs: + PathFormatMacOS + PathRootProject + + SaveEntriesUsingRelativePathsfalse + + + FileMappings + + FileTypeAPPL + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeAppl + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeMMLB + FileExtension + CompilerLib Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeMPLF + FileExtension + CompilerLib Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeMWCD + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeRSRC + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.bh + CompilerBalloon Help + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.c + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.c++ + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.cc + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.cp + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.cpp + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.exp + Compiler + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.h + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMaketrue + + + FileTypeTEXT + FileExtension.p + CompilerMW Pascal PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.pas + CompilerMW Pascal PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.pch + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompiletrue + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.pch++ + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompiletrue + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.ppu + CompilerMW Pascal PPC + EditLanguage + Precompiletrue + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.r + CompilerRez + EditLanguageRez + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.s + CompilerPPCAsm + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeXCOF + FileExtension + CompilerXCOFF Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypedocu + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypersrc + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeshlb + FileExtension + CompilerPEF Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypestub + FileExtension + CompilerPEF Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileExtension.doc + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFilefalse + IgnoredByMaketrue + + + FileExtension.o + CompilerXCOFF Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileExtension.ppob + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileExtension.rsrc + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + + + CacheModDatestrue + DumpBrowserInfofalse + CacheSubprojectstrue + UseThirdPartyDebuggerfalse + BrowserGenerator1 + DebuggerAppPath + Path + PathFormatGeneric + PathRootAbsolute + + DebuggerCmdLineArgs + DebuggerWorkingDir + Path + PathFormatGeneric + PathRootAbsolute + + CodeCompletionPrefixFileNameMacHeaders.c + CodeCompletionMacroFileNameMacOS_Carbon_C++_Macros.h + + + ConsoleEncoding0 + LogSystemMessagestrue + AutoTargetDLLsfalse + StopAtWatchpointstrue + PauseWhileRunningfalse + PauseInterval5 + PauseUIFlags0 + AltExePath + Path + PathFormatGeneric + PathRootAbsolute + + StopAtTempBPOnLaunchtrue + CacheSymbolicstrue + TempBPFunctionNamemain + TempBPType0 + + + Enabledfalse + ConnectionName + DownloadPath + LaunchRemoteAppfalse + RemoteAppPath + CoreID0 + JTAGClockSpeed8000 + IsMultiCorefalse + OSDownloadfalse + UseGlobalOSDownloadfalse + OSDownloadConnectionName + OSDownloadPath + AltDownloadfalse + AltDownloadConnectionName + + + OtherExecutables + + + AnalyzerConnectionName + + + CustomColor1 + Red0 + Green32767 + Blue0 + + CustomColor2 + Red0 + Green32767 + Blue0 + + CustomColor3 + Red0 + Green32767 + Blue0 + + CustomColor4 + Red0 + Green32767 + Blue0 + + + + MWFrontEnd_C_cplusplus0 + MWFrontEnd_C_checkprotos1 + MWFrontEnd_C_arm0 + MWFrontEnd_C_trigraphs0 + MWFrontEnd_C_onlystdkeywords0 + MWFrontEnd_C_enumsalwaysint0 + MWFrontEnd_C_ansistrict1 + MWFrontEnd_C_wchar_type1 + MWFrontEnd_C_enableexceptions1 + MWFrontEnd_C_dontreusestrings0 + MWFrontEnd_C_poolstrings0 + MWFrontEnd_C_dontinline0 + MWFrontEnd_C_useRTTI1 + MWFrontEnd_C_unsignedchars0 + MWFrontEnd_C_autoinline0 + MWFrontEnd_C_booltruefalse1 + MWFrontEnd_C_inlinelevel0 + MWFrontEnd_C_ecplusplus0 + MWFrontEnd_C_defer_codegen0 + MWFrontEnd_C_templateparser0 + MWFrontEnd_C_c990 + MWFrontEnd_C_bottomupinline1 + MWFrontEnd_C_gcc_extensions0 + MWFrontEnd_C_instance_manager0 + + + C_CPP_Preprocessor_EmitFiletrue + C_CPP_Preprocessor_EmitLinefalse + C_CPP_Preprocessor_EmitFullPathfalse + C_CPP_Preprocessor_KeepCommentsfalse + C_CPP_Preprocessor_PCHUsesPrefixTextfalse + C_CPP_Preprocessor_EmitPragmastrue + C_CPP_Preprocessor_KeepWhiteSpacefalse + C_CPP_Preprocessor_MultiByteEncodingencASCII_Unicode + C_CPP_Preprocessor_PrefixText/* settings imported from old "C/C++ Language" panel */ + +#if !__option(precompile) +#include "ftoption.h" /* was "Prefix file" */ +#endif + + + + MWWarning_C_warn_illpragma0 + MWWarning_C_warn_emptydecl0 + MWWarning_C_warn_possunwant0 + MWWarning_C_warn_unusedvar1 + MWWarning_C_warn_unusedarg1 + MWWarning_C_warn_extracomma0 + MWWarning_C_pedantic0 + MWWarning_C_warningerrors0 + MWWarning_C_warn_hidevirtual0 + MWWarning_C_warn_implicitconv0 + MWWarning_C_warn_notinlined0 + MWWarning_C_warn_structclass0 + MWWarning_C_warn_missingreturn0 + MWWarning_C_warn_no_side_effect0 + MWWarning_C_warn_resultnotused0 + MWWarning_C_warn_padding0 + MWWarning_C_warn_impl_i2f_conv0 + MWWarning_C_warn_impl_f2i_conv0 + MWWarning_C_warn_impl_s2u_conv0 + MWWarning_C_warn_illtokenpasting0 + MWWarning_C_warn_filenamecaps0 + MWWarning_C_warn_filenamecapssystem0 + MWWarning_C_warn_undefmacro0 + MWWarning_C_warn_ptrintconv0 + + + MWMerge_MacOS_projectTypeApplication + MWMerge_MacOS_outputNameMerge Out + MWMerge_MacOS_outputCreator???? + MWMerge_MacOS_outputTypeAPPL + MWMerge_MacOS_suppressWarning0 + MWMerge_MacOS_copyFragments1 + MWMerge_MacOS_copyResources1 + MWMerge_MacOS_flattenResource0 + MWMerge_MacOS_flatFileNamea.rsrc + MWMerge_MacOS_flatFileOutputPath + Path: + PathFormatMacOS + PathRootProject + + MWMerge_MacOS_skipResources + DLGX + ckid + Proj + WSPC + + + + FileLockedfalse + ResourcesMapIsReadOnlyfalse + PrinterDriverIsMultiFinderCompatiblefalse + Invisiblefalse + HasBundlefalse + NameLockedfalse + Stationeryfalse + HasCustomIconfalse + Sharedfalse + HasBeenInitedfalse + Label0 + Comments + HasCustomBadgefalse + HasRoutingInfofalse + + + MWCodeGen_PPC_structalignmentPPC_mw + MWCodeGen_PPC_tracebacktablesNone + MWCodeGen_PPC_processorGeneric + MWCodeGen_PPC_function_align4 + MWCodeGen_PPC_tocdata1 + MWCodeGen_PPC_largetoc0 + MWCodeGen_PPC_profiler0 + MWCodeGen_PPC_vectortocdata0 + MWCodeGen_PPC_poolconst0 + MWCodeGen_PPC_peephole0 + MWCodeGen_PPC_readonlystrings0 + MWCodeGen_PPC_linkerpoolsstrings0 + MWCodeGen_PPC_volatileasm0 + MWCodeGen_PPC_schedule0 + MWCodeGen_PPC_altivec0 + MWCodeGen_PPC_altivec_move_block0 + MWCodeGen_PPC_strictIEEEfp0 + MWCodeGen_PPC_fpcontract1 + MWCodeGen_PPC_genfsel0 + MWCodeGen_PPC_orderedfpcmp0 + + + MWCodeGen_MachO_structalignmentPPC_mw + MWCodeGen_MachO_profiler_enumOff + MWCodeGen_MachO_processorGeneric + MWCodeGen_MachO_function_align4 + MWCodeGen_MachO_common0 + MWCodeGen_MachO_boolisint0 + MWCodeGen_MachO_peephole1 + MWCodeGen_MachO_readonlystrings0 + MWCodeGen_MachO_linkerpoolsstrings1 + MWCodeGen_MachO_volatileasm0 + MWCodeGen_MachO_schedule0 + MWCodeGen_MachO_altivec0 + MWCodeGen_MachO_vecmove0 + MWCodeGen_MachO_fp_ieee_strict0 + MWCodeGen_MachO_fpcontract1 + MWCodeGen_MachO_genfsel0 + MWCodeGen_MachO_fp_cmps_ordered0 + + + MWDisassembler_PPC_showcode1 + MWDisassembler_PPC_extended1 + MWDisassembler_PPC_mix0 + MWDisassembler_PPC_nohex0 + MWDisassembler_PPC_showdata1 + MWDisassembler_PPC_showexceptions1 + MWDisassembler_PPC_showsym0 + MWDisassembler_PPC_shownames1 + + + GlobalOptimizer_PPC_optimizationlevelLevel0 + GlobalOptimizer_PPC_optforSpeed + + + MWLinker_PPC_linksym1 + MWLinker_PPC_symfullpath1 + MWLinker_PPC_linkmap0 + MWLinker_PPC_nolinkwarnings0 + MWLinker_PPC_dontdeadstripinitcode0 + MWLinker_PPC_permitmultdefs0 + MWLinker_PPC_linkmodeFast + MWLinker_PPC_code_foldingNone + MWLinker_PPC_initname + MWLinker_PPC_mainname + MWLinker_PPC_termname + + + MWLinker_MacOSX_linksym1 + MWLinker_MacOSX_symfullpath0 + MWLinker_MacOSX_nolinkwarnings0 + MWLinker_MacOSX_linkmap0 + MWLinker_MacOSX_dontdeadstripinitcode0 + MWLinker_MacOSX_permitmultdefs0 + MWLinker_MacOSX_use_objectivec_semantics0 + MWLinker_MacOSX_strip_debug_symbols0 + MWLinker_MacOSX_split_segs0 + MWLinker_MacOSX_report_msl_overloads0 + MWLinker_MacOSX_objects_follow_linkorder0 + MWLinker_MacOSX_linkmodeNormal + MWLinker_MacOSX_exportsReferencedGlobals + MWLinker_MacOSX_sortcodeNone + MWLinker_MacOSX_mainname + MWLinker_MacOSX_initname + MWLinker_MacOSX_code_foldingNone + MWLinker_MacOSX_stabsgenNone + + + MWProject_MacOSX_typeExecutable + MWProject_MacOSX_outfile + MWProject_MacOSX_filecreator???? + MWProject_MacOSX_filetypeMEXE + MWProject_MacOSX_vmaddress4096 + MWProject_MacOSX_usedefaultvmaddr1 + MWProject_MacOSX_flatrsrc0 + MWProject_MacOSX_flatrsrcfilename + MWProject_MacOSX_flatrsrcoutputdir + Path: + PathFormatMacOS + PathRootProject + + MWProject_MacOSX_installpath./ + MWProject_MacOSX_dont_prebind0 + MWProject_MacOSX_flat_namespace0 + MWProject_MacOSX_frameworkversionA + MWProject_MacOSX_currentversion0 + MWProject_MacOSX_flat_oldimpversion0 + MWProject_MacOSX_AddrMode1 + + + MWPEF_exportsNone + MWPEF_libfolder0 + MWPEF_sortcodeNone + MWPEF_expandbss0 + MWPEF_sharedata0 + MWPEF_olddefversion0 + MWPEF_oldimpversion0 + MWPEF_currentversion0 + MWPEF_fragmentname + MWPEF_collapsereloads0 + + + MWProject_PPC_typeLibrary + MWProject_PPC_outfileFreeTypeLib + MWProject_PPC_filecreator???? + MWProject_PPC_filetype???? + MWProject_PPC_size0 + MWProject_PPC_minsize0 + MWProject_PPC_stacksize0 + MWProject_PPC_flags0 + MWProject_PPC_symfilename + MWProject_PPC_rsrcname + MWProject_PPC_rsrcheaderNative + MWProject_PPC_rsrctype???? + MWProject_PPC_rsrcid0 + MWProject_PPC_rsrcflags0 + MWProject_PPC_rsrcstore0 + MWProject_PPC_rsrcmerge0 + MWProject_PPC_flatrsrc0 + MWProject_PPC_flatrsrcoutputdir + Path: + PathFormatMacOS + PathRootProject + + MWProject_PPC_flatrsrcfilename + + + MWAssembler_PPC_auxheader0 + MWAssembler_PPC_symmodeMac + MWAssembler_PPC_dialectPPC + MWAssembler_PPC_prefixfile + MWAssembler_PPC_typecheck0 + MWAssembler_PPC_warnings0 + MWAssembler_PPC_casesensitive0 + + + PList_OutputTypeFile + PList_OutputEncodingUTF-8 + PList_PListVersion1.0 + PList_Prefix + PList_FileFilenameInfo.plist + PList_FileDirectory + Path: + PathFormatMacOS + PathRootProject + + PList_ResourceTypeplst + PList_ResourceID0 + PList_ResourceName + + + MWRez_Language_maxwidth80 + MWRez_Language_scriptRoman + MWRez_Language_alignmentAlign1 + MWRez_Language_filtermodeFilterSkip + MWRez_Language_suppresswarnings0 + MWRez_Language_escapecontrolchars1 + MWRez_Language_prefixname + MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' + + + + Name + ftsystem.c + MacOS + Text + Debug + + + Name + ftbase.c + MacOS + Text + Debug + + + Name + ftinit.c + MacOS + Text + Debug + + + Name + sfnt.c + MacOS + Text + Debug + + + Name + psnames.c + MacOS + Text + Debug + + + Name + ftdebug.c + MacOS + Text + Debug + + + Name + type1cid.c + MacOS + Text + Debug + + + Name + cff.c + MacOS + Text + Debug + + + Name + smooth.c + MacOS + Text + Debug + + + Name + winfnt.c + MacOS + Text + Debug + + + Name + truetype.c + MacOS + Text + Debug + + + Name + ftmac.c + MacOS + Text + Debug + + + Name + psaux.c + MacOS + Text + + + + Name + ftcache.c + MacOS + Text + + + + Name + ftglyph.c + MacOS + Text + + + + Name + type1.c + MacOS + Text + Debug + + + Name + pshinter.c + MacOS + Text + Debug + + + Name + pcf.c + MacOS + Text + Debug + + + Name + ftraster.c + MacOS + Text + Debug + + + Name + ftrend1.c + MacOS + Text + Debug + + + + + Name + ftsystem.c + MacOS + + + Name + ftbase.c + MacOS + + + Name + ftinit.c + MacOS + + + Name + sfnt.c + MacOS + + + Name + psnames.c + MacOS + + + Name + ftdebug.c + MacOS + + + Name + type1cid.c + MacOS + + + Name + cff.c + MacOS + + + Name + smooth.c + MacOS + + + Name + winfnt.c + MacOS + + + Name + truetype.c + MacOS + + + Name + ftmac.c + MacOS + + + Name + psaux.c + MacOS + + + Name + ftcache.c + MacOS + + + Name + ftglyph.c + MacOS + + + Name + type1.c + MacOS + + + Name + pshinter.c + MacOS + + + Name + pcf.c + MacOS + + + Name + ftraster.c + MacOS + + + Name + ftrend1.c + MacOS + + + + + + + FreeTypeLib + + + + base + + FreeTypeLib + Name + ftbase.c + MacOS + + + FreeTypeLib + Name + ftdebug.c + MacOS + + + FreeTypeLib + Name + ftglyph.c + MacOS + + + FreeTypeLib + Name + ftinit.c + MacOS + + + FreeTypeLib + Name + ftsystem.c + MacOS + + + FreeTypeLib + Name + ftmac.c + MacOS + + + ftmodules + + FreeTypeLib + Name + cff.c + MacOS + + + FreeTypeLib + Name + ftcache.c + MacOS + + + FreeTypeLib + Name + psaux.c + MacOS + + + FreeTypeLib + Name + psnames.c + MacOS + + + FreeTypeLib + Name + sfnt.c + MacOS + + + FreeTypeLib + Name + smooth.c + MacOS + + + FreeTypeLib + Name + truetype.c + MacOS + + + FreeTypeLib + Name + type1cid.c + MacOS + + + FreeTypeLib + Name + winfnt.c + MacOS + + + FreeTypeLib + Name + type1.c + MacOS + + + FreeTypeLib + Name + pshinter.c + MacOS + + + FreeTypeLib + Name + pcf.c + MacOS + + + FreeTypeLib + Name + ftraster.c + MacOS + + + FreeTypeLib + Name + ftrend1.c + MacOS + + + + + diff --git a/src/3rdparty/freetype/builds/mac/ftmac.c b/src/3rdparty/freetype/builds/mac/ftmac.c new file mode 100644 index 0000000000..c974f670f2 --- /dev/null +++ b/src/3rdparty/freetype/builds/mac/ftmac.c @@ -0,0 +1,1531 @@ +/***************************************************************************/ +/* */ +/* ftmac.c */ +/* */ +/* Mac FOND support. Written by just@letterror.com. */ +/* Heavily Fixed by mpsuzuki, George Williams and Sean McBride */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + Notes + + Mac suitcase files can (and often do!) contain multiple fonts. To + support this I use the face_index argument of FT_(Open|New)_Face() + functions, and pretend the suitcase file is a collection. + + Warning: fbit and NFNT bitmap resources are not supported yet. In old + sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' + resources instead of the `bdat' table in the sfnt resource. Therefore, + face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' + resource is unavailable at present. + + The Mac FOND support works roughly like this: + + - Check whether the offered stream points to a Mac suitcase file. This + is done by checking the file type: it has to be 'FFIL' or 'tfil'. The + stream that gets passed to our init_face() routine is a stdio stream, + which isn't usable for us, since the FOND resources live in the + resource fork. So we just grab the stream->pathname field. + + - Read the FOND resource into memory, then check whether there is a + TrueType font and/or(!) a Type 1 font available. + + - If there is a Type 1 font available (as a separate `LWFN' file), read + its data into memory, massage it slightly so it becomes PFB data, wrap + it into a memory stream, load the Type 1 driver and delegate the rest + of the work to it by calling FT_Open_Face(). (XXX TODO: after this + has been done, the kerning data from the FOND resource should be + appended to the face: On the Mac there are usually no AFM files + available. However, this is tricky since we need to map Mac char + codes to ps glyph names to glyph ID's...) + + - If there is a TrueType font (an `sfnt' resource), read it into memory, + wrap it into a memory stream, load the TrueType driver and delegate + the rest of the work to it, by calling FT_Open_Face(). + + - Some suitcase fonts (notably Onyx) might point the `LWFN' file to + itself, even though it doesn't contains `POST' resources. To handle + this special case without opening the file an extra time, we just + ignore errors from the `LWFN' and fallback to the `sfnt' if both are + available. + */ + + +#include +#include FT_FREETYPE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_STREAM_H +#include "ftbase.h" + +#if defined( __GNUC__ ) || defined( __IBMC__ ) + /* This is for Mac OS X. Without redefinition, OS_INLINE */ + /* expands to `static inline' which doesn't survive the */ + /* -ansi compilation flag of GCC. */ +#if !HAVE_ANSI_OS_INLINE +#undef OS_INLINE +#define OS_INLINE static __inline__ +#endif +#include +#include +#include /* PATH_MAX */ +#else +#include +#include +#include +#include +#include +#include +#endif + +#ifndef PATH_MAX +#define PATH_MAX 1024 /* same with Mac OS X's syslimits.h */ +#endif + +#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO +#include +#endif + +#define FT_DEPRECATED_ATTRIBUTE + +#include FT_MAC_H + + /* undefine blocking-macros in ftmac.h */ +#undef FT_GetFile_From_Mac_Name +#undef FT_GetFile_From_Mac_ATS_Name +#undef FT_New_Face_From_FOND +#undef FT_New_Face_From_FSSpec +#undef FT_New_Face_From_FSRef + + + /* FSSpec functions are deprecated since Mac OS X 10.4 */ +#ifndef HAVE_FSSPEC +#if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON +#define HAVE_FSSPEC 1 +#else +#define HAVE_FSSPEC 0 +#endif +#endif + + /* most FSRef functions were introduced since Mac OS 9 */ +#ifndef HAVE_FSREF +#if TARGET_API_MAC_OSX +#define HAVE_FSREF 1 +#else +#define HAVE_FSREF 0 +#endif +#endif + + /* QuickDraw is deprecated since Mac OS X 10.4 */ +#ifndef HAVE_QUICKDRAW_CARBON +#if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON +#define HAVE_QUICKDRAW_CARBON 1 +#else +#define HAVE_QUICKDRAW_CARBON 0 +#endif +#endif + + /* AppleTypeService is available since Mac OS X */ +#ifndef HAVE_ATS +#if TARGET_API_MAC_OSX +#define HAVE_ATS 1 +#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */ +#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault +#endif +#else +#define HAVE_ATS 0 +#endif +#endif + + /* `configure' checks the availability of `ResourceIndex' strictly */ + /* and sets HAVE_TYPE_RESOURCE_INDEX to 1 or 0 always. If it is */ + /* not set (e.g., a build without `configure'), the availability */ + /* is guessed from the SDK version. */ +#ifndef HAVE_TYPE_RESOURCE_INDEX +#if !defined( MAC_OS_X_VERSION_10_5 ) || \ + ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 ) +#define HAVE_TYPE_RESOURCE_INDEX 0 +#else +#define HAVE_TYPE_RESOURCE_INDEX 1 +#endif +#endif /* !HAVE_TYPE_RESOURCE_INDEX */ + +#if ( HAVE_TYPE_RESOURCE_INDEX == 0 ) +typedef short ResourceIndex; +#endif + + /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over + TrueType in case *both* are available (this is not common, + but it *is* possible). */ +#ifndef PREFER_LWFN +#define PREFER_LWFN 1 +#endif + + +#if !HAVE_QUICKDRAW_CARBON /* QuickDraw is deprecated since Mac OS X 10.4 */ + + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; + } + +#else + + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + OptionBits options = kFMUseGlobalScopeOption; + + FMFontFamilyIterator famIter; + OSStatus status = FMCreateFontFamilyIterator( NULL, NULL, + options, + &famIter ); + FMFont the_font = 0; + FMFontFamily family = 0; + + + *face_index = 0; + while ( status == 0 && !the_font ) + { + status = FMGetNextFontFamily( &famIter, &family ); + if ( status == 0 ) + { + int stat2; + FMFontFamilyInstanceIterator instIter; + Str255 famNameStr; + char famName[256]; + + + /* get the family name */ + FMGetFontFamilyName( family, famNameStr ); + CopyPascalStringToC( famNameStr, famName ); + + /* iterate through the styles */ + FMCreateFontFamilyInstanceIterator( family, &instIter ); + + *face_index = 0; + stat2 = 0; + + while ( stat2 == 0 && !the_font ) + { + FMFontStyle style; + FMFontSize size; + FMFont font; + + + stat2 = FMGetNextFontFamilyInstance( &instIter, &font, + &style, &size ); + if ( stat2 == 0 && size == 0 ) + { + char fullName[256]; + + + /* build up a complete face name */ + ft_strcpy( fullName, famName ); + if ( style & bold ) + ft_strcat( fullName, " Bold" ); + if ( style & italic ) + ft_strcat( fullName, " Italic" ); + + /* compare with the name we are looking for */ + if ( ft_strcmp( fullName, fontName ) == 0 ) + { + /* found it! */ + the_font = font; + } + else + ++(*face_index); + } + } + + FMDisposeFontFamilyInstanceIterator( &instIter ); + } + } + + FMDisposeFontFamilyIterator( &famIter ); + + if ( the_font ) + { + FMGetFontContainer( the_font, pathSpec ); + return FT_Err_Ok; + } + else + return FT_Err_Unknown_File_Format; + } + +#endif /* HAVE_QUICKDRAW_CARBON */ + + +#if HAVE_ATS + + /* Private function. */ + /* The FSSpec type has been discouraged for a long time, */ + /* unfortunately an FSRef replacement API for */ + /* ATSFontGetFileSpecification() is only available in */ + /* Mac OS X 10.5 and later. */ + static OSStatus + FT_ATSFontGetFileReference( ATSFontRef ats_font_id, + FSRef* ats_font_ref ) + { + OSStatus err; + +#if !defined( MAC_OS_X_VERSION_10_5 ) || \ + MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + FSSpec spec; + + + err = ATSFontGetFileSpecification( ats_font_id, &spec ); + if ( noErr == err ) + err = FSpMakeFSRef( &spec, ats_font_ref ); +#else + err = ATSFontGetFileReference( ats_font_id, ats_font_ref ); +#endif + + return err; + } + + + static FT_Error + FT_GetFileRef_From_Mac_ATS_Name( const char* fontName, + FSRef* ats_font_ref, + FT_Long* face_index ) + { + CFStringRef cf_fontName; + ATSFontRef ats_font_id; + + + *face_index = 0; + + cf_fontName = CFStringCreateWithCString( NULL, fontName, + kCFStringEncodingMacRoman ); + ats_font_id = ATSFontFindFromName( cf_fontName, + kATSOptionFlagsUnRestrictedScope ); + CFRelease( cf_fontName ); + + if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) + return FT_Err_Unknown_File_Format; + + if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) ) + return FT_Err_Unknown_File_Format; + + /* face_index calculation by searching preceding fontIDs */ + /* with same FSRef */ + { + ATSFontRef id2 = ats_font_id - 1; + FSRef ref2; + + + while ( id2 > 0 ) + { + if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) ) + break; + if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) ) + break; + + id2--; + } + *face_index = ats_font_id - ( id2 + 1 ); + } + + return FT_Err_Ok; + } + +#endif + +#if !HAVE_ATS + + FT_EXPORT_DEF( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( path ); + FT_UNUSED( maxPathSize ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; + } + +#else + + FT_EXPORT_DEF( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + { + FSRef ref; + FT_Error err; + + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( FT_Err_Ok != err ) + return err; + + if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) ) + return FT_Err_Unknown_File_Format; + + return FT_Err_Ok; + } + +#endif /* HAVE_ATS */ + + +#if !HAVE_FSSPEC || !HAVE_ATS + + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; + } + +#else + + /* This function is deprecated because FSSpec is deprecated in Mac OS X. */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FSRef ref; + FT_Error err; + + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( FT_Err_Ok != err ) + return err; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, + pathSpec, NULL ) ) + return FT_Err_Unknown_File_Format; + + return FT_Err_Ok; + } + +#endif + + +#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO + +#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) + + + FT_CALLBACK_DEF( void ) + ft_FSp_stream_close( FT_Stream stream ) + { + ft_fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + FT_CALLBACK_DEF( unsigned long ) + ft_FSp_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_FILE* file; + + + file = STREAM_FILE( stream ); + + ft_fseek( file, offset, SEEK_SET ); + + return (unsigned long)ft_fread( buffer, 1, count, file ); + } + +#endif /* __MWERKS__ && !TARGET_RT_MAC_MACHO */ + + +#if HAVE_FSSPEC && !HAVE_FSREF + + /* isDirectory is a dummy to synchronize API with FSPathMakeRef() */ + static OSErr + FT_FSPathMakeSpec( const UInt8* pathname, + FSSpec* spec_p, + Boolean isDirectory ) + { + const char *p, *q; + short vRefNum; + long dirID; + Str255 nodeName; + OSErr err; + FT_UNUSED( isDirectory ); + + + p = q = (const char *)pathname; + dirID = 0; + vRefNum = 0; + + while ( 1 ) + { + int len = ft_strlen( p ); + + + if ( len > 255 ) + len = 255; + + q = p + len; + + if ( q == p ) + return 0; + + if ( 255 < ft_strlen( (char *)pathname ) ) + { + while ( p < q && *q != ':' ) + q--; + } + + if ( p < q ) + *(char *)nodeName = q - p; + else if ( ft_strlen( p ) < 256 ) + *(char *)nodeName = ft_strlen( p ); + else + return errFSNameTooLong; + + ft_strncpy( (char *)nodeName + 1, (char *)p, *(char *)nodeName ); + err = FSMakeFSSpec( vRefNum, dirID, nodeName, spec_p ); + if ( err || '\0' == *q ) + return err; + + vRefNum = spec_p->vRefNum; + dirID = spec_p->parID; + + p = q; + } + } + + + static OSErr + FT_FSpMakePath( const FSSpec* spec_p, + UInt8* path, + UInt32 maxPathSize ) + { + OSErr err; + FSSpec spec = *spec_p; + short vRefNum; + long dirID; + Str255 parDir_name; + + + FT_MEM_SET( path, 0, maxPathSize ); + while ( 1 ) + { + int child_namelen = ft_strlen( (char *)path ); + unsigned char node_namelen = spec.name[0]; + unsigned char* node_name = spec.name + 1; + + + if ( node_namelen + child_namelen > maxPathSize ) + return errFSNameTooLong; + + FT_MEM_MOVE( path + node_namelen + 1, path, child_namelen ); + FT_MEM_COPY( path, node_name, node_namelen ); + if ( child_namelen > 0 ) + path[node_namelen] = ':'; + + vRefNum = spec.vRefNum; + dirID = spec.parID; + parDir_name[0] = '\0'; + err = FSMakeFSSpec( vRefNum, dirID, parDir_name, &spec ); + if ( noErr != err || dirID == spec.parID ) + break; + } + return noErr; + } + +#endif /* HAVE_FSSPEC && !HAVE_FSREF */ + + + static OSErr + FT_FSPathMakeRes( const UInt8* pathname, + ResFileRefNum* res ) + { + +#if HAVE_FSREF + + OSErr err; + FSRef ref; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + /* at present, no support for dfont format */ + err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); + if ( noErr == err ) + return err; + + /* fallback to original resource-fork font */ + *res = FSOpenResFile( &ref, fsRdPerm ); + err = ResError(); + +#else + + OSErr err; + FSSpec spec; + + + if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + /* at present, no support for dfont format without FSRef */ + /* (see above), try original resource-fork font */ + *res = FSpOpenResFile( &spec, fsRdPerm ); + err = ResError(); + +#endif /* HAVE_FSREF */ + + return err; + } + + + /* Return the file type for given pathname */ + static OSType + get_file_type_from_path( const UInt8* pathname ) + { + +#if HAVE_FSREF + + FSRef ref; + FSCatalogInfo info; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return ( OSType ) 0; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info, + NULL, NULL, NULL ) ) + return ( OSType ) 0; + + return ((FInfo *)(info.finderInfo))->fdType; + +#else + + FSSpec spec; + FInfo finfo; + + + if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) ) + return ( OSType ) 0; + + if ( noErr != FSpGetFInfo( &spec, &finfo ) ) + return ( OSType ) 0; + + return finfo.fdType; + +#endif /* HAVE_FSREF */ + + } + + + /* Given a PostScript font name, create the Macintosh LWFN file name. */ + static void + create_lwfn_name( char* ps_name, + Str255 lwfn_file_name ) + { + int max = 5, count = 0; + FT_Byte* p = lwfn_file_name; + FT_Byte* q = (FT_Byte*)ps_name; + + + lwfn_file_name[0] = 0; + + while ( *q ) + { + if ( ft_isupper( *q ) ) + { + if ( count ) + max = 3; + count = 0; + } + if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) ) + { + *++p = *q; + lwfn_file_name[0]++; + count++; + } + q++; + } + } + + + static short + count_faces_sfnt( char* fond_data ) + { + /* The count is 1 greater than the value in the FOND. */ + /* Isn't that cute? :-) */ + + return EndianS16_BtoN( *( (short*)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + } + + + static short + count_faces_scalable( char* fond_data ) + { + AsscEntry* assoc; + FamRec* fond; + short i, face, face_all; + + + fond = (FamRec*)fond_data; + face_all = EndianS16_BtoN( *( (short *)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + face = 0; + + for ( i = 0; i < face_all; i++ ) + { + if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) ) + face++; + } + return face; + } + + + /* Look inside the FOND data, answer whether there should be an SFNT + resource, and answer the name of a possible LWFN Type 1 file. + + Thanks to Paul Miller (paulm@profoundeffects.com) for the fix + to load a face OTHER than the first one in the FOND! + */ + + static void + parse_fond( char* fond_data, + short* have_sfnt, + ResID* sfnt_id, + Str255 lwfn_file_name, + short face_index ) + { + AsscEntry* assoc; + AsscEntry* base_assoc; + FamRec* fond; + + + *sfnt_id = 0; + *have_sfnt = 0; + lwfn_file_name[0] = 0; + + fond = (FamRec*)fond_data; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + base_assoc = assoc; + + /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */ + if ( 47 < face_index ) + return; + + /* Let's do a little range checking before we get too excited here */ + if ( face_index < count_faces_sfnt( fond_data ) ) + { + assoc += face_index; /* add on the face_index! */ + + /* if the face at this index is not scalable, + fall back to the first one (old behavior) */ + if ( EndianS16_BtoN( assoc->fontSize ) == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( assoc->fontID ); + } + else if ( base_assoc->fontSize == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( base_assoc->fontID ); + } + } + + if ( EndianS32_BtoN( fond->ffStylOff ) ) + { + unsigned char* p = (unsigned char*)fond_data; + StyleTable* style; + unsigned short string_count; + char ps_name[256]; + unsigned char* names[64]; + int i; + + + p += EndianS32_BtoN( fond->ffStylOff ); + style = (StyleTable*)p; + p += sizeof ( StyleTable ); + string_count = EndianS16_BtoN( *(short*)(p) ); + p += sizeof ( short ); + + for ( i = 0; i < string_count && i < 64; i++ ) + { + names[i] = p; + p += names[i][0]; + p++; + } + + { + size_t ps_name_len = (size_t)names[0][0]; + + + if ( ps_name_len != 0 ) + { + ft_memcpy(ps_name, names[0] + 1, ps_name_len); + ps_name[ps_name_len] = 0; + } + if ( style->indexes[face_index] > 1 && + style->indexes[face_index] <= FT_MIN( string_count, 64 ) ) + { + unsigned char* suffixes = names[style->indexes[face_index] - 1]; + + + for ( i = 1; i <= suffixes[0]; i++ ) + { + unsigned char* s; + size_t j = suffixes[i] - 1; + + + if ( j < string_count && ( s = names[j] ) != NULL ) + { + size_t s_len = (size_t)s[0]; + + + if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) ) + { + ft_memcpy( ps_name + ps_name_len, s + 1, s_len ); + ps_name_len += s_len; + ps_name[ps_name_len] = 0; + } + } + } + } + } + + create_lwfn_name( ps_name, lwfn_file_name ); + } + } + + + static FT_Error + lookup_lwfn_by_fond( const UInt8* path_fond, + ConstStr255Param base_lwfn, + UInt8* path_lwfn, + int path_size ) + { + +#if HAVE_FSREF + + FSRef ref, par_ref; + int dirname_len; + + + /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */ + /* We should not extract parent directory by string manipulation. */ + + if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) ) + return FT_Err_Invalid_Argument; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, &par_ref ) ) + return FT_Err_Invalid_Argument; + + if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) ) + return FT_Err_Invalid_Argument; + + if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size ) + return FT_Err_Invalid_Argument; + + /* now we have absolute dirname in path_lwfn */ + if ( path_lwfn[0] == '/' ) + ft_strcat( (char *)path_lwfn, "/" ); + else + ft_strcat( (char *)path_lwfn, ":" ); + + dirname_len = ft_strlen( (char *)path_lwfn ); + ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); + path_lwfn[dirname_len + base_lwfn[0]] = '\0'; + + if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, NULL ) ) + return FT_Err_Cannot_Open_Resource; + + return FT_Err_Ok; + +#else + + int i; + FSSpec spec; + + + /* pathname for FSSpec is always HFS format */ + if ( ft_strlen( (char *)path_fond ) > path_size ) + return FT_Err_Invalid_Argument; + + ft_strcpy( (char *)path_lwfn, (char *)path_fond ); + + i = ft_strlen( (char *)path_lwfn ) - 1; + while ( i > 0 && ':' != path_lwfn[i] ) + i--; + + if ( i + 1 + base_lwfn[0] > path_size ) + return FT_Err_Invalid_Argument; + + if ( ':' == path_lwfn[i] ) + { + ft_strcpy( (char *)path_lwfn + i + 1, (char *)base_lwfn + 1 ); + path_lwfn[i + 1 + base_lwfn[0]] = '\0'; + } + else + { + ft_strcpy( (char *)path_lwfn, (char *)base_lwfn + 1 ); + path_lwfn[base_lwfn[0]] = '\0'; + } + + if ( noErr != FT_FSPathMakeSpec( path_lwfn, &spec, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + return FT_Err_Ok; + +#endif /* HAVE_FSREF */ + + } + + + static short + count_faces( Handle fond, + const UInt8* pathname ) + { + ResID sfnt_id; + short have_sfnt, have_lwfn; + Str255 lwfn_file_name; + UInt8 buff[PATH_MAX]; + FT_Error err; + short num_faces; + + + have_sfnt = have_lwfn = 0; + + HLock( fond ); + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); + + if ( lwfn_file_name[0] ) + { + err = lookup_lwfn_by_fond( pathname, lwfn_file_name, + buff, sizeof ( buff ) ); + if ( FT_Err_Ok == err ) + have_lwfn = 1; + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + num_faces = 1; + else + num_faces = count_faces_scalable( *fond ); + + HUnlock( fond ); + return num_faces; + } + + + /* Read Type 1 data from the POST resources inside the LWFN file, + return a PFB buffer. This is somewhat convoluted because the FT2 + PFB parser wants the ASCII header as one chunk, and the LWFN + chunks are often not organized that way, so we glue chunks + of the same type together. */ + static FT_Error + read_lwfn( FT_Memory memory, + ResFileRefNum res, + FT_Byte** pfb_data, + FT_ULong* size ) + { + FT_Error error = FT_Err_Ok; + ResID res_id; + unsigned char *buffer, *p, *size_p = NULL; + FT_ULong total_size = 0; + FT_ULong old_total_size = 0; + FT_ULong post_size, pfb_chunk_size; + Handle post_data; + char code, last_code; + + + UseResFile( res ); + + /* First pass: load all POST resources, and determine the size of */ + /* the output buffer. */ + res_id = 501; + last_code = -1; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( post_data == NULL ) + break; /* we are done */ + + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( code == 5 ) + total_size += 2; /* just the end code */ + else + total_size += 6; /* code + 4 bytes chunk length */ + } + + total_size += GetHandleSize( post_data ) - 2; + last_code = code; + + /* detect integer overflows */ + if ( total_size < old_total_size ) + { + error = FT_Err_Array_Too_Large; + goto Error; + } + + old_total_size = total_size; + } + + if ( FT_ALLOC( buffer, (FT_Long)total_size ) ) + goto Error; + + /* Second pass: append all POST data to the buffer, add PFB fields. */ + /* Glue all consecutive chunks of the same type together. */ + p = buffer; + res_id = 501; + last_code = -1; + pfb_chunk_size = 0; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( post_data == NULL ) + break; /* we are done */ + + post_size = (FT_ULong)GetHandleSize( post_data ) - 2; + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( last_code != -1 ) + { + /* we are done adding a chunk, fill in the size field */ + if ( size_p != NULL ) + { + *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF ); + } + pfb_chunk_size = 0; + } + + *p++ = 0x80; + if ( code == 5 ) + *p++ = 0x03; /* the end */ + else if ( code == 2 ) + *p++ = 0x02; /* binary segment */ + else + *p++ = 0x01; /* ASCII segment */ + + if ( code != 5 ) + { + size_p = p; /* save for later */ + p += 4; /* make space for size field */ + } + } + + ft_memcpy( p, *post_data + 2, post_size ); + pfb_chunk_size += post_size; + p += post_size; + last_code = code; + } + + *pfb_data = buffer; + *size = total_size; + + Error: + CloseResFile( res ); + return error; + } + + + /* Create a new FT_Face from a file spec to an LWFN file. */ + static FT_Error + FT_New_Face_From_LWFN( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Byte* pfb_data; + FT_ULong pfb_size; + FT_Error error; + ResFileRefNum res; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res ) ) + return FT_Err_Cannot_Open_Resource; + + pfb_data = NULL; + pfb_size = 0; + error = read_lwfn( library->memory, res, &pfb_data, &pfb_size ); + CloseResFile( res ); /* PFB is already loaded, useless anymore */ + if ( error ) + return error; + + return open_face_from_buffer( library, + pfb_data, + pfb_size, + face_index, + "type1", + aface ); + } + + + /* Create a new FT_Face from an SFNT resource, specified by res ID. */ + static FT_Error + FT_New_Face_From_SFNT( FT_Library library, + ResID sfnt_id, + FT_Long face_index, + FT_Face* aface ) + { + Handle sfnt = NULL; + FT_Byte* sfnt_data; + size_t sfnt_size; + FT_Error error = FT_Err_Ok; + FT_Memory memory = library->memory; + int is_cff, is_sfnt_ps; + + + sfnt = GetResource( TTAG_sfnt, sfnt_id ); + if ( sfnt == NULL ) + return FT_Err_Invalid_Handle; + + sfnt_size = (FT_ULong)GetHandleSize( sfnt ); + if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) ) + { + ReleaseResource( sfnt ); + return error; + } + + HLock( sfnt ); + ft_memcpy( sfnt_data, *sfnt, sfnt_size ); + HUnlock( sfnt ); + ReleaseResource( sfnt ); + + is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 ); + + if ( is_sfnt_ps ) + { + FT_Stream stream; + + + if ( FT_NEW( stream ) ) + goto Try_OpenType; + + FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size ); + if ( !open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ) ) + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + FT_FREE( sfnt_data ); + goto Exit; + } + + FT_FREE( stream ); + } + Try_OpenType: + error = open_face_from_buffer( library, + sfnt_data, + sfnt_size, + face_index, + is_cff ? "cff" : "truetype", + aface ); + Exit: + return error; + } + + + /* Create a new FT_Face from a file spec to a suitcase file. */ + static FT_Error + FT_New_Face_From_Suitcase( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error = FT_Err_Cannot_Open_Resource; + ResFileRefNum res_ref; + ResourceIndex res_index; + Handle fond; + short num_faces_in_res, num_faces_in_fond; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) ) + return FT_Err_Cannot_Open_Resource; + + UseResFile( res_ref ); + if ( ResError() ) + return FT_Err_Cannot_Open_Resource; + + num_faces_in_res = 0; + for ( res_index = 1; ; ++res_index ) + { + fond = Get1IndResource( TTAG_FOND, res_index ); + if ( ResError() ) + break; + + num_faces_in_fond = count_faces( fond, pathname ); + num_faces_in_res += num_faces_in_fond; + + if ( 0 <= face_index && face_index < num_faces_in_fond && error ) + error = FT_New_Face_From_FOND( library, fond, face_index, aface ); + + face_index -= num_faces_in_fond; + } + + CloseResFile( res_ref ); + if ( FT_Err_Ok == error && NULL != aface ) + (*aface)->num_faces = num_faces_in_res; + return error; + } + + + /* documentation is in ftmac.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face* aface ) + { + short have_sfnt, have_lwfn = 0; + ResID sfnt_id, fond_id; + OSType fond_type; + Str255 fond_name; + Str255 lwfn_file_name; + UInt8 path_lwfn[PATH_MAX]; + OSErr err; + FT_Error error = FT_Err_Ok; + + + GetResInfo( fond, &fond_id, &fond_type, fond_name ); + if ( ResError() != noErr || fond_type != TTAG_FOND ) + return FT_Err_Invalid_File_Format; + + HLock( fond ); + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index ); + HUnlock( fond ); + + if ( lwfn_file_name[0] ) + { + ResFileRefNum res; + + + res = HomeResFile( fond ); + if ( noErr != ResError() ) + goto found_no_lwfn_file; + +#if HAVE_FSREF + + { + UInt8 path_fond[PATH_MAX]; + FSRef ref; + + + err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, + NULL, NULL, NULL, &ref, NULL ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); + if ( noErr != err ) + goto found_no_lwfn_file; + + error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, + path_lwfn, sizeof ( path_lwfn ) ); + if ( FT_Err_Ok == error ) + have_lwfn = 1; + } + +#elif HAVE_FSSPEC + + { + UInt8 path_fond[PATH_MAX]; + FCBPBRec pb; + Str255 fond_file_name; + FSSpec spec; + + + FT_MEM_SET( &spec, 0, sizeof ( FSSpec ) ); + FT_MEM_SET( &pb, 0, sizeof ( FCBPBRec ) ); + + pb.ioNamePtr = fond_file_name; + pb.ioVRefNum = 0; + pb.ioRefNum = res; + pb.ioFCBIndx = 0; + + err = PBGetFCBInfoSync( &pb ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FSMakeFSSpec( pb.ioFCBVRefNum, pb.ioFCBParID, + fond_file_name, &spec ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FT_FSpMakePath( &spec, path_fond, sizeof ( path_fond ) ); + if ( noErr != err ) + goto found_no_lwfn_file; + + error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, + path_lwfn, sizeof ( path_lwfn ) ); + if ( FT_Err_Ok == error ) + have_lwfn = 1; + } + +#endif /* HAVE_FSREF, HAVE_FSSPEC */ + + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + error = FT_New_Face_From_LWFN( library, + path_lwfn, + face_index, + aface ); + else + error = FT_Err_Unknown_File_Format; + + found_no_lwfn_file: + if ( have_sfnt && FT_Err_Ok != error ) + error = FT_New_Face_From_SFNT( library, + sfnt_id, + face_index, + aface ); + + return error; + } + + + /* Common function to load a new FT_Face from a resource file. */ + static FT_Error + FT_New_Face_From_Resource( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + OSType file_type; + FT_Error error; + + + /* LWFN is a (very) specific file format, check for it explicitly */ + file_type = get_file_type_from_path( pathname ); + if ( file_type == TTAG_LWFN ) + return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); + + /* Otherwise the file type doesn't matter (there are more than */ + /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ + /* if it works, fine. */ + + error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); + if ( error == 0 ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.); */ + /* we signal this by returning no error and no FT_Face */ + *aface = NULL; + return 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face */ + /* */ + /* */ + /* This is the Mac-specific implementation of FT_New_Face. In */ + /* addition to the standard FT_New_Face() functionality, it also */ + /* accepts pathnames to Mac suitcase files. For further */ + /* documentation see the original FT_New_Face() in freetype.h. */ + /* */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Open_Args args; + FT_Error error; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + error = FT_Err_Ok; + *aface = NULL; + + /* try resourcefork based font: LWFN, FFIL */ + error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, + face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.) */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face_From_FSRef */ + /* */ + /* */ + /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */ + /* accepts an FSRef instead of a path. */ + /* */ + /* This function is deprecated because Carbon data types (FSRef) */ + /* are not cross-platform, and thus not suitable for the freetype API. */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef* ref, + FT_Long face_index, + FT_Face* aface ) + { + +#if !HAVE_FSREF + + FT_UNUSED( library ); + FT_UNUSED( ref ); + FT_UNUSED( face_index ); + FT_UNUSED( aface ); + + return FT_Err_Unimplemented_Feature; + +#else + + FT_Error error; + FT_Open_Args args; + OSErr err; + UInt8 pathname[PATH_MAX]; + + + if ( !ref ) + return FT_Err_Invalid_Argument; + + err = FSRefMakePath( ref, pathname, sizeof ( pathname ) ); + if ( err ) + error = FT_Err_Cannot_Open_Resource; + + error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* fallback to datafork font */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + +#endif /* HAVE_FSREF */ + + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* */ + /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */ + /* accepts an FSSpec instead of a path. */ + /* */ + /* This function is deprecated because Carbon data types (FSSpec) */ + /* are not cross-platform, and thus not suitable for the freetype API. */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec* spec, + FT_Long face_index, + FT_Face* aface ) + { + +#if HAVE_FSREF + + FSRef ref; + + + if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) + return FT_Err_Invalid_Argument; + else + return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); + +#elif HAVE_FSSPEC + + FT_Error error; + FT_Open_Args args; + OSErr err; + UInt8 pathname[PATH_MAX]; + + + if ( !spec ) + return FT_Err_Invalid_Argument; + + err = FT_FSpMakePath( spec, pathname, sizeof ( pathname ) ); + if ( err ) + error = FT_Err_Cannot_Open_Resource; + + error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* fallback to datafork font */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + +#else + + FT_UNUSED( library ); + FT_UNUSED( spec ); + FT_UNUSED( face_index ); + FT_UNUSED( aface ); + + return FT_Err_Unimplemented_Feature; + +#endif /* HAVE_FSREF, HAVE_FSSPEC */ + + } + + +/* END */ diff --git a/src/3rdparty/freetype/builds/modules.mk b/src/3rdparty/freetype/builds/modules.mk new file mode 100644 index 0000000000..c4a882cbdb --- /dev/null +++ b/src/3rdparty/freetype/builds/modules.mk @@ -0,0 +1,79 @@ +# +# FreeType 2 modules sub-Makefile +# + + +# Copyright 1996-2000, 2003, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY +# OTHER MAKEFILES. + + +# This file is in charge of handling the generation of the modules list +# file. + + +# Build the modules list. +# +$(FTMODULE_H): $(MODULES_CFG) + $(FTMODULE_H_INIT) + $(FTMODULE_H_CREATE) + $(FTMODULE_H_DONE) + +ifneq ($(findstring $(PLATFORM),dos win32 win16 os2),) + OPEN_MODULE := @echo$(space) + CLOSE_MODULE := >> $(subst /,$(SEP),$(FTMODULE_H)) + REMOVE_MODULE := @-$(DELETE) $(subst /,$(SEP),$(FTMODULE_H)) +else + OPEN_MODULE := @echo " + CLOSE_MODULE := " >> $(FTMODULE_H) + REMOVE_MODULE := @-$(DELETE) $(FTMODULE_H) +endif + + +define FTMODULE_H_INIT +$(REMOVE_MODULE) +@-echo Generating modules list in $(FTMODULE_H)... +$(OPEN_MODULE)/* This is a generated file. */$(CLOSE_MODULE) +endef + +# It is no mistake that the final closing parenthesis is on the +# next line -- it produces proper newlines during the expansion +# of `foreach'. +# +define FTMODULE_H_CREATE +$(foreach COMMAND,$(FTMODULE_H_COMMANDS),$($(COMMAND)) +) +endef + +define FTMODULE_H_DONE +$(OPEN_MODULE)/* EOF */$(CLOSE_MODULE) +@echo done. +endef + + +# $(OPEN_DRIVER) & $(CLOSE_DRIVER) are used to specify a given font driver +# in the `module.mk' rules file. +# +OPEN_DRIVER := $(OPEN_MODULE)FT_USE_MODULE( +CLOSE_DRIVER := )$(CLOSE_MODULE) + +ECHO_DRIVER := @echo "* module:$(space) +ECHO_DRIVER_DESC := ( +ECHO_DRIVER_DONE := )" + +# Each `module.mk' in the `src/*' subdirectories adds a variable with +# commands to $(FTMODULE_H_COMMANDS). Note that we can't use SRC_DIR here. +# +-include $(patsubst %,$(TOP_DIR)/src/%/module.mk,$(MODULES)) + + +# EOF diff --git a/src/3rdparty/freetype/builds/newline b/src/3rdparty/freetype/builds/newline new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/3rdparty/freetype/builds/newline @@ -0,0 +1 @@ + diff --git a/src/3rdparty/freetype/builds/os2/detect.mk b/src/3rdparty/freetype/builds/os2/detect.mk new file mode 100644 index 0000000000..47a40a2f85 --- /dev/null +++ b/src/3rdparty/freetype/builds/os2/detect.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 configuration file to detect an OS/2 host platform. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +.PHONY: setup + + +ifeq ($(PLATFORM),ansi) + + ifdef OS2_SHELL + + PLATFORM := os2 + + endif # test OS2_SHELL +endif + +ifeq ($(PLATFORM),os2) + + COPY := copy + DELETE := del + CAT := type + SEP := $(BACKSLASH) + + # gcc-emx by default + CONFIG_FILE := os2-gcc.mk + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring visualage,$(MAKECMDGOALS)),) # Visual Age C++ + CONFIG_FILE := os2-icc.mk + CC := icc + visualage: setup + .PHONY: visualage + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := os2-wat.mk + CC := wcc386 + watcom: setup + .PHONY: watcom + endif + + ifneq ($(findstring borlandc,$(MAKECMDGOALS)),) # Borland C++ 32-bit + CONFIG_FILE := os2-bcc.mk + CC := bcc32 + borlandc: setup + .PHONY: borlandc + endif + + ifneq ($(findstring devel,$(MAKECMDGOALS)),) # development target + CONFIG_FILE := os2-dev.mk + CC := gcc + devel: setup + .PHONY: devel + endif + + setup: dos_setup + +endif # test PLATFORM os2 + + +# EOF diff --git a/src/3rdparty/freetype/builds/os2/os2-def.mk b/src/3rdparty/freetype/builds/os2/os2-def.mk new file mode 100644 index 0000000000..01cda9285a --- /dev/null +++ b/src/3rdparty/freetype/builds/os2/os2-def.mk @@ -0,0 +1,44 @@ +# +# FreeType 2 OS/2 specific definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := del +CAT := type +SEP := $(strip \ ) +BUILD_DIR := $(TOP_DIR)/builds/os2 +PLATFORM := os2 + +# The executable file extension (for tools), *with* leading dot. +# +E := .exe + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := $(PROJECT) + + +# The NO_OUTPUT macro is used to ignore the output of commands. +# +NO_OUTPUT = 2> nul + + +# EOF diff --git a/src/3rdparty/freetype/builds/os2/os2-dev.mk b/src/3rdparty/freetype/builds/os2/os2-dev.mk new file mode 100644 index 0000000000..83da8dea33 --- /dev/null +++ b/src/3rdparty/freetype/builds/os2/os2-dev.mk @@ -0,0 +1,30 @@ +# +# FreeType 2 configuration rules for OS/2 + GCC +# +# Development version without optimizations. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DEVEL_DIR := $(TOP_DIR)/devel + +# include OS/2-specific definitions +include $(TOP_DIR)/builds/os2/os2-def.mk + +# include gcc-specific definitions +include $(TOP_DIR)/builds/compiler/gcc-dev.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/os2/os2-gcc.mk b/src/3rdparty/freetype/builds/os2/os2-gcc.mk new file mode 100644 index 0000000000..446073e4f5 --- /dev/null +++ b/src/3rdparty/freetype/builds/os2/os2-gcc.mk @@ -0,0 +1,26 @@ +# +# FreeType 2 configuration rules for the OS/2 + gcc +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# include OS/2-specific definitions +include $(TOP_DIR)/builds/os2/os2-def.mk + +# include gcc-specific definitions +include $(TOP_DIR)/builds/compiler/gcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/symbian/bld.inf b/src/3rdparty/freetype/builds/symbian/bld.inf new file mode 100644 index 0000000000..7932dcbf2b --- /dev/null +++ b/src/3rdparty/freetype/builds/symbian/bld.inf @@ -0,0 +1,65 @@ +// +// FreeType 2 project for the symbian platform +// + +// Copyright 2008, 2009 by +// David Turner, Robert Wilhelm, and Werner Lemberg. +// +// This file is part of the FreeType project, and may only be used, modified, +// and distributed under the terms of the FreeType project license, +// LICENSE.TXT. By continuing to use, modify, or distribute this file you +// indicate that you have read the license and understand and accept it +// fully. + +PRJ_PLATFORMS +DEFAULT + +PRJ_MMPFILES +freetype.mmp + +PRJ_EXPORTS +../../include/ft2build.h +../../include/freetype/config/ftconfig.h freetype/config/ftconfig.h +../../include/freetype/config/ftheader.h freetype/config/ftheader.h +../../include/freetype/config/ftmodule.h freetype/config/ftmodule.h +../../include/freetype/config/ftoption.h freetype/config/ftoption.h +../../include/freetype/config/ftstdlib.h freetype/config/ftstdlib.h +../../include/freetype/freetype.h freetype/freetype.h +../../include/freetype/ftbbox.h freetype/ftbbox.h +../../include/freetype/ftbdf.h freetype/ftbdf.h +../../include/freetype/ftbitmap.h freetype/ftbitmap.h +../../include/freetype/ftcache.h freetype/ftcache.h +../../include/freetype/ftcid.h freetype/ftcid.h +../../include/freetype/fterrdef.h freetype/fterrdef.h +../../include/freetype/fterrors.h freetype/fterrors.h +../../include/freetype/ftgasp.h freetype/ftgasp.h +../../include/freetype/ftglyph.h freetype/ftglyph.h +../../include/freetype/ftgxval.h freetype/ftgxval.h +../../include/freetype/ftgzip.h freetype/ftgzip.h +../../include/freetype/ftimage.h freetype/ftimage.h +../../include/freetype/ftincrem.h freetype/ftincrem.h +../../include/freetype/ftlcdfil.h freetype/ftlcdfil.h +../../include/freetype/ftlist.h freetype/ftlist.h +../../include/freetype/ftlzw.h freetype/ftlzw.h +../../include/freetype/ftmac.h freetype/ftmac.h +../../include/freetype/ftmm.h freetype/ftmm.h +../../include/freetype/ftmodapi.h freetype/ftmodapi.h +../../include/freetype/ftmoderr.h freetype/ftmoderr.h +../../include/freetype/ftotval.h freetype/ftotval.h +../../include/freetype/ftoutln.h freetype/ftoutln.h +../../include/freetype/ftpfr.h freetype/ftpfr.h +../../include/freetype/ftrender.h freetype/ftrender.h +../../include/freetype/ftsizes.h freetype/ftsizes.h +../../include/freetype/ftsnames.h freetype/ftsnames.h +../../include/freetype/ftstroke.h freetype/ftstroke.h +../../include/freetype/ftsynth.h freetype/ftsynth.h +../../include/freetype/ftsystem.h freetype/ftsystem.h +../../include/freetype/fttrigon.h freetype/fttrigon.h +../../include/freetype/fttypes.h freetype/fttypes.h +../../include/freetype/ftwinfnt.h freetype/ftwinfnt.h +../../include/freetype/ftxf86.h freetype/ftxf86.h +../../include/freetype/t1tables.h freetype/t1tables.h +../../include/freetype/ttnameid.h freetype/ttnameid.h +../../include/freetype/tttables.h freetype/tttables.h +../../include/freetype/tttags.h freetype/tttags.h +../../include/freetype/ttunpat.h freetype/ttunpat.h diff --git a/src/3rdparty/freetype/builds/symbian/freetype.mmp b/src/3rdparty/freetype/builds/symbian/freetype.mmp new file mode 100644 index 0000000000..c10f357481 --- /dev/null +++ b/src/3rdparty/freetype/builds/symbian/freetype.mmp @@ -0,0 +1,142 @@ +// +// FreeType 2 makefile for the symbian platform +// + +// Copyright 2008, 2009 by +// David Turner, Robert Wilhelm, and Werner Lemberg. +// +// This file is part of the FreeType project, and may only be used, modified, +// and distributed under the terms of the FreeType project license, +// LICENSE.TXT. By continuing to use, modify, or distribute this file you +// indicate that you have read the license and understand and accept it +// fully. + +target freetype.lib +targettype lib + +macro NDEBUG +macro FT2_BUILD_LIBRARY + +sourcepath ..\..\src\autofit + +source autofit.c + +sourcepath ..\..\src\base + +source ftbase.c +source ftbbox.c +source ftbdf.c +source ftbitmap.c +source ftcid.c +source ftfstype.c +source ftgasp.c +source ftglyph.c +source ftgxval.c +source ftinit.c +source ftlcdfil.c +source ftmm.c +source ftotval.c +source ftpatent.c +source ftpfr.c +source ftstroke.c +source ftsynth.c +source ftsystem.c +source fttype1.c +source ftwinfnt.c + +sourcepath ..\..\src\bdf + +source bdf.c + +sourcepath ..\..\src\cache + +source ftcache.c + +sourcepath ..\..\src\cff + +source cff.c + +sourcepath ..\..\src\cid + +source type1cid.c + +sourcepath ..\..\src\gzip + +source ftgzip.c + +sourcepath ..\..\src\lzw + +source ftlzw.c + +sourcepath ..\..\src\pcf + +source pcf.c + +sourcepath ..\..\src\pfr + +source pfr.c + +sourcepath ..\..\src\psaux + +source psaux.c + +sourcepath ..\..\src\pshinter + +source pshinter.c + +sourcepath ..\..\src\psnames + +source psmodule.c + +sourcepath ..\..\src\raster + +source raster.c + +sourcepath ..\..\src\sfnt + +source sfnt.c + +sourcepath ..\..\src\smooth + +source smooth.c + +sourcepath ..\..\src\truetype + +source truetype.c + +sourcepath ..\..\src\type1 + +source type1.c + +sourcepath ..\..\src\type42 + +source type42.c + +sourcepath ..\..\src\winfonts + +source winfnt.c + + +systeminclude ..\..\include +systeminclude \epoc32\include\stdapis +userinclude ..\..\src\autofit +userinclude ..\..\src\bdf +userinclude ..\..\src\cache +userinclude ..\..\src\cff +userinclude ..\..\src\cid +userinclude ..\..\src\gxvalid +userinclude ..\..\src\gzip +userinclude ..\..\src\lzw +userinclude ..\..\src\otvalid +userinclude ..\..\src\pcf +userinclude ..\..\src\pfr +userinclude ..\..\src\psaux +userinclude ..\..\src\pshinter +userinclude ..\..\src\psnames +userinclude ..\..\src\raster +userinclude ..\..\src\sfnt +userinclude ..\..\src\smooth +userinclude ..\..\src\truetype +userinclude ..\..\src\type1 +userinclude ..\..\src\type42 +userinclude ..\..\src\winfonts diff --git a/src/3rdparty/freetype/builds/toplevel.mk b/src/3rdparty/freetype/builds/toplevel.mk new file mode 100644 index 0000000000..e6a8e932f7 --- /dev/null +++ b/src/3rdparty/freetype/builds/toplevel.mk @@ -0,0 +1,255 @@ +# +# FreeType build system -- top-level sub-Makefile +# + + +# Copyright 1996-2000, 2001, 2003, 2006, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# This file is designed for GNU Make, do not use it with another Make tool! +# +# It works as follows: +# +# - When invoked for the first time, this Makefile includes the rules found +# in `PROJECT/builds/detect.mk'. They are in charge of detecting the +# current platform. +# +# A summary of the detection is displayed, and the file `config.mk' is +# created in the current directory. +# +# - When invoked later, this Makefile includes the rules found in +# `config.mk'. This sub-Makefile defines some system-specific variables +# (like compiler, compilation flags, object suffix, etc.), then includes +# the rules found in `PROJECT/builds/PROJECT.mk', used to build the +# library. +# +# See the comments in `builds/detect.mk' and `builds/PROJECT.mk' for more +# details on host platform detection and library builds. + + +# First of all, check whether we have `$(value ...)'. We do this by testing +# for `$(eval ...)' which has been introduced in the same GNU make version. + +eval_available := +$(eval eval_available := T) +ifneq ($(eval_available),T) + $(error FreeType's build system needs a Make program which supports $$(value)) +endif + + +.PHONY: all dist distclean modules setup + + +# The `space' variable is used to avoid trailing spaces in defining the +# `T' variable later. +# +empty := +space := $(empty) $(empty) + + +# The main configuration file, defining the `XXX_MODULES' variables. We +# prefer a `modules.cfg' file in OBJ_DIR over TOP_DIR. +# +ifndef MODULES_CFG + MODULES_CFG := $(TOP_DIR)/modules.cfg + ifneq ($(wildcard $(OBJ_DIR)/modules.cfg),) + MODULES_CFG := $(OBJ_DIR)/modules.cfg + endif +endif + + +# FTMODULE_H, as its name suggests, indicates where the FreeType module +# class file resides. +# +FTMODULE_H ?= $(OBJ_DIR)/ftmodule.h + + +include $(MODULES_CFG) + + +# The list of modules we are using. +# +MODULES := $(FONT_MODULES) \ + $(HINTING_MODULES) \ + $(RASTER_MODULES) \ + $(AUX_MODULES) + + +CONFIG_MK ?= config.mk + +# If no configuration sub-makefile is present, or if `setup' is the target +# to be built, run the auto-detection rules to figure out which +# configuration rules file to use. +# +# Note that the configuration file is put in the current directory, which is +# not necessarily $(TOP_DIR). + +# If `config.mk' is not present, set `check_platform'. +# +ifeq ($(wildcard $(CONFIG_MK)),) + check_platform := 1 +endif + +# If `setup' is one of the targets requested, set `check_platform'. +# +ifneq ($(findstring setup,$(MAKECMDGOALS)),) + check_platform := 1 +endif + +# Include the automatic host platform detection rules when we need to +# check the platform. +# +ifdef check_platform + + all modules: setup + + include $(TOP_DIR)/builds/detect.mk + + # This rule makes sense for Unix only to remove files created by a run + # of the configure script which hasn't been successful (so that no + # `config.mk' has been created). It uses the built-in $(RM) command of + # GNU make. Similarly, `nul' is created if e.g. `make setup win32' has + # been erroneously used. + # + # Note: This test is duplicated in `builds/unix/detect.mk'. + # + is_unix := $(strip $(wildcard /sbin/init) \ + $(wildcard /usr/sbin/init) \ + $(wildcard /hurd/auth)) + ifneq ($(is_unix),) + + distclean: + $(RM) builds/unix/config.cache + $(RM) builds/unix/config.log + $(RM) builds/unix/config.status + $(RM) builds/unix/unix-def.mk + $(RM) builds/unix/unix-cc.mk + $(RM) builds/unix/freetype2.pc + $(RM) nul + + endif # test is_unix + + # IMPORTANT: + # + # `setup' must be defined by the host platform detection rules to create + # the `config.mk' file in the current directory. + +else + + # A configuration sub-Makefile is present -- simply run it. + # + all: single + + BUILD_PROJECT := yes + include $(CONFIG_MK) + +endif # test check_platform + + +# We always need the list of modules in ftmodule.h. +# +all setup: $(FTMODULE_H) + + +# The `modules' target unconditionally rebuilds the module list. +# +modules: + $(FTMODULE_H_INIT) + $(FTMODULE_H_CREATE) + $(FTMODULE_H_DONE) + +include $(TOP_DIR)/builds/modules.mk + + +# This target builds the tarballs. +# +# Not to be run by a normal user -- there are no attempts to make it +# generic. + +# we check for `dist', not `distclean' +ifneq ($(findstring distx,$(MAKECMDGOALS)x),) + FT_H := include/freetype/freetype.h + + major := $(shell sed -n 's/.*FREETYPE_MAJOR.*\([0-9]\+\)/\1/p' < $(FT_H)) + minor := $(shell sed -n 's/.*FREETYPE_MINOR.*\([0-9]\+\)/\1/p' < $(FT_H)) + patch := $(shell sed -n 's/.*FREETYPE_PATCH.*\([0-9]\+\)/\1/p' < $(FT_H)) + + version := $(major).$(minor).$(patch) + winversion := $(major)$(minor)$(patch) +endif + +dist: + -rm -rf tmp + rm -f freetype-$(version).tar.gz + rm -f freetype-$(version).tar.bz2 + rm -f ft$(winversion).zip + + for d in `find . -wholename '*/CVS' -prune \ + -o -type f \ + -o -print` ; do \ + mkdir -p tmp/$$d ; \ + done ; + + currdir=`pwd` ; \ + for f in `find . -wholename '*/CVS' -prune \ + -o -name .cvsignore \ + -o -type d \ + -o -print` ; do \ + ln -s $$currdir/$$f tmp/$$f ; \ + done + + @# Prevent generation of .pyc files. Python follows (soft) links if + @# the link's directory is write protected, so we have temporarily + @# disable write access here too. + chmod -w src/tools/docmaker + + cd tmp ; \ + $(MAKE) devel ; \ + $(MAKE) do-dist + + chmod +w src/tools/docmaker + + mv tmp freetype-$(version) + + tar cfh - freetype-$(version) \ + | gzip -9 -c > freetype-$(version).tar.gz + tar cfh - freetype-$(version) \ + | bzip2 -c > freetype-$(version).tar.bz2 + + @# Use CR/LF for zip files. + zip -lr9 ft$(winversion).zip freetype-$(version) + + rm -fr freetype-$(version) + + +# The locations of the latest `config.guess' and `config.sub' versions (from +# GNU `config' CVS), relative to the `tmp' directory used during `make dist'. +# +CONFIG_GUESS = ~/git/config/config.guess +CONFIG_SUB = ~/git/config/config.sub + + +# Don't say `make do-dist'. Always use `make dist' instead. +# +.PHONY: do-dist + +do-dist: distclean refdoc + @# Without removing the files, `autoconf' and friends follow links. + rm -f builds/unix/aclocal.m4 + rm -f builds/unix/configure.ac + rm -f builds/unix/configure + + sh autogen.sh + rm -rf builds/unix/autom4te.cache + + cp $(CONFIG_GUESS) builds/unix + cp $(CONFIG_SUB) builds/unix + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/aclocal.m4 b/src/3rdparty/freetype/builds/unix/aclocal.m4 new file mode 100644 index 0000000000..36a524230e --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/aclocal.m4 @@ -0,0 +1,7960 @@ +# generated automatically by aclocal 1.10.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 56 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl +_LT_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_INIT +]) + + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +if test "$no_create" != yes; then + lt_cl_success=: + test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" + exec AS_MESSAGE_LOG_FD>/dev/null + $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false + exec AS_MESSAGE_LOG_FD>>config.log + $lt_cl_success || AS_EXIT(1) +fi +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX +# ----------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method == "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${F77-"f77"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${FC-"f95"} + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC="$lt_save_CC" +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC="$lt_save_CC" +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# Generated from ltversion.in. + +# serial 3012 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6]) +m4_define([LT_PACKAGE_REVISION], [1.3012]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6' +macro_revision='1.3012' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 4 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) + +m4_include([ft-munmap.m4]) diff --git a/src/3rdparty/freetype/builds/unix/config.guess b/src/3rdparty/freetype/builds/unix/config.guess new file mode 100755 index 0000000000..e5716eea73 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/config.guess @@ -0,0 +1,1555 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2009-02-03' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd | genuineintel) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/3rdparty/freetype/builds/unix/config.sub b/src/3rdparty/freetype/builds/unix/config.sub new file mode 100755 index 0000000000..d546a94b95 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/config.sub @@ -0,0 +1,1685 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2009-02-03' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/3rdparty/freetype/builds/unix/configure b/src/3rdparty/freetype/builds/unix/configure new file mode 100755 index 0000000000..97849a4352 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/configure @@ -0,0 +1,16014 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63 for FreeType 2.3.9. +# +# Report bugs to . +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +$* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='FreeType' +PACKAGE_TARNAME='freetype' +PACKAGE_VERSION='2.3.9' +PACKAGE_STRING='FreeType 2.3.9' +PACKAGE_BUGREPORT='freetype@nongnu.org' + +ac_unique_file="ftconfig.in" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +build_libtool_libs +wl +hardcode_libdir_flag_spec +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +lt_ECHO +RANLIB +STRIP +AR +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +SYSTEM_ZLIB +FT2_EXTRA_LIBS +LIBZ +ftmac_c +FTSYS_SRC +EGREP +GREP +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +RMDIR +RMF +XX_ANSIFLAGS +XX_CFLAGS +EXEEXT_BUILD +CC_BUILD +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +ft_version +version_info +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_biarch_config +with_zlib +with_old_mac_fonts +with_fsspec +with_fsref +with_quickdraw_toolbox +with_quickdraw_carbon +with_ats +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +enable_libtool_lock +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { $as_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures FreeType 2.3.9 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/freetype] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of FreeType 2.3.9:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-biarch-config install biarch ftconfig.h to support multiple + architectures by single file + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-zlib use internal zlib instead of system-wide + --with-old-mac-fonts allow Mac resource-based fonts to be used + --with-fsspec use obsolete FSSpec API of MacOS, if available + (default=yes) + --with-fsref use Carbon FSRef API of MacOS, if available + (default=yes) + --with-quickdraw-toolbox + use MacOS QuickDraw in ToolBox, if available + (default=yes) + --with-quickdraw-carbon use MacOS QuickDraw in Carbon, if available + (default=yes) + --with-ats use AppleTypeService, if available (default=yes) + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +FreeType configure 2.3.9 +generated by GNU Autoconf 2.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by FreeType $as_me 2.3.9, which was +generated by GNU Autoconf 2.63. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" +done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + +# Don't forget to update docs/VERSION.DLL! + +version_info='9:20:3' + +ft_version=`echo $version_info | tr : .` + + + +# checks for system type + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + + +# checks for programs + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# checks for native programs to generate building tool + +if test ${cross_compiling} = yes; then + # Extract the first word of "${build}-gcc", so it can be a program name with args. +set dummy ${build}-gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC_BUILD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC_BUILD"; then + ac_cv_prog_CC_BUILD="$CC_BUILD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC_BUILD="${build}-gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC_BUILD=$ac_cv_prog_CC_BUILD +if test -n "$CC_BUILD"; then + { $as_echo "$as_me:$LINENO: result: $CC_BUILD" >&5 +$as_echo "$CC_BUILD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -z "${CC_BUILD}" && # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC_BUILD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC_BUILD"; then + ac_cv_prog_CC_BUILD="$CC_BUILD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC_BUILD="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC_BUILD=$ac_cv_prog_CC_BUILD +if test -n "$CC_BUILD"; then + { $as_echo "$as_me:$LINENO: result: $CC_BUILD" >&5 +$as_echo "$CC_BUILD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -z "${CC_BUILD}" && # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC_BUILD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC_BUILD"; then + ac_cv_prog_CC_BUILD="$CC_BUILD" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC_BUILD="cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC_BUILD + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC_BUILD to just the basename; use the full file name. + shift + ac_cv_prog_CC_BUILD="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC_BUILD=$ac_cv_prog_CC_BUILD +if test -n "$CC_BUILD"; then + { $as_echo "$as_me:$LINENO: result: $CC_BUILD" >&5 +$as_echo "$CC_BUILD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -z "${CC_BUILD}" && { { $as_echo "$as_me:$LINENO: error: cannot find native C compiler" >&5 +$as_echo "$as_me: error: cannot find native C compiler" >&2;} + { (exit 1); exit 1; }; } + + { $as_echo "$as_me:$LINENO: checking for suffix of native executables" >&5 +$as_echo_n "checking for suffix of native executables... " >&6; } + rm -f a.* b.* a_out.exe conftest.* + echo > conftest.c "int main() { return 0;}" + ${CC_BUILD} conftest.c || { { $as_echo "$as_me:$LINENO: error: native C compiler is not working" >&5 +$as_echo "$as_me: error: native C compiler is not working" >&2;} + { (exit 1); exit 1; }; } + rm -f conftest.c + if test -x a.out -o -x b.out -o -x conftest; then + EXEEXT_BUILD="" + elif test -x a_out.exe -o -x conftest.exe; then + EXEEXT_BUILD=".exe" + elif test -x conftest.* ; then + EXEEXT_BUILD=`echo conftest.* | sed -n '1s/^.*\.//g'` + fi + { $as_echo "$as_me:$LINENO: result: $EXEEXT_BUILD" >&5 +$as_echo "$EXEEXT_BUILD" >&6; } +else + CC_BUILD=${CC} + EXEEXT_BUILD=${EXEEXT} +fi + + +if test ! -z ${EXEEXT_BUILD}; then + EXEEXT_BUILD=."${EXEEXT_BUILD}" +fi + + + + + +# get compiler flags right + +if test "x$CC" = xgcc; then + XX_CFLAGS="-Wall" + XX_ANSIFLAGS="-pedantic -ansi" +else + case "$host" in + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; + esac +fi + + + + +# auxiliary programs + +# Extract the first word of "rm", so it can be a program name with args. +set dummy rm; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RMF+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$RMF"; then + ac_cv_prog_RMF="$RMF" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RMF="rm -f" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RMF=$ac_cv_prog_RMF +if test -n "$RMF"; then + { $as_echo "$as_me:$LINENO: result: $RMF" >&5 +$as_echo "$RMF" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "rmdir", so it can be a program name with args. +set dummy rmdir; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RMDIR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$RMDIR"; then + ac_cv_prog_RMDIR="$RMDIR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RMDIR="rmdir" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RMDIR=$ac_cv_prog_RMDIR +if test -n "$RMDIR"; then + { $as_echo "$as_me:$LINENO: result: $RMDIR" >&5 +$as_echo "$RMDIR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Since this file will be finally moved to another directory we make +# the path of the install script absolute. This small code snippet has +# been taken from automake's `ylwrap' script. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + +done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +case "$INSTALL" in +/*) + ;; +*/*) + INSTALL="`pwd`/$INSTALL" ;; +esac + + +# checks for header files + + + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + +for ac_header in fcntl.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to freetype@nongnu.org ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +# checks for typedefs, structures, and compiler characteristics + +{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const /**/ +_ACEOF + +fi + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_int=$ac_lo;; +'') if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_int=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (int)); } +static unsigned long int ulongval () { return (long int) (sizeof (int)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (int))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (int)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (int)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_int=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_int=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long=$ac_lo;; +'') if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (long)); } +static unsigned long int ulongval () { return (long int) (sizeof (long)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (long))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (long)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (long)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + + + +# check whether cpp computation of size of int and long in ftconfig.in works + +{ $as_echo "$as_me:$LINENO: checking cpp computation of bit length in ftconfig.in works" >&5 +$as_echo_n "checking cpp computation of bit length in ftconfig.in works... " >&6; } +orig_CPPFLAGS="${CPPFLAGS}" +CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}" +ac_clean_files="ft2build.h ftoption.h ftstdlib.h" +touch ft2build.h ftoption.h ftstdlib.h + +cat > conftest.c <<\_ACEOF +#include +#define FT_CONFIG_OPTIONS_H "ftoption.h" +#define FT_CONFIG_STANDARD_LIBRARY_H "ftstdlib.h" +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX +#include "ftconfig.in" +_ACEOF +echo >> conftest.c "#if FT_SIZEOF_INT == "${ac_cv_sizeof_int} +echo >> conftest.c "ac_cpp_ft_sizeof_int="${ac_cv_sizeof_int} +echo >> conftest.c "#endif" +echo >> conftest.c "#if FT_SIZEOF_LONG == "${ac_cv_sizeof_long} +echo >> conftest.c "ac_cpp_ft_sizeof_long="${ac_cv_sizeof_long} +echo >> conftest.c "#endif" + +${CPP} ${CPPFLAGS} conftest.c | ${GREP} ac_cpp_ft > conftest.sh +eval `cat conftest.sh` +${RMF} conftest.c conftest.sh confft2build.h ftoption.h ftstdlib.h + +if test x != "x${ac_cpp_ft_sizeof_int}" \ + -a x != x"${ac_cpp_ft_sizeof_long}"; then + unset ft_use_autoconf_sizeof_types +else + ft_use_autoconf_sizeof_types=yes +fi + +# Check whether --enable-biarch-config was given. +if test "${enable_biarch_config+set}" = set; then + enableval=$enable_biarch_config; +fi + + +case :${ft_use_autoconf_sizeof_types}:${enable_biarch_config}: in + :yes:yes:) + { $as_echo "$as_me:$LINENO: result: broken but use it" >&5 +$as_echo "broken but use it" >&6; } + unset ft_use_autoconf_sizeof_types + ;; + ::no:) + { $as_echo "$as_me:$LINENO: result: works but ignore it" >&5 +$as_echo "works but ignore it" >&6; } + ft_use_autoconf_sizeof_types=yes + ;; + ::yes: | :::) + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + unset ft_use_autoconf_sizeof_types + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ft_use_autoconf_sizeof_types=yes + ;; +esac + +if test x"${ft_use_autoconf_sizeof_types}" = xyes; then + cat >>confdefs.h <<\_ACEOF +#define FT_USE_AUTOCONF_SIZEOF_TYPES 1 +_ACEOF + +fi + +CPPFLAGS="${orig_CPPFLAGS}" + + +# checks for library functions + +# Here we check whether we can use our mmap file component. + + + +for ac_header in stdlib.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to freetype@nongnu.org ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in getpagesize +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:$LINENO: checking for working mmap" >&5 +$as_echo_n "checking for working mmap... " >&6; } +if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H +char *malloc (); +#endif + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +/* Assume that all systems that can run configure have sys/param.h. */ +# ifndef HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +int +main () +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + return 1; + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + return 1; + if (write (fd, data, pagesize) != pagesize) + return 1; + close (fd); + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + return 1; + data2 = (char *) malloc (2 * pagesize); + if (!data2) + return 1; + data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + return 1; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + return 1; + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + return 1; + if (read (fd, data3, pagesize) != pagesize) + return 1; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + return 1; + close (fd); + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_mmap_fixed_mapped=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_mmap_fixed_mapped=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 +$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } +if test $ac_cv_func_mmap_fixed_mapped = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MMAP 1 +_ACEOF + +fi +rm -f conftest.mmap + +if test "$ac_cv_func_mmap_fixed_mapped" != yes; then + FTSYS_SRC='$(BASE_DIR)/ftsystem.c' +else + FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' + + { $as_echo "$as_me:$LINENO: checking whether munmap is declared" >&5 +$as_echo_n "checking whether munmap is declared... " >&6; } +if test "${ac_cv_have_decl_munmap+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#ifdef HAVE_UNISTD_H +#include +#endif +#include + + + +int +main () +{ +#ifndef munmap + (void) munmap; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_munmap=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_munmap=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_munmap" >&5 +$as_echo "$ac_cv_have_decl_munmap" >&6; } +if test "x$ac_cv_have_decl_munmap" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MUNMAP 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MUNMAP 0 +_ACEOF + + +fi + + + + { $as_echo "$as_me:$LINENO: checking for munmap's first parameter type" >&5 +$as_echo_n "checking for munmap's first parameter type... " >&6; } + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include +int munmap(void *, size_t); + + + +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: void *" >&5 +$as_echo "void *" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define MUNMAP_USES_VOIDP /**/ +_ACEOF + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: char *" >&5 +$as_echo "char *" >&6; } +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi + + + + +for ac_func in memcpy memmove +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +# check for system zlib + +# don't quote AS_HELP_STRING! + +# Check whether --with-zlib was given. +if test "${with_zlib+set}" = set; then + withval=$with_zlib; +fi + +if test x$with_zlib != xno && test -z "$LIBZ"; then + { $as_echo "$as_me:$LINENO: checking for gzsetparams in -lz" >&5 +$as_echo_n "checking for gzsetparams in -lz... " >&6; } +if test "${ac_cv_lib_z_gzsetparams+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gzsetparams (); +int +main () +{ +return gzsetparams (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_z_gzsetparams=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_z_gzsetparams=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_z_gzsetparams" >&5 +$as_echo "$ac_cv_lib_z_gzsetparams" >&6; } +if test "x$ac_cv_lib_z_gzsetparams" = x""yes; then + if test "${ac_cv_header_zlib_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for zlib.h" >&5 +$as_echo_n "checking for zlib.h... " >&6; } +if test "${ac_cv_header_zlib_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_zlib_h" >&5 +$as_echo "$ac_cv_header_zlib_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking zlib.h usability" >&5 +$as_echo_n "checking zlib.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking zlib.h presence" >&5 +$as_echo_n "checking zlib.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: zlib.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: zlib.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: zlib.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: zlib.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: zlib.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: zlib.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: zlib.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: zlib.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: zlib.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: zlib.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: zlib.h: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to freetype@nongnu.org ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for zlib.h" >&5 +$as_echo_n "checking for zlib.h... " >&6; } +if test "${ac_cv_header_zlib_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_zlib_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_zlib_h" >&5 +$as_echo "$ac_cv_header_zlib_h" >&6; } + +fi +if test "x$ac_cv_header_zlib_h" = x""yes; then + LIBZ='-lz' +fi + + +fi + +fi +if test x$with_zlib != xno && test -n "$LIBZ"; then + CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB" + LDFLAGS="$LDFLAGS $LIBZ" + SYSTEM_ZLIB=yes +fi + + +# check Apple's `-isysroot' option and duplicate it to LDFLAGS if required -- +# Apple TechNote 2137 recommends to include it in CFLAGS but not in LDFLAGS + +{ $as_echo "$as_me:$LINENO: checking whether CFLAGS includes -isysroot option" >&5 +$as_echo_n "checking whether CFLAGS includes -isysroot option... " >&6; } +case "$CFLAGS" in +*sysroot* ) + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + { $as_echo "$as_me:$LINENO: checking whether LDFLAGS includes -isysroot option" >&5 +$as_echo_n "checking whether LDFLAGS includes -isysroot option... " >&6; } + case "$LDFLAGS" in + *sysroot* ) + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + isysroot_dir=`echo ${CFLAGS} | tr '\t' ' ' | sed 's/^.*-isysroot *//;s/ .*//'` + { $as_echo "$as_me:$LINENO: WARNING: -isysroot ${isysroot_dir} is added to LDFLAGS" >&5 +$as_echo "$as_me: WARNING: -isysroot ${isysroot_dir} is added to LDFLAGS" >&2;} + LDFLAGS="-isysroot ${isysroot_dir} ${LDFLAGS}" + ;; + esac + ;; +*) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; +esac + + +# Whether to use Mac OS resource-based fonts. + +ftmac_c="" # src/base/ftmac.c should not be included in makefiles by default + +# don't quote AS_HELP_STRING! + +# Check whether --with-old-mac-fonts was given. +if test "${with_old_mac_fonts+set}" = set; then + withval=$with_old_mac_fonts; +fi + +if test x$with_old_mac_fonts = xyes; then + orig_LDFLAGS="${LDFLAGS}" + { $as_echo "$as_me:$LINENO: checking CoreServices & ApplicationServices of Mac OS X" >&5 +$as_echo_n "checking CoreServices & ApplicationServices of Mac OS X... " >&6; } + FT2_EXTRA_LIBS="-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices" + LDFLAGS="$LDFLAGS $FT2_EXTRA_LIBS" + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + +int +main () +{ + + + short res = 0; + + + UseResFile( res ); + + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } + ftmac_c='ftmac.c' + { $as_echo "$as_me:$LINENO: checking OS_INLINE macro is ANSI compatible" >&5 +$as_echo_n "checking OS_INLINE macro is ANSI compatible... " >&6; } + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + +int +main () +{ + + + /* OSHostByteOrder() is typed as OS_INLINE */ + int32_t os_byte_order = OSHostByteOrder(); + + + if ( OSBigEndian != os_byte_order ) + return 1; + + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_ANSI_OS_INLINE=1" + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: no, ANSI incompatible" >&5 +$as_echo "no, ANSI incompatible" >&6; } + CFLAGS="$orig_CFLAGS" + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { $as_echo "$as_me:$LINENO: checking type ResourceIndex" >&5 +$as_echo_n "checking type ResourceIndex... " >&6; } + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +# include +#endif + + +int +main () +{ + + + ResourceIndex i = 0; + return i; + + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=1" + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=0" + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + FT2_EXTRA_LIBS="" + LDFLAGS="${orig_LDFLAGS}" + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +else + case x$host_os in + xdarwin*) + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" + ;; + *) ;; + esac +fi + + +# Whether to use FileManager which is deprecated since Mac OS X 10.4. + + +# Check whether --with-fsspec was given. +if test "${with_fsspec+set}" = set; then + withval=$with_fsspec; +fi + +if test x$with_fsspec = xno; then + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0" +elif test x$with_old_mac_fonts = xyes -a x$with_fsspec != x; then + { $as_echo "$as_me:$LINENO: checking FSSpec-based FileManager" >&5 +$as_echo_n "checking FSSpec-based FileManager... " >&6; } + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + +int +main () +{ + + + FCBPBPtr paramBlock; + short vRefNum; + long dirID; + ConstStr255Param fileName; + FSSpec* spec; + + + /* FSSpec functions: deprecated since Mac OS X 10.4 */ + PBGetFCBInfoSync( paramBlock ); + FSMakeFSSpec( vRefNum, dirID, fileName, spec ); + + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } + CFLAGS="$CFLAGS -DHAVE_FSSPEC=1" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi + + +# Whether to use FileManager in Carbon since MacOS 9.x. + + +# Check whether --with-fsref was given. +if test "${with_fsref+set}" = set; then + withval=$with_fsref; +fi + +if test x$with_fsref = xno; then + { $as_echo "$as_me:$LINENO: WARNING: +*** WARNING + FreeType2 built without FSRef API cannot load + data-fork fonts on MacOS, except of XXX.dfont. + " >&5 +$as_echo "$as_me: WARNING: +*** WARNING + FreeType2 built without FSRef API cannot load + data-fork fonts on MacOS, except of XXX.dfont. + " >&2;} + CFLAGS="$CFLAGS -DHAVE_FSREF=0" +elif test x$with_old_mac_fonts = xyes -a x$with_fsref != x; then + { $as_echo "$as_me:$LINENO: checking FSRef-based FileManager" >&5 +$as_echo_n "checking FSRef-based FileManager... " >&6; } + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + +int +main () +{ + + + short vRefNum; + long dirID; + ConstStr255Param fileName; + + Boolean* isDirectory; + UInt8* path; + SInt16 desiredRefNum; + SInt16* iterator; + SInt16* actualRefNum; + HFSUniStr255* outForkName; + FSVolumeRefNum volume; + FSCatalogInfoBitmap whichInfo; + FSCatalogInfo* catalogInfo; + FSForkInfo* forkInfo; + FSRef* ref; + +#if HAVE_FSSPEC + FSSpec* spec; +#endif + + /* FSRef functions: no need to check? */ + FSGetForkCBInfo( desiredRefNum, volume, iterator, + actualRefNum, forkInfo, ref, + outForkName ); + FSPathMakeRef( path, ref, isDirectory ); + +#if HAVE_FSSPEC + FSpMakeFSRef ( spec, ref ); + FSGetCatalogInfo( ref, whichInfo, catalogInfo, + outForkName, spec, ref ); +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } + CFLAGS="$CFLAGS -DHAVE_FSREF=1" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + CFLAGS="$CFLAGS -DHAVE_FSREF=0" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi + + +# Whether to use QuickDraw API in ToolBox which is deprecated since +# Mac OS X 10.4. + + +# Check whether --with-quickdraw-toolbox was given. +if test "${with_quickdraw_toolbox+set}" = set; then + withval=$with_quickdraw_toolbox; +fi + +if test x$with_quickdraw_toolbox = xno; then + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0" +elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_toolbox != x; then + { $as_echo "$as_me:$LINENO: checking QuickDraw FontManager functions in ToolBox" >&5 +$as_echo_n "checking QuickDraw FontManager functions in ToolBox... " >&6; } + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + +int +main () +{ + + + Str255 familyName; + SInt16 familyID = 0; + FMInput* fmIn = NULL; + FMOutput* fmOut = NULL; + + + GetFontName( familyID, familyName ); + GetFNum( familyName, &familyID ); + fmOut = FMSwapFont( fmIn ); + + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi + + +# Whether to use QuickDraw API in Carbon which is deprecated since +# Mac OS X 10.4. + + +# Check whether --with-quickdraw-carbon was given. +if test "${with_quickdraw_carbon+set}" = set; then + withval=$with_quickdraw_carbon; +fi + +if test x$with_quickdraw_carbon = xno; then + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0" +elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_carbon != x; then + { $as_echo "$as_me:$LINENO: checking QuickDraw FontManager functions in Carbon" >&5 +$as_echo_n "checking QuickDraw FontManager functions in Carbon... " >&6; } + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + +int +main () +{ + + + FMFontFamilyIterator famIter; + FMFontFamily family; + Str255 famNameStr; + FMFontFamilyInstanceIterator instIter; + FMFontStyle style; + FMFontSize size; + FMFont font; + FSSpec* pathSpec; + + + FMCreateFontFamilyIterator( NULL, NULL, kFMUseGlobalScopeOption, + &famIter ); + FMGetNextFontFamily( &famIter, &family ); + FMGetFontFamilyName( family, famNameStr ); + FMCreateFontFamilyInstanceIterator( family, &instIter ); + FMGetNextFontFamilyInstance( &instIter, &font, &style, &size ); + FMDisposeFontFamilyInstanceIterator( &instIter ); + FMDisposeFontFamilyIterator( &famIter ); + FMGetFontContainer( font, pathSpec ); + + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi + + +# Whether to use AppleTypeService since Mac OS X. + +# don't quote AS_HELP_STRING! + +# Check whether --with-ats was given. +if test "${with_ats+set}" = set; then + withval=$with_ats; +fi + +if test x$with_ats = xno; then + CFLAGS="$CFLAGS -DHAVE_ATS=0" +elif test x$with_old_mac_fonts = xyes -a x$with_ats != x ; then + { $as_echo "$as_me:$LINENO: checking AppleTypeService functions" >&5 +$as_echo_n "checking AppleTypeService functions... " >&6; } + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + +int +main () +{ + + + FSSpec* pathSpec; + + + ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope ); +#if HAVE_FSSPEC + ATSFontGetFileSpecification( 0, pathSpec ); +#endif + + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } + CFLAGS="$CFLAGS -DHAVE_ATS=1" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + CFLAGS="$CFLAGS -DHAVE_ATS=0" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi + +case "$CFLAGS" in + *HAVE_FSSPEC* | *HAVE_FSREF* | *HAVE_QUICKDRAW* | *HAVE_ATS* ) + { $as_echo "$as_me:$LINENO: WARNING: +*** WARNING + FSSpec/FSRef/QuickDraw/ATS options are explicitly given, + thus it is recommended to replace src/base/ftmac.c by builds/mac/ftmac.c. + " >&5 +$as_echo "$as_me: WARNING: +*** WARNING + FSSpec/FSRef/QuickDraw/ATS options are explicitly given, + thus it is recommended to replace src/base/ftmac.c by builds/mac/ftmac.c. + " >&2;} + CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/' + ;; + *) + ;; +esac + + + + + + + + + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.2.6' +macro_revision='1.3012' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${ac_cv_path_SED+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + $as_unset ac_script || ac_script= + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if test "${ac_cv_path_FGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test "${lt_cv_path_NM+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$ac_tool_prefix"; then + for ac_prog in "dumpbin -symbols" "link -dump -symbols" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DUMPBIN+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:$LINENO: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in "dumpbin -symbols" "link -dump -symbols" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if test "${lt_cv_nm_interface+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:7333: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:7336: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:7339: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:$LINENO: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:$LINENO: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:$LINENO: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJDUMP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:$LINENO: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:$LINENO: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } +fi + + + + + + + + + + + + + + + + + + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 8541 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_cc_needs_belf=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_cc_needs_belf=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DSYMUTIL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:$LINENO: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_NMEDIT+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:$LINENO: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_LIPO+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:$LINENO: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:$LINENO: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL64+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:$LINENO: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if test "${lt_cv_apple_cc_single_mod+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if test "${lt_cv_ld_exported_symbols_list+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_ld_exported_symbols_list=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_ld_exported_symbols_list=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + + +for ac_header in dlfcn.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +# Set options +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AS+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:$LINENO: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AS+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DLLTOOL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:$LINENO: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJDUMP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + enable_dlopen=no + + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; then + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + + + + + + + + + + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:$LINENO: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:10204: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:10208: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + + + + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:10543: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:10547: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:10648: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:10652: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:10703: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:10707: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat >conftest.$ac_ext <<_ACEOF +int foo(void) {} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then + shlibpath_overrides_runpath=yes +fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 +$as_echo_n "checking for shl_load... " >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +$as_echo "$ac_cv_func_shl_load" >&6; } +if test "x$ac_cv_func_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 +$as_echo_n "checking for dlopen... " >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +$as_echo "$ac_cv_func_dlopen" >&6; } +if test "x$ac_cv_func_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_svld_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_dld_link=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line 13503 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line 13599 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:$LINENO: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + + + + + +# configuration file -- stay in 8.3 limit +# +# since #undef doesn't survive in configuration header files we replace +# `/undef' with `#undef' after creating the output file + +ac_config_headers="$ac_config_headers ftconfig.h:ftconfig.in" + + +# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' +# and `builds/unix/unix-cc.mk' that will be used by the build system +# +ac_config_files="$ac_config_files unix-cc.mk:unix-cc.in unix-def.mk:unix-def.in freetype-config freetype2.pc:freetype2.in" + + +# re-generate the Jamfile to use libtool now +# +# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 + +# Save the log message, to keep $[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by FreeType $as_me 2.3.9, which was +generated by GNU Autoconf 2.63. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +FreeType config.status 2.3.9 +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { $as_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +AS='`$ECHO "X$AS" | $Xsed -e "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "X$DLLTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +AR \ +AR_FLAGS \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +SHELL \ +ECHO \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_wl \ +lt_prog_compiler_pic \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_flag_spec_ld \ +hardcode_libdir_separator \ +fix_srcfile_path \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` + ;; +esac + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "ftconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS ftconfig.h:ftconfig.in" ;; + "unix-cc.mk") CONFIG_FILES="$CONFIG_FILES unix-cc.mk:unix-cc.in" ;; + "unix-def.mk") CONFIG_FILES="$CONFIG_FILES unix-def.mk:unix-def.in" ;; + "freetype-config") CONFIG_FILES="$CONFIG_FILES freetype-config" ;; + "freetype2.pc") CONFIG_FILES="$CONFIG_FILES freetype2.pc:freetype2.in" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\).*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\).*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$ac_file_inputs '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="" + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Assembler program. +AS=$AS + +# DLL creation program. +DLLTOOL=$DLLTOOL + +# Object dumper program. +OBJDUMP=$OBJDUMP + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that does not interpret backslashes. +ECHO=$lt_ECHO + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[^=]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$@"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1+=\$2" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1=\$$1\$2" +} + +_LT_EOF + ;; + esac + + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + "ftconfig.h":H) mv ftconfig.h ftconfig.tmp + sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h + rm ftconfig.tmp ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +# end of configure.raw diff --git a/src/3rdparty/freetype/builds/unix/configure.ac b/src/3rdparty/freetype/builds/unix/configure.ac new file mode 100644 index 0000000000..26f40ddfeb --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/configure.ac @@ -0,0 +1,669 @@ +# This file is part of the FreeType project. +# +# Process this file with autoconf to produce a configure script. +# +# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +AC_INIT([FreeType], [2.3.9], [freetype@nongnu.org], [freetype]) +AC_CONFIG_SRCDIR([ftconfig.in]) + + +# Don't forget to update docs/VERSION.DLL! + +version_info='9:20:3' +AC_SUBST([version_info]) +ft_version=`echo $version_info | tr : .` +AC_SUBST([ft_version]) + + +# checks for system type + +AC_CANONICAL_HOST + + +# checks for programs + +AC_PROG_CC +AC_PROG_CPP +AC_SUBST(EXEEXT) + + +# checks for native programs to generate building tool + +if test ${cross_compiling} = yes; then + AC_CHECK_PROG(CC_BUILD, ${build}-gcc, ${build}-gcc) + test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, gcc, gcc) + test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, cc, cc, , , /usr/ucb/cc) + test -z "${CC_BUILD}" && AC_MSG_ERROR([cannot find native C compiler]) + + AC_MSG_CHECKING([for suffix of native executables]) + rm -f a.* b.* a_out.exe conftest.* + echo > conftest.c "int main() { return 0;}" + ${CC_BUILD} conftest.c || AC_MSG_ERROR([native C compiler is not working]) + rm -f conftest.c + if test -x a.out -o -x b.out -o -x conftest; then + EXEEXT_BUILD="" + elif test -x a_out.exe -o -x conftest.exe; then + EXEEXT_BUILD=".exe" + elif test -x conftest.* ; then + EXEEXT_BUILD=`echo conftest.* | sed -n '1s/^.*\.//g'` + fi + AC_MSG_RESULT($EXEEXT_BUILD) +else + CC_BUILD=${CC} + EXEEXT_BUILD=${EXEEXT} +fi + + +if test ! -z ${EXEEXT_BUILD}; then + EXEEXT_BUILD=."${EXEEXT_BUILD}" +fi +AC_SUBST(CC_BUILD) +AC_SUBST(EXEEXT_BUILD) + + + +# get compiler flags right + +if test "x$CC" = xgcc; then + XX_CFLAGS="-Wall" + XX_ANSIFLAGS="-pedantic -ansi" +else + case "$host" in + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; + esac +fi +AC_SUBST([XX_CFLAGS]) +AC_SUBST([XX_ANSIFLAGS]) + + +# auxiliary programs + +AC_CHECK_PROG([RMF], [rm], [rm -f]) +AC_CHECK_PROG([RMDIR], [rmdir], [rmdir]) + + +# Since this file will be finally moved to another directory we make +# the path of the install script absolute. This small code snippet has +# been taken from automake's `ylwrap' script. + +AC_PROG_INSTALL +case "$INSTALL" in +/*) + ;; +*/*) + INSTALL="`pwd`/$INSTALL" ;; +esac + + +# checks for header files + +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h unistd.h]) + + +# checks for typedefs, structures, and compiler characteristics + +AC_C_CONST +AC_CHECK_SIZEOF([int]) +AC_CHECK_SIZEOF([long]) + + +# check whether cpp computation of size of int and long in ftconfig.in works + +AC_MSG_CHECKING([cpp computation of bit length in ftconfig.in works]) +orig_CPPFLAGS="${CPPFLAGS}" +CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}" +ac_clean_files="ft2build.h ftoption.h ftstdlib.h" +touch ft2build.h ftoption.h ftstdlib.h + +cat > conftest.c <<\_ACEOF +#include +#define FT_CONFIG_OPTIONS_H "ftoption.h" +#define FT_CONFIG_STANDARD_LIBRARY_H "ftstdlib.h" +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX +#include "ftconfig.in" +_ACEOF +echo >> conftest.c "#if FT_SIZEOF_INT == "${ac_cv_sizeof_int} +echo >> conftest.c "ac_cpp_ft_sizeof_int="${ac_cv_sizeof_int} +echo >> conftest.c "#endif" +echo >> conftest.c "#if FT_SIZEOF_LONG == "${ac_cv_sizeof_long} +echo >> conftest.c "ac_cpp_ft_sizeof_long="${ac_cv_sizeof_long} +echo >> conftest.c "#endif" + +${CPP} ${CPPFLAGS} conftest.c | ${GREP} ac_cpp_ft > conftest.sh +eval `cat conftest.sh` +${RMF} conftest.c conftest.sh confft2build.h ftoption.h ftstdlib.h + +if test x != "x${ac_cpp_ft_sizeof_int}" \ + -a x != x"${ac_cpp_ft_sizeof_long}"; then + unset ft_use_autoconf_sizeof_types +else + ft_use_autoconf_sizeof_types=yes +fi + +AC_ARG_ENABLE(biarch-config, +[ --enable-biarch-config install biarch ftconfig.h to support multiple + architectures by single file], [], []) + +case :${ft_use_autoconf_sizeof_types}:${enable_biarch_config}: in + :yes:yes:) + AC_MSG_RESULT([broken but use it]) + unset ft_use_autoconf_sizeof_types + ;; + ::no:) + AC_MSG_RESULT([works but ignore it]) + ft_use_autoconf_sizeof_types=yes + ;; + ::yes: | :::) + AC_MSG_RESULT([yes]) + unset ft_use_autoconf_sizeof_types + ;; + *) + AC_MSG_RESULT([no]) + ft_use_autoconf_sizeof_types=yes + ;; +esac + +if test x"${ft_use_autoconf_sizeof_types}" = xyes; then + AC_DEFINE([FT_USE_AUTOCONF_SIZEOF_TYPES]) +fi + +CPPFLAGS="${orig_CPPFLAGS}" + + +# checks for library functions + +# Here we check whether we can use our mmap file component. + +AC_FUNC_MMAP +if test "$ac_cv_func_mmap_fixed_mapped" != yes; then + FTSYS_SRC='$(BASE_DIR)/ftsystem.c' +else + FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' + + AC_CHECK_DECLS([munmap], + [], + [], + [ + +#ifdef HAVE_UNISTD_H +#include +#endif +#include + + ]) + + FT_MUNMAP_PARAM +fi +AC_SUBST([FTSYS_SRC]) + +AC_CHECK_FUNCS([memcpy memmove]) + + +# check for system zlib + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([zlib], + AS_HELP_STRING([--without-zlib], + [use internal zlib instead of system-wide])) +if test x$with_zlib != xno && test -z "$LIBZ"; then + AC_CHECK_LIB([z], [gzsetparams], [AC_CHECK_HEADER([zlib.h], [LIBZ='-lz'])]) +fi +if test x$with_zlib != xno && test -n "$LIBZ"; then + CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB" + LDFLAGS="$LDFLAGS $LIBZ" + SYSTEM_ZLIB=yes +fi + + +# check Apple's `-isysroot' option and duplicate it to LDFLAGS if required -- +# Apple TechNote 2137 recommends to include it in CFLAGS but not in LDFLAGS + +AC_MSG_CHECKING([whether CFLAGS includes -isysroot option]) +case "$CFLAGS" in +*sysroot* ) + AC_MSG_RESULT([yes]) + AC_MSG_CHECKING([whether LDFLAGS includes -isysroot option]) + case "$LDFLAGS" in + *sysroot* ) + AC_MSG_RESULT([yes]) + ;; + *) + AC_MSG_RESULT([no]) + isysroot_dir=`echo ${CFLAGS} | tr '\t' ' ' | sed 's/^.*-isysroot *//;s/ .*//'` + AC_MSG_WARN(-isysroot ${isysroot_dir} is added to LDFLAGS) + LDFLAGS="-isysroot ${isysroot_dir} ${LDFLAGS}" + ;; + esac + ;; +*) + AC_MSG_RESULT([no]) + ;; +esac + + +# Whether to use Mac OS resource-based fonts. + +ftmac_c="" # src/base/ftmac.c should not be included in makefiles by default + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([old-mac-fonts], + AS_HELP_STRING([--with-old-mac-fonts], + [allow Mac resource-based fonts to be used])) +if test x$with_old_mac_fonts = xyes; then + orig_LDFLAGS="${LDFLAGS}" + AC_MSG_CHECKING([CoreServices & ApplicationServices of Mac OS X]) + FT2_EXTRA_LIBS="-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices" + LDFLAGS="$LDFLAGS $FT2_EXTRA_LIBS" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + short res = 0; + + + UseResFile( res ); + + ])], + [AC_MSG_RESULT([ok]) + ftmac_c='ftmac.c' + AC_MSG_CHECKING([OS_INLINE macro is ANSI compatible]) + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + /* OSHostByteOrder() is typed as OS_INLINE */ + int32_t os_byte_order = OSHostByteOrder(); + + + if ( OSBigEndian != os_byte_order ) + return 1; + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_ANSI_OS_INLINE=1" + ], + [AC_MSG_RESULT([no, ANSI incompatible]) + CFLAGS="$orig_CFLAGS" + ]) + AC_MSG_CHECKING([type ResourceIndex]) + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +# include +#endif + + ], + [ + + ResourceIndex i = 0; + return i; + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=1" + ], + [AC_MSG_RESULT([no]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=0" + ])], + [AC_MSG_RESULT([not found]) + FT2_EXTRA_LIBS="" + LDFLAGS="${orig_LDFLAGS}" + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"]) +else + case x$host_os in + xdarwin*) + dnl AC_MSG_WARN([host system is MacOS but configured to build without Carbon]) + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" + ;; + *) ;; + esac +fi + + +# Whether to use FileManager which is deprecated since Mac OS X 10.4. + +AC_ARG_WITH([fsspec], + AS_HELP_STRING([--with-fsspec], + [use obsolete FSSpec API of MacOS, if available (default=yes)])) +if test x$with_fsspec = xno; then + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0" +elif test x$with_old_mac_fonts = xyes -a x$with_fsspec != x; then + AC_MSG_CHECKING([FSSpec-based FileManager]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FCBPBPtr paramBlock; + short vRefNum; + long dirID; + ConstStr255Param fileName; + FSSpec* spec; + + + /* FSSpec functions: deprecated since Mac OS X 10.4 */ + PBGetFCBInfoSync( paramBlock ); + FSMakeFSSpec( vRefNum, dirID, fileName, spec ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_FSSPEC=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0"]) +fi + + +# Whether to use FileManager in Carbon since MacOS 9.x. + +AC_ARG_WITH([fsref], + AS_HELP_STRING([--with-fsref], + [use Carbon FSRef API of MacOS, if available (default=yes)])) +if test x$with_fsref = xno; then + AC_MSG_WARN([ +*** WARNING + FreeType2 built without FSRef API cannot load + data-fork fonts on MacOS, except of XXX.dfont. + ]) + CFLAGS="$CFLAGS -DHAVE_FSREF=0" +elif test x$with_old_mac_fonts = xyes -a x$with_fsref != x; then + AC_MSG_CHECKING([FSRef-based FileManager]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + short vRefNum; + long dirID; + ConstStr255Param fileName; + + Boolean* isDirectory; + UInt8* path; + SInt16 desiredRefNum; + SInt16* iterator; + SInt16* actualRefNum; + HFSUniStr255* outForkName; + FSVolumeRefNum volume; + FSCatalogInfoBitmap whichInfo; + FSCatalogInfo* catalogInfo; + FSForkInfo* forkInfo; + FSRef* ref; + +#if HAVE_FSSPEC + FSSpec* spec; +#endif + + /* FSRef functions: no need to check? */ + FSGetForkCBInfo( desiredRefNum, volume, iterator, + actualRefNum, forkInfo, ref, + outForkName ); + FSPathMakeRef( path, ref, isDirectory ); + +#if HAVE_FSSPEC + FSpMakeFSRef ( spec, ref ); + FSGetCatalogInfo( ref, whichInfo, catalogInfo, + outForkName, spec, ref ); +#endif + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_FSREF=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_FSREF=0"]) +fi + + +# Whether to use QuickDraw API in ToolBox which is deprecated since +# Mac OS X 10.4. + +AC_ARG_WITH([quickdraw-toolbox], + AS_HELP_STRING([--with-quickdraw-toolbox], + [use MacOS QuickDraw in ToolBox, if available (default=yes)])) +if test x$with_quickdraw_toolbox = xno; then + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0" +elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_toolbox != x; then + AC_MSG_CHECKING([QuickDraw FontManager functions in ToolBox]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + Str255 familyName; + SInt16 familyID = 0; + FMInput* fmIn = NULL; + FMOutput* fmOut = NULL; + + + GetFontName( familyID, familyName ); + GetFNum( familyName, &familyID ); + fmOut = FMSwapFont( fmIn ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0"]) +fi + + +# Whether to use QuickDraw API in Carbon which is deprecated since +# Mac OS X 10.4. + +AC_ARG_WITH([quickdraw-carbon], + AS_HELP_STRING([--with-quickdraw-carbon], + [use MacOS QuickDraw in Carbon, if available (default=yes)])) +if test x$with_quickdraw_carbon = xno; then + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0" +elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_carbon != x; then + AC_MSG_CHECKING([QuickDraw FontManager functions in Carbon]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FMFontFamilyIterator famIter; + FMFontFamily family; + Str255 famNameStr; + FMFontFamilyInstanceIterator instIter; + FMFontStyle style; + FMFontSize size; + FMFont font; + FSSpec* pathSpec; + + + FMCreateFontFamilyIterator( NULL, NULL, kFMUseGlobalScopeOption, + &famIter ); + FMGetNextFontFamily( &famIter, &family ); + FMGetFontFamilyName( family, famNameStr ); + FMCreateFontFamilyInstanceIterator( family, &instIter ); + FMGetNextFontFamilyInstance( &instIter, &font, &style, &size ); + FMDisposeFontFamilyInstanceIterator( &instIter ); + FMDisposeFontFamilyIterator( &famIter ); + FMGetFontContainer( font, pathSpec ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0"]) +fi + + +# Whether to use AppleTypeService since Mac OS X. + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([ats], + AS_HELP_STRING([--with-ats], + [use AppleTypeService, if available (default=yes)])) +if test x$with_ats = xno; then + CFLAGS="$CFLAGS -DHAVE_ATS=0" +elif test x$with_old_mac_fonts = xyes -a x$with_ats != x ; then + AC_MSG_CHECKING([AppleTypeService functions]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FSSpec* pathSpec; + + + ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope ); +#if HAVE_FSSPEC + ATSFontGetFileSpecification( 0, pathSpec ); +#endif + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_ATS=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_ATS=0"]) +fi + +case "$CFLAGS" in + *HAVE_FSSPEC* | *HAVE_FSREF* | *HAVE_QUICKDRAW* | *HAVE_ATS* ) + AC_MSG_WARN([ +*** WARNING + FSSpec/FSRef/QuickDraw/ATS options are explicitly given, + thus it is recommended to replace src/base/ftmac.c by builds/mac/ftmac.c. + ]) + CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/' + ;; + *) + ;; +esac + + +AC_SUBST([ftmac_c]) +AC_SUBST([LIBZ]) +AC_SUBST([CFLAGS]) +AC_SUBST([LDFLAGS]) +AC_SUBST([FT2_EXTRA_LIBS]) +AC_SUBST([SYSTEM_ZLIB]) + + +LT_INIT(win32-dll) + +AC_SUBST([hardcode_libdir_flag_spec]) +AC_SUBST([wl]) +AC_SUBST([build_libtool_libs]) + + +# configuration file -- stay in 8.3 limit +# +# since #undef doesn't survive in configuration header files we replace +# `/undef' with `#undef' after creating the output file + +AC_CONFIG_HEADERS([ftconfig.h:ftconfig.in], + [mv ftconfig.h ftconfig.tmp + sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h + rm ftconfig.tmp]) + +# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' +# and `builds/unix/unix-cc.mk' that will be used by the build system +# +AC_CONFIG_FILES([unix-cc.mk:unix-cc.in + unix-def.mk:unix-def.in + freetype-config + freetype2.pc:freetype2.in]) + +# re-generate the Jamfile to use libtool now +# +# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) + +AC_OUTPUT + +# end of configure.raw diff --git a/src/3rdparty/freetype/builds/unix/configure.raw b/src/3rdparty/freetype/builds/unix/configure.raw new file mode 100644 index 0000000000..38c5241cfb --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/configure.raw @@ -0,0 +1,669 @@ +# This file is part of the FreeType project. +# +# Process this file with autoconf to produce a configure script. +# +# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +AC_INIT([FreeType], [@VERSION@], [freetype@nongnu.org], [freetype]) +AC_CONFIG_SRCDIR([ftconfig.in]) + + +# Don't forget to update docs/VERSION.DLL! + +version_info='9:20:3' +AC_SUBST([version_info]) +ft_version=`echo $version_info | tr : .` +AC_SUBST([ft_version]) + + +# checks for system type + +AC_CANONICAL_HOST + + +# checks for programs + +AC_PROG_CC +AC_PROG_CPP +AC_SUBST(EXEEXT) + + +# checks for native programs to generate building tool + +if test ${cross_compiling} = yes; then + AC_CHECK_PROG(CC_BUILD, ${build}-gcc, ${build}-gcc) + test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, gcc, gcc) + test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, cc, cc, , , /usr/ucb/cc) + test -z "${CC_BUILD}" && AC_MSG_ERROR([cannot find native C compiler]) + + AC_MSG_CHECKING([for suffix of native executables]) + rm -f a.* b.* a_out.exe conftest.* + echo > conftest.c "int main() { return 0;}" + ${CC_BUILD} conftest.c || AC_MSG_ERROR([native C compiler is not working]) + rm -f conftest.c + if test -x a.out -o -x b.out -o -x conftest; then + EXEEXT_BUILD="" + elif test -x a_out.exe -o -x conftest.exe; then + EXEEXT_BUILD=".exe" + elif test -x conftest.* ; then + EXEEXT_BUILD=`echo conftest.* | sed -n '1s/^.*\.//g'` + fi + AC_MSG_RESULT($EXEEXT_BUILD) +else + CC_BUILD=${CC} + EXEEXT_BUILD=${EXEEXT} +fi + + +if test ! -z ${EXEEXT_BUILD}; then + EXEEXT_BUILD=."${EXEEXT_BUILD}" +fi +AC_SUBST(CC_BUILD) +AC_SUBST(EXEEXT_BUILD) + + + +# get compiler flags right + +if test "x$CC" = xgcc; then + XX_CFLAGS="-Wall" + XX_ANSIFLAGS="-pedantic -ansi" +else + case "$host" in + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; + esac +fi +AC_SUBST([XX_CFLAGS]) +AC_SUBST([XX_ANSIFLAGS]) + + +# auxiliary programs + +AC_CHECK_PROG([RMF], [rm], [rm -f]) +AC_CHECK_PROG([RMDIR], [rmdir], [rmdir]) + + +# Since this file will be finally moved to another directory we make +# the path of the install script absolute. This small code snippet has +# been taken from automake's `ylwrap' script. + +AC_PROG_INSTALL +case "$INSTALL" in +/*) + ;; +*/*) + INSTALL="`pwd`/$INSTALL" ;; +esac + + +# checks for header files + +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h unistd.h]) + + +# checks for typedefs, structures, and compiler characteristics + +AC_C_CONST +AC_CHECK_SIZEOF([int]) +AC_CHECK_SIZEOF([long]) + + +# check whether cpp computation of size of int and long in ftconfig.in works + +AC_MSG_CHECKING([cpp computation of bit length in ftconfig.in works]) +orig_CPPFLAGS="${CPPFLAGS}" +CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}" +ac_clean_files="ft2build.h ftoption.h ftstdlib.h" +touch ft2build.h ftoption.h ftstdlib.h + +cat > conftest.c <<\_ACEOF +#include +#define FT_CONFIG_OPTIONS_H "ftoption.h" +#define FT_CONFIG_STANDARD_LIBRARY_H "ftstdlib.h" +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX +#include "ftconfig.in" +_ACEOF +echo >> conftest.c "#if FT_SIZEOF_INT == "${ac_cv_sizeof_int} +echo >> conftest.c "ac_cpp_ft_sizeof_int="${ac_cv_sizeof_int} +echo >> conftest.c "#endif" +echo >> conftest.c "#if FT_SIZEOF_LONG == "${ac_cv_sizeof_long} +echo >> conftest.c "ac_cpp_ft_sizeof_long="${ac_cv_sizeof_long} +echo >> conftest.c "#endif" + +${CPP} ${CPPFLAGS} conftest.c | ${GREP} ac_cpp_ft > conftest.sh +eval `cat conftest.sh` +${RMF} conftest.c conftest.sh confft2build.h ftoption.h ftstdlib.h + +if test x != "x${ac_cpp_ft_sizeof_int}" \ + -a x != x"${ac_cpp_ft_sizeof_long}"; then + unset ft_use_autoconf_sizeof_types +else + ft_use_autoconf_sizeof_types=yes +fi + +AC_ARG_ENABLE(biarch-config, +[ --enable-biarch-config install biarch ftconfig.h to support multiple + architectures by single file], [], []) + +case :${ft_use_autoconf_sizeof_types}:${enable_biarch_config}: in + :yes:yes:) + AC_MSG_RESULT([broken but use it]) + unset ft_use_autoconf_sizeof_types + ;; + ::no:) + AC_MSG_RESULT([works but ignore it]) + ft_use_autoconf_sizeof_types=yes + ;; + ::yes: | :::) + AC_MSG_RESULT([yes]) + unset ft_use_autoconf_sizeof_types + ;; + *) + AC_MSG_RESULT([no]) + ft_use_autoconf_sizeof_types=yes + ;; +esac + +if test x"${ft_use_autoconf_sizeof_types}" = xyes; then + AC_DEFINE([FT_USE_AUTOCONF_SIZEOF_TYPES]) +fi + +CPPFLAGS="${orig_CPPFLAGS}" + + +# checks for library functions + +# Here we check whether we can use our mmap file component. + +AC_FUNC_MMAP +if test "$ac_cv_func_mmap_fixed_mapped" != yes; then + FTSYS_SRC='$(BASE_DIR)/ftsystem.c' +else + FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' + + AC_CHECK_DECLS([munmap], + [], + [], + [ + +#ifdef HAVE_UNISTD_H +#include +#endif +#include + + ]) + + FT_MUNMAP_PARAM +fi +AC_SUBST([FTSYS_SRC]) + +AC_CHECK_FUNCS([memcpy memmove]) + + +# check for system zlib + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([zlib], + AS_HELP_STRING([--without-zlib], + [use internal zlib instead of system-wide])) +if test x$with_zlib != xno && test -z "$LIBZ"; then + AC_CHECK_LIB([z], [gzsetparams], [AC_CHECK_HEADER([zlib.h], [LIBZ='-lz'])]) +fi +if test x$with_zlib != xno && test -n "$LIBZ"; then + CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB" + LDFLAGS="$LDFLAGS $LIBZ" + SYSTEM_ZLIB=yes +fi + + +# check Apple's `-isysroot' option and duplicate it to LDFLAGS if required -- +# Apple TechNote 2137 recommends to include it in CFLAGS but not in LDFLAGS + +AC_MSG_CHECKING([whether CFLAGS includes -isysroot option]) +case "$CFLAGS" in +*sysroot* ) + AC_MSG_RESULT([yes]) + AC_MSG_CHECKING([whether LDFLAGS includes -isysroot option]) + case "$LDFLAGS" in + *sysroot* ) + AC_MSG_RESULT([yes]) + ;; + *) + AC_MSG_RESULT([no]) + isysroot_dir=`echo ${CFLAGS} | tr '\t' ' ' | sed 's/^.*-isysroot *//;s/ .*//'` + AC_MSG_WARN(-isysroot ${isysroot_dir} is added to LDFLAGS) + LDFLAGS="-isysroot ${isysroot_dir} ${LDFLAGS}" + ;; + esac + ;; +*) + AC_MSG_RESULT([no]) + ;; +esac + + +# Whether to use Mac OS resource-based fonts. + +ftmac_c="" # src/base/ftmac.c should not be included in makefiles by default + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([old-mac-fonts], + AS_HELP_STRING([--with-old-mac-fonts], + [allow Mac resource-based fonts to be used])) +if test x$with_old_mac_fonts = xyes; then + orig_LDFLAGS="${LDFLAGS}" + AC_MSG_CHECKING([CoreServices & ApplicationServices of Mac OS X]) + FT2_EXTRA_LIBS="-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices" + LDFLAGS="$LDFLAGS $FT2_EXTRA_LIBS" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + short res = 0; + + + UseResFile( res ); + + ])], + [AC_MSG_RESULT([ok]) + ftmac_c='ftmac.c' + AC_MSG_CHECKING([OS_INLINE macro is ANSI compatible]) + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + /* OSHostByteOrder() is typed as OS_INLINE */ + int32_t os_byte_order = OSHostByteOrder(); + + + if ( OSBigEndian != os_byte_order ) + return 1; + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_ANSI_OS_INLINE=1" + ], + [AC_MSG_RESULT([no, ANSI incompatible]) + CFLAGS="$orig_CFLAGS" + ]) + AC_MSG_CHECKING([type ResourceIndex]) + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +# include +#endif + + ], + [ + + ResourceIndex i = 0; + return i; + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=1" + ], + [AC_MSG_RESULT([no]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=0" + ])], + [AC_MSG_RESULT([not found]) + FT2_EXTRA_LIBS="" + LDFLAGS="${orig_LDFLAGS}" + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"]) +else + case x$host_os in + xdarwin*) + dnl AC_MSG_WARN([host system is MacOS but configured to build without Carbon]) + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" + ;; + *) ;; + esac +fi + + +# Whether to use FileManager which is deprecated since Mac OS X 10.4. + +AC_ARG_WITH([fsspec], + AS_HELP_STRING([--with-fsspec], + [use obsolete FSSpec API of MacOS, if available (default=yes)])) +if test x$with_fsspec = xno; then + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0" +elif test x$with_old_mac_fonts = xyes -a x$with_fsspec != x; then + AC_MSG_CHECKING([FSSpec-based FileManager]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FCBPBPtr paramBlock; + short vRefNum; + long dirID; + ConstStr255Param fileName; + FSSpec* spec; + + + /* FSSpec functions: deprecated since Mac OS X 10.4 */ + PBGetFCBInfoSync( paramBlock ); + FSMakeFSSpec( vRefNum, dirID, fileName, spec ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_FSSPEC=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0"]) +fi + + +# Whether to use FileManager in Carbon since MacOS 9.x. + +AC_ARG_WITH([fsref], + AS_HELP_STRING([--with-fsref], + [use Carbon FSRef API of MacOS, if available (default=yes)])) +if test x$with_fsref = xno; then + AC_MSG_WARN([ +*** WARNING + FreeType2 built without FSRef API cannot load + data-fork fonts on MacOS, except of XXX.dfont. + ]) + CFLAGS="$CFLAGS -DHAVE_FSREF=0" +elif test x$with_old_mac_fonts = xyes -a x$with_fsref != x; then + AC_MSG_CHECKING([FSRef-based FileManager]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + short vRefNum; + long dirID; + ConstStr255Param fileName; + + Boolean* isDirectory; + UInt8* path; + SInt16 desiredRefNum; + SInt16* iterator; + SInt16* actualRefNum; + HFSUniStr255* outForkName; + FSVolumeRefNum volume; + FSCatalogInfoBitmap whichInfo; + FSCatalogInfo* catalogInfo; + FSForkInfo* forkInfo; + FSRef* ref; + +#if HAVE_FSSPEC + FSSpec* spec; +#endif + + /* FSRef functions: no need to check? */ + FSGetForkCBInfo( desiredRefNum, volume, iterator, + actualRefNum, forkInfo, ref, + outForkName ); + FSPathMakeRef( path, ref, isDirectory ); + +#if HAVE_FSSPEC + FSpMakeFSRef ( spec, ref ); + FSGetCatalogInfo( ref, whichInfo, catalogInfo, + outForkName, spec, ref ); +#endif + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_FSREF=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_FSREF=0"]) +fi + + +# Whether to use QuickDraw API in ToolBox which is deprecated since +# Mac OS X 10.4. + +AC_ARG_WITH([quickdraw-toolbox], + AS_HELP_STRING([--with-quickdraw-toolbox], + [use MacOS QuickDraw in ToolBox, if available (default=yes)])) +if test x$with_quickdraw_toolbox = xno; then + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0" +elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_toolbox != x; then + AC_MSG_CHECKING([QuickDraw FontManager functions in ToolBox]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + Str255 familyName; + SInt16 familyID = 0; + FMInput* fmIn = NULL; + FMOutput* fmOut = NULL; + + + GetFontName( familyID, familyName ); + GetFNum( familyName, &familyID ); + fmOut = FMSwapFont( fmIn ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0"]) +fi + + +# Whether to use QuickDraw API in Carbon which is deprecated since +# Mac OS X 10.4. + +AC_ARG_WITH([quickdraw-carbon], + AS_HELP_STRING([--with-quickdraw-carbon], + [use MacOS QuickDraw in Carbon, if available (default=yes)])) +if test x$with_quickdraw_carbon = xno; then + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0" +elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_carbon != x; then + AC_MSG_CHECKING([QuickDraw FontManager functions in Carbon]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FMFontFamilyIterator famIter; + FMFontFamily family; + Str255 famNameStr; + FMFontFamilyInstanceIterator instIter; + FMFontStyle style; + FMFontSize size; + FMFont font; + FSSpec* pathSpec; + + + FMCreateFontFamilyIterator( NULL, NULL, kFMUseGlobalScopeOption, + &famIter ); + FMGetNextFontFamily( &famIter, &family ); + FMGetFontFamilyName( family, famNameStr ); + FMCreateFontFamilyInstanceIterator( family, &instIter ); + FMGetNextFontFamilyInstance( &instIter, &font, &style, &size ); + FMDisposeFontFamilyInstanceIterator( &instIter ); + FMDisposeFontFamilyIterator( &famIter ); + FMGetFontContainer( font, pathSpec ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0"]) +fi + + +# Whether to use AppleTypeService since Mac OS X. + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([ats], + AS_HELP_STRING([--with-ats], + [use AppleTypeService, if available (default=yes)])) +if test x$with_ats = xno; then + CFLAGS="$CFLAGS -DHAVE_ATS=0" +elif test x$with_old_mac_fonts = xyes -a x$with_ats != x ; then + AC_MSG_CHECKING([AppleTypeService functions]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FSSpec* pathSpec; + + + ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope ); +#if HAVE_FSSPEC + ATSFontGetFileSpecification( 0, pathSpec ); +#endif + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_ATS=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_ATS=0"]) +fi + +case "$CFLAGS" in + *HAVE_FSSPEC* | *HAVE_FSREF* | *HAVE_QUICKDRAW* | *HAVE_ATS* ) + AC_MSG_WARN([ +*** WARNING + FSSpec/FSRef/QuickDraw/ATS options are explicitly given, + thus it is recommended to replace src/base/ftmac.c by builds/mac/ftmac.c. + ]) + CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/' + ;; + *) + ;; +esac + + +AC_SUBST([ftmac_c]) +AC_SUBST([LIBZ]) +AC_SUBST([CFLAGS]) +AC_SUBST([LDFLAGS]) +AC_SUBST([FT2_EXTRA_LIBS]) +AC_SUBST([SYSTEM_ZLIB]) + + +LT_INIT(win32-dll) + +AC_SUBST([hardcode_libdir_flag_spec]) +AC_SUBST([wl]) +AC_SUBST([build_libtool_libs]) + + +# configuration file -- stay in 8.3 limit +# +# since #undef doesn't survive in configuration header files we replace +# `/undef' with `#undef' after creating the output file + +AC_CONFIG_HEADERS([ftconfig.h:ftconfig.in], + [mv ftconfig.h ftconfig.tmp + sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h + rm ftconfig.tmp]) + +# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' +# and `builds/unix/unix-cc.mk' that will be used by the build system +# +AC_CONFIG_FILES([unix-cc.mk:unix-cc.in + unix-def.mk:unix-def.in + freetype-config + freetype2.pc:freetype2.in]) + +# re-generate the Jamfile to use libtool now +# +# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) + +AC_OUTPUT + +# end of configure.raw diff --git a/src/3rdparty/freetype/builds/unix/detect.mk b/src/3rdparty/freetype/builds/unix/detect.mk new file mode 100644 index 0000000000..e74af57308 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/detect.mk @@ -0,0 +1,91 @@ +# +# FreeType 2 configuration file to detect a UNIX host platform. +# + + +# Copyright 1996-2000, 2002, 2003, 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +.PHONY: setup + +ifeq ($(PLATFORM),ansi) + + # Note: this test is duplicated in "builds/toplevel.mk". + # + is_unix := $(strip $(wildcard /sbin/init) \ + $(wildcard /usr/sbin/init) \ + $(wildcard /hurd/auth)) + ifneq ($(is_unix),) + + PLATFORM := unix + + endif # test is_unix +endif # test PLATFORM ansi + +ifeq ($(PLATFORM),unix) + COPY := cp + DELETE := rm -f + CAT := cat + + # If `devel' is the requested target, we use a special configuration + # file named `unix-dev.mk'. It disables optimization and libtool. + # + ifneq ($(findstring devel,$(MAKECMDGOALS)),) + CONFIG_FILE := unix-dev.mk + CC := gcc + devel: setup + .PHONY: devel + else + + # If `lcc' is the requested target, we use a special configuration + # file named `unix-lcc.mk'. It disables libtool for LCC. + # + ifneq ($(findstring lcc,$(MAKECMDGOALS)),) + CONFIG_FILE := unix-lcc.mk + CC := lcc + lcc: setup + .PHONY: lcc + else + + # If a Unix platform is detected, the configure script is called and + # `unix-def.mk' together with `unix-cc.mk' is created. + # + # Arguments to `configure' should be in the CFG variable. Example: + # + # make CFG="--prefix=/usr --disable-static" + # + # If you need to set CFLAGS or LDFLAGS, do it here also. + # + # Feel free to add support for other platform specific compilers in + # this directory (e.g. solaris.mk + changes here to detect the + # platform). + # + CONFIG_FILE := unix.mk + unix: setup + must_configure := 1 + .PHONY: unix + endif + endif + + have_Makefile := $(wildcard $(OBJ_DIR)/Makefile) + + setup: std_setup + ifdef must_configure + ifneq ($(have_Makefile),) + # we are building FT2 not in the src tree + $(TOP_DIR)/builds/unix/configure $(value CFG) + else + cd builds/unix; ./configure $(value CFG) + endif + endif + +endif # test PLATFORM unix + + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/freetype-config.in b/src/3rdparty/freetype/builds/unix/freetype-config.in new file mode 100644 index 0000000000..9606d318bd --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/freetype-config.in @@ -0,0 +1,160 @@ +#! /bin/sh +# +# Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no +includedir=@includedir@ +libdir=@libdir@ +enable_shared=@build_libtool_libs@ +wl=@wl@ +hardcode_libdir_flag_spec='@hardcode_libdir_flag_spec@' + +usage() +{ + cat <&2 +fi + +while test $# -gt 0 ; do + case "$1" in + -*=*) + optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` + ;; + *) + optarg= + ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + local_prefix=yes + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + local_prefix=yes + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --version) + echo @ft_version@ + exit 0 + ;; + --ftversion) + echo_ft_version=yes + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + --libtool) + echo_libtool=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$local_prefix" = "yes" ; then + if test "$exec_prefix_set" != "yes" ; then + exec_prefix=$prefix + fi +fi + +if test "$echo_prefix" = "yes" ; then + echo $prefix +fi + +if test "$echo_exec_prefix" = "yes" ; then + echo $exec_prefix +fi + +if test "$exec_prefix_set" = "yes" ; then + libdir=$exec_prefix/lib +else + if test "$local_prefix" = "yes" ; then + includedir=$prefix/include + libdir=$prefix/lib + fi +fi + +if test "$echo_ft_version" = "yes" ; then + major=`grep define $includedir/freetype2/freetype/freetype.h \ + | grep FREETYPE_MAJOR \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + minor=`grep define $includedir/freetype2/freetype/freetype.h \ + | grep FREETYPE_MINOR \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + patch=`grep define $includedir/freetype2/freetype/freetype.h \ + | grep FREETYPE_PATCH \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + echo $major.$minor.$patch +fi + +if test "$echo_cflags" = "yes" ; then + cflags="-I$includedir/freetype2" + if test "$includedir" != "/usr/include" ; then + echo $cflags -I$includedir + else + echo $cflags + fi +fi + +if test "$echo_libs" = "yes" ; then + rpath= + if test "$enable_shared" = "yes" ; then + eval "rpath=\"$hardcode_libdir_flag_spec\"" + fi + libs="-lfreetype @LIBZ@ @FT2_EXTRA_LIBS@" + if test "$libdir" != "/usr/lib" && test "$libdir" != "/usr/lib64"; then + echo -L$libdir $rpath $libs + else + echo $libs + fi +fi + +if test "$echo_libtool" = "yes" ; then + convlib="libfreetype.la" + echo $libdir/$convlib +fi + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/freetype2.in b/src/3rdparty/freetype/builds/unix/freetype2.in new file mode 100644 index 0000000000..7e948f437a --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/freetype2.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: FreeType 2 +Description: A free, high-quality, and portable font engine. +Version: @ft_version@ +Requires: +Libs: -L${libdir} -lfreetype +Libs.private: @LIBZ@ @FT2_EXTRA_LIBS@ +Cflags: -I${includedir}/freetype2 -I${includedir} diff --git a/src/3rdparty/freetype/builds/unix/freetype2.m4 b/src/3rdparty/freetype/builds/unix/freetype2.m4 new file mode 100644 index 0000000000..d1da07d9c1 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/freetype2.m4 @@ -0,0 +1,192 @@ +# Configure paths for FreeType2 +# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor +# +# Copyright 2001, 2003, 2007 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +# +# As a special exception to the FreeType project license, this file may be +# distributed as part of a program that contains a configuration script +# generated by Autoconf, under the same distribution terms as the rest of +# that program. +# +# serial 2 + +# AC_CHECK_FT2([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +# Test for FreeType 2, and define FT2_CFLAGS and FT2_LIBS. +# MINIMUM-VERSION is what libtool reports; the default is `7.0.1' (this is +# FreeType 2.0.4). +# +AC_DEFUN([AC_CHECK_FT2], + [# Get the cflags and libraries from the freetype-config script + # + AC_ARG_WITH([ft-prefix], + dnl don't quote AS_HELP_STRING! + AS_HELP_STRING([--with-ft-prefix=PREFIX], + [Prefix where FreeType is installed (optional)]), + [ft_config_prefix="$withval"], + [ft_config_prefix=""]) + + AC_ARG_WITH([ft-exec-prefix], + dnl don't quote AS_HELP_STRING! + AS_HELP_STRING([--with-ft-exec-prefix=PREFIX], + [Exec prefix where FreeType is installed (optional)]), + [ft_config_exec_prefix="$withval"], + [ft_config_exec_prefix=""]) + + AC_ARG_ENABLE([freetypetest], + dnl don't quote AS_HELP_STRING! + AS_HELP_STRING([--disable-freetypetest], + [Do not try to compile and run a test FreeType program]), + [], + [enable_fttest=yes]) + + if test x$ft_config_exec_prefix != x ; then + ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix" + if test x${FT2_CONFIG+set} != xset ; then + FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config + fi + fi + + if test x$ft_config_prefix != x ; then + ft_config_args="$ft_config_args --prefix=$ft_config_prefix" + if test x${FT2_CONFIG+set} != xset ; then + FT2_CONFIG=$ft_config_prefix/bin/freetype-config + fi + fi + + AC_PATH_PROG([FT2_CONFIG], [freetype-config], [no]) + + min_ft_version=m4_if([$1], [], [7.0.1], [$1]) + AC_MSG_CHECKING([for FreeType -- version >= $min_ft_version]) + no_ft="" + if test "$FT2_CONFIG" = "no" ; then + no_ft=yes + else + FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` + FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` + ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + ft_min_major_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_min_minor_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_min_micro_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test x$enable_fttest = xyes ; then + ft_config_is_lt="" + if test $ft_config_major_version -lt $ft_min_major_version ; then + ft_config_is_lt=yes + else + if test $ft_config_major_version -eq $ft_min_major_version ; then + if test $ft_config_minor_version -lt $ft_min_minor_version ; then + ft_config_is_lt=yes + else + if test $ft_config_minor_version -eq $ft_min_minor_version ; then + if test $ft_config_micro_version -lt $ft_min_micro_version ; then + ft_config_is_lt=yes + fi + fi + fi + fi + fi + if test x$ft_config_is_lt = xyes ; then + no_ft=yes + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" + + # + # Sanity checks for the results of freetype-config to some extent. + # + AC_RUN_IFELSE([ + AC_LANG_SOURCE([[ + +#include +#include FT_FREETYPE_H +#include +#include + +int +main() +{ + FT_Library library; + FT_Error error; + + error = FT_Init_FreeType(&library); + + if (error) + return 1; + else + { + FT_Done_FreeType(library); + return 0; + } +} + + ]]) + ], + [], + [no_ft=yes], + [echo $ECHO_N "cross compiling; assuming OK... $ECHO_C"]) + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi # test $ft_config_version -lt $ft_min_version + fi # test x$enable_fttest = xyes + fi # test "$FT2_CONFIG" = "no" + + if test x$no_ft = x ; then + AC_MSG_RESULT([yes]) + m4_if([$2], [], [:], [$2]) + else + AC_MSG_RESULT([no]) + if test "$FT2_CONFIG" = "no" ; then + AC_MSG_WARN([ + + The freetype-config script installed by FreeType 2 could not be found. + If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in + your path, or set the FT2_CONFIG environment variable to the + full path to freetype-config. + ]) + else + if test x$ft_config_is_lt = xyes ; then + AC_MSG_WARN([ + + Your installed version of the FreeType 2 library is too old. + If you have different versions of FreeType 2, make sure that + correct values for --with-ft-prefix or --with-ft-exec-prefix + are used, or set the FT2_CONFIG environment variable to the + full path to freetype-config. + ]) + else + AC_MSG_WARN([ + + The FreeType test program failed to run. If your system uses + shared libraries and they are installed outside the normal + system library path, make sure the variable LD_LIBRARY_PATH + (or whatever is appropriate for your system) is correctly set. + ]) + fi + fi + + FT2_CFLAGS="" + FT2_LIBS="" + m4_if([$3], [], [:], [$3]) + fi + + AC_SUBST([FT2_CFLAGS]) + AC_SUBST([FT2_LIBS])]) + +# end of freetype2.m4 diff --git a/src/3rdparty/freetype/builds/unix/ft-munmap.m4 b/src/3rdparty/freetype/builds/unix/ft-munmap.m4 new file mode 100644 index 0000000000..68b3361e2b --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/ft-munmap.m4 @@ -0,0 +1,32 @@ +## FreeType specific autoconf tests +# +# Copyright 2002, 2003, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# serial 2 + +AC_DEFUN([FT_MUNMAP_PARAM], + [AC_MSG_CHECKING([for munmap's first parameter type]) + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([[ + +#include +#include +int munmap(void *, size_t); + + ]]) + ], + [AC_MSG_RESULT([void *]) + AC_DEFINE([MUNMAP_USES_VOIDP], + [], + [Define to 1 if the first argument of munmap is of type void *])], + [AC_MSG_RESULT([char *])]) + ]) + +# end of ft-munmap.m4 diff --git a/src/3rdparty/freetype/builds/unix/ft2unix.h b/src/3rdparty/freetype/builds/unix/ft2unix.h new file mode 100644 index 0000000000..6a3b8d90e9 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/ft2unix.h @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is a Unix-specific version of that should be used */ + /* exclusively *after* installation of the library. */ + /* */ + /* It assumes that `/usr/local/include/freetype2' (or whatever is */ + /* returned by the `freetype-config --cflags' or `pkg-config --cflags' */ + /* command) is in your compilation include path. */ + /* */ + /* We don't need to do anything special in this release. However, for */ + /* a future FreeType 2 release, the following installation changes will */ + /* be performed: */ + /* */ + /* - The contents of `freetype-2.x/include/freetype' will be installed */ + /* to `/usr/local/include/freetype2' instead of */ + /* `/usr/local/include/freetype2/freetype'. */ + /* */ + /* - This file will #include , instead */ + /* of . */ + /* */ + /* - The contents of `ftheader.h' will be processed with `sed' to */ + /* replace all `' with `'. */ + /* */ + /* - Adding `/usr/local/include/freetype2' to your compilation include */ + /* path will not be necessary anymore. */ + /* */ + /* These changes will be transparent to client applications which use */ + /* freetype-config (or pkg-config). No modifications will be necessary */ + /* to compile with the new scheme. */ + /* */ + /*************************************************************************/ + + +#ifndef __FT2_BUILD_UNIX_H__ +#define __FT2_BUILD_UNIX_H__ + + /* `/include/freetype2' must be in your current inclusion path */ +#include + +#endif /* __FT2_BUILD_UNIX_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/builds/unix/ftconfig.h b/src/3rdparty/freetype/builds/unix/ftconfig.h new file mode 100644 index 0000000000..2fca16c79c --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/ftconfig.h @@ -0,0 +1,262 @@ +/* ftconfig.h. Generated by configure. */ +/***************************************************************************/ +/* */ +/* ftconfig.in */ +/* */ +/* UNIX-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2000, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + +#define HAVE_UNISTD_H 1 +#define HAVE_FCNTL_H 1 + +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 + +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* IntN types */ + /* */ + /* Used to guarantee the size of some specific integers. */ + /* */ + typedef signed short FT_Int16; + typedef unsigned short FT_UInt16; + +#if FT_SIZEOF_INT == 4 + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == 4 + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#else + + /*************************************************************************/ + /* */ + /* Many compilers provide the non-ANSI `long long' 64-bit type. You can */ + /* activate it by defining the FTCALC_USE_LONG_LONG macro in */ + /* `ftoption.h'. */ + /* */ + /* Note that this will produce many -ansi warnings during library */ + /* compilation, and that in many cases, the generated code will be */ + /* neither smaller nor faster! */ + /* */ +#ifdef FTCALC_USE_LONG_LONG + +#define FT_LONG64 +#define FT_INT64 long long + +#endif /* FTCALC_USE_LONG_LONG */ +#endif /* FT_SIZEOF_LONG == 8 */ + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) extern x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) extern "C" x +#else +#define FT_BASE_DEF( x ) extern x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/builds/unix/ftconfig.in b/src/3rdparty/freetype/builds/unix/ftconfig.in new file mode 100644 index 0000000000..0adfdcf64a --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/ftconfig.in @@ -0,0 +1,476 @@ +/***************************************************************************/ +/* */ +/* ftconfig.in */ +/* */ +/* UNIX-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + +#undef HAVE_UNISTD_H +#undef HAVE_FCNTL_H +#undef HAVE_STDINT_H + + + /* There are systems (like the Texas Instruments 'C54x) where a `char' */ + /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ + /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ + /* `char' type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + +#undef FT_USE_AUTOCONF_SIZEOF_TYPES +#ifdef FT_USE_AUTOCONF_SIZEOF_TYPES + +#undef SIZEOF_INT +#undef SIZEOF_LONG +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + +#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + /* Following cpp computation of the bit length of int and long */ + /* is copied from default include/freetype/config/ftconfig.h. */ + /* If any improvement is required for this file, it should be */ + /* applied to the original header file for the builders that */ + /* does not use configure script. */ + + /* The size of an `int' type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `long' type!" +#endif + +#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /* Fix compiler warning with sgi compiler */ +#if defined( __sgi ) && !defined( __GNUC__ ) +#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +#pragma set woff 3505 +#endif +#endif + + + /*************************************************************************/ + /* */ + /* IntN types */ + /* */ + /* Used to guarantee the size of some specific integers. */ + /* */ + typedef signed short FT_Int16; + typedef unsigned short FT_UInt16; + +#if FT_SIZEOF_INT == 4 + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == 4 + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == 8 */ + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */ + /* is defined. You can however ignore this rule by defining the */ + /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* Undefine the 64-bit macros in strict ANSI compilation mode. */ + /* Since `#undef' doesn't survive in configuration header files */ + /* we use the postprocessing facility of AC_CONFIG_HEADERS to */ + /* replace the leading `/' with `#'. */ +/undef FT_LONG64 +/undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + /* Provide assembler fragments for performance-critical functions. */ + /* These must be defined `static __inline__' with GCC. */ + +#ifdef __GNUC__ + +#if defined( __arm__ ) && !defined( __thumb__ ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + static __inline__ FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 t, t2; + + + asm __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ + "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ + "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) ); + return a; + } + +#endif /* __arm__ && !__thumb__ */ + +#if defined( i386 ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + static __inline__ FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 result; + + + __asm__ __volatile__ ( + "imul %%edx\n" + "movl %%edx, %%ecx\n" + "sarl $31, %%ecx\n" + "addl $0x8000, %%ecx\n" + "addl %%ecx, %%eax\n" + "adcl $0, %%edx\n" + "shrl $16, %%eax\n" + "shll $16, %%edx\n" + "addl %%edx, %%eax\n" + : "=a"(result), "+d"(b) + : "a"(a) + : "%ecx" ); + return result; + } + +#endif /* i386 */ + +#endif /* __GNUC__ */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifdef FT_CONFIG_OPTION_INLINE_MULFIX +#ifdef FT_MULFIX_ASSEMBLER +#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER +#endif +#endif + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/builds/unix/ftsystem.c b/src/3rdparty/freetype/builds/unix/ftsystem.c new file mode 100644 index 0000000000..5c38090166 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/ftsystem.c @@ -0,0 +1,426 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* Unix-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include + /* we use our special ftconfig.h file, not the standard one */ +#include +#include FT_INTERNAL_DEBUG_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H +#include FT_INTERNAL_STREAM_H + + /* memory-mapping includes and definitions */ +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#ifndef MAP_FILE +#define MAP_FILE 0x00 +#endif + +#ifdef MUNMAP_USES_VOIDP +#define MUNMAP_ARG_CAST void * +#else +#define MUNMAP_ARG_CAST char * +#endif + +#ifdef NEED_MUNMAP_DECL + +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int + munmap( char* addr, + int len ); + +#define MUNMAP_ARG_CAST char * + +#endif /* NEED_DECLARATION_MUNMAP */ + + +#include +#include + +#ifdef HAVE_FCNTL_H +#include +#endif + +#include +#include +#include +#include + +#ifdef VXWORKS +#include +#endif + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_alloc */ + /* */ + /* */ + /* The memory allocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return malloc( size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_realloc */ + /* */ + /* */ + /* The memory reallocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return realloc( block, new_size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_free */ + /* */ + /* */ + /* The memory release function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + free( block ); + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* */ + /* ft_close_stream_by_munmap */ + /* */ + /* */ + /* The function to close a stream which is opened by mmap. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_close_stream_by_munmap( FT_Stream stream ) + { + munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_close_stream_by_free */ + /* */ + /* */ + /* The function to close a stream which is created by ft_alloc. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_close_stream_by_free( FT_Stream stream ) + { + ft_free( NULL, stream->descriptor.pointer ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + int file; + struct stat stat_buf; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + + /* open the file */ + file = open( filepathname, O_RDONLY, 0); + if ( file < 0 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + return FT_Err_Cannot_Open_Resource; + } + + /* Here we ensure that a "fork" will _not_ duplicate */ + /* our opened input streams on Unix. This is critical */ + /* since it avoids some (possible) access control */ + /* issues and cleans up the kernel file table a bit. */ + /* */ +#ifdef F_SETFD +#ifdef FD_CLOEXEC + (void)fcntl( file, F_SETFD, FD_CLOEXEC ); +#else + (void)fcntl( file, F_SETFD, 1 ); +#endif /* FD_CLOEXEC */ +#endif /* F_SETFD */ + + if ( fstat( file, &stat_buf ) < 0 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `fstat' file `%s'\n", filepathname )); + goto Fail_Map; + } + + /* XXX: TODO -- real 64bit platform support */ + /* */ + /* `stream->size' is typedef'd to unsigned long (in */ + /* freetype/ftsystem.h); `stat_buf.st_size', however, is usually */ + /* typedef'd to off_t (in sys/stat.h). */ + /* On some platforms, the former is 32bit and the latter is 64bit. */ + /* To avoid overflow caused by fonts in huge files larger than */ + /* 2GB, do a test. Temporary fix proposed by Sean McBride. */ + /* */ + if ( stat_buf.st_size > LONG_MAX ) + { + FT_ERROR(( "FT_Stream_Open: file is too big\n" )); + goto Fail_Map; + } + else if ( stat_buf.st_size == 0 ) + { + FT_ERROR(( "FT_Stream_Open: zero-length file\n" )); + goto Fail_Map; + } + + /* This cast potentially truncates a 64bit to 32bit! */ + stream->size = (unsigned long)stat_buf.st_size; + stream->pos = 0; + stream->base = (unsigned char *)mmap( NULL, + stream->size, + PROT_READ, + MAP_FILE | MAP_PRIVATE, + file, + 0 ); + + /* on some RTOS, mmap might return 0 */ + if ( (long)stream->base != -1 && stream->base != NULL ) + stream->close = ft_close_stream_by_munmap; + else + { + ssize_t total_read_count; + + + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); + + stream->base = (unsigned char*)ft_alloc( NULL, stream->size ); + + if ( !stream->base ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `alloc' memory\n" )); + goto Fail_Map; + } + + total_read_count = 0; + do { + ssize_t read_count; + + + read_count = read( file, +#ifndef VXWORKS + stream->base + total_read_count, +#else + (char *) stream->base + total_read_count, +#endif + stream->size - total_read_count ); + + if ( read_count <= 0 ) + { + if ( read_count == -1 && errno == EINTR ) + continue; + + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " error while `read'ing file `%s'\n", filepathname )); + goto Fail_Read; + } + + total_read_count += read_count; + + } while ( (unsigned long)total_read_count != stream->size ); + + stream->close = ft_close_stream_by_free; + } + + close( file ); + + stream->descriptor.pointer = stream->base; + stream->pathname.pointer = (char*)filepathname; + + stream->read = 0; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + + Fail_Read: + ft_free( NULL, stream->base ); + + Fail_Map: + close( file ); + + stream->base = NULL; + stream->size = 0; + stream->pos = 0; + + return FT_Err_Cannot_Open_Stream; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)malloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = 0; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + memory->free( memory, memory ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/builds/unix/install-sh b/src/3rdparty/freetype/builds/unix/install-sh new file mode 100755 index 0000000000..a5897de6ea --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/install-sh @@ -0,0 +1,519 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2006-12-25.00 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/3rdparty/freetype/builds/unix/install.mk b/src/3rdparty/freetype/builds/unix/install.mk new file mode 100644 index 0000000000..2e5ef080e3 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/install.mk @@ -0,0 +1,97 @@ +# +# FreeType 2 installation instructions for Unix systems +# + + +# Copyright 1996-2000, 2002, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# If you say +# +# make install DESTDIR=/tmp/somewhere/ +# +# don't forget the final backslash (this command is mainly for package +# maintainers). + + +.PHONY: install uninstall check + +# Unix installation and deinstallation targets. +# +# Note that we no longer install internal headers, and we remove any +# `internal' subdirectory found in `$(includedir)/freetype2/freetype'. +# +install: $(PROJECT_LIBRARY) + $(MKINSTALLDIRS) $(DESTDIR)$(libdir) \ + $(DESTDIR)$(libdir)/pkgconfig \ + $(DESTDIR)$(includedir)/freetype2/freetype/config \ + $(DESTDIR)$(includedir)/freetype2/freetype/cache \ + $(DESTDIR)$(bindir) \ + $(DESTDIR)$(datadir)/aclocal + $(LIBTOOL) --mode=install $(INSTALL) \ + $(PROJECT_LIBRARY) $(DESTDIR)$(libdir) + -for P in $(PUBLIC_H) ; do \ + $(INSTALL_DATA) \ + $$P $(DESTDIR)$(includedir)/freetype2/freetype ; \ + done + -for P in $(CONFIG_H) ; do \ + $(INSTALL_DATA) \ + $$P $(DESTDIR)$(includedir)/freetype2/freetype/config ; \ + done + -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/cache/* + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/cache + -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/internal/* + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/internal + $(INSTALL_DATA) $(BUILD_DIR)/ft2unix.h \ + $(DESTDIR)$(includedir)/ft2build.h + $(INSTALL_DATA) $(OBJ_BUILD)/ftconfig.h \ + $(DESTDIR)$(includedir)/freetype2/freetype/config/ftconfig.h + $(INSTALL_DATA) $(OBJ_DIR)/ftmodule.h \ + $(DESTDIR)$(includedir)/freetype2/freetype/config/ftmodule.h + $(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config \ + $(DESTDIR)$(bindir)/freetype-config + $(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4 \ + $(DESTDIR)$(datadir)/aclocal/freetype2.m4 + $(INSTALL_SCRIPT) -m 644 $(OBJ_BUILD)/freetype2.pc \ + $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc + + +uninstall: + -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(LIBRARY).$A + -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/config/* + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/config + -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/* + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2 + -$(DELETE) $(DESTDIR)$(includedir)/ft2build.h + -$(DELETE) $(DESTDIR)$(bindir)/freetype-config + -$(DELETE) $(DESTDIR)$(datadir)/aclocal/freetype2.m4 + -$(DELETE) $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc + + +check: + @echo There is no validation suite for this package. + + +.PHONY: clean_project_unix distclean_project_unix + +# Unix cleaning and distclean rules. +# +clean_project_unix: + -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) + -$(DELETE) $(patsubst %.$O,%.$(SO),$(BASE_OBJECTS) $(OBJ_M) $(OBJ_S)) \ + $(CLEAN) + +distclean_project_unix: clean_project_unix + -$(DELETE) $(PROJECT_LIBRARY) + -$(DELETE) $(OBJ_DIR)/.libs/* + -$(DELDIR) $(OBJ_DIR)/.libs + -$(DELETE) *.orig *~ core *.core $(DISTCLEAN) + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/ltmain.sh b/src/3rdparty/freetype/builds/unix/ltmain.sh new file mode 100755 index 0000000000..b36c4ad366 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/ltmain.sh @@ -0,0 +1,8406 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.2.6 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=2.2.6 +TIMESTAMP="" +package_revision=1.3012 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/usr/bin/grep -E"} +: ${FGREP="/usr/bin/grep -F"} +: ${GREP="/usr/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/opt/local/bin/gsed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname${mode+: }$mode: $*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "X$my_tmpdir" | $Xsed +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "X$1" | $Xsed \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + + + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $ECHO. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 in + # Valid mode arguments: + clean) ;; + compile) ;; + execute) ;; + finish) ;; + install) ;; + link) ;; + relink) ;; + uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; + esac + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$mode' for more information." +} + + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command="$command -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { +test "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + $ECHO "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $ECHO "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + $ECHO + $ECHO "If you ever happen to want to link against installed libraries" + $ECHO "in a given directory, LIBDIR, you must either use libtool, and" + $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" + $ECHO "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" + $ECHO " during execution" + fi + if test -n "$runpath_var"; then + $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" + $ECHO " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $ECHO + + $ECHO "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" + $ECHO "pages." + ;; + *) + $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + $ECHO "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_prog $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + $ECHO >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +extern $lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +$lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + $ECHO >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags="$symtab_cflags $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} +# end: func_emit_wrapper_part2 + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # Unfortunately, winepath does not exit with a non-zero + # error code, so we are forced to check the contents of + # stdout. On the other hand, if the command is not + # found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both + # error code of zero AND non-empty stdout, which explains + # the odd construction: + func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# Path separators are also converted from $build format to +# $host format. If ARG begins or ends with a path separator +# character, it is preserved (but converted to $host format) +# on output. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +# define setmode _setmode +#else +# include +# include +# ifdef __CYGWIN__ +# include +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_fatal (const char *message, ...); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", + tmp_pathspec)); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("Could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : ""), + (value ? value : ""))); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + + +EOF +} +# end: func_emit_cwrapperexe_src + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs="$deplibs $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname '-L' '' "$arg" + dir=$func_stripname_result + if test -z "$dir"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$linker_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$deplibs $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $ECHO + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because the file extensions .$libext of this argument makes me believe" + $ECHO "*** that it is just a static archive that I should not use here." + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath="$temp_rpath$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + $ECHO + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $ECHO + $ECHO "*** And there doesn't seem to be a static archive available" + $ECHO "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $ECHO + $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $ECHO "*** But as you try to build a module library, libtool will still create " + $ECHO "*** a static module, that should work as long as the dlopening application" + $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_dirname "$deplib" "" "." + dir="$func_dirname_result" + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $ECHO + $ECHO "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + $ECHO "*** a static module, that should work as long as the dlopening" + $ECHO "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $ECHO "*** The inter-library dependencies that have been dropped here will be" + $ECHO "*** automatically added whenever a program is linked with this library" + $ECHO "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $ECHO + $ECHO "*** Since this library must not contain undefined symbols," + $ECHO "*** because either the platform does not support them or" + $ECHO "*** it was explicitly requested with -no-undefined," + $ECHO "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles="$delfiles $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + $ECHO 'INPUT (' > $output + for obj in $save_libobjs + do + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$delfiles $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $ECHO "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$newdlfiles $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles="$newdlprefiles $libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$mode" = link || test "$mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles="$rmfiles $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/src/3rdparty/freetype/builds/unix/mkinstalldirs b/src/3rdparty/freetype/builds/unix/mkinstalldirs new file mode 100755 index 0000000000..ef7e16fdaf --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/mkinstalldirs @@ -0,0 +1,161 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2006-05-11.19 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' +IFS=" "" $nl" +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/3rdparty/freetype/builds/unix/unix-cc.in b/src/3rdparty/freetype/builds/unix/unix-cc.in new file mode 100644 index 0000000000..9c6d5de6e5 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/unix-cc.in @@ -0,0 +1,113 @@ +# +# FreeType 2 template for Unix-specific compiler definitions +# + +# Copyright 1996-2000, 2002, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CC := @CC@ +COMPILER_SEP := $(SEP) + +LIBTOOL ?= $(BUILD_DIR)/libtool + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := lo +SO := o + + +# The executable file extension. Although most Unix platforms use no +# extension, we copy the extension detected by autoconf. Useful for cross +# building on Unix systems for non-Unix systems. +# +E := @EXEEXT@ + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := la +SA := a + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := lib$(PROJECT) + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +# We use our own FreeType configuration file. +# +CPPFLAGS := @CPPFLAGS@ +CFLAGS := -c @XX_CFLAGS@ @CFLAGS@ -DFT_CONFIG_CONFIG_H="" + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := @XX_ANSIFLAGS@ + +# C compiler to use -- we use libtool! +# +# +CCraw := $(CC) +CC := $(LIBTOOL) --mode=compile $(CCraw) + +# Linker flags. +# +LDFLAGS := @LDFLAGS@ + + +# export symbols +# +CCraw_build := @CC_BUILD@ # native CC of building system +E_BUILD := @EXEEXT_BUILD@ # extension for exexutable on building system +EXPORTS_LIST := $(OBJ_DIR)/ftexport.sym +CCexe := $(CCraw_build) # used to compile `apinames' only + + +# Library linking +# +LINK_LIBRARY = $(LIBTOOL) --mode=link $(CCraw) -o $@ $(OBJECTS_LIST) \ + -rpath $(libdir) -version-info $(version_info) \ + $(LDFLAGS) -no-undefined \ + # -export-symbols $(EXPORTS_LIST) + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/unix-def.in b/src/3rdparty/freetype/builds/unix/unix-def.in new file mode 100644 index 0000000000..e0a7a3a61f --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/unix-def.in @@ -0,0 +1,85 @@ +# +# FreeType 2 configuration rules templates for Unix + configure +# + + +# Copyright 1996-2000, 2002, 2004, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +TOP_DIR := $(shell cd $(TOP_DIR); pwd) + +DELETE := @RMF@ +DELDIR := @RMDIR@ +CAT := cat +SEP := / + +# this is used for `make distclean' and `make install' +OBJ_BUILD ?= $(BUILD_DIR) + +# don't use `:=' here since the path stuff will be included after this file +# +FTSYS_SRC = @FTSYS_SRC@ + +INSTALL := @INSTALL@ +INSTALL_DATA := @INSTALL_DATA@ +INSTALL_PROGRAM := @INSTALL_PROGRAM@ +INSTALL_SCRIPT := @INSTALL_SCRIPT@ +MKINSTALLDIRS := $(BUILD_DIR)/mkinstalldirs + +DISTCLEAN += $(OBJ_BUILD)/config.cache \ + $(OBJ_BUILD)/config.log \ + $(OBJ_BUILD)/config.status \ + $(OBJ_BUILD)/unix-def.mk \ + $(OBJ_BUILD)/unix-cc.mk \ + $(OBJ_BUILD)/ftconfig.h \ + $(OBJ_BUILD)/freetype-config \ + $(OBJ_BUILD)/freetype2.pc \ + $(LIBTOOL) \ + $(OBJ_BUILD)/Makefile + + +# Standard installation variables. +# +prefix := @prefix@ +exec_prefix := @exec_prefix@ +libdir := @libdir@ +bindir := @bindir@ +includedir := @includedir@ +datarootdir := @datarootdir@ +datadir := @datadir@ + +version_info := @version_info@ + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + +# The BASE_SRC macro lists all source files that should be included in +# src/base/ftbase.c. When configure sets up CFLAGS to build ftmac.c, +# ftmac.c should be added to BASE_SRC. +ftmac_c := @ftmac_c@ + +# The SYSTEM_ZLIB macro is defined if the user wishes to link dynamically +# with its system wide zlib. If SYSTEM_ZLIB is 'yes', the zlib part of the +# ftgzip module is not compiled in. +SYSTEM_ZLIB := @SYSTEM_ZLIB@ + + +# The NO_OUTPUT macro is appended to command lines in order to ignore +# the output of some programs. +# +NO_OUTPUT := 2> /dev/null + + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/unix-dev.mk b/src/3rdparty/freetype/builds/unix/unix-dev.mk new file mode 100644 index 0000000000..76bae3862a --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/unix-dev.mk @@ -0,0 +1,26 @@ +# +# FreeType 2 Configuration rules for Unix + GCC +# +# Development version without optimizations & libtool +# and no installation. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DEVEL_DIR := $(TOP_DIR)/devel + +include $(TOP_DIR)/builds/unix/unixddef.mk +include $(TOP_DIR)/builds/compiler/gcc-dev.mk +include $(TOP_DIR)/builds/link_std.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/unix-lcc.mk b/src/3rdparty/freetype/builds/unix/unix-lcc.mk new file mode 100644 index 0000000000..6038e52392 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/unix-lcc.mk @@ -0,0 +1,24 @@ +# +# FreeType 2 Configuration rules for Unix + LCC +# +# Development version without optimizations & libtool +# and no installation. +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP_DIR)/builds/unix/unixddef.mk +include $(TOP_DIR)/builds/compiler/unix-lcc.mk +include $(TOP_DIR)/builds/link_std.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/unix.mk b/src/3rdparty/freetype/builds/unix/unix.mk new file mode 100644 index 0000000000..7f9d9a34fb --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/unix.mk @@ -0,0 +1,62 @@ +# +# FreeType 2 configuration rules for UNIX platforms +# + + +# Copyright 1996-2000, 2002, 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# We need these declarations here since unix-def.mk is a generated file. +BUILD_DIR := $(TOP_DIR)/builds/unix +PLATFORM := unix + +have_mk := $(wildcard $(OBJ_DIR)/unix-def.mk) +ifneq ($(have_mk),) + # We are building FreeType 2 not in the src tree. + include $(OBJ_DIR)/unix-def.mk + include $(OBJ_DIR)/unix-cc.mk +else + include $(BUILD_DIR)/unix-def.mk + include $(BUILD_DIR)/unix-cc.mk +endif + +ifdef BUILD_PROJECT + + .PHONY: clean_project distclean_project + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP_DIR)/builds/$(PROJECT).mk + + + # The cleanup targets. + # + clean_project: clean_project_unix + distclean_project: distclean_project_unix + + + # This final rule is used to link all object files into a single library. + # It is part of the system-specific sub-Makefile because not all + # librarians accept a simple syntax like + # + # librarian library_file {list of object files} + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + + include $(TOP_DIR)/builds/unix/install.mk + +endif + + +# EOF diff --git a/src/3rdparty/freetype/builds/unix/unixddef.mk b/src/3rdparty/freetype/builds/unix/unixddef.mk new file mode 100644 index 0000000000..130d6b0f62 --- /dev/null +++ b/src/3rdparty/freetype/builds/unix/unixddef.mk @@ -0,0 +1,45 @@ +# +# FreeType 2 configuration rules templates for +# development under Unix with no configure script (gcc only) +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +TOP_DIR := $(shell cd $(TOP_DIR); pwd) +OBJ_DIR := $(shell cd $(OBJ_DIR); pwd) + +PLATFORM := unix + +DELETE := rm -f +CAT := cat +SEP := / + +# we use a special devel ftoption.h +DEVEL_DIR := $(TOP_DIR)/devel + + +# library file name +# +LIBRARY := lib$(PROJECT) + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +NO_OUTPUT := 2> /dev/null + +# EOF diff --git a/src/3rdparty/freetype/builds/vms/ftconfig.h b/src/3rdparty/freetype/builds/vms/ftconfig.h new file mode 100644 index 0000000000..1659d039ea --- /dev/null +++ b/src/3rdparty/freetype/builds/vms/ftconfig.h @@ -0,0 +1,346 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* VMS-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + + + /* Include the header file containing all developer build options */ +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + +#define HAVE_UNISTD_H 1 +#define HAVE_FCNTL_H 1 + +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 + +#define FT_SIZEOF_INT 4 +#define FT_SIZEOF_LONG 4 + +#define FT_CHAR_BIT 8 + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /*************************************************************************/ + /* */ + /* IntN types */ + /* */ + /* Used to guarantee the size of some specific integers. */ + /* */ + typedef signed short FT_Int16; + typedef unsigned short FT_UInt16; + +#if FT_SIZEOF_INT == 4 + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == 4 + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == 8 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable their use if */ + /* __STDC__ is defined. You can however ignore this rule by */ + /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* undefine the 64-bit macros in strict ANSI compilation mode */ +#undef FT_LONG64 +#undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) extern "C" x +#else +#define FT_BASE_DEF( x ) extern x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/builds/vms/ftsystem.c b/src/3rdparty/freetype/builds/vms/ftsystem.c new file mode 100644 index 0000000000..76bfae9f40 --- /dev/null +++ b/src/3rdparty/freetype/builds/vms/ftsystem.c @@ -0,0 +1,321 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* VMS-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include + /* we use our special ftconfig.h file, not the standard one */ +#include +#include FT_INTERNAL_DEBUG_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H +#include FT_INTERNAL_OBJECTS_H + + /* memory-mapping includes and definitions */ +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#ifndef MAP_FILE +#define MAP_FILE 0x00 +#endif + +#ifdef MUNMAP_USES_VOIDP +#define MUNMAP_ARG_CAST void * +#else +#define MUNMAP_ARG_CAST char * +#endif + +#ifdef NEED_MUNMAP_DECL + +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int + munmap( char* addr, + int len ); + +#define MUNMAP_ARG_CAST char * + +#endif /* NEED_DECLARATION_MUNMAP */ + + +#include +#include + +#ifdef HAVE_FCNTL_H +#include +#endif + +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_alloc */ + /* */ + /* */ + /* The memory allocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return malloc( size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_realloc */ + /* */ + /* */ + /* The memory reallocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return realloc( block, new_size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_free */ + /* */ + /* */ + /* The memory release function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + free( block ); + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* */ + /* ft_close_stream */ + /* */ + /* */ + /* The function to close a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_close_stream( FT_Stream stream ) + { + munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + int file; + struct stat stat_buf; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + + /* open the file */ + file = open( filepathname, O_RDONLY ); + if ( file < 0 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + return FT_Err_Cannot_Open_Resource; + } + + if ( fstat( file, &stat_buf ) < 0 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `fstat' file `%s'\n", filepathname )); + goto Fail_Map; + } + + stream->size = stat_buf.st_size; + stream->pos = 0; + stream->base = (unsigned char *)mmap( NULL, + stream->size, + PROT_READ, + MAP_FILE | MAP_PRIVATE, + file, + 0 ); + + if ( (long)stream->base == -1 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); + goto Fail_Map; + } + + close( file ); + + stream->descriptor.pointer = stream->base; + stream->pathname.pointer = (char*)filepathname; + + stream->close = ft_close_stream; + stream->read = 0; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + + Fail_Map: + close( file ); + + stream->base = NULL; + stream->size = 0; + stream->pos = 0; + + return FT_Err_Cannot_Open_Stream; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)malloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = 0; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + memory->free( memory, memory ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/builds/win32/detect.mk b/src/3rdparty/freetype/builds/win32/detect.mk new file mode 100644 index 0000000000..1906539609 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/detect.mk @@ -0,0 +1,183 @@ +# +# FreeType 2 configuration file to detect a Win32 host platform. +# + + +# Copyright 1996-2000, 2003, 2004, 2006, 2007 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +.PHONY: setup + + +ifeq ($(PLATFORM),ansi) + + # Detecting Windows NT is easy, as the OS variable must be defined and + # contains `Windows_NT'. This also works with Windows 2000 and XP. + # + ifeq ($(OS),Windows_NT) + + PLATFORM := win32 + + else + + # Detecting Windows 9X + + # We used to run the `ver' command to see if its output contains the + # word `Windows'. If this is true, we are running Windows 95 or later: + # + # ifdef COMSPEC + # # First, check if we have the COMSPEC environment variable, which + # # indicates we can use COMMAND.COM's internal commands + # is_windows := $(findstring Windows,$(strip $(shell ver))) + # endif + # + # Unfortunately, this also detects the case when one is running + # DOS 7.x (the MS-DOS version that lies below Windows) without actually + # launching the GUI. + # + # A better test is to check whether there are both the environment + # variables `winbootdir' and `windir'. The first indicates an + # underlying DOS 7.x, while the second is set only if win32 is available. + # + # Note that on Windows NT, such an environment variable will not be seen + # from DOS-based tools like DJGPP's make; this is not actually a problem + # since NT is detected independently above. But do not try to be clever! + # + ifdef winbootdir + ifdef windir + + PLATFORM := win32 + + endif + endif + + endif # test NT + +endif # test PLATFORM ansi + +ifeq ($(PLATFORM),win32) + + DELETE := del + CAT := type + SEP := $(BACKSLASH) + + # Setting COPY is a bit trickier. Plain COPY on NT will not work + # correctly, because it will uppercase 8.3 filenames, creating a + # `CONFIG.MK' file which isn't found later on by `make'. + # Since we do not want that, we need to force execution of CMD.EXE. + # Unfortunately, CMD.EXE is not available on Windows 9X. + # So we need to hack. + # + # Kudos to Eli Zaretskii (DJGPP guru) that helped debug it. + # Details are available in threads of the freetype mailing list + # (2004-11-11), and then in the devel mailing list (2004-11-20 to -23). + # + ifeq ($(OS),Windows_NT) + COPY := cmd.exe /c copy + else + COPY := copy + endif # test NT + + + # gcc Makefile by default + CONFIG_FILE := w32-gcc.mk + ifeq ($(firstword $(CC)),cc) + CC := gcc + endif + + ifneq ($(findstring list,$(MAKECMDGOALS)),) # test for the "list" target + dump_target_list: + @echo ÿ + @echo $(PROJECT_TITLE) build system -- supported compilers + @echo ÿ + @echo Several command-line compilers are supported on Win32: + @echo ÿ + @echo ÿÿmake setupÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgcc (with Mingw) + @echo ÿÿmake setup visualcÿÿÿÿÿÿÿÿÿÿÿÿÿMicrosoft Visual C++ + @echo ÿÿmake setup bcc32ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBorland C/C++ + @echo ÿÿmake setup lccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWin32-LCC + @echo ÿÿmake setup intelcÿÿÿÿÿÿÿÿÿÿÿÿÿÿIntel C/C++ + @echo ÿ + + setup: dump_target_list + .PHONY: dump_target_list list + else + setup: dos_setup + endif + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring visualc,$(MAKECMDGOALS)),) # Visual C/C++ + CONFIG_FILE := w32-vcc.mk + CC := cl + visualc: setup + .PHONY: visualc + endif + + ifneq ($(findstring intelc,$(MAKECMDGOALS)),) # Intel C/C++ + CONFIG_FILE := w32-intl.mk + CC := cl + visualc: setup + .PHONY: intelc + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := w32-wat.mk + CC := wcc386 + watcom: setup + .PHONY: watcom + endif + + ifneq ($(findstring visualage,$(MAKECMDGOALS)),) # Visual Age C++ + CONFIG_FILE := w32-icc.mk + CC := icc + visualage: setup + .PHONY: visualage + endif + + ifneq ($(findstring lcc,$(MAKECMDGOALS)),) # LCC-Win32 + CONFIG_FILE := w32-lcc.mk + CC := lcc + lcc: setup + .PHONY: lcc + endif + + ifneq ($(findstring mingw32,$(MAKECMDGOALS)),) # mingw32 + CONFIG_FILE := w32-mingw32.mk + CC := gcc + mingw32: setup + .PHONY: mingw32 + endif + + ifneq ($(findstring bcc32,$(MAKECMDGOALS)),) # Borland C++ + CONFIG_FILE := w32-bcc.mk + CC := bcc32 + bcc32: setup + .PHONY: bcc32 + endif + + ifneq ($(findstring devel-bcc,$(MAKECMDGOALS)),) # development target + CONFIG_FILE := w32-bccd.mk + CC := bcc32 + devel-bcc: setup + .PHONY: devel-bcc + endif + + ifneq ($(findstring devel-gcc,$(MAKECMDGOALS)),) # development target + CONFIG_FILE := w32-dev.mk + CC := gcc + devel-gcc: setup + .PHONY: devel-gcc + endif + +endif # test PLATFORM win32 + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/ftdebug.c b/src/3rdparty/freetype/builds/win32/ftdebug.c new file mode 100644 index 0000000000..8f7a9ab07d --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/ftdebug.c @@ -0,0 +1,248 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component for Win32 (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + + +#ifdef FT_DEBUG_LEVEL_ERROR + + +#include +#include +#include + +#include + + +#ifdef _WIN32_WCE + + void + OutputDebugStringEx( const char* str ) + { + static WCHAR buf[8192]; + + + int sz = MultiByteToWideChar( CP_ACP, 0, str, -1, buf, + sizeof ( buf ) / sizeof ( *buf ) ); + if ( !sz ) + lstrcpyW( buf, L"OutputDebugStringEx: MultiByteToWideChar failed" ); + + OutputDebugStringW( buf ); + } + +#else + +#define OutputDebugStringEx OutputDebugStringA + +#endif + + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + static char buf[8192]; + va_list ap; + + + va_start( ap, fmt ); + vprintf( fmt, ap ); + /* send the string to the debugger as well */ + vsprintf( buf, fmt, ap ); + OutputDebugStringEx( buf ); + va_end( ap ); + } + + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + static char buf[8192]; + va_list ap; + + + va_start( ap, fmt ); + vsprintf( buf, fmt, ap ); + OutputDebugStringEx( buf ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + + +#ifdef FT_DEBUG_LEVEL_TRACE + + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the "FT2_DEBUG" environment variable. It must be a list of */ + /* toggles, separated by spaces, `;' or `,'. Example: */ + /* */ + /* "any:3 memory:6 stream:5" */ + /* */ + /* This will request that all levels be set to 3, except the trace level */ + /* for the memory and stream components which are set to 6 and 5, */ + /* respectively. */ + /* */ + /* See the file for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 6; 0 means quiet (except for serious */ + /* runtime errors), and 6 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { +#ifdef _WIN32_WCE + + /* Windows Mobile doesn't have environment API: */ + /* GetEnvironmentStrings, GetEnvironmentVariable, getenv. */ + /* */ + /* FIXME!!! How to set debug mode? */ + const char* ft2_debug = 0; + +#else + + const char* ft2_debug = getenv( "FT2_DEBUG" ); + +#endif + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + int n, i, len = p - q; + int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for "any" */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + +/* END */ diff --git a/src/3rdparty/freetype/builds/win32/vc2005/freetype.sln b/src/3rdparty/freetype/builds/win32/vc2005/freetype.sln new file mode 100644 index 0000000000..20492031e0 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/vc2005/freetype.sln @@ -0,0 +1,31 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + LIB Debug Multithreaded|Win32 = LIB Debug Multithreaded|Win32 + LIB Debug Singlethreaded|Win32 = LIB Debug Singlethreaded|Win32 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Release Multithreaded|Win32 = LIB Release Multithreaded|Win32 + LIB Release Singlethreaded|Win32 = LIB Release Singlethreaded|Win32 + LIB Release|Win32 = LIB Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.ActiveCfg = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.Build.0 = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/3rdparty/freetype/builds/win32/vc2005/freetype.vcproj b/src/3rdparty/freetype/builds/win32/vc2005/freetype.vcproj new file mode 100644 index 0000000000..bd8634c594 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/vc2005/freetype.vcproj @@ -0,0 +1,636 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/3rdparty/freetype/builds/win32/vc2005/index.html b/src/3rdparty/freetype/builds/win32/vc2005/index.html new file mode 100644 index 0000000000..41d5e0a0a1 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/vc2005/index.html @@ -0,0 +1,37 @@ + +
      + + FreeType 2 Project Files for VS.NET 2005 + + + +

      + FreeType 2 Project Files for VS.NET 2005 +

      + +

      This directory contains project files for Visual C++, named +freetype.vcproj, and Visual Studio, called freetype.sln. It +compiles the following libraries from the FreeType 2.3.9 sources:

      + +
        +
        +    freetype239.lib     - release build; single threaded
        +    freetype239_D.lib   - debug build;   single threaded
        +    freetype239MT.lib   - release build; multi-threaded
        +    freetype239MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/src/3rdparty/freetype/builds/win32/vc2008/freetype.sln b/src/3rdparty/freetype/builds/win32/vc2008/freetype.sln new file mode 100644 index 0000000000..0995f80617 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/vc2008/freetype.sln @@ -0,0 +1,31 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + LIB Debug Multithreaded|Win32 = LIB Debug Multithreaded|Win32 + LIB Debug Singlethreaded|Win32 = LIB Debug Singlethreaded|Win32 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Release Multithreaded|Win32 = LIB Release Multithreaded|Win32 + LIB Release Singlethreaded|Win32 = LIB Release Singlethreaded|Win32 + LIB Release|Win32 = LIB Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.ActiveCfg = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.Build.0 = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/3rdparty/freetype/builds/win32/vc2008/freetype.vcproj b/src/3rdparty/freetype/builds/win32/vc2008/freetype.vcproj new file mode 100644 index 0000000000..07d950b0fc --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/vc2008/freetype.vcproj @@ -0,0 +1,2160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/3rdparty/freetype/builds/win32/vc2008/index.html b/src/3rdparty/freetype/builds/win32/vc2008/index.html new file mode 100644 index 0000000000..5e349b7117 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/vc2008/index.html @@ -0,0 +1,37 @@ + +
      + + FreeType 2 Project Files for VS.NET 2008 + + + +

      + FreeType 2 Project Files for VS.NET 2008 +

      + +

      This directory contains project files for Visual C++, named +freetype.vcproj, and Visual Studio, called freetype.sln. It +compiles the following libraries from the FreeType 2.3.9 sources:

      + +
        +
        +    freetype239.lib     - release build; single threaded
        +    freetype239_D.lib   - debug build;   single threaded
        +    freetype239MT.lib   - release build; multi-threaded
        +    freetype239MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/src/3rdparty/freetype/builds/win32/visualc/freetype.dsp b/src/3rdparty/freetype/builds/win32/visualc/freetype.dsp new file mode 100644 index 0000000000..556dfb6c75 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/visualc/freetype.dsp @@ -0,0 +1,400 @@ +# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=freetype - Win32 Debug Singlethreaded +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "freetype.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug Singlethreaded" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "freetype - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\objs\release" +# PROP Intermediate_Dir "..\..\..\objs\release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /MD /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype239.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\objs\debug" +# PROP Intermediate_Dir "..\..\..\objs\debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /MDd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype239_D.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Debug Multithreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\objs\debug_mt" +# PROP Intermediate_Dir "..\..\..\objs\debug_mt" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c +# SUBTRACT BASE CPP /X +# ADD CPP /MTd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"lib\freetype239_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype239MT_D.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Release Multithreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\objs\release_mt" +# PROP Intermediate_Dir "..\..\..\objs\release_mt" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\freetype\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c +# ADD CPP /MT /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"lib\freetype239.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype239MT.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Release Singlethreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\objs\release_st" +# PROP Intermediate_Dir "..\..\..\objs\release_st" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype239.lib" +# ADD LIB32 /out:"..\..\..\objs\freetype239ST.lib" +# SUBTRACT LIB32 /nologo + +!ELSEIF "$(CFG)" == "freetype - Win32 Debug Singlethreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\objs\debug_st" +# PROP Intermediate_Dir "..\..\..\objs\debug_st" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c +# SUBTRACT BASE CPP /X /YX +# ADD CPP /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype239_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype239ST_D.lib" + +!ENDIF + +# Begin Target + +# Name "freetype - Win32 Release" +# Name "freetype - Win32 Debug" +# Name "freetype - Win32 Debug Multithreaded" +# Name "freetype - Win32 Release Multithreaded" +# Name "freetype - Win32 Release Singlethreaded" +# Name "freetype - Win32 Debug Singlethreaded" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\..\src\autofit\autofit.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\bdf\bdf.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cff\cff.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbase.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbbox.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbdf.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbitmap.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftfstype.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftgasp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cache\ftcache.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\ftdebug.c +# ADD CPP /Ze +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftglyph.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftgxval.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\gzip\ftgzip.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftinit.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\lzw\ftlzw.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftmm.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftotval.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftpfr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftstroke.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftsynth.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftsystem.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\fttype1.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftwinfnt.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftxf86.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pcf\pcf.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pfr\pfr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\psaux\psaux.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pshinter\pshinter.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\psnames\psmodule.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\raster\raster.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\sfnt\sfnt.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\smooth\smooth.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\truetype\truetype.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\type1\type1.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cid\type1cid.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\type42\type42.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\winfonts\winfnt.c +# SUBTRACT CPP /Fr +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\..\include\ft2build.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftconfig.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftheader.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftmodule.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftoption.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftstdlib.h +# End Source File +# End Group +# End Target +# End Project diff --git a/src/3rdparty/freetype/builds/win32/visualc/freetype.dsw b/src/3rdparty/freetype/builds/win32/visualc/freetype.dsw new file mode 100644 index 0000000000..b1b375dbbc --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/visualc/freetype.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "freetype"=.\freetype.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/3rdparty/freetype/builds/win32/visualc/index.html b/src/3rdparty/freetype/builds/win32/visualc/index.html new file mode 100644 index 0000000000..fffcf4fdec --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/visualc/index.html @@ -0,0 +1,37 @@ + +
      + + FreeType 2 Project Files for Visual C++ and VS.NET 2005 + + + +

      + FreeType 2 Project Files for Visual C++ and VS.NET 2005 +

      + +

      This directory contains project files for Visual C++, named +freetype.dsp, and Visual Studio, called freetype.sln. It +compiles the following libraries from the FreeType 2.3.9 sources:

      + +
        +
        +    freetype239.lib     - release build; single threaded
        +    freetype239_D.lib   - debug build;   single threaded
        +    freetype239MT.lib   - release build; multi-threaded
        +    freetype239MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/src/3rdparty/freetype/builds/win32/w32-bcc.mk b/src/3rdparty/freetype/builds/win32/w32-bcc.mk new file mode 100644 index 0000000000..a9f48fc60b --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-bcc.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 Borland C++ on Win32 +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -wB + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/bcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/w32-bccd.mk b/src/3rdparty/freetype/builds/win32/w32-bccd.mk new file mode 100644 index 0000000000..51b15d9032 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-bccd.mk @@ -0,0 +1,26 @@ +# +# FreeType 2 Borland C++ on Win32 + debugging +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DEVEL_DIR := $(TOP_DIR)/devel + +include $(TOP_DIR)/builds/win32/win32-def.mk + +include $(TOP_DIR)/builds/compiler/bcc-dev.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/w32-dev.mk b/src/3rdparty/freetype/builds/win32/w32-dev.mk new file mode 100644 index 0000000000..00cacb0f67 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-dev.mk @@ -0,0 +1,32 @@ +# +# FreeType 2 configuration rules for Win32 + GCC +# +# Development version without optimizations. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# NOTE: This version requires that GNU Make is invoked from the Windows +# Shell (_not_ Cygwin BASH)! +# + +DEVEL_DIR := $(TOP_DIR)/devel + +include $(TOP_DIR)/builds/win32/win32-def.mk + +include $(TOP_DIR)/builds/compiler/gcc-dev.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/w32-gcc.mk b/src/3rdparty/freetype/builds/win32/w32-gcc.mk new file mode 100644 index 0000000000..580afc5c94 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-gcc.mk @@ -0,0 +1,31 @@ +# +# FreeType 2 configuration rules for Win32 + GCC +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = $(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +# include Win32-specific definitions +include $(TOP_DIR)/builds/win32/win32-def.mk + +# include gcc-specific definitions +include $(TOP_DIR)/builds/compiler/gcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/w32-icc.mk b/src/3rdparty/freetype/builds/win32/w32-icc.mk new file mode 100644 index 0000000000..8819a1f49f --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-icc.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 configuration rules for Win32 + IBM Visual Age C++ +# + + +# Copyright 1996-2000, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/visualage.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/w32-intl.mk b/src/3rdparty/freetype/builds/win32/w32-intl.mk new file mode 100644 index 0000000000..ae62e1bcda --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-intl.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 configuration rules for Intel C/C++ on Win32 +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/intelc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/w32-lcc.mk b/src/3rdparty/freetype/builds/win32/w32-lcc.mk new file mode 100644 index 0000000000..a147c4cb61 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-lcc.mk @@ -0,0 +1,24 @@ +# +# FreeType 2 configuration rules for Win32 + LCC +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +SEP := / +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/win-lcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + +# EOF + diff --git a/src/3rdparty/freetype/builds/win32/w32-mingw32.mk b/src/3rdparty/freetype/builds/win32/w32-mingw32.mk new file mode 100644 index 0000000000..04e9e211c0 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-mingw32.mk @@ -0,0 +1,33 @@ +# +# FreeType 2 configuration rules for mingw32 +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = $(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +# include Win32-specific definitions +include $(TOP_DIR)/builds/win32/win32-def.mk + +LIBRARY := lib$(PROJECT) + +# include gcc-specific definitions +include $(TOP_DIR)/builds/compiler/gcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/w32-vcc.mk b/src/3rdparty/freetype/builds/win32/w32-vcc.mk new file mode 100644 index 0000000000..7fb8794865 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-vcc.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 Visual C++ on Win32 +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/visualc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/w32-wat.mk b/src/3rdparty/freetype/builds/win32/w32-wat.mk new file mode 100644 index 0000000000..820b817358 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/w32-wat.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 configuration rules for Watcom C/C++ +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# redefine export symbol definitions +# +EXPORTS_LIST = $(OBJ_DIR)/watcom-ftexports.lbc +EXPORTS_OPTIONS = -\"export @$(EXPORTS_LIST)\"- +APINAMES_OPTIONS := -wW + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/watcom.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/src/3rdparty/freetype/builds/win32/win32-def.mk b/src/3rdparty/freetype/builds/win32/win32-def.mk new file mode 100644 index 0000000000..a82b146bf9 --- /dev/null +++ b/src/3rdparty/freetype/builds/win32/win32-def.mk @@ -0,0 +1,46 @@ +# +# FreeType 2 Win32 specific definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := del +CAT := type +SEP := $(strip \ ) +BUILD_DIR := $(TOP_DIR)/builds/win32 +PLATFORM := win32 + +# The executable file extension (for tools). NOTE: WE INCLUDE THE DOT HERE !! +# +E := .exe + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := $(PROJECT) + + +# The NO_OUTPUT macro is used to ignore the output of commands. +# +NO_OUTPUT = 2> nul + + +# EOF diff --git a/src/3rdparty/freetype/builds/wince/ftdebug.c b/src/3rdparty/freetype/builds/wince/ftdebug.c new file mode 100644 index 0000000000..8f7a9ab07d --- /dev/null +++ b/src/3rdparty/freetype/builds/wince/ftdebug.c @@ -0,0 +1,248 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component for Win32 (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + + +#ifdef FT_DEBUG_LEVEL_ERROR + + +#include +#include +#include + +#include + + +#ifdef _WIN32_WCE + + void + OutputDebugStringEx( const char* str ) + { + static WCHAR buf[8192]; + + + int sz = MultiByteToWideChar( CP_ACP, 0, str, -1, buf, + sizeof ( buf ) / sizeof ( *buf ) ); + if ( !sz ) + lstrcpyW( buf, L"OutputDebugStringEx: MultiByteToWideChar failed" ); + + OutputDebugStringW( buf ); + } + +#else + +#define OutputDebugStringEx OutputDebugStringA + +#endif + + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + static char buf[8192]; + va_list ap; + + + va_start( ap, fmt ); + vprintf( fmt, ap ); + /* send the string to the debugger as well */ + vsprintf( buf, fmt, ap ); + OutputDebugStringEx( buf ); + va_end( ap ); + } + + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + static char buf[8192]; + va_list ap; + + + va_start( ap, fmt ); + vsprintf( buf, fmt, ap ); + OutputDebugStringEx( buf ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + + +#ifdef FT_DEBUG_LEVEL_TRACE + + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the "FT2_DEBUG" environment variable. It must be a list of */ + /* toggles, separated by spaces, `;' or `,'. Example: */ + /* */ + /* "any:3 memory:6 stream:5" */ + /* */ + /* This will request that all levels be set to 3, except the trace level */ + /* for the memory and stream components which are set to 6 and 5, */ + /* respectively. */ + /* */ + /* See the file for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 6; 0 means quiet (except for serious */ + /* runtime errors), and 6 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { +#ifdef _WIN32_WCE + + /* Windows Mobile doesn't have environment API: */ + /* GetEnvironmentStrings, GetEnvironmentVariable, getenv. */ + /* */ + /* FIXME!!! How to set debug mode? */ + const char* ft2_debug = 0; + +#else + + const char* ft2_debug = getenv( "FT2_DEBUG" ); + +#endif + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + int n, i, len = p - q; + int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for "any" */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + +/* END */ diff --git a/src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.sln b/src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.sln new file mode 100644 index 0000000000..67b2216dcd --- /dev/null +++ b/src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.sln @@ -0,0 +1,158 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) = LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) + LIB Debug Multithreaded|Smartphone 2003 (ARMV4) = LIB Debug Multithreaded|Smartphone 2003 (ARMV4) + LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) + LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) = LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) + LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Debug|Pocket PC 2003 (ARMV4) = LIB Debug|Pocket PC 2003 (ARMV4) + LIB Debug|Smartphone 2003 (ARMV4) = LIB Debug|Smartphone 2003 (ARMV4) + LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release Multithreaded|Pocket PC 2003 (ARMV4) = LIB Release Multithreaded|Pocket PC 2003 (ARMV4) + LIB Release Multithreaded|Smartphone 2003 (ARMV4) = LIB Release Multithreaded|Smartphone 2003 (ARMV4) + LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) + LIB Release Singlethreaded|Smartphone 2003 (ARMV4) = LIB Release Singlethreaded|Smartphone 2003 (ARMV4) + LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release|Pocket PC 2003 (ARMV4) = LIB Release|Pocket PC 2003 (ARMV4) + LIB Release|Smartphone 2003 (ARMV4) = LIB Release|Smartphone 2003 (ARMV4) + LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).ActiveCfg = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Build.0 = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Deploy.0 = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).ActiveCfg = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Build.0 = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Deploy.0 = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Releaase|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I) + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.vcproj b/src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.vcproj new file mode 100644 index 0000000000..fcb9a8d626 --- /dev/null +++ b/src/3rdparty/freetype/builds/wince/vc2005-ce/freetype.vcproj @@ -0,0 +1,3825 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/3rdparty/freetype/builds/wince/vc2005-ce/index.html b/src/3rdparty/freetype/builds/wince/vc2005-ce/index.html new file mode 100644 index 0000000000..780ce41a4a --- /dev/null +++ b/src/3rdparty/freetype/builds/wince/vc2005-ce/index.html @@ -0,0 +1,47 @@ + +
      + + FreeType 2 Project Files for VS.NET 2005 + (Pocket PC) + + + +

      + FreeType 2 Project Files for VS.NET 2005 + (Pocket PC) +

      + +

      This directory contains project files for Visual C++, named +freetype.vcproj, and Visual Studio, called freetype.sln for +the following targets: + +

        +
      • PPC/SP 2003 (Pocket PC 2003)
      • +
      • PPC/SP WM5 (Windows Mobile 5)
      • +
      • PPC/SP WM6 (Windows Mobile 6)
      • +
      + +It compiles the following libraries from the FreeType 2.3.9 sources:

      + +
        +
        +    freetype239.lib     - release build; single threaded
        +    freetype239_D.lib   - debug build;   single threaded
        +    freetype239MT.lib   - release build; multi-threaded
        +    freetype239MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.sln b/src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.sln new file mode 100644 index 0000000000..0468e903b7 --- /dev/null +++ b/src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.sln @@ -0,0 +1,158 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) = LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) + LIB Debug Multithreaded|Smartphone 2003 (ARMV4) = LIB Debug Multithreaded|Smartphone 2003 (ARMV4) + LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) + LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) = LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) + LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Debug|Pocket PC 2003 (ARMV4) = LIB Debug|Pocket PC 2003 (ARMV4) + LIB Debug|Smartphone 2003 (ARMV4) = LIB Debug|Smartphone 2003 (ARMV4) + LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release Multithreaded|Pocket PC 2003 (ARMV4) = LIB Release Multithreaded|Pocket PC 2003 (ARMV4) + LIB Release Multithreaded|Smartphone 2003 (ARMV4) = LIB Release Multithreaded|Smartphone 2003 (ARMV4) + LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) + LIB Release Singlethreaded|Smartphone 2003 (ARMV4) = LIB Release Singlethreaded|Smartphone 2003 (ARMV4) + LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release|Pocket PC 2003 (ARMV4) = LIB Release|Pocket PC 2003 (ARMV4) + LIB Release|Smartphone 2003 (ARMV4) = LIB Release|Smartphone 2003 (ARMV4) + LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).ActiveCfg = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Build.0 = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Deploy.0 = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).ActiveCfg = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Build.0 = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Deploy.0 = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I) + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.vcproj b/src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.vcproj new file mode 100644 index 0000000000..2233577f97 --- /dev/null +++ b/src/3rdparty/freetype/builds/wince/vc2008-ce/freetype.vcproj @@ -0,0 +1,13467 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/3rdparty/freetype/builds/wince/vc2008-ce/index.html b/src/3rdparty/freetype/builds/wince/vc2008-ce/index.html new file mode 100644 index 0000000000..20e576f85c --- /dev/null +++ b/src/3rdparty/freetype/builds/wince/vc2008-ce/index.html @@ -0,0 +1,47 @@ + +
      + + FreeType 2 Project Files for VS.NET 2008 + (Pocket PC) + + + +

      + FreeType 2 Project Files for VS.NET 2008 + (Pocket PC) +

      + +

      This directory contains project files for Visual C++, named +freetype.dsp, and Visual Studio, called freetype.sln for +the following targets: + +

        +
      • PPC/SP 2003 (Pocket PC 2003)
      • +
      • PPC/SP WM5 (Windows Mobile 5)
      • +
      • PPC/SP WM6 (Windows Mobile 6)
      • +
      + +It compiles the following libraries from the FreeType 2.3.9 sources:

      + +
        +
        +    freetype239.lib     - release build; single threaded
        +    freetype239_D.lib   - debug build;   single threaded
        +    freetype239MT.lib   - release build; multi-threaded
        +    freetype239MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/src/3rdparty/freetype/configure b/src/3rdparty/freetype/configure new file mode 100755 index 0000000000..b59d35d07e --- /dev/null +++ b/src/3rdparty/freetype/configure @@ -0,0 +1,104 @@ +#!/bin/sh +# +# Copyright 2002, 2003, 2004, 2005, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +# +# +# Call the `configure' script located in `builds/unix'. +# + +rm -f config.mk builds/unix/unix-def.mk builds/unix/unix-cc.mk + +if test "x$GNUMAKE" = x; then + GNUMAKE=make +fi + +if test -z "`$GNUMAKE -v 2>/dev/null | grep GNU`"; then + if test -z "`$GNUMAKE -v 2>/dev/null | grep makepp`"; then + echo "GNU make (>= 3.80) or makepp (>= 1.19) is required to build FreeType2." >&2 + echo "Please try" >&2 + echo " \`GNUMAKE= $0'." >&2 + echo "or >&2" + echo " \`GNUMAKE=\"makepp --norc-substitution\" $0'." >&2 + exit 1 + fi +fi + +# Get `dirname' functionality. This is taken and adapted from autoconf's +# m4sh.m4 (_AS_EXPR_PREPARE, AS_DIRNAME_EXPR, and AS_DIRNAME_SED). + +if expr a : '\(a\)' >/dev/null 2>&1; then + ft_expr=expr +else + ft_expr=false +fi + +ft2_dir=`(dirname "$0") 2>/dev/null || + $ft_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || + echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +abs_curr_dir=`pwd` +abs_ft2_dir=`cd "$ft2_dir" && pwd` + +# build a dummy Makefile if we are not building in the source tree + +if test "$abs_curr_dir" != "$abs_ft2_dir"; then + mkdir reference + echo "Copying \`modules.cfg'" + cp $abs_ft2_dir/modules.cfg $abs_curr_dir + echo "Generating \`Makefile'" + echo "TOP_DIR := $abs_ft2_dir" > Makefile + echo "OBJ_DIR := $abs_curr_dir" >> Makefile + echo "OBJ_BUILD := \$(OBJ_DIR)" >> Makefile + echo "DOC_DIR := \$(OBJ_DIR)/reference" >> Makefile + echo "LIBTOOL := \$(OBJ_DIR)/libtool" >> Makefile + echo "ifndef FT2DEMOS" >> Makefile + echo " include \$(TOP_DIR)/Makefile" >> Makefile + echo "else" >> Makefile + echo " TOP_DIR_2 := \$(TOP_DIR)/../ft2demos" >> Makefile + echo " PROJECT := freetype" >> Makefile + echo " CONFIG_MK := \$(OBJ_DIR)/config.mk" >> Makefile + echo " include \$(TOP_DIR_2)/Makefile" >> Makefile + echo "endif" >> Makefile +fi + +# call make + +CFG= +# work around zsh bug which doesn't like `${1+"$@"}' +case $# in +0) ;; +*) for x in "$@"; do + CFG="$CFG '$x'" + done ;; +esac +CFG=$CFG $GNUMAKE setup unix + +# eof diff --git a/src/3rdparty/freetype/devel/ft2build.h b/src/3rdparty/freetype/devel/ft2build.h new file mode 100644 index 0000000000..c1d38c35ae --- /dev/null +++ b/src/3rdparty/freetype/devel/ft2build.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* FreeType 2 build and setup macros. */ +/* (Generic version) */ +/* */ +/* Copyright 1996-2001, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + * This is a development version of that is used + * to build the library in debug mode. Its only difference with + * the reference is that it forces the use of the local `ftoption.h' + * which contains different settings for all configuration macros. + * + * To use it, you must define the environment variable FT2_BUILD_INCLUDE + * to point to the directory containing these two files (`ft2build.h' and + * `ftoption.h'), then invoke Jam as usual. + */ + +#ifndef __FT2_BUILD_DEVEL_H__ +#define __FT2_BUILD_DEVEL_H__ + +#define FT_CONFIG_OPTIONS_H + +#include + +#endif /* __FT2_BUILD_DEVEL_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/devel/ftoption.h b/src/3rdparty/freetype/devel/ftoption.h new file mode 100644 index 0000000000..f7f7fcc169 --- /dev/null +++ b/src/3rdparty/freetype/devel/ftoption.h @@ -0,0 +1,694 @@ +/***************************************************************************/ +/* */ +/* ftoption.h (for development) */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#include + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* This file contains the default configuration macro definitions for */ + /* a standard build of the FreeType library. There are three ways to */ + /* use this file to build project-specific versions of the library: */ + /* */ + /* - You can modify this file by hand, but this is not recommended in */ + /* cases where you would like to build several versions of the */ + /* library from a single source directory. */ + /* */ + /* - You can put a copy of this file in your build directory, more */ + /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ + /* is the name of a directory that is included _before_ the FreeType */ + /* include path during compilation. */ + /* */ + /* The default FreeType Makefiles and Jamfiles use the build */ + /* directory `builds/' by default, but you can easily change */ + /* that for your own projects. */ + /* */ + /* - Copy the file to `$BUILD/ft2build.h' and modify it */ + /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ + /* locate this file during the build. For example, */ + /* */ + /* #define FT_CONFIG_OPTIONS_H */ + /* #include */ + /* */ + /* will use `$BUILD/myftoptions.h' instead of this file for macro */ + /* definitions. */ + /* */ + /* Note also that you can similarly pre-define the macro */ + /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ + /* that are statically linked to the library at compile time. By */ + /* default, this file is . */ + /* */ + /* We highly recommend using the third method whenever possible. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Uncomment the line below if you want to activate sub-pixel rendering */ + /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ + /* */ + /* Note that this feature is covered by several Microsoft patents */ + /* and should not be activated in any default build of the library. */ + /* */ + /* This macro has no impact on the FreeType API, only on its */ + /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ + /* FT_Render_Glyph still generates a bitmap that is 3 times larger than */ + /* the original size; the difference will be that each triplet of */ + /* subpixels has R=G=B. */ + /* */ + /* This is done to allow FreeType clients to run unmodified, forcing */ + /* them to display normal gray-level anti-aliased glyphs. */ + /* */ +#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + + /*************************************************************************/ + /* */ + /* Many compilers provide a non-ANSI 64-bit data type that can be used */ + /* by FreeType to speed up some computations. However, this will create */ + /* some problems when compiling the library in strict ANSI mode. */ + /* */ + /* For this reason, the use of 64-bit integers is normally disabled when */ + /* the __STDC__ macro is defined. You can however disable this by */ + /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ + /* */ + /* For most compilers, this will only create compilation warnings when */ + /* building the library. */ + /* */ + /* ObNote: The compiler-specific 64-bit integers are detected in the */ + /* file `ftconfig.h' either statically or through the */ + /* `configure' script on supported platforms. */ + /* */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /*************************************************************************/ + /* */ + /* If this macro is defined, do not try to use an assembler version of */ + /* performance-critical functions (e.g. FT_MulFix). You should only do */ + /* that to verify that the assembler function works properly, or to */ + /* execute benchmark tests of the various implementations. */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /*************************************************************************/ + /* */ + /* If this macro is defined, try to use an inlined assembler version of */ + /* the `FT_MulFix' function, which is a `hotspot' when loading and */ + /* hinting glyphs, and which should be executed as fast as possible. */ + /* */ + /* Note that if your compiler or CPU is not supported, this will default */ + /* to the standard and portable implementation found in `ftcalc.c'. */ + /* */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + + /*************************************************************************/ + /* */ + /* Gzip-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `gzip' program. This is mostly used to parse many of the PCF files */ + /* that come with XFree86. The implementation uses `zlib' to */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ + /* */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /*************************************************************************/ + /* */ + /* ZLib library selection */ + /* */ + /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ + /* It allows FreeType's `ftgzip' component to link to the system's */ + /* installation of the ZLib library. This is useful on systems like */ + /* Unix or VMS where it generally is already available. */ + /* */ + /* If you let it undefined, the component will use its own copy */ + /* of the zlib sources instead. These have been modified to be */ + /* included directly within the component and *not* export external */ + /* function names. This allows you to link any program with FreeType */ + /* _and_ ZLib without linking conflicts. */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /*************************************************************************/ + /* */ + /* DLL export compilation */ + /* */ + /* When compiling FreeType as a DLL, some systems/compilers need a */ + /* special keyword in front OR after the return type of function */ + /* declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ + /* */ + /* FT_EXPORT( return_type ) */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* */ + /* */ + /* FT_EXPORT_DEF( return_type ) */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* */ + /* You can provide your own implementation of FT_EXPORT and */ + /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ + /* will be later automatically defined as `extern return_type' to */ + /* allow normal compilation. */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_EXPORT(x) extern x */ +/* #define FT_EXPORT_DEF(x) x */ + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `PSNames' module. This */ + /* module is in charge of converting a glyph name string into a */ + /* Unicode value, or return a Macintosh standard glyph name for the */ + /* use with the TrueType `post' table. */ + /* */ + /* Undefine this macro if you do not want `PSNames' compiled in your */ + /* build of FreeType. This has the following effects: */ + /* */ + /* - The TrueType driver will provide its own set of glyph names, */ + /* if you build it to support postscript names in the TrueType */ + /* `post' table. */ + /* */ + /* - The Type 1 driver will not be able to synthesize a Unicode */ + /* charmap out of the glyphs found in the fonts. */ + /* */ + /* You would normally undefine this configuration macro when building */ + /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ + /* */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Postscript Names to Unicode Values support */ + /* */ + /* By default, FreeType 2 is built with the `PSNames' module compiled */ + /* in. Among other things, the module is used to convert a glyph name */ + /* into a Unicode value. This is especially useful in order to */ + /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ + /* through a big table named the `Adobe Glyph List' (AGL). */ + /* */ + /* Undefine this macro if you do not want the Adobe Glyph List */ + /* compiled in your `PSNames' module. The Type 1 driver will not be */ + /* able to synthesize a Unicode charmap out of the glyphs found in the */ + /* fonts. */ + /* */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /*************************************************************************/ + /* */ + /* Support for Mac fonts */ + /* */ + /* Define this macro if you want support for outline fonts in Mac */ + /* format (mac dfont, mac resource, macbinary containing a mac */ + /* resource) on non-Mac platforms. */ + /* */ + /* Note that the `FOND' resource isn't checked. */ + /* */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /*************************************************************************/ + /* */ + /* Allow the use of FT_Incremental_Interface to load typefaces that */ + /* contain no glyph data, but supply it via a callback function. */ + /* This allows FreeType to be used with the PostScript language, using */ + /* the GhostScript interpreter. */ + /* */ +/* #define FT_CONFIG_OPTION_INCREMENTAL */ + + + /*************************************************************************/ + /* */ + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ + /* */ + /* This must be greater than 4KByte if you use FreeType to rasterize */ + /* glyphs; otherwise, you may set it to zero to avoid unnecessary */ + /* allocation of the render pool. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384L + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 32 is the default. */ + /* */ +#define FT_MAX_MODULES 32 + + + /*************************************************************************/ + /* */ + /* Debug level */ + /* */ + /* FreeType can be compiled in debug or trace mode. In debug mode, */ + /* errors are reported through the `ftdebug' component. In trace */ + /* mode, additional messages are sent to the standard output during */ + /* execution. */ + /* */ + /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ + /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ + /* */ + /* Don't define any of these macros to compile in `release' mode! */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +#define FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_TRACE + + + /*************************************************************************/ + /* */ + /* Memory Debugging */ + /* */ + /* FreeType now comes with an integrated memory debugger that is */ + /* capable of detecting simple errors like memory leaks or double */ + /* deletes. To compile it within your build of the library, you */ + /* should define FT_DEBUG_MEMORY here. */ + /* */ + /* Note that the memory debugger is only activated at runtime when */ + /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +#define FT_DEBUG_MEMORY + + + /*************************************************************************/ + /* */ + /* Module errors */ + /* */ + /* If this macro is set (which is _not_ the default), the higher byte */ + /* of an error code gives the module in which the error has occurred, */ + /* while the lower byte is the real error code. */ + /* */ + /* Setting this macro makes sense for debugging purposes only, since */ + /* it would break source compatibility of certain programs that use */ + /* FreeType 2. */ + /* */ + /* More details can be found in the files ftmoderr.h and fterrors.h. */ + /* */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ + /* embedded bitmaps in all formats using the SFNT module (namely */ + /* TrueType & OpenType). */ + /* */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ + /* load and enumerate the glyph Postscript names in a TrueType or */ + /* OpenType file. */ + /* */ + /* Note that when you do not compile the `PSNames' module by undefining */ + /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ + /* contain additional code used to read the PS Names table from a font. */ + /* */ + /* (By default, the module uses `PSNames' to extract glyph names.) */ + /* */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ + /* access the internal name table in a SFNT-based format like TrueType */ + /* or OpenType. The name table contains various strings used to */ + /* describe the font, like family name, copyright, version, etc. It */ + /* does not contain any glyph name though. */ + /* */ + /* Accessing SFNT names is done through the functions declared in */ + /* `freetype/ftnames.h'. */ + /* */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /*************************************************************************/ + /* */ + /* TrueType CMap support */ + /* */ + /* Here you can fine-tune which TrueType CMap table format shall be */ + /* supported. */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ + /* a bytecode interpreter in the TrueType driver. Note that there are */ + /* important patent issues related to the use of the interpreter. */ + /* */ + /* By undefining this, you will only compile the code necessary to load */ + /* TrueType glyphs without hinting. */ + /* */ + /* Do not #undef this macro here, since the build system might */ + /* define it for certain configurations only. */ + /* */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ + /* of the TrueType bytecode interpreter is used that doesn't implement */ + /* any of the patented opcodes and algorithms. Note that the */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you define */ + /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, either define */ + /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ + /* */ + /* This macro is only useful for a small number of font files (mostly */ + /* for Asian scripts) that require bytecode interpretation to properly */ + /* load glyphs. For all other fonts, this produces unpleasant results, */ + /* thus the unpatented interpreter is never used to load glyphs from */ + /* TrueType fonts unless one of the following two options is used. */ + /* */ + /* - The unpatented interpreter is explicitly activated by the user */ + /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ + /* when opening the FT_Face. */ + /* */ + /* - FreeType detects that the FT_Face corresponds to one of the */ + /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ + /* contains a hard-coded list of font names and other matching */ + /* parameters (see function `tt_face_init' in file */ + /* `src/truetype/ttobjs.c'). */ + /* */ + /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ + /* */ + /* { */ + /* FT_Parameter parameter; */ + /* FT_Open_Args open_args; */ + /* */ + /* */ + /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ + /* */ + /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ + /* open_args.pathname = my_font_pathname; */ + /* open_args.num_params = 1; */ + /* open_args.params = ¶meter; */ + /* */ + /* error = FT_Open_Face( library, &open_args, index, &face ); */ + /* ... */ + /* } */ + /* */ +/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ + /* bytecode interpreter with a huge switch statement, rather than a call */ + /* table. This results in smaller and faster code for a number of */ + /* architectures. */ + /* */ + /* Note however that on some compiler/processor combinations, undefining */ + /* this macro will generate faster, though larger, code. */ + /* */ +#define TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ + /* TrueType glyph loader to use Apple's definition of how to handle */ + /* component offsets in composite glyphs. */ + /* */ + /* Apple and MS disagree on the default behavior of component offsets */ + /* in composites. Apple says that they should be scaled by the scaling */ + /* factors in the transformation matrix (roughly, it's more complex) */ + /* while MS says they should not. OpenType defines two bits in the */ + /* composite flags array which can be used to disambiguate, but old */ + /* fonts will not have them. */ + /* */ + /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ + /* support for Apple's distortable font technology (fvar, gvar, cvar, */ + /* and avar tables). This has many similarities to Type 1 Multiple */ + /* Masters support. */ + /* */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ + /* */ +#define TT_CONFIG_OPTION_BDF + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ + /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ + /* required. */ + /* */ +#define T1_MAX_DICT_DEPTH 5 + + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 16 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ + /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ + /* files into an existing face. Note that if set, the T1 driver will be */ + /* unable to produce kerning distances. */ + /* */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of the Multiple Masters font support in the Type 1 */ + /* driver. */ + /* */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ + /* support. */ + /* */ +#define AF_CONFIG_OPTION_CJK + + + /*************************************************************************/ + /* */ + /* Compile autofit module with Indic script support. */ + /* */ +#define AF_CONFIG_OPTION_INDIC + + /* */ + + + /* + * Define this variable if you want to keep the layout of internal + * structures that was used prior to FreeType 2.2. This also compiles in + * a few obsolete functions to avoid linking problems on typical Unix + * distributions. + * + * For embedded systems or building a new distribution from scratch, it + * is recommended to disable the macro since it reduces the library's code + * size and activates a few memory-saving optimizations as well. + */ +#undef FT_CONFIG_OPTION_OLD_INTERNALS + + + /* + * This variable is defined if either unpatented or native TrueType + * hinting is requested by the definitions above. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER +#undef TT_CONFIG_OPTION_UNPATENTED_HINTING +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/docs/CHANGES b/src/3rdparty/freetype/docs/CHANGES new file mode 100644 index 0000000000..9eb68c2924 --- /dev/null +++ b/src/3rdparty/freetype/docs/CHANGES @@ -0,0 +1,3317 @@ +CHANGES BETWEEN 2.3.9 and 2.3.8 + + I. IMPORTANT BUG FIXES + + - Very unfortunately, FreeType 2.3.8 contained a change that broke + its official ABI. The end result is that programs compiled + against previous versions of the library, but dynamically linked + to 2.3.8 can experience memory corruption if they call the + `FT_Get_PS_Font_Info' function. + + We recommend all users to upgrade to 2.3.9 as soon as possible, + or to downgrade to a previous release of the library if this is + not an option. + + The origin of the bug is that a new field was added to the + publicly defined `PS_FontInfoRec' structure. Unfortunately, + objects of this type can be stack or heap allocated by callers + of `FT_Get_PS_Font_Info', resulting in a memory buffer + overwrite with its implementation in 2.3.8. + + If you want to know whether your code is vulnerable to this + issue, simply search for the substrings `PS_FontInfo' and + `PS_Font_Info' in your source code. If none is found, your code + is safe and is not affected. + + The FreeType team apologizes for the problem. + + - The POSIX support of MacOS resource-fork fonts (Suitcase fonts + and LaserWriter Type1 PostScript fonts) was broken in 2.3.8. If + FreeType2 is built without Carbon framework, these fonts are not + handled correctly. Version 2.3.7 didn't have this bug. + + - `FT_Get_Advance' (and `FT_Get_Advances') returned bad values for + almost all font formats except TrueType fonts. + + - Fix a bug in the SFNT kerning table loader/parser which could + crash the engine if certain malformed tables were encountered. + + - Composite SFNT bitmaps are now handled correctly. + + + II. IMPORTANT CHANGES + + - The new functions `FT_Get_CID_Is_Internally_CID_keyed' and + `FT_Get_CID_From_Glyph_Index' can be used to access CID-keyed + CFF fonts via CID values. This code has been contributed by + Michael Toftdal. + + + III. MISCELLANEOUS + + - `FT_Outline_Get_InsideBorder' returns FT_STROKER_BORDER_RIGHT + for empty outlines. This was incorrectly documented. + + - The `ftview' demo program now supports UTF-8 encoded strings. + + +====================================================================== + +CHANGES BETWEEN 2.3.8 and 2.3.7 + + I. IMPORTANT BUG FIXES + + - CID-keyed fonts in an SFNT wrapper were not handled correctly. + + - The smooth renderer produced truncated images (on the right) for + outline parts with negative horizontal values. Most fonts don't + contain outlines left to the y coordinate axis, but the effect + was very noticeable for outlines processed with FT_Glyph_Stroke, + using thick strokes. + + - `FT_Get_TrueType_Engine_Type' returned a wrong value if both + configuration macros TT_CONFIG_OPTION_BYTECODE_INTERPRETER and + TT_CONFIG_OPTION_UNPATENTED_HINTING were defined. + + - The `face_index' field in the `FT_Face' structure wasn't + initialized properly after calling FT_Open_Face and friends with + a positive face index for CFFs, WinFNTs, and, most importantly, + for TrueType Collections (TTCs). + + + II. IMPORTANT CHANGES + + - Rudimentary support for Type 1 fonts and CID-keyed Type 1 fonts + in an SFNT wrapper has been added -- such fonts are used on the + Mac. The core SFNT tables `TYP1' and `CID ' are passed to the + PS Type 1 and CID-keyed PS font drivers; other tables (`ALMX', + `BBOX', etc.) are not supported yet. + + - A new interface to extract advance values of glyphs without + loading their outlines has been added. The functions are called + `FT_Get_Advance' and `FT_Get_Advances'; they are defined in file + `ftadvanc.h' (to be accessed as FT_ADVANCES_H). + + - A new function `FT_Get_FSType_Flags' (in FT_FREETYPE_H) has been + contributed by David Bevan to access the embedding and + subsetting restriction information of fonts. + + + III. MISCELLANEOUS + + - FT_MulFix is now an inlined function; by default, assembler code + is provided for x86 and ARM. See FT_CONFIG_OPTION_INLINE_MULFIX + and FT_CONFIG_OPTION_NO_ASSEMBLER (in ftoption.h) for more. + + - The handling of `tricky' fonts (this is, fonts which don't work + with the autohinter, needing the font format's hinting engine) + has been generalized and changed slightly: + + . A new face flag FT_FACE_FLAG_TRICKY indicates that the font + format's hinting engine is necessary for correct rendering. + The macro FT_IS_TRICKY can be used to check this flag. + + . FT_LOAD_NO_HINTING is now ignored for tricky fonts. To really + force raw loading of such fonts (without hinting), both + FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT must be used -- + this is something which you probably never want to do. + + . Tricky TrueType fonts always use the bytecode interpreter, + either the patented or unpatented version. + + - The function `FT_GlyphSlot_Own_Bitmap' has been moved from + FT_SYNTHESIS_H to FT_BITMAP_H; it is now part of the `official' + API. (The functions in FT_SYNTHESIS_H are still subject to + change, however.) + + - In the `ftdiff' demo program you can now toggle the use of + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH with key `a'. + + +====================================================================== + +CHANGES BETWEEN 2.3.7 and 2.3.6 + + I. IMPORTANT BUG FIXES + + - If the library was compiled on an i386 platform using gcc, and + compiler option -O3 was given, `FT_MulFix' sometimes returned + incorrect results which could have caused problems with + `FT_Request_Metrics' and `FT_Select_Metrics', returning an + incorrect descender size. + + - Pure CFFs without subfonts were scaled incorrectly if the font + matrix was non-standard. This bug has been introduced in + version 2.3.6. + + - The `style_name' field in the `FT_FaceRec' structure often + contained a wrong value for Type 1 fonts. This misbehaviour + has been introduced in version 2.3.6 while trying to fix + another problem. [Note, however, that this value is + informative only since the used algorithm to extract it is + very simplistic.] + + + II. IMPORTANT CHANGES + + - Two new macros, FT_OUTLINE_SMART_DROPOUTS and + FT_OUTLINE_EXCLUDE_STUBS, have been introduced. Together with + FT_OUTLINE_IGNORE_DROPOUTS (which was ignored previously) it is + now possible to control the dropout mode of the `raster' module + (for B&W rasterization), using the `flags' field in the + `FT_Outline' structure. + + - The TrueType bytecode interpreter now passes the dropout mode to + the B&W rasterizer. This greatly increases the output for small + ppem values of many fonts like `pala.ttf'. + + +====================================================================== + +CHANGES BETWEEN 2.3.6 and 2.3.5 + + I. IMPORTANT BUG FIXES + + - A bunch of potential security problems have been found. All + users should update. + + - Microsoft Unicode cmaps in TrueType fonts are now always + preferred over Apple cmaps. This is not a bug per se, but there + exist some buggy fonts created for MS which have broken Apple + cmaps. This affects only the automatic selection of FreeType; + it's always possible to manually select an Apple Unicode cmap if + desired. + + - Many bug fixes to the TrueType bytecode interpreter. + + - Improved Mac support. + + - Subsetted CID-keyed CFFs are now supported correctly. + + - CID-keyed CFFs with subfonts which are scaled in a non-standard + way are now handled correctly. + + - A call to FT_Open_Face with `face_index' < 0 crashed FreeType if + the font was a Windows (bitmap) FNT/FON. + + + II. IMPORTANT CHANGES + + - The new function `FT_Get_CID_Registry_Ordering_Supplement' gives + access to those fields in a CID-keyed font. The code has been + contributed by Derek Clegg. + + - George Williams contributed code to validate the new `MATH' + OpenType table (within the `otvalid' module). The `ftvalid' + demo program has been extended accordingly. + + - An API for cmap 14 support (for Unicode Variant Selectors, UVS) + has been contributed by George Williams. + + - A new face flag FT_FACE_FLAG_CID_KEYED has been added, together + with a macro FT_IS_CID_KEYED which evaluates to 1 if the font is + CID-keyed. + + + III. MISCELLANEOUS + + - Build support for symbian has been contributed. + + - Better WGL4 glyph name support, contributed by Sergey Tolstov. + + - Debugging output of the various FT_TRACEX macros is now sent to + stderr. + + - The `ftview' demo program now provides artificial slanting too. + + - The `ftvalid' demo program has a new option `-f' to select the + font index. + + +====================================================================== + +CHANGES BETWEEN 2.3.5 and 2.3.4 + + I. IMPORTANT BUG FIXES + + - Some subglyphs in TrueType fonts were handled incorrectly due to + a missing graphics state reinitialization. + + - Large .Z files (as distributed with some X11 packages) weren't + handled correctly, making FreeType increase the heap stack in an + endless loop. + + - A large number of bugs have been fixed to avoid crashes and + endless loops with invalid fonts. + + + II. IMPORTANT CHANGES + + - The two new cache functions `FTC_ImageCache_LookupScaler' and + `FTC_SBit_Cache_LookupScaler' have been added to allow lookup of + glyphs using an `FTC_Scaler' object; this makes it possible to + use fractional pixel sizes in the cache. The demo programs have + been updated accordingly to use this feature. + + - A new API `FT_Get_CMap_Format' has been added to get the cmap + format of a TrueType font. This is useful in handling PDF + files. The code has been contributed by Derek Clegg. + + - The auto-hinter now produces better output by default for + non-Latin scripts like Indic. This was done by using the CJK + hinting module as the default instead of the Latin one. Thanks + to Rahul Bhalerao for this suggestion. + + - A new API `FT_Face_CheckTrueTypePatents' has been added to find + out whether a given TrueType font uses patented bytecode + instructions. The `ft2demos' bundle contains a new program + called `ftpatchk' which demonstrates its usage. + + - A new API `FT_Face_SetUnpatentedHinting' has been added to + enable or disable the unpatented hinter. + + - Support for Windows FON files in PE format has been contributed + by Dmitry Timoshkov. + + + III. MISCELLANEOUS + + - Vincent Richomme contributed Visual C++ project files for Pocket + PCs. + + +====================================================================== + +CHANGES BETWEEN 2.3.4 and 2.3.3 + + I. IMPORTANT BUG FIXES + + - A serious bug in the handling of bitmap fonts (and bitmap + strikes of outline fonts) has been introduced in 2.3.3. + + +====================================================================== + +CHANGES BETWEEN 2.3.3 and 2.3.2 + + I. IMPORTANT BUG FIXES + + - Remove a serious regression in the TrueType bytecode interpreter + that was introduced in version 2.3.2. Note that this does not + disable the improvements introduced to the interpreter in + version 2.3.2, only some ill cases that occurred with certain + fonts (though a few popular ones). + + - The auto-hinter now ignores single-point contours for computing + blue zones. This bug created `wavy' baselines when rendering + text with various fonts that use these contours to model + mark-attach points (these are points that are never rasterized + and are placed outside of the glyph's real outline). + + - The `rsb_delta' and `lsb_delta' glyph slot fields are now set to + zero for mono-spaced fonts. Otherwise code that uses them would + essentially ruin the fixed-advance property. + + - Fix CVE-2007-1351 which can cause an integer overflow while + parsing BDF fonts, leading to a potentially exploitable heap + overflow condition. + + + II. MISCELLANEOUS + + - Fixed compilation issues on some 64-bit platforms (see ChangeLog + for details). + + - A new demo program `ftdiff' has been added to compare TrueType + hinting, FreeType's auto hinting, and rendering without hinting + in three columns. + + +====================================================================== + +CHANGES BETWEEN 2.3.2 and 2.3.1 + + I. IMPORTANT BUG FIXES + + - FreeType returned incorrect kerning information from TrueType + fonts when the bytecode interpreter was enabled. This happened + due to a typo introduced in version 2.3.0. + + - Negative kerning values from PFM files are now reported + correctly (they were read as 16-bit unsigned values from the + file). + + - Fixed a small memory leak when `FT_Init_FreeType' failed for + some reason. + + - The Postscript hinter placed and sized very thin and ghost stems + incorrectly. + + - The TrueType bytecode interpreter has been fixed to get rid of + most of the rare differences seen in comparison to the Windows + font loader. + + + II. IMPORTANT CHANGES + + - The auto-hinter now better deals with serifs and corner cases + (e.g., glyph '9' in Arial at 9pt, 96dpi). It also improves + spacing adjustments and doesn't change widths for non-spacing + glyphs. + + - Many Mac-specific functions are deprecated (but still + available); modern replacements have been provided for them. + See the documentation in file `ftmac.h'. + + +====================================================================== + +CHANGES BETWEEN 2.3.1 and 2.3.0 + + I. IMPORTANT BUG FIXES + + - The TrueType interpreter sometimes returned incorrect horizontal + metrics due to a bug in the handling of the SHZ instruction. + + - A typo in a security check introduced after version 2.2.1 + prevented FreeType to render some glyphs in CFF fonts. + + +====================================================================== + +CHANGES BETWEEN 2.3.0 and 2.2.1 + + I. IMPORTANT BUG FIXES + + - The PCF font loader is now much more robust while loading + malformed font files. + + - Various memory leaks have been found and fixed. + + - The TrueType name loader now deals properly with some fonts that + encode their names in UTF-16 (the specification was vague, and + the code incorrectly assumed UCS-4). + + - Fixed the TrueType bytecode loader to deal properly with subtle + monochrome/gray issues when scaling the CVT. Some fonts + exhibited bad rendering artifacts otherwise. + + - `FT_GlyphSlot_Embolden' now supports vertical layouts correctly + (it mangled the vertical advance height). + + - Fixed byte endian issues of `ftmac.c' to support Mac OS X on + i386. + + - The PFR font loader no longer erroneously tags font files + without any outlines as FT_FACE_FLAG_SCALABLE. + + + II. NEW API FUNCTIONS + + - `FT_Library_SetLcdFilter' allows you to select a special filter + to be applied to the bitmaps generated by `FT_Render_Glyph' if + one of the FT_RENDER_MODE_LCD and FT_RENDER_MODE_LCD_V modes has + been selected. This filter is used to reduce color fringes; + several settings are available through the FT_LCD_FILTER_XXX + enumeration. + + Its declaration and documentation can be found in file + `include/freetype/ftlcdfil.h' (to be accessed with macro + FT_LCD_FILTER_H). + + *IMPORTANT*: This function returns an error + (FT_Err_Unimplemented_Feature) in default builds of the library + for patent reasons. See below. + + - `FT_Get_Gasp' allows you to query the flags of the TrueType + `gasp' table for a given character pixel size. This is useful + to duplicate the text rendering of MS Windows when the native + bytecode interpreter is enabled (which isn't the default for + other patent reasons). + + Its declaration and documentation can be found in file + `include/freetype/ftgasp.h' (to be accessed with macro + FT_GASP_H). + + + III. IMPORTANT CHANGES + + - The auto-hinter has been tuned a lot to improve its results with + serif fonts, resulting in much better font rendering of many web + pages. + + - The unpatented hinter is now part of the default build of the + library; we have added code to automatically support `tricky' + fonts that need it. + + This means that FreeType should `just work' with certain Asian + fonts, like MingLiU, which cannot properly be loaded without a + bytecode interpreter, but which fortunately do not use any of + the patented bytecode opcodes. We detect these fonts by name, + so please report any font file that doesn't seem to work with + FreeType, and we shall do what we can to support it in a next + release. + + Note that the API hasn't changed, so you can still force + unpatented hinting with a special parameter to `FT_Open_Face' as + well. This might be useful in same cases; for example, a PDF + reader might present a user option to activate it to deal with + certain `tricky' embedded fonts which cannot be clearly + identified. + + If you are a developer for embedded systems, you might want to + *disable* the feature to save code space by undefining + TT_CONFIG_OPTION_UNPATENTED_HINTING in file `ftoption.h'. + + - LCD-optimized rendering is now *disabled* in all default builds + of the library, mainly due to patent issues. For more + information see: + + http://lists.gnu.org/archive/html/freetype/2006-09/msg00064.html + + A new configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING + has been introduced in `ftoption.h'; manually define it in this + file if you want to re-enable the feature. + + The change only affects the implementation, not the FreeType + API. This means that clients don't need to be modified, because + the library still generates LCD decimated bitmaps, but with the + added constraint that R=G=B on each triplet. + + The displayed result should be equal to normal anti-aliased + rendering. + + Additionally, if FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + defined, the new `FT_Library_SetLcdFilter' function returns the + FT_Err_Unimplemented_Feature error code. + + - Some computation bugs in the TrueType bytecode interpreter were + found, which allow us to get rid of very subtle and rare + differences we had experienced with the Windows renderer. + + - It is now possible to cross-compile the library easily. See the + file `docs/INSTALL.CROSS' for details. + + - The file `src/base/ftmac.c' now contains code for Mac OS X only; + its deprecated function `FT_GetFile_From_Mac_Font_Name' always + returns an error even if the QuickDraw framework is available. + The previous version has been moved to `builds/mac/ftmac.c'. + + Selecting configure option `--with-quickdraw-carbon' makes the + build process use the original `ftmac.c' file instead of the Mac + OS X-only version. + + + IV. MISCELLANEOUS + + - Various performance and memory footprint optimizations have been + performed on the TrueType and CFF font loaders, sometimes with + very drastic benefits (e.g., the TrueType loader is now about + 25% faster; FreeType should use less heap memory under nearly + all conditions). + + - The anti-aliased rasterizer has been optimized and is now 15% to + 25% percent faster than in previous versions, depending on + content. + + - The Type 1 loader has been improved; as an example, it now skips + top-level dictionaries properly. + + - Better support for Mac fonts on POSIX systems, plus compilation + fixes for Mac OS X on ppc64 where `ftmac.c' cannot be built. + + - Configuration without `--with-old-mac-fonts' does not include + `ftmac.c' (this was the behaviour in FreeType version 2.1.10). + + - The TrueTypeGX validator (gxvalid) checks the order of glyph IDs + in the kern table. + + +====================================================================== + +CHANGES BETWEEN 2.2.1 and 2.2 + + I. IMPORTANT BUG FIXES + + - Various integer overflows have been fixed. + + - PFB fonts with MacOS resource fork weren't handled correctly on + non-MacOS platforms. + + +====================================================================== + +CHANGES BETWEEN 2.2 and 2.1.10 + +(not released officially) + + I. IMPORTANT BUG FIXES + + - Vertical metrics for SFNT fonts were incorrect sometimes. + + - The FT_HAS_KERNING macro always returned 0. + + - CFF OpenType fonts didn't return correct vertical metrics for + glyphs with outlines. + + - If FreeType was compiled without hinters, all font formats based + on PS outlines weren't scaled correctly. + + + II. IMPORTANT CHANGES + + - Version 2.2 no longer exposes its internals, this is, the header + files located in the `include/freetype/internal' directory of + the source package are not copied anymore by the `make install' + command. Consequently, a number of rogue clients which directly + access FreeType's internal functions and structures won't + compile without modification. + + We provide patches for most of those rogue clients. See the + following page for more information: + + http://www.freetype.org/freetype2/patches/rogue-patches.html + + Note that, as a convenience to our Unix desktop users, version + 2.2 is *binary* compatible with FreeType 2.1.7, which means that + installing this release on an existing distribution shall not + break any working desktop. + + - FreeType's build mechanism has been redesigned. With GNU make + it is now sufficient in most cases to edit two files: + `modules.cfg', to select the library components, and the + configuration file `include/freetype/config/ftoption.h' (which + can be copied to the objects directory). Removing unused module + directories to prevent its compilation and editing + `include/freetype/config/ftmodule.h' is no longer necessary. + + - The LIGHT hinting algorithm produces more pleasant results. + Also, using the FT_LOAD_TARGET_LIGHT flags within FT_Load_Glyph + always forces auto-hinting, as a special exception. This allows + you to experiment with it even if you have enabled the TrueType + bytecode interpreter in your build. + + - The auto hinter now employs a new algorithm for CJK fonts, based + on Akito Hirai's patch. Note that this only works for fonts + with a Unicode charmap at the moment. + + - The following callback function types have changed slightly (by + adding the `const' keyword where appropriate): + + FT_Outline_MoveToFunc + FT_Outline_LineToFunc + FT_Outline_ConicToFunc + FT_Outline_CubicToFunc + FT_SpanFunc + FT_Raster_RenderFunc + + FT_Glyph_TransformFunc + FT_Renderer_RenderFunc + FT_Renderer_TransformFunc + + Note that this doesn't affect binary backward compatibility. + + - On MacOS, new APIs have been added as replacements for legacy + APIs: `FT_New_Face_From_FSRef' for `FT_New_Face_From_FSSpec', + and `FT_GetFile_From_Mac_ATS_Name' for + `FT_GetFile_From_Mac_Name'. Legacy APIs are still available, if + FreeType is built without disabling them. + + - A new API `FT_Select_Size' has been added to select a bitmap + strike by its index. Code using other functions to select + bitmap strikes should be updated to use this function. + + - A new API `FT_Get_SubGlyph_Info' has been added to retrieve + subglyph data. This can be used by rogue clients which used to + access the internal headers to get the corresponding data. + + - In 2.1.10, the behaviour of `FT_Set_Pixel_Sizes' was changed for + BDF/PCF fonts, and only for them. This causes inconsistency. + In this release, we undo the change. The intent of the change + in 2.1.10 is to allow size selection through real dimensions, + which can now be done through `FT_Request_Size'. + + - Some security issues were discovered and fixed in the CFF and + Type 1 loader, causing crashes of FreeType by malformed font + files. + + + III. MISCELLANEOUS + + - The documentation for FT_LOAD_TARGET_XXX and FT_RENDER_MODE_XXX + values now better reflects its usage and differences: One set is + used to specify the hinting algorithm, the other to specify the + pixel rendering mode. + + - `FT_New_Face' and `FT_New_Face_From_FSSpec' in ftmac.c have been + changed to count supported scalable faces (sfnt, LWFN) only, and + to return the number of available faces via face->num_faces. + Unsupported bitmap faces (fbit, NFNT) are ignored. + + - builds/unix/configure has been improved for MacOS X. It now + automatically checks available functions in Carbon library, and + prepare to use newest functions by default. Options to specify + the dependencies of each Carbon APIs (FSSpec, FSRef, old/new + QuickDraw, ATS) are available too. By manual disabling of all + QuickDraw functionality, FreeType can be built without + `deprecated function' warnings on MacOS 10.4.x, but + FT_GetFile_Mac_Name in ftmac.c then is changed to a dummy + function, and returns an `unimplemented' error. For details see + builds/mac/README. + + - SFNT cmap handling has been improved, mainly to run much faster + with CJK fonts. + + - A new function `FT_Get_TrueType_Engine_Type (declared in + `FT_MODULE_H') is provided to determine the status of the + TrueType bytecode interpreter compiled into the library + (patented, unpatented, unimplemented). + + - Vertical metrics of glyphs are synthesized if the font does not + provide such information. You can tell whether the metrics are + synthesized or not by checking the FT_FACE_FLAG_VERTICAL flag of + the face. + + - The demo programs `ftview' and `ftstring' have been rewritten + for better readability. `ftview' has a new switch `-p' to test + FT_New_Memory_Face (instead of FT_New_Face). + + - FreeType now honours bit 1 in the `head' table of TrueType fonts + (meaning `left sidebearing point at x=0'). This helps with some + buggy fonts. + + - Rudimentary support for Adobe's new `SING Glyphlet' format. See + + http://www.adobe.com/products/indesign/sing_gaiji.html + + for more information. + + - The `ftdump' program from the `ft2demos' bundle now shows some + information about charmaps. It also supports a new switch `-v' + to increase verbosity. + + - Better AFM support. This includes track kerning support. + + +====================================================================== + +CHANGES BETWEEN 2.1.10 and 2.1.9 + + I. IMPORTANT BUG FIXES + + - The size comparison for BDF and PCF files could fail sometimes. + + - Some CFF files were still not loaded correctly. Patch from + Derek Noonburg. + + - The stroker still had some serious bugs. + + - Boris Letocha fixed a bug in the TrueType interpreter: The + NPUSHW instruction wasn't skipped correctly in IF clauses. Some + fonts like `Helvetica 75 Bold' failed. + + - Another serious bug in handling TrueType hints caused many + distortions. It has been introduced in version 2.1.8, and it is + highly recommended to upgrade. + + - FreeType didn't properly parse empty Type 1 glyphs. + + - An unbound dynamic buffer growth was fixed in the PFR loader. + + - Several bugs have been fixed in the cache sub-system. + + - FreeType behaved incorrectly when resizing two distinct but very + close character pixel sizes through `FT_Set_Char_Size' (Savannah + bug #12263). + + - The auto-hinter didn't work properly for fonts without a Unicode + charmap -- it even refused to load the glyphs. + + + II. IMPORTANT CHANGES + + - Many fixes have been applied to drastically reduce the amount of + heap memory used by FreeType, especially when using + memory-mapped font files (which is the default on Unix systems + which support them). + + - The auto-hinter has been replaced with a new module, called the + `auto-fitter'. It consumes less memory than its predecessor, + and it is prepared to support non-latin scripts better in next + releases. + + - George Williams contributed code to read kerning data from PFM + files. + + - FreeType now uses the TT_NAME_ID_PREFERRED_FAMILY and + TT_NAME_ID_PREFERRED_SUBFAMILY strings (if available) for + setting family and style in SFNT fonts (patch from Kornfeld + Eliyahu Peter). + + - A new API `FT_Sfnt_Table_Info' (in FT_TRUETYPE_TABLES_H) has + been added to retrieve name and size information of SFNT tables. + + - A new API `FT_OpenType_Validate' (in FT_OPENTYPE_VALIDATE_H) has + been added to validate OpenType tables (BASE, GDEF, GPOS, GSUB, + JSTF). After validation it is no longer necessary to check + for errors in those tables while accessing them. + + Note that this module might be moved to another library in the + future to avoid a tight dependency between FreeType and the + OpenType specification. + + - A new API in FT_BITMAP_H (`FT_Bitmap_New', `FT_Bitmap_Convert', + `FT_Bitmap_Copy', `FT_Bitmap_Embolden', `FT_Bitmap_Done') has + been added. Its use is to convert an FT_Bitmap structure in + 1bpp, 2bpp, 4bpp, or 8bpp format into another 8bpp FT_Bitmap, + probably using a different pitch, and to further manipulate it. + + - A new API `FT_Outline_Embolden' (in FT_OUTLINE_H) gives finer + control how outlines are embolded. + + - `FT_GlyphSlot_Embolden' (in FT_SYNTHESIS_H) now handles bitmaps + also (code contributed by Chia I Wu). Note that this function + is still experimental and may be replaced with a better API. + + - The method how BDF and PCF bitmap fonts are accessed has been + refined. Formerly, FT_Set_Pixel_Sizes and FT_Set_Char_Size + were synonyms in FreeType's BDF and PCF interface. This has + changed now. FT_Set_Pixel_Sizes should be used to select the + actual font dimensions (the `strike', which is the sum of the + `FONT_ASCENT' and `FONT_DESCENT' properties), while + FT_Set_Char_Size selects the `nominal' size (the `PIXELSIZE' + property). In both functions, the width parameter is ignored. + + + III. MISCELLANEOUS + + - The BDF driver no longer converts all returned bitmaps with a + depth of 2bpp or 4bpp to a depth of 8bpp. The documentation has + not mentioned this explicitly, but implementors might have + relied on this after looking into the source files. + + - A new option `--ftversion' has been added to freetype-config to + return the FreeType version. + + - The memory debugger has been updated to dump allocation + statistics on all allocation sources in the library. This is + useful to spot greedy allocations when loading and processing + fonts. + + - We removed a huge array of constant pointers to constant strings + in the `psnames' module. The problem was that compilations in + PIC mode (i.e., when generating a Unix shared object/dll) put + the array into the non-shared writable section of the library + since absolute pointers are not relocatable by nature. + + This reduces the memory consumption by approximately 16KByte per + process linked to FreeType. We now also store the array in a + compressed form (as a trie) which saves about 20KByte of code as + well. + + - Kirill Smelkov provided patches to make src/raster/ftraster.c + compile stand-alone again. + + +====================================================================== + +CHANGES BETWEEN 2.1.9 and 2.1.8 + + I. IMPORTANT BUG FIXES + + - The function `FT_Get_CharMap_Index' was only declared, without + any real code. For consistency, it has been renamed to + `FT_Get_Charmap_Index'. (This function is needed to implement + cmap caches.) + + - `FT_Outline_Get_BBox' sometimes returned incorrect values for + conic outlines (e.g., for TrueType fonts). + + - Handling of `bhed' table has been fixed. + + - The TrueType driver with enabled byte code interpreter sometimes + returned artifacts due to incorrect rounding. This bug has been + introduced after version 2.1.4. + + - The BDF driver dropped the last glyph in the font. + + - The BDF driver now uses the DEFAULT_CHAR property (if available) + to select a glyph shape for the undefined glyph. + + - The stroker failed for closed outlines and single points. + + + II. IMPORTANT CHANGES + + - George Williams contributed code to handle Apple's font + distortion technology found in GX fonts (`avar', `cvar', `fvar', + and `gvar' tables; the Multiple Masters API has been slightly + extended to cope with the new functionality). + + - The `FT_GlyphSlotRec' structure has been extended: The elements + `lsb_delta' and `rsb_delta' give the difference between hinted + and unhinted left and right side bearings if autohinting is + active. Using those values can improve the inter-letter spacing + considerably. See the documentation of `FT_GlyphSlotRec' and + the `ftstring' demo program how to use it. + + - Loading TrueType and Type 1 fonts has been made much faster. + + - The stroker is no longer experimental (but the cache subsystem + still is). + + + III. MISCELLANEOUS + + - A new documentation file `formats.txt' describes various font + formats supported (and not supported) by FreeType. + + +====================================================================== + +CHANGES BETWEEN 2.1.8 and 2.1.7 + + I. IMPORTANT BUG FIXES + + - The native TrueType hinter contained some bugs which prevented + some fonts to be rendered correctly, most notably Legendum.otf. + + - The PostScript hinter now produces improved results. + + - The linear advance width and height values were incorrectly + rounded, making them virtually unusable if not loaded with + FT_LOAD_LINEAR_DESIGN. + + - Indexing CID-keyed CFF fonts is now working: The glyph index is + correctly treated as a CID, similar to FreeType's CID driver + module. Note that CID CMap support is still missing. + + - The FT_FACE_FLAGS_GLYPH_NAMES flag is now set correctly for all + font formats. + + - Some subsetted Type 1 fonts weren't parsed correctly. This bug + has been introduced in 2.1.7. In summary, the Type 1 parser has + become more robust. + + - Non-decimal numbers weren't parsed correctly in PS fonts. + + - The WinFNT driver now correctly reports FT_ENCODING_NONE for all + but one encoding. Use the new FT_WinFNT_ID_XXX values together + with `FT_Get_WinFNT_Header' to get the WinFNT charset ID. + + - The descender metrics (face->size->metrics.descender) for WinFNT + bitmap fonts had the wrong sign. + + - The (emulated) `seac' support for CFF fonts was broken. + + - The `flex' operator didn't work for CFF fonts. + + - PS glyphs which use the `hintmask' operator haven't been + rendered correctly in some cases. + + - Metrics for BDF and PCF bitmap font formats have been fixed. + + - Autohinting is now disabled for glyphs which are vertically + distorted or mirrored (using a transformation matrix). This + fixes a bug which produced zero-height glyphs. + + - The `freetype-config' script now handles --prefix and + --exec-prefix correctly; it also returns the proper --rpath (or + -R) value if FreeType has been built as a shared library. + + + II. IMPORTANT CHANGES + + - Both PCF and BDF drivers now handle the SETWIDTH_NAME and + ADD_STYLE_NAME properties. Values are appended to + face->style_name; example: `Bold SemiCondensed'. + + - The PCF driver now handles bitmap fonts compressed with the LZW + algorithm (extension .pcf.Z, compressed with `compress'). + + - A new API function `FT_Get_CMap_Language_ID' (declared in + `tttables.h') is available to get the language ID of a + TrueType/SFNT cmap. + + - The hexadecimal format of data after the `StartData' command in + CID-keyed Type 1 fonts is now supported. While this can't occur + in file-based fonts, it can happen in document-embedded + resources of PostScript documents. + + - Embedded bitmaps in SFNT-based CFF fonts are now supported. + + - A simple API is now available to control FreeType's tracing + mechanism if compiled with FT_DEBUG_LEVEL_TRACE. See the file + `ftdebug.h' for more details. + + - YAMATO Masatake contributed improved handling of MacOS resource + forks on non-MacOS platforms (for example, Linux can mount MacOS + file systems). + + - Support for MacOS has been improved; there is now a new function + `FT_New_Face_From_FSSpec' similar to `FT_New_Face' except that + it accepts an FSSpec instead of a path. + + - The cache sub-system has been rewritten. + + - There is now support for deinstallation of faces. + + - A new API function `FTC_Manager_RemoveFaceID' has been added + to delete all `idle' nodes that correspond to a given + FTC_FaceID. All `locked' nodes (i.e., those with a reference + count > 0), will be modified to prevent them from appearing in + further lookups (they will be cleaned normally when their + reference count reaches 0). + + - There is now support for point scaling (i.e., providing + character sizes in points + dpis, instead of pixels). + + - Three abstract cache classes are now available: + + FTC_GCache: Used to store one glyph item per cache node, + with the ability to group common attributes into + `families'. This replaces the old + FTC_GlyphCache class. + + FTC_ICache: Used to store one FT_Glyph per cache node. This + extends FTC_GCache. Family definition, family + comparison, and glyph loading are however left + to sub-classes. + + FTC_SCache: Used to store up to 16 small bitmaps per cache + node. This extends FTC_GCache. Family + definition, family comparison and glyph loading + are however left to sub-classes. + + - The file `src/cache/ftcbasic.c' implements: + + FTC_ImageCache: Extends FTC_ICache; implements family + definitions and glyph loading similar to the + old API. + + FTC_SBitCache: Extends FTC_SCache, implements family + definitions and glyph loading similar to the + old API + + Client applications should be able to extend FTC_GCache, + FTC_ICache, or FTC_SCache much more easily (i.e., less code to + write, and less callbacks). For example, one could envision + caches that are capable of storing transformed (obliqued), + stroked, emboldened, or colored glyph images. Use + `ftcbasic.c' as an example. + + - All public APIs are now in `include/freetype/ftcache.h', (to + be accessed as `FT_CACHE_H'). The contents of + `include/freetype/cache/' is only needed by applications that + wish to implement their own caches. + + - There were some major performance improvements through the use + of various programming tricks. Cache hits are up to 70% + faster than in the old code. + + - The FTC_CMapCache has been simplified. Charmaps can only be + accessed by index right now. There is also a new API named + `FT_Charmap_GetIndex' for this purpose. + + - The demo programs have been updated to the new code. The + previous versions will not work with the current one. + + - Using an invalid face index in FT_Open_Face and friends now + causes an error even if the font contains a single face only. + + + III. MISCELLANEOUS + + - Wolfgang Domröse contributed support files for building FreeType + on the Atari using the PureC compiler. Note that the Atari is a + 16bit platform. + + - Vitaliy Pasternak contributed project files for VS.NET 2003. + + +====================================================================== + +CHANGES BETWEEN 2.1.7 and 2.1.6 + + I. IMPORTANT BUG FIXES + + - Updated to newest libtool version, fixing build problems on + various platforms. + + - On Unix platforms, `make install' didn't copy the correct + `ftconfig.h' file. + + Note that version 2.1.7 contains the same library C source code as + version 2.1.6. + + +====================================================================== + +CHANGES BETWEEN 2.1.6 and 2.1.5 + + I. IMPORTANT BUG FIXES + + - The PFR font driver didn't load kerning tables correctly, and + the functions in FT_PFR_H didn't work at all. + + - Type 1 font files in binary format (PFB) with an end-of-file + indicator weren't accepted by the FreeType engine. + + - Fonts which contain /PaintType and /StrokeWidth no longer cause + a segfault. This bug has been introduced in version 2.1.5. + + - Fonts loaded with FT_LOAD_RENDER no longer cause strange + results. This bug has been introduced in version 2.1.5. + + - Some Windows (bitmap) FNT/FON files couldn't be handled + correctly. + + + II. IMPORTANT CHANGES + + - The internal module API has been heavily changed in favor of + massive simplifications within the font engine. This also means + that authors of third-party modules must adapt their code to the + new scheme. + + NOTE: THE NEW SCHEME IS NOT COMPLETED YET. PLEASE WAIT UNTIL A + FINAL ANNOUNCEMENT! + + - The PostScript parser has been enhanced to handle comments and + strings correctly. Additionally, more syntax forms are + recognized. + + - Added the optional unpatented hinting system for TrueType. It + allows typefaces which need hinting to produce correct glyph + forms (e.g., Chinese typefaces from Dynalab) to work acceptably + without infringing Apple patents. This system is compiled only + if TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING is defined in + ftoption.h (activated by default). + + + III. MISCELLANEOUS + + - There is now a guard in the public header files to protect + against inclusion of freetype.h from FreeType 1. + + - Direct inclusion of freetype.h and other public header files no + longer works. You have to use the documented scheme + + #include + #include FT_FREETYPE_H + + to load freetype.h with a symbolic name. This protects against + renaming of public header files (which shouldn't happen but + actually has, avoiding two public header files with the same + name). + + +====================================================================== + +CHANGES BETWEEN 2.1.5 and 2.1.4 + + I. IMPORTANT BUG FIXES + + - Parsing the /CIDFontName field now removes the leading slash to + be in sync with other font drivers. + + - gzip support was buggy. Some fonts could not be read. + + - Fonts which have nested subglyphs more than one level deep no + longer cause a segfault. + + - Creation of synthetic cmaps for fonts in CFF format was broken + partially. + + - Numeric font dictionary entries for synthetic fonts are no + longer overwritten. + + - The font matrix wasn't applied to the advance width for Type1, + CID, and CFF fonts. This caused problems when loading certain + synthetic Type 1 fonts like `Helvetica Narrow'. + + - The test for the charset registry in BDF and PCF fonts is now + case-insensitive. + + - FT_Vector_Rotate sometimes returned strange values due to + rounding errors. + + - The PCF driver now returns the correct number of glyphs + (including an artificial `notdef' glyph at index 0). + + - FreeType now supports buggy CMaps which are contained in many + CJK fonts from Dynalab. + + - Opening an invalid font on a Mac caused a segfault due to + double-freeing memory. + + - BDF fonts with more than 32768 glyphs weren't supported + properly. + + + II. IMPORTANT CHANGES + + - Accessing bitmap font formats has been synchronized. To do that + the FT_Bitmap_Size structure has been extended to contain new + fields `size', `x_ppem', and `y_ppem'. + + - The FNT driver now returns multiple faces, not multiple strikes. + + - The `psnames' module has been updated to the Adobe Glyph List + version 2.0. + + - The `psnames' module now understands `uXXXX[X[X]]' glyph names. + + - The algorithm for guessing the font style has been improved. + + - For fonts in SFNT format, root->height is no longer increased if + the line gap is zero. There exist fonts (containing e.g. form + drawing characters) which intentionally have a zero line gap + value. + + - ft_glyph_bbox_xxx flags are now deprecated in favour of + FT_GLYPH_BBOX_XXX. + + - ft_module_xxx flags are now deprecated in favour of + FT_MODULE_XXX. + + - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB} are now + deprecated in favour of + FT_ENCODING_{SJIS,GB2312,GIB5,WANSONG,JOHAB} -- those encodings + are not specific to Microsoft. + + + III. MISCELLANEOUS + + - The autohinter has been further improved; for example, `m' + glyphs now retain its vertical symmetry. + + - Partial support of Mac fonts on non-Mac platforms. + + - `make refdoc' (after first `make') builds the HTML + documentation. You need Python for this. + + - The make build system should now work more reliably on DOS-like + platforms. + + - Support for EMX gcc and Watson C/C++ compilers on MS-DOS has + been added. + + - Better VMS build support. + + - Support for the pkg-config package by providing a `freetype.pc' + file. + + - New configure option --with-old-mac-fonts for Darwin. + + - Some source files have been renamed (mainly to fit into the 8.3 + naming scheme). + + +====================================================================== + +CHANGES BETWEEN 2.1.4 and 2.1.3 + + I. IMPORTANT BUG FIXES + + - Updated to newest libtool version, fixing build problems on + various platforms. + + - A fix in the Gzip stream reader: It couldn't read certain .gz + files properly due to a small typo. In certain cases, FreeType + could also loop endlessly when trying to load tiny gzipped + files. + + - The configure script now tries to use the system-wide zlib when + it finds one (instead of the copy found in src/gzip). And + `freetype-config' has been updated to return relevant flags in + this case when invoked with `--libs' (e.g. `-lzlib'). + + - Certain fonts couldn't be loaded by 2.1.3 because they lacked a + Unicode charmap (e.g. SYMBOL.TTF). FreeType erroneously + rejected them. + + - The CFF loader was modified to accept fonts which only contain a + subset of their reference charset. This prevented the correct + use of PDF-embedded fonts. + + - The logic to detect Unicode charmaps has been modified. This is + required to support fonts which include both 16-bit and 32-bit + charmaps (like very recent asian ones) using the new 10 and 12 + SFNT formats. + + - The TrueType loader now limits the depth of composite glyphs. + This is necessary to prevent broken fonts to break the engine by + blowing the stack with recursive glyph definitions. + + - The CMap cache is now capable of managing UCS-4 character codes + that are mapped through extended charmaps in recent + TrueType/OpenType fonts. + + - The cache sub-system now properly manages out-of-memory + conditions instead of blindly reporting them to the caller. + This means that it will try to empty the cache before restarting + its allocations to see if that can help. + + - The PFR driver didn't return the list of available embedded + bitmaps properly. + + - There was a nasty memory leak when using embedded bitmaps in + certain font formats. + + + II. IMPORTANT CHANGES + + - David Chester contributed some enhancements to the auto-hinter + that significantly increase the quality of its output. The + Postscript hinter was also improved in several ways. + + - The FT_RENDER_MODE_LIGHT render mode was implemented. + + - A new API function called `FT_Get_BDF_Property' has been added + to FT_BDF_H to retrieve BDF properties from BDF _and_ PCF font + files. THIS IS STILL EXPERIMENTAL, since it hasn't been + properly tested yet. + + - A Windows FNT specific API has been added, mostly to access font + headers. This is used by Wine. + + - TrueType tables without an `hmtx' table are now tolerated when + an incremental interface is used. This happens for certain + Type42 fonts passed from Ghostscript to FreeType. + + - The PFR font driver is now capable of returning the font family + and style names when they are available (instead of the sole + `FontID'). This is performed by parsing an *undocumented* + portion of the font file! + + + III. MISCELLANEOUS + + - The path stroker in FT_STROKER_H has entered beta stage. It now + works very well, but its interface might change a bit in the + future. More on this in later releases. + + - The documentation for FT_Size_Metrics didn't appear properly in + the API reference. + + - The file docs/VERSION.DLL has been updated to explain versioning + with FreeType (i.e., comparing release/libtool/so numbers, and + how to use them in autoconf scripts). + + - The installation documentation has been seriously revamped. + Everything is now in the `docs' directory. + + +====================================================================== + +CHANGES BETWEEN 2.1.3 and 2.1.2 + + I. IMPORTANT BUG FIXES + + - FT_Vector_Transform had been incorrectly modified in 2.1.2, + resulting in incorrect transformations being applied (for + example, rotations were processed in opposite angles). + + - The format 8 and 12 TrueType charmap enumeration routines have + been fixed (FT_Get_Next_Char returned invalid values). + + - The PFR font driver returned incorrect advance widths if the + outline and metrics resolution defined in the font file were + different. + + - FT_Glyph_To_Bitmap now returns successfully when called with an + FT_BitmapGlyph argument (it previously returned an error). + + - A bug in the Type 1 loader that prevented valid font bounding + boxes to be loaded from multiple master fonts. + + - The SFNT validation code has been rewritten. FreeType can now + load `broken' fonts that were usable on Windows, but not with + previous versions of the library. + + - The computation of bearings in the BDF driver has been fixed. + + - The Postscript hinter crashed when trying to hint certain glyphs + (more precisely, when trying to apply hints to an empty glyph + outline). + + - The TrueType glyph loader now supports composites in `Apple + format' (they differ slightly from Microsoft/OpenType ones in + the way transformation offsets are computed). + + - FreeType was very slow at opening certain asian CID/CFF fonts, + due to fixed increment in dynamic array re-allocations. This + has been changed to exponential behaviour to get acceptable + performance. + + + + II. IMPORTANT CHANGES + + - The PCF driver now supports gzip-compressed font files natively. + This means that you will be able to use all these bitmap fonts + that come with XFree86 with FreeType (and libXft/libXft2, by + extension). + + - The automatic and postscript hinters have both been updated. + This results in a relatively important increase of rendering + quality since many nasty defaults have been suppressed. Please + visit the web page: + + http://www.freetype.org/hinting/smooth-hinting.html + + for additional details on this topic. + + - The `load_flags' parameter of `FT_Load_Glyph' is now an FT_Int32 + (instead of just being an FT_Int). This breaks source and + binary compatibility for 16bit systems only, while retaining + both of them for 32 and 64 bit ones. + + Some new flags have been added consequently: + + FT_LOAD_NO_AUTOHINT :: Disable the use of the auto-hinter + (but not native format hinters). + + FT_LOAD_TARGET_NORMAL :: Hint and render for normal + anti-aliased displays. + + FT_LOAD_TARGET_MONO :: Hint and render for 1-bit displays. + + FT_LOAD_TARGET_LCD :: Hint and render for horizontal RGB or + BGR sub-pixel displays (like LCD + screens). THIS IS STILL + EXPERIMENTAL! + + FT_LOAD_TARGET_LCD_V :: Same as FT_LOAD_TARGET_LCD, for + vertical sub-pixel displays (like + rotated LCD screens). THIS IS STILL + EXPERIMENTAL! + + FT_LOAD_MONOCHROME is still supported, but only affects + rendering, not the hinting. + + Note that the `ftview' demo program available in the `ft2demos' + package has been updated to support LCD-optimized display on + non-paletted displays (under Win32 and X11). + + - The PFR driver now supports embedded bitmaps (all formats + supported), and returns correct kerning metrics for all glyphs. + + - The TrueType charmap loader now supports certain `broken' fonts + that load under Windows without problems. + + - The cache API has been slightly modified (it's still a beta!): + + - The type FTC_ImageDesc has been removed; it is now replaced + by FTC_ImageTypeRec. Note that one of its fields is a + `load_flag' parameter for FT_Load_Glyph. + + - The field `num_grays' of FT_SBitRec has been changed to + `max_grays' in order to fit within a single byte. Its + maximum value is thus 255 (instead of 256 as previously). + + + III. MISCELLANEOUS + + - Added support for the DESTDIR variable during `make install'. + This simplifies packaging of FreeType. + + - Included modified copies of the ZLib sources in `src/gzip' in + order to support gzip-compressed PCF fonts. We do not use the + system-provided zlib for now, though this is a probable + enhancement for future releases. + + - The DocMaker tool used to generate the on-line API reference has + been completely rewritten. It is now located in + `src/tools/docmaker/docmaker.py'. Features: + + - better cross-referenced output + - more polished output + - uses Python regular expressions (though it didn't speed the + program) + - much more modular structure, which allows for different + `backends' in order to generate HTML, XML, or whatever + format. + + One can regenerate the API reference by calling: + + python src/tools/docmaker/docmaker.py \ + --prefix=ft2 \ + --title=FreeType-2.1.3 \ + --output= + include/freetype/*.h \ + include/freetype/config/*.h \ + include/freetype/cache/*.h + + - A new, experimental, support for incremental font loading (i.e., + loading of fonts where the glyphs are not in the font file + itself, but provided by an external component, like a Postscript + interpreter) has been added by Graham Asher. This is still work + in progress, however. + + - A new, EXPERIMENTAL, path stroker has been added. It doesn't + suffer from severe rounding errors and treat bezier arcs + directly. Still work in progress (i.e. not part of the official + API). See the file for some of the + details. + + - The massive re-formatting of sources and internal re-design is + still under-way. Many internal functions, constants, and types + have been renamed. + + +====================================================================== + +CHANGES BETWEEN 2.1.2 and 2.1.1 + + I. IMPORTANT BUG FIXES + + - Many font drivers didn't select a Unicode charmap by default + when a new face was opened (with the FT_CONFIG_OPTION_USE_CMAPS + options enabled), causing many applications to not be able to + display text correctly with the 2.1.x releases. + + - The PFR driver had a bug in its composite loading code that + produces incorrectly placed accents with many fonts. + + - The Type42 driver crashed sometimes due to a nasty bug. + + - The Type 1 custom encoding charmap didn't handle the case where + the first glyph index wasn't 0. + + - A serious typo in the TrueType composite loader produced + incorrectly placed glyphs in fonts like `Wingdings' and a few + others. + + + II. MISCELLANEOUS + + - The Win32 Visual C++ project file has been updated to include + the PFR driver as well. + + - `freetype.m4' is now installed by default by `make install' on + Unix systems. + + - The function FT_Get_PS_Font_Info now works with CID and Type42 + fonts as well. + + +====================================================================== + +CHANGES BETWEEN 2.1.1 and 2.1.0 + + I. IMPORTANT BUG FIXES + + - The `version_info' returned by `freetype-config' in 2.1.0 + returned an invalid value. It now returns 9:1:3 (2.0.9 returned + 9:0:3). + + - Version 2.1.0 couldn't be linked against applications on Win32 + and Amiga systems due to a new debug function that wasn't + properly propagated to the system-specific directory in + `builds'. + + - Various MacOS and Mac OS X specific fixes. + + - Fixed a bug in the TrueType charmap validation routines that + made version 2.1.0 too restrictive -- many popular fonts have + been rejected. + + - There was still a very small difference between the monochrome + glyph bitmaps produced by FreeType 1.x and FreeType 2.x with the + bytecode interpreter enabled. This was caused by an invalid + flag setting in the TrueType glyph loader, making the rasterizer + change its drop-out control mode. Now the results should + _really_ be completely identical. + + - The TrueType name table loader has been improved to support many + popular though buggy Asian fonts. It now ignores empty name + entries, invalid pointer offsets and a few other incorrect + subtleties. Moreover, name strings are now loaded on demand, + which reduces the memory load of many faces (e.g. the ARIAL.TTF + font file contains a 10kByte name table with 70 names). + + - Fixed a bug in the Postscript hinter that prevented family blues + substitution to happen correctly. + + + II. NEW FEATURES + + - Three new font drivers in this release: + + * A BDF font driver, contributed by Franco Zappa Nardelli, + heavily modified by Werner Lemberg. It also supports + anti-aliased bitmaps (using a slightly extended BDF format). + + * A Type42 font driver, contributed by Roberto Alameda. It is + still experimental but seems to work relatively well. + + * A PFR font driver, contributed by David Turner himself. It + doesn't support PFR hinting -- note that BitStream has at + least two patents on this format! + + + III. MISCELLANEOUS + + - The cache sub-system has been optimized in important ways. + Cache hits are now significantly faster. For example, using the + CMap cache is about twice faster than calling FT_Get_Char_Index + on most platforms. Similarly, using an SBit cache is about five + times faster than loading the bitmaps from a bitmap file, and + 300 to 500 times faster than generating them from a scalable + format. + + Note that you should recompile your sources if you designed a + custom cache class for the FT2 Cache subsystem, since the + changes performed are source, but not binary, compatible. + + +====================================================================== + +CHANGES BETWEEN 2.1.0 and 2.0.9 + + I. IMPORTANT BUG FIXES + + - The TrueType bytecode interpreter has been fixed to produce + _exactly_ the same output as FreeType 1.x. Previous differences + were due to slightly distinct fixed-point computation routines + used to perform dot products and vector length measurements. + + It seems that native TrueType hinting is _extremely_ sensitive + to rounding errors. The required vector computation routines + have been optimized and placed within the `ttinterp.c' file. + + - Fixed the parsing of accelerator tables in the PCF font driver. + + - Fixed the Type1 glyph loader routine used to compute the font's + maximum advance width. + + + II. NEW FEATURES + + - The `configure' script used on Unix systems has been modified to + check that GNU Make is being used to build the library. + Otherwise, it will display a message proposing to use the + GNUMAKE environment variable to name it. + + The Unix-specific file README.UNX has been modified accordingly. + + + III. MISCELLANEOUS + + - The FreeType License in `docs/FTL.TXT' has been updated to + include a proposed preferred disclaimer. If you are using + FreeType in your products, you are encouraged (but not mandated) + to use the following text in your documentation: + + """ + Portions of this software are copyright © 1996-2002 The + FreeType Project (www.freetype.org). All rights reserved. + """ + + - The default size of the render pool has been reduced to 16kByte. + This shouldn't result in any noticeable performance penalty, + unless you are using the engine as-is to render very large and + complex glyphs. + + - The FreeType 2 redesign has begun. More information can be + found at this URL: + + http://www.freetype.org/freetype2/redesign.html + + The following internal changes have been performed within the + sources of this release: + + - Many internal types have been renamed to increase + consistency. The following should be true, except for + public types: + + * All structure types have a name ending in `Rec' (short + for `record'). + + * A pointer-to-structure type has the same name as the + structure, _without_ the `Rec' suffix. + + Example: + + typedef struct FooRec_ + { + ... + + } FooRec, *Foo; + + - Many internal macros have been renamed to increase + consistency. The following should be true: + + * All macros have a name beginning with `FT_'. This + required a few changes like + + ALLOC => FT_ALLOC + FREE => FT_FREE + REALLOC => FT_REALLOC + + * All macros are completely UPPERCASE. This required a + few changes like: + + READ_Short => FT_READ_SHORT + NEXT_Short => FT_NEXT_SHORT + GET_ULongLE => FT_GET_ULONG_LE + MEM_Set => FT_MEM_SET + MEM_Copy => FT_MEM_COPY + etc. + + * Whenever possible, all macro names follow the + FT__ pattern. For example + + ACCESS_Frame => FT_FRAME_ENTER + FORGET_Frame => FT_FRAME_EXIT + EXTRACT_Frame => FT_FRAME_EXTRACT + RELEASE_Frame => FT_FRAME_RELEASE + + FILE_Pos => FT_STREAM_POS + FILE_Seek => FT_STREAM_SEEK + FILE_Read => FT_STREAM_READ + FILE_ReadAt => FT_STREAM_READ_AT + READ_Fields => FT_STREAM_READ_FIELDS + + - Many internal functions have been renamed to follow the + FT__ pattern. For example: + + FT_Seek_Stream => FT_Stream_Seek + FT_Read_Stream_At => FT_Stream_ReadAt + FT_Done_Stream => FT_Stream_Close + FT_New_Stream => FT_Stream_Open + FT_New_Memory_Stream => FT_Stream_OpenMemory + FT_Extract_Frame => FT_Stream_ExtractFrame + + Note that method names do not contain `_'. + + - The FT_ALLOC_ARRAY and FT_REALLOC_ARRAY have been replaced + with FT_NEW_ARRAY and FT_RENEW_ARRAY which do not take a + type as the fourth argument. Instead, the array element + type size is computed automatically from the type of the + target pointer used. + + - A new object class, FT_CMap, has been introduced. These + internal objects are used to model character maps. This + eases the support of additional charmap types within the + engine. + + - A new configuration file named `ftstdlib.h' has been added + to `include/freetype/config'. It is used to define aliases + for _every_ routine of the ISO C library that the font + engine uses. Each aliases has a `ft_' prefix + (e.g. `ft_strlen' is an alias for `strlen'). + + This is used to ease the porting of FreeType 2 to exotic + runtime environments where the ISO C Library isn't available + (e.g. XFree86 extension modules). + + More details are available in the `ChangeLog' file. + + +====================================================================== + +CHANGES BETWEEN 2.0.9 and 2.0.8 + + I. IMPORTANT BUG FIXES + + - Certain fonts like `foxjump.ttf' contain broken name tables with + invalid entries and wild offsets. This caused FreeType to crash + when trying to load them. + + The SFNT `name' table loader has been fixed to be able to + support these strange fonts. + + Moreover, the code in charge of processing this table has been + changed to always favour Windows-formatted entries over other + ones. Hence, a font that works on Windows but not on the Mac + will load cleanly in FreeType and report accurate values for + Family & PostScript names. + + - The CID font driver has been fixed. It unfortunately returned a + Postscript Font name with a leading slash, as in + `/MunhwaGothic-Regular'. + + - FreeType 2 should now compile fine on AIX 4.3.3 as a shared + library. + + - A bug in the Postscript hinter has been found and fixed, + removing un-even stem widths at small pixel sizes (like 14-17). + + This improves the quality of a certain number of Postscript + fonts. + + + II. NEW FEATURES + + - A new function named `FT_Library_Version' has been added to + return the current library's major, minor, and patch version + numbers. This is important since the macros FREETYPE_MAJOR, + FREETYPE_MINOR, and FREETYPE_PATCH cannot be used when the + library is dynamically linked by a program. + + - Two new APIs have been added: `FT_Get_First_Char' and + `FT_Get_Next_Char'. + + Together, these can be used to iterate efficiently over the + currently selected charmap of a given face. Read the API + reference for more details. + + + III. MISCELLANEOUS + + - The FreeType sources are under heavy internal re-factoring. As + a consequence, we have created a branch named `STABLE' on the + CVS to hold all future releases/fixes in the 2.0.x family. + + The HEAD branch now contains the re-factored sources and + shouldn't be used for testing or packaging new releases. In + case you would like to access the 2.0.9 sources from our CVS + repository, use the tag `VER-2-0-9'. + + +====================================================================== + +CHANGES BETWEEN 2.0.8 and 2.0.7 + + I. IMPORTANT BUG FIXES + + - There was a small but nasty bug in `freetype-config.in' which + caused the `freetype-config' script to fail on Unix. + + This didn't prevent the installation of the library or even its + execution, but caused problems when trying to compile many Unix + packages that depend on it. + + - Some TrueType or OpenType fonts embedded in PDF documents do not + have a 'cmap', 'post' and 'name' as is required by the + specification. FreeType no longer refuses to load such fonts. + + - Various fixes to the PCF font driver. + + +====================================================================== + +CHANGES BETWEEN 2.0.7 and 2.0.6 + + I. IMPORTANT BUG FIXES + + - Fixed two bugs in the Type 1 font driver. The first one + resulted in a memory leak in subtle cases. The other one caused + FreeType to crash when trying to load `.gsf' files (Ghostscript + so-called Postscript fonts). + + (This made _many_ KDE applications crash on certain systems. + FreeType _is_ becoming a critical system component on Linux :-) + + - Fixed a memory leak in the CFF font driver. + + - Fixed a memory leak in the PCF font driver. + + - Fixed the Visual C++ project file + `builds/win32/visualc/freetype.dsp' since it didn't include the + Postscript hinter component, causing errors at build time. + + - Fixed a small rendering bug in the anti-aliased renderer that + only occurred when trying to draw thin (less than 1 pixel) + strokes. + + - Fixed `builds/unix/freetype2.a4' which is used to generate a + valid `freetype2.m4' for use with autoconf. + + - Fixed the OpenVMS Makefiles. + + + II. MISCELLANEOUS + + - Added `configure' and `install' scripts to the top-level + directory. A GNU-style installation is thus now easily possible + with + + ./configure + make + make install + + +====================================================================== + +CHANGES BETWEEN 2.0.6 and 2.0.5 + + I. IMPORTANT BUG FIXES + + - It wasn't possible to load embedded bitmaps when the auto-hinter + was used. This is now fixed. + + - The TrueType font driver didn't load some composites properly + (the sub-glyphs were slightly shifted, and this was only + noticeable when using monochrome rendering). + + - Various fixes to the auto-hinter. They merely improve the + output of sans-serif fonts. Note that there are still problems + with serifed fonts and composites (accented characters). + + - All scalable font drivers erroneously returned un-fitted glyph + advances when hinting was requested. This created problems for + a number of layout applications. This is a very old bug that + got undetected mainly because most test/demo program perform + rounding explicitly or implicitly (through the cache). + + - `FT_Glyph_To_Bitmap' did erroneously modify the source glyph in + certain cases. + + - `glnames.py' still contained a bug that made FreeType return + invalid names for certain glyphs. + + - The library crashed when loading certain Type 1 fonts like + `sadn.pfb' (`Stalingrad Normal'), which appear to contain + pathetic font info dictionaries. + + - The TrueType glyph loader is now much more paranoid and checks + everything when loading a given glyph image. This was necessary + to avoid problems (crashes and/or memory overwrites) with broken + fonts that came from a really buggy automatic font converter. + + + II. IMPORTANT UPDATES AND NEW FEATURES + + - Important updates to the Mac-specific parts of the library. + + - The caching sub-system has been completely re-designed, and its + API has evolved (the old one is still supported for backward + compatibility). + + The documentation for it is not yet completed, sorry. For now, + you are encouraged to continue using the old API. However, the + ftview demo program in the ft2demos package has already been + updated to use the new caching functions. + + - A new charmap cache is provided too. See `FTC_CMapCache'. This + is useful to perform character code -> glyph index translations + quickly, without the need for an opened FT_Face. + + - A NEW POSTSCRIPT HINTER module has been added to support native + hints in the following formats: PostScript Type 1, PostScript + CID, and CFF/CEF. + + Please test! Note that the auto-hinter produces better results + for a number of badly-hinted fonts (mostly auto-generated ones) + though. + + - A memory debugger is now part of the standard FreeType sources. + To enable it, define FT_DEBUG_MEMORY in + , and recompile the library. + + Additionally, define the _environment_ variable FT_DEBUG_MEMORY + and run any program using FreeType. When the library is exited, + a summary of memory footprints and possible leaks will be + displayed. + + This works transparently with _any_ program that uses FreeType. + However, you will need a lot of memory to use this (allocated + blocks are never released to the heap to detect double deletes + easily). + + + III. MISCELLANEOUS + + - We are aware of subtle differences between the output of + FreeType versions 1 and 2 when it comes to monochrome + TrueType-hinted glyphs. These are most probably due to small + differences in the monochrome rasterizers and will be worked out + in an upcoming release. + + - We have decided to fork the sources in a `stable' branch, and an + `unstable' one, since FreeType is becoming a critical component + of many Unix systems. + + The next bug-fix releases of the library will be named 2.0.7, + 2.0.8, etc., while the `2.1' branch will contain a version of + the sources where we will start major reworking of the library's + internals, in order to produce FreeType 2.2.0 (or even 3.0) in a + more distant future. + + We also hope that this scheme will allow much more frequent + releases than in the past. + + +====================================================================== + +CHANGES BETWEEN 2.0.5 and 2.0.4 + + NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER. THIS MODULE + WILL BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1) + + - Fixed a bug that made certain glyphs, like `Cacute', `cacute' and + `lslash' unavailable from Unicode charmaps of Postscript fonts. + This prevented the correct display of Polish text, for example. + + - The kerning table of Type 1 fonts was loaded by FreeType, when its + AFM file was attached to its face, but the + FT_FACE_FLAG_HAS_KERNING bit flags was not set correctly, + preventing FT_Get_Kerning to return meaningful values. + + - Improved SFNT (TrueType & OpenType) charmap support. Slightly + better performance, as well as support for the new formats defined + by the OpenType 1.3 specification (8, 10, and 12) + + - Fixed a serious typo in `src/base/ftcalc.c' which caused invalid + computations in certain rare cases, producing ugly artefacts. + + - The size of the EM square is computed with a more accurate + algorithm for Postscript fonts. The old one caused slight errors + with embedded fonts found in PDF documents. + + - Fixed a bug in the cache manager that prevented normal LRU + behaviour within the cache manager, causing unnecessary reloads + (for FT_Face and FT_Size objects only). + + - Added a new function named `FT_Get_Name_Index' to retrieve the + glyph index of a given glyph name, when found in a face. + + - Added a new function named `FT_Get_Postscript_Name' to retrieve + the `unique' Postscript font name of a given face. + + - Added a new public header size named FT_SIZES_H (or + ) providing new FT_Size-management functions: + FT_New_Size, FT_Activate_Size, FT_Done_Size. + + - Fixed a reallocation bug that generated a dangling pointer (and + possibly memory leaks) with Postscript fonts (in + src/psaux/psobjs.c). + + - Many fixes for 16-bit correctness. + + - Removed many pedantic compiler warnings from the sources. + + - Added an Amiga build directory in `builds/amiga'. + + +====================================================================== + +CHANGES BETWEEN 2.0.4 and 2.0.3 + + - Fixed a rather annoying bug that was introduced in 2.0.3. Namely, + the font transformation set through FT_Set_Transform was applied + twice to auto-hinted glyphs, resulting in incorrectly rotated text + output. + + - Fixed _many_ compiler warnings. FT2 should now compile cleanly + with Visual C++'s most pedantic warning level (/W4). It already + compiled fine with GCC and a few other compilers. + + - Fixed a bug that prevented the linear advance width of composite + TrueType glyphs to be correctly returned. + + - Fixed the Visual C++ project files located in + `builds/win32/visualc' (previous versions used older names of the + library). + + - Many 32-bit constants have an `L' appended to their value, in + order to improve the 16-bitness of the code. Someone is actually + trying to use FT2 on an Atari ST machine! + + - Updated the `builds/detect.mk' file in order to automatically + build FT2 on AIX systems. AIX uses `/usr/sbin/init' instead of + `/sbin/init' and wasn't previously detected as a Unix platform by + the FreeType build system. + + - Updated the Unix-specific portions of the build system (new + libtool version, etc.). + + - The SFNT kerning loader now ensures that the table is sorted + (since some problem fonts do not meet this requirement). + + +======================================================================= + +CHANGES BETWEEN 2.0.3 and 2.0.2 + + I. CHANGES TO THE MODULES / FONT DRIVERS + + - THE AUTO-HINTER HAS BEEN SLIGHTLY IMPROVED, in order to fix + several annoying artefacts, mainly: + + - Blue zone alignment of horizontal stems wasn't performed + correctly, resulting in artefacts like the `d' being placed + one pixel below the `b' in some fonts like Time New Roman. + + - Overshoot thresholding wasn't performed correctly, creating + unpleasant artefacts at large character pixel sizes. + + - Composite glyph loading has been simplified. This gets rid + of various artefacts where the components of a composite + glyphs were not correctly spaced. + + These are the last changes to the current auto-hinting module. + A new hinting sub-system is currently in the work in order to + support native hints in Type 1 / CFF / OpenType fonts, as well + as globally improve rendering. + + - The PCF driver has been fixed. It reported invalid glyph + dimensions for the fonts available on Solaris. + + - The Type 1, CID and CFF drivers have been modified to fix the + computation of the EM size. + + - The Type 1 driver has been fixed to avoid a dangerous bug that + crashed the library with non-conforming fonts (i.e. ones that do + not place the .notdef glyph at position 0). + + - The TrueType driver had a rather subtle bug (dangling pointer + when loading composite glyphs) that could crash the library in + rare occasions! + + + II. HIGH-LEVEL API CHANGES + + - The error code enumeration values have been changed. An error + value is decomposed in a generic error code, and a module + number. see for details. + + - A new public header file has been introduced, named + FT_TRIGONOMETRY_H (include/freetype/fttrig.h), providing + trigonometric functions to compute sines, cosines, arctangents, + etc. with 16.16 fixed precision. The implementation is based on + the CORDIC algorithm and is very fast while being sufficiently + accurate. + + + III. INTERNALS + + - Added BeOS-specific files in the old build sub-system. Note + that no changes were required to compile the library with Jam. + + - The configuration is now capable of automatically detecting + 64-bit integers on a set of predefined compilers (GCC, Visual + C++, Borland C++) and will use them by default. This provides a + small performance boost. + + - A small memory leak that happened when opening 0-sized files + (duh!) have been fixed. + + - Fixed bezier stack depth bug in the routines provided by the + FT_BBOX_H header file. Also fixed similar bugs in the + rasterizers. + + - The outline bounding box code has been rewritten to use direct + computations, instead of bezier sub-division, to compute the + exact bounding box of glyphs. This is slightly slower but more + accurate. + + - The build system has been improved and fixed, mainly to support + `make' on Windows 2000 correctly, avoid problems with `make + distclean' on non Unix systems, etc. + + - Hexadecimal constants have been suffixed with `U' to avoid + problems with certain compilers on 64-bit platforms. + + - A new directory named `src/tools' has been created. It contains + Python scripts and simple unit test programs used to develop the + library. + + - The DocMaker tool has been moved from `docs' to `src/tools' and + has been updated with the following: + + - Now accepts the `--title=XXXX' or `-t XXXX' option from the + command line to set the project's name in the generated API + reference. + + - Now accepts the `--output=DIR' or `-o DIR' option from the + command line to set the output directory for all generated + HTML files. + + - Now accepts the `--prefix=XXXX' or `-p XXX' option from the + command line to set the file prefix to use for all + generated HTML files. + + - Now generates the current time/data on each generated page + in order to distinguish between versions. + + DocMaker can be used with other projects now, not only FT2 + (e.g. MLib, FTLayout, etc.). + + +====================================================================== + +CHANGES BETWEEN 2.0.2 and 2.0.1 + + I. CHANGES TO THE MODULES / FONT DRIVERS + + - THE TRUETYPE BYTECODE INTERPRETER IS NOW TURNED OFF, in order to + avoid legal problems with the Apple patents. It seems that we + mistakenly turned this option on in previous releases of the + build. + + Note that if you want to use the bytecode interpreter in order + to get high-quality TrueType rendering, you will need to toggle + by hand the definition of the + TT_CONFIG_OPTION_BYTECODE_INTERPRETER macro in the file + `include/freetype/config/ftoption.h'. + + - The CFF driver has been improved by Tom Kacvinsky and Sander van + der Wal: + + * Support for `seac' emulation. + * Support for `dotsection'. + * Support for retrieving glyph names through + `FT_Get_Glyph_Name'. + + The first two items are necessary to correctly a large number of + Type 1 fonts converted to the CFF formats by Adobe Acrobat. + + - The Type 1 driver was also improved by Tom & others: + + * Better EM size computation. + * Better support for synthetic (transformed) fonts. + * The Type 1 driver returns the charstrings corresponding to + each glyph in the `glyph->control_data' field after a call to + `FT_Load_Glyph' (thanks Ha Shao). + + - Various other bugfixes, including the following: + + * Fixed a nasty memory leak in the Type 1 driver. + * The autohinter and the pcf driver used static writable data + when they shouldn't. + * Many casts were added to make the code more 64-bits safe. It + also now compiles on Windows XP 64-bits without warnings. + * Some incorrect writable statics were removed in the `autohint' + and `pcf' drivers. FreeType 2 now compiles on Epoc again. + + + II. CHANGES TO THE HIGH-LEVEL API + + - The library header files inclusion scheme has been changed. The + old scheme looked like: + + #include + #include + #include + #include + + Now you should use: + + #include + #include FT_FREETYPE_H + #include FT_GLYPH_H + #include FT_CACHE_H + #include FT_CACHE_IMAGE_H + + NOTE THAT THE OLD INCLUSION SCHEME WILL STILL WORK WITH THIS + RELEASE. HOWEVER, WE DO NOT GUARANTEE THAT THIS WILL STILL BE + TRUE IN THE NEXT ONE (A.K.A. FREETYPE 2.1). + + The file is used to define the header filename + macros. The complete and commented list of macros is available + in the API reference under the section name `Header File Macros' + in Chapter I. + + For more information, see section I of the following document: + + http://www.freetype.org/ + freetype2/docs/tutorial/step1.html + + or + + http://freetype.sourceforge.net/ + freetype2/docs/tutorial/step1.html + + - Many, many comments have been added to the public source file in + order to automatically generate the API Reference through the + `docmaker.py' Python script. + + The latter has been updated to support the grouping of sections + in chapters and better index sort. See: + + http://www.freetype.org/freetype2/docs/reference/ft2-toc.html + + + III. CHANGES TO THE BUILD PROCESS + + - If you are not building FreeType 2 with its own build system + (but with your own Makefiles or project files), you will need to + be aware that the build process has changed a little bit. + + You don't need to put the `src' directory in the include path + when compiling any FT2 component. Instead, simply put the + component's directory in the current include path. + + So, if you were doing something like: + + cc -c -Iinclude -Isrc src/base/ftbase.c + + change the line to: + + cc -c -Iinclude -Isrc/base src/base/ftbase.c + + If you were doing something like: + + cd src/base + cc -c -I../../include -I.. ftbase.c + + change it to: + + cd src/base + cc -c -I../../include ftbase.c + + +====================================================================== + +CHANGES BETWEEN 2.0.1 and 2.0 + + 2.0.1 introduces a few changes: + + - Fixed many bugs related to the support of CFF / OpenType fonts. + These formats are now much better supported though there is + still work planned to deal with charset tables and PDF-embedded + CFF files that use the old `seac' command. + + - The library could not be compiled in debug mode with a very + small number of C compilers whose pre-processors didn't + implement the `##' directive correctly (i.e. per se the ANSI C + specification!) An elegant fix was found. + + - Added support for the free Borland command-line C++ Builder + compiler. Use `make setup bcc32'. Also fixed a few source + lines that generated new warnings with BCC32. + + - Fixed a bug in FT_Outline_Get_BBox when computing the extrema of + a conic Bezier arc. + + - Updated the INSTALL file to add IDE compilation. + + - Other minor bug fixes, from invalid Type 1 style flags to + correct support of synthetic (obliqued) fonts in the + auto-hinter, better support for embedded bitmaps in a SFNT font. + + - Fixed some problems with `freetype-config'. + + Finally, the `standard' scheme for including FreeType headers is now + gradually changing, but this will be explained in a later release + (probably 2.0.2). + + And very special thanks to Tom Kacvinsky and YAMANO-UCHI Hidetoshi + for their contributions! + + +====================================================================== + +CHANGES BETWEEN beta8 and 2.0 + + - Changed the default installation path for public headers from + `include/freetype' to `include/freetype2'. + + Also added a new `freetype-config' that is automatically generated + and installed on Unix and Cygwin systems. The script itself is + used to retrieve the current install path, C compilation flags as + well as linker flags. + + - Fixed several small bugs: + + * Incorrect max advance width for fixed-pitch Type 1 fonts. + * Incorrect glyph names for certain TrueType fonts. + * The glyph advance was not copied when FT_Glyph_To_Bitmap was + called. + * The linearHoriAdvance and linearVertAdvance fields were not + correctly returned for glyphs processed by the auto-hinter. + * `type1z' renamed back to `type1'; the old `type1' module has + been removed. + + - Revamped the build system to make it a lot more generic. This + will allow us to re-use nearly un-modified in lots of other + projects (including FreeType Layout). + + - Changed `cid' to use `psaux' too. + + - Added the cache sub-system. See as well as + the sources in `src/cache'. Note that it compiles but is still + untested for now. + + - Updated `docs/docmaker.py', a draft API reference is available at + http://www.freetype.org/ft2api.html. + + - Changed `type1' to use `psaux'. + + - Created a new module named `psaux' to hold the Type 1 & Type 2 + parsing routines. It should be used by `type1', `cid', and `cff' + in the future. + + - Fixed an important bug in `FT_Glyph_Get_CBox'. + + - Fixed some compiler warnings that happened since the TrueType + bytecode decoder was deactivated by default. + + - Fixed two memory leaks: + + * The memory manager (16 bytes) isn't released in + FT_Done_FreeType! + * Using custom input streams, the copy of the original stream was + never released. + + - Fixed the auto-hinter by performing automatic computation of the + `filling direction' of each glyph. This is done through a simple + and fast approximation, and seems to work (problems spotted by + Werner though). The Arphic fonts are a lot nicer though there are + still a lot of things to do to handle Asian fonts correctly. + + +====================================================================== + +BETA-8 (RELEASE CANDIDATE) CHANGES + + - Deactivated the TrueType bytecode interpreter by default. + + - Deactivated the `src/type1' font driver. Now `src/type1z' is used + by default. + + - Updates to the build system. We now compile the library correctly + under Unix system through `configure' which is automatically + called on the first `make' invocation. + + - Added the auto-hinting module! Fixing some bugs here and there. + + - Found some bugs in the composite loader (seac) of the Type1-based + font drivers. + + - Renamed the directory `freetype2/config' to `freetype2/builds' and + updated all relevant files. + + - Found a memory leak in the `type1' driver. + + - Incorporated Tom's patches to support flex operators correctly in + OpenType/CFF fonts. Now all I need is to support pure CFF and CEF + fonts to be done with this driver :-) + + - Added the Windows FNT/FON driver in `src/winfonts'. For now, it + always `simulates' a Unicode charmap, so it shouldn't be + considered completed right now. + + It is there to be more a proof of concept than anything else + anyway. The driver is a single C source file, that compiles to 3 + Kb of code. + + I'm still working on the PCF/BDF drivers, but I'm too lazy to + finish them now. + + - CHANGES TO THE HIGH-LEVEL API + + * FT_Get_Kerning has a new parameter that allows you to select the + coordinates of the kerning vector (font units, scaled, scaled + + grid-fitted). + * The outline functions are now in and not + part of anymore. + * now contains declarations for + FT_New_Library, FT_Done_Library, FT_Add_Default_Modules. + * The so-called convenience functions have moved from `ftoutln.c' + to `ftglyph.c', and are thus available with this optional + component of the library. They are declared in + now. + * Anti-aliased rendering is now the default for FT_Render_Glyph + (i.e. corresponds to render_mode == 0 == ft_render_mode_normal). + To generate a monochrome bitmap, use ft_render_mode_mono, or the + FT_LOAD_MONOCHROME flag in FT_Load_Glyph/FT_Load_Char. + FT_LOAD_ANTI_ALIAS is still defined, but values to 0. + * now include , + solving a few headaches :-) + * The type FT_GlyphSlotRec has now a `library' field. + + - CHANGES TO THE `ftglyph.h' API + + This API has been severely modified in order to make it simpler, + clearer, and more efficient. It certainly now looks like a real + `glyph factory' object, and allows client applications to manage + (i.e. transform, bbox and render) glyph images without ever + knowing their original format. + + - Added support for CID-keyed fonts to the CFF driver. Maybe + support for pure CFF + CEF fonts should come in? + + - Cleaned up source code in order to avoid two functions with the + same name. Also changed the names of the files in `type1z' from + `t1XXXX' to `z1XXXX' in order to avoid any conflicts. + + `make multi' now works well :-) + + Also removed the use of `cidafm' for now, even if the source files + are still there. This functionality will certainly go into a + specific module. + + - ADDED SUPPORT FOR THE AUTO-HINTER + + It works :-) I have a demo program which simply is a copy of + `ftview' that does a `FT_Add_Module(library, + &autohinter_module_class)' after library initialization, and Type + 1 & OpenType/CFF fonts are now hinted. + + CID fonts are not hinted, as they include no charmap and the + auto-hinter doesn't include `generic' global metrics computations + yet. + + Now, I need to release this thing to the FreeType 2 source. + + - CHANGES TO THE RENDERER MODULES + + The monochrome and smooth renderers are now in two distinct + directories, namely `src/raster1' and `src/smooth'. Note that the + old `src/renderer' is now gone. + + I ditched the 5-gray-levels renderers. Basically, it involved a + simple #define toggle in 'src/raster1/ftraster.c'. + + FT_Render_Glyph, FT_Outline_Render & FT_Outline_Get_Bitmap now + select the best renderer available, depending on render mode. If + the current renderer for a given glyph image format isn't capable + of supporting the render mode, another one will be found in the + library's list. This means that client applications do not need + to switch or set the renderers themselves (as in the latest + change), they'll get what they want automatically. At last. + + Changed the demo programs accordingly. + + - MAJOR INTERNAL REDESIGN: + + A lot of internal modifications have been performed lately on the + source in order to provide the following enhancements: + + * More generic module support: + + The FT_Module type is now defined to represent a handle to a + given module. The file contains the + FT_Module_Class definition, as well as the module-loading public + API. + + The FT_Driver type is still defined, and still represents a + pointer to a font driver. Note that FT_Add_Driver is replaced + by FT_Add_Module, FT_Get_Driver by FT_Get_Module, etc. + + * Support for generic glyph image types: + + The FT_Renderer type is a pointer to a module used to perform + various operations on glyph image. + + Each renderer is capable of handling images in a single format + (e.g. ft_glyph_format_outline). Its functions are used to: + + - transform an glyph image + - render a glyph image into a bitmap + - return the control box (dimensions) of a given glyph image + + The scan converters `ftraster.c' and `ftgrays.c' have been moved + to the new directory `src/renderer', and are used to provide two + default renderer modules. + + One corresponds to the `standard' scan-converter, the other to + the `smooth' one. + + he current renderer can be set through the new function + FT_Set_Renderer. + + The old raster-related function FT_Set_Raster, FT_Get_Raster and + FT_Set_Raster_Mode have now disappeared, in favor of the new: + + FT_Get_Renderer + FT_Set_Renderer + + See the file for more details. + + These changes were necessary to properly support different + scalable formats in the future, like bi-color glyphs, etc. + + * Glyph loader object: + + A new internal object, called a 'glyph loader' has been + introduced in the base layer. It is used by all scalable format + font drivers to load glyphs and composites. + + This object has been created to reduce the code size of each + driver, as each one of them basically re-implemented its + functionality. + + See and the FT_GlyphLoader type for + more information. + + * FT_GlyphSlot has new fields: + + In order to support extended features (see below), the + FT_GlyphSlot structure has a few new fields: + + linearHoriAdvance: + + This field gives the linearly scaled (i.e. scaled but + unhinted) advance width for the glyph, expressed as a 16.16 + fixed pixel value. This is useful to perform WYSIWYG text. + + linearVertAdvance: + This field gives the linearly scaled advance height for the + glyph (relevant in vertical glyph layouts only). This is + useful to perform WYSIWYG text. + + Note that the two above field replace the removed `metrics2' + field in the glyph slot. + + advance: + This field is a vector that gives the transformed advance for + the glyph. By default, it corresponds to the advance width, + unless FT_LOAD_VERTICAL_LAYOUT was specified when calling + FT_Load_Glyph or FT_Load_Char. + + bitmap_left: + This field gives the distance in integer pixels from the + current pen position to the left-most pixel of a glyph image + IF IT IS A BITMAP. It is only valid when the `format' field + is set to `ft_glyph_format_bitmap', for example, after calling + the new function FT_Render_Glyph. + + bitmap_top: + This field gives the distance in integer pixels from the + current pen position (located on the baseline) to the top-most + pixel of the glyph image IF IT IS A BITMAP. Positive values + correspond to upwards Y. + + loader: + This is a new private field for the glyph slot. Client + applications should not touch it. + + + * Support for transforms and direct rendering in FT_Load_Glyph: + + Most of the functionality found in has been + moved to the core library. Hence, the following: + + - A transform can be specified for a face through + FT_Set_Transform. this transform is applied by FT_Load_Glyph + to scalable glyph images (i.e. NOT TO BITMAPS) before the + function returns, unless the bit flag FT_LOAD_IGNORE_TRANSFORM + was set in the load flags. + + - Once a glyph image has been loaded, it can be directly + converted to a bitmap by using the new FT_Render_Glyph + function. Note that this function takes the glyph image from + the glyph slot, and converts it to a bitmap whose properties + are returned in `face.glyph.bitmap', `face.glyph.bitmap_left' + and `face.glyph.bitmap_top'. The original native image might + be lost after the conversion. + + - When using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph + and FT_Load_Char functions will call FT_Render_Glyph + automatically when needed. + + - Reformatted all modules source code in order to get rid of the + basic data types redifinitions (i.e. `TT_Int' instead of `FT_Int', + `T1_Fixed' instead of `FT_Fixed'). Hence the format-specific + prefixes like `TT_', `T1_', `T2_' and `CID_' are only used for + relevant structures. + + +====================================================================== + +OLD CHANGES FOR BETA 7 + + - bug-fixed the OpenType/CFF parser. It now loads and displays my + two fonts nicely, but I'm pretty certain that more testing is + needed :-) + + - fixed the crummy Type 1 hinter, it now handles accented characters + correctly (well, the accent is not always well placed, but that's + another problem..) + + - added the CID-keyed Type 1 driver in `src/cid'. Works pretty well + for only 13 Kb of code ;-) Doesn't read AFM files though, nor the + really useful CMAP files.. + + - fixed two bugs in the smooth renderer (src/base/ftgrays.c). + Thanks to Boris Letocha for spotting them and providing a fix. + + - fixed potential `divide by zero' bugs in ftcalc.c. + + - added source code for the OpenType/CFF driver (still incomplete + though..) + + - modified the SFNT driver slightly to perform more robust header + checks in TT_Load_SFNT_Header. This prevents certain font files + (e.g. some Type 1 Multiple Masters) from being incorrectly + `recognized' as TrueType font files.. + + - moved a lot of stuff from the TrueType driver to the SFNT module, + this allows greater code re-use between font drivers + (e.g. TrueType, OpenType, Compact-TrueType, etc..) + + - added a tiny segment cache to the SFNT Charmap 4 decoder, in order + to minimally speed it up.. + + - added support for Multiple Master fonts in `type1z'. There is + also a new file named which defines functions to + manage them from client applications. + + The new file `src/base/ftmm.c' is also optional to the engine.. + + - various formatting changes (e.g. EXPORT_DEF -> FT_EXPORT_DEF) + + small bug fixes in FT_Load_Glyph, the `type1' driver, etc.. + + - a minor fix to the Type 1 driver to let them apply the font matrix + correctly (used for many oblique fonts..) + + - some fixes for 64-bit systems (mainly changing some FT_TRACE calls + to use %p instead of %lx). Thanks to Karl Robillard. + + - fixed some bugs in the sbit loader (src/base/sfnt/ttsbit.c) + + added a new flag, FT_LOAD_CROP_BITMAP to query that bitmaps be + cropped when loaded from a file (maybe I should move the bitmap + cropper to the base layer ??). + + - changed the default number of gray levels of the smooth renderer + to 256 (instead of the previous 128). Of course, the human eye + can't see any difference ;-) + + - removed TT_MAX_SUBGLYPHS, there is no static limit on the number + of subglyphs in a TrueType font now.. + + +====================================================================== + +OLD CHANGES 16 May 2000 + + - tagged `BETA-6' in the CVS tree. This one is a serious release + candidate even though it doesn't incorporate the auto-hinter yet.. + + - various obsolete files were removed, and copyright header updated + + - finally updated the standard raster to fix the monochrome + rendering bug + re-enable support for 5-gray levels anti-aliasing + (suck, suck..) + + - created new header files, and modified sources accordingly: + + + - simple FreeType types, without the API + + - definition of memory-management macros + + - added the `DSIG' (OpenType Digital Signature) tag to + + + - light update/cleaning of the build system + changes to the sources + in order to get rid of _all_ compiler warnings with three + compilers, i.e: + + gcc with `-ansi -pedantic -Wall -W', Visual C++ with `/W3 /WX' and + LCC + + IMPORTANT NOTE FOR WIN32-LCC USERS: + | + | It seems the C pre-processor that comes with LCC is broken, it + | doesn't recognize the ANSI standard directives # and ## + | correctly when one of the argument is a macro. Also, + | something like: + | + | #define F(x) print##x + | + | F(("hello")) + | + | will get incorrectly translated to: + | + | print "hello") + | + | by its pre-processor. For this reason, you simply cannot build + | FreeType 2 in debug mode with this compiler.. + + - yet another massive grunt work. I've changed the definition of + the EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These + now take an argument, which is the function's return value type. + + This is necessary to compile FreeType as a DLL on Windows and + OS/2. Depending on the compiler used, a compiler-specific keyword + like __export or __system must be placed before (VisualC++) or + after (BorlandC++) the type.. + + Of course, this needed a lot of changes throughout the source code + to make it compile again... All cleaned up now, apparently.. + + Note also that there is a new EXPORT_VAR macro defined to allow + the _declaration_ of an exportable public (constant) + variable. This is the case of the raster interfaces (see + ftraster.h and ftgrays.h), as well as each module's interface (see + sfdriver.h, psdriver.h, etc..) + + - new feature: it is now possible to pass extra parameters to font + drivers when creating a new face object. For now, + this capability is unused. It could however prove to + be useful in a near future.. + + the FT_Open_Args structure was changes, as well as the internal + driver interface (the specific `init_face' module function has + now a different signature). + + - updated the tutorial (not finished though). + + - updated the top-level BUILD document + + - fixed a potential memory leak that could occur when loading + embedded bitmaps. + + - added the declaration of FT_New_Memory_Face in + , as it was missing from the public header + (the implementation was already in `ftobjs.c'). + + - the file has been seriously updated in order + to allow the automatic generation of error message tables. See + the comments within it for more information. + + - major directory hierarchy re-organisation. This was done for two + things: + + * first, to ease the `manual' compilation of the library by + requiring at lot less include paths :-) + + * second, to allow external programs to effectively access + internal data fields. For example, this can be extremely + useful if someone wants to write a font producer or a font + manager on top of FreeType. + + Basically, you should now use the 'freetype/' prefix for header + inclusion, as in: + + #include + #include + + Some new include sub-directories are available: + + a. the `freetype/config' directory, contains two files used to + configure the build of the library. Client applications + should not need to look at these normally, but they can if + they want. + + #include + #include + + b. the `freetype/internal' directory, contains header files that + describes library internals. These are the header files that + were previously found in the `src/base' and `src/shared' + directories. + + + As usual, the build system and the demos have been updated to + reflect the change.. + + Here's a layout of the new directory hierarchy: + + TOP_DIR + include/ + freetype/ + freetype.h + ... + config/ + ftoption.h + ftconfig.h + ftmodule.h + + internal/ + ftobjs.h + ftstream.h + ftcalc.h + ... + + src/ + base/ + ... + + sfnt/ + psnames/ + truetype/ + type1/ + type1z/ + + + Compiling a module is now much easier, for example, the following + should work when in the TOP_DIR directory on an ANSI build: + + gcc -c -I./include -I./src/base src/base/ftbase.c + gcc -c -I./include -I./src/sfnt src/sfnt/sfnt.c + etc.. + + (of course, using -Iconfig/ if you provide system-specific + configuration files). + + - updated the structure of FT_Outline_Funcs in order to allow direct + coordinate scaling within the outline decomposition routine (this + is important for virtual `on' points with TrueType outlines) + + updates to the rasters to support this.. + + - updated the OS/2 table loading code in `src/sfnt/ttload.c' in + order to support version 2 of the table (see OpenType 1.2 spec) + + - created `include/tttables.h' and `include/t1tables.h' to allow + client applications to access some of the SFNT and T1 tables of a + face with a procedural interface (see `FT_Get_Sfnt_Table') + + updates to internal source files to reflect the change.. + + - some cleanups in the source code to get rid of warnings when + compiling with the `-Wall -W -ansi -pedantic' options in gcc. + + - debugged and moved the smooth renderer to `src/base/ftgrays.c' and + its header to `include/ftgrays.h' + + - updated TT_MAX_SUBGLYPHS to 96 as some CJK fonts have composites + with up to 80 sub-glyphs !! Thanks to Werner + + +====================================================================== + +OLD CHANGES - 14-apr-2000 + + - fixed a bug in the TrueType glyph loader that prevented the + correct loading of some CJK glyphs in mingli.ttf + + - improved the standard Type 1 hinter in `src/type1' + + - fixed two bugs in the experimental Type 1 driver in `src/type1z' + to handle the new XFree86 4.0 fonts (and a few other ones..) + + - the smooth renderer is now complete and supports sub-banding to + render large glyphs at high speed. However, it is still located + in `demos/src/ftgrays.c' and should move to the library itself in + the next beta. NOTE: The smooth renderer doesn't compile in + stand-alone mode anymore, but this should be fixed RSN.. + + - introduced convenience functions to more easily deal with glyph + images, see `include/ftglyph.h' for more details, as well as the + new demo program named `demos/src/ftstring.c' that demonstrates + its use + + - implemented FT_LOAD_NO_RECURSE in both the TrueType and Type 1 + drivers (this is required by the auto-hinter to improve its + results). + + - changed the raster interface, in order to allow client + applications to provide their own span-drawing callbacks. + However, only the smooth renderer supports this. See + `FT_Raster_Params' in the file `include/ftimage.h'. + + - fixed a small bug in FT_MulFix that caused incorrect transform + computation! + + - Note: The tutorial is out-of-date. + + +====================================================================== + +OLD CHANGES - 12-mar-2000 + + - changed the layout of configuration files : now, all ANSI + configuration files are located in + `freetype2/config'. System-specific over-rides can be placed in + `freetype2/config/'. + + - moved all configuration macros to `config/ftoption.h' + + - improvements in the Type 1 driver with AFM support + + - changed the fields in the FT_Outline structure : the old `flags' + array is re-named `tags', while all ancient flags are encoded into + a single unsigned int named `flags'. + + - introduced new flags in FT_Outline.flags (see + ft_outline_.... enums in `ftimage.h'). + + - changed outline functions to `FT_Outline_' syntax + + - added a smooth anti-alias renderer to the demonstration programs + + - added Mac graphics driver (thanks Just) + + - FT_Open_Face changed in order to received a pointer to a + FT_Open_Args descriptor.. + + - various cleanups, a few more API functions implemented (see + FT_Attach_File) + + - updated some docs + + +====================================================================== + +OLD CHANGES - 22-feb-2000 + + - introduced the `psnames' module. It is used to: + + o convert a Postscript glyph name into the equivalent Unicode + character code (used by the Type 1 driver(s) to synthesize on + the fly a Unicode charmap). + + o provide an interface to retrieve the Postscript names of the + Macintosh, Adobe Standard & Adobe Expert character codes. + (the Macintosh names are used by the SFNT-module postscript + names support routines, while the other two tables are used by + the Type 1 driver(s)). + + - introduced the `type1z' alternate Type 1 driver. This is a (still + experimental) driver for the Type 1 format that will ultimately + replace the one in `src/type1'. It uses pattern matching to load + data from the font, instead of a finite state analyzer. It works + much better than the `old' driver with `broken' fonts. It is also + much smaller (under 15 Kb). + + - the Type 1 drivers (both in `src/type1' and `src/type1z') are + nearly complete. They both provide automatic Unicode charmap + synthesis through the `psnames' module. No re-encoding vector is + needed. (note that they still leak memory due to some code + missing, and I'm getting lazy). + + Trivial AFM support has been added to read kerning information but + wasn't exactly tested as it should ;-) + + - The TrueType glyph loader has been seriously rewritten (see the + file `src/truetype/ttgload.c'. It is now much, much simpler as + well as easier to read, maintain and understand :-) Preliminary + versions introduced a memory leak that has been reported by Jack + Davis, and is now fixed.. + + - introduced the new `ft_glyph_format_plotter', used to represent + stroked outlines like Windows `Vector' fonts, and certain Type 1 + fonts like `Hershey'. The corresponding raster will be written + soon. + + - FT_New_Memory_Face is gone. Likewise, FT_Open_Face has a new + interface that uses a structure to describe the input stream, the + driver (if required), etc.. + + +TODO + + - Write FT_Get_Glyph_Bitmap and FT_Load_Glyph_Bitmap + + - Add a function like FT_Load_Character(face, char_code, load_flags) + that would really embed a call to FT_Get_Char_Index then + FT_Load_Glyph to ease developer's work. + + - Update the tutorial! + + - consider adding support for Multiple Master fonts in the Type 1 + drivers. + + - Test the AFM routines of the Type 1 drivers to check that kerning + information is returned correctly. + + - write a decent auto-gridding component !! We need this to release + FreeType 2.0 gold ! + + +less urgent needs: + + - add a CFF/Type2 driver + - add a BDF driver + - add a FNT/PCF/HBF driver + - add a Speedo driver from the X11 sources + + +====================================================================== + +OLDER CHANGES - 27-jan-2000 + + - updated the `sfnt' module interface to allow several SFNT-based + drivers to co-exist peacefully + + - updated the `T1_Face' type to better separate Postscript font + content from the rest of the FT_Face structure. Might be used + later by the CFF/Type2 driver.. + + - added an experimental replacement Type 1 driver featuring advanced + (and speedy) pattern matching to retrieve the data from postscript + fonts. + + - very minor changes in the implementation of FT_Set_Char_Size and + FT_Set_Pixel_Sizes (they now implement default to lighten the font + driver's code). + + +====================================================================== + +OLD MESSAGE + +This file summarizes the changes that occurred since the last `beta' +of FreeType 2. Because the list is important, it has been divided into +separate sections: + +Table Of Contents: + + I High-Level Interface (easier !) + II Directory Structure + III Glyph Image Formats + IV Build System + V Portability + VI Font Drivers + + +---------------------------------------------------------------------- + +High-Level Interface: + + The high-level API has been considerably simplified. Here is how: + + - resource objects have disappeared. this means that face objects + can now be created with a single function call (see FT_New_Face + and FT_Open_Face) + + - when calling either FT_New_Face & FT_Open_Face, a size object + and a glyph slot object are automatically created for the face, + and can be accessed through `face->glyph' and `face->size' if + one really needs to. In most cases, there's no need to call + FT_New_Size or FT_New_Glyph. + + - similarly, FT_Load_Glyph now only takes a `face' argument + (instead of a glyph slot and a size). Also, its `result' + parameter is gone, as the glyph image type is returned in the + field `face->glyph.format' + + - the list of available charmaps is directly accessible through + `face->charmaps', counting `face->num_charmaps' elements. Each + charmap has an 'encoding' field which specifies which known + encoding it deals with. Valid values are, for example: + + ft_encoding_unicode (for ASCII, Latin-1 and Unicode) + ft_encoding_apple_roman + ft_encoding_sjis + ft_encoding_adobe_standard + ft_encoding_adobe_expert + + other values may be added in the future. Each charmap still + holds its `platform_id' and `encoding_id' values in case the + encoding is too exotic for the current library + + +---------------------------------------------------------------------- + +Directory Structure: + + Should seem obvious to most of you: + + freetype/ + config/ -- configuration sub-makefiles + ansi/ + unix/ -- platform-specific configuration files + win32/ + os2/ + msdos/ + + include/ -- public header files, those to be included + directly by client apps + + src/ -- sources of the library + base/ -- the base layer + sfnt/ -- the sfnt `driver' (see the drivers section + below) + truetype/ -- the truetype driver + type1/ -- the type1 driver + shared/ -- some header files shared between drivers + + demos/ -- demos/tools + + docs/ -- documentation (a bit empty for now) + + +---------------------------------------------------------------------- + +Glyph Image Formats: + + Drivers are now able to register new glyph image formats within the + library. For now, the base layer supports of course bitmaps and + vector outlines, but one could imagine something different like + colored bitmaps, bi-color vectors or whatever else (Metafonts anyone + ??). + + See the file `include/ftimage.h'. Note also that the type + FT_Raster_Map is gone, and is now replaced by FT_Bitmap, which + should encompass all known bitmap types. + + Each new image format must provide at least one `raster', i.e. a + module capable of transforming the glyph image into a bitmap. It's + also possible to change the default raster used for a given glyph + image format. + + The default outline scan-converter now uses 128 levels of grays by + default, which tends to smooth many things. Note that the demo + programs have been updated significantly in order to display these.. + + +---------------------------------------------------------------------- + +Build system: + + You still need GNU Make to build the library. The build system has + been very seriously re-vamped in order to provide things like : + + - automatic host platform detection (reverting to 'config/ansi' if + it is not detected, with pseudo-standard compilation flags) + + - the ability to compile from the Makefiles with very different and + exotic compilers. Note that linking the library can be difficult + for some platforms. + + For example, the file `config/win32/lcclib.bat' is invoked by the + build system to create the `.lib' file with LCC-Win32 because its + librarian has too many flaws to be invoked directly from the + Makefile. + + Here's how it works: + + - the first time you type `make', the build system runs a series of + sub-makefiles in order to detect your host platform. It then + dumps what it found, and creates a file called `config.mk' in the + current directory. This is a sub-Makefile used to define many + important Make variables used to build the library. + + - the second time, the build system detects the `config.mk' then use + it to build the library. All object files go into 'obj' by + default, as well as the library file, but this can easily be + changed. + + Note that you can run `make setup' to force another host platform + detection even if a `config.mk' is present in the current + directory. Another solution is simply to delete the file, then + re-run make. + + Finally, the default compiler for all platforms is gcc (for now, + this will hopefully changed in the future). You can however specify + a different compiler by specifying it after the 'setup' target as + in: + + gnumake setup lcc on Win32 to use the LCC compiler + gnumake setup visualc on Win32 to use Visual C++ + + See the file `config//detect.mk' for a list of supported + compilers for your platforms. + + It should be relatively easy to write new detection rules files and + config.mk.. + + Finally, to build the demo programs, go to `demos' and launch GNU + Make, it will use the `config.mk' in the top directory to build the + test programs.. + + +---------------------------------------------------------------------- + +Portability: + + In the previous beta, a single FT_System object was used to + encompass all low-level operations like thread synchronisation, + memory management and i/o access. This has been greatly simplified: + + - thread synchronisation has been dropped, for the simple reason + that the library is already re-entrant, and that if you really + need two threads accessing the same FT_Library, you should + really synchronize access to it yourself with a simple mutex. + + - memory management is performed through a very simple object + called `FT_Memory', which really is a table containing a table + of pointers to functions like malloc, realloc and free as well + as some user data (closure). + + - resources have disappeared (they created more problems than they + solved), and i/o management have been simplified greatly as a + result. Streams are defined through FT_Stream objects, which + can be either memory-based or disk-based. + + Note that each face has its own stream, which is closed only + when the face object is destroyed. Hence, a function like + TT_Flush_Face in 1.x cannot be directly supported. However, if + you really need something like this, you can easily tailor your + own streams to achieve the same feature at a lower level (and + use FT_Open_Face instead of FT_New_Face to create the face). + + See the file `include/ftsystem.h' for more details, as well as the + implementations found in `config/unix' and `config/ansi'. + + +---------------------------------------------------------------------- + +Font Drivers: + + The Font Driver interface has been modified in order to support + extensions & versioning. + + + The list of the font drivers that are statically linked to the + library at compile time is managed through a new configuration file + called `config//ftmodule.h'. + + This file is autogenerated when invoking `make modules'. This + target will parse all sub-directories of 'src', looking for a + `module.mk' rules file, used to describe the driver to the build + system. + + Hence, one should call `make modules' each time a font driver is + added or removed from the `src' directory. + + Finally, this version provides a `pseudo-driver' in `src/sfnt'. + This driver doesn't support font files directly, but provides + services used by all TrueType-like font drivers. Hence, its code is + shared between the TrueType & OpenType font formats, and possibly + more formats to come if we're lucky.. + + +---------------------------------------------------------------------- + +Extensions support: + + The extensions support is inspired by the one found in 1.x. + + Now, each font driver has its own `extension registry', which lists + which extensions are available for the font faces managed by the + driver. + + Extension ids are now strings, rather than 4-byte tags, as this is + usually more readable. + + Each extension has: + - some data, associated to each face object + - an interface (table of function pointers) + + An extension that is format-specific should simply register itself + to the correct font driver. Here is some example code: + + // Registering an extensions + // + FT_Error FT_Init_XXXX_Extension( FT_Library library ) + { + FT_DriverInterface* tt_driver; + + driver = FT_Get_Driver( library, "truetype" ); + if (!driver) return FT_Err_Unimplemented_Feature; + + return FT_Register_Extension( driver, &extension_class ); + } + + + // Implementing the extensions + // + FT_Error FT_Proceed_Extension_XXX( FT_Face face ) + { + FT_XXX_Extension ext; + FT_XXX_Extension_Interface ext_interface; + + ext = FT_Get_Extension( face, "extensionid", &ext_interface ); + if (!ext) return error; + + return ext_interface->do_it(ext); + } + +------------------------------------------------------------------------ + +Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: + +--- end of CHANGES --- diff --git a/src/3rdparty/freetype/docs/CUSTOMIZE b/src/3rdparty/freetype/docs/CUSTOMIZE new file mode 100644 index 0000000000..7d7d474ec0 --- /dev/null +++ b/src/3rdparty/freetype/docs/CUSTOMIZE @@ -0,0 +1,150 @@ +How to customize the compilation of the library +=============================================== + + FreeType is highly customizable to fit various needs, and this + document describes how it is possible to select options and + components at compilation time. + + +I. Configuration macros + + The file found in `include/freetype/config/ftoption.h' contains a + list of commented configuration macros that can be toggled by + developers to indicate which features should be active while + building the library. + + These options range from debug level to availability of certain + features, like native TrueType hinting through a bytecode + interpreter. + + We invite you to read this file for more information. You can + change the file's content to suit your needs, or override it with + one of the techniques described below. + + +II. Modules list + + If you use GNU make please edit the top-level file `modules.cfg'. + It contains a list of available FreeType modules and extensions to + be compiled. Change it to suit your own preferences. Be aware that + certain modules depend on others, as described in the file. GNU + make uses `modules.cfg' to generate `ftmodule.h' (in the object + directory). + + If you don't use GNU make you have to manually edit the file + `include/freetype/config/ftmodule.h' (which is *not* used with if + compiled with GNU make) to add or remove the drivers and components + you want to compile into the library. See `INSTALL.ANY' for more + information. + + +III. System interface + + FreeType's default interface to the system (i.e., the parts that + deal with memory management and i/o streams) is located in + `src/base/ftsystem.c'. + + The current implementation uses standard C library calls to manage + memory and to read font files. It is however possible to write + custom implementations to suit specific systems. + + To tell the GNU Make-based build system to use a custom system + interface, you have to define the environment variable FTSYS_SRC to + point to the relevant implementation: + + on Unix: + + ./configure + export FTSYS_SRC=foo/my_ftsystem.c + make + make install + + on Windows: + + make setup + set FTSYS_SRC=foo/my_ftsystem.c + make + + +IV. Overriding default configuration and module headers + + It is possible to override the default configuration and module + headers without changing the original files. There are three ways + to do that: + + + 1. With GNU make + + [This is actually a combination of method 2 and 3.] + + Just put your custom `ftoption.h' file into the objects directory + (normally `/objs'), which GNU make prefers over the + standard location. No action is needed for `ftmodule.h' because + it is generated automatically in the objects directory. + + + 2. Using the C include path + + Use the C include path to ensure that your own versions of the + files are used at compile time when the lines + + #include FT_CONFIG_OPTIONS_H + #include FT_CONFIG_MODULES_H + + are compiled. Their default values being + and , you + can do something like: + + custom/ + freetype/ + config/ + ftoption.h => custom options header + ftmodule.h => custom modules list + + include/ => normal FreeType 2 include + freetype/ + ... + + then change the C include path to always give the path to `custom' + before the FreeType 2 `include'. + + + 3. Redefining FT_CONFIG_OPTIONS_H and FT_CONFIG_MODULES_H + + Another way to do the same thing is to redefine the macros used to + name the configuration headers. To do so, you need a custom + `ft2build.h' whose content can be as simple as: + + #ifndef __FT2_BUILD_MY_PLATFORM_H__ + #define __FT2_BUILD_MY_PLATFORM_H__ + + #define FT_CONFIG_OPTIONS_H + #define FT_CONFIG_MODULES_H + + #include + + #endif /* __FT2_BUILD_MY_PLATFORM_H__ */ + + Place those files in a separate directory, e.g., + + custom/ + ft2build.h => custom version described above + my-ftoption.h => custom options header + my-ftmodule.h => custom modules list header + + and change the C include path to ensure that `custom' is always + placed before the FT2 `include' during compilation. + +---------------------------------------------------------------------- + +Copyright 2003, 2005, 2006 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of CUSTOMIZE --- diff --git a/src/3rdparty/freetype/docs/DEBUG b/src/3rdparty/freetype/docs/DEBUG new file mode 100644 index 0000000000..1fccc21c46 --- /dev/null +++ b/src/3rdparty/freetype/docs/DEBUG @@ -0,0 +1,199 @@ +Debugging within the FreeType sources +===================================== + +I. Configuration macros +----------------------- + +There are several ways to enable debugging features in a FreeType 2 +builds. This is controlled through the definition of special macros +located in the file `ftoptions.h'. The macros are: + + + FT_DEBUG_LEVEL_ERROR + + #define this macro if you want to compile the FT_ERROR macro calls + to print error messages during program execution. This will not + stop the program. Very useful to spot invalid fonts during + development and to code workarounds for them. + + FT_DEBUG_LEVEL_TRACE + + #define this macro if you want to compile both macros FT_ERROR and + FT_TRACE. This also includes the variants FT_TRACE0, FT_TRACE1, + FT_TRACE2, ..., FT_TRACE7. + + The trace macros are used to send debugging messages when an + appropriate `debug level' is configured at runtime through the + FT2_DEBUG environment variable (more on this later). + + FT_DEBUG_MEMORY + + If this macro is #defined, the FreeType engine is linked with a + small but effective debugging memory manager that tracks all + allocations and frees that are performed within the font engine. + + When the FT2_DEBUG_MEMORY environment variable is defined at + runtime, a call to FT_Done_FreeType will dump memory statistics, + including the list of leaked memory blocks with the source locations + where these were allocated. It is always a very good idea to define + this in development builds. This works with _any_ program linked to + FreeType, but requires a big deal of memory (the debugging memory + manager never frees the blocks to the heap in order to detect double + frees). + + When FT2_DEBUG_MEMORY isn't defined at runtime, the debugging memory + manager is ignored, and performance is unaffected. + + +II. Debugging macros +-------------------- + +Several macros can be used within the FreeType sources to help debugging +its code: + + + 1. FT_ERROR(( ... )) + + This macro is used to send debug messages that indicate relatively + serious errors (like broken font files), but will not stop the + execution of the running program. Its code is compiled only when + either FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined in + `ftoption.h'. + + Note that you have to use a printf-like signature, but with double + parentheses, like in + + FT_ERROR(( "your %s is not %s\n", "foo", "bar" )); + + + 2. FT_ASSERT( condition ) + + This macro is used to check strong assertions at runtime. If its + condition isn't TRUE, the program will abort with a panic message. + Its code is compiled when either FT_DEBUG_LEVEL_ERROR or + FT_DEBUG_LEVEL_TRACE are defined. You don't need double parentheses + here. For example + + FT_ASSERT( ptr != NULL ); + + + 3. FT_TRACE( level, (message...) ) + + The FT_TRACE macro is used to send general-purpose debugging + messages during program execution. This macro uses an *implicit* + macro named FT_COMPONENT used to name the current FreeType component + being run. + + The developer should always define FT_COMPONENT as appropriate, for + example as in + + #undef FT_COMPONENT + #define FT_COMPONENT trace_io + + The value of the FT_COMPONENT macro is an enumeration named + trace_XXXX where XXXX is one of the component names defined in the + internal file `freetype/internal/fttrace.h'. + + Each such component is assigned a `debug level', ranging from 0 + to 7, through the use of the FT2_DEBUG environment variable + (described below) when a program linked with FreeType starts. + + When FT_TRACE is called, its level is compared to the one of the + corresponding component. Messages with trace levels *higher* than + the corresponding component level are filtered and never printed. + + This means that trace messages with level 0 are always printed, + those with level 2 are only printed when the component level is *at + least* 2. + + The second parameter to FT_TRACE must contain parentheses and + correspond to a printf-like call, as in + + FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) ) + + The shortcut macros FT_TRACE0, FT_TRACE1, FT_TRACE2, ..., FT_TRACE7 + can be used with constant level indices, and are much cleaner to + use, as in + + FT_TRACE2(( "your %s is not %s\n", "foo", "bar" )); + + +III. Environment variables +-------------------------- + +The following environment variables control debugging output and +behaviour of FreeType at runtime. + + + FT2_DEBUG + + This variable is only used when FreeType is built with + FT_DEBUG_LEVEL_TRACE defined. It contains a list of component level + definitions, following this format: + + component1:level1 component2:level2 component3:level3 ... + + where `componentX' is the name of a tracing component, as defined in + `fttrace.h', but without the `trace_' prefix. `levelX' is the + corresponding level to use at runtime. + + `any' is a special component name that will be interpreted as + `any/all components'. For example, the following definitions + + set FT2_DEBUG=any:2 memory:5 io:4 (on Windows) + export FT2_DEBUG="any:2 memory:5 io:4" (on Linux with bash) + + both stipulate that all components should have level 2, except for + the memory and io components which will be set to trace levels 5 and + 4, respectively. + + + FT2_DEBUG_MEMORY + + This environment variable, when defined, tells FreeType to use a + debugging memory manager that will track leaking memory blocks as + well as other common errors like double frees. It is also capable + of reporting _where_ the leaking blocks were allocated, which + considerably saves time when debugging new additions to the library. + + This code is only compiled when FreeType is built with the + FT_DEBUG_MEMORY macro #defined in `ftoption.h' though, it will be + ignored in other builds. + + + FT2_ALLOC_TOTAL_MAX + + This variable is ignored if FT2_DEBUG_MEMORY is not defined. It + allows you to specify a maximum heap size for all memory allocations + performed by FreeType. This is very useful to test the robustness + of the font engine and programs that use it in tight memory + conditions. + + If it is undefined, or if its value is not strictly positive, then + no allocation bounds are checked at runtime. + + + FT2_ALLOC_COUNT_MAX + + This variable is ignored if FT2_DEBUG_MEMORY is not defined. It + allows you to specify a maximum number of memory allocations + performed by FreeType before returning the error + FT_Err_Out_Of_Memory. This is useful for debugging and testing the + engine's robustness. + + If it is undefined, or if its value is not strictly positive, then + no allocation bounds are checked at runtime. + +------------------------------------------------------------------------ + +Copyright 2002, 2003, 2004, 2005 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of DEBUG --- diff --git a/src/3rdparty/freetype/docs/FTL.TXT b/src/3rdparty/freetype/docs/FTL.TXT new file mode 100644 index 0000000000..bbaba33f47 --- /dev/null +++ b/src/3rdparty/freetype/docs/FTL.TXT @@ -0,0 +1,169 @@ + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + http://www.freetype.org + + +--- end of FTL.TXT --- diff --git a/src/3rdparty/freetype/docs/GPL.TXT b/src/3rdparty/freetype/docs/GPL.TXT new file mode 100644 index 0000000000..b2fe7b6af3 --- /dev/null +++ b/src/3rdparty/freetype/docs/GPL.TXT @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU 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 + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/3rdparty/freetype/docs/INSTALL b/src/3rdparty/freetype/docs/INSTALL new file mode 100644 index 0000000000..de50d0c2e4 --- /dev/null +++ b/src/3rdparty/freetype/docs/INSTALL @@ -0,0 +1,91 @@ + +There are several ways to build the FreeType library, depending on +your system and the level of customization you need. Here is a short +overview of the documentation available: + + +I. Normal installation and upgrades +=================================== + + 1. Native TrueType Hinting + + Native TrueType hinting is disabled by default[1]. If you really + need it, read the file `TRUETYPE' for information. + + + 2. Unix Systems (including Mac OS X, Cygwin, and MSys on Windows) + + Please read *both* `UPGRADE.UNIX' and `INSTALL.UNIX' to install or + upgrade FreeType 2 on a Unix system. Note that you *need* GNU + Make for automatic compilation, since other make tools won't work + (this includes BSD Make). + + GNU Make VERSION 3.80 OR NEWER IS NEEDED! + + + 3. On VMS with the `mms' build tool + + See `INSTALL.VMS' for installation instructions on this platform. + + + 4. Other systems using GNU Make + + On non-Unix platforms, it is possible to build the library using + GNU Make utility. Note that *NO OTHER MAKE TOOL WILL WORK*[2]! + This methods supports several compilers on Windows, OS/2, and + BeOS, including MinGW, Visual C++, Borland C++, and more. + + Instructions are provided in the file `INSTALL.GNU'. + + + 5. With an IDE Project File (e.g., for Visual Studio or CodeWarrior) + + We provide a small number of `project files' for various IDEs to + automatically build the library as well. Note that these files + are not supported and only sporadically maintained by FreeType + developers, so don't expect them to work in each release. + + To find them, have a look at the content of the `builds/' + directory, where stands for your OS or environment. + + + 6. From you own IDE, or own Makefiles + + If you want to create your own project file, follow the + instructions given in the `INSTALL.ANY' document of this + directory. + + +II. Custom builds of the library +================================ + + Customizing the compilation of FreeType is easy, and allows you to + select only the components of the font engine that you really need. + For more details read the file `CUSTOMIZE'. + + +---------------------------------------------------------------------- + +[1] More details on: http://www.freetype.org/patents.html + +[2] make++, a make tool written in Perl, has sufficient support of GNU + make extensions to build FreeType. See + + http://makepp.sourceforge.net + + for more information; you need version 1.19 or newer, and you must + pass option `--norc-substitution'. + +---------------------------------------------------------------------- + +Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL --- diff --git a/src/3rdparty/freetype/docs/INSTALL.ANY b/src/3rdparty/freetype/docs/INSTALL.ANY new file mode 100644 index 0000000000..86e94d585f --- /dev/null +++ b/src/3rdparty/freetype/docs/INSTALL.ANY @@ -0,0 +1,151 @@ +Instructions on how to build FreeType with your own build tool +============================================================== + +See the file `CUSTOMIZE' to learn how to customize FreeType to +specific environments. + + +I. Standard procedure +--------------------- + + * DISABLE PRE-COMPILED HEADERS! This is very important for Visual + C++, because FreeType uses lines like: + + #include FT_FREETYPE_H + + which are not correctly supported by this compiler while being ISO + C compliant! + + * You need to add the directories `freetype2/include' to your + include path when compiling the library. + + * FreeType 2 is made of several components; each of them is located + in a subdirectory of `freetype2/src'. For example, + `freetype2/src/truetype/' contains the TrueType font driver. + + * DO NOT COMPILE ALL C FILES! Rather, compile the following ones. + + -- base components (required) + + src/base/ftsystem.c + src/base/ftinit.c + src/base/ftdebug.c + + src/base/ftbase.c + + src/base/ftbbox.c -- recommended, see + src/base/ftglyph.c -- recommended, see + + src/base/ftbdf.c -- optional, see + src/base/ftbitmap.c -- optional, see + src/base/ftcid.c -- optional, see + src/base/ftfstype.c -- optional + src/base/ftgasp.c -- optional, see + src/base/ftgxval.c -- optional, see + src/base/ftlcdfil.c -- optional, see + src/base/ftmm.c -- optional, see + src/base/ftotval.c -- optional, see + src/base/ftpatent.c -- optional + src/base/ftpfr.c -- optional, see + src/base/ftstroke.c -- optional, see + src/base/ftsynth.c -- optional, see + src/base/fttype1.c -- optional, see + src/base/ftwinfnt.c -- optional, see + src/base/ftxf86.c -- optional, see + + src/base/ftmac.c -- only on the Macintosh + + -- font drivers (optional; at least one is needed) + + src/bdf/bdf.c -- BDF font driver + src/cff/cff.c -- CFF/OpenType font driver + src/cid/type1cid.c -- Type 1 CID-keyed font driver + src/pcf/pcf.c -- PCF font driver + src/pfr/pfr.c -- PFR/TrueDoc font driver + src/sfnt/sfnt.c -- SFNT files support + (TrueType & OpenType) + src/truetype/truetype.c -- TrueType font driver + src/type1/type1.c -- Type 1 font driver + src/type42/type42.c -- Type 42 font driver + src/winfonts/winfnt.c -- Windows FONT / FNT font driver + + -- rasterizers (optional; at least one is needed for vector + formats) + + src/raster/raster.c -- monochrome rasterizer + src/smooth/smooth.c -- anti-aliasing rasterizer + + -- auxiliary modules (optional) + + src/autofit/autofit.c -- auto hinting module + src/cache/ftcache.c -- cache sub-system (in beta) + src/gzip/ftgzip.c -- support for compressed fonts (.gz) + src/lzw/ftlzw.c -- support for compressed fonts (.Z) + src/gxvalid/gxvalid.c -- TrueTypeGX/AAT table validation + src/otvalid/otvalid.c -- OpenType table validation + src/psaux/psaux.c -- PostScript Type 1 parsing + src/pshinter/pshinter.c -- PS hinting module + src/psnames/psnames.c -- PostScript glyph names support + + + Notes: + + `ftcache.c' needs `ftglyph.c' + `ftfstype.c' needs `fttype1.c' + `ftglyph.c' needs `ftbitmap.c' + `ftstroke.c' needs `ftglyph.c' + `ftsynth.c' needs `ftbitmap.c' + + `cff.c' needs `sfnt.c', `pshinter.c', and `psnames.c' + `truetype.c' needs `sfnt.c' and `psnames.c' + `type1.c' needs `psaux.c' `pshinter.c', and `psnames.c' + `type1cid.c' needs `psaux.c', `pshinter.c', and `psnames.c' + `type42.c' needs `truetype.c' + + + Read the file `CUSTOMIZE' in case you want to compile only a subset + of the drivers, renderers, and optional modules; a detailed + description of the various base extension is given in the top-level + file `modules.cfg'. + + You are done. In case of problems, see the archives of the FreeType + development mailing list. + + +II. Support for flat-directory compilation +------------------------------------------ + + It is possible to put all FreeType 2 source files into a single + directory, with the *exception* of the `include' hierarchy. + + 1. Copy all files in current directory + + cp freetype2/src/base/*.[hc] . + cp freetype2/src/raster1/*.[hc] . + cp freetype2/src/smooth/*.[hc] . + etc. + + 2. Compile sources + + cc -c -Ifreetype2/include ftsystem.c + cc -c -Ifreetype2/include ftinit.c + cc -c -Ifreetype2/include ftdebug.c + cc -c -Ifreetype2/include ftbase.c + etc. + + You don't need to define the FT_FLAT_COMPILATION macro (as this + was required in previous releases of FreeType 2). + +---------------------------------------------------------------------- + +Copyright 2003, 2005, 2006, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL.ANY --- diff --git a/src/3rdparty/freetype/docs/INSTALL.CROSS b/src/3rdparty/freetype/docs/INSTALL.CROSS new file mode 100644 index 0000000000..3def12c8c5 --- /dev/null +++ b/src/3rdparty/freetype/docs/INSTALL.CROSS @@ -0,0 +1,135 @@ +This document contains instructions on how to cross-build the FreeType +library on Unix systems, for example, building binaries for Linux/MIPS +on FreeBSD/i386. Before reading this document, please consult +INSTALL.UNIX for required tools and the basic self-building procedure. + + + 1. Required Tools + ----------------- + + For self-building the FreeType library on a Unix system, GNU Make + 3.80 or newer is required. INSTALL.UNIX contains hints how to + check the installed `make'. + + The GNU C compiler to cross-build the target system is required. + At present, using non-GNU cross compiler is not tested. The cross + compiler is expected to be installed with a system prefix. For + example, if your building system is FreeBSD/i386 and the target + system is Linux/MIPS, the cross compiler should be installed with + the name `mips-ip22-linuxelf-gcc'. + + A C compiler for a self-build is required also, to build a tool + that is executed during the building procedure. Non-GNU self + compilers are acceptable, but such a setup is not tested yet. + + + 2. Configuration + ---------------- + + 2.1. Building and target system + + To configure for cross-build, the options `--host=' and + `--build=' must be passed to configure. For example, if + your building system is FreeBSD/i386 and the target system is + Linux/MIPS, say + + ./configure \ + --build=i386-unknown-freebsd \ + --host=mips-ip22-linuxelf \ + [other options] + + It should be noted that `--host=' specifies the system + where the built binaries will be executed, not the system where + the build actually happens. Older versions of GNU autoconf use + the option pair `--host=' and `--target='. This is broken and + doesn't work. Similarly, an explicit CC specification like + + env CC=mips-ip22-linux-gcc ./configure + + or + + env CC=/usr/local/mips-ip22-linux/bin/gcc ./configure + + doesn't work either; such a configuration confuses the + `configure' script while trying to find the cross and native C + compilers. + + + 2.2. The prefix to install FreeType2 + + Setting `--prefix=' properly is important. The prefix + to install FreeType2 is written into the freetype-config script + and freetype2.pc configuration file. + + If the built FreeType 2 library is used as a part of the + cross-building system, the prefix is expected to be different + from the self-building system. For example, configuration with + `--prefix=/usr/local' installs binaries into the system wide + `/usr/local' directory which then can't be executed. This + causes confusion in configuration of all applications which use + FreeType2. Instead, use a prefix to install the cross-build + into a separate system tree, for example, + `--prefix=/usr/local/mips-ip22-linux/'. + + On the other hand, if the built FreeType2 is used as a part of + the target system, the prefix to install should reflect the file + system structure of the target system. + + + 3. Building command + ------------------- + + If the configuration finishes successfully, invoking GNU make + builds FreeType2. Just say + + make + + or + + gmake + + depending on the name the GNU make binary actually has. + + + 4. Installation + --------------- + + Saying + + make install + + as usual to install FreeType2 into the directory tree specified by + the argument of the `--prefix' option. + + As noted in section 2.2, FreeType2 is sometimes configured to be + installed into the system directory of the target system, and + should not be installed in the cross-building system. In such + cases, the make variable `DESTDIR' is useful to change the root + directory in the installation. For example, after + + make DESTDIR=/mnt/target_system_root/ install + + the built FreeType2 library files are installed into the directory + `/mnt/target_system_root//lib'. + + + 5. TODO + ------- + + Cross building between Cygwin (or MSys) and Unix must be tested. + + +---------------------------------------------------------------------- + +Copyright 2006, 2008 by suzuki toshiya +David Turner, Robert Wilhelm, and Werner Lemberg. + + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL.CROSS --- diff --git a/src/3rdparty/freetype/docs/INSTALL.GNU b/src/3rdparty/freetype/docs/INSTALL.GNU new file mode 100644 index 0000000000..72df50a4ea --- /dev/null +++ b/src/3rdparty/freetype/docs/INSTALL.GNU @@ -0,0 +1,159 @@ +This document contains instructions how to build the FreeType library +on non-Unix systems with the help of GNU Make. Note that if you are +running Cygwin or MSys in Windows, you should follow the instructions +in the file INSTALL.UNIX instead. + + + FreeType 2 includes a powerful and flexible build system that allows + you to easily compile it on a great variety of platforms from the + command line. To do so, just follow these simple instructions. + + 1. Install GNU Make + ------------------- + + Because GNU Make is the only Make tool supported to compile + FreeType 2, you should install it on your machine. + + The FreeType 2 build system relies on many features special to GNU + Make. + + NEARLY ALL OTHER MAKE TOOLS FAIL, INCLUDING `BSD MAKE', SO REALLY + INSTALL A RECENT VERSION OF GNU MAKE ON YOUR SYSTEM! + + Note that make++, a make tool written in Perl, supports enough + features of GNU make to compile FreeType. See + + http://makepp.sourceforge.net + + for more information; you need version 1.19 or newer, and you must + pass option `--norc-substitution'. + + Make sure that you are invoking GNU Make from the command line, by + typing something like: + + make -v + + to display its version number. + + VERSION 3.80 OR NEWER IS NEEDED! + + + 2. Invoke `make' + ---------------- + + Go to the root directory of FreeType 2, then simply invoke GNU + Make from the command line. This will launch the FreeType 2 host + platform detection routines. A summary will be displayed, for + example, on Win32. + + + ============================================================== + FreeType build system -- automatic system detection + + The following settings are used: + + platform win32 + compiler gcc + configuration directory .\builds\win32 + configuration rules .\builds\win32\w32-gcc.mk + + If this does not correspond to your system or settings please + remove the file 'config.mk' from this directory then read the + INSTALL file for help. + + Otherwise, simply type 'make' again to build the library + or 'make refdoc' to build the API reference (the latter needs + python). + ============================================================= + + + If the detected settings correspond to your platform and compiler, + skip to step 5. Note that if your platform is completely alien to + the build system, the detected platform will be `ansi'. + + + 3. Configure the build system for a different compiler + ------------------------------------------------------ + + If the build system correctly detected your platform, but you want + to use a different compiler than the one specified in the summary + (for most platforms, gcc is the default compiler), invoke GNU Make + with + + make setup + + Examples: + + to use Visual C++ on Win32, type: `make setup visualc' + to use Borland C++ on Win32, type `make setup bcc32' + to use Watcom C++ on Win32, type `make setup watcom' + to use Intel C++ on Win32, type `make setup intelc' + to use LCC-Win32 on Win32, type: `make setup lcc' + to use Watcom C++ on OS/2, type `make setup watcom' + to use VisualAge C++ on OS/2, type `make setup visualage' + + The name to use is platform-dependent. The list of + available compilers for your system is available in the file + `builds//detect.mk'. + + If you are satisfied by the new configuration summary, skip to + step 5. + + + 4. Configure the build system for an unknown platform/compiler + -------------------------------------------------------------- + + The auto-detection/setup phase of the build system copies a file + to the current directory under the name `config.mk'. + + For example, on OS/2+gcc, it would simply copy + `builds/os2/os2-gcc.mk' to `./config.mk'. + + If for some reason your platform isn't correctly detected, copy + manually the configuration sub-makefile to `./config.mk' and go to + step 5. + + Note that this file is a sub-Makefile used to specify Make + variables for compiler and linker invocation during the build. + You can easily create your own version from one of the existing + configuration files, then copy it to the current directory under + the name `./config.mk'. + + + 5. Build the library + -------------------- + + The auto-detection/setup phase should have copied a file in the + current directory, called `./config.mk'. This file contains + definitions of various Make variables used to invoke the compiler + and linker during the build. [It has also generated a file called + `ftmodule.h' in the objects directory (which is normally + `/objs/'); please read the file `docs/CUSTOMIZE' for + customization of FreeType.] + + To launch the build, simply invoke GNU Make again: The top + Makefile will detect the configuration file and run the build with + it. + + + Final note + + The build system builds a statically linked library of the font + engine in the `objs' directory. It does _not_ support the build + of DLLs on Windows and OS/2. If you need these, you have to + either use an IDE-specific project file, or follow the + instructions in `INSTALL.ANY' to create your own Makefiles. + +---------------------------------------------------------------------- + +Copyright 2003, 2004, 2005, 2006, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL.GNU --- diff --git a/src/3rdparty/freetype/docs/INSTALL.MAC b/src/3rdparty/freetype/docs/INSTALL.MAC new file mode 100644 index 0000000000..42bb0d8637 --- /dev/null +++ b/src/3rdparty/freetype/docs/INSTALL.MAC @@ -0,0 +1,32 @@ +Please follow the instructions in INSTALL.UNIX to install FreeType on +Mac OS X. + +Currently FreeType2 functions based on some deprecated Carbon APIs +return FT_Err_Unimplemented_Feature always, even if FreeType2 is +configured and built on the system that deprecated Carbon APIs are +available. To enable deprecated FreeType2 functions as far as possible, +replace src/base/ftmac.c by builds/mac/ftmac.c. + +Starting with Mac OS X 10.5, gcc defaults the deployment target +to 10.5. In previous versions of Mac OS X, this defaulted to 10.1. +If you want your built binaries to run only on 10.5, this change +does not concern you. If you want them to also run on older versions +of Mac OS X, then you must either set the MACOSX_DEPLOYMENT_TARGET +environment variable or pass -mmacosx-version-min to gcc. You should +specify the oldest version of Mac OS you want the code to run on. +For example, if you use Bourne shell: + + export MACOSX_DEPLOYMENT_TARGET=10.2 + +or, if you use C shell: + + setenv MACOSX_DEPLOYMENT_TARGET 10.2 + +Alternatively, you could pass "-mmacosx-version-min=10.2" to gcc. + +Here the number 10.2 is the lowest version that the built binaries +can run on. In the cases in above, the built binaries will run on +Mac OS X 10.2 and later, but _not_ earlier. If you want to run on +earlier, you have to set lower version, e.g. 10.0. + +For classic Mac OS (Mac OS 7, 8, 9) please refer to builds/mac/README. diff --git a/src/3rdparty/freetype/docs/INSTALL.UNIX b/src/3rdparty/freetype/docs/INSTALL.UNIX new file mode 100644 index 0000000000..1d5af993f8 --- /dev/null +++ b/src/3rdparty/freetype/docs/INSTALL.UNIX @@ -0,0 +1,96 @@ +This document contains instructions on how to build the FreeType +library on Unix systems. This also works for emulations like Cygwin +or MSys on Win32: + + + 1. Ensure that you are using GNU Make + ------------------------------------- + + The FreeType build system _exclusively_ works with GNU Make. You + will not be able to compile the library with the instructions + below using any other alternative (including BSD Make). + + Check that you have GNU make by running the command: + + make -v + + This should dump some text that begins with: + + GNU Make + Copyright (C) Free Software Foundation Inc. + + Note that version 3.80 or higher is *required* or the build will + fail. + + It is also fine to have GNU Make under another name (e.g. 'gmake') + if you use the GNUMAKE variable as described below. + + As a special exception, 'makepp' can also be used to build + FreeType 2. See the file docs/MAKEPP for details. + + + 2. Regenerate the configure script if needed + -------------------------------------------- + + This only applies if you are building a CVS snapshot or checkout, + *not* if you grabbed the sources of an official release. + + You need to invoke the `autogen.sh' script in the top-level + directory in order to create the `configure' script for your + platform. Normally, this simply means typing: + + sh autogen.sh + + In case of problems, you may need to install or upgrade Automake, + Autoconf or Libtool. See README.CVS in the top-level directory + for more information. + + + 3. Build and install the library + -------------------------------- + + The following should work on all Unix systems where the `make' + command invokes GNU Make: + + ./configure [options] + make + make install (as root) + + The default installation path is `/usr/local'. It can be changed + with the `--prefix=' option. Example: + + ./configure --prefix=/usr + + When using a different command to invoke GNU Make, use the GNUMAKE + variable. For example, if `gmake' is the command to use on your + system, do something like: + + GNUMAKE=gmake ./configure [options] + gmake + gmake install (as root) + + If this still doesn't work, there must be a problem with your + system (e.g., you are using a very old version of GNU Make). + + It is possible to compile FreeType in a different directory. + Assuming the FreeType source files in directory `/src/freetype' a + compilation in directory `foo' works as follows: + + cd foo + /src/freetype/configure [options] + make + make install + +---------------------------------------------------------------------- + +Copyright 2003, 2004, 2005, 2006, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL.UNIX --- diff --git a/src/3rdparty/freetype/docs/INSTALL.VMS b/src/3rdparty/freetype/docs/INSTALL.VMS new file mode 100644 index 0000000000..994e566883 --- /dev/null +++ b/src/3rdparty/freetype/docs/INSTALL.VMS @@ -0,0 +1,62 @@ +How to build the freetype2 library on VMS +----------------------------------------- + +It is actually very straightforward to install the Freetype2 library. +Just execute vms_make.com from the toplevel directory to build the +library. This procedure currently accepts the following options: + +DEBUG + Build the library with debug information and without optimization. + +lopts= + Options to pass to the link command e.g. lopts=/traceback + +ccopt= + Options to pass to the C compiler e.g. ccopt=/float=ieee + +In case you did download the demos, place them in a separate directory +sharing the same toplevel as the directory of Freetype2 and follow the +same instructions as above for the demos from there. The build +process relies on this to figure the location of the Freetype2 include +files. + + +To rebuild the sources it is necessary to have MMS/MMK installed on +the system. + +The library is available in the directory + + [.LIB] + +To compile applications using FreeType 2 you have to define the +logical FREETYPE pointing to the directory + + [.INCLUDE.FREETYPE] + +i.e., if the directory in which this INSTALL.VMS file is located is +$disk:[freetype] then define the logical with + + define freetype $disk:[freetype.include.freetype] + +This version has been tested with Compaq C V6.2-006 on OpenVMS Alpha +V7.2-1. + + + Any problems can be reported to + + Jouk Jansen or + Martin P.J. Zinser + +------------------------------------------------------------------------ + +Copyright 2000, 2004 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of INSTALL.VMS --- diff --git a/src/3rdparty/freetype/docs/LICENSE.TXT b/src/3rdparty/freetype/docs/LICENSE.TXT new file mode 100644 index 0000000000..102a03d651 --- /dev/null +++ b/src/3rdparty/freetype/docs/LICENSE.TXT @@ -0,0 +1,28 @@ + +The FreeType 2 font engine is copyrighted work and cannot be used +legally without a software license. In order to make this project +usable to a vast majority of developers, we distribute it under two +mutually exclusive open-source licenses. + +This means that *you* must choose *one* of the two licenses described +below, then obey all its terms and conditions when using FreeType 2 in +any of your projects or products. + + - The FreeType License, found in the file `FTL.TXT', which is similar + to the original BSD license *with* an advertising clause that forces + you to explicitly cite the FreeType project in your product's + documentation. All details are in the license file. This license + is suited to products which don't use the GNU General Public + License. + + - The GNU General Public License version 2, found in `GPL.TXT' (any + later version can be used also), for programs which already use the + GPL. Note that the FTL is incompatible with the GPL due to its + advertisement clause. + +The contributed PCF driver comes with a license similar to that of the X +Window System. It is compatible to the above two licenses (see file +src/pcf/readme). + + +--- end of LICENSE.TXT --- diff --git a/src/3rdparty/freetype/docs/MAKEPP b/src/3rdparty/freetype/docs/MAKEPP new file mode 100644 index 0000000000..58eaf551df --- /dev/null +++ b/src/3rdparty/freetype/docs/MAKEPP @@ -0,0 +1,5 @@ +As a special exception, FreeType can also be built with the 'makepp' +build tool, available from http://makepp.sourceforge.net. + +Note, however. that you will need at least version 1.19 and pass the +option --norc-substitution to have it work correctly. diff --git a/src/3rdparty/freetype/docs/PATENTS b/src/3rdparty/freetype/docs/PATENTS new file mode 100644 index 0000000000..f36778b5e9 --- /dev/null +++ b/src/3rdparty/freetype/docs/PATENTS @@ -0,0 +1,27 @@ + + FreeType Patents Disclaimer + August 1999 + + + +WE HAVE DISCOVERED THAT APPLE OWNS SEVERAL PATENTS RELATED TO THE +RENDERING OF TRUETYPE FONTS. THIS COULD MEAN THAT THE FREE USE OF +FREETYPE MIGHT BE ILLEGAL IN THE USA, JAPAN, AND POSSIBLY OTHER +COUNTRIES, BE IT IN PROPRIETARY OR FREE SOFTWARE PRODUCTS. + +FOR MORE DETAILS, WE STRONGLY ADVISE YOU TO GO TO THE FREETYPE +PATENTS PAGE AT THE FOLLOWING WEB ADDRESS: + + http://www.freetype.org/patents.html + +WE WILL NOT PLACE INFORMATION IN THIS FILE AS THE SITUATION IS STILL +UNDETERMINED FOR NOW. AT THE TIME THESE LINES ARE WRITTEN, WE HAVE +CONTACTED APPLE'S LEGAL DEPARTMENT AND ARE STILL WAITING FOR THEIR +ANSWER ON THE SUBJECT. + +PLEASE READ THE `INSTALL' FILE TO SEE HOW TO DISABLE THE ENGINE'S +BYTECODE INTERPRETER IN ORDER TO BUILD A PATENT-FREE ENGINE, AT THE +COST OF RENDERING QUALITY. + + +--- end of PATENTS --- diff --git a/src/3rdparty/freetype/docs/PROBLEMS b/src/3rdparty/freetype/docs/PROBLEMS new file mode 100644 index 0000000000..9b598966a0 --- /dev/null +++ b/src/3rdparty/freetype/docs/PROBLEMS @@ -0,0 +1,77 @@ +This file describes various problems that have been encountered in +compiling, installing and running FreeType 2. Suggestions for +additions or other improvements to this file are welcome. + +---------------------------------------------------------------------- + +Running Problems +================ + + +* Some Type 1, Multiple Masters, and CID-keyed PostScript fonts aren't + handled correctly. + +----- + +Of course, there might be bugs in FreeType, but some fonts based on +the PostScript format can't behandled indeed. The reason is that +FreeType doesn't contain a full PostScript interpreter but applies +pattern matching instead. In case a font doesn't follow the standard +structure of the given font format, FreeType fails. A typical example +is Adobe's `Optima' font family which contains extra code to switch +between low and high resolution versions of the glyphs. + +It might be possible to patch FreeType in some situations, though. +Please report failing fonts so that we investigate the problem and set +up a list of such problematic fonts. + +---------------------------------------------------------------------- + + +Compilation Problems +==================== + + +* I get an `internal compilation error' (ICE) while compiling FreeType + 2.2.1 with Intel C++. + + This has been reported for the following compiler version: + + Intel(R) C++ Compiler for 32-bit applications, + Version 9.0 Build 20050430Z Package ID: W_CC_P_9.0.019 + +----- + +The best solution is to update the compiler to version + + Intel(R) C++ Compiler for 32-bit applications, + Version 9.1 Build 20060323Z Package ID: W_CC_P_9.1.022 + +or newer. If this isn't feasible, apply the following patch. + + +--- src/cache/ftcbasic.c 20 Mar 2006 12:10:24 -0000 1.20 ++++ src/cache/ftcbasic.c.patched 15 May 2006 02:51:02 -0000 +@@ -252,7 +252,7 @@ + */ + + FT_CALLBACK_TABLE_DEF +- const FTC_IFamilyClassRec ftc_basic_image_family_class = ++ FTC_IFamilyClassRec ftc_basic_image_family_class = + { + { + sizeof ( FTC_BasicFamilyRec ), +@@ -266,7 +266,7 @@ + + + FT_CALLBACK_TABLE_DEF +- const FTC_GCacheClassRec ftc_basic_image_cache_class = ++ FTC_GCacheClassRec ftc_basic_image_cache_class = + { + { + ftc_inode_new, + + +---------------------------------------------------------------------- + +--- end of PROBLEMS --- diff --git a/src/3rdparty/freetype/docs/TODO b/src/3rdparty/freetype/docs/TODO new file mode 100644 index 0000000000..be60d6f040 --- /dev/null +++ b/src/3rdparty/freetype/docs/TODO @@ -0,0 +1,40 @@ +Here is a list of items that need to be addressed in FreeType 2 +--------------------------------------------------------------- + +* Implement stem3/counter hints properly in the Postscript hinter. + +* Add CIDCMap support to the CID driver. + +* Add track kerning support to the PFR driver. + +* Add kerning (AFM file) support to the CID driver. + + +Here is a list of bugs which should be handled +---------------------------------------------- + +Other bugs have been registered at the savannah bugzilla of FreeType. + +* CID driver: + Handle the case where a CID font has a top-level font matrix also + (see PLRM, 5.11.3, Type 0 CIDFonts). Since CID_FaceInfoRec lacks + a font_matrix entry we have to directly apply it to all subfont + matrices. + +* CID driver: + Use top-level font matrix entry for setting the upem value, not the + entries in the FDarray. If absent, use 1000. + +------------------------------------------------------------------------ + +Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of TODO --- diff --git a/src/3rdparty/freetype/docs/TRUETYPE b/src/3rdparty/freetype/docs/TRUETYPE new file mode 100644 index 0000000000..3e1614ad43 --- /dev/null +++ b/src/3rdparty/freetype/docs/TRUETYPE @@ -0,0 +1,40 @@ +How to enable the TrueType native hinter if you need it +------------------------------------------------------- + + The TrueType bytecode interpreter is disabled in all public releases + of the FreeType packages for patents reasons; see + + http://www.freetype.org/patents.html + + for more details. + + However, many Linux distributions do enable the interpreter in the + FreeType packages (DEB/RPM/etc.) they produce for their platforms. If + you are using TrueType fonts on your system, you most probably want to + enable it manually by doing the following: + + - open the file `include/freetype/config/ftoption.h' + + - locate a line that says: + + /* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + - change it to: + + #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + These steps must be done _before_ compiling the library. + +------------------------------------------------------------------------ + +Copyright 2003, 2005, 2006 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of TRUETYPE --- diff --git a/src/3rdparty/freetype/docs/UPGRADE.UNIX b/src/3rdparty/freetype/docs/UPGRADE.UNIX new file mode 100644 index 0000000000..48c746d703 --- /dev/null +++ b/src/3rdparty/freetype/docs/UPGRADE.UNIX @@ -0,0 +1,137 @@ + +SPECIAL NOTE FOR UNIX USERS +=========================== + + If you are installing this release of FreeType on a system that + already uses release 2.0.5 (or even an older version), you have to + perform a few special steps to ensure that everything goes well. + + + 1. Enable the TrueType bytecode hinter if you need it + ----------------------------------------------------- + + See the instructions in the file `TRUETYPE' of this directory. + + Note that FreeType supports TrueType fonts without the bytecode + interpreter through its auto-hinter, which now generates relatively + good results with most fonts. + + + 2. Determine the correct installation path + ------------------------------------------ + + By default, the configure script installs the library in + `/usr/local'. However, many Unix distributions now install the + library in `/usr', since FreeType is becoming a critical system + component. + + If FreeType is already installed on your system, type + + freetype-config --prefix + + on the command line. This should return the installation path + (e.g., `/usr' or `/usr/local'). To avoid problems of parallel + FreeType versions, use this path for the --prefix option of the + configure script. + + Otherwise, simply use `/usr' (or whatever you think is adequate for + your installation). + + + 3. Ensure that you are using GNU Make + ------------------------------------- + + The FreeType build system _exclusively_ works with GNU Make (as an + exception you can use make++ which emulates GNU Make sufficiently; + see http://makepp.sourceforge.net). You will not be able to compile + the library with the instructions below using any other alternative + (including BSD Make). + + Trying to compile the library with a different Make tool prints a + message like: + + Sorry, GNU make is required to build FreeType2. + + and the build process is aborted. If this happens, install GNU Make + on your system, and use the GNUMAKE environment variable to name it. + + + 4. Build and install the library + -------------------------------- + + The following should work on all Unix systems where the `make' + command invokes GNU Make: + + ./configure --prefix= + make + make install (as root) + + where `' must be replaced by the prefix returned by the + `freetype-config' command. + + When using a different command to invoke GNU Make, use the GNUMAKE + variable. For example, if `gmake' is the command to use on your + system, do something like: + + GNUMAKE=gmake ./configure --prefix= + gmake + gmake install (as root) + + + 5. Take care of XFree86 version 4 + --------------------------------- + + Certain Linux distributions install _several_ versions of FreeType + on your system. For example, on a fresh Mandrake 8.1 system, you + can find the following files: + + /usr/lib/libfreetype.so which links to + /usr/lib/libfreetype.6.1.0.so + + and + + /usr/X11R6/lib/libfreetype.so which links to + /usr/X11R6/lib/libfreetype.6.0.so + + Note that these files correspond to two distinct versions of the + library! It seems that this surprising issue is due to the install + scripts of recent XFree86 servers (from 4.1.0) which install their + own (dated) version of the library in `/usr/X11R6/lib'. + + In certain _rare_ cases you may experience minor problems if you + install this release of the library in `/usr' only, namely, that + certain applications do not benefit from the bug fixes and rendering + improvements you would expect. + + There are two good ways to deal with this situation: + + - Install the library _twice_, in `/usr' and in `/usr/X11R6' (you + have to do that each time you install a new FreeType release + though). + + - Change the link in /usr/X11R6/lib/libfreetype.so to point to + + /usr/lib/libfreetype.so, + + and get rid of + + /usr/X11R6/lib/libfreetype.6.0.so + + The FreeType Team is not responsible for this problem, so please + contact either the XFree86 development team or your Linux + distributor to help clear this issue in case the information given + here doesn't help. + +------------------------------------------------------------------------ + +Copyright 2003, 2005 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +---- end of UPGRADE.UNIX --- diff --git a/src/3rdparty/freetype/docs/VERSION.DLL b/src/3rdparty/freetype/docs/VERSION.DLL new file mode 100644 index 0000000000..6b028b12f9 --- /dev/null +++ b/src/3rdparty/freetype/docs/VERSION.DLL @@ -0,0 +1,135 @@ +Due to our use of `libtool' to generate and install the FreeType 2 +libraries on Unix systems, as well as other historical events, it is +generally very difficult to know precisely which release of the font +engine is installed on a given system. + +This file tries to explain why and to document ways to properly detect +FreeType on Unix. + + +1. Version and Release numbers +------------------------------ + +For each new public release of FreeType 2, there are generally *three* +distinct `version' numbers to consider: + + * The official FreeType 2 release number, like 2.0.9 or 2.1.3. + + * The libtool (and Unix) specific version number, like 9.2.3. This is + what `freetype-config --version' returns. + + * The platform-specific shared object number, used for example when + the library is installed as `/usr/lib/libfreetype.so.6.3.2'. + +The platform-specific number is, unsurprisingly, platform-specific and +varies with the operating system you are using (several variants of +Linux, FreeBSD, Solaris, etc.). You should thus _never_ use it, even +for simple tests. + +The libtool-specific number does not equal the release number but is +tied to it. + +The release number is available at *compile* time through the following +macros defined in FT_FREETYPE_H: + + - FREETYPE_MAJOR: major release number + - FREETYPE_MINOR: minor release number + - FREETYPE_PATCH: patch release number + +See below for a small autoconf fragment. + +The release number is also available at *runtime* through the +`FT_Library_Version' API. Unfortunately, this one wasn't available or +working correctly before the 2.1.3 official release. + + +2. History +---------- + +The following table gives, for each official release, the corresponding +libtool number, as well as the shared object number found on _most_ +systems, but not all of them: + + + release libtool so + ------------------------------- + 2.3.9 9.20.3 6.3.20 + 2.3.8 9.19.3 6.3.19 + 2.3.7 9.18.3 6.3.18 + 2.3.6 9.17.3 6.3.17 + 2.3.5 9.16.3 6.3.16 + 2.3.4 9.15.3 6.3.15 + 2.3.3 9.14.3 6.3.14 + 2.3.2 9.13.3 6.3.13 + 2.3.1 9.12.3 6.3.12 + 2.3.0 9.11.3 6.3.11 + 2.2.1 9.10.3 6.3.10 + 2.2.0 9.9.3 6.3.9 + 2.1.10 9.8.3 6.3.8 + 2.1.9 9.7.3 6.3.7 + 2.1.8 9.6.3 6.3.6 + 2.1.7 9.5.3 6.3.5 + 2.1.6 9.5.3 6.3.5 + 2.1.5 9.4.3 6.3.4 + 2.1.4 9.3.3 6.3.3 + 2.1.3 9.2.3 6.3.2 + 2.1.2 9.1.3 6.3.1 + 2.1.1 9.0.3 ? + 2.1.0 8.0.2 ? + 2.0.9 9.0.3 ? + 2.0.8 8.0.2 ? + 2.0.4 7.0.1 ? + 2.0.1 6.1.0 ? + +The libtool numbers are a bit inconsistent due to the library's history: + + - 2.1.0 was created as a development branch from 2.0.8 (hence the same + libtool numbers). + + - 2.0.9 was a bug-fix release of the `stable' branch, and we + incorrectly increased its libtool number. + + - 2.1.4 was a development version, however it was stable enough to be + the basis of the 2.2.0 release. + + +3. Autoconf Code Fragment +------------------------- + +Lars Clausen contributed the following autoconf fragment to detect which +version of FreeType is installed on a system. This one tests for a +version that is at least 2.0.9; you should change it to check against +other release numbers. + + + AC_MSG_CHECKING([whether FreeType version is 2.0.9 or higher]) + old_CPPFLAGS="$CPPFLAGS" + CPPFLAGS=`freetype-config --cflags` + AC_TRY_CPP([ + +#include +#include FT_FREETYPE_H +#if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009 +#error Freetype version too low. +#endif + ], + [AC_MSG_RESULT(yes) + FREETYPE_LIBS=`freetype-config --libs` + AC_SUBST(FREETYPE_LIBS) + AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library]) + CPPFLAGS="$old_CPPFLAGS"], + [AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])]) + +------------------------------------------------------------------------ + +Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of VERSION.DLL --- diff --git a/src/3rdparty/freetype/docs/formats.txt b/src/3rdparty/freetype/docs/formats.txt new file mode 100644 index 0000000000..571f5ff502 --- /dev/null +++ b/src/3rdparty/freetype/docs/formats.txt @@ -0,0 +1,164 @@ +This file contains a list of various font formats. It gives the +reference document and whether it is supported in FreeType 2. + + + file type: + The only special case is `MAC'; on older Mac OS versions, a `file' + is stored as a data and a resource fork, this is, within two + separate data chunks. In all other cases, the font data is stored + in a single file. + + wrapper format: + The format used to represent the font data. In the table below it + is used only if the font format differs. Possible values are `SFNT' + (binary), `PS' (a text header, followed by binary or text data), and + `LZW' (compressed with either `gzip' or `compress'). + + font format: + How the font is to be accessed, possibly after converting the file + type and wrapper format into a generic form. Bitmap formats are + `BDF', `PCF', and one form of `WINFNT'; all others are vector + formats. + + font type: + Sub-formats of the font format. `SBIT' and `MACSBIT' are bitmap + formats, `MM' and `VAR' support optical axes. + + glyph access: + If not specified, the glyph access is `standard' to the font format. + Values are `CID' for CID-keyed fonts, `SYNTHETIC' for fonts which + are modified versions of other fonts by means of a transformation + matrix, `COLLECTION' for collecting multiple fonts (sharing most of + the data) into a single file, and `TYPE_0' for PS fonts which are to + be accessed in a tree-like structure. + + FreeType driver: + The module in the FreeType library which handles the specific font + format. A missing entry means that FreeType doesn't support the + font format (yet). + + +Please send additions and/or corrections to wl@gnu.org or to the +FreeType developer's list at freetype-devel@nongnu.org (for subscribers +only). If you can provide a font example for a format which isn't +supported yet please send a mail too. + + +file wrapper font font glyph FreeType reference +type format format type access driver documents +---------------------------------------------------------------------------- + +--- --- BDF --- --- bdf 5005.BDF_Spec.pdf, X11 + + +--- SFNT PS TYPE_1 --- type1 Type 1 GX Font Format + (for the Mac) [3] +MAC SFNT PS TYPE_1 --- type1 Type 1 GX Font Format + (for the Mac) [3] +--- SFNT PS TYPE_1 CID cid 5180.sfnt.pdf (for the Mac) + [3] +MAC SFNT PS TYPE_1 CID cid 5180.sfnt.pdf (for the Mac) + [3] +--- SFNT PS CFF --- cff OT spec, 5176.CFF.pdf + (`OTTO' format) +MAC SFNT PS CFF --- cff OT spec, 5176.CFF.pdf + (`OTTO' format) +--- SFNT PS CFF CID cff OT spec, 5176.CFF.pdf +MAC SFNT PS CFF CID cff OT spec, 5176.CFF.pdf +--- SFNT PS CFF SYNTHETIC --- OT spec, 5176.CFF.pdf +MAC SFNT PS CFF SYNTHETIC --- OT spec, 5176.CFF.pdf +--- SFNT TT SBIT --- sfnt XFree86 (bitmaps only; + with `head' table) +--- SFNT TT MACSBIT --- sfnt OT spec (for the Mac; + bitmaps only; `bhed' table) +MAC SFNT TT MACSBIT --- sfnt OT spec (for the Mac; + bitmaps only; `bhed' table) +--- SFNT TT --- --- truetype OT spec (`normal' TT font) +MAC SFNT TT --- --- truetype OT spec (`normal' TT font) +MAC SFNT TT VAR --- truetype GX spec (`?var' tables) +--- SFNT TT --- COLLECTION truetype OT spec (this can't be CFF) +MAC SFNT TT --- COLLECTION truetype OT spec (this can't be CFF) + + +--- --- PS TYPE_1 --- type1 T1_SPEC.pdf + (`normal' Type 1 font) +MAC --- PS TYPE_1 --- type1 T1_SPEC.pdf + (`normal' Type 1 font) +--- --- PS TYPE_1 CID cid PLRM.pdf (CID Font Type 0; + Type 9 font) +--- --- PS MM --- type1 5015.Type1_Supp.pdf + (Multiple Masters) +--- --- PS CFF --- cff 5176.CFF.pdf (`pure' CFF) +--- --- PS CFF CID cff 5176.CFF.pdf (`pure' CFF) +--- --- PS CFF SYNTHETIC --- 5176.CFF.pdf (`pure' CFF) +--- PS PS CFF --- --- PLRM.pdf (Type 2) [1] +--- PS PS CFF CID --- PLRM.pdf (Type 2) [1] +--- PS PS CFF SYNTHETIC --- PLRM.pdf (Type 2) [1] +--- --- PS --- TYPE_0 --- PLRM.pdf +--- --- PS TYPE_3 --- --- PLRM.pdf (never supported) +--- --- PS TYPE_3 CID --- PLRM.pdf (CID Font Type 1; + Type 10 font; never supported) +--- PS PS TYPE_14 --- --- PLRM.pdf (Chameleon font; + Type 14 font; never supported?) +--- --- PS TYPE_32 CID --- PLRM.pdf (CID Font Type 4; + Type 32 font; never supported?) +--- PS TT --- --- type42 5012.Type42_Spec.pdf + (Type 42 font) +--- PS TT --- CID --- PLRM.pdf (CID Font Type 2; + Type 11 font) + + +--- ? ? CEF ? cff ? + + +--- --- PCF --- --- pcf X11, [4] +--- LZW PCF --- --- pcf X11, [4] + + +--- --- PFR PFR0 --- pfr [2] +--- --- PFR PFR1 --- --- (undocumented, proprietary; + probably never supported) + + +--- --- WINFNT --- --- winfonts MS Windows 3 Developer's Notes +--- --- WINFNT VECTOR --- --- MS Windows 3 Developer's Notes + + +[1] Support should be rather simple since this is identical to `CFF' but + in a PS wrapper. + +[2] Official PFR specification: + + http://www.bitstream.com/categories/developer/truedoc/pfrspec.html + http://www.bitstream.com/categories/developer/truedoc/pfrspec1.2.pdf + + The syntax of the auxiliary data is not defined there, but is + partially defined in MHP 1.0.3 (also called ETSI TS 101812 V1.3.1) + section 7.4. + + http://www.etsi.org/ + http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=18799 + + (free registration required). + +[3] Support is rudimentary currently; some tables are not loaded yet. + +[4] There is no formal PCF specification; you have to deduce the exact + format from the source code within X11. George Williams did this for + his FontForge editor: + + http://fontforge.sourceforge.net/pcf-format.html + +------------------------------------------------------------------------ + +Copyright 2004, 2005, 2008, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of formats.txt --- diff --git a/src/3rdparty/freetype/docs/raster.txt b/src/3rdparty/freetype/docs/raster.txt new file mode 100644 index 0000000000..95d9e24010 --- /dev/null +++ b/src/3rdparty/freetype/docs/raster.txt @@ -0,0 +1,635 @@ + + How FreeType's rasterizer work + + by David Turner + + Revised 2007-Feb-01 + + +This file is an attempt to explain the internals of the FreeType +rasterizer. The rasterizer is of quite general purpose and could +easily be integrated into other programs. + + + I. Introduction + + II. Rendering Technology + 1. Requirements + 2. Profiles and Spans + a. Sweeping the Shape + b. Decomposing Outlines into Profiles + c. The Render Pool + d. Computing Profiles Extents + e. Computing Profiles Coordinates + f. Sweeping and Sorting the Spans + + +I. Introduction +=============== + + A rasterizer is a library in charge of converting a vectorial + representation of a shape into a bitmap. The FreeType rasterizer + has been originally developed to render the glyphs found in + TrueType files, made up of segments and second-order Béziers. + Meanwhile it has been extended to render third-order Bézier curves + also. This document is an explanation of its design and + implementation. + + While these explanations start from the basics, a knowledge of + common rasterization techniques is assumed. + + +II. Rendering Technology +======================== + +1. Requirements +--------------- + + We assume that all scaling, rotating, hinting, etc., has been + already done. The glyph is thus described by a list of points in + the device space. + + - All point coordinates are in the 26.6 fixed float format. The + used orientation is: + + + ^ y + | reference orientation + | + *----> x + 0 + + + `26.6' means that 26 bits are used for the integer part of a + value and 6 bits are used for the fractional part. + Consequently, the `distance' between two neighbouring pixels is + 64 `units' (1 unit = 1/64th of a pixel). + + Note that, for the rasterizer, pixel centers are located at + integer coordinates. The TrueType bytecode interpreter, + however, assumes that the lower left edge of a pixel (which is + taken to be a square with a length of 1 unit) has integer + coordinates. + + + ^ y ^ y + | | + | (1,1) | (0.5,0.5) + +-----------+ +-----+-----+ + | | | | | + | | | | | + | | | o-----+-----> x + | | | (0,0) | + | | | | + o-----------+-----> x +-----------+ + (0,0) (-0.5,-0.5) + + TrueType bytecode interpreter FreeType rasterizer + + + A pixel line in the target bitmap is called a `scanline'. + + - A glyph is usually made of several contours, also called + `outlines'. A contour is simply a closed curve that delimits an + outer or inner region of the glyph. It is described by a series + of successive points of the points table. + + Each point of the glyph has an associated flag that indicates + whether it is `on' or `off' the curve. Two successive `on' + points indicate a line segment joining the two points. + + One `off' point amidst two `on' points indicates a second-degree + (conic) Bézier parametric arc, defined by these three points + (the `off' point being the control point, and the `on' ones the + start and end points). Similarly, a third-degree (cubic) Bézier + curve is described by four points (two `off' control points + between two `on' points). + + Finally, for second-order curves only, two successive `off' + points forces the rasterizer to create, during rendering, an + `on' point amidst them, at their exact middle. This greatly + facilitates the definition of successive Bézier arcs. + + The parametric form of a second-order Bézier curve is: + + P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3 + + (P1 and P3 are the end points, P2 the control point.) + + The parametric form of a third-order Bézier curve is: + + P(t) = (1-t)^3*P1 + 3*t*(1-t)^2*P2 + 3*t^2*(1-t)*P3 + t^3*P4 + + (P1 and P4 are the end points, P2 and P3 the control points.) + + For both formulae, t is a real number in the range [0..1]. + + Note that the rasterizer does not use these formulae directly. + They exhibit, however, one very useful property of Bézier arcs: + Each point of the curve is a weighted average of the control + points. + + As all weights are positive and always sum up to 1, whatever the + value of t, each arc point lies within the triangle (polygon) + defined by the arc's three (four) control points. + + In the following, only second-order curves are discussed since + rasterization of third-order curves is completely identical. + + Here some samples for second-order curves. + + + * # on curve + * off curve + __---__ + #-__ _-- -_ + --__ _- - + --__ # \ + --__ # + -# + Two `on' points + Two `on' points and one `off' point + between them + + * + # __ Two `on' points with two `off' + \ - - points between them. The point + \ / \ marked `0' is the middle of the + - 0 \ `off' points, and is a `virtual + -_ _- # on' point where the curve passes. + -- It does not appear in the point + * list. + + +2. Profiles and Spans +--------------------- + + The following is a basic explanation of the _kind_ of computations + made by the rasterizer to build a bitmap from a vector + representation. Note that the actual implementation is slightly + different, due to performance tuning and other factors. + + However, the following ideas remain in the same category, and are + more convenient to understand. + + + a. Sweeping the Shape + + The best way to fill a shape is to decompose it into a number of + simple horizontal segments, then turn them on in the target + bitmap. These segments are called `spans'. + + __---__ + _-- -_ + _- - + - \ + / \ + / \ + | \ + + __---__ Example: filling a shape + _----------_ with spans. + _-------------- + ----------------\ + /-----------------\ This is typically done from the top + / \ to the bottom of the shape, in a + | | \ movement called a `sweep'. + V + + __---__ + _----------_ + _-------------- + ----------------\ + /-----------------\ + /-------------------\ + |---------------------\ + + + In order to draw a span, the rasterizer must compute its + coordinates, which are simply the x coordinates of the shape's + contours, taken on the y scanlines. + + + /---/ |---| Note that there are usually + /---/ |---| several spans per scanline. + | /---/ |---| + | /---/_______|---| When rendering this shape to the + V /----------------| current scanline y, we must + /-----------------| compute the x values of the + a /----| |---| points a, b, c, and d. + - - - * * - - - - * * - - y - + / / b c| |d + + + /---/ |---| + /---/ |---| And then turn on the spans a-b + /---/ |---| and c-d. + /---/_______|---| + /----------------| + /-----------------| + a /----| |---| + - - - ####### - - - - ##### - - y - + / / b c| |d + + + b. Decomposing Outlines into Profiles + + For each scanline during the sweep, we need the following + information: + + o The number of spans on the current scanline, given by the + number of shape points intersecting the scanline (these are + the points a, b, c, and d in the above example). + + o The x coordinates of these points. + + x coordinates are computed before the sweep, in a phase called + `decomposition' which converts the glyph into *profiles*. + + Put it simply, a `profile' is a contour's portion that can only + be either ascending or descending, i.e., it is monotonic in the + vertical direction (we also say y-monotonic). There is no such + thing as a horizontal profile, as we shall see. + + Here are a few examples: + + + this square + 1 2 + ---->---- is made of two + | | | | + | | profiles | | + ^ v ^ + v + | | | | + | | | | + ----<---- + + up down + + + this triangle + + P2 1 2 + + |\ is made of two | \ + ^ | \ \ | \ + | | \ \ profiles | \ | + | | \ v ^ | \ | + | \ | | + \ v + | \ | | \ + P1 ---___ \ ---___ \ + ---_\ ---_ \ + <--__ P3 up down + + + + A more general contour can be made of more than two profiles: + + __ ^ + / | / ___ / | + / | / | / | / | + | | / / => | v / / + | | | | | | ^ | + ^ | |___| | | ^ + | + | + v + | | | v | | + | | | up | + |___________| | down | + + <-- up down + + + Successive profiles are always joined by horizontal segments + that are not part of the profiles themselves. + + For the rasterizer, a profile is simply an *array* that + associates one horizontal *pixel* coordinate to each bitmap + *scanline* crossed by the contour's section containing the + profile. Note that profiles are *oriented* up or down along the + glyph's original flow orientation. + + In other graphics libraries, profiles are also called `edges' or + `edgelists'. + + + c. The Render Pool + + FreeType has been designed to be able to run well on _very_ + light systems, including embedded systems with very few memory. + + A render pool will be allocated once; the rasterizer uses this + pool for all its needs by managing this memory directly in it. + The algorithms that are used for profile computation make it + possible to use the pool as a simple growing heap. This means + that this memory management is actually quite easy and faster + than any kind of malloc()/free() combination. + + Moreover, we'll see later that the rasterizer is able, when + dealing with profiles too large and numerous to lie all at once + in the render pool, to immediately decompose recursively the + rendering process into independent sub-tasks, each taking less + memory to be performed (see `sub-banding' below). + + The render pool doesn't need to be large. A 4KByte pool is + enough for nearly all renditions, though nearly 100% slower than + a more comfortable 16KByte or 32KByte pool (that was tested with + complex glyphs at sizes over 500 pixels). + + + d. Computing Profiles Extents + + Remember that a profile is an array, associating a _scanline_ to + the x pixel coordinate of its intersection with a contour. + + Though it's not exactly how the FreeType rasterizer works, it is + convenient to think that we need a profile's height before + allocating it in the pool and computing its coordinates. + + The profile's height is the number of scanlines crossed by the + y-monotonic section of a contour. We thus need to compute these + sections from the vectorial description. In order to do that, + we are obliged to compute all (local and global) y extrema of + the glyph (minima and maxima). + + + P2 For instance, this triangle has only + two y-extrema, which are simply + |\ + | \ P2.y as a vertical maximum + | \ P3.y as a vertical minimum + | \ + | \ P1.y is not a vertical extremum (though + | \ it is a horizontal minimum, which we + P1 ---___ \ don't need). + ---_\ + P3 + + + Note that the extrema are expressed in pixel units, not in + scanlines. The triangle's height is certainly (P3.y-P2.y+1) + pixel units, but its profiles' heights are computed in + scanlines. The exact conversion is simple: + + - min scanline = FLOOR ( min y ) + - max scanline = CEILING( max y ) + + A problem arises with Bézier Arcs. While a segment is always + necessarily y-monotonic (i.e., flat, ascending, or descending), + which makes extrema computations easy, the ascent of an arc can + vary between its control points. + + + P2 + * + # on curve + * off curve + __-x--_ + _-- -_ + P1 _- - A non y-monotonic Bézier arc. + # \ + - The arc goes from P1 to P3. + \ + \ P3 + # + + + We first need to be able to easily detect non-monotonic arcs, + according to their control points. I will state here, without + proof, that the monotony condition can be expressed as: + + P1.y <= P2.y <= P3.y for an ever-ascending arc + + P1.y >= P2.y >= P3.y for an ever-descending arc + + with the special case of + + P1.y = P2.y = P3.y where the arc is said to be `flat'. + + As you can see, these conditions can be very easily tested. + They are, however, extremely important, as any arc that does not + satisfy them necessarily contains an extremum. + + Note also that a monotonic arc can contain an extremum too, + which is then one of its `on' points: + + + P1 P2 + #---__ * P1P2P3 is ever-descending, but P1 + -_ is an y-extremum. + - + ---_ \ + -> \ + \ P3 + # + + + Let's go back to our previous example: + + + P2 + * + # on curve + * off curve + __-x--_ + _-- -_ + P1 _- - A non-y-monotonic Bézier arc. + # \ + - Here we have + \ P2.y >= P1.y && + \ P3 P2.y >= P3.y (!) + # + + + We need to compute the vertical maximum of this arc to be able + to compute a profile's height (the point marked by an `x'). The + arc's equation indicates that a direct computation is possible, + but we rely on a different technique, which use will become + apparent soon. + + Bézier arcs have the special property of being very easily + decomposed into two sub-arcs, which are themselves Bézier arcs. + Moreover, it is easy to prove that there is at most one vertical + extremum on each Bézier arc (for second-degree curves; similar + conditions can be found for third-order arcs). + + For instance, the following arc P1P2P3 can be decomposed into + two sub-arcs Q1Q2Q3 and R1R2R3: + + + P2 + * + # on curve + * off curve + + + original Bézier arc P1P2P3. + __---__ + _-- --_ + _- -_ + - - + / \ + / \ + # # + P1 P3 + + + + P2 + * + + + + Q3 Decomposed into two subarcs + Q2 R2 Q1Q2Q3 and R1R2R3 + * __-#-__ * + _-- --_ + _- R1 -_ Q1 = P1 R3 = P3 + - - Q2 = (P1+P2)/2 R2 = (P2+P3)/2 + / \ + / \ Q3 = R1 = (Q2+R2)/2 + # # + Q1 R3 Note that Q2, R2, and Q3=R1 + are on a single line which is + tangent to the curve. + + + We have then decomposed a non-y-monotonic Bézier curve into two + smaller sub-arcs. Note that in the above drawing, both sub-arcs + are monotonic, and that the extremum is then Q3=R1. However, in + a more general case, only one sub-arc is guaranteed to be + monotonic. Getting back to our former example: + + + Q2 + * + + __-x--_ R1 + _-- #_ + Q1 _- Q3 - R2 + # \ * + - + \ + \ R3 + # + + + Here, we see that, though Q1Q2Q3 is still non-monotonic, R1R2R3 + is ever descending: We thus know that it doesn't contain the + extremum. We can then re-subdivide Q1Q2Q3 into two sub-arcs and + go on recursively, stopping when we encounter two monotonic + subarcs, or when the subarcs become simply too small. + + We will finally find the vertical extremum. Note that the + iterative process of finding an extremum is called `flattening'. + + + e. Computing Profiles Coordinates + + Once we have the height of each profile, we are able to allocate + it in the render pool. The next task is to compute coordinates + for each scanline. + + In the case of segments, the computation is straightforward, + using the Euclidean algorithm (also known as Bresenham). + However, for Bézier arcs, the job is a little more complicated. + + We assume that all Béziers that are part of a profile are the + result of flattening the curve, which means that they are all + y-monotonic (ascending or descending, and never flat). We now + have to compute the intersections of arcs with the profile's + scanlines. One way is to use a similar scheme to flattening + called `stepping'. + + + Consider this arc, going from P1 to + --------------------- P3. Suppose that we need to + compute its intersections with the + drawn scanlines. As already + --------------------- mentioned this can be done + directly, but the involved + * P2 _---# P3 algorithm is far too slow. + ------------- _-- -- + _- + _/ Instead, it is still possible to + ---------/----------- use the decomposition property in + / the same recursive way, i.e., + | subdivide the arc into subarcs + ------|-------------- until these get too small to cross + | more than one scanline! + | + -----|--------------- This is very easily done using a + | rasterizer-managed stack of + | subarcs. + # P1 + + + f. Sweeping and Sorting the Spans + + Once all our profiles have been computed, we begin the sweep to + build (and fill) the spans. + + As both the TrueType and Type 1 specifications use the winding + fill rule (but with opposite directions), we place, on each + scanline, the present profiles in two separate lists. + + One list, called the `left' one, only contains ascending + profiles, while the other `right' list contains the descending + profiles. + + As each glyph is made of closed curves, a simple geometric + property ensures that the two lists contain the same number of + elements. + + Creating spans is thus straightforward: + + 1. We sort each list in increasing horizontal order. + + 2. We pair each value of the left list with its corresponding + value in the right list. + + + / / | | For example, we have here + / / | | four profiles. Two of + >/ / | | | them are ascending (1 & + 1// / ^ | | | 2 3), while the two others + // // 3| | | v are descending (2 & 4). + / //4 | | | On the given scanline, + a / /< | | the left list is (1,3), + - - - *-----* - - - - *---* - - y - and the right one is + / / b c| |d (4,2) (sorted). + + There are then two spans, joining + 1 to 4 (i.e. a-b) and 3 to 2 + (i.e. c-d)! + + + Sorting doesn't necessarily take much time, as in 99 cases out + of 100, the lists' order is kept from one scanline to the next. + We can thus implement it with two simple singly-linked lists, + sorted by a classic bubble-sort, which takes a minimum amount of + time when the lists are already sorted. + + A previous version of the rasterizer used more elaborate + structures, like arrays to perform `faster' sorting. It turned + out that this old scheme is not faster than the one described + above. + + Once the spans have been `created', we can simply draw them in + the target bitmap. + +------------------------------------------------------------------------ + +Copyright 2003, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of raster.txt --- + +Local Variables: +coding: utf-8 +End: diff --git a/src/3rdparty/freetype/docs/reference/README b/src/3rdparty/freetype/docs/reference/README new file mode 100644 index 0000000000..51b04d6f15 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/README @@ -0,0 +1,5 @@ +After saying `make refdoc' this directory contains the FreeType API +reference. You need python to make this target. + +This also works with Jam: Just type `jam refdoc' in the main directory. + diff --git a/src/3rdparty/freetype/docs/reference/ft2-base_interface.html b/src/3rdparty/freetype/docs/reference/ft2-base_interface.html new file mode 100644 index 0000000000..27f454b675 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-base_interface.html @@ -0,0 +1,3409 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Base Interface +

      +

      Synopsis

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      FT_LibraryFT_IS_TRICKYFT_LOAD_XXX
      FT_FaceFT_STYLE_FLAG_XXXFT_LOAD_TARGET_XXX
      FT_SizeFT_Size_InternalFT_LOAD_TARGET_MODE
      FT_GlyphSlotFT_Size_MetricsFT_Set_Transform
      FT_CharMapFT_SizeRecFT_Render_Mode
      FT_EncodingFT_SubGlyphft_render_mode_xxx
      FT_Glyph_MetricsFT_Slot_InternalFT_Render_Glyph
      FT_Bitmap_SizeFT_GlyphSlotRecFT_Kerning_Mode
      FT_ModuleFT_Init_FreeTypeft_kerning_default
      FT_DriverFT_Done_FreeTypeft_kerning_unfitted
      FT_RendererFT_OPEN_XXXft_kerning_unscaled
      FT_ENC_TAGFT_ParameterFT_Get_Kerning
      ft_encoding_xxxFT_Open_ArgsFT_Get_Track_Kerning
      FT_CharMapRecFT_New_FaceFT_Get_Glyph_Name
      FT_Face_InternalFT_New_Memory_FaceFT_Get_Postscript_Name
      FT_FaceRecFT_Open_FaceFT_Select_Charmap
      FT_FACE_FLAG_XXXFT_Attach_FileFT_Set_Charmap
      FT_HAS_HORIZONTALFT_Attach_StreamFT_Get_Charmap_Index
      FT_HAS_VERTICALFT_Done_FaceFT_Get_Char_Index
      FT_HAS_KERNINGFT_Select_SizeFT_Get_First_Char
      FT_IS_SCALABLEFT_Size_Request_TypeFT_Get_Next_Char
      FT_IS_SFNTFT_Size_RequestRecFT_Get_Name_Index
      FT_IS_FIXED_WIDTHFT_Size_RequestFT_SUBGLYPH_FLAG_XXX
      FT_HAS_FIXED_SIZESFT_Request_SizeFT_Get_SubGlyph_Info
      FT_HAS_FAST_GLYPHSFT_Set_Char_SizeFT_FSTYPE_XXX
      FT_HAS_GLYPH_NAMESFT_Set_Pixel_SizesFT_Get_FSType_Flags
      FT_HAS_MULTIPLE_MASTERSFT_Load_Glyph
      FT_IS_CID_KEYEDFT_Load_Char


      + +
      +

      This section describes the public high-level API of FreeType 2.

      +

      +
      +

      FT_Library

      +
      +

      A handle to a FreeType library instance. Each ‘library’ is completely independent from the others; it is the ‘root’ of a set of objects like fonts, faces, sizes, etc.

      +

      It also embeds a memory manager (see FT_Memory), as well as a scan-line converter object (see FT_Raster).

      +

      For multi-threading applications each thread should have its own FT_Library object.

      +

      +
      note
      +

      Library objects are normally created by FT_Init_FreeType, and destroyed with FT_Done_FreeType.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Face

      +
      +

      A handle to a given typographic face object. A face object models a given typeface, in a given style.

      +

      +
      note
      +

      Each face object also owns a single FT_GlyphSlot object, as well as one or more FT_Size objects.

      +

      Use FT_New_Face or FT_Open_Face to create a new face object from a given filepathname or a custom input stream.

      +

      Use FT_Done_Face to destroy it (along with its slot and sizes).

      +
      +
      also
      +

      See FT_FaceRec for the publicly accessible fields of a given face object.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Size

      +
      +

      A handle to an object used to model a face scaled to a given character size.

      +

      +
      note
      +

      Each FT_Face has an active FT_Size object that is used by functions like FT_Load_Glyph to determine the scaling transformation which is used to load and hint glyphs and metrics.

      +

      You can use FT_Set_Char_Size, FT_Set_Pixel_Sizes, FT_Request_Size or even FT_Select_Size to change the content (i.e., the scaling values) of the active FT_Size.

      +

      You can use FT_New_Size to create additional size objects for a given FT_Face, but they won't be used by other functions until you activate it through FT_Activate_Size. Only one size can be activated at any given time per face.

      +
      +
      also
      +

      See FT_SizeRec for the publicly accessible fields of a given size object.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GlyphSlot

      +
      +

      A handle to a given ‘glyph slot’. A slot is a container where it is possible to load any of the glyphs contained in its parent face.

      +

      In other words, each time you call FT_Load_Glyph or FT_Load_Char, the slot's content is erased by the new glyph data, i.e., the glyph's metrics, its image (bitmap or outline), and other control information.

      +

      +
      also
      +

      See FT_GlyphSlotRec for the publicly accessible glyph fields.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CharMap

      +
      +

      A handle to a given character map. A charmap is used to translate character codes in a given encoding into glyph indexes for its parent's face. Some font formats may provide several charmaps per font.

      +

      Each face object owns zero or more charmaps, but only one of them can be ‘active’ and used by FT_Get_Char_Index or FT_Load_Char.

      +

      The list of available charmaps in a face is available through the ‘face->num_charmaps’ and ‘face->charmaps’ fields of FT_FaceRec.

      +

      The currently active charmap is available as ‘face->charmap’. You should call FT_Set_Charmap to change it.

      +

      +
      note
      +

      When a new face is created (either through FT_New_Face or FT_Open_Face), the library looks for a Unicode charmap within the list and automatically activates it.

      +
      +
      also
      +

      See FT_CharMapRec for the publicly accessible fields of a given character map.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Encoding

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef enum  FT_Encoding_
      +  {
      +    FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
      +
      +    FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
      +    FT_ENC_TAG( FT_ENCODING_UNICODE,   'u', 'n', 'i', 'c' ),
      +
      +    FT_ENC_TAG( FT_ENCODING_SJIS,    's', 'j', 'i', 's' ),
      +    FT_ENC_TAG( FT_ENCODING_GB2312,  'g', 'b', ' ', ' ' ),
      +    FT_ENC_TAG( FT_ENCODING_BIG5,    'b', 'i', 'g', '5' ),
      +    FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
      +    FT_ENC_TAG( FT_ENCODING_JOHAB,   'j', 'o', 'h', 'a' ),
      +
      +    /* for backwards compatibility */
      +    FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,
      +    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,
      +    FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,
      +    FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
      +    FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,
      +
      +    FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
      +    FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT,   'A', 'D', 'B', 'E' ),
      +    FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM,   'A', 'D', 'B', 'C' ),
      +    FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1,  'l', 'a', 't', '1' ),
      +
      +    FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
      +
      +    FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
      +
      +  } FT_Encoding;
      +
      +

      +
      +

      An enumeration used to specify character sets supported by charmaps. Used in the FT_Select_Charmap API function.

      +

      +
      note
      +

      Despite the name, this enumeration lists specific character repertories (i.e., charsets), and not text encoding methods (e.g., UTF-8, UTF-16, GB2312_EUC, etc.).

      +

      Because of 32-bit charcodes defined in Unicode (i.e., surrogates), all character codes must be expressed as FT_Longs.

      +

      Other encodings might be defined in the future.

      +
      +
      values
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      FT_ENCODING_NONE +

      The encoding value 0 is reserved.

      +
      FT_ENCODING_UNICODE +

      Corresponds to the Unicode character set. This value covers all versions of the Unicode repertoire, including ASCII and Latin-1. Most fonts include a Unicode charmap, but not all of them.

      +
      FT_ENCODING_MS_SYMBOL +

      Corresponds to the Microsoft Symbol encoding, used to encode mathematical symbols in the 32..255 character code range. For more information, see ‘http://www.ceviz.net/symbol.htm’.

      +
      FT_ENCODING_SJIS +

      Corresponds to Japanese SJIS encoding. More info at at ‘http://langsupport.japanreference.com/encoding.shtml’. See note on multi-byte encodings below.

      +
      FT_ENCODING_GB2312 +

      Corresponds to an encoding system for Simplified Chinese as used used in mainland China.

      +
      FT_ENCODING_BIG5 +

      Corresponds to an encoding system for Traditional Chinese as used in Taiwan and Hong Kong.

      +
      FT_ENCODING_WANSUNG +

      Corresponds to the Korean encoding system known as Wansung. For more information see ‘http://www.microsoft.com/typography/unicode/949.txt’.

      +
      FT_ENCODING_JOHAB +

      The Korean standard character set (KS C 5601-1992), which corresponds to MS Windows code page 1361. This character set includes all possible Hangeul character combinations.

      +
      FT_ENCODING_ADOBE_LATIN_1
      +

      Corresponds to a Latin-1 encoding as defined in a Type 1 PostScript font. It is limited to 256 character codes.

      +
      FT_ENCODING_ADOBE_STANDARD
      +

      Corresponds to the Adobe Standard encoding, as found in Type 1, CFF, and OpenType/CFF fonts. It is limited to 256 character codes.

      +
      FT_ENCODING_ADOBE_EXPERT
      +

      Corresponds to the Adobe Expert encoding, as found in Type 1, CFF, and OpenType/CFF fonts. It is limited to 256 character codes.

      +
      FT_ENCODING_ADOBE_CUSTOM
      +

      Corresponds to a custom encoding, as found in Type 1, CFF, and OpenType/CFF fonts. It is limited to 256 character codes.

      +
      FT_ENCODING_APPLE_ROMAN
      +

      Corresponds to the 8-bit Apple roman encoding. Many TrueType and OpenType fonts contain a charmap for this encoding, since older versions of Mac OS are able to use it.

      +
      FT_ENCODING_OLD_LATIN_2
      +

      This value is deprecated and was never used nor reported by FreeType. Don't use or test for it.

      +
      FT_ENCODING_MS_SJIS +

      Same as FT_ENCODING_SJIS. Deprecated.

      +
      FT_ENCODING_MS_GB2312 +

      Same as FT_ENCODING_GB2312. Deprecated.

      +
      FT_ENCODING_MS_BIG5 +

      Same as FT_ENCODING_BIG5. Deprecated.

      +
      FT_ENCODING_MS_WANSUNG +

      Same as FT_ENCODING_WANSUNG. Deprecated.

      +
      FT_ENCODING_MS_JOHAB +

      Same as FT_ENCODING_JOHAB. Deprecated.

      +
      +
      +
      note
      +

      By default, FreeType automatically synthesizes a Unicode charmap for PostScript fonts, using their glyph names dictionaries. However, it also reports the encodings defined explicitly in the font file, for the cases when they are needed, with the Adobe values as well.

      +

      FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap is neither Unicode nor ISO-8859-1 (otherwise it is set to FT_ENCODING_UNICODE). Use FT_Get_BDF_Charset_ID to find out which encoding is really present. If, for example, the ‘cs_registry’ field is ‘KOI8’ and the ‘cs_encoding’ field is ‘R’, the font is encoded in KOI8-R.

      +

      FT_ENCODING_NONE is always set (with a single exception) by the winfonts driver. Use FT_Get_WinFNT_Header and examine the ‘charset’ field of the FT_WinFNT_HeaderRec structure to find out which encoding is really present. For example, FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for Russian).

      +

      FT_ENCODING_NONE is set if ‘platform_id’ is TT_PLATFORM_MACINTOSH and ‘encoding_id’ is not TT_MAC_ID_ROMAN (otherwise it is set to FT_ENCODING_APPLE_ROMAN).

      +

      If ‘platform_id’ is TT_PLATFORM_MACINTOSH, use the function FT_Get_CMap_Language_ID to query the Mac language ID which may be needed to be able to distinguish Apple encoding variants. See

      +

      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT

      +

      to get an idea how to do that. Basically, if the language ID is 0, don't use it, otherwise subtract 1 from the language ID. Then examine ‘encoding_id’. If, for example, ‘encoding_id’ is TT_MAC_ID_ROMAN and the language ID (minus 1) is ‘TT_MAC_LANGID_GREEK’, it is the Greek encoding, not Roman. TT_MAC_ID_ARABIC with ‘TT_MAC_LANGID_FARSI’ means the Farsi variant the Arabic encoding.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_Metrics

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_Glyph_Metrics_
      +  {
      +    FT_Pos  width;
      +    FT_Pos  height;
      +
      +    FT_Pos  horiBearingX;
      +    FT_Pos  horiBearingY;
      +    FT_Pos  horiAdvance;
      +
      +    FT_Pos  vertBearingX;
      +    FT_Pos  vertBearingY;
      +    FT_Pos  vertAdvance;
      +
      +  } FT_Glyph_Metrics;
      +
      +

      +
      +

      A structure used to model the metrics of a single glyph. The values are expressed in 26.6 fractional pixel format; if the flag FT_LOAD_NO_SCALE has been used while loading the glyph, values are expressed in font units instead.

      +

      +
      fields
      +

      + + + + + + + + + +
      width +

      The glyph's width.

      +
      height +

      The glyph's height.

      +
      horiBearingX +

      Left side bearing for horizontal layout.

      +
      horiBearingY +

      Top side bearing for horizontal layout.

      +
      horiAdvance +

      Advance width for horizontal layout.

      +
      vertBearingX +

      Left side bearing for vertical layout.

      +
      vertBearingY +

      Top side bearing for vertical layout.

      +
      vertAdvance +

      Advance height for vertical layout.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Bitmap_Size

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_Bitmap_Size_
      +  {
      +    FT_Short  height;
      +    FT_Short  width;
      +
      +    FT_Pos    size;
      +
      +    FT_Pos    x_ppem;
      +    FT_Pos    y_ppem;
      +
      +  } FT_Bitmap_Size;
      +
      +

      +
      +

      This structure models the metrics of a bitmap strike (i.e., a set of glyphs for a given point size and resolution) in a bitmap font. It is used for the ‘available_sizes’ field of FT_Face.

      +

      +
      fields
      +

      + + + + + + +
      height +

      The vertical distance, in pixels, between two consecutive baselines. It is always positive.

      +
      width +

      The average width, in pixels, of all glyphs in the strike.

      +
      size +

      The nominal size of the strike in 26.6 fractional points. This field is not very useful.

      +
      x_ppem +

      The horizontal ppem (nominal width) in 26.6 fractional pixels.

      +
      y_ppem +

      The vertical ppem (nominal height) in 26.6 fractional pixels.

      +
      +
      +
      note
      +

      Windows FNT: The nominal size given in a FNT font is not reliable. Thus when the driver finds it incorrect, it sets ‘size’ to some calculated values and sets ‘x_ppem’ and ‘y_ppem’ to the pixel width and height given in the font, respectively.

      +

      TrueType embedded bitmaps: ‘size’, ‘width’, and ‘height’ values are not contained in the bitmap strike itself. They are computed from the global font parameters.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Module

      +
      +

      A handle to a given FreeType module object. Each module can be a font driver, a renderer, or anything else that provides services to the formers.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Driver

      +
      +

      A handle to a given FreeType font driver object. Each font driver is a special module capable of creating faces from font files.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Renderer

      +
      +

      A handle to a given FreeType renderer. A renderer is a special module in charge of converting a glyph image to a bitmap, when necessary. Each renderer supports a given glyph image format, and one or more target surface depths.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ENC_TAG

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#ifndef FT_ENC_TAG
      +#define FT_ENC_TAG( value, a, b, c, d )         \
      +          value = ( ( (FT_UInt32)(a) << 24 ) |  \
      +                    ( (FT_UInt32)(b) << 16 ) |  \
      +                    ( (FT_UInt32)(c) <<  8 ) |  \
      +                      (FT_UInt32)(d)         )
      +
      +#endif /* FT_ENC_TAG */
      +
      +

      +
      +

      This macro converts four-letter tags into an unsigned long. It is used to define ‘encoding’ identifiers (see FT_Encoding).

      +

      +
      note
      +

      Since many 16-bit compilers don't like 32-bit enumerations, you should redefine this macro in case of problems to something like this:

      +
      +  #define FT_ENC_TAG( value, a, b, c, d )  value                   
      +
      +

      to get a simple enumeration without assigning special numbers.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_encoding_xxx

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define ft_encoding_none            FT_ENCODING_NONE
      +#define ft_encoding_unicode         FT_ENCODING_UNICODE
      +#define ft_encoding_symbol          FT_ENCODING_MS_SYMBOL
      +#define ft_encoding_latin_1         FT_ENCODING_ADOBE_LATIN_1
      +#define ft_encoding_latin_2         FT_ENCODING_OLD_LATIN_2
      +#define ft_encoding_sjis            FT_ENCODING_SJIS
      +#define ft_encoding_gb2312          FT_ENCODING_GB2312
      +#define ft_encoding_big5            FT_ENCODING_BIG5
      +#define ft_encoding_wansung         FT_ENCODING_WANSUNG
      +#define ft_encoding_johab           FT_ENCODING_JOHAB
      +
      +#define ft_encoding_adobe_standard  FT_ENCODING_ADOBE_STANDARD
      +#define ft_encoding_adobe_expert    FT_ENCODING_ADOBE_EXPERT
      +#define ft_encoding_adobe_custom    FT_ENCODING_ADOBE_CUSTOM
      +#define ft_encoding_apple_roman     FT_ENCODING_APPLE_ROMAN
      +
      +

      +
      +

      These constants are deprecated; use the corresponding FT_Encoding values instead.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CharMapRec

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_CharMapRec_
      +  {
      +    FT_Face      face;
      +    FT_Encoding  encoding;
      +    FT_UShort    platform_id;
      +    FT_UShort    encoding_id;
      +
      +  } FT_CharMapRec;
      +
      +

      +
      +

      The base charmap structure.

      +

      +
      fields
      +

      + + + + + +
      face +

      A handle to the parent face object.

      +
      encoding +

      An FT_Encoding tag identifying the charmap. Use this with FT_Select_Charmap.

      +
      platform_id +

      An ID number describing the platform for the following encoding ID. This comes directly from the TrueType specification and should be emulated for other formats.

      +
      encoding_id +

      A platform specific encoding number. This also comes from the TrueType specification and should be emulated similarly.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Face_Internal

      +
      +

      An opaque handle to an ‘FT_Face_InternalRec’ structure, used to model private data of a given FT_Face object.

      +

      This structure might change between releases of FreeType 2 and is not generally available to client applications.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_FaceRec

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_FaceRec_
      +  {
      +    FT_Long           num_faces;
      +    FT_Long           face_index;
      +
      +    FT_Long           face_flags;
      +    FT_Long           style_flags;
      +
      +    FT_Long           num_glyphs;
      +
      +    FT_String*        family_name;
      +    FT_String*        style_name;
      +
      +    FT_Int            num_fixed_sizes;
      +    FT_Bitmap_Size*   available_sizes;
      +
      +    FT_Int            num_charmaps;
      +    FT_CharMap*       charmaps;
      +
      +    FT_Generic        generic;
      +
      +    /*# The following member variables (down to `underline_thickness') */
      +    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */
      +    /*# for bitmap fonts.                                              */
      +    FT_BBox           bbox;
      +
      +    FT_UShort         units_per_EM;
      +    FT_Short          ascender;
      +    FT_Short          descender;
      +    FT_Short          height;
      +
      +    FT_Short          max_advance_width;
      +    FT_Short          max_advance_height;
      +
      +    FT_Short          underline_position;
      +    FT_Short          underline_thickness;
      +
      +    FT_GlyphSlot      glyph;
      +    FT_Size           size;
      +    FT_CharMap        charmap;
      +
      +    /*@private begin */
      +
      +    FT_Driver         driver;
      +    FT_Memory         memory;
      +    FT_Stream         stream;
      +
      +    FT_ListRec        sizes_list;
      +
      +    FT_Generic        autohint;
      +    void*             extensions;
      +
      +    FT_Face_Internal  internal;
      +
      +    /*@private end */
      +
      +  } FT_FaceRec;
      +
      +

      +
      +

      FreeType root face class structure. A face object models a typeface in a font file.

      +

      +
      fields
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + +
      num_faces +

      The number of faces in the font file. Some font formats can have multiple faces in a font file.

      +
      face_index +

      The index of the face in the font file. It is set to 0 if there is only one face in the font file.

      +
      face_flags +

      A set of bit flags that give important information about the face; see FT_FACE_FLAG_XXX for the details.

      +
      style_flags +

      A set of bit flags indicating the style of the face; see FT_STYLE_FLAG_XXX for the details.

      +
      num_glyphs +

      The number of glyphs in the face. If the face is scalable and has sbits (see ‘num_fixed_sizes’), it is set to the number of outline glyphs.

      +

      For CID-keyed fonts, this value gives the highest CID used in the font.

      +
      family_name +

      The face's family name. This is an ASCII string, usually in English, which describes the typeface's family (like ‘Times New Roman’, ‘Bodoni’, ‘Garamond’, etc). This is a least common denominator used to list fonts. Some formats (TrueType & OpenType) provide localized and Unicode versions of this string. Applications should use the format specific interface to access them. Can be NULL (e.g., in fonts embedded in a PDF file).

      +
      style_name +

      The face's style name. This is an ASCII string, usually in English, which describes the typeface's style (like ‘Italic’, ‘Bold’, ‘Condensed’, etc). Not all font formats provide a style name, so this field is optional, and can be set to NULL. As for ‘family_name’, some formats provide localized and Unicode versions of this string. Applications should use the format specific interface to access them.

      +
      num_fixed_sizes +

      The number of bitmap strikes in the face. Even if the face is scalable, there might still be bitmap strikes, which are called ‘sbits’ in that case.

      +
      available_sizes +

      An array of FT_Bitmap_Size for all bitmap strikes in the face. It is set to NULL if there is no bitmap strike.

      +
      num_charmaps +

      The number of charmaps in the face.

      +
      charmaps +

      An array of the charmaps of the face.

      +
      generic +

      A field reserved for client uses. See the FT_Generic type description.

      +
      bbox +

      The font bounding box. Coordinates are expressed in font units (see ‘units_per_EM’). The box is large enough to contain any glyph from the font. Thus, ‘bbox.yMax’ can be seen as the ‘maximal ascender’, and ‘bbox.yMin’ as the ‘minimal descender’. Only relevant for scalable formats.

      +

      Note that the bounding box might be off by (at least) one pixel for hinted fonts. See FT_Size_Metrics for further discussion.

      +
      units_per_EM +

      The number of font units per EM square for this face. This is typically 2048 for TrueType fonts, and 1000 for Type 1 fonts. Only relevant for scalable formats.

      +
      ascender +

      The typographic ascender of the face, expressed in font units. For font formats not having this information, it is set to ‘bbox.yMax’. Only relevant for scalable formats.

      +
      descender +

      The typographic descender of the face, expressed in font units. For font formats not having this information, it is set to ‘bbox.yMin’. Note that this field is usually negative. Only relevant for scalable formats.

      +
      height +

      The height is the vertical distance between two consecutive baselines, expressed in font units. It is always positive. Only relevant for scalable formats.

      +
      max_advance_width +

      The maximal advance width, in font units, for all glyphs in this face. This can be used to make word wrapping computations faster. Only relevant for scalable formats.

      +
      max_advance_height +

      The maximal advance height, in font units, for all glyphs in this face. This is only relevant for vertical layouts, and is set to ‘height’ for fonts that do not provide vertical metrics. Only relevant for scalable formats.

      +
      underline_position +

      The position, in font units, of the underline line for this face. It is the center of the underlining stem. Only relevant for scalable formats.

      +
      underline_thickness +

      The thickness, in font units, of the underline for this face. Only relevant for scalable formats.

      +
      glyph +

      The face's associated glyph slot(s).

      +
      size +

      The current active size for this face.

      +
      charmap +

      The current active charmap for this face.

      +
      +
      +
      note
      +

      Fields may be changed after a call to FT_Attach_File or FT_Attach_Stream.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_FACE_FLAG_XXX

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )
      +#define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )
      +#define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )
      +#define FT_FACE_FLAG_SFNT              ( 1L <<  3 )
      +#define FT_FACE_FLAG_HORIZONTAL        ( 1L <<  4 )
      +#define FT_FACE_FLAG_VERTICAL          ( 1L <<  5 )
      +#define FT_FACE_FLAG_KERNING           ( 1L <<  6 )
      +#define FT_FACE_FLAG_FAST_GLYPHS       ( 1L <<  7 )
      +#define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )
      +#define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )
      +#define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )
      +#define FT_FACE_FLAG_HINTER            ( 1L << 11 )
      +#define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )
      +#define FT_FACE_FLAG_TRICKY            ( 1L << 13 )
      +
      +

      +
      +

      A list of bit flags used in the ‘face_flags’ field of the FT_FaceRec structure. They inform client applications of properties of the corresponding face.

      +

      +
      values
      +

      + + + + + + + + + + + + + + + + + + + + + + +
      FT_FACE_FLAG_SCALABLE +

      Indicates that the face contains outline glyphs. This doesn't prevent bitmap strikes, i.e., a face can have both this and and FT_FACE_FLAG_FIXED_SIZES set.

      +
      FT_FACE_FLAG_FIXED_SIZES
      +

      Indicates that the face contains bitmap strikes. See also the ‘num_fixed_sizes’ and ‘available_sizes’ fields of FT_FaceRec.

      +
      FT_FACE_FLAG_FIXED_WIDTH
      +

      Indicates that the face contains fixed-width characters (like Courier, Lucido, MonoType, etc.).

      +
      FT_FACE_FLAG_SFNT +

      Indicates that the face uses the ‘sfnt’ storage scheme. For now, this means TrueType and OpenType.

      +
      FT_FACE_FLAG_HORIZONTAL
      +

      Indicates that the face contains horizontal glyph metrics. This should be set for all common formats.

      +
      FT_FACE_FLAG_VERTICAL +

      Indicates that the face contains vertical glyph metrics. This is only available in some formats, not all of them.

      +
      FT_FACE_FLAG_KERNING +

      Indicates that the face contains kerning information. If set, the kerning distance can be retrieved through the function FT_Get_Kerning. Otherwise the function always return the vector (0,0). Note that FreeType doesn't handle kerning data from the ‘GPOS’ table (as present in some OpenType fonts).

      +
      FT_FACE_FLAG_FAST_GLYPHS
      +

      THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT.

      +
      FT_FACE_FLAG_MULTIPLE_MASTERS
      +

      Indicates that the font contains multiple masters and is capable of interpolating between them. See the multiple-masters specific API for details.

      +
      FT_FACE_FLAG_GLYPH_NAMES
      +

      Indicates that the font contains glyph names that can be retrieved through FT_Get_Glyph_Name. Note that some TrueType fonts contain broken glyph name tables. Use the function FT_Has_PS_Glyph_Names when needed.

      +
      FT_FACE_FLAG_EXTERNAL_STREAM
      +

      Used internally by FreeType to indicate that a face's stream was provided by the client application and should not be destroyed when FT_Done_Face is called. Don't read or test this flag.

      +
      FT_FACE_FLAG_HINTER +

      Set if the font driver has a hinting machine of its own. For example, with TrueType fonts, it makes sense to use data from the SFNT ‘gasp’ table only if the native TrueType hinting engine (with the bytecode interpreter) is available and active.

      +
      FT_FACE_FLAG_CID_KEYED +

      Set if the font is CID-keyed. In that case, the font is not accessed by glyph indices but by CID values. For subsetted CID-keyed fonts this has the consequence that not all index values are a valid argument to FT_Load_Glyph. Only the CID values for which corresponding glyphs in the subsetted font exist make FT_Load_Glyph return successfully; in all other cases you get an ‘FT_Err_Invalid_Argument’ error.

      +

      Note that CID-keyed fonts which are in an SFNT wrapper don't have this flag set since the glyphs are accessed in the normal way (using contiguous indices); the ‘CID-ness’ isn't visible to the application.

      +
      FT_FACE_FLAG_TRICKY +

      Set if the font is ‘tricky’, this is, it always needs the font format's native hinting engine to get a reasonable result. A typical example is the Chinese font ‘mingli.ttf’ which uses TrueType bytecode instructions to move and scale all of its subglyphs.

      +

      It is not possible to autohint such fonts using FT_LOAD_FORCE_AUTOHINT; it will also ignore FT_LOAD_NO_HINTING. You have to set both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT to really disable hinting; however, you probably never want this except for demonstration purposes.

      +

      Currently, there are six TrueType fonts in the list of tricky fonts; they are hard-coded in file ‘ttobjs.c’.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_HAS_HORIZONTAL

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_HAS_HORIZONTAL( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains horizontal metrics (this is true for all font formats though).

      +

      +
      also
      +

      FT_HAS_VERTICAL can be used to check for vertical metrics.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_HAS_VERTICAL

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_HAS_VERTICAL( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_VERTICAL )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains vertical metrics.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_HAS_KERNING

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_HAS_KERNING( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_KERNING )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains kerning data that can be accessed with FT_Get_Kerning.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_IS_SCALABLE

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_IS_SCALABLE( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_SCALABLE )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains a scalable font face (true for TrueType, Type 1, Type 42, CID, OpenType/CFF, and PFR font formats.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_IS_SFNT

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_IS_SFNT( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_SFNT )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains a font whose format is based on the SFNT storage scheme. This usually means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded bitmap fonts.

      +

      If this macro is true, all functions defined in FT_SFNT_NAMES_H and FT_TRUETYPE_TABLES_H are available.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_IS_FIXED_WIDTH

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_IS_FIXED_WIDTH( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains a font face that contains fixed-width (or ‘monospace’, ‘fixed-pitch’, etc.) glyphs.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_HAS_FIXED_SIZES

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_HAS_FIXED_SIZES( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains some embedded bitmaps. See the ‘available_sizes’ field of the FT_FaceRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_HAS_FAST_GLYPHS

      +
      +

      Deprecated.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_HAS_GLYPH_NAMES

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_HAS_GLYPH_NAMES( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains some glyph names that can be accessed through FT_Get_Glyph_Name.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_HAS_MULTIPLE_MASTERS

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_HAS_MULTIPLE_MASTERS( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains some multiple masters. The functions provided by FT_MULTIPLE_MASTERS_H are then available to choose the exact design you want.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_IS_CID_KEYED

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_IS_CID_KEYED( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_CID_KEYED )
      +
      +

      +
      +

      A macro that returns true whenever a face object contains a CID-keyed font. See the discussion of FT_FACE_FLAG_CID_KEYED for more details.

      +

      If this macro is true, all functions defined in FT_CID_H are available.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_IS_TRICKY

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_IS_TRICKY( face ) \
      +          ( face->face_flags & FT_FACE_FLAG_TRICKY )
      +
      +

      +
      +

      A macro that returns true whenever a face represents a ‘tricky’ font. See the discussion of FT_FACE_FLAG_TRICKY for more details.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_STYLE_FLAG_XXX

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )
      +#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )
      +
      +

      +
      +

      A list of bit-flags used to indicate the style of a given face. These are used in the ‘style_flags’ field of FT_FaceRec.

      +

      +
      values
      +

      + + + +
      FT_STYLE_FLAG_ITALIC +

      Indicates that a given face style is italic or oblique.

      +
      FT_STYLE_FLAG_BOLD +

      Indicates that a given face is bold.

      +
      +
      +
      note
      +

      The style information as provided by FreeType is very basic. More details are beyond the scope and should be done on a higher level (for example, by analyzing various fields of the ‘OS/2’ table in SFNT based fonts).

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Size_Internal

      +
      +

      An opaque handle to an ‘FT_Size_InternalRec’ structure, used to model private data of a given FT_Size object.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Size_Metrics

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_Size_Metrics_
      +  {
      +    FT_UShort  x_ppem;      /* horizontal pixels per EM               */
      +    FT_UShort  y_ppem;      /* vertical pixels per EM                 */
      +
      +    FT_Fixed   x_scale;     /* scaling values used to convert font    */
      +    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */
      +
      +    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */
      +    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */
      +    FT_Pos     height;      /* text height in 26.6 frac. pixels       */
      +    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */
      +
      +  } FT_Size_Metrics;
      +
      +

      +
      +

      The size metrics structure gives the metrics of a size object.

      +

      +
      fields
      +

      + + + + + + + + + +
      x_ppem +

      The width of the scaled EM square in pixels, hence the term ‘ppem’ (pixels per EM). It is also referred to as ‘nominal width’.

      +
      y_ppem +

      The height of the scaled EM square in pixels, hence the term ‘ppem’ (pixels per EM). It is also referred to as ‘nominal height’.

      +
      x_scale +

      A 16.16 fractional scaling value used to convert horizontal metrics from font units to 26.6 fractional pixels. Only relevant for scalable font formats.

      +
      y_scale +

      A 16.16 fractional scaling value used to convert vertical metrics from font units to 26.6 fractional pixels. Only relevant for scalable font formats.

      +
      ascender +

      The ascender in 26.6 fractional pixels. See FT_FaceRec for the details.

      +
      descender +

      The descender in 26.6 fractional pixels. See FT_FaceRec for the details.

      +
      height +

      The height in 26.6 fractional pixels. See FT_FaceRec for the details.

      +
      max_advance +

      The maximal advance width in 26.6 fractional pixels. See FT_FaceRec for the details.

      +
      +
      +
      note
      +

      The scaling values, if relevant, are determined first during a size changing operation. The remaining fields are then set by the driver. For scalable formats, they are usually set to scaled values of the corresponding fields in FT_FaceRec.

      +

      Note that due to glyph hinting, these values might not be exact for certain fonts. Thus they must be treated as unreliable with an error margin of at least one pixel!

      +

      Indeed, the only way to get the exact metrics is to render all glyphs. As this would be a definite performance hit, it is up to client applications to perform such computations.

      +

      The FT_Size_Metrics structure is valid for bitmap fonts also.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_SizeRec

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_SizeRec_
      +  {
      +    FT_Face           face;      /* parent face object              */
      +    FT_Generic        generic;   /* generic pointer for client uses */
      +    FT_Size_Metrics   metrics;   /* size metrics                    */
      +    FT_Size_Internal  internal;
      +
      +  } FT_SizeRec;
      +
      +

      +
      +

      FreeType root size class structure. A size object models a face object at a given size.

      +

      +
      fields
      +

      + + + + +
      face +

      Handle to the parent face object.

      +
      generic +

      A typeless pointer, which is unused by the FreeType library or any of its drivers. It can be used by client applications to link their own data to each size object.

      +
      metrics +

      Metrics for this size object. This field is read-only.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_SubGlyph

      +
      +

      The subglyph structure is an internal object used to describe subglyphs (for example, in the case of composites).

      +

      +
      note
      +

      The subglyph implementation is not part of the high-level API, hence the forward structure declaration.

      +

      You can however retrieve subglyph information with FT_Get_SubGlyph_Info.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Slot_Internal

      +
      +

      An opaque handle to an ‘FT_Slot_InternalRec’ structure, used to model private data of a given FT_GlyphSlot object.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GlyphSlotRec

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_GlyphSlotRec_
      +  {
      +    FT_Library        library;
      +    FT_Face           face;
      +    FT_GlyphSlot      next;
      +    FT_UInt           reserved;       /* retained for binary compatibility */
      +    FT_Generic        generic;
      +
      +    FT_Glyph_Metrics  metrics;
      +    FT_Fixed          linearHoriAdvance;
      +    FT_Fixed          linearVertAdvance;
      +    FT_Vector         advance;
      +
      +    FT_Glyph_Format   format;
      +
      +    FT_Bitmap         bitmap;
      +    FT_Int            bitmap_left;
      +    FT_Int            bitmap_top;
      +
      +    FT_Outline        outline;
      +
      +    FT_UInt           num_subglyphs;
      +    FT_SubGlyph       subglyphs;
      +
      +    void*             control_data;
      +    long              control_len;
      +
      +    FT_Pos            lsb_delta;
      +    FT_Pos            rsb_delta;
      +
      +    void*             other;
      +
      +    FT_Slot_Internal  internal;
      +
      +  } FT_GlyphSlotRec;
      +
      +

      +
      +

      FreeType root glyph slot class structure. A glyph slot is a container where individual glyphs can be loaded, be they in outline or bitmap format.

      +

      +
      fields
      +

      + + + + + + + + + + + + + + + + + + + + + +
      library +

      A handle to the FreeType library instance this slot belongs to.

      +
      face +

      A handle to the parent face object.

      +
      next +

      In some cases (like some font tools), several glyph slots per face object can be a good thing. As this is rare, the glyph slots are listed through a direct, single-linked list using its ‘next’ field.

      +
      generic +

      A typeless pointer which is unused by the FreeType library or any of its drivers. It can be used by client applications to link their own data to each glyph slot object.

      +
      metrics +

      The metrics of the last loaded glyph in the slot. The returned values depend on the last load flags (see the FT_Load_Glyph API function) and can be expressed either in 26.6 fractional pixels or font units.

      +

      Note that even when the glyph image is transformed, the metrics are not.

      +
      linearHoriAdvance +

      The advance width of the unhinted glyph. Its value is expressed in 16.16 fractional pixels, unless FT_LOAD_LINEAR_DESIGN is set when loading the glyph. This field can be important to perform correct WYSIWYG layout. Only relevant for outline glyphs.

      +
      linearVertAdvance +

      The advance height of the unhinted glyph. Its value is expressed in 16.16 fractional pixels, unless FT_LOAD_LINEAR_DESIGN is set when loading the glyph. This field can be important to perform correct WYSIWYG layout. Only relevant for outline glyphs.

      +
      advance +

      This is the transformed advance width for the glyph (in 26.6 fractional pixel format).

      +
      format +

      This field indicates the format of the image contained in the glyph slot. Typically FT_GLYPH_FORMAT_BITMAP, FT_GLYPH_FORMAT_OUTLINE, or FT_GLYPH_FORMAT_COMPOSITE, but others are possible.

      +
      bitmap +

      This field is used as a bitmap descriptor when the slot format is FT_GLYPH_FORMAT_BITMAP. Note that the address and content of the bitmap buffer can change between calls of FT_Load_Glyph and a few other functions.

      +
      bitmap_left +

      This is the bitmap's left bearing expressed in integer pixels. Of course, this is only valid if the format is FT_GLYPH_FORMAT_BITMAP.

      +
      bitmap_top +

      This is the bitmap's top bearing expressed in integer pixels. Remember that this is the distance from the baseline to the top-most glyph scanline, upwards y coordinates being positive.

      +
      outline +

      The outline descriptor for the current glyph image if its format is FT_GLYPH_FORMAT_OUTLINE. Once a glyph is loaded, ‘outline’ can be transformed, distorted, embolded, etc. However, it must not be freed.

      +
      num_subglyphs +

      The number of subglyphs in a composite glyph. This field is only valid for the composite glyph format that should normally only be loaded with the FT_LOAD_NO_RECURSE flag. For now this is internal to FreeType.

      +
      subglyphs +

      An array of subglyph descriptors for composite glyphs. There are ‘num_subglyphs’ elements in there. Currently internal to FreeType.

      +
      control_data +

      Certain font drivers can also return the control data for a given glyph image (e.g. TrueType bytecode, Type 1 charstrings, etc.). This field is a pointer to such data.

      +
      control_len +

      This is the length in bytes of the control data.

      +
      other +

      Really wicked formats can use this pointer to present their own glyph image to client applications. Note that the application needs to know about the image format.

      +
      lsb_delta +

      The difference between hinted and unhinted left side bearing while autohinting is active. Zero otherwise.

      +
      rsb_delta +

      The difference between hinted and unhinted right side bearing while autohinting is active. Zero otherwise.

      +
      +
      +
      note
      +

      If FT_Load_Glyph is called with default flags (see FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in its native format (e.g., an outline glyph for TrueType and Type 1 formats).

      +

      This image can later be converted into a bitmap by calling FT_Render_Glyph. This function finds the current renderer for the native image's format, then invokes it.

      +

      The renderer is in charge of transforming the native image through the slot's face transformation fields, then converting it into a bitmap that is returned in ‘slot->bitmap’.

      +

      Note that ‘slot->bitmap_left’ and ‘slot->bitmap_top’ are also used to specify the position of the bitmap relative to the current pen position (e.g., coordinates (0,0) on the baseline). Of course, ‘slot->format’ is also changed to FT_GLYPH_FORMAT_BITMAP.

      +
      +
      note
      +

      Here a small pseudo code fragment which shows how to use ‘lsb_delta’ and ‘rsb_delta’:

      +
      +  FT_Pos  origin_x       = 0;                                      
      +  FT_Pos  prev_rsb_delta = 0;                                      
      +                                                                   
      +                                                                   
      +  for all glyphs do                                                
      +    <compute kern between current and previous glyph and add it to 
      +     `origin_x'>                                                   
      +                                                                   
      +    <load glyph with `FT_Load_Glyph'>                              
      +                                                                   
      +    if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )           
      +      origin_x -= 64;                                              
      +    else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )      
      +      origin_x += 64;                                              
      +                                                                   
      +    prev_rsb_delta = face->glyph->rsb_delta;                       
      +                                                                   
      +    <save glyph image, or render glyph, or ...>                    
      +                                                                   
      +    origin_x += face->glyph->advance.x;                            
      +  endfor                                                           
      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Init_FreeType

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Init_FreeType( FT_Library  *alibrary );
      +
      +

      +
      +

      Initialize a new FreeType library object. The set of modules that are registered by this function is determined at build time.

      +

      +
      output
      +

      + + +
      alibrary +

      A handle to a new library object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Done_FreeType

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Done_FreeType( FT_Library  library );
      +
      +

      +
      +

      Destroy a given FreeType library object and all of its children, including resources, drivers, faces, sizes, etc.

      +

      +
      input
      +

      + + +
      library +

      A handle to the target library object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_OPEN_XXX

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_OPEN_MEMORY    0x1
      +#define FT_OPEN_STREAM    0x2
      +#define FT_OPEN_PATHNAME  0x4
      +#define FT_OPEN_DRIVER    0x8
      +#define FT_OPEN_PARAMS    0x10
      +
      +#define ft_open_memory    FT_OPEN_MEMORY     /* deprecated */
      +#define ft_open_stream    FT_OPEN_STREAM     /* deprecated */
      +#define ft_open_pathname  FT_OPEN_PATHNAME   /* deprecated */
      +#define ft_open_driver    FT_OPEN_DRIVER     /* deprecated */
      +#define ft_open_params    FT_OPEN_PARAMS     /* deprecated */
      +
      +

      +
      +

      A list of bit-field constants used within the ‘flags’ field of the FT_Open_Args structure.

      +

      +
      values
      +

      + + + + + + + + + + + +
      FT_OPEN_MEMORY +

      This is a memory-based stream.

      +
      FT_OPEN_STREAM +

      Copy the stream from the ‘stream’ field.

      +
      FT_OPEN_PATHNAME +

      Create a new input stream from a C path name.

      +
      FT_OPEN_DRIVER +

      Use the ‘driver’ field.

      +
      FT_OPEN_PARAMS +

      Use the ‘num_params’ and ‘params’ fields.

      +
      ft_open_memory +

      Deprecated; use FT_OPEN_MEMORY instead.

      +
      ft_open_stream +

      Deprecated; use FT_OPEN_STREAM instead.

      +
      ft_open_pathname +

      Deprecated; use FT_OPEN_PATHNAME instead.

      +
      ft_open_driver +

      Deprecated; use FT_OPEN_DRIVER instead.

      +
      ft_open_params +

      Deprecated; use FT_OPEN_PARAMS instead.

      +
      +
      +
      note
      +

      The ‘FT_OPEN_MEMORY’, ‘FT_OPEN_STREAM’, and ‘FT_OPEN_PATHNAME’ flags are mutually exclusive.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Parameter

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_Parameter_
      +  {
      +    FT_ULong    tag;
      +    FT_Pointer  data;
      +
      +  } FT_Parameter;
      +
      +

      +
      +

      A simple structure used to pass more or less generic parameters to FT_Open_Face.

      +

      +
      fields
      +

      + + + +
      tag +

      A four-byte identification tag.

      +
      data +

      A pointer to the parameter data.

      +
      +
      +
      note
      +

      The ID and function of parameters are driver-specific.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Open_Args

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_Open_Args_
      +  {
      +    FT_UInt         flags;
      +    const FT_Byte*  memory_base;
      +    FT_Long         memory_size;
      +    FT_String*      pathname;
      +    FT_Stream       stream;
      +    FT_Module       driver;
      +    FT_Int          num_params;
      +    FT_Parameter*   params;
      +
      +  } FT_Open_Args;
      +
      +

      +
      +

      A structure used to indicate how to open a new font file or stream. A pointer to such a structure can be used as a parameter for the functions FT_Open_Face and FT_Attach_Stream.

      +

      +
      fields
      +

      + + + + + + + + + +
      flags +

      A set of bit flags indicating how to use the structure.

      +
      memory_base +

      The first byte of the file in memory.

      +
      memory_size +

      The size in bytes of the file in memory.

      +
      pathname +

      A pointer to an 8-bit file pathname.

      +
      stream +

      A handle to a source stream object.

      +
      driver +

      This field is exclusively used by FT_Open_Face; it simply specifies the font driver to use to open the face. If set to 0, FreeType tries to load the face with each one of the drivers in its list.

      +
      num_params +

      The number of extra parameters.

      +
      params +

      Extra parameters passed to the font driver when opening a new face.

      +
      +
      +
      note
      +

      The stream type is determined by the contents of ‘flags’ which are tested in the following order by FT_Open_Face:

      +

      If the ‘FT_OPEN_MEMORY’ bit is set, assume that this is a memory file of ‘memory_size’ bytes, located at ‘memory_address’. The data are are not copied, and the client is responsible for releasing and destroying them after the corresponding call to FT_Done_Face.

      +

      Otherwise, if the ‘FT_OPEN_STREAM’ bit is set, assume that a custom input stream ‘stream’ is used.

      +

      Otherwise, if the ‘FT_OPEN_PATHNAME’ bit is set, assume that this is a normal file and use ‘pathname’ to open it.

      +

      If the ‘FT_OPEN_DRIVER’ bit is set, FT_Open_Face only tries to open the file with the driver whose handler is in ‘driver’.

      +

      If the ‘FT_OPEN_PARAMS’ bit is set, the parameters given by ‘num_params’ and ‘params’ is used. They are ignored otherwise.

      +

      Ideally, both the ‘pathname’ and ‘params’ fields should be tagged as ‘const’; this is missing for API backwards compatibility. In other words, applications should treat them as read-only.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_New_Face

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_New_Face( FT_Library   library,
      +               const char*  filepathname,
      +               FT_Long      face_index,
      +               FT_Face     *aface );
      +
      +

      +
      +

      This function calls FT_Open_Face to open a font by its pathname.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library resource.

      +
      +
      +
      input
      +

      + + + +
      pathname +

      A path to the font file.

      +
      face_index +

      The index of the face within the font. The first face has index 0.

      +
      +
      +
      output
      +

      + + +
      aface +

      A handle to a new face object. If ‘face_index’ is greater than or equal to zero, it must be non-NULL. See FT_Open_Face for more details.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_New_Memory_Face

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_New_Memory_Face( FT_Library      library,
      +                      const FT_Byte*  file_base,
      +                      FT_Long         file_size,
      +                      FT_Long         face_index,
      +                      FT_Face        *aface );
      +
      +

      +
      +

      This function calls FT_Open_Face to open a font which has been loaded into memory.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library resource.

      +
      +
      +
      input
      +

      + + + + +
      file_base +

      A pointer to the beginning of the font data.

      +
      file_size +

      The size of the memory chunk used by the font data.

      +
      face_index +

      The index of the face within the font. The first face has index 0.

      +
      +
      +
      output
      +

      + + +
      aface +

      A handle to a new face object. If ‘face_index’ is greater than or equal to zero, it must be non-NULL. See FT_Open_Face for more details.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      You must not deallocate the memory before calling FT_Done_Face.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Open_Face

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Open_Face( FT_Library           library,
      +                const FT_Open_Args*  args,
      +                FT_Long              face_index,
      +                FT_Face             *aface );
      +
      +

      +
      +

      Create a face object from a given resource described by FT_Open_Args.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library resource.

      +
      +
      +
      input
      +

      + + + +
      args +

      A pointer to an ‘FT_Open_Args’ structure which must be filled by the caller.

      +
      face_index +

      The index of the face within the font. The first face has index 0.

      +
      +
      +
      output
      +

      + + +
      aface +

      A handle to a new face object. If ‘face_index’ is greater than or equal to zero, it must be non-NULL. See note below.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      Unlike FreeType 1.x, this function automatically creates a glyph slot for the face object which can be accessed directly through ‘face->glyph’.

      +

      FT_Open_Face can be used to quickly check whether the font format of a given font resource is supported by FreeType. If the ‘face_index’ field is negative, the function's return value is 0 if the font format is recognized, or non-zero otherwise; the function returns a more or less empty face handle in ‘*aface’ (if ‘aface’ isn't NULL). The only useful field in this special case is ‘face->num_faces’ which gives the number of faces within the font file. After examination, the returned FT_Face structure should be deallocated with a call to FT_Done_Face.

      +

      Each new face object created with this function also owns a default FT_Size object, accessible as ‘face->size’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Attach_File

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Attach_File( FT_Face      face,
      +                  const char*  filepathname );
      +
      +

      +
      +

      This function calls FT_Attach_Stream to attach a file.

      +

      +
      inout
      +

      + + +
      face +

      The target face object.

      +
      +
      +
      input
      +

      + + +
      filepathname +

      The pathname.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Attach_Stream

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Attach_Stream( FT_Face        face,
      +                    FT_Open_Args*  parameters );
      +
      +

      +
      +

      ‘Attach’ data to a face object. Normally, this is used to read additional information for the face object. For example, you can attach an AFM file that comes with a Type 1 font to get the kerning values and other metrics.

      +

      +
      inout
      +

      + + +
      face +

      The target face object.

      +
      +
      +
      input
      +

      + + +
      parameters +

      A pointer to FT_Open_Args which must be filled by the caller.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The meaning of the ‘attach’ (i.e., what really happens when the new file is read) is not fixed by FreeType itself. It really depends on the font format (and thus the font driver).

      +

      Client applications are expected to know what they are doing when invoking this function. Most drivers simply do not implement file attachments.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Done_Face

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Done_Face( FT_Face  face );
      +
      +

      +
      +

      Discard a given face object, as well as all of its child slots and sizes.

      +

      +
      input
      +

      + + +
      face +

      A handle to a target face object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Select_Size

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Select_Size( FT_Face  face,
      +                  FT_Int   strike_index );
      +
      +

      +
      +

      Select a bitmap strike.

      +

      +
      inout
      +

      + + +
      face +

      A handle to a target face object.

      +
      +
      +
      input
      +

      + + +
      strike_index +

      The index of the bitmap strike in the ‘available_sizes’ field of FT_FaceRec structure.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Size_Request_Type

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef enum  FT_Size_Request_Type_
      +  {
      +    FT_SIZE_REQUEST_TYPE_NOMINAL,
      +    FT_SIZE_REQUEST_TYPE_REAL_DIM,
      +    FT_SIZE_REQUEST_TYPE_BBOX,
      +    FT_SIZE_REQUEST_TYPE_CELL,
      +    FT_SIZE_REQUEST_TYPE_SCALES,
      +
      +    FT_SIZE_REQUEST_TYPE_MAX
      +
      +  } FT_Size_Request_Type;
      +
      +

      +
      +

      An enumeration type that lists the supported size request types.

      +

      +
      values
      +

      + + + + + + + + + + + +
      FT_SIZE_REQUEST_TYPE_NOMINAL
      +

      The nominal size. The ‘units_per_EM’ field of FT_FaceRec is used to determine both scaling values.

      +
      FT_SIZE_REQUEST_TYPE_REAL_DIM
      +

      The real dimension. The sum of the the ‘Ascender’ and (minus of) the ‘Descender’ fields of FT_FaceRec are used to determine both scaling values.

      +
      FT_SIZE_REQUEST_TYPE_BBOX
      +

      The font bounding box. The width and height of the ‘bbox’ field of FT_FaceRec are used to determine the horizontal and vertical scaling value, respectively.

      +
      FT_SIZE_REQUEST_TYPE_CELL
      +

      The ‘max_advance_width’ field of FT_FaceRec is used to determine the horizontal scaling value; the vertical scaling value is determined the same way as FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling values are set to the smaller one. This type is useful if you want to specify the font size for, say, a window of a given dimension and 80x24 cells.

      +
      FT_SIZE_REQUEST_TYPE_SCALES
      +

      Specify the scaling values directly.

      +
      +
      +
      note
      +

      The above descriptions only apply to scalable formats. For bitmap formats, the behaviour is up to the driver.

      +

      See the note section of FT_Size_Metrics if you wonder how size requesting relates to scaling values.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Size_RequestRec

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef struct  FT_Size_RequestRec_
      +  {
      +    FT_Size_Request_Type  type;
      +    FT_Long               width;
      +    FT_Long               height;
      +    FT_UInt               horiResolution;
      +    FT_UInt               vertResolution;
      +
      +  } FT_Size_RequestRec;
      +
      +

      +
      +

      A structure used to model a size request.

      +

      +
      fields
      +

      + + + + + + +
      type +

      See FT_Size_Request_Type.

      +
      width +

      The desired width.

      +
      height +

      The desired height.

      +
      horiResolution +

      The horizontal resolution. If set to zero, ‘width’ is treated as a 26.6 fractional pixel value.

      +
      vertResolution +

      The vertical resolution. If set to zero, ‘height’ is treated as a 26.6 fractional pixel value.

      +
      +
      +
      note
      +

      If ‘width’ is zero, then the horizontal scaling value is set equal to the vertical scaling value, and vice versa.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Size_Request

      +
      +

      A handle to a size request structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Request_Size

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Request_Size( FT_Face          face,
      +                   FT_Size_Request  req );
      +
      +

      +
      +

      Resize the scale of the active FT_Size object in a face.

      +

      +
      inout
      +

      + + +
      face +

      A handle to a target face object.

      +
      +
      +
      input
      +

      + + +
      req +

      A pointer to a FT_Size_RequestRec.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      Although drivers may select the bitmap strike matching the request, you should not rely on this if you intend to select a particular bitmap strike. Use FT_Select_Size instead in that case.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_Char_Size

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Set_Char_Size( FT_Face     face,
      +                    FT_F26Dot6  char_width,
      +                    FT_F26Dot6  char_height,
      +                    FT_UInt     horz_resolution,
      +                    FT_UInt     vert_resolution );
      +
      +

      +
      +

      This function calls FT_Request_Size to request the nominal size (in points).

      +

      +
      inout
      +

      + + +
      face +

      A handle to a target face object.

      +
      +
      +
      input
      +

      + + + + + +
      char_width +

      The nominal width, in 26.6 fractional points.

      +
      char_height +

      The nominal height, in 26.6 fractional points.

      +
      horz_resolution +

      The horizontal resolution in dpi.

      +
      vert_resolution +

      The vertical resolution in dpi.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      If either the character width or height is zero, it is set equal to the other value.

      +

      If either the horizontal or vertical resolution is zero, it is set equal to the other value.

      +

      A character width or height smaller than 1pt is set to 1pt; if both resolution values are zero, they are set to 72dpi.

      +

      Don't use this function if you are using the FreeType cache API.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_Pixel_Sizes

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Set_Pixel_Sizes( FT_Face  face,
      +                      FT_UInt  pixel_width,
      +                      FT_UInt  pixel_height );
      +
      +

      +
      +

      This function calls FT_Request_Size to request the nominal size (in pixels).

      +

      +
      inout
      +

      + + +
      face +

      A handle to the target face object.

      +
      +
      +
      input
      +

      + + + +
      pixel_width +

      The nominal width, in pixels.

      +
      pixel_height +

      The nominal height, in pixels.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Load_Glyph

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Load_Glyph( FT_Face   face,
      +                 FT_UInt   glyph_index,
      +                 FT_Int32  load_flags );
      +
      +

      +
      +

      A function used to load a single glyph into the glyph slot of a face object.

      +

      +
      inout
      +

      + + +
      face +

      A handle to the target face object where the glyph is loaded.

      +
      +
      +
      input
      +

      + + + +
      glyph_index +

      The index of the glyph in the font file. For CID-keyed fonts (either in PS or in CFF format) this argument specifies the CID value.

      +
      load_flags +

      A flag indicating what to load for this glyph. The FT_LOAD_XXX constants can be used to control the glyph loading process (e.g., whether the outline should be scaled, whether to load bitmaps or not, whether to hint the outline, etc).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The loaded glyph may be transformed. See FT_Set_Transform for the details.

      +

      For subsetted CID-keyed fonts, ‘FT_Err_Invalid_Argument’ is returned for invalid CID values (this is, for CID values which don't have a corresponding glyph in the font). See the discussion of the FT_FACE_FLAG_CID_KEYED flag for more details.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Load_Char

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Load_Char( FT_Face   face,
      +                FT_ULong  char_code,
      +                FT_Int32  load_flags );
      +
      +

      +
      +

      A function used to load a single glyph into the glyph slot of a face object, according to its character code.

      +

      +
      inout
      +

      + + +
      face +

      A handle to a target face object where the glyph is loaded.

      +
      +
      +
      input
      +

      + + + +
      char_code +

      The glyph's character code, according to the current charmap used in the face.

      +
      load_flags +

      A flag indicating what to load for this glyph. The FT_LOAD_XXX constants can be used to control the glyph loading process (e.g., whether the outline should be scaled, whether to load bitmaps or not, whether to hint the outline, etc).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function simply calls FT_Get_Char_Index and FT_Load_Glyph.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_LOAD_XXX

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_LOAD_DEFAULT                      0x0
      +#define FT_LOAD_NO_SCALE                     0x1
      +#define FT_LOAD_NO_HINTING                   0x2
      +#define FT_LOAD_RENDER                       0x4
      +#define FT_LOAD_NO_BITMAP                    0x8
      +#define FT_LOAD_VERTICAL_LAYOUT              0x10
      +#define FT_LOAD_FORCE_AUTOHINT               0x20
      +#define FT_LOAD_CROP_BITMAP                  0x40
      +#define FT_LOAD_PEDANTIC                     0x80
      +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  0x200
      +#define FT_LOAD_NO_RECURSE                   0x400
      +#define FT_LOAD_IGNORE_TRANSFORM             0x800
      +#define FT_LOAD_MONOCHROME                   0x1000
      +#define FT_LOAD_LINEAR_DESIGN                0x2000
      +#define FT_LOAD_NO_AUTOHINT                  0x8000U
      +
      +

      +
      +

      A list of bit-field constants used with FT_Load_Glyph to indicate what kind of operations to perform during glyph loading.

      +

      +
      values
      +

      + + + + + + + + + + + + + + + + + + + +
      FT_LOAD_DEFAULT +

      Corresponding to 0, this value is used as the default glyph load operation. In this case, the following happens:

      +

      1. FreeType looks for a bitmap for the glyph corresponding to the face's current size. If one is found, the function returns. The bitmap data can be accessed from the glyph slot (see note below).

      +

      2. If no embedded bitmap is searched or found, FreeType looks for a scalable outline. If one is found, it is loaded from the font file, scaled to device pixels, then ‘hinted’ to the pixel grid in order to optimize it. The outline data can be accessed from the glyph slot (see note below).

      +

      Note that by default, the glyph loader doesn't render outlines into bitmaps. The following flags are used to modify this default behaviour to more specific and useful cases.

      +
      FT_LOAD_NO_SCALE +

      Don't scale the outline glyph loaded, but keep it in font units.

      +

      This flag implies FT_LOAD_NO_HINTING and FT_LOAD_NO_BITMAP, and unsets FT_LOAD_RENDER.

      +
      FT_LOAD_NO_HINTING +

      Disable hinting. This generally generates ‘blurrier’ bitmap glyph when the glyph is rendered in any of the anti-aliased modes. See also the note below.

      +

      This flag is implied by FT_LOAD_NO_SCALE.

      +
      FT_LOAD_RENDER +

      Call FT_Render_Glyph after the glyph is loaded. By default, the glyph is rendered in FT_RENDER_MODE_NORMAL mode. This can be overridden by FT_LOAD_TARGET_XXX or FT_LOAD_MONOCHROME.

      +

      This flag is unset by FT_LOAD_NO_SCALE.

      +
      FT_LOAD_NO_BITMAP +

      Ignore bitmap strikes when loading. Bitmap-only fonts ignore this flag.

      +

      FT_LOAD_NO_SCALE always sets this flag.

      +
      FT_LOAD_VERTICAL_LAYOUT
      +

      Load the glyph for vertical text layout. Don't use it as it is problematic currently.

      +
      FT_LOAD_FORCE_AUTOHINT +

      Indicates that the auto-hinter is preferred over the font's native hinter. See also the note below.

      +
      FT_LOAD_CROP_BITMAP +

      Indicates that the font driver should crop the loaded bitmap glyph (i.e., remove all space around its black bits). Not all drivers implement this.

      +
      FT_LOAD_PEDANTIC +

      Indicates that the font driver should perform pedantic verifications during glyph loading. This is mostly used to detect broken glyphs in fonts. By default, FreeType tries to handle broken fonts also.

      +
      FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
      +

      Indicates that the font driver should ignore the global advance width defined in the font. By default, that value is used as the advance width for all glyphs when the face has FT_FACE_FLAG_FIXED_WIDTH set.

      +

      This flag exists for historical reasons (to support buggy CJK fonts).

      +
      FT_LOAD_NO_RECURSE +

      This flag is only used internally. It merely indicates that the font driver should not load composite glyphs recursively. Instead, it should set the ‘num_subglyph’ and ‘subglyphs’ values of the glyph slot accordingly, and set ‘glyph->format’ to FT_GLYPH_FORMAT_COMPOSITE.

      +

      The description of sub-glyphs is not available to client applications for now.

      +

      This flag implies FT_LOAD_NO_SCALE and FT_LOAD_IGNORE_TRANSFORM.

      +
      FT_LOAD_IGNORE_TRANSFORM
      +

      Indicates that the transform matrix set by FT_Set_Transform should be ignored.

      +
      FT_LOAD_MONOCHROME +

      This flag is used with FT_LOAD_RENDER to indicate that you want to render an outline glyph to a 1-bit monochrome bitmap glyph, with 8 pixels packed into each byte of the bitmap data.

      +

      Note that this has no effect on the hinting algorithm used. You should rather use FT_LOAD_TARGET_MONO so that the monochrome-optimized hinting algorithm is used.

      +
      FT_LOAD_LINEAR_DESIGN +

      Indicates that the ‘linearHoriAdvance’ and ‘linearVertAdvance’ fields of FT_GlyphSlotRec should be kept in font units. See FT_GlyphSlotRec for details.

      +
      FT_LOAD_NO_AUTOHINT +

      Disable auto-hinter. See also the note below.

      +
      +
      +
      note
      +

      By default, hinting is enabled and the font's native hinter (see FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can disable hinting by setting FT_LOAD_NO_HINTING or change the precedence by setting FT_LOAD_FORCE_AUTOHINT. You can also set FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be used at all.

      +

      See the description of FT_FACE_FLAG_TRICKY for a special exception (affecting only a handful of Asian fonts).

      +

      Besides deciding which hinter to use, you can also decide which hinting algorithm to use. See FT_LOAD_TARGET_XXX for details.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_LOAD_TARGET_XXX

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )
      +
      +#define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
      +#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )
      +#define FT_LOAD_TARGET_MONO    FT_LOAD_TARGET_( FT_RENDER_MODE_MONO   )
      +#define FT_LOAD_TARGET_LCD     FT_LOAD_TARGET_( FT_RENDER_MODE_LCD    )
      +#define FT_LOAD_TARGET_LCD_V   FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V  )
      +
      +

      +
      +

      A list of values that are used to select a specific hinting algorithm to use by the hinter. You should OR one of these values to your ‘load_flags’ when calling FT_Load_Glyph.

      +

      Note that font's native hinters may ignore the hinting algorithm you have specified (e.g., the TrueType bytecode interpreter). You can set FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.

      +

      Also note that FT_LOAD_TARGET_LIGHT is an exception, in that it always implies FT_LOAD_FORCE_AUTOHINT.

      +

      +
      values
      +

      + + + + + + +
      FT_LOAD_TARGET_NORMAL +

      This corresponds to the default hinting algorithm, optimized for standard gray-level rendering. For monochrome output, use FT_LOAD_TARGET_MONO instead.

      +
      FT_LOAD_TARGET_LIGHT +

      A lighter hinting algorithm for non-monochrome modes. Many generated glyphs are more fuzzy but better resemble its original shape. A bit like rendering on Mac OS X.

      +

      As a special exception, this target implies FT_LOAD_FORCE_AUTOHINT.

      +
      FT_LOAD_TARGET_MONO +

      Strong hinting algorithm that should only be used for monochrome output. The result is probably unpleasant if the glyph is rendered in non-monochrome modes.

      +
      FT_LOAD_TARGET_LCD +

      A variant of FT_LOAD_TARGET_NORMAL optimized for horizontally decimated LCD displays.

      +
      FT_LOAD_TARGET_LCD_V +

      A variant of FT_LOAD_TARGET_NORMAL optimized for vertically decimated LCD displays.

      +
      +
      +
      note
      +

      You should use only one of the FT_LOAD_TARGET_XXX values in your ‘load_flags’. They can't be ORed.

      +

      If FT_LOAD_RENDER is also set, the glyph is rendered in the corresponding mode (i.e., the mode which matches the used algorithm best) unless FT_LOAD_MONOCHROME is set.

      +

      You can use a hinting algorithm that doesn't correspond to the same rendering mode. As an example, it is possible to use the ‘light’ hinting algorithm and have the results rendered in horizontal LCD pixel mode, with code like

      +
      +  FT_Load_Glyph( face, glyph_index,
      +                 load_flags | FT_LOAD_TARGET_LIGHT );
      +
      +  FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_LOAD_TARGET_MODE

      +
      +

      Return the FT_Render_Mode corresponding to a given FT_LOAD_TARGET_XXX value.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_Transform

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Set_Transform( FT_Face     face,
      +                    FT_Matrix*  matrix,
      +                    FT_Vector*  delta );
      +
      +

      +
      +

      A function used to set the transformation that is applied to glyph images when they are loaded into a glyph slot through FT_Load_Glyph.

      +

      +
      inout
      +

      + + +
      face +

      A handle to the source face object.

      +
      +
      +
      input
      +

      + + + +
      matrix +

      A pointer to the transformation's 2x2 matrix. Use 0 for the identity matrix.

      +
      delta +

      A pointer to the translation vector. Use 0 for the null vector.

      +
      +
      +
      note
      +

      The transformation is only applied to scalable image formats after the glyph has been loaded. It means that hinting is unaltered by the transformation and is performed on the character size given in the last call to FT_Set_Char_Size or FT_Set_Pixel_Sizes.

      +

      Note that this also transforms the ‘face.glyph.advance’ field, but not the values in ‘face.glyph.metrics’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Render_Mode

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef enum  FT_Render_Mode_
      +  {
      +    FT_RENDER_MODE_NORMAL = 0,
      +    FT_RENDER_MODE_LIGHT,
      +    FT_RENDER_MODE_MONO,
      +    FT_RENDER_MODE_LCD,
      +    FT_RENDER_MODE_LCD_V,
      +
      +    FT_RENDER_MODE_MAX
      +
      +  } FT_Render_Mode;
      +
      +

      +
      +

      An enumeration type that lists the render modes supported by FreeType 2. Each mode corresponds to a specific type of scanline conversion performed on the outline.

      +

      For bitmap fonts and embedded bitmaps the ‘bitmap->pixel_mode’ field in the FT_GlyphSlotRec structure gives the format of the returned bitmap.

      +

      All modes except FT_RENDER_MODE_MONO use 256 levels of opacity.

      +

      +
      values
      +

      + + + + + + +
      FT_RENDER_MODE_NORMAL +

      This is the default render mode; it corresponds to 8-bit anti-aliased bitmaps.

      +
      FT_RENDER_MODE_LIGHT +

      This is equivalent to FT_RENDER_MODE_NORMAL. It is only defined as a separate value because render modes are also used indirectly to define hinting algorithm selectors. See FT_LOAD_TARGET_XXX for details.

      +
      FT_RENDER_MODE_MONO +

      This mode corresponds to 1-bit bitmaps (with 2 levels of opacity).

      +
      FT_RENDER_MODE_LCD +

      This mode corresponds to horizontal RGB and BGR sub-pixel displays like LCD screens. It produces 8-bit bitmaps that are 3 times the width of the original glyph outline in pixels, and which use the FT_PIXEL_MODE_LCD mode.

      +
      FT_RENDER_MODE_LCD_V +

      This mode corresponds to vertical RGB and BGR sub-pixel displays (like PDA screens, rotated LCD displays, etc.). It produces 8-bit bitmaps that are 3 times the height of the original glyph outline in pixels and use the FT_PIXEL_MODE_LCD_V mode.

      +
      +
      +
      note
      +

      The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be filtered to reduce color-fringes by using FT_Library_SetLcdFilter (not active in the default builds). It is up to the caller to either call FT_Library_SetLcdFilter (if available) or do the filtering itself.

      +

      The selected render mode only affects vector glyphs of a font. Embedded bitmaps often have a different pixel mode like FT_PIXEL_MODE_MONO. You can use FT_Bitmap_Convert to transform them into 8-bit pixmaps.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_render_mode_xxx

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL
      +#define ft_render_mode_mono    FT_RENDER_MODE_MONO
      +
      +

      +
      +

      These constants are deprecated. Use the corresponding FT_Render_Mode values instead.

      +

      +
      values
      +

      + + + +
      ft_render_mode_normal +

      see FT_RENDER_MODE_NORMAL

      +
      ft_render_mode_mono +

      see FT_RENDER_MODE_MONO

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Render_Glyph

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Render_Glyph( FT_GlyphSlot    slot,
      +                   FT_Render_Mode  render_mode );
      +
      +

      +
      +

      Convert a given glyph image to a bitmap. It does so by inspecting the glyph image format, finding the relevant renderer, and invoking it.

      +

      +
      inout
      +

      + + +
      slot +

      A handle to the glyph slot containing the image to convert.

      +
      +
      +
      input
      +

      + + +
      render_mode +

      This is the render mode used to render the glyph image into a bitmap. See FT_Render_Mode for a list of possible values.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Kerning_Mode

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  typedef enum  FT_Kerning_Mode_
      +  {
      +    FT_KERNING_DEFAULT  = 0,
      +    FT_KERNING_UNFITTED,
      +    FT_KERNING_UNSCALED
      +
      +  } FT_Kerning_Mode;
      +
      +

      +
      +

      An enumeration used to specify which kerning values to return in FT_Get_Kerning.

      +

      +
      values
      +

      + + + + +
      FT_KERNING_DEFAULT +

      Return scaled and grid-fitted kerning distances (value is 0).

      +
      FT_KERNING_UNFITTED +

      Return scaled but un-grid-fitted kerning distances.

      +
      FT_KERNING_UNSCALED +

      Return the kerning vector in original font units.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_kerning_default

      +
      +

      This constant is deprecated. Please use FT_KERNING_DEFAULT instead.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_kerning_unfitted

      +
      +

      This constant is deprecated. Please use FT_KERNING_UNFITTED instead.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_kerning_unscaled

      +
      +

      This constant is deprecated. Please use FT_KERNING_UNSCALED instead.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Kerning

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_Kerning( FT_Face     face,
      +                  FT_UInt     left_glyph,
      +                  FT_UInt     right_glyph,
      +                  FT_UInt     kern_mode,
      +                  FT_Vector  *akerning );
      +
      +

      +
      +

      Return the kerning vector between two glyphs of a same face.

      +

      +
      input
      +

      + + + + + +
      face +

      A handle to a source face object.

      +
      left_glyph +

      The index of the left glyph in the kern pair.

      +
      right_glyph +

      The index of the right glyph in the kern pair.

      +
      kern_mode +

      See FT_Kerning_Mode for more information. Determines the scale and dimension of the returned kerning vector.

      +
      +
      +
      output
      +

      + + +
      akerning +

      The kerning vector. This is either in font units or in pixels (26.6 format) for scalable formats, and in pixels for fixed-sizes formats.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      Only horizontal layouts (left-to-right & right-to-left) are supported by this method. Other layouts, or more sophisticated kernings, are out of the scope of this API function -- they can be implemented through format-specific interfaces.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Track_Kerning

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_Track_Kerning( FT_Face    face,
      +                        FT_Fixed   point_size,
      +                        FT_Int     degree,
      +                        FT_Fixed*  akerning );
      +
      +

      +
      +

      Return the track kerning for a given face object at a given size.

      +

      +
      input
      +

      + + + + +
      face +

      A handle to a source face object.

      +
      point_size +

      The point size in 16.16 fractional points.

      +
      degree +

      The degree of tightness.

      +
      +
      +
      output
      +

      + + +
      akerning +

      The kerning in 16.16 fractional points.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Glyph_Name

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_Glyph_Name( FT_Face     face,
      +                     FT_UInt     glyph_index,
      +                     FT_Pointer  buffer,
      +                     FT_UInt     buffer_max );
      +
      +

      +
      +

      Retrieve the ASCII name of a given glyph in a face. This only works for those faces where FT_HAS_GLYPH_NAMES(face) returns 1.

      +

      +
      input
      +

      + + + + +
      face +

      A handle to a source face object.

      +
      glyph_index +

      The glyph index.

      +
      buffer_max +

      The maximal number of bytes available in the buffer.

      +
      +
      +
      output
      +

      + + +
      buffer +

      A pointer to a target buffer where the name is copied to.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      An error is returned if the face doesn't provide glyph names or if the glyph index is invalid. In all cases of failure, the first byte of ‘buffer’ is set to 0 to indicate an empty name.

      +

      The glyph name is truncated to fit within the buffer if it is too long. The returned string is always zero-terminated.

      +

      This function is not compiled within the library if the config macro ‘FT_CONFIG_OPTION_NO_GLYPH_NAMES’ is defined in ‘include/freetype/config/ftoptions.h’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Postscript_Name

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( const char* )
      +  FT_Get_Postscript_Name( FT_Face  face );
      +
      +

      +
      +

      Retrieve the ASCII PostScript name of a given face, if available. This only works with PostScript and TrueType fonts.

      +

      +
      input
      +

      + + +
      face +

      A handle to the source face object.

      +
      +
      +
      return
      +

      A pointer to the face's PostScript name. NULL if unavailable.

      +
      +
      note
      +

      The returned pointer is owned by the face and is destroyed with it.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Select_Charmap

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Select_Charmap( FT_Face      face,
      +                     FT_Encoding  encoding );
      +
      +

      +
      +

      Select a given charmap by its encoding tag (as listed in ‘freetype.h’).

      +

      +
      inout
      +

      + + +
      face +

      A handle to the source face object.

      +
      +
      +
      input
      +

      + + +
      encoding +

      A handle to the selected encoding.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function returns an error if no charmap in the face corresponds to the encoding queried here.

      +

      Because many fonts contain more than a single cmap for Unicode encoding, this function has some special code to select the one which covers Unicode best (‘best’ in the sense that a UCS-4 cmap is preferred to a UCS-2 cmap). It is thus preferable to FT_Set_Charmap in this case.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_Charmap

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Set_Charmap( FT_Face     face,
      +                  FT_CharMap  charmap );
      +
      +

      +
      +

      Select a given charmap for character code to glyph index mapping.

      +

      +
      inout
      +

      + + +
      face +

      A handle to the source face object.

      +
      +
      +
      input
      +

      + + +
      charmap +

      A handle to the selected charmap.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function returns an error if the charmap is not part of the face (i.e., if it is not listed in the ‘face->charmaps’ table).

      +

      It also fails if a type 14 charmap is selected.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Charmap_Index

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Int )
      +  FT_Get_Charmap_Index( FT_CharMap  charmap );
      +
      +

      +
      +

      Retrieve index of a given charmap.

      +

      +
      input
      +

      + + +
      charmap +

      A handle to a charmap.

      +
      +
      +
      return
      +

      The index into the array of character maps within the face to which ‘charmap’ belongs.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Char_Index

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_UInt )
      +  FT_Get_Char_Index( FT_Face   face,
      +                     FT_ULong  charcode );
      +
      +

      +
      +

      Return the glyph index of a given character code. This function uses a charmap object to do the mapping.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the source face object.

      +
      charcode +

      The character code.

      +
      +
      +
      return
      +

      The glyph index. 0 means ‘undefined character code’.

      +
      +
      note
      +

      If you use FreeType to manipulate the contents of font files directly, be aware that the glyph index returned by this function doesn't always correspond to the internal indices used within the file. This is done to ensure that value 0 always corresponds to the ‘missing glyph’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_First_Char

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_ULong )
      +  FT_Get_First_Char( FT_Face   face,
      +                     FT_UInt  *agindex );
      +
      +

      +
      +

      This function is used to return the first character code in the current charmap of a given face. It also returns the corresponding glyph index.

      +

      +
      input
      +

      + + +
      face +

      A handle to the source face object.

      +
      +
      +
      output
      +

      + + +
      agindex +

      Glyph index of first character code. 0 if charmap is empty.

      +
      +
      +
      return
      +

      The charmap's first character code.

      +
      +
      note
      +

      You should use this function with FT_Get_Next_Char to be able to parse all character codes available in a given charmap. The code should look like this:

      +
      +  FT_ULong  charcode;                                              
      +  FT_UInt   gindex;                                                
      +                                                                   
      +                                                                   
      +  charcode = FT_Get_First_Char( face, &gindex );                   
      +  while ( gindex != 0 )                                            
      +  {                                                                
      +    ... do something with (charcode,gindex) pair ...               
      +                                                                   
      +    charcode = FT_Get_Next_Char( face, charcode, &gindex );        
      +  }                                                                
      +
      +

      Note that ‘*agindex’ is set to 0 if the charmap is empty. The result itself can be 0 in two cases: if the charmap is empty or if the value 0 is the first valid character code.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Next_Char

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_ULong )
      +  FT_Get_Next_Char( FT_Face    face,
      +                    FT_ULong   char_code,
      +                    FT_UInt   *agindex );
      +
      +

      +
      +

      This function is used to return the next character code in the current charmap of a given face following the value ‘char_code’, as well as the corresponding glyph index.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the source face object.

      +
      char_code +

      The starting character code.

      +
      +
      +
      output
      +

      + + +
      agindex +

      Glyph index of next character code. 0 if charmap is empty.

      +
      +
      +
      return
      +

      The charmap's next character code.

      +
      +
      note
      +

      You should use this function with FT_Get_First_Char to walk over all character codes available in a given charmap. See the note for this function for a simple code example.

      +

      Note that ‘*agindex’ is set to 0 when there are no more codes in the charmap.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Name_Index

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_UInt )
      +  FT_Get_Name_Index( FT_Face     face,
      +                     FT_String*  glyph_name );
      +
      +

      +
      +

      Return the glyph index of a given glyph name. This function uses driver specific objects to do the translation.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the source face object.

      +
      glyph_name +

      The glyph name.

      +
      +
      +
      return
      +

      The glyph index. 0 means ‘undefined character code’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_SUBGLYPH_FLAG_XXX

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
      +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
      +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
      +#define FT_SUBGLYPH_FLAG_SCALE                   8
      +#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
      +#define FT_SUBGLYPH_FLAG_2X2                  0x80
      +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
      +
      +

      +
      +

      A list of constants used to describe subglyphs. Please refer to the TrueType specification for the meaning of the various flags.

      +

      +
      values
      +

      + + + + + + + + + + + + + +
      FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS
      +

      +
      FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES
      +

      +
      FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID
      +

      +
      FT_SUBGLYPH_FLAG_SCALE +

      +
      FT_SUBGLYPH_FLAG_XY_SCALE
      +

      +
      FT_SUBGLYPH_FLAG_2X2 +

      +
      FT_SUBGLYPH_FLAG_USE_MY_METRICS
      +

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_SubGlyph_Info

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
      +                        FT_UInt       sub_index,
      +                        FT_Int       *p_index,
      +                        FT_UInt      *p_flags,
      +                        FT_Int       *p_arg1,
      +                        FT_Int       *p_arg2,
      +                        FT_Matrix    *p_transform );
      +
      +

      +
      +

      Retrieve a description of a given subglyph. Only use it if ‘glyph->format’ is FT_GLYPH_FORMAT_COMPOSITE; an error is returned otherwise.

      +

      +
      input
      +

      + + + +
      glyph +

      The source glyph slot.

      +
      sub_index +

      The index of the subglyph. Must be less than ‘glyph->num_subglyphs’.

      +
      +
      +
      output
      +

      + + + + + + +
      p_index +

      The glyph index of the subglyph.

      +
      p_flags +

      The subglyph flags, see FT_SUBGLYPH_FLAG_XXX.

      +
      p_arg1 +

      The subglyph's first argument (if any).

      +
      p_arg2 +

      The subglyph's second argument (if any).

      +
      p_transform +

      The subglyph transformation (if any).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The values of ‘*p_arg1’, ‘*p_arg2’, and ‘*p_transform’ must be interpreted depending on the flags returned in ‘*p_flags’. See the TrueType specification for details.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_FSTYPE_XXX

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FT_FSTYPE_INSTALLABLE_EMBEDDING         0x0000
      +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING  0x0002
      +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING   0x0004
      +#define FT_FSTYPE_EDITABLE_EMBEDDING            0x0008
      +#define FT_FSTYPE_NO_SUBSETTING                 0x0100
      +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY         0x0200
      +
      +

      +
      +

      A list of bit flags used in the ‘fsType’ field of the OS/2 table in a TrueType or OpenType font and the ‘FSType’ entry in a PostScript font. These bit flags are returned by FT_Get_FSType_Flags; they inform client applications of embedding and subsetting restrictions associated with a font.

      +

      See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for more details.

      +

      +
      values
      +

      + + + + + + + + + + + + + +
      FT_FSTYPE_INSTALLABLE_EMBEDDING
      +

      Fonts with no fsType bit set may be embedded and permanently installed on the remote system by an application.

      +
      FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING
      +

      Fonts that have only this bit set must not be modified, embedded or exchanged in any manner without first obtaining permission of the font software copyright owner.

      +
      FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING
      +

      If this bit is set, the font may be embedded and temporarily loaded on the remote system. Documents containing Preview & Print fonts must be opened ‘read-only’; no edits can be applied to the document.

      +
      FT_FSTYPE_EDITABLE_EMBEDDING
      +

      If this bit is set, the font may be embedded but must only be installed temporarily on other systems. In contrast to Preview & Print fonts, documents containing editable fonts may be opened for reading, editing is permitted, and changes may be saved.

      +
      FT_FSTYPE_NO_SUBSETTING
      +

      If this bit is set, the font may not be subsetted prior to embedding.

      +
      FT_FSTYPE_BITMAP_EMBEDDING_ONLY
      +

      If this bit is set, only bitmaps contained in the font may be embedded; no outline data may be embedded. If there are no bitmaps available in the font, then the font is unembeddable.

      +
      +
      +
      note
      +

      While the fsType flags can indicate that a font may be embedded, a license with the font vendor may be separately required to use the font in this way.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_FSType_Flags

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_UShort )
      +  FT_Get_FSType_Flags( FT_Face  face );
      +
      +

      +
      +

      Return the fsType flags for a font.

      +

      +
      input
      +

      + + +
      face +

      A handle to the source face object.

      +
      +
      +
      return
      +

      The fsType flags, FT_FSTYPE_XXX.

      +
      +
      note
      +

      Use this function rather than directly reading the ‘fs_type’ field in the PS_FontInfoRec structure which is only guaranteed to return the correct results for Type 1 fonts.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-basic_types.html b/src/3rdparty/freetype/docs/reference/ft2-basic_types.html new file mode 100644 index 0000000000..9e77145b6a --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-basic_types.html @@ -0,0 +1,948 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Basic Data Types +

      +

      Synopsis

      + + + + + + + + + + + + + + + +
      FT_ByteFT_OffsetFT_UnitVector
      FT_BytesFT_PtrDistFT_F26Dot6
      FT_CharFT_StringFT_Pixel_Mode
      FT_IntFT_Tagft_pixel_mode_xxx
      FT_UIntFT_ErrorFT_Palette_Mode
      FT_Int16FT_FixedFT_Bitmap
      FT_UInt16FT_PointerFT_IMAGE_TAG
      FT_Int32FT_PosFT_Glyph_Format
      FT_UInt32FT_Vectorft_glyph_format_xxx
      FT_ShortFT_BBoxFT_Data
      FT_UShortFT_MatrixFT_Generic_Finalizer
      FT_LongFT_FWordFT_Generic
      FT_ULongFT_UFWordFT_MAKE_TAG
      FT_BoolFT_F2Dot14


      + +
      +

      This section contains the basic data types defined by FreeType 2, ranging from simple scalar types to bitmap descriptors. More font-specific structures are defined in a different section.

      +

      +
      +

      FT_Byte

      +
      +

      A simple typedef for the unsigned char type.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Bytes

      +
      +

      A typedef for constant memory areas.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Char

      +
      +

      A simple typedef for the signed char type.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Int

      +
      +

      A typedef for the int type.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_UInt

      +
      +

      A typedef for the unsigned int type.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Int16

      +
      +

      A typedef for a 16bit signed integer type.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_UInt16

      +
      +

      A typedef for a 16bit unsigned integer type.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Int32

      +
      +

      A typedef for a 32bit signed integer type. The size depends on the configuration.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_UInt32

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Short

      +
      +

      A typedef for signed short.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_UShort

      +
      +

      A typedef for unsigned short.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Long

      +
      +

      A typedef for signed long.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ULong

      +
      +

      A typedef for unsigned long.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Bool

      +
      +

      A typedef of unsigned char, used for simple booleans. As usual, values 1 and 0 represent true and false, respectively.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Offset

      +
      +

      This is equivalent to the ANSI C ‘size_t’ type, i.e., the largest unsigned integer type used to express a file size or position, or a memory block size.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_PtrDist

      +
      +

      This is equivalent to the ANSI C ‘ptrdiff_t’ type, i.e., the largest signed integer type used to express the distance between two pointers.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_String

      +
      +

      A simple typedef for the char type, usually used for strings.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Tag

      +
      +

      A typedef for 32-bit tags (as used in the SFNT format).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Error

      +
      +

      The FreeType error code type. A value of 0 is always interpreted as a successful operation.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Fixed

      +
      +

      This type is used to store 16.16 fixed float values, like scaling values or matrix coefficients.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Pointer

      +
      +

      A simple typedef for a typeless pointer.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Pos

      +
      +

      The type FT_Pos is a 32-bit integer used to store vectorial coordinates. Depending on the context, these can represent distances in integer font units, or 16.16, or 26.6 fixed float pixel coordinates.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Vector

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef struct  FT_Vector_
      +  {
      +    FT_Pos  x;
      +    FT_Pos  y;
      +
      +  } FT_Vector;
      +
      +

      +
      +

      A simple structure used to store a 2D vector; coordinates are of the FT_Pos type.

      +

      +
      fields
      +

      + + + +
      x +

      The horizontal coordinate.

      +
      y +

      The vertical coordinate.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_BBox

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef struct  FT_BBox_
      +  {
      +    FT_Pos  xMin, yMin;
      +    FT_Pos  xMax, yMax;
      +
      +  } FT_BBox;
      +
      +

      +
      +

      A structure used to hold an outline's bounding box, i.e., the coordinates of its extrema in the horizontal and vertical directions.

      +

      +
      fields
      +

      + + + + + +
      xMin +

      The horizontal minimum (left-most).

      +
      yMin +

      The vertical minimum (bottom-most).

      +
      xMax +

      The horizontal maximum (right-most).

      +
      yMax +

      The vertical maximum (top-most).

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Matrix

      +
      +Defined in FT_TYPES_H (freetype/fttypes.h). +

      +
      +
      +  typedef struct  FT_Matrix_
      +  {
      +    FT_Fixed  xx, xy;
      +    FT_Fixed  yx, yy;
      +
      +  } FT_Matrix;
      +
      +

      +
      +

      A simple structure used to store a 2x2 matrix. Coefficients are in 16.16 fixed float format. The computation performed is:

      +
      +   x' = x*xx + y*xy                                             
      +   y' = x*yx + y*yy                                             
      +
      +

      +
      fields
      +

      + + + + + +
      xx +

      Matrix coefficient.

      +
      xy +

      Matrix coefficient.

      +
      yx +

      Matrix coefficient.

      +
      yy +

      Matrix coefficient.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_FWord

      +
      +

      A signed 16-bit integer used to store a distance in original font units.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_UFWord

      +
      +

      An unsigned 16-bit integer used to store a distance in original font units.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_F2Dot14

      +
      +

      A signed 2.14 fixed float type used for unit vectors.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_UnitVector

      +
      +Defined in FT_TYPES_H (freetype/fttypes.h). +

      +
      +
      +  typedef struct  FT_UnitVector_
      +  {
      +    FT_F2Dot14  x;
      +    FT_F2Dot14  y;
      +
      +  } FT_UnitVector;
      +
      +

      +
      +

      A simple structure used to store a 2D vector unit vector. Uses FT_F2Dot14 types.

      +

      +
      fields
      +

      + + + +
      x +

      Horizontal coordinate.

      +
      y +

      Vertical coordinate.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_F26Dot6

      +
      +

      A signed 26.6 fixed float type used for vectorial pixel coordinates.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Pixel_Mode

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef enum  FT_Pixel_Mode_
      +  {
      +    FT_PIXEL_MODE_NONE = 0,
      +    FT_PIXEL_MODE_MONO,
      +    FT_PIXEL_MODE_GRAY,
      +    FT_PIXEL_MODE_GRAY2,
      +    FT_PIXEL_MODE_GRAY4,
      +    FT_PIXEL_MODE_LCD,
      +    FT_PIXEL_MODE_LCD_V,
      +
      +    FT_PIXEL_MODE_MAX      /* do not remove */
      +
      +  } FT_Pixel_Mode;
      +
      +

      +
      +

      An enumeration type used to describe the format of pixels in a given bitmap. Note that additional formats may be added in the future.

      +

      +
      values
      +

      + + + + + + + + +
      FT_PIXEL_MODE_NONE +

      Value 0 is reserved.

      +
      FT_PIXEL_MODE_MONO +

      A monochrome bitmap, using 1 bit per pixel. Note that pixels are stored in most-significant order (MSB), which means that the left-most pixel in a byte has value 128.

      +
      FT_PIXEL_MODE_GRAY +

      An 8-bit bitmap, generally used to represent anti-aliased glyph images. Each pixel is stored in one byte. Note that the number of ‘gray’ levels is stored in the ‘num_grays’ field of the FT_Bitmap structure (it generally is 256).

      +
      FT_PIXEL_MODE_GRAY2 +

      A 2-bit per pixel bitmap, used to represent embedded anti-aliased bitmaps in font files according to the OpenType specification. We haven't found a single font using this format, however.

      +
      FT_PIXEL_MODE_GRAY4 +

      A 4-bit per pixel bitmap, representing embedded anti-aliased bitmaps in font files according to the OpenType specification. We haven't found a single font using this format, however.

      +
      FT_PIXEL_MODE_LCD +

      An 8-bit bitmap, representing RGB or BGR decimated glyph images used for display on LCD displays; the bitmap is three times wider than the original glyph image. See also FT_RENDER_MODE_LCD.

      +
      FT_PIXEL_MODE_LCD_V +

      An 8-bit bitmap, representing RGB or BGR decimated glyph images used for display on rotated LCD displays; the bitmap is three times taller than the original glyph image. See also FT_RENDER_MODE_LCD_V.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_pixel_mode_xxx

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +#define ft_pixel_mode_none   FT_PIXEL_MODE_NONE
      +#define ft_pixel_mode_mono   FT_PIXEL_MODE_MONO
      +#define ft_pixel_mode_grays  FT_PIXEL_MODE_GRAY
      +#define ft_pixel_mode_pal2   FT_PIXEL_MODE_GRAY2
      +#define ft_pixel_mode_pal4   FT_PIXEL_MODE_GRAY4
      +
      +

      +
      +

      A list of deprecated constants. Use the corresponding FT_Pixel_Mode values instead.

      +

      +
      values
      +

      + + + + + + +
      ft_pixel_mode_none +

      See FT_PIXEL_MODE_NONE.

      +
      ft_pixel_mode_mono +

      See FT_PIXEL_MODE_MONO.

      +
      ft_pixel_mode_grays +

      See FT_PIXEL_MODE_GRAY.

      +
      ft_pixel_mode_pal2 +

      See FT_PIXEL_MODE_GRAY2.

      +
      ft_pixel_mode_pal4 +

      See FT_PIXEL_MODE_GRAY4.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Palette_Mode

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef enum  FT_Palette_Mode_
      +  {
      +    ft_palette_mode_rgb = 0,
      +    ft_palette_mode_rgba,
      +
      +    ft_palette_mode_max   /* do not remove */
      +
      +  } FT_Palette_Mode;
      +
      +

      +
      +

      THIS TYPE IS DEPRECATED. DO NOT USE IT!

      +

      An enumeration type to describe the format of a bitmap palette, used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8.

      +

      +
      values
      +

      + + + +
      ft_palette_mode_rgb +

      The palette is an array of 3-byte RGB records.

      +
      ft_palette_mode_rgba +

      The palette is an array of 4-byte RGBA records.

      +
      +
      +
      note
      +

      As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by FreeType, these types are not handled by the library itself.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Bitmap

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef struct  FT_Bitmap_
      +  {
      +    int             rows;
      +    int             width;
      +    int             pitch;
      +    unsigned char*  buffer;
      +    short           num_grays;
      +    char            pixel_mode;
      +    char            palette_mode;
      +    void*           palette;
      +
      +  } FT_Bitmap;
      +
      +

      +
      +

      A structure used to describe a bitmap or pixmap to the raster. Note that we now manage pixmaps of various depths through the ‘pixel_mode’ field.

      +

      +
      fields
      +

      + + + + + + + + + +
      rows +

      The number of bitmap rows.

      +
      width +

      The number of pixels in bitmap row.

      +
      pitch +

      The pitch's absolute value is the number of bytes taken by one bitmap row, including padding. However, the pitch is positive when the bitmap has a ‘down’ flow, and negative when it has an ‘up’ flow. In all cases, the pitch is an offset to add to a bitmap pointer in order to go down one row.

      +
      buffer +

      A typeless pointer to the bitmap buffer. This value should be aligned on 32-bit boundaries in most cases.

      +
      num_grays +

      This field is only used with FT_PIXEL_MODE_GRAY; it gives the number of gray levels used in the bitmap.

      +
      pixel_mode +

      The pixel mode, i.e., how pixel bits are stored. See FT_Pixel_Mode for possible values.

      +
      palette_mode +

      This field is intended for paletted pixel modes; it indicates how the palette is stored. Not used currently.

      +
      palette +

      A typeless pointer to the bitmap palette; this field is intended for paletted pixel modes. Not used currently.

      +
      +
      +
      note
      +

      For now, the only pixel modes supported by FreeType are mono and grays. However, drivers might be added in the future to support more ‘colorful’ options.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_IMAGE_TAG

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +#ifndef FT_IMAGE_TAG
      +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \
      +          value = ( ( (unsigned long)_x1 << 24 ) | \
      +                    ( (unsigned long)_x2 << 16 ) | \
      +                    ( (unsigned long)_x3 << 8  ) | \
      +                      (unsigned long)_x4         )
      +#endif /* FT_IMAGE_TAG */
      +
      +

      +
      +

      This macro converts four-letter tags to an unsigned long type.

      +

      +
      note
      +

      Since many 16-bit compilers don't like 32-bit enumerations, you should redefine this macro in case of problems to something like this:

      +
      +  #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  value         
      +
      +

      to get a simple enumeration without assigning special numbers.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_Format

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef enum  FT_Glyph_Format_
      +  {
      +    FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
      +
      +    FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
      +    FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP,    'b', 'i', 't', 's' ),
      +    FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE,   'o', 'u', 't', 'l' ),
      +    FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER,   'p', 'l', 'o', 't' )
      +
      +  } FT_Glyph_Format;
      +
      +

      +
      +

      An enumeration type used to describe the format of a given glyph image. Note that this version of FreeType only supports two image formats, even though future font drivers will be able to register their own format.

      +

      +
      values
      +

      + + + + + + + + + +
      FT_GLYPH_FORMAT_NONE +

      The value 0 is reserved.

      +
      FT_GLYPH_FORMAT_COMPOSITE
      +

      The glyph image is a composite of several other images. This format is only used with FT_LOAD_NO_RECURSE, and is used to report compound glyphs (like accented characters).

      +
      FT_GLYPH_FORMAT_BITMAP +

      The glyph image is a bitmap, and can be described as an FT_Bitmap. You generally need to access the ‘bitmap’ field of the FT_GlyphSlotRec structure to read it.

      +
      FT_GLYPH_FORMAT_OUTLINE
      +

      The glyph image is a vectorial outline made of line segments and Bézier arcs; it can be described as an FT_Outline; you generally want to access the ‘outline’ field of the FT_GlyphSlotRec structure to read it.

      +
      FT_GLYPH_FORMAT_PLOTTER
      +

      The glyph image is a vectorial path with no inside and outside contours. Some Type 1 fonts, like those in the Hershey family, contain glyphs in this format. These are described as FT_Outline, but FreeType isn't currently capable of rendering them correctly.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_glyph_format_xxx

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +#define ft_glyph_format_none       FT_GLYPH_FORMAT_NONE
      +#define ft_glyph_format_composite  FT_GLYPH_FORMAT_COMPOSITE
      +#define ft_glyph_format_bitmap     FT_GLYPH_FORMAT_BITMAP
      +#define ft_glyph_format_outline    FT_GLYPH_FORMAT_OUTLINE
      +#define ft_glyph_format_plotter    FT_GLYPH_FORMAT_PLOTTER
      +
      +

      +
      +

      A list of deprecated constants. Use the corresponding FT_Glyph_Format values instead.

      +

      +
      values
      +

      + + + + + + + + + +
      ft_glyph_format_none +

      See FT_GLYPH_FORMAT_NONE.

      +
      ft_glyph_format_composite
      +

      See FT_GLYPH_FORMAT_COMPOSITE.

      +
      ft_glyph_format_bitmap +

      See FT_GLYPH_FORMAT_BITMAP.

      +
      ft_glyph_format_outline
      +

      See FT_GLYPH_FORMAT_OUTLINE.

      +
      ft_glyph_format_plotter
      +

      See FT_GLYPH_FORMAT_PLOTTER.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Data

      +
      +Defined in FT_TYPES_H (freetype/fttypes.h). +

      +
      +
      +  typedef struct  FT_Data_
      +  {
      +    const FT_Byte*  pointer;
      +    FT_Int          length;
      +
      +  } FT_Data;
      +
      +

      +
      +

      Read-only binary data represented as a pointer and a length.

      +

      +
      fields
      +

      + + + +
      pointer +

      The data.

      +
      length +

      The length of the data in bytes.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Generic_Finalizer

      +
      +

      Describe a function used to destroy the ‘client’ data of any FreeType object. See the description of the FT_Generic type for details of usage.

      +

      +
      input
      +

      The address of the FreeType object which is under finalization. Its client data is accessed through its ‘generic’ field.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Generic

      +
      +Defined in FT_TYPES_H (freetype/fttypes.h). +

      +
      +
      +  typedef struct  FT_Generic_
      +  {
      +    void*                 data;
      +    FT_Generic_Finalizer  finalizer;
      +
      +  } FT_Generic;
      +
      +

      +
      +

      Client applications often need to associate their own data to a variety of FreeType core objects. For example, a text layout API might want to associate a glyph cache to a given size object.

      +

      Most FreeType object contains a ‘generic’ field, of type FT_Generic, which usage is left to client applications and font servers.

      +

      It can be used to store a pointer to client-specific data, as well as the address of a ‘finalizer’ function, which will be called by FreeType when the object is destroyed (for example, the previous client example would put the address of the glyph cache destructor in the ‘finalizer’ field).

      +

      +
      fields
      +

      + + + +
      data +

      A typeless pointer to any client-specified data. This field is completely ignored by the FreeType library.

      +
      finalizer +

      A pointer to a ‘generic finalizer’ function, which will be called when the object is destroyed. If this field is set to NULL, no code will be called.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_MAKE_TAG

      +
      +Defined in FT_TYPES_H (freetype/fttypes.h). +

      +
      +
      +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
      +          ( ( (FT_ULong)_x1 << 24 ) |     \
      +            ( (FT_ULong)_x2 << 16 ) |     \
      +            ( (FT_ULong)_x3 <<  8 ) |     \
      +              (FT_ULong)_x4         )
      +
      +

      +
      +

      This macro converts four-letter tags which are used to label TrueType tables into an unsigned long to be used within FreeType.

      +

      +
      note
      +

      The produced values must be 32-bit integers. Don't redefine this macro.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-bdf_fonts.html b/src/3rdparty/freetype/docs/reference/ft2-bdf_fonts.html new file mode 100644 index 0000000000..e7bf5a09bd --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-bdf_fonts.html @@ -0,0 +1,252 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +BDF and PCF Files +

      +

      Synopsis

      + + + +
      FT_PropertyTypeBDF_PropertyRecFT_Get_BDF_Property
      BDF_PropertyFT_Get_BDF_Charset_ID


      + +
      +

      This section contains the declaration of functions specific to BDF and PCF fonts.

      +

      +
      +

      FT_PropertyType

      +
      +Defined in FT_BDF_H (freetype/ftbdf.h). +

      +
      +
      +  typedef enum  BDF_PropertyType_
      +  {
      +    BDF_PROPERTY_TYPE_NONE     = 0,
      +    BDF_PROPERTY_TYPE_ATOM     = 1,
      +    BDF_PROPERTY_TYPE_INTEGER  = 2,
      +    BDF_PROPERTY_TYPE_CARDINAL = 3
      +
      +  } BDF_PropertyType;
      +
      +

      +
      +

      A list of BDF property types.

      +

      +
      values
      +

      + + + + + + + +
      BDF_PROPERTY_TYPE_NONE +

      Value 0 is used to indicate a missing property.

      +
      BDF_PROPERTY_TYPE_ATOM +

      Property is a string atom.

      +
      BDF_PROPERTY_TYPE_INTEGER
      +

      Property is a 32-bit signed integer.

      +
      BDF_PROPERTY_TYPE_CARDINAL
      +

      Property is a 32-bit unsigned integer.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      BDF_Property

      +
      +

      A handle to a BDF_PropertyRec structure to model a given BDF/PCF property.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      BDF_PropertyRec

      +
      +Defined in FT_BDF_H (freetype/ftbdf.h). +

      +
      +
      +  typedef struct  BDF_PropertyRec_
      +  {
      +    BDF_PropertyType  type;
      +    union {
      +      const char*     atom;
      +      FT_Int32        integer;
      +      FT_UInt32       cardinal;
      +
      +    } u;
      +
      +  } BDF_PropertyRec;
      +
      +

      +
      +

      This structure models a given BDF/PCF property.

      +

      +
      fields
      +

      + + + + + +
      type +

      The property type.

      +
      u.atom +

      The atom string, if type is BDF_PROPERTY_TYPE_ATOM.

      +
      u.integer +

      A signed integer, if type is BDF_PROPERTY_TYPE_INTEGER.

      +
      u.cardinal +

      An unsigned integer, if type is BDF_PROPERTY_TYPE_CARDINAL.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_BDF_Charset_ID

      +
      +Defined in FT_BDF_H (freetype/ftbdf.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_BDF_Charset_ID( FT_Face       face,
      +                         const char*  *acharset_encoding,
      +                         const char*  *acharset_registry );
      +
      +

      +
      +

      Retrieve a BDF font character set identity, according to the BDF specification.

      +

      +
      input
      +

      + + +
      face +

      A handle to the input face.

      +
      +
      +
      output
      +

      + + + +
      acharset_encoding +

      Charset encoding, as a C string, owned by the face.

      +
      acharset_registry +

      Charset registry, as a C string, owned by the face.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function only works with BDF faces, returning an error otherwise.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_BDF_Property

      +
      +Defined in FT_BDF_H (freetype/ftbdf.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_BDF_Property( FT_Face           face,
      +                       const char*       prop_name,
      +                       BDF_PropertyRec  *aproperty );
      +
      +

      +
      +

      Retrieve a BDF property from a BDF or PCF font file.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the input face.

      +
      name +

      The property name.

      +
      +
      +
      output
      +

      + + +
      aproperty +

      The property.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function works with BDF and PCF fonts. It returns an error otherwise. It also returns an error if the property is not in the font.

      +

      A ‘property’ is a either key-value pair within the STARTPROPERTIES ... ENDPROPERTIES block of a BDF font or a key-value pair from the ‘info->props’ array within a ‘FontRec’ structure of a PCF font.

      +

      Integer properties are always stored as ‘signed’ within PCF fonts; consequently, BDF_PROPERTY_TYPE_CARDINAL is a possible return value for BDF fonts only.

      +

      In case of error, ‘aproperty->type’ is always set to BDF_PROPERTY_TYPE_NONE.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-bitmap_handling.html b/src/3rdparty/freetype/docs/reference/ft2-bitmap_handling.html new file mode 100644 index 0000000000..5fd64d7a00 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-bitmap_handling.html @@ -0,0 +1,302 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Bitmap Handling +

      +

      Synopsis

      + + + +
      FT_Bitmap_NewFT_Bitmap_EmboldenFT_GlyphSlot_Own_Bitmap
      FT_Bitmap_CopyFT_Bitmap_ConvertFT_Bitmap_Done


      + +
      +

      This section contains functions for converting FT_Bitmap objects.

      +

      +
      +

      FT_Bitmap_New

      +
      +Defined in FT_BITMAP_H (freetype/ftbitmap.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Bitmap_New( FT_Bitmap  *abitmap );
      +
      +

      +
      +

      Initialize a pointer to an FT_Bitmap structure.

      +

      +
      inout
      +

      + + +
      abitmap +

      A pointer to the bitmap structure.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Bitmap_Copy

      +
      +Defined in FT_BITMAP_H (freetype/ftbitmap.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Bitmap_Copy( FT_Library        library,
      +                  const FT_Bitmap  *source,
      +                  FT_Bitmap        *target);
      +
      +

      +
      +

      Copy a bitmap into another one.

      +

      +
      input
      +

      + + + +
      library +

      A handle to a library object.

      +
      source +

      A handle to the source bitmap.

      +
      +
      +
      output
      +

      + + +
      target +

      A handle to the target bitmap.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Bitmap_Embolden

      +
      +Defined in FT_BITMAP_H (freetype/ftbitmap.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Bitmap_Embolden( FT_Library  library,
      +                      FT_Bitmap*  bitmap,
      +                      FT_Pos      xStrength,
      +                      FT_Pos      yStrength );
      +
      +

      +
      +

      Embolden a bitmap. The new bitmap will be about ‘xStrength’ pixels wider and ‘yStrength’ pixels higher. The left and bottom borders are kept unchanged.

      +

      +
      input
      +

      + + + + +
      library +

      A handle to a library object.

      +
      xStrength +

      How strong the glyph is emboldened horizontally. Expressed in 26.6 pixel format.

      +
      yStrength +

      How strong the glyph is emboldened vertically. Expressed in 26.6 pixel format.

      +
      +
      +
      inout
      +

      + + +
      bitmap +

      A handle to the target bitmap.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The current implementation restricts ‘xStrength’ to be less than or equal to 8 if bitmap is of pixel_mode FT_PIXEL_MODE_MONO.

      +

      If you want to embolden the bitmap owned by a FT_GlyphSlotRec, you should call FT_GlyphSlot_Own_Bitmap on the slot first.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Bitmap_Convert

      +
      +Defined in FT_BITMAP_H (freetype/ftbitmap.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Bitmap_Convert( FT_Library        library,
      +                     const FT_Bitmap  *source,
      +                     FT_Bitmap        *target,
      +                     FT_Int            alignment );
      +
      +

      +
      +

      Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a bitmap object with depth 8bpp, making the number of used bytes per line (a.k.a. the ‘pitch’) a multiple of ‘alignment’.

      +

      +
      input
      +

      + + + + +
      library +

      A handle to a library object.

      +
      source +

      The source bitmap.

      +
      alignment +

      The pitch of the bitmap is a multiple of this parameter. Common values are 1, 2, or 4.

      +
      +
      +
      output
      +

      + + +
      target +

      The target bitmap.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      It is possible to call FT_Bitmap_Convert multiple times without calling FT_Bitmap_Done (the memory is simply reallocated).

      +

      Use FT_Bitmap_Done to finally remove the bitmap object.

      +

      The ‘library’ argument is taken to have access to FreeType's memory handling functions.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GlyphSlot_Own_Bitmap

      +
      +Defined in FT_BITMAP_H (freetype/ftbitmap.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot );
      +
      +

      +
      +

      Make sure that a glyph slot owns ‘slot->bitmap’.

      +

      +
      input
      +

      + + +
      slot +

      The glyph slot.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function is to be used in combination with FT_Bitmap_Embolden.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Bitmap_Done

      +
      +Defined in FT_BITMAP_H (freetype/ftbitmap.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Bitmap_Done( FT_Library  library,
      +                  FT_Bitmap  *bitmap );
      +
      +

      +
      +

      Destroy a bitmap object created with FT_Bitmap_New.

      +

      +
      input
      +

      + + + +
      library +

      A handle to a library object.

      +
      bitmap +

      The bitmap object to be freed.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The ‘library’ argument is taken to have access to FreeType's memory handling functions.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-cache_subsystem.html b/src/3rdparty/freetype/docs/reference/ft2-cache_subsystem.html new file mode 100644 index 0000000000..8cf3b5a855 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-cache_subsystem.html @@ -0,0 +1,1098 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Cache Sub-System +

      +

      Synopsis

      + + + + + + + + + + + + + + + +
      FTC_ManagerFTC_CMapCache_New
      FTC_FaceIDFTC_CMapCache_Lookup
      FTC_Face_RequesterFTC_ImageTypeRec
      FTC_NodeFTC_ImageType
      FTC_Manager_NewFTC_ImageCache
      FTC_Manager_ResetFTC_ImageCache_New
      FTC_Manager_DoneFTC_ImageCache_Lookup
      FTC_Manager_LookupFaceFTC_ImageCache_LookupScaler
      FTC_ScalerRecFTC_SBit
      FTC_ScalerFTC_SBitRec
      FTC_Manager_LookupSizeFTC_SBitCache
      FTC_Node_UnrefFTC_SBitCache_New
      FTC_Manager_RemoveFaceIDFTC_SBitCache_Lookup
      FTC_CMapCacheFTC_SBitCache_LookupScaler


      + +
      +

      This section describes the FreeType 2 cache sub-system, which is used to limit the number of concurrently opened FT_Face and FT_Size objects, as well as caching information like character maps and glyph images while limiting their maximum memory usage.

      +

      Note that all types and functions begin with the ‘FTC_’ prefix.

      +

      The cache is highly portable and thus doesn't know anything about the fonts installed on your system, or how to access them. This implies the following scheme:

      +

      First, available or installed font faces are uniquely identified by FTC_FaceID values, provided to the cache by the client. Note that the cache only stores and compares these values, and doesn't try to interpret them in any way.

      +

      Second, the cache calls, only when needed, a client-provided function to convert a FTC_FaceID into a new FT_Face object. The latter is then completely managed by the cache, including its termination through FT_Done_Face.

      +

      Clients are free to map face IDs to anything else. The most simple usage is to associate them to a (pathname,face_index) pair that is used to call FT_New_Face. However, more complex schemes are also possible.

      +

      Note that for the cache to work correctly, the face ID values must be persistent, which means that the contents they point to should not change at runtime, or that their value should not become invalid.

      +

      If this is unavoidable (e.g., when a font is uninstalled at runtime), you should call FTC_Manager_RemoveFaceID as soon as possible, to let the cache get rid of any references to the old FTC_FaceID it may keep internally. Failure to do so will lead to incorrect behaviour or even crashes.

      +

      To use the cache, start with calling FTC_Manager_New to create a new FTC_Manager object, which models a single cache instance. You can then look up FT_Face and FT_Size objects with FTC_Manager_LookupFace and FTC_Manager_LookupSize, respectively.

      +

      If you want to use the charmap caching, call FTC_CMapCache_New, then later use FTC_CMapCache_Lookup to perform the equivalent of FT_Get_Char_Index, only much faster.

      +

      If you want to use the FT_Glyph caching, call FTC_ImageCache, then later use FTC_ImageCache_Lookup to retrieve the corresponding FT_Glyph objects from the cache.

      +

      If you need lots of small bitmaps, it is much more memory efficient to call FTC_SBitCache_New followed by FTC_SBitCache_Lookup. This returns FTC_SBitRec structures, which are used to store small bitmaps directly. (A small bitmap is one whose metrics and dimensions all fit into 8-bit integers).

      +

      We hope to also provide a kerning cache in the near future.

      +

      +
      +

      FTC_Manager

      +
      +

      This object corresponds to one instance of the cache-subsystem. It is used to cache one or more FT_Face objects, along with corresponding FT_Size objects.

      +

      The manager intentionally limits the total number of opened FT_Face and FT_Size objects to control memory usage. See the ‘max_faces’ and ‘max_sizes’ parameters of FTC_Manager_New.

      +

      The manager is also used to cache ‘nodes’ of various types while limiting their total memory usage.

      +

      All limitations are enforced by keeping lists of managed objects in most-recently-used order, and flushing old nodes to make room for new ones.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_FaceID

      +
      +

      An opaque pointer type that is used to identity face objects. The contents of such objects is application-dependent.

      +

      These pointers are typically used to point to a user-defined structure containing a font file path, and face index.

      +

      +
      note
      +

      Never use NULL as a valid FTC_FaceID.

      +

      Face IDs are passed by the client to the cache manager, which calls, when needed, the FTC_Face_Requester to translate them into new FT_Face objects.

      +

      If the content of a given face ID changes at runtime, or if the value becomes invalid (e.g., when uninstalling a font), you should immediately call FTC_Manager_RemoveFaceID before any other cache function.

      +

      Failure to do so will result in incorrect behaviour or even memory leaks and crashes.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Face_Requester

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  typedef FT_Error
      +  (*FTC_Face_Requester)( FTC_FaceID  face_id,
      +                         FT_Library  library,
      +                         FT_Pointer  request_data,
      +                         FT_Face*    aface );
      +
      +

      +
      +

      A callback function provided by client applications. It is used by the cache manager to translate a given FTC_FaceID into a new valid FT_Face object, on demand.

      +

      +
      input
      +

      + + + + +
      face_id +

      The face ID to resolve.

      +
      library +

      A handle to a FreeType library object.

      +
      req_data +

      Application-provided request data (see note below).

      +
      +
      +
      output
      +

      + + +
      aface +

      A new FT_Face handle.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The third parameter ‘req_data’ is the same as the one passed by the client when FTC_Manager_New is called.

      +

      The face requester should not perform funny things on the returned face object, like creating a new FT_Size for it, or setting a transformation through FT_Set_Transform!

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Node

      +
      +

      An opaque handle to a cache node object. Each cache node is reference-counted. A node with a count of 0 might be flushed out of a full cache whenever a lookup request is performed.

      +

      If you lookup nodes, you have the ability to ‘acquire’ them, i.e., to increment their reference count. This will prevent the node from being flushed out of the cache until you explicitly ‘release’ it (see FTC_Node_Unref).

      +

      See also FTC_SBitCache_Lookup and FTC_ImageCache_Lookup.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Manager_New

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_Manager_New( FT_Library          library,
      +                   FT_UInt             max_faces,
      +                   FT_UInt             max_sizes,
      +                   FT_ULong            max_bytes,
      +                   FTC_Face_Requester  requester,
      +                   FT_Pointer          req_data,
      +                   FTC_Manager        *amanager );
      +
      +

      +
      +

      Create a new cache manager.

      +

      +
      input
      +

      + + + + + + + +
      library +

      The parent FreeType library handle to use.

      +
      max_faces +

      Maximum number of opened FT_Face objects managed by this cache instance. Use 0 for defaults.

      +
      max_sizes +

      Maximum number of opened FT_Size objects managed by this cache instance. Use 0 for defaults.

      +
      max_bytes +

      Maximum number of bytes to use for cached data nodes. Use 0 for defaults. Note that this value does not account for managed FT_Face and FT_Size objects.

      +
      requester +

      An application-provided callback used to translate face IDs into real FT_Face objects.

      +
      req_data +

      A generic pointer that is passed to the requester each time it is called (see FTC_Face_Requester).

      +
      +
      +
      output
      +

      + + +
      amanager +

      A handle to a new manager object. 0 in case of failure.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Manager_Reset

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FTC_Manager_Reset( FTC_Manager  manager );
      +
      +

      +
      +

      Empty a given cache manager. This simply gets rid of all the currently cached FT_Face and FT_Size objects within the manager.

      +

      +
      inout
      +

      + + +
      manager +

      A handle to the manager.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Manager_Done

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FTC_Manager_Done( FTC_Manager  manager );
      +
      +

      +
      +

      Destroy a given manager after emptying it.

      +

      +
      input
      +

      + + +
      manager +

      A handle to the target cache manager object.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Manager_LookupFace

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_Manager_LookupFace( FTC_Manager  manager,
      +                          FTC_FaceID   face_id,
      +                          FT_Face     *aface );
      +
      +

      +
      +

      Retrieve the FT_Face object that corresponds to a given face ID through a cache manager.

      +

      +
      input
      +

      + + + +
      manager +

      A handle to the cache manager.

      +
      face_id +

      The ID of the face object.

      +
      +
      +
      output
      +

      + + +
      aface +

      A handle to the face object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The returned FT_Face object is always owned by the manager. You should never try to discard it yourself.

      +

      The FT_Face object doesn't necessarily have a current size object (i.e., face->size can be 0). If you need a specific ‘font size’, use FTC_Manager_LookupSize instead.

      +

      Never change the face's transformation matrix (i.e., never call the FT_Set_Transform function) on a returned face! If you need to transform glyphs, do it yourself after glyph loading.

      +

      When you perform a lookup, out-of-memory errors are detected within the lookup and force incremental flushes of the cache until enough memory is released for the lookup to succeed.

      +

      If a lookup fails with ‘FT_Err_Out_Of_Memory’ the cache has already been completely flushed, and still no memory was available for the operation.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_ScalerRec

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  typedef struct  FTC_ScalerRec_
      +  {
      +    FTC_FaceID  face_id;
      +    FT_UInt     width;
      +    FT_UInt     height;
      +    FT_Int      pixel;
      +    FT_UInt     x_res;
      +    FT_UInt     y_res;
      +
      +  } FTC_ScalerRec;
      +
      +

      +
      +

      A structure used to describe a given character size in either pixels or points to the cache manager. See FTC_Manager_LookupSize.

      +

      +
      fields
      +

      + + + + + + + +
      face_id +

      The source face ID.

      +
      width +

      The character width.

      +
      height +

      The character height.

      +
      pixel +

      A Boolean. If 1, the ‘width’ and ‘height’ fields are interpreted as integer pixel character sizes. Otherwise, they are expressed as 1/64th of points.

      +
      x_res +

      Only used when ‘pixel’ is value 0 to indicate the horizontal resolution in dpi.

      +
      y_res +

      Only used when ‘pixel’ is value 0 to indicate the vertical resolution in dpi.

      +
      +
      +
      note
      +

      This type is mainly used to retrieve FT_Size objects through the cache manager.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Scaler

      +
      +

      A handle to an FTC_ScalerRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Manager_LookupSize

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_Manager_LookupSize( FTC_Manager  manager,
      +                          FTC_Scaler   scaler,
      +                          FT_Size     *asize );
      +
      +

      +
      +

      Retrieve the FT_Size object that corresponds to a given FTC_ScalerRec pointer through a cache manager.

      +

      +
      input
      +

      + + + +
      manager +

      A handle to the cache manager.

      +
      scaler +

      A scaler handle.

      +
      +
      +
      output
      +

      + + +
      asize +

      A handle to the size object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The returned FT_Size object is always owned by the manager. You should never try to discard it by yourself.

      +

      You can access the parent FT_Face object simply as ‘size->face’ if you need it. Note that this object is also owned by the manager.

      +
      +
      note
      +

      When you perform a lookup, out-of-memory errors are detected within the lookup and force incremental flushes of the cache until enough memory is released for the lookup to succeed.

      +

      If a lookup fails with ‘FT_Err_Out_Of_Memory’ the cache has already been completely flushed, and still no memory is available for the operation.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Node_Unref

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FTC_Node_Unref( FTC_Node     node,
      +                  FTC_Manager  manager );
      +
      +

      +
      +

      Decrement a cache node's internal reference count. When the count reaches 0, it is not destroyed but becomes eligible for subsequent cache flushes.

      +

      +
      input
      +

      + + + +
      node +

      The cache node handle.

      +
      manager +

      The cache manager handle.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_Manager_RemoveFaceID

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FTC_Manager_RemoveFaceID( FTC_Manager  manager,
      +                            FTC_FaceID   face_id );
      +
      +

      +
      +

      A special function used to indicate to the cache manager that a given FTC_FaceID is no longer valid, either because its content changed, or because it was deallocated or uninstalled.

      +

      +
      input
      +

      + + + +
      manager +

      The cache manager handle.

      +
      face_id +

      The FTC_FaceID to be removed.

      +
      +
      +
      note
      +

      This function flushes all nodes from the cache corresponding to this ‘face_id’, with the exception of nodes with a non-null reference count.

      +

      Such nodes are however modified internally so as to never appear in later lookups with the same ‘face_id’ value, and to be immediately destroyed when released by all their users.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_CMapCache

      +
      +

      An opaque handle used to model a charmap cache. This cache is to hold character codes -> glyph indices mappings.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_CMapCache_New

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_CMapCache_New( FTC_Manager     manager,
      +                     FTC_CMapCache  *acache );
      +
      +

      +
      +

      Create a new charmap cache.

      +

      +
      input
      +

      + + +
      manager +

      A handle to the cache manager.

      +
      +
      +
      output
      +

      + + +
      acache +

      A new cache handle. NULL in case of error.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      Like all other caches, this one will be destroyed with the cache manager.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_CMapCache_Lookup

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_UInt )
      +  FTC_CMapCache_Lookup( FTC_CMapCache  cache,
      +                        FTC_FaceID     face_id,
      +                        FT_Int         cmap_index,
      +                        FT_UInt32      char_code );
      +
      +

      +
      +

      Translate a character code into a glyph index, using the charmap cache.

      +

      +
      input
      +

      + + + + + +
      cache +

      A charmap cache handle.

      +
      face_id +

      The source face ID.

      +
      cmap_index +

      The index of the charmap in the source face. Any negative value means to use the cache FT_Face's default charmap.

      +
      char_code +

      The character code (in the corresponding charmap).

      +
      +
      +
      return
      +

      Glyph index. 0 means ‘no glyph’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_ImageTypeRec

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  typedef struct  FTC_ImageTypeRec_
      +  {
      +    FTC_FaceID  face_id;
      +    FT_Int      width;
      +    FT_Int      height;
      +    FT_Int32    flags;
      +
      +  } FTC_ImageTypeRec;
      +
      +

      +
      +

      A structure used to model the type of images in a glyph cache.

      +

      +
      fields
      +

      + + + + + +
      face_id +

      The face ID.

      +
      width +

      The width in pixels.

      +
      height +

      The height in pixels.

      +
      flags +

      The load flags, as in FT_Load_Glyph.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_ImageType

      +
      +

      A handle to an FTC_ImageTypeRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_ImageCache

      +
      +

      A handle to an glyph image cache object. They are designed to hold many distinct glyph images while not exceeding a certain memory threshold.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_ImageCache_New

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_ImageCache_New( FTC_Manager      manager,
      +                      FTC_ImageCache  *acache );
      +
      +

      +
      +

      Create a new glyph image cache.

      +

      +
      input
      +

      + + +
      manager +

      The parent manager for the image cache.

      +
      +
      +
      output
      +

      + + +
      acache +

      A handle to the new glyph image cache object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_ImageCache_Lookup

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_ImageCache_Lookup( FTC_ImageCache  cache,
      +                         FTC_ImageType   type,
      +                         FT_UInt         gindex,
      +                         FT_Glyph       *aglyph,
      +                         FTC_Node       *anode );
      +
      +

      +
      +

      Retrieve a given glyph image from a glyph image cache.

      +

      +
      input
      +

      + + + + +
      cache +

      A handle to the source glyph image cache.

      +
      type +

      A pointer to a glyph image type descriptor.

      +
      gindex +

      The glyph index to retrieve.

      +
      +
      +
      output
      +

      + + + +
      aglyph +

      The corresponding FT_Glyph object. 0 in case of failure.

      +
      anode +

      Used to return the address of of the corresponding cache node after incrementing its reference count (see note below).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The returned glyph is owned and managed by the glyph image cache. Never try to transform or discard it manually! You can however create a copy with FT_Glyph_Copy and modify the new one.

      +

      If ‘anode’ is not NULL, it receives the address of the cache node containing the glyph image, after increasing its reference count. This ensures that the node (as well as the FT_Glyph) will always be kept in the cache until you call FTC_Node_Unref to ‘release’ it.

      +

      If ‘anode’ is NULL, the cache node is left unchanged, which means that the FT_Glyph could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is persistent!

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_ImageCache_LookupScaler

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,
      +                               FTC_Scaler      scaler,
      +                               FT_ULong        load_flags,
      +                               FT_UInt         gindex,
      +                               FT_Glyph       *aglyph,
      +                               FTC_Node       *anode );
      +
      +

      +
      +

      A variant of FTC_ImageCache_Lookup that uses an FTC_ScalerRec to specify the face ID and its size.

      +

      +
      input
      +

      + + + + + +
      cache +

      A handle to the source glyph image cache.

      +
      scaler +

      A pointer to a scaler descriptor.

      +
      load_flags +

      The corresponding load flags.

      +
      gindex +

      The glyph index to retrieve.

      +
      +
      +
      output
      +

      + + + +
      aglyph +

      The corresponding FT_Glyph object. 0 in case of failure.

      +
      anode +

      Used to return the address of of the corresponding cache node after incrementing its reference count (see note below).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The returned glyph is owned and managed by the glyph image cache. Never try to transform or discard it manually! You can however create a copy with FT_Glyph_Copy and modify the new one.

      +

      If ‘anode’ is not NULL, it receives the address of the cache node containing the glyph image, after increasing its reference count. This ensures that the node (as well as the FT_Glyph) will always be kept in the cache until you call FTC_Node_Unref to ‘release’ it.

      +

      If ‘anode’ is NULL, the cache node is left unchanged, which means that the FT_Glyph could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is persistent!

      +

      Calls to FT_Set_Char_Size and friends have no effect on cached glyphs; you should always use the FreeType cache API instead.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_SBit

      +
      +

      A handle to a small bitmap descriptor. See the FTC_SBitRec structure for details.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_SBitRec

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  typedef struct  FTC_SBitRec_
      +  {
      +    FT_Byte   width;
      +    FT_Byte   height;
      +    FT_Char   left;
      +    FT_Char   top;
      +
      +    FT_Byte   format;
      +    FT_Byte   max_grays;
      +    FT_Short  pitch;
      +    FT_Char   xadvance;
      +    FT_Char   yadvance;
      +
      +    FT_Byte*  buffer;
      +
      +  } FTC_SBitRec;
      +
      +

      +
      +

      A very compact structure used to describe a small glyph bitmap.

      +

      +
      fields
      +

      + + + + + + + + + + + +
      width +

      The bitmap width in pixels.

      +
      height +

      The bitmap height in pixels.

      +
      left +

      The horizontal distance from the pen position to the left bitmap border (a.k.a. ‘left side bearing’, or ‘lsb’).

      +
      top +

      The vertical distance from the pen position (on the baseline) to the upper bitmap border (a.k.a. ‘top side bearing’). The distance is positive for upwards y coordinates.

      +
      format +

      The format of the glyph bitmap (monochrome or gray).

      +
      max_grays +

      Maximum gray level value (in the range 1 to 255).

      +
      pitch +

      The number of bytes per bitmap line. May be positive or negative.

      +
      xadvance +

      The horizontal advance width in pixels.

      +
      yadvance +

      The vertical advance height in pixels.

      +
      buffer +

      A pointer to the bitmap pixels.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_SBitCache

      +
      +

      A handle to a small bitmap cache. These are special cache objects used to store small glyph bitmaps (and anti-aliased pixmaps) in a much more efficient way than the traditional glyph image cache implemented by FTC_ImageCache.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_SBitCache_New

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_SBitCache_New( FTC_Manager     manager,
      +                     FTC_SBitCache  *acache );
      +
      +

      +
      +

      Create a new cache to store small glyph bitmaps.

      +

      +
      input
      +

      + + +
      manager +

      A handle to the source cache manager.

      +
      +
      +
      output
      +

      + + +
      acache +

      A handle to the new sbit cache. NULL in case of error.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_SBitCache_Lookup

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_SBitCache_Lookup( FTC_SBitCache    cache,
      +                        FTC_ImageType    type,
      +                        FT_UInt          gindex,
      +                        FTC_SBit        *sbit,
      +                        FTC_Node        *anode );
      +
      +

      +
      +

      Look up a given small glyph bitmap in a given sbit cache and ‘lock’ it to prevent its flushing from the cache until needed.

      +

      +
      input
      +

      + + + + +
      cache +

      A handle to the source sbit cache.

      +
      type +

      A pointer to the glyph image type descriptor.

      +
      gindex +

      The glyph index.

      +
      +
      +
      output
      +

      + + + +
      sbit +

      A handle to a small bitmap descriptor.

      +
      anode +

      Used to return the address of of the corresponding cache node after incrementing its reference count (see note below).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The small bitmap descriptor and its bit buffer are owned by the cache and should never be freed by the application. They might as well disappear from memory on the next cache lookup, so don't treat them as persistent data.

      +

      The descriptor's ‘buffer’ field is set to 0 to indicate a missing glyph bitmap.

      +

      If ‘anode’ is not NULL, it receives the address of the cache node containing the bitmap, after increasing its reference count. This ensures that the node (as well as the image) will always be kept in the cache until you call FTC_Node_Unref to ‘release’ it.

      +

      If ‘anode’ is NULL, the cache node is left unchanged, which means that the bitmap could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is persistent!

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FTC_SBitCache_LookupScaler

      +
      +Defined in FT_CACHE_H (freetype/ftcache.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,
      +                              FTC_Scaler     scaler,
      +                              FT_ULong       load_flags,
      +                              FT_UInt        gindex,
      +                              FTC_SBit      *sbit,
      +                              FTC_Node      *anode );
      +
      +

      +
      +

      A variant of FTC_SBitCache_Lookup that uses an FTC_ScalerRec to specify the face ID and its size.

      +

      +
      input
      +

      + + + + + +
      cache +

      A handle to the source sbit cache.

      +
      scaler +

      A pointer to the scaler descriptor.

      +
      load_flags +

      The corresponding load flags.

      +
      gindex +

      The glyph index.

      +
      +
      +
      output
      +

      + + + +
      sbit +

      A handle to a small bitmap descriptor.

      +
      anode +

      Used to return the address of of the corresponding cache node after incrementing its reference count (see note below).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The small bitmap descriptor and its bit buffer are owned by the cache and should never be freed by the application. They might as well disappear from memory on the next cache lookup, so don't treat them as persistent data.

      +

      The descriptor's ‘buffer’ field is set to 0 to indicate a missing glyph bitmap.

      +

      If ‘anode’ is not NULL, it receives the address of the cache node containing the bitmap, after increasing its reference count. This ensures that the node (as well as the image) will always be kept in the cache until you call FTC_Node_Unref to ‘release’ it.

      +

      If ‘anode’ is NULL, the cache node is left unchanged, which means that the bitmap could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is persistent!

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-cid_fonts.html b/src/3rdparty/freetype/docs/reference/ft2-cid_fonts.html new file mode 100644 index 0000000000..2749e55047 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-cid_fonts.html @@ -0,0 +1,204 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +CID Fonts +

      +

      Synopsis

      + + + + +
      FT_Get_CID_Registry_Ordering_Supplement
      FT_Get_CID_Is_Internally_CID_Keyed
      FT_Get_CID_From_Glyph_Index


      + +
      +

      This section contains the declaration of CID-keyed font specific functions.

      +

      +
      +

      FT_Get_CID_Registry_Ordering_Supplement

      +
      +Defined in FT_CID_H (freetype/ftcid.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
      +                                           const char*  *registry,
      +                                           const char*  *ordering,
      +                                           FT_Int       *supplement);
      +
      +

      +
      +

      Retrieve the Registry/Ordering/Supplement triple (also known as the "R/O/S") from a CID-keyed font.

      +

      +
      input
      +

      + + +
      face +

      A handle to the input face.

      +
      +
      +
      output
      +

      + + + + +
      registry +

      The registry, as a C string, owned by the face.

      +
      ordering +

      The ordering, as a C string, owned by the face.

      +
      supplement +

      The supplement.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function only works with CID faces, returning an error otherwise.

      +
      +
      since
      +

      2.3.6

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_CID_Is_Internally_CID_Keyed

      +
      +Defined in FT_CID_H (freetype/ftcid.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,
      +                                      FT_Bool  *is_cid );
      +
      +

      +
      +

      Retrieve the type of the input face, CID keyed or not. In constrast to the FT_IS_CID_KEYED macro this function returns successfully also for CID-keyed fonts in an SNFT wrapper.

      +

      +
      input
      +

      + + +
      face +

      A handle to the input face.

      +
      +
      +
      output
      +

      + + +
      is_cid +

      The type of the face as an FT_Bool.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function only works with CID faces and OpenType fonts, returning an error otherwise.

      +
      +
      since
      +

      2.3.9

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_CID_From_Glyph_Index

      +
      +Defined in FT_CID_H (freetype/ftcid.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_CID_From_Glyph_Index( FT_Face   face,
      +                               FT_UInt   glyph_index,
      +                               FT_UInt  *cid );
      +
      +

      +
      +

      Retrieve the CID of the input glyph index.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the input face.

      +
      glyph_index +

      The input glyph index.

      +
      +
      +
      output
      +

      + + +
      cid +

      The CID as an FT_UInt.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function only works with CID faces and OpenType fonts, returning an error otherwise.

      +
      +
      since
      +

      2.3.9

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-computations.html b/src/3rdparty/freetype/docs/reference/ft2-computations.html new file mode 100644 index 0000000000..608139011c --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-computations.html @@ -0,0 +1,792 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Computations +

      +

      Synopsis

      + + + + + + + + + +
      FT_MulDivFT_Matrix_InvertFT_Tan
      FT_MulFixFT_AngleFT_Atan2
      FT_DivFixFT_ANGLE_PIFT_Angle_Diff
      FT_RoundFixFT_ANGLE_2PIFT_Vector_Unit
      FT_CeilFixFT_ANGLE_PI2FT_Vector_Rotate
      FT_FloorFixFT_ANGLE_PI4FT_Vector_Length
      FT_Vector_TransformFT_SinFT_Vector_Polarize
      FT_Matrix_MultiplyFT_CosFT_Vector_From_Polar


      + +
      +

      This section contains various functions used to perform computations on 16.16 fixed-float numbers or 2d vectors.

      +

      +
      +

      FT_MulDiv

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Long )
      +  FT_MulDiv( FT_Long  a,
      +             FT_Long  b,
      +             FT_Long  c );
      +
      +

      +
      +

      A very simple function used to perform the computation ‘(a*b)/c’ with maximal accuracy (it uses a 64-bit intermediate integer whenever necessary).

      +

      This function isn't necessarily as fast as some processor specific operations, but is at least completely portable.

      +

      +
      input
      +

      + + + + +
      a +

      The first multiplier.

      +
      b +

      The second multiplier.

      +
      c +

      The divisor.

      +
      +
      +
      return
      +

      The result of ‘(a*b)/c’. This function never traps when trying to divide by zero; it simply returns ‘MaxInt’ or ‘MinInt’ depending on the signs of ‘a’ and ‘b’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_MulFix

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Long )
      +  FT_MulFix( FT_Long  a,
      +             FT_Long  b );
      +
      +

      +
      +

      A very simple function used to perform the computation ‘(a*b)/0x10000’ with maximal accuracy. Most of the time this is used to multiply a given value by a 16.16 fixed float factor.

      +

      +
      input
      +

      + + + +
      a +

      The first multiplier.

      +
      b +

      The second multiplier. Use a 16.16 factor here whenever possible (see note below).

      +
      +
      +
      return
      +

      The result of ‘(a*b)/0x10000’.

      +
      +
      note
      +

      This function has been optimized for the case where the absolute value of ‘a’ is less than 2048, and ‘b’ is a 16.16 scaling factor. As this happens mainly when scaling from notional units to fractional pixels in FreeType, it resulted in noticeable speed improvements between versions 2.x and 1.x.

      +

      As a conclusion, always try to place a 16.16 factor as the second argument of this function; this can make a great difference.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_DivFix

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Long )
      +  FT_DivFix( FT_Long  a,
      +             FT_Long  b );
      +
      +

      +
      +

      A very simple function used to perform the computation ‘(a*0x10000)/b’ with maximal accuracy. Most of the time, this is used to divide a given value by a 16.16 fixed float factor.

      +

      +
      input
      +

      + + + +
      a +

      The first multiplier.

      +
      b +

      The second multiplier. Use a 16.16 factor here whenever possible (see note below).

      +
      +
      +
      return
      +

      The result of ‘(a*0x10000)/b’.

      +
      +
      note
      +

      The optimization for FT_DivFix() is simple: If (a << 16) fits in 32 bits, then the division is computed directly. Otherwise, we use a specialized version of FT_MulDiv.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_RoundFix

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Fixed )
      +  FT_RoundFix( FT_Fixed  a );
      +
      +

      +
      +

      A very simple function used to round a 16.16 fixed number.

      +

      +
      input
      +

      + + +
      a +

      The number to be rounded.

      +
      +
      +
      return
      +

      The result of ‘(a + 0x8000) & -0x10000’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CeilFix

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Fixed )
      +  FT_CeilFix( FT_Fixed  a );
      +
      +

      +
      +

      A very simple function used to compute the ceiling function of a 16.16 fixed number.

      +

      +
      input
      +

      + + +
      a +

      The number for which the ceiling function is to be computed.

      +
      +
      +
      return
      +

      The result of ‘(a + 0x10000 - 1) & -0x10000’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_FloorFix

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Fixed )
      +  FT_FloorFix( FT_Fixed  a );
      +
      +

      +
      +

      A very simple function used to compute the floor function of a 16.16 fixed number.

      +

      +
      input
      +

      + + +
      a +

      The number for which the floor function is to be computed.

      +
      +
      +
      return
      +

      The result of ‘a & -0x10000’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Vector_Transform

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Vector_Transform( FT_Vector*        vec,
      +                       const FT_Matrix*  matrix );
      +
      +

      +
      +

      Transform a single vector through a 2x2 matrix.

      +

      +
      inout
      +

      + + +
      vector +

      The target vector to transform.

      +
      +
      +
      input
      +

      + + +
      matrix +

      A pointer to the source 2x2 matrix.

      +
      +
      +
      note
      +

      The result is undefined if either ‘vector’ or ‘matrix’ is invalid.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Matrix_Multiply

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Matrix_Multiply( const FT_Matrix*  a,
      +                      FT_Matrix*        b );
      +
      +

      +
      +

      Perform the matrix operation ‘b = a*b’.

      +

      +
      input
      +

      + + +
      a +

      A pointer to matrix ‘a’.

      +
      +
      +
      inout
      +

      + + +
      b +

      A pointer to matrix ‘b’.

      +
      +
      +
      note
      +

      The result is undefined if either ‘a’ or ‘b’ is zero.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Matrix_Invert

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Matrix_Invert( FT_Matrix*  matrix );
      +
      +

      +
      +

      Invert a 2x2 matrix. Return an error if it can't be inverted.

      +

      +
      inout
      +

      + + +
      matrix +

      A pointer to the target matrix. Remains untouched in case of error.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Angle

      +
      +

      This type is used to model angle values in FreeType. Note that the angle is a 16.16 fixed float value expressed in degrees.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ANGLE_PI

      +
      +

      The angle pi expressed in FT_Angle units.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ANGLE_2PI

      +
      +

      The angle 2*pi expressed in FT_Angle units.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ANGLE_PI2

      +
      +

      The angle pi/2 expressed in FT_Angle units.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ANGLE_PI4

      +
      +

      The angle pi/4 expressed in FT_Angle units.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Sin

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( FT_Fixed )
      +  FT_Sin( FT_Angle  angle );
      +
      +

      +
      +

      Return the sinus of a given angle in fixed point format.

      +

      +
      input
      +

      + + +
      angle +

      The input angle.

      +
      +
      +
      return
      +

      The sinus value.

      +
      +
      note
      +

      If you need both the sinus and cosinus for a given angle, use the function FT_Vector_Unit.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Cos

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( FT_Fixed )
      +  FT_Cos( FT_Angle  angle );
      +
      +

      +
      +

      Return the cosinus of a given angle in fixed point format.

      +

      +
      input
      +

      + + +
      angle +

      The input angle.

      +
      +
      +
      return
      +

      The cosinus value.

      +
      +
      note
      +

      If you need both the sinus and cosinus for a given angle, use the function FT_Vector_Unit.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Tan

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( FT_Fixed )
      +  FT_Tan( FT_Angle  angle );
      +
      +

      +
      +

      Return the tangent of a given angle in fixed point format.

      +

      +
      input
      +

      + + +
      angle +

      The input angle.

      +
      +
      +
      return
      +

      The tangent value.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Atan2

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( FT_Angle )
      +  FT_Atan2( FT_Fixed  x,
      +            FT_Fixed  y );
      +
      +

      +
      +

      Return the arc-tangent corresponding to a given vector (x,y) in the 2d plane.

      +

      +
      input
      +

      + + + +
      x +

      The horizontal vector coordinate.

      +
      y +

      The vertical vector coordinate.

      +
      +
      +
      return
      +

      The arc-tangent value (i.e. angle).

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Angle_Diff

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( FT_Angle )
      +  FT_Angle_Diff( FT_Angle  angle1,
      +                 FT_Angle  angle2 );
      +
      +

      +
      +

      Return the difference between two angles. The result is always constrained to the ]-PI..PI] interval.

      +

      +
      input
      +

      + + + +
      angle1 +

      First angle.

      +
      angle2 +

      Second angle.

      +
      +
      +
      return
      +

      Constrained value of ‘value2-value1’.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Vector_Unit

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Vector_Unit( FT_Vector*  vec,
      +                  FT_Angle    angle );
      +
      +

      +
      +

      Return the unit vector corresponding to a given angle. After the call, the value of ‘vec.x’ will be ‘sin(angle)’, and the value of ‘vec.y’ will be ‘cos(angle)’.

      +

      This function is useful to retrieve both the sinus and cosinus of a given angle quickly.

      +

      +
      output
      +

      + + +
      vec +

      The address of target vector.

      +
      +
      +
      input
      +

      + + +
      angle +

      The address of angle.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Vector_Rotate

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Vector_Rotate( FT_Vector*  vec,
      +                    FT_Angle    angle );
      +
      +

      +
      +

      Rotate a vector by a given angle.

      +

      +
      inout
      +

      + + +
      vec +

      The address of target vector.

      +
      +
      +
      input
      +

      + + +
      angle +

      The address of angle.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Vector_Length

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( FT_Fixed )
      +  FT_Vector_Length( FT_Vector*  vec );
      +
      +

      +
      +

      Return the length of a given vector.

      +

      +
      input
      +

      + + +
      vec +

      The address of target vector.

      +
      +
      +
      return
      +

      The vector length, expressed in the same units that the original vector coordinates.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Vector_Polarize

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Vector_Polarize( FT_Vector*  vec,
      +                      FT_Fixed   *length,
      +                      FT_Angle   *angle );
      +
      +

      +
      +

      Compute both the length and angle of a given vector.

      +

      +
      input
      +

      + + +
      vec +

      The address of source vector.

      +
      +
      +
      output
      +

      + + + +
      length +

      The vector length.

      +
      angle +

      The vector angle.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Vector_From_Polar

      +
      +Defined in FT_TRIGONOMETRY_H (freetype/fttrigon.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Vector_From_Polar( FT_Vector*  vec,
      +                        FT_Fixed    length,
      +                        FT_Angle    angle );
      +
      +

      +
      +

      Compute vector coordinates from a length and angle.

      +

      +
      output
      +

      + + +
      vec +

      The address of source vector.

      +
      +
      +
      input
      +

      + + + +
      length +

      The vector length.

      +
      angle +

      The vector angle.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-font_formats.html b/src/3rdparty/freetype/docs/reference/ft2-font_formats.html new file mode 100644 index 0000000000..589d749f82 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-font_formats.html @@ -0,0 +1,83 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Font Formats +

      +

      Synopsis

      + + +
      FT_Get_X11_Font_Format


      + +
      +

      The single function in this section can be used to get the font format. Note that this information is not needed normally; however, there are special cases (like in PDF devices) where it is important to differentiate, in spite of FreeType's uniform API.

      +

      +
      +

      FT_Get_X11_Font_Format

      +
      +Defined in FT_XFREE86_H (freetype/ftxf86.h). +

      +
      +
      +  FT_EXPORT( const char* )
      +  FT_Get_X11_Font_Format( FT_Face  face );
      +
      +

      +
      +

      Return a string describing the format of a given face, using values which can be used as an X11 FONT_PROPERTY. Possible values are ‘TrueType’, ‘Type 1’, ‘BDF’, ‘PCF’, ‘Type 42’, ‘CID Type 1’, ‘CFF’, ‘PFR’, and ‘Windows FNT’.

      +

      +
      input
      +

      + + +
      face +

      Input face handle.

      +
      +
      +
      return
      +

      Font format string. NULL in case of error.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-gasp_table.html b/src/3rdparty/freetype/docs/reference/ft2-gasp_table.html new file mode 100644 index 0000000000..2f0d2f50c2 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-gasp_table.html @@ -0,0 +1,141 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Gasp Table +

      +

      Synopsis

      + + +
      FT_GASP_XXXFT_Get_Gasp


      + +
      +

      The function FT_Get_Gasp can be used to query a TrueType or OpenType font for specific entries in its ‘gasp’ table, if any. This is mainly useful when implementing native TrueType hinting with the bytecode interpreter to duplicate the Windows text rendering results.

      +

      +
      +

      FT_GASP_XXX

      +
      +Defined in FT_GASP_H (freetype/ftgasp.h). +

      +
      +
      +#define FT_GASP_NO_TABLE               -1
      +#define FT_GASP_DO_GRIDFIT           0x01
      +#define FT_GASP_DO_GRAY              0x02
      +#define FT_GASP_SYMMETRIC_SMOOTHING  0x08
      +#define FT_GASP_SYMMETRIC_GRIDFIT    0x10
      +
      +

      +
      +

      A list of values and/or bit-flags returned by the FT_Get_Gasp function.

      +

      +
      values
      +

      + + + + + + + + +
      FT_GASP_NO_TABLE +

      This special value means that there is no GASP table in this face. It is up to the client to decide what to do.

      +
      FT_GASP_DO_GRIDFIT +

      Grid-fitting and hinting should be performed at the specified ppem. This really means TrueType bytecode interpretation.

      +
      FT_GASP_DO_GRAY +

      Anti-aliased rendering should be performed at the specified ppem.

      +
      FT_GASP_SYMMETRIC_SMOOTHING
      +

      Smoothing along multiple axes must be used with ClearType.

      +
      FT_GASP_SYMMETRIC_GRIDFIT
      +

      Grid-fitting must be used with ClearType's symmetric smoothing.

      +
      +
      +
      note
      +

      ‘ClearType’ is Microsoft's implementation of LCD rendering, partly protected by patents.

      +
      +
      since
      +

      2.3.0

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Gasp

      +
      +Defined in FT_GASP_H (freetype/ftgasp.h). +

      +
      +
      +  FT_EXPORT( FT_Int )
      +  FT_Get_Gasp( FT_Face  face,
      +               FT_UInt  ppem );
      +
      +

      +
      +

      Read the ‘gasp’ table from a TrueType or OpenType font file and return the entry corresponding to a given character pixel size.

      +

      +
      input
      +

      + + + +
      face +

      The source face handle.

      +
      ppem +

      The vertical character pixel size.

      +
      +
      +
      return
      +

      Bit flags (see FT_GASP_XXX), or FT_GASP_NO_TABLE if there is no ‘gasp’ table in the face.

      +
      +
      since
      +

      2.3.0

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-glyph_management.html b/src/3rdparty/freetype/docs/reference/ft2-glyph_management.html new file mode 100644 index 0000000000..79fc5b6d22 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-glyph_management.html @@ -0,0 +1,648 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Glyph Management +

      +

      Synopsis

      + + + + + + +
      FT_GlyphFT_OutlineGlyphRecft_glyph_bbox_xxx
      FT_GlyphRecFT_Get_GlyphFT_Glyph_Get_CBox
      FT_BitmapGlyphFT_Glyph_CopyFT_Glyph_To_Bitmap
      FT_BitmapGlyphRecFT_Glyph_TransformFT_Done_Glyph
      FT_OutlineGlyphFT_Glyph_BBox_Mode


      + +
      +

      This section contains definitions used to manage glyph data through generic FT_Glyph objects. Each of them can contain a bitmap, a vector outline, or even images in other formats.

      +

      +
      +

      FT_Glyph

      +
      +

      Handle to an object used to model generic glyph images. It is a pointer to the FT_GlyphRec structure and can contain a glyph bitmap or pointer.

      +

      +
      note
      +

      Glyph objects are not owned by the library. You must thus release them manually (through FT_Done_Glyph) before calling FT_Done_FreeType.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GlyphRec

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  typedef struct  FT_GlyphRec_
      +  {
      +    FT_Library             library;
      +    const FT_Glyph_Class*  clazz;
      +    FT_Glyph_Format        format;
      +    FT_Vector              advance;
      +
      +  } FT_GlyphRec;
      +
      +

      +
      +

      The root glyph structure contains a given glyph image plus its advance width in 16.16 fixed float format.

      +

      +
      fields
      +

      + + + + + +
      library +

      A handle to the FreeType library object.

      +
      clazz +

      A pointer to the glyph's class. Private.

      +
      format +

      The format of the glyph's image.

      +
      advance +

      A 16.16 vector that gives the glyph's advance width.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_BitmapGlyph

      +
      +

      A handle to an object used to model a bitmap glyph image. This is a sub-class of FT_Glyph, and a pointer to FT_BitmapGlyphRec.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_BitmapGlyphRec

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  typedef struct  FT_BitmapGlyphRec_
      +  {
      +    FT_GlyphRec  root;
      +    FT_Int       left;
      +    FT_Int       top;
      +    FT_Bitmap    bitmap;
      +
      +  } FT_BitmapGlyphRec;
      +
      +

      +
      +

      A structure used for bitmap glyph images. This really is a ‘sub-class’ of FT_GlyphRec.

      +

      +
      fields
      +

      + + + + + +
      root +

      The root FT_Glyph fields.

      +
      left +

      The left-side bearing, i.e., the horizontal distance from the current pen position to the left border of the glyph bitmap.

      +
      top +

      The top-side bearing, i.e., the vertical distance from the current pen position to the top border of the glyph bitmap. This distance is positive for upwards y!

      +
      bitmap +

      A descriptor for the bitmap.

      +
      +
      +
      note
      +

      You can typecast an FT_Glyph to FT_BitmapGlyph if you have ‘glyph->format == FT_GLYPH_FORMAT_BITMAP’. This lets you access the bitmap's contents easily.

      +

      The corresponding pixel buffer is always owned by FT_BitmapGlyph and is thus created and destroyed with it.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_OutlineGlyph

      +
      +

      A handle to an object used to model an outline glyph image. This is a sub-class of FT_Glyph, and a pointer to FT_OutlineGlyphRec.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_OutlineGlyphRec

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  typedef struct  FT_OutlineGlyphRec_
      +  {
      +    FT_GlyphRec  root;
      +    FT_Outline   outline;
      +
      +  } FT_OutlineGlyphRec;
      +
      +

      +
      +

      A structure used for outline (vectorial) glyph images. This really is a ‘sub-class’ of FT_GlyphRec.

      +

      +
      fields
      +

      + + + +
      root +

      The root FT_Glyph fields.

      +
      outline +

      A descriptor for the outline.

      +
      +
      +
      note
      +

      You can typecast an FT_Glyph to FT_OutlineGlyph if you have ‘glyph->format == FT_GLYPH_FORMAT_OUTLINE’. This lets you access the outline's content easily.

      +

      As the outline is extracted from a glyph slot, its coordinates are expressed normally in 26.6 pixels, unless the flag FT_LOAD_NO_SCALE was used in FT_Load_Glyph() or FT_Load_Char().

      +

      The outline's tables are always owned by the object and are destroyed with it.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Glyph

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_Glyph( FT_GlyphSlot  slot,
      +                FT_Glyph     *aglyph );
      +
      +

      +
      +

      A function used to extract a glyph image from a slot. Note that the created FT_Glyph object must be released with FT_Done_Glyph.

      +

      +
      input
      +

      + + +
      slot +

      A handle to the source glyph slot.

      +
      +
      +
      output
      +

      + + +
      aglyph +

      A handle to the glyph object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_Copy

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Glyph_Copy( FT_Glyph   source,
      +                 FT_Glyph  *target );
      +
      +

      +
      +

      A function used to copy a glyph image. Note that the created FT_Glyph object must be released with FT_Done_Glyph.

      +

      +
      input
      +

      + + +
      source +

      A handle to the source glyph object.

      +
      +
      +
      output
      +

      + + +
      target +

      A handle to the target glyph object. 0 in case of error.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_Transform

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Glyph_Transform( FT_Glyph    glyph,
      +                      FT_Matrix*  matrix,
      +                      FT_Vector*  delta );
      +
      +

      +
      +

      Transform a glyph image if its format is scalable.

      +

      +
      inout
      +

      + + +
      glyph +

      A handle to the target glyph object.

      +
      +
      +
      input
      +

      + + + +
      matrix +

      A pointer to a 2x2 matrix to apply.

      +
      delta +

      A pointer to a 2d vector to apply. Coordinates are expressed in 1/64th of a pixel.

      +
      +
      +
      return
      +

      FreeType error code (if not 0, the glyph format is not scalable).

      +
      +
      note
      +

      The 2x2 transformation matrix is also applied to the glyph's advance vector.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_BBox_Mode

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  typedef enum  FT_Glyph_BBox_Mode_
      +  {
      +    FT_GLYPH_BBOX_UNSCALED  = 0,
      +    FT_GLYPH_BBOX_SUBPIXELS = 0,
      +    FT_GLYPH_BBOX_GRIDFIT   = 1,
      +    FT_GLYPH_BBOX_TRUNCATE  = 2,
      +    FT_GLYPH_BBOX_PIXELS    = 3
      +
      +  } FT_Glyph_BBox_Mode;
      +
      +

      +
      +

      The mode how the values of FT_Glyph_Get_CBox are returned.

      +

      +
      values
      +

      + + + + + + + +
      FT_GLYPH_BBOX_UNSCALED +

      Return unscaled font units.

      +
      FT_GLYPH_BBOX_SUBPIXELS
      +

      Return unfitted 26.6 coordinates.

      +
      FT_GLYPH_BBOX_GRIDFIT +

      Return grid-fitted 26.6 coordinates.

      +
      FT_GLYPH_BBOX_TRUNCATE +

      Return coordinates in integer pixels.

      +
      FT_GLYPH_BBOX_PIXELS +

      Return grid-fitted pixel coordinates.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_glyph_bbox_xxx

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +#define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED
      +#define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS
      +#define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT
      +#define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE
      +#define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS
      +
      +

      +
      +

      These constants are deprecated. Use the corresponding FT_Glyph_BBox_Mode values instead.

      +

      +
      values
      +

      + + + + + + + +
      ft_glyph_bbox_unscaled +

      See FT_GLYPH_BBOX_UNSCALED.

      +
      ft_glyph_bbox_subpixels
      +

      See FT_GLYPH_BBOX_SUBPIXELS.

      +
      ft_glyph_bbox_gridfit +

      See FT_GLYPH_BBOX_GRIDFIT.

      +
      ft_glyph_bbox_truncate +

      See FT_GLYPH_BBOX_TRUNCATE.

      +
      ft_glyph_bbox_pixels +

      See FT_GLYPH_BBOX_PIXELS.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_Get_CBox

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Glyph_Get_CBox( FT_Glyph  glyph,
      +                     FT_UInt   bbox_mode,
      +                     FT_BBox  *acbox );
      +
      +

      +
      +

      Return a glyph's ‘control box’. The control box encloses all the outline's points, including Bézier control points. Though it coincides with the exact bounding box for most glyphs, it can be slightly larger in some situations (like when rotating an outline which contains Bézier outside arcs).

      +

      Computing the control box is very fast, while getting the bounding box can take much more time as it needs to walk over all segments and arcs in the outline. To get the latter, you can use the ‘ftbbox’ component which is dedicated to this single task.

      +

      +
      input
      +

      + + + +
      glyph +

      A handle to the source glyph object.

      +
      mode +

      The mode which indicates how to interpret the returned bounding box values.

      +
      +
      +
      output
      +

      + + +
      acbox +

      The glyph coordinate bounding box. Coordinates are expressed in 1/64th of pixels if it is grid-fitted.

      +
      +
      +
      note
      +

      Coordinates are relative to the glyph origin, using the y upwards convention.

      +

      If the glyph has been loaded with FT_LOAD_NO_SCALE, ‘bbox_mode’ must be set to FT_GLYPH_BBOX_UNSCALED to get unscaled font units in 26.6 pixel format. The value FT_GLYPH_BBOX_SUBPIXELS is another name for this constant.

      +

      Note that the maximum coordinates are exclusive, which means that one can compute the width and height of the glyph image (be it in integer or 26.6 pixels) as:

      +
      +  width  = bbox.xMax - bbox.xMin;                                  
      +  height = bbox.yMax - bbox.yMin;                                  
      +
      +

      Note also that for 26.6 coordinates, if ‘bbox_mode’ is set to FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, which corresponds to:

      +
      +  bbox.xMin = FLOOR(bbox.xMin);                                    
      +  bbox.yMin = FLOOR(bbox.yMin);                                    
      +  bbox.xMax = CEILING(bbox.xMax);                                  
      +  bbox.yMax = CEILING(bbox.yMax);                                  
      +
      +

      To get the bbox in pixel coordinates, set ‘bbox_mode’ to FT_GLYPH_BBOX_TRUNCATE.

      +

      To get the bbox in grid-fitted pixel coordinates, set ‘bbox_mode’ to FT_GLYPH_BBOX_PIXELS.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_To_Bitmap

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
      +                      FT_Render_Mode  render_mode,
      +                      FT_Vector*      origin,
      +                      FT_Bool         destroy );
      +
      +

      +
      +

      Convert a given glyph object to a bitmap glyph object.

      +

      +
      inout
      +

      + + +
      the_glyph +

      A pointer to a handle to the target glyph.

      +
      +
      +
      input
      +

      + + + + +
      render_mode +

      An enumeration that describes how the data is rendered.

      +
      origin +

      A pointer to a vector used to translate the glyph image before rendering. Can be 0 (if no translation). The origin is expressed in 26.6 pixels.

      +
      destroy +

      A boolean that indicates that the original glyph image should be destroyed by this function. It is never destroyed in case of error.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function does nothing if the glyph format isn't scalable.

      +

      The glyph image is translated with the ‘origin’ vector before rendering.

      +

      The first parameter is a pointer to an FT_Glyph handle, that will be replaced by this function (with newly allocated data). Typically, you would use (omitting error handling):

      +

      +
      +  FT_Glyph        glyph;                                         
      +  FT_BitmapGlyph  glyph_bitmap;                                  
      +                                                                 
      +                                                                 
      +  // load glyph                                                  
      +  error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     
      +                                                                 
      +  // extract glyph image                                         
      +  error = FT_Get_Glyph( face->glyph, &glyph );                   
      +                                                                 
      +  // convert to a bitmap (default render mode + destroying old)  
      +  if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 
      +  {                                                              
      +    error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_DEFAULT,  
      +                                0, 1 );                          
      +    if ( error ) // `glyph' unchanged                            
      +      ...                                                        
      +  }                                                              
      +                                                                 
      +  // access bitmap content by typecasting                        
      +  glyph_bitmap = (FT_BitmapGlyph)glyph;                          
      +                                                                 
      +  // do funny stuff with it, like blitting/drawing               
      +  ...                                                            
      +                                                                 
      +  // discard glyph image (bitmap or not)                         
      +  FT_Done_Glyph( glyph );                                        
      +
      +

      +

      Here another example, again without error handling:

      +

      +
      +  FT_Glyph  glyphs[MAX_GLYPHS]                                   
      +                                                                 
      +                                                                 
      +  ...                                                            
      +                                                                 
      +  for ( idx = 0; i < MAX_GLYPHS; i++ )                           
      +    error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||       
      +            FT_Get_Glyph ( face->glyph, &glyph[idx] );           
      +                                                                 
      +  ...                                                            
      +                                                                 
      +  for ( idx = 0; i < MAX_GLYPHS; i++ )                           
      +  {                                                              
      +    FT_Glyph  bitmap = glyphs[idx];                              
      +                                                                 
      +                                                                 
      +    ...                                                          
      +                                                                 
      +    // after this call, `bitmap' no longer points into           
      +    // the `glyphs' array (and the old value isn't destroyed)    
      +    FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );    
      +                                                                 
      +    ...                                                          
      +                                                                 
      +    FT_Done_Glyph( bitmap );                                     
      +  }                                                              
      +                                                                 
      +  ...                                                            
      +                                                                 
      +  for ( idx = 0; i < MAX_GLYPHS; i++ )                           
      +    FT_Done_Glyph( glyphs[idx] );                                
      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Done_Glyph

      +
      +Defined in FT_GLYPH_H (freetype/ftglyph.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Done_Glyph( FT_Glyph  glyph );
      +
      +

      +
      +

      Destroy a given glyph.

      +

      +
      input
      +

      + + +
      glyph +

      A handle to the target glyph object.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-glyph_stroker.html b/src/3rdparty/freetype/docs/reference/ft2-glyph_stroker.html new file mode 100644 index 0000000000..f5f24e4467 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-glyph_stroker.html @@ -0,0 +1,920 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Glyph Stroker +

      +

      Synopsis

      + + + + + + + + + + + + +
      FT_StrokerFT_Stroker_EndSubPath
      FT_Stroker_LineJoinFT_Stroker_LineTo
      FT_Stroker_LineCapFT_Stroker_ConicTo
      FT_StrokerBorderFT_Stroker_CubicTo
      FT_Outline_GetInsideBorderFT_Stroker_GetBorderCounts
      FT_Outline_GetOutsideBorderFT_Stroker_ExportBorder
      FT_Stroker_NewFT_Stroker_GetCounts
      FT_Stroker_SetFT_Stroker_Export
      FT_Stroker_RewindFT_Stroker_Done
      FT_Stroker_ParseOutlineFT_Glyph_Stroke
      FT_Stroker_BeginSubPathFT_Glyph_StrokeBorder


      + +
      +

      This component generates stroked outlines of a given vectorial glyph. It also allows you to retrieve the ‘outside’ and/or the ‘inside’ borders of the stroke.

      +

      This can be useful to generate ‘bordered’ glyph, i.e., glyphs displayed with a coloured (and anti-aliased) border around their shape.

      +

      +
      +

      FT_Stroker

      +
      +

      Opaque handler to a path stroker object.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_LineJoin

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  typedef enum  FT_Stroker_LineJoin_
      +  {
      +    FT_STROKER_LINEJOIN_ROUND = 0,
      +    FT_STROKER_LINEJOIN_BEVEL,
      +    FT_STROKER_LINEJOIN_MITER
      +
      +  } FT_Stroker_LineJoin;
      +
      +

      +
      +

      These values determine how two joining lines are rendered in a stroker.

      +

      +
      values
      +

      + + + + + + + +
      FT_STROKER_LINEJOIN_ROUND
      +

      Used to render rounded line joins. Circular arcs are used to join two lines smoothly.

      +
      FT_STROKER_LINEJOIN_BEVEL
      +

      Used to render beveled line joins; i.e., the two joining lines are extended until they intersect.

      +
      FT_STROKER_LINEJOIN_MITER
      +

      Same as beveled rendering, except that an additional line break is added if the angle between the two joining lines is too closed (this is useful to avoid unpleasant spikes in beveled rendering).

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_LineCap

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  typedef enum  FT_Stroker_LineCap_
      +  {
      +    FT_STROKER_LINECAP_BUTT = 0,
      +    FT_STROKER_LINECAP_ROUND,
      +    FT_STROKER_LINECAP_SQUARE
      +
      +  } FT_Stroker_LineCap;
      +
      +

      +
      +

      These values determine how the end of opened sub-paths are rendered in a stroke.

      +

      +
      values
      +

      + + + + + + + +
      FT_STROKER_LINECAP_BUTT
      +

      The end of lines is rendered as a full stop on the last point itself.

      +
      FT_STROKER_LINECAP_ROUND
      +

      The end of lines is rendered as a half-circle around the last point.

      +
      FT_STROKER_LINECAP_SQUARE
      +

      The end of lines is rendered as a square around the last point.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_StrokerBorder

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  typedef enum  FT_StrokerBorder_
      +  {
      +    FT_STROKER_BORDER_LEFT = 0,
      +    FT_STROKER_BORDER_RIGHT
      +
      +  } FT_StrokerBorder;
      +
      +

      +
      +

      These values are used to select a given stroke border in FT_Stroker_GetBorderCounts and FT_Stroker_ExportBorder.

      +

      +
      values
      +

      + + + + +
      FT_STROKER_BORDER_LEFT +

      Select the left border, relative to the drawing direction.

      +
      FT_STROKER_BORDER_RIGHT
      +

      Select the right border, relative to the drawing direction.

      +
      +
      +
      note
      +

      Applications are generally interested in the ‘inside’ and ‘outside’ borders. However, there is no direct mapping between these and the ‘left’ and ‘right’ ones, since this really depends on the glyph's drawing orientation, which varies between font formats.

      +

      You can however use FT_Outline_GetInsideBorder and FT_Outline_GetOutsideBorder to get these.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_GetInsideBorder

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_StrokerBorder )
      +  FT_Outline_GetInsideBorder( FT_Outline*  outline );
      +
      +

      +
      +

      Retrieve the FT_StrokerBorder value corresponding to the ‘inside’ borders of a given outline.

      +

      +
      input
      +

      + + +
      outline +

      The source outline handle.

      +
      +
      +
      return
      +

      The border index. FT_STROKER_BORDER_RIGHT for empty or invalid outlines.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_GetOutsideBorder

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_StrokerBorder )
      +  FT_Outline_GetOutsideBorder( FT_Outline*  outline );
      +
      +

      +
      +

      Retrieve the FT_StrokerBorder value corresponding to the ‘outside’ borders of a given outline.

      +

      +
      input
      +

      + + +
      outline +

      The source outline handle.

      +
      +
      +
      return
      +

      The border index. FT_STROKER_BORDER_LEFT for empty or invalid outlines.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_New

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_New( FT_Library   library,
      +                  FT_Stroker  *astroker );
      +
      +

      +
      +

      Create a new stroker object.

      +

      +
      input
      +

      + + +
      library +

      FreeType library handle.

      +
      +
      +
      output
      +

      + + +
      astroker +

      A new stroker object handle. NULL in case of error.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_Set

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Stroker_Set( FT_Stroker           stroker,
      +                  FT_Fixed             radius,
      +                  FT_Stroker_LineCap   line_cap,
      +                  FT_Stroker_LineJoin  line_join,
      +                  FT_Fixed             miter_limit );
      +
      +

      +
      +

      Reset a stroker object's attributes.

      +

      +
      input
      +

      + + + + + + +
      stroker +

      The target stroker handle.

      +
      radius +

      The border radius.

      +
      line_cap +

      The line cap style.

      +
      line_join +

      The line join style.

      +
      miter_limit +

      The miter limit for the FT_STROKER_LINEJOIN_MITER style, expressed as 16.16 fixed point value.

      +
      +
      +
      note
      +

      The radius is expressed in the same units as the outline coordinates.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_Rewind

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Stroker_Rewind( FT_Stroker  stroker );
      +
      +

      +
      +

      Reset a stroker object without changing its attributes. You should call this function before beginning a new series of calls to FT_Stroker_BeginSubPath or FT_Stroker_EndSubPath.

      +

      +
      input
      +

      + + +
      stroker +

      The target stroker handle.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_ParseOutline

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_ParseOutline( FT_Stroker   stroker,
      +                           FT_Outline*  outline,
      +                           FT_Bool      opened );
      +
      +

      +
      +

      A convenience function used to parse a whole outline with the stroker. The resulting outline(s) can be retrieved later by functions like FT_Stroker_GetCounts and FT_Stroker_Export.

      +

      +
      input
      +

      + + + + +
      stroker +

      The target stroker handle.

      +
      outline +

      The source outline.

      +
      opened +

      A boolean. If 1, the outline is treated as an open path instead of a closed one.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      If ‘opened’ is 0 (the default), the outline is treated as a closed path, and the stroker generates two distinct ‘border’ outlines.

      +

      If ‘opened’ is 1, the outline is processed as an open path, and the stroker generates a single ‘stroke’ outline.

      +

      This function calls FT_Stroker_Rewind automatically.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_BeginSubPath

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
      +                           FT_Vector*  to,
      +                           FT_Bool     open );
      +
      +

      +
      +

      Start a new sub-path in the stroker.

      +

      +
      input
      +

      + + + + +
      stroker +

      The target stroker handle.

      +
      to +

      A pointer to the start vector.

      +
      open +

      A boolean. If 1, the sub-path is treated as an open one.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function is useful when you need to stroke a path that is not stored as an FT_Outline object.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_EndSubPath

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_EndSubPath( FT_Stroker  stroker );
      +
      +

      +
      +

      Close the current sub-path in the stroker.

      +

      +
      input
      +

      + + +
      stroker +

      The target stroker handle.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      You should call this function after FT_Stroker_BeginSubPath. If the subpath was not ‘opened’, this function ‘draws’ a single line segment to the start position when needed.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_LineTo

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_LineTo( FT_Stroker  stroker,
      +                     FT_Vector*  to );
      +
      +

      +
      +

      ‘Draw’ a single line segment in the stroker's current sub-path, from the last position.

      +

      +
      input
      +

      + + + +
      stroker +

      The target stroker handle.

      +
      to +

      A pointer to the destination point.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      You should call this function between FT_Stroker_BeginSubPath and FT_Stroker_EndSubPath.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_ConicTo

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_ConicTo( FT_Stroker  stroker,
      +                      FT_Vector*  control,
      +                      FT_Vector*  to );
      +
      +

      +
      +

      ‘Draw’ a single quadratic Bézier in the stroker's current sub-path, from the last position.

      +

      +
      input
      +

      + + + + +
      stroker +

      The target stroker handle.

      +
      control +

      A pointer to a Bézier control point.

      +
      to +

      A pointer to the destination point.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      You should call this function between FT_Stroker_BeginSubPath and FT_Stroker_EndSubPath.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_CubicTo

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_CubicTo( FT_Stroker  stroker,
      +                      FT_Vector*  control1,
      +                      FT_Vector*  control2,
      +                      FT_Vector*  to );
      +
      +

      +
      +

      ‘Draw’ a single cubic Bézier in the stroker's current sub-path, from the last position.

      +

      +
      input
      +

      + + + + + +
      stroker +

      The target stroker handle.

      +
      control1 +

      A pointer to the first Bézier control point.

      +
      control2 +

      A pointer to second Bézier control point.

      +
      to +

      A pointer to the destination point.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      You should call this function between FT_Stroker_BeginSubPath and FT_Stroker_EndSubPath.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_GetBorderCounts

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
      +                              FT_StrokerBorder  border,
      +                              FT_UInt          *anum_points,
      +                              FT_UInt          *anum_contours );
      +
      +

      +
      +

      Call this function once you have finished parsing your paths with the stroker. It returns the number of points and contours necessary to export one of the ‘border’ or ‘stroke’ outlines generated by the stroker.

      +

      +
      input
      +

      + + + +
      stroker +

      The target stroker handle.

      +
      border +

      The border index.

      +
      +
      +
      output
      +

      + + + +
      anum_points +

      The number of points.

      +
      anum_contours +

      The number of contours.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      When an outline, or a sub-path, is ‘closed’, the stroker generates two independent ‘border’ outlines, named ‘left’ and ‘right’.

      +

      When the outline, or a sub-path, is ‘opened’, the stroker merges the ‘border’ outlines with caps. The ‘left’ border receives all points, while the ‘right’ border becomes empty.

      +

      Use the function FT_Stroker_GetCounts instead if you want to retrieve the counts associated to both borders.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_ExportBorder

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Stroker_ExportBorder( FT_Stroker        stroker,
      +                           FT_StrokerBorder  border,
      +                           FT_Outline*       outline );
      +
      +

      +
      +

      Call this function after FT_Stroker_GetBorderCounts to export the corresponding border to your own FT_Outline structure.

      +

      Note that this function appends the border points and contours to your outline, but does not try to resize its arrays.

      +

      +
      input
      +

      + + + + +
      stroker +

      The target stroker handle.

      +
      border +

      The border index.

      +
      outline +

      The target outline handle.

      +
      +
      +
      note
      +

      Always call this function after FT_Stroker_GetBorderCounts to get sure that there is enough room in your FT_Outline object to receive all new data.

      +

      When an outline, or a sub-path, is ‘closed’, the stroker generates two independent ‘border’ outlines, named ‘left’ and ‘right’

      +

      When the outline, or a sub-path, is ‘opened’, the stroker merges the ‘border’ outlines with caps. The ‘left’ border receives all points, while the ‘right’ border becomes empty.

      +

      Use the function FT_Stroker_Export instead if you want to retrieve all borders at once.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_GetCounts

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stroker_GetCounts( FT_Stroker  stroker,
      +                        FT_UInt    *anum_points,
      +                        FT_UInt    *anum_contours );
      +
      +

      +
      +

      Call this function once you have finished parsing your paths with the stroker. It returns the number of points and contours necessary to export all points/borders from the stroked outline/path.

      +

      +
      input
      +

      + + +
      stroker +

      The target stroker handle.

      +
      +
      +
      output
      +

      + + + +
      anum_points +

      The number of points.

      +
      anum_contours +

      The number of contours.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_Export

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Stroker_Export( FT_Stroker   stroker,
      +                     FT_Outline*  outline );
      +
      +

      +
      +

      Call this function after FT_Stroker_GetBorderCounts to export the all borders to your own FT_Outline structure.

      +

      Note that this function appends the border points and contours to your outline, but does not try to resize its arrays.

      +

      +
      input
      +

      + + + +
      stroker +

      The target stroker handle.

      +
      outline +

      The target outline handle.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stroker_Done

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Stroker_Done( FT_Stroker  stroker );
      +
      +

      +
      +

      Destroy a stroker object.

      +

      +
      input
      +

      + + +
      stroker +

      A stroker handle. Can be NULL.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_Stroke

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Glyph_Stroke( FT_Glyph    *pglyph,
      +                   FT_Stroker   stroker,
      +                   FT_Bool      destroy );
      +
      +

      +
      +

      Stroke a given outline glyph object with a given stroker.

      +

      +
      inout
      +

      + + +
      pglyph +

      Source glyph handle on input, new glyph handle on output.

      +
      +
      +
      input
      +

      + + + +
      stroker +

      A stroker handle.

      +
      destroy +

      A Boolean. If 1, the source glyph object is destroyed on success.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The source glyph is untouched in case of error.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Glyph_StrokeBorder

      +
      +Defined in FT_STROKER_H (freetype/ftstroke.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
      +                         FT_Stroker   stroker,
      +                         FT_Bool      inside,
      +                         FT_Bool      destroy );
      +
      +

      +
      +

      Stroke a given outline glyph object with a given stroker, but only return either its inside or outside border.

      +

      +
      inout
      +

      + + +
      pglyph +

      Source glyph handle on input, new glyph handle on output.

      +
      +
      +
      input
      +

      + + + + +
      stroker +

      A stroker handle.

      +
      inside +

      A Boolean. If 1, return the inside border, otherwise the outside border.

      +
      destroy +

      A Boolean. If 1, the source glyph object is destroyed on success.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The source glyph is untouched in case of error.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-glyph_variants.html b/src/3rdparty/freetype/docs/reference/ft2-glyph_variants.html new file mode 100644 index 0000000000..499c7e76fc --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-glyph_variants.html @@ -0,0 +1,267 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Glyph Variants +

      +

      Synopsis

      + + + + +
      FT_Face_GetCharVariantIndexFT_Face_GetVariantsOfChar
      FT_Face_GetCharVariantIsDefaultFT_Face_GetCharsOfVariant
      FT_Face_GetVariantSelectors


      + +
      +

      Many CJK characters have variant forms. They are a sort of grey area somewhere between being totally irrelevant and semantically distinct; for this reason, the Unicode consortium decided to introduce Ideographic Variation Sequences (IVS), consisting of a Unicode base character and one of 240 variant selectors (U+E0100-U+E01EF), instead of further extending the already huge code range for CJK characters.

      +

      An IVS is registered and unique; for further details please refer to Unicode Technical Report #37, the Ideographic Variation Database. To date (October 2007), the character with the most variants is U+908A, having 8 such IVS.

      +

      Adobe and MS decided to support IVS with a new cmap subtable (format 14). It is an odd subtable because it is not a mapping of input code points to glyphs, but contains lists of all variants supported by the font.

      +

      A variant may be either ‘default’ or ‘non-default’. A default variant is the one you will get for that code point if you look it up in the standard Unicode cmap. A non-default variant is a different glyph.

      +

      +
      +

      FT_Face_GetCharVariantIndex

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_UInt )
      +  FT_Face_GetCharVariantIndex( FT_Face   face,
      +                               FT_ULong  charcode,
      +                               FT_ULong  variantSelector );
      +
      +

      +
      +

      Return the glyph index of a given character code as modified by the variation selector.

      +

      +
      input
      +

      + + + + +
      face +

      A handle to the source face object.

      +
      charcode +

      The character code point in Unicode.

      +
      variantSelector +

      The Unicode code point of the variation selector.

      +
      +
      +
      return
      +

      The glyph index. 0 means either ‘undefined character code’, or ‘undefined selector code’, or ‘no variation selector cmap subtable’, or ‘current CharMap is not Unicode’.

      +
      +
      note
      +

      If you use FreeType to manipulate the contents of font files directly, be aware that the glyph index returned by this function doesn't always correspond to the internal indices used within the file. This is done to ensure that value 0 always corresponds to the ‘missing glyph’.

      +

      This function is only meaningful if a) the font has a variation selector cmap sub table, and b) the current charmap has a Unicode encoding.

      +
      +
      since
      +

      2.3.6

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Face_GetCharVariantIsDefault

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Int )
      +  FT_Face_GetCharVariantIsDefault( FT_Face   face,
      +                                   FT_ULong  charcode,
      +                                   FT_ULong  variantSelector );
      +
      +

      +
      +

      Check whether this variant of this Unicode character is the one to be found in the ‘cmap’.

      +

      +
      input
      +

      + + + + +
      face +

      A handle to the source face object.

      +
      charcode +

      The character codepoint in Unicode.

      +
      variantSelector +

      The Unicode codepoint of the variation selector.

      +
      +
      +
      return
      +

      1 if found in the standard (Unicode) cmap, 0 if found in the variation selector cmap, or -1 if it is not a variant.

      +
      +
      note
      +

      This function is only meaningful if the font has a variation selector cmap subtable.

      +
      +
      since
      +

      2.3.6

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Face_GetVariantSelectors

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_UInt32* )
      +  FT_Face_GetVariantSelectors( FT_Face  face );
      +
      +

      +
      +

      Return a zero-terminated list of Unicode variant selectors found in the font.

      +

      +
      input
      +

      + + +
      face +

      A handle to the source face object.

      +
      +
      +
      return
      +

      A pointer to an array of selector code points, or NULL if there is no valid variant selector cmap subtable.

      +
      +
      note
      +

      The last item in the array is 0; the array is owned by the FT_Face object but can be overwritten or released on the next call to a FreeType function.

      +
      +
      since
      +

      2.3.6

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Face_GetVariantsOfChar

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_UInt32* )
      +  FT_Face_GetVariantsOfChar( FT_Face   face,
      +                             FT_ULong  charcode );
      +
      +

      +
      +

      Return a zero-terminated list of Unicode variant selectors found for the specified character code.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the source face object.

      +
      charcode +

      The character codepoint in Unicode.

      +
      +
      +
      return
      +

      A pointer to an array of variant selector code points which are active for the given character, or NULL if the corresponding list is empty.

      +
      +
      note
      +

      The last item in the array is 0; the array is owned by the FT_Face object but can be overwritten or released on the next call to a FreeType function.

      +
      +
      since
      +

      2.3.6

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Face_GetCharsOfVariant

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_UInt32* )
      +  FT_Face_GetCharsOfVariant( FT_Face   face,
      +                             FT_ULong  variantSelector );
      +
      +

      +
      +

      Return a zero-terminated list of Unicode character codes found for the specified variant selector.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the source face object.

      +
      variantSelector +

      The variant selector code point in Unicode.

      +
      +
      +
      return
      +

      A list of all the code points which are specified by this selector (both default and non-default codes are returned) or NULL if there is no valid cmap or the variant selector is invalid.

      +
      +
      note
      +

      The last item in the array is 0; the array is owned by the FT_Face object but can be overwritten or released on the next call to a FreeType function.

      +
      +
      since
      +

      2.3.6

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-gx_validation.html b/src/3rdparty/freetype/docs/reference/ft2-gx_validation.html new file mode 100644 index 0000000000..8c3a98f30d --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-gx_validation.html @@ -0,0 +1,348 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +TrueTypeGX/AAT Validation +

      +

      Synopsis

      + + + + +
      FT_VALIDATE_GX_LENGTHFT_TrueTypeGX_FreeFT_ClassicKern_Free
      FT_VALIDATE_GXXXXFT_VALIDATE_CKERNXXX
      FT_TrueTypeGX_ValidateFT_ClassicKern_Validate


      + +
      +

      This section contains the declaration of functions to validate some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, trak, prop, lcar).

      +

      +
      +

      FT_VALIDATE_GX_LENGTH

      +
      +

      The number of tables checked in this module. Use it as a parameter for the ‘table-length’ argument of function FT_TrueTypeGX_Validate.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_VALIDATE_GXXXX

      +
      +Defined in FT_GX_VALIDATE_H (freetype/ftgxval.h). +

      +
      +
      +#define FT_VALIDATE_feat  FT_VALIDATE_GX_BITFIELD( feat )
      +#define FT_VALIDATE_mort  FT_VALIDATE_GX_BITFIELD( mort )
      +#define FT_VALIDATE_morx  FT_VALIDATE_GX_BITFIELD( morx )
      +#define FT_VALIDATE_bsln  FT_VALIDATE_GX_BITFIELD( bsln )
      +#define FT_VALIDATE_just  FT_VALIDATE_GX_BITFIELD( just )
      +#define FT_VALIDATE_kern  FT_VALIDATE_GX_BITFIELD( kern )
      +#define FT_VALIDATE_opbd  FT_VALIDATE_GX_BITFIELD( opbd )
      +#define FT_VALIDATE_trak  FT_VALIDATE_GX_BITFIELD( trak )
      +#define FT_VALIDATE_prop  FT_VALIDATE_GX_BITFIELD( prop )
      +#define FT_VALIDATE_lcar  FT_VALIDATE_GX_BITFIELD( lcar )
      +
      +#define FT_VALIDATE_GX  ( FT_VALIDATE_feat | \
      +                          FT_VALIDATE_mort | \
      +                          FT_VALIDATE_morx | \
      +                          FT_VALIDATE_bsln | \
      +                          FT_VALIDATE_just | \
      +                          FT_VALIDATE_kern | \
      +                          FT_VALIDATE_opbd | \
      +                          FT_VALIDATE_trak | \
      +                          FT_VALIDATE_prop | \
      +                          FT_VALIDATE_lcar )
      +
      +

      +
      +

      A list of bit-field constants used with FT_TrueTypeGX_Validate to indicate which TrueTypeGX/AAT Type tables should be validated.

      +

      +
      values
      +

      + + + + + + + + + + + + +
      FT_VALIDATE_feat +

      Validate ‘feat’ table.

      +
      FT_VALIDATE_mort +

      Validate ‘mort’ table.

      +
      FT_VALIDATE_morx +

      Validate ‘morx’ table.

      +
      FT_VALIDATE_bsln +

      Validate ‘bsln’ table.

      +
      FT_VALIDATE_just +

      Validate ‘just’ table.

      +
      FT_VALIDATE_kern +

      Validate ‘kern’ table.

      +
      FT_VALIDATE_opbd +

      Validate ‘opbd’ table.

      +
      FT_VALIDATE_trak +

      Validate ‘trak’ table.

      +
      FT_VALIDATE_prop +

      Validate ‘prop’ table.

      +
      FT_VALIDATE_lcar +

      Validate ‘lcar’ table.

      +
      FT_VALIDATE_GX +

      Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, trak, prop and lcar).

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_TrueTypeGX_Validate

      +
      +Defined in FT_GX_VALIDATE_H (freetype/ftgxval.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_TrueTypeGX_Validate( FT_Face   face,
      +                          FT_UInt   validation_flags,
      +                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
      +                          FT_UInt   table_length );
      +
      +

      +
      +

      Validate various TrueTypeGX tables to assure that all offsets and indices are valid. The idea is that a higher-level library which actually does the text layout can access those tables without error checking (which can be quite time consuming).

      +

      +
      input
      +

      + + + + +
      face +

      A handle to the input face.

      +
      validation_flags +

      A bit field which specifies the tables to be validated. See FT_VALIDATE_GXXXX for possible values.

      +
      table_length +

      The size of the ‘tables’ array. Normally, FT_VALIDATE_GX_LENGTH should be passed.

      +
      +
      +
      output
      +

      + + +
      tables +

      The array where all validated sfnt tables are stored. The array itself must be allocated by a client.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function only works with TrueTypeGX fonts, returning an error otherwise.

      +

      After use, the application should deallocate the buffers pointed to by each ‘tables’ element, by calling FT_TrueTypeGX_Free. A NULL value indicates that the table either doesn't exist in the font, the application hasn't asked for validation, or the validator doesn't have the ability to validate the sfnt table.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_TrueTypeGX_Free

      +
      +Defined in FT_GX_VALIDATE_H (freetype/ftgxval.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_TrueTypeGX_Free( FT_Face   face,
      +                      FT_Bytes  table );
      +
      +

      +
      +

      Free the buffer allocated by TrueTypeGX validator.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the input face.

      +
      table +

      The pointer to the buffer allocated by FT_TrueTypeGX_Validate.

      +
      +
      +
      note
      +

      This function must be used to free the buffer allocated by FT_TrueTypeGX_Validate only.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_VALIDATE_CKERNXXX

      +
      +Defined in FT_GX_VALIDATE_H (freetype/ftgxval.h). +

      +
      +
      +#define FT_VALIDATE_MS     ( FT_VALIDATE_GX_START << 0 )
      +#define FT_VALIDATE_APPLE  ( FT_VALIDATE_GX_START << 1 )
      +
      +#define FT_VALIDATE_CKERN  ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )
      +
      +

      +
      +

      A list of bit-field constants used with FT_ClassicKern_Validate to indicate the classic kern dialect or dialects. If the selected type doesn't fit, FT_ClassicKern_Validate regards the table as invalid.

      +

      +
      values
      +

      + + + + +
      FT_VALIDATE_MS +

      Handle the ‘kern’ table as a classic Microsoft kern table.

      +
      FT_VALIDATE_APPLE +

      Handle the ‘kern’ table as a classic Apple kern table.

      +
      FT_VALIDATE_CKERN +

      Handle the ‘kern’ as either classic Apple or Microsoft kern table.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ClassicKern_Validate

      +
      +Defined in FT_GX_VALIDATE_H (freetype/ftgxval.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_ClassicKern_Validate( FT_Face    face,
      +                           FT_UInt    validation_flags,
      +                           FT_Bytes  *ckern_table );
      +
      +

      +
      +

      Validate classic (16-bit format) kern table to assure that the offsets and indices are valid. The idea is that a higher-level library which actually does the text layout can access those tables without error checking (which can be quite time consuming).

      +

      The ‘kern’ table validator in FT_TrueTypeGX_Validate deals with both the new 32-bit format and the classic 16-bit format, while FT_ClassicKern_Validate only supports the classic 16-bit format.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the input face.

      +
      validation_flags +

      A bit field which specifies the dialect to be validated. See FT_VALIDATE_CKERNXXX for possible values.

      +
      +
      +
      output
      +

      + + +
      ckern_table +

      A pointer to the kern table.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      After use, the application should deallocate the buffers pointed to by ‘ckern_table’, by calling FT_ClassicKern_Free. A NULL value indicates that the table doesn't exist in the font.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ClassicKern_Free

      +
      +Defined in FT_GX_VALIDATE_H (freetype/ftgxval.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_ClassicKern_Free( FT_Face   face,
      +                       FT_Bytes  table );
      +
      +

      +
      +

      Free the buffer allocated by classic Kern validator.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the input face.

      +
      table +

      The pointer to the buffer that is allocated by FT_ClassicKern_Validate.

      +
      +
      +
      note
      +

      This function must be used to free the buffer allocated by FT_ClassicKern_Validate only.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-gzip.html b/src/3rdparty/freetype/docs/reference/ft2-gzip.html new file mode 100644 index 0000000000..f9eca6a338 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-gzip.html @@ -0,0 +1,94 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +GZIP Streams +

      +

      Synopsis

      + + +
      FT_Stream_OpenGzip


      + +
      +

      This section contains the declaration of Gzip-specific functions.

      +

      +
      +

      FT_Stream_OpenGzip

      +
      +Defined in FT_GZIP_H (freetype/ftgzip.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stream_OpenGzip( FT_Stream  stream,
      +                      FT_Stream  source );
      +
      +

      +
      +

      Open a new stream to parse gzip-compressed font files. This is mainly used to support the compressed ‘*.pcf.gz’ fonts that come with XFree86.

      +

      +
      input
      +

      + + + +
      stream +

      The target embedding stream.

      +
      source +

      The source stream.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The source stream must be opened before calling this function.

      +

      Calling the internal function ‘FT_Stream_Close’ on the new stream will not call ‘FT_Stream_Close’ on the source stream. None of the stream objects will be released to the heap.

      +

      The stream implementation is very basic and resets the decompression process each time seeking backwards is needed within the stream.

      +

      In certain builds of the library, gzip compression recognition is automatically handled when calling FT_New_Face or FT_Open_Face. This means that if no font driver is capable of handling the raw compressed file, the library will try to open a gzipped stream from it and re-open the face with it.

      +

      This function may return ‘FT_Err_Unimplemented_Feature’ if your build of FreeType was not compiled with zlib support.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-header_file_macros.html b/src/3rdparty/freetype/docs/reference/ft2-header_file_macros.html new file mode 100644 index 0000000000..f81f2f915a --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-header_file_macros.html @@ -0,0 +1,626 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Header File Macros +

      +

      Synopsis

      + + + + + + + + + + + + + + + + + + + + + + + + +
      FT_CONFIG_CONFIG_HFT_WINFONTS_H
      FT_CONFIG_STANDARD_LIBRARY_HFT_GLYPH_H
      FT_CONFIG_OPTIONS_HFT_BITMAP_H
      FT_CONFIG_MODULES_HFT_BBOX_H
      FT_FREETYPE_HFT_CACHE_H
      FT_ERRORS_HFT_CACHE_IMAGE_H
      FT_MODULE_ERRORS_HFT_CACHE_SMALL_BITMAPS_H
      FT_SYSTEM_HFT_CACHE_CHARMAP_H
      FT_IMAGE_HFT_MAC_H
      FT_TYPES_HFT_MULTIPLE_MASTERS_H
      FT_LIST_HFT_SFNT_NAMES_H
      FT_OUTLINE_HFT_OPENTYPE_VALIDATE_H
      FT_SIZES_HFT_GX_VALIDATE_H
      FT_MODULE_HFT_PFR_H
      FT_RENDER_HFT_STROKER_H
      FT_TYPE1_TABLES_HFT_SYNTHESIS_H
      FT_TRUETYPE_IDS_HFT_XFREE86_H
      FT_TRUETYPE_TABLES_HFT_TRIGONOMETRY_H
      FT_TRUETYPE_TAGS_HFT_LCD_FILTER_H
      FT_BDF_HFT_UNPATENTED_HINTING_H
      FT_CID_HFT_INCREMENTAL_H
      FT_GZIP_HFT_GASP_H
      FT_LZW_HFT_ADVANCES_H


      + +
      +

      The following macros are defined to the name of specific FreeType 2 header files. They can be used directly in #include statements as in:

      +
      +  #include FT_FREETYPE_H                                           
      +  #include FT_MULTIPLE_MASTERS_H                                   
      +  #include FT_GLYPH_H                                              
      +
      +

      There are several reasons why we are now using macros to name public header files. The first one is that such macros are not limited to the infamous 8.3 naming rule required by DOS (and ‘FT_MULTIPLE_MASTERS_H’ is a lot more meaningful than ‘ftmm.h’).

      +

      The second reason is that it allows for more flexibility in the way FreeType 2 is installed on a given system.

      +

      +
      +

      FT_CONFIG_CONFIG_H

      +
      +
      +#ifndef FT_CONFIG_CONFIG_H
      +#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>
      +#endif
      +
      +

      +
      +

      A macro used in #include statements to name the file containing FreeType 2 configuration data.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CONFIG_STANDARD_LIBRARY_H

      +
      +
      +#ifndef FT_CONFIG_STANDARD_LIBRARY_H
      +#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>
      +#endif
      +
      +

      +
      +

      A macro used in #include statements to name the file containing FreeType 2 interface to the standard C library functions.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CONFIG_OPTIONS_H

      +
      +
      +#ifndef FT_CONFIG_OPTIONS_H
      +#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>
      +#endif
      +
      +

      +
      +

      A macro used in #include statements to name the file containing FreeType 2 project-specific configuration options.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CONFIG_MODULES_H

      +
      +
      +#ifndef FT_CONFIG_MODULES_H
      +#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>
      +#endif
      +
      +

      +
      +

      A macro used in #include statements to name the file containing the list of FreeType 2 modules that are statically linked to new library instances in FT_Init_FreeType.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_FREETYPE_H

      +
      +

      A macro used in #include statements to name the file containing the base FreeType 2 API.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ERRORS_H

      +
      +

      A macro used in #include statements to name the file containing the list of FreeType 2 error codes (and messages).

      +

      It is included by FT_FREETYPE_H.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_MODULE_ERRORS_H

      +
      +

      A macro used in #include statements to name the file containing the list of FreeType 2 module error offsets (and messages).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_SYSTEM_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 interface to low-level operations (i.e., memory management and stream i/o).

      +

      It is included by FT_FREETYPE_H.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_IMAGE_H

      +
      +

      A macro used in #include statements to name the file containing type definitions related to glyph images (i.e., bitmaps, outlines, scan-converter parameters).

      +

      It is included by FT_FREETYPE_H.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_TYPES_H

      +
      +

      A macro used in #include statements to name the file containing the basic data types defined by FreeType 2.

      +

      It is included by FT_FREETYPE_H.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_LIST_H

      +
      +

      A macro used in #include statements to name the file containing the list management API of FreeType 2.

      +

      (Most applications will never need to include this file.)

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_OUTLINE_H

      +
      +

      A macro used in #include statements to name the file containing the scalable outline management API of FreeType 2.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_SIZES_H

      +
      +

      A macro used in #include statements to name the file containing the API which manages multiple FT_Size objects per face.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_MODULE_H

      +
      +

      A macro used in #include statements to name the file containing the module management API of FreeType 2.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_RENDER_H

      +
      +

      A macro used in #include statements to name the file containing the renderer module management API of FreeType 2.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_TYPE1_TABLES_H

      +
      +

      A macro used in #include statements to name the file containing the types and API specific to the Type 1 format.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_TRUETYPE_IDS_H

      +
      +

      A macro used in #include statements to name the file containing the enumeration values which identify name strings, languages, encodings, etc. This file really contains a large set of constant macro definitions, taken from the TrueType and OpenType specifications.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_TRUETYPE_TABLES_H

      +
      +

      A macro used in #include statements to name the file containing the types and API specific to the TrueType (as well as OpenType) format.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_TRUETYPE_TAGS_H

      +
      +

      A macro used in #include statements to name the file containing the definitions of TrueType four-byte ‘tags’ which identify blocks in SFNT-based font formats (i.e., TrueType and OpenType).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_BDF_H

      +
      +

      A macro used in #include statements to name the file containing the definitions of an API which accesses BDF-specific strings from a face.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CID_H

      +
      +

      A macro used in #include statements to name the file containing the definitions of an API which access CID font information from a face.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GZIP_H

      +
      +

      A macro used in #include statements to name the file containing the definitions of an API which supports gzip-compressed files.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_LZW_H

      +
      +

      A macro used in #include statements to name the file containing the definitions of an API which supports LZW-compressed files.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_WINFONTS_H

      +
      +

      A macro used in #include statements to name the file containing the definitions of an API which supports Windows FNT files.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GLYPH_H

      +
      +

      A macro used in #include statements to name the file containing the API of the optional glyph management component.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_BITMAP_H

      +
      +

      A macro used in #include statements to name the file containing the API of the optional bitmap conversion component.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_BBOX_H

      +
      +

      A macro used in #include statements to name the file containing the API of the optional exact bounding box computation routines.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CACHE_H

      +
      +

      A macro used in #include statements to name the file containing the API of the optional FreeType 2 cache sub-system.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CACHE_IMAGE_H

      +
      +

      A macro used in #include statements to name the file containing the ‘glyph image’ API of the FreeType 2 cache sub-system.

      +

      It is used to define a cache for FT_Glyph elements. You can also use the API defined in FT_CACHE_SMALL_BITMAPS_H if you only need to store small glyph bitmaps, as it will use less memory.

      +

      This macro is deprecated. Simply include FT_CACHE_H to have all glyph image-related cache declarations.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CACHE_SMALL_BITMAPS_H

      +
      +

      A macro used in #include statements to name the file containing the ‘small bitmaps’ API of the FreeType 2 cache sub-system.

      +

      It is used to define a cache for small glyph bitmaps in a relatively memory-efficient way. You can also use the API defined in FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, including scalable outlines.

      +

      This macro is deprecated. Simply include FT_CACHE_H to have all small bitmaps-related cache declarations.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_CACHE_CHARMAP_H

      +
      +

      A macro used in #include statements to name the file containing the ‘charmap’ API of the FreeType 2 cache sub-system.

      +

      This macro is deprecated. Simply include FT_CACHE_H to have all charmap-based cache declarations.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_MAC_H

      +
      +

      A macro used in #include statements to name the file containing the Macintosh-specific FreeType 2 API. The latter is used to access fonts embedded in resource forks.

      +

      This header file must be explicitly included by client applications compiled on the Mac (note that the base API still works though).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_MULTIPLE_MASTERS_H

      +
      +

      A macro used in #include statements to name the file containing the optional multiple-masters management API of FreeType 2.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_SFNT_NAMES_H

      +
      +

      A macro used in #include statements to name the file containing the optional FreeType 2 API which accesses embedded ‘name’ strings in SFNT-based font formats (i.e., TrueType and OpenType).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_OPENTYPE_VALIDATE_H

      +
      +

      A macro used in #include statements to name the file containing the optional FreeType 2 API which validates OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GX_VALIDATE_H

      +
      +

      A macro used in #include statements to name the file containing the optional FreeType 2 API which validates TrueTypeGX/AAT tables (feat, mort, morx, bsln, just, kern, opbd, trak, prop).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_PFR_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which accesses PFR-specific data.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_STROKER_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which provides functions to stroke outline paths.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_SYNTHESIS_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which performs artificial obliquing and emboldening.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_XFREE86_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which provides functions specific to the XFree86 and X.Org X11 servers.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_TRIGONOMETRY_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which performs trigonometric computations (e.g., cosines and arc tangents).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_LCD_FILTER_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which performs color filtering for subpixel rendering.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_UNPATENTED_HINTING_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which performs color filtering for subpixel rendering.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_INCREMENTAL_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which performs color filtering for subpixel rendering.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GASP_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which returns entries from the TrueType GASP table.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ADVANCES_H

      +
      +

      A macro used in #include statements to name the file containing the FreeType 2 API which returns individual and ranged glyph advances.

      +

      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-incremental.html b/src/3rdparty/freetype/docs/reference/ft2-incremental.html new file mode 100644 index 0000000000..8fbc111faf --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-incremental.html @@ -0,0 +1,365 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Incremental Loading +

      +

      Synopsis

      + + + + + + +
      FT_IncrementalFT_Incremental_GetGlyphMetricsFunc
      FT_Incremental_MetricsRecFT_Incremental_FuncsRec
      FT_Incremental_MetricsFT_Incremental_InterfaceRec
      FT_Incremental_GetGlyphDataFuncFT_Incremental_Interface
      FT_Incremental_FreeGlyphDataFuncFT_PARAM_TAG_INCREMENTAL


      + +
      +

      This section contains various functions used to perform so-called ‘incremental’ glyph loading. This is a mode where all glyphs loaded from a given FT_Face are provided by the client application,

      +

      Apart from that, all other tables are loaded normally from the font file. This mode is useful when FreeType is used within another engine, e.g., a PostScript Imaging Processor.

      +

      To enable this mode, you must use FT_Open_Face, passing an FT_Parameter with the FT_PARAM_TAG_INCREMENTAL tag and an FT_Incremental_Interface value. See the comments for FT_Incremental_InterfaceRec for an example.

      +

      +
      +

      FT_Incremental

      +
      +

      An opaque type describing a user-provided object used to implement ‘incremental’ glyph loading within FreeType. This is used to support embedded fonts in certain environments (e.g., PostScript interpreters), where the glyph data isn't in the font file, or must be overridden by different values.

      +

      +
      note
      +

      It is up to client applications to create and implement FT_Incremental objects, as long as they provide implementations for the methods FT_Incremental_GetGlyphDataFunc, FT_Incremental_FreeGlyphDataFunc and FT_Incremental_GetGlyphMetricsFunc.

      +

      See the description of FT_Incremental_InterfaceRec to understand how to use incremental objects with FreeType.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Incremental_MetricsRec

      +
      +Defined in FT_INCREMENTAL_H (freetype/ftincrem.h). +

      +
      +
      +  typedef struct  FT_Incremental_MetricsRec_
      +  {
      +    FT_Long  bearing_x;
      +    FT_Long  bearing_y;
      +    FT_Long  advance;
      +
      +  } FT_Incremental_MetricsRec;
      +
      +

      +
      +

      A small structure used to contain the basic glyph metrics returned by the FT_Incremental_GetGlyphMetricsFunc method.

      +

      +
      fields
      +

      + + + + +
      bearing_x +

      Left bearing, in font units.

      +
      bearing_y +

      Top bearing, in font units.

      +
      advance +

      Glyph advance, in font units.

      +
      +
      +
      note
      +

      These correspond to horizontal or vertical metrics depending on the value of the ‘vertical’ argument to the function FT_Incremental_GetGlyphMetricsFunc.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Incremental_Metrics

      +
      +

      A handle to an FT_Incremental_MetricsRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Incremental_GetGlyphDataFunc

      +
      +Defined in FT_INCREMENTAL_H (freetype/ftincrem.h). +

      +
      +
      +  typedef FT_Error
      +  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,
      +                                      FT_UInt         glyph_index,
      +                                      FT_Data*        adata );
      +
      +

      +
      +

      A function called by FreeType to access a given glyph's data bytes during FT_Load_Glyph or FT_Load_Char if incremental loading is enabled.

      +

      Note that the format of the glyph's data bytes depends on the font file format. For TrueType, it must correspond to the raw bytes within the ‘glyf’ table. For PostScript formats, it must correspond to the unencrypted charstring bytes, without any ‘lenIV’ header. It is undefined for any other format.

      +

      +
      input
      +

      + + + +
      incremental +

      Handle to an opaque FT_Incremental handle provided by the client application.

      +
      glyph_index +

      Index of relevant glyph.

      +
      +
      +
      output
      +

      + + +
      adata +

      A structure describing the returned glyph data bytes (which will be accessed as a read-only byte block).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      If this function returns successfully the method FT_Incremental_FreeGlyphDataFunc will be called later to release the data bytes.

      +

      Nested calls to FT_Incremental_GetGlyphDataFunc can happen for compound glyphs.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Incremental_FreeGlyphDataFunc

      +
      +Defined in FT_INCREMENTAL_H (freetype/ftincrem.h). +

      +
      +
      +  typedef void
      +  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,
      +                                       FT_Data*        data );
      +
      +

      +
      +

      A function used to release the glyph data bytes returned by a successful call to FT_Incremental_GetGlyphDataFunc.

      +

      +
      input
      +

      + + + +
      incremental +

      A handle to an opaque FT_Incremental handle provided by the client application.

      +
      data +

      A structure describing the glyph data bytes (which will be accessed as a read-only byte block).

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Incremental_GetGlyphMetricsFunc

      +
      +Defined in FT_INCREMENTAL_H (freetype/ftincrem.h). +

      +
      +
      +  typedef FT_Error
      +  (*FT_Incremental_GetGlyphMetricsFunc)
      +                      ( FT_Incremental              incremental,
      +                        FT_UInt                     glyph_index,
      +                        FT_Bool                     vertical,
      +                        FT_Incremental_MetricsRec  *ametrics );
      +
      +

      +
      +

      A function used to retrieve the basic metrics of a given glyph index before accessing its data. This is necessary because, in certain formats like TrueType, the metrics are stored in a different place from the glyph images proper.

      +

      +
      input
      +

      + + + + + +
      incremental +

      A handle to an opaque FT_Incremental handle provided by the client application.

      +
      glyph_index +

      Index of relevant glyph.

      +
      vertical +

      If true, return vertical metrics.

      +
      ametrics +

      This parameter is used for both input and output. The original glyph metrics, if any, in font units. If metrics are not available all the values must be set to zero.

      +
      +
      +
      output
      +

      + + +
      ametrics +

      The replacement glyph metrics in font units.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Incremental_FuncsRec

      +
      +Defined in FT_INCREMENTAL_H (freetype/ftincrem.h). +

      +
      +
      +  typedef struct  FT_Incremental_FuncsRec_
      +  {
      +    FT_Incremental_GetGlyphDataFunc     get_glyph_data;
      +    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;
      +    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;
      +
      +  } FT_Incremental_FuncsRec;
      +
      +

      +
      +

      A table of functions for accessing fonts that load data incrementally. Used in FT_Incremental_InterfaceRec.

      +

      +
      fields
      +

      + + + + +
      get_glyph_data +

      The function to get glyph data. Must not be null.

      +
      free_glyph_data +

      The function to release glyph data. Must not be null.

      +
      get_glyph_metrics +

      The function to get glyph metrics. May be null if the font does not provide overriding glyph metrics.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Incremental_InterfaceRec

      +
      +Defined in FT_INCREMENTAL_H (freetype/ftincrem.h). +

      +
      +
      +  typedef struct  FT_Incremental_InterfaceRec_
      +  {
      +    const FT_Incremental_FuncsRec*  funcs;
      +    FT_Incremental                  object;
      +
      +  } FT_Incremental_InterfaceRec;
      +
      +

      +
      +

      A structure to be used with FT_Open_Face to indicate that the user wants to support incremental glyph loading. You should use it with FT_PARAM_TAG_INCREMENTAL as in the following example:

      +
      +  FT_Incremental_InterfaceRec  inc_int;
      +  FT_Parameter                 parameter;
      +  FT_Open_Args                 open_args;
      +
      +
      +  // set up incremental descriptor
      +  inc_int.funcs  = my_funcs;
      +  inc_int.object = my_object;
      +
      +  // set up optional parameter
      +  parameter.tag  = FT_PARAM_TAG_INCREMENTAL;
      +  parameter.data = &inc_int;
      +
      +  // set up FT_Open_Args structure
      +  open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
      +  open_args.pathname   = my_font_pathname;
      +  open_args.num_params = 1;
      +  open_args.params     = &parameter; // we use one optional argument
      +
      +  // open the font
      +  error = FT_Open_Face( library, &open_args, index, &face );
      +  ...
      +
      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Incremental_Interface

      +
      +

      A pointer to an FT_Incremental_InterfaceRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_PARAM_TAG_INCREMENTAL

      +
      +

      A constant used as the tag of FT_Parameter structures to indicate an incremental loading object to be used by FreeType.

      +

      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-index.html b/src/3rdparty/freetype/docs/reference/ft2-index.html new file mode 100644 index 0000000000..ca4d1691d8 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-index.html @@ -0,0 +1,290 @@ + + + + +FreeType-2.3.9 API Reference + + + + + +
      [TOC]
      +

      FreeType-2.3.9 API Reference

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      BDF_PROPERTY_TYPE_ATOMFT_LCD_FILTER_LIGHTFT_Stroker_Set
      BDF_PROPERTY_TYPE_CARDINALFT_LCD_FILTER_NONEFT_StrokerBorder
      BDF_PROPERTY_TYPE_INTEGERFT_LcdFilterFT_SUBGLYPH_FLAG_2X2
      BDF_PROPERTY_TYPE_NONEFT_LIST_HFT_SUBGLYPH_FLAG_ARGS_ARE_WORDS
      BDF_PropertyFT_LibraryFT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES
      BDF_PropertyRecFT_Library_SetLcdFilterFT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID
      CID_FaceDictFT_Library_VersionFT_SUBGLYPH_FLAG_SCALE
      CID_FaceDictRecFT_ListFT_SUBGLYPH_FLAG_USE_MY_METRICS
      CID_FaceInfoFT_List_AddFT_SUBGLYPH_FLAG_XXX
      CID_FaceInfoRecFT_List_DestructorFT_SUBGLYPH_FLAG_XY_SCALE
      CID_InfoFT_List_FinalizeFT_SubGlyph
      FREETYPE_MAJORFT_List_FindFT_SYNTHESIS_H
      FREETYPE_MINORFT_List_InsertFT_SYSTEM_H
      FREETYPE_PATCHFT_List_IterateFT_Tag
      FREETYPE_XXXFT_List_IteratorFT_Tan
      FT_Activate_SizeFT_List_RemoveFT_TRIGONOMETRY_H
      FT_ADVANCE_FLAG_FAST_ONLYFT_List_UpFT_TRUETYPE_ENGINE_TYPE_NONE
      FT_ADVANCES_HFT_ListNodeFT_TRUETYPE_ENGINE_TYPE_PATENTED
      FT_Add_Default_ModulesFT_ListNodeRecFT_TRUETYPE_ENGINE_TYPE_UNPATENTED
      FT_Add_ModuleFT_ListRecFT_TRUETYPE_IDS_H
      FT_Alloc_FuncFT_LOAD_CROP_BITMAPFT_TRUETYPE_TABLES_H
      FT_ANGLE_2PIFT_LOAD_DEFAULTFT_TRUETYPE_TAGS_H
      FT_ANGLE_PIFT_LOAD_FORCE_AUTOHINTFT_TrueTypeEngineType
      FT_ANGLE_PI2FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTHFT_TrueTypeGX_Free
      FT_ANGLE_PI4FT_LOAD_IGNORE_TRANSFORMFT_TrueTypeGX_Validate
      FT_AngleFT_LOAD_LINEAR_DESIGNFT_TYPE1_TABLES_H
      FT_Angle_DiffFT_LOAD_MONOCHROMEFT_TYPES_H
      FT_Atan2FT_LOAD_NO_AUTOHINTFT_UFWord
      FT_Attach_FileFT_LOAD_NO_BITMAPFT_UInt
      FT_Attach_StreamFT_LOAD_NO_HINTINGFT_UInt16
      FT_BBOX_HFT_LOAD_NO_RECURSEFT_UInt32
      FT_BBoxFT_LOAD_NO_SCALEFT_ULong
      FT_BDF_HFT_LOAD_PEDANTICFT_UNPATENTED_HINTING_H
      FT_BITMAP_HFT_LOAD_RENDERFT_UnitVector
      FT_BitmapFT_LOAD_TARGET_LCDFT_UShort
      FT_Bitmap_ConvertFT_LOAD_TARGET_LCD_VFT_VALIDATE_APPLE
      FT_Bitmap_CopyFT_LOAD_TARGET_LIGHTFT_VALIDATE_BASE
      FT_Bitmap_DoneFT_LOAD_TARGET_MODEFT_VALIDATE_bsln
      FT_Bitmap_EmboldenFT_LOAD_TARGET_MONOFT_VALIDATE_CKERN
      FT_Bitmap_NewFT_LOAD_TARGET_NORMALFT_VALIDATE_CKERNXXX
      FT_Bitmap_SizeFT_LOAD_TARGET_XXXFT_VALIDATE_feat
      FT_BitmapGlyphFT_LOAD_VERTICAL_LAYOUTFT_VALIDATE_GDEF
      FT_BitmapGlyphRecFT_LOAD_XXXFT_VALIDATE_GPOS
      FT_BoolFT_Load_CharFT_VALIDATE_GSUB
      FT_ByteFT_Load_GlyphFT_VALIDATE_GX
      FT_BytesFT_Load_Sfnt_TableFT_VALIDATE_GX_LENGTH
      FT_CACHE_CHARMAP_HFT_LongFT_VALIDATE_GXXXX
      FT_CACHE_HFT_LZW_HFT_VALIDATE_JSTF
      FT_CACHE_IMAGE_HFT_MAC_HFT_VALIDATE_just
      FT_CACHE_SMALL_BITMAPS_HFT_MAKE_TAGFT_VALIDATE_kern
      FT_CeilFixFT_MatrixFT_VALIDATE_lcar
      FT_CharFT_Matrix_InvertFT_VALIDATE_MATH
      FT_CharMapFT_Matrix_MultiplyFT_VALIDATE_MS
      FT_CharMapRecFT_MemoryFT_VALIDATE_mort
      FT_CID_HFT_MemoryRecFT_VALIDATE_morx
      FT_ClassicKern_FreeFT_MM_AxisFT_VALIDATE_OT
      FT_ClassicKern_ValidateFT_MM_VarFT_VALIDATE_OTXXX
      FT_CONFIG_CONFIG_HFT_MODULE_ERRORS_HFT_VALIDATE_opbd
      FT_CONFIG_MODULES_HFT_MODULE_HFT_VALIDATE_prop
      FT_CONFIG_OPTIONS_HFT_ModuleFT_VALIDATE_trak
      FT_CONFIG_STANDARD_LIBRARY_HFT_Module_ClassFT_Var_Axis
      FT_CosFT_Module_ConstructorFT_Var_Named_Style
      FT_DataFT_Module_DestructorFT_Vector
      FT_DivFixFT_Module_RequesterFT_Vector_From_Polar
      FT_Done_FaceFT_MULTIPLE_MASTERS_HFT_Vector_Length
      FT_Done_FreeTypeFT_MulDivFT_Vector_Polarize
      FT_Done_GlyphFT_MulFixFT_Vector_Rotate
      FT_Done_LibraryFT_Multi_MasterFT_Vector_Transform
      FT_Done_SizeFT_New_FaceFT_Vector_Unit
      FT_DriverFT_New_Face_From_FONDFT_WINFONTS_H
      FT_ENC_TAGFT_New_Face_From_FSRefFT_WinFNT_Header
      FT_ENCODING_ADOBE_CUSTOMFT_New_Face_From_FSSpecFT_WinFNT_HeaderRec
      FT_ENCODING_ADOBE_EXPERTFT_New_LibraryFT_WinFNT_ID_CP1250
      FT_ENCODING_ADOBE_LATIN_1FT_New_Memory_FaceFT_WinFNT_ID_CP1251
      FT_ENCODING_ADOBE_STANDARDFT_New_SizeFT_WinFNT_ID_CP1252
      FT_ENCODING_APPLE_ROMANFT_OffsetFT_WinFNT_ID_CP1253
      FT_ENCODING_BIG5FT_OPEN_DRIVERFT_WinFNT_ID_CP1254
      FT_ENCODING_GB2312FT_OPEN_MEMORYFT_WinFNT_ID_CP1255
      FT_ENCODING_JOHABFT_OPEN_PARAMSFT_WinFNT_ID_CP1256
      FT_ENCODING_MS_BIG5FT_OPEN_PATHNAMEFT_WinFNT_ID_CP1257
      FT_ENCODING_MS_GB2312FT_OPEN_STREAMFT_WinFNT_ID_CP1258
      FT_ENCODING_MS_JOHABFT_OPEN_XXXFT_WinFNT_ID_CP1361
      FT_ENCODING_MS_SJISFT_OPENTYPE_VALIDATE_HFT_WinFNT_ID_CP874
      FT_ENCODING_MS_SYMBOLFT_Open_ArgsFT_WinFNT_ID_CP932
      FT_ENCODING_MS_WANSUNGFT_Open_FaceFT_WinFNT_ID_CP936
      FT_ENCODING_NONEFT_OpenType_FreeFT_WinFNT_ID_CP949
      FT_ENCODING_OLD_LATIN_2FT_OpenType_ValidateFT_WinFNT_ID_CP950
      FT_ENCODING_SJISFT_ORIENTATION_FILL_LEFTFT_WinFNT_ID_DEFAULT
      FT_ENCODING_UNICODEFT_ORIENTATION_FILL_RIGHTFT_WinFNT_ID_MAC
      FT_ENCODING_WANSUNGFT_ORIENTATION_NONEFT_WinFNT_ID_OEM
      FT_EncodingFT_ORIENTATION_POSTSCRIPTFT_WinFNT_ID_SYMBOL
      FT_ERRORS_HFT_ORIENTATION_TRUETYPEFT_WinFNT_ID_XXX
      FT_ErrorFT_OrientationFT_XFREE86_H
      FT_F26Dot6FT_OUTLINE_EVEN_ODD_FILLFTC_CMapCache
      FT_F2Dot14FT_OUTLINE_FLAGSFTC_CMapCache_Lookup
      FT_FACE_FLAG_CID_KEYEDFT_OUTLINE_HFTC_CMapCache_New
      FT_FACE_FLAG_EXTERNAL_STREAMFT_OUTLINE_HIGH_PRECISIONFTC_Face_Requester
      FT_FACE_FLAG_FAST_GLYPHSFT_OUTLINE_IGNORE_DROPOUTSFTC_FaceID
      FT_FACE_FLAG_FIXED_SIZESFT_OUTLINE_INCLUDE_STUBSFTC_ImageCache
      FT_FACE_FLAG_FIXED_WIDTHFT_OUTLINE_NONEFTC_ImageCache_Lookup
      FT_FACE_FLAG_GLYPH_NAMESFT_OUTLINE_OWNERFTC_ImageCache_LookupScaler
      FT_FACE_FLAG_HINTERFT_OUTLINE_REVERSE_FILLFTC_ImageCache_New
      FT_FACE_FLAG_HORIZONTALFT_OUTLINE_SINGLE_PASSFTC_ImageType
      FT_FACE_FLAG_KERNINGFT_OUTLINE_SMART_DROPOUTSFTC_ImageTypeRec
      FT_FACE_FLAG_MULTIPLE_MASTERSFT_OutlineFTC_Manager
      FT_FACE_FLAG_SCALABLEFT_Outline_CheckFTC_Manager_Done
      FT_FACE_FLAG_SFNTFT_Outline_ConicToFuncFTC_Manager_LookupFace
      FT_FACE_FLAG_TRICKYFT_Outline_CopyFTC_Manager_LookupSize
      FT_FACE_FLAG_VERTICALFT_Outline_CubicToFuncFTC_Manager_New
      FT_FACE_FLAG_XXXFT_Outline_DecomposeFTC_Manager_RemoveFaceID
      FT_FaceFT_Outline_DoneFTC_Manager_Reset
      FT_Face_CheckTrueTypePatentsFT_Outline_EmboldenFTC_Node
      FT_Face_GetCharsOfVariantFT_Outline_FuncsFTC_Node_Unref
      FT_Face_GetCharVariantIndexFT_Outline_Get_BBoxFTC_SBit
      FT_Face_GetCharVariantIsDefaultFT_Outline_Get_BitmapFTC_SBitCache
      FT_Face_GetVariantSelectorsFT_Outline_Get_CBoxFTC_SBitCache_Lookup
      FT_Face_GetVariantsOfCharFT_Outline_Get_OrientationFTC_SBitCache_LookupScaler
      FT_Face_InternalFT_Outline_GetInsideBorderFTC_SBitCache_New
      FT_Face_SetUnpatentedHintingFT_Outline_GetOutsideBorderFTC_SBitRec
      FT_FaceRecFT_Outline_LineToFuncFTC_Scaler
      FT_FixedFT_Outline_MoveToFuncFTC_ScalerRec
      FT_FloorFixFT_Outline_Newft_encoding_xxx
      FT_FREETYPE_HFT_Outline_Renderft_glyph_bbox_gridfit
      FT_Free_FuncFT_Outline_Reverseft_glyph_bbox_pixels
      FT_FSTYPE_BITMAP_EMBEDDING_ONLYFT_Outline_Transformft_glyph_bbox_subpixels
      FT_FSTYPE_EDITABLE_EMBEDDINGFT_Outline_Translateft_glyph_bbox_truncate
      FT_FSTYPE_INSTALLABLE_EMBEDDINGFT_OutlineGlyphft_glyph_bbox_unscaled
      FT_FSTYPE_NO_SUBSETTINGFT_OutlineGlyphRecft_glyph_bbox_xxx
      FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDINGFT_PARAM_TAG_INCREMENTALft_glyph_format_bitmap
      FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDINGFT_PARAM_TAG_UNPATENTED_HINTINGft_glyph_format_composite
      FT_FSTYPE_XXXFT_Palette_Modeft_glyph_format_none
      FT_FWordFT_Parameterft_glyph_format_outline
      FT_GASP_DO_GRAYFT_PFR_Hft_glyph_format_plotter
      FT_GASP_DO_GRIDFITFT_PIXEL_MODE_GRAYft_glyph_format_xxx
      FT_GASP_HFT_PIXEL_MODE_GRAY2ft_kerning_default
      FT_GASP_NO_TABLEFT_PIXEL_MODE_GRAY4ft_kerning_unfitted
      FT_GASP_SYMMETRIC_GRIDFITFT_PIXEL_MODE_LCDft_kerning_unscaled
      FT_GASP_SYMMETRIC_SMOOTHINGFT_PIXEL_MODE_LCD_Vft_open_driver
      FT_GASP_XXXFT_PIXEL_MODE_MONOft_open_memory
      FT_GenericFT_PIXEL_MODE_NONEft_open_params
      FT_Generic_FinalizerFT_Pixel_Modeft_open_pathname
      FT_Get_AdvanceFT_Pointerft_open_stream
      FT_Get_AdvancesFT_Posft_outline_even_odd_fill
      FT_Get_BDF_Charset_IDFT_PropertyTypeft_outline_flags
      FT_Get_BDF_PropertyFT_PtrDistft_outline_high_precision
      FT_Get_Char_IndexFT_RASTER_FLAG_AAft_outline_ignore_dropouts
      FT_Get_Charmap_IndexFT_RASTER_FLAG_CLIPft_outline_none
      FT_Get_CID_From_Glyph_IndexFT_RASTER_FLAG_DEFAULTft_outline_owner
      FT_Get_CID_Is_Internally_CID_KeyedFT_RASTER_FLAG_DIRECTft_outline_reverse_fill
      FT_Get_CID_Registry_Ordering_SupplementFT_RASTER_FLAG_XXXft_outline_single_pass
      FT_Get_CMap_FormatFT_Rasterft_palette_mode_rgb
      FT_Get_CMap_Language_IDFT_Raster_BitSet_Funcft_palette_mode_rgba
      FT_Get_First_CharFT_Raster_BitTest_Funcft_pixel_mode_grays
      FT_Get_FSType_FlagsFT_Raster_DoneFuncft_pixel_mode_mono
      FT_Get_GaspFT_Raster_Funcsft_pixel_mode_none
      FT_Get_GlyphFT_Raster_NewFuncft_pixel_mode_pal2
      FT_Get_Glyph_NameFT_Raster_Paramsft_pixel_mode_pal4
      FT_Get_KerningFT_Raster_RenderFuncft_pixel_mode_xxx
      FT_Get_MM_VarFT_Raster_ResetFuncft_render_mode_mono
      FT_Get_ModuleFT_Raster_SetModeFuncft_render_mode_normal
      FT_Get_Multi_MasterFT_RENDER_Hft_render_mode_xxx
      FT_Get_Name_IndexFT_RENDER_MODE_LCDPS_FontInfo
      FT_Get_Next_CharFT_RENDER_MODE_LCD_VPS_FontInfoRec
      FT_Get_PFR_AdvanceFT_RENDER_MODE_LIGHTPS_Private
      FT_Get_PFR_KerningFT_RENDER_MODE_MONOPS_PrivateRec
      FT_Get_PFR_MetricsFT_RENDER_MODE_NORMALT1_Blend_Flags
      FT_Get_Postscript_NameFT_Realloc_FuncT1_FontInfo
      FT_Get_PS_Font_InfoFT_Remove_ModuleT1_Private
      FT_Get_PS_Font_PrivateFT_Render_GlyphTT_ADOBE_ID_CUSTOM
      FT_Get_RendererFT_Render_ModeTT_ADOBE_ID_EXPERT
      FT_Get_Sfnt_NameFT_RendererTT_ADOBE_ID_LATIN_1
      FT_Get_Sfnt_Name_CountFT_Renderer_ClassTT_ADOBE_ID_STANDARD
      FT_Get_Sfnt_TableFT_Request_SizeTT_ADOBE_ID_XXX
      FT_Get_SubGlyph_InfoFT_RoundFixTT_APPLE_ID_DEFAULT
      FT_Get_Track_KerningFT_Select_CharmapTT_APPLE_ID_ISO_10646
      FT_Get_TrueType_Engine_TypeFT_Select_SizeTT_APPLE_ID_UNICODE_1_1
      FT_Get_WinFNT_HeaderFT_Set_Char_SizeTT_APPLE_ID_UNICODE_2_0
      FT_Get_X11_Font_FormatFT_Set_CharmapTT_APPLE_ID_UNICODE_32
      FT_GetFile_From_Mac_ATS_NameFT_Set_Debug_HookTT_APPLE_ID_VARIANT_SELECTOR
      FT_GetFile_From_Mac_NameFT_Set_MM_Blend_CoordinatesTT_APPLE_ID_XXX
      FT_GetFilePath_From_Mac_ATS_NameFT_Set_MM_Design_CoordinatesTT_Header
      FT_GLYPH_BBOX_GRIDFITFT_Set_Pixel_SizesTT_HoriHeader
      FT_GLYPH_BBOX_PIXELSFT_Set_RendererTT_ISO_ID_10646
      FT_GLYPH_BBOX_SUBPIXELSFT_Set_TransformTT_ISO_ID_7BIT_ASCII
      FT_GLYPH_BBOX_TRUNCATEFT_Set_Var_Blend_CoordinatesTT_ISO_ID_8859_1
      FT_GLYPH_BBOX_UNSCALEDFT_Set_Var_Design_CoordinatesTT_ISO_ID_XXX
      FT_GLYPH_FORMAT_BITMAPFT_SFNT_NAMES_HTT_MAC_ID_ARABIC
      FT_GLYPH_FORMAT_COMPOSITEFT_Sfnt_Table_InfoTT_MAC_ID_ARMENIAN
      FT_GLYPH_FORMAT_NONEFT_Sfnt_TagTT_MAC_ID_BENGALI
      FT_GLYPH_FORMAT_OUTLINEFT_SfntNameTT_MAC_ID_BURMESE
      FT_GLYPH_FORMAT_PLOTTERFT_ShortTT_MAC_ID_DEVANAGARI
      FT_GLYPH_HFT_SIZE_REQUEST_TYPE_BBOXTT_MAC_ID_GEEZ
      FT_GlyphFT_SIZE_REQUEST_TYPE_CELLTT_MAC_ID_GEORGIAN
      FT_Glyph_BBox_ModeFT_SIZE_REQUEST_TYPE_NOMINALTT_MAC_ID_GREEK
      FT_Glyph_CopyFT_SIZE_REQUEST_TYPE_REAL_DIMTT_MAC_ID_GUJARATI
      FT_Glyph_FormatFT_SIZE_REQUEST_TYPE_SCALESTT_MAC_ID_GURMUKHI
      FT_Glyph_Get_CBoxFT_SIZES_HTT_MAC_ID_HEBREW
      FT_Glyph_MetricsFT_SinTT_MAC_ID_JAPANESE
      FT_Glyph_StrokeFT_SizeTT_MAC_ID_KANNADA
      FT_Glyph_StrokeBorderFT_Size_InternalTT_MAC_ID_KHMER
      FT_Glyph_To_BitmapFT_Size_MetricsTT_MAC_ID_KOREAN
      FT_Glyph_TransformFT_Size_RequestTT_MAC_ID_LAOTIAN
      FT_GlyphRecFT_Size_Request_TypeTT_MAC_ID_MALAYALAM
      FT_GlyphSlotFT_Size_RequestRecTT_MAC_ID_MALDIVIAN
      FT_GlyphSlot_Own_BitmapFT_SizeRecTT_MAC_ID_MONGOLIAN
      FT_GlyphSlotRecFT_Slot_InternalTT_MAC_ID_ORIYA
      FT_GX_VALIDATE_HFT_SpanTT_MAC_ID_ROMAN
      FT_GZIP_HFT_SpanFuncTT_MAC_ID_RSYMBOL
      FT_HAS_FAST_GLYPHSFT_STROKER_BORDER_LEFTTT_MAC_ID_RUSSIAN
      FT_HAS_FIXED_SIZESFT_STROKER_BORDER_RIGHTTT_MAC_ID_SIMPLIFIED_CHINESE
      FT_HAS_GLYPH_NAMESFT_STROKER_HTT_MAC_ID_SINDHI
      FT_HAS_HORIZONTALFT_STROKER_LINECAP_BUTTTT_MAC_ID_SINHALESE
      FT_HAS_KERNINGFT_STROKER_LINECAP_ROUNDTT_MAC_ID_SLAVIC
      FT_HAS_MULTIPLE_MASTERSFT_STROKER_LINECAP_SQUARETT_MAC_ID_TAMIL
      FT_HAS_VERTICALFT_STROKER_LINEJOIN_BEVELTT_MAC_ID_TELUGU
      FT_Has_PS_Glyph_NamesFT_STROKER_LINEJOIN_MITERTT_MAC_ID_THAI
      FT_IMAGE_HFT_STROKER_LINEJOIN_ROUNDTT_MAC_ID_TIBETAN
      FT_IMAGE_TAGFT_STYLE_FLAG_BOLDTT_MAC_ID_TRADITIONAL_CHINESE
      FT_INCREMENTAL_HFT_STYLE_FLAG_ITALICTT_MAC_ID_UNINTERP
      FT_IncrementalFT_STYLE_FLAG_XXXTT_MAC_ID_VIETNAMESE
      FT_Incremental_FreeGlyphDataFuncFT_StreamTT_MAC_ID_XXX
      FT_Incremental_FuncsRecFT_Stream_CloseFuncTT_MaxProfile
      FT_Incremental_GetGlyphDataFuncFT_Stream_IoFuncTT_MS_ID_BIG_5
      FT_Incremental_GetGlyphMetricsFuncFT_Stream_OpenGzipTT_MS_ID_GB2312
      FT_Incremental_InterfaceFT_Stream_OpenLZWTT_MS_ID_JOHAB
      FT_Incremental_InterfaceRecFT_StreamDescTT_MS_ID_SJIS
      FT_Incremental_MetricsFT_StreamRecTT_MS_ID_SYMBOL_CS
      FT_Incremental_MetricsRecFT_StringTT_MS_ID_UCS_4
      FT_Init_FreeTypeFT_StrokerTT_MS_ID_UNICODE_CS
      FT_IntFT_Stroker_BeginSubPathTT_MS_ID_WANSUNG
      FT_Int16FT_Stroker_ConicToTT_MS_ID_XXX
      FT_Int32FT_Stroker_CubicToTT_OS2
      FT_IS_CID_KEYEDFT_Stroker_DoneTT_PCLT
      FT_IS_FIXED_WIDTHFT_Stroker_EndSubPathTT_PLATFORM_ADOBE
      FT_IS_SCALABLEFT_Stroker_ExportTT_PLATFORM_APPLE_UNICODE
      FT_IS_SFNTFT_Stroker_ExportBorderTT_PLATFORM_CUSTOM
      FT_IS_TRICKYFT_Stroker_GetBorderCountsTT_PLATFORM_ISO
      FT_KERNING_DEFAULTFT_Stroker_GetCountsTT_PLATFORM_MACINTOSH
      FT_KERNING_UNFITTEDFT_Stroker_LineCapTT_PLATFORM_MICROSOFT
      FT_KERNING_UNSCALEDFT_Stroker_LineJoinTT_PLATFORM_XXX
      FT_Kerning_ModeFT_Stroker_LineToTT_Postscript
      FT_LCD_FILTER_DEFAULTFT_Stroker_NewTT_VertHeader
      FT_LCD_FILTER_HFT_Stroker_ParseOutline
      FT_LCD_FILTER_LEGACYFT_Stroker_Rewind
      +
      + +
      [TOC]
      + +
      generated on Thu Mar 12 10:57:36 2009
      + diff --git a/src/3rdparty/freetype/docs/reference/ft2-lcd_filtering.html b/src/3rdparty/freetype/docs/reference/ft2-lcd_filtering.html new file mode 100644 index 0000000000..9ae6a5f992 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-lcd_filtering.html @@ -0,0 +1,149 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +LCD Filtering +

      +

      Synopsis

      + + +
      FT_LcdFilterFT_Library_SetLcdFilter


      + +
      +

      The FT_Library_SetLcdFilter API can be used to specify a low-pass filter which is then applied to LCD-optimized bitmaps generated through FT_Render_Glyph. This is useful to reduce color fringes which would occur with unfiltered rendering.

      +

      Note that no filter is active by default, and that this function is not implemented in default builds of the library. You need to #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your ‘ftoption.h’ file in order to activate it.

      +

      +
      +

      FT_LcdFilter

      +
      +Defined in FT_LCD_FILTER_H (freetype/ftlcdfil.h). +

      +
      +
      +  typedef enum  FT_LcdFilter_
      +  {
      +    FT_LCD_FILTER_NONE    = 0,
      +    FT_LCD_FILTER_DEFAULT = 1,
      +    FT_LCD_FILTER_LIGHT   = 2,
      +    FT_LCD_FILTER_LEGACY  = 16,
      +
      +    FT_LCD_FILTER_MAX   /* do not remove */
      +
      +  } FT_LcdFilter;
      +
      +

      +
      +

      A list of values to identify various types of LCD filters.

      +

      +
      values
      +

      + + + + + +
      FT_LCD_FILTER_NONE +

      Do not perform filtering. When used with subpixel rendering, this results in sometimes severe color fringes.

      +
      FT_LCD_FILTER_DEFAULT +

      The default filter reduces color fringes considerably, at the cost of a slight blurriness in the output.

      +
      FT_LCD_FILTER_LIGHT +

      The light filter is a variant that produces less blurriness at the cost of slightly more color fringes than the default one. It might be better, depending on taste, your monitor, or your personal vision.

      +
      FT_LCD_FILTER_LEGACY +

      This filter corresponds to the original libXft color filter. It provides high contrast output but can exhibit really bad color fringes if glyphs are not extremely well hinted to the pixel grid. In other words, it only works well if the TrueType bytecode interpreter is enabled and high-quality hinted fonts are used.

      +

      This filter is only provided for comparison purposes, and might be disabled or stay unsupported in the future.

      +
      +
      +
      since
      +

      2.3.0

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Library_SetLcdFilter

      +
      +Defined in FT_LCD_FILTER_H (freetype/ftlcdfil.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Library_SetLcdFilter( FT_Library    library,
      +                           FT_LcdFilter  filter );
      +
      +

      +
      +

      This function is used to apply color filtering to LCD decimated bitmaps, like the ones used when calling FT_Render_Glyph with FT_RENDER_MODE_LCD or FT_RENDER_MODE_LCD_V.

      +

      +
      input
      +

      + + + +
      library +

      A handle to the target library instance.

      +
      filter +

      The filter type.

      +

      You can use FT_LCD_FILTER_NONE here to disable this feature, or FT_LCD_FILTER_DEFAULT to use a default filter that should work well on most LCD screens.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This feature is always disabled by default. Clients must make an explicit call to this function with a ‘filter’ value other than FT_LCD_FILTER_NONE in order to enable it.

      +

      Due to PATENTS covering subpixel rendering, this function doesn't do anything except returning ‘FT_Err_Unimplemented_Feature’ if the configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not defined in your build of the library, which should correspond to all default builds of FreeType.

      +

      The filter affects glyph bitmaps rendered through FT_Render_Glyph, FT_Outline_Get_Bitmap, FT_Load_Glyph, and FT_Load_Char.

      +

      It does not affect the output of FT_Outline_Render and FT_Outline_Get_Bitmap.

      +

      If this feature is activated, the dimensions of LCD glyph bitmaps are either larger or taller than the dimensions of the corresponding outline with regards to the pixel grid. For example, for FT_RENDER_MODE_LCD, the filter adds up to 3 pixels to the left, and up to 3 pixels to the right.

      +

      The bitmap offset values are adjusted correctly, so clients shouldn't need to modify their layout and glyph positioning code when enabling the filter.

      +
      +
      since
      +

      2.3.0

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-list_processing.html b/src/3rdparty/freetype/docs/reference/ft2-list_processing.html new file mode 100644 index 0000000000..bf0df50d0e --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-list_processing.html @@ -0,0 +1,467 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +List Processing +

      +

      Synopsis

      + + + + + + +
      FT_ListFT_List_AddFT_List_Iterate
      FT_ListNodeFT_List_InsertFT_List_Destructor
      FT_ListRecFT_List_RemoveFT_List_Finalize
      FT_ListNodeRecFT_List_Up
      FT_List_FindFT_List_Iterator


      + +
      +

      This section contains various definitions related to list processing using doubly-linked nodes.

      +

      +
      +

      FT_List

      +
      +

      A handle to a list record (see FT_ListRec).

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ListNode

      +
      +

      Many elements and objects in FreeType are listed through an FT_List record (see FT_ListRec). As its name suggests, an FT_ListNode is a handle to a single list element.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ListRec

      +
      +Defined in FT_TYPES_H (freetype/fttypes.h). +

      +
      +
      +  typedef struct  FT_ListRec_
      +  {
      +    FT_ListNode  head;
      +    FT_ListNode  tail;
      +
      +  } FT_ListRec;
      +
      +

      +
      +

      A structure used to hold a simple doubly-linked list. These are used in many parts of FreeType.

      +

      +
      fields
      +

      + + + +
      head +

      The head (first element) of doubly-linked list.

      +
      tail +

      The tail (last element) of doubly-linked list.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_ListNodeRec

      +
      +Defined in FT_TYPES_H (freetype/fttypes.h). +

      +
      +
      +  typedef struct  FT_ListNodeRec_
      +  {
      +    FT_ListNode  prev;
      +    FT_ListNode  next;
      +    void*        data;
      +
      +  } FT_ListNodeRec;
      +
      +

      +
      +

      A structure used to hold a single list element.

      +

      +
      fields
      +

      + + + + +
      prev +

      The previous element in the list. NULL if first.

      +
      next +

      The next element in the list. NULL if last.

      +
      data +

      A typeless pointer to the listed object.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Find

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  FT_EXPORT( FT_ListNode )
      +  FT_List_Find( FT_List  list,
      +                void*    data );
      +
      +

      +
      +

      Find the list node for a given listed object.

      +

      +
      input
      +

      + + + +
      list +

      A pointer to the parent list.

      +
      data +

      The address of the listed object.

      +
      +
      +
      return
      +

      List node. NULL if it wasn't found.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Add

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_List_Add( FT_List      list,
      +               FT_ListNode  node );
      +
      +

      +
      +

      Append an element to the end of a list.

      +

      +
      inout
      +

      + + + +
      list +

      A pointer to the parent list.

      +
      node +

      The node to append.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Insert

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_List_Insert( FT_List      list,
      +                  FT_ListNode  node );
      +
      +

      +
      +

      Insert an element at the head of a list.

      +

      +
      inout
      +

      + + + +
      list +

      A pointer to parent list.

      +
      node +

      The node to insert.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Remove

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_List_Remove( FT_List      list,
      +                  FT_ListNode  node );
      +
      +

      +
      +

      Remove a node from a list. This function doesn't check whether the node is in the list!

      +

      +
      input
      +

      + + +
      node +

      The node to remove.

      +
      +
      +
      inout
      +

      + + +
      list +

      A pointer to the parent list.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Up

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_List_Up( FT_List      list,
      +              FT_ListNode  node );
      +
      +

      +
      +

      Move a node to the head/top of a list. Used to maintain LRU lists.

      +

      +
      inout
      +

      + + + +
      list +

      A pointer to the parent list.

      +
      node +

      The node to move.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Iterator

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  typedef FT_Error
      +  (*FT_List_Iterator)( FT_ListNode  node,
      +                       void*        user );
      +
      +

      +
      +

      An FT_List iterator function which is called during a list parse by FT_List_Iterate.

      +

      +
      input
      +

      + + + +
      node +

      The current iteration list node.

      +
      user +

      A typeless pointer passed to FT_List_Iterate. Can be used to point to the iteration's state.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Iterate

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_List_Iterate( FT_List           list,
      +                   FT_List_Iterator  iterator,
      +                   void*             user );
      +
      +

      +
      +

      Parse a list and calls a given iterator function on each element. Note that parsing is stopped as soon as one of the iterator calls returns a non-zero value.

      +

      +
      input
      +

      + + + + +
      list +

      A handle to the list.

      +
      iterator +

      An iterator function, called on each node of the list.

      +
      user +

      A user-supplied field which is passed as the second argument to the iterator.

      +
      +
      +
      return
      +

      The result (a FreeType error code) of the last iterator call.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Destructor

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  typedef void
      +  (*FT_List_Destructor)( FT_Memory  memory,
      +                         void*      data,
      +                         void*      user );
      +
      +

      +
      +

      An FT_List iterator function which is called during a list finalization by FT_List_Finalize to destroy all elements in a given list.

      +

      +
      input
      +

      + + + + +
      system +

      The current system object.

      +
      data +

      The current object to destroy.

      +
      user +

      A typeless pointer passed to FT_List_Iterate. It can be used to point to the iteration's state.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_List_Finalize

      +
      +Defined in FT_LIST_H (freetype/ftlist.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_List_Finalize( FT_List             list,
      +                    FT_List_Destructor  destroy,
      +                    FT_Memory           memory,
      +                    void*               user );
      +
      +

      +
      +

      Destroy all elements in the list as well as the list itself.

      +

      +
      input
      +

      + + + + + +
      list +

      A handle to the list.

      +
      destroy +

      A list destructor that will be applied to each element of the list.

      +
      memory +

      The current memory object which handles deallocation.

      +
      user +

      A user-supplied field which is passed as the last argument to the destructor.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-lzw.html b/src/3rdparty/freetype/docs/reference/ft2-lzw.html new file mode 100644 index 0000000000..5ef0a5f7ab --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-lzw.html @@ -0,0 +1,94 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +LZW Streams +

      +

      Synopsis

      + + +
      FT_Stream_OpenLZW


      + +
      +

      This section contains the declaration of LZW-specific functions.

      +

      +
      +

      FT_Stream_OpenLZW

      +
      +Defined in FT_LZW_H (freetype/ftlzw.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Stream_OpenLZW( FT_Stream  stream,
      +                     FT_Stream  source );
      +
      +

      +
      +

      Open a new stream to parse LZW-compressed font files. This is mainly used to support the compressed ‘*.pcf.Z’ fonts that come with XFree86.

      +

      +
      input
      +

      + + + +
      stream +

      The target embedding stream.

      +
      source +

      The source stream.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The source stream must be opened before calling this function.

      +

      Calling the internal function ‘FT_Stream_Close’ on the new stream will not call ‘FT_Stream_Close’ on the source stream. None of the stream objects will be released to the heap.

      +

      The stream implementation is very basic and resets the decompression process each time seeking backwards is needed within the stream

      +

      In certain builds of the library, LZW compression recognition is automatically handled when calling FT_New_Face or FT_Open_Face. This means that if no font driver is capable of handling the raw compressed file, the library will try to open a LZW stream from it and re-open the face with it.

      +

      This function may return ‘FT_Err_Unimplemented_Feature’ if your build of FreeType was not compiled with LZW support.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-mac_specific.html b/src/3rdparty/freetype/docs/reference/ft2-mac_specific.html new file mode 100644 index 0000000000..3528c72db7 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-mac_specific.html @@ -0,0 +1,368 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Mac Specific Interface +

      +

      Synopsis

      + + + + +
      FT_New_Face_From_FONDFT_GetFilePath_From_Mac_ATS_Name
      FT_GetFile_From_Mac_NameFT_New_Face_From_FSSpec
      FT_GetFile_From_Mac_ATS_NameFT_New_Face_From_FSRef


      + +
      +

      The following definitions are only available if FreeType is compiled on a Macintosh.

      +

      +
      +

      FT_New_Face_From_FOND

      +
      +Defined in FT_MAC_H (freetype/ftmac.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_New_Face_From_FOND( FT_Library  library,
      +                         Handle      fond,
      +                         FT_Long     face_index,
      +                         FT_Face    *aface )
      +                       FT_DEPRECATED_ATTRIBUTE;
      +
      +

      +
      +

      Create a new face object from a FOND resource.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library resource.

      +
      +
      +
      input
      +

      + + + +
      fond +

      A FOND resource.

      +
      face_index +

      Only supported for the -1 ‘sanity check’ special case.

      +
      +
      +
      output
      +

      + + +
      aface +

      A handle to a new face object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      notes
      +

      This function can be used to create FT_Face objects from fonts that are installed in the system as follows.

      +
      +  fond = GetResource( 'FOND', fontName );                          
      +  error = FT_New_Face_From_FOND( library, fond, 0, &face );        
      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GetFile_From_Mac_Name

      +
      +Defined in FT_MAC_H (freetype/ftmac.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_GetFile_From_Mac_Name( const char*  fontName,
      +                            FSSpec*      pathSpec,
      +                            FT_Long*     face_index )
      +                          FT_DEPRECATED_ATTRIBUTE;
      +
      +

      +
      +

      Return an FSSpec for the disk file containing the named font.

      +

      +
      input
      +

      + + +
      fontName +

      Mac OS name of the font (e.g., Times New Roman Bold).

      +
      +
      +
      output
      +

      + + + +
      pathSpec +

      FSSpec to the file. For passing to FT_New_Face_From_FSSpec.

      +
      face_index +

      Index of the face. For passing to FT_New_Face_From_FSSpec.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GetFile_From_Mac_ATS_Name

      +
      +Defined in FT_MAC_H (freetype/ftmac.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
      +                                FSSpec*      pathSpec,
      +                                FT_Long*     face_index )
      +                              FT_DEPRECATED_ATTRIBUTE;
      +
      +

      +
      +

      Return an FSSpec for the disk file containing the named font.

      +

      +
      input
      +

      + + +
      fontName +

      Mac OS name of the font in ATS framework.

      +
      +
      +
      output
      +

      + + + +
      pathSpec +

      FSSpec to the file. For passing to FT_New_Face_From_FSSpec.

      +
      face_index +

      Index of the face. For passing to FT_New_Face_From_FSSpec.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_GetFilePath_From_Mac_ATS_Name

      +
      +Defined in FT_MAC_H (freetype/ftmac.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
      +                                    UInt8*       path,
      +                                    UInt32       maxPathSize,
      +                                    FT_Long*     face_index )
      +                                  FT_DEPRECATED_ATTRIBUTE;
      +
      +

      +
      +

      Return a pathname of the disk file and face index for given font name which is handled by ATS framework.

      +

      +
      input
      +

      + + +
      fontName +

      Mac OS name of the font in ATS framework.

      +
      +
      +
      output
      +

      + + + + +
      path +

      Buffer to store pathname of the file. For passing to FT_New_Face. The client must allocate this buffer before calling this function.

      +
      maxPathSize +

      Lengths of the buffer ‘path’ that client allocated.

      +
      face_index +

      Index of the face. For passing to FT_New_Face.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_New_Face_From_FSSpec

      +
      +Defined in FT_MAC_H (freetype/ftmac.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_New_Face_From_FSSpec( FT_Library     library,
      +                           const FSSpec  *spec,
      +                           FT_Long        face_index,
      +                           FT_Face       *aface )
      +                         FT_DEPRECATED_ATTRIBUTE;
      +
      +

      +
      +

      Create a new face object from a given resource and typeface index using an FSSpec to the font file.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library resource.

      +
      +
      +
      input
      +

      + + + +
      spec +

      FSSpec to the font file.

      +
      face_index +

      The index of the face within the resource. The first face has index 0.

      +
      +
      +
      output
      +

      + + +
      aface +

      A handle to a new face object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      FT_New_Face_From_FSSpec is identical to FT_New_Face except it accepts an FSSpec instead of a path.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_New_Face_From_FSRef

      +
      +Defined in FT_MAC_H (freetype/ftmac.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_New_Face_From_FSRef( FT_Library    library,
      +                          const FSRef  *ref,
      +                          FT_Long       face_index,
      +                          FT_Face      *aface )
      +                        FT_DEPRECATED_ATTRIBUTE;
      +
      +

      +
      +

      Create a new face object from a given resource and typeface index using an FSRef to the font file.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library resource.

      +
      +
      +
      input
      +

      + + + +
      spec +

      FSRef to the font file.

      +
      face_index +

      The index of the face within the resource. The first face has index 0.

      +
      +
      +
      output
      +

      + + +
      aface +

      A handle to a new face object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      FT_New_Face_From_FSRef is identical to FT_New_Face except it accepts an FSRef instead of a path.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-module_management.html b/src/3rdparty/freetype/docs/reference/ft2-module_management.html new file mode 100644 index 0000000000..e621f27745 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-module_management.html @@ -0,0 +1,626 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Module Management +

      +

      Synopsis

      + + + + + + +
      FT_Module_ConstructorFT_Get_ModuleFT_Add_Default_Modules
      FT_Module_DestructorFT_Remove_ModuleFT_Renderer_Class
      FT_Module_RequesterFT_New_LibraryFT_Get_Renderer
      FT_Module_ClassFT_Done_LibraryFT_Set_Renderer
      FT_Add_ModuleFT_Set_Debug_Hook


      + +
      +

      The definitions below are used to manage modules within FreeType. Modules can be added, upgraded, and removed at runtime.

      +

      +
      +

      FT_Module_Constructor

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  typedef FT_Error
      +  (*FT_Module_Constructor)( FT_Module  module );
      +
      +

      +
      +

      A function used to initialize (not create) a new module object.

      +

      +
      input
      +

      + + +
      module +

      The module to initialize.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Module_Destructor

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  typedef void
      +  (*FT_Module_Destructor)( FT_Module  module );
      +
      +

      +
      +

      A function used to finalize (not destroy) a given module object.

      +

      +
      input
      +

      + + +
      module +

      The module to finalize.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Module_Requester

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  typedef FT_Module_Interface
      +  (*FT_Module_Requester)( FT_Module    module,
      +                          const char*  name );
      +
      +

      +
      +

      A function used to query a given module for a specific interface.

      +

      +
      input
      +

      + + + +
      module +

      The module to finalize.

      +
      name +

      The name of the interface in the module.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Module_Class

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  typedef struct  FT_Module_Class_
      +  {
      +    FT_ULong               module_flags;
      +    FT_Long                module_size;
      +    const FT_String*       module_name;
      +    FT_Fixed               module_version;
      +    FT_Fixed               module_requires;
      +
      +    const void*            module_interface;
      +
      +    FT_Module_Constructor  module_init;
      +    FT_Module_Destructor   module_done;
      +    FT_Module_Requester    get_interface;
      +
      +  } FT_Module_Class;
      +
      +

      +
      +

      The module class descriptor.

      +

      +
      fields
      +

      + + + + + + + + + +
      module_flags +

      Bit flags describing the module.

      +
      module_size +

      The size of one module object/instance in bytes.

      +
      module_name +

      The name of the module.

      +
      module_version +

      The version, as a 16.16 fixed number (major.minor).

      +
      module_requires +

      The version of FreeType this module requires, as a 16.16 fixed number (major.minor). Starts at version 2.0, i.e., 0x20000.

      +
      module_init +

      The initializing function.

      +
      module_done +

      The finalizing function.

      +
      get_interface +

      The interface requesting function.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Add_Module

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Add_Module( FT_Library              library,
      +                 const FT_Module_Class*  clazz );
      +
      +

      +
      +

      Add a new module to a given library instance.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library object.

      +
      +
      +
      input
      +

      + + +
      clazz +

      A pointer to class descriptor for the module.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      An error will be returned if a module already exists by that name, or if the module requires a version of FreeType that is too great.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Module

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  FT_EXPORT( FT_Module )
      +  FT_Get_Module( FT_Library   library,
      +                 const char*  module_name );
      +
      +

      +
      +

      Find a module by its name.

      +

      +
      input
      +

      + + + +
      library +

      A handle to the library object.

      +
      module_name +

      The module's name (as an ASCII string).

      +
      +
      +
      return
      +

      A module handle. 0 if none was found.

      +
      +
      note
      +

      FreeType's internal modules aren't documented very well, and you should look up the source code for details.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Remove_Module

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Remove_Module( FT_Library  library,
      +                    FT_Module   module );
      +
      +

      +
      +

      Remove a given module from a library instance.

      +

      +
      inout
      +

      + + +
      library +

      A handle to a library object.

      +
      +
      +
      input
      +

      + + +
      module +

      A handle to a module object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The module object is destroyed by the function in case of success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_New_Library

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_New_Library( FT_Memory    memory,
      +                  FT_Library  *alibrary );
      +
      +

      +
      +

      This function is used to create a new FreeType library instance from a given memory object. It is thus possible to use libraries with distinct memory allocators within the same program.

      +

      +
      input
      +

      + + +
      memory +

      A handle to the original memory object.

      +
      +
      +
      output
      +

      + + +
      alibrary +

      A pointer to handle of a new library object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Done_Library

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Done_Library( FT_Library  library );
      +
      +

      +
      +

      Discard a given library object. This closes all drivers and discards all resource objects.

      +

      +
      input
      +

      + + +
      library +

      A handle to the target library.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_Debug_Hook

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Set_Debug_Hook( FT_Library         library,
      +                     FT_UInt            hook_index,
      +                     FT_DebugHook_Func  debug_hook );
      +
      +

      +
      +

      Set a debug hook function for debugging the interpreter of a font format.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library object.

      +
      +
      +
      input
      +

      + + + +
      hook_index +

      The index of the debug hook. You should use the values defined in ‘ftobjs.h’, e.g., ‘FT_DEBUG_HOOK_TRUETYPE’.

      +
      debug_hook +

      The function used to debug the interpreter.

      +
      +
      +
      note
      +

      Currently, four debug hook slots are available, but only two (for the TrueType and the Type 1 interpreter) are defined.

      +

      Since the internal headers of FreeType are no longer installed, the symbol ‘FT_DEBUG_HOOK_TRUETYPE’ isn't available publicly. This is a bug and will be fixed in a forthcoming release.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Add_Default_Modules

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Add_Default_Modules( FT_Library  library );
      +
      +

      +
      +

      Add the set of default drivers to a given library object. This is only useful when you create a library object with FT_New_Library (usually to plug a custom memory manager).

      +

      +
      inout
      +

      + + +
      library +

      A handle to a new library object.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Renderer_Class

      +
      +Defined in FT_RENDER_H (freetype/ftrender.h). +

      +
      +
      +  typedef struct  FT_Renderer_Class_
      +  {
      +    FT_Module_Class            root;
      +
      +    FT_Glyph_Format            glyph_format;
      +
      +    FT_Renderer_RenderFunc     render_glyph;
      +    FT_Renderer_TransformFunc  transform_glyph;
      +    FT_Renderer_GetCBoxFunc    get_glyph_cbox;
      +    FT_Renderer_SetModeFunc    set_mode;
      +
      +    FT_Raster_Funcs*           raster_class;
      +
      +  } FT_Renderer_Class;
      +
      +

      +
      +

      The renderer module class descriptor.

      +

      +
      fields
      +

      + + + + + + + + + +
      root +

      The root FT_Module_Class fields.

      +
      glyph_format +

      The glyph image format this renderer handles.

      +
      render_glyph +

      A method used to render the image that is in a given glyph slot into a bitmap.

      +
      transform_glyph +

      A method used to transform the image that is in a given glyph slot.

      +
      get_glyph_cbox +

      A method used to access the glyph's cbox.

      +
      set_mode +

      A method used to pass additional parameters.

      +
      raster_class +

      For FT_GLYPH_FORMAT_OUTLINE renderers only. This is a pointer to its raster's class.

      +
      raster +

      For FT_GLYPH_FORMAT_OUTLINE renderers only. This is a pointer to the corresponding raster object, if any.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Renderer

      +
      +Defined in FT_RENDER_H (freetype/ftrender.h). +

      +
      +
      +  FT_EXPORT( FT_Renderer )
      +  FT_Get_Renderer( FT_Library       library,
      +                   FT_Glyph_Format  format );
      +
      +

      +
      +

      Retrieve the current renderer for a given glyph format.

      +

      +
      input
      +

      + + + +
      library +

      A handle to the library object.

      +
      format +

      The glyph format.

      +
      +
      +
      return
      +

      A renderer handle. 0 if none found.

      +
      +
      note
      +

      An error will be returned if a module already exists by that name, or if the module requires a version of FreeType that is too great.

      +

      To add a new renderer, simply use FT_Add_Module. To retrieve a renderer by its name, use FT_Get_Module.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_Renderer

      +
      +Defined in FT_RENDER_H (freetype/ftrender.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Set_Renderer( FT_Library     library,
      +                   FT_Renderer    renderer,
      +                   FT_UInt        num_params,
      +                   FT_Parameter*  parameters );
      +
      +

      +
      +

      Set the current renderer to use, and set additional mode.

      +

      +
      inout
      +

      + + +
      library +

      A handle to the library object.

      +
      +
      +
      input
      +

      + + + + +
      renderer +

      A handle to the renderer object.

      +
      num_params +

      The number of additional parameters.

      +
      parameters +

      Additional parameters.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      In case of success, the renderer will be used to convert glyph images in the renderer's known format into bitmaps.

      +

      This doesn't change the current renderer for other formats.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-multiple_masters.html b/src/3rdparty/freetype/docs/reference/ft2-multiple_masters.html new file mode 100644 index 0000000000..a977f87f79 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-multiple_masters.html @@ -0,0 +1,511 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Multiple Masters +

      +

      Synopsis

      + + + + + + + +
      FT_MM_AxisFT_Get_MM_Var
      FT_Multi_MasterFT_Set_MM_Design_Coordinates
      FT_Var_AxisFT_Set_Var_Design_Coordinates
      FT_Var_Named_StyleFT_Set_MM_Blend_Coordinates
      FT_MM_VarFT_Set_Var_Blend_Coordinates
      FT_Get_Multi_Master


      + +
      +

      The following types and functions are used to manage Multiple Master fonts, i.e., the selection of specific design instances by setting design axis coordinates.

      +

      George Williams has extended this interface to make it work with both Type 1 Multiple Masters fonts and GX distortable (var) fonts. Some of these routines only work with MM fonts, others will work with both types. They are similar enough that a consistent interface makes sense.

      +

      +
      +

      FT_MM_Axis

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  typedef struct  FT_MM_Axis_
      +  {
      +    FT_String*  name;
      +    FT_Long     minimum;
      +    FT_Long     maximum;
      +
      +  } FT_MM_Axis;
      +
      +

      +
      +

      A simple structure used to model a given axis in design space for Multiple Masters fonts.

      +

      This structure can't be used for GX var fonts.

      +

      +
      fields
      +

      + + + + +
      name +

      The axis's name.

      +
      minimum +

      The axis's minimum design coordinate.

      +
      maximum +

      The axis's maximum design coordinate.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Multi_Master

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  typedef struct  FT_Multi_Master_
      +  {
      +    FT_UInt     num_axis;
      +    FT_UInt     num_designs;
      +    FT_MM_Axis  axis[T1_MAX_MM_AXIS];
      +
      +  } FT_Multi_Master;
      +
      +

      +
      +

      A structure used to model the axes and space of a Multiple Masters font.

      +

      This structure can't be used for GX var fonts.

      +

      +
      fields
      +

      + + + + +
      num_axis +

      Number of axes. Cannot exceed 4.

      +
      num_designs +

      Number of designs; should be normally 2^num_axis even though the Type 1 specification strangely allows for intermediate designs to be present. This number cannot exceed 16.

      +
      axis +

      A table of axis descriptors.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Var_Axis

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  typedef struct  FT_Var_Axis_
      +  {
      +    FT_String*  name;
      +
      +    FT_Fixed    minimum;
      +    FT_Fixed    def;
      +    FT_Fixed    maximum;
      +
      +    FT_ULong    tag;
      +    FT_UInt     strid;
      +
      +  } FT_Var_Axis;
      +
      +

      +
      +

      A simple structure used to model a given axis in design space for Multiple Masters and GX var fonts.

      +

      +
      fields
      +

      + + + + + + + +
      name +

      The axis's name. Not always meaningful for GX.

      +
      minimum +

      The axis's minimum design coordinate.

      +
      def +

      The axis's default design coordinate. FreeType computes meaningful default values for MM; it is then an integer value, not in 16.16 format.

      +
      maximum +

      The axis's maximum design coordinate.

      +
      tag +

      The axis's tag (the GX equivalent to ‘name’). FreeType provides default values for MM if possible.

      +
      strid +

      The entry in ‘name’ table (another GX version of ‘name’). Not meaningful for MM.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Var_Named_Style

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  typedef struct  FT_Var_Named_Style_
      +  {
      +    FT_Fixed*  coords;
      +    FT_UInt    strid;
      +
      +  } FT_Var_Named_Style;
      +
      +

      +
      +

      A simple structure used to model a named style in a GX var font.

      +

      This structure can't be used for MM fonts.

      +

      +
      fields
      +

      + + + +
      coords +

      The design coordinates for this style. This is an array with one entry for each axis.

      +
      strid +

      The entry in ‘name’ table identifying this style.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_MM_Var

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  typedef struct  FT_MM_Var_
      +  {
      +    FT_UInt              num_axis;
      +    FT_UInt              num_designs;
      +    FT_UInt              num_namedstyles;
      +    FT_Var_Axis*         axis;
      +    FT_Var_Named_Style*  namedstyle;
      +
      +  } FT_MM_Var;
      +
      +

      +
      +

      A structure used to model the axes and space of a Multiple Masters or GX var distortable font.

      +

      Some fields are specific to one format and not to the other.

      +

      +
      fields
      +

      + + + + + + +
      num_axis +

      The number of axes. The maximum value is 4 for MM; no limit in GX.

      +
      num_designs +

      The number of designs; should be normally 2^num_axis for MM fonts. Not meaningful for GX (where every glyph could have a different number of designs).

      +
      num_namedstyles +

      The number of named styles; only meaningful for GX which allows certain design coordinates to have a string ID (in the ‘name’ table) associated with them. The font can tell the user that, for example, Weight=1.5 is ‘Bold’.

      +
      axis +

      A table of axis descriptors. GX fonts contain slightly more data than MM.

      +
      namedstyles +

      A table of named styles. Only meaningful with GX.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Multi_Master

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_Multi_Master( FT_Face           face,
      +                       FT_Multi_Master  *amaster );
      +
      +

      +
      +

      Retrieve the Multiple Master descriptor of a given font.

      +

      This function can't be used with GX fonts.

      +

      +
      input
      +

      + + +
      face +

      A handle to the source face.

      +
      +
      +
      output
      +

      + + +
      amaster +

      The Multiple Masters descriptor.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_MM_Var

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_MM_Var( FT_Face      face,
      +                 FT_MM_Var*  *amaster );
      +
      +

      +
      +

      Retrieve the Multiple Master/GX var descriptor of a given font.

      +

      +
      input
      +

      + + +
      face +

      A handle to the source face.

      +
      +
      +
      output
      +

      + + +
      amaster +

      The Multiple Masters/GX var descriptor. Allocates a data structure, which the user must free (a single call to FT_FREE will do it).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_MM_Design_Coordinates

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Set_MM_Design_Coordinates( FT_Face   face,
      +                                FT_UInt   num_coords,
      +                                FT_Long*  coords );
      +
      +

      +
      +

      For Multiple Masters fonts, choose an interpolated font design through design coordinates.

      +

      This function can't be used with GX fonts.

      +

      +
      inout
      +

      + + +
      face +

      A handle to the source face.

      +
      +
      +
      input
      +

      + + + +
      num_coords +

      The number of design coordinates (must be equal to the number of axes in the font).

      +
      coords +

      An array of design coordinates.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_Var_Design_Coordinates

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Set_Var_Design_Coordinates( FT_Face    face,
      +                                 FT_UInt    num_coords,
      +                                 FT_Fixed*  coords );
      +
      +

      +
      +

      For Multiple Master or GX Var fonts, choose an interpolated font design through design coordinates.

      +

      +
      inout
      +

      + + +
      face +

      A handle to the source face.

      +
      +
      +
      input
      +

      + + + +
      num_coords +

      The number of design coordinates (must be equal to the number of axes in the font).

      +
      coords +

      An array of design coordinates.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_MM_Blend_Coordinates

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Set_MM_Blend_Coordinates( FT_Face    face,
      +                               FT_UInt    num_coords,
      +                               FT_Fixed*  coords );
      +
      +

      +
      +

      For Multiple Masters and GX var fonts, choose an interpolated font design through normalized blend coordinates.

      +

      +
      inout
      +

      + + +
      face +

      A handle to the source face.

      +
      +
      +
      input
      +

      + + + +
      num_coords +

      The number of design coordinates (must be equal to the number of axes in the font).

      +
      coords +

      The design coordinates array (each element must be between 0 and 1.0).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Set_Var_Blend_Coordinates

      +
      +Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Set_Var_Blend_Coordinates( FT_Face    face,
      +                                FT_UInt    num_coords,
      +                                FT_Fixed*  coords );
      +
      +

      +
      +

      This is another name of FT_Set_MM_Blend_Coordinates.

      +

      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-ot_validation.html b/src/3rdparty/freetype/docs/reference/ft2-ot_validation.html new file mode 100644 index 0000000000..e2289ef093 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-ot_validation.html @@ -0,0 +1,208 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +OpenType Validation +

      +

      Synopsis

      + + +
      FT_VALIDATE_OTXXXFT_OpenType_ValidateFT_OpenType_Free


      + +
      +

      This section contains the declaration of functions to validate some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).

      +

      +
      +

      FT_VALIDATE_OTXXX

      +
      +Defined in FT_OPENTYPE_VALIDATE_H (freetype/ftotval.h). +

      +
      +
      +#define FT_VALIDATE_BASE  0x0100
      +#define FT_VALIDATE_GDEF  0x0200
      +#define FT_VALIDATE_GPOS  0x0400
      +#define FT_VALIDATE_GSUB  0x0800
      +#define FT_VALIDATE_JSTF  0x1000
      +#define FT_VALIDATE_MATH  0x2000
      +
      +#define FT_VALIDATE_OT  FT_VALIDATE_BASE | \
      +                        FT_VALIDATE_GDEF | \
      +                        FT_VALIDATE_GPOS | \
      +                        FT_VALIDATE_GSUB | \
      +                        FT_VALIDATE_JSTF | \
      +                        FT_VALIDATE_MATH
      +
      +

      +
      +

      A list of bit-field constants used with FT_OpenType_Validate to indicate which OpenType tables should be validated.

      +

      +
      values
      +

      + + + + + + + + +
      FT_VALIDATE_BASE +

      Validate BASE table.

      +
      FT_VALIDATE_GDEF +

      Validate GDEF table.

      +
      FT_VALIDATE_GPOS +

      Validate GPOS table.

      +
      FT_VALIDATE_GSUB +

      Validate GSUB table.

      +
      FT_VALIDATE_JSTF +

      Validate JSTF table.

      +
      FT_VALIDATE_MATH +

      Validate MATH table.

      +
      FT_VALIDATE_OT +

      Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_OpenType_Validate

      +
      +Defined in FT_OPENTYPE_VALIDATE_H (freetype/ftotval.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_OpenType_Validate( FT_Face    face,
      +                        FT_UInt    validation_flags,
      +                        FT_Bytes  *BASE_table,
      +                        FT_Bytes  *GDEF_table,
      +                        FT_Bytes  *GPOS_table,
      +                        FT_Bytes  *GSUB_table,
      +                        FT_Bytes  *JSTF_table );
      +
      +

      +
      +

      Validate various OpenType tables to assure that all offsets and indices are valid. The idea is that a higher-level library which actually does the text layout can access those tables without error checking (which can be quite time consuming).

      +

      +
      input
      +

      + + + +
      face +

      A handle to the input face.

      +
      validation_flags +

      A bit field which specifies the tables to be validated. See FT_VALIDATE_OTXXX for possible values.

      +
      +
      +
      output
      +

      + + + + + + +
      BASE_table +

      A pointer to the BASE table.

      +
      GDEF_table +

      A pointer to the GDEF table.

      +
      GPOS_table +

      A pointer to the GPOS table.

      +
      GSUB_table +

      A pointer to the GSUB table.

      +
      JSTF_table +

      A pointer to the JSTF table.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function only works with OpenType fonts, returning an error otherwise.

      +

      After use, the application should deallocate the five tables with FT_OpenType_Free. A NULL value indicates that the table either doesn't exist in the font, or the application hasn't asked for validation.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_OpenType_Free

      +
      +Defined in FT_OPENTYPE_VALIDATE_H (freetype/ftotval.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_OpenType_Free( FT_Face   face,
      +                    FT_Bytes  table );
      +
      +

      +
      +

      Free the buffer allocated by OpenType validator.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the input face.

      +
      table +

      The pointer to the buffer that is allocated by FT_OpenType_Validate.

      +
      +
      +
      note
      +

      This function must be used to free the buffer allocated by FT_OpenType_Validate only.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-outline_processing.html b/src/3rdparty/freetype/docs/reference/ft2-outline_processing.html new file mode 100644 index 0000000000..d0b670ed96 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-outline_processing.html @@ -0,0 +1,1106 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Outline Processing +

      +

      Synopsis

      + + + + + + + + + + + + + +
      FT_OutlineFT_Outline_MoveToFunc
      FT_OUTLINE_FLAGSFT_Outline_LineToFunc
      FT_Outline_NewFT_Outline_ConicToFunc
      FT_Outline_DoneFT_Outline_CubicToFunc
      FT_Outline_CopyFT_Outline_Funcs
      FT_Outline_TranslateFT_Outline_Decompose
      FT_Outline_TransformFT_Outline_Get_CBox
      FT_Outline_EmboldenFT_Outline_Get_Bitmap
      FT_Outline_ReverseFT_Outline_Render
      FT_Outline_CheckFT_Orientation
      FT_Outline_Get_BBoxFT_Outline_Get_Orientation
      ft_outline_flags


      + +
      +

      This section contains routines used to create and destroy scalable glyph images known as ‘outlines’. These can also be measured, transformed, and converted into bitmaps and pixmaps.

      +

      +
      +

      FT_Outline

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef struct  FT_Outline_
      +  {
      +    short       n_contours;      /* number of contours in glyph        */
      +    short       n_points;        /* number of points in the glyph      */
      +
      +    FT_Vector*  points;          /* the outline's points               */
      +    char*       tags;            /* the points flags                   */
      +    short*      contours;        /* the contour end points             */
      +
      +    int         flags;           /* outline masks                      */
      +
      +  } FT_Outline;
      +
      +

      +
      +

      This structure is used to describe an outline to the scan-line converter.

      +

      +
      fields
      +

      + + + + + + + +
      n_contours +

      The number of contours in the outline.

      +
      n_points +

      The number of points in the outline.

      +
      points +

      A pointer to an array of ‘n_points’ FT_Vector elements, giving the outline's point coordinates.

      +
      tags +

      A pointer to an array of ‘n_points’ chars, giving each outline point's type. If bit 0 is unset, the point is ‘off’ the curve, i.e., a Bézier control point, while it is ‘on’ when set.

      +

      Bit 1 is meaningful for ‘off’ points only. If set, it indicates a third-order Bézier arc control point; and a second-order control point if unset.

      +
      contours +

      An array of ‘n_contours’ shorts, giving the end point of each contour within the outline. For example, the first contour is defined by the points ‘0’ to ‘contours[0]’, the second one is defined by the points ‘contours[0]+1’ to ‘contours[1]’, etc.

      +
      flags +

      A set of bit flags used to characterize the outline and give hints to the scan-converter and hinter on how to convert/grid-fit it. See FT_OUTLINE_FLAGS.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_OUTLINE_FLAGS

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +#define FT_OUTLINE_NONE             0x0
      +#define FT_OUTLINE_OWNER            0x1
      +#define FT_OUTLINE_EVEN_ODD_FILL    0x2
      +#define FT_OUTLINE_REVERSE_FILL     0x4
      +#define FT_OUTLINE_IGNORE_DROPOUTS  0x8
      +#define FT_OUTLINE_SMART_DROPOUTS   0x10
      +#define FT_OUTLINE_INCLUDE_STUBS    0x20
      +
      +#define FT_OUTLINE_HIGH_PRECISION   0x100
      +#define FT_OUTLINE_SINGLE_PASS      0x200
      +
      +

      +
      +

      A list of bit-field constants use for the flags in an outline's ‘flags’ field.

      +

      +
      values
      +

      + + + + + + + + + + + + + + + + +
      FT_OUTLINE_NONE +

      Value 0 is reserved.

      +
      FT_OUTLINE_OWNER +

      If set, this flag indicates that the outline's field arrays (i.e., ‘points’, ‘flags’, and ‘contours’) are ‘owned’ by the outline object, and should thus be freed when it is destroyed.

      +
      FT_OUTLINE_EVEN_ODD_FILL
      +

      By default, outlines are filled using the non-zero winding rule. If set to 1, the outline will be filled using the even-odd fill rule (only works with the smooth raster).

      +
      FT_OUTLINE_REVERSE_FILL
      +

      By default, outside contours of an outline are oriented in clock-wise direction, as defined in the TrueType specification. This flag is set if the outline uses the opposite direction (typically for Type 1 fonts). This flag is ignored by the scan converter.

      +
      FT_OUTLINE_IGNORE_DROPOUTS
      +

      By default, the scan converter will try to detect drop-outs in an outline and correct the glyph bitmap to ensure consistent shape continuity. If set, this flag hints the scan-line converter to ignore such cases.

      +
      FT_OUTLINE_SMART_DROPOUTS
      +

      Select smart dropout control. If unset, use simple dropout control. Ignored if FT_OUTLINE_IGNORE_DROPOUTS is set.

      +
      FT_OUTLINE_INCLUDE_STUBS
      +

      If set, turn pixels on for ‘stubs’, otherwise exclude them. Ignored if FT_OUTLINE_IGNORE_DROPOUTS is set.

      +
      FT_OUTLINE_HIGH_PRECISION
      +

      This flag indicates that the scan-line converter should try to convert this outline to bitmaps with the highest possible quality. It is typically set for small character sizes. Note that this is only a hint that might be completely ignored by a given scan-converter.

      +
      FT_OUTLINE_SINGLE_PASS +

      This flag is set to force a given scan-converter to only use a single pass over the outline to render a bitmap glyph image. Normally, it is set for very large character sizes. It is only a hint that might be completely ignored by a given scan-converter.

      +
      +
      +
      note
      +

      Please refer to the description of the ‘SCANTYPE’ instruction in the OpenType specification (in file ‘ttinst1.doc’) how simple drop-outs, smart drop-outs, and stubs are defined.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_New

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_New( FT_Library   library,
      +                  FT_UInt      numPoints,
      +                  FT_Int       numContours,
      +                  FT_Outline  *anoutline );
      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_New_Internal( FT_Memory    memory,
      +                           FT_UInt      numPoints,
      +                           FT_Int       numContours,
      +                           FT_Outline  *anoutline );
      +
      +

      +
      +

      Create a new outline of a given size.

      +

      +
      input
      +

      + + + + +
      library +

      A handle to the library object from where the outline is allocated. Note however that the new outline will not necessarily be freed, when destroying the library, by FT_Done_FreeType.

      +
      numPoints +

      The maximal number of points within the outline.

      +
      numContours +

      The maximal number of contours within the outline.

      +
      +
      +
      output
      +

      + + +
      anoutline +

      A handle to the new outline.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The reason why this function takes a ‘library’ parameter is simply to use the library's memory allocator.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Done

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Done( FT_Library   library,
      +                   FT_Outline*  outline );
      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Done_Internal( FT_Memory    memory,
      +                            FT_Outline*  outline );
      +
      +

      +
      +

      Destroy an outline created with FT_Outline_New.

      +

      +
      input
      +

      + + + +
      library +

      A handle of the library object used to allocate the outline.

      +
      outline +

      A pointer to the outline object to be discarded.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      If the outline's ‘owner’ field is not set, only the outline descriptor will be released.

      +

      The reason why this function takes an ‘library’ parameter is simply to use ft_mem_free().

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Copy

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Copy( const FT_Outline*  source,
      +                   FT_Outline        *target );
      +
      +

      +
      +

      Copy an outline into another one. Both objects must have the same sizes (number of points & number of contours) when this function is called.

      +

      +
      input
      +

      + + +
      source +

      A handle to the source outline.

      +
      +
      +
      output
      +

      + + +
      target +

      A handle to the target outline.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Translate

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Outline_Translate( const FT_Outline*  outline,
      +                        FT_Pos             xOffset,
      +                        FT_Pos             yOffset );
      +
      +

      +
      +

      Apply a simple translation to the points of an outline.

      +

      +
      inout
      +

      + + +
      outline +

      A pointer to the target outline descriptor.

      +
      +
      +
      input
      +

      + + + +
      xOffset +

      The horizontal offset.

      +
      yOffset +

      The vertical offset.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Transform

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Outline_Transform( const FT_Outline*  outline,
      +                        const FT_Matrix*   matrix );
      +
      +

      +
      +

      Apply a simple 2x2 matrix to all of an outline's points. Useful for applying rotations, slanting, flipping, etc.

      +

      +
      inout
      +

      + + +
      outline +

      A pointer to the target outline descriptor.

      +
      +
      +
      input
      +

      + + +
      matrix +

      A pointer to the transformation matrix.

      +
      +
      +
      note
      +

      You can use FT_Outline_Translate if you need to translate the outline's points.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Embolden

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Embolden( FT_Outline*  outline,
      +                       FT_Pos       strength );
      +
      +

      +
      +

      Embolden an outline. The new outline will be at most 4 times ‘strength’ pixels wider and higher. You may think of the left and bottom borders as unchanged.

      +

      Negative ‘strength’ values to reduce the outline thickness are possible also.

      +

      +
      inout
      +

      + + +
      outline +

      A handle to the target outline.

      +
      +
      +
      input
      +

      + + +
      strength +

      How strong the glyph is emboldened. Expressed in 26.6 pixel format.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The used algorithm to increase or decrease the thickness of the glyph doesn't change the number of points; this means that certain situations like acute angles or intersections are sometimes handled incorrectly.

      +

      If you need ‘better’ metrics values you should call FT_Outline_Get_CBox ot FT_Outline_Get_BBox.

      +

      Example call:

      +
      +  FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   
      +  if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             
      +    FT_Outline_Embolden( &face->slot->outline, strength );         
      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Reverse

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Outline_Reverse( FT_Outline*  outline );
      +
      +

      +
      +

      Reverse the drawing direction of an outline. This is used to ensure consistent fill conventions for mirrored glyphs.

      +

      +
      inout
      +

      + + +
      outline +

      A pointer to the target outline descriptor.

      +
      +
      +
      note
      +

      This function toggles the bit flag FT_OUTLINE_REVERSE_FILL in the outline's ‘flags’ field.

      +

      It shouldn't be used by a normal client application, unless it knows what it is doing.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Check

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Check( FT_Outline*  outline );
      +
      +

      +
      +

      Check the contents of an outline descriptor.

      +

      +
      input
      +

      + + +
      outline +

      A handle to a source outline.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Get_BBox

      +
      +Defined in FT_BBOX_H (freetype/ftbbox.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Get_BBox( FT_Outline*  outline,
      +                       FT_BBox     *abbox );
      +
      +

      +
      +

      Compute the exact bounding box of an outline. This is slower than computing the control box. However, it uses an advanced algorithm which returns very quickly when the two boxes coincide. Otherwise, the outline Bézier arcs are traversed to extract their extrema.

      +

      +
      input
      +

      + + +
      outline +

      A pointer to the source outline.

      +
      +
      +
      output
      +

      + + +
      abbox +

      The outline's exact bounding box.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      ft_outline_flags

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +#define ft_outline_none             FT_OUTLINE_NONE
      +#define ft_outline_owner            FT_OUTLINE_OWNER
      +#define ft_outline_even_odd_fill    FT_OUTLINE_EVEN_ODD_FILL
      +#define ft_outline_reverse_fill     FT_OUTLINE_REVERSE_FILL
      +#define ft_outline_ignore_dropouts  FT_OUTLINE_IGNORE_DROPOUTS
      +#define ft_outline_high_precision   FT_OUTLINE_HIGH_PRECISION
      +#define ft_outline_single_pass      FT_OUTLINE_SINGLE_PASS
      +
      +

      +
      +

      These constants are deprecated. Please use the corresponding FT_OUTLINE_FLAGS values.

      +

      +
      values
      +

      + + + + + + + + + + + + +
      ft_outline_none +

      See FT_OUTLINE_NONE.

      +
      ft_outline_owner +

      See FT_OUTLINE_OWNER.

      +
      ft_outline_even_odd_fill
      +

      See FT_OUTLINE_EVEN_ODD_FILL.

      +
      ft_outline_reverse_fill
      +

      See FT_OUTLINE_REVERSE_FILL.

      +
      ft_outline_ignore_dropouts
      +

      See FT_OUTLINE_IGNORE_DROPOUTS.

      +
      ft_outline_high_precision
      +

      See FT_OUTLINE_HIGH_PRECISION.

      +
      ft_outline_single_pass +

      See FT_OUTLINE_SINGLE_PASS.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_MoveToFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef int
      +  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,
      +                            void*             user );
      +
      +#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc
      +
      +

      +
      +

      A function pointer type used to describe the signature of a ‘move to’ function during outline walking/decomposition.

      +

      A ‘move to’ is emitted to start a new contour in an outline.

      +

      +
      input
      +

      + + + +
      to +

      A pointer to the target point of the ‘move to’.

      +
      user +

      A typeless pointer which is passed from the caller of the decomposition function.

      +
      +
      +
      return
      +

      Error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_LineToFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef int
      +  (*FT_Outline_LineToFunc)( const FT_Vector*  to,
      +                            void*             user );
      +
      +#define FT_Outline_LineTo_Func  FT_Outline_LineToFunc
      +
      +

      +
      +

      A function pointer type used to describe the signature of a ‘line to’ function during outline walking/decomposition.

      +

      A ‘line to’ is emitted to indicate a segment in the outline.

      +

      +
      input
      +

      + + + +
      to +

      A pointer to the target point of the ‘line to’.

      +
      user +

      A typeless pointer which is passed from the caller of the decomposition function.

      +
      +
      +
      return
      +

      Error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_ConicToFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef int
      +  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,
      +                             const FT_Vector*  to,
      +                             void*             user );
      +
      +#define FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc
      +
      +

      +
      +

      A function pointer type use to describe the signature of a ‘conic to’ function during outline walking/decomposition.

      +

      A ‘conic to’ is emitted to indicate a second-order Bézier arc in the outline.

      +

      +
      input
      +

      + + + + +
      control +

      An intermediate control point between the last position and the new target in ‘to’.

      +
      to +

      A pointer to the target end point of the conic arc.

      +
      user +

      A typeless pointer which is passed from the caller of the decomposition function.

      +
      +
      +
      return
      +

      Error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_CubicToFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef int
      +  (*FT_Outline_CubicToFunc)( const FT_Vector*  control1,
      +                             const FT_Vector*  control2,
      +                             const FT_Vector*  to,
      +                             void*             user );
      +
      +#define FT_Outline_CubicTo_Func  FT_Outline_CubicToFunc
      +
      +

      +
      +

      A function pointer type used to describe the signature of a ‘cubic to’ function during outline walking/decomposition.

      +

      A ‘cubic to’ is emitted to indicate a third-order Bézier arc.

      +

      +
      input
      +

      + + + + + +
      control1 +

      A pointer to the first Bézier control point.

      +
      control2 +

      A pointer to the second Bézier control point.

      +
      to +

      A pointer to the target end point.

      +
      user +

      A typeless pointer which is passed from the caller of the decomposition function.

      +
      +
      +
      return
      +

      Error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Funcs

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef struct  FT_Outline_Funcs_
      +  {
      +    FT_Outline_MoveToFunc   move_to;
      +    FT_Outline_LineToFunc   line_to;
      +    FT_Outline_ConicToFunc  conic_to;
      +    FT_Outline_CubicToFunc  cubic_to;
      +
      +    int                     shift;
      +    FT_Pos                  delta;
      +
      +  } FT_Outline_Funcs;
      +
      +

      +
      +

      A structure to hold various function pointers used during outline decomposition in order to emit segments, conic, and cubic Béziers, as well as ‘move to’ and ‘close to’ operations.

      +

      +
      fields
      +

      + + + + + + + +
      move_to +

      The ‘move to’ emitter.

      +
      line_to +

      The segment emitter.

      +
      conic_to +

      The second-order Bézier arc emitter.

      +
      cubic_to +

      The third-order Bézier arc emitter.

      +
      shift +

      The shift that is applied to coordinates before they are sent to the emitter.

      +
      delta +

      The delta that is applied to coordinates before they are sent to the emitter, but after the shift.

      +
      +
      +
      note
      +

      The point coordinates sent to the emitters are the transformed version of the original coordinates (this is important for high accuracy during scan-conversion). The transformation is simple:

      +
      +  x' = (x << shift) - delta                                        
      +  y' = (x << shift) - delta                                        
      +
      +

      Set the value of ‘shift’ and ‘delta’ to 0 to get the original point coordinates.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Decompose

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Decompose( FT_Outline*              outline,
      +                        const FT_Outline_Funcs*  func_interface,
      +                        void*                    user );
      +
      +

      +
      +

      Walk over an outline's structure to decompose it into individual segments and Bézier arcs. This function is also able to emit ‘move to’ and ‘close to’ operations to indicate the start and end of new contours in the outline.

      +

      +
      input
      +

      + + + +
      outline +

      A pointer to the source target.

      +
      func_interface +

      A table of ‘emitters’, i.e., function pointers called during decomposition to indicate path operations.

      +
      +
      +
      inout
      +

      + + +
      user +

      A typeless pointer which is passed to each emitter during the decomposition. It can be used to store the state during the decomposition.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Get_CBox

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Outline_Get_CBox( const FT_Outline*  outline,
      +                       FT_BBox           *acbox );
      +
      +

      +
      +

      Return an outline's ‘control box’. The control box encloses all the outline's points, including Bézier control points. Though it coincides with the exact bounding box for most glyphs, it can be slightly larger in some situations (like when rotating an outline which contains Bézier outside arcs).

      +

      Computing the control box is very fast, while getting the bounding box can take much more time as it needs to walk over all segments and arcs in the outline. To get the latter, you can use the ‘ftbbox’ component which is dedicated to this single task.

      +

      +
      input
      +

      + + +
      outline +

      A pointer to the source outline descriptor.

      +
      +
      +
      output
      +

      + + +
      acbox +

      The outline's control box.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Get_Bitmap

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Get_Bitmap( FT_Library        library,
      +                         FT_Outline*       outline,
      +                         const FT_Bitmap  *abitmap );
      +
      +

      +
      +

      Render an outline within a bitmap. The outline's image is simply OR-ed to the target bitmap.

      +

      +
      input
      +

      + + + +
      library +

      A handle to a FreeType library object.

      +
      outline +

      A pointer to the source outline descriptor.

      +
      +
      +
      inout
      +

      + + +
      abitmap +

      A pointer to the target bitmap descriptor.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function does NOT CREATE the bitmap, it only renders an outline image within the one you pass to it! Consequently, the various fields in ‘abitmap’ should be set accordingly.

      +

      It will use the raster corresponding to the default glyph format.

      +

      The value of the ‘num_grays’ field in ‘abitmap’ is ignored. If you select the gray-level rasterizer, and you want less than 256 gray levels, you have to use FT_Outline_Render directly.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Render

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Outline_Render( FT_Library         library,
      +                     FT_Outline*        outline,
      +                     FT_Raster_Params*  params );
      +
      +

      +
      +

      Render an outline within a bitmap using the current scan-convert. This function uses an FT_Raster_Params structure as an argument, allowing advanced features like direct composition, translucency, etc.

      +

      +
      input
      +

      + + + +
      library +

      A handle to a FreeType library object.

      +
      outline +

      A pointer to the source outline descriptor.

      +
      +
      +
      inout
      +

      + + +
      params +

      A pointer to an FT_Raster_Params structure used to describe the rendering operation.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      You should know what you are doing and how FT_Raster_Params works to use this function.

      +

      The field ‘params.source’ will be set to ‘outline’ before the scan converter is called, which means that the value you give to it is actually ignored.

      +

      The gray-level rasterizer always uses 256 gray levels. If you want less gray levels, you have to provide your own span callback. See the FT_RASTER_FLAG_DIRECT value of the ‘flags’ field in the FT_Raster_Params structure for more details.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Orientation

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  typedef enum  FT_Orientation_
      +  {
      +    FT_ORIENTATION_TRUETYPE   = 0,
      +    FT_ORIENTATION_POSTSCRIPT = 1,
      +    FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
      +    FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,
      +    FT_ORIENTATION_NONE
      +
      +  } FT_Orientation;
      +
      +

      +
      +

      A list of values used to describe an outline's contour orientation.

      +

      The TrueType and PostScript specifications use different conventions to determine whether outline contours should be filled or unfilled.

      +

      +
      values
      +

      + + + + + + + + + + +
      FT_ORIENTATION_TRUETYPE
      +

      According to the TrueType specification, clockwise contours must be filled, and counter-clockwise ones must be unfilled.

      +
      FT_ORIENTATION_POSTSCRIPT
      +

      According to the PostScript specification, counter-clockwise contours must be filled, and clockwise ones must be unfilled.

      +
      FT_ORIENTATION_FILL_RIGHT
      +

      This is identical to FT_ORIENTATION_TRUETYPE, but is used to remember that in TrueType, everything that is to the right of the drawing direction of a contour must be filled.

      +
      FT_ORIENTATION_FILL_LEFT
      +

      This is identical to FT_ORIENTATION_POSTSCRIPT, but is used to remember that in PostScript, everything that is to the left of the drawing direction of a contour must be filled.

      +
      FT_ORIENTATION_NONE +

      The orientation cannot be determined. That is, different parts of the glyph have different orientation.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Outline_Get_Orientation

      +
      +Defined in FT_OUTLINE_H (freetype/ftoutln.h). +

      +
      +
      +  FT_EXPORT( FT_Orientation )
      +  FT_Outline_Get_Orientation( FT_Outline*  outline );
      +
      +

      +
      +

      This function analyzes a glyph outline and tries to compute its fill orientation (see FT_Orientation). This is done by computing the direction of each global horizontal and/or vertical extrema within the outline.

      +

      Note that this will return FT_ORIENTATION_TRUETYPE for empty outlines.

      +

      +
      input
      +

      + + +
      outline +

      A handle to the source outline.

      +
      +
      +
      return
      +

      The orientation.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-pfr_fonts.html b/src/3rdparty/freetype/docs/reference/ft2-pfr_fonts.html new file mode 100644 index 0000000000..8edf34ea96 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-pfr_fonts.html @@ -0,0 +1,206 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +PFR Fonts +

      +

      Synopsis

      + + +
      FT_Get_PFR_MetricsFT_Get_PFR_KerningFT_Get_PFR_Advance


      + +
      +

      This section contains the declaration of PFR-specific functions.

      +

      +
      +

      FT_Get_PFR_Metrics

      +
      +Defined in FT_PFR_H (freetype/ftpfr.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_PFR_Metrics( FT_Face    face,
      +                      FT_UInt   *aoutline_resolution,
      +                      FT_UInt   *ametrics_resolution,
      +                      FT_Fixed  *ametrics_x_scale,
      +                      FT_Fixed  *ametrics_y_scale );
      +
      +

      +
      +

      Return the outline and metrics resolutions of a given PFR face.

      +

      +
      input
      +

      + + +
      face +

      Handle to the input face. It can be a non-PFR face.

      +
      +
      +
      output
      +

      + + + + + +
      aoutline_resolution +

      Outline resolution. This is equivalent to ‘face->units_per_EM’ for non-PFR fonts. Optional (parameter can be NULL).

      +
      ametrics_resolution +

      Metrics resolution. This is equivalent to ‘outline_resolution’ for non-PFR fonts. Optional (parameter can be NULL).

      +
      ametrics_x_scale +

      A 16.16 fixed-point number used to scale distance expressed in metrics units to device sub-pixels. This is equivalent to ‘face->size->x_scale’, but for metrics only. Optional (parameter can be NULL).

      +
      ametrics_y_scale +

      Same as ‘ametrics_x_scale’ but for the vertical direction. optional (parameter can be NULL).

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      If the input face is not a PFR, this function will return an error. However, in all cases, it will return valid values.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_PFR_Kerning

      +
      +Defined in FT_PFR_H (freetype/ftpfr.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_PFR_Kerning( FT_Face     face,
      +                      FT_UInt     left,
      +                      FT_UInt     right,
      +                      FT_Vector  *avector );
      +
      +

      +
      +

      Return the kerning pair corresponding to two glyphs in a PFR face. The distance is expressed in metrics units, unlike the result of FT_Get_Kerning.

      +

      +
      input
      +

      + + + + +
      face +

      A handle to the input face.

      +
      left +

      Index of the left glyph.

      +
      right +

      Index of the right glyph.

      +
      +
      +
      output
      +

      + + +
      avector +

      A kerning vector.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function always return distances in original PFR metrics units. This is unlike FT_Get_Kerning with the FT_KERNING_UNSCALED mode, which always returns distances converted to outline units.

      +

      You can use the value of the ‘x_scale’ and ‘y_scale’ parameters returned by FT_Get_PFR_Metrics to scale these to device sub-pixels.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_PFR_Advance

      +
      +Defined in FT_PFR_H (freetype/ftpfr.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_PFR_Advance( FT_Face   face,
      +                      FT_UInt   gindex,
      +                      FT_Pos   *aadvance );
      +
      +

      +
      +

      Return a given glyph advance, expressed in original metrics units, from a PFR font.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the input face.

      +
      gindex +

      The glyph index.

      +
      +
      +
      output
      +

      + + +
      aadvance +

      The glyph advance in metrics units.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      You can use the ‘x_scale’ or ‘y_scale’ results of FT_Get_PFR_Metrics to convert the advance to device sub-pixels (i.e., 1/64th of pixels).

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-quick_advance.html b/src/3rdparty/freetype/docs/reference/ft2-quick_advance.html new file mode 100644 index 0000000000..c832d437cf --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-quick_advance.html @@ -0,0 +1,177 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Quick retrieval of advance values +

      +

      Synopsis

      + + + +
      FT_ADVANCE_FLAG_FAST_ONLYFT_Get_Advances
      FT_Get_Advance


      + +
      +

      This section contains functions to quickly extract advance values without handling glyph outlines, if possible.

      +

      +
      +

      FT_ADVANCE_FLAG_FAST_ONLY

      +
      +

      A bit-flag to be OR-ed with the ‘flags’ parameter of the FT_Get_Advance and FT_Get_Advances functions.

      +

      If set, it indicates that you want these functions to fail if the corresponding hinting mode or font driver doesn't allow for very quick advance computation.

      +

      Typically, glyphs which are either unscaled, unhinted, bitmapped, or light-hinted can have their advance width computed very quickly.

      +

      Normal and bytecode hinted modes, which require loading, scaling, and hinting of the glyph outline, are extremely slow by comparison.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Advance

      +
      +Defined in FT_ADVANCES_H (freetype/ftadvanc.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_Advance( FT_Face    face,
      +                  FT_UInt    gindex,
      +                  FT_Int32   load_flags,
      +                  FT_Fixed  *padvance );
      +
      +

      +
      +

      Retrieve the advance value of a given glyph outline in an FT_Face. By default, the unhinted advance is returned in font units.

      +

      +
      input
      +

      + + + + +
      face +

      The source FT_Face handle.

      +
      gindex +

      The glyph index.

      +
      load_flags +

      A set of bit flags similar to those used when calling FT_Load_Glyph, used to determine what kind of advances you need.

      +
      +
      +
      output
      +

      + + +
      padvance +

      The advance value, in either font units or 16.16 format.

      +

      If FT_LOAD_VERTICAL_LAYOUT is set, this is the vertical advance corresponding to a vertical layout. Otherwise, it is the horizontal advance in a horizontal layout.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function may fail if you use FT_ADVANCE_FLAG_FAST_ONLY and if the corresponding font backend doesn't have a quick way to retrieve the advances.

      +

      A scaled advance is returned in 16.16 format but isn't transformed by the affine transformation specified by FT_Set_Transform.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Advances

      +
      +Defined in FT_ADVANCES_H (freetype/ftadvanc.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_Advances( FT_Face    face,
      +                   FT_UInt    start,
      +                   FT_UInt    count,
      +                   FT_Int32   load_flags,
      +                   FT_Fixed  *padvances );
      +
      +

      +
      +

      Retrieve the advance values of several glyph outlines in an FT_Face. By default, the unhinted advances are returned in font units.

      +

      +
      input
      +

      + + + + + +
      face +

      The source FT_Face handle.

      +
      start +

      The first glyph index.

      +
      count +

      The number of advance values you want to retrieve.

      +
      load_flags +

      A set of bit flags similar to those used when calling FT_Load_Glyph.

      +
      +
      +
      output
      +

      + + +
      padvance +

      The advances, in either font units or 16.16 format. This array must contain at least ‘count’ elements.

      +

      If FT_LOAD_VERTICAL_LAYOUT is set, these are the vertical advances corresponding to a vertical layout. Otherwise, they are the horizontal advances in a horizontal layout.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function may fail if you use FT_ADVANCE_FLAG_FAST_ONLY and if the corresponding font backend doesn't have a quick way to retrieve the advances.

      +

      Scaled advances are returned in 16.16 format but aren't transformed by the affine transformation specified by FT_Set_Transform.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-raster.html b/src/3rdparty/freetype/docs/reference/ft2-raster.html new file mode 100644 index 0000000000..9840eb4492 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-raster.html @@ -0,0 +1,598 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Scanline Converter +

      +

      Synopsis

      + + + + + + +
      FT_RasterFT_RASTER_FLAG_XXXFT_Raster_SetModeFunc
      FT_SpanFT_Raster_ParamsFT_Raster_RenderFunc
      FT_SpanFuncFT_Raster_NewFuncFT_Raster_Funcs
      FT_Raster_BitTest_FuncFT_Raster_DoneFunc
      FT_Raster_BitSet_FuncFT_Raster_ResetFunc


      + +
      +

      This section contains technical definitions.

      +

      +
      +

      FT_Raster

      +
      +

      A handle (pointer) to a raster object. Each object can be used independently to convert an outline into a bitmap or pixmap.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Span

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef struct  FT_Span_
      +  {
      +    short           x;
      +    unsigned short  len;
      +    unsigned char   coverage;
      +
      +  } FT_Span;
      +
      +

      +
      +

      A structure used to model a single span of gray (or black) pixels when rendering a monochrome or anti-aliased bitmap.

      +

      +
      fields
      +

      + + + + +
      x +

      The span's horizontal start position.

      +
      len +

      The span's length in pixels.

      +
      coverage +

      The span color/coverage, ranging from 0 (background) to 255 (foreground). Only used for anti-aliased rendering.

      +
      +
      +
      note
      +

      This structure is used by the span drawing callback type named FT_SpanFunc which takes the y coordinate of the span as a a parameter.

      +

      The coverage value is always between 0 and 255. If you want less gray values, the callback function has to reduce them.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_SpanFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef void
      +  (*FT_SpanFunc)( int             y,
      +                  int             count,
      +                  const FT_Span*  spans,
      +                  void*           user );
      +
      +#define FT_Raster_Span_Func  FT_SpanFunc
      +
      +

      +
      +

      A function used as a call-back by the anti-aliased renderer in order to let client applications draw themselves the gray pixel spans on each scan line.

      +

      +
      input
      +

      + + + + + +
      y +

      The scanline's y coordinate.

      +
      count +

      The number of spans to draw on this scanline.

      +
      spans +

      A table of ‘count’ spans to draw on the scanline.

      +
      user +

      User-supplied data that is passed to the callback.

      +
      +
      +
      note
      +

      This callback allows client applications to directly render the gray spans of the anti-aliased bitmap to any kind of surfaces.

      +

      This can be used to write anti-aliased outlines directly to a given background bitmap, and even perform translucency.

      +

      Note that the ‘count’ field cannot be greater than a fixed value defined by the ‘FT_MAX_GRAY_SPANS’ configuration macro in ‘ftoption.h’. By default, this value is set to 32, which means that if there are more than 32 spans on a given scanline, the callback is called several times with the same ‘y’ parameter in order to draw all callbacks.

      +

      Otherwise, the callback is only called once per scan-line, and only for those scanlines that do have ‘gray’ pixels on them.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_BitTest_Func

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef int
      +  (*FT_Raster_BitTest_Func)( int    y,
      +                             int    x,
      +                             void*  user );
      +
      +

      +
      +

      THIS TYPE IS DEPRECATED. DO NOT USE IT.

      +

      A function used as a call-back by the monochrome scan-converter to test whether a given target pixel is already set to the drawing ‘color’. These tests are crucial to implement drop-out control per-se the TrueType spec.

      +

      +
      input
      +

      + + + + +
      y +

      The pixel's y coordinate.

      +
      x +

      The pixel's x coordinate.

      +
      user +

      User-supplied data that is passed to the callback.

      +
      +
      +
      return
      +

      1 if the pixel is ‘set’, 0 otherwise.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_BitSet_Func

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef void
      +  (*FT_Raster_BitSet_Func)( int    y,
      +                            int    x,
      +                            void*  user );
      +
      +

      +
      +

      THIS TYPE IS DEPRECATED. DO NOT USE IT.

      +

      A function used as a call-back by the monochrome scan-converter to set an individual target pixel. This is crucial to implement drop-out control according to the TrueType specification.

      +

      +
      input
      +

      + + + + +
      y +

      The pixel's y coordinate.

      +
      x +

      The pixel's x coordinate.

      +
      user +

      User-supplied data that is passed to the callback.

      +
      +
      +
      return
      +

      1 if the pixel is ‘set’, 0 otherwise.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_RASTER_FLAG_XXX

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +#define FT_RASTER_FLAG_DEFAULT  0x0
      +#define FT_RASTER_FLAG_AA       0x1
      +#define FT_RASTER_FLAG_DIRECT   0x2
      +#define FT_RASTER_FLAG_CLIP     0x4
      +
      +  /* deprecated */
      +#define ft_raster_flag_default  FT_RASTER_FLAG_DEFAULT
      +#define ft_raster_flag_aa       FT_RASTER_FLAG_AA
      +#define ft_raster_flag_direct   FT_RASTER_FLAG_DIRECT
      +#define ft_raster_flag_clip     FT_RASTER_FLAG_CLIP
      +
      +

      +
      +

      A list of bit flag constants as used in the ‘flags’ field of a FT_Raster_Params structure.

      +

      +
      values
      +

      + + + + + +
      FT_RASTER_FLAG_DEFAULT +

      This value is 0.

      +
      FT_RASTER_FLAG_AA +

      This flag is set to indicate that an anti-aliased glyph image should be generated. Otherwise, it will be monochrome (1-bit).

      +
      FT_RASTER_FLAG_DIRECT +

      This flag is set to indicate direct rendering. In this mode, client applications must provide their own span callback. This lets them directly draw or compose over an existing bitmap. If this bit is not set, the target pixmap's buffer must be zeroed before rendering.

      +

      Note that for now, direct rendering is only possible with anti-aliased glyphs.

      +
      FT_RASTER_FLAG_CLIP +

      This flag is only used in direct rendering mode. If set, the output will be clipped to a box specified in the ‘clip_box’ field of the FT_Raster_Params structure.

      +

      Note that by default, the glyph bitmap is clipped to the target pixmap, except in direct rendering mode where all spans are generated if no clipping box is set.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_Params

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef struct  FT_Raster_Params_
      +  {
      +    const FT_Bitmap*        target;
      +    const void*             source;
      +    int                     flags;
      +    FT_SpanFunc             gray_spans;
      +    FT_SpanFunc             black_spans;
      +    FT_Raster_BitTest_Func  bit_test;     /* doesn't work! */
      +    FT_Raster_BitSet_Func   bit_set;      /* doesn't work! */
      +    void*                   user;
      +    FT_BBox                 clip_box;
      +
      +  } FT_Raster_Params;
      +
      +

      +
      +

      A structure to hold the arguments used by a raster's render function.

      +

      +
      fields
      +

      + + + + + + + + + + +
      target +

      The target bitmap.

      +
      source +

      A pointer to the source glyph image (e.g., an FT_Outline).

      +
      flags +

      The rendering flags.

      +
      gray_spans +

      The gray span drawing callback.

      +
      black_spans +

      The black span drawing callback.

      +
      bit_test +

      The bit test callback. UNIMPLEMENTED!

      +
      bit_set +

      The bit set callback. UNIMPLEMENTED!

      +
      user +

      User-supplied data that is passed to each drawing callback.

      +
      clip_box +

      An optional clipping box. It is only used in direct rendering mode. Note that coordinates here should be expressed in integer pixels (and not in 26.6 fixed-point units).

      +
      +
      +
      note
      +

      An anti-aliased glyph bitmap is drawn if the FT_RASTER_FLAG_AA bit flag is set in the ‘flags’ field, otherwise a monochrome bitmap is generated.

      +

      If the FT_RASTER_FLAG_DIRECT bit flag is set in ‘flags’, the raster will call the ‘gray_spans’ callback to draw gray pixel spans, in the case of an aa glyph bitmap, it will call ‘black_spans’, and ‘bit_test’ and ‘bit_set’ in the case of a monochrome bitmap. This allows direct composition over a pre-existing bitmap through user-provided callbacks to perform the span drawing/composition.

      +

      Note that the ‘bit_test’ and ‘bit_set’ callbacks are required when rendering a monochrome bitmap, as they are crucial to implement correct drop-out control as defined in the TrueType specification.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_NewFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef int
      +  (*FT_Raster_NewFunc)( void*       memory,
      +                        FT_Raster*  raster );
      +
      +#define FT_Raster_New_Func  FT_Raster_NewFunc
      +
      +

      +
      +

      A function used to create a new raster object.

      +

      +
      input
      +

      + + +
      memory +

      A handle to the memory allocator.

      +
      +
      +
      output
      +

      + + +
      raster +

      A handle to the new raster object.

      +
      +
      +
      return
      +

      Error code. 0 means success.

      +
      +
      note
      +

      The ‘memory’ parameter is a typeless pointer in order to avoid un-wanted dependencies on the rest of the FreeType code. In practice, it is an FT_Memory object, i.e., a handle to the standard FreeType memory allocator. However, this field can be completely ignored by a given raster implementation.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_DoneFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef void
      +  (*FT_Raster_DoneFunc)( FT_Raster  raster );
      +
      +#define FT_Raster_Done_Func  FT_Raster_DoneFunc
      +
      +

      +
      +

      A function used to destroy a given raster object.

      +

      +
      input
      +

      + + +
      raster +

      A handle to the raster object.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_ResetFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef void
      +  (*FT_Raster_ResetFunc)( FT_Raster       raster,
      +                          unsigned char*  pool_base,
      +                          unsigned long   pool_size );
      +
      +#define FT_Raster_Reset_Func  FT_Raster_ResetFunc
      +
      +

      +
      +

      FreeType provides an area of memory called the ‘render pool’, available to all registered rasters. This pool can be freely used during a given scan-conversion but is shared by all rasters. Its content is thus transient.

      +

      This function is called each time the render pool changes, or just after a new raster object is created.

      +

      +
      input
      +

      + + + + +
      raster +

      A handle to the new raster object.

      +
      pool_base +

      The address in memory of the render pool.

      +
      pool_size +

      The size in bytes of the render pool.

      +
      +
      +
      note
      +

      Rasters can ignore the render pool and rely on dynamic memory allocation if they want to (a handle to the memory allocator is passed to the raster constructor). However, this is not recommended for efficiency purposes.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_SetModeFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef int
      +  (*FT_Raster_SetModeFunc)( FT_Raster      raster,
      +                            unsigned long  mode,
      +                            void*          args );
      +
      +#define FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc
      +
      +

      +
      +

      This function is a generic facility to change modes or attributes in a given raster. This can be used for debugging purposes, or simply to allow implementation-specific ‘features’ in a given raster module.

      +

      +
      input
      +

      + + + + +
      raster +

      A handle to the new raster object.

      +
      mode +

      A 4-byte tag used to name the mode or property.

      +
      args +

      A pointer to the new mode/property to use.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_RenderFunc

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef int
      +  (*FT_Raster_RenderFunc)( FT_Raster                raster,
      +                           const FT_Raster_Params*  params );
      +
      +#define FT_Raster_Render_Func  FT_Raster_RenderFunc
      +
      +

      +
      +

      Invoke a given raster to scan-convert a given glyph image into a target bitmap.

      +

      +
      input
      +

      + + + +
      raster +

      A handle to the raster object.

      +
      params +

      A pointer to an FT_Raster_Params structure used to store the rendering parameters.

      +
      +
      +
      return
      +

      Error code. 0 means success.

      +
      +
      note
      +

      The exact format of the source image depends on the raster's glyph format defined in its FT_Raster_Funcs structure. It can be an FT_Outline or anything else in order to support a large array of glyph formats.

      +

      Note also that the render function can fail and return a ‘FT_Err_Unimplemented_Feature’ error code if the raster used does not support direct composition.

      +

      XXX: For now, the standard raster doesn't support direct composition but this should change for the final release (see the files ‘demos/src/ftgrays.c’ and ‘demos/src/ftgrays2.c’ for examples of distinct implementations which support direct composition).

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Raster_Funcs

      +
      +Defined in FT_IMAGE_H (freetype/ftimage.h). +

      +
      +
      +  typedef struct  FT_Raster_Funcs_
      +  {
      +    FT_Glyph_Format        glyph_format;
      +    FT_Raster_NewFunc      raster_new;
      +    FT_Raster_ResetFunc    raster_reset;
      +    FT_Raster_SetModeFunc  raster_set_mode;
      +    FT_Raster_RenderFunc   raster_render;
      +    FT_Raster_DoneFunc     raster_done;
      +
      +  } FT_Raster_Funcs;
      +
      +

      +
      +

      A structure used to describe a given raster class to the library.

      +

      +
      fields
      +

      + + + + + + +
      glyph_format +

      The supported glyph format for this raster.

      +
      raster_new +

      The raster constructor.

      +
      raster_reset +

      Used to reset the render pool within the raster.

      +
      raster_render +

      A function to render a glyph into a given bitmap.

      +
      raster_done +

      The raster destructor.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-sfnt_names.html b/src/3rdparty/freetype/docs/reference/ft2-sfnt_names.html new file mode 100644 index 0000000000..94cddd8786 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-sfnt_names.html @@ -0,0 +1,190 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +SFNT Names +

      +

      Synopsis

      + + +
      FT_SfntNameFT_Get_Sfnt_Name_CountFT_Get_Sfnt_Name


      + +
      +

      The TrueType and OpenType specifications allow the inclusion of a special ‘names table’ in font files. This table contains textual (and internationalized) information regarding the font, like family name, copyright, version, etc.

      +

      The definitions below are used to access them if available.

      +

      Note that this has nothing to do with glyph names!

      +

      +
      +

      FT_SfntName

      +
      +Defined in FT_SFNT_NAMES_H (freetype/ftsnames.h). +

      +
      +
      +  typedef struct  FT_SfntName_
      +  {
      +    FT_UShort  platform_id;
      +    FT_UShort  encoding_id;
      +    FT_UShort  language_id;
      +    FT_UShort  name_id;
      +
      +    FT_Byte*   string;      /* this string is *not* null-terminated! */
      +    FT_UInt    string_len;  /* in bytes */
      +
      +  } FT_SfntName;
      +
      +

      +
      +

      A structure used to model an SFNT ‘name’ table entry.

      +

      +
      fields
      +

      + + + + + + + +
      platform_id +

      The platform ID for ‘string’.

      +
      encoding_id +

      The encoding ID for ‘string’.

      +
      language_id +

      The language ID for ‘string’.

      +
      name_id +

      An identifier for ‘string’.

      +
      string +

      The ‘name’ string. Note that its format differs depending on the (platform,encoding) pair. It can be a Pascal String, a UTF-16 one, etc.

      +

      Generally speaking, the string is not zero-terminated. Please refer to the TrueType specification for details.

      +
      string_len +

      The length of ‘string’ in bytes.

      +
      +
      +
      note
      +

      Possible values for ‘platform_id’, ‘encoding_id’, ‘language_id’, and ‘name_id’ are given in the file ‘ttnameid.h’. For details please refer to the TrueType or OpenType specification.

      +

      See also TT_PLATFORM_XXX, TT_APPLE_ID_XXX, TT_MAC_ID_XXX, TT_ISO_ID_XXX, and TT_MS_ID_XXX.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Sfnt_Name_Count

      +
      +Defined in FT_SFNT_NAMES_H (freetype/ftsnames.h). +

      +
      +
      +  FT_EXPORT( FT_UInt )
      +  FT_Get_Sfnt_Name_Count( FT_Face  face );
      +
      +

      +
      +

      Retrieve the number of name strings in the SFNT ‘name’ table.

      +

      +
      input
      +

      + + +
      face +

      A handle to the source face.

      +
      +
      +
      return
      +

      The number of strings in the ‘name’ table.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Sfnt_Name

      +
      +Defined in FT_SFNT_NAMES_H (freetype/ftsnames.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_Sfnt_Name( FT_Face       face,
      +                    FT_UInt       idx,
      +                    FT_SfntName  *aname );
      +
      +

      +
      +

      Retrieve a string of the SFNT ‘name’ table for a given index.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the source face.

      +
      idx +

      The index of the ‘name’ string.

      +
      +
      +
      output
      +

      + + +
      aname +

      The indexed FT_SfntName structure.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The ‘string’ array returned in the ‘aname’ structure is not null-terminated.

      +

      Use FT_Get_Sfnt_Name_Count to get the total number of available ‘name’ table entries, then do a loop until you get the right platform, encoding, and name ID.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-sizes_management.html b/src/3rdparty/freetype/docs/reference/ft2-sizes_management.html new file mode 100644 index 0000000000..324e584c50 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-sizes_management.html @@ -0,0 +1,164 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Size Management +

      +

      Synopsis

      + + +
      FT_New_SizeFT_Done_SizeFT_Activate_Size


      + +
      +

      When creating a new face object (e.g., with FT_New_Face), an FT_Size object is automatically created and used to store all pixel-size dependent information, available in the ‘face->size’ field.

      +

      It is however possible to create more sizes for a given face, mostly in order to manage several character pixel sizes of the same font family and style. See FT_New_Size and FT_Done_Size.

      +

      Note that FT_Set_Pixel_Sizes and FT_Set_Char_Size only modify the contents of the current ‘active’ size; you thus need to use FT_Activate_Size to change it.

      +

      99% of applications won't need the functions provided here, especially if they use the caching sub-system, so be cautious when using these.

      +

      +
      +

      FT_New_Size

      +
      +Defined in FT_SIZES_H (freetype/ftsizes.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_New_Size( FT_Face   face,
      +               FT_Size*  size );
      +
      +

      +
      +

      Create a new size object from a given face object.

      +

      +
      input
      +

      + + +
      face +

      A handle to a parent face object.

      +
      +
      +
      output
      +

      + + +
      asize +

      A handle to a new size object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      You need to call FT_Activate_Size in order to select the new size for upcoming calls to FT_Set_Pixel_Sizes, FT_Set_Char_Size, FT_Load_Glyph, FT_Load_Char, etc.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Done_Size

      +
      +Defined in FT_SIZES_H (freetype/ftsizes.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Done_Size( FT_Size  size );
      +
      +

      +
      +

      Discard a given size object. Note that FT_Done_Face automatically discards all size objects allocated with FT_New_Size.

      +

      +
      input
      +

      + + +
      size +

      A handle to a target size object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Activate_Size

      +
      +Defined in FT_SIZES_H (freetype/ftsizes.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Activate_Size( FT_Size  size );
      +
      +

      +
      +

      Even though it is possible to create several size objects for a given face (see FT_New_Size for details), functions like FT_Load_Glyph or FT_Load_Char only use the one which has been activated last to determine the ‘current character pixel size’.

      +

      This function can be used to ‘activate’ a previously created size object.

      +

      +
      input
      +

      + + +
      size +

      A handle to a target size object.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      If ‘face’ is the size's parent face object, this function changes the value of ‘face->size’ to the input size handle.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-system_interface.html b/src/3rdparty/freetype/docs/reference/ft2-system_interface.html new file mode 100644 index 0000000000..809e2a7705 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-system_interface.html @@ -0,0 +1,399 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +System Interface +

      +

      Synopsis

      + + + + + +
      FT_MemoryFT_MemoryRecFT_Stream_CloseFunc
      FT_Alloc_FuncFT_StreamFT_StreamRec
      FT_Free_FuncFT_StreamDesc
      FT_Realloc_FuncFT_Stream_IoFunc


      + +
      +

      This section contains various definitions related to memory management and i/o access. You need to understand this information if you want to use a custom memory manager or you own i/o streams.

      +

      +
      +

      FT_Memory

      +
      +

      A handle to a given memory manager object, defined with an FT_MemoryRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Alloc_Func

      +
      +Defined in FT_SYSTEM_H (freetype/ftsystem.h). +

      +
      +
      +  typedef void*
      +  (*FT_Alloc_Func)( FT_Memory  memory,
      +                    long       size );
      +
      +

      +
      +

      A function used to allocate ‘size’ bytes from ‘memory’.

      +

      +
      input
      +

      + + + +
      memory +

      A handle to the source memory manager.

      +
      size +

      The size in bytes to allocate.

      +
      +
      +
      return
      +

      Address of new memory block. 0 in case of failure.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Free_Func

      +
      +Defined in FT_SYSTEM_H (freetype/ftsystem.h). +

      +
      +
      +  typedef void
      +  (*FT_Free_Func)( FT_Memory  memory,
      +                   void*      block );
      +
      +

      +
      +

      A function used to release a given block of memory.

      +

      +
      input
      +

      + + + +
      memory +

      A handle to the source memory manager.

      +
      block +

      The address of the target memory block.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Realloc_Func

      +
      +Defined in FT_SYSTEM_H (freetype/ftsystem.h). +

      +
      +
      +  typedef void*
      +  (*FT_Realloc_Func)( FT_Memory  memory,
      +                      long       cur_size,
      +                      long       new_size,
      +                      void*      block );
      +
      +

      +
      +

      A function used to re-allocate a given block of memory.

      +

      +
      input
      +

      + + + + + +
      memory +

      A handle to the source memory manager.

      +
      cur_size +

      The block's current size in bytes.

      +
      new_size +

      The block's requested new size.

      +
      block +

      The block's current address.

      +
      +
      +
      return
      +

      New block address. 0 in case of memory shortage.

      +
      +
      note
      +

      In case of error, the old block must still be available.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_MemoryRec

      +
      +Defined in FT_SYSTEM_H (freetype/ftsystem.h). +

      +
      +
      +  struct  FT_MemoryRec_
      +  {
      +    void*            user;
      +    FT_Alloc_Func    alloc;
      +    FT_Free_Func     free;
      +    FT_Realloc_Func  realloc;
      +  };
      +
      +

      +
      +

      A structure used to describe a given memory manager to FreeType 2.

      +

      +
      fields
      +

      + + + + + +
      user +

      A generic typeless pointer for user data.

      +
      alloc +

      A pointer type to an allocation function.

      +
      free +

      A pointer type to an memory freeing function.

      +
      realloc +

      A pointer type to a reallocation function.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stream

      +
      +

      A handle to an input stream.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_StreamDesc

      +
      +Defined in FT_SYSTEM_H (freetype/ftsystem.h). +

      +
      +
      +  typedef union  FT_StreamDesc_
      +  {
      +    long   value;
      +    void*  pointer;
      +
      +  } FT_StreamDesc;
      +
      +

      +
      +

      A union type used to store either a long or a pointer. This is used to store a file descriptor or a ‘FILE*’ in an input stream.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stream_IoFunc

      +
      +Defined in FT_SYSTEM_H (freetype/ftsystem.h). +

      +
      +
      +  typedef unsigned long
      +  (*FT_Stream_IoFunc)( FT_Stream       stream,
      +                       unsigned long   offset,
      +                       unsigned char*  buffer,
      +                       unsigned long   count );
      +
      +

      +
      +

      A function used to seek and read data from a given input stream.

      +

      +
      input
      +

      + + + + + +
      stream +

      A handle to the source stream.

      +
      offset +

      The offset of read in stream (always from start).

      +
      buffer +

      The address of the read buffer.

      +
      count +

      The number of bytes to read from the stream.

      +
      +
      +
      return
      +

      The number of bytes effectively read by the stream.

      +
      +
      note
      +

      This function might be called to perform a seek or skip operation with a ‘count’ of 0.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Stream_CloseFunc

      +
      +Defined in FT_SYSTEM_H (freetype/ftsystem.h). +

      +
      +
      +  typedef void
      +  (*FT_Stream_CloseFunc)( FT_Stream  stream );
      +
      +

      +
      +

      A function used to close a given input stream.

      +

      +
      input
      +

      + + +
      stream +

      A handle to the target stream.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_StreamRec

      +
      +Defined in FT_SYSTEM_H (freetype/ftsystem.h). +

      +
      +
      +  typedef struct  FT_StreamRec_
      +  {
      +    unsigned char*       base;
      +    unsigned long        size;
      +    unsigned long        pos;
      +
      +    FT_StreamDesc        descriptor;
      +    FT_StreamDesc        pathname;
      +    FT_Stream_IoFunc     read;
      +    FT_Stream_CloseFunc  close;
      +
      +    FT_Memory            memory;
      +    unsigned char*       cursor;
      +    unsigned char*       limit;
      +
      +  } FT_StreamRec;
      +
      +

      +
      +

      A structure used to describe an input stream.

      +

      +
      input
      +

      + + + + + + + + + + + +
      base +

      For memory-based streams, this is the address of the first stream byte in memory. This field should always be set to NULL for disk-based streams.

      +
      size +

      The stream size in bytes.

      +
      pos +

      The current position within the stream.

      +
      descriptor +

      This field is a union that can hold an integer or a pointer. It is used by stream implementations to store file descriptors or ‘FILE*’ pointers.

      +
      pathname +

      This field is completely ignored by FreeType. However, it is often useful during debugging to use it to store the stream's filename (where available).

      +
      read +

      The stream's input function.

      +
      close +

      The stream;s close function.

      +
      memory +

      The memory manager to use to preload frames. This is set internally by FreeType and shouldn't be touched by stream implementations.

      +
      cursor +

      This field is set and used internally by FreeType when parsing frames.

      +
      limit +

      This field is set and used internally by FreeType when parsing frames.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-toc.html b/src/3rdparty/freetype/docs/reference/ft2-toc.html new file mode 100644 index 0000000000..cb51bdbea9 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-toc.html @@ -0,0 +1,215 @@ + + + + +FreeType-2.3.9 API Reference + + + + + +
      [Index]
      +

      FreeType-2.3.9 API Reference

      + +

      Table of Contents

      +

      General Remarks

      • + + +
        +User allocation +

        How client applications should allocate FreeType data structures.

        +
        +
      +

      Core API

      +

      Format-Specific API

      +

      Cache Sub-System

      • + + +
        +Cache Sub-System +

        How to cache face, size, and glyph data with FreeType 2.

        +
        +
      +

      Support API

      +

      Miscellaneous

      +

      Global Index

      +
      + + +
      [Index]
      + +
      generated on Thu Mar 12 10:57:36 2009
      + diff --git a/src/3rdparty/freetype/docs/reference/ft2-truetype_engine.html b/src/3rdparty/freetype/docs/reference/ft2-truetype_engine.html new file mode 100644 index 0000000000..007e8331a5 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-truetype_engine.html @@ -0,0 +1,132 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +The TrueType Engine +

      +

      Synopsis

      + + +
      FT_TrueTypeEngineTypeFT_Get_TrueType_Engine_Type


      + +
      +

      This section contains a function used to query the level of TrueType bytecode support compiled in this version of the library.

      +

      +
      +

      FT_TrueTypeEngineType

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  typedef enum  FT_TrueTypeEngineType_
      +  {
      +    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
      +    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
      +    FT_TRUETYPE_ENGINE_TYPE_PATENTED
      +
      +  } FT_TrueTypeEngineType;
      +
      +

      +
      +

      A list of values describing which kind of TrueType bytecode engine is implemented in a given FT_Library instance. It is used by the FT_Get_TrueType_Engine_Type function.

      +

      +
      values
      +

      + + + + + + + +
      FT_TRUETYPE_ENGINE_TYPE_NONE
      +

      The library doesn't implement any kind of bytecode interpreter.

      +
      FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
      +

      The library implements a bytecode interpreter that doesn't support the patented operations of the TrueType virtual machine.

      +

      Its main use is to load certain Asian fonts which position and scale glyph components with bytecode instructions. It produces bad output for most other fonts.

      +
      FT_TRUETYPE_ENGINE_TYPE_PATENTED
      +

      The library implements a bytecode interpreter that covers the full instruction set of the TrueType virtual machine. See the file ‘docs/PATENTS’ for legal aspects.

      +
      +
      +
      since
      +

      2.2

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_TrueType_Engine_Type

      +
      +Defined in FT_MODULE_H (freetype/ftmodapi.h). +

      +
      +
      +  FT_EXPORT( FT_TrueTypeEngineType )
      +  FT_Get_TrueType_Engine_Type( FT_Library  library );
      +
      +

      +
      +

      Return an FT_TrueTypeEngineType value to indicate which level of the TrueType virtual machine a given library instance supports.

      +

      +
      input
      +

      + + +
      library +

      A library instance.

      +
      +
      +
      return
      +

      A value indicating which level is supported.

      +
      +
      since
      +

      2.2

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-truetype_tables.html b/src/3rdparty/freetype/docs/reference/ft2-truetype_tables.html new file mode 100644 index 0000000000..6d83a1a505 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-truetype_tables.html @@ -0,0 +1,1209 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +TrueType Tables +

      +

      Synopsis

      + + + + + + + + + + + +
      TT_PLATFORM_XXXTT_Postscript
      TT_APPLE_ID_XXXTT_PCLT
      TT_MAC_ID_XXXTT_MaxProfile
      TT_ISO_ID_XXXFT_Sfnt_Tag
      TT_MS_ID_XXXFT_Get_Sfnt_Table
      TT_ADOBE_ID_XXXFT_Load_Sfnt_Table
      TT_HeaderFT_Sfnt_Table_Info
      TT_HoriHeaderFT_Get_CMap_Language_ID
      TT_VertHeaderFT_Get_CMap_Format
      TT_OS2FT_PARAM_TAG_UNPATENTED_HINTING


      + +
      +

      This section contains the definition of TrueType-specific tables as well as some routines used to access and process them.

      +

      +
      +

      TT_PLATFORM_XXX

      +
      +Defined in FT_TRUETYPE_IDS_H (freetype/ttnameid.h). +

      +
      +
      +#define TT_PLATFORM_APPLE_UNICODE  0
      +#define TT_PLATFORM_MACINTOSH      1
      +#define TT_PLATFORM_ISO            2 /* deprecated */
      +#define TT_PLATFORM_MICROSOFT      3
      +#define TT_PLATFORM_CUSTOM         4
      +#define TT_PLATFORM_ADOBE          7 /* artificial */
      +
      +

      +
      +

      A list of valid values for the ‘platform_id’ identifier code in FT_CharMapRec and FT_SfntName structures.

      +

      +
      values
      +

      + + + + + + + + +
      TT_PLATFORM_APPLE_UNICODE
      +

      Used by Apple to indicate a Unicode character map and/or name entry. See TT_APPLE_ID_XXX for corresponding ‘encoding_id’ values. Note that name entries in this format are coded as big-endian UCS-2 character codes only.

      +
      TT_PLATFORM_MACINTOSH +

      Used by Apple to indicate a MacOS-specific charmap and/or name entry. See TT_MAC_ID_XXX for corresponding ‘encoding_id’ values. Note that most TrueType fonts contain an Apple roman charmap to be usable on MacOS systems (even if they contain a Microsoft charmap as well).

      +
      TT_PLATFORM_ISO +

      This value was used to specify Unicode charmaps. It is however now deprecated. See TT_ISO_ID_XXX for a list of corresponding ‘encoding_id’ values.

      +
      TT_PLATFORM_MICROSOFT +

      Used by Microsoft to indicate Windows-specific charmaps. See TT_MS_ID_XXX for a list of corresponding ‘encoding_id’ values. Note that most fonts contain a Unicode charmap using (TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS).

      +
      TT_PLATFORM_CUSTOM +

      Used to indicate application-specific charmaps.

      +
      TT_PLATFORM_ADOBE +

      This value isn't part of any font format specification, but is used by FreeType to report Adobe-specific charmaps in an FT_CharMapRec structure. See TT_ADOBE_ID_XXX.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_APPLE_ID_XXX

      +
      +Defined in FT_TRUETYPE_IDS_H (freetype/ttnameid.h). +

      +
      +
      +#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0 */
      +#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx */
      +#define TT_APPLE_ID_ISO_10646         2 /* deprecated */
      +#define TT_APPLE_ID_UNICODE_2_0       3 /* or later */
      +#define TT_APPLE_ID_UNICODE_32        4 /* 2.0 or later, full repertoire */
      +#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */
      +
      +

      +
      +

      A list of valid values for the ‘encoding_id’ for TT_PLATFORM_APPLE_UNICODE charmaps and name entries.

      +

      +
      values
      +

      + + + + + + + + + + +
      TT_APPLE_ID_DEFAULT +

      Unicode version 1.0.

      +
      TT_APPLE_ID_UNICODE_1_1
      +

      Unicode 1.1; specifies Hangul characters starting at U+34xx.

      +
      TT_APPLE_ID_ISO_10646 +

      Deprecated (identical to preceding).

      +
      TT_APPLE_ID_UNICODE_2_0
      +

      Unicode 2.0 and beyond (UTF-16 BMP only).

      +
      TT_APPLE_ID_UNICODE_32 +

      Unicode 3.1 and beyond, using UTF-32.

      +
      TT_APPLE_ID_VARIANT_SELECTOR
      +

      From Adobe, not Apple. Not a normal cmap. Specifies variations on a real cmap.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_MAC_ID_XXX

      +
      +Defined in FT_TRUETYPE_IDS_H (freetype/ttnameid.h). +

      +
      +
      +#define TT_MAC_ID_ROMAN                 0
      +#define TT_MAC_ID_JAPANESE              1
      +#define TT_MAC_ID_TRADITIONAL_CHINESE   2
      +#define TT_MAC_ID_KOREAN                3
      +#define TT_MAC_ID_ARABIC                4
      +#define TT_MAC_ID_HEBREW                5
      +#define TT_MAC_ID_GREEK                 6
      +#define TT_MAC_ID_RUSSIAN               7
      +#define TT_MAC_ID_RSYMBOL               8
      +#define TT_MAC_ID_DEVANAGARI            9
      +#define TT_MAC_ID_GURMUKHI             10
      +#define TT_MAC_ID_GUJARATI             11
      +#define TT_MAC_ID_ORIYA                12
      +#define TT_MAC_ID_BENGALI              13
      +#define TT_MAC_ID_TAMIL                14
      +#define TT_MAC_ID_TELUGU               15
      +#define TT_MAC_ID_KANNADA              16
      +#define TT_MAC_ID_MALAYALAM            17
      +#define TT_MAC_ID_SINHALESE            18
      +#define TT_MAC_ID_BURMESE              19
      +#define TT_MAC_ID_KHMER                20
      +#define TT_MAC_ID_THAI                 21
      +#define TT_MAC_ID_LAOTIAN              22
      +#define TT_MAC_ID_GEORGIAN             23
      +#define TT_MAC_ID_ARMENIAN             24
      +#define TT_MAC_ID_MALDIVIAN            25
      +#define TT_MAC_ID_SIMPLIFIED_CHINESE   25
      +#define TT_MAC_ID_TIBETAN              26
      +#define TT_MAC_ID_MONGOLIAN            27
      +#define TT_MAC_ID_GEEZ                 28
      +#define TT_MAC_ID_SLAVIC               29
      +#define TT_MAC_ID_VIETNAMESE           30
      +#define TT_MAC_ID_SINDHI               31
      +#define TT_MAC_ID_UNINTERP             32
      +
      +

      +
      +

      A list of valid values for the ‘encoding_id’ for TT_PLATFORM_MACINTOSH charmaps and name entries.

      +

      +
      values
      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      TT_MAC_ID_ROMAN +

      +
      TT_MAC_ID_JAPANESE +

      +
      TT_MAC_ID_TRADITIONAL_CHINESE
      +

      +
      TT_MAC_ID_KOREAN +

      +
      TT_MAC_ID_ARABIC +

      +
      TT_MAC_ID_HEBREW +

      +
      TT_MAC_ID_GREEK +

      +
      TT_MAC_ID_RUSSIAN +

      +
      TT_MAC_ID_RSYMBOL +

      +
      TT_MAC_ID_DEVANAGARI +

      +
      TT_MAC_ID_GURMUKHI +

      +
      TT_MAC_ID_GUJARATI +

      +
      TT_MAC_ID_ORIYA +

      +
      TT_MAC_ID_BENGALI +

      +
      TT_MAC_ID_TAMIL +

      +
      TT_MAC_ID_TELUGU +

      +
      TT_MAC_ID_KANNADA +

      +
      TT_MAC_ID_MALAYALAM +

      +
      TT_MAC_ID_SINHALESE +

      +
      TT_MAC_ID_BURMESE +

      +
      TT_MAC_ID_KHMER +

      +
      TT_MAC_ID_THAI +

      +
      TT_MAC_ID_LAOTIAN +

      +
      TT_MAC_ID_GEORGIAN +

      +
      TT_MAC_ID_ARMENIAN +

      +
      TT_MAC_ID_MALDIVIAN +

      +
      TT_MAC_ID_SIMPLIFIED_CHINESE
      +

      +
      TT_MAC_ID_TIBETAN +

      +
      TT_MAC_ID_MONGOLIAN +

      +
      TT_MAC_ID_GEEZ +

      +
      TT_MAC_ID_SLAVIC +

      +
      TT_MAC_ID_VIETNAMESE +

      +
      TT_MAC_ID_SINDHI +

      +
      TT_MAC_ID_UNINTERP +

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_ISO_ID_XXX

      +
      +Defined in FT_TRUETYPE_IDS_H (freetype/ttnameid.h). +

      +
      +
      +#define TT_ISO_ID_7BIT_ASCII  0
      +#define TT_ISO_ID_10646       1
      +#define TT_ISO_ID_8859_1      2
      +
      +

      +
      +

      A list of valid values for the ‘encoding_id’ for TT_PLATFORM_ISO charmaps and name entries.

      +

      Their use is now deprecated.

      +

      +
      values
      +

      + + + + +
      TT_ISO_ID_7BIT_ASCII +

      ASCII.

      +
      TT_ISO_ID_10646 +

      ISO/10646.

      +
      TT_ISO_ID_8859_1 +

      Also known as Latin-1.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_MS_ID_XXX

      +
      +Defined in FT_TRUETYPE_IDS_H (freetype/ttnameid.h). +

      +
      +
      +#define TT_MS_ID_SYMBOL_CS    0
      +#define TT_MS_ID_UNICODE_CS   1
      +#define TT_MS_ID_SJIS         2
      +#define TT_MS_ID_GB2312       3
      +#define TT_MS_ID_BIG_5        4
      +#define TT_MS_ID_WANSUNG      5
      +#define TT_MS_ID_JOHAB        6
      +#define TT_MS_ID_UCS_4       10
      +
      +

      +
      +

      A list of valid values for the ‘encoding_id’ for TT_PLATFORM_MICROSOFT charmaps and name entries.

      +

      +
      values
      +

      + + + + + + + + + +
      TT_MS_ID_SYMBOL_CS +

      Corresponds to Microsoft symbol encoding. See FT_ENCODING_MS_SYMBOL.

      +
      TT_MS_ID_UNICODE_CS +

      Corresponds to a Microsoft WGL4 charmap, matching Unicode. See FT_ENCODING_UNICODE.

      +
      TT_MS_ID_SJIS +

      Corresponds to SJIS Japanese encoding. See FT_ENCODING_SJIS.

      +
      TT_MS_ID_GB2312 +

      Corresponds to Simplified Chinese as used in Mainland China. See FT_ENCODING_GB2312.

      +
      TT_MS_ID_BIG_5 +

      Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. See FT_ENCODING_BIG5.

      +
      TT_MS_ID_WANSUNG +

      Corresponds to Korean Wansung encoding. See FT_ENCODING_WANSUNG.

      +
      TT_MS_ID_JOHAB +

      Corresponds to Johab encoding. See FT_ENCODING_JOHAB.

      +
      TT_MS_ID_UCS_4 +

      Corresponds to UCS-4 or UTF-32 charmaps. This has been added to the OpenType specification version 1.4 (mid-2001.)

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_ADOBE_ID_XXX

      +
      +Defined in FT_TRUETYPE_IDS_H (freetype/ttnameid.h). +

      +
      +
      +#define TT_ADOBE_ID_STANDARD  0
      +#define TT_ADOBE_ID_EXPERT    1
      +#define TT_ADOBE_ID_CUSTOM    2
      +#define TT_ADOBE_ID_LATIN_1   3
      +
      +

      +
      +

      A list of valid values for the ‘encoding_id’ for TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension!

      +

      +
      values
      +

      + + + + + +
      TT_ADOBE_ID_STANDARD +

      Adobe standard encoding.

      +
      TT_ADOBE_ID_EXPERT +

      Adobe expert encoding.

      +
      TT_ADOBE_ID_CUSTOM +

      Adobe custom encoding.

      +
      TT_ADOBE_ID_LATIN_1 +

      Adobe Latin 1 encoding.

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_Header

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  typedef struct  TT_Header_
      +  {
      +    FT_Fixed   Table_Version;
      +    FT_Fixed   Font_Revision;
      +
      +    FT_Long    CheckSum_Adjust;
      +    FT_Long    Magic_Number;
      +
      +    FT_UShort  Flags;
      +    FT_UShort  Units_Per_EM;
      +
      +    FT_Long    Created [2];
      +    FT_Long    Modified[2];
      +
      +    FT_Short   xMin;
      +    FT_Short   yMin;
      +    FT_Short   xMax;
      +    FT_Short   yMax;
      +
      +    FT_UShort  Mac_Style;
      +    FT_UShort  Lowest_Rec_PPEM;
      +
      +    FT_Short   Font_Direction;
      +    FT_Short   Index_To_Loc_Format;
      +    FT_Short   Glyph_Data_Format;
      +
      +  } TT_Header;
      +
      +

      +
      +

      A structure used to model a TrueType font header table. All fields follow the TrueType specification.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_HoriHeader

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  typedef struct  TT_HoriHeader_
      +  {
      +    FT_Fixed   Version;
      +    FT_Short   Ascender;
      +    FT_Short   Descender;
      +    FT_Short   Line_Gap;
      +
      +    FT_UShort  advance_Width_Max;      /* advance width maximum */
      +
      +    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */
      +    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */
      +    FT_Short   xMax_Extent;            /* xmax extents          */
      +    FT_Short   caret_Slope_Rise;
      +    FT_Short   caret_Slope_Run;
      +    FT_Short   caret_Offset;
      +
      +    FT_Short   Reserved[4];
      +
      +    FT_Short   metric_Data_Format;
      +    FT_UShort  number_Of_HMetrics;
      +
      +    /* The following fields are not defined by the TrueType specification */
      +    /* but they are used to connect the metrics header to the relevant    */
      +    /* `HMTX' table.                                                      */
      +
      +    void*      long_metrics;
      +    void*      short_metrics;
      +
      +  } TT_HoriHeader;
      +
      +

      +
      +

      A structure used to model a TrueType horizontal header, the ‘hhea’ table, as well as the corresponding horizontal metrics table, i.e., the ‘hmtx’ table.

      +

      +
      fields
      +

      + + + + + + + + + + + + + + + + +
      Version +

      The table version.

      +
      Ascender +

      The font's ascender, i.e., the distance from the baseline to the top-most of all glyph points found in the font.

      +

      This value is invalid in many fonts, as it is usually set by the font designer, and often reflects only a portion of the glyphs found in the font (maybe ASCII).

      +

      You should use the ‘sTypoAscender’ field of the OS/2 table instead if you want the correct one.

      +
      Descender +

      The font's descender, i.e., the distance from the baseline to the bottom-most of all glyph points found in the font. It is negative.

      +

      This value is invalid in many fonts, as it is usually set by the font designer, and often reflects only a portion of the glyphs found in the font (maybe ASCII).

      +

      You should use the ‘sTypoDescender’ field of the OS/2 table instead if you want the correct one.

      +
      Line_Gap +

      The font's line gap, i.e., the distance to add to the ascender and descender to get the BTB, i.e., the baseline-to-baseline distance for the font.

      +
      advance_Width_Max +

      This field is the maximum of all advance widths found in the font. It can be used to compute the maximum width of an arbitrary string of text.

      +
      min_Left_Side_Bearing +

      The minimum left side bearing of all glyphs within the font.

      +
      min_Right_Side_Bearing +

      The minimum right side bearing of all glyphs within the font.

      +
      xMax_Extent +

      The maximum horizontal extent (i.e., the ‘width’ of a glyph's bounding box) for all glyphs in the font.

      +
      caret_Slope_Rise +

      The rise coefficient of the cursor's slope of the cursor (slope=rise/run).

      +
      caret_Slope_Run +

      The run coefficient of the cursor's slope.

      +
      Reserved +

      8 reserved bytes.

      +
      metric_Data_Format +

      Always 0.

      +
      number_Of_HMetrics +

      Number of HMetrics entries in the ‘hmtx’ table -- this value can be smaller than the total number of glyphs in the font.

      +
      long_metrics +

      A pointer into the ‘hmtx’ table.

      +
      short_metrics +

      A pointer into the ‘hmtx’ table.

      +
      +
      +
      note
      +

      IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should be identical except for the names of their fields which are different.

      +

      This ensures that a single function in the ‘ttload’ module is able to read both the horizontal and vertical headers.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_VertHeader

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  typedef struct  TT_VertHeader_
      +  {
      +    FT_Fixed   Version;
      +    FT_Short   Ascender;
      +    FT_Short   Descender;
      +    FT_Short   Line_Gap;
      +
      +    FT_UShort  advance_Height_Max;      /* advance height maximum */
      +
      +    FT_Short   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */
      +    FT_Short   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */
      +    FT_Short   yMax_Extent;             /* xmax or ymax extents            */
      +    FT_Short   caret_Slope_Rise;
      +    FT_Short   caret_Slope_Run;
      +    FT_Short   caret_Offset;
      +
      +    FT_Short   Reserved[4];
      +
      +    FT_Short   metric_Data_Format;
      +    FT_UShort  number_Of_VMetrics;
      +
      +    /* The following fields are not defined by the TrueType specification */
      +    /* but they're used to connect the metrics header to the relevant     */
      +    /* `HMTX' or `VMTX' table.                                            */
      +
      +    void*      long_metrics;
      +    void*      short_metrics;
      +
      +  } TT_VertHeader;
      +
      +

      +
      +

      A structure used to model a TrueType vertical header, the ‘vhea’ table, as well as the corresponding vertical metrics table, i.e., the ‘vmtx’ table.

      +

      +
      fields
      +

      + + + + + + + + + + + + + + + + + + +
      Version +

      The table version.

      +
      Ascender +

      The font's ascender, i.e., the distance from the baseline to the top-most of all glyph points found in the font.

      +

      This value is invalid in many fonts, as it is usually set by the font designer, and often reflects only a portion of the glyphs found in the font (maybe ASCII).

      +

      You should use the ‘sTypoAscender’ field of the OS/2 table instead if you want the correct one.

      +
      Descender +

      The font's descender, i.e., the distance from the baseline to the bottom-most of all glyph points found in the font. It is negative.

      +

      This value is invalid in many fonts, as it is usually set by the font designer, and often reflects only a portion of the glyphs found in the font (maybe ASCII).

      +

      You should use the ‘sTypoDescender’ field of the OS/2 table instead if you want the correct one.

      +
      Line_Gap +

      The font's line gap, i.e., the distance to add to the ascender and descender to get the BTB, i.e., the baseline-to-baseline distance for the font.

      +
      advance_Height_Max +

      This field is the maximum of all advance heights found in the font. It can be used to compute the maximum height of an arbitrary string of text.

      +
      min_Top_Side_Bearing +

      The minimum top side bearing of all glyphs within the font.

      +
      min_Bottom_Side_Bearing
      +

      The minimum bottom side bearing of all glyphs within the font.

      +
      yMax_Extent +

      The maximum vertical extent (i.e., the ‘height’ of a glyph's bounding box) for all glyphs in the font.

      +
      caret_Slope_Rise +

      The rise coefficient of the cursor's slope of the cursor (slope=rise/run).

      +
      caret_Slope_Run +

      The run coefficient of the cursor's slope.

      +
      caret_Offset +

      The cursor's offset for slanted fonts. This value is ‘reserved’ in vmtx version 1.0.

      +
      Reserved +

      8 reserved bytes.

      +
      metric_Data_Format +

      Always 0.

      +
      number_Of_HMetrics +

      Number of VMetrics entries in the ‘vmtx’ table -- this value can be smaller than the total number of glyphs in the font.

      +
      long_metrics +

      A pointer into the ‘vmtx’ table.

      +
      short_metrics +

      A pointer into the ‘vmtx’ table.

      +
      +
      +
      note
      +

      IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should be identical except for the names of their fields which are different.

      +

      This ensures that a single function in the ‘ttload’ module is able to read both the horizontal and vertical headers.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_OS2

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  typedef struct  TT_OS2_
      +  {
      +    FT_UShort  version;                /* 0x0001 - more or 0xFFFF */
      +    FT_Short   xAvgCharWidth;
      +    FT_UShort  usWeightClass;
      +    FT_UShort  usWidthClass;
      +    FT_Short   fsType;
      +    FT_Short   ySubscriptXSize;
      +    FT_Short   ySubscriptYSize;
      +    FT_Short   ySubscriptXOffset;
      +    FT_Short   ySubscriptYOffset;
      +    FT_Short   ySuperscriptXSize;
      +    FT_Short   ySuperscriptYSize;
      +    FT_Short   ySuperscriptXOffset;
      +    FT_Short   ySuperscriptYOffset;
      +    FT_Short   yStrikeoutSize;
      +    FT_Short   yStrikeoutPosition;
      +    FT_Short   sFamilyClass;
      +
      +    FT_Byte    panose[10];
      +
      +    FT_ULong   ulUnicodeRange1;        /* Bits 0-31   */
      +    FT_ULong   ulUnicodeRange2;        /* Bits 32-63  */
      +    FT_ULong   ulUnicodeRange3;        /* Bits 64-95  */
      +    FT_ULong   ulUnicodeRange4;        /* Bits 96-127 */
      +
      +    FT_Char    achVendID[4];
      +
      +    FT_UShort  fsSelection;
      +    FT_UShort  usFirstCharIndex;
      +    FT_UShort  usLastCharIndex;
      +    FT_Short   sTypoAscender;
      +    FT_Short   sTypoDescender;
      +    FT_Short   sTypoLineGap;
      +    FT_UShort  usWinAscent;
      +    FT_UShort  usWinDescent;
      +
      +    /* only version 1 tables: */
      +
      +    FT_ULong   ulCodePageRange1;       /* Bits 0-31   */
      +    FT_ULong   ulCodePageRange2;       /* Bits 32-63  */
      +
      +    /* only version 2 tables: */
      +
      +    FT_Short   sxHeight;
      +    FT_Short   sCapHeight;
      +    FT_UShort  usDefaultChar;
      +    FT_UShort  usBreakChar;
      +    FT_UShort  usMaxContext;
      +
      +  } TT_OS2;
      +
      +

      +
      +

      A structure used to model a TrueType OS/2 table. This is the long table version. All fields comply to the TrueType specification.

      +

      Note that we now support old Mac fonts which do not include an OS/2 table. In this case, the ‘version’ field is always set to 0xFFFF.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_Postscript

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  typedef struct  TT_Postscript_
      +  {
      +    FT_Fixed  FormatType;
      +    FT_Fixed  italicAngle;
      +    FT_Short  underlinePosition;
      +    FT_Short  underlineThickness;
      +    FT_ULong  isFixedPitch;
      +    FT_ULong  minMemType42;
      +    FT_ULong  maxMemType42;
      +    FT_ULong  minMemType1;
      +    FT_ULong  maxMemType1;
      +
      +    /* Glyph names follow in the file, but we don't   */
      +    /* load them by default.  See the ttpost.c file.  */
      +
      +  } TT_Postscript;
      +
      +

      +
      +

      A structure used to model a TrueType PostScript table. All fields comply to the TrueType specification. This structure does not reference the PostScript glyph names, which can be nevertheless accessed with the ‘ttpost’ module.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_PCLT

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  typedef struct  TT_PCLT_
      +  {
      +    FT_Fixed   Version;
      +    FT_ULong   FontNumber;
      +    FT_UShort  Pitch;
      +    FT_UShort  xHeight;
      +    FT_UShort  Style;
      +    FT_UShort  TypeFamily;
      +    FT_UShort  CapHeight;
      +    FT_UShort  SymbolSet;
      +    FT_Char    TypeFace[16];
      +    FT_Char    CharacterComplement[8];
      +    FT_Char    FileName[6];
      +    FT_Char    StrokeWeight;
      +    FT_Char    WidthType;
      +    FT_Byte    SerifStyle;
      +    FT_Byte    Reserved;
      +
      +  } TT_PCLT;
      +
      +

      +
      +

      A structure used to model a TrueType PCLT table. All fields comply to the TrueType specification.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      TT_MaxProfile

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  typedef struct  TT_MaxProfile_
      +  {
      +    FT_Fixed   version;
      +    FT_UShort  numGlyphs;
      +    FT_UShort  maxPoints;
      +    FT_UShort  maxContours;
      +    FT_UShort  maxCompositePoints;
      +    FT_UShort  maxCompositeContours;
      +    FT_UShort  maxZones;
      +    FT_UShort  maxTwilightPoints;
      +    FT_UShort  maxStorage;
      +    FT_UShort  maxFunctionDefs;
      +    FT_UShort  maxInstructionDefs;
      +    FT_UShort  maxStackElements;
      +    FT_UShort  maxSizeOfInstructions;
      +    FT_UShort  maxComponentElements;
      +    FT_UShort  maxComponentDepth;
      +
      +  } TT_MaxProfile;
      +
      +

      +
      +

      The maximum profile is a table containing many max values which can be used to pre-allocate arrays. This ensures that no memory allocation occurs during a glyph load.

      +

      +
      fields
      +

      + + + + + + + + + + + + + + + + +
      version +

      The version number.

      +
      numGlyphs +

      The number of glyphs in this TrueType font.

      +
      maxPoints +

      The maximum number of points in a non-composite TrueType glyph. See also the structure element ‘maxCompositePoints’.

      +
      maxContours +

      The maximum number of contours in a non-composite TrueType glyph. See also the structure element ‘maxCompositeContours’.

      +
      maxCompositePoints +

      The maximum number of points in a composite TrueType glyph. See also the structure element ‘maxPoints’.

      +
      maxCompositeContours +

      The maximum number of contours in a composite TrueType glyph. See also the structure element ‘maxContours’.

      +
      maxZones +

      The maximum number of zones used for glyph hinting.

      +
      maxTwilightPoints +

      The maximum number of points in the twilight zone used for glyph hinting.

      +
      maxStorage +

      The maximum number of elements in the storage area used for glyph hinting.

      +
      maxFunctionDefs +

      The maximum number of function definitions in the TrueType bytecode for this font.

      +
      maxInstructionDefs +

      The maximum number of instruction definitions in the TrueType bytecode for this font.

      +
      maxStackElements +

      The maximum number of stack elements used during bytecode interpretation.

      +
      maxSizeOfInstructions +

      The maximum number of TrueType opcodes used for glyph hinting.

      +
      maxComponentElements +

      The maximum number of simple (i.e., non- composite) glyphs in a composite glyph.

      +
      maxComponentDepth +

      The maximum nesting depth of composite glyphs.

      +
      +
      +
      note
      +

      This structure is only used during font loading.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Sfnt_Tag

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  typedef enum  FT_Sfnt_Tag_
      +  {
      +    ft_sfnt_head = 0,
      +    ft_sfnt_maxp = 1,
      +    ft_sfnt_os2  = 2,
      +    ft_sfnt_hhea = 3,
      +    ft_sfnt_vhea = 4,
      +    ft_sfnt_post = 5,
      +    ft_sfnt_pclt = 6,
      +
      +    sfnt_max   /* internal end mark */
      +
      +  } FT_Sfnt_Tag;
      +
      +

      +
      +

      An enumeration used to specify the index of an SFNT table. Used in the FT_Get_Sfnt_Table API function.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_Sfnt_Table

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  FT_EXPORT( void* )
      +  FT_Get_Sfnt_Table( FT_Face      face,
      +                     FT_Sfnt_Tag  tag );
      +
      +

      +
      +

      Return a pointer to a given SFNT table within a face.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the source.

      +
      tag +

      The index of the SFNT table.

      +
      +
      +
      return
      +

      A type-less pointer to the table. This will be 0 in case of error, or if the corresponding table was not found OR loaded from the file.

      +
      +
      note
      +

      The table is owned by the face object and disappears with it.

      +

      This function is only useful to access SFNT tables that are loaded by the sfnt, truetype, and opentype drivers. See FT_Sfnt_Tag for a list.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Load_Sfnt_Table

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Load_Sfnt_Table( FT_Face    face,
      +                      FT_ULong   tag,
      +                      FT_Long    offset,
      +                      FT_Byte*   buffer,
      +                      FT_ULong*  length );
      +
      +

      +
      +

      Load any font table into client memory.

      +

      +
      input
      +

      + + + + +
      face +

      A handle to the source face.

      +
      tag +

      The four-byte tag of the table to load. Use the value 0 if you want to access the whole font file. Otherwise, you can use one of the definitions found in the FT_TRUETYPE_TAGS_H file, or forge a new one with FT_MAKE_TAG.

      +
      offset +

      The starting offset in the table (or file if tag == 0).

      +
      +
      +
      output
      +

      + + +
      buffer +

      The target buffer address. The client must ensure that the memory array is big enough to hold the data.

      +
      +
      +
      inout
      +

      + + +
      length +

      If the ‘length’ parameter is NULL, then try to load the whole table. Return an error code if it fails.

      +

      Else, if ‘*length’ is 0, exit immediately while returning the table's (or file) full size in it.

      +

      Else the number of bytes to read from the table or file, from the starting offset.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      If you need to determine the table's length you should first call this function with ‘*length’ set to 0, as in the following example:

      +
      +  FT_ULong  length = 0;
      +
      +
      +  error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
      +  if ( error ) { ... table does not exist ... }
      +
      +  buffer = malloc( length );
      +  if ( buffer == NULL ) { ... not enough memory ... }
      +
      +  error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
      +  if ( error ) { ... could not load table ... }
      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Sfnt_Table_Info

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Sfnt_Table_Info( FT_Face    face,
      +                      FT_UInt    table_index,
      +                      FT_ULong  *tag,
      +                      FT_ULong  *length );
      +
      +

      +
      +

      Return information on an SFNT table.

      +

      +
      input
      +

      + + + +
      face +

      A handle to the source face.

      +
      table_index +

      The index of an SFNT table. The function returns FT_Err_Table_Missing for an invalid value.

      +
      +
      +
      output
      +

      + + + +
      tag +

      The name tag of the SFNT table.

      +
      length +

      The length of the SFNT table.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      SFNT tables with length zero are treated as missing.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_CMap_Language_ID

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  FT_EXPORT( FT_ULong )
      +  FT_Get_CMap_Language_ID( FT_CharMap  charmap );
      +
      +

      +
      +

      Return TrueType/sfnt specific cmap language ID. Definitions of language ID values are in ‘freetype/ttnameid.h’.

      +

      +
      input
      +

      + + +
      charmap +

      The target charmap.

      +
      +
      +
      return
      +

      The language ID of ‘charmap’. If ‘charmap’ doesn't belong to a TrueType/sfnt face, just return 0 as the default value.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_CMap_Format

      +
      +Defined in FT_TRUETYPE_TABLES_H (freetype/tttables.h). +

      +
      +
      +  FT_EXPORT( FT_Long )
      +  FT_Get_CMap_Format( FT_CharMap  charmap );
      +
      +

      +
      +

      Return TrueType/sfnt specific cmap format.

      +

      +
      input
      +

      + + +
      charmap +

      The target charmap.

      +
      +
      +
      return
      +

      The format of ‘charmap’. If ‘charmap’ doesn't belong to a TrueType/sfnt face, return -1.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_PARAM_TAG_UNPATENTED_HINTING

      +
      +

      A constant used as the tag of an FT_Parameter structure to indicate that unpatented methods only should be used by the TrueType bytecode interpreter for a typeface opened by FT_Open_Face.

      +

      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-type1_tables.html b/src/3rdparty/freetype/docs/reference/ft2-type1_tables.html new file mode 100644 index 0000000000..8eaa3f9a10 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-type1_tables.html @@ -0,0 +1,466 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Type 1 Tables +

      +

      Synopsis

      + + + + + + +
      PS_FontInfoRecT1_PrivateCID_FaceInfo
      PS_FontInfoT1_Blend_FlagsCID_Info
      T1_FontInfoCID_FaceDictRecFT_Has_PS_Glyph_Names
      PS_PrivateRecCID_FaceDictFT_Get_PS_Font_Info
      PS_PrivateCID_FaceInfoRecFT_Get_PS_Font_Private


      + +
      +

      This section contains the definition of Type 1-specific tables, including structures related to other PostScript font formats.

      +

      +
      +

      PS_FontInfoRec

      +
      +Defined in FT_TYPE1_TABLES_H (freetype/t1tables.h). +

      +
      +
      +  typedef struct  PS_FontInfoRec_
      +  {
      +    FT_String*  version;
      +    FT_String*  notice;
      +    FT_String*  full_name;
      +    FT_String*  family_name;
      +    FT_String*  weight;
      +    FT_Long     italic_angle;
      +    FT_Bool     is_fixed_pitch;
      +    FT_Short    underline_position;
      +    FT_UShort   underline_thickness;
      +
      +  } PS_FontInfoRec;
      +
      +

      +
      +

      A structure used to model a Type 1 or Type 2 FontInfo dictionary. Note that for Multiple Master fonts, each instance has its own FontInfo dictionary.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      PS_FontInfo

      +
      +

      A handle to a PS_FontInfoRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      T1_FontInfo

      +
      +

      This type is equivalent to PS_FontInfoRec. It is deprecated but kept to maintain source compatibility between various versions of FreeType.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      PS_PrivateRec

      +
      +Defined in FT_TYPE1_TABLES_H (freetype/t1tables.h). +

      +
      +
      +  typedef struct  PS_PrivateRec_
      +  {
      +    FT_Int     unique_id;
      +    FT_Int     lenIV;
      +
      +    FT_Byte    num_blue_values;
      +    FT_Byte    num_other_blues;
      +    FT_Byte    num_family_blues;
      +    FT_Byte    num_family_other_blues;
      +
      +    FT_Short   blue_values[14];
      +    FT_Short   other_blues[10];
      +
      +    FT_Short   family_blues      [14];
      +    FT_Short   family_other_blues[10];
      +
      +    FT_Fixed   blue_scale;
      +    FT_Int     blue_shift;
      +    FT_Int     blue_fuzz;
      +
      +    FT_UShort  standard_width[1];
      +    FT_UShort  standard_height[1];
      +
      +    FT_Byte    num_snap_widths;
      +    FT_Byte    num_snap_heights;
      +    FT_Bool    force_bold;
      +    FT_Bool    round_stem_up;
      +
      +    FT_Short   snap_widths [13];  /* including std width  */
      +    FT_Short   snap_heights[13];  /* including std height */
      +
      +    FT_Fixed   expansion_factor;
      +
      +    FT_Long    language_group;
      +    FT_Long    password;
      +
      +    FT_Short   min_feature[2];
      +
      +  } PS_PrivateRec;
      +
      +

      +
      +

      A structure used to model a Type 1 or Type 2 private dictionary. Note that for Multiple Master fonts, each instance has its own Private dictionary.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      PS_Private

      +
      +

      A handle to a PS_PrivateRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      T1_Private

      +
      +

      This type is equivalent to PS_PrivateRec. It is deprecated but kept to maintain source compatibility between various versions of FreeType.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      T1_Blend_Flags

      +
      +Defined in FT_TYPE1_TABLES_H (freetype/t1tables.h). +

      +
      +
      +  typedef enum  T1_Blend_Flags_
      +  {
      +    /*# required fields in a FontInfo blend dictionary */
      +    T1_BLEND_UNDERLINE_POSITION = 0,
      +    T1_BLEND_UNDERLINE_THICKNESS,
      +    T1_BLEND_ITALIC_ANGLE,
      +
      +    /*# required fields in a Private blend dictionary */
      +    T1_BLEND_BLUE_VALUES,
      +    T1_BLEND_OTHER_BLUES,
      +    T1_BLEND_STANDARD_WIDTH,
      +    T1_BLEND_STANDARD_HEIGHT,
      +    T1_BLEND_STEM_SNAP_WIDTHS,
      +    T1_BLEND_STEM_SNAP_HEIGHTS,
      +    T1_BLEND_BLUE_SCALE,
      +    T1_BLEND_BLUE_SHIFT,
      +    T1_BLEND_FAMILY_BLUES,
      +    T1_BLEND_FAMILY_OTHER_BLUES,
      +    T1_BLEND_FORCE_BOLD,
      +
      +    /*# never remove */
      +    T1_BLEND_MAX
      +
      +  } T1_Blend_Flags;
      +
      +

      +
      +

      A set of flags used to indicate which fields are present in a given blend dictionary (font info or private). Used to support Multiple Masters fonts.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      CID_FaceDictRec

      +
      +Defined in FT_TYPE1_TABLES_H (freetype/t1tables.h). +

      +
      +
      +  typedef struct  CID_FaceDictRec_
      +  {
      +    PS_PrivateRec  private_dict;
      +
      +    FT_UInt        len_buildchar;
      +    FT_Fixed       forcebold_threshold;
      +    FT_Pos         stroke_width;
      +    FT_Fixed       expansion_factor;
      +
      +    FT_Byte        paint_type;
      +    FT_Byte        font_type;
      +    FT_Matrix      font_matrix;
      +    FT_Vector      font_offset;
      +
      +    FT_UInt        num_subrs;
      +    FT_ULong       subrmap_offset;
      +    FT_Int         sd_bytes;
      +
      +  } CID_FaceDictRec;
      +
      +

      +
      +

      A structure used to represent data in a CID top-level dictionary.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      CID_FaceDict

      +
      +

      A handle to a CID_FaceDictRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      CID_FaceInfoRec

      +
      +Defined in FT_TYPE1_TABLES_H (freetype/t1tables.h). +

      +
      +
      +  typedef struct  CID_FaceInfoRec_
      +  {
      +    FT_String*      cid_font_name;
      +    FT_Fixed        cid_version;
      +    FT_Int          cid_font_type;
      +
      +    FT_String*      registry;
      +    FT_String*      ordering;
      +    FT_Int          supplement;
      +
      +    PS_FontInfoRec  font_info;
      +    FT_BBox         font_bbox;
      +    FT_ULong        uid_base;
      +
      +    FT_Int          num_xuid;
      +    FT_ULong        xuid[16];
      +
      +    FT_ULong        cidmap_offset;
      +    FT_Int          fd_bytes;
      +    FT_Int          gd_bytes;
      +    FT_ULong        cid_count;
      +
      +    FT_Int          num_dicts;
      +    CID_FaceDict    font_dicts;
      +
      +    FT_ULong        data_offset;
      +
      +  } CID_FaceInfoRec;
      +
      +

      +
      +

      A structure used to represent CID Face information.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      CID_FaceInfo

      +
      +

      A handle to a CID_FaceInfoRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      CID_Info

      +
      +

      This type is equivalent to CID_FaceInfoRec. It is deprecated but kept to maintain source compatibility between various versions of FreeType.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Has_PS_Glyph_Names

      +
      +Defined in FT_TYPE1_TABLES_H (freetype/t1tables.h). +

      +
      +
      +  FT_EXPORT( FT_Int )
      +  FT_Has_PS_Glyph_Names( FT_Face  face );
      +
      +

      +
      +

      Return true if a given face provides reliable PostScript glyph names. This is similar to using the FT_HAS_GLYPH_NAMES macro, except that certain fonts (mostly TrueType) contain incorrect glyph name tables.

      +

      When this function returns true, the caller is sure that the glyph names returned by FT_Get_Glyph_Name are reliable.

      +

      +
      input
      +

      + + +
      face +

      face handle

      +
      +
      +
      return
      +

      Boolean. True if glyph names are reliable.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_PS_Font_Info

      +
      +Defined in FT_TYPE1_TABLES_H (freetype/t1tables.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_PS_Font_Info( FT_Face      face,
      +                       PS_FontInfo  afont_info );
      +
      +

      +
      +

      Retrieve the PS_FontInfoRec structure corresponding to a given PostScript font.

      +

      +
      input
      +

      + + +
      face +

      PostScript face handle.

      +
      +
      +
      output
      +

      + + +
      afont_info +

      Output font info structure pointer.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The string pointers within the font info structure are owned by the face and don't need to be freed by the caller.

      +

      If the font's format is not PostScript-based, this function will return the ‘FT_Err_Invalid_Argument’ error code.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_PS_Font_Private

      +
      +Defined in FT_TYPE1_TABLES_H (freetype/t1tables.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_PS_Font_Private( FT_Face     face,
      +                          PS_Private  afont_private );
      +
      +

      +
      +

      Retrieve the PS_PrivateRec structure corresponding to a given PostScript font.

      +

      +
      input
      +

      + + +
      face +

      PostScript face handle.

      +
      +
      +
      output
      +

      + + +
      afont_private +

      Output private dictionary structure pointer.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      The string pointers within the PS_PrivateRec structure are owned by the face and don't need to be freed by the caller.

      +

      If the font's format is not PostScript-based, this function returns the ‘FT_Err_Invalid_Argument’ error code.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-user_allocation.html b/src/3rdparty/freetype/docs/reference/ft2-user_allocation.html new file mode 100644 index 0000000000..d3b48b1286 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-user_allocation.html @@ -0,0 +1,47 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +User allocation +

      +
      +

      FreeType assumes that structures allocated by the user and passed as arguments are zeroed out except for the actual data. In other words, it is recommended to use ‘calloc’ (or variants of it) instead of ‘malloc’ for allocation.

      +

      + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-version.html b/src/3rdparty/freetype/docs/reference/ft2-version.html new file mode 100644 index 0000000000..2c7d9c1ef7 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-version.html @@ -0,0 +1,213 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +FreeType Version +

      +

      Synopsis

      + + + +
      FREETYPE_XXXFT_Face_CheckTrueTypePatents
      FT_Library_VersionFT_Face_SetUnpatentedHinting


      + +
      +

      Note that those functions and macros are of limited use because even a new release of FreeType with only documentation changes increases the version number.

      +

      +
      +

      FREETYPE_XXX

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +#define FREETYPE_MAJOR  2
      +#define FREETYPE_MINOR  3
      +#define FREETYPE_PATCH  9
      +
      +

      +
      +

      These three macros identify the FreeType source code version. Use FT_Library_Version to access them at runtime.

      +

      +
      values
      +

      + + + + +
      FREETYPE_MAJOR +

      The major version number.

      +
      FREETYPE_MINOR +

      The minor version number.

      +
      FREETYPE_PATCH +

      The patch level.

      +
      +
      +
      note
      +

      The version number of FreeType if built as a dynamic link library with the ‘libtool’ package is not controlled by these three macros.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Library_Version

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( void )
      +  FT_Library_Version( FT_Library   library,
      +                      FT_Int      *amajor,
      +                      FT_Int      *aminor,
      +                      FT_Int      *apatch );
      +
      +

      +
      +

      Return the version of the FreeType library being used. This is useful when dynamically linking to the library, since one cannot use the macros FREETYPE_MAJOR, FREETYPE_MINOR, and FREETYPE_PATCH.

      +

      +
      input
      +

      + + +
      library +

      A source library handle.

      +
      +
      +
      output
      +

      + + + + +
      amajor +

      The major version number.

      +
      aminor +

      The minor version number.

      +
      apatch +

      The patch version number.

      +
      +
      +
      note
      +

      The reason why this function takes a ‘library’ argument is because certain programs implement library initialization in a custom way that doesn't use FT_Init_FreeType.

      +

      In such cases, the library version might not be available before the library object has been created.

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Face_CheckTrueTypePatents

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Bool )
      +  FT_Face_CheckTrueTypePatents( FT_Face  face );
      +
      +

      +
      +

      Parse all bytecode instructions of a TrueType font file to check whether any of the patented opcodes are used. This is only useful if you want to be able to use the unpatented hinter with fonts that do not use these opcodes.

      +

      Note that this function parses all glyph instructions in the font file, which may be slow.

      +

      +
      input
      +

      + + +
      face +

      A face handle.

      +
      +
      +
      return
      +

      1 if this is a TrueType font that uses one of the patented opcodes, 0 otherwise.

      +
      +
      since
      +

      2.3.5

      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Face_SetUnpatentedHinting

      +
      +Defined in FT_FREETYPE_H (freetype/freetype.h). +

      +
      +
      +  FT_EXPORT( FT_Bool )
      +  FT_Face_SetUnpatentedHinting( FT_Face  face,
      +                                FT_Bool  value );
      +
      +

      +
      +

      Enable or disable the unpatented hinter for a given face. Only enable it if you have determined that the face doesn't use any patented opcodes (see FT_Face_CheckTrueTypePatents).

      +

      +
      input
      +

      + + + +
      face +

      A face handle.

      +
      value +

      New boolean setting.

      +
      +
      +
      return
      +

      The old setting value. This will always be false if this is not an SFNT font, or if the unpatented hinter is not compiled in this instance of the library.

      +
      +
      since
      +

      2.3.5

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/reference/ft2-winfnt_fonts.html b/src/3rdparty/freetype/docs/reference/ft2-winfnt_fonts.html new file mode 100644 index 0000000000..7c850d7691 --- /dev/null +++ b/src/3rdparty/freetype/docs/reference/ft2-winfnt_fonts.html @@ -0,0 +1,270 @@ + + + + +FreeType-2.3.9 API Reference + + + + + + +
      [Index][TOC]
      +

      FreeType-2.3.9 API Reference

      + +

      +Window FNT Files +

      +

      Synopsis

      + + + +
      FT_WinFNT_ID_XXXFT_WinFNT_Header
      FT_WinFNT_HeaderRecFT_Get_WinFNT_Header


      + +
      +

      This section contains the declaration of Windows FNT specific functions.

      +

      +
      +

      FT_WinFNT_ID_XXX

      +
      +Defined in FT_WINFONTS_H (freetype/ftwinfnt.h). +

      +
      +
      +#define FT_WinFNT_ID_CP1252    0
      +#define FT_WinFNT_ID_DEFAULT   1
      +#define FT_WinFNT_ID_SYMBOL    2
      +#define FT_WinFNT_ID_MAC      77
      +#define FT_WinFNT_ID_CP932   128
      +#define FT_WinFNT_ID_CP949   129
      +#define FT_WinFNT_ID_CP1361  130
      +#define FT_WinFNT_ID_CP936   134
      +#define FT_WinFNT_ID_CP950   136
      +#define FT_WinFNT_ID_CP1253  161
      +#define FT_WinFNT_ID_CP1254  162
      +#define FT_WinFNT_ID_CP1258  163
      +#define FT_WinFNT_ID_CP1255  177
      +#define FT_WinFNT_ID_CP1256  178
      +#define FT_WinFNT_ID_CP1257  186
      +#define FT_WinFNT_ID_CP1251  204
      +#define FT_WinFNT_ID_CP874   222
      +#define FT_WinFNT_ID_CP1250  238
      +#define FT_WinFNT_ID_OEM     255
      +
      +

      +
      +

      A list of valid values for the ‘charset’ byte in FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX encodings (except for cp1361) can be found at ftp://ftp.unicode.org in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.

      +

      +
      values
      +

      + + + + + + + + + + + + + + + + + + + + +
      FT_WinFNT_ID_DEFAULT +

      This is used for font enumeration and font creation as a ‘don't care’ value. Valid font files don't contain this value. When querying for information about the character set of the font that is currently selected into a specified device context, this return value (of the related Windows API) simply denotes failure.

      +
      FT_WinFNT_ID_SYMBOL +

      There is no known mapping table available.

      +
      FT_WinFNT_ID_MAC +

      Mac Roman encoding.

      +
      FT_WinFNT_ID_OEM +

      From Michael Pöttgen <michael@poettgen.de>:

      +

      The ‘Windows Font Mapping’ article says that FT_WinFNT_ID_OEM is used for the charset of vector fonts, like ‘modern.fon’, ‘roman.fon’, and ‘script.fon’ on Windows.

      +

      The ‘CreateFont’ documentation says: The FT_WinFNT_ID_OEM value specifies a character set that is operating-system dependent.

      +

      The ‘IFIMETRICS’ documentation from the ‘Windows Driver Development Kit’ says: This font supports an OEM-specific character set. The OEM character set is system dependent.

      +

      In general OEM, as opposed to ANSI (i.e., cp1252), denotes the second default codepage that most international versions of Windows have. It is one of the OEM codepages from

      +

      http://www.microsoft.com/globaldev/reference/cphome.mspx,

      +

      and is used for the ‘DOS boxes’, to support legacy applications. A German Windows version for example usually uses ANSI codepage 1252 and OEM codepage 850.

      +
      FT_WinFNT_ID_CP874 +

      A superset of Thai TIS 620 and ISO 8859-11.

      +
      FT_WinFNT_ID_CP932 +

      A superset of Japanese Shift-JIS (with minor deviations).

      +
      FT_WinFNT_ID_CP936 +

      A superset of simplified Chinese GB 2312-1980 (with different ordering and minor deviations).

      +
      FT_WinFNT_ID_CP949 +

      A superset of Korean Hangul KS C 5601-1987 (with different ordering and minor deviations).

      +
      FT_WinFNT_ID_CP950 +

      A superset of traditional Chinese Big 5 ETen (with different ordering and minor deviations).

      +
      FT_WinFNT_ID_CP1250 +

      A superset of East European ISO 8859-2 (with slightly different ordering).

      +
      FT_WinFNT_ID_CP1251 +

      A superset of Russian ISO 8859-5 (with different ordering).

      +
      FT_WinFNT_ID_CP1252 +

      ANSI encoding. A superset of ISO 8859-1.

      +
      FT_WinFNT_ID_CP1253 +

      A superset of Greek ISO 8859-7 (with minor modifications).

      +
      FT_WinFNT_ID_CP1254 +

      A superset of Turkish ISO 8859-9.

      +
      FT_WinFNT_ID_CP1255 +

      A superset of Hebrew ISO 8859-8 (with some modifications).

      +
      FT_WinFNT_ID_CP1256 +

      A superset of Arabic ISO 8859-6 (with different ordering).

      +
      FT_WinFNT_ID_CP1257 +

      A superset of Baltic ISO 8859-13 (with some deviations).

      +
      FT_WinFNT_ID_CP1258 +

      For Vietnamese. This encoding doesn't cover all necessary characters.

      +
      FT_WinFNT_ID_CP1361 +

      Korean (Johab).

      +
      +
      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_WinFNT_HeaderRec

      +
      +Defined in FT_WINFONTS_H (freetype/ftwinfnt.h). +

      +
      +
      +  typedef struct  FT_WinFNT_HeaderRec_
      +  {
      +    FT_UShort  version;
      +    FT_ULong   file_size;
      +    FT_Byte    copyright[60];
      +    FT_UShort  file_type;
      +    FT_UShort  nominal_point_size;
      +    FT_UShort  vertical_resolution;
      +    FT_UShort  horizontal_resolution;
      +    FT_UShort  ascent;
      +    FT_UShort  internal_leading;
      +    FT_UShort  external_leading;
      +    FT_Byte    italic;
      +    FT_Byte    underline;
      +    FT_Byte    strike_out;
      +    FT_UShort  weight;
      +    FT_Byte    charset;
      +    FT_UShort  pixel_width;
      +    FT_UShort  pixel_height;
      +    FT_Byte    pitch_and_family;
      +    FT_UShort  avg_width;
      +    FT_UShort  max_width;
      +    FT_Byte    first_char;
      +    FT_Byte    last_char;
      +    FT_Byte    default_char;
      +    FT_Byte    break_char;
      +    FT_UShort  bytes_per_row;
      +    FT_ULong   device_offset;
      +    FT_ULong   face_name_offset;
      +    FT_ULong   bits_pointer;
      +    FT_ULong   bits_offset;
      +    FT_Byte    reserved;
      +    FT_ULong   flags;
      +    FT_UShort  A_space;
      +    FT_UShort  B_space;
      +    FT_UShort  C_space;
      +    FT_UShort  color_table_offset;
      +    FT_ULong   reserved1[4];
      +
      +  } FT_WinFNT_HeaderRec;
      +
      +

      +
      +

      Windows FNT Header info.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_WinFNT_Header

      +
      +

      A handle to an FT_WinFNT_HeaderRec structure.

      +

      +
      +
      + + +
      [Index][TOC]
      + +
      +

      FT_Get_WinFNT_Header

      +
      +Defined in FT_WINFONTS_H (freetype/ftwinfnt.h). +

      +
      +
      +  FT_EXPORT( FT_Error )
      +  FT_Get_WinFNT_Header( FT_Face               face,
      +                        FT_WinFNT_HeaderRec  *aheader );
      +
      +

      +
      +

      Retrieve a Windows FNT font info header.

      +

      +
      input
      +

      + + +
      face +

      A handle to the input face.

      +
      +
      +
      output
      +

      + + +
      aheader +

      The WinFNT header.

      +
      +
      +
      return
      +

      FreeType error code. 0 means success.

      +
      +
      note
      +

      This function only works with Windows FNT faces, returning an error otherwise.

      +
      +
      +
      + + +
      [Index][TOC]
      + + + diff --git a/src/3rdparty/freetype/docs/release b/src/3rdparty/freetype/docs/release new file mode 100644 index 0000000000..e93f430df8 --- /dev/null +++ b/src/3rdparty/freetype/docs/release @@ -0,0 +1,166 @@ +How to prepare a new release +---------------------------- + +. include/freetype/freetype.h: Update FREETYPE_MAJOR, FREETYPE_MINOR, + and FREETYPE_PATCH. + +. Update version numbers in all files where necessary (for example, do + a grep for both `2.3.1' and `231' for release 2.3.1). + +. builds/unix/configure.raw: Update `version_info'. + +. docs/CHANGES: Document differences to last release. + +. README: Update. + +. docs/VERSION.DLL: Document changed `version_info'. + +. ChangeLog: Announce new release (both in freetype2 and ft2demos + modules). + +. Copy the CVS archive to another directory and run + + make distclean; make devel; make + make distclean; make devel; make multi + make distclean; make devel CC=g++; make CC=g++ + make distclean; make devel CC=g++; make multi CC=g++ + + sh autogen.sh + make distclean; ./configure; make + make distclean; ./configure CC=g++; make + + to test compilation with both gcc and g++. + +. Test C++ compilation for ft2demos too. + +. Tag the CVS (freetype2, ft2demos). + + TODO: Tag the home page CVS on savannah.nongnu.org. + +. Say `make dist' in both the freetype2 and ft2demos modules to + generate the .tar.gz, .tar.bz2, and .zip files. + +. Create the doc bundles (freetype-doc-.tar.gz, + freetype-doc-.tar.bz2, ftdoc.zip). This is + everything below + + freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/freetype2/docs/ + + except the `reference' subdirectory. Do *not* use option `-l' from + zip! + +. Run the following script (with updated `$VERSION', `$SAVANNAH_USER', + and $SOURCEFORGE_USER variables) to sign and upload the bundles to + both Savannah and SourceForge. The signing code has been taken from + the `gnupload' script (part of the automake bundle). + + #!/bin/sh + + VERSION=2.3.7 + SAVANNAH_USER=wl + SOURCEFORGE_USER=wlemb + + ##################################################################### + + GPG='/usr/bin/gpg --batch --no-tty' + + version=`echo $VERSION | sed "s/\\.//g"` + + UNIX_PACKAGES="freetype ft2demos freetype-doc" + WINDOWS_PACKAGES="ft ftdmo ftdoc" + UNIX_ZIP="tar.gz tar.bz2" + WINDOWS_ZIP="zip" + + PACKAGE_LIST= + for i in $UNIX_PACKAGES; do + for j in $UNIX_ZIP; do + PACKAGE_LIST="$PACKAGE_LIST $i-$VERSION.$j" + done + done + for i in $WINDOWS_PACKAGES; do + for j in $WINDOWS_ZIP; do + PACKAGE_LIST="$PACKAGE_LIST $i$version.$j" + done + done + + set -e + unset passphrase + + PATH=/empty echo -n "Enter GPG passphrase: " + stty -echo + read -r passphrase + stty echo + echo + + for f in $PACKAGE_LIST; do + if test ! -f $f; then + echo "$0: Cannot find \`$f'" 1>&2 + exit 1 + else + : + fi + done + + for f in $PACKAGE_LIST; do + echo "Signing $f..." + rm -f $f.sig + echo $passphrase | $GPG --passphrase-fd 0 -ba -o $f.sig $f + done + + SIGNATURE_LIST= + for i in $PACKAGE_LIST; do + SIGNATURE_LIST="$SIGNATURE_LIST $i.sig" + done + + scp $PACKAGE_LIST $SIGNATURE_LIST \ + $SAVANNAH_USER@dl.sv.nongnu.org:/releases/freetype/ + + rsync -avP -e ssh $PACKAGE_LIST $SIGNATURE_LIST \ + $SOURCEFORGE_USER@frs.sf.net:uploads/ + + # EOF + +. While files on savannah.gnu.org are automatically moved to the right + directory, it must be done manually on SourceForge. Do that now. + +. Update the FreeType release notes on SourceForge. + +. Copy the reference files (generated by `make dist') to + + freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/freetype2/docs/reference + + and + + shell.sf.net:/home/groups/f/fr/freetype/htdocs/freetype2/docs/reference + + TODO: Create FreeType home page CVS on savannah.nongnu.org and + update it accordingly. + + Write script to automatically do this. + + Mirror FreeType's savannah home page everywhere. + +. Update + + freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/index2.html + + and copy it to + + shell.sf.net:/home/groups/f/fr/freetype/htdocs/index2.html + +. Announce new release on freetype-announce@nongnu.org and to relevant + newsgroups. + +---------------------------------------------------------------------- + +Copyright 2003, 2005, 2006, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of release --- diff --git a/src/3rdparty/freetype/include/freetype/config/ftconfig.h b/src/3rdparty/freetype/include/freetype/config/ftconfig.h new file mode 100644 index 0000000000..3c0b8b1641 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/config/ftconfig.h @@ -0,0 +1,500 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* ANSI-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /* This ANSI version should stay in `include/freetype/config'. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + + /* There are systems (like the Texas Instruments 'C54x) where a `char' */ + /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ + /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ + /* `char' type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + + /* The size of an `int' type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `long' type!" +#endif + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /*************************************************************************/ + /* */ + /*
      */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Int16 */ + /* */ + /* */ + /* A typedef for a 16bit signed integer type. */ + /* */ + typedef signed short FT_Int16; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UInt16 */ + /* */ + /* */ + /* A typedef for a 16bit unsigned integer type. */ + /* */ + typedef unsigned short FT_UInt16; + + /* */ + + + /* this #if 0 ... #endif clause is for documentation purposes */ +#if 0 + + /*************************************************************************/ + /* */ + /* */ + /* FT_Int32 */ + /* */ + /* */ + /* A typedef for a 32bit signed integer type. The size depends on */ + /* the configuration. */ + /* */ + typedef signed XXX FT_Int32; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UInt32 */ + /* */ + /* A typedef for a 32bit unsigned integer type. The size depends on */ + /* the configuration. */ + /* */ + typedef unsigned XXX FT_UInt32; + + /* */ + +#endif + +#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */ + /* is defined. You can however ignore this rule by defining the */ + /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* undefine the 64-bit macros in strict ANSI compilation mode */ +#undef FT_LONG64 +#undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + /* Provide assembler fragments for performance-critical functions. */ + /* These must be defined `static __inline__' with GCC. */ + +#ifdef __GNUC__ + +#if defined( __arm__ ) && !defined( __thumb__ ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 t, t2; + + + asm __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ + "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ + "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) ); + return a; + } + +#endif /* __arm__ && !__thumb__ */ + +#if defined( i386 ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 result; + + + __asm__ __volatile__ ( + "imul %%edx\n" + "movl %%edx, %%ecx\n" + "sarl $31, %%ecx\n" + "addl $0x8000, %%ecx\n" + "addl %%ecx, %%eax\n" + "adcl $0, %%edx\n" + "shrl $16, %%eax\n" + "shll $16, %%edx\n" + "addl %%edx, %%eax\n" + : "=a"(result), "=d"(b) + : "a"(a), "d"(b) + : "%ecx", "cc" ); + return result; + } + +#endif /* i386 */ + +#endif /* __GNUC__ */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifdef FT_CONFIG_OPTION_INLINE_MULFIX +#ifdef FT_MULFIX_ASSEMBLER +#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER +#endif +#endif + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/config/ftheader.h b/src/3rdparty/freetype/include/freetype/config/ftheader.h new file mode 100644 index 0000000000..b63945dcbd --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/config/ftheader.h @@ -0,0 +1,780 @@ +/***************************************************************************/ +/* */ +/* ftheader.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FT_HEADER_H__ +#define __FT_HEADER_H__ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* nothing */ +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* nothing */ +#endif + + + /*************************************************************************/ + /* */ + /* Aliases for the FreeType 2 public and configuration files. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /*
      */ + /* header_file_macros */ + /* */ + /* */ + /* Header File Macros */ + /* */ + /* <Abstract> */ + /* Macro definitions used to #include specific header files. */ + /* */ + /* <Description> */ + /* The following macros are defined to the name of specific */ + /* FreeType~2 header files. They can be used directly in #include */ + /* statements as in: */ + /* */ + /* { */ + /* #include FT_FREETYPE_H */ + /* #include FT_MULTIPLE_MASTERS_H */ + /* #include FT_GLYPH_H */ + /* } */ + /* */ + /* There are several reasons why we are now using macros to name */ + /* public header files. The first one is that such macros are not */ + /* limited to the infamous 8.3~naming rule required by DOS (and */ + /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */ + /* */ + /* The second reason is that it allows for more flexibility in the */ + /* way FreeType~2 is installed on a given system. */ + /* */ + /*************************************************************************/ + + + /* configuration files */ + + /************************************************************************* + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h> +#endif + + /* */ + + /* public headers */ + + /************************************************************************* + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * base FreeType~2 API. + * + */ +#define FT_FREETYPE_H <freetype/freetype.h> + + + /************************************************************************* + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H <freetype/fterrors.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h> + + + /************************************************************************* + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H <freetype/ftsystem.h> + + + /************************************************************************* + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H <freetype/ftimage.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * basic data types defined by FreeType~2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H <freetype/fttypes.h> + + + /************************************************************************* + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list management API of FreeType~2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H <freetype/ftlist.h> + + + /************************************************************************* + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * scalable outline management API of FreeType~2. + * + */ +#define FT_OUTLINE_H <freetype/ftoutln.h> + + + /************************************************************************* + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H <freetype/ftsizes.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * module management API of FreeType~2. + * + */ +#define FT_MODULE_H <freetype/ftmodapi.h> + + + /************************************************************************* + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * renderer module management API of FreeType~2. + * + */ +#define FT_RENDER_H <freetype/ftrender.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the Type~1 format. + * + */ +#define FT_TYPE1_TABLES_H <freetype/t1tables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H <freetype/tttables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of TrueType four-byte `tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H <freetype/tttags.h> + + + /************************************************************************* + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a + * face. + * + */ +#define FT_BDF_H <freetype/ftbdf.h> + + + /************************************************************************* + * + * @macro: + * FT_CID_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which access CID font information from a + * face. + * + */ +#define FT_CID_H <freetype/ftcid.h> + + + /************************************************************************* + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H <freetype/ftgzip.h> + + + /************************************************************************* + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H <freetype/ftlzw.h> + + + /************************************************************************* + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H <freetype/ftwinfnt.h> + + + /************************************************************************* + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H <freetype/ftglyph.h> + + + /************************************************************************* + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H <freetype/ftbitmap.h> + + + /************************************************************************* + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H <freetype/ftbbox.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional FreeType~2 cache sub-system. + * + */ +#define FT_CACHE_H <freetype/ftcache.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `glyph image' API of the FreeType~2 cache sub-system. + * + * It is used to define a cache for @FT_Glyph elements. You can also + * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to + * store small glyph bitmaps, as it will use less memory. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * glyph image-related cache declarations. + * + */ +#define FT_CACHE_IMAGE_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_SMALL_BITMAPS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `small bitmaps' API of the FreeType~2 cache sub-system. + * + * It is used to define a cache for small glyph bitmaps in a relatively + * memory-efficient way. You can also use the API defined in + * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, + * including scalable outlines. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * small bitmaps-related cache declarations. + * + */ +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_CHARMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `charmap' API of the FreeType~2 cache sub-system. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * charmap-based cache declarations. + * + */ +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in #include statements to name the file containing the + * Macintosh-specific FreeType~2 API. The latter is used to access + * fonts embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H <freetype/ftmac.h> + + + /************************************************************************* + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional multiple-masters management API of FreeType~2. + * + */ +#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h> + + + /************************************************************************* + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which accesses embedded `name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H <freetype/ftsnames.h> + + + /************************************************************************* + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which validates OpenType tables (BASE, GDEF, + * GPOS, GSUB, JSTF). + * + */ +#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h> + + + /************************************************************************* + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat, + * mort, morx, bsln, just, kern, opbd, trak, prop). + * + */ +#define FT_GX_VALIDATE_H <freetype/ftgxval.h> + + + /************************************************************************* + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H <freetype/ftpfr.h> + + + /************************************************************************* + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H <freetype/ftstroke.h> + + + /************************************************************************* + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H <freetype/ftsynth.h> + + + /************************************************************************* + * + * @macro: + * FT_XFREE86_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which provides functions specific to the XFree86 and + * X.Org X11 servers. + */ +#define FT_XFREE86_H <freetype/ftxf86.h> + + + /************************************************************************* + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H <freetype/fttrigon.h> + + + /************************************************************************* + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H <freetype/ftlcdfil.h> + + + /************************************************************************* + * + * @macro: + * FT_UNPATENTED_HINTING_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h> + + + /************************************************************************* + * + * @macro: + * FT_INCREMENTAL_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + + + /************************************************************************* + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H <freetype/ftgasp.h> + + + /************************************************************************* + * + * @macro: + * FT_ADVANCES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which returns individual and ranged glyph advances. + */ +#define FT_ADVANCES_H <freetype/ftadvanc.h> + + + /* */ + +#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h> + + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to FT_CACHE_H at the moment just in case, but we know of */ + /* no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h> + + +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + +#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h> + + + /* + * Include internal headers definitions from <freetype/internal/...> + * only when building the library. + */ +#ifdef FT2_BUILD_LIBRARY +#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h> +#include FT_INTERNAL_INTERNAL_H +#endif /* FT2_BUILD_LIBRARY */ + + +#endif /* __FT2_BUILD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/config/ftmodule.h b/src/3rdparty/freetype/include/freetype/config/ftmodule.h new file mode 100644 index 0000000000..76d271a74b --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/config/ftmodule.h @@ -0,0 +1,32 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `<topdir>/objs/') based on information + * from `<topdir>/modules.cfg'. + * + * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile + * FreeType without GNU make. + * + */ + +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) + +/* EOF */ diff --git a/src/3rdparty/freetype/include/freetype/config/ftoption.h b/src/3rdparty/freetype/include/freetype/config/ftoption.h new file mode 100644 index 0000000000..597a2bb014 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/config/ftoption.h @@ -0,0 +1,693 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* This file contains the default configuration macro definitions for */ + /* a standard build of the FreeType library. There are three ways to */ + /* use this file to build project-specific versions of the library: */ + /* */ + /* - You can modify this file by hand, but this is not recommended in */ + /* cases where you would like to build several versions of the */ + /* library from a single source directory. */ + /* */ + /* - You can put a copy of this file in your build directory, more */ + /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ + /* is the name of a directory that is included _before_ the FreeType */ + /* include path during compilation. */ + /* */ + /* The default FreeType Makefiles and Jamfiles use the build */ + /* directory `builds/<system>' by default, but you can easily change */ + /* that for your own projects. */ + /* */ + /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */ + /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ + /* locate this file during the build. For example, */ + /* */ + /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */ + /* #include <freetype/config/ftheader.h> */ + /* */ + /* will use `$BUILD/myftoptions.h' instead of this file for macro */ + /* definitions. */ + /* */ + /* Note also that you can similarly pre-define the macro */ + /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ + /* that are statically linked to the library at compile time. By */ + /* default, this file is <freetype/config/ftmodule.h>. */ + /* */ + /* We highly recommend using the third method whenever possible. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Uncomment the line below if you want to activate sub-pixel rendering */ + /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ + /* */ + /* Note that this feature is covered by several Microsoft patents */ + /* and should not be activated in any default build of the library. */ + /* */ + /* This macro has no impact on the FreeType API, only on its */ + /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ + /* FT_Render_Glyph still generates a bitmap that is 3 times larger than */ + /* the original size; the difference will be that each triplet of */ + /* subpixels has R=G=B. */ + /* */ + /* This is done to allow FreeType clients to run unmodified, forcing */ + /* them to display normal gray-level anti-aliased glyphs. */ + /* */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /*************************************************************************/ + /* */ + /* Many compilers provide a non-ANSI 64-bit data type that can be used */ + /* by FreeType to speed up some computations. However, this will create */ + /* some problems when compiling the library in strict ANSI mode. */ + /* */ + /* For this reason, the use of 64-bit integers is normally disabled when */ + /* the __STDC__ macro is defined. You can however disable this by */ + /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ + /* */ + /* For most compilers, this will only create compilation warnings when */ + /* building the library. */ + /* */ + /* ObNote: The compiler-specific 64-bit integers are detected in the */ + /* file `ftconfig.h' either statically or through the */ + /* `configure' script on supported platforms. */ + /* */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /*************************************************************************/ + /* */ + /* If this macro is defined, do not try to use an assembler version of */ + /* performance-critical functions (e.g. FT_MulFix). You should only do */ + /* that to verify that the assembler function works properly, or to */ + /* execute benchmark tests of the various implementations. */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /*************************************************************************/ + /* */ + /* If this macro is defined, try to use an inlined assembler version of */ + /* the `FT_MulFix' function, which is a `hotspot' when loading and */ + /* hinting glyphs, and which should be executed as fast as possible. */ + /* */ + /* Note that if your compiler or CPU is not supported, this will default */ + /* to the standard and portable implementation found in `ftcalc.c'. */ + /* */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + + /*************************************************************************/ + /* */ + /* Gzip-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `gzip' program. This is mostly used to parse many of the PCF files */ + /* that come with XFree86. The implementation uses `zlib' to */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ + /* */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /*************************************************************************/ + /* */ + /* ZLib library selection */ + /* */ + /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ + /* It allows FreeType's `ftgzip' component to link to the system's */ + /* installation of the ZLib library. This is useful on systems like */ + /* Unix or VMS where it generally is already available. */ + /* */ + /* If you let it undefined, the component will use its own copy */ + /* of the zlib sources instead. These have been modified to be */ + /* included directly within the component and *not* export external */ + /* function names. This allows you to link any program with FreeType */ + /* _and_ ZLib without linking conflicts. */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /*************************************************************************/ + /* */ + /* DLL export compilation */ + /* */ + /* When compiling FreeType as a DLL, some systems/compilers need a */ + /* special keyword in front OR after the return type of function */ + /* declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ + /* */ + /* FT_EXPORT( return_type ) */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* */ + /* */ + /* FT_EXPORT_DEF( return_type ) */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* */ + /* You can provide your own implementation of FT_EXPORT and */ + /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ + /* will be later automatically defined as `extern return_type' to */ + /* allow normal compilation. */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_EXPORT(x) extern x */ +/* #define FT_EXPORT_DEF(x) x */ + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `psnames' module. This */ + /* module is in charge of converting a glyph name string into a */ + /* Unicode value, or return a Macintosh standard glyph name for the */ + /* use with the TrueType `post' table. */ + /* */ + /* Undefine this macro if you do not want `psnames' compiled in your */ + /* build of FreeType. This has the following effects: */ + /* */ + /* - The TrueType driver will provide its own set of glyph names, */ + /* if you build it to support postscript names in the TrueType */ + /* `post' table. */ + /* */ + /* - The Type 1 driver will not be able to synthesize a Unicode */ + /* charmap out of the glyphs found in the fonts. */ + /* */ + /* You would normally undefine this configuration macro when building */ + /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ + /* */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Postscript Names to Unicode Values support */ + /* */ + /* By default, FreeType 2 is built with the `PSNames' module compiled */ + /* in. Among other things, the module is used to convert a glyph name */ + /* into a Unicode value. This is especially useful in order to */ + /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ + /* through a big table named the `Adobe Glyph List' (AGL). */ + /* */ + /* Undefine this macro if you do not want the Adobe Glyph List */ + /* compiled in your `PSNames' module. The Type 1 driver will not be */ + /* able to synthesize a Unicode charmap out of the glyphs found in the */ + /* fonts. */ + /* */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /*************************************************************************/ + /* */ + /* Support for Mac fonts */ + /* */ + /* Define this macro if you want support for outline fonts in Mac */ + /* format (mac dfont, mac resource, macbinary containing a mac */ + /* resource) on non-Mac platforms. */ + /* */ + /* Note that the `FOND' resource isn't checked. */ + /* */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /*************************************************************************/ + /* */ + /* Allow the use of FT_Incremental_Interface to load typefaces that */ + /* contain no glyph data, but supply it via a callback function. */ + /* This allows FreeType to be used with the PostScript language, using */ + /* the GhostScript interpreter. */ + /* */ +/* #define FT_CONFIG_OPTION_INCREMENTAL */ + + + /*************************************************************************/ + /* */ + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ + /* */ + /* This must be greater than 4KByte if you use FreeType to rasterize */ + /* glyphs; otherwise, you may set it to zero to avoid unnecessary */ + /* allocation of the render pool. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384L + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 32 is the default. */ + /* */ +#define FT_MAX_MODULES 32 + + + /*************************************************************************/ + /* */ + /* Debug level */ + /* */ + /* FreeType can be compiled in debug or trace mode. In debug mode, */ + /* errors are reported through the `ftdebug' component. In trace */ + /* mode, additional messages are sent to the standard output during */ + /* execution. */ + /* */ + /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ + /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ + /* */ + /* Don't define any of these macros to compile in `release' mode! */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Memory Debugging */ + /* */ + /* FreeType now comes with an integrated memory debugger that is */ + /* capable of detecting simple errors like memory leaks or double */ + /* deletes. To compile it within your build of the library, you */ + /* should define FT_DEBUG_MEMORY here. */ + /* */ + /* Note that the memory debugger is only activated at runtime when */ + /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_DEBUG_MEMORY */ + + + /*************************************************************************/ + /* */ + /* Module errors */ + /* */ + /* If this macro is set (which is _not_ the default), the higher byte */ + /* of an error code gives the module in which the error has occurred, */ + /* while the lower byte is the real error code. */ + /* */ + /* Setting this macro makes sense for debugging purposes only, since */ + /* it would break source compatibility of certain programs that use */ + /* FreeType 2. */ + /* */ + /* More details can be found in the files ftmoderr.h and fterrors.h. */ + /* */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ + /* embedded bitmaps in all formats using the SFNT module (namely */ + /* TrueType & OpenType). */ + /* */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ + /* load and enumerate the glyph Postscript names in a TrueType or */ + /* OpenType file. */ + /* */ + /* Note that when you do not compile the `PSNames' module by undefining */ + /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ + /* contain additional code used to read the PS Names table from a font. */ + /* */ + /* (By default, the module uses `PSNames' to extract glyph names.) */ + /* */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ + /* access the internal name table in a SFNT-based format like TrueType */ + /* or OpenType. The name table contains various strings used to */ + /* describe the font, like family name, copyright, version, etc. It */ + /* does not contain any glyph name though. */ + /* */ + /* Accessing SFNT names is done through the functions declared in */ + /* `freetype/ftnames.h'. */ + /* */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /*************************************************************************/ + /* */ + /* TrueType CMap support */ + /* */ + /* Here you can fine-tune which TrueType CMap table format shall be */ + /* supported. */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ + /* a bytecode interpreter in the TrueType driver. Note that there are */ + /* important patent issues related to the use of the interpreter. */ + /* */ + /* By undefining this, you will only compile the code necessary to load */ + /* TrueType glyphs without hinting. */ + /* */ + /* Do not #undef this macro here, since the build system might */ + /* define it for certain configurations only. */ + /* */ +/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ + /* of the TrueType bytecode interpreter is used that doesn't implement */ + /* any of the patented opcodes and algorithms. Note that the */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you define */ + /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, either define */ + /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ + /* */ + /* This macro is only useful for a small number of font files (mostly */ + /* for Asian scripts) that require bytecode interpretation to properly */ + /* load glyphs. For all other fonts, this produces unpleasant results, */ + /* thus the unpatented interpreter is never used to load glyphs from */ + /* TrueType fonts unless one of the following two options is used. */ + /* */ + /* - The unpatented interpreter is explicitly activated by the user */ + /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ + /* when opening the FT_Face. */ + /* */ + /* - FreeType detects that the FT_Face corresponds to one of the */ + /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ + /* contains a hard-coded list of font names and other matching */ + /* parameters (see function `tt_face_init' in file */ + /* `src/truetype/ttobjs.c'). */ + /* */ + /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ + /* */ + /* { */ + /* FT_Parameter parameter; */ + /* FT_Open_Args open_args; */ + /* */ + /* */ + /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ + /* */ + /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ + /* open_args.pathname = my_font_pathname; */ + /* open_args.num_params = 1; */ + /* open_args.params = ¶meter; */ + /* */ + /* error = FT_Open_Face( library, &open_args, index, &face ); */ + /* ... */ + /* } */ + /* */ +#define TT_CONFIG_OPTION_UNPATENTED_HINTING + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ + /* bytecode interpreter with a huge switch statement, rather than a call */ + /* table. This results in smaller and faster code for a number of */ + /* architectures. */ + /* */ + /* Note however that on some compiler/processor combinations, undefining */ + /* this macro will generate faster, though larger, code. */ + /* */ +#define TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ + /* TrueType glyph loader to use Apple's definition of how to handle */ + /* component offsets in composite glyphs. */ + /* */ + /* Apple and MS disagree on the default behavior of component offsets */ + /* in composites. Apple says that they should be scaled by the scaling */ + /* factors in the transformation matrix (roughly, it's more complex) */ + /* while MS says they should not. OpenType defines two bits in the */ + /* composite flags array which can be used to disambiguate, but old */ + /* fonts will not have them. */ + /* */ + /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ + /* support for Apple's distortable font technology (fvar, gvar, cvar, */ + /* and avar tables). This has many similarities to Type 1 Multiple */ + /* Masters support. */ + /* */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ + /* */ +#define TT_CONFIG_OPTION_BDF + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ + /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ + /* required. */ + /* */ +#define T1_MAX_DICT_DEPTH 5 + + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 16 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ + /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ + /* files into an existing face. Note that if set, the T1 driver will be */ + /* unable to produce kerning distances. */ + /* */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of the Multiple Masters font support in the Type 1 */ + /* driver. */ + /* */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ + /* support. */ + /* */ +#define AF_CONFIG_OPTION_CJK + + /*************************************************************************/ + /* */ + /* Compile autofit module with Indic script support. */ + /* */ +#define AF_CONFIG_OPTION_INDIC + + /* */ + + + /* + * Define this variable if you want to keep the layout of internal + * structures that was used prior to FreeType 2.2. This also compiles in + * a few obsolete functions to avoid linking problems on typical Unix + * distributions. + * + * For embedded systems or building a new distribution from scratch, it + * is recommended to disable the macro since it reduces the library's code + * size and activates a few memory-saving optimizations as well. + */ +#define FT_CONFIG_OPTION_OLD_INTERNALS + + + /* + * This macro is defined if either unpatented or native TrueType + * hinting is requested by the definitions above. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER +#undef TT_CONFIG_OPTION_UNPATENTED_HINTING +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/config/ftstdlib.h b/src/3rdparty/freetype/include/freetype/config/ftstdlib.h new file mode 100644 index 0000000000..ce5557aef3 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/config/ftstdlib.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftstdlib.h */ +/* */ +/* ANSI-specific library and header configuration file (specification */ +/* only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to group all #includes to the ANSI C library that */ + /* FreeType normally requires. It also defines macros to rename the */ + /* standard functions within the FreeType source code. */ + /* */ + /* Load a file which defines __FTSTDLIB_H__ before this one to override */ + /* it. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSTDLIB_H__ +#define __FTSTDLIB_H__ + + +#include <stddef.h> + +#define ft_ptrdiff_t ptrdiff_t + + + /**********************************************************************/ + /* */ + /* integer limits */ + /* */ + /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ + /* of `int' and `long' in bytes at compile-time. So far, this works */ + /* for all platforms the library has been tested on. */ + /* */ + /* Note that on the extremely rare platforms that do not provide */ + /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ + /* old Crays where `int' is 36 bits), we do not make any guarantee */ + /* about the correct behaviour of FT2 with all fonts. */ + /* */ + /* In these case, `ftconfig.h' will refuse to compile anyway with a */ + /* message like `couldn't find 32-bit type' or something similar. */ + /* */ + /**********************************************************************/ + + +#include <limits.h> + +#define FT_CHAR_BIT CHAR_BIT +#define FT_INT_MAX INT_MAX +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX + + + /**********************************************************************/ + /* */ + /* character and string processing */ + /* */ + /**********************************************************************/ + + +#include <string.h> + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /**********************************************************************/ + /* */ + /* file handling */ + /* */ + /**********************************************************************/ + + +#include <stdio.h> + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_sprintf sprintf + + + /**********************************************************************/ + /* */ + /* sorting */ + /* */ + /**********************************************************************/ + + +#include <stdlib.h> + +#define ft_qsort qsort + + + /**********************************************************************/ + /* */ + /* memory allocation */ + /* */ + /**********************************************************************/ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /**********************************************************************/ + /* */ + /* miscellaneous */ + /* */ + /**********************************************************************/ + + +#define ft_atol atol +#define ft_labs labs + + + /**********************************************************************/ + /* */ + /* execution control */ + /* */ + /**********************************************************************/ + + +#include <setjmp.h> + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* jmp_buf is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(jmp_buf*) &(b) ) /* same thing here */ + + + /* the following is only used for debugging purposes, i.e., if */ + /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ + +#include <stdarg.h> + + +#endif /* __FTSTDLIB_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/freetype.h b/src/3rdparty/freetype/include/freetype/freetype.h new file mode 100644 index 0000000000..364388b5d6 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/freetype.h @@ -0,0 +1,3862 @@ +/***************************************************************************/ +/* */ +/* freetype.h */ +/* */ +/* FreeType high-level API and common types (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include <ft2build.h>" +#error " #include FT_FREETYPE_H" +#endif + + +#ifndef __FREETYPE_H__ +#define __FREETYPE_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* user_allocation */ + /* */ + /* <Title> */ + /* User allocation */ + /* */ + /* <Abstract> */ + /* How client applications should allocate FreeType data structures. */ + /* */ + /* <Description> */ + /* FreeType assumes that structures allocated by the user and passed */ + /* as arguments are zeroed out except for the actual data. In other */ + /* words, it is recommended to use `calloc' (or variants of it) */ + /* instead of `malloc' for allocation. */ + /* */ + /*************************************************************************/ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* base_interface */ + /* */ + /* <Title> */ + /* Base Interface */ + /* */ + /* <Abstract> */ + /* The FreeType~2 base font interface. */ + /* */ + /* <Description> */ + /* This section describes the public high-level API of FreeType~2. */ + /* */ + /* <Order> */ + /* FT_Library */ + /* FT_Face */ + /* FT_Size */ + /* FT_GlyphSlot */ + /* FT_CharMap */ + /* FT_Encoding */ + /* */ + /* FT_FaceRec */ + /* */ + /* FT_FACE_FLAG_SCALABLE */ + /* FT_FACE_FLAG_FIXED_SIZES */ + /* FT_FACE_FLAG_FIXED_WIDTH */ + /* FT_FACE_FLAG_HORIZONTAL */ + /* FT_FACE_FLAG_VERTICAL */ + /* FT_FACE_FLAG_SFNT */ + /* FT_FACE_FLAG_KERNING */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS */ + /* FT_FACE_FLAG_GLYPH_NAMES */ + /* FT_FACE_FLAG_EXTERNAL_STREAM */ + /* FT_FACE_FLAG_FAST_GLYPHS */ + /* FT_FACE_FLAG_HINTER */ + /* */ + /* FT_STYLE_FLAG_BOLD */ + /* FT_STYLE_FLAG_ITALIC */ + /* */ + /* FT_SizeRec */ + /* FT_Size_Metrics */ + /* */ + /* FT_GlyphSlotRec */ + /* FT_Glyph_Metrics */ + /* FT_SubGlyph */ + /* */ + /* FT_Bitmap_Size */ + /* */ + /* FT_Init_FreeType */ + /* FT_Done_FreeType */ + /* */ + /* FT_New_Face */ + /* FT_Done_Face */ + /* FT_New_Memory_Face */ + /* FT_Open_Face */ + /* FT_Open_Args */ + /* FT_Parameter */ + /* FT_Attach_File */ + /* FT_Attach_Stream */ + /* */ + /* FT_Set_Char_Size */ + /* FT_Set_Pixel_Sizes */ + /* FT_Request_Size */ + /* FT_Select_Size */ + /* FT_Size_Request_Type */ + /* FT_Size_Request */ + /* FT_Set_Transform */ + /* FT_Load_Glyph */ + /* FT_Get_Char_Index */ + /* FT_Get_Name_Index */ + /* FT_Load_Char */ + /* */ + /* FT_OPEN_MEMORY */ + /* FT_OPEN_STREAM */ + /* FT_OPEN_PATHNAME */ + /* FT_OPEN_DRIVER */ + /* FT_OPEN_PARAMS */ + /* */ + /* FT_LOAD_DEFAULT */ + /* FT_LOAD_RENDER */ + /* FT_LOAD_MONOCHROME */ + /* FT_LOAD_LINEAR_DESIGN */ + /* FT_LOAD_NO_SCALE */ + /* FT_LOAD_NO_HINTING */ + /* FT_LOAD_NO_BITMAP */ + /* FT_LOAD_CROP_BITMAP */ + /* */ + /* FT_LOAD_VERTICAL_LAYOUT */ + /* FT_LOAD_IGNORE_TRANSFORM */ + /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ + /* FT_LOAD_FORCE_AUTOHINT */ + /* FT_LOAD_NO_RECURSE */ + /* FT_LOAD_PEDANTIC */ + /* */ + /* FT_LOAD_TARGET_NORMAL */ + /* FT_LOAD_TARGET_LIGHT */ + /* FT_LOAD_TARGET_MONO */ + /* FT_LOAD_TARGET_LCD */ + /* FT_LOAD_TARGET_LCD_V */ + /* */ + /* FT_Render_Glyph */ + /* FT_Render_Mode */ + /* FT_Get_Kerning */ + /* FT_Kerning_Mode */ + /* FT_Get_Track_Kerning */ + /* FT_Get_Glyph_Name */ + /* FT_Get_Postscript_Name */ + /* */ + /* FT_CharMapRec */ + /* FT_Select_Charmap */ + /* FT_Set_Charmap */ + /* FT_Get_Charmap_Index */ + /* */ + /* FT_FSTYPE_INSTALLABLE_EMBEDDING */ + /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING */ + /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING */ + /* FT_FSTYPE_EDITABLE_EMBEDDING */ + /* FT_FSTYPE_NO_SUBSETTING */ + /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY */ + /* */ + /* FT_Get_FSType_Flags */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Glyph_Metrics */ + /* */ + /* <Description> */ + /* A structure used to model the metrics of a single glyph. The */ + /* values are expressed in 26.6 fractional pixel format; if the flag */ + /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */ + /* are expressed in font units instead. */ + /* */ + /* <Fields> */ + /* width :: */ + /* The glyph's width. */ + /* */ + /* height :: */ + /* The glyph's height. */ + /* */ + /* horiBearingX :: */ + /* Left side bearing for horizontal layout. */ + /* */ + /* horiBearingY :: */ + /* Top side bearing for horizontal layout. */ + /* */ + /* horiAdvance :: */ + /* Advance width for horizontal layout. */ + /* */ + /* vertBearingX :: */ + /* Left side bearing for vertical layout. */ + /* */ + /* vertBearingY :: */ + /* Top side bearing for vertical layout. */ + /* */ + /* vertAdvance :: */ + /* Advance height for vertical layout. */ + /* */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap_Size */ + /* */ + /* <Description> */ + /* This structure models the metrics of a bitmap strike (i.e., a set */ + /* of glyphs for a given point size and resolution) in a bitmap font. */ + /* It is used for the `available_sizes' field of @FT_Face. */ + /* */ + /* <Fields> */ + /* height :: The vertical distance, in pixels, between two */ + /* consecutive baselines. It is always positive. */ + /* */ + /* width :: The average width, in pixels, of all glyphs in the */ + /* strike. */ + /* */ + /* size :: The nominal size of the strike in 26.6 fractional */ + /* points. This field is not very useful. */ + /* */ + /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */ + /* pixels. */ + /* */ + /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */ + /* pixels. */ + /* */ + /* <Note> */ + /* Windows FNT: */ + /* The nominal size given in a FNT font is not reliable. Thus when */ + /* the driver finds it incorrect, it sets `size' to some calculated */ + /* values and sets `x_ppem' and `y_ppem' to the pixel width and */ + /* height given in the font, respectively. */ + /* */ + /* TrueType embedded bitmaps: */ + /* `size', `width', and `height' values are not contained in the */ + /* bitmap strike itself. They are computed from the global font */ + /* parameters. */ + /* */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Library */ + /* */ + /* <Description> */ + /* A handle to a FreeType library instance. Each `library' is */ + /* completely independent from the others; it is the `root' of a set */ + /* of objects like fonts, faces, sizes, etc. */ + /* */ + /* It also embeds a memory manager (see @FT_Memory), as well as a */ + /* scan-line converter object (see @FT_Raster). */ + /* */ + /* For multi-threading applications each thread should have its own */ + /* FT_Library object. */ + /* */ + /* <Note> */ + /* Library objects are normally created by @FT_Init_FreeType, and */ + /* destroyed with @FT_Done_FreeType. */ + /* */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Module */ + /* */ + /* <Description> */ + /* A handle to a given FreeType module object. Each module can be a */ + /* font driver, a renderer, or anything else that provides services */ + /* to the formers. */ + /* */ + typedef struct FT_ModuleRec_* FT_Module; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Driver */ + /* */ + /* <Description> */ + /* A handle to a given FreeType font driver object. Each font driver */ + /* is a special module capable of creating faces from font files. */ + /* */ + typedef struct FT_DriverRec_* FT_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Renderer */ + /* */ + /* <Description> */ + /* A handle to a given FreeType renderer. A renderer is a special */ + /* module in charge of converting a glyph image to a bitmap, when */ + /* necessary. Each renderer supports a given glyph image format, and */ + /* one or more target surface depths. */ + /* */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face */ + /* */ + /* <Description> */ + /* A handle to a given typographic face object. A face object models */ + /* a given typeface, in a given style. */ + /* */ + /* <Note> */ + /* Each face object also owns a single @FT_GlyphSlot object, as well */ + /* as one or more @FT_Size objects. */ + /* */ + /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ + /* a given filepathname or a custom input stream. */ + /* */ + /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ + /* */ + /* <Also> */ + /* See @FT_FaceRec for the publicly accessible fields of a given face */ + /* object. */ + /* */ + typedef struct FT_FaceRec_* FT_Face; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size */ + /* */ + /* <Description> */ + /* A handle to an object used to model a face scaled to a given */ + /* character size. */ + /* */ + /* <Note> */ + /* Each @FT_Face has an _active_ @FT_Size object that is used by */ + /* functions like @FT_Load_Glyph to determine the scaling */ + /* transformation which is used to load and hint glyphs and metrics. */ + /* */ + /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */ + /* @FT_Request_Size or even @FT_Select_Size to change the content */ + /* (i.e., the scaling values) of the active @FT_Size. */ + /* */ + /* You can use @FT_New_Size to create additional size objects for a */ + /* given @FT_Face, but they won't be used by other functions until */ + /* you activate it through @FT_Activate_Size. Only one size can be */ + /* activated at any given time per face. */ + /* */ + /* <Also> */ + /* See @FT_SizeRec for the publicly accessible fields of a given size */ + /* object. */ + /* */ + typedef struct FT_SizeRec_* FT_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a given `glyph slot'. A slot is a container where it */ + /* is possible to load any of the glyphs contained in its parent */ + /* face. */ + /* */ + /* In other words, each time you call @FT_Load_Glyph or */ + /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ + /* i.e., the glyph's metrics, its image (bitmap or outline), and */ + /* other control information. */ + /* */ + /* <Also> */ + /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */ + /* */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_CharMap */ + /* */ + /* <Description> */ + /* A handle to a given character map. A charmap is used to translate */ + /* character codes in a given encoding into glyph indexes for its */ + /* parent's face. Some font formats may provide several charmaps per */ + /* font. */ + /* */ + /* Each face object owns zero or more charmaps, but only one of them */ + /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */ + /* */ + /* The list of available charmaps in a face is available through the */ + /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */ + /* */ + /* The currently active charmap is available as `face->charmap'. */ + /* You should call @FT_Set_Charmap to change it. */ + /* */ + /* <Note> */ + /* When a new face is created (either through @FT_New_Face or */ + /* @FT_Open_Face), the library looks for a Unicode charmap within */ + /* the list and automatically activates it. */ + /* */ + /* <Also> */ + /* See @FT_CharMapRec for the publicly accessible fields of a given */ + /* character map. */ + /* */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_ENC_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags into an unsigned long. It is */ + /* used to define `encoding' identifiers (see @FT_Encoding). */ + /* */ + /* <Note> */ + /* Since many 16-bit compilers don't like 32-bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_ENC_TAG( value, a, b, c, d ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Encoding */ + /* */ + /* <Description> */ + /* An enumeration used to specify character sets supported by */ + /* charmaps. Used in the @FT_Select_Charmap API function. */ + /* */ + /* <Note> */ + /* Despite the name, this enumeration lists specific character */ + /* repertories (i.e., charsets), and not text encoding methods (e.g., */ + /* UTF-8, UTF-16, GB2312_EUC, etc.). */ + /* */ + /* Because of 32-bit charcodes defined in Unicode (i.e., surrogates), */ + /* all character codes must be expressed as FT_Longs. */ + /* */ + /* Other encodings might be defined in the future. */ + /* */ + /* <Values> */ + /* FT_ENCODING_NONE :: */ + /* The encoding value~0 is reserved. */ + /* */ + /* FT_ENCODING_UNICODE :: */ + /* Corresponds to the Unicode character set. This value covers */ + /* all versions of the Unicode repertoire, including ASCII and */ + /* Latin-1. Most fonts include a Unicode charmap, but not all */ + /* of them. */ + /* */ + /* FT_ENCODING_MS_SYMBOL :: */ + /* Corresponds to the Microsoft Symbol encoding, used to encode */ + /* mathematical symbols in the 32..255 character code range. For */ + /* more information, see `http://www.ceviz.net/symbol.htm'. */ + /* */ + /* FT_ENCODING_SJIS :: */ + /* Corresponds to Japanese SJIS encoding. More info at */ + /* at `http://langsupport.japanreference.com/encoding.shtml'. */ + /* See note on multi-byte encodings below. */ + /* */ + /* FT_ENCODING_GB2312 :: */ + /* Corresponds to an encoding system for Simplified Chinese as used */ + /* used in mainland China. */ + /* */ + /* FT_ENCODING_BIG5 :: */ + /* Corresponds to an encoding system for Traditional Chinese as */ + /* used in Taiwan and Hong Kong. */ + /* */ + /* FT_ENCODING_WANSUNG :: */ + /* Corresponds to the Korean encoding system known as Wansung. */ + /* For more information see */ + /* `http://www.microsoft.com/typography/unicode/949.txt'. */ + /* */ + /* FT_ENCODING_JOHAB :: */ + /* The Korean standard character set (KS~C 5601-1992), which */ + /* corresponds to MS Windows code page 1361. This character set */ + /* includes all possible Hangeul character combinations. */ + /* */ + /* FT_ENCODING_ADOBE_LATIN_1 :: */ + /* Corresponds to a Latin-1 encoding as defined in a Type~1 */ + /* PostScript font. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_ADOBE_STANDARD :: */ + /* Corresponds to the Adobe Standard encoding, as found in Type~1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_EXPERT :: */ + /* Corresponds to the Adobe Expert encoding, as found in Type~1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_CUSTOM :: */ + /* Corresponds to a custom encoding, as found in Type~1, CFF, and */ + /* OpenType/CFF fonts. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_APPLE_ROMAN :: */ + /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */ + /* and OpenType fonts contain a charmap for this encoding, since */ + /* older versions of Mac OS are able to use it. */ + /* */ + /* FT_ENCODING_OLD_LATIN_2 :: */ + /* This value is deprecated and was never used nor reported by */ + /* FreeType. Don't use or test for it. */ + /* */ + /* FT_ENCODING_MS_SJIS :: */ + /* Same as FT_ENCODING_SJIS. Deprecated. */ + /* */ + /* FT_ENCODING_MS_GB2312 :: */ + /* Same as FT_ENCODING_GB2312. Deprecated. */ + /* */ + /* FT_ENCODING_MS_BIG5 :: */ + /* Same as FT_ENCODING_BIG5. Deprecated. */ + /* */ + /* FT_ENCODING_MS_WANSUNG :: */ + /* Same as FT_ENCODING_WANSUNG. Deprecated. */ + /* */ + /* FT_ENCODING_MS_JOHAB :: */ + /* Same as FT_ENCODING_JOHAB. Deprecated. */ + /* */ + /* <Note> */ + /* By default, FreeType automatically synthesizes a Unicode charmap */ + /* for PostScript fonts, using their glyph names dictionaries. */ + /* However, it also reports the encodings defined explicitly in the */ + /* font file, for the cases when they are needed, with the Adobe */ + /* values as well. */ + /* */ + /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ + /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ + /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */ + /* which encoding is really present. If, for example, the */ + /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */ + /* the font is encoded in KOI8-R. */ + /* */ + /* FT_ENCODING_NONE is always set (with a single exception) by the */ + /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */ + /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */ + /* which encoding is really present. For example, */ + /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */ + /* Russian). */ + /* */ + /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */ + /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */ + /* FT_ENCODING_APPLE_ROMAN). */ + /* */ + /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */ + /* @FT_Get_CMap_Language_ID to query the Mac language ID which may */ + /* be needed to be able to distinguish Apple encoding variants. See */ + /* */ + /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */ + /* */ + /* to get an idea how to do that. Basically, if the language ID */ + /* is~0, don't use it, otherwise subtract 1 from the language ID. */ + /* Then examine `encoding_id'. If, for example, `encoding_id' is */ + /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */ + /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ + /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */ + /* variant the Arabic encoding. */ + /* */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backwards compatibility */ + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_encoding_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated; use the corresponding @FT_Encoding */ + /* values instead. */ + /* */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_GB2312 +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_CharMapRec */ + /* */ + /* <Description> */ + /* The base charmap structure. */ + /* */ + /* <Fields> */ + /* face :: A handle to the parent face object. */ + /* */ + /* encoding :: An @FT_Encoding tag identifying the charmap. Use */ + /* this with @FT_Select_Charmap. */ + /* */ + /* platform_id :: An ID number describing the platform for the */ + /* following encoding ID. This comes directly from */ + /* the TrueType specification and should be emulated */ + /* for other formats. */ + /* */ + /* encoding_id :: A platform specific encoding number. This also */ + /* comes from the TrueType specification and should be */ + /* emulated similarly. */ + /* */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Face_InternalRec' structure, used to */ + /* model private data of a given @FT_Face object. */ + /* */ + /* This structure might change between releases of FreeType~2 and is */ + /* not generally available to client applications. */ + /* */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_FaceRec */ + /* */ + /* <Description> */ + /* FreeType root face class structure. A face object models a */ + /* typeface in a font file. */ + /* */ + /* <Fields> */ + /* num_faces :: The number of faces in the font file. Some */ + /* font formats can have multiple faces in */ + /* a font file. */ + /* */ + /* face_index :: The index of the face in the font file. It */ + /* is set to~0 if there is only one face in */ + /* the font file. */ + /* */ + /* face_flags :: A set of bit flags that give important */ + /* information about the face; see */ + /* @FT_FACE_FLAG_XXX for the details. */ + /* */ + /* style_flags :: A set of bit flags indicating the style of */ + /* the face; see @FT_STYLE_FLAG_XXX for the */ + /* details. */ + /* */ + /* num_glyphs :: The number of glyphs in the face. If the */ + /* face is scalable and has sbits (see */ + /* `num_fixed_sizes'), it is set to the number */ + /* of outline glyphs. */ + /* */ + /* For CID-keyed fonts, this value gives the */ + /* highest CID used in the font. */ + /* */ + /* family_name :: The face's family name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's family (like `Times New */ + /* Roman', `Bodoni', `Garamond', etc). This */ + /* is a least common denominator used to list */ + /* fonts. Some formats (TrueType & OpenType) */ + /* provide localized and Unicode versions of */ + /* this string. Applications should use the */ + /* format specific interface to access them. */ + /* Can be NULL (e.g., in fonts embedded in a */ + /* PDF file). */ + /* */ + /* style_name :: The face's style name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's style (like `Italic', */ + /* `Bold', `Condensed', etc). Not all font */ + /* formats provide a style name, so this field */ + /* is optional, and can be set to NULL. As */ + /* for `family_name', some formats provide */ + /* localized and Unicode versions of this */ + /* string. Applications should use the format */ + /* specific interface to access them. */ + /* */ + /* num_fixed_sizes :: The number of bitmap strikes in the face. */ + /* Even if the face is scalable, there might */ + /* still be bitmap strikes, which are called */ + /* `sbits' in that case. */ + /* */ + /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */ + /* strikes in the face. It is set to NULL if */ + /* there is no bitmap strike. */ + /* */ + /* num_charmaps :: The number of charmaps in the face. */ + /* */ + /* charmaps :: An array of the charmaps of the face. */ + /* */ + /* generic :: A field reserved for client uses. See the */ + /* @FT_Generic type description. */ + /* */ + /* bbox :: The font bounding box. Coordinates are */ + /* expressed in font units (see */ + /* `units_per_EM'). The box is large enough */ + /* to contain any glyph from the font. Thus, */ + /* `bbox.yMax' can be seen as the `maximal */ + /* ascender', and `bbox.yMin' as the `minimal */ + /* descender'. Only relevant for scalable */ + /* formats. */ + /* */ + /* Note that the bounding box might be off by */ + /* (at least) one pixel for hinted fonts. See */ + /* @FT_Size_Metrics for further discussion. */ + /* */ + /* units_per_EM :: The number of font units per EM square for */ + /* this face. This is typically 2048 for */ + /* TrueType fonts, and 1000 for Type~1 fonts. */ + /* Only relevant for scalable formats. */ + /* */ + /* ascender :: The typographic ascender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMax'. Only relevant for scalable */ + /* formats. */ + /* */ + /* descender :: The typographic descender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMin'. Note that this field is */ + /* usually negative. Only relevant for */ + /* scalable formats. */ + /* */ + /* height :: The height is the vertical distance */ + /* between two consecutive baselines, */ + /* expressed in font units. It is always */ + /* positive. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_width :: The maximal advance width, in font units, */ + /* for all glyphs in this face. This can be */ + /* used to make word wrapping computations */ + /* faster. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_height :: The maximal advance height, in font units, */ + /* for all glyphs in this face. This is only */ + /* relevant for vertical layouts, and is set */ + /* to `height' for fonts that do not provide */ + /* vertical metrics. Only relevant for */ + /* scalable formats. */ + /* */ + /* underline_position :: The position, in font units, of the */ + /* underline line for this face. It is the */ + /* center of the underlining stem. Only */ + /* relevant for scalable formats. */ + /* */ + /* underline_thickness :: The thickness, in font units, of the */ + /* underline for this face. Only relevant for */ + /* scalable formats. */ + /* */ + /* glyph :: The face's associated glyph slot(s). */ + /* */ + /* size :: The current active size for this face. */ + /* */ + /* charmap :: The current active charmap for this face. */ + /* */ + /* <Note> */ + /* Fields may be changed after a call to @FT_Attach_File or */ + /* @FT_Attach_Stream. */ + /* */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness') */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; + void* extensions; + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FACE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `face_flags' field of the */ + /* @FT_FaceRec structure. They inform client applications of */ + /* properties of the corresponding face. */ + /* */ + /* <Values> */ + /* FT_FACE_FLAG_SCALABLE :: */ + /* Indicates that the face contains outline glyphs. This doesn't */ + /* prevent bitmap strikes, i.e., a face can have both this and */ + /* and @FT_FACE_FLAG_FIXED_SIZES set. */ + /* */ + /* FT_FACE_FLAG_FIXED_SIZES :: */ + /* Indicates that the face contains bitmap strikes. See also the */ + /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */ + /* */ + /* FT_FACE_FLAG_FIXED_WIDTH :: */ + /* Indicates that the face contains fixed-width characters (like */ + /* Courier, Lucido, MonoType, etc.). */ + /* */ + /* FT_FACE_FLAG_SFNT :: */ + /* Indicates that the face uses the `sfnt' storage scheme. For */ + /* now, this means TrueType and OpenType. */ + /* */ + /* FT_FACE_FLAG_HORIZONTAL :: */ + /* Indicates that the face contains horizontal glyph metrics. This */ + /* should be set for all common formats. */ + /* */ + /* FT_FACE_FLAG_VERTICAL :: */ + /* Indicates that the face contains vertical glyph metrics. This */ + /* is only available in some formats, not all of them. */ + /* */ + /* FT_FACE_FLAG_KERNING :: */ + /* Indicates that the face contains kerning information. If set, */ + /* the kerning distance can be retrieved through the function */ + /* @FT_Get_Kerning. Otherwise the function always return the */ + /* vector (0,0). Note that FreeType doesn't handle kerning data */ + /* from the `GPOS' table (as present in some OpenType fonts). */ + /* */ + /* FT_FACE_FLAG_FAST_GLYPHS :: */ + /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ + /* */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ + /* Indicates that the font contains multiple masters and is capable */ + /* of interpolating between them. See the multiple-masters */ + /* specific API for details. */ + /* */ + /* FT_FACE_FLAG_GLYPH_NAMES :: */ + /* Indicates that the font contains glyph names that can be */ + /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */ + /* fonts contain broken glyph name tables. Use the function */ + /* @FT_Has_PS_Glyph_Names when needed. */ + /* */ + /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ + /* Used internally by FreeType to indicate that a face's stream was */ + /* provided by the client application and should not be destroyed */ + /* when @FT_Done_Face is called. Don't read or test this flag. */ + /* */ + /* FT_FACE_FLAG_HINTER :: */ + /* Set if the font driver has a hinting machine of its own. For */ + /* example, with TrueType fonts, it makes sense to use data from */ + /* the SFNT `gasp' table only if the native TrueType hinting engine */ + /* (with the bytecode interpreter) is available and active. */ + /* */ + /* FT_FACE_FLAG_CID_KEYED :: */ + /* Set if the font is CID-keyed. In that case, the font is not */ + /* accessed by glyph indices but by CID values. For subsetted */ + /* CID-keyed fonts this has the consequence that not all index */ + /* values are a valid argument to FT_Load_Glyph. Only the CID */ + /* values for which corresponding glyphs in the subsetted font */ + /* exist make FT_Load_Glyph return successfully; in all other cases */ + /* you get an `FT_Err_Invalid_Argument' error. */ + /* */ + /* Note that CID-keyed fonts which are in an SFNT wrapper don't */ + /* have this flag set since the glyphs are accessed in the normal */ + /* way (using contiguous indices); the `CID-ness' isn't visible to */ + /* the application. */ + /* */ + /* FT_FACE_FLAG_TRICKY :: */ + /* Set if the font is `tricky', this is, it always needs the */ + /* font format's native hinting engine to get a reasonable result. */ + /* A typical example is the Chinese font `mingli.ttf' which uses */ + /* TrueType bytecode instructions to move and scale all of its */ + /* subglyphs. */ + /* */ + /* It is not possible to autohint such fonts using */ + /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */ + /* @FT_LOAD_NO_HINTING. You have to set both FT_LOAD_NO_HINTING */ + /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */ + /* probably never want this except for demonstration purposes. */ + /* */ + /* Currently, there are six TrueType fonts in the list of tricky */ + /* fonts; they are hard-coded in file `ttobjs.c'. */ + /* */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_HORIZONTAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains + * horizontal metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_VERTICAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains vertical + * metrics. + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_VERTICAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_KERNING( face ) + * + * @description: + * A macro that returns true whenever a face object contains kerning + * data that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( face->face_flags & FT_FACE_FLAG_KERNING ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SCALABLE( face ) + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, + * and PFR font formats. + * + */ +#define FT_IS_SCALABLE( face ) \ + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SFNT( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font + * whose format is based on the SFNT storage scheme. This usually + * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded + * bitmap fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( face->face_flags & FT_FACE_FLAG_SFNT ) + + + /************************************************************************* + * + * @macro: + * FT_IS_FIXED_WIDTH( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or `monospace', `fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FIXED_SIZES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes' field of the + * @FT_FaceRec structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FAST_GLYPHS( face ) + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************* + * + * @macro: + * FT_HAS_GLYPH_NAMES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + + + /************************************************************************* + * + * @macro: + * FT_IS_CID_KEYED( face ) + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more + * details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( face->face_flags & FT_FACE_FLAG_CID_KEYED ) + + + /************************************************************************* + * + * @macro: + * FT_IS_TRICKY( face ) + * + * @description: + * A macro that returns true whenever a face represents a `tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( face->face_flags & FT_FACE_FLAG_TRICKY ) + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* FT_STYLE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit-flags used to indicate the style of a given face. */ + /* These are used in the `style_flags' field of @FT_FaceRec. */ + /* */ + /* <Values> */ + /* FT_STYLE_FLAG_ITALIC :: */ + /* Indicates that a given face style is italic or oblique. */ + /* */ + /* FT_STYLE_FLAG_BOLD :: */ + /* Indicates that a given face is bold. */ + /* */ + /* <Note> */ + /* The style information as provided by FreeType is very basic. More */ + /* details are beyond the scope and should be done on a higher level */ + /* (for example, by analyzing various fields of the `OS/2' table in */ + /* SFNT based fonts). */ + /* */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Size_InternalRec' structure, used to */ + /* model private data of a given @FT_Size object. */ + /* */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Metrics */ + /* */ + /* <Description> */ + /* The size metrics structure gives the metrics of a size object. */ + /* */ + /* <Fields> */ + /* x_ppem :: The width of the scaled EM square in pixels, hence */ + /* the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal width'. */ + /* */ + /* y_ppem :: The height of the scaled EM square in pixels, */ + /* hence the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal height'. */ + /* */ + /* x_scale :: A 16.16 fractional scaling value used to convert */ + /* horizontal metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* y_scale :: A 16.16 fractional scaling value used to convert */ + /* vertical metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* ascender :: The ascender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* descender :: The descender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* height :: The height in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* max_advance :: The maximal advance width in 26.6 fractional */ + /* pixels. See @FT_FaceRec for the details. */ + /* */ + /* <Note> */ + /* The scaling values, if relevant, are determined first during a */ + /* size changing operation. The remaining fields are then set by the */ + /* driver. For scalable formats, they are usually set to scaled */ + /* values of the corresponding fields in @FT_FaceRec. */ + /* */ + /* Note that due to glyph hinting, these values might not be exact */ + /* for certain fonts. Thus they must be treated as unreliable */ + /* with an error margin of at least one pixel! */ + /* */ + /* Indeed, the only way to get the exact metrics is to render _all_ */ + /* glyphs. As this would be a definite performance hit, it is up to */ + /* client applications to perform such computations. */ + /* */ + /* The FT_Size_Metrics structure is valid for bitmap fonts also. */ + /* */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SizeRec */ + /* */ + /* <Description> */ + /* FreeType root size class structure. A size object models a face */ + /* object at a given size. */ + /* */ + /* <Fields> */ + /* face :: Handle to the parent face object. */ + /* */ + /* generic :: A typeless pointer, which is unused by the FreeType */ + /* library or any of its drivers. It can be used by */ + /* client applications to link their own data to each size */ + /* object. */ + /* */ + /* metrics :: Metrics for this size object. This field is read-only. */ + /* */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SubGlyph */ + /* */ + /* <Description> */ + /* The subglyph structure is an internal object used to describe */ + /* subglyphs (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The subglyph implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + /* You can however retrieve subglyph information with */ + /* @FT_Get_SubGlyph_Info. */ + /* */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Slot_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */ + /* model private data of a given @FT_GlyphSlot object. */ + /* */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphSlotRec */ + /* */ + /* <Description> */ + /* FreeType root glyph slot class structure. A glyph slot is a */ + /* container where individual glyphs can be loaded, be they in */ + /* outline or bitmap format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library instance */ + /* this slot belongs to. */ + /* */ + /* face :: A handle to the parent face object. */ + /* */ + /* next :: In some cases (like some font tools), several */ + /* glyph slots per face object can be a good */ + /* thing. As this is rare, the glyph slots are */ + /* listed through a direct, single-linked list */ + /* using its `next' field. */ + /* */ + /* generic :: A typeless pointer which is unused by the */ + /* FreeType library or any of its drivers. It */ + /* can be used by client applications to link */ + /* their own data to each glyph slot object. */ + /* */ + /* metrics :: The metrics of the last loaded glyph in the */ + /* slot. The returned values depend on the last */ + /* load flags (see the @FT_Load_Glyph API */ + /* function) and can be expressed either in 26.6 */ + /* fractional pixels or font units. */ + /* */ + /* Note that even when the glyph image is */ + /* transformed, the metrics are not. */ + /* */ + /* linearHoriAdvance :: The advance width of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* linearVertAdvance :: The advance height of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* advance :: This is the transformed advance width for the */ + /* glyph (in 26.6 fractional pixel format). */ + /* */ + /* format :: This field indicates the format of the image */ + /* contained in the glyph slot. Typically */ + /* @FT_GLYPH_FORMAT_BITMAP, */ + /* @FT_GLYPH_FORMAT_OUTLINE, or */ + /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */ + /* possible. */ + /* */ + /* bitmap :: This field is used as a bitmap descriptor */ + /* when the slot format is */ + /* @FT_GLYPH_FORMAT_BITMAP. Note that the */ + /* address and content of the bitmap buffer can */ + /* change between calls of @FT_Load_Glyph and a */ + /* few other functions. */ + /* */ + /* bitmap_left :: This is the bitmap's left bearing expressed */ + /* in integer pixels. Of course, this is only */ + /* valid if the format is */ + /* @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* bitmap_top :: This is the bitmap's top bearing expressed in */ + /* integer pixels. Remember that this is the */ + /* distance from the baseline to the top-most */ + /* glyph scanline, upwards y~coordinates being */ + /* *positive*. */ + /* */ + /* outline :: The outline descriptor for the current glyph */ + /* image if its format is */ + /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */ + /* loaded, `outline' can be transformed, */ + /* distorted, embolded, etc. However, it must */ + /* not be freed. */ + /* */ + /* num_subglyphs :: The number of subglyphs in a composite glyph. */ + /* This field is only valid for the composite */ + /* glyph format that should normally only be */ + /* loaded with the @FT_LOAD_NO_RECURSE flag. */ + /* For now this is internal to FreeType. */ + /* */ + /* subglyphs :: An array of subglyph descriptors for */ + /* composite glyphs. There are `num_subglyphs' */ + /* elements in there. Currently internal to */ + /* FreeType. */ + /* */ + /* control_data :: Certain font drivers can also return the */ + /* control data for a given glyph image (e.g. */ + /* TrueType bytecode, Type~1 charstrings, etc.). */ + /* This field is a pointer to such data. */ + /* */ + /* control_len :: This is the length in bytes of the control */ + /* data. */ + /* */ + /* other :: Really wicked formats can use this pointer to */ + /* present their own glyph image to client */ + /* applications. Note that the application */ + /* needs to know about the image format. */ + /* */ + /* lsb_delta :: The difference between hinted and unhinted */ + /* left side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* rsb_delta :: The difference between hinted and unhinted */ + /* right side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* <Note> */ + /* If @FT_Load_Glyph is called with default flags (see */ + /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */ + /* its native format (e.g., an outline glyph for TrueType and Type~1 */ + /* formats). */ + /* */ + /* This image can later be converted into a bitmap by calling */ + /* @FT_Render_Glyph. This function finds the current renderer for */ + /* the native image's format, then invokes it. */ + /* */ + /* The renderer is in charge of transforming the native image through */ + /* the slot's face transformation fields, then converting it into a */ + /* bitmap that is returned in `slot->bitmap'. */ + /* */ + /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */ + /* to specify the position of the bitmap relative to the current pen */ + /* position (e.g., coordinates (0,0) on the baseline). Of course, */ + /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* <Note> */ + /* Here a small pseudo code fragment which shows how to use */ + /* `lsb_delta' and `rsb_delta': */ + /* */ + /* { */ + /* FT_Pos origin_x = 0; */ + /* FT_Pos prev_rsb_delta = 0; */ + /* */ + /* */ + /* for all glyphs do */ + /* <compute kern between current and previous glyph and add it to */ + /* `origin_x'> */ + /* */ + /* <load glyph with `FT_Load_Glyph'> */ + /* */ + /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */ + /* origin_x -= 64; */ + /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */ + /* origin_x += 64; */ + /* */ + /* prev_rsb_delta = face->glyph->rsb_delta; */ + /* */ + /* <save glyph image, or render glyph, or ...> */ + /* */ + /* origin_x += face->glyph->advance.x; */ + /* endfor */ + /* } */ + /* */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt reserved; /* retained for binary compatibility */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Init_FreeType */ + /* */ + /* <Description> */ + /* Initialize a new FreeType library object. The set of modules */ + /* that are registered by this function is determined at build time. */ + /* */ + /* <Output> */ + /* alibrary :: A handle to a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_FreeType */ + /* */ + /* <Description> */ + /* Destroy a given FreeType library object and all of its children, */ + /* including resources, drivers, faces, sizes, etc. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OPEN_XXX */ + /* */ + /* <Description> */ + /* A list of bit-field constants used within the `flags' field of the */ + /* @FT_Open_Args structure. */ + /* */ + /* <Values> */ + /* FT_OPEN_MEMORY :: This is a memory-based stream. */ + /* */ + /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */ + /* */ + /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */ + /* name. */ + /* */ + /* FT_OPEN_DRIVER :: Use the `driver' field. */ + /* */ + /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */ + /* */ + /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */ + /* */ + /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */ + /* */ + /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */ + /* */ + /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */ + /* */ + /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */ + /* */ + /* <Note> */ + /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */ + /* flags are mutually exclusive. */ + /* */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + +#define ft_open_memory FT_OPEN_MEMORY /* deprecated */ +#define ft_open_stream FT_OPEN_STREAM /* deprecated */ +#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */ +#define ft_open_driver FT_OPEN_DRIVER /* deprecated */ +#define ft_open_params FT_OPEN_PARAMS /* deprecated */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Parameter */ + /* */ + /* <Description> */ + /* A simple structure used to pass more or less generic parameters to */ + /* @FT_Open_Face. */ + /* */ + /* <Fields> */ + /* tag :: A four-byte identification tag. */ + /* */ + /* data :: A pointer to the parameter data. */ + /* */ + /* <Note> */ + /* The ID and function of parameters are driver-specific. */ + /* */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Open_Args */ + /* */ + /* <Description> */ + /* A structure used to indicate how to open a new font file or */ + /* stream. A pointer to such a structure can be used as a parameter */ + /* for the functions @FT_Open_Face and @FT_Attach_Stream. */ + /* */ + /* <Fields> */ + /* flags :: A set of bit flags indicating how to use the */ + /* structure. */ + /* */ + /* memory_base :: The first byte of the file in memory. */ + /* */ + /* memory_size :: The size in bytes of the file in memory. */ + /* */ + /* pathname :: A pointer to an 8-bit file pathname. */ + /* */ + /* stream :: A handle to a source stream object. */ + /* */ + /* driver :: This field is exclusively used by @FT_Open_Face; */ + /* it simply specifies the font driver to use to open */ + /* the face. If set to~0, FreeType tries to load the */ + /* face with each one of the drivers in its list. */ + /* */ + /* num_params :: The number of extra parameters. */ + /* */ + /* params :: Extra parameters passed to the font driver when */ + /* opening a new face. */ + /* */ + /* <Note> */ + /* The stream type is determined by the contents of `flags' which */ + /* are tested in the following order by @FT_Open_Face: */ + /* */ + /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */ + /* memory file of `memory_size' bytes, located at `memory_address'. */ + /* The data are are not copied, and the client is responsible for */ + /* releasing and destroying them _after_ the corresponding call to */ + /* @FT_Done_Face. */ + /* */ + /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */ + /* custom input stream `stream' is used. */ + /* */ + /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */ + /* is a normal file and use `pathname' to open it. */ + /* */ + /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */ + /* open the file with the driver whose handler is in `driver'. */ + /* */ + /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */ + /* `num_params' and `params' is used. They are ignored otherwise. */ + /* */ + /* Ideally, both the `pathname' and `params' fields should be tagged */ + /* as `const'; this is missing for API backwards compatibility. In */ + /* other words, applications should treat them as read-only. */ + /* */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font by its pathname. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* pathname :: A path to the font file. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font which has been */ + /* loaded into memory. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* file_base :: A pointer to the beginning of the font data. */ + /* */ + /* file_size :: The size of the memory chunk used by the font data. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You must not deallocate the memory before calling @FT_Done_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Open_Face */ + /* */ + /* <Description> */ + /* Create a face object from a given resource described by */ + /* @FT_Open_Args. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* args :: A pointer to an `FT_Open_Args' structure which must */ + /* be filled by the caller. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See note below. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Unlike FreeType 1.x, this function automatically creates a glyph */ + /* slot for the face object which can be accessed directly through */ + /* `face->glyph'. */ + /* */ + /* FT_Open_Face can be used to quickly check whether the font */ + /* format of a given font resource is supported by FreeType. If the */ + /* `face_index' field is negative, the function's return value is~0 */ + /* if the font format is recognized, or non-zero otherwise; */ + /* the function returns a more or less empty face handle in `*aface' */ + /* (if `aface' isn't NULL). The only useful field in this special */ + /* case is `face->num_faces' which gives the number of faces within */ + /* the font file. After examination, the returned @FT_Face structure */ + /* should be deallocated with a call to @FT_Done_Face. */ + /* */ + /* Each new face object created with this function also owns a */ + /* default @FT_Size object, accessible as `face->size'. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_File */ + /* */ + /* <Description> */ + /* This function calls @FT_Attach_Stream to attach a file. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* filepathname :: The pathname. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_Stream */ + /* */ + /* <Description> */ + /* `Attach' data to a face object. Normally, this is used to read */ + /* additional information for the face object. For example, you can */ + /* attach an AFM file that comes with a Type~1 font to get the */ + /* kerning values and other metrics. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* parameters :: A pointer to @FT_Open_Args which must be filled by */ + /* the caller. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The meaning of the `attach' (i.e., what really happens when the */ + /* new file is read) is not fixed by FreeType itself. It really */ + /* depends on the font format (and thus the font driver). */ + /* */ + /* Client applications are expected to know what they are doing */ + /* when invoking this function. Most drivers simply do not implement */ + /* file attachments. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Face */ + /* */ + /* <Description> */ + /* Discard a given face object, as well as all of its child slots and */ + /* sizes. */ + /* */ + /* <Input> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Size */ + /* */ + /* <Description> */ + /* Select a bitmap strike. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* strike_index :: The index of the bitmap strike in the */ + /* `available_sizes' field of @FT_FaceRec structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Size_Request_Type */ + /* */ + /* <Description> */ + /* An enumeration type that lists the supported size request types. */ + /* */ + /* <Values> */ + /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */ + /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */ + /* used to determine both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */ + /* The real dimension. The sum of the the `Ascender' and (minus */ + /* of) the `Descender' fields of @FT_FaceRec are used to determine */ + /* both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_BBOX :: */ + /* The font bounding box. The width and height of the `bbox' field */ + /* of @FT_FaceRec are used to determine the horizontal and vertical */ + /* scaling value, respectively. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_CELL :: */ + /* The `max_advance_width' field of @FT_FaceRec is used to */ + /* determine the horizontal scaling value; the vertical scaling */ + /* value is determined the same way as */ + /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */ + /* values are set to the smaller one. This type is useful if you */ + /* want to specify the font size for, say, a window of a given */ + /* dimension and 80x24 cells. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_SCALES :: */ + /* Specify the scaling values directly. */ + /* */ + /* <Note> */ + /* The above descriptions only apply to scalable formats. For bitmap */ + /* formats, the behaviour is up to the driver. */ + /* */ + /* See the note section of @FT_Size_Metrics if you wonder how size */ + /* requesting relates to scaling values. */ + /* */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_RequestRec */ + /* */ + /* <Description> */ + /* A structure used to model a size request. */ + /* */ + /* <Fields> */ + /* type :: See @FT_Size_Request_Type. */ + /* */ + /* width :: The desired width. */ + /* */ + /* height :: The desired height. */ + /* */ + /* horiResolution :: The horizontal resolution. If set to zero, */ + /* `width' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* vertResolution :: The vertical resolution. If set to zero, */ + /* `height' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* <Note> */ + /* If `width' is zero, then the horizontal scaling value is set equal */ + /* to the vertical scaling value, and vice versa. */ + /* */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Request */ + /* */ + /* <Description> */ + /* A handle to a size request structure. */ + /* */ + typedef struct FT_Size_RequestRec_ *FT_Size_Request; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Request_Size */ + /* */ + /* <Description> */ + /* Resize the scale of the active @FT_Size object in a face. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* req :: A pointer to a @FT_Size_RequestRec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Although drivers may select the bitmap strike matching the */ + /* request, you should not rely on this if you intend to select a */ + /* particular bitmap strike. Use @FT_Select_Size instead in that */ + /* case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Char_Size */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in points). */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* char_width :: The nominal width, in 26.6 fractional points. */ + /* */ + /* char_height :: The nominal height, in 26.6 fractional points. */ + /* */ + /* horz_resolution :: The horizontal resolution in dpi. */ + /* */ + /* vert_resolution :: The vertical resolution in dpi. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If either the character width or height is zero, it is set equal */ + /* to the other value. */ + /* */ + /* If either the horizontal or vertical resolution is zero, it is set */ + /* equal to the other value. */ + /* */ + /* A character width or height smaller than 1pt is set to 1pt; if */ + /* both resolution values are zero, they are set to 72dpi. */ + /* */ + /* Don't use this function if you are using the FreeType cache API. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Pixel_Sizes */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in pixels). */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* pixel_width :: The nominal width, in pixels. */ + /* */ + /* pixel_height :: The nominal height, in pixels. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Glyph */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* glyph_index :: The index of the glyph in the font file. For */ + /* CID-keyed fonts (either in PS or in CFF format) */ + /* this argument specifies the CID value. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The loaded glyph may be transformed. See @FT_Set_Transform for */ + /* the details. */ + /* */ + /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */ + /* returned for invalid CID values (this is, for CID values which */ + /* don't have a corresponding glyph in the font). See the discussion */ + /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Char */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object, according to its character code. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* char_code :: The glyph's character code, according to the */ + /* current charmap used in the face. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************* + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit-field constants used with @FT_Load_Glyph to indicate + * what kind of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to~0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. + * The bitmap data can be accessed from the glyph slot (see note + * below). + * + * 2. If no embedded bitmap is searched or found, FreeType looks for a + * scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then `hinted' to the pixel grid + * in order to optimize it. The outline data can be accessed from + * the glyph slot (see note below). + * + * Note that by default, the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the outline glyph loaded, but keep it in font units. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates `blurrier' bitmap glyph + * when the glyph is rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. _Don't_ use it as it is + * problematic currently. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Indicates that the auto-hinter is preferred over the font's native + * hinter. See also the note below. + * + * FT_LOAD_CROP_BITMAP :: + * Indicates that the font driver should crop the loaded bitmap glyph + * (i.e., remove all space around its black bits). Not all drivers + * implement this. + * + * FT_LOAD_PEDANTIC :: + * Indicates that the font driver should perform pedantic verifications + * during glyph loading. This is mostly used to detect broken glyphs + * in fonts. By default, FreeType tries to handle broken fonts also. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Indicates that the font driver should ignore the global advance + * width defined in the font. By default, that value is used as the + * advance width for all glyphs when the face has + * @FT_FACE_FLAG_FIXED_WIDTH set. + * + * This flag exists for historical reasons (to support buggy CJK + * fonts). + * + * FT_LOAD_NO_RECURSE :: + * This flag is only used internally. It merely indicates that the + * font driver should not load composite glyphs recursively. Instead, + * it should set the `num_subglyph' and `subglyphs' values of the + * glyph slot accordingly, and set `glyph->format' to + * @FT_GLYPH_FORMAT_COMPOSITE. + * + * The description of sub-glyphs is not available to client + * applications for now. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Indicates that the transform matrix set by @FT_Set_Transform should + * be ignored. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8~pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should rather use @FT_LOAD_TARGET_MONO so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Indicates that the `linearHoriAdvance' and `linearVertAdvance' + * fields of @FT_GlyphSlotRec should be kept in font units. See + * @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable auto-hinter. See also the note below. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be + * used at all. + * + * See the description of @FT_FACE_FLAG_TRICKY for a special exception + * (affecting only a handful of Asian fonts). + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + * + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE 0x1 +#define FT_LOAD_NO_HINTING 0x2 +#define FT_LOAD_RENDER 0x4 +#define FT_LOAD_NO_BITMAP 0x8 +#define FT_LOAD_VERTICAL_LAYOUT 0x10 +#define FT_LOAD_FORCE_AUTOHINT 0x20 +#define FT_LOAD_CROP_BITMAP 0x40 +#define FT_LOAD_PEDANTIC 0x80 +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 0x200 +#define FT_LOAD_NO_RECURSE 0x400 +#define FT_LOAD_IGNORE_TRANSFORM 0x800 +#define FT_LOAD_MONOCHROME 0x1000 +#define FT_LOAD_LINEAR_DESIGN 0x2000 +#define FT_LOAD_NO_AUTOHINT 0x8000U + + /* */ + + /* used internally only by certain font drivers! */ +#define FT_LOAD_ADVANCE_ONLY 0x100 +#define FT_LOAD_SBITS_ONLY 0x4000 + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values that are used to select a specific hinting algorithm + * to use by the hinter. You should OR one of these values to your + * `load_flags' when calling @FT_Load_Glyph. + * + * Note that font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it + * always implies @FT_LOAD_FORCE_AUTOHINT. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * This corresponds to the default hinting algorithm, optimized for + * standard gray-level rendering. For monochrome output, use + * @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for non-monochrome modes. Many + * generated glyphs are more fuzzy but better resemble its original + * shape. A bit like rendering on Mac OS~X. + * + * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT. + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your + * `load_flags'. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode which matches the used algorithm + * best) unless @FT_LOAD_MONOCHROME is set. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the `light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * { + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * } + * + */ +#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /************************************************************************** + * + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + * + */ +#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Transform */ + /* */ + /* <Description> */ + /* A function used to set the transformation that is applied to glyph */ + /* images when they are loaded into a glyph slot through */ + /* @FT_Load_Glyph. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */ + /* the identity matrix. */ + /* delta :: A pointer to the translation vector. Use~0 for the null */ + /* vector. */ + /* */ + /* <Note> */ + /* The transformation is only applied to scalable image formats after */ + /* the glyph has been loaded. It means that hinting is unaltered by */ + /* the transformation and is performed on the character size given in */ + /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */ + /* */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ + /* */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Render_Mode */ + /* */ + /* <Description> */ + /* An enumeration type that lists the render modes supported by */ + /* FreeType~2. Each mode corresponds to a specific type of scanline */ + /* conversion performed on the outline. */ + /* */ + /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */ + /* field in the @FT_GlyphSlotRec structure gives the format of the */ + /* returned bitmap. */ + /* */ + /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */ + /* */ + /* <Values> */ + /* FT_RENDER_MODE_NORMAL :: */ + /* This is the default render mode; it corresponds to 8-bit */ + /* anti-aliased bitmaps. */ + /* */ + /* FT_RENDER_MODE_LIGHT :: */ + /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */ + /* defined as a separate value because render modes are also used */ + /* indirectly to define hinting algorithm selectors. See */ + /* @FT_LOAD_TARGET_XXX for details. */ + /* */ + /* FT_RENDER_MODE_MONO :: */ + /* This mode corresponds to 1-bit bitmaps (with 2~levels of */ + /* opacity). */ + /* */ + /* FT_RENDER_MODE_LCD :: */ + /* This mode corresponds to horizontal RGB and BGR sub-pixel */ + /* displays like LCD screens. It produces 8-bit bitmaps that are */ + /* 3~times the width of the original glyph outline in pixels, and */ + /* which use the @FT_PIXEL_MODE_LCD mode. */ + /* */ + /* FT_RENDER_MODE_LCD_V :: */ + /* This mode corresponds to vertical RGB and BGR sub-pixel displays */ + /* (like PDA screens, rotated LCD displays, etc.). It produces */ + /* 8-bit bitmaps that are 3~times the height of the original */ + /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ + /* */ + /* <Note> */ + /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */ + /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */ + /* (not active in the default builds). It is up to the caller to */ + /* either call @FT_Library_SetLcdFilter (if available) or do the */ + /* filtering itself. */ + /* */ + /* The selected render mode only affects vector glyphs of a font. */ + /* Embedded bitmaps often have a different pixel mode like */ + /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */ + /* them into 8-bit pixmaps. */ + /* */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_render_mode_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Render_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */ + /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */ + /* */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Render_Glyph */ + /* */ + /* <Description> */ + /* Convert a given glyph image to a bitmap. It does so by inspecting */ + /* the glyph image format, finding the relevant renderer, and */ + /* invoking it. */ + /* */ + /* <InOut> */ + /* slot :: A handle to the glyph slot containing the image to */ + /* convert. */ + /* */ + /* <Input> */ + /* render_mode :: This is the render mode used to render the glyph */ + /* image into a bitmap. See @FT_Render_Mode for a */ + /* list of possible values. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Kerning_Mode */ + /* */ + /* <Description> */ + /* An enumeration used to specify which kerning values to return in */ + /* @FT_Get_Kerning. */ + /* */ + /* <Values> */ + /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */ + /* distances (value is~0). */ + /* */ + /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */ + /* distances. */ + /* */ + /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ + /* units. */ + /* */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_default */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */ + /* instead. */ + /* */ +#define ft_kerning_default FT_KERNING_DEFAULT + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unfitted */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */ + /* instead. */ + /* */ +#define ft_kerning_unfitted FT_KERNING_UNFITTED + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unscaled */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */ + /* instead. */ + /* */ +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Kerning */ + /* */ + /* <Description> */ + /* Return the kerning vector between two glyphs of a same face. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* kern_mode :: See @FT_Kerning_Mode for more information. */ + /* Determines the scale and dimension of the returned */ + /* kerning vector. */ + /* */ + /* <Output> */ + /* akerning :: The kerning vector. This is either in font units */ + /* or in pixels (26.6 format) for scalable formats, */ + /* and in pixels for fixed-sizes formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this method. Other layouts, or more sophisticated */ + /* kernings, are out of the scope of this API function -- they can be */ + /* implemented through format-specific interfaces. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Track_Kerning */ + /* */ + /* <Description> */ + /* Return the track kerning for a given face object at a given size. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* point_size :: The point size in 16.16 fractional points. */ + /* */ + /* degree :: The degree of tightness. */ + /* */ + /* <Output> */ + /* akerning :: The kerning in 16.16 fractional points. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII name of a given glyph in a face. This only */ + /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* buffer_max :: The maximal number of bytes available in the */ + /* buffer. */ + /* */ + /* <Output> */ + /* buffer :: A pointer to a target buffer where the name is */ + /* copied to. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* An error is returned if the face doesn't provide glyph names or if */ + /* the glyph index is invalid. In all cases of failure, the first */ + /* byte of `buffer' is set to~0 to indicate an empty name. */ + /* */ + /* The glyph name is truncated to fit within the buffer if it is too */ + /* long. The returned string is always zero-terminated. */ + /* */ + /* This function is not compiled within the library if the config */ + /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */ + /* `include/freetype/config/ftoptions.h'. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Postscript_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII PostScript name of a given face, if available. */ + /* This only works with PostScript and TrueType fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to the face's PostScript name. NULL if unavailable. */ + /* */ + /* <Note> */ + /* The returned pointer is owned by the face and is destroyed with */ + /* it. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap by its encoding tag (as listed in */ + /* `freetype.h'). */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* encoding :: A handle to the selected encoding. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function returns an error if no charmap in the face */ + /* corresponds to the encoding queried here. */ + /* */ + /* Because many fonts contain more than a single cmap for Unicode */ + /* encoding, this function has some special code to select the one */ + /* which covers Unicode best (`best' in the sense that a UCS-4 cmap */ + /* is preferred to a UCS-2 cmap). It is thus preferable to */ + /* @FT_Set_Charmap in this case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap for character code to glyph index mapping. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* charmap :: A handle to the selected charmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function returns an error if the charmap is not part of */ + /* the face (i.e., if it is not listed in the `face->charmaps' */ + /* table). */ + /* */ + /* It also fails if a type~14 charmap is selected. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************* + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap' belongs. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Char_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code. This function */ + /* uses a charmap object to do the mapping. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* charcode :: The character code. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means `undefined character code'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value~0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_First_Char */ + /* */ + /* <Description> */ + /* This function is used to return the first character code in the */ + /* current charmap of a given face. It also returns the */ + /* corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of first character code. 0~if charmap is */ + /* empty. */ + /* */ + /* <Return> */ + /* The charmap's first character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_Next_Char to be able to */ + /* parse all character codes available in a given charmap. The code */ + /* should look like this: */ + /* */ + /* { */ + /* FT_ULong charcode; */ + /* FT_UInt gindex; */ + /* */ + /* */ + /* charcode = FT_Get_First_Char( face, &gindex ); */ + /* while ( gindex != 0 ) */ + /* { */ + /* ... do something with (charcode,gindex) pair ... */ + /* */ + /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */ + /* } */ + /* } */ + /* */ + /* Note that `*agindex' is set to~0 if the charmap is empty. The */ + /* result itself can be~0 in two cases: if the charmap is empty or */ + /* if the value~0 is the first valid character code. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Next_Char */ + /* */ + /* <Description> */ + /* This function is used to return the next character code in the */ + /* current charmap of a given face following the value `char_code', */ + /* as well as the corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* char_code :: The starting character code. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of next character code. 0~if charmap */ + /* is empty. */ + /* */ + /* <Return> */ + /* The charmap's next character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_First_Char to walk */ + /* over all character codes available in a given charmap. See the */ + /* note for this function for a simple code example. */ + /* */ + /* Note that `*agindex' is set to~0 when there are no more codes in */ + /* the charmap. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Name_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given glyph name. This function uses */ + /* driver specific objects to do the translation. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* glyph_name :: The glyph name. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means `undefined character code'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ); + + + /************************************************************************* + * + * @macro: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants used to describe subglyphs. Please refer to the + * TrueType specification for the meaning of the various flags. + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************* + * + * @func: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is + * returned otherwise. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of the subglyph. Must be less than + * `glyph->num_subglyphs'. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be + * interpreted depending on the flags returned in `*p_flags'. See the + * TrueType specification for details. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FSTYPE_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `fsType' field of the OS/2 table */ + /* in a TrueType or OpenType font and the `FSType' entry in a */ + /* PostScript font. These bit flags are returned by */ + /* @FT_Get_FSType_Flags; they inform client applications of embedding */ + /* and subsetting restrictions associated with a font. */ + /* */ + /* See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for */ + /* more details. */ + /* */ + /* <Values> */ + /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */ + /* Fonts with no fsType bit set may be embedded and permanently */ + /* installed on the remote system by an application. */ + /* */ + /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */ + /* Fonts that have only this bit set must not be modified, embedded */ + /* or exchanged in any manner without first obtaining permission of */ + /* the font software copyright owner. */ + /* */ + /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */ + /* If this bit is set, the font may be embedded and temporarily */ + /* loaded on the remote system. Documents containing Preview & */ + /* Print fonts must be opened `read-only'; no edits can be applied */ + /* to the document. */ + /* */ + /* FT_FSTYPE_EDITABLE_EMBEDDING :: */ + /* If this bit is set, the font may be embedded but must only be */ + /* installed temporarily on other systems. In contrast to Preview */ + /* & Print fonts, documents containing editable fonts may be opened */ + /* for reading, editing is permitted, and changes may be saved. */ + /* */ + /* FT_FSTYPE_NO_SUBSETTING :: */ + /* If this bit is set, the font may not be subsetted prior to */ + /* embedding. */ + /* */ + /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */ + /* If this bit is set, only bitmaps contained in the font may be */ + /* embedded; no outline data may be embedded. If there are no */ + /* bitmaps available in the font, then the font is unembeddable. */ + /* */ + /* <Note> */ + /* While the fsType flags can indicate that a font may be embedded, a */ + /* license with the font vendor may be separately required to use the */ + /* font in this way. */ + /* */ +#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 +#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 +#define FT_FSTYPE_NO_SUBSETTING 0x0100 +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_FSType_Flags */ + /* */ + /* <Description> */ + /* Return the fsType flags for a font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* The fsType flags, @FT_FSTYPE_XXX. */ + /* */ + /* <Note> */ + /* Use this function rather than directly reading the `fs_type' field */ + /* in the @PS_FontInfoRec structure which is only guaranteed to */ + /* return the correct results for Type~1 fonts. */ + /* */ + FT_EXPORT( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_variants */ + /* */ + /* <Title> */ + /* Glyph Variants */ + /* */ + /* <Abstract> */ + /* The FreeType~2 interface to Unicode Ideographic Variation */ + /* Sequences (IVS), using the SFNT cmap format~14. */ + /* */ + /* <Description> */ + /* Many CJK characters have variant forms. They are a sort of grey */ + /* area somewhere between being totally irrelevant and semantically */ + /* distinct; for this reason, the Unicode consortium decided to */ + /* introduce Ideographic Variation Sequences (IVS), consisting of a */ + /* Unicode base character and one of 240 variant selectors */ + /* (U+E0100-U+E01EF), instead of further extending the already huge */ + /* code range for CJK characters. */ + /* */ + /* An IVS is registered and unique; for further details please refer */ + /* to Unicode Technical Report #37, the Ideographic Variation */ + /* Database. To date (October 2007), the character with the most */ + /* variants is U+908A, having 8~such IVS. */ + /* */ + /* Adobe and MS decided to support IVS with a new cmap subtable */ + /* (format~14). It is an odd subtable because it is not a mapping of */ + /* input code points to glyphs, but contains lists of all variants */ + /* supported by the font. */ + /* */ + /* A variant may be either `default' or `non-default'. A default */ + /* variant is the one you will get for that code point if you look it */ + /* up in the standard Unicode cmap. A non-default variant is a */ + /* different glyph. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharVariantIndex */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code as modified by */ + /* the variation selector. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character code point in Unicode. */ + /* */ + /* variantSelector :: */ + /* The Unicode code point of the variation selector. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means either `undefined character code', or */ + /* `undefined selector code', or `no variation selector cmap */ + /* subtable', or `current CharMap is not Unicode'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value~0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + /* This function is only meaningful if */ + /* a) the font has a variation selector cmap sub table, */ + /* and */ + /* b) the current charmap has a Unicode encoding. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharVariantIsDefault */ + /* */ + /* <Description> */ + /* Check whether this variant of this Unicode character is the one to */ + /* be found in the `cmap'. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character codepoint in Unicode. */ + /* */ + /* variantSelector :: */ + /* The Unicode codepoint of the variation selector. */ + /* */ + /* <Return> */ + /* 1~if found in the standard (Unicode) cmap, 0~if found in the */ + /* variation selector cmap, or -1 if it is not a variant. */ + /* */ + /* <Note> */ + /* This function is only meaningful if the font has a variation */ + /* selector cmap subtable. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetVariantSelectors */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode variant selectors found */ + /* in the font. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to an array of selector code points, or NULL if there is */ + /* no valid variant selector cmap subtable. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetVariantsOfChar */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode variant selectors found */ + /* for the specified character code. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character codepoint in Unicode. */ + /* */ + /* <Return> */ + /* A pointer to an array of variant selector code points which are */ + /* active for the given character, or NULL if the corresponding list */ + /* is empty. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharsOfVariant */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode character codes found for */ + /* the specified variant selector. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* variantSelector :: */ + /* The variant selector code point in Unicode. */ + /* */ + /* <Return> */ + /* A list of all the code points which are specified by this selector */ + /* (both default and non-default codes are returned) or NULL if there */ + /* is no valid cmap or the variant selector is invalid. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /* <Title> */ + /* Computations */ + /* */ + /* <Abstract> */ + /* Crunching fixed numbers and vectors. */ + /* */ + /* <Description> */ + /* This section contains various functions used to perform */ + /* computations on 16.16 fixed-float numbers or 2d vectors. */ + /* */ + /* <Order> */ + /* FT_MulDiv */ + /* FT_MulFix */ + /* FT_DivFix */ + /* FT_RoundFix */ + /* FT_CeilFix */ + /* FT_FloorFix */ + /* FT_Vector_Transform */ + /* FT_Matrix_Multiply */ + /* FT_Matrix_Invert */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* with maximal accuracy (it uses a 64-bit intermediate integer */ + /* whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /* */ + + /* The following #if 0 ... #endif is for the documentation formatter, */ + /* hiding the internal `FT_MULFIX_INLINED' macro. */ + +#if 0 + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*b)/0x10000' with maximal accuracy. Most of the time this is */ + /* used to multiply a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*b)/0x10000'. */ + /* */ + /* <Note> */ + /* This function has been optimized for the case where the absolute */ + /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ + /* As this happens mainly when scaling from notional units to */ + /* fractional pixels in FreeType, it resulted in noticeable speed */ + /* improvements between versions 2.x and 1.x. */ + /* */ + /* As a conclusion, always try to place a 16.16 factor as the */ + /* _second_ argument of this function; this can make a great */ + /* difference. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + /* */ +#endif + +#ifdef FT_MULFIX_INLINED +#define FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b ) +#else + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_DivFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*0x10000)/b' with maximal accuracy. Most of the time, this is */ + /* used to divide a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*0x10000)/b'. */ + /* */ + /* <Note> */ + /* The optimization for FT_DivFix() is simple: If (a~<<~16) fits in */ + /* 32~bits, then the division is computed directly. Otherwise, we */ + /* use a specialized version of @FT_MulDiv. */ + /* */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_RoundFix */ + /* */ + /* <Description> */ + /* A very simple function used to round a 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number to be rounded. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x8000) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_CeilFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the ceiling function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the ceiling function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x10000 - 1) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FloorFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the floor function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the floor function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `a & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Vector_Transform */ + /* */ + /* <Description> */ + /* Transform a single vector through a 2x2 matrix. */ + /* */ + /* <InOut> */ + /* vector :: The target vector to transform. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the source 2x2 matrix. */ + /* */ + /* <Note> */ + /* The result is undefined if either `vector' or `matrix' is invalid. */ + /* */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vec, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* version */ + /* */ + /* <Title> */ + /* FreeType Version */ + /* */ + /* <Abstract> */ + /* Functions and macros related to FreeType versions. */ + /* */ + /* <Description> */ + /* Note that those functions and macros are of limited use because */ + /* even a new release of FreeType with only documentation changes */ + /* increases the version number. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. + * Use @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: The major version number. + * FREETYPE_MINOR :: The minor version number. + * FREETYPE_PATCH :: The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library + * with the `libtool' package is _not_ controlled by these three + * macros. + * + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 3 +#define FREETYPE_PATCH 9 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Library_Version */ + /* */ + /* <Description> */ + /* Return the version of the FreeType library being used. This is */ + /* useful when dynamically linking to the library, since one cannot */ + /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */ + /* @FREETYPE_PATCH. */ + /* */ + /* <Input> */ + /* library :: A source library handle. */ + /* */ + /* <Output> */ + /* amajor :: The major version number. */ + /* */ + /* aminor :: The minor version number. */ + /* */ + /* apatch :: The patch version number. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' argument is because */ + /* certain programs implement library initialization in a custom way */ + /* that doesn't use @FT_Init_FreeType. */ + /* */ + /* In such cases, the library version might not be available before */ + /* the library object has been created. */ + /* */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_CheckTrueTypePatents */ + /* */ + /* <Description> */ + /* Parse all bytecode instructions of a TrueType font file to check */ + /* whether any of the patented opcodes are used. This is only useful */ + /* if you want to be able to use the unpatented hinter with */ + /* fonts that do *not* use these opcodes. */ + /* */ + /* Note that this function parses *all* glyph instructions in the */ + /* font file, which may be slow. */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* <Return> */ + /* 1~if this is a TrueType font that uses one of the patented */ + /* opcodes, 0~otherwise. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_SetUnpatentedHinting */ + /* */ + /* <Description> */ + /* Enable or disable the unpatented hinter for a given face. */ + /* Only enable it if you have determined that the face doesn't */ + /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* value :: New boolean setting. */ + /* */ + /* <Return> */ + /* The old setting value. This will always be false if this is not */ + /* an SFNT font, or if the unpatented hinter is not compiled in this */ + /* instance of the library. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* __FREETYPE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftadvanc.h b/src/3rdparty/freetype/include/freetype/ftadvanc.h new file mode 100644 index 0000000000..b2451bec42 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftadvanc.h @@ -0,0 +1,179 @@ +/***************************************************************************/ +/* */ +/* ftadvanc.h */ +/* */ +/* Quick computation of advance widths (specification only). */ +/* */ +/* Copyright 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTADVANC_H__ +#define __FTADVANC_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * quick_advance + * + * @title: + * Quick retrieval of advance values + * + * @abstract: + * Retrieve horizontal and vertical advance values without processing + * glyph outlines, if possible. + * + * @description: + * This section contains functions to quickly extract advance values + * without handling glyph outlines, if possible. + */ + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* FT_ADVANCE_FLAG_FAST_ONLY */ + /* */ + /* <Description> */ + /* A bit-flag to be OR-ed with the `flags' parameter of the */ + /* @FT_Get_Advance and @FT_Get_Advances functions. */ + /* */ + /* If set, it indicates that you want these functions to fail if the */ + /* corresponding hinting mode or font driver doesn't allow for very */ + /* quick advance computation. */ + /* */ + /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */ + /* or light-hinted can have their advance width computed very */ + /* quickly. */ + /* */ + /* Normal and bytecode hinted modes, which require loading, scaling, */ + /* and hinting of the glyph outline, are extremely slow by */ + /* comparison. */ + /* */ +#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Advance */ + /* */ + /* <Description> */ + /* Retrieve the advance value of a given glyph outline in an */ + /* @FT_Face. By default, the unhinted advance is returned in font */ + /* units. */ + /* */ + /* <Input> */ + /* face :: The source @FT_Face handle. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* load_flags :: A set of bit flags similar to those used when */ + /* calling @FT_Load_Glyph, used to determine what kind */ + /* of advances you need. */ + /* <Output> */ + /* padvance :: The advance value, in either font units or 16.16 */ + /* format. */ + /* */ + /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */ + /* vertical advance corresponding to a vertical layout. */ + /* Otherwise, it is the horizontal advance in a */ + /* horizontal layout. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ + /* if the corresponding font backend doesn't have a quick way to */ + /* retrieve the advances. */ + /* */ + /* A scaled advance is returned in 16.16 format but isn't transformed */ + /* by the affine transformation specified by @FT_Set_Transform. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags, + FT_Fixed *padvance ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Advances */ + /* */ + /* <Description> */ + /* Retrieve the advance values of several glyph outlines in an */ + /* @FT_Face. By default, the unhinted advances are returned in font */ + /* units. */ + /* */ + /* <Input> */ + /* face :: The source @FT_Face handle. */ + /* */ + /* start :: The first glyph index. */ + /* */ + /* count :: The number of advance values you want to retrieve. */ + /* */ + /* load_flags :: A set of bit flags similar to those used when */ + /* calling @FT_Load_Glyph. */ + /* */ + /* <Output> */ + /* padvance :: The advances, in either font units or 16.16 format. */ + /* This array must contain at least `count' elements. */ + /* */ + /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */ + /* vertical advances corresponding to a vertical layout. */ + /* Otherwise, they are the horizontal advances in a */ + /* horizontal layout. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ + /* if the corresponding font backend doesn't have a quick way to */ + /* retrieve the advances. */ + /* */ + /* Scaled advances are returned in 16.16 format but aren't */ + /* transformed by the affine transformation specified by */ + /* @FT_Set_Transform. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed *padvances ); + +/* */ + + +FT_END_HEADER + +#endif /* __FTADVANC_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftbbox.h b/src/3rdparty/freetype/include/freetype/ftbbox.h new file mode 100644 index 0000000000..5cfb9ff052 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftbbox.h @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftbbox.h */ +/* */ +/* FreeType exact bbox computation (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /* It is separated from the rest of the engine for various technical */ + /* reasons. It may well be integrated in `ftoutln' later. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTBBOX_H__ +#define __FTBBOX_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_BBox */ + /* */ + /* <Description> */ + /* Compute the exact bounding box of an outline. This is slower */ + /* than computing the control box. However, it uses an advanced */ + /* algorithm which returns _very_ quickly when the two boxes */ + /* coincide. Otherwise, the outline Bezier arcs are traversed to */ + /* extract their extrema. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline. */ + /* */ + /* <Output> */ + /* abbox :: The outline's exact bounding box. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBBOX_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/src/3rdparty/freetype/include/freetype/ftbdf.h b/src/3rdparty/freetype/include/freetype/ftbdf.h new file mode 100644 index 0000000000..4f8baf8401 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftbdf.h @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* ftbdf.h */ +/* */ +/* FreeType API for accessing BDF-specific strings (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBDF_H__ +#define __FTBDF_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bdf_fonts */ + /* */ + /* <Title> */ + /* BDF and PCF Files */ + /* */ + /* <Abstract> */ + /* BDF and PCF specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions specific to BDF */ + /* and PCF fonts. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value~0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /********************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given + * BDF/PCF property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /********************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieve a BDF font character set identity, according to + * the BDF specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C~string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C~string, owned by the face. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieve a BDF property from a BDF or PCF font file. + * + * @input: + * face :: A handle to the input face. + * + * name :: The property name. + * + * @output: + * aproperty :: The property. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * A `property' is a either key-value pair within the STARTPROPERTIES + * ... ENDPROPERTIES block of a BDF font or a key-value pair from the + * `info->props' array within a `FontRec' structure of a PCF font. + * + * Integer properties are always stored as `signed' within PCF fonts; + * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value + * for BDF fonts only. + * + * In case of error, `aproperty->type' is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* __FTBDF_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftbitmap.h b/src/3rdparty/freetype/include/freetype/ftbitmap.h new file mode 100644 index 0000000000..92742369ba --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftbitmap.h @@ -0,0 +1,227 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.h */ +/* */ +/* FreeType utility functions for bitmaps (specification). */ +/* */ +/* Copyright 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBITMAP_H__ +#define __FTBITMAP_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bitmap_handling */ + /* */ + /* <Title> */ + /* Bitmap Handling */ + /* */ + /* <Abstract> */ + /* Handling FT_Bitmap objects. */ + /* */ + /* <Description> */ + /* This section contains functions for converting FT_Bitmap objects. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_New */ + /* */ + /* <Description> */ + /* Initialize a pointer to an @FT_Bitmap structure. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the bitmap structure. */ + /* */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Copy */ + /* */ + /* <Description> */ + /* Copy a bitmap into another one. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: A handle to the source bitmap. */ + /* */ + /* <Output> */ + /* target :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Embolden */ + /* */ + /* <Description> */ + /* Embolden a bitmap. The new bitmap will be about `xStrength' */ + /* pixels wider and `yStrength' pixels higher. The left and bottom */ + /* borders are kept unchanged. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* xStrength :: How strong the glyph is emboldened horizontally. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* yStrength :: How strong the glyph is emboldened vertically. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* <InOut> */ + /* bitmap :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The current implementation restricts `xStrength' to be less than */ + /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */ + /* */ + /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */ + /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Convert */ + /* */ + /* <Description> */ + /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a */ + /* bitmap object with depth 8bpp, making the number of used bytes per */ + /* line (a.k.a. the `pitch') a multiple of `alignment'. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: The source bitmap. */ + /* */ + /* alignment :: The pitch of the bitmap is a multiple of this */ + /* parameter. Common values are 1, 2, or 4. */ + /* */ + /* <Output> */ + /* target :: The target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* It is possible to call @FT_Bitmap_Convert multiple times without */ + /* calling @FT_Bitmap_Done (the memory is simply reallocated). */ + /* */ + /* Use @FT_Bitmap_Done to finally remove the bitmap object. */ + /* */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GlyphSlot_Own_Bitmap */ + /* */ + /* <Description> */ + /* Make sure that a glyph slot owns `slot->bitmap'. */ + /* */ + /* <Input> */ + /* slot :: The glyph slot. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function is to be used in combination with */ + /* @FT_Bitmap_Embolden. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Done */ + /* */ + /* <Description> */ + /* Destroy a bitmap object created with @FT_Bitmap_New. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* bitmap :: The bitmap object to be freed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBITMAP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftcache.h b/src/3rdparty/freetype/include/freetype/ftcache.h new file mode 100644 index 0000000000..0916d70a37 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftcache.h @@ -0,0 +1,1125 @@ +/***************************************************************************/ +/* */ +/* ftcache.h */ +/* */ +/* FreeType Cache subsystem (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCACHE_H__ +#define __FTCACHE_H__ + + +#include <ft2build.h> +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************* + * + * <Section> + * cache_subsystem + * + * <Title> + * Cache Sub-System + * + * <Abstract> + * How to cache face, size, and glyph data with FreeType~2. + * + * <Description> + * This section describes the FreeType~2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_' prefix. + * + * The cache is highly portable and thus doesn't know anything about the + * fonts installed on your system, or how to access them. This implies + * the following scheme: + * + * First, available or installed font faces are uniquely identified by + * @FTC_FaceID values, provided to the cache by the client. Note that + * the cache only stores and compares these values, and doesn't try to + * interpret them in any way. + * + * Second, the cache calls, only when needed, a client-provided function + * to convert a @FTC_FaceID into a new @FT_Face object. The latter is + * then completely managed by the cache, including its termination + * through @FT_Done_Face. + * + * Clients are free to map face IDs to anything else. The most simple + * usage is to associate them to a (pathname,face_index) pair that is + * used to call @FT_New_Face. However, more complex schemes are also + * possible. + * + * Note that for the cache to work correctly, the face ID values must be + * *persistent*, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * the cache get rid of any references to the old @FTC_FaceID it may + * keep internally. Failure to do so will lead to incorrect behaviour + * or even crashes. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * + * If you want to use the charmap caching, call @FTC_CMapCache_New, then + * later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then + * later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * If you need lots of small bitmaps, it is much more memory efficient + * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small + * bitmaps directly. (A small bitmap is one whose metrics and + * dimensions all fit into 8-bit integers). + * + * We hope to also provide a kerning cache in the near future. + * + * + * <Order> + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined + * structure containing a font file path, and face index. + * + * @note: + * Never use NULL as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager, which calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even + * memory leaks and crashes. + */ + typedef FT_Pointer FTC_FaceID; + + + /************************************************************************ + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * <Input> + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * <Output> + * aface :: + * A new @FT_Face handle. + * + * <Return> + * FreeType error code. 0~means success. + * + * <Note> + * The third parameter `req_data' is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer request_data, + FT_Face* aface ); + + /* */ + +#define FT_POINTER_TO_ULONG( p ) ( (FT_ULong)(FT_Pointer)(p) ) + +#define FTC_FACE_ID_HASH( i ) \ + ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \ + ( FT_POINTER_TO_ULONG( i ) << 7 ) ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Manager */ + /* */ + /* <Description> */ + /* This object corresponds to one instance of the cache-subsystem. */ + /* It is used to cache one or more @FT_Face objects, along with */ + /* corresponding @FT_Size objects. */ + /* */ + /* The manager intentionally limits the total number of opened */ + /* @FT_Face and @FT_Size objects to control memory usage. See the */ + /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */ + /* */ + /* The manager is also used to cache `nodes' of various types while */ + /* limiting their total memory usage. */ + /* */ + /* All limitations are enforced by keeping lists of managed objects */ + /* in most-recently-used order, and flushing old nodes to make room */ + /* for new ones. */ + /* */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Node */ + /* */ + /* <Description> */ + /* An opaque handle to a cache node object. Each cache node is */ + /* reference-counted. A node with a count of~0 might be flushed */ + /* out of a full cache whenever a lookup request is performed. */ + /* */ + /* If you lookup nodes, you have the ability to `acquire' them, i.e., */ + /* to increment their reference count. This will prevent the node */ + /* from being flushed out of the cache until you explicitly `release' */ + /* it (see @FTC_Node_Unref). */ + /* */ + /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */ + /* */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_New */ + /* */ + /* <Description> */ + /* Create a new cache manager. */ + /* */ + /* <Input> */ + /* library :: The parent FreeType library handle to use. */ + /* */ + /* max_faces :: Maximum number of opened @FT_Face objects managed by */ + /* this cache instance. Use~0 for defaults. */ + /* */ + /* max_sizes :: Maximum number of opened @FT_Size objects managed by */ + /* this cache instance. Use~0 for defaults. */ + /* */ + /* max_bytes :: Maximum number of bytes to use for cached data nodes. */ + /* Use~0 for defaults. Note that this value does not */ + /* account for managed @FT_Face and @FT_Size objects. */ + /* */ + /* requester :: An application-provided callback used to translate */ + /* face IDs into real @FT_Face objects. */ + /* */ + /* req_data :: A generic pointer that is passed to the requester */ + /* each time it is called (see @FTC_Face_Requester). */ + /* */ + /* <Output> */ + /* amanager :: A handle to a new manager object. 0~in case of */ + /* failure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Reset */ + /* */ + /* <Description> */ + /* Empty a given cache manager. This simply gets rid of all the */ + /* currently cached @FT_Face and @FT_Size objects within the manager. */ + /* */ + /* <InOut> */ + /* manager :: A handle to the manager. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Done */ + /* */ + /* <Description> */ + /* Destroy a given manager after emptying it. */ + /* */ + /* <Input> */ + /* manager :: A handle to the target cache manager object. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupFace */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Face object that corresponds to a given face ID */ + /* through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* face_id :: The ID of the face object. */ + /* */ + /* <Output> */ + /* aface :: A handle to the face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Face object is always owned by the manager. You */ + /* should never try to discard it yourself. */ + /* */ + /* The @FT_Face object doesn't necessarily have a current size object */ + /* (i.e., face->size can be 0). If you need a specific `font size', */ + /* use @FTC_Manager_LookupSize instead. */ + /* */ + /* Never change the face's transformation matrix (i.e., never call */ + /* the @FT_Set_Transform function) on a returned face! If you need */ + /* to transform glyphs, do it yourself after glyph loading. */ + /* */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory was available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_ScalerRec */ + /* */ + /* <Description> */ + /* A structure used to describe a given character size in either */ + /* pixels or points to the cache manager. See */ + /* @FTC_Manager_LookupSize. */ + /* */ + /* <Fields> */ + /* face_id :: The source face ID. */ + /* */ + /* width :: The character width. */ + /* */ + /* height :: The character height. */ + /* */ + /* pixel :: A Boolean. If 1, the `width' and `height' fields are */ + /* interpreted as integer pixel character sizes. */ + /* Otherwise, they are expressed as 1/64th of points. */ + /* */ + /* x_res :: Only used when `pixel' is value~0 to indicate the */ + /* horizontal resolution in dpi. */ + /* */ + /* y_res :: Only used when `pixel' is value~0 to indicate the */ + /* vertical resolution in dpi. */ + /* */ + /* <Note> */ + /* This type is mainly used to retrieve @FT_Size objects through the */ + /* cache manager. */ + /* */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_Scaler */ + /* */ + /* <Description> */ + /* A handle to an @FTC_ScalerRec structure. */ + /* */ + typedef struct FTC_ScalerRec_* FTC_Scaler; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupSize */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Size object that corresponds to a given */ + /* @FTC_ScalerRec pointer through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* scaler :: A scaler handle. */ + /* */ + /* <Output> */ + /* asize :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Size object is always owned by the manager. You */ + /* should never try to discard it by yourself. */ + /* */ + /* You can access the parent @FT_Face object simply as `size->face' */ + /* if you need it. Note that this object is also owned by the */ + /* manager. */ + /* */ + /* <Note> */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory is available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Node_Unref */ + /* */ + /* <Description> */ + /* Decrement a cache node's internal reference count. When the count */ + /* reaches 0, it is not destroyed but becomes eligible for subsequent */ + /* cache flushes. */ + /* */ + /* <Input> */ + /* node :: The cache node handle. */ + /* */ + /* manager :: The cache manager handle. */ + /* */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************* + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that + * a given @FTC_FaceID is no longer valid, either because its + * content changed, or because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id', with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear + * in later lookups with the same `face_id' value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to + * hold character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************* + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************ + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. Any negative value + * means to use the cache @FT_Face's default charmap. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0~means `no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_Int width; + FT_Int height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************* + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + +#define FTC_IMAGE_TYPE_HASH( d ) \ + (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id ) ^ \ + ( (d)->width << 8 ) ^ (d)->height ^ \ + ( (d)->flags << 4 ) ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_ImageCache */ + /* */ + /* <Description> */ + /* A handle to an glyph image cache object. They are designed to */ + /* hold many distinct glyph images while not exceeding a certain */ + /* memory threshold. */ + /* */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_New */ + /* */ + /* <Description> */ + /* Create a new glyph image cache. */ + /* */ + /* <Input> */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_Lookup */ + /* */ + /* <Description> */ + /* Retrieve a given glyph image from a glyph image cache. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* type :: A pointer to a glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* scaler :: A pointer to a scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + /* Calls to @FT_Set_Char_Size and friends have no effect on cached */ + /* glyphs; you should always use the FreeType cache API instead. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBit */ + /* */ + /* <Description> */ + /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ + /* structure for details. */ + /* */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_SBitRec */ + /* */ + /* <Description> */ + /* A very compact structure used to describe a small glyph bitmap. */ + /* */ + /* <Fields> */ + /* width :: The bitmap width in pixels. */ + /* */ + /* height :: The bitmap height in pixels. */ + /* */ + /* left :: The horizontal distance from the pen position to the */ + /* left bitmap border (a.k.a. `left side bearing', or */ + /* `lsb'). */ + /* */ + /* top :: The vertical distance from the pen position (on the */ + /* baseline) to the upper bitmap border (a.k.a. `top */ + /* side bearing'). The distance is positive for upwards */ + /* y~coordinates. */ + /* */ + /* format :: The format of the glyph bitmap (monochrome or gray). */ + /* */ + /* max_grays :: Maximum gray level value (in the range 1 to~255). */ + /* */ + /* pitch :: The number of bytes per bitmap line. May be positive */ + /* or negative. */ + /* */ + /* xadvance :: The horizontal advance width in pixels. */ + /* */ + /* yadvance :: The vertical advance height in pixels. */ + /* */ + /* buffer :: A pointer to the bitmap pixels. */ + /* */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBitCache */ + /* */ + /* <Description> */ + /* A handle to a small bitmap cache. These are special cache objects */ + /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ + /* much more efficient way than the traditional glyph image cache */ + /* implemented by @FTC_ImageCache. */ + /* */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_New */ + /* */ + /* <Description> */ + /* Create a new cache to store small glyph bitmaps. */ + /* */ + /* <Input> */ + /* manager :: A handle to the source cache manager. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new sbit cache. NULL in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_Lookup */ + /* */ + /* <Description> */ + /* Look up a given small glyph bitmap in a given sbit cache and */ + /* `lock' it to prevent its flushing from the cache until needed. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* type :: A pointer to the glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to~0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* scaler :: A pointer to the scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to~0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /* */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*@***********************************************************************/ + /* */ + /* <Struct> */ + /* FTC_FontRec */ + /* */ + /* <Description> */ + /* A simple structure used to describe a given `font' to the cache */ + /* manager. Note that a `font' is the combination of a given face */ + /* with a given character size. */ + /* */ + /* <Fields> */ + /* face_id :: The ID of the face to use. */ + /* */ + /* pix_width :: The character width in integer pixels. */ + /* */ + /* pix_height :: The character height in integer pixels. */ + /* */ + typedef struct FTC_FontRec_ + { + FTC_FaceID face_id; + FT_UShort pix_width; + FT_UShort pix_height; + + } FTC_FontRec; + + + /* */ + + +#define FTC_FONT_COMPARE( f1, f2 ) \ + ( (f1)->face_id == (f2)->face_id && \ + (f1)->pix_width == (f2)->pix_width && \ + (f1)->pix_height == (f2)->pix_height ) + +#define FTC_FONT_HASH( f ) \ + (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \ + ((f)->pix_width << 8) ^ \ + ((f)->pix_height) ) + + typedef FTC_FontRec* FTC_Font; + + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* */ + +FT_END_HEADER + +#endif /* __FTCACHE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftchapters.h b/src/3rdparty/freetype/include/freetype/ftchapters.h new file mode 100644 index 0000000000..7775a6bb00 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftchapters.h @@ -0,0 +1,103 @@ +/***************************************************************************/ +/* */ +/* This file defines the structure of the FreeType reference. */ +/* It is used by the python script which generates the HTML files. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* general_remarks */ +/* */ +/* <Title> */ +/* General Remarks */ +/* */ +/* <Sections> */ +/* user_allocation */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* core_api */ +/* */ +/* <Title> */ +/* Core API */ +/* */ +/* <Sections> */ +/* version */ +/* basic_types */ +/* base_interface */ +/* glyph_variants */ +/* glyph_management */ +/* mac_specific */ +/* sizes_management */ +/* header_file_macros */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* format_specific */ +/* */ +/* <Title> */ +/* Format-Specific API */ +/* */ +/* <Sections> */ +/* multiple_masters */ +/* truetype_tables */ +/* type1_tables */ +/* sfnt_names */ +/* bdf_fonts */ +/* cid_fonts */ +/* pfr_fonts */ +/* winfnt_fonts */ +/* font_formats */ +/* gasp_table */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* cache_subsystem */ +/* */ +/* <Title> */ +/* Cache Sub-System */ +/* */ +/* <Sections> */ +/* cache_subsystem */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* support_api */ +/* */ +/* <Title> */ +/* Support API */ +/* */ +/* <Sections> */ +/* computations */ +/* list_processing */ +/* outline_processing */ +/* quick_advance */ +/* bitmap_handling */ +/* raster */ +/* glyph_stroker */ +/* system_interface */ +/* module_management */ +/* gzip */ +/* lzw */ +/* lcd_filtering */ +/* */ +/***************************************************************************/ diff --git a/src/3rdparty/freetype/include/freetype/ftcid.h b/src/3rdparty/freetype/include/freetype/ftcid.h new file mode 100644 index 0000000000..203a30caf8 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftcid.h @@ -0,0 +1,166 @@ +/***************************************************************************/ +/* */ +/* ftcid.h */ +/* */ +/* FreeType API for accessing CID font information (specification). */ +/* */ +/* Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCID_H__ +#define __FTCID_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cid_fonts */ + /* */ + /* <Title> */ + /* CID Fonts */ + /* */ + /* <Abstract> */ + /* CID-keyed font specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of CID-keyed font specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_CID_Registry_Ordering_Supplement + * + * @description: + * Retrieve the Registry/Ordering/Supplement triple (also known as the + * "R/O/S") from a CID-keyed font. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * registry :: + * The registry, as a C~string, owned by the face. + * + * ordering :: + * The ordering, as a C~string, owned by the face. + * + * supplement :: + * The supplement. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces, returning an error + * otherwise. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement); + + + /********************************************************************** + * + * @function: + * FT_Get_CID_Is_Internally_CID_Keyed + * + * @description: + * Retrieve the type of the input face, CID keyed or not. In + * constrast to the @FT_IS_CID_KEYED macro this function returns + * successfully also for CID-keyed fonts in an SNFT wrapper. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * is_cid :: + * The type of the face as an @FT_Bool. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, + * returning an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ); + + + /********************************************************************** + * + * @function: + * FT_Get_CID_From_Glyph_Index + * + * @description: + * Retrieve the CID of the input glyph index. + * + * @input: + * face :: + * A handle to the input face. + * + * glyph_index :: + * The input glyph index. + * + * @output: + * cid :: + * The CID as an @FT_UInt. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, + * returning an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + /* */ + +FT_END_HEADER + +#endif /* __FTCID_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/fterrdef.h b/src/3rdparty/freetype/include/freetype/fterrdef.h new file mode 100644 index 0000000000..d7ad256bdb --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/fterrdef.h @@ -0,0 +1,239 @@ +/***************************************************************************/ +/* */ +/* fterrdef.h */ +/* */ +/* FreeType error codes (specification). */ +/* */ +/* Copyright 2002, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST OF ERROR CODES/MESSAGES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + + /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */ + /* including this file. */ + + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, \ + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \ + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, \ + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, \ + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, \ + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, \ + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, \ + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, \ + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, \ + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, \ + "array allocation size too large" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \ + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, \ + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \ + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \ + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, \ + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, \ + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, \ + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \ + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, \ + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \ + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \ + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \ + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \ + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \ + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \ + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \ + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \ + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, \ + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, \ + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, \ + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, \ + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \ + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \ + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \ + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \ + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \ + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \ + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, \ + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \ + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, \ + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, \ + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, \ + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, \ + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, \ + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, \ + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, \ + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, \ + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, \ + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, \ + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, \ + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, \ + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, \ + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \ + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, \ + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \ + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, \ + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \ + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \ + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, \ + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \ + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, \ + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, \ + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, \ + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \ + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, \ + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \ + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \ + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, \ + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \ + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \ + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \ + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \ + "invalid PostScript (post) table" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, \ + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, \ + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, \ + "ignore" ) + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \ + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, \ + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB3, \ + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB4, \ + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB5, \ + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB6, \ + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB7, \ + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB8, \ + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xB9, \ + "Font glyphs corrupted or missing fields" ) + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/fterrors.h b/src/3rdparty/freetype/include/freetype/fterrors.h new file mode 100644 index 0000000000..6600dadd0d --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/fterrors.h @@ -0,0 +1,206 @@ +/***************************************************************************/ +/* */ +/* fterrors.h */ +/* */ +/* FreeType error code handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This special header file is used to define the handling of FT2 */ + /* enumeration constants. It can also be used to generate error message */ + /* strings with a small macro trick explained below. */ + /* */ + /* I - Error Formats */ + /* ----------------- */ + /* */ + /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ + /* defined in ftoption.h in order to make the higher byte indicate */ + /* the module where the error has happened (this is not compatible */ + /* with standard builds of FreeType 2). You can then use the macro */ + /* FT_ERROR_BASE macro to extract the generic error code from an */ + /* FT_Error value. */ + /* */ + /* */ + /* II - Error Message strings */ + /* -------------------------- */ + /* */ + /* The error definitions below are made through special macros that */ + /* allow client applications to build a table of error message strings */ + /* if they need it. The strings are not included in a normal build of */ + /* FreeType 2 to save space (most client applications do not use */ + /* them). */ + /* */ + /* To do so, you have to define the following macros before including */ + /* this file: */ + /* */ + /* FT_ERROR_START_LIST :: */ + /* This macro is called before anything else to define the start of */ + /* the error list. It is followed by several FT_ERROR_DEF calls */ + /* (see below). */ + /* */ + /* FT_ERROR_DEF( e, v, s ) :: */ + /* This macro is called to define one single error. */ + /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */ + /* `v' is the error numerical value. */ + /* `s' is the corresponding error string. */ + /* */ + /* FT_ERROR_END_LIST :: */ + /* This macro ends the list. */ + /* */ + /* Additionally, you have to undefine __FTERRORS_H__ before #including */ + /* this file. */ + /* */ + /* Here is a simple example: */ + /* */ + /* { */ + /* #undef __FTERRORS_H__ */ + /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ + /* #define FT_ERROR_START_LIST { */ + /* #define FT_ERROR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int err_code; */ + /* const char* err_msg; */ + /* } ft_errors[] = */ + /* */ + /* #include FT_ERRORS_H */ + /* } */ + /* */ + /*************************************************************************/ + + +#ifndef __FTERRORS_H__ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include FT_MODULE_ERRORS_H + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#undef FT_ERR_XCAT +#undef FT_ERR_CAT + +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_'. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for <module>_Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include FT_ERROR_DEFINITIONS_H + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_CONCAT +#undef FT_ERR_BASE + + /* FT_KEEP_ERR_PREFIX is needed for ftvalid.h */ +#ifndef FT_KEEP_ERR_PREFIX +#undef FT_ERR_PREFIX +#endif + +#endif /* __FTERRORS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftgasp.h b/src/3rdparty/freetype/include/freetype/ftgasp.h new file mode 100644 index 0000000000..91a769e520 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftgasp.h @@ -0,0 +1,120 @@ +/***************************************************************************/ +/* */ +/* ftgasp.h */ +/* */ +/* Access of TrueType's `gasp' table (specification). */ +/* */ +/* Copyright 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef _FT_GASP_H_ +#define _FT_GASP_H_ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + + /*************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType `gasp' table entries. + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in its `gasp' table, if any. This is + * mainly useful when implementing native TrueType hinting with the + * bytecode interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************* + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This *really* means TrueType bytecode interpretation. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * Smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * `ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x10 + + + /************************************************************************* + * + * @func: + * FT_Get_Gasp + * + * @description: + * Read the `gasp' table from a TrueType or OpenType font file and + * return the entry corresponding to a given character pixel size. + * + * @input: + * face :: The source face handle. + * ppem :: The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no + * `gasp' table in the face. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + +/* */ + +#endif /* _FT_GASP_H_ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftglyph.h b/src/3rdparty/freetype/include/freetype/ftglyph.h new file mode 100644 index 0000000000..c3c57336c1 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftglyph.h @@ -0,0 +1,613 @@ +/***************************************************************************/ +/* */ +/* ftglyph.h */ +/* */ +/* FreeType convenience functions to handle glyphs (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTGLYPH_H__ +#define __FTGLYPH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_management */ + /* */ + /* <Title> */ + /* Glyph Management */ + /* */ + /* <Abstract> */ + /* Generic interface to manage individual glyph data. */ + /* */ + /* <Description> */ + /* This section contains definitions used to manage glyph data */ + /* through generic FT_Glyph objects. Each of them can contain a */ + /* bitmap, a vector outline, or even images in other formats. */ + /* */ + /*************************************************************************/ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Glyph */ + /* */ + /* <Description> */ + /* Handle to an object used to model generic glyph images. It is a */ + /* pointer to the @FT_GlyphRec structure and can contain a glyph */ + /* bitmap or pointer. */ + /* */ + /* <Note> */ + /* Glyph objects are not owned by the library. You must thus release */ + /* them manually (through @FT_Done_Glyph) _before_ calling */ + /* @FT_Done_FreeType. */ + /* */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphRec */ + /* */ + /* <Description> */ + /* The root glyph structure contains a given glyph image plus its */ + /* advance width in 16.16 fixed float format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library object. */ + /* */ + /* clazz :: A pointer to the glyph's class. Private. */ + /* */ + /* format :: The format of the glyph's image. */ + /* */ + /* advance :: A 16.16 vector that gives the glyph's advance width. */ + /* */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_BitmapGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model a bitmap glyph image. This is */ + /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ + /* */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BitmapGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for bitmap glyph images. This really is a */ + /* `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* left :: The left-side bearing, i.e., the horizontal distance */ + /* from the current pen position to the left border of the */ + /* glyph bitmap. */ + /* */ + /* top :: The top-side bearing, i.e., the vertical distance from */ + /* the current pen position to the top border of the glyph */ + /* bitmap. This distance is positive for upwards~y! */ + /* */ + /* bitmap :: A descriptor for the bitmap. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */ + /* the bitmap's contents easily. */ + /* */ + /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */ + /* and is thus created and destroyed with it. */ + /* */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_OutlineGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model an outline glyph image. This */ + /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ + /* */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_OutlineGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for outline (vectorial) glyph images. This */ + /* really is a `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* outline :: A descriptor for the outline. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */ + /* the outline's content easily. */ + /* */ + /* As the outline is extracted from a glyph slot, its coordinates are */ + /* expressed normally in 26.6 pixels, unless the flag */ + /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */ + /* */ + /* The outline's tables are always owned by the object and are */ + /* destroyed with it. */ + /* */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph */ + /* */ + /* <Description> */ + /* A function used to extract a glyph image from a slot. Note that */ + /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* slot :: A handle to the source glyph slot. */ + /* */ + /* <Output> */ + /* aglyph :: A handle to the glyph object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Copy */ + /* */ + /* <Description> */ + /* A function used to copy a glyph image. Note that the created */ + /* @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* source :: A handle to the source glyph object. */ + /* */ + /* <Output> */ + /* target :: A handle to the target glyph object. 0~in case of */ + /* error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Transform */ + /* */ + /* <Description> */ + /* Transform a glyph image if its format is scalable. */ + /* */ + /* <InOut> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to a 2x2 matrix to apply. */ + /* */ + /* delta :: A pointer to a 2d vector to apply. Coordinates are */ + /* expressed in 1/64th of a pixel. */ + /* */ + /* <Return> */ + /* FreeType error code (if not 0, the glyph format is not scalable). */ + /* */ + /* <Note> */ + /* The 2x2 transformation matrix is also applied to the glyph's */ + /* advance vector. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_BBox_Mode */ + /* */ + /* <Description> */ + /* The mode how the values of @FT_Glyph_Get_CBox are returned. */ + /* */ + /* <Values> */ + /* FT_GLYPH_BBOX_UNSCALED :: */ + /* Return unscaled font units. */ + /* */ + /* FT_GLYPH_BBOX_SUBPIXELS :: */ + /* Return unfitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_GRIDFIT :: */ + /* Return grid-fitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_TRUNCATE :: */ + /* Return coordinates in integer pixels. */ + /* */ + /* FT_GLYPH_BBOX_PIXELS :: */ + /* Return grid-fitted pixel coordinates. */ + /* */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_bbox_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Glyph_BBox_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */ + /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */ + /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */ + /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */ + /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */ + /* */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Get_CBox */ + /* */ + /* <Description> */ + /* Return a glyph's `control box'. The control box encloses all the */ + /* outline's points, including Bezier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bezier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the source glyph object. */ + /* */ + /* mode :: The mode which indicates how to interpret the returned */ + /* bounding box values. */ + /* */ + /* <Output> */ + /* acbox :: The glyph coordinate bounding box. Coordinates are */ + /* expressed in 1/64th of pixels if it is grid-fitted. */ + /* */ + /* <Note> */ + /* Coordinates are relative to the glyph origin, using the y~upwards */ + /* convention. */ + /* */ + /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */ + /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */ + /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */ + /* is another name for this constant. */ + /* */ + /* Note that the maximum coordinates are exclusive, which means that */ + /* one can compute the width and height of the glyph image (be it in */ + /* integer or 26.6 pixels) as: */ + /* */ + /* { */ + /* width = bbox.xMax - bbox.xMin; */ + /* height = bbox.yMax - bbox.yMin; */ + /* } */ + /* */ + /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ + /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */ + /* which corresponds to: */ + /* */ + /* { */ + /* bbox.xMin = FLOOR(bbox.xMin); */ + /* bbox.yMin = FLOOR(bbox.yMin); */ + /* bbox.xMax = CEILING(bbox.xMax); */ + /* bbox.yMax = CEILING(bbox.yMax); */ + /* } */ + /* */ + /* To get the bbox in pixel coordinates, set `bbox_mode' to */ + /* @FT_GLYPH_BBOX_TRUNCATE. */ + /* */ + /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ + /* to @FT_GLYPH_BBOX_PIXELS. */ + /* */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_To_Bitmap */ + /* */ + /* <Description> */ + /* Convert a given glyph object to a bitmap glyph object. */ + /* */ + /* <InOut> */ + /* the_glyph :: A pointer to a handle to the target glyph. */ + /* */ + /* <Input> */ + /* render_mode :: An enumeration that describes how the data is */ + /* rendered. */ + /* */ + /* origin :: A pointer to a vector used to translate the glyph */ + /* image before rendering. Can be~0 (if no */ + /* translation). The origin is expressed in */ + /* 26.6 pixels. */ + /* */ + /* destroy :: A boolean that indicates that the original glyph */ + /* image should be destroyed by this function. It is */ + /* never destroyed in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function does nothing if the glyph format isn't scalable. */ + /* */ + /* The glyph image is translated with the `origin' vector before */ + /* rendering. */ + /* */ + /* The first parameter is a pointer to an @FT_Glyph handle, that will */ + /* be _replaced_ by this function (with newly allocated data). */ + /* Typically, you would use (omitting error handling): */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyph; */ + /* FT_BitmapGlyph glyph_bitmap; */ + /* */ + /* */ + /* // load glyph */ + /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ + /* */ + /* // extract glyph image */ + /* error = FT_Get_Glyph( face->glyph, &glyph ); */ + /* */ + /* // convert to a bitmap (default render mode + destroying old) */ + /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ + /* { */ + /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_DEFAULT, */ + /* 0, 1 ); */ + /* if ( error ) // `glyph' unchanged */ + /* ... */ + /* } */ + /* */ + /* // access bitmap content by typecasting */ + /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ + /* */ + /* // do funny stuff with it, like blitting/drawing */ + /* ... */ + /* */ + /* // discard glyph image (bitmap or not) */ + /* FT_Done_Glyph( glyph ); */ + /* } */ + /* */ + /* */ + /* Here another example, again without error handling: */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyphs[MAX_GLYPHS] */ + /* */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */ + /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* { */ + /* FT_Glyph bitmap = glyphs[idx]; */ + /* */ + /* */ + /* ... */ + /* */ + /* // after this call, `bitmap' no longer points into */ + /* // the `glyphs' array (and the old value isn't destroyed) */ + /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */ + /* */ + /* ... */ + /* */ + /* FT_Done_Glyph( bitmap ); */ + /* } */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* FT_Done_Glyph( glyphs[idx] ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Glyph */ + /* */ + /* <Description> */ + /* Destroy a given glyph. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Multiply */ + /* */ + /* <Description> */ + /* Perform the matrix operation `b = a*b'. */ + /* */ + /* <Input> */ + /* a :: A pointer to matrix `a'. */ + /* */ + /* <InOut> */ + /* b :: A pointer to matrix `b'. */ + /* */ + /* <Note> */ + /* The result is undefined if either `a' or `b' is zero. */ + /* */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Invert */ + /* */ + /* <Description> */ + /* Invert a 2x2 matrix. Return an error if it can't be inverted. */ + /* */ + /* <InOut> */ + /* matrix :: A pointer to the target matrix. Remains untouched in */ + /* case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLYPH_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/src/3rdparty/freetype/include/freetype/ftgxval.h b/src/3rdparty/freetype/include/freetype/ftgxval.h new file mode 100644 index 0000000000..497015c101 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftgxval.h @@ -0,0 +1,358 @@ +/***************************************************************************/ +/* */ +/* ftgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* Masatake YAMATO, Redhat K.K, */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGXVAL_H__ +#define __FTGXVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gx_validation */ + /* */ + /* <Title> */ + /* TrueTypeGX/AAT Validation */ + /* */ + /* <Abstract> */ + /* An API to validate TrueTypeGX/AAT tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */ + /* trak, prop, lcar). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Warning: Use FT_VALIDATE_XXX to validate a table. */ + /* Following definitions are for gxvalid developers. */ + /* */ + /* */ + /*************************************************************************/ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************* + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length' argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate `feat' table. + * + * FT_VALIDATE_mort :: + * Validate `mort' table. + * + * FT_VALIDATE_morx :: + * Validate `morx' table. + * + * FT_VALIDATE_bsln :: + * Validate `bsln' table. + * + * FT_VALIDATE_just :: + * Validate `just' table. + * + * FT_VALIDATE_kern :: + * Validate `kern' table. + * + * FT_VALIDATE_opbd :: + * Validate `opbd' table. + * + * FT_VALIDATE_trak :: + * Validate `trak' table. + * + * FT_VALIDATE_prop :: + * Validate `prop' table. + * + * FT_VALIDATE_lcar :: + * Validate `lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. + * The array itself must be allocated by a client. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by + * @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate + * to indicate the classic kern dialect or dialects. If the selected + * type doesn't fit, @FT_ClassicKern_Validate regards the table as + * invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the `kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the `kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the `kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16-bit format) kern table to assure that the offsets + * and indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32-bit format and the classic 16-bit format, while + * FT_ClassicKern_Validate only supports the classic 16-bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGXVAL_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftgzip.h b/src/3rdparty/freetype/include/freetype/ftgzip.h new file mode 100644 index 0000000000..acbc4f0327 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftgzip.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* ftgzip.h */ +/* */ +/* Gzip-compressed stream support. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGZIP_H__ +#define __FTGZIP_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gzip */ + /* */ + /* <Title> */ + /* GZIP Streams */ + /* */ + /* <Abstract> */ + /* Using gzip-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Gzip-specific functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************ + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is + * mainly used to support the compressed `*.pcf.gz' fonts that come + * with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from + * it and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGZIP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftimage.h b/src/3rdparty/freetype/include/freetype/ftimage.h new file mode 100644 index 0000000000..25a9b1b7ee --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftimage.h @@ -0,0 +1,1254 @@ +/***************************************************************************/ +/* */ +/* ftimage.h */ +/* */ +/* FreeType glyph image formats and default raster interface */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Note: A `raster' is simply a scan-line converter, used to render */ + /* FT_Outlines into FT_Bitmaps. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTIMAGE_H__ +#define __FTIMAGE_H__ + + + /* _STANDALONE_ is from ftgrays.c */ +#ifndef _STANDALONE_ +#include <ft2build.h> +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pos */ + /* */ + /* <Description> */ + /* The type FT_Pos is a 32-bit integer used to store vectorial */ + /* coordinates. Depending on the context, these can represent */ + /* distances in integer font units, or 16.16, or 26.6 fixed float */ + /* pixel coordinates. */ + /* */ + typedef signed long FT_Pos; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Vector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector; coordinates are of */ + /* the FT_Pos type. */ + /* */ + /* <Fields> */ + /* x :: The horizontal coordinate. */ + /* y :: The vertical coordinate. */ + /* */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BBox */ + /* */ + /* <Description> */ + /* A structure used to hold an outline's bounding box, i.e., the */ + /* coordinates of its extrema in the horizontal and vertical */ + /* directions. */ + /* */ + /* <Fields> */ + /* xMin :: The horizontal minimum (left-most). */ + /* */ + /* yMin :: The vertical minimum (bottom-most). */ + /* */ + /* xMax :: The horizontal maximum (right-most). */ + /* */ + /* yMax :: The vertical maximum (top-most). */ + /* */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Pixel_Mode */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of pixels in a */ + /* given bitmap. Note that additional formats may be added in the */ + /* future. */ + /* */ + /* <Values> */ + /* FT_PIXEL_MODE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* FT_PIXEL_MODE_MONO :: */ + /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */ + /* are stored in most-significant order (MSB), which means that */ + /* the left-most pixel in a byte has value 128. */ + /* */ + /* FT_PIXEL_MODE_GRAY :: */ + /* An 8-bit bitmap, generally used to represent anti-aliased glyph */ + /* images. Each pixel is stored in one byte. Note that the number */ + /* of `gray' levels is stored in the `num_grays' field of the */ + /* @FT_Bitmap structure (it generally is 256). */ + /* */ + /* FT_PIXEL_MODE_GRAY2 :: */ + /* A 2-bit per pixel bitmap, used to represent embedded */ + /* anti-aliased bitmaps in font files according to the OpenType */ + /* specification. We haven't found a single font using this */ + /* format, however. */ + /* */ + /* FT_PIXEL_MODE_GRAY4 :: */ + /* A 4-bit per pixel bitmap, representing embedded anti-aliased */ + /* bitmaps in font files according to the OpenType specification. */ + /* We haven't found a single font using this format, however. */ + /* */ + /* FT_PIXEL_MODE_LCD :: */ + /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ + /* used for display on LCD displays; the bitmap is three times */ + /* wider than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD. */ + /* */ + /* FT_PIXEL_MODE_LCD_V :: */ + /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ + /* used for display on rotated LCD displays; the bitmap is three */ + /* times taller than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD_V. */ + /* */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_pixel_mode_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Pixel_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */ + /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */ + /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */ + /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */ + /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */ + /* */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + /* */ + +#if 0 + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Palette_Mode */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */ + /* */ + /* An enumeration type to describe the format of a bitmap palette, */ + /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */ + /* */ + /* <Values> */ + /* ft_palette_mode_rgb :: The palette is an array of 3-byte RGB */ + /* records. */ + /* */ + /* ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA */ + /* records. */ + /* */ + /* <Note> */ + /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */ + /* FreeType, these types are not handled by the library itself. */ + /* */ + typedef enum FT_Palette_Mode_ + { + ft_palette_mode_rgb = 0, + ft_palette_mode_rgba, + + ft_palette_mode_max /* do not remove */ + + } FT_Palette_Mode; + + /* */ + +#endif + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap */ + /* */ + /* <Description> */ + /* A structure used to describe a bitmap or pixmap to the raster. */ + /* Note that we now manage pixmaps of various depths through the */ + /* `pixel_mode' field. */ + /* */ + /* <Fields> */ + /* rows :: The number of bitmap rows. */ + /* */ + /* width :: The number of pixels in bitmap row. */ + /* */ + /* pitch :: The pitch's absolute value is the number of bytes */ + /* taken by one bitmap row, including padding. */ + /* However, the pitch is positive when the bitmap has */ + /* a `down' flow, and negative when it has an `up' */ + /* flow. In all cases, the pitch is an offset to add */ + /* to a bitmap pointer in order to go down one row. */ + /* */ + /* buffer :: A typeless pointer to the bitmap buffer. This */ + /* value should be aligned on 32-bit boundaries in */ + /* most cases. */ + /* */ + /* num_grays :: This field is only used with */ + /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */ + /* levels used in the bitmap. */ + /* */ + /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */ + /* See @FT_Pixel_Mode for possible values. */ + /* */ + /* palette_mode :: This field is intended for paletted pixel modes; */ + /* it indicates how the palette is stored. Not */ + /* used currently. */ + /* */ + /* palette :: A typeless pointer to the bitmap palette; this */ + /* field is intended for paletted pixel modes. Not */ + /* used currently. */ + /* */ + /* <Note> */ + /* For now, the only pixel modes supported by FreeType are mono and */ + /* grays. However, drivers might be added in the future to support */ + /* more `colorful' options. */ + /* */ + typedef struct FT_Bitmap_ + { + int rows; + int width; + int pitch; + unsigned char* buffer; + short num_grays; + char pixel_mode; + char palette_mode; + void* palette; + + } FT_Bitmap; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline */ + /* */ + /* <Description> */ + /* This structure is used to describe an outline to the scan-line */ + /* converter. */ + /* */ + /* <Fields> */ + /* n_contours :: The number of contours in the outline. */ + /* */ + /* n_points :: The number of points in the outline. */ + /* */ + /* points :: A pointer to an array of `n_points' @FT_Vector */ + /* elements, giving the outline's point coordinates. */ + /* */ + /* tags :: A pointer to an array of `n_points' chars, giving */ + /* each outline point's type. If bit~0 is unset, the */ + /* point is `off' the curve, i.e., a Bezier control */ + /* point, while it is `on' when set. */ + /* */ + /* Bit~1 is meaningful for `off' points only. If set, */ + /* it indicates a third-order Bezier arc control point; */ + /* and a second-order control point if unset. */ + /* */ + /* contours :: An array of `n_contours' shorts, giving the end */ + /* point of each contour within the outline. For */ + /* example, the first contour is defined by the points */ + /* `0' to `contours[0]', the second one is defined by */ + /* the points `contours[0]+1' to `contours[1]', etc. */ + /* */ + /* flags :: A set of bit flags used to characterize the outline */ + /* and give hints to the scan-converter and hinter on */ + /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */ + /* */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OUTLINE_FLAGS */ + /* */ + /* <Description> */ + /* A list of bit-field constants use for the flags in an outline's */ + /* `flags' field. */ + /* */ + /* <Values> */ + /* FT_OUTLINE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* FT_OUTLINE_OWNER :: */ + /* If set, this flag indicates that the outline's field arrays */ + /* (i.e., `points', `flags', and `contours') are `owned' by the */ + /* outline object, and should thus be freed when it is destroyed. */ + /* */ + /* FT_OUTLINE_EVEN_ODD_FILL :: */ + /* By default, outlines are filled using the non-zero winding rule. */ + /* If set to 1, the outline will be filled using the even-odd fill */ + /* rule (only works with the smooth raster). */ + /* */ + /* FT_OUTLINE_REVERSE_FILL :: */ + /* By default, outside contours of an outline are oriented in */ + /* clock-wise direction, as defined in the TrueType specification. */ + /* This flag is set if the outline uses the opposite direction */ + /* (typically for Type~1 fonts). This flag is ignored by the scan */ + /* converter. */ + /* */ + /* FT_OUTLINE_IGNORE_DROPOUTS :: */ + /* By default, the scan converter will try to detect drop-outs in */ + /* an outline and correct the glyph bitmap to ensure consistent */ + /* shape continuity. If set, this flag hints the scan-line */ + /* converter to ignore such cases. */ + /* */ + /* FT_OUTLINE_SMART_DROPOUTS :: */ + /* Select smart dropout control. If unset, use simple dropout */ + /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. */ + /* */ + /* FT_OUTLINE_INCLUDE_STUBS :: */ + /* If set, turn pixels on for `stubs', otherwise exclude them. */ + /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. */ + /* */ + /* FT_OUTLINE_HIGH_PRECISION :: */ + /* This flag indicates that the scan-line converter should try to */ + /* convert this outline to bitmaps with the highest possible */ + /* quality. It is typically set for small character sizes. Note */ + /* that this is only a hint that might be completely ignored by a */ + /* given scan-converter. */ + /* */ + /* FT_OUTLINE_SINGLE_PASS :: */ + /* This flag is set to force a given scan-converter to only use a */ + /* single pass over the outline to render a bitmap glyph image. */ + /* Normally, it is set for very large character sizes. It is only */ + /* a hint that might be completely ignored by a given */ + /* scan-converter. */ + /* */ + /* <Note> */ + /* Please refer to the description of the `SCANTYPE' instruction in */ + /* the OpenType specification (in file `ttinst1.doc') how simple */ + /* drop-outs, smart drop-outs, and stubs are defined. */ + /* */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /************************************************************************* + * + * @enum: + * ft_outline_flags + * + * @description: + * These constants are deprecated. Please use the corresponding + * @FT_OUTLINE_FLAGS values. + * + * @values: + * ft_outline_none :: See @FT_OUTLINE_NONE. + * ft_outline_owner :: See @FT_OUTLINE_OWNER. + * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL. + * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL. + * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS. + * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION. + * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS. + */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 3 ) + +#define FT_CURVE_TAG_ON 1 +#define FT_CURVE_TAG_CONIC 0 +#define FT_CURVE_TAG_CUBIC 2 + +#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_MoveToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `move */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `move to' is emitted to start a new contour in an outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `move to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_LineToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `line */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `line to' is emitted to indicate a segment in the outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `line to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_ConicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type use to describe the signature of a `conic */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `conic to' is emitted to indicate a second-order Bezier arc in */ + /* the outline. */ + /* */ + /* <Input> */ + /* control :: An intermediate control point between the last position */ + /* and the new target in `to'. */ + /* */ + /* to :: A pointer to the target end point of the conic arc. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_CubicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `cubic */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `cubic to' is emitted to indicate a third-order Bezier arc. */ + /* */ + /* <Input> */ + /* control1 :: A pointer to the first Bezier control point. */ + /* */ + /* control2 :: A pointer to the second Bezier control point. */ + /* */ + /* to :: A pointer to the target end point. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline_Funcs */ + /* */ + /* <Description> */ + /* A structure to hold various function pointers used during outline */ + /* decomposition in order to emit segments, conic, and cubic Beziers, */ + /* as well as `move to' and `close to' operations. */ + /* */ + /* <Fields> */ + /* move_to :: The `move to' emitter. */ + /* */ + /* line_to :: The segment emitter. */ + /* */ + /* conic_to :: The second-order Bezier arc emitter. */ + /* */ + /* cubic_to :: The third-order Bezier arc emitter. */ + /* */ + /* shift :: The shift that is applied to coordinates before they */ + /* are sent to the emitter. */ + /* */ + /* delta :: The delta that is applied to coordinates before they */ + /* are sent to the emitter, but after the shift. */ + /* */ + /* <Note> */ + /* The point coordinates sent to the emitters are the transformed */ + /* version of the original coordinates (this is important for high */ + /* accuracy during scan-conversion). The transformation is simple: */ + /* */ + /* { */ + /* x' = (x << shift) - delta */ + /* y' = (x << shift) - delta */ + /* } */ + /* */ + /* Set the value of `shift' and `delta' to~0 to get the original */ + /* point coordinates. */ + /* */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_IMAGE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags to an unsigned long type. */ + /* */ + /* <Note> */ + /* Since many 16-bit compilers don't like 32-bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_Format */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of a given glyph */ + /* image. Note that this version of FreeType only supports two image */ + /* formats, even though future font drivers will be able to register */ + /* their own format. */ + /* */ + /* <Values> */ + /* FT_GLYPH_FORMAT_NONE :: */ + /* The value~0 is reserved. */ + /* */ + /* FT_GLYPH_FORMAT_COMPOSITE :: */ + /* The glyph image is a composite of several other images. This */ + /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */ + /* report compound glyphs (like accented characters). */ + /* */ + /* FT_GLYPH_FORMAT_BITMAP :: */ + /* The glyph image is a bitmap, and can be described as an */ + /* @FT_Bitmap. You generally need to access the `bitmap' field of */ + /* the @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_OUTLINE :: */ + /* The glyph image is a vectorial outline made of line segments */ + /* and Bezier arcs; it can be described as an @FT_Outline; you */ + /* generally want to access the `outline' field of the */ + /* @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_PLOTTER :: */ + /* The glyph image is a vectorial path with no inside and outside */ + /* contours. Some Type~1 fonts, like those in the Hershey family, */ + /* contain glyphs in this format. These are described as */ + /* @FT_Outline, but FreeType isn't currently capable of rendering */ + /* them correctly. */ + /* */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_format_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Glyph_Format values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */ + /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */ + /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */ + /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */ + /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */ + /* */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* A raster is a scan converter, in charge of rendering an outline into */ + /* a a bitmap. This section contains the public API for rasters. */ + /* */ + /* Note that in FreeType 2, all rasters are now encapsulated within */ + /* specific modules called `renderers'. See `freetype/ftrender.h' for */ + /* more details on renderers. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* raster */ + /* */ + /* <Title> */ + /* Scanline Converter */ + /* */ + /* <Abstract> */ + /* How vectorial outlines are converted into bitmaps and pixmaps. */ + /* */ + /* <Description> */ + /* This section contains technical definitions. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Raster */ + /* */ + /* <Description> */ + /* A handle (pointer) to a raster object. Each object can be used */ + /* independently to convert an outline into a bitmap or pixmap. */ + /* */ + typedef struct FT_RasterRec_* FT_Raster; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Span */ + /* */ + /* <Description> */ + /* A structure used to model a single span of gray (or black) pixels */ + /* when rendering a monochrome or anti-aliased bitmap. */ + /* */ + /* <Fields> */ + /* x :: The span's horizontal start position. */ + /* */ + /* len :: The span's length in pixels. */ + /* */ + /* coverage :: The span color/coverage, ranging from 0 (background) */ + /* to 255 (foreground). Only used for anti-aliased */ + /* rendering. */ + /* */ + /* <Note> */ + /* This structure is used by the span drawing callback type named */ + /* @FT_SpanFunc which takes the y~coordinate of the span as a */ + /* a parameter. */ + /* */ + /* The coverage value is always between 0 and 255. If you want less */ + /* gray values, the callback function has to reduce them. */ + /* */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_SpanFunc */ + /* */ + /* <Description> */ + /* A function used as a call-back by the anti-aliased renderer in */ + /* order to let client applications draw themselves the gray pixel */ + /* spans on each scan line. */ + /* */ + /* <Input> */ + /* y :: The scanline's y~coordinate. */ + /* */ + /* count :: The number of spans to draw on this scanline. */ + /* */ + /* spans :: A table of `count' spans to draw on the scanline. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Note> */ + /* This callback allows client applications to directly render the */ + /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ + /* */ + /* This can be used to write anti-aliased outlines directly to a */ + /* given background bitmap, and even perform translucency. */ + /* */ + /* Note that the `count' field cannot be greater than a fixed value */ + /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */ + /* `ftoption.h'. By default, this value is set to~32, which means */ + /* that if there are more than 32~spans on a given scanline, the */ + /* callback is called several times with the same `y' parameter in */ + /* order to draw all callbacks. */ + /* */ + /* Otherwise, the callback is only called once per scan-line, and */ + /* only for those scanlines that do have `gray' pixels on them. */ + /* */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitTest_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to test whether a given target pixel is already set to the drawing */ + /* `color'. These tests are crucial to implement drop-out control */ + /* per-se the TrueType spec. */ + /* */ + /* <Input> */ + /* y :: The pixel's y~coordinate. */ + /* */ + /* x :: The pixel's x~coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1~if the pixel is `set', 0~otherwise. */ + /* */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitSet_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to set an individual target pixel. This is crucial to implement */ + /* drop-out control according to the TrueType specification. */ + /* */ + /* <Input> */ + /* y :: The pixel's y~coordinate. */ + /* */ + /* x :: The pixel's x~coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1~if the pixel is `set', 0~otherwise. */ + /* */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_RASTER_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flag constants as used in the `flags' field of a */ + /* @FT_Raster_Params structure. */ + /* */ + /* <Values> */ + /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */ + /* */ + /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ + /* anti-aliased glyph image should be */ + /* generated. Otherwise, it will be */ + /* monochrome (1-bit). */ + /* */ + /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ + /* rendering. In this mode, client */ + /* applications must provide their own span */ + /* callback. This lets them directly */ + /* draw or compose over an existing bitmap. */ + /* If this bit is not set, the target */ + /* pixmap's buffer _must_ be zeroed before */ + /* rendering. */ + /* */ + /* Note that for now, direct rendering is */ + /* only possible with anti-aliased glyphs. */ + /* */ + /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ + /* rendering mode. If set, the output will */ + /* be clipped to a box specified in the */ + /* `clip_box' field of the */ + /* @FT_Raster_Params structure. */ + /* */ + /* Note that by default, the glyph bitmap */ + /* is clipped to the target pixmap, except */ + /* in direct rendering mode where all spans */ + /* are generated if no clipping box is set. */ + /* */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 + + /* deprecated */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Params */ + /* */ + /* <Description> */ + /* A structure to hold the arguments used by a raster's render */ + /* function. */ + /* */ + /* <Fields> */ + /* target :: The target bitmap. */ + /* */ + /* source :: A pointer to the source glyph image (e.g., an */ + /* @FT_Outline). */ + /* */ + /* flags :: The rendering flags. */ + /* */ + /* gray_spans :: The gray span drawing callback. */ + /* */ + /* black_spans :: The black span drawing callback. */ + /* */ + /* bit_test :: The bit test callback. UNIMPLEMENTED! */ + /* */ + /* bit_set :: The bit set callback. UNIMPLEMENTED! */ + /* */ + /* user :: User-supplied data that is passed to each drawing */ + /* callback. */ + /* */ + /* clip_box :: An optional clipping box. It is only used in */ + /* direct rendering mode. Note that coordinates here */ + /* should be expressed in _integer_ pixels (and not in */ + /* 26.6 fixed-point units). */ + /* */ + /* <Note> */ + /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */ + /* bit flag is set in the `flags' field, otherwise a monochrome */ + /* bitmap is generated. */ + /* */ + /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ + /* raster will call the `gray_spans' callback to draw gray pixel */ + /* spans, in the case of an aa glyph bitmap, it will call */ + /* `black_spans', and `bit_test' and `bit_set' in the case of a */ + /* monochrome bitmap. This allows direct composition over a */ + /* pre-existing bitmap through user-provided callbacks to perform the */ + /* span drawing/composition. */ + /* */ + /* Note that the `bit_test' and `bit_set' callbacks are required when */ + /* rendering a monochrome bitmap, as they are crucial to implement */ + /* correct drop-out control as defined in the TrueType specification. */ + /* */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; + FT_Raster_BitTest_Func bit_test; /* doesn't work! */ + FT_Raster_BitSet_Func bit_set; /* doesn't work! */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_NewFunc */ + /* */ + /* <Description> */ + /* A function used to create a new raster object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory allocator. */ + /* */ + /* <Output> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `memory' parameter is a typeless pointer in order to avoid */ + /* un-wanted dependencies on the rest of the FreeType code. In */ + /* practice, it is an @FT_Memory object, i.e., a handle to the */ + /* standard FreeType memory allocator. However, this field can be */ + /* completely ignored by a given raster implementation. */ + /* */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_DoneFunc */ + /* */ + /* <Description> */ + /* A function used to destroy a given raster object. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_ResetFunc */ + /* */ + /* <Description> */ + /* FreeType provides an area of memory called the `render pool', */ + /* available to all registered rasters. This pool can be freely used */ + /* during a given scan-conversion but is shared by all rasters. Its */ + /* content is thus transient. */ + /* */ + /* This function is called each time the render pool changes, or just */ + /* after a new raster object is created. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* pool_base :: The address in memory of the render pool. */ + /* */ + /* pool_size :: The size in bytes of the render pool. */ + /* */ + /* <Note> */ + /* Rasters can ignore the render pool and rely on dynamic memory */ + /* allocation if they want to (a handle to the memory allocator is */ + /* passed to the raster constructor). However, this is not */ + /* recommended for efficiency purposes. */ + /* */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_SetModeFunc */ + /* */ + /* <Description> */ + /* This function is a generic facility to change modes or attributes */ + /* in a given raster. This can be used for debugging purposes, or */ + /* simply to allow implementation-specific `features' in a given */ + /* raster module. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* mode :: A 4-byte tag used to name the mode or property. */ + /* */ + /* args :: A pointer to the new mode/property to use. */ + /* */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_RenderFunc */ + /* */ + /* <Description> */ + /* Invoke a given raster to scan-convert a given glyph image into a */ + /* target bitmap. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* store the rendering parameters. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + /* <Note> */ + /* The exact format of the source image depends on the raster's glyph */ + /* format defined in its @FT_Raster_Funcs structure. It can be an */ + /* @FT_Outline or anything else in order to support a large array of */ + /* glyph formats. */ + /* */ + /* Note also that the render function can fail and return a */ + /* `FT_Err_Unimplemented_Feature' error code if the raster used does */ + /* not support direct composition. */ + /* */ + /* XXX: For now, the standard raster doesn't support direct */ + /* composition but this should change for the final release (see */ + /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */ + /* for examples of distinct implementations which support direct */ + /* composition). */ + /* */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Funcs */ + /* */ + /* <Description> */ + /* A structure used to describe a given raster class to the library. */ + /* */ + /* <Fields> */ + /* glyph_format :: The supported glyph format for this raster. */ + /* */ + /* raster_new :: The raster constructor. */ + /* */ + /* raster_reset :: Used to reset the render pool within the raster. */ + /* */ + /* raster_render :: A function to render a glyph into a given bitmap. */ + /* */ + /* raster_done :: The raster destructor. */ + /* */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTIMAGE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/src/3rdparty/freetype/include/freetype/ftincrem.h b/src/3rdparty/freetype/include/freetype/ftincrem.h new file mode 100644 index 0000000000..96abedea7b --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftincrem.h @@ -0,0 +1,349 @@ +/***************************************************************************/ +/* */ +/* ftincrem.h */ +/* */ +/* FreeType incremental loading (specification). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTINCREM_H__ +#define __FTINCREM_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * `incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application, + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a PostScript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /*************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * `incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., PostScript interpreters), + * where the glyph data isn't in the font file, or must be overridden by + * different values. + * + * @note: + * It is up to client applications to create and implement @FT_Incremental + * objects, as long as they provide implementations for the methods + * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc + * and @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + * + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_MetricsRec + * + * @description: + * A small structure used to contain the basic glyph metrics returned + * by the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical' argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + * + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + + } FT_Incremental_MetricsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A handle to an @FT_Incremental_MetricsRec structure. + * + */ + typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the `glyf' table. For PostScript formats, it must correspond to the + * *unencrypted* charstring bytes, without any `lenIV' header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release + * the data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + * + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This is necessary because, in certain + * formats like TrueType, the metrics are stored in a different place from + * the glyph images proper. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. + * The original glyph metrics, if any, in font units. If metrics are + * not available all the values must be set to zero. + * + * @output: + * ametrics :: + * The replacement glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data + * incrementally. Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does + * not provide overriding glyph metrics. + * + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * { + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * } + * + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * A constant used as the tag of @FT_Parameter structures to indicate + * an incremental loading object to be used by FreeType. + * + */ +#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + /* */ + +FT_END_HEADER + +#endif /* __FTINCREM_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftlcdfil.h b/src/3rdparty/freetype/include/freetype/ftlcdfil.h new file mode 100644 index 0000000000..c6201b38e9 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftlcdfil.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.h */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs */ +/* (specification). */ +/* */ +/* Copyright 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_LCD_FILTER_H__ +#define __FT_LCD_FILTER_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * lcd_filtering + * + * @title: + * LCD Filtering + * + * @abstract: + * Reduce color fringes of LCD-optimized bitmaps. + * + * @description: + * The @FT_Library_SetLcdFilter API can be used to specify a low-pass + * filter which is then applied to LCD-optimized bitmaps generated + * through @FT_Render_Glyph. This is useful to reduce color fringes + * which would occur with unfiltered rendering. + * + * Note that no filter is active by default, and that this function is + * *not* implemented in default builds of the library. You need to + * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file + * in order to activate it. + */ + + + /**************************************************************************** + * + * @func: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * The default filter reduces color fringes considerably, at the cost + * of a slight blurriness in the output. + * + * FT_LCD_FILTER_LIGHT :: + * The light filter is a variant that produces less blurriness at the + * cost of slightly more color fringes than the default one. It might + * be better, depending on taste, your monitor, or your personal vision. + * + * FT_LCD_FILTER_LEGACY :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * In other words, it only works well if the TrueType bytecode + * interpreter is enabled *and* high-quality hinted fonts are used. + * + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. + * + * @since: + * 2.3.0 + */ + typedef enum FT_LcdFilter_ + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @func: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to apply color filtering to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work + * well on most LCD screens. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This feature is always disabled by default. Clients must make an + * explicit call to this function with a `filter' value other than + * @FT_LCD_FILTER_NONE in order to enable it. + * + * Due to *PATENTS* covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature' if the + * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * The filter affects glyph bitmaps rendered through @FT_Render_Glyph, + * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char. + * + * It does _not_ affect the output of @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * If this feature is activated, the dimensions of LCD glyph bitmaps are + * either larger or taller than the dimensions of the corresponding + * outline with regards to the pixel grid. For example, for + * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and + * up to 3~pixels to the right. + * + * The bitmap offset values are adjusted correctly, so clients shouldn't + * need to modify their layout and glyph positioning code when enabling + * the filter. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + /* */ + + +FT_END_HEADER + +#endif /* __FT_LCD_FILTER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftlist.h b/src/3rdparty/freetype/include/freetype/ftlist.h new file mode 100644 index 0000000000..93b05fc0d6 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftlist.h @@ -0,0 +1,273 @@ +/***************************************************************************/ +/* */ +/* ftlist.h */ +/* */ +/* Generic list support for FreeType (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file implements functions relative to list processing. Its */ + /* data structures are defined in `freetype.h'. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTLIST_H__ +#define __FTLIST_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /* <Title> */ + /* List Processing */ + /* */ + /* <Abstract> */ + /* Simple management of lists. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to list */ + /* processing using doubly-linked nodes. */ + /* */ + /* <Order> */ + /* FT_List */ + /* FT_ListNode */ + /* FT_ListRec */ + /* FT_ListNodeRec */ + /* */ + /* FT_List_Add */ + /* FT_List_Insert */ + /* FT_List_Find */ + /* FT_List_Remove */ + /* FT_List_Up */ + /* FT_List_Iterate */ + /* FT_List_Iterator */ + /* FT_List_Finalize */ + /* FT_List_Destructor */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Find */ + /* */ + /* <Description> */ + /* Find the list node for a given listed object. */ + /* */ + /* <Input> */ + /* list :: A pointer to the parent list. */ + /* data :: The address of the listed object. */ + /* */ + /* <Return> */ + /* List node. NULL if it wasn't found. */ + /* */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Add */ + /* */ + /* <Description> */ + /* Append an element to the end of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to append. */ + /* */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Insert */ + /* */ + /* <Description> */ + /* Insert an element at the head of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to parent list. */ + /* node :: The node to insert. */ + /* */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Remove */ + /* */ + /* <Description> */ + /* Remove a node from a list. This function doesn't check whether */ + /* the node is in the list! */ + /* */ + /* <Input> */ + /* node :: The node to remove. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Up */ + /* */ + /* <Description> */ + /* Move a node to the head/top of a list. Used to maintain LRU */ + /* lists. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to move. */ + /* */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Iterator */ + /* */ + /* <Description> */ + /* An FT_List iterator function which is called during a list parse */ + /* by @FT_List_Iterate. */ + /* */ + /* <Input> */ + /* node :: The current iteration list node. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. */ + /* Can be used to point to the iteration's state. */ + /* */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Iterate */ + /* */ + /* <Description> */ + /* Parse a list and calls a given iterator function on each element. */ + /* Note that parsing is stopped as soon as one of the iterator calls */ + /* returns a non-zero value. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* iterator :: An iterator function, called on each node of the list. */ + /* user :: A user-supplied field which is passed as the second */ + /* argument to the iterator. */ + /* */ + /* <Return> */ + /* The result (a FreeType error code) of the last iterator call. */ + /* */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Destructor */ + /* */ + /* <Description> */ + /* An @FT_List iterator function which is called during a list */ + /* finalization by @FT_List_Finalize to destroy all elements in a */ + /* given list. */ + /* */ + /* <Input> */ + /* system :: The current system object. */ + /* */ + /* data :: The current object to destroy. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. It can */ + /* be used to point to the iteration's state. */ + /* */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Finalize */ + /* */ + /* <Description> */ + /* Destroy all elements in the list as well as the list itself. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* */ + /* destroy :: A list destructor that will be applied to each element */ + /* of the list. */ + /* */ + /* memory :: The current memory object which handles deallocation. */ + /* */ + /* user :: A user-supplied field which is passed as the last */ + /* argument to the destructor. */ + /* */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTLIST_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftlzw.h b/src/3rdparty/freetype/include/freetype/ftlzw.h new file mode 100644 index 0000000000..00d40169a7 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftlzw.h @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* ftlzw.h */ +/* */ +/* LZW-compressed stream support. */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTLZW_H__ +#define __FTLZW_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* lzw */ + /* */ + /* <Title> */ + /* LZW Streams */ + /* */ + /* <Abstract> */ + /* Using LZW-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of LZW-specific functions. */ + /* */ + /*************************************************************************/ + + /************************************************************************ + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is + * mainly used to support the compressed `*.pcf.Z' fonts that come + * with XFree86. + * + * @input: + * stream :: The target embedding stream. + * + * source :: The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream + * + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it + * and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTLZW_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftmac.h b/src/3rdparty/freetype/include/freetype/ftmac.h new file mode 100644 index 0000000000..ab5bab5170 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftmac.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftmac.h */ +/* */ +/* Additional Mac-specific API. */ +/* */ +/* Copyright 1996-2001, 2004, 2006, 2007 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* NOTE: Include this file after <freetype/freetype.h> and after any */ +/* Mac-specific headers (because this header uses Mac types such as */ +/* Handle, FSSpec, FSRef, etc.) */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMAC_H__ +#define __FTMAC_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + +/* gcc-3.4.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined(__GNUC__) && \ + ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) +#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated)) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* mac_specific */ + /* */ + /* <Title> */ + /* Mac Specific Interface */ + /* */ + /* <Abstract> */ + /* Only available on the Macintosh. */ + /* */ + /* <Description> */ + /* The following definitions are only available if FreeType is */ + /* compiled on a Macintosh. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FOND */ + /* */ + /* <Description> */ + /* Create a new face object from a FOND resource. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* fond :: A FOND resource. */ + /* */ + /* face_index :: Only supported for the -1 `sanity check' special */ + /* case. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Notes> */ + /* This function can be used to create @FT_Face objects from fonts */ + /* that are installed in the system as follows. */ + /* */ + /* { */ + /* fond = GetResource( 'FOND', fontName ); */ + /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font (e.g., Times New Roman */ + /* Bold). */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFilePath_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return a pathname of the disk file and face index for given font */ + /* name which is handled by ATS framework. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* path :: Buffer to store pathname of the file. For passing */ + /* to @FT_New_Face. The client must allocate this */ + /* buffer before calling this function. */ + /* */ + /* maxPathSize :: Lengths of the buffer `path' that client allocated. */ + /* */ + /* face_index :: Index of the face. For passing to @FT_New_Face. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSSpec to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSSpec to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index~0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */ + /* it accepts an FSSpec instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSRef */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSRef to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSRef to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index~0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */ + /* it accepts an FSRef instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* __FTMAC_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftmm.h b/src/3rdparty/freetype/include/freetype/ftmm.h new file mode 100644 index 0000000000..3aefb9e4f2 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftmm.h @@ -0,0 +1,378 @@ +/***************************************************************************/ +/* */ +/* ftmm.h */ +/* */ +/* FreeType Multiple Master font interface (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMM_H__ +#define __FTMM_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* multiple_masters */ + /* */ + /* <Title> */ + /* Multiple Masters */ + /* */ + /* <Abstract> */ + /* How to manage Multiple Masters fonts. */ + /* */ + /* <Description> */ + /* The following types and functions are used to manage Multiple */ + /* Master fonts, i.e., the selection of specific design instances by */ + /* setting design axis coordinates. */ + /* */ + /* George Williams has extended this interface to make it work with */ + /* both Type~1 Multiple Masters fonts and GX distortable (var) */ + /* fonts. Some of these routines only work with MM fonts, others */ + /* will work with both types. They are similar enough that a */ + /* consistent interface makes sense. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters fonts. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Multi_Master */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* font. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* num_axis :: Number of axes. Cannot exceed~4. */ + /* */ + /* num_designs :: Number of designs; should be normally 2^num_axis */ + /* even though the Type~1 specification strangely */ + /* allows for intermediate designs to be present. This */ + /* number cannot exceed~16. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters and GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* Not always meaningful for GX. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* def :: The axis's default design coordinate. */ + /* FreeType computes meaningful default values for MM; it */ + /* is then an integer value, not in 16.16 format. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + /* tag :: The axis's tag (the GX equivalent to `name'). */ + /* FreeType provides default values for MM if possible. */ + /* */ + /* strid :: The entry in `name' table (another GX version of */ + /* `name'). */ + /* Not meaningful for MM. */ + /* */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Named_Style */ + /* */ + /* <Description> */ + /* A simple structure used to model a named style in a GX var font. */ + /* */ + /* This structure can't be used for MM fonts. */ + /* */ + /* <Fields> */ + /* coords :: The design coordinates for this style. */ + /* This is an array with one entry for each axis. */ + /* */ + /* strid :: The entry in `name' table identifying this style. */ + /* */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + + } FT_Var_Named_Style; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Var */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* or GX var distortable font. */ + /* */ + /* Some fields are specific to one format and not to the other. */ + /* */ + /* <Fields> */ + /* num_axis :: The number of axes. The maximum value is~4 for */ + /* MM; no limit in GX. */ + /* */ + /* num_designs :: The number of designs; should be normally */ + /* 2^num_axis for MM fonts. Not meaningful for GX */ + /* (where every glyph could have a different */ + /* number of designs). */ + /* */ + /* num_namedstyles :: The number of named styles; only meaningful for */ + /* GX which allows certain design coordinates to */ + /* have a string ID (in the `name' table) */ + /* associated with them. The font can tell the */ + /* user that, for example, Weight=1.5 is `Bold'. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* GX fonts contain slightly more data than MM. */ + /* */ + /* namedstyles :: A table of named styles. */ + /* Only meaningful with GX. */ + /* */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Multi_Master */ + /* */ + /* <Description> */ + /* Retrieve the Multiple Master descriptor of a given font. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_MM_Var */ + /* */ + /* <Description> */ + /* Retrieve the Multiple Master/GX var descriptor of a given font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters/GX var descriptor. */ + /* Allocates a data structure, which the user must free */ + /* (a single call to FT_FREE will do it). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters fonts, choose an interpolated font design */ + /* through design coordinates. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Master or GX Var fonts, choose an interpolated font */ + /* design through design coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Blend_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters and GX var fonts, choose an interpolated font */ + /* design through normalized blend coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: The design coordinates array (each element must be */ + /* between 0 and 1.0). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Blend_Coordinates */ + /* */ + /* <Description> */ + /* This is another name of @FT_Set_MM_Blend_Coordinates. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMM_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftmodapi.h b/src/3rdparty/freetype/include/freetype/ftmodapi.h new file mode 100644 index 0000000000..b051d34a88 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftmodapi.h @@ -0,0 +1,441 @@ +/***************************************************************************/ +/* */ +/* ftmodapi.h */ +/* */ +/* FreeType modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMODAPI_H__ +#define __FTMODAPI_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /* <Title> */ + /* Module Management */ + /* */ + /* <Abstract> */ + /* How to add, upgrade, and remove modules from FreeType. */ + /* */ + /* <Description> */ + /* The definitions below are used to manage modules within FreeType. */ + /* Modules can be added, upgraded, and removed at runtime. */ + /* */ + /*************************************************************************/ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER + + + typedef FT_Pointer FT_Module_Interface; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Constructor */ + /* */ + /* <Description> */ + /* A function used to initialize (not create) a new module object. */ + /* */ + /* <Input> */ + /* module :: The module to initialize. */ + /* */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Destructor */ + /* */ + /* <Description> */ + /* A function used to finalize (not destroy) a given module object. */ + /* */ + /* <Input> */ + /* module :: The module to finalize. */ + /* */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Requester */ + /* */ + /* <Description> */ + /* A function used to query a given module for a specific interface. */ + /* */ + /* <Input> */ + /* module :: The module to finalize. */ + /* */ + /* name :: The name of the interface in the module. */ + /* */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Module_Class */ + /* */ + /* <Description> */ + /* The module class descriptor. */ + /* */ + /* <Fields> */ + /* module_flags :: Bit flags describing the module. */ + /* */ + /* module_size :: The size of one module object/instance in */ + /* bytes. */ + /* */ + /* module_name :: The name of the module. */ + /* */ + /* module_version :: The version, as a 16.16 fixed number */ + /* (major.minor). */ + /* */ + /* module_requires :: The version of FreeType this module requires, */ + /* as a 16.16 fixed number (major.minor). Starts */ + /* at version 2.0, i.e., 0x20000. */ + /* */ + /* module_init :: The initializing function. */ + /* */ + /* module_done :: The finalizing function. */ + /* */ + /* get_interface :: The interface requesting function. */ + /* */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Module */ + /* */ + /* <Description> */ + /* Add a new module to a given library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* clazz :: A pointer to class descriptor for the module. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module */ + /* */ + /* <Description> */ + /* Find a module by its name. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module handle. 0~if none was found. */ + /* */ + /* <Note> */ + /* FreeType's internal modules aren't documented very well, and you */ + /* should look up the source code for details. */ + /* */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Remove_Module */ + /* */ + /* <Description> */ + /* Remove a given module from a library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to a library object. */ + /* */ + /* <Input> */ + /* module :: A handle to a module object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The module object is destroyed by the function in case of success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Library */ + /* */ + /* <Description> */ + /* This function is used to create a new FreeType library instance */ + /* from a given memory object. It is thus possible to use libraries */ + /* with distinct memory allocators within the same program. */ + /* */ + /* <Input> */ + /* memory :: A handle to the original memory object. */ + /* */ + /* <Output> */ + /* alibrary :: A pointer to handle of a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Library */ + /* */ + /* <Description> */ + /* Discard a given library object. This closes all drivers and */ + /* discards all resource objects. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + +/* */ + + typedef void + (*FT_DebugHook_Func)( void* arg ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Debug_Hook */ + /* */ + /* <Description> */ + /* Set a debug hook function for debugging the interpreter of a font */ + /* format. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* hook_index :: The index of the debug hook. You should use the */ + /* values defined in `ftobjs.h', e.g., */ + /* `FT_DEBUG_HOOK_TRUETYPE'. */ + /* */ + /* debug_hook :: The function used to debug the interpreter. */ + /* */ + /* <Note> */ + /* Currently, four debug hook slots are available, but only two (for */ + /* the TrueType and the Type~1 interpreter) are defined. */ + /* */ + /* Since the internal headers of FreeType are no longer installed, */ + /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */ + /* This is a bug and will be fixed in a forthcoming release. */ + /* */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Default_Modules */ + /* */ + /* <Description> */ + /* Add the set of default drivers to a given library object. */ + /* This is only useful when you create a library object with */ + /* @FT_New_Library (usually to plug a custom memory manager). */ + /* */ + /* <InOut> */ + /* library :: A handle to a new library object. */ + /* */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode + * engine is implemented in a given FT_Library instance. It is used + * by the @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * The library implements a bytecode interpreter that doesn't + * support the patented operations of the TrueType virtual machine. + * + * Its main use is to load certain Asian fonts which position and + * scale glyph components with bytecode instructions. It produces + * bad output for most other fonts. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers + * the full instruction set of the TrueType virtual machine. + * See the file `docs/PATENTS' for legal aspects. + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @func: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of + * the TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMODAPI_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftmoderr.h b/src/3rdparty/freetype/include/freetype/ftmoderr.h new file mode 100644 index 0000000000..b0115dd0dd --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftmoderr.h @@ -0,0 +1,155 @@ +/***************************************************************************/ +/* */ +/* ftmoderr.h */ +/* */ +/* FreeType module error offsets (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the FreeType module error offsets. */ + /* */ + /* The lower byte gives the error code, the higher byte gives the */ + /* module. The base module has error offset 0. For example, the error */ + /* `FT_Err_Invalid_File_Format' has value 0x003, the error */ + /* `TT_Err_Invalid_File_Format' has value 0x1103, the error */ + /* `T1_Err_Invalid_File_Format' has value 0x1203, etc. */ + /* */ + /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h */ + /* to make the higher byte always zero (disabling the module error */ + /* mechanism). */ + /* */ + /* It can also be used to create a module error message table easily */ + /* with something like */ + /* */ + /* { */ + /* #undef __FTMODERR_H__ */ + /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */ + /* #define FT_MODERR_START_LIST { */ + /* #define FT_MODERR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int mod_err_offset; */ + /* const char* mod_err_msg */ + /* } ft_mod_errors[] = */ + /* */ + /* #include FT_MODULE_ERRORS_H */ + /* } */ + /* */ + /* To use such a table, all errors must be ANDed with 0xFF00 to remove */ + /* the error code. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTMODERR_H__ +#define __FTMODERR_H__ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Cache, 0x300, "cache module" ) + FT_MODERRDEF( CFF, 0x400, "CFF module" ) + FT_MODERRDEF( CID, 0x500, "CID module" ) + FT_MODERRDEF( Gzip, 0x600, "Gzip module" ) + FT_MODERRDEF( LZW, 0x700, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x800, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0x900, "PCF module" ) + FT_MODERRDEF( PFR, 0xA00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xB00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xC00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xD00, "PS names module" ) + FT_MODERRDEF( Raster, 0xE00, "raster module" ) + FT_MODERRDEF( SFNT, 0xF00, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1000, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1100, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1200, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1300, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1400, "Windows FON/FNT module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* __FTMODERR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftotval.h b/src/3rdparty/freetype/include/freetype/ftotval.h new file mode 100644 index 0000000000..027f2e8865 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftotval.h @@ -0,0 +1,203 @@ +/***************************************************************************/ +/* */ +/* ftotval.h */ +/* */ +/* FreeType API for validating OpenType tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* */ +/* Warning: This module might be moved to a different library in the */ +/* future to avoid a tight dependency between FreeType and the */ +/* OpenType specification. */ +/* */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOTVAL_H__ +#define __FTOTVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* ot_validation */ + /* */ + /* <Title> */ + /* OpenType Validation */ + /* */ + /* <Abstract> */ + /* An API to validate OpenType tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_MATH :: + * Validate MATH table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 +#define FT_VALIDATE_MATH 0x2000 + +#define FT_VALIDATE_OT FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF | \ + FT_VALIDATE_MATH + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A NULL value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOTVAL_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftoutln.h b/src/3rdparty/freetype/include/freetype/ftoutln.h new file mode 100644 index 0000000000..ea60d43e8e --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftoutln.h @@ -0,0 +1,538 @@ +/***************************************************************************/ +/* */ +/* ftoutln.h */ +/* */ +/* Support for the FT_Outline type used to store glyph shapes of */ +/* most scalable font formats (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOUTLN_H__ +#define __FTOUTLN_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /* <Title> */ + /* Outline Processing */ + /* */ + /* <Abstract> */ + /* Functions to create, transform, and render vectorial glyph images. */ + /* */ + /* <Description> */ + /* This section contains routines used to create and destroy scalable */ + /* glyph images known as `outlines'. These can also be measured, */ + /* transformed, and converted into bitmaps and pixmaps. */ + /* */ + /* <Order> */ + /* FT_Outline */ + /* FT_OUTLINE_FLAGS */ + /* FT_Outline_New */ + /* FT_Outline_Done */ + /* FT_Outline_Copy */ + /* FT_Outline_Translate */ + /* FT_Outline_Transform */ + /* FT_Outline_Embolden */ + /* FT_Outline_Reverse */ + /* FT_Outline_Check */ + /* */ + /* FT_Outline_Get_CBox */ + /* FT_Outline_Get_BBox */ + /* */ + /* FT_Outline_Get_Bitmap */ + /* FT_Outline_Render */ + /* */ + /* FT_Outline_Decompose */ + /* FT_Outline_Funcs */ + /* FT_Outline_MoveTo_Func */ + /* FT_Outline_LineTo_Func */ + /* FT_Outline_ConicTo_Func */ + /* FT_Outline_CubicTo_Func */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Decompose */ + /* */ + /* <Description> */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bezier arcs. This function is also able to emit */ + /* `move to' and `close to' operations to indicate the start and end */ + /* of new contours in the outline. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* <InOut> */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_New */ + /* */ + /* <Description> */ + /* Create a new outline of a given size. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object from where the */ + /* outline is allocated. Note however that the new */ + /* outline will *not* necessarily be *freed*, when */ + /* destroying the library, by @FT_Done_FreeType. */ + /* */ + /* numPoints :: The maximal number of points within the outline. */ + /* */ + /* numContours :: The maximal number of contours within the outline. */ + /* */ + /* <Output> */ + /* anoutline :: A handle to the new outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' parameter is simply */ + /* to use the library's memory allocator. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Done */ + /* */ + /* <Description> */ + /* Destroy an outline created with @FT_Outline_New. */ + /* */ + /* <Input> */ + /* library :: A handle of the library object used to allocate the */ + /* outline. */ + /* */ + /* outline :: A pointer to the outline object to be discarded. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If the outline's `owner' field is not set, only the outline */ + /* descriptor will be released. */ + /* */ + /* The reason why this function takes an `library' parameter is */ + /* simply to use ft_mem_free(). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Check */ + /* */ + /* <Description> */ + /* Check the contents of an outline descriptor. */ + /* */ + /* <Input> */ + /* outline :: A handle to a source outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_CBox */ + /* */ + /* <Description> */ + /* Return an outline's `control box'. The control box encloses all */ + /* the outline's points, including Bezier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bezier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <Output> */ + /* acbox :: The outline's control box. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Translate */ + /* */ + /* <Description> */ + /* Apply a simple translation to the points of an outline. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* xOffset :: The horizontal offset. */ + /* */ + /* yOffset :: The vertical offset. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Copy */ + /* */ + /* <Description> */ + /* Copy an outline into another one. Both objects must have the */ + /* same sizes (number of points & number of contours) when this */ + /* function is called. */ + /* */ + /* <Input> */ + /* source :: A handle to the source outline. */ + /* */ + /* <Output> */ + /* target :: A handle to the target outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Transform */ + /* */ + /* <Description> */ + /* Apply a simple 2x2 matrix to all of an outline's points. Useful */ + /* for applying rotations, slanting, flipping, etc. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation matrix. */ + /* */ + /* <Note> */ + /* You can use @FT_Outline_Translate if you need to translate the */ + /* outline's points. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Embolden */ + /* */ + /* <Description> */ + /* Embolden an outline. The new outline will be at most 4~times */ + /* `strength' pixels wider and higher. You may think of the left and */ + /* bottom borders as unchanged. */ + /* */ + /* Negative `strength' values to reduce the outline thickness are */ + /* possible also. */ + /* */ + /* <InOut> */ + /* outline :: A handle to the target outline. */ + /* */ + /* <Input> */ + /* strength :: How strong the glyph is emboldened. Expressed in */ + /* 26.6 pixel format. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The used algorithm to increase or decrease the thickness of the */ + /* glyph doesn't change the number of points; this means that certain */ + /* situations like acute angles or intersections are sometimes */ + /* handled incorrectly. */ + /* */ + /* If you need `better' metrics values you should call */ + /* @FT_Outline_Get_CBox ot @FT_Outline_Get_BBox. */ + /* */ + /* Example call: */ + /* */ + /* { */ + /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */ + /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */ + /* FT_Outline_Embolden( &face->slot->outline, strength ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Reverse */ + /* */ + /* <Description> */ + /* Reverse the drawing direction of an outline. This is used to */ + /* ensure consistent fill conventions for mirrored glyphs. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Note> */ + /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */ + /* the outline's `flags' field. */ + /* */ + /* It shouldn't be used by a normal client application, unless it */ + /* knows what it is doing. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_Bitmap */ + /* */ + /* <Description> */ + /* Render an outline within a bitmap. The outline's image is simply */ + /* OR-ed to the target bitmap. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the target bitmap descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function does NOT CREATE the bitmap, it only renders an */ + /* outline image within the one you pass to it! Consequently, the */ + /* various fields in `abitmap' should be set accordingly. */ + /* */ + /* It will use the raster corresponding to the default glyph format. */ + /* */ + /* The value of the `num_grays' field in `abitmap' is ignored. If */ + /* you select the gray-level rasterizer, and you want less than 256 */ + /* gray levels, you have to use @FT_Outline_Render directly. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Render */ + /* */ + /* <Description> */ + /* Render an outline within a bitmap using the current scan-convert. */ + /* This function uses an @FT_Raster_Params structure as an argument, */ + /* allowing advanced features like direct composition, translucency, */ + /* etc. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* describe the rendering operation. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You should know what you are doing and how @FT_Raster_Params works */ + /* to use this function. */ + /* */ + /* The field `params.source' will be set to `outline' before the scan */ + /* converter is called, which means that the value you give to it is */ + /* actually ignored. */ + /* */ + /* The gray-level rasterizer always uses 256 gray levels. If you */ + /* want less gray levels, you have to provide your own span callback. */ + /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */ + /* @FT_Raster_Params structure for more details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must + * be filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise contours + * must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its + * fill orientation (see @FT_Orientation). This is done by computing + * the direction of each global horizontal and/or vertical extrema + * within the outline. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOUTLN_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/src/3rdparty/freetype/include/freetype/ftpfr.h b/src/3rdparty/freetype/include/freetype/ftpfr.h new file mode 100644 index 0000000000..0b7b7d427c --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftpfr.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftpfr.h */ +/* */ +/* FreeType API for accessing PFR-specific data (specification only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTPFR_H__ +#define __FTPFR_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* pfr_fonts */ + /* */ + /* <Title> */ + /* PFR Fonts */ + /* */ + /* <Abstract> */ + /* PFR/TrueDoc specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of PFR-specific functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed + * in metrics units to device sub-pixels. This is equivalent to + * `face->size->x_scale', but for metrics only. Optional (parameter + * can be NULL). + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale' but for the vertical direction. + * optional (parameter can be NULL). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: A handle to the input face. + * + * left :: Index of the left glyph. + * + * right :: Index of the right glyph. + * + * @output: + * avector :: A kerning vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function always return distances in original PFR metrics + * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED + * mode, which always returns distances converted to outline units. + * + * You can use the value of the `x_scale' and `y_scale' parameters + * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: A handle to the input face. + * + * gindex :: The glyph index. + * + * @output: + * aadvance :: The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics + * to convert the advance to device sub-pixels (i.e., 1/64th of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTPFR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftrender.h b/src/3rdparty/freetype/include/freetype/ftrender.h new file mode 100644 index 0000000000..41c31eac48 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftrender.h @@ -0,0 +1,234 @@ +/***************************************************************************/ +/* */ +/* ftrender.h */ +/* */ +/* FreeType renderer modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRENDER_H__ +#define __FTRENDER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /*************************************************************************/ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_UInt mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Renderer_Class */ + /* */ + /* <Description> */ + /* The renderer module class descriptor. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Module_Class fields. */ + /* */ + /* glyph_format :: The glyph image format this renderer handles. */ + /* */ + /* render_glyph :: A method used to render the image that is in a */ + /* given glyph slot into a bitmap. */ + /* */ + /* transform_glyph :: A method used to transform the image that is in */ + /* a given glyph slot. */ + /* */ + /* get_glyph_cbox :: A method used to access the glyph's cbox. */ + /* */ + /* set_mode :: A method used to pass additional parameters. */ + /* */ + /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ + /* This is a pointer to its raster's class. */ + /* */ + /* raster :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ + /* This is a pointer to the corresponding raster */ + /* object, if any. */ + /* */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Renderer */ + /* */ + /* <Description> */ + /* Retrieve the current renderer for a given glyph format. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* format :: The glyph format. */ + /* */ + /* <Return> */ + /* A renderer handle. 0~if none found. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */ + /* renderer by its name, use @FT_Get_Module. */ + /* */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Renderer */ + /* */ + /* <Description> */ + /* Set the current renderer to use, and set additional mode. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* renderer :: A handle to the renderer object. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* parameters :: Additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* In case of success, the renderer will be used to convert glyph */ + /* images in the renderer's known format into bitmaps. */ + /* */ + /* This doesn't change the current renderer for other formats. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTRENDER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftsizes.h b/src/3rdparty/freetype/include/freetype/ftsizes.h new file mode 100644 index 0000000000..3e548cc39f --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftsizes.h @@ -0,0 +1,159 @@ +/***************************************************************************/ +/* */ +/* ftsizes.h */ +/* */ +/* FreeType size objects management (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Typical application would normally not need to use these functions. */ + /* However, they have been placed in a public API for the rare cases */ + /* where they are needed. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSIZES_H__ +#define __FTSIZES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sizes_management */ + /* */ + /* <Title> */ + /* Size Management */ + /* */ + /* <Abstract> */ + /* Managing multiple sizes per face. */ + /* */ + /* <Description> */ + /* When creating a new face object (e.g., with @FT_New_Face), an */ + /* @FT_Size object is automatically created and used to store all */ + /* pixel-size dependent information, available in the `face->size' */ + /* field. */ + /* */ + /* It is however possible to create more sizes for a given face, */ + /* mostly in order to manage several character pixel sizes of the */ + /* same font family and style. See @FT_New_Size and @FT_Done_Size. */ + /* */ + /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */ + /* modify the contents of the current `active' size; you thus need */ + /* to use @FT_Activate_Size to change it. */ + /* */ + /* 99% of applications won't need the functions provided here, */ + /* especially if they use the caching sub-system, so be cautious */ + /* when using these. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Size */ + /* */ + /* <Description> */ + /* Create a new size object from a given face object. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* asize :: A handle to a new size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You need to call @FT_Activate_Size in order to select the new size */ + /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */ + /* @FT_Load_Glyph, @FT_Load_Char, etc. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Size */ + /* */ + /* <Description> */ + /* Discard a given size object. Note that @FT_Done_Face */ + /* automatically discards all size objects allocated with */ + /* @FT_New_Size. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Activate_Size */ + /* */ + /* <Description> */ + /* Even though it is possible to create several size objects for a */ + /* given face (see @FT_New_Size for details), functions like */ + /* @FT_Load_Glyph or @FT_Load_Char only use the one which has been */ + /* activated last to determine the `current character pixel size'. */ + /* */ + /* This function can be used to `activate' a previously created size */ + /* object. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If `face' is the size's parent face object, this function changes */ + /* the value of `face->size' to the input size handle. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTSIZES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftsnames.h b/src/3rdparty/freetype/include/freetype/ftsnames.h new file mode 100644 index 0000000000..477e1e3ce8 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftsnames.h @@ -0,0 +1,170 @@ +/***************************************************************************/ +/* */ +/* ftsnames.h */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (specification). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_SFNT_NAMES_H__ +#define __FT_SFNT_NAMES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sfnt_names */ + /* */ + /* <Title> */ + /* SFNT Names */ + /* */ + /* <Abstract> */ + /* Access the names embedded in TrueType and OpenType files. */ + /* */ + /* <Description> */ + /* The TrueType and OpenType specifications allow the inclusion of */ + /* a special `names table' in font files. This table contains */ + /* textual (and internationalized) information regarding the font, */ + /* like family name, copyright, version, etc. */ + /* */ + /* The definitions below are used to access them if available. */ + /* */ + /* Note that this has nothing to do with glyph names! */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SfntName */ + /* */ + /* <Description> */ + /* A structure used to model an SFNT `name' table entry. */ + /* */ + /* <Fields> */ + /* platform_id :: The platform ID for `string'. */ + /* */ + /* encoding_id :: The encoding ID for `string'. */ + /* */ + /* language_id :: The language ID for `string'. */ + /* */ + /* name_id :: An identifier for `string'. */ + /* */ + /* string :: The `name' string. Note that its format differs */ + /* depending on the (platform,encoding) pair. It can */ + /* be a Pascal String, a UTF-16 one, etc. */ + /* */ + /* Generally speaking, the string is not */ + /* zero-terminated. Please refer to the TrueType */ + /* specification for details. */ + /* */ + /* string_len :: The length of `string' in bytes. */ + /* */ + /* <Note> */ + /* Possible values for `platform_id', `encoding_id', `language_id', */ + /* and `name_id' are given in the file `ttnameid.h'. For details */ + /* please refer to the TrueType or OpenType specification. */ + /* */ + /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ + /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */ + /* */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name_Count */ + /* */ + /* <Description> */ + /* Retrieve the number of name strings in the SFNT `name' table. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Return> */ + /* The number of strings in the `name' table. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name */ + /* */ + /* <Description> */ + /* Retrieve a string of the SFNT `name' table for a given index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* idx :: The index of the `name' string. */ + /* */ + /* <Output> */ + /* aname :: The indexed @FT_SfntName structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `string' array returned in the `aname' structure is not */ + /* null-terminated. */ + /* */ + /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */ + /* `name' table entries, then do a loop until you get the right */ + /* platform, encoding, and name ID. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FT_SFNT_NAMES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftstroke.h b/src/3rdparty/freetype/include/freetype/ftstroke.h new file mode 100644 index 0000000000..0c10122a88 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftstroke.h @@ -0,0 +1,716 @@ +/***************************************************************************/ +/* */ +/* ftstroke.h */ +/* */ +/* FreeType path stroker (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_STROKE_H__ +#define __FT_STROKE_H__ + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************ + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial + * glyph. It also allows you to retrieve the `outside' and/or the + * `inside' borders of the stroke. + * + * This can be useful to generate `bordered' glyph, i.e., glyphs + * displayed with a coloured (and anti-aliased) border around their + * shape. + */ + + + /************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handler to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered + * in a stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used + * to join two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins; i.e., the two joining lines + * are extended until they intersect. + * + * FT_STROKER_LINEJOIN_MITER :: + * Same as beveled rendering, except that an additional line + * break is added if the angle between the two joining lines + * is too closed (this is useful to avoid unpleasant spikes + * in beveled rendering). + */ + typedef enum FT_Stroker_LineJoin_ + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL, + FT_STROKER_LINEJOIN_MITER + + } FT_Stroker_LineJoin; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are + * rendered in a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last + * point itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the + * last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the + * last point. + */ + typedef enum FT_Stroker_LineCap_ + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border + * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the `inside' and `outside' + * borders. However, there is no direct mapping between these and the + * `left' and `right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum FT_StrokerBorder_ + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `inside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `outside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the FT_STROKER_LINEJOIN_MITER style, + * expressed as 16.16 fixed point value. + * + * @note: + * The radius is expressed in the same units as the outline + * coordinates. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. + * You should call this function before beginning a new + * series of calls to @FT_Stroker_BeginSubPath or + * @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with + * the stroker. The resulting outline(s) can be retrieved + * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead + * of a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened' is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct `border' outlines. + * + * If `opened' is~1, the outline is processed as an open path, and the + * stroker generates a single `stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If~1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is useful when you need to stroke a path that is + * not stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. + * If the subpath was not `opened', this function `draws' a + * single line segment to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * `Draw' a single line segment in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * `Draw' a single quadratic Bezier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * `Draw' a single cubic Bezier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to second Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export one of the `border' or `stroke' + * outlines generated by the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right'. + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to + * retrieve the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the corresponding border to your own @FT_Outline + * structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to + * get sure that there is enough room in your @FT_Outline object to + * receive all new data. + * + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right' + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to + * retrieve all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export all points/borders from the stroked + * outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the all borders to your own @FT_Outline structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be NULL. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but + * only return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If~1, return the inside border, otherwise + * the outside border. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* __FT_STROKE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/src/3rdparty/freetype/include/freetype/ftsynth.h b/src/3rdparty/freetype/include/freetype/ftsynth.h new file mode 100644 index 0000000000..a068b7928d --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftsynth.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* ftsynth.h */ +/* */ +/* FreeType synthesizing code for emboldening and slanting */ +/* (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Main reason for not lifting the functions in this module to a */ + /* `standard' API is that the used parameters for emboldening and */ + /* slanting are not configurable. Consider the functions as a */ + /* code resource which should be copied into the application and */ + /* adapted to the particular needs. */ + + +#ifndef __FTSYNTH_H__ +#define __FTSYNTH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Embolden a glyph by a `reasonable' value (which is highly a matter of */ + /* taste). This function is actually a convenience function, providing */ + /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ + /* */ + /* For emboldened outlines the metrics are estimates only; if you need */ + /* precise values you should call @FT_Outline_Get_CBox. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + /* Slant an outline glyph to the right by about 12 degrees. */ + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + +FT_END_HEADER + +#endif /* __FTSYNTH_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftsystem.h b/src/3rdparty/freetype/include/freetype/ftsystem.h new file mode 100644 index 0000000000..a95b2c76b6 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftsystem.h @@ -0,0 +1,346 @@ +/***************************************************************************/ +/* */ +/* ftsystem.h */ +/* */ +/* FreeType low-level system interface definition (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSYSTEM_H__ +#define __FTSYSTEM_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* system_interface */ + /* */ + /* <Title> */ + /* System Interface */ + /* */ + /* <Abstract> */ + /* How FreeType manages memory and i/o. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to memory */ + /* management and i/o access. You need to understand this */ + /* information if you want to use a custom memory manager or you own */ + /* i/o streams. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* M E M O R Y M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************* + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size' bytes from `memory'. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0~in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************* + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************* + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0~in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************* + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType~2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /*************************************************************************/ + /* */ + /* I / O M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************* + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*' in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************* + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset of read in stream (always from start). + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * The number of bytes effectively read by the stream. + * + * @note: + * This function might be called to perform a seek or skip operation + * with a `count' of~0. + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************* + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************* + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to NULL for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*' + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream;s close function. + * + * memory :: + * The memory manager to use to preload frames. This is set + * internally by FreeType and shouldn't be touched by stream + * implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTSYSTEM_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/fttrigon.h b/src/3rdparty/freetype/include/freetype/fttrigon.h new file mode 100644 index 0000000000..6b77d2ee54 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/***************************************************************************/ +/* */ +/* fttrigon.h */ +/* */ +/* FreeType trigonometric functions (specification). */ +/* */ +/* Copyright 2001, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTRIGON_H__ +#define __FTTRIGON_H__ + +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed float value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************* + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in + * the 2d plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************* + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `value2-value1'. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x' will be `sin(angle)', and the value of + * `vec.y' will be `cos(angle)'. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTTRIGON_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/fttypes.h b/src/3rdparty/freetype/include/freetype/fttypes.h new file mode 100644 index 0000000000..54f08e3e5a --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/fttypes.h @@ -0,0 +1,587 @@ +/***************************************************************************/ +/* */ +/* fttypes.h */ +/* */ +/* FreeType simple types definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTYPES_H__ +#define __FTTYPES_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_SYSTEM_H +#include FT_IMAGE_H + +#include <stddef.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /* <Title> */ + /* Basic Data Types */ + /* */ + /* <Abstract> */ + /* The basic data types defined by the library. */ + /* */ + /* <Description> */ + /* This section contains the basic data types defined by FreeType~2, */ + /* ranging from simple scalar types to bitmap descriptors. More */ + /* font-specific structures are defined in a different section. */ + /* */ + /* <Order> */ + /* FT_Byte */ + /* FT_Bytes */ + /* FT_Char */ + /* FT_Int */ + /* FT_UInt */ + /* FT_Int16 */ + /* FT_UInt16 */ + /* FT_Int32 */ + /* FT_UInt32 */ + /* FT_Short */ + /* FT_UShort */ + /* FT_Long */ + /* FT_ULong */ + /* FT_Bool */ + /* FT_Offset */ + /* FT_PtrDist */ + /* FT_String */ + /* FT_Tag */ + /* FT_Error */ + /* FT_Fixed */ + /* FT_Pointer */ + /* FT_Pos */ + /* FT_Vector */ + /* FT_BBox */ + /* FT_Matrix */ + /* FT_FWord */ + /* FT_UFWord */ + /* FT_F2Dot14 */ + /* FT_UnitVector */ + /* FT_F26Dot6 */ + /* */ + /* */ + /* FT_Generic */ + /* FT_Generic_Finalizer */ + /* */ + /* FT_Bitmap */ + /* FT_Pixel_Mode */ + /* FT_Palette_Mode */ + /* FT_Glyph_Format */ + /* FT_IMAGE_TAG */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bool */ + /* */ + /* <Description> */ + /* A typedef of unsigned char, used for simple booleans. As usual, */ + /* values 1 and~0 represent true and false, respectively. */ + /* */ + typedef unsigned char FT_Bool; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_FWord */ + /* */ + /* <Description> */ + /* A signed 16-bit integer used to store a distance in original font */ + /* units. */ + /* */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UFWord */ + /* */ + /* <Description> */ + /* An unsigned 16-bit integer used to store a distance in original */ + /* font units. */ + /* */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Char */ + /* */ + /* <Description> */ + /* A simple typedef for the _signed_ char type. */ + /* */ + typedef signed char FT_Char; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Byte */ + /* */ + /* <Description> */ + /* A simple typedef for the _unsigned_ char type. */ + /* */ + typedef unsigned char FT_Byte; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bytes */ + /* */ + /* <Description> */ + /* A typedef for constant memory areas. */ + /* */ + typedef const FT_Byte* FT_Bytes; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Tag */ + /* */ + /* <Description> */ + /* A typedef for 32-bit tags (as used in the SFNT format). */ + /* */ + typedef FT_UInt32 FT_Tag; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_String */ + /* */ + /* <Description> */ + /* A simple typedef for the char type, usually used for strings. */ + /* */ + typedef char FT_String; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Short */ + /* */ + /* <Description> */ + /* A typedef for signed short. */ + /* */ + typedef signed short FT_Short; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UShort */ + /* */ + /* <Description> */ + /* A typedef for unsigned short. */ + /* */ + typedef unsigned short FT_UShort; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Int */ + /* */ + /* <Description> */ + /* A typedef for the int type. */ + /* */ + typedef signed int FT_Int; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UInt */ + /* */ + /* <Description> */ + /* A typedef for the unsigned int type. */ + /* */ + typedef unsigned int FT_UInt; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Long */ + /* */ + /* <Description> */ + /* A typedef for signed long. */ + /* */ + typedef signed long FT_Long; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ULong */ + /* */ + /* <Description> */ + /* A typedef for unsigned long. */ + /* */ + typedef unsigned long FT_ULong; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F2Dot14 */ + /* */ + /* <Description> */ + /* A signed 2.14 fixed float type used for unit vectors. */ + /* */ + typedef signed short FT_F2Dot14; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F26Dot6 */ + /* */ + /* <Description> */ + /* A signed 26.6 fixed float type used for vectorial pixel */ + /* coordinates. */ + /* */ + typedef signed long FT_F26Dot6; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Fixed */ + /* */ + /* <Description> */ + /* This type is used to store 16.16 fixed float values, like scaling */ + /* values or matrix coefficients. */ + /* */ + typedef signed long FT_Fixed; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Error */ + /* */ + /* <Description> */ + /* The FreeType error code type. A value of~0 is always interpreted */ + /* as a successful operation. */ + /* */ + typedef int FT_Error; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pointer */ + /* */ + /* <Description> */ + /* A simple typedef for a typeless pointer. */ + /* */ + typedef void* FT_Pointer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Offset */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */ + /* _unsigned_ integer type used to express a file size or position, */ + /* or a memory block size. */ + /* */ + typedef size_t FT_Offset; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_PtrDist */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */ + /* largest _signed_ integer type used to express the distance */ + /* between two pointers. */ + /* */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_UnitVector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector unit vector. Uses */ + /* FT_F2Dot14 types. */ + /* */ + /* <Fields> */ + /* x :: Horizontal coordinate. */ + /* */ + /* y :: Vertical coordinate. */ + /* */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Matrix */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2x2 matrix. Coefficients are */ + /* in 16.16 fixed float format. The computation performed is: */ + /* */ + /* { */ + /* x' = x*xx + y*xy */ + /* y' = x*yx + y*yy */ + /* } */ + /* */ + /* <Fields> */ + /* xx :: Matrix coefficient. */ + /* */ + /* xy :: Matrix coefficient. */ + /* */ + /* yx :: Matrix coefficient. */ + /* */ + /* yy :: Matrix coefficient. */ + /* */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Data */ + /* */ + /* <Description> */ + /* Read-only binary data represented as a pointer and a length. */ + /* */ + /* <Fields> */ + /* pointer :: The data. */ + /* */ + /* length :: The length of the data in bytes. */ + /* */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_Int length; + + } FT_Data; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Generic_Finalizer */ + /* */ + /* <Description> */ + /* Describe a function used to destroy the `client' data of any */ + /* FreeType object. See the description of the @FT_Generic type for */ + /* details of usage. */ + /* */ + /* <Input> */ + /* The address of the FreeType object which is under finalization. */ + /* Its client data is accessed through its `generic' field. */ + /* */ + typedef void (*FT_Generic_Finalizer)(void* object); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Generic */ + /* */ + /* <Description> */ + /* Client applications often need to associate their own data to a */ + /* variety of FreeType core objects. For example, a text layout API */ + /* might want to associate a glyph cache to a given size object. */ + /* */ + /* Most FreeType object contains a `generic' field, of type */ + /* FT_Generic, which usage is left to client applications and font */ + /* servers. */ + /* */ + /* It can be used to store a pointer to client-specific data, as well */ + /* as the address of a `finalizer' function, which will be called by */ + /* FreeType when the object is destroyed (for example, the previous */ + /* client example would put the address of the glyph cache destructor */ + /* in the `finalizer' field). */ + /* */ + /* <Fields> */ + /* data :: A typeless pointer to any client-specified data. This */ + /* field is completely ignored by the FreeType library. */ + /* */ + /* finalizer :: A pointer to a `generic finalizer' function, which */ + /* will be called when the object is destroyed. If this */ + /* field is set to NULL, no code will be called. */ + /* */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_MAKE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags which are used to label */ + /* TrueType tables into an unsigned long to be used within FreeType. */ + /* */ + /* <Note> */ + /* The produced values *must* be 32-bit integers. Don't redefine */ + /* this macro. */ + /* */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ListNode */ + /* */ + /* <Description> */ + /* Many elements and objects in FreeType are listed through an */ + /* @FT_List record (see @FT_ListRec). As its name suggests, an */ + /* FT_ListNode is a handle to a single list element. */ + /* */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_List */ + /* */ + /* <Description> */ + /* A handle to a list record (see @FT_ListRec). */ + /* */ + typedef struct FT_ListRec_* FT_List; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListNodeRec */ + /* */ + /* <Description> */ + /* A structure used to hold a single list element. */ + /* */ + /* <Fields> */ + /* prev :: The previous element in the list. NULL if first. */ + /* */ + /* next :: The next element in the list. NULL if last. */ + /* */ + /* data :: A typeless pointer to the listed object. */ + /* */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListRec */ + /* */ + /* <Description> */ + /* A structure used to hold a simple doubly-linked list. These are */ + /* used in many parts of FreeType. */ + /* */ + /* <Fields> */ + /* head :: The head (first element) of doubly-linked list. */ + /* */ + /* tail :: The tail (last element) of doubly-linked list. */ + /* */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + + /* */ + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) + + /* return base error code (without module-specific prefix) */ +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) + + /* return module error code */ +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_BOOL( x ) ( (FT_Bool)( x ) ) + +FT_END_HEADER + +#endif /* __FTTYPES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ftwinfnt.h b/src/3rdparty/freetype/include/freetype/ftwinfnt.h new file mode 100644 index 0000000000..9a4cf58939 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftwinfnt.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.h */ +/* */ +/* FreeType API for accessing Windows fnt-specific data. */ +/* */ +/* Copyright 2003, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTWINFNT_H__ +#define __FTWINFNT_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* winfnt_fonts */ + /* */ + /* <Title> */ + /* Window FNT Files */ + /* */ + /* <Abstract> */ + /* Windows FNT specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Windows FNT specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset' byte in + * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX + * encodings (except for cp1361) can be found at ftp://ftp.unicode.org + * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is + * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a + * `don't care' value. Valid font files don't contain this value. + * When querying for information about the character set of the font + * that is currently selected into a specified device context, this + * return value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Poettgen <michael@poettgen.de>: + * + * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM + * is used for the charset of vector fonts, like `modern.fon', + * `roman.fon', and `script.fon' on Windows. + * + * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value + * specifies a character set that is operating-system dependent. + * + * The `IFIMETRICS' documentation from the `Windows Driver + * Development Kit' says: This font supports an OEM-specific + * character set. The OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the + * second default codepage that most international versions of + * Windows have. It is one of the OEM codepages from + * + * http://www.microsoft.com/globaldev/reference/cphome.mspx, + * + * and is used for the `DOS boxes', to support legacy applications. + * A German Windows version for example usually uses ANSI codepage + * 1252 and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS~C 5601-1987 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big~5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_HeaderRec */ + /* */ + /* <Description> */ + /* Windows FNT Header info. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_Header */ + /* */ + /* <Description> */ + /* A handle to an @FT_WinFNT_HeaderRec structure. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; + + + /********************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: A handle to the input face. + * + * @output: + * aheader :: The WinFNT header. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + /* */ + +FT_END_HEADER + +#endif /* __FTWINFNT_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/src/3rdparty/freetype/include/freetype/ftxf86.h b/src/3rdparty/freetype/include/freetype/ftxf86.h new file mode 100644 index 0000000000..ae9ff076fa --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ftxf86.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* ftxf86.h */ +/* */ +/* Support functions for X11. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTXF86_H__ +#define __FTXF86_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* font_formats */ + /* */ + /* <Title> */ + /* Font Formats */ + /* */ + /* <Abstract> */ + /* Getting the font format. */ + /* */ + /* <Description> */ + /* The single function in this section can be used to get the font */ + /* format. Note that this information is not needed normally; */ + /* however, there are special cases (like in PDF devices) where it is */ + /* important to differentiate, in spite of FreeType's uniform API. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_X11_Font_Format */ + /* */ + /* <Description> */ + /* Return a string describing the format of a given face, using values */ + /* which can be used as an X11 FONT_PROPERTY. Possible values are */ + /* `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */ + /* `PFR', and `Windows~FNT'. */ + /* */ + /* <Input> */ + /* face :: */ + /* Input face handle. */ + /* */ + /* <Return> */ + /* Font format string. NULL in case of error. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + /* */ + +FT_END_HEADER + +#endif /* __FTXF86_H__ */ diff --git a/src/3rdparty/freetype/include/freetype/internal/autohint.h b/src/3rdparty/freetype/include/freetype/internal/autohint.h new file mode 100644 index 0000000000..ee004022f9 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/autohint.h @@ -0,0 +1,205 @@ +/***************************************************************************/ +/* */ +/* autohint.h */ +/* */ +/* High-level `autohint' module-specific interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The auto-hinter is used to load and automatically hint glyphs if a */ + /* format-specific hinter isn't available. */ + /* */ + /*************************************************************************/ + + +#ifndef __AUTOHINT_H__ +#define __AUTOHINT_H__ + + + /*************************************************************************/ + /* */ + /* A small technical note regarding automatic hinting in order to */ + /* clarify this module interface. */ + /* */ + /* An automatic hinter might compute two kinds of data for a given face: */ + /* */ + /* - global hints: Usually some metrics that describe global properties */ + /* of the face. It is computed by scanning more or less */ + /* aggressively the glyphs in the face, and thus can be */ + /* very slow to compute (even if the size of global */ + /* hints is really small). */ + /* */ + /* - glyph hints: These describe some important features of the glyph */ + /* outline, as well as how to align them. They are */ + /* generally much faster to compute than global hints. */ + /* */ + /* The current FreeType auto-hinter does a pretty good job while */ + /* performing fast computations for both global and glyph hints. */ + /* However, we might be interested in introducing more complex and */ + /* powerful algorithms in the future, like the one described in the John */ + /* D. Hobby paper, which unfortunately requires a lot more horsepower. */ + /* */ + /* Because a sufficiently sophisticated font management system would */ + /* typically implement an LRU cache of opened face objects to reduce */ + /* memory usage, it is a good idea to be able to avoid recomputing */ + /* global hints every time the same face is re-opened. */ + /* */ + /* We thus provide the ability to cache global hints outside of the face */ + /* object, in order to speed up font re-opening time. Of course, this */ + /* feature is purely optional, so most client programs won't even notice */ + /* it. */ + /* */ + /* I initially thought that it would be a good idea to cache the glyph */ + /* hints too. However, my general idea now is that if you really need */ + /* to cache these too, you are simply in need of a new font format, */ + /* where all this information could be stored within the font file and */ + /* decoded on the fly. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct FT_AutoHinterRec_ *FT_AutoHinter; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalGetFunc */ + /* */ + /* <Description> */ + /* Retrieves the global hints computed for a given face object the */ + /* resulting data is dissociated from the face and will survive a */ + /* call to FT_Done_Face(). It must be discarded through the API */ + /* FT_AutoHinter_GlobalDoneFunc(). */ + /* */ + /* <Input> */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* global_hints :: A typeless pointer to the global hints. */ + /* */ + /* global_len :: The size in bytes of the global hints. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, + FT_Face face, + void** global_hints, + long* global_len ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalDoneFunc */ + /* */ + /* <Description> */ + /* Discards the global hints retrieved through */ + /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */ + /* are freed from memory. */ + /* */ + /* <Input> */ + /* hinter :: A handle to the auto-hinter module. */ + /* */ + /* global :: A pointer to retrieved global hints to discard. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, + void* global ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalResetFunc */ + /* */ + /* <Description> */ + /* This function is used to recompute the global metrics in a given */ + /* font. This is useful when global font data changes (e.g. Multiple */ + /* Masters fonts where blend coordinates change). */ + /* */ + /* <Input> */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the face. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, + FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlyphLoadFunc */ + /* */ + /* <Description> */ + /* This function is used to load, scale, and automatically hint a */ + /* glyph from a given face. */ + /* */ + /* <Input> */ + /* face :: A handle to the face. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* load_flags :: The load flags. */ + /* */ + /* <Note> */ + /* This function is capable of loading composite glyphs by hinting */ + /* each sub-glyph independently (which improves quality). */ + /* */ + /* It will call the font driver with FT_Load_Glyph(), with */ + /* FT_LOAD_NO_SCALE set. */ + /* */ + typedef FT_Error + (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_AutoHinter_ServiceRec */ + /* */ + /* <Description> */ + /* The auto-hinter module's interface. */ + /* */ + typedef struct FT_AutoHinter_ServiceRec_ + { + FT_AutoHinter_GlobalResetFunc reset_face; + FT_AutoHinter_GlobalGetFunc get_global_hints; + FT_AutoHinter_GlobalDoneFunc done_global_hints; + FT_AutoHinter_GlyphLoadFunc load_glyph; + + } FT_AutoHinter_ServiceRec, *FT_AutoHinter_Service; + + +FT_END_HEADER + +#endif /* __AUTOHINT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftcalc.h b/src/3rdparty/freetype/include/freetype/internal/ftcalc.h new file mode 100644 index 0000000000..58def34cab --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftcalc.h @@ -0,0 +1,178 @@ +/***************************************************************************/ +/* */ +/* ftcalc.h */ +/* */ +/* Arithmetic computations (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCALC_H__ +#define __FTCALC_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FixedSqrt */ + /* */ + /* <Description> */ + /* Computes the square root of a 16.16 fixed point value. */ + /* */ + /* <Input> */ + /* x :: The value to compute the root for. */ + /* */ + /* <Return> */ + /* The result of `sqrt(x)'. */ + /* */ + /* <Note> */ + /* This function is not very fast. */ + /* */ + FT_BASE( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Sqrt32 */ + /* */ + /* <Description> */ + /* Computes the square root of an Int32 integer (which will be */ + /* handled as an unsigned long value). */ + /* */ + /* <Input> */ + /* x :: The value to compute the root for. */ + /* */ + /* <Return> */ + /* The result of `sqrt(x)'. */ + /* */ + FT_EXPORT( FT_Int32 ) + FT_Sqrt32( FT_Int32 x ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv_No_Round */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* (without rounding) with maximal accuracy (it uses a 64-bit */ + /* intermediate integer whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_BASE( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* + * A variant of FT_Matrix_Multiply which scales its result afterwards. + * The idea is that both `a' and `b' are scaled by factors of 10 so that + * the values are as precise as possible to get a correct result during + * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of + * `a' and `b', respectively, then the scaling factor of the result is + * `sa*sb'. + */ + FT_BASE( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ); + + + /* + * A variant of FT_Vector_Transform. See comments for + * FT_Matrix_Multiply_Scaled. + */ + + FT_BASE( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ); + + + /* + * Return -1, 0, or +1, depending on the orientation of a given corner. + * We use the Cartesian coordinate system, with positive vertical values + * going upwards. The function returns +1 if the corner turns to the + * left, -1 to the right, and 0 for undecidable cases. + */ + FT_BASE( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + /* + * Return TRUE if a corner is flat or nearly flat. This is equivalent to + * saying that the angle difference between the `in' and `out' vectors is + * very small. + */ + FT_BASE( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + +#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) +#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) +#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) +#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) +#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) + +#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ + : ( -( ( 32 - (x) ) & -64 ) ) ) + + +FT_END_HEADER + +#endif /* __FTCALC_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftdebug.h b/src/3rdparty/freetype/include/freetype/internal/ftdebug.h new file mode 100644 index 0000000000..7baae3531d --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftdebug.h @@ -0,0 +1,250 @@ +/***************************************************************************/ +/* */ +/* ftdebug.h */ +/* */ +/* Debugging and logging component (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/* */ +/* IMPORTANT: A description of FreeType's debugging support can be */ +/* found in `docs/DEBUG.TXT'. Read it if you need to use or */ +/* understand this code. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDEBUG_H__ +#define __FTDEBUG_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ + /* is already defined; this simplifies the following #ifdefs */ + /* */ +#ifdef FT_DEBUG_LEVEL_TRACE +#undef FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_ERROR +#endif + + + /*************************************************************************/ + /* */ + /* Define the trace enums as well as the trace levels array when they */ + /* are needed. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE_DEF( x ) trace_ ## x , + + /* defining the enumeration */ + typedef enum FT_Trace_ + { +#include FT_INTERNAL_TRACE_H + trace_count + + } FT_Trace; + + + /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ + extern int ft_trace_levels[trace_count]; + +#undef FT_TRACE_DEF + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Define the FT_TRACE macro */ + /* */ + /* IMPORTANT! */ + /* */ + /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ + /* value before using any TRACE macro. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE( level, varformat ) \ + do \ + { \ + if ( ft_trace_levels[FT_COMPONENT] >= level ) \ + FT_Message varformat; \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Count */ + /* */ + /* <Description> */ + /* Return the number of available trace components. */ + /* */ + /* <Return> */ + /* The number of trace components. 0 if FreeType 2 is not built with */ + /* FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* This function may be useful if you want to access elements of */ + /* the internal `ft_trace_levels' array by an index. */ + /* */ + FT_BASE( FT_Int ) + FT_Trace_Get_Count( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Name */ + /* */ + /* <Description> */ + /* Return the name of a trace component. */ + /* */ + /* <Input> */ + /* The index of the trace component. */ + /* */ + /* <Return> */ + /* The name of the trace component. This is a statically allocated */ + /* C string, so do not free it after use. NULL if FreeType 2 is not */ + /* built with FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* Use @FT_Trace_Get_Count to get the number of available trace */ + /* components. */ + /* */ + /* This function may be useful if you want to control FreeType 2's */ + /* debug level in your application. */ + /* */ + FT_BASE( const char * ) + FT_Trace_Get_Name( FT_Int idx ); + + + /*************************************************************************/ + /* */ + /* You need two opening and closing parentheses! */ + /* */ + /* Example: FT_TRACE0(( "Value is %i", foo )) */ + /* */ + /* Output of the FT_TRACEX macros is sent to stderr. */ + /* */ + /*************************************************************************/ + +#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) +#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) +#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) +#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) +#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) +#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) +#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) +#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) + + + /*************************************************************************/ + /* */ + /* Define the FT_ERROR macro. */ + /* */ + /* Output of this macro is sent to stderr. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ERROR( varformat ) FT_Message varformat + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define the FT_ASSERT macro. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ASSERT( condition ) \ + do \ + { \ + if ( !( condition ) ) \ + FT_Panic( "assertion failed on line %d of file %s\n", \ + __LINE__, __FILE__ ); \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ASSERT( condition ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define `FT_Message' and `FT_Panic' when needed. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#include "stdio.h" /* for vfprintf() */ + + /* print a message */ + FT_BASE( void ) + FT_Message( const char* fmt, + ... ); + + /* print a message and exit */ + FT_BASE( void ) + FT_Panic( const char* fmt, + ... ); + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + FT_BASE( void ) + ft_debug_init( void ); + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* We disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings. */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + +FT_END_HEADER + +#endif /* __FTDEBUG_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftdriver.h b/src/3rdparty/freetype/include/freetype/internal/ftdriver.h new file mode 100644 index 0000000000..854abad085 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftdriver.h @@ -0,0 +1,249 @@ +/***************************************************************************/ +/* */ +/* ftdriver.h */ +/* */ +/* FreeType font driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDRIVER_H__ +#define __FTDRIVER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + typedef FT_Error + (*FT_Face_InitFunc)( FT_Stream stream, + FT_Face face, + FT_Int typeface_index, + FT_Int num_params, + FT_Parameter* parameters ); + + typedef void + (*FT_Face_DoneFunc)( FT_Face face ); + + + typedef FT_Error + (*FT_Size_InitFunc)( FT_Size size ); + + typedef void + (*FT_Size_DoneFunc)( FT_Size size ); + + + typedef FT_Error + (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); + + typedef void + (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); + + + typedef FT_Error + (*FT_Size_RequestFunc)( FT_Size size, + FT_Size_Request req ); + + typedef FT_Error + (*FT_Size_SelectFunc)( FT_Size size, + FT_ULong size_index ); + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + typedef FT_Error + (*FT_Size_ResetPointsFunc)( FT_Size size, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + typedef FT_Error + (*FT_Size_ResetPixelsFunc)( FT_Size size, + FT_UInt pixel_width, + FT_UInt pixel_height ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + typedef FT_Error + (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + typedef FT_UInt + (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, + FT_Long charcode ); + + typedef FT_Long + (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, + FT_Long charcode ); + + + typedef FT_Error + (*FT_Face_GetKerningFunc)( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ); + + + typedef FT_Error + (*FT_Face_AttachFunc)( FT_Face face, + FT_Stream stream ); + + + typedef FT_Error + (*FT_Face_GetAdvancesFunc)( FT_Face face, + FT_UInt first, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Driver_ClassRec */ + /* */ + /* <Description> */ + /* The font driver class. This structure mostly contains pointers to */ + /* driver methods. */ + /* */ + /* <Fields> */ + /* root :: The parent module. */ + /* */ + /* face_object_size :: The size of a face object in bytes. */ + /* */ + /* size_object_size :: The size of a size object in bytes. */ + /* */ + /* slot_object_size :: The size of a glyph object in bytes. */ + /* */ + /* init_face :: The format-specific face constructor. */ + /* */ + /* done_face :: The format-specific face destructor. */ + /* */ + /* init_size :: The format-specific size constructor. */ + /* */ + /* done_size :: The format-specific size destructor. */ + /* */ + /* init_slot :: The format-specific slot constructor. */ + /* */ + /* done_slot :: The format-specific slot destructor. */ + /* */ + /* */ + /* load_glyph :: A function handle to load a glyph to a slot. */ + /* This field is mandatory! */ + /* */ + /* get_kerning :: A function handle to return the unscaled */ + /* kerning for a given pair of glyphs. Can be */ + /* set to 0 if the format doesn't support */ + /* kerning. */ + /* */ + /* attach_file :: This function handle is used to read */ + /* additional data for a face from another */ + /* file/stream. For example, this can be used to */ + /* add data from AFM or PFM files on a Type 1 */ + /* face, or a CIDMap on a CID-keyed face. */ + /* */ + /* get_advances :: A function handle used to return advance */ + /* widths of `count' glyphs (in font units), */ + /* starting at `first'. The `vertical' flag must */ + /* be set to get vertical advance heights. The */ + /* `advances' buffer is caller-allocated. */ + /* Currently not implemented. The idea of this */ + /* function is to be able to perform */ + /* device-independent text layout without loading */ + /* a single glyph image. */ + /* */ + /* request_size :: A handle to a function used to request the new */ + /* character size. Can be set to 0 if the */ + /* scaling done in the base layer suffices. */ + /* */ + /* select_size :: A handle to a function used to select a new */ + /* fixed size. It is used only if */ + /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */ + /* to 0 if the scaling done in the base layer */ + /* suffices. */ + /* <Note> */ + /* Most function pointers, with the exception of `load_glyph', can be */ + /* set to 0 to indicate a default behaviour. */ + /* */ + typedef struct FT_Driver_ClassRec_ + { + FT_Module_Class root; + + FT_Long face_object_size; + FT_Long size_object_size; + FT_Long slot_object_size; + + FT_Face_InitFunc init_face; + FT_Face_DoneFunc done_face; + + FT_Size_InitFunc init_size; + FT_Size_DoneFunc done_size; + + FT_Slot_InitFunc init_slot; + FT_Slot_DoneFunc done_slot; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_Size_ResetPointsFunc set_char_sizes; + FT_Size_ResetPixelsFunc set_pixel_sizes; + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_Slot_LoadFunc load_glyph; + + FT_Face_GetKerningFunc get_kerning; + FT_Face_AttachFunc attach_file; + FT_Face_GetAdvancesFunc get_advances; + + /* since version 2.2 */ + FT_Size_RequestFunc request_size; + FT_Size_SelectFunc select_size; + + } FT_Driver_ClassRec, *FT_Driver_Class; + + + /* + * The following functions are used as stubs for `set_char_sizes' and + * `set_pixel_sizes'; the code uses `request_size' and `select_size' + * functions instead. + * + * Implementation is in `src/base/ftobjs.c'. + */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE( FT_Error ) + ft_stub_set_char_sizes( FT_Size size, + FT_F26Dot6 width, + FT_F26Dot6 height, + FT_UInt horz_res, + FT_UInt vert_res ); + + FT_BASE( FT_Error ) + ft_stub_set_pixel_sizes( FT_Size size, + FT_UInt width, + FT_UInt height ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +FT_END_HEADER + +#endif /* __FTDRIVER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftgloadr.h b/src/3rdparty/freetype/include/freetype/internal/ftgloadr.h new file mode 100644 index 0000000000..548481ac80 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftgloadr.h @@ -0,0 +1,168 @@ +/***************************************************************************/ +/* */ +/* ftgloadr.h */ +/* */ +/* The FreeType glyph loader (specification). */ +/* */ +/* Copyright 2002, 2003, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGLOADR_H__ +#define __FTGLOADR_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphLoader */ + /* */ + /* <Description> */ + /* The glyph loader is an internal object used to load several glyphs */ + /* together (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The glyph loader implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ; + + +#if 0 /* moved to freetype.h in version 2.2 */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 +#endif + + + typedef struct FT_SubGlyphRec_ + { + FT_Int index; + FT_UShort flags; + FT_Int arg1; + FT_Int arg2; + FT_Matrix transform; + + } FT_SubGlyphRec; + + + typedef struct FT_GlyphLoadRec_ + { + FT_Outline outline; /* outline */ + FT_Vector* extra_points; /* extra points table */ + FT_Vector* extra_points2; /* second extra points table */ + FT_UInt num_subglyphs; /* number of subglyphs */ + FT_SubGlyph subglyphs; /* subglyphs */ + + } FT_GlyphLoadRec, *FT_GlyphLoad; + + + typedef struct FT_GlyphLoaderRec_ + { + FT_Memory memory; + FT_UInt max_points; + FT_UInt max_contours; + FT_UInt max_subglyphs; + FT_Bool use_extra; + + FT_GlyphLoadRec base; + FT_GlyphLoadRec current; + + void* other; /* for possible future extension? */ + + } FT_GlyphLoaderRec; + + + /* create new empty glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ); + + /* add an extra points table to a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); + + /* destroy a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ); + + /* reset a glyph loader (frees everything int it) */ + FT_BASE( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ); + + /* rewind a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); + + /* check that there is enough space to add `n_points' and `n_contours' */ + /* to the glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ); + + +#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ + ( (_count) == 0 || (int)((_loader)->base.outline.n_points + \ + (_loader)->current.outline.n_points + \ + (_count)) <= (int)(_loader)->max_points ) + +#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ + ( (_count) == 0 || (int)((_loader)->base.outline.n_contours + \ + (_loader)->current.outline.n_contours + \ + (_count)) <= (int)(_loader)->max_contours ) + +#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours ) \ + ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ + FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ + ? 0 \ + : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) ) + + + /* check that there is enough space to add `n_subs' sub-glyphs to */ + /* a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ); + + /* prepare a glyph loader, i.e. empty the current glyph */ + FT_BASE( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); + + /* add the current glyph to the base glyph */ + FT_BASE( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ); + + /* copy points from one glyph loader to another */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLOADR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftmemory.h b/src/3rdparty/freetype/include/freetype/internal/ftmemory.h new file mode 100644 index 0000000000..2010ca90d7 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftmemory.h @@ -0,0 +1,368 @@ +/***************************************************************************/ +/* */ +/* ftmemory.h */ +/* */ +/* The FreeType memory management macros (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMEMORY_H__ +#define __FTMEMORY_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_SET_ERROR */ + /* */ + /* <Description> */ + /* This macro is used to set an implicit `error' variable to a given */ + /* expression's value (usually a function call), and convert it to a */ + /* boolean which is set whenever the value is != 0. */ + /* */ +#undef FT_SET_ERROR +#define FT_SET_ERROR( expression ) \ + ( ( error = (expression) ) != 0 ) + + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M E M O R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * C++ refuses to handle statements like p = (void*)anything; where `p' + * is a typed pointer. Since we don't have a `typeof' operator in + * standard C++, we have to use ugly casts. + */ + +#ifdef __cplusplus +#define FT_ASSIGNP( p, val ) *((void**)&(p)) = (val) +#else +#define FT_ASSIGNP( p, val ) (p) = (val) +#endif + + + +#ifdef FT_DEBUG_MEMORY + + FT_BASE( const char* ) _ft_debug_file; + FT_BASE( long ) _ft_debug_lineno; + +#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + (exp) ) + +#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + FT_ASSIGNP( p, exp ) ) + +#else /* !FT_DEBUG_MEMORY */ + +#define FT_DEBUG_INNER( exp ) (exp) +#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) + +#endif /* !FT_DEBUG_MEMORY */ + + + /* + * The allocation functions return a pointer, and the error code + * is written to through the `p_error' parameter. See below for + * for documentation. + */ + + FT_BASE( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( void ) + ft_mem_free( FT_Memory memory, + const void* P ); + + +#define FT_MEM_ALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) ) + +#define FT_MEM_FREE( ptr ) \ + FT_BEGIN_STMNT \ + ft_mem_free( memory, (ptr) ); \ + (ptr) = NULL; \ + FT_END_STMNT + +#define FT_MEM_NEW( ptr ) \ + FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, 1, \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, (size), &error ) ) + +#define FT_MEM_QNEW( ptr ) \ + FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, 1, \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (item_size), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (itmsz), \ + (oldcnt), (newcnt), \ + (ptr), &error ) ) + +#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (item_size), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (itmsz), \ + (oldcnt), (newcnt), \ + (ptr), &error ) ) + + +#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) + + +#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) + +#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) + +#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) + + +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) + +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) + + +#define FT_ARRAY_ZERO( dest, count ) \ + FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_COPY( dest, source, count ) \ + FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_MOVE( dest, source, count ) \ + FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) ) + + + /* + * Return the maximum number of addressable elements in an array. + * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid + * any problems. + */ +#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) + +#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) + + + /*************************************************************************/ + /* */ + /* The following functions macros expect that their pointer argument is */ + /* _typed_ in order to automatically compute array element sizes. */ + /* */ + +#define FT_MEM_NEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QNEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + + +#define FT_ALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) + +#define FT_REALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) + +#define FT_ALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) + +#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_QALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) + +#define FT_QREALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) + +#define FT_QALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) + +#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) + +#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) + +#define FT_NEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + +#define FT_QNEW( ptr ) \ + FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) + +#define FT_QNEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE( FT_Error ) + FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ); + + FT_BASE( FT_Error ) + FT_QAlloc( FT_Memory memory, + FT_Long size, + void* *p ); + + FT_BASE( FT_Error ) + FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *P ); + + FT_BASE( FT_Error ) + FT_QRealloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *p ); + + FT_BASE( void ) + FT_Free( FT_Memory memory, + void* *P ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + FT_BASE( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ); + +#define FT_MEM_STRDUP( dst, str ) \ + (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) + +#define FT_STRDUP( dst, str ) \ + FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) + +#define FT_MEM_DUP( dst, address, size ) \ + (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) + +#define FT_DUP( dst, address, size ) \ + FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) + + + /* Return >= 1 if a truncation occurs. */ + /* Return 0 if the source string fits the buffer. */ + /* This is *not* the same as strlcpy(). */ + FT_BASE( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ); + +#define FT_STRCPYN( dst, src, size ) \ + ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) + + /* */ + + +FT_END_HEADER + +#endif /* __FTMEMORY_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftobjs.h b/src/3rdparty/freetype/include/freetype/internal/ftobjs.h new file mode 100644 index 0000000000..1f22343a59 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftobjs.h @@ -0,0 +1,875 @@ +/***************************************************************************/ +/* */ +/* ftobjs.h */ +/* */ +/* The FreeType private base classes (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of all internal FreeType classes. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTOBJS_H__ +#define __FTOBJS_H__ + +#include <ft2build.h> +#include FT_RENDER_H +#include FT_SIZES_H +#include FT_LCD_FILTER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_AUTOHINT_H +#include FT_INTERNAL_SERVICE_H + +#ifdef FT_CONFIG_OPTION_INCREMENTAL +#include FT_INCREMENTAL_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Some generic definitions. */ + /* */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + + + /*************************************************************************/ + /* */ + /* The min and max functions missing in C. As usual, be careful not to */ + /* write things like FT_MIN( a++, b++ ) to avoid side effects. */ + /* */ +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) + +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + + +#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) +#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) +#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) + +#define FT_PIX_FLOOR( x ) ( (x) & ~63 ) +#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) +#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) + + + /* + * Return the highest power of 2 that is <= value; this correspond to + * the highest bit in a given 32-bit value. + */ + FT_BASE( FT_UInt32 ) + ft_highpow2( FT_UInt32 value ); + + + /* + * character classification functions -- since these are used to parse + * font files, we must not use those in <ctypes.h> which are + * locale-dependent + */ +#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) + +#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ + ( (unsigned)(x) - 'a' ) < 6U || \ + ( (unsigned)(x) - 'A' ) < 6U ) + + /* the next two macros assume ASCII representation */ +#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) +#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) + +#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) +#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R M A P S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to internal charmap object */ + typedef struct FT_CMapRec_* FT_CMap; + + /* handle to charmap class structure */ + typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; + + /* internal charmap object structure */ + typedef struct FT_CMapRec_ + { + FT_CharMapRec charmap; + FT_CMap_Class clazz; + + } FT_CMapRec; + + /* typecase any pointer to a charmap handle */ +#define FT_CMAP( x ) ((FT_CMap)( x )) + + /* obvious macros */ +#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id +#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id +#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding +#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face + + + /* class method definitions */ + typedef FT_Error + (*FT_CMap_InitFunc)( FT_CMap cmap, + FT_Pointer init_data ); + + typedef void + (*FT_CMap_DoneFunc)( FT_CMap cmap ); + + typedef FT_UInt + (*FT_CMap_CharIndexFunc)( FT_CMap cmap, + FT_UInt32 char_code ); + + typedef FT_UInt + (*FT_CMap_CharNextFunc)( FT_CMap cmap, + FT_UInt32 *achar_code ); + + typedef FT_UInt + (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, + FT_CMap unicode_cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_Bool + (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_UInt32 * + (*FT_CMap_VariantListFunc)( FT_CMap cmap, + FT_Memory mem ); + + typedef FT_UInt32 * + (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 char_code ); + + typedef FT_UInt32 * + (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 variant_selector ); + + + typedef struct FT_CMap_ClassRec_ + { + FT_ULong size; + FT_CMap_InitFunc init; + FT_CMap_DoneFunc done; + FT_CMap_CharIndexFunc char_index; + FT_CMap_CharNextFunc char_next; + + /* Subsequent entries are special ones for format 14 -- the variant */ + /* selector subtable which behaves like no other */ + + FT_CMap_CharVarIndexFunc char_var_index; + FT_CMap_CharVarIsDefaultFunc char_var_default; + FT_CMap_VariantListFunc variant_list; + FT_CMap_CharVariantListFunc charvariant_list; + FT_CMap_VariantCharListFunc variantchar_list; + + } FT_CMap_ClassRec; + + + /* create a new charmap and add it to charmap->face */ + FT_BASE( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ); + + /* destroy a charmap and remove it from face's list */ + FT_BASE( void ) + FT_CMap_Done( FT_CMap cmap ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Face_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_Face */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* <Fields> */ + /* max_points :: */ + /* The maximal number of points used to store the vectorial outline */ + /* of any glyph in this face. If this value cannot be known in */ + /* advance, or if the face isn't scalable, this should be set to 0. */ + /* Only relevant for scalable formats. */ + /* */ + /* max_contours :: */ + /* The maximal number of contours used to store the vectorial */ + /* outline of any glyph in this face. If this value cannot be */ + /* known in advance, or if the face isn't scalable, this should be */ + /* set to 0. Only relevant for scalable formats. */ + /* */ + /* transform_matrix :: */ + /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ + /* outlines after they are loaded from the font. Only used by the */ + /* convenience functions. */ + /* */ + /* transform_delta :: */ + /* A translation vector used to transform glyph outlines after they */ + /* are loaded from the font. Only used by the convenience */ + /* functions. */ + /* */ + /* transform_flags :: */ + /* Some flags used to classify the transform. Only used by the */ + /* convenience functions. */ + /* */ + /* services :: */ + /* A cache for frequently used services. It should be only */ + /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ + /* */ + /* incremental_interface :: */ + /* If non-null, the interface through which glyph data and metrics */ + /* are loaded incrementally for faces that do not provide all of */ + /* this data when first opened. This field exists only if */ + /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ + /* */ + /* ignore_unpatented_hinter :: */ + /* This boolean flag instructs the glyph loader to ignore the */ + /* native font hinter, if one is found. This is exclusively used */ + /* in the case when the unpatented hinter is compiled within the */ + /* library. */ + /* */ + typedef struct FT_Face_InternalRec_ + { +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_UShort reserved1; + FT_Short reserved2; +#endif + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; + + FT_ServiceCacheRec services; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec* incremental_interface; +#endif + + FT_Bool ignore_unpatented_hinter; + + } FT_Face_InternalRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Slot_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_GlyphSlot */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* <Fields> */ + /* loader :: The glyph loader object used to load outlines */ + /* into the glyph slot. */ + /* */ + /* flags :: Possible values are zero or */ + /* FT_GLYPH_OWN_BITMAP. The latter indicates */ + /* that the FT_GlyphSlot structure owns the */ + /* bitmap buffer. */ + /* */ + /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */ + /* must be transformed through a specific */ + /* font transformation. This is _not_ the same */ + /* as the face transform set through */ + /* FT_Set_Transform(). */ + /* */ + /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */ + /* transformation, if necessary. */ + /* */ + /* glyph_delta :: The 2d translation vector corresponding to */ + /* the glyph transformation, if necessary. */ + /* */ + /* glyph_hints :: Format-specific glyph hints management. */ + /* */ + +#define FT_GLYPH_OWN_BITMAP 0x1 + + typedef struct FT_Slot_InternalRec_ + { + FT_GlyphLoader loader; + FT_UInt flags; + FT_Bool glyph_transformed; + FT_Matrix glyph_matrix; + FT_Vector glyph_delta; + void* glyph_hints; + + } FT_GlyphSlot_InternalRec; + + +#if 0 + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_Size */ + /* object. Currently, it's empty. */ + /* */ + /*************************************************************************/ + + typedef struct FT_Size_InternalRec_ + { + /* empty */ + + } FT_Size_InternalRec; + +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ModuleRec */ + /* */ + /* <Description> */ + /* A module object instance. */ + /* */ + /* <Fields> */ + /* clazz :: A pointer to the module's class. */ + /* */ + /* library :: A handle to the parent library object. */ + /* */ + /* memory :: A handle to the memory manager. */ + /* */ + /* generic :: A generic structure for user-level extensibility (?). */ + /* */ + typedef struct FT_ModuleRec_ + { + FT_Module_Class* clazz; + FT_Library library; + FT_Memory memory; + FT_Generic generic; + + } FT_ModuleRec; + + + /* typecast an object to a FT_Module */ +#define FT_MODULE( x ) ((FT_Module)( x )) +#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz +#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library +#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory + + +#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_FONT_DRIVER ) + +#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_RENDERER ) + +#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_HINTER ) + +#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_STYLER ) + +#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_SCALABLE ) + +#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_NO_OUTLINES ) + +#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_HAS_HINTER ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module_Interface */ + /* */ + /* <Description> */ + /* Finds a module and returns its specific interface as a typeless */ + /* pointer. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module-specific interface if available, 0 otherwise. */ + /* */ + /* <Note> */ + /* You should better be familiar with FreeType internals to know */ + /* which module to look for, and what its interface is :-) */ + /* */ + FT_BASE( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ); + + FT_BASE( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ); + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* a few macros used to perform easy typecasts with minimal brain damage */ + +#define FT_FACE( x ) ((FT_Face)(x)) +#define FT_SIZE( x ) ((FT_Size)(x)) +#define FT_SLOT( x ) ((FT_GlyphSlot)(x)) + +#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver +#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library +#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory +#define FT_FACE_STREAM( x ) FT_FACE( x )->stream + +#define FT_SIZE_FACE( x ) FT_SIZE( x )->face +#define FT_SLOT_FACE( x ) FT_SLOT( x )->face + +#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph +#define FT_FACE_SIZE( x ) FT_FACE( x )->size + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_GlyphSlot */ + /* */ + /* <Description> */ + /* It is sometimes useful to have more than one glyph slot for a */ + /* given face object. This function is used to create additional */ + /* slots. All of them are automatically discarded when the face is */ + /* destroyed. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* aslot :: A handle to a new glyph slot object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_BASE( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_GlyphSlot */ + /* */ + /* <Description> */ + /* Destroys a given glyph slot. Remember however that all slots are */ + /* automatically destroyed with its parent. Using this function is */ + /* not always mandatory. */ + /* */ + /* <Input> */ + /* slot :: A handle to a target glyph slot. */ + /* */ + FT_BASE( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ); + + /* */ + +#define FT_REQUEST_WIDTH( req ) \ + ( (req)->horiResolution \ + ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \ + : (req)->width ) + +#define FT_REQUEST_HEIGHT( req ) \ + ( (req)->vertResolution \ + ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \ + : (req)->height ) + + + /* Set the metrics according to a bitmap strike. */ + FT_BASE( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ); + + + /* Set the metrics according to a size request. */ + FT_BASE( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ); + + + /* Match a size request against `available_sizes'. */ + FT_BASE( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ); + + + /* Use the horizontal metrics to synthesize the vertical metrics. */ + /* If `advance' is zero, it is also synthesized. */ + FT_BASE( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ); + + + /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ + /* was allocated with ft_glyphslot_alloc_bitmap). */ + FT_BASE( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); + + + /* Allocate a new bitmap buffer in a glyph slot. */ + FT_BASE( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ); + + + /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ + /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ + FT_BASE( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FT_RENDERER( x ) ((FT_Renderer)( x )) +#define FT_GLYPH( x ) ((FT_Glyph)( x )) +#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x )) +#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x )) + + + typedef struct FT_RendererRec_ + { + FT_ModuleRec root; + FT_Renderer_Class* clazz; + FT_Glyph_Format glyph_format; + FT_Glyph_Class glyph_class; + + FT_Raster raster; + FT_Raster_Render_Func raster_render; + FT_Renderer_RenderFunc render; + + } FT_RendererRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F O N T D R I V E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* typecast a module into a driver easily */ +#define FT_DRIVER( x ) ((FT_Driver)(x)) + + /* typecast a module as a driver, and get its driver class */ +#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_DriverRec */ + /* */ + /* <Description> */ + /* The root font driver class. A font driver is responsible for */ + /* managing and loading font files of a given format. */ + /* */ + /* <Fields> */ + /* root :: Contains the fields of the root module class. */ + /* */ + /* clazz :: A pointer to the font driver's class. Note that */ + /* this is NOT root.clazz. `class' wasn't used */ + /* as it is a reserved word in C++. */ + /* */ + /* faces_list :: The list of faces currently opened by this */ + /* driver. */ + /* */ + /* extensions :: A typeless pointer to the driver's extensions */ + /* registry, if they are supported through the */ + /* configuration macro FT_CONFIG_OPTION_EXTENSIONS. */ + /* */ + /* glyph_loader :: The glyph loader for all faces managed by this */ + /* driver. This object isn't defined for unscalable */ + /* formats. */ + /* */ + typedef struct FT_DriverRec_ + { + FT_ModuleRec root; + FT_Driver_Class clazz; + + FT_ListRec faces_list; + void* extensions; + + FT_GlyphLoader glyph_loader; + + } FT_DriverRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R I E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* This hook is used by the TrueType debugger. It must be set to an */ + /* alternate truetype bytecode interpreter function. */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /* Set this debug hook to a non-null pointer to force unpatented hinting */ + /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */ + /* during debugging. */ +#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1 + + + typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, + FT_Render_Mode render_mode, + FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_LibraryRec */ + /* */ + /* <Description> */ + /* The FreeType library class. This is the root of all FreeType */ + /* data. Use FT_New_Library() to create a library object, and */ + /* FT_Done_Library() to discard it and all child objects. */ + /* */ + /* <Fields> */ + /* memory :: The library's memory object. Manages memory */ + /* allocation. */ + /* */ + /* generic :: Client data variable. Used to extend the */ + /* Library class by higher levels and clients. */ + /* */ + /* version_major :: The major version number of the library. */ + /* */ + /* version_minor :: The minor version number of the library. */ + /* */ + /* version_patch :: The current patch level of the library. */ + /* */ + /* num_modules :: The number of modules currently registered */ + /* within this library. This is set to 0 for new */ + /* libraries. New modules are added through the */ + /* FT_Add_Module() API function. */ + /* */ + /* modules :: A table used to store handles to the currently */ + /* registered modules. Note that each font driver */ + /* contains a list of its opened faces. */ + /* */ + /* renderers :: The list of renderers currently registered */ + /* within the library. */ + /* */ + /* cur_renderer :: The current outline renderer. This is a */ + /* shortcut used to avoid parsing the list on */ + /* each call to FT_Outline_Render(). It is a */ + /* handle to the current renderer for the */ + /* FT_GLYPH_FORMAT_OUTLINE format. */ + /* */ + /* auto_hinter :: XXX */ + /* */ + /* raster_pool :: The raster object's render pool. This can */ + /* ideally be changed dynamically at run-time. */ + /* */ + /* raster_pool_size :: The size of the render pool in bytes. */ + /* */ + /* debug_hooks :: XXX */ + /* */ + typedef struct FT_LibraryRec_ + { + FT_Memory memory; /* library's memory manager */ + + FT_Generic generic; + + FT_Int version_major; + FT_Int version_minor; + FT_Int version_patch; + + FT_UInt num_modules; + FT_Module modules[FT_MAX_MODULES]; /* module objects */ + + FT_ListRec renderers; /* list of renderers */ + FT_Renderer cur_renderer; /* current outline renderer */ + FT_Module auto_hinter; + + FT_Byte* raster_pool; /* scan-line conversion */ + /* render pool */ + FT_ULong raster_pool_size; /* size of render pool in bytes */ + + FT_DebugHook_Func debug_hooks[4]; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFilter lcd_filter; + FT_Int lcd_extra; /* number of extra pixels */ + FT_Byte lcd_weights[7]; /* filter weights, if any */ + FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ +#endif + + } FT_LibraryRec; + + + FT_BASE( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ); + + FT_BASE( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + typedef const char* + (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); + + typedef FT_Error + (*FT_Face_GetGlyphNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory */ + /* */ + /* <Description> */ + /* Creates a new memory object. */ + /* */ + /* <Return> */ + /* A pointer to the new memory object. 0 in case of error. */ + /* */ + FT_BASE( FT_Memory ) + FT_New_Memory( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Memory */ + /* */ + /* <Description> */ + /* Discards memory manager. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory manager. */ + /* */ + FT_BASE( void ) + FT_Done_Memory( FT_Memory memory ); + +#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* Define default raster's interface. The default raster is located in */ + /* `src/base/ftraster.c'. */ + /* */ + /* Client applications can register new rasters through the */ + /* FT_Set_Raster() API. */ + +#ifndef FT_NO_DEFAULT_RASTER + FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; +#endif + + +FT_END_HEADER + +#endif /* __FTOBJS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftrfork.h b/src/3rdparty/freetype/include/freetype/internal/ftrfork.h new file mode 100644 index 0000000000..aa573c8705 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftrfork.h @@ -0,0 +1,196 @@ +/***************************************************************************/ +/* */ +/* ftrfork.h */ +/* */ +/* Embedded resource forks accessor (specification). */ +/* */ +/* Copyright 2004, 2006, 2007 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#ifndef __FTRFORK_H__ +#define __FTRFORK_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Number of guessing rules supported in `FT_Raccess_Guess'. */ + /* Don't forget to increment the number if you add a new guessing rule. */ +#define FT_RACCESS_N_RULES 9 + + + /* A structure to describe a reference in a resource by its resource ID */ + /* and internal offset. The `POST' resource expects to be concatenated */ + /* by the order of resource IDs instead of its appearance in the file. */ + + typedef struct FT_RFork_Ref_ + { + FT_UShort res_id; + FT_ULong offset; + + } FT_RFork_Ref; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Guess */ + /* */ + /* <Description> */ + /* Guess a file name and offset where the actual resource fork is */ + /* stored. The macro FT_RACCESS_N_RULES holds the number of */ + /* guessing rules; the guessed result for the Nth rule is */ + /* represented as a triplet: a new file name (new_names[N]), a file */ + /* offset (offsets[N]), and an error code (errors[N]). */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* base_name :: */ + /* The (base) file name of the resource fork used for some */ + /* guessing rules. */ + /* */ + /* <Output> */ + /* new_names :: */ + /* An array of guessed file names in which the resource forks may */ + /* exist. If `new_names[N]' is NULL, the guessed file name is */ + /* equal to `base_name'. */ + /* */ + /* offsets :: */ + /* An array of guessed file offsets. `offsets[N]' holds the file */ + /* offset of the possible start of the resource fork in file */ + /* `new_names[N]'. */ + /* */ + /* errors :: */ + /* An array of FreeType error codes. `errors[N]' is the error */ + /* code of Nth guessing rule function. If `errors[N]' is not */ + /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */ + /* */ + FT_BASE( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char** new_names, + FT_Long* offsets, + FT_Error* errors ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_HeaderInfo */ + /* */ + /* <Description> */ + /* Get the information from the header of resource fork. The */ + /* information includes the file offset where the resource map */ + /* starts, and the file offset where the resource data starts. */ + /* `FT_Raccess_Get_DataOffsets' requires these two data. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* rfork_offset :: */ + /* The file offset where the resource fork starts. */ + /* */ + /* <Output> */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_DataOffsets */ + /* */ + /* <Description> */ + /* Get the data offsets for a tag in a resource fork. Offsets are */ + /* stored in an array because, in some cases, resources in a resource */ + /* fork have the same tag. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* tag :: */ + /* The resource tag. */ + /* */ + /* <Output> */ + /* offsets :: */ + /* The stream offsets for the resource data specified by `tag'. */ + /* This array is allocated by the function, so you have to call */ + /* @ft_mem_free after use. */ + /* */ + /* count :: */ + /* The length of offsets array. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + /* <Note> */ + /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */ + /* value for `map_offset' and `rdata_pos'. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ); + + +FT_END_HEADER + +#endif /* __FTRFORK_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftserv.h b/src/3rdparty/freetype/include/freetype/internal/ftserv.h new file mode 100644 index 0000000000..2db3e8790d --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftserv.h @@ -0,0 +1,328 @@ +/***************************************************************************/ +/* */ +/* ftserv.h */ +/* */ +/* The FreeType services (specification only). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Each module can export one or more `services'. Each service is */ + /* identified by a constant string and modeled by a pointer; the latter */ + /* generally corresponds to a structure containing function pointers. */ + /* */ + /* Note that a service's data cannot be a mere function pointer because */ + /* in C it is possible that function pointers might be implemented */ + /* differently than data pointers (e.g. 48 bits instead of 32). */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSERV_H__ +#define __FTSERV_H__ + + +FT_BEGIN_HEADER + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* we disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + /* + * @macro: + * FT_FACE_FIND_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * @macro: + * FT_FACE_FIND_GLOBAL_SERVICE + * + * @description: + * This macro is used to look up a service from all modules. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E D E S C R I P T O R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The following structure is used to _describe_ a given service + * to the library. This is useful to build simple static service lists. + */ + typedef struct FT_ServiceDescRec_ + { + const char* serv_id; /* service name */ + const void* serv_data; /* service pointer/data */ + + } FT_ServiceDescRec; + + typedef const FT_ServiceDescRec* FT_ServiceDesc; + + + /* + * Parse a list of FT_ServiceDescRec descriptors and look for + * a specific service by ID. Note that the last element in the + * array must be { NULL, NULL }, and that the function should + * return NULL if the service isn't available. + * + * This function can be used by modules to implement their + * `get_service' method. + */ + FT_BASE( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E S C A C H E *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * This structure is used to store a cache for several frequently used + * services. It is the type of `face->internal->services'. You + * should only use FT_FACE_LOOKUP_SERVICE to access it. + * + * All fields should have the type FT_Pointer to relax compilation + * dependencies. We assume the developer isn't completely stupid. + * + * Each field must be named `service_XXXX' where `XXX' corresponds to + * the correct FT_SERVICE_ID_XXXX macro. See the definition of + * FT_FACE_LOOKUP_SERVICE below how this is implemented. + * + */ + typedef struct FT_ServiceCacheRec_ + { + FT_Pointer service_POSTSCRIPT_FONT_NAME; + FT_Pointer service_MULTI_MASTERS; + FT_Pointer service_GLYPH_DICT; + FT_Pointer service_PFR_METRICS; + FT_Pointer service_WINFNT; + + } FT_ServiceCacheRec, *FT_ServiceCache; + + + /* + * A magic number used within the services cache. + */ +#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */ + + + /* + * @macro: + * FT_FACE_LOOKUP_SERVICE + * + * @description: + * This macro is used to lookup a service from a face's driver module + * using its cache. + * + * @input: + * face:: + * The source face handle containing the cache. + * + * field :: + * The field name in the cache. + * + * id :: + * The service ID. + * + * @output: + * ptr :: + * A variable receiving the service data. NULL if not available. + */ +#ifdef __cplusplus + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + *Pptr = svc; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + ptr = svc; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * A macro used to define new service structure types. + */ + +#define FT_DEFINE_SERVICE( name ) \ + typedef struct FT_Service_ ## name ## Rec_ \ + FT_Service_ ## name ## Rec ; \ + typedef struct FT_Service_ ## name ## Rec_ \ + const * FT_Service_ ## name ; \ + struct FT_Service_ ## name ## Rec_ + + /* */ + + /* + * The header files containing the services. + */ + +#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> +#define FT_SERVICE_CID_H <freetype/internal/services/svcid.h> +#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> +#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h> +#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h> +#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> +#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h> +#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> +#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> +#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> +#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> +#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> +#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h> +#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> +#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> +#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h> +#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h> + + /* */ + +FT_END_HEADER + +#endif /* __FTSERV_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftstream.h b/src/3rdparty/freetype/include/freetype/internal/ftstream.h new file mode 100644 index 0000000000..a91eb72d96 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftstream.h @@ -0,0 +1,539 @@ +/***************************************************************************/ +/* */ +/* ftstream.h */ +/* */ +/* Stream handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSTREAM_H__ +#define __FTSTREAM_H__ + + +#include <ft2build.h> +#include FT_SYSTEM_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* format of an 8-bit frame_op value: */ + /* */ + /* bit 76543210 */ + /* xxxxxxes */ + /* */ + /* s is set to 1 if the value is signed. */ + /* e is set to 1 if the value is little-endian. */ + /* xxx is a command. */ + +#define FT_FRAME_OP_SHIFT 2 +#define FT_FRAME_OP_SIGNED 1 +#define FT_FRAME_OP_LITTLE 2 +#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) + +#define FT_MAKE_FRAME_OP( command, little, sign ) \ + ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) + +#define FT_FRAME_OP_END 0 +#define FT_FRAME_OP_START 1 /* start a new frame */ +#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ +#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ +#define FT_FRAME_OP_LONG 4 /* read 4-byte value */ +#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ +#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ + + + typedef enum FT_Frame_Op_ + { + ft_frame_end = 0, + ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), + + ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), + ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), + + ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), + ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), + ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), + ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), + + ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), + ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), + ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), + ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), + + ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), + ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), + ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), + ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), + + ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), + ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) + + } FT_Frame_Op; + + + typedef struct FT_Frame_Field_ + { + FT_Byte value; + FT_Byte size; + FT_UShort offset; + + } FT_Frame_Field; + + + /* Construct an FT_Frame_Field out of a structure type and a field name. */ + /* The structure type must be set in the FT_STRUCTURE macro before */ + /* calling the FT_FRAME_START() macro. */ + /* */ +#define FT_FIELD_SIZE( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) + +#define FT_FIELD_SIZE_DELTA( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) + +#define FT_FIELD_OFFSET( f ) \ + (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) + +#define FT_FRAME_FIELD( frame_op, field ) \ + { \ + frame_op, \ + FT_FIELD_SIZE( field ), \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } + +#define FT_FRAME_START( size ) { ft_frame_start, 0, size } +#define FT_FRAME_END { ft_frame_end, 0, 0 } + +#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) +#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) +#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) +#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) +#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) +#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) +#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) +#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) + +#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) +#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) +#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) +#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) +#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) +#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) + +#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } +#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } +#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } + +#define FT_FRAME_BYTES( field, count ) \ + { \ + ft_frame_bytes, \ + count, \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } + + + /*************************************************************************/ + /* */ + /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */ + /* type `char*' or equivalent (1-byte elements). */ + /* */ + +#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) +#define FT_INT8_( p, i ) ( ((const FT_Char*)(p))[(i)] ) + +#define FT_INT16( x ) ( (FT_Int16)(x) ) +#define FT_UINT16( x ) ( (FT_UInt16)(x) ) +#define FT_INT32( x ) ( (FT_Int32)(x) ) +#define FT_UINT32( x ) ( (FT_UInt32)(x) ) + +#define FT_BYTE_I16( p, i, s ) ( FT_INT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_I32( p, i, s ) ( FT_INT32( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) + +#define FT_INT8_I16( p, i, s ) ( FT_INT16( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_U16( p, i, s ) ( FT_UINT16( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_I32( p, i, s ) ( FT_INT32( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_U32( p, i, s ) ( FT_UINT32( FT_INT8_( p, i ) ) << (s) ) + + +#define FT_PEEK_SHORT( p ) FT_INT16( FT_INT8_I16( p, 0, 8) | \ + FT_BYTE_I16( p, 1, 0) ) + +#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ + FT_BYTE_U16( p, 1, 0 ) ) + +#define FT_PEEK_LONG( p ) FT_INT32( FT_INT8_I32( p, 0, 24 ) | \ + FT_BYTE_I32( p, 1, 16 ) | \ + FT_BYTE_I32( p, 2, 8 ) | \ + FT_BYTE_I32( p, 3, 0 ) ) + +#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) | \ + FT_BYTE_U32( p, 3, 0 ) ) + +#define FT_PEEK_OFF3( p ) FT_INT32( FT_INT8_I32( p, 0, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 2, 0 ) ) + +#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 2, 0 ) ) + +#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_INT8_I16( p, 1, 8 ) | \ + FT_BYTE_I16( p, 0, 0 ) ) + +#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ + FT_BYTE_U16( p, 0, 0 ) ) + +#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_INT8_I32( p, 3, 24 ) | \ + FT_BYTE_I32( p, 2, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 0, 0 ) ) + +#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ + FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_INT8_I32( p, 2, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 0, 0 ) ) + +#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + + +#define FT_NEXT_CHAR( buffer ) \ + ( (signed char)*buffer++ ) + +#define FT_NEXT_BYTE( buffer ) \ + ( (unsigned char)*buffer++ ) + +#define FT_NEXT_SHORT( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) ) + +#define FT_NEXT_LONG( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) ) + + +#define FT_NEXT_SHORT_LE( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT_LE( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3_LE( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3_LE( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_LONG_LE( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG_LE( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) ) + + + /*************************************************************************/ + /* */ + /* Each GET_xxxx() macro uses an implicit `stream' variable. */ + /* */ +#if 0 +#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor ) + +#define FT_GET_CHAR() FT_GET_MACRO( CHAR ) +#define FT_GET_BYTE() FT_GET_MACRO( BYTE ) +#define FT_GET_SHORT() FT_GET_MACRO( SHORT ) +#define FT_GET_USHORT() FT_GET_MACRO( USHORT ) +#define FT_GET_OFF3() FT_GET_MACRO( OFF3 ) +#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 ) +#define FT_GET_LONG() FT_GET_MACRO( LONG ) +#define FT_GET_ULONG() FT_GET_MACRO( ULONG ) +#define FT_GET_TAG4() FT_GET_MACRO( ULONG ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE ) +#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE ) + +#else +#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) + +#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char ) +#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte ) +#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_Short ) +#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_UShort ) +#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_Long ) +#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_ULong ) +#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetLong, FT_Long ) +#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) +#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_Short ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_UShort ) +#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_Long ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_ULong ) +#endif + +#define FT_READ_MACRO( func, type, var ) \ + ( var = (type)func( stream, &error ), \ + error != FT_Err_Ok ) + +#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var ) +#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var ) +#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_Short, var ) +#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_UShort, var ) +#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_Long, var ) +#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_ULong, var ) +#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_Long, var ) +#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_ULong, var ) + +#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_Short, var ) +#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_UShort, var ) +#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_Long, var ) +#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_ULong, var ) + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /* initialize a stream for reading a regular system stream */ + FT_BASE( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ); + +#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* create a new (input) stream from an FT_Open_Args structure */ + FT_BASE( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ); + + /* free a stream */ + FT_BASE( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ); + + /* initialize a stream for reading in-memory data */ + FT_BASE( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ); + + /* close a stream (does not destroy the stream structure) */ + FT_BASE( void ) + FT_Stream_Close( FT_Stream stream ); + + + /* seek within a stream. position is relative to start of stream */ + FT_BASE( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ); + + /* skip bytes in a stream */ + FT_BASE( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ); + + /* return current stream position */ + FT_BASE( FT_Long ) + FT_Stream_Pos( FT_Stream stream ); + + /* read bytes from a stream into a user-allocated buffer, returns an */ + /* error if not all bytes could be read. */ + FT_BASE( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* read bytes from a stream at a given position */ + FT_BASE( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ); + + /* try to read bytes at the end of a stream; return number of bytes */ + /* really available */ + FT_BASE( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ + /* error if the frame could not be read/accessed. The caller can use */ + /* the FT_Stream_Get_XXX functions to retrieve frame data without */ + /* error checks. */ + /* */ + /* You must _always_ call FT_Stream_ExitFrame() once you have entered */ + /* a stream frame! */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ); + + /* exit a stream frame */ + FT_BASE( void ) + FT_Stream_ExitFrame( FT_Stream stream ); + + /* Extract a stream frame. If the stream is disk-based, a heap block */ + /* is allocated and the frame bytes are read into it. If the stream */ + /* is memory-based, this function simply set a pointer to the data. */ + /* */ + /* Useful to optimize access to memory-based streams transparently. */ + /* */ + /* All extracted frames must be `freed' with a call to the function */ + /* FT_Stream_ReleaseFrame(). */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ); + + /* release an extract frame (see FT_Stream_ExtractFrame) */ + FT_BASE( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ); + + /* read a byte from an entered frame */ + FT_BASE( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ); + + /* read a 16-bit big-endian integer from an entered frame */ + FT_BASE( FT_Short ) + FT_Stream_GetShort( FT_Stream stream ); + + /* read a 24-bit big-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetOffset( FT_Stream stream ); + + /* read a 32-bit big-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetLong( FT_Stream stream ); + + /* read a 16-bit little-endian integer from an entered frame */ + FT_BASE( FT_Short ) + FT_Stream_GetShortLE( FT_Stream stream ); + + /* read a 32-bit little-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetLongLE( FT_Stream stream ); + + + /* read a byte from a stream */ + FT_BASE( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit big-endian integer from a stream */ + FT_BASE( FT_Short ) + FT_Stream_ReadShort( FT_Stream stream, + FT_Error* error ); + + /* read a 24-bit big-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadOffset( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit big-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadLong( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit little-endian integer from a stream */ + FT_BASE( FT_Short ) + FT_Stream_ReadShortLE( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit little-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadLongLE( FT_Stream stream, + FT_Error* error ); + + /* Read a structure from a stream. The structure must be described */ + /* by an array of FT_Frame_Field records. */ + FT_BASE( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ); + + +#define FT_STREAM_POS() \ + FT_Stream_Pos( stream ) + +#define FT_STREAM_SEEK( position ) \ + FT_SET_ERROR( FT_Stream_Seek( stream, position ) ) + +#define FT_STREAM_SKIP( distance ) \ + FT_SET_ERROR( FT_Stream_Skip( stream, distance ) ) + +#define FT_STREAM_READ( buffer, count ) \ + FT_SET_ERROR( FT_Stream_Read( stream, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FT_STREAM_READ_AT( position, buffer, count ) \ + FT_SET_ERROR( FT_Stream_ReadAt( stream, \ + position, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FT_STREAM_READ_FIELDS( fields, object ) \ + FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) + + +#define FT_FRAME_ENTER( size ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, size ) ) ) + +#define FT_FRAME_EXIT() \ + FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) ) + +#define FT_FRAME_EXTRACT( size, bytes ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, size, \ + (FT_Byte**)&(bytes) ) ) ) + +#define FT_FRAME_RELEASE( bytes ) \ + FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \ + (FT_Byte**)&(bytes) ) ) + + +FT_END_HEADER + +#endif /* __FTSTREAM_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/fttrace.h b/src/3rdparty/freetype/include/freetype/internal/fttrace.h new file mode 100644 index 0000000000..4d38a4628a --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/fttrace.h @@ -0,0 +1,134 @@ +/***************************************************************************/ +/* */ +/* fttrace.h */ +/* */ +/* Tracing handling (specification only). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* definitions of trace levels for FreeType 2 */ + + /* the first level must always be `trace_any' */ +FT_TRACE_DEF( any ) + + /* base components */ +FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ +FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ +FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ +FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ +FT_TRACE_DEF( list ) /* list management (ftlist.c) */ +FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ +FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ +FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ +FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ + +FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ +FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ +FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ +FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ + + /* Cache sub-system */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ + + /* SFNT driver components */ +FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ +FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ +FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ +FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */ +FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ +FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ + + /* TrueType driver components */ +FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ +FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ +FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ +FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ +FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ +FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */ + + /* Type 1 driver components */ +FT_TRACE_DEF( t1driver ) +FT_TRACE_DEF( t1gload ) +FT_TRACE_DEF( t1hint ) +FT_TRACE_DEF( t1load ) +FT_TRACE_DEF( t1objs ) +FT_TRACE_DEF( t1parse ) + + /* PostScript helper module `psaux' */ +FT_TRACE_DEF( t1decode ) +FT_TRACE_DEF( psobjs ) + + /* PostScript hinting module `pshinter' */ +FT_TRACE_DEF( pshrec ) +FT_TRACE_DEF( pshalgo1 ) +FT_TRACE_DEF( pshalgo2 ) + + /* Type 2 driver components */ +FT_TRACE_DEF( cffdriver ) +FT_TRACE_DEF( cffgload ) +FT_TRACE_DEF( cffload ) +FT_TRACE_DEF( cffobjs ) +FT_TRACE_DEF( cffparse ) + + /* Type 42 driver component */ +FT_TRACE_DEF( t42 ) + + /* CID driver components */ +FT_TRACE_DEF( cidafm ) +FT_TRACE_DEF( ciddriver ) +FT_TRACE_DEF( cidgload ) +FT_TRACE_DEF( cidload ) +FT_TRACE_DEF( cidobjs ) +FT_TRACE_DEF( cidparse ) + + /* Windows font component */ +FT_TRACE_DEF( winfnt ) + + /* PCF font components */ +FT_TRACE_DEF( pcfdriver ) +FT_TRACE_DEF( pcfread ) + + /* BDF font components */ +FT_TRACE_DEF( bdfdriver ) +FT_TRACE_DEF( bdflib ) + + /* PFR font component */ +FT_TRACE_DEF( pfr ) + + /* OpenType validation components */ +FT_TRACE_DEF( otvmodule ) +FT_TRACE_DEF( otvcommon ) +FT_TRACE_DEF( otvbase ) +FT_TRACE_DEF( otvgdef ) +FT_TRACE_DEF( otvgpos ) +FT_TRACE_DEF( otvgsub ) +FT_TRACE_DEF( otvjstf ) +FT_TRACE_DEF( otvmath ) + + /* TrueTypeGX/AAT validation components */ +FT_TRACE_DEF( gxvmodule ) +FT_TRACE_DEF( gxvcommon ) +FT_TRACE_DEF( gxvfeat ) +FT_TRACE_DEF( gxvmort ) +FT_TRACE_DEF( gxvmorx ) +FT_TRACE_DEF( gxvbsln ) +FT_TRACE_DEF( gxvjust ) +FT_TRACE_DEF( gxvkern ) +FT_TRACE_DEF( gxvopbd ) +FT_TRACE_DEF( gxvtrak ) +FT_TRACE_DEF( gxvprop ) +FT_TRACE_DEF( gxvlcar ) + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/ftvalid.h b/src/3rdparty/freetype/include/freetype/internal/ftvalid.h new file mode 100644 index 0000000000..00cd85e7bb --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/ftvalid.h @@ -0,0 +1,150 @@ +/***************************************************************************/ +/* */ +/* ftvalid.h */ +/* */ +/* FreeType validation support (specification). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTVALID_H__ +#define __FTVALID_H__ + +#include <ft2build.h> +#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** V A L I D A T I O N ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to a validation object */ + typedef struct FT_ValidatorRec_ volatile* FT_Validator; + + + /*************************************************************************/ + /* */ + /* There are three distinct validation levels defined here: */ + /* */ + /* FT_VALIDATE_DEFAULT :: */ + /* A table that passes this validation level can be used reliably by */ + /* FreeType. It generally means that all offsets have been checked to */ + /* prevent out-of-bound reads, that array counts are correct, etc. */ + /* */ + /* FT_VALIDATE_TIGHT :: */ + /* A table that passes this validation level can be used reliably and */ + /* doesn't contain invalid data. For example, a charmap table that */ + /* returns invalid glyph indices will not pass, even though it can */ + /* be used with FreeType in default mode (the library will simply */ + /* return an error later when trying to load the glyph). */ + /* */ + /* It also checks that fields which must be a multiple of 2, 4, or 8, */ + /* don't have incorrect values, etc. */ + /* */ + /* FT_VALIDATE_PARANOID :: */ + /* Only for font debugging. Checks that a table follows the */ + /* specification by 100%. Very few fonts will be able to pass this */ + /* level anyway but it can be useful for certain tools like font */ + /* editors/converters. */ + /* */ + typedef enum FT_ValidationLevel_ + { + FT_VALIDATE_DEFAULT = 0, + FT_VALIDATE_TIGHT, + FT_VALIDATE_PARANOID + + } FT_ValidationLevel; + + + /* validator structure */ + typedef struct FT_ValidatorRec_ + { + const FT_Byte* base; /* address of table in memory */ + const FT_Byte* limit; /* `base' + sizeof(table) in memory */ + FT_ValidationLevel level; /* validation level */ + FT_Error error; /* error returned. 0 means success */ + + ft_jmp_buf jump_buffer; /* used for exception handling */ + + } FT_ValidatorRec; + + +#define FT_VALIDATOR( x ) ((FT_Validator)( x )) + + + FT_BASE( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ); + + /* Do not use this. It's broken and will cause your validator to crash */ + /* if you run it on an invalid font. */ + FT_BASE( FT_Int ) + ft_validator_run( FT_Validator valid ); + + /* Sets the error field in a validator, then calls `longjmp' to return */ + /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ + /* error checks within the validation routines. */ + /* */ + FT_BASE( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ); + + + /* Calls ft_validate_error. Assumes that the `valid' local variable */ + /* holds a pointer to the current validator object. */ + /* */ + /* Use preprocessor prescan to pass FT_ERR_PREFIX. */ + /* */ +#define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error ) +#define FT_INVALID_( _prefix, _error ) \ + ft_validator_error( valid, _prefix ## _error ) + + /* called when a broken table is detected */ +#define FT_INVALID_TOO_SHORT \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + /* called when an invalid offset is detected */ +#define FT_INVALID_OFFSET \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Offset ) + + /* called when an invalid format/value is detected */ +#define FT_INVALID_FORMAT \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + /* called when an invalid glyph index is detected */ +#define FT_INVALID_GLYPH_ID \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index ) + + /* called when an invalid field value is detected */ +#define FT_INVALID_DATA \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + +FT_END_HEADER + +#endif /* __FTVALID_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/internal.h b/src/3rdparty/freetype/include/freetype/internal/internal.h new file mode 100644 index 0000000000..27d5dc585d --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/internal.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* internal.h */ +/* */ +/* Internal header files (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is automatically included by `ft2build.h'. */ + /* Do not include it manually! */ + /* */ + /*************************************************************************/ + + +#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> +#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> +#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> +#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> +#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> +#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> +#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> +#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> +#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> +#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h> +#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h> +#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h> + +#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> +#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> + +#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> +#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> +#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> + +#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h> + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/pcftypes.h b/src/3rdparty/freetype/include/freetype/internal/pcftypes.h new file mode 100644 index 0000000000..382796ffb4 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/pcftypes.h @@ -0,0 +1,56 @@ +/* pcftypes.h + + FreeType font driver for pcf fonts + + Copyright (C) 2000, 2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFTYPES_H__ +#define __PCFTYPES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct PCF_Public_FaceRec_ + { + FT_FaceRec root; + FT_StreamRec gzip_stream; + FT_Stream gzip_source; + + char* charset_encoding; + char* charset_registry; + + } PCF_Public_FaceRec, *PCF_Public_Face; + + +FT_END_HEADER + +#endif /* __PCFTYPES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/psaux.h b/src/3rdparty/freetype/include/freetype/internal/psaux.h new file mode 100644 index 0000000000..7fb4c9916d --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/psaux.h @@ -0,0 +1,876 @@ +/***************************************************************************/ +/* */ +/* psaux.h */ +/* */ +/* Auxiliary functions and data structures related to PostScript fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSAUX_H__ +#define __PSAUX_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_TableRec_* PS_Table; + typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_Table_FuncsRec */ + /* */ + /* <Description> */ + /* A set of function pointers to manage PS_Table objects. */ + /* */ + /* <Fields> */ + /* table_init :: Used to initialize a table. */ + /* */ + /* table_done :: Finalizes resp. destroy a given table. */ + /* */ + /* table_add :: Adds a new object to a table. */ + /* */ + /* table_release :: Releases table data, then finalizes it. */ + /* */ + typedef struct PS_Table_FuncsRec_ + { + FT_Error + (*init)( PS_Table table, + FT_Int count, + FT_Memory memory ); + + void + (*done)( PS_Table table ); + + FT_Error + (*add)( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ); + + void + (*release)( PS_Table table ); + + } PS_Table_FuncsRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_TableRec */ + /* */ + /* <Description> */ + /* A PS_Table is a simple object used to store an array of objects in */ + /* a single memory block. */ + /* */ + /* <Fields> */ + /* block :: The address in memory of the growheap's block. This */ + /* can change between two object adds, due to */ + /* reallocation. */ + /* */ + /* cursor :: The current top of the grow heap within its block. */ + /* */ + /* capacity :: The current size of the heap block. Increments by */ + /* 1kByte chunks. */ + /* */ + /* max_elems :: The maximum number of elements in table. */ + /* */ + /* num_elems :: The current number of elements in table. */ + /* */ + /* elements :: A table of element addresses within the block. */ + /* */ + /* lengths :: A table of element sizes within the block. */ + /* */ + /* memory :: The object used for memory operations */ + /* (alloc/realloc). */ + /* */ + /* funcs :: A table of method pointers for this object. */ + /* */ + typedef struct PS_TableRec_ + { + FT_Byte* block; /* current memory block */ + FT_Offset cursor; /* current cursor in memory block */ + FT_Offset capacity; /* current size of memory block */ + FT_Long init; + + FT_Int max_elems; + FT_Int num_elems; + FT_Byte** elements; /* addresses of table elements */ + FT_PtrDist* lengths; /* lengths of table elements */ + + FT_Memory memory; + PS_Table_FuncsRec funcs; + + } PS_TableRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 FIELDS & TOKENS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PS_ParserRec_* PS_Parser; + + typedef struct T1_TokenRec_* T1_Token; + + typedef struct T1_FieldRec_* T1_Field; + + + /* simple enumeration type used to identify token types */ + typedef enum T1_TokenType_ + { + T1_TOKEN_TYPE_NONE = 0, + T1_TOKEN_TYPE_ANY, + T1_TOKEN_TYPE_STRING, + T1_TOKEN_TYPE_ARRAY, + T1_TOKEN_TYPE_KEY, /* aka `name' */ + + /* do not remove */ + T1_TOKEN_TYPE_MAX + + } T1_TokenType; + + + /* a simple structure used to identify tokens */ + typedef struct T1_TokenRec_ + { + FT_Byte* start; /* first character of token in input stream */ + FT_Byte* limit; /* first character after the token */ + T1_TokenType type; /* type of token */ + + } T1_TokenRec; + + + /* enumeration type used to identify object fields */ + typedef enum T1_FieldType_ + { + T1_FIELD_TYPE_NONE = 0, + T1_FIELD_TYPE_BOOL, + T1_FIELD_TYPE_INTEGER, + T1_FIELD_TYPE_FIXED, + T1_FIELD_TYPE_FIXED_1000, + T1_FIELD_TYPE_STRING, + T1_FIELD_TYPE_KEY, + T1_FIELD_TYPE_BBOX, + T1_FIELD_TYPE_INTEGER_ARRAY, + T1_FIELD_TYPE_FIXED_ARRAY, + T1_FIELD_TYPE_CALLBACK, + + /* do not remove */ + T1_FIELD_TYPE_MAX + + } T1_FieldType; + + + typedef enum T1_FieldLocation_ + { + T1_FIELD_LOCATION_CID_INFO, + T1_FIELD_LOCATION_FONT_DICT, + T1_FIELD_LOCATION_FONT_EXTRA, + T1_FIELD_LOCATION_FONT_INFO, + T1_FIELD_LOCATION_PRIVATE, + T1_FIELD_LOCATION_BBOX, + T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, + T1_FIELD_LOCATION_BLEND, + + /* do not remove */ + T1_FIELD_LOCATION_MAX + + } T1_FieldLocation; + + + typedef void + (*T1_Field_ParseFunc)( FT_Face face, + FT_Pointer parser ); + + + /* structure type used to model object fields */ + typedef struct T1_FieldRec_ + { + const char* ident; /* field identifier */ + T1_FieldLocation location; + T1_FieldType type; /* type of field */ + T1_Field_ParseFunc reader; + FT_UInt offset; /* offset of field in object */ + FT_Byte size; /* size of field in bytes */ + FT_UInt array_max; /* maximal number of elements for */ + /* array */ + FT_UInt count_offset; /* offset of element count for */ + /* arrays; must not be zero if in */ + /* use -- in other words, a */ + /* `num_FOO' element must not */ + /* start the used structure if we */ + /* parse a `FOO' array */ + FT_UInt dict; /* where we expect it */ + } T1_FieldRec; + +#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ +#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) + + + +#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE( _fname ), \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ + { \ + _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ + (T1_Field_ParseFunc)_reader, \ + 0, 0, \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, \ + FT_FIELD_OFFSET( num_ ## _fname ), \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, 0, \ + _dict \ + }, + + +#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) + +#define T1_FIELD_NUM( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) + +#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) + +#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ + _dict ) + +#define T1_FIELD_STRING( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) + +#define T1_FIELD_KEY( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) + +#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) + + +#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ + T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; + + typedef struct PS_Parser_FuncsRec_ + { + void + (*init)( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + void + (*done)( PS_Parser parser ); + + void + (*skip_spaces)( PS_Parser parser ); + void + (*skip_PS_token)( PS_Parser parser ); + + FT_Long + (*to_int)( PS_Parser parser ); + FT_Fixed + (*to_fixed)( PS_Parser parser, + FT_Int power_ten ); + + FT_Error + (*to_bytes)( PS_Parser parser, + FT_Byte* bytes, + FT_Long max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + FT_Int + (*to_coord_array)( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + FT_Int + (*to_fixed_array)( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + void + (*to_token)( PS_Parser parser, + T1_Token token ); + void + (*to_token_array)( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_Error + (*load_field)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_Error + (*load_field_table)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + } PS_Parser_FuncsRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_ParserRec */ + /* */ + /* <Description> */ + /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ + /* */ + /* <Fields> */ + /* cursor :: The current position in the text. */ + /* */ + /* base :: Start of the processed text. */ + /* */ + /* limit :: End of the processed text. */ + /* */ + /* error :: The last error returned. */ + /* */ + /* memory :: The object used for memory operations (alloc/realloc). */ + /* */ + /* funcs :: A table of functions for the parser. */ + /* */ + typedef struct PS_ParserRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + FT_Error error; + FT_Memory memory; + + PS_Parser_FuncsRec funcs; + + } PS_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_BuilderRec_* T1_Builder; + + + typedef FT_Error + (*T1_Builder_Check_Points_Func)( T1_Builder builder, + FT_Int count ); + + typedef void + (*T1_Builder_Add_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + typedef FT_Error + (*T1_Builder_Add_Point1_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef FT_Error + (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); + + typedef FT_Error + (*T1_Builder_Start_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef void + (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); + + + typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; + + typedef struct T1_Builder_FuncsRec_ + { + void + (*init)( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Bool hinting ); + + void + (*done)( T1_Builder builder ); + + T1_Builder_Check_Points_Func check_points; + T1_Builder_Add_Point_Func add_point; + T1_Builder_Add_Point1_Func add_point1; + T1_Builder_Add_Contour_Func add_contour; + T1_Builder_Start_Point_Func start_point; + T1_Builder_Close_Contour_Func close_contour; + + } T1_Builder_FuncsRec; + + + /* an enumeration type to handle charstring parsing states */ + typedef enum T1_ParseState_ + { + T1_Parse_Start, + T1_Parse_Have_Width, + T1_Parse_Have_Moveto, + T1_Parse_Have_Path + + } T1_ParseState; + + + /*************************************************************************/ + /* */ + /* <Structure> */ + /* T1_BuilderRec */ + /* */ + /* <Description> */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* <Fields> */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* loader :: XXX */ + /* */ + /* base :: The base glyph outline. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* max_points :: maximum points in builder outline */ + /* */ + /* max_contours :: Maximal number of contours in builder outline. */ + /* */ + /* last :: The last point position. */ + /* */ + /* pos_x :: The horizontal translation (if composite glyph). */ + /* */ + /* pos_y :: The vertical translation (if composite glyph). */ + /* */ + /* left_bearing :: The left side bearing point. */ + /* */ + /* advance :: The horizontal advance vector. */ + /* */ + /* bbox :: Unused. */ + /* */ + /* parse_state :: An enumeration which controls the charstring */ + /* parsing state. */ + /* */ + /* load_points :: If this flag is not set, no points are loaded. */ + /* */ + /* no_recurse :: Set but not used. */ + /* */ + /* metrics_only :: A boolean indicating that we only want to compute */ + /* the metrics of a given glyph, not load all of its */ + /* points. */ + /* */ + /* funcs :: An array of function pointers for the builder. */ + /* */ + typedef struct T1_BuilderRec_ + { + FT_Memory memory; + FT_Face face; + FT_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Vector last; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + T1_ParseState parse_state; + FT_Bool load_points; + FT_Bool no_recurse; + FT_Bool shift; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + T1_Builder_FuncsRec funcs; + + } T1_BuilderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 0 + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 8 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 32 + +#endif /* 0 */ + + + typedef struct T1_Decoder_ZoneRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + } T1_Decoder_ZoneRec, *T1_Decoder_Zone; + + + typedef struct T1_DecoderRec_* T1_Decoder; + typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; + + + typedef FT_Error + (*T1_Decoder_Callback)( T1_Decoder decoder, + FT_UInt glyph_index ); + + + typedef struct T1_Decoder_FuncsRec_ + { + FT_Error + (*init)( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback callback ); + + void + (*done)( T1_Decoder decoder ); + + FT_Error + (*parse_charstrings)( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); + + } T1_Decoder_FuncsRec; + + + typedef struct T1_DecoderRec_ + { + T1_BuilderRec builder; + + FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; + FT_Long* top; + + T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; + T1_Decoder_Zone zone; + + FT_Service_PsCMaps psnames; /* for seac */ + FT_UInt num_glyphs; + FT_Byte** glyph_names; + + FT_Int lenIV; /* internal for sub routine calls */ + FT_UInt num_subrs; + FT_Byte** subrs; + FT_PtrDist* subrs_len; /* array of subrs length (optional) */ + + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + PS_Blend blend; /* for multiple master support */ + + FT_Render_Mode hint_mode; + + T1_Decoder_Callback parse_callback; + T1_Decoder_FuncsRec funcs; + + FT_Int* buildchar; + FT_UInt len_buildchar; + + } T1_DecoderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** AFM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_ParserRec_* AFM_Parser; + + typedef struct AFM_Parser_FuncsRec_ + { + FT_Error + (*init)( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + void + (*done)( AFM_Parser parser ); + + FT_Error + (*parse)( AFM_Parser parser ); + + } AFM_Parser_FuncsRec; + + + typedef struct AFM_StreamRec_* AFM_Stream; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* AFM_ParserRec */ + /* */ + /* <Description> */ + /* An AFM_Parser is a parser for the AFM files. */ + /* */ + /* <Fields> */ + /* memory :: The object used for memory operations (alloc and */ + /* realloc). */ + /* */ + /* stream :: This is an opaque object. */ + /* */ + /* FontInfo :: The result will be stored here. */ + /* */ + /* get_index :: A user provided function to get a glyph index by its */ + /* name. */ + /* */ + typedef struct AFM_ParserRec_ + { + FT_Memory memory; + AFM_Stream stream; + + AFM_FontInfo FontInfo; + + FT_Int + (*get_index)( const char* name, + FT_UInt len, + void* user_data ); + + void* user_data; + + } AFM_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CHARMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; + + typedef struct T1_CMap_ClassesRec_ + { + FT_CMap_Class standard; + FT_CMap_Class expert; + FT_CMap_Class custom; + FT_CMap_Class unicode; + + } T1_CMap_ClassesRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PSAux Module Interface *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSAux_ServiceRec_ + { + /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ + const PS_Table_FuncsRec* ps_table_funcs; + const PS_Parser_FuncsRec* ps_parser_funcs; + const T1_Builder_FuncsRec* t1_builder_funcs; + const T1_Decoder_FuncsRec* t1_decoder_funcs; + + void + (*t1_decrypt)( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + T1_CMap_Classes t1_cmap_classes; + + /* fields after this comment line were added after version 2.1.10 */ + const AFM_Parser_FuncsRec* afm_parser_funcs; + + } PSAux_ServiceRec, *PSAux_Service; + + /* backwards-compatible type definition */ + typedef PSAux_ServiceRec PSAux_Interface; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Some convenience functions *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define IS_PS_NEWLINE( ch ) \ + ( (ch) == '\r' || \ + (ch) == '\n' ) + +#define IS_PS_SPACE( ch ) \ + ( (ch) == ' ' || \ + IS_PS_NEWLINE( ch ) || \ + (ch) == '\t' || \ + (ch) == '\f' || \ + (ch) == '\0' ) + +#define IS_PS_SPECIAL( ch ) \ + ( (ch) == '/' || \ + (ch) == '(' || (ch) == ')' || \ + (ch) == '<' || (ch) == '>' || \ + (ch) == '[' || (ch) == ']' || \ + (ch) == '{' || (ch) == '}' || \ + (ch) == '%' ) + +#define IS_PS_DELIM( ch ) \ + ( IS_PS_SPACE( ch ) || \ + IS_PS_SPECIAL( ch ) ) + +#define IS_PS_DIGIT( ch ) \ + ( (ch) >= '0' && (ch) <= '9' ) + +#define IS_PS_XDIGIT( ch ) \ + ( IS_PS_DIGIT( ch ) || \ + ( (ch) >= 'A' && (ch) <= 'F' ) || \ + ( (ch) >= 'a' && (ch) <= 'f' ) ) + +#define IS_PS_BASE85( ch ) \ + ( (ch) >= '!' && (ch) <= 'u' ) + +#define IS_PS_TOKEN( cur, limit, token ) \ + ( (char)(cur)[0] == (token)[0] && \ + ( (cur) + sizeof ( (token) ) == (limit) || \ + ( (cur) + sizeof( (token) ) < (limit) && \ + IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ + ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) + + +FT_END_HEADER + +#endif /* __PSAUX_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/pshints.h b/src/3rdparty/freetype/include/freetype/internal/pshints.h new file mode 100644 index 0000000000..48452c0cf3 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/pshints.h @@ -0,0 +1,687 @@ +/***************************************************************************/ +/* */ +/* pshints.h */ +/* */ +/* Interface to Postscript-specific (Type 1 and Type 2) hints */ +/* recorders (specification only). These are used to support native */ +/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */ +/* */ +/* Copyright 2001, 2002, 2003, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHINTS_H__ +#define __PSHINTS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INTERNAL REPRESENTATION OF GLOBALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSH_GlobalsRec_* PSH_Globals; + + typedef FT_Error + (*PSH_Globals_NewFunc)( FT_Memory memory, + T1_Private* private_dict, + PSH_Globals* aglobals ); + + typedef FT_Error + (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + typedef void + (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); + + + typedef struct PSH_Globals_FuncsRec_ + { + PSH_Globals_NewFunc create; + PSH_Globals_SetScaleFunc set_scale; + PSH_Globals_DestroyFunc destroy; + + } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 1 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * T1_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 1 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T1_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the `open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method (`stem', `stem3', or `reset'). Note that these functions do + * not return an error code. + * + * - Close the recording session by calling the `close' method. It + * returns an error code if the hints were invalid or something + * strange happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * PostScript hinter. + * + */ + typedef struct T1_HintsRec_* T1_Hints; + + + /************************************************************************* + * + * @type: + * T1_Hints_Funcs + * + * @description: + * A pointer to the @T1_Hints_FuncsRec structure that defines the API of + * a given @T1_Hints object. + * + */ + typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; + + + /************************************************************************* + * + * @functype: + * T1_Hints_OpenFunc + * + * @description: + * A method of the @T1_Hints class used to prepare it for a new Type 1 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * @note: + * You should always call the @T1_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T1_Hints_OpenFunc)( T1_Hints hints ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_SetStemFunc + * + * @description: + * A method of the @T1_Hints class used to record a new horizontal or + * vertical stem. This corresponds to the Type 1 `hstem' and `vstem' + * operators. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * coords :: + * Array of 2 integers, used as (position,length) stem descriptor. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * `coords[0]' is the absolute stem position (lowest coordinate); + * `coords[1]' is the length. + * + * The length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a `ghost' stem, according to the Type 1 + * specification. + * + * If the length is -21 (corresponding to a bottom ghost stem), then + * the real stem position is `coords[0]+coords[1]'. + * + */ + typedef void + (*T1_Hints_SetStemFunc)( T1_Hints hints, + FT_UInt dimension, + FT_Long* coords ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_SetStem3Func + * + * @description: + * A method of the @T1_Hints class used to record three + * counter-controlled horizontal or vertical stems at once. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems, 1 for vertical ones. + * + * coords :: + * An array of 6 integers, holding 3 (position,length) pairs for the + * counter-controlled stems. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * The lengths cannot be negative (ghost stems are never + * counter-controlled). + * + */ + typedef void + (*T1_Hints_SetStem3Func)( T1_Hints hints, + FT_UInt dimension, + FT_Long* coords ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_ResetFunc + * + * @description: + * A method of the @T1_Hints class used to reset the stems hints in a + * recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph in which the + * previously defined hints apply. + * + */ + typedef void + (*T1_Hints_ResetFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_CloseFunc + * + * @description: + * A method of the @T1_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T1_Hints_CloseFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_ApplyFunc + * + * @description: + * A method of the @T1_Hints class used to apply hints to the + * corresponding glyph outline. Must be called once all hints have been + * recorded. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the `globals' object which + * must correspond to the same font as the glyph. + * + */ + typedef FT_Error + (*T1_Hints_ApplyFunc)( T1_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************* + * + * @struct: + * T1_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T1_Hints objects. + * + * @fields: + * hints :: + * A handle to the T1 Hints recorder. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stem :: + * The function to set a simple stem. + * + * stem3 :: + * The function to set counter-controlled stems. + * + * reset :: + * The function to reset stem hints. + * + * apply :: + * The function to apply the hints to the corresponding glyph outline. + * + */ + typedef struct T1_Hints_FuncsRec_ + { + T1_Hints hints; + T1_Hints_OpenFunc open; + T1_Hints_CloseFunc close; + T1_Hints_SetStemFunc stem; + T1_Hints_SetStem3Func stem3; + T1_Hints_ResetFunc reset; + T1_Hints_ApplyFunc apply; + + } T1_Hints_FuncsRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 2 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * T2_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 2 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T2_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the `open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method (`stems', `hintmask', `counters'). Note that these + * functions do not return an error code. + * + * - Close the recording session by calling the `close' method. It + * returns an error code if the hints were invalid or something + * strange happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * Postscript hinter. + * + */ + typedef struct T2_HintsRec_* T2_Hints; + + + /************************************************************************* + * + * @type: + * T2_Hints_Funcs + * + * @description: + * A pointer to the @T2_Hints_FuncsRec structure that defines the API of + * a given @T2_Hints object. + * + */ + typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; + + + /************************************************************************* + * + * @functype: + * T2_Hints_OpenFunc + * + * @description: + * A method of the @T2_Hints class used to prepare it for a new Type 2 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * @note: + * You should always call the @T2_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T2_Hints_OpenFunc)( T2_Hints hints ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_StemsFunc + * + * @description: + * A method of the @T2_Hints class used to set the table of stems in + * either the vertical or horizontal dimension. Equivalent to the + * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * count :: + * The number of stems. + * + * coords :: + * An array of `count' (position,length) pairs. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * There are `2*count' elements in the `coords' array. Each even + * element is an absolute position in font units, each odd element is a + * length in font units. + * + * A length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a `ghost' stem, according to the Type 1 + * specification. + * + */ + typedef void + (*T2_Hints_StemsFunc)( T2_Hints hints, + FT_UInt dimension, + FT_UInt count, + FT_Fixed* coordinates ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_MaskFunc + * + * @description: + * A method of the @T2_Hints class used to set a given hintmask (this + * corresponds to the `hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The glyph index of the last point to which the previously defined + * or activated hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point' should be 0. + * + * `bit_count' is the number of meaningful bits in the `bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The `bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_MaskFunc)( T2_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_CounterFunc + * + * @description: + * A method of the @T2_Hints class used to set a given counter mask + * (this corresponds to the `hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * A glyph index of the last point to which the previously defined or + * active hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point' should be 0. + * + * `bit_count' is the number of meaningful bits in the `bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The `bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_CounterFunc)( T2_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_CloseFunc + * + * @description: + * A method of the @T2_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T2_Hints_CloseFunc)( T2_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_ApplyFunc + * + * @description: + * A method of the @T2_Hints class used to apply hints to the + * corresponding glyph outline. Must be called after the `close' + * method. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the `globals' object which + * must correspond to the same font than the glyph. + * + */ + typedef FT_Error + (*T2_Hints_ApplyFunc)( T2_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************* + * + * @struct: + * T2_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T2_Hints objects. + * + * @fields: + * hints :: + * A handle to the T2 hints recorder object. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stems :: + * The function to set the dimension's stems table. + * + * hintmask :: + * The function to set hint masks. + * + * counter :: + * The function to set counter masks. + * + * apply :: + * The function to apply the hints on the corresponding glyph outline. + * + */ + typedef struct T2_Hints_FuncsRec_ + { + T2_Hints hints; + T2_Hints_OpenFunc open; + T2_Hints_CloseFunc close; + T2_Hints_StemsFunc stems; + T2_Hints_MaskFunc hintmask; + T2_Hints_CounterFunc counter; + T2_Hints_ApplyFunc apply; + + } T2_Hints_FuncsRec; + + + /* */ + + + typedef struct PSHinter_Interface_ + { + PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); + T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); + T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); + + } PSHinter_Interface; + + typedef PSHinter_Interface* PSHinter_Service; + + +FT_END_HEADER + +#endif /* __PSHINTS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svbdf.h b/src/3rdparty/freetype/include/freetype/internal/services/svbdf.h new file mode 100644 index 0000000000..0f7fc6115d --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svbdf.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* svbdf.h */ +/* */ +/* The FreeType BDF services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVBDF_H__ +#define __SVBDF_H__ + +#include FT_BDF_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_BDF "bdf" + + typedef FT_Error + (*FT_BDF_GetCharsetIdFunc)( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + typedef FT_Error + (*FT_BDF_GetPropertyFunc)( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + + FT_DEFINE_SERVICE( BDF ) + { + FT_BDF_GetCharsetIdFunc get_charset_id; + FT_BDF_GetPropertyFunc get_property; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVBDF_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svcid.h b/src/3rdparty/freetype/include/freetype/internal/services/svcid.h new file mode 100644 index 0000000000..2e391f2888 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svcid.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* svcid.h */ +/* */ +/* The FreeType CID font services (specification). */ +/* */ +/* Copyright 2007, 2009 by Derek Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVCID_H__ +#define __SVCID_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_CID "CID" + + typedef FT_Error + (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + typedef FT_Error + (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face, + FT_Bool *is_cid ); + typedef FT_Error + (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + FT_DEFINE_SERVICE( CID ) + { + FT_CID_GetRegistryOrderingSupplementFunc get_ros; + FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid; + FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVCID_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svgldict.h b/src/3rdparty/freetype/include/freetype/internal/services/svgldict.h new file mode 100644 index 0000000000..e5e56b253c --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svgldict.h @@ -0,0 +1,60 @@ +/***************************************************************************/ +/* */ +/* svgldict.h */ +/* */ +/* The FreeType glyph dictionary services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGLDICT_H__ +#define __SVGLDICT_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to retrieve glyph names, as well as to find the + * index of a given glyph name in a font. + * + */ + +#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" + + + typedef FT_Error + (*FT_GlyphDict_GetNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_GlyphDict_NameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + + FT_DEFINE_SERVICE( GlyphDict ) + { + FT_GlyphDict_GetNameFunc get_name; + FT_GlyphDict_NameIndexFunc name_index; /* optional */ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGLDICT_H__ */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svgxval.h b/src/3rdparty/freetype/include/freetype/internal/services/svgxval.h new file mode 100644 index 0000000000..2cdab50655 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svgxval.h @@ -0,0 +1,72 @@ +/***************************************************************************/ +/* */ +/* svgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005 by */ +/* Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGXVAL_H__ +#define __SVGXVAL_H__ + +#include FT_GX_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate" +#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate" + + typedef FT_Error + (*gxv_validate_func)( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + typedef FT_Error + (*ckern_validate_func)( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes *ckern_table ); + + + FT_DEFINE_SERVICE( GXvalidate ) + { + gxv_validate_func validate; + }; + + FT_DEFINE_SERVICE( CKERNvalidate ) + { + ckern_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGXVAL_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svkern.h b/src/3rdparty/freetype/include/freetype/internal/services/svkern.h new file mode 100644 index 0000000000..1488adf493 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svkern.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* svkern.h */ +/* */ +/* The FreeType Kerning service (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVKERN_H__ +#define __SVKERN_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + +#define FT_SERVICE_ID_KERNING "kerning" + + + typedef FT_Error + (*FT_Kerning_TrackGetFunc)( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + FT_DEFINE_SERVICE( Kerning ) + { + FT_Kerning_TrackGetFunc get_track; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVKERN_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svmm.h b/src/3rdparty/freetype/include/freetype/internal/services/svmm.h new file mode 100644 index 0000000000..8a99ec4b1a --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svmm.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* svmm.h */ +/* */ +/* The FreeType Multiple Masters and GX var services (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVMM_H__ +#define __SVMM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to manage multiple-masters data in a given face. + * + * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). + * + */ + +#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" + + + typedef FT_Error + (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error + (*FT_Get_MM_Var_Func)( FT_Face face, + FT_MM_Var* *master ); + + typedef FT_Error + (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Set_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + FT_DEFINE_SERVICE( MultiMasters ) + { + FT_Get_MM_Func get_mm; + FT_Set_MM_Design_Func set_mm_design; + FT_Set_MM_Blend_Func set_mm_blend; + FT_Get_MM_Var_Func get_mm_var; + FT_Set_Var_Design_Func set_var_design; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVMM_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svotval.h b/src/3rdparty/freetype/include/freetype/internal/services/svotval.h new file mode 100644 index 0000000000..970bbd5759 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svotval.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svotval.h */ +/* */ +/* The FreeType OpenType validation service (specification). */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVOTVAL_H__ +#define __SVOTVAL_H__ + +#include FT_OPENTYPE_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate" + + + typedef FT_Error + (*otv_validate_func)( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *base, + FT_Bytes *gdef, + FT_Bytes *gpos, + FT_Bytes *gsub, + FT_Bytes *jstf ); + + + FT_DEFINE_SERVICE( OTvalidate ) + { + otv_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVOTVAL_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpfr.h b/src/3rdparty/freetype/include/freetype/internal/services/svpfr.h new file mode 100644 index 0000000000..462786f9ce --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpfr.h @@ -0,0 +1,66 @@ +/***************************************************************************/ +/* */ +/* svpfr.h */ +/* */ +/* Internal PFR service functions (specification). */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPFR_H__ +#define __SVPFR_H__ + +#include FT_PFR_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" + + + typedef FT_Error + (*FT_PFR_GetMetricsFunc)( FT_Face face, + FT_UInt *aoutline, + FT_UInt *ametrics, + FT_Fixed *ax_scale, + FT_Fixed *ay_scale ); + + typedef FT_Error + (*FT_PFR_GetKerningFunc)( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + typedef FT_Error + (*FT_PFR_GetAdvanceFunc)( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + + FT_DEFINE_SERVICE( PfrMetrics ) + { + FT_PFR_GetMetricsFunc get_metrics; + FT_PFR_GetKerningFunc get_kerning; + FT_PFR_GetAdvanceFunc get_advance; + + }; + + /* */ + +FT_END_HEADER + +#endif /* __SVPFR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpostnm.h b/src/3rdparty/freetype/include/freetype/internal/services/svpostnm.h new file mode 100644 index 0000000000..282da68d13 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpostnm.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* svpostnm.h */ +/* */ +/* The FreeType PostScript name services (specification). */ +/* */ +/* Copyright 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPOSTNM_H__ +#define __SVPOSTNM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + /* + * A trivial service used to retrieve the PostScript name of a given + * font when available. The `get_name' field should never be NULL. + * + * The corresponding function can return NULL to indicate that the + * PostScript name is not available. + * + * The name is owned by the face and will be destroyed with it. + */ + +#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" + + + typedef const char* + (*FT_PsName_GetFunc)( FT_Face face ); + + + FT_DEFINE_SERVICE( PsFontName ) + { + FT_PsName_GetFunc get_ps_font_name; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPOSTNM_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h b/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h new file mode 100644 index 0000000000..c4e25ed635 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h @@ -0,0 +1,129 @@ +/***************************************************************************/ +/* */ +/* svpscmap.h */ +/* */ +/* The FreeType PostScript charmap service (specification). */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSCMAP_H__ +#define __SVPSCMAP_H__ + +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" + + + /* + * Adobe glyph name to unicode value. + */ + typedef FT_UInt32 + (*PS_Unicode_ValueFunc)( const char* glyph_name ); + + /* + * Macintosh name id to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Macintosh_NameFunc)( FT_UInt name_index ); + + /* + * Adobe standard string ID to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index ); + + + /* + * Simple unicode -> glyph index charmap built from font glyph names + * table. + */ + typedef struct PS_UniMap_ + { + FT_UInt32 unicode; /* bit 31 set: is glyph variant */ + FT_UInt glyph_index; + + } PS_UniMap; + + + typedef struct PS_UnicodesRec_* PS_Unicodes; + + typedef struct PS_UnicodesRec_ + { + FT_CMapRec cmap; + FT_UInt num_maps; + PS_UniMap* maps; + + } PS_UnicodesRec; + + + /* + * A function which returns a glyph name for a given index. Returns + * NULL if invalid index. + */ + typedef const char* + (*PS_GetGlyphNameFunc)( FT_Pointer data, + FT_UInt string_index ); + + /* + * A function used to release the glyph name returned by + * PS_GetGlyphNameFunc, when needed + */ + typedef void + (*PS_FreeGlyphNameFunc)( FT_Pointer data, + const char* name ); + + typedef FT_Error + (*PS_Unicodes_InitFunc)( FT_Memory memory, + PS_Unicodes unicodes, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ); + + typedef FT_UInt + (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, + FT_UInt32 unicode ); + + typedef FT_ULong + (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, + FT_UInt32 *unicode ); + + + FT_DEFINE_SERVICE( PsCMaps ) + { + PS_Unicode_ValueFunc unicode_value; + + PS_Unicodes_InitFunc unicodes_init; + PS_Unicodes_CharIndexFunc unicodes_char_index; + PS_Unicodes_CharNextFunc unicodes_char_next; + + PS_Macintosh_NameFunc macintosh_name; + PS_Adobe_Std_StringsFunc adobe_std_strings; + const unsigned short* adobe_std_encoding; + const unsigned short* adobe_expert_encoding; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSCMAP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h b/src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h new file mode 100644 index 0000000000..124c6f9f9f --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpsinfo.h @@ -0,0 +1,65 @@ +/***************************************************************************/ +/* */ +/* svpsinfo.h */ +/* */ +/* The FreeType PostScript info service (specification). */ +/* */ +/* Copyright 2003, 2004, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSINFO_H__ +#define __SVPSINFO_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" + + + typedef FT_Error + (*PS_GetFontInfoFunc)( FT_Face face, + PS_FontInfoRec* afont_info ); + + typedef FT_Error + (*PS_GetFontExtraFunc)( FT_Face face, + PS_FontExtraRec* afont_extra ); + + typedef FT_Int + (*PS_HasGlyphNamesFunc)( FT_Face face ); + + typedef FT_Error + (*PS_GetFontPrivateFunc)( FT_Face face, + PS_PrivateRec* afont_private ); + + + FT_DEFINE_SERVICE( PsInfo ) + { + PS_GetFontInfoFunc ps_get_font_info; + PS_GetFontExtraFunc ps_get_font_extra; + PS_HasGlyphNamesFunc ps_has_glyph_names; + PS_GetFontPrivateFunc ps_get_font_private; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSINFO_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svsfnt.h b/src/3rdparty/freetype/include/freetype/internal/services/svsfnt.h new file mode 100644 index 0000000000..b4a85d97ec --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svsfnt.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* svsfnt.h */ +/* */ +/* The FreeType SFNT table loading service (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVSFNT_H__ +#define __SVSFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" + + + /* + * Used to implement FT_Load_Sfnt_Table(). + */ + typedef FT_Error + (*FT_SFNT_TableLoadFunc)( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + /* + * Used to implement FT_Get_Sfnt_Table(). + */ + typedef void* + (*FT_SFNT_TableGetFunc)( FT_Face face, + FT_Sfnt_Tag tag ); + + + /* + * Used to implement FT_Sfnt_Table_Info(). + */ + typedef FT_Error + (*FT_SFNT_TableInfoFunc)( FT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *length ); + + + FT_DEFINE_SERVICE( SFNT_Table ) + { + FT_SFNT_TableLoadFunc load_table; + FT_SFNT_TableGetFunc get_table; + FT_SFNT_TableInfoFunc table_info; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVSFNT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h b/src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h new file mode 100644 index 0000000000..553ecb074e --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svttcmap.h @@ -0,0 +1,85 @@ +/***************************************************************************/ +/* */ +/* svsttcmap.h */ +/* */ +/* The FreeType TrueType/sfnt cmap extra information service. */ +/* */ +/* Copyright 2003 by */ +/* Masatake YAMATO, Redhat K.K. */ +/* */ +/* Copyright 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/* Development of this service is support of + Information-technology Promotion Agency, Japan. */ + +#ifndef __SVTTCMAP_H__ +#define __SVTTCMAP_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_CMapInfo */ + /* */ + /* <Description> */ + /* A structure used to store TrueType/sfnt specific cmap information */ + /* which is not covered by the generic @FT_CharMap structure. This */ + /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */ + /* */ + /* <Fields> */ + /* language :: */ + /* The language ID used in Mac fonts. Definitions of values are in */ + /* freetype/ttnameid.h. */ + /* */ + /* format :: */ + /* The cmap format. OpenType 1.5 defines the formats 0 (byte */ + /* encoding table), 2~(high-byte mapping through table), 4~(segment */ + /* mapping to delta values), 6~(trimmed table mapping), 8~(mixed */ + /* 16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented */ + /* coverage), and 14 (Unicode Variation Sequences). */ + /* */ + typedef struct TT_CMapInfo_ + { + FT_ULong language; + FT_Long format; + + } TT_CMapInfo; + + + typedef FT_Error + (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + + FT_DEFINE_SERVICE( TTCMaps ) + { + TT_CMap_Info_GetFunc get_cmap_info; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTCMAP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svtteng.h b/src/3rdparty/freetype/include/freetype/internal/services/svtteng.h new file mode 100644 index 0000000000..58e02a6f9d --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svtteng.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* svtteng.h */ +/* */ +/* The FreeType TrueType engine query service (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVTTENG_H__ +#define __SVTTENG_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine" + + /* + * Used to implement FT_Get_TrueType_Engine_Type + */ + + FT_DEFINE_SERVICE( TrueTypeEngine ) + { + FT_TrueTypeEngineType engine_type; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVTTENG_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svttglyf.h b/src/3rdparty/freetype/include/freetype/internal/services/svttglyf.h new file mode 100644 index 0000000000..e57d484b7e --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svttglyf.h @@ -0,0 +1,48 @@ +/***************************************************************************/ +/* */ +/* svttglyf.h */ +/* */ +/* The FreeType TrueType glyph service. */ +/* */ +/* Copyright 2007 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __SVTTGLYF_H__ +#define __SVTTGLYF_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_GLYF "tt-glyf" + + + typedef FT_ULong + (*TT_Glyf_GetLocationFunc)( FT_Face face, + FT_UInt gindex, + FT_ULong *psize ); + + FT_DEFINE_SERVICE( TTGlyf ) + { + TT_Glyf_GetLocationFunc get_location; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTGLYF_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svwinfnt.h b/src/3rdparty/freetype/include/freetype/internal/services/svwinfnt.h new file mode 100644 index 0000000000..57f7765d92 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svwinfnt.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* svwinfnt.h */ +/* */ +/* The FreeType Windows FNT/FONT service (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVWINFNT_H__ +#define __SVWINFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_WINFONTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_WINFNT "winfonts" + + typedef FT_Error + (*FT_WinFnt_GetHeaderFunc)( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + FT_DEFINE_SERVICE( WinFnt ) + { + FT_WinFnt_GetHeaderFunc get_header; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVWINFNT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svxf86nm.h b/src/3rdparty/freetype/include/freetype/internal/services/svxf86nm.h new file mode 100644 index 0000000000..ca5d884a83 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/services/svxf86nm.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svxf86nm.h */ +/* */ +/* The FreeType XFree86 services (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVXF86NM_H__ +#define __SVXF86NM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A trivial service used to return the name of a face's font driver, + * according to the XFree86 nomenclature. Note that the service data + * is a simple constant string pointer. + */ + +#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name" + +#define FT_XF86_FORMAT_TRUETYPE "TrueType" +#define FT_XF86_FORMAT_TYPE_1 "Type 1" +#define FT_XF86_FORMAT_BDF "BDF" +#define FT_XF86_FORMAT_PCF "PCF" +#define FT_XF86_FORMAT_TYPE_42 "Type 42" +#define FT_XF86_FORMAT_CID "CID Type 1" +#define FT_XF86_FORMAT_CFF "CFF" +#define FT_XF86_FORMAT_PFR "PFR" +#define FT_XF86_FORMAT_WINFNT "Windows FNT" + + /* */ + + +FT_END_HEADER + + +#endif /* __SVXF86NM_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/sfnt.h b/src/3rdparty/freetype/include/freetype/internal/sfnt.h new file mode 100644 index 0000000000..7e8f6847c9 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/sfnt.h @@ -0,0 +1,762 @@ +/***************************************************************************/ +/* */ +/* sfnt.h */ +/* */ +/* High-level `sfnt' driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFNT_H__ +#define __SFNT_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Init_Face_Func */ + /* */ + /* <Description> */ + /* First part of the SFNT face object initialization. This finds */ + /* the face in a SFNT file or collection, and load its format tag in */ + /* face->format_tag. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Optional additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType */ + /* collection'. */ + /* */ + /* Once the format tag has been validated by the font driver, it */ + /* should then call the TT_Load_Face_Func() callback to read the rest */ + /* of the SFNT tables in the object. */ + /* */ + typedef FT_Error + (*TT_Init_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Face_Func */ + /* */ + /* <Description> */ + /* Second part of the SFNT face object initialization. This loads */ + /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */ + /* face object. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Optional additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function must be called after TT_Init_Face_Func(). */ + /* */ + typedef FT_Error + (*TT_Load_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Done_Face_Func */ + /* */ + /* <Description> */ + /* A callback used to delete the common SFNT data from a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Note> */ + /* This function does NOT destroy the face object. */ + /* */ + typedef void + (*TT_Done_Face_Func)( TT_Face face ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SFNT_HeaderRec_Func */ + /* */ + /* <Description> */ + /* Loads the header of a SFNT font file. Supports collections. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* <Output> */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType */ + /* collection'. */ + /* */ + /* This function checks that the header is valid by looking at the */ + /* values of `search_range', `entry_selector', and `range_shift'. */ + /* */ + typedef FT_Error + (*TT_Load_SFNT_HeaderRec_Func)( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header sfnt ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Directory_Func */ + /* */ + /* <Description> */ + /* Loads the table directory into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be on the first byte after the 4-byte font */ + /* format tag. This is the case just after a call to */ + /* TT_Load_Format_Tag(). */ + /* */ + typedef FT_Error + (*TT_Load_Directory_Func)( TT_Face face, + FT_Stream stream, + SFNT_Header sfnt ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Any_Func */ + /* */ + /* <Description> */ + /* Load any font table into client memory. */ + /* */ + /* <Input> */ + /* face :: The face object to look for. */ + /* */ + /* tag :: The tag of table to load. Use the value 0 if you want */ + /* to access the whole font file, else set this parameter */ + /* to a valid TrueType table tag that you can forge with */ + /* the MAKE_TT_TAG macro. */ + /* */ + /* offset :: The starting offset in the table (or the file if */ + /* tag == 0). */ + /* */ + /* length :: The address of the decision variable: */ + /* */ + /* If length == NULL: */ + /* Loads the whole table. Returns an error if */ + /* `offset' == 0! */ + /* */ + /* If *length == 0: */ + /* Exits immediately; returning the length of the given */ + /* table or of the font file, depending on the value of */ + /* `tag'. */ + /* */ + /* If *length != 0: */ + /* Loads the next `length' bytes of table or font, */ + /* starting at offset `offset' (in table or font too). */ + /* */ + /* <Output> */ + /* buffer :: The address of target buffer. */ + /* */ + /* <Return> */ + /* TrueType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Load_Any_Func)( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte *buffer, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Find_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Check whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* <Output> */ + /* arange :: The SBit range containing the glyph index. */ + /* */ + /* astrike :: The SBit strike containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns */ + /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ + /* glyph. */ + /* */ + typedef FT_Error + (*TT_Find_SBit_Image_Func)( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Metrics_Func */ + /* */ + /* <Description> */ + /* Get the big metrics for a given embedded bitmap. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* <Output> */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be positioned at the glyph's offset within */ + /* the `EBDT' table before the call. */ + /* */ + /* If the image format uses variable metrics, the stream cursor is */ + /* positioned just after the metrics header in the `EBDT' table on */ + /* function exit. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Load a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* <Input> */ + /* face :: */ + /* The target face object. */ + /* */ + /* strike_index :: */ + /* The strike index. */ + /* */ + /* glyph_index :: */ + /* The current glyph index. */ + /* */ + /* load_flags :: */ + /* The current load flags. */ + /* */ + /* stream :: */ + /* The input stream. */ + /* */ + /* <Output> */ + /* amap :: */ + /* The target pixmap. */ + /* */ + /* ametrics :: */ + /* A big sbit metrics structure for the glyph image. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* <Note> */ + /* The `map.buffer' field is always freed before the glyph is loaded. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Image_Func)( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *amap, + TT_SBit_MetricsRec *ametrics ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Set_SBit_Strike_OldFunc */ + /* */ + /* <Description> */ + /* Select an sbit strike for a given size request. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* req :: The size request. */ + /* */ + /* <Output> */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* sbit strike exists for the selected ppem values. */ + /* */ + typedef FT_Error + (*TT_Set_SBit_Strike_OldFunc)( TT_Face face, + FT_UInt x_ppem, + FT_UInt y_ppem, + FT_ULong* astrike_index ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Load_Func */ + /* */ + /* <Description> */ + /* Loads a given TrueType character map into memory. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* stream :: A handle to the current stream object. */ + /* */ + /* <InOut> */ + /* cmap :: A pointer to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function assumes that the stream is already in use (i.e., */ + /* opened). In case of error, all partially allocated tables are */ + /* released. */ + /* */ + typedef FT_Error + (*TT_CharMap_Load_Func)( TT_Face face, + void* cmap, + FT_Stream input ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Free_Func */ + /* */ + /* <Description> */ + /* Destroys a character mapping table. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* cmap :: A handle to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_CharMap_Free_Func)( TT_Face face, + void* cmap ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Set_SBit_Strike_Func */ + /* */ + /* <Description> */ + /* Select an sbit strike for a given size request. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* req :: The size request. */ + /* */ + /* <Output> */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* sbit strike exists for the selected ppem values. */ + /* */ + typedef FT_Error + (*TT_Set_SBit_Strike_Func)( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Strike_Metrics_Func */ + /* */ + /* <Description> */ + /* Load the metrics of a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* strike_index :: The strike index. */ + /* */ + /* <Output> */ + /* metrics :: the metrics of the strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* such sbit strike exists. */ + /* */ + typedef FT_Error + (*TT_Load_Strike_Metrics_Func)( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Get_PS_Name_Func */ + /* */ + /* <Description> */ + /* Get the PostScript glyph name of a glyph. */ + /* */ + /* <Input> */ + /* idx :: The glyph index. */ + /* */ + /* PSname :: The address of a string pointer. Will be NULL in case */ + /* of error, otherwise it is a pointer to the glyph name. */ + /* */ + /* You must not modify the returned string! */ + /* */ + /* <Output> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Get_PS_Name_Func)( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Metrics_Func */ + /* */ + /* <Description> */ + /* Load a metrics table, which is a table with a horizontal and a */ + /* vertical version. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load the vertical one. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Load_Metrics_Func)( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Get_Metrics_Func */ + /* */ + /* <Description> */ + /* Load the horizontal or vertical header in a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load vertical metrics. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Get_Metrics_Func)( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Table_Func */ + /* */ + /* <Description> */ + /* Load a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function uses `face->goto_table' to seek the stream to the */ + /* start of the table, except while loading the font directory. */ + /* */ + typedef FT_Error + (*TT_Load_Table_Func)( TT_Face face, + FT_Stream stream ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Free_Table_Func */ + /* */ + /* <Description> */ + /* Free a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + typedef void + (*TT_Free_Table_Func)( TT_Face face ); + + + /* + * @functype: + * TT_Face_GetKerningFunc + * + * @description: + * Return the horizontal kerning value between two glyphs. + * + * @input: + * face :: A handle to the source face object. + * left_glyph :: The left glyph index. + * right_glyph :: The right glyph index. + * + * @return: + * The kerning value in font units. + */ + typedef FT_Int + (*TT_Face_GetKerningFunc)( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* SFNT_Interface */ + /* */ + /* <Description> */ + /* This structure holds pointers to the functions used to load and */ + /* free the basic tables that are required in a `sfnt' font file. */ + /* */ + /* <Fields> */ + /* Check the various xxx_Func() descriptions for details. */ + /* */ + typedef struct SFNT_Interface_ + { + TT_Loader_GotoTableFunc goto_table; + + TT_Init_Face_Func init_face; + TT_Load_Face_Func load_face; + TT_Done_Face_Func done_face; + FT_Module_Requester get_interface; + + TT_Load_Any_Func load_any; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Load_SFNT_HeaderRec_Func load_sfnt_header; + TT_Load_Directory_Func load_directory; +#endif + + /* these functions are called by `load_face' but they can also */ + /* be called from external modules, if there is a need to do so */ + TT_Load_Table_Func load_head; + TT_Load_Metrics_Func load_hhea; + TT_Load_Table_Func load_cmap; + TT_Load_Table_Func load_maxp; + TT_Load_Table_Func load_os2; + TT_Load_Table_Func load_post; + + TT_Load_Table_Func load_name; + TT_Free_Table_Func free_name; + + /* optional tables */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Load_Table_Func load_hdmx_stub; + TT_Free_Table_Func free_hdmx_stub; +#endif + + /* this field was called `load_kerning' up to version 2.1.10 */ + TT_Load_Table_Func load_kern; + + TT_Load_Table_Func load_gasp; + TT_Load_Table_Func load_pclt; + + /* see `ttload.h'; this field was called `load_bitmap_header' up to */ + /* version 2.1.10 */ + TT_Load_Table_Func load_bhed; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* see `ttsbit.h' */ + TT_Set_SBit_Strike_OldFunc set_sbit_strike_stub; + TT_Load_Table_Func load_sbits_stub; + + /* + * The following two fields appeared in version 2.1.8, and were placed + * between `load_sbits' and `load_sbit_image'. We support them as a + * special exception since they are used by Xfont library within the + * X.Org xserver, and because the probability that other rogue clients + * use the other version 2.1.7 fields below is _extremely_ low. + * + * Note that this forces us to disable an interesting memory-saving + * optimization though... + */ + + TT_Find_SBit_Image_Func find_sbit_image; + TT_Load_SBit_Metrics_Func load_sbit_metrics; + +#endif + + TT_Load_SBit_Image_Func load_sbit_image; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Free_Table_Func free_sbits_stub; +#endif + + /* see `ttpost.h' */ + TT_Get_PS_Name_Func get_psname; + TT_Free_Table_Func free_psnames; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_CharMap_Load_Func load_charmap_stub; + TT_CharMap_Free_Func free_charmap_stub; +#endif + + /* starting here, the structure differs from version 2.1.7 */ + + /* this field was introduced in version 2.1.8, named `get_psname' */ + TT_Face_GetKerningFunc get_kerning; + + /* new elements introduced after version 2.1.10 */ + + /* load the font directory, i.e., the offset table and */ + /* the table directory */ + TT_Load_Table_Func load_font_dir; + TT_Load_Metrics_Func load_hmtx; + + TT_Load_Table_Func load_eblc; + TT_Free_Table_Func free_eblc; + + TT_Set_SBit_Strike_Func set_sbit_strike; + TT_Load_Strike_Metrics_Func load_strike_metrics; + + TT_Get_Metrics_Func get_metrics; + + } SFNT_Interface; + + + /* transitional */ + typedef SFNT_Interface* SFNT_Service; + + +FT_END_HEADER + +#endif /* __SFNT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/t1types.h b/src/3rdparty/freetype/include/freetype/internal/t1types.h new file mode 100644 index 0000000000..ff021b0fef --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/t1types.h @@ -0,0 +1,268 @@ +/***************************************************************************/ +/* */ +/* t1types.h */ +/* */ +/* Basic Type1/Type2 type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TYPES_H__ +#define __T1TYPES_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_EncodingRec */ + /* */ + /* <Description> */ + /* A structure modeling a custom encoding. */ + /* */ + /* <Fields> */ + /* num_chars :: The number of character codes in the encoding. */ + /* Usually 256. */ + /* */ + /* code_first :: The lowest valid character code in the encoding. */ + /* */ + /* code_last :: The highest valid character code in the encoding. */ + /* */ + /* char_index :: An array of corresponding glyph indices. */ + /* */ + /* char_name :: An array of corresponding glyph names. */ + /* */ + typedef struct T1_EncodingRecRec_ + { + FT_Int num_chars; + FT_Int code_first; + FT_Int code_last; + + FT_UShort* char_index; + FT_String** char_name; + + } T1_EncodingRec, *T1_Encoding; + + + typedef enum T1_EncodingType_ + { + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY, + T1_ENCODING_TYPE_STANDARD, + T1_ENCODING_TYPE_ISOLATIN1, + T1_ENCODING_TYPE_EXPERT + + } T1_EncodingType; + + + /* used to hold extra data of PS_FontInfoRec that + * cannot be stored in the publicly defined structure. + * + * Note these can't be blended with multiple-masters. + */ + typedef struct PS_FontExtraRec_ + { + FT_UShort fs_type; + + } PS_FontExtraRec; + + + typedef struct T1_FontRec_ + { + PS_FontInfoRec font_info; /* font info dictionary */ + PS_FontExtraRec font_extra; /* font info extra fields */ + PS_PrivateRec private_dict; /* private dictionary */ + FT_String* font_name; /* top-level dictionary */ + + T1_EncodingType encoding_type; + T1_EncodingRec encoding; + + FT_Byte* subrs_block; + FT_Byte* charstrings_block; + FT_Byte* glyph_names_block; + + FT_Int num_subrs; + FT_Byte** subrs; + FT_PtrDist* subrs_len; + + FT_Int num_glyphs; + FT_String** glyph_names; /* array of glyph names */ + FT_Byte** charstrings; /* array of glyph charstrings */ + FT_PtrDist* charstrings_len; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_BBox font_bbox; + FT_Long font_id; + + FT_Fixed stroke_width; + + } T1_FontRec, *T1_Font; + + + typedef struct CID_SubrsRec_ + { + FT_UInt num_subrs; + FT_Byte** code; + + } CID_SubrsRec, *CID_Subrs; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** AFM FONT INFORMATION STRUCTURES ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_TrackKernRec_ + { + FT_Int degree; + FT_Fixed min_ptsize; + FT_Fixed min_kern; + FT_Fixed max_ptsize; + FT_Fixed max_kern; + + } AFM_TrackKernRec, *AFM_TrackKern; + + typedef struct AFM_KernPairRec_ + { + FT_Int index1; + FT_Int index2; + FT_Int x; + FT_Int y; + + } AFM_KernPairRec, *AFM_KernPair; + + typedef struct AFM_FontInfoRec_ + { + FT_Bool IsCIDFont; + FT_BBox FontBBox; + FT_Fixed Ascender; + FT_Fixed Descender; + AFM_TrackKern TrackKerns; /* free if non-NULL */ + FT_Int NumTrackKern; + AFM_KernPair KernPairs; /* free if non-NULL */ + FT_Int NumKernPair; + + } AFM_FontInfoRec, *AFM_FontInfo; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_FaceRec_* T1_Face; + typedef struct CID_FaceRec_* CID_Face; + + + typedef struct T1_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; + const void* afm_data; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + PS_Unicodes unicode_map; +#endif + + /* support for Multiple Masters fonts */ + PS_Blend blend; + + /* undocumented, optional: indices of subroutines that express */ + /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ + /* respectively, as Type 2 charstrings; -1 if keywords not present */ + FT_Int ndv_idx; + FT_Int cdv_idx; + + /* undocumented, optional: has the same meaning as len_buildchar */ + /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ + FT_UInt len_buildchar; + FT_Int* buildchar; + + /* since version 2.1 - interface to PostScript hinter */ + const void* pshinter; + + } T1_FaceRec; + + + typedef struct CID_FaceRec_ + { + FT_FaceRec root; + void* psnames; + void* psaux; + CID_FaceInfoRec cid; + PS_FontExtraRec font_extra; +#if 0 + void* afm_data; +#endif + CID_Subrs subrs; + + /* since version 2.1 - interface to PostScript hinter */ + void* pshinter; + + /* since version 2.1.8, but was originally positioned after `afm_data' */ + FT_Byte* binary_data; /* used if hex data has been converted */ + FT_Stream cid_stream; + + } CID_FaceRec; + + +FT_END_HEADER + +#endif /* __T1TYPES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/internal/tttypes.h b/src/3rdparty/freetype/include/freetype/internal/tttypes.h new file mode 100644 index 0000000000..85fc27f74e --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/internal/tttypes.h @@ -0,0 +1,1543 @@ +/***************************************************************************/ +/* */ +/* tttypes.h */ +/* */ +/* Basic SFNT/TrueType type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTYPES_H__ +#define __TTTYPES_H__ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_OBJECTS_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TTC_HeaderRec */ + /* */ + /* <Description> */ + /* TrueType collection header. This table contains the offsets of */ + /* the font headers of each distinct TrueType face in the file. */ + /* */ + /* <Fields> */ + /* tag :: Must be `ttc ' to indicate a TrueType collection. */ + /* */ + /* version :: The version number. */ + /* */ + /* count :: The number of faces in the collection. The */ + /* specification says this should be an unsigned long, but */ + /* we use a signed long since we need the value -1 for */ + /* specific purposes. */ + /* */ + /* offsets :: The offsets of the font headers, one per face. */ + /* */ + typedef struct TTC_HeaderRec_ + { + FT_ULong tag; + FT_Fixed version; + FT_Long count; + FT_ULong* offsets; + + } TTC_HeaderRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* SFNT_HeaderRec */ + /* */ + /* <Description> */ + /* SFNT file format header. */ + /* */ + /* <Fields> */ + /* format_tag :: The font format tag. */ + /* */ + /* num_tables :: The number of tables in file. */ + /* */ + /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */ + /* */ + /* entry_selector :: Must be log2 of `search_range / 16'. */ + /* */ + /* range_shift :: Must be `num_tables * 16 - search_range'. */ + /* */ + typedef struct SFNT_HeaderRec_ + { + FT_ULong format_tag; + FT_UShort num_tables; + FT_UShort search_range; + FT_UShort entry_selector; + FT_UShort range_shift; + + FT_ULong offset; /* not in file */ + + } SFNT_HeaderRec, *SFNT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_TableRec */ + /* */ + /* <Description> */ + /* This structure describes a given table of a TrueType font. */ + /* */ + /* <Fields> */ + /* Tag :: A four-bytes tag describing the table. */ + /* */ + /* CheckSum :: The table checksum. This value can be ignored. */ + /* */ + /* Offset :: The offset of the table from the start of the TrueType */ + /* font in its resource. */ + /* */ + /* Length :: The table length (in bytes). */ + /* */ + typedef struct TT_TableRec_ + { + FT_ULong Tag; /* table type */ + FT_ULong CheckSum; /* table checksum */ + FT_ULong Offset; /* table file offset */ + FT_ULong Length; /* table length */ + + } TT_TableRec, *TT_Table; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_LongMetricsRec */ + /* */ + /* <Description> */ + /* A structure modeling the long metrics of the `hmtx' and `vmtx' */ + /* TrueType tables. The values are expressed in font units. */ + /* */ + /* <Fields> */ + /* advance :: The advance width or height for the glyph. */ + /* */ + /* bearing :: The left-side or top-side bearing for the glyph. */ + /* */ + typedef struct TT_LongMetricsRec_ + { + FT_UShort advance; + FT_Short bearing; + + } TT_LongMetricsRec, *TT_LongMetrics; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_ShortMetrics */ + /* */ + /* <Description> */ + /* A simple type to model the short metrics of the `hmtx' and `vmtx' */ + /* tables. */ + /* */ + typedef FT_Short TT_ShortMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_NameEntryRec */ + /* */ + /* <Description> */ + /* A structure modeling TrueType name records. Name records are used */ + /* to store important strings like family name, style name, */ + /* copyright, etc. in _localized_ versions (i.e., language, encoding, */ + /* etc). */ + /* */ + /* <Fields> */ + /* platformID :: The ID of the name's encoding platform. */ + /* */ + /* encodingID :: The platform-specific ID for the name's encoding. */ + /* */ + /* languageID :: The platform-specific ID for the name's language. */ + /* */ + /* nameID :: The ID specifying what kind of name this is. */ + /* */ + /* stringLength :: The length of the string in bytes. */ + /* */ + /* stringOffset :: The offset to the string in the `name' table. */ + /* */ + /* string :: A pointer to the string's bytes. Note that these */ + /* are usually UTF-16 encoded characters. */ + /* */ + typedef struct TT_NameEntryRec_ + { + FT_UShort platformID; + FT_UShort encodingID; + FT_UShort languageID; + FT_UShort nameID; + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_NameEntryRec, *TT_NameEntry; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_NameTableRec */ + /* */ + /* <Description> */ + /* A structure modeling the TrueType name table. */ + /* */ + /* <Fields> */ + /* format :: The format of the name table. */ + /* */ + /* numNameRecords :: The number of names in table. */ + /* */ + /* storageOffset :: The offset of the name table in the `name' */ + /* TrueType table. */ + /* */ + /* names :: An array of name records. */ + /* */ + /* stream :: the file's input stream. */ + /* */ + typedef struct TT_NameTableRec_ + { + FT_UShort format; + FT_UInt numNameRecords; + FT_UInt storageOffset; + TT_NameEntryRec* names; + FT_Stream stream; + + } TT_NameTableRec, *TT_NameTable; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GaspRangeRec */ + /* */ + /* <Description> */ + /* A tiny structure used to model a gasp range according to the */ + /* TrueType specification. */ + /* */ + /* <Fields> */ + /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */ + /* */ + /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */ + /* modes to be used. */ + /* */ + typedef struct TT_GaspRangeRec_ + { + FT_UShort maxPPEM; + FT_UShort gaspFlag; + + } TT_GaspRangeRec, *TT_GaspRange; + + +#define TT_GASP_GRIDFIT 0x01 +#define TT_GASP_DOGRAY 0x02 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GaspRec */ + /* */ + /* <Description> */ + /* A structure modeling the TrueType `gasp' table used to specify */ + /* grid-fitting and anti-aliasing behaviour. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numRanges :: The number of gasp ranges in table. */ + /* */ + /* gaspRanges :: An array of gasp ranges. */ + /* */ + typedef struct TT_Gasp_ + { + FT_UShort version; + FT_UShort numRanges; + TT_GaspRange gaspRanges; + + } TT_GaspRec; + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HdmxEntryRec */ + /* */ + /* <Description> */ + /* A small structure used to model the pre-computed widths of a given */ + /* size. They are found in the `hdmx' table. */ + /* */ + /* <Fields> */ + /* ppem :: The pixels per EM value at which these metrics apply. */ + /* */ + /* max_width :: The maximum advance width for this metric. */ + /* */ + /* widths :: An array of widths. Note: These are 8-bit bytes. */ + /* */ + typedef struct TT_HdmxEntryRec_ + { + FT_Byte ppem; + FT_Byte max_width; + FT_Byte* widths; + + } TT_HdmxEntryRec, *TT_HdmxEntry; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HdmxRec */ + /* */ + /* <Description> */ + /* A structure used to model the `hdmx' table, which contains */ + /* pre-computed widths for a set of given sizes/dimensions. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* num_records :: The number of hdmx records. */ + /* */ + /* records :: An array of hdmx records. */ + /* */ + typedef struct TT_HdmxRec_ + { + FT_UShort version; + FT_Short num_records; + TT_HdmxEntry records; + + } TT_HdmxRec, *TT_Hdmx; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Kern0_PairRec */ + /* */ + /* <Description> */ + /* A structure used to model a kerning pair for the kerning table */ + /* format 0. The engine now loads this table if it finds one in the */ + /* font file. */ + /* */ + /* <Fields> */ + /* left :: The index of the left glyph in pair. */ + /* */ + /* right :: The index of the right glyph in pair. */ + /* */ + /* value :: The kerning distance. A positive value spaces the */ + /* glyphs, a negative one makes them closer. */ + /* */ + typedef struct TT_Kern0_PairRec_ + { + FT_UShort left; /* index of left glyph in pair */ + FT_UShort right; /* index of right glyph in pair */ + FT_FWord value; /* kerning value */ + + } TT_Kern0_PairRec, *TT_Kern0_Pair; + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BITMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_MetricsRec */ + /* */ + /* <Description> */ + /* A structure used to hold the big metrics of a given glyph bitmap */ + /* in a TrueType or OpenType font. These are usually found in the */ + /* `EBDT' (Microsoft) or `bloc' (Apple) table. */ + /* */ + /* <Fields> */ + /* height :: The glyph height in pixels. */ + /* */ + /* width :: The glyph width in pixels. */ + /* */ + /* horiBearingX :: The horizontal left bearing. */ + /* */ + /* horiBearingY :: The horizontal top bearing. */ + /* */ + /* horiAdvance :: The horizontal advance. */ + /* */ + /* vertBearingX :: The vertical left bearing. */ + /* */ + /* vertBearingY :: The vertical top bearing. */ + /* */ + /* vertAdvance :: The vertical advance. */ + /* */ + typedef struct TT_SBit_MetricsRec_ + { + FT_Byte height; + FT_Byte width; + + FT_Char horiBearingX; + FT_Char horiBearingY; + FT_Byte horiAdvance; + + FT_Char vertBearingX; + FT_Char vertBearingY; + FT_Byte vertAdvance; + + } TT_SBit_MetricsRec, *TT_SBit_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_SmallMetricsRec */ + /* */ + /* <Description> */ + /* A structure used to hold the small metrics of a given glyph bitmap */ + /* in a TrueType or OpenType font. These are usually found in the */ + /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */ + /* */ + /* <Fields> */ + /* height :: The glyph height in pixels. */ + /* */ + /* width :: The glyph width in pixels. */ + /* */ + /* bearingX :: The left-side bearing. */ + /* */ + /* bearingY :: The top-side bearing. */ + /* */ + /* advance :: The advance width or height. */ + /* */ + typedef struct TT_SBit_Small_Metrics_ + { + FT_Byte height; + FT_Byte width; + + FT_Char bearingX; + FT_Char bearingY; + FT_Byte advance; + + } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_LineMetricsRec */ + /* */ + /* <Description> */ + /* A structure used to describe the text line metrics of a given */ + /* bitmap strike, for either a horizontal or vertical layout. */ + /* */ + /* <Fields> */ + /* ascender :: The ascender in pixels. */ + /* */ + /* descender :: The descender in pixels. */ + /* */ + /* max_width :: The maximum glyph width in pixels. */ + /* */ + /* caret_slope_enumerator :: Rise of the caret slope, typically set */ + /* to 1 for non-italic fonts. */ + /* */ + /* caret_slope_denominator :: Rise of the caret slope, typically set */ + /* to 0 for non-italic fonts. */ + /* */ + /* caret_offset :: Offset in pixels to move the caret for */ + /* proper positioning. */ + /* */ + /* min_origin_SB :: Minimum of horiBearingX (resp. */ + /* vertBearingY). */ + /* min_advance_SB :: Minimum of */ + /* */ + /* horizontal advance - */ + /* ( horiBearingX + width ) */ + /* */ + /* resp. */ + /* */ + /* vertical advance - */ + /* ( vertBearingY + height ) */ + /* */ + /* max_before_BL :: Maximum of horiBearingY (resp. */ + /* vertBearingY). */ + /* */ + /* min_after_BL :: Minimum of */ + /* */ + /* horiBearingY - height */ + /* */ + /* resp. */ + /* */ + /* vertBearingX - width */ + /* */ + /* pads :: Unused (to make the size of the record */ + /* a multiple of 32 bits. */ + /* */ + typedef struct TT_SBit_LineMetricsRec_ + { + FT_Char ascender; + FT_Char descender; + FT_Byte max_width; + FT_Char caret_slope_numerator; + FT_Char caret_slope_denominator; + FT_Char caret_offset; + FT_Char min_origin_SB; + FT_Char min_advance_SB; + FT_Char max_before_BL; + FT_Char min_after_BL; + FT_Char pads[2]; + + } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_RangeRec */ + /* */ + /* <Description> */ + /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* <Fields> */ + /* first_glyph :: The first glyph index in the range. */ + /* */ + /* last_glyph :: The last glyph index in the range. */ + /* */ + /* index_format :: The format of index table. Valid values are 1 */ + /* to 5. */ + /* */ + /* image_format :: The format of `EBDT' image data. */ + /* */ + /* image_offset :: The offset to image data in `EBDT'. */ + /* */ + /* image_size :: For index formats 2 and 5. This is the size in */ + /* bytes of each glyph bitmap. */ + /* */ + /* big_metrics :: For index formats 2 and 5. This is the big */ + /* metrics for each glyph bitmap. */ + /* */ + /* num_glyphs :: For index formats 4 and 5. This is the number of */ + /* glyphs in the code array. */ + /* */ + /* glyph_offsets :: For index formats 1 and 3. */ + /* */ + /* glyph_codes :: For index formats 4 and 5. */ + /* */ + /* table_offset :: The offset of the index table in the `EBLC' */ + /* table. Only used during strike loading. */ + /* */ + typedef struct TT_SBit_RangeRec_ + { + FT_UShort first_glyph; + FT_UShort last_glyph; + + FT_UShort index_format; + FT_UShort image_format; + FT_ULong image_offset; + + FT_ULong image_size; + TT_SBit_MetricsRec metrics; + FT_ULong num_glyphs; + + FT_ULong* glyph_offsets; + FT_UShort* glyph_codes; + + FT_ULong table_offset; + + } TT_SBit_RangeRec, *TT_SBit_Range; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_StrikeRec */ + /* */ + /* <Description> */ + /* A structure used describe a given bitmap strike in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* <Fields> */ + /* num_index_ranges :: The number of index ranges. */ + /* */ + /* index_ranges :: An array of glyph index ranges. */ + /* */ + /* color_ref :: Unused. `color_ref' is put in for future */ + /* enhancements, but these fields are already */ + /* in use by other platforms (e.g. Newton). */ + /* For details, please see */ + /* */ + /* http://fonts.apple.com/ */ + /* TTRefMan/RM06/Chap6bloc.html */ + /* */ + /* hori :: The line metrics for horizontal layouts. */ + /* */ + /* vert :: The line metrics for vertical layouts. */ + /* */ + /* start_glyph :: The lowest glyph index for this strike. */ + /* */ + /* end_glyph :: The highest glyph index for this strike. */ + /* */ + /* x_ppem :: The number of horizontal pixels per EM. */ + /* */ + /* y_ppem :: The number of vertical pixels per EM. */ + /* */ + /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */ + /* and 8. */ + /* */ + /* flags :: Is this a vertical or horizontal strike? For */ + /* details, please see */ + /* */ + /* http://fonts.apple.com/ */ + /* TTRefMan/RM06/Chap6bloc.html */ + /* */ + typedef struct TT_SBit_StrikeRec_ + { + FT_Int num_ranges; + TT_SBit_Range sbit_ranges; + FT_ULong ranges_offset; + + FT_ULong color_ref; + + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_UShort start_glyph; + FT_UShort end_glyph; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte bit_depth; + FT_Char flags; + + } TT_SBit_StrikeRec, *TT_SBit_Strike; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_ComponentRec */ + /* */ + /* <Description> */ + /* A simple structure to describe a compound sbit element. */ + /* */ + /* <Fields> */ + /* glyph_code :: The element's glyph index. */ + /* */ + /* x_offset :: The element's left bearing. */ + /* */ + /* y_offset :: The element's top bearing. */ + /* */ + typedef struct TT_SBit_ComponentRec_ + { + FT_UShort glyph_code; + FT_Char x_offset; + FT_Char y_offset; + + } TT_SBit_ComponentRec, *TT_SBit_Component; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_ScaleRec */ + /* */ + /* <Description> */ + /* A structure used describe a given bitmap scaling table, as defined */ + /* in the `EBSC' table. */ + /* */ + /* <Fields> */ + /* hori :: The horizontal line metrics. */ + /* */ + /* vert :: The vertical line metrics. */ + /* */ + /* x_ppem :: The number of horizontal pixels per EM. */ + /* */ + /* y_ppem :: The number of vertical pixels per EM. */ + /* */ + /* x_ppem_substitute :: Substitution x_ppem value. */ + /* */ + /* y_ppem_substitute :: Substitution y_ppem value. */ + /* */ + typedef struct TT_SBit_ScaleRec_ + { + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte x_ppem_substitute; + FT_Byte y_ppem_substitute; + + } TT_SBit_ScaleRec, *TT_SBit_Scale; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_20Rec */ + /* */ + /* <Description> */ + /* Postscript names sub-table, format 2.0. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* <Fields> */ + /* num_glyphs :: The number of named glyphs in the table. */ + /* */ + /* num_names :: The number of PS names stored in the table. */ + /* */ + /* glyph_indices :: The indices of the glyphs in the names arrays. */ + /* */ + /* glyph_names :: The PS names not in Mac Encoding. */ + /* */ + typedef struct TT_Post_20Rec_ + { + FT_UShort num_glyphs; + FT_UShort num_names; + FT_UShort* glyph_indices; + FT_Char** glyph_names; + + } TT_Post_20Rec, *TT_Post_20; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_25Rec */ + /* */ + /* <Description> */ + /* Postscript names sub-table, format 2.5. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* <Fields> */ + /* num_glyphs :: The number of glyphs in the table. */ + /* */ + /* offsets :: An array of signed offsets in a normal Mac */ + /* Postscript name encoding. */ + /* */ + typedef struct TT_Post_25_ + { + FT_UShort num_glyphs; + FT_Char* offsets; + + } TT_Post_25Rec, *TT_Post_25; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_NamesRec */ + /* */ + /* <Description> */ + /* Postscript names table, either format 2.0 or 2.5. */ + /* */ + /* <Fields> */ + /* loaded :: A flag to indicate whether the PS names are loaded. */ + /* */ + /* format_20 :: The sub-table used for format 2.0. */ + /* */ + /* format_25 :: The sub-table used for format 2.5. */ + /* */ + typedef struct TT_Post_NamesRec_ + { + FT_Bool loaded; + + union + { + TT_Post_20Rec format_20; + TT_Post_25Rec format_25; + + } names; + + } TT_Post_NamesRec, *TT_Post_Names; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** GX VARIATION TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + typedef struct GX_BlendRec_ *GX_Blend; +#endif + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * These types are used to support a `BDF ' table that isn't part of the + * official TrueType specification. It is mainly used in SFNT-based + * bitmap fonts that were generated from a set of BDF fonts. + * + * The format of the table is as follows. + * + * USHORT version `BDF ' table version number, should be 0x0001. + * USHORT strikeCount Number of strikes (bitmap sizes) in this table. + * ULONG stringTable Offset (from start of BDF table) to string + * table. + * + * This is followed by an array of `strikeCount' descriptors, having the + * following format. + * + * USHORT ppem Vertical pixels per EM for this strike. + * USHORT numItems Number of items for this strike (properties and + * atoms). Maximum is 255. + * + * This array in turn is followed by `strikeCount' value sets. Each + * `value set' is an array of `numItems' items with the following format. + * + * ULONG item_name Offset in string table to item name. + * USHORT item_type The item type. Possible values are + * 0 => string (e.g., COMMENT) + * 1 => atom (e.g., FONT or even SIZE) + * 2 => int32 + * 3 => uint32 + * 0x10 => A flag to indicate a properties. This + * is ORed with the above values. + * ULONG item_value For strings => Offset into string table without + * the corresponding double quotes. + * For atoms => Offset into string table. + * For integers => Direct value. + * + * All strings in the string table consist of bytes and are + * zero-terminated. + * + */ + +#ifdef TT_CONFIG_OPTION_BDF + + typedef struct TT_BDFRec_ + { + FT_Byte* table; + FT_Byte* table_end; + FT_Byte* strings; + FT_UInt32 strings_size; + FT_UInt num_strikes; + FT_Bool loaded; + + } TT_BDFRec, *TT_BDF; + +#endif /* TT_CONFIG_OPTION_BDF */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This structure/class is defined here because it is common to the */ + /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ + /* */ + /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */ + /* shared between font drivers, and are thus defined in `ttobjs.h'. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_Face */ + /* */ + /* <Description> */ + /* A handle to a TrueType face/font object. A TT_Face encapsulates */ + /* the resolution and scaling independent parts of a TrueType font */ + /* resource. */ + /* */ + /* <Note> */ + /* The TT_Face structure is also used as a `parent class' for the */ + /* OpenType-CFF class (T2_Face). */ + /* */ + typedef struct TT_FaceRec_* TT_Face; + + + /* a function type used for the truetype bytecode interpreter hooks */ + typedef FT_Error + (*TT_Interpreter)( void* exec_context ); + + /* forward declaration */ + typedef struct TT_LoaderRec_* TT_Loader; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_GotoTableFunc */ + /* */ + /* <Description> */ + /* Seeks a stream to the start of a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* tag :: A 4-byte tag used to name the table. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* length :: The length of the table in bytes. Set to 0 if not */ + /* needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + typedef FT_Error + (*TT_Loader_GotoTableFunc)( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_StartGlyphFunc */ + /* */ + /* <Description> */ + /* Seeks a stream to the start of a given glyph element, and opens a */ + /* frame for it. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* glyph index :: The index of the glyph to access. */ + /* */ + /* offset :: The offset of the glyph according to the */ + /* `locations' table. */ + /* */ + /* byte_count :: The size of the frame in bytes. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function is normally equivalent to FT_STREAM_SEEK(offset) */ + /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */ + /* but alternative formats (e.g. compressed ones) might use something */ + /* different. */ + /* */ + typedef FT_Error + (*TT_Loader_StartGlyphFunc)( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_ReadGlyphFunc */ + /* */ + /* <Description> */ + /* Reads one glyph element (its header, a simple glyph, or a */ + /* composite) from the loader's current stream frame. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_EndGlyphFunc */ + /* */ + /* <Description> */ + /* Closes the current loader stream frame for the glyph. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + typedef void + (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); + + + /*************************************************************************/ + /* */ + /* TrueType Face Type */ + /* */ + /* <Struct> */ + /* TT_Face */ + /* */ + /* <Description> */ + /* The TrueType face class. These objects model the resolution and */ + /* point-size independent data found in a TrueType font file. */ + /* */ + /* <Fields> */ + /* root :: The base FT_Face structure, managed by the */ + /* base layer. */ + /* */ + /* ttc_header :: The TrueType collection header, used when */ + /* the file is a `ttc' rather than a `ttf'. */ + /* For ordinary font files, the field */ + /* `ttc_header.count' is set to 0. */ + /* */ + /* format_tag :: The font format tag. */ + /* */ + /* num_tables :: The number of TrueType tables in this font */ + /* file. */ + /* */ + /* dir_tables :: The directory of TrueType tables for this */ + /* font file. */ + /* */ + /* header :: The font's font header (`head' table). */ + /* Read on font opening. */ + /* */ + /* horizontal :: The font's horizontal header (`hhea' */ + /* table). This field also contains the */ + /* associated horizontal metrics table */ + /* (`hmtx'). */ + /* */ + /* max_profile :: The font's maximum profile table. Read on */ + /* font opening. Note that some maximum */ + /* values cannot be taken directly from this */ + /* table. We thus define additional fields */ + /* below to hold the computed maxima. */ + /* */ + /* vertical_info :: A boolean which is set when the font file */ + /* contains vertical metrics. If not, the */ + /* value of the `vertical' field is */ + /* undefined. */ + /* */ + /* vertical :: The font's vertical header (`vhea' table). */ + /* This field also contains the associated */ + /* vertical metrics table (`vmtx'), if found. */ + /* IMPORTANT: The contents of this field is */ + /* undefined if the `verticalInfo' field is */ + /* unset. */ + /* */ + /* num_names :: The number of name records within this */ + /* TrueType font. */ + /* */ + /* name_table :: The table of name records (`name'). */ + /* */ + /* os2 :: The font's OS/2 table (`OS/2'). */ + /* */ + /* postscript :: The font's PostScript table (`post' */ + /* table). The PostScript glyph names are */ + /* not loaded by the driver on face opening. */ + /* See the `ttpost' module for more details. */ + /* */ + /* cmap_table :: Address of the face's `cmap' SFNT table */ + /* in memory (it's an extracted frame). */ + /* */ + /* cmap_size :: The size in bytes of the `cmap_table' */ + /* described above. */ + /* */ + /* goto_table :: A function called by each TrueType table */ + /* loader to position a stream's cursor to */ + /* the start of a given table according to */ + /* its tag. It defaults to TT_Goto_Face but */ + /* can be different for strange formats (e.g. */ + /* Type 42). */ + /* */ + /* access_glyph_frame :: A function used to access the frame of a */ + /* given glyph within the face's font file. */ + /* */ + /* forget_glyph_frame :: A function used to forget the frame of a */ + /* given glyph when all data has been loaded. */ + /* */ + /* read_glyph_header :: A function used to read a glyph header. */ + /* It must be called between an `access' and */ + /* `forget'. */ + /* */ + /* read_simple_glyph :: A function used to read a simple glyph. */ + /* It must be called after the header was */ + /* read, and before the `forget'. */ + /* */ + /* read_composite_glyph :: A function used to read a composite glyph. */ + /* It must be called after the header was */ + /* read, and before the `forget'. */ + /* */ + /* sfnt :: A pointer to the SFNT service. */ + /* */ + /* psnames :: A pointer to the PostScript names service. */ + /* */ + /* hdmx :: The face's horizontal device metrics */ + /* (`hdmx' table). This table is optional in */ + /* TrueType/OpenType fonts. */ + /* */ + /* gasp :: The grid-fitting and scaling properties */ + /* table (`gasp'). This table is optional in */ + /* TrueType/OpenType fonts. */ + /* */ + /* pclt :: The `pclt' SFNT table. */ + /* */ + /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */ + /* sizes, embedded in this font. */ + /* */ + /* sbit_strikes :: An array of sbit strikes embedded in this */ + /* font. This table is optional in a */ + /* TrueType/OpenType font. */ + /* */ + /* num_sbit_scales :: The number of sbit scales for this font. */ + /* */ + /* sbit_scales :: Array of sbit scales embedded in this */ + /* font. This table is optional in a */ + /* TrueType/OpenType font. */ + /* */ + /* postscript_names :: A table used to store the Postscript names */ + /* of the glyphs for this font. See the */ + /* file `ttconfig.h' for comments on the */ + /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */ + /* */ + /* num_locations :: The number of glyph locations in this */ + /* TrueType file. This should be */ + /* identical to the number of glyphs. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* glyph_locations :: An array of longs. These are offsets to */ + /* glyph data within the `glyf' table. */ + /* Ignored for Type 2 font faces. */ + /* */ + /* glyf_len :: The length of the `glyf' table. Needed */ + /* for malformed `loca' tables. */ + /* */ + /* font_program_size :: Size in bytecodes of the face's font */ + /* program. 0 if none defined. Ignored for */ + /* Type 2 fonts. */ + /* */ + /* font_program :: The face's font program (bytecode stream) */ + /* executed at load time, also used during */ + /* glyph rendering. Comes from the `fpgm' */ + /* table. Ignored for Type 2 font fonts. */ + /* */ + /* cvt_program_size :: The size in bytecodes of the face's cvt */ + /* program. Ignored for Type 2 fonts. */ + /* */ + /* cvt_program :: The face's cvt program (bytecode stream) */ + /* executed each time an instance/size is */ + /* changed/reset. Comes from the `prep' */ + /* table. Ignored for Type 2 fonts. */ + /* */ + /* cvt_size :: Size of the control value table (in */ + /* entries). Ignored for Type 2 fonts. */ + /* */ + /* cvt :: The face's original control value table. */ + /* Coordinates are expressed in unscaled font */ + /* units. Comes from the `cvt ' table. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* num_kern_pairs :: The number of kerning pairs present in the */ + /* font file. The engine only loads the */ + /* first horizontal format 0 kern table it */ + /* finds in the font file. Ignored for */ + /* Type 2 fonts. */ + /* */ + /* kern_table_index :: The index of the kerning table in the font */ + /* kerning directory. Ignored for Type 2 */ + /* fonts. */ + /* */ + /* interpreter :: A pointer to the TrueType bytecode */ + /* interpreters field is also used to hook */ + /* the debugger in `ttdebug'. */ + /* */ + /* unpatented_hinting :: If true, use only unpatented methods in */ + /* the bytecode interpreter. */ + /* */ + /* doblend :: A boolean which is set if the font should */ + /* be blended (this is for GX var). */ + /* */ + /* blend :: Contains the data needed to control GX */ + /* variation tables (rather like Multiple */ + /* Master data). */ + /* */ + /* extra :: Reserved for third-party font drivers. */ + /* */ + /* postscript_name :: The PS name of the font. Used by the */ + /* postscript name service. */ + /* */ + typedef struct TT_FaceRec_ + { + FT_FaceRec root; + + TTC_HeaderRec ttc_header; + + FT_ULong format_tag; + FT_UShort num_tables; + TT_Table dir_tables; + + TT_Header header; /* TrueType header table */ + TT_HoriHeader horizontal; /* TrueType horizontal header */ + + TT_MaxProfile max_profile; +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_ULong max_components; /* stubbed to 0 */ +#endif + + FT_Bool vertical_info; + TT_VertHeader vertical; /* TT Vertical header, if present */ + + FT_UShort num_names; /* number of name records */ + TT_NameTableRec name_table; /* name table */ + + TT_OS2 os2; /* TrueType OS/2 table */ + TT_Postscript postscript; /* TrueType Postscript table */ + + FT_Byte* cmap_table; /* extracted `cmap' table */ + FT_ULong cmap_size; + + TT_Loader_GotoTableFunc goto_table; + + TT_Loader_StartGlyphFunc access_glyph_frame; + TT_Loader_EndGlyphFunc forget_glyph_frame; + TT_Loader_ReadGlyphFunc read_glyph_header; + TT_Loader_ReadGlyphFunc read_simple_glyph; + TT_Loader_ReadGlyphFunc read_composite_glyph; + + /* a typeless pointer to the SFNT_Interface table used to load */ + /* the basic TrueType tables in the face object */ + void* sfnt; + + /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ + /* handle glyph names <-> unicode & Mac values */ + void* psnames; + + + /***********************************************************************/ + /* */ + /* Optional TrueType/OpenType tables */ + /* */ + /***********************************************************************/ + + /* horizontal device metrics */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_HdmxRec hdmx; +#endif + + /* grid-fitting and scaling table */ + TT_GaspRec gasp; /* the `gasp' table */ + + /* PCL 5 table */ + TT_PCLT pclt; + + /* embedded bitmaps support */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_ULong num_sbit_strikes; + TT_SBit_Strike sbit_strikes; +#endif + + FT_ULong num_sbit_scales; + TT_SBit_Scale sbit_scales; + + /* postscript names table */ + TT_Post_NamesRec postscript_names; + + + /***********************************************************************/ + /* */ + /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ + /* */ + /***********************************************************************/ + + /* the glyph locations */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_UShort num_locations_stub; + FT_Long* glyph_locations_stub; +#endif + + /* the font program, if any */ + FT_ULong font_program_size; + FT_Byte* font_program; + + /* the cvt program, if any */ + FT_ULong cvt_program_size; + FT_Byte* cvt_program; + + /* the original, unscaled, control value table */ + FT_ULong cvt_size; + FT_Short* cvt; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + /* the format 0 kerning table, if any */ + FT_Int num_kern_pairs; + FT_Int kern_table_index; + TT_Kern0_Pair kern_pairs; +#endif + + /* A pointer to the bytecode interpreter to use. This is also */ + /* used to hook the debugger for the `ttdebug' utility. */ + TT_Interpreter interpreter; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Use unpatented hinting only. */ + FT_Bool unpatented_hinting; +#endif + + /***********************************************************************/ + /* */ + /* Other tables or fields. This is used by derivative formats like */ + /* OpenType. */ + /* */ + /***********************************************************************/ + + FT_Generic extra; + + const char* postscript_name; + + /* since version 2.1.8, but was originally placed after */ + /* `glyph_locations_stub' */ + FT_ULong glyf_len; + + /* since version 2.1.8, but was originally placed before `extra' */ +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Bool doblend; + GX_Blend blend; +#endif + + /* since version 2.2 */ + + FT_Byte* horz_metrics; + FT_ULong horz_metrics_size; + + FT_Byte* vert_metrics; + FT_ULong vert_metrics_size; + + FT_UInt num_locations; + FT_Byte* glyph_locations; + + FT_Byte* hdmx_table; + FT_ULong hdmx_table_size; + FT_UInt hdmx_record_count; + FT_ULong hdmx_record_size; + FT_Byte* hdmx_record_sizes; + + FT_Byte* sbit_table; + FT_ULong sbit_table_size; + FT_UInt sbit_num_strikes; + + FT_Byte* kern_table; + FT_ULong kern_table_size; + FT_UInt num_kern_tables; + FT_UInt32 kern_avail_bits; + FT_UInt32 kern_order_bits; + +#ifdef TT_CONFIG_OPTION_BDF + TT_BDFRec bdf; +#endif /* TT_CONFIG_OPTION_BDF */ + + /* since 2.3.0 */ + FT_ULong horz_metrics_offset; + FT_ULong vert_metrics_offset; + + } TT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GlyphZoneRec */ + /* */ + /* <Description> */ + /* A glyph zone is used to load, scale and hint glyph outline */ + /* coordinates. */ + /* */ + /* <Fields> */ + /* memory :: A handle to the memory manager. */ + /* */ + /* max_points :: The maximal size in points of the zone. */ + /* */ + /* max_contours :: Max size in links contours of the zone. */ + /* */ + /* n_points :: The current number of points in the zone. */ + /* */ + /* n_contours :: The current number of contours in the zone. */ + /* */ + /* org :: The original glyph coordinates (font */ + /* units/scaled). */ + /* */ + /* cur :: The current glyph coordinates (scaled/hinted). */ + /* */ + /* tags :: The point control tags. */ + /* */ + /* contours :: The contours end points. */ + /* */ + /* first_point :: Offset of the current subglyph's first point. */ + /* */ + typedef struct TT_GlyphZoneRec_ + { + FT_Memory memory; + FT_UShort max_points; + FT_UShort max_contours; + FT_UShort n_points; /* number of points in zone */ + FT_Short n_contours; /* number of contours */ + + FT_Vector* org; /* original point coordinates */ + FT_Vector* cur; /* current point coordinates */ + FT_Vector* orus; /* original (unscaled) point coordinates */ + + FT_Byte* tags; /* current touch flags */ + FT_UShort* contours; /* contour end points */ + + FT_UShort first_point; /* offset of first (#0) point */ + + } TT_GlyphZoneRec, *TT_GlyphZone; + + + /* handle to execution context */ + typedef struct TT_ExecContextRec_* TT_ExecContext; + + /* glyph loader structure */ + typedef struct TT_LoaderRec_ + { + FT_Face face; + FT_Size size; + FT_GlyphSlot glyph; + FT_GlyphLoader gloader; + + FT_ULong load_flags; + FT_UInt glyph_index; + + FT_Stream stream; + FT_Int byte_len; + + FT_Short n_contours; + FT_BBox bbox; + FT_Int left_bearing; + FT_Int advance; + FT_Int linear; + FT_Bool linear_def; + FT_Bool preserve_pps; + FT_Vector pp1; + FT_Vector pp2; + + FT_ULong glyf_offset; + + /* the zone where we load our glyphs */ + TT_GlyphZoneRec base; + TT_GlyphZoneRec zone; + + TT_ExecContext exec; + FT_Byte* instructions; + FT_ULong ins_pos; + + /* for possible extensibility in other formats */ + void* other; + + /* since version 2.1.8 */ + FT_Int top_bearing; + FT_Int vadvance; + FT_Vector pp3; + FT_Vector pp4; + + /* since version 2.2.1 */ + FT_Byte* cursor; + FT_Byte* limit; + + } TT_LoaderRec; + + +FT_END_HEADER + +#endif /* __TTTYPES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/t1tables.h b/src/3rdparty/freetype/include/freetype/t1tables.h new file mode 100644 index 0000000000..5e2a3934ce --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/t1tables.h @@ -0,0 +1,504 @@ +/***************************************************************************/ +/* */ +/* t1tables.h */ +/* */ +/* Basic Type 1/Type 2 tables definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TABLES_H__ +#define __T1TABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* type1_tables */ + /* */ + /* <Title> */ + /* Type 1 Tables */ + /* */ + /* <Abstract> */ + /* Type~1 (PostScript) specific font tables. */ + /* */ + /* <Description> */ + /* This section contains the definition of Type 1-specific tables, */ + /* including structures related to other PostScript font formats. */ + /* */ + /*************************************************************************/ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfoRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */ + /* Note that for Multiple Master fonts, each instance has its own */ + /* FontInfo dictionary. */ + /* */ + typedef struct PS_FontInfoRec_ + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfo */ + /* */ + /* <Description> */ + /* A handle to a @PS_FontInfoRec structure. */ + /* */ + typedef struct PS_FontInfoRec_* PS_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_FontInfo */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_FontInfoRec T1_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_PrivateRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type~1 or Type~2 private dictionary. */ + /* Note that for Multiple Master fonts, each instance has its own */ + /* Private dictionary. */ + /* */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_Private */ + /* */ + /* <Description> */ + /* A handle to a @PS_PrivateRec structure. */ + /* */ + typedef struct PS_PrivateRec_* PS_Private; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_Private */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_PrivateRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_PrivateRec T1_Private; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* T1_Blend_Flags */ + /* */ + /* <Description> */ + /* A set of flags used to indicate which fields are present in a */ + /* given blend dictionary (font info or private). Used to support */ + /* Multiple Masters fonts. */ + /* */ + typedef enum T1_Blend_Flags_ + { + /*# required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /*# required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + /*# never remove */ + T1_BLEND_MAX + + } T1_Blend_Flags; + + /* */ + + + /*# backwards compatible definitions */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backwards-compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backwards-compatible definition */ + typedef PS_BlendRec T1_Blend; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceDictRec */ + /* */ + /* <Description> */ + /* A structure used to represent data in a CID top-level dictionary. */ + /* */ + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_Int sd_bytes; + + } CID_FaceDictRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceDict */ + /* */ + /* <Description> */ + /* A handle to a @CID_FaceDictRec structure. */ + /* */ + typedef struct CID_FaceDictRec_* CID_FaceDict; + + /* */ + + + /* backwards-compatible definition */ + typedef CID_FaceDictRec CID_FontDict; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfoRec */ + /* */ + /* <Description> */ + /* A structure used to represent CID Face information. */ + /* */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_Int fd_bytes; + FT_Int gd_bytes; + FT_ULong cid_count; + + FT_Int num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfo */ + /* */ + /* <Description> */ + /* A handle to a @CID_FaceInfoRec structure. */ + /* */ + typedef struct CID_FaceInfoRec_* CID_FaceInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_Info */ + /* */ + /* <Description> */ + /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef CID_FaceInfoRec CID_Info; + + + /************************************************************************ + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable PostScript glyph + * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro, + * except that certain fonts (mostly TrueType) contain incorrect + * glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + * + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_info :: + * Output font info structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the font info structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function will + * return the `FT_Err_Invalid_Argument' error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfo afont_info ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_private :: + * Output private dictionary structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the @PS_PrivateRec structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument' error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_Private afont_private ); + + /* */ + + +FT_END_HEADER + +#endif /* __T1TABLES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ttnameid.h b/src/3rdparty/freetype/include/freetype/ttnameid.h new file mode 100644 index 0000000000..cbeac78db1 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ttnameid.h @@ -0,0 +1,1247 @@ +/***************************************************************************/ +/* */ +/* ttnameid.h */ +/* */ +/* TrueType name ID definitions (specification only). */ +/* */ +/* Copyright 1996-2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTNAMEID_H__ +#define __TTNAMEID_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + + + /*************************************************************************/ + /* */ + /* Possible values for the `platform' identifier code in the name */ + /* records of the TTF `name' table. */ + /* */ + /*************************************************************************/ + + + /*********************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id' identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name entry. + * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that + * most TrueType fonts contain an Apple roman charmap to be usable on + * MacOS systems (even if they contain a Microsoft charmap as well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify Unicode charmaps. It is however + * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding + * `encoding_id' values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values. + * Note that most fonts contain a Unicode charmap using + * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /*********************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + * + * TT_APPLE_ID_VARIANT_SELECTOR :: + * From Adobe, not Apple. Not a normal cmap. Specifies variations + * on a real cmap. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ + + + /*********************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + * + * @values: + * TT_MAC_ID_ROMAN :: + * TT_MAC_ID_JAPANESE :: + * TT_MAC_ID_TRADITIONAL_CHINESE :: + * TT_MAC_ID_KOREAN :: + * TT_MAC_ID_ARABIC :: + * TT_MAC_ID_HEBREW :: + * TT_MAC_ID_GREEK :: + * TT_MAC_ID_RUSSIAN :: + * TT_MAC_ID_RSYMBOL :: + * TT_MAC_ID_DEVANAGARI :: + * TT_MAC_ID_GURMUKHI :: + * TT_MAC_ID_GUJARATI :: + * TT_MAC_ID_ORIYA :: + * TT_MAC_ID_BENGALI :: + * TT_MAC_ID_TAMIL :: + * TT_MAC_ID_TELUGU :: + * TT_MAC_ID_KANNADA :: + * TT_MAC_ID_MALAYALAM :: + * TT_MAC_ID_SINHALESE :: + * TT_MAC_ID_BURMESE :: + * TT_MAC_ID_KHMER :: + * TT_MAC_ID_THAI :: + * TT_MAC_ID_LAOTIAN :: + * TT_MAC_ID_GEORGIAN :: + * TT_MAC_ID_ARMENIAN :: + * TT_MAC_ID_MALDIVIAN :: + * TT_MAC_ID_SIMPLIFIED_CHINESE :: + * TT_MAC_ID_TIBETAN :: + * TT_MAC_ID_MONGOLIAN :: + * TT_MAC_ID_GEEZ :: + * TT_MAC_ID_SLAVIC :: + * TT_MAC_ID_VIETNAMESE :: + * TT_MAC_ID_SINDHI :: + * TT_MAC_ID_UNINTERP :: + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /*********************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ISO charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /*********************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Corresponds to Microsoft symbol encoding. See + * @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See + * @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_GB2312 :: + * Corresponds to Simplified Chinese as used in Mainland China. See + * @FT_ENCODING_GB2312. + * + * TT_MS_ID_BIG_5 :: + * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. + * See @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to + * the OpenType specification version 1.4 (mid-2001.) + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_GB2312 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + + /*********************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + * TT_ADOBE_ID_LATIN_1 :: + * Adobe Latin~1 encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MACINTOSH. */ + /* */ + /* The canonical source for the Apple assigned Language ID's is at */ + /* */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6name.html */ + /* */ +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + +#if 0 /* these seem to be errors that have been dropped */ + +#define TT_MAC_LANGID_SCOTTISH_GAELIC 140 +#define TT_MAC_LANGID_IRISH_GAELIC 141 + +#endif + + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MICROSOFT. */ + /* */ + /* The canonical source for the MS assigned LCID's (seems to) be at */ + /* */ + /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ + /* */ + /* It used to be at various places, among them */ + /* */ + /* http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt */ + /* http://www.microsoft.com/globaldev/reference/loclanghome.asp */ + /* http://support.microsoft.com/support/kb/articles/Q224/8/04.ASP */ + /* http://msdn.microsoft.com/library/en-us/passport25/ */ + /* NET_Passport_VBScript_Documentation/Single_Sign_In/ */ + /* Advanced_Single_Sign_In/Localization_and_LCIDs.asp */ + /* */ + /* Hopefully, it seems now that the Globaldev site prevails... */ + /* (updated by Antoine, 2004-02-17) */ + +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 + +#if 1 /* this looks like the correct value */ +#define TT_MS_LANGID_CHINESE_MACAU 0x1404 +#else /* but beware, Microsoft may change its mind... + the most recent Word reference has the following: */ +#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG +#endif + +#if 0 /* used only with .NET `cultures'; commented out */ +#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04 +#endif + +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 + + /* don't ask what this one means... It is commented out currently. */ +#if 0 +#define TT_MS_LANGID_GREEK_GREECE2 0x2008 +#endif + +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a +#define TT_MS_LANGID_SPANISH_MEXICO 0x080a +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a +#define TT_MS_LANGID_SPANISH_PANAMA 0x180a +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a +#define TT_MS_LANGID_SPANISH_PERU 0x280a +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a +#define TT_MS_LANGID_SPANISH_CHILE 0x340a +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a + /* The following ID blatantly violate MS specs by using a */ + /* sublanguage > 0x1F. */ +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU +#define TT_MS_LANGID_FINNISH_FINLAND 0x040b +#define TT_MS_LANGID_FRENCH_FRANCE 0x040c +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c +#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c +#define TT_MS_LANGID_FRENCH_MONACO 0x180c +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c +#define TT_MS_LANGID_FRENCH_REUNION 0x200c +#define TT_MS_LANGID_FRENCH_CONGO 0x240c + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c +#define TT_MS_LANGID_FRENCH_MALI 0x340c +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c +#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c + /* and another violation of the spec (see 0xE40aU) */ +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a + +#if 0 /* this used to be this value, but it looks like we were wrong */ +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a +#else /* current sources say */ +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a + /* and XPsp2 Platform SDK added (2004-07-26) */ + /* Names are shortened to be significant within 40 chars. */ +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a +#endif + +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d +#define TT_MS_LANGID_THAI_THAILAND 0x041e +#define TT_MS_LANGID_TURKISH_TURKEY 0x041f +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c +#define TT_MS_LANGID_BASQUE_SPAIN 0x042d +#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043a + /* Added by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b + /* ... and we also keep our old identifier... */ +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b + +#if 0 /* this seems to be a previous inversion */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#else +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#endif + +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e +#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN + +#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ORIYA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044a +#define TT_MS_LANGID_KANNADA_INDIA 0x044b +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d +#define TT_MS_LANGID_MARATHI_INDIA 0x044e +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 +#define TT_MS_LANGID_TIBETAN_CHINA 0x0451 + /* Don't use the next constant! It has */ + /* (1) the wrong spelling (Dzonghka) */ + /* (2) Microsoft doesn't officially define it -- */ + /* at least it is not in the List of Local */ + /* ID Values. */ + /* (3) Dzongkha is not the same language as */ + /* Tibetan, so merging it is wrong anyway. */ + /* */ + /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */ +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 + +#if 0 + /* the following used to be defined */ +#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 + /* ... but it was changed; */ +#else + /* So we will continue to #define it, but with the correct value */ +#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN +#endif + +#define TT_MS_LANGID_WELSH_WALES 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 + /* Missing a LCID for Sindhi in Devanagari script */ +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a +#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f + /* Missing a LCID for Tifinagh script */ +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 + /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */ + /* script is yet unclear... might be Arabic, Nagari or Sharada */ +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 + /* ... and aliased (by MS) for compatibility reasons. */ +#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b +#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c + /* Also spelled by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SEPEDI_SOUTH_AFRICA + /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */ +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 + /* also spelled in the `Passport SDK' list as: */ +#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 + /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ + /* not written (but OTOH the peculiar writing system is worth */ + /* studying). */ +#define TT_MS_LANGID_YI_CHINA 0x0478 +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 + /* language codes from 0x047a to 0x047f are (still) unknown. */ +#define TT_MS_LANGID_UIGHUR_CHINA 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 + +#if 0 /* not deemed useful for fonts */ +#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff +#endif + + + /*************************************************************************/ + /* */ + /* Possible values of the `name' identifier field in the name records of */ + /* the TTF `name' table. These values are platform independent. */ + /* */ +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_PREFERRED_FAMILY 16 +#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + /* This is new in OpenType 1.5 */ +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + + + /*************************************************************************/ + /* */ + /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ + /* */ + /* Updated 08-Nov-2008. */ + /* */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ + /* Phonetic Extensions */ + /* Phonetic Extensions Supplement */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* U+1D00-U+1D7F */ + /* U+1D80-U+1DBF */ + /* Bit 5 Spacing Modifier Letters */ + /* Modifier Tone Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* U+A700-U+A71F */ + /* Bit 6 Combining Diacritical Marks */ + /* Combining Diacritical Marks Supplement */ +#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ + /* U+1DC0-U+1DFF */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 Coptic */ +#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ + /* Bit 9 Cyrillic */ + /* Cyrillic Supplement */ + /* Cyrillic Extended-A */ + /* Cyrillic Extended-B */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* U+2DE0-U+2DFF */ + /* U+A640-U+A69F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 Vai */ +#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ + /* Bit 13 Arabic */ + /* Arabic Supplement */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* U+0750-U+077F */ + /* Bit 14 NKo */ +#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ + /* Georgian Supplement */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* U+2D00-U+2D2F */ + /* Bit 27 Balinese */ +#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ + /* Latin Extended-C */ + /* Latin Extended-D */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* U+2C60-U+2C7F */ + /* U+A720-U+A7FF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + /* Bit 31 General Punctuation */ + /* Supplemental Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* U+2E00-U+2E7F */ + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows */ + /* Supplemental Arrows-A */ + /* Supplemental Arrows-B */ + /* Miscellaneous Symbols and Arrows */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* U+2B00-U+2BFF */ + /* Bit 38 Mathematical Operators */ + /* Supplemental Mathematical Operators */ + /* Miscellaneous Mathematical Symbols-A */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Phags-Pa */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ +#define TT_UCR_PHAGSPA + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + /* Bit 56 Hangul Syllables */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + /* Bit 57 High Surrogates */ + /* High Private Use Surrogates */ + /* Low Surrogates */ + /* */ + /* According to OpenType specs v.1.3+, */ + /* setting bit 57 implies that there is */ + /* at least one codepoint beyond the */ + /* Basic Multilingual Plane that is */ + /* supported by this font. So it really */ + /* means >= U+10000 */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ +#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES + /* Bit 58 Phoenician */ +#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ + /* Bit 59 CJK Unified Ideographs */ + /* CJK Radicals Supplement */ + /* Kangxi Radicals */ + /* Ideographic Description Characters */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension B */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + /* Bit 61 CJK Strokes */ + /* CJK Compatibility Ideographs */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ + /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 Vertical forms */ + /* CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ + /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ + /* Ethiopic Supplement */ + /* Ethiopic Extended */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* U+1380-U+139F */ + /* U+2D80-U+2DDF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ + /* Khmer Symbols */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* U+19E0-U+19FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog */ + /* Hanunoo */ + /* Buhid */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols */ + /* Musical Symbols */ + /* Ancient Greek Musical Notation */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /*U+1D200-U+1D24F*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ + /* Variation Selectors Supplement */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /*U+E0100-U+E01EF*/ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + /* Bit 93 Limbu */ +#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ + /* Bit 94 Tai Le */ +#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ + /* Bit 95 New Tai Lue */ +#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + /* Bit 96 Buginese */ +#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ + /* Bit 97 Glagolitic */ +#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ + /* Bit 98 Tifinagh */ +#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ + /* Bit 99 Yijing Hexagram Symbols */ +#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ + /* Bit 100 Syloti Nagri */ +#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ + /* Bit 101 Linear B Syllabary */ + /* Linear B Ideograms */ + /* Aegean Numbers */ +#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ + /*U+10080-U+100FF*/ + /*U+10100-U+1013F*/ + /* Bit 102 Ancient Greek Numbers */ +#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ + /* Bit 103 Ugaritic */ +#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ + /* Bit 104 Old Persian */ +#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ + /* Bit 105 Shavian */ +#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ + /* Bit 106 Osmanya */ +#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ + /* Bit 107 Cypriot Syllabary */ +#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ + /* Bit 108 Kharoshthi */ +#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ + /* Bit 109 Tai Xuan Jing Symbols */ +#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ + /* Bit 110 Cuneiform */ + /* Cuneiform Numbers and Punctuation */ +#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ + /*U+12400-U+1247F*/ + /* Bit 111 Counting Rod Numerals */ +#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ + /* Bit 112 Sundanese */ +#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ + /* Bit 113 Lepcha */ +#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ + /* Bit 114 Ol Chiki */ +#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ + /* Bit 115 Saurashtra */ +#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ + /* Bit 116 Kayah Li */ +#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ + /* Bit 117 Rejang */ +#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ + /* Bit 118 Cham */ +#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ + /* Bit 119 Ancient Symbols */ +#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ + /* Bit 120 Phaistos Disc */ +#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ + /* Bit 121 Carian */ + /* Lycian */ + /* Lydian */ +#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ + /*U+10280-U+1029F*/ + /*U+10920-U+1093F*/ + /* Bit 122 Domino Tiles */ + /* Mahjong Tiles */ +#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ + /*U+1F000-U+1F02F*/ + /* Bit 123-127 Reserved for process-internal usage */ + + + /*************************************************************************/ + /* */ + /* Some compilers have a very limited length of identifiers. */ + /* */ +#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) +#define HAVE_LIMIT_ON_IDENTS +#endif + + +#ifndef HAVE_LIMIT_ON_IDENTS + + + /*************************************************************************/ + /* */ + /* Here some alias #defines in order to be clearer. */ + /* */ + /* These are not always #defined to stay within the 31~character limit */ + /* which some compilers have. */ + /* */ + /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ + /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ + /* If you get a warning with such a compiler, use the -i40 switch. */ + /* */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ + TT_UCR_ARABIC_PRESENTATIONS_A +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ + TT_UCR_ARABIC_PRESENTATIONS_B + +#define TT_UCR_COMBINING_DIACRITICAL_MARKS \ + TT_UCR_COMBINING_DIACRITICS +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + TT_UCR_COMBINING_DIACRITICS_SYMB + + +#endif /* !HAVE_LIMIT_ON_IDENTS */ + + +FT_END_HEADER + +#endif /* __TTNAMEID_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/tttables.h b/src/3rdparty/freetype/include/freetype/tttables.h new file mode 100644 index 0000000000..c12b172689 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/tttables.h @@ -0,0 +1,756 @@ +/***************************************************************************/ +/* */ +/* tttables.h */ +/* */ +/* Basic SFNT/TrueType tables definitions and interface */ +/* (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTABLES_H__ +#define __TTTABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + /* <Title> */ + /* TrueType Tables */ + /* */ + /* <Abstract> */ + /* TrueType specific table types and functions. */ + /* */ + /* <Description> */ + /* This section contains the definition of TrueType-specific tables */ + /* as well as some routines used to access and process them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Header */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType font header table. All */ + /* fields follow the TrueType specification. */ + /* */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_Long Created [2]; + FT_Long Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HoriHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType horizontal header, the `hhea' */ + /* table, as well as the corresponding horizontal metrics table, */ + /* i.e., the `hmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of all */ + /* glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoAscender' field */ + /* of the OS/2 table instead if you want */ + /* the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the distance */ + /* from the baseline to the bottom-most of */ + /* all glyph points found in the font. It */ + /* is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Width_Max :: This field is the maximum of all advance */ + /* widths found in the font. It can be */ + /* used to compute the maximum width of an */ + /* arbitrary string of text. */ + /* */ + /* min_Left_Side_Bearing :: The minimum left side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Right_Side_Bearing :: The minimum right side bearing of all */ + /* glyphs within the font. */ + /* */ + /* xMax_Extent :: The maximum horizontal extent (i.e., the */ + /* `width' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* Reserved :: 8~reserved bytes. */ + /* */ + /* metric_Data_Format :: Always~0. */ + /* */ + /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */ + /* table -- this value can be smaller than */ + /* the total number of glyphs in the font. */ + /* */ + /* long_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* `HMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_VertHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType vertical header, the `vhea' */ + /* table, as well as the corresponding vertical metrics table, i.e., */ + /* the `vmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of */ + /* all glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoAscender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the */ + /* distance from the baseline to the */ + /* bottom-most of all glyph points found */ + /* in the font. It is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Height_Max :: This field is the maximum of all */ + /* advance heights found in the font. It */ + /* can be used to compute the maximum */ + /* height of an arbitrary string of text. */ + /* */ + /* min_Top_Side_Bearing :: The minimum top side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */ + /* glyphs within the font. */ + /* */ + /* yMax_Extent :: The maximum vertical extent (i.e., the */ + /* `height' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* caret_Offset :: The cursor's offset for slanted fonts. */ + /* This value is `reserved' in vmtx */ + /* version 1.0. */ + /* */ + /* Reserved :: 8~reserved bytes. */ + /* */ + /* metric_Data_Format :: Always~0. */ + /* */ + /* number_Of_HMetrics :: Number of VMetrics entries in the */ + /* `vmtx' table -- this value can be */ + /* smaller than the total number of glyphs */ + /* in the font. */ + /* */ + /* long_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ + FT_Short yMax_Extent; /* xmax or ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they're used to connect the metrics header to the relevant */ + /* `HMTX' or `VMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_OS2 */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType OS/2 table. This is the long */ + /* table version. All fields comply to the TrueType specification. */ + /* */ + /* Note that we now support old Mac fonts which do not include an */ + /* OS/2 table. In this case, the `version' field is always set to */ + /* 0xFFFF. */ + /* */ + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_Short fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 tables: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 tables: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + } TT_OS2; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Postscript */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PostScript table. All fields */ + /* comply to the TrueType specification. This structure does not */ + /* reference the PostScript glyph names, which can be nevertheless */ + /* accessed with the `ttpost' module. */ + /* */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the file, but we don't */ + /* load them by default. See the ttpost.c file. */ + + } TT_Postscript; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_PCLT */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PCLT table. All fields */ + /* comply to the TrueType specification. */ + /* */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_MaxProfile */ + /* */ + /* <Description> */ + /* The maximum profile is a table containing many max values which */ + /* can be used to pre-allocate arrays. This ensures that no memory */ + /* allocation occurs during a glyph load. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numGlyphs :: The number of glyphs in this TrueType */ + /* font. */ + /* */ + /* maxPoints :: The maximum number of points in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositePoints'. */ + /* */ + /* maxContours :: The maximum number of contours in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositeContours'. */ + /* */ + /* maxCompositePoints :: The maximum number of points in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxPoints'. */ + /* */ + /* maxCompositeContours :: The maximum number of contours in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxContours'. */ + /* */ + /* maxZones :: The maximum number of zones used for */ + /* glyph hinting. */ + /* */ + /* maxTwilightPoints :: The maximum number of points in the */ + /* twilight zone used for glyph hinting. */ + /* */ + /* maxStorage :: The maximum number of elements in the */ + /* storage area used for glyph hinting. */ + /* */ + /* maxFunctionDefs :: The maximum number of function */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxInstructionDefs :: The maximum number of instruction */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxStackElements :: The maximum number of stack elements used */ + /* during bytecode interpretation. */ + /* */ + /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */ + /* used for glyph hinting. */ + /* */ + /* maxComponentElements :: The maximum number of simple (i.e., non- */ + /* composite) glyphs in a composite glyph. */ + /* */ + /* maxComponentDepth :: The maximum nesting depth of composite */ + /* glyphs. */ + /* */ + /* <Note> */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Sfnt_Tag */ + /* */ + /* <Description> */ + /* An enumeration used to specify the index of an SFNT table. */ + /* Used in the @FT_Get_Sfnt_Table API function. */ + /* */ + typedef enum FT_Sfnt_Tag_ + { + ft_sfnt_head = 0, + ft_sfnt_maxp = 1, + ft_sfnt_os2 = 2, + ft_sfnt_hhea = 3, + ft_sfnt_vhea = 4, + ft_sfnt_post = 5, + ft_sfnt_pclt = 6, + + sfnt_max /* internal end mark */ + + } FT_Sfnt_Tag; + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Table */ + /* */ + /* <Description> */ + /* Return a pointer to a given SFNT table within a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source. */ + /* */ + /* tag :: The index of the SFNT table. */ + /* */ + /* <Return> */ + /* A type-less pointer to the table. This will be~0 in case of */ + /* error, or if the corresponding table was not found *OR* loaded */ + /* from the file. */ + /* */ + /* <Note> */ + /* The table is owned by the face object and disappears with it. */ + /* */ + /* This function is only useful to access SFNT tables that are loaded */ + /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */ + /* a list. */ + /* */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use the value~0 if you want + * to access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag == 0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length' parameter is NULL, then try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length' is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length' set to~0, as in the following example: + * + * { + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * } + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @output: + * tag :: + * The name tag of the SFNT table. + * + * length :: + * The length of the SFNT table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * SFNT tables with length zero are treated as missing. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Language_ID */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap language ID. Definitions of */ + /* language ID values are in `freetype/ttnameid.h'. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The language ID of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, just return~0 as the default value. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Format */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap format. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The format of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, return -1. */ + /* */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* __TTTABLES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/tttags.h b/src/3rdparty/freetype/include/freetype/tttags.h new file mode 100644 index 0000000000..307ce4b637 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/tttags.h @@ -0,0 +1,107 @@ +/***************************************************************************/ +/* */ +/* tttags.h */ +/* */ +/* Tags for TrueType and OpenType tables (specification only). */ +/* */ +/* Copyright 1996-2001, 2004, 2005, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTAGS_H__ +#define __TTAGS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) +#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) +#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) + + +FT_END_HEADER + +#endif /* __TTAGS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/freetype/ttunpat.h b/src/3rdparty/freetype/include/freetype/ttunpat.h new file mode 100644 index 0000000000..a0162759b7 --- /dev/null +++ b/src/3rdparty/freetype/include/freetype/ttunpat.h @@ -0,0 +1,59 @@ +/***************************************************************************/ +/* */ +/* ttunpat.h */ +/* */ +/* Definitions for the unpatented TrueType hinting system */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* Written by Graham Asher <graham.asher@btinternet.com> */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTUNPAT_H__ +#define __TTUNPAT_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * A constant used as the tag of an @FT_Parameter structure to indicate + * that unpatented methods only should be used by the TrueType bytecode + * interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + /* */ + +FT_END_HEADER + + +#endif /* __TTUNPAT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/include/ft2build.h b/src/3rdparty/freetype/include/ft2build.h new file mode 100644 index 0000000000..923d887df6 --- /dev/null +++ b/src/3rdparty/freetype/include/ft2build.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* FreeType 2 build and setup macros. */ +/* (Generic version) */ +/* */ +/* Copyright 1996-2001, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file corresponds to the default `ft2build.h' file for */ + /* FreeType 2. It uses the `freetype' include root. */ + /* */ + /* Note that specific platforms might use a different configuration. */ + /* See builds/unix/ft2unix.h for an example. */ + /* */ + /*************************************************************************/ + + +#ifndef __FT2_BUILD_GENERIC_H__ +#define __FT2_BUILD_GENERIC_H__ + +#include <freetype/config/ftheader.h> + +#endif /* __FT2_BUILD_GENERIC_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/modules.cfg b/src/3rdparty/freetype/modules.cfg new file mode 100644 index 0000000000..4047d7f09c --- /dev/null +++ b/src/3rdparty/freetype/modules.cfg @@ -0,0 +1,250 @@ +# modules.cfg +# +# Copyright 2005, 2006, 2007, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +# +# +# In case you compile the FreeType library with GNU make or makepp, this +# file controls which components are built into the library. Otherwise, +# please read this file for information on the various modules and its +# dependencies, then follow the instructions in the file `docs/INSTALL.ANY'. +# +# To deactivate a module, simply comment out the corresponding line. To +# activate a module, remove the comment character. +# +# Note that many modules and components are further controlled with macros +# in the file `include/freetype/config/ftoption.h'. + + +#### +#### font modules -- at least one is required +#### +#### The order given here (from top to down) is the order used for testing +#### font formats in the compiled library. +#### + +# TrueType font driver. +# +# This driver needs the `sfnt' module. +FONT_MODULES += truetype + +# PostScript Type 1 font driver. +# +# This driver needs the `psaux', `pshinter', and `psnames' modules. +FONT_MODULES += type1 + +# CFF/OpenType font driver. +# +# This driver needs the `sfnt', `pshinter', and `psnames' modules. +FONT_MODULES += cff + +# Type 1 CID-keyed font driver. +# +# This driver needs the `psaux', `pshinter', and `psnames' modules. +FONT_MODULES += cid + +# PFR/TrueDoc font driver. See optional extension ftpfr.c below also. +FONT_MODULES += pfr + +# PostScript Type 42 font driver. +# +# This driver needs the `truetype' module. +FONT_MODULES += type42 + +# Windows FONT/FNT font driver. See optional extension ftwinfnt.c below +# also. +FONT_MODULES += winfonts + +# PCF font driver. +FONT_MODULES += pcf + +# BDF font driver. See optional extension ftbdf.c below also. +FONT_MODULES += bdf + +# SFNT files support. If used without `truetype' or `cff', it supports +# bitmap-only fonts within an SFNT wrapper. +# +# This driver needs the `psnames' module. +FONT_MODULES += sfnt + + +#### +#### hinting modules +#### + +# FreeType's auto hinter. +HINTING_MODULES += autofit + +# PostScript hinter. +HINTING_MODULES += pshinter + +# The TrueType hinting engine doesn't have a module of its own but is +# controlled in file include/freetype/config/ftoption.h +# (TT_CONFIG_OPTION_BYTECODE_INTERPRETER and friends). + + +#### +#### raster modules -- at least one is required for vector font formats +#### + +# Monochrome rasterizer. +RASTER_MODULES += raster + +# Anti-aliasing rasterizer. +RASTER_MODULES += smooth + + +#### +#### auxiliary modules +#### + +# FreeType's cache sub-system (quite stable but still in beta -- this means +# that its public API is subject to change if necessary). See +# include/freetype/ftcache.h. Needs ftglyph.c. +AUX_MODULES += cache + +# TrueType GX/AAT table validation. Needs ftgxval.c below. +# AUX_MODULES += gxvalid + +# Support for streams compressed with gzip (files with suffix .gz). +# +# See include/freetype/ftgzip.h for the API. +AUX_MODULES += gzip + +# Support for streams compressed with LZW (files with suffix .Z). +# +# See include/freetype/ftlzw.h for the API. +AUX_MODULES += lzw + +# OpenType table validation. Needs ftotval.c below. +# +# AUX_MODULES += otvalid + +# Auxiliary PostScript driver component to share common code. +# +# This module depends on `psnames'. +AUX_MODULES += psaux + +# Support for PostScript glyph names. +# +# This module can be controlled in ftconfig.h +# (FT_CONFIG_OPTION_POSTSCRIPT_NAMES). +AUX_MODULES += psnames + + +#### +#### base module extensions +#### + +# Exact bounding box calculation. +# +# See include/freetype/ftbbox.h for the API. +BASE_EXTENSIONS += ftbbox.c + +# Access BDF-specific strings. Needs BDF font driver. +# +# See include/freetype/ftbdf.h for the API. +BASE_EXTENSIONS += ftbdf.c + +# Utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp bitmaps into +# 8bpp format, and for emboldening of bitmap glyphs. +# +# See include/freetype/ftbitmap.h for the API. +BASE_EXTENSIONS += ftbitmap.c + +# Access CID font information. +# +# See include/freetype/ftcid.h for the API. +BASE_EXTENSIONS += ftcid.c + +# Access FSType information. Needs fttype1.c. +# +# See include/freetype/freetype.h for the API. +BASE_EXTENSIONS += ftfstype.c + +# Support for GASP table queries. +# +# See include/freetype/ftgasp.h for the API. +BASE_EXTENSIONS += ftgasp.c + +# Convenience functions to handle glyphs. Needs ftbitmap.c. +# +# See include/freetype/ftglyph.h for the API. +BASE_EXTENSIONS += ftglyph.c + +# Interface for gxvalid module. +# +# See include/freetype/ftgxval.h for the API. +BASE_EXTENSIONS += ftgxval.c + +# Support for LCD color filtering of subpixel bitmaps. +# +# See include/freetype/ftlcdfil.h for the API. +BASE_EXTENSIONS += ftlcdfil.c + +# Multiple Master font interface. +# +# See include/freetype/ftmm.h for the API. +BASE_EXTENSIONS += ftmm.c + +# Interface for otvalid module. +# +# See include/freetype/ftotval.h for the API. +BASE_EXTENSIONS += ftotval.c + +# Support for FT_Face_CheckTrueTypePatents. +# +# See include/freetype/freetype.h for the API. +BASE_EXTENSIONS += ftpatent.c + +# Interface for accessing PFR-specific data. Needs PFR font driver. +# +# See include/freetype/ftpfr.h for the API. +BASE_EXTENSIONS += ftpfr.c + +# Path stroker. Needs ftglyph.c. +# +# See include/freetype/ftstroke.h for the API. +BASE_EXTENSIONS += ftstroke.c + +# Support for synthetic embolding and slanting of fonts. Needs ftbitmap.c. +# +# See include/freetype/ftsynth.h for the API. +BASE_EXTENSIONS += ftsynth.c + +# Interface to access data specific to PostScript Type 1 and Type 2 (CFF) +# fonts. +# +# See include/freetype/t1tables.h for the API. +BASE_EXTENSIONS += fttype1.c + +# Interface for accessing data specific to Windows FNT files. Needs winfnt +# driver. +# +# See include/freetype/ftwinfnt.h for the API. +BASE_EXTENSIONS += ftwinfnt.c + +# Support functions for X11. +# +# See include/freetype/ftxf86.h for the API. +BASE_EXTENSIONS += ftxf86.c + +#### +#### The components `ftsystem.c' (for memory allocation and stream I/O +#### management) and `ftdebug.c' (for emitting debug messages to the user) +#### are controlled with the following variables. +#### +#### ftsystem.c: $(FTSYS_SRC) +#### ftdebug.c: $(FTDEBUG_SRC) +#### +#### Please refer to docs/CUSTOMIZE for details. +#### + + +# EOF diff --git a/src/3rdparty/freetype/objs/README b/src/3rdparty/freetype/objs/README new file mode 100644 index 0000000000..befb63e049 --- /dev/null +++ b/src/3rdparty/freetype/objs/README @@ -0,0 +1,2 @@ +This directory contains all the object files created when building the +library. diff --git a/src/3rdparty/freetype/src/Jamfile b/src/3rdparty/freetype/src/Jamfile new file mode 100644 index 0000000000..76ee0f46e6 --- /dev/null +++ b/src/3rdparty/freetype/src/Jamfile @@ -0,0 +1,25 @@ +# FreeType 2 src Jamfile +# +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) ; + +# The file <freetype/internal/internal.h> is used to define macros that are +# later used in #include statements. It needs to be parsed in order to +# record these definitions. +# +HDRMACRO [ FT2_SubDir $(FT2_INCLUDE_DIR) internal internal.h ] ; + +for xx in $(FT2_COMPONENTS) +{ + SubInclude FT2_TOP $(FT2_SRC_DIR) $(xx) ; +} + +# end of src Jamfile diff --git a/src/3rdparty/freetype/src/autofit/Jamfile b/src/3rdparty/freetype/src/autofit/Jamfile new file mode 100644 index 0000000000..acee8bf2cb --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/Jamfile @@ -0,0 +1,39 @@ +# FreeType 2 src/autofit Jamfile +# +# Copyright 2003, 2004, 2005, 2006, 2007 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP src autofit ; + +{ + local _sources ; + + # define FT2_AUTOFIT2 do enable to experimental latin hinter replacement + if $(FT2_AUTOFIT2) + { + DEFINES += FT_OPTION_AUTOFIT2 ; + } + if $(FT2_MULTI) + { + _sources = afangles afglobal afhints aflatin afcjk afindic afloader afmodule afdummy afwarp ; + + if $(FT2_AUTOFIT2) + { + _sources += aflatin2 ; + } + } + else + { + _sources = autofit ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/autofit Jamfile diff --git a/src/3rdparty/freetype/src/autofit/afangles.c b/src/3rdparty/freetype/src/autofit/afangles.c new file mode 100644 index 0000000000..e2360d157d --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afangles.c @@ -0,0 +1,292 @@ +/***************************************************************************/ +/* */ +/* afangles.c */ +/* */ +/* Routines used to compute vector angles with limited accuracy */ +/* and very high speed. It also contains sorting routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" + + +#if 0 + + FT_LOCAL_DEF( FT_Int ) + af_corner_is_flat( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos ax = x_in; + FT_Pos ay = y_in; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = x_out; + if ( ax < 0 ) + ax = -ax; + ay = y_out; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = x_out + x_in; + if ( ax < 0 ) + ax = -ax; + ay = y_out + y_in; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + + FT_LOCAL_DEF( FT_Int ) + af_corner_orientation( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos delta; + + + delta = x_in * y_out - y_in * x_out; + + if ( delta == 0 ) + return 0; + else + return 1 - 2 * ( delta < 0 ); + } + +#endif + + + /* + * We are not using `af_angle_atan' anymore, but we keep the source + * code below just in case... + */ + + +#if 0 + + + /* + * The trick here is to realize that we don't need a very accurate angle + * approximation. We are going to use the result of `af_angle_atan' to + * only compare the sign of angle differences, or check whether its + * magnitude is very small. + * + * The approximation + * + * dy * PI / (|dx|+|dy|) + * + * should be enough, and much faster to compute. + */ + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + FT_Fixed ax = dx; + FT_Fixed ay = dy; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + + ax += ay; + + if ( ax == 0 ) + angle = 0; + else + { + angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay ); + if ( dx < 0 ) + { + if ( angle >= 0 ) + angle = AF_ANGLE_PI - angle; + else + angle = -AF_ANGLE_PI - angle; + } + } + + return angle; + } + + +#elif 0 + + + /* the following table has been automatically generated with */ + /* the `mather.py' Python script */ + +#define AF_ATAN_BITS 8 + + static const FT_Byte af_arctan[1L << AF_ATAN_BITS] = + { + 0, 0, 1, 1, 1, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 5, + 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, + 10, 10, 11, 11, 11, 12, 12, 12, + 13, 13, 13, 14, 14, 14, 14, 15, + 15, 15, 16, 16, 16, 17, 17, 17, + 18, 18, 18, 18, 19, 19, 19, 20, + 20, 20, 21, 21, 21, 21, 22, 22, + 22, 23, 23, 23, 24, 24, 24, 24, + 25, 25, 25, 26, 26, 26, 26, 27, + 27, 27, 28, 28, 28, 28, 29, 29, + 29, 30, 30, 30, 30, 31, 31, 31, + 31, 32, 32, 32, 33, 33, 33, 33, + 34, 34, 34, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 37, 37, 37, 38, + 38, 38, 38, 39, 39, 39, 39, 40, + 40, 40, 40, 41, 41, 41, 41, 42, + 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, + 46, 46, 46, 46, 46, 47, 47, 47, + 47, 48, 48, 48, 48, 48, 49, 49, + 49, 49, 50, 50, 50, 50, 50, 51, + 51, 51, 51, 51, 52, 52, 52, 52, + 52, 53, 53, 53, 53, 53, 54, 54, + 54, 54, 54, 55, 55, 55, 55, 55, + 56, 56, 56, 56, 56, 57, 57, 57, + 57, 57, 57, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 60, 60, + 60, 60, 60, 61, 61, 61, 61, 61, + 61, 62, 62, 62, 62, 62, 62, 63, + 63, 63, 63, 63, 63, 64, 64, 64 + }; + + + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + + + /* check trivial cases */ + if ( dy == 0 ) + { + angle = 0; + if ( dx < 0 ) + angle = AF_ANGLE_PI; + return angle; + } + else if ( dx == 0 ) + { + angle = AF_ANGLE_PI2; + if ( dy < 0 ) + angle = -AF_ANGLE_PI2; + return angle; + } + + angle = 0; + if ( dx < 0 ) + { + dx = -dx; + dy = -dy; + angle = AF_ANGLE_PI; + } + + if ( dy < 0 ) + { + FT_Pos tmp; + + + tmp = dx; + dx = -dy; + dy = tmp; + angle -= AF_ANGLE_PI2; + } + + if ( dx == 0 && dy == 0 ) + return 0; + + if ( dx == dy ) + angle += AF_ANGLE_PI4; + else if ( dx > dy ) + angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )]; + else + angle += AF_ANGLE_PI2 - + af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )]; + + if ( angle > AF_ANGLE_PI ) + angle -= AF_ANGLE_2PI; + + return angle; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ) + { + FT_UInt i, j; + FT_Pos swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j] > table[j - 1] ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + FT_LOCAL_DEF( void ) + af_sort_widths( FT_UInt count, + AF_Width table ) + { + FT_UInt i, j; + AF_WidthRec swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j].org > table[j - 1].org ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afangles.h b/src/3rdparty/freetype/src/autofit/afangles.h new file mode 100644 index 0000000000..f33f9e108e --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afangles.h @@ -0,0 +1,7 @@ +/* + * afangles.h + * + * This is a dummy file, used to please the build system. It is never + * included by the auto-fitter sources. + * + */ diff --git a/src/3rdparty/freetype/src/autofit/afcjk.c b/src/3rdparty/freetype/src/autofit/afcjk.c new file mode 100644 index 0000000000..de3ce11d54 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afcjk.c @@ -0,0 +1,1513 @@ +/***************************************************************************/ +/* */ +/* afcjk.c */ +/* */ +/* Auto-fitter hinting routines for CJK script (body). */ +/* */ +/* Copyright 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /* + * The algorithm is based on akito's autohint patch, available here: + * + * http://www.kde.gr.jp/~akito/patch/freetype2/ + * + */ + +#include "aftypes.h" +#include "aflatin.h" + + +#ifdef AF_CONFIG_OPTION_CJK + +#include "afcjk.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + /* TODO are there blues? */ + + if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + face->charmap = NULL; + + /* latin's version would suffice */ + af_latin_metrics_init_widths( metrics, face, 0x7530 ); + + FT_Set_Charmap( face, oldmap ); + + return AF_Err_Ok; + } + + + static void + af_cjk_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + AF_LatinAxis axis; + + + axis = &metrics->axis[dim]; + + if ( dim == AF_DIMENSION_HORZ ) + { + axis->scale = scaler->x_scale; + axis->delta = scaler->x_delta; + } + else + { + axis->scale = scaler->y_scale; + axis->delta = scaler->y_delta; + } + } + + + FT_LOCAL_DEF( void ) + af_cjk_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler = *scaler; + + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + af_cjk_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + FT_Error error; + AF_Segment seg; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( error ) + return error; + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Point pt = seg->first; + AF_Point last = seg->last; + AF_Flags f0 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + AF_Flags f1; + + + seg->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + seg->flags |= AF_EDGE_ROUND; + } + } + + return AF_Err_Ok; + } + + + static void + af_cjk_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Direction major_dir = axis->major_dir; + AF_Segment seg1, seg2; + FT_Pos len_threshold; + FT_Pos dist_threshold; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + + dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + dist_threshold = FT_DivFix( 64 * 3, dist_threshold ); + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are for metrics hinting only */ + if ( seg1->first == seg1->last ) + continue; + + if ( seg1->dir != major_dir ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) + { + FT_Pos dist = seg2->pos - seg1->pos; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + if ( dist * 8 < seg1->score * 9 && + ( dist * 8 < seg1->score * 7 || seg1->len < len ) ) + { + seg1->score = dist; + seg1->len = len; + seg1->link = seg2; + } + + if ( dist * 8 < seg2->score * 9 && + ( dist * 8 < seg2->score * 7 || seg2->len < len ) ) + { + seg2->score = dist; + seg2->len = len; + seg2->link = seg1; + } + } + } + } + } + + /* + * now compute the `serif' segments + * + * In Hanzi, some strokes are wider on one or both of the ends. + * We either identify the stems on the ends as serifs or remove + * the linkage, depending on the length of the stems. + * + */ + + { + AF_Segment link1, link2; + + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + link1 = seg1->link; + if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos ) + continue; + + if ( seg1->score >= dist_threshold ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + { + if ( seg2->pos > seg1->pos || seg1 == seg2 ) + continue; + + link2 = seg2->link; + if ( !link2 || link2->link != seg2 || link2->pos < link1->pos ) + continue; + + if ( seg1->pos == seg2->pos && link1->pos == link2->pos ) + continue; + + if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score ) + continue; + + /* seg2 < seg1 < link1 < link2 */ + + if ( seg1->len >= seg2->len * 3 ) + { + AF_Segment seg; + + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Segment link = seg->link; + + + if ( link == seg2 ) + { + seg->link = 0; + seg->serif = link1; + } + else if ( link == link2 ) + { + seg->link = 0; + seg->serif = seg1; + } + } + } + else + { + seg1->link = link1->link = 0; + + break; + } + } + } + } + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + seg2->num_linked++; + if ( seg2->link != seg1 ) + { + seg1->link = 0; + + if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 ) + seg1->serif = seg2->link; + else + seg2->num_linked--; + } + } + } + } + + + static FT_Error + af_cjk_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + FT_Fixed scale; + FT_Pos edge_distance_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + /*********************************************************************/ + /* */ + /* We begin by generating a sorted table of edges for the current */ + /* direction. To do so, we simply scan each segment and try to find */ + /* an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which is then processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = FT_DivFix( 64 / 4, scale ); + else + edge_distance_threshold = laxis->edge_distance_threshold; + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Pos best = 0xFFFFU; + FT_Int ee; + + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + if ( edge->dir != seg->dir ) + continue; + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && dist < best ) + { + AF_Segment link = seg->link; + + + /* check whether all linked segments of the candidate edge */ + /* can make a single edge. */ + if ( link ) + { + AF_Segment seg1 = edge->first; + AF_Segment link1; + FT_Pos dist2 = 0; + + + do + { + link1 = seg1->link; + if ( link1 ) + { + dist2 = AF_SEGMENT_DIST( link, link1 ); + if ( dist2 >= edge_distance_threshold ) + break; + } + + } while ( ( seg1 = seg1->edge_next ) != edge->first ); + + if ( dist2 >= edge_distance_threshold ) + continue; + } + + best = dist; + found = edge; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + edge->dir = seg->dir; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + /*********************************************************************/ + /* */ + /* Good, we now compute each edge's properties according to segments */ + /* found on its position. Basically, these are as follows. */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + /* */ + /* Note that removing this loop and setting the `edge' field of each */ + /* segment directly in the code above slows down execution speed for */ + /* some reasons on platforms like the Sun. */ + + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge ); + + if ( seg->link || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = AF_SEGMENT_DIST( seg, seg2 ); + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + + /* get rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + Exit: + return error; + } + + + static FT_Error + af_cjk_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_cjk_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_cjk_hints_link_segments( hints, dim ); + + error = af_cjk_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale when needed, since they may have + * been modified af_cjk_scale_dim above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#ifdef AF_USE_WARPER + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_cjk_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_cjk_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + FT_UNUSED( base_flags ); + FT_UNUSED( stem_flags ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + if ( axis->width_count > 0 ) + { + if ( FT_ABS( dist - axis->widths[0].cur ) < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 54 ) + dist += ( 54 - dist ) / 2 ; + else if ( dist < 3 * 64 ) + { + FT_Pos delta; + + + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + else if ( delta < 22 ) + dist += 10; + else if ( delta < 42 ) + dist += delta; + else if ( delta < 54 ) + dist += 54; + else + dist += delta; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + + dist = af_cjk_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + dist = ( dist + 22 ) & ~63; + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_cjk_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_cjk_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + } + + + static void + af_cjk_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + ( serif->opos - base->opos ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define AF_LIGHT_MODE_MAX_HORZ_GAP 9 +#define AF_LIGHT_MODE_MAX_VERT_GAP 15 +#define AF_LIGHT_MODE_MAX_DELTA_ABS 14 + + + static FT_Pos + af_hint_normal_stem( AF_GlyphHints hints, + AF_Edge edge, + AF_Edge edge2, + FT_Pos anchor, + AF_Dimension dim ) + { + FT_Pos org_len, cur_len, org_center; + FT_Pos cur_pos1, cur_pos2; + FT_Pos d_off1, u_off1, d_off2, u_off2, delta; + FT_Pos offset; + FT_Pos threshold = 64; + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( ( edge->flags & AF_EDGE_ROUND ) && + ( edge2->flags & AF_EDGE_ROUND ) ) + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP; + } + else + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3; + } + } + + org_len = edge2->opos - edge->opos; + cur_len = af_cjk_compute_stem_width( hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + org_center = ( edge->opos + edge2->opos ) / 2 + anchor; + cur_pos1 = org_center - cur_len / 2; + cur_pos2 = cur_pos1 + cur_len; + d_off1 = cur_pos1 - FT_PIX_FLOOR( cur_pos1 ); + d_off2 = cur_pos2 - FT_PIX_FLOOR( cur_pos2 ); + u_off1 = 64 - d_off1; + u_off2 = 64 - d_off2; + delta = 0; + + + if ( d_off1 == 0 || d_off2 == 0 ) + goto Exit; + + if ( cur_len <= threshold ) + { + if ( d_off2 < cur_len ) + { + if ( u_off1 <= d_off2 ) + delta = u_off1; + else + delta = -d_off2; + } + + goto Exit; + } + + if ( threshold < 64 ) + { + if ( d_off1 >= threshold || u_off1 >= threshold || + d_off2 >= threshold || u_off2 >= threshold ) + goto Exit; + } + + offset = cur_len % 64; + + if ( offset < 32 ) + { + if ( u_off1 <= offset || d_off2 <= offset ) + goto Exit; + } + else + offset = 64 - threshold; + + d_off1 = threshold - u_off1; + u_off1 = u_off1 - offset; + u_off2 = threshold - d_off2; + d_off2 = d_off2 - offset; + + if ( d_off1 <= u_off1 ) + u_off1 = -d_off1; + + if ( d_off2 <= u_off2 ) + u_off2 = -d_off2; + + if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) ) + delta = u_off1; + else + delta = u_off2; + + Exit: + +#if 1 + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = AF_LIGHT_MODE_MAX_DELTA_ABS; + else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = -AF_LIGHT_MODE_MAX_DELTA_ABS; + } +#endif + + cur_pos1 += delta; + + if ( edge->opos < edge2->opos ) + { + edge->pos = cur_pos1; + edge2->pos = cur_pos1 + cur_len; + } + else + { + edge->pos = cur_pos1 + cur_len; + edge2->pos = cur_pos1; + } + + return delta; + } + + + static void + af_cjk_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_Int n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Pos delta = 0; + FT_Int skipped = 0; + + + /* now we align all stem edges. */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + skipped++; + continue; + } + + /* now align the stem */ + + if ( edge2 < edge ) + { + af_cjk_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( dim != AF_DIMENSION_VERT && !anchor ) + { + +#if 0 + if ( fixedpitch ) + { + AF_Edge left = edge; + AF_Edge right = edge_limit - 1; + AF_EdgeRec left1, left2, right1, right2; + FT_Pos target, center1, center2; + FT_Pos delta1, delta2, d1, d2; + + + while ( right > left && !right->link ) + right--; + + left1 = *left; + left2 = *left->link; + right1 = *right->link; + right2 = *right; + + delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2; + target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16; + + delta1 = delta; + delta1 += af_hint_normal_stem( hints, left, left->link, + delta1, 0 ); + + if ( left->link != right ) + af_hint_normal_stem( hints, right->link, right, delta1, 0 ); + + center1 = left->pos + ( right->pos - left->pos ) / 2; + + if ( center1 >= target ) + delta2 = delta - 32; + else + delta2 = delta + 32; + + delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 ); + + if ( delta1 != delta2 ) + { + if ( left->link != right ) + af_hint_normal_stem( hints, &right1, &right2, delta2, 0 ); + + center2 = left1.pos + ( right2.pos - left1.pos ) / 2; + + d1 = center1 - target; + d2 = center2 - target; + + if ( FT_ABS( d2 ) < FT_ABS( d1 ) ) + { + left->pos = left1.pos; + left->link->pos = left2.pos; + + if ( left->link != right ) + { + right->link->pos = right1.pos; + right->pos = right2.pos; + } + + delta1 = delta2; + } + } + + delta = delta1; + right->link->flags |= AF_EDGE_DONE; + right->flags |= AF_EDGE_DONE; + } + else + +#endif /* 0 */ + + delta = af_hint_normal_stem( hints, edge, edge2, 0, + AF_DIMENSION_HORZ ); + } + else + af_hint_normal_stem( hints, edge, edge2, delta, dim ); + +#if 0 + printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n", + edge - edges, edge2 - edges, + ( edge->pos - edge->opos ) / 64.0, + ( edge2->pos - edge2->opos ) / 64.0 ); +#endif + + anchor = edge; + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( edge1->link == edge1 + 1 && + edge2->link == edge2 + 1 && + edge3->link == edge3 + 1 && span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( !skipped ) + return; + + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + if ( edge->flags & AF_EDGE_DONE ) + continue; + + if ( edge->serif ) + { + af_cjk_align_serif_edge( hints, edge->serif, edge ); + edge->flags |= AF_EDGE_DONE; + skipped--; + } + } + + if ( !skipped ) + return; + + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge before, after; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + before = after = edge; + + while ( --before >= edges ) + if ( before->flags & AF_EDGE_DONE ) + break; + + while ( ++after < edge_limit ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges || after < edge_limit ) + { + if ( before < edges ) + af_cjk_align_serif_edge( hints, after, edge ); + else if ( after >= edge_limit ) + af_cjk_align_serif_edge( hints, before, edge ); + else + { + if ( after->fpos == before->fpos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->fpos - before->fpos, + after->pos - before->pos, + after->fpos - before->fpos ); + } + } + } + } + + + static void + af_cjk_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + FT_Bool snapping; + + + snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ && + AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) || + ( dim == AF_DIMENSION_VERT && + AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ); + + for ( edge = edges; edge < edge_limit; edge++ ) + { + /* move the points of each segment */ + /* in each edge to the edge's position */ + AF_Segment seg = edge->first; + + + if ( snapping ) + { + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + else + { + FT_Pos delta = edge->pos - edge->opos; + + + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x += delta; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y += delta; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + FT_UNUSED( metrics ); + + + error = af_glyph_hints_reload( hints, outline, 0 ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + +#ifdef AF_USE_WARPER + if ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif /* AF_USE_WARPER */ + + af_cjk_hint_edges( hints, (AF_Dimension)dim ); + af_cjk_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + +#if 0 + af_glyph_hints_dump_points( hints ); + af_glyph_hints_dump_segments( hints ); + af_glyph_hints_dump_edges( hints ); +#endif + + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_cjk_uniranges[] = + { +#if 0 + { 0x0100UL, 0xFFFFUL }, /* why this? */ +#endif + { 0x2E80UL, 0x2EFFUL }, /* CJK Radicals Supplement */ + { 0x2F00UL, 0x2FDFUL }, /* Kangxi Radicals */ + { 0x3000UL, 0x303FUL }, /* CJK Symbols and Punctuation */ + { 0x3040UL, 0x309FUL }, /* Hiragana */ + { 0x30A0UL, 0x30FFUL }, /* Katakana */ + { 0x3100UL, 0x312FUL }, /* Bopomofo */ + { 0x3130UL, 0x318FUL }, /* Hangul Compatibility Jamo */ + { 0x31A0UL, 0x31BFUL }, /* Bopomofo Extended */ + { 0x31C0UL, 0x31EFUL }, /* CJK Strokes */ + { 0x31F0UL, 0x31FFUL }, /* Katakana Phonetic Extensions */ + { 0x3200UL, 0x32FFUL }, /* Enclosed CJK Letters and Months */ + { 0x3300UL, 0x33FFUL }, /* CJK Compatibility */ + { 0x3400UL, 0x4DBFUL }, /* CJK Unified Ideographs Extension A */ + { 0x4DC0UL, 0x4DFFUL }, /* Yijing Hexagram Symbols */ + { 0x4E00UL, 0x9FFFUL }, /* CJK Unified Ideographs */ + { 0xF900UL, 0xFAFFUL }, /* CJK Compatibility Ideographs */ + { 0xFE30UL, 0xFE4FUL }, /* CJK Compatibility Forms */ + { 0xFF00UL, 0xFFEFUL }, /* Halfwidth and Fullwidth Forms */ + { 0x20000UL, 0x2A6DFUL }, /* CJK Unified Ideographs Extension B */ + { 0x2F800UL, 0x2FA1FUL }, /* CJK Compatibility Ideographs Supplement */ + { 0UL, 0UL } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_cjk_script_class = + { + AF_SCRIPT_CJK, + af_cjk_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_cjk_metrics_init, + (AF_Script_ScaleMetricsFunc)af_cjk_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_cjk_hints_init, + (AF_Script_ApplyHintsFunc) af_cjk_hints_apply + }; + +#else /* !AF_CONFIG_OPTION_CJK */ + + static const AF_Script_UniRangeRec af_cjk_uniranges[] = + { + { 0, 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_cjk_script_class = + { + AF_SCRIPT_CJK, + af_cjk_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) NULL, + (AF_Script_ApplyHintsFunc) NULL + }; + +#endif /* !AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afcjk.h b/src/3rdparty/freetype/src/autofit/afcjk.h new file mode 100644 index 0000000000..9f77fda143 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afcjk.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* afcjk.h */ +/* */ +/* Auto-fitter hinting routines for CJK script (specification). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFCJK_H__ +#define __AFCJK_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the CJK-specific script class */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_cjk_script_class; + + + FT_LOCAL( FT_Error ) + af_cjk_metrics_init( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_cjk_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ); + +/* */ + +FT_END_HEADER + +#endif /* __AFCJK_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afdummy.c b/src/3rdparty/freetype/src/autofit/afdummy.c new file mode 100644 index 0000000000..ed96e96410 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afdummy.c @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* afdummy.c */ +/* */ +/* Auto-fitter dummy routines to be used if no hinting should be */ +/* performed (body). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afdummy.h" +#include "afhints.h" + + + static FT_Error + af_dummy_hints_init( AF_GlyphHints hints, + AF_ScriptMetrics metrics ) + { + af_glyph_hints_rescale( hints, + metrics ); + return 0; + } + + + static FT_Error + af_dummy_hints_apply( AF_GlyphHints hints, + FT_Outline* outline ) + { + FT_UNUSED( hints ); + FT_UNUSED( outline ); + + return 0; + } + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_dummy_script_class = + { + AF_SCRIPT_NONE, + NULL, + + sizeof( AF_ScriptMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_dummy_hints_init, + (AF_Script_ApplyHintsFunc) af_dummy_hints_apply + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afdummy.h b/src/3rdparty/freetype/src/autofit/afdummy.h new file mode 100644 index 0000000000..2a5faf8f85 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afdummy.h @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* afdummy.h */ +/* */ +/* Auto-fitter dummy routines to be used if no hinting should be */ +/* performed (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFDUMMY_H__ +#define __AFDUMMY_H__ + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + /* A dummy script metrics class used when no hinting should + * be performed. This is the default for non-latin glyphs! + */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_dummy_script_class; + +/* */ + +FT_END_HEADER + + +#endif /* __AFDUMMY_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/aferrors.h b/src/3rdparty/freetype/src/autofit/aferrors.h new file mode 100644 index 0000000000..c2ed5fe2ab --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/aferrors.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* aferrors.h */ +/* */ +/* Autofitter error codes (specification only). */ +/* */ +/* Copyright 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Autofitter error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __AFERRORS_H__ +#define __AFERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX AF_Err_ +#define FT_ERR_BASE FT_Mod_Err_Autofit + +#include FT_ERRORS_H + +#endif /* __AFERRORS_H__ */ + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afglobal.c b/src/3rdparty/freetype/src/autofit/afglobal.c new file mode 100644 index 0000000000..bfb9091bfd --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afglobal.c @@ -0,0 +1,289 @@ +/***************************************************************************/ +/* */ +/* afglobal.c */ +/* */ +/* Auto-fitter routines to compute global hinting values (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afglobal.h" +#include "afdummy.h" +#include "aflatin.h" +#include "afcjk.h" +#include "afindic.h" + +#include "aferrors.h" + +#ifdef FT_OPTION_AUTOFIT2 +#include "aflatin2.h" +#endif + + /* populate this list when you add new scripts */ + static AF_ScriptClass const af_script_classes[] = + { + &af_dummy_script_class, +#ifdef FT_OPTION_AUTOFIT2 + &af_latin2_script_class, +#endif + &af_latin_script_class, + &af_cjk_script_class, + &af_indic_script_class, + NULL /* do not remove */ + }; + + /* index of default script in `af_script_classes' */ +#define AF_SCRIPT_LIST_DEFAULT 2 + /* indicates an uncovered glyph */ +#define AF_SCRIPT_LIST_NONE 255 + + + /* + * Note that glyph_scripts[] is used to map each glyph into + * an index into the `af_script_classes' array. + * + */ + typedef struct AF_FaceGlobalsRec_ + { + FT_Face face; + FT_UInt glyph_count; /* same as face->num_glyphs */ + FT_Byte* glyph_scripts; + + AF_ScriptMetrics metrics[AF_SCRIPT_MAX]; + + } AF_FaceGlobalsRec; + + + /* Compute the script index of each glyph within a given face. */ + + static FT_Error + af_face_globals_compute_script_coverage( AF_FaceGlobals globals ) + { + FT_Error error = AF_Err_Ok; + FT_Face face = globals->face; + FT_CharMap old_charmap = face->charmap; + FT_Byte* gscripts = globals->glyph_scripts; + FT_UInt ss; + + + /* the value 255 means `uncovered glyph' */ + FT_MEM_SET( globals->glyph_scripts, + AF_SCRIPT_LIST_NONE, + globals->glyph_count ); + + error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); + if ( error ) + { + /* + * Ignore this error; we simply use the default script. + * XXX: Shouldn't we rather disable hinting? + */ + error = AF_Err_Ok; + goto Exit; + } + + /* scan each script in a Unicode charmap */ + for ( ss = 0; af_script_classes[ss]; ss++ ) + { + AF_ScriptClass clazz = af_script_classes[ss]; + AF_Script_UniRange range; + + + if ( clazz->script_uni_ranges == NULL ) + continue; + + /* + * Scan all unicode points in the range and set the corresponding + * glyph script index. + */ + for ( range = clazz->script_uni_ranges; range->first != 0; range++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < globals->glyph_count && + gscripts[gindex] == AF_SCRIPT_LIST_NONE ) + { + gscripts[gindex] = (FT_Byte)ss; + } + + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < globals->glyph_count && + gscripts[gindex] == AF_SCRIPT_LIST_NONE ) + { + gscripts[gindex] = (FT_Byte)ss; + } + } + } + } + + Exit: + /* + * By default, all uncovered glyphs are set to the latin script. + * XXX: Shouldn't we disable hinting or do something similar? + */ + { + FT_UInt nn; + + + for ( nn = 0; nn < globals->glyph_count; nn++ ) + { + if ( gscripts[nn] == AF_SCRIPT_LIST_NONE ) + gscripts[nn] = AF_SCRIPT_LIST_DEFAULT; + } + } + + FT_Set_Charmap( face, old_charmap ); + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ) + { + FT_Error error; + FT_Memory memory; + AF_FaceGlobals globals; + + + memory = face->memory; + + if ( !FT_ALLOC( globals, sizeof ( *globals ) + + face->num_glyphs * sizeof ( FT_Byte ) ) ) + { + globals->face = face; + globals->glyph_count = face->num_glyphs; + globals->glyph_scripts = (FT_Byte*)( globals + 1 ); + + error = af_face_globals_compute_script_coverage( globals ); + if ( error ) + { + af_face_globals_free( globals ); + globals = NULL; + } + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + af_face_globals_free( AF_FaceGlobals globals ) + { + if ( globals ) + { + FT_Memory memory = globals->face->memory; + FT_UInt nn; + + + for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ ) + { + if ( globals->metrics[nn] ) + { + AF_ScriptClass clazz = af_script_classes[nn]; + + + FT_ASSERT( globals->metrics[nn]->clazz == clazz ); + + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( globals->metrics[nn] ); + + FT_FREE( globals->metrics[nn] ); + } + } + + globals->glyph_count = 0; + globals->glyph_scripts = NULL; /* no need to free this one! */ + globals->face = NULL; + + FT_FREE( globals ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_ScriptMetrics *ametrics ) + { + AF_ScriptMetrics metrics = NULL; + FT_UInt gidx; + AF_ScriptClass clazz; + FT_UInt script = options & 15; + const FT_UInt script_max = sizeof ( af_script_classes ) / + sizeof ( af_script_classes[0] ); + FT_Error error = AF_Err_Ok; + + + if ( gindex >= globals->glyph_count ) + { + error = AF_Err_Invalid_Argument; + goto Exit; + } + + gidx = script; + if ( gidx == 0 || gidx + 1 >= script_max ) + gidx = globals->glyph_scripts[gindex]; + + clazz = af_script_classes[gidx]; + if ( script == 0 ) + script = clazz->script; + + metrics = globals->metrics[clazz->script]; + if ( metrics == NULL ) + { + /* create the global metrics object when needed */ + FT_Memory memory = globals->face->memory; + + + if ( FT_ALLOC( metrics, clazz->script_metrics_size ) ) + goto Exit; + + metrics->clazz = clazz; + + if ( clazz->script_metrics_init ) + { + error = clazz->script_metrics_init( metrics, globals->face ); + if ( error ) + { + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( metrics ); + + FT_FREE( metrics ); + goto Exit; + } + } + + globals->metrics[clazz->script] = metrics; + } + + Exit: + *ametrics = metrics; + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afglobal.h b/src/3rdparty/freetype/src/autofit/afglobal.h new file mode 100644 index 0000000000..cf52c08756 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afglobal.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* afglobal.h */ +/* */ +/* Auto-fitter routines to compute global hinting values */ +/* (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AF_GLOBAL_H__ +#define __AF_GLOBAL_H__ + + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + + /************************************************************************/ + /************************************************************************/ + /***** *****/ + /***** F A C E G L O B A L S *****/ + /***** *****/ + /************************************************************************/ + /************************************************************************/ + + + /* + * model the global hints data for a given face, decomposed into + * script-specific items + */ + typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; + + + FT_LOCAL( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ); + + FT_LOCAL( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_ScriptMetrics *ametrics ); + + FT_LOCAL( void ) + af_face_globals_free( AF_FaceGlobals globals ); + + /* */ + + +FT_END_HEADER + +#endif /* __AF_GLOBALS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afhints.c b/src/3rdparty/freetype/src/autofit/afhints.c new file mode 100644 index 0000000000..8ab1761488 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afhints.c @@ -0,0 +1,1264 @@ +/***************************************************************************/ +/* */ +/* afhints.c */ +/* */ +/* Auto-fitter hinting routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afhints.h" +#include "aferrors.h" +#include FT_INTERNAL_CALC_H + + + FT_LOCAL_DEF( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ) + { + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + + + if ( axis->num_segments >= axis->max_segments ) + { + FT_Int old_max = axis->max_segments; + FT_Int new_max = old_max; + FT_Int big_max = FT_INT_MAX / sizeof ( *segment ); + + + if ( old_max >= big_max ) + { + error = AF_Err_Out_Of_Memory; + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) ) + goto Exit; + + axis->max_segments = new_max; + } + + segment = axis->segments + axis->num_segments++; + + Exit: + *asegment = segment; + return error; + } + + + FT_LOCAL( FT_Error ) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Memory memory, + AF_Edge *aedge ) + { + FT_Error error = AF_Err_Ok; + AF_Edge edge = NULL; + AF_Edge edges; + + + if ( axis->num_edges >= axis->max_edges ) + { + FT_Int old_max = axis->max_edges; + FT_Int new_max = old_max; + FT_Int big_max = FT_INT_MAX / sizeof ( *edge ); + + + if ( old_max >= big_max ) + { + error = AF_Err_Out_Of_Memory; + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) ) + goto Exit; + + axis->max_edges = new_max; + } + + edges = axis->edges; + edge = edges + axis->num_edges; + + while ( edge > edges ) + { + if ( edge[-1].fpos < fpos ) + break; + + /* we want the edge with same position and minor direction */ + /* to appear before those in the major one in the list */ + if ( edge[-1].fpos == fpos && dir == axis->major_dir ) + break; + + edge[0] = edge[-1]; + edge--; + } + + axis->num_edges++; + + FT_ZERO( edge ); + edge->fpos = (FT_Short)fpos; + edge->dir = (FT_Char)dir; + + Exit: + *aedge = edge; + return error; + } + + +#ifdef AF_DEBUG + +#include FT_CONFIG_STANDARD_LIBRARY_H + + static const char* + af_dir_str( AF_Direction dir ) + { + const char* result; + + + switch ( dir ) + { + case AF_DIR_UP: + result = "up"; + break; + case AF_DIR_DOWN: + result = "down"; + break; + case AF_DIR_LEFT: + result = "left"; + break; + case AF_DIR_RIGHT: + result = "right"; + break; + default: + result = "none"; + } + + return result; + } + + +#define AF_INDEX_NUM( ptr, base ) ( (ptr) ? ( (ptr) - (base) ) : -1 ) + + + void + af_glyph_hints_dump_points( AF_GlyphHints hints ) + { + AF_Point points = hints->points; + AF_Point limit = points + hints->num_points; + AF_Point point; + + + printf( "Table of points:\n" ); + printf( " [ index | xorg | yorg | xscale | yscale " + "| xfit | yfit | flags ]\n" ); + + for ( point = points; point < limit; point++ ) + { + printf( " [ %5d | %5d | %5d | %-5.2f | %-5.2f " + "| %-5.2f | %-5.2f | %c%c%c%c%c%c ]\n", + point - points, + point->fx, + point->fy, + point->ox/64.0, + point->oy/64.0, + point->x/64.0, + point->y/64.0, + ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ', + ( point->flags & AF_FLAG_INFLECTION ) ? 'i' : ' ', + ( point->flags & AF_FLAG_EXTREMA_X ) ? '<' : ' ', + ( point->flags & AF_FLAG_EXTREMA_Y ) ? 'v' : ' ', + ( point->flags & AF_FLAG_ROUND_X ) ? '(' : ' ', + ( point->flags & AF_FLAG_ROUND_Y ) ? 'u' : ' '); + } + printf( "\n" ); + } + + + static const char* + af_edge_flags_to_string( AF_Edge_Flags flags ) + { + static char temp[32]; + int pos = 0; + + + if ( flags & AF_EDGE_ROUND ) + { + ft_memcpy( temp + pos, "round", 5 ); + pos += 5; + } + if ( flags & AF_EDGE_SERIF ) + { + if ( pos > 0 ) + temp[pos++] = ' '; + ft_memcpy( temp + pos, "serif", 5 ); + pos += 5; + } + if ( pos == 0 ) + return "normal"; + + temp[pos] = 0; + + return temp; + } + + + /* A function to dump the array of linked segments. */ + void + af_glyph_hints_dump_segments( AF_GlyphHints hints ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment seg; + + + printf ( "Table of %s segments:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link | serif |" + " height | extra | flags ]\n" ); + + for ( seg = segments; seg < limit; seg++ ) + { + printf ( " [ %5d | %5.2g | %5s | %4d | %5d | %5d | %5d | %s ]\n", + seg - segments, + dimension == AF_DIMENSION_HORZ ? (int)seg->first->ox / 64.0 + : (int)seg->first->oy / 64.0, + af_dir_str( (AF_Direction)seg->dir ), + AF_INDEX_NUM( seg->link, segments ), + AF_INDEX_NUM( seg->serif, segments ), + seg->height, + seg->height - ( seg->max_coord - seg->min_coord ), + af_edge_flags_to_string( seg->flags ) ); + } + printf( "\n" ); + } + } + + + void + af_glyph_hints_dump_edges( AF_GlyphHints hints ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Edge edges = axis->edges; + AF_Edge limit = edges + axis->num_edges; + AF_Edge edge; + + + /* + * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges + * since they have constant a X coordinate. + */ + printf ( "Table of %s edges:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link |" + " serif | blue | opos | pos | flags ]\n" ); + + for ( edge = edges; edge < limit; edge++ ) + { + printf ( " [ %5d | %5.2g | %5s | %4d |" + " %5d | %c | %5.2f | %5.2f | %s ]\n", + edge - edges, + (int)edge->opos / 64.0, + af_dir_str( (AF_Direction)edge->dir ), + AF_INDEX_NUM( edge->link, edges ), + AF_INDEX_NUM( edge->serif, edges ), + edge->blue_edge ? 'y' : 'n', + edge->opos / 64.0, + edge->pos / 64.0, + af_edge_flags_to_string( edge->flags ) ); + } + printf( "\n" ); + } + } + +#else /* !AF_DEBUG */ + + /* these empty stubs are only used to link the `ftgrid' test program */ + /* when debugging is disabled */ + + void + af_glyph_hints_dump_points( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + + + void + af_glyph_hints_dump_segments( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + + + void + af_glyph_hints_dump_edges( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + +#endif /* !AF_DEBUG */ + + + /* compute the direction value of a given vector */ + FT_LOCAL_DEF( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ll, ss; /* long and short arm lengths */ + AF_Direction dir; /* candidate direction */ + + + if ( dy >= dx ) + { + if ( dy >= -dx ) + { + dir = AF_DIR_UP; + ll = dy; + ss = dx; + } + else + { + dir = AF_DIR_LEFT; + ll = -dx; + ss = dy; + } + } + else /* dy < dx */ + { + if ( dy >= -dx ) + { + dir = AF_DIR_RIGHT; + ll = dx; + ss = dy; + } + else + { + dir = AF_DIR_DOWN; + ll = dy; + ss = dx; + } + } + + ss *= 14; + if ( FT_ABS( ll ) <= FT_ABS( ss ) ) + dir = AF_DIR_NONE; + + return dir; + } + + + /* compute all inflex points in a given glyph */ + + static void + af_glyph_hints_compute_inflections( AF_GlyphHints hints ) + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point first = point; + AF_Point start = point; + AF_Point end = point; + AF_Point before; + AF_Point after; + FT_Pos in_x, in_y, out_x, out_y; + AF_Angle orient_prev, orient_cur; + FT_Int finished = 0; + + + /* compute first segment in contour */ + first = point; + + start = end = first; + do + { + end = end->next; + if ( end == first ) + goto Skip; + + in_x = end->fx - start->fx; + in_y = end->fy - start->fy; + + } while ( in_x == 0 && in_y == 0 ); + + /* extend the segment start whenever possible */ + before = start; + do + { + do + { + start = before; + before = before->prev; + if ( before == first ) + goto Skip; + + out_x = start->fx - before->fx; + out_y = start->fy - before->fy; + + } while ( out_x == 0 && out_y == 0 ); + + orient_prev = ft_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_prev == 0 ); + + first = start; + + in_x = out_x; + in_y = out_y; + + /* now process all segments in the contour */ + do + { + /* first, extend current segment's end whenever possible */ + after = end; + do + { + do + { + end = after; + after = after->next; + if ( after == first ) + finished = 1; + + out_x = after->fx - end->fx; + out_y = after->fy - end->fy; + + } while ( out_x == 0 && out_y == 0 ); + + orient_cur = ft_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_cur == 0 ); + + if ( ( orient_prev + orient_cur ) == 0 ) + { + /* we have an inflection point here */ + do + { + start->flags |= AF_FLAG_INFLECTION; + start = start->next; + + } while ( start != end ); + + start->flags |= AF_FLAG_INFLECTION; + } + + start = end; + end = after; + + orient_prev = orient_cur; + in_x = out_x; + in_y = out_y; + + } while ( !finished ); + + Skip: + ; + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ) + { + FT_ZERO( hints ); + hints->memory = memory; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_done( AF_GlyphHints hints ) + { + if ( hints && hints->memory ) + { + FT_Memory memory = hints->memory; + int dim; + + + /* + * note that we don't need to free the segment and edge + * buffers, since they are really within the hints->points array + */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_AxisHints axis = &hints->axis[dim]; + + + axis->num_segments = 0; + axis->max_segments = 0; + FT_FREE( axis->segments ); + + axis->num_edges = 0; + axis->max_edges = 0; + FT_FREE( axis->edges ); + } + + FT_FREE( hints->contours ); + hints->max_contours = 0; + hints->num_contours = 0; + + FT_FREE( hints->points ); + hints->num_points = 0; + hints->max_points = 0; + + hints->memory = NULL; + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_ScriptMetrics metrics ) + { + hints->metrics = metrics; + hints->scaler_flags = metrics->scaler.flags; + } + + + FT_LOCAL_DEF( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline, + FT_Bool get_inflections ) + { + FT_Error error = AF_Err_Ok; + AF_Point points; + FT_UInt old_max, new_max; + FT_Fixed x_scale = hints->x_scale; + FT_Fixed y_scale = hints->y_scale; + FT_Pos x_delta = hints->x_delta; + FT_Pos y_delta = hints->y_delta; + FT_Memory memory = hints->memory; + + + hints->num_points = 0; + hints->num_contours = 0; + + hints->axis[0].num_segments = 0; + hints->axis[0].num_edges = 0; + hints->axis[1].num_segments = 0; + hints->axis[1].num_edges = 0; + + /* first of all, reallocate the contours array when necessary */ + new_max = (FT_UInt)outline->n_contours; + old_max = hints->max_contours; + if ( new_max > old_max ) + { + new_max = ( new_max + 3 ) & ~3; + + if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) + goto Exit; + + hints->max_contours = new_max; + } + + /* + * then reallocate the points arrays if necessary -- + * note that we reserve two additional point positions, used to + * hint metrics appropriately + */ + new_max = (FT_UInt)( outline->n_points + 2 ); + old_max = hints->max_points; + if ( new_max > old_max ) + { + new_max = ( new_max + 2 + 7 ) & ~7; + + if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) ) + goto Exit; + + hints->max_points = new_max; + } + + hints->num_points = outline->n_points; + hints->num_contours = outline->n_contours; + + /* We can't rely on the value of `FT_Outline.flags' to know the fill */ + /* direction used for a glyph, given that some fonts are broken (e.g., */ + /* the Arphic ones). We thus recompute it each time we need to. */ + /* */ + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT; + + if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) + { + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT; + } + + hints->x_scale = x_scale; + hints->y_scale = y_scale; + hints->x_delta = x_delta; + hints->y_delta = y_delta; + + hints->xmin_delta = 0; + hints->xmax_delta = 0; + + points = hints->points; + if ( hints->num_points == 0 ) + goto Exit; + + { + AF_Point point; + AF_Point point_limit = points + hints->num_points; + + + /* compute coordinates & Bezier flags, next and prev */ + { + FT_Vector* vec = outline->points; + char* tag = outline->tags; + AF_Point first = points; + AF_Point end = points + outline->contours[0]; + AF_Point prev = end; + FT_Int contour_index = 0; + + + for ( point = points; point < point_limit; point++, vec++, tag++ ) + { + point->fx = (FT_Short)vec->x; + point->fy = (FT_Short)vec->y; + point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; + point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; + + switch ( FT_CURVE_TAG( *tag ) ) + { + case FT_CURVE_TAG_CONIC: + point->flags = AF_FLAG_CONIC; + break; + case FT_CURVE_TAG_CUBIC: + point->flags = AF_FLAG_CUBIC; + break; + default: + point->flags = 0; + } + + point->prev = prev; + prev->next = point; + prev = point; + + if ( point == end ) + { + if ( ++contour_index < outline->n_contours ) + { + first = point + 1; + end = points + outline->contours[contour_index]; + prev = end; + } + } + } + } + + /* set-up the contours array */ + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + short* end = outline->contours; + short idx = 0; + + + for ( ; contour < contour_limit; contour++, end++ ) + { + contour[0] = points + idx; + idx = (short)( end[0] + 1 ); + } + } + + /* compute directions of in & out vectors */ + { + AF_Point first = points; + AF_Point prev = NULL; + FT_Pos in_x = 0; + FT_Pos in_y = 0; + AF_Direction in_dir = AF_DIR_NONE; + + + for ( point = points; point < point_limit; point++ ) + { + AF_Point next; + FT_Pos out_x, out_y; + + + if ( point == first ) + { + prev = first->prev; + in_x = first->fx - prev->fx; + in_y = first->fy - prev->fy; + in_dir = af_direction_compute( in_x, in_y ); + first = prev + 1; + } + + point->in_dir = (FT_Char)in_dir; + + next = point->next; + out_x = next->fx - point->fx; + out_y = next->fy - point->fy; + + in_dir = af_direction_compute( out_x, out_y ); + point->out_dir = (FT_Char)in_dir; + + if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) ) + { + Is_Weak_Point: + point->flags |= AF_FLAG_WEAK_INTERPOLATION; + } + else if ( point->out_dir == point->in_dir ) + { + if ( point->out_dir != AF_DIR_NONE ) + goto Is_Weak_Point; + + if ( ft_corner_is_flat( in_x, in_y, out_x, out_y ) ) + goto Is_Weak_Point; + } + else if ( point->in_dir == -point->out_dir ) + goto Is_Weak_Point; + + in_x = out_x; + in_y = out_y; + prev = point; + } + } + } + + /* compute inflection points -- */ + /* disabled due to no longer perceived benefits */ + if ( 0 && get_inflections ) + af_glyph_hints_compute_inflections( hints ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + FT_Vector* vec = outline->points; + char* tag = outline->tags; + + + for ( ; point < limit; point++, vec++, tag++ ) + { + vec->x = point->x; + vec->y = point->y; + + if ( point->flags & AF_FLAG_CONIC ) + tag[0] = FT_CURVE_TAG_CONIC; + else if ( point->flags & AF_FLAG_CUBIC ) + tag[0] = FT_CURVE_TAG_CUBIC; + else + tag[0] = FT_CURVE_TAG_ON; + } + } + + + /**************************************************************** + * + * EDGE POINT GRID-FITTING + * + ****************************************************************/ + + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( edge == NULL ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + + if ( point == last ) + break; + + point = point->next; + + } + } + } + else + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( edge == NULL ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + + if ( point == last ) + break; + + point = point->next; + } + } + } + } + + + /**************************************************************** + * + * STRONG POINT INTERPOLATION + * + ****************************************************************/ + + + /* hint the strong points -- this is equivalent to the TrueType `IP' */ + /* hinting instruction */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Flags touch_flag; + + + if ( dim == AF_DIMENSION_HORZ ) + touch_flag = AF_FLAG_TOUCH_X; + else + touch_flag = AF_FLAG_TOUCH_Y; + + if ( edges < edge_limit ) + { + AF_Point point; + AF_Edge edge; + + + for ( point = points; point < point_limit; point++ ) + { + FT_Pos u, ou, fu; /* point position */ + FT_Pos delta; + + + if ( point->flags & touch_flag ) + continue; + + /* if this point is candidate to weak interpolation, we */ + /* interpolate it after all strong points have been processed */ + + if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) && + !( point->flags & AF_FLAG_INFLECTION ) ) + continue; + + if ( dim == AF_DIMENSION_VERT ) + { + u = point->fy; + ou = point->oy; + } + else + { + u = point->fx; + ou = point->ox; + } + + fu = u; + + /* is the point before the first edge? */ + edge = edges; + delta = edge->fpos - u; + if ( delta >= 0 ) + { + u = edge->pos - ( edge->opos - ou ); + goto Store_Point; + } + + /* is the point after the last edge? */ + edge = edge_limit - 1; + delta = u - edge->fpos; + if ( delta >= 0 ) + { + u = edge->pos + ( ou - edge->opos ); + goto Store_Point; + } + + { + FT_UInt min, max, mid; + FT_Pos fpos; + + + /* find enclosing edges */ + min = 0; + max = edge_limit - edges; + +#if 1 + /* for small edge counts, a linear search is better */ + if ( max <= 8 ) + { + FT_UInt nn; + + for ( nn = 0; nn < max; nn++ ) + if ( edges[nn].fpos >= u ) + break; + + if ( edges[nn].fpos == u ) + { + u = edges[nn].pos; + goto Store_Point; + } + min = nn; + } + else +#endif + while ( min < max ) + { + mid = ( max + min ) >> 1; + edge = edges + mid; + fpos = edge->fpos; + + if ( u < fpos ) + max = mid; + else if ( u > fpos ) + min = mid + 1; + else + { + /* we are on the edge */ + u = edge->pos; + goto Store_Point; + } + } + + { + AF_Edge before = edges + min - 1; + AF_Edge after = edges + min + 0; + + + /* assert( before && after && before != after ) */ + if ( before->scale == 0 ) + before->scale = FT_DivFix( after->pos - before->pos, + after->fpos - before->fpos ); + + u = before->pos + FT_MulFix( fu - before->fpos, + before->scale ); + } + } + + Store_Point: + /* save the point position */ + if ( dim == AF_DIMENSION_HORZ ) + point->x = u; + else + point->y = u; + + point->flags |= touch_flag; + } + } + } + + + /**************************************************************** + * + * WEAK POINT INTERPOLATION + * + ****************************************************************/ + + + static void + af_iup_shift( AF_Point p1, + AF_Point p2, + AF_Point ref ) + { + AF_Point p; + FT_Pos delta = ref->u - ref->v; + + if ( delta == 0 ) + return; + + for ( p = p1; p < ref; p++ ) + p->u = p->v + delta; + + for ( p = ref + 1; p <= p2; p++ ) + p->u = p->v + delta; + } + + + static void + af_iup_interp( AF_Point p1, + AF_Point p2, + AF_Point ref1, + AF_Point ref2 ) + { + AF_Point p; + FT_Pos u; + FT_Pos v1 = ref1->v; + FT_Pos v2 = ref2->v; + FT_Pos d1 = ref1->u - v1; + FT_Pos d2 = ref2->u - v2; + + + if ( p1 > p2 ) + return; + + if ( v1 == v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else + u += d2; + + p->u = u; + } + return; + } + + if ( v1 < v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else if ( u >= v2 ) + u += d2; + else + u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); + + p->u = u; + } + } + else + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v2 ) + u += d2; + else if ( u >= v1 ) + u += d1; + else + u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); + + p->u = u; + } + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Flags touch_flag; + AF_Point point; + AF_Point end_point; + AF_Point first_point; + + + /* PASS 1: Move segment points to edge positions */ + + if ( dim == AF_DIMENSION_HORZ ) + { + touch_flag = AF_FLAG_TOUCH_X; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->x; + point->v = point->ox; + } + } + else + { + touch_flag = AF_FLAG_TOUCH_Y; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->y; + point->v = point->oy; + } + } + + point = points; + + for ( ; contour < contour_limit; contour++ ) + { + AF_Point first_touched, last_touched; + + + point = *contour; + end_point = point->prev; + first_point = point; + + /* find first touched point */ + for (;;) + { + if ( point > end_point ) /* no touched point in contour */ + goto NextContour; + + if ( point->flags & touch_flag ) + break; + + point++; + } + + first_touched = point; + last_touched = point; + + for (;;) + { + FT_ASSERT( point <= end_point && + ( point->flags & touch_flag ) != 0 ); + + /* skip any touched neighbhours */ + while ( point < end_point && ( point[1].flags & touch_flag ) != 0 ) + point++; + + last_touched = point; + + /* find the next touched point, if any */ + point ++; + for (;;) + { + if ( point > end_point ) + goto EndContour; + + if ( ( point->flags & touch_flag ) != 0 ) + break; + + point++; + } + + /* interpolate between last_touched and point */ + af_iup_interp( last_touched + 1, point - 1, + last_touched, point ); + } + + EndContour: + /* special case: only one point was touched */ + if ( last_touched == first_touched ) + { + af_iup_shift( first_point, end_point, first_touched ); + } + else /* interpolate the last part */ + { + if ( last_touched < end_point ) + af_iup_interp( last_touched + 1, end_point, + last_touched, first_touched ); + + if ( first_touched > points ) + af_iup_interp( first_point, first_touched - 1, + last_touched, first_touched ); + } + + NextContour: + ; + } + + /* now save the interpolated values back to x/y */ + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < point_limit; point++ ) + point->x = point->u; + } + else + { + for ( point = points; point < point_limit; point++ ) + point->y = point->u; + } + } + + +#ifdef AF_USE_WARPER + + FT_LOCAL_DEF( void ) + af_glyph_hints_scale_dim( AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed scale, + FT_Pos delta ) + { + AF_Point points = hints->points; + AF_Point points_limit = points + hints->num_points; + AF_Point point; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < points_limit; point++ ) + point->x = FT_MulFix( point->fx, scale ) + delta; + } + else + { + for ( point = points; point < points_limit; point++ ) + point->y = FT_MulFix( point->fy, scale ) + delta; + } + } + +#endif /* AF_USE_WARPER */ + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afhints.h b/src/3rdparty/freetype/src/autofit/afhints.h new file mode 100644 index 0000000000..675826835a --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afhints.h @@ -0,0 +1,333 @@ +/***************************************************************************/ +/* */ +/* afhints.h */ +/* */ +/* Auto-fitter hinting routines (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFHINTS_H__ +#define __AFHINTS_H__ + +#include "aftypes.h" + +#define xxAF_SORT_SEGMENTS + +FT_BEGIN_HEADER + + /* + * The definition of outline glyph hints. These are shared by all + * script analysis routines (until now). + */ + + typedef enum AF_Dimension_ + { + AF_DIMENSION_HORZ = 0, /* x coordinates, */ + /* i.e., vertical segments & edges */ + AF_DIMENSION_VERT = 1, /* y coordinates, */ + /* i.e., horizontal segments & edges */ + + AF_DIMENSION_MAX /* do not remove */ + + } AF_Dimension; + + + /* hint directions -- the values are computed so that two vectors are */ + /* in opposite directions iff `dir1 + dir2 == 0' */ + typedef enum AF_Direction_ + { + AF_DIR_NONE = 4, + AF_DIR_RIGHT = 1, + AF_DIR_LEFT = -1, + AF_DIR_UP = 2, + AF_DIR_DOWN = -2 + + } AF_Direction; + + + /* point hint flags */ + typedef enum AF_Flags_ + { + AF_FLAG_NONE = 0, + + /* point type flags */ + AF_FLAG_CONIC = 1 << 0, + AF_FLAG_CUBIC = 1 << 1, + AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC, + + /* point extremum flags */ + AF_FLAG_EXTREMA_X = 1 << 2, + AF_FLAG_EXTREMA_Y = 1 << 3, + + /* point roundness flags */ + AF_FLAG_ROUND_X = 1 << 4, + AF_FLAG_ROUND_Y = 1 << 5, + + /* point touch flags */ + AF_FLAG_TOUCH_X = 1 << 6, + AF_FLAG_TOUCH_Y = 1 << 7, + + /* candidates for weak interpolation have this flag set */ + AF_FLAG_WEAK_INTERPOLATION = 1 << 8, + + /* all inflection points in the outline have this flag set */ + AF_FLAG_INFLECTION = 1 << 9 + + } AF_Flags; + + + /* edge hint flags */ + typedef enum AF_Edge_Flags_ + { + AF_EDGE_NORMAL = 0, + AF_EDGE_ROUND = 1 << 0, + AF_EDGE_SERIF = 1 << 1, + AF_EDGE_DONE = 1 << 2 + + } AF_Edge_Flags; + + + typedef struct AF_PointRec_* AF_Point; + typedef struct AF_SegmentRec_* AF_Segment; + typedef struct AF_EdgeRec_* AF_Edge; + + + typedef struct AF_PointRec_ + { + FT_UShort flags; /* point flags used by hinter */ + FT_Char in_dir; /* direction of inwards vector */ + FT_Char out_dir; /* direction of outwards vector */ + + FT_Pos ox, oy; /* original, scaled position */ + FT_Short fx, fy; /* original, unscaled position (font units) */ + FT_Pos x, y; /* current position */ + FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ + + AF_Point next; /* next point in contour */ + AF_Point prev; /* previous point in contour */ + + } AF_PointRec; + + + typedef struct AF_SegmentRec_ + { + FT_Byte flags; /* edge/segment flags for this segment */ + FT_Char dir; /* segment direction */ + FT_Short pos; /* position of segment */ + FT_Short min_coord; /* minimum coordinate of segment */ + FT_Short max_coord; /* maximum coordinate of segment */ + FT_Short height; /* the hinted segment height */ + + AF_Edge edge; /* the segment's parent edge */ + AF_Segment edge_next; /* link to next segment in parent edge */ + + AF_Segment link; /* (stem) link segment */ + AF_Segment serif; /* primary segment for serifs */ + FT_Pos num_linked; /* number of linked segments */ + FT_Pos score; /* used during stem matching */ + FT_Pos len; /* used during stem matching */ + + AF_Point first; /* first point in edge segment */ + AF_Point last; /* last point in edge segment */ + AF_Point* contour; /* ptr to first point of segment's contour */ + + } AF_SegmentRec; + + + typedef struct AF_EdgeRec_ + { + FT_Short fpos; /* original, unscaled position (font units) */ + FT_Pos opos; /* original, scaled position */ + FT_Pos pos; /* current position */ + + FT_Byte flags; /* edge flags */ + FT_Char dir; /* edge direction */ + FT_Fixed scale; /* used to speed up interpolation between edges */ + AF_Width blue_edge; /* non-NULL if this is a blue edge */ + + AF_Edge link; + AF_Edge serif; + FT_Short num_linked; + + FT_Int score; + + AF_Segment first; + AF_Segment last; + + } AF_EdgeRec; + + + typedef struct AF_AxisHintsRec_ + { + FT_Int num_segments; + FT_Int max_segments; + AF_Segment segments; +#ifdef AF_SORT_SEGMENTS + FT_Int mid_segments; +#endif + + FT_Int num_edges; + FT_Int max_edges; + AF_Edge edges; + + AF_Direction major_dir; + + } AF_AxisHintsRec, *AF_AxisHints; + + + typedef struct AF_GlyphHintsRec_ + { + FT_Memory memory; + + FT_Fixed x_scale; + FT_Pos x_delta; + + FT_Fixed y_scale; + FT_Pos y_delta; + + FT_Pos edge_distance_threshold; + + FT_Int max_points; + FT_Int num_points; + AF_Point points; + + FT_Int max_contours; + FT_Int num_contours; + AF_Point* contours; + + AF_AxisHintsRec axis[AF_DIMENSION_MAX]; + + FT_UInt32 scaler_flags; /* copy of scaler flags */ + FT_UInt32 other_flags; /* free for script-specific */ + /* implementations */ + AF_ScriptMetrics metrics; + + FT_Pos xmin_delta; /* used for warping */ + FT_Pos xmax_delta; + + } AF_GlyphHintsRec; + + +#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) ) +#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) ) + + +#ifdef AF_DEBUG + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + ( !_af_debug_disable_horz_hints && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + ( !_af_debug_disable_vert_hints && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) + +#define AF_HINTS_DO_ADVANCE( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) + +#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints ) + +#else /* !AF_DEBUG */ + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) + +#define AF_HINTS_DO_ADVANCE( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) + +#define AF_HINTS_DO_BLUES( h ) 1 + +#endif /* !AF_DEBUG */ + + + FT_LOCAL( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ); + + + FT_LOCAL( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ); + + FT_LOCAL( FT_Error) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Memory memory, + AF_Edge *edge ); + + FT_LOCAL( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ); + + + + /* + * recompute all AF_Point in a AF_GlyphHints from the definitions + * in a source outline + */ + FT_LOCAL( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_ScriptMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline, + FT_Bool get_inflections ); + + FT_LOCAL( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ); + +#ifdef AF_USE_WARPER + FT_LOCAL( void ) + af_glyph_hints_scale_dim( AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed scale, + FT_Pos delta ); +#endif + + FT_LOCAL( void ) + af_glyph_hints_done( AF_GlyphHints hints ); + +/* */ + +#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord ) + +#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \ + ? (seg1)->pos - (seg2)->pos \ + : (seg2)->pos - (seg1)->pos ) + + +FT_END_HEADER + +#endif /* __AFHINTS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afindic.c b/src/3rdparty/freetype/src/autofit/afindic.c new file mode 100644 index 0000000000..3d27f521b6 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afindic.c @@ -0,0 +1,134 @@ +/***************************************************************************/ +/* */ +/* afindic.c */ +/* */ +/* Auto-fitter hinting routines for Indic scripts (body). */ +/* */ +/* Copyright 2007 by */ +/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" +#include "aflatin.h" + + +#ifdef AF_CONFIG_OPTION_INDIC + +#include "afindic.h" +#include "aferrors.h" +#include "afcjk.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + static FT_Error + af_indic_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + /* use CJK routines */ + return af_cjk_metrics_init( metrics, face ); + } + + + static void + af_indic_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + /* use CJK routines */ + af_cjk_metrics_scale( metrics, scaler ); + } + + + static FT_Error + af_indic_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + /* use CJK routines */ + return af_cjk_hints_init( hints, metrics ); + } + + + static FT_Error + af_indic_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics) + { + /* use CJK routines */ + return af_cjk_hints_apply( hints, outline, metrics ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** I N D I C S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_indic_uniranges[] = + { +#if 0 + { 0x0100, 0xFFFF }, /* why this? */ +#endif + { 0x0900, 0x0DFF}, /* Indic Range */ + { 0, 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_indic_script_class = + { + AF_SCRIPT_INDIC, + af_indic_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_indic_metrics_init, + (AF_Script_ScaleMetricsFunc)af_indic_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_indic_hints_init, + (AF_Script_ApplyHintsFunc) af_indic_hints_apply + }; + +#else /* !AF_CONFIG_OPTION_INDIC */ + + static const AF_Script_UniRangeRec af_indic_uniranges[] = + { + { 0, 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_indic_script_class = + { + AF_SCRIPT_INDIC, + af_indic_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) NULL, + (AF_Script_ApplyHintsFunc) NULL + }; + +#endif /* !AF_CONFIG_OPTION_INDIC */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afindic.h b/src/3rdparty/freetype/src/autofit/afindic.h new file mode 100644 index 0000000000..b242b26144 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afindic.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* afindic.h */ +/* */ +/* Auto-fitter hinting routines for Indic scripts (specification). */ +/* */ +/* Copyright 2007 by */ +/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFINDIC_H__ +#define __AFINDIC_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the Indic-specific script class */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_indic_script_class; + + +/* */ + +FT_END_HEADER + +#endif /* __AFINDIC_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/aflatin.c b/src/3rdparty/freetype/src/autofit/aflatin.c new file mode 100644 index 0000000000..ba59e5b38c --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/aflatin.c @@ -0,0 +1,2177 @@ +/***************************************************************************/ +/* */ +/* aflatin.c */ +/* */ +/* Auto-fitter hinting routines for latin script (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "aflatin.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_UInt glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + + glyph_index = FT_Get_Char_Index( face, charcode ); + if ( glyph_index == 0 ) + goto Exit; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + scaler->x_scale = scaler->y_scale = 0x10000L; + scaler->x_delta = scaler->y_delta = 0; + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline, 0 ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + af_latin_hints_link_segments( hints, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[ num_widths++ ].org = dist; + } + } + + af_sort_widths( num_widths, axis->widths ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) + ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + } + } + + af_glyph_hints_done( hints ); + } + + + +#define AF_LATIN_MAX_TEST_CHARACTERS 12 + + + static const char* const af_latin_blue_chars[AF_LATIN_MAX_BLUES] = + { + "THEZOCQS", + "HEZLOCUS", + "fijkdbh", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + static void + af_latin_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Int num_flats; + FT_Int num_rounds; + FT_Int bb; + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_GlyphSlot glyph = face->glyph; + + + /* we compute the blues simply by loading each character from the */ + /* 'af_latin_blue_chars[blues]' string, then compute its top-most or */ + /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ + + AF_LOG(( "blue zones computation\n" )); + AF_LOG(( "------------------------------------------------\n" )); + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + const char* p = af_latin_blue_chars[bb]; + const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + AF_LOG(( "blue %3d: ", bb )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit && *p; p++ ) + { + FT_UInt glyph_index; + FT_Int best_point, best_y, best_first, best_last; + FT_Vector* points; + FT_Bool round = 0; + + + AF_LOG(( "'%c'", *p )); + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); + if ( glyph_index == 0 ) + continue; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || glyph->outline.n_points <= 0 ) + continue; + + /* now compute min or max point indices and coordinates */ + points = glyph->outline.points; + best_point = -1; + best_y = 0; /* make compiler happy */ + best_first = 0; /* ditto */ + best_last = 0; /* ditto */ + + { + FT_Int nn; + FT_Int first = 0; + FT_Int last = -1; + + + for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) + { + FT_Int old_best_point = best_point; + FT_Int pp; + + + last = glyph->outline.contours[nn]; + + /* Avoid single-point contours since they are never rasterized. */ + /* In some fonts, they correspond to mark attachment points */ + /* which are way outside of the glyph's real outline. */ + if ( last <= first ) + continue; + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y > best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y < best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + + if ( best_point != old_best_point ) + { + best_first = first; + best_last = last; + } + } + AF_LOG(( "%5d", best_y )); + } + + /* now check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then inspect its previous and next points */ + if ( best_point >= 0 ) + { + FT_Int prev, next; + FT_Pos dist; + + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + prev = best_point; + next = prev; + + do + { + if ( prev > best_first ) + prev--; + else + prev = best_last; + + dist = points[prev].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( prev != best_point ); + + do + { + if ( next < best_last ) + next++; + else + next = best_first; + + dist = points[next].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( next != best_point ); + + /* now, set the `round' flag depending on the segment's kind */ + round = FT_BOOL( + FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON || + FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON ); + + AF_LOG(( "%c ", round ? 'r' : 'f' )); + } + + if ( round ) + rounds[num_rounds++] = best_y; + else + flats[num_flats++] = best_y; + } + + AF_LOG(( "\n" )); + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + AF_LOG(( "empty!\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = & axis->blues[axis->blue_count]; + blue_ref = & blue->ref.org; + blue_shoot = & blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats[num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) + *blue_shoot = *blue_ref = ( shoot + ref ) / 2; + } + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + blue->flags |= AF_LATIN_BLUE_TOP; + + /* + * The following flags is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( bb == AF_LATIN_BLUE_SMALL_TOP ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + return; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + FT_CharMap oldmap = face->charmap; + FT_UInt ee; + + static const FT_Encoding latin_encodings[] = + { + FT_ENCODING_UNICODE, + FT_ENCODING_APPLE_ROMAN, + FT_ENCODING_ADOBE_STANDARD, + FT_ENCODING_ADOBE_LATIN_1, + FT_ENCODING_NONE /* end of list */ + }; + + + metrics->units_per_em = face->units_per_EM; + + /* do we have a latin charmap in there? */ + for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) + { + error = FT_Select_Charmap( face, latin_encodings[ee] ); + if ( !error ) + break; + } + + if ( !error ) + { + /* For now, compute the standard width and height from the `o'. */ + af_latin_metrics_init_widths( metrics, face, 'o' ); + af_latin_metrics_init_blues( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return AF_Err_Ok; + } + + + static void + af_latin_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct X and Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + { + AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < Axis->blue_count; nn++ ) + { + if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &Axis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); + FT_Pos fitted = ( scaled + 40 ) & ~63; + + + if ( scaled != fitted ) + { +#if 0 + if ( dim == AF_DIMENSION_HORZ ) + { + if ( fitted < scaled ) + scale -= scale / 50; /* scale *= 0.98 */ + } + else +#endif + if ( dim == AF_DIMENSION_VERT ) + { + scale = FT_MulDiv( scale, fitted, scaled ); + } + } + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + /* scale the standard widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + } + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 0.75 pixels */ + axis->extra_light = + (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); + + if ( dim == AF_DIMENSION_VERT ) + { + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { + FT_Pos delta1, delta2; + + + delta1 = blue->shoot.org - blue->ref.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + else + delta2 = FT_PIX_ROUND( delta2 ); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit + delta2; + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point last = point->prev; + int on_edge = 0; + FT_Pos min_pos = 32000; /* minimum segment pos != min_coord */ + FT_Pos max_pos = -32000; /* maximum segment pos != max_coord */ + FT_Bool passed; + + + if ( point == last ) /* skip singletons -- just in case */ + continue; + + if ( FT_ABS( last->out_dir ) == major_dir && + FT_ABS( point->out_dir ) == major_dir ) + { + /* we are already on an edge, try to locate its start */ + last = point; + + for (;;) + { + point = point->prev; + if ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + break; + } + if ( point == last ) + break; + } + } + + last = point; + passed = 0; + + for (;;) + { + FT_Pos u, v; + + + if ( on_edge ) + { + u = point->u; + if ( u < min_pos ) + min_pos = u; + if ( u > max_pos ) + max_pos = u; + + if ( point->out_dir != segment_dir || point == last ) + { + /* we are just leaving an edge; record a new segment! */ + segment->last = point; + segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + + /* a segment is round if either its first or last point */ + /* is a control point */ + if ( ( segment->first->flags | point->flags ) & + AF_FLAG_CONTROL ) + segment->flags |= AF_EDGE_ROUND; + + /* compute segment size */ + min_pos = max_pos = point->v; + + v = segment->first->v; + if ( v < min_pos ) + min_pos = v; + if ( v > max_pos ) + max_pos = v; + + segment->min_coord = (FT_Short)min_pos; + segment->max_coord = (FT_Short)max_pos; + segment->height = (FT_Short)( segment->max_coord - + segment->min_coord ); + + on_edge = 0; + segment = NULL; + /* fallthrough */ + } + } + + /* now exit if we are at the start/end point */ + if ( point == last ) + { + if ( passed ) + break; + passed = 1; + } + + if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) + { + /* this is the start of a new segment! */ + segment_dir = (AF_Direction)point->out_dir; + + /* clear all segment fields */ + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + segment[0] = seg0; + segment->dir = (FT_Char)segment_dir; + min_pos = max_pos = point->u; + segment->first = point; + segment->last = point; + segment->contour = contour; + on_edge = 1; + } + + point = point->next; + } + + } /* contours */ + + + /* now slightly increase the height of segments when this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = segments + axis->num_segments; + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first == last ) + continue; + + if ( first_v < last_v ) + { + AF_Point p; + + + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + AF_Point p; + + + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + FT_Pos len_threshold, len_score; + AF_Segment seg1, seg2; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are introduced to hint the metrics -- */ + /* we must never link them to anything */ + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Pos dist = pos2 - pos1; + + + if ( dist < 0 ) + dist = -dist; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + score = dist + len_score / len; + + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + AF_Direction up_dir; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; + + /* + * We ignore all segments that are less than 1 pixels in length, + * to avoid many problems with serif fonts. We compute the + * corresponding threshold in font units. + */ + if ( dim == AF_DIMENSION_HORZ ) + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + else + segment_length_threshold = 0; + + /*********************************************************************/ + /* */ + /* We will begin by generating a sorted table of edges for the */ + /* current direction. To do so, we simply scan each segment and try */ + /* to find an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which will be processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Int ee; + + + if ( seg->height < segment_length_threshold ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif && + 2 * seg->height < 3 * segment_length_threshold ) + continue; + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->dir = seg->dir; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /*********************************************************************/ + /* */ + /* Good, we will now compute each edge's properties according to */ + /* segments found on its position. Basically, these are: */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now, compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord-seg->min_coord; + else + downs += seg->max_coord-seg->min_coord; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && + seg->serif->edge && + seg->serif->edge != edge ); + + if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + +#if 0 + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = (FT_Char)up_dir; + + else if ( ups < downs ) + edge->dir = (FT_Char)-up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ +#endif + + /* gets rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin_hints_link_segments( hints, dim ); + + error = af_latin_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; + FT_Fixed scale = latin->scale; + + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_Int bb; + AF_Width best_blue = NULL; + FT_Pos best_dist; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist > 64 / 2 ) + best_dist = 64 / 2; + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); + is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_blue ^ is_major_dir ) + { + FT_Pos dist; + + + /* first of all, compare it to the reference position */ + dist = edge->fpos - blue->ref.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->ref; + } + + /* now, compare it to the overshoot position if the edge is */ + /* rounded, and if the edge is over the reference position of a */ + /* top zone, or under the reference position of a bottom zone */ + if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + blue = latin->blues + bb; + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->shoot; + } + } + } + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + static FT_Error + af_latin_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified `af_latin_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* #ifdef AF_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + { + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; + } +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' hinting mode we disable horizontal hinting completely. + * We also do it if the face is italic. + */ + if ( mode == FT_RENDER_MODE_LIGHT || + (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_latin_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_latin_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + + if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) + goto Done_Width; + + else if ( ( base_flags & AF_EDGE_ROUND ) ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; + + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + if ( axis->width_count > 0 ) + { + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + dist = ( dist + 32 ) & ~63; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + FT_Pos org_dist = dist; + + + dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Int delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if (delta >= 16) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_latin_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_latin_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " + "dist was %.2f, now %.2f\n", + stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, + stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); + } + + + static void + af_latin_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + (serif->opos - base->opos); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + af_latin_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_Int n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Int has_serifs = 0; + + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " + "was (%.2f)\n", + edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, + edge1->pos / 64.0 )); + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + + af_latin_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( !anchor ) + { + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + if ( cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f) " + "snapped to (%.2f) (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + anchor = edge; + + edge->flags |= AF_EDGE_DONE; + + af_latin_align_linked_edge( hints, dim, edge, edge2 ); + } + else + { + FT_Pos org_pos, org_len, org_center, cur_len; + FT_Pos cur_pos1, cur_pos2, delta1, delta2; + + + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + if ( edge2->flags & AF_EDGE_DONE ) + edge->pos = edge2->pos - cur_len; + + else if ( cur_len < 96 ) + { + FT_Pos u_off, d_off; + + + cur_pos1 = FT_PIX_ROUND( org_center ); + + if (cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + delta1 = org_center - ( cur_pos1 - u_off ); + if ( delta1 < 0 ) + delta1 = -delta1; + + delta2 = org_center - ( cur_pos1 + d_off ); + if ( delta2 < 0 ) + delta2 = -delta2; + + if ( delta1 < delta2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = cur_pos1 + cur_len / 2; + + AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + } + else + { + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + cur_pos1 = FT_PIX_ROUND( org_pos ); + delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; + if ( delta1 < 0 ) + delta1 = -delta1; + + cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; + delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center; + if ( delta2 < 0 ) + delta2 = -delta2; + + edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; + edge2->pos = edge->pos + cur_len; + + AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + } + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + { + AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n", + edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); + edge->pos = edge[-1].pos; + } + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin_align_serif_edge( hints, edge->serif, edge ); + AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f) " + "aligned to (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->serif - edges, edge->serif->opos / 64.0, + edge->pos / 64.0 )); + } + else if ( !anchor ) + { + AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + } + else + { + AF_Edge before, after; + + + for ( before = edge - 1; before >= edges; before-- ) + if ( before->flags & AF_EDGE_DONE ) + break; + + for ( after = edge + 1; after < edge_limit; after++ ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges && before < edge && + after < edge_limit && after > edge ) + { + if ( after->opos == before->opos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->opos - before->opos, + after->pos - before->pos, + after->opos - before->opos ); + AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) " + "from %d (opos=%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->pos / 64.0, before - edges, + before->opos / 64.0 )); + } + else + { + edge->pos = anchor->pos + + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); + AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + } + } + + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + edge->pos > edge[1].pos ) + edge->pos = edge[1].pos; + } + } + } + + + static FT_Error + af_latin_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + + error = af_glyph_hints_reload( hints, outline, 1 ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ +#ifdef AF_USE_WARPER + if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT || + AF_HINTS_DO_HORIZONTAL( hints ) ) +#else + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) +#endif + { + error = af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_latin_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_latin_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { +#ifdef AF_USE_WARPER + if ( ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif + + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* XXX: this should probably fine tuned to differentiate better between */ + /* scripts... */ + + static const AF_Script_UniRangeRec af_latin_uniranges[] = + { + { 0x0020 , 0x007F }, /* Basic Latin (no control chars) */ + { 0x00A0 , 0x00FF }, /* Latin-1 Supplement (no control chars) */ + { 0x0100 , 0x017F }, /* Latin Extended-A */ + { 0x0180 , 0x024F }, /* Latin Extended-B */ + { 0x0250 , 0x02AF }, /* IPA Extensions */ + { 0x02B0 , 0x02FF }, /* Spacing Modifier Letters */ + { 0x0300 , 0x036F }, /* Combining Diacritical Marks */ + { 0x0370 , 0x03FF }, /* Greek and Coptic */ + { 0x0400 , 0x04FF }, /* Cyrillic */ + { 0x0500 , 0x052F }, /* Cyrillic Supplement */ + { 0x1D00 , 0x1D7F }, /* Phonetic Extensions */ + { 0x1D80 , 0x1DBF }, /* Phonetic Extensions Supplement */ + { 0x1DC0 , 0x1DFF }, /* Combining Diacritical Marks Supplement */ + { 0x1E00 , 0x1EFF }, /* Latin Extended Additional */ + { 0x1F00 , 0x1FFF }, /* Greek Extended */ + { 0x2000 , 0x206F }, /* General Punctuation */ + { 0x2070 , 0x209F }, /* Superscripts and Subscripts */ + { 0x20A0 , 0x20CF }, /* Currency Symbols */ + { 0x2150 , 0x218F }, /* Number Forms */ + { 0x2460 , 0x24FF }, /* Enclosed Alphanumerics */ + { 0x2C60 , 0x2C7F }, /* Latin Extended-C */ + { 0x2DE0 , 0x2DFF }, /* Cyrillic Extended-A */ + { 0xA640U , 0xA69FU }, /* Cyrillic Extended-B */ + { 0xA720U , 0xA7FFU }, /* Latin Extended-D */ + { 0xFB00U , 0xFB06U }, /* Alphab. Present. Forms (Latin Ligs) */ + { 0x1D400UL, 0x1D7FFUL }, /* Mathematical Alphanumeric Symbols */ + { 0 , 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_latin_script_class = + { + AF_SCRIPT_LATIN, + af_latin_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_latin_metrics_init, + (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_latin_hints_init, + (AF_Script_ApplyHintsFunc) af_latin_hints_apply + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/aflatin.h b/src/3rdparty/freetype/src/autofit/aflatin.h new file mode 100644 index 0000000000..3251d3783f --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/aflatin.h @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* aflatin.h */ +/* */ +/* Auto-fitter hinting routines for latin script (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFLATIN_H__ +#define __AFLATIN_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the latin-specific script class */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_latin_script_class; + + +/* constants are given with units_per_em == 2048 in mind */ +#define AF_LATIN_CONSTANT( metrics, c ) \ + ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * The following declarations could be embedded in the file `aflatin.c'; + * they have been made semi-public to allow alternate script hinters to + * re-use some of them. + */ + + + /* Latin (global) metrics management */ + + enum + { + AF_LATIN_BLUE_CAPITAL_TOP, + AF_LATIN_BLUE_CAPITAL_BOTTOM, + AF_LATIN_BLUE_SMALL_F_TOP, + AF_LATIN_BLUE_SMALL_TOP, + AF_LATIN_BLUE_SMALL_BOTTOM, + AF_LATIN_BLUE_SMALL_MINOR, + + AF_LATIN_BLUE_MAX + }; + + +#define AF_LATIN_IS_TOP_BLUE( b ) ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \ + (b) == AF_LATIN_BLUE_SMALL_F_TOP || \ + (b) == AF_LATIN_BLUE_SMALL_TOP ) + +#define AF_LATIN_MAX_WIDTHS 16 +#define AF_LATIN_MAX_BLUES AF_LATIN_BLUE_MAX + + + enum + { + AF_LATIN_BLUE_ACTIVE = 1 << 0, + AF_LATIN_BLUE_TOP = 1 << 1, + AF_LATIN_BLUE_ADJUSTMENT = 1 << 2, /* used for scale adjustment */ + /* optimization */ + AF_LATIN_BLUE_FLAG_MAX + }; + + + typedef struct AF_LatinBlueRec_ + { + AF_WidthRec ref; + AF_WidthRec shoot; + FT_UInt flags; + + } AF_LatinBlueRec, *AF_LatinBlue; + + + typedef struct AF_LatinAxisRec_ + { + FT_Fixed scale; + FT_Pos delta; + + FT_UInt width_count; + AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; + FT_Pos edge_distance_threshold; + FT_Pos standard_width; + FT_Bool extra_light; + + /* ignored for horizontal metrics */ + FT_Bool control_overshoot; + FT_UInt blue_count; + AF_LatinBlueRec blues[AF_LATIN_BLUE_MAX]; + + FT_Fixed org_scale; + FT_Pos org_delta; + + } AF_LatinAxisRec, *AF_LatinAxis; + + + typedef struct AF_LatinMetricsRec_ + { + AF_ScriptMetricsRec root; + FT_UInt units_per_em; + AF_LatinAxisRec axis[AF_DIMENSION_MAX]; + + } AF_LatinMetricsRec, *AF_LatinMetrics; + + + FT_LOCAL( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + enum + { + AF_LATIN_HINTS_HORZ_SNAP = 1 << 0, /* enable stem width snapping */ + AF_LATIN_HINTS_VERT_SNAP = 1 << 1, /* enable stem height snapping */ + AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height */ + /* adjustment */ + AF_LATIN_HINTS_MONO = 1 << 3 /* indicate monochrome */ + /* rendering */ + }; + + +#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) + +#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) + +#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) + +#define AF_LATIN_HINTS_DO_MONO( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) + + + /* + * This shouldn't normally be exported. However, other scripts might + * like to use this function as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* + * This shouldn't normally be exported. However, other scripts might + * want to use this function as-is. + */ + FT_LOCAL( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* + * This shouldn't normally be exported. However, other scripts might + * want to use this function as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ); + +/* */ + +FT_END_HEADER + +#endif /* __AFLATIN_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/aflatin2.c b/src/3rdparty/freetype/src/autofit/aflatin2.c new file mode 100644 index 0000000000..14327b172b --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/aflatin2.c @@ -0,0 +1,2292 @@ +/***************************************************************************/ +/* */ +/* aflatin.c */ +/* */ +/* Auto-fitter hinting routines for latin script (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "aflatin.h" +#include "aflatin2.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL_DEF( void ) + af_latin2_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + af_latin2_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_UInt glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + + glyph_index = FT_Get_Char_Index( face, charcode ); + if ( glyph_index == 0 ) + goto Exit; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + scaler->x_scale = scaler->y_scale = 0x10000L; + scaler->x_delta = scaler->y_delta = 0; + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline, 0 ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin2_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + af_latin2_hints_link_segments( hints, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[ num_widths++ ].org = dist; + } + } + + af_sort_widths( num_widths, axis->widths ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) + ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + } + } + + af_glyph_hints_done( hints ); + } + + + +#define AF_LATIN_MAX_TEST_CHARACTERS 12 + + + static const char* const af_latin2_blue_chars[AF_LATIN_MAX_BLUES] = + { + "THEZOCQS", + "HEZLOCUS", + "fijkdbh", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + static void + af_latin2_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Int num_flats; + FT_Int num_rounds; + FT_Int bb; + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_GlyphSlot glyph = face->glyph; + + + /* we compute the blues simply by loading each character from the */ + /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */ + /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ + + AF_LOG(( "blue zones computation\n" )); + AF_LOG(( "------------------------------------------------\n" )); + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + const char* p = af_latin2_blue_chars[bb]; + const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + AF_LOG(( "blue %3d: ", bb )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit && *p; p++ ) + { + FT_UInt glyph_index; + FT_Int best_point, best_y, best_first, best_last; + FT_Vector* points; + FT_Bool round; + + + AF_LOG(( "'%c'", *p )); + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); + if ( glyph_index == 0 ) + continue; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || glyph->outline.n_points <= 0 ) + continue; + + /* now compute min or max point indices and coordinates */ + points = glyph->outline.points; + best_point = -1; + best_y = 0; /* make compiler happy */ + best_first = 0; /* ditto */ + best_last = 0; /* ditto */ + + { + FT_Int nn; + FT_Int first = 0; + FT_Int last = -1; + + + for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) + { + FT_Int old_best_point = best_point; + FT_Int pp; + + + last = glyph->outline.contours[nn]; + + /* Avoid single-point contours since they are never rasterized. */ + /* In some fonts, they correspond to mark attachment points */ + /* which are way outside of the glyph's real outline. */ + if ( last == first ) + continue; + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y > best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y < best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + + if ( best_point != old_best_point ) + { + best_first = first; + best_last = last; + } + } + AF_LOG(( "%5d", best_y )); + } + + /* now check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then inspect its previous and next points */ + { + FT_Int start, end, prev, next; + FT_Pos dist; + + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + start = end = best_point; + + do + { + prev = start-1; + if ( prev < best_first ) + prev = best_last; + + dist = points[prev].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + start = prev; + + } while ( start != best_point ); + + do + { + next = end+1; + if ( next > best_last ) + next = best_first; + + dist = points[next].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + end = next; + + } while ( end != best_point ); + + /* now, set the `round' flag depending on the segment's kind */ + round = FT_BOOL( + FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON || + FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON ); + + AF_LOG(( "%c ", round ? 'r' : 'f' )); + } + + if ( round ) + rounds[num_rounds++] = best_y; + else + flats[num_flats++] = best_y; + } + + AF_LOG(( "\n" )); + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + AF_LOG(( "empty!\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = & axis->blues[axis->blue_count]; + blue_ref = & blue->ref.org; + blue_shoot = & blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats[num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) + *blue_shoot = *blue_ref = ( shoot + ref ) / 2; + } + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + blue->flags |= AF_LATIN_BLUE_TOP; + + /* + * The following flags is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( bb == AF_LATIN_BLUE_SMALL_TOP ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + return; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + FT_CharMap oldmap = face->charmap; + FT_UInt ee; + + static const FT_Encoding latin_encodings[] = + { + FT_ENCODING_UNICODE, + FT_ENCODING_APPLE_ROMAN, + FT_ENCODING_ADOBE_STANDARD, + FT_ENCODING_ADOBE_LATIN_1, + FT_ENCODING_NONE /* end of list */ + }; + + + metrics->units_per_em = face->units_per_EM; + + /* do we have a latin charmap in there? */ + for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) + { + error = FT_Select_Charmap( face, latin_encodings[ee] ); + if ( !error ) + break; + } + + if ( !error ) + { + /* For now, compute the standard width and height from the `o'. */ + af_latin2_metrics_init_widths( metrics, face, 'o' ); + af_latin2_metrics_init_blues( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return AF_Err_Ok; + } + + + static void + af_latin2_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + if ( dim == AF_DIMENSION_VERT ) + { + AF_LatinAxis vaxis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < vaxis->blue_count; nn++ ) + { + if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &vaxis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); + FT_Pos fitted = ( scaled + 40 ) & ~63; + +#if 1 + if ( scaled != fitted ) { + scale = FT_MulDiv( scale, fitted, scaled ); + AF_LOG(( "== scaled x-top = %.2g fitted = %.2g, scaling = %.4g\n", scaled/64.0, fitted/64.0, (fitted*1.0)/scaled )); + } +#endif + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + /* scale the standard widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + } + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 0.75 pixels */ + axis->extra_light = + (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); + + if ( dim == AF_DIMENSION_VERT ) + { + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { + FT_Pos delta1, delta2; + + delta1 = blue->shoot.org - blue->ref.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + else + delta2 = FT_PIX_ROUND( delta2 ); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit + delta2; + + AF_LOG(( ">> activating blue zone %d: ref.cur=%.2g ref.fit=%.2g shoot.cur=%.2g shoot.fit=%.2g\n", + nn, blue->ref.cur/64.0, blue->ref.fit/64.0, + blue->shoot.cur/64.0, blue->shoot.fit/64.0 )); + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin2_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + + af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define SORT_SEGMENTS + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point start = point; + AF_Point last = point->prev; + + + if ( point == last ) /* skip singletons -- just in case */ + continue; + + /* already on an edge ?, backtrack to find its start */ + if ( FT_ABS( point->in_dir ) == major_dir ) + { + point = point->prev; + + while ( point->in_dir == start->in_dir ) + point = point->prev; + } + else /* otherwise, find first segment start, if any */ + { + while ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + + if ( point == start ) + goto NextContour; + } + } + + start = point; + + for (;;) + { + AF_Point first; + FT_Pos min_u, min_v, max_u, max_v; + + /* we're at the start of a new segment */ + FT_ASSERT( FT_ABS( point->out_dir ) == major_dir && + point->in_dir != point->out_dir ); + first = point; + + min_u = max_u = point->u; + min_v = max_v = point->v; + + point = point->next; + + while ( point->out_dir == first->out_dir ) + { + point = point->next; + + if ( point->u < min_u ) + min_u = point->u; + + if ( point->u > max_u ) + max_u = point->u; + } + + if ( point->v < min_v ) + min_v = point->v; + + if ( point->v > max_v ) + max_v = point->v; + + /* record new segment */ + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + segment[0] = seg0; + segment->dir = first->out_dir; + segment->first = first; + segment->last = point; + segment->contour = contour; + segment->pos = (FT_Short)(( min_u + max_u ) >> 1); + segment->min_coord = (FT_Short) min_v; + segment->max_coord = (FT_Short) max_v; + segment->height = (FT_Short)(max_v - min_v); + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + { + AF_Point pt = first; + AF_Point last = point; + AF_Flags f0 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + AF_Flags f1; + + + segment->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + segment->flags |= AF_EDGE_ROUND; + } + } + + /* this can happen in the case of a degenerate contour + * e.g. a 2-point vertical contour + */ + if ( point == start ) + break; + + /* jump to the start of the next segment, if any */ + while ( FT_ABS(point->out_dir) != major_dir ) + { + point = point->next; + + if ( point == start ) + goto NextContour; + } + } + + NextContour: + ; + } /* contours */ + + /* now slightly increase the height of segments when this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = segments + axis->num_segments; + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + AF_Point p; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first == last ) + continue; + + if ( first_v < last_v ) + { + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + +#ifdef AF_SORT_SEGMENTS + /* place all segments with a negative direction to the start + * of the array, used to speed up segment linking later... + */ + { + AF_Segment segments = axis->segments; + FT_UInt count = axis->num_segments; + FT_UInt ii, jj; + + for (ii = 0; ii < count; ii++) + { + if ( segments[ii].dir > 0 ) + { + for (jj = ii+1; jj < count; jj++) + { + if ( segments[jj].dir < 0 ) + { + AF_SegmentRec tmp; + + tmp = segments[ii]; + segments[ii] = segments[jj]; + segments[jj] = tmp; + + break; + } + } + + if ( jj == count ) + break; + } + } + axis->mid_segments = ii; + } +#endif + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin2_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; +#ifdef AF_SORT_SEGMENTS + AF_Segment segment_mid = segments + axis->mid_segments; +#endif + FT_Pos len_threshold, len_score; + AF_Segment seg1, seg2; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + +#ifdef AF_SORT_SEGMENTS + for ( seg1 = segments; seg1 < segment_mid; seg1++ ) + { + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ ) +#else + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are introduced to hint the metrics -- */ + /* we must never link them to anything */ + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) +#endif + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Pos dist = pos2 - pos1; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + score = dist + len_score / len; + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } +#if 0 + } +#endif + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + AF_Direction up_dir; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; + + /* + * We want to ignore very small (mostly serif) segments, we do that + * by ignoring those that whose length is less than a given fraction + * of the standard width. If there is no standard width, we ignore + * those that are less than a given size in pixels + * + * also, unlink serif segments that are linked to segments farther + * than 50% of the standard width + */ + if ( dim == AF_DIMENSION_HORZ ) + { + if ( laxis->width_count > 0 ) + segment_length_threshold = (laxis->standard_width * 10 ) >> 4; + else + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + } + else + segment_length_threshold = 0; + + /*********************************************************************/ + /* */ + /* We will begin by generating a sorted table of edges for the */ + /* current direction. To do so, we simply scan each segment and try */ + /* to find an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which will be processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Int ee; + + + if ( seg->height < segment_length_threshold ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif ) + { + FT_Pos dist = seg->serif->pos - seg->pos; + + if (dist < 0) + dist = -dist; + + if (dist >= laxis->standard_width >> 1) + { + /* unlink this serif, it is too distant from its reference stem */ + seg->serif = NULL; + } + else if ( 2*seg->height < 3 * segment_length_threshold ) + continue; + } + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, seg->dir, memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->dir = seg->dir; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /*********************************************************************/ + /* */ + /* Good, we will now compute each edge's properties according to */ + /* segments found on its position. Basically, these are: */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now, compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord-seg->min_coord; + else + downs += seg->max_coord-seg->min_coord; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && + seg->serif->edge && + seg->serif->edge != edge ); + + if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + +#if 0 + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = (FT_Char)up_dir; + + else if ( ups < downs ) + edge->dir = (FT_Char)-up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ +#endif + + /* gets rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin2_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin2_hints_link_segments( hints, dim ); + + error = af_latin2_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin2_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; + FT_Fixed scale = latin->scale; + FT_Pos best_dist0; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist0 > 64 / 2 ) + best_dist0 = 64 / 2; + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_Int bb; + AF_Width best_blue = NULL; + FT_Pos best_dist = best_dist0; + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); + is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_blue ^ is_major_dir ) + { + FT_Pos dist; + AF_Width compare; + + + /* if it's a rounded edge, compare it to the overshoot position */ + /* if it's a flat edge, compare it to the reference position */ + if ( edge->flags & AF_EDGE_ROUND ) + compare = &blue->shoot; + else + compare = &blue->ref; + + dist = edge->fpos - compare->org; + if (dist < 0) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = compare; + } + +#if 0 + /* now, compare it to the overshoot position if the edge is */ + /* rounded, and if the edge is over the reference position of a */ + /* top zone, or under the reference position of a bottom zone */ + if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + blue = latin->blues + bb; + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->shoot; + } + } + } +#endif + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + static FT_Error + af_latin2_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified `af_latin2_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* #ifdef AF_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + { + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; + } +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' hinting mode we disable horizontal hinting completely. + * We also do it if the face is italic. + */ + if ( mode == FT_RENDER_MODE_LIGHT || + (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_latin2_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_latin2_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + + FT_UNUSED(base_flags); + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + + if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) + goto Done_Width; + +#if 0 + else if ( ( base_flags & AF_EDGE_ROUND ) ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; +#endif + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + if ( axis->width_count > 0 ) + { + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + dist = ( dist + 32 ) & ~63; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + FT_Pos org_dist = dist; + + + dist = af_latin2_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Int delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if (delta >= 16) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_latin2_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_latin2_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " + "dist was %.2f, now %.2f\n", + stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, + stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); + } + + + static void + af_latin2_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + (serif->opos - base->opos); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + af_latin2_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_Int n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Int has_serifs = 0; + FT_Pos anchor_drift = 0; + + + + AF_LOG(( "==== hinting %s edges =====\n", dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" )); + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " + "was (%.2f)\n", + edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, + edge1->pos / 64.0 )); + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin2_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + } + + if ( !anchor ) + { + anchor = edge; + + anchor_drift = (anchor->pos - anchor->opos); + if (edge2) + anchor_drift = (anchor_drift + (edge2->pos - edge2->opos)) >> 1; + } + } + } + + /* now we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + + af_latin2_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( !anchor ) + { + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin2_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + if ( cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f) " + "snapped to (%.2f) (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + anchor = edge; + + edge->flags |= AF_EDGE_DONE; + + af_latin2_align_linked_edge( hints, dim, edge, edge2 ); + + edge2->flags |= AF_EDGE_DONE; + + anchor_drift = ( (anchor->pos - anchor->opos) + + (edge2->pos - edge2->opos)) >> 1; + + AF_LOG(( "DRIFT: %.2f\n", anchor_drift/64.0 )); + } + else + { + FT_Pos org_pos, org_len, org_center, cur_center, cur_len; + FT_Pos org_left, org_right; + + + org_pos = edge->opos + anchor_drift; + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin2_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + org_left = org_pos + ((org_len - cur_len) >> 1); + org_right = org_pos + ((org_len + cur_len) >> 1); + + AF_LOG(( "ALIGN: left=%.2f right=%.2f ", org_left/64.0, org_right/64.0 )); + cur_center = org_center; + + if ( edge2->flags & AF_EDGE_DONE ) + { + AF_LOG(( "\n" )); + edge->pos = edge2->pos - cur_len; + } + else + { + /* we want to compare several displacement, and choose + * the one that increases fitness while minimizing + * distortion as well + */ + FT_Pos displacements[6], scores[6], org, fit, delta; + FT_UInt count = 0; + + /* note: don't even try to fit tiny stems */ + if ( cur_len < 32 ) + { + AF_LOG(( "tiny stem\n" )); + goto AlignStem; + } + + /* if the span is within a single pixel, don't touch it */ + if ( FT_PIX_FLOOR(org_left) == FT_PIX_CEIL(org_right) ) + { + AF_LOG(( "single pixel stem\n" )); + goto AlignStem; + } + + if (cur_len <= 96) + { + /* we want to avoid the absolute worst case which is + * when the left and right edges of the span each represent + * about 50% of the gray. we'd better want to change this + * to 25/75%, since this is much more pleasant to the eye with + * very acceptable distortion + */ + FT_Pos frac_left = (org_left) & 63; + FT_Pos frac_right = (org_right) & 63; + + if ( frac_left >= 22 && frac_left <= 42 && + frac_right >= 22 && frac_right <= 42 ) + { + org = frac_left; + fit = (org <= 32) ? 16 : 48; + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispA=%.2f (%d) ", (fit - org)/64.0, delta )); + + org = frac_right; + fit = (org <= 32) ? 16 : 48; + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispB=%.2f (%d) ", (fit - org)/64.0, delta )); + } + } + + /* snapping the left edge to the grid */ + org = org_left; + fit = FT_PIX_ROUND(org); + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispC=%.2f (%d) ", (fit - org)/64.0, delta )); + + /* snapping the right edge to the grid */ + org = org_right; + fit = FT_PIX_ROUND(org); + delta = FT_ABS(fit - org); + displacements[count] = fit - org; + scores[count++] = delta; + AF_LOG(( "dispD=%.2f (%d) ", (fit - org)/64.0, delta )); + + /* now find the best displacement */ + { + FT_Pos best_score = scores[0]; + FT_Pos best_disp = displacements[0]; + FT_UInt nn; + + for (nn = 1; nn < count; nn++) + { + if (scores[nn] < best_score) + { + best_score = scores[nn]; + best_disp = displacements[nn]; + } + } + + cur_center = org_center + best_disp; + } + AF_LOG(( "\n" )); + } + + AlignStem: + edge->pos = cur_center - (cur_len >> 1); + edge2->pos = edge->pos + cur_len; + + AF_LOG(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f), org_len = %.2f cur_len=%.2f\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0, + org_len / 64.0, cur_len / 64.0 )); + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + { + AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n", + edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); + edge->pos = edge[-1].pos; + } + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ +#if 0 + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } +#endif + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin2_align_serif_edge( hints, edge->serif, edge ); + AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f) " + "aligned to (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->serif - edges, edge->serif->opos / 64.0, + edge->pos / 64.0 )); + } + else if ( !anchor ) + { + AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + } + else + { + AF_Edge before, after; + + + for ( before = edge - 1; before >= edges; before-- ) + if ( before->flags & AF_EDGE_DONE ) + break; + + for ( after = edge + 1; after < edge_limit; after++ ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges && before < edge && + after < edge_limit && after > edge ) + { + if ( after->opos == before->opos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->opos - before->opos, + after->pos - before->pos, + after->opos - before->opos ); + AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) from %d (opos=%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0, before - edges, before->opos / 64.0 )); + } + else + { + edge->pos = anchor->pos + (( edge->opos - anchor->opos + 16) & ~31); + + AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + } + } + + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + edge->pos > edge[1].pos ) + edge->pos = edge[1].pos; + } + } + } + + + static FT_Error + af_latin2_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + + error = af_glyph_hints_reload( hints, outline, 1 ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ +#ifdef AF_USE_WARPER + if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT || + AF_HINTS_DO_HORIZONTAL( hints ) ) +#else + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) +#endif + { + error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_latin2_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { +#ifdef AF_USE_WARPER + if ( ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif + + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin2_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_latin2_uniranges[] = + { + { 32, 127 }, /* XXX: TODO: Add new Unicode ranges here! */ + { 160, 255 }, + { 0, 0 } + }; + + + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec + af_latin2_script_class = + { + AF_SCRIPT_LATIN2, + af_latin2_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_latin2_metrics_init, + (AF_Script_ScaleMetricsFunc)af_latin2_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_latin2_hints_init, + (AF_Script_ApplyHintsFunc) af_latin2_hints_apply + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/aflatin2.h b/src/3rdparty/freetype/src/autofit/aflatin2.h new file mode 100644 index 0000000000..34eda05822 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/aflatin2.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* aflatin2.h */ +/* */ +/* Auto-fitter hinting routines for latin script (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFLATIN2_H__ +#define __AFLATIN2_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the latin-specific script class */ + + FT_CALLBACK_TABLE const AF_ScriptClassRec + af_latin2_script_class; + +/* */ + +FT_END_HEADER + +#endif /* __AFLATIN_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afloader.c b/src/3rdparty/freetype/src/autofit/afloader.c new file mode 100644 index 0000000000..4e48c2fe97 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afloader.c @@ -0,0 +1,535 @@ +/***************************************************************************/ +/* */ +/* afloader.c */ +/* */ +/* Auto-fitter glyph loading routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afloader.h" +#include "afhints.h" +#include "afglobal.h" +#include "aflatin.h" +#include "aferrors.h" + + + FT_LOCAL_DEF( FT_Error ) + af_loader_init( AF_Loader loader, + FT_Memory memory ) + { + FT_ZERO( loader ); + + af_glyph_hints_init( &loader->hints, memory ); +#ifdef AF_DEBUG + _af_debug_hints = &loader->hints; +#endif + return FT_GlyphLoader_New( memory, &loader->gloader ); + } + + + FT_LOCAL_DEF( FT_Error ) + af_loader_reset( AF_Loader loader, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + + + loader->face = face; + loader->globals = (AF_FaceGlobals)face->autohint.data; + + FT_GlyphLoader_Rewind( loader->gloader ); + + if ( loader->globals == NULL ) + { + error = af_face_globals_new( face, &loader->globals ); + if ( !error ) + { + face->autohint.data = + (FT_Pointer)loader->globals; + face->autohint.finalizer = + (FT_Generic_Finalizer)af_face_globals_free; + } + } + + return error; + } + + + FT_LOCAL_DEF( void ) + af_loader_done( AF_Loader loader ) + { + af_glyph_hints_done( &loader->hints ); + + loader->face = NULL; + loader->globals = NULL; + +#ifdef AF_DEBUG + _af_debug_hints = NULL; +#endif + FT_GlyphLoader_Done( loader->gloader ); + loader->gloader = NULL; + } + + + static FT_Error + af_loader_load_g( AF_Loader loader, + AF_Scaler scaler, + FT_UInt glyph_index, + FT_Int32 load_flags, + FT_UInt depth ) + { + FT_Error error; + FT_Face face = loader->face; + FT_GlyphLoader gloader = loader->gloader; + AF_ScriptMetrics metrics = loader->metrics; + AF_GlyphHints hints = &loader->hints; + FT_GlyphSlot slot = face->glyph; + FT_Slot_Internal internal = slot->internal; + + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + goto Exit; + + loader->transformed = internal->glyph_transformed; + if ( loader->transformed ) + { + FT_Matrix inverse; + + + loader->trans_matrix = internal->glyph_matrix; + loader->trans_delta = internal->glyph_delta; + + inverse = loader->trans_matrix; + FT_Matrix_Invert( &inverse ); + FT_Vector_Transform( &loader->trans_delta, &inverse ); + } + + /* set linear metrics */ + slot->linearHoriAdvance = slot->metrics.horiAdvance; + slot->linearVertAdvance = slot->metrics.vertAdvance; + + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_OUTLINE: + /* translate the loaded glyph when an internal transform is needed */ + if ( loader->transformed ) + FT_Outline_Translate( &slot->outline, + loader->trans_delta.x, + loader->trans_delta.y ); + + /* copy the outline points in the loader's current */ + /* extra points which is used to keep original glyph coordinates */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, + slot->outline.n_points + 4, + slot->outline.n_contours ); + if ( error ) + goto Exit; + + FT_ARRAY_COPY( gloader->current.outline.points, + slot->outline.points, + slot->outline.n_points ); + + FT_ARRAY_COPY( gloader->current.outline.contours, + slot->outline.contours, + slot->outline.n_contours ); + + FT_ARRAY_COPY( gloader->current.outline.tags, + slot->outline.tags, + slot->outline.n_points ); + + gloader->current.outline.n_points = slot->outline.n_points; + gloader->current.outline.n_contours = slot->outline.n_contours; + + /* compute original horizontal phantom points (and ignore */ + /* vertical ones) */ + loader->pp1.x = hints->x_delta; + loader->pp1.y = hints->y_delta; + loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, + hints->x_scale ) + hints->x_delta; + loader->pp2.y = hints->y_delta; + + /* be sure to check for spacing glyphs */ + if ( slot->outline.n_points == 0 ) + goto Hint_Metrics; + + /* now load the slot image into the auto-outline and run the */ + /* automatic hinting process */ + if ( metrics->clazz->script_hints_apply ) + metrics->clazz->script_hints_apply( hints, + &gloader->current.outline, + metrics ); + + /* we now need to hint the metrics according to the change in */ + /* width/positioning that occurred during the hinting process */ + if ( scaler->render_mode != FT_RENDER_MODE_LIGHT ) + { + FT_Pos old_rsb, old_lsb, new_lsb; + FT_Pos pp1x_uh, pp2x_uh; + AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; + AF_Edge edge1 = axis->edges; /* leftmost edge */ + AF_Edge edge2 = edge1 + + axis->num_edges - 1; /* rightmost edge */ + + + if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) + { + old_rsb = loader->pp2.x - edge2->opos; + old_lsb = edge1->opos; + new_lsb = edge1->pos; + + /* remember unhinted values to later account */ + /* for rounding errors */ + + pp1x_uh = new_lsb - old_lsb; + pp2x_uh = edge2->pos + old_rsb; + + /* prefer too much space over too little space */ + /* for very small sizes */ + + if ( old_lsb < 24 ) + pp1x_uh -= 8; + + if ( old_rsb < 24 ) + pp2x_uh += 8; + + loader->pp1.x = FT_PIX_ROUND( pp1x_uh ); + loader->pp2.x = FT_PIX_ROUND( pp2x_uh ); + + if ( loader->pp1.x >= new_lsb && old_lsb > 0 ) + loader->pp1.x -= 64; + + if ( loader->pp2.x <= edge2->pos && old_rsb > 0 ) + loader->pp2.x += 64; + + slot->lsb_delta = loader->pp1.x - pp1x_uh; + slot->rsb_delta = loader->pp2.x - pp2x_uh; + } + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + loader->pp1.x = FT_PIX_ROUND( pp1x ); + loader->pp2.x = FT_PIX_ROUND( pp2x ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + } + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta ); + loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + + /* good, we simply add the glyph to our loader's base */ + FT_GlyphLoader_Add( gloader ); + break; + + case FT_GLYPH_FORMAT_COMPOSITE: + { + FT_UInt nn, num_subglyphs = slot->num_subglyphs; + FT_UInt num_base_subgs, start_point; + FT_SubGlyph subglyph; + + + start_point = gloader->base.outline.n_points; + + /* first of all, copy the subglyph descriptors in the glyph loader */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs ); + if ( error ) + goto Exit; + + FT_ARRAY_COPY( gloader->current.subglyphs, + slot->subglyphs, + num_subglyphs ); + + gloader->current.num_subglyphs = num_subglyphs; + num_base_subgs = gloader->base.num_subglyphs; + + /* now, read each subglyph independently */ + for ( nn = 0; nn < num_subglyphs; nn++ ) + { + FT_Vector pp1, pp2; + FT_Pos x, y; + FT_UInt num_points, num_new_points, num_base_points; + + + /* gloader.current.subglyphs can change during glyph loading due */ + /* to re-allocation -- we must recompute the current subglyph on */ + /* each iteration */ + subglyph = gloader->base.subglyphs + num_base_subgs + nn; + + pp1 = loader->pp1; + pp2 = loader->pp2; + + num_base_points = gloader->base.outline.n_points; + + error = af_loader_load_g( loader, scaler, subglyph->index, + load_flags, depth + 1 ); + if ( error ) + goto Exit; + + /* recompute subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + nn; + + if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS ) + { + pp1 = loader->pp1; + pp2 = loader->pp2; + } + else + { + loader->pp1 = pp1; + loader->pp2 = pp2; + } + + num_points = gloader->base.outline.n_points; + num_new_points = num_points - num_base_points; + + /* now perform the transform required for this subglyph */ + + if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE | + FT_SUBGLYPH_FLAG_XY_SCALE | + FT_SUBGLYPH_FLAG_2X2 ) ) + { + FT_Vector* cur = gloader->base.outline.points + + num_base_points; + FT_Vector* limit = cur + num_new_points; + + + for ( ; cur < limit; cur++ ) + FT_Vector_Transform( cur, &subglyph->transform ); + } + + /* apply offset */ + + if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) ) + { + FT_Int k = subglyph->arg1; + FT_UInt l = subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + if ( start_point + k >= num_base_points || + l >= (FT_UInt)num_new_points ) + { + error = AF_Err_Invalid_Composite; + goto Exit; + } + + l += num_base_points; + + /* for now, only use the current point coordinates; */ + /* we may consider another approach in the near future */ + p1 = gloader->base.outline.points + start_point + k; + p2 = gloader->base.outline.points + start_point + l; + + x = p1->x - p2->x; + y = p1->y - p2->y; + } + else + { + x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta; + y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta; + + x = FT_PIX_ROUND( x ); + y = FT_PIX_ROUND( y ); + } + + { + FT_Outline dummy = gloader->base.outline; + + + dummy.points += num_base_points; + dummy.n_points = (short)num_new_points; + + FT_Outline_Translate( &dummy, x, y ); + } + } + } + break; + + default: + /* we don't support other formats (yet?) */ + error = AF_Err_Unimplemented_Feature; + } + + Hint_Metrics: + if ( depth == 0 ) + { + FT_BBox bbox; + FT_Vector vvector; + + + vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; + vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; + vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale ); + vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale ); + + /* transform the hinted outline if needed */ + if ( loader->transformed ) + { + FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); + FT_Vector_Transform( &vvector, &loader->trans_matrix ); + } +#if 1 + /* we must translate our final outline by -pp1.x and compute */ + /* the new metrics */ + if ( loader->pp1.x ) + FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); +#endif + FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); + + bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); + bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); + bbox.xMax = FT_PIX_CEIL( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + + slot->metrics.width = bbox.xMax - bbox.xMin; + slot->metrics.height = bbox.yMax - bbox.yMin; + slot->metrics.horiBearingX = bbox.xMin; + slot->metrics.horiBearingY = bbox.yMax; + + slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); + slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); + + /* for mono-width fonts (like Andale, Courier, etc.) we need */ + /* to keep the original rounded advance width */ +#if 0 + if ( !FT_IS_FIXED_WIDTH( slot->face ) ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + else + slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, + x_scale ); +#else + if ( !FT_IS_FIXED_WIDTH( slot->face ) ) + { + /* non-spacing glyphs must stay as-is */ + if ( slot->metrics.horiAdvance ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + } + else + { + slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, + metrics->scaler.x_scale ); + + /* Set delta values to 0. Otherwise code that uses them is */ + /* going to ruin the fixed advance width. */ + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } +#endif + + slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, + metrics->scaler.y_scale ); + + slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); + slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); + + /* now copy outline into glyph slot */ + FT_GlyphLoader_Rewind( internal->loader ); + error = FT_GlyphLoader_CopyPoints( internal->loader, gloader ); + if ( error ) + goto Exit; + + slot->outline = internal->loader->base.outline; + slot->format = FT_GLYPH_FORMAT_OUTLINE; + } + +#ifdef DEBUG_HINTER + af_debug_hinter = hinter; +#endif + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + FT_Face face, + FT_UInt gindex, + FT_UInt32 load_flags ) + { + FT_Error error; + FT_Size size = face->size; + AF_ScalerRec scaler; + + + if ( !size ) + return AF_Err_Invalid_Argument; + + FT_ZERO( &scaler ); + + scaler.face = face; + scaler.x_scale = size->metrics.x_scale; + scaler.x_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ + scaler.y_scale = size->metrics.y_scale; + scaler.y_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ + + scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); + scaler.flags = 0; /* XXX: fix this */ + + error = af_loader_reset( loader, face ); + if ( !error ) + { + AF_ScriptMetrics metrics; + FT_UInt options = 0; + + +#ifdef FT_OPTION_AUTOFIT2 + /* XXX: undocumented hook to activate the latin2 hinter */ + if ( load_flags & ( 1UL << 20 ) ) + options = 2; +#endif + + error = af_face_globals_get_metrics( loader->globals, gindex, + options, &metrics ); + if ( !error ) + { + loader->metrics = metrics; + + if ( metrics->clazz->script_metrics_scale ) + metrics->clazz->script_metrics_scale( metrics, &scaler ); + else + metrics->scaler = scaler; + + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; + load_flags &= ~FT_LOAD_RENDER; + + if ( metrics->clazz->script_hints_init ) + { + error = metrics->clazz->script_hints_init( &loader->hints, + metrics ); + if ( error ) + goto Exit; + } + + error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 ); + } + } + Exit: + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afloader.h b/src/3rdparty/freetype/src/autofit/afloader.h new file mode 100644 index 0000000000..fa67c10ffe --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afloader.h @@ -0,0 +1,73 @@ +/***************************************************************************/ +/* */ +/* afloader.h */ +/* */ +/* Auto-fitter glyph loading routines (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AF_LOADER_H__ +#define __AF_LOADER_H__ + +#include "afhints.h" +#include "afglobal.h" + + +FT_BEGIN_HEADER + + typedef struct AF_LoaderRec_ + { + FT_Face face; /* current face */ + AF_FaceGlobals globals; /* current face globals */ + FT_GlyphLoader gloader; /* glyph loader */ + AF_GlyphHintsRec hints; + AF_ScriptMetrics metrics; + FT_Bool transformed; + FT_Matrix trans_matrix; + FT_Vector trans_delta; + FT_Vector pp1; + FT_Vector pp2; + /* we don't handle vertical phantom points */ + + } AF_LoaderRec, *AF_Loader; + + + FT_LOCAL( FT_Error ) + af_loader_init( AF_Loader loader, + FT_Memory memory ); + + + FT_LOCAL( FT_Error ) + af_loader_reset( AF_Loader loader, + FT_Face face ); + + + FT_LOCAL( void ) + af_loader_done( AF_Loader loader ); + + + FT_LOCAL( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + FT_Face face, + FT_UInt gindex, + FT_UInt32 load_flags ); + +/* */ + + +FT_END_HEADER + +#endif /* __AF_LOADER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afmodule.c b/src/3rdparty/freetype/src/autofit/afmodule.c new file mode 100644 index 0000000000..cd5e1cc218 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afmodule.c @@ -0,0 +1,97 @@ +/***************************************************************************/ +/* */ +/* afmodule.c */ +/* */ +/* Auto-fitter module implementation (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afmodule.h" +#include "afloader.h" + +#ifdef AF_DEBUG + int _af_debug; + int _af_debug_disable_horz_hints; + int _af_debug_disable_vert_hints; + int _af_debug_disable_blue_hints; + void* _af_debug_hints; +#endif + +#include FT_INTERNAL_OBJECTS_H + + + typedef struct FT_AutofitterRec_ + { + FT_ModuleRec root; + AF_LoaderRec loader[1]; + + } FT_AutofitterRec, *FT_Autofitter; + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_init( FT_Autofitter module ) + { + return af_loader_init( module->loader, module->root.library->memory ); + } + + + FT_CALLBACK_DEF( void ) + af_autofitter_done( FT_Autofitter module ) + { + af_loader_done( module->loader ); + } + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_load_glyph( FT_Autofitter module, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_UNUSED( size ); + + return af_loader_load_glyph( module->loader, slot->face, + glyph_index, load_flags ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_AutoHinter_ServiceRec af_autofitter_service = + { + NULL, + NULL, + NULL, + (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class autofit_module_class = + { + FT_MODULE_HINTER, + sizeof ( FT_AutofitterRec ), + + "autofitter", + 0x10000L, /* version 1.0 of the autofitter */ + 0x20000L, /* requires FreeType 2.0 or above */ + + (const void*)&af_autofitter_service, + + (FT_Module_Constructor)af_autofitter_init, + (FT_Module_Destructor) af_autofitter_done, + (FT_Module_Requester) NULL + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afmodule.h b/src/3rdparty/freetype/src/autofit/afmodule.h new file mode 100644 index 0000000000..36268a0890 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afmodule.h @@ -0,0 +1,37 @@ +/***************************************************************************/ +/* */ +/* afmodule.h */ +/* */ +/* Auto-fitter module implementation (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFMODULE_H__ +#define __AFMODULE_H__ + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + FT_CALLBACK_TABLE + const FT_Module_Class autofit_module_class; + + +FT_END_HEADER + +#endif /* __AFMODULE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/aftypes.h b/src/3rdparty/freetype/src/autofit/aftypes.h new file mode 100644 index 0000000000..626a38865e --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/aftypes.h @@ -0,0 +1,350 @@ +/***************************************************************************/ +/* */ +/* aftypes.h */ +/* */ +/* Auto-fitter types (specification only). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /************************************************************************* + * + * The auto-fitter is a complete rewrite of the old auto-hinter. + * Its main feature is the ability to differentiate between different + * scripts in order to apply language-specific rules. + * + * The code has also been compartmentized into several entities that + * should make algorithmic experimentation easier than with the old + * code. + * + * Finally, we get rid of the Catharon license, since this code is + * released under the FreeType one. + * + *************************************************************************/ + + +#ifndef __AFTYPES_H__ +#define __AFTYPES_H__ + +#include <ft2build.h> + +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** D E B U G G I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define xxAF_USE_WARPER /* only define to use warp hinting */ +#define xxAF_DEBUG + +#ifdef AF_DEBUG + +#include FT_CONFIG_STANDARD_LIBRARY_H + +#define AF_LOG( x ) do { if ( _af_debug ) printf x; } while ( 0 ) + +extern int _af_debug; +extern int _af_debug_disable_horz_hints; +extern int _af_debug_disable_vert_hints; +extern int _af_debug_disable_blue_hints; +extern void* _af_debug_hints; + +#else /* !AF_DEBUG */ + +#define AF_LOG( x ) do { } while ( 0 ) /* nothing */ + +#endif /* !AF_DEBUG */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** U T I L I T Y S T U F F *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AF_WidthRec_ + { + FT_Pos org; /* original position/width in font units */ + FT_Pos cur; /* current/scaled position/width in device sub-pixels */ + FT_Pos fit; /* current/fitted position/width in device sub-pixels */ + + } AF_WidthRec, *AF_Width; + + + FT_LOCAL( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ); + + FT_LOCAL( void ) + af_sort_widths( FT_UInt count, + AF_Width widths ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** A N G L E T Y P E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The auto-fitter doesn't need a very high angular accuracy; + * this allows us to speed up some computations considerably with a + * light Cordic algorithm (see afangles.c). + */ + + typedef FT_Int AF_Angle; + + +#define AF_ANGLE_PI 256 +#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) +#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) +#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) + + +#if 0 + /* + * compute the angle of a given 2-D vector + */ + FT_LOCAL( AF_Angle ) + af_angle_atan( FT_Pos dx, + FT_Pos dy ); + + + /* + * compute `angle2 - angle1'; the result is always within + * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] + */ + FT_LOCAL( AF_Angle ) + af_angle_diff( AF_Angle angle1, + AF_Angle angle2 ); +#endif /* 0 */ + + +#define AF_ANGLE_DIFF( result, angle1, angle2 ) \ + FT_BEGIN_STMNT \ + AF_Angle _delta = (angle2) - (angle1); \ + \ + \ + _delta %= AF_ANGLE_2PI; \ + if ( _delta < 0 ) \ + _delta += AF_ANGLE_2PI; \ + \ + if ( _delta > AF_ANGLE_PI ) \ + _delta -= AF_ANGLE_2PI; \ + \ + result = _delta; \ + FT_END_STMNT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** O U T L I N E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* opaque handle to glyph-specific hints -- see `afhints.h' for more + * details + */ + typedef struct AF_GlyphHintsRec_* AF_GlyphHints; + + /* This structure is used to model an input glyph outline to + * the auto-hinter. The latter will set the `hints' field + * depending on the glyph's script. + */ + typedef struct AF_OutlineRec_ + { + FT_Face face; + FT_Outline outline; + FT_UInt outline_resolution; + + FT_Int advance; + FT_UInt metrics_resolution; + + AF_GlyphHints hints; + + } AF_OutlineRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C A L E R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * A scaler models the target pixel device that will receive the + * auto-hinted glyph image. + */ + + typedef enum AF_ScalerFlags_ + { + AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */ + AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */ + AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */ + + } AF_ScalerFlags; + + + typedef struct AF_ScalerRec_ + { + FT_Face face; /* source font face */ + FT_Fixed x_scale; /* from font units to 1/64th device pixels */ + FT_Fixed y_scale; /* from font units to 1/64th device pixels */ + FT_Pos x_delta; /* in 1/64th device pixels */ + FT_Pos y_delta; /* in 1/64th device pixels */ + FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ + FT_UInt32 flags; /* additional control flags, see above */ + + } AF_ScalerRec, *AF_Scaler; + + +#define AF_SCALER_EQUAL_SCALES( a, b ) \ + ( (a)->x_scale == (b)->x_scale && \ + (a)->y_scale == (b)->y_scale && \ + (a)->x_delta == (b)->x_delta && \ + (a)->y_delta == (b)->y_delta ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C R I P T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The list of know scripts. Each different script corresponds to the + * following information: + * + * - A set of Unicode ranges to test whether the face supports the + * script. + * + * - A specific global analyzer that will compute global metrics + * specific to the script. + * + * - A specific glyph analyzer that will compute segments and + * edges for each glyph covered by the script. + * + * - A specific grid-fitting algorithm that will distort the + * scaled glyph outline according to the results of the glyph + * analyzer. + * + * Note that a given analyzer and/or grid-fitting algorithm can be + * used by more than one script. + */ + + typedef enum AF_Script_ + { + AF_SCRIPT_NONE = 0, + AF_SCRIPT_LATIN = 1, + AF_SCRIPT_CJK = 2, + AF_SCRIPT_INDIC = 3, +#ifdef FT_OPTION_AUTOFIT2 + AF_SCRIPT_LATIN2, +#endif + + /* add new scripts here. Don't forget to update the list in */ + /* `afglobal.c'. */ + + AF_SCRIPT_MAX /* do not remove */ + + } AF_Script; + + + typedef struct AF_ScriptClassRec_ const* AF_ScriptClass; + + typedef struct AF_ScriptMetricsRec_ + { + AF_ScriptClass clazz; + AF_ScalerRec scaler; + + } AF_ScriptMetricsRec, *AF_ScriptMetrics; + + + /* This function parses an FT_Face to compute global metrics for + * a specific script. + */ + typedef FT_Error + (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics, + FT_Face face ); + + typedef void + (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics, + AF_Scaler scaler ); + + typedef void + (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics ); + + + typedef FT_Error + (*AF_Script_InitHintsFunc)( AF_GlyphHints hints, + AF_ScriptMetrics metrics ); + + typedef void + (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints, + FT_Outline* outline, + AF_ScriptMetrics metrics ); + + + typedef struct AF_Script_UniRangeRec_ + { + FT_UInt32 first; + FT_UInt32 last; + + } AF_Script_UniRangeRec; + + typedef const AF_Script_UniRangeRec *AF_Script_UniRange; + + + typedef struct AF_ScriptClassRec_ + { + AF_Script script; + AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ + + FT_UInt script_metrics_size; + AF_Script_InitMetricsFunc script_metrics_init; + AF_Script_ScaleMetricsFunc script_metrics_scale; + AF_Script_DoneMetricsFunc script_metrics_done; + + AF_Script_InitHintsFunc script_hints_init; + AF_Script_ApplyHintsFunc script_hints_apply; + + } AF_ScriptClassRec; + + +/* */ + +FT_END_HEADER + +#endif /* __AFTYPES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afwarp.c b/src/3rdparty/freetype/src/autofit/afwarp.c new file mode 100644 index 0000000000..f5bb9b18ad --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afwarp.c @@ -0,0 +1,338 @@ +/***************************************************************************/ +/* */ +/* afwarp.c */ +/* */ +/* Auto-fitter warping algorithm (body). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afwarp.h" + +#ifdef AF_USE_WARPER + +#if 1 + static const AF_WarpScore + af_warper_weights[64] = + { + 35, 32, 30, 25, 20, 15, 12, 10, 5, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, + + -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 5, 10, 12, 15, 20, 25, 30, 32, + }; +#else + static const AF_WarpScore + af_warper_weights[64] = + { + 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, + + -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, + }; +#endif + + + static void + af_warper_compute_line_best( AF_Warper warper, + FT_Fixed scale, + FT_Pos delta, + FT_Pos xx1, + FT_Pos xx2, + AF_WarpScore base_distort, + AF_Segment segments, + FT_UInt num_segments ) + { + FT_Int idx_min, idx_max, idx0; + FT_UInt nn; + AF_WarpScore scores[65]; + + + for ( nn = 0; nn < 65; nn++ ) + scores[nn] = 0; + + idx0 = xx1 - warper->t1; + + /* compute minimum and maximum indices */ + { + FT_Pos xx1min = warper->x1min; + FT_Pos xx1max = warper->x1max; + FT_Pos w = xx2 - xx1; + + + if ( xx1min + w < warper->x2min ) + xx1min = warper->x2min - w; + + xx1max = warper->x1max; + if ( xx1max + w > warper->x2max ) + xx1max = warper->x2max - w; + + idx_min = xx1min - warper->t1; + idx_max = xx1max - warper->t1; + + if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 ) + { + AF_LOG(( "invalid indices:\n" + " min=%d max=%d, xx1=%ld xx2=%ld,\n" + " x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n", + idx_min, idx_max, xx1, xx2, + warper->x1min, warper->x1max, + warper->x2min, warper->x2max )); + return; + } + } + + for ( nn = 0; nn < num_segments; nn++ ) + { + FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; + FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; + FT_Pos y = y0 + ( idx_min - idx0 ); + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++, y++ ) + scores[idx] += af_warper_weights[y & 63] * len; + } + + /* find best score */ + { + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++ ) + { + AF_WarpScore score = scores[idx]; + AF_WarpScore distort = base_distort + ( idx - idx0 ); + + + if ( score > warper->best_score || + ( score == warper->best_score && + distort < warper->best_distort ) ) + { + warper->best_score = score; + warper->best_distort = distort; + warper->best_scale = scale; + warper->best_delta = delta + ( idx - idx0 ); + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Pos *a_delta ) + { + AF_AxisHints axis; + AF_Point points; + + FT_Fixed org_scale; + FT_Pos org_delta; + + FT_UInt nn, num_points, num_segments; + FT_Int X1, X2; + FT_Int w; + + AF_WarpScore base_distort; + AF_Segment segments; + + + /* get original scaling transformation */ + if ( dim == AF_DIMENSION_VERT ) + { + org_scale = hints->y_scale; + org_delta = hints->y_delta; + } + else + { + org_scale = hints->x_scale; + org_delta = hints->x_delta; + } + + warper->best_scale = org_scale; + warper->best_delta = org_delta; + warper->best_score = INT_MIN; + warper->best_distort = 0; + + axis = &hints->axis[dim]; + segments = axis->segments; + num_segments = axis->num_segments; + points = hints->points; + num_points = hints->num_points; + + *a_scale = org_scale; + *a_delta = org_delta; + + /* get X1 and X2, minimum and maximum in original coordinates */ + if ( num_segments < 1 ) + return; + +#if 1 + X1 = X2 = points[0].fx; + for ( nn = 1; nn < num_points; nn++ ) + { + FT_Int X = points[nn].fx; + + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } +#else + X1 = X2 = segments[0].pos; + for ( nn = 1; nn < num_segments; nn++ ) + { + FT_Int X = segments[nn].pos; + + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } +#endif + + if ( X1 >= X2 ) + return; + + warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; + warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; + + warper->t1 = AF_WARPER_FLOOR( warper->x1 ); + warper->t2 = AF_WARPER_CEIL( warper->x2 ); + + warper->x1min = warper->x1 & ~31; + warper->x1max = warper->x1min + 32; + warper->x2min = warper->x2 & ~31; + warper->x2max = warper->x2min + 32; + + if ( warper->x1max > warper->x2 ) + warper->x1max = warper->x2; + + if ( warper->x2min < warper->x1 ) + warper->x2min = warper->x1; + + warper->w0 = warper->x2 - warper->x1; + + if ( warper->w0 <= 64 ) + { + warper->x1max = warper->x1; + warper->x2min = warper->x2; + } + + warper->wmin = warper->x2min - warper->x1max; + warper->wmax = warper->x2max - warper->x1min; + +#if 1 + { + int margin = 16; + + + if ( warper->w0 <= 128 ) + { + margin = 8; + if ( warper->w0 <= 96 ) + margin = 4; + } + + if ( warper->wmin < warper->w0 - margin ) + warper->wmin = warper->w0 - margin; + + if ( warper->wmax > warper->w0 + margin ) + warper->wmax = warper->w0 + margin; + } + + if ( warper->wmin < warper->w0 * 3 / 4 ) + warper->wmin = warper->w0 * 3 / 4; + + if ( warper->wmax > warper->w0 * 5 / 4 ) + warper->wmax = warper->w0 * 5 / 4; +#else + /* no scaling, just translation */ + warper->wmin = warper->wmax = warper->w0; +#endif + + for ( w = warper->wmin; w <= warper->wmax; w++ ) + { + FT_Fixed new_scale; + FT_Pos new_delta; + FT_Pos xx1, xx2; + + + xx1 = warper->x1; + xx2 = warper->x2; + if ( w >= warper->w0 ) + { + xx1 -= w - warper->w0; + if ( xx1 < warper->x1min ) + { + xx2 += warper->x1min - xx1; + xx1 = warper->x1min; + } + } + else + { + xx1 -= w - warper->w0; + if ( xx1 > warper->x1max ) + { + xx2 -= xx1 - warper->x1max; + xx1 = warper->x1max; + } + } + + if ( xx1 < warper->x1 ) + base_distort = warper->x1 - xx1; + else + base_distort = xx1 - warper->x1; + + if ( xx2 < warper->x2 ) + base_distort += warper->x2 - xx2; + else + base_distort += xx2 - warper->x2; + + base_distort *= 10; + + new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 ); + new_delta = xx1 - FT_MulFix( X1, new_scale ); + + af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, + base_distort, + segments, num_segments ); + } + + { + FT_Fixed best_scale = warper->best_scale; + FT_Pos best_delta = warper->best_delta; + + + hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale ) + + best_delta; + hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale ) + + best_delta; + + *a_scale = best_scale; + *a_delta = best_delta; + } + } + +#else /* !AF_USE_WARPER */ + +char af_warper_dummy = 0; /* make compiler happy */ + +#endif /* !AF_USE_WARPER */ + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/afwarp.h b/src/3rdparty/freetype/src/autofit/afwarp.h new file mode 100644 index 0000000000..7343fdd5ef --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/afwarp.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* afwarp.h */ +/* */ +/* Auto-fitter warping algorithm (specification). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFWARP_H__ +#define __AFWARP_H__ + +#include "afhints.h" + +FT_BEGIN_HEADER + +#define AF_WARPER_SCALE + +#define AF_WARPER_FLOOR( x ) ( (x) & ~63 ) +#define AF_WARPER_CEIL( x ) AF_WARPER_FLOOR( (x) + 63 ) + + + typedef FT_Int32 AF_WarpScore; + + typedef struct AF_WarperRec_ + { + FT_Pos x1, x2; + FT_Pos t1, t2; + FT_Pos x1min, x1max; + FT_Pos x2min, x2max; + FT_Pos w0, wmin, wmax; + + FT_Fixed best_scale; + FT_Pos best_delta; + AF_WarpScore best_score; + AF_WarpScore best_distort; + + } AF_WarperRec, *AF_Warper; + + + FT_LOCAL( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Fixed *a_delta ); + + +FT_END_HEADER + + +#endif /* __AFWARP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/autofit.c b/src/3rdparty/freetype/src/autofit/autofit.c new file mode 100644 index 0000000000..2fe66a990e --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/autofit.c @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* autofit.c */ +/* */ +/* Auto-fitter module (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include <ft2build.h> +#include "afangles.c" +#include "afglobal.c" +#include "afhints.c" + +#include "afdummy.c" +#include "aflatin.c" +#ifdef FT_OPTION_AUTOFIT2 +#include "aflatin2.c" +#endif +#include "afcjk.c" +#include "afindic.c" + +#include "afloader.c" +#include "afmodule.c" + +#ifdef AF_USE_WARPER +#include "afwarp.c" +#endif + +/* END */ diff --git a/src/3rdparty/freetype/src/autofit/module.mk b/src/3rdparty/freetype/src/autofit/module.mk new file mode 100644 index 0000000000..6ec60912ab --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 auto-fitter module definition +# + + +# Copyright 2003, 2004, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += AUTOFIT_MODULE + +define AUTOFIT_MODULE +$(OPEN_DRIVER) FT_Module_Class, autofit_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)autofit $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/autofit/rules.mk b/src/3rdparty/freetype/src/autofit/rules.mk new file mode 100644 index 0000000000..017489d9e0 --- /dev/null +++ b/src/3rdparty/freetype/src/autofit/rules.mk @@ -0,0 +1,78 @@ +# +# FreeType 2 auto-fitter module configuration rules +# + + +# Copyright 2003, 2004, 2005, 2006, 2007 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# AUTOF driver directory +# +AUTOF_DIR := $(SRC_DIR)/autofit + + +# compilation flags for the driver +# +AUTOF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(AUTOF_DIR)) + + +# AUTOF driver sources (i.e., C files) +# +AUTOF_DRV_SRC := $(AUTOF_DIR)/afangles.c \ + $(AUTOF_DIR)/afcjk.c \ + $(AUTOF_DIR)/afdummy.c \ + $(AUTOF_DIR)/afglobal.c \ + $(AUTOF_DIR)/afhints.c \ + $(AUTOF_DIR)/afindic.c \ + $(AUTOF_DIR)/aflatin.c \ + $(AUTOF_DIR)/afloader.c \ + $(AUTOF_DIR)/afmodule.c \ + $(AUTOF_DIR)/afwarp.c + +# AUTOF driver headers +# +AUTOF_DRV_H := $(AUTOF_DRV_SRC:%c=%h) \ + $(AUTOF_DIR)/aftypes.h \ + $(AUTOF_DIR)/aferrors.h + + +# AUTOF driver object(s) +# +# AUTOF_DRV_OBJ_M is used during `multi' builds. +# AUTOF_DRV_OBJ_S is used during `single' builds. +# +AUTOF_DRV_OBJ_M := $(AUTOF_DRV_SRC:$(AUTOF_DIR)/%.c=$(OBJ_DIR)/%.$O) +AUTOF_DRV_OBJ_S := $(OBJ_DIR)/autofit.$O + +# AUTOF driver source file for single build +# +AUTOF_DRV_SRC_S := $(AUTOF_DIR)/autofit.c + + +# AUTOF driver - single object +# +$(AUTOF_DRV_OBJ_S): $(AUTOF_DRV_SRC_S) $(AUTOF_DRV_SRC) \ + $(FREETYPE_H) $(AUTOF_DRV_H) + $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(AUTOF_DRV_SRC_S)) + + +# AUTOF driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(AUTOF_DIR)/%.c $(FREETYPE_H) $(AUTOF_DRV_H) + $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(AUTOF_DRV_OBJ_S) +DRV_OBJS_M += $(AUTOF_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/base/Jamfile b/src/3rdparty/freetype/src/base/Jamfile new file mode 100644 index 0000000000..aba60fbe0c --- /dev/null +++ b/src/3rdparty/freetype/src/base/Jamfile @@ -0,0 +1,59 @@ +# FreeType 2 src/base Jamfile +# +# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) base ; + + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftadvanc ftcalc ftdbgmem ftgloadr + ftnames ftobjs ftoutln ftrfork + ftstream fttrigon ftutil + ; + } + else + { + _sources = ftbase ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# Add the optional/replaceable files. +# +{ + local _sources = bbox bdf bitmap debug gasp + glyph gxval init lcdfil mm + otval pfr stroke synth system + type1 winfnt xf86 patent + ; + + Library $(FT2_LIB) : ft$(_sources).c ; +} + +# Add Macintosh-specific file to the library when necessary. +# +if $(MAC) +{ + Library $(FT2_LIB) : ftmac.c ; +} +else if $(OS) = MACOSX +{ + if $(FT2_MULTI) + { + Library $(FT2_LIB) : ftmac.c ; + } +} + +# end of src/base Jamfile diff --git a/src/3rdparty/freetype/src/base/ftadvanc.c b/src/3rdparty/freetype/src/base/ftadvanc.c new file mode 100644 index 0000000000..504f9d2309 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftadvanc.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* ftadvanc.c */ +/* */ +/* Quick computation of advance widths (body). */ +/* */ +/* Copyright 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_ADVANCES_H +#include FT_INTERNAL_OBJECTS_H + + + static FT_Error + _ft_face_scale_advances( FT_Face face, + FT_Fixed* advances, + FT_UInt count, + FT_Int32 flags ) + { + FT_Fixed scale; + FT_UInt nn; + + + if ( flags & FT_LOAD_NO_SCALE ) + return FT_Err_Ok; + + if ( face->size == NULL ) + return FT_Err_Invalid_Size_Handle; + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + scale = face->size->metrics.y_scale; + else + scale = face->size->metrics.x_scale; + + /* this must be the same scaling as to get linear{Hori,Vert}Advance */ + /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ + + for ( nn = 0; nn < count; nn++ ) + advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); + + return FT_Err_Ok; + } + + + /* at the moment, we can perform fast advance retrieval only in */ + /* the following cases: */ + /* */ + /* - unscaled load */ + /* - unhinted load */ + /* - light-hinted load */ + +#define LOAD_ADVANCE_FAST_CHECK( flags ) \ + ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ + FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 flags, + FT_Fixed *padvance ) + { + FT_Face_GetAdvancesFunc func; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( gindex >= (FT_UInt)face->num_glyphs ) + return FT_Err_Invalid_Glyph_Index; + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) + { + FT_Error error; + + + error = func( face, gindex, 1, flags, padvance ); + if ( !error ) + return _ft_face_scale_advances( face, padvance, 1, flags ); + + if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) + return error; + } + + return FT_Get_Advances( face, gindex, 1, flags, padvance ); + } + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *padvances ) + { + FT_Face_GetAdvancesFunc func; + FT_UInt num, end, nn; + FT_Error error = FT_Err_Ok; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + num = (FT_UInt)face->num_glyphs; + end = start + count; + if ( start >= num || end < start || end > num ) + return FT_Err_Invalid_Glyph_Index; + + if ( count == 0 ) + return FT_Err_Ok; + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) + { + error = func( face, start, count, flags, padvances ); + if ( !error ) + goto Exit; + + if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) + return error; + } + + error = FT_Err_Ok; + + if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) + return FT_Err_Unimplemented_Feature; + + flags |= FT_LOAD_ADVANCE_ONLY; + for ( nn = 0; nn < count; nn++ ) + { + error = FT_Load_Glyph( face, start + nn, flags ); + if ( error ) + break; + + padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? face->glyph->advance.y + : face->glyph->advance.x; + } + + if ( error ) + return error; + + Exit: + return _ft_face_scale_advances( face, padvances, count, flags ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftapi.c b/src/3rdparty/freetype/src/base/ftapi.c new file mode 100644 index 0000000000..8914d1f4e9 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftapi.c @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* ftapi.c */ +/* */ +/* The FreeType compatibility functions (body). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LIST_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TABLES_H +#include FT_OUTLINE_H + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C O M P A T I B I L I T Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* backwards compatibility API */ + + FT_BASE_DEF( void ) + FT_New_Memory_Stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream stream ) + { + FT_UNUSED( library ); + + FT_Stream_OpenMemory( stream, base, size ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Seek_Stream( FT_Stream stream, + FT_ULong pos ) + { + return FT_Stream_Seek( stream, pos ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Skip_Stream( FT_Stream stream, + FT_Long distance ) + { + return FT_Stream_Skip( stream, distance ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Read_Stream( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_Read( stream, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Read_Stream_At( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Extract_Frame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + return FT_Stream_ExtractFrame( stream, count, pbytes ); + } + + + FT_BASE_DEF( void ) + FT_Release_Frame( FT_Stream stream, + FT_Byte** pbytes ) + { + FT_Stream_ReleaseFrame( stream, pbytes ); + } + + FT_BASE_DEF( FT_Error ) + FT_Access_Frame( FT_Stream stream, + FT_ULong count ) + { + return FT_Stream_EnterFrame( stream, count ); + } + + + FT_BASE_DEF( void ) + FT_Forget_Frame( FT_Stream stream ) + { + FT_Stream_ExitFrame( stream ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftbase.c b/src/3rdparty/freetype/src/base/ftbase.c new file mode 100644 index 0000000000..d1fe6e6088 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftbase.c @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* ftbase.c */ +/* */ +/* Single object library component (body only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ftadvanc.c" +#include "ftcalc.c" +#include "ftdbgmem.c" +#include "ftgloadr.c" +#include "ftnames.c" +#include "ftobjs.c" +#include "ftoutln.c" +#include "ftrfork.c" +#include "ftstream.c" +#include "fttrigon.c" +#include "ftutil.c" + +#if defined( FT_MACINTOSH ) && !defined ( DARWIN_NO_CARBON ) +#include "ftmac.c" +#endif + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftbase.h b/src/3rdparty/freetype/src/base/ftbase.h new file mode 100644 index 0000000000..9cae85da9e --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftbase.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* ftbase.h */ +/* */ +/* The FreeType private functions used in base module (specification). */ +/* */ +/* Copyright 2008 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBASE_H__ +#define __FTBASE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */ + /* font, and try to load a face specified by the face_index. */ + FT_LOCAL_DEF( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ); + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* From ftmac.c. */ + FT_LOCAL_DEF( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ); + + +FT_END_HEADER + +#endif /* __FTBASE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftbbox.c b/src/3rdparty/freetype/src/base/ftbbox.c new file mode 100644 index 0000000000..532ab13579 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftbbox.c @@ -0,0 +1,659 @@ +/***************************************************************************/ +/* */ +/* ftbbox.c */ +/* */ +/* FreeType bbox computation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_BBOX_H +#include FT_IMAGE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_CALC_H + + + typedef struct TBBox_Rec_ + { + FT_Vector last; + FT_BBox bbox; + + } TBBox_Rec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Move_To */ + /* */ + /* <Description> */ + /* This function is used as a `move_to' and `line_to' emitter during */ + /* FT_Outline_Decompose(). It simply records the destination point */ + /* in `user->last'; no further computations are necessary since we */ + /* use the cbox as the starting bbox which must be refined. */ + /* */ + /* <Input> */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: A pointer to the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + static int + BBox_Move_To( FT_Vector* to, + TBBox_Rec* user ) + { + user->last = *to; + + return 0; + } + + +#define CHECK_X( p, bbox ) \ + ( p->x < bbox.xMin || p->x > bbox.xMax ) + +#define CHECK_Y( p, bbox ) \ + ( p->y < bbox.yMin || p->y > bbox.yMax ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Conic_Check */ + /* */ + /* <Description> */ + /* Finds the extrema of a 1-dimensional conic Bezier curve and update */ + /* a bounding range. This version uses direct computation, as it */ + /* doesn't need square roots. */ + /* */ + /* <Input> */ + /* y1 :: The start coordinate. */ + /* */ + /* y2 :: The coordinate of the control point. */ + /* */ + /* y3 :: The end coordinate. */ + /* */ + /* <InOut> */ + /* min :: The address of the current minimum. */ + /* */ + /* max :: The address of the current maximum. */ + /* */ + static void + BBox_Conic_Check( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos* min, + FT_Pos* max ) + { + if ( y1 <= y3 && y2 == y1 ) /* flat arc */ + goto Suite; + + if ( y1 < y3 ) + { + if ( y2 >= y1 && y2 <= y3 ) /* ascending arc */ + goto Suite; + } + else + { + if ( y2 >= y3 && y2 <= y1 ) /* descending arc */ + { + y2 = y1; + y1 = y3; + y3 = y2; + goto Suite; + } + } + + y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 ); + + Suite: + if ( y1 < *min ) *min = y1; + if ( y3 > *max ) *max = y3; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Conic_To */ + /* */ + /* <Description> */ + /* This function is used as a `conic_to' emitter during */ + /* FT_Raster_Decompose(). It checks a conic Bezier curve with the */ + /* current bounding box, and computes its extrema if necessary to */ + /* update it. */ + /* */ + /* <Input> */ + /* control :: A pointer to a control point. */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: The address of the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + /* <Note> */ + /* In the case of a non-monotonous arc, we compute directly the */ + /* extremum coordinates, as it is sufficiently fast. */ + /* */ + static int + BBox_Conic_To( FT_Vector* control, + FT_Vector* to, + TBBox_Rec* user ) + { + /* we don't need to check `to' since it is always an `on' point, thus */ + /* within the bbox */ + + if ( CHECK_X( control, user->bbox ) ) + BBox_Conic_Check( user->last.x, + control->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control, user->bbox ) ) + BBox_Conic_Check( user->last.y, + control->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Cubic_Check */ + /* */ + /* <Description> */ + /* Finds the extrema of a 1-dimensional cubic Bezier curve and */ + /* updates a bounding range. This version uses splitting because we */ + /* don't want to use square roots and extra accuracy. */ + /* */ + /* <Input> */ + /* p1 :: The start coordinate. */ + /* */ + /* p2 :: The coordinate of the first control point. */ + /* */ + /* p3 :: The coordinate of the second control point. */ + /* */ + /* p4 :: The end coordinate. */ + /* */ + /* <InOut> */ + /* min :: The address of the current minimum. */ + /* */ + /* max :: The address of the current maximum. */ + /* */ + +#if 0 + + static void + BBox_Cubic_Check( FT_Pos p1, + FT_Pos p2, + FT_Pos p3, + FT_Pos p4, + FT_Pos* min, + FT_Pos* max ) + { + FT_Pos stack[32*3 + 1], *arc; + + + arc = stack; + + arc[0] = p1; + arc[1] = p2; + arc[2] = p3; + arc[3] = p4; + + do + { + FT_Pos y1 = arc[0]; + FT_Pos y2 = arc[1]; + FT_Pos y3 = arc[2]; + FT_Pos y4 = arc[3]; + + + if ( y1 == y4 ) + { + if ( y1 == y2 && y1 == y3 ) /* flat */ + goto Test; + } + else if ( y1 < y4 ) + { + if ( y2 >= y1 && y2 <= y4 && y3 >= y1 && y3 <= y4 ) /* ascending */ + goto Test; + } + else + { + if ( y2 >= y4 && y2 <= y1 && y3 >= y4 && y3 <= y1 ) /* descending */ + { + y2 = y1; + y1 = y4; + y4 = y2; + goto Test; + } + } + + /* unknown direction -- split the arc in two */ + arc[6] = y4; + arc[1] = y1 = ( y1 + y2 ) / 2; + arc[5] = y4 = ( y4 + y3 ) / 2; + y2 = ( y2 + y3 ) / 2; + arc[2] = y1 = ( y1 + y2 ) / 2; + arc[4] = y4 = ( y4 + y2 ) / 2; + arc[3] = ( y1 + y4 ) / 2; + + arc += 3; + goto Suite; + + Test: + if ( y1 < *min ) *min = y1; + if ( y4 > *max ) *max = y4; + arc -= 3; + + Suite: + ; + } while ( arc >= stack ); + } + +#else + + static void + test_cubic_extrema( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos y4, + FT_Fixed u, + FT_Pos* min, + FT_Pos* max ) + { + /* FT_Pos a = y4 - 3*y3 + 3*y2 - y1; */ + FT_Pos b = y3 - 2*y2 + y1; + FT_Pos c = y2 - y1; + FT_Pos d = y1; + FT_Pos y; + FT_Fixed uu; + + FT_UNUSED ( y4 ); + + + /* The polynomial is */ + /* */ + /* P(x) = a*x^3 + 3b*x^2 + 3c*x + d , */ + /* */ + /* dP/dx = 3a*x^2 + 6b*x + 3c . */ + /* */ + /* However, we also have */ + /* */ + /* dP/dx(u) = 0 , */ + /* */ + /* which implies by subtraction that */ + /* */ + /* P(u) = b*u^2 + 2c*u + d . */ + + if ( u > 0 && u < 0x10000L ) + { + uu = FT_MulFix( u, u ); + y = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu ); + + if ( y < *min ) *min = y; + if ( y > *max ) *max = y; + } + } + + + static void + BBox_Cubic_Check( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos y4, + FT_Pos* min, + FT_Pos* max ) + { + /* always compare first and last points */ + if ( y1 < *min ) *min = y1; + else if ( y1 > *max ) *max = y1; + + if ( y4 < *min ) *min = y4; + else if ( y4 > *max ) *max = y4; + + /* now, try to see if there are split points here */ + if ( y1 <= y4 ) + { + /* flat or ascending arc test */ + if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 ) + return; + } + else /* y1 > y4 */ + { + /* descending arc test */ + if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 ) + return; + } + + /* There are some split points. Find them. */ + { + FT_Pos a = y4 - 3*y3 + 3*y2 - y1; + FT_Pos b = y3 - 2*y2 + y1; + FT_Pos c = y2 - y1; + FT_Pos d; + FT_Fixed t; + + + /* We need to solve `ax^2+2bx+c' here, without floating points! */ + /* The trick is to normalize to a different representation in order */ + /* to use our 16.16 fixed point routines. */ + /* */ + /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */ + /* These values must fit into a single 16.16 value. */ + /* */ + /* We normalize a, b, and c to `8.16' fixed float values to ensure */ + /* that its product is held in a `16.16' value. */ + + { + FT_ULong t1, t2; + int shift = 0; + + + /* The following computation is based on the fact that for */ + /* any value `y', if `n' is the position of the most */ + /* significant bit of `abs(y)' (starting from 0 for the */ + /* least significant bit), then `y' is in the range */ + /* */ + /* -2^n..2^n-1 */ + /* */ + /* We want to shift `a', `b', and `c' concurrently in order */ + /* to ensure that they all fit in 8.16 values, which maps */ + /* to the integer range `-2^23..2^23-1'. */ + /* */ + /* Necessarily, we need to shift `a', `b', and `c' so that */ + /* the most significant bit of its absolute values is at */ + /* _most_ at position 23. */ + /* */ + /* We begin by computing `t1' as the bitwise `OR' of the */ + /* absolute values of `a', `b', `c'. */ + + t1 = (FT_ULong)( ( a >= 0 ) ? a : -a ); + t2 = (FT_ULong)( ( b >= 0 ) ? b : -b ); + t1 |= t2; + t2 = (FT_ULong)( ( c >= 0 ) ? c : -c ); + t1 |= t2; + + /* Now we can be sure that the most significant bit of `t1' */ + /* is the most significant bit of either `a', `b', or `c', */ + /* depending on the greatest integer range of the particular */ + /* variable. */ + /* */ + /* Next, we compute the `shift', by shifting `t1' as many */ + /* times as necessary to move its MSB to position 23. This */ + /* corresponds to a value of `t1' that is in the range */ + /* 0x40_0000..0x7F_FFFF. */ + /* */ + /* Finally, we shift `a', `b', and `c' by the same amount. */ + /* This ensures that all values are now in the range */ + /* -2^23..2^23, i.e., they are now expressed as 8.16 */ + /* fixed-float numbers. This also means that we are using */ + /* 24 bits of precision to compute the zeros, independently */ + /* of the range of the original polynomial coefficients. */ + /* */ + /* This algorithm should ensure reasonably accurate values */ + /* for the zeros. Note that they are only expressed with */ + /* 16 bits when computing the extrema (the zeros need to */ + /* be in 0..1 exclusive to be considered part of the arc). */ + + if ( t1 == 0 ) /* all coefficients are 0! */ + return; + + if ( t1 > 0x7FFFFFUL ) + { + do + { + shift++; + t1 >>= 1; + + } while ( t1 > 0x7FFFFFUL ); + + /* this loses some bits of precision, but we use 24 of them */ + /* for the computation anyway */ + a >>= shift; + b >>= shift; + c >>= shift; + } + else if ( t1 < 0x400000UL ) + { + do + { + shift++; + t1 <<= 1; + + } while ( t1 < 0x400000UL ); + + a <<= shift; + b <<= shift; + c <<= shift; + } + } + + /* handle a == 0 */ + if ( a == 0 ) + { + if ( b != 0 ) + { + t = - FT_DivFix( c, b ) / 2; + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + } + else + { + /* solve the equation now */ + d = FT_MulFix( b, b ) - FT_MulFix( a, c ); + if ( d < 0 ) + return; + + if ( d == 0 ) + { + /* there is a single split point at -b/a */ + t = - FT_DivFix( b, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + else + { + /* there are two solutions; we need to filter them */ + d = FT_SqrtFixed( (FT_Int32)d ); + t = - FT_DivFix( b - d, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + + t = - FT_DivFix( b + d, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + } + } + } + +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Cubic_To */ + /* */ + /* <Description> */ + /* This function is used as a `cubic_to' emitter during */ + /* FT_Raster_Decompose(). It checks a cubic Bezier curve with the */ + /* current bounding box, and computes its extrema if necessary to */ + /* update it. */ + /* */ + /* <Input> */ + /* control1 :: A pointer to the first control point. */ + /* */ + /* control2 :: A pointer to the second control point. */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: The address of the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + /* <Note> */ + /* In the case of a non-monotonous arc, we don't compute directly */ + /* extremum coordinates, we subdivide instead. */ + /* */ + static int + BBox_Cubic_To( FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to, + TBBox_Rec* user ) + { + /* we don't need to check `to' since it is always an `on' point, thus */ + /* within the bbox */ + + if ( CHECK_X( control1, user->bbox ) || + CHECK_X( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.x, + control1->x, + control2->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control1, user->bbox ) || + CHECK_Y( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.y, + control1->y, + control2->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + + + /* documentation is in ftbbox.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ) + { + FT_BBox cbox; + FT_BBox bbox; + FT_Vector* vec; + FT_UShort n; + + + if ( !abbox ) + return FT_Err_Invalid_Argument; + + if ( !outline ) + return FT_Err_Invalid_Outline; + + /* if outline is empty, return (0,0,0,0) */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + { + abbox->xMin = abbox->xMax = 0; + abbox->yMin = abbox->yMax = 0; + return 0; + } + + /* We compute the control box as well as the bounding box of */ + /* all `on' points in the outline. Then, if the two boxes */ + /* coincide, we exit immediately. */ + + vec = outline->points; + bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x; + bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y; + vec++; + + for ( n = 1; n < outline->n_points; n++ ) + { + FT_Pos x = vec->x; + FT_Pos y = vec->y; + + + /* update control box */ + if ( x < cbox.xMin ) cbox.xMin = x; + if ( x > cbox.xMax ) cbox.xMax = x; + + if ( y < cbox.yMin ) cbox.yMin = y; + if ( y > cbox.yMax ) cbox.yMax = y; + + if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON ) + { + /* update bbox for `on' points only */ + if ( x < bbox.xMin ) bbox.xMin = x; + if ( x > bbox.xMax ) bbox.xMax = x; + + if ( y < bbox.yMin ) bbox.yMin = y; + if ( y > bbox.yMax ) bbox.yMax = y; + } + + vec++; + } + + /* test two boxes for equality */ + if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax || + cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax ) + { + /* the two boxes are different, now walk over the outline to */ + /* get the Bezier arc extrema. */ + + static const FT_Outline_Funcs bbox_interface = + { + (FT_Outline_MoveTo_Func) BBox_Move_To, + (FT_Outline_LineTo_Func) BBox_Move_To, + (FT_Outline_ConicTo_Func)BBox_Conic_To, + (FT_Outline_CubicTo_Func)BBox_Cubic_To, + 0, 0 + }; + + FT_Error error; + TBBox_Rec user; + + + user.bbox = bbox; + + error = FT_Outline_Decompose( outline, &bbox_interface, &user ); + if ( error ) + return error; + + *abbox = user.bbox; + } + else + *abbox = bbox; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftbdf.c b/src/3rdparty/freetype/src/base/ftbdf.c new file mode 100644 index 0000000000..d29adf09dd --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftbdf.c @@ -0,0 +1,88 @@ +/***************************************************************************/ +/* */ +/* ftbdf.c */ +/* */ +/* FreeType API for accessing BDF-specific strings (body). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_BDF_H + + + /* documentation is in ftbdf.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + FT_Error error; + const char* encoding = NULL; + const char* registry = NULL; + + + error = FT_Err_Invalid_Argument; + + if ( face ) + { + FT_Service_BDF service; + + + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_charset_id ) + error = service->get_charset_id( face, &encoding, ®istry ); + } + + if ( acharset_encoding ) + *acharset_encoding = encoding; + + if ( acharset_registry ) + *acharset_registry = registry; + + return error; + } + + + /* documentation is in ftbdf.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + FT_Error error; + + + error = FT_Err_Invalid_Argument; + + aproperty->type = BDF_PROPERTY_TYPE_NONE; + + if ( face ) + { + FT_Service_BDF service; + + + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_property ) + error = service->get_property( face, prop_name, aproperty ); + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftbitmap.c b/src/3rdparty/freetype/src/base/ftbitmap.c new file mode 100644 index 0000000000..8810cfadf3 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftbitmap.c @@ -0,0 +1,659 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.c */ +/* */ +/* FreeType utility functions for bitmaps (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_BITMAP_H +#include FT_IMAGE_H +#include FT_INTERNAL_OBJECTS_H + + + static + const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ) + { + *abitmap = null_bitmap; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target) + { + FT_Memory memory = library->memory; + FT_Error error = FT_Err_Ok; + FT_Int pitch = source->pitch; + FT_ULong size; + + + if ( source == target ) + return FT_Err_Ok; + + if ( source->buffer == NULL ) + { + *target = *source; + + return FT_Err_Ok; + } + + if ( pitch < 0 ) + pitch = -pitch; + size = (FT_ULong)( pitch * source->rows ); + + if ( target->buffer ) + { + FT_Int target_pitch = target->pitch; + FT_ULong target_size; + + + if ( target_pitch < 0 ) + target_pitch = -target_pitch; + target_size = (FT_ULong)( target_pitch * target->rows ); + + if ( target_size != size ) + (void)FT_QREALLOC( target->buffer, target_size, size ); + } + else + (void)FT_QALLOC( target->buffer, size ); + + if ( !error ) + { + unsigned char *p; + + + p = target->buffer; + *target = *source; + target->buffer = p; + + FT_MEM_COPY( target->buffer, source->buffer, size ); + } + + return error; + } + + + static FT_Error + ft_bitmap_assure_buffer( FT_Memory memory, + FT_Bitmap* bitmap, + FT_UInt xpixels, + FT_UInt ypixels ) + { + FT_Error error; + int pitch; + int new_pitch; + FT_UInt bpp; + FT_Int i, width, height; + unsigned char* buffer; + + + width = bitmap->width; + height = bitmap->rows; + pitch = bitmap->pitch; + if ( pitch < 0 ) + pitch = -pitch; + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + bpp = 1; + new_pitch = ( width + xpixels + 7 ) >> 3; + break; + case FT_PIXEL_MODE_GRAY2: + bpp = 2; + new_pitch = ( width + xpixels + 3 ) >> 2; + break; + case FT_PIXEL_MODE_GRAY4: + bpp = 4; + new_pitch = ( width + xpixels + 1 ) >> 1; + break; + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + bpp = 8; + new_pitch = ( width + xpixels ); + break; + default: + return FT_Err_Invalid_Glyph_Format; + } + + /* if no need to allocate memory */ + if ( ypixels == 0 && new_pitch <= pitch ) + { + /* zero the padding */ + FT_Int bit_width = pitch * 8; + FT_Int bit_last = ( width + xpixels ) * bpp; + + + if ( bit_last < bit_width ) + { + FT_Byte* line = bitmap->buffer + ( bit_last >> 3 ); + FT_Byte* end = bitmap->buffer + pitch; + FT_Int shift = bit_last & 7; + FT_UInt mask = 0xFF00U >> shift; + FT_Int count = height; + + + for ( ; count > 0; count--, line += pitch, end += pitch ) + { + FT_Byte* write = line; + + + if ( shift > 0 ) + { + write[0] = (FT_Byte)( write[0] & mask ); + write++; + } + if ( write < end ) + FT_MEM_ZERO( write, end-write ); + } + } + + return FT_Err_Ok; + } + + if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) ) + return error; + + if ( bitmap->pitch > 0 ) + { + FT_Int len = ( width * bpp + 7 ) >> 3; + + + for ( i = 0; i < bitmap->rows; i++ ) + FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ), + bitmap->buffer + pitch * i, len ); + } + else + { + FT_Int len = ( width * bpp + 7 ) >> 3; + + + for ( i = 0; i < bitmap->rows; i++ ) + FT_MEM_COPY( buffer + new_pitch * i, + bitmap->buffer + pitch * i, len ); + } + + FT_FREE( bitmap->buffer ); + bitmap->buffer = buffer; + + if ( bitmap->pitch < 0 ) + new_pitch = -new_pitch; + + /* set pitch only, width and height are left untouched */ + bitmap->pitch = new_pitch; + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ) + { + FT_Error error; + unsigned char* p; + FT_Int i, x, y, pitch; + FT_Int xstr, ystr; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !bitmap || !bitmap->buffer ) + return FT_Err_Invalid_Argument; + + xstr = FT_PIX_ROUND( xStrength ) >> 6; + ystr = FT_PIX_ROUND( yStrength ) >> 6; + + if ( xstr == 0 && ystr == 0 ) + return FT_Err_Ok; + else if ( xstr < 0 || ystr < 0 ) + return FT_Err_Invalid_Argument; + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + { + FT_Bitmap tmp; + FT_Int align; + + + if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 ) + align = ( bitmap->width + xstr + 3 ) / 4; + else + align = ( bitmap->width + xstr + 1 ) / 2; + + FT_Bitmap_New( &tmp ); + + error = FT_Bitmap_Convert( library, bitmap, &tmp, align ); + if ( error ) + return error; + + FT_Bitmap_Done( library, bitmap ); + *bitmap = tmp; + } + break; + + case FT_PIXEL_MODE_MONO: + if ( xstr > 8 ) + xstr = 8; + break; + + case FT_PIXEL_MODE_LCD: + xstr *= 3; + break; + + case FT_PIXEL_MODE_LCD_V: + ystr *= 3; + break; + } + + error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr ); + if ( error ) + return error; + + pitch = bitmap->pitch; + if ( pitch > 0 ) + p = bitmap->buffer + pitch * ystr; + else + { + pitch = -pitch; + p = bitmap->buffer + pitch * ( bitmap->rows - 1 ); + } + + /* for each row */ + for ( y = 0; y < bitmap->rows ; y++ ) + { + /* + * Horizontally: + * + * From the last pixel on, make each pixel or'ed with the + * `xstr' pixels before it. + */ + for ( x = pitch - 1; x >= 0; x-- ) + { + unsigned char tmp; + + + tmp = p[x]; + for ( i = 1; i <= xstr; i++ ) + { + if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO ) + { + p[x] |= tmp >> i; + + /* the maximum value of 8 for `xstr' comes from here */ + if ( x > 0 ) + p[x] |= p[x - 1] << ( 8 - i ); + +#if 0 + if ( p[x] == 0xff ) + break; +#endif + } + else + { + if ( x - i >= 0 ) + { + if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) + { + p[x] = (unsigned char)(bitmap->num_grays - 1); + break; + } + else + { + p[x] = (unsigned char)(p[x] + p[x-i]); + if ( p[x] == bitmap->num_grays - 1 ) + break; + } + } + else + break; + } + } + } + + /* + * Vertically: + * + * Make the above `ystr' rows or'ed with it. + */ + for ( x = 1; x <= ystr; x++ ) + { + unsigned char* q; + + + q = p - bitmap->pitch * x; + for ( i = 0; i < pitch; i++ ) + q[i] |= p[i]; + } + + p += bitmap->pitch; + } + + bitmap->width += xstr; + bitmap->rows += ystr; + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + memory = library->memory; + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + { + FT_Int pad; + FT_Long old_size; + + + old_size = target->rows * target->pitch; + if ( old_size < 0 ) + old_size = -old_size; + + target->pixel_mode = FT_PIXEL_MODE_GRAY; + target->rows = source->rows; + target->width = source->width; + + pad = 0; + if ( alignment > 0 ) + { + pad = source->width % alignment; + if ( pad != 0 ) + pad = alignment - pad; + } + + target->pitch = source->width + pad; + + if ( target->rows * target->pitch > old_size && + FT_QREALLOC( target->buffer, + old_size, target->rows * target->pitch ) ) + return error; + } + break; + + default: + error = FT_Err_Invalid_Argument; + } + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 2; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 3; j > 0; j-- ) + { + FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ + + + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); + tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); + tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); + tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); + tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); + tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); + tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); + tt[7] = (FT_Byte)( val & 0x01 ); + + tt += 8; + ss += 1; + } + + /* get remaining pixels (if any) */ + j = source->width & 7; + if ( j > 0 ) + { + FT_Int val = *ss; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); + val <<= 1; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + { + FT_Int width = source->width; + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int s_pitch = source->pitch; + FT_Int t_pitch = target->pitch; + FT_Int i; + + + target->num_grays = 256; + + for ( i = source->rows; i > 0; i-- ) + { + FT_ARRAY_COPY( t, s, width ); + + s += s_pitch; + t += t_pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY2: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 4; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 2; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 ); + tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 ); + tt[3] = (FT_Byte)( ( val & 0x03 ) ); + + ss += 1; + tt += 4; + } + + j = source->width & 3; + if ( j > 0 ) + { + FT_Int val = ss[0]; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + val <<= 2; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY4: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 16; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 1; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 ); + tt[1] = (FT_Byte)( ( val & 0x0F ) ); + + ss += 1; + tt += 2; + } + + if ( source->width & 1 ) + tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); + + s += source->pitch; + t += target->pitch; + } + } + break; + + + default: + ; + } + + return error; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ) + { + if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP && + !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Bitmap bitmap; + FT_Error error; + + + FT_Bitmap_New( &bitmap ); + error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap ); + if ( error ) + return error; + + slot->bitmap = bitmap; + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ) + { + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !bitmap ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + FT_FREE( bitmap->buffer ); + *bitmap = null_bitmap; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftcalc.c b/src/3rdparty/freetype/src/base/ftcalc.c new file mode 100644 index 0000000000..04295a6931 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftcalc.c @@ -0,0 +1,953 @@ +/***************************************************************************/ +/* */ +/* ftcalc.c */ +/* */ +/* Arithmetic computations (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Support for 1-complement arithmetic has been totally dropped in this */ + /* release. You can still write your own code if you need it. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Implementing basic computation routines. */ + /* */ + /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */ + /* and FT_FloorFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_GLYPH_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + +#ifdef FT_MULFIX_INLINED +#undef FT_MulFix +#endif + +/* we need to define a 64-bits data type here */ + +#ifdef FT_LONG64 + + typedef FT_INT64 FT_Int64; + +#else + + typedef struct FT_Int64_ + { + FT_UInt32 lo; + FT_UInt32 hi; + + } FT_Int64; + +#endif /* FT_LONG64 */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_calc + + + /* The following three functions are available regardless of whether */ + /* FT_LONG64 is defined. */ + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_RoundFix( FT_Fixed a ) + { + return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL + : -((-a + 0x8000L ) & ~0xFFFFL ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_CeilFix( FT_Fixed a ) + { + return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL + : -((-a + 0xFFFFL ) & ~0xFFFFL ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_FloorFix( FT_Fixed a ) + { + return ( a >= 0 ) ? a & ~0xFFFFL + : -((-a) & ~0xFFFFL ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( FT_Int32 ) + FT_Sqrt32( FT_Int32 x ) + { + FT_ULong val, root, newroot, mask; + + + root = 0; + mask = 0x40000000L; + val = (FT_ULong)x; + + do + { + newroot = root + mask; + if ( newroot <= val ) + { + val -= newroot; + root = newroot + mask; + } + + root >>= 1; + mask >>= 2; + + } while ( mask != 0 ); + + return root; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +#ifdef FT_LONG64 + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( a, b ); + +#else + + FT_Int s = 1; + FT_Long c; + + + if ( a < 0 ) + { + a = -a; + s = -1; + } + + if ( b < 0 ) + { + b = -b; + s = -s; + } + + c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 ); + + return ( s > 0 ) ? c : -c; + +#endif /* FT_MULFIX_ASSEMBLER */ + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ) + { + FT_Int32 s; + FT_UInt32 q; + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + + if ( b == 0 ) + /* check for division by 0 */ + q = 0x7FFFFFFFL; + else + /* compute result directly */ + q = (FT_UInt32)( ( ( (FT_Int64)a << 16 ) + ( b >> 1 ) ) / b ); + + return ( s < 0 ? -(FT_Long)q : (FT_Long)q ); + } + + +#else /* !FT_LONG64 */ + + + static void + ft_multo64( FT_UInt32 x, + FT_UInt32 y, + FT_Int64 *z ) + { + FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; + + + lo1 = x & 0x0000FFFFU; hi1 = x >> 16; + lo2 = y & 0x0000FFFFU; hi2 = y >> 16; + + lo = lo1 * lo2; + i1 = lo1 * hi2; + i2 = lo2 * hi1; + hi = hi1 * hi2; + + /* Check carry overflow of i1 + i2 */ + i1 += i2; + hi += (FT_UInt32)( i1 < i2 ) << 16; + + hi += i1 >> 16; + i1 = i1 << 16; + + /* Check carry overflow of i1 + lo */ + lo += i1; + hi += ( lo < i1 ); + + z->lo = lo; + z->hi = hi; + } + + + static FT_UInt32 + ft_div64by32( FT_UInt32 hi, + FT_UInt32 lo, + FT_UInt32 y ) + { + FT_UInt32 r, q; + FT_Int i; + + + q = 0; + r = hi; + + if ( r >= y ) + return (FT_UInt32)0x7FFFFFFFL; + + i = 32; + do + { + r <<= 1; + q <<= 1; + r |= lo >> 31; + + if ( r >= (FT_UInt32)y ) + { + r -= y; + q |= 1; + } + lo <<= 1; + } while ( --i ); + + return q; + } + + + static void + FT_Add64( FT_Int64* x, + FT_Int64* y, + FT_Int64 *z ) + { + register FT_UInt32 lo, hi; + + + lo = x->lo + y->lo; + hi = x->hi + y->hi + ( lo < x->lo ); + + z->lo = lo; + z->hi = hi; + } + + + /* documentation is in freetype.h */ + + /* The FT_MulDiv function has been optimized thanks to ideas from */ + /* Graham Asher. The trick is to optimize computation when everything */ + /* fits within 32-bits (a rather common case). */ + /* */ + /* we compute 'a*b+c/2', then divide it by 'c'. (positive values) */ + /* */ + /* 46340 is FLOOR(SQRT(2^31-1)). */ + /* */ + /* if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 ) */ + /* */ + /* 0x7FFFFFFF - 0x7FFEA810 = 0x157F0 */ + /* */ + /* if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF ) */ + /* */ + /* and 2*0x157F0 = 176096 */ + /* */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + long s; + + + if ( a == 0 || b == c ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + s ^= c; c = FT_ABS( c ); + + if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) + a = ( a * b + ( c >> 1 ) ) / c; + + else if ( c > 0 ) + { + FT_Int64 temp, temp2; + + + ft_multo64( a, b, &temp ); + + temp2.hi = 0; + temp2.lo = (FT_UInt32)(c >> 1); + FT_Add64( &temp, &temp2, &temp ); + a = ft_div64by32( temp.hi, temp.lo, c ); + } + else + a = 0x7FFFFFFFL; + + return ( s < 0 ? -a : a ); + } + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + long s; + + + if ( a == 0 || b == c ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + s ^= c; c = FT_ABS( c ); + + if ( a <= 46340L && b <= 46340L && c > 0 ) + a = a * b / c; + + else if ( c > 0 ) + { + FT_Int64 temp; + + + ft_multo64( a, b, &temp ); + a = ft_div64by32( temp.hi, temp.lo, c ); + } + else + a = 0x7FFFFFFFL; + + return ( s < 0 ? -a : a ); + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( a, b ); + +#elif 0 + + /* + * This code is nonportable. See comment below. + * + * However, on a platform where right-shift of a signed quantity fills + * the leftmost bits by copying the sign bit, it might be faster. + */ + + FT_Long sa, sb; + FT_ULong ua, ub; + + + if ( a == 0 || b == 0x10000L ) + return a; + + /* + * This is a clever way of converting a signed number `a' into its + * absolute value (stored back into `a') and its sign. The sign is + * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' + * was negative. (Similarly for `b' and `sb'). + * + * Unfortunately, it doesn't work (at least not portably). + * + * It makes the assumption that right-shift on a negative signed value + * fills the leftmost bits by copying the sign bit. This is wrong. + * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, + * the result of right-shift of a negative signed value is + * implementation-defined. At least one implementation fills the + * leftmost bits with 0s (i.e., it is exactly the same as an unsigned + * right shift). This means that when `a' is negative, `sa' ends up + * with the value 1 rather than -1. After that, everything else goes + * wrong. + */ + sa = ( a >> ( sizeof ( a ) * 8 - 1 ) ); + a = ( a ^ sa ) - sa; + sb = ( b >> ( sizeof ( b ) * 8 - 1 ) ); + b = ( b ^ sb ) - sb; + + ua = (FT_ULong)a; + ub = (FT_ULong)b; + + if ( ua <= 2048 && ub <= 1048576L ) + ua = ( ua * ub + 0x8000U ) >> 16; + else + { + FT_ULong al = ua & 0xFFFFU; + + + ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + + ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 ); + } + + sa ^= sb, + ua = (FT_ULong)(( ua ^ sa ) - sa); + + return (FT_Long)ua; + +#else /* 0 */ + + FT_Long s; + FT_ULong ua, ub; + + + if ( a == 0 || b == 0x10000L ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + + ua = (FT_ULong)a; + ub = (FT_ULong)b; + + if ( ua <= 2048 && ub <= 1048576L ) + ua = ( ua * ub + 0x8000UL ) >> 16; + else + { + FT_ULong al = ua & 0xFFFFUL; + + + ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + + ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 ); + } + + return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua ); + +#endif /* 0 */ + + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ) + { + FT_Int32 s; + FT_UInt32 q; + + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + + if ( b == 0 ) + { + /* check for division by 0 */ + q = 0x7FFFFFFFL; + } + else if ( ( a >> 16 ) == 0 ) + { + /* compute result directly */ + q = (FT_UInt32)( (a << 16) + (b >> 1) ) / (FT_UInt32)b; + } + else + { + /* we need more bits; we have to do it by hand */ + FT_Int64 temp, temp2; + + temp.hi = (FT_Int32) (a >> 16); + temp.lo = (FT_UInt32)(a << 16); + temp2.hi = 0; + temp2.lo = (FT_UInt32)( b >> 1 ); + FT_Add64( &temp, &temp2, &temp ); + q = ft_div64by32( temp.hi, temp.lo, b ); + } + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + +#if 0 + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( void ) + FT_MulTo64( FT_Int32 x, + FT_Int32 y, + FT_Int64 *z ) + { + FT_Int32 s; + + + s = x; x = FT_ABS( x ); + s ^= y; y = FT_ABS( y ); + + ft_multo64( x, y, z ); + + if ( s < 0 ) + { + z->lo = (FT_UInt32)-(FT_Int32)z->lo; + z->hi = ~z->hi + !( z->lo ); + } + } + + + /* apparently, the second version of this code is not compiled correctly */ + /* on Mac machines with the MPW C compiler.. tsk, tsk, tsk... */ + +#if 1 + + FT_EXPORT_DEF( FT_Int32 ) + FT_Div64by32( FT_Int64* x, + FT_Int32 y ) + { + FT_Int32 s; + FT_UInt32 q, r, i, lo; + + + s = x->hi; + if ( s < 0 ) + { + x->lo = (FT_UInt32)-(FT_Int32)x->lo; + x->hi = ~x->hi + !x->lo; + } + s ^= y; y = FT_ABS( y ); + + /* Shortcut */ + if ( x->hi == 0 ) + { + if ( y > 0 ) + q = x->lo / y; + else + q = 0x7FFFFFFFL; + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + r = x->hi; + lo = x->lo; + + if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */ + return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL ); + /* Return Max/Min Int32 if division overflow. */ + /* This includes division by zero! */ + q = 0; + for ( i = 0; i < 32; i++ ) + { + r <<= 1; + q <<= 1; + r |= lo >> 31; + + if ( r >= (FT_UInt32)y ) + { + r -= y; + q |= 1; + } + lo <<= 1; + } + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + +#else /* 0 */ + + FT_EXPORT_DEF( FT_Int32 ) + FT_Div64by32( FT_Int64* x, + FT_Int32 y ) + { + FT_Int32 s; + FT_UInt32 q; + + + s = x->hi; + if ( s < 0 ) + { + x->lo = (FT_UInt32)-(FT_Int32)x->lo; + x->hi = ~x->hi + !x->lo; + } + s ^= y; y = FT_ABS( y ); + + /* Shortcut */ + if ( x->hi == 0 ) + { + if ( y > 0 ) + q = ( x->lo + ( y >> 1 ) ) / y; + else + q = 0x7FFFFFFFL; + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + q = ft_div64by32( x->hi, x->lo, y ); + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + +#endif /* 0 */ + +#endif /* 0 */ + + +#endif /* FT_LONG64 */ + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix *b ) + { + FT_Fixed xx, xy, yx, yy; + + + if ( !a || !b ) + return; + + xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx ); + xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy ); + yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx ); + yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy ); + + b->xx = xx; b->xy = xy; + b->yx = yx; b->yy = yy; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ) + { + FT_Pos delta, xx, yy; + + + if ( !matrix ) + return FT_Err_Invalid_Argument; + + /* compute discriminant */ + delta = FT_MulFix( matrix->xx, matrix->yy ) - + FT_MulFix( matrix->xy, matrix->yx ); + + if ( !delta ) + return FT_Err_Invalid_Argument; /* matrix can't be inverted */ + + matrix->xy = - FT_DivFix( matrix->xy, delta ); + matrix->yx = - FT_DivFix( matrix->yx, delta ); + + xx = matrix->xx; + yy = matrix->yy; + + matrix->xx = FT_DivFix( yy, delta ); + matrix->yy = FT_DivFix( xx, delta ); + + return FT_Err_Ok; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ) + { + FT_Fixed xx, xy, yx, yy; + + FT_Long val = 0x10000L * scaling; + + + if ( !a || !b ) + return; + + xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val ); + xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val ); + yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val ); + yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val ); + + b->xx = xx; b->xy = xy; + b->yx = yx; b->yy = yy; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ) + { + FT_Pos xz, yz; + + FT_Long val = 0x10000L * scaling; + + + if ( !vector || !matrix ) + return; + + xz = FT_MulDiv( vector->x, matrix->xx, val ) + + FT_MulDiv( vector->y, matrix->xy, val ); + + yz = FT_MulDiv( vector->x, matrix->yx, val ) + + FT_MulDiv( vector->y, matrix->yy, val ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ) + { + FT_UInt32 root, rem_hi, rem_lo, test_div; + FT_Int count; + + + root = 0; + + if ( x > 0 ) + { + rem_hi = 0; + rem_lo = x; + count = 24; + do + { + rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); + rem_lo <<= 2; + root <<= 1; + test_div = ( root << 1 ) + 1; + + if ( rem_hi >= test_div ) + { + rem_hi -= test_div; + root += 1; + } + } while ( --count ); + } + + return (FT_Int32)root; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Int result; + + + /* deal with the trivial cases quickly */ + if ( in_y == 0 ) + { + if ( in_x >= 0 ) + result = out_y; + else + result = -out_y; + } + else if ( in_x == 0 ) + { + if ( in_y >= 0 ) + result = -out_x; + else + result = out_x; + } + else if ( out_y == 0 ) + { + if ( out_x >= 0 ) + result = in_y; + else + result = -in_y; + } + else if ( out_x == 0 ) + { + if ( out_y >= 0 ) + result = -in_x; + else + result = in_x; + } + else /* general case */ + { +#ifdef FT_LONG64 + + FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x; + + + if ( delta == 0 ) + result = 0; + else + result = 1 - 2 * ( delta < 0 ); + +#else + + FT_Int64 z1, z2; + + + ft_multo64( in_x, out_y, &z1 ); + ft_multo64( in_y, out_x, &z2 ); + + if ( z1.hi > z2.hi ) + result = +1; + else if ( z1.hi < z2.hi ) + result = -1; + else if ( z1.lo > z2.lo ) + result = +1; + else if ( z1.lo < z2.lo ) + result = -1; + else + result = 0; + +#endif + } + + return result; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Pos ax = in_x; + FT_Pos ay = in_y; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = out_x; + if ( ax < 0 ) + ax = -ax; + ay = out_y; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = out_x + in_x; + if ( ax < 0 ) + ax = -ax; + ay = out_y + in_y; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftcid.c b/src/3rdparty/freetype/src/base/ftcid.c new file mode 100644 index 0000000000..733aae1475 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftcid.c @@ -0,0 +1,117 @@ +/***************************************************************************/ +/* */ +/* ftcid.c */ +/* */ +/* FreeType API for accessing CID font information. */ +/* */ +/* Copyright 2007, 2009 by Derek Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CID_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_CID_H + + + /* documentation is in ftcid.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement) + { + FT_Error error; + const char* r = NULL; + const char* o = NULL; + FT_Int s = 0; + + + error = FT_Err_Invalid_Argument; + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_ros ) + error = service->get_ros( face, &r, &o, &s ); + } + + if ( registry ) + *registry = r; + + if ( ordering ) + *ordering = o; + + if ( supplement ) + *supplement = s; + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Bool ic = 0; + + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_is_cid ) + error = service->get_is_cid( face, &ic); + } + + if ( is_cid ) + *is_cid = ic; + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_UInt c = 0; + + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_cid_from_glyph_index ) + error = service->get_cid_from_glyph_index( face, glyph_index, &c); + } + + if ( cid ) + *cid = c; + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftdbgmem.c b/src/3rdparty/freetype/src/base/ftdbgmem.c new file mode 100644 index 0000000000..8b2a3304f0 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftdbgmem.c @@ -0,0 +1,997 @@ +/***************************************************************************/ +/* */ +/* ftdbgmem.c */ +/* */ +/* Memory debugger (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_MEMORY_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +#ifdef FT_DEBUG_MEMORY + +#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released + * to the heap. This is useful to detect double-frees + * or weird heap corruption, but it uses large amounts of + * memory, however. + */ + +#include FT_CONFIG_STANDARD_LIBRARY_H + + FT_BASE_DEF( const char* ) _ft_debug_file = 0; + FT_BASE_DEF( long ) _ft_debug_lineno = 0; + + extern void + FT_DumpMemory( FT_Memory memory ); + + + typedef struct FT_MemSourceRec_* FT_MemSource; + typedef struct FT_MemNodeRec_* FT_MemNode; + typedef struct FT_MemTableRec_* FT_MemTable; + + +#define FT_MEM_VAL( addr ) ((FT_ULong)(FT_Pointer)( addr )) + + /* + * This structure holds statistics for a single allocation/release + * site. This is useful to know where memory operations happen the + * most. + */ + typedef struct FT_MemSourceRec_ + { + const char* file_name; + long line_no; + + FT_Long cur_blocks; /* current number of allocated blocks */ + FT_Long max_blocks; /* max. number of allocated blocks */ + FT_Long all_blocks; /* total number of blocks allocated */ + + FT_Long cur_size; /* current cumulative allocated size */ + FT_Long max_size; /* maximum cumulative allocated size */ + FT_Long all_size; /* total cumulative allocated size */ + + FT_Long cur_max; /* current maximum allocated size */ + + FT_UInt32 hash; + FT_MemSource link; + + } FT_MemSourceRec; + + + /* + * We don't need a resizable array for the memory sources, because + * their number is pretty limited within FreeType. + */ +#define FT_MEM_SOURCE_BUCKETS 128 + + /* + * This structure holds information related to a single allocated + * memory block. If KEEPALIVE is defined, blocks that are freed by + * FreeType are never released to the system. Instead, their `size' + * field is set to -size. This is mainly useful to detect double frees, + * at the price of large memory footprint during execution. + */ + typedef struct FT_MemNodeRec_ + { + FT_Byte* address; + FT_Long size; /* < 0 if the block was freed */ + + FT_MemSource source; + +#ifdef KEEPALIVE + const char* free_file_name; + FT_Long free_line_no; +#endif + + FT_MemNode link; + + } FT_MemNodeRec; + + + /* + * The global structure, containing compound statistics and all hash + * tables. + */ + typedef struct FT_MemTableRec_ + { + FT_ULong size; + FT_ULong nodes; + FT_MemNode* buckets; + + FT_ULong alloc_total; + FT_ULong alloc_current; + FT_ULong alloc_max; + FT_ULong alloc_count; + + FT_Bool bound_total; + FT_ULong alloc_total_max; + + FT_Bool bound_count; + FT_ULong alloc_count_max; + + FT_MemSource sources[FT_MEM_SOURCE_BUCKETS]; + + FT_Bool keep_alive; + + FT_Memory memory; + FT_Pointer memory_user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemTableRec; + + +#define FT_MEM_SIZE_MIN 7 +#define FT_MEM_SIZE_MAX 13845163 + +#define FT_FILENAME( x ) ((x) ? (x) : "unknown file") + + + /* + * Prime numbers are ugly to handle. It would be better to implement + * L-Hashing, which is 10% faster and doesn't require divisions. + */ + static const FT_UInt ft_mem_primes[] = + { + 7, + 11, + 19, + 37, + 73, + 109, + 163, + 251, + 367, + 557, + 823, + 1237, + 1861, + 2777, + 4177, + 6247, + 9371, + 14057, + 21089, + 31627, + 47431, + 71143, + 106721, + 160073, + 240101, + 360163, + 540217, + 810343, + 1215497, + 1823231, + 2734867, + 4102283, + 6153409, + 9230113, + 13845163, + }; + + + static FT_ULong + ft_mem_closest_prime( FT_ULong num ) + { + FT_UInt i; + + + for ( i = 0; + i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ ) + if ( ft_mem_primes[i] > num ) + return ft_mem_primes[i]; + + return FT_MEM_SIZE_MAX; + } + + + extern void + ft_mem_debug_panic( const char* fmt, + ... ) + { + va_list ap; + + + printf( "FreeType.Debug: " ); + + va_start( ap, fmt ); + vprintf( fmt, ap ); + va_end( ap ); + + printf( "\n" ); + exit( EXIT_FAILURE ); + } + + + static FT_Pointer + ft_mem_table_alloc( FT_MemTable table, + FT_Long size ) + { + FT_Memory memory = table->memory; + FT_Pointer block; + + + memory->user = table->memory_user; + block = table->alloc( memory, size ); + memory->user = table; + + return block; + } + + + static void + ft_mem_table_free( FT_MemTable table, + FT_Pointer block ) + { + FT_Memory memory = table->memory; + + + memory->user = table->memory_user; + table->free( memory, block ); + memory->user = table; + } + + + static void + ft_mem_table_resize( FT_MemTable table ) + { + FT_ULong new_size; + + + new_size = ft_mem_closest_prime( table->nodes ); + if ( new_size != table->size ) + { + FT_MemNode* new_buckets; + FT_ULong i; + + + new_buckets = (FT_MemNode *) + ft_mem_table_alloc( table, + new_size * sizeof ( FT_MemNode ) ); + if ( new_buckets == NULL ) + return; + + FT_ARRAY_ZERO( new_buckets, new_size ); + + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode node, next, *pnode; + FT_ULong hash; + + + node = table->buckets[i]; + while ( node ) + { + next = node->link; + hash = FT_MEM_VAL( node->address ) % new_size; + pnode = new_buckets + hash; + + node->link = pnode[0]; + pnode[0] = node; + + node = next; + } + } + + if ( table->buckets ) + ft_mem_table_free( table, table->buckets ); + + table->buckets = new_buckets; + table->size = new_size; + } + } + + + static FT_MemTable + ft_mem_table_new( FT_Memory memory ) + { + FT_MemTable table; + + + table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); + if ( table == NULL ) + goto Exit; + + FT_ZERO( table ); + + table->size = FT_MEM_SIZE_MIN; + table->nodes = 0; + + table->memory = memory; + + table->memory_user = memory->user; + + table->alloc = memory->alloc; + table->realloc = memory->realloc; + table->free = memory->free; + + table->buckets = (FT_MemNode *) + memory->alloc( memory, + table->size * sizeof ( FT_MemNode ) ); + if ( table->buckets ) + FT_ARRAY_ZERO( table->buckets, table->size ); + else + { + memory->free( memory, table ); + table = NULL; + } + + Exit: + return table; + } + + + static void + ft_mem_table_destroy( FT_MemTable table ) + { + FT_ULong i; + + + FT_DumpMemory( table->memory ); + + if ( table ) + { + FT_Long leak_count = 0; + FT_ULong leaks = 0; + + + /* remove all blocks from the table, revealing leaked ones */ + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode *pnode = table->buckets + i, next, node = *pnode; + + + while ( node ) + { + next = node->link; + node->link = 0; + + if ( node->size > 0 ) + { + printf( + "leaked memory block at address %p, size %8ld in (%s:%ld)\n", + node->address, node->size, + FT_FILENAME( node->source->file_name ), + node->source->line_no ); + + leak_count++; + leaks += node->size; + + ft_mem_table_free( table, node->address ); + } + + node->address = NULL; + node->size = 0; + + ft_mem_table_free( table, node ); + node = next; + } + table->buckets[i] = 0; + } + + ft_mem_table_free( table, table->buckets ); + table->buckets = NULL; + + table->size = 0; + table->nodes = 0; + + /* remove all sources */ + for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) + { + FT_MemSource source, next; + + + for ( source = table->sources[i]; source != NULL; source = next ) + { + next = source->link; + ft_mem_table_free( table, source ); + } + + table->sources[i] = NULL; + } + + printf( + "FreeType: total memory allocations = %ld\n", table->alloc_total ); + printf( + "FreeType: maximum memory footprint = %ld\n", table->alloc_max ); + + ft_mem_table_free( table, table ); + + if ( leak_count > 0 ) + ft_mem_debug_panic( + "FreeType: %ld bytes of memory leaked in %ld blocks\n", + leaks, leak_count ); + + printf( "FreeType: No memory leaks detected!\n" ); + } + } + + + static FT_MemNode* + ft_mem_table_get_nodep( FT_MemTable table, + FT_Byte* address ) + { + FT_ULong hash; + FT_MemNode *pnode, node; + + + hash = FT_MEM_VAL( address ); + pnode = table->buckets + ( hash % table->size ); + + for (;;) + { + node = pnode[0]; + if ( !node ) + break; + + if ( node->address == address ) + break; + + pnode = &node->link; + } + return pnode; + } + + + static FT_MemSource + ft_mem_table_get_source( FT_MemTable table ) + { + FT_UInt32 hash; + FT_MemSource node, *pnode; + + + /* cast to FT_PtrDist first since void* can be larger */ + /* than FT_UInt32 and GCC 4.1.1 emits a warning */ + hash = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file + + (FT_UInt32)( 5 * _ft_debug_lineno ); + pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS]; + + for ( ;; ) + { + node = *pnode; + if ( node == NULL ) + break; + + if ( node->file_name == _ft_debug_file && + node->line_no == _ft_debug_lineno ) + goto Exit; + + pnode = &node->link; + } + + node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( node == NULL ) + ft_mem_debug_panic( + "not enough memory to perform memory debugging\n" ); + + node->file_name = _ft_debug_file; + node->line_no = _ft_debug_lineno; + + node->cur_blocks = 0; + node->max_blocks = 0; + node->all_blocks = 0; + + node->cur_size = 0; + node->max_size = 0; + node->all_size = 0; + + node->cur_max = 0; + + node->link = NULL; + node->hash = hash; + *pnode = node; + + Exit: + return node; + } + + + static void + ft_mem_table_set( FT_MemTable table, + FT_Byte* address, + FT_ULong size, + FT_Long delta ) + { + FT_MemNode *pnode, node; + + + if ( table ) + { + FT_MemSource source; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + if ( node->size < 0 ) + { + /* This block was already freed. Our memory is now completely */ + /* corrupted! */ + /* This can only happen in keep-alive mode. */ + ft_mem_debug_panic( + "memory heap corrupted (allocating freed block)" ); + } + else + { + /* This block was already allocated. This means that our memory */ + /* is also corrupted! */ + ft_mem_debug_panic( + "memory heap corrupted (re-allocating allocated block at" + " %p, of size %ld)\n" + "org=%s:%d new=%s:%d\n", + node->address, node->size, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); + } + } + + /* we need to create a new node in this table */ + node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( node == NULL ) + ft_mem_debug_panic( "not enough memory to run memory tests" ); + + node->address = address; + node->size = size; + node->source = source = ft_mem_table_get_source( table ); + + if ( delta == 0 ) + { + /* this is an allocation */ + source->all_blocks++; + source->cur_blocks++; + if ( source->cur_blocks > source->max_blocks ) + source->max_blocks = source->cur_blocks; + } + + if ( size > (FT_ULong)source->cur_max ) + source->cur_max = size; + + if ( delta != 0 ) + { + /* we are growing or shrinking a reallocated block */ + source->cur_size += delta; + table->alloc_current += delta; + } + else + { + /* we are allocating a new block */ + source->cur_size += size; + table->alloc_current += size; + } + + source->all_size += size; + + if ( source->cur_size > source->max_size ) + source->max_size = source->cur_size; + + node->free_file_name = NULL; + node->free_line_no = 0; + + node->link = pnode[0]; + + pnode[0] = node; + table->nodes++; + + table->alloc_total += size; + + if ( table->alloc_current > table->alloc_max ) + table->alloc_max = table->alloc_current; + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + + + static void + ft_mem_table_remove( FT_MemTable table, + FT_Byte* address, + FT_Long delta ) + { + if ( table ) + { + FT_MemNode *pnode, node; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + FT_MemSource source; + + + if ( node->size < 0 ) + ft_mem_debug_panic( + "freeing memory block at %p more than once at (%s:%ld)\n" + "block allocated at (%s:%ld) and released at (%s:%ld)", + address, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( node->free_file_name ), node->free_line_no ); + + /* scramble the node's content for additional safety */ + FT_MEM_SET( address, 0xF3, node->size ); + + if ( delta == 0 ) + { + source = node->source; + + source->cur_blocks--; + source->cur_size -= node->size; + + table->alloc_current -= node->size; + } + + if ( table->keep_alive ) + { + /* we simply invert the node's size to indicate that the node */ + /* was freed. */ + node->size = -node->size; + node->free_file_name = _ft_debug_file; + node->free_line_no = _ft_debug_lineno; + } + else + { + table->nodes--; + + *pnode = node->link; + + node->size = 0; + node->source = NULL; + + ft_mem_table_free( table, node ); + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + else + ft_mem_debug_panic( + "trying to free unknown block at %p in (%s:%ld)\n", + address, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); + } + } + + + extern FT_Pointer + ft_mem_debug_alloc( FT_Memory memory, + FT_Long size ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_Byte* block; + + + if ( size <= 0 ) + ft_mem_debug_panic( "negative block size allocation (%ld)", size ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( table->bound_total && + table->alloc_total_max - table->alloc_current > (FT_ULong)size ) + return NULL; + + block = (FT_Byte *)ft_mem_table_alloc( table, size ); + if ( block ) + { + ft_mem_table_set( table, block, (FT_ULong)size, 0 ); + + table->alloc_count++; + } + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + + return (FT_Pointer)block; + } + + + extern void + ft_mem_debug_free( FT_Memory memory, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( block == NULL ) + ft_mem_debug_panic( "trying to free NULL in (%s:%ld)", + FT_FILENAME( _ft_debug_file ), + _ft_debug_lineno ); + + ft_mem_table_remove( table, (FT_Byte*)block, 0 ); + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + table->alloc_count--; + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + } + + + extern FT_Pointer + ft_mem_debug_realloc( FT_Memory memory, + FT_Long cur_size, + FT_Long new_size, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_MemNode node, *pnode; + FT_Pointer new_block; + FT_Long delta; + + const char* file_name = FT_FILENAME( _ft_debug_file ); + FT_Long line_no = _ft_debug_lineno; + + + /* unlikely, but possible */ + if ( new_size == cur_size ) + return block; + + /* the following is valid according to ANSI C */ +#if 0 + if ( block == NULL || cur_size == 0 ) + ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)", + file_name, line_no ); +#endif + + /* while the following is allowed in ANSI C also, we abort since */ + /* such case should be handled by FreeType. */ + if ( new_size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)", + block, cur_size, file_name, line_no ); + + /* check `cur_size' value */ + pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block ); + node = *pnode; + if ( !node ) + ft_mem_debug_panic( + "trying to reallocate unknown block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate freed block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size != cur_size ) + ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is " + "%ld instead of %ld in (%s:%ld)", + block, cur_size, node->size, file_name, line_no ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + delta = (FT_Long)( new_size - cur_size ); + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( delta > 0 && + table->bound_total && + table->alloc_current + (FT_ULong)delta > table->alloc_total_max ) + return NULL; + + new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size ); + if ( new_block == NULL ) + return NULL; + + ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta ); + + ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size ); + + ft_mem_table_remove( table, (FT_Byte*)block, delta ); + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + return new_block; + } + + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ) + { + FT_MemTable table; + FT_Int result = 0; + + + if ( getenv( "FT2_DEBUG_MEMORY" ) ) + { + table = ft_mem_table_new( memory ); + if ( table ) + { + const char* p; + + + memory->user = table; + memory->alloc = ft_mem_debug_alloc; + memory->realloc = ft_mem_debug_realloc; + memory->free = ft_mem_debug_free; + + p = getenv( "FT2_ALLOC_TOTAL_MAX" ); + if ( p != NULL ) + { + FT_Long total_max = ft_atol( p ); + + + if ( total_max > 0 ) + { + table->bound_total = 1; + table->alloc_total_max = (FT_ULong)total_max; + } + } + + p = getenv( "FT2_ALLOC_COUNT_MAX" ); + if ( p != NULL ) + { + FT_Long total_count = ft_atol( p ); + + + if ( total_count > 0 ) + { + table->bound_count = 1; + table->alloc_count_max = (FT_ULong)total_count; + } + } + + p = getenv( "FT2_KEEP_ALIVE" ); + if ( p != NULL ) + { + FT_Long keep_alive = ft_atol( p ); + + + if ( keep_alive > 0 ) + table->keep_alive = 1; + } + + result = 1; + } + } + return result; + } + + + extern void + ft_mem_debug_done( FT_Memory memory ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( table ) + { + memory->free = table->free; + memory->realloc = table->realloc; + memory->alloc = table->alloc; + + ft_mem_table_destroy( table ); + memory->user = NULL; + } + } + + + + static int + ft_mem_source_compare( const void* p1, + const void* p2 ) + { + FT_MemSource s1 = *(FT_MemSource*)p1; + FT_MemSource s2 = *(FT_MemSource*)p2; + + + if ( s2->max_size > s1->max_size ) + return 1; + else if ( s2->max_size < s1->max_size ) + return -1; + else + return 0; + } + + + extern void + FT_DumpMemory( FT_Memory memory ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( table ) + { + FT_MemSource* bucket = table->sources; + FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS; + FT_MemSource* sources; + FT_UInt nn, count; + const char* fmt; + + + count = 0; + for ( ; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + count++; + } + + sources = (FT_MemSource*)ft_mem_table_alloc( + table, sizeof ( *sources ) * count ); + + count = 0; + for ( bucket = table->sources; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + sources[count++] = source; + } + + ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare ); + + printf( "FreeType Memory Dump: " + "current=%ld max=%ld total=%ld count=%ld\n", + table->alloc_current, table->alloc_max, + table->alloc_total, table->alloc_count ); + printf( " block block sizes sizes sizes source\n" ); + printf( " count high sum highsum max location\n" ); + printf( "-------------------------------------------------\n" ); + + fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n"; + + for ( nn = 0; nn < count; nn++ ) + { + FT_MemSource source = sources[nn]; + + + printf( fmt, + source->cur_blocks, source->max_blocks, + source->cur_size, source->max_size, source->cur_max, + FT_FILENAME( source->file_name ), + source->line_no ); + } + printf( "------------------------------------------------\n" ); + + ft_mem_table_free( table, sources ); + } + } + +#else /* !FT_DEBUG_MEMORY */ + + /* ANSI C doesn't like empty source files */ + static const FT_Byte _debug_mem_dummy = 0; + +#endif /* !FT_DEBUG_MEMORY */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftdebug.c b/src/3rdparty/freetype/src/base/ftdebug.c new file mode 100644 index 0000000000..2adbeabeb2 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftdebug.c @@ -0,0 +1,246 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H + + +#ifdef FT_DEBUG_LEVEL_ERROR + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the `FT2_DEBUG' environment variable. It must be a list of */ + /* toggles, separated by spaces, `;', or `,'. Example: */ + /* */ + /* export FT2_DEBUG="any:3 memory:7 stream:5" */ + /* */ + /* This requests that all levels be set to 3, except the trace level for */ + /* the memory and stream components which are set to 7 and 5, */ + /* respectively. */ + /* */ + /* See the file <include/freetype/internal/fttrace.h> for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 7; 0 means quiet (except for serious */ + /* runtime errors), and 7 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + const char* ft2_debug = getenv( "FT2_DEBUG" ); + + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftfstype.c b/src/3rdparty/freetype/src/base/ftfstype.c new file mode 100644 index 0000000000..d0ef7b7c1b --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftfstype.c @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* ftfstype.c */ +/* */ +/* FreeType utility file to access FSType data (body). */ +/* */ +/* Copyright 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_INFO_H + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ) + { + TT_OS2* os2; + + + /* first, try to get the fs_type directly from the font */ + if ( face ) + { + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_extra ) + { + PS_FontExtraRec extra; + + + if ( !service->ps_get_font_extra( face, &extra ) && + extra.fs_type != 0 ) + return extra.fs_type; + } + } + + /* look at FSType before fsType for Type42 */ + + if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL && + os2->version != 0xFFFFU ) + return os2->fsType; + + return 0; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftgasp.c b/src/3rdparty/freetype/src/base/ftgasp.c new file mode 100644 index 0000000000..8485d29259 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftgasp.c @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ftgasp.c */ +/* */ +/* Access of TrueType's `gasp' table (body). */ +/* */ +/* Copyright 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_GASP_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ) + { + FT_Int result = FT_GASP_NO_TABLE; + + + if ( face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->gasp.numRanges > 0 ) + { + TT_GaspRange range = ttface->gasp.gaspRanges; + TT_GaspRange range_end = range + ttface->gasp.numRanges; + + + while ( ppem > range->maxPPEM ) + { + range++; + if ( range >= range_end ) + goto Exit; + } + + result = range->gaspFlag; + + /* ensure that we don't have spurious bits */ + if ( ttface->gasp.version == 0 ) + result &= 3; + } + } + Exit: + return result; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftgloadr.c b/src/3rdparty/freetype/src/base/ftgloadr.c new file mode 100644 index 0000000000..ab52621ea6 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftgloadr.c @@ -0,0 +1,394 @@ +/***************************************************************************/ +/* */ +/* ftgloadr.c */ +/* */ +/* The FreeType glyph loader (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H + +#undef FT_COMPONENT +#define FT_COMPONENT trace_gloader + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** G L Y P H L O A D E R *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* The glyph loader is a simple object which is used to load a set of */ + /* glyphs easily. It is critical for the correct loading of composites. */ + /* */ + /* Ideally, one can see it as a stack of abstract `glyph' objects. */ + /* */ + /* loader.base Is really the bottom of the stack. It describes a */ + /* single glyph image made of the juxtaposition of */ + /* several glyphs (those `in the stack'). */ + /* */ + /* loader.current Describes the top of the stack, on which a new */ + /* glyph can be loaded. */ + /* */ + /* Rewind Clears the stack. */ + /* Prepare Set up `loader.current' for addition of a new glyph */ + /* image. */ + /* Add Add the `current' glyph image to the `base' one, */ + /* and prepare for another one. */ + /* */ + /* The glyph loader is now a base object. Each driver used to */ + /* re-implement it in one way or the other, which wasted code and */ + /* energy. */ + /* */ + /*************************************************************************/ + + + /* create a new glyph loader */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ) + { + FT_GlyphLoader loader; + FT_Error error; + + + if ( !FT_NEW( loader ) ) + { + loader->memory = memory; + *aloader = loader; + } + return error; + } + + + /* rewind the glyph loader - reset counters to 0 */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + base->outline.n_points = 0; + base->outline.n_contours = 0; + base->num_subglyphs = 0; + + *current = *base; + } + + + /* reset the glyph loader, frees all allocated tables */ + /* and starts from zero */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ) + { + FT_Memory memory = loader->memory; + + + FT_FREE( loader->base.outline.points ); + FT_FREE( loader->base.outline.tags ); + FT_FREE( loader->base.outline.contours ); + FT_FREE( loader->base.extra_points ); + FT_FREE( loader->base.subglyphs ); + + loader->base.extra_points2 = NULL; + + loader->max_points = 0; + loader->max_contours = 0; + loader->max_subglyphs = 0; + + FT_GlyphLoader_Rewind( loader ); + } + + + /* delete a glyph loader */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ) + { + if ( loader ) + { + FT_Memory memory = loader->memory; + + + FT_GlyphLoader_Reset( loader ); + FT_FREE( loader ); + } + } + + + /* re-adjust the `current' outline fields */ + static void + FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader ) + { + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + + + current->points = base->points + base->n_points; + current->tags = base->tags + base->n_points; + current->contours = base->contours + base->n_contours; + + /* handle extra points table - if any */ + if ( loader->use_extra ) + { + loader->current.extra_points = loader->base.extra_points + + base->n_points; + + loader->current.extra_points2 = loader->base.extra_points2 + + base->n_points; + } + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) + { + FT_Error error; + FT_Memory memory = loader->memory; + + + if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) + { + loader->use_extra = 1; + loader->base.extra_points2 = loader->base.extra_points + + loader->max_points; + + FT_GlyphLoader_Adjust_Points( loader ); + } + return error; + } + + + /* re-adjust the `current' subglyphs field */ + static void + FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + current->subglyphs = base->subglyphs + base->num_subglyphs; + } + + + /* Ensure that we can add `n_points' and `n_contours' to our glyph. */ + /* This function reallocates its outline tables if necessary. Note that */ + /* it DOESN'T change the number of points within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + FT_Bool adjust = 0; + + FT_UInt new_max, old_max; + + + /* check points & tags */ + new_max = base->n_points + current->n_points + n_points; + old_max = loader->max_points; + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + + if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || + FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) + goto Exit; + + if ( loader->use_extra ) + { + if ( FT_RENEW_ARRAY( loader->base.extra_points, + old_max * 2, new_max * 2 ) ) + goto Exit; + + FT_ARRAY_MOVE( loader->base.extra_points + new_max, + loader->base.extra_points + old_max, + old_max ); + + loader->base.extra_points2 = loader->base.extra_points + new_max; + } + + adjust = 1; + loader->max_points = new_max; + } + + /* check contours */ + old_max = loader->max_contours; + new_max = base->n_contours + current->n_contours + + n_contours; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 4 ); + if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) + goto Exit; + + adjust = 1; + loader->max_contours = new_max; + } + + if ( adjust ) + FT_GlyphLoader_Adjust_Points( loader ); + + Exit: + return error; + } + + + /* Ensure that we can add `n_subglyphs' to our glyph. this function */ + /* reallocates its subglyphs table if necessary. Note that it DOES */ + /* NOT change the number of subglyphs within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_UInt new_max, old_max; + + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + new_max = base->num_subglyphs + current->num_subglyphs + n_subs; + old_max = loader->max_subglyphs; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 2 ); + if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) + goto Exit; + + loader->max_subglyphs = new_max; + + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + Exit: + return error; + } + + + /* prepare loader for the addition of a new glyph on top of the base one */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) + { + FT_GlyphLoad current = &loader->current; + + + current->outline.n_points = 0; + current->outline.n_contours = 0; + current->num_subglyphs = 0; + + FT_GlyphLoader_Adjust_Points ( loader ); + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + + /* add current glyph to the base image - and prepare for another */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ) + { + FT_GlyphLoad base; + FT_GlyphLoad current; + + FT_UInt n_curr_contours; + FT_UInt n_base_points; + FT_UInt n; + + + if ( !loader ) + return; + + base = &loader->base; + current = &loader->current; + + n_curr_contours = current->outline.n_contours; + n_base_points = base->outline.n_points; + + base->outline.n_points = + (short)( base->outline.n_points + current->outline.n_points ); + base->outline.n_contours = + (short)( base->outline.n_contours + current->outline.n_contours ); + + base->num_subglyphs += current->num_subglyphs; + + /* adjust contours count in newest outline */ + for ( n = 0; n < n_curr_contours; n++ ) + current->outline.contours[n] = + (short)( current->outline.contours[n] + n_base_points ); + + /* prepare for another new glyph image */ + FT_GlyphLoader_Prepare( loader ); + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ) + { + FT_Error error; + FT_UInt num_points = source->base.outline.n_points; + FT_UInt num_contours = source->base.outline.n_contours; + + + error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); + if ( !error ) + { + FT_Outline* out = &target->base.outline; + FT_Outline* in = &source->base.outline; + + + FT_ARRAY_COPY( out->points, in->points, + num_points ); + FT_ARRAY_COPY( out->tags, in->tags, + num_points ); + FT_ARRAY_COPY( out->contours, in->contours, + num_contours ); + + /* do we need to copy the extra points? */ + if ( target->use_extra && source->use_extra ) + { + FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, + num_points ); + FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2, + num_points ); + } + + out->n_points = (short)num_points; + out->n_contours = (short)num_contours; + + FT_GlyphLoader_Adjust_Points( target ); + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftglyph.c b/src/3rdparty/freetype/src/base/ftglyph.c new file mode 100644 index 0000000000..4130cb1102 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftglyph.c @@ -0,0 +1,626 @@ +/***************************************************************************/ +/* */ +/* ftglyph.c */ +/* */ +/* FreeType convenience functions to handle glyphs (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_GLYPH_H +#include FT_OUTLINE_H +#include FT_BITMAP_H +#include FT_INTERNAL_OBJECTS_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_glyph + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_BitmapGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, + FT_GlyphSlot slot ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + glyph->left = slot->bitmap_left; + glyph->top = slot->bitmap_top; + + /* do lazy copying whenever possible */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + glyph->bitmap = slot->bitmap; + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + FT_Bitmap_New( &glyph->bitmap ); + error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_copy( FT_Glyph bitmap_source, + FT_Glyph bitmap_target ) + { + FT_Library library = bitmap_source->library; + FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; + FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; + + + target->left = source->left; + target->top = source->top; + + return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Library library = FT_GLYPH( glyph )->library; + + + FT_Bitmap_Done( library, &glyph->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, + FT_BBox* cbox ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + + + cbox->xMin = glyph->left << 6; + cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 ); + cbox->yMax = glyph->top << 6; + cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Glyph_Class ft_bitmap_glyph_class = + { + sizeof ( FT_BitmapGlyphRec ), + FT_GLYPH_FORMAT_BITMAP, + + ft_bitmap_glyph_init, + ft_bitmap_glyph_done, + ft_bitmap_glyph_copy, + 0, /* FT_Glyph_TransformFunc */ + ft_bitmap_glyph_bbox, + 0 /* FT_Glyph_PrepareFunc */ + }; + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_OutlineGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_init( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + FT_Outline* source = &slot->outline; + FT_Outline* target = &glyph->outline; + + + /* check format in glyph slot */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + /* allocate new outline */ + error = FT_Outline_New( library, source->n_points, source->n_contours, + &glyph->outline ); + if ( error ) + goto Exit; + + FT_Outline_Copy( source, target ); + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_done( FT_Glyph outline_glyph ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_copy( FT_Glyph outline_source, + FT_Glyph outline_target ) + { + FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; + FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; + FT_Error error; + FT_Library library = FT_GLYPH( source )->library; + + + error = FT_Outline_New( library, source->outline.n_points, + source->outline.n_contours, &target->outline ); + if ( !error ) + FT_Outline_Copy( &source->outline, &target->outline ); + + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_transform( FT_Glyph outline_glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + if ( matrix ) + FT_Outline_Transform( &glyph->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_bbox( FT_Glyph outline_glyph, + FT_BBox* bbox ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Get_CBox( &glyph->outline, bbox ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_prepare( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + slot->format = FT_GLYPH_FORMAT_OUTLINE; + slot->outline = glyph->outline; + slot->outline.flags &= ~FT_OUTLINE_OWNER; + + return FT_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const FT_Glyph_Class ft_outline_glyph_class = + { + sizeof ( FT_OutlineGlyphRec ), + FT_GLYPH_FORMAT_OUTLINE, + + ft_outline_glyph_init, + ft_outline_glyph_done, + ft_outline_glyph_copy, + ft_outline_glyph_transform, + ft_outline_glyph_bbox, + ft_outline_glyph_prepare + }; + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_Glyph class and API ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + ft_new_glyph( FT_Library library, + const FT_Glyph_Class* clazz, + FT_Glyph* aglyph ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Glyph glyph; + + + *aglyph = 0; + + if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) + { + glyph->library = library; + glyph->clazz = clazz; + glyph->format = clazz->glyph_format; + + *aglyph = glyph; + } + + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ) + { + FT_Glyph copy; + FT_Error error; + const FT_Glyph_Class* clazz; + + + /* check arguments */ + if ( !target ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + *target = 0; + + if ( !source || !source->clazz ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + clazz = source->clazz; + error = ft_new_glyph( source->library, clazz, © ); + if ( error ) + goto Exit; + + copy->advance = source->advance; + copy->format = source->format; + + if ( clazz->glyph_copy ) + error = clazz->glyph_copy( source, copy ); + + if ( error ) + FT_Done_Glyph( copy ); + else + *target = copy; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ) + { + FT_Library library; + FT_Error error; + FT_Glyph glyph; + + const FT_Glyph_Class* clazz = 0; + + + if ( !slot ) + return FT_Err_Invalid_Slot_Handle; + + library = slot->library; + + if ( !aglyph ) + return FT_Err_Invalid_Argument; + + /* if it is a bitmap, that's easy :-) */ + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + clazz = &ft_bitmap_glyph_class; + + /* it it is an outline too */ + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + clazz = &ft_outline_glyph_class; + + else + { + /* try to find a renderer that supports the glyph image format */ + FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); + + + if ( render ) + clazz = &render->glyph_class; + } + + if ( !clazz ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + /* create FT_Glyph object */ + error = ft_new_glyph( library, clazz, &glyph ); + if ( error ) + goto Exit; + + /* copy advance while converting it to 16.16 format */ + glyph->advance.x = slot->advance.x << 10; + glyph->advance.y = slot->advance.y << 10; + + /* now import the image from the glyph slot */ + error = clazz->glyph_init( glyph, slot ); + + /* if an error occurred, destroy the glyph */ + if ( error ) + FT_Done_Glyph( glyph ); + else + *aglyph = glyph; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ) + { + const FT_Glyph_Class* clazz; + FT_Error error = FT_Err_Ok; + + + if ( !glyph || !glyph->clazz ) + error = FT_Err_Invalid_Argument; + else + { + clazz = glyph->clazz; + if ( clazz->glyph_transform ) + { + /* transform glyph image */ + clazz->glyph_transform( glyph, matrix, delta ); + + /* transform advance vector */ + if ( matrix ) + FT_Vector_Transform( &glyph->advance, matrix ); + } + else + error = FT_Err_Invalid_Glyph_Format; + } + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ) + { + const FT_Glyph_Class* clazz; + + + if ( !acbox ) + return; + + acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; + + if ( !glyph || !glyph->clazz ) + return; + else + { + clazz = glyph->clazz; + if ( !clazz->glyph_bbox ) + return; + else + { + /* retrieve bbox in 26.6 coordinates */ + clazz->glyph_bbox( glyph, acbox ); + + /* perform grid fitting if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); + acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); + acbox->xMax = FT_PIX_CEIL( acbox->xMax ); + acbox->yMax = FT_PIX_CEIL( acbox->yMax ); + } + + /* convert to integer pixels if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin >>= 6; + acbox->yMin >>= 6; + acbox->xMax >>= 6; + acbox->yMax >>= 6; + } + } + } + return; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ) + { + FT_GlyphSlotRec dummy; + FT_GlyphSlot_InternalRec dummy_internal; + FT_Error error = FT_Err_Ok; + FT_Glyph glyph; + FT_BitmapGlyph bitmap = NULL; + + const FT_Glyph_Class* clazz; + + + /* check argument */ + if ( !the_glyph ) + goto Bad; + + /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ + /* then calling FT_Render_Glyph_Internal() */ + + glyph = *the_glyph; + if ( !glyph ) + goto Bad; + + clazz = glyph->clazz; + + /* when called with a bitmap glyph, do nothing and return successfully */ + if ( clazz == &ft_bitmap_glyph_class ) + goto Exit; + + if ( !clazz || !clazz->glyph_prepare ) + goto Bad; + + FT_MEM_ZERO( &dummy, sizeof ( dummy ) ); + FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) ); + dummy.internal = &dummy_internal; + dummy.library = glyph->library; + dummy.format = clazz->glyph_format; + + /* create result bitmap glyph */ + error = ft_new_glyph( glyph->library, &ft_bitmap_glyph_class, + (FT_Glyph*)(void*)&bitmap ); + if ( error ) + goto Exit; + +#if 1 + /* if `origin' is set, translate the glyph image */ + if ( origin ) + FT_Glyph_Transform( glyph, 0, origin ); +#else + FT_UNUSED( origin ); +#endif + + /* prepare dummy slot for rendering */ + error = clazz->glyph_prepare( glyph, &dummy ); + if ( !error ) + error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); + +#if 1 + if ( !destroy && origin ) + { + FT_Vector v; + + + v.x = -origin->x; + v.y = -origin->y; + FT_Glyph_Transform( glyph, 0, &v ); + } +#endif + + if ( error ) + goto Exit; + + /* in case of success, copy the bitmap to the glyph bitmap */ + error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); + if ( error ) + goto Exit; + + /* copy advance */ + bitmap->root.advance = glyph->advance; + + if ( destroy ) + FT_Done_Glyph( glyph ); + + *the_glyph = FT_GLYPH( bitmap ); + + Exit: + if ( error && bitmap ) + FT_Done_Glyph( FT_GLYPH( bitmap ) ); + + return error; + + Bad: + error = FT_Err_Invalid_Argument; + goto Exit; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Done_Glyph( FT_Glyph glyph ) + { + if ( glyph ) + { + FT_Memory memory = glyph->library->memory; + const FT_Glyph_Class* clazz = glyph->clazz; + + + if ( clazz->glyph_done ) + clazz->glyph_done( glyph ); + + FT_FREE( glyph ); + } + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftgxval.c b/src/3rdparty/freetype/src/base/ftgxval.c new file mode 100644 index 0000000000..32662bed87 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftgxval.c @@ -0,0 +1,129 @@ +/***************************************************************************/ +/* */ +/* ftgxval.c */ +/* */ +/* FreeType API for validating TrueTyepGX/AAT tables (body). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* Masatake YAMATO, Redhat K.K, */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_GX_VALIDATE_H + + + /* documentation is in ftgxval.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ) + { + FT_Service_GXvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_Err_Invalid_Face_Handle; + goto Exit; + } + + if ( tables == NULL ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + tables, + table_length ); + else + error = FT_Err_Unimplemented_Feature; + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( table ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ) + { + FT_Service_CKERNvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_Err_Invalid_Face_Handle; + goto Exit; + } + + if ( ckern_table == NULL ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + ckern_table ); + else + error = FT_Err_Unimplemented_Feature; + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( table ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftinit.c b/src/3rdparty/freetype/src/base/ftinit.c new file mode 100644 index 0000000000..dac30b0d86 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftinit.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* ftinit.c */ +/* */ +/* FreeType initialization layer (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* The purpose of this file is to implement the following two */ + /* functions: */ + /* */ + /* FT_Add_Default_Modules(): */ + /* This function is used to add the set of default modules to a */ + /* fresh new library object. The set is taken from the header file */ + /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */ + /* Build System' for more information. */ + /* */ + /* FT_Init_FreeType(): */ + /* This function creates a system object for the current platform, */ + /* builds a library out of it, then calls FT_Default_Drivers(). */ + /* */ + /* Note that even if FT_Init_FreeType() uses the implementation of the */ + /* system object defined at build time, client applications are still */ + /* able to provide their own `ftsystem.c'. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_MODULE_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_init + +#undef FT_USE_MODULE +#ifdef __cplusplus +#define FT_USE_MODULE( type, x ) extern "C" const type x; +#else +#define FT_USE_MODULE( type, x ) extern const type x; +#endif + + +#include FT_CONFIG_MODULES_H + + +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x), + + static + const FT_Module_Class* const ft_default_modules[] = + { +#include FT_CONFIG_MODULES_H + 0 + }; + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Add_Default_Modules( FT_Library library ) + { + FT_Error error; + const FT_Module_Class* const* cur; + + + /* test for valid `library' delayed to FT_Add_Module() */ + + cur = ft_default_modules; + while ( *cur ) + { + error = FT_Add_Module( library, *cur ); + /* notify errors, but don't stop */ + if ( error ) + { + FT_ERROR(( "FT_Add_Default_Module: Cannot install `%s', error = 0x%x\n", + (*cur)->module_name, error )); + } + cur++; + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ) + { + FT_Error error; + FT_Memory memory; + + + /* First of all, allocate a new system object -- this function is part */ + /* of the system-specific component, i.e. `ftsystem.c'. */ + + memory = FT_New_Memory(); + if ( !memory ) + { + FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" )); + return FT_Err_Unimplemented_Feature; + } + + /* build a library out of it, then fill it with the set of */ + /* default drivers. */ + + error = FT_New_Library( memory, alibrary ); + if ( error ) + FT_Done_Memory( memory ); + else + { + (*alibrary)->version_major = FREETYPE_MAJOR; + (*alibrary)->version_minor = FREETYPE_MINOR; + (*alibrary)->version_patch = FREETYPE_PATCH; + + FT_Add_Default_Modules( *alibrary ); + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_FreeType( FT_Library library ) + { + if ( library ) + { + FT_Memory memory = library->memory; + + + /* Discard the library object */ + FT_Done_Library( library ); + + /* discard memory manager */ + FT_Done_Memory( memory ); + } + + return FT_Err_Ok; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftlcdfil.c b/src/3rdparty/freetype/src/base/ftlcdfil.c new file mode 100644 index 0000000000..80640111c4 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftlcdfil.c @@ -0,0 +1,351 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.c */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs (body). */ +/* */ +/* Copyright 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LCD_FILTER_H +#include FT_IMAGE_H +#include FT_INTERNAL_OBJECTS_H + + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + +/* define USE_LEGACY to implement the legacy filter */ +#define USE_LEGACY + + /* FIR filter used by the default and light filters */ + static void + _ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_Library library ) + { + FT_Byte* weights = library->lcd_weights; + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + + + /* horizontal in-place FIR filter */ + if ( mode == FT_RENDER_MODE_LCD && width >= 4 ) + { + FT_Byte* line = bitmap->buffer; + + + for ( ; height > 0; height--, line += bitmap->pitch ) + { + FT_UInt fir[5]; + FT_UInt val1, xx; + + + val1 = line[0]; + fir[0] = weights[2] * val1; + fir[1] = weights[3] * val1; + fir[2] = weights[4] * val1; + fir[3] = 0; + fir[4] = 0; + + val1 = line[1]; + fir[0] += weights[1] * val1; + fir[1] += weights[2] * val1; + fir[2] += weights[3] * val1; + fir[3] += weights[4] * val1; + + for ( xx = 2; xx < width; xx++ ) + { + FT_UInt val, pix; + + + val = line[xx]; + pix = fir[0] + weights[0] * val; + fir[0] = fir[1] + weights[1] * val; + fir[1] = fir[2] + weights[2] * val; + fir[2] = fir[3] + weights[3] * val; + fir[3] = weights[4] * val; + + pix >>= 8; + pix |= -( pix >> 8 ); + line[xx - 2] = (FT_Byte)pix; + } + + { + FT_UInt pix; + + + pix = fir[0] >> 8; + pix |= -( pix >> 8 ); + line[xx - 2] = (FT_Byte)pix; + + pix = fir[1] >> 8; + pix |= -( pix >> 8 ); + line[xx - 1] = (FT_Byte)pix; + } + } + } + + /* vertical in-place FIR filter */ + else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 ) + { + FT_Byte* column = bitmap->buffer; + FT_Int pitch = bitmap->pitch; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column; + FT_UInt fir[5]; + FT_UInt val1, yy; + + + val1 = col[0]; + fir[0] = weights[2] * val1; + fir[1] = weights[3] * val1; + fir[2] = weights[4] * val1; + fir[3] = 0; + fir[4] = 0; + col += pitch; + + val1 = col[0]; + fir[0] += weights[1] * val1; + fir[1] += weights[2] * val1; + fir[2] += weights[3] * val1; + fir[3] += weights[4] * val1; + col += pitch; + + for ( yy = 2; yy < height; yy++ ) + { + FT_UInt val, pix; + + + val = col[0]; + pix = fir[0] + weights[0] * val; + fir[0] = fir[1] + weights[1] * val; + fir[1] = fir[2] + weights[2] * val; + fir[2] = fir[3] + weights[3] * val; + fir[3] = weights[4] * val; + + pix >>= 8; + pix |= -( pix >> 8 ); + col[-2 * pitch] = (FT_Byte)pix; + col += pitch; + } + + { + FT_UInt pix; + + + pix = fir[0] >> 8; + pix |= -( pix >> 8 ); + col[-2 * pitch] = (FT_Byte)pix; + + pix = fir[1] >> 8; + pix |= -( pix >> 8 ); + col[-pitch] = (FT_Byte)pix; + } + } + } + } + + +#ifdef USE_LEGACY + + /* intra-pixel filter used by the legacy filter */ + static void + _ft_lcd_filter_legacy( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_Library library ) + { + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + FT_Int pitch = bitmap->pitch; + + static const int filters[3][3] = + { + { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 }, + { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 }, + { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } + }; + + FT_UNUSED( library ); + + + /* horizontal in-place intra-pixel filter */ + if ( mode == FT_RENDER_MODE_LCD && width >= 3 ) + { + FT_Byte* line = bitmap->buffer; + + + for ( ; height > 0; height--, line += pitch ) + { + FT_UInt xx; + + + for ( xx = 0; xx < width; xx += 3 ) + { + FT_UInt r = 0; + FT_UInt g = 0; + FT_UInt b = 0; + FT_UInt p; + + + p = line[xx]; + r += filters[0][0] * p; + g += filters[0][1] * p; + b += filters[0][2] * p; + + p = line[xx + 1]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = line[xx + 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + line[xx] = (FT_Byte)( r / 65536 ); + line[xx + 1] = (FT_Byte)( g / 65536 ); + line[xx + 2] = (FT_Byte)( b / 65536 ); + } + } + } + else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 ) + { + FT_Byte* column = bitmap->buffer; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column; + FT_Byte* col_end = col + height * pitch; + + + for ( ; col < col_end; col += 3 * pitch ) + { + FT_UInt r = 0; + FT_UInt g = 0; + FT_UInt b = 0; + FT_UInt p; + + + p = col[0]; + r += filters[0][0] * p; + g += filters[0][1] * p; + b += filters[0][2] * p; + + p = col[pitch]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = col[pitch * 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + col[0] = (FT_Byte)( r / 65536 ); + col[pitch] = (FT_Byte)( g / 65536 ); + col[2 * pitch] = (FT_Byte)( b / 65536 ); + } + } + } + } + +#endif /* USE_LEGACY */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + static const FT_Byte light_filter[5] = + { 0, 85, 86, 85, 0 }; + /* the values here sum up to a value larger than 256, */ + /* providing a cheap gamma correction */ + static const FT_Byte default_filter[5] = + { 0x10, 0x40, 0x70, 0x40, 0x10 }; + + + if ( library == NULL ) + return FT_Err_Invalid_Argument; + + switch ( filter ) + { + case FT_LCD_FILTER_NONE: + library->lcd_filter_func = NULL; + library->lcd_extra = 0; + break; + + case FT_LCD_FILTER_DEFAULT: +#if defined( FT_FORCE_LEGACY_LCD_FILTER ) + + library->lcd_filter_func = _ft_lcd_filter_legacy; + library->lcd_extra = 0; + +#elif defined( FT_FORCE_LIGHT_LCD_FILTER ) + + ft_memcpy( library->lcd_weights, light_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + +#else + + ft_memcpy( library->lcd_weights, default_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + +#endif + + break; + + case FT_LCD_FILTER_LIGHT: + ft_memcpy( library->lcd_weights, light_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + break; + +#ifdef USE_LEGACY + + case FT_LCD_FILTER_LEGACY: + library->lcd_filter_func = _ft_lcd_filter_legacy; + library->lcd_extra = 0; + break; + +#endif + + default: + return FT_Err_Invalid_Argument; + } + + library->lcd_filter = filter; + return 0; + } + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + FT_UNUSED( library ); + FT_UNUSED( filter ); + + return FT_Err_Unimplemented_Feature; + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftmac.c b/src/3rdparty/freetype/src/base/ftmac.c new file mode 100644 index 0000000000..63f927d57d --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftmac.c @@ -0,0 +1,1057 @@ +/***************************************************************************/ +/* */ +/* ftmac.c */ +/* */ +/* Mac FOND support. Written by just@letterror.com. */ +/* Heavily modified by mpsuzuki, George Williams, and Sean McBride. */ +/* */ +/* This file is for Mac OS X only; see builds/mac/ftoldmac.c for */ +/* classic platforms built by MPW. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, */ +/* 2009 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + Notes + + Mac suitcase files can (and often do!) contain multiple fonts. To + support this I use the face_index argument of FT_(Open|New)_Face() + functions, and pretend the suitcase file is a collection. + + Warning: fbit and NFNT bitmap resources are not supported yet. In old + sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' + resources instead of the `bdat' table in the sfnt resource. Therefore, + face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' + resource is unavailable at present. + + The Mac FOND support works roughly like this: + + - Check whether the offered stream points to a Mac suitcase file. This + is done by checking the file type: it has to be 'FFIL' or 'tfil'. The + stream that gets passed to our init_face() routine is a stdio stream, + which isn't usable for us, since the FOND resources live in the + resource fork. So we just grab the stream->pathname field. + + - Read the FOND resource into memory, then check whether there is a + TrueType font and/or(!) a Type 1 font available. + + - If there is a Type 1 font available (as a separate `LWFN' file), read + its data into memory, massage it slightly so it becomes PFB data, wrap + it into a memory stream, load the Type 1 driver and delegate the rest + of the work to it by calling FT_Open_Face(). (XXX TODO: after this + has been done, the kerning data from the FOND resource should be + appended to the face: On the Mac there are usually no AFM files + available. However, this is tricky since we need to map Mac char + codes to ps glyph names to glyph ID's...) + + - If there is a TrueType font (an `sfnt' resource), read it into memory, + wrap it into a memory stream, load the TrueType driver and delegate + the rest of the work to it, by calling FT_Open_Face(). + + - Some suitcase fonts (notably Onyx) might point the `LWFN' file to + itself, even though it doesn't contains `POST' resources. To handle + this special case without opening the file an extra time, we just + ignore errors from the `LWFN' and fallback to the `sfnt' if both are + available. + */ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_STREAM_H +#include "ftbase.h" + + /* This is for Mac OS X. Without redefinition, OS_INLINE */ + /* expands to `static inline' which doesn't survive the */ + /* -ansi compilation flag of GCC. */ +#if !HAVE_ANSI_OS_INLINE +#undef OS_INLINE +#define OS_INLINE static __inline__ +#endif + + /* `configure' checks the availability of `ResourceIndex' strictly */ + /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always. If it is */ + /* not set (e.g., a build without `configure'), the availability */ + /* is guessed from the SDK version. */ +#ifndef HAVE_TYPE_RESOURCE_INDEX +#if !defined( MAC_OS_X_VERSION_10_5 ) || \ + ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 ) +#define HAVE_TYPE_RESOURCE_INDEX 0 +#else +#define HAVE_TYPE_RESOURCE_INDEX 1 +#endif +#endif /* !HAVE_TYPE_RESOURCE_INDEX */ + +#if ( HAVE_TYPE_RESOURCE_INDEX == 0 ) + typedef short ResourceIndex; +#endif + +#include <CoreServices/CoreServices.h> +#include <ApplicationServices/ApplicationServices.h> +#include <sys/syslimits.h> /* PATH_MAX */ + + /* Don't want warnings about our own use of deprecated functions. */ +#define FT_DEPRECATED_ATTRIBUTE + +#include FT_MAC_H + +#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */ +#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault +#endif + + + /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over + TrueType in case *both* are available (this is not common, + but it *is* possible). */ +#ifndef PREFER_LWFN +#define PREFER_LWFN 1 +#endif + + + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; + } + + + /* Private function. */ + /* The FSSpec type has been discouraged for a long time, */ + /* unfortunately an FSRef replacement API for */ + /* ATSFontGetFileSpecification() is only available in */ + /* Mac OS X 10.5 and later. */ + static OSStatus + FT_ATSFontGetFileReference( ATSFontRef ats_font_id, + FSRef* ats_font_ref ) + { +#if defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) + + OSStatus err; + + err = ATSFontGetFileReference( ats_font_id, ats_font_ref ); + + return err; +#elif __LP64__ /* No 64bit Carbon API on legacy platforms */ + FT_UNUSED( ats_font_id ); + FT_UNUSED( ats_font_ref ); + + + return fnfErr; +#else /* 32bit Carbon API on legacy platforms */ + OSStatus err; + FSSpec spec; + + + err = ATSFontGetFileSpecification( ats_font_id, &spec ); + if ( noErr == err ) + err = FSpMakeFSRef( &spec, ats_font_ref ); + + return err; +#endif + } + + + static FT_Error + FT_GetFileRef_From_Mac_ATS_Name( const char* fontName, + FSRef* ats_font_ref, + FT_Long* face_index ) + { + CFStringRef cf_fontName; + ATSFontRef ats_font_id; + + + *face_index = 0; + + cf_fontName = CFStringCreateWithCString( NULL, fontName, + kCFStringEncodingMacRoman ); + ats_font_id = ATSFontFindFromName( cf_fontName, + kATSOptionFlagsUnRestrictedScope ); + CFRelease( cf_fontName ); + + if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) + return FT_Err_Unknown_File_Format; + + if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) ) + return FT_Err_Unknown_File_Format; + + /* face_index calculation by searching preceding fontIDs */ + /* with same FSRef */ + { + ATSFontRef id2 = ats_font_id - 1; + FSRef ref2; + + + while ( id2 > 0 ) + { + if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) ) + break; + if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) ) + break; + + id2 --; + } + *face_index = ats_font_id - ( id2 + 1 ); + } + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + { + FSRef ref; + FT_Error err; + + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( FT_Err_Ok != err ) + return err; + + if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) ) + return FT_Err_Unknown_File_Format; + + return FT_Err_Ok; + } + + + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { +#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) ) + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; +#else + FSRef ref; + FT_Error err; + + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( FT_Err_Ok != err ) + return err; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, + pathSpec, NULL ) ) + return FT_Err_Unknown_File_Format; + + return FT_Err_Ok; +#endif + } + + + static OSErr + FT_FSPathMakeRes( const UInt8* pathname, + ResFileRefNum* res ) + { + OSErr err; + FSRef ref; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + /* at present, no support for dfont format */ + err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); + if ( noErr == err ) + return err; + + /* fallback to original resource-fork font */ + *res = FSOpenResFile( &ref, fsRdPerm ); + err = ResError(); + + return err; + } + + + /* Return the file type for given pathname */ + static OSType + get_file_type_from_path( const UInt8* pathname ) + { + FSRef ref; + FSCatalogInfo info; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return ( OSType ) 0; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info, + NULL, NULL, NULL ) ) + return ( OSType ) 0; + + return ((FInfo *)(info.finderInfo))->fdType; + } + + + /* Given a PostScript font name, create the Macintosh LWFN file name. */ + static void + create_lwfn_name( char* ps_name, + Str255 lwfn_file_name ) + { + int max = 5, count = 0; + FT_Byte* p = lwfn_file_name; + FT_Byte* q = (FT_Byte*)ps_name; + + + lwfn_file_name[0] = 0; + + while ( *q ) + { + if ( ft_isupper( *q ) ) + { + if ( count ) + max = 3; + count = 0; + } + if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) ) + { + *++p = *q; + lwfn_file_name[0]++; + count++; + } + q++; + } + } + + + static short + count_faces_sfnt( char* fond_data ) + { + /* The count is 1 greater than the value in the FOND. */ + /* Isn't that cute? :-) */ + + return EndianS16_BtoN( *( (short*)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + } + + + static short + count_faces_scalable( char* fond_data ) + { + AsscEntry* assoc; + FamRec* fond; + short i, face, face_all; + + + fond = (FamRec*)fond_data; + face_all = EndianS16_BtoN( *( (short *)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + face = 0; + + for ( i = 0; i < face_all; i++ ) + { + if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) ) + face++; + } + return face; + } + + + /* Look inside the FOND data, answer whether there should be an SFNT + resource, and answer the name of a possible LWFN Type 1 file. + + Thanks to Paul Miller (paulm@profoundeffects.com) for the fix + to load a face OTHER than the first one in the FOND! + */ + + + static void + parse_fond( char* fond_data, + short* have_sfnt, + ResID* sfnt_id, + Str255 lwfn_file_name, + short face_index ) + { + AsscEntry* assoc; + AsscEntry* base_assoc; + FamRec* fond; + + + *sfnt_id = 0; + *have_sfnt = 0; + lwfn_file_name[0] = 0; + + fond = (FamRec*)fond_data; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + base_assoc = assoc; + + /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */ + if ( 47 < face_index ) + return; + + /* Let's do a little range checking before we get too excited here */ + if ( face_index < count_faces_sfnt( fond_data ) ) + { + assoc += face_index; /* add on the face_index! */ + + /* if the face at this index is not scalable, + fall back to the first one (old behavior) */ + if ( EndianS16_BtoN( assoc->fontSize ) == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( assoc->fontID ); + } + else if ( base_assoc->fontSize == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( base_assoc->fontID ); + } + } + + if ( EndianS32_BtoN( fond->ffStylOff ) ) + { + unsigned char* p = (unsigned char*)fond_data; + StyleTable* style; + unsigned short string_count; + char ps_name[256]; + unsigned char* names[64]; + int i; + + + p += EndianS32_BtoN( fond->ffStylOff ); + style = (StyleTable*)p; + p += sizeof ( StyleTable ); + string_count = EndianS16_BtoN( *(short*)(p) ); + p += sizeof ( short ); + + for ( i = 0; i < string_count && i < 64; i++ ) + { + names[i] = p; + p += names[i][0]; + p++; + } + + { + size_t ps_name_len = (size_t)names[0][0]; + + + if ( ps_name_len != 0 ) + { + ft_memcpy(ps_name, names[0] + 1, ps_name_len); + ps_name[ps_name_len] = 0; + } + if ( style->indexes[face_index] > 1 && + style->indexes[face_index] <= FT_MIN( string_count, 64 ) ) + { + unsigned char* suffixes = names[style->indexes[face_index] - 1]; + + + for ( i = 1; i <= suffixes[0]; i++ ) + { + unsigned char* s; + size_t j = suffixes[i] - 1; + + + if ( j < string_count && ( s = names[j] ) != NULL ) + { + size_t s_len = (size_t)s[0]; + + + if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) ) + { + ft_memcpy( ps_name + ps_name_len, s + 1, s_len ); + ps_name_len += s_len; + ps_name[ps_name_len] = 0; + } + } + } + } + } + + create_lwfn_name( ps_name, lwfn_file_name ); + } + } + + + static FT_Error + lookup_lwfn_by_fond( const UInt8* path_fond, + ConstStr255Param base_lwfn, + UInt8* path_lwfn, + size_t path_size ) + { + FSRef ref, par_ref; + size_t dirname_len; + + + /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */ + /* We should not extract parent directory by string manipulation. */ + + if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) ) + return FT_Err_Invalid_Argument; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, &par_ref ) ) + return FT_Err_Invalid_Argument; + + if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) ) + return FT_Err_Invalid_Argument; + + if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size ) + return FT_Err_Invalid_Argument; + + /* now we have absolute dirname in path_lwfn */ + ft_strcat( (char *)path_lwfn, "/" ); + dirname_len = ft_strlen( (char *)path_lwfn ); + ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); + path_lwfn[dirname_len + base_lwfn[0]] = '\0'; + + if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, NULL ) ) + return FT_Err_Cannot_Open_Resource; + + return FT_Err_Ok; + } + + + static short + count_faces( Handle fond, + const UInt8* pathname ) + { + ResID sfnt_id; + short have_sfnt, have_lwfn; + Str255 lwfn_file_name; + UInt8 buff[PATH_MAX]; + FT_Error err; + short num_faces; + + + have_sfnt = have_lwfn = 0; + + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); + + if ( lwfn_file_name[0] ) + { + err = lookup_lwfn_by_fond( pathname, lwfn_file_name, + buff, sizeof ( buff ) ); + if ( FT_Err_Ok == err ) + have_lwfn = 1; + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + num_faces = 1; + else + num_faces = count_faces_scalable( *fond ); + + return num_faces; + } + + + /* Read Type 1 data from the POST resources inside the LWFN file, + return a PFB buffer. This is somewhat convoluted because the FT2 + PFB parser wants the ASCII header as one chunk, and the LWFN + chunks are often not organized that way, so we glue chunks + of the same type together. */ + static FT_Error + read_lwfn( FT_Memory memory, + ResFileRefNum res, + FT_Byte** pfb_data, + FT_ULong* size ) + { + FT_Error error = FT_Err_Ok; + ResID res_id; + unsigned char *buffer, *p, *size_p = NULL; + FT_ULong total_size = 0; + FT_ULong old_total_size = 0; + FT_ULong post_size, pfb_chunk_size; + Handle post_data; + char code, last_code; + + + UseResFile( res ); + + /* First pass: load all POST resources, and determine the size of */ + /* the output buffer. */ + res_id = 501; + last_code = -1; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( post_data == NULL ) + break; /* we are done */ + + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( code == 5 ) + total_size += 2; /* just the end code */ + else + total_size += 6; /* code + 4 bytes chunk length */ + } + + total_size += GetHandleSize( post_data ) - 2; + last_code = code; + + /* detect integer overflows */ + if ( total_size < old_total_size ) + { + error = FT_Err_Array_Too_Large; + goto Error; + } + + old_total_size = total_size; + } + + if ( FT_ALLOC( buffer, (FT_Long)total_size ) ) + goto Error; + + /* Second pass: append all POST data to the buffer, add PFB fields. */ + /* Glue all consecutive chunks of the same type together. */ + p = buffer; + res_id = 501; + last_code = -1; + pfb_chunk_size = 0; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( post_data == NULL ) + break; /* we are done */ + + post_size = (FT_ULong)GetHandleSize( post_data ) - 2; + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( last_code != -1 ) + { + /* we are done adding a chunk, fill in the size field */ + if ( size_p != NULL ) + { + *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF ); + } + pfb_chunk_size = 0; + } + + *p++ = 0x80; + if ( code == 5 ) + *p++ = 0x03; /* the end */ + else if ( code == 2 ) + *p++ = 0x02; /* binary segment */ + else + *p++ = 0x01; /* ASCII segment */ + + if ( code != 5 ) + { + size_p = p; /* save for later */ + p += 4; /* make space for size field */ + } + } + + ft_memcpy( p, *post_data + 2, post_size ); + pfb_chunk_size += post_size; + p += post_size; + last_code = code; + } + + *pfb_data = buffer; + *size = total_size; + + Error: + CloseResFile( res ); + return error; + } + + + /* Create a new FT_Face from a file path to an LWFN file. */ + static FT_Error + FT_New_Face_From_LWFN( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Byte* pfb_data; + FT_ULong pfb_size; + FT_Error error; + ResFileRefNum res; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res ) ) + return FT_Err_Cannot_Open_Resource; + + pfb_data = NULL; + pfb_size = 0; + error = read_lwfn( library->memory, res, &pfb_data, &pfb_size ); + CloseResFile( res ); /* PFB is already loaded, useless anymore */ + if ( error ) + return error; + + return open_face_from_buffer( library, + pfb_data, + pfb_size, + face_index, + "type1", + aface ); + } + + + /* Create a new FT_Face from an SFNT resource, specified by res ID. */ + static FT_Error + FT_New_Face_From_SFNT( FT_Library library, + ResID sfnt_id, + FT_Long face_index, + FT_Face* aface ) + { + Handle sfnt = NULL; + FT_Byte* sfnt_data; + size_t sfnt_size; + FT_Error error = FT_Err_Ok; + FT_Memory memory = library->memory; + int is_cff, is_sfnt_ps; + + + sfnt = GetResource( TTAG_sfnt, sfnt_id ); + if ( sfnt == NULL ) + return FT_Err_Invalid_Handle; + + sfnt_size = (FT_ULong)GetHandleSize( sfnt ); + if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) ) + { + ReleaseResource( sfnt ); + return error; + } + + ft_memcpy( sfnt_data, *sfnt, sfnt_size ); + ReleaseResource( sfnt ); + + is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 ); + + if ( is_sfnt_ps ) + { + FT_Stream stream; + + + if ( FT_NEW( stream ) ) + goto Try_OpenType; + + FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size ); + if ( !open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ) ) + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + FT_FREE( sfnt_data ); + goto Exit; + } + + FT_FREE( stream ); + } + Try_OpenType: + error = open_face_from_buffer( library, + sfnt_data, + sfnt_size, + face_index, + is_cff ? "cff" : "truetype", + aface ); + Exit: + return error; + } + + + /* Create a new FT_Face from a file path to a suitcase file. */ + static FT_Error + FT_New_Face_From_Suitcase( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error = FT_Err_Cannot_Open_Resource; + ResFileRefNum res_ref; + ResourceIndex res_index; + Handle fond; + short num_faces_in_res, num_faces_in_fond; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) ) + return FT_Err_Cannot_Open_Resource; + + UseResFile( res_ref ); + if ( ResError() ) + return FT_Err_Cannot_Open_Resource; + + num_faces_in_res = 0; + for ( res_index = 1; ; ++res_index ) + { + fond = Get1IndResource( TTAG_FOND, res_index ); + if ( ResError() ) + break; + + num_faces_in_fond = count_faces( fond, pathname ); + num_faces_in_res += num_faces_in_fond; + + if ( 0 <= face_index && face_index < num_faces_in_fond && error ) + error = FT_New_Face_From_FOND( library, fond, face_index, aface ); + + face_index -= num_faces_in_fond; + } + + CloseResFile( res_ref ); + if ( FT_Err_Ok == error && NULL != aface && NULL != *aface ) + (*aface)->num_faces = num_faces_in_res; + return error; + } + + + /* documentation is in ftmac.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face* aface ) + { + short have_sfnt, have_lwfn = 0; + ResID sfnt_id, fond_id; + OSType fond_type; + Str255 fond_name; + Str255 lwfn_file_name; + UInt8 path_lwfn[PATH_MAX]; + OSErr err; + FT_Error error = FT_Err_Ok; + + + GetResInfo( fond, &fond_id, &fond_type, fond_name ); + if ( ResError() != noErr || fond_type != TTAG_FOND ) + return FT_Err_Invalid_File_Format; + + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index ); + + if ( lwfn_file_name[0] ) + { + ResFileRefNum res; + + + res = HomeResFile( fond ); + if ( noErr != ResError() ) + goto found_no_lwfn_file; + + { + UInt8 path_fond[PATH_MAX]; + FSRef ref; + + + err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, + NULL, NULL, NULL, &ref, NULL ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); + if ( noErr != err ) + goto found_no_lwfn_file; + + error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, + path_lwfn, sizeof ( path_lwfn ) ); + if ( FT_Err_Ok == error ) + have_lwfn = 1; + } + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + error = FT_New_Face_From_LWFN( library, + path_lwfn, + face_index, + aface ); + else + error = FT_Err_Unknown_File_Format; + + found_no_lwfn_file: + if ( have_sfnt && FT_Err_Ok != error ) + error = FT_New_Face_From_SFNT( library, + sfnt_id, + face_index, + aface ); + + return error; + } + + + /* Common function to load a new FT_Face from a resource file. */ + static FT_Error + FT_New_Face_From_Resource( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + OSType file_type; + FT_Error error; + + + /* LWFN is a (very) specific file format, check for it explicitly */ + file_type = get_file_type_from_path( pathname ); + if ( file_type == TTAG_LWFN ) + return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); + + /* Otherwise the file type doesn't matter (there are more than */ + /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ + /* if it works, fine. */ + + error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); + if ( error == 0 ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.); */ + /* we signal this by returning no error and no FT_Face */ + *aface = NULL; + return 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face */ + /* */ + /* <Description> */ + /* This is the Mac-specific implementation of FT_New_Face. In */ + /* addition to the standard FT_New_Face() functionality, it also */ + /* accepts pathnames to Mac suitcase files. For further */ + /* documentation see the original FT_New_Face() in freetype.h. */ + /* */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Open_Args args; + FT_Error error; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + error = FT_Err_Ok; + *aface = NULL; + + /* try resourcefork based font: LWFN, FFIL */ + error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, + face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.) */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSRef */ + /* */ + /* <Description> */ + /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */ + /* accepts an FSRef instead of a path. */ + /* */ + /* This function is deprecated because Carbon data types (FSRef) */ + /* are not cross-platform, and thus not suitable for the freetype API. */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef* ref, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error; + FT_Open_Args args; + OSErr err; + UInt8 pathname[PATH_MAX]; + + + if ( !ref ) + return FT_Err_Invalid_Argument; + + err = FSRefMakePath( ref, pathname, sizeof ( pathname ) ); + if ( err ) + error = FT_Err_Cannot_Open_Resource; + + error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* fallback to datafork font */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */ + /* accepts an FSSpec instead of a path. */ + /* */ + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec* spec, + FT_Long face_index, + FT_Face* aface ) + { +#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) ) + FT_UNUSED( library ); + FT_UNUSED( spec ); + FT_UNUSED( face_index ); + FT_UNUSED( aface ); + + return FT_Err_Unimplemented_Feature; +#else + FSRef ref; + + + if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) + return FT_Err_Invalid_Argument; + else + return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); +#endif + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftmm.c b/src/3rdparty/freetype/src/base/ftmm.c new file mode 100644 index 0000000000..0307729811 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftmm.c @@ -0,0 +1,202 @@ +/***************************************************************************/ +/* */ +/* ftmm.c */ +/* */ +/* Multiple Master font support (body). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_mm + + + static FT_Error + ft_face_get_mm_service( FT_Face face, + FT_Service_MultiMasters *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + MULTI_MASTERS ); + + if ( *aservice ) + error = FT_Err_Ok; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm ) + error = service->get_mm( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm_var ) + error = service->get_mm_var( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_design ) + error = service->set_mm_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_var_design ) + error = service->set_var_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftnames.c b/src/3rdparty/freetype/src/base/ftnames.c new file mode 100644 index 0000000000..7fde5c40bf --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftnames.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftnames.c */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (body). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_SFNT_NAMES_H +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_STREAM_H + + +#ifdef TT_CONFIG_OPTION_SFNT_NAMES + + + /* documentation is in ftnames.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ) + { + return (face && FT_IS_SFNT( face )) ? ((TT_Face)face)->num_names : 0; + } + + + /* documentation is in ftnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( aname && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( idx < (FT_UInt)ttface->num_names ) + { + TT_NameEntryRec* entry = ttface->name_table.names + idx; + + + /* load name on demand */ + if ( entry->stringLength > 0 && entry->string == NULL ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + aname->platform_id = entry->platformID; + aname->encoding_id = entry->encodingID; + aname->language_id = entry->languageID; + aname->name_id = entry->nameID; + aname->string = (FT_Byte*)entry->string; + aname->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + +#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftobjs.c b/src/3rdparty/freetype/src/base/ftobjs.c new file mode 100644 index 0000000000..086237a79d --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftobjs.c @@ -0,0 +1,4402 @@ +/***************************************************************************/ +/* */ +/* ftobjs.c */ +/* */ +/* The FreeType private base classes (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LIST_H +#include FT_OUTLINE_H +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_RFORK_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H /* for SFNT_Load_Table_Func */ +#include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H +#include FT_TRUETYPE_IDS_H +#include FT_OUTLINE_H + +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_TT_CMAP_H +#include FT_SERVICE_KERNING_H +#include FT_SERVICE_TRUETYPE_ENGINE_H + +#include "ftbase.h" + +#define GRID_FIT_METRICS + + + FT_BASE_DEF( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ) + { + FT_Pointer result = NULL; + FT_ServiceDesc desc = service_descriptors; + + + if ( desc && service_id ) + { + for ( ; desc->serv_id != NULL; desc++ ) + { + if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) + { + result = (FT_Pointer)desc->serv_data; + break; + } + } + } + + return result; + } + + + FT_BASE_DEF( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ) + { + valid->base = base; + valid->limit = limit; + valid->level = level; + valid->error = FT_Err_Ok; + } + + + FT_BASE_DEF( FT_Int ) + ft_validator_run( FT_Validator valid ) + { + /* This function doesn't work! None should call it. */ + FT_UNUSED( valid ); + + return -1; + } + + + FT_BASE_DEF( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ) + { + /* since the cast below also disables the compiler's */ + /* type check, we introduce a dummy variable, which */ + /* will be optimized away */ + volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer; + + + valid->error = error; + + /* throw away volatileness; use `jump_buffer' or the */ + /* compiler may warn about an unused local variable */ + ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S T R E A M ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* create a new input stream from an FT_Open_Args structure */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream; + + + *astream = 0; + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !args ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + if ( FT_NEW( stream ) ) + goto Exit; + + stream->memory = memory; + + if ( args->flags & FT_OPEN_MEMORY ) + { + /* create a memory-based stream */ + FT_Stream_OpenMemory( stream, + (const FT_Byte*)args->memory_base, + args->memory_size ); + } + else if ( args->flags & FT_OPEN_PATHNAME ) + { + /* create a normal system stream */ + error = FT_Stream_Open( stream, args->pathname ); + stream->pathname.pointer = args->pathname; + } + else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream ) + { + /* use an existing, user-provided stream */ + + /* in this case, we do not need to allocate a new stream object */ + /* since the caller is responsible for closing it himself */ + FT_FREE( stream ); + stream = args->stream; + } + else + error = FT_Err_Invalid_Argument; + + if ( error ) + FT_FREE( stream ); + else + stream->memory = memory; /* just to be certain */ + + *astream = stream; + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ) + { + if ( stream ) + { + FT_Memory memory = stream->memory; + + + FT_Stream_Close( stream ); + + if ( !external ) + FT_FREE( stream ); + } + } + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + ft_glyphslot_init( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + FT_Error error = FT_Err_Ok; + FT_Slot_Internal internal; + + + slot->library = driver->root.library; + + if ( FT_NEW( internal ) ) + goto Exit; + + slot->internal = internal; + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + error = FT_GlyphLoader_New( memory, &internal->loader ); + + if ( !error && clazz->init_slot ) + error = clazz->init_slot( slot ); + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ) + { + if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + + + FT_FREE( slot->bitmap.buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + /* assume that the bitmap buffer was stolen or not */ + /* allocated from the heap */ + slot->bitmap.buffer = NULL; + } + } + + + FT_BASE_DEF( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ) + { + ft_glyphslot_free_bitmap( slot ); + + slot->bitmap.buffer = buffer; + + FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 ); + } + + + FT_BASE_DEF( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + FT_Error error; + + + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + FT_FREE( slot->bitmap.buffer ); + else + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + (void)FT_ALLOC( slot->bitmap.buffer, size ); + return error; + } + + + static void + ft_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* clear all public fields in the glyph slot */ + FT_ZERO( &slot->metrics ); + FT_ZERO( &slot->outline ); + + slot->bitmap.width = 0; + slot->bitmap.rows = 0; + slot->bitmap.pitch = 0; + slot->bitmap.pixel_mode = 0; + /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */ + + slot->bitmap_left = 0; + slot->bitmap_top = 0; + slot->num_subglyphs = 0; + slot->subglyphs = 0; + slot->control_data = 0; + slot->control_len = 0; + slot->other = 0; + slot->format = FT_GLYPH_FORMAT_NONE; + + slot->linearHoriAdvance = 0; + slot->linearVertAdvance = 0; + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + + + static void + ft_glyphslot_done( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + + + if ( clazz->done_slot ) + clazz->done_slot( slot ); + + /* free bitmap buffer if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* slot->internal might be 0 in out-of-memory situations */ + if ( slot->internal ) + { + /* free glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + FT_GlyphLoader_Done( slot->internal->loader ); + slot->internal->loader = 0; + } + + FT_FREE( slot->internal ); + } + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ) + { + FT_Error error; + FT_Driver driver; + FT_Driver_Class clazz; + FT_Memory memory; + FT_GlyphSlot slot; + + + if ( !face || !face->driver ) + return FT_Err_Invalid_Argument; + + driver = face->driver; + clazz = driver->clazz; + memory = driver->root.memory; + + FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" )); + if ( !FT_ALLOC( slot, clazz->slot_object_size ) ) + { + slot->face = face; + + error = ft_glyphslot_init( slot ); + if ( error ) + { + ft_glyphslot_done( slot ); + FT_FREE( slot ); + goto Exit; + } + + slot->next = face->glyph; + face->glyph = slot; + + if ( aslot ) + *aslot = slot; + } + else if ( aslot ) + *aslot = 0; + + + Exit: + FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error )); + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ) + { + if ( slot ) + { + FT_Driver driver = slot->face->driver; + FT_Memory memory = driver->root.memory; + FT_GlyphSlot prev; + FT_GlyphSlot cur; + + + /* Remove slot from its parent face's list */ + prev = NULL; + cur = slot->face->glyph; + + while ( cur ) + { + if ( cur == slot ) + { + if ( !prev ) + slot->face->glyph = cur->next; + else + prev->next = cur->next; + + ft_glyphslot_done( slot ); + FT_FREE( slot ); + break; + } + prev = cur; + cur = cur->next; + } + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Face_Internal internal; + + + if ( !face ) + return; + + internal = face->internal; + + internal->transform_flags = 0; + + if ( !matrix ) + { + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + matrix = &internal->transform_matrix; + } + else + internal->transform_matrix = *matrix; + + /* set transform_flags bit flag 0 if `matrix' isn't the identity */ + if ( ( matrix->xy | matrix->yx ) || + matrix->xx != 0x10000L || + matrix->yy != 0x10000L ) + internal->transform_flags |= 1; + + if ( !delta ) + { + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + delta = &internal->transform_delta; + } + else + internal->transform_delta = *delta; + + /* set transform_flags bit flag 1 if `delta' isn't the null vector */ + if ( delta->x | delta->y ) + internal->transform_flags |= 2; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ); + + +#ifdef GRID_FIT_METRICS + static void + ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot, + FT_Bool vertical ) + { + FT_Glyph_Metrics* metrics = &slot->metrics; + FT_Pos right, bottom; + + + if ( vertical ) + { + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); + + right = FT_PIX_CEIL( metrics->vertBearingX + metrics->width ); + bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height ); + + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + metrics->width = right - metrics->vertBearingX; + metrics->height = bottom - metrics->vertBearingY; + } + else + { + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + right = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width ); + bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height ); + + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); + + metrics->width = right - metrics->horiBearingX; + metrics->height = metrics->horiBearingY - bottom; + } + + metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); + metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); + } +#endif /* GRID_FIT_METRICS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + FT_Driver driver; + FT_GlyphSlot slot; + FT_Library library; + FT_Bool autohint = FALSE; + FT_Module hinter; + + + if ( !face || !face->size || !face->glyph ) + return FT_Err_Invalid_Face_Handle; + + /* The validity test for `glyph_index' is performed by the */ + /* font drivers. */ + + slot = face->glyph; + ft_glyphslot_clear( slot ); + + driver = face->driver; + library = driver->root.library; + hinter = library->auto_hinter; + + /* resolve load flags dependencies */ + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_IGNORE_TRANSFORM; + + if ( load_flags & FT_LOAD_NO_SCALE ) + { + load_flags |= FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP; + + load_flags &= ~FT_LOAD_RENDER; + } + + /* + * Determine whether we need to auto-hint or not. + * The general rules are: + * + * - Do only auto-hinting if we have a hinter module, + * a scalable font format dealing with outlines, + * and no transforms except simple slants. + * + * - Then, autohint if FT_LOAD_FORCE_AUTOHINT is set + * or if we don't have a native font hinter. + * + * - Otherwise, auto-hint for LIGHT hinting mode. + * + * - Exception: The font is `tricky' and requires + * the native hinter to load properly. + */ + + if ( hinter && + !( load_flags & FT_LOAD_NO_HINTING ) && + !( load_flags & FT_LOAD_NO_AUTOHINT ) && + FT_DRIVER_IS_SCALABLE( driver ) && + FT_DRIVER_USES_OUTLINES( driver ) && + !FT_IS_TRICKY( face ) && + face->internal->transform_matrix.yy > 0 && + face->internal->transform_matrix.yx == 0 ) + { + if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) || + !FT_DRIVER_HAS_HINTER( driver ) ) + autohint = TRUE; + else + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_LIGHT || + face->internal->ignore_unpatented_hinter ) + autohint = TRUE; + } + } + + if ( autohint ) + { + FT_AutoHinter_Service hinting; + + + /* try to load embedded bitmaps first if available */ + /* */ + /* XXX: This is really a temporary hack that should disappear */ + /* promptly with FreeType 2.1! */ + /* */ + if ( FT_HAS_FIXED_SIZES( face ) && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + error = driver->clazz->load_glyph( slot, face->size, + glyph_index, + load_flags | FT_LOAD_SBITS_ONLY ); + + if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP ) + goto Load_Ok; + } + + { + FT_Face_Internal internal = face->internal; + FT_Int transform_flags = internal->transform_flags; + + + /* since the auto-hinter calls FT_Load_Glyph by itself, */ + /* make sure that glyphs aren't transformed */ + internal->transform_flags = 0; + + /* load auto-hinted outline */ + hinting = (FT_AutoHinter_Service)hinter->clazz->module_interface; + + error = hinting->load_glyph( (FT_AutoHinter)hinter, + slot, face->size, + glyph_index, load_flags ); + + internal->transform_flags = transform_flags; + } + } + else + { + error = driver->clazz->load_glyph( slot, + face->size, + glyph_index, + load_flags ); + if ( error ) + goto Exit; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* check that the loaded outline is correct */ + error = FT_Outline_Check( &slot->outline ); + if ( error ) + goto Exit; + +#ifdef GRID_FIT_METRICS + if ( !( load_flags & FT_LOAD_NO_HINTING ) ) + ft_glyphslot_grid_fit_metrics( slot, + FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) ); +#endif + } + } + + Load_Ok: + /* compute the advance */ + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + slot->advance.x = 0; + slot->advance.y = slot->metrics.vertAdvance; + } + else + { + slot->advance.x = slot->metrics.horiAdvance; + slot->advance.y = 0; + } + + /* compute the linear advance in 16.16 pixels */ + if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && + ( FT_IS_SCALABLE( face ) ) ) + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + /* it's tricky! */ + slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, + metrics->x_scale, 64 ); + + slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, + metrics->y_scale, 64 ); + } + + if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) + { + FT_Face_Internal internal = face->internal; + + + /* now, transform the glyph image if needed */ + if ( internal->transform_flags ) + { + /* get renderer */ + FT_Renderer renderer = ft_lookup_glyph_renderer( slot ); + + + if ( renderer ) + error = renderer->clazz->transform_glyph( + renderer, slot, + &internal->transform_matrix, + &internal->transform_delta ); + /* transform advance */ + FT_Vector_Transform( &slot->advance, &internal->transform_matrix ); + } + } + + /* do we need to render the image now? */ + if ( !error && + slot->format != FT_GLYPH_FORMAT_BITMAP && + slot->format != FT_GLYPH_FORMAT_COMPOSITE && + load_flags & FT_LOAD_RENDER ) + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_NORMAL && + (load_flags & FT_LOAD_MONOCHROME ) ) + mode = FT_RENDER_MODE_MONO; + + error = FT_Render_Glyph( slot, mode ); + } + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ) + { + FT_UInt glyph_index; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + glyph_index = (FT_UInt)char_code; + if ( face->charmap ) + glyph_index = FT_Get_Char_Index( face, char_code ); + + return FT_Load_Glyph( face, glyph_index, load_flags ); + } + + + /* destructor for sizes list */ + static void + destroy_size( FT_Memory memory, + FT_Size size, + FT_Driver driver ) + { + /* finalize client-specific data */ + if ( size->generic.finalizer ) + size->generic.finalizer( size ); + + /* finalize format-specific stuff */ + if ( driver->clazz->done_size ) + driver->clazz->done_size( size ); + + FT_FREE( size->internal ); + FT_FREE( size ); + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ); + + + static void + destroy_charmaps( FT_Face face, + FT_Memory memory ) + { + FT_Int n; + + + if ( !face ) + return; + + for ( n = 0; n < face->num_charmaps; n++ ) + { + FT_CMap cmap = FT_CMAP( face->charmaps[n] ); + + + ft_cmap_done_internal( cmap ); + + face->charmaps[n] = NULL; + } + + FT_FREE( face->charmaps ); + face->num_charmaps = 0; + } + + + /* destructor for faces list */ + static void + destroy_face( FT_Memory memory, + FT_Face face, + FT_Driver driver ) + { + FT_Driver_Class clazz = driver->clazz; + + + /* discard auto-hinting data */ + if ( face->autohint.finalizer ) + face->autohint.finalizer( face->autohint.data ); + + /* Discard glyph slots for this face. */ + /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */ + while ( face->glyph ) + FT_Done_GlyphSlot( face->glyph ); + + /* discard all sizes for this face */ + FT_List_Finalize( &face->sizes_list, + (FT_List_Destructor)destroy_size, + memory, + driver ); + face->size = 0; + + /* now discard client data */ + if ( face->generic.finalizer ) + face->generic.finalizer( face ); + + /* discard charmaps */ + destroy_charmaps( face, memory ); + + /* finalize format-specific stuff */ + if ( clazz->done_face ) + clazz->done_face( face ); + + /* close the stream for this face if needed */ + FT_Stream_Free( + face->stream, + ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->stream = 0; + + /* get rid of it */ + if ( face->internal ) + { + FT_FREE( face->internal ); + } + FT_FREE( face ); + } + + + static void + Destroy_Driver( FT_Driver driver ) + { + FT_List_Finalize( &driver->faces_list, + (FT_List_Destructor)destroy_face, + driver->root.memory, + driver ); + + /* check whether we need to drop the driver's glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + FT_GlyphLoader_Done( driver->glyph_loader ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_unicode_charmap */ + /* */ + /* <Description> */ + /* This function finds a Unicode charmap, if there is one. */ + /* And if there is more than one, it tries to favour the more */ + /* extensive one, i.e., one that supports UCS-4 against those which */ + /* are limited to the BMP (said UCS-2 encoding.) */ + /* */ + /* This function is called from open_face() (just below), and also */ + /* from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). */ + /* */ + static FT_Error + find_unicode_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return FT_Err_Invalid_CharMap_Handle; + + /* + * The original TrueType specification(s) only specified charmap + * formats that are capable of mapping 8 or 16 bit character codes to + * glyph indices. + * + * However, recent updates to the Apple and OpenType specifications + * introduced new formats that are capable of mapping 32-bit character + * codes as well. And these are already used on some fonts, mainly to + * map non-BMP Asian ideographs as defined in Unicode. + * + * For compatibility purposes, these fonts generally come with + * *several* Unicode charmaps: + * + * - One of them in the "old" 16-bit format, that cannot access + * all glyphs in the font. + * + * - Another one in the "new" 32-bit format, that can access all + * the glyphs. + * + * This function has been written to always favor a 32-bit charmap + * when found. Otherwise, a 16-bit one is returned when found. + */ + + /* Since the `interesting' table, with IDs (3,10), is normally the */ + /* last one, we loop backwards. This loses with type1 fonts with */ + /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */ + /* chars (.01% ?), and this is the same about 99.99% of the time! */ + + cur = first + face->num_charmaps; /* points after the last one */ + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + /* XXX If some new encodings to represent UCS-4 are added, */ + /* they should be added here. */ + if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && + cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || + ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + } + + /* We do not have any UCS-4 charmap. */ + /* Do the loop again and search for UCS-2 charmaps. */ + cur = first + face->num_charmaps; + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + + return FT_Err_Invalid_CharMap_Handle; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_variant_selector_charmap */ + /* */ + /* <Description> */ + /* This function finds the variant selector charmap, if there is one. */ + /* There can only be one (platform=0, specific=5, format=14). */ + /* */ + static FT_CharMap + find_variant_selector_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* end; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return NULL; + + end = first + face->num_charmaps; /* points after the last one */ + + for ( cur = first; cur < end; ++cur ) + { + if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && + FT_Get_CMap_Format( cur[0] ) == 14 ) + return cur[0]; + } + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* open_face */ + /* */ + /* <Description> */ + /* This function does some work for FT_Open_Face(). */ + /* */ + static FT_Error + open_face( FT_Driver driver, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter* params, + FT_Face *aface ) + { + FT_Memory memory; + FT_Driver_Class clazz; + FT_Face face = 0; + FT_Error error, error2; + FT_Face_Internal internal = NULL; + + + clazz = driver->clazz; + memory = driver->root.memory; + + /* allocate the face object and perform basic initialization */ + if ( FT_ALLOC( face, clazz->face_object_size ) ) + goto Fail; + + if ( FT_NEW( internal ) ) + goto Fail; + + face->internal = internal; + + face->driver = driver; + face->memory = memory; + face->stream = stream; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + int i; + + + face->internal->incremental_interface = 0; + for ( i = 0; i < num_params && !face->internal->incremental_interface; + i++ ) + if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL ) + face->internal->incremental_interface = + (FT_Incremental_Interface)params[i].data; + } +#endif + + if ( clazz->init_face ) + error = clazz->init_face( stream, + face, + (FT_Int)face_index, + num_params, + params ); + if ( error ) + goto Fail; + + /* select Unicode charmap by default */ + error2 = find_unicode_charmap( face ); + + /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */ + /* is returned. */ + + /* no error should happen, but we want to play safe */ + if ( error2 && error2 != FT_Err_Invalid_CharMap_Handle ) + { + error = error2; + goto Fail; + } + + *aface = face; + + Fail: + if ( error ) + { + destroy_charmaps( face, memory ); + if ( clazz->done_face && face ) + clazz->done_face( face ); + FT_FREE( internal ); + FT_FREE( face ); + *aface = 0; + } + + return error; + } + + + /* there's a Mac-specific extended implementation of FT_New_Face() */ + /* in src/base/ftmac.c */ + +#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + args.stream = NULL; + + return FT_Open_Face( library, &args, face_index, aface ); + } + +#endif /* defined( FT_MACINTOSH ) && !defined( DARWIN_NO_CARBON ) */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `face' delayed to FT_Open_Face() */ + if ( !file_base ) + return FT_Err_Invalid_Argument; + + args.flags = FT_OPEN_MEMORY; + args.memory_base = file_base; + args.memory_size = file_size; + args.stream = NULL; + + return FT_Open_Face( library, &args, face_index, aface ); + } + + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + + /* The behavior here is very similar to that in base/ftmac.c, but it */ + /* is designed to work on non-mac systems, so no mac specific calls. */ + /* */ + /* We look at the file and determine if it is a mac dfont file or a mac */ + /* resource file, or a macbinary file containing a mac resource file. */ + /* */ + /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */ + /* the point, especially since there may be multiple `FOND' resources. */ + /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */ + /* they occur in the file. */ + /* */ + /* Note that multiple `POST' resources do not mean multiple postscript */ + /* fonts; they all get jammed together to make what is essentially a */ + /* pfb file. */ + /* */ + /* We aren't interested in `NFNT' or `FONT' bitmap resources. */ + /* */ + /* As soon as we get an `sfnt' load it into memory and pass it off to */ + /* FT_Open_Face. */ + /* */ + /* If we have a (set of) `POST' resources, massage them into a (memory) */ + /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */ + /* going to try to save the kerning info. After all that lives in the */ + /* `FOND' which isn't in the file containing the `POST' resources so */ + /* we don't really have access to it. */ + + + /* Finalizer for a memory stream; gets called by FT_Done_Face(). */ + /* It frees the memory it uses. */ + /* From ftmac.c. */ + static void + memory_stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->base = 0; + stream->close = 0; + } + + + /* Create a new memory stream from a buffer and a size. */ + /* From ftmac.c. */ + static FT_Error + new_memory_stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream_CloseFunc close, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !base ) + return FT_Err_Invalid_Argument; + + *astream = 0; + memory = library->memory; + if ( FT_NEW( stream ) ) + goto Exit; + + FT_Stream_OpenMemory( stream, base, size ); + + stream->close = close; + + *astream = stream; + + Exit: + return error; + } + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* from ftmac.c */ + FT_LOCAL_DEF( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ) + { + FT_Open_Args args; + FT_Error error; + FT_Stream stream = NULL; + FT_Memory memory = library->memory; + + + error = new_memory_stream( library, + base, + size, + memory_stream_close, + &stream ); + if ( error ) + { + FT_FREE( base ); + return error; + } + + args.flags = FT_OPEN_STREAM; + args.stream = stream; + if ( driver_name ) + { + args.flags = args.flags | FT_OPEN_DRIVER; + args.driver = FT_Get_Module( library, driver_name ); + } + +#ifdef FT_MACINTOSH + /* At this point, face_index has served its purpose; */ + /* whoever calls this function has already used it to */ + /* locate the correct font data. We should not propagate */ + /* this index to FT_Open_Face() (unless it is negative). */ + + if ( face_index > 0 ) + face_index = 0; +#endif + + error = FT_Open_Face( library, &args, face_index, aface ); + + if ( error == FT_Err_Ok ) + (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + else +#ifdef FT_MACINTOSH + FT_Stream_Free( stream, 0 ); +#else + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + } +#endif + + return error; + } + + + /* Look up `TYP1' or `CID ' table from sfnt table directory. */ + /* `offset' and `length' must exclude the binary header in tables. */ + + /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */ + /* format too. Here, since we can't expect that the TrueType font */ + /* driver is loaded unconditially, we must parse the font by */ + /* ourselves. We are only interested in the name of the table and */ + /* the offset. */ + + static FT_Error + ft_lookup_PS_in_sfnt_stream( FT_Stream stream, + FT_Long face_index, + FT_ULong* offset, + FT_ULong* length, + FT_Bool* is_sfnt_cid ) + { + FT_Error error; + FT_UShort numTables; + FT_Long pstable_index; + FT_ULong tag; + int i; + + + *offset = 0; + *length = 0; + *is_sfnt_cid = FALSE; + + /* TODO: support for sfnt-wrapped PS/CID in TTC format */ + + /* version check for 'typ1' (should be ignored?) */ + if ( FT_READ_ULONG( tag ) ) + return error; + if ( tag != TTAG_typ1 ) + return FT_Err_Unknown_File_Format; + + if ( FT_READ_USHORT( numTables ) ) + return error; + if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */ + return error; + + pstable_index = -1; + *is_sfnt_cid = FALSE; + + for ( i = 0; i < numTables; i++ ) + { + if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) || + FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) ) + return error; + + if ( tag == TTAG_CID ) + { + pstable_index++; + *offset += 22; + *length -= 22; + *is_sfnt_cid = TRUE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + else if ( tag == TTAG_TYP1 ) + { + pstable_index++; + *offset += 24; + *length -= 24; + *is_sfnt_cid = FALSE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + if ( face_index >= 0 && pstable_index == face_index ) + return FT_Err_Ok; + } + return FT_Err_Table_Missing; + } + + + FT_LOCAL_DEF( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ) + { + FT_Error error; + FT_Memory memory = library->memory; + FT_ULong offset, length; + FT_Long pos; + FT_Bool is_sfnt_cid; + FT_Byte* sfnt_ps; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + pos = FT_Stream_Pos( stream ); + + error = ft_lookup_PS_in_sfnt_stream( stream, + face_index, + &offset, + &length, + &is_sfnt_cid ); + if ( error ) + goto Exit; + + if ( FT_Stream_Seek( stream, pos + offset ) ) + goto Exit; + + if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length ); + if ( error ) + goto Exit; + + error = open_face_from_buffer( library, + sfnt_ps, + length, + face_index < 0 ? face_index : 0, + is_sfnt_cid ? "cid" : "type1", + aface ); + Exit: + { + FT_Error error1; + + + if ( error == FT_Err_Unknown_File_Format ) + { + error1 = FT_Stream_Seek( stream, pos ); + if ( error1 ) + return error1; + } + + return error; + } + } + + +#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) + + /* The resource header says we've got resource_cnt `POST' (type1) */ + /* resources in this file. They all need to be coalesced into */ + /* one lump which gets passed on to the type1 driver. */ + /* Here can be only one PostScript font in a file so face_index */ + /* must be 0 (or -1). */ + /* */ + static FT_Error + Mac_Read_POST_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Error error = FT_Err_Cannot_Open_Resource; + FT_Memory memory = library->memory; + FT_Byte* pfb_data; + int i, type, flags; + FT_Long len; + FT_Long pfb_len, pfb_pos, pfb_lenpos; + FT_Long rlen, temp; + + + if ( face_index == -1 ) + face_index = 0; + if ( face_index != 0 ) + return error; + + /* Find the length of all the POST resources, concatenated. Assume */ + /* worst case (each resource in its own section). */ + pfb_len = 0; + for ( i = 0; i < resource_cnt; ++i ) + { + error = FT_Stream_Seek( stream, offsets[i] ); + if ( error ) + goto Exit; + if ( FT_READ_LONG( temp ) ) + goto Exit; + pfb_len += temp + 6; + } + + if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) + goto Exit; + + pfb_data[0] = 0x80; + pfb_data[1] = 1; /* Ascii section */ + pfb_data[2] = 0; /* 4-byte length, fill in later */ + pfb_data[3] = 0; + pfb_data[4] = 0; + pfb_data[5] = 0; + pfb_pos = 6; + pfb_lenpos = 2; + + len = 0; + type = 1; + for ( i = 0; i < resource_cnt; ++i ) + { + error = FT_Stream_Seek( stream, offsets[i] ); + if ( error ) + goto Exit2; + if ( FT_READ_LONG( rlen ) ) + goto Exit; + if ( FT_READ_USHORT( flags ) ) + goto Exit; + rlen -= 2; /* the flags are part of the resource */ + if ( ( flags >> 8 ) == type ) + len += rlen; + else + { + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + if ( ( flags >> 8 ) == 5 ) /* End of font mark */ + break; + + pfb_data[pfb_pos++] = 0x80; + + type = flags >> 8; + len = rlen; + + pfb_data[pfb_pos++] = (FT_Byte)type; + pfb_lenpos = pfb_pos; + pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + } + + error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); + pfb_pos += rlen; + } + + pfb_data[pfb_pos++] = 0x80; + pfb_data[pfb_pos++] = 3; + + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + return open_face_from_buffer( library, + pfb_data, + pfb_pos, + face_index, + "type1", + aface ); + + Exit2: + FT_FREE( pfb_data ); + + Exit: + return error; + } + + + /* The resource header says we've got resource_cnt `sfnt' */ + /* (TrueType/OpenType) resources in this file. Look through */ + /* them for the one indicated by face_index, load it into mem, */ + /* pass it on the the truetype driver and return it. */ + /* */ + static FT_Error + Mac_Read_sfnt_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Byte* sfnt_data; + FT_Error error; + FT_Long flag_offset; + FT_Long rlen; + int is_cff; + FT_Long face_index_in_resource = 0; + + + if ( face_index == -1 ) + face_index = 0; + if ( face_index >= resource_cnt ) + return FT_Err_Cannot_Open_Resource; + + flag_offset = offsets[face_index]; + error = FT_Stream_Seek( stream, flag_offset ); + if ( error ) + goto Exit; + + if ( FT_READ_LONG( rlen ) ) + goto Exit; + if ( rlen == -1 ) + return FT_Err_Cannot_Open_Resource; + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ); + if ( !error ) + goto Exit; + + /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */ + if ( FT_Stream_Seek( stream, flag_offset + 4 ) ) + goto Exit; + + if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) ) + return error; + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen ); + if ( error ) + goto Exit; + + is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + error = open_face_from_buffer( library, + sfnt_data, + rlen, + face_index_in_resource, + is_cff ? "cff" : "truetype", + aface ); + + Exit: + return error; + } + + + /* Check for a valid resource fork header, or a valid dfont */ + /* header. In a resource fork the first 16 bytes are repeated */ + /* at the location specified by bytes 4-7. In a dfont bytes */ + /* 4-7 point to 16 bytes of zeroes instead. */ + /* */ + static FT_Error + IsMacResource( FT_Library library, + FT_Stream stream, + FT_Long resource_offset, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Long map_offset, rdara_pos; + FT_Long *data_offsets; + FT_Long count; + + + error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, + &map_offset, &rdara_pos ); + if ( error ) + return error; + + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdara_pos, + TTAG_POST, + &data_offsets, &count ); + if ( !error ) + { + error = Mac_Read_POST_Resource( library, stream, data_offsets, count, + face_index, aface ); + FT_FREE( data_offsets ); + /* POST exists in an LWFN providing a single face */ + if ( !error ) + (*aface)->num_faces = 1; + return error; + } + + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdara_pos, + TTAG_sfnt, + &data_offsets, &count ); + if ( !error ) + { + FT_Long face_index_internal = face_index % count; + + + error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count, + face_index_internal, aface ); + FT_FREE( data_offsets ); + if ( !error ) + (*aface)->num_faces = count; + } + + return error; + } + + + /* Check for a valid macbinary header, and if we find one */ + /* check that the (flattened) resource fork in it is valid. */ + /* */ + static FT_Error + IsMacBinary( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface ) + { + unsigned char header[128]; + FT_Error error; + FT_Long dlen, offset; + + + if ( NULL == stream ) + return FT_Err_Invalid_Stream_Operation; + + error = FT_Stream_Seek( stream, 0 ); + if ( error ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte*)header, 128 ); + if ( error ) + goto Exit; + + if ( header[ 0] != 0 || + header[74] != 0 || + header[82] != 0 || + header[ 1] == 0 || + header[ 1] > 33 || + header[63] != 0 || + header[2 + header[1]] != 0 ) + return FT_Err_Unknown_File_Format; + + dlen = ( header[0x53] << 24 ) | + ( header[0x54] << 16 ) | + ( header[0x55] << 8 ) | + header[0x56]; +#if 0 + rlen = ( header[0x57] << 24 ) | + ( header[0x58] << 16 ) | + ( header[0x59] << 8 ) | + header[0x5a]; +#endif /* 0 */ + offset = 128 + ( ( dlen + 127 ) & ~127 ); + + return IsMacResource( library, stream, offset, face_index, aface ); + + Exit: + return error; + } + + + static FT_Error + load_face_in_embedded_rfork( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_Memory memory = library->memory; + FT_Error error = FT_Err_Unknown_File_Format; + int i; + + char * file_names[FT_RACCESS_N_RULES]; + FT_Long offsets[FT_RACCESS_N_RULES]; + FT_Error errors[FT_RACCESS_N_RULES]; + + FT_Open_Args args2; + FT_Stream stream2 = 0; + + + FT_Raccess_Guess( library, stream, + args->pathname, file_names, offsets, errors ); + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + if ( errors[i] ) + { + FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i )); + continue; + } + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_names[i] ? file_names[i] : args->pathname; + + FT_TRACE3(( "Try rule %d: %s (offset=%d) ...", + i, args2.pathname, offsets[i] )); + + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + { + FT_TRACE3(( "failed\n" )); + continue; + } + + error = IsMacResource( library, stream2, offsets[i], + face_index, aface ); + FT_Stream_Free( stream2, 0 ); + + FT_TRACE3(( "%s\n", error ? "failed": "successful" )); + + if ( !error ) + break; + } + + for (i = 0; i < FT_RACCESS_N_RULES; i++) + { + if ( file_names[i] ) + FT_FREE( file_names[i] ); + } + + /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */ + if ( error ) + error = FT_Err_Unknown_File_Format; + + return error; + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + + /* Check for some macintosh formats without Carbon framework. */ + /* Is this a macbinary file? If so look at the resource fork. */ + /* Is this a mac dfont file? */ + /* Is this an old style resource fork? (in data) */ + /* Else call load_face_in_embedded_rfork to try extra rules */ + /* (defined in `ftrfork.c'). */ + /* */ + static FT_Error + load_mac_face( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + FT_Error error; + FT_UNUSED( args ); + + + error = IsMacBinary( library, stream, face_index, aface ); + if ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_TRACE3(( "Try as dfont: %s ...", args->pathname )); + + error = IsMacResource( library, stream, 0, face_index, aface ); + + FT_TRACE3(( "%s\n", error ? "failed" : "successful" )); + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format || + FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) && + ( args->flags & FT_OPEN_PATHNAME ) ) + error = load_face_in_embedded_rfork( library, stream, + face_index, aface, args ); + return error; + } +#endif + +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_Stream stream = 0; + FT_Face face = 0; + FT_ListNode node = 0; + FT_Bool external_stream; + FT_Module* cur; + FT_Module* limit; + + + /* test for valid `library' delayed to */ + /* FT_Stream_New() */ + + if ( ( !aface && face_index >= 0 ) || !args ) + return FT_Err_Invalid_Argument; + + external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) && + args->stream ); + + /* create input stream */ + error = FT_Stream_New( library, args, &stream ); + if ( error ) + goto Fail3; + + memory = library->memory; + + /* If the font driver is specified in the `args' structure, use */ + /* it. Otherwise, we scan the list of registered drivers. */ + if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver ) + { + driver = FT_DRIVER( args->driver ); + + /* not all modules are drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( driver ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = 0; + + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + } + else + error = FT_Err_Invalid_Handle; + + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + else + { + /* check each font driver for an appropriate format */ + cur = library->modules; + limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + /* not all modules are font drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( cur[0] ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = 0; + + + driver = FT_DRIVER( cur[0] ); + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && + FT_ERROR_BASE( error ) == FT_Err_Table_Missing ) + { + /* TrueType but essential tables are missing */ + if ( FT_Stream_Seek( stream, 0 ) ) + break; + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + num_params, + params, + aface ); + if ( !error ) + { + FT_Stream_Free( stream, external_stream ); + return error; + } + } +#endif + + if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) + goto Fail3; + } + } + + Fail3: + /* If we are on the mac, and we get an FT_Err_Invalid_Stream_Operation */ + /* it may be because we have an empty data fork, so we need to check */ + /* the resource fork. */ + if ( FT_ERROR_BASE( error ) != FT_Err_Cannot_Open_Stream && + FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format && + FT_ERROR_BASE( error ) != FT_Err_Invalid_Stream_Operation ) + goto Fail2; + +#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) + error = load_mac_face( library, stream, face_index, aface, args ); + if ( !error ) + { + /* We don't want to go to Success here. We've already done that. */ + /* On the other hand, if we succeeded we still need to close this */ + /* stream (we opened a different stream which extracted the */ + /* interesting information out of this stream here. That stream */ + /* will still be open and the face will point to it). */ + FT_Stream_Free( stream, external_stream ); + return error; + } + + if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) + goto Fail2; +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + /* no driver is able to handle this format */ + error = FT_Err_Unknown_File_Format; + + Fail2: + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + + Success: + FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" )); + + /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */ + if ( external_stream ) + face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM; + + /* add the face object to its driver's list */ + if ( FT_NEW( node ) ) + goto Fail; + + node->data = face; + /* don't assume driver is the same as face->driver, so use */ + /* face->driver instead. */ + FT_List_Add( &face->driver->faces_list, node ); + + /* now allocate a glyph slot object for the face */ + FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" )); + + if ( face_index >= 0 ) + { + error = FT_New_GlyphSlot( face, NULL ); + if ( error ) + goto Fail; + + /* finally, allocate a size object for the face */ + { + FT_Size size; + + + FT_TRACE4(( "FT_Open_Face: Creating size object\n" )); + + error = FT_New_Size( face, &size ); + if ( error ) + goto Fail; + + face->size = size; + } + } + + /* some checks */ + + if ( FT_IS_SCALABLE( face ) ) + { + if ( face->height < 0 ) + face->height = (FT_Short)-face->height; + + if ( !FT_HAS_VERTICAL( face ) ) + face->max_advance_height = (FT_Short)face->height; + } + + if ( FT_HAS_FIXED_SIZES( face ) ) + { + FT_Int i; + + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( bsize->height < 0 ) + bsize->height = (FT_Short)-bsize->height; + if ( bsize->x_ppem < 0 ) + bsize->x_ppem = (FT_Short)-bsize->x_ppem; + if ( bsize->y_ppem < 0 ) + bsize->y_ppem = -bsize->y_ppem; + } + } + + /* initialize internal face data */ + { + FT_Face_Internal internal = face->internal; + + + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + } + + if ( aface ) + *aface = face; + else + FT_Done_Face( face ); + + goto Exit; + + Fail: + FT_Done_Face( face ); + + Exit: + FT_TRACE4(( "FT_Open_Face: Return %d\n", error )); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ) + { + FT_Open_Args open; + + + /* test for valid `face' delayed to FT_Attach_Stream() */ + + if ( !filepathname ) + return FT_Err_Invalid_Argument; + + open.stream = NULL; + open.flags = FT_OPEN_PATHNAME; + open.pathname = (char*)filepathname; + + return FT_Attach_Stream( face, &open ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ) + { + FT_Stream stream; + FT_Error error; + FT_Driver driver; + + FT_Driver_Class clazz; + + + /* test for valid `parameters' delayed to FT_Stream_New() */ + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + if ( !driver ) + return FT_Err_Invalid_Driver_Handle; + + error = FT_Stream_New( driver->root.library, parameters, &stream ); + if ( error ) + goto Exit; + + /* we implement FT_Attach_Stream in each driver through the */ + /* `attach_file' interface */ + + error = FT_Err_Unimplemented_Feature; + clazz = driver->clazz; + if ( clazz->attach_file ) + error = clazz->attach_file( face, stream ); + + /* close the attached stream */ + FT_Stream_Free( stream, + (FT_Bool)( parameters->stream && + ( parameters->flags & FT_OPEN_STREAM ) ) ); + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Face( FT_Face face ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_ListNode node; + + + error = FT_Err_Invalid_Face_Handle; + if ( face && face->driver ) + { + driver = face->driver; + memory = driver->root.memory; + + /* find face in driver's list */ + node = FT_List_Find( &driver->faces_list, face ); + if ( node ) + { + /* remove face object from the driver's list */ + FT_List_Remove( &driver->faces_list, node ); + FT_FREE( node ); + + /* now destroy the object proper */ + destroy_face( memory, face, driver ); + error = FT_Err_Ok; + } + } + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size *asize ) + { + FT_Error error; + FT_Memory memory; + FT_Driver driver; + FT_Driver_Class clazz; + + FT_Size size = 0; + FT_ListNode node = 0; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !asize ) + return FT_Err_Invalid_Size_Handle; + + if ( !face->driver ) + return FT_Err_Invalid_Driver_Handle; + + *asize = 0; + + driver = face->driver; + clazz = driver->clazz; + memory = face->memory; + + /* Allocate new size object and perform basic initialisation */ + if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) ) + goto Exit; + + size->face = face; + + /* for now, do not use any internal fields in size objects */ + size->internal = 0; + + if ( clazz->init_size ) + error = clazz->init_size( size ); + + /* in case of success, add to the face's list */ + if ( !error ) + { + *asize = size; + node->data = size; + FT_List_Add( &face->sizes_list, node ); + } + + Exit: + if ( error ) + { + FT_FREE( node ); + FT_FREE( size ); + } + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Size( FT_Size size ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_Face face; + FT_ListNode node; + + + if ( !size ) + return FT_Err_Invalid_Size_Handle; + + face = size->face; + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + if ( !driver ) + return FT_Err_Invalid_Driver_Handle; + + memory = driver->root.memory; + + error = FT_Err_Ok; + node = FT_List_Find( &face->sizes_list, size ); + if ( node ) + { + FT_List_Remove( &face->sizes_list, node ); + FT_FREE( node ); + + if ( face->size == size ) + { + face->size = 0; + if ( face->sizes_list.head ) + face->size = (FT_Size)(face->sizes_list.head->data); + } + + destroy_size( memory, size, driver ); + } + else + error = FT_Err_Invalid_Size_Handle; + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ) + { + FT_Int i; + FT_Long w, h; + + + if ( !FT_HAS_FIXED_SIZES( face ) ) + return FT_Err_Invalid_Face_Handle; + + /* FT_Bitmap_Size doesn't provide enough info... */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + return FT_Err_Unimplemented_Feature; + + w = FT_REQUEST_WIDTH ( req ); + h = FT_REQUEST_HEIGHT( req ); + + if ( req->width && !req->height ) + h = w; + else if ( !req->width && req->height ) + w = h; + + w = FT_PIX_ROUND( w ); + h = FT_PIX_ROUND( h ); + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( h != FT_PIX_ROUND( bsize->y_ppem ) ) + continue; + + if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width ) + { + if ( size_index ) + *size_index = (FT_ULong)i; + + return FT_Err_Ok; + } + } + + return FT_Err_Invalid_Pixel_Size; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ) + { + /* the factor 1.2 is a heuristical value */ + if ( !advance ) + advance = metrics->height * 12 / 10; + + metrics->vertBearingX = -( metrics->width / 2 ); + metrics->vertBearingY = ( advance - metrics->height ) / 2; + metrics->vertAdvance = advance; + } + + + static void + ft_recompute_scaled_metrics( FT_Face face, + FT_Size_Metrics* metrics ) + { + /* Compute root ascender, descender, test height, and max_advance */ + +#ifdef GRID_FIT_METRICS + metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, + metrics->y_scale ) ); + + metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, + metrics->y_scale ) ); + + metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, + metrics->y_scale ) ); + + metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, + metrics->x_scale ) ); +#else /* !GRID_FIT_METRICS */ + metrics->ascender = FT_MulFix( face->ascender, + metrics->y_scale ); + + metrics->descender = FT_MulFix( face->descender, + metrics->y_scale ); + + metrics->height = FT_MulFix( face->height, + metrics->y_scale ); + + metrics->max_advance = FT_MulFix( face->max_advance_width, + metrics->x_scale ); +#endif /* !GRID_FIT_METRICS */ + } + + + FT_BASE_DEF( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ) + { + FT_Size_Metrics* metrics; + FT_Bitmap_Size* bsize; + + + metrics = &face->size->metrics; + bsize = face->available_sizes + strike_index; + + metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 ); + + if ( FT_IS_SCALABLE( face ) ) + { + metrics->x_scale = FT_DivFix( bsize->x_ppem, + face->units_per_EM ); + metrics->y_scale = FT_DivFix( bsize->y_ppem, + face->units_per_EM ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + metrics->ascender = bsize->y_ppem; + metrics->descender = 0; + metrics->height = bsize->height << 6; + metrics->max_advance = bsize->x_ppem; + } + } + + + FT_BASE_DEF( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ) + { + FT_Size_Metrics* metrics; + + + metrics = &face->size->metrics; + + if ( FT_IS_SCALABLE( face ) ) + { + FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0; + + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + w = h = face->units_per_EM; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + w = h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_BBOX: + w = face->bbox.xMax - face->bbox.xMin; + h = face->bbox.yMax - face->bbox.yMin; + break; + + case FT_SIZE_REQUEST_TYPE_CELL: + w = face->max_advance_width; + h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_SCALES: + metrics->x_scale = (FT_Fixed)req->width; + metrics->y_scale = (FT_Fixed)req->height; + if ( !metrics->x_scale ) + metrics->x_scale = metrics->y_scale; + else if ( !metrics->y_scale ) + metrics->y_scale = metrics->x_scale; + goto Calculate_Ppem; + + case FT_SIZE_REQUEST_TYPE_MAX: + break; + } + + /* to be on the safe side */ + if ( w < 0 ) + w = -w; + + if ( h < 0 ) + h = -h; + + scaled_w = FT_REQUEST_WIDTH ( req ); + scaled_h = FT_REQUEST_HEIGHT( req ); + + /* determine scales */ + if ( req->width ) + { + metrics->x_scale = FT_DivFix( scaled_w, w ); + + if ( req->height ) + { + metrics->y_scale = FT_DivFix( scaled_h, h ); + + if ( req->type == FT_SIZE_REQUEST_TYPE_CELL ) + { + if ( metrics->y_scale > metrics->x_scale ) + metrics->y_scale = metrics->x_scale; + else + metrics->x_scale = metrics->y_scale; + } + } + else + { + metrics->y_scale = metrics->x_scale; + scaled_h = FT_MulDiv( scaled_w, h, w ); + } + } + else + { + metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h ); + scaled_w = FT_MulDiv( scaled_h, w, h ); + } + + Calculate_Ppem: + /* calculate the ppems */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + { + scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale ); + scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale ); + } + + metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + FT_ZERO( metrics ); + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ) + { + FT_Driver_Class clazz; + + + if ( !face || !FT_HAS_FIXED_SIZES( face ) ) + return FT_Err_Invalid_Face_Handle; + + if ( strike_index < 0 || strike_index >= face->num_fixed_sizes ) + return FT_Err_Invalid_Argument; + + clazz = face->driver->clazz; + + if ( clazz->select_size ) + return clazz->select_size( face->size, (FT_ULong)strike_index ); + + FT_Select_Metrics( face, (FT_ULong)strike_index ); + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ) + { + FT_Driver_Class clazz; + FT_ULong strike_index; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !req || req->width < 0 || req->height < 0 || + req->type >= FT_SIZE_REQUEST_TYPE_MAX ) + return FT_Err_Invalid_Argument; + + clazz = face->driver->clazz; + + if ( clazz->request_size ) + return clazz->request_size( face->size, req ); + + /* + * The reason that a driver doesn't have `request_size' defined is + * either that the scaling here suffices or that the supported formats + * are bitmap-only and size matching is not implemented. + * + * In the latter case, a simple size matching is done. + */ + if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) ) + { + FT_Error error; + + + error = FT_Match_Size( face, req, 0, &strike_index ); + if ( error ) + return error; + + FT_TRACE3(( "FT_Request_Size: bitmap strike %lu matched\n", + strike_index )); + + return FT_Select_Size( face, (FT_Int)strike_index ); + } + + FT_Request_Metrics( face, req ); + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ) + { + FT_Size_RequestRec req; + + + if ( !char_width ) + char_width = char_height; + else if ( !char_height ) + char_height = char_width; + + if ( !horz_resolution ) + horz_resolution = vert_resolution; + else if ( !vert_resolution ) + vert_resolution = horz_resolution; + + if ( char_width < 1 * 64 ) + char_width = 1 * 64; + if ( char_height < 1 * 64 ) + char_height = 1 * 64; + + if ( !horz_resolution ) + horz_resolution = vert_resolution = 72; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = char_width; + req.height = char_height; + req.horiResolution = horz_resolution; + req.vertResolution = vert_resolution; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ) + { + FT_Size_RequestRec req; + + + if ( pixel_width == 0 ) + pixel_width = pixel_height; + else if ( pixel_height == 0 ) + pixel_height = pixel_width; + + if ( pixel_width < 1 ) + pixel_width = 1; + if ( pixel_height < 1 ) + pixel_height = 1; + + /* use `>=' to avoid potential compiler warning on 16bit platforms */ + if ( pixel_width >= 0xFFFFU ) + pixel_width = 0xFFFFU; + if ( pixel_height >= 0xFFFFU ) + pixel_height = 0xFFFFU; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = pixel_width << 6; + req.height = pixel_height << 6; + req.horiResolution = 0; + req.vertResolution = 0; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ) + { + FT_Error error = FT_Err_Ok; + FT_Driver driver; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !akerning ) + return FT_Err_Invalid_Argument; + + driver = face->driver; + + akerning->x = 0; + akerning->y = 0; + + if ( driver->clazz->get_kerning ) + { + error = driver->clazz->get_kerning( face, + left_glyph, + right_glyph, + akerning ); + if ( !error ) + { + if ( kern_mode != FT_KERNING_UNSCALED ) + { + akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale ); + akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale ); + + if ( kern_mode != FT_KERNING_UNFITTED ) + { + /* we scale down kerning values for small ppem values */ + /* to avoid that rounding makes them too big. */ + /* `25' has been determined heuristically. */ + if ( face->size->metrics.x_ppem < 25 ) + akerning->x = FT_MulDiv( akerning->x, + face->size->metrics.x_ppem, 25 ); + if ( face->size->metrics.y_ppem < 25 ) + akerning->y = FT_MulDiv( akerning->y, + face->size->metrics.y_ppem, 25 ); + + akerning->x = FT_PIX_ROUND( akerning->x ); + akerning->y = FT_PIX_ROUND( akerning->y ); + } + } + } + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ) + { + FT_Service_Kerning service; + FT_Error error = FT_Err_Ok; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !akerning ) + return FT_Err_Invalid_Argument; + + FT_FACE_FIND_SERVICE( face, service, KERNING ); + if ( !service ) + return FT_Err_Unimplemented_Feature; + + error = service->get_track( face, + point_size, + degree, + akerning ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( encoding == FT_ENCODING_NONE ) + return FT_Err_Invalid_Argument; + + /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */ + /* charmap available, i.e., one with UCS-4 characters, if possible. */ + /* */ + /* This is done by find_unicode_charmap() above, to share code. */ + if ( encoding == FT_ENCODING_UNICODE ) + return find_unicode_charmap( face ); + + cur = face->charmaps; + if ( !cur ) + return FT_Err_Invalid_CharMap_Handle; + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0]->encoding == encoding ) + { + face->charmap = cur[0]; + return 0; + } + } + + return FT_Err_Invalid_Argument; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + cur = face->charmaps; + if ( !cur ) + return FT_Err_Invalid_CharMap_Handle; + if ( FT_Get_CMap_Format( charmap ) == 14 ) + return FT_Err_Invalid_Argument; + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == charmap ) + { + face->charmap = cur[0]; + return 0; + } + } + return FT_Err_Invalid_Argument; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ) + { + FT_Int i; + + + for ( i = 0; i < charmap->face->num_charmaps; i++ ) + if ( charmap->face->charmaps[i] == charmap ) + break; + + FT_ASSERT( i < charmap->face->num_charmaps ); + + return i; + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ) + { + FT_CMap_Class clazz = cmap->clazz; + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY(face); + + + if ( clazz->done ) + clazz->done( cmap ); + + FT_FREE( cmap ); + } + + + FT_BASE_DEF( void ) + FT_CMap_Done( FT_CMap cmap ) + { + if ( cmap ) + { + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Error error; + FT_Int i, j; + + + for ( i = 0; i < face->num_charmaps; i++ ) + { + if ( (FT_CMap)face->charmaps[i] == cmap ) + { + FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1]; + + + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps - 1 ) ) + return; + + /* remove it from our list of charmaps */ + for ( j = i + 1; j < face->num_charmaps; j++ ) + { + if ( j == face->num_charmaps - 1 ) + face->charmaps[j - 1] = last_charmap; + else + face->charmaps[j - 1] = face->charmaps[j]; + } + + face->num_charmaps--; + + if ( (FT_CMap)face->charmap == cmap ) + face->charmap = NULL; + + ft_cmap_done_internal( cmap ); + + break; + } + } + } + } + + + FT_BASE_DEF( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ) + { + FT_Error error = FT_Err_Ok; + FT_Face face; + FT_Memory memory; + FT_CMap cmap; + + + if ( clazz == NULL || charmap == NULL || charmap->face == NULL ) + return FT_Err_Invalid_Argument; + + face = charmap->face; + memory = FT_FACE_MEMORY( face ); + + if ( !FT_ALLOC( cmap, clazz->size ) ) + { + cmap->charmap = *charmap; + cmap->clazz = clazz; + + if ( clazz->init ) + { + error = clazz->init( cmap, init_data ); + if ( error ) + goto Fail; + } + + /* add it to our list of charmaps */ + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps + 1 ) ) + goto Fail; + + face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap; + } + + Exit: + if ( acmap ) + *acmap = cmap; + + return error; + + Fail: + ft_cmap_done_internal( cmap ); + cmap = NULL; + goto Exit; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ) + { + FT_UInt result = 0; + + + if ( face && face->charmap ) + { + FT_CMap cmap = FT_CMAP( face->charmap ); + + + result = cmap->clazz->char_index( cmap, charcode ); + } + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + if ( face && face->charmap ) + { + gindex = FT_Get_Char_Index( face, 0 ); + if ( gindex == 0 ) + result = FT_Get_Next_Char( face, 0, &gindex ); + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong charcode, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + if ( face && face->charmap ) + { + FT_UInt32 code = (FT_UInt32)charcode; + FT_CMap cmap = FT_CMAP( face->charmap ); + + + gindex = cmap->clazz->char_next( cmap, &code ); + result = ( gindex == 0 ) ? 0 : code; + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_UInt result = 0; + + + if ( face && face->charmap && + face->charmap->encoding == FT_ENCODING_UNICODE ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + FT_CMap ucmap = FT_CMAP( face->charmap ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + result = vcmap->clazz->char_var_index( vcmap, ucmap, charcode, + variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_Int result = -1; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + result = vcmap->clazz->char_var_default( vcmap, charcode, + variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + result = vcmap->clazz->variant_list( vcmap, memory ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + result = vcmap->clazz->charvariant_list( vcmap, memory, charcode ); + } + } + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + result = vcmap->clazz->variantchar_list( vcmap, memory, + variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ) + { + FT_UInt result = 0; + + + if ( face && FT_HAS_GLYPH_NAMES( face ) ) + { + FT_Service_GlyphDict service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); + + if ( service && service->name_index ) + result = service->name_index( face, glyph_name ); + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + /* clean up buffer */ + if ( buffer && buffer_max > 0 ) + ((FT_Byte*)buffer)[0] = 0; + + if ( face && + glyph_index <= (FT_UInt)face->num_glyphs && + FT_HAS_GLYPH_NAMES( face ) ) + { + FT_Service_GlyphDict service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); + + if ( service && service->get_name ) + error = service->get_name( face, glyph_index, buffer, buffer_max ); + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_Postscript_Name( FT_Face face ) + { + const char* result = NULL; + + + if ( !face ) + goto Exit; + + if ( !result ) + { + FT_Service_PsFontName service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + POSTSCRIPT_FONT_NAME ); + + if ( service && service->get_ps_font_name ) + result = service->get_ps_font_name( face ); + } + + Exit: + return result; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ) + { + void* table = 0; + FT_Service_SFNT_Table service; + + + if ( face && FT_IS_SFNT( face ) ) + { + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service != NULL ) + table = service->get_table( face, tag ); + } + + return table; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Service_SFNT_Table service; + + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_Err_Invalid_Face_Handle; + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service == NULL ) + return FT_Err_Unimplemented_Feature; + + return service->load_table( face, tag, offset, buffer, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ) + { + FT_Service_SFNT_Table service; + + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_Err_Invalid_Face_Handle; + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service == NULL ) + return FT_Err_Unimplemented_Feature; + + return service->table_info( face, table_index, tag, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return 0; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( service == NULL ) + return 0; + if ( service->get_cmap_info( charmap, &cmap_info )) + return 0; + + return cmap_info.language; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return -1; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( service == NULL ) + return -1; + if ( service->get_cmap_info( charmap, &cmap_info )) + return -1; + + return cmap_info.format; + } + + + /* documentation is in ftsizes.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Activate_Size( FT_Size size ) + { + FT_Face face; + + + if ( size == NULL ) + return FT_Err_Invalid_Argument; + + face = size->face; + if ( face == NULL || face->driver == NULL ) + return FT_Err_Invalid_Argument; + + /* we don't need anything more complex than that; all size objects */ + /* are already listed by the face */ + face->size = size; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* lookup a renderer by glyph format in the library's list */ + FT_BASE_DEF( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ) + { + FT_ListNode cur; + FT_Renderer result = 0; + + + if ( !library ) + goto Exit; + + cur = library->renderers.head; + + if ( node ) + { + if ( *node ) + cur = (*node)->next; + *node = 0; + } + + while ( cur ) + { + FT_Renderer renderer = FT_RENDERER( cur->data ); + + + if ( renderer->glyph_format == format ) + { + if ( node ) + *node = cur; + + result = renderer; + break; + } + cur = cur->next; + } + + Exit: + return result; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ) + { + FT_Face face = slot->face; + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Renderer result = library->cur_renderer; + + + if ( !result || result->glyph_format != slot->format ) + result = FT_Lookup_Renderer( library, slot->format, 0 ); + + return result; + } + + + static void + ft_set_current_renderer( FT_Library library ) + { + FT_Renderer renderer; + + + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 ); + library->cur_renderer = renderer; + } + + + static FT_Error + ft_add_renderer( FT_Module module ) + { + FT_Library library = module->library; + FT_Memory memory = library->memory; + FT_Error error; + FT_ListNode node; + + + if ( FT_NEW( node ) ) + goto Exit; + + { + FT_Renderer render = FT_RENDERER( module ); + FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz; + + + render->clazz = clazz; + render->glyph_format = clazz->glyph_format; + + /* allocate raster object if needed */ + if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + clazz->raster_class->raster_new ) + { + error = clazz->raster_class->raster_new( memory, &render->raster ); + if ( error ) + goto Fail; + + render->raster_render = clazz->raster_class->raster_render; + render->render = clazz->render_glyph; + } + + /* add to list */ + node->data = module; + FT_List_Add( &library->renderers, node ); + + ft_set_current_renderer( library ); + } + + Fail: + if ( error ) + FT_FREE( node ); + + Exit: + return error; + } + + + static void + ft_remove_renderer( FT_Module module ) + { + FT_Library library = module->library; + FT_Memory memory = library->memory; + FT_ListNode node; + + + node = FT_List_Find( &library->renderers, module ); + if ( node ) + { + FT_Renderer render = FT_RENDERER( module ); + + + /* release raster object, if any */ + if ( render->raster ) + render->clazz->raster_class->raster_done( render->raster ); + + /* remove from list */ + FT_List_Remove( &library->renderers, node ); + FT_FREE( node ); + + ft_set_current_renderer( library ); + } + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ) + { + /* test for valid `library' delayed to FT_Lookup_Renderer() */ + + return FT_Lookup_Renderer( library, format, 0 ); + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ) + { + FT_ListNode node; + FT_Error error = FT_Err_Ok; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !renderer ) + return FT_Err_Invalid_Argument; + + node = FT_List_Find( &library->renderers, renderer ); + if ( !node ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_List_Up( &library->renderers, node ); + + if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE ) + library->cur_renderer = renderer; + + if ( num_params > 0 ) + { + FT_Renderer_SetModeFunc set_mode = renderer->clazz->set_mode; + + + for ( ; num_params > 0; num_params-- ) + { + error = set_mode( renderer, parameters->tag, parameters->data ); + if ( error ) + break; + } + } + + Exit: + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Error error = FT_Err_Ok; + FT_Renderer renderer; + + + /* if it is already a bitmap, no need to do anything */ + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_BITMAP: /* already a bitmap, don't do anything */ + break; + + default: + { + FT_ListNode node = 0; + FT_Bool update = 0; + + + /* small shortcut for the very common case */ + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + renderer = library->cur_renderer; + node = library->renderers.head; + } + else + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + + error = FT_Err_Unimplemented_Feature; + while ( renderer ) + { + error = renderer->render( renderer, slot, render_mode, NULL ); + if ( !error || + FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format. */ + + /* now, look for another renderer that supports the same */ + /* format. */ + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + update = 1; + } + + /* if we changed the current renderer for the glyph image format */ + /* we need to select it as the next current one */ + if ( !error && update && renderer ) + FT_Set_Renderer( library, renderer, 0, 0 ); + } + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Library library; + + + if ( !slot ) + return FT_Err_Invalid_Argument; + + library = FT_FACE_LIBRARY( slot->face ); + + return FT_Render_Glyph_Internal( library, slot, render_mode ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Destroy_Module */ + /* */ + /* <Description> */ + /* Destroys a given module object. For drivers, this also destroys */ + /* all child faces. */ + /* */ + /* <InOut> */ + /* module :: A handle to the target driver object. */ + /* */ + /* <Note> */ + /* The driver _must_ be LOCKED! */ + /* */ + static void + Destroy_Module( FT_Module module ) + { + FT_Memory memory = module->memory; + FT_Module_Class* clazz = module->clazz; + FT_Library library = module->library; + + + /* finalize client-data - before anything else */ + if ( module->generic.finalizer ) + module->generic.finalizer( module ); + + if ( library && library->auto_hinter == module ) + library->auto_hinter = 0; + + /* if the module is a renderer */ + if ( FT_MODULE_IS_RENDERER( module ) ) + ft_remove_renderer( module ); + + /* if the module is a font driver, add some steps */ + if ( FT_MODULE_IS_DRIVER( module ) ) + Destroy_Driver( FT_DRIVER( module ) ); + + /* finalize the module object */ + if ( clazz->module_done ) + clazz->module_done( module ); + + /* discard it */ + FT_FREE( module ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ) + { + FT_Error error; + FT_Memory memory; + FT_Module module; + FT_UInt nn; + + +#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \ + FREETYPE_MINOR ) + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !clazz ) + return FT_Err_Invalid_Argument; + + /* check freetype version */ + if ( clazz->module_requires > FREETYPE_VER_FIXED ) + return FT_Err_Invalid_Version; + + /* look for a module with the same name in the library's table */ + for ( nn = 0; nn < library->num_modules; nn++ ) + { + module = library->modules[nn]; + if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 ) + { + /* this installed module has the same name, compare their versions */ + if ( clazz->module_version <= module->clazz->module_version ) + return FT_Err_Lower_Module_Version; + + /* remove the module from our list, then exit the loop to replace */ + /* it by our new version.. */ + FT_Remove_Module( library, module ); + break; + } + } + + memory = library->memory; + error = FT_Err_Ok; + + if ( library->num_modules >= FT_MAX_MODULES ) + { + error = FT_Err_Too_Many_Drivers; + goto Exit; + } + + /* allocate module object */ + if ( FT_ALLOC( module, clazz->module_size ) ) + goto Exit; + + /* base initialization */ + module->library = library; + module->memory = memory; + module->clazz = (FT_Module_Class*)clazz; + + /* check whether the module is a renderer - this must be performed */ + /* before the normal module initialization */ + if ( FT_MODULE_IS_RENDERER( module ) ) + { + /* add to the renderers list */ + error = ft_add_renderer( module ); + if ( error ) + goto Fail; + } + + /* is the module a auto-hinter? */ + if ( FT_MODULE_IS_HINTER( module ) ) + library->auto_hinter = module; + + /* if the module is a font driver */ + if ( FT_MODULE_IS_DRIVER( module ) ) + { + /* allocate glyph loader if needed */ + FT_Driver driver = FT_DRIVER( module ); + + + driver->clazz = (FT_Driver_Class)module->clazz; + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + error = FT_GlyphLoader_New( memory, &driver->glyph_loader ); + if ( error ) + goto Fail; + } + } + + if ( clazz->module_init ) + { + error = clazz->module_init( module ); + if ( error ) + goto Fail; + } + + /* add module to the library's table */ + library->modules[library->num_modules++] = module; + + Exit: + return error; + + Fail: + if ( FT_MODULE_IS_DRIVER( module ) ) + { + FT_Driver driver = FT_DRIVER( module ); + + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + FT_GlyphLoader_Done( driver->glyph_loader ); + } + + if ( FT_MODULE_IS_RENDERER( module ) ) + { + FT_Renderer renderer = FT_RENDERER( module ); + + + if ( renderer->raster ) + renderer->clazz->raster_class->raster_done( renderer->raster ); + } + + FT_FREE( module ); + goto Exit; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ) + { + FT_Module result = 0; + FT_Module* cur; + FT_Module* limit; + + + if ( !library || !module_name ) + return result; + + cur = library->modules; + limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 ) + { + result = cur[0]; + break; + } + + return result; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ) + { + FT_Module module; + + + /* test for valid `library' delayed to FT_Get_Module() */ + + module = FT_Get_Module( library, mod_name ); + + return module ? module->clazz->module_interface : 0; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ) + { + FT_Pointer result = NULL; + + if ( module ) + { + FT_ASSERT( module->clazz && module->clazz->get_interface ); + + /* first, look for the service in the module + */ + if ( module->clazz->get_interface ) + result = module->clazz->get_interface( module, service_id ); + + if ( result == NULL ) + { + /* we didn't find it, look in all other modules then + */ + FT_Library library = module->library; + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] != module ) + { + FT_ASSERT( cur[0]->clazz ); + + if ( cur[0]->clazz->get_interface ) + { + result = cur[0]->clazz->get_interface( cur[0], service_id ); + if ( result != NULL ) + break; + } + } + } + } + } + + return result; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ) + { + /* try to find the module from the table, then remove it from there */ + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( module ) + { + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == module ) + { + /* remove it from the table */ + library->num_modules--; + limit--; + while ( cur < limit ) + { + cur[0] = cur[1]; + cur++; + } + limit[0] = 0; + + /* destroy the module */ + Destroy_Module( module ); + + return FT_Err_Ok; + } + } + } + return FT_Err_Invalid_Driver_Handle; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ) + { + FT_Library library = 0; + FT_Error error; + + + if ( !memory ) + return FT_Err_Invalid_Argument; + +#ifdef FT_DEBUG_LEVEL_ERROR + /* init debugging support */ + ft_debug_init(); +#endif + + /* first of all, allocate the library object */ + if ( FT_NEW( library ) ) + return error; + + library->memory = memory; + + /* allocate the render pool */ + library->raster_pool_size = FT_RENDER_POOL_SIZE; +#if FT_RENDER_POOL_SIZE > 0 + if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) ) + goto Fail; +#endif + + /* That's ok now */ + *alibrary = library; + + return FT_Err_Ok; + + Fail: + FT_FREE( library ); + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ) + { + FT_Int major = 0; + FT_Int minor = 0; + FT_Int patch = 0; + + + if ( library ) + { + major = library->version_major; + minor = library->version_minor; + patch = library->version_patch; + } + + if ( amajor ) + *amajor = major; + + if ( aminor ) + *aminor = minor; + + if ( apatch ) + *apatch = patch; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Library( FT_Library library ) + { + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + memory = library->memory; + + /* Discard client-data */ + if ( library->generic.finalizer ) + library->generic.finalizer( library ); + + /* Close all faces in the library. If we don't do + * this, we can have some subtle memory leaks. + * Example: + * + * - the cff font driver uses the pshinter module in cff_size_done + * - if the pshinter module is destroyed before the cff font driver, + * opened FT_Face objects managed by the driver are not properly + * destroyed, resulting in a memory leak + */ + { + FT_UInt n; + + + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + FT_List faces; + + + if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) + continue; + + faces = &FT_DRIVER(module)->faces_list; + while ( faces->head ) + { + FT_Done_Face( FT_FACE( faces->head->data ) ); + if ( faces->head ) + FT_ERROR(( "FT_Done_Library: failed to free some faces\n" )); + } + } + } + + /* Close all other modules in the library */ +#if 1 + /* XXX Modules are removed in the reversed order so that */ + /* type42 module is removed before truetype module. This */ + /* avoids double free in some occasions. It is a hack. */ + while ( library->num_modules > 0 ) + FT_Remove_Module( library, + library->modules[library->num_modules - 1] ); +#else + { + FT_UInt n; + + + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + + + if ( module ) + { + Destroy_Module( module ); + library->modules[n] = 0; + } + } + } +#endif + + /* Destroy raster objects */ + FT_FREE( library->raster_pool ); + library->raster_pool_size = 0; + + FT_FREE( library ); + return FT_Err_Ok; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ) + { + if ( library && debug_hook && + hook_index < + ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) ) + library->debug_hooks[hook_index] = debug_hook; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ) + { + FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE; + + + if ( library ) + { + FT_Module module = FT_Get_Module( library, "truetype" ); + + + if ( module ) + { + FT_Service_TrueTypeEngine service; + + + service = (FT_Service_TrueTypeEngine) + ft_module_get_service( module, + FT_SERVICE_ID_TRUETYPE_ENGINE ); + if ( service ) + result = service->engine_type; + } + } + + return result; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE_DEF( FT_Error ) + ft_stub_set_char_sizes( FT_Size size, + FT_F26Dot6 width, + FT_F26Dot6 height, + FT_UInt horz_res, + FT_UInt vert_res ) + { + FT_Size_RequestRec req; + FT_Driver driver = size->face->driver; + + + if ( driver->clazz->request_size ) + { + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = width; + req.height = height; + + if ( horz_res == 0 ) + horz_res = vert_res; + + if ( vert_res == 0 ) + vert_res = horz_res; + + if ( horz_res == 0 ) + horz_res = vert_res = 72; + + req.horiResolution = horz_res; + req.vertResolution = vert_res; + + return driver->clazz->request_size( size, &req ); + } + + return 0; + } + + + FT_BASE_DEF( FT_Error ) + ft_stub_set_pixel_sizes( FT_Size size, + FT_UInt width, + FT_UInt height ) + { + FT_Size_RequestRec req; + FT_Driver driver = size->face->driver; + + + if ( driver->clazz->request_size ) + { + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = width << 6; + req.height = height << 6; + req.horiResolution = 0; + req.vertResolution = 0; + + return driver->clazz->request_size( size, &req ); + } + + return 0; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( glyph != NULL && + glyph->format == FT_GLYPH_FORMAT_COMPOSITE && + sub_index < glyph->num_subglyphs ) + { + FT_SubGlyph subg = glyph->subglyphs + sub_index; + + + *p_index = subg->index; + *p_flags = subg->flags; + *p_arg1 = subg->arg1; + *p_arg2 = subg->arg2; + *p_transform = subg->transform; + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftotval.c b/src/3rdparty/freetype/src/base/ftotval.c new file mode 100644 index 0000000000..20ed686eee --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftotval.c @@ -0,0 +1,84 @@ +/***************************************************************************/ +/* */ +/* ftotval.c */ +/* */ +/* FreeType API for validating OpenType tables (body). */ +/* */ +/* Copyright 2004, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_OPENTYPE_VALIDATE_H +#include FT_OPENTYPE_VALIDATE_H + + + /* documentation is in ftotval.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ) + { + FT_Service_OTvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_Err_Invalid_Face_Handle; + goto Exit; + } + + if ( !( BASE_table && + GDEF_table && + GPOS_table && + GSUB_table && + JSTF_table ) ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + BASE_table, + GDEF_table, + GPOS_table, + GSUB_table, + JSTF_table ); + else + error = FT_Err_Unimplemented_Feature; + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( table ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftoutln.c b/src/3rdparty/freetype/src/base/ftoutln.c new file mode 100644 index 0000000000..49ef82e27d --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftoutln.c @@ -0,0 +1,1128 @@ +/***************************************************************************/ +/* */ +/* ftoutln.c */ +/* */ +/* FreeType outline management (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* All functions are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRIGONOMETRY_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_outline + + + static + const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 }; + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_UInt first; /* index of first point in contour */ + FT_Int tag; /* current point's state */ + + FT_Int shift; + FT_Pos delta; + + + if ( !outline || !func_interface ) + return FT_Err_Invalid_Argument; + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_Int last; /* index of last point in contour */ + + + FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return FT_Err_Ok; + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); + return error; + + Invalid_Outline: + return FT_Err_Invalid_Outline; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + FT_Error error; + + + if ( !anoutline || !memory ) + return FT_Err_Invalid_Argument; + + *anoutline = null_outline; + + if ( FT_NEW_ARRAY( anoutline->points, numPoints * 2L ) || + FT_NEW_ARRAY( anoutline->tags, numPoints ) || + FT_NEW_ARRAY( anoutline->contours, numContours ) ) + goto Fail; + + anoutline->n_points = (FT_UShort)numPoints; + anoutline->n_contours = (FT_Short)numContours; + anoutline->flags |= FT_OUTLINE_OWNER; + + return FT_Err_Ok; + + Fail: + anoutline->flags |= FT_OUTLINE_OWNER; + FT_Outline_Done_Internal( memory, anoutline ); + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + return FT_Outline_New_Internal( library->memory, numPoints, + numContours, anoutline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Check( FT_Outline* outline ) + { + if ( outline ) + { + FT_Int n_points = outline->n_points; + FT_Int n_contours = outline->n_contours; + FT_Int end0, end; + FT_Int n; + + + /* empty glyph? */ + if ( n_points == 0 && n_contours == 0 ) + return 0; + + /* check point and contour counts */ + if ( n_points <= 0 || n_contours <= 0 ) + goto Bad; + + end0 = end = -1; + for ( n = 0; n < n_contours; n++ ) + { + end = outline->contours[n]; + + /* note that we don't accept empty contours */ + if ( end <= end0 || end >= n_points ) + goto Bad; + + end0 = end; + } + + if ( end != n_points - 1 ) + goto Bad; + + /* XXX: check the tags array */ + return 0; + } + + Bad: + return FT_Err_Invalid_Argument; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ) + { + FT_Int is_owner; + + + if ( !source || !target || + source->n_points != target->n_points || + source->n_contours != target->n_contours ) + return FT_Err_Invalid_Argument; + + if ( source == target ) + return FT_Err_Ok; + + FT_ARRAY_COPY( target->points, source->points, source->n_points ); + + FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); + + FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); + + /* copy all flags, except the `FT_OUTLINE_OWNER' one */ + is_owner = target->flags & FT_OUTLINE_OWNER; + target->flags = source->flags; + + target->flags &= ~FT_OUTLINE_OWNER; + target->flags |= is_owner; + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ) + { + if ( memory && outline ) + { + if ( outline->flags & FT_OUTLINE_OWNER ) + { + FT_FREE( outline->points ); + FT_FREE( outline->tags ); + FT_FREE( outline->contours ); + } + *outline = null_outline; + + return FT_Err_Ok; + } + else + return FT_Err_Invalid_Argument; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ) + { + /* check for valid `outline' in FT_Outline_Done_Internal() */ + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + return FT_Outline_Done_Internal( library->memory, outline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ) + { + FT_Pos xMin, yMin, xMax, yMax; + + + if ( outline && acbox ) + { + if ( outline->n_points == 0 ) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + + for ( ; vec < limit; vec++ ) + { + FT_Pos x, y; + + + x = vec->x; + if ( x < xMin ) xMin = x; + if ( x > xMax ) xMax = x; + + y = vec->y; + if ( y < yMin ) yMin = y; + if ( y > yMax ) yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ) + { + FT_UShort n; + FT_Vector* vec; + + + if ( !outline ) + return; + + vec = outline->points; + + for ( n = 0; n < outline->n_points; n++ ) + { + vec->x += xOffset; + vec->y += yOffset; + vec++; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Reverse( FT_Outline* outline ) + { + FT_UShort n; + FT_Int first, last; + + + if ( !outline ) + return; + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + last = outline->contours[n]; + + /* reverse point table */ + { + FT_Vector* p = outline->points + first; + FT_Vector* q = outline->points + last; + FT_Vector swap; + + + while ( p < q ) + { + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + /* reverse tags table */ + { + char* p = outline->tags + first; + char* q = outline->tags + last; + char swap; + + + while ( p < q ) + { + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + first = last + 1; + } + + outline->flags ^= FT_OUTLINE_REVERSE_FILL; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ) + { + FT_Error error; + FT_Bool update = FALSE; + FT_Renderer renderer; + FT_ListNode node; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !outline || !params ) + return FT_Err_Invalid_Argument; + + renderer = library->cur_renderer; + node = library->renderers.head; + + params->source = (void*)outline; + + error = FT_Err_Cannot_Render_Glyph; + while ( renderer ) + { + error = renderer->raster_render( renderer->raster, params ); + if ( !error || FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format */ + + /* now, look for another renderer that supports the same */ + /* format */ + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, + &node ); + update = TRUE; + } + + /* if we changed the current renderer for the glyph image format */ + /* we need to select it as the next current one */ + if ( !error && update && renderer ) + FT_Set_Renderer( library, renderer, 0, 0 ); + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ) + { + FT_Raster_Params params; + + + if ( !abitmap ) + return FT_Err_Invalid_Argument; + + /* other checks are delayed to FT_Outline_Render() */ + + params.target = abitmap; + params.flags = 0; + + if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) + params.flags |= FT_RASTER_FLAG_AA; + + return FT_Outline_Render( library, outline, ¶ms ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ) + { + FT_Pos xz, yz; + + + if ( !vector || !matrix ) + return; + + xz = FT_MulFix( vector->x, matrix->xx ) + + FT_MulFix( vector->y, matrix->xy ); + + yz = FT_MulFix( vector->x, matrix->yx ) + + FT_MulFix( vector->y, matrix->yy ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ) + { + FT_Vector* vec; + FT_Vector* limit; + + + if ( !outline || !matrix ) + return; + + vec = outline->points; + limit = vec + outline->n_points; + + for ( ; vec < limit; vec++ ) + FT_Vector_Transform( vec, matrix ); + } + + +#if 0 + +#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \ + do { \ + (first) = ( c > 0 ) ? (outline)->points + \ + (outline)->contours[c - 1] + 1 \ + : (outline)->points; \ + (last) = (outline)->points + (outline)->contours[c]; \ + } while ( 0 ) + + + /* Is a point in some contour? */ + /* */ + /* We treat every point of the contour as if it */ + /* it were ON. That is, we allow false positives, */ + /* but disallow false negatives. (XXX really?) */ + static FT_Bool + ft_contour_has( FT_Outline* outline, + FT_Short c, + FT_Vector* point ) + { + FT_Vector* first; + FT_Vector* last; + FT_Vector* a; + FT_Vector* b; + FT_UInt n = 0; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( a = first; a <= last; a++ ) + { + FT_Pos x; + FT_Int intersect; + + + b = ( a == last ) ? first : a + 1; + + intersect = ( a->y - point->y ) ^ ( b->y - point->y ); + + /* a and b are on the same side */ + if ( intersect >= 0 ) + { + if ( intersect == 0 && a->y == point->y ) + { + if ( ( a->x <= point->x && b->x >= point->x ) || + ( a->x >= point->x && b->x <= point->x ) ) + return 1; + } + + continue; + } + + x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y ); + + if ( x < point->x ) + n++; + else if ( x == point->x ) + return 1; + } + + return ( n % 2 ); + } + + + static FT_Bool + ft_contour_enclosed( FT_Outline* outline, + FT_UShort c ) + { + FT_Vector* first; + FT_Vector* last; + FT_Short i; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( i = 0; i < outline->n_contours; i++ ) + { + if ( i != c && ft_contour_has( outline, i, first ) ) + { + FT_Vector* pt; + + + for ( pt = first + 1; pt <= last; pt++ ) + if ( !ft_contour_has( outline, i, pt ) ) + return 0; + + return 1; + } + } + + return 0; + } + + + /* This version differs from the public one in that each */ + /* part (contour not enclosed in another contour) of the */ + /* outline is checked for orientation. This is */ + /* necessary for some buggy CJK fonts. */ + static FT_Orientation + ft_outline_get_orientation( FT_Outline* outline ) + { + FT_Short i; + FT_Vector* first; + FT_Vector* last; + FT_Orientation orient = FT_ORIENTATION_NONE; + + + first = outline->points; + for ( i = 0; i < outline->n_contours; i++, first = last + 1 ) + { + FT_Vector* point; + FT_Vector* xmin_point; + FT_Pos xmin; + + + last = outline->points + outline->contours[i]; + + /* skip degenerate contours */ + if ( last < first + 2 ) + continue; + + if ( ft_contour_enclosed( outline, i ) ) + continue; + + xmin = first->x; + xmin_point = first; + + for ( point = first + 1; point <= last; point++ ) + { + if ( point->x < xmin ) + { + xmin = point->x; + xmin_point = point; + } + } + + /* check the orientation of the contour */ + { + FT_Vector* prev; + FT_Vector* next; + FT_Orientation o; + + + prev = ( xmin_point == first ) ? last : xmin_point - 1; + next = ( xmin_point == last ) ? first : xmin_point + 1; + + if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) > + FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) ) + o = FT_ORIENTATION_POSTSCRIPT; + else + o = FT_ORIENTATION_TRUETYPE; + + if ( orient == FT_ORIENTATION_NONE ) + orient = o; + else if ( orient != o ) + return FT_ORIENTATION_NONE; + } + } + + return orient; + } + +#endif /* 0 */ + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ) + { + FT_Vector* points; + FT_Vector v_prev, v_first, v_next, v_cur; + FT_Angle rotate, angle_in, angle_out; + FT_Int c, n, first; + FT_Int orientation; + + + if ( !outline ) + return FT_Err_Invalid_Argument; + + strength /= 2; + if ( strength == 0 ) + return FT_Err_Ok; + + orientation = FT_Outline_Get_Orientation( outline ); + if ( orientation == FT_ORIENTATION_NONE ) + { + if ( outline->n_contours ) + return FT_Err_Invalid_Argument; + else + return FT_Err_Ok; + } + + if ( orientation == FT_ORIENTATION_TRUETYPE ) + rotate = -FT_ANGLE_PI2; + else + rotate = FT_ANGLE_PI2; + + points = outline->points; + + first = 0; + for ( c = 0; c < outline->n_contours; c++ ) + { + int last = outline->contours[c]; + + + v_first = points[first]; + v_prev = points[last]; + v_cur = v_first; + + for ( n = first; n <= last; n++ ) + { + FT_Vector in, out; + FT_Angle angle_diff; + FT_Pos d; + FT_Fixed scale; + + + if ( n < last ) + v_next = points[n + 1]; + else + v_next = v_first; + + /* compute the in and out vectors */ + in.x = v_cur.x - v_prev.x; + in.y = v_cur.y - v_prev.y; + + out.x = v_next.x - v_cur.x; + out.y = v_next.y - v_cur.y; + + angle_in = FT_Atan2( in.x, in.y ); + angle_out = FT_Atan2( out.x, out.y ); + angle_diff = FT_Angle_Diff( angle_in, angle_out ); + scale = FT_Cos( angle_diff / 2 ); + + if ( scale < 0x4000L && scale > -0x4000L ) + in.x = in.y = 0; + else + { + d = FT_DivFix( strength, scale ); + + FT_Vector_From_Polar( &in, d, angle_in + angle_diff / 2 - rotate ); + } + + outline->points[n].x = v_cur.x + strength + in.x; + outline->points[n].y = v_cur.y + strength + in.y; + + v_prev = v_cur; + v_cur = v_next; + } + + first = last + 1; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ) + { + FT_Pos xmin = 32768L; + FT_Pos xmin_ymin = 32768L; + FT_Pos xmin_ymax = -32768L; + FT_Vector* xmin_first = NULL; + FT_Vector* xmin_last = NULL; + + short* contour; + + FT_Vector* first; + FT_Vector* last; + FT_Vector* prev; + FT_Vector* point; + + int i; + FT_Pos ray_y[3]; + FT_Orientation result[3]; + + + if ( !outline || outline->n_points <= 0 ) + return FT_ORIENTATION_TRUETYPE; + + /* We use the nonzero winding rule to find the orientation. */ + /* Since glyph outlines behave much more `regular' than arbitrary */ + /* cubic or quadratic curves, this test deals with the polygon */ + /* only which is spanned up by the control points. */ + + first = outline->points; + for ( contour = outline->contours; + contour < outline->contours + outline->n_contours; + contour++, first = last + 1 ) + { + FT_Pos contour_xmin = 32768L; + FT_Pos contour_xmax = -32768L; + FT_Pos contour_ymin = 32768L; + FT_Pos contour_ymax = -32768L; + + + last = outline->points + *contour; + + /* skip degenerate contours */ + if ( last < first + 2 ) + continue; + + for ( point = first; point <= last; ++point ) + { + if ( point->x < contour_xmin ) + contour_xmin = point->x; + + if ( point->x > contour_xmax ) + contour_xmax = point->x; + + if ( point->y < contour_ymin ) + contour_ymin = point->y; + + if ( point->y > contour_ymax ) + contour_ymax = point->y; + } + + if ( contour_xmin < xmin && + contour_xmin != contour_xmax && + contour_ymin != contour_ymax ) + { + xmin = contour_xmin; + xmin_ymin = contour_ymin; + xmin_ymax = contour_ymax; + xmin_first = first; + xmin_last = last; + } + } + + if ( xmin == 32768L ) + return FT_ORIENTATION_TRUETYPE; + + ray_y[0] = ( xmin_ymin * 3 + xmin_ymax ) >> 2; + ray_y[1] = ( xmin_ymin + xmin_ymax ) >> 1; + ray_y[2] = ( xmin_ymin + xmin_ymax * 3 ) >> 2; + + for ( i = 0; i < 3; i++ ) + { + FT_Pos left_x; + FT_Pos right_x; + FT_Vector* left1; + FT_Vector* left2; + FT_Vector* right1; + FT_Vector* right2; + + + RedoRay: + left_x = 32768L; + right_x = -32768L; + + left1 = left2 = right1 = right2 = NULL; + + prev = xmin_last; + for ( point = xmin_first; point <= xmin_last; prev = point, ++point ) + { + FT_Pos tmp_x; + + + if ( point->y == ray_y[i] || prev->y == ray_y[i] ) + { + ray_y[i]++; + goto RedoRay; + } + + if ( ( point->y < ray_y[i] && prev->y < ray_y[i] ) || + ( point->y > ray_y[i] && prev->y > ray_y[i] ) ) + continue; + + tmp_x = FT_MulDiv( point->x - prev->x, + ray_y[i] - prev->y, + point->y - prev->y ) + prev->x; + + if ( tmp_x < left_x ) + { + left_x = tmp_x; + left1 = prev; + left2 = point; + } + + if ( tmp_x > right_x ) + { + right_x = tmp_x; + right1 = prev; + right2 = point; + } + } + + if ( left1 && right1 ) + { + if ( left1->y < left2->y && right1->y > right2->y ) + result[i] = FT_ORIENTATION_TRUETYPE; + else if ( left1->y > left2->y && right1->y < right2->y ) + result[i] = FT_ORIENTATION_POSTSCRIPT; + else + result[i] = FT_ORIENTATION_NONE; + } + } + + if ( result[0] != FT_ORIENTATION_NONE && + ( result[0] == result[1] || result[0] == result[2] ) ) + return result[0]; + + if ( result[1] != FT_ORIENTATION_NONE && result[1] == result[2] ) + return result[1]; + + return FT_ORIENTATION_TRUETYPE; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftpatent.c b/src/3rdparty/freetype/src/base/ftpatent.c new file mode 100644 index 0000000000..9f129d8f0d --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftpatent.c @@ -0,0 +1,281 @@ +/***************************************************************************/ +/* */ +/* ftpatent.c */ +/* */ +/* FreeType API for checking patented TrueType bytecode instructions */ +/* (body). */ +/* */ +/* Copyright 2007, 2008 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TRUETYPE_GLYF_H + + + static FT_Bool + _tt_check_patents_in_range( FT_Stream stream, + FT_ULong size ) + { + FT_Bool result = FALSE; + FT_Error error; + FT_Bytes p, end; + + + if ( FT_FRAME_ENTER( size ) ) + return 0; + + p = stream->cursor; + end = p + size; + + while ( p < end ) + { + switch (p[0]) + { + case 0x06: /* SPvTL // */ + case 0x07: /* SPvTL + */ + case 0x08: /* SFvTL // */ + case 0x09: /* SFvTL + */ + case 0x0A: /* SPvFS */ + case 0x0B: /* SFvFS */ + result = TRUE; + goto Exit; + + case 0x40: + if ( p + 1 >= end ) + goto Exit; + + p += p[1] + 2; + break; + + case 0x41: + if ( p + 1 >= end ) + goto Exit; + + p += p[1] * 2 + 2; + break; + + case 0x71: /* DELTAP2 */ + case 0x72: /* DELTAP3 */ + case 0x73: /* DELTAC0 */ + case 0x74: /* DELTAC1 */ + case 0x75: /* DELTAC2 */ + result = TRUE; + goto Exit; + + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + p += ( p[0] - 0xB0 ) + 2; + break; + + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + p += ( p[0] - 0xB8 ) * 2 + 3; + break; + + default: + p += 1; + break; + } + } + + Exit: + FT_FRAME_EXIT(); + return result; + } + + + static FT_Bool + _tt_check_patents_in_table( FT_Face face, + FT_ULong tag ) + { + FT_Stream stream = face->stream; + FT_Error error; + FT_Service_SFNT_Table service; + FT_Bool result = FALSE; + + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + + if ( service ) + { + FT_ULong offset, size; + + + error = service->table_info( face, tag, &offset, &size ); + if ( error || + FT_STREAM_SEEK( offset ) ) + goto Exit; + + result = _tt_check_patents_in_range( stream, size ); + } + + Exit: + return result; + } + + + static FT_Bool + _tt_face_check_patents( FT_Face face ) + { + FT_Stream stream = face->stream; + FT_UInt gindex; + FT_Error error; + FT_Bool result; + + FT_Service_TTGlyf service; + + + result = _tt_check_patents_in_table( face, TTAG_fpgm ); + if ( result ) + goto Exit; + + result = _tt_check_patents_in_table( face, TTAG_prep ); + if ( result ) + goto Exit; + + FT_FACE_FIND_SERVICE( face, service, TT_GLYF ); + if ( service == NULL ) + goto Exit; + + for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ ) + { + FT_ULong offset, num_ins, size; + FT_Int num_contours; + + + offset = service->get_location( face, gindex, &size ); + if ( size == 0 ) + continue; + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_SHORT( num_contours ) ) + continue; + + if ( num_contours >= 0 ) /* simple glyph */ + { + if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) ) + continue; + } + else /* compound glyph */ + { + FT_Bool has_instr = 0; + + + if ( FT_STREAM_SKIP( 8 ) ) + continue; + + /* now read each component */ + for (;;) + { + FT_UInt flags, toskip; + + + if( FT_READ_USHORT( flags ) ) + break; + + toskip = 2 + 1 + 1; + + if ( ( flags & ( 1 << 0 ) ) != 0 ) /* ARGS_ARE_WORDS */ + toskip += 2; + + if ( ( flags & ( 1 << 3 ) ) != 0 ) /* WE_HAVE_A_SCALE */ + toskip += 2; + else if ( ( flags & ( 1 << 6 ) ) != 0 ) /* WE_HAVE_X_Y_SCALE */ + toskip += 4; + else if ( ( flags & ( 1 << 7 ) ) != 0 ) /* WE_HAVE_A_2x2 */ + toskip += 8; + + if ( ( flags & ( 1 << 8 ) ) != 0 ) /* WE_HAVE_INSTRUCTIONS */ + has_instr = 1; + + if ( FT_STREAM_SKIP( toskip ) ) + goto NextGlyph; + + if ( ( flags & ( 1 << 5 ) ) == 0 ) /* MORE_COMPONENTS */ + break; + } + + if ( !has_instr ) + goto NextGlyph; + } + + if ( FT_READ_USHORT( num_ins ) ) + continue; + + result = _tt_check_patents_in_range( stream, num_ins ); + if ( result ) + goto Exit; + + NextGlyph: + ; + } + + Exit: + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ) + { + FT_Bool result = FALSE; + + + if ( face && FT_IS_SFNT( face ) ) + result = _tt_face_check_patents( face ); + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ) + { + FT_Bool result = FALSE; + + +#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ + !defined( TT_CONFIG_OPTION_BYTECODE_INTEPRETER ) + if ( face && FT_IS_SFNT( face ) ) + { + result = !face->internal->ignore_unpatented_hinter; + face->internal->ignore_unpatented_hinter = !value; + } +#else + FT_UNUSED( face ); + FT_UNUSED( value ); +#endif + + return result; + } + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftpfr.c b/src/3rdparty/freetype/src/base/ftpfr.c new file mode 100644 index 0000000000..f9592bb1bb --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftpfr.c @@ -0,0 +1,143 @@ +/***************************************************************************/ +/* */ +/* ftpfr.c */ +/* */ +/* FreeType API for accessing PFR-specific data (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_PFR_H + + + /* check the format */ + static FT_Service_PfrMetrics + ft_pfr_check( FT_Face face ) + { + FT_Service_PfrMetrics service; + + + FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); + + return service; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ) + { + FT_Error error = FT_Err_Ok; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_Err_Invalid_Argument; + + service = ft_pfr_check( face ); + if ( service ) + { + error = service->get_metrics( face, + aoutline_resolution, + ametrics_resolution, + ametrics_x_scale, + ametrics_y_scale ); + } + else + { + FT_Fixed x_scale, y_scale; + + + /* this is not a PFR font */ + if ( aoutline_resolution ) + *aoutline_resolution = face->units_per_EM; + + if ( ametrics_resolution ) + *ametrics_resolution = face->units_per_EM; + + x_scale = y_scale = 0x10000L; + if ( face->size ) + { + x_scale = face->size->metrics.x_scale; + y_scale = face->size->metrics.y_scale; + } + + if ( ametrics_x_scale ) + *ametrics_x_scale = x_scale; + + if ( ametrics_y_scale ) + *ametrics_y_scale = y_scale; + + error = FT_Err_Unknown_File_Format; + } + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_Err_Invalid_Argument; + + service = ft_pfr_check( face ); + if ( service ) + error = service->get_kerning( face, left, right, avector ); + else + error = FT_Get_Kerning( face, left, right, + FT_KERNING_UNSCALED, avector ); + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + service = ft_pfr_check( face ); + if ( service ) + { + error = service->get_advance( face, gindex, aadvance ); + } + else + /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ + error = FT_Err_Invalid_Argument; + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftrfork.c b/src/3rdparty/freetype/src/base/ftrfork.c new file mode 100644 index 0000000000..d59a07611c --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftrfork.c @@ -0,0 +1,821 @@ +/***************************************************************************/ +/* */ +/* ftrfork.c */ +/* */ +/* Embedded resource forks accessor (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ +/* derived from ftobjs.c. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_RFORK_H + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Resource fork directory access ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ) + { + FT_Error error; + unsigned char head[16], head2[16]; + FT_Long map_pos, rdata_len; + int allzeros, allmatch, i; + FT_Long type_list; + + FT_UNUSED( library ); + + + error = FT_Stream_Seek( stream, rfork_offset ); + if ( error ) + return error; + + error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); + if ( error ) + return error; + + *rdata_pos = rfork_offset + ( ( head[0] << 24 ) | + ( head[1] << 16 ) | + ( head[2] << 8 ) | + head[3] ); + map_pos = rfork_offset + ( ( head[4] << 24 ) | + ( head[5] << 16 ) | + ( head[6] << 8 ) | + head[7] ); + rdata_len = ( head[ 8] << 24 ) | + ( head[ 9] << 16 ) | + ( head[10] << 8 ) | + head[11]; + + /* map_len = head[12] .. head[15] */ + + if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset ) + return FT_Err_Unknown_File_Format; + + error = FT_Stream_Seek( stream, map_pos ); + if ( error ) + return error; + + head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ + + error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); + if ( error ) + return error; + + allzeros = 1; + allmatch = 1; + for ( i = 0; i < 16; ++i ) + { + if ( head2[i] != 0 ) + allzeros = 0; + if ( head2[i] != head[i] ) + allmatch = 0; + } + if ( !allzeros && !allmatch ) + return FT_Err_Unknown_File_Format; + + /* If we have reached this point then it is probably a mac resource */ + /* file. Now, does it contain any interesting resources? */ + /* Skip handle to next resource map, the file resource number, and */ + /* attributes. */ + (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ + + 2 /* skip file resource number */ + + 2 ); /* skip attributes */ + + if ( FT_READ_USHORT( type_list ) ) + return error; + if ( type_list == -1 ) + return FT_Err_Unknown_File_Format; + + error = FT_Stream_Seek( stream, map_pos + type_list ); + if ( error ) + return error; + + *map_offset = map_pos + type_list; + return FT_Err_Ok; + } + + + static int + ft_raccess_sort_ref_by_id( FT_RFork_Ref* a, + FT_RFork_Ref* b ) + { + if ( a->res_id < b->res_id ) + return -1; + else if ( a->res_id > b->res_id ) + return 1; + else + return 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ) + { + FT_Error error; + int i, j, cnt, subcnt; + FT_Long tag_internal, rpos; + FT_Memory memory = library->memory; + FT_Long temp; + FT_Long *offsets_internal; + FT_RFork_Ref *ref; + + + error = FT_Stream_Seek( stream, map_offset ); + if ( error ) + return error; + + if ( FT_READ_USHORT( cnt ) ) + return error; + cnt++; + + for ( i = 0; i < cnt; ++i ) + { + if ( FT_READ_LONG( tag_internal ) || + FT_READ_USHORT( subcnt ) || + FT_READ_USHORT( rpos ) ) + return error; + + FT_TRACE2(( "Resource tags: %c%c%c%c\n", + (char)( 0xff & ( tag_internal >> 24 ) ), + (char)( 0xff & ( tag_internal >> 16 ) ), + (char)( 0xff & ( tag_internal >> 8 ) ), + (char)( 0xff & ( tag_internal >> 0 ) ) )); + + if ( tag_internal == tag ) + { + *count = subcnt + 1; + rpos += map_offset; + + error = FT_Stream_Seek( stream, rpos ); + if ( error ) + return error; + + if ( FT_NEW_ARRAY( ref, *count ) ) + return error; + + for ( j = 0; j < *count; ++j ) + { + if ( FT_READ_USHORT( ref[j].res_id ) ) + goto Exit; + if ( FT_STREAM_SKIP( 2 ) ) /* resource name */ + goto Exit; + if ( FT_READ_LONG( temp ) ) + goto Exit; + if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ + goto Exit; + + ref[j].offset = temp & 0xFFFFFFL; + } + + ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ), + ( int(*)(const void*, const void*) ) + ft_raccess_sort_ref_by_id ); + + if ( FT_NEW_ARRAY( offsets_internal, *count ) ) + goto Exit; + + /* XXX: duplicated reference ID, + * gap between reference IDs are acceptable? + * further investigation on Apple implementation is needed. + */ + for ( j = 0; j < *count; ++j ) + offsets_internal[j] = rdata_pos + ref[j].offset; + + *offsets = offsets_internal; + error = FT_Err_Ok; + + Exit: + FT_FREE( ref ); + return error; + } + } + + return FT_Err_Cannot_Open_Resource; + } + + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Guessing functions ****/ + /**** ****/ + /**** When you add a new guessing function, ****/ + /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef FT_Error + (*raccess_guess_func)( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + /*************************************************************************/ + /**** ****/ + /**** Helper functions ****/ + /**** ****/ + /*************************************************************************/ + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char * file_name, + FT_Long *result_offset ); + + static char * + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ); + + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + FT_Long i; + + + raccess_guess_func funcs[FT_RACCESS_N_RULES] = + { + raccess_guess_apple_double, + raccess_guess_apple_single, + raccess_guess_darwin_ufs_export, + raccess_guess_darwin_newvfs, + raccess_guess_darwin_hfsplus, + raccess_guess_vfat, + raccess_guess_linux_cap, + raccess_guess_linux_double, + raccess_guess_linux_netatalk, + }; + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + if ( NULL != stream ) + errors[i] = FT_Stream_Seek( stream, 0 ); + else + errors[i] = FT_Err_Ok; + + if ( errors[i] ) + continue ; + + errors[i] = (funcs[i])( library, stream, base_name, + &(new_names[i]), &(offsets[i]) ); + } + + return; + } + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x07; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_Err_Cannot_Open_Stream; + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x00; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_Err_Cannot_Open_Stream; + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + newpath = raccess_make_file_name( memory, base_file_name, "._" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with hfs+ drivers (or Macs). + */ + FT_Error error; + char* newpath; + FT_Memory memory; + FT_Long base_file_len = ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 6 > FT_INT_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_ALLOC( newpath, base_file_len + 6 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with Mac OS X (> 10.1). + */ + FT_Error error; + char* newpath; + FT_Memory memory; + FT_Long base_file_len = ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 18 > FT_INT_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_ALLOC( newpath, base_file_len + 18 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + "resource.frk/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, "%" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + ".AppleDouble/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ) + { + FT_Int32 magic_from_stream; + FT_Error error; + FT_Int32 version_number = 0; + FT_UShort n_of_entries; + + int i; + FT_UInt32 entry_id, entry_offset, entry_length = 0; + + const FT_UInt32 resource_fork_entry_id = 0x2; + + FT_UNUSED( library ); + FT_UNUSED( base_file_name ); + FT_UNUSED( version_number ); + FT_UNUSED( entry_length ); + + + if ( FT_READ_LONG( magic_from_stream ) ) + return error; + if ( magic_from_stream != magic ) + return FT_Err_Unknown_File_Format; + + if ( FT_READ_LONG( version_number ) ) + return error; + + /* filler */ + error = FT_Stream_Skip( stream, 16 ); + if ( error ) + return error; + + if ( FT_READ_USHORT( n_of_entries ) ) + return error; + if ( n_of_entries == 0 ) + return FT_Err_Unknown_File_Format; + + for ( i = 0; i < n_of_entries; i++ ) + { + if ( FT_READ_LONG( entry_id ) ) + return error; + if ( entry_id == resource_fork_entry_id ) + { + if ( FT_READ_LONG( entry_offset ) || + FT_READ_LONG( entry_length ) ) + continue; + *result_offset = entry_offset; + + return FT_Err_Ok; + } + else + { + error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ + if ( error ) + return error; + } + } + + return FT_Err_Unknown_File_Format; + } + + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char *file_name, + FT_Long *result_offset ) + { + FT_Open_Args args2; + FT_Stream stream2; + char * nouse = NULL; + FT_Error error; + + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_name; + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + return error; + + error = raccess_guess_apple_double( library, stream2, file_name, + &nouse, result_offset ); + + FT_Stream_Free( stream2, 0 ); + + return error; + } + + + static char* + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ) + { + char* new_name; + char* tmp; + const char* slash; + unsigned new_length; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( error ); + + + new_length = ft_strlen( original_name ) + ft_strlen( insertion ); + if ( FT_ALLOC( new_name, new_length + 1 ) ) + return NULL; + + tmp = ft_strrchr( original_name, '/' ); + if ( tmp ) + { + ft_strncpy( new_name, original_name, tmp - original_name + 1 ); + new_name[tmp - original_name + 1] = '\0'; + slash = tmp + 1; + } + else + { + slash = original_name; + new_name[0] = '\0'; + } + + ft_strcat( new_name, insertion ); + ft_strcat( new_name, slash ); + + return new_name; + } + + +#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /*************************************************************************/ + /* Dummy function; just sets errors */ + /*************************************************************************/ + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char *base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + int i; + + FT_UNUSED( library ); + FT_UNUSED( stream ); + FT_UNUSED( base_name ); + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + offsets[i] = 0; + errors[i] = FT_Err_Unimplemented_Feature; + } + } + + +#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftstream.c b/src/3rdparty/freetype/src/base/ftstream.c new file mode 100644 index 0000000000..901b6835ba --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftstream.c @@ -0,0 +1,846 @@ +/***************************************************************************/ +/* */ +/* ftstream.c */ +/* */ +/* I/O stream support (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_stream + + + FT_BASE_DEF( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ) + { + stream->base = (FT_Byte*) base; + stream->size = size; + stream->pos = 0; + stream->cursor = 0; + stream->read = 0; + stream->close = 0; + } + + + FT_BASE_DEF( void ) + FT_Stream_Close( FT_Stream stream ) + { + if ( stream && stream->close ) + stream->close( stream ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ) + { + FT_Error error = FT_Err_Ok; + + + stream->pos = pos; + + if ( stream->read ) + { + if ( stream->read( stream, pos, 0, 0 ) ) + { + FT_ERROR(( "FT_Stream_Seek: invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + } + } + /* note that seeking to the first position after the file is valid */ + else if ( pos > stream->size ) + { + FT_ERROR(( "FT_Stream_Seek: invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + } + + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ) + { + if ( distance < 0 ) + return FT_Err_Invalid_Stream_Operation; + + return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) ); + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_Pos( FT_Stream stream ) + { + return stream->pos; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, stream->pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + if ( pos >= stream->size ) + { + FT_ERROR(( "FT_Stream_ReadAt: invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + return FT_Err_Invalid_Stream_Operation; + } + + if ( stream->read ) + read_bytes = stream->read( stream, pos, buffer, count ); + else + { + read_bytes = stream->size - pos; + if ( read_bytes > count ) + read_bytes = count; + + FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); + } + + stream->pos = pos + read_bytes; + + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_ReadAt:" )); + FT_ERROR(( " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + error = FT_Err_Invalid_Stream_Operation; + } + + return error; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong read_bytes = 0; + + + if ( stream->pos >= stream->size ) + goto Exit; + + if ( stream->read ) + read_bytes = stream->read( stream, stream->pos, buffer, count ); + else + { + read_bytes = stream->size - stream->pos; + if ( read_bytes > count ) + read_bytes = count; + + FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); + } + + stream->pos += read_bytes; + + Exit: + return read_bytes; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + FT_Error error; + + + error = FT_Stream_EnterFrame( stream, count ); + if ( !error ) + { + *pbytes = (FT_Byte*)stream->cursor; + + /* equivalent to FT_Stream_ExitFrame(), with no memory block release */ + stream->cursor = 0; + stream->limit = 0; + } + + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ) + { + if ( stream && stream->read ) + { + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, *pbytes ); + *pbytes = NULL; +#else + FT_FREE( *pbytes ); +#endif + } + *pbytes = 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + /* check for nested frame access */ + FT_ASSERT( stream && stream->cursor == 0 ); + + if ( stream->read ) + { + /* allocate the frame in memory */ + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + /* assume _ft_debug_file and _ft_debug_lineno are already set */ + stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error ); + if ( error ) + goto Exit; +#else + if ( FT_QALLOC( stream->base, count ) ) + goto Exit; +#endif + /* read it */ + read_bytes = stream->read( stream, stream->pos, + stream->base, count ); + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" )); + FT_ERROR(( " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + FT_FREE( stream->base ); + error = FT_Err_Invalid_Stream_Operation; + } + stream->cursor = stream->base; + stream->limit = stream->cursor + count; + stream->pos += read_bytes; + } + else + { + /* check current and new position */ + if ( stream->pos >= stream->size || + stream->pos + count > stream->size ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", + stream->pos, count, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + + /* set cursor */ + stream->cursor = stream->base + stream->pos; + stream->limit = stream->cursor + count; + stream->pos += count; + } + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ExitFrame( FT_Stream stream ) + { + /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */ + /* that it is possible to access a frame of length 0 in */ + /* some weird fonts (usually, when accessing an array of */ + /* 0 records, like in some strange kern tables). */ + /* */ + /* In this case, the loader code handles the 0-length table */ + /* gracefully; however, stream.cursor is really set to 0 by the */ + /* FT_Stream_EnterFrame() call, and this is not an error. */ + /* */ + FT_ASSERT( stream ); + + if ( stream->read ) + { + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, stream->base ); + stream->base = NULL; +#else + FT_FREE( stream->base ); +#endif + } + stream->cursor = 0; + stream->limit = 0; + } + + + FT_BASE_DEF( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ) + { + FT_Char result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + if ( stream->cursor < stream->limit ) + result = *stream->cursor++; + + return result; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_GetShort( FT_Stream stream ) + { + FT_Byte* p; + FT_Short result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_SHORT( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_GetShortLE( FT_Stream stream ) + { + FT_Byte* p; + FT_Short result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_SHORT_LE( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetOffset( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 2 < stream->limit ) + result = FT_NEXT_OFF3( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetLong( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_LONG( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetLongLE( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_LONG_LE( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ) + { + FT_Byte result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, &result, 1L ) != 1L ) + goto Fail; + } + else + { + if ( stream->pos < stream->size ) + result = stream->base[stream->pos]; + else + goto Fail; + } + stream->pos++; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadChar: invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_ReadShort( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p = 0; + FT_Short result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_SHORT( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadShort:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_ReadShortLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p = 0; + FT_Short result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_SHORT_LE( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadShortLE:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadOffset( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[3]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 2 < stream->size ) + { + if ( stream->read ) + { + if (stream->read( stream, stream->pos, reads, 3L ) != 3L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_OFF3( p ); + } + else + goto Fail; + + stream->pos += 3; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadOffset:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadLong( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_LONG( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + FT_ERROR(( "FT_Stream_ReadLong: invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + *error = FT_Err_Invalid_Stream_Operation; + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadLongLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_LONG_LE( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + FT_ERROR(( "FT_Stream_ReadLongLE:" )); + FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + *error = FT_Err_Invalid_Stream_Operation; + + return 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ) + { + FT_Error error; + FT_Bool frame_accessed = 0; + FT_Byte* cursor; + + if ( !fields || !stream ) + return FT_Err_Invalid_Argument; + + cursor = stream->cursor; + + error = FT_Err_Ok; + do + { + FT_ULong value; + FT_Int sign_shift; + FT_Byte* p; + + + switch ( fields->value ) + { + case ft_frame_start: /* access a new frame */ + error = FT_Stream_EnterFrame( stream, fields->offset ); + if ( error ) + goto Exit; + + frame_accessed = 1; + cursor = stream->cursor; + fields++; + continue; /* loop! */ + + case ft_frame_bytes: /* read a byte sequence */ + case ft_frame_skip: /* skip some bytes */ + { + FT_UInt len = fields->size; + + + if ( cursor + len > stream->limit ) + { + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + + if ( fields->value == ft_frame_bytes ) + { + p = (FT_Byte*)structure + fields->offset; + FT_MEM_COPY( p, cursor, len ); + } + cursor += len; + fields++; + continue; + } + + case ft_frame_byte: + case ft_frame_schar: /* read a single byte */ + value = FT_NEXT_BYTE(cursor); + sign_shift = 24; + break; + + case ft_frame_short_be: + case ft_frame_ushort_be: /* read a 2-byte big-endian short */ + value = FT_NEXT_USHORT(cursor); + sign_shift = 16; + break; + + case ft_frame_short_le: + case ft_frame_ushort_le: /* read a 2-byte little-endian short */ + value = FT_NEXT_USHORT_LE(cursor); + sign_shift = 16; + break; + + case ft_frame_long_be: + case ft_frame_ulong_be: /* read a 4-byte big-endian long */ + value = FT_NEXT_ULONG(cursor); + sign_shift = 0; + break; + + case ft_frame_long_le: + case ft_frame_ulong_le: /* read a 4-byte little-endian long */ + value = FT_NEXT_ULONG_LE(cursor); + sign_shift = 0; + break; + + case ft_frame_off3_be: + case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ + value = FT_NEXT_UOFF3(cursor); + sign_shift = 8; + break; + + case ft_frame_off3_le: + case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ + value = FT_NEXT_UOFF3_LE(cursor); + sign_shift = 8; + break; + + default: + /* otherwise, exit the loop */ + stream->cursor = cursor; + goto Exit; + } + + /* now, compute the signed value is necessary */ + if ( fields->value & FT_FRAME_OP_SIGNED ) + value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift ); + + /* finally, store the value in the object */ + + p = (FT_Byte*)structure + fields->offset; + switch ( fields->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)p = (FT_Byte)value; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)p = (FT_UShort)value; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)p = (FT_UInt32)value; + break; + + default: /* for 64-bit systems */ + *(FT_ULong*)p = (FT_ULong)value; + } + + /* go to next field */ + fields++; + } + while ( 1 ); + + Exit: + /* close the frame if it was opened by this read */ + if ( frame_accessed ) + FT_Stream_ExitFrame( stream ); + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftstroke.c b/src/3rdparty/freetype/src/base/ftstroke.c new file mode 100644 index 0000000000..3f5421fa57 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftstroke.c @@ -0,0 +1,2009 @@ +/***************************************************************************/ +/* */ +/* ftstroke.c */ +/* */ +/* FreeType path stroker (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_STROKER_H +#include FT_TRIGONOMETRY_H +#include FT_OUTLINE_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT + : FT_STROKER_BORDER_LEFT ; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT + : FT_STROKER_BORDER_RIGHT ; + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** BEZIER COMPUTATIONS *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + +#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 ) +#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 6 ) +#define FT_EPSILON 2 + +#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON ) + + + static FT_Pos + ft_pos_abs( FT_Pos x ) + { + return x >= 0 ? x : -x ; + } + + + static void + ft_conic_split( FT_Vector* base ) + { + FT_Pos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static FT_Bool + ft_conic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_out ) + { + FT_Vector d1, d2; + FT_Angle theta; + FT_Int close1, close2; + + + d1.x = base[1].x - base[2].x; + d1.y = base[1].y - base[2].y; + d2.x = base[0].x - base[1].x; + d2.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + + if ( close1 ) + { + if ( close2 ) + *angle_in = *angle_out = 0; + else + *angle_in = *angle_out = FT_Atan2( d2.x, d2.y ); + } + else if ( close2 ) + { + *angle_in = *angle_out = FT_Atan2( d1.x, d1.y ); + } + else + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d2.x, d2.y ); + } + + theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) ); + + return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD ); + } + + + static void + ft_cubic_split( FT_Vector* base ) + { + FT_Pos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + static FT_Bool + ft_cubic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_mid, + FT_Angle *angle_out ) + { + FT_Vector d1, d2, d3; + FT_Angle theta1, theta2; + FT_Int close1, close2, close3; + + + d1.x = base[2].x - base[3].x; + d1.y = base[2].y - base[3].y; + d2.x = base[1].x - base[2].x; + d2.y = base[1].y - base[2].y; + d3.x = base[0].x - base[1].x; + d3.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y ); + + if ( close1 || close3 ) + { + if ( close2 ) + { + /* basically a point */ + *angle_in = *angle_out = *angle_mid = 0; + } + else if ( close1 ) + { + *angle_in = *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + else /* close2 */ + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = *angle_out = FT_Atan2( d2.x, d2.y ); + } + } + else if ( close2 ) + { + *angle_in = *angle_mid = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + else + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + + theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) ); + theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) ); + + return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD && + theta2 < FT_SMALL_CUBIC_THRESHOLD ); + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** STROKE BORDERS *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + typedef enum FT_StrokeTags_ + { + FT_STROKE_TAG_ON = 1, /* on-curve point */ + FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ + FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ + FT_STROKE_TAG_END = 8 /* sub-path end */ + + } FT_StrokeTags; + +#define FT_STROKE_TAG_BEGIN_END (FT_STROKE_TAG_BEGIN|FT_STROKE_TAG_END) + + typedef struct FT_StrokeBorderRec_ + { + FT_UInt num_points; + FT_UInt max_points; + FT_Vector* points; + FT_Byte* tags; + FT_Bool movable; + FT_Int start; /* index of current sub-path start point */ + FT_Memory memory; + FT_Bool valid; + + } FT_StrokeBorderRec, *FT_StrokeBorder; + + + static FT_Error + ft_stroke_border_grow( FT_StrokeBorder border, + FT_UInt new_points ) + { + FT_UInt old_max = border->max_points; + FT_UInt new_max = border->num_points + new_points; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + FT_UInt cur_max = old_max; + FT_Memory memory = border->memory; + + + while ( cur_max < new_max ) + cur_max += ( cur_max >> 1 ) + 16; + + if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) || + FT_RENEW_ARRAY( border->tags, old_max, cur_max ) ) + goto Exit; + + border->max_points = cur_max; + } + + Exit: + return error; + } + + + static void + ft_stroke_border_close( FT_StrokeBorder border, + FT_Bool reverse ) + { + FT_UInt start = border->start; + FT_UInt count = border->num_points; + + + FT_ASSERT( border->start >= 0 ); + + /* don't record empty paths! */ + if ( count <= start + 1U ) + border->num_points = start; + else + { + /* copy the last point to the start of this sub-path, since */ + /* it contains the `adjusted' starting coordinates */ + border->num_points = --count; + border->points[start] = border->points[count]; + + if ( reverse ) + { + /* reverse the points */ + { + FT_Vector* vec1 = border->points + start + 1; + FT_Vector* vec2 = border->points + count - 1; + + + for ( ; vec1 < vec2; vec1++, vec2-- ) + { + FT_Vector tmp; + + + tmp = *vec1; + *vec1 = *vec2; + *vec2 = tmp; + } + } + + /* then the tags */ + { + FT_Byte* tag1 = border->tags + start + 1; + FT_Byte* tag2 = border->tags + count - 1; + + + for ( ; tag1 < tag2; tag1++, tag2-- ) + { + FT_Byte tmp; + + + tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + } + } + } + + border->tags[start ] |= FT_STROKE_TAG_BEGIN; + border->tags[count - 1] |= FT_STROKE_TAG_END; + } + + border->start = -1; + border->movable = FALSE; + } + + + static FT_Error + ft_stroke_border_lineto( FT_StrokeBorder border, + FT_Vector* to, + FT_Bool movable ) + { + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( border->start >= 0 ); + + if ( border->movable ) + { + /* move last point */ + border->points[border->num_points - 1] = *to; + } + else + { + /* add one point */ + error = ft_stroke_border_grow( border, 1 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *to; + tag[0] = FT_STROKE_TAG_ON; + + border->num_points += 1; + } + } + border->movable = movable; + return error; + } + + + static FT_Error + ft_stroke_border_conicto( FT_StrokeBorder border, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 2 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + vec[0] = *control; + vec[1] = *to; + + tag[0] = 0; + tag[1] = FT_STROKE_TAG_ON; + + border->num_points += 2; + } + border->movable = FALSE; + return error; + } + + + static FT_Error + ft_stroke_border_cubicto( FT_StrokeBorder border, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 3 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + + tag[0] = FT_STROKE_TAG_CUBIC; + tag[1] = FT_STROKE_TAG_CUBIC; + tag[2] = FT_STROKE_TAG_ON; + + border->num_points += 3; + } + border->movable = FALSE; + return error; + } + + +#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 ) + + + static FT_Error + ft_stroke_border_arcto( FT_StrokeBorder border, + FT_Vector* center, + FT_Fixed radius, + FT_Angle angle_start, + FT_Angle angle_diff ) + { + FT_Angle total, angle, step, rotate, next, theta; + FT_Vector a, b, a2, b2; + FT_Fixed length; + FT_Error error = FT_Err_Ok; + + + /* compute start point */ + FT_Vector_From_Polar( &a, radius, angle_start ); + a.x += center->x; + a.y += center->y; + + total = angle_diff; + angle = angle_start; + rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2; + + while ( total != 0 ) + { + step = total; + if ( step > FT_ARC_CUBIC_ANGLE ) + step = FT_ARC_CUBIC_ANGLE; + + else if ( step < -FT_ARC_CUBIC_ANGLE ) + step = -FT_ARC_CUBIC_ANGLE; + + next = angle + step; + theta = step; + if ( theta < 0 ) + theta = -theta; + + theta >>= 1; + + /* compute end point */ + FT_Vector_From_Polar( &b, radius, next ); + b.x += center->x; + b.y += center->y; + + /* compute first and second control points */ + length = FT_MulDiv( radius, FT_Sin( theta ) * 4, + ( 0x10000L + FT_Cos( theta ) ) * 3 ); + + FT_Vector_From_Polar( &a2, length, angle + rotate ); + a2.x += a.x; + a2.y += a.y; + + FT_Vector_From_Polar( &b2, length, next - rotate ); + b2.x += b.x; + b2.y += b.y; + + /* add cubic arc */ + error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); + if ( error ) + break; + + /* process the rest of the arc ?? */ + a = b; + total -= step; + angle = next; + } + + return error; + } + + + static FT_Error + ft_stroke_border_moveto( FT_StrokeBorder border, + FT_Vector* to ) + { + /* close current open path if any ? */ + if ( border->start >= 0 ) + ft_stroke_border_close( border, FALSE ); + + border->start = border->num_points; + border->movable = FALSE; + + return ft_stroke_border_lineto( border, to, FALSE ); + } + + + static void + ft_stroke_border_init( FT_StrokeBorder border, + FT_Memory memory ) + { + border->memory = memory; + border->points = NULL; + border->tags = NULL; + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_reset( FT_StrokeBorder border ) + { + border->num_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_done( FT_StrokeBorder border ) + { + FT_Memory memory = border->memory; + + + FT_FREE( border->points ); + FT_FREE( border->tags ); + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static FT_Error + ft_stroke_border_get_counts( FT_StrokeBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_Error error = FT_Err_Ok; + FT_UInt num_points = 0; + FT_UInt num_contours = 0; + + FT_UInt count = border->num_points; + FT_Vector* point = border->points; + FT_Byte* tags = border->tags; + FT_Int in_contour = 0; + + + for ( ; count > 0; count--, num_points++, point++, tags++ ) + { + if ( tags[0] & FT_STROKE_TAG_BEGIN ) + { + if ( in_contour != 0 ) + goto Fail; + + in_contour = 1; + } + else if ( in_contour == 0 ) + goto Fail; + + if ( tags[0] & FT_STROKE_TAG_END ) + { + in_contour = 0; + num_contours++; + } + } + + if ( in_contour != 0 ) + goto Fail; + + border->valid = TRUE; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + + Fail: + num_points = 0; + num_contours = 0; + goto Exit; + } + + + static void + ft_stroke_border_export( FT_StrokeBorder border, + FT_Outline* outline ) + { + /* copy point locations */ + FT_ARRAY_COPY( outline->points + outline->n_points, + border->points, + border->num_points ); + + /* copy tags */ + { + FT_UInt count = border->num_points; + FT_Byte* read = border->tags; + FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points; + + + for ( ; count > 0; count--, read++, write++ ) + { + if ( *read & FT_STROKE_TAG_ON ) + *write = FT_CURVE_TAG_ON; + else if ( *read & FT_STROKE_TAG_CUBIC ) + *write = FT_CURVE_TAG_CUBIC; + else + *write = FT_CURVE_TAG_CONIC; + } + } + + /* copy contours */ + { + FT_UInt count = border->num_points; + FT_Byte* tags = border->tags; + FT_Short* write = outline->contours + outline->n_contours; + FT_Short idx = (FT_Short)outline->n_points; + + + for ( ; count > 0; count--, tags++, idx++ ) + { + if ( *tags & FT_STROKE_TAG_END ) + { + *write++ = idx; + outline->n_contours++; + } + } + } + + outline->n_points = (short)( outline->n_points + border->num_points ); + + FT_ASSERT( FT_Outline_Check( outline ) == 0 ); + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** STROKER *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + +#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI ) + + typedef struct FT_StrokerRec_ + { + FT_Angle angle_in; + FT_Angle angle_out; + FT_Vector center; + FT_Bool first_point; + FT_Bool subpath_open; + FT_Angle subpath_angle; + FT_Vector subpath_start; + + FT_Stroker_LineCap line_cap; + FT_Stroker_LineJoin line_join; + FT_Fixed miter_limit; + FT_Fixed radius; + + FT_Bool valid; + FT_StrokeBorderRec borders[2]; + FT_Memory memory; + + } FT_StrokerRec; + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ) + { + FT_Error error; + FT_Memory memory; + FT_Stroker stroker; + + + if ( !library ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + if ( !FT_NEW( stroker ) ) + { + stroker->memory = memory; + + ft_stroke_border_init( &stroker->borders[0], memory ); + ft_stroke_border_init( &stroker->borders[1], memory ); + } + *astroker = stroker; + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ) + { + stroker->radius = radius; + stroker->line_cap = line_cap; + stroker->line_join = line_join; + stroker->miter_limit = miter_limit; + + FT_Stroker_Rewind( stroker ); + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Rewind( FT_Stroker stroker ) + { + if ( stroker ) + { + ft_stroke_border_reset( &stroker->borders[0] ); + ft_stroke_border_reset( &stroker->borders[1] ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Done( FT_Stroker stroker ) + { + if ( stroker ) + { + FT_Memory memory = stroker->memory; + + + ft_stroke_border_done( &stroker->borders[0] ); + ft_stroke_border_done( &stroker->borders[1] ); + + stroker->memory = NULL; + FT_FREE( stroker ); + } + } + + + /* creates a circular arc at a corner or cap */ + static FT_Error + ft_stroker_arcto( FT_Stroker stroker, + FT_Int side ) + { + FT_Angle total, rotate; + FT_Fixed radius = stroker->radius; + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border = stroker->borders + side; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( total == FT_ANGLE_PI ) + total = -rotate * 2; + + error = ft_stroke_border_arcto( border, + &stroker->center, + radius, + stroker->angle_in + rotate, + total ); + border->movable = FALSE; + return error; + } + + + /* adds a cap at the end of an opened path */ + static FT_Error + ft_stroker_cap( FT_Stroker stroker, + FT_Angle angle, + FT_Int side ) + { + FT_Error error = FT_Err_Ok; + + + if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND ) + { + /* add a round cap */ + stroker->angle_in = angle; + stroker->angle_out = angle + FT_ANGLE_PI; + error = ft_stroker_arcto( stroker, side ); + } + else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) + { + /* add a square cap */ + FT_Vector delta, delta2; + FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); + FT_Fixed radius = stroker->radius; + FT_StrokeBorder border = stroker->borders + side; + + + FT_Vector_From_Polar( &delta2, radius, angle + rotate ); + FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += stroker->center.x + delta2.x; + delta.y += stroker->center.y + delta2.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + FT_Vector_From_Polar( &delta2, radius, angle - rotate ); + FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += delta2.x + stroker->center.x; + delta.y += delta2.y + stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + + Exit: + return error; + } + + + /* process an inside corner, i.e. compute intersection */ + static FT_Error + ft_stroker_inside( FT_Stroker stroker, + FT_Int side) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Angle phi, theta, rotate; + FT_Fixed length, thcos, sigma; + FT_Vector delta; + FT_Error error = FT_Err_Ok; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute median angle */ + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( theta == FT_ANGLE_PI ) + theta = rotate; + else + theta = theta / 2; + + phi = stroker->angle_in + theta; + + thcos = FT_Cos( theta ); + sigma = FT_MulFix( stroker->miter_limit, thcos ); + + /* TODO: find better criterion to switch off the optimization */ + if ( sigma < 0x10000L ) + { + FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + border->movable = FALSE; + } + else + { + length = FT_DivFix( stroker->radius, thcos ); + + FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + } + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + + return error; + } + + + /* process an outside corner, i.e. compute bevel/miter/round */ + static FT_Error + ft_stroker_outside( FT_Stroker stroker, + FT_Int side ) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Error error; + FT_Angle rotate; + + + if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND ) + error = ft_stroker_arcto( stroker, side ); + else + { + /* this is a mitered or beveled corner */ + FT_Fixed sigma, radius = stroker->radius; + FT_Angle theta, phi; + FT_Fixed thcos; + FT_Bool miter; + + + rotate = FT_SIDE_TO_ROTATE( side ); + miter = FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_MITER ); + + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( theta == FT_ANGLE_PI ) + { + theta = rotate; + phi = stroker->angle_in; + } + else + { + theta = theta / 2; + phi = stroker->angle_in + theta + rotate; + } + + thcos = FT_Cos( theta ); + sigma = FT_MulFix( stroker->miter_limit, thcos ); + + if ( sigma >= 0x10000L ) + miter = FALSE; + + if ( miter ) /* this is a miter (broken angle) */ + { + FT_Vector middle, delta; + FT_Fixed length; + + + /* compute middle point */ + FT_Vector_From_Polar( &middle, + FT_MulFix( radius, stroker->miter_limit ), + phi ); + middle.x += stroker->center.x; + middle.y += stroker->center.y; + + /* compute first angle point */ + length = FT_MulFix( radius, + FT_DivFix( 0x10000L - sigma, + ft_pos_abs( FT_Sin( theta ) ) ) ); + + FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* compute second angle point */ + FT_Vector_From_Polar( &delta, length, phi - rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* finally, add a movable end point */ + FT_Vector_From_Polar( &delta, radius, stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, TRUE ); + } + + else /* this is a bevel (intersection) */ + { + FT_Fixed length; + FT_Vector delta; + + + length = FT_DivFix( stroker->radius, thcos ); + + FT_Vector_From_Polar( &delta, length, phi ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* now add end point */ + FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, TRUE ); + } + } + + Exit: + return error; + } + + + static FT_Error + ft_stroker_process_corner( FT_Stroker stroker ) + { + FT_Error error = FT_Err_Ok; + FT_Angle turn; + FT_Int inside_side; + + + turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn == 0 ) + goto Exit; + + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + + /* otherwise, the inside side is 1 */ + if ( turn < 0 ) + inside_side = 1; + + /* process the inside side */ + error = ft_stroker_inside( stroker, inside_side ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, 1 - inside_side ); + + Exit: + return error; + } + + + /* add two points to the left and right borders corresponding to the */ + /* start of the subpath */ + static FT_Error + ft_stroker_subpath_start( FT_Stroker stroker, + FT_Angle start_angle ) + { + FT_Vector delta; + FT_Vector point; + FT_Error error; + FT_StrokeBorder border; + + + FT_Vector_From_Polar( &delta, stroker->radius, + start_angle + FT_ANGLE_PI2 ); + + point.x = stroker->center.x + delta.x; + point.y = stroker->center.y + delta.y; + + border = stroker->borders; + error = ft_stroke_border_moveto( border, &point ); + if ( error ) + goto Exit; + + point.x = stroker->center.x - delta.x; + point.y = stroker->center.y - delta.y; + + border++; + error = ft_stroke_border_moveto( border, &point ); + + /* save angle for last cap */ + stroker->subpath_angle = start_angle; + stroker->first_point = FALSE; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border; + FT_Vector delta; + FT_Angle angle; + FT_Int side; + + delta.x = to->x - stroker->center.x; + delta.y = to->y - stroker->center.y; + + angle = FT_Atan2( delta.x, delta.y ); + FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 ); + + /* process corner if necessary */ + if ( stroker->first_point ) + { + /* This is the first segment of a subpath. We need to */ + /* add a point to each border at their respective starting */ + /* point locations. */ + error = ft_stroker_subpath_start( stroker, angle ); + if ( error ) + goto Exit; + } + else + { + /* process the current corner */ + stroker->angle_out = angle; + error = ft_stroker_process_corner( stroker ); + if ( error ) + goto Exit; + } + + /* now add a line segment to both the `inside' and `outside' paths */ + + for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) + { + FT_Vector point; + + + point.x = to->x + delta.x; + point.y = to->y + delta.y; + + error = ft_stroke_border_lineto( border, &point, TRUE ); + if ( error ) + goto Exit; + + delta.x = -delta.x; + delta.y = -delta.y; + } + + stroker->angle_in = angle; + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[34]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 30; + FT_Angle start_angle; + FT_Bool first_arc = TRUE; + + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control; + arc[2] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_out; + + + angle_in = angle_out = 0; /* remove compiler warnings */ + + if ( arc < limit && + !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) + { + ft_conic_split( arc ); + arc += 2; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + start_angle = angle_in; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, start_angle ); + else + { + stroker->angle_out = start_angle; + error = ft_stroker_process_corner( stroker ); + } + } + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl, end; + FT_Angle theta, phi, rotate; + FT_Fixed length; + FT_Int side; + + + theta = FT_Angle_Diff( angle_in, angle_out ) / 2; + phi = angle_in + theta; + length = FT_DivFix( stroker->radius, FT_Cos( theta ) ); + + for ( side = 0; side <= 1; side++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control point */ + FT_Vector_From_Polar( &ctrl, length, phi + rotate ); + ctrl.x += arc[1].x; + ctrl.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + error = ft_stroke_border_conicto( stroker->borders + side, + &ctrl, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 2; + + if ( arc < bez_stack ) + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[37]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 32; + FT_Angle start_angle; + FT_Bool first_arc = TRUE; + + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control2; + arc[2] = *control1; + arc[3] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_mid, angle_out; + + + /* remove compiler warnings */ + angle_in = angle_out = angle_mid = 0; + + if ( arc < limit && + !ft_cubic_is_small_enough( arc, &angle_in, + &angle_mid, &angle_out ) ) + { + ft_cubic_split( arc ); + arc += 3; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + start_angle = angle_in; + + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, start_angle ); + else + { + stroker->angle_out = start_angle; + error = ft_stroker_process_corner( stroker ); + } + if ( error ) + goto Exit; + } + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl1, ctrl2, end; + FT_Angle theta1, phi1, theta2, phi2, rotate; + FT_Fixed length1, length2; + FT_Int side; + + + theta1 = ft_pos_abs( angle_mid - angle_in ) / 2; + theta2 = ft_pos_abs( angle_out - angle_mid ) / 2; + phi1 = (angle_mid + angle_in ) / 2; + phi2 = (angle_mid + angle_out ) / 2; + length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) ); + length2 = FT_DivFix( stroker->radius, FT_Cos(theta2) ); + + for ( side = 0; side <= 1; side++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control points */ + FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); + ctrl1.x += arc[2].x; + ctrl1.y += arc[2].y; + + FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); + ctrl2.x += arc[1].x; + ctrl2.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + error = ft_stroke_border_cubicto( stroker->borders + side, + &ctrl1, &ctrl2, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 3; + if ( arc < bez_stack ) + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ) + { + /* We cannot process the first point, because there is not enough */ + /* information regarding its corner/cap. The latter will be processed */ + /* in the `FT_Stroker_EndSubPath' routine. */ + /* */ + stroker->first_point = TRUE; + stroker->center = *to; + stroker->subpath_open = open; + + /* record the subpath start point for each border */ + stroker->subpath_start = *to; + + return FT_Err_Ok; + } + + + static FT_Error + ft_stroker_add_reverse_left( FT_Stroker stroker, + FT_Bool open ) + { + FT_StrokeBorder right = stroker->borders + 0; + FT_StrokeBorder left = stroker->borders + 1; + FT_Int new_points; + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( left->start >= 0 ); + + new_points = left->num_points - left->start; + if ( new_points > 0 ) + { + error = ft_stroke_border_grow( right, (FT_UInt)new_points ); + if ( error ) + goto Exit; + + { + FT_Vector* dst_point = right->points + right->num_points; + FT_Byte* dst_tag = right->tags + right->num_points; + FT_Vector* src_point = left->points + left->num_points - 1; + FT_Byte* src_tag = left->tags + left->num_points - 1; + + while ( src_point >= left->points + left->start ) + { + *dst_point = *src_point; + *dst_tag = *src_tag; + + if ( open ) + dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END; + else + { + FT_Byte ttag = (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END ); + + + /* switch begin/end tags if necessary */ + if ( ttag == FT_STROKE_TAG_BEGIN || + ttag == FT_STROKE_TAG_END ) + dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; + + } + + src_point--; + src_tag--; + dst_point++; + dst_tag++; + } + } + + left->num_points = left->start; + right->num_points += new_points; + + right->movable = FALSE; + left->movable = FALSE; + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + /* there's a lot of magic in this function! */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ) + { + FT_Error error = FT_Err_Ok; + + + if ( stroker->subpath_open ) + { + FT_StrokeBorder right = stroker->borders; + + /* All right, this is an opened path, we need to add a cap between */ + /* right & left, add the reverse of left, then add a final cap */ + /* between left & right. */ + error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); + if ( error ) + goto Exit; + + /* add reversed points from `left' to `right' */ + error = ft_stroker_add_reverse_left( stroker, TRUE ); + if ( error ) + goto Exit; + + /* now add the final cap */ + stroker->center = stroker->subpath_start; + error = ft_stroker_cap( stroker, + stroker->subpath_angle + FT_ANGLE_PI, 0 ); + if ( error ) + goto Exit; + + /* Now end the right subpath accordingly. The left one is */ + /* rewind and doesn't need further processing. */ + ft_stroke_border_close( right, FALSE ); + } + else + { + FT_Angle turn; + FT_Int inside_side; + + /* close the path if needed */ + if ( stroker->center.x != stroker->subpath_start.x || + stroker->center.y != stroker->subpath_start.y ) + { + error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); + if ( error ) + goto Exit; + } + + /* process the corner */ + stroker->angle_out = stroker->subpath_angle; + turn = FT_Angle_Diff( stroker->angle_in, + stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn != 0 ) + { + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + + /* otherwise, the inside side is 1 */ + if ( turn < 0 ) + inside_side = 1; + + error = ft_stroker_inside( stroker, inside_side ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, 1 - inside_side ); + if ( error ) + goto Exit; + } + + /* then end our two subpaths */ + ft_stroke_border_close( stroker->borders + 0, TRUE ); + ft_stroke_border_close( stroker->borders + 1, FALSE ); + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt num_points = 0, num_contours = 0; + FT_Error error; + + + if ( !stroker || border > 1 ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + border, + &num_points, &num_contours ); + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt count1, count2, num_points = 0; + FT_UInt count3, count4, num_contours = 0; + FT_Error error; + + + error = ft_stroke_border_get_counts( stroker->borders + 0, + &count1, &count2 ); + if ( error ) + goto Exit; + + error = ft_stroke_border_get_counts( stroker->borders + 1, + &count3, &count4 ); + if ( error ) + goto Exit; + + num_points = count1 + count3; + num_contours = count2 + count4; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ) + { + if ( border == FT_STROKER_BORDER_LEFT || + border == FT_STROKER_BORDER_RIGHT ) + { + FT_StrokeBorder sborder = & stroker->borders[border]; + + + if ( sborder->valid ) + ft_stroke_border_export( sborder, outline ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ) + { + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); + } + + + /* documentation is in ftstroke.h */ + + /* + * The following is very similar to FT_Outline_Decompose, except + * that we do support opened paths, and do not scale the outline. + */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_UInt first; /* index of first point in contour */ + FT_Int tag; /* current point's state */ + + + if ( !outline || !stroker ) + return FT_Err_Invalid_Argument; + + FT_Stroker_Rewind( stroker ); + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_UInt last; /* index of last point in contour */ + + + last = outline->contours[n]; + limit = outline->points + last; + + /* skip empty points; we don't stroke these */ + if ( last <= first ) + { + first = last + 1; + continue; + } + + v_start = outline->points[first]; + v_last = outline->points[last]; + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* First point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + error = FT_Stroker_BeginSubPath( stroker, &v_start, opened ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = point->x; + vec.y = point->y; + + error = FT_Stroker_LineTo( stroker, &vec ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = point->x; + v_control.y = point->y; + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec = point[0]; + + if ( tag == FT_CURVE_TAG_ON ) + { + error = FT_Stroker_ConicTo( stroker, &v_control, &vec ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_start ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1 = point[-2]; + vec2 = point[-1]; + + if ( point <= limit ) + { + FT_Vector vec; + + + vec = point[0]; + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); + if ( error ) + goto Exit; + continue; + } + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); + goto Close; + } + } + } + + Close: + if ( error ) + goto Exit; + + error = FT_Stroker_EndSubPath( stroker ); + if ( error ) + goto Exit; + + first = last + 1; + } + + return FT_Err_Ok; + + Exit: + return error; + + Invalid_Outline: + return FT_Err_Invalid_Outline; + } + + + extern const FT_Glyph_Class ft_outline_glyph_class; + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Glyph glyph = NULL; + + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != &ft_outline_glyph_class ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, num_contours, outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_Export( stroker, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Glyph glyph = NULL; + + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != &ft_outline_glyph_class ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; + FT_StrokerBorder border; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + border = FT_Outline_GetOutsideBorder( outline ); + if ( inside ) + { + if ( border == FT_STROKER_BORDER_LEFT ) + border = FT_STROKER_BORDER_RIGHT; + else + border = FT_STROKER_BORDER_LEFT; + } + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetBorderCounts( stroker, border, + &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_ExportBorder( stroker, border, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftsynth.c b/src/3rdparty/freetype/src/base/ftsynth.c new file mode 100644 index 0000000000..443d272602 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftsynth.c @@ -0,0 +1,137 @@ +/***************************************************************************/ +/* */ +/* ftsynth.c */ +/* */ +/* FreeType synthesizing code for emboldening and slanting (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_SYNTHESIS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include FT_BITMAP_H + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ) + { + FT_Matrix transform; + FT_Outline* outline = &slot->outline; + + + /* only oblique outline glyphs */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + return; + + /* we don't touch the advance width */ + + /* For italic, simply apply a shear transform, with an angle */ + /* of about 12 degrees. */ + + transform.xx = 0x10000L; + transform.yx = 0x00000L; + + transform.xy = 0x06000L; + transform.yy = 0x10000L; + + FT_Outline_Transform( outline, &transform ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL EMBOLDENING/OUTLINING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) + { + FT_Library library = slot->library; + FT_Face face = slot->face; + FT_Error error; + FT_Pos xstr, ystr; + + + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && + slot->format != FT_GLYPH_FORMAT_BITMAP ) + return; + + /* some reasonable strength */ + xstr = FT_MulFix( face->units_per_EM, + face->size->metrics.y_scale ) / 24; + ystr = xstr; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + error = FT_Outline_Embolden( &slot->outline, xstr ); + /* ignore error */ + + /* this is more than enough for most glyphs; if you need accurate */ + /* values, you have to call FT_Outline_Get_CBox */ + xstr = xstr * 2; + ystr = xstr; + } + else if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + { + /* round to full pixels */ + xstr &= ~63; + if ( xstr == 0 ) + xstr = 1 << 6; + ystr &= ~63; + + error = FT_GlyphSlot_Own_Bitmap( slot ); + if ( error ) + return; + + error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr ); + if ( error ) + return; + } + + if ( slot->advance.x ) + slot->advance.x += xstr; + + if ( slot->advance.y ) + slot->advance.y += ystr; + + slot->metrics.width += xstr; + slot->metrics.height += ystr; + slot->metrics.horiBearingY += ystr; + slot->metrics.horiAdvance += xstr; + slot->metrics.vertBearingX -= xstr / 2; + slot->metrics.vertBearingY += ystr; + slot->metrics.vertAdvance += ystr; + + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + slot->bitmap_top += ystr >> 6; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftsystem.c b/src/3rdparty/freetype/src/base/ftsystem.c new file mode 100644 index 0000000000..f64908fd22 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftsystem.c @@ -0,0 +1,301 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* ANSI-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file contains the default interface used by FreeType to access */ + /* low-level, i.e. memory management, i/o access as well as thread */ + /* synchronisation. It can be replaced by user-specific routines if */ + /* necessary. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* It is not necessary to do any error checking for the */ + /* allocation-related functions. This will be done by the higher level */ + /* routines like ft_mem_alloc() or ft_mem_realloc(). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_alloc */ + /* */ + /* <Description> */ + /* The memory allocation function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* <Return> */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return ft_smalloc( size ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_realloc */ + /* */ + /* <Description> */ + /* The memory reallocation function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* <Return> */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return ft_srealloc( block, new_size ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_free */ + /* */ + /* <Description> */ + /* The memory release function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + ft_sfree( block ); + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_ansi_stream_close */ + /* */ + /* <Description> */ + /* The function to close a stream. */ + /* */ + /* <Input> */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_ansi_stream_close( FT_Stream stream ) + { + ft_fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_ansi_stream_io */ + /* */ + /* <Description> */ + /* The function to open a stream. */ + /* */ + /* <Input> */ + /* stream :: A pointer to the stream object. */ + /* */ + /* offset :: The position in the data stream to start reading. */ + /* */ + /* buffer :: The address of buffer to store the read data. */ + /* */ + /* count :: The number of bytes to read from the stream. */ + /* */ + /* <Return> */ + /* The number of bytes actually read. */ + /* */ + FT_CALLBACK_DEF( unsigned long ) + ft_ansi_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_FILE* file; + + + file = STREAM_FILE( stream ); + + ft_fseek( file, offset, SEEK_SET ); + + return (unsigned long)ft_fread( buffer, 1, count, file ); + } + + + /* documentation is in ftstream.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + FT_FILE* file; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + + file = ft_fopen( filepathname, "rb" ); + if ( !file ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + + ft_fseek( file, 0, SEEK_END ); + stream->size = ft_ftell( file ); + ft_fseek( file, 0, SEEK_SET ); + + stream->descriptor.pointer = file; + stream->pathname.pointer = (char*)filepathname; + stream->pos = 0; + + stream->read = ft_ansi_stream_io; + stream->close = ft_ansi_stream_close; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = 0; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + ft_sfree( memory ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/fttrigon.c b/src/3rdparty/freetype/src/base/fttrigon.c new file mode 100644 index 0000000000..9f513946b8 --- /dev/null +++ b/src/3rdparty/freetype/src/base/fttrigon.c @@ -0,0 +1,546 @@ +/***************************************************************************/ +/* */ +/* fttrigon.c */ +/* */ +/* FreeType trigonometric functions (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_TRIGONOMETRY_H + + + /* the following is 0.2715717684432231 * 2^30 */ +#define FT_TRIG_COSCALE 0x11616E8EUL + + /* this table was generated for FT_PI = 180L << 16, i.e. degrees */ +#define FT_TRIG_MAX_ITERS 23 + + static const FT_Fixed + ft_trig_arctan_table[24] = + { + 4157273L, 2949120L, 1740967L, 919879L, 466945L, 234379L, 117304L, + 58666L, 29335L, 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, + 57L, 29L, 14L, 7L, 4L, 2L, 1L + }; + + /* the Cordic shrink factor, multiplied by 2^32 */ +#define FT_TRIG_SCALE 1166391785UL /* 0x4585BA38UL */ + + +#ifdef FT_CONFIG_HAS_INT64 + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Fixed s; + FT_Int64 v; + + + s = val; + val = ( val >= 0 ) ? val : -val; + + v = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL; + val = (FT_Fixed)( v >> 32 ); + + return ( s >= 0 ) ? val : -val; + } + +#else /* !FT_CONFIG_HAS_INT64 */ + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Fixed s; + FT_UInt32 v1, v2, k1, k2, hi, lo1, lo2, lo3; + + + s = val; + val = ( val >= 0 ) ? val : -val; + + v1 = (FT_UInt32)val >> 16; + v2 = (FT_UInt32)val & 0xFFFFL; + + k1 = FT_TRIG_SCALE >> 16; /* constant */ + k2 = FT_TRIG_SCALE & 0xFFFFL; /* constant */ + + hi = k1 * v1; + lo1 = k1 * v2 + k2 * v1; /* can't overflow */ + + lo2 = ( k2 * v2 ) >> 16; + lo3 = ( lo1 >= lo2 ) ? lo1 : lo2; + lo1 += lo2; + + hi += lo1 >> 16; + if ( lo1 < lo3 ) + hi += 0x10000UL; + + val = (FT_Fixed)hi; + + return ( s >= 0 ) ? val : -val; + } + +#endif /* !FT_CONFIG_HAS_INT64 */ + + + static FT_Int + ft_trig_prenorm( FT_Vector* vec ) + { + FT_Fixed x, y, z; + FT_Int shift; + + + x = vec->x; + y = vec->y; + + z = ( ( x >= 0 ) ? x : - x ) | ( (y >= 0) ? y : -y ); + shift = 0; + +#if 1 + /* determine msb bit index in `shift' */ + if ( z >= ( 1L << 16 ) ) + { + z >>= 16; + shift += 16; + } + if ( z >= ( 1L << 8 ) ) + { + z >>= 8; + shift += 8; + } + if ( z >= ( 1L << 4 ) ) + { + z >>= 4; + shift += 4; + } + if ( z >= ( 1L << 2 ) ) + { + z >>= 2; + shift += 2; + } + if ( z >= ( 1L << 1 ) ) + { + z >>= 1; + shift += 1; + } + + if ( shift <= 27 ) + { + shift = 27 - shift; + vec->x = x << shift; + vec->y = y << shift; + } + else + { + shift -= 27; + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + +#else /* 0 */ + + if ( z < ( 1L << 27 ) ) + { + do + { + shift++; + z <<= 1; + } while ( z < ( 1L << 27 ) ); + vec->x = x << shift; + vec->y = y << shift; + } + else if ( z > ( 1L << 28 ) ) + { + do + { + shift++; + z >>= 1; + } while ( z > ( 1L << 28 ) ); + + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + +#endif /* 0 */ + + return shift; + } + + + static void + ft_trig_pseudo_rotate( FT_Vector* vec, + FT_Angle theta ) + { + FT_Int i; + FT_Fixed x, y, xtemp; + const FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get angle between -90 and 90 degrees */ + while ( theta <= -FT_ANGLE_PI2 ) + { + x = -x; + y = -y; + theta += FT_ANGLE_PI; + } + + while ( theta > FT_ANGLE_PI2 ) + { + x = -x; + y = -y; + theta -= FT_ANGLE_PI; + } + + /* Initial pseudorotation, with left shift */ + arctanptr = ft_trig_arctan_table; + + if ( theta < 0 ) + { + xtemp = x + ( y << 1 ); + y = y - ( x << 1 ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( y << 1 ); + y = y + ( x << 1 ); + x = xtemp; + theta -= *arctanptr++; + } + + /* Subsequent pseudorotations, with right shifts */ + i = 0; + do + { + if ( theta < 0 ) + { + xtemp = x + ( y >> i ); + y = y - ( x >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( y >> i ); + y = y + ( x >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } while ( ++i < FT_TRIG_MAX_ITERS ); + + vec->x = x; + vec->y = y; + } + + + static void + ft_trig_pseudo_polarize( FT_Vector* vec ) + { + FT_Fixed theta; + FT_Fixed yi, i; + FT_Fixed x, y; + const FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get the vector into the right half plane */ + theta = 0; + if ( x < 0 ) + { + x = -x; + y = -y; + theta = 2 * FT_ANGLE_PI2; + } + + if ( y > 0 ) + theta = - theta; + + arctanptr = ft_trig_arctan_table; + + if ( y < 0 ) + { + /* Rotate positive */ + yi = y + ( x << 1 ); + x = x - ( y << 1 ); + y = yi; + theta -= *arctanptr++; /* Subtract angle */ + } + else + { + /* Rotate negative */ + yi = y - ( x << 1 ); + x = x + ( y << 1 ); + y = yi; + theta += *arctanptr++; /* Add angle */ + } + + i = 0; + do + { + if ( y < 0 ) + { + /* Rotate positive */ + yi = y + ( x >> i ); + x = x - ( y >> i ); + y = yi; + theta -= *arctanptr++; + } + else + { + /* Rotate negative */ + yi = y - ( x >> i ); + x = x + ( y >> i ); + y = yi; + theta += *arctanptr++; + } + } while ( ++i < FT_TRIG_MAX_ITERS ); + + /* round theta */ + if ( theta >= 0 ) + theta = FT_PAD_ROUND( theta, 32 ); + else + theta = -FT_PAD_ROUND( -theta, 32 ); + + vec->x = x; + vec->y = theta; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Cos( FT_Angle angle ) + { + FT_Vector v; + + + v.x = FT_TRIG_COSCALE >> 2; + v.y = 0; + ft_trig_pseudo_rotate( &v, angle ); + + return v.x / ( 1 << 12 ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Sin( FT_Angle angle ) + { + return FT_Cos( FT_ANGLE_PI2 - angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Tan( FT_Angle angle ) + { + FT_Vector v; + + + v.x = FT_TRIG_COSCALE >> 2; + v.y = 0; + ft_trig_pseudo_rotate( &v, angle ); + + return FT_DivFix( v.y, v.x ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Atan2( FT_Fixed dx, + FT_Fixed dy ) + { + FT_Vector v; + + + if ( dx == 0 && dy == 0 ) + return 0; + + v.x = dx; + v.y = dy; + ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + return v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ) + { + vec->x = FT_TRIG_COSCALE >> 2; + vec->y = 0; + ft_trig_pseudo_rotate( vec, angle ); + vec->x >>= 12; + vec->y >>= 12; + } + + + /* these macros return 0 for positive numbers, + and -1 for negative ones */ +#define FT_SIGN_LONG( x ) ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) ) +#define FT_SIGN_INT( x ) ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) ) +#define FT_SIGN_INT32( x ) ( (x) >> 31 ) +#define FT_SIGN_INT16( x ) ( (x) >> 15 ) + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ) + { + FT_Int shift; + FT_Vector v; + + + v.x = vec->x; + v.y = vec->y; + + if ( angle && ( v.x != 0 || v.y != 0 ) ) + { + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_rotate( &v, angle ); + v.x = ft_trig_downscale( v.x ); + v.y = ft_trig_downscale( v.y ); + + if ( shift > 0 ) + { + FT_Int32 half = 1L << ( shift - 1 ); + + + vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift; + vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift; + } + else + { + shift = -shift; + vec->x = v.x << shift; + vec->y = v.y << shift; + } + } + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ) + { + FT_Int shift; + FT_Vector v; + + + v = *vec; + + /* handle trivial cases */ + if ( v.x == 0 ) + { + return ( v.y >= 0 ) ? v.y : -v.y; + } + else if ( v.y == 0 ) + { + return ( v.x >= 0 ) ? v.x : -v.x; + } + + /* general case */ + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + if ( shift > 0 ) + return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift; + + return v.x << -shift; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ) + { + FT_Int shift; + FT_Vector v; + + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + *length = ( shift >= 0 ) ? ( v.x >> shift ) : ( v.x << -shift ); + *angle = v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ) + { + vec->x = length; + vec->y = 0; + + FT_Vector_Rotate( vec, angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ) + { + FT_Angle delta = angle2 - angle1; + + + delta %= FT_ANGLE_2PI; + if ( delta < 0 ) + delta += FT_ANGLE_2PI; + + if ( delta > FT_ANGLE_PI ) + delta -= FT_ANGLE_2PI; + + return delta; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/fttype1.c b/src/3rdparty/freetype/src/base/fttype1.c new file mode 100644 index 0000000000..3975584db8 --- /dev/null +++ b/src/3rdparty/freetype/src/base/fttype1.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* fttype1.c */ +/* */ +/* FreeType utility file for PS names support (body). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_INFO_H + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( face ) + { + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_info ) + error = service->ps_get_font_info( face, afont_info ); + } + + return error; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ) + { + FT_Int result = 0; + FT_Service_PsInfo service = NULL; + + + if ( face ) + { + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_has_glyph_names ) + result = service->ps_has_glyph_names( face ); + } + + return result; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_PrivateRec* afont_private ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( face ) + { + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_private ) + error = service->ps_get_font_private( face, afont_private ); + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftutil.c b/src/3rdparty/freetype/src/base/ftutil.c new file mode 100644 index 0000000000..5f77be557a --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftutil.c @@ -0,0 +1,501 @@ +/***************************************************************************/ +/* */ +/* ftutil.c */ +/* */ +/* FreeType utility file for memory and list management (body). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H +#include FT_LIST_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_memory + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** M E M O R Y M A N A G E M E N T *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer block = ft_mem_qalloc( memory, size, &error ); + + if ( !error && size > 0 ) + FT_MEM_ZERO( block, size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + FT_Pointer block = NULL; + + + if ( size > 0 ) + { + block = memory->alloc( memory, size ); + if ( block == NULL ) + error = FT_Err_Out_Of_Memory; + } + else if ( size < 0 ) + { + /* may help catch/prevent security issues */ + error = FT_Err_Invalid_Argument; + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + block = ft_mem_qrealloc( memory, item_size, + cur_count, new_count, block, &error ); + if ( !error && new_count > cur_count ) + FT_MEM_ZERO( (char*)block + cur_count * item_size, + ( new_count - cur_count ) * item_size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + + /* Note that we now accept `item_size == 0' as a valid parameter, in + * order to cover very weird cases where an ALLOC_MULT macro would be + * called. + */ + if ( cur_count < 0 || new_count < 0 || item_size < 0 ) + { + /* may help catch/prevent nasty security issues */ + error = FT_Err_Invalid_Argument; + } + else if ( new_count == 0 || item_size == 0 ) + { + ft_mem_free( memory, block ); + block = NULL; + } + else if ( new_count > FT_INT_MAX/item_size ) + { + error = FT_Err_Array_Too_Large; + } + else if ( cur_count == 0 ) + { + FT_ASSERT( block == NULL ); + + block = ft_mem_alloc( memory, new_count*item_size, &error ); + } + else + { + FT_Pointer block2; + FT_Long cur_size = cur_count*item_size; + FT_Long new_size = new_count*item_size; + + + block2 = memory->realloc( memory, cur_size, new_size, block ); + if ( block2 == NULL ) + error = FT_Err_Out_Of_Memory; + else + block = block2; + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( void ) + ft_mem_free( FT_Memory memory, + const void *P ) + { + if ( P ) + memory->free( memory, (void*)P ); + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer p = ft_mem_qalloc( memory, size, &error ); + + + if ( !error && address ) + ft_memcpy( p, address, size ); + + *p_error = error; + return p; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ) + { + FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1 + : 0; + + + return ft_mem_dup( memory, str, len, p_error ); + } + + + FT_BASE_DEF( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ) + { + while ( size > 1 && *src != 0 ) + { + *dst++ = *src++; + size--; + } + + *dst = 0; /* always zero-terminate */ + + return *src != 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** D O U B L Y L I N K E D L I S T S *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#undef FT_COMPONENT +#define FT_COMPONENT trace_list + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ) + { + FT_ListNode cur; + + + cur = list->head; + while ( cur ) + { + if ( cur->data == data ) + return cur; + + cur = cur->next; + } + + return (FT_ListNode)0; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Add( FT_List list, + FT_ListNode node ) + { + FT_ListNode before = list->tail; + + + node->next = 0; + node->prev = before; + + if ( before ) + before->next = node; + else + list->head = node; + + list->tail = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ) + { + FT_ListNode after = list->head; + + + node->next = after; + node->prev = 0; + + if ( !after ) + list->tail = node; + else + after->prev = node; + + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + before = node->prev; + after = node->next; + + if ( before ) + before->next = after; + else + list->head = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Up( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + before = node->prev; + after = node->next; + + /* check whether we are already on top of the list */ + if ( !before ) + return; + + before->next = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + + node->prev = 0; + node->next = list->head; + list->head->prev = node; + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ) + { + FT_ListNode cur = list->head; + FT_Error error = FT_Err_Ok; + + + while ( cur ) + { + FT_ListNode next = cur->next; + + + error = iterator( cur, user ); + if ( error ) + break; + + cur = next; + } + + return error; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ) + { + FT_ListNode cur; + + + cur = list->head; + while ( cur ) + { + FT_ListNode next = cur->next; + void* data = cur->data; + + + if ( destroy ) + destroy( memory, data, user ); + + FT_FREE( cur ); + cur = next; + } + + list->head = 0; + list->tail = 0; + } + + + FT_BASE_DEF( FT_UInt32 ) + ft_highpow2( FT_UInt32 value ) + { + FT_UInt32 value2; + + + /* + * We simply clear the lowest bit in each iteration. When + * we reach 0, we know that the previous value was our result. + */ + for ( ;; ) + { + value2 = value & (value - 1); /* clear lowest bit */ + if ( value2 == 0 ) + break; + + value = value2; + } + return value; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE_DEF( FT_Error ) + FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ) + { + FT_Error error; + + + (void)FT_ALLOC( *P, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_QAlloc( FT_Memory memory, + FT_Long size, + void* *p ) + { + FT_Error error; + + + (void)FT_QALLOC( *p, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *P ) + { + FT_Error error; + + + (void)FT_REALLOC( *P, current, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_QRealloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *p ) + { + FT_Error error; + + + (void)FT_QREALLOC( *p, current, size ); + return error; + } + + + FT_BASE_DEF( void ) + FT_Free( FT_Memory memory, + void* *P ) + { + if ( *P ) + FT_MEM_FREE( *P ); + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftwinfnt.c b/src/3rdparty/freetype/src/base/ftwinfnt.c new file mode 100644 index 0000000000..bc2e90e1f6 --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftwinfnt.c @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.c */ +/* */ +/* FreeType API for accessing Windows FNT specific info (body). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_WINFONTS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_WINFNT_H + + + /* documentation is in ftwinfnt.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *header ) + { + FT_Service_WinFnt service; + FT_Error error; + + + error = FT_Err_Invalid_Argument; + + if ( face != NULL ) + { + FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); + + if ( service != NULL ) + { + error = service->get_header( face, header ); + } + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/ftxf86.c b/src/3rdparty/freetype/src/base/ftxf86.c new file mode 100644 index 0000000000..a4bf767dfa --- /dev/null +++ b/src/3rdparty/freetype/src/base/ftxf86.c @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* ftxf86.c */ +/* */ +/* FreeType utility file for X11 support (body). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_XFREE86_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_XFREE86_NAME_H + + + /* documentation is in ftxf86.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_X11_Font_Format( FT_Face face ) + { + const char* result = NULL; + + + if ( face ) + FT_FACE_FIND_SERVICE( face, result, XF86_NAME ); + + return result; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/base/rules.mk b/src/3rdparty/freetype/src/base/rules.mk new file mode 100644 index 0000000000..66260e6777 --- /dev/null +++ b/src/3rdparty/freetype/src/base/rules.mk @@ -0,0 +1,96 @@ +# +# FreeType 2 base layer configuration rules +# + + +# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# It sets the following variables which are used by the master Makefile +# after the call: +# +# BASE_OBJ_S: The single-object base layer. +# BASE_OBJ_M: A list of all objects for a multiple-objects build. +# BASE_EXT_OBJ: A list of base layer extensions, i.e., components found +# in `freetype/src/base' which are not compiled within the +# base layer proper. + + +BASE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SRC_DIR)/base) + + +# Base layer sources +# +# ftsystem, ftinit, and ftdebug are handled by freetype.mk +# +# All files listed here should be included in `ftbase.c' (for a `single' +# build). +# +BASE_SRC := $(BASE_DIR)/ftadvanc.c \ + $(BASE_DIR)/ftcalc.c \ + $(BASE_DIR)/ftdbgmem.c \ + $(BASE_DIR)/ftgloadr.c \ + $(BASE_DIR)/ftnames.c \ + $(BASE_DIR)/ftobjs.c \ + $(BASE_DIR)/ftoutln.c \ + $(BASE_DIR)/ftrfork.c \ + $(BASE_DIR)/ftstream.c \ + $(BASE_DIR)/fttrigon.c \ + $(BASE_DIR)/ftutil.c + + +ifneq ($(ftmac_c),) + BASE_SRC += $(BASE_DIR)/$(ftmac_c) +endif + +BASE_H := $(BASE_DIR)/ftbase.h + +# Base layer `extensions' sources +# +# An extension is added to the library file as a separate object. It is +# then linked to the final executable only if one of its symbols is used by +# the application. +# +BASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS)) + +# Default extensions objects +# +BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O) + + +# Base layer object(s) +# +# BASE_OBJ_M is used during `multi' builds (each base source file compiles +# to a single object file). +# +# BASE_OBJ_S is used during `single' builds (the whole base layer is +# compiled as a single object file using ftbase.c). +# +BASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O) +BASE_OBJ_S := $(OBJ_DIR)/ftbase.$O + +# Base layer root source file for single build +# +BASE_SRC_S := $(BASE_DIR)/ftbase.c + + +# Base layer - single object build +# +$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H) + $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S)) + + +# Multiple objects build + extensions +# +$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H) + $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# EOF diff --git a/src/3rdparty/freetype/src/bdf/Jamfile b/src/3rdparty/freetype/src/bdf/Jamfile new file mode 100644 index 0000000000..da23ccd0ad --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/bdf Jamfile +# +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) bdf ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = bdfdrivr bdflib ; + } + else + { + _sources = bdf ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/bdf Jamfile diff --git a/src/3rdparty/freetype/src/bdf/README b/src/3rdparty/freetype/src/bdf/README new file mode 100644 index 0000000000..e3f2ae3861 --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/README @@ -0,0 +1,148 @@ + FreeType font driver for BDF fonts + + Francesco Zappa Nardelli + <francesco.zappa.nardelli@ens.fr> + + +Introduction +************ + +BDF (Bitmap Distribution Format) is a bitmap font format defined by Adobe, +which is intended to be easily understood by both humans and computers. +This code implements a BDF driver for the FreeType library, following the +Adobe Specification V 2.2. The specification of the BDF font format is +available from Adobe's web site: + + http://partners.adobe.com/asn/developer/PDFS/TN/5005.BDF_Spec.pdf + +Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org). +They do not define vertical metrics, because the X Consortium BDF +specification has removed them. + + +Encodings +********* + +The variety of encodings that accompanies bdf fonts appears to encompass the +small set defined in freetype.h. On the other hand, two properties that +specify encoding and registry are usually defined in bdf fonts. + +I decided to make these two properties directly accessible, leaving to the +client application the work of interpreting them. For instance: + + + #include FT_INTERNAL_BDF_TYPES_H + + FT_Face face; + BDF_Public_Face bdfface; + + + FT_New_Face( library, ..., &face ); + + bdfface = (BDF_Public_Face)face; + + if ( ( bdfface->charset_registry == "ISO10646" ) && + ( bdfface->charset_encoding == "1" ) ) + [..] + + +Thus the driver always exports `ft_encoding_none' as face->charmap.encoding. +FT_Get_Char_Index's behavior is unmodified, that is, it converts the ULong +value given as argument into the corresponding glyph number. + +If the two properties are not available, Adobe Standard Encoding should be +assumed. + + +Anti-Aliased Bitmaps +******************** + +The driver supports an extension to the BDF format as used in Mark Leisher's +xmbdfed bitmap font editor. Microsoft's SBIT tool expects bitmap fonts in +that format for adding anti-aliased them to TrueType fonts. It introduces a +fourth field to the `SIZE' keyword which gives the bpp value (bits per +pixel) of the glyph data in the font. Possible values are 1 (the default), +2 (four gray levels), 4 (16 gray levels), and 8 (256 gray levels). The +driver returns either a bitmap with 1 bit per pixel or a pixmap with 8bits +per pixel (using 4, 16, and 256 gray levels, respectively). + + +Known problems +************** + +- A font is entirely loaded into memory. Obviously, this is not the Right + Thing(TM). If you have big fonts I suggest you convert them into PCF + format (using the bdftopcf utility): the PCF font drive of FreeType can + perform incremental glyph loading. + +When I have some time, I will implement on-demand glyph parsing. + +- Except for encodings properties, client applications have no visibility of + the PCF_Face object. This means that applications cannot directly access + font tables and must trust FreeType. + +- Currently, glyph names are ignored. + + I plan to give full visibility of the BDF_Face object in an upcoming + revision of the driver, thus implementing also glyph names. + +- As I have never seen a BDF font that defines vertical metrics, vertical + metrics are (parsed and) discarded. If you own a BDF font that defines + vertical metrics, please let me know (I will implement them in 5-10 + minutes). + + +License +******* + +Copyright (C) 2001-2002 by Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** Portions of the driver (that is, bdflib.c and bdf.h): + +Copyright 2000 Computing Research Labs, New Mexico State University +Copyright 2001-2002 Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Credits +******* + +This driver is based on excellent Mark Leisher's bdf library. If you +find something good in this driver you should probably thank him, not +me. diff --git a/src/3rdparty/freetype/src/bdf/bdf.c b/src/3rdparty/freetype/src/bdf/bdf.c new file mode 100644 index 0000000000..f95fb76225 --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/bdf.c @@ -0,0 +1,34 @@ +/* bdf.c + + FreeType font driver for bdf files + + Copyright (C) 2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "bdflib.c" +#include "bdfdrivr.c" + + +/* END */ diff --git a/src/3rdparty/freetype/src/bdf/bdf.h b/src/3rdparty/freetype/src/bdf/bdf.h new file mode 100644 index 0000000000..1b64426aad --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/bdf.h @@ -0,0 +1,295 @@ +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001, 2002, 2003, 2004 Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifndef __BDF_H__ +#define __BDF_H__ + + +/* + * Based on bdf.h,v 1.16 2000/03/16 20:08:51 mleisher + */ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + +/* Imported from bdfP.h */ + +#define _bdf_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] & ( 1 << ( (e) & 31 ) ) ) +#define _bdf_set_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] |= ( 1 << ( (e) & 31 ) ) ) +#define _bdf_clear_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] &= ~( 1 << ( (e) & 31 ) ) ) + +/* end of bdfP.h */ + + + /*************************************************************************/ + /* */ + /* BDF font options macros and types. */ + /* */ + /*************************************************************************/ + + +#define BDF_CORRECT_METRICS 0x01 /* Correct invalid metrics when loading. */ +#define BDF_KEEP_COMMENTS 0x02 /* Preserve the font comments. */ +#define BDF_KEEP_UNENCODED 0x04 /* Keep the unencoded glyphs. */ +#define BDF_PROPORTIONAL 0x08 /* Font has proportional spacing. */ +#define BDF_MONOWIDTH 0x10 /* Font has mono width. */ +#define BDF_CHARCELL 0x20 /* Font has charcell spacing. */ + +#define BDF_ALL_SPACING ( BDF_PROPORTIONAL | \ + BDF_MONOWIDTH | \ + BDF_CHARCELL ) + +#define BDF_DEFAULT_LOAD_OPTIONS ( BDF_CORRECT_METRICS | \ + BDF_KEEP_COMMENTS | \ + BDF_KEEP_UNENCODED | \ + BDF_PROPORTIONAL ) + + + typedef struct bdf_options_t_ + { + int correct_metrics; + int keep_unencoded; + int keep_comments; + int font_spacing; + + } bdf_options_t; + + + /* Callback function type for unknown configuration options. */ + typedef int + (*bdf_options_callback_t)( bdf_options_t* opts, + char** params, + unsigned long nparams, + void* client_data ); + + + /*************************************************************************/ + /* */ + /* BDF font property macros and types. */ + /* */ + /*************************************************************************/ + + +#define BDF_ATOM 1 +#define BDF_INTEGER 2 +#define BDF_CARDINAL 3 + + + /* This structure represents a particular property of a font. */ + /* There are a set of defaults and each font has their own. */ + typedef struct bdf_property_t_ + { + char* name; /* Name of the property. */ + int format; /* Format of the property. */ + int builtin; /* A builtin property. */ + union + { + char* atom; + long int32; + unsigned long card32; + + } value; /* Value of the property. */ + + } bdf_property_t; + + + /*************************************************************************/ + /* */ + /* BDF font metric and glyph types. */ + /* */ + /*************************************************************************/ + + + typedef struct bdf_bbx_t_ + { + unsigned short width; + unsigned short height; + + short x_offset; + short y_offset; + + short ascent; + short descent; + + } bdf_bbx_t; + + + typedef struct bdf_glyph_t_ + { + char* name; /* Glyph name. */ + long encoding; /* Glyph encoding. */ + unsigned short swidth; /* Scalable width. */ + unsigned short dwidth; /* Device width. */ + bdf_bbx_t bbx; /* Glyph bounding box. */ + unsigned char* bitmap; /* Glyph bitmap. */ + unsigned long bpr; /* Number of bytes used per row. */ + unsigned short bytes; /* Number of bytes used for the bitmap. */ + + } bdf_glyph_t; + + + typedef struct _hashnode_ + { + const char* key; + void* data; + + } _hashnode, *hashnode; + + + typedef struct hashtable_ + { + int limit; + int size; + int used; + hashnode* table; + + } hashtable; + + + typedef struct bdf_glyphlist_t_ + { + unsigned short pad; /* Pad to 4-byte boundary. */ + unsigned short bpp; /* Bits per pixel. */ + long start; /* Beginning encoding value of glyphs. */ + long end; /* Ending encoding value of glyphs. */ + bdf_glyph_t* glyphs; /* Glyphs themselves. */ + unsigned long glyphs_size; /* Glyph structures allocated. */ + unsigned long glyphs_used; /* Glyph structures used. */ + bdf_bbx_t bbx; /* Overall bounding box of glyphs. */ + + } bdf_glyphlist_t; + + + typedef struct bdf_font_t_ + { + char* name; /* Name of the font. */ + bdf_bbx_t bbx; /* Font bounding box. */ + + long point_size; /* Point size of the font. */ + unsigned long resolution_x; /* Font horizontal resolution. */ + unsigned long resolution_y; /* Font vertical resolution. */ + + int spacing; /* Font spacing value. */ + + unsigned short monowidth; /* Logical width for monowidth font. */ + + long default_char; /* Encoding of the default glyph. */ + + long font_ascent; /* Font ascent. */ + long font_descent; /* Font descent. */ + + unsigned long glyphs_size; /* Glyph structures allocated. */ + unsigned long glyphs_used; /* Glyph structures used. */ + bdf_glyph_t* glyphs; /* Glyphs themselves. */ + + unsigned long unencoded_size; /* Unencoded glyph struct. allocated. */ + unsigned long unencoded_used; /* Unencoded glyph struct. used. */ + bdf_glyph_t* unencoded; /* Unencoded glyphs themselves. */ + + unsigned long props_size; /* Font properties allocated. */ + unsigned long props_used; /* Font properties used. */ + bdf_property_t* props; /* Font properties themselves. */ + + char* comments; /* Font comments. */ + unsigned long comments_len; /* Length of comment string. */ + + bdf_glyphlist_t overflow; /* Storage used for glyph insertion. */ + + void* internal; /* Internal data for the font. */ + + unsigned long nmod[2048]; /* Bitmap indicating modified glyphs. */ + unsigned long umod[2048]; /* Bitmap indicating modified */ + /* unencoded glyphs. */ + unsigned short modified; /* Boolean indicating font modified. */ + unsigned short bpp; /* Bits per pixel. */ + + FT_Memory memory; + + bdf_property_t* user_props; + unsigned long nuser_props; + hashtable proptbl; + + } bdf_font_t; + + + /*************************************************************************/ + /* */ + /* Types for load/save callbacks. */ + /* */ + /*************************************************************************/ + + + /* Error codes. */ +#define BDF_MISSING_START -1 +#define BDF_MISSING_FONTNAME -2 +#define BDF_MISSING_SIZE -3 +#define BDF_MISSING_CHARS -4 +#define BDF_MISSING_STARTCHAR -5 +#define BDF_MISSING_ENCODING -6 +#define BDF_MISSING_BBX -7 + +#define BDF_OUT_OF_MEMORY -20 + +#define BDF_INVALID_LINE -100 + + + /*************************************************************************/ + /* */ + /* BDF font API. */ + /* */ + /*************************************************************************/ + + FT_LOCAL( FT_Error ) + bdf_load_font( FT_Stream stream, + FT_Memory memory, + bdf_options_t* opts, + bdf_font_t* *font ); + + FT_LOCAL( void ) + bdf_free_font( bdf_font_t* font ); + + FT_LOCAL( bdf_property_t * ) + bdf_get_property( char* name, + bdf_font_t* font ); + + FT_LOCAL( bdf_property_t * ) + bdf_get_font_property( bdf_font_t* font, + const char* name ); + + +FT_END_HEADER + + +#endif /* __BDF_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/bdf/bdfdrivr.c b/src/3rdparty/freetype/src/bdf/bdfdrivr.c new file mode 100644 index 0000000000..0b736b5ceb --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/bdfdrivr.c @@ -0,0 +1,855 @@ +/* bdfdrivr.c + + FreeType font driver for bdf files + + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include <ft2build.h> + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H +#include FT_BDF_H + +#include FT_SERVICE_BDF_H +#include FT_SERVICE_XFREE86_NAME_H + +#include "bdf.h" +#include "bdfdrivr.h" + +#include "bdferror.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_bdfdriver + + + typedef struct BDF_CMapRec_ + { + FT_CMapRec cmap; + FT_UInt num_encodings; + BDF_encoding_el* encodings; + + } BDF_CMapRec, *BDF_CMap; + + + FT_CALLBACK_DEF( FT_Error ) + bdf_cmap_init( FT_CMap bdfcmap, + FT_Pointer init_data ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_Face face = (BDF_Face)FT_CMAP_FACE( cmap ); + FT_UNUSED( init_data ); + + + cmap->num_encodings = face->bdffont->glyphs_used; + cmap->encodings = face->en_table; + + return BDF_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + bdf_cmap_done( FT_CMap bdfcmap ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + + + cmap->encodings = NULL; + cmap->num_encodings = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + bdf_cmap_char_index( FT_CMap bdfcmap, + FT_UInt32 charcode ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_encoding_el* encodings = cmap->encodings; + FT_UInt min, max, mid; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_UInt32 code; + + + mid = ( min + max ) >> 1; + code = encodings[mid].enc; + + if ( charcode == code ) + { + /* increase glyph index by 1 -- */ + /* we reserve slot 0 for the undefined glyph */ + result = encodings[mid].glyph + 1; + break; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + bdf_cmap_char_next( FT_CMap bdfcmap, + FT_UInt32 *acharcode ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_encoding_el* encodings = cmap->encodings; + FT_UInt min, max, mid; + FT_UInt32 charcode = *acharcode + 1; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_UInt32 code; + + + mid = ( min + max ) >> 1; + code = encodings[mid].enc; + + if ( charcode == code ) + { + /* increase glyph index by 1 -- */ + /* we reserve slot 0 for the undefined glyph */ + result = encodings[mid].glyph + 1; + goto Exit; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + } + + charcode = 0; + if ( min < cmap->num_encodings ) + { + charcode = encodings[min].enc; + result = encodings[min].glyph + 1; + } + + Exit: + *acharcode = charcode; + return result; + } + + + FT_CALLBACK_TABLE_DEF + const FT_CMap_ClassRec bdf_cmap_class = + { + sizeof ( BDF_CMapRec ), + bdf_cmap_init, + bdf_cmap_done, + bdf_cmap_char_index, + bdf_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + static FT_Error + bdf_interpret_style( BDF_Face bdf ) + { + FT_Error error = BDF_Err_Ok; + FT_Face face = FT_FACE( bdf ); + FT_Memory memory = face->memory; + bdf_font_t* font = bdf->bdffont; + bdf_property_t* prop; + + int nn, len; + char* strings[4] = { NULL, NULL, NULL, NULL }; + int lengths[4]; + + + face->style_flags = 0; + + prop = bdf_get_font_property( font, (char *)"SLANT" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || + *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) + { + face->style_flags |= FT_STYLE_FLAG_ITALIC; + strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) + ? (char *)"Oblique" + : (char *)"Italic"; + } + + prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) + { + face->style_flags |= FT_STYLE_FLAG_BOLD; + strings[1] = (char *)"Bold"; + } + + prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[3] = (char *)(prop->value.atom); + + prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[0] = (char *)(prop->value.atom); + + len = 0; + + for ( len = 0, nn = 0; nn < 4; nn++ ) + { + lengths[nn] = 0; + if ( strings[nn] ) + { + lengths[nn] = ft_strlen( strings[nn] ); + len += lengths[nn] + 1; + } + } + + if ( len == 0 ) + { + strings[0] = (char *)"Regular"; + lengths[0] = ft_strlen( strings[0] ); + len = lengths[0] + 1; + } + + { + char* s; + + + if ( FT_ALLOC( face->style_name, len ) ) + return error; + + s = face->style_name; + + for ( nn = 0; nn < 4; nn++ ) + { + char* src = strings[nn]; + + + len = lengths[nn]; + + if ( src == NULL ) + continue; + + /* separate elements with a space */ + if ( s != face->style_name ) + *s++ = ' '; + + ft_memcpy( s, src, len ); + + /* need to convert spaces to dashes for */ + /* add_style_name and setwidth_name */ + if ( nn == 0 || nn == 3 ) + { + int mm; + + + for ( mm = 0; mm < len; mm++ ) + if ( s[mm] == ' ' ) + s[mm] = '-'; + } + + s += len; + } + *s = 0; + } + + return error; + } + + + FT_CALLBACK_DEF( void ) + BDF_Face_Done( FT_Face bdfface ) /* BDF_Face */ + { + BDF_Face face = (BDF_Face)bdfface; + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + bdf_free_font( face->bdffont ); + + FT_FREE( face->en_table ); + + FT_FREE( face->charset_encoding ); + FT_FREE( face->charset_registry ); + FT_FREE( bdfface->family_name ); + FT_FREE( bdfface->style_name ); + + FT_FREE( bdfface->available_sizes ); + + FT_FREE( face->bdffont ); + + FT_TRACE4(( "BDF_Face_Done: done face\n" )); + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Face_Init( FT_Stream stream, + FT_Face bdfface, /* BDF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error = BDF_Err_Ok; + BDF_Face face = (BDF_Face)bdfface; + FT_Memory memory = FT_FACE_MEMORY( face ); + + bdf_font_t* font = NULL; + bdf_options_t options; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( face_index ); + + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + options.correct_metrics = 1; /* FZ XXX: options semantics */ + options.keep_unencoded = 1; + options.keep_comments = 0; + options.font_spacing = BDF_PROPORTIONAL; + + error = bdf_load_font( stream, memory, &options, &font ); + if ( error == BDF_Err_Missing_Startfont_Field ) + { + FT_TRACE2(( "[not a valid BDF file]\n" )); + goto Fail; + } + else if ( error ) + goto Exit; + + /* we have a bdf font: let's construct the face object */ + face->bdffont = font; + { + bdf_property_t* prop = NULL; + + + FT_TRACE4(( "number of glyphs: %d (%d)\n", + font->glyphs_size, + font->glyphs_used )); + FT_TRACE4(( "number of unencoded glyphs: %d (%d)\n", + font->unencoded_size, + font->unencoded_used )); + + bdfface->num_faces = 1; + bdfface->face_index = 0; + bdfface->face_flags = FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_FAST_GLYPHS; + + prop = bdf_get_font_property( font, "SPACING" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' || + *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) ) + bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */ + /* FZ XXX: I need a font to implement this */ + + prop = bdf_get_font_property( font, "FAMILY_NAME" ); + if ( prop && prop->value.atom ) + { + if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) ) + goto Exit; + } + else + bdfface->family_name = 0; + + if ( ( error = bdf_interpret_style( face ) ) != 0 ) + goto Exit; + + /* the number of glyphs (with one slot for the undefined glyph */ + /* at position 0 and all unencoded glyphs) */ + bdfface->num_glyphs = font->glyphs_size + 1; + + bdfface->num_fixed_sizes = 1; + if ( FT_NEW_ARRAY( bdfface->available_sizes, 1 ) ) + goto Exit; + + { + FT_Bitmap_Size* bsize = bdfface->available_sizes; + FT_Short resolution_x = 0, resolution_y = 0; + + + FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); + + bsize->height = (FT_Short)( font->font_ascent + font->font_descent ); + + prop = bdf_get_font_property( font, "AVERAGE_WIDTH" ); + if ( prop ) + bsize->width = (FT_Short)( ( prop->value.int32 + 5 ) / 10 ); + else + bsize->width = (FT_Short)( bsize->height * 2/3 ); + + prop = bdf_get_font_property( font, "POINT_SIZE" ); + if ( prop ) + /* convert from 722.7 decipoints to 72 points per inch */ + bsize->size = + (FT_Pos)( ( prop->value.int32 * 64 * 7200 + 36135L ) / 72270L ); + else + bsize->size = bsize->width << 6; + + prop = bdf_get_font_property( font, "PIXEL_SIZE" ); + if ( prop ) + bsize->y_ppem = (FT_Short)prop->value.int32 << 6; + + prop = bdf_get_font_property( font, "RESOLUTION_X" ); + if ( prop ) + resolution_x = (FT_Short)prop->value.int32; + + prop = bdf_get_font_property( font, "RESOLUTION_Y" ); + if ( prop ) + resolution_y = (FT_Short)prop->value.int32; + + if ( bsize->y_ppem == 0 ) + { + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = bsize->y_ppem * resolution_y / 72; + } + if ( resolution_x && resolution_y ) + bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; + else + bsize->x_ppem = bsize->y_ppem; + } + + /* encoding table */ + { + bdf_glyph_t* cur = font->glyphs; + unsigned long n; + + + if ( FT_NEW_ARRAY( face->en_table, font->glyphs_size ) ) + goto Exit; + + face->default_glyph = 0; + for ( n = 0; n < font->glyphs_size; n++ ) + { + (face->en_table[n]).enc = cur[n].encoding; + FT_TRACE4(( "idx %d, val 0x%lX\n", n, cur[n].encoding )); + (face->en_table[n]).glyph = (FT_Short)n; + + if ( cur[n].encoding == font->default_char ) + face->default_glyph = n; + } + } + + /* charmaps */ + { + bdf_property_t *charset_registry = 0, *charset_encoding = 0; + FT_Bool unicode_charmap = 0; + + + charset_registry = + bdf_get_font_property( font, "CHARSET_REGISTRY" ); + charset_encoding = + bdf_get_font_property( font, "CHARSET_ENCODING" ); + if ( charset_registry && charset_encoding ) + { + if ( charset_registry->format == BDF_ATOM && + charset_encoding->format == BDF_ATOM && + charset_registry->value.atom && + charset_encoding->value.atom ) + { + const char* s; + + + if ( FT_STRDUP( face->charset_encoding, + charset_encoding->value.atom ) || + FT_STRDUP( face->charset_registry, + charset_registry->value.atom ) ) + goto Exit; + + /* Uh, oh, compare first letters manually to avoid dependency */ + /* on locales. */ + s = face->charset_registry; + if ( ( s[0] == 'i' || s[0] == 'I' ) && + ( s[1] == 's' || s[1] == 'S' ) && + ( s[2] == 'o' || s[2] == 'O' ) ) + { + s += 3; + if ( !ft_strcmp( s, "10646" ) || + ( !ft_strcmp( s, "8859" ) && + !ft_strcmp( face->charset_encoding, "1" ) ) ) + unicode_charmap = 1; + } + + { + FT_CharMapRec charmap; + + + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; + charmap.platform_id = 0; + charmap.encoding_id = 0; + + if ( unicode_charmap ) + { + charmap.encoding = FT_ENCODING_UNICODE; + charmap.platform_id = 3; + charmap.encoding_id = 1; + } + + error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if ( bdfface->num_charmaps ) + bdfface->charmap = bdfface->charmaps[0]; +#endif + } + + goto Exit; + } + } + + /* otherwise assume Adobe standard encoding */ + + { + FT_CharMapRec charmap; + + + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.platform_id = 7; + charmap.encoding_id = 0; + + error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); + + /* Select default charmap */ + if ( bdfface->num_charmaps ) + bdfface->charmap = bdfface->charmaps[0]; + } + } + } + + Exit: + return error; + + Fail: + BDF_Face_Done( bdfface ); + return BDF_Err_Unknown_File_Format; + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Size_Select( FT_Size size, + FT_ULong strike_index ) + { + bdf_font_t* bdffont = ( (BDF_Face)size->face )->bdffont; + + + FT_Select_Metrics( size->face, strike_index ); + + size->metrics.ascender = bdffont->font_ascent << 6; + size->metrics.descender = -bdffont->font_descent << 6; + size->metrics.max_advance = bdffont->bbx.width << 6; + + return BDF_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Size_Request( FT_Size size, + FT_Size_Request req ) + { + FT_Face face = size->face; + FT_Bitmap_Size* bsize = face->available_sizes; + bdf_font_t* bdffont = ( (BDF_Face)face )->bdffont; + FT_Error error = BDF_Err_Invalid_Pixel_Size; + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = BDF_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == ( bdffont->font_ascent + + bdffont->font_descent ) ) + error = BDF_Err_Ok; + break; + + default: + error = BDF_Err_Unimplemented_Feature; + break; + } + + if ( error ) + return error; + else + return BDF_Size_Select( size, 0 ); + } + + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Glyph_Load( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + BDF_Face bdf = (BDF_Face)FT_SIZE_FACE( size ); + FT_Face face = FT_FACE( bdf ); + FT_Error error = BDF_Err_Ok; + FT_Bitmap* bitmap = &slot->bitmap; + bdf_glyph_t glyph; + int bpp = bdf->bdffont->bpp; + + FT_UNUSED( load_flags ); + + + if ( !face || glyph_index >= (FT_UInt)face->num_glyphs ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + /* index 0 is the undefined glyph */ + if ( glyph_index == 0 ) + glyph_index = bdf->default_glyph; + else + glyph_index--; + + /* slot, bitmap => freetype, glyph => bdflib */ + glyph = bdf->bdffont->glyphs[glyph_index]; + + bitmap->rows = glyph.bbx.height; + bitmap->width = glyph.bbx.width; + bitmap->pitch = glyph.bpr; + + /* note: we don't allocate a new array to hold the bitmap; */ + /* we can simply point to it */ + ft_glyphslot_set_bitmap( slot, glyph.bitmap ); + + switch ( bpp ) + { + case 1: + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + break; + case 2: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY2; + break; + case 4: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY4; + break; + case 8: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + break; + } + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = glyph.bbx.x_offset; + slot->bitmap_top = glyph.bbx.ascent; + + slot->metrics.horiAdvance = glyph.dwidth << 6; + slot->metrics.horiBearingX = glyph.bbx.x_offset << 6; + slot->metrics.horiBearingY = glyph.bbx.ascent << 6; + slot->metrics.width = bitmap->width << 6; + slot->metrics.height = bitmap->rows << 6; + + /* + * XXX DWIDTH1 and VVECTOR should be parsed and + * used here, provided such fonts do exist. + */ + ft_synthesize_vertical_metrics( &slot->metrics, + bdf->bdffont->bbx.height << 6 ); + + Exit: + return error; + } + + + /* + * + * BDF SERVICE + * + */ + + static FT_Error + bdf_get_bdf_property( BDF_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + bdf_property_t* prop; + + + FT_ASSERT( face && face->bdffont ); + + prop = bdf_get_font_property( face->bdffont, prop_name ); + if ( prop ) + { + switch ( prop->format ) + { + case BDF_ATOM: + aproperty->type = BDF_PROPERTY_TYPE_ATOM; + aproperty->u.atom = prop->value.atom; + break; + + case BDF_INTEGER: + aproperty->type = BDF_PROPERTY_TYPE_INTEGER; + aproperty->u.integer = prop->value.int32; + break; + + case BDF_CARDINAL: + aproperty->type = BDF_PROPERTY_TYPE_CARDINAL; + aproperty->u.cardinal = prop->value.card32; + break; + + default: + goto Fail; + } + return 0; + } + + Fail: + return BDF_Err_Invalid_Argument; + } + + + static FT_Error + bdf_get_charset_id( BDF_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + *acharset_encoding = face->charset_encoding; + *acharset_registry = face->charset_registry; + + return 0; + } + + + static const FT_Service_BDFRec bdf_service_bdf = + { + (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id, + (FT_BDF_GetPropertyFunc) bdf_get_bdf_property + }; + + + /* + * + * SERVICES LIST + * + */ + + static const FT_ServiceDescRec bdf_services[] = + { + { FT_SERVICE_ID_BDF, &bdf_service_bdf }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_BDF }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + bdf_driver_requester( FT_Module module, + const char* name ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( bdf_services, name ); + } + + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec bdf_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + sizeof ( FT_DriverRec ), + + "bdf", + 0x10000L, + 0x20000L, + + 0, + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) bdf_driver_requester + }, + + sizeof ( BDF_FaceRec ), + sizeof ( FT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + BDF_Face_Init, + BDF_Face_Done, + 0, /* FT_Size_InitFunc */ + 0, /* FT_Size_DoneFunc */ + 0, /* FT_Slot_InitFunc */ + 0, /* FT_Slot_DoneFunc */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + BDF_Glyph_Load, + + 0, /* FT_Face_GetKerningFunc */ + 0, /* FT_Face_AttachFunc */ + 0, /* FT_Face_GetAdvancesFunc */ + + BDF_Size_Request, + BDF_Size_Select + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/bdf/bdfdrivr.h b/src/3rdparty/freetype/src/bdf/bdfdrivr.h new file mode 100644 index 0000000000..86f40ee4af --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/bdfdrivr.h @@ -0,0 +1,76 @@ +/* bdfdrivr.h + + FreeType font driver for bdf fonts + + Copyright (C) 2001, 2002, 2003, 2004 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __BDFDRIVR_H__ +#define __BDFDRIVR_H__ + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + +#include "bdf.h" + + +FT_BEGIN_HEADER + + + typedef struct BDF_encoding_el_ + { + FT_ULong enc; + FT_UShort glyph; + + } BDF_encoding_el; + + + typedef struct BDF_FaceRec_ + { + FT_FaceRec root; + + char* charset_encoding; + char* charset_registry; + + bdf_font_t* bdffont; + + BDF_encoding_el* en_table; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + FT_UInt default_glyph; + + } BDF_FaceRec, *BDF_Face; + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) bdf_driver_class; + + +FT_END_HEADER + + +#endif /* __BDFDRIVR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/bdf/bdferror.h b/src/3rdparty/freetype/src/bdf/bdferror.h new file mode 100644 index 0000000000..b27fa333bb --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/bdferror.h @@ -0,0 +1,44 @@ +/* + * Copyright 2001, 2002 Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /*************************************************************************/ + /* */ + /* This file is used to define the BDF error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __BDFERROR_H__ +#define __BDFERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX BDF_Err_ +#define FT_ERR_BASE FT_Mod_Err_BDF + +#include FT_ERRORS_H + +#endif /* __BDFERROR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/bdf/bdflib.c b/src/3rdparty/freetype/src/bdf/bdflib.c new file mode 100644 index 0000000000..5435b20e69 --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/bdflib.c @@ -0,0 +1,2479 @@ +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 + * Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /*************************************************************************/ + /* */ + /* This file is based on bdf.c,v 1.22 2000/03/16 20:08:50 */ + /* */ + /* taken from Mark Leisher's xmbdfed package */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> + +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H + +#include "bdf.h" +#include "bdferror.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_bdflib + + + /*************************************************************************/ + /* */ + /* Default BDF font options. */ + /* */ + /*************************************************************************/ + + + static const bdf_options_t _bdf_opts = + { + 1, /* Correct metrics. */ + 1, /* Preserve unencoded glyphs. */ + 0, /* Preserve comments. */ + BDF_PROPORTIONAL /* Default spacing. */ + }; + + + /*************************************************************************/ + /* */ + /* Builtin BDF font properties. */ + /* */ + /*************************************************************************/ + + /* List of most properties that might appear in a font. Doesn't include */ + /* the RAW_* and AXIS_* properties in X11R6 polymorphic fonts. */ + + static const bdf_property_t _bdf_properties[] = + { + { (char *)"ADD_STYLE_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { (char *)"CHARSET_COLLECTIONS", BDF_ATOM, 1, { 0 } }, + { (char *)"CHARSET_ENCODING", BDF_ATOM, 1, { 0 } }, + { (char *)"CHARSET_REGISTRY", BDF_ATOM, 1, { 0 } }, + { (char *)"COMMENT", BDF_ATOM, 1, { 0 } }, + { (char *)"COPYRIGHT", BDF_ATOM, 1, { 0 } }, + { (char *)"DEFAULT_CHAR", BDF_CARDINAL, 1, { 0 } }, + { (char *)"DESTINATION", BDF_CARDINAL, 1, { 0 } }, + { (char *)"DEVICE_FONT_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"END_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"FACE_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"FAMILY_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"FONT", BDF_ATOM, 1, { 0 } }, + { (char *)"FONTNAME_REGISTRY", BDF_ATOM, 1, { 0 } }, + { (char *)"FONT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"FONT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"FOUNDRY", BDF_ATOM, 1, { 0 } }, + { (char *)"FULL_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"ITALIC_ANGLE", BDF_INTEGER, 1, { 0 } }, + { (char *)"MAX_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"MIN_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"NORM_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"NOTICE", BDF_ATOM, 1, { 0 } }, + { (char *)"PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"POINT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_ASCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_DESCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_END_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_MAX_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_MIN_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_NORM_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_POINT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_PIXELSIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_POINTSIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_X_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RELATIVE_SETWIDTH", BDF_CARDINAL, 1, { 0 } }, + { (char *)"RELATIVE_WEIGHT", BDF_CARDINAL, 1, { 0 } }, + { (char *)"RESOLUTION", BDF_INTEGER, 1, { 0 } }, + { (char *)"RESOLUTION_X", BDF_CARDINAL, 1, { 0 } }, + { (char *)"RESOLUTION_Y", BDF_CARDINAL, 1, { 0 } }, + { (char *)"SETWIDTH_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"SLANT", BDF_ATOM, 1, { 0 } }, + { (char *)"SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"SPACING", BDF_ATOM, 1, { 0 } }, + { (char *)"STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { (char *)"UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, + { (char *)"UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, + { (char *)"WEIGHT", BDF_CARDINAL, 1, { 0 } }, + { (char *)"WEIGHT_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"X_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { (char *)"_MULE_BASELINE_OFFSET", BDF_INTEGER, 1, { 0 } }, + { (char *)"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } }, + }; + + static const unsigned long + _num_bdf_properties = sizeof ( _bdf_properties ) / + sizeof ( _bdf_properties[0] ); + + + /*************************************************************************/ + /* */ + /* Hash table utilities for the properties. */ + /* */ + /*************************************************************************/ + + /* XXX: Replace this with FreeType's hash functions */ + + +#define INITIAL_HT_SIZE 241 + + typedef void + (*hash_free_func)( hashnode node ); + + static hashnode* + hash_bucket( const char* key, + hashtable* ht ) + { + const char* kp = key; + unsigned long res = 0; + hashnode* bp = ht->table, *ndp; + + + /* Mocklisp hash function. */ + while ( *kp ) + res = ( res << 5 ) - res + *kp++; + + ndp = bp + ( res % ht->size ); + while ( *ndp ) + { + kp = (*ndp)->key; + if ( kp[0] == key[0] && ft_strcmp( kp, key ) == 0 ) + break; + ndp--; + if ( ndp < bp ) + ndp = bp + ( ht->size - 1 ); + } + + return ndp; + } + + + static FT_Error + hash_rehash( hashtable* ht, + FT_Memory memory ) + { + hashnode* obp = ht->table, *bp, *nbp; + int i, sz = ht->size; + FT_Error error = BDF_Err_Ok; + + + ht->size <<= 1; + ht->limit = ht->size / 3; + + if ( FT_NEW_ARRAY( ht->table, ht->size ) ) + goto Exit; + + for ( i = 0, bp = obp; i < sz; i++, bp++ ) + { + if ( *bp ) + { + nbp = hash_bucket( (*bp)->key, ht ); + *nbp = *bp; + } + } + FT_FREE( obp ); + + Exit: + return error; + } + + + static FT_Error + hash_init( hashtable* ht, + FT_Memory memory ) + { + int sz = INITIAL_HT_SIZE; + FT_Error error = BDF_Err_Ok; + + + ht->size = sz; + ht->limit = sz / 3; + ht->used = 0; + + if ( FT_NEW_ARRAY( ht->table, sz ) ) + goto Exit; + + Exit: + return error; + } + + + static void + hash_free( hashtable* ht, + FT_Memory memory ) + { + if ( ht != 0 ) + { + int i, sz = ht->size; + hashnode* bp = ht->table; + + + for ( i = 0; i < sz; i++, bp++ ) + FT_FREE( *bp ); + + FT_FREE( ht->table ); + } + } + + + static FT_Error + hash_insert( char* key, + void* data, + hashtable* ht, + FT_Memory memory ) + { + hashnode nn, *bp = hash_bucket( key, ht ); + FT_Error error = BDF_Err_Ok; + + + nn = *bp; + if ( !nn ) + { + if ( FT_NEW( nn ) ) + goto Exit; + *bp = nn; + + nn->key = key; + nn->data = data; + + if ( ht->used >= ht->limit ) + { + error = hash_rehash( ht, memory ); + if ( error ) + goto Exit; + } + ht->used++; + } + else + nn->data = data; + + Exit: + return error; + } + + + static hashnode + hash_lookup( const char* key, + hashtable* ht ) + { + hashnode *np = hash_bucket( key, ht ); + + + return *np; + } + + + /*************************************************************************/ + /* */ + /* Utility types and functions. */ + /* */ + /*************************************************************************/ + + + /* Function type for parsing lines of a BDF font. */ + + typedef FT_Error + (*_bdf_line_func_t)( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ); + + + /* List structure for splitting lines into fields. */ + + typedef struct _bdf_list_t_ + { + char** field; + unsigned long size; + unsigned long used; + FT_Memory memory; + + } _bdf_list_t; + + + /* Structure used while loading BDF fonts. */ + + typedef struct _bdf_parse_t_ + { + unsigned long flags; + unsigned long cnt; + unsigned long row; + + short minlb; + short maxlb; + short maxrb; + short maxas; + short maxds; + + short rbearing; + + char* glyph_name; + long glyph_enc; + + bdf_font_t* font; + bdf_options_t* opts; + + unsigned long have[2048]; + _bdf_list_t list; + + FT_Memory memory; + + } _bdf_parse_t; + + +#define setsbit( m, cc ) \ + ( m[(FT_Byte)(cc) >> 3] |= (FT_Byte)( 1 << ( (cc) & 7 ) ) ) +#define sbitset( m, cc ) \ + ( m[(FT_Byte)(cc) >> 3] & ( 1 << ( (cc) & 7 ) ) ) + + + static void + _bdf_list_init( _bdf_list_t* list, + FT_Memory memory ) + { + FT_ZERO( list ); + list->memory = memory; + } + + + static void + _bdf_list_done( _bdf_list_t* list ) + { + FT_Memory memory = list->memory; + + + if ( memory ) + { + FT_FREE( list->field ); + FT_ZERO( list ); + } + } + + + static FT_Error + _bdf_list_ensure( _bdf_list_t* list, + int num_items ) + { + FT_Error error = BDF_Err_Ok; + + + if ( num_items > (int)list->size ) + { + int oldsize = list->size; + int newsize = oldsize + ( oldsize >> 1 ) + 4; + int bigsize = FT_INT_MAX / sizeof ( char* ); + FT_Memory memory = list->memory; + + + if ( oldsize == bigsize ) + { + error = BDF_Err_Out_Of_Memory; + goto Exit; + } + else if ( newsize < oldsize || newsize > bigsize ) + newsize = bigsize; + + if ( FT_RENEW_ARRAY( list->field, oldsize, newsize ) ) + goto Exit; + + list->size = newsize; + } + + Exit: + return error; + } + + + static void + _bdf_list_shift( _bdf_list_t* list, + unsigned long n ) + { + unsigned long i, u; + + + if ( list == 0 || list->used == 0 || n == 0 ) + return; + + if ( n >= list->used ) + { + list->used = 0; + return; + } + + for ( u = n, i = 0; u < list->used; i++, u++ ) + list->field[i] = list->field[u]; + list->used -= n; + } + + + static char * + _bdf_list_join( _bdf_list_t* list, + int c, + unsigned long *alen ) + { + unsigned long i, j; + char *fp, *dp; + + + *alen = 0; + + if ( list == 0 || list->used == 0 ) + return 0; + + dp = list->field[0]; + for ( i = j = 0; i < list->used; i++ ) + { + fp = list->field[i]; + while ( *fp ) + dp[j++] = *fp++; + + if ( i + 1 < list->used ) + dp[j++] = (char)c; + } + dp[j] = 0; + + *alen = j; + return dp; + } + + + /* An empty string for empty fields. */ + + static const char empty[1] = { 0 }; /* XXX eliminate this */ + + + static FT_Error + _bdf_list_split( _bdf_list_t* list, + char* separators, + char* line, + unsigned long linelen ) + { + int mult, final_empty; + char *sp, *ep, *end; + char seps[32]; + FT_Error error = BDF_Err_Ok; + + + /* Initialize the list. */ + list->used = 0; + + /* If the line is empty, then simply return. */ + if ( linelen == 0 || line[0] == 0 ) + goto Exit; + + /* In the original code, if the `separators' parameter is NULL or */ + /* empty, the list is split into individual bytes. We don't need */ + /* this, so an error is signaled. */ + if ( separators == 0 || *separators == 0 ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + /* Prepare the separator bitmap. */ + FT_MEM_ZERO( seps, 32 ); + + /* If the very last character of the separator string is a plus, then */ + /* set the `mult' flag to indicate that multiple separators should be */ + /* collapsed into one. */ + for ( mult = 0, sp = separators; sp && *sp; sp++ ) + { + if ( *sp == '+' && *( sp + 1 ) == 0 ) + mult = 1; + else + setsbit( seps, *sp ); + } + + /* Break the line up into fields. */ + for ( final_empty = 0, sp = ep = line, end = sp + linelen; + sp < end && *sp; ) + { + /* Collect everything that is not a separator. */ + for ( ; *ep && !sbitset( seps, *ep ); ep++ ) + ; + + /* Resize the list if necessary. */ + if ( list->used == list->size ) + { + error = _bdf_list_ensure( list, list->used + 1 ); + if ( error ) + goto Exit; + } + + /* Assign the field appropriately. */ + list->field[list->used++] = ( ep > sp ) ? sp : (char*)empty; + + sp = ep; + + if ( mult ) + { + /* If multiple separators should be collapsed, do it now by */ + /* setting all the separator characters to 0. */ + for ( ; *ep && sbitset( seps, *ep ); ep++ ) + *ep = 0; + } + else if ( *ep != 0 ) + /* Don't collapse multiple separators by making them 0, so just */ + /* make the one encountered 0. */ + *ep++ = 0; + + final_empty = ( ep > sp && *ep == 0 ); + sp = ep; + } + + /* Finally, NULL-terminate the list. */ + if ( list->used + final_empty >= list->size ) + { + error = _bdf_list_ensure( list, list->used + final_empty + 1 ); + if ( error ) + goto Exit; + } + + if ( final_empty ) + list->field[list->used++] = (char*)empty; + + list->field[list->used] = 0; + + Exit: + return error; + } + + +#define NO_SKIP 256 /* this value cannot be stored in a 'char' */ + + + static FT_Error + _bdf_readstream( FT_Stream stream, + _bdf_line_func_t callback, + void* client_data, + unsigned long *lno ) + { + _bdf_line_func_t cb; + unsigned long lineno, buf_size; + int refill, bytes, hold, to_skip; + int start, end, cursor, avail; + char* buf = 0; + FT_Memory memory = stream->memory; + FT_Error error = BDF_Err_Ok; + + + if ( callback == 0 ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + /* initial size and allocation of the input buffer */ + buf_size = 1024; + + if ( FT_NEW_ARRAY( buf, buf_size ) ) + goto Exit; + + cb = callback; + lineno = 1; + buf[0] = 0; + start = 0; + end = 0; + avail = 0; + cursor = 0; + refill = 1; + to_skip = NO_SKIP; + bytes = 0; /* make compiler happy */ + + for (;;) + { + if ( refill ) + { + bytes = (int)FT_Stream_TryRead( stream, (FT_Byte*)buf + cursor, + (FT_ULong)(buf_size - cursor) ); + avail = cursor + bytes; + cursor = 0; + refill = 0; + } + + end = start; + + /* should we skip an optional character like \n or \r? */ + if ( start < avail && buf[start] == to_skip ) + { + start += 1; + to_skip = NO_SKIP; + continue; + } + + /* try to find the end of the line */ + while ( end < avail && buf[end] != '\n' && buf[end] != '\r' ) + end++; + + /* if we hit the end of the buffer, try shifting its content */ + /* or even resizing it */ + if ( end >= avail ) + { + if ( bytes == 0 ) /* last line in file doesn't end in \r or \n */ + break; /* ignore it then exit */ + + if ( start == 0 ) + { + /* this line is definitely too long; try resizing the input */ + /* buffer a bit to handle it. */ + FT_ULong new_size; + + + if ( buf_size >= 65536UL ) /* limit ourselves to 64KByte */ + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + new_size = buf_size * 2; + if ( FT_RENEW_ARRAY( buf, buf_size, new_size ) ) + goto Exit; + + cursor = buf_size; + buf_size = new_size; + } + else + { + bytes = avail - start; + + FT_MEM_COPY( buf, buf + start, bytes ); + + cursor = bytes; + avail -= bytes; + start = 0; + } + refill = 1; + continue; + } + + /* Temporarily NUL-terminate the line. */ + hold = buf[end]; + buf[end] = 0; + + /* XXX: Use encoding independent value for 0x1a */ + if ( buf[start] != '#' && buf[start] != 0x1a && end > start ) + { + error = (*cb)( buf + start, end - start, lineno, + (void*)&cb, client_data ); + if ( error ) + break; + } + + lineno += 1; + buf[end] = (char)hold; + start = end + 1; + + if ( hold == '\n' ) + to_skip = '\r'; + else if ( hold == '\r' ) + to_skip = '\n'; + else + to_skip = NO_SKIP; + } + + *lno = lineno; + + Exit: + FT_FREE( buf ); + return error; + } + + + /* XXX: make this work with EBCDIC also */ + + static const unsigned char a2i[128] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + static const unsigned char odigits[32] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + static const unsigned char ddigits[32] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + static const unsigned char hdigits[32] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + +#define isdigok( m, d ) (m[(d) >> 3] & ( 1 << ( (d) & 7 ) ) ) + + + /* Routine to convert an ASCII string into an unsigned long integer. */ + static unsigned long + _bdf_atoul( char* s, + char** end, + int base ) + { + unsigned long v; + const unsigned char* dmap; + + + if ( s == 0 || *s == 0 ) + return 0; + + /* Make sure the radix is something recognizable. Default to 10. */ + switch ( base ) + { + case 8: + dmap = odigits; + break; + case 16: + dmap = hdigits; + break; + default: + base = 10; + dmap = ddigits; + break; + } + + /* Check for the special hex prefix. */ + if ( *s == '0' && + ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) + { + base = 16; + dmap = hdigits; + s += 2; + } + + for ( v = 0; isdigok( dmap, *s ); s++ ) + v = v * base + a2i[(int)*s]; + + if ( end != 0 ) + *end = s; + + return v; + } + + + /* Routine to convert an ASCII string into an signed long integer. */ + static long + _bdf_atol( char* s, + char** end, + int base ) + { + long v, neg; + const unsigned char* dmap; + + + if ( s == 0 || *s == 0 ) + return 0; + + /* Make sure the radix is something recognizable. Default to 10. */ + switch ( base ) + { + case 8: + dmap = odigits; + break; + case 16: + dmap = hdigits; + break; + default: + base = 10; + dmap = ddigits; + break; + } + + /* Check for a minus sign. */ + neg = 0; + if ( *s == '-' ) + { + s++; + neg = 1; + } + + /* Check for the special hex prefix. */ + if ( *s == '0' && + ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) + { + base = 16; + dmap = hdigits; + s += 2; + } + + for ( v = 0; isdigok( dmap, *s ); s++ ) + v = v * base + a2i[(int)*s]; + + if ( end != 0 ) + *end = s; + + return ( !neg ) ? v : -v; + } + + + /* Routine to convert an ASCII string into an signed short integer. */ + static short + _bdf_atos( char* s, + char** end, + int base ) + { + short v, neg; + const unsigned char* dmap; + + + if ( s == 0 || *s == 0 ) + return 0; + + /* Make sure the radix is something recognizable. Default to 10. */ + switch ( base ) + { + case 8: + dmap = odigits; + break; + case 16: + dmap = hdigits; + break; + default: + base = 10; + dmap = ddigits; + break; + } + + /* Check for a minus. */ + neg = 0; + if ( *s == '-' ) + { + s++; + neg = 1; + } + + /* Check for the special hex prefix. */ + if ( *s == '0' && + ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) + { + base = 16; + dmap = hdigits; + s += 2; + } + + for ( v = 0; isdigok( dmap, *s ); s++ ) + v = (short)( v * base + a2i[(int)*s] ); + + if ( end != 0 ) + *end = s; + + return (short)( ( !neg ) ? v : -v ); + } + + + /* Routine to compare two glyphs by encoding so they can be sorted. */ + static int + by_encoding( const void* a, + const void* b ) + { + bdf_glyph_t *c1, *c2; + + + c1 = (bdf_glyph_t *)a; + c2 = (bdf_glyph_t *)b; + + if ( c1->encoding < c2->encoding ) + return -1; + + if ( c1->encoding > c2->encoding ) + return 1; + + return 0; + } + + + static FT_Error + bdf_create_property( char* name, + int format, + bdf_font_t* font ) + { + unsigned long n; + bdf_property_t* p; + FT_Memory memory = font->memory; + FT_Error error = BDF_Err_Ok; + + + /* First check to see if the property has */ + /* already been added or not. If it has, then */ + /* simply ignore it. */ + if ( hash_lookup( name, &(font->proptbl) ) ) + goto Exit; + + if ( FT_RENEW_ARRAY( font->user_props, + font->nuser_props, + font->nuser_props + 1 ) ) + goto Exit; + + p = font->user_props + font->nuser_props; + FT_ZERO( p ); + + n = (unsigned long)( ft_strlen( name ) + 1 ); + + if ( FT_NEW_ARRAY( p->name, n ) ) + goto Exit; + + FT_MEM_COPY( (char *)p->name, name, n ); + + p->format = format; + p->builtin = 0; + + n = _num_bdf_properties + font->nuser_props; + + error = hash_insert( p->name, (void *)n, &(font->proptbl), memory ); + if ( error ) + goto Exit; + + font->nuser_props++; + + Exit: + return error; + } + + + FT_LOCAL_DEF( bdf_property_t * ) + bdf_get_property( char* name, + bdf_font_t* font ) + { + hashnode hn; + unsigned long propid; + + + if ( name == 0 || *name == 0 ) + return 0; + + if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 ) + return 0; + + propid = (unsigned long)hn->data; + if ( propid >= _num_bdf_properties ) + return font->user_props + ( propid - _num_bdf_properties ); + + return (bdf_property_t*)_bdf_properties + propid; + } + + + /*************************************************************************/ + /* */ + /* BDF font file parsing flags and functions. */ + /* */ + /*************************************************************************/ + + + /* Parse flags. */ + +#define _BDF_START 0x0001 +#define _BDF_FONT_NAME 0x0002 +#define _BDF_SIZE 0x0004 +#define _BDF_FONT_BBX 0x0008 +#define _BDF_PROPS 0x0010 +#define _BDF_GLYPHS 0x0020 +#define _BDF_GLYPH 0x0040 +#define _BDF_ENCODING 0x0080 +#define _BDF_SWIDTH 0x0100 +#define _BDF_DWIDTH 0x0200 +#define _BDF_BBX 0x0400 +#define _BDF_BITMAP 0x0800 + +#define _BDF_SWIDTH_ADJ 0x1000 + +#define _BDF_GLYPH_BITS ( _BDF_GLYPH | \ + _BDF_ENCODING | \ + _BDF_SWIDTH | \ + _BDF_DWIDTH | \ + _BDF_BBX | \ + _BDF_BITMAP ) + +#define _BDF_GLYPH_WIDTH_CHECK 0x40000000UL +#define _BDF_GLYPH_HEIGHT_CHECK 0x80000000UL + + + /* Auto correction messages. */ +#define ACMSG1 "FONT_ASCENT property missing. " \ + "Added \"FONT_ASCENT %hd\".\n" +#define ACMSG2 "FONT_DESCENT property missing. " \ + "Added \"FONT_DESCENT %hd\".\n" +#define ACMSG3 "Font width != actual width. Old: %hd New: %hd.\n" +#define ACMSG4 "Font left bearing != actual left bearing. " \ + "Old: %hd New: %hd.\n" +#define ACMSG5 "Font ascent != actual ascent. Old: %hd New: %hd.\n" +#define ACMSG6 "Font descent != actual descent. Old: %hd New: %hd.\n" +#define ACMSG7 "Font height != actual height. Old: %hd New: %hd.\n" +#define ACMSG8 "Glyph scalable width (SWIDTH) adjustments made.\n" +#define ACMSG9 "SWIDTH field missing at line %ld. Set automatically.\n" +#define ACMSG10 "DWIDTH field missing at line %ld. Set to glyph width.\n" +#define ACMSG11 "SIZE bits per pixel field adjusted to %hd.\n" +#define ACMSG12 "Duplicate encoding %ld (%s) changed to unencoded.\n" +#define ACMSG13 "Glyph %ld extra rows removed.\n" +#define ACMSG14 "Glyph %ld extra columns removed.\n" +#define ACMSG15 "Incorrect glyph count: %ld indicated but %ld found.\n" + + /* Error messages. */ +#define ERRMSG1 "[line %ld] Missing \"%s\" line.\n" +#define ERRMSG2 "[line %ld] Font header corrupted or missing fields.\n" +#define ERRMSG3 "[line %ld] Font glyphs corrupted or missing fields.\n" +#define ERRMSG4 "[line %ld] BBX too big.\n" + + + static FT_Error + _bdf_add_comment( bdf_font_t* font, + char* comment, + unsigned long len ) + { + char* cp; + FT_Memory memory = font->memory; + FT_Error error = BDF_Err_Ok; + + + if ( FT_RENEW_ARRAY( font->comments, + font->comments_len, + font->comments_len + len + 1 ) ) + goto Exit; + + cp = font->comments + font->comments_len; + + FT_MEM_COPY( cp, comment, len ); + cp[len] = '\n'; + + font->comments_len += len + 1; + + Exit: + return error; + } + + + /* Set the spacing from the font name if it exists, or set it to the */ + /* default specified in the options. */ + static FT_Error + _bdf_set_default_spacing( bdf_font_t* font, + bdf_options_t* opts ) + { + unsigned long len; + char name[256]; + _bdf_list_t list; + FT_Memory memory; + FT_Error error = BDF_Err_Ok; + + + if ( font == 0 || font->name == 0 || font->name[0] == 0 ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + memory = font->memory; + + _bdf_list_init( &list, memory ); + + font->spacing = opts->font_spacing; + + len = (unsigned long)( ft_strlen( font->name ) + 1 ); + /* Limit ourselves to 256 characters in the font name. */ + if ( len >= 256 ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + FT_MEM_COPY( name, font->name, len ); + + error = _bdf_list_split( &list, (char *)"-", name, len ); + if ( error ) + goto Fail; + + if ( list.used == 15 ) + { + switch ( list.field[11][0] ) + { + case 'C': + case 'c': + font->spacing = BDF_CHARCELL; + break; + case 'M': + case 'm': + font->spacing = BDF_MONOWIDTH; + break; + case 'P': + case 'p': + font->spacing = BDF_PROPORTIONAL; + break; + } + } + + Fail: + _bdf_list_done( &list ); + + Exit: + return error; + } + + + /* Determine whether the property is an atom or not. If it is, then */ + /* clean it up so the double quotes are removed if they exist. */ + static int + _bdf_is_atom( char* line, + unsigned long linelen, + char** name, + char** value, + bdf_font_t* font ) + { + int hold; + char *sp, *ep; + bdf_property_t* p; + + + *name = sp = ep = line; + + while ( *ep && *ep != ' ' && *ep != '\t' ) + ep++; + + hold = -1; + if ( *ep ) + { + hold = *ep; + *ep = 0; + } + + p = bdf_get_property( sp, font ); + + /* Restore the character that was saved before any return can happen. */ + if ( hold != -1 ) + *ep = (char)hold; + + /* If the property exists and is not an atom, just return here. */ + if ( p && p->format != BDF_ATOM ) + return 0; + + /* The property is an atom. Trim all leading and trailing whitespace */ + /* and double quotes for the atom value. */ + sp = ep; + ep = line + linelen; + + /* Trim the leading whitespace if it exists. */ + *sp++ = 0; + while ( *sp && + ( *sp == ' ' || *sp == '\t' ) ) + sp++; + + /* Trim the leading double quote if it exists. */ + if ( *sp == '"' ) + sp++; + *value = sp; + + /* Trim the trailing whitespace if it exists. */ + while ( ep > sp && + ( *( ep - 1 ) == ' ' || *( ep - 1 ) == '\t' ) ) + *--ep = 0; + + /* Trim the trailing double quote if it exists. */ + if ( ep > sp && *( ep - 1 ) == '"' ) + *--ep = 0; + + return 1; + } + + + static FT_Error + _bdf_add_property( bdf_font_t* font, + char* name, + char* value ) + { + unsigned long propid; + hashnode hn; + bdf_property_t *prop, *fp; + FT_Memory memory = font->memory; + FT_Error error = BDF_Err_Ok; + + + /* First, check to see if the property already exists in the font. */ + if ( ( hn = hash_lookup( name, (hashtable *)font->internal ) ) != 0 ) + { + /* The property already exists in the font, so simply replace */ + /* the value of the property with the current value. */ + fp = font->props + (unsigned long)hn->data; + + switch ( fp->format ) + { + case BDF_ATOM: + /* Delete the current atom if it exists. */ + FT_FREE( fp->value.atom ); + + if ( value && value[0] != 0 ) + { + if ( FT_STRDUP( fp->value.atom, value ) ) + goto Exit; + } + break; + + case BDF_INTEGER: + fp->value.int32 = _bdf_atol( value, 0, 10 ); + break; + + case BDF_CARDINAL: + fp->value.card32 = _bdf_atoul( value, 0, 10 ); + break; + + default: + ; + } + + goto Exit; + } + + /* See whether this property type exists yet or not. */ + /* If not, create it. */ + hn = hash_lookup( name, &(font->proptbl) ); + if ( hn == 0 ) + { + error = bdf_create_property( name, BDF_ATOM, font ); + if ( error ) + goto Exit; + hn = hash_lookup( name, &(font->proptbl) ); + } + + /* Allocate another property if this is overflow. */ + if ( font->props_used == font->props_size ) + { + if ( font->props_size == 0 ) + { + if ( FT_NEW_ARRAY( font->props, 1 ) ) + goto Exit; + } + else + { + if ( FT_RENEW_ARRAY( font->props, + font->props_size, + font->props_size + 1 ) ) + goto Exit; + } + + fp = font->props + font->props_size; + FT_MEM_ZERO( fp, sizeof ( bdf_property_t ) ); + font->props_size++; + } + + propid = (unsigned long)hn->data; + if ( propid >= _num_bdf_properties ) + prop = font->user_props + ( propid - _num_bdf_properties ); + else + prop = (bdf_property_t*)_bdf_properties + propid; + + fp = font->props + font->props_used; + + fp->name = prop->name; + fp->format = prop->format; + fp->builtin = prop->builtin; + + switch ( prop->format ) + { + case BDF_ATOM: + fp->value.atom = 0; + if ( value != 0 && value[0] ) + { + if ( FT_STRDUP( fp->value.atom, value ) ) + goto Exit; + } + break; + + case BDF_INTEGER: + fp->value.int32 = _bdf_atol( value, 0, 10 ); + break; + + case BDF_CARDINAL: + fp->value.card32 = _bdf_atoul( value, 0, 10 ); + break; + } + + /* If the property happens to be a comment, then it doesn't need */ + /* to be added to the internal hash table. */ + if ( ft_memcmp( name, "COMMENT", 7 ) != 0 ) { + /* Add the property to the font property table. */ + error = hash_insert( fp->name, + (void *)font->props_used, + (hashtable *)font->internal, + memory ); + if ( error ) + goto Exit; + } + + font->props_used++; + + /* Some special cases need to be handled here. The DEFAULT_CHAR */ + /* property needs to be located if it exists in the property list, the */ + /* FONT_ASCENT and FONT_DESCENT need to be assigned if they are */ + /* present, and the SPACING property should override the default */ + /* spacing. */ + if ( ft_memcmp( name, "DEFAULT_CHAR", 12 ) == 0 ) + font->default_char = fp->value.int32; + else if ( ft_memcmp( name, "FONT_ASCENT", 11 ) == 0 ) + font->font_ascent = fp->value.int32; + else if ( ft_memcmp( name, "FONT_DESCENT", 12 ) == 0 ) + font->font_descent = fp->value.int32; + else if ( ft_memcmp( name, "SPACING", 7 ) == 0 ) + { + if ( !fp->value.atom ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; + } + + if ( fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P' ) + font->spacing = BDF_PROPORTIONAL; + else if ( fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M' ) + font->spacing = BDF_MONOWIDTH; + else if ( fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C' ) + font->spacing = BDF_CHARCELL; + } + + Exit: + return error; + } + + + static const unsigned char nibble_mask[8] = + { + 0xFF, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE + }; + + + /* Actually parse the glyph info and bitmaps. */ + static FT_Error + _bdf_parse_glyphs( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + int c, mask_index; + char* s; + unsigned char* bp; + unsigned long i, slen, nibbles; + + _bdf_parse_t* p; + bdf_glyph_t* glyph; + bdf_font_t* font; + + FT_Memory memory; + FT_Error error = BDF_Err_Ok; + + FT_UNUSED( call_data ); + FT_UNUSED( lineno ); /* only used in debug mode */ + + + p = (_bdf_parse_t *)client_data; + + font = p->font; + memory = font->memory; + + /* Check for a comment. */ + if ( ft_memcmp( line, "COMMENT", 7 ) == 0 ) + { + linelen -= 7; + + s = line + 7; + if ( *s != 0 ) + { + s++; + linelen--; + } + error = _bdf_add_comment( p->font, s, linelen ); + goto Exit; + } + + /* The very first thing expected is the number of glyphs. */ + if ( !( p->flags & _BDF_GLYPHS ) ) + { + if ( ft_memcmp( line, "CHARS", 5 ) != 0 ) + { + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "CHARS" )); + error = BDF_Err_Missing_Chars_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1], 0, 10 ); + + /* Make sure the number of glyphs is non-zero. */ + if ( p->cnt == 0 ) + font->glyphs_size = 64; + + /* Limit ourselves to 1,114,112 glyphs in the font (this is the */ + /* number of code points available in Unicode). */ + if ( p->cnt >= 1114112UL ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) ) + goto Exit; + + p->flags |= _BDF_GLYPHS; + + goto Exit; + } + + /* Check for the ENDFONT field. */ + if ( ft_memcmp( line, "ENDFONT", 7 ) == 0 ) + { + /* Sort the glyphs by encoding. */ + ft_qsort( (char *)font->glyphs, + font->glyphs_used, + sizeof ( bdf_glyph_t ), + by_encoding ); + + p->flags &= ~_BDF_START; + + goto Exit; + } + + /* Check for the ENDCHAR field. */ + if ( ft_memcmp( line, "ENDCHAR", 7 ) == 0 ) + { + p->glyph_enc = 0; + p->flags &= ~_BDF_GLYPH_BITS; + + goto Exit; + } + + /* Check to see whether a glyph is being scanned but should be */ + /* ignored because it is an unencoded glyph. */ + if ( ( p->flags & _BDF_GLYPH ) && + p->glyph_enc == -1 && + p->opts->keep_unencoded == 0 ) + goto Exit; + + /* Check for the STARTCHAR field. */ + if ( ft_memcmp( line, "STARTCHAR", 9 ) == 0 ) + { + /* Set the character name in the parse info first until the */ + /* encoding can be checked for an unencoded character. */ + FT_FREE( p->glyph_name ); + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + _bdf_list_shift( &p->list, 1 ); + + s = _bdf_list_join( &p->list, ' ', &slen ); + + if ( !s ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_NEW_ARRAY( p->glyph_name, slen + 1 ) ) + goto Exit; + + FT_MEM_COPY( p->glyph_name, s, slen + 1 ); + + p->flags |= _BDF_GLYPH; + + goto Exit; + } + + /* Check for the ENCODING field. */ + if ( ft_memcmp( line, "ENCODING", 8 ) == 0 ) + { + if ( !( p->flags & _BDF_GLYPH ) ) + { + /* Missing STARTCHAR field. */ + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "STARTCHAR" )); + error = BDF_Err_Missing_Startchar_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 ); + + /* Check that the encoding is in the range [0,65536] because */ + /* otherwise p->have (a bitmap with static size) overflows. */ + if ( (size_t)p->glyph_enc >= sizeof ( p->have ) * 8 ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; + } + + /* Check to see whether this encoding has already been encountered. */ + /* If it has then change it to unencoded so it gets added if */ + /* indicated. */ + if ( p->glyph_enc >= 0 ) + { + if ( _bdf_glyph_modified( p->have, p->glyph_enc ) ) + { + /* Emit a message saying a glyph has been moved to the */ + /* unencoded area. */ + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG12, + p->glyph_enc, p->glyph_name )); + p->glyph_enc = -1; + font->modified = 1; + } + else + _bdf_set_glyph_modified( p->have, p->glyph_enc ); + } + + if ( p->glyph_enc >= 0 ) + { + /* Make sure there are enough glyphs allocated in case the */ + /* number of characters happen to be wrong. */ + if ( font->glyphs_used == font->glyphs_size ) + { + if ( FT_RENEW_ARRAY( font->glyphs, + font->glyphs_size, + font->glyphs_size + 64 ) ) + goto Exit; + + font->glyphs_size += 64; + } + + glyph = font->glyphs + font->glyphs_used++; + glyph->name = p->glyph_name; + glyph->encoding = p->glyph_enc; + + /* Reset the initial glyph info. */ + p->glyph_name = 0; + } + else + { + /* Unencoded glyph. Check to see whether it should */ + /* be added or not. */ + if ( p->opts->keep_unencoded != 0 ) + { + /* Allocate the next unencoded glyph. */ + if ( font->unencoded_used == font->unencoded_size ) + { + if ( FT_RENEW_ARRAY( font->unencoded , + font->unencoded_size, + font->unencoded_size + 4 ) ) + goto Exit; + + font->unencoded_size += 4; + } + + glyph = font->unencoded + font->unencoded_used; + glyph->name = p->glyph_name; + glyph->encoding = font->unencoded_used++; + } + else + /* Free up the glyph name if the unencoded shouldn't be */ + /* kept. */ + FT_FREE( p->glyph_name ); + + p->glyph_name = 0; + } + + /* Clear the flags that might be added when width and height are */ + /* checked for consistency. */ + p->flags &= ~( _BDF_GLYPH_WIDTH_CHECK | _BDF_GLYPH_HEIGHT_CHECK ); + + p->flags |= _BDF_ENCODING; + + goto Exit; + } + + /* Point at the glyph being constructed. */ + if ( p->glyph_enc == -1 ) + glyph = font->unencoded + ( font->unencoded_used - 1 ); + else + glyph = font->glyphs + ( font->glyphs_used - 1 ); + + /* Check to see whether a bitmap is being constructed. */ + if ( p->flags & _BDF_BITMAP ) + { + /* If there are more rows than are specified in the glyph metrics, */ + /* ignore the remaining lines. */ + if ( p->row >= (unsigned long)glyph->bbx.height ) + { + if ( !( p->flags & _BDF_GLYPH_HEIGHT_CHECK ) ) + { + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG13, glyph->encoding )); + p->flags |= _BDF_GLYPH_HEIGHT_CHECK; + font->modified = 1; + } + + goto Exit; + } + + /* Only collect the number of nibbles indicated by the glyph */ + /* metrics. If there are more columns, they are simply ignored. */ + nibbles = glyph->bpr << 1; + bp = glyph->bitmap + p->row * glyph->bpr; + + for ( i = 0; i < nibbles; i++ ) + { + c = line[i]; + *bp = (FT_Byte)( ( *bp << 4 ) + a2i[c] ); + if ( i + 1 < nibbles && ( i & 1 ) ) + *++bp = 0; + } + + /* Remove possible garbage at the right. */ + mask_index = ( glyph->bbx.width * p->font->bpp ) & 7; + if ( glyph->bbx.width ) + *bp &= nibble_mask[mask_index]; + + /* If any line has extra columns, indicate they have been removed. */ + if ( ( line[nibbles] == '0' || a2i[(int)line[nibbles]] != 0 ) && + !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) ) + { + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG14, glyph->encoding )); + p->flags |= _BDF_GLYPH_WIDTH_CHECK; + font->modified = 1; + } + + p->row++; + goto Exit; + } + + /* Expect the SWIDTH (scalable width) field next. */ + if ( ft_memcmp( line, "SWIDTH", 6 ) == 0 ) + { + if ( !( p->flags & _BDF_ENCODING ) ) + { + /* Missing ENCODING field. */ + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "ENCODING" )); + error = BDF_Err_Missing_Encoding_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + glyph->swidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 ); + p->flags |= _BDF_SWIDTH; + + goto Exit; + } + + /* Expect the DWIDTH (scalable width) field next. */ + if ( ft_memcmp( line, "DWIDTH", 6 ) == 0 ) + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + glyph->dwidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 ); + + if ( !( p->flags & _BDF_SWIDTH ) ) + { + /* Missing SWIDTH field. Emit an auto correction message and set */ + /* the scalable width from the device width. */ + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG9, lineno )); + + glyph->swidth = (unsigned short)FT_MulDiv( + glyph->dwidth, 72000L, + (FT_Long)( font->point_size * + font->resolution_x ) ); + } + + p->flags |= _BDF_DWIDTH; + goto Exit; + } + + /* Expect the BBX field next. */ + if ( ft_memcmp( line, "BBX", 3 ) == 0 ) + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + glyph->bbx.width = _bdf_atos( p->list.field[1], 0, 10 ); + glyph->bbx.height = _bdf_atos( p->list.field[2], 0, 10 ); + glyph->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 ); + glyph->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 ); + + /* Generate the ascent and descent of the character. */ + glyph->bbx.ascent = (short)( glyph->bbx.height + glyph->bbx.y_offset ); + glyph->bbx.descent = (short)( -glyph->bbx.y_offset ); + + /* Determine the overall font bounding box as the characters are */ + /* loaded so corrections can be done later if indicated. */ + p->maxas = (short)FT_MAX( glyph->bbx.ascent, p->maxas ); + p->maxds = (short)FT_MAX( glyph->bbx.descent, p->maxds ); + + p->rbearing = (short)( glyph->bbx.width + glyph->bbx.x_offset ); + + p->maxrb = (short)FT_MAX( p->rbearing, p->maxrb ); + p->minlb = (short)FT_MIN( glyph->bbx.x_offset, p->minlb ); + p->maxlb = (short)FT_MAX( glyph->bbx.x_offset, p->maxlb ); + + if ( !( p->flags & _BDF_DWIDTH ) ) + { + /* Missing DWIDTH field. Emit an auto correction message and set */ + /* the device width to the glyph width. */ + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG10, lineno )); + glyph->dwidth = glyph->bbx.width; + } + + /* If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH */ + /* value if necessary. */ + if ( p->opts->correct_metrics != 0 ) + { + /* Determine the point size of the glyph. */ + unsigned short sw = (unsigned short)FT_MulDiv( + glyph->dwidth, 72000L, + (FT_Long)( font->point_size * + font->resolution_x ) ); + + + if ( sw != glyph->swidth ) + { + glyph->swidth = sw; + + if ( p->glyph_enc == -1 ) + _bdf_set_glyph_modified( font->umod, + font->unencoded_used - 1 ); + else + _bdf_set_glyph_modified( font->nmod, glyph->encoding ); + + p->flags |= _BDF_SWIDTH_ADJ; + font->modified = 1; + } + } + + p->flags |= _BDF_BBX; + goto Exit; + } + + /* And finally, gather up the bitmap. */ + if ( ft_memcmp( line, "BITMAP", 6 ) == 0 ) + { + unsigned long bitmap_size; + + + if ( !( p->flags & _BDF_BBX ) ) + { + /* Missing BBX field. */ + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "BBX" )); + error = BDF_Err_Missing_Bbx_Field; + goto Exit; + } + + /* Allocate enough space for the bitmap. */ + glyph->bpr = ( glyph->bbx.width * p->font->bpp + 7 ) >> 3; + + bitmap_size = glyph->bpr * glyph->bbx.height; + if ( bitmap_size > 0xFFFFU ) + { + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG4, lineno )); + error = BDF_Err_Bbx_Too_Big; + goto Exit; + } + else + glyph->bytes = (unsigned short)bitmap_size; + + if ( FT_NEW_ARRAY( glyph->bitmap, glyph->bytes ) ) + goto Exit; + + p->row = 0; + p->flags |= _BDF_BITMAP; + + goto Exit; + } + + error = BDF_Err_Invalid_File_Format; + + Exit: + return error; + } + + + /* Load the font properties. */ + static FT_Error + _bdf_parse_properties( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + unsigned long vlen; + _bdf_line_func_t* next; + _bdf_parse_t* p; + char* name; + char* value; + char nbuf[128]; + FT_Error error = BDF_Err_Ok; + + FT_UNUSED( lineno ); + + + next = (_bdf_line_func_t *)call_data; + p = (_bdf_parse_t *) client_data; + + /* Check for the end of the properties. */ + if ( ft_memcmp( line, "ENDPROPERTIES", 13 ) == 0 ) + { + /* If the FONT_ASCENT or FONT_DESCENT properties have not been */ + /* encountered yet, then make sure they are added as properties and */ + /* make sure they are set from the font bounding box info. */ + /* */ + /* This is *always* done regardless of the options, because X11 */ + /* requires these two fields to compile fonts. */ + if ( bdf_get_font_property( p->font, "FONT_ASCENT" ) == 0 ) + { + p->font->font_ascent = p->font->bbx.ascent; + ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); + error = _bdf_add_property( p->font, (char *)"FONT_ASCENT", nbuf ); + if ( error ) + goto Exit; + + FT_TRACE2(( "_bdf_parse_properties: " ACMSG1, p->font->bbx.ascent )); + p->font->modified = 1; + } + + if ( bdf_get_font_property( p->font, "FONT_DESCENT" ) == 0 ) + { + p->font->font_descent = p->font->bbx.descent; + ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); + error = _bdf_add_property( p->font, (char *)"FONT_DESCENT", nbuf ); + if ( error ) + goto Exit; + + FT_TRACE2(( "_bdf_parse_properties: " ACMSG2, p->font->bbx.descent )); + p->font->modified = 1; + } + + p->flags &= ~_BDF_PROPS; + *next = _bdf_parse_glyphs; + + goto Exit; + } + + /* Ignore the _XFREE86_GLYPH_RANGES properties. */ + if ( ft_memcmp( line, "_XFREE86_GLYPH_RANGES", 21 ) == 0 ) + goto Exit; + + /* Handle COMMENT fields and properties in a special way to preserve */ + /* the spacing. */ + if ( ft_memcmp( line, "COMMENT", 7 ) == 0 ) + { + name = value = line; + value += 7; + if ( *value ) + *value++ = 0; + error = _bdf_add_property( p->font, name, value ); + if ( error ) + goto Exit; + } + else if ( _bdf_is_atom( line, linelen, &name, &value, p->font ) ) + { + error = _bdf_add_property( p->font, name, value ); + if ( error ) + goto Exit; + } + else + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + name = p->list.field[0]; + + _bdf_list_shift( &p->list, 1 ); + value = _bdf_list_join( &p->list, ' ', &vlen ); + + error = _bdf_add_property( p->font, name, value ); + if ( error ) + goto Exit; + } + + Exit: + return error; + } + + + /* Load the font header. */ + static FT_Error + _bdf_parse_start( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + unsigned long slen; + _bdf_line_func_t* next; + _bdf_parse_t* p; + bdf_font_t* font; + char *s; + + FT_Memory memory = NULL; + FT_Error error = BDF_Err_Ok; + + FT_UNUSED( lineno ); /* only used in debug mode */ + + + next = (_bdf_line_func_t *)call_data; + p = (_bdf_parse_t *) client_data; + + if ( p->font ) + memory = p->font->memory; + + /* Check for a comment. This is done to handle those fonts that have */ + /* comments before the STARTFONT line for some reason. */ + if ( ft_memcmp( line, "COMMENT", 7 ) == 0 ) + { + if ( p->opts->keep_comments != 0 && p->font != 0 ) + { + linelen -= 7; + + s = line + 7; + if ( *s != 0 ) + { + s++; + linelen--; + } + + error = _bdf_add_comment( p->font, s, linelen ); + if ( error ) + goto Exit; + /* here font is not defined! */ + } + + goto Exit; + } + + if ( !( p->flags & _BDF_START ) ) + { + memory = p->memory; + + if ( ft_memcmp( line, "STARTFONT", 9 ) != 0 ) + { + /* No STARTFONT field is a good indication of a problem. */ + error = BDF_Err_Missing_Startfont_Field; + goto Exit; + } + + p->flags = _BDF_START; + font = p->font = 0; + + if ( FT_NEW( font ) ) + goto Exit; + p->font = font; + + font->memory = p->memory; + p->memory = 0; + + { /* setup */ + unsigned long i; + bdf_property_t* prop; + + + error = hash_init( &(font->proptbl), memory ); + if ( error ) + goto Exit; + for ( i = 0, prop = (bdf_property_t*)_bdf_properties; + i < _num_bdf_properties; i++, prop++ ) + { + error = hash_insert( prop->name, (void *)i, + &(font->proptbl), memory ); + if ( error ) + goto Exit; + } + } + + if ( FT_ALLOC( p->font->internal, sizeof ( hashtable ) ) ) + goto Exit; + error = hash_init( (hashtable *)p->font->internal,memory ); + if ( error ) + goto Exit; + p->font->spacing = p->opts->font_spacing; + p->font->default_char = -1; + + goto Exit; + } + + /* Check for the start of the properties. */ + if ( ft_memcmp( line, "STARTPROPERTIES", 15 ) == 0 ) + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + /* at this point, `p->font' can't be NULL */ + p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1], 0, 10 ); + + if ( FT_NEW_ARRAY( p->font->props, p->cnt ) ) + goto Exit; + + p->flags |= _BDF_PROPS; + *next = _bdf_parse_properties; + + goto Exit; + } + + /* Check for the FONTBOUNDINGBOX field. */ + if ( ft_memcmp( line, "FONTBOUNDINGBOX", 15 ) == 0 ) + { + if ( !(p->flags & _BDF_SIZE ) ) + { + /* Missing the SIZE field. */ + FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "SIZE" )); + error = BDF_Err_Missing_Size_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + p->font->bbx.width = _bdf_atos( p->list.field[1], 0, 10 ); + p->font->bbx.height = _bdf_atos( p->list.field[2], 0, 10 ); + + p->font->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 ); + p->font->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 ); + + p->font->bbx.ascent = (short)( p->font->bbx.height + + p->font->bbx.y_offset ); + + p->font->bbx.descent = (short)( -p->font->bbx.y_offset ); + + p->flags |= _BDF_FONT_BBX; + + goto Exit; + } + + /* The next thing to check for is the FONT field. */ + if ( ft_memcmp( line, "FONT", 4 ) == 0 ) + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + _bdf_list_shift( &p->list, 1 ); + + s = _bdf_list_join( &p->list, ' ', &slen ); + + if ( !s ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_NEW_ARRAY( p->font->name, slen + 1 ) ) + goto Exit; + FT_MEM_COPY( p->font->name, s, slen + 1 ); + + /* If the font name is an XLFD name, set the spacing to the one in */ + /* the font name. If there is no spacing fall back on the default. */ + error = _bdf_set_default_spacing( p->font, p->opts ); + if ( error ) + goto Exit; + + p->flags |= _BDF_FONT_NAME; + + goto Exit; + } + + /* Check for the SIZE field. */ + if ( ft_memcmp( line, "SIZE", 4 ) == 0 ) + { + if ( !( p->flags & _BDF_FONT_NAME ) ) + { + /* Missing the FONT field. */ + FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONT" )); + error = BDF_Err_Missing_Font_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + p->font->point_size = _bdf_atoul( p->list.field[1], 0, 10 ); + p->font->resolution_x = _bdf_atoul( p->list.field[2], 0, 10 ); + p->font->resolution_y = _bdf_atoul( p->list.field[3], 0, 10 ); + + /* Check for the bits per pixel field. */ + if ( p->list.used == 5 ) + { + unsigned short bitcount, i, shift; + + + p->font->bpp = (unsigned short)_bdf_atos( p->list.field[4], 0, 10 ); + + /* Only values 1, 2, 4, 8 are allowed. */ + shift = p->font->bpp; + bitcount = 0; + for ( i = 0; shift > 0; i++ ) + { + if ( shift & 1 ) + bitcount = i; + shift >>= 1; + } + + shift = (short)( ( bitcount > 3 ) ? 8 : ( 1 << bitcount ) ); + + if ( p->font->bpp > shift || p->font->bpp != shift ) + { + /* select next higher value */ + p->font->bpp = (unsigned short)( shift << 1 ); + FT_TRACE2(( "_bdf_parse_start: " ACMSG11, p->font->bpp )); + } + } + else + p->font->bpp = 1; + + p->flags |= _BDF_SIZE; + + goto Exit; + } + + error = BDF_Err_Invalid_File_Format; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* API. */ + /* */ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + bdf_load_font( FT_Stream stream, + FT_Memory extmemory, + bdf_options_t* opts, + bdf_font_t* *font ) + { + unsigned long lineno = 0; /* make compiler happy */ + _bdf_parse_t *p; + + FT_Memory memory = extmemory; + FT_Error error = BDF_Err_Ok; + + + if ( FT_NEW( p ) ) + goto Exit; + + memory = NULL; + p->opts = (bdf_options_t*)( ( opts != 0 ) ? opts : &_bdf_opts ); + p->minlb = 32767; + p->memory = extmemory; /* only during font creation */ + + _bdf_list_init( &p->list, extmemory ); + + error = _bdf_readstream( stream, _bdf_parse_start, + (void *)p, &lineno ); + if ( error ) + goto Fail; + + if ( p->font != 0 ) + { + /* If the font is not proportional, set the font's monowidth */ + /* field to the width of the font bounding box. */ + memory = p->font->memory; + + if ( p->font->spacing != BDF_PROPORTIONAL ) + p->font->monowidth = p->font->bbx.width; + + /* If the number of glyphs loaded is not that of the original count, */ + /* indicate the difference. */ + if ( p->cnt != p->font->glyphs_used + p->font->unencoded_used ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG15, p->cnt, + p->font->glyphs_used + p->font->unencoded_used )); + p->font->modified = 1; + } + + /* Once the font has been loaded, adjust the overall font metrics if */ + /* necessary. */ + if ( p->opts->correct_metrics != 0 && + ( p->font->glyphs_used > 0 || p->font->unencoded_used > 0 ) ) + { + if ( p->maxrb - p->minlb != p->font->bbx.width ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG3, + p->font->bbx.width, p->maxrb - p->minlb )); + p->font->bbx.width = (unsigned short)( p->maxrb - p->minlb ); + p->font->modified = 1; + } + + if ( p->font->bbx.x_offset != p->minlb ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG4, + p->font->bbx.x_offset, p->minlb )); + p->font->bbx.x_offset = p->minlb; + p->font->modified = 1; + } + + if ( p->font->bbx.ascent != p->maxas ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG5, + p->font->bbx.ascent, p->maxas )); + p->font->bbx.ascent = p->maxas; + p->font->modified = 1; + } + + if ( p->font->bbx.descent != p->maxds ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG6, + p->font->bbx.descent, p->maxds )); + p->font->bbx.descent = p->maxds; + p->font->bbx.y_offset = (short)( -p->maxds ); + p->font->modified = 1; + } + + if ( p->maxas + p->maxds != p->font->bbx.height ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG7, + p->font->bbx.height, p->maxas + p->maxds )); + p->font->bbx.height = (unsigned short)( p->maxas + p->maxds ); + } + + if ( p->flags & _BDF_SWIDTH_ADJ ) + FT_TRACE2(( "bdf_load_font: " ACMSG8 )); + } + } + + if ( p->flags & _BDF_START ) + { + { + /* The ENDFONT field was never reached or did not exist. */ + if ( !( p->flags & _BDF_GLYPHS ) ) + { + /* Error happened while parsing header. */ + FT_ERROR(( "bdf_load_font: " ERRMSG2, lineno )); + error = BDF_Err_Corrupted_Font_Header; + goto Exit; + } + else + { + /* Error happened when parsing glyphs. */ + FT_ERROR(( "bdf_load_font: " ERRMSG3, lineno )); + error = BDF_Err_Corrupted_Font_Glyphs; + goto Exit; + } + } + } + + if ( p->font != 0 ) + { + /* Make sure the comments are NULL terminated if they exist. */ + memory = p->font->memory; + + if ( p->font->comments_len > 0 ) { + if ( FT_RENEW_ARRAY( p->font->comments, + p->font->comments_len, + p->font->comments_len + 1 ) ) + goto Fail; + + p->font->comments[p->font->comments_len] = 0; + } + } + else if ( error == BDF_Err_Ok ) + error = BDF_Err_Invalid_File_Format; + + *font = p->font; + + Exit: + if ( p ) + { + _bdf_list_done( &p->list ); + + memory = extmemory; + + FT_FREE( p ); + } + + return error; + + Fail: + bdf_free_font( p->font ); + + memory = extmemory; + + FT_FREE( p->font ); + + goto Exit; + } + + + FT_LOCAL_DEF( void ) + bdf_free_font( bdf_font_t* font ) + { + bdf_property_t* prop; + unsigned long i; + bdf_glyph_t* glyphs; + FT_Memory memory; + + + if ( font == 0 ) + return; + + memory = font->memory; + + FT_FREE( font->name ); + + /* Free up the internal hash table of property names. */ + if ( font->internal ) + { + hash_free( (hashtable *)font->internal, memory ); + FT_FREE( font->internal ); + } + + /* Free up the comment info. */ + FT_FREE( font->comments ); + + /* Free up the properties. */ + for ( i = 0; i < font->props_size; i++ ) + { + if ( font->props[i].format == BDF_ATOM ) + FT_FREE( font->props[i].value.atom ); + } + + FT_FREE( font->props ); + + /* Free up the character info. */ + for ( i = 0, glyphs = font->glyphs; + i < font->glyphs_used; i++, glyphs++ ) + { + FT_FREE( glyphs->name ); + FT_FREE( glyphs->bitmap ); + } + + for ( i = 0, glyphs = font->unencoded; i < font->unencoded_used; + i++, glyphs++ ) + { + FT_FREE( glyphs->name ); + FT_FREE( glyphs->bitmap ); + } + + FT_FREE( font->glyphs ); + FT_FREE( font->unencoded ); + + /* Free up the overflow storage if it was used. */ + for ( i = 0, glyphs = font->overflow.glyphs; + i < font->overflow.glyphs_used; i++, glyphs++ ) + { + FT_FREE( glyphs->name ); + FT_FREE( glyphs->bitmap ); + } + + FT_FREE( font->overflow.glyphs ); + + /* bdf_cleanup */ + hash_free( &(font->proptbl), memory ); + + /* Free up the user defined properties. */ + for (prop = font->user_props, i = 0; + i < font->nuser_props; i++, prop++ ) + { + FT_FREE( prop->name ); + if ( prop->format == BDF_ATOM ) + FT_FREE( prop->value.atom ); + } + + FT_FREE( font->user_props ); + + /* FREE( font ); */ /* XXX Fixme */ + } + + + FT_LOCAL_DEF( bdf_property_t * ) + bdf_get_font_property( bdf_font_t* font, + const char* name ) + { + hashnode hn; + + + if ( font == 0 || font->props_size == 0 || name == 0 || *name == 0 ) + return 0; + + hn = hash_lookup( name, (hashtable *)font->internal ); + + return hn ? ( font->props + (unsigned long)hn->data ) : 0; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/bdf/module.mk b/src/3rdparty/freetype/src/bdf/module.mk new file mode 100644 index 0000000000..fe06ae8e06 --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/module.mk @@ -0,0 +1,34 @@ +# +# FreeType 2 BDF module definition +# + +# Copyright 2001, 2002, 2006 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +FTMODULE_H_COMMANDS += BDF_DRIVER + +define BDF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, bdf_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)bdf $(ECHO_DRIVER_DESC)bdf bitmap fonts$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/bdf/rules.mk b/src/3rdparty/freetype/src/bdf/rules.mk new file mode 100644 index 0000000000..6ff1614dde --- /dev/null +++ b/src/3rdparty/freetype/src/bdf/rules.mk @@ -0,0 +1,81 @@ +# +# FreeType 2 bdf driver configuration rules +# + + +# Copyright (C) 2001, 2002, 2003, 2008 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + + + +# bdf driver directory +# +BDF_DIR := $(SRC_DIR)/bdf + + +BDF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(BDF_DIR)) + + +# bdf driver sources (i.e., C files) +# +BDF_DRV_SRC := $(BDF_DIR)/bdflib.c \ + $(BDF_DIR)/bdfdrivr.c + + +# bdf driver headers +# +BDF_DRV_H := $(BDF_DIR)/bdf.h \ + $(BDF_DIR)/bdfdrivr.h \ + $(BDF_DIR)/bdferror.h + +# bdf driver object(s) +# +# BDF_DRV_OBJ_M is used during `multi' builds +# BDF_DRV_OBJ_S is used during `single' builds +# +BDF_DRV_OBJ_M := $(BDF_DRV_SRC:$(BDF_DIR)/%.c=$(OBJ_DIR)/%.$O) +BDF_DRV_OBJ_S := $(OBJ_DIR)/bdf.$O + +# bdf driver source file for single build +# +BDF_DRV_SRC_S := $(BDF_DIR)/bdf.c + + +# bdf driver - single object +# +$(BDF_DRV_OBJ_S): $(BDF_DRV_SRC_S) $(BDF_DRV_SRC) $(FREETYPE_H) $(BDF_DRV_H) + $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BDF_DRV_SRC_S)) + + +# bdf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(BDF_DIR)/%.c $(FREETYPE_H) $(BDF_DRV_H) + $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(BDF_DRV_OBJ_S) +DRV_OBJS_M += $(BDF_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/cache/Jamfile b/src/3rdparty/freetype/src/cache/Jamfile new file mode 100644 index 0000000000..340cff7742 --- /dev/null +++ b/src/3rdparty/freetype/src/cache/Jamfile @@ -0,0 +1,43 @@ +# FreeType 2 src/cache Jamfile +# +# Copyright 2001, 2003, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) cache ; + +# The file <freetype/ftcache.h> contains some macro definitions that are +# later used in #include statements related to the cache sub-system. It +# needs to be parsed through a HDRMACRO rule for macro definitions. +# +HDRMACRO [ FT2_SubDir include ftcache.h ] ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftcmru + ftcmanag + ftccache + ftcglyph + ftcsbits + ftcimage + ftcbasic + ftccmap + ; + } + else + { + _sources = ftcache ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/cache Jamfile diff --git a/src/3rdparty/freetype/src/cache/ftcache.c b/src/3rdparty/freetype/src/cache/ftcache.c new file mode 100644 index 0000000000..d41e91e5ec --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcache.c @@ -0,0 +1,31 @@ +/***************************************************************************/ +/* */ +/* ftcache.c */ +/* */ +/* The FreeType Caching sub-system (body only). */ +/* */ +/* Copyright 2000-2001, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ftcmru.c" +#include "ftcmanag.c" +#include "ftccache.c" +#include "ftccmap.c" +#include "ftcglyph.c" +#include "ftcimage.c" +#include "ftcsbits.c" +#include "ftcbasic.c" + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcbasic.c b/src/3rdparty/freetype/src/cache/ftcbasic.c new file mode 100644 index 0000000000..a568b975bb --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcbasic.c @@ -0,0 +1,811 @@ +/***************************************************************************/ +/* */ +/* ftcbasic.c */ +/* */ +/* The FreeType basic cache interface (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcglyph.h" +#include "ftcimage.h" +#include "ftcsbits.h" +#include FT_INTERNAL_MEMORY_H + +#include "ftccback.h" +#include "ftcerror.h" + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* + * These structures correspond to the FTC_Font and FTC_ImageDesc types + * that were defined in version 2.1.7. + */ + typedef struct FTC_OldFontRec_ + { + FTC_FaceID face_id; + FT_UShort pix_width; + FT_UShort pix_height; + + } FTC_OldFontRec, *FTC_OldFont; + + + typedef struct FTC_OldImageDescRec_ + { + FTC_OldFontRec font; + FT_UInt32 flags; + + } FTC_OldImageDescRec, *FTC_OldImageDesc; + + + /* + * Notice that FTC_OldImageDescRec and FTC_ImageTypeRec are nearly + * identical, bit-wise. The only difference is that the `width' and + * `height' fields are expressed as 16-bit integers in the old structure, + * and as normal `int' in the new one. + * + * We are going to perform a weird hack to detect which structure is + * being passed to the image and sbit caches. If the new structure's + * `width' is larger than 0x10000, we assume that we are really receiving + * an FTC_OldImageDesc. + */ + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * Basic Families + * + */ + typedef struct FTC_BasicAttrRec_ + { + FTC_ScalerRec scaler; + FT_UInt load_flags; + + } FTC_BasicAttrRec, *FTC_BasicAttrs; + +#define FTC_BASIC_ATTR_COMPARE( a, b ) \ + FT_BOOL( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \ + (a)->load_flags == (b)->load_flags ) + +#define FTC_BASIC_ATTR_HASH( a ) \ + ( FTC_SCALER_HASH( &(a)->scaler ) + 31*(a)->load_flags ) + + + typedef struct FTC_BasicQueryRec_ + { + FTC_GQueryRec gquery; + FTC_BasicAttrRec attrs; + + } FTC_BasicQueryRec, *FTC_BasicQuery; + + + typedef struct FTC_BasicFamilyRec_ + { + FTC_FamilyRec family; + FTC_BasicAttrRec attrs; + + } FTC_BasicFamilyRec, *FTC_BasicFamily; + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_basic_family_compare( FTC_MruNode ftcfamily, + FT_Pointer ftcquery ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FTC_BasicQuery query = (FTC_BasicQuery)ftcquery; + + + return FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_init( FTC_MruNode ftcfamily, + FT_Pointer ftcquery, + FT_Pointer ftccache ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FTC_BasicQuery query = (FTC_BasicQuery)ftcquery; + FTC_Cache cache = (FTC_Cache)ftccache; + + + FTC_Family_Init( FTC_FAMILY( family ), cache ); + family->attrs = query->attrs; + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + ftc_basic_family_get_count( FTC_Family ftcfamily, + FTC_Manager manager ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FT_Face face; + FT_UInt result = 0; + + + error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id, + &face ); + if ( !error ) + result = face->num_glyphs; + + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_load_bitmap( FTC_Family ftcfamily, + FT_UInt gindex, + FTC_Manager manager, + FT_Face *aface ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FT_Size size; + + + error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size ); + if ( !error ) + { + FT_Face face = size->face; + + + error = FT_Load_Glyph( face, gindex, + family->attrs.load_flags | FT_LOAD_RENDER ); + if ( !error ) + *aface = face; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_load_glyph( FTC_Family ftcfamily, + FT_UInt gindex, + FTC_Cache cache, + FT_Glyph *aglyph ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FTC_Scaler scaler = &family->attrs.scaler; + FT_Face face; + FT_Size size; + + + /* we will now load the glyph image */ + error = FTC_Manager_LookupSize( cache->manager, + scaler, + &size ); + if ( !error ) + { + face = size->face; + + error = FT_Load_Glyph( face, gindex, family->attrs.load_flags ); + if ( !error ) + { + if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || + face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* ok, copy it */ + FT_Glyph glyph; + + + error = FT_Get_Glyph( face->glyph, &glyph ); + if ( !error ) + { + *aglyph = glyph; + goto Exit; + } + } + else + error = FTC_Err_Invalid_Argument; + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_basic_gnode_compare_faceid( FTC_Node ftcgnode, + FT_Pointer ftcface_id, + FTC_Cache cache ) + { + FTC_GNode gnode = (FTC_GNode)ftcgnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FTC_BasicFamily family = (FTC_BasicFamily)gnode->family; + FT_Bool result; + + + result = FT_BOOL( family->attrs.scaler.face_id == face_id ); + if ( result ) + { + /* we must call this function to avoid this node from appearing + * in later lookups with the same face_id! + */ + FTC_GNode_UnselectFamily( gnode, cache ); + } + return result; + } + + + /* + * + * basic image cache + * + */ + + FT_CALLBACK_TABLE_DEF + const FTC_IFamilyClassRec ftc_basic_image_family_class = + { + { + sizeof ( FTC_BasicFamilyRec ), + ftc_basic_family_compare, + ftc_basic_family_init, + 0, /* FTC_MruNode_ResetFunc */ + 0 /* FTC_MruNode_DoneFunc */ + }, + ftc_basic_family_load_glyph + }; + + + FT_CALLBACK_TABLE_DEF + const FTC_GCacheClassRec ftc_basic_image_cache_class = + { + { + ftc_inode_new, + ftc_inode_weight, + ftc_gnode_compare, + ftc_basic_gnode_compare_faceid, + ftc_inode_free, + + sizeof ( FTC_GCacheRec ), + ftc_gcache_init, + ftc_gcache_done + }, + (FTC_MruListClass)&ftc_basic_image_family_class + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ) + { + return FTC_GCache_New( manager, &ftc_basic_image_cache_class, + (FTC_GCache*)acache ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ) + { + FTC_BasicQueryRec query; + FTC_INode node = 0; /* make compiler happy */ + FT_Error error; + FT_UInt32 hash; + + + /* some argument checks are delayed to FTC_Cache_Lookup */ + if ( !aglyph ) + { + error = FTC_Err_Invalid_Argument; + goto Exit; + } + + *aglyph = NULL; + if ( anode ) + *anode = NULL; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* + * This one is a major hack used to detect whether we are passed a + * regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one. + */ + if ( type->width >= 0x10000 ) + { + FTC_OldImageDesc desc = (FTC_OldImageDesc)type; + + + query.attrs.scaler.face_id = desc->font.face_id; + query.attrs.scaler.width = desc->font.pix_width; + query.attrs.scaler.height = desc->font.pix_height; + query.attrs.load_flags = desc->flags; + } + else + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + { + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.load_flags = type->flags; + } + + query.attrs.scaler.pixel = 1; + query.attrs.scaler.x_res = 0; /* make compilers happy */ + query.attrs.scaler.y_res = 0; + + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; + +#if 1 /* inlining is about 50% faster! */ + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_GNode_Compare, + hash, gindex, + &query, + node, + error ); +#else + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), + hash, gindex, + FTC_GQUERY( &query ), + (FTC_Node*) &node ); +#endif + if ( !error ) + { + *aglyph = FTC_INODE( node )->glyph; + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_NODE( node )->ref_count++; + } + } + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ) + { + FTC_BasicQueryRec query; + FTC_INode node = 0; /* make compiler happy */ + FT_Error error; + FT_UInt32 hash; + + + /* some argument checks are delayed to FTC_Cache_Lookup */ + if ( !aglyph || !scaler ) + { + error = FTC_Err_Invalid_Argument; + goto Exit; + } + + *aglyph = NULL; + if ( anode ) + *anode = NULL; + + query.attrs.scaler = scaler[0]; + query.attrs.load_flags = load_flags; + + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; + + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_GNode_Compare, + hash, gindex, + &query, + node, + error ); + if ( !error ) + { + *aglyph = FTC_INODE( node )->glyph; + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_NODE( node )->ref_count++; + } + } + + Exit: + return error; + } + + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* yet another backwards-legacy structure */ + typedef struct FTC_OldImage_Desc_ + { + FTC_FontRec font; + FT_UInt image_type; + + } FTC_OldImage_Desc; + + +#define FTC_OLD_IMAGE_FORMAT( x ) ( (x) & 7 ) + + +#define ftc_old_image_format_bitmap 0x0000 +#define ftc_old_image_format_outline 0x0001 + +#define ftc_old_image_format_mask 0x000F + +#define ftc_old_image_flag_monochrome 0x0010 +#define ftc_old_image_flag_unhinted 0x0020 +#define ftc_old_image_flag_autohinted 0x0040 +#define ftc_old_image_flag_unscaled 0x0080 +#define ftc_old_image_flag_no_sbits 0x0100 + + /* monochrome bitmap */ +#define ftc_old_image_mono ftc_old_image_format_bitmap | \ + ftc_old_image_flag_monochrome + + /* anti-aliased bitmap */ +#define ftc_old_image_grays ftc_old_image_format_bitmap + + /* scaled outline */ +#define ftc_old_image_outline ftc_old_image_format_outline + + + static void + ftc_image_type_from_old_desc( FTC_ImageType typ, + FTC_OldImage_Desc* desc ) + { + typ->face_id = desc->font.face_id; + typ->width = desc->font.pix_width; + typ->height = desc->font.pix_height; + + /* convert image type flags to load flags */ + { + FT_UInt load_flags = FT_LOAD_DEFAULT; + FT_UInt type = desc->image_type; + + + /* determine load flags, depending on the font description's */ + /* image type */ + + if ( FTC_OLD_IMAGE_FORMAT( type ) == ftc_old_image_format_bitmap ) + { + if ( type & ftc_old_image_flag_monochrome ) + load_flags |= FT_LOAD_MONOCHROME; + + /* disable embedded bitmaps loading if necessary */ + if ( type & ftc_old_image_flag_no_sbits ) + load_flags |= FT_LOAD_NO_BITMAP; + } + else + { + /* we want an outline, don't load embedded bitmaps */ + load_flags |= FT_LOAD_NO_BITMAP; + + if ( type & ftc_old_image_flag_unscaled ) + load_flags |= FT_LOAD_NO_SCALE; + } + + /* always render glyphs to bitmaps */ + load_flags |= FT_LOAD_RENDER; + + if ( type & ftc_old_image_flag_unhinted ) + load_flags |= FT_LOAD_NO_HINTING; + + if ( type & ftc_old_image_flag_autohinted ) + load_flags |= FT_LOAD_FORCE_AUTOHINT; + + typ->flags = load_flags; + } + } + + + FT_EXPORT( FT_Error ) + FTC_Image_Cache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + FT_EXPORT( FT_Error ) + FTC_Image_Cache_Lookup( FTC_ImageCache icache, + FTC_OldImage_Desc* desc, + FT_UInt gindex, + FT_Glyph *aglyph ); + + + FT_EXPORT_DEF( FT_Error ) + FTC_Image_Cache_New( FTC_Manager manager, + FTC_ImageCache *acache ) + { + return FTC_ImageCache_New( manager, (FTC_ImageCache*)acache ); + } + + + + FT_EXPORT_DEF( FT_Error ) + FTC_Image_Cache_Lookup( FTC_ImageCache icache, + FTC_OldImage_Desc* desc, + FT_UInt gindex, + FT_Glyph *aglyph ) + { + FTC_ImageTypeRec type0; + + + if ( !desc ) + return FTC_Err_Invalid_Argument; + + ftc_image_type_from_old_desc( &type0, desc ); + + return FTC_ImageCache_Lookup( (FTC_ImageCache)icache, + &type0, + gindex, + aglyph, + NULL ); + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * + * basic small bitmap cache + * + */ + + + FT_CALLBACK_TABLE_DEF + const FTC_SFamilyClassRec ftc_basic_sbit_family_class = + { + { + sizeof( FTC_BasicFamilyRec ), + ftc_basic_family_compare, + ftc_basic_family_init, + 0, /* FTC_MruNode_ResetFunc */ + 0 /* FTC_MruNode_DoneFunc */ + }, + ftc_basic_family_get_count, + ftc_basic_family_load_bitmap + }; + + + FT_CALLBACK_TABLE_DEF + const FTC_GCacheClassRec ftc_basic_sbit_cache_class = + { + { + ftc_snode_new, + ftc_snode_weight, + ftc_snode_compare, + ftc_basic_gnode_compare_faceid, + ftc_snode_free, + + sizeof ( FTC_GCacheRec ), + ftc_gcache_init, + ftc_gcache_done + }, + (FTC_MruListClass)&ftc_basic_sbit_family_class + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ) + { + return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class, + (FTC_GCache*)acache ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *ansbit, + FTC_Node *anode ) + { + FT_Error error; + FTC_BasicQueryRec query; + FTC_SNode node = 0; /* make compiler happy */ + FT_UInt32 hash; + + + if ( anode ) + *anode = NULL; + + /* other argument checks delayed to FTC_Cache_Lookup */ + if ( !ansbit ) + return FTC_Err_Invalid_Argument; + + *ansbit = NULL; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* This one is a major hack used to detect whether we are passed a + * regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one. + */ + if ( type->width >= 0x10000 ) + { + FTC_OldImageDesc desc = (FTC_OldImageDesc)type; + + + query.attrs.scaler.face_id = desc->font.face_id; + query.attrs.scaler.width = desc->font.pix_width; + query.attrs.scaler.height = desc->font.pix_height; + query.attrs.load_flags = desc->flags; + } + else + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + { + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.load_flags = type->flags; + } + + query.attrs.scaler.pixel = 1; + query.attrs.scaler.x_res = 0; /* make compilers happy */ + query.attrs.scaler.y_res = 0; + + /* beware, the hash must be the same for all glyph ranges! */ + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + + gindex / FTC_SBIT_ITEMS_PER_NODE; + +#if 1 /* inlining is about 50% faster! */ + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_SNode_Compare, + hash, gindex, + &query, + node, + error ); +#else + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), + hash, + gindex, + FTC_GQUERY( &query ), + (FTC_Node*)&node ); +#endif + if ( error ) + goto Exit; + + *ansbit = node->sbits + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_NODE( node )->ref_count++; + } + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *ansbit, + FTC_Node *anode ) + { + FT_Error error; + FTC_BasicQueryRec query; + FTC_SNode node = 0; /* make compiler happy */ + FT_UInt32 hash; + + + if ( anode ) + *anode = NULL; + + /* other argument checks delayed to FTC_Cache_Lookup */ + if ( !ansbit || !scaler ) + return FTC_Err_Invalid_Argument; + + *ansbit = NULL; + + query.attrs.scaler = scaler[0]; + query.attrs.load_flags = load_flags; + + /* beware, the hash must be the same for all glyph ranges! */ + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + + gindex / FTC_SBIT_ITEMS_PER_NODE; + + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_SNode_Compare, + hash, gindex, + &query, + node, + error ); + if ( error ) + goto Exit; + + *ansbit = node->sbits + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = FTC_NODE( node ); + FTC_NODE( node )->ref_count++; + } + + Exit: + return error; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_EXPORT( FT_Error ) + FTC_SBit_Cache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + FT_EXPORT( FT_Error ) + FTC_SBit_Cache_Lookup( FTC_SBitCache cache, + FTC_OldImage_Desc* desc, + FT_UInt gindex, + FTC_SBit *ansbit ); + + + FT_EXPORT_DEF( FT_Error ) + FTC_SBit_Cache_New( FTC_Manager manager, + FTC_SBitCache *acache ) + { + return FTC_SBitCache_New( manager, (FTC_SBitCache*)acache ); + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_SBit_Cache_Lookup( FTC_SBitCache cache, + FTC_OldImage_Desc* desc, + FT_UInt gindex, + FTC_SBit *ansbit ) + { + FTC_ImageTypeRec type0; + + + if ( !desc ) + return FT_Err_Invalid_Argument; + + ftc_image_type_from_old_desc( &type0, desc ); + + return FTC_SBitCache_Lookup( (FTC_SBitCache)cache, + &type0, + gindex, + ansbit, + NULL ); + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftccache.c b/src/3rdparty/freetype/src/cache/ftccache.c new file mode 100644 index 0000000000..f3e699c385 --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftccache.c @@ -0,0 +1,592 @@ +/***************************************************************************/ +/* */ +/* ftccache.c */ +/* */ +/* The FreeType internal cache interface (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "ftcmanag.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +#include "ftccback.h" +#include "ftcerror.h" + + +#define FTC_HASH_MAX_LOAD 2 +#define FTC_HASH_MIN_LOAD 1 +#define FTC_HASH_SUB_LOAD ( FTC_HASH_MAX_LOAD - FTC_HASH_MIN_LOAD ) + +/* this one _must_ be a power of 2! */ +#define FTC_HASH_INITIAL_SIZE 8 + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE NODE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* add a new node to the head of the manager's circular MRU list */ + static void + ftc_node_mru_link( FTC_Node node, + FTC_Manager manager ) + { + void *nl = &manager->nodes_list; + + + FTC_MruNode_Prepend( (FTC_MruNode*)nl, + (FTC_MruNode)node ); + manager->num_nodes++; + } + + + /* remove a node from the manager's MRU list */ + static void + ftc_node_mru_unlink( FTC_Node node, + FTC_Manager manager ) + { + void *nl = &manager->nodes_list; + + + FTC_MruNode_Remove( (FTC_MruNode*)nl, + (FTC_MruNode)node ); + manager->num_nodes--; + } + + +#ifndef FTC_INLINE + + /* move a node to the head of the manager's MRU list */ + static void + ftc_node_mru_up( FTC_Node node, + FTC_Manager manager ) + { + FTC_MruNode_Up( (FTC_MruNode*)&manager->nodes_list, + (FTC_MruNode)node ); + } + +#endif /* !FTC_INLINE */ + + + /* Note that this function cannot fail. If we cannot re-size the + * buckets array appropriately, we simply degrade the hash table's + * performance! + */ + static void + ftc_cache_resize( FTC_Cache cache ) + { + for (;;) + { + FTC_Node node, *pnode; + FT_UInt p = cache->p; + FT_UInt mask = cache->mask; + FT_UInt count = mask + p + 1; /* number of buckets */ + + + /* do we need to shrink the buckets array? */ + if ( cache->slack < 0 ) + { + FTC_Node new_list = NULL; + + + /* try to expand the buckets array _before_ splitting + * the bucket lists + */ + if ( p >= mask ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + /* if we can't expand the array, leave immediately */ + if ( FT_RENEW_ARRAY( cache->buckets, (mask+1)*2, (mask+1)*4 ) ) + break; + } + + /* split a single bucket */ + pnode = cache->buckets + p; + + for (;;) + { + node = *pnode; + if ( node == NULL ) + break; + + if ( node->hash & ( mask + 1 ) ) + { + *pnode = node->link; + node->link = new_list; + new_list = node; + } + else + pnode = &node->link; + } + + cache->buckets[p + mask + 1] = new_list; + + cache->slack += FTC_HASH_MAX_LOAD; + + if ( p >= mask ) + { + cache->mask = 2 * mask + 1; + cache->p = 0; + } + else + cache->p = p + 1; + } + + /* do we need to expand the buckets array? */ + else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD ) + { + FT_UInt old_index = p + mask; + FTC_Node* pold; + + + if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE ) + break; + + if ( p == 0 ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + /* if we can't shrink the array, leave immediately */ + if ( FT_RENEW_ARRAY( cache->buckets, + ( mask + 1 ) * 2, mask + 1 ) ) + break; + + cache->mask >>= 1; + p = cache->mask; + } + else + p--; + + pnode = cache->buckets + p; + while ( *pnode ) + pnode = &(*pnode)->link; + + pold = cache->buckets + old_index; + *pnode = *pold; + *pold = NULL; + + cache->slack -= FTC_HASH_MAX_LOAD; + cache->p = p; + } + else /* the hash table is balanced */ + break; + } + } + + + /* remove a node from its cache's hash table */ + static void + ftc_node_hash_unlink( FTC_Node node0, + FTC_Cache cache ) + { + FTC_Node *pnode; + FT_UInt idx; + + + idx = (FT_UInt)( node0->hash & cache->mask ); + if ( idx < cache->p ) + idx = (FT_UInt)( node0->hash & ( 2 * cache->mask + 1 ) ); + + pnode = cache->buckets + idx; + + for (;;) + { + FTC_Node node = *pnode; + + + if ( node == NULL ) + { + FT_ERROR(( "ftc_node_hash_unlink: unknown node!\n" )); + return; + } + + if ( node == node0 ) + break; + + pnode = &(*pnode)->link; + } + + *pnode = node0->link; + node0->link = NULL; + + cache->slack++; + ftc_cache_resize( cache ); + } + + + /* add a node to the `top' of its cache's hash table */ + static void + ftc_node_hash_link( FTC_Node node, + FTC_Cache cache ) + { + FTC_Node *pnode; + FT_UInt idx; + + + idx = (FT_UInt)( node->hash & cache->mask ); + if ( idx < cache->p ) + idx = (FT_UInt)( node->hash & (2 * cache->mask + 1 ) ); + + pnode = cache->buckets + idx; + + node->link = *pnode; + *pnode = node; + + cache->slack--; + ftc_cache_resize( cache ); + } + + + /* remove a node from the cache manager */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_BASE_DEF( void ) +#else + FT_LOCAL_DEF( void ) +#endif + ftc_node_destroy( FTC_Node node, + FTC_Manager manager ) + { + FTC_Cache cache; + + +#ifdef FT_DEBUG_ERROR + /* find node's cache */ + if ( node->cache_index >= manager->num_caches ) + { + FT_ERROR(( "ftc_node_destroy: invalid node handle\n" )); + return; + } +#endif + + cache = manager->caches[node->cache_index]; + +#ifdef FT_DEBUG_ERROR + if ( cache == NULL ) + { + FT_ERROR(( "ftc_node_destroy: invalid node handle\n" )); + return; + } +#endif + + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + + /* remove node from mru list */ + ftc_node_mru_unlink( node, manager ); + + /* remove node from cache's hash table */ + ftc_node_hash_unlink( node, cache ); + + /* now finalize it */ + cache->clazz.node_free( node, cache ); + +#if 0 + /* check, just in case of general corruption :-) */ + if ( manager->num_nodes == 0 ) + FT_ERROR(( "ftc_node_destroy: invalid cache node count! = %d\n", + manager->num_nodes )); +#endif + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** ABSTRACT CACHE CLASS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_Init( FTC_Cache cache ) + { + return ftc_cache_init( cache ); + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_cache_init( FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + cache->p = 0; + cache->mask = FTC_HASH_INITIAL_SIZE - 1; + cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD; + + (void)FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ); + return error; + } + + + static void + FTC_Cache_Clear( FTC_Cache cache ) + { + if ( cache ) + { + FTC_Manager manager = cache->manager; + FT_UFast i; + FT_UInt count; + + + count = cache->p + cache->mask + 1; + + for ( i = 0; i < count; i++ ) + { + FTC_Node *pnode = cache->buckets + i, next, node = *pnode; + + + while ( node ) + { + next = node->link; + node->link = NULL; + + /* remove node from mru list */ + ftc_node_mru_unlink( node, manager ); + + /* now finalize it */ + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + + cache->clazz.node_free( node, cache ); + node = next; + } + cache->buckets[i] = NULL; + } + ftc_cache_resize( cache ); + } + } + + + FT_LOCAL_DEF( void ) + ftc_cache_done( FTC_Cache cache ) + { + if ( cache->memory ) + { + FT_Memory memory = cache->memory; + + + FTC_Cache_Clear( cache ); + + FT_FREE( cache->buckets ); + cache->mask = 0; + cache->p = 0; + cache->slack = 0; + + cache->memory = NULL; + } + } + + + FT_LOCAL_DEF( void ) + FTC_Cache_Done( FTC_Cache cache ) + { + ftc_cache_done( cache ); + } + + + static void + ftc_cache_add( FTC_Cache cache, + FT_UInt32 hash, + FTC_Node node ) + { + node->hash = hash; + node->cache_index = (FT_UInt16) cache->index; + node->ref_count = 0; + + ftc_node_hash_link( node, cache ); + ftc_node_mru_link( node, cache->manager ); + + { + FTC_Manager manager = cache->manager; + + + manager->cur_weight += cache->clazz.node_weight( node, cache ); + + if ( manager->cur_weight >= manager->max_weight ) + { + node->ref_count++; + FTC_Manager_Compress( manager ); + node->ref_count--; + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_NewNode( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ) + { + FT_Error error; + FTC_Node node; + + + /* + * We use the FTC_CACHE_TRYLOOP macros to support out-of-memory + * errors (OOM) correctly, i.e., by flushing the cache progressively + * in order to make more room. + */ + + FTC_CACHE_TRYLOOP( cache ) + { + error = cache->clazz.node_new( &node, query, cache ); + } + FTC_CACHE_TRYLOOP_END(); + + if ( error ) + node = NULL; + else + { + /* don't assume that the cache has the same number of buckets, since + * our allocation request might have triggered global cache flushing + */ + ftc_cache_add( cache, hash, node ); + } + + *anode = node; + return error; + } + + +#ifndef FTC_INLINE + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_Lookup( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ) + { + FT_UFast idx; + FTC_Node* bucket; + FTC_Node* pnode; + FTC_Node node; + FT_Error error = 0; + + FTC_Node_CompareFunc compare = cache->clazz.node_compare; + + + if ( cache == NULL || anode == NULL ) + return FT_Err_Invalid_Argument; + + idx = hash & cache->mask; + if ( idx < cache->p ) + idx = hash & ( cache->mask * 2 + 1 ); + + bucket = cache->buckets + idx; + pnode = bucket; + for (;;) + { + node = *pnode; + if ( node == NULL ) + goto NewNode; + + if ( node->hash == hash && compare( node, query, cache ) ) + break; + + pnode = &node->link; + } + + if ( node != *bucket ) + { + *pnode = node->link; + node->link = *bucket; + *bucket = node; + } + + /* move to head of MRU list */ + { + FTC_Manager manager = cache->manager; + + + if ( node != manager->nodes_list ) + ftc_node_mru_up( node, manager ); + } + *anode = node; + return error; + + NewNode: + return FTC_Cache_NewNode( cache, hash, query, anode ); + } + +#endif /* !FTC_INLINE */ + + + FT_LOCAL_DEF( void ) + FTC_Cache_RemoveFaceID( FTC_Cache cache, + FTC_FaceID face_id ) + { + FT_UFast i, count; + FTC_Manager manager = cache->manager; + FTC_Node frees = NULL; + + + count = cache->p + cache->mask; + for ( i = 0; i < count; i++ ) + { + FTC_Node* bucket = cache->buckets + i; + FTC_Node* pnode = bucket; + + + for ( ;; ) + { + FTC_Node node = *pnode; + + + if ( node == NULL ) + break; + + if ( cache->clazz.node_remove_faceid( node, face_id, cache ) ) + { + *pnode = node->link; + node->link = frees; + frees = node; + } + else + pnode = &node->link; + } + } + + /* remove all nodes in the free list */ + while ( frees ) + { + FTC_Node node; + + + node = frees; + frees = node->link; + + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + ftc_node_mru_unlink( node, manager ); + + cache->clazz.node_free( node, cache ); + + cache->slack++; + } + + ftc_cache_resize( cache ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftccache.h b/src/3rdparty/freetype/src/cache/ftccache.h new file mode 100644 index 0000000000..8c0a7c94fe --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftccache.h @@ -0,0 +1,317 @@ +/***************************************************************************/ +/* */ +/* ftccache.h */ +/* */ +/* FreeType internal cache interface (specification). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCCACHE_H__ +#define __FTCCACHE_H__ + + +#include "ftcmru.h" + +FT_BEGIN_HEADER + + /* handle to cache object */ + typedef struct FTC_CacheRec_* FTC_Cache; + + /* handle to cache class */ + typedef const struct FTC_CacheClassRec_* FTC_CacheClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE NODE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Each cache controls one or more cache nodes. Each node is part of */ + /* the global_lru list of the manager. Its `data' field however is used */ + /* as a reference count for now. */ + /* */ + /* A node can be anything, depending on the type of information held by */ + /* the cache. It can be an individual glyph image, a set of bitmaps */ + /* glyphs for a given size, some metrics, etc. */ + /* */ + /*************************************************************************/ + + /* structure size should be 20 bytes on 32-bits machines */ + typedef struct FTC_NodeRec_ + { + FTC_MruNodeRec mru; /* circular mru list pointer */ + FTC_Node link; /* used for hashing */ + FT_UInt32 hash; /* used for hashing too */ + FT_UShort cache_index; /* index of cache the node belongs to */ + FT_Short ref_count; /* reference count for this node */ + + } FTC_NodeRec; + + +#define FTC_NODE( x ) ( (FTC_Node)(x) ) +#define FTC_NODE_P( x ) ( (FTC_Node*)(x) ) + +#define FTC_NODE__NEXT( x ) FTC_NODE( (x)->mru.next ) +#define FTC_NODE__PREV( x ) FTC_NODE( (x)->mru.prev ) + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_BASE( void ) + ftc_node_destroy( FTC_Node node, + FTC_Manager manager ); +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* initialize a new cache node */ + typedef FT_Error + (*FTC_Node_NewFunc)( FTC_Node *pnode, + FT_Pointer query, + FTC_Cache cache ); + + typedef FT_ULong + (*FTC_Node_WeightFunc)( FTC_Node node, + FTC_Cache cache ); + + /* compare a node to a given key pair */ + typedef FT_Bool + (*FTC_Node_CompareFunc)( FTC_Node node, + FT_Pointer key, + FTC_Cache cache ); + + + typedef void + (*FTC_Node_FreeFunc)( FTC_Node node, + FTC_Cache cache ); + + typedef FT_Error + (*FTC_Cache_InitFunc)( FTC_Cache cache ); + + typedef void + (*FTC_Cache_DoneFunc)( FTC_Cache cache ); + + + typedef struct FTC_CacheClassRec_ + { + FTC_Node_NewFunc node_new; + FTC_Node_WeightFunc node_weight; + FTC_Node_CompareFunc node_compare; + FTC_Node_CompareFunc node_remove_faceid; + FTC_Node_FreeFunc node_free; + + FT_UInt cache_size; + FTC_Cache_InitFunc cache_init; + FTC_Cache_DoneFunc cache_done; + + } FTC_CacheClassRec; + + + /* each cache really implements a dynamic hash table to manage its nodes */ + typedef struct FTC_CacheRec_ + { + FT_UFast p; + FT_UFast mask; + FT_Long slack; + FTC_Node* buckets; + + FTC_CacheClassRec clazz; /* local copy, for speed */ + + FTC_Manager manager; + FT_Memory memory; + FT_UInt index; /* in manager's table */ + + FTC_CacheClass org_class; /* original class pointer */ + + } FTC_CacheRec; + + +#define FTC_CACHE( x ) ( (FTC_Cache)(x) ) +#define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) + + + /* default cache initialize */ + FT_LOCAL( FT_Error ) + FTC_Cache_Init( FTC_Cache cache ); + + /* default cache finalizer */ + FT_LOCAL( void ) + FTC_Cache_Done( FTC_Cache cache ); + + /* Call this function to lookup the cache. If no corresponding + * node is found, a new one is automatically created. This function + * is capable of flushing the cache adequately to make room for the + * new cache object. + */ + +#ifndef FTC_INLINE + FT_LOCAL( FT_Error ) + FTC_Cache_Lookup( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ); +#endif + + FT_LOCAL( FT_Error ) + FTC_Cache_NewNode( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ); + + /* Remove all nodes that relate to a given face_id. This is useful + * when un-installing fonts. Note that if a cache node relates to + * the face_id, but is locked (i.e., has `ref_count > 0'), the node + * will _not_ be destroyed, but its internal face_id reference will + * be modified. + * + * The final result will be that the node will never come back + * in further lookup requests, and will be flushed on demand from + * the cache normally when its reference count reaches 0. + */ + FT_LOCAL( void ) + FTC_Cache_RemoveFaceID( FTC_Cache cache, + FTC_FaceID face_id ); + + +#ifdef FTC_INLINE + +#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ + FT_BEGIN_STMNT \ + FTC_Node *_bucket, *_pnode, _node; \ + FTC_Cache _cache = FTC_CACHE(cache); \ + FT_UInt32 _hash = (FT_UInt32)(hash); \ + FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \ + FT_UInt _idx; \ + \ + \ + error = 0; \ + node = NULL; \ + _idx = _hash & _cache->mask; \ + if ( _idx < _cache->p ) \ + _idx = _hash & ( _cache->mask*2 + 1 ); \ + \ + _bucket = _pnode = _cache->buckets + _idx; \ + for (;;) \ + { \ + _node = *_pnode; \ + if ( _node == NULL ) \ + goto _NewNode; \ + \ + if ( _node->hash == _hash && _nodcomp( _node, query, _cache ) ) \ + break; \ + \ + _pnode = &_node->link; \ + } \ + \ + if ( _node != *_bucket ) \ + { \ + *_pnode = _node->link; \ + _node->link = *_bucket; \ + *_bucket = _node; \ + } \ + \ + { \ + FTC_Manager _manager = _cache->manager; \ + void* _nl = &_manager->nodes_list; \ + \ + \ + if ( _node != _manager->nodes_list ) \ + FTC_MruNode_Up( (FTC_MruNode*)_nl, \ + (FTC_MruNode)_node ); \ + } \ + goto _Ok; \ + \ + _NewNode: \ + error = FTC_Cache_NewNode( _cache, _hash, query, &_node ); \ + \ + _Ok: \ + _pnode = (FTC_Node*)(void*)&(node); \ + *_pnode = _node; \ + FT_END_STMNT + +#else /* !FTC_INLINE */ + +#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ + FT_BEGIN_STMNT \ + error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, \ + (FTC_Node*)&(node) ); \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ + + + /* + * This macro, together with FTC_CACHE_TRYLOOP_END, defines a retry + * loop to flush the cache repeatedly in case of memory overflows. + * + * It is used when creating a new cache node, or within a lookup + * that needs to allocate data (e.g., the sbit cache lookup). + * + * Example: + * + * { + * FTC_CACHE_TRYLOOP( cache ) + * error = load_data( ... ); + * FTC_CACHE_TRYLOOP_END() + * } + * + */ +#define FTC_CACHE_TRYLOOP( cache ) \ + { \ + FTC_Manager _try_manager = FTC_CACHE( cache )->manager; \ + FT_UInt _try_count = 4; \ + \ + \ + for (;;) \ + { \ + FT_UInt _try_done; + + +#define FTC_CACHE_TRYLOOP_END() \ + if ( !error || error != FT_Err_Out_Of_Memory ) \ + break; \ + \ + _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \ + if ( _try_done == 0 ) \ + break; \ + \ + if ( _try_done == _try_count ) \ + { \ + _try_count *= 2; \ + if ( _try_count < _try_done || \ + _try_count > _try_manager->num_nodes ) \ + _try_count = _try_manager->num_nodes; \ + } \ + } \ + } + + /* */ + +FT_END_HEADER + + +#endif /* __FTCCACHE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftccback.h b/src/3rdparty/freetype/src/cache/ftccback.h new file mode 100644 index 0000000000..86e72a7514 --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftccback.h @@ -0,0 +1,90 @@ +/***************************************************************************/ +/* */ +/* ftccback.h */ +/* */ +/* Callback functions of the caching sub-system (specification only). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FTCCBACK_H__ +#define __FTCCBACK_H__ + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcmru.h" +#include "ftcimage.h" +#include "ftcmanag.h" +#include "ftcglyph.h" +#include "ftcsbits.h" + + + FT_LOCAL( void ) + ftc_inode_free( FTC_Node inode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_inode_new( FTC_Node *pinode, + FT_Pointer gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_ULong ) + ftc_inode_weight( FTC_Node inode, + FTC_Cache cache ); + + + FT_LOCAL( void ) + ftc_snode_free( FTC_Node snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_snode_new( FTC_Node *psnode, + FT_Pointer gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_ULong ) + ftc_snode_weight( FTC_Node snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Bool ) + ftc_snode_compare( FTC_Node snode, + FT_Pointer gquery, + FTC_Cache cache ); + + + FT_LOCAL( FT_Bool ) + ftc_gnode_compare( FTC_Node gnode, + FT_Pointer gquery, + FTC_Cache cache ); + + + FT_LOCAL( FT_Error ) + ftc_gcache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_gcache_done( FTC_Cache cache ); + + + FT_LOCAL( FT_Error ) + ftc_cache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_cache_done( FTC_Cache cache ); + +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + FT_LOCAL( void ) + ftc_node_destroy( FTC_Node node, + FTC_Manager manager ); +#endif + +#endif /* __FTCCBACK_H__ */ + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftccmap.c b/src/3rdparty/freetype/src/cache/ftccmap.c new file mode 100644 index 0000000000..4c6a7fd960 --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftccmap.c @@ -0,0 +1,425 @@ +/***************************************************************************/ +/* */ +/* ftccmap.c */ +/* */ +/* FreeType CharMap cache (body) */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_CACHE_H +#include "ftcmanag.h" +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRUETYPE_IDS_H + +#include "ftccback.h" +#include "ftcerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_cache + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + typedef enum FTC_OldCMapType_ + { + FTC_OLD_CMAP_BY_INDEX = 0, + FTC_OLD_CMAP_BY_ENCODING = 1, + FTC_OLD_CMAP_BY_ID = 2 + + } FTC_OldCMapType; + + + typedef struct FTC_OldCMapIdRec_ + { + FT_UInt platform; + FT_UInt encoding; + + } FTC_OldCMapIdRec, *FTC_OldCMapId; + + + typedef struct FTC_OldCMapDescRec_ + { + FTC_FaceID face_id; + FTC_OldCMapType type; + + union + { + FT_UInt index; + FT_Encoding encoding; + FTC_OldCMapIdRec id; + + } u; + + } FTC_OldCMapDescRec, *FTC_OldCMapDesc; + +#endif /* FT_CONFIG_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* Each FTC_CMapNode contains a simple array to map a range of character */ + /* codes to equivalent glyph indices. */ + /* */ + /* For now, the implementation is very basic: Each node maps a range of */ + /* 128 consecutive character codes to their corresponding glyph indices. */ + /* */ + /* We could do more complex things, but I don't think it is really very */ + /* useful. */ + /* */ + /*************************************************************************/ + + + /* number of glyph indices / character code per node */ +#define FTC_CMAP_INDICES_MAX 128 + + /* compute a query/node hash */ +#define FTC_CMAP_HASH( faceid, index, charcode ) \ + ( FTC_FACE_ID_HASH( faceid ) + 211 * ( index ) + \ + ( (char_code) / FTC_CMAP_INDICES_MAX ) ) + + /* the charmap query */ + typedef struct FTC_CMapQueryRec_ + { + FTC_FaceID face_id; + FT_UInt cmap_index; + FT_UInt32 char_code; + + } FTC_CMapQueryRec, *FTC_CMapQuery; + +#define FTC_CMAP_QUERY( x ) ((FTC_CMapQuery)(x)) +#define FTC_CMAP_QUERY_HASH( x ) \ + FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->char_code ) + + /* the cmap cache node */ + typedef struct FTC_CMapNodeRec_ + { + FTC_NodeRec node; + FTC_FaceID face_id; + FT_UInt cmap_index; + FT_UInt32 first; /* first character in node */ + FT_UInt16 indices[FTC_CMAP_INDICES_MAX]; /* array of glyph indices */ + + } FTC_CMapNodeRec, *FTC_CMapNode; + +#define FTC_CMAP_NODE( x ) ( (FTC_CMapNode)( x ) ) +#define FTC_CMAP_NODE_HASH( x ) \ + FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->first ) + + /* if (indices[n] == FTC_CMAP_UNKNOWN), we assume that the corresponding */ + /* glyph indices haven't been queried through FT_Get_Glyph_Index() yet */ +#define FTC_CMAP_UNKNOWN ( (FT_UInt16)-1 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHARMAP NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( void ) + ftc_cmap_node_free( FTC_Node ftcnode, + FTC_Cache cache ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FT_Memory memory = cache->memory; + + + FT_FREE( node ); + } + + + /* initialize a new cmap node */ + FT_CALLBACK_DEF( FT_Error ) + ftc_cmap_node_new( FTC_Node *ftcanode, + FT_Pointer ftcquery, + FTC_Cache cache ) + { + FTC_CMapNode *anode = (FTC_CMapNode*)ftcanode; + FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; + FT_Error error; + FT_Memory memory = cache->memory; + FTC_CMapNode node; + FT_UInt nn; + + + if ( !FT_NEW( node ) ) + { + node->face_id = query->face_id; + node->cmap_index = query->cmap_index; + node->first = (query->char_code / FTC_CMAP_INDICES_MAX) * + FTC_CMAP_INDICES_MAX; + + for ( nn = 0; nn < FTC_CMAP_INDICES_MAX; nn++ ) + node->indices[nn] = FTC_CMAP_UNKNOWN; + } + + *anode = node; + return error; + } + + + /* compute the weight of a given cmap node */ + FT_CALLBACK_DEF( FT_ULong ) + ftc_cmap_node_weight( FTC_Node cnode, + FTC_Cache cache ) + { + FT_UNUSED( cnode ); + FT_UNUSED( cache ); + + return sizeof ( *cnode ); + } + + + /* compare a cmap node to a given query */ + FT_CALLBACK_DEF( FT_Bool ) + ftc_cmap_node_compare( FTC_Node ftcnode, + FT_Pointer ftcquery, + FTC_Cache cache ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; + FT_UNUSED( cache ); + + + if ( node->face_id == query->face_id && + node->cmap_index == query->cmap_index ) + { + FT_UInt32 offset = (FT_UInt32)( query->char_code - node->first ); + + + return FT_BOOL( offset < FTC_CMAP_INDICES_MAX ); + } + + return 0; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_cmap_node_remove_faceid( FTC_Node ftcnode, + FT_Pointer ftcface_id, + FTC_Cache cache ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FT_UNUSED( cache ); + + return FT_BOOL( node->face_id == face_id ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE CACHE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE_DEF + const FTC_CacheClassRec ftc_cmap_cache_class = + { + ftc_cmap_node_new, + ftc_cmap_node_weight, + ftc_cmap_node_compare, + ftc_cmap_node_remove_faceid, + ftc_cmap_node_free, + + sizeof ( FTC_CacheRec ), + ftc_cache_init, + ftc_cache_done, + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ) + { + return FTC_Manager_RegisterCache( manager, + &ftc_cmap_cache_class, + FTC_CACHE_P( acache ) ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* + * Unfortunately, it is not possible to support binary backwards + * compatibility in the cmap cache. The FTC_CMapCache_Lookup signature + * changes were too deep, and there is no clever hackish way to detect + * what kind of structure we are being passed. + * + * On the other hand it seems that no production code is using this + * function on Unix distributions. + */ + +#endif + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cmap_cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ) + { + FTC_Cache cache = FTC_CACHE( cmap_cache ); + FTC_CMapQueryRec query; + FTC_CMapNode node; + FT_Error error; + FT_UInt gindex = 0; + FT_UInt32 hash; + FT_Int no_cmap_change = 0; + + + if ( cmap_index < 0 ) + { + /* Treat a negative cmap index as a special value, meaning that you */ + /* don't want to change the FT_Face's character map through this */ + /* call. This can be useful if the face requester callback already */ + /* sets the face's charmap to the appropriate value. */ + + no_cmap_change = 1; + cmap_index = 0; + } + + if ( !cache ) + { + FT_ERROR(( "FTC_CMapCache_Lookup: bad arguments, returning 0!\n" )); + return 0; + } + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* + * Detect a call from a rogue client that thinks it is linking + * to FreeType 2.1.7. This is possible because the third parameter + * is then a character code, and we have never seen any font with + * more than a few charmaps, so if the index is very large... + * + * It is also very unlikely that a rogue client is interested + * in Unicode values 0 to 15. + * + * NOTE: The original threshold was 4, but we found a font from the + * Adobe Acrobat Reader Pack, named `KozMinProVI-Regular.otf', + * which contains more than 5 charmaps. + */ + if ( cmap_index >= 16 && !no_cmap_change ) + { + FTC_OldCMapDesc desc = (FTC_OldCMapDesc) face_id; + + + char_code = (FT_UInt32)cmap_index; + query.face_id = desc->face_id; + + + switch ( desc->type ) + { + case FTC_OLD_CMAP_BY_INDEX: + query.cmap_index = desc->u.index; + query.char_code = (FT_UInt32)cmap_index; + break; + + case FTC_OLD_CMAP_BY_ENCODING: + { + FT_Face face; + + + error = FTC_Manager_LookupFace( cache->manager, desc->face_id, + &face ); + if ( error ) + return 0; + + FT_Select_Charmap( face, desc->u.encoding ); + + return FT_Get_Char_Index( face, char_code ); + } + + default: + return 0; + } + } + else + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + { + query.face_id = face_id; + query.cmap_index = (FT_UInt)cmap_index; + query.char_code = char_code; + } + + hash = FTC_CMAP_HASH( face_id, cmap_index, char_code ); + +#if 1 + FTC_CACHE_LOOKUP_CMP( cache, ftc_cmap_node_compare, hash, &query, + node, error ); +#else + error = FTC_Cache_Lookup( cache, hash, &query, (FTC_Node*) &node ); +#endif + if ( error ) + goto Exit; + + FT_ASSERT( (FT_UInt)( char_code - node->first ) < FTC_CMAP_INDICES_MAX ); + + /* something rotten can happen with rogue clients */ + if ( (FT_UInt)( char_code - node->first >= FTC_CMAP_INDICES_MAX ) ) + return 0; + + gindex = node->indices[char_code - node->first]; + if ( gindex == FTC_CMAP_UNKNOWN ) + { + FT_Face face; + + + gindex = 0; + + error = FTC_Manager_LookupFace( cache->manager, node->face_id, &face ); + if ( error ) + goto Exit; + + if ( (FT_UInt)cmap_index < (FT_UInt)face->num_charmaps ) + { + FT_CharMap old, cmap = NULL; + + + old = face->charmap; + cmap = face->charmaps[cmap_index]; + + if ( old != cmap && !no_cmap_change ) + FT_Set_Charmap( face, cmap ); + + gindex = FT_Get_Char_Index( face, char_code ); + + if ( old != cmap && !no_cmap_change ) + FT_Set_Charmap( face, old ); + } + + node->indices[char_code - node->first] = (FT_UShort)gindex; + } + + Exit: + return gindex; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcerror.h b/src/3rdparty/freetype/src/cache/ftcerror.h new file mode 100644 index 0000000000..5998d42daf --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcerror.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* ftcerror.h */ +/* */ +/* Caching sub-system error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the caching sub-system error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __FTCERROR_H__ +#define __FTCERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX FTC_Err_ +#define FT_ERR_BASE FT_Mod_Err_Cache + +#include FT_ERRORS_H + +#endif /* __FTCERROR_H__ */ + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcglyph.c b/src/3rdparty/freetype/src/cache/ftcglyph.c new file mode 100644 index 0000000000..5c03abe055 --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcglyph.c @@ -0,0 +1,211 @@ +/***************************************************************************/ +/* */ +/* ftcglyph.c */ +/* */ +/* FreeType Glyph Image (FT_Glyph) cache (body). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcglyph.h" +#include FT_ERRORS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +#include "ftccback.h" +#include "ftcerror.h" + + + /* create a new chunk node, setting its cache index and ref count */ + FT_LOCAL_DEF( void ) + FTC_GNode_Init( FTC_GNode gnode, + FT_UInt gindex, + FTC_Family family ) + { + gnode->family = family; + gnode->gindex = gindex; + family->num_nodes++; + } + + + FT_LOCAL_DEF( void ) + FTC_GNode_UnselectFamily( FTC_GNode gnode, + FTC_Cache cache ) + { + FTC_Family family = gnode->family; + + + gnode->family = NULL; + if ( family && --family->num_nodes == 0 ) + FTC_FAMILY_FREE( family, cache ); + } + + + FT_LOCAL_DEF( void ) + FTC_GNode_Done( FTC_GNode gnode, + FTC_Cache cache ) + { + /* finalize the node */ + gnode->gindex = 0; + + FTC_GNode_UnselectFamily( gnode, cache ); + } + + + FT_LOCAL_DEF( FT_Bool ) + ftc_gnode_compare( FTC_Node ftcgnode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_GNode gnode = (FTC_GNode)ftcgnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + FT_UNUSED( cache ); + + + return FT_BOOL( gnode->family == gquery->family && + gnode->gindex == gquery->gindex ); + } + + + FT_LOCAL_DEF( FT_Bool ) + FTC_GNode_Compare( FTC_GNode gnode, + FTC_GQuery gquery ) + { + return ftc_gnode_compare( FTC_NODE( gnode ), gquery, NULL ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHUNK SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + FTC_Family_Init( FTC_Family family, + FTC_Cache cache ) + { + FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache ); + + + family->clazz = clazz->family_class; + family->num_nodes = 0; + family->cache = cache; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_gcache_init( FTC_Cache ftccache ) + { + FTC_GCache cache = (FTC_GCache)ftccache; + FT_Error error; + + + error = FTC_Cache_Init( FTC_CACHE( cache ) ); + if ( !error ) + { + FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class; + + FTC_MruList_Init( &cache->families, + clazz->family_class, + 0, /* no maximum here! */ + cache, + FTC_CACHE( cache )->memory ); + } + + return error; + } + + +#if 0 + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_Init( FTC_GCache cache ) + { + return ftc_gcache_init( FTC_CACHE( cache ) ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + ftc_gcache_done( FTC_Cache ftccache ) + { + FTC_GCache cache = (FTC_GCache)ftccache; + + + FTC_Cache_Done( (FTC_Cache)cache ); + FTC_MruList_Done( &cache->families ); + } + + +#if 0 + + FT_LOCAL_DEF( void ) + FTC_GCache_Done( FTC_GCache cache ) + { + ftc_gcache_done( FTC_CACHE( cache ) ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_New( FTC_Manager manager, + FTC_GCacheClass clazz, + FTC_GCache *acache ) + { + return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz, + (FTC_Cache*)acache ); + } + + +#ifndef FTC_INLINE + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_Lookup( FTC_GCache cache, + FT_UInt32 hash, + FT_UInt gindex, + FTC_GQuery query, + FTC_Node *anode ) + { + FT_Error error; + + + query->gindex = gindex; + + FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error ); + if ( !error ) + { + FTC_Family family = query->family; + + + /* prevent the family from being destroyed too early when an */ + /* out-of-memory condition occurs during glyph node initialization. */ + family->num_nodes++; + + error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode ); + + if ( --family->num_nodes == 0 ) + FTC_FAMILY_FREE( family, cache ); + } + return error; + } + +#endif /* !FTC_INLINE */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcglyph.h b/src/3rdparty/freetype/src/cache/ftcglyph.h new file mode 100644 index 0000000000..87a4199bfd --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcglyph.h @@ -0,0 +1,322 @@ +/***************************************************************************/ +/* */ +/* ftcglyph.h */ +/* */ +/* FreeType abstract glyph cache (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + * + * FTC_GCache is an _abstract_ cache object optimized to store glyph + * data. It works as follows: + * + * - It manages FTC_GNode objects. Each one of them can hold one or more + * glyph `items'. Item types are not specified in the FTC_GCache but + * in classes that extend it. + * + * - Glyph attributes, like face ID, character size, render mode, etc., + * can be grouped into abstract `glyph families'. This avoids storing + * the attributes within the FTC_GCache, since it is likely that many + * FTC_GNodes will belong to the same family in typical uses. + * + * - Each FTC_GNode is thus an FTC_Node with two additional fields: + * + * * gindex: A glyph index, or the first index in a glyph range. + * * family: A pointer to a glyph `family'. + * + * - Family types are not fully specific in the FTC_Family type, but + * by classes that extend it. + * + * Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache. + * They share an FTC_Family sub-class called FTC_BasicFamily which is + * used to store the following data: face ID, pixel/point sizes, load + * flags. For more details see the file `src/cache/ftcbasic.c'. + * + * Client applications can extend FTC_GNode with their own FTC_GNode + * and FTC_Family sub-classes to implement more complex caches (e.g., + * handling automatic synthesis, like obliquing & emboldening, colored + * glyphs, etc.). + * + * See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and + * `ftcsbits.h', which both extend FTC_GCache with additional + * optimizations. + * + * A typical FTC_GCache implementation must provide at least the + * following: + * + * - FTC_GNode sub-class, e.g. MyNode, with relevant methods: + * my_node_new (must call FTC_GNode_Init) + * my_node_free (must call FTC_GNode_Done) + * my_node_compare (must call FTC_GNode_Compare) + * my_node_remove_faceid (must call ftc_gnode_unselect in case + * of match) + * + * - FTC_Family sub-class, e.g. MyFamily, with relevant methods: + * my_family_compare + * my_family_init + * my_family_reset (optional) + * my_family_done + * + * - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query + * data. + * + * - Constant structures for a FTC_GNodeClass. + * + * - MyCacheNew() can be implemented easily as a call to the convenience + * function FTC_GCache_New. + * + * - MyCacheLookup with a call to FTC_GCache_Lookup. This function will + * automatically: + * + * - Search for the corresponding family in the cache, or create + * a new one if necessary. Put it in FTC_GQUERY(myquery).family + * + * - Call FTC_Cache_Lookup. + * + * If it returns NULL, you should create a new node, then call + * ftc_cache_add as usual. + */ + + + /*************************************************************************/ + /* */ + /* Important: The functions defined in this file are only used to */ + /* implement an abstract glyph cache class. You need to */ + /* provide additional logic to implement a complete cache. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTCGLYPH_H__ +#define __FTCGLYPH_H__ + + +#include <ft2build.h> +#include "ftcmanag.h" + + +FT_BEGIN_HEADER + + + /* + * We can group glyphs into `families'. Each family correspond to a + * given face ID, character size, transform, etc. + * + * Families are implemented as MRU list nodes. They are + * reference-counted. + */ + + typedef struct FTC_FamilyRec_ + { + FTC_MruNodeRec mrunode; + FT_UInt num_nodes; /* current number of nodes in this family */ + FTC_Cache cache; + FTC_MruListClass clazz; + + } FTC_FamilyRec, *FTC_Family; + +#define FTC_FAMILY(x) ( (FTC_Family)(x) ) +#define FTC_FAMILY_P(x) ( (FTC_Family*)(x) ) + + + typedef struct FTC_GNodeRec_ + { + FTC_NodeRec node; + FTC_Family family; + FT_UInt gindex; + + } FTC_GNodeRec, *FTC_GNode; + +#define FTC_GNODE( x ) ( (FTC_GNode)(x) ) +#define FTC_GNODE_P( x ) ( (FTC_GNode*)(x) ) + + + typedef struct FTC_GQueryRec_ + { + FT_UInt gindex; + FTC_Family family; + + } FTC_GQueryRec, *FTC_GQuery; + +#define FTC_GQUERY( x ) ( (FTC_GQuery)(x) ) + + + /*************************************************************************/ + /* */ + /* These functions are exported so that they can be called from */ + /* user-provided cache classes; otherwise, they are really part of the */ + /* cache sub-system internals. */ + /* */ + + /* must be called by derived FTC_Node_InitFunc routines */ + FT_LOCAL( void ) + FTC_GNode_Init( FTC_GNode node, + FT_UInt gindex, /* glyph index for node */ + FTC_Family family ); + + /* returns TRUE iff the query's glyph index correspond to the node; */ + /* this assumes that the `family' and `hash' fields of the query are */ + /* already correctly set */ + FT_LOCAL( FT_Bool ) + FTC_GNode_Compare( FTC_GNode gnode, + FTC_GQuery gquery ); + + /* call this function to clear a node's family -- this is necessary */ + /* to implement the `node_remove_faceid' cache method correctly */ + FT_LOCAL( void ) + FTC_GNode_UnselectFamily( FTC_GNode gnode, + FTC_Cache cache ); + + /* must be called by derived FTC_Node_DoneFunc routines */ + FT_LOCAL( void ) + FTC_GNode_Done( FTC_GNode node, + FTC_Cache cache ); + + + FT_LOCAL( void ) + FTC_Family_Init( FTC_Family family, + FTC_Cache cache ); + + typedef struct FTC_GCacheRec_ + { + FTC_CacheRec cache; + FTC_MruListRec families; + + } FTC_GCacheRec, *FTC_GCache; + +#define FTC_GCACHE( x ) ((FTC_GCache)(x)) + + +#if 0 + /* can be used as @FTC_Cache_InitFunc */ + FT_LOCAL( FT_Error ) + FTC_GCache_Init( FTC_GCache cache ); +#endif + + +#if 0 + /* can be used as @FTC_Cache_DoneFunc */ + FT_LOCAL( void ) + FTC_GCache_Done( FTC_GCache cache ); +#endif + + + /* the glyph cache class adds fields for the family implementation */ + typedef struct FTC_GCacheClassRec_ + { + FTC_CacheClassRec clazz; + FTC_MruListClass family_class; + + } FTC_GCacheClassRec; + + typedef const FTC_GCacheClassRec* FTC_GCacheClass; + +#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x)) + +#define FTC_CACHE__GCACHE_CLASS( x ) \ + FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class ) +#define FTC_CACHE__FAMILY_CLASS( x ) \ + ( (FTC_MruListClass)FTC_CACHE__GCACHE_CLASS( x )->family_class ) + + + /* convenience function; use it instead of FTC_Manager_Register_Cache */ + FT_LOCAL( FT_Error ) + FTC_GCache_New( FTC_Manager manager, + FTC_GCacheClass clazz, + FTC_GCache *acache ); + +#ifndef FTC_INLINE + FT_LOCAL( FT_Error ) + FTC_GCache_Lookup( FTC_GCache cache, + FT_UInt32 hash, + FT_UInt gindex, + FTC_GQuery query, + FTC_Node *anode ); +#endif + + + /* */ + + +#define FTC_FAMILY_FREE( family, cache ) \ + FTC_MruList_Remove( &FTC_GCACHE((cache))->families, \ + (FTC_MruNode)(family) ) + + +#ifdef FTC_INLINE + +#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ + gindex, query, node, error ) \ + FT_BEGIN_STMNT \ + FTC_GCache _gcache = FTC_GCACHE( cache ); \ + FTC_GQuery _gquery = (FTC_GQuery)( query ); \ + FTC_MruNode_CompareFunc _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \ + \ + \ + _gquery->gindex = (gindex); \ + \ + FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \ + _gquery->family, error ); \ + if ( !error ) \ + { \ + FTC_Family _gqfamily = _gquery->family; \ + \ + \ + _gqfamily->num_nodes++; \ + \ + FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \ + \ + if ( --_gqfamily->num_nodes == 0 ) \ + FTC_FAMILY_FREE( _gqfamily, _gcache ); \ + } \ + FT_END_STMNT + /* */ + +#else /* !FTC_INLINE */ + +#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ + gindex, query, node, error ) \ + FT_BEGIN_STMNT \ + void* _n = &(node); \ + \ + \ + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \ + FTC_GQUERY( query ), (FTC_Node*)_n ); \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ + + +FT_END_HEADER + + +#endif /* __FTCGLYPH_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcimage.c b/src/3rdparty/freetype/src/cache/ftcimage.c new file mode 100644 index 0000000000..15d4e80c8c --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcimage.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* ftcimage.c */ +/* */ +/* FreeType Image cache (body). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcimage.h" +#include FT_INTERNAL_MEMORY_H + +#include "ftccback.h" +#include "ftcerror.h" + + + /* finalize a given glyph image node */ + FT_LOCAL_DEF( void ) + ftc_inode_free( FTC_Node ftcinode, + FTC_Cache cache ) + { + FTC_INode inode = (FTC_INode)ftcinode; + FT_Memory memory = cache->memory; + + + if ( inode->glyph ) + { + FT_Done_Glyph( inode->glyph ); + inode->glyph = NULL; + } + + FTC_GNode_Done( FTC_GNODE( inode ), cache ); + FT_FREE( inode ); + } + + + FT_LOCAL_DEF( void ) + FTC_INode_Free( FTC_INode inode, + FTC_Cache cache ) + { + ftc_inode_free( FTC_NODE( inode ), cache ); + } + + + /* initialize a new glyph image node */ + FT_LOCAL_DEF( FT_Error ) + FTC_INode_New( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + FTC_INode inode; + + + if ( !FT_NEW( inode ) ) + { + FTC_GNode gnode = FTC_GNODE( inode ); + FTC_Family family = gquery->family; + FT_UInt gindex = gquery->gindex; + FTC_IFamilyClass clazz = FTC_CACHE__IFAMILY_CLASS( cache ); + + + /* initialize its inner fields */ + FTC_GNode_Init( gnode, gindex, family ); + + /* we will now load the glyph image */ + error = clazz->family_load_glyph( family, gindex, cache, + &inode->glyph ); + if ( error ) + { + FTC_INode_Free( inode, cache ); + inode = NULL; + } + } + + *pinode = inode; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_inode_new( FTC_Node *ftcpinode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_INode *pinode = (FTC_INode*)ftcpinode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + + + return FTC_INode_New( pinode, gquery, cache ); + } + + + FT_LOCAL_DEF( FT_ULong ) + ftc_inode_weight( FTC_Node ftcinode, + FTC_Cache ftccache ) + { + FTC_INode inode = (FTC_INode)ftcinode; + FT_ULong size = 0; + FT_Glyph glyph = inode->glyph; + + FT_UNUSED( ftccache ); + + + switch ( glyph->format ) + { + case FT_GLYPH_FORMAT_BITMAP: + { + FT_BitmapGlyph bitg; + + + bitg = (FT_BitmapGlyph)glyph; + size = bitg->bitmap.rows * ft_labs( bitg->bitmap.pitch ) + + sizeof ( *bitg ); + } + break; + + case FT_GLYPH_FORMAT_OUTLINE: + { + FT_OutlineGlyph outg; + + + outg = (FT_OutlineGlyph)glyph; + size = outg->outline.n_points * + ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) + + outg->outline.n_contours * sizeof ( FT_Short ) + + sizeof ( *outg ); + } + break; + + default: + ; + } + + size += sizeof ( *inode ); + return size; + } + + +#if 0 + + FT_LOCAL_DEF( FT_ULong ) + FTC_INode_Weight( FTC_INode inode ) + { + return ftc_inode_weight( FTC_NODE( inode ), NULL ); + } + +#endif /* 0 */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcimage.h b/src/3rdparty/freetype/src/cache/ftcimage.h new file mode 100644 index 0000000000..20d5d3e07d --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcimage.h @@ -0,0 +1,107 @@ +/***************************************************************************/ +/* */ +/* ftcimage.h */ +/* */ +/* FreeType Generic Image cache (specification) */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + * FTC_ICache is an _abstract_ cache used to store a single FT_Glyph + * image per cache node. + * + * FTC_ICache extends FTC_GCache. For an implementation example, + * see FTC_ImageCache in `src/cache/ftbasic.c'. + */ + + + /*************************************************************************/ + /* */ + /* Each image cache really manages FT_Glyph objects. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCIMAGE_H__ +#define __FTCIMAGE_H__ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcglyph.h" + +FT_BEGIN_HEADER + + + /* the FT_Glyph image node type - we store only 1 glyph per node */ + typedef struct FTC_INodeRec_ + { + FTC_GNodeRec gnode; + FT_Glyph glyph; + + } FTC_INodeRec, *FTC_INode; + +#define FTC_INODE( x ) ( (FTC_INode)( x ) ) +#define FTC_INODE_GINDEX( x ) FTC_GNODE(x)->gindex +#define FTC_INODE_FAMILY( x ) FTC_GNODE(x)->family + + typedef FT_Error + (*FTC_IFamily_LoadGlyphFunc)( FTC_Family family, + FT_UInt gindex, + FTC_Cache cache, + FT_Glyph *aglyph ); + + typedef struct FTC_IFamilyClassRec_ + { + FTC_MruListClassRec clazz; + FTC_IFamily_LoadGlyphFunc family_load_glyph; + + } FTC_IFamilyClassRec; + + typedef const FTC_IFamilyClassRec* FTC_IFamilyClass; + +#define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(x)) + +#define FTC_CACHE__IFAMILY_CLASS( x ) \ + FTC_IFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS(x)->family_class ) + + + /* can be used as a @FTC_Node_FreeFunc */ + FT_LOCAL( void ) + FTC_INode_Free( FTC_INode inode, + FTC_Cache cache ); + + /* Can be used as @FTC_Node_NewFunc. `gquery.index' and `gquery.family' + * must be set correctly. This function will call the `family_load_glyph' + * method to load the FT_Glyph into the cache node. + */ + FT_LOCAL( FT_Error ) + FTC_INode_New( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ); + +#if 0 + /* can be used as @FTC_Node_WeightFunc */ + FT_LOCAL( FT_ULong ) + FTC_INode_Weight( FTC_INode inode ); +#endif + + + /* */ + +FT_END_HEADER + +#endif /* __FTCIMAGE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcmanag.c b/src/3rdparty/freetype/src/cache/ftcmanag.c new file mode 100644 index 0000000000..4d44094ce3 --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcmanag.c @@ -0,0 +1,733 @@ +/***************************************************************************/ +/* */ +/* ftcmanag.c */ +/* */ +/* FreeType Cache Manager (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcmanag.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_SIZES_H + +#include "ftccback.h" +#include "ftcerror.h" + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_cache + +#define FTC_LRU_GET_MANAGER( lru ) ( (FTC_Manager)(lru)->user_data ) + + + static FT_Error + ftc_scaler_lookup_size( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ) + { + FT_Face face; + FT_Size size = NULL; + FT_Error error; + + + error = FTC_Manager_LookupFace( manager, scaler->face_id, &face ); + if ( error ) + goto Exit; + + error = FT_New_Size( face, &size ); + if ( error ) + goto Exit; + + FT_Activate_Size( size ); + + if ( scaler->pixel ) + error = FT_Set_Pixel_Sizes( face, scaler->width, scaler->height ); + else + error = FT_Set_Char_Size( face, scaler->width, scaler->height, + scaler->x_res, scaler->y_res ); + if ( error ) + { + FT_Done_Size( size ); + size = NULL; + } + + Exit: + *asize = size; + return error; + } + + + typedef struct FTC_SizeNodeRec_ + { + FTC_MruNodeRec node; + FT_Size size; + FTC_ScalerRec scaler; + + } FTC_SizeNodeRec, *FTC_SizeNode; + + + FT_CALLBACK_DEF( void ) + ftc_size_node_done( FTC_MruNode ftcnode, + FT_Pointer data ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FT_Size size = node->size; + FT_UNUSED( data ); + + + if ( size ) + FT_Done_Size( size ); + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_size_node_compare( FTC_MruNode ftcnode, + FT_Pointer ftcscaler ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Scaler scaler0 = &node->scaler; + + + if ( FTC_SCALER_COMPARE( scaler0, scaler ) ) + { + FT_Activate_Size( node->size ); + return 1; + } + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_init( FTC_MruNode ftcnode, + FT_Pointer ftcscaler, + FT_Pointer ftcmanager ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + node->scaler = scaler[0]; + + return ftc_scaler_lookup_size( manager, scaler, &node->size ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_reset( FTC_MruNode ftcnode, + FT_Pointer ftcscaler, + FT_Pointer ftcmanager ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + FT_Done_Size( node->size ); + + node->scaler = scaler[0]; + + return ftc_scaler_lookup_size( manager, scaler, &node->size ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_MruListClassRec ftc_size_list_class = + { + sizeof ( FTC_SizeNodeRec ), + ftc_size_node_compare, + ftc_size_node_init, + ftc_size_node_reset, + ftc_size_node_done + }; + + + /* helper function used by ftc_face_node_done */ + static FT_Bool + ftc_size_node_compare_faceid( FTC_MruNode ftcnode, + FT_Pointer ftcface_id ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + + + return FT_BOOL( node->scaler.face_id == face_id ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ) + { + FT_Error error; + FTC_SizeNode node; + + + if ( asize == NULL ) + return FTC_Err_Invalid_Argument; + + *asize = NULL; + + if ( !manager ) + return FTC_Err_Invalid_Cache_Handle; + +#ifdef FTC_INLINE + + FTC_MRULIST_LOOKUP_CMP( &manager->sizes, scaler, ftc_size_node_compare, + node, error ); + +#else + error = FTC_MruList_Lookup( &manager->sizes, scaler, (FTC_MruNode*)&node ); +#endif + + if ( !error ) + *asize = node->size; + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE MRU IMPLEMENTATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FTC_FaceNodeRec_ + { + FTC_MruNodeRec node; + FTC_FaceID face_id; + FT_Face face; + + } FTC_FaceNodeRec, *FTC_FaceNode; + + + FT_CALLBACK_DEF( FT_Error ) + ftc_face_node_init( FTC_MruNode ftcnode, + FT_Pointer ftcface_id, + FT_Pointer ftcmanager ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FTC_Manager manager = (FTC_Manager)ftcmanager; + FT_Error error; + + + node->face_id = face_id; + + error = manager->request_face( face_id, + manager->library, + manager->request_data, + &node->face ); + if ( !error ) + { + /* destroy initial size object; it will be re-created later */ + if ( node->face->size ) + FT_Done_Size( node->face->size ); + } + + return error; + } + + + FT_CALLBACK_DEF( void ) + ftc_face_node_done( FTC_MruNode ftcnode, + FT_Pointer ftcmanager ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + /* we must begin by removing all scalers for the target face */ + /* from the manager's list */ + FTC_MruList_RemoveSelection( &manager->sizes, + ftc_size_node_compare_faceid, + node->face_id ); + + /* all right, we can discard the face now */ + FT_Done_Face( node->face ); + node->face = NULL; + node->face_id = NULL; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_face_node_compare( FTC_MruNode ftcnode, + FT_Pointer ftcface_id ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + + + return FT_BOOL( node->face_id == face_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_MruListClassRec ftc_face_list_class = + { + sizeof ( FTC_FaceNodeRec), + + ftc_face_node_compare, + ftc_face_node_init, + 0, /* FTC_MruNode_ResetFunc */ + ftc_face_node_done + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ) + { + FT_Error error; + FTC_FaceNode node; + + + if ( aface == NULL ) + return FTC_Err_Invalid_Argument; + + *aface = NULL; + + if ( !manager ) + return FTC_Err_Invalid_Cache_Handle; + + /* we break encapsulation for the sake of speed */ +#ifdef FTC_INLINE + + FTC_MRULIST_LOOKUP_CMP( &manager->faces, face_id, ftc_face_node_compare, + node, error ); + +#else + error = FTC_MruList_Lookup( &manager->faces, face_id, (FTC_MruNode*)&node ); +#endif + + if ( !error ) + *aface = node->face; + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ) + { + FT_Error error; + FT_Memory memory; + FTC_Manager manager = 0; + + + if ( !library ) + return FTC_Err_Invalid_Library_Handle; + + memory = library->memory; + + if ( FT_NEW( manager ) ) + goto Exit; + + if ( max_faces == 0 ) + max_faces = FTC_MAX_FACES_DEFAULT; + + if ( max_sizes == 0 ) + max_sizes = FTC_MAX_SIZES_DEFAULT; + + if ( max_bytes == 0 ) + max_bytes = FTC_MAX_BYTES_DEFAULT; + + manager->library = library; + manager->memory = memory; + manager->max_weight = max_bytes; + + manager->request_face = requester; + manager->request_data = req_data; + + FTC_MruList_Init( &manager->faces, + &ftc_face_list_class, + max_faces, + manager, + memory ); + + FTC_MruList_Init( &manager->sizes, + &ftc_size_list_class, + max_sizes, + manager, + memory ); + + *amanager = manager; + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_Done( FTC_Manager manager ) + { + FT_Memory memory; + FT_UInt idx; + + + if ( !manager || !manager->library ) + return; + + memory = manager->memory; + + /* now discard all caches */ + for (idx = manager->num_caches; idx-- > 0; ) + { + FTC_Cache cache = manager->caches[idx]; + + + if ( cache ) + { + cache->clazz.cache_done( cache ); + FT_FREE( cache ); + manager->caches[idx] = NULL; + } + } + manager->num_caches = 0; + + /* discard faces and sizes */ + FTC_MruList_Done( &manager->sizes ); + FTC_MruList_Done( &manager->faces ); + + manager->library = NULL; + manager->memory = NULL; + + FT_FREE( manager ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_Reset( FTC_Manager manager ) + { + if ( manager ) + { + FTC_MruList_Reset( &manager->sizes ); + FTC_MruList_Reset( &manager->faces ); + } + /* XXX: FIXME: flush the caches? */ + } + + +#ifdef FT_DEBUG_ERROR + + static void + FTC_Manager_Check( FTC_Manager manager ) + { + FTC_Node node, first; + + + first = manager->nodes_list; + + /* check node weights */ + if ( first ) + { + FT_ULong weight = 0; + + + node = first; + + do + { + FTC_Cache cache = manager->caches[node->cache_index]; + + + if ( (FT_UInt)node->cache_index >= manager->num_caches ) + FT_ERROR(( "FTC_Manager_Check: invalid node (cache index = %ld\n", + node->cache_index )); + else + weight += cache->clazz.node_weight( node, cache ); + + node = FTC_NODE__NEXT( node ); + + } while ( node != first ); + + if ( weight != manager->cur_weight ) + FT_ERROR(( "FTC_Manager_Check: invalid weight %ld instead of %ld\n", + manager->cur_weight, weight )); + } + + /* check circular list */ + if ( first ) + { + FT_UFast count = 0; + + + node = first; + do + { + count++; + node = FTC_NODE__NEXT( node ); + + } while ( node != first ); + + if ( count != manager->num_nodes ) + FT_ERROR(( + "FTC_Manager_Check: invalid cache node count %d instead of %d\n", + manager->num_nodes, count )); + } + } + +#endif /* FT_DEBUG_ERROR */ + + + /* `Compress' the manager's data, i.e., get rid of old cache nodes */ + /* that are not referenced anymore in order to limit the total */ + /* memory used by the cache. */ + + /* documentation is in ftcmanag.h */ + + FT_LOCAL_DEF( void ) + FTC_Manager_Compress( FTC_Manager manager ) + { + FTC_Node node, first; + + + if ( !manager ) + return; + + first = manager->nodes_list; + +#ifdef FT_DEBUG_ERROR + FTC_Manager_Check( manager ); + + FT_ERROR(( "compressing, weight = %ld, max = %ld, nodes = %d\n", + manager->cur_weight, manager->max_weight, + manager->num_nodes )); +#endif + + if ( manager->cur_weight < manager->max_weight || first == NULL ) + return; + + /* go to last node -- it's a circular list */ + node = FTC_NODE__PREV( first ); + do + { + FTC_Node prev; + + + prev = ( node == first ) ? NULL : FTC_NODE__PREV( node ); + + if ( node->ref_count <= 0 ) + ftc_node_destroy( node, manager ); + + node = prev; + + } while ( node && manager->cur_weight > manager->max_weight ); + } + + + /* documentation is in ftcmanag.h */ + + FT_LOCAL_DEF( FT_Error ) + FTC_Manager_RegisterCache( FTC_Manager manager, + FTC_CacheClass clazz, + FTC_Cache *acache ) + { + FT_Error error = FTC_Err_Invalid_Argument; + FTC_Cache cache = NULL; + + + if ( manager && clazz && acache ) + { + FT_Memory memory = manager->memory; + + + if ( manager->num_caches >= FTC_MAX_CACHES ) + { + error = FTC_Err_Too_Many_Caches; + FT_ERROR(( "%s: too many registered caches\n", + "FTC_Manager_Register_Cache" )); + goto Exit; + } + + if ( !FT_ALLOC( cache, clazz->cache_size ) ) + { + cache->manager = manager; + cache->memory = memory; + cache->clazz = clazz[0]; + cache->org_class = clazz; + + /* THIS IS VERY IMPORTANT! IT WILL WRETCH THE MANAGER */ + /* IF IT IS NOT SET CORRECTLY */ + cache->index = manager->num_caches; + + error = clazz->cache_init( cache ); + if ( error ) + { + clazz->cache_done( cache ); + FT_FREE( cache ); + goto Exit; + } + + manager->caches[manager->num_caches++] = cache; + } + } + + Exit: + if ( acache ) + *acache = cache; + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + FTC_Manager_FlushN( FTC_Manager manager, + FT_UInt count ) + { + FTC_Node first = manager->nodes_list; + FTC_Node node; + FT_UInt result; + + + /* try to remove `count' nodes from the list */ + if ( first == NULL ) /* empty list! */ + return 0; + + /* go to last node - it's a circular list */ + node = FTC_NODE__PREV(first); + for ( result = 0; result < count; ) + { + FTC_Node prev = FTC_NODE__PREV( node ); + + + /* don't touch locked nodes */ + if ( node->ref_count <= 0 ) + { + ftc_node_destroy( node, manager ); + result++; + } + + if ( node == first ) + break; + + node = prev; + } + return result; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ) + { + FT_UInt nn; + + /* this will remove all FTC_SizeNode that correspond to + * the face_id as well + */ + FTC_MruList_RemoveSelection( &manager->faces, NULL, face_id ); + + for ( nn = 0; nn < manager->num_caches; nn++ ) + FTC_Cache_RemoveFaceID( manager->caches[nn], face_id ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ) + { + if ( node && (FT_UInt)node->cache_index < manager->num_caches ) + node->ref_count--; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ) + { + return FTC_Manager_LookupFace( manager, face_id, aface ); + } + + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ) + { + FTC_ScalerRec scaler; + FT_Error error; + FT_Size size; + FT_Face face; + + + scaler.face_id = font->face_id; + scaler.width = font->pix_width; + scaler.height = font->pix_height; + scaler.pixel = TRUE; + scaler.x_res = 0; + scaler.y_res = 0; + + error = FTC_Manager_LookupSize( manager, &scaler, &size ); + if ( error ) + { + face = NULL; + size = NULL; + } + else + face = size->face; + + if ( aface ) + *aface = face; + + if ( asize ) + *asize = size; + + return error; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcmanag.h b/src/3rdparty/freetype/src/cache/ftcmanag.h new file mode 100644 index 0000000000..3fdc2c773b --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcmanag.h @@ -0,0 +1,175 @@ +/***************************************************************************/ +/* */ +/* ftcmanag.h */ +/* */ +/* FreeType Cache Manager (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* A cache manager is in charge of the following: */ + /* */ + /* - Maintain a mapping between generic FTC_FaceIDs and live FT_Face */ + /* objects. The mapping itself is performed through a user-provided */ + /* callback. However, the manager maintains a small cache of FT_Face */ + /* and FT_Size objects in order to speed up things considerably. */ + /* */ + /* - Manage one or more cache objects. Each cache is in charge of */ + /* holding a varying number of `cache nodes'. Each cache node */ + /* represents a minimal amount of individually accessible cached */ + /* data. For example, a cache node can be an FT_Glyph image */ + /* containing a vector outline, or some glyph metrics, or anything */ + /* else. */ + /* */ + /* Each cache node has a certain size in bytes that is added to the */ + /* total amount of `cache memory' within the manager. */ + /* */ + /* All cache nodes are located in a global LRU list, where the oldest */ + /* node is at the tail of the list. */ + /* */ + /* Each node belongs to a single cache, and includes a reference */ + /* count to avoid destroying it (due to caching). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTCMANAG_H__ +#define __FTCMANAG_H__ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcmru.h" +#include "ftccache.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + +#define FTC_MAX_FACES_DEFAULT 2 +#define FTC_MAX_SIZES_DEFAULT 4 +#define FTC_MAX_BYTES_DEFAULT 200000L /* ~200kByte by default */ + + /* maximum number of caches registered in a single manager */ +#define FTC_MAX_CACHES 16 + + + typedef struct FTC_ManagerRec_ + { + FT_Library library; + FT_Memory memory; + + FTC_Node nodes_list; + FT_ULong max_weight; + FT_ULong cur_weight; + FT_UInt num_nodes; + + FTC_Cache caches[FTC_MAX_CACHES]; + FT_UInt num_caches; + + FTC_MruListRec faces; + FTC_MruListRec sizes; + + FT_Pointer request_data; + FTC_Face_Requester request_face; + + } FTC_ManagerRec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Compress */ + /* */ + /* <Description> */ + /* This function is used to check the state of the cache manager if */ + /* its `num_bytes' field is greater than its `max_bytes' field. It */ + /* will flush as many old cache nodes as possible (ignoring cache */ + /* nodes with a non-zero reference count). */ + /* */ + /* <InOut> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* <Note> */ + /* Client applications should not call this function directly. It is */ + /* normally invoked by specific cache implementations. */ + /* */ + /* The reason this function is exported is to allow client-specific */ + /* cache classes. */ + /* */ + FT_LOCAL( void ) + FTC_Manager_Compress( FTC_Manager manager ); + + + /* try to flush `count' old nodes from the cache; return the number + * of really flushed nodes + */ + FT_LOCAL( FT_UInt ) + FTC_Manager_FlushN( FTC_Manager manager, + FT_UInt count ); + + + /* this must be used internally for the moment */ + FT_LOCAL( FT_Error ) + FTC_Manager_RegisterCache( FTC_Manager manager, + FTC_CacheClass clazz, + FTC_Cache *acache ); + + /* */ + +#define FTC_SCALER_COMPARE( a, b ) \ + ( (a)->face_id == (b)->face_id && \ + (a)->width == (b)->width && \ + (a)->height == (b)->height && \ + ((a)->pixel != 0) == ((b)->pixel != 0) && \ + ( (a)->pixel || \ + ( (a)->x_res == (b)->x_res && \ + (a)->y_res == (b)->y_res ) ) ) + +#define FTC_SCALER_HASH( q ) \ + ( FTC_FACE_ID_HASH( (q)->face_id ) + \ + (q)->width + (q)->height*7 + \ + ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) ) + + /* */ + +FT_END_HEADER + +#endif /* __FTCMANAG_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcmru.c b/src/3rdparty/freetype/src/cache/ftcmru.c new file mode 100644 index 0000000000..3a6c625afa --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcmru.c @@ -0,0 +1,357 @@ +/***************************************************************************/ +/* */ +/* ftcmru.c */ +/* */ +/* FreeType MRU support (body). */ +/* */ +/* Copyright 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcmru.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +#include "ftcerror.h" + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Prepend( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + + + if ( first ) + { + FTC_MruNode last = first->prev; + + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + + + do + { + if ( cnode == node ) + { + fprintf( stderr, "FTC_MruNode_Prepend: invalid action!\n" ); + exit( 2 ); + } + cnode = cnode->next; + + } while ( cnode != first ); + } +#endif + + first->prev = node; + last->next = node; + node->next = first; + node->prev = last; + } + else + { + node->next = node; + node->prev = node; + } + *plist = node; + } + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Up( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + + + FT_ASSERT( first != NULL ); + + if ( first != node ) + { + FTC_MruNode prev, next, last; + + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + do + { + if ( cnode == node ) + goto Ok; + cnode = cnode->next; + + } while ( cnode != first ); + + fprintf( stderr, "FTC_MruNode_Up: invalid action!\n" ); + exit( 2 ); + Ok: + } +#endif + prev = node->prev; + next = node->next; + + prev->next = next; + next->prev = prev; + + last = first->prev; + + last->next = node; + first->prev = node; + + node->next = first; + node->prev = last; + + *plist = node; + } + } + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Remove( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + FTC_MruNode prev, next; + + + FT_ASSERT( first != NULL ); + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + + + do + { + if ( cnode == node ) + goto Ok; + cnode = cnode->next; + + } while ( cnode != first ); + + fprintf( stderr, "FTC_MruNode_Remove: invalid action!\n" ); + exit( 2 ); + Ok: + } +#endif + + prev = node->prev; + next = node->next; + + prev->next = next; + next->prev = prev; + + if ( node == next ) + { + FT_ASSERT( first == node ); + FT_ASSERT( prev == node ); + + *plist = NULL; + } + else if ( node == first ) + *plist = next; + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Init( FTC_MruList list, + FTC_MruListClass clazz, + FT_UInt max_nodes, + FT_Pointer data, + FT_Memory memory ) + { + list->num_nodes = 0; + list->max_nodes = max_nodes; + list->nodes = NULL; + list->clazz = *clazz; + list->data = data; + list->memory = memory; + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Reset( FTC_MruList list ) + { + while ( list->nodes ) + FTC_MruList_Remove( list, list->nodes ); + + FT_ASSERT( list->num_nodes == 0 ); + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Done( FTC_MruList list ) + { + FTC_MruList_Reset( list ); + } + + +#ifndef FTC_INLINE + FT_LOCAL_DEF( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ) + { + FTC_MruNode_CompareFunc compare = list->clazz.node_compare; + FTC_MruNode first, node; + + + first = list->nodes; + node = NULL; + + if ( first ) + { + node = first; + do + { + if ( compare( node, key ) ) + { + if ( node != first ) + FTC_MruNode_Up( &list->nodes, node ); + + return node; + } + + node = node->next; + + } while ( node != first); + } + + return NULL; + } +#endif + + FT_LOCAL_DEF( FT_Error ) + FTC_MruList_New( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ) + { + FT_Error error; + FTC_MruNode node; + FT_Memory memory = list->memory; + + + if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 ) + { + node = list->nodes->prev; + + FT_ASSERT( node ); + + if ( list->clazz.node_reset ) + { + FTC_MruNode_Up( &list->nodes, node ); + + error = list->clazz.node_reset( node, key, list->data ); + if ( !error ) + goto Exit; + } + + FTC_MruNode_Remove( &list->nodes, node ); + list->num_nodes--; + + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + } + else if ( FT_ALLOC( node, list->clazz.node_size ) ) + goto Exit; + + error = list->clazz.node_init( node, key, list->data ); + if ( error ) + goto Fail; + + FTC_MruNode_Prepend( &list->nodes, node ); + list->num_nodes++; + + Exit: + *anode = node; + return error; + + Fail: + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + + FT_FREE( node ); + goto Exit; + } + + +#ifndef FTC_INLINE + FT_LOCAL_DEF( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ) + { + FTC_MruNode node; + + + node = FTC_MruList_Find( list, key ); + if ( node == NULL ) + return FTC_MruList_New( list, key, anode ); + + *anode = node; + return 0; + } +#endif /* FTC_INLINE */ + + FT_LOCAL_DEF( void ) + FTC_MruList_Remove( FTC_MruList list, + FTC_MruNode node ) + { + FTC_MruNode_Remove( &list->nodes, node ); + list->num_nodes--; + + { + FT_Memory memory = list->memory; + + + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + + FT_FREE( node ); + } + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_RemoveSelection( FTC_MruList list, + FTC_MruNode_CompareFunc selection, + FT_Pointer key ) + { + FTC_MruNode first, node, next; + + + first = list->nodes; + while ( first && ( selection == NULL || selection( first, key ) ) ) + { + FTC_MruList_Remove( list, first ); + first = list->nodes; + } + + if ( first ) + { + node = first->next; + while ( node != first ) + { + next = node->next; + + if ( selection( node, key ) ) + FTC_MruList_Remove( list, node ); + + node = next; + } + } + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcmru.h b/src/3rdparty/freetype/src/cache/ftcmru.h new file mode 100644 index 0000000000..c8f0c6ef6e --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcmru.h @@ -0,0 +1,247 @@ +/***************************************************************************/ +/* */ +/* ftcmru.h */ +/* */ +/* Simple MRU list-cache (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* An MRU is a list that cannot hold more than a certain number of */ + /* elements (`max_elements'). All elements in the list are sorted in */ + /* least-recently-used order, i.e., the `oldest' element is at the tail */ + /* of the list. */ + /* */ + /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */ + /* the list is searched for an element with the corresponding key. If */ + /* it is found, the element is moved to the head of the list and is */ + /* returned. */ + /* */ + /* If no corresponding element is found, the lookup routine will try to */ + /* obtain a new element with the relevant key. If the list is already */ + /* full, the oldest element from the list is discarded and replaced by a */ + /* new one; a new element is added to the list otherwise. */ + /* */ + /* Note that it is possible to pre-allocate the element list nodes. */ + /* This is handy if `max_elements' is sufficiently small, as it saves */ + /* allocations/releases during the lookup process. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCMRU_H__ +#define __FTCMRU_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + +#define xxFT_DEBUG_ERROR +#define FTC_INLINE + +FT_BEGIN_HEADER + + typedef struct FTC_MruNodeRec_* FTC_MruNode; + + typedef struct FTC_MruNodeRec_ + { + FTC_MruNode next; + FTC_MruNode prev; + + } FTC_MruNodeRec; + + + FT_LOCAL( void ) + FTC_MruNode_Prepend( FTC_MruNode *plist, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruNode_Up( FTC_MruNode *plist, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruNode_Remove( FTC_MruNode *plist, + FTC_MruNode node ); + + + typedef struct FTC_MruListRec_* FTC_MruList; + + typedef struct FTC_MruListClassRec_ const * FTC_MruListClass; + + + typedef FT_Bool + (*FTC_MruNode_CompareFunc)( FTC_MruNode node, + FT_Pointer key ); + + typedef FT_Error + (*FTC_MruNode_InitFunc)( FTC_MruNode node, + FT_Pointer key, + FT_Pointer data ); + + typedef FT_Error + (*FTC_MruNode_ResetFunc)( FTC_MruNode node, + FT_Pointer key, + FT_Pointer data ); + + typedef void + (*FTC_MruNode_DoneFunc)( FTC_MruNode node, + FT_Pointer data ); + + + typedef struct FTC_MruListClassRec_ + { + FT_UInt node_size; + FTC_MruNode_CompareFunc node_compare; + FTC_MruNode_InitFunc node_init; + FTC_MruNode_ResetFunc node_reset; + FTC_MruNode_DoneFunc node_done; + + } FTC_MruListClassRec; + + typedef struct FTC_MruListRec_ + { + FT_UInt num_nodes; + FT_UInt max_nodes; + FTC_MruNode nodes; + FT_Pointer data; + FTC_MruListClassRec clazz; + FT_Memory memory; + + } FTC_MruListRec; + + + FT_LOCAL( void ) + FTC_MruList_Init( FTC_MruList list, + FTC_MruListClass clazz, + FT_UInt max_nodes, + FT_Pointer data, + FT_Memory memory ); + + FT_LOCAL( void ) + FTC_MruList_Reset( FTC_MruList list ); + + + FT_LOCAL( void ) + FTC_MruList_Done( FTC_MruList list ); + + + FT_LOCAL( FT_Error ) + FTC_MruList_New( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ); + + FT_LOCAL( void ) + FTC_MruList_Remove( FTC_MruList list, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruList_RemoveSelection( FTC_MruList list, + FTC_MruNode_CompareFunc selection, + FT_Pointer key ); + + +#ifdef FTC_INLINE + +#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error ) \ + FT_BEGIN_STMNT \ + FTC_MruNode* _pfirst = &(list)->nodes; \ + FTC_MruNode_CompareFunc _compare = (FTC_MruNode_CompareFunc)(compare); \ + FTC_MruNode _first, _node, *_pnode; \ + \ + \ + error = 0; \ + _first = *(_pfirst); \ + _node = NULL; \ + \ + if ( _first ) \ + { \ + _node = _first; \ + do \ + { \ + if ( _compare( _node, (key) ) ) \ + { \ + if ( _node != _first ) \ + FTC_MruNode_Up( _pfirst, _node ); \ + \ + _pnode = (FTC_MruNode*)(void*)&(node); \ + *_pnode = _node; \ + goto _MruOk; \ + } \ + _node = _node->next; \ + \ + } while ( _node != _first) ; \ + } \ + \ + error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \ + _MruOk: \ + ; \ + FT_END_STMNT + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error ) + +#else /* !FTC_INLINE */ + + FT_LOCAL( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ); + + FT_LOCAL( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *pnode ); + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) ) + +#endif /* !FTC_INLINE */ + + +#define FTC_MRULIST_LOOP( list, node ) \ + FT_BEGIN_STMNT \ + FTC_MruNode _first = (list)->nodes; \ + \ + \ + if ( _first ) \ + { \ + FTC_MruNode _node = _first; \ + \ + \ + do \ + { \ + *(FTC_MruNode*)&(node) = _node; + + +#define FTC_MRULIST_LOOP_END() \ + _node = _node->next; \ + \ + } while ( _node != _first ); \ + } \ + FT_END_STMNT + + /* */ + +FT_END_HEADER + + +#endif /* __FTCMRU_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcsbits.c b/src/3rdparty/freetype/src/cache/ftcsbits.c new file mode 100644 index 0000000000..72f139d565 --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcsbits.c @@ -0,0 +1,401 @@ +/***************************************************************************/ +/* */ +/* ftcsbits.c */ +/* */ +/* FreeType sbits manager (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcsbits.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_ERRORS_H + +#include "ftccback.h" +#include "ftcerror.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SBIT CACHE NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + ftc_sbit_copy_bitmap( FTC_SBit sbit, + FT_Bitmap* bitmap, + FT_Memory memory ) + { + FT_Error error; + FT_Int pitch = bitmap->pitch; + FT_ULong size; + + + if ( pitch < 0 ) + pitch = -pitch; + + size = (FT_ULong)( pitch * bitmap->rows ); + + if ( !FT_ALLOC( sbit->buffer, size ) ) + FT_MEM_COPY( sbit->buffer, bitmap->buffer, size ); + + return error; + } + + + FT_LOCAL_DEF( void ) + ftc_snode_free( FTC_Node ftcsnode, + FTC_Cache cache ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FTC_SBit sbit = snode->sbits; + FT_UInt count = snode->count; + FT_Memory memory = cache->memory; + + + for ( ; count > 0; sbit++, count-- ) + FT_FREE( sbit->buffer ); + + FTC_GNode_Done( FTC_GNODE( snode ), cache ); + + FT_FREE( snode ); + } + + + FT_LOCAL_DEF( void ) + FTC_SNode_Free( FTC_SNode snode, + FTC_Cache cache ) + { + ftc_snode_free( FTC_NODE( snode ), cache ); + } + + + /* + * This function tries to load a small bitmap within a given FTC_SNode. + * Note that it returns a non-zero error code _only_ in the case of + * out-of-memory condition. For all other errors (e.g., corresponding + * to a bad font file), this function will mark the sbit as `unavailable' + * and return a value of 0. + * + * You should also read the comment within the @ftc_snode_compare + * function below to see how out-of-memory is handled during a lookup. + */ + static FT_Error + ftc_snode_load( FTC_SNode snode, + FTC_Manager manager, + FT_UInt gindex, + FT_ULong *asize ) + { + FT_Error error; + FTC_GNode gnode = FTC_GNODE( snode ); + FTC_Family family = gnode->family; + FT_Memory memory = manager->memory; + FT_Face face; + FTC_SBit sbit; + FTC_SFamilyClass clazz; + + + if ( (FT_UInt)(gindex - gnode->gindex) >= snode->count ) + { + FT_ERROR(( "ftc_snode_load: invalid glyph index" )); + return FTC_Err_Invalid_Argument; + } + + sbit = snode->sbits + ( gindex - gnode->gindex ); + clazz = (FTC_SFamilyClass)family->clazz; + + sbit->buffer = 0; + + error = clazz->family_load_glyph( family, gindex, manager, &face ); + if ( error ) + goto BadGlyph; + + { + FT_Int temp; + FT_GlyphSlot slot = face->glyph; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Int xadvance, yadvance; + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + FT_ERROR(( "%s: glyph loaded didn't return a bitmap!\n", + "ftc_snode_load" )); + goto BadGlyph; + } + + /* Check that our values fit into 8-bit containers! */ + /* If this is not the case, our bitmap is too large */ + /* and we will leave it as `missing' with sbit.buffer = 0 */ + +#define CHECK_CHAR( d ) ( temp = (FT_Char)d, temp == d ) +#define CHECK_BYTE( d ) ( temp = (FT_Byte)d, temp == d ) + + /* horizontal advance in pixels */ + xadvance = ( slot->advance.x + 32 ) >> 6; + yadvance = ( slot->advance.y + 32 ) >> 6; + + if ( !CHECK_BYTE( bitmap->rows ) || + !CHECK_BYTE( bitmap->width ) || + !CHECK_CHAR( bitmap->pitch ) || + !CHECK_CHAR( slot->bitmap_left ) || + !CHECK_CHAR( slot->bitmap_top ) || + !CHECK_CHAR( xadvance ) || + !CHECK_CHAR( yadvance ) ) + goto BadGlyph; + + sbit->width = (FT_Byte)bitmap->width; + sbit->height = (FT_Byte)bitmap->rows; + sbit->pitch = (FT_Char)bitmap->pitch; + sbit->left = (FT_Char)slot->bitmap_left; + sbit->top = (FT_Char)slot->bitmap_top; + sbit->xadvance = (FT_Char)xadvance; + sbit->yadvance = (FT_Char)yadvance; + sbit->format = (FT_Byte)bitmap->pixel_mode; + sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1); + + /* copy the bitmap into a new buffer -- ignore error */ + error = ftc_sbit_copy_bitmap( sbit, bitmap, memory ); + + /* now, compute size */ + if ( asize ) + *asize = FT_ABS( sbit->pitch ) * sbit->height; + + } /* glyph loading successful */ + + /* ignore the errors that might have occurred -- */ + /* we mark unloaded glyphs with `sbit.buffer == 0' */ + /* and `width == 255', `height == 0' */ + /* */ + if ( error && error != FTC_Err_Out_Of_Memory ) + { + BadGlyph: + sbit->width = 255; + sbit->height = 0; + sbit->buffer = NULL; + error = 0; + if ( asize ) + *asize = 0; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + FTC_SNode_New( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + FTC_SNode snode = NULL; + FT_UInt gindex = gquery->gindex; + FTC_Family family = gquery->family; + + FTC_SFamilyClass clazz = FTC_CACHE__SFAMILY_CLASS( cache ); + FT_UInt total; + + + total = clazz->family_get_count( family, cache->manager ); + if ( total == 0 || gindex >= total ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + if ( !FT_NEW( snode ) ) + { + FT_UInt count, start; + + + start = gindex - ( gindex % FTC_SBIT_ITEMS_PER_NODE ); + count = total - start; + if ( count > FTC_SBIT_ITEMS_PER_NODE ) + count = FTC_SBIT_ITEMS_PER_NODE; + + FTC_GNode_Init( FTC_GNODE( snode ), start, family ); + + snode->count = count; + + error = ftc_snode_load( snode, + cache->manager, + gindex, + NULL ); + if ( error ) + { + FTC_SNode_Free( snode, cache ); + snode = NULL; + } + } + + Exit: + *psnode = snode; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_snode_new( FTC_Node *ftcpsnode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_SNode *psnode = (FTC_SNode*)ftcpsnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + + + return FTC_SNode_New( psnode, gquery, cache ); + } + + + FT_LOCAL_DEF( FT_ULong ) + ftc_snode_weight( FTC_Node ftcsnode, + FTC_Cache cache ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FT_UInt count = snode->count; + FTC_SBit sbit = snode->sbits; + FT_Int pitch; + FT_ULong size; + + FT_UNUSED( cache ); + + + FT_ASSERT( snode->count <= FTC_SBIT_ITEMS_PER_NODE ); + + /* the node itself */ + size = sizeof ( *snode ); + + for ( ; count > 0; count--, sbit++ ) + { + if ( sbit->buffer ) + { + pitch = sbit->pitch; + if ( pitch < 0 ) + pitch = -pitch; + + /* add the size of a given glyph image */ + size += pitch * sbit->height; + } + } + + return size; + } + + +#if 0 + + FT_LOCAL_DEF( FT_ULong ) + FTC_SNode_Weight( FTC_SNode snode ) + { + return ftc_snode_weight( FTC_NODE( snode ), NULL ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Bool ) + ftc_snode_compare( FTC_Node ftcsnode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + FTC_GNode gnode = FTC_GNODE( snode ); + FT_UInt gindex = gquery->gindex; + FT_Bool result; + + + result = FT_BOOL( gnode->family == gquery->family && + (FT_UInt)( gindex - gnode->gindex ) < snode->count ); + if ( result ) + { + /* check if we need to load the glyph bitmap now */ + FTC_SBit sbit = snode->sbits + ( gindex - gnode->gindex ); + + + /* + * The following code illustrates what to do when you want to + * perform operations that may fail within a lookup function. + * + * Here, we want to load a small bitmap on-demand; we thus + * need to call the `ftc_snode_load' function which may return + * a non-zero error code only when we are out of memory (OOM). + * + * The correct thing to do is to use @FTC_CACHE_TRYLOOP and + * @FTC_CACHE_TRYLOOP_END in order to implement a retry loop + * that is capable of flushing the cache incrementally when + * an OOM errors occur. + * + * However, we need to `lock' the node before this operation to + * prevent it from being flushed within the loop. + * + * When we exit the loop, we unlock the node, then check the `error' + * variable. If it is non-zero, this means that the cache was + * completely flushed and that no usable memory was found to load + * the bitmap. + * + * We then prefer to return a value of 0 (i.e., NO MATCH). This + * ensures that the caller will try to allocate a new node. + * This operation consequently _fail_ and the lookup function + * returns the appropriate OOM error code. + * + * Note that `buffer == NULL && width == 255' is a hack used to + * tag `unavailable' bitmaps in the array. We should never try + * to load these. + * + */ + + if ( sbit->buffer == NULL && sbit->width != 255 ) + { + FT_ULong size; + FT_Error error; + + + ftcsnode->ref_count++; /* lock node to prevent flushing */ + /* in retry loop */ + + FTC_CACHE_TRYLOOP( cache ) + { + error = ftc_snode_load( snode, cache->manager, gindex, &size ); + } + FTC_CACHE_TRYLOOP_END(); + + ftcsnode->ref_count--; /* unlock the node */ + + if ( error ) + result = 0; + else + cache->manager->cur_weight += size; + } + } + + return result; + } + + + FT_LOCAL_DEF( FT_Bool ) + FTC_SNode_Compare( FTC_SNode snode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + return ftc_snode_compare( FTC_NODE( snode ), gquery, cache ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcsbits.h b/src/3rdparty/freetype/src/cache/ftcsbits.h new file mode 100644 index 0000000000..6261745f1e --- /dev/null +++ b/src/3rdparty/freetype/src/cache/ftcsbits.h @@ -0,0 +1,98 @@ +/***************************************************************************/ +/* */ +/* ftcsbits.h */ +/* */ +/* A small-bitmap cache (specification). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCSBITS_H__ +#define __FTCSBITS_H__ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcglyph.h" + + +FT_BEGIN_HEADER + +#define FTC_SBIT_ITEMS_PER_NODE 16 + + typedef struct FTC_SNodeRec_ + { + FTC_GNodeRec gnode; + FT_UInt count; + FTC_SBitRec sbits[FTC_SBIT_ITEMS_PER_NODE]; + + } FTC_SNodeRec, *FTC_SNode; + + +#define FTC_SNODE( x ) ( (FTC_SNode)( x ) ) +#define FTC_SNODE_GINDEX( x ) FTC_GNODE( x )->gindex +#define FTC_SNODE_FAMILY( x ) FTC_GNODE( x )->family + + typedef FT_UInt + (*FTC_SFamily_GetCountFunc)( FTC_Family family, + FTC_Manager manager ); + + typedef FT_Error + (*FTC_SFamily_LoadGlyphFunc)( FTC_Family family, + FT_UInt gindex, + FTC_Manager manager, + FT_Face *aface ); + + typedef struct FTC_SFamilyClassRec_ + { + FTC_MruListClassRec clazz; + FTC_SFamily_GetCountFunc family_get_count; + FTC_SFamily_LoadGlyphFunc family_load_glyph; + + } FTC_SFamilyClassRec; + + typedef const FTC_SFamilyClassRec* FTC_SFamilyClass; + +#define FTC_SFAMILY_CLASS( x ) ((FTC_SFamilyClass)(x)) + +#define FTC_CACHE__SFAMILY_CLASS( x ) \ + FTC_SFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS( x )->family_class ) + + + FT_LOCAL( void ) + FTC_SNode_Free( FTC_SNode snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + FTC_SNode_New( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ); + +#if 0 + FT_LOCAL( FT_ULong ) + FTC_SNode_Weight( FTC_SNode inode ); +#endif + + + FT_LOCAL( FT_Bool ) + FTC_SNode_Compare( FTC_SNode snode, + FTC_GQuery gquery, + FTC_Cache cache ); + + /* */ + +FT_END_HEADER + +#endif /* __FTCSBITS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cache/rules.mk b/src/3rdparty/freetype/src/cache/rules.mk new file mode 100644 index 0000000000..ed75a6a91f --- /dev/null +++ b/src/3rdparty/freetype/src/cache/rules.mk @@ -0,0 +1,80 @@ +# +# FreeType 2 Cache configuration rules +# + + +# Copyright 2000, 2001, 2003, 2004, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Cache driver directory +# +CACHE_DIR := $(SRC_DIR)/cache + +# compilation flags for the driver +# +CACHE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CACHE_DIR)) + + +# Cache driver sources (i.e., C files) +# +CACHE_DRV_SRC := $(CACHE_DIR)/ftcbasic.c \ + $(CACHE_DIR)/ftccache.c \ + $(CACHE_DIR)/ftccmap.c \ + $(CACHE_DIR)/ftcglyph.c \ + $(CACHE_DIR)/ftcimage.c \ + $(CACHE_DIR)/ftcmanag.c \ + $(CACHE_DIR)/ftcmru.c \ + $(CACHE_DIR)/ftcsbits.c + +# Cache driver headers +# +CACHE_DRV_H := $(CACHE_DIR)/ftccache.h \ + $(CACHE_DIR)/ftccback.h \ + $(CACHE_DIR)/ftcerror.h \ + $(CACHE_DIR)/ftcglyph.h \ + $(CACHE_DIR)/ftcimage.h \ + $(CACHE_DIR)/ftcmanag.h \ + $(CACHE_DIR)/ftcmru.h \ + $(CACHE_DIR)/ftcsbits.h + + +# Cache driver object(s) +# +# CACHE_DRV_OBJ_M is used during `multi' builds. +# CACHE_DRV_OBJ_S is used during `single' builds. +# +CACHE_DRV_OBJ_M := $(CACHE_DRV_SRC:$(CACHE_DIR)/%.c=$(OBJ_DIR)/%.$O) +CACHE_DRV_OBJ_S := $(OBJ_DIR)/ftcache.$O + +# Cache driver source file for single build +# +CACHE_DRV_SRC_S := $(CACHE_DIR)/ftcache.c + + +# Cache driver - single object +# +$(CACHE_DRV_OBJ_S): $(CACHE_DRV_SRC_S) $(CACHE_DRV_SRC) \ + $(FREETYPE_H) $(CACHE_DRV_H) + $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CACHE_DRV_SRC_S)) + + +# Cache driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CACHE_DIR)/%.c $(FREETYPE_H) $(CACHE_DRV_H) + $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CACHE_DRV_OBJ_S) +DRV_OBJS_M += $(CACHE_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/cff/Jamfile b/src/3rdparty/freetype/src/cff/Jamfile new file mode 100644 index 0000000000..6d0bb1b867 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/cff Jamfile +# +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) cff ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap ; + } + else + { + _sources = cff ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/cff Jamfile diff --git a/src/3rdparty/freetype/src/cff/cff.c b/src/3rdparty/freetype/src/cff/cff.c new file mode 100644 index 0000000000..e6d8954c9a --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cff.c @@ -0,0 +1,29 @@ +/***************************************************************************/ +/* */ +/* cff.c */ +/* */ +/* FreeType OpenType driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "cffdrivr.c" +#include "cffparse.c" +#include "cffload.c" +#include "cffobjs.c" +#include "cffgload.c" +#include "cffcmap.c" + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffcmap.c b/src/3rdparty/freetype/src/cff/cffcmap.c new file mode 100644 index 0000000000..578d048bed --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffcmap.c @@ -0,0 +1,224 @@ +/***************************************************************************/ +/* */ +/* cffcmap.c */ +/* */ +/* CFF character mapping table (cmap) support (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "cffcmap.h" +#include "cffload.h" + +#include "cfferrs.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_encoding_init( CFF_CMapStd cmap ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Encoding encoding = &cff->encoding; + + + cmap->gids = encoding->codes; + + return 0; + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_encoding_done( CFF_CMapStd cmap ) + { + cmap->gids = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_encoding_char_index( CFF_CMapStd cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( char_code < 256 ) + result = cmap->gids[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_encoding_char_next( CFF_CMapStd cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + *pchar_code = 0; + + if ( char_code < 255 ) + { + FT_UInt code = (FT_UInt)(char_code + 1); + + + for (;;) + { + if ( code >= 256 ) + break; + + result = cmap->gids[code]; + if ( result != 0 ) + { + *pchar_code = code; + break; + } + + code++; + } + } + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + cff_cmap_encoding_class_rec = + { + sizeof ( CFF_CMapStdRec ), + + (FT_CMap_InitFunc) cff_cmap_encoding_init, + (FT_CMap_DoneFunc) cff_cmap_encoding_done, + (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, + (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char* ) + cff_sid_to_glyph_name( TT_Face face, + FT_UInt idx ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + FT_UInt sid = charset->sids[idx]; + + + return cff_index_get_sid_string( &cff->string_index, sid, psnames ); + } + + + FT_CALLBACK_DEF( void ) + cff_sid_free_glyph_name( TT_Face face, + const char* gname ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( gname ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_unicode_init( PS_Unicodes unicodes ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + /* can't build Unicode map for CID-keyed font */ + if ( !charset->sids ) + return CFF_Err_Invalid_Argument; + + return psnames->unicodes_init( memory, + unicodes, + cff->num_glyphs, + (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, + (PS_FreeGlyphNameFunc)&cff_sid_free_glyph_name, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + cff_cmap_unicode_class_rec = + { + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) cff_cmap_unicode_init, + (FT_CMap_DoneFunc) cff_cmap_unicode_done, + (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, + (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffcmap.h b/src/3rdparty/freetype/src/cff/cffcmap.h new file mode 100644 index 0000000000..3809b85611 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffcmap.h @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* cffcmap.h */ +/* */ +/* CFF character mapping table (cmap) support (specification). */ +/* */ +/* Copyright 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFCMAP_H__ +#define __CFFCMAP_H__ + +#include "cffobjs.h" + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct CFF_CMapStdRec_* CFF_CMapStd; + + typedef struct CFF_CMapStdRec_ + { + FT_CMapRec cmap; + FT_UShort* gids; /* up to 256 elements */ + + } CFF_CMapStdRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + cff_cmap_encoding_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + cff_cmap_unicode_class_rec; + + +FT_END_HEADER + +#endif /* __CFFCMAP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffdrivr.c b/src/3rdparty/freetype/src/cff/cffdrivr.c new file mode 100644 index 0000000000..3dd86f2aa8 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffdrivr.c @@ -0,0 +1,682 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.c */ +/* */ +/* OpenType font driver implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_IDS_H +#include FT_SERVICE_CID_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_TT_CMAP_H + +#include "cffdrivr.h" +#include "cffgload.h" +#include "cffload.h" +#include "cffcmap.h" + +#include "cfferrs.h" + +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_GLYPH_DICT_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#undef PAIR_TAG +#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ + (FT_ULong)right ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_get_kerning */ + /* */ + /* <Description> */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* <Output> */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings, are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + FT_CALLBACK_DEF( FT_Error ) + cff_get_kerning( FT_Face ttface, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face face = (TT_Face)ttface; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + + return CFF_Err_Ok; + } + + +#undef PAIR_TAG + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_Glyph */ + /* */ + /* <Description> */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* <Input> */ + /* slot :: A handle to the target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled, loaded, etc. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_??? constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_CALLBACK_DEF( FT_Error ) + Load_Glyph( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ + FT_Size cffsize, /* CFF_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; + CFF_Size size = (CFF_Size)cffsize; + + + if ( !slot ) + return CFF_Err_Invalid_Slot_Handle; + + /* check whether we want a scaled outline or bitmap */ + if ( !size ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + /* reset the size object if necessary */ + if ( load_flags & FT_LOAD_NO_SCALE ) + size = NULL; + + if ( size ) + { + /* these two objects must have the same parent */ + if ( cffsize->face != cffslot->face ) + return CFF_Err_Invalid_Face_Handle; + } + + /* now load the glyph outline if necessary */ + error = cff_slot_load( slot, size, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ) + { + FT_UInt nn; + FT_Error error = CFF_Err_Ok; + FT_GlyphSlot slot = face->glyph; + + + flags |= FT_LOAD_ADVANCE_ONLY; + + for ( nn = 0; nn < count; nn++ ) + { + error = Load_Glyph( slot, face->size, start + nn, flags ); + if ( error ) + break; + + advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? slot->linearVertAdvance + : slot->linearHoriAdvance; + } + + return error; + } + + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + cff_get_glyph_name( CFF_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + CFF_Font font = (CFF_Font)face->extra.data; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_String* gname; + FT_UShort sid; + FT_Service_PsCMaps psnames; + FT_Error error; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + { + FT_ERROR(( "cff_get_glyph_name:" )); + FT_ERROR(( " cannot get glyph name from CFF & CEF fonts\n" )); + FT_ERROR(( " " )); + FT_ERROR(( " without the `PSNames' module\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + /* first, locate the sid in the charset table */ + sid = font->charset.sids[glyph_index]; + + /* now, lookup the name itself */ + gname = cff_index_get_sid_string( &font->string_index, sid, psnames ); + + if ( gname ) + FT_STRCPYN( buffer, gname, buffer_max ); + + FT_FREE( gname ); + error = CFF_Err_Ok; + + Exit: + return error; + } + + + static FT_UInt + cff_get_name_index( CFF_Face face, + FT_String* glyph_name ) + { + CFF_Font cff; + CFF_Charset charset; + FT_Service_PsCMaps psnames; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_String* name; + FT_UShort sid; + FT_UInt i; + FT_Int result; + + + cff = (CFF_FontRec *)face->extra.data; + charset = &cff->charset; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + return 0; + + for ( i = 0; i < cff->num_glyphs; i++ ) + { + sid = charset->sids[i]; + + if ( sid > 390 ) + name = cff_index_get_name( &cff->string_index, sid - 391 ); + else + name = (FT_String *)psnames->adobe_std_strings( sid ); + + if ( !name ) + continue; + + result = ft_strcmp( glyph_name, name ); + + if ( sid > 390 ) + FT_FREE( name ); + + if ( !result ) + return i; + } + + return 0; + } + + + static const FT_Service_GlyphDictRec cff_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)cff_get_name_index, + }; + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Int + cff_ps_has_glyph_names( FT_Face face ) + { + return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; + } + + + static FT_Error + cff_ps_get_font_info( CFF_Face face, + PS_FontInfoRec* afont_info ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Error error = FT_Err_Ok; + + + if ( cff && cff->font_info == NULL ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + PS_FontInfoRec *font_info; + FT_Memory memory = face->root.memory; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) + goto Fail; + + font_info->version = cff_index_get_sid_string( &cff->string_index, + dict->version, + psnames ); + font_info->notice = cff_index_get_sid_string( &cff->string_index, + dict->notice, + psnames ); + font_info->full_name = cff_index_get_sid_string( &cff->string_index, + dict->full_name, + psnames ); + font_info->family_name = cff_index_get_sid_string( &cff->string_index, + dict->family_name, + psnames ); + font_info->weight = cff_index_get_sid_string( &cff->string_index, + dict->weight, + psnames ); + font_info->italic_angle = dict->italic_angle; + font_info->is_fixed_pitch = dict->is_fixed_pitch; + font_info->underline_position = (FT_Short)dict->underline_position; + font_info->underline_thickness = (FT_Short)dict->underline_thickness; + + cff->font_info = font_info; + } + + if ( cff ) + *afont_info = *cff->font_info; + + Fail: + return error; + } + + + static const FT_Service_PsInfoRec cff_service_ps_info = + { + (PS_GetFontInfoFunc) cff_ps_get_font_info, + (PS_GetFontExtraFunc) NULL, + (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, + (PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */ + }; + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + cff_get_ps_name( CFF_Face face ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + return (const char*)cff->font_name; + } + + + static const FT_Service_PsFontNameRec cff_service_ps_name = + { + (FT_PsName_GetFunc)cff_get_ps_name + }; + + + /* + * TT CMAP INFO + * + * If the charmap is a synthetic Unicode encoding cmap or + * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO + * service defined in SFNT module. + * + * Otherwise call the service function in the sfnt module. + * + */ + static FT_Error + cff_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = FT_CMAP( charmap ); + FT_Error error = CFF_Err_Ok; + + + cmap_info->language = 0; + cmap_info->format = 0; + + if ( cmap->clazz != &cff_cmap_encoding_class_rec && + cmap->clazz != &cff_cmap_unicode_class_rec ) + { + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt = FT_Get_Module( library, "sfnt" ); + FT_Service_TTCMaps service = + (FT_Service_TTCMaps)ft_module_get_service( sfnt, + FT_SERVICE_ID_TT_CMAP ); + + + if ( service && service->get_cmap_info ) + error = service->get_cmap_info( charmap, cmap_info ); + } + + return error; + } + + + static const FT_Service_TTCMapsRec cff_service_get_cmap_info = + { + (TT_CMap_Info_GetFunc)cff_get_cmap_info + }; + + + /* + * CID INFO SERVICE + * + */ + static FT_Error + cff_get_ros( CFF_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + if ( registry ) + { + if ( cff->registry == NULL ) + cff->registry = cff_index_get_sid_string( &cff->string_index, + dict->cid_registry, + psnames ); + *registry = cff->registry; + } + + if ( ordering ) + { + if ( cff->ordering == NULL ) + cff->ordering = cff_index_get_sid_string( &cff->string_index, + dict->cid_ordering, + psnames ); + *ordering = cff->ordering; + } + + if ( supplement ) + *supplement = dict->cid_supplement; + } + + Fail: + return error; + } + + + static FT_Error + cff_get_is_cid( CFF_Face face, + FT_Bool *is_cid ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff = (CFF_Font)face->extra.data; + + + *is_cid = 0; + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry != 0xFFFFU ) + *is_cid = 1; + } + + return error; + } + + + static FT_Error + cff_get_cid_from_glyph_index( CFF_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff; + + + cff = (CFF_Font)face->extra.data; + + if ( cff ) + { + FT_UInt c; + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + if ( glyph_index > cff->num_glyphs ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + c = cff->charset.sids[glyph_index]; + + if ( cid ) + *cid = c; + } + + Fail: + return error; + } + + + static const FT_Service_CIDRec cff_service_cid_info = + { + (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros, + (FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid, + (FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index + }; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + static const FT_ServiceDescRec cff_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cff_service_ps_name }, +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + { FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict }, +#endif + { FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info }, + { FT_SERVICE_ID_CID, &cff_service_cid_info }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + cff_get_interface( FT_Module driver, /* CFF_Driver */ + const char* module_interface ) + { + FT_Module sfnt; + FT_Module_Interface result; + + + result = ft_service_list_lookup( cff_services, module_interface ); + if ( result != NULL ) + return result; + + /* we pass our request to the `sfnt' module */ + sfnt = FT_Get_Module( driver->library, "sfnt" ); + + return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec cff_driver_class = + { + /* begin with the FT_Module_Class fields */ + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof( CFF_DriverRec ), + "cff", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + cff_driver_init, + cff_driver_done, + cff_get_interface, + }, + + /* now the specific driver fields */ + sizeof( TT_FaceRec ), + sizeof( CFF_SizeRec ), + sizeof( CFF_GlyphSlotRec ), + + cff_face_init, + cff_face_done, + cff_size_init, + cff_size_done, + cff_slot_init, + cff_slot_done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + + Load_Glyph, + + cff_get_kerning, + 0, /* FT_Face_AttachFunc */ + cff_get_advances, /* FT_Face_GetAdvancesFunc */ + + cff_size_request, + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + cff_size_select +#else + 0 /* FT_Size_SelectFunc */ +#endif + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffdrivr.h b/src/3rdparty/freetype/src/cff/cffdrivr.h new file mode 100644 index 0000000000..553848c0a9 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffdrivr.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.h */ +/* */ +/* High-level OpenType driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFDRIVER_H__ +#define __CFFDRIVER_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_CALLBACK_TABLE + const FT_Driver_ClassRec cff_driver_class; + + +FT_END_HEADER + +#endif /* __CFFDRIVER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cfferrs.h b/src/3rdparty/freetype/src/cff/cfferrs.h new file mode 100644 index 0000000000..1b2a5c95c8 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cfferrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* cfferrs.h */ +/* */ +/* CFF error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the CFF error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __CFFERRS_H__ +#define __CFFERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX CFF_Err_ +#define FT_ERR_BASE FT_Mod_Err_CFF + + +#include FT_ERRORS_H + +#endif /* __CFFERRS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffgload.c b/src/3rdparty/freetype/src/cff/cffgload.c new file mode 100644 index 0000000000..2718a277b4 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffgload.c @@ -0,0 +1,2818 @@ +/***************************************************************************/ +/* */ +/* cffgload.c */ +/* */ +/* OpenType Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_OUTLINE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + +#include "cffobjs.h" +#include "cffload.h" +#include "cffgload.h" + +#include "cfferrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffgload + + + typedef enum CFF_Operator_ + { + cff_op_unknown = 0, + + cff_op_rmoveto, + cff_op_hmoveto, + cff_op_vmoveto, + + cff_op_rlineto, + cff_op_hlineto, + cff_op_vlineto, + + cff_op_rrcurveto, + cff_op_hhcurveto, + cff_op_hvcurveto, + cff_op_rcurveline, + cff_op_rlinecurve, + cff_op_vhcurveto, + cff_op_vvcurveto, + + cff_op_flex, + cff_op_hflex, + cff_op_hflex1, + cff_op_flex1, + + cff_op_endchar, + + cff_op_hstem, + cff_op_vstem, + cff_op_hstemhm, + cff_op_vstemhm, + + cff_op_hintmask, + cff_op_cntrmask, + cff_op_dotsection, /* deprecated, acts as no-op */ + + cff_op_abs, + cff_op_add, + cff_op_sub, + cff_op_div, + cff_op_neg, + cff_op_random, + cff_op_mul, + cff_op_sqrt, + + cff_op_blend, + + cff_op_drop, + cff_op_exch, + cff_op_index, + cff_op_roll, + cff_op_dup, + + cff_op_put, + cff_op_get, + cff_op_store, + cff_op_load, + + cff_op_and, + cff_op_or, + cff_op_not, + cff_op_eq, + cff_op_ifelse, + + cff_op_callsubr, + cff_op_callgsubr, + cff_op_return, + + /* Type 1 opcodes: invalid but seen in real life */ + cff_op_hsbw, + cff_op_closepath, + cff_op_callothersubr, + cff_op_pop, + + /* do not remove */ + cff_op_max + + } CFF_Operator; + + +#define CFF_COUNT_CHECK_WIDTH 0x80 +#define CFF_COUNT_EXACT 0x40 +#define CFF_COUNT_CLEAR_STACK 0x20 + + /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */ + /* used for checking the width and requested numbers of arguments */ + /* only; they are set to zero afterwards */ + + /* the other two flags are informative only and unused currently */ + + static const FT_Byte cff_argument_counts[] = + { + 0, /* unknown */ + + 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */ + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + + 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 13, /* flex */ + 7, + 9, + 11, + + 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */ + + 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */ + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + + 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */ + 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */ + 0, /* dotsection */ + + 1, /* abs */ + 2, + 2, + 2, + 1, + 0, + 2, + 1, + + 1, /* blend */ + + 1, /* drop */ + 2, + 1, + 2, + 1, + + 2, /* put */ + 1, + 4, + 3, + + 2, /* and */ + 2, + 1, + 2, + 4, + + 1, /* callsubr */ + 1, + 0, + + 2, /* hsbw */ + 0, + 0, + 0 + }; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** GENERIC CHARSTRING PARSING *********/ + /********** *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_builder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph builder. */ + /* */ + /* <InOut> */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting is active. */ + /* */ + static void + cff_builder_init( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->path_begun = 0; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->root.memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->root.internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = 0; + builder->hints_funcs = 0; + + if ( hinting && size ) + { + CFF_Internal internal = (CFF_Internal)size->root.internal; + + + builder->hints_globals = (void *)internal->topfont; + builder->hints_funcs = glyph->root.internal->glyph_hints; + } + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_builder_done */ + /* */ + /* <Description> */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* <Input> */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + static void + cff_builder_done( CFF_Builder* builder ) + { + CFF_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->root.outline = *builder->base; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_compute_bias */ + /* */ + /* <Description> */ + /* Computes the bias value in dependence of the number of glyph */ + /* subroutines. */ + /* */ + /* <Input> */ + /* num_subrs :: The number of glyph subroutines. */ + /* */ + /* <Return> */ + /* The bias value. */ + static FT_Int + cff_compute_bias( FT_UInt num_subrs ) + { + FT_Int result; + + + if ( num_subrs < 1240 ) + result = 107; + else if ( num_subrs < 33900U ) + result = 1131; + else + result = 32768U; + + return result; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_decoder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph decoder. */ + /* */ + /* <InOut> */ + /* decoder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* slot :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting is active. */ + /* */ + /* hint_mode :: The hinting mode. */ + /* */ + FT_LOCAL_DEF( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + /* clear everything */ + FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); + + /* initialize builder */ + cff_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* initialize Type2 decoder */ + decoder->num_globals = cff->num_global_subrs; + decoder->globals = cff->global_subrs; + decoder->globals_bias = cff_compute_bias( decoder->num_globals ); + + decoder->hint_mode = hint_mode; + } + + + /* this function is used to select the subfont */ + /* and the locals subrs array */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ) + { + CFF_Builder *builder = &decoder->builder; + CFF_Font cff = (CFF_Font)builder->face->extra.data; + CFF_SubFont sub = &cff->top_font; + FT_Error error = CFF_Err_Ok; + + + /* manage CID fonts */ + if ( cff->num_subfonts ) + { + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, glyph_index ); + + + if ( fd_index >= cff->num_subfonts ) + { + FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + FT_TRACE4(( "glyph index %d (subfont %d):\n", glyph_index, fd_index )); + + sub = cff->subfonts[fd_index]; + + if ( builder->hints_funcs && size ) + { + CFF_Internal internal = (CFF_Internal)size->root.internal; + + + /* for CFFs without subfonts, this value has already been set */ + builder->hints_globals = (void *)internal->subfonts[fd_index]; + } + } +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE4(( "glyph index %d:\n", glyph_index )); +#endif + + decoder->num_locals = sub->num_local_subrs; + decoder->locals = sub->local_subrs; + decoder->locals_bias = cff_compute_bias( decoder->num_locals ); + + decoder->glyph_width = sub->private_dict.default_width; + decoder->nominal_width = sub->private_dict.nominal_width; + + Exit: + return error; + } + + + /* check that there is enough space for `count' more points */ + static FT_Error + check_points( CFF_Builder* builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + static void + cff_builder_add_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + + + point->x = x >> 16; + point->y = y >> 16; + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + + builder->last = *point; + } + + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + static FT_Error + cff_builder_add_point1( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = check_points( builder, 1 ); + if ( !error ) + cff_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + static FT_Error + cff_builder_add_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + if ( !builder->load_points ) + { + outline->n_contours++; + return CFF_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + static FT_Error + cff_builder_start_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = CFF_Err_Ok; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + error = cff_builder_add_contour( builder ); + if ( !error ) + error = cff_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + static void + cff_builder_close_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + + + if ( !outline ) + return; + + /* XXXX: We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Int first = 0; + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + if ( outline->n_contours > 1 ) + { + first = outline->contours[outline->n_contours - 2] + 1; + p1 = outline->points + first; + } + + /* `delete' last point only if it coincides with the first */ + /* point and if it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + + + static FT_Int + cff_lookup_glyph_by_stdcharcode( CFF_Font cff, + FT_Int charcode ) + { + FT_UInt n; + FT_UShort glyph_sid; + + + /* CID-keyed fonts don't have glyph names */ + if ( !cff->charset.sids ) + return -1; + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + /* Get code to SID mapping from `cff_standard_encoding'. */ + glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode ); + + for ( n = 0; n < cff->num_glyphs; n++ ) + { + if ( cff->charset.sids[n] == glyph_sid ) + return n; + } + + return -1; + } + + + static FT_Error + cff_get_glyph_data( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + FT_Error error = + face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &data ); + + + *pointer = (FT_Byte*)data.pointer; + *length = data.length; + + return error; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + return cff_index_access_element( &cff->charstrings_index, glyph_index, + pointer, length ); + } + } + + + static void + cff_free_glyph_data( TT_Face face, + FT_Byte** pointer, + FT_ULong length ) + { +#ifndef FT_CONFIG_OPTION_INCREMENTAL + FT_UNUSED( length ); +#endif + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + + + data.pointer = *pointer; + data.length = length; + + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object,&data ); + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + cff_index_forget_element( &cff->charstrings_index, pointer ); + } + } + + + static FT_Error + cff_operator_seac( CFF_Decoder* decoder, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + CFF_Builder* builder = &decoder->builder; + FT_Int bchar_index, achar_index; + TT_Face face = decoder->builder.face; + FT_Vector left_bearing, advance; + FT_Byte* charstring; + FT_ULong charstring_len; + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Incremental fonts don't necessarily have valid charsets. */ + /* They use the character code, not the glyph index, in this case. */ + if ( face->root.internal->incremental_interface ) + { + bchar_index = bchar; + achar_index = achar; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar ); + achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "cff_operator_seac:" )); + FT_ERROR(( " invalid seac character code arguments\n" )); + return CFF_Err_Syntax_Error; + } + + /* If we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( builder->no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)( adx >> 16 ); + subg->arg2 = (FT_Int)( ady >> 16 ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + } + + FT_GlyphLoader_Prepare( builder->loader ); + + /* First load `bchar' in builder */ + error = cff_get_glyph_data( face, bchar_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len ); + + if ( error ) + goto Exit; + + cff_free_glyph_data( face, &charstring, charstring_len ); + } + + /* Save the left bearing and width of the base character */ + /* as they will be erased by the next load. */ + + left_bearing = builder->left_bearing; + advance = builder->advance; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + + builder->pos_x = adx; + builder->pos_y = ady; + + /* Now load `achar' on top of the base outline. */ + error = cff_get_glyph_data( face, achar_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len ); + + if ( error ) + goto Exit; + + cff_free_glyph_data( face, &charstring, charstring_len ); + } + + /* Restore the left side bearing and advance width */ + /* of the base character. */ + builder->left_bearing = left_bearing; + builder->advance = advance; + + builder->pos_x = 0; + builder->pos_y = 0; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_decoder_parse_charstrings */ + /* */ + /* <Description> */ + /* Parses a given Type 2 charstrings program. */ + /* */ + /* <InOut> */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* <Input> */ + /* charstring_base :: The base of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ) + { + FT_Error error; + CFF_Decoder_Zone* zone; + FT_Byte* ip; + FT_Byte* limit; + CFF_Builder* builder = &decoder->builder; + FT_Pos x, y; + FT_Fixed seed; + FT_Fixed* stack; + + T2_Hints_Funcs hinter; + + + /* set default width */ + decoder->num_hints = 0; + decoder->read_width = 1; + + /* compute random seed from stack address of parameter */ + seed = (FT_Fixed)(char*)&seed ^ + (FT_Fixed)(char*)&decoder ^ + (FT_Fixed)(char*)&charstring_base; + seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; + if ( seed == 0 ) + seed = 0x7384; + + /* initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + stack = decoder->top; + + hinter = (T2_Hints_Funcs)builder->hints_funcs; + + builder->path_begun = 0; + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = CFF_Err_Ok; + + x = builder->pos_x; + y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + /* now execute loop */ + while ( ip < limit ) + { + CFF_Operator op; + FT_Byte v; + + + /********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + v = *ip++; + if ( v >= 32 || v == 28 ) + { + FT_Int shift = 16; + FT_Int32 val; + + + /* this is an operand, push it on the stack */ + if ( v == 28 ) + { + if ( ip + 1 >= limit ) + goto Syntax_Error; + val = (FT_Short)( ( (FT_Short)ip[0] << 8 ) | ip[1] ); + ip += 2; + } + else if ( v < 247 ) + val = (FT_Long)v - 139; + else if ( v < 251 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = ( (FT_Long)v - 247 ) * 256 + *ip++ + 108; + } + else if ( v < 255 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = -( (FT_Long)v - 251 ) * 256 - *ip++ - 108; + } + else + { + if ( ip + 3 >= limit ) + goto Syntax_Error; + val = ( (FT_Int32)ip[0] << 24 ) | + ( (FT_Int32)ip[1] << 16 ) | + ( (FT_Int32)ip[2] << 8 ) | + ip[3]; + ip += 4; + shift = 0; + } + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; + + val <<= shift; + *decoder->top++ = val; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !( val & 0xFFFFL ) ) + FT_TRACE4(( " %ld", (FT_Int32)( val >> 16 ) )); + else + FT_TRACE4(( " %.2f", val / 65536.0 )); +#endif + + } + else + { + /* The specification says that normally arguments are to be taken */ + /* from the bottom of the stack. However, this seems not to be */ + /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */ + /* arguments similar to a PS interpreter. */ + + FT_Fixed* args = decoder->top; + FT_Int num_args = (FT_Int)( args - decoder->stack ); + FT_Int req_args; + + + /* find operator */ + op = cff_op_unknown; + + switch ( v ) + { + case 1: + op = cff_op_hstem; + break; + case 3: + op = cff_op_vstem; + break; + case 4: + op = cff_op_vmoveto; + break; + case 5: + op = cff_op_rlineto; + break; + case 6: + op = cff_op_hlineto; + break; + case 7: + op = cff_op_vlineto; + break; + case 8: + op = cff_op_rrcurveto; + break; + case 9: + op = cff_op_closepath; + break; + case 10: + op = cff_op_callsubr; + break; + case 11: + op = cff_op_return; + break; + case 12: + { + if ( ip >= limit ) + goto Syntax_Error; + v = *ip++; + + switch ( v ) + { + case 0: + op = cff_op_dotsection; + break; + case 3: + op = cff_op_and; + break; + case 4: + op = cff_op_or; + break; + case 5: + op = cff_op_not; + break; + case 8: + op = cff_op_store; + break; + case 9: + op = cff_op_abs; + break; + case 10: + op = cff_op_add; + break; + case 11: + op = cff_op_sub; + break; + case 12: + op = cff_op_div; + break; + case 13: + op = cff_op_load; + break; + case 14: + op = cff_op_neg; + break; + case 15: + op = cff_op_eq; + break; + case 16: + op = cff_op_callothersubr; + break; + case 17: + op = cff_op_pop; + break; + case 18: + op = cff_op_drop; + break; + case 20: + op = cff_op_put; + break; + case 21: + op = cff_op_get; + break; + case 22: + op = cff_op_ifelse; + break; + case 23: + op = cff_op_random; + break; + case 24: + op = cff_op_mul; + break; + case 26: + op = cff_op_sqrt; + break; + case 27: + op = cff_op_dup; + break; + case 28: + op = cff_op_exch; + break; + case 29: + op = cff_op_index; + break; + case 30: + op = cff_op_roll; + break; + case 34: + op = cff_op_hflex; + break; + case 35: + op = cff_op_flex; + break; + case 36: + op = cff_op_hflex1; + break; + case 37: + op = cff_op_flex1; + break; + default: + /* decrement ip for syntax error message */ + ip--; + } + } + break; + case 13: + op = cff_op_hsbw; + break; + case 14: + op = cff_op_endchar; + break; + case 16: + op = cff_op_blend; + break; + case 18: + op = cff_op_hstemhm; + break; + case 19: + op = cff_op_hintmask; + break; + case 20: + op = cff_op_cntrmask; + break; + case 21: + op = cff_op_rmoveto; + break; + case 22: + op = cff_op_hmoveto; + break; + case 23: + op = cff_op_vstemhm; + break; + case 24: + op = cff_op_rcurveline; + break; + case 25: + op = cff_op_rlinecurve; + break; + case 26: + op = cff_op_vvcurveto; + break; + case 27: + op = cff_op_hhcurveto; + break; + case 29: + op = cff_op_callgsubr; + break; + case 30: + op = cff_op_vhcurveto; + break; + case 31: + op = cff_op_hvcurveto; + break; + default: + ; + } + + if ( op == cff_op_unknown ) + goto Syntax_Error; + + /* check arguments */ + req_args = cff_argument_counts[op]; + if ( req_args & CFF_COUNT_CHECK_WIDTH ) + { + if ( num_args > 0 && decoder->read_width ) + { + /* If `nominal_width' is non-zero, the number is really a */ + /* difference against `nominal_width'. Else, the number here */ + /* is truly a width, not a difference against `nominal_width'. */ + /* If the font does not set `nominal_width', then */ + /* `nominal_width' defaults to zero, and so we can set */ + /* `glyph_width' to `nominal_width' plus number on the stack */ + /* -- for either case. */ + + FT_Int set_width_ok; + + + switch ( op ) + { + case cff_op_hmoveto: + case cff_op_vmoveto: + set_width_ok = num_args & 2; + break; + + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + case cff_op_rmoveto: + case cff_op_hintmask: + case cff_op_cntrmask: + set_width_ok = num_args & 1; + break; + + case cff_op_endchar: + /* If there is a width specified for endchar, we either have */ + /* 1 argument or 5 arguments. We like to argue. */ + set_width_ok = ( num_args == 5 ) || ( num_args == 1 ); + break; + + default: + set_width_ok = 0; + break; + } + + if ( set_width_ok ) + { + decoder->glyph_width = decoder->nominal_width + + ( stack[0] >> 16 ); + + if ( decoder->width_only ) + { + /* we only want the advance width; stop here */ + break; + } + + /* Consumed an argument. */ + num_args--; + } + } + + decoder->read_width = 0; + req_args = 0; + } + + req_args &= 0x000F; + if ( num_args < req_args ) + goto Stack_Underflow; + args -= req_args; + num_args -= req_args; + + /* At this point, `args' points to the first argument of the */ + /* operand in case `req_args' isn't zero. Otherwise, we have */ + /* to adjust `args' manually. */ + + /* Note that we only pop arguments from the stack which we */ + /* really need and can digest so that we can continue in case */ + /* of superfluous stack elements. */ + + switch ( op ) + { + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + /* the number of arguments is always even here */ + FT_TRACE4(( + op == cff_op_hstem ? " hstem\n" : + ( op == cff_op_vstem ? " vstem\n" : + ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) )); + + if ( hinter ) + hinter->stems( hinter->hints, + ( op == cff_op_hstem || op == cff_op_hstemhm ), + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + args = stack; + break; + + case cff_op_hintmask: + case cff_op_cntrmask: + FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" )); + + /* implement vstem when needed -- */ + /* the specification doesn't say it, but this also works */ + /* with the 'cntrmask' operator */ + /* */ + if ( num_args > 0 ) + { + if ( hinter ) + hinter->stems( hinter->hints, + 0, + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + } + + if ( hinter ) + { + if ( op == cff_op_hintmask ) + hinter->hintmask( hinter->hints, + builder->current->n_points, + decoder->num_hints, + ip ); + else + hinter->counter( hinter->hints, + decoder->num_hints, + ip ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt maskbyte; + + + FT_TRACE4(( " (maskbytes: " )); + + for ( maskbyte = 0; + maskbyte < (FT_UInt)(( decoder->num_hints + 7 ) >> 3); + maskbyte++, ip++ ) + FT_TRACE4(( "0x%02X", *ip )); + + FT_TRACE4(( ")\n" )); + } +#else + ip += ( decoder->num_hints + 7 ) >> 3; +#endif + if ( ip >= limit ) + goto Syntax_Error; + args = stack; + break; + + case cff_op_rmoveto: + FT_TRACE4(( " rmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x += args[-2]; + y += args[-1]; + args = stack; + break; + + case cff_op_vmoveto: + FT_TRACE4(( " vmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + y += args[-1]; + args = stack; + break; + + case cff_op_hmoveto: + FT_TRACE4(( " hmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x += args[-1]; + args = stack; + break; + + case cff_op_rlineto: + FT_TRACE4(( " rlineto\n" )); + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_args / 2 ) ) + goto Fail; + + if ( num_args < 2 ) + goto Stack_Underflow; + + args -= num_args & ~1; + while ( args < decoder->top ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args += 2; + } + args = stack; + break; + + case cff_op_hlineto: + case cff_op_vlineto: + { + FT_Int phase = ( op == cff_op_hlineto ); + + + FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n" + : " vlineto\n" )); + + if ( num_args < 1 ) + goto Stack_Underflow; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_args ) ) + goto Fail; + + args = stack; + while ( args < decoder->top ) + { + if ( phase ) + x += args[0]; + else + y += args[0]; + + if ( cff_builder_add_point1( builder, x, y ) ) + goto Fail; + + args++; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rrcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " rrcurveto\n" )); + + if ( num_args < 6 ) + goto Stack_Underflow; + + nargs = num_args - num_args % 6; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, nargs / 2 ) ) + goto Fail; + + args -= nargs; + while ( args < decoder->top ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args += 6; + } + args = stack; + } + break; + + case cff_op_vvcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " vvcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we reduce it to 4n+1 */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + + if ( nargs & 1 ) + { + x += args[0]; + args++; + nargs--; + } + + if ( check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + y += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + y += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + args += 4; + } + args = stack; + } + break; + + case cff_op_hhcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " hhcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we reduce it to 4n+1 */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + if ( nargs & 1 ) + { + y += args[0]; + args++; + nargs--; + } + + if ( check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + args += 4; + } + args = stack; + } + break; + + case cff_op_vhcurveto: + case cff_op_hvcurveto: + { + FT_Int phase; + FT_Int nargs; + + + FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n" + : " hvcurveto\n" )); + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */ + /* we reduce it to the largest one which fits */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + args -= nargs; + if ( check_points( builder, ( nargs / 4 ) * 3 ) ) + goto Stack_Underflow; + + phase = ( op == cff_op_hvcurveto ); + + while ( nargs >= 4 ) + { + nargs -= 4; + if ( phase ) + { + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + y += args[3]; + if ( nargs == 1 ) + x += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + } + else + { + y += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[3]; + if ( nargs == 1 ) + y += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + } + args += 4; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rlinecurve: + { + FT_Int num_lines; + FT_Int nargs; + + + FT_TRACE4(( " rlinecurve\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args & ~1; + num_lines = ( nargs - 6 ) / 2; + + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, num_lines + 3 ) ) + goto Fail; + + args -= nargs; + + /* first, add the line segments */ + while ( num_lines > 0 ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args += 2; + num_lines--; + } + + /* then the curve */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args = stack; + } + break; + + case cff_op_rcurveline: + { + FT_Int num_curves; + FT_Int nargs; + + + FT_TRACE4(( " rcurveline\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args - 2; + nargs = nargs - nargs % 6 + 2; + num_curves = ( nargs - 2 ) / 6; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_curves * 3 + 2 ) ) + goto Fail; + + args -= nargs; + + /* first, add the curves */ + while ( num_curves > 0 ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args += 6; + num_curves--; + } + + /* then the final line */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args = stack; + } + break; + + case cff_op_hflex1: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex1\n" )); + + /* adding five more points: 4 control points, 1 on-curve point */ + /* -- make sure we have enough space for the start point if it */ + /* needs to be added */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y position for later use */ + start_y = y; + + /* first control point */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x += args[5]; + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x += args[6]; + y += args[7]; + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start */ + x += args[8]; + y = start_y; + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_hflex: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y-position for later use */ + start_y = y; + + /* first control point */ + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x += args[4]; + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x += args[5]; + y = start_y; + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start point's */ + /* y-value -- we don't add this point, though */ + x += args[6]; + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex1: + { + FT_Pos start_x, start_y; /* record start x, y values for */ + /* alter use */ + FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ + /* algorithm below */ + FT_Int horizontal, count; + FT_Fixed* temp; + + + FT_TRACE4(( " flex1\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's x, y position for later use */ + start_x = x; + start_y = y; + + /* XXX: figure out whether this is supposed to be a horizontal */ + /* or vertical flex; the Type 2 specification is vague... */ + + temp = args; + + /* grab up to the last argument */ + for ( count = 5; count > 0; count-- ) + { + dx += temp[0]; + dy += temp[1]; + temp += 2; + } + + if ( dx < 0 ) + dx = -dx; + if ( dy < 0 ) + dy = -dy; + + /* strange test, but here it is... */ + horizontal = ( dx > dy ); + + for ( count = 5; count > 0; count-- ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, + (FT_Bool)( count == 3 ) ); + args += 2; + } + + /* is last operand an x- or y-delta? */ + if ( horizontal ) + { + x += args[0]; + y = start_y; + } + else + { + x = start_x; + y += args[0]; + } + + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex: + { + FT_UInt count; + + + FT_TRACE4(( " flex\n" )); + + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + for ( count = 6; count > 0; count-- ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, + (FT_Bool)( count == 4 || count == 1 ) ); + args += 2; + } + + args = stack; + } + break; + + case cff_op_endchar: + FT_TRACE4(( " endchar\n" )); + + /* We are going to emulate the seac operator. */ + if ( num_args >= 4 ) + { + /* Save glyph width so that the subglyphs don't overwrite it. */ + FT_Pos glyph_width = decoder->glyph_width; + + + error = cff_operator_seac( decoder, + args[-4], + args[-3], + (FT_Int)( args[-2] >> 16 ), + (FT_Int)( args[-1] >> 16 ) ); + + decoder->glyph_width = glyph_width; + } + else + { + if ( !error ) + error = CFF_Err_Ok; + + cff_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, + builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + } + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_abs: + FT_TRACE4(( " abs\n" )); + + if ( args[0] < 0 ) + args[0] = -args[0]; + args++; + break; + + case cff_op_add: + FT_TRACE4(( " add\n" )); + + args[0] += args[1]; + args++; + break; + + case cff_op_sub: + FT_TRACE4(( " sub\n" )); + + args[0] -= args[1]; + args++; + break; + + case cff_op_div: + FT_TRACE4(( " div\n" )); + + args[0] = FT_DivFix( args[0], args[1] ); + args++; + break; + + case cff_op_neg: + FT_TRACE4(( " neg\n" )); + + args[0] = -args[0]; + args++; + break; + + case cff_op_random: + { + FT_Fixed Rand; + + + FT_TRACE4(( " rand\n" )); + + Rand = seed; + if ( Rand >= 0x8000L ) + Rand++; + + args[0] = Rand; + seed = FT_MulFix( seed, 0x10000L - seed ); + if ( seed == 0 ) + seed += 0x2873; + args++; + } + break; + + case cff_op_mul: + FT_TRACE4(( " mul\n" )); + + args[0] = FT_MulFix( args[0], args[1] ); + args++; + break; + + case cff_op_sqrt: + FT_TRACE4(( " sqrt\n" )); + + if ( args[0] > 0 ) + { + FT_Int count = 9; + FT_Fixed root = args[0]; + FT_Fixed new_root; + + + for (;;) + { + new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1; + if ( new_root == root || count <= 0 ) + break; + root = new_root; + } + args[0] = new_root; + } + else + args[0] = 0; + args++; + break; + + case cff_op_drop: + /* nothing */ + FT_TRACE4(( " drop\n" )); + + break; + + case cff_op_exch: + { + FT_Fixed tmp; + + + FT_TRACE4(( " exch\n" )); + + tmp = args[0]; + args[0] = args[1]; + args[1] = tmp; + args += 2; + } + break; + + case cff_op_index: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + + + FT_TRACE4(( " index\n" )); + + if ( idx < 0 ) + idx = 0; + else if ( idx > num_args - 2 ) + idx = num_args - 2; + args[0] = args[-( idx + 1 )]; + args++; + } + break; + + case cff_op_roll: + { + FT_Int count = (FT_Int)( args[0] >> 16 ); + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " roll\n" )); + + if ( count <= 0 ) + count = 1; + + args -= count; + if ( args < stack ) + goto Stack_Underflow; + + if ( idx >= 0 ) + { + while ( idx > 0 ) + { + FT_Fixed tmp = args[count - 1]; + FT_Int i; + + + for ( i = count - 2; i >= 0; i-- ) + args[i + 1] = args[i]; + args[0] = tmp; + idx--; + } + } + else + { + while ( idx < 0 ) + { + FT_Fixed tmp = args[0]; + FT_Int i; + + + for ( i = 0; i < count - 1; i++ ) + args[i] = args[i + 1]; + args[count - 1] = tmp; + idx++; + } + } + args += count; + } + break; + + case cff_op_dup: + FT_TRACE4(( " dup\n" )); + + args[1] = args[0]; + args++; + break; + + case cff_op_put: + { + FT_Fixed val = args[0]; + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " put\n" )); + + if ( idx >= 0 && idx < decoder->len_buildchar ) + decoder->buildchar[idx] = val; + } + break; + + case cff_op_get: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + FT_Fixed val = 0; + + + FT_TRACE4(( " get\n" )); + + if ( idx >= 0 && idx < decoder->len_buildchar ) + val = decoder->buildchar[idx]; + + args[0] = val; + args++; + } + break; + + case cff_op_store: + FT_TRACE4(( " store\n")); + + goto Unimplemented; + + case cff_op_load: + FT_TRACE4(( " load\n" )); + + goto Unimplemented; + + case cff_op_dotsection: + /* this operator is deprecated and ignored by the parser */ + FT_TRACE4(( " dotsection\n" )); + break; + + case cff_op_closepath: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " closepath (invalid op)\n" )); + + args = stack; + break; + + case cff_op_hsbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " hsbw (invalid op)\n" )); + + decoder->glyph_width = decoder->nominal_width + + (args[1] >> 16); + x = args[0]; + y = 0; + args = stack; + break; + + case cff_op_callothersubr: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " callothersubr (invalid op)\n" )); + + /* don't modify stack; handle the subr as `unknown' so that */ + /* following `pop' operands use the arguments on stack */ + break; + + case cff_op_pop: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " pop (invalid op)\n" )); + + args++; + break; + + case cff_op_and: + { + FT_Fixed cond = args[0] && args[1]; + + + FT_TRACE4(( " and\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_or: + { + FT_Fixed cond = args[0] || args[1]; + + + FT_TRACE4(( " or\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_eq: + { + FT_Fixed cond = !args[0]; + + + FT_TRACE4(( " eq\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_ifelse: + { + FT_Fixed cond = ( args[2] <= args[3] ); + + + FT_TRACE4(( " ifelse\n" )); + + if ( !cond ) + args[0] = args[1]; + args++; + } + break; + + case cff_op_callsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->locals_bias ); + + + FT_TRACE4(( " callsubr(%d)\n", idx )); + + if ( idx >= decoder->num_locals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" )); + FT_ERROR(( " invalid local subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->locals[idx]; + zone->limit = decoder->locals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs!\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_callgsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->globals_bias ); + + + FT_TRACE4(( " callgsubr(%d)\n", idx )); + + if ( idx >= decoder->num_globals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" )); + FT_ERROR(( " invalid global subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->globals[idx]; + zone->limit = decoder->globals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs!\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_return: + FT_TRACE4(( " return\n" )); + + if ( decoder->zone <= decoder->zones ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + decoder->zone--; + zone = decoder->zone; + ip = zone->cursor; + limit = zone->limit; + break; + + default: + Unimplemented: + FT_ERROR(( "Unimplemented opcode: %d", ip[-1] )); + + if ( ip[-1] == 12 ) + FT_ERROR(( " %d", ip[0] )); + FT_ERROR(( "\n" )); + + return CFF_Err_Unimplemented_Feature; + } + + decoder->top = args; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + Fail: + return error; + + Syntax_Error: + FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error!\n" )); + return CFF_Err_Invalid_File_Format; + + Stack_Underflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow!\n" )); + return CFF_Err_Too_Few_Arguments; + + Stack_Overflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow!\n" )); + return CFF_Err_Stack_Overflow; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#if 0 /* unused until we support pure CFF fonts */ + + + FT_LOCAL_DEF( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ) + { + FT_Error error = CFF_Err_Ok; + CFF_Decoder decoder; + FT_Int glyph_index; + CFF_Font cff = (CFF_Font)face->other; + + + *max_advance = 0; + + /* Initialize load decoder */ + cff_decoder_init( &decoder, face, 0, 0, 0, 0 ); + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + /* For each glyph, parse the glyph charstring and extract */ + /* the advance width. */ + for ( glyph_index = 0; glyph_index < face->root.num_glyphs; + glyph_index++ ) + { + FT_Byte* charstring; + FT_ULong charstring_len; + + + /* now get load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = cff_decoder_prepare( &decoder, size, glyph_index ); + if ( !error ) + error = cff_decoder_parse_charstrings( &decoder, + charstring, + charstring_len ); + + cff_free_glyph_data( face, &charstring, &charstring_len ); + } + + /* ignore the error if one has occurred -- skip to next glyph */ + error = CFF_Err_Ok; + } + + *max_advance = decoder.builder.advance.x; + + return CFF_Err_Ok; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_Decoder decoder; + TT_Face face = (TT_Face)glyph->root.face; + FT_Bool hinting, force_scaling; + CFF_Font cff = (CFF_Font)face->extra.data; + + FT_Matrix font_matrix; + FT_Vector font_offset; + + + force_scaling = FALSE; + + /* in a CID-keyed font, consider `glyph_index' as a CID and map */ + /* it immediately to the real glyph_index -- if it isn't a */ + /* subsetted font, glyph_indices and CIDs are identical, though */ + if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && + cff->charset.cids ) + { + /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */ + if ( glyph_index != 0 ) + { + glyph_index = cff_charset_cid_to_gindex( &cff->charset, + glyph_index ); + if ( glyph_index == 0 ) + return CFF_Err_Invalid_Argument; + } + } + else if ( glyph_index >= cff->num_glyphs ) + return CFF_Err_Invalid_Argument; + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + glyph->x_scale = 0x10000L; + glyph->y_scale = 0x10000L; + if ( size ) + { + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size ) + { + CFF_Face cff_face = (CFF_Face)size->root.face; + SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt; + FT_Stream stream = cff_face->root.stream; + + + if ( size->strike_index != 0xFFFFFFFFUL && + sfnt->load_eblc && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + TT_SBit_MetricsRec metrics; + + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_Int)load_flags, + stream, + &glyph->root.bitmap, + &metrics ); + + if ( !error ) + { + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + glyph->root.metrics.width = (FT_Pos)metrics.width << 6; + glyph->root.metrics.height = (FT_Pos)metrics.height << 6; + + glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; + glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; + glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; + + glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; + glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; + glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; + + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->root.bitmap_left = metrics.vertBearingX; + glyph->root.bitmap_top = metrics.vertBearingY; + } + else + { + glyph->root.bitmap_left = metrics.horiBearingX; + glyph->root.bitmap_top = metrics.horiBearingY; + } + return error; + } + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* return immediately if we only want the embedded bitmaps */ + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return CFF_Err_Invalid_Argument; + + /* if we have a CID subfont, use its matrix (which has already */ + /* been multiplied with the root matrix) */ + + /* this scaling is only relevant if the PS hinter isn't active */ + if ( cff->num_subfonts ) + { + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, + glyph_index ); + + FT_Int top_upm = cff->top_font.font_dict.units_per_em; + FT_Int sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em; + + + font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; + font_offset = cff->subfonts[fd_index]->font_dict.font_offset; + + if ( top_upm != sub_upm ) + { + glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm ); + glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm ); + + force_scaling = TRUE; + } + } + else + { + font_matrix = cff->top_font.font_dict.font_matrix; + font_offset = cff->top_font.font_dict.font_offset; + } + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */ + + { + FT_Byte* charstring; + FT_ULong charstring_len; + + + cff_decoder_init( &decoder, face, size, glyph, hinting, + FT_LOAD_TARGET_MODE( load_flags ) ); + + if ( load_flags & FT_LOAD_ADVANCE_ONLY ) + decoder.width_only = TRUE; + + decoder.builder.no_recurse = + (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE ); + + /* now load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = cff_decoder_prepare( &decoder, size, glyph_index ); + if ( !error ) + { + error = cff_decoder_parse_charstrings( &decoder, + charstring, + charstring_len ); + + cff_free_glyph_data( face, &charstring, charstring_len ); + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Control data and length may not be available for incremental */ + /* fonts. */ + if ( face->root.internal->incremental_interface ) + { + glyph->root.control_data = 0; + glyph->root.control_len = 0; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* We set control_data and control_len if charstrings is loaded. */ + /* See how charstring loads at cff_index_access_element() in */ + /* cffload.c. */ + { + CFF_Index csindex = &cff->charstrings_index; + + + if ( csindex->offsets ) + { + glyph->root.control_data = csindex->bytes + + csindex->offsets[glyph_index] - 1; + glyph->root.control_len = charstring_len; + } + } + } + } + + /* save new glyph tables */ + cff_builder_done( &decoder.builder ); + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && + face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = decoder.builder.left_bearing.x; + metrics.bearing_y = decoder.builder.left_bearing.y; + metrics.advance = decoder.builder.advance.x; + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + decoder.builder.left_bearing.x = metrics.bearing_x; + decoder.builder.left_bearing.y = metrics.bearing_y; + decoder.builder.advance.x = metrics.advance; + decoder.builder.advance.y = 0; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + if ( !error ) + { + /* Now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax. */ + + /* For composite glyphs, return only left side bearing and */ + /* advance width. */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = glyph->root.internal; + + + glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; + glyph->root.metrics.horiAdvance = decoder.glyph_width; + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &glyph->root.metrics; + FT_Vector advance; + FT_Bool has_vertical_info; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = decoder.glyph_width; + glyph->root.linearHoriAdvance = decoder.glyph_width; + glyph->root.internal->glyph_transformed = 0; + + has_vertical_info = FT_BOOL( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 && + face->vertical.long_metrics ); + + /* get the vertical metrics from the vtmx table if we have one */ + if ( has_vertical_info ) + { + FT_Short vertBearingY = 0; + FT_UShort vertAdvance = 0; + + + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, + glyph_index, + &vertBearingY, + &vertAdvance ); + metrics->vertBearingY = vertBearingY; + metrics->vertAdvance = vertAdvance; + } + else + { + /* make up vertical ones */ + if ( face->os2.version != 0xFFFFU ) + metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + } + + glyph->root.linearVertAdvance = metrics->vertAdvance; + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + glyph->root.outline.flags = 0; + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* apply the font matrix -- `xx' has already been normalized */ + if ( !( font_matrix.yy == 0x10000L && + font_matrix.xy == 0 && + font_matrix.yx == 0 ) ) + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + if ( !( font_offset.x == 0 && + font_offset.y == 0 ) ) + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, font_offset.y ); + + advance.x = metrics->horiAdvance; + advance.y = 0; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->horiAdvance = advance.x + font_offset.x; + + advance.x = 0; + advance.y = metrics->vertAdvance; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->vertAdvance = advance.y + font_offset.y; + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = &glyph->root.outline; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( has_vertical_info ) + metrics->vertBearingX = -metrics->width / 2; + else + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffgload.h b/src/3rdparty/freetype/src/cff/cffgload.h new file mode 100644 index 0000000000..667134e3b5 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffgload.h @@ -0,0 +1,203 @@ +/***************************************************************************/ +/* */ +/* cffgload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFGLOAD_H__ +#define __CFFGLOAD_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include "cffobjs.h" + + +FT_BEGIN_HEADER + + +#define CFF_MAX_OPERANDS 48 +#define CFF_MAX_SUBRS_CALLS 32 + + + /*************************************************************************/ + /* */ + /* <Structure> */ + /* CFF_Builder */ + /* */ + /* <Description> */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* <Fields> */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* loader :: The current glyph loader. */ + /* */ + /* base :: The base glyph outline. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* last :: The last point position. */ + /* */ + /* pos_x :: The horizontal translation (if composite glyph). */ + /* */ + /* pos_y :: The vertical translation (if composite glyph). */ + /* */ + /* left_bearing :: The left side bearing point. */ + /* */ + /* advance :: The horizontal advance vector. */ + /* */ + /* bbox :: Unused. */ + /* */ + /* path_begun :: A flag which indicates that a new path has begun. */ + /* */ + /* load_points :: If this flag is not set, no points are loaded. */ + /* */ + /* no_recurse :: Set but not used. */ + /* */ + /* metrics_only :: A boolean indicating that we only want to compute */ + /* the metrics of a given glyph, not load all of its */ + /* points. */ + /* */ + /* hints_funcs :: Auxiliary pointer for hinting. */ + /* */ + /* hints_globals :: Auxiliary pointer for hinting. */ + /* */ + typedef struct CFF_Builder_ + { + FT_Memory memory; + TT_Face face; + CFF_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Vector last; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + FT_Bool path_begun; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + } CFF_Builder; + + + /* execution context charstring zone */ + + typedef struct CFF_Decoder_Zone_ + { + FT_Byte* base; + FT_Byte* limit; + FT_Byte* cursor; + + } CFF_Decoder_Zone; + + + typedef struct CFF_Decoder_ + { + CFF_Builder builder; + CFF_Font cff; + + FT_Fixed stack[CFF_MAX_OPERANDS + 1]; + FT_Fixed* top; + + CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1]; + CFF_Decoder_Zone* zone; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + FT_Pos glyph_width; + FT_Pos nominal_width; + + FT_Bool read_width; + FT_Bool width_only; + FT_Int num_hints; + FT_Fixed* buildchar; + FT_Int len_buildchar; + + FT_UInt num_locals; + FT_UInt num_globals; + + FT_Int locals_bias; + FT_Int globals_bias; + + FT_Byte** locals; + FT_Byte** globals; + + FT_Byte** glyph_names; /* for pure CFF fonts only */ + FT_UInt num_glyphs; /* number of glyphs in font */ + + FT_Render_Mode hint_mode; + + } CFF_Decoder; + + + FT_LOCAL( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode ); + + FT_LOCAL( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ); + +#if 0 /* unused until we support pure CFF fonts */ + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + FT_LOCAL( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __CFFGLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffload.c b/src/3rdparty/freetype/src/cff/cffload.c new file mode 100644 index 0000000000..22163fb75c --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffload.c @@ -0,0 +1,1604 @@ +/***************************************************************************/ +/* */ +/* cffload.c */ +/* */ +/* OpenType and CFF data/program tables loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_TRUETYPE_TAGS_H +#include FT_TYPE1_TABLES_H + +#include "cffload.h" +#include "cffparse.h" + +#include "cfferrs.h" + + +#if 1 + + static const FT_UShort cff_isoadobe_charset[229] = + { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228 + }; + + static const FT_UShort cff_expert_charset[166] = + { + 0, 1, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, + 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 326, 150, + 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 + }; + + static const FT_UShort cff_expertsubset_charset[87] = + { + 0, 1, 231, 232, 235, 236, 237, 238, + 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, + 249, 250, 251, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, + 300, 301, 302, 305, 314, 315, 158, 155, + 163, 320, 321, 322, 323, 324, 325, 326, + 150, 164, 169, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 + }; + + static const FT_UShort cff_standard_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 115, 116, + 117, 118, 119, 120, 121, 122, 0, 123, + 0, 124, 125, 126, 127, 128, 129, 130, + 131, 0, 132, 133, 0, 134, 135, 136, + 137, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 0, 139, 0, 0, 0, 0, + 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, + 146, 147, 148, 149, 0, 0, 0, 0 + }; + + static const FT_UShort cff_expert_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 229, 230, 0, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 0, 253, 254, 255, 256, 257, 0, 0, + 0, 258, 0, 0, 259, 260, 261, 262, + 0, 0, 263, 264, 265, 0, 266, 109, + 110, 267, 268, 269, 0, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 304, 305, 306, 0, 0, 307, 308, + 309, 310, 311, 0, 312, 0, 0, 312, + 0, 0, 314, 315, 0, 0, 316, 317, + 318, 0, 0, 0, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 0, 0, + 326, 150, 164, 169, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378 + }; + +#endif /* 1 */ + + + FT_LOCAL_DEF( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ) + { + return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode] + : 0 ); + } + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffload + + + /* read an offset from the index's stream current position */ + static FT_ULong + cff_index_read_offset( CFF_Index idx, + FT_Error *errorp ) + { + FT_Error error; + FT_Stream stream = idx->stream; + FT_Byte tmp[4]; + FT_ULong result = 0; + + + if ( !FT_STREAM_READ( tmp, idx->off_size ) ) + { + FT_Int nn; + + + for ( nn = 0; nn < idx->off_size; nn++ ) + result = ( result << 8 ) | tmp[nn]; + } + + *errorp = error; + return result; + } + + + static FT_Error + cff_index_init( CFF_Index idx, + FT_Stream stream, + FT_Bool load ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UShort count; + + + FT_MEM_ZERO( idx, sizeof ( *idx ) ); + + idx->stream = stream; + idx->start = FT_STREAM_POS(); + if ( !FT_READ_USHORT( count ) && + count > 0 ) + { + FT_Byte offsize; + FT_ULong size; + + + /* there is at least one element; read the offset size, */ + /* then access the offset table to compute the index's total size */ + if ( FT_READ_BYTE( offsize ) ) + goto Exit; + + if ( offsize < 1 || offsize > 4 ) + { + error = FT_Err_Invalid_Table; + goto Exit; + } + + idx->count = count; + idx->off_size = offsize; + size = (FT_ULong)( count + 1 ) * offsize; + + idx->data_offset = idx->start + 3 + size; + + if ( FT_STREAM_SKIP( size - offsize ) ) + goto Exit; + + size = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( size == 0 ) + { + error = CFF_Err_Invalid_Table; + goto Exit; + } + + idx->data_size = --size; + + if ( load ) + { + /* load the data */ + if ( FT_FRAME_EXTRACT( size, idx->bytes ) ) + goto Exit; + } + else + { + /* skip the data */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + static void + cff_index_done( CFF_Index idx ) + { + if ( idx->stream ) + { + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->bytes ) + FT_FRAME_RELEASE( idx->bytes ); + + FT_FREE( idx->offsets ); + FT_MEM_ZERO( idx, sizeof ( *idx ) ); + } + } + + + static FT_Error + cff_index_load_offsets( CFF_Index idx ) + { + FT_Error error = CFF_Err_Ok; + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->count > 0 && idx->offsets == NULL ) + { + FT_Byte offsize = idx->off_size; + FT_ULong data_size; + FT_Byte* p; + FT_Byte* p_end; + FT_ULong* poff; + + + data_size = (FT_ULong)( idx->count + 1 ) * offsize; + + if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) || + FT_STREAM_SEEK( idx->start + 3 ) || + FT_FRAME_ENTER( data_size ) ) + goto Exit; + + poff = idx->offsets; + p = (FT_Byte*)stream->cursor; + p_end = p + data_size; + + switch ( offsize ) + { + case 1: + for ( ; p < p_end; p++, poff++ ) + poff[0] = p[0]; + break; + + case 2: + for ( ; p < p_end; p += 2, poff++ ) + poff[0] = FT_PEEK_USHORT( p ); + break; + + case 3: + for ( ; p < p_end; p += 3, poff++ ) + poff[0] = FT_PEEK_OFF3( p ); + break; + + default: + for ( ; p < p_end; p += 4, poff++ ) + poff[0] = FT_PEEK_ULONG( p ); + } + + FT_FRAME_EXIT(); + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + /* allocate a table containing pointers to an index's elements */ + static FT_Error + cff_index_get_pointers( CFF_Index idx, + FT_Byte*** table ) + { + FT_Error error = CFF_Err_Ok; + FT_Memory memory = idx->stream->memory; + FT_ULong n, offset, old_offset; + FT_Byte** t; + + + *table = 0; + + if ( idx->offsets == NULL ) + { + error = cff_index_load_offsets( idx ); + if ( error ) + goto Exit; + } + + if ( idx->count > 0 && !FT_NEW_ARRAY( t, idx->count + 1 ) ) + { + old_offset = 1; + for ( n = 0; n <= idx->count; n++ ) + { + /* at this point, `idx->offsets' can't be NULL */ + offset = idx->offsets[n]; + if ( !offset ) + offset = old_offset; + + /* two sanity checks for invalid offset tables */ + else if ( offset < old_offset ) + offset = old_offset; + + else if ( offset - 1 >= idx->data_size && n < idx->count ) + offset = old_offset; + + t[n] = idx->bytes + offset - 1; + + old_offset = offset; + } + *table = t; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ) + { + FT_Error error = CFF_Err_Ok; + + + if ( idx && idx->count > element ) + { + /* compute start and end offsets */ + FT_Stream stream = idx->stream; + FT_ULong off1, off2 = 0; + + + /* load offsets from file or the offset table */ + if ( !idx->offsets ) + { + FT_ULong pos = element * idx->off_size; + + + if ( FT_STREAM_SEEK( idx->start + 3 + pos ) ) + goto Exit; + + off1 = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( off1 != 0 ) + { + do + { + element++; + off2 = cff_index_read_offset( idx, &error ); + } + while ( off2 == 0 && element < idx->count ); + } + } + else /* use offsets table */ + { + off1 = idx->offsets[element]; + if ( off1 ) + { + do + { + element++; + off2 = idx->offsets[element]; + + } while ( off2 == 0 && element < idx->count ); + } + } + + /* access element */ + if ( off1 && off2 > off1 ) + { + *pbyte_len = off2 - off1; + + if ( idx->bytes ) + { + /* this index was completely loaded in memory, that's easy */ + *pbytes = idx->bytes + off1 - 1; + } + else + { + /* this index is still on disk/file, access it through a frame */ + if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) || + FT_FRAME_EXTRACT( off2 - off1, *pbytes ) ) + goto Exit; + } + } + else + { + /* empty index element */ + *pbytes = 0; + *pbyte_len = 0; + } + } + else + error = CFF_Err_Invalid_Argument; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ) + { + if ( idx->bytes == 0 ) + { + FT_Stream stream = idx->stream; + + + FT_FRAME_RELEASE( *pbytes ); + } + } + + + FT_LOCAL_DEF( FT_String* ) + cff_index_get_name( CFF_Index idx, + FT_UInt element ) + { + FT_Memory memory = idx->stream->memory; + FT_Byte* bytes; + FT_ULong byte_len; + FT_Error error; + FT_String* name = 0; + + + error = cff_index_access_element( idx, element, &bytes, &byte_len ); + if ( error ) + goto Exit; + + if ( !FT_ALLOC( name, byte_len + 1 ) ) + { + FT_MEM_COPY( name, bytes, byte_len ); + name[byte_len] = 0; + } + cff_index_forget_element( idx, &bytes ); + + Exit: + return name; + } + + + FT_LOCAL_DEF( FT_String* ) + cff_index_get_sid_string( CFF_Index idx, + FT_UInt sid, + FT_Service_PsCMaps psnames ) + { + /* value 0xFFFFU indicates a missing dictionary entry */ + if ( sid == 0xFFFFU ) + return 0; + + /* if it is not a standard string, return it */ + if ( sid > 390 ) + return cff_index_get_name( idx, sid - 391 ); + + /* CID-keyed CFF fonts don't have glyph names */ + if ( !psnames ) + return 0; + + /* that's a standard string, fetch a copy from the PSName module */ + { + FT_String* name = 0; + const char* adobe_name = psnames->adobe_std_strings( sid ); + + + if ( adobe_name ) + { + FT_Memory memory = idx->stream->memory; + FT_Error error; + + + (void)FT_STRDUP( name, adobe_name ); + + FT_UNUSED( error ); + } + + return name; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** FD Select table support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + + static void + CFF_Done_FD_Select( CFF_FDSelect fdselect, + FT_Stream stream ) + { + if ( fdselect->data ) + FT_FRAME_RELEASE( fdselect->data ); + + fdselect->data_size = 0; + fdselect->format = 0; + fdselect->range_count = 0; + } + + + static FT_Error + CFF_Load_FD_Select( CFF_FDSelect fdselect, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong offset ) + { + FT_Error error; + FT_Byte format; + FT_UInt num_ranges; + + + /* read format */ + if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) ) + goto Exit; + + fdselect->format = format; + fdselect->cache_count = 0; /* clear cache */ + + switch ( format ) + { + case 0: /* format 0, that's simple */ + fdselect->data_size = num_glyphs; + goto Load_Data; + + case 3: /* format 3, a tad more complex */ + if ( FT_READ_USHORT( num_ranges ) ) + goto Exit; + + fdselect->data_size = num_ranges * 3 + 2; + + Load_Data: + if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) + goto Exit; + break; + + default: /* hmm... that's wrong */ + error = CFF_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ) + { + FT_Byte fd = 0; + + + switch ( fdselect->format ) + { + case 0: + fd = fdselect->data[glyph_index]; + break; + + case 3: + /* first, compare to cache */ + if ( (FT_UInt)( glyph_index - fdselect->cache_first ) < + fdselect->cache_count ) + { + fd = fdselect->cache_fd; + break; + } + + /* then, lookup the ranges array */ + { + FT_Byte* p = fdselect->data; + FT_Byte* p_limit = p + fdselect->data_size; + FT_Byte fd2; + FT_UInt first, limit; + + + first = FT_NEXT_USHORT( p ); + do + { + if ( glyph_index < first ) + break; + + fd2 = *p++; + limit = FT_NEXT_USHORT( p ); + + if ( glyph_index < limit ) + { + fd = fd2; + + /* update cache */ + fdselect->cache_first = first; + fdselect->cache_count = limit-first; + fdselect->cache_fd = fd2; + break; + } + first = limit; + + } while ( p < p_limit ); + } + break; + + default: + ; + } + + return fd; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** CFF font support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + cff_charset_compute_cids( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_UInt i; + FT_UShort max_cid = 0; + + + if ( charset->max_cid > 0 ) + goto Exit; + + for ( i = 0; i < num_glyphs; i++ ) + if ( charset->sids[i] > max_cid ) + max_cid = charset->sids[i]; + max_cid++; + + if ( FT_NEW_ARRAY( charset->cids, max_cid ) ) + goto Exit; + + for ( i = 0; i < num_glyphs; i++ ) + charset->cids[charset->sids[i]] = (FT_UShort)i; + + charset->max_cid = max_cid; + charset->num_glyphs = num_glyphs; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ) + { + FT_UInt result = 0; + + + if ( cid < charset->max_cid ) + result = charset->cids[cid]; + + return result; + } + + + static void + cff_charset_free_cids( CFF_Charset charset, + FT_Memory memory ) + { + FT_FREE( charset->cids ); + charset->max_cid = 0; + } + + + static void + cff_charset_done( CFF_Charset charset, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + cff_charset_free_cids( charset, memory ); + + FT_FREE( charset->sids ); + charset->format = 0; + charset->offset = 0; + } + + + static FT_Error + cff_charset_load( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset, + FT_Bool invert ) + { + FT_Memory memory = stream->memory; + FT_Error error = CFF_Err_Ok; + FT_UShort glyph_sid; + + + /* If the the offset is greater than 2, we have to parse the */ + /* charset table. */ + if ( offset > 2 ) + { + FT_UInt j; + + + charset->offset = base_offset + offset; + + /* Get the format of the table. */ + if ( FT_STREAM_SEEK( charset->offset ) || + FT_READ_BYTE( charset->format ) ) + goto Exit; + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* assign the .notdef glyph */ + charset->sids[0] = 0; + + switch ( charset->format ) + { + case 0: + if ( num_glyphs > 0 ) + { + if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) + goto Exit; + + for ( j = 1; j < num_glyphs; j++ ) + charset->sids[j] = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + } + break; + + case 1: + case 2: + { + FT_UInt nleft; + FT_UInt i; + + + j = 1; + + while ( j < num_glyphs ) + { + /* Read the first glyph sid of the range. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Read the number of glyphs in the range. */ + if ( charset->format == 2 ) + { + if ( FT_READ_USHORT( nleft ) ) + goto Exit; + } + else + { + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + } + + /* Fill in the range of sids -- `nleft + 1' glyphs. */ + for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) + charset->sids[j] = glyph_sid; + } + } + break; + + default: + FT_ERROR(( "cff_charset_load: invalid table format!\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + else + { + /* Parse default tables corresponding to offset == 0, 1, or 2. */ + /* CFF specification intimates the following: */ + /* */ + /* In order to use a predefined charset, the following must be */ + /* true: The charset constructed for the glyphs in the font's */ + /* charstrings dictionary must match the predefined charset in */ + /* the first num_glyphs. */ + + charset->offset = offset; /* record charset type */ + + switch ( (FT_UInt)offset ) + { + case 0: + if ( num_glyphs > 229 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe ISO-Latin)!\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); + + break; + + case 1: + if ( num_glyphs > 166 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe Expert)!\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); + + break; + + case 2: + if ( num_glyphs > 87 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe Expert Subset)!\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); + + break; + + default: + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + + /* we have to invert the `sids' array for subsetted CID-keyed fonts */ + if ( invert ) + error = cff_charset_compute_cids( charset, num_glyphs, memory ); + + Exit: + /* Clean up if there was an error. */ + if ( error ) + { + FT_FREE( charset->sids ); + FT_FREE( charset->cids ); + charset->format = 0; + charset->offset = 0; + charset->sids = 0; + } + + return error; + } + + + static void + cff_encoding_done( CFF_Encoding encoding ) + { + encoding->format = 0; + encoding->offset = 0; + encoding->count = 0; + } + + + static FT_Error + cff_encoding_load( CFF_Encoding encoding, + CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset ) + { + FT_Error error = CFF_Err_Ok; + FT_UInt count; + FT_UInt j; + FT_UShort glyph_sid; + FT_UInt glyph_code; + + + /* Check for charset->sids. If we do not have this, we fail. */ + if ( !charset->sids ) + { + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Zero out the code to gid/sid mappings. */ + for ( j = 0; j < 256; j++ ) + { + encoding->sids [j] = 0; + encoding->codes[j] = 0; + } + + /* Note: The encoding table in a CFF font is indexed by glyph index; */ + /* the first encoded glyph index is 1. Hence, we read the character */ + /* code (`glyph_code') at index j and make the assignment: */ + /* */ + /* encoding->codes[glyph_code] = j + 1 */ + /* */ + /* We also make the assignment: */ + /* */ + /* encoding->sids[glyph_code] = charset->sids[j + 1] */ + /* */ + /* This gives us both a code to GID and a code to SID mapping. */ + + if ( offset > 1 ) + { + encoding->offset = base_offset + offset; + + /* we need to parse the table to determine its size */ + if ( FT_STREAM_SEEK( encoding->offset ) || + FT_READ_BYTE( encoding->format ) || + FT_READ_BYTE( count ) ) + goto Exit; + + switch ( encoding->format & 0x7F ) + { + case 0: + { + FT_Byte* p; + + + /* By convention, GID 0 is always ".notdef" and is never */ + /* coded in the font. Hence, the number of codes found */ + /* in the table is `count+1'. */ + /* */ + encoding->count = count + 1; + + if ( FT_FRAME_ENTER( count ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + + for ( j = 1; j <= count; j++ ) + { + glyph_code = *p++; + + /* Make sure j is not too big. */ + if ( j < num_glyphs ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)j; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[j]; + } + } + + FT_FRAME_EXIT(); + } + break; + + case 1: + { + FT_UInt nleft; + FT_UInt i = 1; + FT_UInt k; + + + encoding->count = 0; + + /* Parse the Format1 ranges. */ + for ( j = 0; j < count; j++, i += nleft ) + { + /* Read the first glyph code of the range. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the number of codes in the range. */ + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + + /* Increment nleft, so we read `nleft + 1' codes/sids. */ + nleft++; + + /* compute max number of character codes */ + if ( (FT_UInt)nleft > encoding->count ) + encoding->count = nleft; + + /* Fill in the range of codes/sids. */ + for ( k = i; k < nleft + i; k++, glyph_code++ ) + { + /* Make sure k is not too big. */ + if ( k < num_glyphs && glyph_code < 256 ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)k; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[k]; + } + } + } + + /* simple check; one never knows what can be found in a font */ + if ( encoding->count > 256 ) + encoding->count = 256; + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format!\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Parse supplemental encodings, if any. */ + if ( encoding->format & 0x80 ) + { + FT_UInt gindex; + + + /* count supplements */ + if ( FT_READ_BYTE( count ) ) + goto Exit; + + for ( j = 0; j < count; j++ ) + { + /* Read supplemental glyph code. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the SID associated with this glyph code. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = glyph_sid; + + /* First, look up GID which has been assigned to */ + /* SID glyph_sid. */ + for ( gindex = 0; gindex < num_glyphs; gindex++ ) + { + if ( charset->sids[gindex] == glyph_sid ) + { + encoding->codes[glyph_code] = (FT_UShort)gindex; + break; + } + } + } + } + } + else + { + /* We take into account the fact a CFF font can use a predefined */ + /* encoding without containing all of the glyphs encoded by this */ + /* encoding (see the note at the end of section 12 in the CFF */ + /* specification). */ + + switch ( (FT_UInt)offset ) + { + case 0: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); + goto Populate; + + case 1: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); + + Populate: + /* Construct code to GID mapping from code to SID mapping */ + /* and charset. */ + + encoding->count = 0; + + error = cff_charset_compute_cids( charset, num_glyphs, + stream->memory ); + if ( error ) + goto Exit; + + for ( j = 0; j < 256; j++ ) + { + FT_UInt sid = encoding->sids[j]; + FT_UInt gid = 0; + + + if ( sid ) + gid = cff_charset_cid_to_gindex( charset, sid ); + + if ( gid != 0 ) + { + encoding->codes[j] = (FT_UShort)gid; + + if ( encoding->count < j + 1 ) + encoding->count = j + 1; + } + else + { + encoding->codes[j] = 0; + encoding->sids [j] = 0; + } + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format!\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + + Exit: + + /* Clean up if there was an error. */ + return error; + } + + + static FT_Error + cff_subfont_load( CFF_SubFont font, + CFF_Index idx, + FT_UInt font_index, + FT_Stream stream, + FT_ULong base_offset ) + { + FT_Error error; + CFF_ParserRec parser; + FT_Byte* dict = NULL; + FT_ULong dict_len; + CFF_FontRecDict top = &font->font_dict; + CFF_Private priv = &font->private_dict; + + + cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict ); + + /* set defaults */ + FT_MEM_ZERO( top, sizeof ( *top ) ); + + top->underline_position = -100L << 16; + top->underline_thickness = 50L << 16; + top->charstring_type = 2; + top->font_matrix.xx = 0x10000L; + top->font_matrix.yy = 0x10000L; + top->cid_count = 8720; + + /* we use the implementation specific SID value 0xFFFF to indicate */ + /* missing entries */ + top->version = 0xFFFFU; + top->notice = 0xFFFFU; + top->copyright = 0xFFFFU; + top->full_name = 0xFFFFU; + top->family_name = 0xFFFFU; + top->weight = 0xFFFFU; + top->embedded_postscript = 0xFFFFU; + + top->cid_registry = 0xFFFFU; + top->cid_ordering = 0xFFFFU; + top->cid_font_name = 0xFFFFU; + + error = cff_index_access_element( idx, font_index, &dict, &dict_len ); + if ( !error ) + error = cff_parser_run( &parser, dict, dict + dict_len ); + + cff_index_forget_element( idx, &dict ); + + if ( error ) + goto Exit; + + /* if it is a CID font, we stop there */ + if ( top->cid_registry != 0xFFFFU ) + goto Exit; + + /* parse the private dictionary, if any */ + if ( top->private_offset && top->private_size ) + { + /* set defaults */ + FT_MEM_ZERO( priv, sizeof ( *priv ) ); + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = -1; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + cff_parser_init( &parser, CFF_CODE_PRIVATE, priv ); + + if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) || + FT_FRAME_ENTER( font->font_dict.private_size ) ) + goto Exit; + + error = cff_parser_run( &parser, + (FT_Byte*)stream->cursor, + (FT_Byte*)stream->limit ); + FT_FRAME_EXIT(); + if ( error ) + goto Exit; + + /* ensure that `num_blue_values' is even */ + priv->num_blue_values &= ~1; + } + + /* read the local subrs, if any */ + if ( priv->local_subrs_offset ) + { + if ( FT_STREAM_SEEK( base_offset + top->private_offset + + priv->local_subrs_offset ) ) + goto Exit; + + error = cff_index_init( &font->local_subrs_index, stream, 1 ); + if ( error ) + goto Exit; + + font->num_local_subrs = font->local_subrs_index.count; + error = cff_index_get_pointers( &font->local_subrs_index, + &font->local_subrs ); + if ( error ) + goto Exit; + } + + Exit: + return error; + } + + + static void + cff_subfont_done( FT_Memory memory, + CFF_SubFont subfont ) + { + if ( subfont ) + { + cff_index_done( &subfont->local_subrs_index ); + FT_FREE( subfont->local_subrs ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_font_load( FT_Stream stream, + FT_Int face_index, + CFF_Font font, + FT_Bool pure_cff ) + { + static const FT_Frame_Field cff_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRec + + FT_FRAME_START( 4 ), + FT_FRAME_BYTE( version_major ), + FT_FRAME_BYTE( version_minor ), + FT_FRAME_BYTE( header_size ), + FT_FRAME_BYTE( absolute_offsize ), + FT_FRAME_END + }; + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong base_offset; + CFF_FontRecDict dict; + + + FT_ZERO( font ); + + font->stream = stream; + font->memory = memory; + dict = &font->top_font.font_dict; + base_offset = FT_STREAM_POS(); + + /* read CFF font header */ + if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) + goto Exit; + + /* check format */ + if ( font->version_major != 1 || + font->header_size < 4 || + font->absolute_offsize > 4 ) + { + FT_TRACE2(( "[not a CFF font header!]\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + /* skip the rest of the header */ + if ( FT_STREAM_SKIP( font->header_size - 4 ) ) + goto Exit; + + /* read the name, top dict, string and global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->name_index, + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &font->font_dict_index, + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &font->string_index, + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1 ) ) ) + goto Exit; + + /* well, we don't really forget the `disabled' fonts... */ + font->num_faces = font->name_index.count; + if ( face_index >= (FT_Int)font->num_faces ) + { + FT_ERROR(( "cff_font_load: incorrect face index = %d\n", + face_index )); + error = CFF_Err_Invalid_Argument; + } + + /* in case of a font format check, simply exit now */ + if ( face_index < 0 ) + goto Exit; + + /* now, parse the top-level font dictionary */ + error = cff_subfont_load( &font->top_font, + &font->font_dict_index, + face_index, + stream, + base_offset ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) + goto Exit; + + error = cff_index_init( &font->charstrings_index, stream, 0 ); + if ( error ) + goto Exit; + + /* now, check for a CID font */ + if ( dict->cid_registry != 0xFFFFU ) + { + CFF_IndexRec fd_index; + CFF_SubFont sub; + FT_UInt idx; + + + /* this is a CID-keyed font, we must now allocate a table of */ + /* sub-fonts, then load each of them separately */ + if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) + goto Exit; + + error = cff_index_init( &fd_index, stream, 0 ); + if ( error ) + goto Exit; + + if ( fd_index.count > CFF_MAX_CID_FONTS ) + { + FT_ERROR(( "cff_font_load: FD array too large in CID font\n" )); + goto Fail_CID; + } + + /* allocate & read each font dict independently */ + font->num_subfonts = fd_index.count; + if ( FT_NEW_ARRAY( sub, fd_index.count ) ) + goto Fail_CID; + + /* set up pointer table */ + for ( idx = 0; idx < fd_index.count; idx++ ) + font->subfonts[idx] = sub + idx; + + /* now load each subfont independently */ + for ( idx = 0; idx < fd_index.count; idx++ ) + { + sub = font->subfonts[idx]; + error = cff_subfont_load( sub, &fd_index, idx, + stream, base_offset ); + if ( error ) + goto Fail_CID; + } + + /* now load the FD Select array */ + error = CFF_Load_FD_Select( &font->fd_select, + font->charstrings_index.count, + stream, + base_offset + dict->cid_fd_select_offset ); + + Fail_CID: + cff_index_done( &fd_index ); + + if ( error ) + goto Exit; + } + else + font->num_subfonts = 0; + + /* read the charstrings index now */ + if ( dict->charstrings_offset == 0 ) + { + FT_ERROR(( "cff_font_load: no charstrings offset!\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + /* explicit the global subrs */ + font->num_global_subrs = font->global_subrs_index.count; + font->num_glyphs = font->charstrings_index.count; + + error = cff_index_get_pointers( &font->global_subrs_index, + &font->global_subrs ) ; + + if ( error ) + goto Exit; + + /* read the Charset and Encoding tables if available */ + if ( font->num_glyphs > 0 ) + { + FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff ); + + + error = cff_charset_load( &font->charset, font->num_glyphs, stream, + base_offset, dict->charset_offset, invert ); + if ( error ) + goto Exit; + + /* CID-keyed CFFs don't have an encoding */ + if ( dict->cid_registry == 0xFFFFU ) + { + error = cff_encoding_load( &font->encoding, + &font->charset, + font->num_glyphs, + stream, + base_offset, + dict->encoding_offset ); + if ( error ) + goto Exit; + } + } + + /* get the font name (/CIDFontName for CID-keyed fonts, */ + /* /FontName otherwise) */ + font->font_name = cff_index_get_name( &font->name_index, face_index ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_font_done( CFF_Font font ) + { + FT_Memory memory = font->memory; + FT_UInt idx; + + + cff_index_done( &font->global_subrs_index ); + cff_index_done( &font->string_index ); + cff_index_done( &font->font_dict_index ); + cff_index_done( &font->name_index ); + cff_index_done( &font->charstrings_index ); + + /* release font dictionaries, but only if working with */ + /* a CID keyed CFF font */ + if ( font->num_subfonts > 0 ) + { + for ( idx = 0; idx < font->num_subfonts; idx++ ) + cff_subfont_done( memory, font->subfonts[idx] ); + + /* the subfonts array has been allocated as a single block */ + FT_FREE( font->subfonts[0] ); + } + + cff_encoding_done( &font->encoding ); + cff_charset_done( &font->charset, font->stream ); + + cff_subfont_done( memory, &font->top_font ); + + CFF_Done_FD_Select( &font->fd_select, font->stream ); + + if (font->font_info != NULL) + { + FT_FREE( font->font_info->version ); + FT_FREE( font->font_info->notice ); + FT_FREE( font->font_info->full_name ); + FT_FREE( font->font_info->family_name ); + FT_FREE( font->font_info->weight ); + FT_FREE( font->font_info ); + } + + FT_FREE( font->registry ); + FT_FREE( font->ordering ); + + FT_FREE( font->global_subrs ); + FT_FREE( font->font_name ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffload.h b/src/3rdparty/freetype/src/cff/cffload.h new file mode 100644 index 0000000000..02498bd5e0 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffload.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* cffload.h */ +/* */ +/* OpenType & CFF data/program tables loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFLOAD_H__ +#define __CFFLOAD_H__ + + +#include <ft2build.h> +#include "cfftypes.h" +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + FT_LOCAL( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ); + + + FT_LOCAL( FT_String* ) + cff_index_get_name( CFF_Index idx, + FT_UInt element ); + + FT_LOCAL( FT_String* ) + cff_index_get_sid_string( CFF_Index idx, + FT_UInt sid, + FT_Service_PsCMaps psnames ); + + + FT_LOCAL( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ); + + FT_LOCAL( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ); + + + FT_LOCAL( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ); + + + FT_LOCAL( FT_Error ) + cff_font_load( FT_Stream stream, + FT_Int face_index, + CFF_Font font, + FT_Bool pure_cff ); + + FT_LOCAL( void ) + cff_font_done( CFF_Font font ); + + + FT_LOCAL( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ); + + +FT_END_HEADER + +#endif /* __CFFLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffobjs.c b/src/3rdparty/freetype/src/cff/cffobjs.c new file mode 100644 index 0000000000..3525ea3b7d --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffobjs.c @@ -0,0 +1,965 @@ +/***************************************************************************/ +/* */ +/* cffobjs.c */ +/* */ +/* OpenType objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_ERRORS_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_SFNT_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include "cffobjs.h" +#include "cffload.h" +#include "cffcmap.h" +#include "cfferrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffobjs + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /* Note that we store the global hints in the size's `internal' root */ + /* field. */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + cff_size_get_globals_funcs( CFF_Size size ) + { + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = (PSHinter_Service)font->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + cff_size_done( FT_Size cffsize ) /* CFF_Size */ + { + CFF_Size size = (CFF_Size)cffsize; + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)cffsize->internal; + + + if ( internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = cff_size_get_globals_funcs( size ); + if ( funcs ) + { + FT_UInt i; + + + funcs->destroy( internal->topfont ); + + for ( i = font->num_subfonts; i > 0; i-- ) + funcs->destroy( internal->subfonts[i - 1] ); + } + + /* `internal' is freed by destroy_size (in ftobjs.c) */ + } + } + + + /* CFF and Type 1 private dictionaries have slightly different */ + /* structures; we need to synthesize a Type 1 dictionary on the fly */ + + static void + cff_make_private_dict( CFF_SubFont subfont, + PS_Private priv ) + { + CFF_Private cpriv = &subfont->private_dict; + FT_UInt n, count; + + + FT_MEM_ZERO( priv, sizeof ( *priv ) ); + + count = priv->num_blue_values = cpriv->num_blue_values; + for ( n = 0; n < count; n++ ) + priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; + + count = priv->num_other_blues = cpriv->num_other_blues; + for ( n = 0; n < count; n++ ) + priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; + + count = priv->num_family_blues = cpriv->num_family_blues; + for ( n = 0; n < count; n++ ) + priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; + + count = priv->num_family_other_blues = cpriv->num_family_other_blues; + for ( n = 0; n < count; n++ ) + priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; + + priv->blue_scale = cpriv->blue_scale; + priv->blue_shift = (FT_Int)cpriv->blue_shift; + priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; + + priv->standard_width[0] = (FT_UShort)cpriv->standard_width; + priv->standard_height[0] = (FT_UShort)cpriv->standard_height; + + count = priv->num_snap_widths = cpriv->num_snap_widths; + for ( n = 0; n < count; n++ ) + priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; + + count = priv->num_snap_heights = cpriv->num_snap_heights; + for ( n = 0; n < count; n++ ) + priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; + + priv->force_bold = cpriv->force_bold; + priv->language_group = cpriv->language_group; + priv->lenIV = cpriv->lenIV; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_size_init( FT_Size cffsize ) /* CFF_Size */ + { + CFF_Size size = (CFF_Size)cffsize; + FT_Error error = CFF_Err_Ok; + PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); + + + if ( funcs ) + { + CFF_Face face = (CFF_Face)cffsize->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal; + + PS_PrivateRec priv; + FT_Memory memory = cffsize->face->memory; + + FT_UInt i; + + + if ( FT_NEW( internal ) ) + goto Exit; + + cff_make_private_dict( &font->top_font, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->topfont ); + if ( error ) + goto Exit; + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + + + cff_make_private_dict( sub, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->subfonts[i - 1] ); + if ( error ) + goto Exit; + } + + cffsize->internal = (FT_Size_Internal)(void*)internal; + } + + size->strike_index = 0xFFFFFFFFUL; + + Exit: + return error; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + + cffsize->strike_index = strike_index; + + FT_Select_Metrics( size->face, strike_index ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face face = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal; + + FT_Int top_upm = font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_Int sub_upm = sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return CFF_Err_Ok; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + FT_LOCAL_DEF( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + CFF_Face cffface = (CFF_Face)size->face; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; + FT_ULong strike_index; + + + if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) + cffsize->strike_index = 0xFFFFFFFFUL; + else + return cff_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + FT_Request_Metrics( size->face, req ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face cffface = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)cffface->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal; + + FT_Int top_upm = font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_Int sub_upm = sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return CFF_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + cff_slot_done( FT_GlyphSlot slot ) + { + slot->internal->glyph_hints = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ) + { + CFF_Face face = (CFF_Face)slot->face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = (PSHinter_Service)font->pshinter; + + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->face->driver->root.library, + "pshinter" ); + if ( module ) + { + T2_Hints_Funcs funcs; + + + funcs = pshinter->get_t2_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return CFF_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + static FT_String* + cff_strcpy( FT_Memory memory, + const FT_String* source ) + { + FT_Error error; + FT_String* result; + + + (void)FT_STRDUP( result, source ); + + FT_UNUSED( error ); + + return result; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face cffface, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + CFF_Face face = (CFF_Face)cffface; + FT_Error error; + SFNT_Service sfnt; + FT_Service_PsCMaps psnames; + PSHinter_Service pshinter; + FT_Bool pure_cff = 1; + FT_Bool sfnt_format = 0; + + +#if 0 + FT_FACE_FIND_GLOBAL_SERVICE( face, sfnt, SFNT ); + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_NAMES ); + FT_FACE_FIND_GLOBAL_SERVICE( face, pshinter, POSTSCRIPT_HINTER ); + + if ( !sfnt ) + goto Bad_Format; +#else + sfnt = (SFNT_Service)FT_Get_Module_Interface( + cffface->driver->root.library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + + pshinter = (PSHinter_Service)FT_Get_Module_Interface( + cffface->driver->root.library, "pshinter" ); +#endif + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check whether we have a valid OpenType file */ + error = sfnt->init_face( stream, face, face_index, num_params, params ); + if ( !error ) + { + if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ + { + FT_TRACE2(( "[not a valid OpenType/CFF font]\n" )); + goto Bad_Format; + } + + /* if we are performing a simple font format check, exit immediately */ + if ( face_index < 0 ) + return CFF_Err_Ok; + + /* UNDOCUMENTED! A CFF in an SFNT can have only a single font. */ + if ( face_index > 0 ) + { + FT_ERROR(( "cff_face_init: invalid face index\n" )); + error = CFF_Err_Invalid_Argument; + goto Exit; + } + + sfnt_format = 1; + + /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ + /* font; in the latter case it doesn't have a `head' table */ + error = face->goto_table( face, TTAG_head, stream, 0 ); + if ( !error ) + { + pure_cff = 0; + + /* load font directory */ + error = sfnt->load_face( stream, face, 0, num_params, params ); + if ( error ) + goto Exit; + } + else + { + /* load the `cmap' table explicitly */ + error = sfnt->load_cmap( face, stream ); + if ( error ) + goto Exit; + + /* XXX: we don't load the GPOS table, as OpenType Layout */ + /* support will be added later to a layout library on top of */ + /* FreeType 2 */ + } + + /* now load the CFF part of the file */ + error = face->goto_table( face, TTAG_CFF, stream, 0 ); + if ( error ) + goto Exit; + } + else + { + /* rewind to start of file; we are going to load a pure-CFF font */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + error = CFF_Err_Ok; + } + + /* now load and parse the CFF table in the file */ + { + CFF_Font cff; + CFF_FontRecDict dict; + FT_Memory memory = cffface->memory; + FT_Int32 flags; + FT_UInt i; + + + if ( FT_NEW( cff ) ) + goto Exit; + + face->extra.data = cff; + error = cff_font_load( stream, face_index, cff, pure_cff ); + if ( error ) + goto Exit; + + cff->pshinter = pshinter; + cff->psnames = (void*)psnames; + + cffface->face_index = face_index; + + /* Complement the root flags with some interesting information. */ + /* Note that this is only necessary for pure CFF and CEF fonts; */ + /* SFNT based fonts use the `name' table instead. */ + + cffface->num_glyphs = cff->num_glyphs; + + dict = &cff->top_font.font_dict; + + /* we need the `PSNames' module for CFF and CEF formats */ + /* which aren't CID-keyed */ + if ( dict->cid_registry == 0xFFFFU && !psnames ) + { + FT_ERROR(( "cff_face_init:" )); + FT_ERROR(( " cannot open CFF & CEF fonts\n" )); + FT_ERROR(( " " )); + FT_ERROR(( " without the `PSNames' module\n" )); + goto Bad_Format; + } + + if ( !dict->units_per_em ) + dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; + + /* Normalize the font matrix so that `matrix->xx' is 1; the */ + /* scaling is done with `units_per_em' then (at this point, */ + /* it already contains the scaling factor, but without */ + /* normalization of the matrix). */ + /* */ + /* Note that the offsets must be expressed in integer font */ + /* units. */ + + { + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Fixed temp = FT_ABS( matrix->yy ); + + + if ( temp != 0x10000L ) + { + *upm = FT_DivFix( *upm, temp ); + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + for ( i = cff->num_subfonts; i > 0; i-- ) + { + CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; + CFF_FontRecDict top = &cff->top_font.font_dict; + + FT_Matrix* matrix; + FT_Vector* offset; + FT_ULong* upm; + FT_Fixed temp; + + + if ( sub->units_per_em ) + { + FT_Int scaling; + + + if ( top->units_per_em > 1 && sub->units_per_em > 1 ) + scaling = FT_MIN( top->units_per_em, sub->units_per_em ); + else + scaling = 1; + + FT_Matrix_Multiply_Scaled( &top->font_matrix, + &sub->font_matrix, + scaling ); + FT_Vector_Transform_Scaled( &sub->font_offset, + &top->font_matrix, + scaling ); + + sub->units_per_em = FT_MulDiv( sub->units_per_em, + top->units_per_em, + scaling ); + } + else + { + sub->font_matrix = top->font_matrix; + sub->font_offset = top->font_offset; + + sub->units_per_em = top->units_per_em; + } + + matrix = &sub->font_matrix; + offset = &sub->font_offset; + upm = &sub->units_per_em; + temp = FT_ABS( matrix->yy ); + + if ( temp != 0x10000L ) + { + *upm = FT_DivFix( *upm, temp ); + + /* if *upm is larger than 100*1000 we divide by 1000 -- */ + /* this can happen if e.g. there is no top-font FontMatrix */ + /* and the subfont FontMatrix already contains the complete */ + /* scaling for the subfont (see section 5.11 of the PLRM) */ + + /* 100 is a heuristic value */ + + if ( *upm > 100L * 1000L ) + *upm = ( *upm + 500 ) / 1000; + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + if ( pure_cff ) + { + char* style_name = NULL; + + + /* set up num_faces */ + cffface->num_faces = cff->num_faces; + + /* compute number of glyphs */ + if ( dict->cid_registry != 0xFFFFU ) + cffface->num_glyphs = cff->charset.max_cid; + else + cffface->num_glyphs = cff->charstrings_index.count; + + /* set global bbox, as well as EM size */ + cffface->bbox.xMin = dict->font_bbox.xMin >> 16; + cffface->bbox.yMin = dict->font_bbox.yMin >> 16; + cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFFU ) >> 16; + cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFFU ) >> 16; + + cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); + + cffface->ascender = (FT_Short)( cffface->bbox.yMax ); + cffface->descender = (FT_Short)( cffface->bbox.yMin ); + + cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); + if ( cffface->height < cffface->ascender - cffface->descender ) + cffface->height = (FT_Short)( cffface->ascender - cffface->descender ); + + cffface->underline_position = + (FT_Short)( dict->underline_position >> 16 ); + cffface->underline_thickness = + (FT_Short)( dict->underline_thickness >> 16 ); + + /* retrieve font family & style name */ + cffface->family_name = cff_index_get_name( &cff->name_index, + face_index ); + + if ( cffface->family_name ) + { + char* full = cff_index_get_sid_string( &cff->string_index, + dict->full_name, + psnames ); + char* fullp = full; + char* family = cffface->family_name; + char* family_name = 0; + + + if ( dict->family_name ) + { + family_name = cff_index_get_sid_string( &cff->string_index, + dict->family_name, + psnames); + if ( family_name ) + family = family_name; + } + + /* We try to extract the style name from the full name. */ + /* We need to ignore spaces and dashes during the search. */ + if ( full && family ) + { + while ( *fullp ) + { + /* skip common characters at the start of both strings */ + if ( *fullp == *family ) + { + family++; + fullp++; + continue; + } + + /* ignore spaces and dashes in full name during comparison */ + if ( *fullp == ' ' || *fullp == '-' ) + { + fullp++; + continue; + } + + /* ignore spaces and dashes in family name during comparison */ + if ( *family == ' ' || *family == '-' ) + { + family++; + continue; + } + + if ( !*family && *fullp ) + { + /* The full name begins with the same characters as the */ + /* family name, with spaces and dashes removed. In this */ + /* case, the remaining string in `fullp' will be used as */ + /* the style name. */ + style_name = cff_strcpy( memory, fullp ); + } + break; + } + + if ( family_name ) + FT_FREE( family_name ); + FT_FREE( full ); + } + } + else + { + char *cid_font_name = + cff_index_get_sid_string( &cff->string_index, + dict->cid_font_name, + psnames ); + + + /* do we have a `/FontName' for a CID-keyed font? */ + if ( cid_font_name ) + cffface->family_name = cid_font_name; + } + + if ( style_name ) + cffface->style_name = style_name; + else + /* assume "Regular" style if we don't know better */ + cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); + + /*******************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ + + if ( sfnt_format ) + flags |= FT_FACE_FLAG_SFNT; + + /* fixed width font? */ + if ( dict->is_fixed_pitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ +#if 0 + /* kerning available? */ + if ( face->kern_pairs ) + flags |= FT_FACE_FLAG_KERNING; +#endif + + cffface->face_flags = flags; + + /*******************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + flags = 0; + + if ( dict->italic_angle ) + flags |= FT_STYLE_FLAG_ITALIC; + + { + char *weight = cff_index_get_sid_string( &cff->string_index, + dict->weight, + psnames ); + + + if ( weight ) + if ( !ft_strcmp( weight, "Bold" ) || + !ft_strcmp( weight, "Black" ) ) + flags |= FT_STYLE_FLAG_BOLD; + FT_FREE( weight ); + } + + /* double check */ + if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) + if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || + !ft_strncmp( cffface->style_name, "Black", 5 ) ) + flags |= FT_STYLE_FLAG_BOLD; + + cffface->style_flags = flags; + } + + +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ + /* has unset this flag because of the 3.0 `post' table. */ + if ( dict->cid_registry == 0xFFFFU ) + cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + if ( dict->cid_registry != 0xFFFFU && pure_cff ) + cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; + + + /*******************************************************************/ + /* */ + /* Compute char maps. */ + /* */ + + /* Try to synthesize a Unicode charmap if there is none available */ + /* already. If an OpenType font contains a Unicode "cmap", we */ + /* will use it, whatever be in the CFF part of the file. */ + { + FT_CharMapRec cmaprec; + FT_CharMap cmap; + FT_UInt nn; + CFF_Encoding encoding = &cff->encoding; + + + for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ ) + { + cmap = cffface->charmaps[nn]; + + /* Windows Unicode (3,1)? */ + if ( cmap->platform_id == 3 && cmap->encoding_id == 1 ) + goto Skip_Unicode; + + /* Deprecated Unicode platform id? */ + if ( cmap->platform_id == 0 ) + goto Skip_Unicode; /* Standard Unicode (deprecated) */ + } + + /* since CID-keyed fonts don't contain glyph names, we can't */ + /* construct a cmap */ + if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) + goto Exit; + + /* we didn't find a Unicode charmap -- synthesize one */ + cmaprec.face = cffface; + cmaprec.platform_id = 3; + cmaprec.encoding_id = 1; + cmaprec.encoding = FT_ENCODING_UNICODE; + + nn = (FT_UInt)cffface->num_charmaps; + + FT_CMap_New( &cff_cmap_unicode_class_rec, NULL, &cmaprec, NULL ); + + /* if no Unicode charmap was previously selected, select this one */ + if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) + cffface->charmap = cffface->charmaps[nn]; + + Skip_Unicode: + if ( encoding->count > 0 ) + { + FT_CMap_Class clazz; + + + cmaprec.face = cffface; + cmaprec.platform_id = 7; /* Adobe platform id */ + + if ( encoding->offset == 0 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; + cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; + clazz = &cff_cmap_encoding_class_rec; + } + else if ( encoding->offset == 1 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; + cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; + clazz = &cff_cmap_encoding_class_rec; + } + else + { + cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; + cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; + clazz = &cff_cmap_encoding_class_rec; + } + + FT_CMap_New( clazz, NULL, &cmaprec, NULL ); + } + } + } + + Exit: + return error; + + Bad_Format: + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + cff_face_done( FT_Face cffface ) /* CFF_Face */ + { + CFF_Face face = (CFF_Face)cffface; + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = cffface->memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + sfnt->done_face( face ); + + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + cff_font_done( cff ); + FT_FREE( face->extra.data ); + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_driver_init( FT_Module module ) + { + FT_UNUSED( module ); + + return CFF_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + cff_driver_done( FT_Module module ) + { + FT_UNUSED( module ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffobjs.h b/src/3rdparty/freetype/src/cff/cffobjs.h new file mode 100644 index 0000000000..3c81cee009 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffobjs.h @@ -0,0 +1,181 @@ +/***************************************************************************/ +/* */ +/* cffobjs.h */ +/* */ +/* OpenType objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFOBJS_H__ +#define __CFFOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include "cfftypes.h" +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Driver */ + /* */ + /* <Description> */ + /* A handle to an OpenType driver object. */ + /* */ + typedef struct CFF_DriverRec_* CFF_Driver; + + typedef TT_Face CFF_Face; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Size */ + /* */ + /* <Description> */ + /* A handle to an OpenType size object. */ + /* */ + typedef struct CFF_SizeRec_ + { + FT_SizeRec root; + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + + } CFF_SizeRec, *CFF_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to an OpenType glyph slot object. */ + /* */ + typedef struct CFF_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } CFF_GlyphSlotRec, *CFF_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Internal */ + /* */ + /* <Description> */ + /* The interface to the `internal' field of `FT_Size'. */ + /* */ + typedef struct CFF_InternalRec_ + { + PSH_Globals topfont; + PSH_Globals subfonts[CFF_MAX_CID_FONTS]; + + } CFF_InternalRec, *CFF_Internal; + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct CFF_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } CFF_Transform; + + + /***********************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct CFF_DriverRec_ + { + FT_DriverRec root; + void* extension_component; + + } CFF_DriverRec; + + + FT_LOCAL( FT_Error ) + cff_size_init( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( void ) + cff_size_done( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ); + +#endif + + FT_LOCAL( void ) + cff_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face face, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cff_face_done( FT_Face face ); /* CFF_Face */ + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_driver_init( FT_Module module ); + + FT_LOCAL( void ) + cff_driver_done( FT_Module module ); + + +FT_END_HEADER + +#endif /* __CFFOBJS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffparse.c b/src/3rdparty/freetype/src/cff/cffparse.c new file mode 100644 index 0000000000..290595f9e8 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffparse.c @@ -0,0 +1,848 @@ +/***************************************************************************/ +/* */ +/* cffparse.c */ +/* */ +/* CFF token stream parser (body) */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "cffparse.h" +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + +#include "cfferrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffparse + + + enum + { + cff_kind_none = 0, + cff_kind_num, + cff_kind_fixed, + cff_kind_fixed_thousand, + cff_kind_string, + cff_kind_bool, + cff_kind_delta, + cff_kind_callback, + + cff_kind_max /* do not remove */ + }; + + + /* now generate handlers for the most simple fields */ + typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); + + typedef struct CFF_Field_Handler_ + { + int kind; + int code; + FT_UInt offset; + FT_Byte size; + CFF_Field_Reader reader; + FT_UInt array_max; + FT_UInt count_offset; + + } CFF_Field_Handler; + + + FT_LOCAL_DEF( void ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object ) + { + FT_MEM_ZERO( parser, sizeof ( *parser ) ); + + parser->top = parser->stack; + parser->object_code = code; + parser->object = object; + } + + + /* read an integer */ + static FT_Long + cff_parse_integer( FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Int v = *p++; + FT_Long val = 0; + + + if ( v == 28 ) + { + if ( p + 2 > limit ) + goto Bad; + + val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] ); + p += 2; + } + else if ( v == 29 ) + { + if ( p + 4 > limit ) + goto Bad; + + val = ( (FT_Long)p[0] << 24 ) | + ( (FT_Long)p[1] << 16 ) | + ( (FT_Long)p[2] << 8 ) | + p[3]; + p += 4; + } + else if ( v < 247 ) + { + val = v - 139; + } + else if ( v < 251 ) + { + if ( p + 1 > limit ) + goto Bad; + + val = ( v - 247 ) * 256 + p[0] + 108; + p++; + } + else + { + if ( p + 1 > limit ) + goto Bad; + + val = -( v - 251 ) * 256 - p[0] - 108; + p++; + } + + Exit: + return val; + + Bad: + val = 0; + goto Exit; + } + + + static const FT_Long power_tens[] = + { + 1L, + 10L, + 100L, + 1000L, + 10000L, + 100000L, + 1000000L, + 10000000L, + 100000000L, + 1000000000L + }; + + + /* read a real */ + static FT_Fixed + cff_parse_real( FT_Byte* start, + FT_Byte* limit, + FT_Int power_ten, + FT_Int* scaling ) + { + FT_Byte* p = start; + FT_UInt nib; + FT_UInt phase; + + FT_Long result, number, rest, exponent; + FT_Int sign = 0, exponent_sign = 0; + FT_Int exponent_add, integer_length, fraction_length; + + + if ( scaling ) + *scaling = 0; + + result = 0; + + number = 0; + rest = 0; + exponent = 0; + + exponent_add = 0; + integer_length = 0; + fraction_length = 0; + + /* First of all, read the integer part. */ + phase = 4; + + for (;;) + { + /* If we entered this iteration with phase == 4, we need to */ + /* read a new byte. This also skips past the initial 0x1E. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + + if ( nib == 0xE ) + sign = 1; + else if ( nib > 9 ) + break; + else + { + /* Increase exponent if we can't add the digit. */ + if ( number >= 0xCCCCCCCL ) + exponent_add++; + /* Skip leading zeros. */ + else if ( nib || number ) + { + integer_length++; + number = number * 10 + nib; + } + } + } + + /* Read fraction part, if any. */ + if ( nib == 0xa ) + for (;;) + { + /* If we entered this iteration with phase == 4, we need */ + /* to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + /* Skip leading zeros if possible. */ + if ( !nib && !number ) + exponent_add--; + /* Only add digit if we don't overflow. */ + else if ( number < 0xCCCCCCCL && fraction_length < 9 ) + { + fraction_length++; + number = number * 10 + nib; + } + } + + /* Read exponent, if any. */ + if ( nib == 12 ) + { + exponent_sign = 1; + nib = 11; + } + + if ( nib == 11 ) + { + for (;;) + { + /* If we entered this iteration with phase == 4, */ + /* we need to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + exponent = exponent * 10 + nib; + + /* Arbitrarily limit exponent. */ + if ( exponent > 1000 ) + goto Exit; + } + + if ( exponent_sign ) + exponent = -exponent; + } + + /* We don't check `power_ten' and `exponent_add'. */ + exponent += power_ten + exponent_add; + + if ( scaling ) + { + /* Only use `fraction_length'. */ + fraction_length += integer_length; + exponent += integer_length; + + if ( fraction_length <= 5 ) + { + if ( number > 0x7FFFL ) + { + result = FT_DivFix( number, 10 ); + *scaling = exponent - fraction_length + 1; + } + else + { + if ( exponent > 0 ) + { + FT_Int new_fraction_length, shift; + + + /* Make `scaling' as small as possible. */ + new_fraction_length = FT_MIN( exponent, 5 ); + exponent -= new_fraction_length; + shift = new_fraction_length - fraction_length; + + number *= power_tens[shift]; + if ( number > 0x7FFFL ) + { + number /= 10; + exponent += 1; + } + } + else + exponent -= fraction_length; + + result = number << 16; + *scaling = exponent; + } + } + else + { + if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) + { + result = FT_DivFix( number, power_tens[fraction_length - 4] ); + *scaling = exponent - 4; + } + else + { + result = FT_DivFix( number, power_tens[fraction_length - 5] ); + *scaling = exponent - 5; + } + } + } + else + { + integer_length += exponent; + fraction_length -= exponent; + + /* Check for overflow and underflow. */ + if ( FT_ABS( integer_length ) > 5 ) + goto Exit; + + /* Remove non-significant digits. */ + if ( integer_length < 0 ) { + number /= power_tens[-integer_length]; + fraction_length += integer_length; + } + + /* Convert into 16.16 format. */ + if ( fraction_length > 0 ) + { + if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) + goto Exit; + + result = FT_DivFix( number, power_tens[fraction_length] ); + } + else + { + number *= power_tens[-fraction_length]; + + if ( number > 0x7FFFL ) + goto Exit; + + result = number << 16; + } + } + + if ( sign ) + result = -result; + + Exit: + return result; + } + + + /* read a number, either integer or real */ + static FT_Long + cff_parse_num( FT_Byte** d ) + { + return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 ) + : cff_parse_integer( d[0], d[1] ); + } + + + /* read a floating point number, either integer or real */ + static FT_Fixed + cff_parse_fixed( FT_Byte** d ) + { + return **d == 30 ? cff_parse_real( d[0], d[1], 0, NULL ) + : cff_parse_integer( d[0], d[1] ) << 16; + } + + + /* read a floating point number, either integer or real, */ + /* but return `10^scaling' times the number read in */ + static FT_Fixed + cff_parse_fixed_scaled( FT_Byte** d, + FT_Int scaling ) + { + return **d == 30 ? cff_parse_real( d[0], d[1], scaling, NULL ) + : ( cff_parse_integer( d[0], d[1] ) * + power_tens[scaling] ) << 16; + } + + + /* read a floating point number, either integer or real, */ + /* and return it as precise as possible -- `scaling' returns */ + /* the scaling factor (as a power of 10) */ + static FT_Fixed + cff_parse_fixed_dynamic( FT_Byte** d, + FT_Int* scaling ) + { + FT_ASSERT( scaling ); + + if ( **d == 30 ) + return cff_parse_real( d[0], d[1], 0, scaling ); + else + { + FT_Long number; + FT_Int integer_length; + + + number = cff_parse_integer( d[0], d[1] ); + + if ( number > 0x7FFFL ) + { + for ( integer_length = 5; integer_length < 10; integer_length++ ) + if ( number < power_tens[integer_length] ) + break; + + if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) + { + *scaling = integer_length - 4; + return FT_DivFix( number, power_tens[integer_length - 4] ); + } + else + { + *scaling = integer_length - 5; + return FT_DivFix( number, power_tens[integer_length - 5] ); + } + } + else + { + *scaling = 0; + return number << 16; + } + } + } + + + static FT_Error + cff_parse_font_matrix( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Byte** data = parser->stack; + FT_Error error = CFF_Err_Stack_Underflow; + + + if ( parser->top >= parser->stack + 6 ) + { + FT_Int scaling; + + + error = CFF_Err_Ok; + + /* We expect a well-formed font matrix, this is, the matrix elements */ + /* `xx' and `yy' are of approximately the same magnitude. To avoid */ + /* loss of precision, we use the magnitude of element `xx' to scale */ + /* all other elements. The scaling factor is then contained in the */ + /* `units_per_em' value. */ + + matrix->xx = cff_parse_fixed_dynamic( data++, &scaling ); + + scaling = -scaling; + + if ( scaling < 0 || scaling > 9 ) + { + /* Return default matrix in case of unlikely values. */ + matrix->xx = 0x10000L; + matrix->yx = 0; + matrix->yx = 0; + matrix->yy = 0x10000L; + offset->x = 0; + offset->y = 0; + *upm = 1; + + goto Exit; + } + + matrix->yx = cff_parse_fixed_scaled( data++, scaling ); + matrix->xy = cff_parse_fixed_scaled( data++, scaling ); + matrix->yy = cff_parse_fixed_scaled( data++, scaling ); + offset->x = cff_parse_fixed_scaled( data++, scaling ); + offset->y = cff_parse_fixed_scaled( data, scaling ); + + *upm = power_tens[scaling]; + } + + Exit: + return error; + } + + + static FT_Error + cff_parse_font_bbox( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_BBox* bbox = &dict->font_bbox; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 4 ) + { + bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); + error = CFF_Err_Ok; + } + + return error; + } + + + static FT_Error + cff_parse_private_dict( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 2 ) + { + dict->private_size = cff_parse_num( data++ ); + dict->private_offset = cff_parse_num( data ); + error = CFF_Err_Ok; + } + + return error; + } + + + static FT_Error + cff_parse_cid_ros( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 3 ) + { + dict->cid_registry = (FT_UInt)cff_parse_num ( data++ ); + dict->cid_ordering = (FT_UInt)cff_parse_num ( data++ ); + dict->cid_supplement = (FT_ULong)cff_parse_num( data ); + error = CFF_Err_Ok; + } + + return error; + } + + +#define CFF_FIELD_NUM( code, name ) \ + CFF_FIELD( code, name, cff_kind_num ) +#define CFF_FIELD_FIXED( code, name ) \ + CFF_FIELD( code, name, cff_kind_fixed ) +#define CFF_FIELD_FIXED_1000( code, name ) \ + CFF_FIELD( code, name, cff_kind_fixed_thousand ) +#define CFF_FIELD_STRING( code, name ) \ + CFF_FIELD( code, name, cff_kind_string ) +#define CFF_FIELD_BOOL( code, name ) \ + CFF_FIELD( code, name, cff_kind_bool ) +#define CFF_FIELD_DELTA( code, name, max ) \ + CFF_FIELD( code, name, cff_kind_delta ) + +#define CFF_FIELD_CALLBACK( code, name ) \ + { \ + cff_kind_callback, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_ ## name, \ + 0, 0 \ + }, + +#undef CFF_FIELD +#define CFF_FIELD( code, name, kind ) \ + { \ + kind, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE( name ), \ + 0, 0, 0 \ + }, + +#undef CFF_FIELD_DELTA +#define CFF_FIELD_DELTA( code, name, max ) \ + { \ + cff_kind_delta, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE_DELTA( name ), \ + 0, \ + max, \ + FT_FIELD_OFFSET( num_ ## name ) \ + }, + +#define CFFCODE_TOPDICT 0x1000 +#define CFFCODE_PRIVATE 0x2000 + + static const CFF_Field_Handler cff_field_handlers[] = + { + +#include "cfftoken.h" + + { 0, 0, 0, 0, 0, 0, 0 } + }; + + + FT_LOCAL_DEF( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Error error = CFF_Err_Ok; + + + parser->top = parser->stack; + parser->start = start; + parser->limit = limit; + parser->cursor = start; + + while ( p < limit ) + { + FT_UInt v = *p; + + + if ( v >= 27 && v != 31 ) + { + /* it's a number; we will push its position on the stack */ + if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH ) + goto Stack_Overflow; + + *parser->top ++ = p; + + /* now, skip it */ + if ( v == 30 ) + { + /* skip real number */ + p++; + for (;;) + { + if ( p >= limit ) + goto Syntax_Error; + v = p[0] >> 4; + if ( v == 15 ) + break; + v = p[0] & 0xF; + if ( v == 15 ) + break; + p++; + } + } + else if ( v == 28 ) + p += 2; + else if ( v == 29 ) + p += 4; + else if ( v > 246 ) + p += 1; + } + else + { + /* This is not a number, hence it's an operator. Compute its code */ + /* and look for it in our current list. */ + + FT_UInt code; + FT_UInt num_args = (FT_UInt) + ( parser->top - parser->stack ); + const CFF_Field_Handler* field; + + + *parser->top = p; + code = v; + if ( v == 12 ) + { + /* two byte operator */ + p++; + if ( p >= limit ) + goto Syntax_Error; + + code = 0x100 | p[0]; + } + code = code | parser->object_code; + + for ( field = cff_field_handlers; field->kind; field++ ) + { + if ( field->code == (FT_Int)code ) + { + /* we found our field's handler; read it */ + FT_Long val; + FT_Byte* q = (FT_Byte*)parser->object + field->offset; + + + /* check that we have enough arguments -- except for */ + /* delta encoded arrays, which can be empty */ + if ( field->kind != cff_kind_delta && num_args < 1 ) + goto Stack_Underflow; + + switch ( field->kind ) + { + case cff_kind_bool: + case cff_kind_string: + case cff_kind_num: + val = cff_parse_num( parser->stack ); + goto Store_Number; + + case cff_kind_fixed: + val = cff_parse_fixed( parser->stack ); + goto Store_Number; + + case cff_kind_fixed_thousand: + val = cff_parse_fixed_scaled( parser->stack, 3 ); + + Store_Number: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case cff_kind_delta: + { + FT_Byte* qcount = (FT_Byte*)parser->object + + field->count_offset; + + FT_Byte** data = parser->stack; + + + if ( num_args > field->array_max ) + num_args = field->array_max; + + /* store count */ + *qcount = (FT_Byte)num_args; + + val = 0; + while ( num_args > 0 ) + { + val += cff_parse_num( data++ ); + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + + q += field->size; + num_args--; + } + } + break; + + default: /* callback */ + error = field->reader( parser ); + if ( error ) + goto Exit; + } + goto Found; + } + } + + /* this is an unknown operator, or it is unsupported; */ + /* we will ignore it for now. */ + + Found: + /* clear stack */ + parser->top = parser->stack; + } + p++; + } + + Exit: + return error; + + Stack_Overflow: + error = CFF_Err_Invalid_Argument; + goto Exit; + + Stack_Underflow: + error = CFF_Err_Invalid_Argument; + goto Exit; + + Syntax_Error: + error = CFF_Err_Invalid_Argument; + goto Exit; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cffparse.h b/src/3rdparty/freetype/src/cff/cffparse.h new file mode 100644 index 0000000000..8f3fa58859 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cffparse.h @@ -0,0 +1,69 @@ +/***************************************************************************/ +/* */ +/* cffparse.h */ +/* */ +/* CFF token stream parser (specification) */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFF_PARSE_H__ +#define __CFF_PARSE_H__ + + +#include <ft2build.h> +#include "cfftypes.h" +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#define CFF_MAX_STACK_DEPTH 96 + +#define CFF_CODE_TOPDICT 0x1000 +#define CFF_CODE_PRIVATE 0x2000 + + + typedef struct CFF_ParserRec_ + { + FT_Byte* start; + FT_Byte* limit; + FT_Byte* cursor; + + FT_Byte* stack[CFF_MAX_STACK_DEPTH + 1]; + FT_Byte** top; + + FT_UInt object_code; + void* object; + + } CFF_ParserRec, *CFF_Parser; + + + FT_LOCAL( void ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object ); + + FT_LOCAL( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ); + + +FT_END_HEADER + + +#endif /* __CFF_PARSE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cfftoken.h b/src/3rdparty/freetype/src/cff/cfftoken.h new file mode 100644 index 0000000000..6bb27d5caf --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cfftoken.h @@ -0,0 +1,97 @@ +/***************************************************************************/ +/* */ +/* cfftoken.h */ +/* */ +/* CFF token definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec + +#undef CFFCODE +#define CFFCODE CFFCODE_TOPDICT + + CFF_FIELD_STRING ( 0, version ) + CFF_FIELD_STRING ( 1, notice ) + CFF_FIELD_STRING ( 0x100, copyright ) + CFF_FIELD_STRING ( 2, full_name ) + CFF_FIELD_STRING ( 3, family_name ) + CFF_FIELD_STRING ( 4, weight ) + CFF_FIELD_BOOL ( 0x101, is_fixed_pitch ) + CFF_FIELD_FIXED ( 0x102, italic_angle ) + CFF_FIELD_FIXED ( 0x103, underline_position ) + CFF_FIELD_FIXED ( 0x104, underline_thickness ) + CFF_FIELD_NUM ( 0x105, paint_type ) + CFF_FIELD_NUM ( 0x106, charstring_type ) + CFF_FIELD_CALLBACK( 0x107, font_matrix ) + CFF_FIELD_NUM ( 13, unique_id ) + CFF_FIELD_CALLBACK( 5, font_bbox ) + CFF_FIELD_NUM ( 0x108, stroke_width ) + CFF_FIELD_NUM ( 15, charset_offset ) + CFF_FIELD_NUM ( 16, encoding_offset ) + CFF_FIELD_NUM ( 17, charstrings_offset ) + CFF_FIELD_CALLBACK( 18, private_dict ) + CFF_FIELD_NUM ( 0x114, synthetic_base ) + CFF_FIELD_STRING ( 0x115, embedded_postscript ) + +#if 0 + CFF_FIELD_STRING ( 0x116, base_font_name ) + CFF_FIELD_DELTA ( 0x117, base_font_blend, 16 ) + CFF_FIELD_CALLBACK( 0x118, multiple_master ) + CFF_FIELD_CALLBACK( 0x119, blend_axis_types ) +#endif + + CFF_FIELD_CALLBACK( 0x11E, cid_ros ) + CFF_FIELD_NUM ( 0x11F, cid_font_version ) + CFF_FIELD_NUM ( 0x120, cid_font_revision ) + CFF_FIELD_NUM ( 0x121, cid_font_type ) + CFF_FIELD_NUM ( 0x122, cid_count ) + CFF_FIELD_NUM ( 0x123, cid_uid_base ) + CFF_FIELD_NUM ( 0x124, cid_fd_array_offset ) + CFF_FIELD_NUM ( 0x125, cid_fd_select_offset ) + CFF_FIELD_STRING ( 0x126, cid_font_name ) + +#if 0 + CFF_FIELD_NUM ( 0x127, chameleon ) +#endif + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_PrivateRec +#undef CFFCODE +#define CFFCODE CFFCODE_PRIVATE + + CFF_FIELD_DELTA ( 6, blue_values, 14 ) + CFF_FIELD_DELTA ( 7, other_blues, 10 ) + CFF_FIELD_DELTA ( 8, family_blues, 14 ) + CFF_FIELD_DELTA ( 9, family_other_blues, 10 ) + CFF_FIELD_FIXED_1000( 0x109, blue_scale ) + CFF_FIELD_NUM ( 0x10A, blue_shift ) + CFF_FIELD_NUM ( 0x10B, blue_fuzz ) + CFF_FIELD_NUM ( 10, standard_width ) + CFF_FIELD_NUM ( 11, standard_height ) + CFF_FIELD_DELTA ( 0x10C, snap_widths, 13 ) + CFF_FIELD_DELTA ( 0x10D, snap_heights, 13 ) + CFF_FIELD_BOOL ( 0x10E, force_bold ) + CFF_FIELD_FIXED ( 0x10F, force_bold_threshold ) + CFF_FIELD_NUM ( 0x110, lenIV ) + CFF_FIELD_NUM ( 0x111, language_group ) + CFF_FIELD_FIXED ( 0x112, expansion_factor ) + CFF_FIELD_NUM ( 0x113, initial_random_seed ) + CFF_FIELD_NUM ( 19, local_subrs_offset ) + CFF_FIELD_NUM ( 20, default_width ) + CFF_FIELD_NUM ( 21, nominal_width ) + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/cfftypes.h b/src/3rdparty/freetype/src/cff/cfftypes.h new file mode 100644 index 0000000000..546ea3b99d --- /dev/null +++ b/src/3rdparty/freetype/src/cff/cfftypes.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* cfftypes.h */ +/* */ +/* Basic OpenType/CFF type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFTYPES_H__ +#define __CFFTYPES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CFF_IndexRec */ + /* */ + /* <Description> */ + /* A structure used to model a CFF Index table. */ + /* */ + /* <Fields> */ + /* stream :: The source input stream. */ + /* */ + /* start :: The position of the first index byte in the */ + /* input stream. */ + /* */ + /* count :: The number of elements in the index. */ + /* */ + /* off_size :: The size in bytes of object offsets in index. */ + /* */ + /* data_offset :: The position of first data byte in the index's */ + /* bytes. */ + /* */ + /* data_size :: The size of the data table in this index. */ + /* */ + /* offsets :: A table of element offsets in the index. Must be */ + /* loaded explicitly. */ + /* */ + /* bytes :: If the index is loaded in memory, its bytes. */ + /* */ + typedef struct CFF_IndexRec_ + { + FT_Stream stream; + FT_ULong start; + FT_UInt count; + FT_Byte off_size; + FT_ULong data_offset; + FT_ULong data_size; + + FT_ULong* offsets; + FT_Byte* bytes; + + } CFF_IndexRec, *CFF_Index; + + + typedef struct CFF_EncodingRec_ + { + FT_UInt format; + FT_ULong offset; + + FT_UInt count; + FT_UShort sids [256]; /* avoid dynamic allocations */ + FT_UShort codes[256]; + + } CFF_EncodingRec, *CFF_Encoding; + + + typedef struct CFF_CharsetRec_ + { + + FT_UInt format; + FT_ULong offset; + + FT_UShort* sids; + FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ + /* for CID-keyed fonts */ + FT_UInt max_cid; + FT_UInt num_glyphs; + + } CFF_CharsetRec, *CFF_Charset; + + + typedef struct CFF_FontRecDictRec_ + { + FT_UInt version; + FT_UInt notice; + FT_UInt copyright; + FT_UInt full_name; + FT_UInt family_name; + FT_UInt weight; + FT_Bool is_fixed_pitch; + FT_Fixed italic_angle; + FT_Fixed underline_position; + FT_Fixed underline_thickness; + FT_Int paint_type; + FT_Int charstring_type; + FT_Matrix font_matrix; + FT_ULong units_per_em; /* temporarily used as scaling value also */ + FT_Vector font_offset; + FT_ULong unique_id; + FT_BBox font_bbox; + FT_Pos stroke_width; + FT_ULong charset_offset; + FT_ULong encoding_offset; + FT_ULong charstrings_offset; + FT_ULong private_offset; + FT_ULong private_size; + FT_Long synthetic_base; + FT_UInt embedded_postscript; + + /* these should only be used for the top-level font dictionary */ + FT_UInt cid_registry; + FT_UInt cid_ordering; + FT_ULong cid_supplement; + + FT_Long cid_font_version; + FT_Long cid_font_revision; + FT_Long cid_font_type; + FT_ULong cid_count; + FT_ULong cid_uid_base; + FT_ULong cid_fd_array_offset; + FT_ULong cid_fd_select_offset; + FT_UInt cid_font_name; + + } CFF_FontRecDictRec, *CFF_FontRecDict; + + + typedef struct CFF_PrivateRec_ + { + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Pos blue_values[14]; + FT_Pos other_blues[10]; + FT_Pos family_blues[14]; + FT_Pos family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Pos blue_shift; + FT_Pos blue_fuzz; + FT_Pos standard_width; + FT_Pos standard_height; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Pos snap_widths[13]; + FT_Pos snap_heights[13]; + FT_Bool force_bold; + FT_Fixed force_bold_threshold; + FT_Int lenIV; + FT_Int language_group; + FT_Fixed expansion_factor; + FT_Long initial_random_seed; + FT_ULong local_subrs_offset; + FT_Pos default_width; + FT_Pos nominal_width; + + } CFF_PrivateRec, *CFF_Private; + + + typedef struct CFF_FDSelectRec_ + { + FT_Byte format; + FT_UInt range_count; + + /* that's the table, taken from the file `as is' */ + FT_Byte* data; + FT_UInt data_size; + + /* small cache for format 3 only */ + FT_UInt cache_first; + FT_UInt cache_count; + FT_Byte cache_fd; + + } CFF_FDSelectRec, *CFF_FDSelect; + + + /* A SubFont packs a font dict and a private dict together. They are */ + /* needed to support CID-keyed CFF fonts. */ + typedef struct CFF_SubFontRec_ + { + CFF_FontRecDictRec font_dict; + CFF_PrivateRec private_dict; + + CFF_IndexRec local_subrs_index; + FT_UInt num_local_subrs; + FT_Byte** local_subrs; + + } CFF_SubFontRec, *CFF_SubFont; + + + /* maximum number of sub-fonts in a CID-keyed file */ +#define CFF_MAX_CID_FONTS 32 + + + typedef struct CFF_FontRec_ + { + FT_Stream stream; + FT_Memory memory; + FT_UInt num_faces; + FT_UInt num_glyphs; + + FT_Byte version_major; + FT_Byte version_minor; + FT_Byte header_size; + FT_Byte absolute_offsize; + + + CFF_IndexRec name_index; + CFF_IndexRec top_dict_index; + CFF_IndexRec string_index; + CFF_IndexRec global_subrs_index; + + CFF_EncodingRec encoding; + CFF_CharsetRec charset; + + CFF_IndexRec charstrings_index; + CFF_IndexRec font_dict_index; + CFF_IndexRec private_index; + CFF_IndexRec local_subrs_index; + + FT_String* font_name; + FT_UInt num_global_subrs; + FT_Byte** global_subrs; + + CFF_SubFontRec top_font; + FT_UInt num_subfonts; + CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; + + CFF_FDSelectRec fd_select; + + /* interface to PostScript hinter */ + void* pshinter; + + /* interface to Postscript Names service */ + void* psnames; + + /* since version 2.3.0 */ + PS_FontInfoRec* font_info; /* font info dictionary */ + + /* since version 2.3.6 */ + FT_String* registry; + FT_String* ordering; + + } CFF_FontRec, *CFF_Font; + + +FT_END_HEADER + +#endif /* __CFFTYPES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cff/module.mk b/src/3rdparty/freetype/src/cff/module.mk new file mode 100644 index 0000000000..ef1391c279 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 CFF module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += CFF_DRIVER + +define CFF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)cff $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/cff/rules.mk b/src/3rdparty/freetype/src/cff/rules.mk new file mode 100644 index 0000000000..4100c80687 --- /dev/null +++ b/src/3rdparty/freetype/src/cff/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 OpenType/CFF driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# OpenType driver directory +# +CFF_DIR := $(SRC_DIR)/cff + + +CFF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CFF_DIR)) + + +# CFF driver sources (i.e., C files) +# +CFF_DRV_SRC := $(CFF_DIR)/cffobjs.c \ + $(CFF_DIR)/cffload.c \ + $(CFF_DIR)/cffgload.c \ + $(CFF_DIR)/cffparse.c \ + $(CFF_DIR)/cffcmap.c \ + $(CFF_DIR)/cffdrivr.c + +# CFF driver headers +# +CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \ + $(CFF_DIR)/cfftoken.h \ + $(CFF_DIR)/cfftypes.h \ + $(CFF_DIR)/cfferrs.h + + +# CFF driver object(s) +# +# CFF_DRV_OBJ_M is used during `multi' builds +# CFF_DRV_OBJ_S is used during `single' builds +# +CFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O) +CFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O + +# CFF driver source file for single build +# +CFF_DRV_SRC_S := $(CFF_DIR)/cff.c + + +# CFF driver - single object +# +$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H) + $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S)) + + +# CFF driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H) + $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CFF_DRV_OBJ_S) +DRV_OBJS_M += $(CFF_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/cid/Jamfile b/src/3rdparty/freetype/src/cid/Jamfile new file mode 100644 index 0000000000..ebeaed54ea --- /dev/null +++ b/src/3rdparty/freetype/src/cid/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/cid Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) cid ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = cidobjs cidload cidgload cidriver cidparse ; + } + else + { + _sources = type1cid ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/cid Jamfile diff --git a/src/3rdparty/freetype/src/cid/ciderrs.h b/src/3rdparty/freetype/src/cid/ciderrs.h new file mode 100644 index 0000000000..01813e1898 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/ciderrs.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* ciderrs.h */ +/* */ +/* CID error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the CID error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __CIDERRS_H__ +#define __CIDERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX CID_Err_ +#define FT_ERR_BASE FT_Mod_Err_CID + +#include FT_ERRORS_H + +#endif /* __CIDERRS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidgload.c b/src/3rdparty/freetype/src/cid/cidgload.c new file mode 100644 index 0000000000..64994b4419 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidgload.c @@ -0,0 +1,433 @@ +/***************************************************************************/ +/* */ +/* cidgload.c */ +/* */ +/* CID-keyed Type1 Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "cidload.h" +#include "cidgload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_OUTLINE_H + +#include "ciderrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidgload + + + FT_CALLBACK_DEF( FT_Error ) + cid_load_glyph( T1_Decoder decoder, + FT_UInt glyph_index ) + { + CID_Face face = (CID_Face)decoder->builder.face; + CID_FaceInfo cid = &face->cid; + FT_Byte* p; + FT_UInt fd_select; + FT_Stream stream = face->cid_stream; + FT_Error error = CID_Err_Ok; + FT_Byte* charstring = 0; + FT_Memory memory = face->root.memory; + FT_ULong glyph_length = 0; + PSAux_Service psaux = (PSAux_Service)face->psaux; + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* For incremental fonts get the character data using */ + /* the callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data glyph_data; + + + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, + &glyph_data ); + if ( error ) + goto Exit; + + p = (FT_Byte*)glyph_data.pointer; + fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); + + if ( glyph_data.length != 0 ) + { + glyph_length = glyph_data.length - cid->fd_bytes; + (void)FT_ALLOC( charstring, glyph_length ); + if ( !error ) + ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes, + glyph_length ); + } + + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + + if ( error ) + goto Exit; + } + + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* For ordinary fonts read the CID font dictionary index */ + /* and charstring offset from the CIDMap. */ + { + FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes; + FT_ULong off1; + + + if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset + + glyph_index * entry_len ) || + FT_FRAME_ENTER( 2 * entry_len ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + fd_select = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); + off1 = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes ); + p += cid->fd_bytes; + glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1; + FT_FRAME_EXIT(); + + if ( fd_select >= (FT_UInt)cid->num_dicts ) + { + error = CID_Err_Invalid_Offset; + goto Exit; + } + if ( glyph_length == 0 ) + goto Exit; + if ( FT_ALLOC( charstring, glyph_length ) ) + goto Exit; + if ( FT_STREAM_READ_AT( cid->data_offset + off1, + charstring, glyph_length ) ) + goto Exit; + } + + /* Now set up the subrs array and parse the charstrings. */ + { + CID_FaceDict dict; + CID_Subrs cid_subrs = face->subrs + fd_select; + FT_Int cs_offset; + + + /* Set up subrs */ + decoder->num_subrs = cid_subrs->num_subrs; + decoder->subrs = cid_subrs->code; + decoder->subrs_len = 0; + + /* Set up font matrix */ + dict = cid->font_dicts + fd_select; + + decoder->font_matrix = dict->font_matrix; + decoder->font_offset = dict->font_offset; + decoder->lenIV = dict->private_dict.lenIV; + + /* Decode the charstring. */ + + /* Adjustment for seed bytes. */ + cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + + /* Decrypt only if lenIV >= 0. */ + if ( decoder->lenIV >= 0 ) + psaux->t1_decrypt( charstring, glyph_length, 4330 ); + + error = decoder->funcs.parse_charstrings( + decoder, charstring + cs_offset, + (FT_Int)glyph_length - cs_offset ); + } + + FT_FREE( charstring ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && + face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = decoder->builder.left_bearing.x; + metrics.bearing_y = decoder->builder.left_bearing.y; + metrics.advance = decoder->builder.advance.x; + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + decoder->builder.left_bearing.x = metrics.bearing_x; + decoder->builder.left_bearing.y = metrics.bearing_y; + decoder->builder.advance.x = metrics.advance; + decoder->builder.advance.y = 0; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + Exit: + return error; + } + + +#if 0 + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + cid_face_compute_max_advance( CID_Face face, + FT_Int* max_advance ) + { + FT_Error error; + T1_DecoderRec decoder; + FT_Int glyph_index; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + *max_advance = 0; + + /* Initialize load decoder */ + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + 0, /* glyph names! XXX */ + 0, /* blend == 0 */ + 0, /* hinting == 0 */ + cid_load_glyph ); + if ( error ) + return error; + + /* TODO: initialize decoder.len_buildchar and decoder.buildchar */ + /* if we ever support CID-keyed multiple master fonts */ + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + /* for each glyph, parse the glyph charstring and extract */ + /* the advance width */ + for ( glyph_index = 0; glyph_index < face->root.num_glyphs; + glyph_index++ ) + { + /* now get load the unscaled outline */ + error = cid_load_glyph( &decoder, glyph_index ); + /* ignore the error if one occurred - skip to next glyph */ + } + + *max_advance = decoder.builder.advance.x; + + psaux->t1_decoder_funcs->done( &decoder ); + + return CID_Err_Ok; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + cid_slot_load_glyph( FT_GlyphSlot cidglyph, /* CID_GlyphSlot */ + FT_Size cidsize, /* CID_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + CID_GlyphSlot glyph = (CID_GlyphSlot)cidglyph; + CID_Size size = (CID_Size)cidsize; + FT_Error error; + T1_DecoderRec decoder; + CID_Face face = (CID_Face)cidglyph->face; + FT_Bool hinting; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + FT_Matrix font_matrix; + FT_Vector font_offset; + + + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = CID_Err_Invalid_Argument; + goto Exit; + } + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + glyph->x_scale = cidsize->metrics.x_scale; + glyph->y_scale = cidsize->metrics.y_scale; + + cidglyph->outline.n_points = 0; + cidglyph->outline.n_contours = 0; + + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + + cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; + + error = psaux->t1_decoder_funcs->init( &decoder, + cidglyph->face, + cidsize, + cidglyph, + 0, /* glyph names -- XXX */ + 0, /* blend == 0 */ + hinting, + FT_LOAD_TARGET_MODE( load_flags ), + cid_load_glyph ); + if ( error ) + goto Exit; + + /* TODO: initialize decoder.len_buildchar and decoder.buildchar */ + /* if we ever support CID-keyed multiple master fonts */ + + /* set up the decoder */ + decoder.builder.no_recurse = FT_BOOL( + ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) ); + + error = cid_load_glyph( &decoder, glyph_index ); + if ( error ) + goto Exit; + + font_matrix = decoder.font_matrix; + font_offset = decoder.font_offset; + + /* save new glyph tables */ + psaux->t1_decoder_funcs->done( &decoder ); + + /* now set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax */ + cidglyph->outline.flags &= FT_OUTLINE_OWNER; + cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* for composite glyphs, return only left side bearing and */ + /* advance width */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = cidglyph->internal; + + + cidglyph->metrics.horiBearingX = decoder.builder.left_bearing.x; + cidglyph->metrics.horiAdvance = decoder.builder.advance.x; + + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &cidglyph->metrics; + FT_Vector advance; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = decoder.builder.advance.x; + cidglyph->linearHoriAdvance = decoder.builder.advance.x; + cidglyph->internal->glyph_transformed = 0; + + /* make up vertical ones */ + metrics->vertAdvance = ( face->cid.font_bbox.yMax - + face->cid.font_bbox.yMin ) >> 16; + cidglyph->linearVertAdvance = metrics->vertAdvance; + + cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; + + if ( size && cidsize->metrics.y_ppem < 24 ) + cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + /* apply the font matrix */ + FT_Outline_Transform( &cidglyph->outline, &font_matrix ); + + FT_Outline_Translate( &cidglyph->outline, + font_offset.x, + font_offset.y ); + + advance.x = metrics->horiAdvance; + advance.y = 0; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->horiAdvance = advance.x + font_offset.x; + + advance.x = 0; + advance.y = metrics->vertAdvance; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->vertAdvance = advance.y + font_offset.y; + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = decoder.builder.base; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &cidglyph->outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + /* make up vertical ones */ + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + + Exit: + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidgload.h b/src/3rdparty/freetype/src/cid/cidgload.h new file mode 100644 index 0000000000..a0a91bfea8 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidgload.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* cidgload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDGLOAD_H__ +#define __CIDGLOAD_H__ + + +#include <ft2build.h> +#include "cidobjs.h" + + +FT_BEGIN_HEADER + + +#if 0 + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cid_face_compute_max_advance( CID_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL( FT_Error ) + cid_slot_load_glyph( FT_GlyphSlot glyph, /* CID_Glyph_Slot */ + FT_Size size, /* CID_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __CIDGLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidload.c b/src/3rdparty/freetype/src/cid/cidload.c new file mode 100644 index 0000000000..a43a00e01a --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidload.c @@ -0,0 +1,672 @@ +/***************************************************************************/ +/* */ +/* cidload.c */ +/* */ +/* CID-keyed Type1 font loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_TYPE1_TYPES_H + +#include "cidload.h" + +#include "ciderrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidload + + + /* read a single offset */ + FT_LOCAL_DEF( FT_Long ) + cid_get_offset( FT_Byte* *start, + FT_Byte offsize ) + { + FT_Long result; + FT_Byte* p = *start; + + + for ( result = 0; offsize > 0; offsize-- ) + { + result <<= 8; + result |= *p++; + } + + *start = p; + return result; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 SYMBOL PARSING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + cid_load_keyword( CID_Face face, + CID_Loader* loader, + const T1_Field keyword ) + { + FT_Error error; + CID_Parser* parser = &loader->parser; + FT_Byte* object; + void* dummy_object; + CID_FaceInfo cid = &face->cid; + + + /* if the keyword has a dedicated callback, call it */ + if ( keyword->type == T1_FIELD_TYPE_CALLBACK ) + { + keyword->reader( (FT_Face)face, parser ); + error = parser->root.error; + goto Exit; + } + + /* we must now compute the address of our target object */ + switch ( keyword->location ) + { + case T1_FIELD_LOCATION_CID_INFO: + object = (FT_Byte*)cid; + break; + + case T1_FIELD_LOCATION_FONT_INFO: + object = (FT_Byte*)&cid->font_info; + break; + + case T1_FIELD_LOCATION_FONT_EXTRA: + object = (FT_Byte*)&face->font_extra; + break; + + case T1_FIELD_LOCATION_BBOX: + object = (FT_Byte*)&cid->font_bbox; + break; + + default: + { + CID_FaceDict dict; + + + if ( parser->num_dict < 0 ) + { + FT_ERROR(( "cid_load_keyword: invalid use of `%s'!\n", + keyword->ident )); + error = CID_Err_Syntax_Error; + goto Exit; + } + + dict = cid->font_dicts + parser->num_dict; + switch ( keyword->location ) + { + case T1_FIELD_LOCATION_PRIVATE: + object = (FT_Byte*)&dict->private_dict; + break; + + default: + object = (FT_Byte*)dict; + } + } + } + + dummy_object = object; + + /* now, load the keyword data in the object's field(s) */ + if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY || + keyword->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = cid_parser_load_field_table( &loader->parser, keyword, + &dummy_object ); + else + error = cid_parser_load_field( &loader->parser, + keyword, &dummy_object ); + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + parse_font_matrix( CID_Face face, + CID_Parser* parser ) + { + FT_Matrix* matrix; + FT_Vector* offset; + CID_FaceDict dict; + FT_Face root = (FT_Face)&face->root; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + + + if ( parser->num_dict >= 0 ) + { + dict = face->cid.font_dicts + parser->num_dict; + matrix = &dict->font_matrix; + offset = &dict->font_offset; + + (void)cid_parser_to_fixed_array( parser, 6, temp, 3 ); + + temp_scale = FT_ABS( temp[3] ); + + /* Set units per EM based on FontMatrix values. We set the value to */ + /* `1000/temp_scale', because temp_scale was already multiplied by */ + /* 1000 (in `t1_tofixed', from psobjs.c). */ + root->units_per_EM = (FT_UShort)( FT_DivFix( 0x10000L, + FT_DivFix( temp_scale, 1000 ) ) ); + + /* we need to scale the values by 1.0/temp[3] */ + if ( temp_scale != 0x10000L ) + { + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = 0x10000L; + } + + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + /* note that the font offsets are expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + return CID_Err_Ok; /* this is a callback function; */ + /* we must return an error code */ + } + + + FT_CALLBACK_DEF( FT_Error ) + parse_fd_array( CID_Face face, + CID_Parser* parser ) + { + CID_FaceInfo cid = &face->cid; + FT_Memory memory = face->root.memory; + FT_Error error = CID_Err_Ok; + FT_Long num_dicts; + + + num_dicts = cid_parser_to_int( parser ); + + if ( !cid->font_dicts ) + { + FT_Int n; + + + if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) ) + goto Exit; + + cid->num_dicts = (FT_UInt)num_dicts; + + /* don't forget to set a few defaults */ + for ( n = 0; n < cid->num_dicts; n++ ) + { + CID_FaceDict dict = cid->font_dicts + n; + + + /* default value for lenIV */ + dict->private_dict.lenIV = 4; + } + } + + Exit: + return error; + } + + + /* by mistake, `expansion_factor' appears both in PS_PrivateRec */ + /* and CID_FaceDictRec (both are public header files and can't */ + /* changed); we simply copy the value */ + + FT_CALLBACK_DEF( FT_Error ) + parse_expansion_factor( CID_Face face, + CID_Parser* parser ) + { + CID_FaceDict dict; + + + if ( parser->num_dict >= 0 ) + { + dict = face->cid.font_dicts + parser->num_dict; + + dict->expansion_factor = cid_parser_to_fixed( parser, 0 ); + dict->private_dict.expansion_factor = dict->expansion_factor; + } + + return CID_Err_Ok; + } + + + static + const T1_FieldRec cid_field_records[] = + { + +#include "cidtoken.h" + + T1_FIELD_CALLBACK( "FDArray", parse_fd_array, 0 ) + T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix, 0 ) + T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 ) + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + + static FT_Error + cid_parse_dict( CID_Face face, + CID_Loader* loader, + FT_Byte* base, + FT_Long size ) + { + CID_Parser* parser = &loader->parser; + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = CID_Err_Ok; + + { + FT_Byte* cur = base; + FT_Byte* limit = cur + size; + + + for (;;) + { + FT_Byte* newlimit; + + + parser->root.cursor = cur; + cid_parser_skip_spaces( parser ); + + if ( parser->root.cursor >= limit ) + newlimit = limit - 1 - 17; + else + newlimit = parser->root.cursor - 17; + + /* look for `%ADOBeginFontDict' */ + for ( ; cur < newlimit; cur++ ) + { + if ( *cur == '%' && + ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) + { + /* if /FDArray was found, then cid->num_dicts is > 0, and */ + /* we can start increasing parser->num_dict */ + if ( face->cid.num_dicts > 0 ) + parser->num_dict++; + } + } + + cur = parser->root.cursor; + /* no error can occur in cid_parser_skip_spaces */ + if ( cur >= limit ) + break; + + cid_parser_skip_PS_token( parser ); + if ( parser->root.cursor >= limit || parser->root.error ) + break; + + /* look for immediates */ + if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; + + + cur++; + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 ) + { + /* now compare the immediate name to the keyword table */ + T1_Field keyword = (T1_Field)cid_field_records; + + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == (FT_PtrDist)ft_strlen( (const char*)name ) ) + { + FT_PtrDist n; + + + for ( n = 1; n < len; n++ ) + if ( cur[n] != name[n] ) + break; + + if ( n >= len ) + { + /* we found it - run the parsing callback */ + parser->root.error = cid_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + break; + } + } + keyword++; + } + } + } + + cur = parser->root.cursor; + } + } + return parser->root.error; + } + + + /* read the subrmap and the subrs of each font dict */ + static FT_Error + cid_read_subrs( CID_Face face ) + { + CID_FaceInfo cid = &face->cid; + FT_Memory memory = face->root.memory; + FT_Stream stream = face->cid_stream; + FT_Error error; + FT_Int n; + CID_Subrs subr; + FT_UInt max_offsets = 0; + FT_ULong* offsets = 0; + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) ) + goto Exit; + + subr = face->subrs; + for ( n = 0; n < cid->num_dicts; n++, subr++ ) + { + CID_FaceDict dict = cid->font_dicts + n; + FT_Int lenIV = dict->private_dict.lenIV; + FT_UInt count, num_subrs = dict->num_subrs; + FT_ULong data_len; + FT_Byte* p; + + + /* reallocate offsets array if needed */ + if ( num_subrs + 1 > max_offsets ) + { + FT_UInt new_max = FT_PAD_CEIL( num_subrs + 1, 4 ); + + + if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) ) + goto Fail; + + max_offsets = new_max; + } + + /* read the subrmap's offsets */ + if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || + FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) ) + goto Fail; + + p = (FT_Byte*)stream->cursor; + for ( count = 0; count <= num_subrs; count++ ) + offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes ); + + FT_FRAME_EXIT(); + + /* now, compute the size of subrs charstrings, */ + /* allocate, and read them */ + data_len = offsets[num_subrs] - offsets[0]; + + if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) || + FT_ALLOC( subr->code[0], data_len ) ) + goto Fail; + + if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) || + FT_STREAM_READ( subr->code[0], data_len ) ) + goto Fail; + + /* set up pointers */ + for ( count = 1; count <= num_subrs; count++ ) + { + FT_ULong len; + + + len = offsets[count] - offsets[count - 1]; + subr->code[count] = subr->code[count - 1] + len; + } + + /* decrypt subroutines, but only if lenIV >= 0 */ + if ( lenIV >= 0 ) + { + for ( count = 0; count < num_subrs; count++ ) + { + FT_ULong len; + + + len = offsets[count + 1] - offsets[count]; + psaux->t1_decrypt( subr->code[count], len, 4330 ); + } + } + + subr->num_subrs = num_subrs; + } + + Exit: + FT_FREE( offsets ); + return error; + + Fail: + if ( face->subrs ) + { + for ( n = 0; n < cid->num_dicts; n++ ) + { + if ( face->subrs[n].code ) + FT_FREE( face->subrs[n].code[0] ); + + FT_FREE( face->subrs[n].code ); + } + FT_FREE( face->subrs ); + } + goto Exit; + } + + + static void + t1_init_loader( CID_Loader* loader, + CID_Face face ) + { + FT_UNUSED( face ); + + FT_MEM_ZERO( loader, sizeof ( *loader ) ); + } + + + static void + t1_done_loader( CID_Loader* loader ) + { + CID_Parser* parser = &loader->parser; + + + /* finalize parser */ + cid_parser_done( parser ); + } + + + static FT_Error + cid_hex_to_binary( FT_Byte* data, + FT_Long data_len, + FT_ULong offset, + CID_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Error error; + + FT_Byte buffer[256]; + FT_Byte *p, *plimit; + FT_Byte *d, *dlimit; + FT_Byte val; + + FT_Bool upper_nibble, done; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + d = data; + dlimit = d + data_len; + p = buffer; + plimit = p; + + upper_nibble = 1; + done = 0; + + while ( d < dlimit ) + { + if ( p >= plimit ) + { + FT_ULong oldpos = FT_STREAM_POS(); + FT_ULong size = stream->size - oldpos; + + + if ( size == 0 ) + { + error = CID_Err_Syntax_Error; + goto Exit; + } + + if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) ) + goto Exit; + p = buffer; + plimit = p + FT_STREAM_POS() - oldpos; + } + + if ( ft_isdigit( *p ) ) + val = (FT_Byte)( *p - '0' ); + else if ( *p >= 'a' && *p <= 'f' ) + val = (FT_Byte)( *p - 'a' ); + else if ( *p >= 'A' && *p <= 'F' ) + val = (FT_Byte)( *p - 'A' + 10 ); + else if ( *p == ' ' || + *p == '\t' || + *p == '\r' || + *p == '\n' || + *p == '\f' || + *p == '\0' ) + { + p++; + continue; + } + else if ( *p == '>' ) + { + val = 0; + done = 1; + } + else + { + error = CID_Err_Syntax_Error; + goto Exit; + } + + if ( upper_nibble ) + *d = (FT_Byte)( val << 4 ); + else + { + *d = (FT_Byte)( *d + val ); + d++; + } + + upper_nibble = (FT_Byte)( 1 - upper_nibble ); + + if ( done ) + break; + + p++; + } + + error = CID_Err_Ok; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cid_face_open( CID_Face face, + FT_Int face_index ) + { + CID_Loader loader; + CID_Parser* parser; + FT_Memory memory = face->root.memory; + FT_Error error; + + + t1_init_loader( &loader, face ); + + parser = &loader.parser; + error = cid_parser_new( parser, face->root.stream, face->root.memory, + (PSAux_Service)face->psaux ); + if ( error ) + goto Exit; + + error = cid_parse_dict( face, &loader, + parser->postscript, + parser->postscript_len ); + if ( error ) + goto Exit; + + if ( face_index < 0 ) + goto Exit; + + if ( FT_NEW( face->cid_stream ) ) + goto Exit; + + if ( parser->binary_length ) + { + /* we must convert the data section from hexadecimal to binary */ + if ( FT_ALLOC( face->binary_data, parser->binary_length ) || + cid_hex_to_binary( face->binary_data, parser->binary_length, + parser->data_offset, face ) ) + goto Exit; + + FT_Stream_OpenMemory( face->cid_stream, + face->binary_data, parser->binary_length ); + face->cid.data_offset = 0; + } + else + { + *face->cid_stream = *face->root.stream; + face->cid.data_offset = loader.parser.data_offset; + } + + error = cid_read_subrs( face ); + + Exit: + t1_done_loader( &loader ); + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidload.h b/src/3rdparty/freetype/src/cid/cidload.h new file mode 100644 index 0000000000..8c172ffee2 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidload.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* cidload.h */ +/* */ +/* CID-keyed Type1 font loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDLOAD_H__ +#define __CIDLOAD_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include "cidparse.h" + + +FT_BEGIN_HEADER + + + typedef struct CID_Loader_ + { + CID_Parser parser; /* parser used to read the stream */ + FT_Int num_chars; /* number of characters in encoding */ + + } CID_Loader; + + + FT_LOCAL( FT_Long ) + cid_get_offset( FT_Byte** start, + FT_Byte offsize ); + + FT_LOCAL( FT_Error ) + cid_face_open( CID_Face face, + FT_Int face_index ); + + +FT_END_HEADER + +#endif /* __CIDLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidobjs.c b/src/3rdparty/freetype/src/cid/cidobjs.c new file mode 100644 index 0000000000..9647d87016 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidobjs.c @@ -0,0 +1,481 @@ +/***************************************************************************/ +/* */ +/* cidobjs.c */ +/* */ +/* CID objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include "cidgload.h" +#include "cidload.h" + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + +#include "ciderrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidobjs + + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + cid_slot_done( FT_GlyphSlot slot ) + { + slot->internal->glyph_hints = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + cid_slot_init( FT_GlyphSlot slot ) + { + CID_Face face; + PSHinter_Service pshinter; + + + face = (CID_Face)slot->face; + pshinter = (PSHinter_Service)face->pshinter; + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->face->driver->root.library, + "pshinter" ); + if ( module ) + { + T1_Hints_Funcs funcs; + + + funcs = pshinter->get_t1_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return 0; + } + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + cid_size_get_globals_funcs( CID_Size size ) + { + CID_Face face = (CID_Face)size->root.face; + PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + cid_size_done( FT_Size cidsize ) /* CID_Size */ + { + CID_Size size = (CID_Size)cidsize; + + + if ( cidsize->internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = cid_size_get_globals_funcs( size ); + if ( funcs ) + funcs->destroy( (PSH_Globals)cidsize->internal ); + + cidsize->internal = 0; + } + } + + + FT_LOCAL_DEF( FT_Error ) + cid_size_init( FT_Size cidsize ) /* CID_Size */ + { + CID_Size size = (CID_Size)cidsize; + FT_Error error = 0; + PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size ); + + + if ( funcs ) + { + PSH_Globals globals; + CID_Face face = (CID_Face)cidsize->face; + CID_FaceDict dict = face->cid.font_dicts + face->root.face_index; + PS_Private priv = &dict->private_dict; + + + error = funcs->create( cidsize->face->memory, priv, &globals ); + if ( !error ) + cidsize->internal = (FT_Size_Internal)(void*)globals; + } + + return error; + } + + + FT_LOCAL( FT_Error ) + cid_size_request( FT_Size size, + FT_Size_Request req ) + { + PSH_Globals_Funcs funcs; + + + FT_Request_Metrics( size->face, req ); + + funcs = cid_size_get_globals_funcs( (CID_Size)size ); + + if ( funcs ) + funcs->set_scale( (PSH_Globals)size->internal, + size->metrics.x_scale, + size->metrics.y_scale, + 0, 0 ); + + return CID_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_face_done */ + /* */ + /* <Description> */ + /* Finalizes a given face object. */ + /* */ + /* <Input> */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + cid_face_done( FT_Face cidface ) /* CID_Face */ + { + CID_Face face = (CID_Face)cidface; + FT_Memory memory; + CID_FaceInfo cid; + PS_FontInfo info; + + + if ( !face ) + return; + + cid = &face->cid; + info = &cid->font_info; + memory = cidface->memory; + + /* release subrs */ + if ( face->subrs ) + { + FT_Int n; + + + for ( n = 0; n < cid->num_dicts; n++ ) + { + CID_Subrs subr = face->subrs + n; + + + if ( subr->code ) + { + FT_FREE( subr->code[0] ); + FT_FREE( subr->code ); + } + } + + FT_FREE( face->subrs ); + } + + /* release FontInfo strings */ + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + + /* release font dictionaries */ + FT_FREE( cid->font_dicts ); + cid->num_dicts = 0; + + /* release other strings */ + FT_FREE( cid->cid_font_name ); + FT_FREE( cid->registry ); + FT_FREE( cid->ordering ); + + cidface->family_name = 0; + cidface->style_name = 0; + + FT_FREE( face->binary_data ); + FT_FREE( face->cid_stream ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_face_init */ + /* */ + /* <Description> */ + /* Initializes a given CID face object. */ + /* */ + /* <Input> */ + /* stream :: The source font stream. */ + /* */ + /* face_index :: The index of the font face in the resource. */ + /* */ + /* num_params :: Number of additional generic parameters. Ignored. */ + /* */ + /* params :: Additional generic parameters. Ignored. */ + /* */ + /* <InOut> */ + /* face :: The newly built face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cid_face_init( FT_Stream stream, + FT_Face cidface, /* CID_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + CID_Face face = (CID_Face)cidface; + FT_Error error; + PSAux_Service psaux; + PSHinter_Service pshinter; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( stream ); + + + cidface->num_faces = 1; + + psaux = (PSAux_Service)face->psaux; + if ( !psaux ) + { + psaux = (PSAux_Service)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "psaux" ); + + face->psaux = psaux; + } + + pshinter = (PSHinter_Service)face->pshinter; + if ( !pshinter ) + { + pshinter = (PSHinter_Service)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "pshinter" ); + + face->pshinter = pshinter; + } + + /* open the tokenizer; this will also check the font format */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + error = cid_face_open( face, face_index ); + if ( error ) + goto Exit; + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + /* XXX: handle CID fonts with more than a single face */ + if ( face_index != 0 ) + { + FT_ERROR(( "cid_face_init: invalid face index\n" )); + error = CID_Err_Invalid_Argument; + goto Exit; + } + + /* now load the font program into the face object */ + + /* initialize the face object fields */ + + /* set up root face fields */ + { + CID_FaceInfo cid = &face->cid; + PS_FontInfo info = &cid->font_info; + + + cidface->num_glyphs = cid->cid_count; + cidface->num_charmaps = 0; + + cidface->face_index = face_index; + cidface->face_flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ + + if ( info->is_fixed_pitch ) + cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* XXX: TODO: add kerning with .afm support */ + + /* get style name -- be careful, some broken fonts only */ + /* have a /FontName dictionary entry! */ + cidface->family_name = info->family_name; + /* assume "Regular" style if we don't know better */ + cidface->style_name = (char *)"Regular"; + if ( cidface->family_name ) + { + char* full = info->full_name; + char* family = cidface->family_name; + + + if ( full ) + { + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + if ( !*family ) + cidface->style_name = full; + break; + } + } + } + } + } + else + { + /* do we have a `/FontName'? */ + if ( cid->cid_font_name ) + cidface->family_name = cid->cid_font_name; + } + + /* compute style flags */ + cidface->style_flags = 0; + if ( info->italic_angle ) + cidface->style_flags |= FT_STYLE_FLAG_ITALIC; + if ( info->weight ) + { + if ( !ft_strcmp( info->weight, "Bold" ) || + !ft_strcmp( info->weight, "Black" ) ) + cidface->style_flags |= FT_STYLE_FLAG_BOLD; + } + + /* no embedded bitmap support */ + cidface->num_fixed_sizes = 0; + cidface->available_sizes = 0; + + cidface->bbox.xMin = cid->font_bbox.xMin >> 16; + cidface->bbox.yMin = cid->font_bbox.yMin >> 16; + cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFFU ) >> 16; + cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFFU ) >> 16; + + if ( !cidface->units_per_EM ) + cidface->units_per_EM = 1000; + + cidface->ascender = (FT_Short)( cidface->bbox.yMax ); + cidface->descender = (FT_Short)( cidface->bbox.yMin ); + + cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 ); + if ( cidface->height < cidface->ascender - cidface->descender ) + cidface->height = (FT_Short)( cidface->ascender - cidface->descender ); + + cidface->underline_position = (FT_Short)info->underline_position; + cidface->underline_thickness = (FT_Short)info->underline_thickness; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_driver_init */ + /* */ + /* <Description> */ + /* Initializes a given CID driver object. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target driver object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cid_driver_init( FT_Module driver ) + { + FT_UNUSED( driver ); + + return CID_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_driver_done */ + /* */ + /* <Description> */ + /* Finalizes a given CID driver. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target CID driver. */ + /* */ + FT_LOCAL_DEF( void ) + cid_driver_done( FT_Module driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidobjs.h b/src/3rdparty/freetype/src/cid/cidobjs.h new file mode 100644 index 0000000000..aee346d1c8 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidobjs.h @@ -0,0 +1,154 @@ +/***************************************************************************/ +/* */ +/* cidobjs.h */ +/* */ +/* CID objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDOBJS_H__ +#define __CIDOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + /* The following structures must be defined by the hinter */ + typedef struct CID_Size_Hints_ CID_Size_Hints; + typedef struct CID_Glyph_Hints_ CID_Glyph_Hints; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CID_Driver */ + /* */ + /* <Description> */ + /* A handle to a Type 1 driver object. */ + /* */ + typedef struct CID_DriverRec_* CID_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CID_Size */ + /* */ + /* <Description> */ + /* A handle to a Type 1 size object. */ + /* */ + typedef struct CID_SizeRec_* CID_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CID_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a Type 1 glyph slot object. */ + /* */ + typedef struct CID_GlyphSlotRec_* CID_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CID_CharMap */ + /* */ + /* <Description> */ + /* A handle to a Type 1 character mapping object. */ + /* */ + /* <Note> */ + /* The Type 1 format doesn't use a charmap but an encoding table. */ + /* The driver is responsible for making up charmap objects */ + /* corresponding to these tables. */ + /* */ + typedef struct CID_CharMapRec_* CID_CharMap; + + + /*************************************************************************/ + /* */ + /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF */ + /* */ + /*************************************************************************/ + + + typedef struct CID_SizeRec_ + { + FT_SizeRec root; + FT_Bool valid; + + } CID_SizeRec; + + + typedef struct CID_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } CID_GlyphSlotRec; + + + FT_LOCAL( void ) + cid_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cid_slot_init( FT_GlyphSlot slot ); + + + FT_LOCAL( void ) + cid_size_done( FT_Size size ); /* CID_Size */ + + FT_LOCAL( FT_Error ) + cid_size_init( FT_Size size ); /* CID_Size */ + + FT_LOCAL( FT_Error ) + cid_size_request( FT_Size size, /* CID_Size */ + FT_Size_Request req ); + + FT_LOCAL( FT_Error ) + cid_face_init( FT_Stream stream, + FT_Face face, /* CID_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cid_face_done( FT_Face face ); /* CID_Face */ + + + FT_LOCAL( FT_Error ) + cid_driver_init( FT_Module driver ); + + FT_LOCAL( void ) + cid_driver_done( FT_Module driver ); + + +FT_END_HEADER + +#endif /* __CIDOBJS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidparse.c b/src/3rdparty/freetype/src/cid/cidparse.c new file mode 100644 index 0000000000..bb87afc589 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidparse.c @@ -0,0 +1,226 @@ +/***************************************************************************/ +/* */ +/* cidparse.c */ +/* */ +/* CID-keyed Type1 parser (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H + +#include "cidparse.h" + +#include "ciderrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidparse + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INPUT STREAM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + cid_parser_new( CID_Parser* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error; + FT_ULong base_offset, offset, ps_len; + FT_Byte *cur, *limit; + FT_Byte *arg1, *arg2; + + + FT_MEM_ZERO( parser, sizeof ( *parser ) ); + psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); + + parser->stream = stream; + + base_offset = FT_STREAM_POS(); + + /* first of all, check the font format in the header */ + if ( FT_FRAME_ENTER( 31 ) ) + goto Exit; + + if ( ft_strncmp( (char *)stream->cursor, + "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) ) + { + FT_TRACE2(( "[not a valid CID-keyed font]\n" )); + error = CID_Err_Unknown_File_Format; + } + + FT_FRAME_EXIT(); + if ( error ) + goto Exit; + + Again: + /* now, read the rest of the file until we find */ + /* `StartData' or `/sfnts' */ + { + FT_Byte buffer[256 + 10]; + FT_Int read_len = 256 + 10; + FT_Byte* p = buffer; + + + for ( offset = (FT_ULong)FT_STREAM_POS(); ; offset += 256 ) + { + FT_Int stream_len; + + + stream_len = stream->size - FT_STREAM_POS(); + if ( stream_len == 0 ) + { + FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" )); + error = CID_Err_Unknown_File_Format; + goto Exit; + } + + read_len = FT_MIN( read_len, stream_len ); + if ( FT_STREAM_READ( p, read_len ) ) + goto Exit; + + if ( read_len < 256 ) + p[read_len] = '\0'; + + limit = p + read_len - 10; + + for ( p = buffer; p < limit; p++ ) + { + if ( p[0] == 'S' && ft_strncmp( (char*)p, "StartData", 9 ) == 0 ) + { + /* save offset of binary data after `StartData' */ + offset += p - buffer + 10; + goto Found; + } + else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 ) + { + offset += p - buffer + 7; + goto Found; + } + } + + FT_MEM_MOVE( buffer, p, 10 ); + read_len = 256; + p = buffer + 10; + } + } + + Found: + /* We have found the start of the binary data or the `/sfnts' token. */ + /* Now rewind and extract the frame corresponding to this PostScript */ + /* section. */ + + ps_len = offset - base_offset; + if ( FT_STREAM_SEEK( base_offset ) || + FT_FRAME_EXTRACT( ps_len, parser->postscript ) ) + goto Exit; + + parser->data_offset = offset; + parser->postscript_len = ps_len; + parser->root.base = parser->postscript; + parser->root.cursor = parser->postscript; + parser->root.limit = parser->root.cursor + ps_len; + parser->num_dict = -1; + + /* Finally, we check whether `StartData' or `/sfnts' was real -- */ + /* it could be in a comment or string. We also get the arguments */ + /* of `StartData' to find out whether the data is represented in */ + /* binary or hex format. */ + + arg1 = parser->root.cursor; + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + arg2 = parser->root.cursor; + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + + limit = parser->root.limit; + cur = parser->root.cursor; + + while ( cur < limit ) + { + if ( parser->root.error ) + { + error = parser->root.error; + goto Exit; + } + + if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 ) + { + if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 ) + parser->binary_length = ft_atol( (const char *)arg2 ); + + limit = parser->root.limit; + cur = parser->root.cursor; + goto Exit; + } + else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 ) + { + FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" )); + error = CID_Err_Unknown_File_Format; + goto Exit; + } + + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + arg1 = arg2; + arg2 = cur; + cur = parser->root.cursor; + } + + /* we haven't found the correct `StartData'; go back and continue */ + /* searching */ + FT_FRAME_RELEASE( parser->postscript ); + if ( !FT_STREAM_SEEK( offset ) ) + goto Again; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cid_parser_done( CID_Parser* parser ) + { + /* always free the private dictionary */ + if ( parser->postscript ) + { + FT_Stream stream = parser->stream; + + + FT_FRAME_RELEASE( parser->postscript ); + } + parser->root.funcs.done( &parser->root ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidparse.h b/src/3rdparty/freetype/src/cid/cidparse.h new file mode 100644 index 0000000000..ca37deab93 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidparse.h @@ -0,0 +1,123 @@ +/***************************************************************************/ +/* */ +/* cidparse.h */ +/* */ +/* CID-keyed Type1 parser (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDPARSE_H__ +#define __CIDPARSE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_Parser */ + /* */ + /* <Description> */ + /* A CID_Parser is an object used to parse a Type 1 fonts very */ + /* quickly. */ + /* */ + /* <Fields> */ + /* root :: The root PS_ParserRec fields. */ + /* */ + /* stream :: The current input stream. */ + /* */ + /* postscript :: A pointer to the data to be parsed. */ + /* */ + /* postscript_len :: The length of the data to be parsed. */ + /* */ + /* data_offset :: The start position of the binary data (i.e., the */ + /* end of the data to be parsed. */ + /* */ + /* binary_length :: The length of the data after the `StartData' */ + /* command if the data format is hexadecimal. */ + /* */ + /* cid :: A structure which holds the information about */ + /* the current font. */ + /* */ + /* num_dict :: The number of font dictionaries. */ + /* */ + typedef struct CID_Parser_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* postscript; + FT_Long postscript_len; + + FT_ULong data_offset; + + FT_Long binary_length; + + CID_FaceInfo cid; + FT_Int num_dict; + + } CID_Parser; + + + FT_LOCAL( FT_Error ) + cid_parser_new( CID_Parser* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( void ) + cid_parser_done( CID_Parser* parser ); + + + /*************************************************************************/ + /* */ + /* PARSING ROUTINES */ + /* */ + /*************************************************************************/ + +#define cid_parser_skip_spaces( p ) \ + (p)->root.funcs.skip_spaces( &(p)->root ) +#define cid_parser_skip_PS_token( p ) \ + (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define cid_parser_to_int( p ) (p)->root.funcs.to_int( &(p)->root ) +#define cid_parser_to_fixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) + +#define cid_parser_to_coord_array( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) +#define cid_parser_to_fixed_array( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define cid_parser_to_token( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) +#define cid_parser_to_token_array( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) + +#define cid_parser_load_field( p, f, o ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 ) +#define cid_parser_load_field_table( p, f, o ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 ) + + +FT_END_HEADER + +#endif /* __CIDPARSE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidriver.c b/src/3rdparty/freetype/src/cid/cidriver.c new file mode 100644 index 0000000000..b41d5d6f05 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidriver.c @@ -0,0 +1,241 @@ +/***************************************************************************/ +/* */ +/* cidriver.c */ +/* */ +/* CID driver interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "cidriver.h" +#include "cidgload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include "ciderrs.h" + +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_CID_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ciddriver + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + cid_get_postscript_name( CID_Face face ) + { + const char* result = face->cid.cid_font_name; + + + if ( result && result[0] == '/' ) + result++; + + return result; + } + + + static const FT_Service_PsFontNameRec cid_service_ps_name = + { + (FT_PsName_GetFunc) cid_get_postscript_name + }; + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + cid_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((CID_Face)face)->cid.font_info; + + return CID_Err_Ok; + } + + static FT_Error + cid_ps_get_font_extra( FT_Face face, + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ((CID_Face)face)->font_extra; + + return CID_Err_Ok; + } + + static const FT_Service_PsInfoRec cid_service_ps_info = + { + (PS_GetFontInfoFunc) cid_ps_get_font_info, + (PS_GetFontExtraFunc) cid_ps_get_font_extra, + (PS_HasGlyphNamesFunc) NULL, /* unsupported with CID fonts */ + (PS_GetFontPrivateFunc)NULL /* unsupported */ + }; + + + /* + * CID INFO SERVICE + * + */ + static FT_Error + cid_get_ros( CID_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ) + { + CID_FaceInfo cid = &face->cid; + + + if ( registry ) + *registry = cid->registry; + + if ( ordering ) + *ordering = cid->ordering; + + if ( supplement ) + *supplement = cid->supplement; + + return CID_Err_Ok; + } + + + static FT_Error + cid_get_is_cid( CID_Face face, + FT_Bool *is_cid ) + { + FT_Error error = CID_Err_Ok; + FT_UNUSED( face ); + + + if ( is_cid ) + *is_cid = 1; /* cid driver is only used for CID keyed fonts */ + + return error; + } + + + static FT_Error + cid_get_cid_from_glyph_index( CID_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = CID_Err_Ok; + FT_UNUSED( face ); + + + if ( cid ) + *cid = glyph_index; /* identity mapping */ + + return error; + } + + + static const FT_Service_CIDRec cid_service_cid_info = + { + (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros, + (FT_CID_GetIsInternallyCIDKeyedFunc) cid_get_is_cid, + (FT_CID_GetCIDFromGlyphIndexFunc) cid_get_cid_from_glyph_index + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec cid_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, + { FT_SERVICE_ID_CID, &cid_service_cid_info }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + cid_get_interface( FT_Module module, + const char* cid_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( cid_services, cid_interface ); + } + + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec t1cid_driver_class = + { + /* first of all, the FT_Module_Class fields */ + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof( FT_DriverRec ), + "t1cid", /* module name */ + 0x10000L, /* version 1.0 of driver */ + 0x20000L, /* requires FreeType 2.0 */ + + 0, + + cid_driver_init, + cid_driver_done, + cid_get_interface + }, + + /* then the other font drivers fields */ + sizeof( CID_FaceRec ), + sizeof( CID_SizeRec ), + sizeof( CID_GlyphSlotRec ), + + cid_face_init, + cid_face_done, + + cid_size_init, + cid_size_done, + cid_slot_init, + cid_slot_done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + + cid_slot_load_glyph, + + 0, /* FT_Face_GetKerningFunc */ + 0, /* FT_Face_AttachFunc */ + + 0, /* FT_Face_GetAdvancesFunc */ + + cid_size_request, + 0 /* FT_Size_SelectFunc */ + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidriver.h b/src/3rdparty/freetype/src/cid/cidriver.h new file mode 100644 index 0000000000..d5a80f6f9f --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidriver.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* cidriver.h */ +/* */ +/* High-level CID driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDRIVER_H__ +#define __CIDRIVER_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_CALLBACK_TABLE + const FT_Driver_ClassRec t1cid_driver_class; + + +FT_END_HEADER + +#endif /* __CIDRIVER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/cidtoken.h b/src/3rdparty/freetype/src/cid/cidtoken.h new file mode 100644 index 0000000000..94a3657b02 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/cidtoken.h @@ -0,0 +1,112 @@ +/***************************************************************************/ +/* */ +/* cidtoken.h */ +/* */ +/* CID token definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CID_FaceInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_CID_INFO + + T1_FIELD_KEY ( "CIDFontName", cid_font_name, 0 ) + T1_FIELD_NUM ( "CIDFontVersion", cid_version, 0 ) + T1_FIELD_NUM ( "CIDFontType", cid_font_type, 0 ) + T1_FIELD_STRING( "Registry", registry, 0 ) + T1_FIELD_STRING( "Ordering", ordering, 0 ) + T1_FIELD_NUM ( "Supplement", supplement, 0 ) + T1_FIELD_NUM ( "UIDBase", uid_base, 0 ) + T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset, 0 ) + T1_FIELD_NUM ( "FDBytes", fd_bytes, 0 ) + T1_FIELD_NUM ( "GDBytes", gd_bytes, 0 ) + T1_FIELD_NUM ( "CIDCount", cid_count, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, 0 ) + T1_FIELD_STRING( "Notice", notice, 0 ) + T1_FIELD_STRING( "FullName", full_name, 0 ) + T1_FIELD_STRING( "FamilyName", family_name, 0 ) + T1_FIELD_STRING( "Weight", weight, 0 ) + T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CID_FaceDictRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_NUM ( "PaintType", paint_type, 0 ) + T1_FIELD_NUM ( "FontType", font_type, 0 ) + T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset, 0 ) + T1_FIELD_NUM ( "SDBytes", sd_bytes, 0 ) + T1_FIELD_NUM ( "SubrCount", num_subrs, 0 ) + T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar, 0 ) + T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_PrivateRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_PRIVATE + + T1_FIELD_NUM ( "UniqueID", unique_id, 0 ) + T1_FIELD_NUM ( "lenIV", lenIV, 0 ) + T1_FIELD_NUM ( "LanguageGroup", language_group, 0 ) + T1_FIELD_NUM ( "password", password, 0 ) + + T1_FIELD_FIXED_1000( "BlueScale", blue_scale, 0 ) + T1_FIELD_NUM ( "BlueShift", blue_shift, 0 ) + T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, 0 ) + + T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, 0 ) + T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, 0 ) + T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, 0 ) + T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 ) + + T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, 0 ) + T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, 0 ) + T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, 0 ) + + T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, 0 ) + T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, 0 ) + + T1_FIELD_BOOL ( "ForceBold", force_bold, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, 0 ) + + +/* END */ diff --git a/src/3rdparty/freetype/src/cid/module.mk b/src/3rdparty/freetype/src/cid/module.mk new file mode 100644 index 0000000000..ce30bfd7ae --- /dev/null +++ b/src/3rdparty/freetype/src/cid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 CID module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE1CID_DRIVER + +define TYPE1CID_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)cid $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/cid/rules.mk b/src/3rdparty/freetype/src/cid/rules.mk new file mode 100644 index 0000000000..f362744612 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 CID driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# CID driver directory +# +CID_DIR := $(SRC_DIR)/cid + + +CID_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CID_DIR)) + + +# CID driver sources (i.e., C files) +# +CID_DRV_SRC := $(CID_DIR)/cidparse.c \ + $(CID_DIR)/cidload.c \ + $(CID_DIR)/cidriver.c \ + $(CID_DIR)/cidgload.c \ + $(CID_DIR)/cidobjs.c + +# CID driver headers +# +CID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \ + $(CID_DIR)/cidtoken.h \ + $(CID_DIR)/ciderrs.h + + +# CID driver object(s) +# +# CID_DRV_OBJ_M is used during `multi' builds +# CID_DRV_OBJ_S is used during `single' builds +# +CID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O) +CID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O + +# CID driver source file for single build +# +CID_DRV_SRC_S := $(CID_DIR)/type1cid.c + + +# CID driver - single object +# +$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H) + $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S)) + + +# CID driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H) + $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CID_DRV_OBJ_S) +DRV_OBJS_M += $(CID_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/cid/type1cid.c b/src/3rdparty/freetype/src/cid/type1cid.c new file mode 100644 index 0000000000..0b866e97c4 --- /dev/null +++ b/src/3rdparty/freetype/src/cid/type1cid.c @@ -0,0 +1,29 @@ +/***************************************************************************/ +/* */ +/* type1cid.c */ +/* */ +/* FreeType OpenType driver component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "cidparse.c" +#include "cidload.c" +#include "cidobjs.c" +#include "cidriver.c" +#include "cidgload.c" + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/Jamfile b/src/3rdparty/freetype/src/gxvalid/Jamfile new file mode 100644 index 0000000000..88049a625d --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/Jamfile @@ -0,0 +1,33 @@ +# FreeType 2 src/gxvalid Jamfile +# +# Copyright 2005 by +# suzuki toshiya, Masatake YAMATO and Red Hat K.K. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) gxvalid ; + + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = gxvcommn gxvfeat gxvbsln gxvtrak gxvopbd gxvprop + gxvmort gxvmort0 gxvmort1 gxvmort2 gxvmort4 gxvmort5 + gxvmorx gxvmorx0 gxvmorx1 gxvmorx2 gxvmorx4 gxvmorx5 + gxvlcar gxvkern gxvmod gxvjust ; + } + else + { + _sources = gxvalid ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/gxvalid Jamfile diff --git a/src/3rdparty/freetype/src/gxvalid/README b/src/3rdparty/freetype/src/gxvalid/README new file mode 100644 index 0000000000..28e535b0bc --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/README @@ -0,0 +1,532 @@ +gxvalid: TrueType GX validator +============================== + + +1. What is this +--------------- + + `gxvalid' is a module to validate TrueType GX tables: a collection of + additional tables in TrueType font which are used by `QuickDraw GX + Text', Apple Advanced Typography (AAT). In addition, gxvalid can + validates `kern' tables which have been extended for AAT. Like the + otvalid module, gxvalid uses Freetype 2's validator framework + (ftvalid). + + You can link gxvalid with your program; before running your own layout + engine, gxvalid validates a font file. As the result, you can remove + error-checking code from the layout engine. It is also possible to + use gxvalid as a stand-alone font validator; the `ftvalid' test + program included in the ft2demo bundle calls gxvalid internally. + A stand-alone font validator may be useful for font developers. + + This documents documents the following issues. + + - supported TrueType GX tables + - fundamental validation limitations + - permissive error handling of broken GX tables + - `kern' table issue. + + +2. Supported tables +------------------- + + The following GX tables are currently supported. + + bsln + feat + just + kern(*) + lcar + mort + morx + opbd + prop + trak + + The following GX tables are currently unsupported. + + cvar + fdsc + fmtx + fvar + gvar + Zapf + + The following GX tables won't be supported. + + acnt(**) + hsty(***) + + The following undocumented tables in TrueType fonts designed for Apple + platform aren't handled either. + + addg + CVTM + TPNM + umif + + + *) The `kern' validator handles both the classic and the new kern + formats; the former is supported on both Microsoft and Apple + platforms, while the latter is supported on Apple platforms. + + **) `acnt' tables are not supported by currently available Apple font + tools. + + ***) There is one more Apple extension, `hsty', but it is for + Newton-OS, not GX (Newton-OS is a platform by Apple, but it can + use sfnt- housed bitmap fonts only). Therefore, it should be + excluded from `Apple platform' in the context of TrueType. + gxvalid ignores it as Apple font tools do so. + + + We have checked 183 fonts bundled with MacOS 9.1, MacOS 9.2, MacOS + 10.0, MacOS X 10.1, MSIE for MacOS, and AppleWorks 6.0. In addition, + we have checked 67 Dynalab fonts (designed for MacOS) and 189 Ricoh + fonts (designed for Windows and MacOS dual platforms). The number of + fonts including TrueType GX tables are as follows. + + bsln: 76 + feat: 191 + just: 84 + kern: 59 + lcar: 4 + mort: 326 + morx: 19 + opbd: 4 + prop: 114 + trak: 16 + + Dynalab and Ricoh fonts don't have GX tables except of `feat' and + `mort'. + + +3. Fundamental validation limitations +------------------------------------- + + TrueType GX provides layout information to libraries for font + rasterizers and text layout. gxvalid can check whether the layout + data in a font is conformant to the TrueType GX format specified by + Apple. But gxvalid cannot check a how QuickDraw GX/AAT renderer uses + the stored information. + + 3-1. Validation of State Machine activity + ----------------------------------------- + + QuickDraw GX/AAT uses a `State Machine' to provide `stateful' layout + features, and TrueType GX stores the state transition diagram of + this `State Machine' in a `StateTable' data structure. While the + State Machine receives a series of glyph IDs, the State Machine + starts with `start of text' state, walks around various states and + generates various layout information to the renderer, and finally + reaches the `end of text' state. + + gxvalid can check essential errors like: + + - possibility of state transitions to undefined states + - existence of glyph IDs that the State Machine doesn't know how + to handle + - the State Machine cannot compute the layout information from + given diagram + + These errors can be checked within finite steps, and without the + State Machine itself, because these are `expression' errors of state + transition diagram. + + There is no limitation about how long the State Machine walks + around, so validation of the algorithm in the state transition + diagram requires infinite steps, even if we had a State Machine in + gxvalid. Therefore, the following errors and problems cannot be + checked. + + - existence of states which the State Machine never transits to + - the possibility that the State Machine never reaches `end of + text' + - the possibility of stack underflow/overflow in the State Machine + (in ligature and contextual glyph substitutions, the State + Machine can store 16 glyphs onto its stack) + + In addition, gxvalid doesn't check `temporary glyph IDs' used in the + chained State Machines (in `mort' and `morx' tables). If a layout + feature is implemented by a single State Machine, a glyph ID + converted by the State Machine is passed to the glyph renderer, thus + it should not point to an undefined glyph ID. But if a layout + feature is implemented by chained State Machines, a component State + Machine (if it is not the final one) is permitted to generate + undefined glyph IDs for temporary use, because it is handled by next + component State Machine and not by the glyph renderer. To validate + such temporary glyph IDs, gxvalid must stack all undefined glyph IDs + which can occur in the output of the previous State Machine and + search them in the `ClassTable' structure of the current State + Machine. It is too complex to list all possible glyph IDs from the + StateTable, especially from a ligature substitution table. + + 3-2. Validation of relationship between multiple layout features + ---------------------------------------------------------------- + + gxvalid does not validate the relationship between multiple layout + features at all. + + If multiple layout features are defined in TrueType GX tables, + possible interactions, overrides, and conflicts between layout + features are implicitly given in the font too. For example, there + are several predefined spacing control features: + + - Text Spacing (Proportional/Monospace/Half-width/Normal) + - Number Spacing (Monospaced-numbers/Proportional-numbers) + - Kana Spacing (Full-width/Proportional) + - Ideographic Spacing (Full-width/Proportional) + - CJK Roman Spacing (Half-width/Proportional/Default-roman + /Full-width-roman/Proportional) + + If all layout features are independently managed, we can activate + inconsistent typographic rules like `Text Spacing=Monospace' and + `Ideographic Spacing=Proportional' at the same time. + + The combinations of layout features is managed by a 32bit integer + (one bit each for selector setting), so we can define relationships + between up to 32 features, theoretically. But if one feature + setting affects another feature setting, we need typographic + priority rules to validate the relationship. Unfortunately, the + TrueType GX format specification does not give such information even + for predefined features. + + +4. Permissive error handling of broken GX tables +------------------------------------------------ + + When Apple's font rendering system finds an inconsistency, like a + specification violation or an unspecified value in a TrueType GX + table, it does not always return error. In most cases, the rendering + engine silently ignores such wrong values or even whole tables. In + fact, MacOS is shipped with fonts including broken GX/AAT tables, but + no harmful effects due to `officially broken' fonts are observed by + end-users. + + gxvalid is designed to continue the validation process as long as + possible. When gxvalid find wrong values, gxvalid warns it at least, + and takes a fallback procedure if possible. The fallback procedure + depends on the debug level. + + We used the following three tools to investigate Apple's error handling. + + - FontValidator (for MacOS 8.5 - 9.2) resource fork font + - ftxvalidator (for MacOS X 10.1 -) dfont or naked-sfnt + - ftxdumperfuser (for MacOS X 10.1 -) dfont or naked-sfnt + + However, all tests were done on a PowerPC based Macintosh; at present, + we have not checked those tools on a m68k-based Macintosh. + + In total, we checked 183 fonts bundled to MacOS 9.1, MacOS 9.2, MacOS + 10.0, MacOS X 10.1, MSIE for MacOS, and AppleWorks 6.0. These fonts + are distributed officially, but many broken GX/AAT tables were found + by Apple's font tools. In the following, we list typical violation of + the GX specification, in fonts officially distributed with those Apple + systems. + + 4-1. broken BinSrchHeader (19/183) + ---------------------------------- + + `BinSrchHeader' is a header of a data array for m68k platforms to + access memory efficiently. Although there are only two independent + parameters for real (`unitSize' and `nUnits'), BinSrchHeader has + three additional parameters which can be calculated from `unitSize' + and `nUnits', for fast setup. Apple font tools ignore them + silently, so gxvalid warns if it finds and inconsistency, and always + continues validation. The additional parameters are ignored + regardless of the consistency. + + 19 fonts include such inconsistencies; all breaks are in the + BinSrchHeader structure of the `kern' table. + + 4-2. too-short LookupTable (5/183) + ---------------------------------- + + LookupTable format 0 is a simple array to get a value from a given + GID (glyph ID); the index of this array is a GID too. Therefore, + the length of the array is expected to be same as the maximum GID + value defined in the `maxp' table, but there are some fonts whose + LookupTable format 0 is too short to cover all GIDs. FontValidator + ignores this error silently, ftxvalidator and ftxdumperfuser both + warn and continue. Similar problems are found in format 3 subtables + of `kern'. gxvalid warns always and abort if the validation level + is set to FT_VALIDATE_PARANOID. + + 5 fonts include too-short kern format 0 subtables. + 1 font includes too-short kern format 3 subtable. + + 4-3. broken LookupTable format 2 (1/183) + ---------------------------------------- + + LookupTable format 2, subformat 4 covers the GID space by a + collection of segments which are specified by `firstGlyph' and + `lastGlyph'. Some fonts store `firstGlyph' and `lastGlyph' in + reverse order, so the segment specification is broken. Apple font + tools ignore this error silently; a broken segment is ignored as if + it did not exist. gxvalid warns and normalize the segment at + FT_VALIDATE_DEFAULT, or ignore the segment at FT_VALIDATE_TIGHT, or + abort at FT_VALIDATE_PARANOID. + + 1 font includes broken LookupTable format 2, in the `just' table. + + *) It seems that all fonts manufactured by ITC for AppleWorks have + this error. + + 4-4. bad bracketing in glyph property (14/183) + ---------------------------------------------- + + GX/AAT defines a `bracketing' property of the glyphs in the `prop' + table, to control layout features of strings enclosed inside and + outside of brackets. Some fonts give inappropriate bracket + properties to glyphs. Apple font tools warn about this error; + gxvalid warns too and aborts at FT_VALIDATE_PARANOID. + + 14 fonts include wrong bracket properties. + + + 4-5. invalid feature number (117/183) + ------------------------------------- + + The GX/AAT extension can include 255 different layout features, but + popular layout features are predefined (see + http://developer.apple.com/fonts/Registry/index.html). Some fonts + include feature numbers which are incompatible with the predefined + feature registry. + + In our survey, there are 140 fonts including `feat' table. + + a) 67 fonts use a feature number which should not be used. + b) 117 fonts set the wrong feature range (nSetting). This is mostly + found in the `mort' and `morx' tables. + + Apple font tools give no warning, although they cannot recognize + what the feature is. At FT_VALIDATE_DEFAULT, gxvalid warns but + continues in both cases (a, b). At FT_VALIDATE_TIGHT, gxvalid warns + and aborts for (a), but continues for (b). At FT_VALIDATE_PARANOID, + gxvalid warns and aborts in both cases (a, b). + + 4-6. invalid prop version (10/183) + ---------------------------------- + + As most TrueType GX tables, the `prop' table must start with a 32bit + version identifier: 0x00010000, 0x00020000 or 0x00030000. But some + fonts store nonsense binary data instead. When Apple font tools + find them, they abort the processing immediately, and the data which + follows is unhandled. gxvalid does the same. + + 10 fonts include broken `prop' version. + + All of these fonts are classic TrueType fonts for the Japanese + script, manufactured by Apple. + + 4-7. unknown resource name (2/183) + ------------------------------------ + + NOTE: THIS IS NOT A TRUETYPE GX ERROR. + + If a TrueType font is stored in the resource fork or in dfont + format, the data must be tagged as `sfnt' in the resource fork index + to invoke TrueType font handler for the data. But the TrueType font + data in `Keyboard.dfont' is tagged as `kbd', and that in + `LastResort.dfont' is tagged as `lst'. Apple font tools can detect + that the data is in TrueType format and successfully validate them. + Maybe this is possible because they are known to be dfont. The + current implementation of the resource fork driver of FreeType + cannot do that, thus gxvalid cannot validate them. + + 2 fonts use an unknown tag for the TrueType font resource. + +5. `kern' table issues +---------------------- + + In common terminology of TrueType, `kern' is classified as a basic and + platform-independent table. But there are Apple extensions of `kern', + and there is an extension which requires a GX state machine for + contextual kerning. Therefore, gxvalid includes a special validator + for `kern' tables. Unfortunately, there is no exact algorithm to + check Apple's extension, so gxvalid includes a heuristic algorithm to + find the proper validation routines for all possible data formats, + including the data format for Microsoft. By calling + classic_kern_validate() instead of gxv_validate(), you can specify the + `kern' format explicitly. However, current FreeType2 uses Microsoft + `kern' format only, others are ignored (and should be handled in a + library one level higher than FreeType). + + 5-1. History + ------------ + + The original 16bit version of `kern' was designed by Apple in the + pre-GX era, and it was also approved by Microsoft. Afterwards, + Apple designed a new 32bit version of the `kern' table. According + to the documentation, the difference between the 16bit and 32bit + version is only the size of variables in the `kern' header. In the + following, we call the original 16bit version as `classic', and + 32bit version as `new'. + + 5-2. Versions and dialects which should be differentiated + --------------------------------------------------------- + + The `kern' table consists of a table header and several subtables. + The version number which identifies a `classic' or a `new' version + is explicitly written in the table header, but there are + undocumented differences between Microsoft's and Apple's formats. + It is called a `dialect' in the following. There are three cases + which should be handled: the new Apple-dialect, the classic + Apple-dialect, and the classic Microsoft-dialect. An analysis of + the formats and the auto detection algorithm of gxvalid is described + in the following. + + 5-2-1. Version detection: classic and new kern + ---------------------------------------------- + + According to Apple TrueType specification, there are only two + differences between the classic and the new: + + - The `kern' table header starts with the version number. + The classic version starts with 0x0000 (16bit), + the new version starts with 0x00010000 (32bit). + + - In the `kern' table header, the number of subtables follows + the version number. + In the classic version, it is stored as a 16bit value. + In the new version, it is stored as a 32bit value. + + From Apple font tool's output (DumpKERN is also tested in addition + to the three Apple font tools in above), there is another + undocumented difference. In the new version, the subtable header + includes a 16bit variable named `tupleIndex' which does not exist + in the classic version. + + The new version can store all subtable formats (0, 1, 2, and 3), + but the Apple TrueType specification does not mention the subtable + formats available in the classic version. + + 5-2-2. Available subtable formats in classic version + ---------------------------------------------------- + + Although the Apple TrueType specification recommends to use the + classic version in the case if the font is designed for both the + Apple and Microsoft platforms, it does not document the available + subtable formats in the classic version. + + According to the Microsoft TrueType specification, the subtable + format assured for Windows and OS/2 support is only subtable + format 0. The Microsoft TrueType specification also describes + subtable format 2, but does not mention which platforms support + it. Aubtable formats 1, 3, and higher are documented as reserved + for future use. Therefore, the classic version can store subtable + formats 0 and 2, at least. `ttfdump.exe', a font tool provided by + Microsoft, ignores the subtable format written in the subtable + header, and parses the table as if all subtables are in format 0. + + `kern' subtable format 1 uses a StateTable, so it cannot be + utilized without a GX State Machine. Therefore, it is reasonable + to assume that format 1 (and 3) were introduced after Apple had + introduced GX and moved to the new 32bit version. + + 5-2-3. Apple and Microsoft dialects + ----------------------------------- + + The `kern' subtable has a 16bit `coverage' field to describe + kerning attributes, but bit interpretations by Apple and Microsoft + are different: For example, Apple uses bits 0-7 to identify the + subtable, while Microsoft uses bits 8-15. + + In addition, due to the output of DumpKERN and FontValidator, + Apple's bit interpretations of coverage in classic and new version + are incompatible also. In summary, there are three dialects: + classic Apple dialect, classic Microsoft dialect, and new Apple + dialect. The classic Microsoft dialect and the new Apple dialect + are documented by each vendors' TrueType font specification, but + the documentation for classic Apple dialect is not available. + + For example, in the new Apple dialect, bit 15 is documented as + `set to 1 if the kerning is vertical'. On the other hand, in + classic Microsoft dialect, bit 1 is documented as `set to 1 if the + kerning is horizontal'. From the outputs of DumpKERN and + FontValidator, classic Apple dialect recognizes 15 as `set to 1 + when the kerning is horizontal'. From the results of similar + experiments, classic Apple dialect seems to be the Endian reverse + of the classic Microsoft dialect. + + As a conclusion it must be noted that no font tool can identify + classic Apple dialect or classic Microsoft dialect automatically. + + 5-2-4. gxvalid auto dialect detection algorithm + ----------------------------------------------- + + The first 16 bits of the `kern' table are enough to identify the + version: + + - if the first 16 bits are 0x0000, the `kern' table is in + classic Apple dialect or classic Microsoft dialect + - if the first 16 bits are 0x0001, and next 16 bits are 0x0000, + the kern table is in new Apple dialect. + + If the `kern' table is a classic one, the 16bit `coverage' field + is checked next. Firstly, the coverage bits are decoded for the + classic Apple dialect using the following bit masks (this is based + on DumpKERN output): + + 0x8000: 1=horizontal, 0=vertical + 0x4000: not used + 0x2000: 1=cross-stream, 0=normal + 0x1FF0: reserved + 0x000F: subtable format + + If any of reserved bits are set or the subtable bits is + interpreted as format 1 or 3, we take it as `impossible in classic + Apple dialect' and retry, using the classic Microsoft dialect. + + The most popular coverage in new Apple-dialect: 0x8000, + The most popular coverage in classic Apple-dialect: 0x0000, + The most popular coverage in classic Microsoft dialect: 0x0001. + + 5-3. Tested fonts + ----------------- + + We checked 59 fonts bundled with MacOS and 38 fonts bundled with + Windows, where all font include a `kern' table. + + - fonts bundled with MacOS + * new Apple dialect + format 0: 18 + format 2: 1 + format 3: 1 + * classic Apple dialect + format 0: 14 + * classic Microsoft dialect + format 0: 15 + + - fonts bundled with Windows + * classic Microsoft dialect + format 0: 38 + + It looks strange that classic Microsoft-dialect fonts are bundled to + MacOS: they come from MSIE for MacOS, except of MarkerFelt.dfont. + + + ACKNOWLEDGEMENT + --------------- + + Some parts of gxvalid are derived from both the `gxlayout' module and + the `otvalid' module. Development of gxlayout was supported by the + Information-technology Promotion Agency(IPA), Japan. + + The detailed analysis of undefined glyph ID utilization in `mort' and + `morx' tables is provided by George Williams. + +------------------------------------------------------------------------ + +Copyright 2004, 2005, 2007 by +suzuki toshiya, Masatake YAMATO, Red hat K.K., +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of README --- diff --git a/src/3rdparty/freetype/src/gxvalid/gxvalid.c b/src/3rdparty/freetype/src/gxvalid/gxvalid.c new file mode 100644 index 0000000000..bc36e675d1 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvalid.c @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* gxvalid.c */ +/* */ +/* FreeType validator for TrueTypeGX/AAT tables (body only). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> + +#include "gxvfeat.c" +#include "gxvcommn.c" +#include "gxvbsln.c" +#include "gxvtrak.c" +#include "gxvjust.c" +#include "gxvmort.c" +#include "gxvmort0.c" +#include "gxvmort1.c" +#include "gxvmort2.c" +#include "gxvmort4.c" +#include "gxvmort5.c" +#include "gxvmorx.c" +#include "gxvmorx0.c" +#include "gxvmorx1.c" +#include "gxvmorx2.c" +#include "gxvmorx4.c" +#include "gxvmorx5.c" +#include "gxvkern.c" +#include "gxvopbd.c" +#include "gxvprop.c" +#include "gxvlcar.c" +#include "gxvmod.c" + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvalid.h b/src/3rdparty/freetype/src/gxvalid/gxvalid.h new file mode 100644 index 0000000000..27be9ecca8 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvalid.h @@ -0,0 +1,107 @@ +/***************************************************************************/ +/* */ +/* gxvalid.h */ +/* */ +/* TrueTyeeGX/AAT table validation (specification only). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVALID_H__ +#define __GXVALID_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#include "gxverror.h" /* must come before FT_INTERNAL_VALIDATE_H */ + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + gxv_feat_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + + FT_LOCAL( void ) + gxv_bsln_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + + FT_LOCAL( void ) + gxv_trak_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_just_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_kern_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_kern_validate_classic( FT_Bytes table, + FT_Face face, + FT_Int dialect_flags, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_opbd_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_prop_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_lcar_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + +FT_END_HEADER + + +#endif /* __GXVALID_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvbsln.c b/src/3rdparty/freetype/src/gxvalid/gxvbsln.c new file mode 100644 index 0000000000..6cca65831e --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvbsln.c @@ -0,0 +1,333 @@ +/***************************************************************************/ +/* */ +/* gxvbsln.c */ +/* */ +/* TrueTypeGX/AAT bsln table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvbsln + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_BSLN_VALUE_COUNT 32 +#define GXV_BSLN_VALUE_EMPTY 0xFFFFU + + + typedef struct GXV_bsln_DataRec_ + { + FT_Bytes ctlPoints_p; + FT_UShort defaultBaseline; + + } GXV_bsln_DataRec, *GXV_bsln_Data; + + +#define GXV_BSLN_DATA( field ) GXV_TABLE_DATA( bsln, field ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_bsln_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UShort v = value.u; + FT_UShort* ctlPoints; + + FT_UNUSED( glyph ); + + + GXV_NAME_ENTER( "lookup value" ); + + if ( v >= GXV_BSLN_VALUE_COUNT ) + FT_INVALID_DATA; + + ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p ); + if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY ) + FT_INVALID_DATA; + + GXV_EXIT; + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + ... | + | + 16bit value array | + +===============+ | + | value | <-------+ + ... + */ + + static GXV_LookupValueDesc + gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range ? */ + offset = (FT_UShort)( base_value.u + + ( relative_gindex * sizeof ( FT_UShort ) ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + GXV_LIMIT_CHECK( 2 ); + + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + static void + gxv_bsln_parts_fmt0_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 0" ); + + /* deltas */ + GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT ); + + valid->table_data = NULL; /* No ctlPoints here. */ + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt1_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 1" ); + + /* deltas */ + gxv_bsln_parts_fmt0_validate( p, limit, valid ); + + /* mappingData */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_bsln_LookupValue_validate; + valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; + gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT, + limit, + valid ); + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt2_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + FT_UShort stdGlyph; + FT_UShort ctlPoint; + FT_Int i; + + FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline ); + + + GXV_NAME_ENTER( "parts format 2" ); + + GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) ); + + /* stdGlyph */ + stdGlyph = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph )); + + gxv_glyphid_validate( stdGlyph, valid ); + + /* Record the position of ctlPoints */ + GXV_BSLN_DATA( ctlPoints_p ) = p; + + /* ctlPoints */ + for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ ) + { + ctlPoint = FT_NEXT_USHORT( p ); + if ( ctlPoint == GXV_BSLN_VALUE_EMPTY ) + { + if ( i == defaultBaseline ) + FT_INVALID_DATA; + } + else + gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid ); + } + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt3_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 3" ); + + /* stdGlyph + ctlPoints */ + gxv_bsln_parts_fmt2_validate( p, limit, valid ); + + /* mappingData */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_bsln_LookupValue_validate; + valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; + gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ), + limit, + valid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** bsln TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_bsln_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_bsln_DataRec bslnrec; + GXV_bsln_Data bsln = &bslnrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong version; + FT_UShort format; + FT_UShort defaultBaseline; + + GXV_Validate_Func fmt_funcs_table [] = + { + gxv_bsln_parts_fmt0_validate, + gxv_bsln_parts_fmt1_validate, + gxv_bsln_parts_fmt2_validate, + gxv_bsln_parts_fmt3_validate, + }; + + + valid->root = ftvalid; + valid->table_data = bsln; + valid->face = face; + + FT_TRACE3(( "validating `bsln' table\n" )); + GXV_INIT; + + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + defaultBaseline = FT_NEXT_USHORT( p ); + + /* only version 1.0 is defined (1996) */ + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* only format 1, 2, 3 are defined (1996) */ + GXV_TRACE(( " (format = %d)\n", format )); + if ( format > 3 ) + FT_INVALID_FORMAT; + + if ( defaultBaseline > 31 ) + FT_INVALID_FORMAT; + + bsln->defaultBaseline = defaultBaseline; + + fmt_funcs_table[format]( p, limit, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc + (do not change this comment) */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvcommn.c b/src/3rdparty/freetype/src/gxvalid/gxvcommn.c new file mode 100644 index 0000000000..46fc123fe4 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvcommn.c @@ -0,0 +1,1758 @@ +/***************************************************************************/ +/* */ +/* gxvcommn.c */ +/* */ +/* TrueTypeGX/AAT common tables validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvcommon + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 16bit offset sorter *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static int + gxv_compare_ushort_offset( FT_UShort* a, + FT_UShort* b ) + { + if ( *a < *b ) + return -1; + else if ( *a > *b ) + return 1; + else + return 0; + } + + + FT_LOCAL_DEF( void ) + gxv_set_length_by_ushort_offset( FT_UShort* offset, + FT_UShort** length, + FT_UShort* buff, + FT_UInt nmemb, + FT_UShort limit, + GXV_Validator valid ) + { + FT_UInt i; + + + for ( i = 0; i < nmemb; i++ ) + *(length[i]) = 0; + + for ( i = 0; i < nmemb; i++ ) + buff[i] = offset[i]; + buff[nmemb] = limit; + + ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_UShort ), + ( int(*)(const void*, const void*) )gxv_compare_ushort_offset ); + + if ( buff[nmemb] > limit ) + FT_INVALID_OFFSET; + + for ( i = 0; i < nmemb; i++ ) + { + FT_UInt j; + + + for ( j = 0; j < nmemb; j++ ) + if ( buff[j] == offset[i] ) + break; + + if ( j == nmemb ) + FT_INVALID_OFFSET; + + *(length[i]) = (FT_UShort)( buff[j + 1] - buff[j] ); + + if ( 0 != offset[i] && 0 == *(length[i]) ) + FT_INVALID_OFFSET; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 32bit offset sorter *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static int + gxv_compare_ulong_offset( FT_ULong* a, + FT_ULong* b ) + { + if ( *a < *b ) + return -1; + else if ( *a > *b ) + return 1; + else + return 0; + } + + + FT_LOCAL_DEF( void ) + gxv_set_length_by_ulong_offset( FT_ULong* offset, + FT_ULong** length, + FT_ULong* buff, + FT_UInt nmemb, + FT_ULong limit, + GXV_Validator valid) + { + FT_UInt i; + + + for ( i = 0; i < nmemb; i++ ) + *(length[i]) = 0; + + for ( i = 0; i < nmemb; i++ ) + buff[i] = offset[i]; + buff[nmemb] = limit; + + ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_ULong ), + ( int(*)(const void*, const void*) )gxv_compare_ulong_offset ); + + if ( buff[nmemb] > limit ) + FT_INVALID_OFFSET; + + for ( i = 0; i < nmemb; i++ ) + { + FT_UInt j; + + + for ( j = 0; j < nmemb; j++ ) + if ( buff[j] == offset[i] ) + break; + + if ( j == nmemb ) + FT_INVALID_OFFSET; + + *(length[i]) = buff[j + 1] - buff[j]; + + if ( 0 != offset[i] && 0 == *(length[i]) ) + FT_INVALID_OFFSET; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** scan value array and get min & max *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + gxv_array_getlimits_byte( FT_Bytes table, + FT_Bytes limit, + FT_Byte* min, + FT_Byte* max, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + *min = 0xFF; + *max = 0x00; + + while ( p < limit ) + { + FT_Byte val; + + + GXV_LIMIT_CHECK( 1 ); + val = FT_NEXT_BYTE( p ); + + *min = (FT_Byte)FT_MIN( *min, val ); + *max = (FT_Byte)FT_MAX( *max, val ); + } + + valid->subtable_length = p - table; + } + + + FT_LOCAL_DEF( void ) + gxv_array_getlimits_ushort( FT_Bytes table, + FT_Bytes limit, + FT_UShort* min, + FT_UShort* max, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + *min = 0xFFFFU; + *max = 0x0000; + + while ( p < limit ) + { + FT_UShort val; + + + GXV_LIMIT_CHECK( 2 ); + val = FT_NEXT_USHORT( p ); + + *min = (FT_Byte)FT_MIN( *min, val ); + *max = (FT_Byte)FT_MAX( *max, val ); + } + + valid->subtable_length = p - table; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BINSEARCHHEADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_BinSrchHeader_ + { + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort searchRange; + FT_UShort entrySelector; + FT_UShort rangeShift; + + } GXV_BinSrchHeader; + + + static void + gxv_BinSrchHeader_check_consistency( GXV_BinSrchHeader* binSrchHeader, + GXV_Validator valid ) + { + FT_UShort searchRange; + FT_UShort entrySelector; + FT_UShort rangeShift; + + + if ( binSrchHeader->unitSize == 0 ) + FT_INVALID_DATA; + + if ( binSrchHeader->nUnits == 0 ) + { + if ( binSrchHeader->searchRange == 0 && + binSrchHeader->entrySelector == 0 && + binSrchHeader->rangeShift == 0 ) + return; + else + FT_INVALID_DATA; + } + + for ( searchRange = 1, entrySelector = 1; + ( searchRange * 2 ) <= binSrchHeader->nUnits && + searchRange < 0x8000U; + searchRange *= 2, entrySelector++ ) + ; + + entrySelector--; + searchRange = (FT_UShort)( searchRange * binSrchHeader->unitSize ); + rangeShift = (FT_UShort)( binSrchHeader->nUnits * binSrchHeader->unitSize + - searchRange ); + + if ( searchRange != binSrchHeader->searchRange || + entrySelector != binSrchHeader->entrySelector || + rangeShift != binSrchHeader->rangeShift ) + { + GXV_TRACE(( "Inconsistency found in BinSrchHeader\n" )); + GXV_TRACE(( "originally: unitSize=%d, nUnits=%d, " + "searchRange=%d, entrySelector=%d, " + "rangeShift=%d\n", + binSrchHeader->unitSize, binSrchHeader->nUnits, + binSrchHeader->searchRange, binSrchHeader->entrySelector, + binSrchHeader->rangeShift )); + GXV_TRACE(( "calculated: unitSize=%d, nUnits=%d, " + "searchRange=%d, entrySelector=%d, " + "rangeShift=%d\n", + binSrchHeader->unitSize, binSrchHeader->nUnits, + searchRange, entrySelector, rangeShift )); + + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + } + + + /* + * parser & validator of BinSrchHeader + * which is used in LookupTable format 2, 4, 6. + * + * Essential parameters (unitSize, nUnits) are returned by + * given pointer, others (searchRange, entrySelector, rangeShift) + * can be calculated by essential parameters, so they are just + * validated and discarded. + * + * However, wrong values in searchRange, entrySelector, rangeShift + * won't cause fatal errors, because these parameters might be + * only used in old m68k font driver in MacOS. + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + + FT_LOCAL_DEF( void ) + gxv_BinSrchHeader_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort* unitSize_p, + FT_UShort* nUnits_p, + GXV_Validator valid ) + { + FT_Bytes p = table; + GXV_BinSrchHeader binSrchHeader; + + + GXV_NAME_ENTER( "BinSrchHeader validate" ); + + if ( *unitSize_p == 0 ) + { + GXV_LIMIT_CHECK( 2 ); + binSrchHeader.unitSize = FT_NEXT_USHORT( p ); + } + else + binSrchHeader.unitSize = *unitSize_p; + + if ( *nUnits_p == 0 ) + { + GXV_LIMIT_CHECK( 2 ); + binSrchHeader.nUnits = FT_NEXT_USHORT( p ); + } + else + binSrchHeader.nUnits = *nUnits_p; + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + binSrchHeader.searchRange = FT_NEXT_USHORT( p ); + binSrchHeader.entrySelector = FT_NEXT_USHORT( p ); + binSrchHeader.rangeShift = FT_NEXT_USHORT( p ); + GXV_TRACE(( "nUnits %d\n", binSrchHeader.nUnits )); + + gxv_BinSrchHeader_check_consistency( &binSrchHeader, valid ); + + if ( *unitSize_p == 0 ) + *unitSize_p = binSrchHeader.unitSize; + + if ( *nUnits_p == 0 ) + *nUnits_p = binSrchHeader.nUnits; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUP TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_LOOKUP_VALUE_LOAD( P, SIGNSPEC ) \ + ( P += 2, gxv_lookup_value_load( P - 2, SIGNSPEC ) ) + + static GXV_LookupValueDesc + gxv_lookup_value_load( FT_Bytes p, + int signspec ) + { + GXV_LookupValueDesc v; + + + if ( signspec == GXV_LOOKUPVALUE_UNSIGNED ) + v.u = FT_NEXT_USHORT( p ); + else + v.s = FT_NEXT_SHORT( p ); + + return v; + } + + +#define GXV_UNITSIZE_VALIDATE( FORMAT, UNITSIZE, NUNITS, CORRECTSIZE ) \ + FT_BEGIN_STMNT \ + if ( UNITSIZE != CORRECTSIZE ) \ + { \ + FT_ERROR(( "unitSize=%d differs from" \ + "expected unitSize=%d" \ + "in LookupTable %s", \ + UNITSIZE, CORRECTSIZE, FORMAT )); \ + if ( UNITSIZE != 0 && NUNITS != 0 ) \ + { \ + FT_ERROR(( " cannot validate anymore\n" )); \ + FT_INVALID_FORMAT; \ + } \ + else \ + FT_ERROR(( " forcibly continues\n" )); \ + } \ + FT_END_STMNT + + + /* ================= Simple Array Format 0 Lookup Table ================ */ + static void + gxv_LookupTable_fmt0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 0" ); + + GXV_LIMIT_CHECK( 2 * valid->face->num_glyphs ); + + for ( i = 0; i < valid->face->num_glyphs; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + if ( p + 2 >= limit ) /* some fonts have too-short fmt0 array */ + { + GXV_TRACE(( "too short, glyphs %d - %d are missing\n", + i, valid->face->num_glyphs )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + break; + } + + value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); + valid->lookupval_func( i, value, valid ); + } + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /* ================= Segment Single Format 2 Loolup Table ============== */ + /* + * Apple spec says: + * + * To guarantee that a binary search terminates, you must include one or + * more special `end of search table' values at the end of the data to + * be searched. The number of termination values that need to be + * included is table-specific. The value that indicates binary search + * termination is 0xFFFF. + * + * The problem is that nUnits does not include this end-marker. It's + * quite difficult to discriminate whether the following 0xFFFF comes from + * the end-marker or some next data. + * + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + static void + gxv_LookupTable_fmt2_skip_endmarkers( FT_Bytes table, + FT_UShort unitSize, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + while ( ( p + 4 ) < valid->root->limit ) + { + if ( p[0] != 0xFF || p[1] != 0xFF || /* lastGlyph */ + p[2] != 0xFF || p[3] != 0xFF ) /* firstGlyph */ + break; + p += unitSize; + } + + valid->subtable_length = p - table; + } + + + static void + gxv_LookupTable_fmt2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort gid; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort unit; + FT_UShort lastGlyph; + FT_UShort firstGlyph; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 2" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); + p += valid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format2", unitSize, nUnits, 6 ); + + for ( unit = 0, gid = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + lastGlyph = FT_NEXT_USHORT( p ); + firstGlyph = FT_NEXT_USHORT( p ); + value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); + + gxv_glyphid_validate( firstGlyph, valid ); + gxv_glyphid_validate( lastGlyph, valid ); + + if ( lastGlyph < gid ) + { + GXV_TRACE(( "reverse ordered segment specification:" + " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n", + unit, lastGlyph, unit - 1 , gid )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + + if ( lastGlyph < firstGlyph ) + { + GXV_TRACE(( "reverse ordered range specification at unit %d:", + " lastGlyph %d < firstGlyph %d ", + unit, lastGlyph, firstGlyph )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + + if ( valid->root->level == FT_VALIDATE_TIGHT ) + continue; /* ftxvalidator silently skips such an entry */ + + FT_TRACE4(( "continuing with exchanged values\n" )); + gid = firstGlyph; + firstGlyph = lastGlyph; + lastGlyph = gid; + } + + for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) + valid->lookupval_func( gid, value, valid ); + } + + gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /* ================= Segment Array Format 4 Lookup Table =============== */ + static void + gxv_LookupTable_fmt4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort unit; + FT_UShort gid; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort lastGlyph; + FT_UShort firstGlyph; + GXV_LookupValueDesc base_value; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 4" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); + p += valid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format4", unitSize, nUnits, 6 ); + + for ( unit = 0, gid = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 ); + lastGlyph = FT_NEXT_USHORT( p ); + firstGlyph = FT_NEXT_USHORT( p ); + + gxv_glyphid_validate( firstGlyph, valid ); + gxv_glyphid_validate( lastGlyph, valid ); + + if ( lastGlyph < gid ) + { + GXV_TRACE(( "reverse ordered segment specification:" + " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n", + unit, lastGlyph, unit - 1 , gid )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + + if ( lastGlyph < firstGlyph ) + { + GXV_TRACE(( "reverse ordered range specification at unit %d:", + " lastGlyph %d < firstGlyph %d ", + unit, lastGlyph, firstGlyph )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + + if ( valid->root->level == FT_VALIDATE_TIGHT ) + continue; /* ftxvalidator silently skips such an entry */ + + FT_TRACE4(( "continuing with exchanged values\n" )); + gid = firstGlyph; + firstGlyph = lastGlyph; + lastGlyph = gid; + } + + GXV_LIMIT_CHECK( 2 ); + base_value = GXV_LOOKUP_VALUE_LOAD( p, GXV_LOOKUPVALUE_UNSIGNED ); + + for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) + { + value = valid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ), + base_value, + limit, + valid ); + + valid->lookupval_func( gid, value, valid ); + } + } + + gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /* ================= Segment Table Format 6 Lookup Table =============== */ + static void + gxv_LookupTable_fmt6_skip_endmarkers( FT_Bytes table, + FT_UShort unitSize, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + while ( p < valid->root->limit ) + { + if ( p[0] != 0xFF || p[1] != 0xFF ) + break; + p += unitSize; + } + + valid->subtable_length = p - table; + } + + + static void + gxv_LookupTable_fmt6_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort unit; + FT_UShort prev_glyph; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort glyph; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 6" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); + p += valid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format6", unitSize, nUnits, 4 ); + + for ( unit = 0, prev_glyph = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 ); + glyph = FT_NEXT_USHORT( p ); + value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); + + if ( gxv_glyphid_validate( glyph, valid ) ) + GXV_TRACE(( " endmarker found within defined range" + " (entry %d < nUnits=%d)\n", + unit, nUnits )); + + if ( prev_glyph > glyph ) + { + GXV_TRACE(( "current gid 0x%04x < previous gid 0x%04x\n", + glyph, prev_glyph )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + prev_glyph = glyph; + + valid->lookupval_func( glyph, value, valid ); + } + + gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /* ================= Trimmed Array Format 8 Lookup Table =============== */ + static void + gxv_LookupTable_fmt8_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_LookupValueDesc value; + FT_UShort firstGlyph; + FT_UShort glyphCount; + + + GXV_NAME_ENTER( "LookupTable format 8" ); + + /* firstGlyph + glyphCount */ + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + glyphCount = FT_NEXT_USHORT( p ); + + gxv_glyphid_validate( firstGlyph, valid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), valid ); + + /* valueArray */ + for ( i = 0; i < glyphCount; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); + valid->lookupval_func( (FT_UShort)( firstGlyph + i ), value, valid ); + } + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_LookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort format; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_LookupTable_fmt0_validate, /* 0 */ + NULL, /* 1 */ + gxv_LookupTable_fmt2_validate, /* 2 */ + NULL, /* 3 */ + gxv_LookupTable_fmt4_validate, /* 4 */ + NULL, /* 5 */ + gxv_LookupTable_fmt6_validate, /* 6 */ + NULL, /* 7 */ + gxv_LookupTable_fmt8_validate, /* 8 */ + }; + + GXV_Validate_Func func; + + + GXV_NAME_ENTER( "LookupTable" ); + + /* lookuptbl_head may be used in fmt4 transit function. */ + valid->lookuptbl_head = table; + + /* format */ + GXV_LIMIT_CHECK( 2 ); + format = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (format %d)\n", format )); + + if ( format > 8 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[format]; + if ( func == NULL ) + FT_INVALID_FORMAT; + + func( p, limit, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Glyph ID *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Int ) + gxv_glyphid_validate( FT_UShort gid, + GXV_Validator valid ) + { + FT_Face face; + + + if ( gid == 0xFFFFU ) + { + GXV_EXIT; + return 1; + } + + face = valid->face; + if ( face->num_glyphs < gid ) + { + GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %d < %d\n", + face->num_glyphs, gid )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CONTROL POINT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_ctlPoint_validate( FT_UShort gid, + FT_Short ctl_point, + GXV_Validator valid ) + { + FT_Face face; + FT_Error error; + + FT_GlyphSlot glyph; + FT_Outline outline; + short n_points; + + + face = valid->face; + + error = FT_Load_Glyph( face, + gid, + FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM ); + if ( error ) + FT_INVALID_GLYPH_ID; + + glyph = face->glyph; + outline = glyph->outline; + n_points = outline.n_points; + + + if ( !( ctl_point < n_points ) ) + FT_INVALID_DATA; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SFNT NAME *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_sfntName_validate( FT_UShort name_index, + FT_UShort min_index, + FT_UShort max_index, + GXV_Validator valid ) + { + FT_SfntName name; + FT_UInt i; + FT_UInt nnames; + + + GXV_NAME_ENTER( "sfntName" ); + + if ( name_index < min_index || max_index < name_index ) + FT_INVALID_FORMAT; + + nnames = FT_Get_Sfnt_Name_Count( valid->face ); + for ( i = 0; i < nnames; i++ ) + { + if ( FT_Get_Sfnt_Name( valid->face, i, &name ) != FT_Err_Ok ) + continue ; + + if ( name.name_id == name_index ) + goto Out; + } + + GXV_TRACE(( " nameIndex = %d (UNTITLED)\n", name_index )); + FT_INVALID_DATA; + goto Exit; /* make compiler happy */ + + Out: + FT_TRACE1(( " nameIndex = %d (", name_index )); + GXV_TRACE_HEXDUMP_SFNTNAME( name ); + FT_TRACE1(( ")\n" )); + + Exit: + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STATE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* -------------------------- Class Table --------------------------- */ + + /* + * highestClass specifies how many classes are defined in this + * Class Subtable. Apple spec does not mention whether undefined + * holes in the class (e.g.: 0-3 are predefined, 4 is unused, 5 is used) + * are permitted. At present, holes in a defined class are not checked. + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + + static void + gxv_ClassTable_validate( FT_Bytes table, + FT_UShort* length_p, + FT_UShort stateSize, + FT_Byte* maxClassID_p, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort firstGlyph; + FT_UShort nGlyphs; + + + GXV_NAME_ENTER( "ClassTable" ); + + *maxClassID_p = 3; /* Classes 0, 2, and 3 are predefined */ + + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + nGlyphs = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (firstGlyph = %d, nGlyphs = %d)\n", firstGlyph, nGlyphs )); + + if ( !nGlyphs ) + goto Out; + + gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), valid ); + + { + FT_Byte nGlyphInClass[256]; + FT_Byte classID; + FT_UShort i; + + + ft_memset( nGlyphInClass, 0, 256 ); + + + for ( i = 0; i < nGlyphs; i++ ) + { + GXV_LIMIT_CHECK( 1 ); + classID = FT_NEXT_BYTE( p ); + switch ( classID ) + { + /* following classes should not appear in class array */ + case 0: /* end of text */ + case 2: /* out of bounds */ + case 3: /* end of line */ + FT_INVALID_DATA; + break; + + case 1: /* out of bounds */ + default: /* user-defined: 4 - ( stateSize - 1 ) */ + if ( classID >= stateSize ) + FT_INVALID_DATA; /* assign glyph to undefined state */ + + nGlyphInClass[classID]++; + break; + } + } + *length_p = (FT_UShort)( p - table ); + + /* scan max ClassID in use */ + for ( i = 0; i < stateSize; i++ ) + if ( ( 3 < i ) && ( nGlyphInClass[i] > 0 ) ) + *maxClassID_p = (FT_Byte)i; /* XXX: Check Range? */ + } + + Out: + GXV_TRACE(( "Declared stateSize=0x%02x, Used maxClassID=0x%02x\n", + stateSize, *maxClassID_p )); + GXV_EXIT; + } + + + /* --------------------------- State Array ----------------------------- */ + + static void + gxv_StateArray_validate( FT_Bytes table, + FT_UShort* length_p, + FT_Byte maxClassID, + FT_UShort stateSize, + FT_Byte* maxState_p, + FT_Byte* maxEntry_p, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_Byte clazz; + FT_Byte entry; + + FT_UNUSED( stateSize ); /* for the non-debugging case */ + + + GXV_NAME_ENTER( "StateArray" ); + + GXV_TRACE(( "parse %d bytes by stateSize=%d maxClassID=%d\n", + (int)(*length_p), stateSize, (int)(maxClassID) )); + + /* + * 2 states are predefined and must be described in StateArray: + * state 0 (start of text), 1 (start of line) + */ + GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 ); + + *maxState_p = 0; + *maxEntry_p = 0; + + /* read if enough to read another state */ + while ( p + ( 1 + maxClassID ) <= limit ) + { + (*maxState_p)++; + for ( clazz = 0; clazz <= maxClassID; clazz++ ) + { + entry = FT_NEXT_BYTE( p ); + *maxEntry_p = (FT_Byte)FT_MAX( *maxEntry_p, entry ); + } + } + GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", + *maxState_p, *maxEntry_p )); + + *length_p = (FT_UShort)( p - table ); + + GXV_EXIT; + } + + + /* --------------------------- Entry Table ----------------------------- */ + + static void + gxv_EntryTable_validate( FT_Bytes table, + FT_UShort* length_p, + FT_Byte maxEntry, + FT_UShort stateArray, + FT_UShort stateArray_length, + FT_Byte maxClassID, + FT_Bytes statetable_table, + FT_Bytes statetable_limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_Byte entry; + FT_Byte state; + FT_Int entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( statetable ); + + GXV_XStateTable_GlyphOffsetDesc glyphOffset; + + + GXV_NAME_ENTER( "EntryTable" ); + + GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize )); + + if ( ( maxEntry + 1 ) * entrySize > *length_p ) + { + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_TOO_SHORT; + + /* ftxvalidator and FontValidator both warn and continue */ + maxEntry = (FT_Byte)( *length_p / entrySize - 1 ); + GXV_TRACE(( "too large maxEntry, shrinking to %d fit EntryTable length\n", + maxEntry )); + } + + for ( entry = 0; entry <= maxEntry; entry++ ) + { + FT_UShort newState; + FT_UShort flags; + + + GXV_LIMIT_CHECK( 2 + 2 ); + newState = FT_NEXT_USHORT( p ); + flags = FT_NEXT_USHORT( p ); + + + if ( newState < stateArray || + stateArray + stateArray_length < newState ) + { + GXV_TRACE(( " newState offset 0x%04x is out of stateArray\n", + newState )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + continue; + } + + if ( 0 != ( ( newState - stateArray ) % ( 1 + maxClassID ) ) ) + { + GXV_TRACE(( " newState offset 0x%04x is not aligned to %d-classes\n", + newState, 1 + maxClassID )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + continue; + } + + state = (FT_Byte)( ( newState - stateArray ) / ( 1 + maxClassID ) ); + + switch ( GXV_GLYPHOFFSET_FMT( statetable ) ) + { + case GXV_GLYPHOFFSET_NONE: + glyphOffset.uc = 0; /* make compiler happy */ + break; + + case GXV_GLYPHOFFSET_UCHAR: + glyphOffset.uc = FT_NEXT_BYTE( p ); + break; + + case GXV_GLYPHOFFSET_CHAR: + glyphOffset.c = FT_NEXT_CHAR( p ); + break; + + case GXV_GLYPHOFFSET_USHORT: + glyphOffset.u = FT_NEXT_USHORT( p ); + break; + + case GXV_GLYPHOFFSET_SHORT: + glyphOffset.s = FT_NEXT_SHORT( p ); + break; + + case GXV_GLYPHOFFSET_ULONG: + glyphOffset.ul = FT_NEXT_ULONG( p ); + break; + + case GXV_GLYPHOFFSET_LONG: + glyphOffset.l = FT_NEXT_LONG( p ); + break; + + default: + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_FORMAT; + goto Exit; + } + + if ( NULL != valid->statetable.entry_validate_func ) + valid->statetable.entry_validate_func( state, + flags, + glyphOffset, + statetable_table, + statetable_limit, + valid ); + } + + Exit: + *length_p = (FT_UShort)( p - table ); + + GXV_EXIT; + } + + + /* =========================== State Table ============================= */ + + FT_LOCAL_DEF( void ) + gxv_StateTable_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ) + { + FT_UShort o[3]; + FT_UShort* l[3]; + FT_UShort buff[4]; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + + gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, valid ); + } + + + FT_LOCAL_DEF( void ) + gxv_StateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort stateSize; + FT_UShort classTable; /* offset to Class(Sub)Table */ + FT_UShort stateArray; /* offset to StateArray */ + FT_UShort entryTable; /* offset to EntryTable */ + + FT_UShort classTable_length; + FT_UShort stateArray_length; + FT_UShort entryTable_length; + FT_Byte maxClassID; + FT_Byte maxState; + FT_Byte maxEntry; + + GXV_StateTable_Subtable_Setup_Func setup_func; + + FT_Bytes p = table; + + + GXV_NAME_ENTER( "StateTable" ); + + GXV_TRACE(( "StateTable header\n" )); + + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + stateSize = FT_NEXT_USHORT( p ); + classTable = FT_NEXT_USHORT( p ); + stateArray = FT_NEXT_USHORT( p ); + entryTable = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "stateSize=0x%04x\n", stateSize )); + GXV_TRACE(( "offset to classTable=0x%04x\n", classTable )); + GXV_TRACE(( "offset to stateArray=0x%04x\n", stateArray )); + GXV_TRACE(( "offset to entryTable=0x%04x\n", entryTable )); + + if ( stateSize > 0xFF ) + FT_INVALID_DATA; + + if ( valid->statetable.optdata_load_func != NULL ) + valid->statetable.optdata_load_func( p, limit, valid ); + + if ( valid->statetable.subtable_setup_func != NULL) + setup_func = valid->statetable.subtable_setup_func; + else + setup_func = gxv_StateTable_subtable_setup; + + setup_func( (FT_UShort)( limit - table ), + classTable, + stateArray, + entryTable, + &classTable_length, + &stateArray_length, + &entryTable_length, + valid ); + + GXV_TRACE(( "StateTable Subtables\n" )); + + if ( classTable != 0 ) + gxv_ClassTable_validate( table + classTable, + &classTable_length, + stateSize, + &maxClassID, + valid ); + else + maxClassID = (FT_Byte)( stateSize - 1 ); + + if ( stateArray != 0 ) + gxv_StateArray_validate( table + stateArray, + &stateArray_length, + maxClassID, + stateSize, + &maxState, + &maxEntry, + valid ); + else + { + maxState = 1; /* 0:start of text, 1:start of line are predefined */ + maxEntry = 0; + } + + if ( maxEntry > 0 && entryTable == 0 ) + FT_INVALID_OFFSET; + + if ( entryTable != 0 ) + gxv_EntryTable_validate( table + entryTable, + &entryTable_length, + maxEntry, + stateArray, + stateArray_length, + maxClassID, + table, + limit, + valid ); + + GXV_EXIT; + } + + + /* ================= eXtended State Table (for morx) =================== */ + + FT_LOCAL_DEF( void ) + gxv_XStateTable_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ) + { + FT_ULong o[3]; + FT_ULong* l[3]; + FT_ULong buff[4]; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + + gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid ); + } + + + static void + gxv_XClassTable_lookupval_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value.u >= valid->xstatetable.nClasses ) + FT_INVALID_DATA; + if ( value.u > valid->xstatetable.maxClassID ) + valid->xstatetable.maxClassID = value.u; + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 16bit value array | + +===============+ | + | value | <-------+ + .... + */ + static GXV_LookupValueDesc + gxv_XClassTable_lookupfmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + static void + gxv_XStateArray_validate( FT_Bytes table, + FT_ULong* length_p, + FT_UShort maxClassID, + FT_ULong stateSize, + FT_UShort* maxState_p, + FT_UShort* maxEntry_p, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort clazz; + FT_UShort entry; + + FT_UNUSED( stateSize ); /* for the non-debugging case */ + + + GXV_NAME_ENTER( "XStateArray" ); + + GXV_TRACE(( "parse % 3d bytes by stateSize=% 3d maxClassID=% 3d\n", + (int)(*length_p), stateSize, (int)(maxClassID) )); + + /* + * 2 states are predefined and must be described: + * state 0 (start of text), 1 (start of line) + */ + GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 * 2 ); + + *maxState_p = 0; + *maxEntry_p = 0; + + /* read if enough to read another state */ + while ( p + ( ( 1 + maxClassID ) * 2 ) <= limit ) + { + (*maxState_p)++; + for ( clazz = 0; clazz <= maxClassID; clazz++ ) + { + entry = FT_NEXT_USHORT( p ); + *maxEntry_p = (FT_UShort)FT_MAX( *maxEntry_p, entry ); + } + } + GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", + *maxState_p, *maxEntry_p )); + + *length_p = p - table; + + GXV_EXIT; + } + + + static void + gxv_XEntryTable_validate( FT_Bytes table, + FT_ULong* length_p, + FT_UShort maxEntry, + FT_ULong stateArray_length, + FT_UShort maxClassID, + FT_Bytes xstatetable_table, + FT_Bytes xstatetable_limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort entry; + FT_UShort state; + FT_Int entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( xstatetable ); + + + GXV_NAME_ENTER( "XEntryTable" ); + GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize )); + + if ( ( p + ( maxEntry + 1 ) * entrySize ) > limit ) + FT_INVALID_TOO_SHORT; + + for (entry = 0; entry <= maxEntry ; entry++ ) + { + FT_UShort newState_idx; + FT_UShort flags; + GXV_XStateTable_GlyphOffsetDesc glyphOffset; + + + GXV_LIMIT_CHECK( 2 + 2 ); + newState_idx = FT_NEXT_USHORT( p ); + flags = FT_NEXT_USHORT( p ); + + if ( stateArray_length < (FT_ULong)( newState_idx * 2 ) ) + { + GXV_TRACE(( " newState index 0x%04x points out of stateArray\n", + newState_idx )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + } + + state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) ); + if ( 0 != ( newState_idx % ( 1 + maxClassID ) ) ) + { + FT_TRACE4(( "-> new state = %d (supposed)\n" + "but newState index 0x%04x is not aligned to %d-classes\n", + state, newState_idx, 1 + maxClassID )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + } + + switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) ) + { + case GXV_GLYPHOFFSET_NONE: + glyphOffset.uc = 0; /* make compiler happy */ + break; + + case GXV_GLYPHOFFSET_UCHAR: + glyphOffset.uc = FT_NEXT_BYTE( p ); + break; + + case GXV_GLYPHOFFSET_CHAR: + glyphOffset.c = FT_NEXT_CHAR( p ); + break; + + case GXV_GLYPHOFFSET_USHORT: + glyphOffset.u = FT_NEXT_USHORT( p ); + break; + + case GXV_GLYPHOFFSET_SHORT: + glyphOffset.s = FT_NEXT_SHORT( p ); + break; + + case GXV_GLYPHOFFSET_ULONG: + glyphOffset.ul = FT_NEXT_ULONG( p ); + break; + + case GXV_GLYPHOFFSET_LONG: + glyphOffset.l = FT_NEXT_LONG( p ); + break; + + default: + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_FORMAT; + goto Exit; + } + + if ( NULL != valid->xstatetable.entry_validate_func ) + valid->xstatetable.entry_validate_func( state, + flags, + glyphOffset, + xstatetable_table, + xstatetable_limit, + valid ); + } + + Exit: + *length_p = p - table; + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_XStateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + /* StateHeader members */ + FT_ULong classTable; /* offset to Class(Sub)Table */ + FT_ULong stateArray; /* offset to StateArray */ + FT_ULong entryTable; /* offset to EntryTable */ + + FT_ULong classTable_length; + FT_ULong stateArray_length; + FT_ULong entryTable_length; + FT_UShort maxState; + FT_UShort maxEntry; + + GXV_XStateTable_Subtable_Setup_Func setup_func; + + FT_Bytes p = table; + + + GXV_NAME_ENTER( "XStateTable" ); + + GXV_TRACE(( "XStateTable header\n" )); + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); + valid->xstatetable.nClasses = FT_NEXT_ULONG( p ); + classTable = FT_NEXT_ULONG( p ); + stateArray = FT_NEXT_ULONG( p ); + entryTable = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "nClasses =0x%08x\n", valid->xstatetable.nClasses )); + GXV_TRACE(( "offset to classTable=0x%08x\n", classTable )); + GXV_TRACE(( "offset to stateArray=0x%08x\n", stateArray )); + GXV_TRACE(( "offset to entryTable=0x%08x\n", entryTable )); + + if ( valid->xstatetable.nClasses > 0xFFFFU ) + FT_INVALID_DATA; + + GXV_TRACE(( "StateTable Subtables\n" )); + + if ( valid->xstatetable.optdata_load_func != NULL ) + valid->xstatetable.optdata_load_func( p, limit, valid ); + + if ( valid->xstatetable.subtable_setup_func != NULL ) + setup_func = valid->xstatetable.subtable_setup_func; + else + setup_func = gxv_XStateTable_subtable_setup; + + setup_func( limit - table, + classTable, + stateArray, + entryTable, + &classTable_length, + &stateArray_length, + &entryTable_length, + valid ); + + if ( classTable != 0 ) + { + valid->xstatetable.maxClassID = 0; + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_XClassTable_lookupval_validate; + valid->lookupfmt4_trans = gxv_XClassTable_lookupfmt4_transit; + gxv_LookupTable_validate( table + classTable, + table + classTable + classTable_length, + valid ); + if ( valid->subtable_length < classTable_length ) + classTable_length = valid->subtable_length; + } + else + { + /* XXX: check range? */ + valid->xstatetable.maxClassID = + (FT_UShort)( valid->xstatetable.nClasses - 1 ); + } + + if ( stateArray != 0 ) + gxv_XStateArray_validate( table + stateArray, + &stateArray_length, + valid->xstatetable.maxClassID, + valid->xstatetable.nClasses, + &maxState, + &maxEntry, + valid ); + else + { + maxState = 1; /* 0:start of text, 1:start of line are predefined */ + maxEntry = 0; + } + + if ( maxEntry > 0 && entryTable == 0 ) + FT_INVALID_OFFSET; + + if ( entryTable != 0 ) + gxv_XEntryTable_validate( table + entryTable, + &entryTable_length, + maxEntry, + stateArray_length, + valid->xstatetable.maxClassID, + table, + limit, + valid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Table overlapping *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static int + gxv_compare_ranges( FT_Bytes table1_start, + FT_ULong table1_length, + FT_Bytes table2_start, + FT_ULong table2_length ) + { + if ( table1_start == table2_start ) + { + if ( ( table1_length == 0 || table2_length == 0 ) ) + goto Out; + } + else if ( table1_start < table2_start ) + { + if ( ( table1_start + table1_length ) <= table2_start ) + goto Out; + } + else if ( table1_start > table2_start ) + { + if ( ( table1_start >= table2_start + table2_length ) ) + goto Out; + } + return 1; + + Out: + return 0; + } + + + FT_LOCAL_DEF( void ) + gxv_odtect_add_range( FT_Bytes start, + FT_ULong length, + const FT_String* name, + GXV_odtect_Range odtect ) + { + odtect->range[ odtect->nRanges ].start = start; + odtect->range[ odtect->nRanges ].length = length; + odtect->range[ odtect->nRanges ].name = (FT_String*)name; + odtect->nRanges++; + } + + + FT_LOCAL_DEF( void ) + gxv_odtect_validate( GXV_odtect_Range odtect, + GXV_Validator valid ) + { + FT_UInt i, j; + + + GXV_NAME_ENTER( "check overlap among multi ranges" ); + + for ( i = 0; i < odtect->nRanges; i++ ) + for ( j = 0; j < i; j++ ) + if ( 0 != gxv_compare_ranges( odtect->range[i].start, + odtect->range[i].length, + odtect->range[j].start, + odtect->range[j].length ) ) + { + if ( odtect->range[i].name || odtect->range[j].name ) + GXV_TRACE(( "found overlap between range %d and range %d\n", + i, j )); + else + GXV_TRACE(( "found overlap between `%s' and `%s\'\n", + odtect->range[i].name, + odtect->range[j].name )); + FT_INVALID_OFFSET; + } + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvcommn.h b/src/3rdparty/freetype/src/gxvalid/gxvcommn.h new file mode 100644 index 0000000000..198d8e4fc5 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvcommn.h @@ -0,0 +1,560 @@ +/***************************************************************************/ +/* */ +/* gxvcommn.h */ +/* */ +/* TrueTypeGX/AAT common tables validation (specification). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + + /* + * keywords in variable naming + * --------------------------- + * table: Of type FT_Bytes, pointing to the start of this table/subtable. + * limit: Of type FT_Bytes, pointing to the end of this table/subtable, + * including padding for alignment. + * offset: Of type FT_UInt, the number of octets from the start to target. + * length: Of type FT_UInt, the number of octets from the start to the + * end in this table/subtable, including padding for alignment. + * + * _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc. + */ + + +#ifndef __GXVCOMMN_H__ +#define __GXVCOMMN_H__ + + +#include <ft2build.h> +#include "gxvalid.h" +#include FT_INTERNAL_DEBUG_H +#include FT_SFNT_NAMES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALIDATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_ValidatorRec_* GXV_Validator; + + +#define DUMMY_LIMIT 0 + + typedef void + (*GXV_Validate_Func)( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + + /* ====================== LookupTable Validator ======================== */ + + typedef union GXV_LookupValueDesc_ + { + FT_UShort u; + FT_Short s; + + } GXV_LookupValueDesc; + + typedef enum GXV_LookupValue_SignSpec_ + { + GXV_LOOKUPVALUE_UNSIGNED = 0, + GXV_LOOKUPVALUE_SIGNED + + } GXV_LookupValue_SignSpec; + + + typedef void + (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ); + + typedef GXV_LookupValueDesc + (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ); + + + /* ====================== StateTable Validator ========================= */ + + typedef enum GXV_GlyphOffset_Format_ + { + GXV_GLYPHOFFSET_NONE = -1, + GXV_GLYPHOFFSET_UCHAR = 2, + GXV_GLYPHOFFSET_CHAR, + GXV_GLYPHOFFSET_USHORT = 4, + GXV_GLYPHOFFSET_SHORT, + GXV_GLYPHOFFSET_ULONG = 8, + GXV_GLYPHOFFSET_LONG + + } GXV_GlyphOffset_Format; + + +#define GXV_GLYPHOFFSET_FMT( table ) \ + ( valid->table.entry_glyphoffset_fmt ) + +#define GXV_GLYPHOFFSET_SIZE( table ) \ + ( valid->table.entry_glyphoffset_fmt / 2 ) + + + /* ----------------------- 16bit StateTable ---------------------------- */ + + typedef union GXV_StateTable_GlyphOffsetDesc_ + { + FT_Byte uc; + FT_UShort u; /* same as GXV_LookupValueDesc */ + FT_ULong ul; + FT_Char c; + FT_Short s; /* same as GXV_LookupValueDesc */ + FT_Long l; + + } GXV_StateTable_GlyphOffsetDesc; + + + typedef void + (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ); + + typedef void + (*GXV_StateTable_Entry_Validate_Func)( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes statetable_table, + FT_Bytes statetable_limit, + GXV_Validator valid ); + + typedef void + (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + typedef struct GXV_StateTable_ValidatorRec_ + { + GXV_GlyphOffset_Format entry_glyphoffset_fmt; + void* optdata; + + GXV_StateTable_Subtable_Setup_Func subtable_setup_func; + GXV_StateTable_Entry_Validate_Func entry_validate_func; + GXV_StateTable_OptData_Load_Func optdata_load_func; + + } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData; + + + /* ---------------------- 32bit XStateTable ---------------------------- */ + + typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc; + + typedef void + (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ); + + typedef void + (*GXV_XStateTable_Entry_Validate_Func)( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes xstatetable_table, + FT_Bytes xstatetable_limit, + GXV_Validator valid ); + + + typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func; + + + typedef struct GXV_XStateTable_ValidatorRec_ + { + int entry_glyphoffset_fmt; + void* optdata; + + GXV_XStateTable_Subtable_Setup_Func subtable_setup_func; + GXV_XStateTable_Entry_Validate_Func entry_validate_func; + GXV_XStateTable_OptData_Load_Func optdata_load_func; + + FT_ULong nClasses; + FT_UShort maxClassID; + + } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData; + + + /* ===================================================================== */ + + typedef struct GXV_ValidatorRec_ + { + FT_Validator root; + + FT_Face face; + void* table_data; + + FT_ULong subtable_length; + + GXV_LookupValue_SignSpec lookupval_sign; + GXV_Lookup_Value_Validate_Func lookupval_func; + GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans; + FT_Bytes lookuptbl_head; + + GXV_StateTable_ValidatorRec statetable; + GXV_XStateTable_ValidatorRec xstatetable; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt debug_indent; + const FT_String* debug_function_name[3]; +#endif + + } GXV_ValidatorRec; + + +#define GXV_TABLE_DATA( tag, field ) \ + ( ( (GXV_ ## tag ## _Data)valid->table_data )->field ) + +#undef FT_INVALID_ +#define FT_INVALID_( _prefix, _error ) \ + ft_validator_error( valid->root, _prefix ## _error ) + +#define GXV_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( p + _count > ( limit? limit : valid->root->limit ) ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define GXV_INIT valid->debug_indent = 0 + +#define GXV_NAME_ENTER( name ) \ + FT_BEGIN_STMNT \ + valid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4(( "%s table\n", name )); \ + FT_END_STMNT + +#define GXV_EXIT valid->debug_indent -= 2 + +#define GXV_TRACE( s ) \ + FT_BEGIN_STMNT \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4( s ); \ + FT_END_STMNT + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define GXV_INIT do { } while ( 0 ) +#define GXV_NAME_ENTER( name ) do { } while ( 0 ) +#define GXV_EXIT do { } while ( 0 ) + +#define GXV_TRACE( s ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 32bit alignment checking *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \ + FT_BEGIN_STMNT \ + { \ + if ( 0 != ( (a) % 4 ) ) \ + FT_INVALID_OFFSET ; \ + } \ + FT_END_STMNT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Dumping Binary Data *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_TRACE_HEXDUMP( p, len ) \ + FT_BEGIN_STMNT \ + { \ + FT_Bytes b; \ + \ + \ + for ( b = p; b < (FT_Bytes)p + len; b++ ) \ + FT_TRACE1(("\\x%02x", *b)) ; \ + } \ + FT_END_STMNT + +#define GXV_TRACE_HEXDUMP_C( p, len ) \ + FT_BEGIN_STMNT \ + { \ + FT_Bytes b; \ + \ + \ + for ( b = p; b < (FT_Bytes)p + len; b++ ) \ + if ( 0x40 < *b && *b < 0x7e ) \ + FT_TRACE1(("%c", *b)) ; \ + else \ + FT_TRACE1(("\\x%02x", *b)) ; \ + } \ + FT_END_STMNT + +#define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \ + GXV_TRACE_HEXDUMP( n.string, n.string_len ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUP TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_BinSrchHeader_validate( FT_Bytes p, + FT_Bytes limit, + FT_UShort* unitSize_p, + FT_UShort* nUnits_p, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_LookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Glyph ID *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( FT_Int ) + gxv_glyphid_validate( FT_UShort gid, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CONTROL POINT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_ctlPoint_validate( FT_UShort gid, + FT_Short ctl_point, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SFNT NAME *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_sfntName_validate( FT_UShort name_index, + FT_UShort min_index, + FT_UShort max_index, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STATE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_StateTable_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_XStateTable_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_StateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_XStateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY MACROS AND FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_array_getlimits_byte( FT_Bytes table, + FT_Bytes limit, + FT_Byte* min, + FT_Byte* max, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_array_getlimits_ushort( FT_Bytes table, + FT_Bytes limit, + FT_UShort* min, + FT_UShort* max, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_set_length_by_ushort_offset( FT_UShort* offset, + FT_UShort** length, + FT_UShort* buff, + FT_UInt nmemb, + FT_UShort limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_set_length_by_ulong_offset( FT_ULong* offset, + FT_ULong** length, + FT_ULong* buff, + FT_UInt nmemb, + FT_ULong limit, + GXV_Validator valid); + + +#define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \ + FT_BEGIN_STMNT \ + if ( (_offset) > valid->subtable_length ) \ + FT_INVALID_OFFSET; \ + FT_END_STMNT + +#define GXV_SUBTABLE_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( ( p + (_count) - valid->subtable_start ) > \ + valid->subtable_length ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + +#define GXV_USHORT_TO_SHORT( _us ) \ + ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) ) + +#define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 ) +#define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE + +#define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 ) +#define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Table overlapping *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_odtect_DataRec_ + { + FT_Bytes start; + FT_ULong length; + FT_String* name; + + } GXV_odtect_DataRec, *GXV_odtect_Data; + + typedef struct GXV_odtect_RangeRec_ + { + FT_UInt nRanges; + GXV_odtect_Data range; + + } GXV_odtect_RangeRec, *GXV_odtect_Range; + + + FT_LOCAL( void ) + gxv_odtect_add_range( FT_Bytes start, + FT_ULong length, + const FT_String* name, + GXV_odtect_Range odtect ); + + FT_LOCAL( void ) + gxv_odtect_validate( GXV_odtect_Range odtect, + GXV_Validator valid ); + + +#define GXV_ODTECT( n, odtect ) \ + GXV_odtect_DataRec odtect ## _range[n]; \ + GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \ + GXV_odtect_Range odtect = NULL + +#define GXV_ODTECT_INIT( odtect ) \ + FT_BEGIN_STMNT \ + odtect ## _rec.nRanges = 0; \ + odtect ## _rec.range = odtect ## _range; \ + odtect = & odtect ## _rec; \ + FT_END_STMNT + + + /* */ + +FT_END_HEADER + +#endif /* __GXVCOMMN_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxverror.h b/src/3rdparty/freetype/src/gxvalid/gxverror.h new file mode 100644 index 0000000000..0196199227 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxverror.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* gxverror.h */ +/* */ +/* TrueTypeGX/AAT validation module error codes (specification only). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the OpenType validation module error */ + /* enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __GXVERROR_H__ +#define __GXVERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX GXV_Err_ +#define FT_ERR_BASE FT_Mod_Err_GXV + +#define FT_KEEP_ERR_PREFIX + +#include FT_ERRORS_H + +#endif /* __GXVERROR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvfeat.c b/src/3rdparty/freetype/src/gxvalid/gxvfeat.c new file mode 100644 index 0000000000..ad30a764c6 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvfeat.c @@ -0,0 +1,344 @@ +/***************************************************************************/ +/* */ +/* gxvfeat.c */ +/* */ +/* TrueTypeGX/AAT feat table validation (body). */ +/* */ +/* Copyright 2004, 2005, 2008 by */ +/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" +#include "gxvfeat.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvfeat + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_feat_DataRec_ + { + FT_UInt reserved_size; + FT_UShort feature; + FT_UShort setting; + + } GXV_feat_DataRec, *GXV_feat_Data; + + +#define GXV_FEAT_DATA( field ) GXV_TABLE_DATA( feat, field ) + + + typedef enum GXV_FeatureFlagsMask_ + { + GXV_FEAT_MASK_EXCLUSIVE_SETTINGS = 0x8000U, + GXV_FEAT_MASK_DYNAMIC_DEFAULT = 0x4000, + GXV_FEAT_MASK_UNUSED = 0x3F00, + GXV_FEAT_MASK_DEFAULT_SETTING = 0x00FF + + } GXV_FeatureFlagsMask; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_feat_registry_validate( FT_UShort feature, + FT_UShort nSettings, + FT_Bool exclusive, + GXV_Validator valid ) + { + GXV_NAME_ENTER( "feature in registry" ); + + GXV_TRACE(( " (feature = %u)\n", feature )); + + if ( feature >= gxv_feat_registry_length ) + { + GXV_TRACE(( "feature number %d is out of range %d\n", + feature, gxv_feat_registry_length )); + if ( valid->root->level == FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + goto Exit; + } + + if ( gxv_feat_registry[feature].existence == 0 ) + { + GXV_TRACE(( "feature number %d is in defined range but doesn't exist\n", + feature )); + if ( valid->root->level == FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + goto Exit; + } + + if ( gxv_feat_registry[feature].apple_reserved ) + { + /* Don't use here. Apple is reserved. */ + GXV_TRACE(( "feature number %d is reserved by Apple\n", feature )); + if ( valid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + if ( nSettings != gxv_feat_registry[feature].nSettings ) + { + GXV_TRACE(( "feature %d: nSettings %d != defined nSettings %d\n", + feature, nSettings, + gxv_feat_registry[feature].nSettings )); + if ( valid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + if ( exclusive != gxv_feat_registry[feature].exclusive ) + { + GXV_TRACE(( "exclusive flag %d differs from predefined value\n", + exclusive )); + if ( valid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + Exit: + GXV_EXIT; + } + + + static void + gxv_feat_name_index_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + FT_Short nameIndex; + + + GXV_NAME_ENTER( "nameIndex" ); + + GXV_LIMIT_CHECK( 2 ); + nameIndex = FT_NEXT_SHORT ( p ); + GXV_TRACE(( " (nameIndex = %d)\n", nameIndex )); + + gxv_sfntName_validate( (FT_UShort)nameIndex, + 255, + 32768U, + valid ); + + GXV_EXIT; + } + + + static void + gxv_feat_setting_validate( FT_Bytes table, + FT_Bytes limit, + FT_Bool exclusive, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort setting; + + + GXV_NAME_ENTER( "setting" ); + + GXV_LIMIT_CHECK( 2 ); + + setting = FT_NEXT_USHORT( p ); + + /* If we have exclusive setting, the setting should be odd. */ + if ( exclusive && ( setting % 2 ) == 0 ) + FT_INVALID_DATA; + + gxv_feat_name_index_validate( p, limit, valid ); + + GXV_FEAT_DATA( setting ) = setting; + + GXV_EXIT; + } + + + static void + gxv_feat_name_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt reserved_size = GXV_FEAT_DATA( reserved_size ); + + FT_UShort feature; + FT_UShort nSettings; + FT_UInt settingTable; + FT_UShort featureFlags; + + FT_Bool exclusive; + FT_Int last_setting; + FT_UInt i; + + + GXV_NAME_ENTER( "name" ); + + /* feature + nSettings + settingTable + featureFlags */ + GXV_LIMIT_CHECK( 2 + 2 + 4 + 2 ); + + feature = FT_NEXT_USHORT( p ); + GXV_FEAT_DATA( feature ) = feature; + + nSettings = FT_NEXT_USHORT( p ); + settingTable = FT_NEXT_ULONG ( p ); + featureFlags = FT_NEXT_USHORT( p ); + + if ( settingTable < reserved_size ) + FT_INVALID_OFFSET; + + if ( valid->root->level == FT_VALIDATE_PARANOID && + ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 ) + FT_INVALID_DATA; + + exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS ); + if ( exclusive ) + { + FT_Byte dynamic_default; + + + if ( featureFlags & GXV_FEAT_MASK_DYNAMIC_DEFAULT ) + dynamic_default = (FT_Byte)( featureFlags & + GXV_FEAT_MASK_DEFAULT_SETTING ); + else + dynamic_default = 0; + + /* If exclusive, check whether default setting is in the range. */ + if ( !( dynamic_default < nSettings ) ) + FT_INVALID_FORMAT; + } + + gxv_feat_registry_validate( feature, nSettings, exclusive, valid ); + + gxv_feat_name_index_validate( p, limit, valid ); + + p = valid->root->base + settingTable; + for ( last_setting = -1, i = 0; i < nSettings; i++ ) + { + gxv_feat_setting_validate( p, limit, exclusive, valid ); + + if ( valid->root->level == FT_VALIDATE_PARANOID && + (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting ) + FT_INVALID_FORMAT; + + last_setting = (FT_Int)GXV_FEAT_DATA( setting ); + /* setting + nameIndex */ + p += ( 2 + 2 ); + } + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** feat TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_feat_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_feat_DataRec featrec; + GXV_feat_Data feat = &featrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_UInt featureNameCount; + + FT_UInt i; + FT_Int last_feature; + + + valid->root = ftvalid; + valid->table_data = feat; + valid->face = face; + + FT_TRACE3(( "validating `feat' table\n" )); + GXV_INIT; + + feat->reserved_size = 0; + + /* version + featureNameCount + none_0 + none_1 */ + GXV_LIMIT_CHECK( 4 + 2 + 2 + 4 ); + feat->reserved_size += 4 + 2 + 2 + 4; + + if ( FT_NEXT_ULONG( p ) != 0x00010000UL ) /* Version */ + FT_INVALID_FORMAT; + + featureNameCount = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (featureNameCount = %d)\n", featureNameCount )); + + if ( valid->root->level != FT_VALIDATE_PARANOID ) + p += 6; /* skip (none) and (none) */ + else + { + if ( FT_NEXT_USHORT( p ) != 0 ) + FT_INVALID_DATA; + + if ( FT_NEXT_ULONG( p ) != 0 ) + FT_INVALID_DATA; + } + + feat->reserved_size += featureNameCount * ( 2 + 2 + 4 + 2 + 2 ); + + for ( last_feature = -1, i = 0; i < featureNameCount; i++ ) + { + gxv_feat_name_validate( p, limit, valid ); + + if ( valid->root->level == FT_VALIDATE_PARANOID && + (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature ) + FT_INVALID_FORMAT; + + last_feature = GXV_FEAT_DATA( feature ); + p += 2 + 2 + 4 + 2 + 2; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvfeat.h b/src/3rdparty/freetype/src/gxvalid/gxvfeat.h new file mode 100644 index 0000000000..049d23a0b9 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvfeat.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* gxvfeat.h */ +/* */ +/* TrueTypeGX/AAT feat table validation (specification). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVFEAT_H__ +#define __GXVFEAT_H__ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Registry predefined by Apple *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* TODO: More compact format */ + typedef struct GXV_Feature_RegistryRec_ + { + FT_Bool existence; + FT_Bool apple_reserved; + FT_Bool exclusive; + FT_Byte nSettings; + + } GX_Feature_RegistryRec; + + +#define gxv_feat_registry_length \ + ( sizeof ( gxv_feat_registry ) / \ + sizeof ( GX_Feature_RegistryRec ) ) + + + static GX_Feature_RegistryRec gxv_feat_registry[] = + { + /* Generated from gxvfgen.c */ + {1, 0, 0, 1}, /* All Typographic Features */ + {1, 0, 0, 8}, /* Ligatures */ + {1, 0, 1, 3}, /* Cursive Connection */ + {1, 0, 1, 6}, /* Letter Case */ + {1, 0, 0, 1}, /* Vertical Substitution */ + {1, 0, 0, 1}, /* Linguistic Rearrangement */ + {1, 0, 1, 2}, /* Number Spacing */ + {1, 1, 0, 0}, /* Apple Reserved 1 */ + {1, 0, 0, 5}, /* Smart Swashes */ + {1, 0, 1, 3}, /* Diacritics */ + {1, 0, 1, 4}, /* Vertical Position */ + {1, 0, 1, 3}, /* Fractions */ + {1, 1, 0, 0}, /* Apple Reserved 2 */ + {1, 0, 0, 1}, /* Overlapping Characters */ + {1, 0, 0, 6}, /* Typographic Extras */ + {1, 0, 0, 5}, /* Mathematical Extras */ + {1, 0, 1, 7}, /* Ornament Sets */ + {1, 0, 1, 1}, /* Character Alternatives */ + {1, 0, 1, 5}, /* Design Complexity */ + {1, 0, 1, 6}, /* Style Options */ + {1, 0, 1, 11}, /* Character Shape */ + {1, 0, 1, 2}, /* Number Case */ + {1, 0, 1, 4}, /* Text Spacing */ + {1, 0, 1, 10}, /* Transliteration */ + {1, 0, 1, 9}, /* Annotation */ + {1, 0, 1, 2}, /* Kana Spacing */ + {1, 0, 1, 2}, /* Ideographic Spacing */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {1, 0, 1, 4}, /* Text Spacing */ + {1, 0, 1, 2}, /* Kana Spacing */ + {1, 0, 1, 2}, /* Ideographic Spacing */ + {1, 0, 1, 4}, /* CJK Roman Spacing */ + }; + + +#endif /* __GXVFEAT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvfgen.c b/src/3rdparty/freetype/src/gxvalid/gxvfgen.c new file mode 100644 index 0000000000..e48778a2a1 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvfgen.c @@ -0,0 +1,482 @@ +/***************************************************************************/ +/* */ +/* gxfgen.c */ +/* */ +/* Generate feature registry data for gxv `feat' validator. */ +/* This program is derived from gxfeatreg.c in gxlayout. */ +/* */ +/* Copyright 2004, 2005, 2006 by Masatake YAMATO and Redhat K.K. */ +/* */ +/* This file may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxfeatreg.c */ +/* */ +/* Database of font features pre-defined by Apple Computer, Inc. */ +/* http://developer.apple.com/fonts/Registry/ */ +/* (body). */ +/* */ +/* Copyright 2003 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* This file may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* Development of gxfeatreg.c is supported by */ +/* Information-technology Promotion Agency, Japan. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* This file is compiled as a stand-alone executable. */ +/* This file is never compiled into `libfreetype2'. */ +/* The output of this file is used in `gxvfeat.c'. */ +/* ----------------------------------------------------------------------- */ +/* Compile: gcc `pkg-config --cflags freetype2` gxvfgen.c -o gxvfgen */ +/* Run: ./gxvfgen > tmp.c */ +/* */ +/***************************************************************************/ + + /*******************************************************************/ + /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */ + /*******************************************************************/ + + /* + * If you add a new setting to a feature, check the number of settings + * in the feature. If the number is greater than the value defined as + * FEATREG_MAX_SETTING, update the value. + */ +#define FEATREG_MAX_SETTING 12 + + /*******************************************************************/ + /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */ + /*******************************************************************/ + + +#include <stdio.h> +#include <string.h> + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define APPLE_RESERVED "Apple Reserved" +#define APPLE_RESERVED_LENGTH 14 + + typedef struct GX_Feature_RegistryRec_ + { + const char* feat_name; + char exclusive; + char* setting_name[FEATREG_MAX_SETTING]; + + } GX_Feature_RegistryRec; + + +#define EMPTYFEAT {0, 0, {NULL}} + + + static GX_Feature_RegistryRec featreg_table[] = { + { /* 0 */ + "All Typographic Features", + 0, + { + "All Type Features", + NULL + } + }, { /* 1 */ + "Ligatures", + 0, + { + "Required Ligatures", + "Common Ligatures", + "Rare Ligatures", + "Logos", + "Rebus Pictures", + "Diphthong Ligatures", + "Squared Ligatures", + "Squared Ligatures, Abbreviated", + NULL + } + }, { /* 2 */ + "Cursive Connection", + 1, + { + "Unconnected", + "Partially Connected", + "Cursive", + NULL + } + }, { /* 3 */ + "Letter Case", + 1, + { + "Upper & Lower Case", + "All Caps", + "All Lower Case", + "Small Caps", + "Initial Caps", + "Initial Caps & Small Caps", + NULL + } + }, { /* 4 */ + "Vertical Substitution", + 0, + { + /* "Substitute Vertical Forms", */ + "Turns on the feature", + NULL + } + }, { /* 5 */ + "Linguistic Rearrangement", + 0, + { + /* "Linguistic Rearrangement", */ + "Turns on the feature", + NULL + } + }, { /* 6 */ + "Number Spacing", + 1, + { + "Monospaced Numbers", + "Proportional Numbers", + NULL + } + }, { /* 7 */ + APPLE_RESERVED " 1", + 0, + {NULL} + }, { /* 8 */ + "Smart Swashes", + 0, + { + "Word Initial Swashes", + "Word Final Swashes", + "Line Initial Swashes", + "Line Final Swashes", + "Non-Final Swashes", + NULL + } + }, { /* 9 */ + "Diacritics", + 1, + { + "Show Diacritics", + "Hide Diacritics", + "Decompose Diacritics", + NULL + } + }, { /* 10 */ + "Vertical Position", + 1, + { + /* "Normal Position", */ + "No Vertical Position", + "Superiors", + "Inferiors", + "Ordinals", + NULL + } + }, { /* 11 */ + "Fractions", + 1, + { + "No Fractions", + "Vertical Fractions", + "Diagonal Fractions", + NULL + } + }, { /* 12 */ + APPLE_RESERVED " 2", + 0, + {NULL} + }, { /* 13 */ + "Overlapping Characters", + 0, + { + /* "Prevent Overlap", */ + "Turns on the feature", + NULL + } + }, { /* 14 */ + "Typographic Extras", + 0, + { + "Hyphens to Em Dash", + "Hyphens to En Dash", + "Unslashed Zero", + "Form Interrobang", + "Smart Quotes", + "Periods to Ellipsis", + NULL + } + }, { /* 15 */ + "Mathematical Extras", + 0, + { + "Hyphens to Minus", + "Asterisk to Multiply", + "Slash to Divide", + "Inequality Ligatures", + "Exponents", + NULL + } + }, { /* 16 */ + "Ornament Sets", + 1, + { + "No Ornaments", + "Dingbats", + "Pi Characters", + "Fleurons", + "Decorative Borders", + "International Symbols", + "Math Symbols", + NULL + } + }, { /* 17 */ + "Character Alternatives", + 1, + { + "No Alternates", + /* TODO */ + NULL + } + }, { /* 18 */ + "Design Complexity", + 1, + { + "Design Level 1", + "Design Level 2", + "Design Level 3", + "Design Level 4", + "Design Level 5", + /* TODO */ + NULL + } + }, { /* 19 */ + "Style Options", + 1, + { + "No Style Options", + "Display Text", + "Engraved Text", + "Illuminated Caps", + "Tilling Caps", + "Tall Caps", + NULL + } + }, { /* 20 */ + "Character Shape", + 1, + { + "Traditional Characters", + "Simplified Characters", + "JIS 1978 Characters", + "JIS 1983 Characters", + "JIS 1990 Characters", + "Traditional Characters, Alternative Set 1", + "Traditional Characters, Alternative Set 2", + "Traditional Characters, Alternative Set 3", + "Traditional Characters, Alternative Set 4", + "Traditional Characters, Alternative Set 5", + "Expert Characters", + NULL /* count => 12 */ + } + }, { /* 21 */ + "Number Case", + 1, + { + "Lower Case Numbers", + "Upper Case Numbers", + NULL + } + }, { /* 22 */ + "Text Spacing", + 1, + { + "Proportional", + "Monospaced", + "Half-width", + "Normal", + NULL + } + }, /* Here after Newer */ { /* 23 */ + "Transliteration", + 1, + { + "No Transliteration", + "Hanja To Hangul", + "Hiragana to Katakana", + "Katakana to Hiragana", + "Kana to Romanization", + "Romanization to Hiragana", + "Romanization to Katakana", + "Hanja to Hangul, Alternative Set 1", + "Hanja to Hangul, Alternative Set 2", + "Hanja to Hangul, Alternative Set 3", + NULL + } + }, { /* 24 */ + "Annotation", + 1, + { + "No Annotation", + "Box Annotation", + "Rounded Box Annotation", + "Circle Annotation", + "Inverted Circle Annotation", + "Parenthesis Annotation", + "Period Annotation", + "Roman Numeral Annotation", + "Diamond Annotation", + NULL + } + }, { /* 25 */ + "Kana Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 26 */ + "Ideographic Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 27-30 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 31-35 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 36-40 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 40-45 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 46-50 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 51-55 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 56-60 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 61-65 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 66-70 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 71-75 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 76-80 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 81-85 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 86-90 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 91-95 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 96-98 */ + EMPTYFEAT, /* 99 */ { /* 100 => 22 */ + "Text Spacing", + 1, + { + "Proportional", + "Monospaced", + "Half-width", + "Normal", + NULL + } + }, { /* 101 => 25 */ + "Kana Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 102 => 26 */ + "Ideographic Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 103 */ + "CJK Roman Spacing", + 1, + { + "Half-width", + "Proportional", + "Default Roman", + "Full-width Roman", + NULL + } + }, { /* 104 => 1 */ + "All Typographic Features", + 0, + { + "All Type Features", + NULL + } + } + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Generator *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + int + main( void ) + { + int i; + + + printf( " {\n" ); + printf( " /* Generated from %s */\n", __FILE__ ); + + for ( i = 0; + i < sizeof ( featreg_table ) / sizeof ( GX_Feature_RegistryRec ); + i++ ) + { + const char* feat_name; + int nSettings; + + + feat_name = featreg_table[i].feat_name; + for ( nSettings = 0; + featreg_table[i].setting_name[nSettings]; + nSettings++) + ; /* Do nothing */ + + printf( " {%1d, %1d, %1d, %2d}, /* %s */\n", + feat_name ? 1 : 0, + ( feat_name && + ( ft_strncmp( feat_name, + APPLE_RESERVED, APPLE_RESERVED_LENGTH ) == 0 ) + ) ? 1 : 0, + featreg_table[i].exclusive ? 1 : 0, + nSettings, + feat_name ? feat_name : "__EMPTY__" ); + } + + printf( " };\n" ); + + return 0; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvjust.c b/src/3rdparty/freetype/src/gxvalid/gxvjust.c new file mode 100644 index 0000000000..29bf840b57 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvjust.c @@ -0,0 +1,630 @@ +/***************************************************************************/ +/* */ +/* gxvjust.c */ +/* */ +/* TrueTypeGX/AAT just table validation (body). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include FT_SFNT_NAMES_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvjust + + /* + * referred `just' table format specification: + * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6just.html + * last updated 2000. + * ---------------------------------------------- + * [JUST HEADER]: GXV_JUST_HEADER_SIZE + * version (fixed: 32bit) = 0x00010000 + * format (uint16: 16bit) = 0 is only defined (2000) + * horizOffset (uint16: 16bit) + * vertOffset (uint16: 16bit) + * ---------------------------------------------- + */ + + typedef struct GXV_just_DataRec_ + { + FT_UShort wdc_offset_max; + FT_UShort wdc_offset_min; + FT_UShort pc_offset_max; + FT_UShort pc_offset_min; + + } GXV_just_DataRec, *GXV_just_Data; + + +#define GXV_JUST_DATA( a ) GXV_TABLE_DATA( just, a ) + + + static void + gxv_just_wdp_entry_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong justClass; + FT_Fixed beforeGrowLimit; + FT_Fixed beforeShrinkGrowLimit; + FT_Fixed afterGrowLimit; + FT_Fixed afterShrinkGrowLimit; + FT_UShort growFlags; + FT_UShort shrinkFlags; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 + 4 + 2 + 2 ); + justClass = FT_NEXT_ULONG( p ); + beforeGrowLimit = FT_NEXT_ULONG( p ); + beforeShrinkGrowLimit = FT_NEXT_ULONG( p ); + afterGrowLimit = FT_NEXT_ULONG( p ); + afterShrinkGrowLimit = FT_NEXT_ULONG( p ); + growFlags = FT_NEXT_USHORT( p ); + shrinkFlags = FT_NEXT_USHORT( p ); + + /* TODO: decode flags for human readability */ + + valid->subtable_length = p - table; + } + + + static void + gxv_just_wdc_entry_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong count, i; + + + GXV_LIMIT_CHECK( 4 ); + count = FT_NEXT_ULONG( p ); + for ( i = 0; i < count; i++ ) + { + GXV_TRACE(( "validating wdc pair %d/%d\n", i + 1, count )); + gxv_just_wdp_entry_validate( p, limit, valid ); + p += valid->subtable_length; + } + + valid->subtable_length = p - table; + } + + + static void + gxv_just_widthDeltaClusters_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table ; + FT_Bytes wdc_end = table + GXV_JUST_DATA( wdc_offset_max ); + FT_UInt i; + + + GXV_NAME_ENTER( "just justDeltaClusters" ); + + if ( limit <= wdc_end ) + FT_INVALID_OFFSET; + + for ( i = 0; p <= wdc_end; i++ ) + { + gxv_just_wdc_entry_validate( p, limit, valid ); + p += valid->subtable_length; + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_just_actSubrecord_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + FT_Fixed lowerLimit; + FT_Fixed upperLimit; + + FT_UShort order; + FT_UShort decomposedCount; + + FT_UInt i; + + + GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 ); + lowerLimit = FT_NEXT_ULONG( p ); + upperLimit = FT_NEXT_ULONG( p ); + order = FT_NEXT_USHORT( p ); + decomposedCount = FT_NEXT_USHORT( p ); + + for ( i = 0; i < decomposedCount; i++ ) + { + FT_UShort glyphs; + + + GXV_LIMIT_CHECK( 2 ); + glyphs = FT_NEXT_USHORT( p ); + } + + valid->subtable_length = p - table; + } + + + static void + gxv_just_actSubrecord_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort addGlyph; + + + GXV_LIMIT_CHECK( 2 ); + addGlyph = FT_NEXT_USHORT( p ); + + valid->subtable_length = p - table; + } + + + static void + gxv_just_actSubrecord_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Fixed substThreshhold; /* Apple misspelled "Threshhold" */ + FT_UShort addGlyph; + FT_UShort substGlyph; + + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + substThreshhold = FT_NEXT_ULONG( p ); + addGlyph = FT_NEXT_USHORT( p ); + substGlyph = FT_NEXT_USHORT( p ); + + valid->subtable_length = p - table; + } + + + static void + gxv_just_actSubrecord_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong variantsAxis; + FT_Fixed minimumLimit; + FT_Fixed noStretchValue; + FT_Fixed maximumLimit; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); + variantsAxis = FT_NEXT_ULONG( p ); + minimumLimit = FT_NEXT_ULONG( p ); + noStretchValue = FT_NEXT_ULONG( p ); + maximumLimit = FT_NEXT_ULONG( p ); + + valid->subtable_length = p - table; + } + + + static void + gxv_just_actSubrecord_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort flags; + FT_UShort glyph; + + + GXV_LIMIT_CHECK( 2 + 2 ); + flags = FT_NEXT_USHORT( p ); + glyph = FT_NEXT_USHORT( p ); + + valid->subtable_length = p - table; + } + + + /* parse single actSubrecord */ + static void + gxv_just_actSubrecord_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort actionClass; + FT_UShort actionType; + FT_ULong actionLength; + + + GXV_NAME_ENTER( "just actSubrecord" ); + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + actionClass = FT_NEXT_USHORT( p ); + actionType = FT_NEXT_USHORT( p ); + actionLength = FT_NEXT_ULONG( p ); + + if ( actionType == 0 ) + gxv_just_actSubrecord_type0_validate( p, limit, valid ); + else if ( actionType == 1 ) + gxv_just_actSubrecord_type1_validate( p, limit, valid ); + else if ( actionType == 2 ) + gxv_just_actSubrecord_type2_validate( p, limit, valid ); + else if ( actionType == 3 ) + ; /* Stretch glyph action: no actionData */ + else if ( actionType == 4 ) + gxv_just_actSubrecord_type4_validate( p, limit, valid ); + else if ( actionType == 5 ) + gxv_just_actSubrecord_type5_validate( p, limit, valid ); + else + FT_INVALID_DATA; + + valid->subtable_length = actionLength; + + GXV_EXIT; + } + + + static void + gxv_just_pcActionRecord_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong actionCount; + FT_ULong i; + + + GXV_LIMIT_CHECK( 4 ); + actionCount = FT_NEXT_ULONG( p ); + GXV_TRACE(( "actionCount = %d\n", actionCount )); + + for ( i = 0; i < actionCount; i++ ) + { + gxv_just_actSubrecord_validate( p, limit, valid ); + p += valid->subtable_length; + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_just_pcTable_LookupValue_entry_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value.u > GXV_JUST_DATA( pc_offset_max ) ) + GXV_JUST_DATA( pc_offset_max ) = value.u; + if ( value.u < GXV_JUST_DATA( pc_offset_max ) ) + GXV_JUST_DATA( pc_offset_min ) = value.u; + } + + + static void + gxv_just_pcLookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "just pcLookupTable" ); + GXV_JUST_DATA( pc_offset_max ) = 0x0000; + GXV_JUST_DATA( pc_offset_min ) = 0xFFFFU; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_just_pcTable_LookupValue_entry_validate; + + gxv_LookupTable_validate( p, limit, valid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + static void + gxv_just_postcompTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "just postcompTable" ); + + gxv_just_pcLookupTable_validate( p, limit, valid ); + p += valid->subtable_length; + + gxv_just_pcActionRecord_validate( p, limit, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_just_classTable_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setMark; + FT_UShort dontAdvance; + FT_UShort markClass; + FT_UShort currentClass; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + FT_UNUSED( valid ); + + + setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markClass = (FT_UShort)( ( flags >> 7 ) & 0x7F ); + currentClass = (FT_UShort)( flags & 0x7F ); + + /* TODO: validate markClass & currentClass */ + } + + + static void + gxv_just_justClassTable_validate ( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort length; + FT_UShort coverage; + FT_ULong subFeatureFlags; + + + GXV_NAME_ENTER( "just justClassTable" ); + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + subFeatureFlags = FT_NEXT_ULONG( p ); + + GXV_TRACE(( " justClassTable: coverage = 0x%04x (%s)", + coverage, + ( 0x4000 & coverage ) == 0 ? "ascending" : "descending" )); + + valid->statetable.optdata = NULL; + valid->statetable.optdata_load_func = NULL; + valid->statetable.subtable_setup_func = NULL; + valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + valid->statetable.entry_validate_func = + gxv_just_classTable_entry_validate; + + gxv_StateTable_validate( p, table + length, valid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + static void + gxv_just_wdcTable_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value.u > GXV_JUST_DATA( wdc_offset_max ) ) + GXV_JUST_DATA( wdc_offset_max ) = value.u; + if ( value.u < GXV_JUST_DATA( wdc_offset_min ) ) + GXV_JUST_DATA( wdc_offset_min ) = value.u; + } + + + static void + gxv_just_justData_lookuptable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_JUST_DATA( wdc_offset_max ) = 0x0000; + GXV_JUST_DATA( wdc_offset_min ) = 0xFFFFU; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_just_wdcTable_LookupValue_validate; + + gxv_LookupTable_validate( p, limit, valid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + /* + * gxv_just_justData_validate() parses and validates horizData, vertData. + */ + static void + gxv_just_justData_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + /* + * following 3 offsets are measured from the start of `just' + * (which table points to), not justData + */ + FT_UShort justClassTableOffset; + FT_UShort wdcTableOffset; + FT_UShort pcTableOffset; + FT_Bytes p = table; + + GXV_ODTECT( 4, odtect ); + + + GXV_NAME_ENTER( "just justData" ); + + GXV_ODTECT_INIT( odtect ); + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + justClassTableOffset = FT_NEXT_USHORT( p ); + wdcTableOffset = FT_NEXT_USHORT( p ); + pcTableOffset = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (justClassTableOffset = 0x%04x)\n", justClassTableOffset )); + GXV_TRACE(( " (wdcTableOffset = 0x%04x)\n", wdcTableOffset )); + GXV_TRACE(( " (pcTableOffset = 0x%04x)\n", pcTableOffset )); + + gxv_just_justData_lookuptable_validate( p, limit, valid ); + gxv_odtect_add_range( p, valid->subtable_length, + "just_LookupTable", odtect ); + + if ( wdcTableOffset ) + { + gxv_just_widthDeltaClusters_validate( + valid->root->base + wdcTableOffset, limit, valid ); + gxv_odtect_add_range( valid->root->base + wdcTableOffset, + valid->subtable_length, "just_wdcTable", odtect ); + } + + if ( pcTableOffset ) + { + gxv_just_postcompTable_validate( valid->root->base + pcTableOffset, + limit, valid ); + gxv_odtect_add_range( valid->root->base + pcTableOffset, + valid->subtable_length, "just_pcTable", odtect ); + } + + if ( justClassTableOffset ) + { + gxv_just_justClassTable_validate( + valid->root->base + justClassTableOffset, limit, valid ); + gxv_odtect_add_range( valid->root->base + justClassTableOffset, + valid->subtable_length, "just_justClassTable", + odtect ); + } + + gxv_odtect_validate( odtect, valid ); + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_just_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_UInt table_size; + + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + GXV_just_DataRec justrec; + GXV_just_Data just = &justrec; + + FT_ULong version; + FT_UShort format; + FT_UShort horizOffset; + FT_UShort vertOffset; + + GXV_ODTECT( 3, odtect ); + + + GXV_ODTECT_INIT( odtect ); + + valid->root = ftvalid; + valid->table_data = just; + valid->face = face; + + FT_TRACE3(( "validating `just' table\n" )); + GXV_INIT; + + limit = valid->root->limit; + table_size = limit - table; + + GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + horizOffset = FT_NEXT_USHORT( p ); + vertOffset = FT_NEXT_USHORT( p ); + gxv_odtect_add_range( table, p - table, "just header", odtect ); + + + /* Version 1.0 (always:2000) */ + GXV_TRACE(( " (version = 0x%08x)\n", version )); + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* format 0 (always:2000) */ + GXV_TRACE(( " (format = 0x%04x)\n", format )); + if ( format != 0x0000 ) + FT_INVALID_FORMAT; + + GXV_TRACE(( " (horizOffset = %d)\n", horizOffset )); + GXV_TRACE(( " (vertOffset = %d)\n", vertOffset )); + + + /* validate justData */ + if ( 0 < horizOffset ) + { + gxv_just_justData_validate( table + horizOffset, limit, valid ); + gxv_odtect_add_range( table + horizOffset, valid->subtable_length, + "horizJustData", odtect ); + } + + if ( 0 < vertOffset ) + { + gxv_just_justData_validate( table + vertOffset, limit, valid ); + gxv_odtect_add_range( table + vertOffset, valid->subtable_length, + "vertJustData", odtect ); + } + + gxv_odtect_validate( odtect, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvkern.c b/src/3rdparty/freetype/src/gxvalid/gxvkern.c new file mode 100644 index 0000000000..bfb405f65b --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvkern.c @@ -0,0 +1,876 @@ +/***************************************************************************/ +/* */ +/* gxvkern.c */ +/* */ +/* TrueTypeGX/AAT kern table validation (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 */ +/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include FT_SFNT_NAMES_H +#include FT_SERVICE_GX_VALIDATE_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvkern + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef enum GXV_kern_Version_ + { + KERN_VERSION_CLASSIC = 0x0000, + KERN_VERSION_NEW = 0x0001 + + } GXV_kern_Version; + + + typedef enum GXV_kern_Dialect_ + { + KERN_DIALECT_UNKNOWN = 0, + KERN_DIALECT_MS = FT_VALIDATE_MS, + KERN_DIALECT_APPLE = FT_VALIDATE_APPLE, + KERN_DIALECT_ANY = FT_VALIDATE_CKERN + + } GXV_kern_Dialect; + + + typedef struct GXV_kern_DataRec_ + { + GXV_kern_Version version; + void *subtable_data; + GXV_kern_Dialect dialect_request; + + } GXV_kern_DataRec, *GXV_kern_Data; + + +#define GXV_KERN_DATA( field ) GXV_TABLE_DATA( kern, field ) + +#define KERN_IS_CLASSIC( valid ) \ + ( KERN_VERSION_CLASSIC == GXV_KERN_DATA( version ) ) +#define KERN_IS_NEW( valid ) \ + ( KERN_VERSION_NEW == GXV_KERN_DATA( version ) ) + +#define KERN_DIALECT( valid ) \ + GXV_KERN_DATA( dialect_request ) +#define KERN_ALLOWS_MS( valid ) \ + ( KERN_DIALECT( valid ) & KERN_DIALECT_MS ) +#define KERN_ALLOWS_APPLE( valid ) \ + ( KERN_DIALECT( valid ) & KERN_DIALECT_APPLE ) + +#define GXV_KERN_HEADER_SIZE ( KERN_IS_NEW( valid ) ? 8 : 4 ) +#define GXV_KERN_SUBTABLE_HEADER_SIZE ( KERN_IS_NEW( valid ) ? 8 : 6 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SUBTABLE VALIDATORS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* ============================= format 0 ============================== */ + + static void + gxv_kern_subtable_fmt0_pairs_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nPairs, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + FT_UShort last_gid_left = 0; + FT_UShort last_gid_right = 0; + + FT_UNUSED( limit ); + + + GXV_NAME_ENTER( "kern format 0 pairs" ); + + for ( i = 0; i < nPairs; i++ ) + { + FT_UShort gid_left; + FT_UShort gid_right; + FT_Short kernValue; + + + /* left */ + gid_left = FT_NEXT_USHORT( p ); + gxv_glyphid_validate( gid_left, valid ); + + /* right */ + gid_right = FT_NEXT_USHORT( p ); + gxv_glyphid_validate( gid_right, valid ); + + /* Pairs of left and right GIDs must be unique and sorted. */ + GXV_TRACE(( "left gid = %u, right gid = %u\n", gid_left, gid_right )); + if ( gid_left == last_gid_left ) + { + if ( last_gid_right < gid_right ) + last_gid_right = gid_right; + else + FT_INVALID_DATA; + } + else if ( last_gid_left < gid_left ) + { + last_gid_left = gid_left; + last_gid_right = gid_right; + } + else + FT_INVALID_DATA; + + /* skip the kern value */ + kernValue = FT_NEXT_SHORT( p ); + } + + GXV_EXIT; + } + + static void + gxv_kern_subtable_fmt0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + + FT_UShort nPairs; + FT_UShort unitSize; + + + GXV_NAME_ENTER( "kern subtable format 0" ); + + unitSize = 2 + 2 + 2; + nPairs = 0; + + /* nPairs, searchRange, entrySelector, rangeShift */ + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nPairs, valid ); + p += 2 + 2 + 2 + 2; + + gxv_kern_subtable_fmt0_pairs_validate( p, limit, nPairs, valid ); + + GXV_EXIT; + } + + + /* ============================= format 1 ============================== */ + + + typedef struct GXV_kern_fmt1_StateOptRec_ + { + FT_UShort valueTable; + FT_UShort valueTable_length; + + } GXV_kern_fmt1_StateOptRec, *GXV_kern_fmt1_StateOptRecData; + + + static void + gxv_kern_subtable_fmt1_valueTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + GXV_kern_fmt1_StateOptRecData optdata = + (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->valueTable = FT_NEXT_USHORT( p ); + } + + + /* + * passed tables_size covers whole StateTable, including kern fmt1 header + */ + static void + gxv_kern_subtable_fmt1_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ) + { + FT_UShort o[4]; + FT_UShort *l[4]; + FT_UShort buff[5]; + + GXV_kern_fmt1_StateOptRecData optdata = + (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->valueTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->valueTable_length); + + gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid ); + } + + + /* + * passed table & limit are of whole StateTable, not including subtables + */ + static void + gxv_kern_subtable_fmt1_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort push; + FT_UShort dontAdvance; + FT_UShort valueOffset; + FT_UShort kernAction; + FT_UShort kernValue; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset ); + + + push = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + valueOffset = (FT_UShort)( flags & 0x3FFF ); + + { + GXV_kern_fmt1_StateOptRecData vt_rec = + (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata; + FT_Bytes p; + + + if ( valueOffset < vt_rec->valueTable ) + FT_INVALID_OFFSET; + + p = table + valueOffset; + limit = table + vt_rec->valueTable + vt_rec->valueTable_length; + + GXV_LIMIT_CHECK( 2 + 2 ); + kernAction = FT_NEXT_USHORT( p ); + kernValue = FT_NEXT_USHORT( p ); + } + } + + + static void + gxv_kern_subtable_fmt1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + GXV_kern_fmt1_StateOptRec vt_rec; + + + GXV_NAME_ENTER( "kern subtable format 1" ); + + valid->statetable.optdata = + &vt_rec; + valid->statetable.optdata_load_func = + gxv_kern_subtable_fmt1_valueTable_load; + valid->statetable.subtable_setup_func = + gxv_kern_subtable_fmt1_subtable_setup; + valid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_NONE; + valid->statetable.entry_validate_func = + gxv_kern_subtable_fmt1_entry_validate; + + gxv_StateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + + /* ================ Data for Class-Based Subtables 2, 3 ================ */ + + typedef enum GXV_kern_ClassSpec_ + { + GXV_KERN_CLS_L = 0, + GXV_KERN_CLS_R + + } GXV_kern_ClassSpec; + + + /* ============================= format 2 ============================== */ + + /* ---------------------- format 2 specific data ----------------------- */ + + typedef struct GXV_kern_subtable_fmt2_DataRec_ + { + FT_UShort rowWidth; + FT_UShort array; + FT_UShort offset_min[2]; + FT_UShort offset_max[2]; + const FT_String* class_tag[2]; + GXV_odtect_Range odtect; + + } GXV_kern_subtable_fmt2_DataRec, *GXV_kern_subtable_fmt2_Data; + + +#define GXV_KERN_FMT2_DATA( field ) \ + ( ( (GXV_kern_subtable_fmt2_DataRec *) \ + ( GXV_KERN_DATA( subtable_data ) ) )->field ) + + + /* -------------------------- utility functions ----------------------- */ + + static void + gxv_kern_subtable_fmt2_clstbl_validate( FT_Bytes table, + FT_Bytes limit, + GXV_kern_ClassSpec spec, + GXV_Validator valid ) + { + const FT_String* tag = GXV_KERN_FMT2_DATA( class_tag[spec] ); + GXV_odtect_Range odtect = GXV_KERN_FMT2_DATA( odtect ); + + FT_Bytes p = table; + FT_UShort firstGlyph; + FT_UShort nGlyphs; + + + GXV_NAME_ENTER( "kern format 2 classTable" ); + + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + nGlyphs = FT_NEXT_USHORT( p ); + GXV_TRACE(( " %s firstGlyph=%d, nGlyphs=%d\n", + tag, firstGlyph, nGlyphs )); + + gxv_glyphid_validate( firstGlyph, valid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), valid ); + + gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ), + &( GXV_KERN_FMT2_DATA( offset_min[spec] ) ), + &( GXV_KERN_FMT2_DATA( offset_max[spec] ) ), + valid ); + + gxv_odtect_add_range( table, 2 * nGlyphs, tag, odtect ); + + GXV_EXIT; + } + + + static void + gxv_kern_subtable_fmt2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + GXV_ODTECT( 3, odtect ); + GXV_kern_subtable_fmt2_DataRec fmt2_rec = + { 0, 0, { 0, 0 }, { 0, 0 }, { "leftClass", "rightClass" }, NULL }; + + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + FT_UShort leftOffsetTable; + FT_UShort rightOffsetTable; + + + GXV_NAME_ENTER( "kern subtable format 2" ); + + GXV_ODTECT_INIT( odtect ); + fmt2_rec.odtect = odtect; + GXV_KERN_DATA( subtable_data ) = &fmt2_rec; + + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + GXV_KERN_FMT2_DATA( rowWidth ) = FT_NEXT_USHORT( p ); + leftOffsetTable = FT_NEXT_USHORT( p ); + rightOffsetTable = FT_NEXT_USHORT( p ); + GXV_KERN_FMT2_DATA( array ) = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "rowWidth = %d\n", GXV_KERN_FMT2_DATA( rowWidth ) )); + + + GXV_LIMIT_CHECK( leftOffsetTable ); + GXV_LIMIT_CHECK( rightOffsetTable ); + GXV_LIMIT_CHECK( GXV_KERN_FMT2_DATA( array ) ); + + gxv_kern_subtable_fmt2_clstbl_validate( table + leftOffsetTable, limit, + GXV_KERN_CLS_L, valid ); + + gxv_kern_subtable_fmt2_clstbl_validate( table + rightOffsetTable, limit, + GXV_KERN_CLS_R, valid ); + + if ( GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_L] ) + + GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_R] ) + < GXV_KERN_FMT2_DATA( array ) ) + FT_INVALID_OFFSET; + + gxv_odtect_add_range( table + GXV_KERN_FMT2_DATA( array ), + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_L] ) + + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_R] ) + - GXV_KERN_FMT2_DATA( array ), + "array", odtect ); + + gxv_odtect_validate( odtect, valid ); + + GXV_EXIT; + } + + + /* ============================= format 3 ============================== */ + + static void + gxv_kern_subtable_fmt3_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + FT_UShort glyphCount; + FT_Byte kernValueCount; + FT_Byte leftClassCount; + FT_Byte rightClassCount; + FT_Byte flags; + + + GXV_NAME_ENTER( "kern subtable format 3" ); + + GXV_LIMIT_CHECK( 2 + 1 + 1 + 1 + 1 ); + glyphCount = FT_NEXT_USHORT( p ); + kernValueCount = FT_NEXT_BYTE( p ); + leftClassCount = FT_NEXT_BYTE( p ); + rightClassCount = FT_NEXT_BYTE( p ); + flags = FT_NEXT_BYTE( p ); + + if ( valid->face->num_glyphs != glyphCount ) + { + GXV_TRACE(( "maxGID=%d, but glyphCount=%d\n", + valid->face->num_glyphs, glyphCount )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + + /* + * just skip kernValue[kernValueCount] + */ + GXV_LIMIT_CHECK( 2 * kernValueCount ); + p += 2 * kernValueCount; + + /* + * check leftClass[gid] < leftClassCount + */ + { + FT_Byte min, max; + + + GXV_LIMIT_CHECK( glyphCount ); + gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid ); + p += valid->subtable_length; + + if ( leftClassCount < max ) + FT_INVALID_DATA; + } + + /* + * check rightClass[gid] < rightClassCount + */ + { + FT_Byte min, max; + + + GXV_LIMIT_CHECK( glyphCount ); + gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid ); + p += valid->subtable_length; + + if ( rightClassCount < max ) + FT_INVALID_DATA; + } + + /* + * check kernIndex[i, j] < kernValueCount + */ + { + FT_UShort i, j; + + + for ( i = 0; i < leftClassCount; i++ ) + { + for ( j = 0; j < rightClassCount; j++ ) + { + GXV_LIMIT_CHECK( 1 ); + if ( kernValueCount < FT_NEXT_BYTE( p ) ) + FT_INVALID_OFFSET; + } + } + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static FT_Bool + gxv_kern_coverage_new_apple_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator valid ) + { + /* new Apple-dialect */ + FT_Bool kernVertical; + FT_Bool kernCrossStream; + FT_Bool kernVariation; + + FT_UNUSED( valid ); + + + /* reserved bits = 0 */ + if ( coverage & 0x1FFC ) + return 0; + + kernVertical = FT_BOOL( ( coverage >> 15 ) & 1 ); + kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 ); + kernVariation = FT_BOOL( ( coverage >> 13 ) & 1 ); + + *format = (FT_UShort)( coverage & 0x0003 ); + + GXV_TRACE(( "new Apple-dialect: " + "horizontal=%d, cross-stream=%d, variation=%d, format=%d\n", + !kernVertical, kernCrossStream, kernVariation, *format )); + + GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" )); + + return 1; + } + + + static FT_Bool + gxv_kern_coverage_classic_apple_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator valid ) + { + /* classic Apple-dialect */ + FT_Bool horizontal; + FT_Bool cross_stream; + + + /* check expected flags, but don't check if MS-dialect is impossible */ + if ( !( coverage & 0xFD00 ) && KERN_ALLOWS_MS( valid ) ) + return 0; + + /* reserved bits = 0 */ + if ( coverage & 0x02FC ) + return 0; + + horizontal = FT_BOOL( ( coverage >> 15 ) & 1 ); + cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 ); + + *format = (FT_UShort)( coverage & 0x0003 ); + + GXV_TRACE(( "classic Apple-dialect: " + "horizontal=%d, cross-stream=%d, format=%d\n", + horizontal, cross_stream, *format )); + + /* format 1 requires GX State Machine, too new for classic */ + if ( *format == 1 ) + return 0; + + GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" )); + + return 1; + } + + + static FT_Bool + gxv_kern_coverage_classic_microsoft_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator valid ) + { + /* classic Microsoft-dialect */ + FT_Bool horizontal; + FT_Bool minimum; + FT_Bool cross_stream; + FT_Bool override; + + FT_UNUSED( valid ); + + + /* reserved bits = 0 */ + if ( coverage & 0xFDF0 ) + return 0; + + horizontal = FT_BOOL( coverage & 1 ); + minimum = FT_BOOL( ( coverage >> 1 ) & 1 ); + cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 ); + override = FT_BOOL( ( coverage >> 3 ) & 1 ); + + *format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 ); + + GXV_TRACE(( "classic Microsoft-dialect: " + "horizontal=%d, minimum=%d, cross-stream=%d, " + "override=%d, format=%d\n", + horizontal, minimum, cross_stream, override, *format )); + + if ( *format == 2 ) + GXV_TRACE(( + "kerning values in Microsoft format 2 subtable are ignored\n" )); + + return 1; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MAIN *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static GXV_kern_Dialect + gxv_kern_coverage_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator valid ) + { + GXV_kern_Dialect result = KERN_DIALECT_UNKNOWN; + + + GXV_NAME_ENTER( "validating coverage" ); + + GXV_TRACE(( "interprete coverage 0x%04x by Apple style\n", coverage )); + + if ( KERN_IS_NEW( valid ) ) + { + if ( gxv_kern_coverage_new_apple_validate( coverage, + format, + valid ) ) + { + result = KERN_DIALECT_APPLE; + goto Exit; + } + } + + if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_APPLE( valid ) ) + { + if ( gxv_kern_coverage_classic_apple_validate( coverage, + format, + valid ) ) + { + result = KERN_DIALECT_APPLE; + goto Exit; + } + } + + if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_MS( valid ) ) + { + if ( gxv_kern_coverage_classic_microsoft_validate( coverage, + format, + valid ) ) + { + result = KERN_DIALECT_MS; + goto Exit; + } + } + + GXV_TRACE(( "cannot interprete coverage, broken kern subtable\n" )); + + Exit: + GXV_EXIT; + return result; + } + + + static void + gxv_kern_subtable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort version = 0; /* MS only: subtable version, unused */ + FT_ULong length; /* MS: 16bit, Apple: 32bit*/ + FT_UShort coverage; + FT_UShort tupleIndex = 0; /* Apple only */ + FT_UShort u16[2]; + FT_UShort format = 255; /* subtable format */ + + + GXV_NAME_ENTER( "kern subtable" ); + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + u16[0] = FT_NEXT_USHORT( p ); /* Apple: length_hi MS: version */ + u16[1] = FT_NEXT_USHORT( p ); /* Apple: length_lo MS: length */ + coverage = FT_NEXT_USHORT( p ); + + switch ( gxv_kern_coverage_validate( coverage, &format, valid ) ) + { + case KERN_DIALECT_MS: + version = u16[0]; + length = u16[1]; + tupleIndex = 0; + GXV_TRACE(( "Subtable version = %d\n", version )); + GXV_TRACE(( "Subtable length = %d\n", length )); + break; + + case KERN_DIALECT_APPLE: + version = 0; + length = ( u16[0] << 16 ) + u16[1]; + tupleIndex = 0; + GXV_TRACE(( "Subtable length = %d\n", length )); + + if ( KERN_IS_NEW( valid ) ) + { + GXV_LIMIT_CHECK( 2 ); + tupleIndex = FT_NEXT_USHORT( p ); + GXV_TRACE(( "Subtable tupleIndex = %d\n", tupleIndex )); + } + break; + + default: + length = u16[1]; + GXV_TRACE(( "cannot detect subtable dialect, " + "just skip %d byte\n", length )); + goto Exit; + } + + /* formats 1, 2, 3 require the position of the start of this subtable */ + if ( format == 0 ) + gxv_kern_subtable_fmt0_validate( table, table + length, valid ); + else if ( format == 1 ) + gxv_kern_subtable_fmt1_validate( table, table + length, valid ); + else if ( format == 2 ) + gxv_kern_subtable_fmt2_validate( table, table + length, valid ); + else if ( format == 3 ) + gxv_kern_subtable_fmt3_validate( table, table + length, valid ); + else + FT_INVALID_DATA; + + Exit: + valid->subtable_length = length; + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** kern TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_kern_validate_generic( FT_Bytes table, + FT_Face face, + FT_Bool classic_only, + GXV_kern_Dialect dialect_request, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_kern_DataRec kernrec; + GXV_kern_Data kern = &kernrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong nTables = 0; + FT_UInt i; + + + valid->root = ftvalid; + valid->table_data = kern; + valid->face = face; + + FT_TRACE3(( "validating `kern' table\n" )); + GXV_INIT; + KERN_DIALECT( valid ) = dialect_request; + + GXV_LIMIT_CHECK( 2 ); + GXV_KERN_DATA( version ) = (GXV_kern_Version)FT_NEXT_USHORT( p ); + GXV_TRACE(( "version 0x%04x (higher 16bit)\n", + GXV_KERN_DATA( version ) )); + + if ( 0x0001 < GXV_KERN_DATA( version ) ) + FT_INVALID_FORMAT; + else if ( KERN_IS_CLASSIC( valid ) ) + { + GXV_LIMIT_CHECK( 2 ); + nTables = FT_NEXT_USHORT( p ); + } + else if ( KERN_IS_NEW( valid ) ) + { + if ( classic_only ) + FT_INVALID_FORMAT; + + if ( 0x0000 != FT_NEXT_USHORT( p ) ) + FT_INVALID_FORMAT; + + GXV_LIMIT_CHECK( 4 ); + nTables = FT_NEXT_ULONG( p ); + } + + for ( i = 0; i < nTables; i++ ) + { + GXV_TRACE(( "validating subtable %d/%d\n", i, nTables )); + /* p should be 32bit-aligned? */ + gxv_kern_subtable_validate( p, 0, valid ); + p += valid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + + FT_LOCAL_DEF( void ) + gxv_kern_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + gxv_kern_validate_generic( table, face, 0, KERN_DIALECT_ANY, ftvalid ); + } + + + FT_LOCAL_DEF( void ) + gxv_kern_validate_classic( FT_Bytes table, + FT_Face face, + FT_Int dialect_flags, + FT_Validator ftvalid ) + { + GXV_kern_Dialect dialect_request; + + + dialect_request = (GXV_kern_Dialect)dialect_flags; + gxv_kern_validate_generic( table, face, 1, dialect_request, ftvalid ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvlcar.c b/src/3rdparty/freetype/src/gxvalid/gxvlcar.c new file mode 100644 index 0000000000..48821ea879 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvlcar.c @@ -0,0 +1,223 @@ +/***************************************************************************/ +/* */ +/* gxvlcar.c */ +/* */ +/* TrueTypeGX/AAT lcar table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvlcar + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_lcar_DataRec_ + { + FT_UShort format; + + } GXV_lcar_DataRec, *GXV_lcar_Data; + + +#define GXV_LCAR_DATA( FIELD ) GXV_TABLE_DATA( lcar, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_lcar_partial_validate( FT_UShort partial, + FT_UShort glyph, + GXV_Validator valid ) + { + GXV_NAME_ENTER( "partial" ); + + if ( GXV_LCAR_DATA( format ) != 1 ) + goto Exit; + + gxv_ctlPoint_validate( glyph, partial, valid ); + + Exit: + GXV_EXIT; + } + + + static void + gxv_lcar_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + FT_Bytes p = valid->root->base + value.u; + FT_Bytes limit = valid->root->limit; + FT_UShort count; + FT_Short partial; + FT_UShort i; + + + GXV_NAME_ENTER( "element in lookupTable" ); + + GXV_LIMIT_CHECK( 2 ); + count = FT_NEXT_USHORT( p ); + + GXV_LIMIT_CHECK( 2 * count ); + for ( i = 0; i < count; i++ ) + { + partial = FT_NEXT_SHORT( p ); + gxv_lcar_partial_validate( partial, glyph, valid ); + } + + GXV_EXIT; + } + + + /* + +------ lcar --------------------+ + | | + | +===============+ | + | | looup header | | + | +===============+ | + | | BinSrchHeader | | + | +===============+ | + | | lastGlyph[0] | | + | +---------------+ | + | | firstGlyph[0] | | head of lcar sfnt table + | +---------------+ | + + | | offset[0] | -> | offset [byte] + | +===============+ | + + | | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + | +---------------+ | + | | firstGlyph[1] | | + | +---------------+ | + | | offset[1] | | + | +===============+ | + | | + | .... | + | | + | 16bit value array | + | +===============+ | + +------| value | <-------+ + | .... + | + | + | + | + | + +----> lcar values...handled by lcar callback function + */ + + static GXV_LookupValueDesc + gxv_lcar_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + FT_UNUSED( lookuptbl_limit ); + + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof ( FT_UShort ) ); + p = valid->root->base + offset; + limit = valid->root->limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** lcar TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_lcar_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_lcar_DataRec lcarrec; + GXV_lcar_Data lcar = &lcarrec; + + FT_Fixed version; + + + valid->root = ftvalid; + valid->table_data = lcar; + valid->face = face; + + FT_TRACE3(( "validating `lcar' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 ); + version = FT_NEXT_ULONG( p ); + GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p ); + + if ( version != 0x00010000UL) + FT_INVALID_FORMAT; + + if ( GXV_LCAR_DATA( format ) > 1 ) + FT_INVALID_FORMAT; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_lcar_LookupValue_validate; + valid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit; + gxv_LookupTable_validate( p, limit, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmod.c b/src/3rdparty/freetype/src/gxvalid/gxvmod.c new file mode 100644 index 0000000000..b2b16b1ff3 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmod.c @@ -0,0 +1,285 @@ +/***************************************************************************/ +/* */ +/* gxvmod.c */ +/* */ +/* FreeType's TrueTypeGX/AAT validation module implementation (body). */ +/* */ +/* Copyright 2004, 2005, 2006 */ +/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H +#include FT_GX_VALIDATE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_GX_VALIDATE_H + +#include "gxvmod.h" +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmodule + + + static FT_Error + gxv_load_table( FT_Face face, + FT_Tag tag, + FT_Byte* volatile* table, + FT_ULong* table_len ) + { + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len ); + if ( error == GXV_Err_Table_Missing ) + return GXV_Err_Ok; + if ( error ) + goto Exit; + + if ( FT_ALLOC( *table, *table_len ) ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len ); + + Exit: + return error; + } + + +#define GXV_TABLE_DECL( _sfnt ) \ + FT_Byte* volatile _sfnt = NULL; \ + FT_ULong len_ ## _sfnt = 0 + +#define GXV_TABLE_LOAD( _sfnt ) \ + if ( ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) && \ + ( gx_flags & FT_VALIDATE_ ## _sfnt ) ) \ + { \ + error = gxv_load_table( face, TTAG_ ## _sfnt, \ + &_sfnt, &len_ ## _sfnt ); \ + if ( error ) \ + goto Exit; \ + } + +#define GXV_TABLE_VALIDATE( _sfnt ) \ + if ( _sfnt ) \ + { \ + ft_validator_init( &valid, _sfnt, _sfnt + len_ ## _sfnt, \ + FT_VALIDATE_DEFAULT ); \ + if ( ft_setjmp( valid.jump_buffer ) == 0 ) \ + gxv_ ## _sfnt ## _validate( _sfnt, face, &valid ); \ + error = valid.error; \ + if ( error ) \ + goto Exit; \ + } + +#define GXV_TABLE_SET( _sfnt ) \ + if ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) \ + tables[FT_VALIDATE_ ## _sfnt ## _INDEX] = (FT_Bytes)_sfnt + + + static FT_Error + gxv_validate( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_count ) + { + FT_Memory volatile memory = FT_FACE_MEMORY( face ); + + FT_Error error = GXV_Err_Ok; + FT_ValidatorRec volatile valid; + + FT_UInt i; + + + GXV_TABLE_DECL( feat ); + GXV_TABLE_DECL( bsln ); + GXV_TABLE_DECL( trak ); + GXV_TABLE_DECL( just ); + GXV_TABLE_DECL( mort ); + GXV_TABLE_DECL( morx ); + GXV_TABLE_DECL( kern ); + GXV_TABLE_DECL( opbd ); + GXV_TABLE_DECL( prop ); + GXV_TABLE_DECL( lcar ); + + for ( i = 0; i < table_count; i++ ) + tables[i] = 0; + + /* load tables */ + GXV_TABLE_LOAD( feat ); + GXV_TABLE_LOAD( bsln ); + GXV_TABLE_LOAD( trak ); + GXV_TABLE_LOAD( just ); + GXV_TABLE_LOAD( mort ); + GXV_TABLE_LOAD( morx ); + GXV_TABLE_LOAD( kern ); + GXV_TABLE_LOAD( opbd ); + GXV_TABLE_LOAD( prop ); + GXV_TABLE_LOAD( lcar ); + + /* validate tables */ + GXV_TABLE_VALIDATE( feat ); + GXV_TABLE_VALIDATE( bsln ); + GXV_TABLE_VALIDATE( trak ); + GXV_TABLE_VALIDATE( just ); + GXV_TABLE_VALIDATE( mort ); + GXV_TABLE_VALIDATE( morx ); + GXV_TABLE_VALIDATE( kern ); + GXV_TABLE_VALIDATE( opbd ); + GXV_TABLE_VALIDATE( prop ); + GXV_TABLE_VALIDATE( lcar ); + + /* Set results */ + GXV_TABLE_SET( feat ); + GXV_TABLE_SET( mort ); + GXV_TABLE_SET( morx ); + GXV_TABLE_SET( bsln ); + GXV_TABLE_SET( just ); + GXV_TABLE_SET( kern ); + GXV_TABLE_SET( opbd ); + GXV_TABLE_SET( trak ); + GXV_TABLE_SET( prop ); + GXV_TABLE_SET( lcar ); + + Exit: + if ( error ) + { + FT_FREE( feat ); + FT_FREE( bsln ); + FT_FREE( trak ); + FT_FREE( just ); + FT_FREE( mort ); + FT_FREE( morx ); + FT_FREE( kern ); + FT_FREE( opbd ); + FT_FREE( prop ); + FT_FREE( lcar ); + } + + return error; + } + + + static FT_Error + classic_kern_validate( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes* ckern_table ) + { + FT_Memory volatile memory = FT_FACE_MEMORY( face ); + + FT_Byte* volatile ckern = NULL; + FT_ULong len_ckern = 0; + + /* without volatile on `error' GCC 4.1.1. emits: */ + /* warning: variable 'error' might be clobbered by 'longjmp' or 'vfork' */ + /* this warning seems spurious but --- */ + FT_Error volatile error = GXV_Err_Ok; + FT_ValidatorRec volatile valid; + + + *ckern_table = NULL; + + error = gxv_load_table( face, TTAG_kern, &ckern, &len_ckern ); + if ( error ) + goto Exit; + + if ( ckern ) + { + ft_validator_init( &valid, ckern, ckern + len_ckern, + FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + gxv_kern_validate_classic( ckern, face, + ckern_flags & FT_VALIDATE_CKERN, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + *ckern_table = ckern; + + Exit: + if ( error ) + FT_FREE( ckern ); + + return error; + } + + + static + const FT_Service_GXvalidateRec gxvalid_interface = + { + gxv_validate + }; + + + static + const FT_Service_CKERNvalidateRec ckernvalid_interface = + { + classic_kern_validate + }; + + + static + const FT_ServiceDescRec gxvalid_services[] = + { + { FT_SERVICE_ID_GX_VALIDATE, &gxvalid_interface }, + { FT_SERVICE_ID_CLASSICKERN_VALIDATE, &ckernvalid_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + gxvalid_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( gxvalid_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class gxv_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "gxvalid", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) gxvalid_get_service + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmod.h b/src/3rdparty/freetype/src/gxvalid/gxvmod.h new file mode 100644 index 0000000000..466584ef4f --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmod.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* gxvmod.h */ +/* */ +/* FreeType's TrueTypeGX/AAT validation module implementation */ +/* (specification). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVMOD_H__ +#define __GXVMOD_H__ + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Module_Class ) gxv_module_class; + + +FT_END_HEADER + +#endif /* __GXVMOD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort.c b/src/3rdparty/freetype/src/gxvalid/gxvmort.c new file mode 100644 index 0000000000..f4fbd30e41 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort.c @@ -0,0 +1,285 @@ +/***************************************************************************/ +/* */ +/* gxvmort.c */ +/* */ +/* TrueTypeGX/AAT mort table validation (body). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" +#include "gxvfeat.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + static void + gxv_mort_feature_validate( GXV_mort_feature f, + GXV_Validator valid ) + { + if ( f->featureType >= gxv_feat_registry_length ) + { + GXV_TRACE(( "featureType %d is out of registered range, " + "setting %d is unchecked\n", + f->featureType, f->featureSetting )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + else if ( !gxv_feat_registry[f->featureType].existence ) + { + GXV_TRACE(( "featureType %d is within registered area " + "but undefined, setting %d is unchecked\n", + f->featureType, f->featureSetting )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + else + { + FT_Byte nSettings_max; + + + /* nSettings in gxvfeat.c is halved for exclusive on/off settings */ + nSettings_max = gxv_feat_registry[f->featureType].nSettings; + if ( gxv_feat_registry[f->featureType].exclusive ) + nSettings_max = (FT_Byte)( 2 * nSettings_max ); + + GXV_TRACE(( "featureType %d is registered", f->featureType )); + GXV_TRACE(( "setting %d", f->featureSetting )); + + if ( f->featureSetting > nSettings_max ) + { + GXV_TRACE(( "out of defined range %d", nSettings_max )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + GXV_TRACE(( "\n" )); + } + + /* TODO: enableFlags must be unique value in specified chain? */ + } + + + /* + * nFeatureFlags is typed to FT_UInt to accept that in + * mort (typed FT_UShort) and morx (typed FT_ULong). + */ + FT_LOCAL_DEF( void ) + gxv_mort_featurearray_validate( FT_Bytes table, + FT_Bytes limit, + FT_UInt nFeatureFlags, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt i; + + GXV_mort_featureRec f = GXV_MORT_FEATURE_OFF; + + + GXV_NAME_ENTER( "mort feature list" ); + for ( i = 0; i < nFeatureFlags; i++ ) + { + GXV_LIMIT_CHECK( 2 + 2 + 4 + 4 ); + f.featureType = FT_NEXT_USHORT( p ); + f.featureSetting = FT_NEXT_USHORT( p ); + f.enableFlags = FT_NEXT_ULONG( p ); + f.disableFlags = FT_NEXT_ULONG( p ); + + gxv_mort_feature_validate( &f, valid ); + } + + if ( !IS_GXV_MORT_FEATURE_OFF( f ) ) + FT_INVALID_DATA; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_coverage_validate( FT_UShort coverage, + GXV_Validator valid ) + { + FT_UNUSED( valid ); + + if ( coverage & 0x8000U ) + GXV_TRACE(( " this subtable is for vertical text only\n" )); + else + GXV_TRACE(( " this subtable is for horizontal text only\n" )); + + if ( coverage & 0x4000 ) + GXV_TRACE(( " this subtable is applied to glyph array " + "in descending order\n" )); + else + GXV_TRACE(( " this subtable is applied to glyph array " + "in ascending order\n" )); + + if ( coverage & 0x2000 ) + GXV_TRACE(( " this subtable is forcibly applied to " + "vertical/horizontal text\n" )); + + if ( coverage & 0x1FF8 ) + GXV_TRACE(( " coverage has non-zero bits in reserved area\n" )); + } + + + static void + gxv_mort_subtables_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nSubtables, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_mort_subtable_type0_validate, /* 0 */ + gxv_mort_subtable_type1_validate, /* 1 */ + gxv_mort_subtable_type2_validate, /* 2 */ + NULL, /* 3 */ + gxv_mort_subtable_type4_validate, /* 4 */ + gxv_mort_subtable_type5_validate, /* 5 */ + + }; + + GXV_Validate_Func func; + FT_UShort i; + + + GXV_NAME_ENTER( "subtables in a chain" ); + + for ( i = 0; i < nSubtables; i++ ) + { + FT_UShort length; + FT_UShort coverage; + FT_ULong subFeatureFlags; + FT_UInt type; + FT_UInt rest; + + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + subFeatureFlags = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n", + i + 1, nSubtables, length )); + type = coverage & 0x0007; + rest = length - ( 2 + 2 + 4 ); + + GXV_LIMIT_CHECK( rest ); + gxv_mort_coverage_validate( coverage, valid ); + + if ( type > 5 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[type]; + if ( func == NULL ) + GXV_TRACE(( "morx type %d is reserved\n", type )); + + func( p, p + rest, valid ); + + p += rest; + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_mort_chain_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong defaultFlags; + FT_ULong chainLength; + FT_UShort nFeatureFlags; + FT_UShort nSubtables; + + + GXV_NAME_ENTER( "mort chain header" ); + + GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 ); + defaultFlags = FT_NEXT_ULONG( p ); + chainLength = FT_NEXT_ULONG( p ); + nFeatureFlags = FT_NEXT_USHORT( p ); + nSubtables = FT_NEXT_USHORT( p ); + + gxv_mort_featurearray_validate( p, table + chainLength, + nFeatureFlags, valid ); + p += valid->subtable_length; + gxv_mort_subtables_validate( p, table + chainLength, nSubtables, valid ); + valid->subtable_length = chainLength; + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_ULong version; + FT_ULong nChains; + FT_ULong i; + + + valid->root = ftvalid; + valid->face = face; + limit = valid->root->limit; + + FT_TRACE3(( "validating `mort' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 4 ); + version = FT_NEXT_ULONG( p ); + nChains = FT_NEXT_ULONG( p ); + + if (version != 0x00010000UL) + FT_INVALID_FORMAT; + + for ( i = 0; i < nChains; i++ ) + { + GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains )); + GXV_32BIT_ALIGNMENT_VALIDATE( p - table ); + gxv_mort_chain_validate( p, limit, valid ); + p += valid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort.h b/src/3rdparty/freetype/src/gxvalid/gxvmort.h new file mode 100644 index 0000000000..1d64e69c47 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort.h @@ -0,0 +1,93 @@ +/***************************************************************************/ +/* */ +/* gxvmort.h */ +/* */ +/* TrueTypeGX/AAT common definition for mort table (specification). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVMORT_H__ +#define __GXVMORT_H__ + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include FT_SFNT_NAMES_H + + + typedef struct GXV_mort_featureRec_ + { + FT_UShort featureType; + FT_UShort featureSetting; + FT_ULong enableFlags; + FT_ULong disableFlags; + + } GXV_mort_featureRec, *GXV_mort_feature; + +#define GXV_MORT_FEATURE_OFF {0, 1, 0x00000000UL, 0x00000000UL} + +#define IS_GXV_MORT_FEATURE_OFF( f ) \ + ( (f).featureType == 0 || \ + (f).featureSetting == 1 || \ + (f).enableFlags == 0x00000000UL || \ + (f).disableFlags == 0x00000000UL ) + + + FT_LOCAL( void ) + gxv_mort_featurearray_validate( FT_Bytes table, + FT_Bytes limit, + FT_UInt nFeatureFlags, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_coverage_validate( FT_UShort coverage, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + +#endif /* __GXVMORT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort0.c b/src/3rdparty/freetype/src/gxvalid/gxvmort0.c new file mode 100644 index 0000000000..0902056c62 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort0.c @@ -0,0 +1,137 @@ +/***************************************************************************/ +/* */ +/* gxvmort0.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type0 (Indic Script Rearrangement) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + static const char* GXV_Mort_IndicScript_Msg[] = + { + "no change", + "Ax => xA", + "xD => Dx", + "AxD => DxA", + "ABx => xAB", + "ABx => xBA", + "xCD => CDx", + "xCD => DCx", + "AxCD => CDxA", + "AxCD => DCxA", + "ABxD => DxAB", + "ABxD => DxBA", + "ABxCD => CDxAB", + "ABxCD => CDxBA", + "ABxCD => DCxAB", + "ABxCD => DCxBA", + + }; + + + static void + gxv_mort_subtable_type0_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort markFirst; + FT_UShort dontAdvance; + FT_UShort markLast; + FT_UShort reserved; + FT_UShort verb = 0; + + FT_UNUSED( state ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */ + FT_UNUSED( glyphOffset ); /* case */ + + + markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FF0 ); + verb = (FT_UShort)( flags & 0x000F ); + + GXV_TRACE(( " IndicScript MorphRule for glyphOffset 0x%04x", + glyphOffset.u )); + GXV_TRACE(( " markFirst=%01d", markFirst )); + GXV_TRACE(( " dontAdvance=%01d", dontAdvance )); + GXV_TRACE(( " markLast=%01d", markLast )); + GXV_TRACE(( " %02d", verb )); + GXV_TRACE(( " %s\n", GXV_Mort_IndicScript_Msg[verb] )); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + FT_INVALID_DATA; + } + else + GXV_TRACE(( "\n" )); + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( + "mort chain subtable type0 (Indic-Script Rearrangement)" ); + + GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE ); + + valid->statetable.optdata = NULL; + valid->statetable.optdata_load_func = NULL; + valid->statetable.subtable_setup_func = NULL; + valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + valid->statetable.entry_validate_func = + gxv_mort_subtable_type0_entry_validate; + + gxv_StateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort1.c b/src/3rdparty/freetype/src/gxvalid/gxvmort1.c new file mode 100644 index 0000000000..711bbd0baa --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort1.c @@ -0,0 +1,258 @@ +/***************************************************************************/ +/* */ +/* gxvmort1.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type1 (Contextual Substitution) subtable. */ +/* */ +/* Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + typedef struct GXV_mort_subtable_type1_StateOptRec_ + { + FT_UShort substitutionTable; + FT_UShort substitutionTable_length; + + } GXV_mort_subtable_type1_StateOptRec, + *GXV_mort_subtable_type1_StateOptRecData; + +#define GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 ) + + + static void + gxv_mort_subtable_type1_substitutionTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type1_StateOptRecData optdata = + (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->substitutionTable = FT_NEXT_USHORT( p ); + } + + + static void + gxv_mort_subtable_type1_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ) + { + FT_UShort o[4]; + FT_UShort *l[4]; + FT_UShort buff[5]; + + GXV_mort_subtable_type1_StateOptRecData optdata = + (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->substitutionTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &( optdata->substitutionTable_length ); + + gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid ); + } + + + static void + gxv_mort_subtable_type1_offset_to_subst_validate( + FT_Short wordOffset, + const FT_String* tag, + FT_Byte state, + GXV_Validator valid ) + { + FT_UShort substTable; + FT_UShort substTable_limit; + FT_UShort min_gid; + FT_UShort max_gid; + + FT_UNUSED( tag ); + FT_UNUSED( state ); + + + substTable = + ((GXV_mort_subtable_type1_StateOptRec *) + (valid->statetable.optdata))->substitutionTable; + substTable_limit = + (FT_UShort)( substTable + + ((GXV_mort_subtable_type1_StateOptRec *) + (valid->statetable.optdata))->substitutionTable_length ); + + min_gid = (FT_UShort)( ( substTable - wordOffset * 2 ) / 2 ); + max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 ); + max_gid = (FT_UShort)( FT_MAX( max_gid, valid->face->num_glyphs ) ); + + /* XXX: check range? */ + + /* TODO: min_gid & max_gid comparison with ClassTable contents */ + } + + + static void + gxv_mort_subtable_type1_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setMark; + FT_UShort dontAdvance; + FT_UShort reserved; + FT_Short markOffset; + FT_Short currentOffset; + + FT_UNUSED( table ); + FT_UNUSED( limit ); + + + setMark = (FT_UShort)( flags >> 15 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + reserved = (FT_Short)( flags & 0x3FFF ); + + markOffset = (FT_Short)( glyphOffset.ul >> 16 ); + currentOffset = (FT_Short)( glyphOffset.ul ); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + + gxv_mort_subtable_type1_offset_to_subst_validate( markOffset, + "markOffset", + state, + valid ); + + gxv_mort_subtable_type1_offset_to_subst_validate( currentOffset, + "currentOffset", + state, + valid ); + } + + + static void + gxv_mort_subtable_type1_substTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort num_gids = (FT_UShort)( + ((GXV_mort_subtable_type1_StateOptRec *) + (valid->statetable.optdata))->substitutionTable_length / 2 ); + FT_UShort i; + + + GXV_NAME_ENTER( "validating contents of substitutionTable" ); + for ( i = 0; i < num_gids ; i ++ ) + { + FT_UShort dst_gid; + + + GXV_LIMIT_CHECK( 2 ); + dst_gid = FT_NEXT_USHORT( p ); + + if ( dst_gid >= 0xFFFFU ) + continue; + + if ( dst_gid > valid->face->num_glyphs ) + { + GXV_TRACE(( "substTable include too large gid[%d]=%d >" + " max defined gid #%d\n", + i, dst_gid, valid->face->num_glyphs )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + } + + GXV_EXIT; + } + + + /* + * subtable for Contextual glyph substitution is a modified StateTable. + * In addition to classTable, stateArray, and entryTable, the field + * `substitutionTable' is added. + */ + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type1_StateOptRec st_rec; + + + GXV_NAME_ENTER( "mort chain subtable type1 (Contextual Glyph Subst)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE ); + + valid->statetable.optdata = + &st_rec; + valid->statetable.optdata_load_func = + gxv_mort_subtable_type1_substitutionTable_load; + valid->statetable.subtable_setup_func = + gxv_mort_subtable_type1_subtable_setup; + valid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->statetable.entry_validate_func = + + gxv_mort_subtable_type1_entry_validate; + gxv_StateTable_validate( p, limit, valid ); + + gxv_mort_subtable_type1_substTable_validate( + table + st_rec.substitutionTable, + table + st_rec.substitutionTable + st_rec.substitutionTable_length, + valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort2.c b/src/3rdparty/freetype/src/gxvalid/gxvmort2.c new file mode 100644 index 0000000000..f19d15dab5 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort2.c @@ -0,0 +1,282 @@ +/***************************************************************************/ +/* */ +/* gxvmort2.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type2 (Ligature Substitution) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + typedef struct GXV_mort_subtable_type2_StateOptRec_ + { + FT_UShort ligActionTable; + FT_UShort componentTable; + FT_UShort ligatureTable; + FT_UShort ligActionTable_length; + FT_UShort componentTable_length; + FT_UShort ligatureTable_length; + + } GXV_mort_subtable_type2_StateOptRec, + *GXV_mort_subtable_type2_StateOptRecData; + +#define GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 + 2 + 2 ) + + + static void + gxv_mort_subtable_type2_opttable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + optdata->ligActionTable = FT_NEXT_USHORT( p ); + optdata->componentTable = FT_NEXT_USHORT( p ); + optdata->ligatureTable = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "offset to ligActionTable=0x%04x\n", + optdata->ligActionTable )); + GXV_TRACE(( "offset to componentTable=0x%04x\n", + optdata->componentTable )); + GXV_TRACE(( "offset to ligatureTable=0x%04x\n", + optdata->ligatureTable )); + } + + + static void + gxv_mort_subtable_type2_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort *classTable_length_p, + FT_UShort *stateArray_length_p, + FT_UShort *entryTable_length_p, + GXV_Validator valid ) + { + FT_UShort o[6]; + FT_UShort *l[6]; + FT_UShort buff[7]; + + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata; + + + GXV_NAME_ENTER( "subtable boundaries setup" ); + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->ligActionTable; + o[4] = optdata->componentTable; + o[5] = optdata->ligatureTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->ligActionTable_length); + l[4] = &(optdata->componentTable_length); + l[5] = &(optdata->ligatureTable_length); + + gxv_set_length_by_ushort_offset( o, l, buff, 6, table_size, valid ); + + GXV_TRACE(( "classTable: offset=0x%04x length=0x%04x\n", + classTable, *classTable_length_p )); + GXV_TRACE(( "stateArray: offset=0x%04x length=0x%04x\n", + stateArray, *stateArray_length_p )); + GXV_TRACE(( "entryTable: offset=0x%04x length=0x%04x\n", + entryTable, *entryTable_length_p )); + GXV_TRACE(( "ligActionTable: offset=0x%04x length=0x%04x\n", + optdata->ligActionTable, + optdata->ligActionTable_length )); + GXV_TRACE(( "componentTable: offset=0x%04x length=0x%04x\n", + optdata->componentTable, + optdata->componentTable_length )); + GXV_TRACE(( "ligatureTable: offset=0x%04x length=0x%04x\n", + optdata->ligatureTable, + optdata->ligatureTable_length )); + + GXV_EXIT; + } + + + static void + gxv_mort_subtable_type2_ligActionOffset_validate( + FT_Bytes table, + FT_UShort ligActionOffset, + GXV_Validator valid ) + { + /* access ligActionTable */ + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata; + + FT_Bytes lat_base = table + optdata->ligActionTable; + FT_Bytes p = table + ligActionOffset; + FT_Bytes lat_limit = lat_base + optdata->ligActionTable; + + + GXV_32BIT_ALIGNMENT_VALIDATE( ligActionOffset ); + if ( p < lat_base ) + { + GXV_TRACE(( "too short offset 0x%04x: p < lat_base (%d byte rewind)\n", + ligActionOffset, lat_base - p )); + + /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */ + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + } + else if ( lat_limit < p ) + { + GXV_TRACE(( "too large offset 0x%04x: lat_limit < p (%d byte overrun)\n", + ligActionOffset, p - lat_limit )); + + /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */ + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + } + else + { + /* validate entry in ligActionTable */ + FT_ULong lig_action; + FT_UShort last; + FT_UShort store; + FT_ULong offset; + + + lig_action = FT_NEXT_ULONG( p ); + last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); + store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); + + offset = lig_action & 0x3FFFFFFFUL; + } + } + + + static void + gxv_mort_subtable_type2_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setComponent; + FT_UShort dontAdvance; + FT_UShort offset; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset ); + FT_UNUSED( limit ); + + + setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + + offset = (FT_UShort)( flags & 0x3FFFU ); + + if ( 0 < offset ) + gxv_mort_subtable_type2_ligActionOffset_validate( table, offset, + valid ); + } + + + static void + gxv_mort_subtable_type2_ligatureTable_validate( FT_Bytes table, + GXV_Validator valid ) + { + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata; + + FT_Bytes p = table + optdata->ligatureTable; + FT_Bytes limit = table + optdata->ligatureTable + + optdata->ligatureTable_length; + + + GXV_NAME_ENTER( "mort chain subtable type2 - substitutionTable" ); + if ( 0 != optdata->ligatureTable ) + { + /* Apple does not give specification of ligatureTable format */ + while ( p < limit ) + { + FT_UShort lig_gid; + + + GXV_LIMIT_CHECK( 2 ); + lig_gid = FT_NEXT_USHORT( p ); + } + } + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type2_StateOptRec lig_rec; + + + GXV_NAME_ENTER( "mort chain subtable type2 (Ligature Substitution)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE ); + + valid->statetable.optdata = + &lig_rec; + valid->statetable.optdata_load_func = + gxv_mort_subtable_type2_opttable_load; + valid->statetable.subtable_setup_func = + gxv_mort_subtable_type2_subtable_setup; + valid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_NONE; + valid->statetable.entry_validate_func = + gxv_mort_subtable_type2_entry_validate; + + gxv_StateTable_validate( p, limit, valid ); + + p += valid->subtable_length; + gxv_mort_subtable_type2_ligatureTable_validate( table, valid ); + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort4.c b/src/3rdparty/freetype/src/gxvalid/gxvmort4.c new file mode 100644 index 0000000000..a04bc1efaf --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort4.c @@ -0,0 +1,125 @@ +/***************************************************************************/ +/* */ +/* gxvmort4.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type4 (Non-Contextual Glyph Substitution) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + static void + gxv_mort_subtable_type4_lookupval_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + gxv_glyphid_validate( value.u, valid ); + } + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 16bit value array | + +===============+ | + | value | <-------+ + .... + */ + + static GXV_LookupValueDesc + gxv_mort_subtable_type4_lookupfmt4_transit( + FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "mort chain subtable type4 " + "(Non-Contextual Glyph Substitution)" ); + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_mort_subtable_type4_lookupval_validate; + valid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit; + + gxv_LookupTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort5.c b/src/3rdparty/freetype/src/gxvalid/gxvmort5.c new file mode 100644 index 0000000000..a7cabc359f --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmort5.c @@ -0,0 +1,226 @@ +/***************************************************************************/ +/* */ +/* gxvmort5.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type5 (Contextual Glyph Insertion) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + /* + * mort subtable type5 (Contextual Glyph Insertion) + * has the format of StateTable with insertion-glyph-list, + * but without name. The offset is given by glyphOffset in + * entryTable. There is no table location declaration + * like xxxTable. + */ + + typedef struct GXV_mort_subtable_type5_StateOptRec_ + { + FT_UShort classTable; + FT_UShort stateArray; + FT_UShort entryTable; + +#define GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE GXV_STATETABLE_HEADER_SIZE + + FT_UShort* classTable_length_p; + FT_UShort* stateArray_length_p; + FT_UShort* entryTable_length_p; + + } GXV_mort_subtable_type5_StateOptRec, + *GXV_mort_subtable_type5_StateOptRecData; + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type5_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ) + { + GXV_mort_subtable_type5_StateOptRecData optdata = + (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata; + + + gxv_StateTable_subtable_setup( table_size, + classTable, + stateArray, + entryTable, + classTable_length_p, + stateArray_length_p, + entryTable_length_p, + valid ); + + optdata->classTable = classTable; + optdata->stateArray = stateArray; + optdata->entryTable = entryTable; + + optdata->classTable_length_p = classTable_length_p; + optdata->stateArray_length_p = stateArray_length_p; + optdata->entryTable_length_p = entryTable_length_p; + } + + + static void + gxv_mort_subtable_type5_InsertList_validate( FT_UShort offset, + FT_UShort count, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + /* + * We don't know the range of insertion-glyph-list. + * Set range by whole of state table. + */ + FT_Bytes p = table + offset; + + GXV_mort_subtable_type5_StateOptRecData optdata = + (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata; + + if ( optdata->classTable < offset && + offset < optdata->classTable + *(optdata->classTable_length_p) ) + GXV_TRACE(( " offset runs into ClassTable" )); + if ( optdata->stateArray < offset && + offset < optdata->stateArray + *(optdata->stateArray_length_p) ) + GXV_TRACE(( " offset runs into StateArray" )); + if ( optdata->entryTable < offset && + offset < optdata->entryTable + *(optdata->entryTable_length_p) ) + GXV_TRACE(( " offset runs into EntryTable" )); + + while ( p < table + offset + ( count * 2 ) ) + { + FT_UShort insert_glyphID; + + + GXV_LIMIT_CHECK( 2 ); + insert_glyphID = FT_NEXT_USHORT( p ); + GXV_TRACE(( " 0x%04x", insert_glyphID )); + } + + GXV_TRACE(( "\n" )); + } + + + static void + gxv_mort_subtable_type5_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bool setMark; + FT_Bool dontAdvance; + FT_Bool currentIsKashidaLike; + FT_Bool markedIsKashidaLike; + FT_Bool currentInsertBefore; + FT_Bool markedInsertBefore; + FT_Byte currentInsertCount; + FT_Byte markedInsertCount; + FT_UShort currentInsertList; + FT_UShort markedInsertList; + + FT_UNUSED( state ); + + + setMark = FT_BOOL( ( flags >> 15 ) & 1 ); + dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); + currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); + markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); + currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); + markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); + + currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); + markedInsertCount = (FT_Byte)( flags & 0x001F ); + + currentInsertList = (FT_UShort)( glyphOffset.ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset.ul ); + + if ( 0 != currentInsertList && 0 != currentInsertCount ) + { + gxv_mort_subtable_type5_InsertList_validate( currentInsertList, + currentInsertCount, + table, + limit, + valid ); + } + + if ( 0 != markedInsertList && 0 != markedInsertCount ) + { + gxv_mort_subtable_type5_InsertList_validate( markedInsertList, + markedInsertCount, + table, + limit, + valid ); + } + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type5_StateOptRec et_rec; + GXV_mort_subtable_type5_StateOptRecData et = &et_rec; + + + GXV_NAME_ENTER( "mort chain subtable type5 (Glyph Insertion)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE ); + + valid->statetable.optdata = + et; + valid->statetable.optdata_load_func = + NULL; + valid->statetable.subtable_setup_func = + gxv_mort_subtable_type5_subtable_setup; + valid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->statetable.entry_validate_func = + gxv_mort_subtable_type5_entry_validate; + + gxv_StateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx.c new file mode 100644 index 0000000000..d217940eab --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx.c @@ -0,0 +1,184 @@ +/***************************************************************************/ +/* */ +/* gxvmorx.c */ +/* */ +/* TrueTypeGX/AAT morx table validation (body). */ +/* */ +/* Copyright 2005, 2008 by */ +/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + static void + gxv_morx_subtables_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nSubtables, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_morx_subtable_type0_validate, /* 0 */ + gxv_morx_subtable_type1_validate, /* 1 */ + gxv_morx_subtable_type2_validate, /* 2 */ + NULL, /* 3 */ + gxv_morx_subtable_type4_validate, /* 4 */ + gxv_morx_subtable_type5_validate, /* 5 */ + + }; + + GXV_Validate_Func func; + + FT_UShort i; + + + GXV_NAME_ENTER( "subtables in a chain" ); + + for ( i = 0; i < nSubtables; i++ ) + { + FT_ULong length; + FT_ULong coverage; + FT_ULong subFeatureFlags; + FT_UInt type; + FT_UInt rest; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 ); + length = FT_NEXT_ULONG( p ); + coverage = FT_NEXT_ULONG( p ); + subFeatureFlags = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n", + i + 1, nSubtables, length )); + + type = coverage & 0x0007; + rest = length - ( 4 + 4 + 4 ); + GXV_LIMIT_CHECK( rest ); + + /* morx coverage consists of mort_coverage & 16bit padding */ + gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ), + valid ); + if ( type > 5 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[type]; + if ( func == NULL ) + GXV_TRACE(( "morx type %d is reserved\n", type )); + + func( p, p + rest, valid ); + + p += rest; + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_morx_chain_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong defaultFlags; + FT_ULong chainLength; + FT_ULong nFeatureFlags; + FT_ULong nSubtables; + + + GXV_NAME_ENTER( "morx chain header" ); + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); + defaultFlags = FT_NEXT_ULONG( p ); + chainLength = FT_NEXT_ULONG( p ); + nFeatureFlags = FT_NEXT_ULONG( p ); + nSubtables = FT_NEXT_ULONG( p ); + + /* feature-array of morx is same with that of mort */ + gxv_mort_featurearray_validate( p, limit, nFeatureFlags, valid ); + p += valid->subtable_length; + + if ( nSubtables >= 0x10000L ) + FT_INVALID_DATA; + + gxv_morx_subtables_validate( p, table + chainLength, + (FT_UShort)nSubtables, valid ); + + valid->subtable_length = chainLength; + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_morx_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_ULong version; + FT_ULong nChains; + FT_ULong i; + + + valid->root = ftvalid; + valid->face = face; + + FT_TRACE3(( "validating `morx' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 4 ); + version = FT_NEXT_ULONG( p ); + nChains = FT_NEXT_ULONG( p ); + + if ( version != 0x00020000UL ) + FT_INVALID_FORMAT; + + for ( i = 0; i < nChains; i++ ) + { + GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains )); + GXV_32BIT_ALIGNMENT_VALIDATE( p - table ); + gxv_morx_chain_validate( p, limit, valid ); + p += valid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx.h b/src/3rdparty/freetype/src/gxvalid/gxvmorx.h new file mode 100644 index 0000000000..28c1a44f6f --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* gxvmorx.h */ +/* */ +/* TrueTypeGX/AAT common definition for morx table (specification). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVMORX_H__ +#define __GXVMORX_H__ + + +#include "gxvalid.h" +#include "gxvcommn.h" +#include "gxvmort.h" + +#include FT_SFNT_NAMES_H + + + FT_LOCAL( void ) + gxv_morx_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + +#endif /* __GXVMORX_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c new file mode 100644 index 0000000000..ca92b6c392 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c @@ -0,0 +1,103 @@ +/***************************************************************************/ +/* */ +/* gxvmorx0.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for type0 (Indic Script Rearrangement) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + static void + gxv_morx_subtable_type0_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_XStateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort markFirst; + FT_UShort dontAdvance; + FT_UShort markLast; + FT_UShort reserved; + FT_UShort verb; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + + markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FF0 ); + verb = (FT_UShort)( flags & 0x000F ); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + FT_INVALID_DATA; + } + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( + "morx chain subtable type0 (Indic-Script Rearrangement)" ); + + GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE ); + + valid->xstatetable.optdata = NULL; + valid->xstatetable.optdata_load_func = NULL; + valid->xstatetable.subtable_setup_func = NULL; + valid->xstatetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type0_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c new file mode 100644 index 0000000000..331d4ccdab --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* gxvmorx1.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for type1 (Contextual Substitution) subtable. */ +/* */ +/* Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + typedef struct GXV_morx_subtable_type1_StateOptRec_ + { + FT_ULong substitutionTable; + FT_ULong substitutionTable_length; + FT_UShort substitutionTable_num_lookupTables; + + } GXV_morx_subtable_type1_StateOptRec, + *GXV_morx_subtable_type1_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 ) + + + static void + gxv_morx_subtable_type1_substitutionTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->substitutionTable = FT_NEXT_USHORT( p ); + } + + + static void + gxv_morx_subtable_type1_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ) + { + FT_ULong o[4]; + FT_ULong *l[4]; + FT_ULong buff[5]; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->substitutionTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->substitutionTable_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid ); + } + + + static void + gxv_morx_subtable_type1_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setMark; + FT_UShort dontAdvance; + FT_UShort reserved; + FT_Short markIndex; + FT_Short currentIndex; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + FT_UNUSED( state ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + + setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x3FFF ); + + markIndex = (FT_Short)( glyphOffset.ul >> 16 ); + currentIndex = (FT_Short)( glyphOffset.ul ); + + GXV_TRACE(( " setMark=%01d dontAdvance=%01d\n", + setMark, dontAdvance )); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + + GXV_TRACE(( "markIndex = %d, currentIndex = %d\n", + markIndex, currentIndex )); + + if ( optdata->substitutionTable_num_lookupTables < markIndex + 1 ) + optdata->substitutionTable_num_lookupTables = + (FT_Short)( markIndex + 1 ); + + if ( optdata->substitutionTable_num_lookupTables < currentIndex + 1 ) + optdata->substitutionTable_num_lookupTables = + (FT_Short)( currentIndex + 1 ); + } + + + static void + gxv_morx_subtable_type1_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); /* for the non-debugging case */ + + GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value.u )); + + if ( value.u > valid->face->num_glyphs ) + FT_INVALID_GLYPH_ID; + } + + + static GXV_LookupValueDesc + gxv_morx_subtable_type1_LookupFmt4_transit( + FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /* + * TODO: length should be limit? + **/ + static void + gxv_morx_subtable_type1_substitutionTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + + /* TODO: calculate offset/length for each lookupTables */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_morx_subtable_type1_LookupValue_validate; + valid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit; + + for ( i = 0; i < optdata->substitutionTable_num_lookupTables; i++ ) + { + FT_ULong offset; + + + GXV_LIMIT_CHECK( 4 ); + offset = FT_NEXT_ULONG( p ); + + gxv_LookupTable_validate( table + offset, limit, valid ); + } + + /* TODO: overlapping of lookupTables in substitutionTable */ + } + + + /* + * subtable for Contextual glyph substitution is a modified StateTable. + * In addition to classTable, stateArray, entryTable, the field + * `substitutionTable' is added. + */ + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type1_StateOptRec st_rec; + + + GXV_NAME_ENTER( "morx chain subtable type1 (Contextual Glyph Subst)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE ); + + st_rec.substitutionTable_num_lookupTables = 0; + + valid->xstatetable.optdata = + &st_rec; + valid->xstatetable.optdata_load_func = + gxv_morx_subtable_type1_substitutionTable_load; + valid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type1_subtable_setup; + valid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type1_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + gxv_morx_subtable_type1_substitutionTable_validate( + table + st_rec.substitutionTable, + table + st_rec.substitutionTable + st_rec.substitutionTable_length, + valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c new file mode 100644 index 0000000000..5cad5169c2 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c @@ -0,0 +1,285 @@ +/***************************************************************************/ +/* */ +/* gxvmorx2.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for type2 (Ligature Substitution) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + typedef struct GXV_morx_subtable_type2_StateOptRec_ + { + FT_ULong ligActionTable; + FT_ULong componentTable; + FT_ULong ligatureTable; + FT_ULong ligActionTable_length; + FT_ULong componentTable_length; + FT_ULong ligatureTable_length; + + } GXV_morx_subtable_type2_StateOptRec, + *GXV_morx_subtable_type2_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE \ + ( GXV_XSTATETABLE_HEADER_SIZE + 4 + 4 + 4 ) + + + static void + gxv_morx_subtable_type2_opttable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 ); + optdata->ligActionTable = FT_NEXT_ULONG( p ); + optdata->componentTable = FT_NEXT_ULONG( p ); + optdata->ligatureTable = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "offset to ligActionTable=0x%08x\n", + optdata->ligActionTable )); + GXV_TRACE(( "offset to componentTable=0x%08x\n", + optdata->componentTable )); + GXV_TRACE(( "offset to ligatureTable=0x%08x\n", + optdata->ligatureTable )); + } + + + static void + gxv_morx_subtable_type2_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ) + { + FT_ULong o[6]; + FT_ULong* l[6]; + FT_ULong buff[7]; + + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata; + + + GXV_NAME_ENTER( "subtable boundaries setup" ); + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->ligActionTable; + o[4] = optdata->componentTable; + o[5] = optdata->ligatureTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->ligActionTable_length); + l[4] = &(optdata->componentTable_length); + l[5] = &(optdata->ligatureTable_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 6, table_size, valid ); + + GXV_TRACE(( "classTable: offset=0x%08x length=0x%08x\n", + classTable, *classTable_length_p )); + GXV_TRACE(( "stateArray: offset=0x%08x length=0x%08x\n", + stateArray, *stateArray_length_p )); + GXV_TRACE(( "entryTable: offset=0x%08x length=0x%08x\n", + entryTable, *entryTable_length_p )); + GXV_TRACE(( "ligActionTable: offset=0x%08x length=0x%08x\n", + optdata->ligActionTable, + optdata->ligActionTable_length )); + GXV_TRACE(( "componentTable: offset=0x%08x length=0x%08x\n", + optdata->componentTable, + optdata->componentTable_length )); + GXV_TRACE(( "ligatureTable: offset=0x%08x length=0x%08x\n", + optdata->ligatureTable, + optdata->ligatureTable_length )); + + GXV_EXIT; + } + + +#define GXV_MORX_LIGACTION_ENTRY_SIZE 4 + + + static void + gxv_morx_subtable_type2_ligActionIndex_validate( + FT_Bytes table, + FT_UShort ligActionIndex, + GXV_Validator valid ) + { + /* access ligActionTable */ + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata; + + FT_Bytes lat_base = table + optdata->ligActionTable; + FT_Bytes p = lat_base + + ligActionIndex * GXV_MORX_LIGACTION_ENTRY_SIZE; + FT_Bytes lat_limit = lat_base + optdata->ligActionTable; + + + if ( p < lat_base ) + { + GXV_TRACE(( "p < lat_base (%d byte rewind)\n", lat_base - p )); + FT_INVALID_OFFSET; + } + else if ( lat_limit < p ) + { + GXV_TRACE(( "lat_limit < p (%d byte overrun)\n", p - lat_limit )); + FT_INVALID_OFFSET; + } + + { + /* validate entry in ligActionTable */ + FT_ULong lig_action; + FT_UShort last; + FT_UShort store; + FT_ULong offset; + + + lig_action = FT_NEXT_ULONG( p ); + last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); + store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); + + offset = lig_action & 0x3FFFFFFFUL; + } + } + + + static void + gxv_morx_subtable_type2_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setComponent; + FT_UShort dontAdvance; + FT_UShort performAction; + FT_UShort reserved; + FT_UShort ligActionIndex; + + FT_UNUSED( state ); + FT_UNUSED( limit ); + + + setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + performAction = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FFF ); + ligActionIndex = glyphOffset.u; + + if ( reserved > 0 ) + GXV_TRACE(( " reserved 14bit is non-zero\n" )); + + if ( 0 < ligActionIndex ) + gxv_morx_subtable_type2_ligActionIndex_validate( + table, ligActionIndex, valid ); + } + + + static void + gxv_morx_subtable_type2_ligatureTable_validate( FT_Bytes table, + GXV_Validator valid ) + { + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata; + + FT_Bytes p = table + optdata->ligatureTable; + FT_Bytes limit = table + optdata->ligatureTable + + optdata->ligatureTable_length; + + + GXV_NAME_ENTER( "morx chain subtable type2 - substitutionTable" ); + + if ( 0 != optdata->ligatureTable ) + { + /* Apple does not give specification of ligatureTable format */ + while ( p < limit ) + { + FT_UShort lig_gid; + + + GXV_LIMIT_CHECK( 2 ); + lig_gid = FT_NEXT_USHORT( p ); + } + } + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type2_StateOptRec lig_rec; + + + GXV_NAME_ENTER( "morx chain subtable type2 (Ligature Substitution)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE ); + + valid->xstatetable.optdata = + &lig_rec; + valid->xstatetable.optdata_load_func = + gxv_morx_subtable_type2_opttable_load; + valid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type2_subtable_setup; + valid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_USHORT; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type2_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + p += valid->subtable_length; + gxv_morx_subtable_type2_ligatureTable_validate( table, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c new file mode 100644 index 0000000000..c0d2f78e39 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* gxvmorx4.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for "morx" type4 (Non-Contextual Glyph Substitution) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + GXV_NAME_ENTER( "morx chain subtable type4 " + "(Non-Contextual Glyph Substitution)" ); + + gxv_mort_subtable_type4_validate( table, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c new file mode 100644 index 0000000000..d9115618c0 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c @@ -0,0 +1,217 @@ +/***************************************************************************/ +/* */ +/* gxvmorx5.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for type5 (Contextual Glyph Insertion) subtable. */ +/* */ +/* Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + /* + * `morx' subtable type5 (Contextual Glyph Insertion) + * has format of a StateTable with insertion-glyph-list + * without name. However, the 32bit offset from the head + * of subtable to the i-g-l is given after `entryTable', + * without variable name specification (the existence of + * this offset to the table is different from mort type5). + */ + + + typedef struct GXV_morx_subtable_type5_StateOptRec_ + { + FT_ULong insertionGlyphList; + FT_ULong insertionGlyphList_length; + + } GXV_morx_subtable_type5_StateOptRec, + *GXV_morx_subtable_type5_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 4 ) + + + static void + gxv_morx_subtable_type5_insertionGlyphList_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type5_StateOptRecData optdata = + (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 4 ); + optdata->insertionGlyphList = FT_NEXT_ULONG( p ); + } + + + static void + gxv_morx_subtable_type5_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ) + { + FT_ULong o[4]; + FT_ULong* l[4]; + FT_ULong buff[5]; + + GXV_morx_subtable_type5_StateOptRecData optdata = + (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->insertionGlyphList; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->insertionGlyphList_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid ); + } + + + static void + gxv_morx_subtable_type5_InsertList_validate( FT_UShort table_index, + FT_UShort count, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table + table_index * 2; + + + while ( p < table + count * 2 + table_index * 2 ) + { + FT_UShort insert_glyphID; + + + GXV_LIMIT_CHECK( 2 ); + insert_glyphID = FT_NEXT_USHORT( p ); + GXV_TRACE(( " 0x%04x", insert_glyphID )); + } + + GXV_TRACE(( "\n" )); + } + + + static void + gxv_morx_subtable_type5_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetDesc glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bool setMark; + FT_Bool dontAdvance; + FT_Bool currentIsKashidaLike; + FT_Bool markedIsKashidaLike; + FT_Bool currentInsertBefore; + FT_Bool markedInsertBefore; + FT_Byte currentInsertCount; + FT_Byte markedInsertCount; + FT_Byte currentInsertList; + FT_UShort markedInsertList; + + FT_UNUSED( state ); + + + setMark = FT_BOOL( ( flags >> 15 ) & 1 ); + dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); + currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); + markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); + currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); + markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); + + currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); + markedInsertCount = (FT_Byte)( flags & 0x001F ); + + currentInsertList = (FT_Byte) ( glyphOffset.ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset.ul ); + + if ( currentInsertList && 0 != currentInsertCount ) + gxv_morx_subtable_type5_InsertList_validate( currentInsertList, + currentInsertCount, + table, limit, + valid ); + + if ( markedInsertList && 0 != markedInsertCount ) + gxv_morx_subtable_type5_InsertList_validate( markedInsertList, + markedInsertCount, + table, limit, + valid ); + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type5_StateOptRec et_rec; + GXV_morx_subtable_type5_StateOptRecData et = &et_rec; + + + GXV_NAME_ENTER( "morx chain subtable type5 (Glyph Insertion)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE ); + + valid->xstatetable.optdata = + et; + valid->xstatetable.optdata_load_func = + gxv_morx_subtable_type5_insertionGlyphList_load; + valid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type5_subtable_setup; + valid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type5_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvopbd.c b/src/3rdparty/freetype/src/gxvalid/gxvopbd.c new file mode 100644 index 0000000000..8d6fe669f3 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvopbd.c @@ -0,0 +1,217 @@ +/***************************************************************************/ +/* */ +/* gxvopbd.c */ +/* */ +/* TrueTypeGX/AAT opbd table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvopbd + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_opbd_DataRec_ + { + FT_UShort format; + FT_UShort valueOffset_min; + + } GXV_opbd_DataRec, *GXV_opbd_Data; + + +#define GXV_OPBD_DATA( FIELD ) GXV_TABLE_DATA( opbd, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_opbd_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + /* offset in LookupTable is measured from the head of opbd table */ + FT_Bytes p = valid->root->base + value.u; + FT_Bytes limit = valid->root->limit; + FT_Short delta_value; + int i; + + + if ( value.u < GXV_OPBD_DATA( valueOffset_min ) ) + GXV_OPBD_DATA( valueOffset_min ) = value.u; + + for ( i = 0; i < 4; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + delta_value = FT_NEXT_SHORT( p ); + + if ( GXV_OPBD_DATA( format ) ) /* format 1, value is ctrl pt. */ + { + if ( delta_value == -1 ) + continue; + + gxv_ctlPoint_validate( glyph, delta_value, valid ); + } + else /* format 0, value is distance */ + continue; + } + } + + + /* + opbd ---------------------+ + | + +===============+ | + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of opbd sfnt table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 48bit value array | + +===============+ | + | value | <-------+ + | | + | | + | | + +---------------+ + .... */ + + static GXV_LookupValueDesc + gxv_opbd_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + GXV_LookupValueDesc value; + + FT_UNUSED( lookuptbl_limit ); + FT_UNUSED( valid ); + + /* XXX: check range? */ + value.u = (FT_UShort)( base_value.u + + relative_gindex * 4 * sizeof ( FT_Short ) ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** opbd TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_opbd_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + GXV_opbd_DataRec opbdrec; + GXV_opbd_Data opbd = &opbdrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong version; + + + valid->root = ftvalid; + valid->table_data = opbd; + valid->face = face; + + FT_TRACE3(( "validating `opbd' table\n" )); + GXV_INIT; + GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU; + + + GXV_LIMIT_CHECK( 4 + 2 ); + version = FT_NEXT_ULONG( p ); + GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p ); + + + /* only 0x00010000 is defined (1996) */ + GXV_TRACE(( "(version=0x%08x)\n", version )); + if ( 0x00010000UL != version ) + FT_INVALID_FORMAT; + + /* only values 0 and 1 are defined (1996) */ + GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) )); + if ( 0x0001 < GXV_OPBD_DATA( format ) ) + FT_INVALID_FORMAT; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_opbd_LookupValue_validate; + valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit; + + gxv_LookupTable_validate( p, limit, valid ); + p += valid->subtable_length; + + if ( p > table + GXV_OPBD_DATA( valueOffset_min ) ) + { + GXV_TRACE(( + "found overlap between LookupTable and opbd_value array\n" )); + FT_INVALID_OFFSET; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvprop.c b/src/3rdparty/freetype/src/gxvalid/gxvprop.c new file mode 100644 index 0000000000..010eeda426 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvprop.c @@ -0,0 +1,301 @@ +/***************************************************************************/ +/* */ +/* gxvprop.c */ +/* */ +/* TrueTypeGX/AAT prop table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvprop + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_PROP_HEADER_SIZE ( 4 + 2 + 2 ) +#define GXV_PROP_SIZE_MIN GXV_PROP_HEADER_SIZE + + typedef struct GXV_prop_DataRec_ + { + FT_Fixed version; + + } GXV_prop_DataRec, *GXV_prop_Data; + +#define GXV_PROP_DATA( field ) GXV_TABLE_DATA( prop, field ) + +#define GXV_PROP_FLOATER 0x8000U +#define GXV_PROP_USE_COMPLEMENTARY_BRACKET 0x1000U +#define GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET 0x0F00U +#define GXV_PROP_ATTACHING_TO_RIGHT 0x0080U +#define GXV_PROP_RESERVED 0x0060U +#define GXV_PROP_DIRECTIONALITY_CLASS 0x001FU + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_prop_zero_advance_validate( FT_UShort gid, + GXV_Validator valid ) + { + FT_Face face; + FT_Error error; + FT_GlyphSlot glyph; + + + GXV_NAME_ENTER( "zero advance" ); + + face = valid->face; + + error = FT_Load_Glyph( face, + gid, + FT_LOAD_IGNORE_TRANSFORM ); + if ( error ) + FT_INVALID_GLYPH_ID; + + glyph = face->glyph; + + if ( glyph->advance.x != (FT_Pos)0 || + glyph->advance.y != (FT_Pos)0 ) + FT_INVALID_DATA; + + GXV_EXIT; + } + + + /* Pass 0 as GLYPH to check the default property */ + static void + gxv_prop_property_validate( FT_UShort property, + FT_UShort glyph, + GXV_Validator valid ) + { + if ( glyph != 0 && ( property & GXV_PROP_FLOATER ) ) + gxv_prop_zero_advance_validate( glyph, valid ); + + if ( property & GXV_PROP_USE_COMPLEMENTARY_BRACKET ) + { + FT_UShort offset; + char complement; + + + offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ); + if ( offset == 0 ) + FT_INVALID_DATA; + + complement = (char)( offset >> 8 ); + if ( complement & 0x08 ) + { + /* Top bit is set: negative */ + + /* Calculate the absolute offset */ + complement = (char)( ( complement & 0x07 ) + 1 ); + + /* The gid for complement must be greater than 0 */ + if ( glyph <= complement ) + FT_INVALID_DATA; + } + else + { + /* The gid for complement must be the face. */ + gxv_glyphid_validate( (FT_UShort)( glyph + complement ), valid ); + } + } + else + { + if ( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ) + GXV_TRACE(( "glyph %d cannot have complementary bracketing\n", + glyph )); + } + + /* this is introduced in version 2.0 */ + if ( property & GXV_PROP_ATTACHING_TO_RIGHT ) + { + if ( GXV_PROP_DATA( version ) == 0x00010000UL ) + FT_INVALID_DATA; + } + + if ( property & GXV_PROP_RESERVED ) + FT_INVALID_DATA; + + if ( ( property & GXV_PROP_DIRECTIONALITY_CLASS ) > 11 ) + { + /* TODO: Too restricted. Use the validation level. */ + if ( GXV_PROP_DATA( version ) == 0x00010000UL || + GXV_PROP_DATA( version ) == 0x00020000UL ) + FT_INVALID_DATA; + } + } + + + static void + gxv_prop_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueDesc value, + GXV_Validator valid ) + { + gxv_prop_property_validate( value.u, glyph, valid ); + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + ... | + | + 16bit value array | + +===============+ | + | value | <-------+ + ... + */ + + static GXV_LookupValueDesc + gxv_prop_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueDesc base_value, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof( FT_UShort ) ); + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** prop TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_prop_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_prop_DataRec proprec; + GXV_prop_Data prop = &proprec; + + FT_Fixed version; + FT_UShort format; + FT_UShort defaultProp; + + + valid->root = ftvalid; + valid->table_data = prop; + valid->face = face; + + FT_TRACE3(( "validating `prop' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + defaultProp = FT_NEXT_USHORT( p ); + + /* only versions 1.0, 2.0, 3.0 are defined (1996) */ + if ( version != 0x00010000UL && + version != 0x00020000UL && + version != 0x00030000UL ) + FT_INVALID_FORMAT; + + + /* only formats 0x0000, 0x0001 are defined (1996) */ + if ( format > 1 ) + FT_INVALID_FORMAT; + + gxv_prop_property_validate( defaultProp, 0, valid ); + + if ( format == 0 ) + { + FT_TRACE3(( "(format 0, no per-glyph properties, " + "remaining %d bytes are skipped)", limit - p )); + goto Exit; + } + + /* format == 1 */ + GXV_PROP_DATA( version ) = version; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_prop_LookupValue_validate; + valid->lookupfmt4_trans = gxv_prop_LookupFmt4_transit; + + gxv_LookupTable_validate( p, limit, valid ); + + Exit: + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/gxvtrak.c b/src/3rdparty/freetype/src/gxvalid/gxvtrak.c new file mode 100644 index 0000000000..432ee4e271 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/gxvtrak.c @@ -0,0 +1,277 @@ +/***************************************************************************/ +/* */ +/* gxvtrak.c */ +/* */ +/* TrueTypeGX/AAT trak table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvtrak + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * referred track table format specification: + * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6trak.html + * last update was 1996. + * ---------------------------------------------- + * [MINIMUM HEADER]: GXV_TRAK_SIZE_MIN + * version (fixed: 32bit) = 0x00010000 + * format (uint16: 16bit) = 0 is only defined (1996) + * horizOffset (uint16: 16bit) + * vertOffset (uint16: 16bit) + * reserved (uint16: 16bit) = 0 + * ---------------------------------------------- + * [VARIABLE BODY]: + * horizData + * header ( 2 + 2 + 4 + * trackTable + nTracks * ( 4 + 2 + 2 ) + * sizeTable + nSizes * 4 ) + * ---------------------------------------------- + * vertData + * header ( 2 + 2 + 4 + * trackTable + nTracks * ( 4 + 2 + 2 ) + * sizeTable + nSizes * 4 ) + * ---------------------------------------------- + */ + typedef struct GXV_trak_DataRec_ + { + FT_UShort trackValueOffset_min; + FT_UShort trackValueOffset_max; + + } GXV_trak_DataRec, *GXV_trak_Data; + + +#define GXV_TRAK_DATA( FIELD ) GXV_TABLE_DATA( trak, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_trak_trackTable_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nTracks, + GXV_Validator valid ) + { + FT_Bytes p = table; + + FT_Fixed track; + FT_UShort nameIndex; + FT_UShort offset; + FT_UShort i; + + + GXV_NAME_ENTER( "trackTable" ); + + GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFFU; + GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000; + + for ( i = 0; i < nTracks; i ++ ) + { + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + track = FT_NEXT_LONG( p ); + nameIndex = FT_NEXT_USHORT( p ); + offset = FT_NEXT_USHORT( p ); + + if ( offset < GXV_TRAK_DATA( trackValueOffset_min ) ) + GXV_TRAK_DATA( trackValueOffset_min ) = offset; + if ( offset > GXV_TRAK_DATA( trackValueOffset_max ) ) + GXV_TRAK_DATA( trackValueOffset_max ) = offset; + + gxv_sfntName_validate( nameIndex, 256, 32767, valid ); + } + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + static void + gxv_trak_trackData_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort nTracks; + FT_UShort nSizes; + FT_ULong sizeTableOffset; + + GXV_ODTECT( 4, odtect ); + + + GXV_ODTECT_INIT( odtect ); + GXV_NAME_ENTER( "trackData" ); + + /* read the header of trackData */ + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + nTracks = FT_NEXT_USHORT( p ); + nSizes = FT_NEXT_USHORT( p ); + sizeTableOffset = FT_NEXT_ULONG( p ); + + gxv_odtect_add_range( table, p - table, "trackData header", odtect ); + + /* validate trackTable */ + gxv_trak_trackTable_validate( p, limit, nTracks, valid ); + gxv_odtect_add_range( p, valid->subtable_length, + "trackTable", odtect ); + + /* sizeTable is array of FT_Fixed, don't check contents */ + p = valid->root->base + sizeTableOffset; + GXV_LIMIT_CHECK( nSizes * 4 ); + gxv_odtect_add_range( p, nSizes * 4, "sizeTable", odtect ); + + /* validate trackValueOffet */ + p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_min ); + if ( limit - p < nTracks * nSizes * 2 ) + GXV_TRACE(( "too short trackValue array\n" )); + + p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_max ); + GXV_LIMIT_CHECK( nSizes * 2 ); + + gxv_odtect_add_range( valid->root->base + + GXV_TRAK_DATA( trackValueOffset_min ), + GXV_TRAK_DATA( trackValueOffset_max ) + - GXV_TRAK_DATA( trackValueOffset_min ) + + nSizes * 2, + "trackValue array", odtect ); + + gxv_odtect_validate( odtect, valid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** trak TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_trak_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_UInt table_size; + + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + GXV_trak_DataRec trakrec; + GXV_trak_Data trak = &trakrec; + + FT_ULong version; + FT_UShort format; + FT_UShort horizOffset; + FT_UShort vertOffset; + FT_UShort reserved; + + + GXV_ODTECT( 3, odtect ); + + GXV_ODTECT_INIT( odtect ); + valid->root = ftvalid; + valid->table_data = trak; + valid->face = face; + + limit = valid->root->limit; + table_size = limit - table; + + FT_TRACE3(( "validating `trak' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + horizOffset = FT_NEXT_USHORT( p ); + vertOffset = FT_NEXT_USHORT( p ); + reserved = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (version = 0x%08x)\n", version )); + GXV_TRACE(( " (format = 0x%04x)\n", format )); + GXV_TRACE(( " (horizOffset = 0x%04x)\n", horizOffset )); + GXV_TRACE(( " (vertOffset = 0x%04x)\n", vertOffset )); + GXV_TRACE(( " (reserved = 0x%04x)\n", reserved )); + + /* Version 1.0 (always:1996) */ + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* format 0 (always:1996) */ + if ( format != 0x0000 ) + FT_INVALID_FORMAT; + + GXV_32BIT_ALIGNMENT_VALIDATE( horizOffset ); + GXV_32BIT_ALIGNMENT_VALIDATE( vertOffset ); + + /* Reserved Fixed Value (always) */ + if ( reserved != 0x0000 ) + FT_INVALID_DATA; + + /* validate trackData */ + if ( 0 < horizOffset ) + { + gxv_trak_trackData_validate( table + horizOffset, limit, valid ); + gxv_odtect_add_range( table + horizOffset, valid->subtable_length, + "horizJustData", odtect ); + } + + if ( 0 < vertOffset ) + { + gxv_trak_trackData_validate( table + vertOffset, limit, valid ); + gxv_odtect_add_range( table + vertOffset, valid->subtable_length, + "vertJustData", odtect ); + } + + gxv_odtect_validate( odtect, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/gxvalid/module.mk b/src/3rdparty/freetype/src/gxvalid/module.mk new file mode 100644 index 0000000000..9fd098e2c5 --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 gxvalid module definition +# + +# Copyright 2004, 2005, 2006 +# by suzuki toshiya, Masatake YAMATO, Red Hat K.K., +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += GXVALID_MODULE + +define GXVALID_MODULE +$(OPEN_DRIVER) FT_Module_Class, gxv_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)gxvalid $(ECHO_DRIVER_DESC)TrueTypeGX/AAT validation module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/gxvalid/rules.mk b/src/3rdparty/freetype/src/gxvalid/rules.mk new file mode 100644 index 0000000000..57bc0823db --- /dev/null +++ b/src/3rdparty/freetype/src/gxvalid/rules.mk @@ -0,0 +1,94 @@ +# +# FreeType 2 TrueTypeGX/AAT validation driver configuration rules +# + + +# Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# GXV driver directory +# +GXV_DIR := $(SRC_DIR)/gxvalid + + +# compilation flags for the driver +# +GXV_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GXV_DIR)) + + +# GXV driver sources (i.e., C files) +# +GXV_DRV_SRC := $(GXV_DIR)/gxvcommn.c \ + $(GXV_DIR)/gxvfeat.c \ + $(GXV_DIR)/gxvbsln.c \ + $(GXV_DIR)/gxvtrak.c \ + $(GXV_DIR)/gxvopbd.c \ + $(GXV_DIR)/gxvprop.c \ + $(GXV_DIR)/gxvjust.c \ + $(GXV_DIR)/gxvmort.c \ + $(GXV_DIR)/gxvmort0.c \ + $(GXV_DIR)/gxvmort1.c \ + $(GXV_DIR)/gxvmort2.c \ + $(GXV_DIR)/gxvmort4.c \ + $(GXV_DIR)/gxvmort5.c \ + $(GXV_DIR)/gxvmorx.c \ + $(GXV_DIR)/gxvmorx0.c \ + $(GXV_DIR)/gxvmorx1.c \ + $(GXV_DIR)/gxvmorx2.c \ + $(GXV_DIR)/gxvmorx4.c \ + $(GXV_DIR)/gxvmorx5.c \ + $(GXV_DIR)/gxvlcar.c \ + $(GXV_DIR)/gxvkern.c \ + $(GXV_DIR)/gxvmod.c + +# GXV driver headers +# +GXV_DRV_H := $(GXV_DIR)/gxvalid.h \ + $(GXV_DIR)/gxverror.h \ + $(GXV_DIR)/gxvcommn.h \ + $(GXV_DIR)/gxvfeat.h \ + $(GXV_DIR)/gxvmod.h \ + $(GXV_DIR)/gxvmort.h \ + $(GXV_DIR)/gxvmorx.h + + +# GXV driver object(s) +# +# GXV_DRV_OBJ_M is used during `multi' builds. +# GXV_DRV_OBJ_S is used during `single' builds. +# +GXV_DRV_OBJ_M := $(GXV_DRV_SRC:$(GXV_DIR)/%.c=$(OBJ_DIR)/%.$O) +GXV_DRV_OBJ_S := $(OBJ_DIR)/gxvalid.$O + +# GXV driver source file for single build +# +GXV_DRV_SRC_S := $(GXV_DIR)/gxvalid.c + + +# GXV driver - single object +# +$(GXV_DRV_OBJ_S): $(GXV_DRV_SRC_S) $(GXV_DRV_SRC) \ + $(FREETYPE_H) $(GXV_DRV_H) + $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GXV_DRV_SRC_S)) + + +# GXV driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(GXV_DIR)/%.c $(FREETYPE_H) $(GXV_DRV_H) + $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(GXV_DRV_OBJ_S) +DRV_OBJS_M += $(GXV_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/gzip/Jamfile b/src/3rdparty/freetype/src/gzip/Jamfile new file mode 100644 index 0000000000..a7aafa0518 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/Jamfile @@ -0,0 +1,16 @@ +# FreeType 2 src/gzip Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) gzip ; + +Library $(FT2_LIB) : ftgzip.c ; + +# end of src/pcf Jamfile diff --git a/src/3rdparty/freetype/src/gzip/adler32.c b/src/3rdparty/freetype/src/gzip/adler32.c new file mode 100644 index 0000000000..36f6a432ea --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/adler32.c @@ -0,0 +1,48 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: adler32.c,v 1.5 2007/06/01 06:56:17 wl Exp $ */ + +#include "zlib.h" + +#define BASE 65521L /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* ========================================================================= */ +ZEXPORT(uLong) adler32( /* adler, buf, len) */ + uLong adler, + const Bytef *buf, + uInt len ) +{ + unsigned long s1 = adler & 0xffff; + unsigned long s2 = (adler >> 16) & 0xffff; + int k; + + if (buf == Z_NULL) return 1L; + + while (len > 0) { + k = len < NMAX ? len : NMAX; + len -= k; + while (k >= 16) { + DO16(buf); + buf += 16; + k -= 16; + } + if (k != 0) do { + s1 += *buf++; + s2 += s1; + } while (--k); + s1 %= BASE; + s2 %= BASE; + } + return (s2 << 16) | s1; +} diff --git a/src/3rdparty/freetype/src/gzip/ftgzip.c b/src/3rdparty/freetype/src/gzip/ftgzip.c new file mode 100644 index 0000000000..0d6bd34956 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/ftgzip.c @@ -0,0 +1,682 @@ +/***************************************************************************/ +/* */ +/* ftgzip.c */ +/* */ +/* FreeType support for .gz compressed files. */ +/* */ +/* This optional component relies on zlib. It should mainly be used to */ +/* parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include FT_GZIP_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX Gzip_Err_ +#define FT_ERR_BASE FT_Mod_Err_Gzip + +#include FT_ERRORS_H + + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + +#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB + +#include <zlib.h> + +#else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + /* In this case, we include our own modified sources of the ZLib */ + /* within the "ftgzip" component. The modifications were necessary */ + /* to #include all files without conflicts, as well as preventing */ + /* the definition of "extern" functions that may cause linking */ + /* conflicts when a program is linked with both FreeType and the */ + /* original ZLib. */ + +#define NO_DUMMY_DECL +#define MY_ZCALLOC + +#include "zlib.h" + +#undef SLOW +#define SLOW 1 /* we can't use asm-optimized sources here! */ + + /* Urgh. `inflate_mask' must not be declared twice -- C++ doesn't like + this. We temporarily disable it and load all necessary header files. */ +#define NO_INFLATE_MASK +#include "zutil.h" +#include "inftrees.h" +#include "infblock.h" +#include "infcodes.h" +#include "infutil.h" +#undef NO_INFLATE_MASK + + /* infutil.c must be included before infcodes.c */ +#include "zutil.c" +#include "inftrees.c" +#include "infutil.c" +#include "infcodes.c" +#include "infblock.c" +#include "inflate.c" +#include "adler32.c" + +#endif /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** Z L I B M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + /* it is better to use FreeType memory routines instead of raw + 'malloc/free' */ + + static voidpf + ft_gzip_alloc( FT_Memory memory, + uInt items, + uInt size ) + { + FT_ULong sz = (FT_ULong)size * items; + FT_Error error; + FT_Pointer p; + + + (void)FT_ALLOC( p, sz ); + return p; + } + + + static void + ft_gzip_free( FT_Memory memory, + voidpf address ) + { + FT_MEM_FREE( address ); + } + + +#ifndef FT_CONFIG_OPTION_SYSTEM_ZLIB + + local voidpf + zcalloc ( voidpf opaque, + unsigned items, + unsigned size ) + { + return ft_gzip_alloc( (FT_Memory)opaque, items, size ); + } + + local void + zcfree( voidpf opaque, + voidpf ptr ) + { + ft_gzip_free( (FT_Memory)opaque, ptr ); + } + +#endif /* !SYSTEM_ZLIB */ + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** Z L I B F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_GZIP_BUFFER_SIZE 4096 + + typedef struct FT_GZipFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + z_stream zstream; /* zlib input stream */ + + FT_ULong start; /* starting position, after .gz header */ + FT_Byte input[FT_GZIP_BUFFER_SIZE]; /* input read buffer */ + + FT_Byte buffer[FT_GZIP_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_GZipFileRec, *FT_GZipFile; + + + /* gzip flag byte */ +#define FT_GZIP_ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define FT_GZIP_HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define FT_GZIP_EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define FT_GZIP_ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define FT_GZIP_COMMENT 0x10 /* bit 4 set: file comment present */ +#define FT_GZIP_RESERVED 0xE0 /* bits 5..7: reserved */ + + + /* check and skip .gz header - we don't support `transparent' compression */ + static FT_Error + ft_gzip_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[4]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 4 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers; */ + /* head[2] is the method, and head[3] the flags */ + if ( head[0] != 0x1f || + head[1] != 0x8b || + head[2] != Z_DEFLATED || + (head[3] & FT_GZIP_RESERVED) ) + { + error = Gzip_Err_Invalid_File_Format; + goto Exit; + } + + /* skip time, xflags and os code */ + (void)FT_STREAM_SKIP( 6 ); + + /* skip the extra field */ + if ( head[3] & FT_GZIP_EXTRA_FIELD ) + { + FT_UInt len; + + + if ( FT_READ_USHORT_LE( len ) || + FT_STREAM_SKIP( len ) ) + goto Exit; + } + + /* skip original file name */ + if ( head[3] & FT_GZIP_ORIG_NAME ) + for (;;) + { + FT_UInt c; + + + if ( FT_READ_BYTE( c ) ) + goto Exit; + + if ( c == 0 ) + break; + } + + /* skip .gz comment */ + if ( head[3] & FT_GZIP_COMMENT ) + for (;;) + { + FT_UInt c; + + + if ( FT_READ_BYTE( c ) ) + goto Exit; + + if ( c == 0 ) + break; + } + + /* skip CRC */ + if ( head[3] & FT_GZIP_HEAD_CRC ) + if ( FT_STREAM_SKIP( 2 ) ) + goto Exit; + + Exit: + return error; + } + + + static FT_Error + ft_gzip_file_init( FT_GZipFile zip, + FT_Stream stream, + FT_Stream source ) + { + z_stream* zstream = &zip->zstream; + FT_Error error = Gzip_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .gz header */ + { + stream = source; + + error = ft_gzip_check_header( stream ); + if ( error ) + goto Exit; + + zip->start = FT_STREAM_POS(); + } + + /* initialize zlib -- there is no zlib header in the compressed stream */ + zstream->zalloc = (alloc_func)ft_gzip_alloc; + zstream->zfree = (free_func) ft_gzip_free; + zstream->opaque = stream->memory; + + zstream->avail_in = 0; + zstream->next_in = zip->buffer; + + if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK || + zstream->next_in == NULL ) + error = Gzip_Err_Invalid_File_Format; + + Exit: + return error; + } + + + static void + ft_gzip_file_done( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + + + inflateEnd( zstream ); + + /* clear the rest */ + zstream->zalloc = NULL; + zstream->zfree = NULL; + zstream->opaque = NULL; + zstream->next_in = NULL; + zstream->next_out = NULL; + zstream->avail_in = 0; + zstream->avail_out = 0; + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_gzip_file_reset( FT_GZipFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( zip->start ) ) + { + z_stream* zstream = &zip->zstream; + + + inflateReset( zstream ); + + zstream->avail_in = 0; + zstream->next_in = zip->input; + zstream->avail_out = 0; + zstream->next_out = zip->buffer; + + zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_gzip_file_fill_input( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + FT_Stream stream = zip->source; + FT_ULong size; + + + if ( stream->read ) + { + size = stream->read( stream, stream->pos, zip->input, + FT_GZIP_BUFFER_SIZE ); + if ( size == 0 ) + return Gzip_Err_Invalid_Stream_Operation; + } + else + { + size = stream->size - stream->pos; + if ( size > FT_GZIP_BUFFER_SIZE ) + size = FT_GZIP_BUFFER_SIZE; + + if ( size == 0 ) + return Gzip_Err_Invalid_Stream_Operation; + + FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); + } + stream->pos += size; + + zstream->next_in = zip->input; + zstream->avail_in = size; + + return Gzip_Err_Ok; + } + + + static FT_Error + ft_gzip_file_fill_output( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + FT_Error error = 0; + + + zip->cursor = zip->buffer; + zstream->next_out = zip->cursor; + zstream->avail_out = FT_GZIP_BUFFER_SIZE; + + while ( zstream->avail_out > 0 ) + { + int err; + + + if ( zstream->avail_in == 0 ) + { + error = ft_gzip_file_fill_input( zip ); + if ( error ) + break; + } + + err = inflate( zstream, Z_NO_FLUSH ); + + if ( err == Z_STREAM_END ) + { + zip->limit = zstream->next_out; + if ( zip->limit == zip->cursor ) + error = Gzip_Err_Invalid_Stream_Operation; + break; + } + else if ( err != Z_OK ) + { + error = Gzip_Err_Invalid_Stream_Operation; + break; + } + } + + return error; + } + + + /* fill output buffer; `count' must be <= FT_GZIP_BUFFER_SIZE */ + static FT_Error + ft_gzip_file_skip_output( FT_GZipFile zip, + FT_ULong count ) + { + FT_Error error = Gzip_Err_Ok; + FT_ULong delta; + + + for (;;) + { + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_gzip_file_fill_output( zip ); + if ( error ) + break; + } + + return error; + } + + + static FT_ULong + ft_gzip_file_io( FT_GZipFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* Reset inflate stream if we're seeking backwards. */ + /* Yes, that is not too efficient, but it saves memory :-) */ + if ( pos < zip->pos ) + { + error = ft_gzip_file_reset( zip ); + if ( error ) + goto Exit; + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_gzip_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer, zip->cursor, delta ); + buffer += delta; + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_gzip_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** G Z E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_gzip_stream_close( FT_Stream stream ) + { + FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize gzip file descriptor */ + ft_gzip_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static FT_ULong + ft_gzip_stream_io( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; + + + return ft_gzip_file_io( zip, pos, buffer, count ); + } + + + static FT_ULong + ft_gzip_get_uncompressed_size( FT_Stream stream ) + { + FT_Error error; + FT_ULong old_pos; + FT_ULong result = 0; + + + old_pos = stream->pos; + if ( !FT_Stream_Seek( stream, stream->size - 4 ) ) + { + result = (FT_ULong)FT_Stream_ReadLong( stream, &error ); + if ( error ) + result = 0; + + (void)FT_Stream_Seek( stream, old_pos ); + } + + return result; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory = source->memory; + FT_GZipFile zip; + + + /* + * check the header right now; this prevents allocating un-necessary + * objects when we don't need them + */ + error = ft_gzip_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_QNEW( zip ) ) + { + error = ft_gzip_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + /* + * We use the following trick to try to dramatically improve the + * performance while dealing with small files. If the original stream + * size is less than a certain threshold, we try to load the whole font + * file into memory. This saves us from using the 32KB buffer needed + * to inflate the file, plus the two 4KB intermediate input/output + * buffers used in the `FT_GZipFile' structure. + */ + { + FT_ULong zip_size = ft_gzip_get_uncompressed_size( source ); + + + if ( zip_size != 0 && zip_size < 40 * 1024 ) + { + FT_Byte* zip_buff; + + + if ( !FT_ALLOC( zip_buff, zip_size ) ) + { + FT_ULong count; + + + count = ft_gzip_file_io( zip, 0, zip_buff, zip_size ); + if ( count == zip_size ) + { + ft_gzip_file_done( zip ); + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + + stream->size = zip_size; + stream->pos = 0; + stream->base = zip_buff; + stream->read = NULL; + stream->close = ft_gzip_stream_close; + + goto Exit; + } + + ft_gzip_file_io( zip, 0, NULL, 0 ); + FT_FREE( zip_buff ); + } + error = 0; + } + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = 0; + stream->read = ft_gzip_stream_io; + stream->close = ft_gzip_stream_close; + + Exit: + return error; + } + +#else /* !FT_CONFIG_OPTION_USE_ZLIB */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return Gzip_Err_Unimplemented_Feature; + } + +#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/gzip/infblock.c b/src/3rdparty/freetype/src/gzip/infblock.c new file mode 100644 index 0000000000..d6e2dc297d --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/infblock.c @@ -0,0 +1,387 @@ +/* infblock.c -- interpret and process block types to last block + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" +#include "inftrees.h" +#include "infcodes.h" +#include "infutil.h" + + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + +/* Table for deflate from PKZIP's appnote.txt. */ +local const uInt border[] = { /* Order of the bit length code lengths */ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* + Notes beyond the 1.93a appnote.txt: + + 1. Distance pointers never point before the beginning of the output + stream. + 2. Distance pointers can point back across blocks, up to 32k away. + 3. There is an implied maximum of 7 bits for the bit length table and + 15 bits for the actual data. + 4. If only one code exists, then it is encoded using one bit. (Zero + would be more efficient, but perhaps a little confusing.) If two + codes exist, they are coded using one bit each (0 and 1). + 5. There is no way of sending zero distance codes--a dummy must be + sent if there are none. (History: a pre 2.0 version of PKZIP would + store blocks with no distance codes, but this was discovered to be + too harsh a criterion.) Valid only for 1.93a. 2.04c does allow + zero distance codes, which is sent as one code of zero bits in + length. + 6. There are up to 286 literal/length codes. Code 256 represents the + end-of-block. Note however that the static length tree defines + 288 codes just to fill out the Huffman codes. Codes 286 and 287 + cannot be used though, since there is no length base or extra bits + defined for them. Similarily, there are up to 30 distance codes. + However, static trees define 32 codes (all 5 bits) to fill out the + Huffman codes, but the last two had better not show up in the data. + 7. Unzip can check dynamic Huffman blocks for complete code sets. + The exception is that a single code would not be complete (see #4). + 8. The five bits following the block type is really the number of + literal codes sent minus 257. + 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits + (1+6+6). Therefore, to output three times the length, you output + three codes (1+1+1), whereas to output four times the same length, + you only need two codes (1+3). Hmm. + 10. In the tree reconstruction algorithm, Code = Code + Increment + only if BitLength(i) is not zero. (Pretty obvious.) + 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) + 12. Note: length code 284 can represent 227-258, but length code 285 + really is 258. The last length deserves its own, short code + since it gets used a lot in very redundant files. The length + 258 is special since 258 - 3 (the min match length) is 255. + 13. The literal/length and distance code bit lengths are read as a + single stream of lengths. It is possible (and advantageous) for + a repeat code (16, 17, or 18) to go across the boundary between + the two sets of lengths. + */ + + +local void inflate_blocks_reset( /* s, z, c) */ +inflate_blocks_statef *s, +z_streamp z, +uLongf *c ) +{ + if (c != Z_NULL) + *c = s->check; + if (s->mode == BTREE || s->mode == DTREE) + ZFREE(z, s->sub.trees.blens); + if (s->mode == CODES) + inflate_codes_free(s->sub.decode.codes, z); + s->mode = TYPE; + s->bitk = 0; + s->bitb = 0; + s->read = s->write = s->window; + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); + Tracev((stderr, "inflate: blocks reset\n")); +} + + +local inflate_blocks_statef *inflate_blocks_new( /* z, c, w) */ +z_streamp z, +check_func c, +uInt w ) +{ + inflate_blocks_statef *s; + + if ((s = (inflate_blocks_statef *)ZALLOC + (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) + return s; + if ((s->hufts = + (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL) + { + ZFREE(z, s); + return Z_NULL; + } + if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) + { + ZFREE(z, s->hufts); + ZFREE(z, s); + return Z_NULL; + } + s->end = s->window + w; + s->checkfn = c; + s->mode = TYPE; + Tracev((stderr, "inflate: blocks allocated\n")); + inflate_blocks_reset(s, z, Z_NULL); + return s; +} + + +local int inflate_blocks( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt t; /* temporary storage */ + uLong b; /* bit buffer */ + uInt k; /* bits in bit buffer */ + Bytef *p; /* input data pointer */ + uInt n; /* bytes available there */ + Bytef *q; /* output window write pointer */ + uInt m; /* bytes to end of window or read pointer */ + + /* copy input/output information to locals (UPDATE macro restores) */ + LOAD + + /* process input based on current state */ + while (1) switch (s->mode) + { + case TYPE: + NEEDBITS(3) + t = (uInt)b & 7; + s->last = t & 1; + switch (t >> 1) + { + case 0: /* stored */ + Tracev((stderr, "inflate: stored block%s\n", + s->last ? " (last)" : "")); + DUMPBITS(3) + t = k & 7; /* go to byte boundary */ + DUMPBITS(t) + s->mode = LENS; /* get length of stored block */ + break; + case 1: /* fixed */ + Tracev((stderr, "inflate: fixed codes block%s\n", + s->last ? " (last)" : "")); + { + uInt bl, bd; + inflate_huft *tl, *td; + + inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl, + (const inflate_huft**)&td, z); + s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); + if (s->sub.decode.codes == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + } + DUMPBITS(3) + s->mode = CODES; + break; + case 2: /* dynamic */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + s->last ? " (last)" : "")); + DUMPBITS(3) + s->mode = TABLE; + break; + case 3: /* illegal */ + DUMPBITS(3) + s->mode = BAD; + z->msg = (char*)"invalid block type"; + r = Z_DATA_ERROR; + LEAVE + } + break; + case LENS: + NEEDBITS(32) + if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) + { + s->mode = BAD; + z->msg = (char*)"invalid stored block lengths"; + r = Z_DATA_ERROR; + LEAVE + } + s->sub.left = (uInt)b & 0xffff; + b = k = 0; /* dump bits */ + Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); + s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); + break; + case STORED: + if (n == 0) + LEAVE + NEEDOUT + t = s->sub.left; + if (t > n) t = n; + if (t > m) t = m; + zmemcpy(q, p, t); + p += t; n -= t; + q += t; m -= t; + if ((s->sub.left -= t) != 0) + break; + Tracev((stderr, "inflate: stored end, %lu total out\n", + z->total_out + (q >= s->read ? q - s->read : + (s->end - s->read) + (q - s->window)))); + s->mode = s->last ? DRY : TYPE; + break; + case TABLE: + NEEDBITS(14) + s->sub.trees.table = t = (uInt)b & 0x3fff; +#ifndef PKZIP_BUG_WORKAROUND + if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) + { + s->mode = BAD; + z->msg = (char*)"too many length or distance symbols"; + r = Z_DATA_ERROR; + LEAVE + } +#endif + t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); + if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + DUMPBITS(14) + s->sub.trees.index = 0; + Tracev((stderr, "inflate: table sizes ok\n")); + s->mode = BTREE; + case BTREE: + while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) + { + NEEDBITS(3) + s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; + DUMPBITS(3) + } + while (s->sub.trees.index < 19) + s->sub.trees.blens[border[s->sub.trees.index++]] = 0; + s->sub.trees.bb = 7; + t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, + &s->sub.trees.tb, s->hufts, z); + if (t != Z_OK) + { + r = t; + if (r == Z_DATA_ERROR) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + } + LEAVE + } + s->sub.trees.index = 0; + Tracev((stderr, "inflate: bits tree ok\n")); + s->mode = DTREE; + case DTREE: + while (t = s->sub.trees.table, + s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) + { + inflate_huft *h; + uInt i, j, c; + + t = s->sub.trees.bb; + NEEDBITS(t) + h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); + t = h->bits; + c = h->base; + if (c < 16) + { + DUMPBITS(t) + s->sub.trees.blens[s->sub.trees.index++] = c; + } + else /* c == 16..18 */ + { + i = c == 18 ? 7 : c - 14; + j = c == 18 ? 11 : 3; + NEEDBITS(t + i) + DUMPBITS(t) + j += (uInt)b & inflate_mask[i]; + DUMPBITS(i) + i = s->sub.trees.index; + t = s->sub.trees.table; + if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || + (c == 16 && i < 1)) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + z->msg = (char*)"invalid bit length repeat"; + r = Z_DATA_ERROR; + LEAVE + } + c = c == 16 ? s->sub.trees.blens[i - 1] : 0; + do { + s->sub.trees.blens[i++] = c; + } while (--j); + s->sub.trees.index = i; + } + } + s->sub.trees.tb = Z_NULL; + { + uInt bl, bd; + inflate_huft *tl, *td; + inflate_codes_statef *c; + + bl = 9; /* must be <= 9 for lookahead assumptions */ + bd = 6; /* must be <= 9 for lookahead assumptions */ + t = s->sub.trees.table; + t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), + s->sub.trees.blens, &bl, &bd, &tl, &td, + s->hufts, z); + if (t != Z_OK) + { + if (t == (uInt)Z_DATA_ERROR) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + } + r = t; + LEAVE + } + Tracev((stderr, "inflate: trees ok\n")); + if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + s->sub.decode.codes = c; + } + ZFREE(z, s->sub.trees.blens); + s->mode = CODES; + case CODES: + UPDATE + if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) + return inflate_flush(s, z, r); + r = Z_OK; + inflate_codes_free(s->sub.decode.codes, z); + LOAD + Tracev((stderr, "inflate: codes end, %lu total out\n", + z->total_out + (q >= s->read ? q - s->read : + (s->end - s->read) + (q - s->window)))); + if (!s->last) + { + s->mode = TYPE; + break; + } + s->mode = DRY; + case DRY: + FLUSH + if (s->read != s->write) + LEAVE + s->mode = DONE; + case DONE: + r = Z_STREAM_END; + LEAVE + case BAD: + r = Z_DATA_ERROR; + LEAVE + default: + r = Z_STREAM_ERROR; + LEAVE + } +#ifdef NEED_DUMMY_RETURN + return 0; +#endif +} + + +local int inflate_blocks_free( /* s, z) */ +inflate_blocks_statef *s, +z_streamp z ) +{ + inflate_blocks_reset(s, z, Z_NULL); + ZFREE(z, s->window); + ZFREE(z, s->hufts); + ZFREE(z, s); + Tracev((stderr, "inflate: blocks freed\n")); + return Z_OK; +} + + diff --git a/src/3rdparty/freetype/src/gzip/infblock.h b/src/3rdparty/freetype/src/gzip/infblock.h new file mode 100644 index 0000000000..c2535a1e45 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/infblock.h @@ -0,0 +1,36 @@ +/* infblock.h -- header to use infblock.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFBLOCK_H +#define _INFBLOCK_H + +struct inflate_blocks_state; +typedef struct inflate_blocks_state FAR inflate_blocks_statef; + +local inflate_blocks_statef * inflate_blocks_new OF(( + z_streamp z, + check_func c, /* check function */ + uInt w)); /* window size */ + +local int inflate_blocks OF(( + inflate_blocks_statef *, + z_streamp , + int)); /* initial return code */ + +local void inflate_blocks_reset OF(( + inflate_blocks_statef *, + z_streamp , + uLongf *)); /* check value on output */ + +local int inflate_blocks_free OF(( + inflate_blocks_statef *, + z_streamp)); + +#endif /* _INFBLOCK_H */ diff --git a/src/3rdparty/freetype/src/gzip/infcodes.c b/src/3rdparty/freetype/src/gzip/infcodes.c new file mode 100644 index 0000000000..f7bfd58c4f --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/infcodes.c @@ -0,0 +1,250 @@ +/* infcodes.c -- process literals and length/distance pairs + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "infblock.h" +#include "infcodes.h" +#include "infutil.h" + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + +typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ + START, /* x: set up for LEN */ + LEN, /* i: get length/literal/eob next */ + LENEXT, /* i: getting length extra (have base) */ + DIST, /* i: get distance next */ + DISTEXT, /* i: getting distance extra */ + COPY, /* o: copying bytes in window, waiting for space */ + LIT, /* o: got literal, waiting for output space */ + WASH, /* o: got eob, possibly still output waiting */ + END, /* x: got eob and all data flushed */ + BADCODE} /* x: got error */ +inflate_codes_mode; + +/* inflate codes private state */ +struct inflate_codes_state { + + /* mode */ + inflate_codes_mode mode; /* current inflate_codes mode */ + + /* mode dependent information */ + uInt len; + union { + struct { + inflate_huft *tree; /* pointer into tree */ + uInt need; /* bits needed */ + } code; /* if LEN or DIST, where in tree */ + uInt lit; /* if LIT, literal */ + struct { + uInt get; /* bits to get for extra */ + uInt dist; /* distance back to copy from */ + } copy; /* if EXT or COPY, where and how much */ + } sub; /* submode */ + + /* mode independent information */ + Byte lbits; /* ltree bits decoded per branch */ + Byte dbits; /* dtree bits decoder per branch */ + inflate_huft *ltree; /* literal/length/eob tree */ + inflate_huft *dtree; /* distance tree */ + +}; + + +local inflate_codes_statef *inflate_codes_new( /* bl, bd, tl, td, z) */ +uInt bl, uInt bd, +inflate_huft *tl, +inflate_huft *td, /* need separate declaration for Borland C++ */ +z_streamp z ) +{ + inflate_codes_statef *c; + + if ((c = (inflate_codes_statef *) + ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) + { + c->mode = START; + c->lbits = (Byte)bl; + c->dbits = (Byte)bd; + c->ltree = tl; + c->dtree = td; + Tracev((stderr, "inflate: codes new\n")); + } + return c; +} + + +local int inflate_codes( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt j; /* temporary storage */ + inflate_huft *t; /* temporary pointer */ + uInt e; /* extra bits or operation */ + uLong b; /* bit buffer */ + uInt k; /* bits in bit buffer */ + Bytef *p; /* input data pointer */ + uInt n; /* bytes available there */ + Bytef *q; /* output window write pointer */ + uInt m; /* bytes to end of window or read pointer */ + Bytef *f; /* pointer to copy strings from */ + inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ + + /* copy input/output information to locals (UPDATE macro restores) */ + LOAD + + /* process input and output based on current state */ + while (1) switch (c->mode) + { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ + case START: /* x: set up for LEN */ +#ifndef SLOW + if (m >= 258 && n >= 10) + { + UPDATE + r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); + LOAD + if (r != Z_OK) + { + c->mode = r == Z_STREAM_END ? WASH : BADCODE; + break; + } + } +#endif /* !SLOW */ + c->sub.code.need = c->lbits; + c->sub.code.tree = c->ltree; + c->mode = LEN; + case LEN: /* i: get length/literal/eob next */ + j = c->sub.code.need; + NEEDBITS(j) + t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); + DUMPBITS(t->bits) + e = (uInt)(t->exop); + if (e == 0) /* literal */ + { + c->sub.lit = t->base; + Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", t->base)); + c->mode = LIT; + break; + } + if (e & 16) /* length */ + { + c->sub.copy.get = e & 15; + c->len = t->base; + c->mode = LENEXT; + break; + } + if ((e & 64) == 0) /* next table */ + { + c->sub.code.need = e; + c->sub.code.tree = t + t->base; + break; + } + if (e & 32) /* end of block */ + { + Tracevv((stderr, "inflate: end of block\n")); + c->mode = WASH; + break; + } + c->mode = BADCODE; /* invalid code */ + z->msg = (char*)"invalid literal/length code"; + r = Z_DATA_ERROR; + LEAVE + case LENEXT: /* i: getting length extra (have base) */ + j = c->sub.copy.get; + NEEDBITS(j) + c->len += (uInt)b & inflate_mask[j]; + DUMPBITS(j) + c->sub.code.need = c->dbits; + c->sub.code.tree = c->dtree; + Tracevv((stderr, "inflate: length %u\n", c->len)); + c->mode = DIST; + case DIST: /* i: get distance next */ + j = c->sub.code.need; + NEEDBITS(j) + t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); + DUMPBITS(t->bits) + e = (uInt)(t->exop); + if (e & 16) /* distance */ + { + c->sub.copy.get = e & 15; + c->sub.copy.dist = t->base; + c->mode = DISTEXT; + break; + } + if ((e & 64) == 0) /* next table */ + { + c->sub.code.need = e; + c->sub.code.tree = t + t->base; + break; + } + c->mode = BADCODE; /* invalid code */ + z->msg = (char*)"invalid distance code"; + r = Z_DATA_ERROR; + LEAVE + case DISTEXT: /* i: getting distance extra */ + j = c->sub.copy.get; + NEEDBITS(j) + c->sub.copy.dist += (uInt)b & inflate_mask[j]; + DUMPBITS(j) + Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); + c->mode = COPY; + case COPY: /* o: copying bytes in window, waiting for space */ + f = q - c->sub.copy.dist; + while (f < s->window) /* modulo window size-"while" instead */ + f += s->end - s->window; /* of "if" handles invalid distances */ + while (c->len) + { + NEEDOUT + OUTBYTE(*f++) + if (f == s->end) + f = s->window; + c->len--; + } + c->mode = START; + break; + case LIT: /* o: got literal, waiting for output space */ + NEEDOUT + OUTBYTE(c->sub.lit) + c->mode = START; + break; + case WASH: /* o: got eob, possibly more output */ + if (k > 7) /* return unused byte, if any */ + { + Assert(k < 16, "inflate_codes grabbed too many bytes") + k -= 8; + n++; + p--; /* can always return one */ + } + FLUSH + if (s->read != s->write) + LEAVE + c->mode = END; + case END: + r = Z_STREAM_END; + LEAVE + case BADCODE: /* x: got error */ + r = Z_DATA_ERROR; + LEAVE + default: + r = Z_STREAM_ERROR; + LEAVE + } +#ifdef NEED_DUMMY_RETURN + return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ +#endif +} + + +local void inflate_codes_free( /* c, z) */ +inflate_codes_statef *c, +z_streamp z ) +{ + ZFREE(z, c); + Tracev((stderr, "inflate: codes free\n")); +} diff --git a/src/3rdparty/freetype/src/gzip/infcodes.h b/src/3rdparty/freetype/src/gzip/infcodes.h new file mode 100644 index 0000000000..154d7f896c --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/infcodes.h @@ -0,0 +1,31 @@ +/* infcodes.h -- header to use infcodes.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFCODES_H +#define _INFCODES_H + +struct inflate_codes_state; +typedef struct inflate_codes_state FAR inflate_codes_statef; + +local inflate_codes_statef *inflate_codes_new OF(( + uInt, uInt, + inflate_huft *, inflate_huft *, + z_streamp )); + +local int inflate_codes OF(( + inflate_blocks_statef *, + z_streamp , + int)); + +local void inflate_codes_free OF(( + inflate_codes_statef *, + z_streamp )); + +#endif /* _INFCODES_H */ diff --git a/src/3rdparty/freetype/src/gzip/inffixed.h b/src/3rdparty/freetype/src/gzip/inffixed.h new file mode 100644 index 0000000000..4d4760ea00 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/inffixed.h @@ -0,0 +1,151 @@ +/* inffixed.h -- table for decoding fixed codes + * Generated automatically by the maketree.c program + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +local const uInt fixed_bl = 9; +local const uInt fixed_bd = 5; +local const inflate_huft fixed_tl[] = { + {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, + {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, + {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, + {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224}, + {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144}, + {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208}, + {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176}, + {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240}, + {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, + {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200}, + {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168}, + {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232}, + {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152}, + {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216}, + {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184}, + {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248}, + {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, + {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196}, + {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164}, + {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228}, + {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148}, + {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212}, + {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180}, + {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244}, + {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204}, + {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172}, + {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236}, + {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156}, + {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220}, + {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188}, + {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252}, + {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, + {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194}, + {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162}, + {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226}, + {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146}, + {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210}, + {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178}, + {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242}, + {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, + {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202}, + {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170}, + {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234}, + {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154}, + {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218}, + {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186}, + {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250}, + {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, + {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198}, + {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166}, + {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230}, + {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150}, + {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214}, + {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182}, + {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246}, + {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206}, + {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174}, + {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238}, + {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158}, + {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222}, + {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190}, + {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254}, + {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, + {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193}, + {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161}, + {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225}, + {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145}, + {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209}, + {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177}, + {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241}, + {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, + {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201}, + {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169}, + {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233}, + {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153}, + {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217}, + {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185}, + {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249}, + {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, + {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197}, + {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165}, + {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229}, + {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149}, + {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213}, + {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181}, + {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245}, + {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205}, + {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173}, + {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237}, + {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157}, + {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221}, + {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189}, + {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253}, + {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, + {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195}, + {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163}, + {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227}, + {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147}, + {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211}, + {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179}, + {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243}, + {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, + {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203}, + {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171}, + {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235}, + {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155}, + {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219}, + {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187}, + {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251}, + {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, + {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199}, + {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167}, + {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231}, + {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151}, + {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215}, + {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183}, + {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247}, + {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207}, + {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175}, + {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239}, + {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159}, + {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223}, + {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, + {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} + }; +local const inflate_huft fixed_td[] = { + {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, + {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, + {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, + {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577}, + {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145}, + {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577}, + {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289}, + {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577} + }; diff --git a/src/3rdparty/freetype/src/gzip/inflate.c b/src/3rdparty/freetype/src/gzip/inflate.c new file mode 100644 index 0000000000..8877fa3eb2 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/inflate.c @@ -0,0 +1,273 @@ +/* inflate.c -- zlib interface to inflate modules + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" + +#define DONE INFLATE_DONE +#define BAD INFLATE_BAD + +typedef enum { + METHOD, /* waiting for method byte */ + FLAG, /* waiting for flag byte */ + DICT4, /* four dictionary check bytes to go */ + DICT3, /* three dictionary check bytes to go */ + DICT2, /* two dictionary check bytes to go */ + DICT1, /* one dictionary check byte to go */ + DICT0, /* waiting for inflateSetDictionary */ + BLOCKS, /* decompressing blocks */ + CHECK4, /* four check bytes to go */ + CHECK3, /* three check bytes to go */ + CHECK2, /* two check bytes to go */ + CHECK1, /* one check byte to go */ + DONE, /* finished check, done */ + BAD} /* got an error--stay here */ +inflate_mode; + +/* inflate private state */ +struct internal_state { + + /* mode */ + inflate_mode mode; /* current inflate mode */ + + /* mode dependent information */ + union { + uInt method; /* if FLAGS, method byte */ + struct { + uLong was; /* computed check value */ + uLong need; /* stream check value */ + } check; /* if CHECK, check values to compare */ + uInt marker; /* if BAD, inflateSync's marker bytes count */ + } sub; /* submode */ + + /* mode independent information */ + int nowrap; /* flag for no wrapper */ + uInt wbits; /* log2(window size) (8..15, defaults to 15) */ + inflate_blocks_statef + *blocks; /* current inflate_blocks state */ + +}; + + +ZEXPORT(int) inflateReset( /* z) */ +z_streamp z ) +{ + if (z == Z_NULL || z->state == Z_NULL) + return Z_STREAM_ERROR; + z->total_in = z->total_out = 0; + z->msg = Z_NULL; + z->state->mode = z->state->nowrap ? BLOCKS : METHOD; + inflate_blocks_reset(z->state->blocks, z, Z_NULL); + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + + +ZEXPORT(int) inflateEnd( /* z) */ +z_streamp z ) +{ + if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) + return Z_STREAM_ERROR; + if (z->state->blocks != Z_NULL) + inflate_blocks_free(z->state->blocks, z); + ZFREE(z, z->state); + z->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + + +ZEXPORT(int) inflateInit2_( /* z, w, version, stream_size) */ +z_streamp z, +int w, +const char *version, +int stream_size ) +{ + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != sizeof(z_stream)) + return Z_VERSION_ERROR; + + /* initialize state */ + if (z == Z_NULL) + return Z_STREAM_ERROR; + z->msg = Z_NULL; + if (z->zalloc == Z_NULL) + { + z->zalloc = zcalloc; + z->opaque = (voidpf)0; + } + if (z->zfree == Z_NULL) z->zfree = zcfree; + if ((z->state = (struct internal_state FAR *) + ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) + return Z_MEM_ERROR; + z->state->blocks = Z_NULL; + + /* handle undocumented nowrap option (no zlib header or check) */ + z->state->nowrap = 0; + if (w < 0) + { + w = - w; + z->state->nowrap = 1; + } + + /* set window size */ + if (w < 8 || w > 15) + { + inflateEnd(z); + return Z_STREAM_ERROR; + } + z->state->wbits = (uInt)w; + + /* create inflate_blocks state */ + if ((z->state->blocks = + inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) + == Z_NULL) + { + inflateEnd(z); + return Z_MEM_ERROR; + } + Tracev((stderr, "inflate: allocated\n")); + + /* reset state */ + inflateReset(z); + return Z_OK; +} + + + +#undef NEEDBYTE +#define NEEDBYTE {if(z->avail_in==0)return r;r=f;} + +#undef NEXTBYTE +#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) + + +ZEXPORT(int) inflate( /* z, f) */ +z_streamp z, +int f ) +{ + int r; + uInt b; + + if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) + return Z_STREAM_ERROR; + f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; + r = Z_BUF_ERROR; + while (1) switch (z->state->mode) + { + case METHOD: + NEEDBYTE + if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) + { + z->state->mode = BAD; + z->msg = (char*)"unknown compression method"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + if ((z->state->sub.method >> 4) + 8 > z->state->wbits) + { + z->state->mode = BAD; + z->msg = (char*)"invalid window size"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + z->state->mode = FLAG; + case FLAG: + NEEDBYTE + b = NEXTBYTE; + if (((z->state->sub.method << 8) + b) % 31) + { + z->state->mode = BAD; + z->msg = (char*)"incorrect header check"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + Tracev((stderr, "inflate: zlib header ok\n")); + if (!(b & PRESET_DICT)) + { + z->state->mode = BLOCKS; + break; + } + z->state->mode = DICT4; + case DICT4: + NEEDBYTE + z->state->sub.check.need = (uLong)NEXTBYTE << 24; + z->state->mode = DICT3; + case DICT3: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 16; + z->state->mode = DICT2; + case DICT2: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 8; + z->state->mode = DICT1; + case DICT1: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE; + z->adler = z->state->sub.check.need; + z->state->mode = DICT0; + return Z_NEED_DICT; + case DICT0: + z->state->mode = BAD; + z->msg = (char*)"need dictionary"; + z->state->sub.marker = 0; /* can try inflateSync */ + return Z_STREAM_ERROR; + case BLOCKS: + r = inflate_blocks(z->state->blocks, z, r); + if (r == Z_DATA_ERROR) + { + z->state->mode = BAD; + z->state->sub.marker = 0; /* can try inflateSync */ + break; + } + if (r == Z_OK) + r = f; + if (r != Z_STREAM_END) + return r; + r = f; + inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); + if (z->state->nowrap) + { + z->state->mode = DONE; + break; + } + z->state->mode = CHECK4; + case CHECK4: + NEEDBYTE + z->state->sub.check.need = (uLong)NEXTBYTE << 24; + z->state->mode = CHECK3; + case CHECK3: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 16; + z->state->mode = CHECK2; + case CHECK2: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 8; + z->state->mode = CHECK1; + case CHECK1: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE; + + if (z->state->sub.check.was != z->state->sub.check.need) + { + z->state->mode = BAD; + z->msg = (char*)"incorrect data check"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + Tracev((stderr, "inflate: zlib check ok\n")); + z->state->mode = DONE; + case DONE: + return Z_STREAM_END; + case BAD: + return Z_DATA_ERROR; + default: + return Z_STREAM_ERROR; + } +#ifdef NEED_DUMMY_RETURN + return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ +#endif +} + diff --git a/src/3rdparty/freetype/src/gzip/inftrees.c b/src/3rdparty/freetype/src/gzip/inftrees.c new file mode 100644 index 0000000000..ef53652168 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/inftrees.c @@ -0,0 +1,468 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#if !defined(BUILDFIXED) && !defined(STDC) +# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */ +#endif + + +#if 0 +local const char inflate_copyright[] = + " inflate 1.1.4 Copyright 1995-2002 Mark Adler "; +#endif +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + + +local int huft_build OF(( + uIntf *, /* code lengths in bits */ + uInt, /* number of codes */ + uInt, /* number of "simple" codes */ + const uIntf *, /* list of base values for non-simple codes */ + const uIntf *, /* list of extra bits for non-simple codes */ + inflate_huft * FAR*,/* result: starting table */ + uIntf *, /* maximum lookup bits (returns actual) */ + inflate_huft *, /* space for trees */ + uInt *, /* hufts used in space */ + uIntf * )); /* space for values */ + +/* Tables for deflate from PKZIP's appnote.txt. */ +local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + /* see note #13 above about 258 */ +local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ +local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577}; +local const uInt cpdext[30] = { /* Extra bits for distance codes */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + +/* + Huffman code decoding is performed using a multi-level table lookup. + The fastest way to decode is to simply build a lookup table whose + size is determined by the longest code. However, the time it takes + to build this table can also be a factor if the data being decoded + is not very long. The most common codes are necessarily the + shortest codes, so those codes dominate the decoding time, and hence + the speed. The idea is you can have a shorter table that decodes the + shorter, more probable codes, and then point to subsidiary tables for + the longer codes. The time it costs to decode the longer codes is + then traded against the time it takes to make longer tables. + + This results of this trade are in the variables lbits and dbits + below. lbits is the number of bits the first level table for literal/ + length codes can decode in one step, and dbits is the same thing for + the distance codes. Subsequent tables are also less than or equal to + those sizes. These values may be adjusted either when all of the + codes are shorter than that, in which case the longest code length in + bits is used, or when the shortest code is *longer* than the requested + table size, in which case the length of the shortest code in bits is + used. + + There are two different values for the two tables, since they code a + different number of possibilities each. The literal/length table + codes 286 possible values, or in a flat code, a little over eight + bits. The distance table codes 30 possible values, or a little less + than five bits, flat. The optimum values for speed end up being + about one bit more than those, so lbits is 8+1 and dbits is 5+1. + The optimum values may differ though from machine to machine, and + possibly even between compilers. Your mileage may vary. + */ + + +/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ +#define BMAX 15 /* maximum bit length of any code */ + +local int huft_build( /* b, n, s, d, e, t, m, hp, hn, v) */ +uIntf *b, /* code lengths in bits (all assumed <= BMAX) */ +uInt n, /* number of codes (assumed <= 288) */ +uInt s, /* number of simple-valued codes (0..s-1) */ +const uIntf *d, /* list of base values for non-simple codes */ +const uIntf *e, /* list of extra bits for non-simple codes */ +inflate_huft * FAR *t, /* result: starting table */ +uIntf *m, /* maximum lookup bits, returns actual */ +inflate_huft *hp, /* space for trees */ +uInt *hn, /* hufts used in space */ +uIntf *v /* working area: values in order of bit length */ +/* Given a list of code lengths and a maximum table size, make a set of + tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR + if the given code set is incomplete (the tables are still built in this + case), or Z_DATA_ERROR if the input is invalid. */ +) +{ + + uInt a; /* counter for codes of length k */ + uInt c[BMAX+1]; /* bit length count table */ + uInt f; /* i repeats in table every f entries */ + int g; /* maximum code length */ + int h; /* table level */ + register uInt i; /* counter, current code */ + register uInt j; /* counter */ + register int k; /* number of bits in current code */ + int l; /* bits per table (returned in m) */ + uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ + register uIntf *p; /* pointer into c[], b[], or v[] */ + inflate_huft *q; /* points to current table */ + struct inflate_huft_s r; /* table entry for structure assignment */ + inflate_huft *u[BMAX]; /* table stack */ + register int w; /* bits before this table == (l * h) */ + uInt x[BMAX+1]; /* bit offsets, then code stack */ + uIntf *xp; /* pointer into x */ + int y; /* number of dummy codes added */ + uInt z; /* number of entries in current table */ + + + /* Make compiler happy */ + r.base = 0; + + /* Generate counts for each bit length */ + p = c; +#define C0 *p++ = 0; +#define C2 C0 C0 C0 C0 +#define C4 C2 C2 C2 C2 + C4 /* clear c[]--assume BMAX+1 is 16 */ + p = b; i = n; + do { + c[*p++]++; /* assume all entries <= BMAX */ + } while (--i); + if (c[0] == n) /* null input--all zero length codes */ + { + *t = (inflate_huft *)Z_NULL; + *m = 0; + return Z_OK; + } + + + /* Find minimum and maximum length, bound *m by those */ + l = *m; + for (j = 1; j <= BMAX; j++) + if (c[j]) + break; + k = j; /* minimum code length */ + if ((uInt)l < j) + l = j; + for (i = BMAX; i; i--) + if (c[i]) + break; + g = i; /* maximum code length */ + if ((uInt)l > i) + l = i; + *m = l; + + + /* Adjust last length count to fill out codes, if needed */ + for (y = 1 << j; j < i; j++, y <<= 1) + if ((y -= c[j]) < 0) + return Z_DATA_ERROR; + if ((y -= c[i]) < 0) + return Z_DATA_ERROR; + c[i] += y; + + + /* Generate starting offsets into the value table for each length */ + x[1] = j = 0; + p = c + 1; xp = x + 2; + while (--i) { /* note that i == g from above */ + *xp++ = (j += *p++); + } + + + /* Make a table of values in order of bit lengths */ + p = b; i = 0; + do { + if ((j = *p++) != 0) + v[x[j]++] = i; + } while (++i < n); + n = x[g]; /* set n to length of v */ + + + /* Generate the Huffman codes and for each, make the table entries */ + x[0] = i = 0; /* first Huffman code is zero */ + p = v; /* grab values in bit order */ + h = -1; /* no tables yet--level -1 */ + w = -l; /* bits decoded == (l * h) */ + u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ + q = (inflate_huft *)Z_NULL; /* ditto */ + z = 0; /* ditto */ + + /* go through the bit lengths (k already is bits in shortest code) */ + for (; k <= g; k++) + { + a = c[k]; + while (a--) + { + /* here i is the Huffman code of length k bits for value *p */ + /* make tables up to required level */ + while (k > w + l) + { + h++; + w += l; /* previous table always l bits */ + + /* compute minimum size table less than or equal to l bits */ + z = g - w; + z = z > (uInt)l ? (uInt)l : z; /* table size upper limit */ + if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ + { /* too few codes for k-w bit table */ + f -= a + 1; /* deduct codes from patterns left */ + xp = c + k; + if (j < z) + while (++j < z) /* try smaller tables up to z bits */ + { + if ((f <<= 1) <= *++xp) + break; /* enough codes to use up j bits */ + f -= *xp; /* else deduct codes from patterns */ + } + } + z = 1 << j; /* table entries for j-bit table */ + + /* allocate new table */ + if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ + return Z_DATA_ERROR; /* overflow of MANY */ + u[h] = q = hp + *hn; + *hn += z; + + /* connect to last table, if there is one */ + if (h) + { + x[h] = i; /* save pattern for backing up */ + r.bits = (Byte)l; /* bits to dump before this table */ + r.exop = (Byte)j; /* bits in this table */ + j = i >> (w - l); + r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ + u[h-1][j] = r; /* connect to last table */ + } + else + *t = q; /* first table is returned result */ + } + + /* set up table entry in r */ + r.bits = (Byte)(k - w); + if (p >= v + n) + r.exop = 128 + 64; /* out of values--invalid code */ + else if (*p < s) + { + r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ + r.base = *p++; /* simple code is just the value */ + } + else + { + r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ + r.base = d[*p++ - s]; + } + + /* fill code-like entries with r */ + f = 1 << (k - w); + for (j = i >> w; j < z; j += f) + q[j] = r; + + /* backwards increment the k-bit code i */ + for (j = 1 << (k - 1); i & j; j >>= 1) + i ^= j; + i ^= j; + + /* backup over finished tables */ + mask = (1 << w) - 1; /* needed on HP, cc -O bug */ + while ((i & mask) != x[h]) + { + h--; /* don't need to update q */ + w -= l; + mask = (1 << w) - 1; + } + } + } + + + /* Return Z_BUF_ERROR if we were given an incomplete table */ + return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; +} + + +local int inflate_trees_bits( /* c, bb, tb, hp, z) */ +uIntf *c, /* 19 code lengths */ +uIntf *bb, /* bits tree desired/actual depth */ +inflate_huft * FAR *tb, /* bits tree result */ +inflate_huft *hp, /* space for trees */ +z_streamp z /* for messages */ +) +{ + int r; + uInt hn = 0; /* hufts used in space */ + uIntf *v; /* work area for huft_build */ + + if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, + tb, bb, hp, &hn, v); + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed dynamic bit lengths tree"; + else if (r == Z_BUF_ERROR || *bb == 0) + { + z->msg = (char*)"incomplete dynamic bit lengths tree"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; +} + + +local int inflate_trees_dynamic( /* nl, nd, c, bl, bd, tl, td, hp, z) */ +uInt nl, /* number of literal/length codes */ +uInt nd, /* number of distance codes */ +uIntf *c, /* that many (total) code lengths */ +uIntf *bl, /* literal desired/actual bit depth */ +uIntf *bd, /* distance desired/actual bit depth */ +inflate_huft * FAR *tl, /* literal/length tree result */ +inflate_huft * FAR *td, /* distance tree result */ +inflate_huft *hp, /* space for trees */ +z_streamp z /* for messages */ +) +{ + int r; + uInt hn = 0; /* hufts used in space */ + uIntf *v; /* work area for huft_build */ + + /* allocate work area */ + if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + + /* build literal/length tree */ + r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); + if (r != Z_OK || *bl == 0) + { + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed literal/length tree"; + else if (r != Z_MEM_ERROR) + { + z->msg = (char*)"incomplete literal/length tree"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; + } + + /* build distance tree */ + r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); + if (r != Z_OK || (*bd == 0 && nl > 257)) + { + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed distance tree"; + else if (r == Z_BUF_ERROR) { +#if 0 + { +#endif +#ifdef PKZIP_BUG_WORKAROUND + r = Z_OK; + } +#else + z->msg = (char*)"incomplete distance tree"; + r = Z_DATA_ERROR; + } + else if (r != Z_MEM_ERROR) + { + z->msg = (char*)"empty distance tree with lengths"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; +#endif + } + + /* done */ + ZFREE(z, v); + return Z_OK; +} + + +/* build fixed tables only once--keep them here */ +#ifdef BUILDFIXED +local int fixed_built = 0; +#define FIXEDH 544 /* number of hufts used by fixed tables */ +local inflate_huft fixed_mem[FIXEDH]; +local uInt fixed_bl; +local uInt fixed_bd; +local inflate_huft *fixed_tl; +local inflate_huft *fixed_td; +#else +#include "inffixed.h" +#endif + + +local int inflate_trees_fixed( /* bl, bd, tl, td, z) */ +uIntf *bl, /* literal desired/actual bit depth */ +uIntf *bd, /* distance desired/actual bit depth */ +const inflate_huft * FAR *tl, /* literal/length tree result */ +const inflate_huft * FAR *td, /* distance tree result */ +z_streamp z /* for memory allocation */ +) +{ +#ifdef BUILDFIXED + /* build fixed tables if not already */ + if (!fixed_built) + { + int k; /* temporary variable */ + uInt f = 0; /* number of hufts used in fixed_mem */ + uIntf *c; /* length list for huft_build */ + uIntf *v; /* work area for huft_build */ + + /* allocate memory */ + if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + { + ZFREE(z, c); + return Z_MEM_ERROR; + } + + /* literal table */ + for (k = 0; k < 144; k++) + c[k] = 8; + for (; k < 256; k++) + c[k] = 9; + for (; k < 280; k++) + c[k] = 7; + for (; k < 288; k++) + c[k] = 8; + fixed_bl = 9; + huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, + fixed_mem, &f, v); + + /* distance table */ + for (k = 0; k < 30; k++) + c[k] = 5; + fixed_bd = 5; + huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, + fixed_mem, &f, v); + + /* done */ + ZFREE(z, v); + ZFREE(z, c); + fixed_built = 1; + } +#else + FT_UNUSED(z); +#endif + *bl = fixed_bl; + *bd = fixed_bd; + *tl = fixed_tl; + *td = fixed_td; + return Z_OK; +} diff --git a/src/3rdparty/freetype/src/gzip/inftrees.h b/src/3rdparty/freetype/src/gzip/inftrees.h new file mode 100644 index 0000000000..07bf2aa0bf --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/inftrees.h @@ -0,0 +1,63 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Huffman code lookup table entry--this entry is four bytes for machines + that have 16-bit pointers (e.g. PC's in the small or medium model). */ + +#ifndef _INFTREES_H +#define _INFTREES_H + +typedef struct inflate_huft_s FAR inflate_huft; + +struct inflate_huft_s { + union { + struct { + Byte Exop; /* number of extra bits or operation */ + Byte Bits; /* number of bits in this code or subcode */ + } what; + uInt pad; /* pad structure to a power of 2 (4 bytes for */ + } word; /* 16-bit, 8 bytes for 32-bit int's) */ + uInt base; /* literal, length base, distance base, + or table offset */ +}; + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1004 huft structures (850 for length/literals + and 154 for distances, the latter actually the result of an + exhaustive search). The actual maximum is not known, but the + value below is more than safe. */ +#define MANY 1440 + +local int inflate_trees_bits OF(( + uIntf *, /* 19 code lengths */ + uIntf *, /* bits tree desired/actual depth */ + inflate_huft * FAR *, /* bits tree result */ + inflate_huft *, /* space for trees */ + z_streamp)); /* for messages */ + +local int inflate_trees_dynamic OF(( + uInt, /* number of literal/length codes */ + uInt, /* number of distance codes */ + uIntf *, /* that many (total) code lengths */ + uIntf *, /* literal desired/actual bit depth */ + uIntf *, /* distance desired/actual bit depth */ + inflate_huft * FAR *, /* literal/length tree result */ + inflate_huft * FAR *, /* distance tree result */ + inflate_huft *, /* space for trees */ + z_streamp)); /* for messages */ + +local int inflate_trees_fixed OF(( + uIntf *, /* literal desired/actual bit depth */ + uIntf *, /* distance desired/actual bit depth */ + const inflate_huft * FAR *, /* literal/length tree result */ + const inflate_huft * FAR *, /* distance tree result */ + z_streamp)); /* for memory allocation */ + +#endif /* _INFTREES_H */ diff --git a/src/3rdparty/freetype/src/gzip/infutil.c b/src/3rdparty/freetype/src/gzip/infutil.c new file mode 100644 index 0000000000..6087b40647 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/infutil.c @@ -0,0 +1,86 @@ +/* inflate_util.c -- data and routines common to blocks and codes + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" +#include "inftrees.h" +#include "infcodes.h" +#include "infutil.h" + + +/* And'ing with mask[n] masks the lower n bits */ +local const uInt inflate_mask[17] = { + 0x0000, + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +}; + + +/* copy as much as possible from the sliding window to the output area */ +local int inflate_flush( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt n; + Bytef *p; + Bytef *q; + + /* local copies of source and destination pointers */ + p = z->next_out; + q = s->read; + + /* compute number of bytes to copy as far as end of window */ + n = (uInt)((q <= s->write ? s->write : s->end) - q); + if (n > z->avail_out) n = z->avail_out; + if (n && r == Z_BUF_ERROR) r = Z_OK; + + /* update counters */ + z->avail_out -= n; + z->total_out += n; + + /* update check information */ + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(s->check, q, n); + + /* copy as far as end of window */ + zmemcpy(p, q, n); + p += n; + q += n; + + /* see if more to copy at beginning of window */ + if (q == s->end) + { + /* wrap pointers */ + q = s->window; + if (s->write == s->end) + s->write = s->window; + + /* compute bytes to copy */ + n = (uInt)(s->write - q); + if (n > z->avail_out) n = z->avail_out; + if (n && r == Z_BUF_ERROR) r = Z_OK; + + /* update counters */ + z->avail_out -= n; + z->total_out += n; + + /* update check information */ + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(s->check, q, n); + + /* copy */ + zmemcpy(p, q, n); + p += n; + q += n; + } + + /* update pointers */ + z->next_out = p; + s->read = q; + + /* done */ + return r; +} diff --git a/src/3rdparty/freetype/src/gzip/infutil.h b/src/3rdparty/freetype/src/gzip/infutil.h new file mode 100644 index 0000000000..7174b6dd0f --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/infutil.h @@ -0,0 +1,98 @@ +/* infutil.h -- types and macros common to blocks and codes + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFUTIL_H +#define _INFUTIL_H + +typedef enum { + TYPE, /* get type bits (3, including end bit) */ + LENS, /* get lengths for stored */ + STORED, /* processing stored block */ + TABLE, /* get table lengths */ + BTREE, /* get bit lengths tree for a dynamic block */ + DTREE, /* get length, distance trees for a dynamic block */ + CODES, /* processing fixed or dynamic block */ + DRY, /* output remaining window bytes */ + DONE, /* finished last block, done */ + BAD} /* got a data error--stuck here */ +inflate_block_mode; + +/* inflate blocks semi-private state */ +struct inflate_blocks_state { + + /* mode */ + inflate_block_mode mode; /* current inflate_block mode */ + + /* mode dependent information */ + union { + uInt left; /* if STORED, bytes left to copy */ + struct { + uInt table; /* table lengths (14 bits) */ + uInt index; /* index into blens (or border) */ + uIntf *blens; /* bit lengths of codes */ + uInt bb; /* bit length tree depth */ + inflate_huft *tb; /* bit length decoding tree */ + } trees; /* if DTREE, decoding info for trees */ + struct { + inflate_codes_statef + *codes; + } decode; /* if CODES, current state */ + } sub; /* submode */ + uInt last; /* true if this block is the last block */ + + /* mode independent information */ + uInt bitk; /* bits in bit buffer */ + uLong bitb; /* bit buffer */ + inflate_huft *hufts; /* single malloc for tree space */ + Bytef *window; /* sliding window */ + Bytef *end; /* one byte after sliding window */ + Bytef *read; /* window read pointer */ + Bytef *write; /* window write pointer */ + check_func checkfn; /* check function */ + uLong check; /* check on output */ + +}; + + +/* defines for inflate input/output */ +/* update pointers and return */ +#define UPDBITS {s->bitb=b;s->bitk=k;} +#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} +#define UPDOUT {s->write=q;} +#define UPDATE {UPDBITS UPDIN UPDOUT} +#define LEAVE {UPDATE return inflate_flush(s,z,r);} +/* get bytes and bits */ +#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} +#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} +#define NEXTBYTE (n--,*p++) +#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} +#define DUMPBITS(j) {b>>=(j);k-=(j);} +/* output bytes */ +#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) +#define LOADOUT {q=s->write;m=(uInt)WAVAIL;} +#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} +#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} +#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} +#define OUTBYTE(a) {*q++=(Byte)(a);m--;} +/* load local pointers */ +#define LOAD {LOADIN LOADOUT} + +/* masks for lower bits (size given to avoid silly warnings with Visual C++) */ +#ifndef NO_INFLATE_MASK +local uInt inflate_mask[17]; +#endif + +/* copy as much as possible from the sliding window to the output area */ +local int inflate_flush OF(( + inflate_blocks_statef *, + z_streamp , + int)); + +#endif diff --git a/src/3rdparty/freetype/src/gzip/rules.mk b/src/3rdparty/freetype/src/gzip/rules.mk new file mode 100644 index 0000000000..d2a43a6a89 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/rules.mk @@ -0,0 +1,75 @@ +# +# FreeType 2 GZip support configuration rules +# + + +# Copyright 2002, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# gzip driver directory +# +GZIP_DIR := $(SRC_DIR)/gzip + + +# compilation flags for the driver +# +ifeq ($(SYSTEM_ZLIB),) + GZIP_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GZIP_DIR)) +else + GZIP_COMPILE := $(FT_COMPILE) +endif + + +# gzip support sources (i.e., C files) +# +GZIP_DRV_SRC := $(GZIP_DIR)/ftgzip.c + +# gzip support headers +# +GZIP_DRV_H := + + +# gzip driver object(s) +# +# GZIP_DRV_OBJ_M is used during `multi' builds +# GZIP_DRV_OBJ_S is used during `single' builds +# +ifeq ($(SYSTEM_ZLIB),) + GZIP_DRV_OBJ_M := $(GZIP_DRV_SRC:$(GZIP_DIR)/%.c=$(OBJ_DIR)/%.$O) +else + GZIP_DRV_OBJ_M := $(OBJ_DIR)/ftgzip.$O +endif +GZIP_DRV_OBJ_S := $(OBJ_DIR)/ftgzip.$O + +# gzip support source file for single build +# +GZIP_DRV_SRC_S := $(GZIP_DIR)/ftgzip.c + + +# gzip support - single object +# +$(GZIP_DRV_OBJ_S): $(GZIP_DRV_SRC_S) $(GZIP_DRV_SRC) $(FREETYPE_H) \ + $(GZIP_DRV_H) + $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GZIP_DRV_SRC_S)) + + +# gzip support - multiple objects +# +$(OBJ_DIR)/%.$O: $(GZIP_DIR)/%.c $(FREETYPE_H) $(GZIP_DRV_H) + $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(GZIP_DRV_OBJ_S) +DRV_OBJS_M += $(GZIP_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/gzip/zconf.h b/src/3rdparty/freetype/src/gzip/zconf.h new file mode 100644 index 0000000000..2030a7e8d4 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/zconf.h @@ -0,0 +1,285 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: zconf.h,v 1.4 2007/06/01 06:56:17 wl Exp $ */ + +#if defined(__ARMCC__) || defined(__CC_ARM) +/* Ultra ugly hack that convinces RVCT to use the systems zlib */ +#include <stdapis/zconf.h> +#else /* defined(__ARMCC__) || defined(__CC_ARM) */ + +#ifndef _ZCONF_H +#define _ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateReset z_inflateReset +# define compress z_compress +# define compress2 z_compress2 +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table + +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +# define WIN32 +#endif +#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) +# ifndef __32BIT__ +# define __32BIT__ +# endif +#endif +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#if defined(MSDOS) && !defined(__32BIT__) +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) +# define STDC +#endif +#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) +# ifndef STDC +# define STDC +# endif +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Old Borland C and LCC incorrectly complains about missing returns: */ +#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) +# define NEED_DUMMY_RETURN +#endif + +#if defined(__LCC__) +# define NEED_DUMMY_RETURN +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +#endif +#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) +# ifndef __32BIT__ +# define SMALL_MEDIUM +# define FAR _far +# endif +#endif + +/* Compile with -DZLIB_DLL for Windows DLL support */ +#if defined(ZLIB_DLL) +# if defined(_WINDOWS) || defined(WINDOWS) +# ifdef FAR +# undef FAR +# endif +# include <windows.h> +# define ZEXPORT(x) x WINAPI +# ifdef WIN32 +# define ZEXPORTVA(x) x WINAPIV +# else +# define ZEXPORTVA(x) x FAR _cdecl _export +# endif +# endif +# if defined (__BORLANDC__) +# if (__BORLANDC__ >= 0x0500) && defined (WIN32) +# include <windows.h> +# define ZEXPORT(x) x __declspec(dllexport) WINAPI +# define ZEXPORTRVA(x) x __declspec(dllexport) WINAPIV +# else +# if defined (_Windows) && defined (__DLL__) +# define ZEXPORT(x) x _export +# define ZEXPORTVA(x) x _export +# endif +# endif +# endif +#endif + + +#ifndef ZEXPORT +# define ZEXPORT(x) static x +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA(x) static x +#endif +#ifndef ZEXTERN +# define ZEXTERN(x) static x +#endif +#ifndef ZEXTERNDEF +# define ZEXTERNDEF(x) static x +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(MACOS) && !defined(TARGET_OS_MAC) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#ifdef HAVE_UNISTD_H +# include <sys/types.h> /* for off_t */ +# include <unistd.h> /* for SEEK_* and off_t */ +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(inflate_blocks,"INBL") +# pragma map(inflate_blocks_new,"INBLNE") +# pragma map(inflate_blocks_free,"INBLFR") +# pragma map(inflate_blocks_reset,"INBLRE") +# pragma map(inflate_codes_free,"INCOFR") +# pragma map(inflate_codes,"INCO") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_flush,"INFLU") +# pragma map(inflate_mask,"INMA") +# pragma map(inflate_set_dictionary,"INSEDI2") +# pragma map(inflate_copyright,"INCOPY") +# pragma map(inflate_trees_bits,"INTRBI") +# pragma map(inflate_trees_dynamic,"INTRDY") +# pragma map(inflate_trees_fixed,"INTRFI") +# pragma map(inflate_trees_free,"INTRFR") +#endif + +#endif /* _ZCONF_H */ + +#endif /* defined(__ARMCC__) || defined(__CC_ARM) */ diff --git a/src/3rdparty/freetype/src/gzip/zlib.h b/src/3rdparty/freetype/src/gzip/zlib.h new file mode 100644 index 0000000000..0f98fdcbd3 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/zlib.h @@ -0,0 +1,837 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.1.4, March 11th, 2002 + + Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#if defined(__ARMCC__) || defined(__CC_ARM) +/* Ultra ugly hack that convinces RVCT to use the systems zlib */ +#include <stdapis/zlib.h> +#else /* defined(__ARMCC__) || defined(__CC_ARM) */ + +#ifndef _ZLIB_H +#define _ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.1.4" + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: ascii or binary */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +/* Allowed flush values; see deflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_ASCII 1 +#define Z_UNKNOWN 2 +/* Possible values of the data_type field */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + + + /* basic functions */ + +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN(int) deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + the compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + 0.1% larger than avail_in plus 12 bytes. If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update data_type if it can make a good guess about + the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). +*/ + + +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN(int) inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN(int) inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may some + introduce some output latency (reading input without producing any output) + except when forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much + output as possible to the output buffer. The flushing behavior of inflate is + not specified for values of the flush parameter other than Z_SYNC_FLUSH + and Z_FINISH, but the current implementation actually flushes as much output + as possible anyway. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster routine + may be used for the single inflate() call. + + If a preset dictionary is needed at this point (see inflateSetDictionary + below), inflate sets strm-adler to the adler32 checksum of the + dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise + it sets strm->adler to the adler32 checksum of all output produced + so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or + an error code as described below. At the end of the stream, inflate() + checks that its computed adler32 checksum is equal to that saved by the + compressor and returns Z_STREAM_END only if the checksum is correct. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect + adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent + (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if no progress is possible or if there was not + enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR + case, the application may then call inflateSync to look for a good + compression block. +*/ + + +ZEXTERN(int) inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN(int) deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match). Filtered data consists mostly of small values with a + somewhat random distribution. In this case, the compression algorithm is + tuned to compress them better. The effect of Z_FILTERED is to force more + Huffman coding and less string matching; it is somewhat intermediate + between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects + the compression ratio but not the correctness of the compressed output even + if it is not set appropriately. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. + + Upon return of this function, strm->adler is set to the Adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +/* +ZEXTERN(int) inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. If a compressed stream with a larger window size is given as + input, inflate() will return with the error code Z_DATA_ERROR instead of + trying to allocate a larger window. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative + memLevel). msg is set to null if there is no error message. inflateInit2 + does not perform any decompression apart from reading the zlib header if + present: this will be done by inflate(). (So next_in and avail_in may be + modified, but next_out and avail_out are unchanged.) +*/ + +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate + if this call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler32 value returned by this call of + inflate. The compressor and decompressor must use exactly the same + dictionary (see deflateSetDictionary). + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN(int) inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least 0.1% larger than + sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ + + +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h". (See the description + of deflateInit2 for more information about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +*/ + +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN(uLong) adler32 OF((uLong adler, const Bytef *buf, uInt len)); + +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* + Update a running crc with the bytes buf[0..len-1] and return the updated + crc. If buf is NULL, this function returns the required initial value + for the crc. Pre- and post-conditioning (one's complement) is performed + within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN(int) inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) + + +#ifdef __cplusplus +} +#endif + +#endif /* _ZLIB_H */ + +#endif /* defined(__ARMCC__) || defined(__CC_ARM) */ diff --git a/src/3rdparty/freetype/src/gzip/zutil.c b/src/3rdparty/freetype/src/gzip/zutil.c new file mode 100644 index 0000000000..5ed2da0871 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/zutil.c @@ -0,0 +1,181 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: zutil.c,v 1.3 2006/04/29 07:31:16 wl Exp $ */ + +#include "zutil.h" + +#ifndef STDC +extern void exit OF((int)); +#endif + + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifdef __TURBOC__ +#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) +/* Small and medium model in Turbo C are for now limited to near allocation + * with reduced MAX_WBITS and MAX_MEM_LEVEL + */ +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} +#endif +#endif /* __TURBOC__ */ + + +#if defined(M_I86) && !defined(__32BIT__) +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* MSC */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp ft_scalloc OF((uInt items, uInt size)); +extern void ft_sfree OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return (voidpf)ft_scalloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + ft_sfree(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/src/3rdparty/freetype/src/gzip/zutil.h b/src/3rdparty/freetype/src/gzip/zutil.h new file mode 100644 index 0000000000..8e3c69a9f0 --- /dev/null +++ b/src/3rdparty/freetype/src/gzip/zutil.h @@ -0,0 +1,215 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id: zutil.h,v 1.6 2007/06/01 06:56:17 wl Exp $ */ + +#ifndef _Z_UTIL_H +#define _Z_UTIL_H + +#include "zlib.h" + +#ifdef STDC +# include <stddef.h> +# include <string.h> +# include <stdlib.h> +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include <errno.h> +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#ifdef MSDOS +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include <alloc.h> +# endif +# else /* MSC or DJGPP */ +# endif +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +#endif + +#ifdef WIN32 /* Window 95 & Windows NT */ +# define OS_CODE 0x0b +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + ft_fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include <unix.h> /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0F +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# define fdopen(fd,type) _fdopen(fd,type) +#endif + + + /* Common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) ft_fopen((name), (mode)) +#endif + + /* functions */ + +#ifdef HAVE_STRERROR + extern char *strerror OF((int)); +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy ft_memcpy +# define zmemcmp ft_memcmp +# define zmemzero(dest, len) ft_memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include <stdio.h> + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +typedef uLong (*check_func) OF((uLong check, const Bytef *buf, + uInt len)); +local voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +local void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* _Z_UTIL_H */ diff --git a/src/3rdparty/freetype/src/lzw/Jamfile b/src/3rdparty/freetype/src/lzw/Jamfile new file mode 100644 index 0000000000..6f1f516e7c --- /dev/null +++ b/src/3rdparty/freetype/src/lzw/Jamfile @@ -0,0 +1,16 @@ +# FreeType 2 src/lzw Jamfile +# +# Copyright 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) lzw ; + +Library $(FT2_LIB) : ftlzw.c ; + +# end of src/lzw Jamfile diff --git a/src/3rdparty/freetype/src/lzw/ftlzw.c b/src/3rdparty/freetype/src/lzw/ftlzw.c new file mode 100644 index 0000000000..a00bd5012f --- /dev/null +++ b/src/3rdparty/freetype/src/lzw/ftlzw.c @@ -0,0 +1,412 @@ +/***************************************************************************/ +/* */ +/* ftlzw.c */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2004, 2005, 2006, 2009 by */ +/* Albert Chin-A-Young. */ +/* */ +/* Based on code in src/gzip/ftgzip.c, Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include FT_LZW_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX LZW_Err_ +#define FT_ERR_BASE FT_Mod_Err_LZW + +#include FT_ERRORS_H + + +#ifdef FT_CONFIG_OPTION_USE_LZW + +#include "ftzopen.h" + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_LZW_BUFFER_SIZE 4096 + + typedef struct FT_LZWFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + FT_LzwStateRec lzw; /* lzw decompressor state */ + + FT_Byte buffer[FT_LZW_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_LZWFileRec, *FT_LZWFile; + + + /* check and skip .Z header */ + static FT_Error + ft_lzw_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[2]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 2 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers */ + if ( head[0] != 0x1f || + head[1] != 0x9d ) + error = LZW_Err_Invalid_File_Format; + + Exit: + return error; + } + + + static FT_Error + ft_lzw_file_init( FT_LZWFile zip, + FT_Stream stream, + FT_Stream source ) + { + FT_LzwState lzw = &zip->lzw; + FT_Error error = LZW_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .Z header */ + { + stream = source; + + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + } + + /* initialize internal lzw variable */ + ft_lzwstate_init( lzw, source ); + + Exit: + return error; + } + + + static void + ft_lzw_file_done( FT_LZWFile zip ) + { + /* clear the rest */ + ft_lzwstate_done( &zip->lzw ); + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_lzw_file_reset( FT_LZWFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( 0 ) ) + { + ft_lzwstate_reset( &zip->lzw ); + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_lzw_file_fill_output( FT_LZWFile zip ) + { + FT_LzwState lzw = &zip->lzw; + FT_ULong count; + FT_Error error = 0; + + + zip->cursor = zip->buffer; + + count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE ); + + zip->limit = zip->cursor + count; + + if ( count == 0 ) + error = LZW_Err_Invalid_Stream_Operation; + + return error; + } + + + /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */ + static FT_Error + ft_lzw_file_skip_output( FT_LZWFile zip, + FT_ULong count ) + { + FT_Error error = LZW_Err_Ok; + + + /* first, we skip what we can from the output buffer */ + { + FT_ULong delta = (FT_ULong)( zip->limit - zip->cursor ); + + + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + } + + /* next, we skip as many bytes remaining as possible */ + while ( count > 0 ) + { + FT_ULong delta = FT_LZW_BUFFER_SIZE; + FT_ULong numread; + + + if ( delta > count ) + delta = count; + + numread = ft_lzwstate_io( &zip->lzw, NULL, delta ); + if ( numread < delta ) + { + /* not enough bytes */ + error = LZW_Err_Invalid_Stream_Operation; + break; + } + + zip->pos += delta; + count -= delta; + } + + return error; + } + + + static FT_ULong + ft_lzw_file_io( FT_LZWFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* seeking backwards. */ + if ( pos < zip->pos ) + { + /* If the new position is within the output buffer, simply */ + /* decrement pointers, otherwise we reset the stream completely! */ + if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) ) + { + zip->cursor -= zip->pos - pos; + zip->pos = pos; + } + else + { + error = ft_lzw_file_reset( zip ); + if ( error ) + goto Exit; + } + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer + result, zip->cursor, delta ); + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_lzw_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** L Z W E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_lzw_stream_close( FT_Stream stream ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize lzw file descriptor */ + ft_lzw_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static FT_ULong + ft_lzw_stream_io( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + + + return ft_lzw_file_io( zip, pos, buffer, count ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory = source->memory; + FT_LZWFile zip; + + + /* + * Check the header right now; this prevents allocation of a huge + * LZWFile object (400 KByte of heap memory) if not necessary. + * + * Did I mention that you should never use .Z compressed font + * files? + */ + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_NEW( zip ) ) + { + error = ft_lzw_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = 0; + stream->read = ft_lzw_stream_io; + stream->close = ft_lzw_stream_close; + + Exit: + return error; + } + + +#include "ftzopen.c" + + +#else /* !FT_CONFIG_OPTION_USE_LZW */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return LZW_Err_Unimplemented_Feature; + } + + +#endif /* !FT_CONFIG_OPTION_USE_LZW */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/lzw/ftzopen.c b/src/3rdparty/freetype/src/lzw/ftzopen.c new file mode 100644 index 0000000000..fc7831510d --- /dev/null +++ b/src/3rdparty/freetype/src/lzw/ftzopen.c @@ -0,0 +1,398 @@ +/***************************************************************************/ +/* */ +/* ftzopen.c */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2005, 2006, 2007 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include "ftzopen.h" +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + + + static int + ft_lzwstate_refill( FT_LzwState state ) + { + FT_ULong count; + + + if ( state->in_eof ) + return -1; + + count = FT_Stream_TryRead( state->source, + state->buf_tab, + state->num_bits ); /* WHY? */ + + state->buf_size = (FT_UInt)count; + state->buf_total += count; + state->in_eof = FT_BOOL( count < state->num_bits ); + state->buf_offset = 0; + state->buf_size = ( state->buf_size << 3 ) - ( state->num_bits - 1 ); + + if ( count == 0 ) /* end of file */ + return -1; + + return 0; + } + + + static FT_Int32 + ft_lzwstate_get_code( FT_LzwState state ) + { + FT_UInt num_bits = state->num_bits; + FT_Int offset = state->buf_offset; + FT_Byte* p; + FT_Int result; + + + if ( state->buf_clear || + offset >= state->buf_size || + state->free_ent >= state->free_bits ) + { + if ( state->free_ent >= state->free_bits ) + { + state->num_bits = ++num_bits; + state->free_bits = state->num_bits < state->max_bits + ? (FT_UInt)( ( 1UL << num_bits ) - 256 ) + : state->max_free + 1; + } + + if ( state->buf_clear ) + { + state->num_bits = num_bits = LZW_INIT_BITS; + state->free_bits = (FT_UInt)( ( 1UL << num_bits ) - 256 ); + state->buf_clear = 0; + } + + if ( ft_lzwstate_refill( state ) < 0 ) + return -1; + + offset = 0; + } + + state->buf_offset = offset + num_bits; + + p = &state->buf_tab[offset >> 3]; + offset &= 7; + result = *p++ >> offset; + offset = 8 - offset; + num_bits -= offset; + + if ( num_bits >= 8 ) + { + result |= *p++ << offset; + offset += 8; + num_bits -= 8; + } + if ( num_bits > 0 ) + result |= ( *p & LZW_MASK( num_bits ) ) << offset; + + return result; + } + + + /* grow the character stack */ + static int + ft_lzwstate_stack_grow( FT_LzwState state ) + { + if ( state->stack_top >= state->stack_size ) + { + FT_Memory memory = state->memory; + FT_Error error; + FT_UInt old_size = state->stack_size; + FT_UInt new_size = old_size; + + new_size = new_size + ( new_size >> 1 ) + 4; + + if ( state->stack == state->stack_0 ) + { + state->stack = NULL; + old_size = 0; + } + + if ( FT_RENEW_ARRAY( state->stack, old_size, new_size ) ) + return -1; + + state->stack_size = new_size; + } + return 0; + } + + + /* grow the prefix/suffix arrays */ + static int + ft_lzwstate_prefix_grow( FT_LzwState state ) + { + FT_UInt old_size = state->prefix_size; + FT_UInt new_size = old_size; + FT_Memory memory = state->memory; + FT_Error error; + + + if ( new_size == 0 ) /* first allocation -> 9 bits */ + new_size = 512; + else + new_size += new_size >> 2; /* don't grow too fast */ + + /* + * Note that the `suffix' array is located in the same memory block + * pointed to by `prefix'. + * + * I know that sizeof(FT_Byte) == 1 by definition, but it is clearer + * to write it literally. + * + */ + if ( FT_REALLOC_MULT( state->prefix, old_size, new_size, + sizeof ( FT_UShort ) + sizeof ( FT_Byte ) ) ) + return -1; + + /* now adjust `suffix' and move the data accordingly */ + state->suffix = (FT_Byte*)( state->prefix + new_size ); + + FT_MEM_MOVE( state->suffix, + state->prefix + old_size, + old_size * sizeof ( FT_Byte ) ); + + state->prefix_size = new_size; + return 0; + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_reset( FT_LzwState state ) + { + state->in_eof = 0; + state->buf_offset = 0; + state->buf_size = 0; + state->buf_clear = 0; + state->buf_total = 0; + state->stack_top = 0; + state->num_bits = LZW_INIT_BITS; + state->phase = FT_LZW_PHASE_START; + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ) + { + FT_ZERO( state ); + + state->source = source; + state->memory = source->memory; + + state->prefix = NULL; + state->suffix = NULL; + state->prefix_size = 0; + + state->stack = state->stack_0; + state->stack_size = sizeof ( state->stack_0 ); + + ft_lzwstate_reset( state ); + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_done( FT_LzwState state ) + { + FT_Memory memory = state->memory; + + + ft_lzwstate_reset( state ); + + if ( state->stack != state->stack_0 ) + FT_FREE( state->stack ); + + FT_FREE( state->prefix ); + state->suffix = NULL; + + FT_ZERO( state ); + } + + +#define FTLZW_STACK_PUSH( c ) \ + FT_BEGIN_STMNT \ + if ( state->stack_top >= state->stack_size && \ + ft_lzwstate_stack_grow( state ) < 0 ) \ + goto Eof; \ + \ + state->stack[state->stack_top++] = (FT_Byte)(c); \ + FT_END_STMNT + + + FT_LOCAL_DEF( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ) + { + FT_ULong result = 0; + + FT_UInt old_char = state->old_char; + FT_UInt old_code = state->old_code; + FT_UInt in_code = state->in_code; + + + if ( out_size == 0 ) + goto Exit; + + switch ( state->phase ) + { + case FT_LZW_PHASE_START: + { + FT_Byte max_bits; + FT_Int32 c; + + + /* skip magic bytes, and read max_bits + block_flag */ + if ( FT_Stream_Seek( state->source, 2 ) != 0 || + FT_Stream_TryRead( state->source, &max_bits, 1 ) != 1 ) + goto Eof; + + state->max_bits = max_bits & LZW_BIT_MASK; + state->block_mode = max_bits & LZW_BLOCK_MASK; + state->max_free = (FT_UInt)( ( 1UL << state->max_bits ) - 256 ); + + if ( state->max_bits > LZW_MAX_BITS ) + goto Eof; + + state->num_bits = LZW_INIT_BITS; + state->free_ent = ( state->block_mode ? LZW_FIRST + : LZW_CLEAR ) - 256; + in_code = 0; + + state->free_bits = state->num_bits < state->max_bits + ? (FT_UInt)( ( 1UL << state->num_bits ) - 256 ) + : state->max_free + 1; + + c = ft_lzwstate_get_code( state ); + if ( c < 0 ) + goto Eof; + + old_code = old_char = (FT_UInt)c; + + if ( buffer ) + buffer[result] = (FT_Byte)old_char; + + if ( ++result >= out_size ) + goto Exit; + + state->phase = FT_LZW_PHASE_CODE; + } + /* fall-through */ + + case FT_LZW_PHASE_CODE: + { + FT_Int32 c; + FT_UInt code; + + + NextCode: + c = ft_lzwstate_get_code( state ); + if ( c < 0 ) + goto Eof; + + code = (FT_UInt)c; + + if ( code == LZW_CLEAR && state->block_mode ) + { + /* why not LZW_FIRST-256 ? */ + state->free_ent = ( LZW_FIRST - 1 ) - 256; + state->buf_clear = 1; + c = ft_lzwstate_get_code( state ); + if ( c < 0 ) + goto Eof; + + code = (FT_UInt)c; + } + + in_code = code; /* save code for later */ + + if ( code >= 256U ) + { + /* special case for KwKwKwK */ + if ( code - 256U >= state->free_ent ) + { + FTLZW_STACK_PUSH( old_char ); + code = old_code; + } + + while ( code >= 256U ) + { + FTLZW_STACK_PUSH( state->suffix[code - 256] ); + code = state->prefix[code - 256]; + } + } + + old_char = code; + FTLZW_STACK_PUSH( old_char ); + + state->phase = FT_LZW_PHASE_STACK; + } + /* fall-through */ + + case FT_LZW_PHASE_STACK: + { + while ( state->stack_top > 0 ) + { + --state->stack_top; + + if ( buffer ) + buffer[result] = state->stack[state->stack_top]; + + if ( ++result == out_size ) + goto Exit; + } + + /* now create new entry */ + if ( state->free_ent < state->max_free ) + { + if ( state->free_ent >= state->prefix_size && + ft_lzwstate_prefix_grow( state ) < 0 ) + goto Eof; + + FT_ASSERT( state->free_ent < state->prefix_size ); + + state->prefix[state->free_ent] = (FT_UShort)old_code; + state->suffix[state->free_ent] = (FT_Byte) old_char; + + state->free_ent += 1; + } + + old_code = in_code; + + state->phase = FT_LZW_PHASE_CODE; + goto NextCode; + } + + default: /* state == EOF */ + ; + } + + Exit: + state->old_code = old_code; + state->old_char = old_char; + state->in_code = in_code; + + return result; + + Eof: + state->phase = FT_LZW_PHASE_EOF; + goto Exit; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/lzw/ftzopen.h b/src/3rdparty/freetype/src/lzw/ftzopen.h new file mode 100644 index 0000000000..dd602402ac --- /dev/null +++ b/src/3rdparty/freetype/src/lzw/ftzopen.h @@ -0,0 +1,171 @@ +/***************************************************************************/ +/* */ +/* ftzopen.h */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2005, 2006, 2007, 2008 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FT_ZOPEN_H__ +#define __FT_ZOPEN_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + + + /* + * This is a complete re-implementation of the LZW file reader, + * since the old one was incredibly badly written, using + * 400 KByte of heap memory before decompressing anything. + * + */ + +#define FT_LZW_IN_BUFF_SIZE 64 +#define FT_LZW_DEFAULT_STACK_SIZE 64 + +#define LZW_INIT_BITS 9 +#define LZW_MAX_BITS 16 + +#define LZW_CLEAR 256 +#define LZW_FIRST 257 + +#define LZW_BIT_MASK 0x1f +#define LZW_BLOCK_MASK 0x80 +#define LZW_MASK( n ) ( ( 1U << (n) ) - 1U ) + + + typedef enum FT_LzwPhase_ + { + FT_LZW_PHASE_START = 0, + FT_LZW_PHASE_CODE, + FT_LZW_PHASE_STACK, + FT_LZW_PHASE_EOF + + } FT_LzwPhase; + + + /* + * state of LZW decompressor + * + * small technical note + * -------------------- + * + * We use a few tricks in this implementation that are explained here to + * ease debugging and maintenance. + * + * - First of all, the `prefix' and `suffix' arrays contain the suffix + * and prefix for codes over 256; this means that + * + * prefix_of(code) == state->prefix[code-256] + * suffix_of(code) == state->suffix[code-256] + * + * Each prefix is a 16-bit code, and each suffix an 8-bit byte. + * + * Both arrays are stored in a single memory block, pointed to by + * `state->prefix'. This means that the following equality is always + * true: + * + * state->suffix == (FT_Byte*)(state->prefix + state->prefix_size) + * + * Of course, state->prefix_size is the number of prefix/suffix slots + * in the arrays, corresponding to codes 256..255+prefix_size. + * + * - `free_ent' is the index of the next free entry in the `prefix' + * and `suffix' arrays. This means that the corresponding `next free + * code' is really `256+free_ent'. + * + * Moreover, `max_free' is the maximum value that `free_ent' can reach. + * + * `max_free' corresponds to `(1 << max_bits) - 256'. Note that this + * value is always <= 0xFF00, which means that both `free_ent' and + * `max_free' can be stored in an FT_UInt variable, even on 16-bit + * machines. + * + * If `free_ent == max_free', you cannot add new codes to the + * prefix/suffix table. + * + * - `num_bits' is the current number of code bits, starting at 9 and + * growing each time `free_ent' reaches the value of `free_bits'. The + * latter is computed as follows + * + * if num_bits < max_bits: + * free_bits = (1 << num_bits)-256 + * else: + * free_bits = max_free + 1 + * + * Since the value of `max_free + 1' can never be reached by + * `free_ent', `num_bits' cannot grow larger than `max_bits'. + */ + + typedef struct FT_LzwStateRec_ + { + FT_LzwPhase phase; + FT_Int in_eof; + + FT_Byte buf_tab[16]; + FT_Int buf_offset; + FT_Int buf_size; + FT_Bool buf_clear; + FT_Int buf_total; + + FT_UInt max_bits; /* max code bits, from file header */ + FT_Int block_mode; /* block mode flag, from file header */ + FT_UInt max_free; /* (1 << max_bits) - 256 */ + + FT_UInt num_bits; /* current code bit number */ + FT_UInt free_ent; /* index of next free entry */ + FT_UInt free_bits; /* if reached by free_ent, increment num_bits */ + FT_UInt old_code; + FT_UInt old_char; + FT_UInt in_code; + + FT_UShort* prefix; /* always dynamically allocated / reallocated */ + FT_Byte* suffix; /* suffix = (FT_Byte*)(prefix + prefix_size) */ + FT_UInt prefix_size; /* number of slots in `prefix' or `suffix' */ + + FT_Byte* stack; /* character stack */ + FT_UInt stack_top; + FT_UInt stack_size; + FT_Byte stack_0[FT_LZW_DEFAULT_STACK_SIZE]; /* minimize heap alloc */ + + FT_Stream source; /* source stream */ + FT_Memory memory; + + } FT_LzwStateRec, *FT_LzwState; + + + FT_LOCAL( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ); + + FT_LOCAL( void ) + ft_lzwstate_done( FT_LzwState state ); + + + FT_LOCAL( void ) + ft_lzwstate_reset( FT_LzwState state ); + + + FT_LOCAL( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ); + +/* */ + +#endif /* __FT_ZOPEN_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/lzw/rules.mk b/src/3rdparty/freetype/src/lzw/rules.mk new file mode 100644 index 0000000000..5550a48d64 --- /dev/null +++ b/src/3rdparty/freetype/src/lzw/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 LZW support configuration rules +# + + +# Copyright 2004, 2005, 2006 by +# Albert Chin-A-Young. +# +# Based on src/lzw/rules.mk, Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# LZW driver directory +# +LZW_DIR := $(SRC_DIR)/lzw + + +# compilation flags for the driver +# +LZW_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(LZW_DIR)) + + +# LZW support sources (i.e., C files) +# +LZW_DRV_SRC := $(LZW_DIR)/ftlzw.c + +# LZW support headers +# +LZW_DRV_H := $(LZW_DIR)/ftzopen.h \ + $(LZW_DIR)/ftzopen.c + + +# LZW driver object(s) +# +# LZW_DRV_OBJ_M is used during `multi' builds +# LZW_DRV_OBJ_S is used during `single' builds +# +LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O +LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O + +# LZW support source file for single build +# +LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c + + +# LZW support - single object +# +$(LZW_DRV_OBJ_S): $(LZW_DRV_SRC_S) $(LZW_DRV_SRC) $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(LZW_DRV_SRC_S)) + + +# LZW support - multiple objects +# +$(OBJ_DIR)/%.$O: $(LZW_DIR)/%.c $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(LZW_DRV_OBJ_S) +DRV_OBJS_M += $(LZW_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/otvalid/Jamfile b/src/3rdparty/freetype/src/otvalid/Jamfile new file mode 100644 index 0000000000..b457143de4 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/otvalid Jamfile +# +# Copyright 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) otvalid ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = otvbase otvcommn otvgdef otvgpos otvgsub otvjstf otvmod otvmath ; + } + else + { + _sources = otvalid ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/otvalid Jamfile diff --git a/src/3rdparty/freetype/src/otvalid/module.mk b/src/3rdparty/freetype/src/otvalid/module.mk new file mode 100644 index 0000000000..9cadde55e4 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 otvalid module definition +# + + +# Copyright 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += OTVALID_MODULE + +define OTVALID_MODULE +$(OPEN_DRIVER) FT_Module_Class, otv_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)otvalid $(ECHO_DRIVER_DESC)OpenType validation module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/otvalid/otvalid.c b/src/3rdparty/freetype/src/otvalid/otvalid.c new file mode 100644 index 0000000000..d5c2b75abb --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvalid.c @@ -0,0 +1,31 @@ +/***************************************************************************/ +/* */ +/* otvalid.c */ +/* */ +/* FreeType validator for OpenType tables (body only). */ +/* */ +/* Copyright 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> + +#include "otvbase.c" +#include "otvcommn.c" +#include "otvgdef.c" +#include "otvgpos.c" +#include "otvgsub.c" +#include "otvjstf.c" +#include "otvmath.c" +#include "otvmod.c" + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvalid.h b/src/3rdparty/freetype/src/otvalid/otvalid.h new file mode 100644 index 0000000000..eb99b9cc48 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvalid.h @@ -0,0 +1,78 @@ +/***************************************************************************/ +/* */ +/* otvalid.h */ +/* */ +/* OpenType table validation (specification only). */ +/* */ +/* Copyright 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __OTVALID_H__ +#define __OTVALID_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#include "otverror.h" /* must come before FT_INTERNAL_VALIDATE_H */ + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + otv_BASE_validate( FT_Bytes table, + FT_Validator valid ); + + /* GSUB and GPOS tables should already be validated; */ + /* if missing, set corresponding argument to 0 */ + FT_LOCAL( void ) + otv_GDEF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_GPOS_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_GSUB_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator valid ); + + /* GSUB and GPOS tables should already be validated; */ + /* if missing, set corresponding argument to 0 */ + FT_LOCAL( void ) + otv_JSTF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_MATH_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ); + + +FT_END_HEADER + +#endif /* __OTVALID_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvbase.c b/src/3rdparty/freetype/src/otvalid/otvbase.c new file mode 100644 index 0000000000..d742d2dc95 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvbase.c @@ -0,0 +1,318 @@ +/***************************************************************************/ +/* */ +/* otvbase.c */ +/* */ +/* OpenType BASE table validation (body). */ +/* */ +/* Copyright 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvbase + + + static void + otv_BaseCoord_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BaseCoordFormat; + + + OTV_NAME_ENTER( "BaseCoord" ); + + OTV_LIMIT_CHECK( 4 ); + BaseCoordFormat = FT_NEXT_USHORT( p ); + p += 2; /* skip Coordinate */ + + OTV_TRACE(( " (format %d)\n", BaseCoordFormat )); + + switch ( BaseCoordFormat ) + { + case 1: /* BaseCoordFormat1 */ + break; + + case 2: /* BaseCoordFormat2 */ + OTV_LIMIT_CHECK( 4 ); /* ReferenceGlyph, BaseCoordPoint */ + break; + + case 3: /* BaseCoordFormat3 */ + OTV_LIMIT_CHECK( 2 ); + /* DeviceTable */ + otv_Device_validate( table + FT_NEXT_USHORT( p ), valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static void + otv_BaseTagList_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BaseTagCount; + + + OTV_NAME_ENTER( "BaseTagList" ); + + OTV_LIMIT_CHECK( 2 ); + + BaseTagCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount )); + + OTV_LIMIT_CHECK( BaseTagCount * 4 ); /* BaselineTag */ + + OTV_EXIT; + } + + + static void + otv_BaseValues_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BaseCoordCount; + + + OTV_NAME_ENTER( "BaseValues" ); + + OTV_LIMIT_CHECK( 4 ); + + p += 2; /* skip DefaultIndex */ + BaseCoordCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount )); + + OTV_LIMIT_CHECK( BaseCoordCount * 2 ); + + /* BaseCoord */ + for ( ; BaseCoordCount > 0; BaseCoordCount-- ) + otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), valid ); + + OTV_EXIT; + } + + + static void + otv_MinMax_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt FeatMinMaxCount; + + OTV_OPTIONAL_TABLE( MinCoord ); + OTV_OPTIONAL_TABLE( MaxCoord ); + + + OTV_NAME_ENTER( "MinMax" ); + + OTV_LIMIT_CHECK( 6 ); + + OTV_OPTIONAL_OFFSET( MinCoord ); + OTV_OPTIONAL_OFFSET( MaxCoord ); + FeatMinMaxCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount )); + + table_size = FeatMinMaxCount * 8 + 6; + + OTV_SIZE_CHECK( MinCoord ); + if ( MinCoord ) + otv_BaseCoord_validate( table + MinCoord, valid ); + + OTV_SIZE_CHECK( MaxCoord ); + if ( MaxCoord ) + otv_BaseCoord_validate( table + MaxCoord, valid ); + + OTV_LIMIT_CHECK( FeatMinMaxCount * 8 ); + + /* FeatMinMaxRecord */ + for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- ) + { + p += 4; /* skip FeatureTableTag */ + + OTV_OPTIONAL_OFFSET( MinCoord ); + OTV_OPTIONAL_OFFSET( MaxCoord ); + + OTV_SIZE_CHECK( MinCoord ); + if ( MinCoord ) + otv_BaseCoord_validate( table + MinCoord, valid ); + + OTV_SIZE_CHECK( MaxCoord ); + if ( MaxCoord ) + otv_BaseCoord_validate( table + MaxCoord, valid ); + } + + OTV_EXIT; + } + + + static void + otv_BaseScript_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt BaseLangSysCount; + + OTV_OPTIONAL_TABLE( BaseValues ); + OTV_OPTIONAL_TABLE( DefaultMinMax ); + + + OTV_NAME_ENTER( "BaseScript" ); + + OTV_LIMIT_CHECK( 6 ); + OTV_OPTIONAL_OFFSET( BaseValues ); + OTV_OPTIONAL_OFFSET( DefaultMinMax ); + BaseLangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount )); + + table_size = BaseLangSysCount * 6 + 6; + + OTV_SIZE_CHECK( BaseValues ); + if ( BaseValues ) + otv_BaseValues_validate( table + BaseValues, valid ); + + OTV_SIZE_CHECK( DefaultMinMax ); + if ( DefaultMinMax ) + otv_MinMax_validate( table + DefaultMinMax, valid ); + + OTV_LIMIT_CHECK( BaseLangSysCount * 6 ); + + /* BaseLangSysRecord */ + for ( ; BaseLangSysCount > 0; BaseLangSysCount-- ) + { + p += 4; /* skip BaseLangSysTag */ + + otv_MinMax_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + static void + otv_BaseScriptList_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BaseScriptCount; + + + OTV_NAME_ENTER( "BaseScriptList" ); + + OTV_LIMIT_CHECK( 2 ); + BaseScriptCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount )); + + OTV_LIMIT_CHECK( BaseScriptCount * 6 ); + + /* BaseScriptRecord */ + for ( ; BaseScriptCount > 0; BaseScriptCount-- ) + { + p += 4; /* skip BaseScriptTag */ + + /* BaseScript */ + otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + static void + otv_Axis_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( BaseTagList ); + + + OTV_NAME_ENTER( "Axis" ); + + OTV_LIMIT_CHECK( 4 ); + OTV_OPTIONAL_OFFSET( BaseTagList ); + + table_size = 4; + + OTV_SIZE_CHECK( BaseTagList ); + if ( BaseTagList ) + otv_BaseTagList_validate( table + BaseTagList, valid ); + + /* BaseScriptList */ + otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), valid ); + + OTV_EXIT; + } + + + FT_LOCAL_DEF( void ) + otv_BASE_validate( FT_Bytes table, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( HorizAxis ); + OTV_OPTIONAL_TABLE( VertAxis ); + + + valid->root = ftvalid; + + FT_TRACE3(( "validating BASE table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 6 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + table_size = 6; + + OTV_OPTIONAL_OFFSET( HorizAxis ); + OTV_SIZE_CHECK( HorizAxis ); + if ( HorizAxis ) + otv_Axis_validate( table + HorizAxis, valid ); + + OTV_OPTIONAL_OFFSET( VertAxis ); + OTV_SIZE_CHECK( VertAxis ); + if ( VertAxis ) + otv_Axis_validate( table + VertAxis, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvcommn.c b/src/3rdparty/freetype/src/otvalid/otvcommn.c new file mode 100644 index 0000000000..a4f885b51f --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvcommn.c @@ -0,0 +1,1086 @@ +/***************************************************************************/ +/* */ +/* otvcommn.c */ +/* */ +/* OpenType common tables validation (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvcommon + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** COVERAGE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Coverage_validate( FT_Bytes table, + OTV_Validator valid, + FT_Int expected_count ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat; + FT_UInt total = 0; + + + OTV_NAME_ENTER( "Coverage" ); + + OTV_LIMIT_CHECK( 4 ); + CoverageFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", CoverageFormat )); + + switch ( CoverageFormat ) + { + case 1: /* CoverageFormat1 */ + { + FT_UInt GlyphCount; + FT_UInt i; + + + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); /* GlyphArray */ + + for ( i = 0; i < GlyphCount; ++i ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + + total = GlyphCount; + } + break; + + case 2: /* CoverageFormat2 */ + { + FT_UInt n, RangeCount; + FT_UInt Start, End, StartCoverageIndex, last = 0; + + + RangeCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (RangeCount = %d)\n", RangeCount )); + + OTV_LIMIT_CHECK( RangeCount * 6 ); + + /* RangeRecord */ + for ( n = 0; n < RangeCount; n++ ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + StartCoverageIndex = FT_NEXT_USHORT( p ); + + if ( Start > End || StartCoverageIndex != total ) + FT_INVALID_DATA; + + if ( End >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + + if ( n > 0 && Start <= last ) + FT_INVALID_DATA; + + total += End - Start + 1; + last = End; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + /* Generally, a coverage table offset has an associated count field. */ + /* The number of glyphs in the table should match this field. If */ + /* there is no associated count, a value of -1 tells us not to check. */ + if ( expected_count != -1 && (FT_UInt)expected_count != total ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_first( FT_Bytes table ) + { + FT_Bytes p = table; + + + p += 4; /* skip CoverageFormat and Glyph/RangeCount */ + + return FT_NEXT_USHORT( p ); + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_last( FT_Bytes table ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat = FT_NEXT_USHORT( p ); + FT_UInt count = FT_NEXT_USHORT( p ); /* Glyph/RangeCount */ + FT_UInt result = 0; + + + switch ( CoverageFormat ) + { + case 1: + p += ( count - 1 ) * 2; + result = FT_NEXT_USHORT( p ); + break; + + case 2: + p += ( count - 1 ) * 6 + 2; + result = FT_NEXT_USHORT( p ); + break; + + default: + ; + } + + return result; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_count( FT_Bytes table ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat = FT_NEXT_USHORT( p ); + FT_UInt count = FT_NEXT_USHORT( p ); /* Glyph/RangeCount */ + FT_UInt result = 0; + + + switch ( CoverageFormat ) + { + case 1: + return count; + + case 2: + { + FT_UInt Start, End; + + + for ( ; count > 0; count-- ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + p += 2; /* skip StartCoverageIndex */ + + result += End - Start + 1; + } + } + break; + + default: + ; + } + + return result; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CLASS DEFINITION TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_ClassDef_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt ClassFormat; + + + OTV_NAME_ENTER( "ClassDef" ); + + OTV_LIMIT_CHECK( 4 ); + ClassFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", ClassFormat )); + + switch ( ClassFormat ) + { + case 1: /* ClassDefFormat1 */ + { + FT_UInt StartGlyph; + FT_UInt GlyphCount; + + + OTV_LIMIT_CHECK( 4 ); + + StartGlyph = FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); /* ClassValueArray */ + + if ( StartGlyph + GlyphCount - 1 >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + break; + + case 2: /* ClassDefFormat2 */ + { + FT_UInt n, ClassRangeCount; + FT_UInt Start, End, last = 0; + + + ClassRangeCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassRangeCount = %d)\n", ClassRangeCount )); + + OTV_LIMIT_CHECK( ClassRangeCount * 6 ); + + /* ClassRangeRecord */ + for ( n = 0; n < ClassRangeCount; n++ ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + p += 2; /* skip Class */ + + if ( Start > End || ( n > 0 && Start <= last ) ) + FT_INVALID_DATA; + + if ( End >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + + last = End; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + /* no need to check glyph indices used as input to class definition */ + /* tables since even invalid glyph indices return a meaningful result */ + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** DEVICE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Device_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt StartSize, EndSize, DeltaFormat, count; + + + OTV_NAME_ENTER( "Device" ); + + OTV_LIMIT_CHECK( 8 ); + StartSize = FT_NEXT_USHORT( p ); + EndSize = FT_NEXT_USHORT( p ); + DeltaFormat = FT_NEXT_USHORT( p ); + + if ( DeltaFormat < 1 || DeltaFormat > 3 ) + FT_INVALID_FORMAT; + + if ( EndSize < StartSize ) + FT_INVALID_DATA; + + count = EndSize - StartSize + 1; + OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 ); /* DeltaValue */ + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->type_count */ + /* uses valid->type_funcs */ + + FT_LOCAL_DEF( void ) + otv_Lookup_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt LookupType, SubTableCount; + OTV_Validate_Func validate; + + + OTV_NAME_ENTER( "Lookup" ); + + OTV_LIMIT_CHECK( 6 ); + LookupType = FT_NEXT_USHORT( p ); + p += 2; /* skip LookupFlag */ + SubTableCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (type %d)\n", LookupType )); + + if ( LookupType == 0 || LookupType > valid->type_count ) + FT_INVALID_DATA; + + validate = valid->type_funcs[LookupType - 1]; + + OTV_TRACE(( " (SubTableCount = %d)\n", SubTableCount )); + + OTV_LIMIT_CHECK( SubTableCount * 2 ); + + /* SubTable */ + for ( ; SubTableCount > 0; SubTableCount-- ) + validate( table + FT_NEXT_USHORT( p ), valid ); + + OTV_EXIT; + } + + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_LookupList_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt LookupCount; + + + OTV_NAME_ENTER( "LookupList" ); + + OTV_LIMIT_CHECK( 2 ); + LookupCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookupCount = %d)\n", LookupCount )); + + OTV_LIMIT_CHECK( LookupCount * 2 ); + + valid->lookup_count = LookupCount; + + /* Lookup */ + for ( ; LookupCount > 0; LookupCount-- ) + otv_Lookup_validate( table + FT_NEXT_USHORT( p ), valid ); + + OTV_EXIT; + } + + + static FT_UInt + otv_LookupList_get_count( FT_Bytes table ) + { + return FT_NEXT_USHORT( table ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FEATURES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_Feature_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt LookupCount; + + + OTV_NAME_ENTER( "Feature" ); + + OTV_LIMIT_CHECK( 4 ); + p += 2; /* skip FeatureParams (unused) */ + LookupCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookupCount = %d)\n", LookupCount )); + + OTV_LIMIT_CHECK( LookupCount * 2 ); + + /* LookupListIndex */ + for ( ; LookupCount > 0; LookupCount-- ) + if ( FT_NEXT_USHORT( p ) >= valid->lookup_count ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + static FT_UInt + otv_Feature_get_count( FT_Bytes table ) + { + return FT_NEXT_USHORT( table ); + } + + + /* sets valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_FeatureList_validate( FT_Bytes table, + FT_Bytes lookups, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt FeatureCount; + + + OTV_NAME_ENTER( "FeatureList" ); + + OTV_LIMIT_CHECK( 2 ); + FeatureCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount )); + + OTV_LIMIT_CHECK( FeatureCount * 2 ); + + valid->lookup_count = otv_LookupList_get_count( lookups ); + + /* FeatureRecord */ + for ( ; FeatureCount > 0; FeatureCount-- ) + { + p += 4; /* skip FeatureTag */ + + /* Feature */ + otv_Feature_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LANGUAGE SYSTEM *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* uses valid->extra1 (number of features) */ + + FT_LOCAL_DEF( void ) + otv_LangSys_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt ReqFeatureIndex; + FT_UInt FeatureCount; + + + OTV_NAME_ENTER( "LangSys" ); + + OTV_LIMIT_CHECK( 6 ); + p += 2; /* skip LookupOrder (unused) */ + ReqFeatureIndex = FT_NEXT_USHORT( p ); + FeatureCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ReqFeatureIndex = %d)\n", ReqFeatureIndex )); + OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount )); + + if ( ReqFeatureIndex != 0xFFFFU && ReqFeatureIndex >= valid->extra1 ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( FeatureCount * 2 ); + + /* FeatureIndex */ + for ( ; FeatureCount > 0; FeatureCount-- ) + if ( FT_NEXT_USHORT( p ) >= valid->extra1 ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SCRIPTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Script_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_UInt DefaultLangSys, LangSysCount; + FT_Bytes p = table; + + + OTV_NAME_ENTER( "Script" ); + + OTV_LIMIT_CHECK( 4 ); + DefaultLangSys = FT_NEXT_USHORT( p ); + LangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LangSysCount = %d)\n", LangSysCount )); + + if ( DefaultLangSys != 0 ) + otv_LangSys_validate( table + DefaultLangSys, valid ); + + OTV_LIMIT_CHECK( LangSysCount * 6 ); + + /* LangSysRecord */ + for ( ; LangSysCount > 0; LangSysCount-- ) + { + p += 4; /* skip LangSysTag */ + + /* LangSys */ + otv_LangSys_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + /* sets valid->extra1 (number of features) */ + + FT_LOCAL_DEF( void ) + otv_ScriptList_validate( FT_Bytes table, + FT_Bytes features, + OTV_Validator valid ) + { + FT_UInt ScriptCount; + FT_Bytes p = table; + + + OTV_NAME_ENTER( "ScriptList" ); + + OTV_LIMIT_CHECK( 2 ); + ScriptCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ScriptCount = %d)\n", ScriptCount )); + + OTV_LIMIT_CHECK( ScriptCount * 6 ); + + valid->extra1 = otv_Feature_get_count( features ); + + /* ScriptRecord */ + for ( ; ScriptCount > 0; ScriptCount-- ) + { + p += 4; /* skip ScriptTag */ + + otv_Script_validate( table + FT_NEXT_USHORT( p ), valid ); /* Script */ + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + u: uint16 + ux: unit16 [x] + + s: struct + sx: struct [x] + sxy: struct [x], using external y count + + x: uint16 x + + C: Coverage + + O: Offset + On: Offset (NULL) + Ox: Offset [x] + Onx: Offset (NULL) [x] + */ + + FT_LOCAL_DEF( void ) + otv_x_Ox( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count; + OTV_Validate_Func func; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + + for ( ; Count > 0; Count-- ) + func( table + FT_NEXT_USHORT( p ), valid ); + + valid->nesting_level--; + + OTV_EXIT; + } + + + FT_LOCAL_DEF( void ) + otv_u_C_x_Ox( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count, Coverage; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + otv_Coverage_validate( table + Coverage, valid, Count ); + + OTV_LIMIT_CHECK( Count * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + + for ( ; Count > 0; Count-- ) + func( table + FT_NEXT_USHORT( p ), valid ); + + valid->nesting_level--; + + OTV_EXIT; + } + + + /* uses valid->extra1 (if > 0: array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_ux( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 2 ); + + if ( valid->extra1 ) + { + for ( ; Count > 0; Count-- ) + if ( FT_NEXT_USHORT( p ) >= valid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* `ux' in the function's name is not really correct since only x-1 */ + /* elements are tested */ + + /* uses valid->extra1 (array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_y_ux_sy( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count1, Count2; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + Count1 = FT_NEXT_USHORT( p ); + Count2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count1 = %d)\n", Count1 )); + OTV_TRACE(( " (Count2 = %d)\n", Count2 )); + + if ( Count1 == 0 ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( ( Count1 - 1 ) * 2 + Count2 * 4 ); + p += ( Count1 - 1 ) * 2; + + for ( ; Count2 > 0; Count2-- ) + { + if ( FT_NEXT_USHORT( p ) >= Count1 ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* `uy' in the function's name is not really correct since only y-1 */ + /* elements are tested */ + + /* uses valid->extra1 (array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BacktrackCount, InputCount, LookaheadCount; + FT_UInt Count; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + BacktrackCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackCount = %d)\n", BacktrackCount )); + + OTV_LIMIT_CHECK( BacktrackCount * 2 + 2 ); + p += BacktrackCount * 2; + + InputCount = FT_NEXT_USHORT( p ); + if ( InputCount == 0 ) + FT_INVALID_DATA; + + OTV_TRACE(( " (InputCount = %d)\n", InputCount )); + + OTV_LIMIT_CHECK( InputCount * 2 ); + p += ( InputCount - 1 ) * 2; + + LookaheadCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadCount = %d)\n", LookaheadCount )); + + OTV_LIMIT_CHECK( LookaheadCount * 2 + 2 ); + p += LookaheadCount * 2; + + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 4 ); + + for ( ; Count > 0; Count-- ) + { + if ( FT_NEXT_USHORT( p ) >= InputCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* sets valid->extra1 (valid->lookup_count) */ + + FT_LOCAL_DEF( void ) + otv_u_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Coverage, ClassDef, ClassSetCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 6 ); + Coverage = FT_NEXT_USHORT( p ); + ClassDef = FT_NEXT_USHORT( p ); + ClassSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassSetCount = %d)\n", ClassSetCount )); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + otv_ClassDef_validate( table + ClassDef, valid ); + + OTV_LIMIT_CHECK( ClassSetCount * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + valid->extra1 = valid->lookup_count; + + for ( ; ClassSetCount > 0; ClassSetCount-- ) + { + FT_UInt offset = FT_NEXT_USHORT( p ); + + + if ( offset ) + func( table + offset, valid ); + } + + valid->nesting_level--; + + OTV_EXIT; + } + + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_u_x_y_Ox_sy( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt GlyphCount, Count, count1; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 4 ); + GlyphCount = FT_NEXT_USHORT( p ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( GlyphCount * 2 + Count * 4 ); + + for ( count1 = GlyphCount; count1 > 0; count1-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + for ( ; Count > 0; Count-- ) + { + if ( FT_NEXT_USHORT( p ) >= GlyphCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->lookup_count ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* sets valid->extra1 (valid->lookup_count) */ + + FT_LOCAL_DEF( void ) + otv_u_O_O_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Coverage; + FT_UInt BacktrackClassDef, InputClassDef, LookaheadClassDef; + FT_UInt ChainClassSetCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 10 ); + Coverage = FT_NEXT_USHORT( p ); + BacktrackClassDef = FT_NEXT_USHORT( p ); + InputClassDef = FT_NEXT_USHORT( p ); + LookaheadClassDef = FT_NEXT_USHORT( p ); + ChainClassSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ChainClassSetCount = %d)\n", ChainClassSetCount )); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + + otv_ClassDef_validate( table + BacktrackClassDef, valid ); + otv_ClassDef_validate( table + InputClassDef, valid ); + otv_ClassDef_validate( table + LookaheadClassDef, valid ); + + OTV_LIMIT_CHECK( ChainClassSetCount * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + valid->extra1 = valid->lookup_count; + + for ( ; ChainClassSetCount > 0; ChainClassSetCount-- ) + { + FT_UInt offset = FT_NEXT_USHORT( p ); + + + if ( offset ) + func( table + offset, valid ); + } + + valid->nesting_level--; + + OTV_EXIT; + } + + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BacktrackGlyphCount, InputGlyphCount, LookaheadGlyphCount; + FT_UInt count1, count2; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 2 ); + BacktrackGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount )); + + OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); + + for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + InputGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (InputGlyphCount = %d)\n", InputGlyphCount )); + + OTV_LIMIT_CHECK( InputGlyphCount * 2 + 2 ); + + for ( count1 = InputGlyphCount; count1 > 0; count1-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + LookaheadGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount )); + + OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 ); + + for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + count2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", count2 )); + + OTV_LIMIT_CHECK( count2 * 4 ); + + for ( ; count2 > 0; count2-- ) + { + if ( FT_NEXT_USHORT( p ) >= InputGlyphCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->lookup_count ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ) + { + FT_Bytes p = table + 8; + + + return otv_LookupList_get_count( table + FT_NEXT_USHORT( p ) ); + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ) + { + FT_Bytes p, lookup; + FT_UInt count; + + + if ( !table ) + return 0; + + /* LookupList */ + p = table + 8; + table += FT_NEXT_USHORT( p ); + + /* LookupCount */ + p = table; + count = FT_NEXT_USHORT( p ); + + for ( ; count > 0; count-- ) + { + FT_Bytes oldp; + + + /* Lookup */ + lookup = table + FT_NEXT_USHORT( p ); + + oldp = p; + + /* LookupFlag */ + p = lookup + 2; + if ( FT_NEXT_USHORT( p ) & 0xFF00U ) + return 1; + + p = oldp; + } + + return 0; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvcommn.h b/src/3rdparty/freetype/src/otvalid/otvcommn.h new file mode 100644 index 0000000000..71726d5b2e --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvcommn.h @@ -0,0 +1,437 @@ +/***************************************************************************/ +/* */ +/* otvcommn.h */ +/* */ +/* OpenType common tables validation (specification). */ +/* */ +/* Copyright 2004, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __OTVCOMMN_H__ +#define __OTVCOMMN_H__ + + +#include <ft2build.h> +#include "otvalid.h" +#include FT_INTERNAL_DEBUG_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALIDATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct OTV_ValidatorRec_* OTV_Validator; + + typedef void (*OTV_Validate_Func)( FT_Bytes table, + OTV_Validator valid ); + + typedef struct OTV_ValidatorRec_ + { + FT_Validator root; + FT_UInt type_count; + OTV_Validate_Func* type_funcs; + + FT_UInt lookup_count; + FT_UInt glyph_count; + + FT_UInt nesting_level; + + OTV_Validate_Func func[3]; + + FT_UInt extra1; /* for passing parameters */ + FT_UInt extra2; + FT_Bytes extra3; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt debug_indent; + const FT_String* debug_function_name[3]; +#endif + + } OTV_ValidatorRec; + + +#undef FT_INVALID_ +#define FT_INVALID_( _prefix, _error ) \ + ft_validator_error( valid->root, _prefix ## _error ) + +#define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \ + FT_Bytes _table ## _p + +#define OTV_OPTIONAL_OFFSET( _offset ) \ + FT_BEGIN_STMNT \ + _offset ## _p = p; \ + _offset = FT_NEXT_USHORT( p ); \ + FT_END_STMNT + +#define OTV_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( p + (_count) > valid->root->limit ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + +#define OTV_SIZE_CHECK( _size ) \ + FT_BEGIN_STMNT \ + if ( _size > 0 && _size < table_size ) \ + { \ + if ( valid->root->level == FT_VALIDATE_PARANOID ) \ + FT_INVALID_OFFSET; \ + else \ + { \ + /* strip off `const' */ \ + FT_Byte* pp = (FT_Byte*)_size ## _p; \ + \ + \ + FT_TRACE3(( "\n" \ + "Invalid offset to optional table `%s'!\n" \ + "Set to zero.\n" \ + "\n", #_size )); \ + \ + /* always assume 16bit entities */ \ + _size = pp[0] = pp[1] = 0; \ + } \ + } \ + FT_END_STMNT + + +#define OTV_NAME_(x) #x +#define OTV_NAME(x) OTV_NAME_(x) + +#define OTV_FUNC_(x) x##Func +#define OTV_FUNC(x) OTV_FUNC_(x) + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define OTV_NEST1( x ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->debug_function_name[0] = OTV_NAME( x ); \ + FT_END_STMNT + +#define OTV_NEST2( x, y ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->func[1] = OTV_FUNC( y ); \ + valid->debug_function_name[0] = OTV_NAME( x ); \ + valid->debug_function_name[1] = OTV_NAME( y ); \ + FT_END_STMNT + +#define OTV_NEST3( x, y, z ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->func[1] = OTV_FUNC( y ); \ + valid->func[2] = OTV_FUNC( z ); \ + valid->debug_function_name[0] = OTV_NAME( x ); \ + valid->debug_function_name[1] = OTV_NAME( y ); \ + valid->debug_function_name[2] = OTV_NAME( z ); \ + FT_END_STMNT + +#define OTV_INIT valid->debug_indent = 0 + +#define OTV_ENTER \ + FT_BEGIN_STMNT \ + valid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4(( "%s table\n", \ + valid->debug_function_name[valid->nesting_level] )); \ + FT_END_STMNT + +#define OTV_NAME_ENTER( name ) \ + FT_BEGIN_STMNT \ + valid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4(( "%s table\n", name )); \ + FT_END_STMNT + +#define OTV_EXIT valid->debug_indent -= 2 + +#define OTV_TRACE( s ) \ + FT_BEGIN_STMNT \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4( s ); \ + FT_END_STMNT + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define OTV_NEST1( x ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + FT_END_STMNT + +#define OTV_NEST2( x, y ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->func[1] = OTV_FUNC( y ); \ + FT_END_STMNT + +#define OTV_NEST3( x, y, z ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->func[1] = OTV_FUNC( y ); \ + valid->func[2] = OTV_FUNC( z ); \ + FT_END_STMNT + +#define OTV_INIT do { } while ( 0 ) +#define OTV_ENTER do { } while ( 0 ) +#define OTV_NAME_ENTER( name ) do { } while ( 0 ) +#define OTV_EXIT do { } while ( 0 ) + +#define OTV_TRACE( s ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#define OTV_RUN valid->func[0] + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** COVERAGE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Coverage_validate( FT_Bytes table, + OTV_Validator valid, + FT_Int expected_count ); + + /* return first covered glyph */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_first( FT_Bytes table ); + + /* return last covered glyph */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_last( FT_Bytes table ); + + /* return number of covered glyphs */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_count( FT_Bytes table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CLASS DEFINITION TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_ClassDef_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** DEVICE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Device_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Lookup_validate( FT_Bytes table, + OTV_Validator valid ); + + FT_LOCAL( void ) + otv_LookupList_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FEATURES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Feature_validate( FT_Bytes table, + OTV_Validator valid ); + + /* lookups must already be validated */ + FT_LOCAL( void ) + otv_FeatureList_validate( FT_Bytes table, + FT_Bytes lookups, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LANGUAGE SYSTEM *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_LangSys_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SCRIPTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Script_validate( FT_Bytes table, + OTV_Validator valid ); + + /* features must already be validated */ + FT_LOCAL( void ) + otv_ScriptList_validate( FT_Bytes table, + FT_Bytes features, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define ChainPosClassSetFunc otv_x_Ox +#define ChainPosRuleSetFunc otv_x_Ox +#define ChainSubClassSetFunc otv_x_Ox +#define ChainSubRuleSetFunc otv_x_Ox +#define JstfLangSysFunc otv_x_Ox +#define JstfMaxFunc otv_x_Ox +#define LigGlyphFunc otv_x_Ox +#define LigatureArrayFunc otv_x_Ox +#define LigatureSetFunc otv_x_Ox +#define PosClassSetFunc otv_x_Ox +#define PosRuleSetFunc otv_x_Ox +#define SubClassSetFunc otv_x_Ox +#define SubRuleSetFunc otv_x_Ox + + FT_LOCAL( void ) + otv_x_Ox ( FT_Bytes table, + OTV_Validator valid ); + +#define AlternateSubstFormat1Func otv_u_C_x_Ox +#define ChainContextPosFormat1Func otv_u_C_x_Ox +#define ChainContextSubstFormat1Func otv_u_C_x_Ox +#define ContextPosFormat1Func otv_u_C_x_Ox +#define ContextSubstFormat1Func otv_u_C_x_Ox +#define LigatureSubstFormat1Func otv_u_C_x_Ox +#define MultipleSubstFormat1Func otv_u_C_x_Ox + + FT_LOCAL( void ) + otv_u_C_x_Ox( FT_Bytes table, + OTV_Validator valid ); + +#define AlternateSetFunc otv_x_ux +#define AttachPointFunc otv_x_ux +#define ExtenderGlyphFunc otv_x_ux +#define JstfGPOSModListFunc otv_x_ux +#define JstfGSUBModListFunc otv_x_ux +#define SequenceFunc otv_x_ux + + FT_LOCAL( void ) + otv_x_ux( FT_Bytes table, + OTV_Validator valid ); + +#define PosClassRuleFunc otv_x_y_ux_sy +#define PosRuleFunc otv_x_y_ux_sy +#define SubClassRuleFunc otv_x_y_ux_sy +#define SubRuleFunc otv_x_y_ux_sy + + FT_LOCAL( void ) + otv_x_y_ux_sy( FT_Bytes table, + OTV_Validator valid ); + +#define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp + + FT_LOCAL( void ) + otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, + OTV_Validator valid ); + +#define ContextPosFormat2Func otv_u_O_O_x_Onx +#define ContextSubstFormat2Func otv_u_O_O_x_Onx + + FT_LOCAL( void ) + otv_u_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ); + +#define ContextPosFormat3Func otv_u_x_y_Ox_sy +#define ContextSubstFormat3Func otv_u_x_y_Ox_sy + + FT_LOCAL( void ) + otv_u_x_y_Ox_sy( FT_Bytes table, + OTV_Validator valid ); + +#define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx +#define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx + + FT_LOCAL( void ) + otv_u_O_O_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ); + +#define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp +#define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp + + FT_LOCAL( void ) + otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, + OTV_Validator valid ); + + + FT_LOCAL( FT_UInt ) + otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ); + + FT_LOCAL( FT_UInt ) + otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ); + + /* */ + +FT_END_HEADER + +#endif /* __OTVCOMMN_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otverror.h b/src/3rdparty/freetype/src/otvalid/otverror.h new file mode 100644 index 0000000000..041b538368 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otverror.h @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* otverror.h */ +/* */ +/* OpenType validation module error codes (specification only). */ +/* */ +/* Copyright 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the OpenType validation module error */ + /* enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __OTVERROR_H__ +#define __OTVERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX OTV_Err_ +#define FT_ERR_BASE FT_Mod_Err_OTvalid + +#define FT_KEEP_ERR_PREFIX + +#include FT_ERRORS_H + +#endif /* __OTVERROR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvgdef.c b/src/3rdparty/freetype/src/otvalid/otvgdef.c new file mode 100644 index 0000000000..3633ad0de1 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvgdef.c @@ -0,0 +1,224 @@ +/***************************************************************************/ +/* */ +/* otvgdef.c */ +/* */ +/* OpenType GDEF table validation (body). */ +/* */ +/* Copyright 2004, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvgdef + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define AttachListFunc otv_O_x_Ox +#define LigCaretListFunc otv_O_x_Ox + + /* sets valid->extra1 (0) */ + + static void + otv_O_x_Ox( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes Coverage; + FT_UInt GlyphCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + otv_Coverage_validate( Coverage, valid, GlyphCount ); + if ( GlyphCount != otv_Coverage_get_count( Coverage ) ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + valid->extra1 = 0; + + for ( ; GlyphCount > 0; GlyphCount-- ) + func( table + FT_NEXT_USHORT( p ), valid ); + + valid->nesting_level--; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LIGATURE CARETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define CaretValueFunc otv_CaretValue_validate + + static void + otv_CaretValue_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt CaretValueFormat; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + + CaretValueFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format = %d)\n", CaretValueFormat )); + + switch ( CaretValueFormat ) + { + case 1: /* CaretValueFormat1 */ + /* skip Coordinate, no test */ + break; + + case 2: /* CaretValueFormat2 */ + /* skip CaretValuePoint, no test */ + break; + + case 3: /* CaretValueFormat3 */ + p += 2; /* skip Coordinate */ + + OTV_LIMIT_CHECK( 2 ); + + /* DeviceTable */ + otv_Device_validate( table + FT_NEXT_USHORT( p ), valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GDEF TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GDEF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt table_size; + FT_Bool need_MarkAttachClassDef; + + OTV_OPTIONAL_TABLE( GlyphClassDef ); + OTV_OPTIONAL_TABLE( AttachListOffset ); + OTV_OPTIONAL_TABLE( LigCaretListOffset ); + OTV_OPTIONAL_TABLE( MarkAttachClassDef ); + + + valid->root = ftvalid; + + FT_TRACE3(( "validating GDEF table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 12 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + /* MarkAttachClassDef has been added to the OpenType */ + /* specification without increasing GDEF's version, */ + /* so we use this ugly hack to find out whether the */ + /* table is needed actually. */ + + need_MarkAttachClassDef = FT_BOOL( + otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) || + otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) ); + + if ( need_MarkAttachClassDef ) + table_size = 12; /* OpenType >= 1.2 */ + else + table_size = 10; /* OpenType < 1.2 */ + + valid->glyph_count = glyph_count; + + OTV_OPTIONAL_OFFSET( GlyphClassDef ); + OTV_SIZE_CHECK( GlyphClassDef ); + if ( GlyphClassDef ) + otv_ClassDef_validate( table + GlyphClassDef, valid ); + + OTV_OPTIONAL_OFFSET( AttachListOffset ); + OTV_SIZE_CHECK( AttachListOffset ); + if ( AttachListOffset ) + { + OTV_NEST2( AttachList, AttachPoint ); + OTV_RUN( table + AttachListOffset, valid ); + } + + OTV_OPTIONAL_OFFSET( LigCaretListOffset ); + OTV_SIZE_CHECK( LigCaretListOffset ); + if ( LigCaretListOffset ) + { + OTV_NEST3( LigCaretList, LigGlyph, CaretValue ); + OTV_RUN( table + LigCaretListOffset, valid ); + } + + if ( need_MarkAttachClassDef ) + { + OTV_OPTIONAL_OFFSET( MarkAttachClassDef ); + OTV_SIZE_CHECK( MarkAttachClassDef ); + if ( MarkAttachClassDef ) + otv_ClassDef_validate( table + MarkAttachClassDef, valid ); + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvgpos.c b/src/3rdparty/freetype/src/otvalid/otvgpos.c new file mode 100644 index 0000000000..53025ec5e6 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvgpos.c @@ -0,0 +1,1016 @@ +/***************************************************************************/ +/* */ +/* otvgpos.c */ +/* */ +/* OpenType GPOS table validation (body). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvgpos + + + static void + otv_Anchor_validate( FT_Bytes table, + OTV_Validator valid ); + + static void + otv_MarkArray_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define BaseArrayFunc otv_x_sxy +#define LigatureAttachFunc otv_x_sxy +#define Mark2ArrayFunc otv_x_sxy + + /* uses valid->extra1 (counter) */ + /* uses valid->extra2 (boolean to handle NULL anchor field) */ + + static void + otv_x_sxy( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count, count1, table_size; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * valid->extra1 * 2 ); + + table_size = Count * valid->extra1 * 2 + 2; + + for ( ; Count > 0; Count-- ) + for ( count1 = valid->extra1; count1 > 0; count1-- ) + { + OTV_OPTIONAL_TABLE( anchor_offset ); + + + OTV_OPTIONAL_OFFSET( anchor_offset ); + + if ( valid->extra2 ) + { + OTV_SIZE_CHECK( anchor_offset ); + if ( anchor_offset ) + otv_Anchor_validate( table + anchor_offset, valid ); + } + else + otv_Anchor_validate( table + anchor_offset, valid ); + } + + OTV_EXIT; + } + + +#define MarkBasePosFormat1Func otv_u_O_O_u_O_O +#define MarkLigPosFormat1Func otv_u_O_O_u_O_O +#define MarkMarkPosFormat1Func otv_u_O_O_u_O_O + + /* sets valid->extra1 (class count) */ + + static void + otv_u_O_O_u_O_O( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Coverage1, Coverage2, ClassCount; + FT_UInt Array1, Array2; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip PosFormat */ + + OTV_LIMIT_CHECK( 10 ); + Coverage1 = FT_NEXT_USHORT( p ); + Coverage2 = FT_NEXT_USHORT( p ); + ClassCount = FT_NEXT_USHORT( p ); + Array1 = FT_NEXT_USHORT( p ); + Array2 = FT_NEXT_USHORT( p ); + + otv_Coverage_validate( table + Coverage1, valid, -1 ); + otv_Coverage_validate( table + Coverage2, valid, -1 ); + + otv_MarkArray_validate( table + Array1, valid ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + valid->extra1 = ClassCount; + + func( table + Array2, valid ); + + valid->nesting_level--; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALUE RECORDS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_UInt + otv_value_length( FT_UInt format ) + { + FT_UInt count; + + + count = ( ( format & 0xAA ) >> 1 ) + ( format & 0x55 ); + count = ( ( count & 0xCC ) >> 2 ) + ( count & 0x33 ); + count = ( ( count & 0xF0 ) >> 4 ) + ( count & 0x0F ); + + return count * 2; + } + + + /* uses valid->extra3 (pointer to base table) */ + + static void + otv_ValueRecord_validate( FT_Bytes table, + FT_UInt format, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt count; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Int loop; + FT_ULong res = 0; + + + OTV_NAME_ENTER( "ValueRecord" ); + + /* display `format' in dual representation */ + for ( loop = 7; loop >= 0; loop-- ) + { + res <<= 4; + res += ( format >> loop ) & 1; + } + + OTV_TRACE(( " (format 0b%08lx)\n", res )); +#endif + + if ( format >= 0x100 ) + FT_INVALID_FORMAT; + + for ( count = 4; count > 0; count-- ) + { + if ( format & 1 ) + { + /* XPlacement, YPlacement, XAdvance, YAdvance */ + OTV_LIMIT_CHECK( 2 ); + p += 2; + } + + format >>= 1; + } + + for ( count = 4; count > 0; count-- ) + { + if ( format & 1 ) + { + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( device ); + + + /* XPlaDevice, YPlaDevice, XAdvDevice, YAdvDevice */ + OTV_LIMIT_CHECK( 2 ); + OTV_OPTIONAL_OFFSET( device ); + + /* XXX: this value is usually too small, especially if the current */ + /* ValueRecord is part of an array -- getting the correct table */ + /* size is probably not worth the trouble */ + + table_size = p - valid->extra3; + + OTV_SIZE_CHECK( device ); + if ( device ) + otv_Device_validate( valid->extra3 + device, valid ); + } + format >>= 1; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** ANCHORS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_Anchor_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt AnchorFormat; + + + OTV_NAME_ENTER( "Anchor"); + + OTV_LIMIT_CHECK( 6 ); + AnchorFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", AnchorFormat )); + + p += 4; /* skip XCoordinate and YCoordinate */ + + switch ( AnchorFormat ) + { + case 1: + break; + + case 2: + OTV_LIMIT_CHECK( 2 ); /* AnchorPoint */ + break; + + case 3: + { + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( XDeviceTable ); + OTV_OPTIONAL_TABLE( YDeviceTable ); + + + OTV_LIMIT_CHECK( 4 ); + OTV_OPTIONAL_OFFSET( XDeviceTable ); + OTV_OPTIONAL_OFFSET( YDeviceTable ); + + table_size = 6 + 4; + + OTV_SIZE_CHECK( XDeviceTable ); + if ( XDeviceTable ) + otv_Device_validate( table + XDeviceTable, valid ); + + OTV_SIZE_CHECK( YDeviceTable ); + if ( YDeviceTable ) + otv_Device_validate( table + YDeviceTable, valid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MARK ARRAYS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MarkArray_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt MarkCount; + + + OTV_NAME_ENTER( "MarkArray" ); + + OTV_LIMIT_CHECK( 2 ); + MarkCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (MarkCount = %d)\n", MarkCount )); + + OTV_LIMIT_CHECK( MarkCount * 4 ); + + /* MarkRecord */ + for ( ; MarkCount > 0; MarkCount-- ) + { + p += 2; /* skip Class */ + /* MarkAnchor */ + otv_Anchor_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 1 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra3 (pointer to base table) */ + + static void + otv_SinglePos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "SinglePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + valid->extra3 = table; + + switch ( PosFormat ) + { + case 1: /* SinglePosFormat1 */ + { + FT_UInt Coverage, ValueFormat; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat = FT_NEXT_USHORT( p ); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + otv_ValueRecord_validate( p, ValueFormat, valid ); /* Value */ + } + break; + + case 2: /* SinglePosFormat2 */ + { + FT_UInt Coverage, ValueFormat, ValueCount, len_value; + + + OTV_LIMIT_CHECK( 6 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat = FT_NEXT_USHORT( p ); + ValueCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ValueCount = %d)\n", ValueCount )); + + len_value = otv_value_length( ValueFormat ); + + otv_Coverage_validate( table + Coverage, valid, ValueCount ); + + OTV_LIMIT_CHECK( ValueCount * len_value ); + + /* Value */ + for ( ; ValueCount > 0; ValueCount-- ) + { + otv_ValueRecord_validate( p, ValueFormat, valid ); + p += len_value; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 2 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_PairSet_validate( FT_Bytes table, + FT_UInt format1, + FT_UInt format2, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt value_len1, value_len2, PairValueCount; + + + OTV_NAME_ENTER( "PairSet" ); + + OTV_LIMIT_CHECK( 2 ); + PairValueCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (PairValueCount = %d)\n", PairValueCount )); + + value_len1 = otv_value_length( format1 ); + value_len2 = otv_value_length( format2 ); + + OTV_LIMIT_CHECK( PairValueCount * ( value_len1 + value_len2 + 2 ) ); + + /* PairValueRecord */ + for ( ; PairValueCount > 0; PairValueCount-- ) + { + p += 2; /* skip SecondGlyph */ + + if ( format1 ) + otv_ValueRecord_validate( p, format1, valid ); /* Value1 */ + p += value_len1; + + if ( format2 ) + otv_ValueRecord_validate( p, format2, valid ); /* Value2 */ + p += value_len2; + } + + OTV_EXIT; + } + + + /* sets valid->extra3 (pointer to base table) */ + + static void + otv_PairPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "PairPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + valid->extra3 = table; + + switch ( PosFormat ) + { + case 1: /* PairPosFormat1 */ + { + FT_UInt Coverage, ValueFormat1, ValueFormat2, PairSetCount; + + + OTV_LIMIT_CHECK( 8 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat1 = FT_NEXT_USHORT( p ); + ValueFormat2 = FT_NEXT_USHORT( p ); + PairSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (PairSetCount = %d)\n", PairSetCount )); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + + OTV_LIMIT_CHECK( PairSetCount * 2 ); + + /* PairSetOffset */ + for ( ; PairSetCount > 0; PairSetCount-- ) + otv_PairSet_validate( table + FT_NEXT_USHORT( p ), + ValueFormat1, ValueFormat2, valid ); + } + break; + + case 2: /* PairPosFormat2 */ + { + FT_UInt Coverage, ValueFormat1, ValueFormat2, ClassDef1, ClassDef2; + FT_UInt ClassCount1, ClassCount2, len_value1, len_value2, count; + + + OTV_LIMIT_CHECK( 14 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat1 = FT_NEXT_USHORT( p ); + ValueFormat2 = FT_NEXT_USHORT( p ); + ClassDef1 = FT_NEXT_USHORT( p ); + ClassDef2 = FT_NEXT_USHORT( p ); + ClassCount1 = FT_NEXT_USHORT( p ); + ClassCount2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassCount1 = %d)\n", ClassCount1 )); + OTV_TRACE(( " (ClassCount2 = %d)\n", ClassCount2 )); + + len_value1 = otv_value_length( ValueFormat1 ); + len_value2 = otv_value_length( ValueFormat2 ); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + otv_ClassDef_validate( table + ClassDef1, valid ); + otv_ClassDef_validate( table + ClassDef2, valid ); + + OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 * + ( len_value1 + len_value2 ) ); + + /* Class1Record */ + for ( ; ClassCount1 > 0; ClassCount1-- ) + { + /* Class2Record */ + for ( count = ClassCount2; count > 0; count-- ) + { + if ( ValueFormat1 ) + /* Value1 */ + otv_ValueRecord_validate( p, ValueFormat1, valid ); + p += len_value1; + + if ( ValueFormat2 ) + /* Value2 */ + otv_ValueRecord_validate( p, ValueFormat2, valid ); + p += len_value2; + } + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 3 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_CursivePos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "CursivePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: /* CursivePosFormat1 */ + { + FT_UInt table_size; + FT_UInt Coverage, EntryExitCount; + + OTV_OPTIONAL_TABLE( EntryAnchor ); + OTV_OPTIONAL_TABLE( ExitAnchor ); + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + EntryExitCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (EntryExitCount = %d)\n", EntryExitCount )); + + otv_Coverage_validate( table + Coverage, valid, EntryExitCount ); + + OTV_LIMIT_CHECK( EntryExitCount * 4 ); + + table_size = EntryExitCount * 4 + 4; + + /* EntryExitRecord */ + for ( ; EntryExitCount > 0; EntryExitCount-- ) + { + OTV_OPTIONAL_OFFSET( EntryAnchor ); + OTV_OPTIONAL_OFFSET( ExitAnchor ); + + OTV_SIZE_CHECK( EntryAnchor ); + if ( EntryAnchor ) + otv_Anchor_validate( table + EntryAnchor, valid ); + + OTV_SIZE_CHECK( ExitAnchor ); + if ( ExitAnchor ) + otv_Anchor_validate( table + ExitAnchor, valid ); + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* UNDOCUMENTED (in OpenType 1.5): */ + /* BaseRecord tables can contain NULL pointers. */ + + /* sets valid->extra2 (1) */ + + static void + otv_MarkBasePos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkBasePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + valid->extra2 = 1; + OTV_NEST2( MarkBasePosFormat1, BaseArray ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 5 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra2 (1) */ + + static void + otv_MarkLigPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkLigPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + valid->extra2 = 1; + OTV_NEST3( MarkLigPosFormat1, LigatureArray, LigatureAttach ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra2 (0) */ + + static void + otv_MarkMarkPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkMarkPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + valid->extra2 = 0; + OTV_NEST2( MarkMarkPosFormat1, Mark2Array ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 7 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (lookup count) */ + + static void + otv_ContextPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ContextPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + valid->extra1 = valid->lookup_count; + OTV_NEST3( ContextPosFormat1, PosRuleSet, PosRule ); + OTV_RUN( table, valid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ContextPosFormat2, PosClassSet, PosClassRule ); + OTV_RUN( table, valid ); + break; + + case 3: + OTV_NEST1( ContextPosFormat3 ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 8 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (lookup count) */ + + static void + otv_ChainContextPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ChainContextPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + valid->extra1 = valid->lookup_count; + OTV_NEST3( ChainContextPosFormat1, + ChainPosRuleSet, ChainPosRule ); + OTV_RUN( table, valid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ChainContextPosFormat2, + ChainPosClassSet, ChainPosClassRule ); + OTV_RUN( table, valid ); + break; + + case 3: + OTV_NEST1( ChainContextPosFormat3 ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 9 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->type_funcs */ + + static void + otv_ExtensionPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ExtensionPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: /* ExtensionPosFormat1 */ + { + FT_UInt ExtensionLookupType, ExtensionOffset; + OTV_Validate_Func validate; + + + OTV_LIMIT_CHECK( 6 ); + ExtensionLookupType = FT_NEXT_USHORT( p ); + ExtensionOffset = FT_NEXT_ULONG( p ); + + if ( ExtensionLookupType == 0 || ExtensionLookupType >= 9 ) + FT_INVALID_DATA; + + validate = valid->type_funcs[ExtensionLookupType - 1]; + validate( table + ExtensionOffset, valid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static const OTV_Validate_Func otv_gpos_validate_funcs[9] = + { + otv_SinglePos_validate, + otv_PairPos_validate, + otv_CursivePos_validate, + otv_MarkBasePos_validate, + otv_MarkLigPos_validate, + otv_MarkMarkPos_validate, + otv_ContextPos_validate, + otv_ChainContextPos_validate, + otv_ExtensionPos_validate + }; + + + /* sets valid->type_count */ + /* sets valid->type_funcs */ + + FT_LOCAL_DEF( void ) + otv_GPOS_subtable_validate( FT_Bytes table, + OTV_Validator valid ) + { + valid->type_count = 9; + valid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; + + otv_Lookup_validate( table, valid ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GPOS_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt ScriptList, FeatureList, LookupList; + + + valid->root = ftvalid; + + FT_TRACE3(( "validating GPOS table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 10 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + ScriptList = FT_NEXT_USHORT( p ); + FeatureList = FT_NEXT_USHORT( p ); + LookupList = FT_NEXT_USHORT( p ); + + valid->type_count = 9; + valid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; + valid->glyph_count = glyph_count; + + otv_LookupList_validate( table + LookupList, + valid ); + otv_FeatureList_validate( table + FeatureList, table + LookupList, + valid ); + otv_ScriptList_validate( table + ScriptList, table + FeatureList, + valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvgpos.h b/src/3rdparty/freetype/src/otvalid/otvgpos.h new file mode 100644 index 0000000000..14ca408261 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvgpos.h @@ -0,0 +1,36 @@ +/***************************************************************************/ +/* */ +/* otvgpos.h */ +/* */ +/* OpenType GPOS table validator (specification). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __OTVGPOS_H__ +#define __OTVGPOS_H__ + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + otv_GPOS_subtable_validate( FT_Bytes table, + OTV_Validator valid ); + + +FT_END_HEADER + +#endif /* __OTVGPOS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvgsub.c b/src/3rdparty/freetype/src/otvalid/otvgsub.c new file mode 100644 index 0000000000..f01fca1e89 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvgsub.c @@ -0,0 +1,584 @@ +/***************************************************************************/ +/* */ +/* otvgsub.c */ +/* */ +/* OpenType GSUB table validation (body). */ +/* */ +/* Copyright 2004, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvgsub + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 1 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->glyph_count */ + + static void + otv_SingleSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "SingleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* SingleSubstFormat1 */ + { + FT_Bytes Coverage; + FT_Int DeltaGlyphID; + FT_Long idx; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + DeltaGlyphID = FT_NEXT_SHORT( p ); + + otv_Coverage_validate( Coverage, valid, -1 ); + + idx = otv_Coverage_get_first( Coverage ) + DeltaGlyphID; + if ( idx < 0 ) + FT_INVALID_DATA; + + idx = otv_Coverage_get_last( Coverage ) + DeltaGlyphID; + if ( (FT_UInt)idx >= valid->glyph_count ) + FT_INVALID_DATA; + } + break; + + case 2: /* SingleSubstFormat2 */ + { + FT_UInt Coverage, GlyphCount; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + otv_Coverage_validate( table + Coverage, valid, GlyphCount ); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + /* Substitute */ + for ( ; GlyphCount > 0; GlyphCount-- ) + if ( FT_NEXT_USHORT( p ) >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 2 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (glyph count) */ + + static void + otv_MultipleSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "MultipleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + valid->extra1 = valid->glyph_count; + OTV_NEST2( MultipleSubstFormat1, Sequence ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 3 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (glyph count) */ + + static void + otv_AlternateSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "AlternateSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + valid->extra1 = valid->glyph_count; + OTV_NEST2( AlternateSubstFormat1, AlternateSet ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define LigatureFunc otv_Ligature_validate + + /* uses valid->glyph_count */ + + static void + otv_Ligature_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt LigatureGlyph, CompCount; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + LigatureGlyph = FT_NEXT_USHORT( p ); + if ( LigatureGlyph >= valid->glyph_count ) + FT_INVALID_DATA; + + CompCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (CompCount = %d)\n", CompCount )); + + if ( CompCount == 0 ) + FT_INVALID_DATA; + + CompCount--; + + OTV_LIMIT_CHECK( CompCount * 2 ); /* Component */ + + /* no need to check the Component glyph indices */ + + OTV_EXIT; + } + + + static void + otv_LigatureSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "LigatureSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + OTV_NEST3( LigatureSubstFormat1, LigatureSet, Ligature ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 5 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (lookup count) */ + + static void + otv_ContextSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ContextSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + valid->extra1 = valid->lookup_count; + OTV_NEST3( ContextSubstFormat1, SubRuleSet, SubRule ); + OTV_RUN( table, valid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ContextSubstFormat2, SubClassSet, SubClassRule ); + OTV_RUN( table, valid ); + break; + + case 3: + OTV_NEST1( ContextSubstFormat3 ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (lookup count) */ + + static void + otv_ChainContextSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ChainContextSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + valid->extra1 = valid->lookup_count; + OTV_NEST3( ChainContextSubstFormat1, + ChainSubRuleSet, ChainSubRule ); + OTV_RUN( table, valid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ChainContextSubstFormat2, + ChainSubClassSet, ChainSubClassRule ); + OTV_RUN( table, valid ); + break; + + case 3: + OTV_NEST1( ChainContextSubstFormat3 ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 7 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->type_funcs */ + + static void + otv_ExtensionSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ExtensionSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* ExtensionSubstFormat1 */ + { + FT_UInt ExtensionLookupType, ExtensionOffset; + OTV_Validate_Func validate; + + + OTV_LIMIT_CHECK( 6 ); + ExtensionLookupType = FT_NEXT_USHORT( p ); + ExtensionOffset = FT_NEXT_ULONG( p ); + + if ( ExtensionLookupType == 0 || + ExtensionLookupType == 7 || + ExtensionLookupType > 8 ) + FT_INVALID_DATA; + + validate = valid->type_funcs[ExtensionLookupType - 1]; + validate( table + ExtensionOffset, valid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 8 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->glyph_count */ + + static void + otv_ReverseChainSingleSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table, Coverage; + FT_UInt SubstFormat; + FT_UInt BacktrackGlyphCount, LookaheadGlyphCount, GlyphCount; + + + OTV_NAME_ENTER( "ReverseChainSingleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* ReverseChainSingleSubstFormat1 */ + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + BacktrackGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount )); + + otv_Coverage_validate( Coverage, valid, -1 ); + + OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); + + for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + LookaheadGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount )); + + OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 ); + + for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + if ( GlyphCount != otv_Coverage_get_count( Coverage ) ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + /* Substitute */ + for ( ; GlyphCount > 0; GlyphCount-- ) + if ( FT_NEXT_USHORT( p ) >= valid->glyph_count ) + FT_INVALID_DATA; + + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static const OTV_Validate_Func otv_gsub_validate_funcs[8] = + { + otv_SingleSubst_validate, + otv_MultipleSubst_validate, + otv_AlternateSubst_validate, + otv_LigatureSubst_validate, + otv_ContextSubst_validate, + otv_ChainContextSubst_validate, + otv_ExtensionSubst_validate, + otv_ReverseChainSingleSubst_validate + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->type_count */ + /* sets valid->type_funcs */ + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GSUB_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt ScriptList, FeatureList, LookupList; + + + valid->root = ftvalid; + + FT_TRACE3(( "validating GSUB table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 10 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + ScriptList = FT_NEXT_USHORT( p ); + FeatureList = FT_NEXT_USHORT( p ); + LookupList = FT_NEXT_USHORT( p ); + + valid->type_count = 8; + valid->type_funcs = (OTV_Validate_Func*)otv_gsub_validate_funcs; + valid->glyph_count = glyph_count; + + otv_LookupList_validate( table + LookupList, + valid ); + otv_FeatureList_validate( table + FeatureList, table + LookupList, + valid ); + otv_ScriptList_validate( table + ScriptList, table + FeatureList, + valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvjstf.c b/src/3rdparty/freetype/src/otvalid/otvjstf.c new file mode 100644 index 0000000000..a616a23432 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvjstf.c @@ -0,0 +1,258 @@ +/***************************************************************************/ +/* */ +/* otvjstf.c */ +/* */ +/* OpenType JSTF table validation (body). */ +/* */ +/* Copyright 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvjstf + + +#define JstfPriorityFunc otv_JstfPriority_validate +#define JstfLookupFunc otv_GPOS_subtable_validate + + /* uses valid->extra1 (GSUB lookup count) */ + /* uses valid->extra2 (GPOS lookup count) */ + /* sets valid->extra1 (counter) */ + + static void + otv_JstfPriority_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt gsub_lookup_count, gpos_lookup_count; + + OTV_OPTIONAL_TABLE( ShrinkageEnableGSUB ); + OTV_OPTIONAL_TABLE( ShrinkageDisableGSUB ); + OTV_OPTIONAL_TABLE( ShrinkageEnableGPOS ); + OTV_OPTIONAL_TABLE( ShrinkageDisableGPOS ); + OTV_OPTIONAL_TABLE( ExtensionEnableGSUB ); + OTV_OPTIONAL_TABLE( ExtensionDisableGSUB ); + OTV_OPTIONAL_TABLE( ExtensionEnableGPOS ); + OTV_OPTIONAL_TABLE( ExtensionDisableGPOS ); + OTV_OPTIONAL_TABLE( ShrinkageJstfMax ); + OTV_OPTIONAL_TABLE( ExtensionJstfMax ); + + + OTV_ENTER; + OTV_TRACE(( "JstfPriority table\n" )); + + OTV_LIMIT_CHECK( 20 ); + + gsub_lookup_count = valid->extra1; + gpos_lookup_count = valid->extra2; + + table_size = 20; + + valid->extra1 = gsub_lookup_count; + + OTV_OPTIONAL_OFFSET( ShrinkageEnableGSUB ); + OTV_SIZE_CHECK( ShrinkageEnableGSUB ); + if ( ShrinkageEnableGSUB ) + otv_x_ux( table + ShrinkageEnableGSUB, valid ); + + OTV_OPTIONAL_OFFSET( ShrinkageDisableGSUB ); + OTV_SIZE_CHECK( ShrinkageDisableGSUB ); + if ( ShrinkageDisableGSUB ) + otv_x_ux( table + ShrinkageDisableGSUB, valid ); + + valid->extra1 = gpos_lookup_count; + + OTV_OPTIONAL_OFFSET( ShrinkageEnableGPOS ); + OTV_SIZE_CHECK( ShrinkageEnableGPOS ); + if ( ShrinkageEnableGPOS ) + otv_x_ux( table + ShrinkageEnableGPOS, valid ); + + OTV_OPTIONAL_OFFSET( ShrinkageDisableGPOS ); + OTV_SIZE_CHECK( ShrinkageDisableGPOS ); + if ( ShrinkageDisableGPOS ) + otv_x_ux( table + ShrinkageDisableGPOS, valid ); + + OTV_OPTIONAL_OFFSET( ShrinkageJstfMax ); + OTV_SIZE_CHECK( ShrinkageJstfMax ); + if ( ShrinkageJstfMax ) + { + /* XXX: check lookup types? */ + OTV_NEST2( JstfMax, JstfLookup ); + OTV_RUN( table + ShrinkageJstfMax, valid ); + } + + valid->extra1 = gsub_lookup_count; + + OTV_OPTIONAL_OFFSET( ExtensionEnableGSUB ); + OTV_SIZE_CHECK( ExtensionEnableGSUB ); + if ( ExtensionEnableGSUB ) + otv_x_ux( table + ExtensionEnableGSUB, valid ); + + OTV_OPTIONAL_OFFSET( ExtensionDisableGSUB ); + OTV_SIZE_CHECK( ExtensionDisableGSUB ); + if ( ExtensionDisableGSUB ) + otv_x_ux( table + ExtensionDisableGSUB, valid ); + + valid->extra1 = gpos_lookup_count; + + OTV_OPTIONAL_OFFSET( ExtensionEnableGPOS ); + OTV_SIZE_CHECK( ExtensionEnableGPOS ); + if ( ExtensionEnableGPOS ) + otv_x_ux( table + ExtensionEnableGPOS, valid ); + + OTV_OPTIONAL_OFFSET( ExtensionDisableGPOS ); + OTV_SIZE_CHECK( ExtensionDisableGPOS ); + if ( ExtensionDisableGPOS ) + otv_x_ux( table + ExtensionDisableGPOS, valid ); + + OTV_OPTIONAL_OFFSET( ExtensionJstfMax ); + OTV_SIZE_CHECK( ExtensionJstfMax ); + if ( ExtensionJstfMax ) + { + /* XXX: check lookup types? */ + OTV_NEST2( JstfMax, JstfLookup ); + OTV_RUN( table + ExtensionJstfMax, valid ); + } + + valid->extra1 = gsub_lookup_count; + valid->extra2 = gpos_lookup_count; + + OTV_EXIT; + } + + + /* sets valid->extra (glyph count) */ + /* sets valid->func1 (otv_JstfPriority_validate) */ + + static void + otv_JstfScript_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt JstfLangSysCount; + + OTV_OPTIONAL_TABLE( ExtGlyph ); + OTV_OPTIONAL_TABLE( DefJstfLangSys ); + + + OTV_NAME_ENTER( "JstfScript" ); + + OTV_LIMIT_CHECK( 6 ); + OTV_OPTIONAL_OFFSET( ExtGlyph ); + OTV_OPTIONAL_OFFSET( DefJstfLangSys ); + JstfLangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (JstfLangSysCount = %d)\n", JstfLangSysCount )); + + table_size = JstfLangSysCount * 6 + 6; + + OTV_SIZE_CHECK( ExtGlyph ); + if ( ExtGlyph ) + { + valid->extra1 = valid->glyph_count; + OTV_NEST1( ExtenderGlyph ); + OTV_RUN( table + ExtGlyph, valid ); + } + + OTV_SIZE_CHECK( DefJstfLangSys ); + if ( DefJstfLangSys ) + { + OTV_NEST2( JstfLangSys, JstfPriority ); + OTV_RUN( table + DefJstfLangSys, valid ); + } + + OTV_LIMIT_CHECK( 6 * JstfLangSysCount ); + + /* JstfLangSysRecord */ + OTV_NEST2( JstfLangSys, JstfPriority ); + for ( ; JstfLangSysCount > 0; JstfLangSysCount-- ) + { + p += 4; /* skip JstfLangSysTag */ + + OTV_RUN( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + /* sets valid->extra1 (GSUB lookup count) */ + /* sets valid->extra2 (GPOS lookup count) */ + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_JSTF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt JstfScriptCount; + + + valid->root = ftvalid; + + FT_TRACE3(( "validating JSTF table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 6 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + JstfScriptCount = FT_NEXT_USHORT( p ); + + FT_TRACE3(( " (JstfScriptCount = %d)\n", JstfScriptCount )); + + OTV_LIMIT_CHECK( JstfScriptCount * 6 ); + + if ( gsub ) + valid->extra1 = otv_GSUBGPOS_get_Lookup_count( gsub ); + else + valid->extra1 = 0; + + if ( gpos ) + valid->extra2 = otv_GSUBGPOS_get_Lookup_count( gpos ); + else + valid->extra2 = 0; + + valid->glyph_count = glyph_count; + + /* JstfScriptRecord */ + for ( ; JstfScriptCount > 0; JstfScriptCount-- ) + { + p += 4; /* skip JstfScriptTag */ + + /* JstfScript */ + otv_JstfScript_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvmath.c b/src/3rdparty/freetype/src/otvalid/otvmath.c new file mode 100644 index 0000000000..50ed10cf28 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvmath.c @@ -0,0 +1,452 @@ +/***************************************************************************/ +/* */ +/* otvmath.c */ +/* */ +/* OpenType MATH table validation (body). */ +/* */ +/* Copyright 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* Written by George Williams. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvmath + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH TYPOGRAPHIC CONSTANTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathConstants_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt i; + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + OTV_NAME_ENTER( "MathConstants" ); + + /* 56 constants, 51 have device tables */ + OTV_LIMIT_CHECK( 2 * ( 56 + 51 ) ); + table_size = 2 * ( 56 + 51 ); + + p += 4 * 2; /* First 4 constants have no device tables */ + for ( i = 0; i < 51; ++i ) + { + p += 2; /* skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH ITALICS CORRECTION *****/ + /***** MATH TOP ACCENT ATTACHMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathItalicsCorrectionInfo_validate( FT_Bytes table, + OTV_Validator valid, + FT_Int isItalic ) + { + FT_Bytes p = table; + FT_UInt i, cnt, table_size ; + + OTV_OPTIONAL_TABLE( Coverage ); + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + FT_UNUSED( isItalic ); /* only used if tracing is active */ + + + OTV_NAME_ENTER( isItalic ? "MathItalicsCorrectionInfo" + : "MathTopAccentAttachment" ); + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( Coverage ); + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * cnt ); + table_size = 4 + 4 * cnt; + + OTV_SIZE_CHECK( Coverage ); + otv_Coverage_validate( table + Coverage, valid, cnt ); + + for ( i = 0; i < cnt; ++i ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH KERNING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathKern_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt i, cnt, table_size; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + /* OTV_NAME_ENTER( "MathKern" );*/ + + OTV_LIMIT_CHECK( 2 ); + + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * cnt + 2 ); + table_size = 4 + 4 * cnt; + + /* Heights */ + for ( i = 0; i < cnt; ++i ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + } + + /* One more Kerning value */ + for ( i = 0; i < cnt + 1; ++i ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + } + + OTV_EXIT; + } + + + static void + otv_MathKernInfo_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt i, j, cnt, table_size; + + OTV_OPTIONAL_TABLE( Coverage ); + OTV_OPTIONAL_TABLE( MKRecordOffset ); + + + OTV_NAME_ENTER( "MathKernInfo" ); + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( Coverage ); + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 8 * cnt ); + table_size = 4 + 8 * cnt; + + OTV_SIZE_CHECK( Coverage ); + otv_Coverage_validate( table + Coverage, valid, cnt ); + + for ( i = 0; i < cnt; ++i ) + { + for ( j = 0; j < 4; ++j ) + { + OTV_OPTIONAL_OFFSET( MKRecordOffset ); + OTV_SIZE_CHECK( MKRecordOffset ); + if ( MKRecordOffset ) + otv_MathKern_validate( table + MKRecordOffset, valid ); + } + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH GLYPH INFO *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathGlyphInfo_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt MathItalicsCorrectionInfo, MathTopAccentAttachment; + FT_UInt ExtendedShapeCoverage, MathKernInfo; + + + OTV_NAME_ENTER( "MathGlyphInfo" ); + + OTV_LIMIT_CHECK( 8 ); + + MathItalicsCorrectionInfo = FT_NEXT_USHORT( p ); + MathTopAccentAttachment = FT_NEXT_USHORT( p ); + ExtendedShapeCoverage = FT_NEXT_USHORT( p ); + MathKernInfo = FT_NEXT_USHORT( p ); + + if ( MathItalicsCorrectionInfo ) + otv_MathItalicsCorrectionInfo_validate( + table + MathItalicsCorrectionInfo, valid, TRUE ); + + /* Italic correction and Top Accent Attachment have the same format */ + if ( MathTopAccentAttachment ) + otv_MathItalicsCorrectionInfo_validate( + table + MathTopAccentAttachment, valid, FALSE ); + + if ( ExtendedShapeCoverage ) { + OTV_NAME_ENTER( "ExtendedShapeCoverage" ); + otv_Coverage_validate( table + ExtendedShapeCoverage, valid, -1 ); + OTV_EXIT; + } + + if ( MathKernInfo ) + otv_MathKernInfo_validate( table + MathKernInfo, valid ); + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH GLYPH CONSTRUCTION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_GlyphAssembly_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt pcnt, table_size; + FT_UInt i; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + /* OTV_NAME_ENTER( "GlyphAssembly" ); */ + + OTV_LIMIT_CHECK( 6 ); + + p += 2; /* Skip the Italics Correction value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + pcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 8 * pcnt ); + table_size = 6 + 8 * pcnt; + + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + + for ( i = 0; i < pcnt; ++i ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + p += 2*4; /* skip the Start, End, Full, and Flags fields */ + } + + /* OTV_EXIT; */ + } + + + static void + otv_MathGlyphConstruction_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt vcnt, table_size; + FT_UInt i; + + OTV_OPTIONAL_TABLE( GlyphAssembly ); + + + /* OTV_NAME_ENTER( "MathGlyphConstruction" ); */ + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( GlyphAssembly ); + vcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * vcnt ); + table_size = 4 + 4 * vcnt; + + for ( i = 0; i < vcnt; ++i ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + p += 2; /* skip the size */ + } + + OTV_SIZE_CHECK( GlyphAssembly ); + if ( GlyphAssembly ) + otv_GlyphAssembly_validate( table+GlyphAssembly, valid ); + + /* OTV_EXIT; */ + } + + + static void + otv_MathVariants_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt vcnt, hcnt, i, table_size; + + OTV_OPTIONAL_TABLE( VCoverage ); + OTV_OPTIONAL_TABLE( HCoverage ); + OTV_OPTIONAL_TABLE( Offset ); + + + OTV_NAME_ENTER( "MathVariants" ); + + OTV_LIMIT_CHECK( 10 ); + + p += 2; /* Skip the MinConnectorOverlap constant */ + OTV_OPTIONAL_OFFSET( VCoverage ); + OTV_OPTIONAL_OFFSET( HCoverage ); + vcnt = FT_NEXT_USHORT( p ); + hcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 2 * vcnt + 2 * hcnt ); + table_size = 10 + 2 * vcnt + 2 * hcnt; + + OTV_SIZE_CHECK( VCoverage ); + if ( VCoverage ) + otv_Coverage_validate( table + VCoverage, valid, vcnt ); + + OTV_SIZE_CHECK( HCoverage ); + if ( HCoverage ) + otv_Coverage_validate( table + HCoverage, valid, hcnt ); + + for ( i = 0; i < vcnt; ++i ) + { + OTV_OPTIONAL_OFFSET( Offset ); + OTV_SIZE_CHECK( Offset ); + otv_MathGlyphConstruction_validate( table + Offset, valid ); + } + + for ( i = 0; i < hcnt; ++i ) + { + OTV_OPTIONAL_OFFSET( Offset ); + OTV_SIZE_CHECK( Offset ); + otv_MathGlyphConstruction_validate( table + Offset, valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_MATH_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt MathConstants, MathGlyphInfo, MathVariants; + + + valid->root = ftvalid; + + FT_TRACE3(( "validating MATH table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 10 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + MathConstants = FT_NEXT_USHORT( p ); + MathGlyphInfo = FT_NEXT_USHORT( p ); + MathVariants = FT_NEXT_USHORT( p ); + + valid->glyph_count = glyph_count; + + otv_MathConstants_validate( table + MathConstants, + valid ); + otv_MathGlyphInfo_validate( table + MathGlyphInfo, + valid ); + otv_MathVariants_validate ( table + MathVariants, + valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvmod.c b/src/3rdparty/freetype/src/otvalid/otvmod.c new file mode 100644 index 0000000000..63c25f690c --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvmod.c @@ -0,0 +1,267 @@ +/***************************************************************************/ +/* */ +/* otvmod.c */ +/* */ +/* FreeType's OpenType validation module implementation (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H +#include FT_OPENTYPE_VALIDATE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_OPENTYPE_VALIDATE_H + +#include "otvmod.h" +#include "otvalid.h" +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvmodule + + + static FT_Error + otv_load_table( FT_Face face, + FT_Tag tag, + FT_Byte* volatile* table, + FT_ULong* table_len ) + { + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len ); + if ( error == OTV_Err_Table_Missing ) + return OTV_Err_Ok; + if ( error ) + goto Exit; + + if ( FT_ALLOC( *table, *table_len ) ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len ); + + Exit: + return error; + } + + + static FT_Error + otv_validate( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *ot_base, + FT_Bytes *ot_gdef, + FT_Bytes *ot_gpos, + FT_Bytes *ot_gsub, + FT_Bytes *ot_jstf ) + { + FT_Error error = OTV_Err_Ok; + FT_Byte* volatile base; + FT_Byte* volatile gdef; + FT_Byte* volatile gpos; + FT_Byte* volatile gsub; + FT_Byte* volatile jstf; + FT_Byte* volatile math; + FT_ULong len_base, len_gdef, len_gpos, len_gsub, len_jstf; + FT_ULong len_math; + FT_ValidatorRec volatile valid; + + + base = gdef = gpos = gsub = jstf = math = NULL; + len_base = len_gdef = len_gpos = len_gsub = len_jstf = len_math = 0; + + /* load tables */ + + if ( ot_flags & FT_VALIDATE_BASE ) + { + error = otv_load_table( face, TTAG_BASE, &base, &len_base ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GDEF ) + { + error = otv_load_table( face, TTAG_GDEF, &gdef, &len_gdef ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GPOS ) + { + error = otv_load_table( face, TTAG_GPOS, &gpos, &len_gpos ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GSUB ) + { + error = otv_load_table( face, TTAG_GSUB, &gsub, &len_gsub ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_JSTF ) + { + error = otv_load_table( face, TTAG_JSTF, &jstf, &len_jstf ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_MATH ) + { + error = otv_load_table( face, TTAG_MATH, &math, &len_math ); + if ( error ) + goto Exit; + } + + /* validate tables */ + + if ( base ) + { + ft_validator_init( &valid, base, base + len_base, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_BASE_validate( base, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gpos ) + { + ft_validator_init( &valid, gpos, gpos + len_gpos, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GPOS_validate( gpos, face->num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gsub ) + { + ft_validator_init( &valid, gsub, gsub + len_gsub, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GSUB_validate( gsub, face->num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gdef ) + { + ft_validator_init( &valid, gdef, gdef + len_gdef, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GDEF_validate( gdef, gsub, gpos, face->num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( jstf ) + { + ft_validator_init( &valid, jstf, jstf + len_jstf, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_JSTF_validate( jstf, gsub, gpos, face->num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( math ) + { + ft_validator_init( &valid, math, math + len_math, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_MATH_validate( math, face->num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + *ot_base = (FT_Bytes)base; + *ot_gdef = (FT_Bytes)gdef; + *ot_gpos = (FT_Bytes)gpos; + *ot_gsub = (FT_Bytes)gsub; + *ot_jstf = (FT_Bytes)jstf; + + Exit: + if ( error ) { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( base ); + FT_FREE( gdef ); + FT_FREE( gpos ); + FT_FREE( gsub ); + FT_FREE( jstf ); + } + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( math ); /* Can't return this as API is frozen */ + } + + return error; + } + + + static + const FT_Service_OTvalidateRec otvalid_interface = + { + otv_validate + }; + + + static + const FT_ServiceDescRec otvalid_services[] = + { + { FT_SERVICE_ID_OPENTYPE_VALIDATE, &otvalid_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + otvalid_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( otvalid_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class otv_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "otvalid", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) otvalid_get_service + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/otvmod.h b/src/3rdparty/freetype/src/otvalid/otvmod.h new file mode 100644 index 0000000000..1bfc1899fe --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/otvmod.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* otvmod.h */ +/* */ +/* FreeType's OpenType validation module implementation */ +/* (specification). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __OTVMOD_H__ +#define __OTVMOD_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Module_Class ) otv_module_class; + + +FT_END_HEADER + +#endif /* __OTVMOD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/otvalid/rules.mk b/src/3rdparty/freetype/src/otvalid/rules.mk new file mode 100644 index 0000000000..53bd41e5e7 --- /dev/null +++ b/src/3rdparty/freetype/src/otvalid/rules.mk @@ -0,0 +1,78 @@ +# +# FreeType 2 OpenType validation driver configuration rules +# + + +# Copyright 2004, 2007 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# OTV driver directory +# +OTV_DIR := $(SRC_DIR)/otvalid + + +# compilation flags for the driver +# +OTV_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(OTV_DIR)) + + +# OTV driver sources (i.e., C files) +# +OTV_DRV_SRC := $(OTV_DIR)/otvbase.c \ + $(OTV_DIR)/otvcommn.c \ + $(OTV_DIR)/otvgdef.c \ + $(OTV_DIR)/otvgpos.c \ + $(OTV_DIR)/otvgsub.c \ + $(OTV_DIR)/otvjstf.c \ + $(OTV_DIR)/otvmath.c \ + $(OTV_DIR)/otvmod.c + +# OTV driver headers +# +OTV_DRV_H := $(OTV_DIR)/otvalid.h \ + $(OTV_DIR)/otvcommn.h \ + $(OTV_DIR)/otverror.h \ + $(OTV_DIR)/otvgpos.h \ + $(OTV_DIR)/otvmod.h + + +# OTV driver object(s) +# +# OTV_DRV_OBJ_M is used during `multi' builds. +# OTV_DRV_OBJ_S is used during `single' builds. +# +OTV_DRV_OBJ_M := $(OTV_DRV_SRC:$(OTV_DIR)/%.c=$(OBJ_DIR)/%.$O) +OTV_DRV_OBJ_S := $(OBJ_DIR)/otvalid.$O + +# OTV driver source file for single build +# +OTV_DRV_SRC_S := $(OTV_DIR)/otvalid.c + + +# OTV driver - single object +# +$(OTV_DRV_OBJ_S): $(OTV_DRV_SRC_S) $(OTV_DRV_SRC) \ + $(FREETYPE_H) $(OTV_DRV_H) + $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(OTV_DRV_SRC_S)) + + +# OTV driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(OTV_DIR)/%.c $(FREETYPE_H) $(OTV_DRV_H) + $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(OTV_DRV_OBJ_S) +DRV_OBJS_M += $(OTV_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/pcf/Jamfile b/src/3rdparty/freetype/src/pcf/Jamfile new file mode 100644 index 0000000000..752fcac2a1 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/pcf Jamfile +# +# Copyright 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) pcf ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = pcfdrivr pcfread pcfutil ; + } + else + { + _sources = pcf ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/pcf Jamfile diff --git a/src/3rdparty/freetype/src/pcf/README b/src/3rdparty/freetype/src/pcf/README new file mode 100644 index 0000000000..cc1480b2d2 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/README @@ -0,0 +1,114 @@ + FreeType font driver for PCF fonts + + Francesco Zappa Nardelli + <francesco.zappa.nardelli@ens.fr> + + +Introduction +************ + +PCF (Portable Compiled Format) is a binary bitmap font format, largely used +in X world. This code implements a PCF driver for the FreeType library. +Glyph images are loaded into memory only on demand, thus leading to a small +memory footprint. + +Information on the PCF font format can only be worked out from +`pcfread.c', and `pcfwrite.c', to be found, for instance, in the XFree86 +(www.xfree86.org) source tree (xc/lib/font/bitmap/). + +Many good bitmap fonts in bdf format come with XFree86: they can be +compiled into the pcf format using the `bdftopcf' utility. + + +Supported hardware +****************** + +The driver has been tested on linux/x86 and sunos5.5/sparc. In both +cases the compiler was gcc. When back in Paris, I will test it also +on linux/alpha. + + +Encodings +********* + +The variety of encodings that accompanies pcf fonts appears to encompass the +small set defined in freetype.h. On the other hand, each pcf font defines +two properties that specify encoding and registry. + +I decided to make these two properties directly accessible, leaving to the +client application the work of interpreting them. For instance: + + #include "pcftypes.h" /* include/freetype/internal/pcftypes.h */ + + FT_Face face; + PCF_Public_Face pcfface; + + FT_New_Face( library,..., &face ); + + pcfface = (PCF_Public_Face)face; + + if ((pcfface->charset_registry == "ISO10646") && + (pcfface->charset_encoding) == "1")) [..] + +Thus the driver always export `ft_encoding_none' as +face->charmap.encoding. FT_Get_Char_Index() behavior is unmodified, that +is, it converts the ULong value given as argument into the corresponding +glyph number. + + +Known problems +************** + +- dealing explicitly with encodings breaks the uniformity of freetype2 + api. + +- except for encodings properties, client applications have no + visibility of the PCF_Face object. This means that applications + cannot directly access font tables and are obliged to trust + FreeType. + +- currently, glyph names and ink_metrics are ignored. + +I plan to give full visibility of the PCF_Face object in the next +release of the driver, thus implementing also glyph names and +ink_metrics. + +- height is defined as (ascent - descent). Is this correct? + +- if unable to read size information from the font, PCF_Init_Face + sets available_size->width and available_size->height to 12. + +- too many english grammar errors in the readme file :-( + + +License +******* + +Copyright (C) 2000 by Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Credits +******* + +Keith Packard wrote the pcf driver found in XFree86. His work is at +the same time the specification and the sample implementation of the +PCF format. Undoubtedly, this driver is inspired from his work. diff --git a/src/3rdparty/freetype/src/pcf/module.mk b/src/3rdparty/freetype/src/pcf/module.mk new file mode 100644 index 0000000000..df383ff0fb --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/module.mk @@ -0,0 +1,34 @@ +# +# FreeType 2 PCF module definition +# + +# Copyright 2000, 2006 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +FTMODULE_H_COMMANDS += PCF_DRIVER + +define PCF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, pcf_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pcf $(ECHO_DRIVER_DESC)pcf bitmap fonts$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/pcf/pcf.c b/src/3rdparty/freetype/src/pcf/pcf.c new file mode 100644 index 0000000000..11d5b7b2a0 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcf.c @@ -0,0 +1,36 @@ +/* pcf.c + + FreeType font driver for pcf fonts + + Copyright 2000-2001, 2003 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + + +#include <ft2build.h> +#include "pcfutil.c" +#include "pcfread.c" +#include "pcfdrivr.c" + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/pcf.h b/src/3rdparty/freetype/src/pcf/pcf.h new file mode 100644 index 0000000000..9d2d8e0e42 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcf.h @@ -0,0 +1,237 @@ +/* pcf.h + + FreeType font driver for pcf fonts + + Copyright (C) 2000, 2001, 2002, 2003, 2006 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCF_H__ +#define __PCF_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + typedef struct PCF_TableRec_ + { + FT_ULong type; + FT_ULong format; + FT_ULong size; + FT_ULong offset; + + } PCF_TableRec, *PCF_Table; + + + typedef struct PCF_TocRec_ + { + FT_ULong version; + FT_ULong count; + PCF_Table tables; + + } PCF_TocRec, *PCF_Toc; + + + typedef struct PCF_ParsePropertyRec_ + { + FT_Long name; + FT_Byte isString; + FT_Long value; + + } PCF_ParsePropertyRec, *PCF_ParseProperty; + + + typedef struct PCF_PropertyRec_ + { + FT_String* name; + FT_Byte isString; + + union + { + FT_String* atom; + FT_Long integer; + FT_ULong cardinal; + + } value; + + } PCF_PropertyRec, *PCF_Property; + + + typedef struct PCF_Compressed_MetricRec_ + { + FT_Byte leftSideBearing; + FT_Byte rightSideBearing; + FT_Byte characterWidth; + FT_Byte ascent; + FT_Byte descent; + + } PCF_Compressed_MetricRec, *PCF_Compressed_Metric; + + + typedef struct PCF_MetricRec_ + { + FT_Short leftSideBearing; + FT_Short rightSideBearing; + FT_Short characterWidth; + FT_Short ascent; + FT_Short descent; + FT_Short attributes; + FT_ULong bits; + + } PCF_MetricRec, *PCF_Metric; + + + typedef struct PCF_AccelRec_ + { + FT_Byte noOverlap; + FT_Byte constantMetrics; + FT_Byte terminalFont; + FT_Byte constantWidth; + FT_Byte inkInside; + FT_Byte inkMetrics; + FT_Byte drawDirection; + FT_Long fontAscent; + FT_Long fontDescent; + FT_Long maxOverlap; + PCF_MetricRec minbounds; + PCF_MetricRec maxbounds; + PCF_MetricRec ink_minbounds; + PCF_MetricRec ink_maxbounds; + + } PCF_AccelRec, *PCF_Accel; + + + typedef struct PCF_EncodingRec_ + { + FT_Long enc; + FT_UShort glyph; + + } PCF_EncodingRec, *PCF_Encoding; + + + typedef struct PCF_FaceRec_ + { + FT_FaceRec root; + + FT_StreamRec gzip_stream; + FT_Stream gzip_source; + + char* charset_encoding; + char* charset_registry; + + PCF_TocRec toc; + PCF_AccelRec accel; + + int nprops; + PCF_Property properties; + + FT_Long nmetrics; + PCF_Metric metrics; + FT_Long nencodings; + PCF_Encoding encodings; + + FT_Short defaultChar; + + FT_ULong bitmapsFormat; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + } PCF_FaceRec, *PCF_Face; + + + /* macros for pcf font format */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#define PCF_FILE_VERSION ( ( 'p' << 24 ) | \ + ( 'c' << 16 ) | \ + ( 'f' << 8 ) | 1 ) +#define PCF_FORMAT_MASK 0xFFFFFF00UL + +#define PCF_DEFAULT_FORMAT 0x00000000UL +#define PCF_INKBOUNDS 0x00000200UL +#define PCF_ACCEL_W_INKBOUNDS 0x00000100UL +#define PCF_COMPRESSED_METRICS 0x00000100UL + +#define PCF_FORMAT_MATCH( a, b ) \ + ( ( (a) & PCF_FORMAT_MASK ) == ( (b) & PCF_FORMAT_MASK ) ) + +#define PCF_GLYPH_PAD_MASK ( 3 << 0 ) +#define PCF_BYTE_MASK ( 1 << 2 ) +#define PCF_BIT_MASK ( 1 << 3 ) +#define PCF_SCAN_UNIT_MASK ( 3 << 4 ) + +#define PCF_BYTE_ORDER( f ) \ + ( ( (f) & PCF_BYTE_MASK ) ? MSBFirst : LSBFirst ) +#define PCF_BIT_ORDER( f ) \ + ( ( (f) & PCF_BIT_MASK ) ? MSBFirst : LSBFirst ) +#define PCF_GLYPH_PAD_INDEX( f ) \ + ( (f) & PCF_GLYPH_PAD_MASK ) +#define PCF_GLYPH_PAD( f ) \ + ( 1 << PCF_GLYPH_PAD_INDEX( f ) ) +#define PCF_SCAN_UNIT_INDEX( f ) \ + ( ( (f) & PCF_SCAN_UNIT_MASK ) >> 4 ) +#define PCF_SCAN_UNIT( f ) \ + ( 1 << PCF_SCAN_UNIT_INDEX( f ) ) +#define PCF_FORMAT_BITS( f ) \ + ( (f) & ( PCF_GLYPH_PAD_MASK | \ + PCF_BYTE_MASK | \ + PCF_BIT_MASK | \ + PCF_SCAN_UNIT_MASK ) ) + +#define PCF_SIZE_TO_INDEX( s ) ( (s) == 4 ? 2 : (s) == 2 ? 1 : 0 ) +#define PCF_INDEX_TO_SIZE( b ) ( 1 << b ) + +#define PCF_FORMAT( bit, byte, glyph, scan ) \ + ( ( PCF_SIZE_TO_INDEX( scan ) << 4 ) | \ + ( ( (bit) == MSBFirst ? 1 : 0 ) << 3 ) | \ + ( ( (byte) == MSBFirst ? 1 : 0 ) << 2 ) | \ + ( PCF_SIZE_TO_INDEX( glyph ) << 0 ) ) + +#define PCF_PROPERTIES ( 1 << 0 ) +#define PCF_ACCELERATORS ( 1 << 1 ) +#define PCF_METRICS ( 1 << 2 ) +#define PCF_BITMAPS ( 1 << 3 ) +#define PCF_INK_METRICS ( 1 << 4 ) +#define PCF_BDF_ENCODINGS ( 1 << 5 ) +#define PCF_SWIDTHS ( 1 << 6 ) +#define PCF_GLYPH_NAMES ( 1 << 7 ) +#define PCF_BDF_ACCELERATORS ( 1 << 8 ) + +#define GLYPHPADOPTIONS 4 /* I'm not sure about this */ + + FT_LOCAL( FT_Error ) + pcf_load_font( FT_Stream, + PCF_Face ); + +FT_END_HEADER + +#endif /* __PCF_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/pcfdrivr.c b/src/3rdparty/freetype/src/pcf/pcfdrivr.c new file mode 100644 index 0000000000..e2d4d3d874 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcfdrivr.c @@ -0,0 +1,681 @@ +/* pcfdrivr.c + + FreeType font driver for pcf files + + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#include <ft2build.h> + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H +#include FT_GZIP_H +#include FT_LZW_H +#include FT_ERRORS_H +#include FT_BDF_H + +#include "pcf.h" +#include "pcfdrivr.h" +#include "pcfread.h" + +#include "pcferror.h" +#include "pcfutil.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pcfread + +#include FT_SERVICE_BDF_H +#include FT_SERVICE_XFREE86_NAME_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_pcfdriver + + + typedef struct PCF_CMapRec_ + { + FT_CMapRec root; + FT_UInt num_encodings; + PCF_Encoding encodings; + + } PCF_CMapRec, *PCF_CMap; + + + FT_CALLBACK_DEF( FT_Error ) + pcf_cmap_init( FT_CMap pcfcmap, /* PCF_CMap */ + FT_Pointer init_data ) + { + PCF_CMap cmap = (PCF_CMap)pcfcmap; + PCF_Face face = (PCF_Face)FT_CMAP_FACE( pcfcmap ); + + FT_UNUSED( init_data ); + + + cmap->num_encodings = (FT_UInt)face->nencodings; + cmap->encodings = face->encodings; + + return PCF_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + pcf_cmap_done( FT_CMap pcfcmap ) /* PCF_CMap */ + { + PCF_CMap cmap = (PCF_CMap)pcfcmap; + + + cmap->encodings = NULL; + cmap->num_encodings = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pcf_cmap_char_index( FT_CMap pcfcmap, /* PCF_CMap */ + FT_UInt32 charcode ) + { + PCF_CMap cmap = (PCF_CMap)pcfcmap; + PCF_Encoding encodings = cmap->encodings; + FT_UInt min, max, mid; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_UInt32 code; + + + mid = ( min + max ) >> 1; + code = encodings[mid].enc; + + if ( charcode == code ) + { + result = encodings[mid].glyph + 1; + break; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pcf_cmap_char_next( FT_CMap pcfcmap, /* PCF_CMap */ + FT_UInt32 *acharcode ) + { + PCF_CMap cmap = (PCF_CMap)pcfcmap; + PCF_Encoding encodings = cmap->encodings; + FT_UInt min, max, mid; + FT_UInt32 charcode = *acharcode + 1; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_UInt32 code; + + + mid = ( min + max ) >> 1; + code = encodings[mid].enc; + + if ( charcode == code ) + { + result = encodings[mid].glyph + 1; + goto Exit; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + } + + charcode = 0; + if ( min < cmap->num_encodings ) + { + charcode = encodings[min].enc; + result = encodings[min].glyph + 1; + } + + Exit: + *acharcode = charcode; + return result; + } + + + FT_CALLBACK_TABLE_DEF + const FT_CMap_ClassRec pcf_cmap_class = + { + sizeof ( PCF_CMapRec ), + pcf_cmap_init, + pcf_cmap_done, + pcf_cmap_char_index, + pcf_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + FT_CALLBACK_DEF( void ) + PCF_Face_Done( FT_Face pcfface ) /* PCF_Face */ + { + PCF_Face face = (PCF_Face)pcfface; + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + FT_FREE( face->encodings ); + FT_FREE( face->metrics ); + + /* free properties */ + { + PCF_Property prop; + FT_Int i; + + + if ( face->properties ) + { + for ( i = 0; i < face->nprops; i++ ) + { + prop = &face->properties[i]; + + if ( prop ) { + FT_FREE( prop->name ); + if ( prop->isString ) + FT_FREE( prop->value.atom ); + } + } + } + FT_FREE( face->properties ); + } + + FT_FREE( face->toc.tables ); + FT_FREE( pcfface->family_name ); + FT_FREE( pcfface->style_name ); + FT_FREE( pcfface->available_sizes ); + FT_FREE( face->charset_encoding ); + FT_FREE( face->charset_registry ); + + FT_TRACE4(( "PCF_Face_Done: done face\n" )); + + /* close gzip/LZW stream if any */ + if ( pcfface->stream == &face->gzip_stream ) + { + FT_Stream_Close( &face->gzip_stream ); + pcfface->stream = face->gzip_source; + } + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Face_Init( FT_Stream stream, + FT_Face pcfface, /* PCF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + PCF_Face face = (PCF_Face)pcfface; + FT_Error error = PCF_Err_Ok; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( face_index ); + + + error = pcf_load_font( stream, face ); + if ( error ) + { + FT_Error error2; + + + PCF_Face_Done( pcfface ); + + /* this didn't work, try gzip support! */ + error2 = FT_Stream_OpenGzip( &face->gzip_stream, stream ); + if ( FT_ERROR_BASE( error2 ) == FT_Err_Unimplemented_Feature ) + goto Fail; + + error = error2; + if ( error ) +#ifdef FT_CONFIG_OPTION_USE_LZW + { + FT_Error error3; + + + /* this didn't work, try LZW support! */ + error3 = FT_Stream_OpenLZW( &face->gzip_stream, stream ); + if ( FT_ERROR_BASE( error3 ) == FT_Err_Unimplemented_Feature ) + goto Fail; + + error = error3; + if ( error ) + goto Fail; + + face->gzip_source = stream; + pcfface->stream = &face->gzip_stream; + + stream = pcfface->stream; + + error = pcf_load_font( stream, face ); + if ( error ) + goto Fail; + } +#else + goto Fail; +#endif + else + { + face->gzip_source = stream; + pcfface->stream = &face->gzip_stream; + + stream = pcfface->stream; + + error = pcf_load_font( stream, face ); + if ( error ) + goto Fail; + } + } + + /* set up charmap */ + { + FT_String *charset_registry = face->charset_registry; + FT_String *charset_encoding = face->charset_encoding; + FT_Bool unicode_charmap = 0; + + + if ( charset_registry && charset_encoding ) + { + char* s = charset_registry; + + + /* Uh, oh, compare first letters manually to avoid dependency + on locales. */ + if ( ( s[0] == 'i' || s[0] == 'I' ) && + ( s[1] == 's' || s[1] == 'S' ) && + ( s[2] == 'o' || s[2] == 'O' ) ) + { + s += 3; + if ( !ft_strcmp( s, "10646" ) || + ( !ft_strcmp( s, "8859" ) && + !ft_strcmp( face->charset_encoding, "1" ) ) ) + unicode_charmap = 1; + } + } + + { + FT_CharMapRec charmap; + + + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; + charmap.platform_id = 0; + charmap.encoding_id = 0; + + if ( unicode_charmap ) + { + charmap.encoding = FT_ENCODING_UNICODE; + charmap.platform_id = 3; + charmap.encoding_id = 1; + } + + error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if ( pcfface->num_charmaps ) + pcfface->charmap = pcfface->charmaps[0]; +#endif + } + } + + Exit: + return error; + + Fail: + FT_TRACE2(( "[not a valid PCF file]\n" )); + PCF_Face_Done( pcfface ); + error = PCF_Err_Unknown_File_Format; /* error */ + goto Exit; + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Size_Select( FT_Size size, + FT_ULong strike_index ) + { + PCF_Accel accel = &( (PCF_Face)size->face )->accel; + + + FT_Select_Metrics( size->face, strike_index ); + + size->metrics.ascender = accel->fontAscent << 6; + size->metrics.descender = -accel->fontDescent << 6; + size->metrics.max_advance = accel->maxbounds.characterWidth << 6; + + return PCF_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Size_Request( FT_Size size, + FT_Size_Request req ) + { + PCF_Face face = (PCF_Face)size->face; + FT_Bitmap_Size* bsize = size->face->available_sizes; + FT_Error error = PCF_Err_Invalid_Pixel_Size; + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = PCF_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == ( face->accel.fontAscent + + face->accel.fontDescent ) ) + error = PCF_Err_Ok; + break; + + default: + error = PCF_Err_Unimplemented_Feature; + break; + } + + if ( error ) + return error; + else + return PCF_Size_Select( size, 0 ); + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Glyph_Load( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + PCF_Face face = (PCF_Face)FT_SIZE_FACE( size ); + FT_Stream stream; + FT_Error error = PCF_Err_Ok; + FT_Bitmap* bitmap = &slot->bitmap; + PCF_Metric metric; + int bytes; + + FT_UNUSED( load_flags ); + + + FT_TRACE4(( "load_glyph %d ---", glyph_index )); + + if ( !face || glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = PCF_Err_Invalid_Argument; + goto Exit; + } + + stream = face->root.stream; + + if ( glyph_index > 0 ) + glyph_index--; + + metric = face->metrics + glyph_index; + + bitmap->rows = metric->ascent + metric->descent; + bitmap->width = metric->rightSideBearing - metric->leftSideBearing; + bitmap->num_grays = 1; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + + FT_TRACE6(( "BIT_ORDER %d ; BYTE_ORDER %d ; GLYPH_PAD %d\n", + PCF_BIT_ORDER( face->bitmapsFormat ), + PCF_BYTE_ORDER( face->bitmapsFormat ), + PCF_GLYPH_PAD( face->bitmapsFormat ) )); + + switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) ) + { + case 1: + bitmap->pitch = ( bitmap->width + 7 ) >> 3; + break; + + case 2: + bitmap->pitch = ( ( bitmap->width + 15 ) >> 4 ) << 1; + break; + + case 4: + bitmap->pitch = ( ( bitmap->width + 31 ) >> 5 ) << 2; + break; + + case 8: + bitmap->pitch = ( ( bitmap->width + 63 ) >> 6 ) << 3; + break; + + default: + return PCF_Err_Invalid_File_Format; + } + + /* XXX: to do: are there cases that need repadding the bitmap? */ + bytes = bitmap->pitch * bitmap->rows; + + error = ft_glyphslot_alloc_bitmap( slot, bytes ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( metric->bits ) || + FT_STREAM_READ( bitmap->buffer, bytes ) ) + goto Exit; + + if ( PCF_BIT_ORDER( face->bitmapsFormat ) != MSBFirst ) + BitOrderInvert( bitmap->buffer, bytes ); + + if ( ( PCF_BYTE_ORDER( face->bitmapsFormat ) != + PCF_BIT_ORDER( face->bitmapsFormat ) ) ) + { + switch ( PCF_SCAN_UNIT( face->bitmapsFormat ) ) + { + case 1: + break; + + case 2: + TwoByteSwap( bitmap->buffer, bytes ); + break; + + case 4: + FourByteSwap( bitmap->buffer, bytes ); + break; + } + } + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = metric->leftSideBearing; + slot->bitmap_top = metric->ascent; + + slot->metrics.horiAdvance = metric->characterWidth << 6; + slot->metrics.horiBearingX = metric->leftSideBearing << 6; + slot->metrics.horiBearingY = metric->ascent << 6; + slot->metrics.width = ( metric->rightSideBearing - + metric->leftSideBearing ) << 6; + slot->metrics.height = bitmap->rows << 6; + + ft_synthesize_vertical_metrics( &slot->metrics, + ( face->accel.fontAscent + + face->accel.fontDescent ) << 6 ); + + FT_TRACE4(( " --- ok\n" )); + + Exit: + return error; + } + + + /* + * + * BDF SERVICE + * + */ + + static FT_Error + pcf_get_bdf_property( PCF_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + PCF_Property prop; + + + prop = pcf_find_property( face, prop_name ); + if ( prop != NULL ) + { + if ( prop->isString ) + { + aproperty->type = BDF_PROPERTY_TYPE_ATOM; + aproperty->u.atom = prop->value.atom; + } + else + { + /* Apparently, the PCF driver loads all properties as signed integers! + * This really doesn't seem to be a problem, because this is + * sufficient for any meaningful values. + */ + aproperty->type = BDF_PROPERTY_TYPE_INTEGER; + aproperty->u.integer = prop->value.integer; + } + return 0; + } + + return PCF_Err_Invalid_Argument; + } + + + static FT_Error + pcf_get_charset_id( PCF_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + *acharset_encoding = face->charset_encoding; + *acharset_registry = face->charset_registry; + + return 0; + } + + + static const FT_Service_BDFRec pcf_service_bdf = + { + (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id, + (FT_BDF_GetPropertyFunc) pcf_get_bdf_property + }; + + + /* + * + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec pcf_services[] = + { + { FT_SERVICE_ID_BDF, &pcf_service_bdf }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PCF }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + pcf_driver_requester( FT_Module module, + const char* name ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pcf_services, name ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec pcf_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + sizeof ( FT_DriverRec ), + + "pcf", + 0x10000L, + 0x20000L, + + 0, + + 0, + 0, + pcf_driver_requester + }, + + sizeof ( PCF_FaceRec ), + sizeof ( FT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + PCF_Face_Init, + PCF_Face_Done, + 0, /* FT_Size_InitFunc */ + 0, /* FT_Size_DoneFunc */ + 0, /* FT_Slot_InitFunc */ + 0, /* FT_Slot_DoneFunc */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + PCF_Glyph_Load, + + 0, /* FT_Face_GetKerningFunc */ + 0, /* FT_Face_AttachFunc */ + 0, /* FT_Face_GetAdvancesFunc */ + + PCF_Size_Request, + PCF_Size_Select + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/pcfdrivr.h b/src/3rdparty/freetype/src/pcf/pcfdrivr.h new file mode 100644 index 0000000000..7ddf697e16 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcfdrivr.h @@ -0,0 +1,44 @@ +/* pcfdrivr.h + + FreeType font driver for pcf fonts + + Copyright 2000-2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFDRIVR_H__ +#define __PCFDRIVR_H__ + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + +FT_BEGIN_HEADER + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) pcf_driver_class; + +FT_END_HEADER + + +#endif /* __PCFDRIVR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/pcferror.h b/src/3rdparty/freetype/src/pcf/pcferror.h new file mode 100644 index 0000000000..d75c067aa6 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcferror.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* pcferror.h */ +/* */ +/* PCF error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PCF error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PCFERROR_H__ +#define __PCFERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PCF_Err_ +#define FT_ERR_BASE FT_Mod_Err_PCF + +#include FT_ERRORS_H + +#endif /* __PCFERROR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/pcfread.c b/src/3rdparty/freetype/src/pcf/pcfread.c new file mode 100644 index 0000000000..8e04c57b31 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcfread.c @@ -0,0 +1,1271 @@ +/* pcfread.c + + FreeType font driver for pcf fonts + + Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#include <ft2build.h> + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H + +#include "pcf.h" +#include "pcfdrivr.h" +#include "pcfread.h" + +#include "pcferror.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_pcfread + + +#ifdef FT_DEBUG_LEVEL_TRACE + static const char* const tableNames[] = + { + "prop", "accl", "mtrcs", "bmps", "imtrcs", + "enc", "swidth", "names", "accel" + }; +#endif + + + static + const FT_Frame_Field pcf_toc_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_TocRec + + FT_FRAME_START( 8 ), + FT_FRAME_ULONG_LE( version ), + FT_FRAME_ULONG_LE( count ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_table_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_TableRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE( type ), + FT_FRAME_ULONG_LE( format ), + FT_FRAME_ULONG_LE( size ), + FT_FRAME_ULONG_LE( offset ), + FT_FRAME_END + }; + + + static FT_Error + pcf_read_TOC( FT_Stream stream, + PCF_Face face ) + { + FT_Error error; + PCF_Toc toc = &face->toc; + PCF_Table tables; + + FT_Memory memory = FT_FACE(face)->memory; + FT_UInt n; + + + if ( FT_STREAM_SEEK ( 0 ) || + FT_STREAM_READ_FIELDS ( pcf_toc_header, toc ) ) + return PCF_Err_Cannot_Open_Resource; + + if ( toc->version != PCF_FILE_VERSION || + toc->count > FT_ARRAY_MAX( face->toc.tables ) || + toc->count == 0 ) + return PCF_Err_Invalid_File_Format; + + if ( FT_NEW_ARRAY( face->toc.tables, toc->count ) ) + return PCF_Err_Out_Of_Memory; + + tables = face->toc.tables; + for ( n = 0; n < toc->count; n++ ) + { + if ( FT_STREAM_READ_FIELDS( pcf_table_header, tables ) ) + goto Exit; + tables++; + } + + /* Sort tables and check for overlaps. Because they are almost */ + /* always ordered already, an in-place bubble sort with simultaneous */ + /* boundary checking seems appropriate. */ + tables = face->toc.tables; + + for ( n = 0; n < toc->count - 1; n++ ) + { + FT_UInt i, have_change; + + + have_change = 0; + + for ( i = 0; i < toc->count - 1 - n; i++ ) + { + PCF_TableRec tmp; + + + if ( tables[i].offset > tables[i + 1].offset ) + { + tmp = tables[i]; + tables[i] = tables[i + 1]; + tables[i + 1] = tmp; + + have_change = 1; + } + + if ( ( tables[i].size > tables[i + 1].offset ) || + ( tables[i].offset > tables[i + 1].offset - tables[i].size ) ) + return PCF_Err_Invalid_Offset; + } + + if ( !have_change ) + break; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + + { + FT_UInt i, j; + const char* name = "?"; + + + FT_TRACE4(( "pcf_read_TOC:\n" )); + + FT_TRACE4(( " number of tables: %ld\n", face->toc.count )); + + tables = face->toc.tables; + for ( i = 0; i < toc->count; i++ ) + { + for ( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] ); + j++ ) + if ( tables[i].type == (FT_UInt)( 1 << j ) ) + name = tableNames[j]; + + FT_TRACE4(( " %d: type=%s, format=0x%X, " + "size=%ld (0x%lX), offset=%ld (0x%lX)\n", + i, name, + tables[i].format, + tables[i].size, tables[i].size, + tables[i].offset, tables[i].offset )); + } + } + +#endif + + return PCF_Err_Ok; + + Exit: + FT_FREE( face->toc.tables ); + return error; + } + + +#define PCF_METRIC_SIZE 12 + + static + const FT_Frame_Field pcf_metric_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_MetricRec + + FT_FRAME_START( PCF_METRIC_SIZE ), + FT_FRAME_SHORT_LE( leftSideBearing ), + FT_FRAME_SHORT_LE( rightSideBearing ), + FT_FRAME_SHORT_LE( characterWidth ), + FT_FRAME_SHORT_LE( ascent ), + FT_FRAME_SHORT_LE( descent ), + FT_FRAME_SHORT_LE( attributes ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_metric_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_MetricRec + + FT_FRAME_START( PCF_METRIC_SIZE ), + FT_FRAME_SHORT( leftSideBearing ), + FT_FRAME_SHORT( rightSideBearing ), + FT_FRAME_SHORT( characterWidth ), + FT_FRAME_SHORT( ascent ), + FT_FRAME_SHORT( descent ), + FT_FRAME_SHORT( attributes ), + FT_FRAME_END + }; + + +#define PCF_COMPRESSED_METRIC_SIZE 5 + + static + const FT_Frame_Field pcf_compressed_metric_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_Compressed_MetricRec + + FT_FRAME_START( PCF_COMPRESSED_METRIC_SIZE ), + FT_FRAME_BYTE( leftSideBearing ), + FT_FRAME_BYTE( rightSideBearing ), + FT_FRAME_BYTE( characterWidth ), + FT_FRAME_BYTE( ascent ), + FT_FRAME_BYTE( descent ), + FT_FRAME_END + }; + + + static FT_Error + pcf_get_metric( FT_Stream stream, + FT_ULong format, + PCF_Metric metric ) + { + FT_Error error = PCF_Err_Ok; + + + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + const FT_Frame_Field* fields; + + + /* parsing normal metrics */ + fields = PCF_BYTE_ORDER( format ) == MSBFirst + ? pcf_metric_msb_header + : pcf_metric_header; + + /* the following sets `error' but doesn't return in case of failure */ + (void)FT_STREAM_READ_FIELDS( fields, metric ); + } + else + { + PCF_Compressed_MetricRec compr; + + + /* parsing compressed metrics */ + if ( FT_STREAM_READ_FIELDS( pcf_compressed_metric_header, &compr ) ) + goto Exit; + + metric->leftSideBearing = (FT_Short)( compr.leftSideBearing - 0x80 ); + metric->rightSideBearing = (FT_Short)( compr.rightSideBearing - 0x80 ); + metric->characterWidth = (FT_Short)( compr.characterWidth - 0x80 ); + metric->ascent = (FT_Short)( compr.ascent - 0x80 ); + metric->descent = (FT_Short)( compr.descent - 0x80 ); + metric->attributes = 0; + } + + Exit: + return error; + } + + + static FT_Error + pcf_seek_to_table_type( FT_Stream stream, + PCF_Table tables, + FT_Int ntables, + FT_ULong type, + FT_ULong *aformat, + FT_ULong *asize ) + { + FT_Error error = PCF_Err_Invalid_File_Format; + FT_Int i; + + + for ( i = 0; i < ntables; i++ ) + if ( tables[i].type == type ) + { + if ( stream->pos > tables[i].offset ) + { + error = PCF_Err_Invalid_Stream_Skip; + goto Fail; + } + + if ( FT_STREAM_SKIP( tables[i].offset - stream->pos ) ) + { + error = PCF_Err_Invalid_Stream_Skip; + goto Fail; + } + + *asize = tables[i].size; + *aformat = tables[i].format; + + return PCF_Err_Ok; + } + + Fail: + *asize = 0; + return error; + } + + + static FT_Bool + pcf_has_table_type( PCF_Table tables, + FT_Int ntables, + FT_ULong type ) + { + FT_Int i; + + + for ( i = 0; i < ntables; i++ ) + if ( tables[i].type == type ) + return TRUE; + + return FALSE; + } + + +#define PCF_PROPERTY_SIZE 9 + + static + const FT_Frame_Field pcf_property_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_ParsePropertyRec + + FT_FRAME_START( PCF_PROPERTY_SIZE ), + FT_FRAME_LONG_LE( name ), + FT_FRAME_BYTE ( isString ), + FT_FRAME_LONG_LE( value ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_property_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_ParsePropertyRec + + FT_FRAME_START( PCF_PROPERTY_SIZE ), + FT_FRAME_LONG( name ), + FT_FRAME_BYTE( isString ), + FT_FRAME_LONG( value ), + FT_FRAME_END + }; + + + FT_LOCAL_DEF( PCF_Property ) + pcf_find_property( PCF_Face face, + const FT_String* prop ) + { + PCF_Property properties = face->properties; + FT_Bool found = 0; + int i; + + + for ( i = 0 ; i < face->nprops && !found; i++ ) + { + if ( !ft_strcmp( properties[i].name, prop ) ) + found = 1; + } + + if ( found ) + return properties + i - 1; + else + return NULL; + } + + + static FT_Error + pcf_get_properties( FT_Stream stream, + PCF_Face face ) + { + PCF_ParseProperty props = 0; + PCF_Property properties; + FT_UInt nprops, i; + FT_ULong format, size; + FT_Error error; + FT_Memory memory = FT_FACE(face)->memory; + FT_ULong string_size; + FT_String* strings = 0; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_PROPERTIES, + &format, + &size ); + if ( error ) + goto Bail; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + FT_TRACE4(( "pcf_get_properties:\n" )); + + FT_TRACE4(( " format = %ld\n", format )); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + goto Bail; + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( nprops ); + else + (void)FT_READ_ULONG_LE( nprops ); + if ( error ) + goto Bail; + + FT_TRACE4(( " nprop = %d\n", nprops )); + + /* rough estimate */ + if ( nprops > size / PCF_PROPERTY_SIZE ) + { + error = PCF_Err_Invalid_Table; + goto Bail; + } + + face->nprops = nprops; + + if ( FT_NEW_ARRAY( props, nprops ) ) + goto Bail; + + for ( i = 0; i < nprops; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + if ( FT_STREAM_READ_FIELDS( pcf_property_msb_header, props + i ) ) + goto Bail; + } + else + { + if ( FT_STREAM_READ_FIELDS( pcf_property_header, props + i ) ) + goto Bail; + } + } + + /* pad the property array */ + /* */ + /* clever here - nprops is the same as the number of odd-units read, */ + /* as only isStringProp are odd length (Keith Packard) */ + /* */ + if ( nprops & 3 ) + { + i = 4 - ( nprops & 3 ); + if ( FT_STREAM_SKIP( i ) ) + { + error = PCF_Err_Invalid_Stream_Skip; + goto Bail; + } + } + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( string_size ); + else + (void)FT_READ_ULONG_LE( string_size ); + if ( error ) + goto Bail; + + FT_TRACE4(( " string_size = %ld\n", string_size )); + + /* rough estimate */ + if ( string_size > size - nprops * PCF_PROPERTY_SIZE ) + { + error = PCF_Err_Invalid_Table; + goto Bail; + } + + if ( FT_NEW_ARRAY( strings, string_size ) ) + goto Bail; + + error = FT_Stream_Read( stream, (FT_Byte*)strings, string_size ); + if ( error ) + goto Bail; + + if ( FT_NEW_ARRAY( properties, nprops ) ) + goto Bail; + + face->properties = properties; + + for ( i = 0; i < nprops; i++ ) + { + FT_Long name_offset = props[i].name; + + + if ( ( name_offset < 0 ) || + ( (FT_ULong)name_offset > string_size ) ) + { + error = PCF_Err_Invalid_Offset; + goto Bail; + } + + if ( FT_STRDUP( properties[i].name, strings + name_offset ) ) + goto Bail; + + FT_TRACE4(( " %s:", properties[i].name )); + + properties[i].isString = props[i].isString; + + if ( props[i].isString ) + { + FT_Long value_offset = props[i].value; + + + if ( ( value_offset < 0 ) || + ( (FT_ULong)value_offset > string_size ) ) + { + error = PCF_Err_Invalid_Offset; + goto Bail; + } + + if ( FT_STRDUP( properties[i].value.atom, strings + value_offset ) ) + goto Bail; + + FT_TRACE4(( " `%s'\n", properties[i].value.atom )); + } + else + { + properties[i].value.integer = props[i].value; + + FT_TRACE4(( " %d\n", properties[i].value.integer )); + } + } + + error = PCF_Err_Ok; + + Bail: + FT_FREE( props ); + FT_FREE( strings ); + + return error; + } + + + static FT_Error + pcf_get_metrics( FT_Stream stream, + PCF_Face face ) + { + FT_Error error = PCF_Err_Ok; + FT_Memory memory = FT_FACE(face)->memory; + FT_ULong format, size; + PCF_Metric metrics = 0; + FT_ULong nmetrics, i; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_METRICS, + &format, + &size ); + if ( error ) + return error; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && + !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ) + return PCF_Err_Invalid_File_Format; + + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( nmetrics ); + else + (void)FT_READ_ULONG_LE( nmetrics ); + } + else + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_USHORT( nmetrics ); + else + (void)FT_READ_USHORT_LE( nmetrics ); + } + if ( error ) + return PCF_Err_Invalid_File_Format; + + face->nmetrics = nmetrics; + + FT_TRACE4(( "pcf_get_metrics:\n" )); + + FT_TRACE4(( " number of metrics: %d\n", nmetrics )); + + /* rough estimate */ + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + if ( nmetrics > size / PCF_METRIC_SIZE ) + return PCF_Err_Invalid_Table; + } + else + { + if ( nmetrics > size / PCF_COMPRESSED_METRIC_SIZE ) + return PCF_Err_Invalid_Table; + } + + if ( FT_NEW_ARRAY( face->metrics, nmetrics ) ) + return PCF_Err_Out_Of_Memory; + + metrics = face->metrics; + for ( i = 0; i < nmetrics; i++ ) + { + error = pcf_get_metric( stream, format, metrics + i ); + + metrics[i].bits = 0; + + FT_TRACE5(( " idx %d: width=%d, " + "lsb=%d, rsb=%d, ascent=%d, descent=%d, swidth=%d\n", + i, + ( metrics + i )->characterWidth, + ( metrics + i )->leftSideBearing, + ( metrics + i )->rightSideBearing, + ( metrics + i )->ascent, + ( metrics + i )->descent, + ( metrics + i )->attributes )); + + if ( error ) + break; + } + + if ( error ) + FT_FREE( face->metrics ); + + Bail: + return error; + } + + + static FT_Error + pcf_get_bitmaps( FT_Stream stream, + PCF_Face face ) + { + FT_Error error = PCF_Err_Ok; + FT_Memory memory = FT_FACE(face)->memory; + FT_Long* offsets; + FT_Long bitmapSizes[GLYPHPADOPTIONS]; + FT_ULong format, size; + int nbitmaps, i, sizebitmaps = 0; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_BITMAPS, + &format, + &size ); + if ( error ) + return error; + + error = FT_Stream_EnterFrame( stream, 8 ); + if ( error ) + return error; + + format = FT_GET_ULONG_LE(); + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + nbitmaps = FT_GET_ULONG(); + else + nbitmaps = FT_GET_ULONG_LE(); + + FT_Stream_ExitFrame( stream ); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + return PCF_Err_Invalid_File_Format; + + FT_TRACE4(( "pcf_get_bitmaps:\n" )); + + FT_TRACE4(( " number of bitmaps: %d\n", nbitmaps )); + + if ( nbitmaps != face->nmetrics ) + return PCF_Err_Invalid_File_Format; + + if ( FT_NEW_ARRAY( offsets, nbitmaps ) ) + return error; + + for ( i = 0; i < nbitmaps; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_LONG( offsets[i] ); + else + (void)FT_READ_LONG_LE( offsets[i] ); + + FT_TRACE5(( " bitmap %d: offset %ld (0x%lX)\n", + i, offsets[i], offsets[i] )); + } + if ( error ) + goto Bail; + + for ( i = 0; i < GLYPHPADOPTIONS; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_LONG( bitmapSizes[i] ); + else + (void)FT_READ_LONG_LE( bitmapSizes[i] ); + if ( error ) + goto Bail; + + sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX( format )]; + + FT_TRACE4(( " padding %d implies a size of %ld\n", i, bitmapSizes[i] )); + } + + FT_TRACE4(( " %d bitmaps, padding index %ld\n", + nbitmaps, + PCF_GLYPH_PAD_INDEX( format ) )); + FT_TRACE4(( " bitmap size = %d\n", sizebitmaps )); + + FT_UNUSED( sizebitmaps ); /* only used for debugging */ + + for ( i = 0; i < nbitmaps; i++ ) + { + /* rough estimate */ + if ( ( offsets[i] < 0 ) || + ( (FT_ULong)offsets[i] > size ) ) + { + FT_ERROR(( "pcf_get_bitmaps:")); + FT_ERROR(( " invalid offset to bitmap data of glyph %d\n", i )); + } + else + face->metrics[i].bits = stream->pos + offsets[i]; + } + + face->bitmapsFormat = format; + + Bail: + FT_FREE( offsets ); + return error; + } + + + static FT_Error + pcf_get_encodings( FT_Stream stream, + PCF_Face face ) + { + FT_Error error = PCF_Err_Ok; + FT_Memory memory = FT_FACE(face)->memory; + FT_ULong format, size; + int firstCol, lastCol; + int firstRow, lastRow; + int nencoding, encodingOffset; + int i, j; + PCF_Encoding tmpEncoding, encoding = 0; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_BDF_ENCODINGS, + &format, + &size ); + if ( error ) + return error; + + error = FT_Stream_EnterFrame( stream, 14 ); + if ( error ) + return error; + + format = FT_GET_ULONG_LE(); + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + firstCol = FT_GET_SHORT(); + lastCol = FT_GET_SHORT(); + firstRow = FT_GET_SHORT(); + lastRow = FT_GET_SHORT(); + face->defaultChar = FT_GET_SHORT(); + } + else + { + firstCol = FT_GET_SHORT_LE(); + lastCol = FT_GET_SHORT_LE(); + firstRow = FT_GET_SHORT_LE(); + lastRow = FT_GET_SHORT_LE(); + face->defaultChar = FT_GET_SHORT_LE(); + } + + FT_Stream_ExitFrame( stream ); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + return PCF_Err_Invalid_File_Format; + + FT_TRACE4(( "pdf_get_encodings:\n" )); + + FT_TRACE4(( " firstCol %d, lastCol %d, firstRow %d, lastRow %d\n", + firstCol, lastCol, firstRow, lastRow )); + + nencoding = ( lastCol - firstCol + 1 ) * ( lastRow - firstRow + 1 ); + + if ( FT_NEW_ARRAY( tmpEncoding, nencoding ) ) + return PCF_Err_Out_Of_Memory; + + error = FT_Stream_EnterFrame( stream, 2 * nencoding ); + if ( error ) + goto Bail; + + for ( i = 0, j = 0 ; i < nencoding; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + encodingOffset = FT_GET_SHORT(); + else + encodingOffset = FT_GET_SHORT_LE(); + + if ( encodingOffset != -1 ) + { + tmpEncoding[j].enc = ( ( ( i / ( lastCol - firstCol + 1 ) ) + + firstRow ) * 256 ) + + ( ( i % ( lastCol - firstCol + 1 ) ) + + firstCol ); + + tmpEncoding[j].glyph = (FT_Short)encodingOffset; + + FT_TRACE5(( " code %d (0x%04X): idx %d\n", + tmpEncoding[j].enc, tmpEncoding[j].enc, + tmpEncoding[j].glyph )); + + j++; + } + } + FT_Stream_ExitFrame( stream ); + + if ( FT_NEW_ARRAY( encoding, j ) ) + goto Bail; + + for ( i = 0; i < j; i++ ) + { + encoding[i].enc = tmpEncoding[i].enc; + encoding[i].glyph = tmpEncoding[i].glyph; + } + + face->nencodings = j; + face->encodings = encoding; + FT_FREE( tmpEncoding ); + + return error; + + Bail: + FT_FREE( encoding ); + FT_FREE( tmpEncoding ); + return error; + } + + + static + const FT_Frame_Field pcf_accel_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_AccelRec + + FT_FRAME_START( 20 ), + FT_FRAME_BYTE ( noOverlap ), + FT_FRAME_BYTE ( constantMetrics ), + FT_FRAME_BYTE ( terminalFont ), + FT_FRAME_BYTE ( constantWidth ), + FT_FRAME_BYTE ( inkInside ), + FT_FRAME_BYTE ( inkMetrics ), + FT_FRAME_BYTE ( drawDirection ), + FT_FRAME_SKIP_BYTES( 1 ), + FT_FRAME_LONG_LE ( fontAscent ), + FT_FRAME_LONG_LE ( fontDescent ), + FT_FRAME_LONG_LE ( maxOverlap ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_accel_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_AccelRec + + FT_FRAME_START( 20 ), + FT_FRAME_BYTE ( noOverlap ), + FT_FRAME_BYTE ( constantMetrics ), + FT_FRAME_BYTE ( terminalFont ), + FT_FRAME_BYTE ( constantWidth ), + FT_FRAME_BYTE ( inkInside ), + FT_FRAME_BYTE ( inkMetrics ), + FT_FRAME_BYTE ( drawDirection ), + FT_FRAME_SKIP_BYTES( 1 ), + FT_FRAME_LONG ( fontAscent ), + FT_FRAME_LONG ( fontDescent ), + FT_FRAME_LONG ( maxOverlap ), + FT_FRAME_END + }; + + + static FT_Error + pcf_get_accel( FT_Stream stream, + PCF_Face face, + FT_ULong type ) + { + FT_ULong format, size; + FT_Error error = PCF_Err_Ok; + PCF_Accel accel = &face->accel; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + type, + &format, + &size ); + if ( error ) + goto Bail; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && + !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) + goto Bail; + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + if ( FT_STREAM_READ_FIELDS( pcf_accel_msb_header, accel ) ) + goto Bail; + } + else + { + if ( FT_STREAM_READ_FIELDS( pcf_accel_header, accel ) ) + goto Bail; + } + + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->minbounds) ); + if ( error ) + goto Bail; + + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->maxbounds) ); + if ( error ) + goto Bail; + + if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) + { + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->ink_minbounds) ); + if ( error ) + goto Bail; + + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->ink_maxbounds) ); + if ( error ) + goto Bail; + } + else + { + accel->ink_minbounds = accel->minbounds; /* I'm not sure about this */ + accel->ink_maxbounds = accel->maxbounds; + } + + Bail: + return error; + } + + + static FT_Error + pcf_interpret_style( PCF_Face pcf ) + { + FT_Error error = PCF_Err_Ok; + FT_Face face = FT_FACE( pcf ); + FT_Memory memory = face->memory; + + PCF_Property prop; + + int nn, len; + char* strings[4] = { NULL, NULL, NULL, NULL }; + int lengths[4]; + + + face->style_flags = 0; + + prop = pcf_find_property( pcf, "SLANT" ); + if ( prop && prop->isString && + ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || + *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) + { + face->style_flags |= FT_STYLE_FLAG_ITALIC; + strings[2] = ( *(prop->value.atom) == 'O' || + *(prop->value.atom) == 'o' ) ? (char *)"Oblique" + : (char *)"Italic"; + } + + prop = pcf_find_property( pcf, "WEIGHT_NAME" ); + if ( prop && prop->isString && + ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) + { + face->style_flags |= FT_STYLE_FLAG_BOLD; + strings[1] = (char *)"Bold"; + } + + prop = pcf_find_property( pcf, "SETWIDTH_NAME" ); + if ( prop && prop->isString && + *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[3] = (char *)(prop->value.atom); + + prop = pcf_find_property( pcf, "ADD_STYLE_NAME" ); + if ( prop && prop->isString && + *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[0] = (char *)(prop->value.atom); + + for ( len = 0, nn = 0; nn < 4; nn++ ) + { + lengths[nn] = 0; + if ( strings[nn] ) + { + lengths[nn] = ft_strlen( strings[nn] ); + len += lengths[nn] + 1; + } + } + + if ( len == 0 ) + { + strings[0] = (char *)"Regular"; + lengths[0] = ft_strlen( strings[0] ); + len = lengths[0] + 1; + } + + { + char* s; + + + if ( FT_ALLOC( face->style_name, len ) ) + return error; + + s = face->style_name; + + for ( nn = 0; nn < 4; nn++ ) + { + char* src = strings[nn]; + + + len = lengths[nn]; + + if ( src == NULL ) + continue; + + /* separate elements with a space */ + if ( s != face->style_name ) + *s++ = ' '; + + ft_memcpy( s, src, len ); + + /* need to convert spaces to dashes for */ + /* add_style_name and setwidth_name */ + if ( nn == 0 || nn == 3 ) + { + int mm; + + + for ( mm = 0; mm < len; mm++ ) + if (s[mm] == ' ') + s[mm] = '-'; + } + + s += len; + } + *s = 0; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + pcf_load_font( FT_Stream stream, + PCF_Face face ) + { + FT_Error error = PCF_Err_Ok; + FT_Memory memory = FT_FACE(face)->memory; + FT_Bool hasBDFAccelerators; + + + error = pcf_read_TOC( stream, face ); + if ( error ) + goto Exit; + + error = pcf_get_properties( stream, face ); + if ( error ) + goto Exit; + + /* Use the old accelerators if no BDF accelerators are in the file. */ + hasBDFAccelerators = pcf_has_table_type( face->toc.tables, + face->toc.count, + PCF_BDF_ACCELERATORS ); + if ( !hasBDFAccelerators ) + { + error = pcf_get_accel( stream, face, PCF_ACCELERATORS ); + if ( error ) + goto Exit; + } + + /* metrics */ + error = pcf_get_metrics( stream, face ); + if ( error ) + goto Exit; + + /* bitmaps */ + error = pcf_get_bitmaps( stream, face ); + if ( error ) + goto Exit; + + /* encodings */ + error = pcf_get_encodings( stream, face ); + if ( error ) + goto Exit; + + /* BDF style accelerators (i.e. bounds based on encoded glyphs) */ + if ( hasBDFAccelerators ) + { + error = pcf_get_accel( stream, face, PCF_BDF_ACCELERATORS ); + if ( error ) + goto Exit; + } + + /* XXX: TO DO: inkmetrics and glyph_names are missing */ + + /* now construct the face object */ + { + FT_Face root = FT_FACE( face ); + PCF_Property prop; + + + root->num_faces = 1; + root->face_index = 0; + root->face_flags = FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_FAST_GLYPHS; + + if ( face->accel.constantWidth ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( ( error = pcf_interpret_style( face ) ) != 0 ) + goto Exit; + + prop = pcf_find_property( face, "FAMILY_NAME" ); + if ( prop && prop->isString ) + { + if ( FT_STRDUP( root->family_name, prop->value.atom ) ) + goto Exit; + } + else + root->family_name = NULL; + + /* + * Note: We shift all glyph indices by +1 since we must + * respect the convention that glyph 0 always corresponds + * to the `missing glyph'. + * + * This implies bumping the number of `available' glyphs by 1. + */ + root->num_glyphs = face->nmetrics + 1; + + root->num_fixed_sizes = 1; + if ( FT_NEW_ARRAY( root->available_sizes, 1 ) ) + goto Exit; + + { + FT_Bitmap_Size* bsize = root->available_sizes; + FT_Short resolution_x = 0, resolution_y = 0; + + + FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); + +#if 0 + bsize->height = face->accel.maxbounds.ascent << 6; +#endif + bsize->height = (FT_Short)( face->accel.fontAscent + + face->accel.fontDescent ); + + prop = pcf_find_property( face, "AVERAGE_WIDTH" ); + if ( prop ) + bsize->width = (FT_Short)( ( prop->value.integer + 5 ) / 10 ); + else + bsize->width = (FT_Short)( bsize->height * 2/3 ); + + prop = pcf_find_property( face, "POINT_SIZE" ); + if ( prop ) + /* convert from 722.7 decipoints to 72 points per inch */ + bsize->size = + (FT_Pos)( ( prop->value.integer * 64 * 7200 + 36135L ) / 72270L ); + + prop = pcf_find_property( face, "PIXEL_SIZE" ); + if ( prop ) + bsize->y_ppem = (FT_Short)prop->value.integer << 6; + + prop = pcf_find_property( face, "RESOLUTION_X" ); + if ( prop ) + resolution_x = (FT_Short)prop->value.integer; + + prop = pcf_find_property( face, "RESOLUTION_Y" ); + if ( prop ) + resolution_y = (FT_Short)prop->value.integer; + + if ( bsize->y_ppem == 0 ) + { + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = bsize->y_ppem * resolution_y / 72; + } + if ( resolution_x && resolution_y ) + bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; + else + bsize->x_ppem = bsize->y_ppem; + } + + /* set up charset */ + { + PCF_Property charset_registry = 0, charset_encoding = 0; + + + charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" ); + charset_encoding = pcf_find_property( face, "CHARSET_ENCODING" ); + + if ( charset_registry && charset_registry->isString && + charset_encoding && charset_encoding->isString ) + { + if ( FT_STRDUP( face->charset_encoding, + charset_encoding->value.atom ) || + FT_STRDUP( face->charset_registry, + charset_registry->value.atom ) ) + goto Exit; + } + } + } + + Exit: + if ( error ) + { + /* This is done to respect the behaviour of the original */ + /* PCF font driver. */ + error = PCF_Err_Invalid_File_Format; + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/pcfread.h b/src/3rdparty/freetype/src/pcf/pcfread.h new file mode 100644 index 0000000000..c9524f1346 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcfread.h @@ -0,0 +1,45 @@ +/* pcfread.h + + FreeType font driver for pcf fonts + + Copyright 2003 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFREAD_H__ +#define __PCFREAD_H__ + + +#include <ft2build.h> + +FT_BEGIN_HEADER + + FT_LOCAL( PCF_Property ) + pcf_find_property( PCF_Face face, + const FT_String* prop ); + +FT_END_HEADER + +#endif /* __PCFREAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/pcfutil.c b/src/3rdparty/freetype/src/pcf/pcfutil.c new file mode 100644 index 0000000000..67ddbe8890 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcfutil.c @@ -0,0 +1,104 @@ +/* + +Copyright 1990, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ +/* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.3 1999/08/22 08:58:58 dawes Exp $ */ + +/* + * Author: Keith Packard, MIT X Consortium + */ + +/* Modified for use with FreeType */ + + +#include <ft2build.h> +#include "pcfutil.h" + + + /* + * Invert bit order within each BYTE of an array. + */ + + FT_LOCAL_DEF( void ) + BitOrderInvert( unsigned char* buf, + int nbytes ) + { + for ( ; --nbytes >= 0; buf++ ) + { + unsigned int val = *buf; + + + val = ( ( val >> 1 ) & 0x55 ) | ( ( val << 1 ) & 0xAA ); + val = ( ( val >> 2 ) & 0x33 ) | ( ( val << 2 ) & 0xCC ); + val = ( ( val >> 4 ) & 0x0F ) | ( ( val << 4 ) & 0xF0 ); + + *buf = (unsigned char)val; + } + } + + + /* + * Invert byte order within each 16-bits of an array. + */ + + FT_LOCAL_DEF( void ) + TwoByteSwap( unsigned char* buf, + int nbytes ) + { + unsigned char c; + + + for ( ; nbytes >= 2; nbytes -= 2, buf += 2 ) + { + c = buf[0]; + buf[0] = buf[1]; + buf[1] = c; + } + } + + /* + * Invert byte order within each 32-bits of an array. + */ + + FT_LOCAL_DEF( void ) + FourByteSwap( unsigned char* buf, + int nbytes ) + { + unsigned char c; + + + for ( ; nbytes >= 4; nbytes -= 4, buf += 4 ) + { + c = buf[0]; + buf[0] = buf[3]; + buf[3] = c; + + c = buf[1]; + buf[1] = buf[2]; + buf[2] = c; + } + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/pcfutil.h b/src/3rdparty/freetype/src/pcf/pcfutil.h new file mode 100644 index 0000000000..1557be3e80 --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/pcfutil.h @@ -0,0 +1,55 @@ +/* pcfutil.h + + FreeType font driver for pcf fonts + + Copyright 2000, 2001, 2004 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFUTIL_H__ +#define __PCFUTIL_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H + + +FT_BEGIN_HEADER + + FT_LOCAL( void ) + BitOrderInvert( unsigned char* buf, + int nbytes ); + + FT_LOCAL( void ) + TwoByteSwap( unsigned char* buf, + int nbytes ); + + FT_LOCAL( void ) + FourByteSwap( unsigned char* buf, + int nbytes ); + +FT_END_HEADER + +#endif /* __PCFUTIL_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pcf/rules.mk b/src/3rdparty/freetype/src/pcf/rules.mk new file mode 100644 index 0000000000..78641528fa --- /dev/null +++ b/src/3rdparty/freetype/src/pcf/rules.mk @@ -0,0 +1,79 @@ +# +# FreeType 2 pcf driver configuration rules +# + + +# Copyright (C) 2000, 2001, 2003, 2008 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +# pcf driver directory +# +PCF_DIR := $(SRC_DIR)/pcf + + +PCF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PCF_DIR)) + + +# pcf driver sources (i.e., C files) +# +PCF_DRV_SRC := $(PCF_DIR)/pcfdrivr.c \ + $(PCF_DIR)/pcfread.c \ + $(PCF_DIR)/pcfutil.c + +# pcf driver headers +# +PCF_DRV_H := $(PCF_DRV_SRC:%.c=%.h) \ + $(PCF_DIR)/pcf.h \ + $(PCF_DIR)/pcferror.h + +# pcf driver object(s) +# +# PCF_DRV_OBJ_M is used during `multi' builds +# PCF_DRV_OBJ_S is used during `single' builds +# +PCF_DRV_OBJ_M := $(PCF_DRV_SRC:$(PCF_DIR)/%.c=$(OBJ_DIR)/%.$O) +PCF_DRV_OBJ_S := $(OBJ_DIR)/pcf.$O + +# pcf driver source file for single build +# +PCF_DRV_SRC_S := $(PCF_DIR)/pcf.c + + +# pcf driver - single object +# +$(PCF_DRV_OBJ_S): $(PCF_DRV_SRC_S) $(PCF_DRV_SRC) $(FREETYPE_H) $(PCF_DRV_H) + $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PCF_DRV_SRC_S)) + + +# pcf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PCF_DIR)/%.c $(FREETYPE_H) $(PCF_DRV_H) + $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PCF_DRV_OBJ_S) +DRV_OBJS_M += $(PCF_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/pfr/Jamfile b/src/3rdparty/freetype/src/pfr/Jamfile new file mode 100644 index 0000000000..9e2f2b8d05 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/pfr Jamfile +# +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) pfr ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = pfrdrivr pfrgload pfrload pfrobjs pfrcmap pfrsbit ; + } + else + { + _sources = pfr ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/pfr Jamfile diff --git a/src/3rdparty/freetype/src/pfr/module.mk b/src/3rdparty/freetype/src/pfr/module.mk new file mode 100644 index 0000000000..8d1d28a9d2 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PFR module definition +# + + +# Copyright 2002, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PFR_DRIVER + +define PFR_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, pfr_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pfr $(ECHO_DRIVER_DESC)PFR/TrueDoc font files with extension *.pfr$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/pfr/pfr.c b/src/3rdparty/freetype/src/pfr/pfr.c new file mode 100644 index 0000000000..eb2c4edb7e --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfr.c @@ -0,0 +1,29 @@ +/***************************************************************************/ +/* */ +/* pfr.c */ +/* */ +/* FreeType PFR driver component. */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> + +#include "pfrload.c" +#include "pfrgload.c" +#include "pfrcmap.c" +#include "pfrobjs.c" +#include "pfrdrivr.c" +#include "pfrsbit.c" + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrcmap.c b/src/3rdparty/freetype/src/pfr/pfrcmap.c new file mode 100644 index 0000000000..d4656d1b5e --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrcmap.c @@ -0,0 +1,167 @@ +/***************************************************************************/ +/* */ +/* pfrcmap.c */ +/* */ +/* FreeType PFR cmap handling (body). */ +/* */ +/* Copyright 2002, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrcmap.h" +#include "pfrobjs.h" +#include FT_INTERNAL_DEBUG_H + +#include "pfrerror.h" + + + FT_CALLBACK_DEF( FT_Error ) + pfr_cmap_init( PFR_CMap cmap ) + { + FT_Error error = PFR_Err_Ok; + PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap ); + + + cmap->num_chars = face->phy_font.num_chars; + cmap->chars = face->phy_font.chars; + + /* just for safety, check that the character entries are correctly */ + /* sorted in increasing character code order */ + { + FT_UInt n; + + + for ( n = 1; n < cmap->num_chars; n++ ) + { + if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code ) + { + error = PFR_Err_Invalid_Table; + goto Exit; + } + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + pfr_cmap_done( PFR_CMap cmap ) + { + cmap->chars = NULL; + cmap->num_chars = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pfr_cmap_char_index( PFR_CMap cmap, + FT_UInt32 char_code ) + { + FT_UInt min = 0; + FT_UInt max = cmap->num_chars; + FT_UInt mid; + PFR_Char gchar; + + + while ( min < max ) + { + mid = min + ( max - min ) / 2; + gchar = cmap->chars + mid; + + if ( gchar->char_code == char_code ) + return mid + 1; + + if ( gchar->char_code < char_code ) + min = mid + 1; + else + max = mid; + } + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pfr_cmap_char_next( PFR_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + Restart: + { + FT_UInt min = 0; + FT_UInt max = cmap->num_chars; + FT_UInt mid; + PFR_Char gchar; + + + while ( min < max ) + { + mid = min + ( ( max - min ) >> 1 ); + gchar = cmap->chars + mid; + + if ( gchar->char_code == char_code ) + { + result = mid; + if ( result != 0 ) + { + result++; + goto Exit; + } + + char_code++; + goto Restart; + } + + if ( gchar->char_code < char_code ) + min = mid+1; + else + max = mid; + } + + /* we didn't find it, but we have a pair just above it */ + char_code = 0; + + if ( min < cmap->num_chars ) + { + gchar = cmap->chars + min; + result = min; + if ( result != 0 ) + { + result++; + char_code = gchar->char_code; + } + } + } + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + pfr_cmap_class_rec = + { + sizeof ( PFR_CMapRec ), + + (FT_CMap_InitFunc) pfr_cmap_init, + (FT_CMap_DoneFunc) pfr_cmap_done, + (FT_CMap_CharIndexFunc)pfr_cmap_char_index, + (FT_CMap_CharNextFunc) pfr_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrcmap.h b/src/3rdparty/freetype/src/pfr/pfrcmap.h new file mode 100644 index 0000000000..a626953054 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrcmap.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* pfrcmap.h */ +/* */ +/* FreeType PFR cmap handling (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRCMAP_H__ +#define __PFRCMAP_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include "pfrtypes.h" + + +FT_BEGIN_HEADER + + typedef struct PFR_CMapRec_ + { + FT_CMapRec cmap; + FT_UInt num_chars; + PFR_Char chars; + + } PFR_CMapRec, *PFR_CMap; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec pfr_cmap_class_rec; + +FT_END_HEADER + + +#endif /* __PFRCMAP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrdrivr.c b/src/3rdparty/freetype/src/pfr/pfrdrivr.c new file mode 100644 index 0000000000..15cca9854e --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrdrivr.c @@ -0,0 +1,214 @@ +/***************************************************************************/ +/* */ +/* pfrdrivr.c */ +/* */ +/* FreeType PFR driver interface (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_PFR_H +#include FT_SERVICE_XFREE86_NAME_H +#include "pfrdrivr.h" +#include "pfrobjs.h" + +#include "pfrerror.h" + + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_kerning( FT_Face pfrface, /* PFR_Face */ + FT_UInt left, + FT_UInt right, + FT_Vector *avector ) + { + PFR_Face face = (PFR_Face)pfrface; + PFR_PhyFont phys = &face->phy_font; + + + pfr_face_get_kerning( pfrface, left, right, avector ); + + /* convert from metrics to outline units when necessary */ + if ( phys->outline_resolution != phys->metrics_resolution ) + { + if ( avector->x != 0 ) + avector->x = FT_MulDiv( avector->x, phys->outline_resolution, + phys->metrics_resolution ); + + if ( avector->y != 0 ) + avector->y = FT_MulDiv( avector->x, phys->outline_resolution, + phys->metrics_resolution ); + } + + return PFR_Err_Ok; + } + + + /* + * PFR METRICS SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_advance( FT_Face pfrface, /* PFR_Face */ + FT_UInt gindex, + FT_Pos *anadvance ) + { + PFR_Face face = (PFR_Face)pfrface; + FT_Error error = PFR_Err_Invalid_Argument; + + + *anadvance = 0; + + if ( !gindex ) + goto Exit; + + gindex--; + + if ( face ) + { + PFR_PhyFont phys = &face->phy_font; + + + if ( gindex < phys->num_chars ) + { + *anadvance = phys->chars[gindex].advance; + error = 0; + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_metrics( FT_Face pfrface, /* PFR_Face */ + FT_UInt *anoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ) + { + PFR_Face face = (PFR_Face)pfrface; + PFR_PhyFont phys = &face->phy_font; + FT_Fixed x_scale, y_scale; + FT_Size size = face->root.size; + + + if ( anoutline_resolution ) + *anoutline_resolution = phys->outline_resolution; + + if ( ametrics_resolution ) + *ametrics_resolution = phys->metrics_resolution; + + x_scale = 0x10000L; + y_scale = 0x10000L; + + if ( size ) + { + x_scale = FT_DivFix( size->metrics.x_ppem << 6, + phys->metrics_resolution ); + + y_scale = FT_DivFix( size->metrics.y_ppem << 6, + phys->metrics_resolution ); + } + + if ( ametrics_x_scale ) + *ametrics_x_scale = x_scale; + + if ( ametrics_y_scale ) + *ametrics_y_scale = y_scale; + + return PFR_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const FT_Service_PfrMetricsRec pfr_metrics_service_rec = + { + pfr_get_metrics, + pfr_face_get_kerning, + pfr_get_advance + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec pfr_services[] = + { + { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PFR }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + pfr_get_service( FT_Module module, + const FT_String* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pfr_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec pfr_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE, + + sizeof( FT_DriverRec ), + + "pfr", + 0x10000L, + 0x20000L, + + NULL, + + 0, + 0, + pfr_get_service + }, + + sizeof( PFR_FaceRec ), + sizeof( PFR_SizeRec ), + sizeof( PFR_SlotRec ), + + pfr_face_init, + pfr_face_done, + 0, /* FT_Size_InitFunc */ + 0, /* FT_Size_DoneFunc */ + pfr_slot_init, + pfr_slot_done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + pfr_slot_load, + + pfr_get_kerning, + 0, /* FT_Face_AttachFunc */ + 0, /* FT_Face_GetAdvancesFunc */ + 0, /* FT_Size_RequestFunc */ + 0, /* FT_Size_SelectFunc */ + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrdrivr.h b/src/3rdparty/freetype/src/pfr/pfrdrivr.h new file mode 100644 index 0000000000..36f1205b77 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrdrivr.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* pfrdrivr.h */ +/* */ +/* High-level Type PFR driver interface (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRDRIVR_H__ +#define __PFRDRIVR_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) pfr_driver_class; + + +FT_END_HEADER + + +#endif /* __PFRDRIVR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrerror.h b/src/3rdparty/freetype/src/pfr/pfrerror.h new file mode 100644 index 0000000000..2e1c401dd2 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrerror.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* pfrerror.h */ +/* */ +/* PFR error codes (specification only). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PFR error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PFRERROR_H__ +#define __PFRERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PFR_Err_ +#define FT_ERR_BASE FT_Mod_Err_PFR + +#include FT_ERRORS_H + +#endif /* __PFRERROR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrgload.c b/src/3rdparty/freetype/src/pfr/pfrgload.c new file mode 100644 index 0000000000..6fe6e4225a --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrgload.c @@ -0,0 +1,828 @@ +/***************************************************************************/ +/* */ +/* pfrgload.c */ +/* */ +/* FreeType PFR glyph loader (body). */ +/* */ +/* Copyright 2002, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrgload.h" +#include "pfrsbit.h" +#include "pfrload.h" /* for macro definitions */ +#include FT_INTERNAL_DEBUG_H + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR GLYPH BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + pfr_glyph_init( PFR_Glyph glyph, + FT_GlyphLoader loader ) + { + FT_ZERO( glyph ); + + glyph->loader = loader; + glyph->path_begun = 0; + + FT_GlyphLoader_Rewind( loader ); + } + + + FT_LOCAL_DEF( void ) + pfr_glyph_done( PFR_Glyph glyph ) + { + FT_Memory memory = glyph->loader->memory; + + + FT_FREE( glyph->x_control ); + glyph->y_control = NULL; + + glyph->max_xy_control = 0; +#if 0 + glyph->num_x_control = 0; + glyph->num_y_control = 0; +#endif + + FT_FREE( glyph->subs ); + + glyph->max_subs = 0; + glyph->num_subs = 0; + + glyph->loader = NULL; + glyph->path_begun = 0; + } + + + /* close current contour, if any */ + static void + pfr_glyph_close_contour( PFR_Glyph glyph ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Int last, first; + + + if ( !glyph->path_begun ) + return; + + /* compute first and last point indices in current glyph outline */ + last = outline->n_points - 1; + first = 0; + if ( outline->n_contours > 0 ) + first = outline->contours[outline->n_contours - 1]; + + /* if the last point falls on the same location than the first one */ + /* we need to delete it */ + if ( last > first ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + last; + + + if ( p1->x == p2->x && p1->y == p2->y ) + { + outline->n_points--; + last--; + } + } + + /* don't add empty contours */ + if ( last >= first ) + outline->contours[outline->n_contours++] = (short)last; + + glyph->path_begun = 0; + } + + + /* reset glyph to start the loading of a new glyph */ + static void + pfr_glyph_start( PFR_Glyph glyph ) + { + glyph->path_begun = 0; + } + + + static FT_Error + pfr_glyph_line_to( PFR_Glyph glyph, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Error error; + + + /* check that we have begun a new path */ + if ( !glyph->path_begun ) + { + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" )); + goto Exit; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 0 ); + if ( !error ) + { + FT_UInt n = outline->n_points; + + + outline->points[n] = *to; + outline->tags [n] = FT_CURVE_TAG_ON; + + outline->n_points++; + } + + Exit: + return error; + } + + + static FT_Error + pfr_glyph_curve_to( PFR_Glyph glyph, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Error error; + + + /* check that we have begun a new path */ + if ( !glyph->path_begun ) + { + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" )); + goto Exit; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 3, 0 ); + if ( !error ) + { + FT_Vector* vec = outline->points + outline->n_points; + FT_Byte* tag = (FT_Byte*)outline->tags + outline->n_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + tag[0] = FT_CURVE_TAG_CUBIC; + tag[1] = FT_CURVE_TAG_CUBIC; + tag[2] = FT_CURVE_TAG_ON; + + outline->n_points = (FT_Short)( outline->n_points + 3 ); + } + + Exit: + return error; + } + + + static FT_Error + pfr_glyph_move_to( PFR_Glyph glyph, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Error error; + + + /* close current contour if any */ + pfr_glyph_close_contour( glyph ); + + /* indicate that a new contour has started */ + glyph->path_begun = 1; + + /* check that there is space for a new contour and a new point */ + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 1 ); + if ( !error ) + /* add new start point */ + error = pfr_glyph_line_to( glyph, to ); + + return error; + } + + + static void + pfr_glyph_end( PFR_Glyph glyph ) + { + /* close current contour if any */ + pfr_glyph_close_contour( glyph ); + + /* merge the current glyph into the stack */ + FT_GlyphLoader_Add( glyph->loader ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR GLYPH LOADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* load a simple glyph */ + static FT_Error + pfr_glyph_load_simple( PFR_Glyph glyph, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Error error = 0; + FT_Memory memory = glyph->loader->memory; + FT_UInt flags, x_count, y_count, i, count, mask; + FT_Int x; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + /* test for composite glyphs */ + if ( flags & PFR_GLYPH_IS_COMPOUND ) + goto Failure; + + x_count = 0; + y_count = 0; + + if ( flags & PFR_GLYPH_1BYTE_XYCOUNT ) + { + PFR_CHECK( 1 ); + count = PFR_NEXT_BYTE( p ); + x_count = ( count & 15 ); + y_count = ( count >> 4 ); + } + else + { + if ( flags & PFR_GLYPH_XCOUNT ) + { + PFR_CHECK( 1 ); + x_count = PFR_NEXT_BYTE( p ); + } + + if ( flags & PFR_GLYPH_YCOUNT ) + { + PFR_CHECK( 1 ); + y_count = PFR_NEXT_BYTE( p ); + } + } + + count = x_count + y_count; + + /* re-allocate array when necessary */ + if ( count > glyph->max_xy_control ) + { + FT_UInt new_max = FT_PAD_CEIL( count, 8 ); + + + if ( FT_RENEW_ARRAY( glyph->x_control, + glyph->max_xy_control, + new_max ) ) + goto Exit; + + glyph->max_xy_control = new_max; + } + + glyph->y_control = glyph->x_control + x_count; + + mask = 0; + x = 0; + + for ( i = 0; i < count; i++ ) + { + if ( ( i & 7 ) == 0 ) + { + PFR_CHECK( 1 ); + mask = PFR_NEXT_BYTE( p ); + } + + if ( mask & 1 ) + { + PFR_CHECK( 2 ); + x = PFR_NEXT_SHORT( p ); + } + else + { + PFR_CHECK( 1 ); + x += PFR_NEXT_BYTE( p ); + } + + glyph->x_control[i] = x; + + mask >>= 1; + } + + /* XXX: for now we ignore the secondary stroke and edge definitions */ + /* since we don't want to support native PFR hinting */ + /* */ + if ( flags & PFR_GLYPH_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if ( error ) + goto Exit; + } + + pfr_glyph_start( glyph ); + + /* now load a simple glyph */ + { + FT_Vector pos[4]; + FT_Vector* cur; + + + pos[0].x = pos[0].y = 0; + pos[3] = pos[0]; + + for (;;) + { + FT_UInt format, format_low, args_format = 0, args_count, n; + + + /***************************************************************/ + /* read instruction */ + /* */ + PFR_CHECK( 1 ); + format = PFR_NEXT_BYTE( p ); + format_low = format & 15; + + switch ( format >> 4 ) + { + case 0: /* end glyph */ + FT_TRACE6(( "- end glyph" )); + args_count = 0; + break; + + case 1: /* general line operation */ + FT_TRACE6(( "- general line" )); + goto Line1; + + case 4: /* move to inside contour */ + FT_TRACE6(( "- move to inside" )); + goto Line1; + + case 5: /* move to outside contour */ + FT_TRACE6(( "- move to outside" )); + Line1: + args_format = format_low; + args_count = 1; + break; + + case 2: /* horizontal line to */ + FT_TRACE6(( "- horizontal line to cx.%d", format_low )); + if ( format_low > x_count ) + goto Failure; + pos[0].x = glyph->x_control[format_low]; + pos[0].y = pos[3].y; + pos[3] = pos[0]; + args_count = 0; + break; + + case 3: /* vertical line to */ + FT_TRACE6(( "- vertical line to cy.%d", format_low )); + if ( format_low > y_count ) + goto Failure; + pos[0].x = pos[3].x; + pos[0].y = glyph->y_control[format_low]; + pos[3] = pos[0]; + args_count = 0; + break; + + case 6: /* horizontal to vertical curve */ + FT_TRACE6(( "- hv curve " )); + args_format = 0xB8E; + args_count = 3; + break; + + case 7: /* vertical to horizontal curve */ + FT_TRACE6(( "- vh curve" )); + args_format = 0xE2B; + args_count = 3; + break; + + default: /* general curve to */ + FT_TRACE6(( "- general curve" )); + args_count = 4; + args_format = format_low; + } + + /***********************************************************/ + /* now read arguments */ + /* */ + cur = pos; + for ( n = 0; n < args_count; n++ ) + { + FT_UInt idx; + FT_Int delta; + + + /* read the X argument */ + switch ( args_format & 3 ) + { + case 0: /* 8-bit index */ + PFR_CHECK( 1 ); + idx = PFR_NEXT_BYTE( p ); + if ( idx > x_count ) + goto Failure; + cur->x = glyph->x_control[idx]; + FT_TRACE7(( " cx#%d", idx )); + break; + + case 1: /* 16-bit value */ + PFR_CHECK( 2 ); + cur->x = PFR_NEXT_SHORT( p ); + FT_TRACE7(( " x.%d", cur->x )); + break; + + case 2: /* 8-bit delta */ + PFR_CHECK( 1 ); + delta = PFR_NEXT_INT8( p ); + cur->x = pos[3].x + delta; + FT_TRACE7(( " dx.%d", delta )); + break; + + default: + FT_TRACE7(( " |" )); + cur->x = pos[3].x; + } + + /* read the Y argument */ + switch ( ( args_format >> 2 ) & 3 ) + { + case 0: /* 8-bit index */ + PFR_CHECK( 1 ); + idx = PFR_NEXT_BYTE( p ); + if ( idx > y_count ) + goto Failure; + cur->y = glyph->y_control[idx]; + FT_TRACE7(( " cy#%d", idx )); + break; + + case 1: /* 16-bit absolute value */ + PFR_CHECK( 2 ); + cur->y = PFR_NEXT_SHORT( p ); + FT_TRACE7(( " y.%d", cur->y )); + break; + + case 2: /* 8-bit delta */ + PFR_CHECK( 1 ); + delta = PFR_NEXT_INT8( p ); + cur->y = pos[3].y + delta; + FT_TRACE7(( " dy.%d", delta )); + break; + + default: + FT_TRACE7(( " -" )); + cur->y = pos[3].y; + } + + /* read the additional format flag for the general curve */ + if ( n == 0 && args_count == 4 ) + { + PFR_CHECK( 1 ); + args_format = PFR_NEXT_BYTE( p ); + args_count--; + } + else + args_format >>= 4; + + /* save the previous point */ + pos[3] = cur[0]; + cur++; + } + + FT_TRACE7(( "\n" )); + + /***********************************************************/ + /* finally, execute instruction */ + /* */ + switch ( format >> 4 ) + { + case 0: /* end glyph => EXIT */ + pfr_glyph_end( glyph ); + goto Exit; + + case 1: /* line operations */ + case 2: + case 3: + error = pfr_glyph_line_to( glyph, pos ); + goto Test_Error; + + case 4: /* move to inside contour */ + case 5: /* move to outside contour */ + error = pfr_glyph_move_to( glyph, pos ); + goto Test_Error; + + default: /* curve operations */ + error = pfr_glyph_curve_to( glyph, pos, pos + 1, pos + 2 ); + + Test_Error: /* test error condition */ + if ( error ) + goto Exit; + } + } /* for (;;) */ + } + + Exit: + return error; + + Failure: + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_load_simple: invalid glyph data\n" )); + goto Exit; + } + + + /* load a composite/compound glyph */ + static FT_Error + pfr_glyph_load_compound( PFR_Glyph glyph, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Error error = 0; + FT_GlyphLoader loader = glyph->loader; + FT_Memory memory = loader->memory; + PFR_SubGlyph subglyph; + FT_UInt flags, i, count, org_count; + FT_Int x_pos, y_pos; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + /* test for composite glyphs */ + if ( !( flags & PFR_GLYPH_IS_COMPOUND ) ) + goto Failure; + + count = flags & 0x3F; + + /* ignore extra items when present */ + /* */ + if ( flags & PFR_GLYPH_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if (error) goto Exit; + } + + /* we can't rely on the FT_GlyphLoader to load sub-glyphs, because */ + /* the PFR format is dumb, using direct file offsets to point to the */ + /* sub-glyphs (instead of glyph indices). Sigh. */ + /* */ + /* For now, we load the list of sub-glyphs into a different array */ + /* but this will prevent us from using the auto-hinter at its best */ + /* quality. */ + /* */ + org_count = glyph->num_subs; + + if ( org_count + count > glyph->max_subs ) + { + FT_UInt new_max = ( org_count + count + 3 ) & (FT_UInt)-4; + + + if ( FT_RENEW_ARRAY( glyph->subs, glyph->max_subs, new_max ) ) + goto Exit; + + glyph->max_subs = new_max; + } + + subglyph = glyph->subs + org_count; + + for ( i = 0; i < count; i++, subglyph++ ) + { + FT_UInt format; + + + x_pos = 0; + y_pos = 0; + + PFR_CHECK( 1 ); + format = PFR_NEXT_BYTE( p ); + + /* read scale when available */ + subglyph->x_scale = 0x10000L; + if ( format & PFR_SUBGLYPH_XSCALE ) + { + PFR_CHECK( 2 ); + subglyph->x_scale = PFR_NEXT_SHORT( p ) << 4; + } + + subglyph->y_scale = 0x10000L; + if ( format & PFR_SUBGLYPH_YSCALE ) + { + PFR_CHECK( 2 ); + subglyph->y_scale = PFR_NEXT_SHORT( p ) << 4; + } + + /* read offset */ + switch ( format & 3 ) + { + case 1: + PFR_CHECK( 2 ); + x_pos = PFR_NEXT_SHORT( p ); + break; + + case 2: + PFR_CHECK( 1 ); + x_pos += PFR_NEXT_INT8( p ); + break; + + default: + ; + } + + switch ( ( format >> 2 ) & 3 ) + { + case 1: + PFR_CHECK( 2 ); + y_pos = PFR_NEXT_SHORT( p ); + break; + + case 2: + PFR_CHECK( 1 ); + y_pos += PFR_NEXT_INT8( p ); + break; + + default: + ; + } + + subglyph->x_delta = x_pos; + subglyph->y_delta = y_pos; + + /* read glyph position and size now */ + if ( format & PFR_SUBGLYPH_2BYTE_SIZE ) + { + PFR_CHECK( 2 ); + subglyph->gps_size = PFR_NEXT_USHORT( p ); + } + else + { + PFR_CHECK( 1 ); + subglyph->gps_size = PFR_NEXT_BYTE( p ); + } + + if ( format & PFR_SUBGLYPH_3BYTE_OFFSET ) + { + PFR_CHECK( 3 ); + subglyph->gps_offset = PFR_NEXT_LONG( p ); + } + else + { + PFR_CHECK( 2 ); + subglyph->gps_offset = PFR_NEXT_USHORT( p ); + } + + glyph->num_subs++; + } + + Exit: + return error; + + Failure: + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_load_compound: invalid glyph data\n" )); + goto Exit; + } + + + static FT_Error + pfr_glyph_load_rec( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ) + { + FT_Error error; + FT_Byte* p; + FT_Byte* limit; + + + if ( FT_STREAM_SEEK( gps_offset + offset ) || + FT_FRAME_ENTER( size ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + limit = p + size; + + if ( size > 0 && *p & PFR_GLYPH_IS_COMPOUND ) + { + FT_Int n, old_count, count; + FT_GlyphLoader loader = glyph->loader; + FT_Outline* base = &loader->base.outline; + + + old_count = glyph->num_subs; + + /* this is a compound glyph - load it */ + error = pfr_glyph_load_compound( glyph, p, limit ); + + FT_FRAME_EXIT(); + + if ( error ) + goto Exit; + + count = glyph->num_subs - old_count; + + /* now, load each individual glyph */ + for ( n = 0; n < count; n++ ) + { + FT_Int i, old_points, num_points; + PFR_SubGlyph subglyph; + + + subglyph = glyph->subs + old_count + n; + old_points = base->n_points; + + error = pfr_glyph_load_rec( glyph, stream, gps_offset, + subglyph->gps_offset, + subglyph->gps_size ); + if ( error ) + goto Exit; + + /* note that `glyph->subs' might have been re-allocated */ + subglyph = glyph->subs + old_count + n; + num_points = base->n_points - old_points; + + /* translate and eventually scale the new glyph points */ + if ( subglyph->x_scale != 0x10000L || subglyph->y_scale != 0x10000L ) + { + FT_Vector* vec = base->points + old_points; + + + for ( i = 0; i < num_points; i++, vec++ ) + { + vec->x = FT_MulFix( vec->x, subglyph->x_scale ) + + subglyph->x_delta; + vec->y = FT_MulFix( vec->y, subglyph->y_scale ) + + subglyph->y_delta; + } + } + else + { + FT_Vector* vec = loader->base.outline.points + old_points; + + + for ( i = 0; i < num_points; i++, vec++ ) + { + vec->x += subglyph->x_delta; + vec->y += subglyph->y_delta; + } + } + + /* proceed to next sub-glyph */ + } + } + else + { + /* load a simple glyph */ + error = pfr_glyph_load_simple( glyph, p, limit ); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + + + + FT_LOCAL_DEF( FT_Error ) + pfr_glyph_load( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ) + { + /* initialize glyph loader */ + FT_GlyphLoader_Rewind( glyph->loader ); + + glyph->num_subs = 0; + + /* load the glyph, recursively when needed */ + return pfr_glyph_load_rec( glyph, stream, gps_offset, offset, size ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrgload.h b/src/3rdparty/freetype/src/pfr/pfrgload.h new file mode 100644 index 0000000000..7cc7a8702a --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrgload.h @@ -0,0 +1,49 @@ +/***************************************************************************/ +/* */ +/* pfrgload.h */ +/* */ +/* FreeType PFR glyph loader (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRGLOAD_H__ +#define __PFRGLOAD_H__ + +#include "pfrtypes.h" + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + pfr_glyph_init( PFR_Glyph glyph, + FT_GlyphLoader loader ); + + FT_LOCAL( void ) + pfr_glyph_done( PFR_Glyph glyph ); + + + FT_LOCAL( FT_Error ) + pfr_glyph_load( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ); + + +FT_END_HEADER + + +#endif /* __PFRGLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrload.c b/src/3rdparty/freetype/src/pfr/pfrload.c new file mode 100644 index 0000000000..1ee2c1f8c8 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrload.c @@ -0,0 +1,938 @@ +/***************************************************************************/ +/* */ +/* pfrload.c */ +/* */ +/* FreeType PFR loader (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** EXTRA ITEMS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + pfr_extra_items_skip( FT_Byte* *pp, + FT_Byte* limit ) + { + return pfr_extra_items_parse( pp, limit, NULL, NULL ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_extra_items_parse( FT_Byte* *pp, + FT_Byte* limit, + PFR_ExtraItem item_list, + FT_Pointer item_data ) + { + FT_Error error = 0; + FT_Byte* p = *pp; + FT_UInt num_items, item_type, item_size; + + + PFR_CHECK( 1 ); + num_items = PFR_NEXT_BYTE( p ); + + for ( ; num_items > 0; num_items-- ) + { + PFR_CHECK( 2 ); + item_size = PFR_NEXT_BYTE( p ); + item_type = PFR_NEXT_BYTE( p ); + + PFR_CHECK( item_size ); + + if ( item_list ) + { + PFR_ExtraItem extra = item_list; + + + for ( extra = item_list; extra->parser != NULL; extra++ ) + { + if ( extra->type == item_type ) + { + error = extra->parser( p, p + item_size, item_data ); + if ( error ) goto Exit; + + break; + } + } + } + + p += item_size; + } + + Exit: + *pp = p; + return error; + + Too_Short: + FT_ERROR(( "pfr_extra_items_parse: invalid extra items table\n" )); + error = PFR_Err_Invalid_Table; + goto Exit; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR HEADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static const FT_Frame_Field pfr_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PFR_HeaderRec + + FT_FRAME_START( 58 ), + FT_FRAME_ULONG ( signature ), + FT_FRAME_USHORT( version ), + FT_FRAME_USHORT( signature2 ), + FT_FRAME_USHORT( header_size ), + + FT_FRAME_USHORT( log_dir_size ), + FT_FRAME_USHORT( log_dir_offset ), + + FT_FRAME_USHORT( log_font_max_size ), + FT_FRAME_UOFF3 ( log_font_section_size ), + FT_FRAME_UOFF3 ( log_font_section_offset ), + + FT_FRAME_USHORT( phy_font_max_size ), + FT_FRAME_UOFF3 ( phy_font_section_size ), + FT_FRAME_UOFF3 ( phy_font_section_offset ), + + FT_FRAME_USHORT( gps_max_size ), + FT_FRAME_UOFF3 ( gps_section_size ), + FT_FRAME_UOFF3 ( gps_section_offset ), + + FT_FRAME_BYTE ( max_blue_values ), + FT_FRAME_BYTE ( max_x_orus ), + FT_FRAME_BYTE ( max_y_orus ), + + FT_FRAME_BYTE ( phy_font_max_size_high ), + FT_FRAME_BYTE ( color_flags ), + + FT_FRAME_UOFF3 ( bct_max_size ), + FT_FRAME_UOFF3 ( bct_set_max_size ), + FT_FRAME_UOFF3 ( phy_bct_set_max_size ), + + FT_FRAME_USHORT( num_phy_fonts ), + FT_FRAME_BYTE ( max_vert_stem_snap ), + FT_FRAME_BYTE ( max_horz_stem_snap ), + FT_FRAME_USHORT( max_chars ), + FT_FRAME_END + }; + + + FT_LOCAL_DEF( FT_Error ) + pfr_header_load( PFR_Header header, + FT_Stream stream ) + { + FT_Error error; + + + /* read header directly */ + if ( !FT_STREAM_SEEK( 0 ) && + !FT_STREAM_READ_FIELDS( pfr_header_fields, header ) ) + { + /* make a few adjustments to the header */ + header->phy_font_max_size += + (FT_UInt32)header->phy_font_max_size_high << 16; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Bool ) + pfr_header_check( PFR_Header header ) + { + FT_Bool result = 1; + + + /* check signature and header size */ + if ( header->signature != 0x50465230L || /* "PFR0" */ + header->version > 4 || + header->header_size < 58 || + header->signature2 != 0x0d0a ) /* CR/LF */ + { + result = 0; + } + return result; + } + + + /***********************************************************************/ + /***********************************************************************/ + /***** *****/ + /***** PFR LOGICAL FONTS *****/ + /***** *****/ + /***********************************************************************/ + /***********************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + pfr_log_font_count( FT_Stream stream, + FT_UInt32 section_offset, + FT_UInt *acount ) + { + FT_Error error; + FT_UInt count; + FT_UInt result = 0; + + + if ( FT_STREAM_SEEK( section_offset ) || FT_READ_USHORT( count ) ) + goto Exit; + + result = count; + + Exit: + *acount = result; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_log_font_load( PFR_LogFont log_font, + FT_Stream stream, + FT_UInt idx, + FT_UInt32 section_offset, + FT_Bool size_increment ) + { + FT_UInt num_log_fonts; + FT_UInt flags; + FT_UInt32 offset; + FT_UInt32 size; + FT_Error error; + + + if ( FT_STREAM_SEEK( section_offset ) || + FT_READ_USHORT( num_log_fonts ) ) + goto Exit; + + if ( idx >= num_log_fonts ) + return PFR_Err_Invalid_Argument; + + if ( FT_STREAM_SKIP( idx * 5 ) || + FT_READ_USHORT( size ) || + FT_READ_UOFF3 ( offset ) ) + goto Exit; + + /* save logical font size and offset */ + log_font->size = size; + log_font->offset = offset; + + /* now, check the rest of the table before loading it */ + { + FT_Byte* p; + FT_Byte* limit; + FT_UInt local; + + + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) + goto Exit; + + p = stream->cursor; + limit = p + size; + + PFR_CHECK(13); + + log_font->matrix[0] = PFR_NEXT_LONG( p ); + log_font->matrix[1] = PFR_NEXT_LONG( p ); + log_font->matrix[2] = PFR_NEXT_LONG( p ); + log_font->matrix[3] = PFR_NEXT_LONG( p ); + + flags = PFR_NEXT_BYTE( p ); + + local = 0; + if ( flags & PFR_LOG_STROKE ) + { + local++; + if ( flags & PFR_LOG_2BYTE_STROKE ) + local++; + + if ( (flags & PFR_LINE_JOIN_MASK) == PFR_LINE_JOIN_MITER ) + local += 3; + } + if ( flags & PFR_LOG_BOLD ) + { + local++; + if ( flags & PFR_LOG_2BYTE_BOLD ) + local++; + } + + PFR_CHECK( local ); + + if ( flags & PFR_LOG_STROKE ) + { + log_font->stroke_thickness = ( flags & PFR_LOG_2BYTE_STROKE ) + ? PFR_NEXT_SHORT( p ) + : PFR_NEXT_BYTE( p ); + + if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER ) + log_font->miter_limit = PFR_NEXT_LONG( p ); + } + + if ( flags & PFR_LOG_BOLD ) + { + log_font->bold_thickness = ( flags & PFR_LOG_2BYTE_BOLD ) + ? PFR_NEXT_SHORT( p ) + : PFR_NEXT_BYTE( p ); + } + + if ( flags & PFR_LOG_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if (error) goto Fail; + } + + PFR_CHECK(5); + log_font->phys_size = PFR_NEXT_USHORT( p ); + log_font->phys_offset = PFR_NEXT_ULONG( p ); + if ( size_increment ) + { + PFR_CHECK( 1 ); + log_font->phys_size += (FT_UInt32)PFR_NEXT_BYTE( p ) << 16; + } + } + + Fail: + FT_FRAME_EXIT(); + + Exit: + return error; + + Too_Short: + FT_ERROR(( "pfr_log_font_load: invalid logical font table\n" )); + error = PFR_Err_Invalid_Table; + goto Fail; + } + + + /***********************************************************************/ + /***********************************************************************/ + /***** *****/ + /***** PFR PHYSICAL FONTS *****/ + /***** *****/ + /***********************************************************************/ + /***********************************************************************/ + + + /* load bitmap strikes lists */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_bitmap_info( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + FT_Memory memory = phy_font->memory; + PFR_Strike strike; + FT_UInt flags0; + FT_UInt n, count, size1; + FT_Error error = 0; + + + PFR_CHECK( 5 ); + + p += 3; /* skip bctSize */ + flags0 = PFR_NEXT_BYTE( p ); + count = PFR_NEXT_BYTE( p ); + + /* re-allocate when needed */ + if ( phy_font->num_strikes + count > phy_font->max_strikes ) + { + FT_UInt new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 ); + + + if ( FT_RENEW_ARRAY( phy_font->strikes, + phy_font->num_strikes, + new_max ) ) + goto Exit; + + phy_font->max_strikes = new_max; + } + + size1 = 1 + 1 + 1 + 2 + 2 + 1; + if ( flags0 & PFR_STRIKE_2BYTE_XPPM ) + size1++; + + if ( flags0 & PFR_STRIKE_2BYTE_YPPM ) + size1++; + + if ( flags0 & PFR_STRIKE_3BYTE_SIZE ) + size1++; + + if ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) + size1++; + + if ( flags0 & PFR_STRIKE_2BYTE_COUNT ) + size1++; + + strike = phy_font->strikes + phy_font->num_strikes; + + PFR_CHECK( count * size1 ); + + for ( n = 0; n < count; n++, strike++ ) + { + strike->x_ppm = ( flags0 & PFR_STRIKE_2BYTE_XPPM ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + strike->y_ppm = ( flags0 & PFR_STRIKE_2BYTE_YPPM ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + strike->flags = PFR_NEXT_BYTE( p ); + + strike->bct_size = ( flags0 & PFR_STRIKE_3BYTE_SIZE ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + + strike->bct_offset = ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + + strike->num_bitmaps = ( flags0 & PFR_STRIKE_2BYTE_COUNT ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + } + + phy_font->num_strikes += count; + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_extra_item_load_bitmap_info: invalid bitmap info table\n" )); + goto Exit; + } + + + /* Load font ID. This is a so-called "unique" name that is rather + * long and descriptive (like "Tiresias ScreenFont v7.51"). + * + * Note that a PFR font's family name is contained in an *undocumented* + * string of the "auxiliary data" portion of a physical font record. This + * may also contain the "real" style name! + * + * If no family name is present, the font ID is used instead for the + * family. + */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_font_id( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + FT_Error error = 0; + FT_Memory memory = phy_font->memory; + FT_PtrDist len = limit - p; + + + if ( phy_font->font_id != NULL ) + goto Exit; + + if ( FT_ALLOC( phy_font->font_id, len + 1 ) ) + goto Exit; + + /* copy font ID name, and terminate it for safety */ + FT_MEM_COPY( phy_font->font_id, p, len ); + phy_font->font_id[len] = 0; + + Exit: + return error; + } + + + /* load stem snap tables */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_stem_snaps( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + FT_UInt count, num_vert, num_horz; + FT_Int* snaps; + FT_Error error = 0; + FT_Memory memory = phy_font->memory; + + + if ( phy_font->vertical.stem_snaps != NULL ) + goto Exit; + + PFR_CHECK( 1 ); + count = PFR_NEXT_BYTE( p ); + + num_vert = count & 15; + num_horz = count >> 4; + count = num_vert + num_horz; + + PFR_CHECK( count * 2 ); + + if ( FT_NEW_ARRAY( snaps, count ) ) + goto Exit; + + phy_font->vertical.stem_snaps = snaps; + phy_font->horizontal.stem_snaps = snaps + num_vert; + + for ( ; count > 0; count--, snaps++ ) + *snaps = FT_NEXT_SHORT( p ); + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_exta_item_load_stem_snaps: invalid stem snaps table\n" )); + goto Exit; + } + + + + /* load kerning pair data */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_kerning_pairs( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + PFR_KernItem item; + FT_Error error = 0; + FT_Memory memory = phy_font->memory; + + + FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" )); + + if ( FT_NEW( item ) ) + goto Exit; + + PFR_CHECK( 4 ); + + item->pair_count = PFR_NEXT_BYTE( p ); + item->base_adj = PFR_NEXT_SHORT( p ); + item->flags = PFR_NEXT_BYTE( p ); + item->offset = phy_font->offset + ( p - phy_font->cursor ); + +#ifndef PFR_CONFIG_NO_CHECKS + item->pair_size = 3; + + if ( item->flags & PFR_KERN_2BYTE_CHAR ) + item->pair_size += 2; + + if ( item->flags & PFR_KERN_2BYTE_ADJ ) + item->pair_size += 1; + + PFR_CHECK( item->pair_count * item->pair_size ); +#endif + + /* load first and last pairs into the item to speed up */ + /* lookup later... */ + if ( item->pair_count > 0 ) + { + FT_UInt char1, char2; + FT_Byte* q; + + + if ( item->flags & PFR_KERN_2BYTE_CHAR ) + { + q = p; + char1 = PFR_NEXT_USHORT( q ); + char2 = PFR_NEXT_USHORT( q ); + + item->pair1 = PFR_KERN_INDEX( char1, char2 ); + + q = p + item->pair_size * ( item->pair_count - 1 ); + char1 = PFR_NEXT_USHORT( q ); + char2 = PFR_NEXT_USHORT( q ); + + item->pair2 = PFR_KERN_INDEX( char1, char2 ); + } + else + { + q = p; + char1 = PFR_NEXT_BYTE( q ); + char2 = PFR_NEXT_BYTE( q ); + + item->pair1 = PFR_KERN_INDEX( char1, char2 ); + + q = p + item->pair_size * ( item->pair_count - 1 ); + char1 = PFR_NEXT_BYTE( q ); + char2 = PFR_NEXT_BYTE( q ); + + item->pair2 = PFR_KERN_INDEX( char1, char2 ); + } + + /* add new item to the current list */ + item->next = NULL; + *phy_font->kern_items_tail = item; + phy_font->kern_items_tail = &item->next; + phy_font->num_kern_pairs += item->pair_count; + } + else + { + /* empty item! */ + FT_FREE( item ); + } + + Exit: + return error; + + Too_Short: + FT_FREE( item ); + + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_extra_item_load_kerning_pairs: " + "invalid kerning pairs table\n" )); + goto Exit; + } + + + + static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = + { + { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info }, + { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id }, + { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps }, + { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs }, + { 0, NULL } + }; + + + /* Loads a name from the auxiliary data. Since this extracts undocumented + * strings from the font file, we need to be careful here. + */ + static FT_Error + pfr_aux_name_load( FT_Byte* p, + FT_UInt len, + FT_Memory memory, + FT_String* *astring ) + { + FT_Error error = 0; + FT_String* result = NULL; + FT_UInt n, ok; + + + if ( len > 0 && p[len - 1] == 0 ) + len--; + + /* check that each character is ASCII for making sure not to + load garbage + */ + ok = ( len > 0 ); + for ( n = 0; n < len; n++ ) + if ( p[n] < 32 || p[n] > 127 ) + { + ok = 0; + break; + } + + if ( ok ) + { + if ( FT_ALLOC( result, len + 1 ) ) + goto Exit; + + FT_MEM_COPY( result, p, len ); + result[len] = 0; + } + Exit: + *astring = result; + return error; + } + + + FT_LOCAL_DEF( void ) + pfr_phy_font_done( PFR_PhyFont phy_font, + FT_Memory memory ) + { + FT_FREE( phy_font->font_id ); + FT_FREE( phy_font->family_name ); + FT_FREE( phy_font->style_name ); + + FT_FREE( phy_font->vertical.stem_snaps ); + phy_font->vertical.num_stem_snaps = 0; + + phy_font->horizontal.stem_snaps = NULL; + phy_font->horizontal.num_stem_snaps = 0; + + FT_FREE( phy_font->strikes ); + phy_font->num_strikes = 0; + phy_font->max_strikes = 0; + + FT_FREE( phy_font->chars ); + phy_font->num_chars = 0; + phy_font->chars_offset = 0; + + FT_FREE( phy_font->blue_values ); + phy_font->num_blue_values = 0; + + { + PFR_KernItem item, next; + + + item = phy_font->kern_items; + while ( item ) + { + next = item->next; + FT_FREE( item ); + item = next; + } + phy_font->kern_items = NULL; + phy_font->kern_items_tail = NULL; + } + + phy_font->num_kern_pairs = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_phy_font_load( PFR_PhyFont phy_font, + FT_Stream stream, + FT_UInt32 offset, + FT_UInt32 size ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt flags, num_aux; + FT_Byte* p; + FT_Byte* limit; + + + phy_font->memory = memory; + phy_font->offset = offset; + + phy_font->kern_items = NULL; + phy_font->kern_items_tail = &phy_font->kern_items; + + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) + goto Exit; + + phy_font->cursor = stream->cursor; + + p = stream->cursor; + limit = p + size; + + PFR_CHECK( 15 ); + phy_font->font_ref_number = PFR_NEXT_USHORT( p ); + phy_font->outline_resolution = PFR_NEXT_USHORT( p ); + phy_font->metrics_resolution = PFR_NEXT_USHORT( p ); + phy_font->bbox.xMin = PFR_NEXT_SHORT( p ); + phy_font->bbox.yMin = PFR_NEXT_SHORT( p ); + phy_font->bbox.xMax = PFR_NEXT_SHORT( p ); + phy_font->bbox.yMax = PFR_NEXT_SHORT( p ); + phy_font->flags = flags = PFR_NEXT_BYTE( p ); + + /* get the standard advance for non-proportional fonts */ + if ( !(flags & PFR_PHY_PROPORTIONAL) ) + { + PFR_CHECK( 2 ); + phy_font->standard_advance = PFR_NEXT_SHORT( p ); + } + + /* load the extra items when present */ + if ( flags & PFR_PHY_EXTRA_ITEMS ) + { + error = pfr_extra_items_parse( &p, limit, + pfr_phy_font_extra_items, phy_font ); + + if ( error ) + goto Fail; + } + + /* In certain fonts, the auxiliary bytes contain interesting */ + /* information. These are not in the specification but can be */ + /* guessed by looking at the content of a few PFR0 fonts. */ + PFR_CHECK( 3 ); + num_aux = PFR_NEXT_ULONG( p ); + + if ( num_aux > 0 ) + { + FT_Byte* q = p; + FT_Byte* q2; + + + PFR_CHECK( num_aux ); + p += num_aux; + + while ( num_aux > 0 ) + { + FT_UInt length, type; + + + if ( q + 4 > p ) + break; + + length = PFR_NEXT_USHORT( q ); + if ( length < 4 || length > num_aux ) + break; + + q2 = q + length - 2; + type = PFR_NEXT_USHORT( q ); + + switch ( type ) + { + case 1: + /* this seems to correspond to the font's family name, + * padded to 16-bits with one zero when necessary + */ + error = pfr_aux_name_load( q, length - 4U, memory, + &phy_font->family_name ); + if ( error ) + goto Exit; + break; + + case 2: + if ( q + 32 > q2 ) + break; + + q += 10; + phy_font->ascent = PFR_NEXT_SHORT( q ); + phy_font->descent = PFR_NEXT_SHORT( q ); + phy_font->leading = PFR_NEXT_SHORT( q ); + q += 16; + break; + + case 3: + /* this seems to correspond to the font's style name, + * padded to 16-bits with one zero when necessary + */ + error = pfr_aux_name_load( q, length - 4U, memory, + &phy_font->style_name ); + if ( error ) + goto Exit; + break; + + default: + ; + } + + q = q2; + num_aux -= length; + } + } + + /* read the blue values */ + { + FT_UInt n, count; + + + PFR_CHECK( 1 ); + phy_font->num_blue_values = count = PFR_NEXT_BYTE( p ); + + PFR_CHECK( count * 2 ); + + if ( FT_NEW_ARRAY( phy_font->blue_values, count ) ) + goto Fail; + + for ( n = 0; n < count; n++ ) + phy_font->blue_values[n] = PFR_NEXT_SHORT( p ); + } + + PFR_CHECK( 8 ); + phy_font->blue_fuzz = PFR_NEXT_BYTE( p ); + phy_font->blue_scale = PFR_NEXT_BYTE( p ); + + phy_font->vertical.standard = PFR_NEXT_USHORT( p ); + phy_font->horizontal.standard = PFR_NEXT_USHORT( p ); + + /* read the character descriptors */ + { + FT_UInt n, count, Size; + + + phy_font->num_chars = count = PFR_NEXT_USHORT( p ); + phy_font->chars_offset = offset + ( p - stream->cursor ); + + if ( FT_NEW_ARRAY( phy_font->chars, count ) ) + goto Fail; + + Size = 1 + 1 + 2; + if ( flags & PFR_PHY_2BYTE_CHARCODE ) + Size += 1; + + if ( flags & PFR_PHY_PROPORTIONAL ) + Size += 2; + + if ( flags & PFR_PHY_ASCII_CODE ) + Size += 1; + + if ( flags & PFR_PHY_2BYTE_GPS_SIZE ) + Size += 1; + + if ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) + Size += 1; + + PFR_CHECK( count * Size ); + + for ( n = 0; n < count; n++ ) + { + PFR_Char cur = &phy_font->chars[n]; + + + cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + cur->advance = ( flags & PFR_PHY_PROPORTIONAL ) + ? PFR_NEXT_SHORT( p ) + : (FT_Int) phy_font->standard_advance; + +#if 0 + cur->ascii = ( flags & PFR_PHY_ASCII_CODE ) + ? PFR_NEXT_BYTE( p ) + : 0; +#else + if ( flags & PFR_PHY_ASCII_CODE ) + p += 1; +#endif + cur->gps_size = ( flags & PFR_PHY_2BYTE_GPS_SIZE ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + } + } + + /* that's it! */ + + Fail: + FT_FRAME_EXIT(); + + /* save position of bitmap info */ + phy_font->bct_offset = FT_STREAM_POS(); + phy_font->cursor = NULL; + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_phy_font_load: invalid physical font table\n" )); + goto Fail; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrload.h b/src/3rdparty/freetype/src/pfr/pfrload.h new file mode 100644 index 0000000000..ed010715d1 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrload.h @@ -0,0 +1,118 @@ +/***************************************************************************/ +/* */ +/* pfrload.h */ +/* */ +/* FreeType PFR loader (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRLOAD_H__ +#define __PFRLOAD_H__ + +#include "pfrobjs.h" +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + +#ifdef PFR_CONFIG_NO_CHECKS +#define PFR_CHECK( x ) do { } while ( 0 ) +#else +#define PFR_CHECK( x ) do \ + { \ + if ( p + (x) > limit ) \ + goto Too_Short; \ + } while ( 0 ) +#endif + +#define PFR_NEXT_BYTE( p ) FT_NEXT_BYTE( p ) +#define PFR_NEXT_INT8( p ) FT_NEXT_CHAR( p ) +#define PFR_NEXT_SHORT( p ) FT_NEXT_SHORT( p ) +#define PFR_NEXT_USHORT( p ) FT_NEXT_USHORT( p ) +#define PFR_NEXT_LONG( p ) FT_NEXT_OFF3( p ) +#define PFR_NEXT_ULONG( p ) FT_NEXT_UOFF3( p ) + + + /* handling extra items */ + + typedef FT_Error + (*PFR_ExtraItem_ParseFunc)( FT_Byte* p, + FT_Byte* limit, + FT_Pointer data ); + + typedef struct PFR_ExtraItemRec_ + { + FT_UInt type; + PFR_ExtraItem_ParseFunc parser; + + } PFR_ExtraItemRec; + + typedef const struct PFR_ExtraItemRec_* PFR_ExtraItem; + + + FT_LOCAL( FT_Error ) + pfr_extra_items_skip( FT_Byte* *pp, + FT_Byte* limit ); + + FT_LOCAL( FT_Error ) + pfr_extra_items_parse( FT_Byte* *pp, + FT_Byte* limit, + PFR_ExtraItem item_list, + FT_Pointer item_data ); + + + /* load a PFR header */ + FT_LOCAL( FT_Error ) + pfr_header_load( PFR_Header header, + FT_Stream stream ); + + /* check a PFR header */ + FT_LOCAL( FT_Bool ) + pfr_header_check( PFR_Header header ); + + + /* return number of logical fonts in this file */ + FT_LOCAL( FT_Error ) + pfr_log_font_count( FT_Stream stream, + FT_UInt32 log_section_offset, + FT_UInt *acount ); + + /* load a pfr logical font entry */ + FT_LOCAL( FT_Error ) + pfr_log_font_load( PFR_LogFont log_font, + FT_Stream stream, + FT_UInt face_index, + FT_UInt32 section_offset, + FT_Bool size_increment ); + + + /* load a physical font entry */ + FT_LOCAL( FT_Error ) + pfr_phy_font_load( PFR_PhyFont phy_font, + FT_Stream stream, + FT_UInt32 offset, + FT_UInt32 size ); + + /* finalize a physical font */ + FT_LOCAL( void ) + pfr_phy_font_done( PFR_PhyFont phy_font, + FT_Memory memory ); + + /* */ + +FT_END_HEADER + +#endif /* __PFRLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrobjs.c b/src/3rdparty/freetype/src/pfr/pfrobjs.c new file mode 100644 index 0000000000..56d617d880 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrobjs.c @@ -0,0 +1,581 @@ +/***************************************************************************/ +/* */ +/* pfrobjs.c */ +/* */ +/* FreeType PFR object methods (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrobjs.h" +#include "pfrload.h" +#include "pfrgload.h" +#include "pfrcmap.h" +#include "pfrsbit.h" +#include FT_OUTLINE_H +#include FT_INTERNAL_DEBUG_H + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE OBJECT METHODS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + pfr_face_done( FT_Face pfrface ) /* PFR_Face */ + { + PFR_Face face = (PFR_Face)pfrface; + FT_Memory memory; + + + if ( !face ) + return; + + memory = pfrface->driver->root.memory; + + /* we don't want dangling pointers */ + pfrface->family_name = NULL; + pfrface->style_name = NULL; + + /* finalize the physical font record */ + pfr_phy_font_done( &face->phy_font, FT_FACE_MEMORY( face ) ); + + /* no need to finalize the logical font or the header */ + FT_FREE( pfrface->available_sizes ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_face_init( FT_Stream stream, + FT_Face pfrface, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + PFR_Face face = (PFR_Face)pfrface; + FT_Error error; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + /* load the header and check it */ + error = pfr_header_load( &face->header, stream ); + if ( error ) + goto Exit; + + if ( !pfr_header_check( &face->header ) ) + { + FT_TRACE4(( "pfr_face_init: not a valid PFR font\n" )); + error = PFR_Err_Unknown_File_Format; + goto Exit; + } + + /* check face index */ + { + FT_UInt num_faces; + + + error = pfr_log_font_count( stream, + face->header.log_dir_offset, + &num_faces ); + if ( error ) + goto Exit; + + pfrface->num_faces = num_faces; + } + + if ( face_index < 0 ) + goto Exit; + + if ( face_index >= pfrface->num_faces ) + { + FT_ERROR(( "pfr_face_init: invalid face index\n" )); + error = PFR_Err_Invalid_Argument; + goto Exit; + } + + /* load the face */ + error = pfr_log_font_load( + &face->log_font, stream, face_index, + face->header.log_dir_offset, + FT_BOOL( face->header.phy_font_max_size_high != 0 ) ); + if ( error ) + goto Exit; + + /* now load the physical font descriptor */ + error = pfr_phy_font_load( &face->phy_font, stream, + face->log_font.phys_offset, + face->log_font.phys_size ); + if ( error ) + goto Exit; + + /* now set up all root face fields */ + { + PFR_PhyFont phy_font = &face->phy_font; + + + pfrface->face_index = face_index; + pfrface->num_glyphs = phy_font->num_chars + 1; + pfrface->face_flags = FT_FACE_FLAG_SCALABLE; + + /* if all characters point to the same gps_offset 0, we */ + /* assume that the font only contains bitmaps */ + { + FT_UInt nn; + + + for ( nn = 0; nn < phy_font->num_chars; nn++ ) + if ( phy_font->chars[nn].gps_offset != 0 ) + break; + + if ( nn == phy_font->num_chars ) + pfrface->face_flags = 0; /* not scalable */ + } + + if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 ) + pfrface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( phy_font->flags & PFR_PHY_VERTICAL ) + pfrface->face_flags |= FT_FACE_FLAG_VERTICAL; + else + pfrface->face_flags |= FT_FACE_FLAG_HORIZONTAL; + + if ( phy_font->num_strikes > 0 ) + pfrface->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + + if ( phy_font->num_kern_pairs > 0 ) + pfrface->face_flags |= FT_FACE_FLAG_KERNING; + + /* If no family name was found in the "undocumented" auxiliary + * data, use the font ID instead. This sucks but is better than + * nothing. + */ + pfrface->family_name = phy_font->family_name; + if ( pfrface->family_name == NULL ) + pfrface->family_name = phy_font->font_id; + + /* note that the style name can be NULL in certain PFR fonts, + * probably meaning "Regular" + */ + pfrface->style_name = phy_font->style_name; + + pfrface->num_fixed_sizes = 0; + pfrface->available_sizes = 0; + + pfrface->bbox = phy_font->bbox; + pfrface->units_per_EM = (FT_UShort)phy_font->outline_resolution; + pfrface->ascender = (FT_Short) phy_font->bbox.yMax; + pfrface->descender = (FT_Short) phy_font->bbox.yMin; + + pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 ); + if ( pfrface->height < pfrface->ascender - pfrface->descender ) + pfrface->height = (FT_Short)(pfrface->ascender - pfrface->descender); + + if ( phy_font->num_strikes > 0 ) + { + FT_UInt n, count = phy_font->num_strikes; + FT_Bitmap_Size* size; + PFR_Strike strike; + FT_Memory memory = pfrface->stream->memory; + + + if ( FT_NEW_ARRAY( pfrface->available_sizes, count ) ) + goto Exit; + + size = pfrface->available_sizes; + strike = phy_font->strikes; + for ( n = 0; n < count; n++, size++, strike++ ) + { + size->height = (FT_UShort)strike->y_ppm; + size->width = (FT_UShort)strike->x_ppm; + size->size = strike->y_ppm << 6; + size->x_ppem = strike->x_ppm << 6; + size->y_ppem = strike->y_ppm << 6; + } + pfrface->num_fixed_sizes = count; + } + + /* now compute maximum advance width */ + if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 ) + pfrface->max_advance_width = (FT_Short)phy_font->standard_advance; + else + { + FT_Int max = 0; + FT_UInt count = phy_font->num_chars; + PFR_Char gchar = phy_font->chars; + + + for ( ; count > 0; count--, gchar++ ) + { + if ( max < gchar->advance ) + max = gchar->advance; + } + + pfrface->max_advance_width = (FT_Short)max; + } + + pfrface->max_advance_height = pfrface->height; + + pfrface->underline_position = (FT_Short)( -pfrface->units_per_EM / 10 ); + pfrface->underline_thickness = (FT_Short)( pfrface->units_per_EM / 30 ); + + /* create charmap */ + { + FT_CharMapRec charmap; + + + charmap.face = pfrface; + charmap.platform_id = 3; + charmap.encoding_id = 1; + charmap.encoding = FT_ENCODING_UNICODE; + + FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if ( pfrface->num_charmaps ) + pfrface->charmap = pfrface->charmaps[0]; +#endif + } + + /* check whether we've loaded any kerning pairs */ + if ( phy_font->num_kern_pairs ) + pfrface->face_flags |= FT_FACE_FLAG_KERNING; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SLOT OBJECT METHOD *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + pfr_slot_init( FT_GlyphSlot pfrslot ) /* PFR_Slot */ + { + PFR_Slot slot = (PFR_Slot)pfrslot; + FT_GlyphLoader loader = pfrslot->internal->loader; + + + pfr_glyph_init( &slot->glyph, loader ); + + return 0; + } + + + FT_LOCAL_DEF( void ) + pfr_slot_done( FT_GlyphSlot pfrslot ) /* PFR_Slot */ + { + PFR_Slot slot = (PFR_Slot)pfrslot; + + + pfr_glyph_done( &slot->glyph ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_slot_load( FT_GlyphSlot pfrslot, /* PFR_Slot */ + FT_Size pfrsize, /* PFR_Size */ + FT_UInt gindex, + FT_Int32 load_flags ) + { + PFR_Slot slot = (PFR_Slot)pfrslot; + PFR_Size size = (PFR_Size)pfrsize; + FT_Error error; + PFR_Face face = (PFR_Face)pfrslot->face; + PFR_Char gchar; + FT_Outline* outline = &pfrslot->outline; + FT_ULong gps_offset; + + + if ( gindex > 0 ) + gindex--; + + if ( !face || gindex >= face->phy_font.num_chars ) + { + error = PFR_Err_Invalid_Argument; + goto Exit; + } + + /* try to load an embedded bitmap */ + if ( ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) == 0 ) + { + error = pfr_slot_load_bitmap( slot, size, gindex ); + if ( error == 0 ) + goto Exit; + } + + if ( load_flags & FT_LOAD_SBITS_ONLY ) + { + error = PFR_Err_Invalid_Argument; + goto Exit; + } + + gchar = face->phy_font.chars + gindex; + pfrslot->format = FT_GLYPH_FORMAT_OUTLINE; + outline->n_points = 0; + outline->n_contours = 0; + gps_offset = face->header.gps_section_offset; + + /* load the glyph outline (FT_LOAD_NO_RECURSE isn't supported) */ + error = pfr_glyph_load( &slot->glyph, face->root.stream, + gps_offset, gchar->gps_offset, gchar->gps_size ); + + if ( !error ) + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &pfrslot->metrics; + FT_Pos advance; + FT_Int em_metrics, em_outline; + FT_Bool scaling; + + + scaling = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ); + + /* copy outline data */ + *outline = slot->glyph.loader->base.outline; + + outline->flags &= ~FT_OUTLINE_OWNER; + outline->flags |= FT_OUTLINE_REVERSE_FILL; + + if ( size && pfrsize->metrics.y_ppem < 24 ) + outline->flags |= FT_OUTLINE_HIGH_PRECISION; + + /* compute the advance vector */ + metrics->horiAdvance = 0; + metrics->vertAdvance = 0; + + advance = gchar->advance; + em_metrics = face->phy_font.metrics_resolution; + em_outline = face->phy_font.outline_resolution; + + if ( em_metrics != em_outline ) + advance = FT_MulDiv( advance, em_outline, em_metrics ); + + if ( face->phy_font.flags & PFR_PHY_VERTICAL ) + metrics->vertAdvance = advance; + else + metrics->horiAdvance = advance; + + pfrslot->linearHoriAdvance = metrics->horiAdvance; + pfrslot->linearVertAdvance = metrics->vertAdvance; + + /* make-up vertical metrics(?) */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + +#if 0 /* some fonts seem to be broken here! */ + + /* Apply the font matrix, if any. */ + /* TODO: Test existing fonts with unusual matrix */ + /* whether we have to adjust Units per EM. */ + { + FT_Matrix font_matrix; + + + font_matrix.xx = face->log_font.matrix[0] << 8; + font_matrix.yx = face->log_font.matrix[1] << 8; + font_matrix.xy = face->log_font.matrix[2] << 8; + font_matrix.yy = face->log_font.matrix[3] << 8; + + FT_Outline_Transform( outline, &font_matrix ); + } +#endif + + /* scale when needed */ + if ( scaling ) + { + FT_Int n; + FT_Fixed x_scale = pfrsize->metrics.x_scale; + FT_Fixed y_scale = pfrsize->metrics.y_scale; + FT_Vector* vec = outline->points; + + + /* scale outline points */ + for ( n = 0; n < outline->n_points; n++, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* scale the advance */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the rest of the metrics */ + FT_Outline_Get_CBox( outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax - metrics->height; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** KERNING METHOD *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + pfr_face_get_kerning( FT_Face pfrface, /* PFR_Face */ + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + PFR_Face face = (PFR_Face)pfrface; + FT_Error error = PFR_Err_Ok; + PFR_PhyFont phy_font = &face->phy_font; + FT_UInt32 code1, code2, pair; + + + kerning->x = 0; + kerning->y = 0; + + if ( glyph1 > 0 ) + glyph1--; + + if ( glyph2 > 0 ) + glyph2--; + + /* convert glyph indices to character codes */ + if ( glyph1 > phy_font->num_chars || + glyph2 > phy_font->num_chars ) + goto Exit; + + code1 = phy_font->chars[glyph1].char_code; + code2 = phy_font->chars[glyph2].char_code; + pair = PFR_KERN_INDEX( code1, code2 ); + + /* now search the list of kerning items */ + { + PFR_KernItem item = phy_font->kern_items; + FT_Stream stream = pfrface->stream; + + + for ( ; item; item = item->next ) + { + if ( pair >= item->pair1 && pair <= item->pair2 ) + goto FoundPair; + } + goto Exit; + + FoundPair: /* we found an item, now parse it and find the value if any */ + if ( FT_STREAM_SEEK( item->offset ) || + FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) + goto Exit; + + { + FT_UInt count = item->pair_count; + FT_UInt size = item->pair_size; + FT_UInt power = (FT_UInt)ft_highpow2( (FT_UInt32)count ); + FT_UInt probe = power * size; + FT_UInt extra = count - power; + FT_Byte* base = stream->cursor; + FT_Bool twobytes = FT_BOOL( item->flags & 1 ); + FT_Bool twobyte_adj = FT_BOOL( item->flags & 2 ); + FT_Byte* p; + FT_UInt32 cpair; + + + if ( extra > 0 ) + { + p = base + extra * size; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + goto Found; + + if ( cpair < pair ) + { + if ( twobyte_adj ) + p += 2; + else + p++; + base = p; + } + } + + while ( probe > size ) + { + probe >>= 1; + p = base + probe; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + goto Found; + + if ( cpair < pair ) + base += probe; + } + + p = base; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + { + FT_Int value; + + + Found: + if ( twobyte_adj ) + value = FT_PEEK_SHORT( p ); + else + value = p[0]; + + kerning->x = item->base_adj + value; + } + } + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrobjs.h b/src/3rdparty/freetype/src/pfr/pfrobjs.h new file mode 100644 index 0000000000..f6aa8b44cc --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrobjs.h @@ -0,0 +1,96 @@ +/***************************************************************************/ +/* */ +/* pfrobjs.h */ +/* */ +/* FreeType PFR object methods (specification). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFROBJS_H__ +#define __PFROBJS_H__ + +#include "pfrtypes.h" + + +FT_BEGIN_HEADER + + typedef struct PFR_FaceRec_* PFR_Face; + + typedef struct PFR_SizeRec_* PFR_Size; + + typedef struct PFR_SlotRec_* PFR_Slot; + + + typedef struct PFR_FaceRec_ + { + FT_FaceRec root; + PFR_HeaderRec header; + PFR_LogFontRec log_font; + PFR_PhyFontRec phy_font; + + } PFR_FaceRec; + + + typedef struct PFR_SizeRec_ + { + FT_SizeRec root; + + } PFR_SizeRec; + + + typedef struct PFR_SlotRec_ + { + FT_GlyphSlotRec root; + PFR_GlyphRec glyph; + + } PFR_SlotRec; + + + FT_LOCAL( FT_Error ) + pfr_face_init( FT_Stream stream, + FT_Face face, /* PFR_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + pfr_face_done( FT_Face face ); /* PFR_Face */ + + + FT_LOCAL( FT_Error ) + pfr_face_get_kerning( FT_Face face, /* PFR_Face */ + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + + FT_LOCAL( FT_Error ) + pfr_slot_init( FT_GlyphSlot slot ); /* PFR_Slot */ + + FT_LOCAL( void ) + pfr_slot_done( FT_GlyphSlot slot ); /* PFR_Slot */ + + + FT_LOCAL( FT_Error ) + pfr_slot_load( FT_GlyphSlot slot, /* PFR_Slot */ + FT_Size size, /* PFR_Size */ + FT_UInt gindex, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __PFROBJS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrsbit.c b/src/3rdparty/freetype/src/pfr/pfrsbit.c new file mode 100644 index 0000000000..45ff6663b3 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrsbit.c @@ -0,0 +1,680 @@ +/***************************************************************************/ +/* */ +/* pfrsbit.c */ +/* */ +/* FreeType PFR bitmap loader (body). */ +/* */ +/* Copyright 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrsbit.h" +#include "pfrload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR BIT WRITER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PFR_BitWriter_ + { + FT_Byte* line; /* current line start */ + FT_Int pitch; /* line size in bytes */ + FT_Int width; /* width in pixels/bits */ + FT_Int rows; /* number of remaining rows to scan */ + FT_Int total; /* total number of bits to draw */ + + } PFR_BitWriterRec, *PFR_BitWriter; + + + static void + pfr_bitwriter_init( PFR_BitWriter writer, + FT_Bitmap* target, + FT_Bool decreasing ) + { + writer->line = target->buffer; + writer->pitch = target->pitch; + writer->width = target->width; + writer->rows = target->rows; + writer->total = writer->width * writer->rows; + + if ( !decreasing ) + { + writer->line += writer->pitch * ( target->rows-1 ); + writer->pitch = -writer->pitch; + } + } + + + static void + pfr_bitwriter_decode_bytes( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Int n, reload; + FT_Int left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt val = 0; + FT_UInt c = 0; + + + n = (FT_Int)( limit - p ) * 8; + if ( n > writer->total ) + n = writer->total; + + reload = n & 7; + + for ( ; n > 0; n-- ) + { + if ( ( n & 7 ) == reload ) + val = *p++; + + if ( val & 0x80 ) + c |= mask; + + val <<= 1; + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte)c; + left = writer->width; + mask = 0x80; + + writer->line += writer->pitch; + cur = writer->line; + c = 0; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + mask = 0x80; + c = 0; + cur ++; + } + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte)c; + } + + + static void + pfr_bitwriter_decode_rle1( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Int n, phase, count, counts[2], reload; + FT_Int left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt c = 0; + + + n = writer->total; + + phase = 1; + counts[0] = 0; + counts[1] = 0; + count = 0; + reload = 1; + + for ( ; n > 0; n-- ) + { + if ( reload ) + { + do + { + if ( phase ) + { + FT_Int v; + + + if ( p >= limit ) + break; + + v = *p++; + counts[0] = v >> 4; + counts[1] = v & 15; + phase = 0; + count = counts[0]; + } + else + { + phase = 1; + count = counts[1]; + } + + } while ( count == 0 ); + } + + if ( phase ) + c |= mask; + + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte) c; + left = writer->width; + mask = 0x80; + + writer->line += writer->pitch; + cur = writer->line; + c = 0; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + mask = 0x80; + c = 0; + cur ++; + } + + reload = ( --count <= 0 ); + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte) c; + } + + + static void + pfr_bitwriter_decode_rle2( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Int n, phase, count, reload; + FT_Int left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt c = 0; + + + n = writer->total; + + phase = 1; + count = 0; + reload = 1; + + for ( ; n > 0; n-- ) + { + if ( reload ) + { + do + { + if ( p >= limit ) + break; + + count = *p++; + phase = phase ^ 1; + + } while ( count == 0 ); + } + + if ( phase ) + c |= mask; + + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte) c; + c = 0; + mask = 0x80; + left = writer->width; + + writer->line += writer->pitch; + cur = writer->line; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + c = 0; + mask = 0x80; + cur ++; + } + + reload = ( --count <= 0 ); + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte) c; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BITMAP DATA DECODING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + pfr_lookup_bitmap_data( FT_Byte* base, + FT_Byte* limit, + FT_UInt count, + FT_UInt flags, + FT_UInt char_code, + FT_ULong* found_offset, + FT_ULong* found_size ) + { + FT_UInt left, right, char_len; + FT_Bool two = FT_BOOL( flags & 1 ); + FT_Byte* buff; + + + char_len = 4; + if ( two ) char_len += 1; + if ( flags & 2 ) char_len += 1; + if ( flags & 4 ) char_len += 1; + + left = 0; + right = count; + + while ( left < right ) + { + FT_UInt middle, code; + + + middle = ( left + right ) >> 1; + buff = base + middle * char_len; + + /* check that we are not outside of the table -- */ + /* this is possible with broken fonts... */ + if ( buff + char_len > limit ) + goto Fail; + + if ( two ) + code = PFR_NEXT_USHORT( buff ); + else + code = PFR_NEXT_BYTE( buff ); + + if ( code == char_code ) + goto Found_It; + + if ( code < char_code ) + left = middle; + else + right = middle; + } + + Fail: + /* Not found */ + *found_size = 0; + *found_offset = 0; + return; + + Found_It: + if ( flags & 2 ) + *found_size = PFR_NEXT_USHORT( buff ); + else + *found_size = PFR_NEXT_BYTE( buff ); + + if ( flags & 4 ) + *found_offset = PFR_NEXT_ULONG( buff ); + else + *found_offset = PFR_NEXT_USHORT( buff ); + } + + + /* load bitmap metrics. "*padvance" must be set to the default value */ + /* before calling this function... */ + /* */ + static FT_Error + pfr_load_bitmap_metrics( FT_Byte** pdata, + FT_Byte* limit, + FT_Long scaled_advance, + FT_Long *axpos, + FT_Long *aypos, + FT_UInt *axsize, + FT_UInt *aysize, + FT_Long *aadvance, + FT_UInt *aformat ) + { + FT_Error error = 0; + FT_Byte flags; + FT_Char b; + FT_Byte* p = *pdata; + FT_Long xpos, ypos, advance; + FT_UInt xsize, ysize; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + xpos = 0; + ypos = 0; + xsize = 0; + ysize = 0; + advance = 0; + + switch ( flags & 3 ) + { + case 0: + PFR_CHECK( 1 ); + b = PFR_NEXT_INT8( p ); + xpos = b >> 4; + ypos = ( (FT_Char)( b << 4 ) ) >> 4; + break; + + case 1: + PFR_CHECK( 2 ); + xpos = PFR_NEXT_INT8( p ); + ypos = PFR_NEXT_INT8( p ); + break; + + case 2: + PFR_CHECK( 4 ); + xpos = PFR_NEXT_SHORT( p ); + ypos = PFR_NEXT_SHORT( p ); + break; + + case 3: + PFR_CHECK( 6 ); + xpos = PFR_NEXT_LONG( p ); + ypos = PFR_NEXT_LONG( p ); + break; + + default: + ; + } + + flags >>= 2; + switch ( flags & 3 ) + { + case 0: + /* blank image */ + xsize = 0; + ysize = 0; + break; + + case 1: + PFR_CHECK( 1 ); + b = PFR_NEXT_BYTE( p ); + xsize = ( b >> 4 ) & 0xF; + ysize = b & 0xF; + break; + + case 2: + PFR_CHECK( 2 ); + xsize = PFR_NEXT_BYTE( p ); + ysize = PFR_NEXT_BYTE( p ); + break; + + case 3: + PFR_CHECK( 4 ); + xsize = PFR_NEXT_USHORT( p ); + ysize = PFR_NEXT_USHORT( p ); + break; + + default: + ; + } + + flags >>= 2; + switch ( flags & 3 ) + { + case 0: + advance = scaled_advance; + break; + + case 1: + PFR_CHECK( 1 ); + advance = PFR_NEXT_INT8( p ) << 8; + break; + + case 2: + PFR_CHECK( 2 ); + advance = PFR_NEXT_SHORT( p ); + break; + + case 3: + PFR_CHECK( 3 ); + advance = PFR_NEXT_LONG( p ); + break; + + default: + ; + } + + *axpos = xpos; + *aypos = ypos; + *axsize = xsize; + *aysize = ysize; + *aadvance = advance; + *aformat = flags >> 2; + *pdata = p; + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_load_bitmap_metrics: invalid glyph data\n" )); + goto Exit; + } + + + static FT_Error + pfr_load_bitmap_bits( FT_Byte* p, + FT_Byte* limit, + FT_UInt format, + FT_Bool decreasing, + FT_Bitmap* target ) + { + FT_Error error = 0; + PFR_BitWriterRec writer; + + + if ( target->rows > 0 && target->width > 0 ) + { + pfr_bitwriter_init( &writer, target, decreasing ); + + switch ( format ) + { + case 0: /* packed bits */ + pfr_bitwriter_decode_bytes( &writer, p, limit ); + break; + + case 1: /* RLE1 */ + pfr_bitwriter_decode_rle1( &writer, p, limit ); + break; + + case 2: /* RLE2 */ + pfr_bitwriter_decode_rle2( &writer, p, limit ); + break; + + default: + FT_ERROR(( "pfr_read_bitmap_data: invalid image type\n" )); + error = PFR_Err_Invalid_File_Format; + } + } + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BITMAP LOADING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( FT_Error ) + pfr_slot_load_bitmap( PFR_Slot glyph, + PFR_Size size, + FT_UInt glyph_index ) + { + FT_Error error; + PFR_Face face = (PFR_Face) glyph->root.face; + FT_Stream stream = face->root.stream; + PFR_PhyFont phys = &face->phy_font; + FT_ULong gps_offset; + FT_ULong gps_size; + PFR_Char character; + PFR_Strike strike; + + + character = &phys->chars[glyph_index]; + + /* Look-up a bitmap strike corresponding to the current */ + /* character dimensions */ + { + FT_UInt n; + + + strike = phys->strikes; + for ( n = 0; n < phys->num_strikes; n++ ) + { + if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem && + strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem ) + { + goto Found_Strike; + } + + strike++; + } + + /* couldn't find it */ + return PFR_Err_Invalid_Argument; + } + + Found_Strike: + + /* Now lookup the glyph's position within the file */ + { + FT_UInt char_len; + + + char_len = 4; + if ( strike->flags & 1 ) char_len += 1; + if ( strike->flags & 2 ) char_len += 1; + if ( strike->flags & 4 ) char_len += 1; + + /* Access data directly in the frame to speed lookups */ + if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) || + FT_FRAME_ENTER( char_len * strike->num_bitmaps ) ) + goto Exit; + + pfr_lookup_bitmap_data( stream->cursor, + stream->limit, + strike->num_bitmaps, + strike->flags, + character->char_code, + &gps_offset, + &gps_size ); + + FT_FRAME_EXIT(); + + if ( gps_size == 0 ) + { + /* Could not find a bitmap program string for this glyph */ + error = PFR_Err_Invalid_Argument; + goto Exit; + } + } + + /* get the bitmap metrics */ + { + FT_Long xpos, ypos, advance; + FT_UInt xsize, ysize, format; + FT_Byte* p; + + + /* compute linear advance */ + advance = character->advance; + if ( phys->metrics_resolution != phys->outline_resolution ) + advance = FT_MulDiv( advance, + phys->outline_resolution, + phys->metrics_resolution ); + + glyph->root.linearHoriAdvance = advance; + + /* compute default advance, i.e., scaled advance. This can be */ + /* overridden in the bitmap header of certain glyphs. */ + advance = FT_MulDiv( (FT_Fixed)size->root.metrics.x_ppem << 8, + character->advance, + phys->metrics_resolution ); + + if ( FT_STREAM_SEEK( face->header.gps_section_offset + gps_offset ) || + FT_FRAME_ENTER( gps_size ) ) + goto Exit; + + p = stream->cursor; + error = pfr_load_bitmap_metrics( &p, stream->limit, + advance, + &xpos, &ypos, + &xsize, &ysize, + &advance, &format ); + if ( !error ) + { + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + /* Set up glyph bitmap and metrics */ + glyph->root.bitmap.width = (FT_Int)xsize; + glyph->root.bitmap.rows = (FT_Int)ysize; + glyph->root.bitmap.pitch = (FT_Long)( xsize + 7 ) >> 3; + glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO; + + glyph->root.metrics.width = (FT_Long)xsize << 6; + glyph->root.metrics.height = (FT_Long)ysize << 6; + glyph->root.metrics.horiBearingX = xpos << 6; + glyph->root.metrics.horiBearingY = ypos << 6; + glyph->root.metrics.horiAdvance = FT_PIX_ROUND( ( advance >> 2 ) ); + glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1; + glyph->root.metrics.vertBearingY = 0; + glyph->root.metrics.vertAdvance = size->root.metrics.height; + + glyph->root.bitmap_left = xpos; + glyph->root.bitmap_top = ypos + ysize; + + /* Allocate and read bitmap data */ + { + FT_ULong len = glyph->root.bitmap.pitch * ysize; + + + error = ft_glyphslot_alloc_bitmap( &glyph->root, len ); + if ( !error ) + { + error = pfr_load_bitmap_bits( + p, + stream->limit, + format, + FT_BOOL(face->header.color_flags & 2), + &glyph->root.bitmap ); + } + } + } + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrsbit.h b/src/3rdparty/freetype/src/pfr/pfrsbit.h new file mode 100644 index 0000000000..015e9e6dad --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrsbit.h @@ -0,0 +1,36 @@ +/***************************************************************************/ +/* */ +/* pfrsbit.h */ +/* */ +/* FreeType PFR bitmap loader (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRSBIT_H__ +#define __PFRSBIT_H__ + +#include "pfrobjs.h" + +FT_BEGIN_HEADER + + FT_LOCAL( FT_Error ) + pfr_slot_load_bitmap( PFR_Slot glyph, + PFR_Size size, + FT_UInt glyph_index ); + +FT_END_HEADER + +#endif /* __PFR_SBIT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/pfrtypes.h b/src/3rdparty/freetype/src/pfr/pfrtypes.h new file mode 100644 index 0000000000..c0ae04253a --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/pfrtypes.h @@ -0,0 +1,362 @@ +/***************************************************************************/ +/* */ +/* pfrtypes.h */ +/* */ +/* FreeType PFR data structures (specification only). */ +/* */ +/* Copyright 2002, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRTYPES_H__ +#define __PFRTYPES_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + +FT_BEGIN_HEADER + + /************************************************************************/ + + /* the PFR Header structure */ + typedef struct PFR_HeaderRec_ + { + FT_UInt32 signature; + FT_UInt version; + FT_UInt signature2; + FT_UInt header_size; + + FT_UInt log_dir_size; + FT_UInt log_dir_offset; + + FT_UInt log_font_max_size; + FT_UInt32 log_font_section_size; + FT_UInt32 log_font_section_offset; + + FT_UInt32 phy_font_max_size; + FT_UInt32 phy_font_section_size; + FT_UInt32 phy_font_section_offset; + + FT_UInt gps_max_size; + FT_UInt32 gps_section_size; + FT_UInt32 gps_section_offset; + + FT_UInt max_blue_values; + FT_UInt max_x_orus; + FT_UInt max_y_orus; + + FT_UInt phy_font_max_size_high; + FT_UInt color_flags; + + FT_UInt32 bct_max_size; + FT_UInt32 bct_set_max_size; + FT_UInt32 phy_bct_set_max_size; + + FT_UInt num_phy_fonts; + FT_UInt max_vert_stem_snap; + FT_UInt max_horz_stem_snap; + FT_UInt max_chars; + + } PFR_HeaderRec, *PFR_Header; + + + /* used in `color_flags' field of the PFR_Header */ + typedef enum PFR_HeaderFlags_ + { + PFR_FLAG_BLACK_PIXEL = 1, + PFR_FLAG_INVERT_BITMAP = 2 + + } PFR_HeaderFlags; + + + /************************************************************************/ + + typedef struct PFR_LogFontRec_ + { + FT_UInt32 size; + FT_UInt32 offset; + + FT_Int32 matrix[4]; + FT_UInt stroke_flags; + FT_Int stroke_thickness; + FT_Int bold_thickness; + FT_Int32 miter_limit; + + FT_UInt32 phys_size; + FT_UInt32 phys_offset; + + } PFR_LogFontRec, *PFR_LogFont; + + + typedef enum PFR_LogFlags_ + { + PFR_LOG_EXTRA_ITEMS = 0x40, + PFR_LOG_2BYTE_BOLD = 0x20, + PFR_LOG_BOLD = 0x10, + PFR_LOG_2BYTE_STROKE = 8, + PFR_LOG_STROKE = 4, + PFR_LINE_JOIN_MASK = 3 + + } PFR_LogFlags; + + + typedef enum PFR_LineJoinFlags_ + { + PFR_LINE_JOIN_MITER = 0, + PFR_LINE_JOIN_ROUND = 1, + PFR_LINE_JOIN_BEVEL = 2 + + } PFR_LineJoinFlags; + + + /************************************************************************/ + + typedef enum PFR_BitmapFlags_ + { + PFR_BITMAP_3BYTE_OFFSET = 4, + PFR_BITMAP_2BYTE_SIZE = 2, + PFR_BITMAP_2BYTE_CHARCODE = 1 + + } PFR_BitmapFlags; + + + typedef struct PFR_BitmapCharRec_ + { + FT_UInt char_code; + FT_UInt gps_size; + FT_UInt32 gps_offset; + + } PFR_BitmapCharRec, *PFR_BitmapChar; + + + typedef enum PFR_StrikeFlags_ + { + PFR_STRIKE_2BYTE_COUNT = 0x10, + PFR_STRIKE_3BYTE_OFFSET = 0x08, + PFR_STRIKE_3BYTE_SIZE = 0x04, + PFR_STRIKE_2BYTE_YPPM = 0x02, + PFR_STRIKE_2BYTE_XPPM = 0x01 + + } PFR_StrikeFlags; + + + typedef struct PFR_StrikeRec_ + { + FT_UInt x_ppm; + FT_UInt y_ppm; + FT_UInt flags; + + FT_UInt32 gps_size; + FT_UInt32 gps_offset; + + FT_UInt32 bct_size; + FT_UInt32 bct_offset; + + /* optional */ + FT_UInt num_bitmaps; + PFR_BitmapChar bitmaps; + + } PFR_StrikeRec, *PFR_Strike; + + + /************************************************************************/ + + typedef struct PFR_CharRec_ + { + FT_UInt char_code; + FT_Int advance; + FT_UInt gps_size; + FT_UInt32 gps_offset; + + } PFR_CharRec, *PFR_Char; + + + /************************************************************************/ + + typedef struct PFR_DimensionRec_ + { + FT_UInt standard; + FT_UInt num_stem_snaps; + FT_Int* stem_snaps; + + } PFR_DimensionRec, *PFR_Dimension; + + /************************************************************************/ + + typedef struct PFR_KernItemRec_* PFR_KernItem; + + typedef struct PFR_KernItemRec_ + { + PFR_KernItem next; + FT_Byte pair_count; + FT_Byte flags; + FT_Short base_adj; + FT_UInt pair_size; + FT_UInt32 offset; + FT_UInt32 pair1; + FT_UInt32 pair2; + + } PFR_KernItemRec; + + +#define PFR_KERN_INDEX( g1, g2 ) \ + ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) ) + +#define PFR_KERN_PAIR_INDEX( pair ) \ + PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 ) + +#define PFR_NEXT_KPAIR( p ) ( p += 2, \ + ( (FT_UInt32)p[-2] << 16 ) | p[-1] ) + + + /************************************************************************/ + + typedef struct PFR_PhyFontRec_ + { + FT_Memory memory; + FT_UInt32 offset; + + FT_UInt font_ref_number; + FT_UInt outline_resolution; + FT_UInt metrics_resolution; + FT_BBox bbox; + FT_UInt flags; + FT_UInt standard_advance; + + FT_Int ascent; /* optional, bbox.yMax if not present */ + FT_Int descent; /* optional, bbox.yMin if not present */ + FT_Int leading; /* optional, 0 if not present */ + + PFR_DimensionRec horizontal; + PFR_DimensionRec vertical; + + FT_String* font_id; + FT_String* family_name; + FT_String* style_name; + + FT_UInt num_strikes; + FT_UInt max_strikes; + PFR_StrikeRec* strikes; + + FT_UInt num_blue_values; + FT_Int *blue_values; + FT_UInt blue_fuzz; + FT_UInt blue_scale; + + FT_UInt num_chars; + FT_UInt32 chars_offset; + PFR_Char chars; + + FT_UInt num_kern_pairs; + PFR_KernItem kern_items; + PFR_KernItem* kern_items_tail; + + /* not part of the spec, but used during load */ + FT_UInt32 bct_offset; + FT_Byte* cursor; + + } PFR_PhyFontRec, *PFR_PhyFont; + + + typedef enum PFR_PhyFlags_ + { + PFR_PHY_EXTRA_ITEMS = 0x80, + PFR_PHY_3BYTE_GPS_OFFSET = 0x20, + PFR_PHY_2BYTE_GPS_SIZE = 0x10, + PFR_PHY_ASCII_CODE = 0x08, + PFR_PHY_PROPORTIONAL = 0x04, + PFR_PHY_2BYTE_CHARCODE = 0x02, + PFR_PHY_VERTICAL = 0x01 + + } PFR_PhyFlags; + + + typedef enum PFR_KernFlags_ + { + PFR_KERN_2BYTE_CHAR = 0x01, + PFR_KERN_2BYTE_ADJ = 0x02 + + } PFR_KernFlags; + + + /************************************************************************/ + + typedef enum PFR_GlyphFlags_ + { + PFR_GLYPH_IS_COMPOUND = 0x80, + PFR_GLYPH_EXTRA_ITEMS = 0x08, + PFR_GLYPH_1BYTE_XYCOUNT = 0x04, + PFR_GLYPH_XCOUNT = 0x02, + PFR_GLYPH_YCOUNT = 0x01 + + } PFR_GlyphFlags; + + + /* controlled coordinate */ + typedef struct PFR_CoordRec_ + { + FT_UInt org; + FT_UInt cur; + + } PFR_CoordRec, *PFR_Coord; + + + typedef struct PFR_SubGlyphRec_ + { + FT_Fixed x_scale; + FT_Fixed y_scale; + FT_Int x_delta; + FT_Int y_delta; + FT_UInt32 gps_offset; + FT_UInt gps_size; + + } PFR_SubGlyphRec, *PFR_SubGlyph; + + + typedef enum PFR_SubgGlyphFlags_ + { + PFR_SUBGLYPH_3BYTE_OFFSET = 0x80, + PFR_SUBGLYPH_2BYTE_SIZE = 0x40, + PFR_SUBGLYPH_YSCALE = 0x20, + PFR_SUBGLYPH_XSCALE = 0x10 + + } PFR_SubGlyphFlags; + + + typedef struct PFR_GlyphRec_ + { + FT_Byte format; + +#if 0 + FT_UInt num_x_control; + FT_UInt num_y_control; +#endif + FT_UInt max_xy_control; + FT_Pos* x_control; + FT_Pos* y_control; + + + FT_UInt num_subs; + FT_UInt max_subs; + PFR_SubGlyphRec* subs; + + FT_GlyphLoader loader; + FT_Bool path_begun; + + } PFR_GlyphRec, *PFR_Glyph; + + +FT_END_HEADER + +#endif /* __PFRTYPES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pfr/rules.mk b/src/3rdparty/freetype/src/pfr/rules.mk new file mode 100644 index 0000000000..60b96c7415 --- /dev/null +++ b/src/3rdparty/freetype/src/pfr/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 PFR driver configuration rules +# + + +# Copyright 2002, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# pfr driver directory +# +PFR_DIR := $(SRC_DIR)/pfr + + +# compilation flags for the driver +# +PFR_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PFR_DIR)) + + +# pfr driver sources (i.e., C files) +# +PFR_DRV_SRC := $(PFR_DIR)/pfrload.c \ + $(PFR_DIR)/pfrgload.c \ + $(PFR_DIR)/pfrcmap.c \ + $(PFR_DIR)/pfrdrivr.c \ + $(PFR_DIR)/pfrsbit.c \ + $(PFR_DIR)/pfrobjs.c + +# pfr driver headers +# +PFR_DRV_H := $(PFR_DRV_SRC:%.c=%.h) \ + $(PFR_DIR)/pfrerror.h \ + $(PFR_DIR)/pfrtypes.h + + +# Pfr driver object(s) +# +# PFR_DRV_OBJ_M is used during `multi' builds +# PFR_DRV_OBJ_S is used during `single' builds +# +PFR_DRV_OBJ_M := $(PFR_DRV_SRC:$(PFR_DIR)/%.c=$(OBJ_DIR)/%.$O) +PFR_DRV_OBJ_S := $(OBJ_DIR)/pfr.$O + +# pfr driver source file for single build +# +PFR_DRV_SRC_S := $(PFR_DIR)/pfr.c + + +# pfr driver - single object +# +$(PFR_DRV_OBJ_S): $(PFR_DRV_SRC_S) $(PFR_DRV_SRC) $(FREETYPE_H) $(PFR_DRV_H) + $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PFR_DRV_SRC_S)) + + +# pfr driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PFR_DIR)/%.c $(FREETYPE_H) $(PFR_DRV_H) + $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PFR_DRV_OBJ_S) +DRV_OBJS_M += $(PFR_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/psaux/Jamfile b/src/3rdparty/freetype/src/psaux/Jamfile new file mode 100644 index 0000000000..faeded9044 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/Jamfile @@ -0,0 +1,31 @@ +# FreeType 2 src/psaux Jamfile +# +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) psaux ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = psauxmod psobjs t1decode t1cmap + psconv afmparse + ; + } + else + { + _sources = psaux ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/psaux Jamfile diff --git a/src/3rdparty/freetype/src/psaux/afmparse.c b/src/3rdparty/freetype/src/psaux/afmparse.c new file mode 100644 index 0000000000..63a786e888 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/afmparse.c @@ -0,0 +1,965 @@ +/***************************************************************************/ +/* */ +/* afmparse.c */ +/* */ +/* AFM parser (body). */ +/* */ +/* Copyright 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_H + +#include "afmparse.h" +#include "psconv.h" + +#include "psauxerr.h" + + +/***************************************************************************/ +/* */ +/* AFM_Stream */ +/* */ +/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. */ +/* */ +/* */ + + enum + { + AFM_STREAM_STATUS_NORMAL, + AFM_STREAM_STATUS_EOC, + AFM_STREAM_STATUS_EOL, + AFM_STREAM_STATUS_EOF + }; + + + typedef struct AFM_StreamRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + FT_Int status; + + } AFM_StreamRec; + + +#ifndef EOF +#define EOF -1 +#endif + + + /* this works because empty lines are ignored */ +#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' ) + +#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' ) +#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' ) + + /* column separator; there is no `column' in the spec actually */ +#define AFM_IS_SEP( ch ) ( (ch) == ';' ) + +#define AFM_GETC() \ + ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ + : EOF ) + +#define AFM_STREAM_KEY_BEGIN( stream ) \ + (char*)( (stream)->cursor - 1 ) + +#define AFM_STREAM_KEY_LEN( stream, key ) \ + ( (char*)(stream)->cursor - key - 1 ) + +#define AFM_STATUS_EOC( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOC ) + +#define AFM_STATUS_EOL( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOL ) + +#define AFM_STATUS_EOF( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOF ) + + + static int + afm_stream_skip_spaces( AFM_Stream stream ) + { + int ch = 0; /* make stupid compiler happy */ + + + if ( AFM_STATUS_EOC( stream ) ) + return ';'; + + while ( 1 ) + { + ch = AFM_GETC(); + if ( !AFM_IS_SPACE( ch ) ) + break; + } + + if ( AFM_IS_NEWLINE( ch ) ) + stream->status = AFM_STREAM_STATUS_EOL; + else if ( AFM_IS_SEP( ch ) ) + stream->status = AFM_STREAM_STATUS_EOC; + else if ( AFM_IS_EOF( ch ) ) + stream->status = AFM_STREAM_STATUS_EOF; + + return ch; + } + + + /* read a key or value in current column */ + static char* + afm_stream_read_one( AFM_Stream stream ) + { + char* str; + int ch; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOC( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + while ( 1 ) + { + ch = AFM_GETC(); + if ( AFM_IS_SPACE( ch ) ) + break; + else if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_SEP( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOC; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /* read a string (i.e., read to EOL) */ + static char* + afm_stream_read_string( AFM_Stream stream ) + { + char* str; + int ch; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOL( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + /* scan to eol */ + while ( 1 ) + { + ch = AFM_GETC(); + if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /*************************************************************************/ + /* */ + /* AFM_Parser */ + /* */ + /* */ + + /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */ + typedef enum AFM_Token_ + { + AFM_TOKEN_ASCENDER, + AFM_TOKEN_AXISLABEL, + AFM_TOKEN_AXISTYPE, + AFM_TOKEN_B, + AFM_TOKEN_BLENDAXISTYPES, + AFM_TOKEN_BLENDDESIGNMAP, + AFM_TOKEN_BLENDDESIGNPOSITIONS, + AFM_TOKEN_C, + AFM_TOKEN_CC, + AFM_TOKEN_CH, + AFM_TOKEN_CAPHEIGHT, + AFM_TOKEN_CHARWIDTH, + AFM_TOKEN_CHARACTERSET, + AFM_TOKEN_CHARACTERS, + AFM_TOKEN_DESCENDER, + AFM_TOKEN_ENCODINGSCHEME, + AFM_TOKEN_ENDAXIS, + AFM_TOKEN_ENDCHARMETRICS, + AFM_TOKEN_ENDCOMPOSITES, + AFM_TOKEN_ENDDIRECTION, + AFM_TOKEN_ENDFONTMETRICS, + AFM_TOKEN_ENDKERNDATA, + AFM_TOKEN_ENDKERNPAIRS, + AFM_TOKEN_ENDTRACKKERN, + AFM_TOKEN_ESCCHAR, + AFM_TOKEN_FAMILYNAME, + AFM_TOKEN_FONTBBOX, + AFM_TOKEN_FONTNAME, + AFM_TOKEN_FULLNAME, + AFM_TOKEN_ISBASEFONT, + AFM_TOKEN_ISCIDFONT, + AFM_TOKEN_ISFIXEDPITCH, + AFM_TOKEN_ISFIXEDV, + AFM_TOKEN_ITALICANGLE, + AFM_TOKEN_KP, + AFM_TOKEN_KPH, + AFM_TOKEN_KPX, + AFM_TOKEN_KPY, + AFM_TOKEN_L, + AFM_TOKEN_MAPPINGSCHEME, + AFM_TOKEN_METRICSSETS, + AFM_TOKEN_N, + AFM_TOKEN_NOTICE, + AFM_TOKEN_PCC, + AFM_TOKEN_STARTAXIS, + AFM_TOKEN_STARTCHARMETRICS, + AFM_TOKEN_STARTCOMPOSITES, + AFM_TOKEN_STARTDIRECTION, + AFM_TOKEN_STARTFONTMETRICS, + AFM_TOKEN_STARTKERNDATA, + AFM_TOKEN_STARTKERNPAIRS, + AFM_TOKEN_STARTKERNPAIRS0, + AFM_TOKEN_STARTKERNPAIRS1, + AFM_TOKEN_STARTTRACKKERN, + AFM_TOKEN_STDHW, + AFM_TOKEN_STDVW, + AFM_TOKEN_TRACKKERN, + AFM_TOKEN_UNDERLINEPOSITION, + AFM_TOKEN_UNDERLINETHICKNESS, + AFM_TOKEN_VV, + AFM_TOKEN_VVECTOR, + AFM_TOKEN_VERSION, + AFM_TOKEN_W, + AFM_TOKEN_W0, + AFM_TOKEN_W0X, + AFM_TOKEN_W0Y, + AFM_TOKEN_W1, + AFM_TOKEN_W1X, + AFM_TOKEN_W1Y, + AFM_TOKEN_WX, + AFM_TOKEN_WY, + AFM_TOKEN_WEIGHT, + AFM_TOKEN_WEIGHTVECTOR, + AFM_TOKEN_XHEIGHT, + N_AFM_TOKENS, + AFM_TOKEN_UNKNOWN + + } AFM_Token; + + + static const char* const afm_key_table[N_AFM_TOKENS] = + { + "Ascender", + "AxisLabel", + "AxisType", + "B", + "BlendAxisTypes", + "BlendDesignMap", + "BlendDesignPositions", + "C", + "CC", + "CH", + "CapHeight", + "CharWidth", + "CharacterSet", + "Characters", + "Descender", + "EncodingScheme", + "EndAxis", + "EndCharMetrics", + "EndComposites", + "EndDirection", + "EndFontMetrics", + "EndKernData", + "EndKernPairs", + "EndTrackKern", + "EscChar", + "FamilyName", + "FontBBox", + "FontName", + "FullName", + "IsBaseFont", + "IsCIDFont", + "IsFixedPitch", + "IsFixedV", + "ItalicAngle", + "KP", + "KPH", + "KPX", + "KPY", + "L", + "MappingScheme", + "MetricsSets", + "N", + "Notice", + "PCC", + "StartAxis", + "StartCharMetrics", + "StartComposites", + "StartDirection", + "StartFontMetrics", + "StartKernData", + "StartKernPairs", + "StartKernPairs0", + "StartKernPairs1", + "StartTrackKern", + "StdHW", + "StdVW", + "TrackKern", + "UnderlinePosition", + "UnderlineThickness", + "VV", + "VVector", + "Version", + "W", + "W0", + "W0X", + "W0Y", + "W1", + "W1X", + "W1Y", + "WX", + "WY", + "Weight", + "WeightVector", + "XHeight" + }; + + + /* + * `afm_parser_read_vals' and `afm_parser_next_key' provide + * high-level operations to an AFM_Stream. The rest of the + * parser functions should use them without accessing the + * AFM_Stream directly. + */ + + FT_LOCAL_DEF( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_Int n ) + { + AFM_Stream stream = parser->stream; + char* str; + FT_Int i; + + + if ( n > AFM_MAX_ARGUMENTS ) + return 0; + + for ( i = 0; i < n; i++ ) + { + FT_UInt len; + AFM_Value val = vals + i; + + + if ( val->type == AFM_VALUE_TYPE_STRING ) + str = afm_stream_read_string( stream ); + else + str = afm_stream_read_one( stream ); + + if ( !str ) + break; + + len = AFM_STREAM_KEY_LEN( stream, str ); + + switch ( val->type ) + { + case AFM_VALUE_TYPE_STRING: + case AFM_VALUE_TYPE_NAME: + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( !FT_QALLOC( val->u.s, len + 1 ) ) + { + ft_memcpy( val->u.s, str, len ); + val->u.s[len] = '\0'; + } + } + break; + + case AFM_VALUE_TYPE_FIXED: + val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len, 0 ); + break; + + case AFM_VALUE_TYPE_INTEGER: + val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len ); + break; + + case AFM_VALUE_TYPE_BOOL: + val->u.b = FT_BOOL( len == 4 && + !ft_strncmp( str, "true", 4 ) ); + break; + + case AFM_VALUE_TYPE_INDEX: + if ( parser->get_index ) + val->u.i = parser->get_index( str, len, parser->user_data ); + else + val->u.i = 0; + break; + } + } + + return i; + } + + + FT_LOCAL_DEF( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_UInt* len ) + { + AFM_Stream stream = parser->stream; + char* key = 0; /* make stupid compiler happy */ + + + if ( line ) + { + while ( 1 ) + { + /* skip current line */ + if ( !AFM_STATUS_EOL( stream ) ) + afm_stream_read_string( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty line */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOL( stream ) ) + continue; + + break; + } + } + else + { + while ( 1 ) + { + /* skip current column */ + while ( !AFM_STATUS_EOC( stream ) ) + afm_stream_read_one( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty column */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOC( stream ) ) + continue; + + break; + } + } + + if ( len ) + *len = ( key ) ? AFM_STREAM_KEY_LEN( stream, key ) + : 0; + + return key; + } + + + static AFM_Token + afm_tokenize( const char* key, + FT_UInt len ) + { + int n; + + + for ( n = 0; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) == *key ) + { + for ( ; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) != *key ) + return AFM_TOKEN_UNKNOWN; + + if ( ft_strncmp( afm_key_table[n], key, len ) == 0 ) + return (AFM_Token) n; + } + } + } + + return AFM_TOKEN_UNKNOWN; + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ) + { + AFM_Stream stream; + FT_Error error; + + + if ( FT_NEW( stream ) ) + return error; + + stream->cursor = stream->base = base; + stream->limit = limit; + + /* don't skip the first line during the first call */ + stream->status = AFM_STREAM_STATUS_EOL; + + parser->memory = memory; + parser->stream = stream; + parser->FontInfo = NULL; + parser->get_index = NULL; + + return PSaux_Err_Ok; + } + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + + + FT_FREE( parser->stream ); + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_read_int( AFM_Parser parser, + FT_Int* aint ) + { + AFM_ValueRec val; + + + val.type = AFM_VALUE_TYPE_INTEGER; + + if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) + { + *aint = val.u.i; + + return PSaux_Err_Ok; + } + else + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parse_track_kern( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_TrackKern tk; + char* key; + FT_UInt len; + int n = -1; + + + if ( afm_parser_read_int( parser, &fi->NumTrackKern ) ) + goto Fail; + + if ( fi->NumTrackKern ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[5]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_TRACKKERN: + n++; + + if ( n >= fi->NumTrackKern ) + goto Fail; + + tk = fi->TrackKerns + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + shared_vals[4].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) + goto Fail; + + tk->degree = shared_vals[0].u.i; + tk->min_ptsize = shared_vals[1].u.f; + tk->min_kern = shared_vals[2].u.f; + tk->max_ptsize = shared_vals[3].u.f; + tk->max_kern = shared_vals[4].u.f; + + /* is this correct? */ + if ( tk->degree < 0 && tk->min_kern > 0 ) + tk->min_kern = -tk->min_kern; + break; + + case AFM_TOKEN_ENDTRACKKERN: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + fi->NumTrackKern = n + 1; + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) + + + /* compare two kerning pairs */ + FT_CALLBACK_DEF( int ) + afm_compare_kern_pairs( const void* a, + const void* b ) + { + AFM_KernPair kp1 = (AFM_KernPair)a; + AFM_KernPair kp2 = (AFM_KernPair)b; + + FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 ); + FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 ); + + + if ( index1 > index2 ) + return 1; + else if ( index1 < index2 ) + return -1; + else + return 0; + } + + + static FT_Error + afm_parse_kern_pairs( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_KernPair kp; + char* key; + FT_UInt len; + int n = -1; + + + if ( afm_parser_read_int( parser, &fi->NumKernPair ) ) + goto Fail; + + if ( fi->NumKernPair ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + switch ( token ) + { + case AFM_TOKEN_KP: + case AFM_TOKEN_KPX: + case AFM_TOKEN_KPY: + { + FT_Int r; + AFM_ValueRec shared_vals[4]; + + + n++; + + if ( n >= fi->NumKernPair ) + goto Fail; + + kp = fi->KernPairs + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INDEX; + shared_vals[1].type = AFM_VALUE_TYPE_INDEX; + shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; + r = afm_parser_read_vals( parser, shared_vals, 4 ); + if ( r < 3 ) + goto Fail; + + kp->index1 = shared_vals[0].u.i; + kp->index2 = shared_vals[1].u.i; + if ( token == AFM_TOKEN_KPY ) + { + kp->x = 0; + kp->y = shared_vals[2].u.i; + } + else + { + kp->x = shared_vals[2].u.i; + kp->y = ( token == AFM_TOKEN_KP && r == 4 ) + ? shared_vals[3].u.i : 0; + } + } + break; + + case AFM_TOKEN_ENDKERNPAIRS: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + fi->NumKernPair = n + 1; + ft_qsort( fi->KernPairs, fi->NumKernPair, + sizeof( AFM_KernPairRec ), + afm_compare_kern_pairs ); + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parse_kern_data( AFM_Parser parser ) + { + FT_Error error; + char* key; + FT_UInt len; + + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_STARTTRACKKERN: + error = afm_parse_track_kern( parser ); + if ( error ) + return error; + break; + + case AFM_TOKEN_STARTKERNPAIRS: + case AFM_TOKEN_STARTKERNPAIRS0: + error = afm_parse_kern_pairs( parser ); + if ( error ) + return error; + break; + + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parser_skip_section( AFM_Parser parser, + FT_UInt n, + AFM_Token end_section ) + { + char* key; + FT_UInt len; + + + while ( n-- > 0 ) + { + key = afm_parser_next_key( parser, 1, NULL ); + if ( !key ) + goto Fail; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) + return PSaux_Err_Ok; + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_parse( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + AFM_FontInfo fi = parser->FontInfo; + FT_Error error = PSaux_Err_Syntax_Error; + char* key; + FT_UInt len; + FT_Int metrics_sets = 0; + + + if ( !fi ) + return PSaux_Err_Invalid_Argument; + + key = afm_parser_next_key( parser, 1, &len ); + if ( !key || len != 16 || + ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) + return PSaux_Err_Unknown_File_Format; + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[4]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_METRICSSETS: + if ( afm_parser_read_int( parser, &metrics_sets ) ) + goto Fail; + + if ( metrics_sets != 0 && metrics_sets != 2 ) + { + error = PSaux_Err_Unimplemented_Feature; + + goto Fail; + } + break; + + case AFM_TOKEN_ISCIDFONT: + shared_vals[0].type = AFM_VALUE_TYPE_BOOL; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->IsCIDFont = shared_vals[0].u.b; + break; + + case AFM_TOKEN_FONTBBOX: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 ) + goto Fail; + + fi->FontBBox.xMin = shared_vals[0].u.f; + fi->FontBBox.yMin = shared_vals[1].u.f; + fi->FontBBox.xMax = shared_vals[2].u.f; + fi->FontBBox.yMax = shared_vals[3].u.f; + break; + + case AFM_TOKEN_ASCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Ascender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_DESCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Descender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_STARTCHARMETRICS: + { + FT_Int n = 0; + + + if ( afm_parser_read_int( parser, &n ) ) + goto Fail; + + error = afm_parser_skip_section( parser, n, + AFM_TOKEN_ENDCHARMETRICS ); + if ( error ) + return error; + } + break; + + case AFM_TOKEN_STARTKERNDATA: + error = afm_parse_kern_data( parser ); + if ( error ) + goto Fail; + /* fall through since we only support kern data */ + + case AFM_TOKEN_ENDFONTMETRICS: + return PSaux_Err_Ok; + + default: + break; + } + } + + Fail: + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + fi->IsCIDFont = 0; + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/afmparse.h b/src/3rdparty/freetype/src/psaux/afmparse.h new file mode 100644 index 0000000000..c2fce75c86 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/afmparse.h @@ -0,0 +1,87 @@ +/***************************************************************************/ +/* */ +/* afmparse.h */ +/* */ +/* AFM parser (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFMPARSE_H__ +#define __AFMPARSE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ); + + + FT_LOCAL( FT_Error ) + afm_parser_parse( AFM_Parser parser ); + + + enum AFM_ValueType_ + { + AFM_VALUE_TYPE_STRING, + AFM_VALUE_TYPE_NAME, + AFM_VALUE_TYPE_FIXED, /* real number */ + AFM_VALUE_TYPE_INTEGER, + AFM_VALUE_TYPE_BOOL, + AFM_VALUE_TYPE_INDEX /* glyph index */ + }; + + + typedef struct AFM_ValueRec_ + { + enum AFM_ValueType_ type; + union { + char* s; + FT_Fixed f; + FT_Int i; + FT_Bool b; + + } u; + + } AFM_ValueRec, *AFM_Value; + +#define AFM_MAX_ARGUMENTS 5 + + FT_LOCAL( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_Int n ); + + /* read the next key from the next line or column */ + FT_LOCAL( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_UInt* len ); + +FT_END_HEADER + +#endif /* __AFMPARSE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/module.mk b/src/3rdparty/freetype/src/psaux/module.mk new file mode 100644 index 0000000000..42bf6f5199 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSaux module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSAUX_MODULE + +define PSAUX_MODULE +$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)psaux $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/psaux/psaux.c b/src/3rdparty/freetype/src/psaux/psaux.c new file mode 100644 index 0000000000..a4b9c5c6e4 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/psaux.c @@ -0,0 +1,34 @@ +/***************************************************************************/ +/* */ +/* psaux.c */ +/* */ +/* FreeType auxiliary PostScript driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2002, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "psobjs.c" +#include "psauxmod.c" +#include "t1decode.c" +#include "t1cmap.c" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "afmparse.c" +#endif + +#include "psconv.c" + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/psauxerr.h b/src/3rdparty/freetype/src/psaux/psauxerr.h new file mode 100644 index 0000000000..d0baa3cbb9 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/psauxerr.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* psauxerr.h */ +/* */ +/* PS auxiliary module error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PS auxiliary module error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSAUXERR_H__ +#define __PSAUXERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSaux_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSaux + +#include FT_ERRORS_H + +#endif /* __PSAUXERR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/psauxmod.c b/src/3rdparty/freetype/src/psaux/psauxmod.c new file mode 100644 index 0000000000..4c3579f7b8 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/psauxmod.c @@ -0,0 +1,139 @@ +/***************************************************************************/ +/* */ +/* psauxmod.c */ +/* */ +/* FreeType auxiliary PostScript module implementation (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "psauxmod.h" +#include "psobjs.h" +#include "t1decode.h" +#include "t1cmap.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "afmparse.h" +#endif + + + FT_CALLBACK_TABLE_DEF + const PS_Table_FuncsRec ps_table_funcs = + { + ps_table_new, + ps_table_done, + ps_table_add, + ps_table_release + }; + + + FT_CALLBACK_TABLE_DEF + const PS_Parser_FuncsRec ps_parser_funcs = + { + ps_parser_init, + ps_parser_done, + ps_parser_skip_spaces, + ps_parser_skip_PS_token, + ps_parser_to_int, + ps_parser_to_fixed, + ps_parser_to_bytes, + ps_parser_to_coord_array, + ps_parser_to_fixed_array, + ps_parser_to_token, + ps_parser_to_token_array, + ps_parser_load_field, + ps_parser_load_field_table + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Builder_FuncsRec t1_builder_funcs = + { + t1_builder_init, + t1_builder_done, + t1_builder_check_points, + t1_builder_add_point, + t1_builder_add_point1, + t1_builder_add_contour, + t1_builder_start_point, + t1_builder_close_contour + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Decoder_FuncsRec t1_decoder_funcs = + { + t1_decoder_init, + t1_decoder_done, + t1_decoder_parse_charstrings + }; + + +#ifndef T1_CONFIG_OPTION_NO_AFM + FT_CALLBACK_TABLE_DEF + const AFM_Parser_FuncsRec afm_parser_funcs = + { + afm_parser_init, + afm_parser_done, + afm_parser_parse + }; +#endif + + + FT_CALLBACK_TABLE_DEF + const T1_CMap_ClassesRec t1_cmap_classes = + { + &t1_cmap_standard_class_rec, + &t1_cmap_expert_class_rec, + &t1_cmap_custom_class_rec, + &t1_cmap_unicode_class_rec + }; + + + static + const PSAux_Interface psaux_interface = + { + &ps_table_funcs, + &ps_parser_funcs, + &t1_builder_funcs, + &t1_decoder_funcs, + t1_decrypt, + + (const T1_CMap_ClassesRec*) &t1_cmap_classes, + +#ifndef T1_CONFIG_OPTION_NO_AFM + &afm_parser_funcs, +#else + 0, +#endif + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class psaux_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "psaux", + 0x20000L, + 0x20000L, + + &psaux_interface, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/psauxmod.h b/src/3rdparty/freetype/src/psaux/psauxmod.h new file mode 100644 index 0000000000..92ac056048 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/psauxmod.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* psauxmod.h */ +/* */ +/* FreeType auxiliary PostScript module implementation (specification). */ +/* */ +/* Copyright 2000-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSAUXMOD_H__ +#define __PSAUXMOD_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; + + +FT_END_HEADER + +#endif /* __PSAUXMOD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/psconv.c b/src/3rdparty/freetype/src/psaux/psconv.c new file mode 100644 index 0000000000..d824b59139 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/psconv.c @@ -0,0 +1,474 @@ +/***************************************************************************/ +/* */ +/* psconv.c */ +/* */ +/* Some convenience conversions (body). */ +/* */ +/* Copyright 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_H + +#include "psconv.h" +#include "psobjs.h" +#include "psauxerr.h" + + + /* The following array is used by various functions to quickly convert */ + /* digits (both decimal and non-decimal) into numbers. */ + +#if 'A' == 65 + /* ASCII */ + + static const FT_Char ft_char_table[128] = + { + /* 0x00 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + }; + + /* no character >= 0x80 can represent a valid number */ +#define OP >= + +#endif /* 'A' == 65 */ + +#if 'A' == 193 + /* EBCDIC */ + + static const FT_Char ft_char_table[128] = + { + /* 0x80 */ + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + }; + + /* no character < 0x80 can represent a valid number */ +#define OP < + +#endif /* 'A' == 193 */ + + + FT_LOCAL_DEF( FT_Int ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Int base ) + { + FT_Byte* p = *cursor; + FT_Int num = 0; + FT_Bool sign = 0; + + + if ( p == limit || base < 2 || base > 36 ) + return 0; + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + return 0; + } + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( c < 0 || c >= base ) + break; + + num = num * base + c; + } + + if ( sign ) + num = -num; + + *cursor = p; + + return num; + } + + + FT_LOCAL_DEF( FT_Int ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ) + + { + FT_Byte* p; + FT_Int num; + + + num = PS_Conv_Strtol( cursor, limit, 10 ); + p = *cursor; + + if ( p < limit && *p == '#' ) + { + *cursor = p + 1; + + return PS_Conv_Strtol( cursor, limit, num ); + } + else + return num; + } + + + FT_LOCAL_DEF( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Int power_ten ) + { + FT_Byte* p = *cursor; + FT_Fixed integral; + FT_Long decimal = 0, divider = 1; + FT_Bool sign = 0; + + + if ( p == limit ) + return 0; + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + return 0; + } + + if ( *p != '.' ) + integral = PS_Conv_ToInt( &p, limit ) << 16; + else + integral = 0; + + /* read the decimal part */ + if ( p < limit && *p == '.' ) + { + p++; + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( c < 0 || c >= 10 ) + break; + + if ( !integral && power_ten > 0 ) + { + power_ten--; + decimal = decimal * 10 + c; + } + else + { + if ( divider < 10000000L ) + { + decimal = decimal * 10 + c; + divider *= 10; + } + } + } + } + + /* read exponent, if any */ + if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) ) + { + p++; + power_ten += PS_Conv_ToInt( &p, limit ); + } + + while ( power_ten > 0 ) + { + integral *= 10; + decimal *= 10; + power_ten--; + } + + while ( power_ten < 0 ) + { + integral /= 10; + divider *= 10; + power_ten++; + } + + if ( decimal ) + integral += FT_DivFix( decimal, divider ); + + if ( sign ) + integral = -integral; + + *cursor = p; + + return integral; + } + + +#if 0 + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_UInt n ) + { + FT_Byte* p; + FT_UInt r = 0; + + + for ( p = *cursor; r < n && p < limit; p++ ) + { + FT_Byte b; + + + if ( *p != '\\' ) + { + buffer[r++] = *p; + + continue; + } + + p++; + + switch ( *p ) + { + case 'n': + b = '\n'; + break; + case 'r': + b = '\r'; + break; + case 't': + b = '\t'; + break; + case 'b': + b = '\b'; + break; + case 'f': + b = '\f'; + break; + case '\r': + p++; + if ( *p != '\n' ) + { + b = *p; + + break; + } + /* no break */ + case '\n': + continue; + break; + default: + if ( IS_PS_DIGIT( *p ) ) + { + b = *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + { + b = b * 8 + *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + b = b * 8 + *p - '0'; + else + { + buffer[r++] = b; + b = *p; + } + } + else + { + buffer[r++] = b; + b = *p; + } + } + else + b = *p; + break; + } + + buffer[r++] = b; + } + + *cursor = p; + + return r; + } +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_UInt n ) + { + FT_Byte* p; + FT_UInt r = 0; + FT_UInt w = 0; + FT_UInt pad = 0x01; + + + n *= 2; + +#if 1 + + p = *cursor; + if ( n > (FT_UInt)( limit - p ) ) + n = (FT_UInt)( limit - p ); + + /* we try to process two nibbles at a time to be as fast as possible */ + for ( ; r < n; r++ ) + { + FT_UInt c = p[r]; + + + if ( IS_PS_SPACE( c ) ) + continue; + + if ( c OP 0x80 ) + break; + + c = ft_char_table[c & 0x7F]; + if ( (unsigned)c >= 16 ) + break; + + pad = ( pad << 4 ) | c; + if ( pad & 0x100 ) + { + buffer[w++] = (FT_Byte)pad; + pad = 0x01; + } + } + + if ( pad != 0x01 ) + buffer[w++] = (FT_Byte)( pad << 4 ); + + *cursor = p + r; + + return w; + +#else /* 0 */ + + for ( r = 0; r < n; r++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) ) + continue; + + if ( *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( (unsigned)c >= 16 ) + break; + + if ( r & 1 ) + { + *buffer = (FT_Byte)(*buffer + c); + buffer++; + } + else + *buffer = (FT_Byte)(c << 4); + + r++; + } + + *cursor = p; + + return ( r + 1 ) / 2; + +#endif /* 0 */ + + } + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_UInt n, + FT_UShort* seed ) + { + FT_Byte* p; + FT_UInt r; + FT_UInt s = *seed; + + +#if 1 + + p = *cursor; + if ( n > (FT_UInt)(limit - p) ) + n = (FT_UInt)(limit - p); + + for ( r = 0; r < n; r++ ) + { + FT_UInt val = p[r]; + FT_UInt b = ( val ^ ( s >> 8 ) ); + + + s = ( (val + s)*52845U + 22719 ) & 0xFFFFU; + buffer[r] = (FT_Byte) b; + } + + *cursor = p + n; + *seed = (FT_UShort)s; + +#else /* 0 */ + + for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ ) + { + FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) ); + + + s = (FT_UShort)( ( *p + s ) * 52845U + 22719 ); + *buffer++ = b; + } + *cursor = p; + *seed = s; + +#endif /* 0 */ + + return r; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/psconv.h b/src/3rdparty/freetype/src/psaux/psconv.h new file mode 100644 index 0000000000..e51124185d --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/psconv.h @@ -0,0 +1,71 @@ +/***************************************************************************/ +/* */ +/* psconv.h */ +/* */ +/* Some convenience conversions (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSCONV_H__ +#define __PSCONV_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Int ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Int base ); + + + FT_LOCAL( FT_Int ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ); + + FT_LOCAL( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Int power_ten ); + +#if 0 + FT_LOCAL( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_UInt n ); +#endif + + FT_LOCAL( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_UInt n ); + + FT_LOCAL( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_UInt n, + FT_UShort* seed ); + + +FT_END_HEADER + +#endif /* __PSCONV_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/psobjs.c b/src/3rdparty/freetype/src/psaux/psobjs.c new file mode 100644 index 0000000000..52e30a4136 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/psobjs.c @@ -0,0 +1,1706 @@ +/***************************************************************************/ +/* */ +/* psobjs.c */ +/* */ +/* Auxiliary functions for PostScript fonts (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_H + +#include "psobjs.h" +#include "psconv.h" + +#include "psauxerr.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_psobjs + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_new */ + /* */ + /* <Description> */ + /* Initializes a PS_Table. */ + /* */ + /* <InOut> */ + /* table :: The address of the target table. */ + /* */ + /* <Input> */ + /* count :: The table size = the maximum number of elements. */ + /* */ + /* memory :: The memory object to use for all subsequent */ + /* reallocations. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ) + { + FT_Error error; + + + table->memory = memory; + if ( FT_NEW_ARRAY( table->elements, count ) || + FT_NEW_ARRAY( table->lengths, count ) ) + goto Exit; + + table->max_elems = count; + table->init = 0xDEADBEEFUL; + table->num_elems = 0; + table->block = 0; + table->capacity = 0; + table->cursor = 0; + + *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs; + + Exit: + if ( error ) + FT_FREE( table->elements ); + + return error; + } + + + static void + shift_elements( PS_Table table, + FT_Byte* old_base ) + { + FT_PtrDist delta = table->block - old_base; + FT_Byte** offset = table->elements; + FT_Byte** limit = offset + table->max_elems; + + + for ( ; offset < limit; offset++ ) + { + if ( offset[0] ) + offset[0] += delta; + } + } + + + static FT_Error + reallocate_t1_table( PS_Table table, + FT_Long new_size ) + { + FT_Memory memory = table->memory; + FT_Byte* old_base = table->block; + FT_Error error; + + + /* allocate new base block */ + if ( FT_ALLOC( table->block, new_size ) ) + { + table->block = old_base; + return error; + } + + /* copy elements and shift offsets */ + if ( old_base ) + { + FT_MEM_COPY( table->block, old_base, table->capacity ); + shift_elements( table, old_base ); + FT_FREE( old_base ); + } + + table->capacity = new_size; + + return PSaux_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_add */ + /* */ + /* <Description> */ + /* Adds an object to a PS_Table, possibly growing its memory block. */ + /* */ + /* <InOut> */ + /* table :: The target table. */ + /* */ + /* <Input> */ + /* idx :: The index of the object in the table. */ + /* */ + /* object :: The address of the object to copy in memory. */ + /* */ + /* length :: The length in bytes of the source object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. An error is returned if a */ + /* reallocation fails. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ) + { + if ( idx < 0 || idx >= table->max_elems ) + { + FT_ERROR(( "ps_table_add: invalid index\n" )); + return PSaux_Err_Invalid_Argument; + } + + if ( length < 0 ) + { + FT_ERROR(( "ps_table_add: invalid length\n" )); + return PSaux_Err_Invalid_Argument; + } + + /* grow the base block if needed */ + if ( table->cursor + length > table->capacity ) + { + FT_Error error; + FT_Offset new_size = table->capacity; + FT_Long in_offset; + + + in_offset = (FT_Long)((FT_Byte*)object - table->block); + if ( (FT_ULong)in_offset >= table->capacity ) + in_offset = -1; + + while ( new_size < table->cursor + length ) + { + /* increase size by 25% and round up to the nearest multiple + of 1024 */ + new_size += ( new_size >> 2 ) + 1; + new_size = FT_PAD_CEIL( new_size, 1024 ); + } + + error = reallocate_t1_table( table, new_size ); + if ( error ) + return error; + + if ( in_offset >= 0 ) + object = table->block + in_offset; + } + + /* add the object to the base block and adjust offset */ + table->elements[idx] = table->block + table->cursor; + table->lengths [idx] = length; + FT_MEM_COPY( table->block + table->cursor, object, length ); + + table->cursor += length; + return PSaux_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_done */ + /* */ + /* <Description> */ + /* Finalizes a PS_TableRec (i.e., reallocate it to its current */ + /* cursor). */ + /* */ + /* <InOut> */ + /* table :: The target table. */ + /* */ + /* <Note> */ + /* This function does NOT release the heap's memory block. It is up */ + /* to the caller to clean it, or reference it in its own structures. */ + /* */ + FT_LOCAL_DEF( void ) + ps_table_done( PS_Table table ) + { + FT_Memory memory = table->memory; + FT_Error error; + FT_Byte* old_base = table->block; + + + /* should never fail, because rec.cursor <= rec.size */ + if ( !old_base ) + return; + + if ( FT_ALLOC( table->block, table->cursor ) ) + return; + FT_MEM_COPY( table->block, old_base, table->cursor ); + shift_elements( table, old_base ); + + table->capacity = table->cursor; + FT_FREE( old_base ); + + FT_UNUSED( error ); + } + + + FT_LOCAL_DEF( void ) + ps_table_release( PS_Table table ) + { + FT_Memory memory = table->memory; + + + if ( (FT_ULong)table->init == 0xDEADBEEFUL ) + { + FT_FREE( table->block ); + FT_FREE( table->elements ); + FT_FREE( table->lengths ); + table->init = 0; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* first character must be already part of the comment */ + + static void + skip_comment( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( IS_PS_NEWLINE( *cur ) ) + break; + cur++; + } + + *acur = cur; + } + + + static void + skip_spaces( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( !IS_PS_SPACE( *cur ) ) + { + if ( *cur == '%' ) + /* According to the PLRM, a comment is equal to a space. */ + skip_comment( &cur, limit ); + else + break; + } + cur++; + } + + *acur = cur; + } + + +#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' ) + + + /* first character must be `('; */ + /* *acur is positioned at the character after the closing `)' */ + + static FT_Error + skip_literal_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Int embed = 0; + FT_Error error = PSaux_Err_Invalid_File_Format; + unsigned int i; + + + while ( cur < limit ) + { + FT_Byte c = *cur; + + + ++cur; + + if ( c == '\\' ) + { + /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */ + /* A backslash can introduce three different types */ + /* of escape sequences: */ + /* - a special escaped char like \r, \n, etc. */ + /* - a one-, two-, or three-digit octal number */ + /* - none of the above in which case the backslash is ignored */ + + if ( cur == limit ) + /* error (or to be ignored?) */ + break; + + switch ( *cur ) + { + /* skip `special' escape */ + case 'n': + case 'r': + case 't': + case 'b': + case 'f': + case '\\': + case '(': + case ')': + ++cur; + break; + + default: + /* skip octal escape or ignore backslash */ + for ( i = 0; i < 3 && cur < limit; ++i ) + { + if ( !IS_OCTAL_DIGIT( *cur ) ) + break; + + ++cur; + } + } + } + else if ( c == '(' ) + embed++; + else if ( c == ')' ) + { + embed--; + if ( embed == 0 ) + { + error = PSaux_Err_Ok; + break; + } + } + } + + *acur = cur; + + return error; + } + + + /* first character must be `<' */ + + static FT_Error + skip_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Error err = PSaux_Err_Ok; + + + while ( ++cur < limit ) + { + /* All whitespace characters are ignored. */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + break; + + if ( !IS_PS_XDIGIT( *cur ) ) + break; + } + + if ( cur < limit && *cur != '>' ) + { + FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); + err = PSaux_Err_Invalid_File_Format; + } + else + cur++; + + *acur = cur; + return err; + } + + + /* first character must be the opening brace that */ + /* starts the procedure */ + + /* NB: [ and ] need not match: */ + /* `/foo {[} def' is a valid PostScript fragment, */ + /* even within a Type1 font */ + + static FT_Error + skip_procedure( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur; + FT_Int embed = 0; + FT_Error error = PSaux_Err_Ok; + + + FT_ASSERT( **acur == '{' ); + + for ( cur = *acur; cur < limit && error == PSaux_Err_Ok; ++cur ) + { + switch ( *cur ) + { + case '{': + ++embed; + break; + + case '}': + --embed; + if ( embed == 0 ) + { + ++cur; + goto end; + } + break; + + case '(': + error = skip_literal_string( &cur, limit ); + break; + + case '<': + error = skip_string( &cur, limit ); + break; + + case '%': + skip_comment( &cur, limit ); + break; + } + } + + end: + if ( embed != 0 ) + error = PSaux_Err_Invalid_File_Format; + + *acur = cur; + + return error; + } + + + /***********************************************************************/ + /* */ + /* All exported parsing routines handle leading whitespace and stop at */ + /* the first character which isn't part of the just handled token. */ + /* */ + /***********************************************************************/ + + + FT_LOCAL_DEF( void ) + ps_parser_skip_PS_token( PS_Parser parser ) + { + /* Note: PostScript allows any non-delimiting, non-whitespace */ + /* character in a name (PS Ref Manual, 3rd ed, p31). */ + /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ + + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + FT_Error error = PSaux_Err_Ok; + + + skip_spaces( &cur, limit ); /* this also skips comments */ + if ( cur >= limit ) + goto Exit; + + /* self-delimiting, single-character tokens */ + if ( *cur == '[' || *cur == ']' ) + { + cur++; + goto Exit; + } + + /* skip balanced expressions (procedures and strings) */ + + if ( *cur == '{' ) /* {...} */ + { + error = skip_procedure( &cur, limit ); + goto Exit; + } + + if ( *cur == '(' ) /* (...) */ + { + error = skip_literal_string( &cur, limit ); + goto Exit; + } + + if ( *cur == '<' ) /* <...> */ + { + if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */ + { + cur++; + cur++; + } + else + error = skip_string( &cur, limit ); + + goto Exit; + } + + if ( *cur == '>' ) + { + cur++; + if ( cur >= limit || *cur != '>' ) /* >> */ + { + FT_ERROR(( "ps_parser_skip_PS_token: " + "unexpected closing delimiter `>'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + cur++; + goto Exit; + } + + if ( *cur == '/' ) + cur++; + + /* anything else */ + while ( cur < limit ) + { + /* *cur might be invalid (e.g., ')' or '}'), but this */ + /* is handled by the test `cur == parser->cursor' below */ + if ( IS_PS_DELIM( *cur ) ) + break; + + cur++; + } + + Exit: + if ( cur == parser->cursor ) + { + FT_ERROR(( "ps_parser_skip_PS_token: " + "current token is `%c', which is self-delimiting " + "but invalid at this point\n", + *cur )); + + error = PSaux_Err_Invalid_File_Format; + } + + parser->error = error; + parser->cursor = cur; + } + + + FT_LOCAL_DEF( void ) + ps_parser_skip_spaces( PS_Parser parser ) + { + skip_spaces( &parser->cursor, parser->limit ); + } + + + /* `token' here means either something between balanced delimiters */ + /* or the next token; the delimiters are not removed. */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ) + { + FT_Byte* cur; + FT_Byte* limit; + FT_Int embed; + + + token->type = T1_TOKEN_TYPE_NONE; + token->start = 0; + token->limit = 0; + + /* first of all, skip leading whitespace */ + ps_parser_skip_spaces( parser ); + + cur = parser->cursor; + limit = parser->limit; + + if ( cur >= limit ) + return; + + switch ( *cur ) + { + /************* check for literal string *****************/ + case '(': + token->type = T1_TOKEN_TYPE_STRING; + token->start = cur; + + if ( skip_literal_string( &cur, limit ) == PSaux_Err_Ok ) + token->limit = cur; + break; + + /************* check for programs/array *****************/ + case '{': + token->type = T1_TOKEN_TYPE_ARRAY; + token->start = cur; + + if ( skip_procedure( &cur, limit ) == PSaux_Err_Ok ) + token->limit = cur; + break; + + /************* check for table/array ********************/ + /* XXX: in theory we should also look for "<<" */ + /* since this is semantically equivalent to "["; */ + /* in practice it doesn't matter (?) */ + case '[': + token->type = T1_TOKEN_TYPE_ARRAY; + embed = 1; + token->start = cur++; + + /* we need this to catch `[ ]' */ + parser->cursor = cur; + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + while ( cur < limit && !parser->error ) + { + /* XXX: this is wrong because it does not */ + /* skip comments, procedures, and strings */ + if ( *cur == '[' ) + embed++; + else if ( *cur == ']' ) + { + embed--; + if ( embed <= 0 ) + { + token->limit = ++cur; + break; + } + } + + parser->cursor = cur; + ps_parser_skip_PS_token( parser ); + /* we need this to catch `[XXX ]' */ + ps_parser_skip_spaces ( parser ); + cur = parser->cursor; + } + break; + + /* ************ otherwise, it is any token **************/ + default: + token->start = cur; + token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY ); + ps_parser_skip_PS_token( parser ); + cur = parser->cursor; + if ( !parser->error ) + token->limit = cur; + } + + if ( !token->limit ) + { + token->start = 0; + token->type = T1_TOKEN_TYPE_NONE; + } + + parser->cursor = cur; + } + + + /* NB: `tokens' can be NULL if we only want to count */ + /* the number of array elements */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ) + { + T1_TokenRec master; + + + *pnum_tokens = -1; + + /* this also handles leading whitespace */ + ps_parser_to_token( parser, &master ); + + if ( master.type == T1_TOKEN_TYPE_ARRAY ) + { + FT_Byte* old_cursor = parser->cursor; + FT_Byte* old_limit = parser->limit; + T1_Token cur = tokens; + T1_Token limit = cur + max_tokens; + + + /* don't include outermost delimiters */ + parser->cursor = master.start + 1; + parser->limit = master.limit - 1; + + while ( parser->cursor < parser->limit ) + { + T1_TokenRec token; + + + ps_parser_to_token( parser, &token ); + if ( !token.type ) + break; + + if ( tokens != NULL && cur < limit ) + *cur = token; + + cur++; + } + + *pnum_tokens = (FT_Int)( cur - tokens ); + + parser->cursor = old_cursor; + parser->limit = old_limit; + } + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `coords' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_coords' */ + + static FT_Int + ps_tocoordarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_coords, + FT_Short* coords ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* check for the beginning of an array; otherwise, only one number */ + /* will be read */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the coordinates */ + while ( cur < limit ) + { + FT_Short dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( coords != NULL && count >= max_coords ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( coords != NULL ? &coords[count] : &dummy ) = + (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `values' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_values' */ + + static FT_Int + ps_tofixedarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* Check for the beginning of an array. Otherwise, only one number */ + /* will be read. */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the values */ + while ( cur < limit ) + { + FT_Fixed dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( values != NULL && count >= max_values ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( values != NULL ? &values[count] : &dummy ) = + PS_Conv_ToFixed( &cur, limit, power_ten ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + +#if 0 + + static FT_String* + ps_tostring( FT_Byte** cursor, + FT_Byte* limit, + FT_Memory memory ) + { + FT_Byte* cur = *cursor; + FT_PtrDist len = 0; + FT_Int count; + FT_String* result; + FT_Error error; + + + /* XXX: some stupid fonts have a `Notice' or `Copyright' string */ + /* that simply doesn't begin with an opening parenthesis, even */ + /* though they have a closing one! E.g. "amuncial.pfb" */ + /* */ + /* We must deal with these ill-fated cases there. Note that */ + /* these fonts didn't work with the old Type 1 driver as the */ + /* notice/copyright was not recognized as a valid string token */ + /* and made the old token parser commit errors. */ + + while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) ) + cur++; + if ( cur + 1 >= limit ) + return 0; + + if ( *cur == '(' ) + cur++; /* skip the opening parenthesis, if there is one */ + + *cursor = cur; + count = 0; + + /* then, count its length */ + for ( ; cur < limit; cur++ ) + { + if ( *cur == '(' ) + count++; + + else if ( *cur == ')' ) + { + count--; + if ( count < 0 ) + break; + } + } + + len = cur - *cursor; + if ( cur >= limit || FT_ALLOC( result, len + 1 ) ) + return 0; + + /* now copy the string */ + FT_MEM_COPY( result, *cursor, len ); + result[len] = '\0'; + *cursor = cur; + return result; + } + +#endif /* 0 */ + + + static int + ps_tobool( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Bool result = 0; + + + /* return 1 if we find `true', 0 otherwise */ + if ( cur + 3 < limit && + cur[0] == 't' && + cur[1] == 'r' && + cur[2] == 'u' && + cur[3] == 'e' ) + { + result = 1; + cur += 5; + } + else if ( cur + 4 < limit && + cur[0] == 'f' && + cur[1] == 'a' && + cur[2] == 'l' && + cur[3] == 's' && + cur[4] == 'e' ) + { + result = 0; + cur += 6; + } + + *acur = cur; + return result; + } + + + /* load a simple field (i.e. non-table) into the current list of objects */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec token; + FT_Byte* cur; + FT_Byte* limit; + FT_UInt count; + FT_UInt idx; + FT_Error error; + + + /* this also skips leading whitespace */ + ps_parser_to_token( parser, &token ); + if ( !token.type ) + goto Fail; + + count = 1; + idx = 0; + cur = token.start; + limit = token.limit; + + /* we must detect arrays in /FontBBox */ + if ( field->type == T1_FIELD_TYPE_BBOX ) + { + T1_TokenRec token2; + FT_Byte* old_cur = parser->cursor; + FT_Byte* old_limit = parser->limit; + + + /* don't include delimiters */ + parser->cursor = token.start + 1; + parser->limit = token.limit - 1; + + ps_parser_to_token( parser, &token2 ); + parser->cursor = old_cur; + parser->limit = old_limit; + + if ( token2.type == T1_TOKEN_TYPE_ARRAY ) + goto FieldArray; + } + else if ( token.type == T1_TOKEN_TYPE_ARRAY ) + { + FieldArray: + /* if this is an array and we have no blend, an error occurs */ + if ( max_objects == 0 ) + goto Fail; + + count = max_objects; + idx = 1; + + /* don't include delimiters */ + cur++; + limit--; + } + + for ( ; count > 0; count--, idx++ ) + { + FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; + FT_Long val; + FT_String* string; + + + skip_spaces( &cur, limit ); + + switch ( field->type ) + { + case T1_FIELD_TYPE_BOOL: + val = ps_tobool( &cur, limit ); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED: + val = PS_Conv_ToFixed( &cur, limit, 0 ); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED_1000: + val = PS_Conv_ToFixed( &cur, limit, 3 ); + goto Store_Integer; + + case T1_FIELD_TYPE_INTEGER: + val = PS_Conv_ToInt( &cur, limit ); + /* fall through */ + + Store_Integer: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)q = (FT_UShort)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)q = (FT_UInt32)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case T1_FIELD_TYPE_STRING: + case T1_FIELD_TYPE_KEY: + { + FT_Memory memory = parser->memory; + FT_UInt len = (FT_UInt)( limit - cur ); + + + if ( cur >= limit ) + break; + + /* we allow both a string or a name */ + /* for cases like /FontName (foo) def */ + if ( token.type == T1_TOKEN_TYPE_KEY ) + { + /* don't include leading `/' */ + len--; + cur++; + } + else if ( token.type == T1_TOKEN_TYPE_STRING ) + { + /* don't include delimiting parentheses */ + /* XXX we don't handle <<...>> here */ + /* XXX should we convert octal escapes? */ + /* if so, what encoding should we use? */ + cur++; + len -= 2; + } + else + { + FT_ERROR(( "ps_parser_load_field: expected a name or string " + "but found token of type %d instead\n", + token.type )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + /* for this to work (FT_String**)q must have been */ + /* initialized to NULL */ + if ( *(FT_String**)q != NULL ) + { + FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", + field->ident )); + FT_FREE( *(FT_String**)q ); + *(FT_String**)q = NULL; + } + + if ( FT_ALLOC( string, len + 1 ) ) + goto Exit; + + FT_MEM_COPY( string, cur, len ); + string[len] = 0; + + *(FT_String**)q = string; + } + break; + + case T1_FIELD_TYPE_BBOX: + { + FT_Fixed temp[4]; + FT_BBox* bbox = (FT_BBox*)q; + FT_Int result; + + + result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); + + if ( result < 0 ) + { + FT_ERROR(( "ps_parser_load_field: " + "expected four integers in bounding box\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + bbox->xMin = FT_RoundFix( temp[0] ); + bbox->yMin = FT_RoundFix( temp[1] ); + bbox->xMax = FT_RoundFix( temp[2] ); + bbox->yMax = FT_RoundFix( temp[3] ); + } + break; + + default: + /* an error occurred */ + goto Fail; + } + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + error = PSaux_Err_Ok; + + Exit: + return error; + + Fail: + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + +#define T1_MAX_TABLE_ELEMENTS 32 + + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; + T1_Token token; + FT_Int num_elements; + FT_Error error = PSaux_Err_Ok; + FT_Byte* old_cursor; + FT_Byte* old_limit; + T1_FieldRec fieldrec = *(T1_Field)field; + + + fieldrec.type = T1_FIELD_TYPE_INTEGER; + if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || + field->type == T1_FIELD_TYPE_BBOX ) + fieldrec.type = T1_FIELD_TYPE_FIXED; + + ps_parser_to_token_array( parser, elements, + T1_MAX_TABLE_ELEMENTS, &num_elements ); + if ( num_elements < 0 ) + { + error = PSaux_Err_Ignore; + goto Exit; + } + if ( (FT_UInt)num_elements > field->array_max ) + num_elements = field->array_max; + + old_cursor = parser->cursor; + old_limit = parser->limit; + + /* we store the elements count if necessary; */ + /* we further assume that `count_offset' can't be zero */ + if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 ) + *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) = + (FT_Byte)num_elements; + + /* we now load each element, adjusting the field.offset on each one */ + token = elements; + for ( ; num_elements > 0; num_elements--, token++ ) + { + parser->cursor = token->start; + parser->limit = token->limit; + ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 ); + fieldrec.offset += fieldrec.size; + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + parser->cursor = old_cursor; + parser->limit = old_limit; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Long ) + ps_parser_to_int( PS_Parser parser ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToInt( &parser->cursor, parser->limit ); + } + + + /* first character must be `<' if `delimiters' is non-zero */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Long max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ) + { + FT_Error error = PSaux_Err_Ok; + FT_Byte* cur; + + + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + if ( cur >= parser->limit ) + goto Exit; + + if ( delimiters ) + { + if ( *cur != '<' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; + } + + *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, + parser->limit, + bytes, + max_bytes ); + + if ( delimiters ) + { + if ( cur < parser->limit && *cur != '>' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; + } + + parser->cursor = cur; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ) + { + ps_parser_skip_spaces( parser ); + return ps_tocoordarray( &parser->cursor, parser->limit, + max_coords, coords ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return ps_tofixedarray( &parser->cursor, parser->limit, + max_values, values, power_ten ); + } + + +#if 0 + + FT_LOCAL_DEF( FT_String* ) + T1_ToString( PS_Parser parser ) + { + return ps_tostring( &parser->cursor, parser->limit, parser->memory ); + } + + + FT_LOCAL_DEF( FT_Bool ) + T1_ToBool( PS_Parser parser ) + { + return ps_tobool( &parser->cursor, parser->limit ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ) + { + parser->error = PSaux_Err_Ok; + parser->base = base; + parser->limit = limit; + parser->cursor = base; + parser->memory = memory; + parser->funcs = ps_parser_funcs; + } + + + FT_LOCAL_DEF( void ) + ps_parser_done( PS_Parser parser ) + { + FT_UNUSED( parser ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_builder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph builder. */ + /* */ + /* <InOut> */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting should be applied. */ + /* */ + FT_LOCAL_DEF( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->parse_state = T1_Parse_Start; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = size->internal; + builder->hints_funcs = 0; + + if ( hinting ) + builder->hints_funcs = glyph->internal->glyph_hints; + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + + builder->funcs = t1_builder_funcs; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_builder_done */ + /* */ + /* <Description> */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* <Input> */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + FT_LOCAL_DEF( void ) + t1_builder_done( T1_Builder builder ) + { + FT_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + + + if ( builder->shift ) + { + x >>= 16; + y >>= 16; + } + point->x = x; + point->y = y; + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + + builder->last = *point; + } + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = t1_builder_check_points( builder, 1 ); + if ( !error ) + t1_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + if ( !builder->load_points ) + { + outline->n_contours++; + return PSaux_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = PSaux_Err_Invalid_File_Format; + + + /* test whether we are building a new contour */ + + if ( builder->parse_state == T1_Parse_Have_Path ) + error = PSaux_Err_Ok; + else if ( builder->parse_state == T1_Parse_Have_Moveto ) + { + builder->parse_state = T1_Parse_Have_Path; + error = t1_builder_add_contour( builder ); + if ( !error ) + error = t1_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + t1_builder_close_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether begin point and last point are the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ) + { + PS_Conv_EexecDecode( &buffer, + buffer + length, + buffer, + length, + &seed ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/psobjs.h b/src/3rdparty/freetype/src/psaux/psobjs.h new file mode 100644 index 0000000000..c2cbf2c79b --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/psobjs.h @@ -0,0 +1,212 @@ +/***************************************************************************/ +/* */ +/* psobjs.h */ +/* */ +/* Auxiliary functions for PostScript fonts (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSOBJS_H__ +#define __PSOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE + const PS_Table_FuncsRec ps_table_funcs; + + FT_CALLBACK_TABLE + const PS_Parser_FuncsRec ps_parser_funcs; + + FT_CALLBACK_TABLE + const T1_Builder_FuncsRec t1_builder_funcs; + + + FT_LOCAL( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ); + + FT_LOCAL( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ); + + FT_LOCAL( void ) + ps_table_done( PS_Table table ); + + + FT_LOCAL( void ) + ps_table_release( PS_Table table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL( void ) + ps_parser_skip_spaces( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_skip_PS_token( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ); + + FT_LOCAL( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Long ) + ps_parser_to_int( PS_Parser parser ); + + + FT_LOCAL( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Long max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + + FT_LOCAL( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ); + + + FT_LOCAL( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + + FT_LOCAL( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + + FT_LOCAL( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + FT_LOCAL( void ) + ps_parser_done( PS_Parser parser ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ); + + FT_LOCAL( void ) + t1_builder_done( T1_Builder builder ); + + FT_LOCAL( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ); + + FT_LOCAL( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + FT_LOCAL( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( FT_Error ) + t1_builder_add_contour( T1_Builder builder ); + + + FT_LOCAL( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + + FT_LOCAL( void ) + t1_builder_close_contour( T1_Builder builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + +FT_END_HEADER + +#endif /* __PSOBJS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/rules.mk b/src/3rdparty/freetype/src/psaux/rules.mk new file mode 100644 index 0000000000..7a1be37b69 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 PSaux driver configuration rules +# + + +# Copyright 1996-2000, 2002, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# PSAUX driver directory +# +PSAUX_DIR := $(SRC_DIR)/psaux + + +# compilation flags for the driver +# +PSAUX_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR)) + + +# PSAUX driver sources (i.e., C files) +# +PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c \ + $(PSAUX_DIR)/t1decode.c \ + $(PSAUX_DIR)/t1cmap.c \ + $(PSAUX_DIR)/afmparse.c \ + $(PSAUX_DIR)/psconv.c \ + $(PSAUX_DIR)/psauxmod.c + +# PSAUX driver headers +# +PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h) \ + $(PSAUX_DIR)/psauxerr.h + + +# PSAUX driver object(s) +# +# PSAUX_DRV_OBJ_M is used during `multi' builds. +# PSAUX_DRV_OBJ_S is used during `single' builds. +# +PSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O + +# PSAUX driver source file for single build +# +PSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c + + +# PSAUX driver - single object +# +$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \ + $(FREETYPE_H) $(PSAUX_DRV_H) + $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S)) + + +# PSAUX driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H) + $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSAUX_DRV_OBJ_S) +DRV_OBJS_M += $(PSAUX_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/psaux/t1cmap.c b/src/3rdparty/freetype/src/psaux/t1cmap.c new file mode 100644 index 0000000000..67a23db569 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/t1cmap.c @@ -0,0 +1,341 @@ +/***************************************************************************/ +/* */ +/* t1cmap.c */ +/* */ +/* Type 1 character map support (body). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "t1cmap.h" + +#include FT_INTERNAL_DEBUG_H + +#include "psauxerr.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_cmap_std_init( T1_CMapStd cmap, + FT_Int is_expert ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + cmap->num_glyphs = face->type1.num_glyphs; + cmap->glyph_names = (const char* const*)face->type1.glyph_names; + cmap->sid_to_string = psnames->adobe_std_strings; + cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding + : psnames->adobe_std_encoding; + + FT_ASSERT( cmap->code_to_sid != NULL ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_std_done( T1_CMapStd cmap ) + { + cmap->num_glyphs = 0; + cmap->glyph_names = NULL; + cmap->sid_to_string = NULL; + cmap->code_to_sid = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_std_char_index( T1_CMapStd cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( char_code < 256 ) + { + FT_UInt code, n; + const char* glyph_name; + + + /* convert character code to Adobe SID string */ + code = cmap->code_to_sid[char_code]; + glyph_name = cmap->sid_to_string( code ); + + /* look for the corresponding glyph name */ + for ( n = 0; n < cmap->num_glyphs; n++ ) + { + const char* gname = cmap->glyph_names[n]; + + + if ( gname && gname[0] == glyph_name[0] && + ft_strcmp( gname, glyph_name ) == 0 ) + { + result = n; + break; + } + } + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_std_char_next( T1_CMapStd cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + while ( char_code < 256 ) + { + result = t1_cmap_std_char_index( cmap, char_code ); + if ( result != 0 ) + goto Exit; + + char_code++; + } + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_standard_init( T1_CMapStd cmap ) + { + t1_cmap_std_init( cmap, 0 ); + return 0; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_standard_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_standard_init, + (FT_CMap_DoneFunc) t1_cmap_std_done, + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_expert_init( T1_CMapStd cmap ) + { + t1_cmap_std_init( cmap, 1 ); + return 0; + } + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_expert_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_expert_init, + (FT_CMap_DoneFunc) t1_cmap_std_done, + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_custom_init( T1_CMapCustom cmap ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + T1_Encoding encoding = &face->type1.encoding; + + + cmap->first = encoding->code_first; + cmap->count = (FT_UInt)( encoding->code_last - cmap->first + 1 ); + cmap->indices = encoding->char_index; + + FT_ASSERT( cmap->indices != NULL ); + FT_ASSERT( encoding->code_first <= encoding->code_last ); + + return 0; + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_custom_done( T1_CMapCustom cmap ) + { + cmap->indices = NULL; + cmap->first = 0; + cmap->count = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_custom_char_index( T1_CMapCustom cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( ( char_code >= cmap->first ) && + ( char_code < ( cmap->first + cmap->count ) ) ) + result = cmap->indices[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_custom_char_next( T1_CMapCustom cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + ++char_code; + + if ( char_code < cmap->first ) + char_code = cmap->first; + + for ( ; char_code < ( cmap->first + cmap->count ); char_code++ ) + { + result = cmap->indices[char_code]; + if ( result != 0 ) + goto Exit; + } + + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_custom_class_rec = + { + sizeof ( T1_CMapCustomRec ), + + (FT_CMap_InitFunc) t1_cmap_custom_init, + (FT_CMap_DoneFunc) t1_cmap_custom_done, + (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, + (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char * ) + t1_get_glyph_name( T1_Face face, + FT_UInt idx ) + { + return face->type1.glyph_names[idx]; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_unicode_init( PS_Unicodes unicodes ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_init( memory, + unicodes, + face->type1.num_glyphs, + (PS_GetGlyphNameFunc)&t1_get_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_unicode_class_rec = + { + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) t1_cmap_unicode_init, + (FT_CMap_DoneFunc) t1_cmap_unicode_done, + (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, + (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/t1cmap.h b/src/3rdparty/freetype/src/psaux/t1cmap.h new file mode 100644 index 0000000000..7ae65d2fa1 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/t1cmap.h @@ -0,0 +1,105 @@ +/***************************************************************************/ +/* */ +/* t1cmap.h */ +/* */ +/* Type 1 character map support (specification). */ +/* */ +/* Copyright 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1CMAP_H__ +#define __T1CMAP_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct T1_CMapStdRec_* T1_CMapStd; + + typedef struct T1_CMapStdRec_ + { + FT_CMapRec cmap; + + const FT_UShort* code_to_sid; + PS_Adobe_Std_StringsFunc sid_to_string; + + FT_UInt num_glyphs; + const char* const* glyph_names; + + } T1_CMapStdRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_standard_class_rec; + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_expert_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct T1_CMapCustomRec_* T1_CMapCustom; + + typedef struct T1_CMapCustomRec_ + { + FT_CMapRec cmap; + FT_UInt first; + FT_UInt count; + FT_UShort* indices; + + } T1_CMapCustomRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_custom_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_unicode_class_rec; + + /* */ + + +FT_END_HEADER + +#endif /* __T1CMAP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/t1decode.c b/src/3rdparty/freetype/src/psaux/t1decode.c new file mode 100644 index 0000000000..bda2324d78 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/t1decode.c @@ -0,0 +1,1474 @@ +/***************************************************************************/ +/* */ +/* t1decode.c */ +/* */ +/* PostScript Type 1 decoding routines (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_OUTLINE_H + +#include "t1decode.h" +#include "psobjs.h" + +#include "psauxerr.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1decode + + + typedef enum T1_Operator_ + { + op_none = 0, + op_endchar, + op_hsbw, + op_seac, + op_sbw, + op_closepath, + op_hlineto, + op_hmoveto, + op_hvcurveto, + op_rlineto, + op_rmoveto, + op_rrcurveto, + op_vhcurveto, + op_vlineto, + op_vmoveto, + op_dotsection, + op_hstem, + op_hstem3, + op_vstem, + op_vstem3, + op_div, + op_callothersubr, + op_callsubr, + op_pop, + op_return, + op_setcurrentpoint, + op_unknown15, + + op_max /* never remove this one */ + + } T1_Operator; + + + static + const FT_Int t1_args_count[op_max] = + { + 0, /* none */ + 0, /* endchar */ + 2, /* hsbw */ + 5, /* seac */ + 4, /* sbw */ + 0, /* closepath */ + 1, /* hlineto */ + 1, /* hmoveto */ + 4, /* hvcurveto */ + 2, /* rlineto */ + 2, /* rmoveto */ + 6, /* rrcurveto */ + 4, /* vhcurveto */ + 1, /* vlineto */ + 1, /* vmoveto */ + 0, /* dotsection */ + 2, /* hstem */ + 6, /* hstem3 */ + 2, /* vstem */ + 6, /* vstem3 */ + 2, /* div */ + -1, /* callothersubr */ + 1, /* callsubr */ + 0, /* pop */ + 0, /* return */ + 2, /* setcurrentpoint */ + 2 /* opcode 15 (undocumented and obsolete) */ + }; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_lookup_glyph_by_stdcharcode */ + /* */ + /* <Description> */ + /* Looks up a given glyph by its StandardEncoding charcode. Used to */ + /* implement the SEAC Type 1 operator. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* charcode :: The character code to look for. */ + /* */ + /* <Return> */ + /* A glyph index in the font face. Returns -1 if the corresponding */ + /* glyph wasn't found. */ + /* */ + static FT_Int + t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, + FT_Int charcode ) + { + FT_UInt n; + const FT_String* glyph_name; + FT_Service_PsCMaps psnames = decoder->psnames; + + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + glyph_name = psnames->adobe_std_strings( + psnames->adobe_std_encoding[charcode]); + + for ( n = 0; n < decoder->num_glyphs; n++ ) + { + FT_String* name = (FT_String*)decoder->glyph_names[n]; + + + if ( name && name[0] == glyph_name[0] && + ft_strcmp( name, glyph_name ) == 0 ) + return n; + } + + return -1; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1operator_seac */ + /* */ + /* <Description> */ + /* Implements the `seac' Type 1 operator for a Type 1 decoder. */ + /* */ + /* <Input> */ + /* decoder :: The current CID decoder. */ + /* */ + /* asb :: The accent's side bearing. */ + /* */ + /* adx :: The horizontal offset of the accent. */ + /* */ + /* ady :: The vertical offset of the accent. */ + /* */ + /* bchar :: The base character's StandardEncoding charcode. */ + /* */ + /* achar :: The accent character's StandardEncoding charcode. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + t1operator_seac( T1_Decoder decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + FT_Int bchar_index, achar_index; +#if 0 + FT_Int n_base_points; + FT_Outline* base = decoder->builder.base; +#endif + FT_Vector left_bearing, advance; + + + /* seac weirdness */ + adx += decoder->builder.left_bearing.x; + + /* `glyph_names' is set to 0 for CID fonts which do not */ + /* include an encoding. How can we deal with these? */ + if ( decoder->glyph_names == 0 ) + { + FT_ERROR(( "t1operator_seac:" )); + FT_ERROR(( " glyph names table not available in this font!\n" )); + return PSaux_Err_Syntax_Error; + } + + bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar ); + achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar ); + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "t1operator_seac:" )); + FT_ERROR(( " invalid seac character code arguments\n" )); + return PSaux_Err_Syntax_Error; + } + + /* if we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( decoder->builder.no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)( adx - asb ); + subg->arg2 = (FT_Int)ady; + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + goto Exit; + } + + /* First load `bchar' in builder */ + /* now load the unscaled outline */ + + FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ + + error = t1_decoder_parse_glyph( decoder, bchar_index ); + if ( error ) + goto Exit; + + /* save the left bearing and width of the base character */ + /* as they will be erased by the next load. */ + + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + + decoder->builder.left_bearing.x = 0; + decoder->builder.left_bearing.y = 0; + + decoder->builder.pos_x = adx - asb; + decoder->builder.pos_y = ady; + + /* Now load `achar' on top of */ + /* the base outline */ + error = t1_decoder_parse_glyph( decoder, achar_index ); + if ( error ) + goto Exit; + + /* restore the left side bearing and */ + /* advance width of the base character */ + + decoder->builder.left_bearing = left_bearing; + decoder->builder.advance = advance; + + decoder->builder.pos_x = 0; + decoder->builder.pos_y = 0; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_decoder_parse_charstrings */ + /* */ + /* <Description> */ + /* Parses a given Type 1 charstrings program. */ + /* */ + /* <Input> */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* charstring_base :: The base address of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ) + { + FT_Error error; + T1_Decoder_Zone zone; + FT_Byte* ip; + FT_Byte* limit; + T1_Builder builder = &decoder->builder; + FT_Pos x, y, orig_x, orig_y; + FT_Int known_othersubr_result_cnt = 0; + FT_Int unknown_othersubr_result_cnt = 0; + + T1_Hints_Funcs hinter; + + + /* we don't want to touch the source code -- use macro trick */ +#define start_point t1_builder_start_point +#define check_points t1_builder_check_points +#define add_point t1_builder_add_point +#define add_point1 t1_builder_add_point1 +#define add_contour t1_builder_add_contour +#define close_contour t1_builder_close_contour + + /* First of all, initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + + builder->parse_state = T1_Parse_Start; + + hinter = (T1_Hints_Funcs)builder->hints_funcs; + + /* a font that reads BuildCharArray without setting */ + /* its values first is buggy, but ... */ + FT_ASSERT( ( decoder->len_buildchar == 0 ) == + ( decoder->buildchar == NULL ) ); + + if ( decoder->len_buildchar > 0 ) + ft_memset( &decoder->buildchar[0], + 0, + sizeof( decoder->buildchar[0] ) * decoder->len_buildchar ); + + FT_TRACE4(( "\nStart charstring\n" )); + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = PSaux_Err_Ok; + + x = orig_x = builder->pos_x; + y = orig_y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Long value = 0; + + + FT_ASSERT( known_othersubr_result_cnt == 0 || + unknown_othersubr_result_cnt == 0 ); + + FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); + + /*********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + /* */ + + /* first of all, decompress operator or value */ + switch ( *ip++ ) + { + case 1: + op = op_hstem; + break; + + case 3: + op = op_vstem; + break; + case 4: + op = op_vmoveto; + break; + case 5: + op = op_rlineto; + break; + case 6: + op = op_hlineto; + break; + case 7: + op = op_vlineto; + break; + case 8: + op = op_rrcurveto; + break; + case 9: + op = op_closepath; + break; + case 10: + op = op_callsubr; + break; + case 11: + op = op_return; + break; + + case 13: + op = op_hsbw; + break; + case 14: + op = op_endchar; + break; + + case 15: /* undocumented, obsolete operator */ + op = op_unknown15; + break; + + case 21: + op = op_rmoveto; + break; + case 22: + op = op_hmoveto; + break; + + case 30: + op = op_vhcurveto; + break; + case 31: + op = op_hvcurveto; + break; + + case 12: + if ( ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "invalid escape (12+EOF)\n" )); + goto Syntax_Error; + } + + switch ( *ip++ ) + { + case 0: + op = op_dotsection; + break; + case 1: + op = op_vstem3; + break; + case 2: + op = op_hstem3; + break; + case 6: + op = op_seac; + break; + case 7: + op = op_sbw; + break; + case 12: + op = op_div; + break; + case 16: + op = op_callothersubr; + break; + case 17: + op = op_pop; + break; + case 33: + op = op_setcurrentpoint; + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings: " + "invalid escape (12+%d)\n", + ip[-1] )); + goto Syntax_Error; + } + break; + + case 255: /* four bytes integer */ + if ( ip + 4 > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + value = (FT_Int32)( ((FT_Long)ip[0] << 24) | + ((FT_Long)ip[1] << 16) | + ((FT_Long)ip[2] << 8 ) | + ip[3] ); + ip += 4; + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Long)ip[-1] - 139; + else + { + if ( ++ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " )); + FT_ERROR(( "unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ( ( (FT_Long)ip[-2] - 247 ) << 8 ) + ip[-1] + 108; + else + value = -( ( ( (FT_Long)ip[-2] - 251 ) << 8 ) + ip[-1] + 108 ); + } + } + else + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "invalid byte (%d)\n", ip[-1] )); + goto Syntax_Error; + } + } + + if ( unknown_othersubr_result_cnt > 0 ) + { + switch ( op ) + { + case op_callsubr: + case op_return: + case op_none: + case op_pop: + break; + + default: + /* all operands have been transferred by previous pops */ + unknown_othersubr_result_cnt = 0; + break; + } + } + + /*********************************************************************/ + /* */ + /* Push value on stack, or process operator */ + /* */ + /* */ + if ( op == op_none ) + { + if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow!\n" )); + goto Syntax_Error; + } + + FT_TRACE4(( " %ld", value )); + + *top++ = value; + decoder->top = top; + } + else if ( op == op_callothersubr ) /* callothersubr */ + { + FT_Int subr_no; + FT_Int arg_cnt; + + + FT_TRACE4(( " callothersubr" )); + + if ( top - decoder->stack < 2 ) + goto Stack_Underflow; + + top -= 2; + + subr_no = (FT_Int)top[1]; + arg_cnt = (FT_Int)top[0]; + + /***********************************************************/ + /* */ + /* remove all operands to callothersubr from the stack */ + /* */ + /* for handled othersubrs, where we know the number of */ + /* arguments, we increase the stack by the value of */ + /* known_othersubr_result_cnt */ + /* */ + /* for unhandled othersubrs the following pops adjust the */ + /* stack pointer as necessary */ + + if ( arg_cnt > top - decoder->stack ) + goto Stack_Underflow; + + top -= arg_cnt; + + known_othersubr_result_cnt = 0; + unknown_othersubr_result_cnt = 0; + + /* XXX TODO: The checks to `arg_count == <whatever>' */ + /* might not be correct; an othersubr expects a certain */ + /* number of operands on the PostScript stack (as opposed */ + /* to the T1 stack) but it doesn't have to put them there */ + /* by itself; previous othersubrs might have left the */ + /* operands there if they were not followed by an */ + /* appropriate number of pops */ + /* */ + /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */ + /* accept a font that contains charstrings like */ + /* */ + /* 100 200 2 20 callothersubr */ + /* 300 1 20 callothersubr pop */ + /* */ + /* Perhaps this is the reason why BuildCharArray exists. */ + + switch ( subr_no ) + { + case 1: /* start flex feature */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + if ( start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + break; + + case 2: /* add flex vectors */ + { + FT_Int idx; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + /* note that we should not add a point for index 0; */ + /* this will move our current position to the flex */ + /* point without adding any point to the outline */ + idx = decoder->num_flex_vectors++; + if ( idx > 0 && idx < 7 ) + add_point( builder, + x, + y, + (FT_Byte)( idx == 3 || idx == 6 ) ); + } + break; + + case 0: /* end flex feature */ + if ( arg_cnt != 3 ) + goto Unexpected_OtherSubr; + + if ( decoder->flex_state == 0 || + decoder->num_flex_vectors != 7 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "unexpected flex end\n" )); + goto Syntax_Error; + } + + /* the two `results' are popped by the following setcurrentpoint */ + known_othersubr_result_cnt = 2; + break; + + case 3: /* change hints */ + if ( arg_cnt != 1 ) + goto Unexpected_OtherSubr; + + known_othersubr_result_cnt = 1; + + if ( hinter ) + hinter->reset( hinter->hints, builder->current->n_points ); + + break; + + case 12: + case 13: + /* counter control hints, clear stack */ + top = decoder->stack; + break; + + case 14: + case 15: + case 16: + case 17: + case 18: /* multiple masters */ + { + PS_Blend blend = decoder->blend; + FT_UInt num_points, nn, mm; + FT_Long* delta; + FT_Long* values; + + + if ( !blend ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " )); + FT_ERROR(( "unexpected multiple masters operator!\n" )); + goto Syntax_Error; + } + + num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 ); + if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " )); + FT_ERROR(( "incorrect number of mm arguments\n" )); + goto Syntax_Error; + } + + /* we want to compute: */ + /* */ + /* a0*w0 + a1*w1 + ... + ak*wk */ + /* */ + /* but we only have the a0, a1-a0, a2-a0, .. ak-a0 */ + /* however, given that w0 + w1 + ... + wk == 1, we can */ + /* rewrite it easily as: */ + /* */ + /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + .. + (ak-a0)*wk */ + /* */ + /* where k == num_designs-1 */ + /* */ + /* I guess that's why it's written in this `compact' */ + /* form. */ + /* */ + delta = top + num_points; + values = top; + for ( nn = 0; nn < num_points; nn++ ) + { + FT_Long tmp = values[0]; + + + for ( mm = 1; mm < blend->num_designs; mm++ ) + tmp += FT_MulFix( *delta++, blend->weight_vector[mm] ); + + *values++ = tmp; + } + + known_othersubr_result_cnt = num_points; + break; + } + +#ifdef CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS + + /* We cannot yet enable these since currently */ + /* our T1 stack stores integers which lack the */ + /* precision to express the values */ + + case 19: + /* <idx> 1 19 callothersubr */ + /* => replace elements starting from index cvi( <idx> ) */ + /* of BuildCharArray with WeightVector */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = top[0]; + + if ( idx < 0 || + idx + blend->num_designs > decoder->face->len_buildchar ) + goto Unexpected_OtherSubr; + + ft_memcpy( &decoder->buildchar[idx], + blend->weight_vector, + blend->num_designs * + sizeof( blend->weight_vector[0] ) ); + } + break; + + case 20: + /* <arg1> <arg2> 2 20 callothersubr pop */ + /* ==> push <arg1> + <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] += top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + + case 21: + /* <arg1> <arg2> 2 21 callothersubr pop */ + /* ==> push <arg1> - <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] -= top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + + case 22: + /* <arg1> <arg2> 2 22 callothersubr pop */ + /* ==> push <arg1> * <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] *= top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + + case 23: + /* <arg1> <arg2> 2 23 callothersubr pop */ + /* ==> push <arg1> / <arg2> onto T1 stack */ + if ( arg_cnt != 2 || top[1] == 0 ) + goto Unexpected_OtherSubr; + + top[0] /= top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + +#endif /* CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS */ + + case 24: + /* <val> <idx> 2 24 callothersubr */ + /* => set BuildCharArray[cvi( <idx> )] = <val> */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + if ( arg_cnt != 2 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = top[1]; + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + decoder->buildchar[idx] = top[0]; + } + break; + + case 25: + /* <idx> 1 25 callothersubr pop */ + /* => push BuildCharArray[cvi( idx )] */ + /* onto T1 stack */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + if ( arg_cnt != 1 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = top[0]; + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + top[0] = decoder->buildchar[idx]; + } + + known_othersubr_result_cnt = 1; + break; + +#if 0 + case 26: + /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */ + /* leave mark on T1 stack */ + /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */ + XXX who has left his mark on the (PostScript) stack ?; + break; +#endif + + case 27: + /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */ + /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */ + /* otherwise push <res2> */ + if ( arg_cnt != 4 ) + goto Unexpected_OtherSubr; + + if ( top[2] > top[3] ) + top[0] = top[1]; + + known_othersubr_result_cnt = 1; + break; + +#ifdef CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS + case 28: + /* 0 28 callothersubr pop */ + /* => push random value from interval [0, 1) onto stack */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + top[0] = FT_rand(); + known_othersubr_result_cnt = 1; + break; +#endif + + default: + FT_ERROR(( "t1_decoder_parse_charstrings: " + "unknown othersubr [%d %d], wish me luck!\n", + arg_cnt, subr_no )); + unknown_othersubr_result_cnt = arg_cnt; + break; + + Unexpected_OtherSubr: + FT_ERROR(( "t1_decoder_parse_charstrings: " + "invalid othersubr [%d %d]!\n", arg_cnt, subr_no )); + goto Syntax_Error; + } + + top += known_othersubr_result_cnt; + + decoder->top = top; + } + else /* general operator */ + { + FT_Int num_args = t1_args_count[op]; + + + FT_ASSERT( num_args >= 0 ); + + if ( top - decoder->stack < num_args ) + goto Stack_Underflow; + + /* XXX Operators usually take their operands from the */ + /* bottom of the stack, i.e., the operands are */ + /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */ + /* only div, callsubr, and callothersubr are different. */ + /* In practice it doesn't matter (?). */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + switch ( op ) + { + case op_callsubr: + case op_div: + case op_callothersubr: + case op_pop: + case op_return: + break; + + default: + if ( top - decoder->stack != num_args ) + FT_TRACE0(( "t1_decoder_parse_charstrings: " + "too much operands on the stack " + "(seen %d, expected %d)\n", + top - decoder->stack, num_args )); + break; + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + top -= num_args; + + switch ( op ) + { + case op_endchar: + FT_TRACE4(( " endchar" )); + + close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if (hinter->close( hinter->hints, builder->current->n_points )) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + hinter->apply( hinter->hints, + builder->current, + (PSH_Globals) builder->hints_globals, + decoder->hint_mode ); + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + FT_TRACE4(( "\n" )); + + /* the compiler should optimize away this empty loop but ... */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( decoder->len_buildchar > 0 ) + { + FT_UInt i; + + + FT_TRACE4(( "BuildCharArray = [ " )); + + for ( i = 0; i < decoder->len_buildchar; ++i ) + FT_TRACE4(( "%d ", decoder->buildchar[ i ] )); + + FT_TRACE4(( "]\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + FT_TRACE4(( "\n" )); + + /* return now! */ + return PSaux_Err_Ok; + + case op_hsbw: + FT_TRACE4(( " hsbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x += top[0]; + builder->advance.x = top[1]; + builder->advance.y = 0; + + orig_x = builder->last.x = x = builder->pos_x + top[0]; + orig_y = builder->last.y = y = builder->pos_y; + + FT_UNUSED( orig_y ); + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + return PSaux_Err_Ok; + + break; + + case op_seac: + /* return immediately after the processing */ + return t1operator_seac( decoder, top[0], top[1], top[2], + (FT_Int)top[3], (FT_Int)top[4] ); + + case op_sbw: + FT_TRACE4(( " sbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x += top[0]; + builder->left_bearing.y += top[1]; + builder->advance.x = top[2]; + builder->advance.y = top[3]; + + builder->last.x = x = builder->pos_x + top[0]; + builder->last.y = y = builder->pos_y + top[1]; + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + return PSaux_Err_Ok; + + break; + + case op_closepath: + FT_TRACE4(( " closepath" )); + + /* if there is no path, `closepath' is a no-op */ + if ( builder->parse_state == T1_Parse_Have_Path || + builder->parse_state == T1_Parse_Have_Moveto ) + close_contour( builder ); + + builder->parse_state = T1_Parse_Have_Width; + break; + + case op_hlineto: + FT_TRACE4(( " hlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + x += top[0]; + goto Add_Line; + + case op_hmoveto: + FT_TRACE4(( " hmoveto" )); + + x += top[0]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_hvcurveto: + FT_TRACE4(( " hvcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + x += top[0]; + add_point( builder, x, y, 0 ); + x += top[1]; + y += top[2]; + add_point( builder, x, y, 0 ); + y += top[3]; + add_point( builder, x, y, 1 ); + break; + + case op_rlineto: + FT_TRACE4(( " rlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + x += top[0]; + y += top[1]; + + Add_Line: + if ( add_point1( builder, x, y ) ) + goto Fail; + break; + + case op_rmoveto: + FT_TRACE4(( " rmoveto" )); + + x += top[0]; + y += top[1]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_rrcurveto: + FT_TRACE4(( " rcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + x += top[0]; + y += top[1]; + add_point( builder, x, y, 0 ); + + x += top[2]; + y += top[3]; + add_point( builder, x, y, 0 ); + + x += top[4]; + y += top[5]; + add_point( builder, x, y, 1 ); + break; + + case op_vhcurveto: + FT_TRACE4(( " vhcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + y += top[0]; + add_point( builder, x, y, 0 ); + x += top[1]; + y += top[2]; + add_point( builder, x, y, 0 ); + x += top[3]; + add_point( builder, x, y, 1 ); + break; + + case op_vlineto: + FT_TRACE4(( " vlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + y += top[0]; + goto Add_Line; + + case op_vmoveto: + FT_TRACE4(( " vmoveto" )); + + y += top[0]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_div: + FT_TRACE4(( " div" )); + + if ( top[1] ) + { + *top = top[0] / top[1]; + ++top; + } + else + { + FT_ERROR(( "t1_decoder_parse_charstrings: division by 0\n" )); + goto Syntax_Error; + } + break; + + case op_callsubr: + { + FT_Int idx; + + + FT_TRACE4(( " callsubr" )); + + idx = (FT_Int)top[0]; + if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + zone->base = decoder->subrs[idx]; + + if ( decoder->subrs_len ) + zone->limit = zone->base + decoder->subrs_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + zone->limit = decoder->subrs[idx + 1]; + } + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "invoking empty subrs!\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + break; + } + + case op_pop: + FT_TRACE4(( " pop" )); + + if ( known_othersubr_result_cnt > 0 ) + { + known_othersubr_result_cnt--; + /* ignore, we pushed the operands ourselves */ + break; + } + + if ( unknown_othersubr_result_cnt == 0 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " + "no more operands for othersubr!\n" )); + goto Syntax_Error; + } + + unknown_othersubr_result_cnt--; + top++; /* `push' the operand to callothersubr onto the stack */ + break; + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: unexpected return\n" )); + goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + + case op_dotsection: + FT_TRACE4(( " dotsection" )); + + break; + + case op_hstem: + FT_TRACE4(( " hstem" )); + + /* record horizontal hint */ + if ( hinter ) + { + /* top[0] += builder->left_bearing.y; */ + hinter->stem( hinter->hints, 1, top ); + } + + break; + + case op_hstem3: + FT_TRACE4(( " hstem3" )); + + /* record horizontal counter-controlled hints */ + if ( hinter ) + hinter->stem3( hinter->hints, 1, top ); + + break; + + case op_vstem: + FT_TRACE4(( " vstem" )); + + /* record vertical hint */ + if ( hinter ) + { + top[0] += orig_x; + hinter->stem( hinter->hints, 0, top ); + } + + break; + + case op_vstem3: + FT_TRACE4(( " vstem3" )); + + /* record vertical counter-controlled hints */ + if ( hinter ) + { + FT_Pos dx = orig_x; + + + top[0] += dx; + top[2] += dx; + top[4] += dx; + hinter->stem3( hinter->hints, 0, top ); + } + break; + + case op_setcurrentpoint: + FT_TRACE4(( " setcurrentpoint" )); + + /* From the T1 specs, section 6.4: */ + /* */ + /* The setcurrentpoint command is used only in */ + /* conjunction with results from OtherSubrs procedures. */ + + /* known_othersubr_result_cnt != 0 is already handled above */ + if ( decoder->flex_state != 1 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: " )); + FT_ERROR(( "unexpected `setcurrentpoint'\n" )); + + goto Syntax_Error; + } + else + decoder->flex_state = 0; + break; + + case op_unknown15: + FT_TRACE4(( " opcode_15" )); + /* nothing to do except to pop the two arguments */ + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings: " + "unhandled opcode %d\n", op )); + goto Syntax_Error; + } + + /* XXX Operators usually clear the operand stack; */ + /* only div, callsubr, callothersubr, pop, and */ + /* return are different. */ + /* In practice it doesn't matter (?). */ + + decoder->top = top; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + Fail: + return error; + + Syntax_Error: + return PSaux_Err_Syntax_Error; + + Stack_Underflow: + return PSaux_Err_Stack_Underflow; + } + + + /* parse a single Type 1 glyph */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph ) + { + return decoder->parse_callback( decoder, glyph ); + } + + + /* initialize T1 decoder */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_callback ) + { + FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); + + /* retrieve PSNames interface from list of current modules */ + { + FT_Service_PsCMaps psnames = 0; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + { + FT_ERROR(( "t1_decoder_init: " )); + FT_ERROR(( "the `psnames' module is not available\n" )); + return PSaux_Err_Unimplemented_Feature; + } + + decoder->psnames = psnames; + } + + t1_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* decoder->buildchar and decoder->len_buildchar have to be */ + /* initialized by the caller since we cannot know the length */ + /* of the BuildCharArray */ + + decoder->num_glyphs = (FT_UInt)face->num_glyphs; + decoder->glyph_names = glyph_names; + decoder->hint_mode = hint_mode; + decoder->blend = blend; + decoder->parse_callback = parse_callback; + + decoder->funcs = t1_decoder_funcs; + + return PSaux_Err_Ok; + } + + + /* finalize T1 decoder */ + FT_LOCAL_DEF( void ) + t1_decoder_done( T1_Decoder decoder ) + { + t1_builder_done( &decoder->builder ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/psaux/t1decode.h b/src/3rdparty/freetype/src/psaux/t1decode.h new file mode 100644 index 0000000000..00728db501 --- /dev/null +++ b/src/3rdparty/freetype/src/psaux/t1decode.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* t1decode.h */ +/* */ +/* PostScript Type 1 decoding routines (specification). */ +/* */ +/* Copyright 2000-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1DECODE_H__ +#define __T1DECODE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + FT_CALLBACK_TABLE + const T1_Decoder_FuncsRec t1_decoder_funcs; + + + FT_LOCAL( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph_index ); + + FT_LOCAL( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); + + FT_LOCAL( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_glyph ); + + FT_LOCAL( void ) + t1_decoder_done( T1_Decoder decoder ); + + +FT_END_HEADER + +#endif /* __T1DECODE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/Jamfile b/src/3rdparty/freetype/src/pshinter/Jamfile new file mode 100644 index 0000000000..769dcc4b29 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/pshinter Jamfile +# +# Copyright 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) pshinter ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = pshrec pshglob pshalgo pshmod ; + } + else + { + _sources = pshinter ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/pshinter Jamfile diff --git a/src/3rdparty/freetype/src/pshinter/module.mk b/src/3rdparty/freetype/src/pshinter/module.mk new file mode 100644 index 0000000000..ed24eb7fa8 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSHinter module definition +# + + +# Copyright 1996-2001, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSHINTER_MODULE + +define PSHINTER_MODULE +$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pshinter $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/pshinter/pshalgo.c b/src/3rdparty/freetype/src/pshinter/pshalgo.c new file mode 100644 index 0000000000..f9ab3dae58 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshalgo.c @@ -0,0 +1,2302 @@ +/***************************************************************************/ +/* */ +/* pshalgo.c */ +/* */ +/* PostScript hinting algorithm (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include "pshalgo.h" + +#include "pshnterr.h" + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pshalgo2 + + +#ifdef DEBUG_HINTER + PSH_Hint_Table ps_debug_hint_table = 0; + PSH_HintFunc ps_debug_hint_func = 0; + PSH_Glyph ps_debug_glyph = 0; +#endif + + +#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ + /* and similar glyphs */ +#define STRONGER /* slightly increase the contrast of smooth */ + /* hinting */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC HINTS RECORDINGS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* return true if two stem hints overlap */ + static FT_Int + psh_hint_overlap( PSH_Hint hint1, + PSH_Hint hint2 ) + { + return hint1->org_pos + hint1->org_len >= hint2->org_pos && + hint2->org_pos + hint2->org_len >= hint1->org_pos; + } + + + /* destroy hints table */ + static void + psh_hint_table_done( PSH_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->zones ); + table->num_zones = 0; + table->zone = 0; + + FT_FREE( table->sort ); + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + table->sort_global = 0; + } + + + /* deactivate all hints in a table */ + static void + psh_hint_table_deactivate( PSH_Hint_Table table ) + { + FT_UInt count = table->max_hints; + PSH_Hint hint = table->hints; + + + for ( ; count > 0; count--, hint++ ) + { + psh_hint_deactivate( hint ); + hint->order = -1; + } + } + + + /* internal function to record a new hint */ + static void + psh_hint_table_record( PSH_Hint_Table table, + FT_UInt idx ) + { + PSH_Hint hint = table->hints + idx; + + + if ( idx >= table->max_hints ) + { + FT_ERROR(( "psh_hint_table_record: invalid hint index %d\n", idx )); + return; + } + + /* ignore active hints */ + if ( psh_hint_is_active( hint ) ) + return; + + psh_hint_activate( hint ); + + /* now scan the current active hint set to check */ + /* whether `hint' overlaps with another hint */ + { + PSH_Hint* sorted = table->sort_global; + FT_UInt count = table->num_hints; + PSH_Hint hint2; + + + hint->parent = 0; + for ( ; count > 0; count--, sorted++ ) + { + hint2 = sorted[0]; + + if ( psh_hint_overlap( hint, hint2 ) ) + { + hint->parent = hint2; + break; + } + } + } + + if ( table->num_hints < table->max_hints ) + table->sort_global[table->num_hints++] = hint; + else + FT_ERROR(( "psh_hint_table_record: too many sorted hints! BUG!\n" )); + } + + + static void + psh_hint_table_record_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit; + + + limit = hint_mask->num_bits; + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + psh_hint_table_record( table, idx ); + + mask >>= 1; + } + } + + + /* create hints table */ + static FT_Error + psh_hint_table_init( PSH_Hint_Table table, + PS_Hint_Table hints, + PS_Mask_Table hint_masks, + PS_Mask_Table counter_masks, + FT_Memory memory ) + { + FT_UInt count; + FT_Error error; + + FT_UNUSED( counter_masks ); + + + count = hints->num_hints; + + /* allocate our tables */ + if ( FT_NEW_ARRAY( table->sort, 2 * count ) || + FT_NEW_ARRAY( table->hints, count ) || + FT_NEW_ARRAY( table->zones, 2 * count + 1 ) ) + goto Exit; + + table->max_hints = count; + table->sort_global = table->sort + count; + table->num_hints = 0; + table->num_zones = 0; + table->zone = 0; + + /* initialize the `table->hints' array */ + { + PSH_Hint write = table->hints; + PS_Hint read = hints->hints; + + + for ( ; count > 0; count--, write++, read++ ) + { + write->org_pos = read->pos; + write->org_len = read->len; + write->flags = read->flags; + } + } + + /* we now need to determine the initial `parent' stems; first */ + /* activate the hints that are given by the initial hint masks */ + if ( hint_masks ) + { + PS_Mask mask = hint_masks->masks; + + + count = hint_masks->num_masks; + table->hint_masks = hint_masks; + + for ( ; count > 0; count--, mask++ ) + psh_hint_table_record_mask( table, mask ); + } + + /* finally, do a linear parse in case some hints were left alone */ + if ( table->num_hints != table->max_hints ) + { + FT_UInt idx; + + + FT_ERROR(( "psh_hint_table_init: missing/incorrect hint masks!\n" )); + + count = table->max_hints; + for ( idx = 0; idx < count; idx++ ) + psh_hint_table_record( table, idx ); + } + + Exit: + return error; + } + + + static void + psh_hint_table_activate_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit, count; + + + limit = hint_mask->num_bits; + count = 0; + + psh_hint_table_deactivate( table ); + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + { + PSH_Hint hint = &table->hints[idx]; + + + if ( !psh_hint_is_active( hint ) ) + { + FT_UInt count2; + +#if 0 + PSH_Hint* sort = table->sort; + PSH_Hint hint2; + + + for ( count2 = count; count2 > 0; count2--, sort++ ) + { + hint2 = sort[0]; + if ( psh_hint_overlap( hint, hint2 ) ) + FT_ERROR(( "psh_hint_table_activate_mask:" + " found overlapping hints\n" )) + } +#else + count2 = 0; +#endif + + if ( count2 == 0 ) + { + psh_hint_activate( hint ); + if ( count < table->max_hints ) + table->sort[count++] = hint; + else + FT_ERROR(( "psh_hint_tableactivate_mask:" + " too many active hints\n" )); + } + } + } + + mask >>= 1; + } + table->num_hints = count; + + /* now, sort the hints; they are guaranteed to not overlap */ + /* so we can compare their "org_pos" field directly */ + { + FT_Int i1, i2; + PSH_Hint hint1, hint2; + PSH_Hint* sort = table->sort; + + + /* a simple bubble sort will do, since in 99% of cases, the hints */ + /* will be already sorted -- and the sort will be linear */ + for ( i1 = 1; i1 < (FT_Int)count; i1++ ) + { + hint1 = sort[i1]; + for ( i2 = i1 - 1; i2 >= 0; i2-- ) + { + hint2 = sort[i2]; + + if ( hint2->org_pos < hint1->org_pos ) + break; + + sort[i2 + 1] = hint2; + sort[i2] = hint1; + } + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTS GRID-FITTING AND OPTIMIZATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 1 + static FT_Pos + psh_dimension_quantize_len( PSH_Dimension dim, + FT_Pos len, + FT_Bool do_snapping ) + { + if ( len <= 64 ) + len = 64; + else + { + FT_Pos delta = len - dim->stdw.widths[0].cur; + + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + len = dim->stdw.widths[0].cur; + if ( len < 48 ) + len = 48; + } + + if ( len < 3 * 64 ) + { + delta = ( len & 63 ); + len &= -64; + + if ( delta < 10 ) + len += delta; + + else if ( delta < 32 ) + len += 10; + + else if ( delta < 54 ) + len += 54; + + else + len += delta; + } + else + len = FT_PIX_ROUND( len ); + } + + if ( do_snapping ) + len = FT_PIX_ROUND( len ); + + return len; + } +#endif /* 0 */ + + +#ifdef DEBUG_HINTER + + static void + ps_simple_scale( PSH_Hint_Table table, + FT_Fixed scale, + FT_Fixed delta, + FT_Int dimension ) + { + PSH_Hint hint; + FT_UInt count; + + + for ( count = 0; count < table->max_hints; count++ ) + { + hint = table->hints + count; + + hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta; + hint->cur_len = FT_MulFix( hint->org_len, scale ); + + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); + } + } + +#endif /* DEBUG_HINTER */ + + + static FT_Fixed + psh_hint_snap_stem_side_delta( FT_Fixed pos, + FT_Fixed len ) + { + FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; + FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; + + + if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) ) + return delta1; + else + return delta2; + } + + + static void + psh_hint_align( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Int do_snapping; + FT_Pos fit_len; + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + /* perform stem snapping when requested - this is necessary + * for monochrome and LCD hinting modes only + */ + do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) || + ( dimension == 1 && glyph->do_vert_snapping ); + + hint->cur_len = fit_len = len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + hint->org_pos + hint->org_len, + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align( parent, globals, dimension, glyph ); + + /* keep original relation between hints, this is, use the */ + /* scaled distance between the centers of the hints to */ + /* compute the new position */ + par_org_center = parent->org_pos + ( parent->org_len >> 1 ); + par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 ); + cur_org_center = hint->org_pos + ( hint->org_len >> 1 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + hint->cur_pos = pos; + hint->cur_len = fit_len; + + /* Stem adjustment tries to snap stem widths to standard + * ones. This is important to prevent unpleasant rounding + * artefacts. + */ + if ( glyph->do_stem_adjust ) + { + if ( len <= 64 ) + { + /* the stem is less than one pixel; we will center it + * around the nearest pixel center + */ + if ( len >= 32 ) + { + /* This is a special case where we also widen the stem + * and align it to the pixel grid. + * + * stem_center = pos + (len/2) + * nearest_pixel_center = FT_ROUND(stem_center-32)+32 + * new_pos = nearest_pixel_center-32 + * = FT_ROUND(stem_center-32) + * = FT_FLOOR(stem_center-32+32) + * = FT_FLOOR(stem_center) + * new_len = 64 + */ + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); + len = 64; + } + else if ( len > 0 ) + { + /* This is a very small stem; we simply align it to the + * pixel grid, trying to find the minimal displacement. + * + * left = pos + * right = pos + len + * left_nearest_edge = ROUND(pos) + * right_nearest_edge = ROUND(right) + * + * if ( ABS(left_nearest_edge - left) <= + * ABS(right_nearest_edge - right) ) + * new_pos = left + * else + * new_pos = right + */ + FT_Pos left_nearest = FT_PIX_ROUND( pos ); + FT_Pos right_nearest = FT_PIX_ROUND( pos + len ); + FT_Pos left_disp = left_nearest - pos; + FT_Pos right_disp = right_nearest - ( pos + len ); + + + if ( left_disp < 0 ) + left_disp = -left_disp; + if ( right_disp < 0 ) + right_disp = -right_disp; + if ( left_disp <= right_disp ) + pos = left_nearest; + else + pos = right_nearest; + } + else + { + /* this is a ghost stem; we simply round it */ + pos = FT_PIX_ROUND( pos ); + } + } + else + { + len = psh_dimension_quantize_len( dim, len, 0 ); + } + } + + /* now that we have a good hinted stem width, try to position */ + /* the stem along a pixel grid integer coordinate */ + hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len ); + hint->cur_len = len; + } + } + + if ( do_snapping ) + { + pos = hint->cur_pos; + len = hint->cur_len; + + if ( len < 64 ) + len = 64; + else + len = FT_PIX_ROUND( len ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + hint->cur_pos = align.align_top - len; + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT: + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP: + /* don't touch */ + break; + + + default: + hint->cur_len = len; + if ( len & 64 ) + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; + else + pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); + + hint->cur_pos = pos - ( len >> 1 ); + hint->cur_len = len; + } + } + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + + +#if 0 /* not used for now, experimental */ + + /* + * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT) + * of stems + */ + static void + psh_hint_align_light( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Pos fit_len; + + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + fit_len = len; + + hint->cur_len = fit_len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + hint->org_pos + hint->org_len, + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align_light( parent, globals, dimension, glyph ); + + par_org_center = parent->org_pos + ( parent->org_len / 2 ); + par_cur_center = parent->cur_pos + ( parent->cur_len / 2 ); + cur_org_center = hint->org_pos + ( hint->org_len / 2 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + /* Stems less than one pixel wide are easy -- we want to + * make them as dark as possible, so they must fall within + * one pixel. If the stem is split between two pixels + * then snap the edge that is nearer to the pixel boundary + * to the pixel boundary. + */ + if ( len <= 64 ) + { + if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 ) + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + + /* Position stems other to minimize the amount of mid-grays. + * There are, in general, two positions that do this, + * illustrated as A) and B) below. + * + * + + + + + * + * A) |--------------------------------| + * B) |--------------------------------| + * C) |--------------------------------| + * + * Position A) (split the excess stem equally) should be better + * for stems of width N + f where f < 0.5. + * + * Position B) (split the deficiency equally) should be better + * for stems of width N + f where f > 0.5. + * + * It turns out though that minimizing the total number of lit + * pixels is also important, so position C), with one edge + * aligned with a pixel boundary is actually preferable + * to A). There are also more possibile positions for C) than + * for A) or B), so it involves less distortion of the overall + * character shape. + */ + else /* len > 64 */ + { + FT_Fixed frac_len = len & 63; + FT_Fixed center = pos + ( len >> 1 ); + FT_Fixed delta_a, delta_b; + + + if ( ( len / 64 ) & 1 ) + { + delta_a = FT_PIX_FLOOR( center ) + 32 - center; + delta_b = FT_PIX_ROUND( center ) - center; + } + else + { + delta_a = FT_PIX_ROUND( center ) - center; + delta_b = FT_PIX_FLOOR( center ) + 32 - center; + } + + /* We choose between B) and C) above based on the amount + * of fractinal stem width; for small amounts, choose + * C) always, for large amounts, B) always, and inbetween, + * pick whichever one involves less stem movement. + */ + if ( frac_len < 32 ) + { + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + else if ( frac_len < 48 ) + { + FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, + len ); + + if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) ) + pos += side_delta; + else + pos += delta_b; + } + else + { + pos += delta_b; + } + } + + hint->cur_pos = pos; + } + } /* switch */ + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + +#endif /* 0 */ + + + static void + psh_hint_table_align_hints( PSH_Hint_Table table, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Hint hint; + FT_UInt count; + +#ifdef DEBUG_HINTER + + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( ps_debug_no_vert_hints && dimension == 0 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + + if ( ps_debug_no_horz_hints && dimension == 1 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + +#endif /* DEBUG_HINTER*/ + + hint = table->hints; + count = table->max_hints; + + for ( ; count > 0; count--, hint++ ) + psh_hint_align( hint, globals, dimension, glyph ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** POINTS INTERPOLATION ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define PSH_ZONE_MIN -3200000L +#define PSH_ZONE_MAX +3200000L + +#define xxDEBUG_ZONES + + +#ifdef DEBUG_ZONES + +#include FT_CONFIG_STANDARD_LIBRARY_H + + static void + psh_print_zone( PSH_Zone zone ) + { + printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n", + zone->scale / 65536.0, + zone->delta / 64.0, + zone->min, + zone->max ); + } + +#else + +#define psh_print_zone( x ) do { } while ( 0 ) + +#endif /* DEBUG_ZONES */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTER GLYPH MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 1 + +#define psh_corner_is_flat ft_corner_is_flat +#define psh_corner_orientation ft_corner_orientation + +#else + + FT_LOCAL_DEF( FT_Int ) + psh_corner_is_flat( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos ax = x_in; + FT_Pos ay = y_in; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = x_out; + if ( ax < 0 ) + ax = -ax; + ay = y_out; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = x_out + x_in; + if ( ax < 0 ) + ax = -ax; + ay = y_out + y_in; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + static FT_Int + psh_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Int result; + + + /* deal with the trivial cases quickly */ + if ( in_y == 0 ) + { + if ( in_x >= 0 ) + result = out_y; + else + result = -out_y; + } + else if ( in_x == 0 ) + { + if ( in_y >= 0 ) + result = -out_x; + else + result = out_x; + } + else if ( out_y == 0 ) + { + if ( out_x >= 0 ) + result = in_y; + else + result = -in_y; + } + else if ( out_x == 0 ) + { + if ( out_y >= 0 ) + result = -in_x; + else + result = in_x; + } + else /* general case */ + { + long long delta = (long long)in_x * out_y - (long long)in_y * out_x; + + if ( delta == 0 ) + result = 0; + else + result = 1 - 2 * ( delta < 0 ); + } + + return result; + } + +#endif /* !1 */ + + +#ifdef COMPUTE_INFLEXS + + /* compute all inflex points in a given glyph */ + static void + psh_glyph_compute_inflections( PSH_Glyph glyph ) + { + FT_UInt n; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first, start, end, before, after; + FT_Pos in_x, in_y, out_x, out_y; + FT_Int orient_prev, orient_cur; + FT_Int finished = 0; + + + /* we need at least 4 points to create an inflection point */ + if ( glyph->contours[n].count < 4 ) + continue; + + /* compute first segment in contour */ + first = glyph->contours[n].start; + + start = end = first; + do + { + end = end->next; + if ( end == first ) + goto Skip; + + in_x = end->org_u - start->org_u; + in_y = end->org_v - start->org_v; + + } while ( in_x == 0 && in_y == 0 ); + + /* extend the segment start whenever possible */ + before = start; + do + { + do + { + start = before; + before = before->prev; + if ( before == first ) + goto Skip; + + out_x = start->org_u - before->org_u; + out_y = start->org_v - before->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_prev == 0 ); + + first = start; + in_x = out_x; + in_y = out_y; + + /* now, process all segments in the contour */ + do + { + /* first, extend current segment's end whenever possible */ + after = end; + do + { + do + { + end = after; + after = after->next; + if ( after == first ) + finished = 1; + + out_x = after->org_u - end->org_u; + out_y = after->org_v - end->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_cur == 0 ); + + if ( ( orient_cur ^ orient_prev ) < 0 ) + { + do + { + psh_point_set_inflex( start ); + start = start->next; + } + while ( start != end ); + + psh_point_set_inflex( start ); + } + + start = end; + end = after; + orient_prev = orient_cur; + in_x = out_x; + in_y = out_y; + + } while ( !finished ); + + Skip: + ; + } + } + +#endif /* COMPUTE_INFLEXS */ + + + static void + psh_glyph_done( PSH_Glyph glyph ) + { + FT_Memory memory = glyph->memory; + + + psh_hint_table_done( &glyph->hint_tables[1], memory ); + psh_hint_table_done( &glyph->hint_tables[0], memory ); + + FT_FREE( glyph->points ); + FT_FREE( glyph->contours ); + + glyph->num_points = 0; + glyph->num_contours = 0; + + glyph->memory = 0; + } + + + static int + psh_compute_dir( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ax, ay; + int result = PSH_DIR_NONE; + + + ax = ( dx >= 0 ) ? dx : -dx; + ay = ( dy >= 0 ) ? dy : -dy; + + if ( ay * 12 < ax ) + { + /* |dy| <<< |dx| means a near-horizontal segment */ + result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT; + } + else if ( ax * 12 < ay ) + { + /* |dx| <<< |dy| means a near-vertical segment */ + result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN; + } + + return result; + } + + + /* load outline point coordinates into hinter glyph */ + static void + psh_glyph_load_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_Vector* vec = glyph->outline->points; + PSH_Point point = glyph->points; + FT_UInt count = glyph->num_points; + + + for ( ; count > 0; count--, point++, vec++ ) + { + point->flags2 = 0; + point->hint = NULL; + if ( dimension == 0 ) + { + point->org_u = vec->x; + point->org_v = vec->y; + } + else + { + point->org_u = vec->y; + point->org_v = vec->x; + } + +#ifdef DEBUG_HINTER + point->org_x = vec->x; + point->org_y = vec->y; +#endif + + } + } + + + /* save hinted point coordinates back to outline */ + static void + psh_glyph_save_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_UInt n; + PSH_Point point = glyph->points; + FT_Vector* vec = glyph->outline->points; + char* tags = glyph->outline->tags; + + + for ( n = 0; n < glyph->num_points; n++ ) + { + if ( dimension == 0 ) + vec[n].x = point->cur_u; + else + vec[n].y = point->cur_u; + + if ( psh_point_is_strong( point ) ) + tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 ); + +#ifdef DEBUG_HINTER + + if ( dimension == 0 ) + { + point->cur_x = point->cur_u; + point->flags_x = point->flags2 | point->flags; + } + else + { + point->cur_y = point->cur_u; + point->flags_y = point->flags2 | point->flags; + } + +#endif + + point++; + } + } + + + static FT_Error + psh_glyph_init( PSH_Glyph glyph, + FT_Outline* outline, + PS_Hints ps_hints, + PSH_Globals globals ) + { + FT_Error error; + FT_Memory memory; + + + /* clear all fields */ + FT_MEM_ZERO( glyph, sizeof ( *glyph ) ); + + memory = glyph->memory = globals->memory; + + /* allocate and setup points + contours arrays */ + if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) || + FT_NEW_ARRAY( glyph->contours, outline->n_contours ) ) + goto Exit; + + glyph->num_points = outline->n_points; + glyph->num_contours = outline->n_contours; + + { + FT_UInt first = 0, next, n; + PSH_Point points = glyph->points; + PSH_Contour contour = glyph->contours; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + FT_Int count; + PSH_Point point; + + + next = outline->contours[n] + 1; + count = next - first; + + contour->start = points + first; + contour->count = (FT_UInt)count; + + if ( count > 0 ) + { + point = points + first; + + point->prev = points + next - 1; + point->contour = contour; + + for ( ; count > 1; count-- ) + { + point[0].next = point + 1; + point[1].prev = point; + point++; + point->contour = contour; + } + point->next = points + first; + } + + contour++; + first = next; + } + } + + { + PSH_Point points = glyph->points; + PSH_Point point = points; + FT_Vector* vec = outline->points; + FT_UInt n; + + + for ( n = 0; n < glyph->num_points; n++, point++ ) + { + FT_Int n_prev = (FT_Int)( point->prev - points ); + FT_Int n_next = (FT_Int)( point->next - points ); + FT_Pos dxi, dyi, dxo, dyo; + + + if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) ) + point->flags = PSH_POINT_OFF; + + dxi = vec[n].x - vec[n_prev].x; + dyi = vec[n].y - vec[n_prev].y; + + point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi ); + + dxo = vec[n_next].x - vec[n].x; + dyo = vec[n_next].y - vec[n].y; + + point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo ); + + /* detect smooth points */ + if ( point->flags & PSH_POINT_OFF ) + point->flags |= PSH_POINT_SMOOTH; + + else if ( point->dir_in == point->dir_out ) + { + if ( point->dir_out != PSH_DIR_NONE || + psh_corner_is_flat( dxi, dyi, dxo, dyo ) ) + point->flags |= PSH_POINT_SMOOTH; + } + } + } + + glyph->outline = outline; + glyph->globals = globals; + +#ifdef COMPUTE_INFLEXS + psh_glyph_load_points( glyph, 0 ); + psh_glyph_compute_inflections( glyph ); +#endif /* COMPUTE_INFLEXS */ + + /* now deal with hints tables */ + error = psh_hint_table_init( &glyph->hint_tables [0], + &ps_hints->dimension[0].hints, + &ps_hints->dimension[0].masks, + &ps_hints->dimension[0].counters, + memory ); + if ( error ) + goto Exit; + + error = psh_hint_table_init( &glyph->hint_tables [1], + &ps_hints->dimension[1].hints, + &ps_hints->dimension[1].masks, + &ps_hints->dimension[1].counters, + memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* compute all extrema in a glyph for a given dimension */ + static void + psh_glyph_compute_extrema( PSH_Glyph glyph ) + { + FT_UInt n; + + + /* first of all, compute all local extrema */ + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first = glyph->contours[n].start; + PSH_Point point, before, after; + + + if ( glyph->contours[n].count == 0 ) + continue; + + point = first; + before = point; + after = point; + + do + { + before = before->prev; + if ( before == first ) + goto Skip; + + } while ( before->org_u == point->org_u ); + + first = point = before->next; + + for (;;) + { + after = point; + do + { + after = after->next; + if ( after == first ) + goto Next; + + } while ( after->org_u == point->org_u ); + + if ( before->org_u < point->org_u ) + { + if ( after->org_u < point->org_u ) + { + /* local maximum */ + goto Extremum; + } + } + else /* before->org_u > point->org_u */ + { + if ( after->org_u > point->org_u ) + { + /* local minimum */ + Extremum: + do + { + psh_point_set_extremum( point ); + point = point->next; + + } while ( point != after ); + } + } + + before = after->prev; + point = after; + + } /* for */ + + Next: + ; + } + + /* for each extremum, determine its direction along the */ + /* orthogonal axis */ + for ( n = 0; n < glyph->num_points; n++ ) + { + PSH_Point point, before, after; + + + point = &glyph->points[n]; + before = point; + after = point; + + if ( psh_point_is_extremum( point ) ) + { + do + { + before = before->prev; + if ( before == point ) + goto Skip; + + } while ( before->org_v == point->org_v ); + + do + { + after = after->next; + if ( after == point ) + goto Skip; + + } while ( after->org_v == point->org_v ); + } + + if ( before->org_v < point->org_v && + after->org_v > point->org_v ) + { + psh_point_set_positive( point ); + } + else if ( before->org_v > point->org_v && + after->org_v < point->org_v ) + { + psh_point_set_negative( point ); + } + + Skip: + ; + } + } + + + /* major_dir is the direction for points on the bottom/left of the stem; */ + /* Points on the top/right of the stem will have a direction of */ + /* -major_dir. */ + + static void + psh_hint_table_find_strong_points( PSH_Hint_Table table, + PSH_Point point, + FT_UInt count, + FT_Int threshold, + FT_Int major_dir ) + { + PSH_Hint* sort = table->sort; + FT_UInt num_hints = table->num_hints; + + + for ( ; count > 0; count--, point++ ) + { + FT_Int point_dir = 0; + FT_Pos org_u = point->org_u; + + + if ( psh_point_is_strong( point ) ) + continue; + + if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) ) + point_dir = point->dir_in; + + else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) ) + point_dir = point->dir_out; + + if ( point_dir ) + { + if ( point_dir == major_dir ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + break; + } + } + } + else if ( point_dir == -major_dir ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + break; + } + } + } + } + +#if 1 + else if ( psh_point_is_extremum( point ) ) + { + /* treat extrema as special cases for stem edge alignment */ + FT_UInt nn, min_flag, max_flag; + + + if ( major_dir == PSH_DIR_HORIZONTAL ) + { + min_flag = PSH_POINT_POSITIVE; + max_flag = PSH_POINT_NEGATIVE; + } + else + { + min_flag = PSH_POINT_NEGATIVE; + max_flag = PSH_POINT_POSITIVE; + } + + if ( point->flags2 & min_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + else if ( point->flags2 & max_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + + if ( point->hint == NULL ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + + + if ( org_u >= hint->org_pos && + org_u <= hint->org_pos + hint->org_len ) + { + point->hint = hint; + break; + } + } + } + } + +#endif /* 1 */ + } + } + + + /* the accepted shift for strong points in fractional pixels */ +#define PSH_STRONG_THRESHOLD 32 + + /* the maximum shift value in font units */ +#define PSH_STRONG_THRESHOLD_MAXIMUM 30 + + + /* find strong points in a glyph */ + static void + psh_glyph_find_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + /* a point is `strong' if it is located on a stem edge and */ + /* has an `in' or `out' tangent parallel to the hint's direction */ + + PSH_Hint_Table table = &glyph->hint_tables[dimension]; + PS_Mask mask = table->hint_masks->masks; + FT_UInt num_masks = table->hint_masks->num_masks; + FT_UInt first = 0; + FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL + : PSH_DIR_HORIZONTAL; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Int threshold; + + + threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale ); + if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM ) + threshold = PSH_STRONG_THRESHOLD_MAXIMUM; + + /* process secondary hints to `selected' points */ + if ( num_masks > 1 && glyph->num_points > 0 ) + { + first = mask->end_point; + mask++; + for ( ; num_masks > 1; num_masks--, mask++ ) + { + FT_UInt next; + FT_Int count; + + + next = mask->end_point; + count = next - first; + if ( count > 0 ) + { + PSH_Point point = glyph->points + first; + + + psh_hint_table_activate_mask( table, mask ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + first = next; + } + } + + /* process primary hints for all points */ + if ( num_masks == 1 ) + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + psh_hint_table_activate_mask( table, table->hint_masks->masks ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + + /* now, certain points may have been attached to a hint and */ + /* not marked as strong; update their flags then */ + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + if ( point->hint && !psh_point_is_strong( point ) ) + psh_point_set_strong( point ); + } + } + + + /* find points in a glyph which are in a blue zone and have `in' or */ + /* `out' tangents parallel to the horizontal axis */ + static void + psh_glyph_find_blue_points( PSH_Blues blues, + PSH_Glyph glyph ) + { + PSH_Blue_Table table; + PSH_Blue_Zone zone; + FT_UInt glyph_count = glyph->num_points; + FT_UInt blue_count; + PSH_Point point = glyph->points; + + + for ( ; glyph_count > 0; glyph_count--, point++ ) + { + FT_Pos y; + + + /* check tangents */ + if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) && + !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) ) + continue; + + /* skip strong points */ + if ( psh_point_is_strong( point ) ) + continue; + + y = point->org_u; + + /* look up top zones */ + table = &blues->normal_top; + blue_count = table->count; + zone = table->zones; + + for ( ; blue_count > 0; blue_count--, zone++ ) + { + FT_Pos delta = y - zone->org_bottom; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y <= zone->org_top + blues->blue_fuzz ) + if ( blues->no_overshoots || delta <= blues->blue_threshold ) + { + point->cur_u = zone->cur_bottom; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + + /* look up bottom zones */ + table = &blues->normal_bottom; + blue_count = table->count; + zone = table->zones + blue_count - 1; + + for ( ; blue_count > 0; blue_count--, zone-- ) + { + FT_Pos delta = zone->org_top - y; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y >= zone->org_bottom - blues->blue_fuzz ) + if ( blues->no_overshoots || delta < blues->blue_threshold ) + { + point->cur_u = zone->cur_top; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + } + } + + + /* interpolate strong points with the help of hinted coordinates */ + static void + psh_glyph_interpolate_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + { + PSH_Hint hint = point->hint; + + + if ( hint ) + { + FT_Pos delta; + + + if ( psh_point_is_edge_min( point ) ) + point->cur_u = hint->cur_pos; + + else if ( psh_point_is_edge_max( point ) ) + point->cur_u = hint->cur_pos + hint->cur_len; + + else + { + delta = point->org_u - hint->org_pos; + + if ( delta <= 0 ) + point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); + + else if ( delta >= hint->org_len ) + point->cur_u = hint->cur_pos + hint->cur_len + + FT_MulFix( delta - hint->org_len, scale ); + + else if ( hint->org_len > 0 ) + point->cur_u = hint->cur_pos + + FT_MulDiv( delta, hint->cur_len, + hint->org_len ); + else + point->cur_u = hint->cur_pos; + } + psh_point_set_fitted( point ); + } + } + } + + +#define PSH_MAX_STRONG_INTERNAL 16 + + static void + psh_glyph_interpolate_normal_points( PSH_Glyph glyph, + FT_Int dimension ) + { + +#if 1 + /* first technique: a point is strong if it is a local extremum */ + + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Memory memory = glyph->memory; + + PSH_Point* strongs = NULL; + PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL]; + FT_UInt num_strongs = 0; + + PSH_Point points = glyph->points; + PSH_Point points_end = points + glyph->num_points; + PSH_Point point; + + + /* first count the number of strong points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + num_strongs++; + } + + if ( num_strongs == 0 ) /* nothing to do here */ + return; + + /* allocate an array to store a list of points, */ + /* stored in increasing org_u order */ + if ( num_strongs <= PSH_MAX_STRONG_INTERNAL ) + strongs = strongs_0; + else + { + FT_Error error; + + + if ( FT_NEW_ARRAY( strongs, num_strongs ) ) + return; + } + + num_strongs = 0; + for ( point = points; point < points_end; point++ ) + { + PSH_Point* insert; + + + if ( !psh_point_is_strong( point ) ) + continue; + + for ( insert = strongs + num_strongs; insert > strongs; insert-- ) + { + if ( insert[-1]->org_u <= point->org_u ) + break; + + insert[0] = insert[-1]; + } + insert[0] = point; + num_strongs++; + } + + /* now try to interpolate all normal points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + continue; + + /* sometimes, some local extrema are smooth points */ + if ( psh_point_is_smooth( point ) ) + { + if ( point->dir_in == PSH_DIR_NONE || + point->dir_in != point->dir_out ) + continue; + + if ( !psh_point_is_extremum( point ) && + !psh_point_is_inflex( point ) ) + continue; + + point->flags &= ~PSH_POINT_SMOOTH; + } + + /* find best enclosing point coordinates then interpolate */ + { + PSH_Point before, after; + FT_UInt nn; + + + for ( nn = 0; nn < num_strongs; nn++ ) + if ( strongs[nn]->org_u > point->org_u ) + break; + + if ( nn == 0 ) /* point before the first strong point */ + { + after = strongs[0]; + + point->cur_u = after->cur_u + + FT_MulFix( point->org_u - after->org_u, + scale ); + } + else + { + before = strongs[nn - 1]; + + for ( nn = num_strongs; nn > 0; nn-- ) + if ( strongs[nn - 1]->org_u < point->org_u ) + break; + + if ( nn == num_strongs ) /* point is after last strong point */ + { + before = strongs[nn - 1]; + + point->cur_u = before->cur_u + + FT_MulFix( point->org_u - before->org_u, + scale ); + } + else + { + FT_Pos u; + + + after = strongs[nn]; + + /* now interpolate point between before and after */ + u = point->org_u; + + if ( u == before->org_u ) + point->cur_u = before->cur_u; + + else if ( u == after->org_u ) + point->cur_u = after->cur_u; + + else + point->cur_u = before->cur_u + + FT_MulDiv( u - before->org_u, + after->cur_u - before->cur_u, + after->org_u - before->org_u ); + } + } + psh_point_set_fitted( point ); + } + } + + if ( strongs != strongs_0 ) + FT_FREE( strongs ); + +#endif /* 1 */ + + } + + + /* interpolate other points */ + static void + psh_glyph_interpolate_other_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + PSH_Contour contour = glyph->contours; + FT_UInt num_contours = glyph->num_contours; + + + for ( ; num_contours > 0; num_contours--, contour++ ) + { + PSH_Point start = contour->start; + PSH_Point first, next, point; + FT_UInt fit_count; + + + /* count the number of strong points in this contour */ + next = start + contour->count; + fit_count = 0; + first = 0; + + for ( point = start; point < next; point++ ) + if ( psh_point_is_fitted( point ) ) + { + if ( !first ) + first = point; + + fit_count++; + } + + /* if there are less than 2 fitted points in the contour, we */ + /* simply scale and eventually translate the contour points */ + if ( fit_count < 2 ) + { + if ( fit_count == 1 ) + delta = first->cur_u - FT_MulFix( first->org_u, scale ); + + for ( point = start; point < next; point++ ) + if ( point != first ) + point->cur_u = FT_MulFix( point->org_u, scale ) + delta; + + goto Next_Contour; + } + + /* there are more than 2 strong points in this contour; we */ + /* need to interpolate weak points between them */ + start = first; + do + { + point = first; + + /* skip consecutive fitted points */ + for (;;) + { + next = first->next; + if ( next == start ) + goto Next_Contour; + + if ( !psh_point_is_fitted( next ) ) + break; + + first = next; + } + + /* find next fitted point after unfitted one */ + for (;;) + { + next = next->next; + if ( psh_point_is_fitted( next ) ) + break; + } + + /* now interpolate between them */ + { + FT_Pos org_a, org_ab, cur_a, cur_ab; + FT_Pos org_c, org_ac, cur_c; + FT_Fixed scale_ab; + + + if ( first->org_u <= next->org_u ) + { + org_a = first->org_u; + cur_a = first->cur_u; + org_ab = next->org_u - org_a; + cur_ab = next->cur_u - cur_a; + } + else + { + org_a = next->org_u; + cur_a = next->cur_u; + org_ab = first->org_u - org_a; + cur_ab = first->cur_u - cur_a; + } + + scale_ab = 0x10000L; + if ( org_ab > 0 ) + scale_ab = FT_DivFix( cur_ab, org_ab ); + + point = first->next; + do + { + org_c = point->org_u; + org_ac = org_c - org_a; + + if ( org_ac <= 0 ) + { + /* on the left of the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale ); + } + else if ( org_ac >= org_ab ) + { + /* on the right on the interpolation zone */ + cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale ); + } + else + { + /* within the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale_ab ); + } + + point->cur_u = cur_c; + + point = point->next; + + } while ( point != next ); + } + + /* keep going until all points in the contours have been processed */ + first = next; + + } while ( first != start ); + + Next_Contour: + ; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HIGH-LEVEL INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + PSH_GlyphRec glyphrec; + PSH_Glyph glyph = &glyphrec; + FT_Error error; +#ifdef DEBUG_HINTER + FT_Memory memory; +#endif + FT_Int dimension; + + + /* something to do? */ + if ( outline->n_points == 0 || outline->n_contours == 0 ) + return PSH_Err_Ok; + +#ifdef DEBUG_HINTER + + memory = globals->memory; + + if ( ps_debug_glyph ) + { + psh_glyph_done( ps_debug_glyph ); + FT_FREE( ps_debug_glyph ); + } + + if ( FT_NEW( glyph ) ) + return error; + + ps_debug_glyph = glyph; + +#endif /* DEBUG_HINTER */ + + error = psh_glyph_init( glyph, outline, ps_hints, globals ); + if ( error ) + goto Exit; + + /* try to optimize the y_scale so that the top of non-capital letters + * is aligned on a pixel boundary whenever possible + */ + { + PSH_Dimension dim_x = &glyph->globals->dimension[0]; + PSH_Dimension dim_y = &glyph->globals->dimension[1]; + + FT_Fixed x_scale = dim_x->scale_mult; + FT_Fixed y_scale = dim_y->scale_mult; + + FT_Fixed old_x_scale = x_scale; + FT_Fixed old_y_scale = y_scale; + + FT_Fixed scaled; + FT_Fixed fitted; + + FT_Bool rescale = FALSE; + + + scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); + fitted = FT_PIX_ROUND( scaled ); + + if ( fitted != 0 && scaled != fitted ) + { + rescale = TRUE; + + y_scale = FT_MulDiv( y_scale, fitted, scaled ); + + if ( fitted < scaled ) + x_scale -= x_scale / 50; + + psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 ); + } + + glyph->do_horz_hints = 1; + glyph->do_vert_hints = 1; + + glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD ); + + glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD_V ); + + glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); + + for ( dimension = 0; dimension < 2; dimension++ ) + { + /* load outline coordinates into glyph */ + psh_glyph_load_points( glyph, dimension ); + + /* compute local extrema */ + psh_glyph_compute_extrema( glyph ); + + /* compute aligned stem/hints positions */ + psh_hint_table_align_hints( &glyph->hint_tables[dimension], + glyph->globals, + dimension, + glyph ); + + /* find strong points, align them, then interpolate others */ + psh_glyph_find_strong_points( glyph, dimension ); + if ( dimension == 1 ) + psh_glyph_find_blue_points( &globals->blues, glyph ); + psh_glyph_interpolate_strong_points( glyph, dimension ); + psh_glyph_interpolate_normal_points( glyph, dimension ); + psh_glyph_interpolate_other_points( glyph, dimension ); + + /* save hinted coordinates back to outline */ + psh_glyph_save_points( glyph, dimension ); + + if ( rescale ) + psh_globals_set_scale( glyph->globals, + old_x_scale, old_y_scale, 0, 0 ); + } + } + + Exit: + +#ifndef DEBUG_HINTER + psh_glyph_done( glyph ); +#endif + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshalgo.h b/src/3rdparty/freetype/src/pshinter/pshalgo.h new file mode 100644 index 0000000000..1a248a7052 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshalgo.h @@ -0,0 +1,255 @@ +/***************************************************************************/ +/* */ +/* pshalgo.h */ +/* */ +/* PostScript hinting algorithm (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHALGO_H__ +#define __PSHALGO_H__ + + +#include "pshrec.h" +#include "pshglob.h" +#include FT_TRIGONOMETRY_H + + +FT_BEGIN_HEADER + + + /* handle to Hint structure */ + typedef struct PSH_HintRec_* PSH_Hint; + + /* hint bit-flags */ + typedef enum PSH_Hint_Flags_ + { + PSH_HINT_GHOST = PS_HINT_FLAG_GHOST, + PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM, + PSH_HINT_ACTIVE = 4, + PSH_HINT_FITTED = 8 + + } PSH_Hint_Flags; + + +#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 ) +#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 ) +#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 ) + +#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE +#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE +#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED + + /* hint structure */ + typedef struct PSH_HintRec_ + { + FT_Int org_pos; + FT_Int org_len; + FT_Pos cur_pos; + FT_Pos cur_len; + FT_UInt flags; + PSH_Hint parent; + FT_Int order; + + } PSH_HintRec; + + + /* this is an interpolation zone used for strong points; */ + /* weak points are interpolated according to their strong */ + /* neighbours */ + typedef struct PSH_ZoneRec_ + { + FT_Fixed scale; + FT_Fixed delta; + FT_Pos min; + FT_Pos max; + + } PSH_ZoneRec, *PSH_Zone; + + + typedef struct PSH_Hint_TableRec_ + { + FT_UInt max_hints; + FT_UInt num_hints; + PSH_Hint hints; + PSH_Hint* sort; + PSH_Hint* sort_global; + FT_UInt num_zones; + PSH_ZoneRec* zones; + PSH_Zone zone; + PS_Mask_Table hint_masks; + PS_Mask_Table counter_masks; + + } PSH_Hint_TableRec, *PSH_Hint_Table; + + + typedef struct PSH_PointRec_* PSH_Point; + typedef struct PSH_ContourRec_* PSH_Contour; + + enum + { + PSH_DIR_NONE = 4, + PSH_DIR_UP = -1, + PSH_DIR_DOWN = 1, + PSH_DIR_LEFT = -2, + PSH_DIR_RIGHT = 2 + }; + +#define PSH_DIR_HORIZONTAL 2 +#define PSH_DIR_VERTICAL 1 + +#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) ) +#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL ) +#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL ) + + + /* the following bit-flags are computed once by the glyph */ + /* analyzer, for both dimensions */ + enum + { + PSH_POINT_OFF = 1, /* point is off the curve */ + PSH_POINT_SMOOTH = 2, /* point is smooth */ + PSH_POINT_INFLEX = 4 /* point is inflection */ + }; + +#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH ) +#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF ) +#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX ) + +#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH +#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF +#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX + + /* the following bit-flags are re-computed for each dimension */ + enum + { + PSH_POINT_STRONG = 16, /* point is strong */ + PSH_POINT_FITTED = 32, /* point is already fitted */ + PSH_POINT_EXTREMUM = 64, /* point is local extremum */ + PSH_POINT_POSITIVE = 128, /* extremum has positive contour flow */ + PSH_POINT_NEGATIVE = 256, /* extremum has negative contour flow */ + PSH_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */ + PSH_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */ + }; + +#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG ) +#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED ) +#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM ) +#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE ) +#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE ) +#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN ) +#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX ) + +#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG +#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED +#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM +#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE +#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE +#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN +#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX + + + typedef struct PSH_PointRec_ + { + PSH_Point prev; + PSH_Point next; + PSH_Contour contour; + FT_UInt flags; + FT_UInt flags2; + FT_Char dir_in; + FT_Char dir_out; + FT_Angle angle_in; + FT_Angle angle_out; + PSH_Hint hint; + FT_Pos org_u; + FT_Pos org_v; + FT_Pos cur_u; +#ifdef DEBUG_HINTER + FT_Pos org_x; + FT_Pos cur_x; + FT_Pos org_y; + FT_Pos cur_y; + FT_UInt flags_x; + FT_UInt flags_y; +#endif + + } PSH_PointRec; + + +#define PSH_POINT_EQUAL_ORG( a, b ) ( (a)->org_u == (b)->org_u && \ + (a)->org_v == (b)->org_v ) + +#define PSH_POINT_ANGLE( a, b ) FT_Atan2( (b)->org_u - (a)->org_u, \ + (b)->org_v - (a)->org_v ) + + typedef struct PSH_ContourRec_ + { + PSH_Point start; + FT_UInt count; + + } PSH_ContourRec; + + + typedef struct PSH_GlyphRec_ + { + FT_UInt num_points; + FT_UInt num_contours; + + PSH_Point points; + PSH_Contour contours; + + FT_Memory memory; + FT_Outline* outline; + PSH_Globals globals; + PSH_Hint_TableRec hint_tables[2]; + + FT_Bool vertical; + FT_Int major_dir; + FT_Int minor_dir; + + FT_Bool do_horz_hints; + FT_Bool do_vert_hints; + FT_Bool do_horz_snapping; + FT_Bool do_vert_snapping; + FT_Bool do_stem_adjust; + + } PSH_GlyphRec, *PSH_Glyph; + + +#ifdef DEBUG_HINTER + extern PSH_Hint_Table ps_debug_hint_table; + + typedef void + (*PSH_HintFunc)( PSH_Hint hint, + FT_Bool vertical ); + + extern PSH_HintFunc ps_debug_hint_func; + + extern PSH_Glyph ps_debug_glyph; +#endif + + + extern FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + +FT_END_HEADER + + +#endif /* __PSHALGO_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshglob.c b/src/3rdparty/freetype/src/pshinter/pshglob.c new file mode 100644 index 0000000000..8a69aa1e84 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshglob.c @@ -0,0 +1,750 @@ +/***************************************************************************/ +/* */ +/* pshglob.c */ +/* */ +/* PostScript hinter global hinting management (body). */ +/* Inspired by the new auto-hinter module. */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pshglob.h" + +#ifdef DEBUG_HINTER + PSH_Globals ps_debug_globals = 0; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STANDARD WIDTHS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* scale the widths/heights table */ + static void + psh_globals_scale_widths( PSH_Globals globals, + FT_UInt direction ) + { + PSH_Dimension dim = &globals->dimension[direction]; + PSH_Widths stdw = &dim->stdw; + FT_UInt count = stdw->count; + PSH_Width width = stdw->widths; + PSH_Width stand = width; /* standard width/height */ + FT_Fixed scale = dim->scale_mult; + + + if ( count > 0 ) + { + width->cur = FT_MulFix( width->org, scale ); + width->fit = FT_PIX_ROUND( width->cur ); + + width++; + count--; + + for ( ; count > 0; count--, width++ ) + { + FT_Pos w, dist; + + + w = FT_MulFix( width->org, scale ); + dist = w - stand->cur; + + if ( dist < 0 ) + dist = -dist; + + if ( dist < 128 ) + w = stand->cur; + + width->cur = w; + width->fit = FT_PIX_ROUND( w ); + } + } + } + + +#if 0 + + /* org_width is is font units, result in device pixels, 26.6 format */ + FT_LOCAL_DEF( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ) + { + FT_UInt n; + FT_Pos width = FT_MulFix( org_width, dimension->scale_mult ); + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + + + for ( n = 0; n < dimension->stdw.count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = dimension->stdw.widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + if ( width >= reference ) + { + width -= 0x21; + if ( width < reference ) + width = reference; + } + else + { + width += 0x21; + if ( width > reference ) + width = reference; + } + + return width; + } + +#endif /* 0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BLUE ZONES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_blues_set_zones_0( PSH_Blues target, + FT_Bool is_others, + FT_UInt read_count, + FT_Short* read, + PSH_Blue_Table top_table, + PSH_Blue_Table bot_table ) + { + FT_UInt count_top = top_table->count; + FT_UInt count_bot = bot_table->count; + FT_Bool first = 1; + + FT_UNUSED( target ); + + + for ( ; read_count > 1; read_count -= 2 ) + { + FT_Int reference, delta; + FT_UInt count; + PSH_Blue_Zone zones, zone; + FT_Bool top; + + + /* read blue zone entry, and select target top/bottom zone */ + top = 0; + if ( first || is_others ) + { + reference = read[1]; + delta = read[0] - reference; + + zones = bot_table->zones; + count = count_bot; + first = 0; + } + else + { + reference = read[0]; + delta = read[1] - reference; + + zones = top_table->zones; + count = count_top; + top = 1; + } + + /* insert into sorted table */ + zone = zones; + for ( ; count > 0; count--, zone++ ) + { + if ( reference < zone->org_ref ) + break; + + if ( reference == zone->org_ref ) + { + FT_Int delta0 = zone->org_delta; + + + /* we have two zones on the same reference position -- */ + /* only keep the largest one */ + if ( delta < 0 ) + { + if ( delta < delta0 ) + zone->org_delta = delta; + } + else + { + if ( delta > delta0 ) + zone->org_delta = delta; + } + goto Skip; + } + } + + for ( ; count > 0; count-- ) + zone[count] = zone[count-1]; + + zone->org_ref = reference; + zone->org_delta = delta; + + if ( top ) + count_top++; + else + count_bot++; + + Skip: + read += 2; + } + + top_table->count = count_top; + bot_table->count = count_bot; + } + + + /* Re-read blue zones from the original fonts and store them into out */ + /* private structure. This function re-orders, sanitizes and */ + /* fuzz-expands the zones as well. */ + static void + psh_blues_set_zones( PSH_Blues target, + FT_UInt count, + FT_Short* blues, + FT_UInt count_others, + FT_Short* other_blues, + FT_Int fuzz, + FT_Int family ) + { + PSH_Blue_Table top_table, bot_table; + FT_Int count_top, count_bot; + + + if ( family ) + { + top_table = &target->family_top; + bot_table = &target->family_bottom; + } + else + { + top_table = &target->normal_top; + bot_table = &target->normal_bottom; + } + + /* read the input blue zones, and build two sorted tables */ + /* (one for the top zones, the other for the bottom zones) */ + top_table->count = 0; + bot_table->count = 0; + + /* first, the blues */ + psh_blues_set_zones_0( target, 0, + count, blues, top_table, bot_table ); + psh_blues_set_zones_0( target, 1, + count_others, other_blues, top_table, bot_table ); + + count_top = top_table->count; + count_bot = bot_table->count; + + /* sanitize top table */ + if ( count_top > 0 ) + { + PSH_Blue_Zone zone = top_table->zones; + + + for ( count = count_top; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[1].org_ref - zone[0].org_ref; + if ( zone->org_delta > delta ) + zone->org_delta = delta; + } + + zone->org_bottom = zone->org_ref; + zone->org_top = zone->org_delta + zone->org_ref; + } + } + + /* sanitize bottom table */ + if ( count_bot > 0 ) + { + PSH_Blue_Zone zone = bot_table->zones; + + + for ( count = count_bot; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[0].org_ref - zone[1].org_ref; + if ( zone->org_delta < delta ) + zone->org_delta = delta; + } + + zone->org_top = zone->org_ref; + zone->org_bottom = zone->org_delta + zone->org_ref; + } + } + + /* expand top and bottom tables with blue fuzz */ + { + FT_Int dim, top, bot, delta; + PSH_Blue_Zone zone; + + + zone = top_table->zones; + count = count_top; + + for ( dim = 1; dim >= 0; dim-- ) + { + if ( count > 0 ) + { + /* expand the bottom of the lowest zone normally */ + zone->org_bottom -= fuzz; + + /* expand the top and bottom of intermediate zones; */ + /* checking that the interval is smaller than the fuzz */ + top = zone->org_top; + + for ( count--; count > 0; count-- ) + { + bot = zone[1].org_bottom; + delta = bot - top; + + if ( delta < 2 * fuzz ) + zone[0].org_top = zone[1].org_bottom = top + delta / 2; + else + { + zone[0].org_top = top + fuzz; + zone[1].org_bottom = bot - fuzz; + } + + zone++; + top = zone->org_top; + } + + /* expand the top of the highest zone normally */ + zone->org_top = top + fuzz; + } + zone = bot_table->zones; + count = count_bot; + } + } + } + + + /* reset the blues table when the device transform changes */ + static void + psh_blues_scale_zones( PSH_Blues blues, + FT_Fixed scale, + FT_Pos delta ) + { + FT_UInt count; + FT_UInt num; + PSH_Blue_Table table = 0; + + /* */ + /* Determine whether we need to suppress overshoots or */ + /* not. We simply need to compare the vertical scale */ + /* parameter to the raw bluescale value. Here is why: */ + /* */ + /* We need to suppress overshoots for all pointsizes. */ + /* At 300dpi that satisfies: */ + /* */ + /* pointsize < 240*bluescale + 0.49 */ + /* */ + /* This corresponds to: */ + /* */ + /* pixelsize < 1000*bluescale + 49/24 */ + /* */ + /* scale*EM_Size < 1000*bluescale + 49/24 */ + /* */ + /* However, for normal Type 1 fonts, EM_Size is 1000! */ + /* We thus only check: */ + /* */ + /* scale < bluescale + 49/24000 */ + /* */ + /* which we shorten to */ + /* */ + /* "scale < bluescale" */ + /* */ + /* Note that `blue_scale' is stored 1000 times its real */ + /* value, and that `scale' converts from font units to */ + /* fractional pixels. */ + /* */ + + /* 1000 / 64 = 125 / 8 */ + if ( scale >= 0x20C49BAL ) + blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); + else + blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); + + /* */ + /* The blue threshold is the font units distance under */ + /* which overshoots are suppressed due to the BlueShift */ + /* even if the scale is greater than BlueScale. */ + /* */ + /* It is the smallest distance such that */ + /* */ + /* dist <= BlueShift && dist*scale <= 0.5 pixels */ + /* */ + { + FT_Int threshold = blues->blue_shift; + + + while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) + threshold--; + + blues->blue_threshold = threshold; + } + + for ( num = 0; num < 4; num++ ) + { + PSH_Blue_Zone zone; + + + switch ( num ) + { + case 0: + table = &blues->normal_top; + break; + case 1: + table = &blues->normal_bottom; + break; + case 2: + table = &blues->family_top; + break; + default: + table = &blues->family_bottom; + break; + } + + zone = table->zones; + count = table->count; + for ( ; count > 0; count--, zone++ ) + { + zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta; + zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta; + zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta; + zone->cur_delta = FT_MulFix( zone->org_delta, scale ); + + /* round scaled reference position */ + zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); + +#if 0 + if ( zone->cur_ref > zone->cur_top ) + zone->cur_ref -= 64; + else if ( zone->cur_ref < zone->cur_bottom ) + zone->cur_ref += 64; +#endif + } + } + + /* process the families now */ + + for ( num = 0; num < 2; num++ ) + { + PSH_Blue_Zone zone1, zone2; + FT_UInt count1, count2; + PSH_Blue_Table normal, family; + + + switch ( num ) + { + case 0: + normal = &blues->normal_top; + family = &blues->family_top; + break; + + default: + normal = &blues->normal_bottom; + family = &blues->family_bottom; + } + + zone1 = normal->zones; + count1 = normal->count; + + for ( ; count1 > 0; count1--, zone1++ ) + { + /* try to find a family zone whose reference position is less */ + /* than 1 pixel far from the current zone */ + zone2 = family->zones; + count2 = family->count; + + for ( ; count2 > 0; count2--, zone2++ ) + { + FT_Pos Delta; + + + Delta = zone1->org_ref - zone2->org_ref; + if ( Delta < 0 ) + Delta = -Delta; + + if ( FT_MulFix( Delta, scale ) < 64 ) + { + zone1->cur_top = zone2->cur_top; + zone1->cur_bottom = zone2->cur_bottom; + zone1->cur_ref = zone2->cur_ref; + zone1->cur_delta = zone2->cur_delta; + break; + } + } + } + } + } + + + FT_LOCAL_DEF( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ) + { + PSH_Blue_Table table; + FT_UInt count; + FT_Pos delta; + PSH_Blue_Zone zone; + FT_Int no_shoots; + + + alignment->align = PSH_BLUE_ALIGN_NONE; + + no_shoots = blues->no_overshoots; + + /* look up stem top in top zones table */ + table = &blues->normal_top; + count = table->count; + zone = table->zones; + + for ( ; count > 0; count--, zone++ ) + { + delta = stem_top - zone->org_bottom; + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_top <= zone->org_top + blues->blue_fuzz ) + { + if ( no_shoots || delta <= blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_TOP; + alignment->align_top = zone->cur_ref; + } + break; + } + } + + /* look up stem bottom in bottom zones table */ + table = &blues->normal_bottom; + count = table->count; + zone = table->zones + count-1; + + for ( ; count > 0; count--, zone-- ) + { + delta = zone->org_top - stem_bot; + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_bot >= zone->org_bottom - blues->blue_fuzz ) + { + if ( no_shoots || delta < blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_BOT; + alignment->align_bot = zone->cur_ref; + } + break; + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_globals_destroy( PSH_Globals globals ) + { + if ( globals ) + { + FT_Memory memory; + + + memory = globals->memory; + globals->dimension[0].stdw.count = 0; + globals->dimension[1].stdw.count = 0; + + globals->blues.normal_top.count = 0; + globals->blues.normal_bottom.count = 0; + globals->blues.family_top.count = 0; + globals->blues.family_bottom.count = 0; + + FT_FREE( globals ); + +#ifdef DEBUG_HINTER + ps_debug_globals = 0; +#endif + } + } + + + static FT_Error + psh_globals_new( FT_Memory memory, + T1_Private* priv, + PSH_Globals *aglobals ) + { + PSH_Globals globals; + FT_Error error; + + + if ( !FT_NEW( globals ) ) + { + FT_UInt count; + FT_Short* read; + + + globals->memory = memory; + + /* copy standard widths */ + { + PSH_Dimension dim = &globals->dimension[1]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_width[0]; + write++; + + read = priv->snap_widths; + for ( count = priv->num_snap_widths; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_widths + 1; + } + + /* copy standard heights */ + { + PSH_Dimension dim = &globals->dimension[0]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_height[0]; + write++; + read = priv->snap_heights; + for ( count = priv->num_snap_heights; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_heights + 1; + } + + /* copy blue zones */ + psh_blues_set_zones( &globals->blues, priv->num_blue_values, + priv->blue_values, priv->num_other_blues, + priv->other_blues, priv->blue_fuzz, 0 ); + + psh_blues_set_zones( &globals->blues, priv->num_family_blues, + priv->family_blues, priv->num_family_other_blues, + priv->family_other_blues, priv->blue_fuzz, 1 ); + + globals->blues.blue_scale = priv->blue_scale; + globals->blues.blue_shift = priv->blue_shift; + globals->blues.blue_fuzz = priv->blue_fuzz; + + globals->dimension[0].scale_mult = 0; + globals->dimension[0].scale_delta = 0; + globals->dimension[1].scale_mult = 0; + globals->dimension[1].scale_delta = 0; + +#ifdef DEBUG_HINTER + ps_debug_globals = globals; +#endif + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ) + { + PSH_Dimension dim = &globals->dimension[0]; + + + dim = &globals->dimension[0]; + if ( x_scale != dim->scale_mult || + x_delta != dim->scale_delta ) + { + dim->scale_mult = x_scale; + dim->scale_delta = x_delta; + + psh_globals_scale_widths( globals, 0 ); + } + + dim = &globals->dimension[1]; + if ( y_scale != dim->scale_mult || + y_delta != dim->scale_delta ) + { + dim->scale_mult = y_scale; + dim->scale_delta = y_delta; + + psh_globals_scale_widths( globals, 1 ); + psh_blues_scale_zones( &globals->blues, y_scale, y_delta ); + } + + return 0; + } + + + FT_LOCAL_DEF( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ) + { + funcs->create = psh_globals_new; + funcs->set_scale = psh_globals_set_scale; + funcs->destroy = psh_globals_destroy; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshglob.h b/src/3rdparty/freetype/src/pshinter/pshglob.h new file mode 100644 index 0000000000..c511626157 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshglob.h @@ -0,0 +1,196 @@ +/***************************************************************************/ +/* */ +/* pshglob.h */ +/* */ +/* PostScript hinter global hinting management. */ +/* */ +/* Copyright 2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHGLOB_H__ +#define __PSHGLOB_H__ + + +#include FT_FREETYPE_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* @constant: */ + /* PS_GLOBALS_MAX_BLUE_ZONES */ + /* */ + /* @description: */ + /* The maximum number of blue zones in a font global hints structure. */ + /* See @PS_Globals_BluesRec. */ + /* */ +#define PS_GLOBALS_MAX_BLUE_ZONES 16 + + + /*************************************************************************/ + /* */ + /* @constant: */ + /* PS_GLOBALS_MAX_STD_WIDTHS */ + /* */ + /* @description: */ + /* The maximum number of standard and snap widths in either the */ + /* horizontal or vertical direction. See @PS_Globals_WidthsRec. */ + /* */ +#define PS_GLOBALS_MAX_STD_WIDTHS 16 + + + /* standard and snap width */ + typedef struct PSH_WidthRec_ + { + FT_Int org; + FT_Pos cur; + FT_Pos fit; + + } PSH_WidthRec, *PSH_Width; + + + /* standard and snap widths table */ + typedef struct PSH_WidthsRec_ + { + FT_UInt count; + PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS]; + + } PSH_WidthsRec, *PSH_Widths; + + + typedef struct PSH_DimensionRec_ + { + PSH_WidthsRec stdw; + FT_Fixed scale_mult; + FT_Fixed scale_delta; + + } PSH_DimensionRec, *PSH_Dimension; + + + /* blue zone descriptor */ + typedef struct PSH_Blue_ZoneRec_ + { + FT_Int org_ref; + FT_Int org_delta; + FT_Int org_top; + FT_Int org_bottom; + + FT_Pos cur_ref; + FT_Pos cur_delta; + FT_Pos cur_bottom; + FT_Pos cur_top; + + } PSH_Blue_ZoneRec, *PSH_Blue_Zone; + + + typedef struct PSH_Blue_TableRec_ + { + FT_UInt count; + PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES]; + + } PSH_Blue_TableRec, *PSH_Blue_Table; + + + /* blue zones table */ + typedef struct PSH_BluesRec_ + { + PSH_Blue_TableRec normal_top; + PSH_Blue_TableRec normal_bottom; + PSH_Blue_TableRec family_top; + PSH_Blue_TableRec family_bottom; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_threshold; + FT_Int blue_fuzz; + FT_Bool no_overshoots; + + } PSH_BluesRec, *PSH_Blues; + + + /* font globals. */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PSH_GlobalsRec_ + { + FT_Memory memory; + PSH_DimensionRec dimension[2]; + PSH_BluesRec blues; + + } PSH_GlobalsRec; + + +#define PSH_BLUE_ALIGN_NONE 0 +#define PSH_BLUE_ALIGN_TOP 1 +#define PSH_BLUE_ALIGN_BOT 2 + + + typedef struct PSH_AlignmentRec_ + { + int align; + FT_Pos align_top; + FT_Pos align_bot; + + } PSH_AlignmentRec, *PSH_Alignment; + + + FT_LOCAL( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ); + + +#if 0 + /* snap a stem width to fitter coordinates. `org_width' is in font */ + /* units. The result is in device pixels (26.6 format). */ + FT_LOCAL( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ); +#endif + + FT_LOCAL( FT_Error ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + /* snap a stem to one or two blue zones */ + FT_LOCAL( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ); + /* */ + +#ifdef DEBUG_HINTER + extern PSH_Globals ps_debug_globals; +#endif + + +FT_END_HEADER + + +#endif /* __PSHGLOB_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshinter.c b/src/3rdparty/freetype/src/pshinter/pshinter.c new file mode 100644 index 0000000000..8e3f193093 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshinter.c @@ -0,0 +1,28 @@ +/***************************************************************************/ +/* */ +/* pshinter.c */ +/* */ +/* FreeType PostScript Hinting module */ +/* */ +/* Copyright 2001, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "pshrec.c" +#include "pshglob.c" +#include "pshalgo.c" +#include "pshmod.c" + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshmod.c b/src/3rdparty/freetype/src/pshinter/pshmod.c new file mode 100644 index 0000000000..4eb3d91272 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshmod.c @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* pshmod.c */ +/* */ +/* FreeType PostScript hinter module implementation (body). */ +/* */ +/* Copyright 2001, 2002, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include "pshrec.h" +#include "pshalgo.h" + + + /* the Postscript Hinter module structure */ + typedef struct PS_Hinter_Module_Rec_ + { + FT_ModuleRec root; + PS_HintsRec ps_hints; + + PSH_Globals_FuncsRec globals_funcs; + T1_Hints_FuncsRec t1_funcs; + T2_Hints_FuncsRec t2_funcs; + + } PS_Hinter_ModuleRec, *PS_Hinter_Module; + + + /* finalize module */ + FT_CALLBACK_DEF( void ) + ps_hinter_done( PS_Hinter_Module module ) + { + module->t1_funcs.hints = NULL; + module->t2_funcs.hints = NULL; + + ps_hints_done( &module->ps_hints ); + } + + + /* initialize module, create hints recorder and the interface */ + FT_CALLBACK_DEF( FT_Error ) + ps_hinter_init( PS_Hinter_Module module ) + { + FT_Memory memory = module->root.memory; + void* ph = &module->ps_hints; + + + ps_hints_init( &module->ps_hints, memory ); + + psh_globals_funcs_init( &module->globals_funcs ); + + t1_hints_funcs_init( &module->t1_funcs ); + module->t1_funcs.hints = (T1_Hints)ph; + + t2_hints_funcs_init( &module->t2_funcs ); + module->t2_funcs.hints = (T2_Hints)ph; + + return 0; + } + + + /* returns global hints interface */ + FT_CALLBACK_DEF( PSH_Globals_Funcs ) + pshinter_get_globals_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->globals_funcs; + } + + + /* return Type 1 hints interface */ + FT_CALLBACK_DEF( T1_Hints_Funcs ) + pshinter_get_t1_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t1_funcs; + } + + + /* return Type 2 hints interface */ + FT_CALLBACK_DEF( T2_Hints_Funcs ) + pshinter_get_t2_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t2_funcs; + } + + + static + const PSHinter_Interface pshinter_interface = + { + pshinter_get_globals_funcs, + pshinter_get_t1_funcs, + pshinter_get_t2_funcs + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class pshinter_module_class = + { + 0, + sizeof ( PS_Hinter_ModuleRec ), + "pshinter", + 0x10000L, + 0x20000L, + + &pshinter_interface, /* module-specific interface */ + + (FT_Module_Constructor)ps_hinter_init, + (FT_Module_Destructor) ps_hinter_done, + (FT_Module_Requester) 0 /* no additional interface for now */ + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshmod.h b/src/3rdparty/freetype/src/pshinter/pshmod.h new file mode 100644 index 0000000000..1a91025b26 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshmod.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* pshmod.h */ +/* */ +/* PostScript hinter module interface (specification). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHMOD_H__ +#define __PSHMOD_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Module_Class ) pshinter_module_class; + + +FT_END_HEADER + + +#endif /* __PSHMOD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshnterr.h b/src/3rdparty/freetype/src/pshinter/pshnterr.h new file mode 100644 index 0000000000..3c0029fbf3 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshnterr.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* pshnterr.h */ +/* */ +/* PS Hinter error codes (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PSHinter error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSHNTERR_H__ +#define __PSHNTERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSH_Err_ +#define FT_ERR_BASE FT_Mod_Err_PShinter + +#include FT_ERRORS_H + +#endif /* __PSHNTERR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshrec.c b/src/3rdparty/freetype/src/pshinter/pshrec.c new file mode 100644 index 0000000000..2a885ef276 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshrec.c @@ -0,0 +1,1215 @@ +/***************************************************************************/ +/* */ +/* pshrec.c */ +/* */ +/* FreeType PostScript hints recorder (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include "pshrec.h" +#include "pshalgo.h" + +#include "pshnterr.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pshrec + +#ifdef DEBUG_HINTER + PS_Hints ps_debug_hints = 0; + int ps_debug_no_horz_hints = 0; + int ps_debug_no_vert_hints = 0; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_HINT MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy hints table */ + static void + ps_hint_table_done( PS_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + } + + + /* ensure that a table can contain "count" elements */ + static FT_Error + ps_hint_table_ensure( PS_Hint_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_hints; + FT_UInt new_max = count; + FT_Error error = 0; + + + if ( new_max > old_max ) + { + /* try to grow the table */ + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) + table->max_hints = new_max; + } + return error; + } + + + static FT_Error + ps_hint_table_alloc( PS_Hint_Table table, + FT_Memory memory, + PS_Hint *ahint ) + { + FT_Error error = 0; + FT_UInt count; + PS_Hint hint = 0; + + + count = table->num_hints; + count++; + + if ( count >= table->max_hints ) + { + error = ps_hint_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + hint = table->hints + count - 1; + hint->pos = 0; + hint->len = 0; + hint->flags = 0; + + table->num_hints = count; + + Exit: + *ahint = hint; + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_MASK MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy mask */ + static void + ps_mask_done( PS_Mask mask, + FT_Memory memory ) + { + FT_FREE( mask->bytes ); + mask->num_bits = 0; + mask->max_bits = 0; + mask->end_point = 0; + } + + + /* ensure that a mask can contain "count" bits */ + static FT_Error + ps_mask_ensure( PS_Mask mask, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = ( mask->max_bits + 7 ) >> 3; + FT_UInt new_max = ( count + 7 ) >> 3; + FT_Error error = 0; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) + mask->max_bits = new_max * 8; + } + return error; + } + + + /* test a bit value in a given mask */ + static FT_Int + ps_mask_test_bit( PS_Mask mask, + FT_Int idx ) + { + if ( (FT_UInt)idx >= mask->num_bits ) + return 0; + + return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); + } + + + /* clear a given bit */ + static void + ps_mask_clear_bit( PS_Mask mask, + FT_Int idx ) + { + FT_Byte* p; + + + if ( (FT_UInt)idx >= mask->num_bits ) + return; + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) ); + } + + + /* set a given bit, possibly grow the mask */ + static FT_Error + ps_mask_set_bit( PS_Mask mask, + FT_Int idx, + FT_Memory memory ) + { + FT_Error error = 0; + FT_Byte* p; + + + if ( idx < 0 ) + goto Exit; + + if ( (FT_UInt)idx >= mask->num_bits ) + { + error = ps_mask_ensure( mask, idx + 1, memory ); + if ( error ) + goto Exit; + + mask->num_bits = idx + 1; + } + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) ); + + Exit: + return error; + } + + + /* destroy mask table */ + static void + ps_mask_table_done( PS_Mask_Table table, + FT_Memory memory ) + { + FT_UInt count = table->max_masks; + PS_Mask mask = table->masks; + + + for ( ; count > 0; count--, mask++ ) + ps_mask_done( mask, memory ); + + FT_FREE( table->masks ); + table->num_masks = 0; + table->max_masks = 0; + } + + + /* ensure that a mask table can contain "count" masks */ + static FT_Error + ps_mask_table_ensure( PS_Mask_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_masks; + FT_UInt new_max = count; + FT_Error error = 0; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) + table->max_masks = new_max; + } + return error; + } + + + /* allocate a new mask in a table */ + static FT_Error + ps_mask_table_alloc( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_UInt count; + FT_Error error = 0; + PS_Mask mask = 0; + + + count = table->num_masks; + count++; + + if ( count > table->max_masks ) + { + error = ps_mask_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + mask = table->masks + count - 1; + mask->num_bits = 0; + mask->end_point = 0; + table->num_masks = count; + + Exit: + *amask = mask; + return error; + } + + + /* return last hint mask in a table, create one if the table is empty */ + static FT_Error + ps_mask_table_last( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_Error error = 0; + FT_UInt count; + PS_Mask mask; + + + count = table->num_masks; + if ( count == 0 ) + { + error = ps_mask_table_alloc( table, memory, &mask ); + if ( error ) + goto Exit; + } + else + mask = table->masks + count - 1; + + Exit: + *amask = mask; + return error; + } + + + /* set a new mask to a given bit range */ + static FT_Error + ps_mask_table_set_bits( PS_Mask_Table table, + const FT_Byte* source, + FT_UInt bit_pos, + FT_UInt bit_count, + FT_Memory memory ) + { + FT_Error error = 0; + PS_Mask mask; + + + error = ps_mask_table_last( table, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_ensure( mask, bit_count, memory ); + if ( error ) + goto Exit; + + mask->num_bits = bit_count; + + /* now, copy bits */ + { + FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 ); + FT_Int rmask = 0x80 >> ( bit_pos & 7 ); + FT_Byte* write = mask->bytes; + FT_Int wmask = 0x80; + FT_Int val; + + + for ( ; bit_count > 0; bit_count-- ) + { + val = write[0] & ~wmask; + + if ( read[0] & rmask ) + val |= wmask; + + write[0] = (FT_Byte)val; + + rmask >>= 1; + if ( rmask == 0 ) + { + read++; + rmask = 0x80; + } + + wmask >>= 1; + if ( wmask == 0 ) + { + write++; + wmask = 0x80; + } + } + } + + Exit: + return error; + } + + + /* test whether two masks in a table intersect */ + static FT_Int + ps_mask_table_test_intersect( PS_Mask_Table table, + FT_Int index1, + FT_Int index2 ) + { + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_Byte* p1 = mask1->bytes; + FT_Byte* p2 = mask2->bytes; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_UInt count; + + + count = ( count1 <= count2 ) ? count1 : count2; + for ( ; count >= 8; count -= 8 ) + { + if ( p1[0] & p2[0] ) + return 1; + + p1++; + p2++; + } + + if ( count == 0 ) + return 0; + + return ( p1[0] & p2[0] ) & ~( 0xFF >> count ); + } + + + /* merge two masks, used by ps_mask_table_merge_all */ + static FT_Error + ps_mask_table_merge( PS_Mask_Table table, + FT_Int index1, + FT_Int index2, + FT_Memory memory ) + { + FT_UInt temp; + FT_Error error = 0; + + + /* swap index1 and index2 so that index1 < index2 */ + if ( index1 > index2 ) + { + temp = index1; + index1 = index2; + index2 = temp; + } + + if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks ) + { + /* we need to merge the bitsets of index1 and index2 with a */ + /* simple union */ + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_Int delta; + + + if ( count2 > 0 ) + { + FT_UInt pos; + FT_Byte* read; + FT_Byte* write; + + + /* if "count2" is greater than "count1", we need to grow the */ + /* first bitset, and clear the highest bits */ + if ( count2 > count1 ) + { + error = ps_mask_ensure( mask1, count2, memory ); + if ( error ) + goto Exit; + + for ( pos = count1; pos < count2; pos++ ) + ps_mask_clear_bit( mask1, pos ); + } + + /* merge (unite) the bitsets */ + read = mask2->bytes; + write = mask1->bytes; + pos = (FT_UInt)( ( count2 + 7 ) >> 3 ); + + for ( ; pos > 0; pos-- ) + { + write[0] = (FT_Byte)( write[0] | read[0] ); + write++; + read++; + } + } + + /* Now, remove "mask2" from the list. We need to keep the masks */ + /* sorted in order of importance, so move table elements. */ + mask2->num_bits = 0; + mask2->end_point = 0; + + delta = table->num_masks - 1 - index2; /* number of masks to move */ + if ( delta > 0 ) + { + /* move to end of table for reuse */ + PS_MaskRec dummy = *mask2; + + + ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) ); + + mask2[delta] = dummy; + } + + table->num_masks--; + } + else + FT_ERROR(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n", + index1, index2 )); + + Exit: + return error; + } + + + /* Try to merge all masks in a given table. This is used to merge */ + /* all counter masks into independent counter "paths". */ + /* */ + static FT_Error + ps_mask_table_merge_all( PS_Mask_Table table, + FT_Memory memory ) + { + FT_Int index1, index2; + FT_Error error = 0; + + + for ( index1 = table->num_masks - 1; index1 > 0; index1-- ) + { + for ( index2 = index1 - 1; index2 >= 0; index2-- ) + { + if ( ps_mask_table_test_intersect( table, index1, index2 ) ) + { + error = ps_mask_table_merge( table, index2, index1, memory ); + if ( error ) + goto Exit; + + break; + } + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_DIMENSION MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* finalize a given dimension */ + static void + ps_dimension_done( PS_Dimension dimension, + FT_Memory memory ) + { + ps_mask_table_done( &dimension->counters, memory ); + ps_mask_table_done( &dimension->masks, memory ); + ps_hint_table_done( &dimension->hints, memory ); + } + + + /* initialize a given dimension */ + static void + ps_dimension_init( PS_Dimension dimension ) + { + dimension->hints.num_hints = 0; + dimension->masks.num_masks = 0; + dimension->counters.num_masks = 0; + } + + +#if 0 + + /* set a bit at a given index in the current hint mask */ + static FT_Error + ps_dimension_set_mask_bit( PS_Dimension dim, + FT_UInt idx, + FT_Memory memory ) + { + PS_Mask mask; + FT_Error error = 0; + + + /* get last hint mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + + Exit: + return error; + } + +#endif + + /* set the end point in a mask, called from "End" & "Reset" methods */ + static void + ps_dimension_end_mask( PS_Dimension dim, + FT_UInt end_point ) + { + FT_UInt count = dim->masks.num_masks; + PS_Mask mask; + + + if ( count > 0 ) + { + mask = dim->masks.masks + count - 1; + mask->end_point = end_point; + } + } + + + /* set the end point in the current mask, then create a new empty one */ + /* (called by "Reset" method) */ + static FT_Error + ps_dimension_reset_mask( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + PS_Mask mask; + + + /* end current mask */ + ps_dimension_end_mask( dim, end_point ); + + /* allocate new one */ + return ps_mask_table_alloc( &dim->masks, memory, &mask ); + } + + + /* set a new mask, called from the "T2Stem" method */ + static FT_Error + ps_dimension_set_mask_bits( PS_Dimension dim, + const FT_Byte* source, + FT_UInt source_pos, + FT_UInt source_bits, + FT_UInt end_point, + FT_Memory memory ) + { + FT_Error error = 0; + + + /* reset current mask, if any */ + error = ps_dimension_reset_mask( dim, end_point, memory ); + if ( error ) + goto Exit; + + /* set bits in new mask */ + error = ps_mask_table_set_bits( &dim->masks, source, + source_pos, source_bits, memory ); + + Exit: + return error; + } + + + /* add a new single stem (called from "T1Stem" method) */ + static FT_Error + ps_dimension_add_t1stem( PS_Dimension dim, + FT_Int pos, + FT_Int len, + FT_Memory memory, + FT_Int *aindex ) + { + FT_Error error = 0; + FT_UInt flags = 0; + + + /* detect ghost stem */ + if ( len < 0 ) + { + flags |= PS_HINT_FLAG_GHOST; + if ( len == -21 ) + { + flags |= PS_HINT_FLAG_BOTTOM; + pos += len; + } + len = 0; + } + + if ( aindex ) + *aindex = -1; + + /* now, lookup stem in the current hints table */ + { + PS_Mask mask; + FT_UInt idx; + FT_UInt max = dim->hints.num_hints; + PS_Hint hint = dim->hints.hints; + + + for ( idx = 0; idx < max; idx++, hint++ ) + { + if ( hint->pos == pos && hint->len == len ) + break; + } + + /* we need to create a new hint in the table */ + if ( idx >= max ) + { + error = ps_hint_table_alloc( &dim->hints, memory, &hint ); + if ( error ) + goto Exit; + + hint->pos = pos; + hint->len = len; + hint->flags = flags; + } + + /* now, store the hint in the current mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + if ( error ) + goto Exit; + + if ( aindex ) + *aindex = (FT_Int)idx; + } + + Exit: + return error; + } + + + /* add a "hstem3/vstem3" counter to our dimension table */ + static FT_Error + ps_dimension_add_counter( PS_Dimension dim, + FT_Int hint1, + FT_Int hint2, + FT_Int hint3, + FT_Memory memory ) + { + FT_Error error = 0; + FT_UInt count = dim->counters.num_masks; + PS_Mask counter = dim->counters.masks; + + + /* try to find an existing counter mask that already uses */ + /* one of these stems here */ + for ( ; count > 0; count--, counter++ ) + { + if ( ps_mask_test_bit( counter, hint1 ) || + ps_mask_test_bit( counter, hint2 ) || + ps_mask_test_bit( counter, hint3 ) ) + break; + } + + /* create a new counter when needed */ + if ( count == 0 ) + { + error = ps_mask_table_alloc( &dim->counters, memory, &counter ); + if ( error ) + goto Exit; + } + + /* now, set the bits for our hints in the counter mask */ + error = ps_mask_set_bit( counter, hint1, memory ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( counter, hint2, memory ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( counter, hint3, memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* end of recording session for a given dimension */ + static FT_Error + ps_dimension_end( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + /* end hint mask table */ + ps_dimension_end_mask( dim, end_point ); + + /* merge all counter masks into independent "paths" */ + return ps_mask_table_merge_all( &dim->counters, memory ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_RECORDER MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* destroy hints */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ) + { + FT_Memory memory = hints->memory; + + + ps_dimension_done( &hints->dimension[0], memory ); + ps_dimension_done( &hints->dimension[1], memory ); + + hints->error = 0; + hints->memory = 0; + } + + + FT_LOCAL( FT_Error ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ) + { + FT_MEM_ZERO( hints, sizeof ( *hints ) ); + hints->memory = memory; + return 0; + } + + + /* initialize a hints for a new session */ + static void + ps_hints_open( PS_Hints hints, + PS_Hint_Type hint_type ) + { + switch ( hint_type ) + { + case PS_HINT_TYPE_1: + case PS_HINT_TYPE_2: + hints->error = 0; + hints->hint_type = hint_type; + + ps_dimension_init( &hints->dimension[0] ); + ps_dimension_init( &hints->dimension[1] ); + break; + + default: + hints->error = PSH_Err_Invalid_Argument; + hints->hint_type = hint_type; + + FT_ERROR(( "ps_hints_open: invalid charstring type!\n" )); + break; + } + } + + + /* add one or more stems to the current hints table */ + static void + ps_hints_stem( PS_Hints hints, + FT_Int dimension, + FT_UInt count, + FT_Long* stems ) + { + if ( !hints->error ) + { + /* limit "dimension" to 0..1 */ + if ( dimension < 0 || dimension > 1 ) + { + FT_ERROR(( "ps_hints_stem: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + /* record the stems in the current hints/masks table */ + switch ( hints->hint_type ) + { + case PS_HINT_TYPE_1: /* Type 1 "hstem" or "vstem" operator */ + case PS_HINT_TYPE_2: /* Type 2 "hstem" or "vstem" operator */ + { + PS_Dimension dim = &hints->dimension[dimension]; + + + for ( ; count > 0; count--, stems += 2 ) + { + FT_Error error; + FT_Memory memory = hints->memory; + + + error = ps_dimension_add_t1stem( + dim, (FT_Int)stems[0], (FT_Int)stems[1], + memory, NULL ); + if ( error ) + { + FT_ERROR(( "ps_hints_stem: could not add stem" + " (%d,%d) to hints table\n", stems[0], stems[1] )); + + hints->error = error; + return; + } + } + break; + } + + default: + FT_ERROR(( "ps_hints_stem: called with invalid hint type (%d)\n", + hints->hint_type )); + break; + } + } + } + + + /* add one Type1 counter stem to the current hints table */ + static void + ps_hints_t1stem3( PS_Hints hints, + FT_Int dimension, + FT_Long* stems ) + { + FT_Error error = 0; + + + if ( !hints->error ) + { + PS_Dimension dim; + FT_Memory memory = hints->memory; + FT_Int count; + FT_Int idx[3]; + + + /* limit "dimension" to 0..1 */ + if ( dimension < 0 || dimension > 1 ) + { + FT_ERROR(( "ps_hints_t1stem3: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + dim = &hints->dimension[dimension]; + + /* there must be 6 elements in the 'stem' array */ + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + /* add the three stems to our hints/masks table */ + for ( count = 0; count < 3; count++, stems += 2 ) + { + error = ps_dimension_add_t1stem( + dim, (FT_Int)stems[0], (FT_Int)stems[1], + memory, &idx[count] ); + if ( error ) + goto Fail; + } + + /* now, add the hints to the counters table */ + error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2], + memory ); + if ( error ) + goto Fail; + } + else + { + FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type!\n" )); + error = PSH_Err_Invalid_Argument; + goto Fail; + } + } + + return; + + Fail: + FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" )); + hints->error = error; + } + + + /* reset hints (only with Type 1 hints) */ + static void + ps_hints_t1reset( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error = 0; + + + if ( !hints->error ) + { + FT_Memory memory = hints->memory; + + + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + error = ps_dimension_reset_mask( &hints->dimension[0], + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_reset_mask( &hints->dimension[1], + end_point, memory ); + if ( error ) + goto Fail; + } + else + { + /* invalid hint type */ + error = PSH_Err_Invalid_Argument; + goto Fail; + } + } + return; + + Fail: + hints->error = error; + } + + + /* Type2 "hintmask" operator, add a new hintmask to each direction */ + static void + ps_hints_t2mask( PS_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count; must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_ERROR(( "ps_hints_t2mask: " + "called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, + end_point, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + static void + ps_hints_t2counter( PS_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count, must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_ERROR(( "ps_hints_t2counter: " + "called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, + 0, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, + 0, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + /* end recording session */ + static FT_Error + ps_hints_close( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error; + + + error = hints->error; + if ( !error ) + { + FT_Memory memory = hints->memory; + PS_Dimension dim = hints->dimension; + + + error = ps_dimension_end( &dim[0], end_point, memory ); + if ( !error ) + { + error = ps_dimension_end( &dim[1], end_point, memory ); + } + } + +#ifdef DEBUG_HINTER + if ( !error ) + ps_debug_hints = hints; +#endif + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_hints_open( T1_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); + } + + static void + t1_hints_stem( T1_Hints hints, + FT_Int dimension, + FT_Long* coords ) + { + ps_hints_stem( (PS_Hints)hints, dimension, 1, coords ); + } + + + FT_LOCAL_DEF( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) + { + FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) ); + + funcs->open = (T1_Hints_OpenFunc) t1_hints_open; + funcs->close = (T1_Hints_CloseFunc) ps_hints_close; + funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; + funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; + funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; + funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 2 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t2_hints_open( T2_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 ); + } + + + static void + t2_hints_stems( T2_Hints hints, + FT_Int dimension, + FT_Int count, + FT_Fixed* coords ) + { + FT_Pos stems[32], y, n; + FT_Int total = count; + + + y = 0; + while ( total > 0 ) + { + /* determine number of stems to write */ + count = total; + if ( count > 16 ) + count = 16; + + /* compute integer stem positions in font units */ + for ( n = 0; n < count * 2; n++ ) + { + y += coords[n]; + stems[n] = ( y + 0x8000L ) >> 16; + } + + /* compute lengths */ + for ( n = 0; n < count * 2; n += 2 ) + stems[n + 1] = stems[n + 1] - stems[n]; + + /* add them to the current dimension */ + ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); + + total -= count; + } + } + + + FT_LOCAL_DEF( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) + { + FT_MEM_ZERO( funcs, sizeof ( *funcs ) ); + + funcs->open = (T2_Hints_OpenFunc) t2_hints_open; + funcs->close = (T2_Hints_CloseFunc) ps_hints_close; + funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; + funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; + funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; + funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/pshrec.h b/src/3rdparty/freetype/src/pshinter/pshrec.h new file mode 100644 index 0000000000..dcb3197f94 --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/pshrec.h @@ -0,0 +1,176 @@ +/***************************************************************************/ +/* */ +/* pshrec.h */ +/* */ +/* Postscript (Type1/Type2) hints recorder (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /**************************************************************************/ + /* */ + /* The functions defined here are called from the Type 1, CID and CFF */ + /* font drivers to record the hints of a given character/glyph. */ + /* */ + /* The hints are recorded in a unified format, and are later processed */ + /* by the `optimizer' and `fitter' to adjust the outlines to the pixel */ + /* grid. */ + /* */ + /**************************************************************************/ + + +#ifndef __PSHREC_H__ +#define __PSHREC_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include "pshglob.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH HINTS RECORDER INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to hint record */ + typedef struct PS_HintRec_* PS_Hint; + + /* hint types */ + typedef enum PS_Hint_Type_ + { + PS_HINT_TYPE_1 = 1, + PS_HINT_TYPE_2 = 2 + + } PS_Hint_Type; + + + /* hint flags */ + typedef enum PS_Hint_Flags_ + { + PS_HINT_FLAG_GHOST = 1, + PS_HINT_FLAG_BOTTOM = 2 + + } PS_Hint_Flags; + + + /* hint descriptor */ + typedef struct PS_HintRec_ + { + FT_Int pos; + FT_Int len; + FT_UInt flags; + + } PS_HintRec; + + +#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE ) +#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST ) +#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM ) + + + /* hints table descriptor */ + typedef struct PS_Hint_TableRec_ + { + FT_UInt num_hints; + FT_UInt max_hints; + PS_Hint hints; + + } PS_Hint_TableRec, *PS_Hint_Table; + + + /* hint and counter mask descriptor */ + typedef struct PS_MaskRec_ + { + FT_UInt num_bits; + FT_UInt max_bits; + FT_Byte* bytes; + FT_UInt end_point; + + } PS_MaskRec, *PS_Mask; + + + /* masks and counters table descriptor */ + typedef struct PS_Mask_TableRec_ + { + FT_UInt num_masks; + FT_UInt max_masks; + PS_Mask masks; + + } PS_Mask_TableRec, *PS_Mask_Table; + + + /* dimension-specific hints descriptor */ + typedef struct PS_DimensionRec_ + { + PS_Hint_TableRec hints; + PS_Mask_TableRec masks; + PS_Mask_TableRec counters; + + } PS_DimensionRec, *PS_Dimension; + + + /* glyph hints descriptor */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PS_HintsRec_ + { + FT_Memory memory; + FT_Error error; + FT_UInt32 magic; + PS_Hint_Type hint_type; + PS_DimensionRec dimension[2]; + + } PS_HintsRec, *PS_Hints; + + /* */ + + /* initialize hints recorder */ + FT_LOCAL( FT_Error ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ); + + /* finalize hints recorder */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ); + + /* initialize Type1 hints recorder interface */ + FT_LOCAL( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ); + + /* initialize Type2 hints recorder interface */ + FT_LOCAL( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ); + + +#ifdef DEBUG_HINTER + extern PS_Hints ps_debug_hints; + extern int ps_debug_no_horz_hints; + extern int ps_debug_no_vert_hints; +#endif + + /* */ + + +FT_END_HEADER + + +#endif /* __PS_HINTER_RECORD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/pshinter/rules.mk b/src/3rdparty/freetype/src/pshinter/rules.mk new file mode 100644 index 0000000000..57773394ac --- /dev/null +++ b/src/3rdparty/freetype/src/pshinter/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 PSHinter driver configuration rules +# + + +# Copyright 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# PSHINTER driver directory +# +PSHINTER_DIR := $(SRC_DIR)/pshinter + + +# compilation flags for the driver +# +PSHINTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR)) + + +# PSHINTER driver sources (i.e., C files) +# +PSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshrec.c \ + $(PSHINTER_DIR)/pshglob.c \ + $(PSHINTER_DIR)/pshmod.c \ + $(PSHINTER_DIR)/pshalgo.c + + +# PSHINTER driver headers +# +PSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \ + $(PSHINTER_DIR)/pshnterr.h + + +# PSHINTER driver object(s) +# +# PSHINTER_DRV_OBJ_M is used during `multi' builds. +# PSHINTER_DRV_OBJ_S is used during `single' builds. +# +PSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O + +# PSHINTER driver source file for single build +# +PSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c + + +# PSHINTER driver - single object +# +$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \ + $(FREETYPE_H) $(PSHINTER_DRV_H) + $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S)) + + +# PSHINTER driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H) + $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSHINTER_DRV_OBJ_S) +DRV_OBJS_M += $(PSHINTER_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/psnames/Jamfile b/src/3rdparty/freetype/src/psnames/Jamfile new file mode 100644 index 0000000000..d85c1e97de --- /dev/null +++ b/src/3rdparty/freetype/src/psnames/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/psnames Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) psnames ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = psmodule ; + } + else + { + _sources = psnames ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/psnames Jamfile diff --git a/src/3rdparty/freetype/src/psnames/module.mk b/src/3rdparty/freetype/src/psnames/module.mk new file mode 100644 index 0000000000..a6e908257c --- /dev/null +++ b/src/3rdparty/freetype/src/psnames/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSnames module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSNAMES_MODULE + +define PSNAMES_MODULE +$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)psnames $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/psnames/psmodule.c b/src/3rdparty/freetype/src/psnames/psmodule.c new file mode 100644 index 0000000000..41942a9b46 --- /dev/null +++ b/src/3rdparty/freetype/src/psnames/psmodule.c @@ -0,0 +1,590 @@ +/***************************************************************************/ +/* */ +/* psmodule.c */ +/* */ +/* PSNames module implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#include "psmodule.h" +#include "pstables.h" + +#include "psnamerr.h" + + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + +#define VARIANT_BIT 0x80000000UL +#define BASE_GLYPH( code ) ( (code) & ~VARIANT_BIT ) + + + /* Return the Unicode value corresponding to a given glyph. Note that */ + /* we do deal with glyph variants by detecting a non-initial dot in */ + /* the name, as in `A.swash' or `e.final'; in this case, the */ + /* VARIANT_BIT is set in the return value. */ + /* */ + static FT_UInt32 + ps_unicode_value( const char* glyph_name ) + { + /* If the name begins with `uni', then the glyph name may be a */ + /* hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' && + glyph_name[1] == 'n' && + glyph_name[2] == 'i' ) + { + /* determine whether the next four characters following are */ + /* hexadecimal. */ + + /* XXX: Add code to deal with ligatures, i.e. glyph names like */ + /* `uniXXXXYYYYZZZZ'... */ + + FT_Int count; + FT_ULong value = 0; + const char* p = glyph_name + 3; + + + for ( count = 4; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + /* Exit if a non-uppercase hexadecimal character was found */ + /* -- this also catches character codes below `0' since such */ + /* negative numbers cast to `unsigned int' are far too big. */ + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + /* there must be exactly four hex digits */ + if ( count == 0 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return value | VARIANT_BIT; + } + } + + /* If the name begins with `u', followed by four to six uppercase */ + /* hexadecimal digits, it is a hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' ) + { + FT_Int count; + FT_ULong value = 0; + const char* p = glyph_name + 1; + + + for ( count = 6; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + if ( count <= 2 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return value | VARIANT_BIT; + } + } + + /* Look for a non-initial dot in the glyph name in order to */ + /* find variants like `A.swash', `e.final', etc. */ + { + const char* p = glyph_name; + const char* dot = NULL; + + + for ( ; *p; p++ ) + { + if ( *p == '.' && p > glyph_name ) + { + dot = p; + break; + } + } + + /* now look up the glyph in the Adobe Glyph List */ + if ( !dot ) + return ft_get_adobe_glyph_index( glyph_name, p ); + else + return ft_get_adobe_glyph_index( glyph_name, dot ) | VARIANT_BIT; + } + } + + + /* ft_qsort callback to sort the unicode map */ + FT_CALLBACK_DEF( int ) + compare_uni_maps( const void* a, + const void* b ) + { + PS_UniMap* map1 = (PS_UniMap*)a; + PS_UniMap* map2 = (PS_UniMap*)b; + FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode ); + FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode ); + + + /* sort base glyphs before glyph variants */ + if ( unicode1 == unicode2 ) + { + if ( map1->unicode > map2->unicode ) + return 1; + else if ( map1->unicode < map2->unicode ) + return -1; + else + return 0; + } + else + { + if ( unicode1 > unicode2 ) + return 1; + else if ( unicode1 < unicode2 ) + return -1; + else + return 0; + } + } + + + /* support for extra glyphs not handled (well) in AGL; */ + /* we add extra mappings for them if necessary */ + +#define EXTRA_GLYPH_LIST_SIZE 10 + + static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] = + { + /* WGL 4 */ + 0x0394, + 0x03A9, + 0x2215, + 0x00AD, + 0x02C9, + 0x03BC, + 0x2219, + 0x00A0, + /* Romanian */ + 0x021A, + 0x021B + }; + + static const char ft_extra_glyph_names[] = + { + 'D','e','l','t','a',0, + 'O','m','e','g','a',0, + 'f','r','a','c','t','i','o','n',0, + 'h','y','p','h','e','n',0, + 'm','a','c','r','o','n',0, + 'm','u',0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0, + 's','p','a','c','e',0, + 'T','c','o','m','m','a','a','c','c','e','n','t',0, + 't','c','o','m','m','a','a','c','c','e','n','t',0 + }; + + static const FT_Int + ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] = + { + 0, + 6, + 12, + 21, + 28, + 35, + 38, + 53, + 59, + 72 + }; + + + static void + ps_check_extra_glyph_name( const char* gname, + FT_UInt glyph, + FT_UInt* extra_glyphs, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( ft_strcmp( ft_extra_glyph_names + + ft_extra_glyph_name_offsets[n], gname ) == 0 ) + { + if ( states[n] == 0 ) + { + /* mark this extra glyph as a candidate for the cmap */ + states[n] = 1; + extra_glyphs[n] = glyph; + } + + return; + } + } + } + + + static void + ps_check_extra_glyph_unicode( FT_UInt32 uni_char, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( uni_char == ft_extra_glyph_unicodes[n] ) + { + /* disable this extra glyph from being added to the cmap */ + states[n] = 2; + + return; + } + } + } + + + /* Build a table that maps Unicode values to glyph indices. */ + static FT_Error + ps_unicodes_init( FT_Memory memory, + PS_Unicodes table, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ) + { + FT_Error error; + + FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE]; + + + /* we first allocate the table */ + table->num_maps = 0; + table->maps = 0; + + if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) ) + { + FT_UInt n; + FT_UInt count; + PS_UniMap* map; + FT_UInt32 uni_char; + + + map = table->maps; + + for ( n = 0; n < num_glyphs; n++ ) + { + const char* gname = get_glyph_name( glyph_data, n ); + + + if ( gname ) + { + ps_check_extra_glyph_name( gname, n, + extra_glyphs, extra_glyph_list_states ); + uni_char = ps_unicode_value( gname ); + + if ( BASE_GLYPH( uni_char ) != 0 ) + { + ps_check_extra_glyph_unicode( uni_char, + extra_glyph_list_states ); + map->unicode = uni_char; + map->glyph_index = n; + map++; + } + + if ( free_glyph_name ) + free_glyph_name( glyph_data, gname ); + } + } + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( extra_glyph_list_states[n] == 1 ) + { + /* This glyph name has an additional representation. */ + /* Add it to the cmap. */ + + map->unicode = ft_extra_glyph_unicodes[n]; + map->glyph_index = extra_glyphs[n]; + map++; + } + } + + /* now compress the table a bit */ + count = (FT_UInt)( map - table->maps ); + + if ( count == 0 ) + { + FT_FREE( table->maps ); + if ( !error ) + error = PSnames_Err_Invalid_Argument; /* No unicode chars here! */ + } + else { + /* Reallocate if the number of used entries is much smaller. */ + if ( count < num_glyphs / 2 ) + { + (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count ); + error = PSnames_Err_Ok; + } + + /* Sort the table in increasing order of unicode values, */ + /* taking care of glyph variants. */ + ft_qsort( table->maps, count, sizeof ( PS_UniMap ), + compare_uni_maps ); + } + + table->num_maps = count; + } + + return error; + } + + + static FT_UInt + ps_unicodes_char_index( PS_Unicodes table, + FT_UInt32 unicode ) + { + PS_UniMap *min, *max, *mid, *result = NULL; + + + /* Perform a binary search on the table. */ + + min = table->maps; + max = min + table->num_maps - 1; + + while ( min <= max ) + { + FT_UInt32 base_glyph; + + + mid = min + ( ( max - min ) >> 1 ); + + if ( mid->unicode == unicode ) + { + result = mid; + break; + } + + base_glyph = BASE_GLYPH( mid->unicode ); + + if ( base_glyph == unicode ) + result = mid; /* remember match but continue search for base glyph */ + + if ( min == max ) + break; + + if ( base_glyph < unicode ) + min = mid + 1; + else + max = mid - 1; + } + + if ( result ) + return result->glyph_index; + else + return 0; + } + + + static FT_ULong + ps_unicodes_char_next( PS_Unicodes table, + FT_UInt32 *unicode ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *unicode + 1; + + + { + FT_UInt min = 0; + FT_UInt max = table->num_maps; + FT_UInt mid; + PS_UniMap* map; + FT_UInt32 base_glyph; + + + while ( min < max ) + { + mid = min + ( ( max - min ) >> 1 ); + map = table->maps + mid; + + if ( map->unicode == char_code ) + { + result = map->glyph_index; + goto Exit; + } + + base_glyph = BASE_GLYPH( map->unicode ); + + if ( base_glyph == char_code ) + result = map->glyph_index; + + if ( base_glyph < char_code ) + min = mid + 1; + else + max = mid; + } + + if ( result ) + goto Exit; /* we have a variant glyph */ + + /* we didn't find it; check whether we have a map just above it */ + char_code = 0; + + if ( min < table->num_maps ) + { + map = table->maps + min; + result = map->glyph_index; + char_code = BASE_GLYPH( map->unicode ); + } + } + + Exit: + *unicode = char_code; + return result; + } + + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + static const char* + ps_get_macintosh_name( FT_UInt name_index ) + { + if ( name_index >= FT_NUM_MAC_NAMES ) + name_index = 0; + + return ft_standard_glyph_names + ft_mac_names[name_index]; + } + + + static const char* + ps_get_standard_strings( FT_UInt sid ) + { + if ( sid >= FT_NUM_SID_NAMES ) + return 0; + + return ft_standard_glyph_names + ft_sid_names[sid]; + } + + + static + const FT_Service_PsCMapsRec pscmaps_interface = + { +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + (PS_Unicode_ValueFunc) ps_unicode_value, + (PS_Unicodes_InitFunc) ps_unicodes_init, + (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, + (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, + +#else + + 0, + 0, + 0, + 0, + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + (PS_Macintosh_NameFunc) ps_get_macintosh_name, + (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, + + t1_standard_encoding, + t1_expert_encoding + }; + + + static const FT_ServiceDescRec pscmaps_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_CMAPS, &pscmaps_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + psnames_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pscmaps_services, service_id ); + } + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class psnames_module_class = + { + 0, /* this is not a font driver, nor a renderer */ + sizeof ( FT_ModuleRec ), + + "psnames", /* driver name */ + 0x10000L, /* driver version */ + 0x20000L, /* driver requires FreeType 2 or above */ + +#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + 0, + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 +#else + (void*)&pscmaps_interface, /* module specific interface */ + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) psnames_get_service +#endif + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/psnames/psmodule.h b/src/3rdparty/freetype/src/psnames/psmodule.h new file mode 100644 index 0000000000..232fdfb9a9 --- /dev/null +++ b/src/3rdparty/freetype/src/psnames/psmodule.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* psmodule.h */ +/* */ +/* High-level PSNames module interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSMODULE_H__ +#define __PSMODULE_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Module_Class ) psnames_module_class; + + +FT_END_HEADER + +#endif /* __PSMODULE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psnames/psnamerr.h b/src/3rdparty/freetype/src/psnames/psnamerr.h new file mode 100644 index 0000000000..ae1541d960 --- /dev/null +++ b/src/3rdparty/freetype/src/psnames/psnamerr.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* psnamerr.h */ +/* */ +/* PS names module error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PS names module error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSNAMERR_H__ +#define __PSNAMERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSnames_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSnames + +#include FT_ERRORS_H + +#endif /* __PSNAMERR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psnames/psnames.c b/src/3rdparty/freetype/src/psnames/psnames.c new file mode 100644 index 0000000000..d6ed998bfb --- /dev/null +++ b/src/3rdparty/freetype/src/psnames/psnames.c @@ -0,0 +1,25 @@ +/***************************************************************************/ +/* */ +/* psnames.c */ +/* */ +/* FreeType PSNames module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "psmodule.c" + + +/* END */ diff --git a/src/3rdparty/freetype/src/psnames/pstables.h b/src/3rdparty/freetype/src/psnames/pstables.h new file mode 100644 index 0000000000..1521e9c285 --- /dev/null +++ b/src/3rdparty/freetype/src/psnames/pstables.h @@ -0,0 +1,4095 @@ +/***************************************************************************/ +/* */ +/* pstables.h */ +/* */ +/* PostScript glyph names. */ +/* */ +/* Copyright 2005, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* This file has been generated automatically -- do not edit! */ + + + static const char ft_standard_glyph_names[3696] = + { + '.','n','u','l','l', 0, + 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0, + 'n','o','t','e','q','u','a','l', 0, + 'i','n','f','i','n','i','t','y', 0, + 'l','e','s','s','e','q','u','a','l', 0, + 'g','r','e','a','t','e','r','e','q','u','a','l', 0, + 'p','a','r','t','i','a','l','d','i','f','f', 0, + 's','u','m','m','a','t','i','o','n', 0, + 'p','r','o','d','u','c','t', 0, + 'p','i', 0, + 'i','n','t','e','g','r','a','l', 0, + 'O','m','e','g','a', 0, + 'r','a','d','i','c','a','l', 0, + 'a','p','p','r','o','x','e','q','u','a','l', 0, + 'D','e','l','t','a', 0, + 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0, + 'l','o','z','e','n','g','e', 0, + 'a','p','p','l','e', 0, + 'f','r','a','n','c', 0, + 'G','b','r','e','v','e', 0, + 'g','b','r','e','v','e', 0, + 'I','d','o','t','a','c','c','e','n','t', 0, + 'S','c','e','d','i','l','l','a', 0, + 's','c','e','d','i','l','l','a', 0, + 'C','a','c','u','t','e', 0, + 'c','a','c','u','t','e', 0, + 'C','c','a','r','o','n', 0, + 'c','c','a','r','o','n', 0, + 'd','c','r','o','a','t', 0, + '.','n','o','t','d','e','f', 0, + 's','p','a','c','e', 0, + 'e','x','c','l','a','m', 0, + 'q','u','o','t','e','d','b','l', 0, + 'n','u','m','b','e','r','s','i','g','n', 0, + 'd','o','l','l','a','r', 0, + 'p','e','r','c','e','n','t', 0, + 'a','m','p','e','r','s','a','n','d', 0, + 'q','u','o','t','e','r','i','g','h','t', 0, + 'p','a','r','e','n','l','e','f','t', 0, + 'p','a','r','e','n','r','i','g','h','t', 0, + 'a','s','t','e','r','i','s','k', 0, + 'p','l','u','s', 0, + 'c','o','m','m','a', 0, + 'h','y','p','h','e','n', 0, + 'p','e','r','i','o','d', 0, + 's','l','a','s','h', 0, + 'z','e','r','o', 0, + 'o','n','e', 0, + 't','w','o', 0, + 't','h','r','e','e', 0, + 'f','o','u','r', 0, + 'f','i','v','e', 0, + 's','i','x', 0, + 's','e','v','e','n', 0, + 'e','i','g','h','t', 0, + 'n','i','n','e', 0, + 'c','o','l','o','n', 0, + 's','e','m','i','c','o','l','o','n', 0, + 'l','e','s','s', 0, + 'e','q','u','a','l', 0, + 'g','r','e','a','t','e','r', 0, + 'q','u','e','s','t','i','o','n', 0, + 'a','t', 0, + 'A', 0, + 'B', 0, + 'C', 0, + 'D', 0, + 'E', 0, + 'F', 0, + 'G', 0, + 'H', 0, + 'I', 0, + 'J', 0, + 'K', 0, + 'L', 0, + 'M', 0, + 'N', 0, + 'O', 0, + 'P', 0, + 'Q', 0, + 'R', 0, + 'S', 0, + 'T', 0, + 'U', 0, + 'V', 0, + 'W', 0, + 'X', 0, + 'Y', 0, + 'Z', 0, + 'b','r','a','c','k','e','t','l','e','f','t', 0, + 'b','a','c','k','s','l','a','s','h', 0, + 'b','r','a','c','k','e','t','r','i','g','h','t', 0, + 'a','s','c','i','i','c','i','r','c','u','m', 0, + 'u','n','d','e','r','s','c','o','r','e', 0, + 'q','u','o','t','e','l','e','f','t', 0, + 'a', 0, + 'b', 0, + 'c', 0, + 'd', 0, + 'e', 0, + 'f', 0, + 'g', 0, + 'h', 0, + 'i', 0, + 'j', 0, + 'k', 0, + 'l', 0, + 'm', 0, + 'n', 0, + 'o', 0, + 'p', 0, + 'q', 0, + 'r', 0, + 's', 0, + 't', 0, + 'u', 0, + 'v', 0, + 'w', 0, + 'x', 0, + 'y', 0, + 'z', 0, + 'b','r','a','c','e','l','e','f','t', 0, + 'b','a','r', 0, + 'b','r','a','c','e','r','i','g','h','t', 0, + 'a','s','c','i','i','t','i','l','d','e', 0, + 'e','x','c','l','a','m','d','o','w','n', 0, + 'c','e','n','t', 0, + 's','t','e','r','l','i','n','g', 0, + 'f','r','a','c','t','i','o','n', 0, + 'y','e','n', 0, + 'f','l','o','r','i','n', 0, + 's','e','c','t','i','o','n', 0, + 'c','u','r','r','e','n','c','y', 0, + 'q','u','o','t','e','s','i','n','g','l','e', 0, + 'q','u','o','t','e','d','b','l','l','e','f','t', 0, + 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0, + 'f','i', 0, + 'f','l', 0, + 'e','n','d','a','s','h', 0, + 'd','a','g','g','e','r', 0, + 'd','a','g','g','e','r','d','b','l', 0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0, + 'p','a','r','a','g','r','a','p','h', 0, + 'b','u','l','l','e','t', 0, + 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0, + 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0, + 'e','l','l','i','p','s','i','s', 0, + 'p','e','r','t','h','o','u','s','a','n','d', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n', 0, + 'g','r','a','v','e', 0, + 'a','c','u','t','e', 0, + 'c','i','r','c','u','m','f','l','e','x', 0, + 't','i','l','d','e', 0, + 'm','a','c','r','o','n', 0, + 'b','r','e','v','e', 0, + 'd','o','t','a','c','c','e','n','t', 0, + 'd','i','e','r','e','s','i','s', 0, + 'r','i','n','g', 0, + 'c','e','d','i','l','l','a', 0, + 'h','u','n','g','a','r','u','m','l','a','u','t', 0, + 'o','g','o','n','e','k', 0, + 'c','a','r','o','n', 0, + 'e','m','d','a','s','h', 0, + 'A','E', 0, + 'o','r','d','f','e','m','i','n','i','n','e', 0, + 'L','s','l','a','s','h', 0, + 'O','s','l','a','s','h', 0, + 'O','E', 0, + 'o','r','d','m','a','s','c','u','l','i','n','e', 0, + 'a','e', 0, + 'd','o','t','l','e','s','s','i', 0, + 'l','s','l','a','s','h', 0, + 'o','s','l','a','s','h', 0, + 'o','e', 0, + 'g','e','r','m','a','n','d','b','l','s', 0, + 'o','n','e','s','u','p','e','r','i','o','r', 0, + 'l','o','g','i','c','a','l','n','o','t', 0, + 'm','u', 0, + 't','r','a','d','e','m','a','r','k', 0, + 'E','t','h', 0, + 'o','n','e','h','a','l','f', 0, + 'p','l','u','s','m','i','n','u','s', 0, + 'T','h','o','r','n', 0, + 'o','n','e','q','u','a','r','t','e','r', 0, + 'd','i','v','i','d','e', 0, + 'b','r','o','k','e','n','b','a','r', 0, + 'd','e','g','r','e','e', 0, + 't','h','o','r','n', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s', 0, + 't','w','o','s','u','p','e','r','i','o','r', 0, + 'r','e','g','i','s','t','e','r','e','d', 0, + 'm','i','n','u','s', 0, + 'e','t','h', 0, + 'm','u','l','t','i','p','l','y', 0, + 't','h','r','e','e','s','u','p','e','r','i','o','r', 0, + 'c','o','p','y','r','i','g','h','t', 0, + 'A','a','c','u','t','e', 0, + 'A','c','i','r','c','u','m','f','l','e','x', 0, + 'A','d','i','e','r','e','s','i','s', 0, + 'A','g','r','a','v','e', 0, + 'A','r','i','n','g', 0, + 'A','t','i','l','d','e', 0, + 'C','c','e','d','i','l','l','a', 0, + 'E','a','c','u','t','e', 0, + 'E','c','i','r','c','u','m','f','l','e','x', 0, + 'E','d','i','e','r','e','s','i','s', 0, + 'E','g','r','a','v','e', 0, + 'I','a','c','u','t','e', 0, + 'I','c','i','r','c','u','m','f','l','e','x', 0, + 'I','d','i','e','r','e','s','i','s', 0, + 'I','g','r','a','v','e', 0, + 'N','t','i','l','d','e', 0, + 'O','a','c','u','t','e', 0, + 'O','c','i','r','c','u','m','f','l','e','x', 0, + 'O','d','i','e','r','e','s','i','s', 0, + 'O','g','r','a','v','e', 0, + 'O','t','i','l','d','e', 0, + 'S','c','a','r','o','n', 0, + 'U','a','c','u','t','e', 0, + 'U','c','i','r','c','u','m','f','l','e','x', 0, + 'U','d','i','e','r','e','s','i','s', 0, + 'U','g','r','a','v','e', 0, + 'Y','a','c','u','t','e', 0, + 'Y','d','i','e','r','e','s','i','s', 0, + 'Z','c','a','r','o','n', 0, + 'a','a','c','u','t','e', 0, + 'a','c','i','r','c','u','m','f','l','e','x', 0, + 'a','d','i','e','r','e','s','i','s', 0, + 'a','g','r','a','v','e', 0, + 'a','r','i','n','g', 0, + 'a','t','i','l','d','e', 0, + 'c','c','e','d','i','l','l','a', 0, + 'e','a','c','u','t','e', 0, + 'e','c','i','r','c','u','m','f','l','e','x', 0, + 'e','d','i','e','r','e','s','i','s', 0, + 'e','g','r','a','v','e', 0, + 'i','a','c','u','t','e', 0, + 'i','c','i','r','c','u','m','f','l','e','x', 0, + 'i','d','i','e','r','e','s','i','s', 0, + 'i','g','r','a','v','e', 0, + 'n','t','i','l','d','e', 0, + 'o','a','c','u','t','e', 0, + 'o','c','i','r','c','u','m','f','l','e','x', 0, + 'o','d','i','e','r','e','s','i','s', 0, + 'o','g','r','a','v','e', 0, + 'o','t','i','l','d','e', 0, + 's','c','a','r','o','n', 0, + 'u','a','c','u','t','e', 0, + 'u','c','i','r','c','u','m','f','l','e','x', 0, + 'u','d','i','e','r','e','s','i','s', 0, + 'u','g','r','a','v','e', 0, + 'y','a','c','u','t','e', 0, + 'y','d','i','e','r','e','s','i','s', 0, + 'z','c','a','r','o','n', 0, + 'e','x','c','l','a','m','s','m','a','l','l', 0, + 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0, + 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0, + 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0, + 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0, + 'A','c','u','t','e','s','m','a','l','l', 0, + 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0, + 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0, + 'z','e','r','o','o','l','d','s','t','y','l','e', 0, + 'o','n','e','o','l','d','s','t','y','l','e', 0, + 't','w','o','o','l','d','s','t','y','l','e', 0, + 't','h','r','e','e','o','l','d','s','t','y','l','e', 0, + 'f','o','u','r','o','l','d','s','t','y','l','e', 0, + 'f','i','v','e','o','l','d','s','t','y','l','e', 0, + 's','i','x','o','l','d','s','t','y','l','e', 0, + 's','e','v','e','n','o','l','d','s','t','y','l','e', 0, + 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0, + 'n','i','n','e','o','l','d','s','t','y','l','e', 0, + 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0, + 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0, + 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0, + 'a','s','u','p','e','r','i','o','r', 0, + 'b','s','u','p','e','r','i','o','r', 0, + 'c','e','n','t','s','u','p','e','r','i','o','r', 0, + 'd','s','u','p','e','r','i','o','r', 0, + 'e','s','u','p','e','r','i','o','r', 0, + 'i','s','u','p','e','r','i','o','r', 0, + 'l','s','u','p','e','r','i','o','r', 0, + 'm','s','u','p','e','r','i','o','r', 0, + 'n','s','u','p','e','r','i','o','r', 0, + 'o','s','u','p','e','r','i','o','r', 0, + 'r','s','u','p','e','r','i','o','r', 0, + 's','s','u','p','e','r','i','o','r', 0, + 't','s','u','p','e','r','i','o','r', 0, + 'f','f', 0, + 'f','f','i', 0, + 'f','f','l', 0, + 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0, + 'G','r','a','v','e','s','m','a','l','l', 0, + 'A','s','m','a','l','l', 0, + 'B','s','m','a','l','l', 0, + 'C','s','m','a','l','l', 0, + 'D','s','m','a','l','l', 0, + 'E','s','m','a','l','l', 0, + 'F','s','m','a','l','l', 0, + 'G','s','m','a','l','l', 0, + 'H','s','m','a','l','l', 0, + 'I','s','m','a','l','l', 0, + 'J','s','m','a','l','l', 0, + 'K','s','m','a','l','l', 0, + 'L','s','m','a','l','l', 0, + 'M','s','m','a','l','l', 0, + 'N','s','m','a','l','l', 0, + 'O','s','m','a','l','l', 0, + 'P','s','m','a','l','l', 0, + 'Q','s','m','a','l','l', 0, + 'R','s','m','a','l','l', 0, + 'S','s','m','a','l','l', 0, + 'T','s','m','a','l','l', 0, + 'U','s','m','a','l','l', 0, + 'V','s','m','a','l','l', 0, + 'W','s','m','a','l','l', 0, + 'X','s','m','a','l','l', 0, + 'Y','s','m','a','l','l', 0, + 'Z','s','m','a','l','l', 0, + 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0, + 'o','n','e','f','i','t','t','e','d', 0, + 'r','u','p','i','a','h', 0, + 'T','i','l','d','e','s','m','a','l','l', 0, + 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0, + 'c','e','n','t','o','l','d','s','t','y','l','e', 0, + 'L','s','l','a','s','h','s','m','a','l','l', 0, + 'S','c','a','r','o','n','s','m','a','l','l', 0, + 'Z','c','a','r','o','n','s','m','a','l','l', 0, + 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'B','r','e','v','e','s','m','a','l','l', 0, + 'C','a','r','o','n','s','m','a','l','l', 0, + 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0, + 'M','a','c','r','o','n','s','m','a','l','l', 0, + 'f','i','g','u','r','e','d','a','s','h', 0, + 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0, + 'O','g','o','n','e','k','s','m','a','l','l', 0, + 'R','i','n','g','s','m','a','l','l', 0, + 'C','e','d','i','l','l','a','s','m','a','l','l', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0, + 'o','n','e','e','i','g','h','t','h', 0, + 't','h','r','e','e','e','i','g','h','t','h','s', 0, + 'f','i','v','e','e','i','g','h','t','h','s', 0, + 's','e','v','e','n','e','i','g','h','t','h','s', 0, + 'o','n','e','t','h','i','r','d', 0, + 't','w','o','t','h','i','r','d','s', 0, + 'z','e','r','o','s','u','p','e','r','i','o','r', 0, + 'f','o','u','r','s','u','p','e','r','i','o','r', 0, + 'f','i','v','e','s','u','p','e','r','i','o','r', 0, + 's','i','x','s','u','p','e','r','i','o','r', 0, + 's','e','v','e','n','s','u','p','e','r','i','o','r', 0, + 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 'n','i','n','e','s','u','p','e','r','i','o','r', 0, + 'z','e','r','o','i','n','f','e','r','i','o','r', 0, + 'o','n','e','i','n','f','e','r','i','o','r', 0, + 't','w','o','i','n','f','e','r','i','o','r', 0, + 't','h','r','e','e','i','n','f','e','r','i','o','r', 0, + 'f','o','u','r','i','n','f','e','r','i','o','r', 0, + 'f','i','v','e','i','n','f','e','r','i','o','r', 0, + 's','i','x','i','n','f','e','r','i','o','r', 0, + 's','e','v','e','n','i','n','f','e','r','i','o','r', 0, + 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'n','i','n','e','i','n','f','e','r','i','o','r', 0, + 'c','e','n','t','i','n','f','e','r','i','o','r', 0, + 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0, + 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0, + 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0, + 'A','g','r','a','v','e','s','m','a','l','l', 0, + 'A','a','c','u','t','e','s','m','a','l','l', 0, + 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'A','t','i','l','d','e','s','m','a','l','l', 0, + 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'A','r','i','n','g','s','m','a','l','l', 0, + 'A','E','s','m','a','l','l', 0, + 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0, + 'E','g','r','a','v','e','s','m','a','l','l', 0, + 'E','a','c','u','t','e','s','m','a','l','l', 0, + 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'I','g','r','a','v','e','s','m','a','l','l', 0, + 'I','a','c','u','t','e','s','m','a','l','l', 0, + 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'E','t','h','s','m','a','l','l', 0, + 'N','t','i','l','d','e','s','m','a','l','l', 0, + 'O','g','r','a','v','e','s','m','a','l','l', 0, + 'O','a','c','u','t','e','s','m','a','l','l', 0, + 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'O','t','i','l','d','e','s','m','a','l','l', 0, + 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'O','E','s','m','a','l','l', 0, + 'O','s','l','a','s','h','s','m','a','l','l', 0, + 'U','g','r','a','v','e','s','m','a','l','l', 0, + 'U','a','c','u','t','e','s','m','a','l','l', 0, + 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'Y','a','c','u','t','e','s','m','a','l','l', 0, + 'T','h','o','r','n','s','m','a','l','l', 0, + 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + '0','0','1','.','0','0','0', 0, + '0','0','1','.','0','0','1', 0, + '0','0','1','.','0','0','2', 0, + '0','0','1','.','0','0','3', 0, + 'B','l','a','c','k', 0, + 'B','o','l','d', 0, + 'B','o','o','k', 0, + 'L','i','g','h','t', 0, + 'M','e','d','i','u','m', 0, + 'R','e','g','u','l','a','r', 0, + 'R','o','m','a','n', 0, + 'S','e','m','i','b','o','l','d', 0, + }; + + +#define FT_NUM_MAC_NAMES 258 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + + static const short ft_mac_names[FT_NUM_MAC_NAMES] = + { + 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351, + 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, + 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, + 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, + 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610, + 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, + 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, + 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652, + 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776, + 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346, + 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76, + 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120, + 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916, + 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856, + 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500, + 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053, + 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229, + 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200, + 209, 218, 225, 232, 239, 246 + }; + + +#define FT_NUM_SID_NAMES 391 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + + static const short ft_sid_names[FT_NUM_SID_NAMES] = + { + 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365, + 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441, + 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502, + 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, + 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614, + 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, + 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707, + 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832, + 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985, + 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089, + 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197, + 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319, + 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443, + 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562, + 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680, + 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797, + 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973, + 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167, + 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319, + 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454, + 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552, + 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684, + 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860, + 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034, + 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220, + 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409, + 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586, + 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687 + }; + + + /* the following are indices into the SID name table */ + static const unsigned short t1_standard_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, + 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123, + 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136, + 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0, + 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0 + }; + + + /* the following are indices into the SID name table */ + static const unsigned short t1_expert_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99, + 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252, + 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262, + 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272, + 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288, + 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313, + 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319, + 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330, + 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346, + 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362, + 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378 + }; + + + /* + * This table is a compressed version of the Adobe Glyph List (AGL), + * optimized for efficient searching. It has been generated by the + * `glnames.py' python script located in the `src/tools' directory. + * + * The lookup function to get the Unicode value for a given string + * is defined below the table. + */ + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + static const unsigned char ft_adobe_glyph_list[54791L] = + { + 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23, + 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88, + 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107, + 32,222, 33, 55, 34,154, 35,218, 53, 84, 59,196, 68, 6, 75,183, + 83,178, 88,135, 93,242,101,165,109,185,111, 55,117,254,123, 73, + 130,238,138,206,145, 31,153,182,156,189,163,249,178,221,193, 17, + 197, 99,199,240,204, 27,204,155,210,100, 65,143, 0, 65, 0,140, + 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40, + 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198, + 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225, + 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225, + 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247, + 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0, + 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242, + 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119, + 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225, + 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99, + 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205, + 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230, + 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105, + 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236, + 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239, + 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247, + 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1, + 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99, + 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225, + 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1, + 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210, + 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247, + 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160, + 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0, + 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225, + 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249, + 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228, + 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2, + 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225, + 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128, + 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131, + 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250, + 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229, + 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195, + 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229, + 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2, + 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242, + 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227, + 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101, + 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128, + 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97, + 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229, + 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128, + 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237, + 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67, + 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4, + 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237, + 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242, + 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99, + 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228, + 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101, + 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3, + 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1, + 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128, + 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184, + 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238, + 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103, + 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99, + 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229, + 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227, + 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236, + 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233, + 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110, + 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236, + 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4, + 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237, + 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239, + 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225, + 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68, + 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231, + 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241, + 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27, + 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225, + 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242, + 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242, + 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229, + 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16, + 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30, + 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5, + 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240, + 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242, + 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5, + 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202, + 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128, + 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231, + 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233, + 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14, + 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227, + 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34, + 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100, + 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6, + 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6, + 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0, + 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7, + 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9, + 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243, + 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99, + 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128, + 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28, + 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2, + 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135, + 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71, + 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24, + 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101, + 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243, + 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249, + 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7, + 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243, + 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239, + 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1, + 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236, + 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243, + 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237, + 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101, + 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239, + 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233, + 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242, + 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225, + 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239, + 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22, + 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99, + 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4, + 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99, + 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233, + 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227, + 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249, + 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231, + 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233, + 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136, + 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4, + 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242, + 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33, + 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243, + 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4, + 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52, + 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238, + 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129, + 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101, + 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111, + 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239, + 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70, + 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10, + 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225, + 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225, + 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233, + 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9, + 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229, + 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227, + 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243, + 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10, + 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11, + 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10, + 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129, + 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231, + 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101, + 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239, + 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99, + 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120, + 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34, + 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1, + 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10, + 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128, + 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229, + 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243, + 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146, + 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, + 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225, + 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, + 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239, + 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246, + 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11, + 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2, + 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11, + 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12, + 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179, + 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178, + 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203, + 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225, + 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178, + 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4, + 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229, + 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228, + 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236, + 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12, + 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2, + 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236, + 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255, + 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128, + 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225, + 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116, + 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241, + 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12, + 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13, + 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193, + 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213, + 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101, + 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229, + 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239, + 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36, + 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236, + 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3, + 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8, + 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147, + 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99, + 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48, + 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236, + 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229, + 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236, + 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17, + 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128, + 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3, + 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4, + 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10, + 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25, + 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64, + 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240, + 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110, + 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236, + 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97, + 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110, + 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239, + 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108, + 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101, + 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233, + 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99, + 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236, + 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41, + 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128, + 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191, + 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236, + 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110, + 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243, + 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15, + 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16, + 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241, + 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15, + 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249, + 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245, + 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228, + 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99, + 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128, + 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249, + 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225, + 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, + 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110, + 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236, + 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1, + 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82, + 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225, + 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126, + 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233, + 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234, + 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229, + 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227, + 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242, + 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222, + 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128, + 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17, + 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17, + 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227, + 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17, + 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228, + 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236, + 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128, + 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228, + 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128, + 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242, + 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110, + 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236, + 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30, + 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17, + 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236, + 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17, + 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18, + 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2, + 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128, + 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36, + 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128, + 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229, + 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101, + 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229, + 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138, + 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45, + 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128, + 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110, + 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2, + 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226, + 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238, + 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229, + 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239, + 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110, + 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236, + 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30, + 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225, + 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128, + 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236, + 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132, + 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213, + 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236, + 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237, + 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229, + 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4, + 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19, + 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229, + 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19, + 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0, + 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245, + 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216, + 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246, + 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228, + 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3, + 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245, + 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242, + 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236, + 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244, + 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238, + 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0, + 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20, + 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85, + 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246, + 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21, + 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229, + 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239, + 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128, + 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80, + 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225, + 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101, + 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33, + 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233, + 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238, + 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162, + 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4, + 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159, + 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225, + 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111, + 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237, + 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3, + 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22, + 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247, + 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245, + 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236, + 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22, + 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229, + 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136, + 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246, + 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101, + 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101, + 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128, + 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233, + 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99, + 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107, + 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238, + 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128, + 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249, + 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112, + 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101, + 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243, + 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23, + 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97, + 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76, + 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23, + 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1, + 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227, + 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242, + 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227, + 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208, + 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238, + 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28, + 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225, + 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101, + 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237, + 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108, + 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129, + 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0, + 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27, + 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25, + 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24, + 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37, + 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37, + 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37, + 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37, + 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37, + 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37, + 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37, + 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25, + 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176, + 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176, + 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176, + 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176, + 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25, + 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183, + 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185, + 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25, + 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176, + 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176, + 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176, + 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176, + 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176, + 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25, + 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37, + 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37, + 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37, + 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32, + 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231, + 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26, + 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239, + 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128, + 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1, + 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216, + 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99, + 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200, + 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227, + 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227, + 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26, + 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26, + 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246, + 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34, + 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229, + 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128, + 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41, + 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242, + 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233, + 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163, + 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225, + 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233, + 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244, + 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84, + 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177, + 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226, + 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225, + 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233, + 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236, + 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227, + 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225, + 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108, + 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236, + 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249, + 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128, + 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180, + 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2, + 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128, + 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110, + 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236, + 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5, + 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238, + 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225, + 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28, + 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132, + 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232, + 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227, + 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233, + 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2, + 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107, + 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29, + 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31, + 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0, + 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101, + 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128, + 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245, + 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239, + 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236, + 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108, + 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225, + 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29, + 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101, + 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30, + 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128, + 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110, + 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236, + 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243, + 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30, + 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133, + 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244, + 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231, + 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101, + 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242, + 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236, + 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242, + 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128, + 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106, + 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228, + 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225, + 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243, + 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31, + 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232, + 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3, + 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243, + 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239, + 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237, + 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233, + 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242, + 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108, + 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227, + 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229, + 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101, + 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226, + 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32, + 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236, + 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101, + 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18, + 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107, + 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239, + 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108, + 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32, + 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101, + 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36, + 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170, + 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32, + 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128, + 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240, + 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134, + 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233, + 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242, + 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128, + 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105, + 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243, + 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33, + 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34, + 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96, + 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233, + 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128, + 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33, + 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225, + 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229, + 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2, + 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43, + 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107, + 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34, + 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69, + 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237, + 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227, + 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228, + 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34, + 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239, + 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, + 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233, + 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227, + 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174, + 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2, + 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227, + 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110, + 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99, + 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120, + 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227, + 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3, + 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4, + 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227, + 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233, + 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3, + 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229, + 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233, + 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128, + 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242, + 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243, + 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238, + 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225, + 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128, + 247,122,244,242,239,235,101,128, 1,181, 97,149, 0, 97, 36, 8, + 36,144, 37, 35, 37,211, 38, 55, 38, 91, 45, 10, 45, 47, 45, 74, + 46, 43, 46, 81, 47,170, 47,242, 48,197, 48,206, 49, 79, 51, 87, + 52, 77, 52,124, 53, 19, 53, 33, 97, 7, 36, 24, 36, 34, 36, 41, + 36, 48, 36, 73, 36, 89, 36,100,226,229,238,231,225,236,105,128, + 9,134,227,245,244,101,128, 0,225,228,229,246, 97,128, 9, 6, + 231,117, 2, 36, 55, 36, 64,234,225,242,225,244,105,128, 10,134, + 242,237,245,235,232,105,128, 10, 6,237,225,244,242,225,231,245, + 242,237,245,235,232,105,128, 10, 62,242,245,243,241,245,225,242, + 101,128, 51, 3,246,239,247,229,236,243,233,231,110, 3, 36,116, + 36,126, 36,133,226,229,238,231,225,236,105,128, 9,190,228,229, + 246, 97,128, 9, 62,231,245,234,225,242,225,244,105,128, 10,190, + 98, 4, 36,154, 36,195, 36,204, 36,214,226,242,229,246,233,225, + 244,233,239,110, 2, 36,169, 36,184,237,225,242,235,225,242,237, + 229,238,233,225,110,128, 5, 95,243,233,231,238,228,229,246, 97, + 128, 9,112,229,238,231,225,236,105,128, 9,133,239,240,239,237, + 239,230,111,128, 49, 26,242,229,246,101,134, 1, 3, 36,233, 36, + 241, 36,252, 37, 7, 37, 15, 37, 27,225,227,245,244,101,128, 30, + 175,227,249,242,233,236,236,233, 99,128, 4,209,228,239,244,226, + 229,236,239,119,128, 30,183,231,242,225,246,101,128, 30,177,232, + 239,239,235,225,226,239,246,101,128, 30,179,244,233,236,228,101, + 128, 30,181, 99, 4, 37, 45, 37, 52, 37,131, 37,201,225,242,239, + 110,128, 1,206,233,242, 99, 2, 37, 60, 37, 65,236,101,128, 36, + 208,245,237,230,236,229,120,133, 0,226, 37, 84, 37, 92, 37,103, + 37,111, 37,123,225,227,245,244,101,128, 30,165,228,239,244,226, + 229,236,239,119,128, 30,173,231,242,225,246,101,128, 30,167,232, + 239,239,235,225,226,239,246,101,128, 30,169,244,233,236,228,101, + 128, 30,171,245,244,101,133, 0,180, 37,147, 37,158, 37,175, 37, + 182, 37,191,226,229,236,239,247,227,237, 98,128, 3, 23, 99, 2, + 37,164, 37,169,237, 98,128, 3, 1,239,237, 98,128, 3, 1,228, + 229,246, 97,128, 9, 84,236,239,247,237,239,100,128, 2,207,244, + 239,238,229,227,237, 98,128, 3, 65,249,242,233,236,236,233, 99, + 128, 4, 48,100, 5, 37,223, 37,233, 37,247, 37,253, 38, 31,226, + 236,231,242,225,246,101,128, 2, 1,228,225,235,231,245,242,237, + 245,235,232,105,128, 10,113,229,246, 97,128, 9, 5,233,229,242, + 229,243,233,115,130, 0,228, 38, 11, 38, 22,227,249,242,233,236, + 236,233, 99,128, 4,211,237,225,227,242,239,110,128, 1,223,239, + 116, 2, 38, 38, 38, 46,226,229,236,239,119,128, 30,161,237,225, + 227,242,239,110,128, 1,225,101,131, 0,230, 38, 65, 38, 73, 38, + 82,225,227,245,244,101,128, 1,253,235,239,242,229,225,110,128, + 49, 80,237,225,227,242,239,110,128, 1,227,230,233,105, 6, 38, + 107, 38,127, 41, 64, 41, 70, 41, 85, 44,185, 48, 2, 38,113, 38, + 120,176,178,176, 56,128, 32, 21,184,185,180, 49,128, 32,164,177, + 48, 3, 38,136, 40,160, 41, 39, 48, 9, 38,156, 38,176, 38,238, + 39, 44, 39,106, 39,168, 39,230, 40, 36, 40, 98, 49, 3, 38,164, + 38,168, 38,172, 55,128, 4, 16, 56,128, 4, 17, 57,128, 4, 18, + 50, 10, 38,198, 38,202, 38,206, 38,210, 38,214, 38,218, 38,222, + 38,226, 38,230, 38,234, 48,128, 4, 19, 49,128, 4, 20, 50,128, + 4, 21, 51,128, 4, 1, 52,128, 4, 22, 53,128, 4, 23, 54,128, + 4, 24, 55,128, 4, 25, 56,128, 4, 26, 57,128, 4, 27, 51, 10, + 39, 4, 39, 8, 39, 12, 39, 16, 39, 20, 39, 24, 39, 28, 39, 32, + 39, 36, 39, 40, 48,128, 4, 28, 49,128, 4, 29, 50,128, 4, 30, + 51,128, 4, 31, 52,128, 4, 32, 53,128, 4, 33, 54,128, 4, 34, + 55,128, 4, 35, 56,128, 4, 36, 57,128, 4, 37, 52, 10, 39, 66, + 39, 70, 39, 74, 39, 78, 39, 82, 39, 86, 39, 90, 39, 94, 39, 98, + 39,102, 48,128, 4, 38, 49,128, 4, 39, 50,128, 4, 40, 51,128, + 4, 41, 52,128, 4, 42, 53,128, 4, 43, 54,128, 4, 44, 55,128, + 4, 45, 56,128, 4, 46, 57,128, 4, 47, 53, 10, 39,128, 39,132, + 39,136, 39,140, 39,144, 39,148, 39,152, 39,156, 39,160, 39,164, + 48,128, 4,144, 49,128, 4, 2, 50,128, 4, 3, 51,128, 4, 4, + 52,128, 4, 5, 53,128, 4, 6, 54,128, 4, 7, 55,128, 4, 8, + 56,128, 4, 9, 57,128, 4, 10, 54, 10, 39,190, 39,194, 39,198, + 39,202, 39,206, 39,210, 39,214, 39,218, 39,222, 39,226, 48,128, + 4, 11, 49,128, 4, 12, 50,128, 4, 14, 51,128,246,196, 52,128, + 246,197, 53,128, 4, 48, 54,128, 4, 49, 55,128, 4, 50, 56,128, + 4, 51, 57,128, 4, 52, 55, 10, 39,252, 40, 0, 40, 4, 40, 8, + 40, 12, 40, 16, 40, 20, 40, 24, 40, 28, 40, 32, 48,128, 4, 53, + 49,128, 4, 81, 50,128, 4, 54, 51,128, 4, 55, 52,128, 4, 56, + 53,128, 4, 57, 54,128, 4, 58, 55,128, 4, 59, 56,128, 4, 60, + 57,128, 4, 61, 56, 10, 40, 58, 40, 62, 40, 66, 40, 70, 40, 74, + 40, 78, 40, 82, 40, 86, 40, 90, 40, 94, 48,128, 4, 62, 49,128, + 4, 63, 50,128, 4, 64, 51,128, 4, 65, 52,128, 4, 66, 53,128, + 4, 67, 54,128, 4, 68, 55,128, 4, 69, 56,128, 4, 70, 57,128, + 4, 71, 57, 10, 40,120, 40,124, 40,128, 40,132, 40,136, 40,140, + 40,144, 40,148, 40,152, 40,156, 48,128, 4, 72, 49,128, 4, 73, + 50,128, 4, 74, 51,128, 4, 75, 52,128, 4, 76, 53,128, 4, 77, + 54,128, 4, 78, 55,128, 4, 79, 56,128, 4,145, 57,128, 4, 82, + 49, 4, 40,170, 40,232, 40,237, 41, 7, 48, 10, 40,192, 40,196, + 40,200, 40,204, 40,208, 40,212, 40,216, 40,220, 40,224, 40,228, + 48,128, 4, 83, 49,128, 4, 84, 50,128, 4, 85, 51,128, 4, 86, + 52,128, 4, 87, 53,128, 4, 88, 54,128, 4, 89, 55,128, 4, 90, + 56,128, 4, 91, 57,128, 4, 92,177, 48,128, 4, 94, 52, 4, 40, + 247, 40,251, 40,255, 41, 3, 53,128, 4, 15, 54,128, 4, 98, 55, + 128, 4,114, 56,128, 4,116, 57, 5, 41, 19, 41, 23, 41, 27, 41, + 31, 41, 35, 50,128,246,198, 51,128, 4, 95, 52,128, 4, 99, 53, + 128, 4,115, 54,128, 4,117, 56, 2, 41, 45, 41, 59, 51, 2, 41, + 51, 41, 55, 49,128,246,199, 50,128,246,200,180, 54,128, 4,217, + 178,185, 57,128, 32, 14,179, 48, 2, 41, 77, 41, 81, 48,128, 32, + 15, 49,128, 32, 13,181, 55, 7, 41,102, 41,172, 42,237, 43, 58, + 44, 15, 44,108, 44,179, 51, 2, 41,108, 41,122, 56, 2, 41,114, + 41,118, 49,128, 6,106, 56,128, 6, 12, 57, 8, 41,140, 41,144, + 41,148, 41,152, 41,156, 41,160, 41,164, 41,168, 50,128, 6, 96, + 51,128, 6, 97, 52,128, 6, 98, 53,128, 6, 99, 54,128, 6,100, + 55,128, 6,101, 56,128, 6,102, 57,128, 6,103, 52, 7, 41,188, + 41,220, 42, 26, 42, 88, 42,120, 42,176, 42,232, 48, 5, 41,200, + 41,204, 41,208, 41,212, 41,216, 48,128, 6,104, 49,128, 6,105, + 51,128, 6, 27, 55,128, 6, 31, 57,128, 6, 33, 49, 10, 41,242, + 41,246, 41,250, 41,254, 42, 2, 42, 6, 42, 10, 42, 14, 42, 18, + 42, 22, 48,128, 6, 34, 49,128, 6, 35, 50,128, 6, 36, 51,128, + 6, 37, 52,128, 6, 38, 53,128, 6, 39, 54,128, 6, 40, 55,128, + 6, 41, 56,128, 6, 42, 57,128, 6, 43, 50, 10, 42, 48, 42, 52, + 42, 56, 42, 60, 42, 64, 42, 68, 42, 72, 42, 76, 42, 80, 42, 84, + 48,128, 6, 44, 49,128, 6, 45, 50,128, 6, 46, 51,128, 6, 47, + 52,128, 6, 48, 53,128, 6, 49, 54,128, 6, 50, 55,128, 6, 51, + 56,128, 6, 52, 57,128, 6, 53, 51, 5, 42,100, 42,104, 42,108, + 42,112, 42,116, 48,128, 6, 54, 49,128, 6, 55, 50,128, 6, 56, + 51,128, 6, 57, 52,128, 6, 58, 52, 9, 42,140, 42,144, 42,148, + 42,152, 42,156, 42,160, 42,164, 42,168, 42,172, 48,128, 6, 64, + 49,128, 6, 65, 50,128, 6, 66, 51,128, 6, 67, 52,128, 6, 68, + 53,128, 6, 69, 54,128, 6, 70, 56,128, 6, 72, 57,128, 6, 73, + 53, 9, 42,196, 42,200, 42,204, 42,208, 42,212, 42,216, 42,220, + 42,224, 42,228, 48,128, 6, 74, 49,128, 6, 75, 50,128, 6, 76, + 51,128, 6, 77, 52,128, 6, 78, 53,128, 6, 79, 54,128, 6, 80, + 55,128, 6, 81, 56,128, 6, 82,183, 48,128, 6, 71, 53, 3, 42, + 245, 43, 21, 43, 53, 48, 5, 43, 1, 43, 5, 43, 9, 43, 13, 43, + 17, 53,128, 6,164, 54,128, 6,126, 55,128, 6,134, 56,128, 6, + 152, 57,128, 6,175, 49, 5, 43, 33, 43, 37, 43, 41, 43, 45, 43, + 49, 49,128, 6,121, 50,128, 6,136, 51,128, 6,145, 52,128, 6, + 186, 57,128, 6,210,179, 52,128, 6,213, 54, 7, 43, 74, 43, 79, + 43, 84, 43, 89, 43,127, 43,189, 43,251,179, 54,128, 32,170,180, + 53,128, 5,190,181, 56,128, 5,195, 54, 6, 43,103, 43,107, 43, + 111, 43,115, 43,119, 43,123, 52,128, 5,208, 53,128, 5,209, 54, + 128, 5,210, 55,128, 5,211, 56,128, 5,212, 57,128, 5,213, 55, + 10, 43,149, 43,153, 43,157, 43,161, 43,165, 43,169, 43,173, 43, + 177, 43,181, 43,185, 48,128, 5,214, 49,128, 5,215, 50,128, 5, + 216, 51,128, 5,217, 52,128, 5,218, 53,128, 5,219, 54,128, 5, + 220, 55,128, 5,221, 56,128, 5,222, 57,128, 5,223, 56, 10, 43, + 211, 43,215, 43,219, 43,223, 43,227, 43,231, 43,235, 43,239, 43, + 243, 43,247, 48,128, 5,224, 49,128, 5,225, 50,128, 5,226, 51, + 128, 5,227, 52,128, 5,228, 53,128, 5,229, 54,128, 5,230, 55, + 128, 5,231, 56,128, 5,232, 57,128, 5,233, 57, 3, 44, 3, 44, + 7, 44, 11, 48,128, 5,234, 52,128,251, 42, 53,128,251, 43, 55, + 4, 44, 25, 44, 39, 44, 59, 44, 64, 48, 2, 44, 31, 44, 35, 48, + 128,251, 75, 53,128,251, 31, 49, 3, 44, 47, 44, 51, 44, 55, 54, + 128, 5,240, 55,128, 5,241, 56,128, 5,242,178, 51,128,251, 53, + 57, 7, 44, 80, 44, 84, 44, 88, 44, 92, 44, 96, 44,100, 44,104, + 51,128, 5,180, 52,128, 5,181, 53,128, 5,182, 54,128, 5,187, + 55,128, 5,184, 56,128, 5,183, 57,128, 5,176, 56, 3, 44,116, + 44,160, 44,165, 48, 7, 44,132, 44,136, 44,140, 44,144, 44,148, + 44,152, 44,156, 48,128, 5,178, 49,128, 5,177, 50,128, 5,179, + 51,128, 5,194, 52,128, 5,193, 54,128, 5,185, 55,128, 5,188, + 179, 57,128, 5,189, 52, 2, 44,171, 44,175, 49,128, 5,191, 50, + 128, 5,192,185,178, 57,128, 2,188, 54, 3, 44,193, 44,252, 45, + 3, 49, 4, 44,203, 44,219, 44,225, 44,246, 50, 2, 44,209, 44, + 214,180, 56,128, 33, 5,184, 57,128, 33, 19,179,181, 50,128, 33, + 22,181, 55, 3, 44,234, 44,238, 44,242, 51,128, 32, 44, 52,128, + 32, 45, 53,128, 32, 46,182,182, 52,128, 32, 12,179,177,182, 55, + 128, 6,109,180,185,179, 55,128, 2,189,103, 2, 45, 16, 45, 23, + 242,225,246,101,128, 0,224,117, 2, 45, 29, 45, 38,234,225,242, + 225,244,105,128, 10,133,242,237,245,235,232,105,128, 10, 5,104, + 2, 45, 53, 45, 63,233,242,225,231,225,238, 97,128, 48, 66,239, + 239,235,225,226,239,246,101,128, 30,163,105, 7, 45, 90, 45,115, + 45,122, 45,134, 45,159, 45,175, 45,255, 98, 2, 45, 96, 45,105, + 229,238,231,225,236,105,128, 9,144,239,240,239,237,239,230,111, + 128, 49, 30,228,229,246, 97,128, 9, 16,229,227,249,242,233,236, + 236,233, 99,128, 4,213,231,117, 2, 45,141, 45,150,234,225,242, + 225,244,105,128, 10,144,242,237,245,235,232,105,128, 10, 16,237, + 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 72,110, + 5, 45,187, 45,196, 45,210, 45,226, 45,241,225,242,225,226,233, + 99,128, 6, 57,230,233,238,225,236,225,242,225,226,233, 99,128, + 254,202,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,203,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, + 204,246,229,242,244,229,228,226,242,229,246,101,128, 2, 3,246, + 239,247,229,236,243,233,231,110, 3, 46, 15, 46, 25, 46, 32,226, + 229,238,231,225,236,105,128, 9,200,228,229,246, 97,128, 9, 72, + 231,245,234,225,242,225,244,105,128, 10,200,107, 2, 46, 49, 46, + 73,225,244,225,235,225,238, 97,129, 48,162, 46, 61,232,225,236, + 230,247,233,228,244,104,128,255,113,239,242,229,225,110,128, 49, + 79,108, 3, 46, 89, 47,145, 47,154,101, 2, 46, 95, 47,140,102, + 136, 5,208, 46,115, 46,124, 46,139, 46,153, 46,242, 47, 0, 47, + 111, 47,125,225,242,225,226,233, 99,128, 6, 39,228,225,231,229, + 243,232,232,229,226,242,229,119,128,251, 48,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,142,104, 2, 46,159, 46,234,225, + 237,250, 97, 2, 46,168, 46,201,225,226,239,246,101, 2, 46,178, + 46,187,225,242,225,226,233, 99,128, 6, 35,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,132,226,229,236,239,119, 2, 46, + 211, 46,220,225,242,225,226,233, 99,128, 6, 37,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,136,229,226,242,229,119,128, + 5,208,236,225,237,229,228,232,229,226,242,229,119,128,251, 79, + 237, 97, 2, 47, 7, 47, 43,228,228,225,225,226,239,246,101, 2, + 47, 20, 47, 29,225,242,225,226,233, 99,128, 6, 34,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,130,235,243,245,242, 97, + 4, 47, 57, 47, 66, 47, 80, 47, 96,225,242,225,226,233, 99,128, + 6, 73,230,233,238,225,236,225,242,225,226,233, 99,128,254,240, + 233,238,233,244,233,225,236,225,242,225,226,233, 99,128,254,243, + 237,229,228,233,225,236,225,242,225,226,233, 99,128,254,244,240, + 225,244,225,232,232,229,226,242,229,119,128,251, 46,241,225,237, + 225,244,243,232,229,226,242,229,119,128,251, 47,240,104,128, 33, + 53,236,229,241,245,225,108,128, 34, 76,240,232, 97,129, 3,177, + 47,162,244,239,238,239,115,128, 3,172,109, 4, 47,180, 47,188, + 47,199, 47,233,225,227,242,239,110,128, 1, 1,239,238,239,243, + 240,225,227,101,128,255, 65,240,229,242,243,225,238,100,130, 0, + 38, 47,213, 47,225,237,239,238,239,243,240,225,227,101,128,255, + 6,243,237,225,236,108,128,247, 38,243,241,245,225,242,101,128, + 51,194,110, 4, 47,252, 48, 7, 48,129, 48,139,226,239,240,239, + 237,239,230,111,128, 49, 34,103, 4, 48, 17, 48, 28, 48, 42, 48, + 121,226,239,240,239,237,239,230,111,128, 49, 36,235,232,225,238, + 235,232,245,244,232,225,105,128, 14, 90,236,101,131, 34, 32, 48, + 53, 48,106, 48,113,226,242,225,227,235,229,116, 2, 48, 65, 48, + 85,236,229,230,116,129, 48, 8, 48, 74,246,229,242,244,233,227, + 225,108,128,254, 63,242,233,231,232,116,129, 48, 9, 48, 95,246, + 229,242,244,233,227,225,108,128,254, 64,236,229,230,116,128, 35, + 41,242,233,231,232,116,128, 35, 42,243,244,242,239,109,128, 33, + 43,239,244,229,236,229,233, 97,128, 3,135,117, 2, 48,145, 48, + 157,228,225,244,244,225,228,229,246, 97,128, 9, 82,243,246,225, + 242, 97, 3, 48,169, 48,179, 48,186,226,229,238,231,225,236,105, + 128, 9,130,228,229,246, 97,128, 9, 2,231,245,234,225,242,225, + 244,105,128, 10,130,239,231,239,238,229,107,128, 1, 5,112, 3, + 48,214, 48,238, 49, 12, 97, 2, 48,220, 48,232,225,244,239,243, + 241,245,225,242,101,128, 51, 0,242,229,110,128, 36,156,239,243, + 244,242,239,240,232,101, 2, 48,251, 49, 6,225,242,237,229,238, + 233,225,110,128, 5, 90,237,239,100,128, 2,188,112, 2, 49, 18, + 49, 23,236,101,128,248,255,242,111, 2, 49, 30, 49, 38,225,227, + 232,229,115,128, 34, 80,120, 2, 49, 44, 49, 64,229,241,245,225, + 108,129, 34, 72, 49, 54,239,242,233,237,225,231,101,128, 34, 82, + 233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 69,114, + 4, 49, 89, 49,116, 49,120, 49,165,225,229, 97, 2, 49, 97, 49, + 107,229,235,239,242,229,225,110,128, 49,142,235,239,242,229,225, + 110,128, 49,141, 99,128, 35, 18,105, 2, 49,126, 49,140,231,232, + 244,232,225,236,230,242,233,238,103,128, 30,154,238,103,130, 0, + 229, 49,149, 49,157,225,227,245,244,101,128, 1,251,226,229,236, + 239,119,128, 30, 1,242,239,119, 8, 49,185, 49,192, 50, 65, 50, + 131, 50,181, 50,236, 51, 3, 51, 78,226,239,244,104,128, 33,148, + 100, 3, 49,200, 49,239, 50, 30,225,243,104, 4, 49,212, 49,219, + 49,226, 49,234,228,239,247,110,128, 33,227,236,229,230,116,128, + 33,224,242,233,231,232,116,128, 33,226,245,112,128, 33,225,226, + 108, 5, 49,252, 50, 3, 50, 10, 50, 17, 50, 25,226,239,244,104, + 128, 33,212,228,239,247,110,128, 33,211,236,229,230,116,128, 33, + 208,242,233,231,232,116,128, 33,210,245,112,128, 33,209,239,247, + 110,131, 33,147, 50, 42, 50, 49, 50, 57,236,229,230,116,128, 33, + 153,242,233,231,232,116,128, 33,152,247,232,233,244,101,128, 33, + 233,104, 2, 50, 71, 50,122,229,225,100, 4, 50, 83, 50, 93, 50, + 103, 50,114,228,239,247,238,237,239,100,128, 2,197,236,229,230, + 244,237,239,100,128, 2,194,242,233,231,232,244,237,239,100,128, + 2,195,245,240,237,239,100,128, 2,196,239,242,233,250,229,120, + 128,248,231,236,229,230,116,131, 33,144, 50,144, 50,161, 50,173, + 228,226,108,129, 33,208, 50,152,243,244,242,239,235,101,128, 33, + 205,239,246,229,242,242,233,231,232,116,128, 33,198,247,232,233, + 244,101,128, 33,230,242,233,231,232,116,132, 33,146, 50,197, 50, + 209, 50,217, 50,228,228,226,236,243,244,242,239,235,101,128, 33, + 207,232,229,225,246,121,128, 39,158,239,246,229,242,236,229,230, + 116,128, 33,196,247,232,233,244,101,128, 33,232,244,225, 98, 2, + 50,244, 50,251,236,229,230,116,128, 33,228,242,233,231,232,116, + 128, 33,229,245,112,132, 33,145, 51, 16, 51, 44, 51, 62, 51, 70, + 100, 2, 51, 22, 51, 34,110,129, 33,149, 51, 28,226,243,101,128, + 33,168,239,247,238,226,225,243,101,128, 33,168,236,229,230,116, + 129, 33,150, 51, 53,239,230,228,239,247,110,128, 33,197,242,233, + 231,232,116,128, 33,151,247,232,233,244,101,128, 33,231,246,229, + 242,244,229,120,128,248,230,115, 5, 51, 99, 51,175, 51,220, 52, + 47, 52, 57, 99, 2, 51,105, 51,157,233,105, 2, 51,112, 51,135, + 227,233,242,227,245,109,129, 0, 94, 51,123,237,239,238,239,243, + 240,225,227,101,128,255, 62,244,233,236,228,101,129, 0,126, 51, + 145,237,239,238,239,243,240,225,227,101,128,255, 94,242,233,240, + 116,129, 2, 81, 51,166,244,245,242,238,229,100,128, 2, 82,237, + 225,236,108, 2, 51,184, 51,195,232,233,242,225,231,225,238, 97, + 128, 48, 65,235,225,244,225,235,225,238, 97,129, 48,161, 51,208, + 232,225,236,230,247,233,228,244,104,128,255,103,244,229,242,233, + 115, 2, 51,230, 52, 43,107,131, 0, 42, 51,240, 52, 12, 52, 35, + 97, 2, 51,246, 52, 4,236,244,239,238,229,225,242,225,226,233, + 99,128, 6,109,242,225,226,233, 99,128, 6,109,109, 2, 52, 18, + 52, 24,225,244,104,128, 34, 23,239,238,239,243,240,225,227,101, + 128,255, 10,243,237,225,236,108,128,254, 97,109,128, 32, 66,245, + 240,229,242,233,239,114,128,246,233,249,237,240,244,239,244,233, + 227,225,236,236,249,229,241,245,225,108,128, 34, 67,116,132, 0, + 64, 52, 89, 52, 96, 52,108, 52,116,233,236,228,101,128, 0,227, + 237,239,238,239,243,240,225,227,101,128,255, 32,243,237,225,236, + 108,128,254,107,245,242,238,229,100,128, 2, 80,117, 6, 52,138, + 52,163, 52,170, 52,195, 52,215, 52,231, 98, 2, 52,144, 52,153, + 229,238,231,225,236,105,128, 9,148,239,240,239,237,239,230,111, + 128, 49, 32,228,229,246, 97,128, 9, 20,231,117, 2, 52,177, 52, + 186,234,225,242,225,244,105,128, 10,148,242,237,245,235,232,105, + 128, 10, 20,236,229,238,231,244,232,237,225,242,235,226,229,238, + 231,225,236,105,128, 9,215,237,225,244,242,225,231,245,242,237, + 245,235,232,105,128, 10, 76,246,239,247,229,236,243,233,231,110, + 3, 52,247, 53, 1, 53, 8,226,229,238,231,225,236,105,128, 9, + 204,228,229,246, 97,128, 9, 76,231,245,234,225,242,225,244,105, + 128, 10,204,246,225,231,242,225,232,225,228,229,246, 97,128, 9, + 61,121, 2, 53, 39, 53, 51,226,225,242,237,229,238,233,225,110, + 128, 5, 97,233,110,130, 5,226, 53, 60, 53, 75,225,236,244,239, + 238,229,232,229,226,242,229,119,128,251, 32,232,229,226,242,229, + 119,128, 5,226, 98,144, 0, 98, 53,120, 53,255, 54, 10, 54, 19, + 54, 44, 55, 85, 55,147, 55,220, 57,146, 57,158, 57,201, 57,209, + 57,219, 59, 89, 59,113, 59,122, 97, 7, 53,136, 53,146, 53,170, + 53,177, 53,202, 53,226, 53,237,226,229,238,231,225,236,105,128, + 9,172,227,235,243,236,225,243,104,129, 0, 92, 53,158,237,239, + 238,239,243,240,225,227,101,128,255, 60,228,229,246, 97,128, 9, + 44,231,117, 2, 53,184, 53,193,234,225,242,225,244,105,128, 10, + 172,242,237,245,235,232,105,128, 10, 44,104, 2, 53,208, 53,218, + 233,242,225,231,225,238, 97,128, 48,112,244,244,232,225,105,128, + 14, 63,235,225,244,225,235,225,238, 97,128, 48,208,114,129, 0, + 124, 53,243,237,239,238,239,243,240,225,227,101,128,255, 92,226, + 239,240,239,237,239,230,111,128, 49, 5,227,233,242,227,236,101, + 128, 36,209,228,239,116, 2, 54, 27, 54, 36,225,227,227,229,238, + 116,128, 30, 3,226,229,236,239,119,128, 30, 5,101, 6, 54, 58, + 54, 79, 54,102, 54,244, 54,255, 55, 11,225,237,229,228,243,233, + 248,244,229,229,238,244,232,238,239,244,229,115,128, 38,108, 99, + 2, 54, 85, 54, 92,225,245,243,101,128, 34, 53,249,242,233,236, + 236,233, 99,128, 4, 49,104, 5, 54,114, 54,123, 54,137, 54,167, + 54,226,225,242,225,226,233, 99,128, 6, 40,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,144,105, 2, 54,143, 54,158,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,145,242,225, + 231,225,238, 97,128, 48,121,237,101, 2, 54,174, 54,187,228,233, + 225,236,225,242,225,226,233, 99,128,254,146,229,237,105, 2, 54, + 195, 54,210,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 252,159,243,239,236,225,244,229,228,225,242,225,226,233, 99,128, + 252, 8,238,239,239,238,230,233,238,225,236,225,242,225,226,233, + 99,128,252,109,235,225,244,225,235,225,238, 97,128, 48,217,238, + 225,242,237,229,238,233,225,110,128, 5, 98,116,132, 5,209, 55, + 23, 55, 43, 55, 63, 55, 72, 97,129, 3,178, 55, 29,243,249,237, + 226,239,236,231,242,229,229,107,128, 3,208,228,225,231,229,243, + 104,129,251, 49, 55, 54,232,229,226,242,229,119,128,251, 49,232, + 229,226,242,229,119,128, 5,209,242,225,230,229,232,229,226,242, + 229,119,128,251, 76,104, 2, 55, 91, 55,141, 97, 3, 55, 99, 55, + 109, 55,116,226,229,238,231,225,236,105,128, 9,173,228,229,246, + 97,128, 9, 45,231,117, 2, 55,123, 55,132,234,225,242,225,244, + 105,128, 10,173,242,237,245,235,232,105,128, 10, 45,239,239,107, + 128, 2, 83,105, 5, 55,159, 55,170, 55,181, 55,195, 55,209,232, + 233,242,225,231,225,238, 97,128, 48,115,235,225,244,225,235,225, + 238, 97,128, 48,211,236,225,226,233,225,236,227,236,233,227,107, + 128, 2,152,238,228,233,231,245,242,237,245,235,232,105,128, 10, + 2,242,245,243,241,245,225,242,101,128, 51, 49,108, 3, 55,228, + 57,129, 57,140, 97, 2, 55,234, 57,124,227,107, 6, 55,249, 56, + 2, 56, 39, 56,188, 56,243, 57, 39,227,233,242,227,236,101,128, + 37,207,100, 2, 56, 8, 56, 17,233,225,237,239,238,100,128, 37, + 198,239,247,238,240,239,233,238,244,233,238,231,244,242,233,225, + 238,231,236,101,128, 37,188,108, 2, 56, 45, 56,148,101, 2, 56, + 51, 56, 87,230,244,240,239,233,238,244,233,238,103, 2, 56, 66, + 56, 76,240,239,233,238,244,229,114,128, 37,196,244,242,233,225, + 238,231,236,101,128, 37,192,238,244,233,227,245,236,225,242,226, + 242,225,227,235,229,116, 2, 56,107, 56,127,236,229,230,116,129, + 48, 16, 56,116,246,229,242,244,233,227,225,108,128,254, 59,242, + 233,231,232,116,129, 48, 17, 56,137,246,229,242,244,233,227,225, + 108,128,254, 60,239,247,229,114, 2, 56,157, 56,172,236,229,230, + 244,244,242,233,225,238,231,236,101,128, 37,227,242,233,231,232, + 244,244,242,233,225,238,231,236,101,128, 37,226,114, 2, 56,194, + 56,205,229,227,244,225,238,231,236,101,128, 37,172,233,231,232, + 244,240,239,233,238,244,233,238,103, 2, 56,222, 56,232,240,239, + 233,238,244,229,114,128, 37,186,244,242,233,225,238,231,236,101, + 128, 37,182,115, 3, 56,251, 57, 25, 57, 33,109, 2, 57, 1, 57, + 13,225,236,236,243,241,245,225,242,101,128, 37,170,233,236,233, + 238,231,230,225,227,101,128, 38, 59,241,245,225,242,101,128, 37, + 160,244,225,114,128, 38, 5,245,240,112, 2, 57, 47, 57, 85,229, + 114, 2, 57, 54, 57, 69,236,229,230,244,244,242,233,225,238,231, + 236,101,128, 37,228,242,233,231,232,244,244,242,233,225,238,231, + 236,101,128, 37,229,239,233,238,244,233,238,103, 2, 57, 97, 57, + 113,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 180,244,242,233,225,238,231,236,101,128, 37,178,238,107,128, 36, + 35,233,238,229,226,229,236,239,119,128, 30, 7,239,227,107,128, + 37,136,237,239,238,239,243,240,225,227,101,128,255, 66,111, 3, + 57,166, 57,179, 57,190,226,225,233,237,225,233,244,232,225,105, + 128, 14, 26,232,233,242,225,231,225,238, 97,128, 48,124,235,225, + 244,225,235,225,238, 97,128, 48,220,240,225,242,229,110,128, 36, + 157,241,243,241,245,225,242,101,128, 51,195,114, 4, 57,229, 58, + 223, 59, 40, 59, 79,225, 99, 2, 57,236, 58,130,101, 3, 57,244, + 57,249, 58, 61,229,120,128,248,244,236,229,230,116,133, 0,123, + 58, 10, 58, 15, 58, 37, 58, 45, 58, 50,226,116,128,248,243,109, + 2, 58, 21, 58, 26,233,100,128,248,242,239,238,239,243,240,225, + 227,101,128,255, 91,243,237,225,236,108,128,254, 91,244,112,128, + 248,241,246,229,242,244,233,227,225,108,128,254, 55,242,233,231, + 232,116,133, 0,125, 58, 79, 58, 84, 58,106, 58,114, 58,119,226, + 116,128,248,254,109, 2, 58, 90, 58, 95,233,100,128,248,253,239, + 238,239,243,240,225,227,101,128,255, 93,243,237,225,236,108,128, + 254, 92,244,112,128,248,252,246,229,242,244,233,227,225,108,128, + 254, 56,235,229,116, 2, 58,138, 58,180,236,229,230,116,132, 0, + 91, 58,153, 58,158, 58,163, 58,175,226,116,128,248,240,229,120, + 128,248,239,237,239,238,239,243,240,225,227,101,128,255, 59,244, + 112,128,248,238,242,233,231,232,116,132, 0, 93, 58,196, 58,201, + 58,206, 58,218,226,116,128,248,251,229,120,128,248,250,237,239, + 238,239,243,240,225,227,101,128,255, 61,244,112,128,248,249,229, + 246,101,131, 2,216, 58,235, 58,246, 58,252,226,229,236,239,247, + 227,237, 98,128, 3, 46,227,237, 98,128, 3, 6,233,238,246,229, + 242,244,229,100, 3, 59, 11, 59, 22, 59, 28,226,229,236,239,247, + 227,237, 98,128, 3, 47,227,237, 98,128, 3, 17,228,239,245,226, + 236,229,227,237, 98,128, 3, 97,233,228,231,101, 2, 59, 49, 59, + 60,226,229,236,239,247,227,237, 98,128, 3, 42,233,238,246,229, + 242,244,229,228,226,229,236,239,247,227,237, 98,128, 3, 58,239, + 235,229,238,226,225,114,128, 0,166,115, 2, 59, 95, 59,103,244, + 242,239,235,101,128, 1,128,245,240,229,242,233,239,114,128,246, + 234,244,239,240,226,225,114,128, 1,131,117, 3, 59,130, 59,141, + 59,152,232,233,242,225,231,225,238, 97,128, 48,118,235,225,244, + 225,235,225,238, 97,128, 48,214,236,108, 2, 59,159, 59,189,229, + 116,130, 32, 34, 59,168, 59,178,233,238,246,229,242,243,101,128, + 37,216,239,240,229,242,225,244,239,114,128, 34, 25,243,229,249, + 101,128, 37,206, 99,143, 0, 99, 59,230, 60,179, 60,190, 60,254, + 61, 29, 61,122, 63, 33, 64, 17, 64,117, 64,166, 67,158, 67,166, + 67,176, 67,188, 67,221, 97, 9, 59,250, 60, 5, 60, 15, 60, 22, + 60, 29, 60, 54, 60, 64, 60,116, 60,125,225,242,237,229,238,233, + 225,110,128, 5,110,226,229,238,231,225,236,105,128, 9,154,227, + 245,244,101,128, 1, 7,228,229,246, 97,128, 9, 26,231,117, 2, + 60, 36, 60, 45,234,225,242,225,244,105,128, 10,154,242,237,245, + 235,232,105,128, 10, 26,236,243,241,245,225,242,101,128, 51,136, + 238,228,242,225,226,233,238,228,117, 4, 60, 82, 60, 92, 60, 98, + 60,105,226,229,238,231,225,236,105,128, 9,129,227,237, 98,128, + 3, 16,228,229,246, 97,128, 9, 1,231,245,234,225,242,225,244, + 105,128, 10,129,240,243,236,239,227,107,128, 33,234,114, 3, 60, + 133, 60,139, 60,165,229,239,102,128, 33, 5,239,110,130, 2,199, + 60,148, 60,159,226,229,236,239,247,227,237, 98,128, 3, 44,227, + 237, 98,128, 3, 12,242,233,225,231,229,242,229,244,245,242,110, + 128, 33,181,226,239,240,239,237,239,230,111,128, 49, 24, 99, 4, + 60,200, 60,207, 60,226, 60,248,225,242,239,110,128, 1, 13,229, + 228,233,236,236, 97,129, 0,231, 60,218,225,227,245,244,101,128, + 30, 9,233,242, 99, 2, 60,234, 60,239,236,101,128, 36,210,245, + 237,230,236,229,120,128, 1, 9,245,242,108,128, 2, 85,100, 2, + 61, 4, 61, 20,239,116,129, 1, 11, 61, 11,225,227,227,229,238, + 116,128, 1, 11,243,241,245,225,242,101,128, 51,197,101, 2, 61, + 35, 61, 51,228,233,236,236, 97,129, 0,184, 61, 45,227,237, 98, + 128, 3, 39,238,116,132, 0,162, 61, 64, 61, 88, 61,100, 61,111, + 105, 2, 61, 70, 61, 78,231,242,225,228,101,128, 33, 3,238,230, + 229,242,233,239,114,128,246,223,237,239,238,239,243,240,225,227, + 101,128,255,224,239,236,228,243,244,249,236,101,128,247,162,243, + 245,240,229,242,233,239,114,128,246,224,104, 5, 61,134, 61,197, + 61,208, 62,136, 62,228, 97, 4, 61,144, 61,155, 61,165, 61,172, + 225,242,237,229,238,233,225,110,128, 5,121,226,229,238,231,225, + 236,105,128, 9,155,228,229,246, 97,128, 9, 27,231,117, 2, 61, + 179, 61,188,234,225,242,225,244,105,128, 10,155,242,237,245,235, + 232,105,128, 10, 27,226,239,240,239,237,239,230,111,128, 49, 20, + 101, 6, 61,222, 61,242, 62, 10, 62, 78, 62, 90, 62,111,225,226, + 235,232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, + 4,189, 99, 2, 61,248, 62, 0,235,237,225,242,107,128, 39, 19, + 249,242,233,236,236,233, 99,128, 4, 71,100, 2, 62, 16, 62, 60, + 229,243,227,229,238,228,229,114, 2, 62, 29, 62, 49,225,226,235, + 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4, + 191,227,249,242,233,236,236,233, 99,128, 4,183,233,229,242,229, + 243,233,243,227,249,242,233,236,236,233, 99,128, 4,245,232,225, + 242,237,229,238,233,225,110,128, 5,115,235,232,225,235,225,243, + 243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,204,246, + 229,242,244,233,227,225,236,243,244,242,239,235,229,227,249,242, + 233,236,236,233, 99,128, 4,185,105,129, 3,199, 62,142,229,245, + 227,104, 4, 62,155, 62,190, 62,205, 62,214, 97, 2, 62,161, 62, + 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,119, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 23,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50,105,235,239,242, + 229,225,110,128, 49, 74,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 9,111, 2, 62,234, 63, 28,227,104, 3, 62,243, 63, + 9, 63, 19,225,110, 2, 62,250, 63, 2,231,244,232,225,105,128, + 14, 10,244,232,225,105,128, 14, 8,233,238,231,244,232,225,105, + 128, 14, 9,239,229,244,232,225,105,128, 14, 12,239,107,128, 1, + 136,105, 2, 63, 39, 63,141,229,245, 99, 5, 63, 53, 63, 88, 63, + 103, 63,112, 63,126, 97, 2, 63, 59, 63, 74,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,118,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 22,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50,104,235,239,242,229,225,110,128, 49, 72, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 8,245,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 28,242, 99, 2, + 63,148, 63,243,236,101,132, 37,203, 63,161, 63,172, 63,177, 63, + 201,237,245,236,244,233,240,236,121,128, 34,151,239,116,128, 34, + 153,112, 2, 63,183, 63,189,236,245,115,128, 34,149,239,243,244, + 225,236,237,225,242,107,128, 48, 54,247,233,244,104, 2, 63,210, + 63,226,236,229,230,244,232,225,236,230,226,236,225,227,107,128, + 37,208,242,233,231,232,244,232,225,236,230,226,236,225,227,107, + 128, 37,209,245,237,230,236,229,120,130, 2,198, 64, 0, 64, 11, + 226,229,236,239,247,227,237, 98,128, 3, 45,227,237, 98,128, 3, + 2,108, 3, 64, 25, 64, 31, 64, 85,229,225,114,128, 35, 39,233, + 227,107, 4, 64, 43, 64, 54, 64, 63, 64, 73,225,236,246,229,239, + 236,225,114,128, 1,194,228,229,238,244,225,108,128, 1,192,236, + 225,244,229,242,225,108,128, 1,193,242,229,244,242,239,230,236, + 229,120,128, 1,195,245, 98,129, 38, 99, 64, 92,243,245,233,116, + 2, 64,101, 64,109,226,236,225,227,107,128, 38, 99,247,232,233, + 244,101,128, 38,103,109, 3, 64,125, 64,139, 64,150,227,245,226, + 229,228,243,241,245,225,242,101,128, 51,164,239,238,239,243,240, + 225,227,101,128,255, 67,243,241,245,225,242,229,228,243,241,245, + 225,242,101,128, 51,160,111, 8, 64,184, 64,195, 65, 26, 65,224, + 66,253, 67, 28, 67,135, 67,144,225,242,237,229,238,233,225,110, + 128, 5,129,236,239,110,131, 0, 58, 64,207, 64,232, 64,251,237, + 239,110, 2, 64,215, 64,223,229,244,225,242,121,128, 32,161,239, + 243,240,225,227,101,128,255, 26,115, 2, 64,238, 64,244,233,231, + 110,128, 32,161,237,225,236,108,128,254, 85,244,242,233,225,238, + 231,245,236,225,114, 2, 65, 10, 65, 20,232,225,236,230,237,239, + 100,128, 2,209,237,239,100,128, 2,208,109, 2, 65, 32, 65,217, + 237, 97,134, 0, 44, 65, 49, 65,113, 65,124, 65,136, 65,166, 65, + 189, 97, 3, 65, 57, 65, 83, 65, 91,226,239,246,101, 2, 65, 66, + 65, 72,227,237, 98,128, 3, 19,242,233,231,232,244,227,237, 98, + 128, 3, 21,227,227,229,238,116,128,246,195,114, 2, 65, 97, 65, + 104,225,226,233, 99,128, 6, 12,237,229,238,233,225,110,128, 5, + 93,233,238,230,229,242,233,239,114,128,246,225,237,239,238,239, + 243,240,225,227,101,128,255, 12,242,229,246,229,242,243,229,100, + 2, 65,149, 65,160,225,226,239,246,229,227,237, 98,128, 3, 20, + 237,239,100,128, 2,189,115, 2, 65,172, 65,179,237,225,236,108, + 128,254, 80,245,240,229,242,233,239,114,128,246,226,244,245,242, + 238,229,100, 2, 65,200, 65,211,225,226,239,246,229,227,237, 98, + 128, 3, 18,237,239,100,128, 2,187,240,225,243,115,128, 38, 60, + 110, 2, 65,230, 65,239,231,242,245,229,238,116,128, 34, 69,116, + 2, 65,245, 66, 3,239,245,242,233,238,244,229,231,242,225,108, + 128, 34, 46,242,239,108,142, 35, 3, 66, 37, 66, 43, 66, 58, 66, + 73, 66,117, 66,162, 66,176, 66,181, 66,186, 66,191, 66,197, 66, + 202, 66,243, 66,248,193,195, 75,128, 0, 6, 66, 2, 66, 49, 66, + 54,197, 76,128, 0, 7, 83,128, 0, 8, 67, 2, 66, 64, 66, 69, + 193, 78,128, 0, 24, 82,128, 0, 13, 68, 3, 66, 81, 66,107, 66, + 112, 67, 4, 66, 91, 66, 95, 66, 99, 66,103, 49,128, 0, 17, 50, + 128, 0, 18, 51,128, 0, 19, 52,128, 0, 20,197, 76,128, 0,127, + 204, 69,128, 0, 16, 69, 5, 66,129, 66,133, 66,138, 66,143, 66, + 148, 77,128, 0, 25,206, 81,128, 0, 5,207, 84,128, 0, 4,211, + 67,128, 0, 27, 84, 2, 66,154, 66,158, 66,128, 0, 23, 88,128, + 0, 3, 70, 2, 66,168, 66,172, 70,128, 0, 12, 83,128, 0, 28, + 199, 83,128, 0, 29,200, 84,128, 0, 9,204, 70,128, 0, 10,206, + 193, 75,128, 0, 21,210, 83,128, 0, 30, 83, 5, 66,214, 66,218, + 66,228, 66,233, 66,238, 73,128, 0, 15, 79,129, 0, 14, 66,224, + 84,128, 0, 2,212, 88,128, 0, 1,213, 66,128, 0, 26,217, 78, + 128, 0, 22,213, 83,128, 0, 31,214, 84,128, 0, 11,240,249,242, + 233,231,232,116,129, 0,169, 67, 9,115, 2, 67, 15, 67, 21,225, + 238,115,128,248,233,229,242,233,102,128,246,217,114, 2, 67, 34, + 67,118,238,229,242,226,242,225,227,235,229,116, 2, 67, 49, 67, + 83,236,229,230,116,130, 48, 12, 67, 60, 67, 72,232,225,236,230, + 247,233,228,244,104,128,255, 98,246,229,242,244,233,227,225,108, + 128,254, 65,242,233,231,232,116,130, 48, 13, 67, 95, 67,107,232, + 225,236,230,247,233,228,244,104,128,255, 99,246,229,242,244,233, + 227,225,108,128,254, 66,240,239,242,225,244,233,239,238,243,241, + 245,225,242,101,128, 51,127,243,241,245,225,242,101,128, 51,199, + 246,229,242,235,231,243,241,245,225,242,101,128, 51,198,240,225, + 242,229,110,128, 36,158,242,245,250,229,233,242,111,128, 32,162, + 243,244,242,229,244,227,232,229,100,128, 2,151,245,114, 2, 67, + 195, 67,213,236,121, 2, 67,202, 67,208,225,238,100,128, 34,207, + 239,114,128, 34,206,242,229,238,227,121,128, 0,164,249,114, 4, + 67,232, 67,240, 67,247, 67,255,194,242,229,246,101,128,246,209, + 198,236,229,120,128,246,210,226,242,229,246,101,128,246,212,230, + 236,229,120,128,246,213,100,146, 0,100, 68, 46, 69,184, 70,208, + 71, 12, 71,188, 72,142, 72,204, 73,133, 73,146, 73,155, 73,181, + 73,206, 73,215, 75, 26, 75, 34, 75, 45, 75, 65, 75, 93, 97, 11, + 68, 70, 68, 81, 68, 91, 68,163, 68,226, 68,237, 68,248, 69, 61, + 69,123, 69,129, 69,159,225,242,237,229,238,233,225,110,128, 5, + 100,226,229,238,231,225,236,105,128, 9,166,100, 5, 68,103, 68, + 112, 68,118, 68,132, 68,148,225,242,225,226,233, 99,128, 6, 54, + 229,246, 97,128, 9, 38,230,233,238,225,236,225,242,225,226,233, + 99,128,254,190,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,191,237,229,228,233,225,236,225,242,225,226,233, 99, + 128,254,192,103, 3, 68,171, 68,188, 68,202,229,243,104,129, 5, + 188, 68,179,232,229,226,242,229,119,128, 5,188,231,229,114,129, + 32, 32, 68,196,228,226,108,128, 32, 33,117, 2, 68,208, 68,217, + 234,225,242,225,244,105,128, 10,166,242,237,245,235,232,105,128, + 10, 38,232,233,242,225,231,225,238, 97,128, 48, 96,235,225,244, + 225,235,225,238, 97,128, 48,192,108, 3, 69, 0, 69, 9, 69, 47, + 225,242,225,226,233, 99,128, 6, 47,229,116,130, 5,211, 69, 18, + 69, 38,228,225,231,229,243,104,129,251, 51, 69, 29,232,229,226, + 242,229,119,128,251, 51,232,229,226,242,229,119,128, 5,211,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,170,237,237, 97, + 3, 69, 71, 69, 80, 69, 92,225,242,225,226,233, 99,128, 6, 79, + 236,239,247,225,242,225,226,233, 99,128, 6, 79,244,225,238, 97, + 2, 69,101, 69,115,236,244,239,238,229,225,242,225,226,233, 99, + 128, 6, 76,242,225,226,233, 99,128, 6, 76,238,228, 97,128, 9, + 100,242,231, 97, 2, 69,137, 69,146,232,229,226,242,229,119,128, + 5,167,236,229,230,244,232,229,226,242,229,119,128, 5,167,243, + 233,225,240,238,229,245,237,225,244,225,227,249,242,233,236,236, + 233,227,227,237, 98,128, 4,133, 98, 3, 69,192, 70,189, 70,199, + 108, 9, 69,212, 69,220, 70, 77, 70, 85, 70,101, 70,112, 70,130, + 70,144, 70,155,199,242,225,246,101,128,246,211, 97, 2, 69,226, + 70, 27,238,231,236,229,226,242,225,227,235,229,116, 2, 69,242, + 70, 6,236,229,230,116,129, 48, 10, 69,251,246,229,242,244,233, + 227,225,108,128,254, 61,242,233,231,232,116,129, 48, 11, 70, 16, + 246,229,242,244,233,227,225,108,128,254, 62,114, 2, 70, 33, 70, + 54,227,232,233,238,246,229,242,244,229,228,226,229,236,239,247, + 227,237, 98,128, 3, 43,242,239,119, 2, 70, 62, 70, 69,236,229, + 230,116,128, 33,212,242,233,231,232,116,128, 33,210,228,225,238, + 228, 97,128, 9,101,231,242,225,246,101,129,246,214, 70, 95,227, + 237, 98,128, 3, 15,233,238,244,229,231,242,225,108,128, 34, 44, + 236,239,247,236,233,238,101,129, 32, 23, 70,124,227,237, 98,128, + 3, 51,239,246,229,242,236,233,238,229,227,237, 98,128, 3, 63, + 240,242,233,237,229,237,239,100,128, 2,186,246,229,242,244,233, + 227,225,108, 2, 70,168, 70,174,226,225,114,128, 32, 22,236,233, + 238,229,225,226,239,246,229,227,237, 98,128, 3, 14,239,240,239, + 237,239,230,111,128, 49, 9,243,241,245,225,242,101,128, 51,200, + 99, 4, 70,218, 70,225, 70,234, 71, 5,225,242,239,110,128, 1, + 15,229,228,233,236,236, 97,128, 30, 17,233,242, 99, 2, 70,242, + 70,247,236,101,128, 36,211,245,237,230,236,229,248,226,229,236, + 239,119,128, 30, 19,242,239,225,116,128, 1, 17,100, 4, 71, 22, + 71,103, 71,113, 71,164, 97, 4, 71, 32, 71, 42, 71, 49, 71, 74, + 226,229,238,231,225,236,105,128, 9,161,228,229,246, 97,128, 9, + 33,231,117, 2, 71, 56, 71, 65,234,225,242,225,244,105,128, 10, + 161,242,237,245,235,232,105,128, 10, 33,108, 2, 71, 80, 71, 89, + 225,242,225,226,233, 99,128, 6,136,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,137,228,232,225,228,229,246, 97,128, 9, + 92,232, 97, 3, 71,122, 71,132, 71,139,226,229,238,231,225,236, + 105,128, 9,162,228,229,246, 97,128, 9, 34,231,117, 2, 71,146, + 71,155,234,225,242,225,244,105,128, 10,162,242,237,245,235,232, + 105,128, 10, 34,239,116, 2, 71,171, 71,180,225,227,227,229,238, + 116,128, 30, 11,226,229,236,239,119,128, 30, 13,101, 8, 71,206, + 72, 3, 72, 10, 72, 35, 72, 45, 72, 56, 72,101, 72,137, 99, 2, + 71,212, 71,249,233,237,225,236,243,229,240,225,242,225,244,239, + 114, 2, 71,230, 71,239,225,242,225,226,233, 99,128, 6,107,240, + 229,242,243,233,225,110,128, 6,107,249,242,233,236,236,233, 99, + 128, 4, 52,231,242,229,101,128, 0,176,232,105, 2, 72, 17, 72, + 26,232,229,226,242,229,119,128, 5,173,242,225,231,225,238, 97, + 128, 48,103,233,227,239,240,244,233, 99,128, 3,239,235,225,244, + 225,235,225,238, 97,128, 48,199,108, 2, 72, 62, 72, 85,229,244, + 101, 2, 72, 70, 72, 77,236,229,230,116,128, 35, 43,242,233,231, + 232,116,128, 35, 38,244, 97,129, 3,180, 72, 92,244,245,242,238, + 229,100,128, 1,141,238,239,237,233,238,225,244,239,242,237,233, + 238,245,243,239,238,229,238,245,237,229,242,225,244,239,242,226, + 229,238,231,225,236,105,128, 9,248,250,104,128, 2,164,104, 2, + 72,148, 72,198, 97, 3, 72,156, 72,166, 72,173,226,229,238,231, + 225,236,105,128, 9,167,228,229,246, 97,128, 9, 39,231,117, 2, + 72,180, 72,189,234,225,242,225,244,105,128, 10,167,242,237,245, + 235,232,105,128, 10, 39,239,239,107,128, 2, 87,105, 6, 72,218, + 73, 11, 73, 71, 73, 82, 73, 93, 73,103, 97, 2, 72,224, 72,246, + 236,249,244,233,235,225,244,239,238,239,115,129, 3,133, 72,240, + 227,237, 98,128, 3, 68,237,239,238,100,129, 38,102, 72,255,243, + 245,233,244,247,232,233,244,101,128, 38, 98,229,242,229,243,233, + 115,133, 0,168, 73, 30, 73, 38, 73, 49, 73, 55, 73, 63,225,227, + 245,244,101,128,246,215,226,229,236,239,247,227,237, 98,128, 3, + 36,227,237, 98,128, 3, 8,231,242,225,246,101,128,246,216,244, + 239,238,239,115,128, 3,133,232,233,242,225,231,225,238, 97,128, + 48, 98,235,225,244,225,235,225,238, 97,128, 48,194,244,244,239, + 237,225,242,107,128, 48, 3,246,105, 2, 73,110, 73,121,228,101, + 129, 0,247, 73,117,115,128, 34, 35,243,233,239,238,243,236,225, + 243,104,128, 34, 21,234,229,227,249,242,233,236,236,233, 99,128, + 4, 82,235,243,232,225,228,101,128, 37,147,108, 2, 73,161, 73, + 172,233,238,229,226,229,236,239,119,128, 30, 15,243,241,245,225, + 242,101,128, 51,151,109, 2, 73,187, 73,195,225,227,242,239,110, + 128, 1, 17,239,238,239,243,240,225,227,101,128,255, 68,238,226, + 236,239,227,107,128, 37,132,111, 10, 73,237, 73,249, 74, 3, 74, + 14, 74, 25, 74, 97, 74,102, 74,113, 74,228, 74,254,227,232,225, + 228,225,244,232,225,105,128, 14, 14,228,229,235,244,232,225,105, + 128, 14, 20,232,233,242,225,231,225,238, 97,128, 48,105,235,225, + 244,225,235,225,238, 97,128, 48,201,236,236,225,114,132, 0, 36, + 74, 40, 74, 51, 74, 63, 74, 74,233,238,230,229,242,233,239,114, + 128,246,227,237,239,238,239,243,240,225,227,101,128,255, 4,239, + 236,228,243,244,249,236,101,128,247, 36,115, 2, 74, 80, 74, 87, + 237,225,236,108,128,254,105,245,240,229,242,233,239,114,128,246, + 228,238,103,128, 32,171,242,245,243,241,245,225,242,101,128, 51, + 38,116, 6, 74,127, 74,144, 74,166, 74,177, 74,209, 74,216,225, + 227,227,229,238,116,129, 2,217, 74,138,227,237, 98,128, 3, 7, + 226,229,236,239,247, 99, 2, 74,155, 74,160,237, 98,128, 3, 35, + 239,237, 98,128, 3, 35,235,225,244,225,235,225,238, 97,128, 48, + 251,236,229,243,115, 2, 74,186, 74,190,105,128, 1, 49,106,129, + 246,190, 74,196,243,244,242,239,235,229,232,239,239,107,128, 2, + 132,237,225,244,104,128, 34,197,244,229,228,227,233,242,227,236, + 101,128, 37,204,245,226,236,229,249,239,228,240,225,244,225,104, + 129,251, 31, 74,245,232,229,226,242,229,119,128,251, 31,247,238, + 244,225,227,107, 2, 75, 9, 75, 20,226,229,236,239,247,227,237, + 98,128, 3, 30,237,239,100,128, 2,213,240,225,242,229,110,128, + 36,159,243,245,240,229,242,233,239,114,128,246,235,116, 2, 75, + 51, 75, 57,225,233,108,128, 2, 86,239,240,226,225,114,128, 1, + 140,117, 2, 75, 71, 75, 82,232,233,242,225,231,225,238, 97,128, + 48,101,235,225,244,225,235,225,238, 97,128, 48,197,122,132, 1, + 243, 75,105, 75,114, 75,133, 75,170,225,236,244,239,238,101,128, + 2,163, 99, 2, 75,120, 75,127,225,242,239,110,128, 1,198,245, + 242,108,128, 2,165,101, 2, 75,139, 75,159,225,226,235,232,225, + 243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,225,227, + 249,242,233,236,236,233, 99,128, 4, 85,232,229,227,249,242,233, + 236,236,233, 99,128, 4, 95,101,151, 0,101, 75,233, 75,252, 76, + 30, 77, 4, 77, 66, 77, 99, 77,111, 77,134, 77,187, 79, 43, 79, + 101, 79,203, 80, 63, 80,198, 81, 17, 81, 48, 81,110, 81,163, 82, + 98, 82,231, 82,251, 83, 39, 83,130, 97, 2, 75,239, 75,246,227, + 245,244,101,128, 0,233,242,244,104,128, 38, 65, 98, 3, 76, 4, + 76, 13, 76, 23,229,238,231,225,236,105,128, 9,143,239,240,239, + 237,239,230,111,128, 49, 28,242,229,246,101,128, 1, 21, 99, 5, + 76, 42, 76,115, 76,129, 76,161, 76,250, 97, 2, 76, 48, 76,109, + 238,228,242, 97, 3, 76, 59, 76, 66, 76, 77,228,229,246, 97,128, + 9, 13,231,245,234,225,242,225,244,105,128, 10,141,246,239,247, + 229,236,243,233,231,110, 2, 76, 91, 76, 98,228,229,246, 97,128, + 9, 69,231,245,234,225,242,225,244,105,128, 10,197,242,239,110, + 128, 1, 27,229,228,233,236,236,225,226,242,229,246,101,128, 30, + 29,104, 2, 76,135, 76,146,225,242,237,229,238,233,225,110,128, + 5,101,249,233,247,238,225,242,237,229,238,233,225,110,128, 5, + 135,233,242, 99, 2, 76,169, 76,174,236,101,128, 36,212,245,237, + 230,236,229,120,134, 0,234, 76,195, 76,203, 76,211, 76,222, 76, + 230, 76,242,225,227,245,244,101,128, 30,191,226,229,236,239,119, + 128, 30, 25,228,239,244,226,229,236,239,119,128, 30,199,231,242, + 225,246,101,128, 30,193,232,239,239,235,225,226,239,246,101,128, + 30,195,244,233,236,228,101,128, 30,197,249,242,233,236,236,233, + 99,128, 4, 84,100, 4, 77, 14, 77, 24, 77, 30, 77, 40,226,236, + 231,242,225,246,101,128, 2, 5,229,246, 97,128, 9, 15,233,229, + 242,229,243,233,115,128, 0,235,239,116,130, 1, 23, 77, 49, 77, + 58,225,227,227,229,238,116,128, 1, 23,226,229,236,239,119,128, + 30,185,101, 2, 77, 72, 77, 83,231,245,242,237,245,235,232,105, + 128, 10, 15,237,225,244,242,225,231,245,242,237,245,235,232,105, + 128, 10, 71,230,227,249,242,233,236,236,233, 99,128, 4, 68,103, + 2, 77,117, 77,124,242,225,246,101,128, 0,232,245,234,225,242, + 225,244,105,128, 10,143,104, 4, 77,144, 77,155, 77,166, 77,176, + 225,242,237,229,238,233,225,110,128, 5,103,226,239,240,239,237, + 239,230,111,128, 49, 29,233,242,225,231,225,238, 97,128, 48, 72, + 239,239,235,225,226,239,246,101,128, 30,187,105, 4, 77,197, 77, + 208, 79, 10, 79, 25,226,239,240,239,237,239,230,111,128, 49, 31, + 231,232,116,142, 0, 56, 77,242, 77,251, 78, 5, 78, 35, 78, 42, + 78, 80, 78,105, 78,150, 78,184, 78,196, 78,207, 78,240, 78,248, + 79, 3,225,242,225,226,233, 99,128, 6,104,226,229,238,231,225, + 236,105,128, 9,238,227,233,242,227,236,101,129, 36,103, 78, 16, + 233,238,246,229,242,243,229,243,225,238,243,243,229,242,233,102, + 128, 39,145,228,229,246, 97,128, 9,110,229,229,110, 2, 78, 50, + 78, 59,227,233,242,227,236,101,128, 36,113,112, 2, 78, 65, 78, + 72,225,242,229,110,128, 36,133,229,242,233,239,100,128, 36,153, + 231,117, 2, 78, 87, 78, 96,234,225,242,225,244,105,128, 10,238, + 242,237,245,235,232,105,128, 10,110,104, 2, 78,111, 78,137, 97, + 2, 78,117, 78,128,227,235,225,242,225,226,233, 99,128, 6,104, + 238,231,250,232,239,117,128, 48, 40,238,239,244,229,226,229,225, + 237,229,100,128, 38,107,105, 2, 78,156, 78,174,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 39,238,230, + 229,242,233,239,114,128, 32,136,237,239,238,239,243,240,225,227, + 101,128,255, 24,239,236,228,243,244,249,236,101,128,247, 56,112, + 2, 78,213, 78,220,225,242,229,110,128, 36,123,229,114, 2, 78, + 227, 78,233,233,239,100,128, 36,143,243,233,225,110,128, 6,248, + 242,239,237,225,110,128, 33,119,243,245,240,229,242,233,239,114, + 128, 32,120,244,232,225,105,128, 14, 88,238,246,229,242,244,229, + 228,226,242,229,246,101,128, 2, 7,239,244,233,230,233,229,228, + 227,249,242,233,236,236,233, 99,128, 4,101,107, 2, 79, 49, 79, + 73,225,244,225,235,225,238, 97,129, 48,168, 79, 61,232,225,236, + 230,247,233,228,244,104,128,255,116,111, 2, 79, 79, 79, 94,238, + 235,225,242,231,245,242,237,245,235,232,105,128, 10,116,242,229, + 225,110,128, 49, 84,108, 3, 79,109, 79,120, 79,181,227,249,242, + 233,236,236,233, 99,128, 4, 59,101, 2, 79,126, 79,133,237,229, + 238,116,128, 34, 8,246,229,110, 3, 79,143, 79,152, 79,173,227, + 233,242,227,236,101,128, 36,106,112, 2, 79,158, 79,165,225,242, + 229,110,128, 36,126,229,242,233,239,100,128, 36,146,242,239,237, + 225,110,128, 33,122,236,233,240,243,233,115,129, 32, 38, 79,192, + 246,229,242,244,233,227,225,108,128, 34,238,109, 5, 79,215, 79, + 243, 79,254, 80, 18, 80, 29,225,227,242,239,110,130, 1, 19, 79, + 227, 79,235,225,227,245,244,101,128, 30, 23,231,242,225,246,101, + 128, 30, 21,227,249,242,233,236,236,233, 99,128, 4, 60,228,225, + 243,104,129, 32, 20, 80, 7,246,229,242,244,233,227,225,108,128, + 254, 49,239,238,239,243,240,225,227,101,128,255, 69,112, 2, 80, + 35, 80, 55,232,225,243,233,243,237,225,242,235,225,242,237,229, + 238,233,225,110,128, 5, 91,244,249,243,229,116,128, 34, 5,110, + 6, 80, 77, 80, 88, 80, 99, 80,143, 80,175, 80,190,226,239,240, + 239,237,239,230,111,128, 49, 35,227,249,242,233,236,236,233, 99, + 128, 4, 61,100, 2, 80,105, 80,124,225,243,104,129, 32, 19, 80, + 113,246,229,242,244,233,227,225,108,128,254, 50,229,243,227,229, + 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,163,103, + 130, 1, 75, 80,151, 80,162,226,239,240,239,237,239,230,111,128, + 49, 37,232,229,227,249,242,233,236,236,233, 99,128, 4,165,232, + 239,239,235,227,249,242,233,236,236,233, 99,128, 4,200,243,240, + 225,227,101,128, 32, 2,111, 3, 80,206, 80,214, 80,223,231,239, + 238,229,107,128, 1, 25,235,239,242,229,225,110,128, 49, 83,240, + 229,110,130, 2, 91, 80,233, 80,242,227,236,239,243,229,100,128, + 2,154,242,229,246,229,242,243,229,100,130, 2, 92, 81, 1, 81, + 10,227,236,239,243,229,100,128, 2, 94,232,239,239,107,128, 2, + 93,112, 2, 81, 23, 81, 30,225,242,229,110,128, 36,160,243,233, + 236,239,110,129, 3,181, 81, 40,244,239,238,239,115,128, 3,173, + 241,117, 2, 81, 55, 81, 99,225,108,130, 0, 61, 81, 64, 81, 76, + 237,239,238,239,243,240,225,227,101,128,255, 29,115, 2, 81, 82, + 81, 89,237,225,236,108,128,254,102,245,240,229,242,233,239,114, + 128, 32,124,233,246,225,236,229,238,227,101,128, 34, 97,114, 3, + 81,118, 81,129, 81,140,226,239,240,239,237,239,230,111,128, 49, + 38,227,249,242,233,236,236,233, 99,128, 4, 64,229,246,229,242, + 243,229,100,129, 2, 88, 81,152,227,249,242,233,236,236,233, 99, + 128, 4, 77,115, 6, 81,177, 81,188, 81,208, 82, 33, 82, 78, 82, + 88,227,249,242,233,236,236,233, 99,128, 4, 65,228,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,171, + 104,132, 2,131, 81,220, 81,227, 82, 2, 82, 17,227,245,242,108, + 128, 2,134,239,242,116, 2, 81,235, 81,242,228,229,246, 97,128, + 9, 14,246,239,247,229,236,243,233,231,238,228,229,246, 97,128, + 9, 70,242,229,246,229,242,243,229,228,236,239,239,112,128, 1, + 170,243,241,245,225,244,242,229,246,229,242,243,229,100,128, 2, + 133,237,225,236,108, 2, 82, 42, 82, 53,232,233,242,225,231,225, + 238, 97,128, 48, 71,235,225,244,225,235,225,238, 97,129, 48,167, + 82, 66,232,225,236,230,247,233,228,244,104,128,255,106,244,233, + 237,225,244,229,100,128, 33, 46,245,240,229,242,233,239,114,128, + 246,236,116, 5, 82,110, 82,136, 82,140, 82,157, 82,223, 97,130, + 3,183, 82,118, 82,128,242,237,229,238,233,225,110,128, 5,104, + 244,239,238,239,115,128, 3,174,104,128, 0,240,233,236,228,101, + 129, 30,189, 82,149,226,229,236,239,119,128, 30, 27,238,225,232, + 244, 97, 3, 82,169, 82,201, 82,210,230,239,245,235,104, 2, 82, + 179, 82,188,232,229,226,242,229,119,128, 5,145,236,229,230,244, + 232,229,226,242,229,119,128, 5,145,232,229,226,242,229,119,128, + 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,245, + 242,238,229,100,128, 1,221,117, 2, 82,237, 82,246,235,239,242, + 229,225,110,128, 49, 97,242,111,128, 32,172,246,239,247,229,236, + 243,233,231,110, 3, 83, 11, 83, 21, 83, 28,226,229,238,231,225, + 236,105,128, 9,199,228,229,246, 97,128, 9, 71,231,245,234,225, + 242,225,244,105,128, 10,199,120, 2, 83, 45, 83,118,227,236,225, + 109,132, 0, 33, 83, 60, 83, 71, 83, 98, 83,110,225,242,237,229, + 238,233,225,110,128, 5, 92,100, 2, 83, 77, 83, 82,226,108,128, + 32, 60,239,247,110,129, 0,161, 83, 90,243,237,225,236,108,128, + 247,161,237,239,238,239,243,240,225,227,101,128,255, 1,243,237, + 225,236,108,128,247, 33,233,243,244,229,238,244,233,225,108,128, + 34, 3,250,104,131, 2,146, 83,141, 83,160, 83,171, 99, 2, 83, + 147, 83,154,225,242,239,110,128, 1,239,245,242,108,128, 2,147, + 242,229,246,229,242,243,229,100,128, 1,185,244,225,233,108,128, + 1,186,102,140, 0,102, 83,206, 84, 32, 84, 43, 84, 52, 84, 64, + 84,167, 84,183, 86,191, 86,204, 86,230, 88,107, 88,115, 97, 4, + 83,216, 83,223, 83,234, 83,245,228,229,246, 97,128, 9, 94,231, + 245,242,237,245,235,232,105,128, 10, 94,232,242,229,238,232,229, + 233,116,128, 33, 9,244,232, 97, 3, 83,255, 84, 8, 84, 20,225, + 242,225,226,233, 99,128, 6, 78,236,239,247,225,242,225,226,233, + 99,128, 6, 78,244,225,238,225,242,225,226,233, 99,128, 6, 75, + 226,239,240,239,237,239,230,111,128, 49, 8,227,233,242,227,236, + 101,128, 36,213,228,239,244,225,227,227,229,238,116,128, 30, 31, + 101, 3, 84, 72, 84,150, 84,160,104, 4, 84, 82, 84,105, 84,119, + 84,135,225,114, 2, 84, 89, 84, 96,225,226,233, 99,128, 6, 65, + 237,229,238,233,225,110,128, 5,134,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,210,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,254,211,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,254,212,233,227,239,240,244,233, 99,128, 3,229, + 237,225,236,101,128, 38, 64,102,130,251, 0, 84,175, 84,179,105, + 128,251, 3,108,128,251, 4,105,136,251, 1, 84,203, 84,243, 84, + 254, 85, 20, 85,142, 85,159, 85,167, 85,180,230,244,229,229,110, + 2, 84,213, 84,222,227,233,242,227,236,101,128, 36,110,112, 2, + 84,228, 84,235,225,242,229,110,128, 36,130,229,242,233,239,100, + 128, 36,150,231,245,242,229,228,225,243,104,128, 32, 18,236,236, + 229,100, 2, 85, 7, 85, 13,226,239,120,128, 37,160,242,229,227, + 116,128, 37,172,238,225,108, 5, 85, 34, 85, 73, 85, 90, 85,107, + 85,123,235,225,102,130, 5,218, 85, 44, 85, 64,228,225,231,229, + 243,104,129,251, 58, 85, 55,232,229,226,242,229,119,128,251, 58, + 232,229,226,242,229,119,128, 5,218,237,229,109,129, 5,221, 85, + 81,232,229,226,242,229,119,128, 5,221,238,245,110,129, 5,223, + 85, 98,232,229,226,242,229,119,128, 5,223,240,101,129, 5,227, + 85,114,232,229,226,242,229,119,128, 5,227,244,243,225,228,105, + 129, 5,229, 85,133,232,229,226,242,229,119,128, 5,229,242,243, + 244,244,239,238,229,227,232,233,238,229,243,101,128, 2,201,243, + 232,229,249,101,128, 37,201,244,225,227,249,242,233,236,236,233, + 99,128, 4,115,246,101,142, 0, 53, 85,213, 85,222, 85,232, 86, + 6, 86, 13, 86, 23, 86, 48, 86, 75, 86,109, 86,121, 86,132, 86, + 165, 86,173, 86,184,225,242,225,226,233, 99,128, 6,101,226,229, + 238,231,225,236,105,128, 9,235,227,233,242,227,236,101,129, 36, + 100, 85,243,233,238,246,229,242,243,229,243,225,238,243,243,229, + 242,233,102,128, 39,142,228,229,246, 97,128, 9,107,229,233,231, + 232,244,232,115,128, 33, 93,231,117, 2, 86, 30, 86, 39,234,225, + 242,225,244,105,128, 10,235,242,237,245,235,232,105,128, 10,107, + 232, 97, 2, 86, 55, 86, 66,227,235,225,242,225,226,233, 99,128, + 6,101,238,231,250,232,239,117,128, 48, 37,105, 2, 86, 81, 86, + 99,228,229,239,231,242,225,240,232,233,227,240,225,242,229,110, + 128, 50, 36,238,230,229,242,233,239,114,128, 32,133,237,239,238, + 239,243,240,225,227,101,128,255, 21,239,236,228,243,244,249,236, + 101,128,247, 53,112, 2, 86,138, 86,145,225,242,229,110,128, 36, + 120,229,114, 2, 86,152, 86,158,233,239,100,128, 36,140,243,233, + 225,110,128, 6,245,242,239,237,225,110,128, 33,116,243,245,240, + 229,242,233,239,114,128, 32,117,244,232,225,105,128, 14, 85,108, + 129,251, 2, 86,197,239,242,233,110,128, 1,146,109, 2, 86,210, + 86,221,239,238,239,243,240,225,227,101,128,255, 70,243,241,245, + 225,242,101,128, 51,153,111, 4, 86,240, 87, 6, 87, 18, 87, 25, + 230, 97, 2, 86,247, 86,255,238,244,232,225,105,128, 14, 31,244, + 232,225,105,128, 14, 29,238,231,237,225,238,244,232,225,105,128, + 14, 79,242,225,236,108,128, 34, 0,245,114,142, 0, 52, 87, 58, + 87, 67, 87, 77, 87,107, 87,114, 87,139, 87,166, 87,200, 87,212, + 87,231, 87,242, 88, 19, 88, 27, 88, 38,225,242,225,226,233, 99, + 128, 6,100,226,229,238,231,225,236,105,128, 9,234,227,233,242, + 227,236,101,129, 36, 99, 87, 88,233,238,246,229,242,243,229,243, + 225,238,243,243,229,242,233,102,128, 39,141,228,229,246, 97,128, + 9,106,231,117, 2, 87,121, 87,130,234,225,242,225,244,105,128, + 10,234,242,237,245,235,232,105,128, 10,106,232, 97, 2, 87,146, + 87,157,227,235,225,242,225,226,233, 99,128, 6,100,238,231,250, + 232,239,117,128, 48, 36,105, 2, 87,172, 87,190,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 35,238,230, + 229,242,233,239,114,128, 32,132,237,239,238,239,243,240,225,227, + 101,128,255, 20,238,245,237,229,242,225,244,239,242,226,229,238, + 231,225,236,105,128, 9,247,239,236,228,243,244,249,236,101,128, + 247, 52,112, 2, 87,248, 87,255,225,242,229,110,128, 36,119,229, + 114, 2, 88, 6, 88, 12,233,239,100,128, 36,139,243,233,225,110, + 128, 6,244,242,239,237,225,110,128, 33,115,243,245,240,229,242, + 233,239,114,128, 32,116,116, 2, 88, 44, 88, 82,229,229,110, 2, + 88, 52, 88, 61,227,233,242,227,236,101,128, 36,109,112, 2, 88, + 67, 88, 74,225,242,229,110,128, 36,129,229,242,233,239,100,128, + 36,149,104, 2, 88, 88, 88, 93,225,105,128, 14, 84,244,239,238, + 229,227,232,233,238,229,243,101,128, 2,203,240,225,242,229,110, + 128, 36,161,242, 97, 2, 88,122, 88,130,227,244,233,239,110,128, + 32, 68,238, 99,128, 32,163,103,144, 0,103, 88,171, 89,117, 89, + 140, 89,201, 89,218, 90,139, 91,132, 91,217, 91,230, 92, 88, 92, + 113, 92,141, 92,163, 93,108, 93,130, 93,232, 97, 9, 88,191, 88, + 201, 88,208, 88,215, 89, 23, 89, 48, 89, 59, 89, 70, 89,104,226, + 229,238,231,225,236,105,128, 9,151,227,245,244,101,128, 1,245, + 228,229,246, 97,128, 9, 23,102, 4, 88,225, 88,234, 88,248, 89, + 8,225,242,225,226,233, 99,128, 6,175,230,233,238,225,236,225, + 242,225,226,233, 99,128,251,147,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,251,148,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,251,149,231,117, 2, 89, 30, 89, 39,234,225, + 242,225,244,105,128, 10,151,242,237,245,235,232,105,128, 10, 23, + 232,233,242,225,231,225,238, 97,128, 48, 76,235,225,244,225,235, + 225,238, 97,128, 48,172,237,237, 97,130, 3,179, 89, 80, 89, 93, + 236,225,244,233,238,243,237,225,236,108,128, 2, 99,243,245,240, + 229,242,233,239,114,128, 2,224,238,231,233,225,227,239,240,244, + 233, 99,128, 3,235, 98, 2, 89,123, 89,133,239,240,239,237,239, + 230,111,128, 49, 13,242,229,246,101,128, 1, 31, 99, 4, 89,150, + 89,157, 89,166, 89,188,225,242,239,110,128, 1,231,229,228,233, + 236,236, 97,128, 1, 35,233,242, 99, 2, 89,174, 89,179,236,101, + 128, 36,214,245,237,230,236,229,120,128, 1, 29,239,237,237,225, + 225,227,227,229,238,116,128, 1, 35,228,239,116,129, 1, 33, 89, + 209,225,227,227,229,238,116,128, 1, 33,101, 6, 89,232, 89,243, + 89,254, 90, 9, 90, 28, 90,130,227,249,242,233,236,236,233, 99, + 128, 4, 51,232,233,242,225,231,225,238, 97,128, 48, 82,235,225, + 244,225,235,225,238, 97,128, 48,178,239,237,229,244,242,233,227, + 225,236,236,249,229,241,245,225,108,128, 34, 81,114, 3, 90, 36, + 90, 85, 90, 95,229,243,104, 3, 90, 46, 90, 61, 90, 70,225,227, + 227,229,238,244,232,229,226,242,229,119,128, 5,156,232,229,226, + 242,229,119,128, 5,243,237,245,241,228,225,237,232,229,226,242, + 229,119,128, 5,157,237,225,238,228,226,236,115,128, 0,223,243, + 232,225,249,233,109, 2, 90,106, 90,121,225,227,227,229,238,244, + 232,229,226,242,229,119,128, 5,158,232,229,226,242,229,119,128, + 5,244,244,225,237,225,242,107,128, 48, 19,104, 5, 90,151, 91, + 28, 91, 91, 91,116, 91,122, 97, 4, 90,161, 90,171, 90,194, 90, + 219,226,229,238,231,225,236,105,128, 9,152,100, 2, 90,177, 90, + 188,225,242,237,229,238,233,225,110,128, 5,114,229,246, 97,128, + 9, 24,231,117, 2, 90,201, 90,210,234,225,242,225,244,105,128, + 10,152,242,237,245,235,232,105,128, 10, 24,233,110, 4, 90,230, + 90,239, 90,253, 91, 13,225,242,225,226,233, 99,128, 6, 58,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,206,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,207,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,254,208,101, 3, 91, 36, + 91, 57, 91, 74,237,233,228,228,236,229,232,239,239,235,227,249, + 242,233,236,236,233, 99,128, 4,149,243,244,242,239,235,229,227, + 249,242,233,236,236,233, 99,128, 4,147,245,240,244,245,242,238, + 227,249,242,233,236,236,233, 99,128, 4,145,232, 97, 2, 91, 98, + 91,105,228,229,246, 97,128, 9, 90,231,245,242,237,245,235,232, + 105,128, 10, 90,239,239,107,128, 2, 96,250,243,241,245,225,242, + 101,128, 51,147,105, 3, 91,140, 91,151, 91,162,232,233,242,225, + 231,225,238, 97,128, 48, 78,235,225,244,225,235,225,238, 97,128, + 48,174,109, 2, 91,168, 91,179,225,242,237,229,238,233,225,110, + 128, 5, 99,229,108,130, 5,210, 91,188, 91,208,228,225,231,229, + 243,104,129,251, 50, 91,199,232,229,226,242,229,119,128,251, 50, + 232,229,226,242,229,119,128, 5,210,234,229,227,249,242,233,236, + 236,233, 99,128, 4, 83,236,239,244,244,225,108, 2, 91,241, 92, + 2,233,238,246,229,242,244,229,228,243,244,242,239,235,101,128, + 1,190,243,244,239,112,132, 2,148, 92, 17, 92, 28, 92, 34, 92, + 66,233,238,246,229,242,244,229,100,128, 2,150,237,239,100,128, + 2,192,242,229,246,229,242,243,229,100,130, 2,149, 92, 49, 92, + 55,237,239,100,128, 2,193,243,245,240,229,242,233,239,114,128, + 2,228,243,244,242,239,235,101,129, 2,161, 92, 77,242,229,246, + 229,242,243,229,100,128, 2,162,109, 2, 92, 94, 92,102,225,227, + 242,239,110,128, 30, 33,239,238,239,243,240,225,227,101,128,255, + 71,111, 2, 92,119, 92,130,232,233,242,225,231,225,238, 97,128, + 48, 84,235,225,244,225,235,225,238, 97,128, 48,180,240, 97, 2, + 92,148, 92,154,242,229,110,128, 36,162,243,241,245,225,242,101, + 128, 51,172,114, 2, 92,169, 93, 10, 97, 2, 92,175, 92,183,228, + 233,229,238,116,128, 34, 7,246,101,134, 0, 96, 92,200, 92,211, + 92,228, 92,235, 92,244, 93, 0,226,229,236,239,247,227,237, 98, + 128, 3, 22, 99, 2, 92,217, 92,222,237, 98,128, 3, 0,239,237, + 98,128, 3, 0,228,229,246, 97,128, 9, 83,236,239,247,237,239, + 100,128, 2,206,237,239,238,239,243,240,225,227,101,128,255, 64, + 244,239,238,229,227,237, 98,128, 3, 64,229,225,244,229,114,132, + 0, 62, 93, 26, 93, 45, 93, 57, 93,100,229,241,245,225,108,129, + 34,101, 93, 36,239,242,236,229,243,115,128, 34,219,237,239,238, + 239,243,240,225,227,101,128,255, 30,111, 2, 93, 63, 93, 89,114, + 2, 93, 69, 93, 82,229,241,245,233,246,225,236,229,238,116,128, + 34,115,236,229,243,115,128, 34,119,246,229,242,229,241,245,225, + 108,128, 34,103,243,237,225,236,108,128,254,101,115, 2, 93,114, + 93,122,227,242,233,240,116,128, 2, 97,244,242,239,235,101,128, + 1,229,117, 4, 93,140, 93,151, 93,208, 93,219,232,233,242,225, + 231,225,238, 97,128, 48, 80,233,108, 2, 93,158, 93,183,236,229, + 237,239,116, 2, 93,168, 93,175,236,229,230,116,128, 0,171,242, + 233,231,232,116,128, 0,187,243,233,238,231,108, 2, 93,193, 93, + 200,236,229,230,116,128, 32, 57,242,233,231,232,116,128, 32, 58, + 235,225,244,225,235,225,238, 97,128, 48,176,242,225,237,245,243, + 241,245,225,242,101,128, 51, 24,249,243,241,245,225,242,101,128, + 51,201,104,144, 0,104, 94, 22, 96,164, 96,199, 96,236, 97, 20, + 98,164, 98,184, 99,149, 99,161, 99,173,100,241,100,249,101, 4, + 101, 13,101, 93,101, 97, 97, 13, 94, 50, 94, 89, 94, 99, 94,129, + 94,154, 94,232, 94,244, 95, 13, 95, 28, 95, 57, 95, 70, 95,128, + 95,137, 97, 2, 94, 56, 94, 75,226,235,232,225,243,233,225,238, + 227,249,242,233,236,236,233, 99,128, 4,169,236,244,239,238,229, + 225,242,225,226,233, 99,128, 6,193,226,229,238,231,225,236,105, + 128, 9,185,228,101, 2, 94,106, 94,124,243,227,229,238,228,229, + 242,227,249,242,233,236,236,233, 99,128, 4,179,246, 97,128, 9, + 57,231,117, 2, 94,136, 94,145,234,225,242,225,244,105,128, 10, + 185,242,237,245,235,232,105,128, 10, 57,104, 4, 94,164, 94,173, + 94,187, 94,217,225,242,225,226,233, 99,128, 6, 45,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,162,105, 2, 94,193, 94, + 208,238,233,244,233,225,236,225,242,225,226,233, 99,128,254,163, + 242,225,231,225,238, 97,128, 48,111,237,229,228,233,225,236,225, + 242,225,226,233, 99,128,254,164,233,244,245,243,241,245,225,242, + 101,128, 51, 42,235,225,244,225,235,225,238, 97,129, 48,207, 95, + 1,232,225,236,230,247,233,228,244,104,128,255,138,236,225,238, + 244,231,245,242,237,245,235,232,105,128, 10, 77,237,250, 97, 2, + 95, 36, 95, 45,225,242,225,226,233, 99,128, 6, 33,236,239,247, + 225,242,225,226,233, 99,128, 6, 33,238,231,245,236,230,233,236, + 236,229,114,128, 49,100,114, 2, 95, 76, 95, 92,228,243,233,231, + 238,227,249,242,233,236,236,233, 99,128, 4, 74,240,239,239,110, + 2, 95,101, 95,114,236,229,230,244,226,225,242,226,245,112,128, + 33,188,242,233,231,232,244,226,225,242,226,245,112,128, 33,192, + 243,241,245,225,242,101,128, 51,202,244,225,102, 3, 95,147, 95, + 239, 96, 74,240,225,244,225,104,134, 5,178, 95,167, 95,172, 95, + 186, 95,195, 95,210, 95,226,177, 54,128, 5,178, 50, 2, 95,178, + 95,182, 51,128, 5,178,102,128, 5,178,232,229,226,242,229,119, + 128, 5,178,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,178,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,178,247,233,228,229,232,229,226,242,229,119,128, 5,178,241, + 225,237,225,244,115,135, 5,179, 96, 6, 96, 11, 96, 16, 96, 21, + 96, 30, 96, 45, 96, 61,177, 98,128, 5,179,178, 56,128, 5,179, + 179, 52,128, 5,179,232,229,226,242,229,119,128, 5,179,238,225, + 242,242,239,247,232,229,226,242,229,119,128, 5,179,241,245,225, + 242,244,229,242,232,229,226,242,229,119,128, 5,179,247,233,228, + 229,232,229,226,242,229,119,128, 5,179,243,229,231,239,108,135, + 5,177, 96, 96, 96,101, 96,106, 96,111, 96,120, 96,135, 96,151, + 177, 55,128, 5,177,178, 52,128, 5,177,179, 48,128, 5,177,232, + 229,226,242,229,119,128, 5,177,238,225,242,242,239,247,232,229, + 226,242,229,119,128, 5,177,241,245,225,242,244,229,242,232,229, + 226,242,229,119,128, 5,177,247,233,228,229,232,229,226,242,229, + 119,128, 5,177, 98, 3, 96,172, 96,177, 96,187,225,114,128, 1, + 39,239,240,239,237,239,230,111,128, 49, 15,242,229,246,229,226, + 229,236,239,119,128, 30, 43, 99, 2, 96,205, 96,214,229,228,233, + 236,236, 97,128, 30, 41,233,242, 99, 2, 96,222, 96,227,236,101, + 128, 36,215,245,237,230,236,229,120,128, 1, 37,100, 2, 96,242, + 96,252,233,229,242,229,243,233,115,128, 30, 39,239,116, 2, 97, + 3, 97, 12,225,227,227,229,238,116,128, 30, 35,226,229,236,239, + 119,128, 30, 37,101,136, 5,212, 97, 40, 97, 73, 97, 93, 98, 66, + 98, 82, 98,127, 98,136, 98,149,225,242,116,129, 38,101, 97, 48, + 243,245,233,116, 2, 97, 57, 97, 65,226,236,225,227,107,128, 38, + 101,247,232,233,244,101,128, 38, 97,228,225,231,229,243,104,129, + 251, 52, 97, 84,232,229,226,242,229,119,128,251, 52,104, 6, 97, + 107, 97,135, 97,143, 97,193, 97,239, 98, 32, 97, 2, 97,113, 97, + 127,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,242, + 225,226,233, 99,128, 6, 71,229,226,242,229,119,128, 5,212,230, + 233,238,225,236, 97, 2, 97,154, 97,185,236,116, 2, 97,161, 97, + 173,239,238,229,225,242,225,226,233, 99,128,251,167,244,247,239, + 225,242,225,226,233, 99,128,254,234,242,225,226,233, 99,128,254, + 234,232,225,237,250,225,225,226,239,246,101, 2, 97,208, 97,222, + 230,233,238,225,236,225,242,225,226,233, 99,128,251,165,233,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,251,164,105, + 2, 97,245, 98, 23,238,233,244,233,225,236, 97, 2, 98, 1, 98, + 15,236,244,239,238,229,225,242,225,226,233, 99,128,251,168,242, + 225,226,233, 99,128,254,235,242,225,231,225,238, 97,128, 48,120, + 237,229,228,233,225,236, 97, 2, 98, 44, 98, 58,236,244,239,238, + 229,225,242,225,226,233, 99,128,251,169,242,225,226,233, 99,128, + 254,236,233,243,229,233,229,242,225,243,241,245,225,242,101,128, + 51,123,107, 2, 98, 88, 98,112,225,244,225,235,225,238, 97,129, + 48,216, 98,100,232,225,236,230,247,233,228,244,104,128,255,141, + 245,244,225,225,242,245,243,241,245,225,242,101,128, 51, 54,238, + 231,232,239,239,107,128, 2,103,242,245,244,245,243,241,245,225, + 242,101,128, 51, 57,116,129, 5,215, 98,155,232,229,226,242,229, + 119,128, 5,215,232,239,239,107,129, 2,102, 98,173,243,245,240, + 229,242,233,239,114,128, 2,177,105, 4, 98,194, 99, 23, 99, 34, + 99, 59,229,245,104, 4, 98,206, 98,241, 99, 0, 99, 9, 97, 2, + 98,212, 98,227,227,233,242,227,236,229,235,239,242,229,225,110, + 128, 50,123,240,225,242,229,238,235,239,242,229,225,110,128, 50, + 27,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,109, + 235,239,242,229,225,110,128, 49, 78,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 13,232,233,242,225,231,225,238, 97,128, + 48,114,235,225,244,225,235,225,238, 97,129, 48,210, 99, 47,232, + 225,236,230,247,233,228,244,104,128,255,139,242,233,113,134, 5, + 180, 99, 77, 99, 82, 99, 96, 99,105, 99,120, 99,136,177, 52,128, + 5,180, 50, 2, 99, 88, 99, 92, 49,128, 5,180,100,128, 5,180, + 232,229,226,242,229,119,128, 5,180,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,180,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,180,247,233,228,229,232,229,226,242, + 229,119,128, 5,180,236,233,238,229,226,229,236,239,119,128, 30, + 150,237,239,238,239,243,240,225,227,101,128,255, 72,111, 9, 99, + 193, 99,204, 99,228, 99,253,100, 85,100, 98,100,184,100,224,100, + 235,225,242,237,229,238,233,225,110,128, 5,112,232,105, 2, 99, + 211, 99,219,240,244,232,225,105,128, 14, 43,242,225,231,225,238, + 97,128, 48,123,235,225,244,225,235,225,238, 97,129, 48,219, 99, + 241,232,225,236,230,247,233,228,244,104,128,255,142,236,225,109, + 135, 5,185,100, 17,100, 22,100, 27,100, 32,100, 41,100, 56,100, + 72,177, 57,128, 5,185,178, 54,128, 5,185,179, 50,128, 5,185, + 232,229,226,242,229,119,128, 5,185,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,185,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,185,247,233,228,229,232,229,226,242, + 229,119,128, 5,185,238,239,235,232,245,235,244,232,225,105,128, + 14, 46,111, 2,100,104,100,174,107, 4,100,114,100,126,100,132, + 100,154,225,226,239,246,229,227,239,237, 98,128, 3, 9,227,237, + 98,128, 3, 9,240,225,236,225,244,225,236,233,250,229,228,226, + 229,236,239,247,227,237, 98,128, 3, 33,242,229,244,242,239,230, + 236,229,248,226,229,236,239,247,227,237, 98,128, 3, 34,238,243, + 241,245,225,242,101,128, 51, 66,114, 2,100,190,100,217,105, 2, + 100,196,100,205,227,239,240,244,233, 99,128, 3,233,250,239,238, + 244,225,236,226,225,114,128, 32, 21,238,227,237, 98,128, 3, 27, + 244,243,240,242,233,238,231,115,128, 38,104,245,243,101,128, 35, + 2,240,225,242,229,110,128, 36,163,243,245,240,229,242,233,239, + 114,128, 2,176,244,245,242,238,229,100,128, 2,101,117, 4,101, + 23,101, 34,101, 47,101, 72,232,233,242,225,231,225,238, 97,128, + 48,117,233,233,244,239,243,241,245,225,242,101,128, 51, 51,235, + 225,244,225,235,225,238, 97,129, 48,213,101, 60,232,225,236,230, + 247,233,228,244,104,128,255,140,238,231,225,242,245,237,236,225, + 245,116,129, 2,221,101, 87,227,237, 98,128, 3, 11,118,128, 1, + 149,249,240,232,229,110,132, 0, 45,101,113,101,124,101,136,101, + 159,233,238,230,229,242,233,239,114,128,246,229,237,239,238,239, + 243,240,225,227,101,128,255, 13,115, 2,101,142,101,149,237,225, + 236,108,128,254, 99,245,240,229,242,233,239,114,128,246,230,244, + 247,111,128, 32, 16,105,149, 0,105,101,211,101,234,102, 12,102, + 59,105,197,106, 61,106, 98,106,125,107, 31,107, 35,107, 73,107, + 95,107,179,108, 88,108,163,108,171,108,184,109, 15,109, 72,109, + 100,109,144,225, 99, 2,101,218,101,224,245,244,101,128, 0,237, + 249,242,233,236,236,233, 99,128, 4, 79, 98, 3,101,242,101,251, + 102, 5,229,238,231,225,236,105,128, 9,135,239,240,239,237,239, + 230,111,128, 49, 39,242,229,246,101,128, 1, 45, 99, 3,102, 20, + 102, 27,102, 49,225,242,239,110,128, 1,208,233,242, 99, 2,102, + 35,102, 40,236,101,128, 36,216,245,237,230,236,229,120,128, 0, + 238,249,242,233,236,236,233, 99,128, 4, 86,100, 4,102, 69,102, + 79,105,154,105,187,226,236,231,242,225,246,101,128, 2, 9,101, + 2,102, 85,105,149,239,231,242,225,240,104, 7,102,106,102,120, + 102,133,105, 62,105, 93,105,106,105,118,229,225,242,244,232,227, + 233,242,227,236,101,128, 50,143,230,233,242,229,227,233,242,227, + 236,101,128, 50,139,233, 99, 14,102,164,102,180,103, 23,103, 77, + 103,143,103,172,103,188,103,245,104, 38,104, 50,104, 77,104,144, + 105, 26,105, 55,225,236,236,233,225,238,227,229,240,225,242,229, + 110,128, 50, 63, 99, 4,102,190,102,201,102,215,102,222,225,236, + 236,240,225,242,229,110,128, 50, 58,229,238,244,242,229,227,233, + 242,227,236,101,128, 50,165,236,239,243,101,128, 48, 6,111, 3, + 102,230,102,245,103, 9,237,237, 97,129, 48, 1,102,238,236,229, + 230,116,128,255,100,238,231,242,225,244,245,236,225,244,233,239, + 238,240,225,242,229,110,128, 50, 55,242,242,229,227,244,227,233, + 242,227,236,101,128, 50,163,101, 3,103, 31,103, 43,103, 60,225, + 242,244,232,240,225,242,229,110,128, 50, 47,238,244,229,242,240, + 242,233,243,229,240,225,242,229,110,128, 50, 61,248,227,229,236, + 236,229,238,244,227,233,242,227,236,101,128, 50,157,102, 2,103, + 83,103, 98,229,243,244,233,246,225,236,240,225,242,229,110,128, + 50, 64,105, 2,103,104,103,133,238,225,238,227,233,225,108, 2, + 103,116,103,125,227,233,242,227,236,101,128, 50,150,240,225,242, + 229,110,128, 50, 54,242,229,240,225,242,229,110,128, 50, 43,104, + 2,103,149,103,160,225,246,229,240,225,242,229,110,128, 50, 50, + 233,231,232,227,233,242,227,236,101,128, 50,164,233,244,229,242, + 225,244,233,239,238,237,225,242,107,128, 48, 5,108, 3,103,196, + 103,222,103,234,225,226,239,114, 2,103,205,103,214,227,233,242, + 227,236,101,128, 50,152,240,225,242,229,110,128, 50, 56,229,230, + 244,227,233,242,227,236,101,128, 50,167,239,247,227,233,242,227, + 236,101,128, 50,166,109, 2,103,251,104, 27,101, 2,104, 1,104, + 16,228,233,227,233,238,229,227,233,242,227,236,101,128, 50,169, + 244,225,236,240,225,242,229,110,128, 50, 46,239,239,238,240,225, + 242,229,110,128, 50, 42,238,225,237,229,240,225,242,229,110,128, + 50, 52,112, 2,104, 56,104, 64,229,242,233,239,100,128, 48, 2, + 242,233,238,244,227,233,242,227,236,101,128, 50,158,114, 2,104, + 83,104,131,101, 3,104, 91,104,102,104,117,225,227,232,240,225, + 242,229,110,128, 50, 67,240,242,229,243,229,238,244,240,225,242, + 229,110,128, 50, 57,243,239,245,242,227,229,240,225,242,229,110, + 128, 50, 62,233,231,232,244,227,233,242,227,236,101,128, 50,168, + 115, 5,104,156,104,185,104,199,104,224,104,252,101, 2,104,162, + 104,175,227,242,229,244,227,233,242,227,236,101,128, 50,153,236, + 230,240,225,242,229,110,128, 50, 66,239,227,233,229,244,249,240, + 225,242,229,110,128, 50, 51,112, 2,104,205,104,211,225,227,101, + 128, 48, 0,229,227,233,225,236,240,225,242,229,110,128, 50, 53, + 116, 2,104,230,104,241,239,227,235,240,225,242,229,110,128, 50, + 49,245,228,249,240,225,242,229,110,128, 50, 59,117, 2,105, 2, + 105, 11,238,240,225,242,229,110,128, 50, 48,240,229,242,246,233, + 243,229,240,225,242,229,110,128, 50, 60,119, 2,105, 32,105, 44, + 225,244,229,242,240,225,242,229,110,128, 50, 44,239,239,228,240, + 225,242,229,110,128, 50, 45,250,229,242,111,128, 48, 7,109, 2, + 105, 68,105, 81,229,244,225,236,227,233,242,227,236,101,128, 50, + 142,239,239,238,227,233,242,227,236,101,128, 50,138,238,225,237, + 229,227,233,242,227,236,101,128, 50,148,243,245,238,227,233,242, + 227,236,101,128, 50,144,119, 2,105,124,105,137,225,244,229,242, + 227,233,242,227,236,101,128, 50,140,239,239,228,227,233,242,227, + 236,101,128, 50,141,246, 97,128, 9, 7,233,229,242,229,243,233, + 115,130, 0,239,105,168,105,176,225,227,245,244,101,128, 30, 47, + 227,249,242,233,236,236,233, 99,128, 4,229,239,244,226,229,236, + 239,119,128, 30,203,101, 3,105,205,105,221,105,232,226,242,229, + 246,229,227,249,242,233,236,236,233, 99,128, 4,215,227,249,242, + 233,236,236,233, 99,128, 4, 53,245,238,103, 4,105,244,106, 23, + 106, 38,106, 47, 97, 2,105,250,106, 9,227,233,242,227,236,229, + 235,239,242,229,225,110,128, 50,117,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 21,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50,103,235,239,242,229,225,110,128, 49, 71,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 7,103, 2,106, + 67,106, 74,242,225,246,101,128, 0,236,117, 2,106, 80,106, 89, + 234,225,242,225,244,105,128, 10,135,242,237,245,235,232,105,128, + 10, 7,104, 2,106,104,106,114,233,242,225,231,225,238, 97,128, + 48, 68,239,239,235,225,226,239,246,101,128, 30,201,105, 8,106, + 143,106,153,106,164,106,171,106,196,106,212,106,227,106,243,226, + 229,238,231,225,236,105,128, 9,136,227,249,242,233,236,236,233, + 99,128, 4, 56,228,229,246, 97,128, 9, 8,231,117, 2,106,178, + 106,187,234,225,242,225,244,105,128, 10,136,242,237,245,235,232, + 105,128, 10, 8,237,225,244,242,225,231,245,242,237,245,235,232, + 105,128, 10, 64,238,246,229,242,244,229,228,226,242,229,246,101, + 128, 2, 11,243,232,239,242,244,227,249,242,233,236,236,233, 99, + 128, 4, 57,246,239,247,229,236,243,233,231,110, 3,107, 3,107, + 13,107, 20,226,229,238,231,225,236,105,128, 9,192,228,229,246, + 97,128, 9, 64,231,245,234,225,242,225,244,105,128, 10,192,106, + 128, 1, 51,107, 2,107, 41,107, 65,225,244,225,235,225,238, 97, + 129, 48,164,107, 53,232,225,236,230,247,233,228,244,104,128,255, + 114,239,242,229,225,110,128, 49, 99,108, 2,107, 79,107, 84,228, + 101,128, 2,220,245,249,232,229,226,242,229,119,128, 5,172,109, + 2,107,101,107,168, 97, 3,107,109,107,129,107,154,227,242,239, + 110,129, 1, 43,107,118,227,249,242,233,236,236,233, 99,128, 4, + 227,231,229,239,242,225,240,240,242,239,248,233,237,225,244,229, + 236,249,229,241,245,225,108,128, 34, 83,244,242,225,231,245,242, + 237,245,235,232,105,128, 10, 63,239,238,239,243,240,225,227,101, + 128,255, 73,110, 5,107,191,107,201,107,210,107,222,108, 50,227, + 242,229,237,229,238,116,128, 34, 6,230,233,238,233,244,121,128, + 34, 30,233,225,242,237,229,238,233,225,110,128, 5,107,116, 2, + 107,228,108, 40,101, 2,107,234,108, 29,231,242,225,108,131, 34, + 43,107,247,108, 9,108, 14, 98, 2,107,253,108, 5,239,244,244, + 239,109,128, 35, 33,116,128, 35, 33,229,120,128,248,245,116, 2, + 108, 20,108, 25,239,112,128, 35, 32,112,128, 35, 32,242,243,229, + 227,244,233,239,110,128, 34, 41,233,243,241,245,225,242,101,128, + 51, 5,118, 3,108, 58,108, 67,108, 76,226,245,236,236,229,116, + 128, 37,216,227,233,242,227,236,101,128, 37,217,243,237,233,236, + 229,230,225,227,101,128, 38, 59,111, 3,108, 96,108,107,108,115, + 227,249,242,233,236,236,233, 99,128, 4, 81,231,239,238,229,107, + 128, 1, 47,244, 97,131, 3,185,108,126,108,147,108,155,228,233, + 229,242,229,243,233,115,129, 3,202,108,139,244,239,238,239,115, + 128, 3,144,236,225,244,233,110,128, 2,105,244,239,238,239,115, + 128, 3,175,240,225,242,229,110,128, 36,164,242,233,231,245,242, + 237,245,235,232,105,128, 10,114,115, 4,108,194,108,239,108,253, + 109, 5,237,225,236,108, 2,108,203,108,214,232,233,242,225,231, + 225,238, 97,128, 48, 67,235,225,244,225,235,225,238, 97,129, 48, + 163,108,227,232,225,236,230,247,233,228,244,104,128,255,104,243, + 232,225,242,226,229,238,231,225,236,105,128, 9,250,244,242,239, + 235,101,128, 2,104,245,240,229,242,233,239,114,128,246,237,116, + 2,109, 21,109, 55,229,242,225,244,233,239,110, 2,109, 33,109, + 44,232,233,242,225,231,225,238, 97,128, 48,157,235,225,244,225, + 235,225,238, 97,128, 48,253,233,236,228,101,129, 1, 41,109, 64, + 226,229,236,239,119,128, 30, 45,117, 2,109, 78,109, 89,226,239, + 240,239,237,239,230,111,128, 49, 41,227,249,242,233,236,236,233, + 99,128, 4, 78,246,239,247,229,236,243,233,231,110, 3,109,116, + 109,126,109,133,226,229,238,231,225,236,105,128, 9,191,228,229, + 246, 97,128, 9, 63,231,245,234,225,242,225,244,105,128, 10,191, + 250,232,233,244,243, 97, 2,109,155,109,166,227,249,242,233,236, + 236,233, 99,128, 4,117,228,226,236,231,242,225,246,229,227,249, + 242,233,236,236,233, 99,128, 4,119,106,138, 0,106,109,209,110, + 16,110, 27,110, 77,110, 93,110,206,111, 19,111, 24,111, 36,111, + 44, 97, 4,109,219,109,230,109,240,109,247,225,242,237,229,238, + 233,225,110,128, 5,113,226,229,238,231,225,236,105,128, 9,156, + 228,229,246, 97,128, 9, 28,231,117, 2,109,254,110, 7,234,225, + 242,225,244,105,128, 10,156,242,237,245,235,232,105,128, 10, 28, + 226,239,240,239,237,239,230,111,128, 49, 16, 99, 3,110, 35,110, + 42,110, 64,225,242,239,110,128, 1,240,233,242, 99, 2,110, 50, + 110, 55,236,101,128, 36,217,245,237,230,236,229,120,128, 1, 53, + 242,239,243,243,229,228,244,225,233,108,128, 2,157,228,239,244, + 236,229,243,243,243,244,242,239,235,101,128, 2, 95,101, 3,110, + 101,110,112,110,177,227,249,242,233,236,236,233, 99,128, 4, 88, + 229,109, 4,110,123,110,132,110,146,110,162,225,242,225,226,233, + 99,128, 6, 44,230,233,238,225,236,225,242,225,226,233, 99,128, + 254,158,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,159,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, + 160,104, 2,110,183,110,192,225,242,225,226,233, 99,128, 6,152, + 230,233,238,225,236,225,242,225,226,233, 99,128,251,139,104, 2, + 110,212,111, 6, 97, 3,110,220,110,230,110,237,226,229,238,231, + 225,236,105,128, 9,157,228,229,246, 97,128, 9, 29,231,117, 2, + 110,244,110,253,234,225,242,225,244,105,128, 10,157,242,237,245, + 235,232,105,128, 10, 29,229,232,225,242,237,229,238,233,225,110, + 128, 5,123,233,115,128, 48, 4,237,239,238,239,243,240,225,227, + 101,128,255, 74,240,225,242,229,110,128, 36,165,243,245,240,229, + 242,233,239,114,128, 2,178,107,146, 0,107,111, 95,113,184,113, + 195,114, 1,114, 12,114,102,114,116,115,224,116,164,116,177,116, + 203,116,252,117,134,117,156,117,169,117,192,117,234,117,244, 97, + 12,111,121,111,153,111,175,111,205,112, 63,112, 88,112,118,112, + 143,112,249,113, 7,113,130,113,159, 98, 2,111,127,111,144,225, + 243,232,235,233,242,227,249,242,233,236,236,233, 99,128, 4,161, + 229,238,231,225,236,105,128, 9,149, 99, 2,111,159,111,165,245, + 244,101,128, 30, 49,249,242,233,236,236,233, 99,128, 4, 58,228, + 101, 2,111,182,111,200,243,227,229,238,228,229,242,227,249,242, + 233,236,236,233, 99,128, 4,155,246, 97,128, 9, 21,102,135, 5, + 219,111,223,111,232,111,252,112, 10,112, 19,112, 35,112, 50,225, + 242,225,226,233, 99,128, 6, 67,228,225,231,229,243,104,129,251, + 59,111,243,232,229,226,242,229,119,128,251, 59,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,218,232,229,226,242,229,119, + 128, 5,219,233,238,233,244,233,225,236,225,242,225,226,233, 99, + 128,254,219,237,229,228,233,225,236,225,242,225,226,233, 99,128, + 254,220,242,225,230,229,232,229,226,242,229,119,128,251, 77,231, + 117, 2,112, 70,112, 79,234,225,242,225,244,105,128, 10,149,242, + 237,245,235,232,105,128, 10, 21,104, 2,112, 94,112,104,233,242, + 225,231,225,238, 97,128, 48, 75,239,239,235,227,249,242,233,236, + 236,233, 99,128, 4,196,235,225,244,225,235,225,238, 97,129, 48, + 171,112,131,232,225,236,230,247,233,228,244,104,128,255,118,112, + 2,112,149,112,170,240, 97,129, 3,186,112,156,243,249,237,226, + 239,236,231,242,229,229,107,128, 3,240,249,229,239,245,110, 3, + 112,182,112,196,112,230,237,233,229,245,237,235,239,242,229,225, + 110,128, 49,113,112, 2,112,202,112,217,232,233,229,245,240,232, + 235,239,242,229,225,110,128, 49,132,233,229,245,240,235,239,242, + 229,225,110,128, 49,120,243,243,225,238,231,240,233,229,245,240, + 235,239,242,229,225,110,128, 49,121,242,239,242,233,233,243,241, + 245,225,242,101,128, 51, 13,115, 5,113, 19,113, 63,113, 78,113, + 86,113,114,232,233,228,225,225,245,244,111, 2,113, 32,113, 41, + 225,242,225,226,233, 99,128, 6, 64,238,239,243,233,228,229,226, + 229,225,242,233,238,231,225,242,225,226,233, 99,128, 6, 64,237, + 225,236,236,235,225,244,225,235,225,238, 97,128, 48,245,241,245, + 225,242,101,128, 51,132,242, 97, 2,113, 93,113,102,225,242,225, + 226,233, 99,128, 6, 80,244,225,238,225,242,225,226,233, 99,128, + 6, 77,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, + 4,159,244,225,232,233,242,225,240,242,239,236,239,238,231,237, + 225,242,235,232,225,236,230,247,233,228,244,104,128,255,112,246, + 229,242,244,233,227,225,236,243,244,242,239,235,229,227,249,242, + 233,236,236,233, 99,128, 4,157,226,239,240,239,237,239,230,111, + 128, 49, 14, 99, 4,113,205,113,227,113,236,113,244, 97, 2,113, + 211,113,221,236,243,241,245,225,242,101,128, 51,137,242,239,110, + 128, 1,233,229,228,233,236,236, 97,128, 1, 55,233,242,227,236, + 101,128, 36,218,239,237,237,225,225,227,227,229,238,116,128, 1, + 55,228,239,244,226,229,236,239,119,128, 30, 51,101, 4,114, 22, + 114, 49,114, 74,114, 86,104, 2,114, 28,114, 39,225,242,237,229, + 238,233,225,110,128, 5,132,233,242,225,231,225,238, 97,128, 48, + 81,235,225,244,225,235,225,238, 97,129, 48,177,114, 62,232,225, + 236,230,247,233,228,244,104,128,255,121,238,225,242,237,229,238, + 233,225,110,128, 5,111,243,237,225,236,236,235,225,244,225,235, + 225,238, 97,128, 48,246,231,242,229,229,238,236,225,238,228,233, + 99,128, 1, 56,104, 6,114,130,115, 3,115, 14,115, 39,115,126, + 115,214, 97, 5,114,142,114,152,114,163,114,170,114,195,226,229, + 238,231,225,236,105,128, 9,150,227,249,242,233,236,236,233, 99, + 128, 4, 69,228,229,246, 97,128, 9, 22,231,117, 2,114,177,114, + 186,234,225,242,225,244,105,128, 10,150,242,237,245,235,232,105, + 128, 10, 22,104, 4,114,205,114,214,114,228,114,244,225,242,225, + 226,233, 99,128, 6, 46,230,233,238,225,236,225,242,225,226,233, + 99,128,254,166,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,167,237,229,228,233,225,236,225,242,225,226,233, 99, + 128,254,168,229,233,227,239,240,244,233, 99,128, 3,231,232, 97, + 2,115, 21,115, 28,228,229,246, 97,128, 9, 89,231,245,242,237, + 245,235,232,105,128, 10, 89,233,229,245,235,104, 4,115, 53,115, + 88,115,103,115,112, 97, 2,115, 59,115, 74,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,120,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 24,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50,106,235,239,242,229,225,110,128, 49, 75, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 10,111, 4, + 115,136,115,185,115,195,115,200,235,104, 4,115,147,115,156,115, + 165,115,175,225,233,244,232,225,105,128, 14, 2,239,238,244,232, + 225,105,128, 14, 5,245,225,244,244,232,225,105,128, 14, 3,247, + 225,233,244,232,225,105,128, 14, 4,237,245,244,244,232,225,105, + 128, 14, 91,239,107,128, 1,153,242,225,235,232,225,238,231,244, + 232,225,105,128, 14, 6,250,243,241,245,225,242,101,128, 51,145, + 105, 4,115,234,115,245,116, 14,116, 63,232,233,242,225,231,225, + 238, 97,128, 48, 77,235,225,244,225,235,225,238, 97,129, 48,173, + 116, 2,232,225,236,230,247,233,228,244,104,128,255,119,242,111, + 3,116, 23,116, 38,116, 54,231,245,242,225,237,245,243,241,245, + 225,242,101,128, 51, 21,237,229,229,244,239,242,245,243,241,245, + 225,242,101,128, 51, 22,243,241,245,225,242,101,128, 51, 20,249, + 229,239,107, 5,116, 78,116,113,116,128,116,137,116,151, 97, 2, + 116, 84,116, 99,227,233,242,227,236,229,235,239,242,229,225,110, + 128, 50,110,240,225,242,229,238,235,239,242,229,225,110,128, 50, + 14,227,233,242,227,236,229,235,239,242,229,225,110,128, 50, 96, + 235,239,242,229,225,110,128, 49, 49,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 0,243,233,239,243,235,239,242,229,225, + 110,128, 49, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, + 92,108, 2,116,183,116,194,233,238,229,226,229,236,239,119,128, + 30, 53,243,241,245,225,242,101,128, 51,152,109, 3,116,211,116, + 225,116,236,227,245,226,229,228,243,241,245,225,242,101,128, 51, + 166,239,238,239,243,240,225,227,101,128,255, 75,243,241,245,225, + 242,229,228,243,241,245,225,242,101,128, 51,162,111, 5,117, 8, + 117, 34,117, 72,117, 84,117, 98,104, 2,117, 14,117, 24,233,242, + 225,231,225,238, 97,128, 48, 83,237,243,241,245,225,242,101,128, + 51,192,235, 97, 2,117, 41,117, 49,233,244,232,225,105,128, 14, + 1,244,225,235,225,238, 97,129, 48,179,117, 60,232,225,236,230, + 247,233,228,244,104,128,255,122,239,240,239,243,241,245,225,242, + 101,128, 51, 30,240,240,225,227,249,242,233,236,236,233, 99,128, + 4,129,114, 2,117,104,117,124,229,225,238,243,244,225,238,228, + 225,242,228,243,249,237,226,239,108,128, 50,127,239,238,233,243, + 227,237, 98,128, 3, 67,240, 97, 2,117,141,117,147,242,229,110, + 128, 36,166,243,241,245,225,242,101,128, 51,170,243,233,227,249, + 242,233,236,236,233, 99,128, 4,111,116, 2,117,175,117,184,243, + 241,245,225,242,101,128, 51,207,245,242,238,229,100,128, 2,158, + 117, 2,117,198,117,209,232,233,242,225,231,225,238, 97,128, 48, + 79,235,225,244,225,235,225,238, 97,129, 48,175,117,222,232,225, + 236,230,247,233,228,244,104,128,255,120,246,243,241,245,225,242, + 101,128, 51,184,247,243,241,245,225,242,101,128, 51,190,108,146, + 0,108,118, 38,120, 65,120, 94,120,160,120,198,121, 94,121,103, + 121,119,121,143,121,161,122, 23,122, 64,122,199,122,207,122,240, + 122,249,123, 1,123, 63, 97, 7,118, 54,118, 64,118, 71,118, 78, + 118,103,118,119,120, 53,226,229,238,231,225,236,105,128, 9,178, + 227,245,244,101,128, 1, 58,228,229,246, 97,128, 9, 50,231,117, + 2,118, 85,118, 94,234,225,242,225,244,105,128, 10,178,242,237, + 245,235,232,105,128, 10, 50,235,235,232,225,238,231,249,225,239, + 244,232,225,105,128, 14, 69,109, 10,118,141,119, 80,119, 97,119, + 135,119,149,119,168,119,184,119,204,119,224,119,247, 97, 2,118, + 147,119, 72,236,229,102, 4,118,159,118,173,119, 9,119, 26,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,252,232,225,237, + 250, 97, 2,118,183,118,224,225,226,239,246,101, 2,118,193,118, + 207,230,233,238,225,236,225,242,225,226,233, 99,128,254,248,233, + 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,247, + 226,229,236,239,119, 2,118,234,118,248,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,250,233,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,254,249,233,243,239,236,225,244,229, + 228,225,242,225,226,233, 99,128,254,251,237,225,228,228,225,225, + 226,239,246,101, 2,119, 41,119, 55,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,246,233,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,254,245,242,225,226,233, 99,128, 6, 68, + 226,228, 97,129, 3,187,119, 88,243,244,242,239,235,101,128, 1, + 155,229,100,130, 5,220,119,106,119,126,228,225,231,229,243,104, + 129,251, 60,119,117,232,229,226,242,229,119,128,251, 60,232,229, + 226,242,229,119,128, 5,220,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,222,232,225,232,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,202,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,223,234,229,229,237,233,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,252,201,235,232,225,232, + 233,238,233,244,233,225,236,225,242,225,226,233, 99,128,252,203, + 236,225,237,232,229,232,233,243,239,236,225,244,229,228,225,242, + 225,226,233, 99,128,253,242,237,101, 2,119,254,120, 11,228,233, + 225,236,225,242,225,226,233, 99,128,254,224,229,109, 2,120, 18, + 120, 37,232,225,232,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,253,136,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,252,204,242,231,229,227,233,242,227,236,101,128, 37, + 239, 98, 3,120, 73,120, 78,120, 84,225,114,128, 1,154,229,236, + 116,128, 2,108,239,240,239,237,239,230,111,128, 49, 12, 99, 4, + 120,104,120,111,120,120,120,147,225,242,239,110,128, 1, 62,229, + 228,233,236,236, 97,128, 1, 60,233,242, 99, 2,120,128,120,133, + 236,101,128, 36,219,245,237,230,236,229,248,226,229,236,239,119, + 128, 30, 61,239,237,237,225,225,227,227,229,238,116,128, 1, 60, + 228,239,116,130, 1, 64,120,170,120,179,225,227,227,229,238,116, + 128, 1, 64,226,229,236,239,119,129, 30, 55,120,189,237,225,227, + 242,239,110,128, 30, 57,101, 3,120,206,120,244,121, 89,230,116, + 2,120,213,120,229,225,238,231,236,229,225,226,239,246,229,227, + 237, 98,128, 3, 26,244,225,227,235,226,229,236,239,247,227,237, + 98,128, 3, 24,243,115,132, 0, 60,121, 1,121, 23,121, 35,121, + 81,229,241,245,225,108,129, 34,100,121, 11,239,242,231,242,229, + 225,244,229,114,128, 34,218,237,239,238,239,243,240,225,227,101, + 128,255, 28,111, 2,121, 41,121, 70,114, 2,121, 47,121, 60,229, + 241,245,233,246,225,236,229,238,116,128, 34,114,231,242,229,225, + 244,229,114,128, 34,118,246,229,242,229,241,245,225,108,128, 34, + 102,243,237,225,236,108,128,254,100,250,104,128, 2,110,230,226, + 236,239,227,107,128, 37,140,232,239,239,235,242,229,244,242,239, + 230,236,229,120,128, 2,109,105, 2,121,125,121,130,242, 97,128, + 32,164,247,238,225,242,237,229,238,233,225,110,128, 5,108,106, + 129, 1,201,121,149,229,227,249,242,233,236,236,233, 99,128, 4, + 89,108,132,246,192,121,173,121,197,121,208,121,217, 97, 2,121, + 179,121,186,228,229,246, 97,128, 9, 51,231,245,234,225,242,225, + 244,105,128, 10,179,233,238,229,226,229,236,239,119,128, 30, 59, + 236,225,228,229,246, 97,128, 9, 52,246,239,227,225,236,233, 99, + 3,121,231,121,241,121,248,226,229,238,231,225,236,105,128, 9, + 225,228,229,246, 97,128, 9, 97,246,239,247,229,236,243,233,231, + 110, 2,122, 6,122, 16,226,229,238,231,225,236,105,128, 9,227, + 228,229,246, 97,128, 9, 99,109, 3,122, 31,122, 44,122, 55,233, + 228,228,236,229,244,233,236,228,101,128, 2,107,239,238,239,243, + 240,225,227,101,128,255, 76,243,241,245,225,242,101,128, 51,208, + 111, 6,122, 78,122, 90,122,132,122,143,122,149,122,191,227,232, + 245,236,225,244,232,225,105,128, 14, 44,231,233,227,225,108, 3, + 122,102,122,108,122,127,225,238,100,128, 34, 39,238,239,116,129, + 0,172,122,116,242,229,246,229,242,243,229,100,128, 35, 16,239, + 114,128, 34, 40,236,233,238,231,244,232,225,105,128, 14, 37,238, + 231,115,128, 1,127,247,236,233,238,101, 2,122,159,122,182, 99, + 2,122,165,122,177,229,238,244,229,242,236,233,238,101,128,254, + 78,237, 98,128, 3, 50,228,225,243,232,229,100,128,254, 77,250, + 229,238,231,101,128, 37,202,240,225,242,229,110,128, 36,167,115, + 3,122,215,122,222,122,230,236,225,243,104,128, 1, 66,241,245, + 225,242,101,128, 33, 19,245,240,229,242,233,239,114,128,246,238, + 244,243,232,225,228,101,128, 37,145,245,244,232,225,105,128, 14, + 38,246,239,227,225,236,233, 99, 3,123, 15,123, 25,123, 32,226, + 229,238,231,225,236,105,128, 9,140,228,229,246, 97,128, 9, 12, + 246,239,247,229,236,243,233,231,110, 2,123, 46,123, 56,226,229, + 238,231,225,236,105,128, 9,226,228,229,246, 97,128, 9, 98,248, + 243,241,245,225,242,101,128, 51,211,109,144, 0,109,123,109,125, + 218,125,243,126, 14,126, 39,127, 92,127,114,128,169,128,199,128, + 248,129, 99,129,121,129,146,129,155,130,182,130,210, 97, 12,123, + 135,123,145,123,209,123,216,123,241,124, 33,125,125,125,150,125, + 155,125,169,125,181,125,186,226,229,238,231,225,236,105,128, 9, + 174, 99, 2,123,151,123,203,242,239,110,132, 0,175,123,165,123, + 176,123,182,123,191,226,229,236,239,247,227,237, 98,128, 3, 49, + 227,237, 98,128, 3, 4,236,239,247,237,239,100,128, 2,205,237, + 239,238,239,243,240,225,227,101,128,255,227,245,244,101,128, 30, + 63,228,229,246, 97,128, 9, 46,231,117, 2,123,223,123,232,234, + 225,242,225,244,105,128, 10,174,242,237,245,235,232,105,128, 10, + 46,104, 2,123,247,124, 23,225,240,225,235,104, 2,124, 1,124, + 10,232,229,226,242,229,119,128, 5,164,236,229,230,244,232,229, + 226,242,229,119,128, 5,164,233,242,225,231,225,238, 97,128, 48, + 126,105, 5,124, 45,124,114,124,177,124,207,125,113,227,232,225, + 244,244,225,247, 97, 3,124, 60,124, 91,124, 98,236,239,119, 2, + 124, 68,124, 79,236,229,230,244,244,232,225,105,128,248,149,242, + 233,231,232,244,244,232,225,105,128,248,148,244,232,225,105,128, + 14, 75,245,240,240,229,242,236,229,230,244,244,232,225,105,128, + 248,147,229,107, 3,124,123,124,154,124,161,236,239,119, 2,124, + 131,124,142,236,229,230,244,244,232,225,105,128,248,140,242,233, + 231,232,244,244,232,225,105,128,248,139,244,232,225,105,128, 14, + 72,245,240,240,229,242,236,229,230,244,244,232,225,105,128,248, + 138,232,225,238,225,235,225,116, 2,124,189,124,200,236,229,230, + 244,244,232,225,105,128,248,132,244,232,225,105,128, 14, 49,116, + 3,124,215,124,243,125, 50,225,233,235,232,117, 2,124,225,124, + 236,236,229,230,244,244,232,225,105,128,248,137,244,232,225,105, + 128, 14, 71,232,111, 3,124,252,125, 27,125, 34,236,239,119, 2, + 125, 4,125, 15,236,229,230,244,244,232,225,105,128,248,143,242, + 233,231,232,244,244,232,225,105,128,248,142,244,232,225,105,128, + 14, 73,245,240,240,229,242,236,229,230,244,244,232,225,105,128, + 248,141,242,105, 3,125, 59,125, 90,125, 97,236,239,119, 2,125, + 67,125, 78,236,229,230,244,244,232,225,105,128,248,146,242,233, + 231,232,244,244,232,225,105,128,248,145,244,232,225,105,128, 14, + 74,245,240,240,229,242,236,229,230,244,244,232,225,105,128,248, + 144,249,225,237,239,235,244,232,225,105,128, 14, 70,235,225,244, + 225,235,225,238, 97,129, 48,222,125,138,232,225,236,230,247,233, + 228,244,104,128,255,143,236,101,128, 38, 66,238,243,249,239,238, + 243,241,245,225,242,101,128, 51, 71,241,225,230,232,229,226,242, + 229,119,128, 5,190,242,115,128, 38, 66,115, 2,125,192,125,210, + 239,242,225,227,233,242,227,236,229,232,229,226,242,229,119,128, + 5,175,241,245,225,242,101,128, 51,131, 98, 2,125,224,125,234, + 239,240,239,237,239,230,111,128, 49, 7,243,241,245,225,242,101, + 128, 51,212, 99, 2,125,249,126, 1,233,242,227,236,101,128, 36, + 220,245,226,229,228,243,241,245,225,242,101,128, 51,165,228,239, + 116, 2,126, 22,126, 31,225,227,227,229,238,116,128, 30, 65,226, + 229,236,239,119,128, 30, 67,101, 7,126, 55,126,182,126,193,126, + 208,126,233,127, 14,127, 26,101, 2,126, 61,126,169,109, 4,126, + 71,126, 80,126, 94,126,110,225,242,225,226,233, 99,128, 6, 69, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,226,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,227,237,101, + 2,126,117,126,130,228,233,225,236,225,242,225,226,233, 99,128, + 254,228,229,237,105, 2,126,138,126,153,238,233,244,233,225,236, + 225,242,225,226,233, 99,128,252,209,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,252, 72,244,239,242,245,243,241,245, + 225,242,101,128, 51, 77,232,233,242,225,231,225,238, 97,128, 48, + 129,233,250,233,229,242,225,243,241,245,225,242,101,128, 51,126, + 235,225,244,225,235,225,238, 97,129, 48,225,126,221,232,225,236, + 230,247,233,228,244,104,128,255,146,109,130, 5,222,126,241,127, + 5,228,225,231,229,243,104,129,251, 62,126,252,232,229,226,242, + 229,119,128,251, 62,232,229,226,242,229,119,128, 5,222,238,225, + 242,237,229,238,233,225,110,128, 5,116,242,235,232, 97, 3,127, + 37,127, 46,127, 79,232,229,226,242,229,119,128, 5,165,235,229, + 230,245,236, 97, 2,127, 57,127, 66,232,229,226,242,229,119,128, + 5,166,236,229,230,244,232,229,226,242,229,119,128, 5,166,236, + 229,230,244,232,229,226,242,229,119,128, 5,165,104, 2,127, 98, + 127,104,239,239,107,128, 2,113,250,243,241,245,225,242,101,128, + 51,146,105, 6,127,128,127,165,128, 46,128, 57,128, 82,128,139, + 228,100, 2,127,135,127,160,236,229,228,239,244,235,225,244,225, + 235,225,238,225,232,225,236,230,247,233,228,244,104,128,255,101, + 239,116,128, 0,183,229,245,109, 5,127,179,127,214,127,229,127, + 238,128, 33, 97, 2,127,185,127,200,227,233,242,227,236,229,235, + 239,242,229,225,110,128, 50,114,240,225,242,229,238,235,239,242, + 229,225,110,128, 50, 18,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,100,235,239,242,229,225,110,128, 49, 65,112, 2, + 127,244,128, 20, 97, 2,127,250,128, 8,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,112,242,229,238,235,239,242,229,225, + 110,128, 50, 4,233,229,245,240,235,239,242,229,225,110,128, 49, + 110,243,233,239,243,235,239,242,229,225,110,128, 49,111,232,233, + 242,225,231,225,238, 97,128, 48,127,235,225,244,225,235,225,238, + 97,129, 48,223,128, 70,232,225,236,230,247,233,228,244,104,128, + 255,144,238,117, 2,128, 89,128,134,115,132, 34, 18,128,101,128, + 112,128,121,128,127,226,229,236,239,247,227,237, 98,128, 3, 32, + 227,233,242,227,236,101,128, 34,150,237,239,100,128, 2,215,240, + 236,245,115,128, 34, 19,244,101,128, 32, 50,242,105, 2,128,146, + 128,160,226,225,225,242,245,243,241,245,225,242,101,128, 51, 74, + 243,241,245,225,242,101,128, 51, 73,108, 2,128,175,128,190,239, + 238,231,236,229,231,244,245,242,238,229,100,128, 2,112,243,241, + 245,225,242,101,128, 51,150,109, 3,128,207,128,221,128,232,227, + 245,226,229,228,243,241,245,225,242,101,128, 51,163,239,238,239, + 243,240,225,227,101,128,255, 77,243,241,245,225,242,229,228,243, + 241,245,225,242,101,128, 51,159,111, 5,129, 4,129, 30,129, 55, + 129, 65,129, 74,104, 2,129, 10,129, 20,233,242,225,231,225,238, + 97,128, 48,130,237,243,241,245,225,242,101,128, 51,193,235,225, + 244,225,235,225,238, 97,129, 48,226,129, 43,232,225,236,230,247, + 233,228,244,104,128,255,147,236,243,241,245,225,242,101,128, 51, + 214,237,225,244,232,225,105,128, 14, 33,246,229,242,243,243,241, + 245,225,242,101,129, 51,167,129, 89,228,243,241,245,225,242,101, + 128, 51,168,240, 97, 2,129,106,129,112,242,229,110,128, 36,168, + 243,241,245,225,242,101,128, 51,171,115, 2,129,127,129,136,243, + 241,245,225,242,101,128, 51,179,245,240,229,242,233,239,114,128, + 246,239,244,245,242,238,229,100,128, 2,111,117,141, 0,181,129, + 185,129,189,129,199,129,223,129,233,129,255,130, 10,130, 35,130, + 58,130, 68,130, 98,130,162,130,172, 49,128, 0,181,225,243,241, + 245,225,242,101,128, 51,130,227,104, 2,129,206,129,216,231,242, + 229,225,244,229,114,128, 34,107,236,229,243,115,128, 34,106,230, + 243,241,245,225,242,101,128, 51,140,103, 2,129,239,129,246,242, + 229,229,107,128, 3,188,243,241,245,225,242,101,128, 51,141,232, + 233,242,225,231,225,238, 97,128, 48,128,235,225,244,225,235,225, + 238, 97,129, 48,224,130, 23,232,225,236,230,247,233,228,244,104, + 128,255,145,108, 2,130, 41,130, 50,243,241,245,225,242,101,128, + 51,149,244,233,240,236,121,128, 0,215,237,243,241,245,225,242, + 101,128, 51,155,238,225,104, 2,130, 76,130, 85,232,229,226,242, + 229,119,128, 5,163,236,229,230,244,232,229,226,242,229,119,128, + 5,163,115, 2,130,104,130,153,233, 99, 3,130,113,130,130,130, + 141,225,236,238,239,244,101,129, 38,106,130,124,228,226,108,128, + 38,107,230,236,225,244,243,233,231,110,128, 38,109,243,232,225, + 242,240,243,233,231,110,128, 38,111,243,241,245,225,242,101,128, + 51,178,246,243,241,245,225,242,101,128, 51,182,247,243,241,245, + 225,242,101,128, 51,188,118, 2,130,188,130,201,237,229,231,225, + 243,241,245,225,242,101,128, 51,185,243,241,245,225,242,101,128, + 51,183,119, 2,130,216,130,229,237,229,231,225,243,241,245,225, + 242,101,128, 51,191,243,241,245,225,242,101,128, 51,189,110,150, + 0,110,131, 30,131,164,131,188,131,254,132, 23,132, 81,132, 91, + 132,158,132,201,134,235,134,253,135, 22,135, 53,135, 79,135,144, + 137,126,137,134,137,159,137,167,138,135,138,145,138,155, 97, 8, + 131, 48,131, 68,131, 75,131, 82,131,107,131,118,131,143,131,155, + 98, 2,131, 54,131, 63,229,238,231,225,236,105,128, 9,168,236, + 97,128, 34, 7,227,245,244,101,128, 1, 68,228,229,246, 97,128, + 9, 40,231,117, 2,131, 89,131, 98,234,225,242,225,244,105,128, + 10,168,242,237,245,235,232,105,128, 10, 40,232,233,242,225,231, + 225,238, 97,128, 48,106,235,225,244,225,235,225,238, 97,129, 48, + 202,131,131,232,225,236,230,247,233,228,244,104,128,255,133,240, + 239,243,244,242,239,240,232,101,128, 1, 73,243,241,245,225,242, + 101,128, 51,129, 98, 2,131,170,131,180,239,240,239,237,239,230, + 111,128, 49, 11,243,240,225,227,101,128, 0,160, 99, 4,131,198, + 131,205,131,214,131,241,225,242,239,110,128, 1, 72,229,228,233, + 236,236, 97,128, 1, 70,233,242, 99, 2,131,222,131,227,236,101, + 128, 36,221,245,237,230,236,229,248,226,229,236,239,119,128, 30, + 75,239,237,237,225,225,227,227,229,238,116,128, 1, 70,228,239, + 116, 2,132, 6,132, 15,225,227,227,229,238,116,128, 30, 69,226, + 229,236,239,119,128, 30, 71,101, 3,132, 31,132, 42,132, 67,232, + 233,242,225,231,225,238, 97,128, 48,109,235,225,244,225,235,225, + 238, 97,129, 48,205,132, 55,232,225,236,230,247,233,228,244,104, + 128,255,136,247,243,232,229,241,229,236,243,233,231,110,128, 32, + 170,230,243,241,245,225,242,101,128, 51,139,103, 2,132, 97,132, + 147, 97, 3,132,105,132,115,132,122,226,229,238,231,225,236,105, + 128, 9,153,228,229,246, 97,128, 9, 25,231,117, 2,132,129,132, + 138,234,225,242,225,244,105,128, 10,153,242,237,245,235,232,105, + 128, 10, 25,239,238,231,245,244,232,225,105,128, 14, 7,104, 2, + 132,164,132,174,233,242,225,231,225,238, 97,128, 48,147,239,239, + 107, 2,132,182,132,189,236,229,230,116,128, 2,114,242,229,244, + 242,239,230,236,229,120,128, 2,115,105, 4,132,211,133,124,133, + 135,133,193,229,245,110, 7,132,229,133, 8,133, 40,133, 54,133, + 63,133, 96,133,109, 97, 2,132,235,132,250,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,111,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 15,227,105, 2,133, 15,133, 27,229, + 245,227,235,239,242,229,225,110,128, 49, 53,242,227,236,229,235, + 239,242,229,225,110,128, 50, 97,232,233,229,245,232,235,239,242, + 229,225,110,128, 49, 54,235,239,242,229,225,110,128, 49, 52,240, + 97, 2,133, 70,133, 84,238,243,233,239,243,235,239,242,229,225, + 110,128, 49,104,242,229,238,235,239,242,229,225,110,128, 50, 1, + 243,233,239,243,235,239,242,229,225,110,128, 49,103,244,233,235, + 229,245,244,235,239,242,229,225,110,128, 49,102,232,233,242,225, + 231,225,238, 97,128, 48,107,107, 2,133,141,133,165,225,244,225, + 235,225,238, 97,129, 48,203,133,153,232,225,236,230,247,233,228, + 244,104,128,255,134,232,225,232,233,116, 2,133,175,133,186,236, + 229,230,244,244,232,225,105,128,248,153,244,232,225,105,128, 14, + 77,238,101,141, 0, 57,133,224,133,233,133,243,134, 17,134, 24, + 134, 49,134, 76,134,110,134,122,134,133,134,166,134,174,134,185, + 225,242,225,226,233, 99,128, 6,105,226,229,238,231,225,236,105, + 128, 9,239,227,233,242,227,236,101,129, 36,104,133,254,233,238, + 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39, + 146,228,229,246, 97,128, 9,111,231,117, 2,134, 31,134, 40,234, + 225,242,225,244,105,128, 10,239,242,237,245,235,232,105,128, 10, + 111,232, 97, 2,134, 56,134, 67,227,235,225,242,225,226,233, 99, + 128, 6,105,238,231,250,232,239,117,128, 48, 41,105, 2,134, 82, + 134,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 40,238,230,229,242,233,239,114,128, 32,137,237,239, + 238,239,243,240,225,227,101,128,255, 25,239,236,228,243,244,249, + 236,101,128,247, 57,112, 2,134,139,134,146,225,242,229,110,128, + 36,124,229,114, 2,134,153,134,159,233,239,100,128, 36,144,243, + 233,225,110,128, 6,249,242,239,237,225,110,128, 33,120,243,245, + 240,229,242,233,239,114,128, 32,121,116, 2,134,191,134,229,229, + 229,110, 2,134,199,134,208,227,233,242,227,236,101,128, 36,114, + 112, 2,134,214,134,221,225,242,229,110,128, 36,134,229,242,233, + 239,100,128, 36,154,232,225,105,128, 14, 89,106,129, 1,204,134, + 241,229,227,249,242,233,236,236,233, 99,128, 4, 90,235,225,244, + 225,235,225,238, 97,129, 48,243,135, 10,232,225,236,230,247,233, + 228,244,104,128,255,157,108, 2,135, 28,135, 42,229,231,242,233, + 231,232,244,236,239,238,103,128, 1,158,233,238,229,226,229,236, + 239,119,128, 30, 73,109, 2,135, 59,135, 70,239,238,239,243,240, + 225,227,101,128,255, 78,243,241,245,225,242,101,128, 51,154,110, + 2,135, 85,135,135, 97, 3,135, 93,135,103,135,110,226,229,238, + 231,225,236,105,128, 9,163,228,229,246, 97,128, 9, 35,231,117, + 2,135,117,135,126,234,225,242,225,244,105,128, 10,163,242,237, + 245,235,232,105,128, 10, 35,238,225,228,229,246, 97,128, 9, 41, + 111, 6,135,158,135,169,135,194,135,235,136,187,137,114,232,233, + 242,225,231,225,238, 97,128, 48,110,235,225,244,225,235,225,238, + 97,129, 48,206,135,182,232,225,236,230,247,233,228,244,104,128, + 255,137,110, 3,135,202,135,218,135,227,226,242,229,225,235,233, + 238,231,243,240,225,227,101,128, 0,160,229,238,244,232,225,105, + 128, 14, 19,245,244,232,225,105,128, 14, 25,239,110, 7,135,252, + 136, 5,136, 19,136, 53,136, 69,136,110,136,169,225,242,225,226, + 233, 99,128, 6, 70,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,230,231,232,245,238,238, 97, 2,136, 30,136, 39,225,242, + 225,226,233, 99,128, 6,186,230,233,238,225,236,225,242,225,226, + 233, 99,128,251,159,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,254,231,234,229,229,237,105, 2,136, 79,136, 94,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,252,210,243,239, + 236,225,244,229,228,225,242,225,226,233, 99,128,252, 75,237,101, + 2,136,117,136,130,228,233,225,236,225,242,225,226,233, 99,128, + 254,232,229,237,105, 2,136,138,136,153,238,233,244,233,225,236, + 225,242,225,226,233, 99,128,252,213,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,252, 78,238,239,239,238,230,233,238, + 225,236,225,242,225,226,233, 99,128,252,141,116, 7,136,203,136, + 214,136,243,137, 22,137, 34,137, 54,137, 80,227,239,238,244,225, + 233,238,115,128, 34, 12,101, 2,136,220,136,236,236,229,237,229, + 238,116,129, 34, 9,136,231,239,102,128, 34, 9,241,245,225,108, + 128, 34, 96,231,242,229,225,244,229,114,129, 34,111,136,255,238, + 239,114, 2,137, 7,137, 15,229,241,245,225,108,128, 34,113,236, + 229,243,115,128, 34,121,233,228,229,238,244,233,227,225,108,128, + 34, 98,236,229,243,115,129, 34,110,137, 43,238,239,242,229,241, + 245,225,108,128, 34,112,112, 2,137, 60,137, 70,225,242,225,236, + 236,229,108,128, 34, 38,242,229,227,229,228,229,115,128, 34,128, + 243,117, 3,137, 89,137, 96,137,105,226,243,229,116,128, 34,132, + 227,227,229,229,228,115,128, 34,129,240,229,242,243,229,116,128, + 34,133,247,225,242,237,229,238,233,225,110,128, 5,118,240,225, + 242,229,110,128, 36,169,115, 2,137,140,137,149,243,241,245,225, + 242,101,128, 51,177,245,240,229,242,233,239,114,128, 32,127,244, + 233,236,228,101,128, 0,241,117,132, 3,189,137,179,137,190,138, + 15,138, 98,232,233,242,225,231,225,238, 97,128, 48,108,107, 2, + 137,196,137,220,225,244,225,235,225,238, 97,129, 48,204,137,208, + 232,225,236,230,247,233,228,244,104,128,255,135,244, 97, 3,137, + 229,137,239,137,246,226,229,238,231,225,236,105,128, 9,188,228, + 229,246, 97,128, 9, 60,231,117, 2,137,253,138, 6,234,225,242, + 225,244,105,128, 10,188,242,237,245,235,232,105,128, 10, 60,109, + 2,138, 21,138, 55,226,229,242,243,233,231,110,130, 0, 35,138, + 35,138, 47,237,239,238,239,243,240,225,227,101,128,255, 3,243, + 237,225,236,108,128,254, 95,229,114, 2,138, 62,138, 94,225,236, + 243,233,231,110, 2,138, 73,138, 81,231,242,229,229,107,128, 3, + 116,236,239,247,229,242,231,242,229,229,107,128, 3,117,111,128, + 33, 22,110,130, 5,224,138,106,138,126,228,225,231,229,243,104, + 129,251, 64,138,117,232,229,226,242,229,119,128,251, 64,232,229, + 226,242,229,119,128, 5,224,246,243,241,245,225,242,101,128, 51, + 181,247,243,241,245,225,242,101,128, 51,187,249, 97, 3,138,164, + 138,174,138,181,226,229,238,231,225,236,105,128, 9,158,228,229, + 246, 97,128, 9, 30,231,117, 2,138,188,138,197,234,225,242,225, + 244,105,128, 10,158,242,237,245,235,232,105,128, 10, 30,111,147, + 0,111,138,248,139, 14,139, 92,140, 6,140, 78,140, 93,140,133, + 141, 0,141, 21,141, 59,141, 70,141,248,143, 82,143,146,143,179, + 143,225,144, 98,144,145,144,157, 97, 2,138,254,139, 5,227,245, + 244,101,128, 0,243,238,231,244,232,225,105,128, 14, 45, 98, 4, + 139, 24,139, 66,139, 75,139, 85,225,242,242,229,100,130, 2,117, + 139, 36,139, 47,227,249,242,233,236,236,233, 99,128, 4,233,228, + 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, + 4,235,229,238,231,225,236,105,128, 9,147,239,240,239,237,239, + 230,111,128, 49, 27,242,229,246,101,128, 1, 79, 99, 3,139,100, + 139,173,139,252, 97, 2,139,106,139,167,238,228,242, 97, 3,139, + 117,139,124,139,135,228,229,246, 97,128, 9, 17,231,245,234,225, + 242,225,244,105,128, 10,145,246,239,247,229,236,243,233,231,110, + 2,139,149,139,156,228,229,246, 97,128, 9, 73,231,245,234,225, + 242,225,244,105,128, 10,201,242,239,110,128, 1,210,233,242, 99, + 2,139,181,139,186,236,101,128, 36,222,245,237,230,236,229,120, + 133, 0,244,139,205,139,213,139,224,139,232,139,244,225,227,245, + 244,101,128, 30,209,228,239,244,226,229,236,239,119,128, 30,217, + 231,242,225,246,101,128, 30,211,232,239,239,235,225,226,239,246, + 101,128, 30,213,244,233,236,228,101,128, 30,215,249,242,233,236, + 236,233, 99,128, 4, 62,100, 4,140, 16,140, 39,140, 45,140, 68, + 226,108, 2,140, 23,140, 31,225,227,245,244,101,128, 1, 81,231, + 242,225,246,101,128, 2, 13,229,246, 97,128, 9, 19,233,229,242, + 229,243,233,115,129, 0,246,140, 57,227,249,242,233,236,236,233, + 99,128, 4,231,239,244,226,229,236,239,119,128, 30,205,101,129, + 1, 83,140, 84,235,239,242,229,225,110,128, 49, 90,103, 3,140, + 101,140,116,140,123,239,238,229,107,129, 2,219,140,110,227,237, + 98,128, 3, 40,242,225,246,101,128, 0,242,245,234,225,242,225, + 244,105,128, 10,147,104, 4,140,143,140,154,140,164,140,242,225, + 242,237,229,238,233,225,110,128, 5,133,233,242,225,231,225,238, + 97,128, 48, 74,111, 2,140,170,140,180,239,235,225,226,239,246, + 101,128, 30,207,242,110,133, 1,161,140,195,140,203,140,214,140, + 222,140,234,225,227,245,244,101,128, 30,219,228,239,244,226,229, + 236,239,119,128, 30,227,231,242,225,246,101,128, 30,221,232,239, + 239,235,225,226,239,246,101,128, 30,223,244,233,236,228,101,128, + 30,225,245,238,231,225,242,245,237,236,225,245,116,128, 1, 81, + 105,129, 1,163,141, 6,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 15,107, 2,141, 27,141, 51,225,244,225,235,225, + 238, 97,129, 48,170,141, 39,232,225,236,230,247,233,228,244,104, + 128,255,117,239,242,229,225,110,128, 49, 87,236,229,232,229,226, + 242,229,119,128, 5,171,109, 6,141, 84,141,112,141,119,141,208, + 141,219,141,237,225,227,242,239,110,130, 1, 77,141, 96,141,104, + 225,227,245,244,101,128, 30, 83,231,242,225,246,101,128, 30, 81, + 228,229,246, 97,128, 9, 80,229,231, 97,133, 3,201,141,135,141, + 139,141,150,141,164,141,180, 49,128, 3,214,227,249,242,233,236, + 236,233, 99,128, 4, 97,236,225,244,233,238,227,236,239,243,229, + 100,128, 2,119,242,239,245,238,228,227,249,242,233,236,236,233, + 99,128, 4,123,116, 2,141,186,141,201,233,244,236,239,227,249, + 242,233,236,236,233, 99,128, 4,125,239,238,239,115,128, 3,206, + 231,245,234,225,242,225,244,105,128, 10,208,233,227,242,239,110, + 129, 3,191,141,229,244,239,238,239,115,128, 3,204,239,238,239, + 243,240,225,227,101,128,255, 79,238,101,145, 0, 49,142, 31,142, + 40,142, 50,142, 80,142,105,142,114,142,123,142,148,142,182,142, + 216,142,228,142,247,143, 2,143, 35,143, 45,143, 53,143, 64,225, + 242,225,226,233, 99,128, 6, 97,226,229,238,231,225,236,105,128, + 9,231,227,233,242,227,236,101,129, 36, 96,142, 61,233,238,246, + 229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,138, + 100, 2,142, 86,142, 92,229,246, 97,128, 9,103,239,244,229,238, + 236,229,225,228,229,114,128, 32, 36,229,233,231,232,244,104,128, + 33, 91,230,233,244,244,229,100,128,246,220,231,117, 2,142,130, + 142,139,234,225,242,225,244,105,128, 10,231,242,237,245,235,232, + 105,128, 10,103,232, 97, 3,142,157,142,168,142,173,227,235,225, + 242,225,226,233, 99,128, 6, 97,236,102,128, 0,189,238,231,250, + 232,239,117,128, 48, 33,105, 2,142,188,142,206,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 32,238,230, + 229,242,233,239,114,128, 32,129,237,239,238,239,243,240,225,227, + 101,128,255, 17,238,245,237,229,242,225,244,239,242,226,229,238, + 231,225,236,105,128, 9,244,239,236,228,243,244,249,236,101,128, + 247, 49,112, 2,143, 8,143, 15,225,242,229,110,128, 36,116,229, + 114, 2,143, 22,143, 28,233,239,100,128, 36,136,243,233,225,110, + 128, 6,241,241,245,225,242,244,229,114,128, 0,188,242,239,237, + 225,110,128, 33,112,243,245,240,229,242,233,239,114,128, 0,185, + 244,104, 2,143, 71,143, 76,225,105,128, 14, 81,233,242,100,128, + 33, 83,111, 3,143, 90,143,124,143,140,103, 2,143, 96,143,114, + 239,238,229,107,129, 1,235,143,105,237,225,227,242,239,110,128, + 1,237,245,242,237,245,235,232,105,128, 10, 19,237,225,244,242, + 225,231,245,242,237,245,235,232,105,128, 10, 75,240,229,110,128, + 2, 84,112, 3,143,154,143,161,143,172,225,242,229,110,128, 36, + 170,229,238,226,245,236,236,229,116,128, 37,230,244,233,239,110, + 128, 35, 37,114, 2,143,185,143,214,100, 2,143,191,143,202,230, + 229,237,233,238,233,238,101,128, 0,170,237,225,243,227,245,236, + 233,238,101,128, 0,186,244,232,239,231,239,238,225,108,128, 34, + 31,115, 5,143,237,144, 13,144, 30,144, 75,144, 88,232,239,242, + 116, 2,143,246,143,253,228,229,246, 97,128, 9, 18,246,239,247, + 229,236,243,233,231,238,228,229,246, 97,128, 9, 74,236,225,243, + 104,129, 0,248,144, 22,225,227,245,244,101,128, 1,255,237,225, + 236,108, 2,144, 39,144, 50,232,233,242,225,231,225,238, 97,128, + 48, 73,235,225,244,225,235,225,238, 97,129, 48,169,144, 63,232, + 225,236,230,247,233,228,244,104,128,255,107,244,242,239,235,229, + 225,227,245,244,101,128, 1,255,245,240,229,242,233,239,114,128, + 246,240,116, 2,144,104,144,115,227,249,242,233,236,236,233, 99, + 128, 4,127,233,236,228,101,130, 0,245,144,126,144,134,225,227, + 245,244,101,128, 30, 77,228,233,229,242,229,243,233,115,128, 30, + 79,245,226,239,240,239,237,239,230,111,128, 49, 33,118, 2,144, + 163,144,244,229,114, 2,144,170,144,236,236,233,238,101,131, 32, + 62,144,183,144,206,144,229, 99, 2,144,189,144,201,229,238,244, + 229,242,236,233,238,101,128,254, 74,237, 98,128, 3, 5,100, 2, + 144,212,144,220,225,243,232,229,100,128,254, 73,226,236,247,225, + 246,121,128,254, 76,247,225,246,121,128,254, 75,243,227,239,242, + 101,128, 0,175,239,247,229,236,243,233,231,110, 3,145, 3,145, + 13,145, 20,226,229,238,231,225,236,105,128, 9,203,228,229,246, + 97,128, 9, 75,231,245,234,225,242,225,244,105,128, 10,203,112, + 145, 0,112,145, 69,147,197,147,208,147,217,147,229,149,154,149, + 164,150,156,151,175,152, 9,152, 35,152,166,152,174,153, 76,153, + 134,153,162,153,172, 97, 14,145, 99,145,131,145,141,145,148,145, + 155,145,203,145,214,145,228,145,239,146, 30,146, 44,147, 56,147, + 95,147,185, 97, 2,145,105,145,117,237,240,243,243,241,245,225, + 242,101,128, 51,128,243,229,238,244,239,243,241,245,225,242,101, + 128, 51, 43,226,229,238,231,225,236,105,128, 9,170,227,245,244, + 101,128, 30, 85,228,229,246, 97,128, 9, 42,103, 2,145,161,145, + 179,101, 2,145,167,145,174,228,239,247,110,128, 33,223,245,112, + 128, 33,222,117, 2,145,185,145,194,234,225,242,225,244,105,128, + 10,170,242,237,245,235,232,105,128, 10, 42,232,233,242,225,231, + 225,238, 97,128, 48,113,233,249,225,238,238,239,233,244,232,225, + 105,128, 14, 47,235,225,244,225,235,225,238, 97,128, 48,209,108, + 2,145,245,146, 14,225,244,225,236,233,250,225,244,233,239,238, + 227,249,242,233,236,236,233,227,227,237, 98,128, 4,132,239,227, + 232,235,225,227,249,242,233,236,236,233, 99,128, 4,192,238,243, + 233,239,243,235,239,242,229,225,110,128, 49,127,114, 3,146, 52, + 146, 73,147, 45, 97, 2,146, 58,146, 66,231,242,225,240,104,128, + 0,182,236,236,229,108,128, 34, 37,229,110, 2,146, 80,146,190, + 236,229,230,116,136, 0, 40,146,103,146,118,146,123,146,128,146, + 139,146,151,146,174,146,179,225,236,244,239,238,229,225,242,225, + 226,233, 99,128,253, 62,226,116,128,248,237,229,120,128,248,236, + 233,238,230,229,242,233,239,114,128, 32,141,237,239,238,239,243, + 240,225,227,101,128,255, 8,115, 2,146,157,146,164,237,225,236, + 108,128,254, 89,245,240,229,242,233,239,114,128, 32,125,244,112, + 128,248,235,246,229,242,244,233,227,225,108,128,254, 53,242,233, + 231,232,116,136, 0, 41,146,214,146,229,146,234,146,239,146,250, + 147, 6,147, 29,147, 34,225,236,244,239,238,229,225,242,225,226, + 233, 99,128,253, 63,226,116,128,248,248,229,120,128,248,247,233, + 238,230,229,242,233,239,114,128, 32,142,237,239,238,239,243,240, + 225,227,101,128,255, 9,115, 2,147, 12,147, 19,237,225,236,108, + 128,254, 90,245,240,229,242,233,239,114,128, 32,126,244,112,128, + 248,246,246,229,242,244,233,227,225,108,128,254, 54,244,233,225, + 236,228,233,230,102,128, 34, 2,115, 3,147, 64,147, 75,147, 87, + 229,241,232,229,226,242,229,119,128, 5,192,232,244,225,232,229, + 226,242,229,119,128, 5,153,241,245,225,242,101,128, 51,169,244, + 225,104,134, 5,183,147,113,147,127,147,132,147,141,147,156,147, + 172, 49, 2,147,119,147,123, 49,128, 5,183,100,128, 5,183,178, + 97,128, 5,183,232,229,226,242,229,119,128, 5,183,238,225,242, + 242,239,247,232,229,226,242,229,119,128, 5,183,241,245,225,242, + 244,229,242,232,229,226,242,229,119,128, 5,183,247,233,228,229, + 232,229,226,242,229,119,128, 5,183,250,229,242,232,229,226,242, + 229,119,128, 5,161,226,239,240,239,237,239,230,111,128, 49, 6, + 227,233,242,227,236,101,128, 36,223,228,239,244,225,227,227,229, + 238,116,128, 30, 87,101,137, 5,228,147,251,148, 6,148, 26,148, + 38,148, 58,148,160,148,171,148,192,149,147,227,249,242,233,236, + 236,233, 99,128, 4, 63,228,225,231,229,243,104,129,251, 68,148, + 17,232,229,226,242,229,119,128,251, 68,229,250,233,243,241,245, + 225,242,101,128, 51, 59,230,233,238,225,236,228,225,231,229,243, + 232,232,229,226,242,229,119,128,251, 67,104, 5,148, 70,148, 93, + 148,101,148,115,148,145,225,114, 2,148, 77,148, 84,225,226,233, + 99,128, 6,126,237,229,238,233,225,110,128, 5,122,229,226,242, + 229,119,128, 5,228,230,233,238,225,236,225,242,225,226,233, 99, + 128,251, 87,105, 2,148,121,148,136,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,251, 88,242,225,231,225,238, 97,128, 48, + 122,237,229,228,233,225,236,225,242,225,226,233, 99,128,251, 89, + 235,225,244,225,235,225,238, 97,128, 48,218,237,233,228,228,236, + 229,232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,167, + 114, 5,148,204,148,216,149, 2,149,123,149,136,225,230,229,232, + 229,226,242,229,119,128,251, 78,227,229,238,116,131, 0, 37,148, + 229,148,238,148,250,225,242,225,226,233, 99,128, 6,106,237,239, + 238,239,243,240,225,227,101,128,255, 5,243,237,225,236,108,128, + 254,106,105, 2,149, 8,149,105,239,100,134, 0, 46,149, 25,149, + 36,149, 47,149, 59,149, 70,149, 82,225,242,237,229,238,233,225, + 110,128, 5,137,227,229,238,244,229,242,229,100,128, 0,183,232, + 225,236,230,247,233,228,244,104,128,255, 97,233,238,230,229,242, + 233,239,114,128,246,231,237,239,238,239,243,240,225,227,101,128, + 255, 14,115, 2,149, 88,149, 95,237,225,236,108,128,254, 82,245, + 240,229,242,233,239,114,128,246,232,243,240,239,237,229,238,233, + 231,242,229,229,235,227,237, 98,128, 3, 66,240,229,238,228,233, + 227,245,236,225,114,128, 34,165,244,232,239,245,243,225,238,100, + 128, 32, 48,243,229,244, 97,128, 32,167,230,243,241,245,225,242, + 101,128, 51,138,104, 3,149,172,149,222,150,103, 97, 3,149,180, + 149,190,149,197,226,229,238,231,225,236,105,128, 9,171,228,229, + 246, 97,128, 9, 43,231,117, 2,149,204,149,213,234,225,242,225, + 244,105,128, 10,171,242,237,245,235,232,105,128, 10, 43,105,133, + 3,198,149,236,149,240,150, 70,150, 78,150, 89, 49,128, 3,213, + 229,245,240,104, 4,149,253,150, 32,150, 47,150, 56, 97, 2,150, + 3,150, 18,227,233,242,227,236,229,235,239,242,229,225,110,128, + 50,122,240,225,242,229,238,235,239,242,229,225,110,128, 50, 26, + 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,108,235, + 239,242,229,225,110,128, 49, 77,240,225,242,229,238,235,239,242, + 229,225,110,128, 50, 12,236,225,244,233,110,128, 2,120,238,244, + 232,245,244,232,225,105,128, 14, 58,243,249,237,226,239,236,231, + 242,229,229,107,128, 3,213,111, 3,150,111,150,116,150,142,239, + 107,128, 1,165,240,104, 2,150,123,150,132,225,238,244,232,225, + 105,128, 14, 30,245,238,231,244,232,225,105,128, 14, 28,243,225, + 237,240,232,225,239,244,232,225,105,128, 14, 32,105,133, 3,192, + 150,170,151,126,151,137,151,148,151,162,229,245,112, 6,150,186, + 150,221,150,253,151, 25,151, 39,151, 91, 97, 2,150,192,150,207, + 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,115,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 19,227,105, 2, + 150,228,150,240,229,245,227,235,239,242,229,225,110,128, 49,118, + 242,227,236,229,235,239,242,229,225,110,128, 50,101,107, 2,151, + 3,151, 17,233,249,229,239,235,235,239,242,229,225,110,128, 49, + 114,239,242,229,225,110,128, 49, 66,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 5,243,233,239,115, 2,151, 48,151, 76, + 107, 2,151, 54,151, 68,233,249,229,239,235,235,239,242,229,225, + 110,128, 49,116,239,242,229,225,110,128, 49, 68,244,233,235,229, + 245,244,235,239,242,229,225,110,128, 49,117,116, 2,151, 97,151, + 112,232,233,229,245,244,232,235,239,242,229,225,110,128, 49,119, + 233,235,229,245,244,235,239,242,229,225,110,128, 49,115,232,233, + 242,225,231,225,238, 97,128, 48,116,235,225,244,225,235,225,238, + 97,128, 48,212,243,249,237,226,239,236,231,242,229,229,107,128, + 3,214,247,242,225,242,237,229,238,233,225,110,128, 5,131,236, + 245,115,132, 0, 43,151,189,151,200,151,209,151,242,226,229,236, + 239,247,227,237, 98,128, 3, 31,227,233,242,227,236,101,128, 34, + 149,109, 2,151,215,151,222,233,238,245,115,128, 0,177,111, 2, + 151,228,151,232,100,128, 2,214,238,239,243,240,225,227,101,128, + 255, 11,115, 2,151,248,151,255,237,225,236,108,128,254, 98,245, + 240,229,242,233,239,114,128, 32,122,109, 2,152, 15,152, 26,239, + 238,239,243,240,225,227,101,128,255, 80,243,241,245,225,242,101, + 128, 51,216,111, 5,152, 47,152, 58,152,125,152,136,152,146,232, + 233,242,225,231,225,238, 97,128, 48,125,233,238,244,233,238,231, + 233,238,228,229,120, 4,152, 78,152, 90,152,102,152,115,228,239, + 247,238,247,232,233,244,101,128, 38, 31,236,229,230,244,247,232, + 233,244,101,128, 38, 28,242,233,231,232,244,247,232,233,244,101, + 128, 38, 30,245,240,247,232,233,244,101,128, 38, 29,235,225,244, + 225,235,225,238, 97,128, 48,221,240,236,225,244,232,225,105,128, + 14, 27,243,244,225,236,237,225,242,107,129, 48, 18,152,159,230, + 225,227,101,128, 48, 32,240,225,242,229,110,128, 36,171,114, 3, + 152,182,152,208,152,233,101, 2,152,188,152,196,227,229,228,229, + 115,128, 34,122,243,227,242,233,240,244,233,239,110,128, 33, 30, + 233,237,101, 2,152,216,152,222,237,239,100,128, 2,185,242,229, + 246,229,242,243,229,100,128, 32, 53,111, 4,152,243,152,250,153, + 4,153, 17,228,245,227,116,128, 34, 15,234,229,227,244,233,246, + 101,128, 35, 5,236,239,238,231,229,228,235,225,238, 97,128, 48, + 252,112, 2,153, 23,153, 60,101, 2,153, 29,153, 36,236,236,239, + 114,128, 35, 24,242,243,117, 2,153, 44,153, 51,226,243,229,116, + 128, 34,130,240,229,242,243,229,116,128, 34,131,239,242,244,233, + 239,110,129, 34, 55,153, 71,225,108,128, 34, 29,115, 2,153, 82, + 153,125,105,130, 3,200,153, 90,153,101,227,249,242,233,236,236, + 233, 99,128, 4,113,236,233,240,238,229,245,237,225,244,225,227, + 249,242,233,236,236,233,227,227,237, 98,128, 4,134,243,241,245, + 225,242,101,128, 51,176,117, 2,153,140,153,151,232,233,242,225, + 231,225,238, 97,128, 48,119,235,225,244,225,235,225,238, 97,128, + 48,215,246,243,241,245,225,242,101,128, 51,180,247,243,241,245, + 225,242,101,128, 51,186,113,136, 0,113,153,202,154,251,155, 6, + 155, 15,155, 22,155, 34,155, 72,155, 80, 97, 4,153,212,153,235, + 154, 43,154,234,100, 2,153,218,153,224,229,246, 97,128, 9, 88, + 237,225,232,229,226,242,229,119,128, 5,168,102, 4,153,245,153, + 254,154, 12,154, 28,225,242,225,226,233, 99,128, 6, 66,230,233, + 238,225,236,225,242,225,226,233, 99,128,254,214,233,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,254,215,237,229,228,233, + 225,236,225,242,225,226,233, 99,128,254,216,237,225,244,115,136, + 5,184,154, 66,154, 86,154,100,154,105,154,110,154,119,154,134, + 154,221, 49, 3,154, 74,154, 78,154, 82, 48,128, 5,184, 97,128, + 5,184, 99,128, 5,184, 50, 2,154, 92,154, 96, 55,128, 5,184, + 57,128, 5,184,179, 51,128, 5,184,228,101,128, 5,184,232,229, + 226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229,226, + 242,229,119,128, 5,184,113, 2,154,140,154,206,225,244,225,110, + 4,154,153,154,162,154,177,154,193,232,229,226,242,229,119,128, + 5,184,238,225,242,242,239,247,232,229,226,242,229,119,128, 5, + 184,241,245,225,242,244,229,242,232,229,226,242,229,119,128, 5, + 184,247,233,228,229,232,229,226,242,229,119,128, 5,184,245,225, + 242,244,229,242,232,229,226,242,229,119,128, 5,184,247,233,228, + 229,232,229,226,242,229,119,128, 5,184,242,238,229,249,240,225, + 242,225,232,229,226,242,229,119,128, 5,159,226,239,240,239,237, + 239,230,111,128, 49, 17,227,233,242,227,236,101,128, 36,224,232, + 239,239,107,128, 2,160,237,239,238,239,243,240,225,227,101,128, + 255, 81,239,102,130, 5,231,155, 43,155, 63,228,225,231,229,243, + 104,129,251, 71,155, 54,232,229,226,242,229,119,128,251, 71,232, + 229,226,242,229,119,128, 5,231,240,225,242,229,110,128, 36,172, + 117, 4,155, 90,155,102,155,191,156, 22,225,242,244,229,242,238, + 239,244,101,128, 38,105,226,245,244,115,135, 5,187,155,123,155, + 128,155,133,155,138,155,147,155,162,155,178,177, 56,128, 5,187, + 178, 53,128, 5,187,179, 49,128, 5,187,232,229,226,242,229,119, + 128, 5,187,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,187,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,187,247,233,228,229,232,229,226,242,229,119,128, 5,187,229, + 243,244,233,239,110,133, 0, 63,155,210,155,233,155,250,156, 2, + 156, 14,225,114, 2,155,217,155,224,225,226,233, 99,128, 6, 31, + 237,229,238,233,225,110,128, 5, 94,228,239,247,110,129, 0,191, + 155,242,243,237,225,236,108,128,247,191,231,242,229,229,107,128, + 3,126,237,239,238,239,243,240,225,227,101,128,255, 31,243,237, + 225,236,108,128,247, 63,239,244,101, 4,156, 34,156,105,156,125, + 156,154,228,226,108,133, 0, 34,156, 50,156, 57,156, 64,156, 76, + 156, 97,226,225,243,101,128, 32, 30,236,229,230,116,128, 32, 28, + 237,239,238,239,243,240,225,227,101,128,255, 2,240,242,233,237, + 101,129, 48, 30,156, 86,242,229,246,229,242,243,229,100,128, 48, + 29,242,233,231,232,116,128, 32, 29,236,229,230,116,129, 32, 24, + 156,114,242,229,246,229,242,243,229,100,128, 32, 27,114, 2,156, + 131,156,141,229,246,229,242,243,229,100,128, 32, 27,233,231,232, + 116,129, 32, 25,156,150,110,128, 1, 73,243,233,238,231,108, 2, + 156,164,156,171,226,225,243,101,128, 32, 26,101,129, 0, 39,156, + 177,237,239,238,239,243,240,225,227,101,128,255, 7,114,145, 0, + 114,156,227,157,231,157,242,158, 33,158, 84,159,101,159,125,159, + 220,161,254,162, 35,162, 47,162,101,162,109,163, 15,163, 26,163, + 61,163,161, 97, 11,156,251,157, 6,157, 16,157, 23,157, 88,157, + 104,157,129,157,140,157,165,157,188,157,225,225,242,237,229,238, + 233,225,110,128, 5,124,226,229,238,231,225,236,105,128, 9,176, + 227,245,244,101,128, 1, 85,100, 4,157, 33,157, 39,157, 53,157, + 79,229,246, 97,128, 9, 48,233,227,225,108,129, 34, 26,157, 48, + 229,120,128,248,229,239,246,229,242,243,243,241,245,225,242,101, + 129, 51,174,157, 69,228,243,241,245,225,242,101,128, 51,175,243, + 241,245,225,242,101,128, 51,173,230,101,129, 5,191,157, 95,232, + 229,226,242,229,119,128, 5,191,231,117, 2,157,111,157,120,234, + 225,242,225,244,105,128, 10,176,242,237,245,235,232,105,128, 10, + 48,232,233,242,225,231,225,238, 97,128, 48,137,235,225,244,225, + 235,225,238, 97,129, 48,233,157,153,232,225,236,230,247,233,228, + 244,104,128,255,151,236,239,247,229,242,228,233,225,231,239,238, + 225,236,226,229,238,231,225,236,105,128, 9,241,109, 2,157,194, + 157,217,233,228,228,236,229,228,233,225,231,239,238,225,236,226, + 229,238,231,225,236,105,128, 9,240,243,232,239,242,110,128, 2, + 100,244,233,111,128, 34, 54,226,239,240,239,237,239,230,111,128, + 49, 22, 99, 4,157,252,158, 3,158, 12,158, 20,225,242,239,110, + 128, 1, 89,229,228,233,236,236, 97,128, 1, 87,233,242,227,236, + 101,128, 36,225,239,237,237,225,225,227,227,229,238,116,128, 1, + 87,100, 2,158, 39,158, 49,226,236,231,242,225,246,101,128, 2, + 17,239,116, 2,158, 56,158, 65,225,227,227,229,238,116,128, 30, + 89,226,229,236,239,119,129, 30, 91,158, 75,237,225,227,242,239, + 110,128, 30, 93,101, 6,158, 98,158,143,158,178,158,233,159, 2, + 159, 35,102, 2,158,104,158,117,229,242,229,238,227,229,237,225, + 242,107,128, 32, 59,236,229,248,243,117, 2,158,127,158,134,226, + 243,229,116,128, 34,134,240,229,242,243,229,116,128, 34,135,231, + 233,243,244,229,114, 2,158,154,158,159,229,100,128, 0,174,115, + 2,158,165,158,171,225,238,115,128,248,232,229,242,233,102,128, + 246,218,104, 3,158,186,158,209,158,223,225,114, 2,158,193,158, + 200,225,226,233, 99,128, 6, 49,237,229,238,233,225,110,128, 5, + 128,230,233,238,225,236,225,242,225,226,233, 99,128,254,174,233, + 242,225,231,225,238, 97,128, 48,140,235,225,244,225,235,225,238, + 97,129, 48,236,158,246,232,225,236,230,247,233,228,244,104,128, + 255,154,243,104,130, 5,232,159, 11,159, 26,228,225,231,229,243, + 232,232,229,226,242,229,119,128,251, 72,232,229,226,242,229,119, + 128, 5,232,118, 3,159, 43,159, 56,159, 88,229,242,243,229,228, + 244,233,236,228,101,128, 34, 61,233, 97, 2,159, 63,159, 72,232, + 229,226,242,229,119,128, 5,151,237,245,231,242,225,243,232,232, + 229,226,242,229,119,128, 5,151,236,239,231,233,227,225,236,238, + 239,116,128, 35, 16,230,233,243,232,232,239,239,107,129, 2,126, + 159,114,242,229,246,229,242,243,229,100,128, 2,127,104, 2,159, + 131,159,154, 97, 2,159,137,159,147,226,229,238,231,225,236,105, + 128, 9,221,228,229,246, 97,128, 9, 93,111,131, 3,193,159,164, + 159,193,159,207,239,107,129, 2,125,159,171,244,245,242,238,229, + 100,129, 2,123,159,182,243,245,240,229,242,233,239,114,128, 2, + 181,243,249,237,226,239,236,231,242,229,229,107,128, 3,241,244, + 233,227,232,239,239,235,237,239,100,128, 2,222,105, 6,159,234, + 161, 22,161, 68,161, 79,161,104,161,240,229,245,108, 9,160, 0, + 160, 35,160, 50,160, 64,160,110,160,124,160,210,160,223,161, 2, + 97, 2,160, 6,160, 21,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,113,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 17,227,233,242,227,236,229,235,239,242,229,225,110,128, + 50, 99,232,233,229,245,232,235,239,242,229,225,110,128, 49, 64, + 107, 2,160, 70,160,102,233,249,229,239,107, 2,160, 80,160, 89, + 235,239,242,229,225,110,128, 49, 58,243,233,239,243,235,239,242, + 229,225,110,128, 49,105,239,242,229,225,110,128, 49, 57,237,233, + 229,245,237,235,239,242,229,225,110,128, 49, 59,112, 3,160,132, + 160,164,160,179, 97, 2,160,138,160,152,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,108,242,229,238,235,239,242,229,225, + 110,128, 50, 3,232,233,229,245,240,232,235,239,242,229,225,110, + 128, 49, 63,233,229,245,112, 2,160,188,160,197,235,239,242,229, + 225,110,128, 49, 60,243,233,239,243,235,239,242,229,225,110,128, + 49,107,243,233,239,243,235,239,242,229,225,110,128, 49, 61,116, + 2,160,229,160,244,232,233,229,245,244,232,235,239,242,229,225, + 110,128, 49, 62,233,235,229,245,244,235,239,242,229,225,110,128, + 49,106,249,229,239,242,233,238,232,233,229,245,232,235,239,242, + 229,225,110,128, 49,109,231,232,116, 2,161, 30,161, 38,225,238, + 231,236,101,128, 34, 31,116, 2,161, 44,161, 58,225,227,235,226, + 229,236,239,247,227,237, 98,128, 3, 25,242,233,225,238,231,236, + 101,128, 34,191,232,233,242,225,231,225,238, 97,128, 48,138,235, + 225,244,225,235,225,238, 97,129, 48,234,161, 92,232,225,236,230, + 247,233,228,244,104,128,255,152,110, 2,161,110,161,226,103,131, + 2,218,161,120,161,131,161,137,226,229,236,239,247,227,237, 98, + 128, 3, 37,227,237, 98,128, 3, 10,232,225,236,102, 2,161,146, + 161,192,236,229,230,116,131, 2,191,161,159,161,170,161,181,225, + 242,237,229,238,233,225,110,128, 5, 89,226,229,236,239,247,227, + 237, 98,128, 3, 28,227,229,238,244,229,242,229,100,128, 2,211, + 242,233,231,232,116,130, 2,190,161,204,161,215,226,229,236,239, + 247,227,237, 98,128, 3, 57,227,229,238,244,229,242,229,100,128, + 2,210,246,229,242,244,229,228,226,242,229,246,101,128, 2, 19, + 244,244,239,242,245,243,241,245,225,242,101,128, 51, 81,108, 2, + 162, 4,162, 15,233,238,229,226,229,236,239,119,128, 30, 95,239, + 238,231,236,229,103,129, 2,124,162, 26,244,245,242,238,229,100, + 128, 2,122,237,239,238,239,243,240,225,227,101,128,255, 82,111, + 3,162, 55,162, 66,162, 91,232,233,242,225,231,225,238, 97,128, + 48,141,235,225,244,225,235,225,238, 97,129, 48,237,162, 79,232, + 225,236,230,247,233,228,244,104,128,255,155,242,245,225,244,232, + 225,105,128, 14, 35,240,225,242,229,110,128, 36,173,114, 3,162, + 117,162,153,162,183, 97, 3,162,125,162,135,162,142,226,229,238, + 231,225,236,105,128, 9,220,228,229,246, 97,128, 9, 49,231,245, + 242,237,245,235,232,105,128, 10, 92,229,104, 2,162,160,162,169, + 225,242,225,226,233, 99,128, 6,145,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,141,246,239,227,225,236,233, 99, 4,162, + 199,162,209,162,216,162,227,226,229,238,231,225,236,105,128, 9, + 224,228,229,246, 97,128, 9, 96,231,245,234,225,242,225,244,105, + 128, 10,224,246,239,247,229,236,243,233,231,110, 3,162,243,162, + 253,163, 4,226,229,238,231,225,236,105,128, 9,196,228,229,246, + 97,128, 9, 68,231,245,234,225,242,225,244,105,128, 10,196,243, + 245,240,229,242,233,239,114,128,246,241,116, 2,163, 32,163, 40, + 226,236,239,227,107,128, 37,144,245,242,238,229,100,129, 2,121, + 163, 50,243,245,240,229,242,233,239,114,128, 2,180,117, 4,163, + 71,163, 82,163,107,163,154,232,233,242,225,231,225,238, 97,128, + 48,139,235,225,244,225,235,225,238, 97,129, 48,235,163, 95,232, + 225,236,230,247,233,228,244,104,128,255,153,112, 2,163,113,163, + 148,229,101, 2,163,120,163,134,237,225,242,235,226,229,238,231, + 225,236,105,128, 9,242,243,233,231,238,226,229,238,231,225,236, + 105,128, 9,243,233,225,104,128,246,221,244,232,225,105,128, 14, + 36,246,239,227,225,236,233, 99, 4,163,177,163,187,163,194,163, + 205,226,229,238,231,225,236,105,128, 9,139,228,229,246, 97,128, + 9, 11,231,245,234,225,242,225,244,105,128, 10,139,246,239,247, + 229,236,243,233,231,110, 3,163,221,163,231,163,238,226,229,238, + 231,225,236,105,128, 9,195,228,229,246, 97,128, 9, 67,231,245, + 234,225,242,225,244,105,128, 10,195,115,147, 0,115,164, 35,166, + 5,166, 16,166,142,166,181,169,123,169,134,172, 21,174,159,174, + 205,174,232,175,167,175,234,177, 11,177, 21,177,207,178, 24,178, + 194,178,204, 97, 9,164, 55,164, 65,164, 86,164,158,164,183,164, + 194,164,219,164,251,165, 35,226,229,238,231,225,236,105,128, 9, + 184,227,245,244,101,129, 1, 91,164, 74,228,239,244,225,227,227, + 229,238,116,128, 30,101,100, 5,164, 98,164,107,164,113,164,127, + 164,143,225,242,225,226,233, 99,128, 6, 53,229,246, 97,128, 9, + 56,230,233,238,225,236,225,242,225,226,233, 99,128,254,186,233, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,254,187,237, + 229,228,233,225,236,225,242,225,226,233, 99,128,254,188,231,117, + 2,164,165,164,174,234,225,242,225,244,105,128, 10,184,242,237, + 245,235,232,105,128, 10, 56,232,233,242,225,231,225,238, 97,128, + 48, 85,235,225,244,225,235,225,238, 97,129, 48,181,164,207,232, + 225,236,230,247,233,228,244,104,128,255,123,236,236,225,236,236, + 225,232,239,245,225,236,225,249,232,229,247,225,243,225,236,236, + 225,237,225,242,225,226,233, 99,128,253,250,237,229,235,104,130, + 5,225,165, 6,165, 26,228,225,231,229,243,104,129,251, 65,165, + 17,232,229,226,242,229,119,128,251, 65,232,229,226,242,229,119, + 128, 5,225,242, 97, 5,165, 48,165,122,165,130,165,180,165,188, + 97, 5,165, 60,165, 68,165, 76,165,107,165,115,225,244,232,225, + 105,128, 14, 50,229,244,232,225,105,128, 14, 65,233,237,225,233, + 109, 2,165, 86,165, 97,225,236,225,233,244,232,225,105,128, 14, + 68,245,225,238,244,232,225,105,128, 14, 67,237,244,232,225,105, + 128, 14, 51,244,232,225,105,128, 14, 48,229,244,232,225,105,128, + 14, 64,105, 3,165,138,165,162,165,173,105, 2,165,144,165,155, + 236,229,230,244,244,232,225,105,128,248,134,244,232,225,105,128, + 14, 53,236,229,230,244,244,232,225,105,128,248,133,244,232,225, + 105,128, 14, 52,239,244,232,225,105,128, 14, 66,117, 3,165,196, + 165,246,165,253,101, 3,165,204,165,228,165,239,101, 2,165,210, + 165,221,236,229,230,244,244,232,225,105,128,248,136,244,232,225, + 105,128, 14, 55,236,229,230,244,244,232,225,105,128,248,135,244, + 232,225,105,128, 14, 54,244,232,225,105,128, 14, 56,245,244,232, + 225,105,128, 14, 57,226,239,240,239,237,239,230,111,128, 49, 25, + 99, 5,166, 28,166, 49,166, 58,166,107,166,129,225,242,239,110, + 129, 1, 97,166, 37,228,239,244,225,227,227,229,238,116,128, 30, + 103,229,228,233,236,236, 97,128, 1, 95,232,247, 97,131, 2, 89, + 166, 70,166, 81,166,100,227,249,242,233,236,236,233, 99,128, 4, + 217,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,219,232,239,239,107,128, 2, 90,233,242, 99, 2,166, + 115,166,120,236,101,128, 36,226,245,237,230,236,229,120,128, 1, + 93,239,237,237,225,225,227,227,229,238,116,128, 2, 25,228,239, + 116, 2,166,150,166,159,225,227,227,229,238,116,128, 30, 97,226, + 229,236,239,119,129, 30, 99,166,169,228,239,244,225,227,227,229, + 238,116,128, 30,105,101, 9,166,201,166,217,166,252,167, 61,167, + 164,167,191,167,216,168, 41,168, 68,225,231,245,236,236,226,229, + 236,239,247,227,237, 98,128, 3, 60, 99, 2,166,223,166,245,239, + 238,100,129, 32, 51,166,231,244,239,238,229,227,232,233,238,229, + 243,101,128, 2,202,244,233,239,110,128, 0,167,229,110, 4,167, + 7,167, 16,167, 30,167, 46,225,242,225,226,233, 99,128, 6, 51, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,178,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,179,237,229, + 228,233,225,236,225,242,225,226,233, 99,128,254,180,231,239,108, + 135, 5,182,167, 81,167, 95,167,100,167,109,167,124,167,140,167, + 151, 49, 2,167, 87,167, 91, 51,128, 5,182,102,128, 5,182,178, + 99,128, 5,182,232,229,226,242,229,119,128, 5,182,238,225,242, + 242,239,247,232,229,226,242,229,119,128, 5,182,241,245,225,242, + 244,229,242,232,229,226,242,229,119,128, 5,182,244,225,232,229, + 226,242,229,119,128, 5,146,247,233,228,229,232,229,226,242,229, + 119,128, 5,182,104, 2,167,170,167,181,225,242,237,229,238,233, + 225,110,128, 5,125,233,242,225,231,225,238, 97,128, 48, 91,235, + 225,244,225,235,225,238, 97,129, 48,187,167,204,232,225,236,230, + 247,233,228,244,104,128,255,126,237,105, 2,167,223,168, 10,227, + 239,236,239,110,131, 0, 59,167,237,167,246,168, 2,225,242,225, + 226,233, 99,128, 6, 27,237,239,238,239,243,240,225,227,101,128, + 255, 27,243,237,225,236,108,128,254, 84,246,239,233,227,229,228, + 237,225,242,235,235,225,238, 97,129, 48,156,168, 29,232,225,236, + 230,247,233,228,244,104,128,255,159,238,116, 2,168, 48,168, 58, + 233,243,241,245,225,242,101,128, 51, 34,239,243,241,245,225,242, + 101,128, 51, 35,246,229,110,142, 0, 55,168,102,168,111,168,121, + 168,151,168,158,168,168,168,193,168,220,168,254,169, 10,169, 21, + 169, 54,169, 62,169, 73,225,242,225,226,233, 99,128, 6,103,226, + 229,238,231,225,236,105,128, 9,237,227,233,242,227,236,101,129, + 36,102,168,132,233,238,246,229,242,243,229,243,225,238,243,243, + 229,242,233,102,128, 39,144,228,229,246, 97,128, 9,109,229,233, + 231,232,244,232,115,128, 33, 94,231,117, 2,168,175,168,184,234, + 225,242,225,244,105,128, 10,237,242,237,245,235,232,105,128, 10, + 109,232, 97, 2,168,200,168,211,227,235,225,242,225,226,233, 99, + 128, 6,103,238,231,250,232,239,117,128, 48, 39,105, 2,168,226, + 168,244,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 38,238,230,229,242,233,239,114,128, 32,135,237,239, + 238,239,243,240,225,227,101,128,255, 23,239,236,228,243,244,249, + 236,101,128,247, 55,112, 2,169, 27,169, 34,225,242,229,110,128, + 36,122,229,114, 2,169, 41,169, 47,233,239,100,128, 36,142,243, + 233,225,110,128, 6,247,242,239,237,225,110,128, 33,118,243,245, + 240,229,242,233,239,114,128, 32,119,116, 2,169, 79,169,117,229, + 229,110, 2,169, 87,169, 96,227,233,242,227,236,101,128, 36,112, + 112, 2,169,102,169,109,225,242,229,110,128, 36,132,229,242,233, + 239,100,128, 36,152,232,225,105,128, 14, 87,230,244,232,249,240, + 232,229,110,128, 0,173,104, 7,169,150,170,124,170,135,170,149, + 171, 94,171,107,172, 15, 97, 6,169,164,169,175,169,185,169,196, + 170, 83,170,108,225,242,237,229,238,233,225,110,128, 5,119,226, + 229,238,231,225,236,105,128, 9,182,227,249,242,233,236,236,233, + 99,128, 4, 72,100, 2,169,202,170, 42,228, 97, 4,169,213,169, + 222,169,253,170, 11,225,242,225,226,233, 99,128, 6, 81,228,225, + 237,237, 97, 2,169,232,169,241,225,242,225,226,233, 99,128,252, + 97,244,225,238,225,242,225,226,233, 99,128,252, 94,230,225,244, + 232,225,225,242,225,226,233, 99,128,252, 96,235,225,243,242, 97, + 2,170, 21,170, 30,225,242,225,226,233, 99,128,252, 98,244,225, + 238,225,242,225,226,233, 99,128,252, 95,101,132, 37,146,170, 54, + 170, 61,170, 69,170, 78,228,225,242,107,128, 37,147,236,233,231, + 232,116,128, 37,145,237,229,228,233,245,109,128, 37,146,246, 97, + 128, 9, 54,231,117, 2,170, 90,170, 99,234,225,242,225,244,105, + 128, 10,182,242,237,245,235,232,105,128, 10, 54,236,243,232,229, + 236,229,244,232,229,226,242,229,119,128, 5,147,226,239,240,239, + 237,239,230,111,128, 49, 21,227,232,225,227,249,242,233,236,236, + 233, 99,128, 4, 73,101, 4,170,159,170,224,170,234,170,251,229, + 110, 4,170,170,170,179,170,193,170,209,225,242,225,226,233, 99, + 128, 6, 52,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 182,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,254, + 183,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,184, + 233,227,239,240,244,233, 99,128, 3,227,241,229,108,129, 32,170, + 170,242,232,229,226,242,229,119,128, 32,170,246, 97,134, 5,176, + 171, 12,171, 27,171, 41,171, 50,171, 65,171, 81, 49, 2,171, 18, + 171, 23,177, 53,128, 5,176, 53,128, 5,176, 50, 2,171, 33,171, + 37, 50,128, 5,176,101,128, 5,176,232,229,226,242,229,119,128, + 5,176,238,225,242,242,239,247,232,229,226,242,229,119,128, 5, + 176,241,245,225,242,244,229,242,232,229,226,242,229,119,128, 5, + 176,247,233,228,229,232,229,226,242,229,119,128, 5,176,232,225, + 227,249,242,233,236,236,233, 99,128, 4,187,105, 2,171,113,171, + 124,237,225,227,239,240,244,233, 99,128, 3,237,110,131, 5,233, + 171,134,171,217,171,226,100, 2,171,140,171,206,225,231,229,243, + 104,130,251, 73,171,152,171,161,232,229,226,242,229,119,128,251, + 73,115, 2,171,167,171,187,232,233,238,228,239,116,129,251, 44, + 171,178,232,229,226,242,229,119,128,251, 44,233,238,228,239,116, + 129,251, 45,171,197,232,229,226,242,229,119,128,251, 45,239,244, + 232,229,226,242,229,119,128, 5,193,232,229,226,242,229,119,128, + 5,233,115, 2,171,232,171,252,232,233,238,228,239,116,129,251, + 42,171,243,232,229,226,242,229,119,128,251, 42,233,238,228,239, + 116,129,251, 43,172, 6,232,229,226,242,229,119,128,251, 43,239, + 239,107,128, 2,130,105, 8,172, 39,172, 83,172, 94,172,119,172, + 149,172,157,172,170,173, 85,231,237, 97,131, 3,195,172, 51,172, + 55,172, 63, 49,128, 3,194,230,233,238,225,108,128, 3,194,236, + 245,238,225,244,229,243,249,237,226,239,236,231,242,229,229,107, + 128, 3,242,232,233,242,225,231,225,238, 97,128, 48, 87,235,225, + 244,225,235,225,238, 97,129, 48,183,172,107,232,225,236,230,247, + 233,228,244,104,128,255,124,236,245,113, 2,172,127,172,136,232, + 229,226,242,229,119,128, 5,189,236,229,230,244,232,229,226,242, + 229,119,128, 5,189,237,233,236,225,114,128, 34, 60,238,228,239, + 244,232,229,226,242,229,119,128, 5,194,239,115, 6,172,185,172, + 220,172,252,173, 24,173, 38,173, 70, 97, 2,172,191,172,206,227, + 233,242,227,236,229,235,239,242,229,225,110,128, 50,116,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 20,227,105, 2,172, + 227,172,239,229,245,227,235,239,242,229,225,110,128, 49,126,242, + 227,236,229,235,239,242,229,225,110,128, 50,102,107, 2,173, 2, + 173, 16,233,249,229,239,235,235,239,242,229,225,110,128, 49,122, + 239,242,229,225,110,128, 49, 69,238,233,229,245,238,235,239,242, + 229,225,110,128, 49,123,112, 2,173, 44,173, 57,225,242,229,238, + 235,239,242,229,225,110,128, 50, 6,233,229,245,240,235,239,242, + 229,225,110,128, 49,125,244,233,235,229,245,244,235,239,242,229, + 225,110,128, 49,124,120,141, 0, 54,173,115,173,124,173,134,173, + 164,173,171,173,196,173,223,174, 1,174, 13,174, 24,174, 57,174, + 65,174, 76,225,242,225,226,233, 99,128, 6,102,226,229,238,231, + 225,236,105,128, 9,236,227,233,242,227,236,101,129, 36,101,173, + 145,233,238,246,229,242,243,229,243,225,238,243,243,229,242,233, + 102,128, 39,143,228,229,246, 97,128, 9,108,231,117, 2,173,178, + 173,187,234,225,242,225,244,105,128, 10,236,242,237,245,235,232, + 105,128, 10,108,232, 97, 2,173,203,173,214,227,235,225,242,225, + 226,233, 99,128, 6,102,238,231,250,232,239,117,128, 48, 38,105, + 2,173,229,173,247,228,229,239,231,242,225,240,232,233,227,240, + 225,242,229,110,128, 50, 37,238,230,229,242,233,239,114,128, 32, + 134,237,239,238,239,243,240,225,227,101,128,255, 22,239,236,228, + 243,244,249,236,101,128,247, 54,112, 2,174, 30,174, 37,225,242, + 229,110,128, 36,121,229,114, 2,174, 44,174, 50,233,239,100,128, + 36,141,243,233,225,110,128, 6,246,242,239,237,225,110,128, 33, + 117,243,245,240,229,242,233,239,114,128, 32,118,116, 2,174, 82, + 174,153,229,229,110, 2,174, 90,174,132, 99, 2,174, 96,174,104, + 233,242,227,236,101,128, 36,111,245,242,242,229,238,227,249,228, + 229,238,239,237,233,238,225,244,239,242,226,229,238,231,225,236, + 105,128, 9,249,112, 2,174,138,174,145,225,242,229,110,128, 36, + 131,229,242,233,239,100,128, 36,151,232,225,105,128, 14, 86,108, + 2,174,165,174,185,225,243,104,129, 0, 47,174,173,237,239,238, + 239,243,240,225,227,101,128,255, 15,239,238,103,129, 1,127,174, + 193,228,239,244,225,227,227,229,238,116,128, 30,155,109, 2,174, + 211,174,221,233,236,229,230,225,227,101,128, 38, 58,239,238,239, + 243,240,225,227,101,128,255, 83,111, 6,174,246,175, 40,175, 51, + 175, 76,175,121,175,132,102, 2,174,252,175, 10,240,225,243,245, + 241,232,229,226,242,229,119,128, 5,195,116, 2,175, 16,175, 25, + 232,249,240,232,229,110,128, 0,173,243,233,231,238,227,249,242, + 233,236,236,233, 99,128, 4, 76,232,233,242,225,231,225,238, 97, + 128, 48, 93,235,225,244,225,235,225,238, 97,129, 48,189,175, 64, + 232,225,236,230,247,233,228,244,104,128,255,127,236,233,228,245, + 115, 2,175, 86,175,103,236,239,238,231,239,246,229,242,236,225, + 249,227,237, 98,128, 3, 56,243,232,239,242,244,239,246,229,242, + 236,225,249,227,237, 98,128, 3, 55,242,245,243,233,244,232,225, + 105,128, 14, 41,115, 3,175,140,175,150,175,158,225,236,225,244, + 232,225,105,128, 14, 40,239,244,232,225,105,128, 14, 11,245,225, + 244,232,225,105,128, 14, 42,240, 97, 3,175,176,175,196,175,228, + 227,101,129, 0, 32,175,183,232,225,227,235,225,242,225,226,233, + 99,128, 0, 32,228,101,129, 38, 96,175,203,243,245,233,116, 2, + 175,212,175,220,226,236,225,227,107,128, 38, 96,247,232,233,244, + 101,128, 38,100,242,229,110,128, 36,174,241,245,225,242,101, 11, + 176, 6,176, 17,176, 31,176, 56,176, 73,176, 99,176,114,176,147, + 176,174,176,230,176,245,226,229,236,239,247,227,237, 98,128, 3, + 59, 99, 2,176, 23,176, 27, 99,128, 51,196,109,128, 51,157,228, + 233,225,231,239,238,225,236,227,242,239,243,243,232,225,244,227, + 232,230,233,236,108,128, 37,169,232,239,242,233,250,239,238,244, + 225,236,230,233,236,108,128, 37,164,107, 2,176, 79,176, 83,103, + 128, 51,143,109,129, 51,158,176, 89,227,225,240,233,244,225,108, + 128, 51,206,108, 2,176,105,176,109,110,128, 51,209,239,103,128, + 51,210,109, 4,176,124,176,128,176,133,176,137,103,128, 51,142, + 233,108,128, 51,213,109,128, 51,156,243,241,245,225,242,229,100, + 128, 51,161,239,242,244,232,239,231,239,238,225,236,227,242,239, + 243,243,232,225,244,227,232,230,233,236,108,128, 37,166,245,240, + 240,229,114, 2,176,184,176,207,236,229,230,244,244,239,236,239, + 247,229,242,242,233,231,232,244,230,233,236,108,128, 37,167,242, + 233,231,232,244,244,239,236,239,247,229,242,236,229,230,244,230, + 233,236,108,128, 37,168,246,229,242,244,233,227,225,236,230,233, + 236,108,128, 37,165,247,232,233,244,229,247,233,244,232,243,237, + 225,236,236,226,236,225,227,107,128, 37,163,242,243,241,245,225, + 242,101,128, 51,219,115, 2,177, 27,177,197, 97, 4,177, 37,177, + 47,177, 54,177, 65,226,229,238,231,225,236,105,128, 9,183,228, + 229,246, 97,128, 9, 55,231,245,234,225,242,225,244,105,128, 10, + 183,238,103, 8,177, 84,177, 98,177,112,177,126,177,141,177,155, + 177,169,177,182,227,233,229,245,227,235,239,242,229,225,110,128, + 49, 73,232,233,229,245,232,235,239,242,229,225,110,128, 49,133, + 233,229,245,238,231,235,239,242,229,225,110,128, 49,128,235,233, + 249,229,239,235,235,239,242,229,225,110,128, 49, 50,238,233,229, + 245,238,235,239,242,229,225,110,128, 49,101,240,233,229,245,240, + 235,239,242,229,225,110,128, 49, 67,243,233,239,243,235,239,242, + 229,225,110,128, 49, 70,244,233,235,229,245,244,235,239,242,229, + 225,110,128, 49, 56,245,240,229,242,233,239,114,128,246,242,116, + 2,177,213,177,236,229,242,236,233,238,103,129, 0,163,177,224, + 237,239,238,239,243,240,225,227,101,128,255,225,242,239,235,101, + 2,177,245,178, 6,236,239,238,231,239,246,229,242,236,225,249, + 227,237, 98,128, 3, 54,243,232,239,242,244,239,246,229,242,236, + 225,249,227,237, 98,128, 3, 53,117, 7,178, 40,178, 72,178, 94, + 178,105,178,146,178,156,178,160,226,243,229,116,130, 34,130,178, + 51,178, 62,238,239,244,229,241,245,225,108,128, 34,138,239,242, + 229,241,245,225,108,128, 34,134, 99, 2,178, 78,178, 86,227,229, + 229,228,115,128, 34,123,232,244,232,225,116,128, 34, 11,232,233, + 242,225,231,225,238, 97,128, 48, 89,107, 2,178,111,178,135,225, + 244,225,235,225,238, 97,129, 48,185,178,123,232,225,236,230,247, + 233,228,244,104,128,255,125,245,238,225,242,225,226,233, 99,128, + 6, 82,237,237,225,244,233,239,110,128, 34, 17,110,128, 38, 60, + 240,229,242,243,229,116,130, 34,131,178,173,178,184,238,239,244, + 229,241,245,225,108,128, 34,139,239,242,229,241,245,225,108,128, + 34,135,246,243,241,245,225,242,101,128, 51,220,249,239,245,247, + 225,229,242,225,243,241,245,225,242,101,128, 51,124,116,144, 0, + 116,179, 1,180, 10,180, 31,180,174,180,214,183, 6,186,144,187, + 219,187,231,187,243,189, 20,189, 45,189,131,190, 55,190,239,191, + 73, 97, 10,179, 23,179, 33,179, 54,179, 61,179, 86,179,164,179, + 181,179,206,179,220,179,224,226,229,238,231,225,236,105,128, 9, + 164,227,107, 2,179, 40,179, 47,228,239,247,110,128, 34,164,236, + 229,230,116,128, 34,163,228,229,246, 97,128, 9, 36,231,117, 2, + 179, 68,179, 77,234,225,242,225,244,105,128, 10,164,242,237,245, + 235,232,105,128, 10, 36,104, 4,179, 96,179,105,179,119,179,149, + 225,242,225,226,233, 99,128, 6, 55,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,194,105, 2,179,125,179,140,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,254,195,242,225,231,225, + 238, 97,128, 48, 95,237,229,228,233,225,236,225,242,225,226,233, + 99,128,254,196,233,243,249,239,245,229,242,225,243,241,245,225, + 242,101,128, 51,125,235,225,244,225,235,225,238, 97,129, 48,191, + 179,194,232,225,236,230,247,233,228,244,104,128,255,128,244,247, + 229,229,236,225,242,225,226,233, 99,128, 6, 64,117,128, 3,196, + 118,130, 5,234,179,232,180, 1,228,225,231,229,115,129,251, 74, + 179,242,104,129,251, 74,179,248,232,229,226,242,229,119,128,251, + 74,232,229,226,242,229,119,128, 5,234, 98, 2,180, 16,180, 21, + 225,114,128, 1,103,239,240,239,237,239,230,111,128, 49, 10, 99, + 6,180, 45,180, 52,180, 59,180, 68,180,134,180,161,225,242,239, + 110,128, 1,101,227,245,242,108,128, 2,168,229,228,233,236,236, + 97,128, 1, 99,232,229,104, 4,180, 80,180, 89,180,103,180,119, + 225,242,225,226,233, 99,128, 6,134,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,123,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,251,124,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,251,125,233,242, 99, 2,180,142,180,147,236,101, + 128, 36,227,245,237,230,236,229,248,226,229,236,239,119,128, 30, + 113,239,237,237,225,225,227,227,229,238,116,128, 1, 99,100, 2, + 180,180,180,190,233,229,242,229,243,233,115,128, 30,151,239,116, + 2,180,197,180,206,225,227,227,229,238,116,128, 30,107,226,229, + 236,239,119,128, 30,109,101, 9,180,234,180,245,181, 9,182, 19, + 182, 44,182,108,182,175,182,180,182,232,227,249,242,233,236,236, + 233, 99,128, 4, 66,228,229,243,227,229,238,228,229,242,227,249, + 242,233,236,236,233, 99,128, 4,173,104, 7,181, 25,181, 34,181, + 48,181, 88,181,118,181,159,182, 1,225,242,225,226,233, 99,128, + 6, 42,230,233,238,225,236,225,242,225,226,233, 99,128,254,150, + 232,225,232,105, 2,181, 57,181, 72,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,162,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,252, 12,105, 2,181, 94,181,109,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,151,242,225,231, + 225,238, 97,128, 48,102,234,229,229,237,105, 2,181,128,181,143, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,161,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 11,109, + 2,181,165,181,199,225,242,226,245,244, 97, 2,181,176,181,185, + 225,242,225,226,233, 99,128, 6, 41,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,148,101, 2,181,205,181,218,228,233,225, + 236,225,242,225,226,233, 99,128,254,152,229,237,105, 2,181,226, + 181,241,238,233,244,233,225,236,225,242,225,226,233, 99,128,252, + 164,243,239,236,225,244,229,228,225,242,225,226,233, 99,128,252, + 14,238,239,239,238,230,233,238,225,236,225,242,225,226,233, 99, + 128,252,115,235,225,244,225,235,225,238, 97,129, 48,198,182, 32, + 232,225,236,230,247,233,228,244,104,128,255,131,108, 2,182, 50, + 182, 69,229,240,232,239,238,101,129, 33, 33,182, 61,226,236,225, + 227,107,128, 38, 14,233,243,232, 97, 2,182, 78,182, 93,231,229, + 228,239,236,225,232,229,226,242,229,119,128, 5,160,241,229,244, + 225,238,225,232,229,226,242,229,119,128, 5,169,110, 4,182,118, + 182,127,182,146,182,167,227,233,242,227,236,101,128, 36,105,233, + 228,229,239,231,242,225,240,232,233,227,240,225,242,229,110,128, + 50, 41,112, 2,182,152,182,159,225,242,229,110,128, 36,125,229, + 242,233,239,100,128, 36,145,242,239,237,225,110,128, 33,121,243, + 104,128, 2,167,116,131, 5,216,182,190,182,210,182,219,228,225, + 231,229,243,104,129,251, 56,182,201,232,229,226,242,229,119,128, + 251, 56,232,229,226,242,229,119,128, 5,216,243,229,227,249,242, + 233,236,236,233, 99,128, 4,181,246,233,114, 2,182,240,182,249, + 232,229,226,242,229,119,128, 5,155,236,229,230,244,232,229,226, + 242,229,119,128, 5,155,104, 6,183, 20,183,172,184, 38,184,170, + 185, 77,186,134, 97, 5,183, 32,183, 42,183, 49,183, 74,183,103, + 226,229,238,231,225,236,105,128, 9,165,228,229,246, 97,128, 9, + 37,231,117, 2,183, 56,183, 65,234,225,242,225,244,105,128, 10, + 165,242,237,245,235,232,105,128, 10, 37,108, 2,183, 80,183, 89, + 225,242,225,226,233, 99,128, 6, 48,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,172,238,244,232,225,235,232,225,116, 3, + 183,118,183,149,183,156,236,239,119, 2,183,126,183,137,236,229, + 230,244,244,232,225,105,128,248,152,242,233,231,232,244,244,232, + 225,105,128,248,151,244,232,225,105,128, 14, 76,245,240,240,229, + 242,236,229,230,244,244,232,225,105,128,248,150,101, 3,183,180, + 183,244,184, 11,104, 4,183,190,183,199,183,213,183,229,225,242, + 225,226,233, 99,128, 6, 43,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,154,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,254,155,237,229,228,233,225,236,225,242,225,226,233, + 99,128,254,156,242,101, 2,183,251,184, 4,229,248,233,243,244, + 115,128, 34, 3,230,239,242,101,128, 34, 52,244, 97,130, 3,184, + 184, 20,184, 24, 49,128, 3,209,243,249,237,226,239,236,231,242, + 229,229,107,128, 3,209,105, 2,184, 44,184,130,229,245,244,104, + 4,184, 57,184, 92,184,107,184,116, 97, 2,184, 63,184, 78,227, + 233,242,227,236,229,235,239,242,229,225,110,128, 50,121,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 25,227,233,242,227, + 236,229,235,239,242,229,225,110,128, 50,107,235,239,242,229,225, + 110,128, 49, 76,240,225,242,229,238,235,239,242,229,225,110,128, + 50, 11,242,244,229,229,110, 2,184,140,184,149,227,233,242,227, + 236,101,128, 36,108,112, 2,184,155,184,162,225,242,229,110,128, + 36,128,229,242,233,239,100,128, 36,148,111, 6,184,184,184,201, + 184,206,184,220,184,225,185, 22,238,225,238,231,237,239,238,244, + 232,239,244,232,225,105,128, 14, 17,239,107,128, 1,173,240,232, + 245,244,232,225,239,244,232,225,105,128, 14, 18,242,110,128, 0, + 254,244,104, 3,184,234,185, 2,185, 12, 97, 2,184,240,184,250, + 232,225,238,244,232,225,105,128, 14, 23,238,244,232,225,105,128, + 14, 16,239,238,231,244,232,225,105,128, 14, 24,245,238,231,244, + 232,225,105,128, 14, 22,245,243,225,238,100, 2,185, 32,185, 43, + 227,249,242,233,236,236,233, 99,128, 4,130,243,243,229,240,225, + 242,225,244,239,114, 2,185, 58,185, 67,225,242,225,226,233, 99, + 128, 6,108,240,229,242,243,233,225,110,128, 6,108,242,229,101, + 144, 0, 51,185,115,185,124,185,134,185,164,185,171,185,181,185, + 206,185,233,186, 11,186, 23,186, 42,186, 53,186, 86,186,108,186, + 116,186,127,225,242,225,226,233, 99,128, 6, 99,226,229,238,231, + 225,236,105,128, 9,233,227,233,242,227,236,101,129, 36, 98,185, + 145,233,238,246,229,242,243,229,243,225,238,243,243,229,242,233, + 102,128, 39,140,228,229,246, 97,128, 9,105,229,233,231,232,244, + 232,115,128, 33, 92,231,117, 2,185,188,185,197,234,225,242,225, + 244,105,128, 10,233,242,237,245,235,232,105,128, 10,105,232, 97, + 2,185,213,185,224,227,235,225,242,225,226,233, 99,128, 6, 99, + 238,231,250,232,239,117,128, 48, 35,105, 2,185,239,186, 1,228, + 229,239,231,242,225,240,232,233,227,240,225,242,229,110,128, 50, + 34,238,230,229,242,233,239,114,128, 32,131,237,239,238,239,243, + 240,225,227,101,128,255, 19,238,245,237,229,242,225,244,239,242, + 226,229,238,231,225,236,105,128, 9,246,239,236,228,243,244,249, + 236,101,128,247, 51,112, 2,186, 59,186, 66,225,242,229,110,128, + 36,118,229,114, 2,186, 73,186, 79,233,239,100,128, 36,138,243, + 233,225,110,128, 6,243,241,245,225,242,244,229,242,115,129, 0, + 190,186, 99,229,237,228,225,243,104,128,246,222,242,239,237,225, + 110,128, 33,114,243,245,240,229,242,233,239,114,128, 0,179,244, + 232,225,105,128, 14, 83,250,243,241,245,225,242,101,128, 51,148, + 105, 7,186,160,186,171,187, 30,187,128,187,140,187,189,187,206, + 232,233,242,225,231,225,238, 97,128, 48, 97,107, 2,186,177,186, + 201,225,244,225,235,225,238, 97,129, 48,193,186,189,232,225,236, + 230,247,233,228,244,104,128,255,129,229,245,116, 4,186,213,186, + 248,187, 7,187, 16, 97, 2,186,219,186,234,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,112,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 16,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50, 98,235,239,242,229,225,110,128, 49, 55, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 2,236,228, + 101,133, 2,220,187, 46,187, 57,187, 74,187, 86,187,114,226,229, + 236,239,247,227,237, 98,128, 3, 48, 99, 2,187, 63,187, 68,237, + 98,128, 3, 3,239,237, 98,128, 3, 3,228,239,245,226,236,229, + 227,237, 98,128, 3, 96,111, 2,187, 92,187,102,240,229,242,225, + 244,239,114,128, 34, 60,246,229,242,236,225,249,227,237, 98,128, + 3, 52,246,229,242,244,233,227,225,236,227,237, 98,128, 3, 62, + 237,229,243,227,233,242,227,236,101,128, 34,151,112, 2,187,146, + 187,176,229,232, 97, 2,187,154,187,163,232,229,226,242,229,119, + 128, 5,150,236,229,230,244,232,229,226,242,229,119,128, 5,150, + 240,233,231,245,242,237,245,235,232,105,128, 10,112,244,236,239, + 227,249,242,233,236,236,233,227,227,237, 98,128, 4,131,247,238, + 225,242,237,229,238,233,225,110,128, 5,127,236,233,238,229,226, + 229,236,239,119,128, 30,111,237,239,238,239,243,240,225,227,101, + 128,255, 84,111, 7,188, 3,188, 14,188, 25,188, 50,188,170,188, + 182,189, 10,225,242,237,229,238,233,225,110,128, 5,105,232,233, + 242,225,231,225,238, 97,128, 48,104,235,225,244,225,235,225,238, + 97,129, 48,200,188, 38,232,225,236,230,247,233,228,244,104,128, + 255,132,110, 3,188, 58,188,156,188,161,101, 4,188, 68,188,137, + 188,144,188,150,226,225,114, 4,188, 80,188,109,188,119,188,128, + 229,248,244,242, 97, 2,188, 90,188,100,232,233,231,232,237,239, + 100,128, 2,229,236,239,247,237,239,100,128, 2,233,232,233,231, + 232,237,239,100,128, 2,230,236,239,247,237,239,100,128, 2,232, + 237,233,228,237,239,100,128, 2,231,230,233,246,101,128, 1,189, + 243,233,120,128, 1,133,244,247,111,128, 1,168,239,115,128, 3, + 132,243,241,245,225,242,101,128, 51, 39,240,225,244,225,235,244, + 232,225,105,128, 14, 15,242,244,239,233,243,229,243,232,229,236, + 236,226,242,225,227,235,229,116, 2,188,205,188,235,236,229,230, + 116,130, 48, 20,188,216,188,224,243,237,225,236,108,128,254, 93, + 246,229,242,244,233,227,225,108,128,254, 57,242,233,231,232,116, + 130, 48, 21,188,247,188,255,243,237,225,236,108,128,254, 94,246, + 229,242,244,233,227,225,108,128,254, 58,244,225,239,244,232,225, + 105,128, 14, 21,240, 97, 2,189, 27,189, 39,236,225,244,225,236, + 232,239,239,107,128, 1,171,242,229,110,128, 36,175,114, 3,189, + 53,189, 84,189, 99,225,228,229,237,225,242,107,129, 33, 34,189, + 65,115, 2,189, 71,189, 77,225,238,115,128,248,234,229,242,233, + 102,128,246,219,229,244,242,239,230,236,229,248,232,239,239,107, + 128, 2,136,233,225,103, 4,189,111,189,116,189,121,189,126,228, + 110,128, 37,188,236,102,128, 37,196,242,116,128, 37,186,245,112, + 128, 37,178,115,132, 2,166,189,143,189,182,190, 32,190, 45,225, + 228,105,130, 5,230,189,153,189,173,228,225,231,229,243,104,129, + 251, 70,189,164,232,229,226,242,229,119,128,251, 70,232,229,226, + 242,229,119,128, 5,230,101, 2,189,188,189,199,227,249,242,233, + 236,236,233, 99,128, 4, 70,242,101,134, 5,181,189,216,189,230, + 189,235,189,244,190, 3,190, 19, 49, 2,189,222,189,226, 50,128, + 5,181,101,128, 5,181,178, 98,128, 5,181,232,229,226,242,229, + 119,128, 5,181,238,225,242,242,239,247,232,229,226,242,229,119, + 128, 5,181,241,245,225,242,244,229,242,232,229,226,242,229,119, + 128, 5,181,247,233,228,229,232,229,226,242,229,119,128, 5,181, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 91,245,240,229, + 242,233,239,114,128,246,243,116, 4,190, 65,190,115,190,180,190, + 231, 97, 3,190, 73,190, 83,190, 90,226,229,238,231,225,236,105, + 128, 9,159,228,229,246, 97,128, 9, 31,231,117, 2,190, 97,190, + 106,234,225,242,225,244,105,128, 10,159,242,237,245,235,232,105, + 128, 10, 31,229,104, 4,190,126,190,135,190,149,190,165,225,242, + 225,226,233, 99,128, 6,121,230,233,238,225,236,225,242,225,226, + 233, 99,128,251,103,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,251,104,237,229,228,233,225,236,225,242,225,226,233, + 99,128,251,105,232, 97, 3,190,189,190,199,190,206,226,229,238, + 231,225,236,105,128, 9,160,228,229,246, 97,128, 9, 32,231,117, + 2,190,213,190,222,234,225,242,225,244,105,128, 10,160,242,237, + 245,235,232,105,128, 10, 32,245,242,238,229,100,128, 2,135,117, + 3,190,247,191, 2,191, 27,232,233,242,225,231,225,238, 97,128, + 48,100,235,225,244,225,235,225,238, 97,129, 48,196,191, 15,232, + 225,236,230,247,233,228,244,104,128,255,130,243,237,225,236,108, + 2,191, 37,191, 48,232,233,242,225,231,225,238, 97,128, 48, 99, + 235,225,244,225,235,225,238, 97,129, 48,195,191, 61,232,225,236, + 230,247,233,228,244,104,128,255,111,119, 2,191, 79,191,184,101, + 2,191, 85,191,133,236,246,101, 3,191, 95,191,104,191,125,227, + 233,242,227,236,101,128, 36,107,112, 2,191,110,191,117,225,242, + 229,110,128, 36,127,229,242,233,239,100,128, 36,147,242,239,237, + 225,110,128, 33,123,238,244,121, 3,191,143,191,152,191,163,227, + 233,242,227,236,101,128, 36,115,232,225,238,231,250,232,239,117, + 128, 83, 68,112, 2,191,169,191,176,225,242,229,110,128, 36,135, + 229,242,233,239,100,128, 36,155,111,142, 0, 50,191,216,191,225, + 191,235,192, 9,192, 61,192, 86,192,113,192,147,192,159,192,178, + 192,189,192,222,192,230,192,254,225,242,225,226,233, 99,128, 6, + 98,226,229,238,231,225,236,105,128, 9,232,227,233,242,227,236, + 101,129, 36, 97,191,246,233,238,246,229,242,243,229,243,225,238, + 243,243,229,242,233,102,128, 39,139,100, 2,192, 15,192, 21,229, + 246, 97,128, 9,104,239,116, 2,192, 28,192, 39,229,238,236,229, + 225,228,229,114,128, 32, 37,236,229,225,228,229,114,129, 32, 37, + 192, 50,246,229,242,244,233,227,225,108,128,254, 48,231,117, 2, + 192, 68,192, 77,234,225,242,225,244,105,128, 10,232,242,237,245, + 235,232,105,128, 10,104,232, 97, 2,192, 93,192,104,227,235,225, + 242,225,226,233, 99,128, 6, 98,238,231,250,232,239,117,128, 48, + 34,105, 2,192,119,192,137,228,229,239,231,242,225,240,232,233, + 227,240,225,242,229,110,128, 50, 33,238,230,229,242,233,239,114, + 128, 32,130,237,239,238,239,243,240,225,227,101,128,255, 18,238, + 245,237,229,242,225,244,239,242,226,229,238,231,225,236,105,128, + 9,245,239,236,228,243,244,249,236,101,128,247, 50,112, 2,192, + 195,192,202,225,242,229,110,128, 36,117,229,114, 2,192,209,192, + 215,233,239,100,128, 36,137,243,233,225,110,128, 6,242,242,239, + 237,225,110,128, 33,113,115, 2,192,236,192,244,244,242,239,235, + 101,128, 1,187,245,240,229,242,233,239,114,128, 0,178,244,104, + 2,193, 5,193, 10,225,105,128, 14, 82,233,242,228,115,128, 33, + 84,117,145, 0,117,193, 55,193, 63,193,104,193,161,194, 43,194, + 80,194,203,194,219,195, 14,195, 84,195,165,195,174,196, 37,196, + 61,196,169,196,197,197, 55,225,227,245,244,101,128, 0,250, 98, + 4,193, 73,193, 78,193, 87,193, 97,225,114,128, 2,137,229,238, + 231,225,236,105,128, 9,137,239,240,239,237,239,230,111,128, 49, + 40,242,229,246,101,128, 1,109, 99, 3,193,112,193,119,193,151, + 225,242,239,110,128, 1,212,233,242, 99, 2,193,127,193,132,236, + 101,128, 36,228,245,237,230,236,229,120,129, 0,251,193,143,226, + 229,236,239,119,128, 30,119,249,242,233,236,236,233, 99,128, 4, + 67,100, 5,193,173,193,184,193,207,193,213,194, 33,225,244,244, + 225,228,229,246, 97,128, 9, 81,226,108, 2,193,191,193,199,225, + 227,245,244,101,128, 1,113,231,242,225,246,101,128, 2, 21,229, + 246, 97,128, 9, 9,233,229,242,229,243,233,115,133, 0,252,193, + 233,193,241,193,249,194, 16,194, 24,225,227,245,244,101,128, 1, + 216,226,229,236,239,119,128, 30,115, 99, 2,193,255,194, 6,225, + 242,239,110,128, 1,218,249,242,233,236,236,233, 99,128, 4,241, + 231,242,225,246,101,128, 1,220,237,225,227,242,239,110,128, 1, + 214,239,244,226,229,236,239,119,128, 30,229,103, 2,194, 49,194, + 56,242,225,246,101,128, 0,249,117, 2,194, 62,194, 71,234,225, + 242,225,244,105,128, 10,137,242,237,245,235,232,105,128, 10, 9, + 104, 3,194, 88,194, 98,194,176,233,242,225,231,225,238, 97,128, + 48, 70,111, 2,194,104,194,114,239,235,225,226,239,246,101,128, + 30,231,242,110,133, 1,176,194,129,194,137,194,148,194,156,194, + 168,225,227,245,244,101,128, 30,233,228,239,244,226,229,236,239, + 119,128, 30,241,231,242,225,246,101,128, 30,235,232,239,239,235, + 225,226,239,246,101,128, 30,237,244,233,236,228,101,128, 30,239, + 245,238,231,225,242,245,237,236,225,245,116,129, 1,113,194,192, + 227,249,242,233,236,236,233, 99,128, 4,243,233,238,246,229,242, + 244,229,228,226,242,229,246,101,128, 2, 23,107, 3,194,227,194, + 251,195, 6,225,244,225,235,225,238, 97,129, 48,166,194,239,232, + 225,236,230,247,233,228,244,104,128,255,115,227,249,242,233,236, + 236,233, 99,128, 4,121,239,242,229,225,110,128, 49, 92,109, 2, + 195, 20,195, 73, 97, 2,195, 26,195, 59,227,242,239,110,130, 1, + 107,195, 37,195, 48,227,249,242,233,236,236,233, 99,128, 4,239, + 228,233,229,242,229,243,233,115,128, 30,123,244,242,225,231,245, + 242,237,245,235,232,105,128, 10, 65,239,238,239,243,240,225,227, + 101,128,255, 85,110, 2,195, 90,195,145,228,229,242,243,227,239, + 242,101,132, 0, 95,195,109,195,115,195,127,195,138,228,226,108, + 128, 32, 23,237,239,238,239,243,240,225,227,101,128,255, 63,246, + 229,242,244,233,227,225,108,128,254, 51,247,225,246,121,128,254, + 79,105, 2,195,151,195,156,239,110,128, 34, 42,246,229,242,243, + 225,108,128, 34, 0,239,231,239,238,229,107,128, 1,115,112, 5, + 195,186,195,193,195,201,195,216,196, 11,225,242,229,110,128, 36, + 176,226,236,239,227,107,128, 37,128,240,229,242,228,239,244,232, + 229,226,242,229,119,128, 5,196,243,233,236,239,110,131, 3,197, + 195,230,195,251,196, 3,228,233,229,242,229,243,233,115,129, 3, + 203,195,243,244,239,238,239,115,128, 3,176,236,225,244,233,110, + 128, 2,138,244,239,238,239,115,128, 3,205,244,225,227,107, 2, + 196, 20,196, 31,226,229,236,239,247,227,237, 98,128, 3, 29,237, + 239,100,128, 2,212,114, 2,196, 43,196, 55,225,231,245,242,237, + 245,235,232,105,128, 10,115,233,238,103,128, 1,111,115, 3,196, + 69,196, 84,196,129,232,239,242,244,227,249,242,233,236,236,233, + 99,128, 4, 94,237,225,236,108, 2,196, 93,196,104,232,233,242, + 225,231,225,238, 97,128, 48, 69,235,225,244,225,235,225,238, 97, + 129, 48,165,196,117,232,225,236,230,247,233,228,244,104,128,255, + 105,244,242,225,233,231,232,116, 2,196,141,196,152,227,249,242, + 233,236,236,233, 99,128, 4,175,243,244,242,239,235,229,227,249, + 242,233,236,236,233, 99,128, 4,177,244,233,236,228,101,130, 1, + 105,196,181,196,189,225,227,245,244,101,128, 30,121,226,229,236, + 239,119,128, 30,117,117, 5,196,209,196,219,196,226,196,251,197, + 11,226,229,238,231,225,236,105,128, 9,138,228,229,246, 97,128, + 9, 10,231,117, 2,196,233,196,242,234,225,242,225,244,105,128, + 10,138,242,237,245,235,232,105,128, 10, 10,237,225,244,242,225, + 231,245,242,237,245,235,232,105,128, 10, 66,246,239,247,229,236, + 243,233,231,110, 3,197, 27,197, 37,197, 44,226,229,238,231,225, + 236,105,128, 9,194,228,229,246, 97,128, 9, 66,231,245,234,225, + 242,225,244,105,128, 10,194,246,239,247,229,236,243,233,231,110, + 3,197, 71,197, 81,197, 88,226,229,238,231,225,236,105,128, 9, + 193,228,229,246, 97,128, 9, 65,231,245,234,225,242,225,244,105, + 128, 10,193,118,139, 0,118,197,125,198, 17,198, 26,198, 37,198, + 222,198,229,199, 71,199, 83,199,183,199,191,199,212, 97, 4,197, + 135,197,142,197,167,197,178,228,229,246, 97,128, 9, 53,231,117, + 2,197,149,197,158,234,225,242,225,244,105,128, 10,181,242,237, + 245,235,232,105,128, 10, 53,235,225,244,225,235,225,238, 97,128, + 48,247,118,132, 5,213,197,190,197,217,197,249,198, 5,228,225, + 231,229,243,104,130,251, 53,197,203,197,208,182, 53,128,251, 53, + 232,229,226,242,229,119,128,251, 53,104, 2,197,223,197,231,229, + 226,242,229,119,128, 5,213,239,236,225,109,129,251, 75,197,240, + 232,229,226,242,229,119,128,251, 75,246,225,246,232,229,226,242, + 229,119,128, 5,240,249,239,228,232,229,226,242,229,119,128, 5, + 241,227,233,242,227,236,101,128, 36,229,228,239,244,226,229,236, + 239,119,128, 30,127,101, 6,198, 51,198, 62,198,126,198,137,198, + 143,198,210,227,249,242,233,236,236,233, 99,128, 4, 50,104, 4, + 198, 72,198, 81,198, 95,198,111,225,242,225,226,233, 99,128, 6, + 164,230,233,238,225,236,225,242,225,226,233, 99,128,251,107,233, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,251,108,237, + 229,228,233,225,236,225,242,225,226,233, 99,128,251,109,235,225, + 244,225,235,225,238, 97,128, 48,249,238,245,115,128, 38, 64,242, + 244,233,227,225,108, 2,198,154,198,160,226,225,114,128, 0,124, + 236,233,238,101, 4,198,173,198,184,198,195,198,204,225,226,239, + 246,229,227,237, 98,128, 3, 13,226,229,236,239,247,227,237, 98, + 128, 3, 41,236,239,247,237,239,100,128, 2,204,237,239,100,128, + 2,200,247,225,242,237,229,238,233,225,110,128, 5,126,232,239, + 239,107,128, 2,139,105, 3,198,237,198,248,199, 31,235,225,244, + 225,235,225,238, 97,128, 48,248,242,225,237, 97, 3,199, 3,199, + 13,199, 20,226,229,238,231,225,236,105,128, 9,205,228,229,246, + 97,128, 9, 77,231,245,234,225,242,225,244,105,128, 10,205,243, + 225,242,231, 97, 3,199, 43,199, 53,199, 60,226,229,238,231,225, + 236,105,128, 9,131,228,229,246, 97,128, 9, 3,231,245,234,225, + 242,225,244,105,128, 10,131,237,239,238,239,243,240,225,227,101, + 128,255, 86,111, 3,199, 91,199,102,199,172,225,242,237,229,238, + 233,225,110,128, 5,120,233,227,229,100, 2,199,111,199,147,233, + 244,229,242,225,244,233,239,110, 2,199,125,199,136,232,233,242, + 225,231,225,238, 97,128, 48,158,235,225,244,225,235,225,238, 97, + 128, 48,254,237,225,242,235,235,225,238, 97,129, 48,155,199,160, + 232,225,236,230,247,233,228,244,104,128,255,158,235,225,244,225, + 235,225,238, 97,128, 48,250,240,225,242,229,110,128, 36,177,116, + 2,199,197,199,204,233,236,228,101,128, 30,125,245,242,238,229, + 100,128, 2,140,117, 2,199,218,199,229,232,233,242,225,231,225, + 238, 97,128, 48,148,235,225,244,225,235,225,238, 97,128, 48,244, + 119,143, 0,119,200, 18,200,251,201, 5,201, 28,201, 68,201,135, + 201,143,203,114,203,155,203,167,203,242,203,250,204, 1,204, 12, + 204, 21, 97, 8,200, 36,200, 43,200, 53,200, 64,200,102,200,134, + 200,146,200,182,227,245,244,101,128, 30,131,229,235,239,242,229, + 225,110,128, 49, 89,232,233,242,225,231,225,238, 97,128, 48,143, + 107, 2,200, 70,200, 94,225,244,225,235,225,238, 97,129, 48,239, + 200, 82,232,225,236,230,247,233,228,244,104,128,255,156,239,242, + 229,225,110,128, 49, 88,243,237,225,236,108, 2,200,112,200,123, + 232,233,242,225,231,225,238, 97,128, 48,142,235,225,244,225,235, + 225,238, 97,128, 48,238,244,244,239,243,241,245,225,242,101,128, + 51, 87,118, 2,200,152,200,160,229,228,225,243,104,128, 48, 28, + 249,245,238,228,229,242,243,227,239,242,229,246,229,242,244,233, + 227,225,108,128,254, 52,119, 3,200,190,200,199,200,213,225,242, + 225,226,233, 99,128, 6, 72,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,238,232,225,237,250,225,225,226,239,246,101, 2, + 200,228,200,237,225,242,225,226,233, 99,128, 6, 36,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,134,226,243,241,245,225, + 242,101,128, 51,221,227,233,242, 99, 2,201, 14,201, 19,236,101, + 128, 36,230,245,237,230,236,229,120,128, 1,117,100, 2,201, 34, + 201, 44,233,229,242,229,243,233,115,128, 30,133,239,116, 2,201, + 51,201, 60,225,227,227,229,238,116,128, 30,135,226,229,236,239, + 119,128, 30,137,101, 4,201, 78,201, 89,201,101,201,125,232,233, + 242,225,231,225,238, 97,128, 48,145,233,229,242,243,244,242,225, + 243,115,128, 33, 24,107, 2,201,107,201,117,225,244,225,235,225, + 238, 97,128, 48,241,239,242,229,225,110,128, 49, 94,239,235,239, + 242,229,225,110,128, 49, 93,231,242,225,246,101,128, 30,129,232, + 233,244,101, 8,201,164,201,173,202, 1,202, 91,202,175,202,220, + 203, 16,203, 72,226,245,236,236,229,116,128, 37,230, 99, 2,201, + 179,201,199,233,242,227,236,101,129, 37,203,201,189,233,238,246, + 229,242,243,101,128, 37,217,239,242,238,229,242,226,242,225,227, + 235,229,116, 2,201,216,201,236,236,229,230,116,129, 48, 14,201, + 225,246,229,242,244,233,227,225,108,128,254, 67,242,233,231,232, + 116,129, 48, 15,201,246,246,229,242,244,233,227,225,108,128,254, + 68,100, 2,202, 7,202, 48,233,225,237,239,238,100,129, 37,199, + 202, 18,227,239,238,244,225,233,238,233,238,231,226,236,225,227, + 235,243,237,225,236,236,228,233,225,237,239,238,100,128, 37,200, + 239,247,238,240,239,233,238,244,233,238,103, 2,202, 64,202, 80, + 243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37,191, + 244,242,233,225,238,231,236,101,128, 37,189,236,101, 2,202, 98, + 202,140,230,244,240,239,233,238,244,233,238,103, 2,202,113,202, + 129,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 195,244,242,233,225,238,231,236,101,128, 37,193,238,244,233,227, + 245,236,225,242,226,242,225,227,235,229,116, 2,202,160,202,167, + 236,229,230,116,128, 48, 22,242,233,231,232,116,128, 48, 23,242, + 233,231,232,244,240,239,233,238,244,233,238,103, 2,202,193,202, + 209,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 185,244,242,233,225,238,231,236,101,128, 37,183,115, 3,202,228, + 203, 2,203, 10,109, 2,202,234,202,246,225,236,236,243,241,245, + 225,242,101,128, 37,171,233,236,233,238,231,230,225,227,101,128, + 38, 58,241,245,225,242,101,128, 37,161,244,225,114,128, 38, 6, + 116, 2,203, 22,203, 33,229,236,229,240,232,239,238,101,128, 38, + 15,239,242,244,239,233,243,229,243,232,229,236,236,226,242,225, + 227,235,229,116, 2,203, 57,203, 64,236,229,230,116,128, 48, 24, + 242,233,231,232,116,128, 48, 25,245,240,240,239,233,238,244,233, + 238,103, 2,203, 87,203,103,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,181,244,242,233,225,238,231,236,101,128, + 37,179,105, 2,203,120,203,131,232,233,242,225,231,225,238, 97, + 128, 48,144,107, 2,203,137,203,147,225,244,225,235,225,238, 97, + 128, 48,240,239,242,229,225,110,128, 49, 95,237,239,238,239,243, + 240,225,227,101,128,255, 87,111, 4,203,177,203,188,203,213,203, + 231,232,233,242,225,231,225,238, 97,128, 48,146,235,225,244,225, + 235,225,238, 97,129, 48,242,203,201,232,225,236,230,247,233,228, + 244,104,128,255,102,110,129, 32,169,203,219,237,239,238,239,243, + 240,225,227,101,128,255,230,247,225,229,238,244,232,225,105,128, + 14, 39,240,225,242,229,110,128, 36,178,242,233,238,103,128, 30, + 152,243,245,240,229,242,233,239,114,128, 2,183,244,245,242,238, + 229,100,128, 2,141,249,238,110,128, 1,191,120,137, 0,120,204, + 49,204, 60,204, 71,204, 80,204,107,204,120,204,124,204,136,204, + 144,225,226,239,246,229,227,237, 98,128, 3, 61,226,239,240,239, + 237,239,230,111,128, 49, 18,227,233,242,227,236,101,128, 36,231, + 100, 2,204, 86,204, 96,233,229,242,229,243,233,115,128, 30,141, + 239,244,225,227,227,229,238,116,128, 30,139,229,232,225,242,237, + 229,238,233,225,110,128, 5,109,105,128, 3,190,237,239,238,239, + 243,240,225,227,101,128,255, 88,240,225,242,229,110,128, 36,179, + 243,245,240,229,242,233,239,114,128, 2,227,121,143, 0,121,204, + 189,205,148,205,171,205,211,207,177,207,185,207,202,208, 10,208, + 22,209, 19,209, 59,209, 71,209, 82,209,103,210, 76, 97, 11,204, + 213,204,225,204,235,204,242,204,249,205, 3,205, 28,205, 39,205, + 77,205, 90,205,136,225,228,239,243,241,245,225,242,101,128, 51, + 78,226,229,238,231,225,236,105,128, 9,175,227,245,244,101,128, + 0,253,228,229,246, 97,128, 9, 47,229,235,239,242,229,225,110, + 128, 49, 82,231,117, 2,205, 10,205, 19,234,225,242,225,244,105, + 128, 10,175,242,237,245,235,232,105,128, 10, 47,232,233,242,225, + 231,225,238, 97,128, 48,132,107, 2,205, 45,205, 69,225,244,225, + 235,225,238, 97,129, 48,228,205, 57,232,225,236,230,247,233,228, + 244,104,128,255,148,239,242,229,225,110,128, 49, 81,237,225,235, + 235,225,238,244,232,225,105,128, 14, 78,243,237,225,236,108, 2, + 205,100,205,111,232,233,242,225,231,225,238, 97,128, 48,131,235, + 225,244,225,235,225,238, 97,129, 48,227,205,124,232,225,236,230, + 247,233,228,244,104,128,255,108,244,227,249,242,233,236,236,233, + 99,128, 4, 99,227,233,242, 99, 2,205,157,205,162,236,101,128, + 36,232,245,237,230,236,229,120,128, 1,119,100, 2,205,177,205, + 187,233,229,242,229,243,233,115,128, 0,255,239,116, 2,205,194, + 205,203,225,227,227,229,238,116,128, 30,143,226,229,236,239,119, + 128, 30,245,101, 7,205,227,206,235,206,244,207, 6,207, 38,207, + 114,207,165,104, 8,205,245,205,254,206, 32,206, 46,206,119,206, + 135,206,194,206,212,225,242,225,226,233, 99,128, 6, 74,226,225, + 242,242,229,101, 2,206, 9,206, 18,225,242,225,226,233, 99,128, + 6,210,230,233,238,225,236,225,242,225,226,233, 99,128,251,175, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,242,232,225, + 237,250,225,225,226,239,246,101, 4,206, 65,206, 74,206, 88,206, + 104,225,242,225,226,233, 99,128, 6, 38,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,138,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,139,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,254,140,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,254,243,237,101, 2,206,142,206,155,228,233, + 225,236,225,242,225,226,233, 99,128,254,244,229,237,105, 2,206, + 163,206,178,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 252,221,243,239,236,225,244,229,228,225,242,225,226,233, 99,128, + 252, 88,238,239,239,238,230,233,238,225,236,225,242,225,226,233, + 99,128,252,148,244,232,242,229,229,228,239,244,243,226,229,236, + 239,247,225,242,225,226,233, 99,128, 6,209,235,239,242,229,225, + 110,128, 49, 86,110,129, 0,165,206,250,237,239,238,239,243,240, + 225,227,101,128,255,229,111, 2,207, 12,207, 21,235,239,242,229, + 225,110,128, 49, 85,242,233,238,232,233,229,245,232,235,239,242, + 229,225,110,128, 49,134,114, 3,207, 46,207, 82,207, 94,225,232, + 226,229,238,249,239,237,111, 2,207, 60,207, 69,232,229,226,242, + 229,119,128, 5,170,236,229,230,244,232,229,226,242,229,119,128, + 5,170,233,227,249,242,233,236,236,233, 99,128, 4, 75,245,228, + 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, + 4,249,243,233,229,245,238,103, 3,207,127,207,136,207,152,235, + 239,242,229,225,110,128, 49,129,240,225,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,131,243,233,239,243,235,239,242,229, + 225,110,128, 49,130,244,233,246,232,229,226,242,229,119,128, 5, + 154,231,242,225,246,101,128, 30,243,232,239,239,107,129, 1,180, + 207,194,225,226,239,246,101,128, 30,247,105, 5,207,214,207,225, + 207,236,207,245,207,253,225,242,237,229,238,233,225,110,128, 5, + 117,227,249,242,233,236,236,233, 99,128, 4, 87,235,239,242,229, + 225,110,128, 49, 98,238,249,225,238,103,128, 38, 47,247,238,225, + 242,237,229,238,233,225,110,128, 5,130,237,239,238,239,243,240, + 225,227,101,128,255, 89,111, 7,208, 38,208,108,208,119,208,129, + 208,167,208,213,208,222,100,131, 5,217,208, 48,208, 68,208, 77, + 228,225,231,229,243,104,129,251, 57,208, 59,232,229,226,242,229, + 119,128,251, 57,232,229,226,242,229,119,128, 5,217,249,239,100, + 2,208, 85,208, 94,232,229,226,242,229,119,128, 5,242,240,225, + 244,225,232,232,229,226,242,229,119,128,251, 31,232,233,242,225, + 231,225,238, 97,128, 48,136,233,235,239,242,229,225,110,128, 49, + 137,107, 2,208,135,208,159,225,244,225,235,225,238, 97,129, 48, + 232,208,147,232,225,236,230,247,233,228,244,104,128,255,150,239, + 242,229,225,110,128, 49, 91,243,237,225,236,108, 2,208,177,208, + 188,232,233,242,225,231,225,238, 97,128, 48,135,235,225,244,225, + 235,225,238, 97,129, 48,231,208,201,232,225,236,230,247,233,228, + 244,104,128,255,110,244,231,242,229,229,107,128, 3,243,121, 2, + 208,228,209, 9, 97, 2,208,234,208,244,229,235,239,242,229,225, + 110,128, 49,136,107, 2,208,250,209, 2,239,242,229,225,110,128, + 49,135,244,232,225,105,128, 14, 34,233,238,231,244,232,225,105, + 128, 14, 13,112, 2,209, 25,209, 32,225,242,229,110,128, 36,180, + 239,231,229,231,242,225,237,237,229,238,105,129, 3,122,209, 48, + 231,242,229,229,235,227,237, 98,128, 3, 69,114,129, 1,166,209, + 65,233,238,103,128, 30,153,243,245,240,229,242,233,239,114,128, + 2,184,116, 2,209, 88,209, 95,233,236,228,101,128, 30,249,245, + 242,238,229,100,128, 2,142,117, 5,209,115,209,126,209,136,209, + 174,210, 50,232,233,242,225,231,225,238, 97,128, 48,134,233,235, + 239,242,229,225,110,128, 49,140,107, 2,209,142,209,166,225,244, + 225,235,225,238, 97,129, 48,230,209,154,232,225,236,230,247,233, + 228,244,104,128,255,149,239,242,229,225,110,128, 49, 96,115, 3, + 209,182,209,220,210, 5,226,233,103, 2,209,190,209,201,227,249, + 242,233,236,236,233, 99,128, 4,107,233,239,244,233,230,233,229, + 228,227,249,242,233,236,236,233, 99,128, 4,109,236,233,244,244, + 236,101, 2,209,231,209,242,227,249,242,233,236,236,233, 99,128, + 4,103,233,239,244,233,230,233,229,228,227,249,242,233,236,236, + 233, 99,128, 4,105,237,225,236,108, 2,210, 14,210, 25,232,233, + 242,225,231,225,238, 97,128, 48,133,235,225,244,225,235,225,238, + 97,129, 48,229,210, 38,232,225,236,230,247,233,228,244,104,128, + 255,109,249,101, 2,210, 57,210, 66,235,239,242,229,225,110,128, + 49,139,239,235,239,242,229,225,110,128, 49,138,249, 97, 2,210, + 83,210, 93,226,229,238,231,225,236,105,128, 9,223,228,229,246, + 97,128, 9, 95,122,142, 0,122,210,132,211,140,211,151,211,194, + 211,221,213, 0,213,108,213,150,213,162,213,174,213,202,213,210, + 213,226,213,235, 97, 10,210,154,210,165,210,172,210,179,210,190, + 211, 12,211, 42,211, 53,211, 89,211,101,225,242,237,229,238,233, + 225,110,128, 5,102,227,245,244,101,128, 1,122,228,229,246, 97, + 128, 9, 91,231,245,242,237,245,235,232,105,128, 10, 91,104, 4, + 210,200,210,209,210,223,210,253,225,242,225,226,233, 99,128, 6, + 56,230,233,238,225,236,225,242,225,226,233, 99,128,254,198,105, + 2,210,229,210,244,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,199,242,225,231,225,238, 97,128, 48, 86,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,254,200,233,110, 2,211, + 19,211, 28,225,242,225,226,233, 99,128, 6, 50,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,176,235,225,244,225,235,225, + 238, 97,128, 48,182,241,229,102, 2,211, 61,211, 75,231,225,228, + 239,236,232,229,226,242,229,119,128, 5,149,241,225,244,225,238, + 232,229,226,242,229,119,128, 5,148,242,241,225,232,229,226,242, + 229,119,128, 5,152,249,233,110,130, 5,214,211,111,211,131,228, + 225,231,229,243,104,129,251, 54,211,122,232,229,226,242,229,119, + 128,251, 54,232,229,226,242,229,119,128, 5,214,226,239,240,239, + 237,239,230,111,128, 49, 23, 99, 3,211,159,211,166,211,188,225, + 242,239,110,128, 1,126,233,242, 99, 2,211,174,211,179,236,101, + 128, 36,233,245,237,230,236,229,120,128, 30,145,245,242,108,128, + 2,145,228,239,116,130, 1,124,211,204,211,213,225,227,227,229, + 238,116,128, 1,124,226,229,236,239,119,128, 30,147,101, 6,211, + 235,211,246,212, 33,212, 44,212, 55,212,251,227,249,242,233,236, + 236,233, 99,128, 4, 55,100, 2,211,252,212, 15,229,243,227,229, + 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,153,233, + 229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, 4, + 223,232,233,242,225,231,225,238, 97,128, 48, 92,235,225,244,225, + 235,225,238, 97,128, 48,188,242,111,140, 0, 48,212, 84,212, 93, + 212,103,212,110,212,135,212,148,212,159,212,171,212,182,212,192, + 212,203,212,210,225,242,225,226,233, 99,128, 6, 96,226,229,238, + 231,225,236,105,128, 9,230,228,229,246, 97,128, 9,102,231,117, + 2,212,117,212,126,234,225,242,225,244,105,128, 10,230,242,237, + 245,235,232,105,128, 10,102,232,225,227,235,225,242,225,226,233, + 99,128, 6, 96,233,238,230,229,242,233,239,114,128, 32,128,237, + 239,238,239,243,240,225,227,101,128,255, 16,239,236,228,243,244, + 249,236,101,128,247, 48,240,229,242,243,233,225,110,128, 6,240, + 243,245,240,229,242,233,239,114,128, 32,112,244,232,225,105,128, + 14, 80,247,233,228,244,104, 3,212,222,212,231,212,243,234,239, + 233,238,229,114,128,254,255,238,239,238,234,239,233,238,229,114, + 128, 32, 12,243,240,225,227,101,128, 32, 11,244, 97,128, 3,182, + 104, 2,213, 6,213, 17,226,239,240,239,237,239,230,111,128, 49, + 19,101, 4,213, 27,213, 38,213, 54,213, 65,225,242,237,229,238, + 233,225,110,128, 5,106,226,242,229,246,229,227,249,242,233,236, + 236,233, 99,128, 4,194,227,249,242,233,236,236,233, 99,128, 4, + 54,100, 2,213, 71,213, 90,229,243,227,229,238,228,229,242,227, + 249,242,233,236,236,233, 99,128, 4,151,233,229,242,229,243,233, + 243,227,249,242,233,236,236,233, 99,128, 4,221,105, 3,213,116, + 213,127,213,138,232,233,242,225,231,225,238, 97,128, 48, 88,235, + 225,244,225,235,225,238, 97,128, 48,184,238,239,242,232,229,226, + 242,229,119,128, 5,174,236,233,238,229,226,229,236,239,119,128, + 30,149,237,239,238,239,243,240,225,227,101,128,255, 90,111, 2, + 213,180,213,191,232,233,242,225,231,225,238, 97,128, 48, 94,235, + 225,244,225,235,225,238, 97,128, 48,190,240,225,242,229,110,128, + 36,181,242,229,244,242,239,230,236,229,248,232,239,239,107,128, + 2,144,243,244,242,239,235,101,128, 1,182,117, 2,213,241,213, + 252,232,233,242,225,231,225,238, 97,128, 48, 90,235,225,244,225, + 235,225,238, 97,128, 48,186 + }; + + + /* + * This function searches the compressed table efficiently. + */ + static unsigned long + ft_get_adobe_glyph_index( const char* name, + const char* limit ) + { + int c = 0; + int count, min, max; + const unsigned char* p = ft_adobe_glyph_list; + + + if ( name == 0 || name >= limit ) + goto NotFound; + + c = *name++; + count = p[1]; + p += 2; + + min = 0; + max = count; + + while ( min < max ) + { + int mid = ( min + max ) >> 1; + const unsigned char* q = p + mid * 2; + int c2; + + + q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); + + c2 = q[0] & 127; + if ( c2 == c ) + { + p = q; + goto Found; + } + if ( c2 < c ) + min = mid + 1; + else + max = mid; + } + goto NotFound; + + Found: + for (;;) + { + /* assert (*p & 127) == c */ + + if ( name >= limit ) + { + if ( (p[0] & 128) == 0 && + (p[1] & 128) != 0 ) + return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); + + goto NotFound; + } + c = *name++; + if ( p[0] & 128 ) + { + p++; + if ( c != (p[0] & 127) ) + goto NotFound; + + continue; + } + + p++; + count = p[0] & 127; + if ( p[0] & 128 ) + p += 2; + + p++; + + for ( ; count > 0; count--, p += 2 ) + { + int offset = ( (int)p[0] << 8 ) | p[1]; + const unsigned char* q = ft_adobe_glyph_list + offset; + + if ( c == ( q[0] & 127 ) ) + { + p = q; + goto NextIter; + } + } + goto NotFound; + + NextIter: + ; + } + + NotFound: + return 0; + } + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/psnames/rules.mk b/src/3rdparty/freetype/src/psnames/rules.mk new file mode 100644 index 0000000000..06bd161e34 --- /dev/null +++ b/src/3rdparty/freetype/src/psnames/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 PSNames driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# PSNames driver directory +# +PSNAMES_DIR := $(SRC_DIR)/psnames + + +# compilation flags for the driver +# +PSNAMES_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR)) + + +# PSNames driver sources (i.e., C files) +# +PSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c + + +# PSNames driver headers +# +PSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \ + $(PSNAMES_DIR)/pstables.h \ + $(PSNAMES_DIR)/psnamerr.h + + +# PSNames driver object(s) +# +# PSNAMES_DRV_OBJ_M is used during `multi' builds +# PSNAMES_DRV_OBJ_S is used during `single' builds +# +PSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O + +# PSNames driver source file for single build +# +PSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psmodule.c + + +# PSNames driver - single object +# +$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \ + $(FREETYPE_H) $(PSNAMES_DRV_H) + $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S)) + + +# PSNames driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H) + $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S) +DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/raster/Jamfile b/src/3rdparty/freetype/src/raster/Jamfile new file mode 100644 index 0000000000..f6e4251cb8 --- /dev/null +++ b/src/3rdparty/freetype/src/raster/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/raster Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) raster ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftraster ftrend1 ; + } + else + { + _sources = raster ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/raster Jamfile diff --git a/src/3rdparty/freetype/src/raster/ftmisc.h b/src/3rdparty/freetype/src/raster/ftmisc.h new file mode 100644 index 0000000000..d9d73e3373 --- /dev/null +++ b/src/3rdparty/freetype/src/raster/ftmisc.h @@ -0,0 +1,84 @@ +/***************************************************************************/ +/* */ +/* ftmisc.h */ +/* */ +/* Miscellaneous macros for stand-alone rasterizer (specification */ +/* only). */ +/* */ +/* Copyright 2005, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /***************************************************/ + /* */ + /* This file is *not* portable! You have to adapt */ + /* its definitions to your platform. */ + /* */ + /***************************************************/ + +#ifndef __FTMISC_H__ +#define __FTMISC_H__ + + /* memset */ +#include FT_CONFIG_STANDARD_LIBRARY_H + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#define FT_LOCAL_DEF( x ) static x + + /* from include/freetype2/fttypes.h */ + + typedef unsigned char FT_Byte; + typedef signed int FT_Int; + typedef unsigned int FT_UInt; + typedef signed long FT_Long; + typedef unsigned long FT_ULong; + typedef signed long FT_F26Dot6; + typedef int FT_Error; + +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /* from src/ftcalc.c */ + +#include <inttypes.h> + + typedef int64_t FT_Int64; + + static FT_Long + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* __FTMISC_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/raster/ftraster.c b/src/3rdparty/freetype/src/raster/ftraster.c new file mode 100644 index 0000000000..eb9c4a45f2 --- /dev/null +++ b/src/3rdparty/freetype/src/raster/ftraster.c @@ -0,0 +1,3433 @@ +/***************************************************************************/ +/* */ +/* ftraster.c */ +/* */ +/* The FreeType glyph rasterizer (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file can be compiled without the rest of the FreeType engine, by */ + /* defining the _STANDALONE_ macro when compiling it. You also need to */ + /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir) */ + /* directory. Typically, you should do something like */ + /* */ + /* - copy `src/raster/ftraster.c' (this file) to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' */ + /* to your current directory */ + /* */ + /* - compile `ftraster' with the _STANDALONE_ macro defined, as in */ + /* */ + /* cc -c -D_STANDALONE_ ftraster.c */ + /* */ + /* The renderer can be initialized with a call to */ + /* `ft_standard_raster.raster_new'; a bitmap can be generated */ + /* with a call to `ft_standard_raster.raster_render'. */ + /* */ + /* See the comments and documentation in the file `ftimage.h' for more */ + /* details on how the raster works. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is a rewrite of the FreeType 1.x scan-line converter */ + /* */ + /*************************************************************************/ + +#ifdef _STANDALONE_ + +#include "ftmisc.h" +#include "ftimage.h" + +#else /* !_STANDALONE_ */ + +#include <ft2build.h> +#include "ftraster.h" +#include FT_INTERNAL_CALC_H /* for FT_MulDiv only */ + +#endif /* !_STANDALONE_ */ + + + /*************************************************************************/ + /* */ + /* A simple technical note on how the raster works */ + /* ----------------------------------------------- */ + /* */ + /* Converting an outline into a bitmap is achieved in several steps: */ + /* */ + /* 1 - Decomposing the outline into successive `profiles'. Each */ + /* profile is simply an array of scanline intersections on a given */ + /* dimension. A profile's main attributes are */ + /* */ + /* o its scanline position boundaries, i.e. `Ymin' and `Ymax'. */ + /* */ + /* o an array of intersection coordinates for each scanline */ + /* between `Ymin' and `Ymax'. */ + /* */ + /* o a direction, indicating whether it was built going `up' or */ + /* `down', as this is very important for filling rules. */ + /* */ + /* 2 - Sweeping the target map's scanlines in order to compute segment */ + /* `spans' which are then filled. Additionally, this pass */ + /* performs drop-out control. */ + /* */ + /* The outline data is parsed during step 1 only. The profiles are */ + /* built from the bottom of the render pool, used as a stack. The */ + /* following graphics shows the profile list under construction: */ + /* */ + /* ____________________________________________________________ _ _ */ + /* | | | | | */ + /* | profile | coordinates for | profile | coordinates for |--> */ + /* | 1 | profile 1 | 2 | profile 2 |--> */ + /* |_________|___________________|_________|_________________|__ _ _ */ + /* */ + /* ^ ^ */ + /* | | */ + /* start of render pool top */ + /* */ + /* The top of the profile stack is kept in the `top' variable. */ + /* */ + /* As you can see, a profile record is pushed on top of the render */ + /* pool, which is then followed by its coordinates/intersections. If */ + /* a change of direction is detected in the outline, a new profile is */ + /* generated until the end of the outline. */ + /* */ + /* Note that when all profiles have been generated, the function */ + /* Finalize_Profile_Table() is used to record, for each profile, its */ + /* bottom-most scanline as well as the scanline above its upmost */ + /* boundary. These positions are called `y-turns' because they (sort */ + /* of) correspond to local extrema. They are stored in a sorted list */ + /* built from the top of the render pool as a downwards stack: */ + /* */ + /* _ _ _______________________________________ */ + /* | | */ + /* <--| sorted list of | */ + /* <--| extrema scanlines | */ + /* _ _ __________________|____________________| */ + /* */ + /* ^ ^ */ + /* | | */ + /* maxBuff sizeBuff = end of pool */ + /* */ + /* This list is later used during the sweep phase in order to */ + /* optimize performance (see technical note on the sweep below). */ + /* */ + /* Of course, the raster detects whether the two stacks collide and */ + /* handles the situation properly. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** CONFIGURATION MACROS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /* define DEBUG_RASTER if you want to compile a debugging version */ +#define xxxDEBUG_RASTER + + /* undefine FT_RASTER_OPTION_ANTI_ALIASING if you do not want to support */ + /* 5-levels anti-aliasing */ +#undef FT_RASTER_OPTION_ANTI_ALIASING + + /* The size of the two-lines intermediate bitmap used */ + /* for anti-aliasing, in bytes. */ +#define RASTER_GRAY_LINES 2048 + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** OTHER MACROS (do not change) **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_raster + + +#ifdef _STANDALONE_ + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + /* Disable the tracing mechanism for simplicity -- developers can */ + /* activate it easily by redefining these two macros. */ +#ifndef FT_ERROR +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ +#endif + +#ifndef FT_TRACE +#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */ +#endif + +#define Raster_Err_None 0 +#define Raster_Err_Not_Ini -1 +#define Raster_Err_Overflow -2 +#define Raster_Err_Neg_Height -3 +#define Raster_Err_Invalid -4 +#define Raster_Err_Unsupported -5 + +#define ft_memset memset + +#else /* _STANDALONE_ */ + + +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H /* for FT_TRACE() and FT_ERROR() */ + +#include "rasterrs.h" + +#define Raster_Err_None Raster_Err_Ok +#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized +#define Raster_Err_Overflow Raster_Err_Raster_Overflow +#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height +#define Raster_Err_Invalid Raster_Err_Invalid_Outline +#define Raster_Err_Unsupported Raster_Err_Cannot_Render_Glyph + + +#endif /* _STANDALONE_ */ + + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + + /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */ + /* typically a small value and the result of a*b is known to fit into */ + /* 32 bits. */ +#define FMulDiv( a, b, c ) ( (a) * (b) / (c) ) + + /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */ + /* for clipping computations. It simply uses the FT_MulDiv() function */ + /* defined in `ftcalc.h'. */ +#define SMulDiv FT_MulDiv + + /* The rasterizer is a very general purpose component; please leave */ + /* the following redefinitions there (you never know your target */ + /* environment). */ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + +#ifndef SUCCESS +#define SUCCESS 0 +#endif + +#ifndef FAILURE +#define FAILURE 1 +#endif + + +#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */ + /* Setting this constant to more than 32 is a */ + /* pure waste of space. */ + +#define Pixel_Bits 6 /* fractional bits of *input* coordinates */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SIMPLE TYPE DECLARATIONS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + typedef int Int; + typedef unsigned int UInt; + typedef short Short; + typedef unsigned short UShort, *PUShort; + typedef long Long, *PLong; + typedef unsigned long ULong; + + typedef unsigned char Byte, *PByte; + typedef char Bool; + + + typedef union Alignment_ + { + long l; + void* p; + void (*f)(void); + + } Alignment, *PAlignment; + + + typedef struct TPoint_ + { + Long x; + Long y; + + } TPoint; + + + typedef enum TFlow_ + { + Flow_None = 0, + Flow_Up = 1, + Flow_Down = -1 + + } TFlow; + + + /* States of each line, arc, and profile */ + typedef enum TStates_ + { + Unknown_State, + Ascending_State, + Descending_State, + Flat_State + + } TStates; + + + typedef struct TProfile_ TProfile; + typedef TProfile* PProfile; + + struct TProfile_ + { + FT_F26Dot6 X; /* current coordinate during sweep */ + PProfile link; /* link to next profile - various purpose */ + PLong offset; /* start of profile's data in render pool */ + int flow; /* Profile orientation: Asc/Descending */ + long height; /* profile's height in scanlines */ + long start; /* profile's starting scanline */ + + unsigned countL; /* number of lines to step before this */ + /* profile becomes drawable */ + + PProfile next; /* next profile in same contour, used */ + /* during drop-out control */ + }; + + typedef PProfile TProfileList; + typedef PProfile* PProfileList; + + + /* Simple record used to implement a stack of bands, required */ + /* by the sub-banding mechanism */ + typedef struct TBand_ + { + Short y_min; /* band's minimum */ + Short y_max; /* band's maximum */ + + } TBand; + + +#define AlignProfileSize \ + ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) ) + + +#ifdef FT_STATIC_RASTER + + +#define RAS_ARGS /* void */ +#define RAS_ARG /* void */ + +#define RAS_VARS /* void */ +#define RAS_VAR /* void */ + +#define FT_UNUSED_RASTER do { } while ( 0 ) + + +#else /* FT_STATIC_RASTER */ + + +#define RAS_ARGS PWorker worker, +#define RAS_ARG PWorker worker + +#define RAS_VARS worker, +#define RAS_VAR worker + +#define FT_UNUSED_RASTER FT_UNUSED( worker ) + + +#endif /* FT_STATIC_RASTER */ + + + typedef struct TWorker_ TWorker, *PWorker; + + + /* prototypes used for sweep function dispatch */ + typedef void + Function_Sweep_Init( RAS_ARGS Short* min, + Short* max ); + + typedef void + Function_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ); + + typedef void + Function_Sweep_Step( RAS_ARG ); + + + /* NOTE: These operations are only valid on 2's complement processors */ + +#define FLOOR( x ) ( (x) & -ras.precision ) +#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision ) +#define TRUNC( x ) ( (signed long)(x) >> ras.precision_bits ) +#define FRAC( x ) ( (x) & ( ras.precision - 1 ) ) +#define SCALED( x ) ( ( (x) << ras.scale_shift ) - ras.precision_half ) + + /* Note that I have moved the location of some fields in the */ + /* structure to ensure that the most used variables are used */ + /* at the top. Thus, their offset can be coded with less */ + /* opcodes, and it results in a smaller executable. */ + + struct TWorker_ + { + Int precision_bits; /* precision related variables */ + Int precision; + Int precision_half; + Long precision_mask; + Int precision_shift; + Int precision_step; + Int precision_jitter; + + Int scale_shift; /* == precision_shift for bitmaps */ + /* == precision_shift+1 for pixmaps */ + + PLong buff; /* The profiles buffer */ + PLong sizeBuff; /* Render pool size */ + PLong maxBuff; /* Profiles buffer size */ + PLong top; /* Current cursor in buffer */ + + FT_Error error; + + Int numTurns; /* number of Y-turns in outline */ + + TPoint* arc; /* current Bezier arc pointer */ + + UShort bWidth; /* target bitmap width */ + PByte bTarget; /* target bitmap buffer */ + PByte gTarget; /* target pixmap buffer */ + + Long lastX, lastY, minY, maxY; + + UShort num_Profs; /* current number of profiles */ + + Bool fresh; /* signals a fresh new profile which */ + /* 'start' field must be completed */ + Bool joint; /* signals that the last arc ended */ + /* exactly on a scanline. Allows */ + /* removal of doublets */ + PProfile cProfile; /* current profile */ + PProfile fProfile; /* head of linked list of profiles */ + PProfile gProfile; /* contour's first profile in case */ + /* of impact */ + + TStates state; /* rendering state */ + + FT_Bitmap target; /* description of target bit/pixmap */ + FT_Outline outline; + + Long traceOfs; /* current offset in target bitmap */ + Long traceG; /* current offset in target pixmap */ + + Short traceIncr; /* sweep's increment in target bitmap */ + + Short gray_min_x; /* current min x during gray rendering */ + Short gray_max_x; /* current max x during gray rendering */ + + /* dispatch variables */ + + Function_Sweep_Init* Proc_Sweep_Init; + Function_Sweep_Span* Proc_Sweep_Span; + Function_Sweep_Span* Proc_Sweep_Drop; + Function_Sweep_Step* Proc_Sweep_Step; + + Byte dropOutControl; /* current drop_out control method */ + + Bool second_pass; /* indicates whether a horizontal pass */ + /* should be performed to control */ + /* drop-out accurately when calling */ + /* Render_Glyph. Note that there is */ + /* no horizontal pass during gray */ + /* rendering. */ + + TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */ + + TBand band_stack[16]; /* band stack used for sub-banding */ + Int band_top; /* band stack top */ + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + Byte* grays; + + Byte gray_lines[RASTER_GRAY_LINES]; + /* Intermediate table used to render the */ + /* graylevels pixmaps. */ + /* gray_lines is a buffer holding two */ + /* monochrome scanlines */ + + Short gray_width; /* width in bytes of one monochrome */ + /* intermediate scanline of gray_lines. */ + /* Each gray pixel takes 2 bits long there */ + + /* The gray_lines must hold 2 lines, thus with size */ + /* in bytes of at least `gray_width*2'. */ + +#endif /* FT_RASTER_ANTI_ALIASING */ + + }; + + + typedef struct TRaster_ + { + char* buffer; + long buffer_size; + void* memory; + PWorker worker; + Byte grays[5]; + Short gray_width; + + } TRaster, *PRaster; + +#ifdef FT_STATIC_RASTER + + static TWorker cur_ras; +#define ras cur_ras + +#else + +#define ras (*worker) + +#endif /* FT_STATIC_RASTER */ + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + static const char count_table[256] = + { + 0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 , 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4, + 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5, + 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7, + 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7, + 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6, + 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7, + 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7, + 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 , 5 , 6 , 6 , 7 , 6 , 7 , 7 , 8 +a }; + +#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ + + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** PROFILES COMPUTATION **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Set_High_Precision */ + /* */ + /* <Description> */ + /* Set precision variables according to param flag. */ + /* */ + /* <Input> */ + /* High :: Set to True for high precision (typically for ppem < 18), */ + /* false otherwise. */ + /* */ + static void + Set_High_Precision( RAS_ARGS Int High ) + { + if ( High ) + { + ras.precision_bits = 10; + ras.precision_step = 128; + ras.precision_jitter = 24; + } + else + { + ras.precision_bits = 6; + ras.precision_step = 32; + ras.precision_jitter = 2; + } + + FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" )); + + ras.precision = 1 << ras.precision_bits; + ras.precision_half = ras.precision / 2; + ras.precision_shift = ras.precision_bits - Pixel_Bits; + ras.precision_mask = -ras.precision; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* New_Profile */ + /* */ + /* <Description> */ + /* Create a new profile in the render pool. */ + /* */ + /* <Input> */ + /* aState :: The state/orientation of the new profile. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow or of incoherent */ + /* profile. */ + /* */ + static Bool + New_Profile( RAS_ARGS TStates aState ) + { + if ( !ras.fProfile ) + { + ras.cProfile = (PProfile)ras.top; + ras.fProfile = ras.cProfile; + ras.top += AlignProfileSize; + } + + if ( ras.top >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + switch ( aState ) + { + case Ascending_State: + ras.cProfile->flow = Flow_Up; + FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile )); + break; + + case Descending_State: + ras.cProfile->flow = Flow_Down; + FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile )); + break; + + default: + FT_ERROR(( "New_Profile: invalid profile direction!\n" )); + ras.error = Raster_Err_Invalid; + return FAILURE; + } + + ras.cProfile->start = 0; + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + ras.cProfile->link = (PProfile)0; + ras.cProfile->next = (PProfile)0; + + if ( !ras.gProfile ) + ras.gProfile = ras.cProfile; + + ras.state = aState; + ras.fresh = TRUE; + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* End_Profile */ + /* */ + /* <Description> */ + /* Finalize the current profile. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow or incoherency. */ + /* */ + static Bool + End_Profile( RAS_ARG ) + { + Long h; + PProfile oldProfile; + + + h = (Long)( ras.top - ras.cProfile->offset ); + + if ( h < 0 ) + { + FT_ERROR(( "End_Profile: negative height encountered!\n" )); + ras.error = Raster_Err_Neg_Height; + return FAILURE; + } + + if ( h > 0 ) + { + FT_TRACE6(( "Ending profile %lx, start = %ld, height = %ld\n", + (long)ras.cProfile, ras.cProfile->start, h )); + + oldProfile = ras.cProfile; + ras.cProfile->height = h; + ras.cProfile = (PProfile)ras.top; + + ras.top += AlignProfileSize; + + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + oldProfile->next = ras.cProfile; + ras.num_Profs++; + } + + if ( ras.top >= ras.maxBuff ) + { + FT_TRACE1(( "overflow in End_Profile\n" )); + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Insert_Y_Turn */ + /* */ + /* <Description> */ + /* Insert a salient into the sorted list placed on top of the render */ + /* pool. */ + /* */ + /* <Input> */ + /* New y scanline position. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow. */ + /* */ + static Bool + Insert_Y_Turn( RAS_ARGS Int y ) + { + PLong y_turns; + Int y2, n; + + + n = ras.numTurns - 1; + y_turns = ras.sizeBuff - ras.numTurns; + + /* look for first y value that is <= */ + while ( n >= 0 && y < y_turns[n] ) + n--; + + /* if it is <, simply insert it, ignore if == */ + if ( n >= 0 && y > y_turns[n] ) + while ( n >= 0 ) + { + y2 = (Int)y_turns[n]; + y_turns[n] = y; + y = y2; + n--; + } + + if ( n < 0 ) + { + ras.maxBuff--; + if ( ras.maxBuff <= ras.top ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + ras.numTurns++; + ras.sizeBuff[-ras.numTurns] = y; + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Finalize_Profile_Table */ + /* */ + /* <Description> */ + /* Adjust all links in the profiles list. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow. */ + /* */ + static Bool + Finalize_Profile_Table( RAS_ARG ) + { + Int bottom, top; + UShort n; + PProfile p; + + + n = ras.num_Profs; + p = ras.fProfile; + + if ( n > 1 && p ) + { + while ( n > 0 ) + { + if ( n > 1 ) + p->link = (PProfile)( p->offset + p->height ); + else + p->link = NULL; + + switch ( p->flow ) + { + case Flow_Down: + bottom = (Int)( p->start - p->height + 1 ); + top = (Int)p->start; + p->start = bottom; + p->offset += p->height - 1; + break; + + case Flow_Up: + default: + bottom = (Int)p->start; + top = (Int)( p->start + p->height - 1 ); + } + + if ( Insert_Y_Turn( RAS_VARS bottom ) || + Insert_Y_Turn( RAS_VARS top + 1 ) ) + return FAILURE; + + p = p->link; + n--; + } + } + else + ras.fProfile = NULL; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Split_Conic */ + /* */ + /* <Description> */ + /* Subdivide one conic Bezier into two joint sub-arcs in the Bezier */ + /* stack. */ + /* */ + /* <Input> */ + /* None (subdivided Bezier is taken from the top of the stack). */ + /* */ + /* <Note> */ + /* This routine is the `beef' of this component. It is _the_ inner */ + /* loop that should be optimized to hell to get the best performance. */ + /* */ + static void + Split_Conic( TPoint* base ) + { + Long a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + + /* hand optimized. gcc doesn't seem to be too good at common */ + /* expression substitution and instruction scheduling ;-) */ + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Split_Cubic */ + /* */ + /* <Description> */ + /* Subdivide a third-order Bezier arc into two joint sub-arcs in the */ + /* Bezier stack. */ + /* */ + /* <Note> */ + /* This routine is the `beef' of the component. It is one of _the_ */ + /* inner loops that should be optimized like hell to get the best */ + /* performance. */ + /* */ + static void + Split_Cubic( TPoint* base ) + { + Long a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c + 1 ) >> 1; + base[5].x = b = ( base[3].x + d + 1 ) >> 1; + c = ( c + d + 1 ) >> 1; + base[2].x = a = ( a + c + 1 ) >> 1; + base[4].x = b = ( b + c + 1 ) >> 1; + base[3].x = ( a + b + 1 ) >> 1; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c + 1 ) >> 1; + base[5].y = b = ( base[3].y + d + 1 ) >> 1; + c = ( c + d + 1 ) >> 1; + base[2].y = a = ( a + c + 1 ) >> 1; + base[4].y = b = ( b + c + 1 ) >> 1; + base[3].y = ( a + b + 1 ) >> 1; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_Up */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an ascending line segment and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* x1 :: The x-coordinate of the segment's start point. */ + /* */ + /* y1 :: The y-coordinate of the segment's start point. */ + /* */ + /* x2 :: The x-coordinate of the segment's end point. */ + /* */ + /* y2 :: The y-coordinate of the segment's end point. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Line_Up( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Long Dx, Dy; + Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */ + Long Ix, Rx, Ax; + + PLong top; + + + Dx = x2 - x1; + Dy = y2 - y1; + + if ( Dy <= 0 || y2 < miny || y1 > maxy ) + return SUCCESS; + + if ( y1 < miny ) + { + /* Take care: miny-y1 can be a very large value; we use */ + /* a slow MulDiv function to avoid clipping bugs */ + x1 += SMulDiv( Dx, miny - y1, Dy ); + e1 = (Int)TRUNC( miny ); + f1 = 0; + } + else + { + e1 = (Int)TRUNC( y1 ); + f1 = (Int)FRAC( y1 ); + } + + if ( y2 > maxy ) + { + /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */ + e2 = (Int)TRUNC( maxy ); + f2 = 0; + } + else + { + e2 = (Int)TRUNC( y2 ); + f2 = (Int)FRAC( y2 ); + } + + if ( f1 > 0 ) + { + if ( e1 == e2 ) + return SUCCESS; + else + { + x1 += FMulDiv( Dx, ras.precision - f1, Dy ); + e1 += 1; + } + } + else + if ( ras.joint ) + { + ras.top--; + ras.joint = FALSE; + } + + ras.joint = (char)( f2 == 0 ); + + if ( ras.fresh ) + { + ras.cProfile->start = e1; + ras.fresh = FALSE; + } + + size = e2 - e1 + 1; + if ( ras.top + size >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + if ( Dx > 0 ) + { + Ix = ( ras.precision * Dx ) / Dy; + Rx = ( ras.precision * Dx ) % Dy; + Dx = 1; + } + else + { + Ix = -( ( ras.precision * -Dx ) / Dy ); + Rx = ( ras.precision * -Dx ) % Dy; + Dx = -1; + } + + Ax = -Dy; + top = ras.top; + + while ( size > 0 ) + { + *top++ = x1; + + x1 += Ix; + Ax += Rx; + if ( Ax >= 0 ) + { + Ax -= Dy; + x1 += Dx; + } + size--; + } + + ras.top = top; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_Down */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an descending line segment and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* x1 :: The x-coordinate of the segment's start point. */ + /* */ + /* y1 :: The y-coordinate of the segment's start point. */ + /* */ + /* x2 :: The x-coordinate of the segment's end point. */ + /* */ + /* y2 :: The y-coordinate of the segment's end point. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Line_Down( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Bool result, fresh; + + + fresh = ras.fresh; + + result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + return result; + } + + + /* A function type describing the functions used to split Bezier arcs */ + typedef void (*TSplitter)( TPoint* base ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Bezier_Up */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an ascending Bezier arc and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* degree :: The degree of the Bezier arc (either 2 or 3). */ + /* */ + /* splitter :: The function to split Bezier arcs. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Bezier_Up( RAS_ARGS Int degree, + TSplitter splitter, + Long miny, + Long maxy ) + { + Long y1, y2, e, e2, e0; + Short f1; + + TPoint* arc; + TPoint* start_arc; + + PLong top; + + + arc = ras.arc; + y1 = arc[degree].y; + y2 = arc[0].y; + top = ras.top; + + if ( y2 < miny || y1 > maxy ) + goto Fin; + + e2 = FLOOR( y2 ); + + if ( e2 > maxy ) + e2 = maxy; + + e0 = miny; + + if ( y1 < miny ) + e = miny; + else + { + e = CEILING( y1 ); + f1 = (Short)( FRAC( y1 ) ); + e0 = e; + + if ( f1 == 0 ) + { + if ( ras.joint ) + { + top--; + ras.joint = FALSE; + } + + *top++ = arc[degree].x; + + e += ras.precision; + } + } + + if ( ras.fresh ) + { + ras.cProfile->start = TRUNC( e0 ); + ras.fresh = FALSE; + } + + if ( e2 < e ) + goto Fin; + + if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff ) + { + ras.top = top; + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + start_arc = arc; + + while ( arc >= start_arc && e <= e2 ) + { + ras.joint = FALSE; + + y2 = arc[0].y; + + if ( y2 > e ) + { + y1 = arc[degree].y; + if ( y2 - y1 >= ras.precision_step ) + { + splitter( arc ); + arc += degree; + } + else + { + *top++ = arc[degree].x + FMulDiv( arc[0].x-arc[degree].x, + e - y1, y2 - y1 ); + arc -= degree; + e += ras.precision; + } + } + else + { + if ( y2 == e ) + { + ras.joint = TRUE; + *top++ = arc[0].x; + + e += ras.precision; + } + arc -= degree; + } + } + + Fin: + ras.top = top; + ras.arc -= degree; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Bezier_Down */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an descending Bezier arc and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* degree :: The degree of the Bezier arc (either 2 or 3). */ + /* */ + /* splitter :: The function to split Bezier arcs. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Bezier_Down( RAS_ARGS Int degree, + TSplitter splitter, + Long miny, + Long maxy ) + { + TPoint* arc = ras.arc; + Bool result, fresh; + + + arc[0].y = -arc[0].y; + arc[1].y = -arc[1].y; + arc[2].y = -arc[2].y; + if ( degree > 2 ) + arc[3].y = -arc[3].y; + + fresh = ras.fresh; + + result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + arc[0].y = -arc[0].y; + return result; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_To */ + /* */ + /* <Description> */ + /* Inject a new line segment and adjust the Profiles list. */ + /* */ + /* <Input> */ + /* x :: The x-coordinate of the segment's end point (its start point */ + /* is stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the segment's end point (its start point */ + /* is stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Line_To( RAS_ARGS Long x, + Long y ) + { + /* First, detect a change of direction */ + + switch ( ras.state ) + { + case Unknown_State: + if ( y > ras.lastY ) + { + if ( New_Profile( RAS_VARS Ascending_State ) ) + return FAILURE; + } + else + { + if ( y < ras.lastY ) + if ( New_Profile( RAS_VARS Descending_State ) ) + return FAILURE; + } + break; + + case Ascending_State: + if ( y < ras.lastY ) + { + if ( End_Profile( RAS_VAR ) || + New_Profile( RAS_VARS Descending_State ) ) + return FAILURE; + } + break; + + case Descending_State: + if ( y > ras.lastY ) + { + if ( End_Profile( RAS_VAR ) || + New_Profile( RAS_VARS Ascending_State ) ) + return FAILURE; + } + break; + + default: + ; + } + + /* Then compute the lines */ + + switch ( ras.state ) + { + case Ascending_State: + if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + case Descending_State: + if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + default: + ; + } + + ras.lastX = x; + ras.lastY = y; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Conic_To */ + /* */ + /* <Description> */ + /* Inject a new conic arc and adjust the profile list. */ + /* */ + /* <Input> */ + /* cx :: The x-coordinate of the arc's new control point. */ + /* */ + /* cy :: The y-coordinate of the arc's new control point. */ + /* */ + /* x :: The x-coordinate of the arc's end point (its start point is */ + /* stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the arc's end point (its start point is */ + /* stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Conic_To( RAS_ARGS Long cx, + Long cy, + Long x, + Long y ) + { + Long y1, y2, y3, x3, ymin, ymax; + TStates state_bez; + + + ras.arc = ras.arcs; + ras.arc[2].x = ras.lastX; + ras.arc[2].y = ras.lastY; + ras.arc[1].x = cx; ras.arc[1].y = cy; + ras.arc[0].x = x; ras.arc[0].y = y; + + do + { + y1 = ras.arc[2].y; + y2 = ras.arc[1].y; + y3 = ras.arc[0].y; + x3 = ras.arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y3 ) + { + ymin = y1; + ymax = y3; + } + else + { + ymin = y3; + ymax = y1; + } + + if ( y2 < ymin || y2 > ymax ) + { + /* this arc has no given direction, split it! */ + Split_Conic( ras.arc ); + ras.arc += 2; + } + else if ( y1 == y3 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + ras.arc -= 2; + } + else + { + /* the arc is y-monotonous, either ascending or descending */ + /* detect a change of direction */ + state_bez = y1 < y3 ? Ascending_State : Descending_State; + if ( ras.state != state_bez ) + { + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VAR ) ) + goto Fail; + + /* create a new profile */ + if ( New_Profile( RAS_VARS state_bez ) ) + goto Fail; + } + + /* now call the appropriate routine */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) + goto Fail; + } + + } while ( ras.arc >= ras.arcs ); + + ras.lastX = x3; + ras.lastY = y3; + + return SUCCESS; + + Fail: + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Cubic_To */ + /* */ + /* <Description> */ + /* Inject a new cubic arc and adjust the profile list. */ + /* */ + /* <Input> */ + /* cx1 :: The x-coordinate of the arc's first new control point. */ + /* */ + /* cy1 :: The y-coordinate of the arc's first new control point. */ + /* */ + /* cx2 :: The x-coordinate of the arc's second new control point. */ + /* */ + /* cy2 :: The y-coordinate of the arc's second new control point. */ + /* */ + /* x :: The x-coordinate of the arc's end point (its start point is */ + /* stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the arc's end point (its start point is */ + /* stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Cubic_To( RAS_ARGS Long cx1, + Long cy1, + Long cx2, + Long cy2, + Long x, + Long y ) + { + Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2; + TStates state_bez; + + + ras.arc = ras.arcs; + ras.arc[3].x = ras.lastX; + ras.arc[3].y = ras.lastY; + ras.arc[2].x = cx1; ras.arc[2].y = cy1; + ras.arc[1].x = cx2; ras.arc[1].y = cy2; + ras.arc[0].x = x; ras.arc[0].y = y; + + do + { + y1 = ras.arc[3].y; + y2 = ras.arc[2].y; + y3 = ras.arc[1].y; + y4 = ras.arc[0].y; + x4 = ras.arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y4 ) + { + ymin1 = y1; + ymax1 = y4; + } + else + { + ymin1 = y4; + ymax1 = y1; + } + + if ( y2 <= y3 ) + { + ymin2 = y2; + ymax2 = y3; + } + else + { + ymin2 = y3; + ymax2 = y2; + } + + if ( ymin2 < ymin1 || ymax2 > ymax1 ) + { + /* this arc has no given direction, split it! */ + Split_Cubic( ras.arc ); + ras.arc += 3; + } + else if ( y1 == y4 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + ras.arc -= 3; + } + else + { + state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State; + + /* detect a change of direction */ + if ( ras.state != state_bez ) + { + if ( ras.state != Unknown_State && + End_Profile( RAS_VAR ) ) + goto Fail; + + if ( New_Profile( RAS_VARS state_bez ) ) + goto Fail; + } + + /* compute intersections */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) + goto Fail; + } + + } while ( ras.arc >= ras.arcs ); + + ras.lastX = x4; + ras.lastY = y4; + + return SUCCESS; + + Fail: + return FAILURE; + } + + +#undef SWAP_ +#define SWAP_( x, y ) do \ + { \ + Long swap = x; \ + \ + \ + x = y; \ + y = swap; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Decompose_Curve */ + /* */ + /* <Description> */ + /* Scan the outline arrays in order to emit individual segments and */ + /* Beziers by calling Line_To() and Bezier_To(). It handles all */ + /* weird cases, like when the first point is off the curve, or when */ + /* there are simply no `on' points in the contour! */ + /* */ + /* <Input> */ + /* first :: The index of the first point in the contour. */ + /* */ + /* last :: The index of the last point in the contour. */ + /* */ + /* flipped :: If set, flip the direction of the curve. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on error. */ + /* */ + static Bool + Decompose_Curve( RAS_ARGS UShort first, + UShort last, + int flipped ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* points; + FT_Vector* point; + FT_Vector* limit; + char* tags; + + unsigned tag; /* current point's state */ + + + points = ras.outline.points; + limit = points + last; + + v_start.x = SCALED( points[first].x ); + v_start.y = SCALED( points[first].y ); + v_last.x = SCALED( points[last].x ); + v_last.y = SCALED( points[last].y ); + + if ( flipped ) + { + SWAP_( v_start.x, v_start.y ); + SWAP_( v_last.x, v_last.y ); + } + + v_control = v_start; + + point = points + first; + tags = ras.outline.tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + ras.lastX = v_start.x; + ras.lastY = v_start.y; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + Long x, y; + + + x = SCALED( point->x ); + y = SCALED( point->y ); + if ( flipped ) + SWAP_( x, y ); + + if ( Line_To( RAS_VARS x, y ) ) + goto Fail; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point[0].x ); + v_control.y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( v_control.x, v_control.y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector v_middle; + Long x, y; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + x = SCALED( point[0].x ); + y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x, y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) ) + goto Fail; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + x ) / 2; + v_middle.y = ( v_control.y + y ) / 2; + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_middle.x, v_middle.y ) ) + goto Fail; + + v_control.x = x; + v_control.y = y; + + goto Do_Conic; + } + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_start.x, v_start.y ) ) + goto Fail; + + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + Long x1, y1, x2, y2, x3, y3; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + x1 = SCALED( point[-2].x ); + y1 = SCALED( point[-2].y ); + x2 = SCALED( point[-1].x ); + y2 = SCALED( point[-1].y ); + x3 = SCALED( point[ 0].x ); + y3 = SCALED( point[ 0].y ); + + if ( flipped ) + { + SWAP_( x1, y1 ); + SWAP_( x2, y2 ); + SWAP_( x3, y3 ); + } + + if ( point <= limit ) + { + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) ) + goto Fail; + continue; + } + + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) ) + goto Fail; + goto Close; + } + } + } + + /* close the contour with a line segment */ + if ( Line_To( RAS_VARS v_start.x, v_start.y ) ) + goto Fail; + + Close: + return SUCCESS; + + Invalid_Outline: + ras.error = Raster_Err_Invalid; + + Fail: + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Convert_Glyph */ + /* */ + /* <Description> */ + /* Convert a glyph into a series of segments and arcs and make a */ + /* profiles list with them. */ + /* */ + /* <Input> */ + /* flipped :: If set, flip the direction of curve. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE if any error was encountered during */ + /* rendering. */ + /* */ + static Bool + Convert_Glyph( RAS_ARGS int flipped ) + { + int i; + unsigned start; + + PProfile lastProfile; + + + ras.fProfile = NULL; + ras.joint = FALSE; + ras.fresh = FALSE; + + ras.maxBuff = ras.sizeBuff - AlignProfileSize; + + ras.numTurns = 0; + + ras.cProfile = (PProfile)ras.top; + ras.cProfile->offset = ras.top; + ras.num_Profs = 0; + + start = 0; + + for ( i = 0; i < ras.outline.n_contours; i++ ) + { + ras.state = Unknown_State; + ras.gProfile = NULL; + + if ( Decompose_Curve( RAS_VARS (unsigned short)start, + ras.outline.contours[i], + flipped ) ) + return FAILURE; + + start = ras.outline.contours[i] + 1; + + /* We must now see whether the extreme arcs join or not */ + if ( FRAC( ras.lastY ) == 0 && + ras.lastY >= ras.minY && + ras.lastY <= ras.maxY ) + if ( ras.gProfile && ras.gProfile->flow == ras.cProfile->flow ) + ras.top--; + /* Note that ras.gProfile can be nil if the contour was too small */ + /* to be drawn. */ + + lastProfile = ras.cProfile; + if ( End_Profile( RAS_VAR ) ) + return FAILURE; + + /* close the `next profile in contour' linked list */ + if ( ras.gProfile ) + lastProfile->next = ras.gProfile; + } + + if ( Finalize_Profile_Table( RAS_VAR ) ) + return FAILURE; + + return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SCAN-LINE SWEEPS AND DRAWING **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Init_Linked */ + /* */ + /* Initializes an empty linked list. */ + /* */ + static void + Init_Linked( TProfileList* l ) + { + *l = NULL; + } + + + /*************************************************************************/ + /* */ + /* InsNew */ + /* */ + /* Inserts a new profile in a linked list. */ + /* */ + static void + InsNew( PProfileList list, + PProfile profile ) + { + PProfile *old, current; + Long x; + + + old = list; + current = *old; + x = profile->X; + + while ( current ) + { + if ( x < current->X ) + break; + old = ¤t->link; + current = *old; + } + + profile->link = current; + *old = profile; + } + + + /*************************************************************************/ + /* */ + /* DelOld */ + /* */ + /* Removes an old profile from a linked list. */ + /* */ + static void + DelOld( PProfileList list, + PProfile profile ) + { + PProfile *old, current; + + + old = list; + current = *old; + + while ( current ) + { + if ( current == profile ) + { + *old = current->link; + return; + } + + old = ¤t->link; + current = *old; + } + + /* we should never get there, unless the profile was not part of */ + /* the list. */ + } + + + /*************************************************************************/ + /* */ + /* Sort */ + /* */ + /* Sorts a trace list. In 95%, the list is already sorted. We need */ + /* an algorithm which is fast in this case. Bubble sort is enough */ + /* and simple. */ + /* */ + static void + Sort( PProfileList list ) + { + PProfile *old, current, next; + + + /* First, set the new X coordinate of each profile */ + current = *list; + while ( current ) + { + current->X = *current->offset; + current->offset += current->flow; + current->height--; + current = current->link; + } + + /* Then sort them */ + old = list; + current = *old; + + if ( !current ) + return; + + next = current->link; + + while ( next ) + { + if ( current->X <= next->X ) + { + old = ¤t->link; + current = *old; + + if ( !current ) + return; + } + else + { + *old = next; + current->link = next->link; + next->link = current; + + old = list; + current = *old; + } + + next = current->link; + } + } + + + /*************************************************************************/ + /* */ + /* Vertical Sweep Procedure Set */ + /* */ + /* These four routines are used during the vertical black/white sweep */ + /* phase by the generic Draw_Sweep() function. */ + /* */ + /*************************************************************************/ + + static void + Vertical_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + Long pitch = ras.target.pitch; + + FT_UNUSED( max ); + + + ras.traceIncr = (Short)-pitch; + ras.traceOfs = -*min * pitch; + if ( pitch > 0 ) + ras.traceOfs += ( ras.target.rows - 1 ) * pitch; + + ras.gray_min_x = 0; + ras.gray_max_x = 0; + } + + + static void + Vertical_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + int c1, c2; + Byte f1, f2; + Byte* target; + + FT_UNUSED( y ); + FT_UNUSED( left ); + FT_UNUSED( right ); + + + /* Drop-out control */ + + e1 = TRUNC( CEILING( x1 ) ); + + if ( x2 - x1 - ras.precision <= ras.precision_jitter ) + e2 = e1; + else + e2 = TRUNC( FLOOR( x2 ) ); + + if ( e2 >= 0 && e1 < ras.bWidth ) + { + if ( e1 < 0 ) + e1 = 0; + if ( e2 >= ras.bWidth ) + e2 = ras.bWidth - 1; + + c1 = (Short)( e1 >> 3 ); + c2 = (Short)( e2 >> 3 ); + + f1 = (Byte) ( 0xFF >> ( e1 & 7 ) ); + f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) ); + + if ( ras.gray_min_x > c1 ) + ras.gray_min_x = (short)c1; + if ( ras.gray_max_x < c2 ) + ras.gray_max_x = (short)c2; + + target = ras.bTarget + ras.traceOfs + c1; + c2 -= c1; + + if ( c2 > 0 ) + { + target[0] |= f1; + + /* memset() is slower than the following code on many platforms. */ + /* This is due to the fact that, in the vast majority of cases, */ + /* the span length in bytes is relatively small. */ + c2--; + while ( c2 > 0 ) + { + *(++target) = 0xFF; + c2--; + } + target[1] |= f2; + } + else + *target |= ( f1 & f2 ); + } + } + + + static void + Vertical_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + Short c1, f1; + + + /* Drop-out control */ + + /* e2 x2 x1 e1 */ + /* */ + /* ^ | */ + /* | | */ + /* +-------------+---------------------+------------+ */ + /* | | */ + /* | v */ + /* */ + /* pixel contour contour pixel */ + /* center center */ + + /* drop-out mode scan conversion rules (as defined in OpenType) */ + /* --------------------------------------------------------------- */ + /* 0 1, 2, 3 */ + /* 1 1, 2, 4 */ + /* 2 1, 2 */ + /* 3 same as mode 2 */ + /* 4 1, 2, 5 */ + /* 5 1, 2, 6 */ + /* 6, 7 same as mode 2 */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + if ( e1 == e2 + ras.precision ) + { + switch ( ras.dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = FLOOR( ( x1 + x2 + 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + + /* Drop-out Control Rules #4 and #6 */ + + /* The spec is not very clear regarding those rules. It */ + /* presents a method that is way too costly to implement */ + /* while the general idea seems to get rid of `stubs'. */ + /* */ + /* Here, we only get rid of stubs recognized if: */ + /* */ + /* upper stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Right is the successor of P_Left in that contour */ + /* - y is the top of P_Left and P_Right */ + /* */ + /* lower stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Left is the successor of P_Right in that contour */ + /* - y is the bottom of P_Left */ + /* */ + + /* FIXXXME: uncommenting this line solves the disappearing */ + /* bit problem in the `7' of verdana 10pts, but */ + /* makes a new one in the `C' of arial 14pts */ +#if 0 + if ( x2 - x1 < ras.precision_half ) +#endif + { + /* upper stub test */ + if ( left->next == right && left->height <= 0 ) + return; + + /* lower stub test */ + if ( right->next == left && left->start == y ) + return; + } + + if ( ras.dropOutControl == 1 ) + pxl = e2; + else + pxl = FLOOR( ( x1 + x2 + 1 ) / 2 + ras.precision_half ); + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + + /* check that the other pixel isn't set */ + e1 = pxl == e1 ? e2 : e1; + + e1 = TRUNC( e1 ); + + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( e1 >= 0 && e1 < ras.bWidth && + ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) ) + return; + } + else + return; + } + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && e1 < ras.bWidth ) + { + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( ras.gray_min_x > c1 ) + ras.gray_min_x = c1; + if ( ras.gray_max_x < c1 ) + ras.gray_max_x = c1; + + ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 ); + } + } + + + static void + Vertical_Sweep_Step( RAS_ARG ) + { + ras.traceOfs += ras.traceIncr; + } + + + /***********************************************************************/ + /* */ + /* Horizontal Sweep Procedure Set */ + /* */ + /* These four routines are used during the horizontal black/white */ + /* sweep phase by the generic Draw_Sweep() function. */ + /* */ + /***********************************************************************/ + + static void + Horizontal_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + /* nothing, really */ + FT_UNUSED_RASTER; + FT_UNUSED( min ); + FT_UNUSED( max ); + } + + + static void + Horizontal_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + PByte bits; + Byte f1; + + FT_UNUSED( left ); + FT_UNUSED( right ); + + + if ( x2 - x1 < ras.precision ) + { + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 == e2 ) + { + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + e1 = TRUNC( e1 ); + + if ( e1 >= 0 && e1 < ras.target.rows ) + { + PByte p; + + + p = bits - e1*ras.target.pitch; + if ( ras.target.pitch > 0 ) + p += ( ras.target.rows - 1 ) * ras.target.pitch; + + p[0] |= f1; + } + } + } + } + + + static void + Horizontal_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + PByte bits; + Byte f1; + + + /* During the horizontal sweep, we only take care of drop-outs */ + + /* e1 + <-- pixel center */ + /* | */ + /* x1 ---+--> <-- contour */ + /* | */ + /* | */ + /* x2 <--+--- <-- contour */ + /* | */ + /* | */ + /* e2 + <-- pixel center */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + if ( e1 == e2 + ras.precision ) + { + switch ( ras.dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = FLOOR( ( x1 + x2 + 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + /* see Vertical_Sweep_Drop for details */ + + /* rightmost stub test */ + if ( left->next == right && left->height <= 0 ) + return; + + /* leftmost stub test */ + if ( right->next == left && left->start == y ) + return; + + if ( ras.dropOutControl == 1 ) + pxl = e2; + else + pxl = FLOOR( ( x1 + x2 + 1 ) / 2 + ras.precision_half ); + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + + /* check that the other pixel isn't set */ + e1 = pxl == e1 ? e2 : e1; + + e1 = TRUNC( e1 ); + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + bits -= e1 * ras.target.pitch; + if ( ras.target.pitch > 0 ) + bits += ( ras.target.rows - 1 ) * ras.target.pitch; + + if ( e1 >= 0 && + e1 < ras.target.rows && + *bits & f1 ) + return; + } + else + return; + } + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && e1 < ras.target.rows ) + { + bits -= e1 * ras.target.pitch; + if ( ras.target.pitch > 0 ) + bits += ( ras.target.rows - 1 ) * ras.target.pitch; + + bits[0] |= f1; + } + } + + + static void + Horizontal_Sweep_Step( RAS_ARG ) + { + /* Nothing, really */ + FT_UNUSED_RASTER; + } + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + + /*************************************************************************/ + /* */ + /* Vertical Gray Sweep Procedure Set */ + /* */ + /* These two routines are used during the vertical gray-levels sweep */ + /* phase by the generic Draw_Sweep() function. */ + /* */ + /* NOTES */ + /* */ + /* - The target pixmap's width *must* be a multiple of 4. */ + /* */ + /* - You have to use the function Vertical_Sweep_Span() for the gray */ + /* span call. */ + /* */ + /*************************************************************************/ + + static void + Vertical_Gray_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + Long pitch, byte_len; + + + *min = *min & -2; + *max = ( *max + 3 ) & -2; + + ras.traceOfs = 0; + pitch = ras.target.pitch; + byte_len = -pitch; + ras.traceIncr = (Short)byte_len; + ras.traceG = ( *min / 2 ) * byte_len; + + if ( pitch > 0 ) + { + ras.traceG += ( ras.target.rows - 1 ) * pitch; + byte_len = -byte_len; + } + + ras.gray_min_x = (Short)byte_len; + ras.gray_max_x = -(Short)byte_len; + } + + + static void + Vertical_Gray_Sweep_Step( RAS_ARG ) + { + Int c1, c2; + PByte pix, bit, bit2; + char* count = (char*)count_table; + Byte* grays; + + + ras.traceOfs += ras.gray_width; + + if ( ras.traceOfs > ras.gray_width ) + { + pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4; + grays = ras.grays; + + if ( ras.gray_max_x >= 0 ) + { + Long last_pixel = ras.target.width - 1; + Int last_cell = last_pixel >> 2; + Int last_bit = last_pixel & 3; + Bool over = 0; + + + if ( ras.gray_max_x >= last_cell && last_bit != 3 ) + { + ras.gray_max_x = last_cell - 1; + over = 1; + } + + if ( ras.gray_min_x < 0 ) + ras.gray_min_x = 0; + + bit = ras.bTarget + ras.gray_min_x; + bit2 = bit + ras.gray_width; + + c1 = ras.gray_max_x - ras.gray_min_x; + + while ( c1 >= 0 ) + { + c2 = count[*bit] + count[*bit2]; + + if ( c2 ) + { + pix[0] = grays[(c2 >> 12) & 0x000F]; + pix[1] = grays[(c2 >> 8 ) & 0x000F]; + pix[2] = grays[(c2 >> 4 ) & 0x000F]; + pix[3] = grays[ c2 & 0x000F]; + + *bit = 0; + *bit2 = 0; + } + + bit++; + bit2++; + pix += 4; + c1--; + } + + if ( over ) + { + c2 = count[*bit] + count[*bit2]; + if ( c2 ) + { + switch ( last_bit ) + { + case 2: + pix[2] = grays[(c2 >> 4 ) & 0x000F]; + case 1: + pix[1] = grays[(c2 >> 8 ) & 0x000F]; + default: + pix[0] = grays[(c2 >> 12) & 0x000F]; + } + + *bit = 0; + *bit2 = 0; + } + } + } + + ras.traceOfs = 0; + ras.traceG += ras.traceIncr; + + ras.gray_min_x = 32000; + ras.gray_max_x = -32000; + } + } + + + static void + Horizontal_Gray_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + /* nothing, really */ + FT_UNUSED_RASTER; + FT_UNUSED( y ); + FT_UNUSED( x1 ); + FT_UNUSED( x2 ); + FT_UNUSED( left ); + FT_UNUSED( right ); + } + + + static void + Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + PByte pixel; + Byte color; + + + /* During the horizontal sweep, we only take care of drop-outs */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 > e2 ) + { + if ( e1 == e2 + ras.precision ) + { + switch ( ras.dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + e1 = e2; + break; + + case 4: /* smart drop-outs including stubs */ + e1 = FLOOR( ( x1 + x2 + 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + /* see Vertical_Sweep_Drop for details */ + + /* rightmost stub test */ + if ( left->next == right && left->height <= 0 ) + return; + + /* leftmost stub test */ + if ( right->next == left && left->start == y ) + return; + + if ( ras.dropOutControl == 1 ) + e1 = e2; + else + e1 = FLOOR( ( x1 + x2 + 1 ) / 2 + ras.precision_half ); + + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + } + else + return; + } + + if ( e1 >= 0 ) + { + if ( x2 - x1 >= ras.precision_half ) + color = ras.grays[2]; + else + color = ras.grays[1]; + + e1 = TRUNC( e1 ) / 2; + if ( e1 < ras.target.rows ) + { + pixel = ras.gTarget - e1 * ras.target.pitch + y / 2; + if ( ras.target.pitch > 0 ) + pixel += ( ras.target.rows - 1 ) * ras.target.pitch; + + if ( pixel[0] == ras.grays[0] ) + pixel[0] = color; + } + } + } + + +#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ + + + /*************************************************************************/ + /* */ + /* Generic Sweep Drawing routine */ + /* */ + /*************************************************************************/ + + static Bool + Draw_Sweep( RAS_ARG ) + { + Short y, y_change, y_height; + + PProfile P, Q, P_Left, P_Right; + + Short min_Y, max_Y, top, bottom, dropouts; + + Long x1, x2, xs, e1, e2; + + TProfileList waiting; + TProfileList draw_left, draw_right; + + + /* initialize empty linked lists */ + + Init_Linked( &waiting ); + + Init_Linked( &draw_left ); + Init_Linked( &draw_right ); + + /* first, compute min and max Y */ + + P = ras.fProfile; + max_Y = (Short)TRUNC( ras.minY ); + min_Y = (Short)TRUNC( ras.maxY ); + + while ( P ) + { + Q = P->link; + + bottom = (Short)P->start; + top = (Short)( P->start + P->height - 1 ); + + if ( min_Y > bottom ) + min_Y = bottom; + if ( max_Y < top ) + max_Y = top; + + P->X = 0; + InsNew( &waiting, P ); + + P = Q; + } + + /* check the Y-turns */ + if ( ras.numTurns == 0 ) + { + ras.error = Raster_Err_Invalid; + return FAILURE; + } + + /* now initialize the sweep */ + + ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y ); + + /* then compute the distance of each profile from min_Y */ + + P = waiting; + + while ( P ) + { + P->countL = (UShort)( P->start - min_Y ); + P = P->link; + } + + /* let's go */ + + y = min_Y; + y_height = 0; + + if ( ras.numTurns > 0 && + ras.sizeBuff[-ras.numTurns] == min_Y ) + ras.numTurns--; + + while ( ras.numTurns > 0 ) + { + /* check waiting list for new activations */ + + P = waiting; + + while ( P ) + { + Q = P->link; + P->countL -= y_height; + if ( P->countL == 0 ) + { + DelOld( &waiting, P ); + + switch ( P->flow ) + { + case Flow_Up: + InsNew( &draw_left, P ); + break; + + case Flow_Down: + InsNew( &draw_right, P ); + break; + } + } + + P = Q; + } + + /* sort the drawing lists */ + + Sort( &draw_left ); + Sort( &draw_right ); + + y_change = (Short)ras.sizeBuff[-ras.numTurns--]; + y_height = (Short)( y_change - y ); + + while ( y < y_change ) + { + /* let's trace */ + + dropouts = 0; + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + x1 = P_Left ->X; + x2 = P_Right->X; + + if ( x1 > x2 ) + { + xs = x1; + x1 = x2; + x2 = xs; + } + + e1 = FLOOR( x1 ); + e2 = CEILING( x2 ); + + if ( x2 - x1 <= ras.precision && + e1 != x1 && e2 != x2 ) + { + if ( e1 > e2 || e2 == e1 + ras.precision ) + { + if ( ras.dropOutControl != 2 ) + { + /* a drop-out was detected */ + + P_Left ->X = x1; + P_Right->X = x2; + + /* mark profile for drop-out processing */ + P_Left->countL = 1; + dropouts++; + } + + goto Skip_To_Next; + } + } + + ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right ); + + Skip_To_Next: + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + /* handle drop-outs _after_ the span drawing -- */ + /* drop-out processing has been moved out of the loop */ + /* for performance tuning */ + if ( dropouts > 0 ) + goto Scan_DropOuts; + + Next_Line: + + ras.Proc_Sweep_Step( RAS_VAR ); + + y++; + + if ( y < y_change ) + { + Sort( &draw_left ); + Sort( &draw_right ); + } + } + + /* now finalize the profiles that need it */ + + P = draw_left; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_left, P ); + P = Q; + } + + P = draw_right; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_right, P ); + P = Q; + } + } + + /* for gray-scaling, flush the bitmap scanline cache */ + while ( y <= max_Y ) + { + ras.Proc_Sweep_Step( RAS_VAR ); + y++; + } + + return SUCCESS; + + Scan_DropOuts: + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + if ( P_Left->countL ) + { + P_Left->countL = 0; +#if 0 + dropouts--; /* -- this is useful when debugging only */ +#endif + ras.Proc_Sweep_Drop( RAS_VARS y, + P_Left->X, + P_Right->X, + P_Left, + P_Right ); + } + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + goto Next_Line; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Single_Pass */ + /* */ + /* <Description> */ + /* Perform one sweep with sub-banding. */ + /* */ + /* <Input> */ + /* flipped :: If set, flip the direction of the outline. */ + /* */ + /* <Return> */ + /* Renderer error code. */ + /* */ + static int + Render_Single_Pass( RAS_ARGS Bool flipped ) + { + Short i, j, k; + + + while ( ras.band_top >= 0 ) + { + ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision; + ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision; + + ras.top = ras.buff; + + ras.error = Raster_Err_None; + + if ( Convert_Glyph( RAS_VARS flipped ) ) + { + if ( ras.error != Raster_Err_Overflow ) + return FAILURE; + + ras.error = Raster_Err_None; + + /* sub-banding */ + +#ifdef DEBUG_RASTER + ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) ); +#endif + + i = ras.band_stack[ras.band_top].y_min; + j = ras.band_stack[ras.band_top].y_max; + + k = (Short)( ( i + j ) / 2 ); + + if ( ras.band_top >= 7 || k < i ) + { + ras.band_top = 0; + ras.error = Raster_Err_Invalid; + + return ras.error; + } + + ras.band_stack[ras.band_top + 1].y_min = k; + ras.band_stack[ras.band_top + 1].y_max = j; + + ras.band_stack[ras.band_top].y_max = (Short)( k - 1 ); + + ras.band_top++; + } + else + { + if ( ras.fProfile ) + if ( Draw_Sweep( RAS_VAR ) ) + return ras.error; + ras.band_top--; + } + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Glyph */ + /* */ + /* <Description> */ + /* Render a glyph in a bitmap. Sub-banding if needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + Render_Glyph( RAS_ARG ) + { + FT_Error error; + + + Set_High_Precision( RAS_VARS ras.outline.flags & + FT_OUTLINE_HIGH_PRECISION ); + ras.scale_shift = ras.precision_shift; + + if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) + ras.dropOutControl = 2; + else + { + if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) + ras.dropOutControl = 4; + else + ras.dropOutControl = 0; + + if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) + ras.dropOutControl += 1; + } + + ras.second_pass = (FT_Byte)( !( ras.outline.flags & + FT_OUTLINE_SINGLE_PASS ) ); + + /* Vertical Sweep */ + ras.Proc_Sweep_Init = Vertical_Sweep_Init; + ras.Proc_Sweep_Span = Vertical_Sweep_Span; + ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; + ras.Proc_Sweep_Step = Vertical_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (short)( ras.target.rows - 1 ); + + ras.bWidth = (unsigned short)ras.target.width; + ras.bTarget = (Byte*)ras.target.buffer; + + if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 ) + return error; + + /* Horizontal Sweep */ + if ( ras.second_pass && ras.dropOutControl != 2 ) + { + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (short)( ras.target.width - 1 ); + + if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 ) + return error; + } + + return Raster_Err_None; + } + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Gray_Glyph */ + /* */ + /* <Description> */ + /* Render a glyph with grayscaling. Sub-banding if needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + Render_Gray_Glyph( RAS_ARG ) + { + Long pixel_width; + FT_Error error; + + + Set_High_Precision( RAS_VARS ras.outline.flags & + FT_OUTLINE_HIGH_PRECISION ); + ras.scale_shift = ras.precision_shift + 1; + + if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) + ras.dropOutControl = 2; + else + { + if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) + ras.dropOutControl = 4; + else + ras.dropOutControl = 0; + + if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) + ras.dropOutControl += 1; + } + + ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS ); + + /* Vertical Sweep */ + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = 2 * ras.target.rows - 1; + + ras.bWidth = ras.gray_width; + pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 ); + + if ( ras.bWidth > pixel_width ) + ras.bWidth = pixel_width; + + ras.bWidth = ras.bWidth * 8; + ras.bTarget = (Byte*)ras.gray_lines; + ras.gTarget = (Byte*)ras.target.buffer; + + ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init; + ras.Proc_Sweep_Span = Vertical_Sweep_Span; + ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; + ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step; + + error = Render_Single_Pass( RAS_VARS 0 ); + if ( error ) + return error; + + /* Horizontal Sweep */ + if ( ras.second_pass && ras.dropOutControl != 2 ) + { + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = ras.target.width * 2 - 1; + + error = Render_Single_Pass( RAS_VARS 1 ); + if ( error ) + return error; + } + + return Raster_Err_None; + } + +#else /* !FT_RASTER_OPTION_ANTI_ALIASING */ + + FT_LOCAL_DEF( FT_Error ) + Render_Gray_Glyph( RAS_ARG ) + { + FT_UNUSED_RASTER; + + return Raster_Err_Unsupported; + } + +#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */ + + + static void + ft_black_init( PRaster raster ) + { +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + FT_UInt n; + + + /* set default 5-levels gray palette */ + for ( n = 0; n < 5; n++ ) + raster->grays[n] = n * 255 / 4; + + raster->gray_width = RASTER_GRAY_LINES / 2; + +#else + FT_UNUSED( raster ); +#endif + } + + + /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/ + /**** a static object. *****/ + + +#ifdef _STANDALONE_ + + + static int + ft_black_new( void* memory, + FT_Raster *araster ) + { + static TRaster the_raster; + + + *araster = (FT_Raster)&the_raster; + FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + ft_black_init( &the_raster ); + + return 0; + } + + + static void + ft_black_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + + +#else /* _STANDALONE_ */ + + + static int + ft_black_new( FT_Memory memory, + PRaster *araster ) + { + FT_Error error; + PRaster raster; + + + *araster = 0; + if ( !FT_NEW( raster ) ) + { + raster->memory = memory; + ft_black_init( raster ); + + *araster = raster; + } + + return error; + } + + + static void + ft_black_done( PRaster raster ) + { + FT_Memory memory = (FT_Memory)raster->memory; + FT_FREE( raster ); + } + + +#endif /* _STANDALONE_ */ + + + static void + ft_black_reset( PRaster raster, + char* pool_base, + long pool_size ) + { + if ( raster ) + { + if ( pool_base && pool_size >= (long)sizeof(TWorker) + 2048 ) + { + PWorker worker = (PWorker)pool_base; + + + raster->buffer = pool_base + ( (sizeof ( *worker ) + 7 ) & ~7 ); + raster->buffer_size = ( ( pool_base + pool_size ) - + (char*)raster->buffer ) / sizeof ( Long ); + raster->worker = worker; + } + else + { + raster->buffer = NULL; + raster->buffer_size = 0; + raster->worker = NULL; + } + } + } + + + static void + ft_black_set_mode( PRaster raster, + unsigned long mode, + const char* palette ) + { +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) ) + { + /* set 5-levels gray palette */ + raster->grays[0] = palette[0]; + raster->grays[1] = palette[1]; + raster->grays[2] = palette[2]; + raster->grays[3] = palette[3]; + raster->grays[4] = palette[4]; + } + +#else + + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( palette ); + +#endif + } + + + static int + ft_black_render( PRaster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + PWorker worker; + + + if ( !raster || !raster->buffer || !raster->buffer_size ) + return Raster_Err_Not_Ini; + + if ( !outline ) + return Raster_Err_Invalid; + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return Raster_Err_None; + + if ( !outline->contours || !outline->points ) + return Raster_Err_Invalid; + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return Raster_Err_Invalid; + + worker = raster->worker; + + /* this version of the raster does not support direct rendering, sorry */ + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + return Raster_Err_Unsupported; + + if ( !target_map ) + return Raster_Err_Invalid; + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return Raster_Err_None; + + if ( !target_map->buffer ) + return Raster_Err_Invalid; + + ras.outline = *outline; + ras.target = *target_map; + + worker->buff = (PLong) raster->buffer; + worker->sizeBuff = worker->buff + + raster->buffer_size / sizeof ( Long ); +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + worker->grays = raster->grays; + worker->gray_width = raster->gray_width; +#endif + + return ( ( params->flags & FT_RASTER_FLAG_AA ) + ? Render_Gray_Glyph( RAS_VAR ) + : Render_Glyph( RAS_VAR ) ); + } + + + const FT_Raster_Funcs ft_standard_raster = + { + FT_GLYPH_FORMAT_OUTLINE, + (FT_Raster_New_Func) ft_black_new, + (FT_Raster_Reset_Func) ft_black_reset, + (FT_Raster_Set_Mode_Func)ft_black_set_mode, + (FT_Raster_Render_Func) ft_black_render, + (FT_Raster_Done_Func) ft_black_done + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/raster/ftraster.h b/src/3rdparty/freetype/src/raster/ftraster.h new file mode 100644 index 0000000000..80fe46deba --- /dev/null +++ b/src/3rdparty/freetype/src/raster/ftraster.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ftraster.h */ +/* */ +/* The FreeType glyph rasterizer (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRASTER_H__ +#define __FTRASTER_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_IMAGE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Uncomment the following line if you are using ftraster.c as a */ + /* standalone module, fully independent of FreeType. */ + /* */ +/* #define _STANDALONE_ */ + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster; + + +FT_END_HEADER + +#endif /* __FTRASTER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/raster/ftrend1.c b/src/3rdparty/freetype/src/raster/ftrend1.c new file mode 100644 index 0000000000..3cc8d07413 --- /dev/null +++ b/src/3rdparty/freetype/src/raster/ftrend1.c @@ -0,0 +1,273 @@ +/***************************************************************************/ +/* */ +/* ftrend1.c */ +/* */ +/* The FreeType glyph rasterizer interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftrend1.h" +#include "ftraster.h" + +#include "rasterrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_raster1_init( FT_Renderer render ) + { + FT_Library library = FT_MODULE_LIBRARY( render ); + + + render->clazz->raster_class->raster_reset( render->raster, + library->raster_pool, + library->raster_pool_size ); + + return Raster_Err_Ok; + } + + + /* set render-specific mode */ + static FT_Error + ft_raster1_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + + /* transform a given glyph image */ + static FT_Error + ft_raster1_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = Raster_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = Raster_Err_Invalid_Argument; + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_raster1_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_raster1_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + FT_Outline* outline; + FT_BBox cbox; + FT_UInt width, height, pitch; + FT_Bitmap* bitmap; + FT_Memory memory; + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = Raster_Err_Invalid_Argument; + goto Exit; + } + + /* check rendering mode */ + if ( mode != FT_RENDER_MODE_MONO ) + { + /* raster1 is only capable of producing monochrome bitmaps */ + if ( render->clazz == &ft_raster1_renderer_class ) + return Raster_Err_Cannot_Render_Glyph; + } + else + { + /* raster5 is only capable of producing 5-gray-levels bitmaps */ + if ( render->clazz == &ft_raster5_renderer_class ) + return Raster_Err_Cannot_Render_Glyph; + } + + outline = &slot->outline; + + /* translate the outline to the new origin if needed */ + if ( origin ) + FT_Outline_Translate( outline, origin->x, origin->y ); + + /* compute the control box, and grid fit it */ + FT_Outline_Get_CBox( outline, &cbox ); + + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + + width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); + height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); + bitmap = &slot->bitmap; + memory = render->root.memory; + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + /* allocate new one, depends on pixel format */ + if ( !( mode & FT_RENDER_MODE_MONO ) ) + { + /* we pad to 32 bits, only for backwards compatibility with FT 1.x */ + pitch = FT_PAD_CEIL( width, 4 ); + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + } + else + { + pitch = ( ( width + 15 ) >> 4 ) << 1; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + } + + bitmap->width = width; + bitmap->rows = height; + bitmap->pitch = pitch; + + if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + /* translate outline to render it into the bitmap */ + FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin ); + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = 0; + + if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY ) + params.flags |= FT_RASTER_FLAG_AA; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + FT_Outline_Translate( outline, cbox.xMin, cbox.yMin ); + + if ( error ) + goto Exit; + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 ); + slot->bitmap_top = (FT_Int)( cbox.yMax >> 6 ); + + Exit: + return error; + } + + + FT_CALLBACK_TABLE_DEF + const FT_Renderer_Class ft_raster1_renderer_class = + { + { + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "raster1", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_raster1_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_raster1_render, + (FT_Renderer_TransformFunc)ft_raster1_transform, + (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, + (FT_Renderer_SetModeFunc) ft_raster1_set_mode, + + (FT_Raster_Funcs*) &ft_standard_raster + }; + + + /* This renderer is _NOT_ part of the default modules; you will need */ + /* to register it by hand in your application. It should only be */ + /* used for backwards-compatibility with FT 1.x anyway. */ + /* */ + FT_CALLBACK_TABLE_DEF + const FT_Renderer_Class ft_raster5_renderer_class = + { + { + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "raster5", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_raster1_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_raster1_render, + (FT_Renderer_TransformFunc)ft_raster1_transform, + (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, + (FT_Renderer_SetModeFunc) ft_raster1_set_mode, + + (FT_Raster_Funcs*) &ft_standard_raster + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/raster/ftrend1.h b/src/3rdparty/freetype/src/raster/ftrend1.h new file mode 100644 index 0000000000..76e9a5f581 --- /dev/null +++ b/src/3rdparty/freetype/src/raster/ftrend1.h @@ -0,0 +1,44 @@ +/***************************************************************************/ +/* */ +/* ftrend1.h */ +/* */ +/* The FreeType glyph rasterizer interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTREND1_H__ +#define __FTREND1_H__ + + +#include <ft2build.h> +#include FT_RENDER_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_raster1_renderer_class; + + /* this renderer is _NOT_ part of the default modules, you'll need */ + /* to register it by hand in your application. It should only be */ + /* used for backwards-compatibility with FT 1.x anyway. */ + /* */ + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_raster5_renderer_class; + + +FT_END_HEADER + +#endif /* __FTREND1_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/raster/module.mk b/src/3rdparty/freetype/src/raster/module.mk new file mode 100644 index 0000000000..cbff5df96e --- /dev/null +++ b/src/3rdparty/freetype/src/raster/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 renderer module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += RASTER_MODULE + +define RASTER_MODULE +$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)raster $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/raster/raster.c b/src/3rdparty/freetype/src/raster/raster.c new file mode 100644 index 0000000000..f13a67a209 --- /dev/null +++ b/src/3rdparty/freetype/src/raster/raster.c @@ -0,0 +1,26 @@ +/***************************************************************************/ +/* */ +/* raster.c */ +/* */ +/* FreeType monochrome rasterer module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ftraster.c" +#include "ftrend1.c" + + +/* END */ diff --git a/src/3rdparty/freetype/src/raster/rasterrs.h b/src/3rdparty/freetype/src/raster/rasterrs.h new file mode 100644 index 0000000000..5df9a7ab1e --- /dev/null +++ b/src/3rdparty/freetype/src/raster/rasterrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* rasterrs.h */ +/* */ +/* monochrome renderer error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the monochrome renderer error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __RASTERRS_H__ +#define __RASTERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX Raster_Err_ +#define FT_ERR_BASE FT_Mod_Err_Raster + +#include FT_ERRORS_H + +#endif /* __RASTERRS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/raster/rules.mk b/src/3rdparty/freetype/src/raster/rules.mk new file mode 100644 index 0000000000..43a9af2b79 --- /dev/null +++ b/src/3rdparty/freetype/src/raster/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 renderer module build rules +# + + +# Copyright 1996-2000, 2001, 2003, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# raster driver directory +# +RASTER_DIR := $(SRC_DIR)/raster + +# compilation flags for the driver +# +RASTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR)) + + +# raster driver sources (i.e., C files) +# +RASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \ + $(RASTER_DIR)/ftrend1.c + + +# raster driver headers +# +RASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \ + $(RASTER_DIR)/ftmisc.h \ + $(RASTER_DIR)/rasterrs.h + + +# raster driver object(s) +# +# RASTER_DRV_OBJ_M is used during `multi' builds. +# RASTER_DRV_OBJ_S is used during `single' builds. +# +RASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O) +RASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O + +# raster driver source file for single build +# +RASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c + + +# raster driver - single object +# +$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \ + $(FREETYPE_H) $(RASTER_DRV_H) + $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S)) + + +# raster driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H) + $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(RASTER_DRV_OBJ_S) +DRV_OBJS_M += $(RASTER_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/sfnt/Jamfile b/src/3rdparty/freetype/src/sfnt/Jamfile new file mode 100644 index 0000000000..ad467bebec --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/sfnt Jamfile +# +# Copyright 2001, 2002, 2004, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf ; + } + else + { + _sources = sfnt ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/sfnt Jamfile diff --git a/src/3rdparty/freetype/src/sfnt/module.mk b/src/3rdparty/freetype/src/sfnt/module.mk new file mode 100644 index 0000000000..95fd6a3143 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 SFNT module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += SFNT_MODULE + +define SFNT_MODULE +$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)sfnt $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/sfnt/rules.mk b/src/3rdparty/freetype/src/sfnt/rules.mk new file mode 100644 index 0000000000..abda74fcaa --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/rules.mk @@ -0,0 +1,79 @@ +# +# FreeType 2 SFNT driver configuration rules +# + + +# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# SFNT driver directory +# +SFNT_DIR := $(SRC_DIR)/sfnt + + +# compilation flags for the driver +# +SFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR)) + + +# SFNT driver sources (i.e., C files) +# +SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c \ + $(SFNT_DIR)/ttmtx.c \ + $(SFNT_DIR)/ttcmap.c \ + $(SFNT_DIR)/ttsbit.c \ + $(SFNT_DIR)/ttpost.c \ + $(SFNT_DIR)/ttkern.c \ + $(SFNT_DIR)/ttbdf.c \ + $(SFNT_DIR)/sfobjs.c \ + $(SFNT_DIR)/sfdriver.c + +# SFNT driver headers +# +# Note that ttsbit0.c gets #included by ttsbit.c. +# +SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h) \ + $(SFNT_DIR)/sferrors.h \ + $(SFNT_DIR)/ttsbit0.c + + +# SFNT driver object(s) +# +# SFNT_DRV_OBJ_M is used during `multi' builds. +# SFNT_DRV_OBJ_S is used during `single' builds. +# +SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O) +SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O + +# SFNT driver source file for single build +# +SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c + + +# SFNT driver - single object +# +$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \ + $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S)) + + +# SFNT driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(SFNT_DRV_OBJ_S) +DRV_OBJS_M += $(SFNT_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/sfnt/sfdriver.c b/src/3rdparty/freetype/src/sfnt/sfdriver.c new file mode 100644 index 0000000000..142ef767da --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/sfdriver.c @@ -0,0 +1,643 @@ +/***************************************************************************/ +/* */ +/* sfdriver.c */ +/* */ +/* High-level SFNT driver interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + +#include "sfdriver.h" +#include "ttload.h" +#include "sfobjs.h" + +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.h" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.h" +#endif + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#include FT_SERVICE_BDF_H +#endif + +#include "ttcmap.h" +#include "ttkern.h" +#include "ttmtx.h" + +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TT_CMAP_H + + + /* + * SFNT TABLE SERVICE + * + */ + + static void* + get_sfnt_table( TT_Face face, + FT_Sfnt_Tag tag ) + { + void* table; + + + switch ( tag ) + { + case ft_sfnt_head: + table = &face->header; + break; + + case ft_sfnt_hhea: + table = &face->horizontal; + break; + + case ft_sfnt_vhea: + table = face->vertical_info ? &face->vertical : 0; + break; + + case ft_sfnt_os2: + table = face->os2.version == 0xFFFFU ? 0 : &face->os2; + break; + + case ft_sfnt_post: + table = &face->postscript; + break; + + case ft_sfnt_maxp: + table = &face->max_profile; + break; + + case ft_sfnt_pclt: + table = face->pclt.Version ? &face->pclt : 0; + break; + + default: + table = 0; + } + + return table; + } + + + static FT_Error + sfnt_table_info( TT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *length ) + { + if ( !tag || !length ) + return SFNT_Err_Invalid_Argument; + + if ( idx >= face->num_tables ) + return SFNT_Err_Table_Missing; + + *tag = face->dir_tables[idx].Tag; + *length = face->dir_tables[idx].Length; + + return SFNT_Err_Ok; + } + + + static const FT_Service_SFNT_TableRec sfnt_service_sfnt_table = + { + (FT_SFNT_TableLoadFunc)tt_face_load_any, + (FT_SFNT_TableGetFunc) get_sfnt_table, + (FT_SFNT_TableInfoFunc)sfnt_table_info + }; + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + sfnt_get_glyph_name( TT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_String* gname; + FT_Error error; + + + error = tt_face_get_ps_name( face, glyph_index, &gname ); + if ( !error ) + FT_STRCPYN( buffer, gname, buffer_max ); + + return error; + } + + + static FT_UInt + sfnt_get_name_index( TT_Face face, + FT_String* glyph_name ) + { + FT_Face root = &face->root; + FT_Long i; + + + for ( i = 0; i < root->num_glyphs; i++ ) + { + FT_String* gname; + FT_Error error = tt_face_get_ps_name( face, i, &gname ); + + + if ( error ) + continue; + + if ( !ft_strcmp( glyph_name, gname ) ) + return (FT_UInt)i; + } + + return 0; + } + + + static const FT_Service_GlyphDictRec sfnt_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index + }; + +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + sfnt_get_ps_name( TT_Face face ) + { + FT_Int n, found_win, found_apple; + const char* result = NULL; + + + /* shouldn't happen, but just in case to avoid memory leaks */ + if ( face->postscript_name ) + return face->postscript_name; + + /* scan the name table to see whether we have a Postscript name here, */ + /* either in Macintosh or Windows platform encodings */ + found_win = -1; + found_apple = -1; + + for ( n = 0; n < face->num_names; n++ ) + { + TT_NameEntryRec* name = face->name_table.names + n; + + + if ( name->nameID == 6 && name->stringLength > 0 ) + { + if ( name->platformID == 3 && + name->encodingID == 1 && + name->languageID == 0x409 ) + found_win = n; + + if ( name->platformID == 1 && + name->encodingID == 0 && + name->languageID == 0 ) + found_apple = n; + } + } + + if ( found_win != -1 ) + { + FT_Memory memory = face->root.memory; + TT_NameEntryRec* name = face->name_table.names + found_win; + FT_UInt len = name->stringLength / 2; + FT_Error error = SFNT_Err_Ok; + + FT_UNUSED( error ); + + + if ( !FT_ALLOC( result, name->stringLength + 1 ) ) + { + FT_Stream stream = face->name_table.stream; + FT_String* r = (FT_String*)result; + FT_Byte* p = (FT_Byte*)name->string; + + + if ( FT_STREAM_SEEK( name->stringOffset ) || + FT_FRAME_ENTER( name->stringLength ) ) + { + FT_FREE( result ); + name->stringLength = 0; + name->stringOffset = 0; + FT_FREE( name->string ); + + goto Exit; + } + + p = (FT_Byte*)stream->cursor; + + for ( ; len > 0; len--, p += 2 ) + { + if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 ) + *r++ = p[1]; + } + *r = '\0'; + + FT_FRAME_EXIT(); + } + goto Exit; + } + + if ( found_apple != -1 ) + { + FT_Memory memory = face->root.memory; + TT_NameEntryRec* name = face->name_table.names + found_apple; + FT_UInt len = name->stringLength; + FT_Error error = SFNT_Err_Ok; + + FT_UNUSED( error ); + + + if ( !FT_ALLOC( result, len + 1 ) ) + { + FT_Stream stream = face->name_table.stream; + + + if ( FT_STREAM_SEEK( name->stringOffset ) || + FT_STREAM_READ( result, len ) ) + { + name->stringOffset = 0; + name->stringLength = 0; + FT_FREE( name->string ); + FT_FREE( result ); + goto Exit; + } + ((char*)result)[len] = '\0'; + } + } + + Exit: + face->postscript_name = result; + return result; + } + + static const FT_Service_PsFontNameRec sfnt_service_ps_name = + { + (FT_PsName_GetFunc)sfnt_get_ps_name + }; + + + /* + * TT CMAP INFO + */ + static const FT_Service_TTCMapsRec tt_service_get_cmap_info = + { + (TT_CMap_Info_GetFunc)tt_get_cmap_info + }; + + +#ifdef TT_CONFIG_OPTION_BDF + + static FT_Error + sfnt_get_charset_id( TT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + BDF_PropertyRec encoding, registry; + FT_Error error; + + + /* XXX: I don't know whether this is correct, since + * tt_face_find_bdf_prop only returns something correct if we have + * previously selected a size that is listed in the BDF table. + * Should we change the BDF table format to include single offsets + * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? + */ + error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); + if ( !error ) + { + error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); + if ( !error ) + { + if ( registry.type == BDF_PROPERTY_TYPE_ATOM && + encoding.type == BDF_PROPERTY_TYPE_ATOM ) + { + *acharset_encoding = encoding.u.atom; + *acharset_registry = registry.u.atom; + } + else + error = FT_Err_Invalid_Argument; + } + } + + return error; + } + + + static const FT_Service_BDFRec sfnt_service_bdf = + { + (FT_BDF_GetCharsetIdFunc) sfnt_get_charset_id, + (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop, + }; + +#endif /* TT_CONFIG_OPTION_BDF */ + + + /* + * SERVICE LIST + */ + + static const FT_ServiceDescRec sfnt_services[] = + { + { FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name }, +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + { FT_SERVICE_ID_GLYPH_DICT, &sfnt_service_glyph_dict }, +#endif +#ifdef TT_CONFIG_OPTION_BDF + { FT_SERVICE_ID_BDF, &sfnt_service_bdf }, +#endif + { FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info }, + + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + sfnt_get_interface( FT_Module module, + const char* module_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( sfnt_services, module_interface ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_sfnt_header_stub( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header header ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + FT_UNUSED( face_index ); + FT_UNUSED( header ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_directory_stub( TT_Face face, + FT_Stream stream, + SFNT_Header header ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + FT_UNUSED( header ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_hdmx_stub( TT_Face face, + FT_Stream stream ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( void ) + tt_face_free_hdmx_stub( TT_Face face ) + { + FT_UNUSED( face ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_set_sbit_strike_stub( TT_Face face, + FT_UInt x_ppem, + FT_UInt y_ppem, + FT_ULong* astrike_index ) + { + /* + * We simply forge a FT_Size_Request and call the real function + * that does all the work. + * + * This stub might be called by libXfont in the X.Org Xserver, + * compiled against version 2.1.8 or newer. + */ + + FT_Size_RequestRec req; + + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = (FT_F26Dot6)x_ppem; + req.height = (FT_F26Dot6)y_ppem; + req.horiResolution = 0; + req.vertResolution = 0; + + *astrike_index = 0x7FFFFFFFUL; + + return tt_face_set_sbit_strike( face, &req, astrike_index ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_sbit_stub( TT_Face face, + FT_Stream stream ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + + /* + * This function was originally implemented to load the sbit table. + * However, it has been replaced by `tt_face_load_eblc', and this stub + * is only there for some rogue clients which would want to call it + * directly (which doesn't make much sense). + */ + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( void ) + tt_face_free_sbit_stub( TT_Face face ) + { + /* nothing to do in this stub */ + FT_UNUSED( face ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_charmap_stub( TT_Face face, + void* cmap, + FT_Stream input ) + { + FT_UNUSED( face ); + FT_UNUSED( cmap ); + FT_UNUSED( input ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_free_charmap_stub( TT_Face face, + void* cmap ) + { + FT_UNUSED( face ); + FT_UNUSED( cmap ); + + return 0; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + static + const SFNT_Interface sfnt_interface = + { + tt_face_goto_table, + + sfnt_init_face, + sfnt_load_face, + sfnt_done_face, + sfnt_get_interface, + + tt_face_load_any, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_load_sfnt_header_stub, + tt_face_load_directory_stub, +#endif + + tt_face_load_head, + tt_face_load_hhea, + tt_face_load_cmap, + tt_face_load_maxp, + tt_face_load_os2, + tt_face_load_post, + + tt_face_load_name, + tt_face_free_name, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_load_hdmx_stub, + tt_face_free_hdmx_stub, +#endif + + tt_face_load_kern, + tt_face_load_gasp, + tt_face_load_pclt, + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + /* see `ttload.h' */ + tt_face_load_bhed, +#else + 0, +#endif + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_set_sbit_strike_stub, + tt_face_load_sbit_stub, + + tt_find_sbit_image, + tt_load_sbit_metrics, +#endif + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + tt_face_load_sbit_image, +#else + 0, +#endif + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_free_sbit_stub, +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + /* see `ttpost.h' */ + tt_face_get_ps_name, + tt_face_free_ps_names, +#else + 0, + 0, +#endif + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + tt_face_load_charmap_stub, + tt_face_free_charmap_stub, +#endif + + /* since version 2.1.8 */ + + tt_face_get_kerning, + + /* since version 2.2 */ + + tt_face_load_font_dir, + tt_face_load_hmtx, + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + /* see `ttsbit.h' and `sfnt.h' */ + tt_face_load_eblc, + tt_face_free_eblc, + + tt_face_set_sbit_strike, + tt_face_load_strike_metrics, +#else + 0, + 0, + 0, + 0, +#endif + + tt_face_get_metrics + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class sfnt_module_class = + { + 0, /* not a font driver or renderer */ + sizeof( FT_ModuleRec ), + + "sfnt", /* driver name */ + 0x10000L, /* driver version 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or higher */ + + (const void*)&sfnt_interface, /* module specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) sfnt_get_interface + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sfdriver.h b/src/3rdparty/freetype/src/sfnt/sfdriver.h new file mode 100644 index 0000000000..92db79694d --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/sfdriver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* sfdriver.h */ +/* */ +/* High-level SFNT driver interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFDRIVER_H__ +#define __SFDRIVER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Module_Class ) sfnt_module_class; + + +FT_END_HEADER + +#endif /* __SFDRIVER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sferrors.h b/src/3rdparty/freetype/src/sfnt/sferrors.h new file mode 100644 index 0000000000..27f90de285 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/sferrors.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* sferrors.h */ +/* */ +/* SFNT error codes (specification only). */ +/* */ +/* Copyright 2001, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the SFNT error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __SFERRORS_H__ +#define __SFERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX SFNT_Err_ +#define FT_ERR_BASE FT_Mod_Err_SFNT + +#define FT_KEEP_ERR_PREFIX + +#include FT_ERRORS_H + +#endif /* __SFERRORS_H__ */ + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sfnt.c b/src/3rdparty/freetype/src/sfnt/sfnt.c new file mode 100644 index 0000000000..45a820b718 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/sfnt.c @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* sfnt.c */ +/* */ +/* Single object library component. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ttload.c" +#include "ttmtx.c" +#include "ttcmap.c" +#include "ttkern.c" +#include "sfobjs.c" +#include "sfdriver.c" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.c" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.c" +#endif + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.c" +#endif + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sfobjs.c b/src/3rdparty/freetype/src/sfnt/sfobjs.c new file mode 100644 index 0000000000..c826b92aa3 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/sfobjs.c @@ -0,0 +1,1130 @@ +/***************************************************************************/ +/* */ +/* sfobjs.c */ +/* */ +/* SFNT object management (base). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "sfobjs.h" +#include "ttload.h" +#include "ttcmap.h" +#include "ttkern.h" +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#endif + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_sfobjs + + + + /* convert a UTF-16 name entry to ASCII */ + static FT_String* + tt_name_entry_ascii_from_utf16( TT_NameEntry entry, + FT_Memory memory ) + { + FT_String* string; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength / 2; + + if ( FT_NEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = FT_NEXT_USHORT( read ); + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[len] = 0; + + return string; + } + + + /* convert an Apple Roman or symbol name entry to ASCII */ + static FT_String* + tt_name_entry_ascii_from_other( TT_NameEntry entry, + FT_Memory memory ) + { + FT_String* string; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength; + + if ( FT_NEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = *read++; + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[len] = 0; + + return string; + } + + + typedef FT_String* (*TT_NameEntry_ConvertFunc)( TT_NameEntry entry, + FT_Memory memory ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_name */ + /* */ + /* <Description> */ + /* Returns a given ENGLISH name record in ASCII. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* nameid :: The name id of the name record to return. */ + /* */ + /* <InOut> */ + /* name :: The address of a string pointer. NULL if no name is */ + /* present. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + tt_face_get_name( TT_Face face, + FT_UShort nameid, + FT_String** name ) + { + FT_Memory memory = face->root.memory; + FT_Error error = SFNT_Err_Ok; + FT_String* result = NULL; + FT_UShort n; + TT_NameEntryRec* rec; + FT_Int found_apple = -1; + FT_Int found_apple_roman = -1; + FT_Int found_apple_english = -1; + FT_Int found_win = -1; + FT_Int found_unicode = -1; + + FT_Bool is_english = 0; + + TT_NameEntry_ConvertFunc convert; + + + FT_ASSERT( name ); + + rec = face->name_table.names; + for ( n = 0; n < face->num_names; n++, rec++ ) + { + /* According to the OpenType 1.3 specification, only Microsoft or */ + /* Apple platform IDs might be used in the `name' table. The */ + /* `Unicode' platform is reserved for the `cmap' table, and the */ + /* `Iso' one is deprecated. */ + /* */ + /* However, the Apple TrueType specification doesn't say the same */ + /* thing and goes to suggest that all Unicode `name' table entries */ + /* should be coded in UTF-16 (in big-endian format I suppose). */ + /* */ + if ( rec->nameID == nameid && rec->stringLength > 0 ) + { + switch ( rec->platformID ) + { + case TT_PLATFORM_APPLE_UNICODE: + case TT_PLATFORM_ISO: + /* there is `languageID' to check there. We should use this */ + /* field only as a last solution when nothing else is */ + /* available. */ + /* */ + found_unicode = n; + break; + + case TT_PLATFORM_MACINTOSH: + /* This is a bit special because some fonts will use either */ + /* an English language id, or a Roman encoding id, to indicate */ + /* the English version of its font name. */ + /* */ + if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) + found_apple_english = n; + else if ( rec->encodingID == TT_MAC_ID_ROMAN ) + found_apple_roman = n; + break; + + case TT_PLATFORM_MICROSOFT: + /* we only take a non-English name when there is nothing */ + /* else available in the font */ + /* */ + if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 ) + { + switch ( rec->encodingID ) + { + case TT_MS_ID_SYMBOL_CS: + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_UCS_4: + is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 ); + found_win = n; + break; + + default: + ; + } + } + break; + + default: + ; + } + } + } + + found_apple = found_apple_roman; + if ( found_apple_english >= 0 ) + found_apple = found_apple_english; + + /* some fonts contain invalid Unicode or Macintosh formatted entries; */ + /* we will thus favor names encoded in Windows formats if available */ + /* (provided it is an English name) */ + /* */ + convert = NULL; + if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) ) + { + rec = face->name_table.names + found_win; + switch ( rec->encodingID ) + { + /* all Unicode strings are encoded using UTF-16BE */ + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_SYMBOL_CS: + convert = tt_name_entry_ascii_from_utf16; + break; + + case TT_MS_ID_UCS_4: + /* Apparently, if this value is found in a name table entry, it is */ + /* documented as `full Unicode repertoire'. Experience with the */ + /* MsGothic font shipped with Windows Vista shows that this really */ + /* means UTF-16 encoded names (UCS-4 values are only used within */ + /* charmaps). */ + convert = tt_name_entry_ascii_from_utf16; + break; + + default: + ; + } + } + else if ( found_apple >= 0 ) + { + rec = face->name_table.names + found_apple; + convert = tt_name_entry_ascii_from_other; + } + else if ( found_unicode >= 0 ) + { + rec = face->name_table.names + found_unicode; + convert = tt_name_entry_ascii_from_utf16; + } + + if ( rec && convert ) + { + if ( rec->string == NULL ) + { + FT_Stream stream = face->name_table.stream; + + + if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) || + FT_STREAM_SEEK( rec->stringOffset ) || + FT_STREAM_READ( rec->string, rec->stringLength ) ) + { + FT_FREE( rec->string ); + rec->stringLength = 0; + result = NULL; + goto Exit; + } + } + + result = convert( rec, memory ); + } + + Exit: + *name = result; + return error; + } + + + static FT_Encoding + sfnt_find_encoding( int platform_id, + int encoding_id ) + { + typedef struct TEncoding_ + { + int platform_id; + int encoding_id; + FT_Encoding encoding; + + } TEncoding; + + static + const TEncoding tt_encodings[] = + { + { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN }, + + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, FT_ENCODING_GB2312 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB } + }; + + const TEncoding *cur, *limit; + + + cur = tt_encodings; + limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); + + for ( ; cur < limit; cur++ ) + { + if ( cur->platform_id == platform_id ) + { + if ( cur->encoding_id == encoding_id || + cur->encoding_id == -1 ) + return cur->encoding; + } + } + + return FT_ENCODING_NONE; + } + + + /* Fill in face->ttc_header. If the font is not a TTC, it is */ + /* synthesized into a TTC with one offset table. */ + static FT_Error + sfnt_open_font( FT_Stream stream, + TT_Face face ) + { + FT_Memory memory = stream->memory; + FT_Error error; + FT_ULong tag, offset; + + static const FT_Frame_Field ttc_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TTC_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_LONG( version ), + FT_FRAME_LONG( count ), + FT_FRAME_END + }; + + + face->ttc_header.tag = 0; + face->ttc_header.version = 0; + face->ttc_header.count = 0; + + offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( tag ) ) + return error; + + if ( tag != 0x00010000UL && + tag != TTAG_ttcf && + tag != TTAG_OTTO && + tag != TTAG_true && + tag != TTAG_typ1 && + tag != 0x00020000UL ) + return SFNT_Err_Unknown_File_Format; + + face->ttc_header.tag = TTAG_ttcf; + + if ( tag == TTAG_ttcf ) + { + FT_Int n; + + + FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); + + if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) + return error; + + /* now read the offsets of each font in the file */ + if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) + return error; + + if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) + return error; + + for ( n = 0; n < face->ttc_header.count; n++ ) + face->ttc_header.offsets[n] = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + } + else + { + FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" )); + + face->ttc_header.version = 1 << 16; + face->ttc_header.count = 1; + + if ( FT_NEW( face->ttc_header.offsets ) ) + return error; + + face->ttc_header.offsets[0] = offset; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library = face->root.driver->root.library; + SFNT_Service sfnt; + + + /* for now, parameters are unused */ + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + sfnt = (SFNT_Service)face->sfnt; + if ( !sfnt ) + { + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + return SFNT_Err_Invalid_File_Format; + + face->sfnt = sfnt; + face->goto_table = sfnt->goto_table; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); + + error = sfnt_open_font( stream, face ); + if ( error ) + return error; + + FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index )); + + if ( face_index < 0 ) + face_index = 0; + + if ( face_index >= face->ttc_header.count ) + return SFNT_Err_Invalid_Argument; + + if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) + return error; + + /* check that we have a valid TrueType file */ + error = sfnt->load_font_dir( face, stream ); + if ( error ) + return error; + + face->root.num_faces = face->ttc_header.count; + face->root.face_index = face_index; + + return error; + } + + +#define LOAD_( x ) \ + do { \ + FT_TRACE2(( "`" #x "' " )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_##x( face, stream ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : ( error == SFNT_Err_Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define LOADM_( x, vertical ) \ + do { \ + FT_TRACE2(( "`%s" #x "' ", \ + vertical ? "vertical " : "" )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_##x( face, stream, vertical ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : ( error == SFNT_Err_Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define GET_NAME( id, field ) \ + do { \ + error = tt_face_get_name( face, TT_NAME_ID_##id, field ); \ + if ( error ) \ + goto Exit; \ + } while ( 0 ) + + + FT_LOCAL_DEF( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Error psnames_error; +#endif + FT_Bool has_outline; + FT_Bool is_apple_sbit; + + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_UNUSED( face_index ); + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + /* Load tables */ + + /* We now support two SFNT-based bitmapped font formats. They */ + /* are recognized easily as they do not include a `glyf' */ + /* table. */ + /* */ + /* The first format comes from Apple, and uses a table named */ + /* `bhed' instead of `head' to store the font header (using */ + /* the same format). It also doesn't include horizontal and */ + /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */ + /* missing). */ + /* */ + /* The other format comes from Microsoft, and is used with */ + /* WinCE/PocketPC. It looks like a standard TTF, except that */ + /* it doesn't contain outlines. */ + /* */ + + FT_TRACE2(( "sfnt_load_face: %08p\n\n", face )); + + /* do we have outlines in there? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 || + tt_face_lookup_table( face, TTAG_glyf ) != 0 || + tt_face_lookup_table( face, TTAG_CFF ) != 0 ); +#else + has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 || + tt_face_lookup_table( face, TTAG_CFF ) != 0 ); +#endif + + is_apple_sbit = 0; + + /* if this font doesn't contain outlines, we try to load */ + /* a `bhed' table */ + if ( !has_outline && sfnt->load_bhed ) + { + LOAD_( bhed ); + is_apple_sbit = FT_BOOL( !error ); + } + + /* load the font header (`head' table) if this isn't an Apple */ + /* sbit font file */ + if ( !is_apple_sbit ) + { + LOAD_( head ); + if ( error ) + goto Exit; + } + + if ( face->header.Units_Per_EM == 0 ) + { + error = SFNT_Err_Invalid_Table; + + goto Exit; + } + + /* the following tables are often not present in embedded TrueType */ + /* fonts within PDF documents, so don't check for them. */ + LOAD_( maxp ); + LOAD_( cmap ); + + /* the following tables are optional in PCL fonts -- */ + /* don't check for errors */ + LOAD_( name ); + LOAD_( post ); + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames_error = error; +#endif + + /* do not load the metrics headers and tables if this is an Apple */ + /* sbit font file */ + if ( !is_apple_sbit ) + { + /* load the `hhea' and `hmtx' tables */ + LOADM_( hhea, 0 ); + if ( !error ) + { + LOADM_( hmtx, 0 ); + if ( error == SFNT_Err_Table_Missing ) + { + error = SFNT_Err_Hmtx_Table_Missing; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hmtx' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = SFNT_Err_Ok; + } +#endif + } + } + else if ( error == SFNT_Err_Table_Missing ) + { + /* No `hhea' table necessary for SFNT Mac fonts. */ + if ( face->format_tag == TTAG_true ) + { + FT_TRACE2(( "This is an SFNT Mac font.\n" )); + has_outline = 0; + error = SFNT_Err_Ok; + } + else + { + error = SFNT_Err_Horiz_Header_Missing; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hhea' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = SFNT_Err_Ok; + } +#endif + + } + } + + if ( error ) + goto Exit; + + /* try to load the `vhea' and `vmtx' tables */ + LOADM_( hhea, 1 ); + if ( !error ) + { + LOADM_( hmtx, 1 ); + if ( !error ) + face->vertical_info = 1; + } + + if ( error && error != SFNT_Err_Table_Missing ) + goto Exit; + + LOAD_( os2 ); + if ( error ) + { + if ( error != SFNT_Err_Table_Missing ) + goto Exit; + + face->os2.version = 0xFFFFU; + } + } + + /* the optional tables */ + + /* embedded bitmap support */ + if ( sfnt->load_eblc ) + { + LOAD_( eblc ); + if ( error ) + { + /* a font which contains neither bitmaps nor outlines is */ + /* still valid (although rather useless in most cases); */ + /* however, you can find such stripped fonts in PDFs */ + if ( error == SFNT_Err_Table_Missing ) + error = SFNT_Err_Ok; + else + goto Exit; + } + } + + LOAD_( pclt ); + if ( error ) + { + if ( error != SFNT_Err_Table_Missing ) + goto Exit; + + face->pclt.Version = 0; + } + + /* consider the kerning and gasp tables as optional */ + LOAD_( gasp ); + LOAD_( kern ); + + face->root.num_glyphs = face->max_profile.numGlyphs; + + /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */ + /* a WWS-only font face. `WWS' stands for `weight', width', and */ + /* `slope', a term used by Microsoft's Windows Presentation */ + /* Foundation (WPF). This flag has been introduced in version */ + /* 1.5 of the OpenType specification (May 2008). */ + + if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 ) + { + GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + else + { + GET_NAME( WWS_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + GET_NAME( WWS_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + + /* now set up root fields */ + { + FT_Face root = &face->root; + FT_Int32 flags = root->face_flags; + + + /*********************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + if ( has_outline == TRUE ) + flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ + + /* The sfnt driver only supports bitmap fonts natively, thus we */ + /* don't set FT_FACE_FLAG_HINTER. */ + flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ + FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + if ( psnames_error == SFNT_Err_Ok && + face->postscript.FormatType != 0x00030000L ) + flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + /* fixed width font? */ + if ( face->postscript.isFixedPitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* vertical information? */ + if ( face->vertical_info ) + flags |= FT_FACE_FLAG_VERTICAL; + + /* kerning available ? */ + if ( TT_FACE_HAS_KERNING( face ) ) + flags |= FT_FACE_FLAG_KERNING; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Don't bother to load the tables unless somebody asks for them. */ + /* No need to do work which will (probably) not be used. */ + if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 && + tt_face_lookup_table( face, TTAG_fvar ) != 0 && + tt_face_lookup_table( face, TTAG_gvar ) != 0 ) + flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; +#endif + + root->face_flags = flags; + + /*********************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + + flags = 0; + if ( has_outline == TRUE && face->os2.version != 0xFFFFU ) + { + /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */ + /* indicates an oblique font face. This flag has been */ + /* introduced in version 1.5 of the OpenType specification. */ + + if ( face->os2.fsSelection & 512 ) /* bit 9 */ + flags |= FT_STYLE_FLAG_ITALIC; + else if ( face->os2.fsSelection & 1 ) /* bit 0 */ + flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->os2.fsSelection & 32 ) /* bit 5 */ + flags |= FT_STYLE_FLAG_BOLD; + } + else + { + /* this is an old Mac font, use the header field */ + + if ( face->header.Mac_Style & 1 ) + flags |= FT_STYLE_FLAG_BOLD; + + if ( face->header.Mac_Style & 2 ) + flags |= FT_STYLE_FLAG_ITALIC; + } + + root->style_flags = flags; + + /*********************************************************************/ + /* */ + /* Polish the charmaps. */ + /* */ + /* Try to set the charmap encoding according to the platform & */ + /* encoding ID of each charmap. */ + /* */ + + tt_face_build_cmaps( face ); /* ignore errors */ + + + /* set the encoding fields */ + { + FT_Int m; + + + for ( m = 0; m < root->num_charmaps; m++ ) + { + FT_CharMap charmap = root->charmaps[m]; + + + charmap->encoding = sfnt_find_encoding( charmap->platform_id, + charmap->encoding_id ); + +#if 0 + if ( root->charmap == NULL && + charmap->encoding == FT_ENCODING_UNICODE ) + { + /* set 'root->charmap' to the first Unicode encoding we find */ + root->charmap = charmap; + } +#endif + } + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* + * Now allocate the root array of FT_Bitmap_Size records and + * populate them. Unfortunately, it isn't possible to indicate bit + * depths in the FT_Bitmap_Size record. This is a design error. + */ + { + FT_UInt i, count; + + +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + count = face->sbit_num_strikes; +#else + count = (FT_UInt)face->num_sbit_strikes; +#endif + + if ( count > 0 ) + { + FT_Memory memory = face->root.stream->memory; + FT_UShort em_size = face->header.Units_Per_EM; + FT_Short avgwidth = face->os2.xAvgCharWidth; + FT_Size_Metrics metrics; + + + if ( em_size == 0 || face->os2.version == 0xFFFFU ) + { + avgwidth = 0; + em_size = 1; + } + + if ( FT_NEW_ARRAY( root->available_sizes, count ) ) + goto Exit; + + for ( i = 0; i < count; i++ ) + { + FT_Bitmap_Size* bsize = root->available_sizes + i; + + + error = sfnt->load_strike_metrics( face, i, &metrics ); + if ( error ) + goto Exit; + + bsize->height = (FT_Short)( metrics.height >> 6 ); + bsize->width = (FT_Short)( + ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); + + bsize->x_ppem = metrics.x_ppem << 6; + bsize->y_ppem = metrics.y_ppem << 6; + + /* assume 72dpi */ + bsize->size = metrics.y_ppem << 6; + } + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + root->num_fixed_sizes = (FT_Int)count; + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* a font with no bitmaps and no outlines is scalable; */ + /* it has only empty glyphs then */ + if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) ) + root->face_flags |= FT_FACE_FLAG_SCALABLE; + + + /*********************************************************************/ + /* */ + /* Set up metrics. */ + /* */ + if ( FT_IS_SCALABLE( root ) ) + { + /* XXX What about if outline header is missing */ + /* (e.g. sfnt wrapped bitmap)? */ + root->bbox.xMin = face->header.xMin; + root->bbox.yMin = face->header.yMin; + root->bbox.xMax = face->header.xMax; + root->bbox.yMax = face->header.yMax; + root->units_per_EM = face->header.Units_Per_EM; + + + /* XXX: Computing the ascender/descender/height is very different */ + /* from what the specification tells you. Apparently, we */ + /* must be careful because */ + /* */ + /* - not all fonts have an OS/2 table; in this case, we take */ + /* the values in the horizontal header. However, these */ + /* values very often are not reliable. */ + /* */ + /* - otherwise, the correct typographic values are in the */ + /* sTypoAscender, sTypoDescender & sTypoLineGap fields. */ + /* */ + /* However, certain fonts have these fields set to 0. */ + /* Rather, they have usWinAscent & usWinDescent correctly */ + /* set (but with different values). */ + /* */ + /* As an example, Arial Narrow is implemented through four */ + /* files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */ + /* */ + /* Strangely, all fonts have the same values in their */ + /* sTypoXXX fields, except ARIALNB which sets them to 0. */ + /* */ + /* On the other hand, they all have different */ + /* usWinAscent/Descent values -- as a conclusion, the OS/2 */ + /* table cannot be used to compute the text height reliably! */ + /* */ + + /* The ascender/descender/height are computed from the OS/2 table */ + /* when found. Otherwise, they're taken from the horizontal */ + /* header. */ + /* */ + + root->ascender = face->horizontal.Ascender; + root->descender = face->horizontal.Descender; + + root->height = (FT_Short)( root->ascender - root->descender + + face->horizontal.Line_Gap ); + +#if 0 + /* if the line_gap is 0, we add an extra 15% to the text height -- */ + /* this computation is based on various versions of Times New Roman */ + if ( face->horizontal.Line_Gap == 0 ) + root->height = (FT_Short)( ( root->height * 115 + 50 ) / 100 ); +#endif /* 0 */ + +#if 0 + /* some fonts have the OS/2 "sTypoAscender", "sTypoDescender" & */ + /* "sTypoLineGap" fields set to 0, like ARIALNB.TTF */ + if ( face->os2.version != 0xFFFFU && root->ascender ) + { + FT_Int height; + + + root->ascender = face->os2.sTypoAscender; + root->descender = -face->os2.sTypoDescender; + + height = root->ascender + root->descender + face->os2.sTypoLineGap; + if ( height > root->height ) + root->height = height; + } +#endif /* 0 */ + + root->max_advance_width = face->horizontal.advance_Width_Max; + root->max_advance_height = (FT_Short)( face->vertical_info + ? face->vertical.advance_Height_Max + : root->height ); + + /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */ + /* Adjust underline position from top edge to centre of */ + /* stroke to convert TrueType meaning to FreeType meaning. */ + root->underline_position = face->postscript.underlinePosition - + face->postscript.underlineThickness / 2; + root->underline_thickness = face->postscript.underlineThickness; + } + + } + + Exit: + FT_TRACE2(( "sfnt_load_face: done\n" )); + + return error; + } + + +#undef LOAD_ +#undef LOADM_ +#undef GET_NAME + + + FT_LOCAL_DEF( void ) + sfnt_done_face( TT_Face face ) + { + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = face->root.memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + { + /* destroy the postscript names table if it is loaded */ + if ( sfnt->free_psnames ) + sfnt->free_psnames( face ); + + /* destroy the embedded bitmaps table if it is loaded */ + if ( sfnt->free_eblc ) + sfnt->free_eblc( face ); + } + +#ifdef TT_CONFIG_OPTION_BDF + /* freeing the embedded BDF properties */ + tt_face_free_bdf_props( face ); +#endif + + /* freeing the kerning table */ + tt_face_done_kern( face ); + + /* freeing the collection table */ + FT_FREE( face->ttc_header.offsets ); + face->ttc_header.count = 0; + + /* freeing table directory */ + FT_FREE( face->dir_tables ); + face->num_tables = 0; + + { + FT_Stream stream = FT_FACE_STREAM( face ); + + + /* simply release the 'cmap' table frame */ + FT_FRAME_RELEASE( face->cmap_table ); + face->cmap_size = 0; + } + + /* freeing the horizontal metrics */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + { + FT_Stream stream = FT_FACE_STREAM( face ); + + + FT_FRAME_RELEASE( face->horz_metrics ); + FT_FRAME_RELEASE( face->vert_metrics ); + face->horz_metrics_size = 0; + face->vert_metrics_size = 0; + } +#else + FT_FREE( face->horizontal.long_metrics ); + FT_FREE( face->horizontal.short_metrics ); +#endif + + /* freeing the vertical ones, if any */ + if ( face->vertical_info ) + { + FT_FREE( face->vertical.long_metrics ); + FT_FREE( face->vertical.short_metrics ); + face->vertical_info = 0; + } + + /* freeing the gasp table */ + FT_FREE( face->gasp.gaspRanges ); + face->gasp.numRanges = 0; + + /* freeing the name table */ + if ( sfnt ) + sfnt->free_name( face ); + + /* freeing family and style name */ + FT_FREE( face->root.family_name ); + FT_FREE( face->root.style_name ); + + /* freeing sbit size table */ + FT_FREE( face->root.available_sizes ); + face->root.num_fixed_sizes = 0; + + FT_FREE( face->postscript_name ); + + face->sfnt = 0; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/sfobjs.h b/src/3rdparty/freetype/src/sfnt/sfobjs.h new file mode 100644 index 0000000000..6241c93b39 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/sfobjs.h @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* sfobjs.h */ +/* */ +/* SFNT object management (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFOBJS_H__ +#define __SFOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + sfnt_done_face( TT_Face face ); + + +FT_END_HEADER + +#endif /* __SFDRIVER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttbdf.c b/src/3rdparty/freetype/src/sfnt/ttbdf.c new file mode 100644 index 0000000000..6c95387adb --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttbdf.c @@ -0,0 +1,250 @@ +/***************************************************************************/ +/* */ +/* ttbdf.c */ +/* */ +/* TrueType and OpenType embedded BDF properties (body). */ +/* */ +/* Copyright 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttbdf.h" + +#include "sferrors.h" + + +#ifdef TT_CONFIG_OPTION_BDF + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttbdf + + + FT_LOCAL_DEF( void ) + tt_face_free_bdf_props( TT_Face face ) + { + TT_BDF bdf = &face->bdf; + + + if ( bdf->loaded ) + { + FT_Stream stream = FT_FACE(face)->stream; + + + if ( bdf->table != NULL ) + FT_FRAME_RELEASE( bdf->table ); + + bdf->table_end = NULL; + bdf->strings = NULL; + bdf->strings_size = 0; + } + } + + + static FT_Error + tt_face_load_bdf_props( TT_Face face, + FT_Stream stream ) + { + TT_BDF bdf = &face->bdf; + FT_ULong length; + FT_Error error; + + + FT_ZERO( bdf ); + + error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); + if ( error || + length < 8 || + FT_FRAME_EXTRACT( length, bdf->table ) ) + { + error = FT_Err_Invalid_Table; + goto Exit; + } + + bdf->table_end = bdf->table + length; + + { + FT_Byte* p = bdf->table; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt num_strikes = FT_NEXT_USHORT( p ); + FT_UInt32 strings = FT_NEXT_ULONG ( p ); + FT_UInt count; + FT_Byte* strike; + + + if ( version != 0x0001 || + strings < 8 || + ( strings - 8 ) / 4 < num_strikes || + strings + 1 > length ) + { + goto BadTable; + } + + bdf->num_strikes = num_strikes; + bdf->strings = bdf->table + strings; + bdf->strings_size = length - strings; + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + count * 4; + + + for ( ; count > 0; count-- ) + { + FT_UInt num_items = FT_PEEK_USHORT( p + 2 ); + + /* + * We don't need to check the value sets themselves, since this + * is done later. + */ + strike += 10 * num_items; + + p += 4; + } + + if ( strike > bdf->strings ) + goto BadTable; + } + + bdf->loaded = 1; + + Exit: + return error; + + BadTable: + FT_FRAME_RELEASE( bdf->table ); + FT_ZERO( bdf ); + error = FT_Err_Invalid_Table; + goto Exit; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ) + { + TT_BDF bdf = &face->bdf; + FT_Size size = FT_FACE(face)->size; + FT_Error error = 0; + FT_Byte* p; + FT_UInt count; + FT_Byte* strike; + FT_UInt property_len; + + + aprop->type = BDF_PROPERTY_TYPE_NONE; + + if ( bdf->loaded == 0 ) + { + error = tt_face_load_bdf_props( face, FT_FACE( face )->stream ); + if ( error ) + goto Exit; + } + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + 4 * count; + + error = FT_Err_Invalid_Argument; + + if ( size == NULL || property_name == NULL ) + goto Exit; + + property_len = ft_strlen( property_name ); + if ( property_len == 0 ) + goto Exit; + + for ( ; count > 0; count-- ) + { + FT_UInt _ppem = FT_NEXT_USHORT( p ); + FT_UInt _count = FT_NEXT_USHORT( p ); + + if ( _ppem == size->metrics.y_ppem ) + { + count = _count; + goto FoundStrike; + } + + strike += 10 * _count; + } + goto Exit; + + FoundStrike: + p = strike; + for ( ; count > 0; count-- ) + { + FT_UInt type = FT_PEEK_USHORT( p + 4 ); + + if ( ( type & 0x10 ) != 0 ) + { + FT_UInt32 name_offset = FT_PEEK_ULONG( p ); + FT_UInt32 value = FT_PEEK_ULONG( p + 6 ); + + /* be a bit paranoid for invalid entries here */ + if ( name_offset < bdf->strings_size && + property_len < bdf->strings_size - name_offset && + ft_strncmp( property_name, + (const char*)bdf->strings + name_offset, + bdf->strings_size - name_offset ) == 0 ) + { + switch ( type & 0x0F ) + { + case 0x00: /* string */ + case 0x01: /* atoms */ + /* check that the content is really 0-terminated */ + if ( value < bdf->strings_size && + ft_memchr( bdf->strings + value, 0, bdf->strings_size ) ) + { + aprop->type = BDF_PROPERTY_TYPE_ATOM; + aprop->u.atom = (const char*)bdf->strings + value; + error = 0; + goto Exit; + } + break; + + case 0x02: + aprop->type = BDF_PROPERTY_TYPE_INTEGER; + aprop->u.integer = (FT_Int32)value; + error = 0; + goto Exit; + + case 0x03: + aprop->type = BDF_PROPERTY_TYPE_CARDINAL; + aprop->u.cardinal = value; + error = 0; + goto Exit; + + default: + ; + } + } + } + p += 10; + } + + Exit: + return error; + } + +#endif /* TT_CONFIG_OPTION_BDF */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttbdf.h b/src/3rdparty/freetype/src/sfnt/ttbdf.h new file mode 100644 index 0000000000..48a10d6e9b --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttbdf.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ttbdf.h */ +/* */ +/* TrueType and OpenType embedded BDF properties (specification). */ +/* */ +/* Copyright 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTBDF_H__ +#define __TTBDF_H__ + + +#include <ft2build.h> +#include "ttload.h" +#include FT_BDF_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + tt_face_free_bdf_props( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ); + + +FT_END_HEADER + +#endif /* __TTBDF_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttcmap.c b/src/3rdparty/freetype/src/sfnt/ttcmap.c new file mode 100644 index 0000000000..683039153b --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttcmap.c @@ -0,0 +1,3187 @@ +/***************************************************************************/ +/* */ +/* ttcmap.c */ +/* */ +/* TrueType character mapping table (cmap) support (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H + +#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */ + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_STREAM_H +#include "ttload.h" +#include "ttcmap.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttcmap + + +#define TT_PEEK_SHORT FT_PEEK_SHORT +#define TT_PEEK_USHORT FT_PEEK_USHORT +#define TT_PEEK_UINT24 FT_PEEK_UOFF3 +#define TT_PEEK_LONG FT_PEEK_LONG +#define TT_PEEK_ULONG FT_PEEK_ULONG + +#define TT_NEXT_SHORT FT_NEXT_SHORT +#define TT_NEXT_USHORT FT_NEXT_USHORT +#define TT_NEXT_UINT24 FT_NEXT_UOFF3 +#define TT_NEXT_LONG FT_NEXT_LONG +#define TT_NEXT_ULONG FT_NEXT_ULONG + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap_init( TT_CMap cmap, + FT_Byte* table ) + { + cmap->data = table; + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 0 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 0 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* glyph_ids 6 BYTE[256] array of glyph indices */ + /* 262 */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; + FT_UInt length = TT_NEXT_USHORT( p ); + + + if ( table + length > valid->limit || length < 262 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices whenever necessary */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt n, idx; + + + p = table + 6; + for ( n = 0; n < 256; n++ ) + { + idx = *p++; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap0_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + + + return char_code < 256 ? table[6 + char_code] : 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap0_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 charcode = *pchar_code; + FT_UInt32 result = 0; + FT_UInt gindex = 0; + + + table += 6; /* go to glyph IDs */ + while ( ++charcode < 256 ) + { + gindex = table[charcode]; + if ( gindex != 0 ) + { + result = charcode; + break; + } + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 0; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap0_class_rec = + { + { + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap0_char_index, + (FT_CMap_CharNextFunc) tt_cmap0_char_next, + + NULL, NULL, NULL, NULL, NULL + }, + 0, + (TT_CMap_ValidateFunc) tt_cmap0_validate, + (TT_CMap_Info_GetFunc) tt_cmap0_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 2 *****/ + /***** *****/ + /***** This is used for certain CJK encodings that encode text in a *****/ + /***** mixed 8/16 bits encoding along the following lines: *****/ + /***** *****/ + /***** * Certain byte values correspond to an 8-bit character code *****/ + /***** (typically in the range 0..127 for ASCII compatibility). *****/ + /***** *****/ + /***** * Certain byte values signal the first byte of a 2-byte *****/ + /***** character code (but these values are also valid as the *****/ + /***** second byte of a 2-byte character). *****/ + /***** *****/ + /***** The following charmap lookup and iteration functions all *****/ + /***** assume that the value "charcode" correspond to following: *****/ + /***** *****/ + /***** - For one byte characters, "charcode" is simply the *****/ + /***** character code. *****/ + /***** *****/ + /***** - For two byte characters, "charcode" is the 2-byte *****/ + /***** character code in big endian format. More exactly: *****/ + /***** *****/ + /***** (charcode >> 8) is the first byte value *****/ + /***** (charcode & 0xFF) is the second byte value *****/ + /***** *****/ + /***** Note that not all values of "charcode" are valid according *****/ + /***** to these rules, and the function moderately check the *****/ + /***** arguments. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 2 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* keys 6 USHORT[256] sub-header keys */ + /* subs 518 SUBHEAD[NSUBS] sub-headers array */ + /* glyph_ids 518+NSUB*8 USHORT[] glyph ID array */ + /* */ + /* The `keys' table is used to map charcode high-bytes to sub-headers. */ + /* The value of `NSUBS' is the number of sub-headers defined in the */ + /* table and is computed by finding the maximum of the `keys' table. */ + /* */ + /* Note that for any n, `keys[n]' is a byte offset within the `subs' */ + /* table, i.e., it is the corresponding sub-header index multiplied */ + /* by 8. */ + /* */ + /* Each sub-header has the following format: */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* first 0 USHORT first valid low-byte */ + /* count 2 USHORT number of valid low-bytes */ + /* delta 4 SHORT see below */ + /* offset 6 USHORT see below */ + /* */ + /* A sub-header defines, for each high-byte, the range of valid */ + /* low-bytes within the charmap. Note that the range defined by `first' */ + /* and `count' must be completely included in the interval [0..255] */ + /* according to the specification. */ + /* */ + /* If a character code is contained within a given sub-header, then */ + /* mapping it to a glyph index is done as follows: */ + /* */ + /* * The value of `offset' is read. This is a _byte_ distance from the */ + /* location of the `offset' field itself into a slice of the */ + /* `glyph_ids' table. Let's call it `slice' (it is a USHORT[] too). */ + /* */ + /* * The value `slice[char.lo - first]' is read. If it is 0, there is */ + /* no glyph for the charcode. Otherwise, the value of `delta' is */ + /* added to it (modulo 65536) to form a new glyph index. */ + /* */ + /* It is up to the validation routine to check that all offsets fall */ + /* within the glyph IDs table (and not within the `subs' table itself or */ + /* outside of the CMap). */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; /* skip format */ + FT_UInt length = TT_PEEK_USHORT( p ); + FT_UInt n, max_subs; + FT_Byte* keys; /* keys table */ + FT_Byte* subs; /* sub-headers */ + FT_Byte* glyph_ids; /* glyph ID array */ + + + if ( table + length > valid->limit || length < 6 + 512 ) + FT_INVALID_TOO_SHORT; + + keys = table + 6; + + /* parse keys to compute sub-headers count */ + p = keys; + max_subs = 0; + for ( n = 0; n < 256; n++ ) + { + FT_UInt idx = TT_NEXT_USHORT( p ); + + + /* value must be multiple of 8 */ + if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 ) + FT_INVALID_DATA; + + idx >>= 3; + + if ( idx > max_subs ) + max_subs = idx; + } + + FT_ASSERT( p == table + 518 ); + + subs = p; + glyph_ids = subs + (max_subs + 1) * 8; + if ( glyph_ids > valid->limit ) + FT_INVALID_TOO_SHORT; + + /* parse sub-headers */ + for ( n = 0; n <= max_subs; n++ ) + { + FT_UInt first_code, code_count, offset; + FT_Int delta; + FT_Byte* ids; + + + first_code = TT_NEXT_USHORT( p ); + code_count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT( p ); + offset = TT_NEXT_USHORT( p ); + + /* many Dynalab fonts have empty sub-headers */ + if ( code_count == 0 ) + continue; + + /* check range within 0..255 */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + if ( first_code >= 256 || first_code + code_count > 256 ) + FT_INVALID_DATA; + } + + /* check offset */ + if ( offset != 0 ) + { + ids = p - 2 + offset; + if ( ids < glyph_ids || ids + code_count*2 > table + length ) + FT_INVALID_OFFSET; + + /* check glyph IDs */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_Byte* limit = p + code_count * 2; + FT_UInt idx; + + + for ( ; p < limit; ) + { + idx = TT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = ( idx + delta ) & 0xFFFFU; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + } + + return SFNT_Err_Ok; + } + + + /* return sub header corresponding to a given character code */ + /* NULL on invalid charcode */ + static FT_Byte* + tt_cmap2_get_subheader( FT_Byte* table, + FT_UInt32 char_code ) + { + FT_Byte* result = NULL; + + + if ( char_code < 0x10000UL ) + { + FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); + FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); + FT_Byte* p = table + 6; /* keys table */ + FT_Byte* subs = table + 518; /* subheaders table */ + FT_Byte* sub; + + + if ( char_hi == 0 ) + { + /* an 8-bit character code -- we use subHeader 0 in this case */ + /* to test whether the character code is in the charmap */ + /* */ + sub = subs; /* jump to first sub-header */ + + /* check that the sub-header for this byte is 0, which */ + /* indicates that it is really a valid one-byte value */ + /* Otherwise, return 0 */ + /* */ + p += char_lo * 2; + if ( TT_PEEK_USHORT( p ) != 0 ) + goto Exit; + } + else + { + /* a 16-bit character code */ + + /* jump to key entry */ + p += char_hi * 2; + /* jump to sub-header */ + sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); + + /* check that the high byte isn't a valid one-byte value */ + if ( sub == subs ) + goto Exit; + } + result = sub; + } + Exit: + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap2_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* subheader; + + + subheader = tt_cmap2_get_subheader( table, char_code ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt idx = (FT_UInt)(char_code & 0xFF); + FT_UInt start, count; + FT_Int delta; + FT_UInt offset; + + + start = TT_NEXT_USHORT( p ); + count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT ( p ); + offset = TT_PEEK_USHORT( p ); + + idx -= start; + if ( idx < count && offset != 0 ) + { + p += offset + 2 * idx; + idx = TT_PEEK_USHORT( p ); + + if ( idx != 0 ) + result = (FT_UInt)( idx + delta ) & 0xFFFFU; + } + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap2_char_next( TT_CMap cmap, + FT_UInt32 *pcharcode ) + { + FT_Byte* table = cmap->data; + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 charcode = *pcharcode + 1; + FT_Byte* subheader; + + + while ( charcode < 0x10000UL ) + { + subheader = tt_cmap2_get_subheader( table, charcode ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_Int delta = TT_NEXT_SHORT ( p ); + FT_UInt offset = TT_PEEK_USHORT( p ); + FT_UInt char_lo = (FT_UInt)( charcode & 0xFF ); + FT_UInt pos, idx; + + + if ( offset == 0 ) + goto Next_SubHeader; + + if ( char_lo < start ) + { + char_lo = start; + pos = 0; + } + else + pos = (FT_UInt)( char_lo - start ); + + p += offset + pos * 2; + charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; + + for ( ; pos < count; pos++, charcode++ ) + { + idx = TT_NEXT_USHORT( p ); + + if ( idx != 0 ) + { + gindex = ( idx + delta ) & 0xFFFFU; + if ( gindex != 0 ) + { + result = charcode; + goto Exit; + } + } + } + } + + /* jump to next sub-header, i.e. higher byte value */ + Next_SubHeader: + charcode = FT_PAD_FLOOR( charcode, 256 ) + 256; + } + + Exit: + *pcharcode = result; + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 2; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap2_class_rec = + { + { + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap2_char_index, + (FT_CMap_CharNextFunc) tt_cmap2_char_next, + + NULL, NULL, NULL, NULL, NULL + }, + 2, + (TT_CMap_ValidateFunc) tt_cmap2_validate, + (TT_CMap_Info_GetFunc) tt_cmap2_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_2 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length */ + /* in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* segCountX2 6 USHORT 2*NUM_SEGS */ + /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */ + /* entrySelector 10 USHORT LOG_SEGS */ + /* rangeShift 12 USHORT segCountX2 - */ + /* searchRange */ + /* */ + /* endCount 14 USHORT[NUM_SEGS] end charcode for */ + /* each segment; last */ + /* is 0xFFFF */ + /* */ + /* pad 14+NUM_SEGS*2 USHORT padding */ + /* */ + /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */ + /* each segment */ + /* */ + /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */ + /* segment */ + /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */ + /* each segment; can be */ + /* zero */ + /* */ + /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID */ + /* ranges */ + /* */ + /* Character codes are modelled by a series of ordered (increasing) */ + /* intervals called segments. Each segment has start and end codes, */ + /* provided by the `startCount' and `endCount' arrays. Segments must */ + /* not overlap, and the last segment should always contain the value */ + /* 0xFFFF for `endCount'. */ + /* */ + /* The fields `searchRange', `entrySelector' and `rangeShift' are better */ + /* ignored (they are traces of over-engineering in the TrueType */ + /* specification). */ + /* */ + /* Each segment also has a signed `delta', as well as an optional offset */ + /* within the `glyphIds' table. */ + /* */ + /* If a segment's idOffset is 0, the glyph index corresponding to any */ + /* charcode within the segment is obtained by adding the value of */ + /* `idDelta' directly to the charcode, modulo 65536. */ + /* */ + /* Otherwise, a glyph index is taken from the glyph IDs sub-array for */ + /* the segment, and the value of `idDelta' is added to it. */ + /* */ + /* */ + /* Finally, note that a lot of fonts contain an invalid last segment, */ + /* where `start' and `end' are correctly set to 0xFFFF but both `delta' */ + /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with */ + /* OpenOffice.org). We need special code to deal with them correctly. */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + + typedef struct TT_CMap4Rec_ + { + TT_CMapRec cmap; + FT_UInt32 cur_charcode; /* current charcode */ + FT_UInt cur_gindex; /* current glyph index */ + + FT_UInt num_ranges; + FT_UInt cur_range; + FT_UInt cur_start; + FT_UInt cur_end; + FT_Int cur_delta; + FT_Byte* cur_values; + + } TT_CMap4Rec, *TT_CMap4; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_init( TT_CMap4 cmap, + FT_Byte* table ) + { + FT_Byte* p; + + + cmap->cmap.data = table; + + p = table + 6; + cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; + cmap->cur_charcode = 0xFFFFFFFFUL; + cmap->cur_gindex = 0; + + return SFNT_Err_Ok; + } + + + static FT_Int + tt_cmap4_set_range( TT_CMap4 cmap, + FT_UInt range_index ) + { + FT_Byte* table = cmap->cmap.data; + FT_Byte* p; + FT_UInt num_ranges = cmap->num_ranges; + + + while ( range_index < num_ranges ) + { + FT_UInt offset; + + + p = table + 14 + range_index * 2; + cmap->cur_end = FT_PEEK_USHORT( p ); + + p += 2 + num_ranges * 2; + cmap->cur_start = FT_PEEK_USHORT( p ); + + p += num_ranges * 2; + cmap->cur_delta = FT_PEEK_SHORT( p ); + + p += num_ranges * 2; + offset = FT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( range_index >= num_ranges - 1 && + cmap->cur_start == 0xFFFFU && + cmap->cur_end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + cmap->cur_delta = 1; + offset = 0; + } + } + + if ( offset != 0xFFFFU ) + { + cmap->cur_values = offset ? p + offset : NULL; + cmap->cur_range = range_index; + return 0; + } + + /* we skip empty segments */ + range_index++; + } + + return -1; + } + + + /* search the index of the charcode next to cmap->cur_charcode; */ + /* caller should call tt_cmap4_set_range with proper range */ + /* before calling this function */ + /* */ + static void + tt_cmap4_next( TT_CMap4 cmap ) + { + FT_UInt charcode; + + + if ( cmap->cur_charcode >= 0xFFFFUL ) + goto Fail; + + charcode = cmap->cur_charcode + 1; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + + for ( ;; ) + { + FT_Byte* values = cmap->cur_values; + FT_UInt end = cmap->cur_end; + FT_Int delta = cmap->cur_delta; + + + if ( charcode <= end ) + { + if ( values ) + { + FT_Byte* p = values + 2 * ( charcode - cmap->cur_start ); + + + do + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex != 0 ) + { + gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU ); + if ( gindex != 0 ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } + } while ( ++charcode <= end ); + } + else + { + do + { + FT_UInt gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU ); + + + if ( gindex != 0 ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } while ( ++charcode <= end ); + } + } + + /* we need to find another range */ + if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 ) + break; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + } + + Fail: + cmap->cur_charcode = 0xFFFFFFFFUL; + cmap->cur_gindex = 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; /* skip format */ + FT_UInt length = TT_NEXT_USHORT( p ); + FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids; + FT_UInt num_segs; + FT_Error error = SFNT_Err_Ok; + + + if ( length < 16 ) + FT_INVALID_TOO_SHORT; + + /* in certain fonts, the `length' field is invalid and goes */ + /* out of bound. We try to correct this here... */ + if ( table + length > valid->limit ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_TOO_SHORT; + + length = (FT_UInt)( valid->limit - table ); + } + + p = table + 6; + num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */ + + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check that we have an even value here */ + if ( num_segs & 1 ) + FT_INVALID_DATA; + } + + num_segs /= 2; + + if ( length < 16 + num_segs * 2 * 4 ) + FT_INVALID_TOO_SHORT; + + /* check the search parameters - even though we never use them */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check the values of `searchRange', `entrySelector', `rangeShift' */ + FT_UInt search_range = TT_NEXT_USHORT( p ); + FT_UInt entry_selector = TT_NEXT_USHORT( p ); + FT_UInt range_shift = TT_NEXT_USHORT( p ); + + + if ( ( search_range | range_shift ) & 1 ) /* must be even values */ + FT_INVALID_DATA; + + search_range /= 2; + range_shift /= 2; + + /* `search range' is the greatest power of 2 that is <= num_segs */ + + if ( search_range > num_segs || + search_range * 2 < num_segs || + search_range + range_shift != num_segs || + search_range != ( 1U << entry_selector ) ) + FT_INVALID_DATA; + } + + ends = table + 14; + starts = table + 16 + num_segs * 2; + deltas = starts + num_segs * 2; + offsets = deltas + num_segs * 2; + glyph_ids = offsets + num_segs * 2; + + /* check last segment; its end count value must be 0xFFFF */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + p = ends + ( num_segs - 1 ) * 2; + if ( TT_PEEK_USHORT( p ) != 0xFFFFU ) + FT_INVALID_DATA; + } + + { + FT_UInt start, end, offset, n; + FT_UInt last_start = 0, last_end = 0; + FT_Int delta; + FT_Byte* p_start = starts; + FT_Byte* p_end = ends; + FT_Byte* p_delta = deltas; + FT_Byte* p_offset = offsets; + + + for ( n = 0; n < num_segs; n++ ) + { + p = p_offset; + start = TT_NEXT_USHORT( p_start ); + end = TT_NEXT_USHORT( p_end ); + delta = TT_NEXT_SHORT( p_delta ); + offset = TT_NEXT_USHORT( p_offset ); + + if ( start > end ) + FT_INVALID_DATA; + + /* this test should be performed at default validation level; */ + /* unfortunately, some popular Asian fonts have overlapping */ + /* ranges in their charmaps */ + /* */ + if ( start <= last_end && n > 0 ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + else + { + /* allow overlapping segments, provided their start points */ + /* and end points, respectively, are in ascending order */ + /* */ + if ( last_start > start || last_end > end ) + error |= TT_CMAP_FLAG_UNSORTED; + else + error |= TT_CMAP_FLAG_OVERLAPPING; + } + } + + if ( offset && offset != 0xFFFFU ) + { + p += offset; /* start of glyph ID array */ + + /* check that we point within the glyph IDs table only */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > table + length ) + FT_INVALID_DATA; + } + /* Some fonts handle the last segment incorrectly. In */ + /* theory, 0xFFFF might point to an ordinary glyph -- */ + /* a cmap 4 is versatile and could be used for any */ + /* encoding, not only Unicode. However, reality shows */ + /* that far too many fonts are sloppy and incorrectly */ + /* set all fields but `start' and `end' for the last */ + /* segment if it contains only a single character. */ + /* */ + /* We thus omit the test here, delaying it to the */ + /* routines which actually access the cmap. */ + else if ( n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > valid->limit ) + FT_INVALID_DATA; + } + + /* check glyph indices within the segment range */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt i, idx; + + + for ( i = start; i < end; i++ ) + { + idx = FT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = (FT_UInt)( idx + delta ) & 0xFFFFU; + + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + else if ( offset == 0xFFFFU ) + { + /* some fonts (erroneously?) use a range offset of 0xFFFF */ + /* to mean missing glyph in cmap table */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID || + n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + FT_INVALID_DATA; + } + + last_start = start; + last_end = end; + } + } + + return error; + } + + + static FT_UInt + tt_cmap4_char_map_linear( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt i, num_segs; + FT_UInt32 charcode = *pcharcode; + FT_UInt gindex = 0; + FT_Byte* p; + + + p = cmap->data + 6; + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + + num_segs = num_segs2 >> 1; + + if ( !num_segs ) + return 0; + + if ( next ) + charcode++; + + /* linear search */ + for ( ; charcode <= 0xFFFFU; charcode++ ) + { + FT_Byte* q; + + + p = cmap->data + 14; /* ends table */ + q = cmap->data + 16 + num_segs2; /* starts table */ + + for ( i = 0; i < num_segs; i++ ) + { + end = TT_NEXT_USHORT( p ); + start = TT_NEXT_USHORT( q ); + + if ( charcode >= start && charcode <= end ) + { + p = q - 2 + num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( i >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + if ( offset == 0xFFFFU ) + continue; + + if ( offset ) + { + p += offset + ( charcode - start ) * 2; + gindex = TT_PEEK_USHORT( p ); + if ( gindex != 0 ) + gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; + } + else + gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU; + + break; + } + } + + if ( !next || gindex ) + break; + } + + if ( next && gindex ) + *pcharcode = charcode; + + return gindex; + } + + + static FT_UInt + tt_cmap4_char_map_binary( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt max, min, mid, num_segs; + FT_UInt charcode = *pcharcode; + FT_UInt gindex = 0; + FT_Byte* p; + + + p = cmap->data + 6; + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + + if ( !num_segs2 ) + return 0; + + num_segs = num_segs2 >> 1; + + /* make compiler happy */ + mid = num_segs; + end = 0xFFFFU; + + if ( next ) + charcode++; + + min = 0; + max = num_segs; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + + if ( charcode < start ) + max = mid; + else if ( charcode > end ) + min = mid + 1; + else + { + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( mid >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + /* search the first segment containing `charcode' */ + if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING ) + { + FT_UInt i; + + + /* call the current segment `max' */ + max = mid; + + if ( offset == 0xFFFFU ) + mid = max + 1; + + /* search in segments before the current segment */ + for ( i = max ; i > 0; i-- ) + { + FT_UInt prev_end; + FT_Byte* old_p; + + + old_p = p; + p = cmap->data + 14 + ( i - 1 ) * 2; + prev_end = TT_PEEK_USHORT( p ); + + if ( charcode > prev_end ) + { + p = old_p; + break; + } + + end = prev_end; + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i - 1; + } + + /* no luck */ + if ( mid == max + 1 ) + { + if ( i != max ) + { + p = cmap->data + 14 + max * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + + mid = max; + + /* search in segments after the current segment */ + for ( i = max + 1; i < num_segs; i++ ) + { + FT_UInt next_end, next_start; + + + p = cmap->data + 14 + i * 2; + next_end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + next_start = TT_PEEK_USHORT( p ); + + if ( charcode < next_start ) + break; + + end = next_end; + start = next_start; + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i; + } + i--; + + /* still no luck */ + if ( mid == max ) + { + mid = i; + + break; + } + } + + /* end, start, delta, and offset are for the i'th segment */ + if ( mid != i ) + { + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + } + else + { + if ( offset == 0xFFFFU ) + break; + } + + if ( offset ) + { + p += offset + ( charcode - start ) * 2; + gindex = TT_PEEK_USHORT( p ); + if ( gindex != 0 ) + gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; + } + else + gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU; + + break; + } + } + + if ( next ) + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* if `charcode' is not in any segment, then `mid' is */ + /* the segment nearest to `charcode' */ + /* */ + + if ( charcode > end ) + { + mid++; + if ( mid == num_segs ) + return 0; + } + + if ( tt_cmap4_set_range( cmap4, mid ) ) + { + if ( gindex ) + *pcharcode = charcode; + } + else + { + cmap4->cur_charcode = charcode; + + if ( gindex ) + cmap4->cur_gindex = gindex; + else + { + cmap4->cur_charcode = charcode; + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + } + + if ( gindex ) + *pcharcode = cmap4->cur_charcode; + } + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap4_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + if ( char_code >= 0x10000UL ) + return 0; + + if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) + return tt_cmap4_char_map_linear( cmap, &char_code, 0 ); + else + return tt_cmap4_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap4_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt gindex; + + + if ( *pchar_code >= 0xFFFFU ) + return 0; + + if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) + gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 ); + else + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* no need to search */ + if ( *pchar_code == cmap4->cur_charcode ) + { + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + if ( gindex ) + *pchar_code = cmap4->cur_charcode; + } + else + gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 ); + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 4; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap4_class_rec = + { + { + sizeof ( TT_CMap4Rec ), + (FT_CMap_InitFunc) tt_cmap4_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap4_char_index, + (FT_CMap_CharNextFunc) tt_cmap4_char_next, + + NULL, NULL, NULL, NULL, NULL + }, + 4, + (TT_CMap_ValidateFunc) tt_cmap4_validate, + (TT_CMap_Info_GetFunc) tt_cmap4_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_4 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* first 6 USHORT first segment code */ + /* count 8 USHORT segment size in chars */ + /* glyphIds 10 USHORT[count] glyph IDs */ + /* */ + /* A very simplified segment mapping. */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length, count; + + + if ( table + 10 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; + length = TT_NEXT_USHORT( p ); + + p = table + 8; /* skip language and start index */ + count = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 10 + count * 2 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap6_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx = (FT_UInt)( char_code - start ); + + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap6_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx; + + + if ( char_code >= 0x10000UL ) + goto Exit; + + if ( char_code < start ) + char_code = start; + + idx = (FT_UInt)( char_code - start ); + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + { + result = char_code; + break; + } + char_code++; + } + + Exit: + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 6; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap6_class_rec = + { + { + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap6_char_index, + (FT_CMap_CharNextFunc) tt_cmap6_char_next, + + NULL, NULL, NULL, NULL, NULL + }, + 6, + (TT_CMap_ValidateFunc) tt_cmap6_validate, + (TT_CMap_Info_GetFunc) tt_cmap6_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_6 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 8 *****/ + /***** *****/ + /***** It is hard to completely understand what the OpenType spec *****/ + /***** says about this format, but here is my conclusion. *****/ + /***** *****/ + /***** The purpose of this format is to easily map UTF-16 text to *****/ + /***** glyph indices. Basically, the `char_code' must be in one of *****/ + /***** the following formats: *****/ + /***** *****/ + /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/ + /***** Area (i.e. U+D800-U+DFFF). *****/ + /***** *****/ + /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/ + /***** `char_code = (char_hi << 16) | char_lo', then both *****/ + /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/ + /***** Area. *****/ + /***** *****/ + /***** The `is32' table embedded in the charmap indicates whether a *****/ + /***** given 16-bit value is in the surrogates area or not. *****/ + /***** *****/ + /***** So, for any given `char_code', we can assert the following: *****/ + /***** *****/ + /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/ + /***** *****/ + /***** If `char_hi != 0' then we must have both *****/ + /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 8 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* is32 12 BYTE[8192] 32-bitness bitmap */ + /* count 8204 ULONG number of groups */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph ID for the group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_Byte* is32; + FT_UInt32 length; + FT_UInt32 num_groups; + + + if ( table + 16 + 8192 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + if ( table + length > valid->limit || length < 8208 ) + FT_INVALID_TOO_SHORT; + + is32 = table + 12; + p = is32 + 8192; /* skip `is32' array */ + num_groups = TT_NEXT_ULONG( p ); + + if ( p + num_groups * 12 > valid->limit ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_UInt32 n, start, end, start_id, count, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + FT_UInt hi, lo; + + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + + count = (FT_UInt32)( end - start + 1 ); + + if ( start & ~0xFFFFU ) + { + /* start_hi != 0; check that is32[i] is 1 for each i in */ + /* the `hi' and `lo' of the range [start..end] */ + for ( ; count > 0; count--, start++ ) + { + hi = (FT_UInt)( start >> 16 ); + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + } + } + else + { + /* start_hi == 0; check that is32[i] is 0 for each i in */ + /* the range [start..end] */ + + /* end_hi cannot be != 0! */ + if ( end & ~0xFFFFU ) + FT_INVALID_DATA; + + for ( ; count > 0; count--, start++ ) + { + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 ) + FT_INVALID_DATA; + } + } + } + + last = end; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap8_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + break; + + if ( char_code <= end ) + { + result = (FT_UInt)( start_id + char_code - start ); + break; + } + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap8_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + FT_Byte* table = cmap->data; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + p = table + 8208; + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + if ( char_code <= end ) + { + gindex = (FT_UInt)( char_code - start + start_id ); + if ( gindex != 0 ) + { + result = char_code; + goto Exit; + } + } + } + + Exit: + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 8; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap8_class_rec = + { + { + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap8_char_index, + (FT_CMap_CharNextFunc) tt_cmap8_char_next, + + NULL, NULL, NULL, NULL, NULL + }, + 8, + (TT_CMap_ValidateFunc) tt_cmap8_validate, + (TT_CMap_Info_GetFunc) tt_cmap8_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_8 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 10 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 10 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* */ + /* start 12 ULONG first char in range */ + /* count 16 ULONG number of chars in range */ + /* glyphIds 20 USHORT[count] glyph indices covered */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_ULong length, count; + + + if ( table + 20 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + p = table + 16; + count = TT_NEXT_ULONG( p ); + + if ( table + length > valid->limit || length < 20 + count * 2 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap10_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx = (FT_ULong)( char_code - start ); + + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap10_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx; + + + if ( char_code < start ) + char_code = start; + + idx = (FT_UInt32)( char_code - start ); + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + break; + char_code++; + } + + *pchar_code = char_code; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 10; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap10_class_rec = + { + { + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap10_char_index, + (FT_CMap_CharNextFunc) tt_cmap10_char_next, + + NULL, NULL, NULL, NULL, NULL + }, + 10, + (TT_CMap_ValidateFunc) tt_cmap10_validate, + (TT_CMap_Info_GetFunc) tt_cmap10_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_10 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 12 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 12 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* count 12 ULONG number of groups */ + /* 16 */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph ID for the group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + + typedef struct TT_CMap12Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap12Rec, *TT_CMap12; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_init( TT_CMap12 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 12; + cmap->num_groups = FT_PEEK_ULONG( table ); + + cmap->valid = 0; + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( table + length > valid->limit || length < 16 + 12 * num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, start_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return SFNT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap12_next( TT_CMap12 cmap ) + { + FT_Byte* p; + FT_ULong start, end, start_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) + goto Fail; + + char_code = cmap->cur_charcode + 1; + + n = cmap->cur_group; + + for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + { + p = cmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + for ( ; char_code <= end; char_code++ ) + { + gindex = (FT_UInt)( start_id + char_code - start ); + + if ( gindex ) + { + cmap->cur_charcode = char_code;; + cmap->cur_gindex = gindex; + cmap->cur_group = n; + + return; + } + } + } + + Fail: + cmap->valid = 0; + } + + + static FT_UInt + tt_cmap12_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code; + FT_UInt32 start, end, start_id; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + /* make compiler happy */ + mid = num_groups; + end = 0xFFFFFFFFUL; + + if ( next ) + char_code++; + + min = 0; + max = num_groups; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + start_id = TT_PEEK_ULONG( p ); + gindex = (FT_UInt)( start_id + char_code - start ); + + break; + } + } + + if ( next ) + { + TT_CMap12 cmap12 = (TT_CMap12)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + /* */ + + if ( char_code > end ) + { + mid++; + if ( mid == num_groups ) + return 0; + } + + cmap12->valid = 1; + cmap12->cur_charcode = char_code; + cmap12->cur_group = mid; + + if ( !gindex ) + { + tt_cmap12_next( cmap12 ); + + if ( cmap12->valid ) + gindex = cmap12->cur_gindex; + } + else + cmap12->cur_gindex = gindex; + + if ( gindex ) + *pchar_code = cmap12->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap12_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + return tt_cmap12_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap12_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + TT_CMap12 cmap12 = (TT_CMap12)cmap; + FT_ULong gindex; + + + if ( cmap12->cur_charcode >= 0xFFFFFFFFUL ) + return 0; + + /* no need to search */ + if ( cmap12->valid && cmap12->cur_charcode == *pchar_code ) + { + tt_cmap12_next( cmap12 ); + if ( cmap12->valid ) + { + gindex = cmap12->cur_gindex; + if ( gindex ) + *pchar_code = cmap12->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 ); + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 12; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap12_class_rec = + { + { + sizeof ( TT_CMap12Rec ), + + (FT_CMap_InitFunc) tt_cmap12_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap12_char_index, + (FT_CMap_CharNextFunc) tt_cmap12_char_next, + + NULL, NULL, NULL, NULL, NULL + }, + 12, + (TT_CMap_ValidateFunc) tt_cmap12_validate, + (TT_CMap_Info_GetFunc) tt_cmap12_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_12 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 14 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 14 */ + /* length 2 ULONG table length in bytes */ + /* numSelector 6 ULONG number of variation sel. records */ + /* */ + /* Followed by numSelector records, each of which looks like */ + /* */ + /* varSelector 0 UINT24 Unicode codepoint of sel. */ + /* defaultOff 3 ULONG offset to a default UVS table */ + /* describing any variants to be found in */ + /* the normal Unicode subtable. */ + /* nonDefOff 7 ULONG offset to a non-default UVS table */ + /* describing any variants not in the */ + /* standard cmap, with GIDs here */ + /* (either offset may be 0 NULL) */ + /* */ + /* Selectors are sorted by code point. */ + /* */ + /* A default Unicode Variation Selector (UVS) subtable is just a list of */ + /* ranges of code points which are to be found in the standard cmap. No */ + /* glyph IDs (GIDs) here. */ + /* */ + /* numRanges 0 ULONG number of ranges following */ + /* */ + /* A range looks like */ + /* */ + /* uniStart 0 UINT24 code point of the first character in */ + /* this range */ + /* additionalCnt 3 UBYTE count of additional characters in this */ + /* range (zero means a range of a single */ + /* character) */ + /* */ + /* Ranges are sorted by `uniStart'. */ + /* */ + /* A non-default Unicode Variation Selector (UVS) subtable is a list of */ + /* mappings from codepoint to GID. */ + /* */ + /* numMappings 0 ULONG number of mappings */ + /* */ + /* A range looks like */ + /* */ + /* uniStart 0 UINT24 code point of the first character in */ + /* this range */ + /* GID 3 USHORT and its GID */ + /* */ + /* Ranges are sorted by `uniStart'. */ + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + + typedef struct TT_CMap14Rec_ + { + TT_CMapRec cmap; + FT_ULong num_selectors; + + /* This array is used to store the results of various + * cmap 14 query functions. The data is overwritten + * on each call to these functions. + */ + FT_UInt max_results; + FT_UInt32* results; + FT_Memory memory; + + } TT_CMap14Rec, *TT_CMap14; + + + FT_CALLBACK_DEF( void ) + tt_cmap14_done( TT_CMap14 cmap ) + { + FT_Memory memory = cmap->memory; + + + cmap->max_results = 0; + if ( memory != NULL && cmap->results != NULL ) + FT_FREE( cmap->results ); + } + + + static FT_Error + tt_cmap14_ensure( TT_CMap14 cmap, + FT_UInt num_results, + FT_Memory memory ) + { + FT_UInt old_max = cmap->max_results; + FT_Error error = 0; + + + if ( num_results > cmap->max_results ) + { + cmap->memory = memory; + + if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) ) + return error; + + cmap->max_results = num_results; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_init( TT_CMap14 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 6; + cmap->num_selectors = FT_PEEK_ULONG( table ); + cmap->max_results = 0; + cmap->results = NULL; + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; + FT_ULong length = TT_NEXT_ULONG( p ); + FT_ULong num_selectors = TT_NEXT_ULONG( p ); + + + if ( table + length > valid->limit || length < 10 + 11 * num_selectors ) + FT_INVALID_TOO_SHORT; + + /* check selectors, they must be in increasing order */ + { + /* we start lastVarSel at 1 because a variant selector value of 0 + * isn't valid. + */ + FT_ULong n, lastVarSel = 1; + + + for ( n = 0; n < num_selectors; n++ ) + { + FT_ULong varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( defOff >= length || nondefOff >= length ) + FT_INVALID_TOO_SHORT; + + if ( varSel < lastVarSel ) + FT_INVALID_DATA; + + lastVarSel = varSel + 1; + + /* check the default table (these glyphs should be reached */ + /* through the normal Unicode cmap, no GIDs, just check order) */ + if ( defOff != 0 ) + { + FT_Byte* defp = table + defOff; + FT_ULong numRanges = TT_NEXT_ULONG( defp ); + FT_ULong i; + FT_ULong lastBase = 0; + + + if ( defp + numRanges * 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numRanges; ++i ) + { + FT_ULong base = TT_NEXT_UINT24( defp ); + FT_ULong cnt = FT_NEXT_BYTE( defp ); + + + if ( base + cnt >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( base < lastBase ) + FT_INVALID_DATA; + + lastBase = base + cnt + 1U; + } + } + + /* and the non-default table (these glyphs are specified here) */ + if ( nondefOff != 0 ) { + FT_Byte* ndp = table + nondefOff; + FT_ULong numMappings = TT_NEXT_ULONG( ndp ); + FT_ULong i, lastUni = 0; + + + if ( ndp + numMappings * 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numMappings; ++i ) + { + FT_ULong uni = TT_NEXT_UINT24( ndp ); + FT_ULong gid = TT_NEXT_USHORT( ndp ); + + + if ( uni >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( uni < lastUni ) + FT_INVALID_DATA; + + lastUni = uni + 1U; + + if ( valid->level >= FT_VALIDATE_TIGHT && + gid >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_UNUSED( cmap ); + FT_UNUSED( char_code ); + + /* This can't happen */ + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UNUSED( cmap ); + + /* This can't happen */ + *pchar_code = 0; + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_UNUSED( cmap ); + + cmap_info->format = 14; + /* subtable 14 does not define a language field */ + cmap_info->language = 0xFFFFFFFFUL; + + return SFNT_Err_Ok; + } + + + static FT_UInt + tt_cmap14_char_map_def_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numRanges = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numRanges; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 4 * mid; + FT_ULong start = TT_NEXT_UINT24( p ); + FT_UInt cnt = FT_NEXT_BYTE( p ); + + + if ( char_code < start ) + max = mid; + else if ( char_code > start+cnt ) + min = mid + 1; + else + return TRUE; + } + + return FALSE; + } + + + static FT_UInt + tt_cmap14_char_map_nondef_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numMappings = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numMappings; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 5 * mid; + FT_UInt32 uni = TT_NEXT_UINT24( p ); + + + if ( char_code < uni ) + max = mid; + else if ( char_code > uni ) + min = mid + 1; + else + return TT_PEEK_USHORT( p ); + } + + return 0; + } + + + static FT_Byte* + tt_cmap14_find_variant( FT_Byte *base, + FT_UInt32 variantCode ) + { + FT_UInt32 numVar = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numVar; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 11 * mid; + FT_ULong varSel = TT_NEXT_UINT24( p ); + + + if ( variantCode < varSel ) + max = mid; + else if ( variantCode > varSel ) + min = mid + 1; + else + return p; + } + + return NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_var_index( TT_CMap cmap, + TT_CMap ucmap, + FT_ULong charcode, + FT_ULong variantSelector) + { + FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return 0; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_PEEK_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + { + /* This is the default variant of this charcode. GID not stored */ + /* here; stored in the normal Unicode charmap instead. */ + return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode ); + } + + if ( nondefOff != 0 ) + return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charcode ); + + return 0; + } + + + FT_CALLBACK_DEF( FT_Int ) + tt_cmap14_char_var_isdefault( TT_CMap cmap, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return -1; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + return 1; + + if ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charcode ) != 0 ) + return 0; + + return -1; + } + + + FT_CALLBACK_DEF( FT_UInt32* ) + tt_cmap14_variants( TT_CMap cmap, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14)cmap; + FT_UInt count = cmap14->num_selectors; + FT_Byte* p = cmap->data + 10; + FT_UInt32* result; + FT_UInt i; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + result = cmap14->results; + for ( i = 0; i < count; ++i ) + { + result[i] = TT_NEXT_UINT24( p ); + p += 8; + } + result[i] = 0; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_char_variants( TT_CMap cmap, + FT_Memory memory, + FT_ULong charCode ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt count = cmap14->num_selectors; + FT_Byte* p = cmap->data + 10; + FT_UInt32* q; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; count > 0; --count ) + { + FT_UInt32 varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, + charCode ) ) || + ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charCode ) != 0 ) ) + { + q[0] = varSel; + q++; + } + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt + tt_cmap14_def_char_count( FT_Byte *p ) + { + FT_UInt32 numRanges = TT_NEXT_ULONG( p ); + FT_UInt tot = 0; + + + p += 3; /* point to the first `cnt' field */ + for ( ; numRanges > 0; numRanges-- ) + { + tot += 1 + p[0]; + p += 4; + } + + return tot; + } + + + static FT_UInt32* + tt_cmap14_get_def_chars( TT_CMap cmap, + FT_Byte* p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt cnt; + FT_UInt32* q; + + + cnt = tt_cmap14_def_char_count( p ); + numRanges = TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; numRanges > 0; --numRanges ) + { + FT_UInt uni = TT_NEXT_UINT24( p ); + + + cnt = FT_NEXT_BYTE( p ) + 1; + do + { + q[0] = uni; + uni += 1; + q += 1; + } while ( --cnt != 0 ); + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt32* + tt_cmap14_get_nondef_chars( TT_CMap cmap, + FT_Byte *p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numMappings; + FT_UInt i; + FT_UInt32 *ret; + + + numMappings = TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + for ( i = 0; i < numMappings; ++i ) + { + ret[i] = TT_NEXT_UINT24( p ); + p += 2; + } + ret[i] = 0; + + return ret; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_variant_chars( TT_CMap cmap, + FT_Memory memory, + FT_ULong variantSelector ) + { + FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, + variantSelector ); + FT_UInt32 *ret; + FT_Int i; + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return NULL; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff == 0 && nondefOff == 0 ) + return NULL; + + if ( defOff == 0 ) + return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + memory ); + else if ( nondefOff == 0 ) + return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + memory ); + else + { + /* Both a default and a non-default glyph set? That's probably not */ + /* good font design, but the spec allows for it... */ + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt32 numMappings; + FT_UInt32 duni; + FT_UInt32 dcnt; + FT_UInt32 nuni; + FT_Byte* dp; + FT_UInt di, ni, k; + + + p = cmap->data + nondefOff; + dp = cmap->data + defOff; + + numMappings = TT_NEXT_ULONG( p ); + dcnt = tt_cmap14_def_char_count( dp ); + numRanges = TT_NEXT_ULONG( dp ); + + if ( numMappings == 0 ) + return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + memory ); + if ( dcnt == 0 ) + return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + memory ); + + if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + duni = TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + di = 1; + nuni = TT_NEXT_UINT24( p ); + p += 2; + ni = 1; + i = 0; + + for ( ;; ) + { + if ( nuni > duni + dcnt ) + { + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + + ++di; + + if ( di > numRanges ) + break; + + duni = TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + } + else + { + if ( nuni < duni ) + ret[i++] = nuni; + /* If it is within the default range then ignore it -- */ + /* that should not have happened */ + ++ni; + if ( ni > numMappings ) + break; + + nuni = TT_NEXT_UINT24( p ); + p += 2; + } + } + + if ( ni <= numMappings ) + { + /* If we get here then we have run out of all default ranges. */ + /* We have read one non-default mapping which we haven't stored */ + /* and there may be others that need to be read. */ + ret[i++] = nuni; + while ( ni < numMappings ) + { + ret[i++] = TT_NEXT_UINT24( p ); + p += 2; + ++ni; + } + } + else if ( di <= numRanges ) + { + /* If we get here then we have run out of all non-default */ + /* mappings. We have read one default range which we haven't */ + /* stored and there may be others that need to be read. */ + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + + while ( di < numRanges ) + { + duni = TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + ++di; + } + } + + ret[i] = 0; + + return ret; + } + } + + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap14_class_rec = + { + { + sizeof ( TT_CMap14Rec ), + + (FT_CMap_InitFunc) tt_cmap14_init, + (FT_CMap_DoneFunc) tt_cmap14_done, + (FT_CMap_CharIndexFunc)tt_cmap14_char_index, + (FT_CMap_CharNextFunc) tt_cmap14_char_next, + + /* Format 14 extension functions */ + (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, + (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, + (FT_CMap_VariantListFunc) tt_cmap14_variants, + (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, + (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars + }, + 14, + (TT_CMap_ValidateFunc)tt_cmap14_validate, + (TT_CMap_Info_GetFunc)tt_cmap14_get_info + }; + +#endif /* TT_CONFIG_CMAP_FORMAT_14 */ + + + static const TT_CMap_Class tt_cmap_classes[] = + { +#ifdef TT_CONFIG_CMAP_FORMAT_0 + &tt_cmap0_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + &tt_cmap2_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + &tt_cmap4_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + &tt_cmap6_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + &tt_cmap8_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + &tt_cmap10_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + &tt_cmap12_class_rec, +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + &tt_cmap14_class_rec, +#endif + + NULL, + }; + + + /* parse the `cmap' table and build the corresponding TT_CMap objects */ + /* in the current face */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_build_cmaps( TT_Face face ) + { + FT_Byte* table = face->cmap_table; + FT_Byte* limit = table + face->cmap_size; + FT_UInt volatile num_cmaps; + FT_Byte* volatile p = table; + + + if ( p + 4 > limit ) + return SFNT_Err_Invalid_Table; + + /* only recognize format 0 */ + if ( TT_NEXT_USHORT( p ) != 0 ) + { + p -= 2; + FT_ERROR(( "tt_face_build_cmaps: unsupported `cmap' table format = %d\n", + TT_PEEK_USHORT( p ) )); + return SFNT_Err_Invalid_Table; + } + + num_cmaps = TT_NEXT_USHORT( p ); + + for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) + { + FT_CharMapRec charmap; + FT_UInt32 offset; + + + charmap.platform_id = TT_NEXT_USHORT( p ); + charmap.encoding_id = TT_NEXT_USHORT( p ); + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; /* will be filled later */ + offset = TT_NEXT_ULONG( p ); + + if ( offset && offset <= face->cmap_size - 2 ) + { + FT_Byte* volatile cmap = table + offset; + volatile FT_UInt format = TT_PEEK_USHORT( cmap ); + const TT_CMap_Class* volatile pclazz = tt_cmap_classes; + TT_CMap_Class volatile clazz; + + + for ( ; *pclazz; pclazz++ ) + { + clazz = *pclazz; + if ( clazz->format == format ) + { + volatile TT_ValidatorRec valid; + volatile FT_Error error = SFNT_Err_Ok; + + + ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, + FT_VALIDATE_DEFAULT ); + + valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs; + + if ( ft_setjmp( + *((ft_jmp_buf*)&FT_VALIDATOR( &valid )->jump_buffer) ) == 0 ) + { + /* validate this cmap sub-table */ + error = clazz->validate( cmap, FT_VALIDATOR( &valid ) ); + } + + if ( valid.validator.error == 0 ) + { + FT_CMap ttcmap; + + + /* It might make sense to store the single variation selector */ + /* cmap somewhere special. But it would have to be in the */ + /* public FT_FaceRec, and we can't change that. */ + + if ( !FT_CMap_New( (FT_CMap_Class)clazz, + cmap, &charmap, &ttcmap ) ) + { + /* it is simpler to directly set `flags' than adding */ + /* a parameter to FT_CMap_New */ + ((TT_CMap)ttcmap)->flags = (FT_Int)error; + } + } + else + { + FT_ERROR(( "tt_face_build_cmaps:" )); + FT_ERROR(( " broken cmap sub-table ignored!\n" )); + } + break; + } + } + + if ( *pclazz == NULL ) + { + FT_ERROR(( "tt_face_build_cmaps:" )); + FT_ERROR(( " unsupported cmap sub-table ignored!\n" )); + } + } + } + + return SFNT_Err_Ok; + } + + + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = (FT_CMap)charmap; + TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; + + + return clazz->get_cmap_info( charmap, cmap_info ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttcmap.h b/src/3rdparty/freetype/src/sfnt/ttcmap.h new file mode 100644 index 0000000000..a10a3e2502 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttcmap.h @@ -0,0 +1,85 @@ +/***************************************************************************/ +/* */ +/* ttcmap.h */ +/* */ +/* TrueType character mapping table (cmap) support (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTCMAP_H__ +#define __TTCMAP_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_VALIDATE_H +#include FT_SERVICE_TT_CMAP_H + +FT_BEGIN_HEADER + + +#define TT_CMAP_FLAG_UNSORTED 1 +#define TT_CMAP_FLAG_OVERLAPPING 2 + + typedef struct TT_CMapRec_ + { + FT_CMapRec cmap; + FT_Byte* data; /* pointer to in-memory cmap table */ + FT_Int flags; /* for format 4 only */ + + } TT_CMapRec, *TT_CMap; + + typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; + + + typedef FT_Error + (*TT_CMap_ValidateFunc)( FT_Byte* data, + FT_Validator valid ); + + typedef struct TT_CMap_ClassRec_ + { + FT_CMap_ClassRec clazz; + FT_UInt format; + TT_CMap_ValidateFunc validate; + TT_CMap_Info_GetFunc get_cmap_info; + + } TT_CMap_ClassRec; + + + typedef struct TT_ValidatorRec_ + { + FT_ValidatorRec validator; + FT_UInt num_glyphs; + + } TT_ValidatorRec, *TT_Validator; + + +#define TT_VALIDATOR( x ) ((TT_Validator)( x )) +#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs + + + FT_LOCAL( FT_Error ) + tt_face_build_cmaps( TT_Face face ); + + /* used in tt-cmaps service */ + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + +FT_END_HEADER + +#endif /* __TTCMAP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttkern.c b/src/3rdparty/freetype/src/sfnt/ttkern.c new file mode 100644 index 0000000000..67d5115e87 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttkern.c @@ -0,0 +1,305 @@ +/***************************************************************************/ +/* */ +/* ttkern.c */ +/* */ +/* Load the basic TrueType kerning table. This doesn't handle */ +/* kerning data within the GPOS table at the moment. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttkern.h" +#include "ttload.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttkern + + +#undef TT_KERN_INDEX +#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_size; + FT_Byte* p; + FT_Byte* p_limit; + FT_UInt nn, num_tables; + FT_UInt32 avail = 0, ordered = 0; + + + /* the kern table is optional; exit silently if it is missing */ + error = face->goto_table( face, TTAG_kern, stream, &table_size ); + if ( error ) + goto Exit; + + if ( table_size < 4 ) /* the case of a malformed table */ + { + FT_ERROR(( "kerning table is too small - ignored\n" )); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) ) + { + FT_ERROR(( "could not extract kerning table\n" )); + goto Exit; + } + + face->kern_table_size = table_size; + + p = face->kern_table; + p_limit = p + table_size; + + p += 2; /* skip version */ + num_tables = FT_NEXT_USHORT( p ); + + if ( num_tables > 32 ) /* we only support up to 32 sub-tables */ + num_tables = 32; + + for ( nn = 0; nn < num_tables; nn++ ) + { + FT_UInt num_pairs, length, coverage; + FT_Byte* p_next; + FT_UInt32 mask = 1UL << nn; + + + if ( p + 6 > p_limit ) + break; + + p_next = p; + + p += 2; /* skip version */ + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + + if ( length <= 6 ) + break; + + p_next += length; + + if ( p_next > p_limit ) /* handle broken table */ + p_next = p_limit; + + /* only use horizontal kerning tables */ + if ( ( coverage & ~8 ) != 0x0001 || + p + 8 > p_limit ) + goto NextTable; + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( p_next - p ) / 6 < (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( p_next - p ) / 6 ); + + avail |= mask; + + /* + * Now check whether the pairs in this table are ordered. + * We then can use binary search. + */ + if ( num_pairs > 0 ) + { + FT_UInt count; + FT_UInt old_pair; + + + old_pair = FT_NEXT_ULONG( p ); + p += 2; + + for ( count = num_pairs - 1; count > 0; count-- ) + { + FT_UInt32 cur_pair; + + + cur_pair = FT_NEXT_ULONG( p ); + if ( cur_pair <= old_pair ) + break; + + p += 2; + old_pair = cur_pair; + } + + if ( count == 0 ) + ordered |= mask; + } + + NextTable: + p = p_next; + } + + face->num_kern_tables = nn; + face->kern_avail_bits = avail; + face->kern_order_bits = ordered; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_kern( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->kern_table ); + face->kern_table_size = 0; + face->num_kern_tables = 0; + face->kern_avail_bits = 0; + face->kern_order_bits = 0; + } + + + FT_LOCAL_DEF( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ) + { + FT_Int result = 0; + FT_UInt count, mask = 1; + FT_Byte* p = face->kern_table; + FT_Byte* p_limit = p + face->kern_table_size; + + + p += 4; + mask = 0x0001; + + for ( count = face->num_kern_tables; + count > 0 && p + 6 <= p_limit; + count--, mask <<= 1 ) + { + FT_Byte* base = p; + FT_Byte* next = base; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt length = FT_NEXT_USHORT( p ); + FT_UInt coverage = FT_NEXT_USHORT( p ); + FT_UInt num_pairs; + FT_Int value = 0; + + FT_UNUSED( version ); + + + next = base + length; + + if ( next > p_limit ) /* handle broken table */ + next = p_limit; + + if ( ( face->kern_avail_bits & mask ) == 0 ) + goto NextTable; + + if ( p + 8 > next ) + goto NextTable; + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( next - p ) / 6 < (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( next - p ) / 6 ); + + switch ( coverage >> 8 ) + { + case 0: + { + FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph ); + + + if ( face->kern_order_bits & mask ) /* binary search */ + { + FT_UInt min = 0; + FT_UInt max = num_pairs; + + + while ( min < max ) + { + FT_UInt mid = ( min + max ) >> 1; + FT_Byte* q = p + 6 * mid; + FT_ULong key; + + + key = FT_NEXT_ULONG( q ); + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( q ); + goto Found; + } + if ( key < key0 ) + min = mid + 1; + else + max = mid; + } + } + else /* linear search */ + { + FT_UInt count2; + + + for ( count2 = num_pairs; count2 > 0; count2-- ) + { + FT_ULong key = FT_NEXT_ULONG( p ); + + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( p ); + goto Found; + } + p += 2; + } + } + } + break; + + /* + * We don't support format 2 because we haven't seen a single font + * using it in real life... + */ + + default: + ; + } + + goto NextTable; + + Found: + if ( coverage & 8 ) /* override or add */ + result = value; + else + result += value; + + NextTable: + p = next; + } + + return result; + } + +#undef TT_KERN_INDEX + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttkern.h b/src/3rdparty/freetype/src/sfnt/ttkern.h new file mode 100644 index 0000000000..df1da9b273 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttkern.h @@ -0,0 +1,52 @@ +/***************************************************************************/ +/* */ +/* ttkern.h */ +/* */ +/* Load the basic TrueType kerning table. This doesn't handle */ +/* kerning data within the GPOS table at the moment. */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTKERN_H__ +#define __TTKERN_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_done_kern( TT_Face face ); + + FT_LOCAL( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + +#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 ) + + +FT_END_HEADER + +#endif /* __TTKERN_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttload.c b/src/3rdparty/freetype/src/sfnt/ttload.c new file mode 100644 index 0000000000..c45a1ed556 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttload.c @@ -0,0 +1,1248 @@ +/***************************************************************************/ +/* */ +/* ttload.c */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttload.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttload + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_lookup_table */ + /* */ + /* <Description> */ + /* Looks for a TrueType table by name. */ + /* */ + /* <Input> */ + /* face :: A face object handle. */ + /* */ + /* tag :: The searched tag. */ + /* */ + /* <Return> */ + /* A pointer to the table directory entry. 0 if not found. */ + /* */ + FT_LOCAL_DEF( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ) + { + TT_Table entry; + TT_Table limit; +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool zero_length = FALSE; +#endif + + + FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", + face, + (FT_Char)( tag >> 24 ), + (FT_Char)( tag >> 16 ), + (FT_Char)( tag >> 8 ), + (FT_Char)( tag ) )); + + entry = face->dir_tables; + limit = entry + face->num_tables; + + for ( ; entry < limit; entry++ ) + { + /* For compatibility with Windows, we consider */ + /* zero-length tables the same as missing tables. */ + if ( entry->Tag == tag ) { + if ( entry->Length != 0 ) + { + FT_TRACE4(( "found table.\n" )); + return entry; + } +#ifdef FT_DEBUG_LEVEL_TRACE + zero_length = TRUE; +#endif + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( zero_length ) + FT_TRACE4(( "ignoring empty table!\n" )); + else + FT_TRACE4(( "could not find table!\n" )); +#endif + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_goto_table */ + /* */ + /* <Description> */ + /* Looks for a TrueType table by name, then seek a stream to it. */ + /* */ + /* <Input> */ + /* face :: A face object handle. */ + /* */ + /* tag :: The searched tag. */ + /* */ + /* stream :: The stream to seek when the table is found. */ + /* */ + /* <Output> */ + /* length :: The length of the table if found, undefined otherwise. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ) + { + TT_Table table; + FT_Error error; + + + table = tt_face_lookup_table( face, tag ); + if ( table ) + { + if ( length ) + *length = table->Length; + + if ( FT_STREAM_SEEK( table->Offset ) ) + goto Exit; + } + else + error = SFNT_Err_Table_Missing; + + Exit: + return error; + } + + + /* Here, we */ + /* */ + /* - check that `num_tables' is valid (and adjust it if necessary) */ + /* */ + /* - look for a `head' table, check its size, and parse it to check */ + /* whether its `magic' field is correctly set */ + /* */ + /* - errors (except errors returned by stream handling) */ + /* */ + /* SFNT_Err_Unknown_File_Format: */ + /* no table is defined in directory, it is not sfnt-wrapped */ + /* data */ + /* SFNT_Err_Table_Missing: */ + /* table directory is valid, but essential tables */ + /* (head/bhed/SING) are missing */ + /* */ + static FT_Error + check_table_dir( SFNT_Header sfnt, + FT_Stream stream ) + { + FT_Error error; + FT_UInt nn, valid_entries = 0; + FT_UInt has_head = 0, has_sing = 0, has_meta = 0; + FT_ULong offset = sfnt->offset + 12; + + static const FT_Frame_Field table_dir_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_TableRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG( Tag ), + FT_FRAME_ULONG( CheckSum ), + FT_FRAME_ULONG( Offset ), + FT_FRAME_ULONG( Length ), + FT_FRAME_END + }; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + for ( nn = 0; nn < sfnt->num_tables; nn++ ) + { + TT_TableRec table; + + + if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) ) + { + nn--; + FT_TRACE2(( "check_table_dir:" + " can read only %d table%s in font (instead of %d)\n", + nn, nn == 1 ? "" : "s", sfnt->num_tables )); + sfnt->num_tables = nn; + break; + } + + /* we ignore invalid tables */ + if ( table.Offset + table.Length > stream->size ) + { + FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn )); + continue; + } + else + valid_entries++; + + if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed ) + { + FT_UInt32 magic; + + +#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + if ( table.Tag == TTAG_head ) +#endif + has_head = 1; + + /* + * The table length should be 0x36, but certain font tools make it + * 0x38, so we will just check that it is greater. + * + * Note that according to the specification, the table must be + * padded to 32-bit lengths, but this doesn't apply to the value of + * its `Length' field! + * + */ + if ( table.Length < 0x36 ) + { + FT_TRACE2(( "check_table_dir: `head' table too small\n" )); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_STREAM_SEEK( table.Offset + 12 ) || + FT_READ_ULONG( magic ) ) + goto Exit; + + if ( magic != 0x5F0F3CF5UL ) + { + FT_TRACE2(( "check_table_dir:" + " no magic number found in `head' table\n")); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) ) + goto Exit; + } + else if ( table.Tag == TTAG_SING ) + has_sing = 1; + else if ( table.Tag == TTAG_META ) + has_meta = 1; + } + + sfnt->num_tables = valid_entries; + + if ( sfnt->num_tables == 0 ) + { + FT_TRACE2(( "check_table_dir: no tables found\n" )); + error = SFNT_Err_Unknown_File_Format; + goto Exit; + } + + /* if `sing' and `meta' tables are present, there is no `head' table */ + if ( has_head || ( has_sing && has_meta ) ) + { + error = SFNT_Err_Ok; + goto Exit; + } + else + { + FT_TRACE2(( "check_table_dir:" )); +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" )); +#else + FT_TRACE2(( " neither `head' nor `sing' table found\n" )); +#endif + error = SFNT_Err_Table_Missing; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_font_dir */ + /* */ + /* <Description> */ + /* Loads the header of a SFNT font file. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the beginning of the font directory. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ) + { + SFNT_HeaderRec sfnt; + FT_Error error; + FT_Memory memory = stream->memory; + TT_TableRec* entry; + FT_Int nn; + + static const FT_Frame_Field offset_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE SFNT_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_USHORT( num_tables ), + FT_FRAME_USHORT( search_range ), + FT_FRAME_USHORT( entry_selector ), + FT_FRAME_USHORT( range_shift ), + FT_FRAME_END + }; + + + FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face )); + + /* read the offset table */ + + sfnt.offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( sfnt.format_tag ) || + FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) ) + goto Exit; + + /* many fonts don't have these fields set correctly */ +#if 0 + if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) || + sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 ) + return SFNT_Err_Unknown_File_Format; +#endif + + /* load the table directory */ + + FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables )); + FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag )); + + /* check first */ + error = check_table_dir( &sfnt, stream ); + if ( error ) + { + FT_TRACE2(( "tt_face_load_font_dir: invalid table directory for TrueType!\n" )); + + goto Exit; + } + + face->num_tables = sfnt.num_tables; + face->format_tag = sfnt.format_tag; + + if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) ) + goto Exit; + + if ( FT_STREAM_SEEK( sfnt.offset + 12 ) || + FT_FRAME_ENTER( face->num_tables * 16L ) ) + goto Exit; + + entry = face->dir_tables; + + for ( nn = 0; nn < sfnt.num_tables; nn++ ) + { + entry->Tag = FT_GET_TAG4(); + entry->CheckSum = FT_GET_ULONG(); + entry->Offset = FT_GET_LONG(); + entry->Length = FT_GET_LONG(); + + /* ignore invalid tables */ + if ( entry->Offset + entry->Length > stream->size ) + continue; + else + { + FT_TRACE2(( " %c%c%c%c - %08lx - %08lx\n", + (FT_Char)( entry->Tag >> 24 ), + (FT_Char)( entry->Tag >> 16 ), + (FT_Char)( entry->Tag >> 8 ), + (FT_Char)( entry->Tag ), + entry->Offset, + entry->Length )); + entry++; + } + } + + FT_FRAME_EXIT(); + + FT_TRACE2(( "table directory loaded\n\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_any */ + /* */ + /* <Description> */ + /* Loads any font table into client memory. */ + /* */ + /* <Input> */ + /* face :: The face object to look for. */ + /* */ + /* tag :: The tag of table to load. Use the value 0 if you want */ + /* to access the whole font file, else set this parameter */ + /* to a valid TrueType table tag that you can forge with */ + /* the MAKE_TT_TAG macro. */ + /* */ + /* offset :: The starting offset in the table (or the file if */ + /* tag == 0). */ + /* */ + /* length :: The address of the decision variable: */ + /* */ + /* If length == NULL: */ + /* Loads the whole table. Returns an error if */ + /* `offset' == 0! */ + /* */ + /* If *length == 0: */ + /* Exits immediately; returning the length of the given */ + /* table or of the font file, depending on the value of */ + /* `tag'. */ + /* */ + /* If *length != 0: */ + /* Loads the next `length' bytes of table or font, */ + /* starting at offset `offset' (in table or font too). */ + /* */ + /* <Output> */ + /* buffer :: The address of target buffer. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Error error; + FT_Stream stream; + TT_Table table; + FT_ULong size; + + + if ( tag != 0 ) + { + /* look for tag in font directory */ + table = tt_face_lookup_table( face, tag ); + if ( !table ) + { + error = SFNT_Err_Table_Missing; + goto Exit; + } + + offset += table->Offset; + size = table->Length; + } + else + /* tag == 0 -- the user wants to access the font file directly */ + size = face->root.stream->size; + + if ( length && *length == 0 ) + { + *length = size; + + return SFNT_Err_Ok; + } + + if ( length ) + size = *length; + + stream = face->root.stream; + /* the `if' is syntactic sugar for picky compilers */ + if ( FT_STREAM_READ_AT( offset, buffer, size ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_generic_header */ + /* */ + /* <Description> */ + /* Loads the TrueType table `head' or `bhed'. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + tt_face_load_generic_header( TT_Face face, + FT_Stream stream, + FT_ULong tag ) + { + FT_Error error; + TT_Header* header; + + static const FT_Frame_Field header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Header + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Table_Version ), + FT_FRAME_ULONG ( Font_Revision ), + FT_FRAME_LONG ( CheckSum_Adjust ), + FT_FRAME_LONG ( Magic_Number ), + FT_FRAME_USHORT( Flags ), + FT_FRAME_USHORT( Units_Per_EM ), + FT_FRAME_LONG ( Created[0] ), + FT_FRAME_LONG ( Created[1] ), + FT_FRAME_LONG ( Modified[0] ), + FT_FRAME_LONG ( Modified[1] ), + FT_FRAME_SHORT ( xMin ), + FT_FRAME_SHORT ( yMin ), + FT_FRAME_SHORT ( xMax ), + FT_FRAME_SHORT ( yMax ), + FT_FRAME_USHORT( Mac_Style ), + FT_FRAME_USHORT( Lowest_Rec_PPEM ), + FT_FRAME_SHORT ( Font_Direction ), + FT_FRAME_SHORT ( Index_To_Loc_Format ), + FT_FRAME_SHORT ( Glyph_Data_Format ), + FT_FRAME_END + }; + + + error = face->goto_table( face, tag, stream, 0 ); + if ( error ) + goto Exit; + + header = &face->header; + + if ( FT_STREAM_READ_FIELDS( header_fields, header ) ) + goto Exit; + + FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM )); + FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_head ); + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_bhed ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_max_profile */ + /* */ + /* <Description> */ + /* Loads the maximum profile into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_MaxProfile* maxProfile = &face->max_profile; + + const FT_Frame_Field maxp_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_MaxProfile + + FT_FRAME_START( 6 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( numGlyphs ), + FT_FRAME_END + }; + + const FT_Frame_Field maxp_fields_extra[] = + { + FT_FRAME_START( 26 ), + FT_FRAME_USHORT( maxPoints ), + FT_FRAME_USHORT( maxContours ), + FT_FRAME_USHORT( maxCompositePoints ), + FT_FRAME_USHORT( maxCompositeContours ), + FT_FRAME_USHORT( maxZones ), + FT_FRAME_USHORT( maxTwilightPoints ), + FT_FRAME_USHORT( maxStorage ), + FT_FRAME_USHORT( maxFunctionDefs ), + FT_FRAME_USHORT( maxInstructionDefs ), + FT_FRAME_USHORT( maxStackElements ), + FT_FRAME_USHORT( maxSizeOfInstructions ), + FT_FRAME_USHORT( maxComponentElements ), + FT_FRAME_USHORT( maxComponentDepth ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_maxp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) ) + goto Exit; + + maxProfile->maxPoints = 0; + maxProfile->maxContours = 0; + maxProfile->maxCompositePoints = 0; + maxProfile->maxCompositeContours = 0; + maxProfile->maxZones = 0; + maxProfile->maxTwilightPoints = 0; + maxProfile->maxStorage = 0; + maxProfile->maxFunctionDefs = 0; + maxProfile->maxInstructionDefs = 0; + maxProfile->maxStackElements = 0; + maxProfile->maxSizeOfInstructions = 0; + maxProfile->maxComponentElements = 0; + maxProfile->maxComponentDepth = 0; + + if ( maxProfile->version >= 0x10000L ) + { + if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) ) + goto Exit; + + /* XXX: an adjustment that is necessary to load certain */ + /* broken fonts like `Keystrokes MT' :-( */ + /* */ + /* We allocate 64 function entries by default when */ + /* the maxFunctionDefs field is null. */ + + if ( maxProfile->maxFunctionDefs == 0 ) + maxProfile->maxFunctionDefs = 64; + + /* we add 4 phantom points later */ + if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) ) + { + FT_ERROR(( "Too much twilight points in `maxp' table;\n" )); + FT_ERROR(( " some glyphs might be rendered incorrectly.\n" )); + + maxProfile->maxTwilightPoints = 0xFFFFU - 4; + } + } + + FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_names */ + /* */ + /* <Description> */ + /* Loads the name records. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_pos, table_len; + FT_ULong storage_start, storage_limit; + FT_UInt count; + TT_NameTable table; + + static const FT_Frame_Field name_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameTableRec + + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( format ), + FT_FRAME_USHORT( numNameRecords ), + FT_FRAME_USHORT( storageOffset ), + FT_FRAME_END + }; + + static const FT_Frame_Field name_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameEntryRec + + /* no FT_FRAME_START */ + FT_FRAME_USHORT( platformID ), + FT_FRAME_USHORT( encodingID ), + FT_FRAME_USHORT( languageID ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_USHORT( stringLength ), + FT_FRAME_USHORT( stringOffset ), + FT_FRAME_END + }; + + + table = &face->name_table; + table->stream = stream; + + error = face->goto_table( face, TTAG_name, stream, &table_len ); + if ( error ) + goto Exit; + + table_pos = FT_STREAM_POS(); + + + if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) + goto Exit; + + /* Some popular Asian fonts have an invalid `storageOffset' value */ + /* (it should be at least "6 + 12*num_names"). However, the string */ + /* offsets, computed as "storageOffset + entry->stringOffset", are */ + /* valid pointers within the name table... */ + /* */ + /* We thus can't check `storageOffset' right now. */ + /* */ + storage_start = table_pos + 6 + 12*table->numNameRecords; + storage_limit = table_pos + table_len; + + if ( storage_start > storage_limit ) + { + FT_ERROR(( "invalid `name' table\n" )); + error = SFNT_Err_Name_Table_Missing; + goto Exit; + } + + /* Allocate the array of name records. */ + count = table->numNameRecords; + table->numNameRecords = 0; + + if ( FT_NEW_ARRAY( table->names, count ) || + FT_FRAME_ENTER( count * 12 ) ) + goto Exit; + + /* Load the name records and determine how much storage is needed */ + /* to hold the strings themselves. */ + { + TT_NameEntryRec* entry = table->names; + + + for ( ; count > 0; count-- ) + { + if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) ) + continue; + + /* check that the name is not empty */ + if ( entry->stringLength == 0 ) + continue; + + /* check that the name string is within the table */ + entry->stringOffset += table_pos + table->storageOffset; + if ( entry->stringOffset < storage_start || + entry->stringOffset + entry->stringLength > storage_limit ) + { + /* invalid entry - ignore it */ + entry->stringOffset = 0; + entry->stringLength = 0; + continue; + } + + entry++; + } + + table->numNameRecords = (FT_UInt)( entry - table->names ); + } + + FT_FRAME_EXIT(); + + /* everything went well, update face->num_names */ + face->num_names = (FT_UShort) table->numNameRecords; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_free_names */ + /* */ + /* <Description> */ + /* Frees the name records. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_free_name( TT_Face face ) + { + FT_Memory memory = face->root.driver->root.memory; + TT_NameTable table = &face->name_table; + TT_NameEntry entry = table->names; + FT_UInt count = table->numNameRecords; + + + if ( table->names ) + { + for ( ; count > 0; count--, entry++ ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + + /* free strings table */ + FT_FREE( table->names ); + } + + table->numNameRecords = 0; + table->format = 0; + table->storageOffset = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_cmap */ + /* */ + /* <Description> */ + /* Loads the cmap directory in a face object. The cmaps themselves */ + /* are loaded on demand in the `ttcmap.c' module. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + + + error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); + if ( error ) + goto Exit; + + if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) + face->cmap_size = 0; + + Exit: + return error; + } + + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_os2 */ + /* */ + /* <Description> */ + /* Loads the OS2 table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_OS2* os2; + + const FT_Frame_Field os2_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_OS2 + + FT_FRAME_START( 78 ), + FT_FRAME_USHORT( version ), + FT_FRAME_SHORT ( xAvgCharWidth ), + FT_FRAME_USHORT( usWeightClass ), + FT_FRAME_USHORT( usWidthClass ), + FT_FRAME_SHORT ( fsType ), + FT_FRAME_SHORT ( ySubscriptXSize ), + FT_FRAME_SHORT ( ySubscriptYSize ), + FT_FRAME_SHORT ( ySubscriptXOffset ), + FT_FRAME_SHORT ( ySubscriptYOffset ), + FT_FRAME_SHORT ( ySuperscriptXSize ), + FT_FRAME_SHORT ( ySuperscriptYSize ), + FT_FRAME_SHORT ( ySuperscriptXOffset ), + FT_FRAME_SHORT ( ySuperscriptYOffset ), + FT_FRAME_SHORT ( yStrikeoutSize ), + FT_FRAME_SHORT ( yStrikeoutPosition ), + FT_FRAME_SHORT ( sFamilyClass ), + FT_FRAME_BYTE ( panose[0] ), + FT_FRAME_BYTE ( panose[1] ), + FT_FRAME_BYTE ( panose[2] ), + FT_FRAME_BYTE ( panose[3] ), + FT_FRAME_BYTE ( panose[4] ), + FT_FRAME_BYTE ( panose[5] ), + FT_FRAME_BYTE ( panose[6] ), + FT_FRAME_BYTE ( panose[7] ), + FT_FRAME_BYTE ( panose[8] ), + FT_FRAME_BYTE ( panose[9] ), + FT_FRAME_ULONG ( ulUnicodeRange1 ), + FT_FRAME_ULONG ( ulUnicodeRange2 ), + FT_FRAME_ULONG ( ulUnicodeRange3 ), + FT_FRAME_ULONG ( ulUnicodeRange4 ), + FT_FRAME_BYTE ( achVendID[0] ), + FT_FRAME_BYTE ( achVendID[1] ), + FT_FRAME_BYTE ( achVendID[2] ), + FT_FRAME_BYTE ( achVendID[3] ), + + FT_FRAME_USHORT( fsSelection ), + FT_FRAME_USHORT( usFirstCharIndex ), + FT_FRAME_USHORT( usLastCharIndex ), + FT_FRAME_SHORT ( sTypoAscender ), + FT_FRAME_SHORT ( sTypoDescender ), + FT_FRAME_SHORT ( sTypoLineGap ), + FT_FRAME_USHORT( usWinAscent ), + FT_FRAME_USHORT( usWinDescent ), + FT_FRAME_END + }; + + const FT_Frame_Field os2_fields_extra[] = + { + FT_FRAME_START( 8 ), + FT_FRAME_ULONG( ulCodePageRange1 ), + FT_FRAME_ULONG( ulCodePageRange2 ), + FT_FRAME_END + }; + + const FT_Frame_Field os2_fields_extra2[] = + { + FT_FRAME_START( 10 ), + FT_FRAME_SHORT ( sxHeight ), + FT_FRAME_SHORT ( sCapHeight ), + FT_FRAME_USHORT( usDefaultChar ), + FT_FRAME_USHORT( usBreakChar ), + FT_FRAME_USHORT( usMaxContext ), + FT_FRAME_END + }; + + + /* We now support old Mac fonts where the OS/2 table doesn't */ + /* exist. Simply put, we set the `version' field to 0xFFFF */ + /* and test this value each time we need to access the table. */ + error = face->goto_table( face, TTAG_OS2, stream, 0 ); + if ( error ) + goto Exit; + + os2 = &face->os2; + + if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) ) + goto Exit; + + os2->ulCodePageRange1 = 0; + os2->ulCodePageRange2 = 0; + os2->sxHeight = 0; + os2->sCapHeight = 0; + os2->usDefaultChar = 0; + os2->usBreakChar = 0; + os2->usMaxContext = 0; + + if ( os2->version >= 0x0001 ) + { + /* only version 1 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) ) + goto Exit; + + if ( os2->version >= 0x0002 ) + { + /* only version 2 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) ) + goto Exit; + } + } + + FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender )); + FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender )); + FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent )); + FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent )); + FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_postscript */ + /* */ + /* <Description> */ + /* Loads the Postscript table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_Postscript* post = &face->postscript; + + static const FT_Frame_Field post_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Postscript + + FT_FRAME_START( 32 ), + FT_FRAME_ULONG( FormatType ), + FT_FRAME_ULONG( italicAngle ), + FT_FRAME_SHORT( underlinePosition ), + FT_FRAME_SHORT( underlineThickness ), + FT_FRAME_ULONG( isFixedPitch ), + FT_FRAME_ULONG( minMemType42 ), + FT_FRAME_ULONG( maxMemType42 ), + FT_FRAME_ULONG( minMemType1 ), + FT_FRAME_ULONG( maxMemType1 ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + return error; + + if ( FT_STREAM_READ_FIELDS( post_fields, post ) ) + return error; + + /* we don't load the glyph names, we do that in another */ + /* module (ttpost). */ + + FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType )); + FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch + ? " yes" : " no" )); + + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_pclt */ + /* */ + /* <Description> */ + /* Loads the PCL 5 Table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ) + { + static const FT_Frame_Field pclt_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_PCLT + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_ULONG ( FontNumber ), + FT_FRAME_USHORT( Pitch ), + FT_FRAME_USHORT( xHeight ), + FT_FRAME_USHORT( Style ), + FT_FRAME_USHORT( TypeFamily ), + FT_FRAME_USHORT( CapHeight ), + FT_FRAME_BYTES ( TypeFace, 16 ), + FT_FRAME_BYTES ( CharacterComplement, 8 ), + FT_FRAME_BYTES ( FileName, 6 ), + FT_FRAME_CHAR ( StrokeWeight ), + FT_FRAME_CHAR ( WidthType ), + FT_FRAME_BYTE ( SerifStyle ), + FT_FRAME_BYTE ( Reserved ), + FT_FRAME_END + }; + + FT_Error error; + TT_PCLT* pclt = &face->pclt; + + + /* optional table */ + error = face->goto_table( face, TTAG_PCLT, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_gasp */ + /* */ + /* <Description> */ + /* Loads the `gasp' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_UInt j,num_ranges; + TT_GaspRange gaspranges; + + + /* the gasp table is optional */ + error = face->goto_table( face, TTAG_gasp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_FRAME_ENTER( 4L ) ) + goto Exit; + + face->gasp.version = FT_GET_USHORT(); + face->gasp.numRanges = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + + /* only support versions 0 and 1 of the table */ + if ( face->gasp.version >= 2 ) + { + face->gasp.numRanges = 0; + error = SFNT_Err_Invalid_Table; + goto Exit; + } + + num_ranges = face->gasp.numRanges; + FT_TRACE3(( "numRanges: %u\n", num_ranges )); + + if ( FT_QNEW_ARRAY( gaspranges, num_ranges ) || + FT_FRAME_ENTER( num_ranges * 4L ) ) + goto Exit; + + face->gasp.gaspRanges = gaspranges; + + for ( j = 0; j < num_ranges; j++ ) + { + gaspranges[j].maxPPEM = FT_GET_USHORT(); + gaspranges[j].gaspFlag = FT_GET_USHORT(); + + FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n", + j, + gaspranges[j].maxPPEM, + gaspranges[j].gaspFlag )); + } + + FT_FRAME_EXIT(); + + Exit: + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttload.h b/src/3rdparty/freetype/src/sfnt/ttload.h new file mode 100644 index 0000000000..49a1aee163 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttload.h @@ -0,0 +1,112 @@ +/***************************************************************************/ +/* */ +/* ttload.h */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTLOAD_H__ +#define __TTLOAD_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ); + + FT_LOCAL( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_name( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ); + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + +FT_END_HEADER + +#endif /* __TTLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttmtx.c b/src/3rdparty/freetype/src/sfnt/ttmtx.c new file mode 100644 index 0000000000..2a7d22c072 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttmtx.c @@ -0,0 +1,466 @@ +/***************************************************************************/ +/* */ +/* ttmtx.c */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (body). */ +/* */ +/* Copyright 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttmtx.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttmtx + + + /* + * Unfortunately, we can't enable our memory optimizations if + * FT_CONFIG_OPTION_OLD_INTERNALS is defined. This is because at least + * one rogue client (libXfont in the X.Org XServer) is directly accessing + * the metrics. + */ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_hmtx */ + /* */ + /* <Description> */ + /* Load the `hmtx' or `vmtx' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load `vmtx'. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + FT_ULong tag, table_size; + FT_ULong* ptable_offset; + FT_ULong* ptable_size; + + + if ( vertical ) + { + tag = TTAG_vmtx; + ptable_offset = &face->vert_metrics_offset; + ptable_size = &face->vert_metrics_size; + } + else + { + tag = TTAG_hmtx; + ptable_offset = &face->horz_metrics_offset; + ptable_size = &face->horz_metrics_size; + } + + error = face->goto_table( face, tag, stream, &table_size ); + if ( error ) + goto Fail; + + *ptable_size = table_size; + *ptable_offset = FT_STREAM_POS(); + + Fail: + return error; + } + +#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_ULong table_len; + FT_Long num_shorts, num_longs, num_shorts_checked; + + TT_LongMetrics* longs; + TT_ShortMetrics** shorts; + FT_Byte* p; + + + if ( vertical ) + { + void* lm = &face->vertical.long_metrics; + void** sm = &face->vertical.short_metrics; + + + error = face->goto_table( face, TTAG_vmtx, stream, &table_len ); + if ( error ) + goto Fail; + + num_longs = face->vertical.number_Of_VMetrics; + if ( (FT_ULong)num_longs > table_len / 4 ) + num_longs = (FT_Long)( table_len / 4 ); + + face->vertical.number_Of_VMetrics = 0; + + longs = (TT_LongMetrics*)lm; + shorts = (TT_ShortMetrics**)sm; + } + else + { + void* lm = &face->horizontal.long_metrics; + void** sm = &face->horizontal.short_metrics; + + + error = face->goto_table( face, TTAG_hmtx, stream, &table_len ); + if ( error ) + goto Fail; + + num_longs = face->horizontal.number_Of_HMetrics; + if ( (FT_ULong)num_longs > table_len / 4 ) + num_longs = (FT_Long)( table_len / 4 ); + + face->horizontal.number_Of_HMetrics = 0; + + longs = (TT_LongMetrics*)lm; + shorts = (TT_ShortMetrics**)sm; + } + + /* never trust derived values */ + + num_shorts = face->max_profile.numGlyphs - num_longs; + num_shorts_checked = ( table_len - num_longs * 4L ) / 2; + + if ( num_shorts < 0 ) + { + FT_ERROR(( "%cmtx has more metrics than glyphs.\n" )); + + /* Adobe simply ignores this problem. So we shall do the same. */ +#if 0 + error = vertical ? SFNT_Err_Invalid_Vert_Metrics + : SFNT_Err_Invalid_Horiz_Metrics; + goto Exit; +#else + num_shorts = 0; +#endif + } + + if ( FT_QNEW_ARRAY( *longs, num_longs ) || + FT_QNEW_ARRAY( *shorts, num_shorts ) ) + goto Fail; + + if ( FT_FRAME_ENTER( table_len ) ) + goto Fail; + + p = stream->cursor; + + { + TT_LongMetrics cur = *longs; + TT_LongMetrics limit = cur + num_longs; + + + for ( ; cur < limit; cur++ ) + { + cur->advance = FT_NEXT_USHORT( p ); + cur->bearing = FT_NEXT_SHORT( p ); + } + } + + /* do we have an inconsistent number of metric values? */ + { + TT_ShortMetrics* cur = *shorts; + TT_ShortMetrics* limit = cur + + FT_MIN( num_shorts, num_shorts_checked ); + + + for ( ; cur < limit; cur++ ) + *cur = FT_NEXT_SHORT( p ); + + /* We fill up the missing left side bearings with the */ + /* last valid value. Since this will occur for buggy CJK */ + /* fonts usually only, nothing serious will happen. */ + if ( num_shorts > num_shorts_checked && num_shorts_checked > 0 ) + { + FT_Short val = (*shorts)[num_shorts_checked - 1]; + + + limit = *shorts + num_shorts; + for ( ; cur < limit; cur++ ) + *cur = val; + } + } + + FT_FRAME_EXIT(); + + if ( vertical ) + face->vertical.number_Of_VMetrics = (FT_UShort)num_longs; + else + face->horizontal.number_Of_HMetrics = (FT_UShort)num_longs; + + Fail: + return error; + } + +#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_hhea */ + /* */ + /* <Description> */ + /* Load the `hhea' or 'vhea' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load `vhea'. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + TT_HoriHeader* header; + + const FT_Frame_Field metrics_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_HoriHeader + + FT_FRAME_START( 36 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_SHORT ( Ascender ), + FT_FRAME_SHORT ( Descender ), + FT_FRAME_SHORT ( Line_Gap ), + FT_FRAME_USHORT( advance_Width_Max ), + FT_FRAME_SHORT ( min_Left_Side_Bearing ), + FT_FRAME_SHORT ( min_Right_Side_Bearing ), + FT_FRAME_SHORT ( xMax_Extent ), + FT_FRAME_SHORT ( caret_Slope_Rise ), + FT_FRAME_SHORT ( caret_Slope_Run ), + FT_FRAME_SHORT ( caret_Offset ), + FT_FRAME_SHORT ( Reserved[0] ), + FT_FRAME_SHORT ( Reserved[1] ), + FT_FRAME_SHORT ( Reserved[2] ), + FT_FRAME_SHORT ( Reserved[3] ), + FT_FRAME_SHORT ( metric_Data_Format ), + FT_FRAME_USHORT( number_Of_HMetrics ), + FT_FRAME_END + }; + + + if ( vertical ) + { + void *v = &face->vertical; + + + error = face->goto_table( face, TTAG_vhea, stream, 0 ); + if ( error ) + goto Fail; + + header = (TT_HoriHeader*)v; + } + else + { + error = face->goto_table( face, TTAG_hhea, stream, 0 ); + if ( error ) + goto Fail; + + header = &face->horizontal; + } + + if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) + goto Fail; + + FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); + FT_TRACE3(( "Descender: %5d\n", header->Descender )); + FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); + + header->long_metrics = NULL; + header->short_metrics = NULL; + + Fail: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_metrics */ + /* */ + /* <Description> */ + /* Returns the horizontal or vertical metrics in font units for a */ + /* given glyph. The metrics are the left side bearing (resp. top */ + /* side bearing) and advance width (resp. advance height). */ + /* */ + /* <Input> */ + /* header :: A pointer to either the horizontal or vertical metrics */ + /* structure. */ + /* */ + /* idx :: The glyph index. */ + /* */ + /* <Output> */ + /* bearing :: The bearing, either left side or top side. */ + /* */ + /* advance :: The advance width resp. advance height. */ + /* */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_LOCAL_DEF( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short *abearing, + FT_UShort *aadvance ) + { + FT_Error error; + FT_Stream stream = face->root.stream; + TT_HoriHeader* header; + FT_ULong table_pos, table_size, table_end; + FT_UShort k; + + + if ( vertical ) + { + void* v = &face->vertical; + + + header = (TT_HoriHeader*)v; + table_pos = face->vert_metrics_offset; + table_size = face->vert_metrics_size; + } + else + { + header = &face->horizontal; + table_pos = face->horz_metrics_offset; + table_size = face->horz_metrics_size; + } + + table_end = table_pos + table_size; + + k = header->number_Of_HMetrics; + + if ( k > 0 ) + { + if ( gindex < (FT_UInt)k ) + { + table_pos += 4 * gindex; + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) || + FT_READ_SHORT( *abearing ) ) + goto NoData; + } + else + { + table_pos += 4 * ( k - 1 ); + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) ) + goto NoData; + + table_pos += 4 + 2 * ( gindex - k ); + if ( table_pos + 2 > table_end ) + *abearing = 0; + else + { + if ( !FT_STREAM_SEEK( table_pos ) ) + (void)FT_READ_SHORT( *abearing ); + } + } + } + else + { + NoData: + *abearing = 0; + *aadvance = 0; + } + + return SFNT_Err_Ok; + } + +#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ) + { + void* v = &face->vertical; + void* h = &face->horizontal; + TT_HoriHeader* header = vertical ? (TT_HoriHeader*)v + : (TT_HoriHeader*)h; + TT_LongMetrics longs_m; + FT_UShort k = header->number_Of_HMetrics; + + + if ( k == 0 || + !header->long_metrics || + gindex >= (FT_UInt)face->max_profile.numGlyphs ) + { + *abearing = *aadvance = 0; + return SFNT_Err_Ok; + } + + if ( gindex < (FT_UInt)k ) + { + longs_m = (TT_LongMetrics)header->long_metrics + gindex; + *abearing = longs_m->bearing; + *aadvance = longs_m->advance; + } + else + { + *abearing = ((TT_ShortMetrics*)header->short_metrics)[gindex - k]; + *aadvance = ((TT_LongMetrics)header->long_metrics)[k - 1].advance; + } + + return SFNT_Err_Ok; + } + +#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttmtx.h b/src/3rdparty/freetype/src/sfnt/ttmtx.h new file mode 100644 index 0000000000..8b91a113d8 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttmtx.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ttmtx.h */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTMTX_H__ +#define __TTMTX_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + +FT_END_HEADER + +#endif /* __TTMTX_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttpost.c b/src/3rdparty/freetype/src/sfnt/ttpost.c new file mode 100644 index 0000000000..ce628e210d --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttpost.c @@ -0,0 +1,522 @@ +/***************************************************************************/ +/* */ +/* ttpost.c */ +/* */ +/* Postcript name table processing for TrueType and OpenType fonts */ +/* (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* The post table is not completely loaded by the core engine. This */ + /* file loads the missing PS glyph names and implements an API to access */ + /* them. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttpost.h" +#include "ttload.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttpost + + + /* If this configuration macro is defined, we rely on the `PSNames' */ + /* module to grab the glyph names. */ + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) ) + + +#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* Otherwise, we ignore the `PSNames' module, and provide our own */ + /* table of Mac names. Thus, it is possible to build a version of */ + /* FreeType without the Type 1 driver & PSNames module. */ + +#define MAC_NAME( x ) ( (FT_String*)tt_post_default_names[x] ) + + /* the 258 default Mac PS glyph names */ + + static const FT_String* const tt_post_default_names[258] = + { + /* 0 */ + ".notdef", ".null", "CR", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + /* 10 */ + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + /* 20 */ + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + /* 30 */ + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + /* 40 */ + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + /* 50 */ + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + /* 60 */ + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + /* 70 */ + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + /* 80 */ + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + /* 90 */ + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + /* 100 */ + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + /* 110 */ + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + /* 120 */ + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + /* 130 */ + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + /* 140 */ + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + /* 150 */ + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + /* 160 */ + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + /* 170 */ + "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + /* 180 */ + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + /* 190 */ + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + /* 200 */ + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + /* 210 */ + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + /* 220 */ + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + /* 230 */ + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + /* 240 */ + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + /* 250 */ + "Idot", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dmacron", + }; + + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + static FT_Error + load_format_20( TT_Face face, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_Int num_glyphs; + FT_UShort num_names; + + FT_UShort* glyph_indices = 0; + FT_Char** name_strings = 0; + + + if ( FT_READ_USHORT( num_glyphs ) ) + goto Exit; + + /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ + /* than the value in the maxp table (cf. cyberbit.ttf). */ + + /* There already exist fonts which have more than 32768 glyph names */ + /* in this table, so the test for this threshold has been dropped. */ + + if ( num_glyphs > face->max_profile.numGlyphs ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* load the indices */ + { + FT_Int n; + + + if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * 2L ) ) + goto Fail; + + for ( n = 0; n < num_glyphs; n++ ) + glyph_indices[n] = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + } + + /* compute number of names stored in table */ + { + FT_Int n; + + + num_names = 0; + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Int idx; + + + idx = glyph_indices[n]; + if ( idx >= 258 ) + { + idx -= 257; + if ( idx > num_names ) + num_names = (FT_UShort)idx; + } + } + } + + /* now load the name strings */ + { + FT_UShort n; + + + if ( FT_NEW_ARRAY( name_strings, num_names ) ) + goto Fail; + + for ( n = 0; n < num_names; n++ ) + { + FT_UInt len; + + + if ( FT_READ_BYTE ( len ) || + FT_NEW_ARRAY( name_strings[n], len + 1 ) || + FT_STREAM_READ ( name_strings[n], len ) ) + goto Fail1; + + name_strings[n][len] = '\0'; + } + } + + /* all right, set table fields and exit successfully */ + { + TT_Post_20 table = &face->postscript_names.names.format_20; + + + table->num_glyphs = (FT_UShort)num_glyphs; + table->num_names = (FT_UShort)num_names; + table->glyph_indices = glyph_indices; + table->glyph_names = name_strings; + } + return SFNT_Err_Ok; + + Fail1: + { + FT_UShort n; + + + for ( n = 0; n < num_names; n++ ) + FT_FREE( name_strings[n] ); + } + + Fail: + FT_FREE( name_strings ); + FT_FREE( glyph_indices ); + + Exit: + return error; + } + + + static FT_Error + load_format_25( TT_Face face, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_Int num_glyphs; + FT_Char* offset_table = 0; + + + /* UNDOCUMENTED! This value appears only in the Apple TT specs. */ + if ( FT_READ_USHORT( num_glyphs ) ) + goto Exit; + + /* check the number of glyphs */ + if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_NEW_ARRAY( offset_table, num_glyphs ) || + FT_STREAM_READ( offset_table, num_glyphs ) ) + goto Fail; + + /* now check the offset table */ + { + FT_Int n; + + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Long idx = (FT_Long)n + offset_table[n]; + + + if ( idx < 0 || idx > num_glyphs ) + { + error = SFNT_Err_Invalid_File_Format; + goto Fail; + } + } + } + + /* OK, set table fields and exit successfully */ + { + TT_Post_25 table = &face->postscript_names.names.format_25; + + + table->num_glyphs = (FT_UShort)num_glyphs; + table->offsets = offset_table; + } + + return SFNT_Err_Ok; + + Fail: + FT_FREE( offset_table ); + + Exit: + return error; + } + + + static FT_Error + load_post_names( TT_Face face ) + { + FT_Stream stream; + FT_Error error; + FT_Fixed format; + + + /* get a stream for the face's resource */ + stream = face->root.stream; + + /* seek to the beginning of the PS names table */ + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + goto Exit; + + format = face->postscript.FormatType; + + /* go to beginning of subtable */ + if ( FT_STREAM_SKIP( 32 ) ) + goto Exit; + + /* now read postscript table */ + if ( format == 0x00020000L ) + error = load_format_20( face, stream ); + else if ( format == 0x00028000L ) + error = load_format_25( face, stream ); + else + error = SFNT_Err_Invalid_File_Format; + + face->postscript_names.loaded = 1; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_ps_names( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_Post_Names names = &face->postscript_names; + FT_Fixed format; + + + if ( names->loaded ) + { + format = face->postscript.FormatType; + + if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + FT_UShort n; + + + FT_FREE( table->glyph_indices ); + table->num_glyphs = 0; + + for ( n = 0; n < table->num_names; n++ ) + FT_FREE( table->glyph_names[n] ); + + FT_FREE( table->glyph_names ); + table->num_names = 0; + } + else if ( format == 0x00028000L ) + { + TT_Post_25 table = &names->names.format_25; + + + FT_FREE( table->offsets ); + table->num_glyphs = 0; + } + } + names->loaded = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_ps_name */ + /* */ + /* <Description> */ + /* Get the PostScript glyph name of a glyph. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face. */ + /* */ + /* idx :: The glyph index. */ + /* */ + /* <InOut> */ + /* PSname :: The address of a string pointer. Will be NULL in case */ + /* of error, otherwise it is a pointer to the glyph name. */ + /* */ + /* You must not modify the returned string! */ + /* */ + /* <Output> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ) + { + FT_Error error; + TT_Post_Names names; + FT_Fixed format; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Service_PsCMaps psnames; +#endif + + + if ( !face ) + return SFNT_Err_Invalid_Face_Handle; + + if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) + return SFNT_Err_Invalid_Glyph_Index; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames = (FT_Service_PsCMaps)face->psnames; + if ( !psnames ) + return SFNT_Err_Unimplemented_Feature; +#endif + + names = &face->postscript_names; + + /* `.notdef' by default */ + *PSname = MAC_NAME( 0 ); + + format = face->postscript.FormatType; + + if ( format == 0x00010000L ) + { + if ( idx < 258 ) /* paranoid checking */ + *PSname = MAC_NAME( idx ); + } + else if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) + { + FT_UShort name_index = table->glyph_indices[idx]; + + + if ( name_index < 258 ) + *PSname = MAC_NAME( name_index ); + else + *PSname = (FT_String*)table->glyph_names[name_index - 258]; + } + } + else if ( format == 0x00028000L ) + { + TT_Post_25 table = &names->names.format_25; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */ + { + idx += table->offsets[idx]; + *PSname = MAC_NAME( idx ); + } + } + + /* nothing to do for format == 0x00030000L */ + + End: + return SFNT_Err_Ok; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttpost.h b/src/3rdparty/freetype/src/sfnt/ttpost.h new file mode 100644 index 0000000000..6f06d75a71 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttpost.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ttpost.h */ +/* */ +/* Postcript name table processing for TrueType and OpenType fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTPOST_H__ +#define __TTPOST_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + FT_LOCAL( void ) + tt_face_free_ps_names( TT_Face face ); + + +FT_END_HEADER + +#endif /* __TTPOST_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttsbit.c b/src/3rdparty/freetype/src/sfnt/ttsbit.c new file mode 100644 index 0000000000..eadaade71e --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttsbit.c @@ -0,0 +1,1507 @@ +/***************************************************************************/ +/* */ +/* ttsbit.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + + /* + * Alas, the memory-optimized sbit loader can't be used when implementing + * the `old internals' hack + */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + +#include "ttsbit0.c" + +#else /* FT_CONFIG_OPTION_OLD_INTERNALS */ + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttsbit.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttsbit + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* blit_sbit */ + /* */ + /* <Description> */ + /* Blits a bitmap from an input stream into a given target. Supports */ + /* x and y offsets as well as byte padded lines. */ + /* */ + /* <Input> */ + /* target :: The target bitmap/pixmap. */ + /* */ + /* source :: The input packed bitmap data. */ + /* */ + /* line_bits :: The number of bits per line. */ + /* */ + /* byte_padded :: A flag which is true if lines are byte-padded. */ + /* */ + /* x_offset :: The horizontal offset. */ + /* */ + /* y_offset :: The vertical offset. */ + /* */ + /* <Note> */ + /* IMPORTANT: The x and y offsets are relative to the top corner of */ + /* the target bitmap (unlike the normal TrueType */ + /* convention). A positive y offset indicates a downwards */ + /* direction! */ + /* */ + static void + blit_sbit( FT_Bitmap* target, + FT_Byte* source, + FT_Int line_bits, + FT_Bool byte_padded, + FT_Int x_offset, + FT_Int y_offset, + FT_Int source_height ) + { + FT_Byte* line_buff; + FT_Int line_incr; + FT_Int height; + + FT_UShort acc; + FT_UInt loaded; + + + /* first of all, compute starting write position */ + line_incr = target->pitch; + line_buff = target->buffer; + + if ( line_incr < 0 ) + line_buff -= line_incr * ( target->rows - 1 ); + + line_buff += ( x_offset >> 3 ) + y_offset * line_incr; + + /***********************************************************************/ + /* */ + /* We use the extra-classic `accumulator' trick to extract the bits */ + /* from the source byte stream. */ + /* */ + /* Namely, the variable `acc' is a 16-bit accumulator containing the */ + /* last `loaded' bits from the input stream. The bits are shifted to */ + /* the upmost position in `acc'. */ + /* */ + /***********************************************************************/ + + acc = 0; /* clear accumulator */ + loaded = 0; /* no bits were loaded */ + + for ( height = source_height; height > 0; height-- ) + { + FT_Byte* cur = line_buff; /* current write cursor */ + FT_Int count = line_bits; /* # of bits to extract per line */ + FT_Byte shift = (FT_Byte)( x_offset & 7 ); /* current write shift */ + FT_Byte space = (FT_Byte)( 8 - shift ); + + + /* first of all, read individual source bytes */ + if ( count >= 8 ) + { + count -= 8; + { + do + { + FT_Byte val; + + + /* ensure that there are at least 8 bits in the accumulator */ + if ( loaded < 8 ) + { + acc |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded )); + loaded += 8; + } + + /* now write one byte */ + val = (FT_Byte)( acc >> 8 ); + if ( shift ) + { + cur[0] |= (FT_Byte)( val >> shift ); + cur[1] |= (FT_Byte)( val << space ); + } + else + cur[0] |= val; + + cur++; + acc <<= 8; /* remove bits from accumulator */ + loaded -= 8; + count -= 8; + + } while ( count >= 0 ); + } + + /* restore `count' to correct value */ + count += 8; + } + + /* now write remaining bits (count < 8) */ + if ( count > 0 ) + { + FT_Byte val; + + + /* ensure that there are at least `count' bits in the accumulator */ + if ( (FT_Int)loaded < count ) + { + acc |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded )); + loaded += 8; + } + + /* now write remaining bits */ + val = (FT_Byte)( ( (FT_Byte)( acc >> 8 ) ) & ~( 0xFF >> count ) ); + cur[0] |= (FT_Byte)( val >> shift ); + + if ( count > space ) + cur[1] |= (FT_Byte)( val << space ); + + acc <<= count; + loaded -= count; + } + + /* now, skip to next line */ + if ( byte_padded ) + { + acc = 0; + loaded = 0; /* clear accumulator on byte-padded lines */ + } + + line_buff += line_incr; + } + } + + + static const FT_Frame_Field sbit_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_MetricsRec + + FT_FRAME_START( 8 ), + FT_FRAME_BYTE( height ), + FT_FRAME_BYTE( width ), + + FT_FRAME_CHAR( horiBearingX ), + FT_FRAME_CHAR( horiBearingY ), + FT_FRAME_BYTE( horiAdvance ), + + FT_FRAME_CHAR( vertBearingX ), + FT_FRAME_CHAR( vertBearingY ), + FT_FRAME_BYTE( vertAdvance ), + FT_FRAME_END + }; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Const_Metrics */ + /* */ + /* <Description> */ + /* Loads the metrics for `EBLC' index tables format 2 and 5. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Const_Metrics( TT_SBit_Range range, + FT_Stream stream ) + { + FT_Error error; + + + if ( FT_READ_ULONG( range->image_size ) ) + return error; + + return FT_STREAM_READ_FIELDS( sbit_metrics_fields, &range->metrics ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Range_Codes */ + /* */ + /* <Description> */ + /* Loads the range codes for `EBLC' index tables format 4 and 5. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* load_offsets :: A flag whether to load the glyph offset table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Range_Codes( TT_SBit_Range range, + FT_Stream stream, + FT_Bool load_offsets ) + { + FT_Error error; + FT_ULong count, n, size; + FT_Memory memory = stream->memory; + + + if ( FT_READ_ULONG( count ) ) + goto Exit; + + range->num_glyphs = count; + + /* Allocate glyph offsets table if needed */ + if ( load_offsets ) + { + if ( FT_NEW_ARRAY( range->glyph_offsets, count ) ) + goto Exit; + + size = count * 4L; + } + else + size = count * 2L; + + /* Allocate glyph codes table and access frame */ + if ( FT_NEW_ARRAY ( range->glyph_codes, count ) || + FT_FRAME_ENTER( size ) ) + goto Exit; + + for ( n = 0; n < count; n++ ) + { + range->glyph_codes[n] = FT_GET_USHORT(); + + if ( load_offsets ) + range->glyph_offsets[n] = (FT_ULong)range->image_offset + + FT_GET_USHORT(); + } + + FT_FRAME_EXIT(); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Range */ + /* */ + /* <Description> */ + /* Loads a given `EBLC' index/range table. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Range( TT_SBit_Range range, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + + switch( range->index_format ) + { + case 1: /* variable metrics with 4-byte offsets */ + case 3: /* variable metrics with 2-byte offsets */ + { + FT_ULong num_glyphs, n; + FT_Int size_elem; + FT_Bool large = FT_BOOL( range->index_format == 1 ); + + + + if ( range->last_glyph < range->first_glyph ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + num_glyphs = range->last_glyph - range->first_glyph + 1L; + range->num_glyphs = num_glyphs; + num_glyphs++; /* XXX: BEWARE - see spec */ + + size_elem = large ? 4 : 2; + + if ( FT_NEW_ARRAY( range->glyph_offsets, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * size_elem ) ) + goto Exit; + + for ( n = 0; n < num_glyphs; n++ ) + range->glyph_offsets[n] = (FT_ULong)( range->image_offset + + ( large ? FT_GET_ULONG() + : FT_GET_USHORT() ) ); + FT_FRAME_EXIT(); + } + break; + + case 2: /* all glyphs have identical metrics */ + error = Load_SBit_Const_Metrics( range, stream ); + break; + + case 4: + error = Load_SBit_Range_Codes( range, stream, 1 ); + break; + + case 5: + error = Load_SBit_Const_Metrics( range, stream ); + if ( !error ) + error = Load_SBit_Range_Codes( range, stream, 0 ); + break; + + default: + error = SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_eblc */ + /* */ + /* <Description> */ + /* Loads the table of embedded bitmap sizes for this face. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ) + { + FT_Error error = 0; + FT_Memory memory = stream->memory; + FT_Fixed version; + FT_ULong num_strikes; + FT_ULong table_base; + + static const FT_Frame_Field sbit_line_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_LineMetricsRec + + /* no FT_FRAME_START */ + FT_FRAME_CHAR( ascender ), + FT_FRAME_CHAR( descender ), + FT_FRAME_BYTE( max_width ), + + FT_FRAME_CHAR( caret_slope_numerator ), + FT_FRAME_CHAR( caret_slope_denominator ), + FT_FRAME_CHAR( caret_offset ), + + FT_FRAME_CHAR( min_origin_SB ), + FT_FRAME_CHAR( min_advance_SB ), + FT_FRAME_CHAR( max_before_BL ), + FT_FRAME_CHAR( min_after_BL ), + FT_FRAME_CHAR( pads[0] ), + FT_FRAME_CHAR( pads[1] ), + FT_FRAME_END + }; + + static const FT_Frame_Field strike_start_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_StrikeRec + + /* no FT_FRAME_START */ + FT_FRAME_ULONG( ranges_offset ), + FT_FRAME_SKIP_LONG, + FT_FRAME_ULONG( num_ranges ), + FT_FRAME_ULONG( color_ref ), + FT_FRAME_END + }; + + static const FT_Frame_Field strike_end_fields[] = + { + /* no FT_FRAME_START */ + FT_FRAME_USHORT( start_glyph ), + FT_FRAME_USHORT( end_glyph ), + FT_FRAME_BYTE ( x_ppem ), + FT_FRAME_BYTE ( y_ppem ), + FT_FRAME_BYTE ( bit_depth ), + FT_FRAME_CHAR ( flags ), + FT_FRAME_END + }; + + + face->num_sbit_strikes = 0; + + /* this table is optional */ + error = face->goto_table( face, TTAG_EBLC, stream, 0 ); + if ( error ) + error = face->goto_table( face, TTAG_bloc, stream, 0 ); + if ( error ) + goto Exit; + + table_base = FT_STREAM_POS(); + if ( FT_FRAME_ENTER( 8L ) ) + goto Exit; + + version = FT_GET_LONG(); + num_strikes = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + /* check version number and strike count */ + if ( version != 0x00020000L || + num_strikes >= 0x10000L ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version!\n" )); + error = SFNT_Err_Invalid_File_Format; + + goto Exit; + } + + /* allocate the strikes table */ + if ( FT_NEW_ARRAY( face->sbit_strikes, num_strikes ) ) + goto Exit; + + face->num_sbit_strikes = num_strikes; + + /* now read each strike table separately */ + { + TT_SBit_Strike strike = face->sbit_strikes; + FT_ULong count = num_strikes; + + + if ( FT_FRAME_ENTER( 48L * num_strikes ) ) + goto Exit; + + while ( count > 0 ) + { + if ( FT_STREAM_READ_FIELDS( strike_start_fields, strike ) || + FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->hori ) || + FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->vert ) || + FT_STREAM_READ_FIELDS( strike_end_fields, strike ) ) + break; + + count--; + strike++; + } + + FT_FRAME_EXIT(); + } + + /* allocate the index ranges for each strike table */ + { + TT_SBit_Strike strike = face->sbit_strikes; + FT_ULong count = num_strikes; + + + while ( count > 0 ) + { + TT_SBit_Range range; + FT_ULong count2 = strike->num_ranges; + + + /* read each range */ + if ( FT_STREAM_SEEK( table_base + strike->ranges_offset ) || + FT_FRAME_ENTER( strike->num_ranges * 8L ) ) + goto Exit; + + if ( FT_NEW_ARRAY( strike->sbit_ranges, strike->num_ranges ) ) + goto Exit; + + range = strike->sbit_ranges; + while ( count2 > 0 ) + { + range->first_glyph = FT_GET_USHORT(); + range->last_glyph = FT_GET_USHORT(); + range->table_offset = table_base + strike->ranges_offset + + FT_GET_ULONG(); + count2--; + range++; + } + + FT_FRAME_EXIT(); + + /* Now, read each index table */ + count2 = strike->num_ranges; + range = strike->sbit_ranges; + while ( count2 > 0 ) + { + /* Read the header */ + if ( FT_STREAM_SEEK( range->table_offset ) || + FT_FRAME_ENTER( 8L ) ) + goto Exit; + + range->index_format = FT_GET_USHORT(); + range->image_format = FT_GET_USHORT(); + range->image_offset = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + error = Load_SBit_Range( range, stream ); + if ( error ) + goto Exit; + + count2--; + range++; + } + + count--; + strike++; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_free_eblc */ + /* */ + /* <Description> */ + /* Releases the embedded bitmap tables. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_free_eblc( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_SBit_Strike strike = face->sbit_strikes; + TT_SBit_Strike strike_limit = strike + face->num_sbit_strikes; + + + if ( strike ) + { + for ( ; strike < strike_limit; strike++ ) + { + TT_SBit_Range range = strike->sbit_ranges; + TT_SBit_Range range_limit = range + strike->num_ranges; + + + if ( range ) + { + for ( ; range < range_limit; range++ ) + { + /* release the glyph offsets and codes tables */ + /* where appropriate */ + FT_FREE( range->glyph_offsets ); + FT_FREE( range->glyph_codes ); + } + } + FT_FREE( strike->sbit_ranges ); + strike->num_ranges = 0; + } + FT_FREE( face->sbit_strikes ); + } + face->num_sbit_strikes = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ) + { + return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ) + { + TT_SBit_Strike strike; + + + if ( strike_index >= face->num_sbit_strikes ) + return SFNT_Err_Invalid_Argument; + + strike = face->sbit_strikes + strike_index; + + metrics->x_ppem = strike->x_ppem; + metrics->y_ppem = strike->y_ppem; + + metrics->ascender = strike->hori.ascender << 6; + metrics->descender = strike->hori.descender << 6; + + /* XXX: Is this correct? */ + metrics->max_advance = ( strike->hori.min_origin_SB + + strike->hori.max_width + + strike->hori.min_advance_SB ) << 6; + + metrics->height = metrics->ascender - metrics->descender; + + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_sbit_range */ + /* */ + /* <Description> */ + /* Scans a given strike's ranges and return, for a given glyph */ + /* index, the corresponding sbit range, and `EBDT' offset. */ + /* */ + /* <Input> */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike :: The source/current sbit strike. */ + /* */ + /* <Output> */ + /* arange :: The sbit range containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means the glyph index was found. */ + /* */ + static FT_Error + find_sbit_range( FT_UInt glyph_index, + TT_SBit_Strike strike, + TT_SBit_Range *arange, + FT_ULong *aglyph_offset ) + { + TT_SBit_RangeRec *range, *range_limit; + + + /* check whether the glyph index is within this strike's */ + /* glyph range */ + if ( glyph_index < (FT_UInt)strike->start_glyph || + glyph_index > (FT_UInt)strike->end_glyph ) + goto Fail; + + /* scan all ranges in strike */ + range = strike->sbit_ranges; + range_limit = range + strike->num_ranges; + if ( !range ) + goto Fail; + + for ( ; range < range_limit; range++ ) + { + if ( glyph_index >= (FT_UInt)range->first_glyph && + glyph_index <= (FT_UInt)range->last_glyph ) + { + FT_UShort delta = (FT_UShort)( glyph_index - range->first_glyph ); + + + switch ( range->index_format ) + { + case 1: + case 3: + *aglyph_offset = range->glyph_offsets[delta]; + break; + + case 2: + *aglyph_offset = range->image_offset + + range->image_size * delta; + break; + + case 4: + case 5: + { + FT_ULong n; + + + for ( n = 0; n < range->num_glyphs; n++ ) + { + if ( (FT_UInt)range->glyph_codes[n] == glyph_index ) + { + if ( range->index_format == 4 ) + *aglyph_offset = range->glyph_offsets[n]; + else + *aglyph_offset = range->image_offset + + n * range->image_size; + goto Found; + } + } + } + + /* fall-through */ + default: + goto Fail; + } + + Found: + /* return successfully! */ + *arange = range; + return SFNT_Err_Ok; + } + } + + Fail: + *arange = 0; + *aglyph_offset = 0; + + return SFNT_Err_Invalid_Argument; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_find_sbit_image */ + /* */ + /* <Description> */ + /* Checks whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* <Output> */ + /* arange :: The SBit range containing the glyph index. */ + /* */ + /* astrike :: The SBit strike containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns */ + /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ + /* glyph. */ + /* */ + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ) + { + FT_Error error; + TT_SBit_Strike strike; + + + if ( !face->sbit_strikes || + ( face->num_sbit_strikes <= strike_index ) ) + goto Fail; + + strike = &face->sbit_strikes[strike_index]; + + error = find_sbit_range( glyph_index, strike, + arange, aglyph_offset ); + if ( error ) + goto Fail; + + *astrike = strike; + + return SFNT_Err_Ok; + + Fail: + /* no embedded bitmap for this glyph in face */ + *arange = 0; + *astrike = 0; + *aglyph_offset = 0; + + return SFNT_Err_Invalid_Argument; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_load_sbit_metrics */ + /* */ + /* <Description> */ + /* Gets the big metrics for a given SBit. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* <Output> */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be positioned at the glyph's offset within */ + /* the `EBDT' table before the call. */ + /* */ + /* If the image format uses variable metrics, the stream cursor is */ + /* positioned just after the metrics header in the `EBDT' table on */ + /* function exit. */ + /* */ + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ) + { + FT_Error error = SFNT_Err_Ok; + + + switch ( range->image_format ) + { + case 1: + case 2: + case 8: + /* variable small metrics */ + { + TT_SBit_SmallMetricsRec smetrics; + + static const FT_Frame_Field sbit_small_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_SmallMetricsRec + + FT_FRAME_START( 5 ), + FT_FRAME_BYTE( height ), + FT_FRAME_BYTE( width ), + FT_FRAME_CHAR( bearingX ), + FT_FRAME_CHAR( bearingY ), + FT_FRAME_BYTE( advance ), + FT_FRAME_END + }; + + + /* read small metrics */ + if ( FT_STREAM_READ_FIELDS( sbit_small_metrics_fields, &smetrics ) ) + goto Exit; + + /* convert it to a big metrics */ + metrics->height = smetrics.height; + metrics->width = smetrics.width; + metrics->horiBearingX = smetrics.bearingX; + metrics->horiBearingY = smetrics.bearingY; + metrics->horiAdvance = smetrics.advance; + + /* these metrics are made up at a higher level when */ + /* needed. */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + metrics->vertAdvance = 0; + } + break; + + case 6: + case 7: + case 9: + /* variable big metrics */ + if ( FT_STREAM_READ_FIELDS( sbit_metrics_fields, metrics ) ) + goto Exit; + break; + + case 5: + default: /* constant metrics */ + if ( range->index_format == 2 || range->index_format == 5 ) + *metrics = range->metrics; + else + return SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* crop_bitmap */ + /* */ + /* <Description> */ + /* Crops a bitmap to its tightest bounding box, and adjusts its */ + /* metrics. */ + /* */ + /* <InOut> */ + /* map :: The bitmap. */ + /* */ + /* metrics :: The corresponding metrics structure. */ + /* */ + static void + crop_bitmap( FT_Bitmap* map, + TT_SBit_Metrics metrics ) + { + /***********************************************************************/ + /* */ + /* In this situation, some bounding boxes of embedded bitmaps are too */ + /* large. We need to crop it to a reasonable size. */ + /* */ + /* --------- */ + /* | | ----- */ + /* | *** | |***| */ + /* | * | | * | */ + /* | * | ------> | * | */ + /* | * | | * | */ + /* | * | | * | */ + /* | *** | |***| */ + /* --------- ----- */ + /* */ + /***********************************************************************/ + + FT_Int rows, count; + FT_Long line_len; + FT_Byte* line; + + + /***********************************************************************/ + /* */ + /* first of all, check the top-most lines of the bitmap, and remove */ + /* them if they're empty. */ + /* */ + { + line = (FT_Byte*)map->buffer; + rows = map->rows; + line_len = map->pitch; + + + for ( count = 0; count < rows; count++ ) + { + FT_Byte* cur = line; + FT_Byte* limit = line + line_len; + + + for ( ; cur < limit; cur++ ) + if ( cur[0] ) + goto Found_Top; + + /* the current line was empty - skip to next one */ + line = limit; + } + + Found_Top: + /* check that we have at least one filled line */ + if ( count >= rows ) + goto Empty_Bitmap; + + /* now, crop the empty upper lines */ + if ( count > 0 ) + { + line = (FT_Byte*)map->buffer; + + FT_MEM_MOVE( line, line + count * line_len, + ( rows - count ) * line_len ); + + metrics->height = (FT_Byte)( metrics->height - count ); + metrics->horiBearingY = (FT_Char)( metrics->horiBearingY - count ); + metrics->vertBearingY = (FT_Char)( metrics->vertBearingY - count ); + + map->rows -= count; + rows -= count; + } + } + + /***********************************************************************/ + /* */ + /* second, crop the lower lines */ + /* */ + { + line = (FT_Byte*)map->buffer + ( rows - 1 ) * line_len; + + for ( count = 0; count < rows; count++ ) + { + FT_Byte* cur = line; + FT_Byte* limit = line + line_len; + + + for ( ; cur < limit; cur++ ) + if ( cur[0] ) + goto Found_Bottom; + + /* the current line was empty - skip to previous one */ + line -= line_len; + } + + Found_Bottom: + if ( count > 0 ) + { + metrics->height = (FT_Byte)( metrics->height - count ); + rows -= count; + map->rows -= count; + } + } + + /***********************************************************************/ + /* */ + /* third, get rid of the space on the left side of the glyph */ + /* */ + do + { + FT_Byte* limit; + + + line = (FT_Byte*)map->buffer; + limit = line + rows * line_len; + + for ( ; line < limit; line += line_len ) + if ( line[0] & 0x80 ) + goto Found_Left; + + /* shift the whole glyph one pixel to the left */ + line = (FT_Byte*)map->buffer; + limit = line + rows * line_len; + + for ( ; line < limit; line += line_len ) + { + FT_Int n, width = map->width; + FT_Byte old; + FT_Byte* cur = line; + + + old = (FT_Byte)(cur[0] << 1); + for ( n = 8; n < width; n += 8 ) + { + FT_Byte val; + + + val = cur[1]; + cur[0] = (FT_Byte)( old | ( val >> 7 ) ); + old = (FT_Byte)( val << 1 ); + cur++; + } + cur[0] = old; + } + + map->width--; + metrics->horiBearingX++; + metrics->vertBearingX++; + metrics->width--; + + } while ( map->width > 0 ); + + Found_Left: + + /***********************************************************************/ + /* */ + /* finally, crop the bitmap width to get rid of the space on the right */ + /* side of the glyph. */ + /* */ + do + { + FT_Int right = map->width - 1; + FT_Byte* limit; + FT_Byte mask; + + + line = (FT_Byte*)map->buffer + ( right >> 3 ); + limit = line + rows * line_len; + mask = (FT_Byte)( 0x80 >> ( right & 7 ) ); + + for ( ; line < limit; line += line_len ) + if ( line[0] & mask ) + goto Found_Right; + + /* crop the whole glyph to the right */ + map->width--; + metrics->width--; + + } while ( map->width > 0 ); + + Found_Right: + /* all right, the bitmap was cropped */ + return; + + Empty_Bitmap: + map->width = 0; + map->rows = 0; + map->pitch = 0; + map->pixel_mode = FT_PIXEL_MODE_MONO; + } + + + static FT_Error + Load_SBit_Single( FT_Bitmap* map, + FT_Int x_offset, + FT_Int y_offset, + FT_Int pix_bits, + FT_UShort image_format, + TT_SBit_Metrics metrics, + FT_Stream stream ) + { + FT_Error error; + + + /* check that the source bitmap fits into the target pixmap */ + if ( x_offset < 0 || x_offset + metrics->width > map->width || + y_offset < 0 || y_offset + metrics->height > map->rows ) + { + error = SFNT_Err_Invalid_Argument; + + goto Exit; + } + + { + FT_Int glyph_width = metrics->width; + FT_Int glyph_height = metrics->height; + FT_Int glyph_size; + FT_Int line_bits = pix_bits * glyph_width; + FT_Bool pad_bytes = 0; + + + /* compute size of glyph image */ + switch ( image_format ) + { + case 1: /* byte-padded formats */ + case 6: + { + FT_Int line_length; + + + switch ( pix_bits ) + { + case 1: + line_length = ( glyph_width + 7 ) >> 3; + break; + case 2: + line_length = ( glyph_width + 3 ) >> 2; + break; + case 4: + line_length = ( glyph_width + 1 ) >> 1; + break; + default: + line_length = glyph_width; + } + + glyph_size = glyph_height * line_length; + pad_bytes = 1; + } + break; + + case 2: + case 5: + case 7: + line_bits = glyph_width * pix_bits; + glyph_size = ( glyph_height * line_bits + 7 ) >> 3; + break; + + default: /* invalid format */ + return SFNT_Err_Invalid_File_Format; + } + + /* Now read data and draw glyph into target pixmap */ + if ( FT_FRAME_ENTER( glyph_size ) ) + goto Exit; + + /* don't forget to multiply `x_offset' by `map->pix_bits' as */ + /* the sbit blitter doesn't make a difference between pixmap */ + /* depths. */ + blit_sbit( map, (FT_Byte*)stream->cursor, line_bits, pad_bytes, + x_offset * pix_bits, y_offset, metrics->height ); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + static FT_Error + Load_SBit_Image( TT_SBit_Strike strike, + TT_SBit_Range range, + FT_ULong ebdt_pos, + FT_ULong glyph_offset, + FT_GlyphSlot slot, + FT_Int x_offset, + FT_Int y_offset, + FT_Stream stream, + TT_SBit_Metrics metrics, + FT_Int depth ) + { + FT_Memory memory = stream->memory; + FT_Bitmap* map = &slot->bitmap; + FT_Error error; + + + /* place stream at beginning of glyph data and read metrics */ + if ( FT_STREAM_SEEK( ebdt_pos + glyph_offset ) ) + goto Exit; + + error = tt_load_sbit_metrics( stream, range, metrics ); + if ( error ) + goto Exit; + + /* This function is recursive. At the top-level call, we */ + /* compute the dimensions of the higher-level glyph to */ + /* allocate the final pixmap buffer. */ + if ( depth == 0 ) + { + FT_Long size; + + + map->width = metrics->width; + map->rows = metrics->height; + + switch ( strike->bit_depth ) + { + case 1: + map->pixel_mode = FT_PIXEL_MODE_MONO; + map->pitch = ( map->width + 7 ) >> 3; + break; + + case 2: + map->pixel_mode = FT_PIXEL_MODE_GRAY2; + map->pitch = ( map->width + 3 ) >> 2; + break; + + case 4: + map->pixel_mode = FT_PIXEL_MODE_GRAY4; + map->pitch = ( map->width + 1 ) >> 1; + break; + + case 8: + map->pixel_mode = FT_PIXEL_MODE_GRAY; + map->pitch = map->width; + break; + + default: + return SFNT_Err_Invalid_File_Format; + } + + size = map->rows * map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + error = ft_glyphslot_alloc_bitmap( slot, size ); + if (error) + goto Exit; + } + + switch ( range->image_format ) + { + case 1: /* single sbit image - load it */ + case 2: + case 5: + case 6: + case 7: + return Load_SBit_Single( map, x_offset, y_offset, strike->bit_depth, + range->image_format, metrics, stream ); + + case 8: /* compound format */ + if ( FT_STREAM_SKIP( 1L ) ) + { + error = SFNT_Err_Invalid_Stream_Skip; + goto Exit; + } + /* fallthrough */ + + case 9: + break; + + default: /* invalid image format */ + return SFNT_Err_Invalid_File_Format; + } + + /* All right, we have a compound format. First of all, read */ + /* the array of elements. */ + { + TT_SBit_Component components; + TT_SBit_Component comp; + FT_UShort num_components, count; + + + if ( FT_READ_USHORT( num_components ) || + FT_NEW_ARRAY( components, num_components ) ) + goto Exit; + + count = num_components; + + if ( FT_FRAME_ENTER( 4L * num_components ) ) + goto Fail_Memory; + + for ( comp = components; count > 0; count--, comp++ ) + { + comp->glyph_code = FT_GET_USHORT(); + comp->x_offset = FT_GET_CHAR(); + comp->y_offset = FT_GET_CHAR(); + } + + FT_FRAME_EXIT(); + + /* Now recursively load each element glyph */ + count = num_components; + comp = components; + for ( ; count > 0; count--, comp++ ) + { + TT_SBit_Range elem_range; + TT_SBit_MetricsRec elem_metrics; + FT_ULong elem_offset; + + + /* find the range for this element */ + error = find_sbit_range( comp->glyph_code, + strike, + &elem_range, + &elem_offset ); + if ( error ) + goto Fail_Memory; + + /* now load the element, recursively */ + error = Load_SBit_Image( strike, + elem_range, + ebdt_pos, + elem_offset, + slot, + x_offset + comp->x_offset, + y_offset + comp->y_offset, + stream, + &elem_metrics, + depth + 1 ); + if ( error ) + goto Fail_Memory; + } + + Fail_Memory: + FT_FREE( components ); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_sbit_image */ + /* */ + /* <Description> */ + /* Loads a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* glyph_index :: The current glyph index. */ + /* */ + /* load_flags :: The glyph load flags (the code checks for the flag */ + /* FT_LOAD_CROP_BITMAP). */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* map :: The target pixmap. */ + /* */ + /* metrics :: A big sbit metrics structure for the glyph image. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* <Note> */ + /* The `map.buffer' field is always freed before the glyph is loaded. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ) + { + FT_Error error; + FT_ULong ebdt_pos, glyph_offset; + + TT_SBit_Strike strike; + TT_SBit_Range range; + + + /* Check whether there is a glyph sbit for the current index */ + error = tt_find_sbit_image( face, glyph_index, strike_index, + &range, &strike, &glyph_offset ); + if ( error ) + goto Exit; + + /* now, find the location of the `EBDT' table in */ + /* the font file */ + error = face->goto_table( face, TTAG_EBDT, stream, 0 ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, 0 ); + if ( error ) + goto Exit; + + ebdt_pos = FT_STREAM_POS(); + + error = Load_SBit_Image( strike, range, ebdt_pos, glyph_offset, + face->root.glyph, 0, 0, stream, metrics, 0 ); + if ( error ) + goto Exit; + + /* setup vertical metrics if needed */ + if ( strike->flags & 1 ) + { + /* in case of a horizontal strike only */ + FT_Int advance; + + + advance = strike->hori.ascender - strike->hori.descender; + + /* some heuristic values */ + + metrics->vertBearingX = (FT_Char)(-metrics->width / 2 ); + metrics->vertBearingY = (FT_Char)( ( advance - metrics->height ) / 2 ); + metrics->vertAdvance = (FT_Char)( advance * 12 / 10 ); + } + + /* Crop the bitmap now, unless specified otherwise */ + if ( load_flags & FT_LOAD_CROP_BITMAP ) + crop_bitmap( map, metrics ); + + Exit: + return error; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttsbit.h b/src/3rdparty/freetype/src/sfnt/ttsbit.h new file mode 100644 index 0000000000..7ea2af1843 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttsbit.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* ttsbit.h */ +/* */ +/* TrueType and OpenType embedded bitmap support (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTSBIT_H__ +#define __TTSBIT_H__ + + +#include <ft2build.h> +#include "ttload.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_eblc( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + FT_LOCAL( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ); + + +FT_END_HEADER + +#endif /* __TTSBIT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/sfnt/ttsbit0.c b/src/3rdparty/freetype/src/sfnt/ttsbit0.c new file mode 100644 index 0000000000..3ebcbbd740 --- /dev/null +++ b/src/3rdparty/freetype/src/sfnt/ttsbit0.c @@ -0,0 +1,969 @@ +/***************************************************************************/ +/* */ +/* ttsbit0.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* This is a heap-optimized version. */ +/* */ +/* Copyright 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/* This file is included by ttsbit.c */ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttsbit.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttsbit + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ) + { + FT_Error error = SFNT_Err_Ok; + FT_Fixed version; + FT_ULong num_strikes, table_size; + FT_Byte* p; + FT_Byte* p_limit; + FT_UInt count; + + + face->sbit_num_strikes = 0; + + /* this table is optional */ + error = face->goto_table( face, TTAG_EBLC, stream, &table_size ); + if ( error ) + error = face->goto_table( face, TTAG_bloc, stream, &table_size ); + if ( error ) + goto Exit; + + if ( table_size < 8 ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: table too short!\n" )); + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) ) + goto Exit; + + face->sbit_table_size = table_size; + + p = face->sbit_table; + p_limit = p + table_size; + + version = FT_NEXT_ULONG( p ); + num_strikes = FT_NEXT_ULONG( p ); + + if ( version != 0x00020000UL || num_strikes >= 0x10000UL ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version!\n" )); + error = SFNT_Err_Invalid_File_Format; + goto Fail; + } + + /* + * Count the number of strikes available in the table. We are a bit + * paranoid there and don't trust the data. + */ + count = (FT_UInt)num_strikes; + if ( 8 + 48UL * count > table_size ) + count = (FT_UInt)( ( p_limit - p ) / 48 ); + + face->sbit_num_strikes = count; + + FT_TRACE3(( "sbit_num_strikes: %u\n", count )); + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_eblc( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + face->sbit_num_strikes = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ) + { + return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ) + { + FT_Byte* strike; + + + if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) + return SFNT_Err_Invalid_Argument; + + strike = face->sbit_table + 8 + strike_index * 48; + + metrics->x_ppem = (FT_UShort)strike[44]; + metrics->y_ppem = (FT_UShort)strike[45]; + + metrics->ascender = (FT_Char)strike[16] << 6; /* hori.ascender */ + metrics->descender = (FT_Char)strike[17] << 6; /* hori.descender */ + metrics->height = metrics->ascender - metrics->descender; + + /* XXX: Is this correct? */ + metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */ + strike[18] + /* max_width */ + (FT_Char)strike[23] /* min_advance_SB */ + ) << 6; + + return SFNT_Err_Ok; + } + + + typedef struct TT_SBitDecoderRec_ + { + TT_Face face; + FT_Stream stream; + FT_Bitmap* bitmap; + TT_SBit_Metrics metrics; + FT_Bool metrics_loaded; + FT_Bool bitmap_allocated; + FT_Byte bit_depth; + + FT_ULong ebdt_start; + FT_ULong ebdt_size; + + FT_ULong strike_index_array; + FT_ULong strike_index_count; + FT_Byte* eblc_base; + FT_Byte* eblc_limit; + + } TT_SBitDecoderRec, *TT_SBitDecoder; + + + static FT_Error + tt_sbit_decoder_init( TT_SBitDecoder decoder, + TT_Face face, + FT_ULong strike_index, + TT_SBit_MetricsRec* metrics ) + { + FT_Error error; + FT_Stream stream = face->root.stream; + FT_ULong ebdt_size; + + + error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); + if ( error ) + goto Exit; + + decoder->face = face; + decoder->stream = stream; + decoder->bitmap = &face->root.glyph->bitmap; + decoder->metrics = metrics; + + decoder->metrics_loaded = 0; + decoder->bitmap_allocated = 0; + + decoder->ebdt_start = FT_STREAM_POS(); + decoder->ebdt_size = ebdt_size; + + decoder->eblc_base = face->sbit_table; + decoder->eblc_limit = face->sbit_table + face->sbit_table_size; + + /* now find the strike corresponding to the index */ + { + FT_Byte* p; + + + if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + p = decoder->eblc_base + 8 + 48 * strike_index; + + decoder->strike_index_array = FT_NEXT_ULONG( p ); + p += 4; + decoder->strike_index_count = FT_NEXT_ULONG( p ); + p += 34; + decoder->bit_depth = *p; + + if ( decoder->strike_index_array > face->sbit_table_size || + decoder->strike_index_array + 8 * decoder->strike_index_count > + face->sbit_table_size ) + error = SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + static void + tt_sbit_decoder_done( TT_SBitDecoder decoder ) + { + FT_UNUSED( decoder ); + } + + + static FT_Error + tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder ) + { + FT_Error error = SFNT_Err_Ok; + FT_UInt width, height; + FT_Bitmap* map = decoder->bitmap; + FT_Long size; + + + if ( !decoder->metrics_loaded ) + { + error = SFNT_Err_Invalid_Argument; + goto Exit; + } + + width = decoder->metrics->width; + height = decoder->metrics->height; + + map->width = (int)width; + map->rows = (int)height; + + switch ( decoder->bit_depth ) + { + case 1: + map->pixel_mode = FT_PIXEL_MODE_MONO; + map->pitch = ( map->width + 7 ) >> 3; + break; + + case 2: + map->pixel_mode = FT_PIXEL_MODE_GRAY2; + map->pitch = ( map->width + 3 ) >> 2; + break; + + case 4: + map->pixel_mode = FT_PIXEL_MODE_GRAY4; + map->pitch = ( map->width + 1 ) >> 1; + break; + + case 8: + map->pixel_mode = FT_PIXEL_MODE_GRAY; + map->pitch = map->width; + break; + + default: + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + size = map->rows * map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); + if ( error ) + goto Exit; + + decoder->bitmap_allocated = 1; + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder, + FT_Byte* *pp, + FT_Byte* limit, + FT_Bool big ) + { + FT_Byte* p = *pp; + TT_SBit_Metrics metrics = decoder->metrics; + + + if ( p + 5 > limit ) + goto Fail; + + metrics->height = p[0]; + metrics->width = p[1]; + metrics->horiBearingX = (FT_Char)p[2]; + metrics->horiBearingY = (FT_Char)p[3]; + metrics->horiAdvance = p[4]; + + p += 5; + if ( big ) + { + if ( p + 3 > limit ) + goto Fail; + + metrics->vertBearingX = (FT_Char)p[0]; + metrics->vertBearingY = (FT_Char)p[1]; + metrics->vertAdvance = p[2]; + + p += 3; + } + + decoder->metrics_loaded = 1; + *pp = p; + return SFNT_Err_Ok; + + Fail: + return SFNT_Err_Invalid_Argument; + } + + + /* forward declaration */ + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos ); + + typedef FT_Error (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* plimit, + FT_Int x_pos, + FT_Int y_pos ); + + + static FT_Error + tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_Byte* line; + FT_Int bit_height, bit_width, pitch, width, height, h; + FT_Bitmap* bitmap; + + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder ); + if ( error ) + goto Exit; + } + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + if ( x_pos < 0 || x_pos + width > bit_width || + y_pos < 0 || y_pos + height > bit_height ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( p + ( ( width + 7 ) >> 3 ) * height > limit ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* now do the blit */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + if ( x_pos == 0 ) /* the easy one */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w; + + + for ( w = width; w >= 8; w -= 8 ) + { + write[0] = (FT_Byte)( write[0] | *p++ ); + write += 1; + } + + if ( w > 0 ) + write[0] = (FT_Byte)( write[0] | ( *p++ & ( 0xFF00U >> w ) ) ); + } + } + else /* x_pos > 0 */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w; + FT_UInt wval = 0; + + + for ( w = width; w >= 8; w -= 8 ) + { + wval = (FT_UInt)( wval | *p++ ); + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + write += 1; + wval <<= 8; + } + + if ( w > 0 ) + wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) ); + + /* all bits read and there are `x_pos + w' bits to be written */ + + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + + if ( x_pos + w > 8 ) + { + write++; + wval <<= 8; + write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) ); + } + } + } + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_Byte* line; + FT_Int bit_height, bit_width, pitch, width, height, h, nbits; + FT_Bitmap* bitmap; + FT_UShort rval; + + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder ); + if ( error ) + goto Exit; + } + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + if ( x_pos < 0 || x_pos + width > bit_width || + y_pos < 0 || y_pos + height > bit_height ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( p + ( ( width * height + 7 ) >> 3 ) > limit ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* now do the blit */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + /* the higher byte of `rval' is used as a buffer */ + rval = 0; + nbits = 0; + + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* write = line; + FT_Int w = width; + + + if ( x_pos ) + { + w = ( width < 8 - x_pos ) ? width : 8 - x_pos; + + if ( h == height ) + { + rval |= *p++; + nbits += x_pos; + } + else if ( nbits < w ) + { + rval |= *p++; + nbits += 8 - w; + } + else + { + rval >>= 8; + nbits -= w; + } + + *write++ |= ( ( rval >> nbits ) & 0xFF ) & + ( ~( 0xFF << w ) << ( 8 - w - x_pos ) ); + rval <<= 8; + + w = width - w; + } + + for ( ; w >= 8; w -= 8 ) + { + rval |= *p++; + *write++ |= ( rval >> nbits ) & 0xFF; + + rval <<= 8; + } + + if ( w > 0 ) + { + if ( nbits < w ) + { + rval |= *p++; + *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits += 8 - w; + + rval <<= 8; + } + else + { + *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits -= w; + } + } + } + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_compound( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error = SFNT_Err_Ok; + FT_UInt num_components, nn; + + FT_Char horiBearingX = decoder->metrics->horiBearingX; + FT_Char horiBearingY = decoder->metrics->horiBearingY; + FT_Byte horiAdvance = decoder->metrics->horiAdvance; + FT_Char vertBearingX = decoder->metrics->vertBearingX; + FT_Char vertBearingY = decoder->metrics->vertBearingY; + FT_Byte vertAdvance = decoder->metrics->vertAdvance; + + + if ( p + 2 > limit ) + goto Fail; + + num_components = FT_NEXT_USHORT( p ); + if ( p + 4 * num_components > limit ) + goto Fail; + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder ); + if ( error ) + goto Exit; + } + + for ( nn = 0; nn < num_components; nn++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + FT_Byte dx = FT_NEXT_BYTE( p ); + FT_Byte dy = FT_NEXT_BYTE( p ); + + + /* NB: a recursive call */ + error = tt_sbit_decoder_load_image( decoder, gindex, + x_pos + dx, y_pos + dy ); + if ( error ) + break; + } + + decoder->metrics->horiBearingX = horiBearingX; + decoder->metrics->horiBearingY = horiBearingY; + decoder->metrics->horiAdvance = horiAdvance; + decoder->metrics->vertBearingX = vertBearingX; + decoder->metrics->vertBearingY = vertBearingY; + decoder->metrics->vertAdvance = vertAdvance; + decoder->metrics->width = (FT_UInt)decoder->bitmap->width; + decoder->metrics->height = (FT_UInt)decoder->bitmap->rows; + + Exit: + return error; + + Fail: + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + + static FT_Error + tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder, + FT_UInt glyph_format, + FT_ULong glyph_start, + FT_ULong glyph_size, + FT_Int x_pos, + FT_Int y_pos ) + { + FT_Error error; + FT_Stream stream = decoder->stream; + FT_Byte* p; + FT_Byte* p_limit; + FT_Byte* data; + + + /* seek into the EBDT table now */ + if ( glyph_start + glyph_size > decoder->ebdt_size ) + { + error = SFNT_Err_Invalid_Argument; + goto Exit; + } + + if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) || + FT_FRAME_EXTRACT( glyph_size, data ) ) + goto Exit; + + p = data; + p_limit = p + glyph_size; + + /* read the data, depending on the glyph format */ + switch ( glyph_format ) + { + case 1: + case 2: + case 8: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 ); + break; + + case 6: + case 7: + case 9: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ); + break; + + default: + error = SFNT_Err_Ok; + } + + if ( error ) + goto Fail; + + { + TT_SBitDecoder_LoadFunc loader; + + + switch ( glyph_format ) + { + case 1: + case 6: + loader = tt_sbit_decoder_load_byte_aligned; + break; + + case 2: + case 5: + case 7: + loader = tt_sbit_decoder_load_bit_aligned; + break; + + case 8: + if ( p + 1 > p_limit ) + goto Fail; + + p += 1; /* skip padding */ + /* fall-through */ + + case 9: + loader = tt_sbit_decoder_load_compound; + break; + + default: + goto Fail; + } + + error = loader( decoder, p, p_limit, x_pos, y_pos ); + } + + Fail: + FT_FRAME_RELEASE( data ); + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos ) + { + /* + * First, we find the correct strike range that applies to this + * glyph index. + */ + + FT_Byte* p = decoder->eblc_base + decoder->strike_index_array; + FT_Byte* p_limit = decoder->eblc_limit; + FT_ULong num_ranges = decoder->strike_index_count; + FT_UInt start, end, index_format, image_format; + FT_ULong image_start = 0, image_end = 0, image_offset; + + + for ( ; num_ranges > 0; num_ranges-- ) + { + start = FT_NEXT_USHORT( p ); + end = FT_NEXT_USHORT( p ); + + if ( glyph_index >= start && glyph_index <= end ) + goto FoundRange; + + p += 4; /* ignore index offset */ + } + goto NoBitmap; + + FoundRange: + image_offset = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( decoder->eblc_base + decoder->strike_index_array + image_offset < + decoder->eblc_base ) + goto Failure; + + p = decoder->eblc_base + decoder->strike_index_array + image_offset; + if ( p + 8 > p_limit ) + goto NoBitmap; + + /* now find the glyph's location and extend within the ebdt table */ + index_format = FT_NEXT_USHORT( p ); + image_format = FT_NEXT_USHORT( p ); + image_offset = FT_NEXT_ULONG ( p ); + + switch ( index_format ) + { + case 1: /* 4-byte offsets relative to `image_offset' */ + { + p += 4 * ( glyph_index - start ); + if ( p + 8 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_ULONG( p ); + image_end = FT_NEXT_ULONG( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + } + break; + + case 2: /* big metrics, constant image size */ + { + FT_ULong image_size; + + + if ( p + 12 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + image_start = image_size * ( glyph_index - start ); + image_end = image_start + image_size; + } + break; + + case 3: /* 2-byte offsets relative to 'image_offset' */ + { + p += 2 * ( glyph_index - start ); + if ( p + 4 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_USHORT( p ); + image_end = FT_NEXT_USHORT( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + } + break; + + case 4: /* sparse glyph array with (glyph,offset) pairs */ + { + FT_ULong mm, num_glyphs; + + + if ( p + 4 > p_limit ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( p + ( num_glyphs + 1 ) * 4 < p ) + goto Failure; + + if ( p + ( num_glyphs + 1 ) * 4 > p_limit ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + { + image_start = FT_NEXT_USHORT( p ); + p += 2; + image_end = FT_PEEK_USHORT( p ); + break; + } + p += 2; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + } + break; + + case 5: /* constant metrics with sparse glyph codes */ + { + FT_ULong image_size, mm, num_glyphs; + + + if ( p + 16 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check */ + if ( p + 2 * num_glyphs < p ) + goto Failure; + + if ( p + 2 * num_glyphs > p_limit ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + break; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + + image_start = image_size * mm; + image_end = image_start + image_size; + } + break; + + default: + goto NoBitmap; + } + + if ( image_start > image_end ) + goto NoBitmap; + + image_end -= image_start; + image_start = image_offset + image_start; + + return tt_sbit_decoder_load_bitmap( decoder, + image_format, + image_start, + image_end, + x_pos, + y_pos ); + + Failure: + return SFNT_Err_Invalid_Table; + + NoBitmap: + return SFNT_Err_Invalid_Argument; + } + + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ) + { + TT_SBitDecoderRec decoder[1]; + FT_Error error; + + FT_UNUSED( load_flags ); + FT_UNUSED( stream ); + FT_UNUSED( map ); + + + error = tt_sbit_decoder_init( decoder, face, strike_index, metrics ); + if ( !error ) + { + error = tt_sbit_decoder_load_image( decoder, glyph_index, 0, 0 ); + tt_sbit_decoder_done( decoder ); + } + + return error; + } + +/* EOF */ diff --git a/src/3rdparty/freetype/src/smooth/Jamfile b/src/3rdparty/freetype/src/smooth/Jamfile new file mode 100644 index 0000000000..8a792df056 --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/smooth Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) smooth ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftgrays ftsmooth ; + } + else + { + _sources = smooth ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/smooth Jamfile diff --git a/src/3rdparty/freetype/src/smooth/ftgrays.c b/src/3rdparty/freetype/src/smooth/ftgrays.c new file mode 100644 index 0000000000..10fa2ae727 --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/ftgrays.c @@ -0,0 +1,2057 @@ +/***************************************************************************/ +/* */ +/* ftgrays.c */ +/* */ +/* A new `perfect' anti-aliasing renderer (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file can be compiled without the rest of the FreeType engine, by */ + /* defining the _STANDALONE_ macro when compiling it. You also need to */ + /* put the files `ftgrays.h' and `ftimage.h' into the current */ + /* compilation directory. Typically, you could do something like */ + /* */ + /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */ + /* same directory */ + /* */ + /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */ + /* */ + /* cc -c -D_STANDALONE_ ftgrays.c */ + /* */ + /* The renderer can be initialized with a call to */ + /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */ + /* with a call to `ft_gray_raster.raster_render'. */ + /* */ + /* See the comments and documentation in the file `ftimage.h' for more */ + /* details on how the raster works. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* This is a new anti-aliasing scan-converter for FreeType 2. The */ + /* algorithm used here is _very_ different from the one in the standard */ + /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ + /* coverage of the outline on each pixel cell. */ + /* */ + /* It is based on ideas that I initially found in Raph Levien's */ + /* excellent LibArt graphics library (see http://www.levien.com/libart */ + /* for more information, though the web pages do not tell anything */ + /* about the renderer; you'll have to dive into the source code to */ + /* understand how it works). */ + /* */ + /* Note, however, that this is a _very_ different implementation */ + /* compared to Raph's. Coverage information is stored in a very */ + /* different way, and I don't use sorted vector paths. Also, it doesn't */ + /* use floating point values. */ + /* */ + /* This renderer has the following advantages: */ + /* */ + /* - It doesn't need an intermediate bitmap. Instead, one can supply a */ + /* callback function that will be called by the renderer to draw gray */ + /* spans on any target surface. You can thus do direct composition on */ + /* any kind of bitmap, provided that you give the renderer the right */ + /* callback. */ + /* */ + /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ + /* each pixel cell. */ + /* */ + /* - It performs a single pass on the outline (the `standard' FT2 */ + /* renderer makes two passes). */ + /* */ + /* - It can easily be modified to render to _any_ number of gray levels */ + /* cheaply. */ + /* */ + /* - For small (< 20) pixel sizes, it is faster than the standard */ + /* renderer. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_smooth + + +#ifdef _STANDALONE_ + + + /* define this to dump debugging information */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + +#ifdef FT_DEBUG_LEVEL_TRACE +#include <stdio.h> +#include <stdarg.h> +#endif + +#include <string.h> +#include <setjmp.h> +#include <limits.h> +#define FT_UINT_MAX UINT_MAX + +#define ft_memset memset + +#define ft_setjmp setjmp +#define ft_longjmp longjmp +#define ft_jmp_buf jmp_buf + + +#define ErrRaster_Invalid_Mode -2 +#define ErrRaster_Invalid_Outline -1 +#define ErrRaster_Invalid_Argument -3 +#define ErrRaster_Memory_Overflow -4 + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#include "ftimage.h" +#include "ftgrays.h" + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + + /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + void + FT_Message( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + /* we don't handle tracing levels in stand-alone mode; */ +#ifndef FT_TRACE5 +#define FT_TRACE5( varformat ) FT_Message varformat +#endif +#ifndef FT_TRACE7 +#define FT_TRACE7( varformat ) FT_Message varformat +#endif +#ifndef FT_ERROR +#define FT_ERROR( varformat ) FT_Message varformat +#endif + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#else /* !_STANDALONE_ */ + + +#include <ft2build.h> +#include "ftgrays.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_OUTLINE_H + +#include "ftsmerrs.h" + +#define ErrRaster_Invalid_Mode Smooth_Err_Cannot_Render_Glyph +#define ErrRaster_Invalid_Outline Smooth_Err_Invalid_Outline +#define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory +#define ErrRaster_Invalid_Argument Smooth_Err_Invalid_Argument + +#endif /* !_STANDALONE_ */ + + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + + /* as usual, for the speed hungry :-) */ + +#ifndef FT_STATIC_RASTER + + +#define RAS_ARG PWorker worker +#define RAS_ARG_ PWorker worker, + +#define RAS_VAR worker +#define RAS_VAR_ worker, + +#define ras (*worker) + + +#else /* FT_STATIC_RASTER */ + + +#define RAS_ARG /* empty */ +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ + + static TWorker ras; + + +#endif /* FT_STATIC_RASTER */ + + + /* must be at least 6 bits! */ +#define PIXEL_BITS 8 + +#define ONE_PIXEL ( 1L << PIXEL_BITS ) +#define PIXEL_MASK ( -1L << PIXEL_BITS ) +#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) +#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS ) +#define FLOOR( x ) ( (x) & -ONE_PIXEL ) +#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) +#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) + +#if PIXEL_BITS >= 6 +#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) ) +#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) +#else +#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) +#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) ) +#endif + + + /*************************************************************************/ + /* */ + /* TYPE DEFINITIONS */ + /* */ + + /* don't change the following types to FT_Int or FT_Pos, since we might */ + /* need to define them to "float" or "double" when experimenting with */ + /* new algorithms */ + + typedef int TCoord; /* integer scanline/pixel coordinate */ + typedef long TPos; /* sub-pixel coordinate */ + + /* determine the type used to store cell areas. This normally takes at */ + /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */ + /* `long' instead of `int', otherwise bad things happen */ + +#if PIXEL_BITS <= 7 + + typedef int TArea; + +#else /* PIXEL_BITS >= 8 */ + + /* approximately determine the size of integers using an ANSI-C header */ +#if FT_UINT_MAX == 0xFFFFU + typedef long TArea; +#else + typedef int TArea; +#endif + +#endif /* PIXEL_BITS >= 8 */ + + + /* maximal number of gray spans in a call to the span callback */ +#define FT_MAX_GRAY_SPANS 32 + + + typedef struct TCell_* PCell; + + typedef struct TCell_ + { + int x; + int cover; + TArea area; + PCell next; + + } TCell; + + + typedef struct TWorker_ + { + TCoord ex, ey; + TPos min_ex, max_ex; + TPos min_ey, max_ey; + TPos count_ex, count_ey; + + TArea area; + int cover; + int invalid; + + PCell cells; + int max_cells; + int num_cells; + + TCoord cx, cy; + TPos x, y; + + TPos last_ey; + + FT_Vector bez_stack[32 * 3 + 1]; + int lev_stack[32]; + + FT_Outline outline; + FT_Bitmap target; + FT_BBox clip_box; + + FT_Span gray_spans[FT_MAX_GRAY_SPANS]; + int num_gray_spans; + + FT_Raster_Span_Func render_span; + void* render_span_data; + int span_y; + + int band_size; + int band_shoot; + int conic_level; + int cubic_level; + + ft_jmp_buf jump_buffer; + + void* buffer; + long buffer_size; + + PCell* ycells; + int ycount; + + } TWorker, *PWorker; + + + typedef struct TRaster_ + { + void* buffer; + long buffer_size; + int band_size; + void* memory; + PWorker worker; + + } TRaster, *PRaster; + + + + /*************************************************************************/ + /* */ + /* Initialize the cells table. */ + /* */ + static void + gray_init_cells( RAS_ARG_ void* buffer, + long byte_size ) + { + ras.buffer = buffer; + ras.buffer_size = byte_size; + + ras.ycells = (PCell*) buffer; + ras.cells = NULL; + ras.max_cells = 0; + ras.num_cells = 0; + ras.area = 0; + ras.cover = 0; + ras.invalid = 1; + } + + + /*************************************************************************/ + /* */ + /* Compute the outline bounding box. */ + /* */ + static void + gray_compute_cbox( RAS_ARG ) + { + FT_Outline* outline = &ras.outline; + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + if ( outline->n_points <= 0 ) + { + ras.min_ex = ras.max_ex = 0; + ras.min_ey = ras.max_ey = 0; + return; + } + + ras.min_ex = ras.max_ex = vec->x; + ras.min_ey = ras.max_ey = vec->y; + + vec++; + + for ( ; vec < limit; vec++ ) + { + TPos x = vec->x; + TPos y = vec->y; + + + if ( x < ras.min_ex ) ras.min_ex = x; + if ( x > ras.max_ex ) ras.max_ex = x; + if ( y < ras.min_ey ) ras.min_ey = y; + if ( y > ras.max_ey ) ras.max_ey = y; + } + + /* truncate the bounding box to integer pixels */ + ras.min_ex = ras.min_ex >> 6; + ras.min_ey = ras.min_ey >> 6; + ras.max_ex = ( ras.max_ex + 63 ) >> 6; + ras.max_ey = ( ras.max_ey + 63 ) >> 6; + } + + + /*************************************************************************/ + /* */ + /* Record the current cell in the table. */ + /* */ + static PCell + gray_find_cell( RAS_ARG ) + { + PCell *pcell, cell; + int x = ras.ex; + + + if ( x > ras.count_ex ) + x = ras.count_ex; + + pcell = &ras.ycells[ras.ey]; + for (;;) + { + cell = *pcell; + if ( cell == NULL || cell->x > x ) + break; + + if ( cell->x == x ) + goto Exit; + + pcell = &cell->next; + } + + if ( ras.num_cells >= ras.max_cells ) + ft_longjmp( ras.jump_buffer, 1 ); + + cell = ras.cells + ras.num_cells++; + cell->x = x; + cell->area = 0; + cell->cover = 0; + + cell->next = *pcell; + *pcell = cell; + + Exit: + return cell; + } + + + static void + gray_record_cell( RAS_ARG ) + { + if ( !ras.invalid && ( ras.area | ras.cover ) ) + { + PCell cell = gray_find_cell( RAS_VAR ); + + + cell->area += ras.area; + cell->cover += ras.cover; + } + } + + + /*************************************************************************/ + /* */ + /* Set the current cell to a new position. */ + /* */ + static void + gray_set_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + /* Move the cell pointer to a new position. We set the `invalid' */ + /* flag to indicate that the cell isn't part of those we're interested */ + /* in during the render phase. This means that: */ + /* */ + /* . the new vertical position must be within min_ey..max_ey-1. */ + /* . the new horizontal position must be strictly less than max_ex */ + /* */ + /* Note that if a cell is to the left of the clipping region, it is */ + /* actually set to the (min_ex-1) horizontal position. */ + + /* All cells that are on the left of the clipping region go to the */ + /* min_ex - 1 horizontal position. */ + ey -= ras.min_ey; + + if ( ex > ras.max_ex ) + ex = ras.max_ex; + + ex -= ras.min_ex; + if ( ex < 0 ) + ex = -1; + + /* are we moving to a different cell ? */ + if ( ex != ras.ex || ey != ras.ey ) + { + /* record the current one if it is valid */ + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); + + ras.area = 0; + ras.cover = 0; + } + + ras.ex = ex; + ras.ey = ey; + ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey || + ex >= ras.count_ex ); + } + + + /*************************************************************************/ + /* */ + /* Start a new contour at a given cell. */ + /* */ + static void + gray_start_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + if ( ex > ras.max_ex ) + ex = (TCoord)( ras.max_ex ); + + if ( ex < ras.min_ex ) + ex = (TCoord)( ras.min_ex - 1 ); + + ras.area = 0; + ras.cover = 0; + ras.ex = ex - ras.min_ex; + ras.ey = ey - ras.min_ey; + ras.last_ey = SUBPIXELS( ey ); + ras.invalid = 0; + + gray_set_cell( RAS_VAR_ ex, ey ); + } + + + /*************************************************************************/ + /* */ + /* Render a scanline as one or more cells. */ + /* */ + static void + gray_render_scanline( RAS_ARG_ TCoord ey, + TPos x1, + TCoord y1, + TPos x2, + TCoord y2 ) + { + TCoord ex1, ex2, fx1, fx2, delta; + long p, first, dx; + int incr, lift, mod, rem; + + + dx = x2 - x1; + + ex1 = TRUNC( x1 ); + ex2 = TRUNC( x2 ); + fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); + fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); + + /* trivial case. Happens often */ + if ( y1 == y2 ) + { + gray_set_cell( RAS_VAR_ ex2, ey ); + return; + } + + /* everything is located in a single cell. That is easy! */ + /* */ + if ( ex1 == ex2 ) + { + delta = y2 - y1; + ras.area += (TArea)( fx1 + fx2 ) * delta; + ras.cover += delta; + return; + } + + /* ok, we'll have to render a run of adjacent cells on the same */ + /* scanline... */ + /* */ + p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 ); + first = ONE_PIXEL; + incr = 1; + + if ( dx < 0 ) + { + p = fx1 * ( y2 - y1 ); + first = 0; + incr = -1; + dx = -dx; + } + + delta = (TCoord)( p / dx ); + mod = (TCoord)( p % dx ); + if ( mod < 0 ) + { + delta--; + mod += (TCoord)dx; + } + + ras.area += (TArea)( fx1 + first ) * delta; + ras.cover += delta; + + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + y1 += delta; + + if ( ex1 != ex2 ) + { + p = ONE_PIXEL * ( y2 - y1 + delta ); + lift = (TCoord)( p / dx ); + rem = (TCoord)( p % dx ); + if ( rem < 0 ) + { + lift--; + rem += (TCoord)dx; + } + + mod -= (int)dx; + + while ( ex1 != ex2 ) + { + delta = lift; + mod += rem; + if ( mod >= 0 ) + { + mod -= (TCoord)dx; + delta++; + } + + ras.area += (TArea)ONE_PIXEL * delta; + ras.cover += delta; + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + } + } + + delta = y2 - y1; + ras.area += (TArea)( fx2 + ONE_PIXEL - first ) * delta; + ras.cover += delta; + } + + + /*************************************************************************/ + /* */ + /* Render a given line as a series of scanlines. */ + /* */ + static void + gray_render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TCoord ey1, ey2, fy1, fy2; + TPos dx, dy, x, x2; + long p, first; + int delta, rem, mod, lift, incr; + + + ey1 = TRUNC( ras.last_ey ); + ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ + fy1 = (TCoord)( ras.y - ras.last_ey ); + fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) ); + + dx = to_x - ras.x; + dy = to_y - ras.y; + + /* XXX: we should do something about the trivial case where dx == 0, */ + /* as it happens very often! */ + + /* perform vertical clipping */ + { + TCoord min, max; + + + min = ey1; + max = ey2; + if ( ey1 > ey2 ) + { + min = ey2; + max = ey1; + } + if ( min >= ras.max_ey || max < ras.min_ey ) + goto End; + } + + /* everything is on a single scanline */ + if ( ey1 == ey2 ) + { + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 ); + goto End; + } + + /* vertical line - avoid calling gray_render_scanline */ + incr = 1; + + if ( dx == 0 ) + { + TCoord ex = TRUNC( ras.x ); + TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 ); + TPos area; + + + first = ONE_PIXEL; + if ( dy < 0 ) + { + first = 0; + incr = -1; + } + + delta = (int)( first - fy1 ); + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + ey1 += incr; + + gray_set_cell( &ras, ex, ey1 ); + + delta = (int)( first + first - ONE_PIXEL ); + area = (TArea)two_fx * delta; + while ( ey1 != ey2 ) + { + ras.area += area; + ras.cover += delta; + ey1 += incr; + + gray_set_cell( &ras, ex, ey1 ); + } + + delta = (int)( fy2 - ONE_PIXEL + first ); + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + + goto End; + } + + /* ok, we have to render several scanlines */ + p = ( ONE_PIXEL - fy1 ) * dx; + first = ONE_PIXEL; + incr = 1; + + if ( dy < 0 ) + { + p = fy1 * dx; + first = 0; + incr = -1; + dy = -dy; + } + + delta = (int)( p / dy ); + mod = (int)( p % dy ); + if ( mod < 0 ) + { + delta--; + mod += (TCoord)dy; + } + + x = ras.x + delta; + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first ); + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + + if ( ey1 != ey2 ) + { + p = ONE_PIXEL * dx; + lift = (int)( p / dy ); + rem = (int)( p % dy ); + if ( rem < 0 ) + { + lift--; + rem += (int)dy; + } + mod -= (int)dy; + + while ( ey1 != ey2 ) + { + delta = lift; + mod += rem; + if ( mod >= 0 ) + { + mod -= (int)dy; + delta++; + } + + x2 = x + delta; + gray_render_scanline( RAS_VAR_ ey1, x, + (TCoord)( ONE_PIXEL - first ), x2, + (TCoord)first ); + x = x2; + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + } + } + + gray_render_scanline( RAS_VAR_ ey1, x, + (TCoord)( ONE_PIXEL - first ), to_x, + fy2 ); + + End: + ras.x = to_x; + ras.y = to_y; + ras.last_ey = SUBPIXELS( ey2 ); + } + + + static void + gray_split_conic( FT_Vector* base ) + { + TPos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static void + gray_render_conic( RAS_ARG_ const FT_Vector* control, + const FT_Vector* to ) + { + TPos dx, dy; + int top, level; + int* levels; + FT_Vector* arc; + + + dx = DOWNSCALE( ras.x ) + to->x - ( control->x << 1 ); + if ( dx < 0 ) + dx = -dx; + dy = DOWNSCALE( ras.y ) + to->y - ( control->y << 1 ); + if ( dy < 0 ) + dy = -dy; + if ( dx < dy ) + dx = dy; + + level = 1; + dx = dx / ras.conic_level; + while ( dx > 0 ) + { + dx >>= 2; + level++; + } + + /* a shortcut to speed things up */ + if ( level <= 1 ) + { + /* we compute the mid-point directly in order to avoid */ + /* calling gray_split_conic() */ + TPos to_x, to_y, mid_x, mid_y; + + + to_x = UPSCALE( to->x ); + to_y = UPSCALE( to->y ); + mid_x = ( ras.x + to_x + 2 * UPSCALE( control->x ) ) / 4; + mid_y = ( ras.y + to_y + 2 * UPSCALE( control->y ) ) / 4; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + + return; + } + + arc = ras.bez_stack; + levels = ras.lev_stack; + top = 0; + levels[0] = level; + + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control->x ); + arc[1].y = UPSCALE( control->y ); + arc[2].x = ras.x; + arc[2].y = ras.y; + + while ( top >= 0 ) + { + level = levels[top]; + if ( level > 1 ) + { + /* check that the arc crosses the current band */ + TPos min, max, y; + + + min = max = arc[0].y; + + y = arc[1].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + + y = arc[2].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) + goto Draw; + + gray_split_conic( arc ); + arc += 2; + top++; + levels[top] = levels[top - 1] = level - 1; + continue; + } + + Draw: + { + TPos to_x, to_y, mid_x, mid_y; + + + to_x = arc[0].x; + to_y = arc[0].y; + mid_x = ( ras.x + to_x + 2 * arc[1].x ) / 4; + mid_y = ( ras.y + to_y + 2 * arc[1].y ) / 4; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + + top--; + arc -= 2; + } + } + + return; + } + + + static void + gray_split_cubic( FT_Vector* base ) + { + TPos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + static void + gray_render_cubic( RAS_ARG_ const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to ) + { + TPos dx, dy, da, db; + int top, level; + int* levels; + FT_Vector* arc; + + + dx = DOWNSCALE( ras.x ) + to->x - ( control1->x << 1 ); + if ( dx < 0 ) + dx = -dx; + dy = DOWNSCALE( ras.y ) + to->y - ( control1->y << 1 ); + if ( dy < 0 ) + dy = -dy; + if ( dx < dy ) + dx = dy; + da = dx; + + dx = DOWNSCALE( ras.x ) + to->x - 3 * ( control1->x + control2->x ); + if ( dx < 0 ) + dx = -dx; + dy = DOWNSCALE( ras.y ) + to->y - 3 * ( control1->x + control2->y ); + if ( dy < 0 ) + dy = -dy; + if ( dx < dy ) + dx = dy; + db = dx; + + level = 1; + da = da / ras.cubic_level; + db = db / ras.conic_level; + while ( da > 0 || db > 0 ) + { + da >>= 2; + db >>= 3; + level++; + } + + if ( level <= 1 ) + { + TPos to_x, to_y, mid_x, mid_y; + + + to_x = UPSCALE( to->x ); + to_y = UPSCALE( to->y ); + mid_x = ( ras.x + to_x + + 3 * UPSCALE( control1->x + control2->x ) ) / 8; + mid_y = ( ras.y + to_y + + 3 * UPSCALE( control1->y + control2->y ) ) / 8; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + return; + } + + arc = ras.bez_stack; + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control2->x ); + arc[1].y = UPSCALE( control2->y ); + arc[2].x = UPSCALE( control1->x ); + arc[2].y = UPSCALE( control1->y ); + arc[3].x = ras.x; + arc[3].y = ras.y; + + levels = ras.lev_stack; + top = 0; + levels[0] = level; + + while ( top >= 0 ) + { + level = levels[top]; + if ( level > 1 ) + { + /* check that the arc crosses the current band */ + TPos min, max, y; + + + min = max = arc[0].y; + y = arc[1].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + y = arc[2].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + y = arc[3].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < 0 ) + goto Draw; + gray_split_cubic( arc ); + arc += 3; + top ++; + levels[top] = levels[top - 1] = level - 1; + continue; + } + + Draw: + { + TPos to_x, to_y, mid_x, mid_y; + + + to_x = arc[0].x; + to_y = arc[0].y; + mid_x = ( ras.x + to_x + 3 * ( arc[1].x + arc[2].x ) ) / 8; + mid_y = ( ras.y + to_y + 3 * ( arc[1].y + arc[2].y ) ) / 8; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + top --; + arc -= 3; + } + } + + return; + } + + + + static int + gray_move_to( const FT_Vector* to, + PWorker worker ) + { + TPos x, y; + + + /* record current cell, if any */ + gray_record_cell( worker ); + + /* start to a new position */ + x = UPSCALE( to->x ); + y = UPSCALE( to->y ); + + gray_start_cell( worker, TRUNC( x ), TRUNC( y ) ); + + worker->x = x; + worker->y = y; + return 0; + } + + + static int + gray_line_to( const FT_Vector* to, + PWorker worker ) + { + gray_render_line( worker, UPSCALE( to->x ), UPSCALE( to->y ) ); + return 0; + } + + + static int + gray_conic_to( const FT_Vector* control, + const FT_Vector* to, + PWorker worker ) + { + gray_render_conic( worker, control, to ); + return 0; + } + + + static int + gray_cubic_to( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + PWorker worker ) + { + gray_render_cubic( worker, control1, control2, to ); + return 0; + } + + + static void + gray_render_span( int y, + int count, + const FT_Span* spans, + PWorker worker ) + { + unsigned char* p; + FT_Bitmap* map = &worker->target; + + + /* first of all, compute the scanline offset */ + p = (unsigned char*)map->buffer - y * map->pitch; + if ( map->pitch >= 0 ) + p += ( map->rows - 1 ) * map->pitch; + + for ( ; count > 0; count--, spans++ ) + { + unsigned char coverage = spans->coverage; + + + if ( coverage ) + { + /* For small-spans it is faster to do it by ourselves than + * calling `memset'. This is mainly due to the cost of the + * function call. + */ + if ( spans->len >= 8 ) + FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len ); + else + { + unsigned char* q = p + spans->x; + + + switch ( spans->len ) + { + case 7: *q++ = (unsigned char)coverage; + case 6: *q++ = (unsigned char)coverage; + case 5: *q++ = (unsigned char)coverage; + case 4: *q++ = (unsigned char)coverage; + case 3: *q++ = (unsigned char)coverage; + case 2: *q++ = (unsigned char)coverage; + case 1: *q = (unsigned char)coverage; + default: + ; + } + } + } + } + } + + + static void + gray_hline( RAS_ARG_ TCoord x, + TCoord y, + TPos area, + int acount ) + { + FT_Span* span; + int count; + int coverage; + + + /* compute the coverage line's coverage, depending on the */ + /* outline fill rule */ + /* */ + /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ + /* */ + coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); + /* use range 0..256 */ + if ( coverage < 0 ) + coverage = -coverage; + + if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) + { + coverage &= 511; + + if ( coverage > 256 ) + coverage = 512 - coverage; + else if ( coverage == 256 ) + coverage = 255; + } + else + { + /* normal non-zero winding rule */ + if ( coverage >= 256 ) + coverage = 255; + } + + y += (TCoord)ras.min_ey; + x += (TCoord)ras.min_ex; + + /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */ + if ( x >= 32767 ) + x = 32767; + + if ( coverage ) + { + /* see whether we can add this span to the current list */ + count = ras.num_gray_spans; + span = ras.gray_spans + count - 1; + if ( count > 0 && + ras.span_y == y && + (int)span->x + span->len == (int)x && + span->coverage == coverage ) + { + span->len = (unsigned short)( span->len + acount ); + return; + } + + if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS ) + { + if ( ras.render_span && count > 0 ) + ras.render_span( ras.span_y, count, ras.gray_spans, + ras.render_span_data ); + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( count > 0 ) + { + int n; + + + FT_TRACE7(( "y = %3d ", ras.span_y )); + span = ras.gray_spans; + for ( n = 0; n < count; n++, span++ ) + FT_TRACE7(( "[%d..%d]:%02x ", + span->x, span->x + span->len - 1, span->coverage )); + FT_TRACE7(( "\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + ras.num_gray_spans = 0; + ras.span_y = y; + + count = 0; + span = ras.gray_spans; + } + else + span++; + + /* add a gray span to the current list */ + span->x = (short)x; + span->len = (unsigned short)acount; + span->coverage = (unsigned char)coverage; + + ras.num_gray_spans++; + } + } + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* to be called while in the debugger -- */ + /* this function causes a compiler warning since it is unused otherwise */ + static void + gray_dump_cells( RAS_ARG ) + { + int yindex; + + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + { + PCell cell; + + + printf( "%3d:", yindex ); + + for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next ) + printf( " (%3d, c:%4d, a:%6d)", cell->x, cell->cover, cell->area ); + printf( "\n" ); + } + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + static void + gray_sweep( RAS_ARG_ const FT_Bitmap* target ) + { + int yindex; + + FT_UNUSED( target ); + + + if ( ras.num_cells == 0 ) + return; + + ras.num_gray_spans = 0; + + FT_TRACE7(( "gray_sweep: start\n" )); + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + { + PCell cell = ras.ycells[yindex]; + TCoord cover = 0; + TCoord x = 0; + + + for ( ; cell != NULL; cell = cell->next ) + { + TArea area; + + + if ( cell->x > x && cover != 0 ) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), + cell->x - x ); + + cover += cell->cover; + area = cover * ( ONE_PIXEL * 2 ) - cell->area; + + if ( area != 0 && cell->x >= 0 ) + gray_hline( RAS_VAR_ cell->x, yindex, area, 1 ); + + x = cell->x + 1; + } + + if ( cover != 0 ) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), + ras.count_ex - x ); + } + + if ( ras.render_span && ras.num_gray_spans > 0 ) + ras.render_span( ras.span_y, ras.num_gray_spans, + ras.gray_spans, ras.render_span_data ); + + FT_TRACE7(( "gray_sweep: end\n" )); + } + + +#ifdef _STANDALONE_ + + /*************************************************************************/ + /* */ + /* The following function should only compile in stand-alone mode, */ + /* i.e., when building this component without the rest of FreeType. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Decompose */ + /* */ + /* <Description> */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function is also able to emit */ + /* `move to' and `close to' operations to indicate the start and end */ + /* of new contours in the outline. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* <InOut> */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + static int + FT_Outline_Decompose( const FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + int error; + + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + char tag; /* current point's state */ + + int shift; + TPos delta; + + + if ( !outline || !func_interface ) + return ErrRaster_Invalid_Argument; + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + int last; /* index of last point in contour */ + + + FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return 0; + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); + return error; + + Invalid_Outline: + return ErrRaster_Invalid_Outline; + } + +#endif /* _STANDALONE_ */ + + + typedef struct TBand_ + { + TPos min, max; + + } TBand; + + + static int + gray_convert_glyph_inner( RAS_ARG ) + { + static + const FT_Outline_Funcs func_interface = + { + (FT_Outline_MoveTo_Func) gray_move_to, + (FT_Outline_LineTo_Func) gray_line_to, + (FT_Outline_ConicTo_Func)gray_conic_to, + (FT_Outline_CubicTo_Func)gray_cubic_to, + 0, + 0 + }; + + volatile int error = 0; + + + if ( ft_setjmp( ras.jump_buffer ) == 0 ) + { + error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); + gray_record_cell( RAS_VAR ); + } + else + error = ErrRaster_Memory_Overflow; + + return error; + } + + + static int + gray_convert_glyph( RAS_ARG ) + { + TBand bands[40]; + TBand* volatile band; + int volatile n, num_bands; + TPos volatile min, max, max_y; + FT_BBox* clip; + + + /* Set up state in the raster object */ + gray_compute_cbox( RAS_VAR ); + + /* clip to target bitmap, exit if nothing to do */ + clip = &ras.clip_box; + + if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || + ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax ) + return 0; + + if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin; + if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin; + + if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax; + if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax; + + ras.count_ex = ras.max_ex - ras.min_ex; + ras.count_ey = ras.max_ey - ras.min_ey; + + /* simple heuristic used to speed up the bezier decomposition -- see */ + /* the code in gray_render_conic() and gray_render_cubic() for more */ + /* details */ + ras.conic_level = 32; + ras.cubic_level = 16; + + { + int level = 0; + + + if ( ras.count_ex > 24 || ras.count_ey > 24 ) + level++; + if ( ras.count_ex > 120 || ras.count_ey > 120 ) + level++; + + ras.conic_level <<= level; + ras.cubic_level <<= level; + } + + /* set up vertical bands */ + num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size ); + if ( num_bands == 0 ) + num_bands = 1; + if ( num_bands >= 39 ) + num_bands = 39; + + ras.band_shoot = 0; + + min = ras.min_ey; + max_y = ras.max_ey; + + for ( n = 0; n < num_bands; n++, min = max ) + { + max = min + ras.band_size; + if ( n == num_bands - 1 || max > max_y ) + max = max_y; + + bands[0].min = min; + bands[0].max = max; + band = bands; + + while ( band >= bands ) + { + TPos bottom, top, middle; + int error; + + { + PCell cells_max; + int yindex; + long cell_start, cell_end, cell_mod; + + + ras.ycells = (PCell*)ras.buffer; + ras.ycount = band->max - band->min; + + cell_start = sizeof ( PCell ) * ras.ycount; + cell_mod = cell_start % sizeof ( TCell ); + if ( cell_mod > 0 ) + cell_start += sizeof ( TCell ) - cell_mod; + + cell_end = ras.buffer_size; + cell_end -= cell_end % sizeof( TCell ); + + cells_max = (PCell)( (char*)ras.buffer + cell_end ); + ras.cells = (PCell)( (char*)ras.buffer + cell_start ); + if ( ras.cells >= cells_max ) + goto ReduceBands; + + ras.max_cells = cells_max - ras.cells; + if ( ras.max_cells < 2 ) + goto ReduceBands; + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + ras.ycells[yindex] = NULL; + } + + ras.num_cells = 0; + ras.invalid = 1; + ras.min_ey = band->min; + ras.max_ey = band->max; + ras.count_ey = band->max - band->min; + + error = gray_convert_glyph_inner( RAS_VAR ); + + if ( !error ) + { + gray_sweep( RAS_VAR_ &ras.target ); + band--; + continue; + } + else if ( error != ErrRaster_Memory_Overflow ) + return 1; + + ReduceBands: + /* render pool overflow; we will reduce the render band by half */ + bottom = band->min; + top = band->max; + middle = bottom + ( ( top - bottom ) >> 1 ); + + /* This is too complex for a single scanline; there must */ + /* be some problems. */ + if ( middle == bottom ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE7(( "gray_convert_glyph: Rotten glyph!\n" )); +#endif + return 1; + } + + if ( bottom-top >= ras.band_size ) + ras.band_shoot++; + + band[1].min = bottom; + band[1].max = middle; + band[0].min = middle; + band[0].max = top; + band++; + } + } + + if ( ras.band_shoot > 8 && ras.band_size > 16 ) + ras.band_size = ras.band_size / 2; + + return 0; + } + + + static int + gray_raster_render( PRaster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + PWorker worker; + + + if ( !raster || !raster->buffer || !raster->buffer_size ) + return ErrRaster_Invalid_Argument; + + if ( !outline ) + return ErrRaster_Invalid_Outline; + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return 0; + + if ( !outline->contours || !outline->points ) + return ErrRaster_Invalid_Outline; + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return ErrRaster_Invalid_Outline; + + worker = raster->worker; + + /* if direct mode is not set, we must have a target bitmap */ + if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) + { + if ( !target_map ) + return ErrRaster_Invalid_Argument; + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return 0; + + if ( !target_map->buffer ) + return ErrRaster_Invalid_Argument; + } + + /* this version does not support monochrome rendering */ + if ( !( params->flags & FT_RASTER_FLAG_AA ) ) + return ErrRaster_Invalid_Mode; + + /* compute clipping box */ + if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) + { + /* compute clip box from target pixmap */ + ras.clip_box.xMin = 0; + ras.clip_box.yMin = 0; + ras.clip_box.xMax = target_map->width; + ras.clip_box.yMax = target_map->rows; + } + else if ( params->flags & FT_RASTER_FLAG_CLIP ) + ras.clip_box = params->clip_box; + else + { + ras.clip_box.xMin = -32768L; + ras.clip_box.yMin = -32768L; + ras.clip_box.xMax = 32767L; + ras.clip_box.yMax = 32767L; + } + + gray_init_cells( worker, raster->buffer, raster->buffer_size ); + + ras.outline = *outline; + ras.num_cells = 0; + ras.invalid = 1; + ras.band_size = raster->band_size; + ras.num_gray_spans = 0; + + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + { + ras.render_span = (FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + } + else + { + ras.target = *target_map; + ras.render_span = (FT_Raster_Span_Func)gray_render_span; + ras.render_span_data = &ras; + } + + return gray_convert_glyph( worker ); + } + + + /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ + /**** a static object. *****/ + +#ifdef _STANDALONE_ + + static int + gray_raster_new( void* memory, + FT_Raster* araster ) + { + static TRaster the_raster; + + FT_UNUSED( memory ); + + + *araster = (FT_Raster)&the_raster; + FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + + return 0; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + +#else /* _STANDALONE_ */ + + static int + gray_raster_new( FT_Memory memory, + FT_Raster* araster ) + { + FT_Error error; + PRaster raster; + + + *araster = 0; + if ( !FT_ALLOC( raster, sizeof ( TRaster ) ) ) + { + raster->memory = memory; + *araster = (FT_Raster)raster; + } + + return error; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + FT_Memory memory = (FT_Memory)((PRaster)raster)->memory; + + + FT_FREE( raster ); + } + +#endif /* _STANDALONE_ */ + + + static void + gray_raster_reset( FT_Raster raster, + char* pool_base, + long pool_size ) + { + PRaster rast = (PRaster)raster; + + + if ( raster ) + { + if ( pool_base && pool_size >= (long)sizeof ( TWorker ) + 2048 ) + { + PWorker worker = (PWorker)pool_base; + + + rast->worker = worker; + rast->buffer = pool_base + + ( ( sizeof ( TWorker ) + sizeof ( TCell ) - 1 ) & + ~( sizeof ( TCell ) - 1 ) ); + rast->buffer_size = (long)( ( pool_base + pool_size ) - + (char*)rast->buffer ) & + ~( sizeof ( TCell ) - 1 ); + rast->band_size = (int)( rast->buffer_size / + ( sizeof ( TCell ) * 8 ) ); + } + else + { + rast->buffer = NULL; + rast->buffer_size = 0; + rast->worker = NULL; + } + } + } + + + const FT_Raster_Funcs ft_grays_raster = + { + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Raster_New_Func) gray_raster_new, + (FT_Raster_Reset_Func) gray_raster_reset, + (FT_Raster_Set_Mode_Func)0, + (FT_Raster_Render_Func) gray_raster_render, + (FT_Raster_Done_Func) gray_raster_done + }; + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/src/3rdparty/freetype/src/smooth/ftgrays.h b/src/3rdparty/freetype/src/smooth/ftgrays.h new file mode 100644 index 0000000000..2d409543dc --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/ftgrays.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* ftgrays.h */ +/* */ +/* FreeType smooth renderer declaration */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGRAYS_H__ +#define __FTGRAYS_H__ + +#ifdef __cplusplus + extern "C" { +#endif + + +#ifdef _STANDALONE_ +#include "ftimage.h" +#else +#include <ft2build.h> +#include FT_IMAGE_H +#endif + + + /*************************************************************************/ + /* */ + /* To make ftgrays.h independent from configuration files we check */ + /* whether FT_EXPORT_VAR has been defined already. */ + /* */ + /* On some systems and compilers (Win32 mostly), an extra keyword is */ + /* necessary to compile the library as a DLL. */ + /* */ +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) extern x +#endif + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster; + + +#ifdef __cplusplus + } +#endif + +#endif /* __FTGRAYS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/smooth/ftsmerrs.h b/src/3rdparty/freetype/src/smooth/ftsmerrs.h new file mode 100644 index 0000000000..0c2a2ecd90 --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/ftsmerrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* ftsmerrs.h */ +/* */ +/* smooth renderer error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the smooth renderer error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __FTSMERRS_H__ +#define __FTSMERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX Smooth_Err_ +#define FT_ERR_BASE FT_Mod_Err_Smooth + +#include FT_ERRORS_H + +#endif /* __FTSMERRS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/smooth/ftsmooth.c b/src/3rdparty/freetype/src/smooth/ftsmooth.c new file mode 100644 index 0000000000..a6db5048d3 --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/ftsmooth.c @@ -0,0 +1,467 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.c */ +/* */ +/* Anti-aliasing renderer interface (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftsmooth.h" +#include "ftgrays.h" + +#include "ftsmerrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_smooth_init( FT_Renderer render ) + { + FT_Library library = FT_MODULE_LIBRARY( render ); + + + render->clazz->raster_class->raster_reset( render->raster, + library->raster_pool, + library->raster_pool_size ); + + return 0; + } + + + /* sets render-specific mode */ + static FT_Error + ft_smooth_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + /* transform a given glyph image */ + static FT_Error + ft_smooth_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = Smooth_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = Smooth_Err_Invalid_Argument; + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_smooth_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_smooth_render_generic( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin, + FT_Render_Mode required_mode ) + { + FT_Error error; + FT_Outline* outline = NULL; + FT_BBox cbox; + FT_UInt width, height, height_org, width_org, pitch; + FT_Bitmap* bitmap; + FT_Memory memory; + FT_Int hmul = mode == FT_RENDER_MODE_LCD; + FT_Int vmul = mode == FT_RENDER_MODE_LCD_V; + FT_Pos x_shift, y_shift, x_left, y_top; + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = Smooth_Err_Invalid_Argument; + goto Exit; + } + + /* check mode */ + if ( mode != required_mode ) + return Smooth_Err_Cannot_Render_Glyph; + + outline = &slot->outline; + + /* translate the outline to the new origin if needed */ + if ( origin ) + FT_Outline_Translate( outline, origin->x, origin->y ); + + /* compute the control box, and grid fit it */ + FT_Outline_Get_CBox( outline, &cbox ); + + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + + width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); + height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); + bitmap = &slot->bitmap; + memory = render->root.memory; + + width_org = width; + height_org = height; + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + /* allocate new one, depends on pixel format */ + pitch = width; + if ( hmul ) + { + width = width * 3; + pitch = FT_PAD_CEIL( width, 4 ); + } + + if ( vmul ) + height *= 3; + + x_shift = (FT_Int) cbox.xMin; + y_shift = (FT_Int) cbox.yMin; + x_left = (FT_Int)( cbox.xMin >> 6 ); + y_top = (FT_Int)( cbox.yMax >> 6 ); + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + if ( slot->library->lcd_filter_func ) + { + FT_Int extra = slot->library->lcd_extra; + + + if ( hmul ) + { + x_shift -= 64 * ( extra >> 1 ); + width += 3 * extra; + pitch = FT_PAD_CEIL( width, 4 ); + x_left -= extra >> 1; + } + + if ( vmul ) + { + y_shift -= 64 * ( extra >> 1 ); + height += 3 * extra; + y_top += extra >> 1; + } + } + +#endif + + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + bitmap->width = width; + bitmap->rows = height; + bitmap->pitch = pitch; + + /* translate outline to render it into the bitmap */ + FT_Outline_Translate( outline, -x_shift, -y_shift ); + + if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + /* implode outline if needed */ + { + FT_Vector* points = outline->points; + FT_Vector* points_end = points + outline->n_points; + FT_Vector* vec; + + + if ( hmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->x *= 3; + + if ( vmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->y *= 3; + } + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* deflate outline if needed */ + { + FT_Vector* points = outline->points; + FT_Vector* points_end = points + outline->n_points; + FT_Vector* vec; + + + if ( hmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->x /= 3; + + if ( vmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->y /= 3; + } + + if ( slot->library->lcd_filter_func ) + slot->library->lcd_filter_func( bitmap, mode, slot->library ); + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /* render outline into bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* expand it horizontally */ + if ( hmul ) + { + FT_Byte* line = bitmap->buffer; + FT_UInt hh; + + + for ( hh = height_org; hh > 0; hh--, line += pitch ) + { + FT_UInt xx; + FT_Byte* end = line + width; + + + for ( xx = width_org; xx > 0; xx-- ) + { + FT_UInt pixel = line[xx-1]; + + + end[-3] = (FT_Byte)pixel; + end[-2] = (FT_Byte)pixel; + end[-1] = (FT_Byte)pixel; + end -= 3; + } + } + } + + /* expand it vertically */ + if ( vmul ) + { + FT_Byte* read = bitmap->buffer + ( height - height_org ) * pitch; + FT_Byte* write = bitmap->buffer; + FT_UInt hh; + + + for ( hh = height_org; hh > 0; hh-- ) + { + ft_memcpy( write, read, pitch ); + write += pitch; + + ft_memcpy( write, read, pitch ); + write += pitch; + + ft_memcpy( write, read, pitch ); + write += pitch; + read += pitch; + } + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + FT_Outline_Translate( outline, x_shift, y_shift ); + + if ( error ) + goto Exit; + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = x_left; + slot->bitmap_top = y_top; + + Exit: + if ( outline && origin ) + FT_Outline_Translate( outline, -origin->x, -origin->y ); + + return error; + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_smooth_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + if ( mode == FT_RENDER_MODE_LIGHT ) + mode = FT_RENDER_MODE_NORMAL; + + return ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_NORMAL ); + } + + + /* convert a slot's glyph image into a horizontal LCD bitmap */ + static FT_Error + ft_smooth_render_lcd( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + + error = ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_LCD ); + if ( !error ) + slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD; + + return error; + } + + + /* convert a slot's glyph image into a vertical LCD bitmap */ + static FT_Error + ft_smooth_render_lcd_v( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + + error = ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_LCD_V ); + if ( !error ) + slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V; + + return error; + } + + + FT_CALLBACK_TABLE_DEF + const FT_Renderer_Class ft_smooth_renderer_class = + { + { + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &ft_grays_raster + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Renderer_Class ft_smooth_lcd_renderer_class = + { + { + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth-lcd", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render_lcd, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &ft_grays_raster + }; + + + + FT_CALLBACK_TABLE_DEF + const FT_Renderer_Class ft_smooth_lcdv_renderer_class = + { + { + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth-lcdv", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &ft_grays_raster + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/smooth/ftsmooth.h b/src/3rdparty/freetype/src/smooth/ftsmooth.h new file mode 100644 index 0000000000..62cced4487 --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/ftsmooth.h @@ -0,0 +1,49 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.h */ +/* */ +/* Anti-aliasing renderer interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSMOOTH_H__ +#define __FTSMOOTH_H__ + + +#include <ft2build.h> +#include FT_RENDER_H + + +FT_BEGIN_HEADER + + +#ifndef FT_CONFIG_OPTION_NO_STD_RASTER + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_std_renderer_class; +#endif + +#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_renderer_class; + + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_lcd_renderer_class; + + FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_lcd_v_renderer_class; +#endif + + + +FT_END_HEADER + +#endif /* __FTSMOOTH_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/smooth/module.mk b/src/3rdparty/freetype/src/smooth/module.mk new file mode 100644 index 0000000000..47f6c04076 --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/module.mk @@ -0,0 +1,27 @@ +# +# FreeType 2 smooth renderer module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += SMOOTH_RENDERER + +define SMOOTH_RENDERER +$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE) +$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE) +$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/smooth/rules.mk b/src/3rdparty/freetype/src/smooth/rules.mk new file mode 100644 index 0000000000..4f27f01dba --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/rules.mk @@ -0,0 +1,69 @@ +# +# FreeType 2 smooth renderer module build rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# smooth driver directory +# +SMOOTH_DIR := $(SRC_DIR)/smooth + +# compilation flags for the driver +# +SMOOTH_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR)) + + +# smooth driver sources (i.e., C files) +# +SMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c \ + $(SMOOTH_DIR)/ftsmooth.c + + +# smooth driver headers +# +SMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h) \ + $(SMOOTH_DIR)/ftsmerrs.h + + +# smooth driver object(s) +# +# SMOOTH_DRV_OBJ_M is used during `multi' builds. +# SMOOTH_DRV_OBJ_S is used during `single' builds. +# +SMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O) +SMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O + +# smooth driver source file for single build +# +SMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c + + +# smooth driver - single object +# +$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \ + $(FREETYPE_H) $(SMOOTH_DRV_H) + $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S)) + + +# smooth driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H) + $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S) +DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/smooth/smooth.c b/src/3rdparty/freetype/src/smooth/smooth.c new file mode 100644 index 0000000000..ff6be3e400 --- /dev/null +++ b/src/3rdparty/freetype/src/smooth/smooth.c @@ -0,0 +1,26 @@ +/***************************************************************************/ +/* */ +/* smooth.c */ +/* */ +/* FreeType anti-aliasing rasterer module component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include <ft2build.h> +#include "ftgrays.c" +#include "ftsmooth.c" + + +/* END */ diff --git a/src/3rdparty/freetype/src/tools/Jamfile b/src/3rdparty/freetype/src/tools/Jamfile new file mode 100644 index 0000000000..475161e07f --- /dev/null +++ b/src/3rdparty/freetype/src/tools/Jamfile @@ -0,0 +1,5 @@ +# Jamfile for src/tools +# +SubDir FT2_TOP src tools ; + +Main apinames : apinames.c ; diff --git a/src/3rdparty/freetype/src/tools/apinames.c b/src/3rdparty/freetype/src/tools/apinames.c new file mode 100644 index 0000000000..19aec500bf --- /dev/null +++ b/src/3rdparty/freetype/src/tools/apinames.c @@ -0,0 +1,443 @@ +/* + * This little program is used to parse the FreeType headers and + * find the declaration of all public APIs. This is easy, because + * they all look like the following: + * + * FT_EXPORT( return_type ) + * function_name( function arguments ); + * + * You must pass the list of header files as arguments. Wildcards are + * accepted if you are using GCC for compilation (and probably by + * other compilers too). + * + * Author: David Turner, 2005, 2006, 2008 + * + * This code is explicitly placed into the public domain. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +#define PROGRAM_NAME "apinames" +#define PROGRAM_VERSION "0.1" + +#define LINEBUFF_SIZE 1024 + +typedef enum OutputFormat_ +{ + OUTPUT_LIST = 0, /* output the list of names, one per line */ + OUTPUT_WINDOWS_DEF, /* output a Windows .DEF file for Visual C++ or Mingw */ + OUTPUT_BORLAND_DEF, /* output a Windows .DEF file for Borland C++ */ + OUTPUT_WATCOM_LBC /* output a Watcom Linker Command File */ + +} OutputFormat; + + +static void +panic( const char* message ) +{ + fprintf( stderr, "PANIC: %s\n", message ); + exit(2); +} + + +typedef struct NameRec_ +{ + char* name; + unsigned int hash; + +} NameRec, *Name; + +static Name the_names; +static int num_names; +static int max_names; + +static void +names_add( const char* name, + const char* end ) +{ + int nn, len, h; + Name nm; + + if ( end <= name ) + return; + + /* compute hash value */ + len = (int)(end - name); + h = 0; + for ( nn = 0; nn < len; nn++ ) + h = h*33 + name[nn]; + + /* check for an pre-existing name */ + for ( nn = 0; nn < num_names; nn++ ) + { + nm = the_names + nn; + + if ( (int)nm->hash == h && + memcmp( name, nm->name, len ) == 0 && + nm->name[len] == 0 ) + return; + } + + /* add new name */ + if ( num_names >= max_names ) + { + max_names += (max_names >> 1) + 4; + the_names = (NameRec*)realloc( the_names, sizeof(the_names[0])*max_names ); + if ( the_names == NULL ) + panic( "not enough memory" ); + } + nm = &the_names[num_names++]; + + nm->hash = h; + nm->name = (char*)malloc( len+1 ); + if ( nm->name == NULL ) + panic( "not enough memory" ); + + memcpy( nm->name, name, len ); + nm->name[len] = 0; +} + + +static int +name_compare( const void* name1, + const void* name2 ) +{ + Name n1 = (Name)name1; + Name n2 = (Name)name2; + + return strcmp( n1->name, n2->name ); +} + +static void +names_sort( void ) +{ + qsort( the_names, (size_t)num_names, sizeof(the_names[0]), name_compare ); +} + + +static void +names_dump( FILE* out, + OutputFormat format, + const char* dll_name ) +{ + int nn; + + switch ( format ) + { + case OUTPUT_WINDOWS_DEF: + if ( dll_name ) + fprintf( out, "LIBRARY %s\n", dll_name ); + + fprintf( out, "DESCRIPTION FreeType 2 DLL\n" ); + fprintf( out, "EXPORTS\n" ); + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, " %s\n", the_names[nn].name ); + break; + + case OUTPUT_BORLAND_DEF: + if ( dll_name ) + fprintf( out, "LIBRARY %s\n", dll_name ); + + fprintf( out, "DESCRIPTION FreeType 2 DLL\n" ); + fprintf( out, "EXPORTS\n" ); + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, " _%s\n", the_names[nn].name ); + break; + + case OUTPUT_WATCOM_LBC: + { + /* we must omit the .dll suffix from the library name */ + char temp[512]; + char* dot; + + if ( dll_name == NULL ) + { + fprintf( stderr, + "you must provide a DLL name with the -d option !!\n" ); + exit(4); + } + + dot = strchr( dll_name, '.' ); + if ( dot != NULL ) + { + int len = (dot - dll_name); + if ( len > (int)(sizeof(temp)-1) ) + len = sizeof(temp)-1; + + memcpy( temp, dll_name, len ); + temp[len] = 0; + + dll_name = (const char*)temp; + } + + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, "++_%s.%s.%s\n", the_names[nn].name, dll_name, + the_names[nn].name ); + } + break; + + default: /* LIST */ + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, "%s\n", the_names[nn].name ); + } +} + + + + +/* states of the line parser */ + +typedef enum State_ +{ + STATE_START = 0, /* waiting for FT_EXPORT keyword and return type */ + STATE_TYPE /* type was read, waiting for function name */ + +} State; + +static int +read_header_file( FILE* file, int verbose ) +{ + static char buff[ LINEBUFF_SIZE+1 ]; + State state = STATE_START; + + while ( !feof( file ) ) + { + char* p; + + if ( !fgets( buff, LINEBUFF_SIZE, file ) ) + break; + + p = buff; + + while ( *p && (*p == ' ' || *p == '\\') ) /* skip leading whitespace */ + p++; + + if ( *p == '\n' || *p == '\r' ) /* skip empty lines */ + continue; + + switch ( state ) + { + case STATE_START: + { + if ( memcmp( p, "FT_EXPORT(", 10 ) != 0 ) + break; + + p += 10; + for (;;) + { + if ( *p == 0 || *p == '\n' || *p == '\r' ) + goto NextLine; + + if ( *p == ')' ) + { + p++; + break; + } + + p++; + } + + state = STATE_TYPE; + + /* sometimes, the name is just after the FT_EXPORT(...), so + * skip whitespace, and fall-through if we find an alphanumeric + * character + */ + while ( *p == ' ' || *p == '\t' ) + p++; + + if ( !isalpha(*p) ) + break; + } + /* fall-through */ + + case STATE_TYPE: + { + char* name = p; + + while ( isalnum(*p) || *p == '_' ) + p++; + + if ( p > name ) + { + if ( verbose ) + fprintf( stderr, ">>> %.*s\n", p-name, name ); + + names_add( name, p ); + } + + state = STATE_START; + } + break; + + default: + ; + } + + NextLine: + ; + } + + return 0; +} + + +static void +usage( void ) +{ + static const char* const format = + "%s %s: extract FreeType API names from header files\n\n" + "this program is used to extract the list of public FreeType API\n" + "functions. It receives the list of header files as argument and\n" + "generates a sorted list of unique identifiers\n\n" + + "usage: %s header1 [options] [header2 ...]\n\n" + + "options: - : parse the content of stdin, ignore arguments\n" + " -v : verbose mode, output sent to standard error\n" + " -oFILE : write output to FILE instead of standard output\n" + " -dNAME : indicate DLL file name, 'freetype.dll' by default\n" + " -w : output .DEF file for Visual C++ and Mingw\n" + " -wB : output .DEF file for Borland C++\n" + " -wW : output Watcom Linker Response File\n" + "\n"; + + fprintf( stderr, + format, + PROGRAM_NAME, + PROGRAM_VERSION, + PROGRAM_NAME + ); + exit(1); +} + + +int main( int argc, const char* const* argv ) +{ + int from_stdin = 0; + int verbose = 0; + OutputFormat format = OUTPUT_LIST; /* the default */ + FILE* out = stdout; + const char* library_name = NULL; + + if ( argc < 2 ) + usage(); + + /* '-' used as a single argument means read source file from stdin */ + while ( argc > 1 && argv[1][0] == '-' ) + { + const char* arg = argv[1]; + + switch ( arg[1] ) + { + case 'v': + verbose = 1; + break; + + case 'o': + if ( arg[2] == 0 ) + { + if ( argc < 2 ) + usage(); + + arg = argv[2]; + argv++; + argc--; + } + else + arg += 2; + + out = fopen( arg, "wt" ); + if ( out == NULL ) + { + fprintf( stderr, "could not open '%s' for writing\n", argv[2] ); + exit(3); + } + break; + + case 'd': + if ( arg[2] == 0 ) + { + if ( argc < 2 ) + usage(); + + arg = argv[2]; + argv++; + argc--; + } + else + arg += 2; + + library_name = arg; + break; + + case 'w': + format = OUTPUT_WINDOWS_DEF; + switch ( arg[2] ) + { + case 'B': + format = OUTPUT_BORLAND_DEF; + break; + + case 'W': + format = OUTPUT_WATCOM_LBC; + break; + + case 0: + break; + + default: + usage(); + } + break; + + case 0: + from_stdin = 1; + break; + + default: + usage(); + } + + argc--; + argv++; + } + + if ( from_stdin ) + { + read_header_file( stdin, verbose ); + } + else + { + for ( --argc, argv++; argc > 0; argc--, argv++ ) + { + FILE* file = fopen( argv[0], "rb" ); + + if ( file == NULL ) + fprintf( stderr, "unable to open '%s'\n", argv[0] ); + else + { + if ( verbose ) + fprintf( stderr, "opening '%s'\n", argv[0] ); + + read_header_file( file, verbose ); + fclose( file ); + } + } + } + + if ( num_names == 0 ) + panic( "could not find exported functions !!\n" ); + + names_sort(); + names_dump( out, format, library_name ); + + if ( out != stdout ) + fclose( out ); + + return 0; +} diff --git a/src/3rdparty/freetype/src/tools/cordic.py b/src/3rdparty/freetype/src/tools/cordic.py new file mode 100644 index 0000000000..3f80c5f09a --- /dev/null +++ b/src/3rdparty/freetype/src/tools/cordic.py @@ -0,0 +1,79 @@ +# compute arctangent table for CORDIC computations in fttrigon.c +import sys, math + +#units = 64*65536.0 # don't change !! +units = 256 +scale = units/math.pi +shrink = 1.0 +comma = "" + +def calc_val( x ): + global units, shrink + angle = math.atan(x) + shrink = shrink * math.cos(angle) + return angle/math.pi * units + +def print_val( n, x ): + global comma + + lo = int(x) + hi = lo + 1 + alo = math.atan(lo) + ahi = math.atan(hi) + ax = math.atan(2.0**n) + + errlo = abs( alo - ax ) + errhi = abs( ahi - ax ) + + if ( errlo < errhi ): + hi = lo + + sys.stdout.write( comma + repr( int(hi) ) ) + comma = ", " + + +print "" +print "table of arctan( 1/2^n ) for PI = " + repr(units/65536.0) + " units" + +# compute range of "i" +r = [-1] +r = r + range(32) + +for n in r: + + if n >= 0: + x = 1.0/(2.0**n) # tangent value + else: + x = 2.0**(-n) + + angle = math.atan(x) # arctangent + angle2 = angle*scale # arctangent in FT_Angle units + + # determine which integer value for angle gives the best tangent + lo = int(angle2) + hi = lo + 1 + tlo = math.tan(lo/scale) + thi = math.tan(hi/scale) + + errlo = abs( tlo - x ) + errhi = abs( thi - x ) + + angle2 = hi + if errlo < errhi: + angle2 = lo + + if angle2 <= 0: + break + + sys.stdout.write( comma + repr( int(angle2) ) ) + comma = ", " + + shrink = shrink * math.cos( angle2/scale) + + +print +print "shrink factor = " + repr( shrink ) +print "shrink factor 2 = " + repr( shrink * (2.0**32) ) +print "expansion factor = " + repr(1/shrink) +print "" + diff --git a/src/3rdparty/freetype/src/tools/docmaker/content.py b/src/3rdparty/freetype/src/tools/docmaker/content.py new file mode 100644 index 0000000000..0d76d19de3 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/docmaker/content.py @@ -0,0 +1,584 @@ +# Content (c) 2002, 2004, 2006, 2007, 2008, 2009 +# David Turner <david@freetype.org> +# +# This file contains routines used to parse the content of documentation +# comment blocks and build more structured objects out of them. +# + +from sources import * +from utils import * +import string, re + + +# this regular expression is used to detect code sequences. these +# are simply code fragments embedded in '{' and '}' like in: +# +# { +# x = y + z; +# if ( zookoo == 2 ) +# { +# foobar(); +# } +# } +# +# note that indentation of the starting and ending accolades must be +# exactly the same. the code sequence can contain accolades at greater +# indentation +# +re_code_start = re.compile( r"(\s*){\s*$" ) +re_code_end = re.compile( r"(\s*)}\s*$" ) + + +# this regular expression is used to isolate identifiers from +# other text +# +re_identifier = re.compile( r'(\w*)' ) + + +# we collect macros ending in `_H'; while outputting the object data, we use +# this info together with the object's file location to emit the appropriate +# header file macro and name before the object itself +# +re_header_macro = re.compile( r'^#define\s{1,}(\w{1,}_H)\s{1,}<(.*)>' ) + + +############################################################################# +# +# The DocCode class is used to store source code lines. +# +# 'self.lines' contains a set of source code lines that will be dumped as +# HTML in a <PRE> tag. +# +# The object is filled line by line by the parser; it strips the leading +# "margin" space from each input line before storing it in 'self.lines'. +# +class DocCode: + + def __init__( self, margin, lines ): + self.lines = [] + self.words = None + + # remove margin spaces + for l in lines: + if string.strip( l[:margin] ) == "": + l = l[margin:] + self.lines.append( l ) + + def dump( self, prefix = "", width = 60 ): + lines = self.dump_lines( 0, width ) + for l in lines: + print prefix + l + + def dump_lines( self, margin = 0, width = 60 ): + result = [] + for l in self.lines: + result.append( " " * margin + l ) + return result + + + +############################################################################# +# +# The DocPara class is used to store "normal" text paragraph. +# +# 'self.words' contains the list of words that make up the paragraph +# +class DocPara: + + def __init__( self, lines ): + self.lines = None + self.words = [] + for l in lines: + l = string.strip( l ) + self.words.extend( string.split( l ) ) + + def dump( self, prefix = "", width = 60 ): + lines = self.dump_lines( 0, width ) + for l in lines: + print prefix + l + + def dump_lines( self, margin = 0, width = 60 ): + cur = "" # current line + col = 0 # current width + result = [] + + for word in self.words: + ln = len( word ) + if col > 0: + ln = ln + 1 + + if col + ln > width: + result.append( " " * margin + cur ) + cur = word + col = len( word ) + else: + if col > 0: + cur = cur + " " + cur = cur + word + col = col + ln + + if col > 0: + result.append( " " * margin + cur ) + + return result + + + +############################################################################# +# +# The DocField class is used to store a list containing either DocPara or +# DocCode objects. Each DocField also has an optional "name" which is used +# when the object corresponds to a field or value definition +# +class DocField: + + def __init__( self, name, lines ): + self.name = name # can be None for normal paragraphs/sources + self.items = [] # list of items + + mode_none = 0 # start parsing mode + mode_code = 1 # parsing code sequences + mode_para = 3 # parsing normal paragraph + + margin = -1 # current code sequence indentation + cur_lines = [] + + # now analyze the markup lines to see if they contain paragraphs, + # code sequences or fields definitions + # + start = 0 + mode = mode_none + + for l in lines: + # are we parsing a code sequence ? + if mode == mode_code: + m = re_code_end.match( l ) + if m and len( m.group( 1 ) ) <= margin: + # that's it, we finished the code sequence + code = DocCode( 0, cur_lines ) + self.items.append( code ) + margin = -1 + cur_lines = [] + mode = mode_none + else: + # nope, continue the code sequence + cur_lines.append( l[margin:] ) + else: + # start of code sequence ? + m = re_code_start.match( l ) + if m: + # save current lines + if cur_lines: + para = DocPara( cur_lines ) + self.items.append( para ) + cur_lines = [] + + # switch to code extraction mode + margin = len( m.group( 1 ) ) + mode = mode_code + else: + if not string.split( l ) and cur_lines: + # if the line is empty, we end the current paragraph, + # if any + para = DocPara( cur_lines ) + self.items.append( para ) + cur_lines = [] + else: + # otherwise, simply add the line to the current + # paragraph + cur_lines.append( l ) + + if mode == mode_code: + # unexpected end of code sequence + code = DocCode( margin, cur_lines ) + self.items.append( code ) + elif cur_lines: + para = DocPara( cur_lines ) + self.items.append( para ) + + def dump( self, prefix = "" ): + if self.field: + print prefix + self.field + " ::" + prefix = prefix + "----" + + first = 1 + for p in self.items: + if not first: + print "" + p.dump( prefix ) + first = 0 + + def dump_lines( self, margin = 0, width = 60 ): + result = [] + nl = None + + for p in self.items: + if nl: + result.append( "" ) + + result.extend( p.dump_lines( margin, width ) ) + nl = 1 + + return result + + + +# this regular expression is used to detect field definitions +# +re_field = re.compile( r"\s*(\w*|\w(\w|\.)*\w)\s*::" ) + + + +class DocMarkup: + + def __init__( self, tag, lines ): + self.tag = string.lower( tag ) + self.fields = [] + + cur_lines = [] + field = None + mode = 0 + + for l in lines: + m = re_field.match( l ) + if m: + # we detected the start of a new field definition + + # first, save the current one + if cur_lines: + f = DocField( field, cur_lines ) + self.fields.append( f ) + cur_lines = [] + field = None + + field = m.group( 1 ) # record field name + ln = len( m.group( 0 ) ) + l = " " * ln + l[ln:] + cur_lines = [l] + else: + cur_lines.append( l ) + + if field or cur_lines: + f = DocField( field, cur_lines ) + self.fields.append( f ) + + def get_name( self ): + try: + return self.fields[0].items[0].words[0] + except: + return None + + def get_start( self ): + try: + result = "" + for word in self.fields[0].items[0].words: + result = result + " " + word + return result[1:] + except: + return "ERROR" + + def dump( self, margin ): + print " " * margin + "<" + self.tag + ">" + for f in self.fields: + f.dump( " " ) + print " " * margin + "</" + self.tag + ">" + + + +class DocChapter: + + def __init__( self, block ): + self.block = block + self.sections = [] + if block: + self.name = block.name + self.title = block.get_markup_words( "title" ) + self.order = block.get_markup_words( "sections" ) + else: + self.name = "Other" + self.title = string.split( "Miscellaneous" ) + self.order = [] + + + +class DocSection: + + def __init__( self, name = "Other" ): + self.name = name + self.blocks = {} + self.block_names = [] # ordered block names in section + self.defs = [] + self.abstract = "" + self.description = "" + self.order = [] + self.title = "ERROR" + self.chapter = None + + def add_def( self, block ): + self.defs.append( block ) + + def add_block( self, block ): + self.block_names.append( block.name ) + self.blocks[block.name] = block + + def process( self ): + # look up one block that contains a valid section description + for block in self.defs: + title = block.get_markup_text( "title" ) + if title: + self.title = title + self.abstract = block.get_markup_words( "abstract" ) + self.description = block.get_markup_items( "description" ) + self.order = block.get_markup_words( "order" ) + return + + def reorder( self ): + self.block_names = sort_order_list( self.block_names, self.order ) + + + +class ContentProcessor: + + def __init__( self ): + """initialize a block content processor""" + self.reset() + + self.sections = {} # dictionary of documentation sections + self.section = None # current documentation section + + self.chapters = [] # list of chapters + + self.headers = {} # dictionary of header macros + + def set_section( self, section_name ): + """set current section during parsing""" + if not self.sections.has_key( section_name ): + section = DocSection( section_name ) + self.sections[section_name] = section + self.section = section + else: + self.section = self.sections[section_name] + + def add_chapter( self, block ): + chapter = DocChapter( block ) + self.chapters.append( chapter ) + + + def reset( self ): + """reset the content processor for a new block""" + self.markups = [] + self.markup = None + self.markup_lines = [] + + def add_markup( self ): + """add a new markup section""" + if self.markup and self.markup_lines: + + # get rid of last line of markup if it's empty + marks = self.markup_lines + if len( marks ) > 0 and not string.strip( marks[-1] ): + self.markup_lines = marks[:-1] + + m = DocMarkup( self.markup, self.markup_lines ) + + self.markups.append( m ) + + self.markup = None + self.markup_lines = [] + + def process_content( self, content ): + """process a block content and return a list of DocMarkup objects + corresponding to it""" + markup = None + markup_lines = [] + first = 1 + + for line in content: + found = None + for t in re_markup_tags: + m = t.match( line ) + if m: + found = string.lower( m.group( 1 ) ) + prefix = len( m.group( 0 ) ) + line = " " * prefix + line[prefix:] # remove markup from line + break + + # is it the start of a new markup section ? + if found: + first = 0 + self.add_markup() # add current markup content + self.markup = found + if len( string.strip( line ) ) > 0: + self.markup_lines.append( line ) + elif first == 0: + self.markup_lines.append( line ) + + self.add_markup() + + return self.markups + + def parse_sources( self, source_processor ): + blocks = source_processor.blocks + count = len( blocks ) + + for n in range( count ): + source = blocks[n] + if source.content: + # this is a documentation comment, we need to catch + # all following normal blocks in the "follow" list + # + follow = [] + m = n + 1 + while m < count and not blocks[m].content: + follow.append( blocks[m] ) + m = m + 1 + + doc_block = DocBlock( source, follow, self ) + + def finish( self ): + # process all sections to extract their abstract, description + # and ordered list of items + # + for sec in self.sections.values(): + sec.process() + + # process chapters to check that all sections are correctly + # listed there + for chap in self.chapters: + for sec in chap.order: + if self.sections.has_key( sec ): + section = self.sections[sec] + section.chapter = chap + section.reorder() + chap.sections.append( section ) + else: + sys.stderr.write( "WARNING: chapter '" + \ + chap.name + "' in " + chap.block.location() + \ + " lists unknown section '" + sec + "'\n" ) + + # check that all sections are in a chapter + # + others = [] + for sec in self.sections.values(): + if not sec.chapter: + others.append( sec ) + + # create a new special chapter for all remaining sections + # when necessary + # + if others: + chap = DocChapter( None ) + chap.sections = others + self.chapters.append( chap ) + + + +class DocBlock: + + def __init__( self, source, follow, processor ): + processor.reset() + + self.source = source + self.code = [] + self.type = "ERRTYPE" + self.name = "ERRNAME" + self.section = processor.section + self.markups = processor.process_content( source.content ) + + # compute block type from first markup tag + try: + self.type = self.markups[0].tag + except: + pass + + # compute block name from first markup paragraph + try: + markup = self.markups[0] + para = markup.fields[0].items[0] + name = para.words[0] + m = re_identifier.match( name ) + if m: + name = m.group( 1 ) + self.name = name + except: + pass + + if self.type == "section": + # detect new section starts + processor.set_section( self.name ) + processor.section.add_def( self ) + elif self.type == "chapter": + # detect new chapter + processor.add_chapter( self ) + else: + processor.section.add_block( self ) + + # now, compute the source lines relevant to this documentation + # block. We keep normal comments in for obvious reasons (??) + source = [] + for b in follow: + if b.format: + break + for l in b.lines: + # collect header macro definitions + m = re_header_macro.match( l ) + if m: + processor.headers[m.group( 2 )] = m.group( 1 ); + + # we use "/* */" as a separator + if re_source_sep.match( l ): + break + source.append( l ) + + # now strip the leading and trailing empty lines from the sources + start = 0 + end = len( source ) - 1 + + while start < end and not string.strip( source[start] ): + start = start + 1 + + while start < end and not string.strip( source[end] ): + end = end - 1 + + if start == end: + self.code = [] + else: + self.code = source[start:end + 1] + + def location( self ): + return self.source.location() + + def get_markup( self, tag_name ): + """return the DocMarkup corresponding to a given tag in a block""" + for m in self.markups: + if m.tag == string.lower( tag_name ): + return m + return None + + def get_markup_name( self, tag_name ): + """return the name of a given primary markup in a block""" + try: + m = self.get_markup( tag_name ) + return m.get_name() + except: + return None + + def get_markup_words( self, tag_name ): + try: + m = self.get_markup( tag_name ) + return m.fields[0].items[0].words + except: + return [] + + def get_markup_text( self, tag_name ): + result = self.get_markup_words( tag_name ) + return string.join( result ) + + def get_markup_items( self, tag_name ): + try: + m = self.get_markup( tag_name ) + return m.fields[0].items + except: + return None + +# eof diff --git a/src/3rdparty/freetype/src/tools/docmaker/docbeauty.py b/src/3rdparty/freetype/src/tools/docmaker/docbeauty.py new file mode 100644 index 0000000000..3ddf4a94a1 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/docmaker/docbeauty.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python +# +# DocBeauty (c) 2003, 2004, 2008 David Turner <david@freetype.org> +# +# This program is used to beautify the documentation comments used +# in the FreeType 2 public headers. +# + +from sources import * +from content import * +from utils import * + +import utils + +import sys, os, time, string, getopt + + +content_processor = ContentProcessor() + + +def beautify_block( block ): + if block.content: + content_processor.reset() + + markups = content_processor.process_content( block.content ) + text = [] + first = 1 + + for markup in markups: + text.extend( markup.beautify( first ) ) + first = 0 + + # now beautify the documentation "borders" themselves + lines = [" /*************************************************************************"] + for l in text: + lines.append( " *" + l ) + lines.append( " */" ) + + block.lines = lines + + +def usage(): + print "\nDocBeauty 0.1 Usage information\n" + print " docbeauty [options] file1 [file2 ...]\n" + print "using the following options:\n" + print " -h : print this page" + print " -b : backup original files with the 'orig' extension" + print "" + print " --backup : same as -b" + + +def main( argv ): + """main program loop""" + + global output_dir + + try: + opts, args = getopt.getopt( sys.argv[1:], \ + "hb", \ + ["help", "backup"] ) + except getopt.GetoptError: + usage() + sys.exit( 2 ) + + if args == []: + usage() + sys.exit( 1 ) + + # process options + # + output_dir = None + do_backup = None + + for opt in opts: + if opt[0] in ( "-h", "--help" ): + usage() + sys.exit( 0 ) + + if opt[0] in ( "-b", "--backup" ): + do_backup = 1 + + # create context and processor + source_processor = SourceProcessor() + + # retrieve the list of files to process + file_list = make_file_list( args ) + for filename in file_list: + source_processor.parse_file( filename ) + + for block in source_processor.blocks: + beautify_block( block ) + + new_name = filename + ".new" + ok = None + + try: + file = open( new_name, "wt" ) + for block in source_processor.blocks: + for line in block.lines: + file.write( line ) + file.write( "\n" ) + file.close() + except: + ok = 0 + + +# if called from the command line +# +if __name__ == '__main__': + main( sys.argv ) + + +# eof diff --git a/src/3rdparty/freetype/src/tools/docmaker/docmaker.py b/src/3rdparty/freetype/src/tools/docmaker/docmaker.py new file mode 100644 index 0000000000..1d9de9fbff --- /dev/null +++ b/src/3rdparty/freetype/src/tools/docmaker/docmaker.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# +# DocMaker (c) 2002, 2004, 2008 David Turner <david@freetype.org> +# +# This program is a re-write of the original DocMaker took used +# to generate the API Reference of the FreeType font engine +# by converting in-source comments into structured HTML. +# +# This new version is capable of outputting XML data, as well +# as accepts more liberal formatting options. +# +# It also uses regular expression matching and substitution +# to speed things significantly. +# + +from sources import * +from content import * +from utils import * +from formatter import * +from tohtml import * + +import utils + +import sys, os, time, string, glob, getopt + + +def usage(): + print "\nDocMaker Usage information\n" + print " docmaker [options] file1 [file2 ...]\n" + print "using the following options:\n" + print " -h : print this page" + print " -t : set project title, as in '-t \"My Project\"'" + print " -o : set output directory, as in '-o mydir'" + print " -p : set documentation prefix, as in '-p ft2'" + print "" + print " --title : same as -t, as in '--title=\"My Project\"'" + print " --output : same as -o, as in '--output=mydir'" + print " --prefix : same as -p, as in '--prefix=ft2'" + + +def main( argv ): + """main program loop""" + + global output_dir + + try: + opts, args = getopt.getopt( sys.argv[1:], \ + "ht:o:p:", \ + ["help", "title=", "output=", "prefix="] ) + except getopt.GetoptError: + usage() + sys.exit( 2 ) + + if args == []: + usage() + sys.exit( 1 ) + + # process options + # + project_title = "Project" + project_prefix = None + output_dir = None + + for opt in opts: + if opt[0] in ( "-h", "--help" ): + usage() + sys.exit( 0 ) + + if opt[0] in ( "-t", "--title" ): + project_title = opt[1] + + if opt[0] in ( "-o", "--output" ): + utils.output_dir = opt[1] + + if opt[0] in ( "-p", "--prefix" ): + project_prefix = opt[1] + + check_output() + + # create context and processor + source_processor = SourceProcessor() + content_processor = ContentProcessor() + + # retrieve the list of files to process + file_list = make_file_list( args ) + for filename in file_list: + source_processor.parse_file( filename ) + content_processor.parse_sources( source_processor ) + + # process sections + content_processor.finish() + + formatter = HtmlFormatter( content_processor, project_title, project_prefix ) + + formatter.toc_dump() + formatter.index_dump() + formatter.section_dump_all() + + +# if called from the command line +# +if __name__ == '__main__': + main( sys.argv ) + + +# eof diff --git a/src/3rdparty/freetype/src/tools/docmaker/formatter.py b/src/3rdparty/freetype/src/tools/docmaker/formatter.py new file mode 100644 index 0000000000..f62ce676c1 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/docmaker/formatter.py @@ -0,0 +1,188 @@ +# Formatter (c) 2002, 2004, 2007, 2008 David Turner <david@freetype.org> +# + +from sources import * +from content import * +from utils import * + +# This is the base Formatter class. Its purpose is to convert +# a content processor's data into specific documents (i.e., table of +# contents, global index, and individual API reference indices). +# +# You need to sub-class it to output anything sensible. For example, +# the file tohtml.py contains the definition of the HtmlFormatter sub-class +# used to output -- you guessed it -- HTML. +# + +class Formatter: + + def __init__( self, processor ): + self.processor = processor + self.identifiers = {} + self.chapters = processor.chapters + self.sections = processor.sections.values() + self.block_index = [] + + # store all blocks in a dictionary + self.blocks = [] + for section in self.sections: + for block in section.blocks.values(): + self.add_identifier( block.name, block ) + + # add enumeration values to the index, since this is useful + for markup in block.markups: + if markup.tag == 'values': + for field in markup.fields: + self.add_identifier( field.name, block ) + + self.block_index = self.identifiers.keys() + self.block_index.sort( index_sort ) + + def add_identifier( self, name, block ): + if self.identifiers.has_key( name ): + # duplicate name! + sys.stderr.write( \ + "WARNING: duplicate definition for '" + name + "' in " + \ + block.location() + ", previous definition in " + \ + self.identifiers[name].location() + "\n" ) + else: + self.identifiers[name] = block + + # + # Formatting the table of contents + # + def toc_enter( self ): + pass + + def toc_chapter_enter( self, chapter ): + pass + + def toc_section_enter( self, section ): + pass + + def toc_section_exit( self, section ): + pass + + def toc_chapter_exit( self, chapter ): + pass + + def toc_index( self, index_filename ): + pass + + def toc_exit( self ): + pass + + def toc_dump( self, toc_filename = None, index_filename = None ): + output = None + if toc_filename: + output = open_output( toc_filename ) + + self.toc_enter() + + for chap in self.processor.chapters: + + self.toc_chapter_enter( chap ) + + for section in chap.sections: + self.toc_section_enter( section ) + self.toc_section_exit( section ) + + self.toc_chapter_exit( chap ) + + self.toc_index( index_filename ) + + self.toc_exit() + + if output: + close_output( output ) + + # + # Formatting the index + # + def index_enter( self ): + pass + + def index_name_enter( self, name ): + pass + + def index_name_exit( self, name ): + pass + + def index_exit( self ): + pass + + def index_dump( self, index_filename = None ): + output = None + if index_filename: + output = open_output( index_filename ) + + self.index_enter() + + for name in self.block_index: + self.index_name_enter( name ) + self.index_name_exit( name ) + + self.index_exit() + + if output: + close_output( output ) + + # + # Formatting a section + # + def section_enter( self, section ): + pass + + def block_enter( self, block ): + pass + + def markup_enter( self, markup, block = None ): + pass + + def field_enter( self, field, markup = None, block = None ): + pass + + def field_exit( self, field, markup = None, block = None ): + pass + + def markup_exit( self, markup, block = None ): + pass + + def block_exit( self, block ): + pass + + def section_exit( self, section ): + pass + + def section_dump( self, section, section_filename = None ): + output = None + if section_filename: + output = open_output( section_filename ) + + self.section_enter( section ) + + for name in section.block_names: + block = self.identifiers[name] + self.block_enter( block ) + + for markup in block.markups[1:]: # always ignore first markup! + self.markup_enter( markup, block ) + + for field in markup.fields: + self.field_enter( field, markup, block ) + self.field_exit( field, markup, block ) + + self.markup_exit( markup, block ) + + self.block_exit( block ) + + self.section_exit( section ) + + if output: + close_output( output ) + + def section_dump_all( self ): + for section in self.sections: + self.section_dump( section ) + +# eof diff --git a/src/3rdparty/freetype/src/tools/docmaker/sources.py b/src/3rdparty/freetype/src/tools/docmaker/sources.py new file mode 100644 index 0000000000..7b68c07019 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/docmaker/sources.py @@ -0,0 +1,347 @@ +# Sources (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009 +# David Turner <david@freetype.org> +# +# +# this file contains definitions of classes needed to decompose +# C sources files into a series of multi-line "blocks". There are +# two kinds of blocks: +# +# - normal blocks, which contain source code or ordinary comments +# +# - documentation blocks, which have restricted formatting, and +# whose text always start with a documentation markup tag like +# "<Function>", "<Type>", etc.. +# +# the routines used to process the content of documentation blocks +# are not contained here, but in "content.py" +# +# the classes and methods found here only deal with text parsing +# and basic documentation block extraction +# + +import fileinput, re, sys, os, string + + + +################################################################ +## +## BLOCK FORMAT PATTERN +## +## A simple class containing compiled regular expressions used +## to detect potential documentation format block comments within +## C source code +## +## note that the 'column' pattern must contain a group that will +## be used to "unbox" the content of documentation comment blocks +## +class SourceBlockFormat: + + def __init__( self, id, start, column, end ): + """create a block pattern, used to recognize special documentation blocks""" + self.id = id + self.start = re.compile( start, re.VERBOSE ) + self.column = re.compile( column, re.VERBOSE ) + self.end = re.compile( end, re.VERBOSE ) + + + +# +# format 1 documentation comment blocks look like the following: +# +# /************************************/ +# /* */ +# /* */ +# /* */ +# /************************************/ +# +# we define a few regular expressions here to detect them +# + +start = r''' + \s* # any number of whitespace + /\*{2,}/ # followed by '/' and at least two asterisks then '/' + \s*$ # probably followed by whitespace +''' + +column = r''' + \s* # any number of whitespace + /\*{1} # followed by '/' and precisely one asterisk + ([^*].*) # followed by anything (group 1) + \*{1}/ # followed by one asterisk and a '/' + \s*$ # probably followed by whitespace +''' + +re_source_block_format1 = SourceBlockFormat( 1, start, column, start ) + + +# +# format 2 documentation comment blocks look like the following: +# +# /************************************ (at least 2 asterisks) +# * +# * +# * +# * +# **/ (1 or more asterisks at the end) +# +# we define a few regular expressions here to detect them +# +start = r''' + \s* # any number of whitespace + /\*{2,} # followed by '/' and at least two asterisks + \s*$ # probably followed by whitespace +''' + +column = r''' + \s* # any number of whitespace + \*{1}(?!/) # followed by precisely one asterisk not followed by `/' + (.*) # then anything (group1) +''' + +end = r''' + \s* # any number of whitespace + \*+/ # followed by at least one asterisk, then '/' +''' + +re_source_block_format2 = SourceBlockFormat( 2, start, column, end ) + + +# +# the list of supported documentation block formats, we could add new ones +# relatively easily +# +re_source_block_formats = [re_source_block_format1, re_source_block_format2] + + +# +# the following regular expressions corresponds to markup tags +# within the documentation comment blocks. they're equivalent +# despite their different syntax +# +# notice how each markup tag _must_ begin a new line +# +re_markup_tag1 = re.compile( r'''\s*<(\w*)>''' ) # <xxxx> format +re_markup_tag2 = re.compile( r'''\s*@(\w*):''' ) # @xxxx: format + +# +# the list of supported markup tags, we could add new ones relatively +# easily +# +re_markup_tags = [re_markup_tag1, re_markup_tag2] + +# +# used to detect a cross-reference, after markup tags have been stripped +# +re_crossref = re.compile( r'@(\w*)(.*)' ) + +# +# used to detect italic and bold styles in paragraph text +# +re_italic = re.compile( r"_(\w(\w|')*)_(.*)" ) # _italic_ +re_bold = re.compile( r"\*(\w(\w|')*)\*(.*)" ) # *bold* + +# +# used to detect the end of commented source lines +# +re_source_sep = re.compile( r'\s*/\*\s*\*/' ) + +# +# used to perform cross-reference within source output +# +re_source_crossref = re.compile( r'(\W*)(\w*)' ) + +# +# a list of reserved source keywords +# +re_source_keywords = re.compile( '''\\b ( typedef | + struct | + enum | + union | + const | + char | + int | + short | + long | + void | + signed | + unsigned | + \#include | + \#define | + \#undef | + \#if | + \#ifdef | + \#ifndef | + \#else | + \#endif ) \\b''', re.VERBOSE ) + + +################################################################ +## +## SOURCE BLOCK CLASS +## +## A SourceProcessor is in charge of reading a C source file +## and decomposing it into a series of different "SourceBlocks". +## each one of these blocks can be made of the following data: +## +## - A documentation comment block that starts with "/**" and +## whose exact format will be discussed later +## +## - normal sources lines, including comments +## +## the important fields in a text block are the following ones: +## +## self.lines : a list of text lines for the corresponding block +## +## self.content : for documentation comment blocks only, this is the +## block content that has been "unboxed" from its +## decoration. This is None for all other blocks +## (i.e. sources or ordinary comments with no starting +## markup tag) +## +class SourceBlock: + + def __init__( self, processor, filename, lineno, lines ): + self.processor = processor + self.filename = filename + self.lineno = lineno + self.lines = lines[:] + self.format = processor.format + self.content = [] + + if self.format == None: + return + + words = [] + + # extract comment lines + lines = [] + + for line0 in self.lines: + m = self.format.column.match( line0 ) + if m: + lines.append( m.group( 1 ) ) + + # now, look for a markup tag + for l in lines: + l = string.strip( l ) + if len( l ) > 0: + for tag in re_markup_tags: + if tag.match( l ): + self.content = lines + return + + def location( self ): + return "(" + self.filename + ":" + repr( self.lineno ) + ")" + + # debugging only - not used in normal operations + def dump( self ): + if self.content: + print "{{{content start---" + for l in self.content: + print l + print "---content end}}}" + return + + fmt = "" + if self.format: + fmt = repr( self.format.id ) + " " + + for line in self.lines: + print line + + + +################################################################ +## +## SOURCE PROCESSOR CLASS +## +## The SourceProcessor is in charge of reading a C source file +## and decomposing it into a series of different "SourceBlock" +## objects. +## +## each one of these blocks can be made of the following data: +## +## - A documentation comment block that starts with "/**" and +## whose exact format will be discussed later +## +## - normal sources lines, include comments +## +## +class SourceProcessor: + + def __init__( self ): + """initialize a source processor""" + self.blocks = [] + self.filename = None + self.format = None + self.lines = [] + + def reset( self ): + """reset a block processor, clean all its blocks""" + self.blocks = [] + self.format = None + + def parse_file( self, filename ): + """parse a C source file, and add its blocks to the processor's list""" + self.reset() + + self.filename = filename + + fileinput.close() + self.format = None + self.lineno = 0 + self.lines = [] + + for line in fileinput.input( filename ): + # strip trailing newlines, important on Windows machines! + if line[-1] == '\012': + line = line[0:-1] + + if self.format == None: + self.process_normal_line( line ) + else: + if self.format.end.match( line ): + # that's a normal block end, add it to 'lines' and + # create a new block + self.lines.append( line ) + self.add_block_lines() + elif self.format.column.match( line ): + # that's a normal column line, add it to 'lines' + self.lines.append( line ) + else: + # humm.. this is an unexpected block end, + # create a new block, but don't process the line + self.add_block_lines() + + # we need to process the line again + self.process_normal_line( line ) + + # record the last lines + self.add_block_lines() + + def process_normal_line( self, line ): + """process a normal line and check whether it is the start of a new block""" + for f in re_source_block_formats: + if f.start.match( line ): + self.add_block_lines() + self.format = f + self.lineno = fileinput.filelineno() + + self.lines.append( line ) + + def add_block_lines( self ): + """add the current accumulated lines and create a new block""" + if self.lines != []: + block = SourceBlock( self, self.filename, self.lineno, self.lines ) + + self.blocks.append( block ) + self.format = None + self.lines = [] + + # debugging only, not used in normal operations + def dump( self ): + """print all blocks in a processor""" + for b in self.blocks: + b.dump() + +# eof diff --git a/src/3rdparty/freetype/src/tools/docmaker/tohtml.py b/src/3rdparty/freetype/src/tools/docmaker/tohtml.py new file mode 100644 index 0000000000..fffa120973 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/docmaker/tohtml.py @@ -0,0 +1,593 @@ +# ToHTML (c) 2002, 2003, 2005, 2006, 2007, 2008 +# David Turner <david@freetype.org> + +from sources import * +from content import * +from formatter import * + +import time + + +# The following defines the HTML header used by all generated pages. +html_header_1 = """\ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" +"http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>\ +""" + +html_header_2 = """\ + API Reference + + + +""" + +html_header_3 = """ + + + +
      [
      [Index][TOC]
      +

      \ +""" + +html_header_5t = """\ +">Index] + +

      \ +""" + +html_header_6 = """\ + API Reference

      +""" + + +# The HTML footer used by all generated pages. +html_footer = """\ + +\ +""" + +# The header and footer used for each section. +section_title_header = "

      " +section_title_footer = "

      " + +# The header and footer used for code segments. +code_header = '
      '
      +code_footer = '
      ' + +# Paragraph header and footer. +para_header = "

      " +para_footer = "

      " + +# Block header and footer. +block_header = '
      ' +block_footer_start = """\ +
      +
      + + +
      [Index][TOC]
      +""" + +# Description header/footer. +description_header = '
      ' +description_footer = "

      " + +# Marker header/inter/footer combination. +marker_header = '
      ' +marker_inter = "
      " +marker_footer = "
      " + +# Header location header/footer. +header_location_header = '
      ' +header_location_footer = "

      " + +# Source code extracts header/footer. +source_header = '
      \n'
      +source_footer = "\n

      " + +# Chapter header/inter/footer. +chapter_header = '

      ' +chapter_inter = '

      • ' +chapter_footer = '
      ' + +# Index footer. +index_footer_start = """\ +
      + +
      [TOC]
      +""" + +# TOC footer. +toc_footer_start = """\ +
      + + +
      [Index]
      +""" + + +# source language keyword coloration/styling +keyword_prefix = '' +keyword_suffix = '' + +section_synopsis_header = '

      Synopsis

      ' +section_synopsis_footer = '' + + +# Translate a single line of source to HTML. This will convert +# a "<" into "<.", ">" into ">.", etc. +def html_quote( line ): + result = string.replace( line, "&", "&" ) + result = string.replace( result, "<", "<" ) + result = string.replace( result, ">", ">" ) + return result + + +# same as 'html_quote', but ignores left and right brackets +def html_quote0( line ): + return string.replace( line, "&", "&" ) + + +def dump_html_code( lines, prefix = "" ): + # clean the last empty lines + l = len( self.lines ) + while l > 0 and string.strip( self.lines[l - 1] ) == "": + l = l - 1 + + # The code footer should be directly appended to the last code + # line to avoid an additional blank line. + print prefix + code_header, + for line in self.lines[0 : l + 1]: + print '\n' + prefix + html_quote( line ), + print prefix + code_footer, + + + +class HtmlFormatter( Formatter ): + + def __init__( self, processor, project_title, file_prefix ): + Formatter.__init__( self, processor ) + + global html_header_1, html_header_2, html_header_3 + global html_header_4, html_header_5, html_footer + + if file_prefix: + file_prefix = file_prefix + "-" + else: + file_prefix = "" + + self.headers = processor.headers + self.project_title = project_title + self.file_prefix = file_prefix + self.html_header = html_header_1 + project_title + \ + html_header_2 + \ + html_header_3 + file_prefix + "index.html" + \ + html_header_4 + file_prefix + "toc.html" + \ + html_header_5 + project_title + \ + html_header_6 + + self.html_index_header = html_header_1 + project_title + \ + html_header_2 + \ + html_header_3i + file_prefix + "toc.html" + \ + html_header_5 + project_title + \ + html_header_6 + + self.html_toc_header = html_header_1 + project_title + \ + html_header_2 + \ + html_header_3 + file_prefix + "index.html" + \ + html_header_5t + project_title + \ + html_header_6 + + self.html_footer = "
      generated on " + \ + time.asctime( time.localtime( time.time() ) ) + \ + "
      " + html_footer + + self.columns = 3 + + def make_section_url( self, section ): + return self.file_prefix + section.name + ".html" + + def make_block_url( self, block ): + return self.make_section_url( block.section ) + "#" + block.name + + def make_html_words( self, words ): + """ convert a series of simple words into some HTML text """ + line = "" + if words: + line = html_quote( words[0] ) + for w in words[1:]: + line = line + " " + html_quote( w ) + + return line + + def make_html_word( self, word ): + """analyze a simple word to detect cross-references and styling""" + # look for cross-references + m = re_crossref.match( word ) + if m: + try: + name = m.group( 1 ) + rest = m.group( 2 ) + block = self.identifiers[name] + url = self.make_block_url( block ) + return '' + name + '' + rest + except: + # we detected a cross-reference to an unknown item + sys.stderr.write( \ + "WARNING: undefined cross reference '" + name + "'.\n" ) + return '?' + name + '?' + rest + + # look for italics and bolds + m = re_italic.match( word ) + if m: + name = m.group( 1 ) + rest = m.group( 3 ) + return '' + name + '' + rest + + m = re_bold.match( word ) + if m: + name = m.group( 1 ) + rest = m.group( 3 ) + return '' + name + '' + rest + + return html_quote( word ) + + def make_html_para( self, words ): + """ convert words of a paragraph into tagged HTML text, handle xrefs """ + line = "" + if words: + line = self.make_html_word( words[0] ) + for word in words[1:]: + line = line + " " + self.make_html_word( word ) + # convert `...' quotations into real left and right single quotes + line = re.sub( r"(^|\W)`(.*?)'(\W|$)", \ + r'\1‘\2’\3', \ + line ) + # convert tilde into non-breakable space + line = string.replace( line, "~", " " ) + + return para_header + line + para_footer + + def make_html_code( self, lines ): + """ convert a code sequence to HTML """ + line = code_header + '\n' + for l in lines: + line = line + html_quote( l ) + '\n' + + return line + code_footer + + def make_html_items( self, items ): + """ convert a field's content into some valid HTML """ + lines = [] + for item in items: + if item.lines: + lines.append( self.make_html_code( item.lines ) ) + else: + lines.append( self.make_html_para( item.words ) ) + + return string.join( lines, '\n' ) + + def print_html_items( self, items ): + print self.make_html_items( items ) + + def print_html_field( self, field ): + if field.name: + print "
      " + field.name + "" + + print self.make_html_items( field.items ) + + if field.name: + print "
      " + + def html_source_quote( self, line, block_name = None ): + result = "" + while line: + m = re_source_crossref.match( line ) + if m: + name = m.group( 2 ) + prefix = html_quote( m.group( 1 ) ) + length = len( m.group( 0 ) ) + + if name == block_name: + # this is the current block name, if any + result = result + prefix + '' + name + '' + elif re_source_keywords.match( name ): + # this is a C keyword + result = result + prefix + keyword_prefix + name + keyword_suffix + elif self.identifiers.has_key( name ): + # this is a known identifier + block = self.identifiers[name] + result = result + prefix + '' + name + '' + else: + result = result + html_quote( line[:length] ) + + line = line[length:] + else: + result = result + html_quote( line ) + line = [] + + return result + + def print_html_field_list( self, fields ): + print "

      " + print "" + for field in fields: + if len( field.name ) > 22: + print "" + print "" + print "
      " + field.name + "
      " + else: + print "
      " + field.name + "" + + self.print_html_items( field.items ) + print "
      " + + def print_html_markup( self, markup ): + table_fields = [] + for field in markup.fields: + if field.name: + # we begin a new series of field or value definitions, we + # will record them in the 'table_fields' list before outputting + # all of them as a single table + # + table_fields.append( field ) + else: + if table_fields: + self.print_html_field_list( table_fields ) + table_fields = [] + + self.print_html_items( field.items ) + + if table_fields: + self.print_html_field_list( table_fields ) + + # + # Formatting the index + # + def index_enter( self ): + print self.html_index_header + self.index_items = {} + + def index_name_enter( self, name ): + block = self.identifiers[name] + url = self.make_block_url( block ) + self.index_items[name] = url + + def index_exit( self ): + # block_index already contains the sorted list of index names + count = len( self.block_index ) + rows = ( count + self.columns - 1 ) / self.columns + + print "" + for r in range( rows ): + line = "" + for c in range( self.columns ): + i = r + c * rows + if i < count: + bname = self.block_index[r + c * rows] + url = self.index_items[bname] + line = line + '' + else: + line = line + '' + line = line + "" + print line + + print "
      ' + bname + '
      " + + print index_footer_start + \ + self.file_prefix + "toc.html" + \ + index_footer_end + + print self.html_footer + + self.index_items = {} + + def index_dump( self, index_filename = None ): + if index_filename == None: + index_filename = self.file_prefix + "index.html" + + Formatter.index_dump( self, index_filename ) + + # + # Formatting the table of content + # + def toc_enter( self ): + print self.html_toc_header + print "

      Table of Contents

      " + + def toc_chapter_enter( self, chapter ): + print chapter_header + string.join( chapter.title ) + chapter_inter + print "" + + def toc_section_enter( self, section ): + print '" + + def toc_chapter_exit( self, chapter ): + print "
      ' + print '' + \ + section.title + '' + + print self.make_html_para( section.abstract ) + + def toc_section_exit( self, section ): + print "
      " + print chapter_footer + + def toc_index( self, index_filename ): + print chapter_header + \ + 'Global Index' + \ + chapter_inter + chapter_footer + + def toc_exit( self ): + print toc_footer_start + \ + self.file_prefix + "index.html" + \ + toc_footer_end + + print self.html_footer + + def toc_dump( self, toc_filename = None, index_filename = None ): + if toc_filename == None: + toc_filename = self.file_prefix + "toc.html" + + if index_filename == None: + index_filename = self.file_prefix + "index.html" + + Formatter.toc_dump( self, toc_filename, index_filename ) + + # + # Formatting sections + # + def section_enter( self, section ): + print self.html_header + + print section_title_header + print section.title + print section_title_footer + + maxwidth = 0 + for b in section.blocks.values(): + if len( b.name ) > maxwidth: + maxwidth = len( b.name ) + + width = 70 # XXX magic number + if maxwidth <> 0: + # print section synopsis + print section_synopsis_header + print "" + + columns = width / maxwidth + if columns < 1: + columns = 1 + + count = len( section.block_names ) + rows = ( count + columns - 1 ) / columns + + for r in range( rows ): + line = "" + for c in range( columns ): + i = r + c * rows + line = line + '' + line = line + "" + print line + + print "
      ' + if i < count: + name = section.block_names[i] + line = line + '' + name + '' + + line = line + '


      " + print section_synopsis_footer + + print description_header + print self.make_html_items( section.description ) + print description_footer + + def block_enter( self, block ): + print block_header + + # place html anchor if needed + if block.name: + print '

      ' + block.name + '

      ' + + # dump the block C source lines now + if block.code: + header = '' + for f in self.headers.keys(): + if block.source.filename.find( f ) >= 0: + header = self.headers[f] + ' (' + f + ')' + break; + +# if not header: +# sys.stderr.write( \ +# 'WARNING: No header macro for ' + block.source.filename + '.\n' ) + + if header: + print header_location_header + print 'Defined in ' + header + '.' + print header_location_footer + + print source_header + for l in block.code: + print self.html_source_quote( l, block.name ) + print source_footer + + def markup_enter( self, markup, block ): + if markup.tag == "description": + print description_header + else: + print marker_header + markup.tag + marker_inter + + self.print_html_markup( markup ) + + def markup_exit( self, markup, block ): + if markup.tag == "description": + print description_footer + else: + print marker_footer + + def block_exit( self, block ): + print block_footer_start + self.file_prefix + "index.html" + \ + block_footer_middle + self.file_prefix + "toc.html" + \ + block_footer_end + + def section_exit( self, section ): + print html_footer + + def section_dump_all( self ): + for section in self.sections: + self.section_dump( section, self.file_prefix + section.name + '.html' ) + +# eof diff --git a/src/3rdparty/freetype/src/tools/docmaker/utils.py b/src/3rdparty/freetype/src/tools/docmaker/utils.py new file mode 100644 index 0000000000..1d96658c7d --- /dev/null +++ b/src/3rdparty/freetype/src/tools/docmaker/utils.py @@ -0,0 +1,132 @@ +# Utils (c) 2002, 2004, 2007, 2008 David Turner +# + +import string, sys, os, glob + +# current output directory +# +output_dir = None + + +# This function is used to sort the index. It is a simple lexicographical +# sort, except that it places capital letters before lowercase ones. +# +def index_sort( s1, s2 ): + if not s1: + return -1 + + if not s2: + return 1 + + l1 = len( s1 ) + l2 = len( s2 ) + m1 = string.lower( s1 ) + m2 = string.lower( s2 ) + + for i in range( l1 ): + if i >= l2 or m1[i] > m2[i]: + return 1 + + if m1[i] < m2[i]: + return -1 + + if s1[i] < s2[i]: + return -1 + + if s1[i] > s2[i]: + return 1 + + if l2 > l1: + return -1 + + return 0 + + +# Sort input_list, placing the elements of order_list in front. +# +def sort_order_list( input_list, order_list ): + new_list = order_list[:] + for id in input_list: + if not id in order_list: + new_list.append( id ) + return new_list + + +# Open the standard output to a given project documentation file. Use +# "output_dir" to determine the filename location if necessary and save the +# old stdout in a tuple that is returned by this function. +# +def open_output( filename ): + global output_dir + + if output_dir and output_dir != "": + filename = output_dir + os.sep + filename + + old_stdout = sys.stdout + new_file = open( filename, "w" ) + sys.stdout = new_file + + return ( new_file, old_stdout ) + + +# Close the output that was returned by "close_output". +# +def close_output( output ): + output[0].close() + sys.stdout = output[1] + + +# Check output directory. +# +def check_output(): + global output_dir + if output_dir: + if output_dir != "": + if not os.path.isdir( output_dir ): + sys.stderr.write( "argument" + " '" + output_dir + "' " + \ + "is not a valid directory" ) + sys.exit( 2 ) + else: + output_dir = None + + +def file_exists( pathname ): + """checks that a given file exists""" + result = 1 + try: + file = open( pathname, "r" ) + file.close() + except: + result = None + sys.stderr.write( pathname + " couldn't be accessed\n" ) + + return result + + +def make_file_list( args = None ): + """builds a list of input files from command-line arguments""" + file_list = [] + # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' ) + + if not args: + args = sys.argv[1 :] + + for pathname in args: + if string.find( pathname, '*' ) >= 0: + newpath = glob.glob( pathname ) + newpath.sort() # sort files -- this is important because + # of the order of files + else: + newpath = [pathname] + + file_list.extend( newpath ) + + if len( file_list ) == 0: + file_list = None + else: + # now filter the file list to remove non-existing ones + file_list = filter( file_exists, file_list ) + + return file_list + +# eof diff --git a/src/3rdparty/freetype/src/tools/ftrandom/Makefile b/src/3rdparty/freetype/src/tools/ftrandom/Makefile new file mode 100644 index 0000000000..2e619299cd --- /dev/null +++ b/src/3rdparty/freetype/src/tools/ftrandom/Makefile @@ -0,0 +1,35 @@ +# TOP_DIR and OBJ_DIR should be set by the user to the right directories, +# if necessary. + +TOP_DIR ?= ../../.. +OBJ_DIR ?= $(TOP_DIR)/objs + + +# The setup below is for gcc on a Unix-like platform. + +SRC_DIR = $(TOP_DIR)/src/tools/ftrandom + +CC = gcc +WFLAGS = -Wmissing-prototypes \ + -Wunused \ + -Wimplicit \ + -Wreturn-type \ + -Wparentheses \ + -pedantic \ + -Wformat \ + -Wchar-subscripts \ + -Wsequence-point +CFLAGS = $(WFLAGS) \ + -g \ + -I $(TOP_DIR)/include +LIBS = -lm \ + -L $(OBJ_DIR) \ + -lfreetype \ + -lz + +all: $(OBJ_DIR)/ftrandom + +$(OBJ_DIR)/ftrandom: $(SRC_DIR)/ftrandom.c $(OBJ_DIR)/libfreetype.a + $(CC) -o $(OBJ_DIR)/ftrandom $(CFLAGS) $(SRC_DIR)/ftrandom.c $(LIBS) + +# EOF diff --git a/src/3rdparty/freetype/src/tools/ftrandom/README b/src/3rdparty/freetype/src/tools/ftrandom/README new file mode 100644 index 0000000000..c093f15e81 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/ftrandom/README @@ -0,0 +1,48 @@ +ftrandom +-------- + +This program expects a set of directories containing good fonts, and a set +of extensions of fonts to be tested. It will randomly pick a font, copy it, +introduce and error and then test it. + +The FreeType tests are quite basic: + + For each erroneous font it + forks off a new tester; + initializes the library; + opens each font in the file; + loads each glyph; + (optionally reviewing the contours of the glyph) + (optionally rasterizing) + closes the face. + +If the tester exits with a signal, or takes longer than 20 seconds then +ftrandom saves the erroneous font and continues. If the tester exits +normally or with an error, then the superstructure removes the test font and +continues. + +Arguments are: + + --all Test every font in the directory(ies) no matter + what its extension (some CID-keyed fonts have no + extension). + --check-outlines Call FT_Outline_Decompose on each glyph. + --dir Append to the list of directories to search + for good fonts. + --error-count Introduce single-byte errors into the + erroneous fonts. + --error-fraction Multiply the file size of the font by and + introduce that many errors into the erroneous + font file. + --ext Add to the set of font types tested. Known + extensions are `ttf', `otf', `ttc', `cid', `pfb', + `pfa', `bdf', `pcf', `pfr', `fon', `otb', and + `cff'. + --help Print out this list of options. + --nohints Specify FT_LOAD_NO_HINTING when loading glyphs. + --rasterize Call FT_Render_Glyph as well as loading it. + --result This is the directory in which test files are + placed. + --test Run a single test on a pre-generated testcase. + Done in the current process so it can be debugged + more easily. diff --git a/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c b/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c new file mode 100644 index 0000000000..4daac0dc1d --- /dev/null +++ b/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c @@ -0,0 +1,659 @@ +/* Copyright (C) 2005, 2007, 2008 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* modified by Werner Lemberg */ +/* This file is now part of the FreeType library */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include FT_OUTLINE_H + +#define true 1 +#define false 0 +#define forever for (;;) + + + static int check_outlines = false; + static int nohints = false; + static int rasterize = false; + static char* results_dir = "results"; + +#define GOOD_FONTS_DIR "/home/wl/freetype-testfonts" + + static char* default_dir_list[] = + { + GOOD_FONTS_DIR, + NULL + }; + + static char* default_ext_list[] = + { + "ttf", + "otf", + "ttc", + "cid", + "pfb", + "pfa", + "bdf", + "pcf", + "pfr", + "fon", + "otb", + "cff", + NULL + }; + + static int error_count = 1; + static int error_fraction = 0; + + static FT_F26Dot6 font_size = 12 * 64; + + static struct fontlist + { + char* name; + int len; + unsigned int isbinary: 1; + unsigned int isascii: 1; + unsigned int ishex: 1; + + } *fontlist; + + static int fcnt; + + + static int + FT_MoveTo( const FT_Vector *to, + void *user ) + { + return 0; + } + + + static int + FT_LineTo( const FT_Vector *to, + void *user ) + { + return 0; + } + + + static int + FT_ConicTo( const FT_Vector *_cp, + const FT_Vector *to, + void *user ) + { + return 0; + } + + + static int + FT_CubicTo( const FT_Vector *cp1, + const FT_Vector *cp2, + const FT_Vector *to, + void *user ) + { + return 0; + } + + + static FT_Outline_Funcs outlinefuncs = + { + FT_MoveTo, + FT_LineTo, + FT_ConicTo, + FT_CubicTo, + 0, 0 /* No shift, no delta */ + }; + + + static void + TestFace( FT_Face face ) + { + int gid; + int load_flags = FT_LOAD_DEFAULT; + + + if ( check_outlines && + FT_IS_SCALABLE( face ) ) + load_flags = FT_LOAD_NO_BITMAP; + + if ( nohints ) + load_flags |= FT_LOAD_NO_HINTING; + + FT_Set_Char_Size( face, 0, font_size, 72, 72 ); + + for ( gid = 0; gid < face->num_glyphs; ++gid ) + { + if ( check_outlines && + FT_IS_SCALABLE( face ) ) + { + if ( !FT_Load_Glyph( face, gid, load_flags ) ) + FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL ); + } + else + FT_Load_Glyph( face, gid, load_flags ); + + if ( rasterize ) + FT_Render_Glyph( face->glyph, ft_render_mode_normal ); + } + + FT_Done_Face( face ); + } + + + static void + ExecuteTest( char* testfont ) + { + FT_Library context; + FT_Face face; + int i, num; + + + if ( FT_Init_FreeType( &context ) ) + { + fprintf( stderr, "Can't initialize FreeType.\n" ); + exit( 1 ); + } + + if ( FT_New_Face( context, testfont, 0, &face ) ) + { + /* The font is erroneous, so if this fails that's ok. */ + exit( 0 ); + } + + if ( face->num_faces == 1 ) + TestFace( face ); + else + { + num = face->num_faces; + FT_Done_Face( face ); + + for ( i = 0; i < num; ++i ) + { + if ( !FT_New_Face( context, testfont, i, &face ) ) + TestFace( face ); + } + } + + exit( 0 ); + } + + + static int + extmatch( char* filename, + char** extensions ) + { + int i; + char* pt; + + + if ( extensions == NULL ) + return true; + + pt = strrchr( filename, '.' ); + if ( pt == NULL ) + return false; + if ( pt < strrchr( filename, '/' ) ) + return false; + + for ( i = 0; extensions[i] != NULL; ++i ) + if ( strcasecmp( pt + 1, extensions[i] ) == 0 || + strcasecmp( pt, extensions[i] ) == 0 ) + return true; + + return false; + } + + + static void + figurefiletype( struct fontlist* item ) + { + FILE* foo; + + + item->isbinary = item->isascii = item->ishex = false; + + foo = fopen( item->name, "rb" ); + if ( foo != NULL ) + { + /* Try to guess the file type from the first few characters... */ + int ch1 = getc( foo ); + int ch2 = getc( foo ); + int ch3 = getc( foo ); + int ch4 = getc( foo ); + + + fclose( foo ); + + if ( ( ch1 == 0 && ch2 == 1 && ch3 == 0 && ch4 == 0 ) || + ( ch1 == 'O' && ch2 == 'T' && ch3 == 'T' && ch4 == 'O' ) || + ( ch1 == 't' && ch2 == 'r' && ch3 == 'u' && ch4 == 'e' ) || + ( ch1 == 't' && ch2 == 't' && ch3 == 'c' && ch4 == 'f' ) ) + { + /* ttf, otf, ttc files */ + item->isbinary = true; + } + else if ( ch1 == 0x80 && ch2 == '\01' ) + { + /* PFB header */ + item->isbinary = true; + } + else if ( ch1 == '%' && ch2 == '!' ) + { + /* Random PostScript */ + if ( strstr( item->name, ".pfa" ) != NULL || + strstr( item->name, ".PFA" ) != NULL ) + item->ishex = true; + else + item->isascii = true; + } + else if ( ch1 == 1 && ch2 == 0 && ch3 == 4 ) + { + /* Bare CFF */ + item->isbinary = true; + } + else if ( ch1 == 'S' && ch2 == 'T' && ch3 == 'A' && ch4 == 'R' ) + { + /* BDF */ + item->ishex = true; + } + else if ( ch1 == 'P' && ch2 == 'F' && ch3 == 'R' && ch4 == '0' ) + { + /* PFR */ + item->isbinary = true; + } + else if ( ( ch1 == '\1' && ch2 == 'f' && ch3 == 'c' && ch4 == 'p' ) || + ( ch1 == 'M' && ch2 == 'Z' ) ) + { + /* Windows FON */ + item->isbinary = true; + } + else + { + fprintf( stderr, + "Can't recognize file type of `%s', assuming binary\n", + item->name ); + item->isbinary = true; + } + } + else + { + fprintf( stderr, "Can't open `%s' for typing the file.\n", + item->name ); + item->isbinary = true; + } + } + + + static void + FindFonts( char** fontdirs, + char** extensions ) + { + DIR* examples; + struct dirent* ent; + + int i, max; + char buffer[1025]; + struct stat statb; + + + max = 0; + fcnt = 0; + + for ( i = 0; fontdirs[i] != NULL; ++i ) + { + examples = opendir( fontdirs[i] ); + if ( examples == NULL ) + { + fprintf( stderr, + "Can't open example font directory `%s'\n", + fontdirs[i] ); + exit( 1 ); + } + + while ( ( ent = readdir( examples ) ) != NULL ) + { + snprintf( buffer, sizeof ( buffer ), + "%s/%s", fontdirs[i], ent->d_name ); + if ( stat( buffer, &statb ) == -1 || S_ISDIR( statb.st_mode ) ) + continue; + if ( extensions == NULL || extmatch( buffer, extensions ) ) + { + if ( fcnt >= max ) + { + max += 100; + fontlist = realloc( fontlist, max * sizeof ( struct fontlist ) ); + if ( fontlist == NULL ) + { + fprintf( stderr, "Can't allocate memory\n" ); + exit( 1 ); + } + } + + fontlist[fcnt].name = strdup( buffer ); + fontlist[fcnt].len = statb.st_size; + + figurefiletype( &fontlist[fcnt] ); + ++fcnt; + } + } + + closedir( examples ); + } + + if ( fcnt == 0 ) + { + fprintf( stderr, "Can't find matching font files.\n" ); + exit( 1 ); + } + + fontlist[fcnt].name = NULL; + } + + + static int + getErrorCnt( struct fontlist* item ) + { + if ( error_count == 0 && error_fraction == 0 ) + return 0; + + return error_count + ceil( error_fraction * item->len ); + } + + + static int + getRandom( int low, + int high ) + { + if ( low - high < 0x10000L ) + return low + ( ( random() >> 8 ) % ( high + 1 - low ) ); + + return low + ( random() % ( high + 1 - low ) ); + } + + + static int + copyfont( struct fontlist* item, + char* newfont ) + { + static char buffer[8096]; + FILE *good, *new; + int len; + int i, err_cnt; + + + good = fopen( item->name, "r" ); + if ( good == NULL ) + { + fprintf( stderr, "Can't open `%s'\n", item->name ); + return false; + } + + new = fopen( newfont, "w+" ); + if ( new == NULL ) + { + fprintf( stderr, "Can't create temporary output file `%s'\n", + newfont ); + exit( 1 ); + } + + while ( ( len = fread( buffer, 1, sizeof ( buffer ), good ) ) > 0 ) + fwrite( buffer, 1, len, new ); + + fclose( good ); + + err_cnt = getErrorCnt( item ); + for ( i = 0; i < err_cnt; ++i ) + { + fseek( new, getRandom( 0, item->len - 1 ), SEEK_SET ); + + if ( item->isbinary ) + putc( getRandom( 0, 0xff ), new ); + else if ( item->isascii ) + putc( getRandom( 0x20, 0x7e ), new ); + else + { + int hex = getRandom( 0, 15 ); + + + if ( hex < 10 ) + hex += '0'; + else + hex += 'A' - 10; + + putc( hex, new ); + } + } + + if ( ferror( new ) ) + { + fclose( new ); + unlink( newfont ); + return false; + } + + fclose( new ); + + return true; + } + + + static int child_pid; + + static void + abort_test( int sig ) + { + /* If a time-out happens, then kill the child */ + kill( child_pid, SIGFPE ); + write( 2, "Timeout... ", 11 ); + } + + + static void + do_test( void ) + { + int i = getRandom( 0, fcnt - 1 ); + static int test_num = 0; + char buffer[1024]; + + + sprintf( buffer, "%s/test%d", results_dir, test_num++ ); + + if ( copyfont ( &fontlist[i], buffer ) ) + { + signal( SIGALRM, abort_test ); + /* Anything that takes more than 20 seconds */ + /* to parse and/or rasterize is an error. */ + alarm( 20 ); + if ( ( child_pid = fork() ) == 0 ) + ExecuteTest( buffer ); + else if ( child_pid != -1 ) + { + int status; + + + waitpid( child_pid, &status, 0 ); + alarm( 0 ); + if ( WIFSIGNALED ( status ) ) + printf( "Error found in file `%s'\n", buffer ); + else + unlink( buffer ); + } + else + { + fprintf( stderr, "Can't fork test case.\n" ); + exit( 1 ); + } + alarm( 0 ); + } + } + + + static void + usage( FILE* out, + char* name ) + { + fprintf( out, "%s [options] -- Generate random erroneous fonts\n" + " and attempt to parse them with FreeType.\n\n", name ); + + fprintf( out, " --all All non-directory files are assumed to be fonts.\n" ); + fprintf( out, " --check-outlines Make sure we can parse the outlines of each glyph.\n" ); + fprintf( out, " --dir Append to list of font search directories.\n" ); + fprintf( out, " --error-count Introduce single byte errors into each font.\n" ); + fprintf( out, " --error-fraction Introduce *filesize single byte errors\n" + " into each font.\n" ); + fprintf( out, " --ext Add to list of extensions indicating fonts.\n" ); + fprintf( out, " --help Print this.\n" ); + fprintf( out, " --nohints Turn off hinting.\n" ); + fprintf( out, " --rasterize Attempt to rasterize each glyph.\n" ); + fprintf( out, " --results Directory in which to place the test fonts.\n" ); + fprintf( out, " --size Use the given font size for the tests.\n" ); + fprintf( out, " --test Run a single test on an already existing file.\n" ); + } + + + int + main( int argc, + char** argv ) + { + char **dirs, **exts; + char *pt, *end; + int dcnt = 0, ecnt = 0, rset = false, allexts = false; + int i; + time_t now; + char* testfile = NULL; + + + dirs = calloc( argc + 1, sizeof ( char ** ) ); + exts = calloc( argc + 1, sizeof ( char ** ) ); + + for ( i = 1; i < argc; ++i ) + { + pt = argv[i]; + if ( pt[0] == '-' && pt[1] == '-' ) + ++pt; + + if ( strcmp( pt, "-all" ) == 0 ) + allexts = true; + else if ( strcmp( pt, "-check-outlines" ) == 0 ) + check_outlines = true; + else if ( strcmp( pt, "-dir" ) == 0 ) + dirs[dcnt++] = argv[++i]; + else if ( strcmp( pt, "-error-count" ) == 0 ) + { + if ( !rset ) + error_fraction = 0; + rset = true; + error_count = strtol( argv[++i], &end, 10 ); + if ( *end != '\0' ) + { + fprintf( stderr, "Bad value for error-count: %s\n", argv[i] ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-error-fraction" ) == 0 ) + { + if ( !rset ) + error_count = 0; + rset = true; + error_fraction = strtod( argv[++i], &end ); + if ( *end != '\0' ) + { + fprintf( stderr, "Bad value for error-fraction: %s\n", argv[i] ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-ext" ) == 0 ) + exts[ecnt++] = argv[++i]; + else if ( strcmp( pt, "-help" ) == 0 ) + { + usage( stdout, argv[0] ); + exit( 0 ); + } + else if ( strcmp( pt, "-nohints" ) == 0 ) + nohints = true; + else if ( strcmp( pt, "-rasterize" ) == 0 ) + rasterize = true; + else if ( strcmp( pt, "-results" ) == 0 ) + results_dir = argv[++i]; + else if ( strcmp( pt, "-size" ) == 0 ) + { + font_size = (FT_F26Dot6)( strtod( argv[++i], &end ) * 64 ); + if ( *end != '\0' || font_size < 64 ) + { + fprintf( stderr, "Bad value for size: %s\n", argv[i] ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-test" ) == 0 ) + testfile = argv[++i]; + else + { + usage( stderr, argv[0] ); + exit( 1 ); + } + } + + if ( allexts ) + exts = NULL; + else if ( ecnt == 0 ) + exts = default_ext_list; + + if ( dcnt == 0 ) + dirs = default_dir_list; + + if ( testfile != NULL ) + ExecuteTest( testfile ); /* This should never return */ + + time( &now ); + srandom( now ); + + FindFonts( dirs, exts ); + mkdir( results_dir, 0755 ); + + forever + do_test(); + + return 0; + } + + +/* EOF */ diff --git a/src/3rdparty/freetype/src/tools/glnames.py b/src/3rdparty/freetype/src/tools/glnames.py new file mode 100644 index 0000000000..55573b22fe --- /dev/null +++ b/src/3rdparty/freetype/src/tools/glnames.py @@ -0,0 +1,5287 @@ +#!/usr/bin/env python +# + +# +# FreeType 2 glyph name builder +# + + +# Copyright 1996-2000, 2003, 2005, 2007, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +"""\ + +usage: %s + + This python script generates the glyph names tables defined in the + `psnames' module. + + Its single argument is the name of the header file to be created. +""" + + +import sys, string, struct, re, os.path + + +# This table lists the glyphs according to the Macintosh specification. +# It is used by the TrueType Postscript names table. +# +# See +# +# http://fonts.apple.com/TTRefMan/RM06/Chap6post.html +# +# for the official list. +# +mac_standard_names = \ +[ + # 0 + ".notdef", ".null", "nonmarkingreturn", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + + # 10 + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + + # 20 + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + + # 30 + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + + # 40 + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + + # 50 + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + + # 60 + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + + # 70 + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + + # 80 + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + + # 90 + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + + # 100 + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + + # 110 + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + + # 120 + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + + # 130 + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + + # 140 + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + + # 150 + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + + # 160 + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + + # 170 + "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + + # 180 + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + + # 190 + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", + "Acircumflex", + + # 200 + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + + # 210 + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + + # 220 + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + + # 230 + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + + # 240 + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + + # 250 + "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dcroat" +] + + +# The list of standard `SID' glyph names. For the official list, +# see Annex A of document at +# +# http://partners.adobe.com/asn/developer/pdfs/tn/5176.CFF.pdf. +# +sid_standard_names = \ +[ + # 0 + ".notdef", "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quoteright", "parenleft", + + # 10 + "parenright", "asterisk", "plus", "comma", "hyphen", + "period", "slash", "zero", "one", "two", + + # 20 + "three", "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", "less", + + # 30 + "equal", "greater", "question", "at", "A", + "B", "C", "D", "E", "F", + + # 40 + "G", "H", "I", "J", "K", + "L", "M", "N", "O", "P", + + # 50 + "Q", "R", "S", "T", "U", + "V", "W", "X", "Y", "Z", + + # 60 + "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", + "quoteleft", "a", "b", "c", "d", + + # 70 + "e", "f", "g", "h", "i", + "j", "k", "l", "m", "n", + + # 80 + "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", + + # 90 + "y", "z", "braceleft", "bar", "braceright", + "asciitilde", "exclamdown", "cent", "sterling", "fraction", + + # 100 + "yen", "florin", "section", "currency", "quotesingle", + "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", + + # 110 + "fl", "endash", "dagger", "daggerdbl", "periodcentered", + "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", + + # 120 + "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", + "acute", "circumflex", "tilde", "macron", "breve", + + # 130 + "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", + "ogonek", "caron", "emdash", "AE", "ordfeminine", + + # 140 + "Lslash", "Oslash", "OE", "ordmasculine", "ae", + "dotlessi", "lslash", "oslash", "oe", "germandbls", + + # 150 + "onesuperior", "logicalnot", "mu", "trademark", "Eth", + "onehalf", "plusminus", "Thorn", "onequarter", "divide", + + # 160 + "brokenbar", "degree", "thorn", "threequarters", "twosuperior", + "registered", "minus", "eth", "multiply", "threesuperior", + + # 170 + "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", + "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", + + # 180 + "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", + "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", + + # 190 + "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", + "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", + + # 200 + "aacute", "acircumflex", "adieresis", "agrave", "aring", + "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", + + # 210 + "egrave", "iacute", "icircumflex", "idieresis", "igrave", + "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", + + # 220 + "otilde", "scaron", "uacute", "ucircumflex", "udieresis", + "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", + + # 230 + "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", + "Acutesmall", + "parenleftsuperior", "parenrightsuperior", "twodotenleader", + "onedotenleader", "zerooldstyle", + + # 240 + "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", + "commasuperior", + + # 250 + "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", + "bsuperior", + "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", + + # 260 + "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", + "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", + + # 270 + "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", + "Asmall", + "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", + + # 280 + "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", + "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", + + # 290 + "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", + "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", + + # 300 + "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", + "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", + "Dieresissmall", + + # 310 + "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", + "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", + "questiondownsmall", + + # 320 + "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", + "twothirds", "zerosuperior", "foursuperior", "fivesuperior", + "sixsuperior", + + # 330 + "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", + "oneinferior", + "twoinferior", "threeinferior", "fourinferior", "fiveinferior", + "sixinferior", + + # 340 + "seveninferior", "eightinferior", "nineinferior", "centinferior", + "dollarinferior", + "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", + "Acircumflexsmall", + + # 350 + "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", + "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", + "Igravesmall", + + # 360 + "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", + "Ntildesmall", + "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", + "Odieresissmall", + + # 370 + "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", + "001.000", + + # 380 + "001.001", "001.002", "001.003", "Black", "Bold", + "Book", "Light", "Medium", "Regular", "Roman", + + # 390 + "Semibold" +] + + +# This table maps character codes of the Adobe Standard Type 1 +# encoding to glyph indices in the sid_standard_names table. +# +t1_standard_encoding = \ +[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 115, 116, 117, 118, 119, 120, 121, 122, + 0, 123, 0, 124, 125, 126, 127, 128, 129, 130, + + 131, 0, 132, 133, 0, 134, 135, 136, 137, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 138, 0, 139, 0, 0, + 0, 0, 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, 146, 147, + + 148, 149, 0, 0, 0, 0 +] + + +# This table maps character codes of the Adobe Expert Type 1 +# encoding to glyph indices in the sid_standard_names table. +# +t1_expert_encoding = \ +[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 229, 230, 0, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, 239, 240, + + 241, 242, 243, 244, 245, 246, 247, 248, 27, 28, + 249, 250, 251, 252, 0, 253, 254, 255, 256, 257, + 0, 0, 0, 258, 0, 0, 259, 260, 261, 262, + 0, 0, 263, 264, 265, 0, 266, 109, 110, 267, + 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, + + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 304, 305, 306, 0, 0, 307, 308, 309, 310, + 311, 0, 312, 0, 0, 313, 0, 0, 314, 315, + 0, 0, 316, 317, 318, 0, 0, 0, 158, 155, + 163, 319, 320, 321, 322, 323, 324, 325, 0, 0, + + 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + + 373, 374, 375, 376, 377, 378 +] + + +# This data has been taken literally from the file `glyphlist.txt', +# version 2.0, 22 Sept 2002. It is available from +# +# http://partners.adobe.com/asn/developer/typeforum/unicodegn.html +# http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt +# +adobe_glyph_list = """\ +A;0041 +AE;00C6 +AEacute;01FC +AEmacron;01E2 +AEsmall;F7E6 +Aacute;00C1 +Aacutesmall;F7E1 +Abreve;0102 +Abreveacute;1EAE +Abrevecyrillic;04D0 +Abrevedotbelow;1EB6 +Abrevegrave;1EB0 +Abrevehookabove;1EB2 +Abrevetilde;1EB4 +Acaron;01CD +Acircle;24B6 +Acircumflex;00C2 +Acircumflexacute;1EA4 +Acircumflexdotbelow;1EAC +Acircumflexgrave;1EA6 +Acircumflexhookabove;1EA8 +Acircumflexsmall;F7E2 +Acircumflextilde;1EAA +Acute;F6C9 +Acutesmall;F7B4 +Acyrillic;0410 +Adblgrave;0200 +Adieresis;00C4 +Adieresiscyrillic;04D2 +Adieresismacron;01DE +Adieresissmall;F7E4 +Adotbelow;1EA0 +Adotmacron;01E0 +Agrave;00C0 +Agravesmall;F7E0 +Ahookabove;1EA2 +Aiecyrillic;04D4 +Ainvertedbreve;0202 +Alpha;0391 +Alphatonos;0386 +Amacron;0100 +Amonospace;FF21 +Aogonek;0104 +Aring;00C5 +Aringacute;01FA +Aringbelow;1E00 +Aringsmall;F7E5 +Asmall;F761 +Atilde;00C3 +Atildesmall;F7E3 +Aybarmenian;0531 +B;0042 +Bcircle;24B7 +Bdotaccent;1E02 +Bdotbelow;1E04 +Becyrillic;0411 +Benarmenian;0532 +Beta;0392 +Bhook;0181 +Blinebelow;1E06 +Bmonospace;FF22 +Brevesmall;F6F4 +Bsmall;F762 +Btopbar;0182 +C;0043 +Caarmenian;053E +Cacute;0106 +Caron;F6CA +Caronsmall;F6F5 +Ccaron;010C +Ccedilla;00C7 +Ccedillaacute;1E08 +Ccedillasmall;F7E7 +Ccircle;24B8 +Ccircumflex;0108 +Cdot;010A +Cdotaccent;010A +Cedillasmall;F7B8 +Chaarmenian;0549 +Cheabkhasiancyrillic;04BC +Checyrillic;0427 +Chedescenderabkhasiancyrillic;04BE +Chedescendercyrillic;04B6 +Chedieresiscyrillic;04F4 +Cheharmenian;0543 +Chekhakassiancyrillic;04CB +Cheverticalstrokecyrillic;04B8 +Chi;03A7 +Chook;0187 +Circumflexsmall;F6F6 +Cmonospace;FF23 +Coarmenian;0551 +Csmall;F763 +D;0044 +DZ;01F1 +DZcaron;01C4 +Daarmenian;0534 +Dafrican;0189 +Dcaron;010E +Dcedilla;1E10 +Dcircle;24B9 +Dcircumflexbelow;1E12 +Dcroat;0110 +Ddotaccent;1E0A +Ddotbelow;1E0C +Decyrillic;0414 +Deicoptic;03EE +Delta;2206 +Deltagreek;0394 +Dhook;018A +Dieresis;F6CB +DieresisAcute;F6CC +DieresisGrave;F6CD +Dieresissmall;F7A8 +Digammagreek;03DC +Djecyrillic;0402 +Dlinebelow;1E0E +Dmonospace;FF24 +Dotaccentsmall;F6F7 +Dslash;0110 +Dsmall;F764 +Dtopbar;018B +Dz;01F2 +Dzcaron;01C5 +Dzeabkhasiancyrillic;04E0 +Dzecyrillic;0405 +Dzhecyrillic;040F +E;0045 +Eacute;00C9 +Eacutesmall;F7E9 +Ebreve;0114 +Ecaron;011A +Ecedillabreve;1E1C +Echarmenian;0535 +Ecircle;24BA +Ecircumflex;00CA +Ecircumflexacute;1EBE +Ecircumflexbelow;1E18 +Ecircumflexdotbelow;1EC6 +Ecircumflexgrave;1EC0 +Ecircumflexhookabove;1EC2 +Ecircumflexsmall;F7EA +Ecircumflextilde;1EC4 +Ecyrillic;0404 +Edblgrave;0204 +Edieresis;00CB +Edieresissmall;F7EB +Edot;0116 +Edotaccent;0116 +Edotbelow;1EB8 +Efcyrillic;0424 +Egrave;00C8 +Egravesmall;F7E8 +Eharmenian;0537 +Ehookabove;1EBA +Eightroman;2167 +Einvertedbreve;0206 +Eiotifiedcyrillic;0464 +Elcyrillic;041B +Elevenroman;216A +Emacron;0112 +Emacronacute;1E16 +Emacrongrave;1E14 +Emcyrillic;041C +Emonospace;FF25 +Encyrillic;041D +Endescendercyrillic;04A2 +Eng;014A +Enghecyrillic;04A4 +Enhookcyrillic;04C7 +Eogonek;0118 +Eopen;0190 +Epsilon;0395 +Epsilontonos;0388 +Ercyrillic;0420 +Ereversed;018E +Ereversedcyrillic;042D +Escyrillic;0421 +Esdescendercyrillic;04AA +Esh;01A9 +Esmall;F765 +Eta;0397 +Etarmenian;0538 +Etatonos;0389 +Eth;00D0 +Ethsmall;F7F0 +Etilde;1EBC +Etildebelow;1E1A +Euro;20AC +Ezh;01B7 +Ezhcaron;01EE +Ezhreversed;01B8 +F;0046 +Fcircle;24BB +Fdotaccent;1E1E +Feharmenian;0556 +Feicoptic;03E4 +Fhook;0191 +Fitacyrillic;0472 +Fiveroman;2164 +Fmonospace;FF26 +Fourroman;2163 +Fsmall;F766 +G;0047 +GBsquare;3387 +Gacute;01F4 +Gamma;0393 +Gammaafrican;0194 +Gangiacoptic;03EA +Gbreve;011E +Gcaron;01E6 +Gcedilla;0122 +Gcircle;24BC +Gcircumflex;011C +Gcommaaccent;0122 +Gdot;0120 +Gdotaccent;0120 +Gecyrillic;0413 +Ghadarmenian;0542 +Ghemiddlehookcyrillic;0494 +Ghestrokecyrillic;0492 +Gheupturncyrillic;0490 +Ghook;0193 +Gimarmenian;0533 +Gjecyrillic;0403 +Gmacron;1E20 +Gmonospace;FF27 +Grave;F6CE +Gravesmall;F760 +Gsmall;F767 +Gsmallhook;029B +Gstroke;01E4 +H;0048 +H18533;25CF +H18543;25AA +H18551;25AB +H22073;25A1 +HPsquare;33CB +Haabkhasiancyrillic;04A8 +Hadescendercyrillic;04B2 +Hardsigncyrillic;042A +Hbar;0126 +Hbrevebelow;1E2A +Hcedilla;1E28 +Hcircle;24BD +Hcircumflex;0124 +Hdieresis;1E26 +Hdotaccent;1E22 +Hdotbelow;1E24 +Hmonospace;FF28 +Hoarmenian;0540 +Horicoptic;03E8 +Hsmall;F768 +Hungarumlaut;F6CF +Hungarumlautsmall;F6F8 +Hzsquare;3390 +I;0049 +IAcyrillic;042F +IJ;0132 +IUcyrillic;042E +Iacute;00CD +Iacutesmall;F7ED +Ibreve;012C +Icaron;01CF +Icircle;24BE +Icircumflex;00CE +Icircumflexsmall;F7EE +Icyrillic;0406 +Idblgrave;0208 +Idieresis;00CF +Idieresisacute;1E2E +Idieresiscyrillic;04E4 +Idieresissmall;F7EF +Idot;0130 +Idotaccent;0130 +Idotbelow;1ECA +Iebrevecyrillic;04D6 +Iecyrillic;0415 +Ifraktur;2111 +Igrave;00CC +Igravesmall;F7EC +Ihookabove;1EC8 +Iicyrillic;0418 +Iinvertedbreve;020A +Iishortcyrillic;0419 +Imacron;012A +Imacroncyrillic;04E2 +Imonospace;FF29 +Iniarmenian;053B +Iocyrillic;0401 +Iogonek;012E +Iota;0399 +Iotaafrican;0196 +Iotadieresis;03AA +Iotatonos;038A +Ismall;F769 +Istroke;0197 +Itilde;0128 +Itildebelow;1E2C +Izhitsacyrillic;0474 +Izhitsadblgravecyrillic;0476 +J;004A +Jaarmenian;0541 +Jcircle;24BF +Jcircumflex;0134 +Jecyrillic;0408 +Jheharmenian;054B +Jmonospace;FF2A +Jsmall;F76A +K;004B +KBsquare;3385 +KKsquare;33CD +Kabashkircyrillic;04A0 +Kacute;1E30 +Kacyrillic;041A +Kadescendercyrillic;049A +Kahookcyrillic;04C3 +Kappa;039A +Kastrokecyrillic;049E +Kaverticalstrokecyrillic;049C +Kcaron;01E8 +Kcedilla;0136 +Kcircle;24C0 +Kcommaaccent;0136 +Kdotbelow;1E32 +Keharmenian;0554 +Kenarmenian;053F +Khacyrillic;0425 +Kheicoptic;03E6 +Khook;0198 +Kjecyrillic;040C +Klinebelow;1E34 +Kmonospace;FF2B +Koppacyrillic;0480 +Koppagreek;03DE +Ksicyrillic;046E +Ksmall;F76B +L;004C +LJ;01C7 +LL;F6BF +Lacute;0139 +Lambda;039B +Lcaron;013D +Lcedilla;013B +Lcircle;24C1 +Lcircumflexbelow;1E3C +Lcommaaccent;013B +Ldot;013F +Ldotaccent;013F +Ldotbelow;1E36 +Ldotbelowmacron;1E38 +Liwnarmenian;053C +Lj;01C8 +Ljecyrillic;0409 +Llinebelow;1E3A +Lmonospace;FF2C +Lslash;0141 +Lslashsmall;F6F9 +Lsmall;F76C +M;004D +MBsquare;3386 +Macron;F6D0 +Macronsmall;F7AF +Macute;1E3E +Mcircle;24C2 +Mdotaccent;1E40 +Mdotbelow;1E42 +Menarmenian;0544 +Mmonospace;FF2D +Msmall;F76D +Mturned;019C +Mu;039C +N;004E +NJ;01CA +Nacute;0143 +Ncaron;0147 +Ncedilla;0145 +Ncircle;24C3 +Ncircumflexbelow;1E4A +Ncommaaccent;0145 +Ndotaccent;1E44 +Ndotbelow;1E46 +Nhookleft;019D +Nineroman;2168 +Nj;01CB +Njecyrillic;040A +Nlinebelow;1E48 +Nmonospace;FF2E +Nowarmenian;0546 +Nsmall;F76E +Ntilde;00D1 +Ntildesmall;F7F1 +Nu;039D +O;004F +OE;0152 +OEsmall;F6FA +Oacute;00D3 +Oacutesmall;F7F3 +Obarredcyrillic;04E8 +Obarreddieresiscyrillic;04EA +Obreve;014E +Ocaron;01D1 +Ocenteredtilde;019F +Ocircle;24C4 +Ocircumflex;00D4 +Ocircumflexacute;1ED0 +Ocircumflexdotbelow;1ED8 +Ocircumflexgrave;1ED2 +Ocircumflexhookabove;1ED4 +Ocircumflexsmall;F7F4 +Ocircumflextilde;1ED6 +Ocyrillic;041E +Odblacute;0150 +Odblgrave;020C +Odieresis;00D6 +Odieresiscyrillic;04E6 +Odieresissmall;F7F6 +Odotbelow;1ECC +Ogoneksmall;F6FB +Ograve;00D2 +Ogravesmall;F7F2 +Oharmenian;0555 +Ohm;2126 +Ohookabove;1ECE +Ohorn;01A0 +Ohornacute;1EDA +Ohorndotbelow;1EE2 +Ohorngrave;1EDC +Ohornhookabove;1EDE +Ohorntilde;1EE0 +Ohungarumlaut;0150 +Oi;01A2 +Oinvertedbreve;020E +Omacron;014C +Omacronacute;1E52 +Omacrongrave;1E50 +Omega;2126 +Omegacyrillic;0460 +Omegagreek;03A9 +Omegaroundcyrillic;047A +Omegatitlocyrillic;047C +Omegatonos;038F +Omicron;039F +Omicrontonos;038C +Omonospace;FF2F +Oneroman;2160 +Oogonek;01EA +Oogonekmacron;01EC +Oopen;0186 +Oslash;00D8 +Oslashacute;01FE +Oslashsmall;F7F8 +Osmall;F76F +Ostrokeacute;01FE +Otcyrillic;047E +Otilde;00D5 +Otildeacute;1E4C +Otildedieresis;1E4E +Otildesmall;F7F5 +P;0050 +Pacute;1E54 +Pcircle;24C5 +Pdotaccent;1E56 +Pecyrillic;041F +Peharmenian;054A +Pemiddlehookcyrillic;04A6 +Phi;03A6 +Phook;01A4 +Pi;03A0 +Piwrarmenian;0553 +Pmonospace;FF30 +Psi;03A8 +Psicyrillic;0470 +Psmall;F770 +Q;0051 +Qcircle;24C6 +Qmonospace;FF31 +Qsmall;F771 +R;0052 +Raarmenian;054C +Racute;0154 +Rcaron;0158 +Rcedilla;0156 +Rcircle;24C7 +Rcommaaccent;0156 +Rdblgrave;0210 +Rdotaccent;1E58 +Rdotbelow;1E5A +Rdotbelowmacron;1E5C +Reharmenian;0550 +Rfraktur;211C +Rho;03A1 +Ringsmall;F6FC +Rinvertedbreve;0212 +Rlinebelow;1E5E +Rmonospace;FF32 +Rsmall;F772 +Rsmallinverted;0281 +Rsmallinvertedsuperior;02B6 +S;0053 +SF010000;250C +SF020000;2514 +SF030000;2510 +SF040000;2518 +SF050000;253C +SF060000;252C +SF070000;2534 +SF080000;251C +SF090000;2524 +SF100000;2500 +SF110000;2502 +SF190000;2561 +SF200000;2562 +SF210000;2556 +SF220000;2555 +SF230000;2563 +SF240000;2551 +SF250000;2557 +SF260000;255D +SF270000;255C +SF280000;255B +SF360000;255E +SF370000;255F +SF380000;255A +SF390000;2554 +SF400000;2569 +SF410000;2566 +SF420000;2560 +SF430000;2550 +SF440000;256C +SF450000;2567 +SF460000;2568 +SF470000;2564 +SF480000;2565 +SF490000;2559 +SF500000;2558 +SF510000;2552 +SF520000;2553 +SF530000;256B +SF540000;256A +Sacute;015A +Sacutedotaccent;1E64 +Sampigreek;03E0 +Scaron;0160 +Scarondotaccent;1E66 +Scaronsmall;F6FD +Scedilla;015E +Schwa;018F +Schwacyrillic;04D8 +Schwadieresiscyrillic;04DA +Scircle;24C8 +Scircumflex;015C +Scommaaccent;0218 +Sdotaccent;1E60 +Sdotbelow;1E62 +Sdotbelowdotaccent;1E68 +Seharmenian;054D +Sevenroman;2166 +Shaarmenian;0547 +Shacyrillic;0428 +Shchacyrillic;0429 +Sheicoptic;03E2 +Shhacyrillic;04BA +Shimacoptic;03EC +Sigma;03A3 +Sixroman;2165 +Smonospace;FF33 +Softsigncyrillic;042C +Ssmall;F773 +Stigmagreek;03DA +T;0054 +Tau;03A4 +Tbar;0166 +Tcaron;0164 +Tcedilla;0162 +Tcircle;24C9 +Tcircumflexbelow;1E70 +Tcommaaccent;0162 +Tdotaccent;1E6A +Tdotbelow;1E6C +Tecyrillic;0422 +Tedescendercyrillic;04AC +Tenroman;2169 +Tetsecyrillic;04B4 +Theta;0398 +Thook;01AC +Thorn;00DE +Thornsmall;F7FE +Threeroman;2162 +Tildesmall;F6FE +Tiwnarmenian;054F +Tlinebelow;1E6E +Tmonospace;FF34 +Toarmenian;0539 +Tonefive;01BC +Tonesix;0184 +Tonetwo;01A7 +Tretroflexhook;01AE +Tsecyrillic;0426 +Tshecyrillic;040B +Tsmall;F774 +Twelveroman;216B +Tworoman;2161 +U;0055 +Uacute;00DA +Uacutesmall;F7FA +Ubreve;016C +Ucaron;01D3 +Ucircle;24CA +Ucircumflex;00DB +Ucircumflexbelow;1E76 +Ucircumflexsmall;F7FB +Ucyrillic;0423 +Udblacute;0170 +Udblgrave;0214 +Udieresis;00DC +Udieresisacute;01D7 +Udieresisbelow;1E72 +Udieresiscaron;01D9 +Udieresiscyrillic;04F0 +Udieresisgrave;01DB +Udieresismacron;01D5 +Udieresissmall;F7FC +Udotbelow;1EE4 +Ugrave;00D9 +Ugravesmall;F7F9 +Uhookabove;1EE6 +Uhorn;01AF +Uhornacute;1EE8 +Uhorndotbelow;1EF0 +Uhorngrave;1EEA +Uhornhookabove;1EEC +Uhorntilde;1EEE +Uhungarumlaut;0170 +Uhungarumlautcyrillic;04F2 +Uinvertedbreve;0216 +Ukcyrillic;0478 +Umacron;016A +Umacroncyrillic;04EE +Umacrondieresis;1E7A +Umonospace;FF35 +Uogonek;0172 +Upsilon;03A5 +Upsilon1;03D2 +Upsilonacutehooksymbolgreek;03D3 +Upsilonafrican;01B1 +Upsilondieresis;03AB +Upsilondieresishooksymbolgreek;03D4 +Upsilonhooksymbol;03D2 +Upsilontonos;038E +Uring;016E +Ushortcyrillic;040E +Usmall;F775 +Ustraightcyrillic;04AE +Ustraightstrokecyrillic;04B0 +Utilde;0168 +Utildeacute;1E78 +Utildebelow;1E74 +V;0056 +Vcircle;24CB +Vdotbelow;1E7E +Vecyrillic;0412 +Vewarmenian;054E +Vhook;01B2 +Vmonospace;FF36 +Voarmenian;0548 +Vsmall;F776 +Vtilde;1E7C +W;0057 +Wacute;1E82 +Wcircle;24CC +Wcircumflex;0174 +Wdieresis;1E84 +Wdotaccent;1E86 +Wdotbelow;1E88 +Wgrave;1E80 +Wmonospace;FF37 +Wsmall;F777 +X;0058 +Xcircle;24CD +Xdieresis;1E8C +Xdotaccent;1E8A +Xeharmenian;053D +Xi;039E +Xmonospace;FF38 +Xsmall;F778 +Y;0059 +Yacute;00DD +Yacutesmall;F7FD +Yatcyrillic;0462 +Ycircle;24CE +Ycircumflex;0176 +Ydieresis;0178 +Ydieresissmall;F7FF +Ydotaccent;1E8E +Ydotbelow;1EF4 +Yericyrillic;042B +Yerudieresiscyrillic;04F8 +Ygrave;1EF2 +Yhook;01B3 +Yhookabove;1EF6 +Yiarmenian;0545 +Yicyrillic;0407 +Yiwnarmenian;0552 +Ymonospace;FF39 +Ysmall;F779 +Ytilde;1EF8 +Yusbigcyrillic;046A +Yusbigiotifiedcyrillic;046C +Yuslittlecyrillic;0466 +Yuslittleiotifiedcyrillic;0468 +Z;005A +Zaarmenian;0536 +Zacute;0179 +Zcaron;017D +Zcaronsmall;F6FF +Zcircle;24CF +Zcircumflex;1E90 +Zdot;017B +Zdotaccent;017B +Zdotbelow;1E92 +Zecyrillic;0417 +Zedescendercyrillic;0498 +Zedieresiscyrillic;04DE +Zeta;0396 +Zhearmenian;053A +Zhebrevecyrillic;04C1 +Zhecyrillic;0416 +Zhedescendercyrillic;0496 +Zhedieresiscyrillic;04DC +Zlinebelow;1E94 +Zmonospace;FF3A +Zsmall;F77A +Zstroke;01B5 +a;0061 +aabengali;0986 +aacute;00E1 +aadeva;0906 +aagujarati;0A86 +aagurmukhi;0A06 +aamatragurmukhi;0A3E +aarusquare;3303 +aavowelsignbengali;09BE +aavowelsigndeva;093E +aavowelsigngujarati;0ABE +abbreviationmarkarmenian;055F +abbreviationsigndeva;0970 +abengali;0985 +abopomofo;311A +abreve;0103 +abreveacute;1EAF +abrevecyrillic;04D1 +abrevedotbelow;1EB7 +abrevegrave;1EB1 +abrevehookabove;1EB3 +abrevetilde;1EB5 +acaron;01CE +acircle;24D0 +acircumflex;00E2 +acircumflexacute;1EA5 +acircumflexdotbelow;1EAD +acircumflexgrave;1EA7 +acircumflexhookabove;1EA9 +acircumflextilde;1EAB +acute;00B4 +acutebelowcmb;0317 +acutecmb;0301 +acutecomb;0301 +acutedeva;0954 +acutelowmod;02CF +acutetonecmb;0341 +acyrillic;0430 +adblgrave;0201 +addakgurmukhi;0A71 +adeva;0905 +adieresis;00E4 +adieresiscyrillic;04D3 +adieresismacron;01DF +adotbelow;1EA1 +adotmacron;01E1 +ae;00E6 +aeacute;01FD +aekorean;3150 +aemacron;01E3 +afii00208;2015 +afii08941;20A4 +afii10017;0410 +afii10018;0411 +afii10019;0412 +afii10020;0413 +afii10021;0414 +afii10022;0415 +afii10023;0401 +afii10024;0416 +afii10025;0417 +afii10026;0418 +afii10027;0419 +afii10028;041A +afii10029;041B +afii10030;041C +afii10031;041D +afii10032;041E +afii10033;041F +afii10034;0420 +afii10035;0421 +afii10036;0422 +afii10037;0423 +afii10038;0424 +afii10039;0425 +afii10040;0426 +afii10041;0427 +afii10042;0428 +afii10043;0429 +afii10044;042A +afii10045;042B +afii10046;042C +afii10047;042D +afii10048;042E +afii10049;042F +afii10050;0490 +afii10051;0402 +afii10052;0403 +afii10053;0404 +afii10054;0405 +afii10055;0406 +afii10056;0407 +afii10057;0408 +afii10058;0409 +afii10059;040A +afii10060;040B +afii10061;040C +afii10062;040E +afii10063;F6C4 +afii10064;F6C5 +afii10065;0430 +afii10066;0431 +afii10067;0432 +afii10068;0433 +afii10069;0434 +afii10070;0435 +afii10071;0451 +afii10072;0436 +afii10073;0437 +afii10074;0438 +afii10075;0439 +afii10076;043A +afii10077;043B +afii10078;043C +afii10079;043D +afii10080;043E +afii10081;043F +afii10082;0440 +afii10083;0441 +afii10084;0442 +afii10085;0443 +afii10086;0444 +afii10087;0445 +afii10088;0446 +afii10089;0447 +afii10090;0448 +afii10091;0449 +afii10092;044A +afii10093;044B +afii10094;044C +afii10095;044D +afii10096;044E +afii10097;044F +afii10098;0491 +afii10099;0452 +afii10100;0453 +afii10101;0454 +afii10102;0455 +afii10103;0456 +afii10104;0457 +afii10105;0458 +afii10106;0459 +afii10107;045A +afii10108;045B +afii10109;045C +afii10110;045E +afii10145;040F +afii10146;0462 +afii10147;0472 +afii10148;0474 +afii10192;F6C6 +afii10193;045F +afii10194;0463 +afii10195;0473 +afii10196;0475 +afii10831;F6C7 +afii10832;F6C8 +afii10846;04D9 +afii299;200E +afii300;200F +afii301;200D +afii57381;066A +afii57388;060C +afii57392;0660 +afii57393;0661 +afii57394;0662 +afii57395;0663 +afii57396;0664 +afii57397;0665 +afii57398;0666 +afii57399;0667 +afii57400;0668 +afii57401;0669 +afii57403;061B +afii57407;061F +afii57409;0621 +afii57410;0622 +afii57411;0623 +afii57412;0624 +afii57413;0625 +afii57414;0626 +afii57415;0627 +afii57416;0628 +afii57417;0629 +afii57418;062A +afii57419;062B +afii57420;062C +afii57421;062D +afii57422;062E +afii57423;062F +afii57424;0630 +afii57425;0631 +afii57426;0632 +afii57427;0633 +afii57428;0634 +afii57429;0635 +afii57430;0636 +afii57431;0637 +afii57432;0638 +afii57433;0639 +afii57434;063A +afii57440;0640 +afii57441;0641 +afii57442;0642 +afii57443;0643 +afii57444;0644 +afii57445;0645 +afii57446;0646 +afii57448;0648 +afii57449;0649 +afii57450;064A +afii57451;064B +afii57452;064C +afii57453;064D +afii57454;064E +afii57455;064F +afii57456;0650 +afii57457;0651 +afii57458;0652 +afii57470;0647 +afii57505;06A4 +afii57506;067E +afii57507;0686 +afii57508;0698 +afii57509;06AF +afii57511;0679 +afii57512;0688 +afii57513;0691 +afii57514;06BA +afii57519;06D2 +afii57534;06D5 +afii57636;20AA +afii57645;05BE +afii57658;05C3 +afii57664;05D0 +afii57665;05D1 +afii57666;05D2 +afii57667;05D3 +afii57668;05D4 +afii57669;05D5 +afii57670;05D6 +afii57671;05D7 +afii57672;05D8 +afii57673;05D9 +afii57674;05DA +afii57675;05DB +afii57676;05DC +afii57677;05DD +afii57678;05DE +afii57679;05DF +afii57680;05E0 +afii57681;05E1 +afii57682;05E2 +afii57683;05E3 +afii57684;05E4 +afii57685;05E5 +afii57686;05E6 +afii57687;05E7 +afii57688;05E8 +afii57689;05E9 +afii57690;05EA +afii57694;FB2A +afii57695;FB2B +afii57700;FB4B +afii57705;FB1F +afii57716;05F0 +afii57717;05F1 +afii57718;05F2 +afii57723;FB35 +afii57793;05B4 +afii57794;05B5 +afii57795;05B6 +afii57796;05BB +afii57797;05B8 +afii57798;05B7 +afii57799;05B0 +afii57800;05B2 +afii57801;05B1 +afii57802;05B3 +afii57803;05C2 +afii57804;05C1 +afii57806;05B9 +afii57807;05BC +afii57839;05BD +afii57841;05BF +afii57842;05C0 +afii57929;02BC +afii61248;2105 +afii61289;2113 +afii61352;2116 +afii61573;202C +afii61574;202D +afii61575;202E +afii61664;200C +afii63167;066D +afii64937;02BD +agrave;00E0 +agujarati;0A85 +agurmukhi;0A05 +ahiragana;3042 +ahookabove;1EA3 +aibengali;0990 +aibopomofo;311E +aideva;0910 +aiecyrillic;04D5 +aigujarati;0A90 +aigurmukhi;0A10 +aimatragurmukhi;0A48 +ainarabic;0639 +ainfinalarabic;FECA +aininitialarabic;FECB +ainmedialarabic;FECC +ainvertedbreve;0203 +aivowelsignbengali;09C8 +aivowelsigndeva;0948 +aivowelsigngujarati;0AC8 +akatakana;30A2 +akatakanahalfwidth;FF71 +akorean;314F +alef;05D0 +alefarabic;0627 +alefdageshhebrew;FB30 +aleffinalarabic;FE8E +alefhamzaabovearabic;0623 +alefhamzaabovefinalarabic;FE84 +alefhamzabelowarabic;0625 +alefhamzabelowfinalarabic;FE88 +alefhebrew;05D0 +aleflamedhebrew;FB4F +alefmaddaabovearabic;0622 +alefmaddaabovefinalarabic;FE82 +alefmaksuraarabic;0649 +alefmaksurafinalarabic;FEF0 +alefmaksurainitialarabic;FEF3 +alefmaksuramedialarabic;FEF4 +alefpatahhebrew;FB2E +alefqamatshebrew;FB2F +aleph;2135 +allequal;224C +alpha;03B1 +alphatonos;03AC +amacron;0101 +amonospace;FF41 +ampersand;0026 +ampersandmonospace;FF06 +ampersandsmall;F726 +amsquare;33C2 +anbopomofo;3122 +angbopomofo;3124 +angkhankhuthai;0E5A +angle;2220 +anglebracketleft;3008 +anglebracketleftvertical;FE3F +anglebracketright;3009 +anglebracketrightvertical;FE40 +angleleft;2329 +angleright;232A +angstrom;212B +anoteleia;0387 +anudattadeva;0952 +anusvarabengali;0982 +anusvaradeva;0902 +anusvaragujarati;0A82 +aogonek;0105 +apaatosquare;3300 +aparen;249C +apostrophearmenian;055A +apostrophemod;02BC +apple;F8FF +approaches;2250 +approxequal;2248 +approxequalorimage;2252 +approximatelyequal;2245 +araeaekorean;318E +araeakorean;318D +arc;2312 +arighthalfring;1E9A +aring;00E5 +aringacute;01FB +aringbelow;1E01 +arrowboth;2194 +arrowdashdown;21E3 +arrowdashleft;21E0 +arrowdashright;21E2 +arrowdashup;21E1 +arrowdblboth;21D4 +arrowdbldown;21D3 +arrowdblleft;21D0 +arrowdblright;21D2 +arrowdblup;21D1 +arrowdown;2193 +arrowdownleft;2199 +arrowdownright;2198 +arrowdownwhite;21E9 +arrowheaddownmod;02C5 +arrowheadleftmod;02C2 +arrowheadrightmod;02C3 +arrowheadupmod;02C4 +arrowhorizex;F8E7 +arrowleft;2190 +arrowleftdbl;21D0 +arrowleftdblstroke;21CD +arrowleftoverright;21C6 +arrowleftwhite;21E6 +arrowright;2192 +arrowrightdblstroke;21CF +arrowrightheavy;279E +arrowrightoverleft;21C4 +arrowrightwhite;21E8 +arrowtableft;21E4 +arrowtabright;21E5 +arrowup;2191 +arrowupdn;2195 +arrowupdnbse;21A8 +arrowupdownbase;21A8 +arrowupleft;2196 +arrowupleftofdown;21C5 +arrowupright;2197 +arrowupwhite;21E7 +arrowvertex;F8E6 +asciicircum;005E +asciicircummonospace;FF3E +asciitilde;007E +asciitildemonospace;FF5E +ascript;0251 +ascriptturned;0252 +asmallhiragana;3041 +asmallkatakana;30A1 +asmallkatakanahalfwidth;FF67 +asterisk;002A +asteriskaltonearabic;066D +asteriskarabic;066D +asteriskmath;2217 +asteriskmonospace;FF0A +asterisksmall;FE61 +asterism;2042 +asuperior;F6E9 +asymptoticallyequal;2243 +at;0040 +atilde;00E3 +atmonospace;FF20 +atsmall;FE6B +aturned;0250 +aubengali;0994 +aubopomofo;3120 +audeva;0914 +augujarati;0A94 +augurmukhi;0A14 +aulengthmarkbengali;09D7 +aumatragurmukhi;0A4C +auvowelsignbengali;09CC +auvowelsigndeva;094C +auvowelsigngujarati;0ACC +avagrahadeva;093D +aybarmenian;0561 +ayin;05E2 +ayinaltonehebrew;FB20 +ayinhebrew;05E2 +b;0062 +babengali;09AC +backslash;005C +backslashmonospace;FF3C +badeva;092C +bagujarati;0AAC +bagurmukhi;0A2C +bahiragana;3070 +bahtthai;0E3F +bakatakana;30D0 +bar;007C +barmonospace;FF5C +bbopomofo;3105 +bcircle;24D1 +bdotaccent;1E03 +bdotbelow;1E05 +beamedsixteenthnotes;266C +because;2235 +becyrillic;0431 +beharabic;0628 +behfinalarabic;FE90 +behinitialarabic;FE91 +behiragana;3079 +behmedialarabic;FE92 +behmeeminitialarabic;FC9F +behmeemisolatedarabic;FC08 +behnoonfinalarabic;FC6D +bekatakana;30D9 +benarmenian;0562 +bet;05D1 +beta;03B2 +betasymbolgreek;03D0 +betdagesh;FB31 +betdageshhebrew;FB31 +bethebrew;05D1 +betrafehebrew;FB4C +bhabengali;09AD +bhadeva;092D +bhagujarati;0AAD +bhagurmukhi;0A2D +bhook;0253 +bihiragana;3073 +bikatakana;30D3 +bilabialclick;0298 +bindigurmukhi;0A02 +birusquare;3331 +blackcircle;25CF +blackdiamond;25C6 +blackdownpointingtriangle;25BC +blackleftpointingpointer;25C4 +blackleftpointingtriangle;25C0 +blacklenticularbracketleft;3010 +blacklenticularbracketleftvertical;FE3B +blacklenticularbracketright;3011 +blacklenticularbracketrightvertical;FE3C +blacklowerlefttriangle;25E3 +blacklowerrighttriangle;25E2 +blackrectangle;25AC +blackrightpointingpointer;25BA +blackrightpointingtriangle;25B6 +blacksmallsquare;25AA +blacksmilingface;263B +blacksquare;25A0 +blackstar;2605 +blackupperlefttriangle;25E4 +blackupperrighttriangle;25E5 +blackuppointingsmalltriangle;25B4 +blackuppointingtriangle;25B2 +blank;2423 +blinebelow;1E07 +block;2588 +bmonospace;FF42 +bobaimaithai;0E1A +bohiragana;307C +bokatakana;30DC +bparen;249D +bqsquare;33C3 +braceex;F8F4 +braceleft;007B +braceleftbt;F8F3 +braceleftmid;F8F2 +braceleftmonospace;FF5B +braceleftsmall;FE5B +bracelefttp;F8F1 +braceleftvertical;FE37 +braceright;007D +bracerightbt;F8FE +bracerightmid;F8FD +bracerightmonospace;FF5D +bracerightsmall;FE5C +bracerighttp;F8FC +bracerightvertical;FE38 +bracketleft;005B +bracketleftbt;F8F0 +bracketleftex;F8EF +bracketleftmonospace;FF3B +bracketlefttp;F8EE +bracketright;005D +bracketrightbt;F8FB +bracketrightex;F8FA +bracketrightmonospace;FF3D +bracketrighttp;F8F9 +breve;02D8 +brevebelowcmb;032E +brevecmb;0306 +breveinvertedbelowcmb;032F +breveinvertedcmb;0311 +breveinverteddoublecmb;0361 +bridgebelowcmb;032A +bridgeinvertedbelowcmb;033A +brokenbar;00A6 +bstroke;0180 +bsuperior;F6EA +btopbar;0183 +buhiragana;3076 +bukatakana;30D6 +bullet;2022 +bulletinverse;25D8 +bulletoperator;2219 +bullseye;25CE +c;0063 +caarmenian;056E +cabengali;099A +cacute;0107 +cadeva;091A +cagujarati;0A9A +cagurmukhi;0A1A +calsquare;3388 +candrabindubengali;0981 +candrabinducmb;0310 +candrabindudeva;0901 +candrabindugujarati;0A81 +capslock;21EA +careof;2105 +caron;02C7 +caronbelowcmb;032C +caroncmb;030C +carriagereturn;21B5 +cbopomofo;3118 +ccaron;010D +ccedilla;00E7 +ccedillaacute;1E09 +ccircle;24D2 +ccircumflex;0109 +ccurl;0255 +cdot;010B +cdotaccent;010B +cdsquare;33C5 +cedilla;00B8 +cedillacmb;0327 +cent;00A2 +centigrade;2103 +centinferior;F6DF +centmonospace;FFE0 +centoldstyle;F7A2 +centsuperior;F6E0 +chaarmenian;0579 +chabengali;099B +chadeva;091B +chagujarati;0A9B +chagurmukhi;0A1B +chbopomofo;3114 +cheabkhasiancyrillic;04BD +checkmark;2713 +checyrillic;0447 +chedescenderabkhasiancyrillic;04BF +chedescendercyrillic;04B7 +chedieresiscyrillic;04F5 +cheharmenian;0573 +chekhakassiancyrillic;04CC +cheverticalstrokecyrillic;04B9 +chi;03C7 +chieuchacirclekorean;3277 +chieuchaparenkorean;3217 +chieuchcirclekorean;3269 +chieuchkorean;314A +chieuchparenkorean;3209 +chochangthai;0E0A +chochanthai;0E08 +chochingthai;0E09 +chochoethai;0E0C +chook;0188 +cieucacirclekorean;3276 +cieucaparenkorean;3216 +cieuccirclekorean;3268 +cieuckorean;3148 +cieucparenkorean;3208 +cieucuparenkorean;321C +circle;25CB +circlemultiply;2297 +circleot;2299 +circleplus;2295 +circlepostalmark;3036 +circlewithlefthalfblack;25D0 +circlewithrighthalfblack;25D1 +circumflex;02C6 +circumflexbelowcmb;032D +circumflexcmb;0302 +clear;2327 +clickalveolar;01C2 +clickdental;01C0 +clicklateral;01C1 +clickretroflex;01C3 +club;2663 +clubsuitblack;2663 +clubsuitwhite;2667 +cmcubedsquare;33A4 +cmonospace;FF43 +cmsquaredsquare;33A0 +coarmenian;0581 +colon;003A +colonmonetary;20A1 +colonmonospace;FF1A +colonsign;20A1 +colonsmall;FE55 +colontriangularhalfmod;02D1 +colontriangularmod;02D0 +comma;002C +commaabovecmb;0313 +commaaboverightcmb;0315 +commaaccent;F6C3 +commaarabic;060C +commaarmenian;055D +commainferior;F6E1 +commamonospace;FF0C +commareversedabovecmb;0314 +commareversedmod;02BD +commasmall;FE50 +commasuperior;F6E2 +commaturnedabovecmb;0312 +commaturnedmod;02BB +compass;263C +congruent;2245 +contourintegral;222E +control;2303 +controlACK;0006 +controlBEL;0007 +controlBS;0008 +controlCAN;0018 +controlCR;000D +controlDC1;0011 +controlDC2;0012 +controlDC3;0013 +controlDC4;0014 +controlDEL;007F +controlDLE;0010 +controlEM;0019 +controlENQ;0005 +controlEOT;0004 +controlESC;001B +controlETB;0017 +controlETX;0003 +controlFF;000C +controlFS;001C +controlGS;001D +controlHT;0009 +controlLF;000A +controlNAK;0015 +controlRS;001E +controlSI;000F +controlSO;000E +controlSOT;0002 +controlSTX;0001 +controlSUB;001A +controlSYN;0016 +controlUS;001F +controlVT;000B +copyright;00A9 +copyrightsans;F8E9 +copyrightserif;F6D9 +cornerbracketleft;300C +cornerbracketlefthalfwidth;FF62 +cornerbracketleftvertical;FE41 +cornerbracketright;300D +cornerbracketrighthalfwidth;FF63 +cornerbracketrightvertical;FE42 +corporationsquare;337F +cosquare;33C7 +coverkgsquare;33C6 +cparen;249E +cruzeiro;20A2 +cstretched;0297 +curlyand;22CF +curlyor;22CE +currency;00A4 +cyrBreve;F6D1 +cyrFlex;F6D2 +cyrbreve;F6D4 +cyrflex;F6D5 +d;0064 +daarmenian;0564 +dabengali;09A6 +dadarabic;0636 +dadeva;0926 +dadfinalarabic;FEBE +dadinitialarabic;FEBF +dadmedialarabic;FEC0 +dagesh;05BC +dageshhebrew;05BC +dagger;2020 +daggerdbl;2021 +dagujarati;0AA6 +dagurmukhi;0A26 +dahiragana;3060 +dakatakana;30C0 +dalarabic;062F +dalet;05D3 +daletdagesh;FB33 +daletdageshhebrew;FB33 +dalethatafpatah;05D3 05B2 +dalethatafpatahhebrew;05D3 05B2 +dalethatafsegol;05D3 05B1 +dalethatafsegolhebrew;05D3 05B1 +dalethebrew;05D3 +dalethiriq;05D3 05B4 +dalethiriqhebrew;05D3 05B4 +daletholam;05D3 05B9 +daletholamhebrew;05D3 05B9 +daletpatah;05D3 05B7 +daletpatahhebrew;05D3 05B7 +daletqamats;05D3 05B8 +daletqamatshebrew;05D3 05B8 +daletqubuts;05D3 05BB +daletqubutshebrew;05D3 05BB +daletsegol;05D3 05B6 +daletsegolhebrew;05D3 05B6 +daletsheva;05D3 05B0 +daletshevahebrew;05D3 05B0 +dalettsere;05D3 05B5 +dalettserehebrew;05D3 05B5 +dalfinalarabic;FEAA +dammaarabic;064F +dammalowarabic;064F +dammatanaltonearabic;064C +dammatanarabic;064C +danda;0964 +dargahebrew;05A7 +dargalefthebrew;05A7 +dasiapneumatacyrilliccmb;0485 +dblGrave;F6D3 +dblanglebracketleft;300A +dblanglebracketleftvertical;FE3D +dblanglebracketright;300B +dblanglebracketrightvertical;FE3E +dblarchinvertedbelowcmb;032B +dblarrowleft;21D4 +dblarrowright;21D2 +dbldanda;0965 +dblgrave;F6D6 +dblgravecmb;030F +dblintegral;222C +dbllowline;2017 +dbllowlinecmb;0333 +dbloverlinecmb;033F +dblprimemod;02BA +dblverticalbar;2016 +dblverticallineabovecmb;030E +dbopomofo;3109 +dbsquare;33C8 +dcaron;010F +dcedilla;1E11 +dcircle;24D3 +dcircumflexbelow;1E13 +dcroat;0111 +ddabengali;09A1 +ddadeva;0921 +ddagujarati;0AA1 +ddagurmukhi;0A21 +ddalarabic;0688 +ddalfinalarabic;FB89 +dddhadeva;095C +ddhabengali;09A2 +ddhadeva;0922 +ddhagujarati;0AA2 +ddhagurmukhi;0A22 +ddotaccent;1E0B +ddotbelow;1E0D +decimalseparatorarabic;066B +decimalseparatorpersian;066B +decyrillic;0434 +degree;00B0 +dehihebrew;05AD +dehiragana;3067 +deicoptic;03EF +dekatakana;30C7 +deleteleft;232B +deleteright;2326 +delta;03B4 +deltaturned;018D +denominatorminusonenumeratorbengali;09F8 +dezh;02A4 +dhabengali;09A7 +dhadeva;0927 +dhagujarati;0AA7 +dhagurmukhi;0A27 +dhook;0257 +dialytikatonos;0385 +dialytikatonoscmb;0344 +diamond;2666 +diamondsuitwhite;2662 +dieresis;00A8 +dieresisacute;F6D7 +dieresisbelowcmb;0324 +dieresiscmb;0308 +dieresisgrave;F6D8 +dieresistonos;0385 +dihiragana;3062 +dikatakana;30C2 +dittomark;3003 +divide;00F7 +divides;2223 +divisionslash;2215 +djecyrillic;0452 +dkshade;2593 +dlinebelow;1E0F +dlsquare;3397 +dmacron;0111 +dmonospace;FF44 +dnblock;2584 +dochadathai;0E0E +dodekthai;0E14 +dohiragana;3069 +dokatakana;30C9 +dollar;0024 +dollarinferior;F6E3 +dollarmonospace;FF04 +dollaroldstyle;F724 +dollarsmall;FE69 +dollarsuperior;F6E4 +dong;20AB +dorusquare;3326 +dotaccent;02D9 +dotaccentcmb;0307 +dotbelowcmb;0323 +dotbelowcomb;0323 +dotkatakana;30FB +dotlessi;0131 +dotlessj;F6BE +dotlessjstrokehook;0284 +dotmath;22C5 +dottedcircle;25CC +doubleyodpatah;FB1F +doubleyodpatahhebrew;FB1F +downtackbelowcmb;031E +downtackmod;02D5 +dparen;249F +dsuperior;F6EB +dtail;0256 +dtopbar;018C +duhiragana;3065 +dukatakana;30C5 +dz;01F3 +dzaltone;02A3 +dzcaron;01C6 +dzcurl;02A5 +dzeabkhasiancyrillic;04E1 +dzecyrillic;0455 +dzhecyrillic;045F +e;0065 +eacute;00E9 +earth;2641 +ebengali;098F +ebopomofo;311C +ebreve;0115 +ecandradeva;090D +ecandragujarati;0A8D +ecandravowelsigndeva;0945 +ecandravowelsigngujarati;0AC5 +ecaron;011B +ecedillabreve;1E1D +echarmenian;0565 +echyiwnarmenian;0587 +ecircle;24D4 +ecircumflex;00EA +ecircumflexacute;1EBF +ecircumflexbelow;1E19 +ecircumflexdotbelow;1EC7 +ecircumflexgrave;1EC1 +ecircumflexhookabove;1EC3 +ecircumflextilde;1EC5 +ecyrillic;0454 +edblgrave;0205 +edeva;090F +edieresis;00EB +edot;0117 +edotaccent;0117 +edotbelow;1EB9 +eegurmukhi;0A0F +eematragurmukhi;0A47 +efcyrillic;0444 +egrave;00E8 +egujarati;0A8F +eharmenian;0567 +ehbopomofo;311D +ehiragana;3048 +ehookabove;1EBB +eibopomofo;311F +eight;0038 +eightarabic;0668 +eightbengali;09EE +eightcircle;2467 +eightcircleinversesansserif;2791 +eightdeva;096E +eighteencircle;2471 +eighteenparen;2485 +eighteenperiod;2499 +eightgujarati;0AEE +eightgurmukhi;0A6E +eighthackarabic;0668 +eighthangzhou;3028 +eighthnotebeamed;266B +eightideographicparen;3227 +eightinferior;2088 +eightmonospace;FF18 +eightoldstyle;F738 +eightparen;247B +eightperiod;248F +eightpersian;06F8 +eightroman;2177 +eightsuperior;2078 +eightthai;0E58 +einvertedbreve;0207 +eiotifiedcyrillic;0465 +ekatakana;30A8 +ekatakanahalfwidth;FF74 +ekonkargurmukhi;0A74 +ekorean;3154 +elcyrillic;043B +element;2208 +elevencircle;246A +elevenparen;247E +elevenperiod;2492 +elevenroman;217A +ellipsis;2026 +ellipsisvertical;22EE +emacron;0113 +emacronacute;1E17 +emacrongrave;1E15 +emcyrillic;043C +emdash;2014 +emdashvertical;FE31 +emonospace;FF45 +emphasismarkarmenian;055B +emptyset;2205 +enbopomofo;3123 +encyrillic;043D +endash;2013 +endashvertical;FE32 +endescendercyrillic;04A3 +eng;014B +engbopomofo;3125 +enghecyrillic;04A5 +enhookcyrillic;04C8 +enspace;2002 +eogonek;0119 +eokorean;3153 +eopen;025B +eopenclosed;029A +eopenreversed;025C +eopenreversedclosed;025E +eopenreversedhook;025D +eparen;24A0 +epsilon;03B5 +epsilontonos;03AD +equal;003D +equalmonospace;FF1D +equalsmall;FE66 +equalsuperior;207C +equivalence;2261 +erbopomofo;3126 +ercyrillic;0440 +ereversed;0258 +ereversedcyrillic;044D +escyrillic;0441 +esdescendercyrillic;04AB +esh;0283 +eshcurl;0286 +eshortdeva;090E +eshortvowelsigndeva;0946 +eshreversedloop;01AA +eshsquatreversed;0285 +esmallhiragana;3047 +esmallkatakana;30A7 +esmallkatakanahalfwidth;FF6A +estimated;212E +esuperior;F6EC +eta;03B7 +etarmenian;0568 +etatonos;03AE +eth;00F0 +etilde;1EBD +etildebelow;1E1B +etnahtafoukhhebrew;0591 +etnahtafoukhlefthebrew;0591 +etnahtahebrew;0591 +etnahtalefthebrew;0591 +eturned;01DD +eukorean;3161 +euro;20AC +evowelsignbengali;09C7 +evowelsigndeva;0947 +evowelsigngujarati;0AC7 +exclam;0021 +exclamarmenian;055C +exclamdbl;203C +exclamdown;00A1 +exclamdownsmall;F7A1 +exclammonospace;FF01 +exclamsmall;F721 +existential;2203 +ezh;0292 +ezhcaron;01EF +ezhcurl;0293 +ezhreversed;01B9 +ezhtail;01BA +f;0066 +fadeva;095E +fagurmukhi;0A5E +fahrenheit;2109 +fathaarabic;064E +fathalowarabic;064E +fathatanarabic;064B +fbopomofo;3108 +fcircle;24D5 +fdotaccent;1E1F +feharabic;0641 +feharmenian;0586 +fehfinalarabic;FED2 +fehinitialarabic;FED3 +fehmedialarabic;FED4 +feicoptic;03E5 +female;2640 +ff;FB00 +ffi;FB03 +ffl;FB04 +fi;FB01 +fifteencircle;246E +fifteenparen;2482 +fifteenperiod;2496 +figuredash;2012 +filledbox;25A0 +filledrect;25AC +finalkaf;05DA +finalkafdagesh;FB3A +finalkafdageshhebrew;FB3A +finalkafhebrew;05DA +finalkafqamats;05DA 05B8 +finalkafqamatshebrew;05DA 05B8 +finalkafsheva;05DA 05B0 +finalkafshevahebrew;05DA 05B0 +finalmem;05DD +finalmemhebrew;05DD +finalnun;05DF +finalnunhebrew;05DF +finalpe;05E3 +finalpehebrew;05E3 +finaltsadi;05E5 +finaltsadihebrew;05E5 +firsttonechinese;02C9 +fisheye;25C9 +fitacyrillic;0473 +five;0035 +fivearabic;0665 +fivebengali;09EB +fivecircle;2464 +fivecircleinversesansserif;278E +fivedeva;096B +fiveeighths;215D +fivegujarati;0AEB +fivegurmukhi;0A6B +fivehackarabic;0665 +fivehangzhou;3025 +fiveideographicparen;3224 +fiveinferior;2085 +fivemonospace;FF15 +fiveoldstyle;F735 +fiveparen;2478 +fiveperiod;248C +fivepersian;06F5 +fiveroman;2174 +fivesuperior;2075 +fivethai;0E55 +fl;FB02 +florin;0192 +fmonospace;FF46 +fmsquare;3399 +fofanthai;0E1F +fofathai;0E1D +fongmanthai;0E4F +forall;2200 +four;0034 +fourarabic;0664 +fourbengali;09EA +fourcircle;2463 +fourcircleinversesansserif;278D +fourdeva;096A +fourgujarati;0AEA +fourgurmukhi;0A6A +fourhackarabic;0664 +fourhangzhou;3024 +fourideographicparen;3223 +fourinferior;2084 +fourmonospace;FF14 +fournumeratorbengali;09F7 +fouroldstyle;F734 +fourparen;2477 +fourperiod;248B +fourpersian;06F4 +fourroman;2173 +foursuperior;2074 +fourteencircle;246D +fourteenparen;2481 +fourteenperiod;2495 +fourthai;0E54 +fourthtonechinese;02CB +fparen;24A1 +fraction;2044 +franc;20A3 +g;0067 +gabengali;0997 +gacute;01F5 +gadeva;0917 +gafarabic;06AF +gaffinalarabic;FB93 +gafinitialarabic;FB94 +gafmedialarabic;FB95 +gagujarati;0A97 +gagurmukhi;0A17 +gahiragana;304C +gakatakana;30AC +gamma;03B3 +gammalatinsmall;0263 +gammasuperior;02E0 +gangiacoptic;03EB +gbopomofo;310D +gbreve;011F +gcaron;01E7 +gcedilla;0123 +gcircle;24D6 +gcircumflex;011D +gcommaaccent;0123 +gdot;0121 +gdotaccent;0121 +gecyrillic;0433 +gehiragana;3052 +gekatakana;30B2 +geometricallyequal;2251 +gereshaccenthebrew;059C +gereshhebrew;05F3 +gereshmuqdamhebrew;059D +germandbls;00DF +gershayimaccenthebrew;059E +gershayimhebrew;05F4 +getamark;3013 +ghabengali;0998 +ghadarmenian;0572 +ghadeva;0918 +ghagujarati;0A98 +ghagurmukhi;0A18 +ghainarabic;063A +ghainfinalarabic;FECE +ghaininitialarabic;FECF +ghainmedialarabic;FED0 +ghemiddlehookcyrillic;0495 +ghestrokecyrillic;0493 +gheupturncyrillic;0491 +ghhadeva;095A +ghhagurmukhi;0A5A +ghook;0260 +ghzsquare;3393 +gihiragana;304E +gikatakana;30AE +gimarmenian;0563 +gimel;05D2 +gimeldagesh;FB32 +gimeldageshhebrew;FB32 +gimelhebrew;05D2 +gjecyrillic;0453 +glottalinvertedstroke;01BE +glottalstop;0294 +glottalstopinverted;0296 +glottalstopmod;02C0 +glottalstopreversed;0295 +glottalstopreversedmod;02C1 +glottalstopreversedsuperior;02E4 +glottalstopstroke;02A1 +glottalstopstrokereversed;02A2 +gmacron;1E21 +gmonospace;FF47 +gohiragana;3054 +gokatakana;30B4 +gparen;24A2 +gpasquare;33AC +gradient;2207 +grave;0060 +gravebelowcmb;0316 +gravecmb;0300 +gravecomb;0300 +gravedeva;0953 +gravelowmod;02CE +gravemonospace;FF40 +gravetonecmb;0340 +greater;003E +greaterequal;2265 +greaterequalorless;22DB +greatermonospace;FF1E +greaterorequivalent;2273 +greaterorless;2277 +greateroverequal;2267 +greatersmall;FE65 +gscript;0261 +gstroke;01E5 +guhiragana;3050 +guillemotleft;00AB +guillemotright;00BB +guilsinglleft;2039 +guilsinglright;203A +gukatakana;30B0 +guramusquare;3318 +gysquare;33C9 +h;0068 +haabkhasiancyrillic;04A9 +haaltonearabic;06C1 +habengali;09B9 +hadescendercyrillic;04B3 +hadeva;0939 +hagujarati;0AB9 +hagurmukhi;0A39 +haharabic;062D +hahfinalarabic;FEA2 +hahinitialarabic;FEA3 +hahiragana;306F +hahmedialarabic;FEA4 +haitusquare;332A +hakatakana;30CF +hakatakanahalfwidth;FF8A +halantgurmukhi;0A4D +hamzaarabic;0621 +hamzadammaarabic;0621 064F +hamzadammatanarabic;0621 064C +hamzafathaarabic;0621 064E +hamzafathatanarabic;0621 064B +hamzalowarabic;0621 +hamzalowkasraarabic;0621 0650 +hamzalowkasratanarabic;0621 064D +hamzasukunarabic;0621 0652 +hangulfiller;3164 +hardsigncyrillic;044A +harpoonleftbarbup;21BC +harpoonrightbarbup;21C0 +hasquare;33CA +hatafpatah;05B2 +hatafpatah16;05B2 +hatafpatah23;05B2 +hatafpatah2f;05B2 +hatafpatahhebrew;05B2 +hatafpatahnarrowhebrew;05B2 +hatafpatahquarterhebrew;05B2 +hatafpatahwidehebrew;05B2 +hatafqamats;05B3 +hatafqamats1b;05B3 +hatafqamats28;05B3 +hatafqamats34;05B3 +hatafqamatshebrew;05B3 +hatafqamatsnarrowhebrew;05B3 +hatafqamatsquarterhebrew;05B3 +hatafqamatswidehebrew;05B3 +hatafsegol;05B1 +hatafsegol17;05B1 +hatafsegol24;05B1 +hatafsegol30;05B1 +hatafsegolhebrew;05B1 +hatafsegolnarrowhebrew;05B1 +hatafsegolquarterhebrew;05B1 +hatafsegolwidehebrew;05B1 +hbar;0127 +hbopomofo;310F +hbrevebelow;1E2B +hcedilla;1E29 +hcircle;24D7 +hcircumflex;0125 +hdieresis;1E27 +hdotaccent;1E23 +hdotbelow;1E25 +he;05D4 +heart;2665 +heartsuitblack;2665 +heartsuitwhite;2661 +hedagesh;FB34 +hedageshhebrew;FB34 +hehaltonearabic;06C1 +heharabic;0647 +hehebrew;05D4 +hehfinalaltonearabic;FBA7 +hehfinalalttwoarabic;FEEA +hehfinalarabic;FEEA +hehhamzaabovefinalarabic;FBA5 +hehhamzaaboveisolatedarabic;FBA4 +hehinitialaltonearabic;FBA8 +hehinitialarabic;FEEB +hehiragana;3078 +hehmedialaltonearabic;FBA9 +hehmedialarabic;FEEC +heiseierasquare;337B +hekatakana;30D8 +hekatakanahalfwidth;FF8D +hekutaarusquare;3336 +henghook;0267 +herutusquare;3339 +het;05D7 +hethebrew;05D7 +hhook;0266 +hhooksuperior;02B1 +hieuhacirclekorean;327B +hieuhaparenkorean;321B +hieuhcirclekorean;326D +hieuhkorean;314E +hieuhparenkorean;320D +hihiragana;3072 +hikatakana;30D2 +hikatakanahalfwidth;FF8B +hiriq;05B4 +hiriq14;05B4 +hiriq21;05B4 +hiriq2d;05B4 +hiriqhebrew;05B4 +hiriqnarrowhebrew;05B4 +hiriqquarterhebrew;05B4 +hiriqwidehebrew;05B4 +hlinebelow;1E96 +hmonospace;FF48 +hoarmenian;0570 +hohipthai;0E2B +hohiragana;307B +hokatakana;30DB +hokatakanahalfwidth;FF8E +holam;05B9 +holam19;05B9 +holam26;05B9 +holam32;05B9 +holamhebrew;05B9 +holamnarrowhebrew;05B9 +holamquarterhebrew;05B9 +holamwidehebrew;05B9 +honokhukthai;0E2E +hookabovecomb;0309 +hookcmb;0309 +hookpalatalizedbelowcmb;0321 +hookretroflexbelowcmb;0322 +hoonsquare;3342 +horicoptic;03E9 +horizontalbar;2015 +horncmb;031B +hotsprings;2668 +house;2302 +hparen;24A3 +hsuperior;02B0 +hturned;0265 +huhiragana;3075 +huiitosquare;3333 +hukatakana;30D5 +hukatakanahalfwidth;FF8C +hungarumlaut;02DD +hungarumlautcmb;030B +hv;0195 +hyphen;002D +hypheninferior;F6E5 +hyphenmonospace;FF0D +hyphensmall;FE63 +hyphensuperior;F6E6 +hyphentwo;2010 +i;0069 +iacute;00ED +iacyrillic;044F +ibengali;0987 +ibopomofo;3127 +ibreve;012D +icaron;01D0 +icircle;24D8 +icircumflex;00EE +icyrillic;0456 +idblgrave;0209 +ideographearthcircle;328F +ideographfirecircle;328B +ideographicallianceparen;323F +ideographiccallparen;323A +ideographiccentrecircle;32A5 +ideographicclose;3006 +ideographiccomma;3001 +ideographiccommaleft;FF64 +ideographiccongratulationparen;3237 +ideographiccorrectcircle;32A3 +ideographicearthparen;322F +ideographicenterpriseparen;323D +ideographicexcellentcircle;329D +ideographicfestivalparen;3240 +ideographicfinancialcircle;3296 +ideographicfinancialparen;3236 +ideographicfireparen;322B +ideographichaveparen;3232 +ideographichighcircle;32A4 +ideographiciterationmark;3005 +ideographiclaborcircle;3298 +ideographiclaborparen;3238 +ideographicleftcircle;32A7 +ideographiclowcircle;32A6 +ideographicmedicinecircle;32A9 +ideographicmetalparen;322E +ideographicmoonparen;322A +ideographicnameparen;3234 +ideographicperiod;3002 +ideographicprintcircle;329E +ideographicreachparen;3243 +ideographicrepresentparen;3239 +ideographicresourceparen;323E +ideographicrightcircle;32A8 +ideographicsecretcircle;3299 +ideographicselfparen;3242 +ideographicsocietyparen;3233 +ideographicspace;3000 +ideographicspecialparen;3235 +ideographicstockparen;3231 +ideographicstudyparen;323B +ideographicsunparen;3230 +ideographicsuperviseparen;323C +ideographicwaterparen;322C +ideographicwoodparen;322D +ideographiczero;3007 +ideographmetalcircle;328E +ideographmooncircle;328A +ideographnamecircle;3294 +ideographsuncircle;3290 +ideographwatercircle;328C +ideographwoodcircle;328D +ideva;0907 +idieresis;00EF +idieresisacute;1E2F +idieresiscyrillic;04E5 +idotbelow;1ECB +iebrevecyrillic;04D7 +iecyrillic;0435 +ieungacirclekorean;3275 +ieungaparenkorean;3215 +ieungcirclekorean;3267 +ieungkorean;3147 +ieungparenkorean;3207 +igrave;00EC +igujarati;0A87 +igurmukhi;0A07 +ihiragana;3044 +ihookabove;1EC9 +iibengali;0988 +iicyrillic;0438 +iideva;0908 +iigujarati;0A88 +iigurmukhi;0A08 +iimatragurmukhi;0A40 +iinvertedbreve;020B +iishortcyrillic;0439 +iivowelsignbengali;09C0 +iivowelsigndeva;0940 +iivowelsigngujarati;0AC0 +ij;0133 +ikatakana;30A4 +ikatakanahalfwidth;FF72 +ikorean;3163 +ilde;02DC +iluyhebrew;05AC +imacron;012B +imacroncyrillic;04E3 +imageorapproximatelyequal;2253 +imatragurmukhi;0A3F +imonospace;FF49 +increment;2206 +infinity;221E +iniarmenian;056B +integral;222B +integralbottom;2321 +integralbt;2321 +integralex;F8F5 +integraltop;2320 +integraltp;2320 +intersection;2229 +intisquare;3305 +invbullet;25D8 +invcircle;25D9 +invsmileface;263B +iocyrillic;0451 +iogonek;012F +iota;03B9 +iotadieresis;03CA +iotadieresistonos;0390 +iotalatin;0269 +iotatonos;03AF +iparen;24A4 +irigurmukhi;0A72 +ismallhiragana;3043 +ismallkatakana;30A3 +ismallkatakanahalfwidth;FF68 +issharbengali;09FA +istroke;0268 +isuperior;F6ED +iterationhiragana;309D +iterationkatakana;30FD +itilde;0129 +itildebelow;1E2D +iubopomofo;3129 +iucyrillic;044E +ivowelsignbengali;09BF +ivowelsigndeva;093F +ivowelsigngujarati;0ABF +izhitsacyrillic;0475 +izhitsadblgravecyrillic;0477 +j;006A +jaarmenian;0571 +jabengali;099C +jadeva;091C +jagujarati;0A9C +jagurmukhi;0A1C +jbopomofo;3110 +jcaron;01F0 +jcircle;24D9 +jcircumflex;0135 +jcrossedtail;029D +jdotlessstroke;025F +jecyrillic;0458 +jeemarabic;062C +jeemfinalarabic;FE9E +jeeminitialarabic;FE9F +jeemmedialarabic;FEA0 +jeharabic;0698 +jehfinalarabic;FB8B +jhabengali;099D +jhadeva;091D +jhagujarati;0A9D +jhagurmukhi;0A1D +jheharmenian;057B +jis;3004 +jmonospace;FF4A +jparen;24A5 +jsuperior;02B2 +k;006B +kabashkircyrillic;04A1 +kabengali;0995 +kacute;1E31 +kacyrillic;043A +kadescendercyrillic;049B +kadeva;0915 +kaf;05DB +kafarabic;0643 +kafdagesh;FB3B +kafdageshhebrew;FB3B +kaffinalarabic;FEDA +kafhebrew;05DB +kafinitialarabic;FEDB +kafmedialarabic;FEDC +kafrafehebrew;FB4D +kagujarati;0A95 +kagurmukhi;0A15 +kahiragana;304B +kahookcyrillic;04C4 +kakatakana;30AB +kakatakanahalfwidth;FF76 +kappa;03BA +kappasymbolgreek;03F0 +kapyeounmieumkorean;3171 +kapyeounphieuphkorean;3184 +kapyeounpieupkorean;3178 +kapyeounssangpieupkorean;3179 +karoriisquare;330D +kashidaautoarabic;0640 +kashidaautonosidebearingarabic;0640 +kasmallkatakana;30F5 +kasquare;3384 +kasraarabic;0650 +kasratanarabic;064D +kastrokecyrillic;049F +katahiraprolongmarkhalfwidth;FF70 +kaverticalstrokecyrillic;049D +kbopomofo;310E +kcalsquare;3389 +kcaron;01E9 +kcedilla;0137 +kcircle;24DA +kcommaaccent;0137 +kdotbelow;1E33 +keharmenian;0584 +kehiragana;3051 +kekatakana;30B1 +kekatakanahalfwidth;FF79 +kenarmenian;056F +kesmallkatakana;30F6 +kgreenlandic;0138 +khabengali;0996 +khacyrillic;0445 +khadeva;0916 +khagujarati;0A96 +khagurmukhi;0A16 +khaharabic;062E +khahfinalarabic;FEA6 +khahinitialarabic;FEA7 +khahmedialarabic;FEA8 +kheicoptic;03E7 +khhadeva;0959 +khhagurmukhi;0A59 +khieukhacirclekorean;3278 +khieukhaparenkorean;3218 +khieukhcirclekorean;326A +khieukhkorean;314B +khieukhparenkorean;320A +khokhaithai;0E02 +khokhonthai;0E05 +khokhuatthai;0E03 +khokhwaithai;0E04 +khomutthai;0E5B +khook;0199 +khorakhangthai;0E06 +khzsquare;3391 +kihiragana;304D +kikatakana;30AD +kikatakanahalfwidth;FF77 +kiroguramusquare;3315 +kiromeetorusquare;3316 +kirosquare;3314 +kiyeokacirclekorean;326E +kiyeokaparenkorean;320E +kiyeokcirclekorean;3260 +kiyeokkorean;3131 +kiyeokparenkorean;3200 +kiyeoksioskorean;3133 +kjecyrillic;045C +klinebelow;1E35 +klsquare;3398 +kmcubedsquare;33A6 +kmonospace;FF4B +kmsquaredsquare;33A2 +kohiragana;3053 +kohmsquare;33C0 +kokaithai;0E01 +kokatakana;30B3 +kokatakanahalfwidth;FF7A +kooposquare;331E +koppacyrillic;0481 +koreanstandardsymbol;327F +koroniscmb;0343 +kparen;24A6 +kpasquare;33AA +ksicyrillic;046F +ktsquare;33CF +kturned;029E +kuhiragana;304F +kukatakana;30AF +kukatakanahalfwidth;FF78 +kvsquare;33B8 +kwsquare;33BE +l;006C +labengali;09B2 +lacute;013A +ladeva;0932 +lagujarati;0AB2 +lagurmukhi;0A32 +lakkhangyaothai;0E45 +lamaleffinalarabic;FEFC +lamalefhamzaabovefinalarabic;FEF8 +lamalefhamzaaboveisolatedarabic;FEF7 +lamalefhamzabelowfinalarabic;FEFA +lamalefhamzabelowisolatedarabic;FEF9 +lamalefisolatedarabic;FEFB +lamalefmaddaabovefinalarabic;FEF6 +lamalefmaddaaboveisolatedarabic;FEF5 +lamarabic;0644 +lambda;03BB +lambdastroke;019B +lamed;05DC +lameddagesh;FB3C +lameddageshhebrew;FB3C +lamedhebrew;05DC +lamedholam;05DC 05B9 +lamedholamdagesh;05DC 05B9 05BC +lamedholamdageshhebrew;05DC 05B9 05BC +lamedholamhebrew;05DC 05B9 +lamfinalarabic;FEDE +lamhahinitialarabic;FCCA +laminitialarabic;FEDF +lamjeeminitialarabic;FCC9 +lamkhahinitialarabic;FCCB +lamlamhehisolatedarabic;FDF2 +lammedialarabic;FEE0 +lammeemhahinitialarabic;FD88 +lammeeminitialarabic;FCCC +lammeemjeeminitialarabic;FEDF FEE4 FEA0 +lammeemkhahinitialarabic;FEDF FEE4 FEA8 +largecircle;25EF +lbar;019A +lbelt;026C +lbopomofo;310C +lcaron;013E +lcedilla;013C +lcircle;24DB +lcircumflexbelow;1E3D +lcommaaccent;013C +ldot;0140 +ldotaccent;0140 +ldotbelow;1E37 +ldotbelowmacron;1E39 +leftangleabovecmb;031A +lefttackbelowcmb;0318 +less;003C +lessequal;2264 +lessequalorgreater;22DA +lessmonospace;FF1C +lessorequivalent;2272 +lessorgreater;2276 +lessoverequal;2266 +lesssmall;FE64 +lezh;026E +lfblock;258C +lhookretroflex;026D +lira;20A4 +liwnarmenian;056C +lj;01C9 +ljecyrillic;0459 +ll;F6C0 +lladeva;0933 +llagujarati;0AB3 +llinebelow;1E3B +llladeva;0934 +llvocalicbengali;09E1 +llvocalicdeva;0961 +llvocalicvowelsignbengali;09E3 +llvocalicvowelsigndeva;0963 +lmiddletilde;026B +lmonospace;FF4C +lmsquare;33D0 +lochulathai;0E2C +logicaland;2227 +logicalnot;00AC +logicalnotreversed;2310 +logicalor;2228 +lolingthai;0E25 +longs;017F +lowlinecenterline;FE4E +lowlinecmb;0332 +lowlinedashed;FE4D +lozenge;25CA +lparen;24A7 +lslash;0142 +lsquare;2113 +lsuperior;F6EE +ltshade;2591 +luthai;0E26 +lvocalicbengali;098C +lvocalicdeva;090C +lvocalicvowelsignbengali;09E2 +lvocalicvowelsigndeva;0962 +lxsquare;33D3 +m;006D +mabengali;09AE +macron;00AF +macronbelowcmb;0331 +macroncmb;0304 +macronlowmod;02CD +macronmonospace;FFE3 +macute;1E3F +madeva;092E +magujarati;0AAE +magurmukhi;0A2E +mahapakhhebrew;05A4 +mahapakhlefthebrew;05A4 +mahiragana;307E +maichattawalowleftthai;F895 +maichattawalowrightthai;F894 +maichattawathai;0E4B +maichattawaupperleftthai;F893 +maieklowleftthai;F88C +maieklowrightthai;F88B +maiekthai;0E48 +maiekupperleftthai;F88A +maihanakatleftthai;F884 +maihanakatthai;0E31 +maitaikhuleftthai;F889 +maitaikhuthai;0E47 +maitholowleftthai;F88F +maitholowrightthai;F88E +maithothai;0E49 +maithoupperleftthai;F88D +maitrilowleftthai;F892 +maitrilowrightthai;F891 +maitrithai;0E4A +maitriupperleftthai;F890 +maiyamokthai;0E46 +makatakana;30DE +makatakanahalfwidth;FF8F +male;2642 +mansyonsquare;3347 +maqafhebrew;05BE +mars;2642 +masoracirclehebrew;05AF +masquare;3383 +mbopomofo;3107 +mbsquare;33D4 +mcircle;24DC +mcubedsquare;33A5 +mdotaccent;1E41 +mdotbelow;1E43 +meemarabic;0645 +meemfinalarabic;FEE2 +meeminitialarabic;FEE3 +meemmedialarabic;FEE4 +meemmeeminitialarabic;FCD1 +meemmeemisolatedarabic;FC48 +meetorusquare;334D +mehiragana;3081 +meizierasquare;337E +mekatakana;30E1 +mekatakanahalfwidth;FF92 +mem;05DE +memdagesh;FB3E +memdageshhebrew;FB3E +memhebrew;05DE +menarmenian;0574 +merkhahebrew;05A5 +merkhakefulahebrew;05A6 +merkhakefulalefthebrew;05A6 +merkhalefthebrew;05A5 +mhook;0271 +mhzsquare;3392 +middledotkatakanahalfwidth;FF65 +middot;00B7 +mieumacirclekorean;3272 +mieumaparenkorean;3212 +mieumcirclekorean;3264 +mieumkorean;3141 +mieumpansioskorean;3170 +mieumparenkorean;3204 +mieumpieupkorean;316E +mieumsioskorean;316F +mihiragana;307F +mikatakana;30DF +mikatakanahalfwidth;FF90 +minus;2212 +minusbelowcmb;0320 +minuscircle;2296 +minusmod;02D7 +minusplus;2213 +minute;2032 +miribaarusquare;334A +mirisquare;3349 +mlonglegturned;0270 +mlsquare;3396 +mmcubedsquare;33A3 +mmonospace;FF4D +mmsquaredsquare;339F +mohiragana;3082 +mohmsquare;33C1 +mokatakana;30E2 +mokatakanahalfwidth;FF93 +molsquare;33D6 +momathai;0E21 +moverssquare;33A7 +moverssquaredsquare;33A8 +mparen;24A8 +mpasquare;33AB +mssquare;33B3 +msuperior;F6EF +mturned;026F +mu;00B5 +mu1;00B5 +muasquare;3382 +muchgreater;226B +muchless;226A +mufsquare;338C +mugreek;03BC +mugsquare;338D +muhiragana;3080 +mukatakana;30E0 +mukatakanahalfwidth;FF91 +mulsquare;3395 +multiply;00D7 +mumsquare;339B +munahhebrew;05A3 +munahlefthebrew;05A3 +musicalnote;266A +musicalnotedbl;266B +musicflatsign;266D +musicsharpsign;266F +mussquare;33B2 +muvsquare;33B6 +muwsquare;33BC +mvmegasquare;33B9 +mvsquare;33B7 +mwmegasquare;33BF +mwsquare;33BD +n;006E +nabengali;09A8 +nabla;2207 +nacute;0144 +nadeva;0928 +nagujarati;0AA8 +nagurmukhi;0A28 +nahiragana;306A +nakatakana;30CA +nakatakanahalfwidth;FF85 +napostrophe;0149 +nasquare;3381 +nbopomofo;310B +nbspace;00A0 +ncaron;0148 +ncedilla;0146 +ncircle;24DD +ncircumflexbelow;1E4B +ncommaaccent;0146 +ndotaccent;1E45 +ndotbelow;1E47 +nehiragana;306D +nekatakana;30CD +nekatakanahalfwidth;FF88 +newsheqelsign;20AA +nfsquare;338B +ngabengali;0999 +ngadeva;0919 +ngagujarati;0A99 +ngagurmukhi;0A19 +ngonguthai;0E07 +nhiragana;3093 +nhookleft;0272 +nhookretroflex;0273 +nieunacirclekorean;326F +nieunaparenkorean;320F +nieuncieuckorean;3135 +nieuncirclekorean;3261 +nieunhieuhkorean;3136 +nieunkorean;3134 +nieunpansioskorean;3168 +nieunparenkorean;3201 +nieunsioskorean;3167 +nieuntikeutkorean;3166 +nihiragana;306B +nikatakana;30CB +nikatakanahalfwidth;FF86 +nikhahitleftthai;F899 +nikhahitthai;0E4D +nine;0039 +ninearabic;0669 +ninebengali;09EF +ninecircle;2468 +ninecircleinversesansserif;2792 +ninedeva;096F +ninegujarati;0AEF +ninegurmukhi;0A6F +ninehackarabic;0669 +ninehangzhou;3029 +nineideographicparen;3228 +nineinferior;2089 +ninemonospace;FF19 +nineoldstyle;F739 +nineparen;247C +nineperiod;2490 +ninepersian;06F9 +nineroman;2178 +ninesuperior;2079 +nineteencircle;2472 +nineteenparen;2486 +nineteenperiod;249A +ninethai;0E59 +nj;01CC +njecyrillic;045A +nkatakana;30F3 +nkatakanahalfwidth;FF9D +nlegrightlong;019E +nlinebelow;1E49 +nmonospace;FF4E +nmsquare;339A +nnabengali;09A3 +nnadeva;0923 +nnagujarati;0AA3 +nnagurmukhi;0A23 +nnnadeva;0929 +nohiragana;306E +nokatakana;30CE +nokatakanahalfwidth;FF89 +nonbreakingspace;00A0 +nonenthai;0E13 +nonuthai;0E19 +noonarabic;0646 +noonfinalarabic;FEE6 +noonghunnaarabic;06BA +noonghunnafinalarabic;FB9F +noonhehinitialarabic;FEE7 FEEC +nooninitialarabic;FEE7 +noonjeeminitialarabic;FCD2 +noonjeemisolatedarabic;FC4B +noonmedialarabic;FEE8 +noonmeeminitialarabic;FCD5 +noonmeemisolatedarabic;FC4E +noonnoonfinalarabic;FC8D +notcontains;220C +notelement;2209 +notelementof;2209 +notequal;2260 +notgreater;226F +notgreaternorequal;2271 +notgreaternorless;2279 +notidentical;2262 +notless;226E +notlessnorequal;2270 +notparallel;2226 +notprecedes;2280 +notsubset;2284 +notsucceeds;2281 +notsuperset;2285 +nowarmenian;0576 +nparen;24A9 +nssquare;33B1 +nsuperior;207F +ntilde;00F1 +nu;03BD +nuhiragana;306C +nukatakana;30CC +nukatakanahalfwidth;FF87 +nuktabengali;09BC +nuktadeva;093C +nuktagujarati;0ABC +nuktagurmukhi;0A3C +numbersign;0023 +numbersignmonospace;FF03 +numbersignsmall;FE5F +numeralsigngreek;0374 +numeralsignlowergreek;0375 +numero;2116 +nun;05E0 +nundagesh;FB40 +nundageshhebrew;FB40 +nunhebrew;05E0 +nvsquare;33B5 +nwsquare;33BB +nyabengali;099E +nyadeva;091E +nyagujarati;0A9E +nyagurmukhi;0A1E +o;006F +oacute;00F3 +oangthai;0E2D +obarred;0275 +obarredcyrillic;04E9 +obarreddieresiscyrillic;04EB +obengali;0993 +obopomofo;311B +obreve;014F +ocandradeva;0911 +ocandragujarati;0A91 +ocandravowelsigndeva;0949 +ocandravowelsigngujarati;0AC9 +ocaron;01D2 +ocircle;24DE +ocircumflex;00F4 +ocircumflexacute;1ED1 +ocircumflexdotbelow;1ED9 +ocircumflexgrave;1ED3 +ocircumflexhookabove;1ED5 +ocircumflextilde;1ED7 +ocyrillic;043E +odblacute;0151 +odblgrave;020D +odeva;0913 +odieresis;00F6 +odieresiscyrillic;04E7 +odotbelow;1ECD +oe;0153 +oekorean;315A +ogonek;02DB +ogonekcmb;0328 +ograve;00F2 +ogujarati;0A93 +oharmenian;0585 +ohiragana;304A +ohookabove;1ECF +ohorn;01A1 +ohornacute;1EDB +ohorndotbelow;1EE3 +ohorngrave;1EDD +ohornhookabove;1EDF +ohorntilde;1EE1 +ohungarumlaut;0151 +oi;01A3 +oinvertedbreve;020F +okatakana;30AA +okatakanahalfwidth;FF75 +okorean;3157 +olehebrew;05AB +omacron;014D +omacronacute;1E53 +omacrongrave;1E51 +omdeva;0950 +omega;03C9 +omega1;03D6 +omegacyrillic;0461 +omegalatinclosed;0277 +omegaroundcyrillic;047B +omegatitlocyrillic;047D +omegatonos;03CE +omgujarati;0AD0 +omicron;03BF +omicrontonos;03CC +omonospace;FF4F +one;0031 +onearabic;0661 +onebengali;09E7 +onecircle;2460 +onecircleinversesansserif;278A +onedeva;0967 +onedotenleader;2024 +oneeighth;215B +onefitted;F6DC +onegujarati;0AE7 +onegurmukhi;0A67 +onehackarabic;0661 +onehalf;00BD +onehangzhou;3021 +oneideographicparen;3220 +oneinferior;2081 +onemonospace;FF11 +onenumeratorbengali;09F4 +oneoldstyle;F731 +oneparen;2474 +oneperiod;2488 +onepersian;06F1 +onequarter;00BC +oneroman;2170 +onesuperior;00B9 +onethai;0E51 +onethird;2153 +oogonek;01EB +oogonekmacron;01ED +oogurmukhi;0A13 +oomatragurmukhi;0A4B +oopen;0254 +oparen;24AA +openbullet;25E6 +option;2325 +ordfeminine;00AA +ordmasculine;00BA +orthogonal;221F +oshortdeva;0912 +oshortvowelsigndeva;094A +oslash;00F8 +oslashacute;01FF +osmallhiragana;3049 +osmallkatakana;30A9 +osmallkatakanahalfwidth;FF6B +ostrokeacute;01FF +osuperior;F6F0 +otcyrillic;047F +otilde;00F5 +otildeacute;1E4D +otildedieresis;1E4F +oubopomofo;3121 +overline;203E +overlinecenterline;FE4A +overlinecmb;0305 +overlinedashed;FE49 +overlinedblwavy;FE4C +overlinewavy;FE4B +overscore;00AF +ovowelsignbengali;09CB +ovowelsigndeva;094B +ovowelsigngujarati;0ACB +p;0070 +paampssquare;3380 +paasentosquare;332B +pabengali;09AA +pacute;1E55 +padeva;092A +pagedown;21DF +pageup;21DE +pagujarati;0AAA +pagurmukhi;0A2A +pahiragana;3071 +paiyannoithai;0E2F +pakatakana;30D1 +palatalizationcyrilliccmb;0484 +palochkacyrillic;04C0 +pansioskorean;317F +paragraph;00B6 +parallel;2225 +parenleft;0028 +parenleftaltonearabic;FD3E +parenleftbt;F8ED +parenleftex;F8EC +parenleftinferior;208D +parenleftmonospace;FF08 +parenleftsmall;FE59 +parenleftsuperior;207D +parenlefttp;F8EB +parenleftvertical;FE35 +parenright;0029 +parenrightaltonearabic;FD3F +parenrightbt;F8F8 +parenrightex;F8F7 +parenrightinferior;208E +parenrightmonospace;FF09 +parenrightsmall;FE5A +parenrightsuperior;207E +parenrighttp;F8F6 +parenrightvertical;FE36 +partialdiff;2202 +paseqhebrew;05C0 +pashtahebrew;0599 +pasquare;33A9 +patah;05B7 +patah11;05B7 +patah1d;05B7 +patah2a;05B7 +patahhebrew;05B7 +patahnarrowhebrew;05B7 +patahquarterhebrew;05B7 +patahwidehebrew;05B7 +pazerhebrew;05A1 +pbopomofo;3106 +pcircle;24DF +pdotaccent;1E57 +pe;05E4 +pecyrillic;043F +pedagesh;FB44 +pedageshhebrew;FB44 +peezisquare;333B +pefinaldageshhebrew;FB43 +peharabic;067E +peharmenian;057A +pehebrew;05E4 +pehfinalarabic;FB57 +pehinitialarabic;FB58 +pehiragana;307A +pehmedialarabic;FB59 +pekatakana;30DA +pemiddlehookcyrillic;04A7 +perafehebrew;FB4E +percent;0025 +percentarabic;066A +percentmonospace;FF05 +percentsmall;FE6A +period;002E +periodarmenian;0589 +periodcentered;00B7 +periodhalfwidth;FF61 +periodinferior;F6E7 +periodmonospace;FF0E +periodsmall;FE52 +periodsuperior;F6E8 +perispomenigreekcmb;0342 +perpendicular;22A5 +perthousand;2030 +peseta;20A7 +pfsquare;338A +phabengali;09AB +phadeva;092B +phagujarati;0AAB +phagurmukhi;0A2B +phi;03C6 +phi1;03D5 +phieuphacirclekorean;327A +phieuphaparenkorean;321A +phieuphcirclekorean;326C +phieuphkorean;314D +phieuphparenkorean;320C +philatin;0278 +phinthuthai;0E3A +phisymbolgreek;03D5 +phook;01A5 +phophanthai;0E1E +phophungthai;0E1C +phosamphaothai;0E20 +pi;03C0 +pieupacirclekorean;3273 +pieupaparenkorean;3213 +pieupcieuckorean;3176 +pieupcirclekorean;3265 +pieupkiyeokkorean;3172 +pieupkorean;3142 +pieupparenkorean;3205 +pieupsioskiyeokkorean;3174 +pieupsioskorean;3144 +pieupsiostikeutkorean;3175 +pieupthieuthkorean;3177 +pieuptikeutkorean;3173 +pihiragana;3074 +pikatakana;30D4 +pisymbolgreek;03D6 +piwrarmenian;0583 +plus;002B +plusbelowcmb;031F +pluscircle;2295 +plusminus;00B1 +plusmod;02D6 +plusmonospace;FF0B +plussmall;FE62 +plussuperior;207A +pmonospace;FF50 +pmsquare;33D8 +pohiragana;307D +pointingindexdownwhite;261F +pointingindexleftwhite;261C +pointingindexrightwhite;261E +pointingindexupwhite;261D +pokatakana;30DD +poplathai;0E1B +postalmark;3012 +postalmarkface;3020 +pparen;24AB +precedes;227A +prescription;211E +primemod;02B9 +primereversed;2035 +product;220F +projective;2305 +prolongedkana;30FC +propellor;2318 +propersubset;2282 +propersuperset;2283 +proportion;2237 +proportional;221D +psi;03C8 +psicyrillic;0471 +psilipneumatacyrilliccmb;0486 +pssquare;33B0 +puhiragana;3077 +pukatakana;30D7 +pvsquare;33B4 +pwsquare;33BA +q;0071 +qadeva;0958 +qadmahebrew;05A8 +qafarabic;0642 +qaffinalarabic;FED6 +qafinitialarabic;FED7 +qafmedialarabic;FED8 +qamats;05B8 +qamats10;05B8 +qamats1a;05B8 +qamats1c;05B8 +qamats27;05B8 +qamats29;05B8 +qamats33;05B8 +qamatsde;05B8 +qamatshebrew;05B8 +qamatsnarrowhebrew;05B8 +qamatsqatanhebrew;05B8 +qamatsqatannarrowhebrew;05B8 +qamatsqatanquarterhebrew;05B8 +qamatsqatanwidehebrew;05B8 +qamatsquarterhebrew;05B8 +qamatswidehebrew;05B8 +qarneyparahebrew;059F +qbopomofo;3111 +qcircle;24E0 +qhook;02A0 +qmonospace;FF51 +qof;05E7 +qofdagesh;FB47 +qofdageshhebrew;FB47 +qofhatafpatah;05E7 05B2 +qofhatafpatahhebrew;05E7 05B2 +qofhatafsegol;05E7 05B1 +qofhatafsegolhebrew;05E7 05B1 +qofhebrew;05E7 +qofhiriq;05E7 05B4 +qofhiriqhebrew;05E7 05B4 +qofholam;05E7 05B9 +qofholamhebrew;05E7 05B9 +qofpatah;05E7 05B7 +qofpatahhebrew;05E7 05B7 +qofqamats;05E7 05B8 +qofqamatshebrew;05E7 05B8 +qofqubuts;05E7 05BB +qofqubutshebrew;05E7 05BB +qofsegol;05E7 05B6 +qofsegolhebrew;05E7 05B6 +qofsheva;05E7 05B0 +qofshevahebrew;05E7 05B0 +qoftsere;05E7 05B5 +qoftserehebrew;05E7 05B5 +qparen;24AC +quarternote;2669 +qubuts;05BB +qubuts18;05BB +qubuts25;05BB +qubuts31;05BB +qubutshebrew;05BB +qubutsnarrowhebrew;05BB +qubutsquarterhebrew;05BB +qubutswidehebrew;05BB +question;003F +questionarabic;061F +questionarmenian;055E +questiondown;00BF +questiondownsmall;F7BF +questiongreek;037E +questionmonospace;FF1F +questionsmall;F73F +quotedbl;0022 +quotedblbase;201E +quotedblleft;201C +quotedblmonospace;FF02 +quotedblprime;301E +quotedblprimereversed;301D +quotedblright;201D +quoteleft;2018 +quoteleftreversed;201B +quotereversed;201B +quoteright;2019 +quoterightn;0149 +quotesinglbase;201A +quotesingle;0027 +quotesinglemonospace;FF07 +r;0072 +raarmenian;057C +rabengali;09B0 +racute;0155 +radeva;0930 +radical;221A +radicalex;F8E5 +radoverssquare;33AE +radoverssquaredsquare;33AF +radsquare;33AD +rafe;05BF +rafehebrew;05BF +ragujarati;0AB0 +ragurmukhi;0A30 +rahiragana;3089 +rakatakana;30E9 +rakatakanahalfwidth;FF97 +ralowerdiagonalbengali;09F1 +ramiddlediagonalbengali;09F0 +ramshorn;0264 +ratio;2236 +rbopomofo;3116 +rcaron;0159 +rcedilla;0157 +rcircle;24E1 +rcommaaccent;0157 +rdblgrave;0211 +rdotaccent;1E59 +rdotbelow;1E5B +rdotbelowmacron;1E5D +referencemark;203B +reflexsubset;2286 +reflexsuperset;2287 +registered;00AE +registersans;F8E8 +registerserif;F6DA +reharabic;0631 +reharmenian;0580 +rehfinalarabic;FEAE +rehiragana;308C +rehyehaleflamarabic;0631 FEF3 FE8E 0644 +rekatakana;30EC +rekatakanahalfwidth;FF9A +resh;05E8 +reshdageshhebrew;FB48 +reshhatafpatah;05E8 05B2 +reshhatafpatahhebrew;05E8 05B2 +reshhatafsegol;05E8 05B1 +reshhatafsegolhebrew;05E8 05B1 +reshhebrew;05E8 +reshhiriq;05E8 05B4 +reshhiriqhebrew;05E8 05B4 +reshholam;05E8 05B9 +reshholamhebrew;05E8 05B9 +reshpatah;05E8 05B7 +reshpatahhebrew;05E8 05B7 +reshqamats;05E8 05B8 +reshqamatshebrew;05E8 05B8 +reshqubuts;05E8 05BB +reshqubutshebrew;05E8 05BB +reshsegol;05E8 05B6 +reshsegolhebrew;05E8 05B6 +reshsheva;05E8 05B0 +reshshevahebrew;05E8 05B0 +reshtsere;05E8 05B5 +reshtserehebrew;05E8 05B5 +reversedtilde;223D +reviahebrew;0597 +reviamugrashhebrew;0597 +revlogicalnot;2310 +rfishhook;027E +rfishhookreversed;027F +rhabengali;09DD +rhadeva;095D +rho;03C1 +rhook;027D +rhookturned;027B +rhookturnedsuperior;02B5 +rhosymbolgreek;03F1 +rhotichookmod;02DE +rieulacirclekorean;3271 +rieulaparenkorean;3211 +rieulcirclekorean;3263 +rieulhieuhkorean;3140 +rieulkiyeokkorean;313A +rieulkiyeoksioskorean;3169 +rieulkorean;3139 +rieulmieumkorean;313B +rieulpansioskorean;316C +rieulparenkorean;3203 +rieulphieuphkorean;313F +rieulpieupkorean;313C +rieulpieupsioskorean;316B +rieulsioskorean;313D +rieulthieuthkorean;313E +rieultikeutkorean;316A +rieulyeorinhieuhkorean;316D +rightangle;221F +righttackbelowcmb;0319 +righttriangle;22BF +rihiragana;308A +rikatakana;30EA +rikatakanahalfwidth;FF98 +ring;02DA +ringbelowcmb;0325 +ringcmb;030A +ringhalfleft;02BF +ringhalfleftarmenian;0559 +ringhalfleftbelowcmb;031C +ringhalfleftcentered;02D3 +ringhalfright;02BE +ringhalfrightbelowcmb;0339 +ringhalfrightcentered;02D2 +rinvertedbreve;0213 +rittorusquare;3351 +rlinebelow;1E5F +rlongleg;027C +rlonglegturned;027A +rmonospace;FF52 +rohiragana;308D +rokatakana;30ED +rokatakanahalfwidth;FF9B +roruathai;0E23 +rparen;24AD +rrabengali;09DC +rradeva;0931 +rragurmukhi;0A5C +rreharabic;0691 +rrehfinalarabic;FB8D +rrvocalicbengali;09E0 +rrvocalicdeva;0960 +rrvocalicgujarati;0AE0 +rrvocalicvowelsignbengali;09C4 +rrvocalicvowelsigndeva;0944 +rrvocalicvowelsigngujarati;0AC4 +rsuperior;F6F1 +rtblock;2590 +rturned;0279 +rturnedsuperior;02B4 +ruhiragana;308B +rukatakana;30EB +rukatakanahalfwidth;FF99 +rupeemarkbengali;09F2 +rupeesignbengali;09F3 +rupiah;F6DD +ruthai;0E24 +rvocalicbengali;098B +rvocalicdeva;090B +rvocalicgujarati;0A8B +rvocalicvowelsignbengali;09C3 +rvocalicvowelsigndeva;0943 +rvocalicvowelsigngujarati;0AC3 +s;0073 +sabengali;09B8 +sacute;015B +sacutedotaccent;1E65 +sadarabic;0635 +sadeva;0938 +sadfinalarabic;FEBA +sadinitialarabic;FEBB +sadmedialarabic;FEBC +sagujarati;0AB8 +sagurmukhi;0A38 +sahiragana;3055 +sakatakana;30B5 +sakatakanahalfwidth;FF7B +sallallahoualayhewasallamarabic;FDFA +samekh;05E1 +samekhdagesh;FB41 +samekhdageshhebrew;FB41 +samekhhebrew;05E1 +saraaathai;0E32 +saraaethai;0E41 +saraaimaimalaithai;0E44 +saraaimaimuanthai;0E43 +saraamthai;0E33 +saraathai;0E30 +saraethai;0E40 +saraiileftthai;F886 +saraiithai;0E35 +saraileftthai;F885 +saraithai;0E34 +saraothai;0E42 +saraueeleftthai;F888 +saraueethai;0E37 +saraueleftthai;F887 +sarauethai;0E36 +sarauthai;0E38 +sarauuthai;0E39 +sbopomofo;3119 +scaron;0161 +scarondotaccent;1E67 +scedilla;015F +schwa;0259 +schwacyrillic;04D9 +schwadieresiscyrillic;04DB +schwahook;025A +scircle;24E2 +scircumflex;015D +scommaaccent;0219 +sdotaccent;1E61 +sdotbelow;1E63 +sdotbelowdotaccent;1E69 +seagullbelowcmb;033C +second;2033 +secondtonechinese;02CA +section;00A7 +seenarabic;0633 +seenfinalarabic;FEB2 +seeninitialarabic;FEB3 +seenmedialarabic;FEB4 +segol;05B6 +segol13;05B6 +segol1f;05B6 +segol2c;05B6 +segolhebrew;05B6 +segolnarrowhebrew;05B6 +segolquarterhebrew;05B6 +segoltahebrew;0592 +segolwidehebrew;05B6 +seharmenian;057D +sehiragana;305B +sekatakana;30BB +sekatakanahalfwidth;FF7E +semicolon;003B +semicolonarabic;061B +semicolonmonospace;FF1B +semicolonsmall;FE54 +semivoicedmarkkana;309C +semivoicedmarkkanahalfwidth;FF9F +sentisquare;3322 +sentosquare;3323 +seven;0037 +sevenarabic;0667 +sevenbengali;09ED +sevencircle;2466 +sevencircleinversesansserif;2790 +sevendeva;096D +seveneighths;215E +sevengujarati;0AED +sevengurmukhi;0A6D +sevenhackarabic;0667 +sevenhangzhou;3027 +sevenideographicparen;3226 +seveninferior;2087 +sevenmonospace;FF17 +sevenoldstyle;F737 +sevenparen;247A +sevenperiod;248E +sevenpersian;06F7 +sevenroman;2176 +sevensuperior;2077 +seventeencircle;2470 +seventeenparen;2484 +seventeenperiod;2498 +seventhai;0E57 +sfthyphen;00AD +shaarmenian;0577 +shabengali;09B6 +shacyrillic;0448 +shaddaarabic;0651 +shaddadammaarabic;FC61 +shaddadammatanarabic;FC5E +shaddafathaarabic;FC60 +shaddafathatanarabic;0651 064B +shaddakasraarabic;FC62 +shaddakasratanarabic;FC5F +shade;2592 +shadedark;2593 +shadelight;2591 +shademedium;2592 +shadeva;0936 +shagujarati;0AB6 +shagurmukhi;0A36 +shalshelethebrew;0593 +shbopomofo;3115 +shchacyrillic;0449 +sheenarabic;0634 +sheenfinalarabic;FEB6 +sheeninitialarabic;FEB7 +sheenmedialarabic;FEB8 +sheicoptic;03E3 +sheqel;20AA +sheqelhebrew;20AA +sheva;05B0 +sheva115;05B0 +sheva15;05B0 +sheva22;05B0 +sheva2e;05B0 +shevahebrew;05B0 +shevanarrowhebrew;05B0 +shevaquarterhebrew;05B0 +shevawidehebrew;05B0 +shhacyrillic;04BB +shimacoptic;03ED +shin;05E9 +shindagesh;FB49 +shindageshhebrew;FB49 +shindageshshindot;FB2C +shindageshshindothebrew;FB2C +shindageshsindot;FB2D +shindageshsindothebrew;FB2D +shindothebrew;05C1 +shinhebrew;05E9 +shinshindot;FB2A +shinshindothebrew;FB2A +shinsindot;FB2B +shinsindothebrew;FB2B +shook;0282 +sigma;03C3 +sigma1;03C2 +sigmafinal;03C2 +sigmalunatesymbolgreek;03F2 +sihiragana;3057 +sikatakana;30B7 +sikatakanahalfwidth;FF7C +siluqhebrew;05BD +siluqlefthebrew;05BD +similar;223C +sindothebrew;05C2 +siosacirclekorean;3274 +siosaparenkorean;3214 +sioscieuckorean;317E +sioscirclekorean;3266 +sioskiyeokkorean;317A +sioskorean;3145 +siosnieunkorean;317B +siosparenkorean;3206 +siospieupkorean;317D +siostikeutkorean;317C +six;0036 +sixarabic;0666 +sixbengali;09EC +sixcircle;2465 +sixcircleinversesansserif;278F +sixdeva;096C +sixgujarati;0AEC +sixgurmukhi;0A6C +sixhackarabic;0666 +sixhangzhou;3026 +sixideographicparen;3225 +sixinferior;2086 +sixmonospace;FF16 +sixoldstyle;F736 +sixparen;2479 +sixperiod;248D +sixpersian;06F6 +sixroman;2175 +sixsuperior;2076 +sixteencircle;246F +sixteencurrencydenominatorbengali;09F9 +sixteenparen;2483 +sixteenperiod;2497 +sixthai;0E56 +slash;002F +slashmonospace;FF0F +slong;017F +slongdotaccent;1E9B +smileface;263A +smonospace;FF53 +sofpasuqhebrew;05C3 +softhyphen;00AD +softsigncyrillic;044C +sohiragana;305D +sokatakana;30BD +sokatakanahalfwidth;FF7F +soliduslongoverlaycmb;0338 +solidusshortoverlaycmb;0337 +sorusithai;0E29 +sosalathai;0E28 +sosothai;0E0B +sosuathai;0E2A +space;0020 +spacehackarabic;0020 +spade;2660 +spadesuitblack;2660 +spadesuitwhite;2664 +sparen;24AE +squarebelowcmb;033B +squarecc;33C4 +squarecm;339D +squarediagonalcrosshatchfill;25A9 +squarehorizontalfill;25A4 +squarekg;338F +squarekm;339E +squarekmcapital;33CE +squareln;33D1 +squarelog;33D2 +squaremg;338E +squaremil;33D5 +squaremm;339C +squaremsquared;33A1 +squareorthogonalcrosshatchfill;25A6 +squareupperlefttolowerrightfill;25A7 +squareupperrighttolowerleftfill;25A8 +squareverticalfill;25A5 +squarewhitewithsmallblack;25A3 +srsquare;33DB +ssabengali;09B7 +ssadeva;0937 +ssagujarati;0AB7 +ssangcieuckorean;3149 +ssanghieuhkorean;3185 +ssangieungkorean;3180 +ssangkiyeokkorean;3132 +ssangnieunkorean;3165 +ssangpieupkorean;3143 +ssangsioskorean;3146 +ssangtikeutkorean;3138 +ssuperior;F6F2 +sterling;00A3 +sterlingmonospace;FFE1 +strokelongoverlaycmb;0336 +strokeshortoverlaycmb;0335 +subset;2282 +subsetnotequal;228A +subsetorequal;2286 +succeeds;227B +suchthat;220B +suhiragana;3059 +sukatakana;30B9 +sukatakanahalfwidth;FF7D +sukunarabic;0652 +summation;2211 +sun;263C +superset;2283 +supersetnotequal;228B +supersetorequal;2287 +svsquare;33DC +syouwaerasquare;337C +t;0074 +tabengali;09A4 +tackdown;22A4 +tackleft;22A3 +tadeva;0924 +tagujarati;0AA4 +tagurmukhi;0A24 +taharabic;0637 +tahfinalarabic;FEC2 +tahinitialarabic;FEC3 +tahiragana;305F +tahmedialarabic;FEC4 +taisyouerasquare;337D +takatakana;30BF +takatakanahalfwidth;FF80 +tatweelarabic;0640 +tau;03C4 +tav;05EA +tavdages;FB4A +tavdagesh;FB4A +tavdageshhebrew;FB4A +tavhebrew;05EA +tbar;0167 +tbopomofo;310A +tcaron;0165 +tccurl;02A8 +tcedilla;0163 +tcheharabic;0686 +tchehfinalarabic;FB7B +tchehinitialarabic;FB7C +tchehmedialarabic;FB7D +tchehmeeminitialarabic;FB7C FEE4 +tcircle;24E3 +tcircumflexbelow;1E71 +tcommaaccent;0163 +tdieresis;1E97 +tdotaccent;1E6B +tdotbelow;1E6D +tecyrillic;0442 +tedescendercyrillic;04AD +teharabic;062A +tehfinalarabic;FE96 +tehhahinitialarabic;FCA2 +tehhahisolatedarabic;FC0C +tehinitialarabic;FE97 +tehiragana;3066 +tehjeeminitialarabic;FCA1 +tehjeemisolatedarabic;FC0B +tehmarbutaarabic;0629 +tehmarbutafinalarabic;FE94 +tehmedialarabic;FE98 +tehmeeminitialarabic;FCA4 +tehmeemisolatedarabic;FC0E +tehnoonfinalarabic;FC73 +tekatakana;30C6 +tekatakanahalfwidth;FF83 +telephone;2121 +telephoneblack;260E +telishagedolahebrew;05A0 +telishaqetanahebrew;05A9 +tencircle;2469 +tenideographicparen;3229 +tenparen;247D +tenperiod;2491 +tenroman;2179 +tesh;02A7 +tet;05D8 +tetdagesh;FB38 +tetdageshhebrew;FB38 +tethebrew;05D8 +tetsecyrillic;04B5 +tevirhebrew;059B +tevirlefthebrew;059B +thabengali;09A5 +thadeva;0925 +thagujarati;0AA5 +thagurmukhi;0A25 +thalarabic;0630 +thalfinalarabic;FEAC +thanthakhatlowleftthai;F898 +thanthakhatlowrightthai;F897 +thanthakhatthai;0E4C +thanthakhatupperleftthai;F896 +theharabic;062B +thehfinalarabic;FE9A +thehinitialarabic;FE9B +thehmedialarabic;FE9C +thereexists;2203 +therefore;2234 +theta;03B8 +theta1;03D1 +thetasymbolgreek;03D1 +thieuthacirclekorean;3279 +thieuthaparenkorean;3219 +thieuthcirclekorean;326B +thieuthkorean;314C +thieuthparenkorean;320B +thirteencircle;246C +thirteenparen;2480 +thirteenperiod;2494 +thonangmonthothai;0E11 +thook;01AD +thophuthaothai;0E12 +thorn;00FE +thothahanthai;0E17 +thothanthai;0E10 +thothongthai;0E18 +thothungthai;0E16 +thousandcyrillic;0482 +thousandsseparatorarabic;066C +thousandsseparatorpersian;066C +three;0033 +threearabic;0663 +threebengali;09E9 +threecircle;2462 +threecircleinversesansserif;278C +threedeva;0969 +threeeighths;215C +threegujarati;0AE9 +threegurmukhi;0A69 +threehackarabic;0663 +threehangzhou;3023 +threeideographicparen;3222 +threeinferior;2083 +threemonospace;FF13 +threenumeratorbengali;09F6 +threeoldstyle;F733 +threeparen;2476 +threeperiod;248A +threepersian;06F3 +threequarters;00BE +threequartersemdash;F6DE +threeroman;2172 +threesuperior;00B3 +threethai;0E53 +thzsquare;3394 +tihiragana;3061 +tikatakana;30C1 +tikatakanahalfwidth;FF81 +tikeutacirclekorean;3270 +tikeutaparenkorean;3210 +tikeutcirclekorean;3262 +tikeutkorean;3137 +tikeutparenkorean;3202 +tilde;02DC +tildebelowcmb;0330 +tildecmb;0303 +tildecomb;0303 +tildedoublecmb;0360 +tildeoperator;223C +tildeoverlaycmb;0334 +tildeverticalcmb;033E +timescircle;2297 +tipehahebrew;0596 +tipehalefthebrew;0596 +tippigurmukhi;0A70 +titlocyrilliccmb;0483 +tiwnarmenian;057F +tlinebelow;1E6F +tmonospace;FF54 +toarmenian;0569 +tohiragana;3068 +tokatakana;30C8 +tokatakanahalfwidth;FF84 +tonebarextrahighmod;02E5 +tonebarextralowmod;02E9 +tonebarhighmod;02E6 +tonebarlowmod;02E8 +tonebarmidmod;02E7 +tonefive;01BD +tonesix;0185 +tonetwo;01A8 +tonos;0384 +tonsquare;3327 +topatakthai;0E0F +tortoiseshellbracketleft;3014 +tortoiseshellbracketleftsmall;FE5D +tortoiseshellbracketleftvertical;FE39 +tortoiseshellbracketright;3015 +tortoiseshellbracketrightsmall;FE5E +tortoiseshellbracketrightvertical;FE3A +totaothai;0E15 +tpalatalhook;01AB +tparen;24AF +trademark;2122 +trademarksans;F8EA +trademarkserif;F6DB +tretroflexhook;0288 +triagdn;25BC +triaglf;25C4 +triagrt;25BA +triagup;25B2 +ts;02A6 +tsadi;05E6 +tsadidagesh;FB46 +tsadidageshhebrew;FB46 +tsadihebrew;05E6 +tsecyrillic;0446 +tsere;05B5 +tsere12;05B5 +tsere1e;05B5 +tsere2b;05B5 +tserehebrew;05B5 +tserenarrowhebrew;05B5 +tserequarterhebrew;05B5 +tserewidehebrew;05B5 +tshecyrillic;045B +tsuperior;F6F3 +ttabengali;099F +ttadeva;091F +ttagujarati;0A9F +ttagurmukhi;0A1F +tteharabic;0679 +ttehfinalarabic;FB67 +ttehinitialarabic;FB68 +ttehmedialarabic;FB69 +tthabengali;09A0 +tthadeva;0920 +tthagujarati;0AA0 +tthagurmukhi;0A20 +tturned;0287 +tuhiragana;3064 +tukatakana;30C4 +tukatakanahalfwidth;FF82 +tusmallhiragana;3063 +tusmallkatakana;30C3 +tusmallkatakanahalfwidth;FF6F +twelvecircle;246B +twelveparen;247F +twelveperiod;2493 +twelveroman;217B +twentycircle;2473 +twentyhangzhou;5344 +twentyparen;2487 +twentyperiod;249B +two;0032 +twoarabic;0662 +twobengali;09E8 +twocircle;2461 +twocircleinversesansserif;278B +twodeva;0968 +twodotenleader;2025 +twodotleader;2025 +twodotleadervertical;FE30 +twogujarati;0AE8 +twogurmukhi;0A68 +twohackarabic;0662 +twohangzhou;3022 +twoideographicparen;3221 +twoinferior;2082 +twomonospace;FF12 +twonumeratorbengali;09F5 +twooldstyle;F732 +twoparen;2475 +twoperiod;2489 +twopersian;06F2 +tworoman;2171 +twostroke;01BB +twosuperior;00B2 +twothai;0E52 +twothirds;2154 +u;0075 +uacute;00FA +ubar;0289 +ubengali;0989 +ubopomofo;3128 +ubreve;016D +ucaron;01D4 +ucircle;24E4 +ucircumflex;00FB +ucircumflexbelow;1E77 +ucyrillic;0443 +udattadeva;0951 +udblacute;0171 +udblgrave;0215 +udeva;0909 +udieresis;00FC +udieresisacute;01D8 +udieresisbelow;1E73 +udieresiscaron;01DA +udieresiscyrillic;04F1 +udieresisgrave;01DC +udieresismacron;01D6 +udotbelow;1EE5 +ugrave;00F9 +ugujarati;0A89 +ugurmukhi;0A09 +uhiragana;3046 +uhookabove;1EE7 +uhorn;01B0 +uhornacute;1EE9 +uhorndotbelow;1EF1 +uhorngrave;1EEB +uhornhookabove;1EED +uhorntilde;1EEF +uhungarumlaut;0171 +uhungarumlautcyrillic;04F3 +uinvertedbreve;0217 +ukatakana;30A6 +ukatakanahalfwidth;FF73 +ukcyrillic;0479 +ukorean;315C +umacron;016B +umacroncyrillic;04EF +umacrondieresis;1E7B +umatragurmukhi;0A41 +umonospace;FF55 +underscore;005F +underscoredbl;2017 +underscoremonospace;FF3F +underscorevertical;FE33 +underscorewavy;FE4F +union;222A +universal;2200 +uogonek;0173 +uparen;24B0 +upblock;2580 +upperdothebrew;05C4 +upsilon;03C5 +upsilondieresis;03CB +upsilondieresistonos;03B0 +upsilonlatin;028A +upsilontonos;03CD +uptackbelowcmb;031D +uptackmod;02D4 +uragurmukhi;0A73 +uring;016F +ushortcyrillic;045E +usmallhiragana;3045 +usmallkatakana;30A5 +usmallkatakanahalfwidth;FF69 +ustraightcyrillic;04AF +ustraightstrokecyrillic;04B1 +utilde;0169 +utildeacute;1E79 +utildebelow;1E75 +uubengali;098A +uudeva;090A +uugujarati;0A8A +uugurmukhi;0A0A +uumatragurmukhi;0A42 +uuvowelsignbengali;09C2 +uuvowelsigndeva;0942 +uuvowelsigngujarati;0AC2 +uvowelsignbengali;09C1 +uvowelsigndeva;0941 +uvowelsigngujarati;0AC1 +v;0076 +vadeva;0935 +vagujarati;0AB5 +vagurmukhi;0A35 +vakatakana;30F7 +vav;05D5 +vavdagesh;FB35 +vavdagesh65;FB35 +vavdageshhebrew;FB35 +vavhebrew;05D5 +vavholam;FB4B +vavholamhebrew;FB4B +vavvavhebrew;05F0 +vavyodhebrew;05F1 +vcircle;24E5 +vdotbelow;1E7F +vecyrillic;0432 +veharabic;06A4 +vehfinalarabic;FB6B +vehinitialarabic;FB6C +vehmedialarabic;FB6D +vekatakana;30F9 +venus;2640 +verticalbar;007C +verticallineabovecmb;030D +verticallinebelowcmb;0329 +verticallinelowmod;02CC +verticallinemod;02C8 +vewarmenian;057E +vhook;028B +vikatakana;30F8 +viramabengali;09CD +viramadeva;094D +viramagujarati;0ACD +visargabengali;0983 +visargadeva;0903 +visargagujarati;0A83 +vmonospace;FF56 +voarmenian;0578 +voicediterationhiragana;309E +voicediterationkatakana;30FE +voicedmarkkana;309B +voicedmarkkanahalfwidth;FF9E +vokatakana;30FA +vparen;24B1 +vtilde;1E7D +vturned;028C +vuhiragana;3094 +vukatakana;30F4 +w;0077 +wacute;1E83 +waekorean;3159 +wahiragana;308F +wakatakana;30EF +wakatakanahalfwidth;FF9C +wakorean;3158 +wasmallhiragana;308E +wasmallkatakana;30EE +wattosquare;3357 +wavedash;301C +wavyunderscorevertical;FE34 +wawarabic;0648 +wawfinalarabic;FEEE +wawhamzaabovearabic;0624 +wawhamzaabovefinalarabic;FE86 +wbsquare;33DD +wcircle;24E6 +wcircumflex;0175 +wdieresis;1E85 +wdotaccent;1E87 +wdotbelow;1E89 +wehiragana;3091 +weierstrass;2118 +wekatakana;30F1 +wekorean;315E +weokorean;315D +wgrave;1E81 +whitebullet;25E6 +whitecircle;25CB +whitecircleinverse;25D9 +whitecornerbracketleft;300E +whitecornerbracketleftvertical;FE43 +whitecornerbracketright;300F +whitecornerbracketrightvertical;FE44 +whitediamond;25C7 +whitediamondcontainingblacksmalldiamond;25C8 +whitedownpointingsmalltriangle;25BF +whitedownpointingtriangle;25BD +whiteleftpointingsmalltriangle;25C3 +whiteleftpointingtriangle;25C1 +whitelenticularbracketleft;3016 +whitelenticularbracketright;3017 +whiterightpointingsmalltriangle;25B9 +whiterightpointingtriangle;25B7 +whitesmallsquare;25AB +whitesmilingface;263A +whitesquare;25A1 +whitestar;2606 +whitetelephone;260F +whitetortoiseshellbracketleft;3018 +whitetortoiseshellbracketright;3019 +whiteuppointingsmalltriangle;25B5 +whiteuppointingtriangle;25B3 +wihiragana;3090 +wikatakana;30F0 +wikorean;315F +wmonospace;FF57 +wohiragana;3092 +wokatakana;30F2 +wokatakanahalfwidth;FF66 +won;20A9 +wonmonospace;FFE6 +wowaenthai;0E27 +wparen;24B2 +wring;1E98 +wsuperior;02B7 +wturned;028D +wynn;01BF +x;0078 +xabovecmb;033D +xbopomofo;3112 +xcircle;24E7 +xdieresis;1E8D +xdotaccent;1E8B +xeharmenian;056D +xi;03BE +xmonospace;FF58 +xparen;24B3 +xsuperior;02E3 +y;0079 +yaadosquare;334E +yabengali;09AF +yacute;00FD +yadeva;092F +yaekorean;3152 +yagujarati;0AAF +yagurmukhi;0A2F +yahiragana;3084 +yakatakana;30E4 +yakatakanahalfwidth;FF94 +yakorean;3151 +yamakkanthai;0E4E +yasmallhiragana;3083 +yasmallkatakana;30E3 +yasmallkatakanahalfwidth;FF6C +yatcyrillic;0463 +ycircle;24E8 +ycircumflex;0177 +ydieresis;00FF +ydotaccent;1E8F +ydotbelow;1EF5 +yeharabic;064A +yehbarreearabic;06D2 +yehbarreefinalarabic;FBAF +yehfinalarabic;FEF2 +yehhamzaabovearabic;0626 +yehhamzaabovefinalarabic;FE8A +yehhamzaaboveinitialarabic;FE8B +yehhamzaabovemedialarabic;FE8C +yehinitialarabic;FEF3 +yehmedialarabic;FEF4 +yehmeeminitialarabic;FCDD +yehmeemisolatedarabic;FC58 +yehnoonfinalarabic;FC94 +yehthreedotsbelowarabic;06D1 +yekorean;3156 +yen;00A5 +yenmonospace;FFE5 +yeokorean;3155 +yeorinhieuhkorean;3186 +yerahbenyomohebrew;05AA +yerahbenyomolefthebrew;05AA +yericyrillic;044B +yerudieresiscyrillic;04F9 +yesieungkorean;3181 +yesieungpansioskorean;3183 +yesieungsioskorean;3182 +yetivhebrew;059A +ygrave;1EF3 +yhook;01B4 +yhookabove;1EF7 +yiarmenian;0575 +yicyrillic;0457 +yikorean;3162 +yinyang;262F +yiwnarmenian;0582 +ymonospace;FF59 +yod;05D9 +yoddagesh;FB39 +yoddageshhebrew;FB39 +yodhebrew;05D9 +yodyodhebrew;05F2 +yodyodpatahhebrew;FB1F +yohiragana;3088 +yoikorean;3189 +yokatakana;30E8 +yokatakanahalfwidth;FF96 +yokorean;315B +yosmallhiragana;3087 +yosmallkatakana;30E7 +yosmallkatakanahalfwidth;FF6E +yotgreek;03F3 +yoyaekorean;3188 +yoyakorean;3187 +yoyakthai;0E22 +yoyingthai;0E0D +yparen;24B4 +ypogegrammeni;037A +ypogegrammenigreekcmb;0345 +yr;01A6 +yring;1E99 +ysuperior;02B8 +ytilde;1EF9 +yturned;028E +yuhiragana;3086 +yuikorean;318C +yukatakana;30E6 +yukatakanahalfwidth;FF95 +yukorean;3160 +yusbigcyrillic;046B +yusbigiotifiedcyrillic;046D +yuslittlecyrillic;0467 +yuslittleiotifiedcyrillic;0469 +yusmallhiragana;3085 +yusmallkatakana;30E5 +yusmallkatakanahalfwidth;FF6D +yuyekorean;318B +yuyeokorean;318A +yyabengali;09DF +yyadeva;095F +z;007A +zaarmenian;0566 +zacute;017A +zadeva;095B +zagurmukhi;0A5B +zaharabic;0638 +zahfinalarabic;FEC6 +zahinitialarabic;FEC7 +zahiragana;3056 +zahmedialarabic;FEC8 +zainarabic;0632 +zainfinalarabic;FEB0 +zakatakana;30B6 +zaqefgadolhebrew;0595 +zaqefqatanhebrew;0594 +zarqahebrew;0598 +zayin;05D6 +zayindagesh;FB36 +zayindageshhebrew;FB36 +zayinhebrew;05D6 +zbopomofo;3117 +zcaron;017E +zcircle;24E9 +zcircumflex;1E91 +zcurl;0291 +zdot;017C +zdotaccent;017C +zdotbelow;1E93 +zecyrillic;0437 +zedescendercyrillic;0499 +zedieresiscyrillic;04DF +zehiragana;305C +zekatakana;30BC +zero;0030 +zeroarabic;0660 +zerobengali;09E6 +zerodeva;0966 +zerogujarati;0AE6 +zerogurmukhi;0A66 +zerohackarabic;0660 +zeroinferior;2080 +zeromonospace;FF10 +zerooldstyle;F730 +zeropersian;06F0 +zerosuperior;2070 +zerothai;0E50 +zerowidthjoiner;FEFF +zerowidthnonjoiner;200C +zerowidthspace;200B +zeta;03B6 +zhbopomofo;3113 +zhearmenian;056A +zhebrevecyrillic;04C2 +zhecyrillic;0436 +zhedescendercyrillic;0497 +zhedieresiscyrillic;04DD +zihiragana;3058 +zikatakana;30B8 +zinorhebrew;05AE +zlinebelow;1E95 +zmonospace;FF5A +zohiragana;305E +zokatakana;30BE +zparen;24B5 +zretroflexhook;0290 +zstroke;01B6 +zuhiragana;305A +zukatakana;30BA +""" + + +# string table management +# +class StringTable: + def __init__( self, name_list, master_table_name ): + self.names = name_list + self.master_table = master_table_name + self.indices = {} + index = 0 + + for name in name_list: + self.indices[name] = index + index += len( name ) + 1 + + self.total = index + + def dump( self, file ): + write = file.write + write( " static const char " + self.master_table + + "[" + repr( self.total ) + "] =\n" ) + write( " {\n" ) + + line = "" + for name in self.names: + line += " '" + line += string.join( ( re.findall( ".", name ) ), "','" ) + line += "', 0,\n" + + write( line + " };\n\n\n" ) + + def dump_sublist( self, file, table_name, macro_name, sublist ): + write = file.write + write( "#define " + macro_name + " " + repr( len( sublist ) ) + "\n\n" ) + + write( " /* Values are offsets into the `" + + self.master_table + "' table */\n\n" ) + write( " static const short " + table_name + + "[" + macro_name + "] =\n" ) + write( " {\n" ) + + line = " " + comma = "" + col = 0 + + for name in sublist: + line += comma + line += "%4d" % self.indices[name] + col += 1 + comma = "," + if col == 14: + col = 0 + comma = ",\n " + + write( line + "\n };\n\n\n" ) + + +# We now store the Adobe Glyph List in compressed form. The list is put +# into a data structure called `trie' (because it has a tree-like +# appearance). Consider, for example, that you want to store the +# following name mapping: +# +# A => 1 +# Aacute => 6 +# Abalon => 2 +# Abstract => 4 +# +# It is possible to store the entries as follows. +# +# A => 1 +# | +# +-acute => 6 +# | +# +-b +# | +# +-alon => 2 +# | +# +-stract => 4 +# +# We see that each node in the trie has: +# +# - one or more `letters' +# - an optional value +# - zero or more child nodes +# +# The first step is to call +# +# root = StringNode( "", 0 ) +# for word in map.values(): +# root.add( word, map[word] ) +# +# which creates a large trie where each node has only one children. +# +# Executing +# +# root = root.optimize() +# +# optimizes the trie by merging the letters of successive nodes whenever +# possible. +# +# Each node of the trie is stored as follows. +# +# - First the node's letter, according to the following scheme. We +# use the fact that in the AGL no name contains character codes > 127. +# +# name bitsize description +# ---------------------------------------------------------------- +# notlast 1 Set to 1 if this is not the last letter +# in the word. +# ascii 7 The letter's ASCII value. +# +# - The letter is followed by a children count and the value of the +# current key (if any). Again we can do some optimization because all +# AGL entries are from the BMP; this means that 16 bits are sufficient +# to store its Unicode values. Additionally, no node has more than +# 127 children. +# +# name bitsize description +# ----------------------------------------- +# hasvalue 1 Set to 1 if a 16-bit Unicode value follows. +# num_children 7 Number of children. Can be 0 only if +# `hasvalue' is set to 1. +# value 16 Optional Unicode value. +# +# - A node is finished by a list of 16bit absolute offsets to the +# children, which must be sorted in increasing order of their first +# letter. +# +# For simplicity, all 16bit quantities are stored in big-endian order. +# +# The root node has first letter = 0, and no value. +# +class StringNode: + def __init__( self, letter, value ): + self.letter = letter + self.value = value + self.children = {} + + def __cmp__( self, other ): + return ord( self.letter[0] ) - ord( other.letter[0] ) + + def add( self, word, value ): + if len( word ) == 0: + self.value = value + return + + letter = word[0] + word = word[1:] + + if self.children.has_key( letter ): + child = self.children[letter] + else: + child = StringNode( letter, 0 ) + self.children[letter] = child + + child.add( word, value ) + + def optimize( self ): + # optimize all children first + children = self.children.values() + self.children = {} + + for child in children: + self.children[child.letter[0]] = child.optimize() + + # don't optimize if there's a value, + # if we don't have any child or if we + # have more than one child + if ( self.value != 0 ) or ( not children ) or len( children ) > 1: + return self + + child = children[0] + + self.letter += child.letter + self.value = child.value + self.children = child.children + + return self + + def dump_debug( self, write, margin ): + # this is used during debugging + line = margin + "+-" + if len( self.letter ) == 0: + line += "" + else: + line += self.letter + + if self.value: + line += " => " + repr( self.value ) + + write( line + "\n" ) + + if self.children: + margin += "| " + for child in self.children.values(): + child.dump_debug( write, margin ) + + def locate( self, index ): + self.index = index + if len( self.letter ) > 0: + index += len( self.letter ) + 1 + else: + index += 2 + + if self.value != 0: + index += 2 + + children = self.children.values() + children.sort() + + index += 2 * len( children ) + for child in children: + index = child.locate( index ) + + return index + + def store( self, storage ): + # write the letters + l = len( self.letter ) + if l == 0: + storage += struct.pack( "B", 0 ) + else: + for n in range( l ): + val = ord( self.letter[n] ) + if n < l - 1: + val += 128 + storage += struct.pack( "B", val ) + + # write the count + children = self.children.values() + children.sort() + + count = len( children ) + + if self.value != 0: + storage += struct.pack( "!BH", count + 128, self.value ) + else: + storage += struct.pack( "B", count ) + + for child in children: + storage += struct.pack( "!H", child.index ) + + for child in children: + storage = child.store( storage ) + + return storage + + +def adobe_glyph_values(): + """return the list of glyph names and their unicode values""" + + lines = string.split( adobe_glyph_list, '\n' ) + glyphs = [] + values = [] + + for line in lines: + if line: + fields = string.split( line, ';' ) +# print fields[1] + ' - ' + fields[0] + subfields = string.split( fields[1], ' ' ) + if len( subfields ) == 1: + glyphs.append( fields[0] ) + values.append( fields[1] ) + + return glyphs, values + + +def filter_glyph_names( alist, filter ): + """filter `alist' by taking _out_ all glyph names that are in `filter'""" + + count = 0 + extras = [] + + for name in alist: + try: + filtered_index = filter.index( name ) + except: + extras.append( name ) + + return extras + + +def dump_encoding( file, encoding_name, encoding_list ): + """dump a given encoding""" + + write = file.write + write( " /* the following are indices into the SID name table */\n" ) + write( " static const unsigned short " + encoding_name + + "[" + repr( len( encoding_list ) ) + "] =\n" ) + write( " {\n" ) + + line = " " + comma = "" + col = 0 + for value in encoding_list: + line += comma + line += "%3d" % value + comma = "," + col += 1 + if col == 16: + col = 0 + comma = ",\n " + + write( line + "\n };\n\n\n" ) + + +def dump_array( the_array, write, array_name ): + """dumps a given encoding""" + + write( " static const unsigned char " + array_name + + "[" + repr( len( the_array ) ) + "L] =\n" ) + write( " {\n" ) + + line = "" + comma = " " + col = 0 + + for value in the_array: + line += comma + line += "%3d" % ord( value ) + comma = "," + col += 1 + + if col == 16: + col = 0 + comma = ",\n " + + if len( line ) > 1024: + write( line ) + line = "" + + write( line + "\n };\n\n\n" ) + + +def main(): + """main program body""" + + if len( sys.argv ) != 2: + print __doc__ % sys.argv[0] + sys.exit( 1 ) + + file = open( sys.argv[1], "w\n" ) + write = file.write + + count_sid = len( sid_standard_names ) + + # `mac_extras' contains the list of glyph names in the Macintosh standard + # encoding which are not in the SID Standard Names. + # + mac_extras = filter_glyph_names( mac_standard_names, sid_standard_names ) + + # `base_list' contains the names of our final glyph names table. + # It consists of the `mac_extras' glyph names, followed by the SID + # standard names. + # + mac_extras_count = len( mac_extras ) + base_list = mac_extras + sid_standard_names + + write( "/***************************************************************************/\n" ) + write( "/* */\n" ) + + write( "/* %-71s*/\n" % os.path.basename( sys.argv[1] ) ) + + write( "/* */\n" ) + write( "/* PostScript glyph names. */\n" ) + write( "/* */\n" ) + write( "/* Copyright 2005, 2008 by */\n" ) + write( "/* David Turner, Robert Wilhelm, and Werner Lemberg. */\n" ) + write( "/* */\n" ) + write( "/* This file is part of the FreeType project, and may only be used, */\n" ) + write( "/* modified, and distributed under the terms of the FreeType project */\n" ) + write( "/* license, LICENSE.TXT. By continuing to use, modify, or distribute */\n" ) + write( "/* this file you indicate that you have read the license and */\n" ) + write( "/* understand and accept it fully. */\n" ) + write( "/* */\n" ) + write( "/***************************************************************************/\n" ) + write( "\n" ) + write( "\n" ) + write( " /* This file has been generated automatically -- do not edit! */\n" ) + write( "\n" ) + write( "\n" ) + + # dump final glyph list (mac extras + sid standard names) + # + st = StringTable( base_list, "ft_standard_glyph_names" ) + + st.dump( file ) + st.dump_sublist( file, "ft_mac_names", + "FT_NUM_MAC_NAMES", mac_standard_names ) + st.dump_sublist( file, "ft_sid_names", + "FT_NUM_SID_NAMES", sid_standard_names ) + + dump_encoding( file, "t1_standard_encoding", t1_standard_encoding ) + dump_encoding( file, "t1_expert_encoding", t1_expert_encoding ) + + # dump the AGL in its compressed form + # + agl_glyphs, agl_values = adobe_glyph_values() + dict = StringNode( "", 0 ) + + for g in range( len( agl_glyphs ) ): + dict.add( agl_glyphs[g], eval( "0x" + agl_values[g] ) ) + + dict = dict.optimize() + dict_len = dict.locate( 0 ) + dict_array = dict.store( "" ) + + write( """\ + /* + * This table is a compressed version of the Adobe Glyph List (AGL), + * optimized for efficient searching. It has been generated by the + * `glnames.py' python script located in the `src/tools' directory. + * + * The lookup function to get the Unicode value for a given string + * is defined below the table. + */ + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + +""" ) + + dump_array( dict_array, write, "ft_adobe_glyph_list" ) + + # write the lookup routine now + # + write( """\ + /* + * This function searches the compressed table efficiently. + */ + static unsigned long + ft_get_adobe_glyph_index( const char* name, + const char* limit ) + { + int c = 0; + int count, min, max; + const unsigned char* p = ft_adobe_glyph_list; + + + if ( name == 0 || name >= limit ) + goto NotFound; + + c = *name++; + count = p[1]; + p += 2; + + min = 0; + max = count; + + while ( min < max ) + { + int mid = ( min + max ) >> 1; + const unsigned char* q = p + mid * 2; + int c2; + + + q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); + + c2 = q[0] & 127; + if ( c2 == c ) + { + p = q; + goto Found; + } + if ( c2 < c ) + min = mid + 1; + else + max = mid; + } + goto NotFound; + + Found: + for (;;) + { + /* assert (*p & 127) == c */ + + if ( name >= limit ) + { + if ( (p[0] & 128) == 0 && + (p[1] & 128) != 0 ) + return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); + + goto NotFound; + } + c = *name++; + if ( p[0] & 128 ) + { + p++; + if ( c != (p[0] & 127) ) + goto NotFound; + + continue; + } + + p++; + count = p[0] & 127; + if ( p[0] & 128 ) + p += 2; + + p++; + + for ( ; count > 0; count--, p += 2 ) + { + int offset = ( (int)p[0] << 8 ) | p[1]; + const unsigned char* q = ft_adobe_glyph_list + offset; + + if ( c == ( q[0] & 127 ) ) + { + p = q; + goto NextIter; + } + } + goto NotFound; + + NextIter: + ; + } + + NotFound: + return 0; + } + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + +""" ) + + if 0: # generate unit test, or don't + # + # now write the unit test to check that everything works OK + # + write( "#ifdef TEST\n\n" ) + + write( "static const char* const the_names[] = {\n" ) + for name in agl_glyphs: + write( ' "' + name + '",\n' ) + write( " 0\n};\n" ) + + write( "static const unsigned long the_values[] = {\n" ) + for val in agl_values: + write( ' 0x' + val + ',\n' ) + write( " 0\n};\n" ) + + write( """ +#include +#include + + int + main( void ) + { + int result = 0; + const char* const* names = the_names; + const unsigned long* values = the_values; + + + for ( ; *names; names++, values++ ) + { + const char* name = *names; + unsigned long reference = *values; + unsigned long value; + + + value = ft_get_adobe_glyph_index( name, name + strlen( name ) ); + if ( value != reference ) + { + result = 1; + fprintf( stderr, "name '%s' => %04x instead of %04x\\n", + name, value, reference ); + } + } + + return result; + } +""" ) + + write( "#endif /* TEST */\n" ) + + write("\n/* END */\n") + + +# Now run the main routine +# +main() + + +# END diff --git a/src/3rdparty/freetype/src/tools/test_afm.c b/src/3rdparty/freetype/src/tools/test_afm.c new file mode 100644 index 0000000000..d53cb33256 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/test_afm.c @@ -0,0 +1,157 @@ +/* + * gcc -DFT2_BUILD_LIBRARY -I../../include -o test_afm test_afm.c \ + * -L../../objs/.libs -lfreetype -lz -static + */ +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + void dump_fontinfo( AFM_FontInfo fi ) + { + FT_Int i; + + + printf( "This AFM is for %sCID font.\n\n", + ( fi->IsCIDFont ) ? "" : "non-" ); + + printf( "FontBBox: %.2f %.2f %.2f %.2f\n", fi->FontBBox.xMin / 65536., + fi->FontBBox.yMin / 65536., + fi->FontBBox.xMax / 65536., + fi->FontBBox.yMax / 65536. ); + printf( "Ascender: %.2f\n", fi->Ascender / 65536. ); + printf( "Descender: %.2f\n\n", fi->Descender / 65536. ); + + if ( fi->NumTrackKern ) + printf( "There are %d sets of track kernings:\n", + fi->NumTrackKern ); + else + printf( "There is no track kerning.\n" ); + + for ( i = 0; i < fi->NumTrackKern; i++ ) + { + AFM_TrackKern tk = fi->TrackKerns + i; + + + printf( "\t%2d: %5.2f %5.2f %5.2f %5.2f\n", tk->degree, + tk->min_ptsize / 65536., + tk->min_kern / 65536., + tk->max_ptsize / 65536., + tk->max_kern / 65536. ); + } + + printf( "\n" ); + + if ( fi->NumKernPair ) + printf( "There are %d kerning pairs:\n", + fi->NumKernPair ); + else + printf( "There is no kerning pair.\n" ); + + for ( i = 0; i < fi->NumKernPair; i++ ) + { + AFM_KernPair kp = fi->KernPairs + i; + + + printf( "\t%3d + %3d => (%4d, %4d)\n", kp->index1, + kp->index2, + kp->x, + kp->y ); + } + + } + + int + dummy_get_index( const char* name, + FT_UInt len, + void* user_data ) + { + if ( len ) + return name[0]; + else + return 0; + } + + FT_Error + parse_afm( FT_Library library, + FT_Stream stream, + AFM_FontInfo fi ) + { + PSAux_Service psaux; + AFM_ParserRec parser; + FT_Error error = FT_Err_Ok; + + + psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" ); + if ( !psaux || !psaux->afm_parser_funcs ) + return -1; + + error = FT_Stream_EnterFrame( stream, stream->size ); + if ( error ) + return error; + + error = psaux->afm_parser_funcs->init( &parser, + library->memory, + stream->cursor, + stream->limit ); + if ( error ) + return error; + + parser.FontInfo = fi; + parser.get_index = dummy_get_index; + + error = psaux->afm_parser_funcs->parse( &parser ); + + psaux->afm_parser_funcs->done( &parser ); + + return error; + } + + + int main( int argc, + char** argv ) + { + FT_Library library; + FT_StreamRec stream; + FT_Error error = FT_Err_Ok; + AFM_FontInfoRec fi; + + + if ( argc < 2 ) + return FT_Err_Invalid_Argument; + + error = FT_Init_FreeType( &library ); + if ( error ) + return error; + + FT_ZERO( &stream ); + error = FT_Stream_Open( &stream, argv[1] ); + if ( error ) + goto Exit; + stream.memory = library->memory; + + FT_ZERO( &fi ); + error = parse_afm( library, &stream, &fi ); + + if ( !error ) + { + FT_Memory memory = library->memory; + + + dump_fontinfo( &fi ); + + if ( fi.KernPairs ) + FT_FREE( fi.KernPairs ); + if ( fi.TrackKerns ) + FT_FREE( fi.TrackKerns ); + } + else + printf( "parse error\n" ); + + FT_Stream_Close( &stream ); + + Exit: + FT_Done_FreeType( library ); + + return error; + } diff --git a/src/3rdparty/freetype/src/tools/test_bbox.c b/src/3rdparty/freetype/src/tools/test_bbox.c new file mode 100644 index 0000000000..e085c5b3d6 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/test_bbox.c @@ -0,0 +1,160 @@ +#include +#include FT_FREETYPE_H +#include FT_BBOX_H + + +#include /* for clock() */ + +/* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include */ +/* to get the HZ macro which is the equivalent. */ +#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4) +#include +#define CLOCKS_PER_SEC HZ +#endif + + static long + get_time( void ) + { + return clock() * 10000L / CLOCKS_PER_SEC; + } + + + + + /* test bbox computations */ + +#define XSCALE 65536 +#define XX(x) ((FT_Pos)(x*XSCALE)) +#define XVEC(x,y) { XX(x), XX(y) } +#define XVAL(x) ((x)/(1.0*XSCALE)) + + /* dummy outline #1 */ + static FT_Vector dummy_vec_1[4] = + { +#if 1 + XVEC( 408.9111, 535.3164 ), + XVEC( 455.8887, 634.396 ), + XVEC( -37.8765, 786.2207 ), + XVEC( 164.6074, 535.3164 ) +#else + { (FT_Int32)0x0198E93DL , (FT_Int32)0x021750FFL }, /* 408.9111, 535.3164 */ + { (FT_Int32)0x01C7E312L , (FT_Int32)0x027A6560L }, /* 455.8887, 634.3960 */ + { (FT_Int32)0xFFDA1F9EL , (FT_Int32)0x0312387FL }, /* -37.8765, 786.2207 */ + { (FT_Int32)0x00A49B7EL , (FT_Int32)0x021750FFL } /* 164.6074, 535.3164 */ +#endif + }; + + static char dummy_tag_1[4] = + { + FT_CURVE_TAG_ON, + FT_CURVE_TAG_CUBIC, + FT_CURVE_TAG_CUBIC, + FT_CURVE_TAG_ON + }; + + static short dummy_contour_1[1] = + { + 3 + }; + + static FT_Outline dummy_outline_1 = + { + 1, + 4, + dummy_vec_1, + dummy_tag_1, + dummy_contour_1, + 0 + }; + + + /* dummy outline #2 */ + static FT_Vector dummy_vec_2[4] = + { + XVEC( 100.0, 100.0 ), + XVEC( 100.0, 200.0 ), + XVEC( 200.0, 200.0 ), + XVEC( 200.0, 133.0 ) + }; + + static FT_Outline dummy_outline_2 = + { + 1, + 4, + dummy_vec_2, + dummy_tag_1, + dummy_contour_1, + 0 + }; + + + static void + dump_outline( FT_Outline* outline ) + { + FT_BBox bbox; + + /* compute and display cbox */ + FT_Outline_Get_CBox( outline, &bbox ); + printf( "cbox = [%.2f %.2f %.2f %.2f]\n", + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + + /* compute and display bbox */ + FT_Outline_Get_BBox( outline, &bbox ); + printf( "bbox = [%.2f %.2f %.2f %.2f]\n", + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + } + + + + static void + profile_outline( FT_Outline* outline, + long repeat ) + { + FT_BBox bbox; + long count; + long time0; + + time0 = get_time(); + for ( count = repeat; count > 0; count-- ) + FT_Outline_Get_CBox( outline, &bbox ); + + time0 = get_time() - time0; + printf( "time = %5.2f cbox = [%.2f %.2f %.2f %.2f]\n", + ((double)time0/10000.0), + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + + + time0 = get_time(); + for ( count = repeat; count > 0; count-- ) + FT_Outline_Get_BBox( outline, &bbox ); + + time0 = get_time() - time0; + printf( "time = %5.2f bbox = [%.2f %.2f %.2f %.2f]\n", + ((double)time0/10000.0), + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + } + +#define REPEAT 100000L + + int main( int argc, char** argv ) + { + printf( "outline #1\n" ); + profile_outline( &dummy_outline_1, REPEAT ); + + printf( "outline #2\n" ); + profile_outline( &dummy_outline_2, REPEAT ); + return 0; + } + diff --git a/src/3rdparty/freetype/src/tools/test_trig.c b/src/3rdparty/freetype/src/tools/test_trig.c new file mode 100644 index 0000000000..8c8a544aa9 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/test_trig.c @@ -0,0 +1,236 @@ +#include +#include FT_FREETYPE_H +#include FT_TRIGONOMETRY_H + +#include +#include + +#define PI 3.14159265358979323846 +#define SPI (PI/FT_ANGLE_PI) + +/* the precision in 16.16 fixed float points of the checks. Expect */ +/* between 2 and 5 noise LSB bits during operations, due to */ +/* rounding errors.. */ +#define THRESHOLD 64 + + static error = 0; + + static void + test_cos( void ) + { + FT_Fixed f1, f2; + double d1, d2; + int i; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + f1 = FT_Cos(i); + d1 = f1/65536.0; + d2 = cos( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Cos[%3d] = %.7f cos[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + + static void + test_sin( void ) + { + FT_Fixed f1, f2; + double d1, d2; + int i; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + f1 = FT_Sin(i); + d1 = f1/65536.0; + d2 = sin( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Sin[%3d] = %.7f sin[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + static void + test_tan( void ) + { + FT_Fixed f1, f2; + double d1, d2; + int i; + + for ( i = 0; i < FT_ANGLE_PI2-0x2000000; i += 0x10000 ) + { + f1 = FT_Tan(i); + d1 = f1/65536.0; + d2 = tan( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Tan[%3d] = %.7f tan[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + static void + test_atan2( void ) + { + FT_Fixed c2, s2; + double l, a, c1, s1; + int i, j; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + l = 5.0; + a = i*SPI; + + c1 = l * cos(a); + s1 = l * sin(a); + + c2 = (FT_Fixed)(c1*65536.0); + s2 = (FT_Fixed)(s1*65536.0); + + j = FT_Atan2( c2, s2 ); + if ( j < 0 ) + j += FT_ANGLE_2PI; + + if ( abs( i - j ) > 1 ) + { + printf( "FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\n", + c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 ); + } + } + } + + static void + test_unit( void ) + { + FT_Vector v; + double a, c1, s1; + FT_Fixed c2, s2; + int i; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + FT_Vector_Unit( &v, i ); + a = ( i*SPI ); + c1 = cos(a); + s1 = sin(a); + c2 = (FT_Fixed)(c1*65536.0); + s2 = (FT_Fixed)(s1*65536.0); + + if ( abs( v.x-c2 ) > THRESHOLD || + abs( v.y-s2 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Vector_Unit[%3d] = ( %.7f, %.7f ) vec = ( %.7f, %.7f )\n", + (i >> 16), + v.x/65536.0, v.y/65536.0, + c1, s1 ); + } + } + } + + + static void + test_length( void ) + { + FT_Vector v; + FT_Fixed l, l2; + int i; + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + l = (FT_Fixed)(500.0*65536.0); + v.x = (FT_Fixed)( l * cos( i*SPI ) ); + v.y = (FT_Fixed)( l * sin( i*SPI ) ); + l2 = FT_Vector_Length( &v ); + + if ( abs( l2-l ) > THRESHOLD ) + { + error = 1; + printf( "FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\n", + v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 ); + } + } + } + + + static void + test_rotate( void ) + { + FT_Fixed c2, s2, c4, s4; + FT_Vector v; + double l, ra, a, c1, s1, cra, sra, c3, s3; + int i, j, rotate; + + for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000 ) + { + ra = rotate*SPI; + cra = cos( ra ); + sra = sin( ra ); + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) + { + l = 500.0; + a = i*SPI; + + c1 = l * cos(a); + s1 = l * sin(a); + + v.x = c2 = (FT_Fixed)(c1*65536.0); + v.y = s2 = (FT_Fixed)(s1*65536.0); + + FT_Vector_Rotate( &v, rotate ); + + c3 = c1 * cra - s1 * sra; + s3 = c1 * sra + s1 * cra; + + c4 = (FT_Fixed)(c3*65536.0); + s4 = (FT_Fixed)(s3*65536.0); + + if ( abs( c4 - v.x ) > THRESHOLD || + abs( s4 - v.y ) > THRESHOLD ) + { + error = 1; + printf( "FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\n", + c1, s1, ra, + c2/65536.0, s2/65536.0, + c4/65536.0, s4/65536.0 ); + } + } + } + } + + + int main( void ) + { + test_cos(); + test_sin(); + test_tan(); + test_atan2(); + test_unit(); + test_length(); + test_rotate(); + + if (!error) + printf( "trigonometry test ok !\n" ); + + return !error; + } diff --git a/src/3rdparty/freetype/src/truetype/Jamfile b/src/3rdparty/freetype/src/truetype/Jamfile new file mode 100644 index 0000000000..a166909f4c --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/truetype Jamfile +# +# Copyright 2001, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) truetype ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ; + } + else + { + _sources = truetype ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/truetype Jamfile diff --git a/src/3rdparty/freetype/src/truetype/module.mk b/src/3rdparty/freetype/src/truetype/module.mk new file mode 100644 index 0000000000..baee81a773 --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 TrueType module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TRUETYPE_DRIVER + +define TRUETYPE_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)truetype $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/truetype/rules.mk b/src/3rdparty/freetype/src/truetype/rules.mk new file mode 100644 index 0000000000..74684260ed --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 TrueType driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# TrueType driver directory +# +TT_DIR := $(SRC_DIR)/truetype + + +# compilation flags for the driver +# +TT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(TT_DIR)) + + +# TrueType driver sources (i.e., C files) +# +TT_DRV_SRC := $(TT_DIR)/ttobjs.c \ + $(TT_DIR)/ttpload.c \ + $(TT_DIR)/ttgload.c \ + $(TT_DIR)/ttinterp.c \ + $(TT_DIR)/ttgxvar.c \ + $(TT_DIR)/ttdriver.c + +# TrueType driver headers +# +TT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \ + $(TT_DIR)/tterrors.h + + +# TrueType driver object(s) +# +# TT_DRV_OBJ_M is used during `multi' builds +# TT_DRV_OBJ_S is used during `single' builds +# +TT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O) +TT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O + +# TrueType driver source file for single build +# +TT_DRV_SRC_S := $(TT_DIR)/truetype.c + + +# TrueType driver - single object +# +$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H) + $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S)) + + +# driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H) + $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(TT_DRV_OBJ_S) +DRV_OBJS_M += $(TT_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/truetype/truetype.c b/src/3rdparty/freetype/src/truetype/truetype.c new file mode 100644 index 0000000000..b36473a72d --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/truetype.c @@ -0,0 +1,36 @@ +/***************************************************************************/ +/* */ +/* truetype.c */ +/* */ +/* FreeType TrueType driver component (body only). */ +/* */ +/* Copyright 1996-2001, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include +#include "ttdriver.c" /* driver interface */ +#include "ttpload.c" /* tables loader */ +#include "ttgload.c" /* glyph loader */ +#include "ttobjs.c" /* object manager */ + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.c" +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.c" /* gx distortable font */ +#endif + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttdriver.c b/src/3rdparty/freetype/src/truetype/ttdriver.c new file mode 100644 index 0000000000..42feb05ede --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttdriver.c @@ -0,0 +1,474 @@ +/***************************************************************************/ +/* */ +/* ttdriver.c */ +/* */ +/* TrueType font driver implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_IDS_H +#include FT_SERVICE_XFREE86_NAME_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + +#include FT_SERVICE_TRUETYPE_ENGINE_H +#include FT_SERVICE_TRUETYPE_GLYF_H + +#include "ttdriver.h" +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#undef PAIR_TAG +#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ + (FT_ULong)right ) + + + /*************************************************************************/ + /* */ + /* */ + /* tt_get_kerning */ + /* */ + /* */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings, are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + static FT_Error + tt_get_kerning( FT_Face ttface, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face face = (TT_Face)ttface; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + + return 0; + } + + +#undef PAIR_TAG + + + static FT_Error + tt_get_advances( FT_Face ttface, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *advances ) + { + FT_UInt nn; + TT_Face face = (TT_Face) ttface; + FT_Bool check = FT_BOOL( + !( flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) ); + + + /* XXX: TODO: check for sbits */ + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + { + for ( nn = 0; nn < count; nn++ ) + { + FT_Short tsb; + FT_UShort ah; + + + TT_Get_VMetrics( face, start + nn, check, &tsb, &ah ); + advances[nn] = ah; + } + } + else + { + for ( nn = 0; nn < count; nn++ ) + { + FT_Short lsb; + FT_UShort aw; + + + TT_Get_HMetrics( face, start + nn, check, &lsb, &aw ); + advances[nn] = aw; + } + } + + return TT_Err_Ok; + } + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S I Z E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + tt_size_select( FT_Size size, + FT_ULong strike_index ) + { + TT_Face ttface = (TT_Face)size->face; + TT_Size ttsize = (TT_Size)size; + FT_Error error = TT_Err_Ok; + + + ttsize->strike_index = strike_index; + + if ( FT_IS_SCALABLE( size->face ) ) + { + /* use the scaled metrics, even when tt_size_reset fails */ + FT_Select_Metrics( size->face, strike_index ); + + tt_size_reset( ttsize ); + } + else + { + SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; + FT_Size_Metrics* metrics = &size->metrics; + + + error = sfnt->load_strike_metrics( ttface, strike_index, metrics ); + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_size_request( FT_Size size, + FT_Size_Request req ) + { + TT_Size ttsize = (TT_Size)size; + FT_Error error = TT_Err_Ok; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + TT_Face ttface = (TT_Face)size->face; + SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; + FT_ULong strike_index; + + + error = sfnt->set_sbit_strike( ttface, req, &strike_index ); + + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + else + return tt_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + FT_Request_Metrics( size->face, req ); + + if ( FT_IS_SCALABLE( size->face ) ) + error = tt_size_reset( ttsize ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Load_Glyph */ + /* */ + /* */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* */ + /* slot :: A handle to the target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled, loaded, etc. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_Glyph( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ + FT_Size ttsize, /* TT_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; + TT_Size size = (TT_Size)ttsize; + FT_Face face = ttslot->face; + FT_Error error; + + + if ( !slot ) + return TT_Err_Invalid_Slot_Handle; + + if ( !size ) + return TT_Err_Invalid_Size_Handle; + + if ( !face || glyph_index >= (FT_UInt)face->num_glyphs ) + return TT_Err_Invalid_Argument; + + if ( load_flags & FT_LOAD_NO_HINTING ) + { + /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */ + /* are necessary to disable hinting for tricky fonts */ + + if ( FT_IS_TRICKY( face ) ) + load_flags &= ~FT_LOAD_NO_HINTING; + + if ( load_flags & FT_LOAD_NO_AUTOHINT ) + load_flags |= FT_LOAD_NO_HINTING; + } + + if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) + { + load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE; + + if ( !FT_IS_TRICKY( face ) ) + load_flags |= FT_LOAD_NO_HINTING; + } + + /* now load the glyph outline if necessary */ + error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + static const FT_Service_MultiMastersRec tt_service_gx_multi_masters = + { + (FT_Get_MM_Func) NULL, + (FT_Set_MM_Design_Func) NULL, + (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, + (FT_Get_MM_Var_Func) TT_Get_MM_Var, + (FT_Set_Var_Design_Func)TT_Set_Var_Design + }; +#endif + + static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = + { +#ifdef TT_USE_BYTECODE_INTERPRETER + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED +#else + FT_TRUETYPE_ENGINE_TYPE_PATENTED +#endif + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_TRUETYPE_ENGINE_TYPE_NONE + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + }; + + static const FT_Service_TTGlyfRec tt_service_truetype_glyf = + { + (TT_Glyf_GetLocationFunc)tt_face_get_location + }; + + static const FT_ServiceDescRec tt_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE }, +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { FT_SERVICE_ID_MULTI_MASTERS, &tt_service_gx_multi_masters }, +#endif + { FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine }, + { FT_SERVICE_ID_TT_GLYF, &tt_service_truetype_glyf }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + tt_get_interface( FT_Module driver, /* TT_Driver */ + const char* tt_interface ) + { + FT_Module_Interface result; + FT_Module sfntd; + SFNT_Service sfnt; + + + result = ft_service_list_lookup( tt_services, tt_interface ); + if ( result != NULL ) + return result; + + /* only return the default interface from the SFNT module */ + sfntd = FT_Get_Module( driver->library, "sfnt" ); + if ( sfntd ) + { + sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); + if ( sfnt ) + return sfnt->get_interface( driver, tt_interface ); + } + + return 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec tt_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_MODULE_DRIVER_HAS_HINTER, +#else + 0, +#endif + + sizeof ( TT_DriverRec ), + + "truetype", /* driver name */ + 0x10000L, /* driver version == 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or above */ + + (void*)0, /* driver specific interface */ + + tt_driver_init, + tt_driver_done, + tt_get_interface, + }, + + sizeof ( TT_FaceRec ), + sizeof ( TT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + tt_face_init, + tt_face_done, + tt_size_init, + tt_size_done, + tt_slot_init, + 0, /* FT_Slot_DoneFunc */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + Load_Glyph, + + tt_get_kerning, + 0, /* FT_Face_AttachFunc */ + tt_get_advances, + + tt_size_request, +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + tt_size_select +#else + 0 /* FT_Size_SelectFunc */ +#endif + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttdriver.h b/src/3rdparty/freetype/src/truetype/ttdriver.h new file mode 100644 index 0000000000..f6f26e4b59 --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttdriver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* ttdriver.h */ +/* */ +/* High-level TrueType driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTDRIVER_H__ +#define __TTDRIVER_H__ + + +#include +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) tt_driver_class; + + +FT_END_HEADER + +#endif /* __TTDRIVER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/tterrors.h b/src/3rdparty/freetype/src/truetype/tterrors.h new file mode 100644 index 0000000000..d317c70e0e --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/tterrors.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* tterrors.h */ +/* */ +/* TrueType error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the TrueType error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __TTERRORS_H__ +#define __TTERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX TT_Err_ +#define FT_ERR_BASE FT_Mod_Err_TrueType + +#include FT_ERRORS_H + +#endif /* __TTERRORS_H__ */ + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttgload.c b/src/3rdparty/freetype/src/truetype/ttgload.c new file mode 100644 index 0000000000..06e9ccd1d8 --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttgload.c @@ -0,0 +1,2022 @@ +/***************************************************************************/ +/* */ +/* ttgload.c */ +/* */ +/* TrueType Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_TAGS_H +#include FT_OUTLINE_H + +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttgload + + + /*************************************************************************/ + /* */ + /* Composite font flags. */ + /* */ +#define ARGS_ARE_WORDS 0x0001 +#define ARGS_ARE_XY_VALUES 0x0002 +#define ROUND_XY_TO_GRID 0x0004 +#define WE_HAVE_A_SCALE 0x0008 +/* reserved 0x0010 */ +#define MORE_COMPONENTS 0x0020 +#define WE_HAVE_AN_XY_SCALE 0x0040 +#define WE_HAVE_A_2X2 0x0080 +#define WE_HAVE_INSTR 0x0100 +#define USE_MY_METRICS 0x0200 +#define OVERLAP_COMPOUND 0x0400 +#define SCALED_COMPONENT_OFFSET 0x0800 +#define UNSCALED_COMPONENT_OFFSET 0x1000 + + + /*************************************************************************/ + /* */ + /* Returns the horizontal metrics in font units for a given glyph. If */ + /* `check' is true, take care of monospaced fonts by returning the */ + /* advance width maximum. */ + /* */ + FT_LOCAL_DEF(void) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* lsb, + FT_UShort* aw ) + { + ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw ); + + if ( check && face->postscript.isFixedPitch ) + *aw = face->horizontal.advance_Width_Max; + } + + + /*************************************************************************/ + /* */ + /* Returns the vertical metrics in font units for a given glyph. */ + /* Greg Hitchcock from Microsoft told us that if there were no `vmtx' */ + /* table, typoAscender/Descender from the `OS/2' table would be used */ + /* instead, and if there were no `OS/2' table, use ascender/descender */ + /* from the `hhea' table. But that is not what Microsoft's rasterizer */ + /* apparently does: It uses the ppem value as the advance height, and */ + /* sets the top side bearing to be zero. */ + /* */ + /* The monospace `check' is probably not meaningful here, but we leave */ + /* it in for a consistent interface. */ + /* */ + FT_LOCAL_DEF(void) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* tsb, + FT_UShort* ah ) + { + FT_UNUSED( check ); + + if ( face->vertical_info ) + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah ); + +#if 1 /* Empirically determined, at variance with what MS said */ + + else + { + *tsb = 0; + *ah = face->root.units_per_EM; + } + +#else /* This is what MS said to do. It isn't what they do, however. */ + + else if ( face->os2.version != 0xFFFFU ) + { + *tsb = face->os2.sTypoAscender; + *ah = face->os2.sTypoAscender - face->os2.sTypoDescender; + } + else + { + *tsb = face->horizontal.Ascender; + *ah = face->horizontal.Ascender - face->horizontal.Descender; + } + +#endif + + } + + + /*************************************************************************/ + /* */ + /* Translates an array of coordinates. */ + /* */ + static void + translate_array( FT_UInt n, + FT_Vector* coords, + FT_Pos delta_x, + FT_Pos delta_y ) + { + FT_UInt k; + + + if ( delta_x ) + for ( k = 0; k < n; k++ ) + coords[k].x += delta_x; + + if ( delta_y ) + for ( k = 0; k < n; k++ ) + coords[k].y += delta_y; + } + + +#undef IS_HINTED +#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) + + + /*************************************************************************/ + /* */ + /* The following functions are used by default with TrueType fonts. */ + /* However, they can be replaced by alternatives if we need to support */ + /* TrueType-compressed formats (like MicroType) in the future. */ + /* */ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + TT_Access_Glyph_Frame( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ) + { + FT_Error error; + FT_Stream stream = loader->stream; + + /* for non-debug mode */ + FT_UNUSED( glyph_index ); + + + FT_TRACE5(( "Glyph %ld\n", glyph_index )); + + /* the following line sets the `error' variable through macros! */ + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) + return error; + + loader->cursor = stream->cursor; + loader->limit = stream->limit; + + return TT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + TT_Forget_Glyph_Frame( TT_Loader loader ) + { + FT_Stream stream = loader->stream; + + + FT_FRAME_EXIT(); + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Glyph_Header( TT_Loader loader ) + { + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + + + if ( p + 10 > limit ) + return TT_Err_Invalid_Outline; + + loader->n_contours = FT_NEXT_SHORT( p ); + + loader->bbox.xMin = FT_NEXT_SHORT( p ); + loader->bbox.yMin = FT_NEXT_SHORT( p ); + loader->bbox.xMax = FT_NEXT_SHORT( p ); + loader->bbox.yMax = FT_NEXT_SHORT( p ); + + FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); + FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, + loader->bbox.xMax )); + FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, + loader->bbox.yMax )); + loader->cursor = p; + + return TT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Simple_Glyph( TT_Loader load ) + { + FT_Error error; + FT_Byte* p = load->cursor; + FT_Byte* limit = load->limit; + FT_GlyphLoader gloader = load->gloader; + FT_Int n_contours = load->n_contours; + FT_Outline* outline; + TT_Face face = (TT_Face)load->face; + FT_UShort n_ins; + FT_Int n_points; + + FT_Byte *flag, *flag_limit; + FT_Byte c, count; + FT_Vector *vec, *vec_limit; + FT_Pos x; + FT_Short *cont, *cont_limit, prev_cont; + FT_Int xy_size = 0; + + + /* check that we can add the contours to the glyph */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours ); + if ( error ) + goto Fail; + + /* reading the contours' endpoints & number of points */ + cont = gloader->current.outline.contours; + cont_limit = cont + n_contours; + + /* check space for contours array + instructions count */ + if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) + goto Invalid_Outline; + + prev_cont = FT_NEXT_USHORT( p ); + + if ( n_contours > 0 ) + cont[0] = prev_cont; + + for ( cont++; cont < cont_limit; cont++ ) + { + cont[0] = FT_NEXT_USHORT( p ); + if ( cont[0] <= prev_cont ) + { + /* unordered contours: this is invalid */ + error = FT_Err_Invalid_Table; + goto Fail; + } + prev_cont = cont[0]; + } + + n_points = 0; + if ( n_contours > 0 ) + { + n_points = cont[-1] + 1; + if ( n_points < 0 ) + goto Invalid_Outline; + } + + /* note that we will add four phantom points later */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); + if ( error ) + goto Fail; + + /* we'd better check the contours table right now */ + outline = &gloader->current.outline; + + for ( cont = outline->contours + 1; cont < cont_limit; cont++ ) + if ( cont[-1] >= cont[0] ) + goto Invalid_Outline; + + /* reading the bytecode instructions */ + load->glyph->control_len = 0; + load->glyph->control_data = 0; + + if ( p + 2 > limit ) + goto Invalid_Outline; + + n_ins = FT_NEXT_USHORT( p ); + + FT_TRACE5(( " Instructions size: %u\n", n_ins )); + + if ( n_ins > face->max_profile.maxSizeOfInstructions ) + { + FT_TRACE0(( "TT_Load_Simple_Glyph: Too many instructions (%d)\n", + n_ins )); + error = TT_Err_Too_Many_Hints; + goto Fail; + } + + if ( ( limit - p ) < n_ins ) + { + FT_TRACE0(( "TT_Load_Simple_Glyph: Instruction count mismatch!\n" )); + error = TT_Err_Too_Many_Hints; + goto Fail; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load->load_flags ) ) + { + load->glyph->control_len = n_ins; + load->glyph->control_data = load->exec->glyphIns; + + FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + p += n_ins; + + /* reading the point tags */ + flag = (FT_Byte*)outline->tags; + flag_limit = flag + n_points; + + FT_ASSERT( flag != NULL ); + + while ( flag < flag_limit ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + *flag++ = c = FT_NEXT_BYTE( p ); + if ( c & 8 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + count = FT_NEXT_BYTE( p ); + if ( flag + (FT_Int)count > flag_limit ) + goto Invalid_Outline; + + for ( ; count > 0; count-- ) + *flag++ = c; + } + } + + /* reading the X coordinates */ + + vec = outline->points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + if ( p + xy_size > limit ) + goto Invalid_Outline; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos y = 0; + FT_Byte f = *flag; + + + if ( f & 2 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_BYTE( p ); + if ( ( f & 16 ) == 0 ) + y = -y; + } + else if ( ( f & 16 ) == 0 ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += y; + vec->x = x; + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & ~( 2 | 16 ) ); + } + + /* reading the Y coordinates */ + + vec = gloader->current.outline.points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos y = 0; + FT_Byte f = *flag; + + + if ( f & 4 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_BYTE( p ); + if ( ( f & 32 ) == 0 ) + y = -y; + } + else if ( ( f & 32 ) == 0 ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += y; + vec->y = x; + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & FT_CURVE_TAG_ON ); + } + + outline->n_points = (FT_UShort)n_points; + outline->n_contours = (FT_Short) n_contours; + + load->cursor = p; + + Fail: + return error; + + Invalid_Outline: + error = TT_Err_Invalid_Outline; + goto Fail; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Composite_Glyph( TT_Loader loader ) + { + FT_Error error; + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + FT_GlyphLoader gloader = loader->gloader; + FT_SubGlyph subglyph; + FT_UInt num_subglyphs; + + + num_subglyphs = 0; + + do + { + FT_Fixed xx, xy, yy, yx; + FT_UInt count; + + + /* check that we can load a new subglyph */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 ); + if ( error ) + goto Fail; + + /* check space */ + if ( p + 4 > limit ) + goto Invalid_Composite; + + subglyph = gloader->current.subglyphs + num_subglyphs; + + subglyph->arg1 = subglyph->arg2 = 0; + + subglyph->flags = FT_NEXT_USHORT( p ); + subglyph->index = FT_NEXT_USHORT( p ); + + /* check space */ + count = 2; + if ( subglyph->flags & ARGS_ARE_WORDS ) + count += 2; + if ( subglyph->flags & WE_HAVE_A_SCALE ) + count += 2; + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + count += 4; + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + count += 8; + + if ( p + count > limit ) + goto Invalid_Composite; + + /* read arguments */ + if ( subglyph->flags & ARGS_ARE_WORDS ) + { + subglyph->arg1 = FT_NEXT_SHORT( p ); + subglyph->arg2 = FT_NEXT_SHORT( p ); + } + else + { + subglyph->arg1 = FT_NEXT_CHAR( p ); + subglyph->arg2 = FT_NEXT_CHAR( p ); + } + + /* read transform */ + xx = yy = 0x10000L; + xy = yx = 0; + + if ( subglyph->flags & WE_HAVE_A_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = xx; + } + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + } + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + } + + subglyph->transform.xx = xx; + subglyph->transform.xy = xy; + subglyph->transform.yx = yx; + subglyph->transform.yy = yy; + + num_subglyphs++; + + } while ( subglyph->flags & MORE_COMPONENTS ); + + gloader->current.num_subglyphs = num_subglyphs; + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + + + /* we must undo the FT_FRAME_ENTER in order to point */ + /* to the composite instructions, if we find some. */ + /* We will process them later. */ + /* */ + loader->ins_pos = (FT_ULong)( FT_STREAM_POS() + + p - limit ); + } + +#endif + + loader->cursor = p; + + Fail: + return error; + + Invalid_Composite: + error = TT_Err_Invalid_Composite; + goto Fail; + } + + + FT_LOCAL_DEF( void ) + TT_Init_Glyph_Loading( TT_Face face ) + { + face->access_glyph_frame = TT_Access_Glyph_Frame; + face->read_glyph_header = TT_Load_Glyph_Header; + face->read_simple_glyph = TT_Load_Simple_Glyph; + face->read_composite_glyph = TT_Load_Composite_Glyph; + face->forget_glyph_frame = TT_Forget_Glyph_Frame; + } + + + static void + tt_prepare_zone( TT_GlyphZone zone, + FT_GlyphLoad load, + FT_UInt start_point, + FT_UInt start_contour ) + { + zone->n_points = (FT_UShort)( load->outline.n_points - start_point ); + zone->n_contours = (FT_Short) ( load->outline.n_contours - + start_contour ); + zone->org = load->extra_points + start_point; + zone->cur = load->outline.points + start_point; + zone->orus = load->extra_points2 + start_point; + zone->tags = (FT_Byte*)load->outline.tags + start_point; + zone->contours = (FT_UShort*)load->outline.contours + start_contour; + zone->first_point = (FT_UShort)start_point; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Hint_Glyph */ + /* */ + /* */ + /* Hint the glyph using the zone prepared by the caller. Note that */ + /* the zone is supposed to include four phantom points. */ + /* */ + static FT_Error + TT_Hint_Glyph( TT_Loader loader, + FT_Bool is_composite ) + { + TT_GlyphZone zone = &loader->zone; + FT_Pos origin; + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_UInt n_ins; +#else + FT_UNUSED( is_composite ); +#endif + + +#ifdef TT_USE_BYTECODE_INTERPRETER + n_ins = loader->glyph->control_len; +#endif + + origin = zone->cur[zone->n_points - 4].x; + origin = FT_PIX_ROUND( origin ) - origin; + if ( origin ) + translate_array( zone->n_points, zone->cur, origin, 0 ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + /* save original point position in org */ + if ( n_ins > 0 ) + FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); + + /* Reset graphics state. */ + loader->exec->GS = ((TT_Size)loader->size)->GS; + + /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ + /* completely refer to the (already) hinted subglyphs. */ + if ( is_composite ) + { + loader->exec->metrics.x_scale = 1 << 16; + loader->exec->metrics.y_scale = 1 << 16; + + FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); + } + else + { + loader->exec->metrics.x_scale = + ((TT_Size)loader->size)->metrics.x_scale; + loader->exec->metrics.y_scale = + ((TT_Size)loader->size)->metrics.y_scale; + } +#endif + + /* round pp2 and pp4 */ + zone->cur[zone->n_points - 3].x = + FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); + zone->cur[zone->n_points - 1].y = + FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( n_ins > 0 ) + { + FT_Bool debug; + FT_Error error; + + + error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph, + loader->exec->glyphIns, n_ins ); + if ( error ) + return error; + + loader->exec->is_composite = is_composite; + loader->exec->pts = *zone; + + debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) && + ((TT_Size)loader->size)->debug ); + + error = TT_Run_Context( loader->exec, debug ); + if ( error && loader->exec->pedantic_hinting ) + return error; + } + +#endif + + /* save glyph phantom points */ + if ( !loader->preserve_pps ) + { + loader->pp1 = zone->cur[zone->n_points - 4]; + loader->pp2 = zone->cur[zone->n_points - 3]; + loader->pp3 = zone->cur[zone->n_points - 2]; + loader->pp4 = zone->cur[zone->n_points - 1]; + } + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Simple_Glyph */ + /* */ + /* */ + /* Once a simple glyph has been loaded, it needs to be processed. */ + /* Usually, this means scaling and hinting through bytecode */ + /* interpretation. */ + /* */ + static FT_Error + TT_Process_Simple_Glyph( TT_Loader loader ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Error error = TT_Err_Ok; + FT_Outline* outline; + FT_Int n_points; + + + outline = &gloader->current.outline; + n_points = outline->n_points; + + /* set phantom points */ + + outline->points[n_points ] = loader->pp1; + outline->points[n_points + 1] = loader->pp2; + outline->points[n_points + 2] = loader->pp3; + outline->points[n_points + 3] = loader->pp4; + + outline->tags[n_points ] = 0; + outline->tags[n_points + 1] = 0; + outline->tags[n_points + 2] = 0; + outline->tags[n_points + 3] = 0; + + n_points += 4; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( ((TT_Face)loader->face)->doblend ) + { + /* Deltas apply to the unscaled data. */ + FT_Vector* deltas; + FT_Memory memory = loader->face->memory; + FT_Int i; + + + error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), + loader->glyph_index, + &deltas, + n_points ); + if ( error ) + return error; + + for ( i = 0; i < n_points; ++i ) + { + outline->points[i].x += deltas[i].x; + outline->points[i].y += deltas[i].y; + } + + FT_FREE( deltas ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( IS_HINTED( loader->load_flags ) ) + { + tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 ); + + FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur, + loader->zone.n_points + 4 ); + } + + /* scale the glyph */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + FT_Vector* vec = outline->points; + FT_Vector* limit = outline->points + n_points; + FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale; + FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale; + + + for ( ; vec < limit; vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + loader->pp1 = outline->points[n_points - 4]; + loader->pp2 = outline->points[n_points - 3]; + loader->pp3 = outline->points[n_points - 2]; + loader->pp4 = outline->points[n_points - 1]; + } + + if ( IS_HINTED( loader->load_flags ) ) + { + loader->zone.n_points += 4; + + error = TT_Hint_Glyph( loader, 0 ); + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Composite_Component */ + /* */ + /* */ + /* Once a composite component has been loaded, it needs to be */ + /* processed. Usually, this means transforming and translating. */ + /* */ + static FT_Error + TT_Process_Composite_Component( TT_Loader loader, + FT_SubGlyph subglyph, + FT_UInt start_point, + FT_UInt num_base_points ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Vector* base_vec = gloader->base.outline.points; + FT_UInt num_points = gloader->base.outline.n_points; + FT_Bool have_scale; + FT_Pos x, y; + + + have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | + WE_HAVE_AN_XY_SCALE | + WE_HAVE_A_2X2 ) ); + + /* perform the transform required for this subglyph */ + if ( have_scale ) + { + FT_UInt i; + + + for ( i = num_base_points; i < num_points; i++ ) + FT_Vector_Transform( base_vec + i, &subglyph->transform ); + } + + /* get offset */ + if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) + { + FT_UInt k = subglyph->arg1; + FT_UInt l = subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + /* match l-th point of the newly loaded component to the k-th point */ + /* of the previously loaded components. */ + + /* change to the point numbers used by our outline */ + k += start_point; + l += num_base_points; + if ( k >= num_base_points || + l >= num_points ) + return TT_Err_Invalid_Composite; + + p1 = gloader->base.outline.points + k; + p2 = gloader->base.outline.points + l; + + x = p1->x - p2->x; + y = p1->y - p2->y; + } + else + { + x = subglyph->arg1; + y = subglyph->arg2; + + if ( !x && !y ) + return TT_Err_Ok; + + /* Use a default value dependent on */ + /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old TT */ + /* fonts which don't set the xxx_COMPONENT_OFFSET bit. */ + + if ( have_scale && +#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) ) +#else + ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) +#endif + { + +#if 0 + + /*************************************************************************/ + /* */ + /* This algorithm is what Apple documents. But it doesn't work. */ + /* */ + int a = subglyph->transform.xx > 0 ? subglyph->transform.xx + : -subglyph->transform.xx; + int b = subglyph->transform.yx > 0 ? subglyph->transform.yx + : -subglyph->transform.yx; + int c = subglyph->transform.xy > 0 ? subglyph->transform.xy + : -subglyph->transform.xy; + int d = subglyph->transform.yy > 0 ? subglyph->transform.yy + : -subglyph->transform.yy; + int m = a > b ? a : b; + int n = c > d ? c : d; + + + if ( a - b <= 33 && a - b >= -33 ) + m *= 2; + if ( c - d <= 33 && c - d >= -33 ) + n *= 2; + x = FT_MulFix( x, m ); + y = FT_MulFix( y, n ); + +#else /* 0 */ + + /*************************************************************************/ + /* */ + /* This algorithm is a guess and works much better than the above. */ + /* */ + FT_Fixed mac_xscale = FT_SqrtFixed( + FT_MulFix( subglyph->transform.xx, + subglyph->transform.xx ) + + FT_MulFix( subglyph->transform.xy, + subglyph->transform.xy ) ); + FT_Fixed mac_yscale = FT_SqrtFixed( + FT_MulFix( subglyph->transform.yy, + subglyph->transform.yy ) + + FT_MulFix( subglyph->transform.yx, + subglyph->transform.yx ) ); + + + x = FT_MulFix( x, mac_xscale ); + y = FT_MulFix( y, mac_yscale ); + +#endif /* 0 */ + + } + + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale; + FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale; + + + x = FT_MulFix( x, x_scale ); + y = FT_MulFix( y, y_scale ); + + if ( subglyph->flags & ROUND_XY_TO_GRID ) + { + x = FT_PIX_ROUND( x ); + y = FT_PIX_ROUND( y ); + } + } + } + + if ( x || y ) + translate_array( num_points - num_base_points, + base_vec + num_base_points, + x, y ); + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Composite_Glyph */ + /* */ + /* */ + /* This is slightly different from TT_Process_Simple_Glyph, in that */ + /* its sole purpose is to hint the glyph. Thus this function is */ + /* only available when bytecode interpreter is enabled. */ + /* */ + static FT_Error + TT_Process_Composite_Glyph( TT_Loader loader, + FT_UInt start_point, + FT_UInt start_contour ) + { + FT_Error error; + FT_Outline* outline; + FT_UInt i; + + + outline = &loader->gloader->base.outline; + + /* make room for phantom points */ + error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, + outline->n_points + 4, + 0 ); + if ( error ) + return error; + + outline->points[outline->n_points ] = loader->pp1; + outline->points[outline->n_points + 1] = loader->pp2; + outline->points[outline->n_points + 2] = loader->pp3; + outline->points[outline->n_points + 3] = loader->pp4; + + outline->tags[outline->n_points ] = 0; + outline->tags[outline->n_points + 1] = 0; + outline->tags[outline->n_points + 2] = 0; + outline->tags[outline->n_points + 3] = 0; + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + FT_UShort n_ins; + + + /* TT_Load_Composite_Glyph only gives us the offset of instructions */ + /* so we read them here */ + if ( FT_STREAM_SEEK( loader->ins_pos ) || + FT_READ_USHORT( n_ins ) ) + return error; + + FT_TRACE5(( " Instructions size = %d\n", n_ins )); + + /* check it */ + if ( n_ins > ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions ) + { + FT_TRACE0(( "TT_Process_Composite_Glyph: Too many instructions (%d)\n", + n_ins )); + + return TT_Err_Too_Many_Hints; + } + else if ( n_ins == 0 ) + return TT_Err_Ok; + + if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) ) + return error; + + loader->glyph->control_data = loader->exec->glyphIns; + loader->glyph->control_len = n_ins; + } + +#endif + + tt_prepare_zone( &loader->zone, &loader->gloader->base, + start_point, start_contour ); + + /* Some points are likely touched during execution of */ + /* instructions on components. So let's untouch them. */ + for ( i = start_point; i < loader->zone.n_points; i++ ) + loader->zone.tags[i] &= ~( FT_CURVE_TAG_TOUCH_X | + FT_CURVE_TAG_TOUCH_Y ); + + loader->zone.n_points += 4; + + return TT_Hint_Glyph( loader, 1 ); + } + + + /* Calculate the four phantom points. */ + /* The first two stand for horizontal origin and advance. */ + /* The last two stand for vertical origin and advance. */ +#define TT_LOADER_SET_PP( loader ) \ + do { \ + (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \ + (loader)->pp1.y = 0; \ + (loader)->pp2.x = (loader)->pp1.x + (loader)->advance; \ + (loader)->pp2.y = 0; \ + (loader)->pp3.x = 0; \ + (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax; \ + (loader)->pp4.x = 0; \ + (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* */ + /* load_truetype_glyph */ + /* */ + /* */ + /* Loads a given truetype glyph. Handles composites and uses a */ + /* TT_Loader object. */ + /* */ + static FT_Error + load_truetype_glyph( TT_Loader loader, + FT_UInt glyph_index, + FT_UInt recurse_count ) + { + FT_Error error; + FT_Fixed x_scale, y_scale; + FT_ULong offset; + TT_Face face = (TT_Face)loader->face; + FT_GlyphLoader gloader = loader->gloader; + FT_Bool opened_frame = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Vector* deltas = NULL; +#endif + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_StreamRec inc_stream; + FT_Data glyph_data; + FT_Bool glyph_data_loaded = 0; +#endif + + + /* some fonts have an incorrect value of `maxComponentDepth', */ + /* thus we allow depth 1 to catch the majority of them */ + if ( recurse_count > 1 && + recurse_count > face->max_profile.maxComponentDepth ) + { + error = TT_Err_Invalid_Composite; + goto Exit; + } + + /* check glyph index */ + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = TT_Err_Invalid_Glyph_Index; + goto Exit; + } + + loader->glyph_index = glyph_index; + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + x_scale = ((TT_Size)loader->size)->metrics.x_scale; + y_scale = ((TT_Size)loader->size)->metrics.y_scale; + } + else + { + x_scale = 0x10000L; + y_scale = 0x10000L; + } + + /* get metrics, horizontal and vertical */ + { + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + + TT_Get_HMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &left_bearing, + &advance_width ); + TT_Get_VMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &top_bearing, + &advance_height ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* If this is an incrementally loaded font see if there are */ + /* overriding metrics for this glyph. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = left_bearing; + metrics.bearing_y = 0; + metrics.advance = advance_width; + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + if ( error ) + goto Exit; + left_bearing = (FT_Short)metrics.bearing_x; + advance_width = (FT_UShort)metrics.advance; + +#if 0 + + /* GWW: Do I do the same for vertical metrics? */ + metrics.bearing_x = 0; + metrics.bearing_y = top_bearing; + metrics.advance = advance_height; + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, TRUE, &metrics ); + if ( error ) + goto Exit; + top_bearing = (FT_Short)metrics.bearing_y; + advance_height = (FT_UShort)metrics.advance; + +#endif /* 0 */ + + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + } + + /* Set `offset' to the start of the glyph relative to the start of */ + /* the `glyf' table, and `byte_len' to the length of the glyph in */ + /* bytes. */ + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* If we are loading glyph data via the incremental interface, set */ + /* the loader stream to a memory stream reading the data returned */ + /* by the interface. */ + if ( face->root.internal->incremental_interface ) + { + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &glyph_data ); + if ( error ) + goto Exit; + + glyph_data_loaded = 1; + offset = 0; + loader->byte_len = glyph_data.length; + + FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) ); + FT_Stream_OpenMemory( &inc_stream, + glyph_data.pointer, glyph_data.length ); + + loader->stream = &inc_stream; + } + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + offset = tt_face_get_location( face, glyph_index, + (FT_UInt*)&loader->byte_len ); + + if ( loader->byte_len > 0 ) + { + if ( !loader->glyf_offset ) + { + FT_TRACE2(( "no `glyf' table but non-zero `loca' entry!\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + + error = face->access_glyph_frame( loader, glyph_index, + loader->glyf_offset + offset, + loader->byte_len ); + if ( error ) + goto Exit; + + opened_frame = 1; + + /* read first glyph header */ + error = face->read_glyph_header( loader ); + if ( error ) + goto Exit; + } + + if ( loader->byte_len == 0 || loader->n_contours == 0 ) + { + loader->bbox.xMin = 0; + loader->bbox.xMax = 0; + loader->bbox.yMin = 0; + loader->bbox.yMax = 0; + + TT_LOADER_SET_PP( loader ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( ((TT_Face)(loader->face))->doblend ) + { + /* this must be done before scaling */ + FT_Memory memory = loader->face->memory; + + + error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), + glyph_index, &deltas, 4 ); + if ( error ) + goto Exit; + + loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y; + loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y; + loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y; + loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y; + + FT_FREE( deltas ); + } + +#endif + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + error = TT_Err_Ok; + goto Exit; + } + + TT_LOADER_SET_PP( loader ); + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* if it is a simple glyph, load it */ + + if ( loader->n_contours > 0 ) + { + error = face->read_simple_glyph( loader ); + if ( error ) + goto Exit; + + /* all data have been read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + + error = TT_Process_Simple_Glyph( loader ); + if ( error ) + goto Exit; + + FT_GlyphLoader_Add( gloader ); + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* otherwise, load a composite! */ + else if ( loader->n_contours == -1 ) + { + FT_UInt start_point; + FT_UInt start_contour; + FT_ULong ins_pos; /* position of composite instructions, if any */ + + + start_point = gloader->base.outline.n_points; + start_contour = gloader->base.outline.n_contours; + + /* for each subglyph, read composite header */ + error = face->read_composite_glyph( loader ); + if ( error ) + goto Exit; + + /* store the offset of instructions */ + ins_pos = loader->ins_pos; + + /* all data we need are read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( face->doblend ) + { + FT_Int i, limit; + FT_SubGlyph subglyph; + FT_Memory memory = face->root.memory; + + + /* this provides additional offsets */ + /* for each component's translation */ + + if ( ( error = TT_Vary_Get_Glyph_Deltas( + face, + glyph_index, + &deltas, + gloader->current.num_subglyphs + 4 )) != 0 ) + goto Exit; + + subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs; + limit = gloader->current.num_subglyphs; + + for ( i = 0; i < limit; ++i, ++subglyph ) + { + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + { + subglyph->arg1 += deltas[i].x; + subglyph->arg2 += deltas[i].y; + } + } + + loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y; + loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y; + loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y; + loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y; + + FT_FREE( deltas ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */ + /* `as is' in the glyph slot (the client application will be */ + /* responsible for interpreting these data)... */ + if ( loader->load_flags & FT_LOAD_NO_RECURSE ) + { + FT_GlyphLoader_Add( gloader ); + loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + goto Exit; + } + + /*********************************************************************/ + /*********************************************************************/ + /*********************************************************************/ + + { + FT_UInt n, num_base_points; + FT_SubGlyph subglyph = 0; + + FT_UInt num_points = start_point; + FT_UInt num_subglyphs = gloader->current.num_subglyphs; + FT_UInt num_base_subgs = gloader->base.num_subglyphs; + + FT_Stream old_stream = loader->stream; + + + FT_GlyphLoader_Add( gloader ); + + /* read each subglyph independently */ + for ( n = 0; n < num_subglyphs; n++ ) + { + FT_Vector pp[4]; + + + /* Each time we call load_truetype_glyph in this loop, the */ + /* value of `gloader.base.subglyphs' can change due to table */ + /* reallocations. We thus need to recompute the subglyph */ + /* pointer on each iteration. */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + pp[0] = loader->pp1; + pp[1] = loader->pp2; + pp[2] = loader->pp3; + pp[3] = loader->pp4; + + num_base_points = gloader->base.outline.n_points; + + error = load_truetype_glyph( loader, subglyph->index, + recurse_count + 1 ); + if ( error ) + goto Exit; + + /* restore subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + if ( !( subglyph->flags & USE_MY_METRICS ) ) + { + loader->pp1 = pp[0]; + loader->pp2 = pp[1]; + loader->pp3 = pp[2]; + loader->pp4 = pp[3]; + } + + num_points = gloader->base.outline.n_points; + + if ( num_points == num_base_points ) + continue; + + /* gloader->base.outline consists of three parts: */ + /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */ + /* */ + /* (1): exists from the beginning */ + /* (2): components that have been loaded so far */ + /* (3): the newly loaded component */ + TT_Process_Composite_Component( loader, subglyph, start_point, + num_base_points ); + } + + loader->stream = old_stream; + + /* process the glyph */ + loader->ins_pos = ins_pos; + if ( IS_HINTED( loader->load_flags ) && + +#ifdef TT_USE_BYTECODE_INTERPRETER + + subglyph->flags & WE_HAVE_INSTR && + +#endif + + num_points > start_point ) + TT_Process_Composite_Glyph( loader, start_point, start_contour ); + + } + } + else + { + /* invalid composite count (negative but not -1) */ + error = TT_Err_Invalid_Outline; + goto Exit; + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + Exit: + + if ( opened_frame ) + face->forget_glyph_frame( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( glyph_data_loaded ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + +#endif + + return error; + } + + + static FT_Error + compute_glyph_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + FT_BBox bbox; + TT_Face face = (TT_Face)loader->face; + FT_Fixed y_scale; + TT_GlyphSlot glyph = loader->glyph; + TT_Size size = (TT_Size)loader->size; + + + y_scale = 0x10000L; + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + y_scale = size->root.metrics.y_scale; + + if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) + FT_Outline_Get_CBox( &glyph->outline, &bbox ); + else + bbox = loader->bbox; + + /* get the device-independent horizontal advance; it is scaled later */ + /* by the base layer. */ + { + FT_Pos advance = loader->linear; + + + /* the flag FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH was introduced to */ + /* correctly support DynaLab fonts, which have an incorrect */ + /* `advance_Width_Max' field! It is used, to my knowledge, */ + /* exclusively in the X-TrueType font server. */ + /* */ + if ( face->postscript.isFixedPitch && + ( loader->load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) == 0 ) + advance = face->horizontal.advance_Width_Max; + + /* we need to return the advance in font units in linearHoriAdvance, */ + /* it will be scaled later by the base layer. */ + glyph->linearHoriAdvance = advance; + } + + glyph->metrics.horiBearingX = bbox.xMin; + glyph->metrics.horiBearingY = bbox.yMax; + glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + + /* Now take care of vertical metrics. In the case where there is */ + /* no vertical information within the font (relatively common), make */ + /* up some metrics by `hand'... */ + + { + FT_Pos top; /* scaled vertical top side bearing */ + FT_Pos advance; /* scaled vertical advance height */ + + + /* Get the unscaled top bearing and advance height. */ + if ( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ) + { + top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax, + y_scale ); + + if ( loader->pp3.y <= loader->pp4.y ) + advance = 0; + else + advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y, + y_scale ); + } + else + { + FT_Pos height; + + + /* XXX Compute top side bearing and advance height in */ + /* Get_VMetrics instead of here. */ + + /* NOTE: The OS/2 values are the only `portable' ones, */ + /* which is why we use them, if there is an OS/2 */ + /* table in the font. Otherwise, we use the */ + /* values defined in the horizontal header. */ + + height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin, + y_scale ); + if ( face->os2.version != 0xFFFFU ) + advance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + advance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + + top = ( advance - height ) / 2; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + FT_Incremental_InterfaceRec* incr; + FT_Incremental_MetricsRec metrics; + FT_Error error; + + + incr = face->root.internal->incremental_interface; + + /* If this is an incrementally loaded font see if there are */ + /* overriding metrics for this glyph. */ + if ( incr && incr->funcs->get_glyph_metrics ) + { + metrics.bearing_x = 0; + metrics.bearing_y = top; + metrics.advance = advance; + + error = incr->funcs->get_glyph_metrics( incr->object, + glyph_index, + TRUE, + &metrics ); + if ( error ) + return error; + + top = metrics.bearing_y; + advance = metrics.advance; + } + } + + /* GWW: Do vertical metrics get loaded incrementally too? */ + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + glyph->linearVertAdvance = advance; + + /* scale the metrics */ + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + top = FT_MulFix( top, y_scale ); + advance = FT_MulFix( advance, y_scale ); + } + + /* XXX: for now, we have no better algorithm for the lsb, but it */ + /* should work fine. */ + /* */ + glyph->metrics.vertBearingX = ( bbox.xMin - bbox.xMax ) / 2; + glyph->metrics.vertBearingY = top; + glyph->metrics.vertAdvance = advance; + } + + /* adjust advance width to the value contained in the hdmx table */ + if ( !face->postscript.isFixedPitch && + IS_HINTED( loader->load_flags ) ) + { + FT_Byte* widthp; + + + widthp = tt_face_get_device_metrics( face, + size->root.metrics.x_ppem, + glyph_index ); + + if ( widthp ) + glyph->metrics.horiAdvance = *widthp << 6; + } + + /* set glyph dimensions */ + glyph->metrics.width = bbox.xMax - bbox.xMin; + glyph->metrics.height = bbox.yMax - bbox.yMin; + + return 0; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + load_sbit_image( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face; + SFNT_Service sfnt; + FT_Stream stream; + FT_Error error; + TT_SBit_MetricsRec metrics; + + + face = (TT_Face)glyph->face; + sfnt = (SFNT_Service)face->sfnt; + stream = face->root.stream; + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_Int)load_flags, + stream, + &glyph->bitmap, + &metrics ); + if ( !error ) + { + glyph->outline.n_points = 0; + glyph->outline.n_contours = 0; + + glyph->metrics.width = (FT_Pos)metrics.width << 6; + glyph->metrics.height = (FT_Pos)metrics.height << 6; + + glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; + glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; + glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; + + glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; + glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; + glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; + + glyph->format = FT_GLYPH_FORMAT_BITMAP; + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->bitmap_left = metrics.vertBearingX; + glyph->bitmap_top = metrics.vertBearingY; + } + else + { + glyph->bitmap_left = metrics.horiBearingX; + glyph->bitmap_top = metrics.horiBearingY; + } + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_loader_init( TT_Loader loader, + TT_Size size, + TT_GlyphSlot glyph, + FT_Int32 load_flags ) + { + TT_Face face; + FT_Stream stream; + + + face = (TT_Face)glyph->face; + stream = face->root.stream; + + FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /* load execution context */ + if ( IS_HINTED( load_flags ) ) + { + TT_ExecContext exec; + FT_Bool grayscale; + + + if ( !size->cvt_ready ) + { + FT_Error error = tt_size_ready_bytecode( size ); + if ( error ) + return error; + } + + /* query new execution context */ + exec = size->debug ? size->context + : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + grayscale = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO ); + + TT_Load_Context( exec, face, size ); + + /* a change from mono to grayscale rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( grayscale != exec->grayscale ) + { + FT_UInt i; + + + exec->grayscale = grayscale; + + for ( i = 0; i < size->cvt_size; i++ ) + size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); + tt_size_run_prep( size ); + } + + /* see whether the cvt program has disabled hinting */ + if ( exec->GS.instruct_control & 1 ) + load_flags |= FT_LOAD_NO_HINTING; + + /* load default graphics state -- if needed */ + if ( exec->GS.instruct_control & 2 ) + exec->GS = tt_default_graphics_state; + + exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); + loader->exec = exec; + loader->instructions = exec->glyphIns; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + /* seek to the beginning of the glyph table -- for Type 42 fonts */ + /* the table might be accessed from a Postscript stream or something */ + /* else... */ + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( face->root.internal->incremental_interface ) + loader->glyf_offset = 0; + else + +#endif + + { + FT_Error error = face->goto_table( face, TTAG_glyf, stream, 0 ); + + + if ( error == TT_Err_Table_Missing ) + loader->glyf_offset = 0; + else if ( error ) + { + FT_ERROR(( "TT_Load_Glyph: could not access glyph table\n" )); + return error; + } + else + loader->glyf_offset = FT_STREAM_POS(); + } + + /* get face's glyph loader */ + { + FT_GlyphLoader gloader = glyph->internal->loader; + + + FT_GlyphLoader_Rewind( gloader ); + loader->gloader = gloader; + } + + loader->load_flags = load_flags; + + loader->face = (FT_Face)face; + loader->size = (FT_Size)size; + loader->glyph = (FT_GlyphSlot)glyph; + loader->stream = stream; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Glyph */ + /* */ + /* */ + /* A function used to load a single glyph within a given glyph slot, */ + /* for a given size. */ + /* */ + /* */ + /* glyph :: A handle to a target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled/loaded. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face; + FT_Error error; + TT_LoaderRec loader; + + + face = (TT_Face)glyph->face; + error = TT_Err_Ok; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size->strike_index != 0xFFFFFFFFUL && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + error = load_sbit_image( size, glyph, glyph_index, load_flags ); + if ( !error ) + return TT_Err_Ok; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) + return TT_Err_Invalid_Size_Handle; + + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return TT_Err_Invalid_Argument; + + error = tt_loader_init( &loader, size, glyph, load_flags ); + if ( error ) + return error; + + glyph->format = FT_GLYPH_FORMAT_OUTLINE; + glyph->num_subglyphs = 0; + glyph->outline.flags = 0; + + /* main loading loop */ + error = load_truetype_glyph( &loader, glyph_index, 0 ); + if ( !error ) + { + if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE ) + { + glyph->num_subglyphs = loader.gloader->base.num_subglyphs; + glyph->subglyphs = loader.gloader->base.subglyphs; + } + else + { + glyph->outline = loader.gloader->base.outline; + glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; + + /* In case bit 1 of the `flags' field in the `head' table isn't */ + /* set, translate array so that (0,0) is the glyph's origin. */ + if ( ( face->header.Flags & 2 ) == 0 && loader.pp1.x ) + FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load_flags ) ) + { + if ( loader.exec->GS.scan_control ) + { + /* convert scan conversion mode to FT_OUTLINE_XXX flags */ + switch ( loader.exec->GS.scan_type ) + { + case 0: /* simple drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS; + break; + case 1: /* simple drop-outs excluding stubs */ + /* nothing; it's the default rendering mode */ + break; + case 4: /* smart drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS | + FT_OUTLINE_INCLUDE_STUBS; + break; + case 5: /* smart drop-outs excluding stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS; + break; + + default: /* no drop-out control */ + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + break; + } + } + else + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + compute_glyph_metrics( &loader, glyph_index ); + } + + /* Set the `high precision' bit flag. */ + /* This is _critical_ to get correct output for monochrome */ + /* TrueType glyphs at all sizes using the bytecode interpreter. */ + /* */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && + size->root.metrics.y_ppem < 24 ) + glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttgload.h b/src/3rdparty/freetype/src/truetype/ttgload.h new file mode 100644 index 0000000000..958d67d20d --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttgload.h @@ -0,0 +1,63 @@ +/***************************************************************************/ +/* */ +/* ttgload.h */ +/* */ +/* TrueType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTGLOAD_H__ +#define __TTGLOAD_H__ + + +#include +#include "ttobjs.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + TT_Init_Glyph_Loading( TT_Face face ); + + FT_LOCAL( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* lsb, + FT_UShort* aw ); + + FT_LOCAL( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* tsb, + FT_UShort* ah ); + + FT_LOCAL( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __TTGLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttgxvar.c b/src/3rdparty/freetype/src/truetype/ttgxvar.c new file mode 100644 index 0000000000..515e734b8a --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttgxvar.c @@ -0,0 +1,1541 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.c */ +/* */ +/* TrueType GX Font Variation loader */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at */ +/* */ +/* http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html */ +/* */ +/* The documentation for `fvar' is inconsistent. At one point it says */ +/* that `countSizePairs' should be 3, at another point 2. It should be 2. */ +/* */ +/* The documentation for `gvar' is not intelligible; `cvar' refers you to */ +/* `gvar' and is thus also incomprehensible. */ +/* */ +/* The documentation for `avar' appears correct, but Apple has no fonts */ +/* with an `avar' table, so it is hard to test. */ +/* */ +/* Many thanks to John Jenkins (at Apple) in figuring this out. */ +/* */ +/* */ +/* Apple's `kern' table has some references to tuple indices, but as there */ +/* is no indication where these indices are defined, nor how to */ +/* interpolate the kerning values (different tuples have different */ +/* classes) this issue is ignored. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_MULTIPLE_MASTERS_H + +#include "ttdriver.h" +#include "ttpload.h" +#include "ttgxvar.h" + +#include "tterrors.h" + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + +#define FT_Stream_FTell( stream ) \ + ( (stream)->cursor - (stream)->base ) +#define FT_Stream_SeekSet( stream, off ) \ + ( (stream)->cursor = (stream)->base+(off) ) + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttgxvar + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Internal Routines *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It */ + /* indicates that there is a delta for every point without needing to */ + /* enumerate all of them. */ + /* */ +#define ALL_POINTS (FT_UShort*)( -1 ) + + + enum + { + GX_PT_POINTS_ARE_WORDS = 0x80, + GX_PT_POINT_RUN_COUNT_MASK = 0x7F + }; + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_readpackedpoints */ + /* */ + /* */ + /* Read a set of points to which the following deltas will apply. */ + /* Points are packed with a run length encoding. */ + /* */ + /* */ + /* stream :: The data stream. */ + /* */ + /* */ + /* point_cnt :: The number of points read. A zero value means that */ + /* all points in the glyph will be affected, without */ + /* enumerating them individually. */ + /* */ + /* */ + /* An array of FT_UShort containing the affected points or the */ + /* special value ALL_POINTS. */ + /* */ + static FT_UShort* + ft_var_readpackedpoints( FT_Stream stream, + FT_UInt *point_cnt ) + { + FT_UShort *points; + FT_Int n; + FT_Int runcnt; + FT_Int i; + FT_Int j; + FT_Int first; + FT_Memory memory = stream->memory; + FT_Error error = TT_Err_Ok; + + FT_UNUSED( error ); + + + *point_cnt = n = FT_GET_BYTE(); + if ( n == 0 ) + return ALL_POINTS; + + if ( n & GX_PT_POINTS_ARE_WORDS ) + n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 ); + + if ( FT_NEW_ARRAY( points, n ) ) + return NULL; + + i = 0; + while ( i < n ) + { + runcnt = FT_GET_BYTE(); + if ( runcnt & GX_PT_POINTS_ARE_WORDS ) + { + runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK; + first = points[i++] = FT_GET_USHORT(); + + /* first point not included in runcount */ + for ( j = 0; j < runcnt; ++j ) + points[i++] = (FT_UShort)( first += FT_GET_USHORT() ); + } + else + { + first = points[i++] = FT_GET_BYTE(); + + for ( j = 0; j < runcnt; ++j ) + points[i++] = (FT_UShort)( first += FT_GET_BYTE() ); + } + } + + return points; + } + + + enum + { + GX_DT_DELTAS_ARE_ZERO = 0x80, + GX_DT_DELTAS_ARE_WORDS = 0x40, + GX_DT_DELTA_RUN_COUNT_MASK = 0x3F + }; + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_readpackeddeltas */ + /* */ + /* */ + /* Read a set of deltas. These are packed slightly differently than */ + /* points. In particular there is no overall count. */ + /* */ + /* */ + /* stream :: The data stream. */ + /* */ + /* delta_cnt :: The number of to be read. */ + /* */ + /* */ + /* An array of FT_Short containing the deltas for the affected */ + /* points. (This only gets the deltas for one dimension. It will */ + /* generally be called twice, once for x, once for y. When used in */ + /* cvt table, it will only be called once.) */ + /* */ + static FT_Short* + ft_var_readpackeddeltas( FT_Stream stream, + FT_Int delta_cnt ) + { + FT_Short *deltas; + FT_Int runcnt; + FT_Int i; + FT_Int j; + FT_Memory memory = stream->memory; + FT_Error error = TT_Err_Ok; + + FT_UNUSED( error ); + + + if ( FT_NEW_ARRAY( deltas, delta_cnt ) ) + return NULL; + + i = 0; + while ( i < delta_cnt ) + { + runcnt = FT_GET_BYTE(); + if ( runcnt & GX_DT_DELTAS_ARE_ZERO ) + { + /* runcnt zeroes get added */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = 0; + } + else if ( runcnt & GX_DT_DELTAS_ARE_WORDS ) + { + /* runcnt shorts from the stack */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = FT_GET_SHORT(); + } + else + { + /* runcnt signed bytes from the stack */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = FT_GET_CHAR(); + } + + if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) ) + { + /* Bad format */ + FT_FREE( deltas ); + return NULL; + } + } + + return deltas; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_load_avar */ + /* */ + /* */ + /* Parse the `avar' table if present. It need not be, so we return */ + /* nothing. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + static void + ft_var_load_avar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM(face); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + GX_AVarSegment segment; + FT_Error error = TT_Err_Ok; + FT_ULong version; + FT_Long axisCount; + FT_Int i, j; + FT_ULong table_len; + + FT_UNUSED( error ); + + + blend->avar_checked = TRUE; + if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 ) + return; + + if ( FT_FRAME_ENTER( table_len ) ) + return; + + version = FT_GET_LONG(); + axisCount = FT_GET_LONG(); + + if ( version != 0x00010000L || + axisCount != (FT_Long)blend->mmvar->num_axis ) + goto Exit; + + if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) ) + goto Exit; + + segment = &blend->avar_segment[0]; + for ( i = 0; i < axisCount; ++i, ++segment ) + { + segment->pairCount = FT_GET_USHORT(); + if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) ) + { + /* Failure. Free everything we have done so far. We must do */ + /* it right now since loading the `avar' table is optional. */ + + for ( j = i - 1; j >= 0; --j ) + FT_FREE( blend->avar_segment[j].correspondence ); + + FT_FREE( blend->avar_segment ); + blend->avar_segment = NULL; + goto Exit; + } + + for ( j = 0; j < segment->pairCount; ++j ) + { + segment->correspondence[j].fromCoord = + FT_GET_SHORT() << 2; /* convert to Fixed */ + segment->correspondence[j].toCoord = + FT_GET_SHORT()<<2; /* convert to Fixed */ + } + } + + Exit: + FT_FRAME_EXIT(); + } + + + typedef struct GX_GVar_Head_ + { + FT_Long version; + FT_UShort axisCount; + FT_UShort globalCoordCount; + FT_ULong offsetToCoord; + FT_UShort glyphCount; + FT_UShort flags; + FT_ULong offsetToData; + + } GX_GVar_Head; + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_load_gvar */ + /* */ + /* */ + /* Parses the `gvar' table if present. If `fvar' is there, `gvar' */ + /* had better be there too. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + ft_var_load_gvar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM(face); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + FT_Error error; + FT_UInt i, j; + FT_ULong table_len; + FT_ULong gvar_start; + FT_ULong offsetToData; + GX_GVar_Head gvar_head; + + static const FT_Frame_Field gvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_GVar_Head + + FT_FRAME_START( 20 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( axisCount ), + FT_FRAME_USHORT( globalCoordCount ), + FT_FRAME_ULONG ( offsetToCoord ), + FT_FRAME_USHORT( glyphCount ), + FT_FRAME_USHORT( flags ), + FT_FRAME_ULONG ( offsetToData ), + FT_FRAME_END + }; + + if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 ) + goto Exit; + + gvar_start = FT_STREAM_POS( ); + if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) ) + goto Exit; + + blend->tuplecount = gvar_head.globalCoordCount; + blend->gv_glyphcnt = gvar_head.glyphCount; + offsetToData = gvar_start + gvar_head.offsetToData; + + if ( gvar_head.version != (FT_Long)0x00010000L || + gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis ) + { + error = TT_Err_Invalid_Table; + goto Exit; + } + + if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) ) + goto Exit; + + if ( gvar_head.flags & 1 ) + { + /* long offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) ) + goto Exit; + + for ( i = 0; i <= blend->gv_glyphcnt; ++i ) + blend->glyphoffsets[i] = offsetToData + FT_GET_LONG(); + + FT_FRAME_EXIT(); + } + else + { + /* short offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) ) + goto Exit; + + for ( i = 0; i <= blend->gv_glyphcnt; ++i ) + blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2; + /* XXX: Undocumented: `*2'! */ + + FT_FRAME_EXIT(); + } + + if ( blend->tuplecount != 0 ) + { + if ( FT_NEW_ARRAY( blend->tuplecoords, + gvar_head.axisCount * blend->tuplecount ) ) + goto Exit; + + if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || + FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) ) + goto Exit; + + for ( i = 0; i < blend->tuplecount; ++i ) + for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j ) + blend->tuplecoords[i * gvar_head.axisCount + j] = + FT_GET_SHORT() << 2; /* convert to FT_Fixed */ + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_apply_tuple */ + /* */ + /* */ + /* Figure out whether a given tuple (design) applies to the current */ + /* blend, and if so, what is the scaling factor. */ + /* */ + /* */ + /* blend :: The current blend of the font. */ + /* */ + /* tupleIndex :: A flag saying whether this is an intermediate */ + /* tuple or not. */ + /* */ + /* tuple_coords :: The coordinates of the tuple in normalized axis */ + /* units. */ + /* */ + /* im_start_coords :: The initial coordinates where this tuple starts */ + /* to apply (for intermediate coordinates). */ + /* */ + /* im_end_coords :: The final coordinates after which this tuple no */ + /* longer applies (for intermediate coordinates). */ + /* */ + /* */ + /* An FT_Fixed value containing the scaling factor. */ + /* */ + static FT_Fixed + ft_var_apply_tuple( GX_Blend blend, + FT_UShort tupleIndex, + FT_Fixed* tuple_coords, + FT_Fixed* im_start_coords, + FT_Fixed* im_end_coords ) + { + FT_UInt i; + FT_Fixed apply; + FT_Fixed temp; + + + apply = 0x10000L; + for ( i = 0; i < blend->num_axis; ++i ) + { + if ( tuple_coords[i] == 0 ) + /* It's not clear why (for intermediate tuples) we don't need */ + /* to check against start/end -- the documentation says we don't. */ + /* Similarly, it's unclear why we don't need to scale along the */ + /* axis. */ + continue; + + else if ( blend->normalizedcoords[i] == 0 || + ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) || + ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) ) + { + apply = 0; + break; + } + + else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) + /* not an intermediate tuple */ + apply = FT_MulDiv( apply, + blend->normalizedcoords[i] > 0 + ? blend->normalizedcoords[i] + : -blend->normalizedcoords[i], + 0x10000L ); + + else if ( blend->normalizedcoords[i] <= im_start_coords[i] || + blend->normalizedcoords[i] >= im_end_coords[i] ) + { + apply = 0; + break; + } + + else if ( blend->normalizedcoords[i] < tuple_coords[i] ) + { + temp = FT_MulDiv( blend->normalizedcoords[i] - im_start_coords[i], + 0x10000L, + tuple_coords[i] - im_start_coords[i]); + apply = FT_MulDiv( apply, temp, 0x10000L ); + } + + else + { + temp = FT_MulDiv( im_end_coords[i] - blend->normalizedcoords[i], + 0x10000L, + im_end_coords[i] - tuple_coords[i] ); + apply = FT_MulDiv( apply, temp, 0x10000L ); + } + } + + return apply; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct GX_FVar_Head_ + { + FT_Long version; + FT_UShort offsetToData; + FT_UShort countSizePairs; + FT_UShort axisCount; + FT_UShort axisSize; + FT_UShort instanceCount; + FT_UShort instanceSize; + + } GX_FVar_Head; + + + typedef struct fvar_axis_ + { + FT_ULong axisTag; + FT_ULong minValue; + FT_ULong defaultValue; + FT_ULong maxValue; + FT_UShort flags; + FT_UShort nameID; + + } GX_FVar_Axis; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Get_MM_Var */ + /* */ + /* */ + /* Check that the font's `fvar' table is valid, parse it, and return */ + /* those data. */ + /* */ + /* */ + /* face :: The font face. */ + /* TT_Get_MM_Var initializes the blend structure. */ + /* */ + /* */ + /* master :: The `fvar' data (must be freed by caller). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = face->root.memory; + FT_ULong table_len; + FT_Error error = TT_Err_Ok; + FT_ULong fvar_start; + FT_Int i, j; + FT_MM_Var* mmvar; + FT_Fixed* next_coords; + FT_String* next_name; + FT_Var_Axis* a; + FT_Var_Named_Style* ns; + GX_FVar_Head fvar_head; + + static const FT_Frame_Field fvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Head + + FT_FRAME_START( 16 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( offsetToData ), + FT_FRAME_USHORT( countSizePairs ), + FT_FRAME_USHORT( axisCount ), + FT_FRAME_USHORT( axisSize ), + FT_FRAME_USHORT( instanceCount ), + FT_FRAME_USHORT( instanceSize ), + FT_FRAME_END + }; + + static const FT_Frame_Field fvaraxis_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Axis + + FT_FRAME_START( 20 ), + FT_FRAME_ULONG ( axisTag ), + FT_FRAME_ULONG ( minValue ), + FT_FRAME_ULONG ( defaultValue ), + FT_FRAME_ULONG ( maxValue ), + FT_FRAME_USHORT( flags ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_END + }; + + + if ( face->blend == NULL ) + { + /* both `fvar' and `gvar' must be present */ + if ( (error = face->goto_table( face, TTAG_gvar, + stream, &table_len )) != 0 ) + goto Exit; + + if ( (error = face->goto_table( face, TTAG_fvar, + stream, &table_len )) != 0 ) + goto Exit; + + fvar_start = FT_STREAM_POS( ); + + if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) ) + goto Exit; + + if ( fvar_head.version != (FT_Long)0x00010000L || + fvar_head.countSizePairs != 2 || + fvar_head.axisSize != 20 || + fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount || + fvar_head.offsetToData + fvar_head.axisCount * 20U + + fvar_head.instanceCount * fvar_head.instanceSize > table_len ) + { + error = TT_Err_Invalid_Table; + goto Exit; + } + + if ( FT_NEW( face->blend ) ) + goto Exit; + + /* XXX: TODO - check for overflows */ + face->blend->mmvar_len = + sizeof ( FT_MM_Var ) + + fvar_head.axisCount * sizeof ( FT_Var_Axis ) + + fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) + + fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) + + 5 * fvar_head.axisCount; + + if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + goto Exit; + face->blend->mmvar = mmvar; + + mmvar->num_axis = + fvar_head.axisCount; + mmvar->num_designs = + (FT_UInt)-1; /* meaningless in this context; each glyph */ + /* may have a different number of designs */ + /* (or tuples, as called by Apple) */ + mmvar->num_namedstyles = + fvar_head.instanceCount; + mmvar->axis = + (FT_Var_Axis*)&(mmvar[1]); + mmvar->namedstyle = + (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]); + + next_coords = + (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]); + for ( i = 0; i < fvar_head.instanceCount; ++i ) + { + mmvar->namedstyle[i].coords = next_coords; + next_coords += fvar_head.axisCount; + } + + next_name = (FT_String*)next_coords; + for ( i = 0; i < fvar_head.axisCount; ++i ) + { + mmvar->axis[i].name = next_name; + next_name += 5; + } + + if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) ) + goto Exit; + + a = mmvar->axis; + for ( i = 0; i < fvar_head.axisCount; ++i ) + { + GX_FVar_Axis axis_rec; + + + if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) ) + goto Exit; + a->tag = axis_rec.axisTag; + a->minimum = axis_rec.minValue; /* A Fixed */ + a->def = axis_rec.defaultValue; /* A Fixed */ + a->maximum = axis_rec.maxValue; /* A Fixed */ + a->strid = axis_rec.nameID; + + a->name[0] = (FT_String)( a->tag >> 24 ); + a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF ); + a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF ); + a->name[3] = (FT_String)( ( a->tag ) & 0xFF ); + a->name[4] = 0; + + ++a; + } + + ns = mmvar->namedstyle; + for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns ) + { + if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) ) + goto Exit; + + ns->strid = FT_GET_USHORT(); + (void) /* flags = */ FT_GET_USHORT(); + + for ( j = 0; j < fvar_head.axisCount; ++j ) + ns->coords[j] = FT_GET_ULONG(); /* A Fixed */ + + FT_FRAME_EXIT(); + } + } + + if ( master != NULL ) + { + FT_UInt n; + + + if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + goto Exit; + FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len ); + + mmvar->axis = + (FT_Var_Axis*)&(mmvar[1]); + mmvar->namedstyle = + (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]); + next_coords = + (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]); + + for ( n = 0; n < mmvar->num_namedstyles; ++n ) + { + mmvar->namedstyle[n].coords = next_coords; + next_coords += mmvar->num_axis; + } + + a = mmvar->axis; + next_name = (FT_String*)next_coords; + for ( n = 0; n < mmvar->num_axis; ++n ) + { + a->name = next_name; + + /* standard PostScript names for some standard apple tags */ + if ( a->tag == TTAG_wght ) + a->name = (char *)"Weight"; + else if ( a->tag == TTAG_wdth ) + a->name = (char *)"Width"; + else if ( a->tag == TTAG_opsz ) + a->name = (char *)"OpticalSize"; + else if ( a->tag == TTAG_slnt ) + a->name = (char *)"Slant"; + + next_name += 5; + ++a; + } + + *master = mmvar; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_MM_Blend */ + /* */ + /* */ + /* Set the blend (normalized) coordinates for this instance of the */ + /* font. Check that the `gvar' table is reasonable and does some */ + /* initial preparation. */ + /* */ + /* */ + /* face :: The font. */ + /* Initialize the blend structure with `gvar' data. */ + /* */ + /* */ + /* num_coords :: Must be the axis count of the font. */ + /* */ + /* coords :: An array of num_coords, each between [-1,1]. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = TT_Err_Ok; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i; + FT_Memory memory = face->root.memory; + + enum + { + mcvt_retain, + mcvt_modify, + mcvt_load + + } manageCvt; + + + face->doblend = FALSE; + + if ( face->blend == NULL ) + { + if ( (error = TT_Get_MM_Var( face, NULL)) != 0 ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords != mmvar->num_axis ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + for ( i = 0; i < num_coords; ++i ) + if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + if ( blend->glyphoffsets == NULL ) + if ( (error = ft_var_load_gvar( face )) != 0 ) + goto Exit; + + if ( blend->normalizedcoords == NULL ) + { + if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) ) + goto Exit; + + manageCvt = mcvt_modify; + + /* If we have not set the blend coordinates before this, then the */ + /* cvt table will still be what we read from the `cvt ' table and */ + /* we don't need to reload it. We may need to change it though... */ + } + else + { + manageCvt = mcvt_retain; + for ( i = 0; i < num_coords; ++i ) + { + if ( blend->normalizedcoords[i] != coords[i] ) + { + manageCvt = mcvt_load; + break; + } + } + + /* If we don't change the blend coords then we don't need to do */ + /* anything to the cvt table. It will be correct. Otherwise we */ + /* no longer have the original cvt (it was modified when we set */ + /* the blend last time), so we must reload and then modify it. */ + } + + blend->num_axis = num_coords; + FT_MEM_COPY( blend->normalizedcoords, + coords, + num_coords * sizeof ( FT_Fixed ) ); + + face->doblend = TRUE; + + if ( face->cvt != NULL ) + { + switch ( manageCvt ) + { + case mcvt_load: + /* The cvt table has been loaded already; every time we change the */ + /* blend we may need to reload and remodify the cvt table. */ + FT_FREE( face->cvt ); + face->cvt = NULL; + + tt_face_load_cvt( face, face->root.stream ); + break; + + case mcvt_modify: + /* The original cvt table is in memory. All we need to do is */ + /* apply the `cvar' table (if any). */ + tt_face_vary_cvt( face, face->root.stream ); + break; + + case mcvt_retain: + /* The cvt table is correct for this set of coordinates. */ + break; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_Var_Design */ + /* */ + /* */ + /* Set the coordinates for the instance, measured in the user */ + /* coordinate system. Parse the `avar' table (if present) to convert */ + /* from user to normalized coordinates. */ + /* */ + /* */ + /* face :: The font face. */ + /* Initialize the blend struct with `gvar' data. */ + /* */ + /* */ + /* num_coords :: This must be the axis count of the font. */ + /* */ + /* coords :: A coordinate array with `num_coords' elements. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = TT_Err_Ok; + FT_Fixed* normalized = NULL; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i, j; + FT_Var_Axis* a; + GX_AVarSegment av; + FT_Memory memory = face->root.memory; + + + if ( face->blend == NULL ) + { + if ( (error = TT_Get_MM_Var( face, NULL )) != 0 ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords != mmvar->num_axis ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + /* Axis normalization is a two stage process. First we normalize */ + /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ + /* Then, if there's an `avar' table, we renormalize this range. */ + + if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) + goto Exit; + + a = mmvar->axis; + for ( i = 0; i < mmvar->num_axis; ++i, ++a ) + { + if ( coords[i] > a->maximum || coords[i] < a->minimum ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + if ( coords[i] < a->def ) + { + normalized[i] = -FT_MulDiv( coords[i] - a->def, + 0x10000L, + a->minimum - a->def ); + } + else if ( a->maximum == a->def ) + normalized[i] = 0; + else + { + normalized[i] = FT_MulDiv( coords[i] - a->def, + 0x10000L, + a->maximum - a->def ); + } + } + + if ( !blend->avar_checked ) + ft_var_load_avar( face ); + + if ( blend->avar_segment != NULL ) + { + av = blend->avar_segment; + for ( i = 0; i < mmvar->num_axis; ++i, ++av ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; ++j ) + if ( normalized[i] < av->correspondence[j].fromCoord ) + { + normalized[i] = + FT_MulDiv( + FT_MulDiv( + normalized[i] - av->correspondence[j - 1].fromCoord, + 0x10000L, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord ), + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord, + 0x10000L ) + + av->correspondence[j - 1].toCoord; + break; + } + } + } + + error = TT_Set_MM_Blend( face, num_coords, normalized ); + + Exit: + FT_FREE( normalized ); + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GX VAR PARSING ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_vary_cvt */ + /* */ + /* */ + /* Modify the loaded cvt table according to the `cvar' table and the */ + /* font's blend. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* Most errors are ignored. It is perfectly valid not to have a */ + /* `cvar' table even if there is a `gvar' and `fvar' table. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_start; + FT_ULong table_len; + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong here; + FT_UInt i, j; + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + GX_Blend blend = face->blend; + FT_UInt point_count; + FT_UShort* localpoints; + FT_Short* deltas; + + + FT_TRACE2(( "CVAR " )); + + if ( blend == NULL ) + { + FT_TRACE2(( "no blend specified!\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + if ( face->cvt == NULL ) + { + FT_TRACE2(( "no `cvt ' table!\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + error = face->goto_table( face, TTAG_cvar, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing!\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + if ( FT_FRAME_ENTER( table_len ) ) + { + error = TT_Err_Ok; + goto Exit; + } + + table_start = FT_Stream_FTell( stream ); + if ( FT_GET_LONG() != 0x00010000L ) + { + FT_TRACE2(( "bad table version!\n" )); + + error = TT_Err_Ok; + goto FExit; + } + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto FExit; + + tupleCount = FT_GET_USHORT(); + offsetToData = table_start + FT_GET_USHORT(); + + /* The documentation implies there are flags packed into the */ + /* tuplecount, but John Jenkins says that shared points don't apply */ + /* to `cvar', and no other flags are defined. */ + + for ( i = 0; i < ( tupleCount & 0xFFF ); ++i ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + /* There is no provision here for a global tuple coordinate section, */ + /* so John says. There are no tuple indices, just embedded tuples. */ + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; ++j ) + tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */ + /* short frac to fixed */ + } + else + { + /* skip this tuple; it makes no sense */ + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + for ( j = 0; j < 2 * blend->num_axis; ++j ) + (void)FT_GET_SHORT(); + + offsetToData += tupleDataSize; + continue; + } + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; ++j ) + im_start_coords[j] = FT_GET_SHORT() << 2; + for ( j = 0; j < blend->num_axis; ++j ) + im_end_coords[j] = FT_GET_SHORT() << 2; + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + if ( /* tuple isn't active for our blend */ + apply == 0 || + /* global points not allowed, */ + /* if they aren't local, makes no sense */ + !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) ) + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + localpoints = ft_var_readpackedpoints( stream, &point_count ); + deltas = ft_var_readpackeddeltas( stream, + point_count == 0 ? face->cvt_size + : point_count ); + if ( localpoints == NULL || deltas == NULL ) + /* failure, ignore it */; + + else if ( localpoints == ALL_POINTS ) + { + /* this means that there are deltas for every entry in cvt */ + for ( j = 0; j < face->cvt_size; ++j ) + face->cvt[j] = (FT_Short)( face->cvt[j] + + FT_MulFix( deltas[j], apply ) ); + } + + else + { + for ( j = 0; j < point_count; ++j ) + { + int pindex = localpoints[j]; + + face->cvt[pindex] = (FT_Short)( face->cvt[pindex] + + FT_MulFix( deltas[j], apply ) ); + } + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + FExit: + FT_FRAME_EXIT(); + + Exit: + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Vary_Get_Glyph_Deltas */ + /* */ + /* */ + /* Load the appropriate deltas for the current glyph. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* glyph_index :: The index of the glyph being modified. */ + /* */ + /* n_points :: The number of the points in the glyph, including */ + /* phantom points. */ + /* */ + /* */ + /* deltas :: The array of points to change. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Vary_Get_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Vector* *deltas, + FT_UInt n_points ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + FT_Vector* delta_xy; + + FT_Error error; + FT_ULong glyph_start; + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong here; + FT_UInt i, j; + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + FT_UInt point_count, spoint_count = 0; + FT_UShort* sharedpoints = NULL; + FT_UShort* localpoints = NULL; + FT_UShort* points; + FT_Short *deltas_x, *deltas_y; + + + if ( !face->doblend || blend == NULL ) + return TT_Err_Invalid_Argument; + + /* to be freed by the caller */ + if ( FT_NEW_ARRAY( delta_xy, n_points ) ) + goto Exit; + *deltas = delta_xy; + + if ( glyph_index >= blend->gv_glyphcnt || + blend->glyphoffsets[glyph_index] == + blend->glyphoffsets[glyph_index + 1] ) + return TT_Err_Ok; /* no variation data for this glyph */ + + if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) || + FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] - + blend->glyphoffsets[glyph_index] ) ) + goto Fail1; + + glyph_start = FT_Stream_FTell( stream ); + + /* each set of glyph variation data is formatted similarly to `cvar' */ + /* (except we get shared points and global tuples) */ + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto Fail2; + + tupleCount = FT_GET_USHORT(); + offsetToData = glyph_start + FT_GET_USHORT(); + + if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) + { + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + sharedpoints = ft_var_readpackedpoints( stream, &spoint_count ); + offsetToData = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, here ); + } + + for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; ++j ) + tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */ + /* short frac to fixed */ + } + else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) + { + error = TT_Err_Invalid_Table; + goto Fail3; + } + else + { + FT_MEM_COPY( + tuple_coords, + &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis], + blend->num_axis * sizeof ( FT_Fixed ) ); + } + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; ++j ) + im_start_coords[j] = FT_GET_SHORT() << 2; + for ( j = 0; j < blend->num_axis; ++j ) + im_end_coords[j] = FT_GET_SHORT() << 2; + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + + if ( apply == 0 ) /* tuple isn't active for our blend */ + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) + { + FT_Stream_SeekSet( stream, offsetToData ); + + localpoints = ft_var_readpackedpoints( stream, &point_count ); + points = localpoints; + } + else + { + points = sharedpoints; + point_count = spoint_count; + } + + deltas_x = ft_var_readpackeddeltas( stream, + point_count == 0 ? n_points + : point_count ); + deltas_y = ft_var_readpackeddeltas( stream, + point_count == 0 ? n_points + : point_count ); + + if ( points == NULL || deltas_y == NULL || deltas_x == NULL ) + ; /* failure, ignore it */ + + else if ( points == ALL_POINTS ) + { + /* this means that there are deltas for every point in the glyph */ + for ( j = 0; j < n_points; ++j ) + { + delta_xy[j].x += FT_MulFix( deltas_x[j], apply ); + delta_xy[j].y += FT_MulFix( deltas_y[j], apply ); + } + } + + else + { + for ( j = 0; j < point_count; ++j ) + { + delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply ); + delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply ); + } + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas_x ); + FT_FREE( deltas_y ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + Fail3: + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + Fail2: + FT_FRAME_EXIT(); + + Fail1: + if ( error ) + { + FT_FREE( delta_xy ); + *deltas = NULL; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_done_blend */ + /* */ + /* */ + /* Frees the blend internal data structure. */ + /* */ + FT_LOCAL_DEF( void ) + tt_done_blend( FT_Memory memory, + GX_Blend blend ) + { + if ( blend != NULL ) + { + FT_UInt i; + + + FT_FREE( blend->normalizedcoords ); + FT_FREE( blend->mmvar ); + + if ( blend->avar_segment != NULL ) + { + for ( i = 0; i < blend->num_axis; ++i ) + FT_FREE( blend->avar_segment[i].correspondence ); + FT_FREE( blend->avar_segment ); + } + + FT_FREE( blend->tuplecoords ); + FT_FREE( blend->glyphoffsets ); + FT_FREE( blend ); + } + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttgxvar.h b/src/3rdparty/freetype/src/truetype/ttgxvar.h new file mode 100644 index 0000000000..706cb4d369 --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttgxvar.h @@ -0,0 +1,182 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.h */ +/* */ +/* TrueType GX Font Variation loader (specification) */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTGXVAR_H__ +#define __TTGXVAR_H__ + + +#include +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* GX_AVarCorrespondenceRec */ + /* */ + /* */ + /* A data structure representing `shortFracCorrespondence' in `avar' */ + /* table according to the specifications from Apple. */ + /* */ + typedef struct GX_AVarCorrespondenceRec_ + { + FT_Fixed fromCoord; + FT_Fixed toCoord; + + } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_AVarRec */ + /* */ + /* */ + /* Data from the segment field of `avar' table. */ + /* There is one of these for each axis. */ + /* */ + typedef struct GX_AVarSegmentRec_ + { + FT_UShort pairCount; + GX_AVarCorrespondence correspondence; /* array with pairCount entries */ + + } GX_AVarSegmentRec, *GX_AVarSegment; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_BlendRec */ + /* */ + /* */ + /* Data for interpolating a font from a distortable font specified */ + /* by the GX *var tables ([fgca]var). */ + /* */ + /* */ + /* num_axis :: The number of axes along which interpolation */ + /* may happen */ + /* */ + /* normalizedcoords :: A normalized value (between [-1,1]) indicating */ + /* the contribution along each axis to the final */ + /* interpolated font. */ + /* */ + typedef struct GX_BlendRec_ + { + FT_UInt num_axis; + FT_Fixed* normalizedcoords; + + FT_MM_Var* mmvar; + FT_Int mmvar_len; + + FT_Bool avar_checked; + GX_AVarSegment avar_segment; + + FT_UInt tuplecount; /* shared tuples in `gvar' */ + FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ + + FT_UInt gv_glyphcnt; + FT_ULong* glyphoffsets; + + } GX_BlendRec; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_TupleCountFlags */ + /* */ + /* */ + /* Flags used within the `TupleCount' field of the `gvar' table. */ + /* */ + typedef enum GX_TupleCountFlags_ + { + GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000, + GX_TC_RESERVED_TUPLE_FLAGS = 0x7000, + GX_TC_TUPLE_COUNT_MASK = 0x0FFF + + } GX_TupleCountFlags; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_TupleIndexFlags */ + /* */ + /* */ + /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */ + /* tables. */ + /* */ + typedef enum GX_TupleIndexFlags_ + { + GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, + GX_TI_INTERMEDIATE_TUPLE = 0x4000, + GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, + GX_TI_RESERVED_TUPLE_FLAG = 0x1000, + GX_TI_TUPLE_INDEX_MASK = 0x0FFF + + } GX_TupleIndexFlags; + + +#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) +#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) +#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) +#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) + + + FT_LOCAL( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ); + + + FT_LOCAL( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + TT_Vary_Get_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Vector* *deltas, + FT_UInt n_points ); + + + FT_LOCAL( void ) + tt_done_blend( FT_Memory memory, + GX_Blend blend ); + + +FT_END_HEADER + + +#endif /* __TTGXVAR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttinterp.c b/src/3rdparty/freetype/src/truetype/ttinterp.c new file mode 100644 index 0000000000..3be2502b1f --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttinterp.c @@ -0,0 +1,7828 @@ +/***************************************************************************/ +/* */ +/* ttinterp.c */ +/* */ +/* TrueType bytecode interpreter (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_TRIGONOMETRY_H +#include FT_SYSTEM_H + +#include "ttinterp.h" + +#include "tterrors.h" + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + +#define TT_MULFIX FT_MulFix +#define TT_MULDIV FT_MulDiv +#define TT_MULDIV_NO_ROUND FT_MulDiv_No_Round + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttinterp + + /*************************************************************************/ + /* */ + /* In order to detect infinite loops in the code, we set up a counter */ + /* within the run loop. A single stroke of interpretation is now */ + /* limited to a maximal number of opcodes defined below. */ + /* */ +#define MAX_RUNNABLE_OPCODES 1000000L + + + /*************************************************************************/ + /* */ + /* There are two kinds of implementations: */ + /* */ + /* a. static implementation */ + /* */ + /* The current execution context is a static variable, which fields */ + /* are accessed directly by the interpreter during execution. The */ + /* context is named `cur'. */ + /* */ + /* This version is non-reentrant, of course. */ + /* */ + /* b. indirect implementation */ + /* */ + /* The current execution context is passed to _each_ function as its */ + /* first argument, and each field is thus accessed indirectly. */ + /* */ + /* This version is fully re-entrant. */ + /* */ + /* The idea is that an indirect implementation may be slower to execute */ + /* on low-end processors that are used in some systems (like 386s or */ + /* even 486s). */ + /* */ + /* As a consequence, the indirect implementation is now the default, as */ + /* its performance costs can be considered negligible in our context. */ + /* Note, however, that we kept the same source with macros because: */ + /* */ + /* - The code is kept very close in design to the Pascal code used for */ + /* development. */ + /* */ + /* - It's much more readable that way! */ + /* */ + /* - It's still open to experimentation and tuning. */ + /* */ + /*************************************************************************/ + + +#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ + +#define CUR (*exc) /* see ttobjs.h */ + + /*************************************************************************/ + /* */ + /* This macro is used whenever `exec' is unused in a function, to avoid */ + /* stupid warnings from pedantic compilers. */ + /* */ +#define FT_UNUSED_EXEC FT_UNUSED( exc ) + +#else /* static implementation */ + +#define CUR cur + +#define FT_UNUSED_EXEC int __dummy = __dummy + + static + TT_ExecContextRec cur; /* static exec. context variable */ + + /* apparently, we have a _lot_ of direct indexing when accessing */ + /* the static `cur', which makes the code bigger (due to all the */ + /* four bytes addresses). */ + +#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* The instruction argument stack. */ + /* */ +#define INS_ARG EXEC_OP_ FT_Long* args /* see ttobjs.h for EXEC_OP_ */ + + + /*************************************************************************/ + /* */ + /* This macro is used whenever `args' is unused in a function, to avoid */ + /* stupid warnings from pedantic compilers. */ + /* */ +#define FT_UNUSED_ARG FT_UNUSED_EXEC; FT_UNUSED( args ) + + + /*************************************************************************/ + /* */ + /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to */ + /* increase readability of the code. */ + /* */ + /*************************************************************************/ + + +#define SKIP_Code() \ + SkipCode( EXEC_ARG ) + +#define GET_ShortIns() \ + GetShortIns( EXEC_ARG ) + +#define NORMalize( x, y, v ) \ + Normalize( EXEC_ARG_ x, y, v ) + +#define SET_SuperRound( scale, flags ) \ + SetSuperRound( EXEC_ARG_ scale, flags ) + +#define ROUND_None( d, c ) \ + Round_None( EXEC_ARG_ d, c ) + +#define INS_Goto_CodeRange( range, ip ) \ + Ins_Goto_CodeRange( EXEC_ARG_ range, ip ) + +#define CUR_Func_move( z, p, d ) \ + CUR.func_move( EXEC_ARG_ z, p, d ) + +#define CUR_Func_move_orig( z, p, d ) \ + CUR.func_move_orig( EXEC_ARG_ z, p, d ) + +#define CUR_Func_round( d, c ) \ + CUR.func_round( EXEC_ARG_ d, c ) + +#define CUR_Func_read_cvt( index ) \ + CUR.func_read_cvt( EXEC_ARG_ index ) + +#define CUR_Func_write_cvt( index, val ) \ + CUR.func_write_cvt( EXEC_ARG_ index, val ) + +#define CUR_Func_move_cvt( index, val ) \ + CUR.func_move_cvt( EXEC_ARG_ index, val ) + +#define CURRENT_Ratio() \ + Current_Ratio( EXEC_ARG ) + +#define CURRENT_Ppem() \ + Current_Ppem( EXEC_ARG ) + +#define CUR_Ppem() \ + Cur_PPEM( EXEC_ARG ) + +#define INS_SxVTL( a, b, c, d ) \ + Ins_SxVTL( EXEC_ARG_ a, b, c, d ) + +#define COMPUTE_Funcs() \ + Compute_Funcs( EXEC_ARG ) + +#define COMPUTE_Round( a ) \ + Compute_Round( EXEC_ARG_ a ) + +#define COMPUTE_Point_Displacement( a, b, c, d ) \ + Compute_Point_Displacement( EXEC_ARG_ a, b, c, d ) + +#define MOVE_Zp2_Point( a, b, c, t ) \ + Move_Zp2_Point( EXEC_ARG_ a, b, c, t ) + + +#define CUR_Func_project( v1, v2 ) \ + CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) + +#define CUR_Func_dualproj( v1, v2 ) \ + CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) + +#define CUR_fast_project( v ) \ + CUR.func_project( EXEC_ARG_ (v)->x, (v)->y ) + +#define CUR_fast_dualproj( v ) \ + CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y ) + + + /*************************************************************************/ + /* */ + /* Instruction dispatch function, as used by the interpreter. */ + /* */ + typedef void (*TInstruction_Function)( INS_ARG ); + + + /*************************************************************************/ + /* */ + /* A simple bounds-checking macro. */ + /* */ +#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) + +#undef SUCCESS +#define SUCCESS 0 + +#undef FAILURE +#define FAILURE 1 + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define GUESS_VECTOR( V ) \ + if ( CUR.face->unpatented_hinting ) \ + { \ + CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \ + CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \ + } +#else +#define GUESS_VECTOR( V ) +#endif + + /*************************************************************************/ + /* */ + /* CODERANGE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Goto_CodeRange */ + /* */ + /* */ + /* Switches to a new code range (updates the code related elements in */ + /* `exec', and `IP'). */ + /* */ + /* */ + /* range :: The new execution code range. */ + /* */ + /* IP :: The new IP in the new code range. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ) + { + TT_CodeRange* coderange; + + + FT_ASSERT( range >= 1 && range <= 3 ); + + coderange = &exec->codeRangeTable[range - 1]; + + FT_ASSERT( coderange->base != NULL ); + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for IP <= Size instead of IP < Size. */ + /* */ + FT_ASSERT( (FT_ULong)IP <= coderange->size ); + + exec->code = coderange->base; + exec->codeSize = coderange->size; + exec->IP = IP; + exec->curRange = range; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_CodeRange */ + /* */ + /* */ + /* Sets a code range. */ + /* */ + /* */ + /* range :: The code range index. */ + /* */ + /* base :: The new code base. */ + /* */ + /* length :: The range size in bytes. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = (FT_Byte*)base; + exec->codeRangeTable[range - 1].size = length; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Clear_CodeRange */ + /* */ + /* */ + /* Clears a code range. */ + /* */ + /* */ + /* range :: The code range index. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Does not set the Error variable. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = NULL; + exec->codeRangeTable[range - 1].size = 0; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* EXECUTION CONTEXT ROUTINES */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_Context */ + /* */ + /* */ + /* Destroys a given context. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Done_Context( TT_ExecContext exec ) + { + FT_Memory memory = exec->memory; + + + /* points zone */ + exec->maxPoints = 0; + exec->maxContours = 0; + + /* free stack */ + FT_FREE( exec->stack ); + exec->stackSize = 0; + + /* free call stack */ + FT_FREE( exec->callStack ); + exec->callSize = 0; + exec->callTop = 0; + + /* free glyph code range */ + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + + exec->size = NULL; + exec->face = NULL; + + FT_FREE( exec ); + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Init_Context */ + /* */ + /* */ + /* Initializes a context object. */ + /* */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Init_Context( TT_ExecContext exec, + FT_Memory memory ) + { + FT_Error error; + + + FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec )); + + exec->memory = memory; + exec->callSize = 32; + + if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) ) + goto Fail_Memory; + + /* all values in the context are set to 0 already, but this is */ + /* here as a remainder */ + exec->maxPoints = 0; + exec->maxContours = 0; + + exec->stackSize = 0; + exec->glyphSize = 0; + + exec->stack = NULL; + exec->glyphIns = NULL; + + exec->face = NULL; + exec->size = NULL; + + return TT_Err_Ok; + + Fail_Memory: + FT_ERROR(( "Init_Context: not enough memory for 0x%08lx\n", + (FT_Long)exec )); + TT_Done_Context( exec ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Update_Max */ + /* */ + /* */ + /* Checks the size of a buffer and reallocates it if necessary. */ + /* */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* multiplier :: The size in bytes of each element in the buffer. */ + /* */ + /* new_max :: The new capacity (size) of the buffer. */ + /* */ + /* */ + /* size :: The address of the buffer's current size expressed */ + /* in elements. */ + /* */ + /* buff :: The address of the buffer base pointer. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Update_Max( FT_Memory memory, + FT_ULong* size, + FT_Long multiplier, + void* _pbuff, + FT_ULong new_max ) + { + FT_Error error; + void** pbuff = (void**)_pbuff; + + + if ( *size < new_max ) + { + if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) ) + return error; + *size = new_max; + } + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Context */ + /* */ + /* */ + /* Prepare an execution context for glyph hinting. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* size :: A handle to the source size object. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ) + { + FT_Int i; + FT_ULong tmp; + TT_MaxProfile* maxp; + FT_Error error; + + + exec->face = face; + maxp = &face->max_profile; + exec->size = size; + + if ( size ) + { + exec->numFDefs = size->num_function_defs; + exec->maxFDefs = size->max_function_defs; + exec->numIDefs = size->num_instruction_defs; + exec->maxIDefs = size->max_instruction_defs; + exec->FDefs = size->function_defs; + exec->IDefs = size->instruction_defs; + exec->tt_metrics = size->ttmetrics; + exec->metrics = size->metrics; + + exec->maxFunc = size->max_func; + exec->maxIns = size->max_ins; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + exec->codeRangeTable[i] = size->codeRangeTable[i]; + + /* set graphics state */ + exec->GS = size->GS; + + exec->cvtSize = size->cvt_size; + exec->cvt = size->cvt; + + exec->storeSize = size->storage_size; + exec->storage = size->storage; + + exec->twilight = size->twilight; + } + + /* XXX: We reserve a little more elements on the stack to deal safely */ + /* with broken fonts like arialbs, courbs, timesbs, etc. */ + tmp = exec->stackSize; + error = Update_Max( exec->memory, + &tmp, + sizeof ( FT_F26Dot6 ), + (void*)&exec->stack, + maxp->maxStackElements + 32 ); + exec->stackSize = (FT_UInt)tmp; + if ( error ) + return error; + + tmp = exec->glyphSize; + error = Update_Max( exec->memory, + &tmp, + sizeof ( FT_Byte ), + (void*)&exec->glyphIns, + maxp->maxSizeOfInstructions ); + exec->glyphSize = (FT_UShort)tmp; + if ( error ) + return error; + + exec->pts.n_points = 0; + exec->pts.n_contours = 0; + + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + exec->zp0 = exec->pts; + + exec->instruction_trap = FALSE; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Save_Context */ + /* */ + /* */ + /* Saves the code ranges in a `size' object. */ + /* */ + /* */ + /* exec :: A handle to the source execution context. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Save_Context( TT_ExecContext exec, + TT_Size size ) + { + FT_Int i; + + + /* XXXX: Will probably disappear soon with all the code range */ + /* management, which is now rather obsolete. */ + /* */ + size->num_function_defs = exec->numFDefs; + size->num_instruction_defs = exec->numIDefs; + + size->max_func = exec->maxFunc; + size->max_ins = exec->maxIns; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + size->codeRangeTable[i] = exec->codeRangeTable[i]; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Run_Context */ + /* */ + /* */ + /* Executes one or more instructions in the execution context. */ + /* */ + /* */ + /* debug :: A Boolean flag. If set, the function sets some internal */ + /* variables and returns immediately, otherwise TT_RunIns() */ + /* is called. */ + /* */ + /* This is commented out currently. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* TrueType error code. 0 means success. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Run_Context( TT_ExecContext exec, + FT_Bool debug ) + { + FT_Error error; + + + if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) ) + != TT_Err_Ok ) + return error; + + exec->zp0 = exec->pts; + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + + exec->GS.gep0 = 1; + exec->GS.gep1 = 1; + exec->GS.gep2 = 1; + + exec->GS.projVector.x = 0x4000; + exec->GS.projVector.y = 0x0000; + + exec->GS.freeVector = exec->GS.projVector; + exec->GS.dualVector = exec->GS.projVector; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + exec->GS.both_x_axis = TRUE; +#endif + + exec->GS.round_state = 1; + exec->GS.loop = 1; + + /* some glyphs leave something on the stack. so we clean it */ + /* before a new execution. */ + exec->top = 0; + exec->callTop = 0; + +#if 1 + FT_UNUSED( debug ); + + return exec->face->interpreter( exec ); +#else + if ( !debug ) + return TT_RunIns( exec ); + else + return TT_Err_Ok; +#endif + } + + + /* The default value for `scan_control' is documented as FALSE in the */ + /* TrueType specification. This is confusing since it implies a */ + /* Boolean value. However, this is not the case, thus both the */ + /* default values of our `scan_type' and `scan_control' fields (which */ + /* the documentation's `scan_control' variable is split into) are */ + /* zero. */ + + const TT_GraphicsState tt_default_graphics_state = + { + 0, 0, 0, + { 0x4000, 0 }, + { 0x4000, 0 }, + { 0x4000, 0 }, + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + TRUE, +#endif + + 1, 64, 1, + TRUE, 68, 0, 0, 9, 3, + 0, FALSE, 0, 1, 1, 1 + }; + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( TT_ExecContext ) + TT_New_Context( TT_Driver driver ) + { + TT_ExecContext exec; + FT_Memory memory; + + + memory = driver->root.root.memory; + exec = driver->context; + + if ( !driver->context ) + { + FT_Error error; + + + /* allocate object */ + if ( FT_NEW( exec ) ) + goto Exit; + + /* initialize it */ + error = Init_Context( exec, memory ); + if ( error ) + goto Fail; + + /* store it into the driver */ + driver->context = exec; + } + + Exit: + return driver->context; + + Fail: + return 0; + } + + + /*************************************************************************/ + /* */ + /* Before an opcode is executed, the interpreter verifies that there are */ + /* enough arguments on the stack, with the help of the `Pop_Push_Count' */ + /* table. */ + /* */ + /* For each opcode, the first column gives the number of arguments that */ + /* are popped from the stack; the second one gives the number of those */ + /* that are pushed in result. */ + /* */ + /* Opcodes which have a varying number of parameters in the data stream */ + /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */ + /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */ + /* to zero. */ + /* */ + /*************************************************************************/ + + +#undef PACK +#define PACK( x, y ) ( ( x << 4 ) | y ) + + + static + const FT_Byte Pop_Push_Count[256] = + { + /* opcodes are gathered in groups of 16 */ + /* please keep the spaces as they are */ + + /* SVTCA y */ PACK( 0, 0 ), + /* SVTCA x */ PACK( 0, 0 ), + /* SPvTCA y */ PACK( 0, 0 ), + /* SPvTCA x */ PACK( 0, 0 ), + /* SFvTCA y */ PACK( 0, 0 ), + /* SFvTCA x */ PACK( 0, 0 ), + /* SPvTL // */ PACK( 2, 0 ), + /* SPvTL + */ PACK( 2, 0 ), + /* SFvTL // */ PACK( 2, 0 ), + /* SFvTL + */ PACK( 2, 0 ), + /* SPvFS */ PACK( 2, 0 ), + /* SFvFS */ PACK( 2, 0 ), + /* GPV */ PACK( 0, 2 ), + /* GFV */ PACK( 0, 2 ), + /* SFvTPv */ PACK( 0, 0 ), + /* ISECT */ PACK( 5, 0 ), + + /* SRP0 */ PACK( 1, 0 ), + /* SRP1 */ PACK( 1, 0 ), + /* SRP2 */ PACK( 1, 0 ), + /* SZP0 */ PACK( 1, 0 ), + /* SZP1 */ PACK( 1, 0 ), + /* SZP2 */ PACK( 1, 0 ), + /* SZPS */ PACK( 1, 0 ), + /* SLOOP */ PACK( 1, 0 ), + /* RTG */ PACK( 0, 0 ), + /* RTHG */ PACK( 0, 0 ), + /* SMD */ PACK( 1, 0 ), + /* ELSE */ PACK( 0, 0 ), + /* JMPR */ PACK( 1, 0 ), + /* SCvTCi */ PACK( 1, 0 ), + /* SSwCi */ PACK( 1, 0 ), + /* SSW */ PACK( 1, 0 ), + + /* DUP */ PACK( 1, 2 ), + /* POP */ PACK( 1, 0 ), + /* CLEAR */ PACK( 0, 0 ), + /* SWAP */ PACK( 2, 2 ), + /* DEPTH */ PACK( 0, 1 ), + /* CINDEX */ PACK( 1, 1 ), + /* MINDEX */ PACK( 1, 0 ), + /* AlignPTS */ PACK( 2, 0 ), + /* INS_$28 */ PACK( 0, 0 ), + /* UTP */ PACK( 1, 0 ), + /* LOOPCALL */ PACK( 2, 0 ), + /* CALL */ PACK( 1, 0 ), + /* FDEF */ PACK( 1, 0 ), + /* ENDF */ PACK( 0, 0 ), + /* MDAP[0] */ PACK( 1, 0 ), + /* MDAP[1] */ PACK( 1, 0 ), + + /* IUP[0] */ PACK( 0, 0 ), + /* IUP[1] */ PACK( 0, 0 ), + /* SHP[0] */ PACK( 0, 0 ), + /* SHP[1] */ PACK( 0, 0 ), + /* SHC[0] */ PACK( 1, 0 ), + /* SHC[1] */ PACK( 1, 0 ), + /* SHZ[0] */ PACK( 1, 0 ), + /* SHZ[1] */ PACK( 1, 0 ), + /* SHPIX */ PACK( 1, 0 ), + /* IP */ PACK( 0, 0 ), + /* MSIRP[0] */ PACK( 2, 0 ), + /* MSIRP[1] */ PACK( 2, 0 ), + /* AlignRP */ PACK( 0, 0 ), + /* RTDG */ PACK( 0, 0 ), + /* MIAP[0] */ PACK( 2, 0 ), + /* MIAP[1] */ PACK( 2, 0 ), + + /* NPushB */ PACK( 0, 0 ), + /* NPushW */ PACK( 0, 0 ), + /* WS */ PACK( 2, 0 ), + /* RS */ PACK( 1, 1 ), + /* WCvtP */ PACK( 2, 0 ), + /* RCvt */ PACK( 1, 1 ), + /* GC[0] */ PACK( 1, 1 ), + /* GC[1] */ PACK( 1, 1 ), + /* SCFS */ PACK( 2, 0 ), + /* MD[0] */ PACK( 2, 1 ), + /* MD[1] */ PACK( 2, 1 ), + /* MPPEM */ PACK( 0, 1 ), + /* MPS */ PACK( 0, 1 ), + /* FlipON */ PACK( 0, 0 ), + /* FlipOFF */ PACK( 0, 0 ), + /* DEBUG */ PACK( 1, 0 ), + + /* LT */ PACK( 2, 1 ), + /* LTEQ */ PACK( 2, 1 ), + /* GT */ PACK( 2, 1 ), + /* GTEQ */ PACK( 2, 1 ), + /* EQ */ PACK( 2, 1 ), + /* NEQ */ PACK( 2, 1 ), + /* ODD */ PACK( 1, 1 ), + /* EVEN */ PACK( 1, 1 ), + /* IF */ PACK( 1, 0 ), + /* EIF */ PACK( 0, 0 ), + /* AND */ PACK( 2, 1 ), + /* OR */ PACK( 2, 1 ), + /* NOT */ PACK( 1, 1 ), + /* DeltaP1 */ PACK( 1, 0 ), + /* SDB */ PACK( 1, 0 ), + /* SDS */ PACK( 1, 0 ), + + /* ADD */ PACK( 2, 1 ), + /* SUB */ PACK( 2, 1 ), + /* DIV */ PACK( 2, 1 ), + /* MUL */ PACK( 2, 1 ), + /* ABS */ PACK( 1, 1 ), + /* NEG */ PACK( 1, 1 ), + /* FLOOR */ PACK( 1, 1 ), + /* CEILING */ PACK( 1, 1 ), + /* ROUND[0] */ PACK( 1, 1 ), + /* ROUND[1] */ PACK( 1, 1 ), + /* ROUND[2] */ PACK( 1, 1 ), + /* ROUND[3] */ PACK( 1, 1 ), + /* NROUND[0] */ PACK( 1, 1 ), + /* NROUND[1] */ PACK( 1, 1 ), + /* NROUND[2] */ PACK( 1, 1 ), + /* NROUND[3] */ PACK( 1, 1 ), + + /* WCvtF */ PACK( 2, 0 ), + /* DeltaP2 */ PACK( 1, 0 ), + /* DeltaP3 */ PACK( 1, 0 ), + /* DeltaCn[0] */ PACK( 1, 0 ), + /* DeltaCn[1] */ PACK( 1, 0 ), + /* DeltaCn[2] */ PACK( 1, 0 ), + /* SROUND */ PACK( 1, 0 ), + /* S45Round */ PACK( 1, 0 ), + /* JROT */ PACK( 2, 0 ), + /* JROF */ PACK( 2, 0 ), + /* ROFF */ PACK( 0, 0 ), + /* INS_$7B */ PACK( 0, 0 ), + /* RUTG */ PACK( 0, 0 ), + /* RDTG */ PACK( 0, 0 ), + /* SANGW */ PACK( 1, 0 ), + /* AA */ PACK( 1, 0 ), + + /* FlipPT */ PACK( 0, 0 ), + /* FlipRgON */ PACK( 2, 0 ), + /* FlipRgOFF */ PACK( 2, 0 ), + /* INS_$83 */ PACK( 0, 0 ), + /* INS_$84 */ PACK( 0, 0 ), + /* ScanCTRL */ PACK( 1, 0 ), + /* SDVPTL[0] */ PACK( 2, 0 ), + /* SDVPTL[1] */ PACK( 2, 0 ), + /* GetINFO */ PACK( 1, 1 ), + /* IDEF */ PACK( 1, 0 ), + /* ROLL */ PACK( 3, 3 ), + /* MAX */ PACK( 2, 1 ), + /* MIN */ PACK( 2, 1 ), + /* ScanTYPE */ PACK( 1, 0 ), + /* InstCTRL */ PACK( 2, 0 ), + /* INS_$8F */ PACK( 0, 0 ), + + /* INS_$90 */ PACK( 0, 0 ), + /* INS_$91 */ PACK( 0, 0 ), + /* INS_$92 */ PACK( 0, 0 ), + /* INS_$93 */ PACK( 0, 0 ), + /* INS_$94 */ PACK( 0, 0 ), + /* INS_$95 */ PACK( 0, 0 ), + /* INS_$96 */ PACK( 0, 0 ), + /* INS_$97 */ PACK( 0, 0 ), + /* INS_$98 */ PACK( 0, 0 ), + /* INS_$99 */ PACK( 0, 0 ), + /* INS_$9A */ PACK( 0, 0 ), + /* INS_$9B */ PACK( 0, 0 ), + /* INS_$9C */ PACK( 0, 0 ), + /* INS_$9D */ PACK( 0, 0 ), + /* INS_$9E */ PACK( 0, 0 ), + /* INS_$9F */ PACK( 0, 0 ), + + /* INS_$A0 */ PACK( 0, 0 ), + /* INS_$A1 */ PACK( 0, 0 ), + /* INS_$A2 */ PACK( 0, 0 ), + /* INS_$A3 */ PACK( 0, 0 ), + /* INS_$A4 */ PACK( 0, 0 ), + /* INS_$A5 */ PACK( 0, 0 ), + /* INS_$A6 */ PACK( 0, 0 ), + /* INS_$A7 */ PACK( 0, 0 ), + /* INS_$A8 */ PACK( 0, 0 ), + /* INS_$A9 */ PACK( 0, 0 ), + /* INS_$AA */ PACK( 0, 0 ), + /* INS_$AB */ PACK( 0, 0 ), + /* INS_$AC */ PACK( 0, 0 ), + /* INS_$AD */ PACK( 0, 0 ), + /* INS_$AE */ PACK( 0, 0 ), + /* INS_$AF */ PACK( 0, 0 ), + + /* PushB[0] */ PACK( 0, 1 ), + /* PushB[1] */ PACK( 0, 2 ), + /* PushB[2] */ PACK( 0, 3 ), + /* PushB[3] */ PACK( 0, 4 ), + /* PushB[4] */ PACK( 0, 5 ), + /* PushB[5] */ PACK( 0, 6 ), + /* PushB[6] */ PACK( 0, 7 ), + /* PushB[7] */ PACK( 0, 8 ), + /* PushW[0] */ PACK( 0, 1 ), + /* PushW[1] */ PACK( 0, 2 ), + /* PushW[2] */ PACK( 0, 3 ), + /* PushW[3] */ PACK( 0, 4 ), + /* PushW[4] */ PACK( 0, 5 ), + /* PushW[5] */ PACK( 0, 6 ), + /* PushW[6] */ PACK( 0, 7 ), + /* PushW[7] */ PACK( 0, 8 ), + + /* MDRP[00] */ PACK( 1, 0 ), + /* MDRP[01] */ PACK( 1, 0 ), + /* MDRP[02] */ PACK( 1, 0 ), + /* MDRP[03] */ PACK( 1, 0 ), + /* MDRP[04] */ PACK( 1, 0 ), + /* MDRP[05] */ PACK( 1, 0 ), + /* MDRP[06] */ PACK( 1, 0 ), + /* MDRP[07] */ PACK( 1, 0 ), + /* MDRP[08] */ PACK( 1, 0 ), + /* MDRP[09] */ PACK( 1, 0 ), + /* MDRP[10] */ PACK( 1, 0 ), + /* MDRP[11] */ PACK( 1, 0 ), + /* MDRP[12] */ PACK( 1, 0 ), + /* MDRP[13] */ PACK( 1, 0 ), + /* MDRP[14] */ PACK( 1, 0 ), + /* MDRP[15] */ PACK( 1, 0 ), + + /* MDRP[16] */ PACK( 1, 0 ), + /* MDRP[17] */ PACK( 1, 0 ), + /* MDRP[18] */ PACK( 1, 0 ), + /* MDRP[19] */ PACK( 1, 0 ), + /* MDRP[20] */ PACK( 1, 0 ), + /* MDRP[21] */ PACK( 1, 0 ), + /* MDRP[22] */ PACK( 1, 0 ), + /* MDRP[23] */ PACK( 1, 0 ), + /* MDRP[24] */ PACK( 1, 0 ), + /* MDRP[25] */ PACK( 1, 0 ), + /* MDRP[26] */ PACK( 1, 0 ), + /* MDRP[27] */ PACK( 1, 0 ), + /* MDRP[28] */ PACK( 1, 0 ), + /* MDRP[29] */ PACK( 1, 0 ), + /* MDRP[30] */ PACK( 1, 0 ), + /* MDRP[31] */ PACK( 1, 0 ), + + /* MIRP[00] */ PACK( 2, 0 ), + /* MIRP[01] */ PACK( 2, 0 ), + /* MIRP[02] */ PACK( 2, 0 ), + /* MIRP[03] */ PACK( 2, 0 ), + /* MIRP[04] */ PACK( 2, 0 ), + /* MIRP[05] */ PACK( 2, 0 ), + /* MIRP[06] */ PACK( 2, 0 ), + /* MIRP[07] */ PACK( 2, 0 ), + /* MIRP[08] */ PACK( 2, 0 ), + /* MIRP[09] */ PACK( 2, 0 ), + /* MIRP[10] */ PACK( 2, 0 ), + /* MIRP[11] */ PACK( 2, 0 ), + /* MIRP[12] */ PACK( 2, 0 ), + /* MIRP[13] */ PACK( 2, 0 ), + /* MIRP[14] */ PACK( 2, 0 ), + /* MIRP[15] */ PACK( 2, 0 ), + + /* MIRP[16] */ PACK( 2, 0 ), + /* MIRP[17] */ PACK( 2, 0 ), + /* MIRP[18] */ PACK( 2, 0 ), + /* MIRP[19] */ PACK( 2, 0 ), + /* MIRP[20] */ PACK( 2, 0 ), + /* MIRP[21] */ PACK( 2, 0 ), + /* MIRP[22] */ PACK( 2, 0 ), + /* MIRP[23] */ PACK( 2, 0 ), + /* MIRP[24] */ PACK( 2, 0 ), + /* MIRP[25] */ PACK( 2, 0 ), + /* MIRP[26] */ PACK( 2, 0 ), + /* MIRP[27] */ PACK( 2, 0 ), + /* MIRP[28] */ PACK( 2, 0 ), + /* MIRP[29] */ PACK( 2, 0 ), + /* MIRP[30] */ PACK( 2, 0 ), + /* MIRP[31] */ PACK( 2, 0 ) + }; + + + static + const FT_Char opcode_length[256] = + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }; + +#undef PACK + +#if 1 + + static FT_Int32 + TT_MulFix14( FT_Int32 a, + FT_Int b ) + { + FT_Int32 sign; + FT_UInt32 ah, al, mid, lo, hi; + + + sign = a ^ b; + + if ( a < 0 ) + a = -a; + if ( b < 0 ) + b = -b; + + ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU ); + al = (FT_UInt32)( a & 0xFFFFU ); + + lo = al * b; + mid = ah * b; + hi = mid >> 16; + mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */ + lo += mid; + if ( lo < mid ) + hi += 1; + + mid = ( lo >> 14 ) | ( hi << 18 ); + + return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid; + } + +#else + + /* compute (a*b)/2^14 with maximal accuracy and rounding */ + static FT_Int32 + TT_MulFix14( FT_Int32 a, + FT_Int b ) + { + FT_Int32 m, s, hi; + FT_UInt32 l, lo; + + + /* compute ax*bx as 64-bit value */ + l = (FT_UInt32)( ( a & 0xFFFFU ) * b ); + m = ( a >> 16 ) * b; + + lo = l + (FT_UInt32)( m << 16 ); + hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l ); + + /* divide the result by 2^14 with rounding */ + s = hi >> 31; + l = lo + (FT_UInt32)s; + hi += s + ( l < lo ); + lo = l; + + l = lo + 0x2000U; + hi += l < lo; + + return ( hi << 18 ) | ( l >> 14 ); + } +#endif + + + /* compute (ax*bx+ay*by)/2^14 with maximal accuracy and rounding */ + static FT_Int32 + TT_DotFix14( FT_Int32 ax, + FT_Int32 ay, + FT_Int bx, + FT_Int by ) + { + FT_Int32 m, s, hi1, hi2, hi; + FT_UInt32 l, lo1, lo2, lo; + + + /* compute ax*bx as 64-bit value */ + l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx ); + m = ( ax >> 16 ) * bx; + + lo1 = l + (FT_UInt32)( m << 16 ); + hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l ); + + /* compute ay*by as 64-bit value */ + l = (FT_UInt32)( ( ay & 0xFFFFU ) * by ); + m = ( ay >> 16 ) * by; + + lo2 = l + (FT_UInt32)( m << 16 ); + hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l ); + + /* add them */ + lo = lo1 + lo2; + hi = hi1 + hi2 + ( lo < lo1 ); + + /* divide the result by 2^14 with rounding */ + s = hi >> 31; + l = lo + (FT_UInt32)s; + hi += s + ( l < lo ); + lo = l; + + l = lo + 0x2000U; + hi += ( l < lo ); + + return ( hi << 18 ) | ( l >> 14 ); + } + + + /* return length of given vector */ + +#if 0 + + static FT_Int32 + TT_VecLen( FT_Int32 x, + FT_Int32 y ) + { + FT_Int32 m, hi1, hi2, hi; + FT_UInt32 l, lo1, lo2, lo; + + + /* compute x*x as 64-bit value */ + lo = (FT_UInt32)( x & 0xFFFFU ); + hi = x >> 16; + + l = lo * lo; + m = hi * lo; + hi = hi * hi; + + lo1 = l + (FT_UInt32)( m << 17 ); + hi1 = hi + ( m >> 15 ) + ( lo1 < l ); + + /* compute y*y as 64-bit value */ + lo = (FT_UInt32)( y & 0xFFFFU ); + hi = y >> 16; + + l = lo * lo; + m = hi * lo; + hi = hi * hi; + + lo2 = l + (FT_UInt32)( m << 17 ); + hi2 = hi + ( m >> 15 ) + ( lo2 < l ); + + /* add them to get 'x*x+y*y' as 64-bit value */ + lo = lo1 + lo2; + hi = hi1 + hi2 + ( lo < lo1 ); + + /* compute the square root of this value */ + { + FT_UInt32 root, rem, test_div; + FT_Int count; + + + root = 0; + + { + rem = 0; + count = 32; + do + { + rem = ( rem << 2 ) | ( (FT_UInt32)hi >> 30 ); + hi = ( hi << 2 ) | ( lo >> 30 ); + lo <<= 2; + root <<= 1; + test_div = ( root << 1 ) + 1; + + if ( rem >= test_div ) + { + rem -= test_div; + root += 1; + } + } while ( --count ); + } + + return (FT_Int32)root; + } + } + +#else + + /* this version uses FT_Vector_Length which computes the same value */ + /* much, much faster.. */ + /* */ + static FT_F26Dot6 + TT_VecLen( FT_F26Dot6 X, + FT_F26Dot6 Y ) + { + FT_Vector v; + + + v.x = X; + v.y = Y; + + return FT_Vector_Length( &v ); + } + +#endif + + + /*************************************************************************/ + /* */ + /* */ + /* Current_Ratio */ + /* */ + /* */ + /* Returns the current aspect ratio scaling factor depending on the */ + /* projection vector's state and device resolutions. */ + /* */ + /* */ + /* The aspect ratio in 16.16 format, always <= 1.0 . */ + /* */ + static FT_Long + Current_Ratio( EXEC_OP ) + { + if ( !CUR.tt_metrics.ratio ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; + else + CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; + } + else +#endif + { + if ( CUR.GS.projVector.y == 0 ) + CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; + + else if ( CUR.GS.projVector.x == 0 ) + CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; + + else + { + FT_Long x, y; + + + x = TT_MULDIV( CUR.GS.projVector.x, + CUR.tt_metrics.x_ratio, 0x4000 ); + y = TT_MULDIV( CUR.GS.projVector.y, + CUR.tt_metrics.y_ratio, 0x4000 ); + CUR.tt_metrics.ratio = TT_VecLen( x, y ); + } + } + } + return CUR.tt_metrics.ratio; + } + + + static FT_Long + Current_Ppem( EXEC_OP ) + { + return TT_MULFIX( CUR.tt_metrics.ppem, CURRENT_Ratio() ); + } + + + /*************************************************************************/ + /* */ + /* Functions related to the control value table (CVT). */ + /* */ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT( EXEC_OP_ FT_ULong idx ) + { + return CUR.cvt[idx]; + } + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT_Stretched( EXEC_OP_ FT_ULong idx ) + { + return TT_MULFIX( CUR.cvt[idx], CURRENT_Ratio() ); + } + + + FT_CALLBACK_DEF( void ) + Write_CVT( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] = value; + } + + + FT_CALLBACK_DEF( void ) + Write_CVT_Stretched( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() ); + } + + + FT_CALLBACK_DEF( void ) + Move_CVT( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] += value; + } + + + FT_CALLBACK_DEF( void ) + Move_CVT_Stretched( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* GetShortIns */ + /* */ + /* */ + /* Returns a short integer taken from the instruction stream at */ + /* address IP. */ + /* */ + /* */ + /* Short read at code[IP]. */ + /* */ + /* */ + /* This one could become a macro. */ + /* */ + static FT_Short + GetShortIns( EXEC_OP ) + { + /* Reading a byte stream so there is no endianess (DaveP) */ + CUR.IP += 2; + return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) + + CUR.code[CUR.IP - 1] ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Ins_Goto_CodeRange */ + /* */ + /* */ + /* Goes to a certain code range in the instruction stream. */ + /* */ + /* */ + /* aRange :: The index of the code range. */ + /* */ + /* aIP :: The new IP address in the code range. */ + /* */ + /* */ + /* SUCCESS or FAILURE. */ + /* */ + static FT_Bool + Ins_Goto_CodeRange( EXEC_OP_ FT_Int aRange, + FT_ULong aIP ) + { + TT_CodeRange* range; + + + if ( aRange < 1 || aRange > 3 ) + { + CUR.error = TT_Err_Bad_Argument; + return FAILURE; + } + + range = &CUR.codeRangeTable[aRange - 1]; + + if ( range->base == NULL ) /* invalid coderange */ + { + CUR.error = TT_Err_Invalid_CodeRange; + return FAILURE; + } + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for AIP <= Size, instead of AIP < Size. */ + + if ( aIP > range->size ) + { + CUR.error = TT_Err_Code_Overflow; + return FAILURE; + } + + CUR.code = range->base; + CUR.codeSize = range->size; + CUR.IP = aIP; + CUR.curRange = aRange; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Direct_Move */ + /* */ + /* */ + /* Moves a point by a given distance along the freedom vector. The */ + /* point will be `touched'. */ + /* */ + /* */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* */ + /* zone :: The affected glyph zone. */ + /* */ + static void + Direct_Move( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + v = CUR.GS.freeVector.x; + + if ( v != 0 ) + { + zone->cur[point].x += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + v = CUR.GS.freeVector.y; + + if ( v != 0 ) + { + zone->cur[point].y += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* Direct_Move_Orig */ + /* */ + /* */ + /* Moves the *original* position of a point by a given distance along */ + /* the freedom vector. Obviously, the point will not be `touched'. */ + /* */ + /* */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* */ + /* zone :: The affected glyph zone. */ + /* */ + static void + Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + v = CUR.GS.freeVector.x; + + if ( v != 0 ) + zone->org[point].x += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + v = CUR.GS.freeVector.y; + + if ( v != 0 ) + zone->org[point].y += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + } + + + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_X( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->cur[point].x += distance; + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + + static void + Direct_Move_Y( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->cur[point].y += distance; + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + + + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move_Orig() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->org[point].x += distance; + } + + + static void + Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->org[point].y += distance; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_None */ + /* */ + /* */ + /* Does not round, but adds engine compensation. */ + /* */ + /* */ + /* distance :: The distance (not) to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* The compensated distance. */ + /* */ + /* */ + /* The TrueType specification says very few about the relationship */ + /* between rounding and engine compensation. However, it seems from */ + /* the description of super round that we should add the compensation */ + /* before rounding. */ + /* */ + static FT_F26Dot6 + Round_None( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation; + if ( distance && val < 0 ) + val = 0; + } + else { + val = distance - compensation; + if ( val > 0 ) + val = 0; + } + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Grid */ + /* */ + /* */ + /* Rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 32; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = -FT_PIX_ROUND( compensation - distance ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Half_Grid */ + /* */ + /* */ + /* Rounds value to half grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = FT_PIX_FLOOR( distance + compensation ) + 32; + if ( distance && val < 0 ) + val = 0; + } + else + { + val = -( FT_PIX_FLOOR( compensation - distance ) + 32 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Down_To_Grid */ + /* */ + /* */ + /* Rounds value down to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = -( ( compensation - distance ) & -64 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Up_To_Grid */ + /* */ + /* */ + /* Rounds value up to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 63; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = - FT_PIX_CEIL( compensation - distance ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Double_Grid */ + /* */ + /* */ + /* Rounds value to double grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 16; + if ( distance && val > 0 ) + val &= ~31; + else + val = 0; + } + else + { + val = -FT_PAD_ROUND( compensation - distance, 32 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Super */ + /* */ + /* */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + /* */ + /* The TrueType specification says very few about the relationship */ + /* between rounding and engine compensation. However, it seems from */ + /* the description of super round that we should add the compensation */ + /* before rounding. */ + /* */ + static FT_F26Dot6 + Round_Super( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ( distance - CUR.phase + CUR.threshold + compensation ) & + -CUR.period; + if ( distance && val < 0 ) + val = 0; + val += CUR.phase; + } + else + { + val = -( ( CUR.threshold - CUR.phase - distance + compensation ) & + -CUR.period ); + if ( val > 0 ) + val = 0; + val -= CUR.phase; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Super_45 */ + /* */ + /* */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + /* */ + /* There is a separate function for Round_Super_45() as we may need */ + /* greater precision. */ + /* */ + static FT_F26Dot6 + Round_Super_45( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ( ( distance - CUR.phase + CUR.threshold + compensation ) / + CUR.period ) * CUR.period; + if ( distance && val < 0 ) + val = 0; + val += CUR.phase; + } + else + { + val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) / + CUR.period ) * CUR.period ); + if ( val > 0 ) + val = 0; + val -= CUR.phase; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Compute_Round */ + /* */ + /* */ + /* Sets the rounding mode. */ + /* */ + /* */ + /* round_mode :: The rounding mode to be used. */ + /* */ + static void + Compute_Round( EXEC_OP_ FT_Byte round_mode ) + { + switch ( round_mode ) + { + case TT_Round_Off: + CUR.func_round = (TT_Round_Func)Round_None; + break; + + case TT_Round_To_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Grid; + break; + + case TT_Round_Up_To_Grid: + CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; + break; + + case TT_Round_Down_To_Grid: + CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; + break; + + case TT_Round_To_Half_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; + break; + + case TT_Round_To_Double_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; + break; + + case TT_Round_Super: + CUR.func_round = (TT_Round_Func)Round_Super; + break; + + case TT_Round_Super_45: + CUR.func_round = (TT_Round_Func)Round_Super_45; + break; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* SetSuperRound */ + /* */ + /* */ + /* Sets Super Round parameters. */ + /* */ + /* */ + /* GridPeriod :: Grid period */ + /* selector :: SROUND opcode */ + /* */ + static void + SetSuperRound( EXEC_OP_ FT_F26Dot6 GridPeriod, + FT_Long selector ) + { + switch ( (FT_Int)( selector & 0xC0 ) ) + { + case 0: + CUR.period = GridPeriod / 2; + break; + + case 0x40: + CUR.period = GridPeriod; + break; + + case 0x80: + CUR.period = GridPeriod * 2; + break; + + /* This opcode is reserved, but... */ + + case 0xC0: + CUR.period = GridPeriod; + break; + } + + switch ( (FT_Int)( selector & 0x30 ) ) + { + case 0: + CUR.phase = 0; + break; + + case 0x10: + CUR.phase = CUR.period / 4; + break; + + case 0x20: + CUR.phase = CUR.period / 2; + break; + + case 0x30: + CUR.phase = CUR.period * 3 / 4; + break; + } + + if ( ( selector & 0x0F ) == 0 ) + CUR.threshold = CUR.period - 1; + else + CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8; + + CUR.period /= 256; + CUR.phase /= 256; + CUR.threshold /= 256; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project */ + /* */ + /* */ + /* Computes the projection of vector given by (v2-v1) along the */ + /* current projection vector. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + return TT_DotFix14( dx, dy, + CUR.GS.projVector.x, + CUR.GS.projVector.y ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Dual_Project */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* current dual vector. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Dual_Project( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + return TT_DotFix14( dx, dy, + CUR.GS.dualVector.x, + CUR.GS.dualVector.y ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project_x */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* horizontal axis. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project_x( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED_EXEC; + FT_UNUSED( dy ); + + return dx; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project_y */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* vertical axis. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project_y( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED_EXEC; + FT_UNUSED( dx ); + + return dy; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Compute_Funcs */ + /* */ + /* */ + /* Computes the projection and movement function pointers according */ + /* to the current graphics state. */ + /* */ + static void + Compute_Funcs( EXEC_OP ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + /* If both vectors point rightwards along the x axis, set */ + /* `both-x-axis' true, otherwise set it false. The x values only */ + /* need be tested because the vector has been normalised to a unit */ + /* vector of length 0x4000 = unity. */ + CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 && + CUR.GS.freeVector.x == 0x4000 ); + + /* Throw away projection and freedom vector information */ + /* because the patents don't allow them to be stored. */ + /* The relevant US Patents are 5155805 and 5325479. */ + CUR.GS.projVector.x = 0; + CUR.GS.projVector.y = 0; + CUR.GS.freeVector.x = 0; + CUR.GS.freeVector.y = 0; + + if ( CUR.GS.both_x_axis ) + { + CUR.func_project = Project_x; + CUR.func_move = Direct_Move_X; + CUR.func_move_orig = Direct_Move_Orig_X; + } + else + { + CUR.func_project = Project_y; + CUR.func_move = Direct_Move_Y; + CUR.func_move_orig = Direct_Move_Orig_Y; + } + + if ( CUR.GS.dualVector.x == 0x4000 ) + CUR.func_dualproj = Project_x; + else + { + if ( CUR.GS.dualVector.y == 0x4000 ) + CUR.func_dualproj = Project_y; + else + CUR.func_dualproj = Dual_Project; + } + + /* Force recalculation of cached aspect ratio */ + CUR.tt_metrics.ratio = 0; + + return; + } +#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */ + + if ( CUR.GS.freeVector.x == 0x4000 ) + CUR.F_dot_P = CUR.GS.projVector.x * 0x10000L; + else + { + if ( CUR.GS.freeVector.y == 0x4000 ) + CUR.F_dot_P = CUR.GS.projVector.y * 0x10000L; + else + CUR.F_dot_P = (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x * 4 + + (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y * 4; + } + + if ( CUR.GS.projVector.x == 0x4000 ) + CUR.func_project = (TT_Project_Func)Project_x; + else + { + if ( CUR.GS.projVector.y == 0x4000 ) + CUR.func_project = (TT_Project_Func)Project_y; + else + CUR.func_project = (TT_Project_Func)Project; + } + + if ( CUR.GS.dualVector.x == 0x4000 ) + CUR.func_dualproj = (TT_Project_Func)Project_x; + else + { + if ( CUR.GS.dualVector.y == 0x4000 ) + CUR.func_dualproj = (TT_Project_Func)Project_y; + else + CUR.func_dualproj = (TT_Project_Func)Dual_Project; + } + + CUR.func_move = (TT_Move_Func)Direct_Move; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig; + + if ( CUR.F_dot_P == 0x40000000L ) + { + if ( CUR.GS.freeVector.x == 0x4000 ) + { + CUR.func_move = (TT_Move_Func)Direct_Move_X; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; + } + else + { + if ( CUR.GS.freeVector.y == 0x4000 ) + { + CUR.func_move = (TT_Move_Func)Direct_Move_Y; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; + } + } + } + + /* at small sizes, F_dot_P can become too small, resulting */ + /* in overflows and `spikes' in a number of glyphs like `w'. */ + + if ( FT_ABS( CUR.F_dot_P ) < 0x4000000L ) + CUR.F_dot_P = 0x40000000L; + + /* Disable cached aspect ratio */ + CUR.tt_metrics.ratio = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Normalize */ + /* */ + /* */ + /* Norms a vector. */ + /* */ + /* */ + /* Vx :: The horizontal input vector coordinate. */ + /* Vy :: The vertical input vector coordinate. */ + /* */ + /* */ + /* R :: The normed unit vector. */ + /* */ + /* */ + /* Returns FAILURE if a vector parameter is zero. */ + /* */ + /* */ + /* In case Vx and Vy are both zero, Normalize() returns SUCCESS, and */ + /* R is undefined. */ + /* */ + + + static FT_Bool + Normalize( EXEC_OP_ FT_F26Dot6 Vx, + FT_F26Dot6 Vy, + FT_UnitVector* R ) + { + FT_F26Dot6 W; + FT_Bool S1, S2; + + FT_UNUSED_EXEC; + + + if ( FT_ABS( Vx ) < 0x10000L && FT_ABS( Vy ) < 0x10000L ) + { + Vx *= 0x100; + Vy *= 0x100; + + W = TT_VecLen( Vx, Vy ); + + if ( W == 0 ) + { + /* XXX: UNDOCUMENTED! It seems that it is possible to try */ + /* to normalize the vector (0,0). Return immediately. */ + return SUCCESS; + } + + R->x = (FT_F2Dot14)FT_MulDiv( Vx, 0x4000L, W ); + R->y = (FT_F2Dot14)FT_MulDiv( Vy, 0x4000L, W ); + + return SUCCESS; + } + + W = TT_VecLen( Vx, Vy ); + + Vx = FT_MulDiv( Vx, 0x4000L, W ); + Vy = FT_MulDiv( Vy, 0x4000L, W ); + + W = Vx * Vx + Vy * Vy; + + /* Now, we want that Sqrt( W ) = 0x4000 */ + /* Or 0x10000000 <= W < 0x10004000 */ + + if ( Vx < 0 ) + { + Vx = -Vx; + S1 = TRUE; + } + else + S1 = FALSE; + + if ( Vy < 0 ) + { + Vy = -Vy; + S2 = TRUE; + } + else + S2 = FALSE; + + while ( W < 0x10000000L ) + { + /* We need to increase W by a minimal amount */ + if ( Vx < Vy ) + Vx++; + else + Vy++; + + W = Vx * Vx + Vy * Vy; + } + + while ( W >= 0x10004000L ) + { + /* We need to decrease W by a minimal amount */ + if ( Vx < Vy ) + Vx--; + else + Vy--; + + W = Vx * Vx + Vy * Vy; + } + + /* Note that in various cases, we can only */ + /* compute a Sqrt(W) of 0x3FFF, eg. Vx = Vy */ + + if ( S1 ) + Vx = -Vx; + + if ( S2 ) + Vy = -Vy; + + R->x = (FT_F2Dot14)Vx; /* Type conversion */ + R->y = (FT_F2Dot14)Vy; /* Type conversion */ + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* Here we start with the implementation of the various opcodes. */ + /* */ + /*************************************************************************/ + + + static FT_Bool + Ins_SxVTL( EXEC_OP_ FT_UShort aIdx1, + FT_UShort aIdx2, + FT_Int aOpc, + FT_UnitVector* Vec ) + { + FT_Long A, B, C; + FT_Vector* p1; + FT_Vector* p2; + + + if ( BOUNDS( aIdx1, CUR.zp2.n_points ) || + BOUNDS( aIdx2, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return FAILURE; + } + + p1 = CUR.zp1.cur + aIdx2; + p2 = CUR.zp2.cur + aIdx1; + + A = p1->x - p2->x; + B = p1->y - p2->y; + + if ( ( aOpc & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, Vec ); + + return SUCCESS; + } + + + /* When not using the big switch statements, the interpreter uses a */ + /* call table defined later below in this source. Each opcode must */ + /* thus have a corresponding function, even trivial ones. */ + /* */ + /* They are all defined there. */ + +#define DO_SVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.freeVector.x = A; \ + CUR.GS.projVector.x = A; \ + CUR.GS.dualVector.x = A; \ + \ + CUR.GS.freeVector.y = B; \ + CUR.GS.projVector.y = B; \ + CUR.GS.dualVector.y = B; \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SPVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.projVector.x = A; \ + CUR.GS.dualVector.x = A; \ + \ + CUR.GS.projVector.y = B; \ + CUR.GS.dualVector.y = B; \ + \ + GUESS_VECTOR( freeVector ); \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.freeVector.x = A; \ + CUR.GS.freeVector.y = B; \ + \ + GUESS_VECTOR( projVector ); \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SPVTL \ + if ( INS_SxVTL( (FT_UShort)args[1], \ + (FT_UShort)args[0], \ + CUR.opcode, \ + &CUR.GS.projVector ) == SUCCESS ) \ + { \ + CUR.GS.dualVector = CUR.GS.projVector; \ + GUESS_VECTOR( freeVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTL \ + if ( INS_SxVTL( (FT_UShort)args[1], \ + (FT_UShort)args[0], \ + CUR.opcode, \ + &CUR.GS.freeVector ) == SUCCESS ) \ + { \ + GUESS_VECTOR( projVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTPV \ + GUESS_VECTOR( projVector ); \ + CUR.GS.freeVector = CUR.GS.projVector; \ + COMPUTE_Funcs(); + + +#define DO_SPVFS \ + { \ + FT_Short S; \ + FT_Long X, Y; \ + \ + \ + /* Only use low 16bits, then sign extend */ \ + S = (FT_Short)args[1]; \ + Y = (FT_Long)S; \ + S = (FT_Short)args[0]; \ + X = (FT_Long)S; \ + \ + NORMalize( X, Y, &CUR.GS.projVector ); \ + \ + CUR.GS.dualVector = CUR.GS.projVector; \ + GUESS_VECTOR( freeVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVFS \ + { \ + FT_Short S; \ + FT_Long X, Y; \ + \ + \ + /* Only use low 16bits, then sign extend */ \ + S = (FT_Short)args[1]; \ + Y = (FT_Long)S; \ + S = (FT_Short)args[0]; \ + X = S; \ + \ + NORMalize( X, Y, &CUR.GS.freeVector ); \ + GUESS_VECTOR( projVector ); \ + COMPUTE_Funcs(); \ + } + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define DO_GPV \ + if ( CUR.face->unpatented_hinting ) \ + { \ + args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ + args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ + } \ + else \ + { \ + args[0] = CUR.GS.projVector.x; \ + args[1] = CUR.GS.projVector.y; \ + } +#else +#define DO_GPV \ + args[0] = CUR.GS.projVector.x; \ + args[1] = CUR.GS.projVector.y; +#endif + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define DO_GFV \ + if ( CUR.face->unpatented_hinting ) \ + { \ + args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ + args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ + } \ + else \ + { \ + args[0] = CUR.GS.freeVector.x; \ + args[1] = CUR.GS.freeVector.y; \ + } +#else +#define DO_GFV \ + args[0] = CUR.GS.freeVector.x; \ + args[1] = CUR.GS.freeVector.y; +#endif + + +#define DO_SRP0 \ + CUR.GS.rp0 = (FT_UShort)args[0]; + + +#define DO_SRP1 \ + CUR.GS.rp1 = (FT_UShort)args[0]; + + +#define DO_SRP2 \ + CUR.GS.rp2 = (FT_UShort)args[0]; + + +#define DO_RTHG \ + CUR.GS.round_state = TT_Round_To_Half_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; + + +#define DO_RTG \ + CUR.GS.round_state = TT_Round_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Grid; + + +#define DO_RTDG \ + CUR.GS.round_state = TT_Round_To_Double_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; + + +#define DO_RUTG \ + CUR.GS.round_state = TT_Round_Up_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; + + +#define DO_RDTG \ + CUR.GS.round_state = TT_Round_Down_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; + + +#define DO_ROFF \ + CUR.GS.round_state = TT_Round_Off; \ + CUR.func_round = (TT_Round_Func)Round_None; + + +#define DO_SROUND \ + SET_SuperRound( 0x4000, args[0] ); \ + CUR.GS.round_state = TT_Round_Super; \ + CUR.func_round = (TT_Round_Func)Round_Super; + + +#define DO_S45ROUND \ + SET_SuperRound( 0x2D41, args[0] ); \ + CUR.GS.round_state = TT_Round_Super_45; \ + CUR.func_round = (TT_Round_Func)Round_Super_45; + + +#define DO_SLOOP \ + if ( args[0] < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ + else \ + CUR.GS.loop = args[0]; + + +#define DO_SMD \ + CUR.GS.minimum_distance = args[0]; + + +#define DO_SCVTCI \ + CUR.GS.control_value_cutin = (FT_F26Dot6)args[0]; + + +#define DO_SSWCI \ + CUR.GS.single_width_cutin = (FT_F26Dot6)args[0]; + + + /* XXX: UNDOCUMENTED! or bug in the Windows engine? */ + /* */ + /* It seems that the value that is read here is */ + /* expressed in 16.16 format rather than in font */ + /* units. */ + /* */ +#define DO_SSW \ + CUR.GS.single_width_value = (FT_F26Dot6)( args[0] >> 10 ); + + +#define DO_FLIPON \ + CUR.GS.auto_flip = TRUE; + + +#define DO_FLIPOFF \ + CUR.GS.auto_flip = FALSE; + + +#define DO_SDB \ + CUR.GS.delta_base = (FT_Short)args[0]; + + +#define DO_SDS \ + CUR.GS.delta_shift = (FT_Short)args[0]; + + +#define DO_MD /* nothing */ + + +#define DO_MPPEM \ + args[0] = CURRENT_Ppem(); + + + /* Note: The pointSize should be irrelevant in a given font program; */ + /* we thus decide to return only the ppem. */ +#if 0 + +#define DO_MPS \ + args[0] = CUR.metrics.pointSize; + +#else + +#define DO_MPS \ + args[0] = CURRENT_Ppem(); + +#endif /* 0 */ + + +#define DO_DUP \ + args[1] = args[0]; + + +#define DO_CLEAR \ + CUR.new_top = 0; + + +#define DO_SWAP \ + { \ + FT_Long L; \ + \ + \ + L = args[0]; \ + args[0] = args[1]; \ + args[1] = L; \ + } + + +#define DO_DEPTH \ + args[0] = CUR.top; + + +#define DO_CINDEX \ + { \ + FT_Long L; \ + \ + \ + L = args[0]; \ + \ + if ( L <= 0 || L > CUR.args ) \ + CUR.error = TT_Err_Invalid_Reference; \ + else \ + args[0] = CUR.stack[CUR.args - L]; \ + } + + +#define DO_JROT \ + if ( args[1] != 0 ) \ + { \ + CUR.IP += args[0]; \ + CUR.step_ins = FALSE; \ + } + + +#define DO_JMPR \ + CUR.IP += args[0]; \ + CUR.step_ins = FALSE; + + +#define DO_JROF \ + if ( args[1] == 0 ) \ + { \ + CUR.IP += args[0]; \ + CUR.step_ins = FALSE; \ + } + + +#define DO_LT \ + args[0] = ( args[0] < args[1] ); + + +#define DO_LTEQ \ + args[0] = ( args[0] <= args[1] ); + + +#define DO_GT \ + args[0] = ( args[0] > args[1] ); + + +#define DO_GTEQ \ + args[0] = ( args[0] >= args[1] ); + + +#define DO_EQ \ + args[0] = ( args[0] == args[1] ); + + +#define DO_NEQ \ + args[0] = ( args[0] != args[1] ); + + +#define DO_ODD \ + args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 ); + + +#define DO_EVEN \ + args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 ); + + +#define DO_AND \ + args[0] = ( args[0] && args[1] ); + + +#define DO_OR \ + args[0] = ( args[0] || args[1] ); + + +#define DO_NOT \ + args[0] = !args[0]; + + +#define DO_ADD \ + args[0] += args[1]; + + +#define DO_SUB \ + args[0] -= args[1]; + + +#define DO_DIV \ + if ( args[1] == 0 ) \ + CUR.error = TT_Err_Divide_By_Zero; \ + else \ + args[0] = TT_MULDIV_NO_ROUND( args[0], 64L, args[1] ); + + +#define DO_MUL \ + args[0] = TT_MULDIV( args[0], args[1], 64L ); + + +#define DO_ABS \ + args[0] = FT_ABS( args[0] ); + + +#define DO_NEG \ + args[0] = -args[0]; + + +#define DO_FLOOR \ + args[0] = FT_PIX_FLOOR( args[0] ); + + +#define DO_CEILING \ + args[0] = FT_PIX_CEIL( args[0] ); + + +#define DO_RS \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.storeSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + else \ + args[0] = 0; \ + } \ + else \ + args[0] = CUR.storage[I]; \ + } + + +#define DO_WS \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.storeSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR.storage[I] = args[1]; \ + } + + +#define DO_RCVT \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + else \ + args[0] = 0; \ + } \ + else \ + args[0] = CUR_Func_read_cvt( I ); \ + } + + +#define DO_WCVTP \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR_Func_write_cvt( I, args[1] ); \ + } + + +#define DO_WCVTF \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR.cvt[I] = TT_MULFIX( args[1], CUR.tt_metrics.scale ); \ + } + + +#define DO_DEBUG \ + CUR.error = TT_Err_Debug_OpCode; + + +#define DO_ROUND \ + args[0] = CUR_Func_round( \ + args[0], \ + CUR.tt_metrics.compensations[CUR.opcode - 0x68] ); + + +#define DO_NROUND \ + args[0] = ROUND_None( args[0], \ + CUR.tt_metrics.compensations[CUR.opcode - 0x6C] ); + + +#define DO_MAX \ + if ( args[1] > args[0] ) \ + args[0] = args[1]; + + +#define DO_MIN \ + if ( args[1] < args[0] ) \ + args[0] = args[1]; + + +#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH + + +#undef ARRAY_BOUND_ERROR +#define ARRAY_BOUND_ERROR \ + { \ + CUR.error = TT_Err_Invalid_Reference; \ + return; \ + } + + + /*************************************************************************/ + /* */ + /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */ + /* Opcode range: 0x00-0x01 */ + /* Stack: --> */ + /* */ + static void + Ins_SVTCA( INS_ARG ) + { + DO_SVTCA + } + + + /*************************************************************************/ + /* */ + /* SPVTCA[a]: Set PVector to Coordinate Axis */ + /* Opcode range: 0x02-0x03 */ + /* Stack: --> */ + /* */ + static void + Ins_SPVTCA( INS_ARG ) + { + DO_SPVTCA + } + + + /*************************************************************************/ + /* */ + /* SFVTCA[a]: Set FVector to Coordinate Axis */ + /* Opcode range: 0x04-0x05 */ + /* Stack: --> */ + /* */ + static void + Ins_SFVTCA( INS_ARG ) + { + DO_SFVTCA + } + + + /*************************************************************************/ + /* */ + /* SPVTL[a]: Set PVector To Line */ + /* Opcode range: 0x06-0x07 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SPVTL( INS_ARG ) + { + DO_SPVTL + } + + + /*************************************************************************/ + /* */ + /* SFVTL[a]: Set FVector To Line */ + /* Opcode range: 0x08-0x09 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SFVTL( INS_ARG ) + { + DO_SFVTL + } + + + /*************************************************************************/ + /* */ + /* SFVTPV[]: Set FVector To PVector */ + /* Opcode range: 0x0E */ + /* Stack: --> */ + /* */ + static void + Ins_SFVTPV( INS_ARG ) + { + DO_SFVTPV + } + + + /*************************************************************************/ + /* */ + /* SPVFS[]: Set PVector From Stack */ + /* Opcode range: 0x0A */ + /* Stack: f2.14 f2.14 --> */ + /* */ + static void + Ins_SPVFS( INS_ARG ) + { + DO_SPVFS + } + + + /*************************************************************************/ + /* */ + /* SFVFS[]: Set FVector From Stack */ + /* Opcode range: 0x0B */ + /* Stack: f2.14 f2.14 --> */ + /* */ + static void + Ins_SFVFS( INS_ARG ) + { + DO_SFVFS + } + + + /*************************************************************************/ + /* */ + /* GPV[]: Get Projection Vector */ + /* Opcode range: 0x0C */ + /* Stack: ef2.14 --> ef2.14 */ + /* */ + static void + Ins_GPV( INS_ARG ) + { + DO_GPV + } + + + /*************************************************************************/ + /* GFV[]: Get Freedom Vector */ + /* Opcode range: 0x0D */ + /* Stack: ef2.14 --> ef2.14 */ + /* */ + static void + Ins_GFV( INS_ARG ) + { + DO_GFV + } + + + /*************************************************************************/ + /* */ + /* SRP0[]: Set Reference Point 0 */ + /* Opcode range: 0x10 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP0( INS_ARG ) + { + DO_SRP0 + } + + + /*************************************************************************/ + /* */ + /* SRP1[]: Set Reference Point 1 */ + /* Opcode range: 0x11 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP1( INS_ARG ) + { + DO_SRP1 + } + + + /*************************************************************************/ + /* */ + /* SRP2[]: Set Reference Point 2 */ + /* Opcode range: 0x12 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP2( INS_ARG ) + { + DO_SRP2 + } + + + /*************************************************************************/ + /* */ + /* RTHG[]: Round To Half Grid */ + /* Opcode range: 0x19 */ + /* Stack: --> */ + /* */ + static void + Ins_RTHG( INS_ARG ) + { + DO_RTHG + } + + + /*************************************************************************/ + /* */ + /* RTG[]: Round To Grid */ + /* Opcode range: 0x18 */ + /* Stack: --> */ + /* */ + static void + Ins_RTG( INS_ARG ) + { + DO_RTG + } + + + /*************************************************************************/ + /* RTDG[]: Round To Double Grid */ + /* Opcode range: 0x3D */ + /* Stack: --> */ + /* */ + static void + Ins_RTDG( INS_ARG ) + { + DO_RTDG + } + + + /*************************************************************************/ + /* RUTG[]: Round Up To Grid */ + /* Opcode range: 0x7C */ + /* Stack: --> */ + /* */ + static void + Ins_RUTG( INS_ARG ) + { + DO_RUTG + } + + + /*************************************************************************/ + /* */ + /* RDTG[]: Round Down To Grid */ + /* Opcode range: 0x7D */ + /* Stack: --> */ + /* */ + static void + Ins_RDTG( INS_ARG ) + { + DO_RDTG + } + + + /*************************************************************************/ + /* */ + /* ROFF[]: Round OFF */ + /* Opcode range: 0x7A */ + /* Stack: --> */ + /* */ + static void + Ins_ROFF( INS_ARG ) + { + DO_ROFF + } + + + /*************************************************************************/ + /* */ + /* SROUND[]: Super ROUND */ + /* Opcode range: 0x76 */ + /* Stack: Eint8 --> */ + /* */ + static void + Ins_SROUND( INS_ARG ) + { + DO_SROUND + } + + + /*************************************************************************/ + /* */ + /* S45ROUND[]: Super ROUND 45 degrees */ + /* Opcode range: 0x77 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_S45ROUND( INS_ARG ) + { + DO_S45ROUND + } + + + /*************************************************************************/ + /* */ + /* SLOOP[]: Set LOOP variable */ + /* Opcode range: 0x17 */ + /* Stack: int32? --> */ + /* */ + static void + Ins_SLOOP( INS_ARG ) + { + DO_SLOOP + } + + + /*************************************************************************/ + /* */ + /* SMD[]: Set Minimum Distance */ + /* Opcode range: 0x1A */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SMD( INS_ARG ) + { + DO_SMD + } + + + /*************************************************************************/ + /* */ + /* SCVTCI[]: Set Control Value Table Cut In */ + /* Opcode range: 0x1D */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SCVTCI( INS_ARG ) + { + DO_SCVTCI + } + + + /*************************************************************************/ + /* */ + /* SSWCI[]: Set Single Width Cut In */ + /* Opcode range: 0x1E */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SSWCI( INS_ARG ) + { + DO_SSWCI + } + + + /*************************************************************************/ + /* */ + /* SSW[]: Set Single Width */ + /* Opcode range: 0x1F */ + /* Stack: int32? --> */ + /* */ + static void + Ins_SSW( INS_ARG ) + { + DO_SSW + } + + + /*************************************************************************/ + /* */ + /* FLIPON[]: Set auto-FLIP to ON */ + /* Opcode range: 0x4D */ + /* Stack: --> */ + /* */ + static void + Ins_FLIPON( INS_ARG ) + { + DO_FLIPON + } + + + /*************************************************************************/ + /* */ + /* FLIPOFF[]: Set auto-FLIP to OFF */ + /* Opcode range: 0x4E */ + /* Stack: --> */ + /* */ + static void + Ins_FLIPOFF( INS_ARG ) + { + DO_FLIPOFF + } + + + /*************************************************************************/ + /* */ + /* SANGW[]: Set ANGle Weight */ + /* Opcode range: 0x7E */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SANGW( INS_ARG ) + { + /* instruction not supported anymore */ + } + + + /*************************************************************************/ + /* */ + /* SDB[]: Set Delta Base */ + /* Opcode range: 0x5E */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SDB( INS_ARG ) + { + DO_SDB + } + + + /*************************************************************************/ + /* */ + /* SDS[]: Set Delta Shift */ + /* Opcode range: 0x5F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SDS( INS_ARG ) + { + DO_SDS + } + + + /*************************************************************************/ + /* */ + /* MPPEM[]: Measure Pixel Per EM */ + /* Opcode range: 0x4B */ + /* Stack: --> Euint16 */ + /* */ + static void + Ins_MPPEM( INS_ARG ) + { + DO_MPPEM + } + + + /*************************************************************************/ + /* */ + /* MPS[]: Measure Point Size */ + /* Opcode range: 0x4C */ + /* Stack: --> Euint16 */ + /* */ + static void + Ins_MPS( INS_ARG ) + { + DO_MPS + } + + + /*************************************************************************/ + /* */ + /* DUP[]: DUPlicate the top stack's element */ + /* Opcode range: 0x20 */ + /* Stack: StkElt --> StkElt StkElt */ + /* */ + static void + Ins_DUP( INS_ARG ) + { + DO_DUP + } + + + /*************************************************************************/ + /* */ + /* POP[]: POP the stack's top element */ + /* Opcode range: 0x21 */ + /* Stack: StkElt --> */ + /* */ + static void + Ins_POP( INS_ARG ) + { + /* nothing to do */ + } + + + /*************************************************************************/ + /* */ + /* CLEAR[]: CLEAR the entire stack */ + /* Opcode range: 0x22 */ + /* Stack: StkElt... --> */ + /* */ + static void + Ins_CLEAR( INS_ARG ) + { + DO_CLEAR + } + + + /*************************************************************************/ + /* */ + /* SWAP[]: SWAP the stack's top two elements */ + /* Opcode range: 0x23 */ + /* Stack: 2 * StkElt --> 2 * StkElt */ + /* */ + static void + Ins_SWAP( INS_ARG ) + { + DO_SWAP + } + + + /*************************************************************************/ + /* */ + /* DEPTH[]: return the stack DEPTH */ + /* Opcode range: 0x24 */ + /* Stack: --> uint32 */ + /* */ + static void + Ins_DEPTH( INS_ARG ) + { + DO_DEPTH + } + + + /*************************************************************************/ + /* */ + /* CINDEX[]: Copy INDEXed element */ + /* Opcode range: 0x25 */ + /* Stack: int32 --> StkElt */ + /* */ + static void + Ins_CINDEX( INS_ARG ) + { + DO_CINDEX + } + + + /*************************************************************************/ + /* */ + /* EIF[]: End IF */ + /* Opcode range: 0x59 */ + /* Stack: --> */ + /* */ + static void + Ins_EIF( INS_ARG ) + { + /* nothing to do */ + } + + + /*************************************************************************/ + /* */ + /* JROT[]: Jump Relative On True */ + /* Opcode range: 0x78 */ + /* Stack: StkElt int32 --> */ + /* */ + static void + Ins_JROT( INS_ARG ) + { + DO_JROT + } + + + /*************************************************************************/ + /* */ + /* JMPR[]: JuMP Relative */ + /* Opcode range: 0x1C */ + /* Stack: int32 --> */ + /* */ + static void + Ins_JMPR( INS_ARG ) + { + DO_JMPR + } + + + /*************************************************************************/ + /* */ + /* JROF[]: Jump Relative On False */ + /* Opcode range: 0x79 */ + /* Stack: StkElt int32 --> */ + /* */ + static void + Ins_JROF( INS_ARG ) + { + DO_JROF + } + + + /*************************************************************************/ + /* */ + /* LT[]: Less Than */ + /* Opcode range: 0x50 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_LT( INS_ARG ) + { + DO_LT + } + + + /*************************************************************************/ + /* */ + /* LTEQ[]: Less Than or EQual */ + /* Opcode range: 0x51 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_LTEQ( INS_ARG ) + { + DO_LTEQ + } + + + /*************************************************************************/ + /* */ + /* GT[]: Greater Than */ + /* Opcode range: 0x52 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_GT( INS_ARG ) + { + DO_GT + } + + + /*************************************************************************/ + /* */ + /* GTEQ[]: Greater Than or EQual */ + /* Opcode range: 0x53 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_GTEQ( INS_ARG ) + { + DO_GTEQ + } + + + /*************************************************************************/ + /* */ + /* EQ[]: EQual */ + /* Opcode range: 0x54 */ + /* Stack: StkElt StkElt --> bool */ + /* */ + static void + Ins_EQ( INS_ARG ) + { + DO_EQ + } + + + /*************************************************************************/ + /* */ + /* NEQ[]: Not EQual */ + /* Opcode range: 0x55 */ + /* Stack: StkElt StkElt --> bool */ + /* */ + static void + Ins_NEQ( INS_ARG ) + { + DO_NEQ + } + + + /*************************************************************************/ + /* */ + /* ODD[]: Is ODD */ + /* Opcode range: 0x56 */ + /* Stack: f26.6 --> bool */ + /* */ + static void + Ins_ODD( INS_ARG ) + { + DO_ODD + } + + + /*************************************************************************/ + /* */ + /* EVEN[]: Is EVEN */ + /* Opcode range: 0x57 */ + /* Stack: f26.6 --> bool */ + /* */ + static void + Ins_EVEN( INS_ARG ) + { + DO_EVEN + } + + + /*************************************************************************/ + /* */ + /* AND[]: logical AND */ + /* Opcode range: 0x5A */ + /* Stack: uint32 uint32 --> uint32 */ + /* */ + static void + Ins_AND( INS_ARG ) + { + DO_AND + } + + + /*************************************************************************/ + /* */ + /* OR[]: logical OR */ + /* Opcode range: 0x5B */ + /* Stack: uint32 uint32 --> uint32 */ + /* */ + static void + Ins_OR( INS_ARG ) + { + DO_OR + } + + + /*************************************************************************/ + /* */ + /* NOT[]: logical NOT */ + /* Opcode range: 0x5C */ + /* Stack: StkElt --> uint32 */ + /* */ + static void + Ins_NOT( INS_ARG ) + { + DO_NOT + } + + + /*************************************************************************/ + /* */ + /* ADD[]: ADD */ + /* Opcode range: 0x60 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_ADD( INS_ARG ) + { + DO_ADD + } + + + /*************************************************************************/ + /* */ + /* SUB[]: SUBtract */ + /* Opcode range: 0x61 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_SUB( INS_ARG ) + { + DO_SUB + } + + + /*************************************************************************/ + /* */ + /* DIV[]: DIVide */ + /* Opcode range: 0x62 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_DIV( INS_ARG ) + { + DO_DIV + } + + + /*************************************************************************/ + /* */ + /* MUL[]: MULtiply */ + /* Opcode range: 0x63 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_MUL( INS_ARG ) + { + DO_MUL + } + + + /*************************************************************************/ + /* */ + /* ABS[]: ABSolute value */ + /* Opcode range: 0x64 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_ABS( INS_ARG ) + { + DO_ABS + } + + + /*************************************************************************/ + /* */ + /* NEG[]: NEGate */ + /* Opcode range: 0x65 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_NEG( INS_ARG ) + { + DO_NEG + } + + + /*************************************************************************/ + /* */ + /* FLOOR[]: FLOOR */ + /* Opcode range: 0x66 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_FLOOR( INS_ARG ) + { + DO_FLOOR + } + + + /*************************************************************************/ + /* */ + /* CEILING[]: CEILING */ + /* Opcode range: 0x67 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_CEILING( INS_ARG ) + { + DO_CEILING + } + + + /*************************************************************************/ + /* */ + /* RS[]: Read Store */ + /* Opcode range: 0x43 */ + /* Stack: uint32 --> uint32 */ + /* */ + static void + Ins_RS( INS_ARG ) + { + DO_RS + } + + + /*************************************************************************/ + /* */ + /* WS[]: Write Store */ + /* Opcode range: 0x42 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_WS( INS_ARG ) + { + DO_WS + } + + + /*************************************************************************/ + /* */ + /* WCVTP[]: Write CVT in Pixel units */ + /* Opcode range: 0x44 */ + /* Stack: f26.6 uint32 --> */ + /* */ + static void + Ins_WCVTP( INS_ARG ) + { + DO_WCVTP + } + + + /*************************************************************************/ + /* */ + /* WCVTF[]: Write CVT in Funits */ + /* Opcode range: 0x70 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_WCVTF( INS_ARG ) + { + DO_WCVTF + } + + + /*************************************************************************/ + /* */ + /* RCVT[]: Read CVT */ + /* Opcode range: 0x45 */ + /* Stack: uint32 --> f26.6 */ + /* */ + static void + Ins_RCVT( INS_ARG ) + { + DO_RCVT + } + + + /*************************************************************************/ + /* */ + /* AA[]: Adjust Angle */ + /* Opcode range: 0x7F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_AA( INS_ARG ) + { + /* intentionally no longer supported */ + } + + + /*************************************************************************/ + /* */ + /* DEBUG[]: DEBUG. Unsupported. */ + /* Opcode range: 0x4F */ + /* Stack: uint32 --> */ + /* */ + /* Note: The original instruction pops a value from the stack. */ + /* */ + static void + Ins_DEBUG( INS_ARG ) + { + DO_DEBUG + } + + + /*************************************************************************/ + /* */ + /* ROUND[ab]: ROUND value */ + /* Opcode range: 0x68-0x6B */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_ROUND( INS_ARG ) + { + DO_ROUND + } + + + /*************************************************************************/ + /* */ + /* NROUND[ab]: No ROUNDing of value */ + /* Opcode range: 0x6C-0x6F */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_NROUND( INS_ARG ) + { + DO_NROUND + } + + + /*************************************************************************/ + /* */ + /* MAX[]: MAXimum */ + /* Opcode range: 0x68 */ + /* Stack: int32? int32? --> int32 */ + /* */ + static void + Ins_MAX( INS_ARG ) + { + DO_MAX + } + + + /*************************************************************************/ + /* */ + /* MIN[]: MINimum */ + /* Opcode range: 0x69 */ + /* Stack: int32? int32? --> int32 */ + /* */ + static void + Ins_MIN( INS_ARG ) + { + DO_MIN + } + + +#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + + /*************************************************************************/ + /* */ + /* The following functions are called as is within the switch statement. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* MINDEX[]: Move INDEXed element */ + /* Opcode range: 0x26 */ + /* Stack: int32? --> StkElt */ + /* */ + static void + Ins_MINDEX( INS_ARG ) + { + FT_Long L, K; + + + L = args[0]; + + if ( L <= 0 || L > CUR.args ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + K = CUR.stack[CUR.args - L]; + + FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ], + &CUR.stack[CUR.args - L + 1], + ( L - 1 ) ); + + CUR.stack[CUR.args - 1] = K; + } + + + /*************************************************************************/ + /* */ + /* ROLL[]: ROLL top three elements */ + /* Opcode range: 0x8A */ + /* Stack: 3 * StkElt --> 3 * StkElt */ + /* */ + static void + Ins_ROLL( INS_ARG ) + { + FT_Long A, B, C; + + FT_UNUSED_EXEC; + + + A = args[2]; + B = args[1]; + C = args[0]; + + args[2] = C; + args[1] = A; + args[0] = B; + } + + + /*************************************************************************/ + /* */ + /* MANAGING THE FLOW OF CONTROL */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + static FT_Bool + SkipCode( EXEC_OP ) + { + CUR.IP += CUR.length; + + if ( CUR.IP < CUR.codeSize ) + { + CUR.opcode = CUR.code[CUR.IP]; + + CUR.length = opcode_length[CUR.opcode]; + if ( CUR.length < 0 ) + { + if ( CUR.IP + 1 > CUR.codeSize ) + goto Fail_Overflow; + CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; + } + + if ( CUR.IP + CUR.length <= CUR.codeSize ) + return SUCCESS; + } + + Fail_Overflow: + CUR.error = TT_Err_Code_Overflow; + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* IF[]: IF test */ + /* Opcode range: 0x58 */ + /* Stack: StkElt --> */ + /* */ + static void + Ins_IF( INS_ARG ) + { + FT_Int nIfs; + FT_Bool Out; + + + if ( args[0] != 0 ) + return; + + nIfs = 1; + Out = 0; + + do + { + if ( SKIP_Code() == FAILURE ) + return; + + switch ( CUR.opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x1B: /* ELSE */ + Out = FT_BOOL( nIfs == 1 ); + break; + + case 0x59: /* EIF */ + nIfs--; + Out = FT_BOOL( nIfs == 0 ); + break; + } + } while ( Out == 0 ); + } + + + /*************************************************************************/ + /* */ + /* ELSE[]: ELSE */ + /* Opcode range: 0x1B */ + /* Stack: --> */ + /* */ + static void + Ins_ELSE( INS_ARG ) + { + FT_Int nIfs; + + FT_UNUSED_ARG; + + + nIfs = 1; + + do + { + if ( SKIP_Code() == FAILURE ) + return; + + switch ( CUR.opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x59: /* EIF */ + nIfs--; + break; + } + } while ( nIfs != 0 ); + } + + + /*************************************************************************/ + /* */ + /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* FDEF[]: Function DEFinition */ + /* Opcode range: 0x2C */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_FDEF( INS_ARG ) + { + FT_ULong n; + TT_DefRecord* rec; + TT_DefRecord* limit; + + + /* some font programs are broken enough to redefine functions! */ + /* We will then parse the current table. */ + + rec = CUR.FDefs; + limit = rec + CUR.numFDefs; + n = args[0]; + + for ( ; rec < limit; rec++ ) + { + if ( rec->opc == n ) + break; + } + + if ( rec == limit ) + { + /* check that there is enough room for new functions */ + if ( CUR.numFDefs >= CUR.maxFDefs ) + { + CUR.error = TT_Err_Too_Many_Function_Defs; + return; + } + CUR.numFDefs++; + } + + rec->range = CUR.curRange; + rec->opc = n; + rec->start = CUR.IP + 1; + rec->active = TRUE; + + if ( n > CUR.maxFunc ) + CUR.maxFunc = n; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFS & FDEFs. */ + + while ( SKIP_Code() == SUCCESS ) + { + switch ( CUR.opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + CUR.error = TT_Err_Nested_DEFS; + return; + + case 0x2D: /* ENDF */ + return; + } + } + } + + + /*************************************************************************/ + /* */ + /* ENDF[]: END Function definition */ + /* Opcode range: 0x2D */ + /* Stack: --> */ + /* */ + static void + Ins_ENDF( INS_ARG ) + { + TT_CallRec* pRec; + + FT_UNUSED_ARG; + + + if ( CUR.callTop <= 0 ) /* We encountered an ENDF without a call */ + { + CUR.error = TT_Err_ENDF_In_Exec_Stream; + return; + } + + CUR.callTop--; + + pRec = &CUR.callStack[CUR.callTop]; + + pRec->Cur_Count--; + + CUR.step_ins = FALSE; + + if ( pRec->Cur_Count > 0 ) + { + CUR.callTop++; + CUR.IP = pRec->Cur_Restart; + } + else + /* Loop through the current function */ + INS_Goto_CodeRange( pRec->Caller_Range, + pRec->Caller_IP ); + + /* Exit the current call frame. */ + + /* NOTE: If the last instruction of a program is a */ + /* CALL or LOOPCALL, the return address is */ + /* always out of the code range. This is a */ + /* valid address, and it is why we do not test */ + /* the result of Ins_Goto_CodeRange() here! */ + } + + + /*************************************************************************/ + /* */ + /* CALL[]: CALL function */ + /* Opcode range: 0x2B */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_CALL( INS_ARG ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + + F = args[0]; + if ( BOUNDS( F, CUR.maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* CUR.maxFunc+1 == CUR.numFDefs */ + /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = CUR.FDefs + F; + if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = CUR.FDefs; + limit = def + CUR.numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + + /* check the call stack */ + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + pCrec = CUR.callStack + CUR.callTop; + + pCrec->Caller_Range = CUR.curRange; + pCrec->Caller_IP = CUR.IP + 1; + pCrec->Cur_Count = 1; + pCrec->Cur_Restart = def->start; + + CUR.callTop++; + + INS_Goto_CodeRange( def->range, + def->start ); + + CUR.step_ins = FALSE; + return; + + Fail: + CUR.error = TT_Err_Invalid_Reference; + } + + + /*************************************************************************/ + /* */ + /* LOOPCALL[]: LOOP and CALL function */ + /* Opcode range: 0x2A */ + /* Stack: uint32? Eint16? --> */ + /* */ + static void + Ins_LOOPCALL( INS_ARG ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + F = args[1]; + if ( BOUNDS( F, CUR.maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* CUR.maxFunc+1 == CUR.numFDefs */ + /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = CUR.FDefs + F; + if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = CUR.FDefs; + limit = def + CUR.numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + + /* check stack */ + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + if ( args[0] > 0 ) + { + pCrec = CUR.callStack + CUR.callTop; + + pCrec->Caller_Range = CUR.curRange; + pCrec->Caller_IP = CUR.IP + 1; + pCrec->Cur_Count = (FT_Int)args[0]; + pCrec->Cur_Restart = def->start; + + CUR.callTop++; + + INS_Goto_CodeRange( def->range, def->start ); + + CUR.step_ins = FALSE; + } + return; + + Fail: + CUR.error = TT_Err_Invalid_Reference; + } + + + /*************************************************************************/ + /* */ + /* IDEF[]: Instruction DEFinition */ + /* Opcode range: 0x89 */ + /* Stack: Eint8 --> */ + /* */ + static void + Ins_IDEF( INS_ARG ) + { + TT_DefRecord* def; + TT_DefRecord* limit; + + + /* First of all, look for the same function in our table */ + + def = CUR.IDefs; + limit = def + CUR.numIDefs; + + for ( ; def < limit; def++ ) + if ( def->opc == (FT_ULong)args[0] ) + break; + + if ( def == limit ) + { + /* check that there is enough room for a new instruction */ + if ( CUR.numIDefs >= CUR.maxIDefs ) + { + CUR.error = TT_Err_Too_Many_Instruction_Defs; + return; + } + CUR.numIDefs++; + } + + def->opc = args[0]; + def->start = CUR.IP+1; + def->range = CUR.curRange; + def->active = TRUE; + + if ( (FT_ULong)args[0] > CUR.maxIns ) + CUR.maxIns = args[0]; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFs & FDEFs. */ + + while ( SKIP_Code() == SUCCESS ) + { + switch ( CUR.opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + CUR.error = TT_Err_Nested_DEFS; + return; + case 0x2D: /* ENDF */ + return; + } + } + } + + + /*************************************************************************/ + /* */ + /* PUSHING DATA ONTO THE INTERPRETER STACK */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* NPUSHB[]: PUSH N Bytes */ + /* Opcode range: 0x40 */ + /* Stack: --> uint32... */ + /* */ + static void + Ins_NPUSHB( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)CUR.code[CUR.IP + 1]; + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = CUR.code[CUR.IP + K + 1]; + + CUR.new_top += L; + } + + + /*************************************************************************/ + /* */ + /* NPUSHW[]: PUSH N Words */ + /* Opcode range: 0x41 */ + /* Stack: --> int32... */ + /* */ + static void + Ins_NPUSHW( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)CUR.code[CUR.IP + 1]; + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + CUR.IP += 2; + + for ( K = 0; K < L; K++ ) + args[K] = GET_ShortIns(); + + CUR.step_ins = FALSE; + CUR.new_top += L; + } + + + /*************************************************************************/ + /* */ + /* PUSHB[abc]: PUSH Bytes */ + /* Opcode range: 0xB0-0xB7 */ + /* Stack: --> uint32... */ + /* */ + static void + Ins_PUSHB( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)( CUR.opcode - 0xB0 + 1 ); + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = CUR.code[CUR.IP + K]; + } + + + /*************************************************************************/ + /* */ + /* PUSHW[abc]: PUSH Words */ + /* Opcode range: 0xB8-0xBF */ + /* Stack: --> int32... */ + /* */ + static void + Ins_PUSHW( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)( CUR.opcode - 0xB8 + 1 ); + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + CUR.IP++; + + for ( K = 0; K < L; K++ ) + args[K] = GET_ShortIns(); + + CUR.step_ins = FALSE; + } + + + /*************************************************************************/ + /* */ + /* MANAGING THE GRAPHICS STATE */ + /* */ + /* Instructions appear in the specs' order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* GC[a]: Get Coordinate projected onto */ + /* Opcode range: 0x46-0x47 */ + /* Stack: uint32 --> f26.6 */ + /* */ + /* BULLSHIT: Measures from the original glyph must be taken along the */ + /* dual projection vector! */ + /* */ + static void + Ins_GC( INS_ARG ) + { + FT_ULong L; + FT_F26Dot6 R; + + + L = (FT_ULong)args[0]; + + if ( BOUNDS( L, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + else + R = 0; + } + else + { + if ( CUR.opcode & 1 ) + R = CUR_fast_dualproj( &CUR.zp2.org[L] ); + else + R = CUR_fast_project( &CUR.zp2.cur[L] ); + } + + args[0] = R; + } + + + /*************************************************************************/ + /* */ + /* SCFS[]: Set Coordinate From Stack */ + /* Opcode range: 0x48 */ + /* Stack: f26.6 uint32 --> */ + /* */ + /* Formula: */ + /* */ + /* OA := OA + ( value - OA.p )/( f.p ) * f */ + /* */ + static void + Ins_SCFS( INS_ARG ) + { + FT_Long K; + FT_UShort L; + + + L = (FT_UShort)args[0]; + + if ( BOUNDS( L, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + K = CUR_fast_project( &CUR.zp2.cur[L] ); + + CUR_Func_move( &CUR.zp2, L, args[1] - K ); + + /* not part of the specs, but here for safety */ + + if ( CUR.GS.gep2 == 0 ) + CUR.zp2.org[L] = CUR.zp2.cur[L]; + } + + + /*************************************************************************/ + /* */ + /* MD[a]: Measure Distance */ + /* Opcode range: 0x49-0x4A */ + /* Stack: uint32 uint32 --> f26.6 */ + /* */ + /* BULLSHIT: Measure taken in the original glyph must be along the dual */ + /* projection vector. */ + /* */ + /* Second BULLSHIT: Flag attributes are inverted! */ + /* 0 => measure distance in original outline */ + /* 1 => measure distance in grid-fitted outline */ + /* */ + /* Third one: `zp0 - zp1', and not `zp2 - zp1! */ + /* */ + static void + Ins_MD( INS_ARG ) + { + FT_UShort K, L; + FT_F26Dot6 D; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if( BOUNDS( L, CUR.zp0.n_points ) || + BOUNDS( K, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + D = 0; + } + else + { + if ( CUR.opcode & 1 ) + D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K ); + else + { + FT_Vector* vec1 = CUR.zp0.orus + L; + FT_Vector* vec2 = CUR.zp1.orus + K; + + + if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) + { + /* this should be faster */ + D = CUR_Func_dualproj( vec1, vec2 ); + D = TT_MULFIX( D, CUR.metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale ); + vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale ); + + D = CUR_fast_dualproj( &vec ); + } + } + } + + args[0] = D; + } + + + /*************************************************************************/ + /* */ + /* SDPVTL[a]: Set Dual PVector to Line */ + /* Opcode range: 0x86-0x87 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SDPVTL( INS_ARG ) + { + FT_Long A, B, C; + FT_UShort p1, p2; /* was FT_Int in pas type ERROR */ + + + p1 = (FT_UShort)args[1]; + p2 = (FT_UShort)args[0]; + + if ( BOUNDS( p2, CUR.zp1.n_points ) || + BOUNDS( p1, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + { + FT_Vector* v1 = CUR.zp1.org + p2; + FT_Vector* v2 = CUR.zp2.org + p1; + + + A = v1->x - v2->x; + B = v1->y - v2->y; + } + + if ( ( CUR.opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, &CUR.GS.dualVector ); + + { + FT_Vector* v1 = CUR.zp1.cur + p2; + FT_Vector* v2 = CUR.zp2.cur + p1; + + + A = v1->x - v2->x; + B = v1->y - v2->y; + } + + if ( ( CUR.opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, &CUR.GS.projVector ); + + GUESS_VECTOR( freeVector ); + + COMPUTE_Funcs(); + } + + + /*************************************************************************/ + /* */ + /* SZP0[]: Set Zone Pointer 0 */ + /* Opcode range: 0x13 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP0( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp0 = CUR.twilight; + break; + + case 1: + CUR.zp0 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep0 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZP1[]: Set Zone Pointer 1 */ + /* Opcode range: 0x14 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP1( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp1 = CUR.twilight; + break; + + case 1: + CUR.zp1 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep1 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZP2[]: Set Zone Pointer 2 */ + /* Opcode range: 0x15 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP2( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp2 = CUR.twilight; + break; + + case 1: + CUR.zp2 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZPS[]: Set Zone PointerS */ + /* Opcode range: 0x16 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZPS( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp0 = CUR.twilight; + break; + + case 1: + CUR.zp0 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.zp1 = CUR.zp0; + CUR.zp2 = CUR.zp0; + + CUR.GS.gep0 = (FT_UShort)args[0]; + CUR.GS.gep1 = (FT_UShort)args[0]; + CUR.GS.gep2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* INSTCTRL[]: INSTruction ConTRoL */ + /* Opcode range: 0x8e */ + /* Stack: int32 int32 --> */ + /* */ + static void + Ins_INSTCTRL( INS_ARG ) + { + FT_Long K, L; + + + K = args[1]; + L = args[0]; + + if ( K < 1 || K > 2 ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( L != 0 ) + L = K; + + CUR.GS.instruct_control = FT_BOOL( + ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L ); + } + + + /*************************************************************************/ + /* */ + /* SCANCTRL[]: SCAN ConTRoL */ + /* Opcode range: 0x85 */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_SCANCTRL( INS_ARG ) + { + FT_Int A; + + + /* Get Threshold */ + A = (FT_Int)( args[0] & 0xFF ); + + if ( A == 0xFF ) + { + CUR.GS.scan_control = TRUE; + return; + } + else if ( A == 0 ) + { + CUR.GS.scan_control = FALSE; + return; + } + + if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A ) + CUR.GS.scan_control = FALSE; + + if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated ) + CUR.GS.scan_control = FALSE; + + if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched ) + CUR.GS.scan_control = FALSE; + } + + + /*************************************************************************/ + /* */ + /* SCANTYPE[]: SCAN TYPE */ + /* Opcode range: 0x8D */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_SCANTYPE( INS_ARG ) + { + if ( args[0] >= 0 ) + CUR.GS.scan_type = (FT_Int)args[0]; + } + + + /*************************************************************************/ + /* */ + /* MANAGING OUTLINES */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* FLIPPT[]: FLIP PoinT */ + /* Opcode range: 0x80 */ + /* Stack: uint32... --> */ + /* */ + static void + Ins_FLIPPT( INS_ARG ) + { + FT_UShort point; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + CUR.pts.tags[point] ^= FT_CURVE_TAG_ON; + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* FLIPRGON[]: FLIP RanGe ON */ + /* Opcode range: 0x81 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_FLIPRGON( INS_ARG ) + { + FT_UShort I, K, L; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, CUR.pts.n_points ) || + BOUNDS( L, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + for ( I = L; I <= K; I++ ) + CUR.pts.tags[I] |= FT_CURVE_TAG_ON; + } + + + /*************************************************************************/ + /* */ + /* FLIPRGOFF: FLIP RanGe OFF */ + /* Opcode range: 0x82 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_FLIPRGOFF( INS_ARG ) + { + FT_UShort I, K, L; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, CUR.pts.n_points ) || + BOUNDS( L, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + for ( I = L; I <= K; I++ ) + CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON; + } + + + static FT_Bool + Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6* x, + FT_F26Dot6* y, + TT_GlyphZone zone, + FT_UShort* refp ) + { + TT_GlyphZoneRec zp; + FT_UShort p; + FT_F26Dot6 d; + + + if ( CUR.opcode & 1 ) + { + zp = CUR.zp0; + p = CUR.GS.rp1; + } + else + { + zp = CUR.zp1; + p = CUR.GS.rp2; + } + + if ( BOUNDS( p, zp.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + *refp = 0; + return FAILURE; + } + + *zone = zp; + *refp = p; + + d = CUR_Func_project( zp.cur + p, zp.org + p ); + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + *x = d; + *y = 0; + } + else + { + *x = 0; + *y = d; + } + } + else +#endif + { + *x = TT_MULDIV( d, + (FT_Long)CUR.GS.freeVector.x * 0x10000L, + CUR.F_dot_P ); + *y = TT_MULDIV( d, + (FT_Long)CUR.GS.freeVector.y * 0x10000L, + CUR.F_dot_P ); + } + + return SUCCESS; + } + + + static void + Move_Zp2_Point( EXEC_OP_ FT_UShort point, + FT_F26Dot6 dx, + FT_F26Dot6 dy, + FT_Bool touch ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + CUR.zp2.cur[point].x += dx; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + else + { + CUR.zp2.cur[point].y += dy; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + return; + } +#endif + + if ( CUR.GS.freeVector.x != 0 ) + { + CUR.zp2.cur[point].x += dx; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + if ( CUR.GS.freeVector.y != 0 ) + { + CUR.zp2.cur[point].y += dy; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /*************************************************************************/ + /* */ + /* SHP[a]: SHift Point by the last point */ + /* Opcode range: 0x32-0x33 */ + /* Stack: uint32... --> */ + /* */ + static void + Ins_SHP( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + + FT_F26Dot6 dx, + dy; + FT_UShort point; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) + return; + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + /* XXX: UNDOCUMENTED! SHP touches the points */ + MOVE_Zp2_Point( point, dx, dy, TRUE ); + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* SHC[a]: SHift Contour */ + /* Opcode range: 0x34-35 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SHC( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; + + FT_Short contour; + FT_UShort first_point, last_point, i; + + + contour = (FT_UShort)args[0]; + + if ( BOUNDS( contour, CUR.pts.n_contours ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) + return; + + if ( contour == 0 ) + first_point = 0; + else + first_point = (FT_UShort)( CUR.pts.contours[contour - 1] + 1 - + CUR.pts.first_point ); + + last_point = (FT_UShort)( CUR.pts.contours[contour] - + CUR.pts.first_point ); + + /* XXX: this is probably wrong... at least it prevents memory */ + /* corruption when zp2 is the twilight zone */ + if ( BOUNDS( last_point, CUR.zp2.n_points ) ) + { + if ( CUR.zp2.n_points > 0 ) + last_point = (FT_UShort)(CUR.zp2.n_points - 1); + else + last_point = 0; + } + + /* XXX: UNDOCUMENTED! SHC touches the points */ + for ( i = first_point; i <= last_point; i++ ) + { + if ( zp.cur != CUR.zp2.cur || refp != i ) + MOVE_Zp2_Point( i, dx, dy, TRUE ); + } + } + + + /*************************************************************************/ + /* */ + /* SHZ[a]: SHift Zone */ + /* Opcode range: 0x36-37 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SHZ( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; + + FT_UShort last_point, i; + + + if ( BOUNDS( args[0], 2 ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) + return; + + /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */ + /* Twilight zone has no contours, so use `n_points'. */ + /* Normal zone's `n_points' includes phantoms, so must */ + /* use end of last contour. */ + if ( CUR.GS.gep2 == 0 && CUR.zp2.n_points > 0 ) + last_point = (FT_UShort)( CUR.zp2.n_points - 1 ); + else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) + last_point = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] ); + else + last_point = 0; + + /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */ + for ( i = 0; i <= last_point; i++ ) + { + if ( zp.cur != CUR.zp2.cur || refp != i ) + MOVE_Zp2_Point( i, dx, dy, FALSE ); + } + } + + + /*************************************************************************/ + /* */ + /* SHPIX[]: SHift points by a PIXel amount */ + /* Opcode range: 0x38 */ + /* Stack: f26.6 uint32... --> */ + /* */ + static void + Ins_SHPIX( INS_ARG ) + { + FT_F26Dot6 dx, dy; + FT_UShort point; + + + if ( CUR.top < CUR.GS.loop + 1 ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + dx = TT_MulFix14( args[0], 0x4000 ); + dy = 0; + } + else + { + dx = 0; + dy = TT_MulFix14( args[0], 0x4000 ); + } + } + else +#endif + { + dx = TT_MulFix14( args[0], CUR.GS.freeVector.x ); + dy = TT_MulFix14( args[0], CUR.GS.freeVector.y ); + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + MOVE_Zp2_Point( point, dx, dy, TRUE ); + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* MSIRP[a]: Move Stack Indirect Relative Position */ + /* Opcode range: 0x3A-0x3B */ + /* Stack: f26.6 uint32 --> */ + /* */ + static void + Ins_MSIRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: UNDOCUMENTED! behaviour */ + if ( CUR.GS.gep1 == 0 ) /* if the point that is to be moved */ + /* is in twilight zone */ + { + CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; + CUR_Func_move_orig( &CUR.zp1, point, args[1] ); + CUR.zp1.cur[point] = CUR.zp1.org[point]; + } + + distance = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, args[1] - distance ); + + CUR.GS.rp1 = CUR.GS.rp0; + CUR.GS.rp2 = point; + + if ( ( CUR.opcode & 1 ) != 0 ) + CUR.GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MDAP[a]: Move Direct Absolute Point */ + /* Opcode range: 0x2E-0x2F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_MDAP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 cur_dist, + distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: Is there some undocumented feature while in the */ + /* twilight zone? ? */ + if ( ( CUR.opcode & 1 ) != 0 ) + { + cur_dist = CUR_fast_project( &CUR.zp0.cur[point] ); + distance = CUR_Func_round( cur_dist, + CUR.tt_metrics.compensations[0] ) - cur_dist; + } + else + distance = 0; + + CUR_Func_move( &CUR.zp0, point, distance ); + + CUR.GS.rp0 = point; + CUR.GS.rp1 = point; + } + + + /*************************************************************************/ + /* */ + /* MIAP[a]: Move Indirect Absolute Point */ + /* Opcode range: 0x3E-0x3F */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_MIAP( INS_ARG ) + { + FT_ULong cvtEntry; + FT_UShort point; + FT_F26Dot6 distance, + org_dist; + + + cvtEntry = (FT_ULong)args[1]; + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) || + BOUNDS( cvtEntry, CUR.cvtSize ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: UNDOCUMENTED! */ + /* */ + /* The behaviour of an MIAP instruction is quite */ + /* different when used in the twilight zone. */ + /* */ + /* First, no control value cut-in test is performed */ + /* as it would fail anyway. Second, the original */ + /* point, i.e. (org_x,org_y) of zp0.point, is set */ + /* to the absolute, unrounded distance found in */ + /* the CVT. */ + /* */ + /* This is used in the CVT programs of the Microsoft */ + /* fonts Arial, Times, etc., in order to re-adjust */ + /* some key font heights. It allows the use of the */ + /* IP instruction in the twilight zone, which */ + /* otherwise would be `illegal' according to the */ + /* specification. */ + /* */ + /* We implement it with a special sequence for the */ + /* twilight zone. This is a bad hack, but it seems */ + /* to work. */ + + distance = CUR_Func_read_cvt( cvtEntry ); + + if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */ + { + CUR.zp0.org[point].x = TT_MulFix14( distance, CUR.GS.freeVector.x ); + CUR.zp0.org[point].y = TT_MulFix14( distance, CUR.GS.freeVector.y ), + CUR.zp0.cur[point] = CUR.zp0.org[point]; + } + + org_dist = CUR_fast_project( &CUR.zp0.cur[point] ); + + if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cutin flag */ + { + if ( FT_ABS( distance - org_dist ) > CUR.GS.control_value_cutin ) + distance = org_dist; + + distance = CUR_Func_round( distance, CUR.tt_metrics.compensations[0] ); + } + + CUR_Func_move( &CUR.zp0, point, distance - org_dist ); + + CUR.GS.rp0 = point; + CUR.GS.rp1 = point; + } + + + /*************************************************************************/ + /* */ + /* MDRP[abcde]: Move Direct Relative Point */ + /* Opcode range: 0xC0-0xDF */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_MDRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 org_dist, distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: Is there some undocumented feature while in the */ + /* twilight zone? */ + + /* XXX: UNDOCUMENTED: twilight zone special case */ + + if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) + { + FT_Vector* vec1 = &CUR.zp1.org[point]; + FT_Vector* vec2 = &CUR.zp0.org[CUR.GS.rp0]; + + + org_dist = CUR_Func_dualproj( vec1, vec2 ); + } + else + { + FT_Vector* vec1 = &CUR.zp1.orus[point]; + FT_Vector* vec2 = &CUR.zp0.orus[CUR.GS.rp0]; + + + if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) + { + /* this should be faster */ + org_dist = CUR_Func_dualproj( vec1, vec2 ); + org_dist = TT_MULFIX( org_dist, CUR.metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale ); + vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale ); + + org_dist = CUR_fast_dualproj( &vec ); + } + } + + /* single width cut-in test */ + + if ( FT_ABS( org_dist - CUR.GS.single_width_value ) < + CUR.GS.single_width_cutin ) + { + if ( org_dist >= 0 ) + org_dist = CUR.GS.single_width_value; + else + org_dist = -CUR.GS.single_width_value; + } + + /* round flag */ + + if ( ( CUR.opcode & 4 ) != 0 ) + distance = CUR_Func_round( + org_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + else + distance = ROUND_None( + org_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + + /* minimum distance flag */ + + if ( ( CUR.opcode & 8 ) != 0 ) + { + if ( org_dist >= 0 ) + { + if ( distance < CUR.GS.minimum_distance ) + distance = CUR.GS.minimum_distance; + } + else + { + if ( distance > -CUR.GS.minimum_distance ) + distance = -CUR.GS.minimum_distance; + } + } + + /* now move the point */ + + org_dist = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, distance - org_dist ); + + CUR.GS.rp1 = CUR.GS.rp0; + CUR.GS.rp2 = point; + + if ( ( CUR.opcode & 16 ) != 0 ) + CUR.GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MIRP[abcde]: Move Indirect Relative Point */ + /* Opcode range: 0xE0-0xFF */ + /* Stack: int32? uint32 --> */ + /* */ + static void + Ins_MIRP( INS_ARG ) + { + FT_UShort point; + FT_ULong cvtEntry; + + FT_F26Dot6 cvt_dist, + distance, + cur_dist, + org_dist; + + + point = (FT_UShort)args[0]; + cvtEntry = (FT_ULong)( args[1] + 1 ); + + /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDS( cvtEntry, CUR.cvtSize + 1 ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( !cvtEntry ) + cvt_dist = 0; + else + cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 ); + + /* single width test */ + + if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) < + CUR.GS.single_width_cutin ) + { + if ( cvt_dist >= 0 ) + cvt_dist = CUR.GS.single_width_value; + else + cvt_dist = -CUR.GS.single_width_value; + } + + /* XXX: UNDOCUMENTED! -- twilight zone */ + + if ( CUR.GS.gep1 == 0 ) + { + CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x + + TT_MulFix14( cvt_dist, CUR.GS.freeVector.x ); + + CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y + + TT_MulFix14( cvt_dist, CUR.GS.freeVector.y ); + + CUR.zp1.cur[point] = CUR.zp0.cur[point]; + } + + org_dist = CUR_Func_dualproj( &CUR.zp1.org[point], + &CUR.zp0.org[CUR.GS.rp0] ); + cur_dist = CUR_Func_project ( &CUR.zp1.cur[point], + &CUR.zp0.cur[CUR.GS.rp0] ); + + /* auto-flip test */ + + if ( CUR.GS.auto_flip ) + { + if ( ( org_dist ^ cvt_dist ) < 0 ) + cvt_dist = -cvt_dist; + } + + /* control value cutin and round */ + + if ( ( CUR.opcode & 4 ) != 0 ) + { + /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */ + /* refer to the same zone. */ + + if ( CUR.GS.gep0 == CUR.GS.gep1 ) + if ( FT_ABS( cvt_dist - org_dist ) >= CUR.GS.control_value_cutin ) + cvt_dist = org_dist; + + distance = CUR_Func_round( + cvt_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + } + else + distance = ROUND_None( + cvt_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + + /* minimum distance test */ + + if ( ( CUR.opcode & 8 ) != 0 ) + { + if ( org_dist >= 0 ) + { + if ( distance < CUR.GS.minimum_distance ) + distance = CUR.GS.minimum_distance; + } + else + { + if ( distance > -CUR.GS.minimum_distance ) + distance = -CUR.GS.minimum_distance; + } + } + + CUR_Func_move( &CUR.zp1, point, distance - cur_dist ); + + CUR.GS.rp1 = CUR.GS.rp0; + + if ( ( CUR.opcode & 16 ) != 0 ) + CUR.GS.rp0 = point; + + /* XXX: UNDOCUMENTED! */ + CUR.GS.rp2 = point; + } + + + /*************************************************************************/ + /* */ + /* ALIGNRP[]: ALIGN Relative Point */ + /* Opcode range: 0x3C */ + /* Stack: uint32 uint32... --> */ + /* */ + static void + Ins_ALIGNRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 distance; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + { + distance = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, -distance ); + } + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* ISECT[]: moves point to InterSECTion */ + /* Opcode range: 0x0F */ + /* Stack: 5 * uint32 --> */ + /* */ + static void + Ins_ISECT( INS_ARG ) + { + FT_UShort point, + a0, a1, + b0, b1; + + FT_F26Dot6 discriminant; + + FT_F26Dot6 dx, dy, + dax, day, + dbx, dby; + + FT_F26Dot6 val; + + FT_Vector R; + + + point = (FT_UShort)args[0]; + + a0 = (FT_UShort)args[1]; + a1 = (FT_UShort)args[2]; + b0 = (FT_UShort)args[3]; + b1 = (FT_UShort)args[4]; + + if ( BOUNDS( b0, CUR.zp0.n_points ) || + BOUNDS( b1, CUR.zp0.n_points ) || + BOUNDS( a0, CUR.zp1.n_points ) || + BOUNDS( a1, CUR.zp1.n_points ) || + BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x; + dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y; + + dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x; + day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y; + + dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x; + dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y; + + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH; + + discriminant = TT_MULDIV( dax, -dby, 0x40 ) + + TT_MULDIV( day, dbx, 0x40 ); + + if ( FT_ABS( discriminant ) >= 0x40 ) + { + val = TT_MULDIV( dx, -dby, 0x40 ) + TT_MULDIV( dy, dbx, 0x40 ); + + R.x = TT_MULDIV( val, dax, discriminant ); + R.y = TT_MULDIV( val, day, discriminant ); + + CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x; + CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y; + } + else + { + /* else, take the middle of the middles of A and B */ + + CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x + + CUR.zp1.cur[a1].x + + CUR.zp0.cur[b0].x + + CUR.zp0.cur[b1].x ) / 4; + CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y + + CUR.zp1.cur[a1].y + + CUR.zp0.cur[b0].y + + CUR.zp0.cur[b1].y ) / 4; + } + } + + + /*************************************************************************/ + /* */ + /* ALIGNPTS[]: ALIGN PoinTS */ + /* Opcode range: 0x27 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_ALIGNPTS( INS_ARG ) + { + FT_UShort p1, p2; + FT_F26Dot6 distance; + + + p1 = (FT_UShort)args[0]; + p2 = (FT_UShort)args[1]; + + if ( BOUNDS( args[0], CUR.zp1.n_points ) || + BOUNDS( args[1], CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + distance = CUR_Func_project( CUR.zp0.cur + p2, + CUR.zp1.cur + p1 ) / 2; + + CUR_Func_move( &CUR.zp1, p1, distance ); + CUR_Func_move( &CUR.zp0, p2, -distance ); + } + + + /*************************************************************************/ + /* */ + /* IP[]: Interpolate Point */ + /* Opcode range: 0x39 */ + /* Stack: uint32... --> */ + /* */ + + /* SOMETIMES, DUMBER CODE IS BETTER CODE */ + + static void + Ins_IP( INS_ARG ) + { + FT_F26Dot6 old_range, cur_range; + FT_Vector* orus_base; + FT_Vector* cur_base; + FT_Int twilight; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* + * We need to deal in a special way with the twilight zone. + * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0), + * for every n. + */ + twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0; + + if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( twilight ) + orus_base = &CUR.zp0.org[CUR.GS.rp1]; + else + orus_base = &CUR.zp0.orus[CUR.GS.rp1]; + + cur_base = &CUR.zp0.cur[CUR.GS.rp1]; + + /* XXX: There are some glyphs in some braindead but popular */ + /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ + /* calling IP[] with bad values of rp[12]. */ + /* Do something sane when this odd thing happens. */ + if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) || + BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) ) + { + old_range = 0; + cur_range = 0; + } + else + { + if ( twilight ) + old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2], + orus_base ); + else + old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2], + orus_base ); + + cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base ); + } + + for ( ; CUR.GS.loop > 0; --CUR.GS.loop ) + { + FT_UInt point = (FT_UInt)CUR.stack[--CUR.args]; + FT_F26Dot6 org_dist, cur_dist, new_dist; + + + /* check point bounds */ + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + continue; + } + + if ( twilight ) + org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base ); + else + org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base ); + + cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base ); + + if ( org_dist ) + new_dist = ( old_range != 0 ) + ? TT_MULDIV( org_dist, cur_range, old_range ) + : cur_dist; + else + new_dist = 0; + + CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist ); + } + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* UTP[a]: UnTouch Point */ + /* Opcode range: 0x29 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_UTP( INS_ARG ) + { + FT_UShort point; + FT_Byte mask; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + mask = 0xFF; + + if ( CUR.GS.freeVector.x != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_X; + + if ( CUR.GS.freeVector.y != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_Y; + + CUR.zp0.tags[point] &= mask; + } + + + /* Local variables for Ins_IUP: */ + typedef struct IUP_WorkerRec_ + { + FT_Vector* orgs; /* original and current coordinate */ + FT_Vector* curs; /* arrays */ + FT_Vector* orus; + FT_UInt max_points; + + } IUP_WorkerRec, *IUP_Worker; + + + static void + _iup_worker_shift( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt p ) + { + FT_UInt i; + FT_F26Dot6 dx; + + + dx = worker->curs[p].x - worker->orgs[p].x; + if ( dx != 0 ) + { + for ( i = p1; i < p; i++ ) + worker->curs[i].x += dx; + + for ( i = p + 1; i <= p2; i++ ) + worker->curs[i].x += dx; + } + } + + + static void + _iup_worker_interpolate( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt ref1, + FT_UInt ref2 ) + { + FT_UInt i; + FT_F26Dot6 orus1, orus2, org1, org2, delta1, delta2; + + + if ( p1 > p2 ) + return; + + if ( BOUNDS( ref1, worker->max_points ) || + BOUNDS( ref2, worker->max_points ) ) + return; + + orus1 = worker->orus[ref1].x; + orus2 = worker->orus[ref2].x; + + if ( orus1 > orus2 ) + { + FT_F26Dot6 tmp_o; + FT_UInt tmp_r; + + + tmp_o = orus1; + orus1 = orus2; + orus2 = tmp_o; + + tmp_r = ref1; + ref1 = ref2; + ref2 = tmp_r; + } + + org1 = worker->orgs[ref1].x; + org2 = worker->orgs[ref2].x; + delta1 = worker->curs[ref1].x - org1; + delta2 = worker->curs[ref2].x - org2; + + if ( orus1 == orus2 ) + { + /* simple shift of untouched points */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x += delta1; + else + x += delta2; + + worker->curs[i].x = x; + } + } + else + { + FT_Fixed scale = 0; + FT_Bool scale_valid = 0; + + + /* interpolation */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x += delta1; + + else if ( x >= org2 ) + x += delta2; + + else + { + if ( !scale_valid ) + { + scale_valid = 1; + scale = TT_MULDIV( org2 + delta2 - ( org1 + delta1 ), + 0x10000L, orus2 - orus1 ); + } + + x = ( org1 + delta1 ) + + TT_MULFIX( worker->orus[i].x - orus1, scale ); + } + worker->curs[i].x = x; + } + } + } + + + /*************************************************************************/ + /* */ + /* IUP[a]: Interpolate Untouched Points */ + /* Opcode range: 0x30-0x31 */ + /* Stack: --> */ + /* */ + static void + Ins_IUP( INS_ARG ) + { + IUP_WorkerRec V; + FT_Byte mask; + + FT_UInt first_point; /* first point of contour */ + FT_UInt end_point; /* end point (last+1) of contour */ + + FT_UInt first_touched; /* first touched point in contour */ + FT_UInt cur_touched; /* current touched point in contour */ + + FT_UInt point; /* current point */ + FT_Short contour; /* current contour */ + + FT_UNUSED_ARG; + + + /* ignore empty outlines */ + if ( CUR.pts.n_contours == 0 ) + return; + + if ( CUR.opcode & 1 ) + { + mask = FT_CURVE_TAG_TOUCH_X; + V.orgs = CUR.pts.org; + V.curs = CUR.pts.cur; + V.orus = CUR.pts.orus; + } + else + { + mask = FT_CURVE_TAG_TOUCH_Y; + V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 ); + V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 ); + V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 ); + } + V.max_points = CUR.pts.n_points; + + contour = 0; + point = 0; + + do + { + end_point = CUR.pts.contours[contour] - CUR.pts.first_point; + first_point = point; + + if ( CUR.pts.n_points <= end_point ) + end_point = CUR.pts.n_points; + + while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 ) + point++; + + if ( point <= end_point ) + { + first_touched = point; + cur_touched = point; + + point++; + + while ( point <= end_point ) + { + if ( ( CUR.pts.tags[point] & mask ) != 0 ) + { + if ( point > 0 ) + _iup_worker_interpolate( &V, + cur_touched + 1, + point - 1, + cur_touched, + point ); + cur_touched = point; + } + + point++; + } + + if ( cur_touched == first_touched ) + _iup_worker_shift( &V, first_point, end_point, cur_touched ); + else + { + _iup_worker_interpolate( &V, + (FT_UShort)( cur_touched + 1 ), + end_point, + cur_touched, + first_touched ); + + if ( first_touched > 0 ) + _iup_worker_interpolate( &V, + first_point, + first_touched - 1, + cur_touched, + first_touched ); + } + } + contour++; + } while ( contour < CUR.pts.n_contours ); + } + + + /*************************************************************************/ + /* */ + /* DELTAPn[]: DELTA exceptions P1, P2, P3 */ + /* Opcode range: 0x5D,0x71,0x72 */ + /* Stack: uint32 (2 * uint32)... --> */ + /* */ + static void + Ins_DELTAP( INS_ARG ) + { + FT_ULong k, nump; + FT_UShort A; + FT_ULong C; + FT_Long B; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Delta hinting is covered by US Patent 5159668. */ + if ( CUR.face->unpatented_hinting ) + { + FT_Long n = args[0] * 2; + + + if ( CUR.args < n ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= n; + CUR.new_top = CUR.args; + return; + } +#endif + + nump = (FT_ULong)args[0]; /* some points theoretically may occur more + than once, thus UShort isn't enough */ + + for ( k = 1; k <= nump; k++ ) + { + if ( CUR.args < 2 ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= 2; + + A = (FT_UShort)CUR.stack[CUR.args + 1]; + B = CUR.stack[CUR.args]; + + /* XXX: Because some popular fonts contain some invalid DeltaP */ + /* instructions, we simply ignore them when the stacked */ + /* point reference is off limit, rather than returning an */ + /* error. As a delta instruction doesn't change a glyph */ + /* in great ways, this shouldn't be a problem. */ + + if ( !BOUNDS( A, CUR.zp0.n_points ) ) + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( CUR.opcode ) + { + case 0x5D: + break; + + case 0x71: + C += 16; + break; + + case 0x72: + C += 32; + break; + } + + C += CUR.GS.delta_base; + + if ( CURRENT_Ppem() == (FT_Long)C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B = B * 64 / ( 1L << CUR.GS.delta_shift ); + + CUR_Func_move( &CUR.zp0, A, B ); + } + } + else + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + } + + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* DELTACn[]: DELTA exceptions C1, C2, C3 */ + /* Opcode range: 0x73,0x74,0x75 */ + /* Stack: uint32 (2 * uint32)... --> */ + /* */ + static void + Ins_DELTAC( INS_ARG ) + { + FT_ULong nump, k; + FT_ULong A, C; + FT_Long B; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Delta hinting is covered by US Patent 5159668. */ + if ( CUR.face->unpatented_hinting ) + { + FT_Long n = args[0] * 2; + + + if ( CUR.args < n ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= n; + CUR.new_top = CUR.args; + return; + } +#endif + + nump = (FT_ULong)args[0]; + + for ( k = 1; k <= nump; k++ ) + { + if ( CUR.args < 2 ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= 2; + + A = (FT_ULong)CUR.stack[CUR.args + 1]; + B = CUR.stack[CUR.args]; + + if ( BOUNDS( A, CUR.cvtSize ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( CUR.opcode ) + { + case 0x73: + break; + + case 0x74: + C += 16; + break; + + case 0x75: + C += 32; + break; + } + + C += CUR.GS.delta_base; + + if ( CURRENT_Ppem() == (FT_Long)C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B = B * 64 / ( 1L << CUR.GS.delta_shift ); + + CUR_Func_move_cvt( A, B ); + } + } + } + + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* MISC. INSTRUCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* GETINFO[]: GET INFOrmation */ + /* Opcode range: 0x88 */ + /* Stack: uint32 --> uint32 */ + /* */ + static void + Ins_GETINFO( INS_ARG ) + { + FT_Long K; + + + K = 0; + + /* We return MS rasterizer version 1.7 for the font scaler. */ + if ( ( args[0] & 1 ) != 0 ) + K = 35; + + /* Has the glyph been rotated? */ + if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated ) + K |= 0x80; + + /* Has the glyph been stretched? */ + if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched ) + K |= 1 << 8; + + /* Are we hinting for grayscale? */ + if ( ( args[0] & 32 ) != 0 && CUR.grayscale ) + K |= 1 << 12; + + args[0] = K; + } + + + static void + Ins_UNKNOWN( INS_ARG ) + { + TT_DefRecord* def = CUR.IDefs; + TT_DefRecord* limit = def + CUR.numIDefs; + + FT_UNUSED_ARG; + + + for ( ; def < limit; def++ ) + { + if ( (FT_Byte)def->opc == CUR.opcode && def->active ) + { + TT_CallRec* call; + + + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + call = CUR.callStack + CUR.callTop++; + + call->Caller_Range = CUR.curRange; + call->Caller_IP = CUR.IP+1; + call->Cur_Count = 1; + call->Cur_Restart = def->start; + + INS_Goto_CodeRange( def->range, def->start ); + + CUR.step_ins = FALSE; + return; + } + } + + CUR.error = TT_Err_Invalid_Opcode; + } + + +#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + static + TInstruction_Function Instruct_Dispatch[256] = + { + /* Opcodes are gathered in groups of 16. */ + /* Please keep the spaces as they are. */ + + /* SVTCA y */ Ins_SVTCA, + /* SVTCA x */ Ins_SVTCA, + /* SPvTCA y */ Ins_SPVTCA, + /* SPvTCA x */ Ins_SPVTCA, + /* SFvTCA y */ Ins_SFVTCA, + /* SFvTCA x */ Ins_SFVTCA, + /* SPvTL // */ Ins_SPVTL, + /* SPvTL + */ Ins_SPVTL, + /* SFvTL // */ Ins_SFVTL, + /* SFvTL + */ Ins_SFVTL, + /* SPvFS */ Ins_SPVFS, + /* SFvFS */ Ins_SFVFS, + /* GPV */ Ins_GPV, + /* GFV */ Ins_GFV, + /* SFvTPv */ Ins_SFVTPV, + /* ISECT */ Ins_ISECT, + + /* SRP0 */ Ins_SRP0, + /* SRP1 */ Ins_SRP1, + /* SRP2 */ Ins_SRP2, + /* SZP0 */ Ins_SZP0, + /* SZP1 */ Ins_SZP1, + /* SZP2 */ Ins_SZP2, + /* SZPS */ Ins_SZPS, + /* SLOOP */ Ins_SLOOP, + /* RTG */ Ins_RTG, + /* RTHG */ Ins_RTHG, + /* SMD */ Ins_SMD, + /* ELSE */ Ins_ELSE, + /* JMPR */ Ins_JMPR, + /* SCvTCi */ Ins_SCVTCI, + /* SSwCi */ Ins_SSWCI, + /* SSW */ Ins_SSW, + + /* DUP */ Ins_DUP, + /* POP */ Ins_POP, + /* CLEAR */ Ins_CLEAR, + /* SWAP */ Ins_SWAP, + /* DEPTH */ Ins_DEPTH, + /* CINDEX */ Ins_CINDEX, + /* MINDEX */ Ins_MINDEX, + /* AlignPTS */ Ins_ALIGNPTS, + /* INS_0x28 */ Ins_UNKNOWN, + /* UTP */ Ins_UTP, + /* LOOPCALL */ Ins_LOOPCALL, + /* CALL */ Ins_CALL, + /* FDEF */ Ins_FDEF, + /* ENDF */ Ins_ENDF, + /* MDAP[0] */ Ins_MDAP, + /* MDAP[1] */ Ins_MDAP, + + /* IUP[0] */ Ins_IUP, + /* IUP[1] */ Ins_IUP, + /* SHP[0] */ Ins_SHP, + /* SHP[1] */ Ins_SHP, + /* SHC[0] */ Ins_SHC, + /* SHC[1] */ Ins_SHC, + /* SHZ[0] */ Ins_SHZ, + /* SHZ[1] */ Ins_SHZ, + /* SHPIX */ Ins_SHPIX, + /* IP */ Ins_IP, + /* MSIRP[0] */ Ins_MSIRP, + /* MSIRP[1] */ Ins_MSIRP, + /* AlignRP */ Ins_ALIGNRP, + /* RTDG */ Ins_RTDG, + /* MIAP[0] */ Ins_MIAP, + /* MIAP[1] */ Ins_MIAP, + + /* NPushB */ Ins_NPUSHB, + /* NPushW */ Ins_NPUSHW, + /* WS */ Ins_WS, + /* RS */ Ins_RS, + /* WCvtP */ Ins_WCVTP, + /* RCvt */ Ins_RCVT, + /* GC[0] */ Ins_GC, + /* GC[1] */ Ins_GC, + /* SCFS */ Ins_SCFS, + /* MD[0] */ Ins_MD, + /* MD[1] */ Ins_MD, + /* MPPEM */ Ins_MPPEM, + /* MPS */ Ins_MPS, + /* FlipON */ Ins_FLIPON, + /* FlipOFF */ Ins_FLIPOFF, + /* DEBUG */ Ins_DEBUG, + + /* LT */ Ins_LT, + /* LTEQ */ Ins_LTEQ, + /* GT */ Ins_GT, + /* GTEQ */ Ins_GTEQ, + /* EQ */ Ins_EQ, + /* NEQ */ Ins_NEQ, + /* ODD */ Ins_ODD, + /* EVEN */ Ins_EVEN, + /* IF */ Ins_IF, + /* EIF */ Ins_EIF, + /* AND */ Ins_AND, + /* OR */ Ins_OR, + /* NOT */ Ins_NOT, + /* DeltaP1 */ Ins_DELTAP, + /* SDB */ Ins_SDB, + /* SDS */ Ins_SDS, + + /* ADD */ Ins_ADD, + /* SUB */ Ins_SUB, + /* DIV */ Ins_DIV, + /* MUL */ Ins_MUL, + /* ABS */ Ins_ABS, + /* NEG */ Ins_NEG, + /* FLOOR */ Ins_FLOOR, + /* CEILING */ Ins_CEILING, + /* ROUND[0] */ Ins_ROUND, + /* ROUND[1] */ Ins_ROUND, + /* ROUND[2] */ Ins_ROUND, + /* ROUND[3] */ Ins_ROUND, + /* NROUND[0] */ Ins_NROUND, + /* NROUND[1] */ Ins_NROUND, + /* NROUND[2] */ Ins_NROUND, + /* NROUND[3] */ Ins_NROUND, + + /* WCvtF */ Ins_WCVTF, + /* DeltaP2 */ Ins_DELTAP, + /* DeltaP3 */ Ins_DELTAP, + /* DeltaCn[0] */ Ins_DELTAC, + /* DeltaCn[1] */ Ins_DELTAC, + /* DeltaCn[2] */ Ins_DELTAC, + /* SROUND */ Ins_SROUND, + /* S45Round */ Ins_S45ROUND, + /* JROT */ Ins_JROT, + /* JROF */ Ins_JROF, + /* ROFF */ Ins_ROFF, + /* INS_0x7B */ Ins_UNKNOWN, + /* RUTG */ Ins_RUTG, + /* RDTG */ Ins_RDTG, + /* SANGW */ Ins_SANGW, + /* AA */ Ins_AA, + + /* FlipPT */ Ins_FLIPPT, + /* FlipRgON */ Ins_FLIPRGON, + /* FlipRgOFF */ Ins_FLIPRGOFF, + /* INS_0x83 */ Ins_UNKNOWN, + /* INS_0x84 */ Ins_UNKNOWN, + /* ScanCTRL */ Ins_SCANCTRL, + /* SDPVTL[0] */ Ins_SDPVTL, + /* SDPVTL[1] */ Ins_SDPVTL, + /* GetINFO */ Ins_GETINFO, + /* IDEF */ Ins_IDEF, + /* ROLL */ Ins_ROLL, + /* MAX */ Ins_MAX, + /* MIN */ Ins_MIN, + /* ScanTYPE */ Ins_SCANTYPE, + /* InstCTRL */ Ins_INSTCTRL, + /* INS_0x8F */ Ins_UNKNOWN, + + /* INS_0x90 */ Ins_UNKNOWN, + /* INS_0x91 */ Ins_UNKNOWN, + /* INS_0x92 */ Ins_UNKNOWN, + /* INS_0x93 */ Ins_UNKNOWN, + /* INS_0x94 */ Ins_UNKNOWN, + /* INS_0x95 */ Ins_UNKNOWN, + /* INS_0x96 */ Ins_UNKNOWN, + /* INS_0x97 */ Ins_UNKNOWN, + /* INS_0x98 */ Ins_UNKNOWN, + /* INS_0x99 */ Ins_UNKNOWN, + /* INS_0x9A */ Ins_UNKNOWN, + /* INS_0x9B */ Ins_UNKNOWN, + /* INS_0x9C */ Ins_UNKNOWN, + /* INS_0x9D */ Ins_UNKNOWN, + /* INS_0x9E */ Ins_UNKNOWN, + /* INS_0x9F */ Ins_UNKNOWN, + + /* INS_0xA0 */ Ins_UNKNOWN, + /* INS_0xA1 */ Ins_UNKNOWN, + /* INS_0xA2 */ Ins_UNKNOWN, + /* INS_0xA3 */ Ins_UNKNOWN, + /* INS_0xA4 */ Ins_UNKNOWN, + /* INS_0xA5 */ Ins_UNKNOWN, + /* INS_0xA6 */ Ins_UNKNOWN, + /* INS_0xA7 */ Ins_UNKNOWN, + /* INS_0xA8 */ Ins_UNKNOWN, + /* INS_0xA9 */ Ins_UNKNOWN, + /* INS_0xAA */ Ins_UNKNOWN, + /* INS_0xAB */ Ins_UNKNOWN, + /* INS_0xAC */ Ins_UNKNOWN, + /* INS_0xAD */ Ins_UNKNOWN, + /* INS_0xAE */ Ins_UNKNOWN, + /* INS_0xAF */ Ins_UNKNOWN, + + /* PushB[0] */ Ins_PUSHB, + /* PushB[1] */ Ins_PUSHB, + /* PushB[2] */ Ins_PUSHB, + /* PushB[3] */ Ins_PUSHB, + /* PushB[4] */ Ins_PUSHB, + /* PushB[5] */ Ins_PUSHB, + /* PushB[6] */ Ins_PUSHB, + /* PushB[7] */ Ins_PUSHB, + /* PushW[0] */ Ins_PUSHW, + /* PushW[1] */ Ins_PUSHW, + /* PushW[2] */ Ins_PUSHW, + /* PushW[3] */ Ins_PUSHW, + /* PushW[4] */ Ins_PUSHW, + /* PushW[5] */ Ins_PUSHW, + /* PushW[6] */ Ins_PUSHW, + /* PushW[7] */ Ins_PUSHW, + + /* MDRP[00] */ Ins_MDRP, + /* MDRP[01] */ Ins_MDRP, + /* MDRP[02] */ Ins_MDRP, + /* MDRP[03] */ Ins_MDRP, + /* MDRP[04] */ Ins_MDRP, + /* MDRP[05] */ Ins_MDRP, + /* MDRP[06] */ Ins_MDRP, + /* MDRP[07] */ Ins_MDRP, + /* MDRP[08] */ Ins_MDRP, + /* MDRP[09] */ Ins_MDRP, + /* MDRP[10] */ Ins_MDRP, + /* MDRP[11] */ Ins_MDRP, + /* MDRP[12] */ Ins_MDRP, + /* MDRP[13] */ Ins_MDRP, + /* MDRP[14] */ Ins_MDRP, + /* MDRP[15] */ Ins_MDRP, + + /* MDRP[16] */ Ins_MDRP, + /* MDRP[17] */ Ins_MDRP, + /* MDRP[18] */ Ins_MDRP, + /* MDRP[19] */ Ins_MDRP, + /* MDRP[20] */ Ins_MDRP, + /* MDRP[21] */ Ins_MDRP, + /* MDRP[22] */ Ins_MDRP, + /* MDRP[23] */ Ins_MDRP, + /* MDRP[24] */ Ins_MDRP, + /* MDRP[25] */ Ins_MDRP, + /* MDRP[26] */ Ins_MDRP, + /* MDRP[27] */ Ins_MDRP, + /* MDRP[28] */ Ins_MDRP, + /* MDRP[29] */ Ins_MDRP, + /* MDRP[30] */ Ins_MDRP, + /* MDRP[31] */ Ins_MDRP, + + /* MIRP[00] */ Ins_MIRP, + /* MIRP[01] */ Ins_MIRP, + /* MIRP[02] */ Ins_MIRP, + /* MIRP[03] */ Ins_MIRP, + /* MIRP[04] */ Ins_MIRP, + /* MIRP[05] */ Ins_MIRP, + /* MIRP[06] */ Ins_MIRP, + /* MIRP[07] */ Ins_MIRP, + /* MIRP[08] */ Ins_MIRP, + /* MIRP[09] */ Ins_MIRP, + /* MIRP[10] */ Ins_MIRP, + /* MIRP[11] */ Ins_MIRP, + /* MIRP[12] */ Ins_MIRP, + /* MIRP[13] */ Ins_MIRP, + /* MIRP[14] */ Ins_MIRP, + /* MIRP[15] */ Ins_MIRP, + + /* MIRP[16] */ Ins_MIRP, + /* MIRP[17] */ Ins_MIRP, + /* MIRP[18] */ Ins_MIRP, + /* MIRP[19] */ Ins_MIRP, + /* MIRP[20] */ Ins_MIRP, + /* MIRP[21] */ Ins_MIRP, + /* MIRP[22] */ Ins_MIRP, + /* MIRP[23] */ Ins_MIRP, + /* MIRP[24] */ Ins_MIRP, + /* MIRP[25] */ Ins_MIRP, + /* MIRP[26] */ Ins_MIRP, + /* MIRP[27] */ Ins_MIRP, + /* MIRP[28] */ Ins_MIRP, + /* MIRP[29] */ Ins_MIRP, + /* MIRP[30] */ Ins_MIRP, + /* MIRP[31] */ Ins_MIRP + }; + + +#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + + /*************************************************************************/ + /* */ + /* RUN */ + /* */ + /* This function executes a run of opcodes. It will exit in the */ + /* following cases: */ + /* */ + /* - Errors (in which case it returns FALSE). */ + /* */ + /* - Reaching the end of the main code range (returns TRUE). */ + /* Reaching the end of a code range within a function call is an */ + /* error. */ + /* */ + /* - After executing one single opcode, if the flag `Instruction_Trap' */ + /* is set to TRUE (returns TRUE). */ + /* */ + /* On exit with TRUE, test IP < CodeSize to know whether it comes from */ + /* an instruction trap or a normal termination. */ + /* */ + /* */ + /* Note: The documented DEBUG opcode pops a value from the stack. This */ + /* behaviour is unsupported; here a DEBUG opcode is always an */ + /* error. */ + /* */ + /* */ + /* THIS IS THE INTERPRETER'S MAIN LOOP. */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( FT_Error ) + TT_RunIns( TT_ExecContext exc ) + { + FT_Long ins_counter = 0; /* executed instructions counter */ + + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + cur = *exc; +#endif + + /* set CVT functions */ + CUR.tt_metrics.ratio = 0; + if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem ) + { + /* non-square pixels, use the stretched routines */ + CUR.func_read_cvt = Read_CVT_Stretched; + CUR.func_write_cvt = Write_CVT_Stretched; + CUR.func_move_cvt = Move_CVT_Stretched; + } + else + { + /* square pixels, use normal routines */ + CUR.func_read_cvt = Read_CVT; + CUR.func_write_cvt = Write_CVT; + CUR.func_move_cvt = Move_CVT; + } + + COMPUTE_Funcs(); + COMPUTE_Round( (FT_Byte)exc->GS.round_state ); + + do + { + CUR.opcode = CUR.code[CUR.IP]; + + if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 ) + { + if ( CUR.IP + 1 > CUR.codeSize ) + goto LErrorCodeOverflow_; + + CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; + } + + if ( CUR.IP + CUR.length > CUR.codeSize ) + goto LErrorCodeOverflow_; + + /* First, let's check for empty stack and overflow */ + CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 ); + + /* `args' is the top of the stack once arguments have been popped. */ + /* One can also interpret it as the index of the last argument. */ + if ( CUR.args < 0 ) + { + CUR.error = TT_Err_Too_Few_Arguments; + goto LErrorLabel_; + } + + CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 ); + + /* `new_top' is the new top of the stack, after the instruction's */ + /* execution. `top' will be set to `new_top' after the `switch' */ + /* statement. */ + if ( CUR.new_top > CUR.stackSize ) + { + CUR.error = TT_Err_Stack_Overflow; + goto LErrorLabel_; + } + + CUR.step_ins = TRUE; + CUR.error = TT_Err_Ok; + +#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH + + { + FT_Long* args = CUR.stack + CUR.args; + FT_Byte opcode = CUR.opcode; + + +#undef ARRAY_BOUND_ERROR +#define ARRAY_BOUND_ERROR goto Set_Invalid_Ref + + + switch ( opcode ) + { + case 0x00: /* SVTCA y */ + case 0x01: /* SVTCA x */ + case 0x02: /* SPvTCA y */ + case 0x03: /* SPvTCA x */ + case 0x04: /* SFvTCA y */ + case 0x05: /* SFvTCA x */ + { + FT_Short AA, BB; + + + AA = (FT_Short)( ( opcode & 1 ) << 14 ); + BB = (FT_Short)( AA ^ 0x4000 ); + + if ( opcode < 4 ) + { + CUR.GS.projVector.x = AA; + CUR.GS.projVector.y = BB; + + CUR.GS.dualVector.x = AA; + CUR.GS.dualVector.y = BB; + } + else + { + GUESS_VECTOR( projVector ); + } + + if ( ( opcode & 2 ) == 0 ) + { + CUR.GS.freeVector.x = AA; + CUR.GS.freeVector.y = BB; + } + else + { + GUESS_VECTOR( freeVector ); + } + + COMPUTE_Funcs(); + } + break; + + case 0x06: /* SPvTL // */ + case 0x07: /* SPvTL + */ + DO_SPVTL + break; + + case 0x08: /* SFvTL // */ + case 0x09: /* SFvTL + */ + DO_SFVTL + break; + + case 0x0A: /* SPvFS */ + DO_SPVFS + break; + + case 0x0B: /* SFvFS */ + DO_SFVFS + break; + + case 0x0C: /* GPV */ + DO_GPV + break; + + case 0x0D: /* GFV */ + DO_GFV + break; + + case 0x0E: /* SFvTPv */ + DO_SFVTPV + break; + + case 0x0F: /* ISECT */ + Ins_ISECT( EXEC_ARG_ args ); + break; + + case 0x10: /* SRP0 */ + DO_SRP0 + break; + + case 0x11: /* SRP1 */ + DO_SRP1 + break; + + case 0x12: /* SRP2 */ + DO_SRP2 + break; + + case 0x13: /* SZP0 */ + Ins_SZP0( EXEC_ARG_ args ); + break; + + case 0x14: /* SZP1 */ + Ins_SZP1( EXEC_ARG_ args ); + break; + + case 0x15: /* SZP2 */ + Ins_SZP2( EXEC_ARG_ args ); + break; + + case 0x16: /* SZPS */ + Ins_SZPS( EXEC_ARG_ args ); + break; + + case 0x17: /* SLOOP */ + DO_SLOOP + break; + + case 0x18: /* RTG */ + DO_RTG + break; + + case 0x19: /* RTHG */ + DO_RTHG + break; + + case 0x1A: /* SMD */ + DO_SMD + break; + + case 0x1B: /* ELSE */ + Ins_ELSE( EXEC_ARG_ args ); + break; + + case 0x1C: /* JMPR */ + DO_JMPR + break; + + case 0x1D: /* SCVTCI */ + DO_SCVTCI + break; + + case 0x1E: /* SSWCI */ + DO_SSWCI + break; + + case 0x1F: /* SSW */ + DO_SSW + break; + + case 0x20: /* DUP */ + DO_DUP + break; + + case 0x21: /* POP */ + /* nothing :-) */ + break; + + case 0x22: /* CLEAR */ + DO_CLEAR + break; + + case 0x23: /* SWAP */ + DO_SWAP + break; + + case 0x24: /* DEPTH */ + DO_DEPTH + break; + + case 0x25: /* CINDEX */ + DO_CINDEX + break; + + case 0x26: /* MINDEX */ + Ins_MINDEX( EXEC_ARG_ args ); + break; + + case 0x27: /* ALIGNPTS */ + Ins_ALIGNPTS( EXEC_ARG_ args ); + break; + + case 0x28: /* ???? */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x29: /* UTP */ + Ins_UTP( EXEC_ARG_ args ); + break; + + case 0x2A: /* LOOPCALL */ + Ins_LOOPCALL( EXEC_ARG_ args ); + break; + + case 0x2B: /* CALL */ + Ins_CALL( EXEC_ARG_ args ); + break; + + case 0x2C: /* FDEF */ + Ins_FDEF( EXEC_ARG_ args ); + break; + + case 0x2D: /* ENDF */ + Ins_ENDF( EXEC_ARG_ args ); + break; + + case 0x2E: /* MDAP */ + case 0x2F: /* MDAP */ + Ins_MDAP( EXEC_ARG_ args ); + break; + + + case 0x30: /* IUP */ + case 0x31: /* IUP */ + Ins_IUP( EXEC_ARG_ args ); + break; + + case 0x32: /* SHP */ + case 0x33: /* SHP */ + Ins_SHP( EXEC_ARG_ args ); + break; + + case 0x34: /* SHC */ + case 0x35: /* SHC */ + Ins_SHC( EXEC_ARG_ args ); + break; + + case 0x36: /* SHZ */ + case 0x37: /* SHZ */ + Ins_SHZ( EXEC_ARG_ args ); + break; + + case 0x38: /* SHPIX */ + Ins_SHPIX( EXEC_ARG_ args ); + break; + + case 0x39: /* IP */ + Ins_IP( EXEC_ARG_ args ); + break; + + case 0x3A: /* MSIRP */ + case 0x3B: /* MSIRP */ + Ins_MSIRP( EXEC_ARG_ args ); + break; + + case 0x3C: /* AlignRP */ + Ins_ALIGNRP( EXEC_ARG_ args ); + break; + + case 0x3D: /* RTDG */ + DO_RTDG + break; + + case 0x3E: /* MIAP */ + case 0x3F: /* MIAP */ + Ins_MIAP( EXEC_ARG_ args ); + break; + + case 0x40: /* NPUSHB */ + Ins_NPUSHB( EXEC_ARG_ args ); + break; + + case 0x41: /* NPUSHW */ + Ins_NPUSHW( EXEC_ARG_ args ); + break; + + case 0x42: /* WS */ + DO_WS + break; + + Set_Invalid_Ref: + CUR.error = TT_Err_Invalid_Reference; + break; + + case 0x43: /* RS */ + DO_RS + break; + + case 0x44: /* WCVTP */ + DO_WCVTP + break; + + case 0x45: /* RCVT */ + DO_RCVT + break; + + case 0x46: /* GC */ + case 0x47: /* GC */ + Ins_GC( EXEC_ARG_ args ); + break; + + case 0x48: /* SCFS */ + Ins_SCFS( EXEC_ARG_ args ); + break; + + case 0x49: /* MD */ + case 0x4A: /* MD */ + Ins_MD( EXEC_ARG_ args ); + break; + + case 0x4B: /* MPPEM */ + DO_MPPEM + break; + + case 0x4C: /* MPS */ + DO_MPS + break; + + case 0x4D: /* FLIPON */ + DO_FLIPON + break; + + case 0x4E: /* FLIPOFF */ + DO_FLIPOFF + break; + + case 0x4F: /* DEBUG */ + DO_DEBUG + break; + + case 0x50: /* LT */ + DO_LT + break; + + case 0x51: /* LTEQ */ + DO_LTEQ + break; + + case 0x52: /* GT */ + DO_GT + break; + + case 0x53: /* GTEQ */ + DO_GTEQ + break; + + case 0x54: /* EQ */ + DO_EQ + break; + + case 0x55: /* NEQ */ + DO_NEQ + break; + + case 0x56: /* ODD */ + DO_ODD + break; + + case 0x57: /* EVEN */ + DO_EVEN + break; + + case 0x58: /* IF */ + Ins_IF( EXEC_ARG_ args ); + break; + + case 0x59: /* EIF */ + /* do nothing */ + break; + + case 0x5A: /* AND */ + DO_AND + break; + + case 0x5B: /* OR */ + DO_OR + break; + + case 0x5C: /* NOT */ + DO_NOT + break; + + case 0x5D: /* DELTAP1 */ + Ins_DELTAP( EXEC_ARG_ args ); + break; + + case 0x5E: /* SDB */ + DO_SDB + break; + + case 0x5F: /* SDS */ + DO_SDS + break; + + case 0x60: /* ADD */ + DO_ADD + break; + + case 0x61: /* SUB */ + DO_SUB + break; + + case 0x62: /* DIV */ + DO_DIV + break; + + case 0x63: /* MUL */ + DO_MUL + break; + + case 0x64: /* ABS */ + DO_ABS + break; + + case 0x65: /* NEG */ + DO_NEG + break; + + case 0x66: /* FLOOR */ + DO_FLOOR + break; + + case 0x67: /* CEILING */ + DO_CEILING + break; + + case 0x68: /* ROUND */ + case 0x69: /* ROUND */ + case 0x6A: /* ROUND */ + case 0x6B: /* ROUND */ + DO_ROUND + break; + + case 0x6C: /* NROUND */ + case 0x6D: /* NROUND */ + case 0x6E: /* NRRUND */ + case 0x6F: /* NROUND */ + DO_NROUND + break; + + case 0x70: /* WCVTF */ + DO_WCVTF + break; + + case 0x71: /* DELTAP2 */ + case 0x72: /* DELTAP3 */ + Ins_DELTAP( EXEC_ARG_ args ); + break; + + case 0x73: /* DELTAC0 */ + case 0x74: /* DELTAC1 */ + case 0x75: /* DELTAC2 */ + Ins_DELTAC( EXEC_ARG_ args ); + break; + + case 0x76: /* SROUND */ + DO_SROUND + break; + + case 0x77: /* S45Round */ + DO_S45ROUND + break; + + case 0x78: /* JROT */ + DO_JROT + break; + + case 0x79: /* JROF */ + DO_JROF + break; + + case 0x7A: /* ROFF */ + DO_ROFF + break; + + case 0x7B: /* ???? */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x7C: /* RUTG */ + DO_RUTG + break; + + case 0x7D: /* RDTG */ + DO_RDTG + break; + + case 0x7E: /* SANGW */ + case 0x7F: /* AA */ + /* nothing - obsolete */ + break; + + case 0x80: /* FLIPPT */ + Ins_FLIPPT( EXEC_ARG_ args ); + break; + + case 0x81: /* FLIPRGON */ + Ins_FLIPRGON( EXEC_ARG_ args ); + break; + + case 0x82: /* FLIPRGOFF */ + Ins_FLIPRGOFF( EXEC_ARG_ args ); + break; + + case 0x83: /* UNKNOWN */ + case 0x84: /* UNKNOWN */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x85: /* SCANCTRL */ + Ins_SCANCTRL( EXEC_ARG_ args ); + break; + + case 0x86: /* SDPVTL */ + case 0x87: /* SDPVTL */ + Ins_SDPVTL( EXEC_ARG_ args ); + break; + + case 0x88: /* GETINFO */ + Ins_GETINFO( EXEC_ARG_ args ); + break; + + case 0x89: /* IDEF */ + Ins_IDEF( EXEC_ARG_ args ); + break; + + case 0x8A: /* ROLL */ + Ins_ROLL( EXEC_ARG_ args ); + break; + + case 0x8B: /* MAX */ + DO_MAX + break; + + case 0x8C: /* MIN */ + DO_MIN + break; + + case 0x8D: /* SCANTYPE */ + Ins_SCANTYPE( EXEC_ARG_ args ); + break; + + case 0x8E: /* INSTCTRL */ + Ins_INSTCTRL( EXEC_ARG_ args ); + break; + + case 0x8F: + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + default: + if ( opcode >= 0xE0 ) + Ins_MIRP( EXEC_ARG_ args ); + else if ( opcode >= 0xC0 ) + Ins_MDRP( EXEC_ARG_ args ); + else if ( opcode >= 0xB8 ) + Ins_PUSHW( EXEC_ARG_ args ); + else if ( opcode >= 0xB0 ) + Ins_PUSHB( EXEC_ARG_ args ); + else + Ins_UNKNOWN( EXEC_ARG_ args ); + } + + } + +#else + + Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] ); + +#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + if ( CUR.error != TT_Err_Ok ) + { + switch ( CUR.error ) + { + case TT_Err_Invalid_Opcode: /* looking for redefined instructions */ + { + TT_DefRecord* def = CUR.IDefs; + TT_DefRecord* limit = def + CUR.numIDefs; + + + for ( ; def < limit; def++ ) + { + if ( def->active && CUR.opcode == (FT_Byte)def->opc ) + { + TT_CallRec* callrec; + + + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Invalid_Reference; + goto LErrorLabel_; + } + + callrec = &CUR.callStack[CUR.callTop]; + + callrec->Caller_Range = CUR.curRange; + callrec->Caller_IP = CUR.IP + 1; + callrec->Cur_Count = 1; + callrec->Cur_Restart = def->start; + + if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE ) + goto LErrorLabel_; + + goto LSuiteLabel_; + } + } + } + + CUR.error = TT_Err_Invalid_Opcode; + goto LErrorLabel_; + +#if 0 + break; /* Unreachable code warning suppression. */ + /* Leave to remind in case a later change the editor */ + /* to consider break; */ +#endif + + default: + goto LErrorLabel_; + +#if 0 + break; +#endif + } + } + + CUR.top = CUR.new_top; + + if ( CUR.step_ins ) + CUR.IP += CUR.length; + + /* increment instruction counter and check if we didn't */ + /* run this program for too long (e.g. infinite loops). */ + if ( ++ins_counter > MAX_RUNNABLE_OPCODES ) + return TT_Err_Execution_Too_Long; + + LSuiteLabel_: + if ( CUR.IP >= CUR.codeSize ) + { + if ( CUR.callTop > 0 ) + { + CUR.error = TT_Err_Code_Overflow; + goto LErrorLabel_; + } + else + goto LNo_Error_; + } + } while ( !CUR.instruction_trap ); + + LNo_Error_: + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + *exc = cur; +#endif + + return TT_Err_Ok; + + LErrorCodeOverflow_: + CUR.error = TT_Err_Code_Overflow; + + LErrorLabel_: + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + *exc = cur; +#endif + + return CUR.error; + } + + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttinterp.h b/src/3rdparty/freetype/src/truetype/ttinterp.h new file mode 100644 index 0000000000..07a8972cb3 --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttinterp.h @@ -0,0 +1,311 @@ +/***************************************************************************/ +/* */ +/* ttinterp.h */ +/* */ +/* TrueType bytecode interpreter (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTINTERP_H__ +#define __TTINTERP_H__ + +#include +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + +#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ + +#define EXEC_OP_ TT_ExecContext exc, +#define EXEC_OP TT_ExecContext exc +#define EXEC_ARG_ exc, +#define EXEC_ARG exc + +#else /* static implementation */ + +#define EXEC_OP_ /* void */ +#define EXEC_OP /* void */ +#define EXEC_ARG_ /* void */ +#define EXEC_ARG /* void */ + +#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* Rounding mode constants. */ + /* */ +#define TT_Round_Off 5 +#define TT_Round_To_Half_Grid 0 +#define TT_Round_To_Grid 1 +#define TT_Round_To_Double_Grid 2 +#define TT_Round_Up_To_Grid 4 +#define TT_Round_Down_To_Grid 3 +#define TT_Round_Super 6 +#define TT_Round_Super_45 7 + + + /*************************************************************************/ + /* */ + /* Function types used by the interpreter, depending on various modes */ + /* (e.g. the rounding mode, whether to render a vertical or horizontal */ + /* line etc). */ + /* */ + /*************************************************************************/ + + /* Rounding function */ + typedef FT_F26Dot6 + (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ); + + /* Point displacement along the freedom vector routine */ + typedef void + (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ); + + /* Distance projection along one of the projection vectors */ + typedef FT_F26Dot6 + (*TT_Project_Func)( EXEC_OP_ FT_Pos dx, + FT_Pos dy ); + + /* reading a cvt value. Take care of non-square pixels if necessary */ + typedef FT_F26Dot6 + (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong idx ); + + /* setting or moving a cvt value. Take care of non-square pixels */ + /* if necessary */ + typedef void + (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ); + + + /*************************************************************************/ + /* */ + /* This structure defines a call record, used to manage function calls. */ + /* */ + typedef struct TT_CallRec_ + { + FT_Int Caller_Range; + FT_Long Caller_IP; + FT_Long Cur_Count; + FT_Long Cur_Restart; + + } TT_CallRec, *TT_CallStack; + + + /*************************************************************************/ + /* */ + /* The main structure for the interpreter which collects all necessary */ + /* variables and states. */ + /* */ + typedef struct TT_ExecContextRec_ + { + TT_Face face; + TT_Size size; + FT_Memory memory; + + /* instructions state */ + + FT_Error error; /* last execution error */ + + FT_Long top; /* top of exec. stack */ + + FT_UInt stackSize; /* size of exec. stack */ + FT_Long* stack; /* current exec. stack */ + + FT_Long args; + FT_UInt new_top; /* new top after exec. */ + + TT_GlyphZoneRec zp0, /* zone records */ + zp1, + zp2, + pts, + twilight; + + FT_Size_Metrics metrics; + TT_Size_Metrics tt_metrics; /* size metrics */ + + TT_GraphicsState GS; /* current graphics state */ + + FT_Int curRange; /* current code range number */ + FT_Byte* code; /* current code range */ + FT_Long IP; /* current instruction pointer */ + FT_Long codeSize; /* size of current range */ + + FT_Byte opcode; /* current opcode */ + FT_Int length; /* length of current opcode */ + + FT_Bool step_ins; /* true if the interpreter must */ + /* increment IP after ins. exec */ + FT_Long cvtSize; + FT_Long* cvt; + + FT_UInt glyphSize; /* glyph instructions buffer size */ + FT_Byte* glyphIns; /* glyph instructions buffer */ + + FT_UInt numFDefs; /* number of function defs */ + FT_UInt maxFDefs; /* maximum number of function defs */ + TT_DefArray FDefs; /* table of FDefs entries */ + + FT_UInt numIDefs; /* number of instruction defs */ + FT_UInt maxIDefs; /* maximum number of ins defs */ + TT_DefArray IDefs; /* table of IDefs entries */ + + FT_UInt maxFunc; /* maximum function index */ + FT_UInt maxIns; /* maximum instruction index */ + + FT_Int callTop, /* top of call stack during execution */ + callSize; /* size of call stack */ + TT_CallStack callStack; /* call stack */ + + FT_UShort maxPoints; /* capacity of this context's `pts' */ + FT_Short maxContours; /* record, expressed in points and */ + /* contours. */ + + TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */ + /* useful for the debugger */ + + FT_UShort storeSize; /* size of current storage */ + FT_Long* storage; /* storage area */ + + FT_F26Dot6 period; /* values used for the */ + FT_F26Dot6 phase; /* `SuperRounding' */ + FT_F26Dot6 threshold; + +#if 0 + /* this seems to be unused */ + FT_Int cur_ppem; /* ppem along the current proj vector */ +#endif + + FT_Bool instruction_trap; /* If `True', the interpreter will */ + /* exit after each instruction */ + + TT_GraphicsState default_GS; /* graphics state resulting from */ + /* the prep program */ + FT_Bool is_composite; /* true if the glyph is composite */ + FT_Bool pedantic_hinting; /* true if pedantic interpretation */ + + /* latest interpreter additions */ + + FT_Long F_dot_P; /* dot product of freedom and projection */ + /* vectors */ + TT_Round_Func func_round; /* current rounding function */ + + TT_Project_Func func_project, /* current projection function */ + func_dualproj, /* current dual proj. function */ + func_freeProj; /* current freedom proj. func */ + + TT_Move_Func func_move; /* current point move function */ + TT_Move_Func func_move_orig; /* move original position function */ + + TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ + TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ + TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ + + FT_Bool grayscale; /* are we hinting for grayscale? */ + + } TT_ExecContextRec; + + + extern const TT_GraphicsState tt_default_graphics_state; + + + FT_LOCAL( FT_Error ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ); + + FT_LOCAL( FT_Error ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ); + + FT_LOCAL( FT_Error ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_New_Context */ + /* */ + /* */ + /* Queries the face context for a given font. Note that there is */ + /* now a _single_ execution context in the TrueType driver which is */ + /* shared among faces. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* */ + /* A handle to the execution context. Initialized for `face'. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_EXPORT( TT_ExecContext ) + TT_New_Context( TT_Driver driver ); + + FT_LOCAL( FT_Error ) + TT_Done_Context( TT_ExecContext exec ); + + FT_LOCAL( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ); + + FT_LOCAL( FT_Error ) + TT_Save_Context( TT_ExecContext exec, + TT_Size ins ); + + FT_LOCAL( FT_Error ) + TT_Run_Context( TT_ExecContext exec, + FT_Bool debug ); + + + /*************************************************************************/ + /* */ + /* */ + /* TT_RunIns */ + /* */ + /* */ + /* Executes one or more instruction in the execution context. This */ + /* is the main function of the TrueType opcode interpreter. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only the object manager and debugger should call this function. */ + /* */ + /* This function is publicly exported because it is directly */ + /* invoked by the TrueType debugger. */ + /* */ + FT_EXPORT( FT_Error ) + TT_RunIns( TT_ExecContext exec ); + + +FT_END_HEADER + +#endif /* __TTINTERP_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttobjs.c b/src/3rdparty/freetype/src/truetype/ttobjs.c new file mode 100644 index 0000000000..2649a670dd --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttobjs.c @@ -0,0 +1,955 @@ +/***************************************************************************/ +/* */ +/* ttobjs.c */ +/* */ +/* Objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_SFNT_H + +#include "ttgload.h" +#include "ttpload.h" + +#include "tterrors.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#include FT_TRUETYPE_UNPATENTED_H +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttobjs + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* GLYPH ZONE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_glyphzone_done */ + /* */ + /* */ + /* Deallocate a glyph zone. */ + /* */ + /* */ + /* zone :: A pointer to the target glyph zone. */ + /* */ + FT_LOCAL_DEF( void ) + tt_glyphzone_done( TT_GlyphZone zone ) + { + FT_Memory memory = zone->memory; + + + if ( memory ) + { + FT_FREE( zone->contours ); + FT_FREE( zone->tags ); + FT_FREE( zone->cur ); + FT_FREE( zone->org ); + FT_FREE( zone->orus ); + + zone->max_points = zone->n_points = 0; + zone->max_contours = zone->n_contours = 0; + zone->memory = NULL; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_glyphzone_new */ + /* */ + /* */ + /* Allocate a new glyph zone. */ + /* */ + /* */ + /* memory :: A handle to the current memory object. */ + /* */ + /* maxPoints :: The capacity of glyph zone in points. */ + /* */ + /* maxContours :: The capacity of glyph zone in contours. */ + /* */ + /* */ + /* zone :: A pointer to the target glyph zone record. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ) + { + FT_Error error; + + + FT_MEM_ZERO( zone, sizeof ( *zone ) ); + zone->memory = memory; + + if ( FT_NEW_ARRAY( zone->org, maxPoints ) || + FT_NEW_ARRAY( zone->cur, maxPoints ) || + FT_NEW_ARRAY( zone->orus, maxPoints ) || + FT_NEW_ARRAY( zone->tags, maxPoints ) || + FT_NEW_ARRAY( zone->contours, maxContours ) ) + { + tt_glyphzone_done( zone ); + } + else + { + zone->max_points = maxPoints; + zone->max_contours = maxContours; + } + + return error; + } +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* Compare the face with a list of well-known `tricky' fonts. */ + /* This list shall be expanded as we find more of them. */ + + static FT_Bool + tt_check_trickyness( FT_String* name ) + { + static const char* const trick_names[] = + { + "DFKaiSho-SB", /* dfkaisb.ttf */ + "DFKaiShu", + "DFKai-SB", /* kaiu.ttf */ + "HuaTianSongTi?", /* htst3.ttf */ + "MingLiU", /* mingliu.ttf & mingliu.ttc */ + "PMingLiU", /* mingliu.ttc */ + "MingLi43", /* mingli.ttf */ + NULL + }; + int nn; + + + if ( !name ) + return FALSE; + + /* Note that we only check the face name at the moment; it might */ + /* be worth to do more checks for a few special cases. */ + for ( nn = 0; trick_names[nn] != NULL; nn++ ) + if ( ft_strstr( name, trick_names[nn] ) ) + return TRUE; + + return FALSE; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_init */ + /* */ + /* */ + /* Initialize a given TrueType face object. */ + /* */ + /* */ + /* stream :: The source font stream. */ + /* */ + /* face_index :: The index of the font face in the resource. */ + /* */ + /* num_params :: Number of additional generic parameters. Ignored. */ + /* */ + /* params :: Additional generic parameters. Ignored. */ + /* */ + /* */ + /* face :: The newly built face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library; + SFNT_Service sfnt; + TT_Face face = (TT_Face)ttface; + + + library = ttface->driver->root.library; + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check that we have a valid TrueType file */ + error = sfnt->init_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + + /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ + /* The 0x00020000 tag is completely undocumented; some fonts from */ + /* Arphic made for Chinese Windows 3.1 have this. */ + if ( face->format_tag != 0x00010000L && /* MS fonts */ + face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ + face->format_tag != TTAG_true ) /* Mac fonts */ + { + FT_TRACE2(( "[not a valid TTF font]\n" )); + goto Bad_Format; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + ttface->face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* If we are performing a simple font format check, exit immediately. */ + if ( face_index < 0 ) + return TT_Err_Ok; + + /* Load font directory */ + error = sfnt->load_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + + if ( tt_check_trickyness( ttface->family_name ) ) + ttface->face_flags |= FT_FACE_FLAG_TRICKY; + + error = tt_face_load_hdmx( face, stream ); + if ( error ) + goto Exit; + + if ( FT_IS_SCALABLE( ttface ) ) + { + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( !ttface->internal->incremental_interface ) + error = tt_face_load_loca( face, stream ); + if ( !error ) + error = tt_face_load_cvt( face, stream ); + if ( !error ) + error = tt_face_load_fpgm( face, stream ); + if ( !error ) + error = tt_face_load_prep( face, stream ); + +#else + + if ( !error ) + error = tt_face_load_loca( face, stream ); + if ( !error ) + error = tt_face_load_cvt( face, stream ); + if ( !error ) + error = tt_face_load_fpgm( face, stream ); + if ( !error ) + error = tt_face_load_prep( face, stream ); + +#endif + + } + +#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ + !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER ) + + { + FT_Bool unpatented_hinting; + int i; + + + /* Determine whether unpatented hinting is to be used for this face. */ + unpatented_hinting = FT_BOOL + ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL ); + + for ( i = 0; i < num_params && !face->unpatented_hinting; i++ ) + if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING ) + unpatented_hinting = TRUE; + + if ( !unpatented_hinting ) + ttface->internal->ignore_unpatented_hinter = TRUE; + } + +#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING && + !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + /* initialize standard glyph loading routines */ + TT_Init_Glyph_Loading( face ); + + Exit: + return error; + + Bad_Format: + error = TT_Err_Unknown_File_Format; + goto Exit; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_done */ + /* */ + /* */ + /* Finalize a given face object. */ + /* */ + /* */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_done( FT_Face ttface ) /* TT_Face */ + { + TT_Face face = (TT_Face)ttface; + FT_Memory memory; + FT_Stream stream; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = ttface->memory; + stream = ttface->stream; + sfnt = (SFNT_Service)face->sfnt; + + /* for `extended TrueType formats' (i.e. compressed versions) */ + if ( face->extra.finalizer ) + face->extra.finalizer( face->extra.data ); + + if ( sfnt ) + sfnt->done_face( face ); + + /* freeing the locations table */ + tt_face_done_loca( face ); + + tt_face_free_hdmx( face ); + + /* freeing the CVT */ + FT_FREE( face->cvt ); + face->cvt_size = 0; + + /* freeing the programs */ + FT_FRAME_RELEASE( face->font_program ); + FT_FRAME_RELEASE( face->cvt_program ); + face->font_program_size = 0; + face->cvt_program_size = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + tt_done_blend( memory, face->blend ); + face->blend = NULL; +#endif + } + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_run_fpgm */ + /* */ + /* */ + /* Run the font program. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_fpgm( TT_Size size ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + /* debugging instances have their own context */ + if ( size->debug ) + exec = size->context; + else + exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + TT_Load_Context( exec, face, size ); + + exec->callTop = 0; + exec->top = 0; + + exec->period = 64; + exec->phase = 0; + exec->threshold = 0; + + exec->instruction_trap = FALSE; + exec->F_dot_P = 0x10000L; + + { + FT_Size_Metrics* metrics = &exec->metrics; + TT_Size_Metrics* tt_metrics = &exec->tt_metrics; + + + metrics->x_ppem = 0; + metrics->y_ppem = 0; + metrics->x_scale = 0; + metrics->y_scale = 0; + + tt_metrics->ppem = 0; + tt_metrics->scale = 0; + tt_metrics->ratio = 0x10000L; + } + + /* allow font program execution */ + TT_Set_CodeRange( exec, + tt_coderange_font, + face->font_program, + face->font_program_size ); + + /* disable CVT and glyph programs coderange */ + TT_Clear_CodeRange( exec, tt_coderange_cvt ); + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->font_program_size > 0 ) + { + error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); + + if ( !error ) + error = face->interpreter( exec ); + } + else + error = TT_Err_Ok; + + if ( !error ) + TT_Save_Context( exec, size ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_run_prep */ + /* */ + /* */ + /* Run the control value program. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_prep( TT_Size size ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + /* debugging instances have their own context */ + if ( size->debug ) + exec = size->context; + else + exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + TT_Load_Context( exec, face, size ); + + exec->callTop = 0; + exec->top = 0; + + exec->instruction_trap = FALSE; + + TT_Set_CodeRange( exec, + tt_coderange_cvt, + face->cvt_program, + face->cvt_program_size ); + + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->cvt_program_size > 0 ) + { + error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); + + if ( !error && !size->debug ) + error = face->interpreter( exec ); + } + else + error = TT_Err_Ok; + + /* save as default graphics state */ + size->GS = exec->GS; + + TT_Save_Context( exec, size ); + + return error; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + static void + tt_size_done_bytecode( FT_Size ftsize ) + { + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + + + if ( size->debug ) + { + /* the debug context must be deleted by the debugger itself */ + size->context = NULL; + size->debug = FALSE; + } + + FT_FREE( size->cvt ); + size->cvt_size = 0; + + /* free storage area */ + FT_FREE( size->storage ); + size->storage_size = 0; + + /* twilight zone */ + tt_glyphzone_done( &size->twilight ); + + FT_FREE( size->function_defs ); + FT_FREE( size->instruction_defs ); + + size->num_function_defs = 0; + size->max_function_defs = 0; + size->num_instruction_defs = 0; + size->max_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->bytecode_ready = 0; + size->cvt_ready = 0; + } + + + /* Initialize bytecode-related fields in the size object. */ + /* We do this only if bytecode interpretation is really needed. */ + static FT_Error + tt_size_init_bytecode( FT_Size ftsize ) + { + FT_Error error; + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + FT_Int i; + + FT_UShort n_twilight; + TT_MaxProfile* maxp = &face->max_profile; + + + size->bytecode_ready = 1; + size->cvt_ready = 0; + + size->max_function_defs = maxp->maxFunctionDefs; + size->max_instruction_defs = maxp->maxInstructionDefs; + + size->num_function_defs = 0; + size->num_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->cvt_size = face->cvt_size; + size->storage_size = maxp->maxStorage; + + /* Set default metrics */ + { + FT_Size_Metrics* metrics = &size->metrics; + TT_Size_Metrics* metrics2 = &size->ttmetrics; + + metrics->x_ppem = 0; + metrics->y_ppem = 0; + + metrics2->rotated = FALSE; + metrics2->stretched = FALSE; + + /* set default compensation (all 0) */ + for ( i = 0; i < 4; i++ ) + metrics2->compensations[i] = 0; + } + + /* allocate function defs, instruction defs, cvt, and storage area */ + if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || + FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || + FT_NEW_ARRAY( size->cvt, size->cvt_size ) || + FT_NEW_ARRAY( size->storage, size->storage_size ) ) + goto Exit; + + /* reserve twilight zone */ + n_twilight = maxp->maxTwilightPoints; + + /* there are 4 phantom points (do we need this?) */ + n_twilight += 4; + + error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); + if ( error ) + goto Exit; + + size->twilight.n_points = n_twilight; + + size->GS = tt_default_graphics_state; + + /* set `face->interpreter' according to the debug hook present */ + { + FT_Library library = face->root.driver->root.library; + + + face->interpreter = (TT_Interpreter) + library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; + if ( !face->interpreter ) + face->interpreter = (TT_Interpreter)TT_RunIns; + } + + /* Fine, now run the font program! */ + error = tt_size_run_fpgm( size ); + + Exit: + if ( error ) + tt_size_done_bytecode( ftsize ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_size_ready_bytecode( TT_Size size ) + { + FT_Error error = TT_Err_Ok; + + + if ( !size->bytecode_ready ) + { + error = tt_size_init_bytecode( (FT_Size)size ); + if ( error ) + goto Exit; + } + + /* rescale CVT when needed */ + if ( !size->cvt_ready ) + { + FT_UInt i; + TT_Face face = (TT_Face)size->root.face; + + + /* Scale the cvt values to the new ppem. */ + /* We use by default the y ppem to scale the CVT. */ + for ( i = 0; i < size->cvt_size; i++ ) + size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); + + /* all twilight points are originally zero */ + for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) + { + size->twilight.org[i].x = 0; + size->twilight.org[i].y = 0; + size->twilight.cur[i].x = 0; + size->twilight.cur[i].y = 0; + } + + /* clear storage area */ + for ( i = 0; i < (FT_UInt)size->storage_size; i++ ) + size->storage[i] = 0; + + size->GS = tt_default_graphics_state; + + error = tt_size_run_prep( size ); + if ( !error ) + size->cvt_ready = 1; + } + + Exit: + return error; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_init */ + /* */ + /* */ + /* Initialize a new TrueType size object. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_init( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + FT_Error error = TT_Err_Ok; + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->bytecode_ready = 0; + size->cvt_ready = 0; +#endif + + size->ttmetrics.valid = FALSE; + size->strike_index = 0xFFFFFFFFUL; + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_done */ + /* */ + /* */ + /* The TrueType size object finalizer. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_size_done( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + if ( size->bytecode_ready ) + tt_size_done_bytecode( ttsize ); +#endif + + size->ttmetrics.valid = FALSE; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_reset */ + /* */ + /* */ + /* Reset a TrueType size when resolutions and character dimensions */ + /* have been changed. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_reset( TT_Size size ) + { + TT_Face face; + FT_Error error = TT_Err_Ok; + FT_Size_Metrics* metrics; + + + size->ttmetrics.valid = FALSE; + + face = (TT_Face)size->root.face; + + metrics = &size->metrics; + + /* copy the result from base layer */ + *metrics = size->root.metrics; + + if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) + return TT_Err_Invalid_PPem; + + /* This bit flag, if set, indicates that the ppems must be */ + /* rounded to integers. Nearly all TrueType fonts have this bit */ + /* set, as hinting won't work really well otherwise. */ + /* */ + if ( face->header.Flags & 8 ) + { + metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, + face->root.units_per_EM ); + metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, + face->root.units_per_EM ); + + metrics->ascender = + FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); + metrics->descender = + FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); + metrics->height = + FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); + metrics->max_advance = + FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, + metrics->x_scale ) ); + } + + /* compute new transformation */ + if ( metrics->x_ppem >= metrics->y_ppem ) + { + size->ttmetrics.scale = metrics->x_scale; + size->ttmetrics.ppem = metrics->x_ppem; + size->ttmetrics.x_ratio = 0x10000L; + size->ttmetrics.y_ratio = FT_MulDiv( metrics->y_ppem, + 0x10000L, + metrics->x_ppem ); + } + else + { + size->ttmetrics.scale = metrics->y_scale; + size->ttmetrics.ppem = metrics->y_ppem; + size->ttmetrics.x_ratio = FT_MulDiv( metrics->x_ppem, + 0x10000L, + metrics->y_ppem ); + size->ttmetrics.y_ratio = 0x10000L; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->cvt_ready = 0; +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + if ( !error ) + size->ttmetrics.valid = TRUE; + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_driver_init */ + /* */ + /* */ + /* Initialize a given TrueType driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ + { + +#ifdef TT_USE_BYTECODE_INTERPRETER + + TT_Driver driver = (TT_Driver)ttdriver; + + + if ( !TT_New_Context( driver ) ) + return TT_Err_Could_Not_Find_Context; + +#else + + FT_UNUSED( ttdriver ); + +#endif + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_driver_done */ + /* */ + /* */ + /* Finalize a given TrueType driver. */ + /* */ + /* */ + /* driver :: A handle to the target TrueType driver. */ + /* */ + FT_LOCAL_DEF( void ) + tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ + { +#ifdef TT_USE_BYTECODE_INTERPRETER + TT_Driver driver = (TT_Driver)ttdriver; + + + /* destroy the execution context */ + if ( driver->context ) + { + TT_Done_Context( driver->context ); + driver->context = NULL; + } +#else + FT_UNUSED( ttdriver ); +#endif + + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_slot_init */ + /* */ + /* */ + /* Initialize a new slot object. */ + /* */ + /* */ + /* slot :: A handle to the slot object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ) + { + return FT_GlyphLoader_CreateExtra( slot->internal->loader ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttobjs.h b/src/3rdparty/freetype/src/truetype/ttobjs.h new file mode 100644 index 0000000000..d4b82285e5 --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttobjs.h @@ -0,0 +1,463 @@ +/***************************************************************************/ +/* */ +/* ttobjs.h */ +/* */ +/* Objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTOBJS_H__ +#define __TTOBJS_H__ + + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Driver */ + /* */ + /* */ + /* A handle to a TrueType driver object. */ + /* */ + typedef struct TT_DriverRec_* TT_Driver; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Instance */ + /* */ + /* */ + /* A handle to a TrueType size object. */ + /* */ + typedef struct TT_SizeRec_* TT_Size; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_GlyphSlot */ + /* */ + /* */ + /* A handle to a TrueType glyph slot object. */ + /* */ + /* */ + /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ + /* specific about the TrueType glyph slot. */ + /* */ + typedef FT_GlyphSlot TT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_GraphicsState */ + /* */ + /* */ + /* The TrueType graphics state used during bytecode interpretation. */ + /* */ + typedef struct TT_GraphicsState_ + { + FT_UShort rp0; + FT_UShort rp1; + FT_UShort rp2; + + FT_UnitVector dualVector; + FT_UnitVector projVector; + FT_UnitVector freeVector; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_Bool both_x_axis; +#endif + + FT_Long loop; + FT_F26Dot6 minimum_distance; + FT_Int round_state; + + FT_Bool auto_flip; + FT_F26Dot6 control_value_cutin; + FT_F26Dot6 single_width_cutin; + FT_F26Dot6 single_width_value; + FT_Short delta_base; + FT_Short delta_shift; + + FT_Byte instruct_control; + /* According to Greg Hitchcock from Microsoft, the `scan_control' */ + /* variable as documented in the TrueType specification is a 32-bit */ + /* integer; the high-word part holds the SCANTYPE value, the low-word */ + /* part the SCANCTRL value. We separate it into two fields. */ + FT_Bool scan_control; + FT_Int scan_type; + + FT_UShort gep0; + FT_UShort gep1; + FT_UShort gep2; + + } TT_GraphicsState; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( void ) + tt_glyphzone_done( TT_GlyphZone zone ); + + FT_LOCAL( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + + /*************************************************************************/ + /* */ + /* EXECUTION SUBTABLES */ + /* */ + /* These sub-tables relate to instruction execution. */ + /* */ + /*************************************************************************/ + + +#define TT_MAX_CODE_RANGES 3 + + + /*************************************************************************/ + /* */ + /* There can only be 3 active code ranges at once: */ + /* - the Font Program */ + /* - the CVT Program */ + /* - a glyph's instructions set */ + /* */ + typedef enum TT_CodeRange_Tag_ + { + tt_coderange_none = 0, + tt_coderange_font, + tt_coderange_cvt, + tt_coderange_glyph + + } TT_CodeRange_Tag; + + + typedef struct TT_CodeRange_ + { + FT_Byte* base; + FT_ULong size; + + } TT_CodeRange; + + typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; + + + /*************************************************************************/ + /* */ + /* Defines a function/instruction definition record. */ + /* */ + typedef struct TT_DefRecord_ + { + FT_Int range; /* in which code range is it located? */ + FT_Long start; /* where does it start? */ + FT_UInt opc; /* function #, or instruction code */ + FT_Bool active; /* is it active? */ + + } TT_DefRecord, *TT_DefArray; + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct TT_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } TT_Transform; + + + /*************************************************************************/ + /* */ + /* Subglyph loading record. Used to load composite components. */ + /* */ + typedef struct TT_SubglyphRec_ + { + FT_Long index; /* subglyph index; initialized with -1 */ + FT_Bool is_scaled; /* is the subglyph scaled? */ + FT_Bool is_hinted; /* should it be hinted? */ + FT_Bool preserve_pps; /* preserve phantom points? */ + + FT_Long file_offset; + + FT_BBox bbox; + FT_Pos left_bearing; + FT_Pos advance; + + TT_GlyphZoneRec zone; + + FT_Long arg1; /* first argument */ + FT_Long arg2; /* second argument */ + + FT_UShort element_flag; /* current load element flag */ + + TT_Transform transform; /* transformation matrix */ + + FT_Vector pp1, pp2; /* phantom points (horizontal) */ + FT_Vector pp3, pp4; /* phantom points (vertical) */ + + } TT_SubGlyphRec, *TT_SubGlyph_Stack; + + + /*************************************************************************/ + /* */ + /* A note regarding non-squared pixels: */ + /* */ + /* (This text will probably go into some docs at some time; for now, it */ + /* is kept here to explain some definitions in the TIns_Metrics */ + /* record). */ + /* */ + /* The CVT is a one-dimensional array containing values that control */ + /* certain important characteristics in a font, like the height of all */ + /* capitals, all lowercase letter, default spacing or stem width/height. */ + /* */ + /* These values are found in FUnits in the font file, and must be scaled */ + /* to pixel coordinates before being used by the CVT and glyph programs. */ + /* Unfortunately, when using distinct x and y resolutions (or distinct x */ + /* and y pointsizes), there are two possible scalings. */ + /* */ + /* A first try was to implement a `lazy' scheme where all values were */ + /* scaled when first used. However, while some values are always used */ + /* in the same direction, some others are used under many different */ + /* circumstances and orientations. */ + /* */ + /* I have found a simpler way to do the same, and it even seems to work */ + /* in most of the cases: */ + /* */ + /* - All CVT values are scaled to the maximum ppem size. */ + /* */ + /* - When performing a read or write in the CVT, a ratio factor is used */ + /* to perform adequate scaling. Example: */ + /* */ + /* x_ppem = 14 */ + /* y_ppem = 10 */ + /* */ + /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */ + /* entries are scaled to it. */ + /* */ + /* x_ratio = 1.0 */ + /* y_ratio = y_ppem/ppem (< 1.0) */ + /* */ + /* We compute the current ratio like: */ + /* */ + /* - If projVector is horizontal, */ + /* ratio = x_ratio = 1.0 */ + /* */ + /* - if projVector is vertical, */ + /* ratio = y_ratio */ + /* */ + /* - else, */ + /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */ + /* */ + /* Reading a cvt value returns */ + /* ratio * cvt[index] */ + /* */ + /* Writing a cvt value in pixels: */ + /* cvt[index] / ratio */ + /* */ + /* The current ppem is simply */ + /* ratio * ppem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Metrics used by the TrueType size and context objects. */ + /* */ + typedef struct TT_Size_Metrics_ + { + /* for non-square pixels */ + FT_Long x_ratio; + FT_Long y_ratio; + + FT_UShort ppem; /* maximum ppem size */ + FT_Long ratio; /* current ratio */ + FT_Fixed scale; + + FT_F26Dot6 compensations[4]; /* device-specific compensations */ + + FT_Bool valid; + + FT_Bool rotated; /* `is the glyph rotated?'-flag */ + FT_Bool stretched; /* `is the glyph stretched?'-flag */ + + } TT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* TrueType size class. */ + /* */ + typedef struct TT_SizeRec_ + { + FT_SizeRec root; + + /* we have our own copy of metrics so that we can modify */ + /* it without affecting auto-hinting (when used) */ + FT_Size_Metrics metrics; + + TT_Size_Metrics ttmetrics; + + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_UInt num_function_defs; /* number of function definitions */ + FT_UInt max_function_defs; + TT_DefArray function_defs; /* table of function definitions */ + + FT_UInt num_instruction_defs; /* number of ins. definitions */ + FT_UInt max_instruction_defs; + TT_DefArray instruction_defs; /* table of ins. definitions */ + + FT_UInt max_func; + FT_UInt max_ins; + + TT_CodeRangeTable codeRangeTable; + + TT_GraphicsState GS; + + FT_ULong cvt_size; /* the scaled control value table */ + FT_Long* cvt; + + FT_UShort storage_size; /* The storage area is now part of */ + FT_Long* storage; /* the instance */ + + TT_GlyphZoneRec twilight; /* The instance's twilight zone */ + + /* debugging variables */ + + /* When using the debugger, we must keep the */ + /* execution context tied to the instance */ + /* object rather than asking it on demand. */ + + FT_Bool debug; + TT_ExecContext context; + + FT_Bool bytecode_ready; + FT_Bool cvt_ready; + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + } TT_SizeRec; + + + /*************************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct TT_DriverRec_ + { + FT_DriverRec root; + TT_ExecContext context; /* execution context */ + TT_GlyphZoneRec zone; /* glyph loader points zone */ + + void* extension_component; + + } TT_DriverRec; + + + /* Note: All of the functions below (except tt_size_reset()) are used */ + /* as function pointers in a FT_Driver_ClassRec. Therefore their */ + /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ + /* TT_Size, etc., so that the compiler can confirm that the types and */ + /* number of parameters are correct. In all cases the FT_xxx types are */ + /* cast to their TT_xxx counterparts inside the functions since FreeType */ + /* will always use the TT driver to create them. */ + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + tt_face_done( FT_Face ttface ); /* TT_Face */ + + + /*************************************************************************/ + /* */ + /* Size functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_size_init( FT_Size ttsize ); /* TT_Size */ + + FT_LOCAL( void ) + tt_size_done( FT_Size ttsize ); /* TT_Size */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( FT_Error ) + tt_size_run_fpgm( TT_Size size ); + + FT_LOCAL( FT_Error ) + tt_size_run_prep( TT_Size size ); + + FT_LOCAL( FT_Error ) + tt_size_ready_bytecode( TT_Size size ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + FT_LOCAL( FT_Error ) + tt_size_reset( TT_Size size ); + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ + + FT_LOCAL( void ) + tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ + + + /*************************************************************************/ + /* */ + /* Slot functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ); + + +FT_END_HEADER + +#endif /* __TTOBJS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttpload.c b/src/3rdparty/freetype/src/truetype/ttpload.c new file mode 100644 index 0000000000..f5d985eb48 --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttpload.c @@ -0,0 +1,574 @@ +/***************************************************************************/ +/* */ +/* ttpload.c */ +/* */ +/* TrueType-specific tables loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttpload + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_loca */ + /* */ + /* */ + /* Load the locations table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_len; + FT_Int shift; + + + /* we need the size of the `glyf' table for malformed `loca' tables */ + error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len ); + + /* it is possible that a font doesn't have a glyf table at all */ + /* or its size is zero */ + if ( error == TT_Err_Table_Missing ) + face->glyf_len = 0; + else if ( error ) + goto Exit; + + FT_TRACE2(( "Locations " )); + error = face->goto_table( face, TTAG_loca, stream, &table_len ); + if ( error ) + { + error = TT_Err_Locations_Missing; + goto Exit; + } + + if ( face->header.Index_To_Loc_Format != 0 ) + { + shift = 2; + + if ( table_len >= 0x40000L ) + { + FT_TRACE2(( "table too large!\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + face->num_locations = (FT_UInt)( table_len >> shift ); + } + else + { + shift = 1; + + if ( table_len >= 0x20000L ) + { + FT_TRACE2(( "table too large!\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + face->num_locations = (FT_UInt)( table_len >> shift ); + } + + if ( face->num_locations != (FT_UInt)face->root.num_glyphs ) + { + FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n", + face->num_locations, face->root.num_glyphs )); + + /* we only handle the case where `maxp' gives a larger value */ + if ( face->num_locations < (FT_UInt)face->root.num_glyphs ) + { + FT_Long new_loca_len = (FT_Long)face->root.num_glyphs << shift; + + TT_Table entry = face->dir_tables; + TT_Table limit = entry + face->num_tables; + + FT_Long pos = FT_Stream_Pos( stream ); + FT_Long dist = 0x7FFFFFFFL; + + + /* compute the distance to next table in font file */ + for ( ; entry < limit; entry++ ) + { + FT_Long diff = entry->Offset - pos; + + + if ( diff > 0 && diff < dist ) + dist = diff; + } + + if ( new_loca_len <= dist ) + { + face->num_locations = (FT_Long)face->root.num_glyphs; + table_len = new_loca_len; + + FT_TRACE2(( "adjusting num_locations to %d\n", + face->num_locations )); + } + } + } + + /* + * Extract the frame. We don't need to decompress it since + * we are able to parse it directly. + */ + if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) ) + goto Exit; + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ) + { + FT_ULong pos1, pos2; + FT_Byte* p; + FT_Byte* p_limit; + + + pos1 = pos2 = 0; + + if ( gindex < face->num_locations ) + { + if ( face->header.Index_To_Loc_Format != 0 ) + { + p = face->glyph_locations + gindex * 4; + p_limit = face->glyph_locations + face->num_locations * 4; + + pos1 = FT_NEXT_ULONG( p ); + pos2 = pos1; + + if ( p + 4 <= p_limit ) + pos2 = FT_NEXT_ULONG( p ); + } + else + { + p = face->glyph_locations + gindex * 2; + p_limit = face->glyph_locations + face->num_locations * 2; + + pos1 = FT_NEXT_USHORT( p ); + pos2 = pos1; + + if ( p + 2 <= p_limit ) + pos2 = FT_NEXT_USHORT( p ); + + pos1 <<= 1; + pos2 <<= 1; + } + } + + /* It isn't mentioned explicitly that the `loca' table must be */ + /* ordered, but implicitly it refers to the length of an entry */ + /* as the difference between the current and the next position. */ + /* Anyway, there do exist (malformed) fonts which don't obey */ + /* this rule, so we are only able to provide an upper bound for */ + /* the size. */ + /* */ + /* We get (intentionally) a wrong, non-zero result in case the */ + /* `glyf' table is missing. */ + if ( pos2 >= pos1 ) + *asize = (FT_UInt)( pos2 - pos1 ); + else + *asize = (FT_UInt)( face->glyf_len - pos1 ); + + return pos1; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_loca( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->glyph_locations ); + face->num_locations = 0; + } + + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_cvt */ + /* */ + /* */ + /* Load the control value table into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_len; + + + FT_TRACE2(( "CVT " )); + + error = face->goto_table( face, TTAG_cvt, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing!\n" )); + + face->cvt_size = 0; + face->cvt = NULL; + error = TT_Err_Ok; + + goto Exit; + } + + face->cvt_size = table_len / 2; + + if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) ) + goto Exit; + + if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) + goto Exit; + + { + FT_Short* cur = face->cvt; + FT_Short* limit = cur + face->cvt_size; + + + for ( ; cur < limit; cur++ ) + *cur = FT_GET_SHORT(); + } + + FT_FRAME_EXIT(); + FT_TRACE2(( "loaded\n" )); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( face->doblend ) + error = tt_face_vary_cvt( face, stream ); +#endif + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_fpgm */ + /* */ + /* */ + /* Load the font program. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Font program " )); + + /* The font program is optional */ + error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); + if ( error ) + { + face->font_program = NULL; + face->font_program_size = 0; + error = TT_Err_Ok; + + FT_TRACE2(( "is missing!\n" )); + } + else + { + face->font_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_prep */ + /* */ + /* */ + /* Load the cvt program. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Prep program " )); + + error = face->goto_table( face, TTAG_prep, stream, &table_len ); + if ( error ) + { + face->cvt_program = NULL; + face->cvt_program_size = 0; + error = TT_Err_Ok; + + FT_TRACE2(( "is missing!\n" )); + } + else + { + face->cvt_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_hdmx */ + /* */ + /* */ + /* Load the `hdmx' table into the face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt version, nn, num_records; + FT_ULong table_size, record_size; + FT_Byte* p; + FT_Byte* limit; + + + /* this table is optional */ + error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); + if ( error || table_size < 8 ) + return TT_Err_Ok; + + if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) + goto Exit; + + p = face->hdmx_table; + limit = p + table_size; + + version = FT_NEXT_USHORT( p ); + num_records = FT_NEXT_USHORT( p ); + record_size = FT_NEXT_ULONG( p ); + + /* The maximum number of bytes in an hdmx device record is the */ + /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is */ + /* the reason why `record_size' is a long (which we read as */ + /* unsigned long for convenience). In practice, two bytes */ + /* sufficient to hold the size value. */ + /* */ + /* There are at least two fonts, HANNOM-A and HANNOM-B version */ + /* 2.0 (2005), which get this wrong: The upper two bytes of */ + /* the size value are set to 0xFF instead of 0x00. We catch */ + /* and fix this. */ + + if ( record_size >= 0xFFFF0000UL ) + record_size &= 0xFFFFU; + + /* The limit for `num_records' is a heuristic value. */ + + if ( version != 0 || num_records > 255 || record_size > 0x10001L ) + { + error = TT_Err_Invalid_File_Format; + goto Fail; + } + + if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) ) + goto Fail; + + for ( nn = 0; nn < num_records; nn++ ) + { + if ( p + record_size > limit ) + break; + + face->hdmx_record_sizes[nn] = p[0]; + p += record_size; + } + + face->hdmx_record_count = nn; + face->hdmx_table_size = table_size; + face->hdmx_record_size = record_size; + + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->hdmx_table ); + face->hdmx_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_hdmx( TT_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream ? stream->memory : NULL; + + if ( face->hdmx_record_sizes ) + FT_FREE( face->hdmx_record_sizes ); + FT_FRAME_RELEASE( face->hdmx_table ); + } + + + /*************************************************************************/ + /* */ + /* Return the advance width table for a given pixel size if it is found */ + /* in the font's `hdmx' table (if any). */ + /* */ + FT_LOCAL_DEF( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ) + { + FT_UInt nn; + FT_Byte* result = NULL; + FT_ULong record_size = face->hdmx_record_size; + FT_Byte* record = face->hdmx_table + 8; + + + for ( nn = 0; nn < face->hdmx_record_count; nn++ ) + if ( face->hdmx_record_sizes[nn] == ppem ) + { + gindex += 2; + if ( gindex < record_size ) + result = record + nn * record_size + gindex; + break; + } + + return result; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttpload.h b/src/3rdparty/freetype/src/truetype/ttpload.h new file mode 100644 index 0000000000..f61ac079ce --- /dev/null +++ b/src/3rdparty/freetype/src/truetype/ttpload.h @@ -0,0 +1,75 @@ +/***************************************************************************/ +/* */ +/* ttpload.h */ +/* */ +/* TrueType-specific tables loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTPLOAD_H__ +#define __TTPLOAD_H__ + + +#include +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ); + + FT_LOCAL( void ) + tt_face_done_loca( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( void ) + tt_face_free_hdmx( TT_Face face ); + + + FT_LOCAL( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ); + +FT_END_HEADER + +#endif /* __TTPLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/Jamfile b/src/3rdparty/freetype/src/type1/Jamfile new file mode 100644 index 0000000000..8e366baae5 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/type1 Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) type1 ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = t1afm t1driver t1objs t1load t1gload t1parse ; + } + else + { + _sources = type1 ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/type1 Jamfile diff --git a/src/3rdparty/freetype/src/type1/module.mk b/src/3rdparty/freetype/src/type1/module.mk new file mode 100644 index 0000000000..ade0210d76 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Type1 module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE1_DRIVER + +define TYPE1_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)type1 $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/type1/rules.mk b/src/3rdparty/freetype/src/type1/rules.mk new file mode 100644 index 0000000000..15087b0304 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 Type1 driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Type1 driver directory +# +T1_DIR := $(SRC_DIR)/type1 + + +# compilation flags for the driver +# +T1_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T1_DIR)) + + +# Type1 driver sources (i.e., C files) +# +T1_DRV_SRC := $(T1_DIR)/t1parse.c \ + $(T1_DIR)/t1load.c \ + $(T1_DIR)/t1driver.c \ + $(T1_DIR)/t1afm.c \ + $(T1_DIR)/t1gload.c \ + $(T1_DIR)/t1objs.c + +# Type1 driver headers +# +T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \ + $(T1_DIR)/t1tokens.h \ + $(T1_DIR)/t1errors.h + + +# Type1 driver object(s) +# +# T1_DRV_OBJ_M is used during `multi' builds +# T1_DRV_OBJ_S is used during `single' builds +# +T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O) +T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O + +# Type1 driver source file for single build +# +T1_DRV_SRC_S := $(T1_DIR)/type1.c + + +# Type1 driver - single object +# +$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H) + $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S)) + + +# Type1 driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H) + $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(T1_DRV_OBJ_S) +DRV_OBJS_M += $(T1_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/type1/t1afm.c b/src/3rdparty/freetype/src/type1/t1afm.c new file mode 100644 index 0000000000..5aea58820e --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1afm.c @@ -0,0 +1,390 @@ +/***************************************************************************/ +/* */ +/* t1afm.c */ +/* */ +/* AFM support for Type 1 fonts (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include "t1afm.h" +#include "t1errors.h" +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1afm + + + FT_LOCAL_DEF( void ) + T1_Done_Metrics( FT_Memory memory, + AFM_FontInfo fi ) + { + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi ); + } + + + /* read a glyph name and return the equivalent glyph index */ + static FT_Int + t1_get_index( const char* name, + FT_UInt len, + void* user_data ) + { + T1_Font type1 = (T1_Font)user_data; + FT_Int n; + + + for ( n = 0; n < type1->num_glyphs; n++ ) + { + char* gname = (char*)type1->glyph_names[n]; + + + if ( gname && gname[0] == name[0] && + ft_strlen( gname ) == len && + ft_strncmp( gname, name, len ) == 0 ) + return n; + } + + return 0; + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) + + + /* compare two kerning pairs */ + FT_CALLBACK_DEF( int ) + compare_kern_pairs( const void* a, + const void* b ) + { + AFM_KernPair pair1 = (AFM_KernPair)a; + AFM_KernPair pair2 = (AFM_KernPair)b; + + FT_ULong index1 = KERN_INDEX( pair1->index1, pair1->index2 ); + FT_ULong index2 = KERN_INDEX( pair2->index1, pair2->index2 ); + + + if ( index1 > index2 ) + return 1; + else if ( index1 < index2 ) + return -1; + else + return 0; + } + + + /* parse a PFM file -- for now, only read the kerning pairs */ + static FT_Error + T1_Read_PFM( FT_Face t1_face, + FT_Stream stream, + AFM_FontInfo fi ) + { + FT_Error error = T1_Err_Ok; + FT_Memory memory = stream->memory; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* p; + AFM_KernPair kp; + FT_Int width_table_length; + FT_CharMap oldcharmap; + FT_CharMap charmap; + FT_Int n; + + + start = (FT_Byte*)stream->cursor; + limit = (FT_Byte*)stream->limit; + p = start; + + /* Figure out how long the width table is. */ + /* This info is a little-endian short at offset 99. */ + p = start + 99; + if ( p + 2 > limit ) + { + error = T1_Err_Unknown_File_Format; + goto Exit; + } + width_table_length = FT_PEEK_USHORT_LE( p ); + + p += 18 + width_table_length; + if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 ) + /* extension table is probably optional */ + goto Exit; + + /* Kerning offset is 14 bytes from start of extensions table. */ + p += 14; + p = start + FT_PEEK_ULONG_LE( p ); + + if ( p == start ) + /* zero offset means no table */ + goto Exit; + + if ( p + 2 > limit ) + { + error = T1_Err_Unknown_File_Format; + goto Exit; + } + + fi->NumKernPair = FT_PEEK_USHORT_LE( p ); + p += 2; + if ( p + 4 * fi->NumKernPair > limit ) + { + error = T1_Err_Unknown_File_Format; + goto Exit; + } + + /* Actually, kerning pairs are simply optional! */ + if ( fi->NumKernPair == 0 ) + goto Exit; + + /* allocate the pairs */ + if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) + goto Exit; + + /* now, read each kern pair */ + kp = fi->KernPairs; + limit = p + 4 * fi->NumKernPair; + + /* PFM kerning data are stored by encoding rather than glyph index, */ + /* so find the PostScript charmap of this font and install it */ + /* temporarily. If we find no PostScript charmap, then just use */ + /* the default and hope it is the right one. */ + oldcharmap = t1_face->charmap; + charmap = NULL; + + for ( n = 0; n < t1_face->num_charmaps; n++ ) + { + charmap = t1_face->charmaps[n]; + /* check against PostScript pseudo platform */ + if ( charmap->platform_id == 7 ) + { + error = FT_Set_Charmap( t1_face, charmap ); + if ( error ) + goto Exit; + break; + } + } + + /* Kerning info is stored as: */ + /* */ + /* encoding of first glyph (1 byte) */ + /* encoding of second glyph (1 byte) */ + /* offset (little-endian short) */ + for ( ; p < limit ; p += 4 ) + { + kp->index1 = FT_Get_Char_Index( t1_face, p[0] ); + kp->index2 = FT_Get_Char_Index( t1_face, p[1] ); + + kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2); + kp->y = 0; + + kp++; + } + + if ( oldcharmap != NULL ) + error = FT_Set_Charmap( t1_face, oldcharmap ); + if ( error ) + goto Exit; + + /* now, sort the kern pairs according to their glyph indices */ + ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ), + compare_kern_pairs ); + + Exit: + if ( error ) + { + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + } + + return error; + } + + + /* parse a metrics file -- either AFM or PFM depending on what */ + /* it turns out to be */ + FT_LOCAL_DEF( FT_Error ) + T1_Read_Metrics( FT_Face t1_face, + FT_Stream stream ) + { + PSAux_Service psaux; + FT_Memory memory = stream->memory; + AFM_ParserRec parser; + AFM_FontInfo fi; + FT_Error error = T1_Err_Unknown_File_Format; + T1_Font t1_font = &( (T1_Face)t1_face )->type1; + + + if ( FT_NEW( fi ) || + FT_FRAME_ENTER( stream->size ) ) + goto Exit; + + fi->FontBBox = t1_font->font_bbox; + fi->Ascender = t1_font->font_bbox.yMax; + fi->Descender = t1_font->font_bbox.yMin; + + psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux; + if ( psaux && psaux->afm_parser_funcs ) + { + error = psaux->afm_parser_funcs->init( &parser, + stream->memory, + stream->cursor, + stream->limit ); + + if ( !error ) + { + parser.FontInfo = fi; + parser.get_index = t1_get_index; + parser.user_data = t1_font; + + error = psaux->afm_parser_funcs->parse( &parser ); + psaux->afm_parser_funcs->done( &parser ); + } + } + + if ( error == T1_Err_Unknown_File_Format ) + { + FT_Byte* start = stream->cursor; + + + /* MS Windows allows versions up to 0x3FF without complaining */ + if ( stream->size > 6 && + start[1] < 4 && + FT_PEEK_ULONG_LE( start + 2 ) == stream->size ) + error = T1_Read_PFM( t1_face, stream, fi ); + } + + if ( !error ) + { + t1_font->font_bbox = fi->FontBBox; + + t1_face->bbox.xMin = fi->FontBBox.xMin >> 16; + t1_face->bbox.yMin = fi->FontBBox.yMin >> 16; + t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFFU ) >> 16; + t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFFU ) >> 16; + + t1_face->ascender = (FT_Short)( ( fi->Ascender + 0x8000U ) >> 16 ); + t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000U ) >> 16 ); + + if ( fi->NumKernPair ) + { + t1_face->face_flags |= FT_FACE_FLAG_KERNING; + ( (T1_Face)t1_face )->afm_data = fi; + fi = NULL; + } + } + + FT_FRAME_EXIT(); + + Exit: + if ( fi != NULL ) + T1_Done_Metrics( memory, fi ); + + return error; + } + + + /* find the kerning for a given glyph pair */ + FT_LOCAL_DEF( void ) + T1_Get_Kerning( AFM_FontInfo fi, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + AFM_KernPair min, mid, max; + FT_ULong idx = KERN_INDEX( glyph1, glyph2 ); + + + /* simple binary search */ + min = fi->KernPairs; + max = min + fi->NumKernPair - 1; + + while ( min <= max ) + { + FT_ULong midi; + + + mid = min + ( max - min ) / 2; + midi = KERN_INDEX( mid->index1, mid->index2 ); + + if ( midi == idx ) + { + kerning->x = mid->x; + kerning->y = mid->y; + + return; + } + + if ( midi < idx ) + min = mid + 1; + else + max = mid - 1; + } + + kerning->x = 0; + kerning->y = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Track_Kerning( FT_Face face, + FT_Fixed ptsize, + FT_Int degree, + FT_Fixed* kerning ) + { + AFM_FontInfo fi = (AFM_FontInfo)( (T1_Face)face )->afm_data; + FT_Int i; + + + if ( !fi ) + return T1_Err_Invalid_Argument; + + for ( i = 0; i < fi->NumTrackKern; i++ ) + { + AFM_TrackKern tk = fi->TrackKerns + i; + + + if ( tk->degree != degree ) + continue; + + if ( ptsize < tk->min_ptsize ) + *kerning = tk->min_kern; + else if ( ptsize > tk->max_ptsize ) + *kerning = tk->max_kern; + else + { + *kerning = FT_MulDiv( ptsize - tk->min_ptsize, + tk->max_kern - tk->min_kern, + tk->max_ptsize - tk->min_ptsize ) + + tk->min_kern; + } + } + + return T1_Err_Ok; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1afm.h b/src/3rdparty/freetype/src/type1/t1afm.h new file mode 100644 index 0000000000..8eb1764de7 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1afm.h @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* t1afm.h */ +/* */ +/* AFM support for Type 1 fonts (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1AFM_H__ +#define __T1AFM_H__ + +#include +#include "t1objs.h" +#include FT_INTERNAL_TYPE1_TYPES_H + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + T1_Read_Metrics( FT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + T1_Done_Metrics( FT_Memory memory, + AFM_FontInfo fi ); + + FT_LOCAL( void ) + T1_Get_Kerning( AFM_FontInfo fi, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + FT_LOCAL( FT_Error ) + T1_Get_Track_Kerning( FT_Face face, + FT_Fixed ptsize, + FT_Int degree, + FT_Fixed* kerning ); + +FT_END_HEADER + +#endif /* __T1AFM_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1driver.c b/src/3rdparty/freetype/src/type1/t1driver.c new file mode 100644 index 0000000000..8c398eee22 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1driver.c @@ -0,0 +1,331 @@ +/***************************************************************************/ +/* */ +/* t1driver.c */ +/* */ +/* Type 1 driver interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include "t1driver.h" +#include "t1gload.h" +#include "t1load.h" + +#include "t1errors.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.h" +#endif + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_KERNING_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1driver + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + t1_get_glyph_name( T1_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); + + return T1_Err_Ok; + } + + + static FT_UInt + t1_get_name_index( T1_Face face, + FT_String* glyph_name ) + { + FT_Int i; + FT_String* gname; + + + for ( i = 0; i < face->type1.num_glyphs; i++ ) + { + gname = face->type1.glyph_names[i]; + + if ( !ft_strcmp( glyph_name, gname ) ) + return (FT_UInt)i; + } + + return 0; + } + + + static const FT_Service_GlyphDictRec t1_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) t1_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)t1_get_name_index + }; + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + t1_get_ps_name( T1_Face face ) + { + return (const char*) face->type1.font_name; + } + + + static const FT_Service_PsFontNameRec t1_service_ps_name = + { + (FT_PsName_GetFunc)t1_get_ps_name + }; + + + /* + * MULTIPLE MASTERS SERVICE + * + */ + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + static const FT_Service_MultiMastersRec t1_service_multi_masters = + { + (FT_Get_MM_Func) T1_Get_Multi_Master, + (FT_Set_MM_Design_Func) T1_Set_MM_Design, + (FT_Set_MM_Blend_Func) T1_Set_MM_Blend, + (FT_Get_MM_Var_Func) T1_Get_MM_Var, + (FT_Set_Var_Design_Func)T1_Set_Var_Design + }; +#endif + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + t1_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((T1_Face)face)->type1.font_info; + + return T1_Err_Ok; + } + + + static FT_Error + t1_ps_get_font_extra( FT_Face face, + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ((T1_Face)face)->type1.font_extra; + + return T1_Err_Ok; + } + + + static FT_Int + t1_ps_has_glyph_names( FT_Face face ) + { + FT_UNUSED( face ); + + return 1; + } + + + static FT_Error + t1_ps_get_font_private( FT_Face face, + PS_PrivateRec* afont_private ) + { + *afont_private = ((T1_Face)face)->type1.private_dict; + + return T1_Err_Ok; + } + + + static const FT_Service_PsInfoRec t1_service_ps_info = + { + (PS_GetFontInfoFunc) t1_ps_get_font_info, + (PS_GetFontExtraFunc) t1_ps_get_font_extra, + (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names, + (PS_GetFontPrivateFunc)t1_ps_get_font_private, + }; + + +#ifndef T1_CONFIG_OPTION_NO_AFM + static const FT_Service_KerningRec t1_service_kerning = + { + T1_Get_Track_Kerning, + }; +#endif + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec t1_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name }, + { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_1 }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info }, + +#ifndef T1_CONFIG_OPTION_NO_AFM + { FT_SERVICE_ID_KERNING, &t1_service_kerning }, +#endif + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters }, +#endif + { NULL, NULL } + }; + + + static FT_Module_Interface + Get_Interface( FT_Driver driver, + const FT_String* t1_interface ) + { + FT_UNUSED( driver ); + + return ft_service_list_lookup( t1_services, t1_interface ); + } + + +#ifndef T1_CONFIG_OPTION_NO_AFM + + /*************************************************************************/ + /* */ + /* */ + /* Get_Kerning */ + /* */ + /* */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + static FT_Error + Get_Kerning( T1_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + kerning->x = 0; + kerning->y = 0; + + if ( face->afm_data ) + T1_Get_Kerning( (AFM_FontInfo)face->afm_data, + left_glyph, + right_glyph, + kerning ); + + return T1_Err_Ok; + } + + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec t1_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof( FT_DriverRec ), + + "type1", + 0x10000L, + 0x20000L, + + 0, /* format interface */ + + (FT_Module_Constructor)T1_Driver_Init, + (FT_Module_Destructor) T1_Driver_Done, + (FT_Module_Requester) Get_Interface, + }, + + sizeof( T1_FaceRec ), + sizeof( T1_SizeRec ), + sizeof( T1_GlyphSlotRec ), + + (FT_Face_InitFunc) T1_Face_Init, + (FT_Face_DoneFunc) T1_Face_Done, + (FT_Size_InitFunc) T1_Size_Init, + (FT_Size_DoneFunc) T1_Size_Done, + (FT_Slot_InitFunc) T1_GlyphSlot_Init, + (FT_Slot_DoneFunc) T1_GlyphSlot_Done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + (FT_Slot_LoadFunc) T1_Load_Glyph, + +#ifdef T1_CONFIG_OPTION_NO_AFM + (FT_Face_GetKerningFunc) 0, + (FT_Face_AttachFunc) 0, +#else + (FT_Face_GetKerningFunc) Get_Kerning, + (FT_Face_AttachFunc) T1_Read_Metrics, +#endif + (FT_Face_GetAdvancesFunc) T1_Get_Advances, + (FT_Size_RequestFunc) T1_Size_Request, + (FT_Size_SelectFunc) 0 + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1driver.h b/src/3rdparty/freetype/src/type1/t1driver.h new file mode 100644 index 0000000000..ad429440de --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1driver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* t1driver.h */ +/* */ +/* High-level Type 1 driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1DRIVER_H__ +#define __T1DRIVER_H__ + + +#include +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) t1_driver_class; + + +FT_END_HEADER + +#endif /* __T1DRIVER_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1errors.h b/src/3rdparty/freetype/src/type1/t1errors.h new file mode 100644 index 0000000000..81221c343d --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1errors.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* t1errors.h */ +/* */ +/* Type 1 error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Type 1 error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __T1ERRORS_H__ +#define __T1ERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX T1_Err_ +#define FT_ERR_BASE FT_Mod_Err_Type1 + +#include FT_ERRORS_H + +#endif /* __T1ERRORS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1gload.c b/src/3rdparty/freetype/src/type1/t1gload.c new file mode 100644 index 0000000000..c3ac13f59f --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1gload.c @@ -0,0 +1,489 @@ +/***************************************************************************/ +/* */ +/* t1gload.c */ +/* */ +/* Type 1 Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include "t1gload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_OUTLINE_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "t1errors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1gload + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + T1_Parse_Glyph_And_Get_Char_String( T1_Decoder decoder, + FT_UInt glyph_index, + FT_Data* char_string ) + { + T1_Face face = (T1_Face)decoder->builder.face; + T1_Font type1 = &face->type1; + FT_Error error = T1_Err_Ok; + + + decoder->font_matrix = type1->font_matrix; + decoder->font_offset = type1->font_offset; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, char_string ); + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* For ordinary fonts get the character data stored in the face record. */ + { + char_string->pointer = type1->charstrings[glyph_index]; + char_string->length = (FT_Int)type1->charstrings_len[glyph_index]; + } + + if ( !error ) + error = decoder->funcs.parse_charstrings( + decoder, (FT_Byte*)char_string->pointer, + char_string->length ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = decoder->builder.left_bearing.x; + metrics.bearing_y = decoder->builder.left_bearing.y; + metrics.advance = decoder->builder.advance.x; + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + decoder->builder.left_bearing.x = metrics.bearing_x; + decoder->builder.left_bearing.y = metrics.bearing_y; + decoder->builder.advance.x = metrics.advance; + decoder->builder.advance.y = 0; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + T1_Parse_Glyph( T1_Decoder decoder, + FT_UInt glyph_index ) + { + FT_Data glyph_data; + FT_Error error = T1_Parse_Glyph_And_Get_Char_String( + decoder, glyph_index, &glyph_data ); + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( !error ) + { + T1_Face face = (T1_Face)decoder->builder.face; + + + if ( face->root.internal->incremental_interface ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Compute_Max_Advance( T1_Face face, + FT_Pos* max_advance ) + { + FT_Error error; + T1_DecoderRec decoder; + FT_Int glyph_index; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + *max_advance = 0; + + /* initialize load decoder */ + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + (FT_Byte**)type1->glyph_names, + face->blend, + 0, + FT_RENDER_MODE_NORMAL, + T1_Parse_Glyph ); + if ( error ) + return error; + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + *max_advance = 0; + + /* for each glyph, parse the glyph charstring and extract */ + /* the advance width */ + for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ ) + { + /* now get load the unscaled outline */ + error = T1_Parse_Glyph( &decoder, glyph_index ); + if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance ) + *max_advance = decoder.builder.advance.x; + + /* ignore the error if one occurred - skip to next glyph */ + } + + psaux->t1_decoder_funcs->done( &decoder ); + + return T1_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Advances( T1_Face face, + FT_UInt first, + FT_UInt count, + FT_ULong load_flags, + FT_Fixed* advances ) + { + T1_DecoderRec decoder; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + FT_UInt nn; + FT_Error error; + + FT_UNUSED( load_flags ); + + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + for ( nn = 0; nn < count; nn++ ) + advances[nn] = 0; + + return T1_Err_Ok; + } + + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + (FT_Byte**)type1->glyph_names, + face->blend, + 0, + FT_RENDER_MODE_NORMAL, + T1_Parse_Glyph ); + if ( error ) + return error; + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + for ( nn = 0; nn < count; nn++ ) + { + error = T1_Parse_Glyph( &decoder, first + nn ); + if ( !error ) + advances[nn] = decoder.builder.advance.x; + else + advances[nn] = 0; + } + + return T1_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Load_Glyph( T1_GlyphSlot glyph, + T1_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + T1_DecoderRec decoder; + T1_Face face = (T1_Face)glyph->root.face; + FT_Bool hinting; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + const T1_Decoder_Funcs decoder_funcs = psaux->t1_decoder_funcs; + + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_Data glyph_data; + FT_Bool must_finish_decoder = FALSE; +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Bool glyph_data_loaded = 0; +#endif + + + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = T1_Err_Invalid_Argument; + goto Exit; + } + + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + if ( size ) + { + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; + } + else + { + glyph->x_scale = 0x10000L; + glyph->y_scale = 0x10000L; + } + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + error = decoder_funcs->init( &decoder, + (FT_Face)face, + (FT_Size)size, + (FT_GlyphSlot)glyph, + (FT_Byte**)type1->glyph_names, + face->blend, + FT_BOOL( hinting ), + FT_LOAD_TARGET_MODE( load_flags ), + T1_Parse_Glyph ); + if ( error ) + goto Exit; + + must_finish_decoder = TRUE; + + decoder.builder.no_recurse = FT_BOOL( + ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ); + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + /* now load the unscaled outline */ + error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index, + &glyph_data ); + if ( error ) + goto Exit; +#ifdef FT_CONFIG_OPTION_INCREMENTAL + glyph_data_loaded = 1; +#endif + + font_matrix = decoder.font_matrix; + font_offset = decoder.font_offset; + + /* save new glyph tables */ + decoder_funcs->done( &decoder ); + + must_finish_decoder = FALSE; + + /* now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax */ + if ( !error ) + { + glyph->root.outline.flags &= FT_OUTLINE_OWNER; + glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* for composite glyphs, return only left side bearing and */ + /* advance width */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = glyph->root.internal; + + + glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; + glyph->root.metrics.horiAdvance = decoder.builder.advance.x; + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &glyph->root.metrics; + FT_Vector advance; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = decoder.builder.advance.x; + glyph->root.linearHoriAdvance = decoder.builder.advance.x; + glyph->root.internal->glyph_transformed = 0; + + /* make up vertical ones */ + metrics->vertAdvance = ( face->type1.font_bbox.yMax - + face->type1.font_bbox.yMin ) >> 16; + glyph->root.linearVertAdvance = metrics->vertAdvance; + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; + +#if 1 + /* apply the font matrix, if any */ + if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx || + font_matrix.xy != 0 || font_matrix.yx != 0 ) + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + if ( font_offset.x || font_offset.y ) + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, + font_offset.y ); + + advance.x = metrics->horiAdvance; + advance.y = 0; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->horiAdvance = advance.x + font_offset.x; + advance.x = 0; + advance.y = metrics->vertAdvance; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->vertAdvance = advance.y + font_offset.y; +#endif + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = decoder.builder.base; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points, if we are not hinting */ + if ( !hinting || ! decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + /* make up vertical ones */ + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + + /* Set control data to the glyph charstrings. Note that this is */ + /* _not_ zero-terminated. */ + glyph->root.control_data = (FT_Byte*)glyph_data.pointer; + glyph->root.control_len = glyph_data.length; + } + + + Exit: + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_data_loaded && face->root.internal->incremental_interface ) + { + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + + /* Set the control data to null - it is no longer available if */ + /* loaded incrementally. */ + glyph->root.control_data = 0; + glyph->root.control_len = 0; + } +#endif + + if ( must_finish_decoder ) + decoder_funcs->done( &decoder ); + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1gload.h b/src/3rdparty/freetype/src/type1/t1gload.h new file mode 100644 index 0000000000..100df06e8e --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1gload.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* t1gload.h */ +/* */ +/* Type 1 Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1GLOAD_H__ +#define __T1GLOAD_H__ + + +#include +#include "t1objs.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + T1_Compute_Max_Advance( T1_Face face, + FT_Pos* max_advance ); + + FT_LOCAL( FT_Error ) + T1_Get_Advances( T1_Face face, + FT_UInt first, + FT_UInt count, + FT_ULong load_flags, + FT_Fixed* advances ); + + FT_LOCAL( FT_Error ) + T1_Load_Glyph( T1_GlyphSlot glyph, + T1_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __T1GLOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1load.c b/src/3rdparty/freetype/src/type1/t1load.c new file mode 100644 index 0000000000..06e72cca68 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1load.c @@ -0,0 +1,2245 @@ +/***************************************************************************/ +/* */ +/* t1load.c */ +/* */ +/* Type 1 font loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is the new and improved Type 1 data loader for FreeType 2. The */ + /* old loader has several problems: it is slow, complex, difficult to */ + /* maintain, and contains incredible hacks to make it accept some */ + /* ill-formed Type 1 fonts without hiccup-ing. Moreover, about 5% of */ + /* the Type 1 fonts on my machine still aren't loaded correctly by it. */ + /* */ + /* This version is much simpler, much faster and also easier to read and */ + /* maintain by a great order of magnitude. The idea behind it is to */ + /* _not_ try to read the Type 1 token stream with a state machine (i.e. */ + /* a Postscript-like interpreter) but rather to perform simple pattern */ + /* matching. */ + /* */ + /* Indeed, nearly all data definitions follow a simple pattern like */ + /* */ + /* ... /Field ... */ + /* */ + /* where can be a number, a boolean, a string, or an array of */ + /* numbers. There are a few exceptions, namely the encoding, font name, */ + /* charstrings, and subrs; they are handled with a special pattern */ + /* matching routine. */ + /* */ + /* All other common cases are handled very simply. The matching rules */ + /* are defined in the file `t1tokens.h' through the use of several */ + /* macros calls PARSE_XXX. This file is included twice here; the first */ + /* time to generate parsing callback functions, the second time to */ + /* generate a table of keywords (with pointers to the associated */ + /* callback functions). */ + /* */ + /* The function `parse_dict' simply scans *linearly* a given dictionary */ + /* (either the top-level or private one) and calls the appropriate */ + /* callback when it encounters an immediate keyword. */ + /* */ + /* This is by far the fastest way one can find to parse and read all */ + /* data. */ + /* */ + /* This led to tremendous code size reduction. Note that later, the */ + /* glyph loader will also be _greatly_ simplified, and the automatic */ + /* hinter will replace the clumsy `t1hinter'. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_TYPE1_TYPES_H + +#include "t1load.h" +#include "t1errors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1load + + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MULTIPLE MASTERS SUPPORT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + t1_allocate_blend( T1_Face face, + FT_UInt num_designs, + FT_UInt num_axis ) + { + PS_Blend blend; + FT_Memory memory = face->root.memory; + FT_Error error = T1_Err_Ok; + + + blend = face->blend; + if ( !blend ) + { + if ( FT_NEW( blend ) ) + goto Exit; + + blend->num_default_design_vector = 0; + + face->blend = blend; + } + + /* allocate design data if needed */ + if ( num_designs > 0 ) + { + if ( blend->num_designs == 0 ) + { + FT_UInt nn; + + + /* allocate the blend `private' and `font_info' dictionaries */ + if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs ) || + FT_NEW_ARRAY( blend->privates[1], num_designs ) || + FT_NEW_ARRAY( blend->bboxes[1], num_designs ) || + FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) ) + goto Exit; + + blend->default_weight_vector = blend->weight_vector + num_designs; + + blend->font_infos[0] = &face->type1.font_info; + blend->privates [0] = &face->type1.private_dict; + blend->bboxes [0] = &face->type1.font_bbox; + + for ( nn = 2; nn <= num_designs; nn++ ) + { + blend->privates[nn] = blend->privates [nn - 1] + 1; + blend->font_infos[nn] = blend->font_infos[nn - 1] + 1; + blend->bboxes[nn] = blend->bboxes [nn - 1] + 1; + } + + blend->num_designs = num_designs; + } + else if ( blend->num_designs != num_designs ) + goto Fail; + } + + /* allocate axis data if needed */ + if ( num_axis > 0 ) + { + if ( blend->num_axis != 0 && blend->num_axis != num_axis ) + goto Fail; + + blend->num_axis = num_axis; + } + + /* allocate the blend design pos table if needed */ + num_designs = blend->num_designs; + num_axis = blend->num_axis; + if ( num_designs && num_axis && blend->design_pos[0] == 0 ) + { + FT_UInt n; + + + if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) ) + goto Exit; + + for ( n = 1; n < num_designs; n++ ) + blend->design_pos[n] = blend->design_pos[0] + num_axis * n; + } + + Exit: + return error; + + Fail: + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Multi_Master( T1_Face face, + FT_Multi_Master* master ) + { + PS_Blend blend = face->blend; + FT_UInt n; + FT_Error error; + + + error = T1_Err_Invalid_Argument; + + if ( blend ) + { + master->num_axis = blend->num_axis; + master->num_designs = blend->num_designs; + + for ( n = 0; n < blend->num_axis; n++ ) + { + FT_MM_Axis* axis = master->axis + n; + PS_DesignMap map = blend->design_map + n; + + + axis->name = blend->axis_names[n]; + axis->minimum = map->design_points[0]; + axis->maximum = map->design_points[map->num_points - 1]; + } + + error = T1_Err_Ok; + } + + return error; + } + + +#define FT_INT_TO_FIXED( a ) ( (a) << 16 ) +#define FT_FIXED_TO_INT( a ) ( FT_RoundFix( a ) >> 16 ) + + + /*************************************************************************/ + /* */ + /* Given a normalized (blend) coordinate, figure out the design */ + /* coordinate appropriate for that value. */ + /* */ + FT_LOCAL_DEF( FT_Fixed ) + mm_axis_unmap( PS_DesignMap axismap, + FT_Fixed ncv ) + { + int j; + + + if ( ncv <= axismap->blend_points[0] ) + return FT_INT_TO_FIXED( axismap->design_points[0] ); + + for ( j = 1; j < axismap->num_points; ++j ) + { + if ( ncv <= axismap->blend_points[j] ) + { + FT_Fixed t = FT_MulDiv( ncv - axismap->blend_points[j - 1], + 0x10000L, + axismap->blend_points[j] - + axismap->blend_points[j - 1] ); + + return FT_INT_TO_FIXED( axismap->design_points[j - 1] ) + + FT_MulDiv( t, + axismap->design_points[j] - + axismap->design_points[j - 1], + 1L ); + } + } + + return FT_INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] ); + } + + + /*************************************************************************/ + /* */ + /* Given a vector of weights, one for each design, figure out the */ + /* normalized axis coordinates which gave rise to those weights. */ + /* */ + FT_LOCAL_DEF( void ) + mm_weights_unmap( FT_Fixed* weights, + FT_Fixed* axiscoords, + FT_UInt axis_count ) + { + FT_ASSERT( axis_count <= T1_MAX_MM_AXIS ); + + if ( axis_count == 1 ) + axiscoords[0] = weights[1]; + + else if ( axis_count == 2 ) + { + axiscoords[0] = weights[3] + weights[1]; + axiscoords[1] = weights[3] + weights[2]; + } + + else if ( axis_count == 3 ) + { + axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1]; + axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2]; + axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4]; + } + + else + { + axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] + + weights[7] + weights[5] + weights[3] + weights[1]; + axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] + + weights[7] + weights[6] + weights[3] + weights[2]; + axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] + + weights[7] + weights[6] + weights[5] + weights[4]; + axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] + + weights[11] + weights[10] + weights[9] + weights[8]; + } + } + + + /*************************************************************************/ + /* */ + /* Just a wrapper around T1_Get_Multi_Master to support the different */ + /* arguments needed by the GX var distortable fonts. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_Var( T1_Face face, + FT_MM_Var* *master ) + { + FT_Memory memory = face->root.memory; + FT_MM_Var *mmvar; + FT_Multi_Master mmaster; + FT_Error error; + FT_UInt i; + FT_Fixed axiscoords[T1_MAX_MM_AXIS]; + PS_Blend blend = face->blend; + + + error = T1_Get_Multi_Master( face, &mmaster ); + if ( error ) + goto Exit; + if ( FT_ALLOC( mmvar, + sizeof ( FT_MM_Var ) + + mmaster.num_axis * sizeof ( FT_Var_Axis ) ) ) + goto Exit; + + mmvar->num_axis = mmaster.num_axis; + mmvar->num_designs = mmaster.num_designs; + mmvar->num_namedstyles = (FT_UInt)-1; /* Does not apply */ + mmvar->axis = (FT_Var_Axis*)&mmvar[1]; + /* Point to axes after MM_Var struct */ + mmvar->namedstyle = NULL; + + for ( i = 0 ; i < mmaster.num_axis; ++i ) + { + mmvar->axis[i].name = mmaster.axis[i].name; + mmvar->axis[i].minimum = FT_INT_TO_FIXED( mmaster.axis[i].minimum); + mmvar->axis[i].maximum = FT_INT_TO_FIXED( mmaster.axis[i].maximum); + mmvar->axis[i].def = ( mmvar->axis[i].minimum + + mmvar->axis[i].maximum ) / 2; + /* Does not apply. But this value is in range */ + mmvar->axis[i].strid = (FT_UInt)-1; /* Does not apply */ + mmvar->axis[i].tag = (FT_ULong)-1; /* Does not apply */ + + if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' ); + else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' ); + else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' ); + } + + if ( blend->num_designs == ( 1U << blend->num_axis ) ) + { + mm_weights_unmap( blend->default_weight_vector, + axiscoords, + blend->num_axis ); + + for ( i = 0; i < mmaster.num_axis; ++i ) + mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i], + axiscoords[i] ); + } + + *master = mmvar; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Set_MM_Blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + PS_Blend blend = face->blend; + FT_Error error; + FT_UInt n, m; + + + error = T1_Err_Invalid_Argument; + + if ( blend && blend->num_axis == num_coords ) + { + /* recompute the weight vector from the blend coordinates */ + error = T1_Err_Ok; + + for ( n = 0; n < blend->num_designs; n++ ) + { + FT_Fixed result = 0x10000L; /* 1.0 fixed */ + + + for ( m = 0; m < blend->num_axis; m++ ) + { + FT_Fixed factor; + + + /* get current blend axis position */ + factor = coords[m]; + if ( factor < 0 ) factor = 0; + if ( factor > 0x10000L ) factor = 0x10000L; + + if ( ( n & ( 1 << m ) ) == 0 ) + factor = 0x10000L - factor; + + result = FT_MulFix( result, factor ); + } + blend->weight_vector[n] = result; + } + + error = T1_Err_Ok; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Set_MM_Design( T1_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + PS_Blend blend = face->blend; + FT_Error error; + FT_UInt n, p; + + + error = T1_Err_Invalid_Argument; + if ( blend && blend->num_axis == num_coords ) + { + /* compute the blend coordinates through the blend design map */ + FT_Fixed final_blends[T1_MAX_MM_DESIGNS]; + + + for ( n = 0; n < blend->num_axis; n++ ) + { + FT_Long design = coords[n]; + FT_Fixed the_blend; + PS_DesignMap map = blend->design_map + n; + FT_Long* designs = map->design_points; + FT_Fixed* blends = map->blend_points; + FT_Int before = -1, after = -1; + + + for ( p = 0; p < (FT_UInt)map->num_points; p++ ) + { + FT_Long p_design = designs[p]; + + + /* exact match? */ + if ( design == p_design ) + { + the_blend = blends[p]; + goto Found; + } + + if ( design < p_design ) + { + after = p; + break; + } + + before = p; + } + + /* now interpolate if necessary */ + if ( before < 0 ) + the_blend = blends[0]; + + else if ( after < 0 ) + the_blend = blends[map->num_points - 1]; + + else + the_blend = FT_MulDiv( design - designs[before], + blends [after] - blends [before], + designs[after] - designs[before] ); + + Found: + final_blends[n] = the_blend; + } + + error = T1_Set_MM_Blend( face, num_coords, final_blends ); + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* Just a wrapper around T1_Set_MM_Design to support the different */ + /* arguments needed by the GX var distortable fonts. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Set_Var_Design( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Long lcoords[4]; /* maximum axis count is 4 */ + FT_UInt i; + FT_Error error; + + + error = T1_Err_Invalid_Argument; + if ( num_coords <= 4 && num_coords > 0 ) + { + for ( i = 0; i < num_coords; ++i ) + lcoords[i] = FT_FIXED_TO_INT( coords[i] ); + error = T1_Set_MM_Design( face, num_coords, lcoords ); + } + + return error; + } + + + FT_LOCAL_DEF( void ) + T1_Done_Blend( T1_Face face ) + { + FT_Memory memory = face->root.memory; + PS_Blend blend = face->blend; + + + if ( blend ) + { + FT_UInt num_designs = blend->num_designs; + FT_UInt num_axis = blend->num_axis; + FT_UInt n; + + + /* release design pos table */ + FT_FREE( blend->design_pos[0] ); + for ( n = 1; n < num_designs; n++ ) + blend->design_pos[n] = 0; + + /* release blend `private' and `font info' dictionaries */ + FT_FREE( blend->privates[1] ); + FT_FREE( blend->font_infos[1] ); + FT_FREE( blend->bboxes[1] ); + + for ( n = 0; n < num_designs; n++ ) + { + blend->privates [n] = 0; + blend->font_infos[n] = 0; + blend->bboxes [n] = 0; + } + + /* release weight vectors */ + FT_FREE( blend->weight_vector ); + blend->default_weight_vector = 0; + + /* release axis names */ + for ( n = 0; n < num_axis; n++ ) + FT_FREE( blend->axis_names[n] ); + + /* release design map */ + for ( n = 0; n < num_axis; n++ ) + { + PS_DesignMap dmap = blend->design_map + n; + + + FT_FREE( dmap->design_points ); + dmap->num_points = 0; + } + + FT_FREE( face->blend ); + } + } + + + static void + parse_blend_axis_types( T1_Face face, + T1_Loader loader ) + { + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + FT_Int n, num_axis; + FT_Error error = T1_Err_Ok; + PS_Blend blend; + FT_Memory memory; + + + /* take an array of objects */ + T1_ToTokenArray( &loader->parser, axis_tokens, + T1_MAX_MM_AXIS, &num_axis ); + if ( num_axis < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n", + num_axis )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + /* allocate blend if necessary */ + error = t1_allocate_blend( face, 0, (FT_UInt)num_axis ); + if ( error ) + goto Exit; + + blend = face->blend; + memory = face->root.memory; + + /* each token is an immediate containing the name of the axis */ + for ( n = 0; n < num_axis; n++ ) + { + T1_Token token = axis_tokens + n; + FT_Byte* name; + FT_PtrDist len; + + + /* skip first slash, if any */ + if ( token->start[0] == '/' ) + token->start++; + + len = token->limit - token->start; + if ( len == 0 ) + { + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_ALLOC( blend->axis_names[n], len + 1 ) ) + goto Exit; + + name = (FT_Byte*)blend->axis_names[n]; + FT_MEM_COPY( name, token->start, len ); + name[len] = 0; + } + + Exit: + loader->parser.root.error = error; + } + + + static void + parse_blend_design_positions( T1_Face face, + T1_Loader loader ) + { + T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; + FT_Int num_designs; + FT_Int num_axis; + T1_Parser parser = &loader->parser; + + FT_Error error = T1_Err_Ok; + PS_Blend blend; + + + /* get the array of design tokens -- compute number of designs */ + T1_ToTokenArray( parser, design_tokens, + T1_MAX_MM_DESIGNS, &num_designs ); + if ( num_designs < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) + { + FT_ERROR(( "parse_blend_design_positions:" )); + FT_ERROR(( " incorrect number of designs: %d\n", + num_designs )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + { + FT_Byte* old_cursor = parser->root.cursor; + FT_Byte* old_limit = parser->root.limit; + FT_Int n; + + + blend = face->blend; + num_axis = 0; /* make compiler happy */ + + for ( n = 0; n < num_designs; n++ ) + { + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + T1_Token token; + FT_Int axis, n_axis; + + + /* read axis/coordinates tokens */ + token = design_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; + T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis ); + + if ( n == 0 ) + { + if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_design_positions:" )); + FT_ERROR(( " invalid number of axes: %d\n", + n_axis )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + num_axis = n_axis; + error = t1_allocate_blend( face, num_designs, num_axis ); + if ( error ) + goto Exit; + blend = face->blend; + } + else if ( n_axis != num_axis ) + { + FT_ERROR(( "parse_blend_design_positions: incorrect table\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + /* now read each axis token into the design position */ + for ( axis = 0; axis < n_axis; axis++ ) + { + T1_Token token2 = axis_tokens + axis; + + + parser->root.cursor = token2->start; + parser->root.limit = token2->limit; + blend->design_pos[n][axis] = T1_ToFixed( parser, 0 ); + } + } + + loader->parser.root.cursor = old_cursor; + loader->parser.root.limit = old_limit; + } + + Exit: + loader->parser.root.error = error; + } + + + static void + parse_blend_design_map( T1_Face face, + T1_Loader loader ) + { + FT_Error error = T1_Err_Ok; + T1_Parser parser = &loader->parser; + PS_Blend blend; + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + FT_Int n, num_axis; + FT_Byte* old_cursor; + FT_Byte* old_limit; + FT_Memory memory = face->root.memory; + + + T1_ToTokenArray( parser, axis_tokens, + T1_MAX_MM_AXIS, &num_axis ); + if ( num_axis < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n", + num_axis )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + old_cursor = parser->root.cursor; + old_limit = parser->root.limit; + + error = t1_allocate_blend( face, 0, num_axis ); + if ( error ) + goto Exit; + blend = face->blend; + + /* now read each axis design map */ + for ( n = 0; n < num_axis; n++ ) + { + PS_DesignMap map = blend->design_map + n; + T1_Token axis_token; + T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS]; + FT_Int p, num_points; + + + axis_token = axis_tokens + n; + + parser->root.cursor = axis_token->start; + parser->root.limit = axis_token->limit; + T1_ToTokenArray( parser, point_tokens, + T1_MAX_MM_MAP_POINTS, &num_points ); + + if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS ) + { + FT_ERROR(( "parse_blend_design_map: incorrect table\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + /* allocate design map data */ + if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) ) + goto Exit; + map->blend_points = map->design_points + num_points; + map->num_points = (FT_Byte)num_points; + + for ( p = 0; p < num_points; p++ ) + { + T1_Token point_token; + + + point_token = point_tokens + p; + + /* don't include delimiting brackets */ + parser->root.cursor = point_token->start + 1; + parser->root.limit = point_token->limit - 1; + + map->design_points[p] = T1_ToInt( parser ); + map->blend_points [p] = T1_ToFixed( parser, 0 ); + } + } + + parser->root.cursor = old_cursor; + parser->root.limit = old_limit; + + Exit: + parser->root.error = error; + } + + + static void + parse_weight_vector( T1_Face face, + T1_Loader loader ) + { + T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; + FT_Int num_designs; + FT_Error error = T1_Err_Ok; + T1_Parser parser = &loader->parser; + PS_Blend blend = face->blend; + T1_Token token; + FT_Int n; + FT_Byte* old_cursor; + FT_Byte* old_limit; + + + T1_ToTokenArray( parser, design_tokens, + T1_MAX_MM_DESIGNS, &num_designs ); + if ( num_designs < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) + { + FT_ERROR(( "parse_weight_vector:" )); + FT_ERROR(( " incorrect number of designs: %d\n", + num_designs )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + if ( !blend || !blend->num_designs ) + { + error = t1_allocate_blend( face, num_designs, 0 ); + if ( error ) + goto Exit; + blend = face->blend; + } + else if ( blend->num_designs != (FT_UInt)num_designs ) + { + FT_ERROR(( "parse_weight_vector:" + " /BlendDesignPosition and /WeightVector have\n" )); + FT_ERROR(( " " + " different number of elements!\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + old_cursor = parser->root.cursor; + old_limit = parser->root.limit; + + for ( n = 0; n < num_designs; n++ ) + { + token = design_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; + + blend->default_weight_vector[n] = + blend->weight_vector[n] = T1_ToFixed( parser, 0 ); + } + + parser->root.cursor = old_cursor; + parser->root.limit = old_limit; + + Exit: + parser->root.error = error; + } + + + /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */ + /* we're only interested in the number of array elements */ + static void + parse_buildchar( T1_Face face, + T1_Loader loader ) + { + face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 ); + + return; + } + + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 SYMBOL PARSING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + t1_load_keyword( T1_Face face, + T1_Loader loader, + const T1_Field field ) + { + FT_Error error; + void* dummy_object; + void** objects; + FT_UInt max_objects; + PS_Blend blend = face->blend; + + + /* if the keyword has a dedicated callback, call it */ + if ( field->type == T1_FIELD_TYPE_CALLBACK ) + { + field->reader( (FT_Face)face, loader ); + error = loader->parser.root.error; + goto Exit; + } + + /* now, the keyword is either a simple field, or a table of fields; */ + /* we are now going to take care of it */ + switch ( field->location ) + { + case T1_FIELD_LOCATION_FONT_INFO: + dummy_object = &face->type1.font_info; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->font_infos; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_FONT_EXTRA: + dummy_object = &face->type1.font_extra; + objects = &dummy_object; + max_objects = 0; + break; + + case T1_FIELD_LOCATION_PRIVATE: + dummy_object = &face->type1.private_dict; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->privates; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_BBOX: + dummy_object = &face->type1.font_bbox; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->bboxes; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_LOADER: + dummy_object = loader; + objects = &dummy_object; + max_objects = 0; + break; + + case T1_FIELD_LOCATION_FACE: + dummy_object = face; + objects = &dummy_object; + max_objects = 0; + break; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + case T1_FIELD_LOCATION_BLEND: + dummy_object = face->blend; + objects = &dummy_object; + max_objects = 0; + break; +#endif + + default: + dummy_object = &face->type1; + objects = &dummy_object; + max_objects = 0; + } + + if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || + field->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = T1_Load_Field_Table( &loader->parser, field, + objects, max_objects, 0 ); + else + error = T1_Load_Field( &loader->parser, field, + objects, max_objects, 0 ); + + Exit: + return error; + } + + + static void + parse_private( T1_Face face, + T1_Loader loader ) + { + FT_UNUSED( face ); + + loader->keywords_encountered |= T1_PRIVATE; + } + + + static int + read_binary_data( T1_Parser parser, + FT_Long* size, + FT_Byte** base ) + { + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + + /* the binary data has one of the following formats */ + /* */ + /* `size' [white*] RD white ....... ND */ + /* `size' [white*] -| white ....... |- */ + /* */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + + if ( cur < limit && ft_isdigit( *cur ) ) + { + *size = T1_ToInt( parser ); + + T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */ + + /* there is only one whitespace char after the */ + /* `RD' or `-|' token */ + *base = parser->root.cursor + 1; + + parser->root.cursor += *size + 1; + return !parser->root.error; + } + + FT_ERROR(( "read_binary_data: invalid size field\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return 0; + } + + + /* We now define the routines to handle the `/Encoding', `/Subrs', */ + /* and `/CharStrings' dictionaries. */ + + static void + parse_font_matrix( T1_Face face, + T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + FT_Matrix* matrix = &face->type1.font_matrix; + FT_Vector* offset = &face->type1.font_offset; + FT_Face root = (FT_Face)&face->root; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + FT_Int result; + + + result = T1_ToFixedArray( parser, 6, temp, 3 ); + + if ( result < 0 ) + { + parser->root.error = T1_Err_Invalid_File_Format; + return; + } + + temp_scale = FT_ABS( temp[3] ); + + if ( temp_scale == 0 ) + { + FT_ERROR(( "parse_font_matrix: invalid font matrix\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return; + } + + /* Set Units per EM based on FontMatrix values. We set the value to */ + /* 1000 / temp_scale, because temp_scale was already multiplied by */ + /* 1000 (in t1_tofixed, from psobjs.c). */ + + root->units_per_EM = (FT_UShort)( FT_DivFix( 1000 * 0x10000L, + temp_scale ) >> 16 ); + + /* we need to scale the values by 1.0/temp_scale */ + if ( temp_scale != 0x10000L ) + { + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = 0x10000L; + } + + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + /* note that the offsets must be expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + + static void + parse_encoding( T1_Face face, + T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + if ( cur >= limit ) + { + FT_ERROR(( "parse_encoding: out of bounds!\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return; + } + + /* if we have a number or `[', the encoding is an array, */ + /* and we must load it now */ + if ( ft_isdigit( *cur ) || *cur == '[' ) + { + T1_Encoding encode = &face->type1.encoding; + FT_Int count, n; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Bool only_immediates = 0; + + + /* read the number of entries in the encoding; should be 256 */ + if ( *cur == '[' ) + { + count = 256; + only_immediates = 1; + parser->root.cursor++; + } + else + count = (FT_Int)T1_ToInt( parser ); + + T1_Skip_Spaces( parser ); + if ( parser->root.cursor >= limit ) + return; + + /* we use a T1_Table to store our charnames */ + loader->num_chars = encode->num_chars = count; + if ( FT_NEW_ARRAY( encode->char_index, count ) || + FT_NEW_ARRAY( encode->char_name, count ) || + FT_SET_ERROR( psaux->ps_table_funcs->init( + char_table, count, memory ) ) ) + { + parser->root.error = error; + return; + } + + /* We need to `zero' out encoding_table.elements */ + for ( n = 0; n < count; n++ ) + { + char* notdef = (char *)".notdef"; + + + T1_Add_Table( char_table, n, notdef, 8 ); + } + + /* Now we need to read records of the form */ + /* */ + /* ... charcode /charname ... */ + /* */ + /* for each entry in our table. */ + /* */ + /* We simply look for a number followed by an immediate */ + /* name. Note that this ignores correctly the sequence */ + /* that is often seen in type1 fonts: */ + /* */ + /* 0 1 255 { 1 index exch /.notdef put } for dup */ + /* */ + /* used to clean the encoding array before anything else. */ + /* */ + /* Alternatively, if the array is directly given as */ + /* */ + /* /Encoding [ ... ] */ + /* */ + /* we only read immediates. */ + + n = 0; + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + cur = parser->root.cursor; + + /* we stop when we encounter a `def' or `]' */ + if ( *cur == 'd' && cur + 3 < limit ) + { + if ( cur[1] == 'e' && + cur[2] == 'f' && + IS_PS_DELIM( cur[3] ) ) + { + FT_TRACE6(( "encoding end\n" )); + cur += 3; + break; + } + } + if ( *cur == ']' ) + { + FT_TRACE6(( "encoding end\n" )); + cur++; + break; + } + + /* check whether we've found an entry */ + if ( ft_isdigit( *cur ) || only_immediates ) + { + FT_Int charcode; + + + if ( only_immediates ) + charcode = n; + else + { + charcode = (FT_Int)T1_ToInt( parser ); + T1_Skip_Spaces( parser ); + } + + cur = parser->root.cursor; + + if ( *cur == '/' && cur + 2 < limit && n < count ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + + len = parser->root.cursor - cur; + + parser->root.error = T1_Add_Table( char_table, charcode, + cur, len + 1 ); + if ( parser->root.error ) + return; + char_table->elements[charcode][len] = '\0'; + + n++; + } + else if ( only_immediates ) + { + /* Since the current position is not updated for */ + /* immediates-only mode we would get an infinite loop if */ + /* we don't do anything here. */ + /* */ + /* This encoding array is not valid according to the type1 */ + /* specification (it might be an encoding for a CID type1 */ + /* font, however), so we conclude that this font is NOT a */ + /* type1 font. */ + parser->root.error = FT_Err_Unknown_File_Format; + return; + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + } + + T1_Skip_Spaces( parser ); + } + + face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; + parser->root.cursor = cur; + } + + /* Otherwise, we should have either `StandardEncoding', */ + /* `ExpertEncoding', or `ISOLatin1Encoding' */ + else + { + if ( cur + 17 < limit && + ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; + + else if ( cur + 15 < limit && + ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; + + else if ( cur + 18 < limit && + ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; + + else + parser->root.error = T1_Err_Ignore; + } + } + + + static void + parse_subrs( T1_Face face, + T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + PS_Table table = &loader->subrs; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Int num_subrs; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + T1_Skip_Spaces( parser ); + + /* test for empty array */ + if ( parser->root.cursor < parser->root.limit && + *parser->root.cursor == '[' ) + { + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + if ( parser->root.cursor >= parser->root.limit || + *parser->root.cursor != ']' ) + parser->root.error = T1_Err_Invalid_File_Format; + return; + } + + num_subrs = (FT_Int)T1_ToInt( parser ); + + /* position the parser right before the `dup' of the first subr */ + T1_Skip_PS_Token( parser ); /* `array' */ + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + + /* initialize subrs array -- with synthetic fonts it is possible */ + /* we get here twice */ + if ( !loader->num_subrs ) + { + error = psaux->ps_table_funcs->init( table, num_subrs, memory ); + if ( error ) + goto Fail; + } + + /* the format is simple: */ + /* */ + /* `index' + binary data */ + /* */ + for (;;) + { + FT_Long idx, size; + FT_Byte* base; + + + /* If the next token isn't `dup' we are done. */ + if ( ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 ) + break; + + T1_Skip_PS_Token( parser ); /* `dup' */ + + idx = T1_ToInt( parser ); + + if ( !read_binary_data( parser, &size, &base ) ) + return; + + /* The binary string is followed by one token, e.g. `NP' */ + /* (bound to `noaccess put') or by two separate tokens: */ + /* `noaccess' & `put'. We position the parser right */ + /* before the next `dup', if any. */ + T1_Skip_PS_Token( parser ); /* `NP' or `|' or `noaccess' */ + if ( parser->root.error ) + return; + T1_Skip_Spaces ( parser ); + + if ( ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 ) + { + T1_Skip_PS_Token( parser ); /* skip `put' */ + T1_Skip_Spaces ( parser ); + } + + /* with synthetic fonts it is possible we get here twice */ + if ( loader->num_subrs ) + continue; + + /* some fonts use a value of -1 for lenIV to indicate that */ + /* the charstrings are unencoded */ + /* */ + /* thanks to Tom Kacvinsky for pointing this out */ + /* */ + if ( face->type1.private_dict.lenIV >= 0 ) + { + FT_Byte* temp; + + + /* some fonts define empty subr records -- this is not totally */ + /* compliant to the specification (which says they should at */ + /* least contain a `return'), but we support them anyway */ + if ( size < face->type1.private_dict.lenIV ) + { + error = T1_Err_Invalid_File_Format; + goto Fail; + } + + /* t1_decrypt() shouldn't write to base -- make temporary copy */ + if ( FT_ALLOC( temp, size ) ) + goto Fail; + FT_MEM_COPY( temp, base, size ); + psaux->t1_decrypt( temp, size, 4330 ); + size -= face->type1.private_dict.lenIV; + error = T1_Add_Table( table, (FT_Int)idx, + temp + face->type1.private_dict.lenIV, size ); + FT_FREE( temp ); + } + else + error = T1_Add_Table( table, (FT_Int)idx, base, size ); + if ( error ) + goto Fail; + } + + if ( !loader->num_subrs ) + loader->num_subrs = num_subrs; + + return; + + Fail: + parser->root.error = error; + } + + +#define TABLE_EXTEND 5 + + + static void + parse_charstrings( T1_Face face, + T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + PS_Table code_table = &loader->charstrings; + PS_Table name_table = &loader->glyph_names; + PS_Table swap_table = &loader->swap_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_Int n, num_glyphs; + FT_UInt notdef_index = 0; + FT_Byte notdef_found = 0; + + + num_glyphs = (FT_Int)T1_ToInt( parser ); + /* some fonts like Optima-Oblique not only define the /CharStrings */ + /* array but access it also */ + if ( num_glyphs == 0 || parser->root.error ) + return; + + /* initialize tables, leaving space for addition of .notdef, */ + /* if necessary, and a few other glyphs to handle buggy */ + /* fonts which have more glyphs than specified. */ + + /* for some non-standard fonts like `Optima' which provides */ + /* different outlines depending on the resolution it is */ + /* possible to get here twice */ + if ( !loader->num_glyphs ) + { + error = psaux->ps_table_funcs->init( + code_table, num_glyphs + 1 + TABLE_EXTEND, memory ); + if ( error ) + goto Fail; + + error = psaux->ps_table_funcs->init( + name_table, num_glyphs + 1 + TABLE_EXTEND, memory ); + if ( error ) + goto Fail; + + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + if ( error ) + goto Fail; + } + + n = 0; + + for (;;) + { + FT_Long size; + FT_Byte* base; + + + /* the format is simple: */ + /* `/glyphname' + binary data */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + if ( cur >= limit ) + break; + + /* we stop when we find a `def' or `end' keyword */ + if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) ) + { + if ( cur[0] == 'd' && + cur[1] == 'e' && + cur[2] == 'f' ) + { + /* There are fonts which have this: */ + /* */ + /* /CharStrings 118 dict def */ + /* Private begin */ + /* CharStrings begin */ + /* ... */ + /* */ + /* To catch this we ignore `def' if */ + /* no charstring has actually been */ + /* seen. */ + if ( n ) + break; + } + + if ( cur[0] == 'e' && + cur[1] == 'n' && + cur[2] == 'd' ) + break; + } + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + + if ( *cur == '/' ) + { + FT_PtrDist len; + + + if ( cur + 1 >= limit ) + { + error = T1_Err_Invalid_File_Format; + goto Fail; + } + + cur++; /* skip `/' */ + len = parser->root.cursor - cur; + + if ( !read_binary_data( parser, &size, &base ) ) + return; + + /* for some non-standard fonts like `Optima' which provides */ + /* different outlines depending on the resolution it is */ + /* possible to get here twice */ + if ( loader->num_glyphs ) + continue; + + error = T1_Add_Table( name_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + /* add a trailing zero to the name table */ + name_table->elements[n][len] = '\0'; + + /* record index of /.notdef */ + if ( *cur == '.' && + ft_strcmp( ".notdef", + (const char*)(name_table->elements[n]) ) == 0 ) + { + notdef_index = n; + notdef_found = 1; + } + + if ( face->type1.private_dict.lenIV >= 0 && + n < num_glyphs + TABLE_EXTEND ) + { + FT_Byte* temp; + + + if ( size <= face->type1.private_dict.lenIV ) + { + error = T1_Err_Invalid_File_Format; + goto Fail; + } + + /* t1_decrypt() shouldn't write to base -- make temporary copy */ + if ( FT_ALLOC( temp, size ) ) + goto Fail; + FT_MEM_COPY( temp, base, size ); + psaux->t1_decrypt( temp, size, 4330 ); + size -= face->type1.private_dict.lenIV; + error = T1_Add_Table( code_table, n, + temp + face->type1.private_dict.lenIV, size ); + FT_FREE( temp ); + } + else + error = T1_Add_Table( code_table, n, base, size ); + if ( error ) + goto Fail; + + n++; + } + } + + loader->num_glyphs = n; + + /* if /.notdef is found but does not occupy index 0, do our magic. */ + if ( notdef_found && + ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) ) + { + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index */ + /* name and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ + + /* Index 0 name */ + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index 0 code */ + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index notdef_index name */ + error = T1_Add_Table( swap_table, 2, + name_table->elements[notdef_index], + name_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + /* Index notdef_index code */ + error = T1_Add_Table( swap_table, 3, + code_table->elements[notdef_index], + code_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, notdef_index, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, notdef_index, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + swap_table->elements[2], + swap_table->lengths [2] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + swap_table->elements[3], + swap_table->lengths [3] ); + if ( error ) + goto Fail; + + } + else if ( !notdef_found ) + { + /* notdef_index is already 0, or /.notdef is undefined in */ + /* charstrings dictionary. Worry about /.notdef undefined. */ + /* We take index 0 and add it to the end of the table(s) */ + /* and add our own /.notdef glyph to index 0. */ + + /* 0 333 hsbw endchar */ + FT_Byte notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E }; + char* notdef_name = (char *)".notdef"; + + + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, notdef_name, 8 ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, notdef_glyph, 5 ); + + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, n, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, n, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + /* we added a glyph. */ + loader->num_glyphs += 1; + } + + return; + + Fail: + parser->root.error = error; + } + + + /*************************************************************************/ + /* */ + /* Define the token field static variables. This is a set of */ + /* T1_FieldRec variables. */ + /* */ + /*************************************************************************/ + + + static + const T1_FieldRec t1_keywords[] = + { + +#include "t1tokens.h" + + /* now add the special functions... */ + T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "Encoding", parse_encoding, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "Subrs", parse_subrs, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_CALLBACK( "CharStrings", parse_charstrings, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_CALLBACK( "Private", parse_private, + T1_FIELD_DICT_FONTDICT ) + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar, + T1_FIELD_DICT_PRIVATE ) +#endif + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + +#define T1_FIELD_COUNT \ + ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) ) + + + static FT_Error + parse_dict( T1_Face face, + T1_Loader loader, + FT_Byte* base, + FT_Long size ) + { + T1_Parser parser = &loader->parser; + FT_Byte *limit, *start_binary = NULL; + FT_Bool have_integer = 0; + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = T1_Err_Ok; + + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + FT_Byte* cur; + + + cur = parser->root.cursor; + + /* look for `eexec' */ + if ( IS_PS_TOKEN( cur, limit, "eexec" ) ) + break; + + /* look for `closefile' which ends the eexec section */ + else if ( IS_PS_TOKEN( cur, limit, "closefile" ) ) + break; + + /* in a synthetic font the base font starts after a */ + /* `FontDictionary' token that is placed after a Private dict */ + else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) ) + { + if ( loader->keywords_encountered & T1_PRIVATE ) + loader->keywords_encountered |= + T1_FONTDIR_AFTER_PRIVATE; + parser->root.cursor += 13; + } + + /* check whether we have an integer */ + else if ( ft_isdigit( *cur ) ) + { + start_binary = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + have_integer = 1; + } + + /* in valid Type 1 fonts we don't see `RD' or `-|' directly */ + /* since those tokens are handled by parse_subrs and */ + /* parse_charstrings */ + else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' && + have_integer ) + { + FT_Long s; + FT_Byte* b; + + + parser->root.cursor = start_binary; + if ( !read_binary_data( parser, &s, &b ) ) + return T1_Err_Invalid_File_Format; + have_integer = 0; + } + + else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' && + have_integer ) + { + FT_Long s; + FT_Byte* b; + + + parser->root.cursor = start_binary; + if ( !read_binary_data( parser, &s, &b ) ) + return T1_Err_Invalid_File_Format; + have_integer = 0; + } + + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) + { + /* now compare the immediate name to the keyword table */ + T1_Field keyword = (T1_Field)t1_keywords; + + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == (FT_PtrDist)ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) + { + /* We found it -- run the parsing callback! */ + /* We record every instance of every field */ + /* (until we reach the base font of a */ + /* synthetic font) to deal adequately with */ + /* multiple master fonts; this is also */ + /* necessary because later PostScript */ + /* definitions override earlier ones. */ + + /* Once we encounter `FontDirectory' after */ + /* `/Private', we know that this is a synthetic */ + /* font; except for `/CharStrings' we are not */ + /* interested in anything that follows this */ + /* `FontDirectory'. */ + + /* MM fonts have more than one /Private token at */ + /* the top level; let's hope that all the junk */ + /* that follows the first /Private token is not */ + /* interesting to us. */ + + /* According to Adobe Tech Note #5175 (CID-Keyed */ + /* Font Installation for ATM Software) a `begin' */ + /* must be followed by exactly one `end', and */ + /* `begin' -- `end' pairs must be accurately */ + /* paired. We could use this to distinguish */ + /* between the global Private and the Private */ + /* dict that is a member of the Blend dict. */ + + const FT_UInt dict = + ( loader->keywords_encountered & T1_PRIVATE ) + ? T1_FIELD_DICT_PRIVATE + : T1_FIELD_DICT_FONTDICT; + + if ( !( dict & keyword->dict ) ) + { + FT_TRACE1(( "parse_dict: found %s but ignoring it " + "since it is in the wrong dictionary\n", + keyword->ident )); + break; + } + + if ( !( loader->keywords_encountered & + T1_FONTDIR_AFTER_PRIVATE ) || + ft_strcmp( (const char*)name, "CharStrings" ) == 0 ) + { + parser->root.error = t1_load_keyword( face, + loader, + keyword ); + if ( parser->root.error != T1_Err_Ok ) + { + if ( FT_ERROR_BASE( parser->root.error ) == FT_Err_Ignore ) + parser->root.error = T1_Err_Ok; + else + return parser->root.error; + } + } + break; + } + + keyword++; + } + } + + have_integer = 0; + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + have_integer = 0; + } + + T1_Skip_Spaces( parser ); + } + + Exit: + return parser->root.error; + } + + + static void + t1_init_loader( T1_Loader loader, + T1_Face face ) + { + FT_UNUSED( face ); + + FT_MEM_ZERO( loader, sizeof ( *loader ) ); + loader->num_glyphs = 0; + loader->num_chars = 0; + + /* initialize the tables -- simply set their `init' field to 0 */ + loader->encoding_table.init = 0; + loader->charstrings.init = 0; + loader->glyph_names.init = 0; + loader->subrs.init = 0; + loader->swap_table.init = 0; + loader->fontdata = 0; + loader->keywords_encountered = 0; + } + + + static void + t1_done_loader( T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + + + /* finalize tables */ + T1_Release_Table( &loader->encoding_table ); + T1_Release_Table( &loader->charstrings ); + T1_Release_Table( &loader->glyph_names ); + T1_Release_Table( &loader->swap_table ); + T1_Release_Table( &loader->subrs ); + + /* finalize parser */ + T1_Finalize_Parser( parser ); + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Open_Face( T1_Face face ) + { + T1_LoaderRec loader; + T1_Parser parser; + T1_Font type1 = &face->type1; + PS_Private priv = &type1->private_dict; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + t1_init_loader( &loader, face ); + + /* default values */ + face->ndv_idx = -1; + face->cdv_idx = -1; + face->len_buildchar = 0; + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = 4; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + parser = &loader.parser; + error = T1_New_Parser( parser, + face->root.stream, + face->root.memory, + psaux ); + if ( error ) + goto Exit; + + error = parse_dict( face, &loader, + parser->base_dict, parser->base_len ); + if ( error ) + goto Exit; + + error = T1_Get_Private_Dict( parser, psaux ); + if ( error ) + goto Exit; + + error = parse_dict( face, &loader, + parser->private_dict, parser->private_len ); + if ( error ) + goto Exit; + + /* ensure even-ness of `num_blue_values' */ + priv->num_blue_values &= ~1; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + if ( face->blend && + face->blend->num_default_design_vector != 0 && + face->blend->num_default_design_vector != face->blend->num_axis ) + { + /* we don't use it currently so just warn, reset, and ignore */ + FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries " + "while there are %u axes.\n", + face->blend->num_default_design_vector, + face->blend->num_axis )); + + face->blend->num_default_design_vector = 0; + } + + /* the following can happen for MM instances; we then treat the */ + /* font as a normal PS font */ + if ( face->blend && + ( !face->blend->num_designs || !face->blend->num_axis ) ) + T1_Done_Blend( face ); + + /* another safety check */ + if ( face->blend ) + { + FT_UInt i; + + + for ( i = 0; i < face->blend->num_axis; i++ ) + if ( !face->blend->design_map[i].num_points ) + { + T1_Done_Blend( face ); + break; + } + } + + if ( face->blend ) + { + if ( face->len_buildchar > 0 ) + { + FT_Memory memory = face->root.memory; + + + if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) ) + { + FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" )); + face->len_buildchar = 0; + goto Exit; + } + } + } + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + /* now, propagate the subrs, charstrings, and glyphnames tables */ + /* to the Type1 data */ + type1->num_glyphs = loader.num_glyphs; + + if ( loader.subrs.init ) + { + loader.subrs.init = 0; + type1->num_subrs = loader.num_subrs; + type1->subrs_block = loader.subrs.block; + type1->subrs = loader.subrs.elements; + type1->subrs_len = loader.subrs.lengths; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( !face->root.internal->incremental_interface ) +#endif + if ( !loader.charstrings.init ) + { + FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face!\n" )); + error = T1_Err_Invalid_File_Format; + } + + loader.charstrings.init = 0; + type1->charstrings_block = loader.charstrings.block; + type1->charstrings = loader.charstrings.elements; + type1->charstrings_len = loader.charstrings.lengths; + + /* we copy the glyph names `block' and `elements' fields; */ + /* the `lengths' field must be released later */ + type1->glyph_names_block = loader.glyph_names.block; + type1->glyph_names = (FT_String**)loader.glyph_names.elements; + loader.glyph_names.block = 0; + loader.glyph_names.elements = 0; + + /* we must now build type1.encoding when we have a custom array */ + if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) + { + FT_Int charcode, idx, min_char, max_char; + FT_Byte* char_name; + FT_Byte* glyph_name; + + + /* OK, we do the following: for each element in the encoding */ + /* table, look up the index of the glyph having the same name */ + /* the index is then stored in type1.encoding.char_index, and */ + /* a the name to type1.encoding.char_name */ + + min_char = +32000; + max_char = -32000; + + charcode = 0; + for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) + { + type1->encoding.char_index[charcode] = 0; + type1->encoding.char_name [charcode] = (char *)".notdef"; + + char_name = loader.encoding_table.elements[charcode]; + if ( char_name ) + for ( idx = 0; idx < type1->num_glyphs; idx++ ) + { + glyph_name = (FT_Byte*)type1->glyph_names[idx]; + if ( ft_strcmp( (const char*)char_name, + (const char*)glyph_name ) == 0 ) + { + type1->encoding.char_index[charcode] = (FT_UShort)idx; + type1->encoding.char_name [charcode] = (char*)glyph_name; + + /* Change min/max encoded char only if glyph name is */ + /* not /.notdef */ + if ( ft_strcmp( (const char*)".notdef", + (const char*)glyph_name ) != 0 ) + { + if ( charcode < min_char ) + min_char = charcode; + if ( charcode > max_char ) + max_char = charcode; + } + break; + } + } + } + + /* + * Yes, this happens: Certain PDF-embedded fonts have only a + * `.notdef' glyph defined! + */ + + if ( min_char > max_char ) + { + min_char = 0; + max_char = loader.encoding_table.max_elems; + } + + type1->encoding.code_first = min_char; + type1->encoding.code_last = max_char; + type1->encoding.num_chars = loader.num_chars; + } + + Exit: + t1_done_loader( &loader ); + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1load.h b/src/3rdparty/freetype/src/type1/t1load.h new file mode 100644 index 0000000000..546fc33530 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1load.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* t1load.h */ +/* */ +/* Type 1 font loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1LOAD_H__ +#define __T1LOAD_H__ + + +#include +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_MULTIPLE_MASTERS_H + +#include "t1parse.h" + + +FT_BEGIN_HEADER + + + typedef struct T1_Loader_ + { + T1_ParserRec parser; /* parser used to read the stream */ + + FT_Int num_chars; /* number of characters in encoding */ + PS_TableRec encoding_table; /* PS_Table used to store the */ + /* encoding character names */ + + FT_Int num_glyphs; + PS_TableRec glyph_names; + PS_TableRec charstrings; + PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ + + FT_Int num_subrs; + PS_TableRec subrs; + FT_Bool fontdata; + + FT_UInt keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */ + + } T1_LoaderRec, *T1_Loader; + + + /* treatment of some keywords differs depending on whether */ + /* they precede or follow certain other keywords */ + +#define T1_PRIVATE ( 1 << 0 ) +#define T1_FONTDIR_AFTER_PRIVATE ( 1 << 1 ) + + + FT_LOCAL( FT_Error ) + T1_Open_Face( T1_Face face ); + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + FT_LOCAL( FT_Error ) + T1_Get_Multi_Master( T1_Face face, + FT_Multi_Master* master ); + + FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_Var( T1_Face face, + FT_MM_Var* *master ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_Blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_Design( T1_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + FT_LOCAL_DEF( FT_Error ) + T1_Set_Var_Design( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( void ) + T1_Done_Blend( T1_Face face ); + +#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +FT_END_HEADER + +#endif /* __T1LOAD_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1objs.c b/src/3rdparty/freetype/src/type1/t1objs.c new file mode 100644 index 0000000000..2f90dd62f6 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1objs.c @@ -0,0 +1,592 @@ +/***************************************************************************/ +/* */ +/* t1objs.c */ +/* */ +/* Type 1 objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_IDS_H + +#include "t1gload.h" +#include "t1load.h" + +#include "t1errors.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.h" +#endif + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1objs + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /* note that we store the global hints in the size's "internal" root */ + /* field */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + T1_Size_Get_Globals_Funcs( T1_Size size ) + { + T1_Face face = (T1_Face)size->root.face; + PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0 ; + } + + + FT_LOCAL_DEF( void ) + T1_Size_Done( T1_Size size ) + { + if ( size->root.internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = T1_Size_Get_Globals_Funcs( size ); + if ( funcs ) + funcs->destroy( (PSH_Globals)size->root.internal ); + + size->root.internal = 0; + } + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Size_Init( T1_Size size ) + { + FT_Error error = T1_Err_Ok; + PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); + + + if ( funcs ) + { + PSH_Globals globals; + T1_Face face = (T1_Face)size->root.face; + + + error = funcs->create( size->root.face->memory, + &face->type1.private_dict, &globals ); + if ( !error ) + size->root.internal = (FT_Size_Internal)(void*)globals; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Size_Request( T1_Size size, + FT_Size_Request req ) + { + PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); + + + FT_Request_Metrics( size->root.face, req ); + + if ( funcs ) + funcs->set_scale( (PSH_Globals)size->root.internal, + size->root.metrics.x_scale, + size->root.metrics.y_scale, + 0, 0 ); + + return T1_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + T1_GlyphSlot_Done( T1_GlyphSlot slot ) + { + slot->root.internal->glyph_hints = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_GlyphSlot_Init( T1_GlyphSlot slot ) + { + T1_Face face; + PSHinter_Service pshinter; + + + face = (T1_Face)slot->root.face; + pshinter = (PSHinter_Service)face->pshinter; + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" ); + if (module) + { + T1_Hints_Funcs funcs; + + funcs = pshinter->get_t1_funcs( module ); + slot->root.internal->glyph_hints = (void*)funcs; + } + } + return 0; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Face_Done */ + /* */ + /* */ + /* The face object destructor. */ + /* */ + /* */ + /* face :: A typeless pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + T1_Face_Done( T1_Face face ) + { + FT_Memory memory; + T1_Font type1; + + + if ( !face ) + return; + + memory = face->root.memory; + type1 = &face->type1; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + /* release multiple masters information */ + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + if ( face->buildchar ) + { + FT_FREE( face->buildchar ); + + face->buildchar = NULL; + face->len_buildchar = 0; + } + + T1_Done_Blend( face ); + face->blend = 0; +#endif + + /* release font info strings */ + { + PS_FontInfo info = &type1->font_info; + + + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + } + + /* release top dictionary */ + FT_FREE( type1->charstrings_len ); + FT_FREE( type1->charstrings ); + FT_FREE( type1->glyph_names ); + + FT_FREE( type1->subrs ); + FT_FREE( type1->subrs_len ); + + FT_FREE( type1->subrs_block ); + FT_FREE( type1->charstrings_block ); + FT_FREE( type1->glyph_names_block ); + + FT_FREE( type1->encoding.char_index ); + FT_FREE( type1->encoding.char_name ); + FT_FREE( type1->font_name ); + +#ifndef T1_CONFIG_OPTION_NO_AFM + /* release afm data if present */ + if ( face->afm_data ) + T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data ); +#endif + + /* release unicode map, if any */ +#if 0 + FT_FREE( face->unicode_map_rec.maps ); + face->unicode_map_rec.num_maps = 0; + face->unicode_map = NULL; +#endif + + face->root.family_name = NULL; + face->root.style_name = NULL; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Face_Init */ + /* */ + /* */ + /* The face object constructor. */ + /* */ + /* */ + /* stream :: input stream where to load font data. */ + /* */ + /* face_index :: The index of the font face in the resource. */ + /* */ + /* num_params :: Number of additional generic parameters. Ignored. */ + /* */ + /* params :: Additional generic parameters. Ignored. */ + /* */ + /* */ + /* face :: The face record to build. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Face_Init( FT_Stream stream, + T1_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( stream ); + + + face->root.num_faces = 1; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + face->psnames = psnames; + + face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "psaux" ); + psaux = (PSAux_Service)face->psaux; + + face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "pshinter" ); + + /* open the tokenizer; this will also check the font format */ + error = T1_Open_Face( face ); + if ( error ) + goto Exit; + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + if ( face_index > 0 ) + { + FT_ERROR(( "T1_Face_Init: invalid face index\n" )); + error = T1_Err_Invalid_Argument; + goto Exit; + } + + /* now load the font program into the face object */ + + /* initialize the face object fields */ + + /* set up root face fields */ + { + FT_Face root = (FT_Face)&face->root; + + + root->num_glyphs = type1->num_glyphs; + root->face_index = 0; + + root->face_flags = FT_FACE_FLAG_SCALABLE | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_GLYPH_NAMES | + FT_FACE_FLAG_HINTER; + + if ( info->is_fixed_pitch ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( face->blend ) + root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; + + /* XXX: TODO -- add kerning with .afm support */ + + + /* The following code to extract the family and the style is very */ + /* simplistic and might get some things wrong. For a full-featured */ + /* algorithm you might have a look at the whitepaper given at */ + /* */ + /* http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */ + + /* get style name -- be careful, some broken fonts only */ + /* have a `/FontName' dictionary entry! */ + root->family_name = info->family_name; + root->style_name = NULL; + + if ( root->family_name ) + { + char* full = info->full_name; + char* family = root->family_name; + + + if ( full ) + { + FT_Bool the_same = TRUE; + + + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + the_same = FALSE; + + if ( !*family ) + root->style_name = full; + break; + } + } + } + + if ( the_same ) + root->style_name = (char *)"Regular"; + } + } + else + { + /* do we have a `/FontName'? */ + if ( type1->font_name ) + root->family_name = type1->font_name; + } + + if ( !root->style_name ) + { + if ( info->weight ) + root->style_name = info->weight; + else + /* assume `Regular' style because we don't know better */ + root->style_name = (char *)"Regular"; + } + + /* compute style flags */ + root->style_flags = 0; + if ( info->italic_angle ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + if ( info->weight ) + { + if ( !ft_strcmp( info->weight, "Bold" ) || + !ft_strcmp( info->weight, "Black" ) ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + } + + /* no embedded bitmap support */ + root->num_fixed_sizes = 0; + root->available_sizes = 0; + + root->bbox.xMin = type1->font_bbox.xMin >> 16; + root->bbox.yMin = type1->font_bbox.yMin >> 16; + root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFFU ) >> 16; + root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFFU ) >> 16; + + /* Set units_per_EM if we didn't set it in parse_font_matrix. */ + if ( !root->units_per_EM ) + root->units_per_EM = 1000; + + root->ascender = (FT_Short)( root->bbox.yMax ); + root->descender = (FT_Short)( root->bbox.yMin ); + + root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 ); + if ( root->height < root->ascender - root->descender ) + root->height = (FT_Short)( root->ascender - root->descender ); + + /* now compute the maximum advance width */ + root->max_advance_width = + (FT_Short)( root->bbox.xMax ); + { + FT_Pos max_advance; + + + error = T1_Compute_Max_Advance( face, &max_advance ); + + /* in case of error, keep the standard width */ + if ( !error ) + root->max_advance_width = (FT_Short)max_advance; + else + error = T1_Err_Ok; /* clear error */ + } + + root->max_advance_height = root->height; + + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; + } + + { + FT_Face root = &face->root; + + + if ( psnames && psaux ) + { + FT_CharMapRec charmap; + T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; + FT_CMap_Class clazz; + + + charmap.face = root; + + /* first of all, try to synthesize a Unicode charmap */ + charmap.platform_id = 3; + charmap.encoding_id = 1; + charmap.encoding = FT_ENCODING_UNICODE; + + FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + + /* now, generate an Adobe Standard encoding when appropriate */ + charmap.platform_id = 7; + clazz = NULL; + + switch ( type1->encoding_type ) + { + case T1_ENCODING_TYPE_STANDARD: + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.encoding_id = TT_ADOBE_ID_STANDARD; + clazz = cmap_classes->standard; + break; + + case T1_ENCODING_TYPE_EXPERT: + charmap.encoding = FT_ENCODING_ADOBE_EXPERT; + charmap.encoding_id = TT_ADOBE_ID_EXPERT; + clazz = cmap_classes->expert; + break; + + case T1_ENCODING_TYPE_ARRAY: + charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; + charmap.encoding_id = TT_ADOBE_ID_CUSTOM; + clazz = cmap_classes->custom; + break; + + case T1_ENCODING_TYPE_ISOLATIN1: + charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; + charmap.encoding_id = TT_ADOBE_ID_LATIN_1; + clazz = cmap_classes->unicode; + break; + + default: + ; + } + + if ( clazz ) + FT_CMap_New( clazz, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if (root->num_charmaps) + root->charmap = root->charmaps[0]; +#endif + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Driver_Init */ + /* */ + /* */ + /* Initializes a given Type 1 driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Driver_Init( T1_Driver driver ) + { + FT_UNUSED( driver ); + + return T1_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Driver_Done */ + /* */ + /* */ + /* Finalizes a given Type 1 driver. */ + /* */ + /* */ + /* driver :: A handle to the target Type 1 driver. */ + /* */ + FT_LOCAL_DEF( void ) + T1_Driver_Done( T1_Driver driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1objs.h b/src/3rdparty/freetype/src/type1/t1objs.h new file mode 100644 index 0000000000..e5e90293d7 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1objs.h @@ -0,0 +1,171 @@ +/***************************************************************************/ +/* */ +/* t1objs.h */ +/* */ +/* Type 1 objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1OBJS_H__ +#define __T1OBJS_H__ + + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + /* The following structures must be defined by the hinter */ + typedef struct T1_Size_Hints_ T1_Size_Hints; + typedef struct T1_Glyph_Hints_ T1_Glyph_Hints; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Driver */ + /* */ + /* */ + /* A handle to a Type 1 driver object. */ + /* */ + typedef struct T1_DriverRec_ *T1_Driver; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_Size */ + /* */ + /* */ + /* A handle to a Type 1 size object. */ + /* */ + typedef struct T1_SizeRec_* T1_Size; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_GlyphSlot */ + /* */ + /* */ + /* A handle to a Type 1 glyph slot object. */ + /* */ + typedef struct T1_GlyphSlotRec_* T1_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* */ + /* T1_CharMap */ + /* */ + /* */ + /* A handle to a Type 1 character mapping object. */ + /* */ + /* */ + /* The Type 1 format doesn't use a charmap but an encoding table. */ + /* The driver is responsible for making up charmap objects */ + /* corresponding to these tables. */ + /* */ + typedef struct T1_CharMapRec_* T1_CharMap; + + + /*************************************************************************/ + /* */ + /* HERE BEGINS THE TYPE1 SPECIFIC STUFF */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* T1_SizeRec */ + /* */ + /* */ + /* Type 1 size record. */ + /* */ + typedef struct T1_SizeRec_ + { + FT_SizeRec root; + + } T1_SizeRec; + + + FT_LOCAL( void ) + T1_Size_Done( T1_Size size ); + + FT_LOCAL( FT_Error ) + T1_Size_Request( T1_Size size, + FT_Size_Request req ); + + FT_LOCAL( FT_Error ) + T1_Size_Init( T1_Size size ); + + + /*************************************************************************/ + /* */ + /* */ + /* T1_GlyphSlotRec */ + /* */ + /* */ + /* Type 1 glyph slot record. */ + /* */ + typedef struct T1_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Int max_points; + FT_Int max_contours; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } T1_GlyphSlotRec; + + + FT_LOCAL( FT_Error ) + T1_Face_Init( FT_Stream stream, + T1_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + T1_Face_Done( T1_Face face ); + + FT_LOCAL( FT_Error ) + T1_GlyphSlot_Init( T1_GlyphSlot slot ); + + FT_LOCAL( void ) + T1_GlyphSlot_Done( T1_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + T1_Driver_Init( T1_Driver driver ); + + FT_LOCAL( void ) + T1_Driver_Done( T1_Driver driver ); + + +FT_END_HEADER + +#endif /* __T1OBJS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1parse.c b/src/3rdparty/freetype/src/type1/t1parse.c new file mode 100644 index 0000000000..36f5c82c86 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1parse.c @@ -0,0 +1,484 @@ +/***************************************************************************/ +/* */ +/* t1parse.c */ +/* */ +/* Type 1 parser (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The Type 1 parser is in charge of the following: */ + /* */ + /* - provide an implementation of a growing sequence of objects called */ + /* a `T1_Table' (used to build various tables needed by the loader). */ + /* */ + /* - opening .pfb and .pfa files to extract their top-level and private */ + /* dictionaries. */ + /* */ + /* - read numbers, arrays & strings from any dictionary. */ + /* */ + /* See `t1load.c' to see how data is loaded from the font file. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "t1parse.h" + +#include "t1errors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1parse + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INPUT STREAM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* see Adobe Technical Note 5040.Download_Fonts.pdf */ + + static FT_Error + read_pfb_tag( FT_Stream stream, + FT_UShort *atag, + FT_ULong *asize ) + { + FT_Error error; + FT_UShort tag; + FT_ULong size; + + + *atag = 0; + *asize = 0; + + if ( !FT_READ_USHORT( tag ) ) + { + if ( tag == 0x8001U || tag == 0x8002U ) + { + if ( !FT_READ_ULONG_LE( size ) ) + *asize = size; + } + + *atag = tag; + } + + return error; + } + + + static FT_Error + check_type1_format( FT_Stream stream, + const char* header_string, + size_t header_length ) + { + FT_Error error; + FT_UShort tag; + FT_ULong dummy; + + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + error = read_pfb_tag( stream, &tag, &dummy ); + if ( error ) + goto Exit; + + /* We assume that the first segment in a PFB is always encoded as */ + /* text. This might be wrong (and the specification doesn't insist */ + /* on that), but we have never seen a counterexample. */ + if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) ) + goto Exit; + + if ( !FT_FRAME_ENTER( header_length ) ) + { + error = T1_Err_Ok; + + if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 ) + error = T1_Err_Unknown_File_Format; + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_New_Parser( T1_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error; + FT_UShort tag; + FT_ULong size; + + + psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); + + parser->stream = stream; + parser->base_len = 0; + parser->base_dict = 0; + parser->private_len = 0; + parser->private_dict = 0; + parser->in_pfb = 0; + parser->in_memory = 0; + parser->single_block = 0; + + /* check the header format */ + error = check_type1_format( stream, "%!PS-AdobeFont", 14 ); + if ( error ) + { + if ( error != T1_Err_Unknown_File_Format ) + goto Exit; + + error = check_type1_format( stream, "%!FontType", 10 ); + if ( error ) + { + FT_TRACE2(( "[not a Type1 font]\n" )); + goto Exit; + } + } + + /******************************************************************/ + /* */ + /* Here a short summary of what is going on: */ + /* */ + /* When creating a new Type 1 parser, we try to locate and load */ + /* the base dictionary if this is possible (i.e., for PFB */ + /* files). Otherwise, we load the whole font into memory. */ + /* */ + /* When `loading' the base dictionary, we only setup pointers */ + /* in the case of a memory-based stream. Otherwise, we */ + /* allocate and load the base dictionary in it. */ + /* */ + /* parser->in_pfb is set if we are in a binary (`.pfb') font. */ + /* parser->in_memory is set if we have a memory stream. */ + /* */ + + /* try to compute the size of the base dictionary; */ + /* look for a Postscript binary file tag, i.e., 0x8001 */ + if ( FT_STREAM_SEEK( 0L ) ) + goto Exit; + + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Exit; + + if ( tag != 0x8001U ) + { + /* assume that this is a PFA file for now; an error will */ + /* be produced later when more things are checked */ + if ( FT_STREAM_SEEK( 0L ) ) + goto Exit; + size = stream->size; + } + else + parser->in_pfb = 1; + + /* now, try to load `size' bytes of the `base' dictionary we */ + /* found previously */ + + /* if it is a memory-based resource, set up pointers */ + if ( !stream->read ) + { + parser->base_dict = (FT_Byte*)stream->base + stream->pos; + parser->base_len = size; + parser->in_memory = 1; + + /* check that the `size' field is valid */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + else + { + /* read segment in memory -- this is clumsy, but so does the format */ + if ( FT_ALLOC( parser->base_dict, size ) || + FT_STREAM_READ( parser->base_dict, size ) ) + goto Exit; + parser->base_len = size; + } + + parser->root.base = parser->base_dict; + parser->root.cursor = parser->base_dict; + parser->root.limit = parser->root.cursor + parser->base_len; + + Exit: + if ( error && !parser->in_memory ) + FT_FREE( parser->base_dict ); + + return error; + } + + + FT_LOCAL_DEF( void ) + T1_Finalize_Parser( T1_Parser parser ) + { + FT_Memory memory = parser->root.memory; + + + /* always free the private dictionary */ + FT_FREE( parser->private_dict ); + + /* free the base dictionary only when we have a disk stream */ + if ( !parser->in_memory ) + FT_FREE( parser->base_dict ); + + parser->root.funcs.done( &parser->root ); + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Private_Dict( T1_Parser parser, + PSAux_Service psaux ) + { + FT_Stream stream = parser->stream; + FT_Memory memory = parser->root.memory; + FT_Error error = T1_Err_Ok; + FT_ULong size; + + + if ( parser->in_pfb ) + { + /* in the case of the PFB format, the private dictionary can be */ + /* made of several segments. We thus first read the number of */ + /* segments to compute the total size of the private dictionary */ + /* then re-read them into memory. */ + FT_Long start_pos = FT_STREAM_POS(); + FT_UShort tag; + + + parser->private_len = 0; + for (;;) + { + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Fail; + + if ( tag != 0x8002U ) + break; + + parser->private_len += size; + + if ( FT_STREAM_SKIP( size ) ) + goto Fail; + } + + /* Check that we have a private dictionary there */ + /* and allocate private dictionary buffer */ + if ( parser->private_len == 0 ) + { + FT_ERROR(( "T1_Get_Private_Dict:" )); + FT_ERROR(( " invalid private dictionary section\n" )); + error = T1_Err_Invalid_File_Format; + goto Fail; + } + + if ( FT_STREAM_SEEK( start_pos ) || + FT_ALLOC( parser->private_dict, parser->private_len ) ) + goto Fail; + + parser->private_len = 0; + for (;;) + { + error = read_pfb_tag( stream, &tag, &size ); + if ( error || tag != 0x8002U ) + { + error = T1_Err_Ok; + break; + } + + if ( FT_STREAM_READ( parser->private_dict + parser->private_len, + size ) ) + goto Fail; + + parser->private_len += size; + } + } + else + { + /* We have already `loaded' the whole PFA font file into memory; */ + /* if this is a memory resource, allocate a new block to hold */ + /* the private dict. Otherwise, simply overwrite into the base */ + /* dictionary block in the heap. */ + + /* first of all, look at the `eexec' keyword */ + FT_Byte* cur = parser->base_dict; + FT_Byte* limit = cur + parser->base_len; + FT_Byte c; + + + Again: + for (;;) + { + c = cur[0]; + if ( c == 'e' && cur + 9 < limit ) /* 9 = 5 letters for `eexec' + */ + /* newline + 4 chars */ + { + if ( cur[1] == 'e' && + cur[2] == 'x' && + cur[3] == 'e' && + cur[4] == 'c' ) + break; + } + cur++; + if ( cur >= limit ) + { + FT_ERROR(( "T1_Get_Private_Dict:" )); + FT_ERROR(( " could not find `eexec' keyword\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + } + + /* check whether `eexec' was real -- it could be in a comment */ + /* or string (as e.g. in u003043t.gsf from ghostscript) */ + + parser->root.cursor = parser->base_dict; + parser->root.limit = cur + 9; + + cur = parser->root.cursor; + limit = parser->root.limit; + + while ( cur < limit ) + { + if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 ) + goto Found; + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + break; + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } + + /* we haven't found the correct `eexec'; go back and continue */ + /* searching */ + + cur = limit; + limit = parser->base_dict + parser->base_len; + goto Again; + + /* now determine where to write the _encrypted_ binary private */ + /* dictionary. We overwrite the base dictionary for disk-based */ + /* resources and allocate a new block otherwise */ + + Found: + parser->root.limit = parser->base_dict + parser->base_len; + + T1_Skip_PS_Token( parser ); + cur = parser->root.cursor; + if ( *cur == '\r' ) + { + cur++; + if ( *cur == '\n' ) + cur++; + } + else if ( *cur == '\n' ) + cur++; + else + { + FT_ERROR(( "T1_Get_Private_Dict:" )); + FT_ERROR(( " `eexec' not properly terminated\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + size = parser->base_len - ( cur - parser->base_dict ); + + if ( parser->in_memory ) + { + /* note that we allocate one more byte to put a terminating `0' */ + if ( FT_ALLOC( parser->private_dict, size + 1 ) ) + goto Fail; + parser->private_len = size; + } + else + { + parser->single_block = 1; + parser->private_dict = parser->base_dict; + parser->private_len = size; + parser->base_dict = 0; + parser->base_len = 0; + } + + /* now determine whether the private dictionary is encoded in binary */ + /* or hexadecimal ASCII format -- decode it accordingly */ + + /* we need to access the next 4 bytes (after the final \r following */ + /* the `eexec' keyword); if they all are hexadecimal digits, then */ + /* we have a case of ASCII storage */ + + if ( ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) && + ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) ) + { + /* ASCII hexadecimal encoding */ + FT_Long len; + + + parser->root.cursor = cur; + (void)psaux->ps_parser_funcs->to_bytes( &parser->root, + parser->private_dict, + parser->private_len, + &len, + 0 ); + parser->private_len = len; + + /* put a safeguard */ + parser->private_dict[len] = '\0'; + } + else + /* binary encoding -- copy the private dict */ + FT_MEM_MOVE( parser->private_dict, cur, size ); + } + + /* we now decrypt the encoded binary private dictionary */ + psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U ); + + /* replace the four random bytes at the beginning with whitespace */ + parser->private_dict[0] = ' '; + parser->private_dict[1] = ' '; + parser->private_dict[2] = ' '; + parser->private_dict[3] = ' '; + + parser->root.base = parser->private_dict; + parser->root.cursor = parser->private_dict; + parser->root.limit = parser->root.cursor + parser->private_len; + + Fail: + Exit: + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1parse.h b/src/3rdparty/freetype/src/type1/t1parse.h new file mode 100644 index 0000000000..fb1c8a8830 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1parse.h @@ -0,0 +1,135 @@ +/***************************************************************************/ +/* */ +/* t1parse.h */ +/* */ +/* Type 1 parser (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1PARSE_H__ +#define __T1PARSE_H__ + + +#include +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* T1_ParserRec */ + /* */ + /* */ + /* A PS_ParserRec is an object used to parse a Type 1 fonts very */ + /* quickly. */ + /* */ + /* */ + /* root :: The root parser. */ + /* */ + /* stream :: The current input stream. */ + /* */ + /* base_dict :: A pointer to the top-level dictionary. */ + /* */ + /* base_len :: The length in bytes of the top dictionary. */ + /* */ + /* private_dict :: A pointer to the private dictionary. */ + /* */ + /* private_len :: The length in bytes of the private dictionary. */ + /* */ + /* in_pfb :: A boolean. Indicates that we are handling a PFB */ + /* file. */ + /* */ + /* in_memory :: A boolean. Indicates a memory-based stream. */ + /* */ + /* single_block :: A boolean. Indicates that the private dictionary */ + /* is stored in lieu of the base dictionary. */ + /* */ + typedef struct T1_ParserRec_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* base_dict; + FT_ULong base_len; + + FT_Byte* private_dict; + FT_ULong private_len; + + FT_Bool in_pfb; + FT_Bool in_memory; + FT_Bool single_block; + + } T1_ParserRec, *T1_Parser; + + +#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) +#define T1_Done_Table( p ) \ + do \ + { \ + if ( (p)->funcs.done ) \ + (p)->funcs.done( p ); \ + } while ( 0 ) +#define T1_Release_Table( p ) \ + do \ + { \ + if ( (p)->funcs.release ) \ + (p)->funcs.release( p ); \ + } while ( 0 ) + + +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) + +#define T1_ToCoordArray( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) +#define T1_ToFixedArray( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define T1_ToToken( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) +#define T1_ToTokenArray( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) + +#define T1_Load_Field( p, f, o, m, pf ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) + +#define T1_Load_Field_Table( p, f, o, m, pf ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) + + + FT_LOCAL( FT_Error ) + T1_New_Parser( T1_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( FT_Error ) + T1_Get_Private_Dict( T1_Parser parser, + PSAux_Service psaux ); + + FT_LOCAL( void ) + T1_Finalize_Parser( T1_Parser parser ); + + +FT_END_HEADER + +#endif /* __T1PARSE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1tokens.h b/src/3rdparty/freetype/src/type1/t1tokens.h new file mode 100644 index 0000000000..2d692f0e61 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/t1tokens.h @@ -0,0 +1,143 @@ +/***************************************************************************/ +/* */ +/* t1tokens.h */ +/* */ +/* Type 1 tokenizer (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "Notice", notice, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "FullName", full_name, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "FamilyName", family_name, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "Weight", weight, + T1_FIELD_DICT_FONTDICT ) + + /* we use pointers to detect modifications made by synthetic fonts */ + T1_FIELD_NUM ( "ItalicAngle", italic_angle, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, + T1_FIELD_DICT_FONTDICT ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, + T1_FIELD_DICT_FONTDICT ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_PrivateRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_PRIVATE + + T1_FIELD_NUM ( "UniqueID", unique_id, + T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "lenIV", lenIV, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "LanguageGroup", language_group, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "password", password, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_FIXED_1000( "BlueScale", blue_scale, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "BlueShift", blue_shift, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_BOOL ( "ForceBold", force_bold, + T1_FIELD_DICT_PRIVATE ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_KEY ( "FontName", font_name, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "PaintType", paint_type, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "FontType", font_type, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT ) + + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FaceRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FACE + + T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_BlendRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BLEND + + T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector, + T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT ) + + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type1/type1.c b/src/3rdparty/freetype/src/type1/type1.c new file mode 100644 index 0000000000..ccc12be103 --- /dev/null +++ b/src/3rdparty/freetype/src/type1/type1.c @@ -0,0 +1,33 @@ +/***************************************************************************/ +/* */ +/* type1.c */ +/* */ +/* FreeType Type 1 driver component (body only). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include +#include "t1parse.c" +#include "t1load.c" +#include "t1objs.c" +#include "t1driver.c" +#include "t1gload.c" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.c" +#endif + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/Jamfile b/src/3rdparty/freetype/src/type42/Jamfile new file mode 100644 index 0000000000..00371d54f3 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/type42 Jamfile +# +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) type42 ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = t42objs t42parse t42drivr ; + } + else + { + _sources = type42 ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/type42 Jamfile diff --git a/src/3rdparty/freetype/src/type42/module.mk b/src/3rdparty/freetype/src/type42/module.mk new file mode 100644 index 0000000000..b3f10a8d3c --- /dev/null +++ b/src/3rdparty/freetype/src/type42/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Type42 module definition +# + + +# Copyright 2002, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE42_DRIVER + +define TYPE42_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t42_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)type42 $(ECHO_DRIVER_DESC)Type 42 font files with no known extension$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/type42/rules.mk b/src/3rdparty/freetype/src/type42/rules.mk new file mode 100644 index 0000000000..eac1081eb1 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 Type42 driver configuration rules +# + + +# Copyright 2002, 2003, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Type42 driver directory +# +T42_DIR := $(SRC_DIR)/type42 + + +# compilation flags for the driver +# +T42_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T42_DIR)) + + +# Type42 driver source +# +T42_DRV_SRC := $(T42_DIR)/t42objs.c \ + $(T42_DIR)/t42parse.c \ + $(T42_DIR)/t42drivr.c + +# Type42 driver headers +# +T42_DRV_H := $(T42_DRV_SRC:%.c=%.h) \ + $(T42_DIR)/t42error.h \ + $(T42_DIR)/t42types.h + + +# Type42 driver object(s) +# +# T42_DRV_OBJ_M is used during `multi' builds +# T42_DRV_OBJ_S is used during `single' builds +# +T42_DRV_OBJ_M := $(T42_DRV_SRC:$(T42_DIR)/%.c=$(OBJ_DIR)/%.$O) +T42_DRV_OBJ_S := $(OBJ_DIR)/type42.$O + +# Type42 driver source file for single build +# +T42_DRV_SRC_S := $(T42_DIR)/type42.c + + +# Type42 driver - single object +# +$(T42_DRV_OBJ_S): $(T42_DRV_SRC_S) $(T42_DRV_SRC) $(FREETYPE_H) $(T42_DRV_H) + $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T42_DRV_SRC_S)) + + +# Type42 driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(T42_DIR)/%.c $(FREETYPE_H) $(T42_DRV_H) + $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(T42_DRV_OBJ_S) +DRV_OBJS_M += $(T42_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/type42/t42drivr.c b/src/3rdparty/freetype/src/type42/t42drivr.c new file mode 100644 index 0000000000..820c679612 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/t42drivr.c @@ -0,0 +1,246 @@ +/***************************************************************************/ +/* */ +/* t42drivr.c */ +/* */ +/* High-level Type 42 driver interface (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2007, 2009 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This driver implements Type42 fonts as described in the */ + /* Technical Note #5012 from Adobe, with these limitations: */ + /* */ + /* 1) CID Fonts are not currently supported. */ + /* 2) Incremental fonts making use of the GlyphDirectory keyword */ + /* will be loaded, but the rendering will be using the TrueType */ + /* tables. */ + /* 3) As for Type1 fonts, CDevProc is not supported. */ + /* 4) The Metrics dictionary is not supported. */ + /* 5) AFM metrics are not supported. */ + /* */ + /* In other words, this driver supports Type42 fonts derived from */ + /* TrueType fonts in a non-CID manner, as done by usual conversion */ + /* programs. */ + /* */ + /*************************************************************************/ + + +#include "t42drivr.h" +#include "t42objs.h" +#include "t42error.h" +#include FT_INTERNAL_DEBUG_H + +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_POSTSCRIPT_INFO_H + +#undef FT_COMPONENT +#define FT_COMPONENT trace_t42 + + + /* + * + * GLYPH DICT SERVICE + * + */ + + static FT_Error + t42_get_glyph_name( T42_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); + + return T42_Err_Ok; + } + + + static FT_UInt + t42_get_name_index( T42_Face face, + FT_String* glyph_name ) + { + FT_Int i; + FT_String* gname; + + + for ( i = 0; i < face->type1.num_glyphs; i++ ) + { + gname = face->type1.glyph_names[i]; + + if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) ) + return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] ); + } + + return 0; + } + + + static const FT_Service_GlyphDictRec t42_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) t42_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)t42_get_name_index + }; + + + /* + * + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + t42_get_ps_font_name( T42_Face face ) + { + return (const char*)face->type1.font_name; + } + + + static const FT_Service_PsFontNameRec t42_service_ps_font_name = + { + (FT_PsName_GetFunc)t42_get_ps_font_name + }; + + + /* + * + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + t42_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((T42_Face)face)->type1.font_info; + + return T42_Err_Ok; + } + + + static FT_Error + t42_ps_get_font_extra( FT_Face face, + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ((T42_Face)face)->type1.font_extra; + + return T42_Err_Ok; + } + + + static FT_Int + t42_ps_has_glyph_names( FT_Face face ) + { + FT_UNUSED( face ); + + return 1; + } + + + static FT_Error + t42_ps_get_font_private( FT_Face face, + PS_PrivateRec* afont_private ) + { + *afont_private = ((T42_Face)face)->type1.private_dict; + + return T42_Err_Ok; + } + + + static const FT_Service_PsInfoRec t42_service_ps_info = + { + (PS_GetFontInfoFunc) t42_ps_get_font_info, + (PS_GetFontExtraFunc) t42_ps_get_font_extra, + (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names, + (PS_GetFontPrivateFunc)t42_ps_get_font_private + }; + + + /* + * + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec t42_services[] = + { + { FT_SERVICE_ID_GLYPH_DICT, &t42_service_glyph_dict }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &t42_service_ps_info }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_42 }, + { NULL, NULL } + }; + + + static FT_Module_Interface + T42_Get_Interface( FT_Driver driver, + const FT_String* t42_interface ) + { + FT_UNUSED( driver ); + + return ft_service_list_lookup( t42_services, t42_interface ); + } + + + const FT_Driver_ClassRec t42_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_MODULE_DRIVER_HAS_HINTER, +#else + 0, +#endif + + sizeof ( T42_DriverRec ), + + "type42", + 0x10000L, + 0x20000L, + + 0, /* format interface */ + + (FT_Module_Constructor)T42_Driver_Init, + (FT_Module_Destructor) T42_Driver_Done, + (FT_Module_Requester) T42_Get_Interface, + }, + + sizeof ( T42_FaceRec ), + sizeof ( T42_SizeRec ), + sizeof ( T42_GlyphSlotRec ), + + (FT_Face_InitFunc) T42_Face_Init, + (FT_Face_DoneFunc) T42_Face_Done, + (FT_Size_InitFunc) T42_Size_Init, + (FT_Size_DoneFunc) T42_Size_Done, + (FT_Slot_InitFunc) T42_GlyphSlot_Init, + (FT_Slot_DoneFunc) T42_GlyphSlot_Done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + (FT_Slot_LoadFunc) T42_GlyphSlot_Load, + + (FT_Face_GetKerningFunc) 0, + (FT_Face_AttachFunc) 0, + + (FT_Face_GetAdvancesFunc) 0, + (FT_Size_RequestFunc) T42_Size_Request, + (FT_Size_SelectFunc) T42_Size_Select + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/t42drivr.h b/src/3rdparty/freetype/src/type42/t42drivr.h new file mode 100644 index 0000000000..98b7410b67 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/t42drivr.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* t42drivr.h */ +/* */ +/* High-level Type 42 driver interface (specification). */ +/* */ +/* Copyright 2002 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42DRIVR_H__ +#define __T42DRIVR_H__ + + +#include +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) t42_driver_class; + + +FT_END_HEADER + + +#endif /* __T42DRIVR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/t42error.h b/src/3rdparty/freetype/src/type42/t42error.h new file mode 100644 index 0000000000..b230910012 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/t42error.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* t42error.h */ +/* */ +/* Type 42 error codes (specification only). */ +/* */ +/* Copyright 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Type 42 error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __T42ERROR_H__ +#define __T42ERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX T42_Err_ +#define FT_ERR_BASE FT_Mod_Err_Type42 + +#include FT_ERRORS_H + +#endif /* __T42ERROR_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/t42objs.c b/src/3rdparty/freetype/src/type42/t42objs.c new file mode 100644 index 0000000000..16e9809ce1 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/t42objs.c @@ -0,0 +1,647 @@ +/***************************************************************************/ +/* */ +/* t42objs.c */ +/* */ +/* Type 42 objects manager (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "t42objs.h" +#include "t42parse.h" +#include "t42error.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_LIST_H + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_t42 + + + static FT_Error + T42_Open_Face( T42_Face face ) + { + T42_LoaderRec loader; + T42_Parser parser; + T1_Font type1 = &face->type1; + FT_Memory memory = face->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + t42_loader_init( &loader, face ); + + parser = &loader.parser; + + if ( FT_ALLOC( face->ttf_data, 12 ) ) + goto Exit; + + error = t42_parser_init( parser, + face->root.stream, + memory, + psaux); + if ( error ) + goto Exit; + + error = t42_parse_dict( face, &loader, + parser->base_dict, parser->base_len ); + if ( error ) + goto Exit; + + if ( type1->font_type != 42 ) + { + error = T42_Err_Unknown_File_Format; + goto Exit; + } + + /* now, propagate the charstrings and glyphnames tables */ + /* to the Type1 data */ + type1->num_glyphs = loader.num_glyphs; + + if ( !loader.charstrings.init ) + { + FT_ERROR(( "T42_Open_Face: no charstrings array in face!\n" )); + error = T42_Err_Invalid_File_Format; + } + + loader.charstrings.init = 0; + type1->charstrings_block = loader.charstrings.block; + type1->charstrings = loader.charstrings.elements; + type1->charstrings_len = loader.charstrings.lengths; + + /* we copy the glyph names `block' and `elements' fields; */ + /* the `lengths' field must be released later */ + type1->glyph_names_block = loader.glyph_names.block; + type1->glyph_names = (FT_String**)loader.glyph_names.elements; + loader.glyph_names.block = 0; + loader.glyph_names.elements = 0; + + /* we must now build type1.encoding when we have a custom array */ + if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) + { + FT_Int charcode, idx, min_char, max_char; + FT_Byte* char_name; + FT_Byte* glyph_name; + + + /* OK, we do the following: for each element in the encoding */ + /* table, look up the index of the glyph having the same name */ + /* as defined in the CharStrings array. */ + /* The index is then stored in type1.encoding.char_index, and */ + /* the name in type1.encoding.char_name */ + + min_char = +32000; + max_char = -32000; + + charcode = 0; + for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) + { + type1->encoding.char_index[charcode] = 0; + type1->encoding.char_name [charcode] = (char *)".notdef"; + + char_name = loader.encoding_table.elements[charcode]; + if ( char_name ) + for ( idx = 0; idx < type1->num_glyphs; idx++ ) + { + glyph_name = (FT_Byte*)type1->glyph_names[idx]; + if ( ft_strcmp( (const char*)char_name, + (const char*)glyph_name ) == 0 ) + { + type1->encoding.char_index[charcode] = (FT_UShort)idx; + type1->encoding.char_name [charcode] = (char*)glyph_name; + + /* Change min/max encoded char only if glyph name is */ + /* not /.notdef */ + if ( ft_strcmp( (const char*)".notdef", + (const char*)glyph_name ) != 0 ) + { + if ( charcode < min_char ) + min_char = charcode; + if ( charcode > max_char ) + max_char = charcode; + } + break; + } + } + } + type1->encoding.code_first = min_char; + type1->encoding.code_last = max_char; + type1->encoding.num_chars = loader.num_chars; + } + + Exit: + t42_loader_done( &loader ); + return error; + } + + + /***************** Driver Functions *************/ + + + FT_LOCAL_DEF( FT_Error ) + T42_Face_Init( FT_Stream stream, + T42_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + FT_Face root = (FT_Face)&face->root; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( face_index ); + FT_UNUSED( stream ); + + + face->ttf_face = NULL; + face->root.num_faces = 1; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + face->psnames = psnames; + + face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "psaux" ); + psaux = (PSAux_Service)face->psaux; + + /* open the tokenizer, this will also check the font format */ + error = T42_Open_Face( face ); + if ( error ) + goto Exit; + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + if ( face_index > 0 ) + { + FT_ERROR(( "T42_Face_Init: invalid face index\n" )); + error = T42_Err_Invalid_Argument; + goto Exit; + } + + /* Now load the font program into the face object */ + + /* Init the face object fields */ + /* Now set up root face fields */ + + root->num_glyphs = type1->num_glyphs; + root->num_charmaps = 0; + root->face_index = 0; + + root->face_flags = FT_FACE_FLAG_SCALABLE | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_GLYPH_NAMES; + + if ( info->is_fixed_pitch ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* We only set this flag if we have the patented bytecode interpreter. */ + /* There are no known `tricky' Type42 fonts that could be loaded with */ + /* the unpatented interpreter. */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + root->face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* XXX: TODO -- add kerning with .afm support */ + + /* get style name -- be careful, some broken fonts only */ + /* have a `/FontName' dictionary entry! */ + root->family_name = info->family_name; + /* assume "Regular" style if we don't know better */ + root->style_name = (char *)"Regular"; + if ( root->family_name ) + { + char* full = info->full_name; + char* family = root->family_name; + + + if ( full ) + { + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + if ( !*family ) + root->style_name = full; + break; + } + } + } + } + } + else + { + /* do we have a `/FontName'? */ + if ( type1->font_name ) + root->family_name = type1->font_name; + } + + /* no embedded bitmap support */ + root->num_fixed_sizes = 0; + root->available_sizes = 0; + + /* Load the TTF font embedded in the T42 font */ + { + FT_Open_Args args; + + + args.flags = FT_OPEN_MEMORY; + args.memory_base = face->ttf_data; + args.memory_size = face->ttf_size; + + if ( num_params ) + { + args.flags |= FT_OPEN_PARAMS; + args.num_params = num_params; + args.params = params; + } + + error = FT_Open_Face( FT_FACE_LIBRARY( face ), + &args, 0, &face->ttf_face ); + } + + if ( error ) + goto Exit; + + FT_Done_Size( face->ttf_face->size ); + + /* Ignore info in FontInfo dictionary and use the info from the */ + /* loaded TTF font. The PostScript interpreter also ignores it. */ + root->bbox = face->ttf_face->bbox; + root->units_per_EM = face->ttf_face->units_per_EM; + + root->ascender = face->ttf_face->ascender; + root->descender = face->ttf_face->descender; + root->height = face->ttf_face->height; + + root->max_advance_width = face->ttf_face->max_advance_width; + root->max_advance_height = face->ttf_face->max_advance_height; + + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; + + /* compute style flags */ + root->style_flags = 0; + if ( info->italic_angle ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->ttf_face->style_flags & FT_STYLE_FLAG_BOLD ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + + if ( face->ttf_face->face_flags & FT_FACE_FLAG_VERTICAL ) + root->face_flags |= FT_FACE_FLAG_VERTICAL; + + { + if ( psnames && psaux ) + { + FT_CharMapRec charmap; + T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; + FT_CMap_Class clazz; + + + charmap.face = root; + + /* first of all, try to synthesize a Unicode charmap */ + charmap.platform_id = 3; + charmap.encoding_id = 1; + charmap.encoding = FT_ENCODING_UNICODE; + + FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + + /* now, generate an Adobe Standard encoding when appropriate */ + charmap.platform_id = 7; + clazz = NULL; + + switch ( type1->encoding_type ) + { + case T1_ENCODING_TYPE_STANDARD: + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.encoding_id = 0; + clazz = cmap_classes->standard; + break; + + case T1_ENCODING_TYPE_EXPERT: + charmap.encoding = FT_ENCODING_ADOBE_EXPERT; + charmap.encoding_id = 1; + clazz = cmap_classes->expert; + break; + + case T1_ENCODING_TYPE_ARRAY: + charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; + charmap.encoding_id = 2; + clazz = cmap_classes->custom; + break; + + case T1_ENCODING_TYPE_ISOLATIN1: + charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; + charmap.encoding_id = 3; + clazz = cmap_classes->unicode; + break; + + default: + ; + } + + if ( clazz ) + FT_CMap_New( clazz, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if ( root->num_charmaps ) + root->charmap = root->charmaps[0]; +#endif + } + } + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + T42_Face_Done( T42_Face face ) + { + T1_Font type1; + PS_FontInfo info; + FT_Memory memory; + + + if ( !face ) + return; + + type1 = &face->type1; + info = &type1->font_info; + memory = face->root.memory; + + /* delete internal ttf face prior to freeing face->ttf_data */ + if ( face->ttf_face ) + FT_Done_Face( face->ttf_face ); + + /* release font info strings */ + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + + /* release top dictionary */ + FT_FREE( type1->charstrings_len ); + FT_FREE( type1->charstrings ); + FT_FREE( type1->glyph_names ); + + FT_FREE( type1->charstrings_block ); + FT_FREE( type1->glyph_names_block ); + + FT_FREE( type1->encoding.char_index ); + FT_FREE( type1->encoding.char_name ); + FT_FREE( type1->font_name ); + + FT_FREE( face->ttf_data ); + +#if 0 + /* release afm data if present */ + if ( face->afm_data ) + T1_Done_AFM( memory, (T1_AFM*)face->afm_data ); +#endif + + /* release unicode map, if any */ + FT_FREE( face->unicode_map.maps ); + face->unicode_map.num_maps = 0; + + face->root.family_name = 0; + face->root.style_name = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* T42_Driver_Init */ + /* */ + /* */ + /* Initializes a given Type 42 driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T42_Driver_Init( T42_Driver driver ) + { + FT_Module ttmodule; + + + ttmodule = FT_Get_Module( FT_MODULE(driver)->library, "truetype" ); + driver->ttclazz = (FT_Driver_Class)ttmodule->clazz; + + return T42_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + T42_Driver_Done( T42_Driver driver ) + { + FT_UNUSED( driver ); + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Init( T42_Size size ) + { + FT_Face face = size->root.face; + T42_Face t42face = (T42_Face)face; + FT_Size ttsize; + FT_Error error = T42_Err_Ok; + + + error = FT_New_Size( t42face->ttf_face, &ttsize ); + size->ttsize = ttsize; + + FT_Activate_Size( ttsize ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Request( T42_Size size, + FT_Size_Request req ) + { + T42_Face face = (T42_Face)size->root.face; + FT_Error error; + + + FT_Activate_Size( size->ttsize ); + + error = FT_Request_Size( face->ttf_face, req ); + if ( !error ) + ( (FT_Size)size )->metrics = face->ttf_face->size->metrics; + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Select( T42_Size size, + FT_ULong strike_index ) + { + T42_Face face = (T42_Face)size->root.face; + FT_Error error; + + + FT_Activate_Size( size->ttsize ); + + error = FT_Select_Size( face->ttf_face, (FT_Int)strike_index ); + if ( !error ) + ( (FT_Size)size )->metrics = face->ttf_face->size->metrics; + + return error; + + } + + + FT_LOCAL_DEF( void ) + T42_Size_Done( T42_Size size ) + { + FT_Face face = size->root.face; + T42_Face t42face = (T42_Face)face; + FT_ListNode node; + + + node = FT_List_Find( &t42face->ttf_face->sizes_list, size->ttsize ); + if ( node ) + { + FT_Done_Size( size->ttsize ); + size->ttsize = NULL; + } + } + + + FT_LOCAL_DEF( FT_Error ) + T42_GlyphSlot_Init( T42_GlyphSlot slot ) + { + FT_Face face = slot->root.face; + T42_Face t42face = (T42_Face)face; + FT_GlyphSlot ttslot; + FT_Error error = T42_Err_Ok; + + + if ( face->glyph == NULL ) + { + /* First glyph slot for this face */ + slot->ttslot = t42face->ttf_face->glyph; + } + else + { + error = FT_New_GlyphSlot( t42face->ttf_face, &ttslot ); + slot->ttslot = ttslot; + } + + return error; + } + + + FT_LOCAL_DEF( void ) + T42_GlyphSlot_Done( T42_GlyphSlot slot ) + { + FT_Done_GlyphSlot( slot->ttslot ); + } + + + static void + t42_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* clear all public fields in the glyph slot */ + FT_ZERO( &slot->metrics ); + FT_ZERO( &slot->outline ); + FT_ZERO( &slot->bitmap ); + + slot->bitmap_left = 0; + slot->bitmap_top = 0; + slot->num_subglyphs = 0; + slot->subglyphs = 0; + slot->control_data = 0; + slot->control_len = 0; + slot->other = 0; + slot->format = FT_GLYPH_FORMAT_NONE; + + slot->linearHoriAdvance = 0; + slot->linearVertAdvance = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_GlyphSlot_Load( FT_GlyphSlot glyph, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + T42_GlyphSlot t42slot = (T42_GlyphSlot)glyph; + T42_Size t42size = (T42_Size)size; + FT_Driver_Class ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz; + + + t42_glyphslot_clear( t42slot->ttslot ); + error = ttclazz->load_glyph( t42slot->ttslot, + t42size->ttsize, + glyph_index, + load_flags | FT_LOAD_NO_BITMAP ); + + if ( !error ) + { + glyph->metrics = t42slot->ttslot->metrics; + + glyph->linearHoriAdvance = t42slot->ttslot->linearHoriAdvance; + glyph->linearVertAdvance = t42slot->ttslot->linearVertAdvance; + + glyph->format = t42slot->ttslot->format; + glyph->outline = t42slot->ttslot->outline; + + glyph->bitmap = t42slot->ttslot->bitmap; + glyph->bitmap_left = t42slot->ttslot->bitmap_left; + glyph->bitmap_top = t42slot->ttslot->bitmap_top; + + glyph->num_subglyphs = t42slot->ttslot->num_subglyphs; + glyph->subglyphs = t42slot->ttslot->subglyphs; + + glyph->control_data = t42slot->ttslot->control_data; + glyph->control_len = t42slot->ttslot->control_len; + } + + return error; + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/t42objs.h b/src/3rdparty/freetype/src/type42/t42objs.h new file mode 100644 index 0000000000..289dedcc69 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/t42objs.h @@ -0,0 +1,124 @@ +/***************************************************************************/ +/* */ +/* t42objs.h */ +/* */ +/* Type 42 objects manager (specification). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42OBJS_H__ +#define __T42OBJS_H__ + +#include +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include "t42types.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DRIVER_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /* Type42 size */ + typedef struct T42_SizeRec_ + { + FT_SizeRec root; + FT_Size ttsize; + + } T42_SizeRec, *T42_Size; + + + /* Type42 slot */ + typedef struct T42_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + FT_GlyphSlot ttslot; + + } T42_GlyphSlotRec, *T42_GlyphSlot; + + + /* Type 42 driver */ + typedef struct T42_DriverRec_ + { + FT_DriverRec root; + FT_Driver_Class ttclazz; + void* extension_component; + + } T42_DriverRec, *T42_Driver; + + + /* */ + + + FT_LOCAL( FT_Error ) + T42_Face_Init( FT_Stream stream, + T42_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + FT_LOCAL( void ) + T42_Face_Done( T42_Face face ); + + + FT_LOCAL( FT_Error ) + T42_Size_Init( T42_Size size ); + + + FT_LOCAL( FT_Error ) + T42_Size_Request( T42_Size size, + FT_Size_Request req ); + + + FT_LOCAL( FT_Error ) + T42_Size_Select( T42_Size size, + FT_ULong strike_index ); + + + FT_LOCAL( void ) + T42_Size_Done( T42_Size size ); + + + FT_LOCAL( FT_Error ) + T42_GlyphSlot_Init( T42_GlyphSlot slot ); + + + FT_LOCAL( FT_Error ) + T42_GlyphSlot_Load( FT_GlyphSlot glyph, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + FT_LOCAL( void ) + T42_GlyphSlot_Done( T42_GlyphSlot slot ); + + + FT_LOCAL( FT_Error ) + T42_Driver_Init( T42_Driver driver ); + + FT_LOCAL( void ) + T42_Driver_Done( T42_Driver driver ); + + /* */ + +FT_END_HEADER + + +#endif /* __T42OBJS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/t42parse.c b/src/3rdparty/freetype/src/type42/t42parse.c new file mode 100644 index 0000000000..b9e408c452 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/t42parse.c @@ -0,0 +1,1175 @@ +/***************************************************************************/ +/* */ +/* t42parse.c */ +/* */ +/* Type 42 font parser (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "t42parse.h" +#include "t42error.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_LIST_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t42 + + + static void + t42_parse_font_matrix( T42_Face face, + T42_Loader loader ); + static void + t42_parse_encoding( T42_Face face, + T42_Loader loader ); + + static void + t42_parse_charstrings( T42_Face face, + T42_Loader loader ); + + static void + t42_parse_sfnts( T42_Face face, + T42_Loader loader ); + + + /* as Type42 fonts have no Private dict, */ + /* we set the last argument of T1_FIELD_XXX to 0 */ + static const + T1_FieldRec t42_keywords[] = { + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontInfo +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, 0 ) + T1_FIELD_STRING( "Notice", notice, 0 ) + T1_FIELD_STRING( "FullName", full_name, 0 ) + T1_FIELD_STRING( "FamilyName", family_name, 0 ) + T1_FIELD_STRING( "Weight", weight, 0 ) + T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_KEY ( "FontName", font_name, 0 ) + T1_FIELD_NUM ( "PaintType", paint_type, 0 ) + T1_FIELD_NUM ( "FontType", font_type, 0 ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX("FontBBox", xMin, 0 ) + + T1_FIELD_CALLBACK( "FontMatrix", t42_parse_font_matrix, 0 ) + T1_FIELD_CALLBACK( "Encoding", t42_parse_encoding, 0 ) + T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings, 0 ) + T1_FIELD_CALLBACK( "sfnts", t42_parse_sfnts, 0 ) + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + +#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) +#define T1_Done_Table( p ) \ + do \ + { \ + if ( (p)->funcs.done ) \ + (p)->funcs.done( p ); \ + } while ( 0 ) +#define T1_Release_Table( p ) \ + do \ + { \ + if ( (p)->funcs.release ) \ + (p)->funcs.release( p ); \ + } while ( 0 ) + +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define T1_ToInt( p ) \ + (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToBytes( p, b, m, n, d ) \ + (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d ) + +#define T1_ToFixedArray( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define T1_ToToken( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) + +#define T1_Load_Field( p, f, o, m, pf ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) +#define T1_Load_Field_Table( p, f, o, m, pf ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) + + + /********************* Parsing Functions ******************/ + + FT_LOCAL_DEF( FT_Error ) + t42_parser_init( T42_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error = T42_Err_Ok; + FT_Long size; + + + psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); + + parser->stream = stream; + parser->base_len = 0; + parser->base_dict = 0; + parser->in_memory = 0; + + /*******************************************************************/ + /* */ + /* Here a short summary of what is going on: */ + /* */ + /* When creating a new Type 42 parser, we try to locate and load */ + /* the base dictionary, loading the whole font into memory. */ + /* */ + /* When `loading' the base dictionary, we only set up pointers */ + /* in the case of a memory-based stream. Otherwise, we allocate */ + /* and load the base dictionary in it. */ + /* */ + /* parser->in_memory is set if we have a memory stream. */ + /* */ + + if ( FT_STREAM_SEEK( 0L ) || + FT_FRAME_ENTER( 17 ) ) + goto Exit; + + if ( ft_memcmp( stream->cursor, "%!PS-TrueTypeFont", 17 ) != 0 ) + { + FT_TRACE2(( "not a Type42 font\n" )); + error = T42_Err_Unknown_File_Format; + } + + FT_FRAME_EXIT(); + + if ( error || FT_STREAM_SEEK( 0 ) ) + goto Exit; + + size = stream->size; + + /* now, try to load `size' bytes of the `base' dictionary we */ + /* found previously */ + + /* if it is a memory-based resource, set up pointers */ + if ( !stream->read ) + { + parser->base_dict = (FT_Byte*)stream->base + stream->pos; + parser->base_len = size; + parser->in_memory = 1; + + /* check that the `size' field is valid */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + else + { + /* read segment in memory */ + if ( FT_ALLOC( parser->base_dict, size ) || + FT_STREAM_READ( parser->base_dict, size ) ) + goto Exit; + + parser->base_len = size; + } + + parser->root.base = parser->base_dict; + parser->root.cursor = parser->base_dict; + parser->root.limit = parser->root.cursor + parser->base_len; + + Exit: + if ( error && !parser->in_memory ) + FT_FREE( parser->base_dict ); + + return error; + } + + + FT_LOCAL_DEF( void ) + t42_parser_done( T42_Parser parser ) + { + FT_Memory memory = parser->root.memory; + + + /* free the base dictionary only when we have a disk stream */ + if ( !parser->in_memory ) + FT_FREE( parser->base_dict ); + + parser->root.funcs.done( &parser->root ); + } + + + static int + t42_is_space( FT_Byte c ) + { + return ( c == ' ' || c == '\t' || + c == '\r' || c == '\n' || c == '\f' || + c == '\0' ); + } + + + static void + t42_parse_font_matrix( T42_Face face, + T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + FT_Matrix* matrix = &face->type1.font_matrix; + FT_Vector* offset = &face->type1.font_offset; + FT_Face root = (FT_Face)&face->root; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + + + (void)T1_ToFixedArray( parser, 6, temp, 3 ); + + temp_scale = FT_ABS( temp[3] ); + + /* Set Units per EM based on FontMatrix values. We set the value to */ + /* 1000 / temp_scale, because temp_scale was already multiplied by */ + /* 1000 (in t1_tofixed, from psobjs.c). */ + + root->units_per_EM = (FT_UShort)( FT_DivFix( 1000 * 0x10000L, + temp_scale ) >> 16 ); + + /* we need to scale the values by 1.0/temp_scale */ + if ( temp_scale != 0x10000L ) { + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = 0x10000L; + } + + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + /* note that the offsets must be expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + + static void + t42_parse_encoding( T42_Face face, + T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + if ( cur >= limit ) + { + FT_ERROR(( "t42_parse_encoding: out of bounds!\n" )); + parser->root.error = T42_Err_Invalid_File_Format; + return; + } + + /* if we have a number or `[', the encoding is an array, */ + /* and we must load it now */ + if ( ft_isdigit( *cur ) || *cur == '[' ) + { + T1_Encoding encode = &face->type1.encoding; + FT_UInt count, n; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Bool only_immediates = 0; + + + /* read the number of entries in the encoding; should be 256 */ + if ( *cur == '[' ) + { + count = 256; + only_immediates = 1; + parser->root.cursor++; + } + else + count = (FT_UInt)T1_ToInt( parser ); + + T1_Skip_Spaces( parser ); + if ( parser->root.cursor >= limit ) + return; + + /* we use a T1_Table to store our charnames */ + loader->num_chars = encode->num_chars = count; + if ( FT_NEW_ARRAY( encode->char_index, count ) || + FT_NEW_ARRAY( encode->char_name, count ) || + FT_SET_ERROR( psaux->ps_table_funcs->init( + char_table, count, memory ) ) ) + { + parser->root.error = error; + return; + } + + /* We need to `zero' out encoding_table.elements */ + for ( n = 0; n < count; n++ ) + { + char* notdef = (char *)".notdef"; + + + T1_Add_Table( char_table, n, notdef, 8 ); + } + + /* Now we need to read records of the form */ + /* */ + /* ... charcode /charname ... */ + /* */ + /* for each entry in our table. */ + /* */ + /* We simply look for a number followed by an immediate */ + /* name. Note that this ignores correctly the sequence */ + /* that is often seen in type42 fonts: */ + /* */ + /* 0 1 255 { 1 index exch /.notdef put } for dup */ + /* */ + /* used to clean the encoding array before anything else. */ + /* */ + /* Alternatively, if the array is directly given as */ + /* */ + /* /Encoding [ ... ] */ + /* */ + /* we only read immediates. */ + + n = 0; + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + cur = parser->root.cursor; + + /* we stop when we encounter `def' or `]' */ + if ( *cur == 'd' && cur + 3 < limit ) + { + if ( cur[1] == 'e' && + cur[2] == 'f' && + t42_is_space( cur[3] ) ) + { + FT_TRACE6(( "encoding end\n" )); + cur += 3; + break; + } + } + if ( *cur == ']' ) + { + FT_TRACE6(( "encoding end\n" )); + cur++; + break; + } + + /* check whether we have found an entry */ + if ( ft_isdigit( *cur ) || only_immediates ) + { + FT_Int charcode; + + + if ( only_immediates ) + charcode = n; + else + { + charcode = (FT_Int)T1_ToInt( parser ); + T1_Skip_Spaces( parser ); + } + + cur = parser->root.cursor; + + if ( *cur == '/' && cur + 2 < limit && n < count ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + + len = parser->root.cursor - cur; + + parser->root.error = T1_Add_Table( char_table, charcode, + cur, len + 1 ); + if ( parser->root.error ) + return; + char_table->elements[charcode][len] = '\0'; + + n++; + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + } + + T1_Skip_Spaces( parser ); + } + + face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; + parser->root.cursor = cur; + } + + /* Otherwise, we should have either `StandardEncoding', */ + /* `ExpertEncoding', or `ISOLatin1Encoding' */ + else + { + if ( cur + 17 < limit && + ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; + + else if ( cur + 15 < limit && + ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; + + else if ( cur + 18 < limit && + ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; + + else + { + FT_ERROR(( "t42_parse_encoding: invalid token!\n" )); + parser->root.error = T42_Err_Invalid_File_Format; + } + } + } + + + typedef enum T42_Load_Status_ + { + BEFORE_START, + BEFORE_TABLE_DIR, + OTHER_TABLES + + } T42_Load_Status; + + + static void + t42_parse_sfnts( T42_Face face, + T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + FT_Memory memory = parser->root.memory; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_Error error; + FT_Int num_tables = 0; + FT_ULong count, ttf_size = 0; + + FT_Long n, string_size, old_string_size, real_size; + FT_Byte* string_buf = NULL; + FT_Bool allocated = 0; + + T42_Load_Status status; + + + /* The format is */ + /* */ + /* /sfnts [ ... ] def */ + /* */ + /* or */ + /* */ + /* /sfnts [ */ + /* RD */ + /* RD */ + /* ... */ + /* ] def */ + /* */ + /* with exactly one space after the `RD' token. */ + + T1_Skip_Spaces( parser ); + + if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' ) + { + FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + T1_Skip_Spaces( parser ); + status = BEFORE_START; + string_size = 0; + old_string_size = 0; + count = 0; + + while ( parser->root.cursor < limit ) + { + cur = parser->root.cursor; + + if ( *cur == ']' ) + { + parser->root.cursor++; + goto Exit; + } + + else if ( *cur == '<' ) + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + /* don't include delimiters */ + string_size = (FT_Long)( ( parser->root.cursor - cur - 2 + 1 ) / 2 ); + if ( FT_REALLOC( string_buf, old_string_size, string_size ) ) + goto Fail; + + allocated = 1; + + parser->root.cursor = cur; + (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 ); + old_string_size = string_size; + string_size = real_size; + } + + else if ( ft_isdigit( *cur ) ) + { + if ( allocated ) + { + FT_ERROR(( "t42_parse_sfnts: " + "can't handle mixed binary and hex strings!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + string_size = T1_ToInt( parser ); + + T1_Skip_PS_Token( parser ); /* `RD' */ + if ( parser->root.error ) + return; + + string_buf = parser->root.cursor + 1; /* one space after `RD' */ + + parser->root.cursor += string_size + 1; + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_sfnts: too many binary data!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + } + + if ( !string_buf ) + { + FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + /* A string can have a trailing zero byte for padding. Ignore it. */ + if ( string_buf[string_size - 1] == 0 && ( string_size % 2 == 1 ) ) + string_size--; + + if ( !string_size ) + { + FT_ERROR(( "t42_parse_sfnts: invalid string!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + for ( n = 0; n < string_size; n++ ) + { + switch ( status ) + { + case BEFORE_START: + /* load offset table, 12 bytes */ + if ( count < 12 ) + { + face->ttf_data[count++] = string_buf[n]; + continue; + } + else + { + num_tables = 16 * face->ttf_data[4] + face->ttf_data[5]; + status = BEFORE_TABLE_DIR; + ttf_size = 12 + 16 * num_tables; + + if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) ) + goto Fail; + } + /* fall through */ + + case BEFORE_TABLE_DIR: + /* the offset table is read; read the table directory */ + if ( count < ttf_size ) + { + face->ttf_data[count++] = string_buf[n]; + continue; + } + else + { + int i; + FT_ULong len; + + + for ( i = 0; i < num_tables; i++ ) + { + FT_Byte* p = face->ttf_data + 12 + 16 * i + 12; + + + len = FT_PEEK_ULONG( p ); + + /* Pad to a 4-byte boundary length */ + ttf_size += ( len + 3 ) & ~3; + } + + status = OTHER_TABLES; + face->ttf_size = ttf_size; + + /* there are no more than 256 tables, so no size check here */ + if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables, + ttf_size + 1 ) ) + goto Fail; + } + /* fall through */ + + case OTHER_TABLES: + /* all other tables are just copied */ + if ( count >= ttf_size ) + { + FT_ERROR(( "t42_parse_sfnts: too many binary data!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + face->ttf_data[count++] = string_buf[n]; + } + } + + T1_Skip_Spaces( parser ); + } + + /* if control reaches this point, the format was not valid */ + error = T42_Err_Invalid_File_Format; + + Fail: + parser->root.error = error; + + Exit: + if ( allocated ) + FT_FREE( string_buf ); + } + + + static void + t42_parse_charstrings( T42_Face face, + T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + PS_Table code_table = &loader->charstrings; + PS_Table name_table = &loader->glyph_names; + PS_Table swap_table = &loader->swap_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_UInt n; + FT_UInt notdef_index = 0; + FT_Byte notdef_found = 0; + + + T1_Skip_Spaces( parser ); + + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + if ( ft_isdigit( *parser->root.cursor ) ) + { + loader->num_glyphs = (FT_UInt)T1_ToInt( parser ); + if ( parser->root.error ) + return; + } + else if ( *parser->root.cursor == '<' ) + { + /* We have `<< ... >>'. Count the number of `/' in the dictionary */ + /* to get its size. */ + FT_UInt count = 0; + + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + + while ( parser->root.cursor < limit ) + { + if ( *parser->root.cursor == '/' ) + count++; + else if ( *parser->root.cursor == '>' ) + { + loader->num_glyphs = count; + parser->root.cursor = cur; /* rewind */ + break; + } + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + } + } + else + { + FT_ERROR(( "t42_parse_charstrings: invalid token!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + /* initialize tables */ + + error = psaux->ps_table_funcs->init( code_table, + loader->num_glyphs, + memory ); + if ( error ) + goto Fail; + + error = psaux->ps_table_funcs->init( name_table, + loader->num_glyphs, + memory ); + if ( error ) + goto Fail; + + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + if ( error ) + goto Fail; + + n = 0; + + for (;;) + { + /* The format is simple: */ + /* `/glyphname' + index [+ def] */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + if ( cur >= limit ) + break; + + /* We stop when we find an `end' keyword or '>' */ + if ( *cur == 'e' && + cur + 3 < limit && + cur[1] == 'n' && + cur[2] == 'd' && + t42_is_space( cur[3] ) ) + break; + if ( *cur == '>' ) + break; + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + + if ( *cur == '/' ) + { + FT_PtrDist len; + + + if ( cur + 1 >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + cur++; /* skip `/' */ + len = parser->root.cursor - cur; + + error = T1_Add_Table( name_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + /* add a trailing zero to the name table */ + name_table->elements[n][len] = '\0'; + + /* record index of /.notdef */ + if ( *cur == '.' && + ft_strcmp( ".notdef", + (const char*)(name_table->elements[n]) ) == 0 ) + { + notdef_index = n; + notdef_found = 1; + } + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + + (void)T1_ToInt( parser ); + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + len = parser->root.cursor - cur; + + error = T1_Add_Table( code_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + code_table->elements[n][len] = '\0'; + + n++; + if ( n >= loader->num_glyphs ) + break; + } + } + + loader->num_glyphs = n; + + if ( !notdef_found ) + { + FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph!\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + /* if /.notdef does not occupy index 0, do our magic. */ + if ( ft_strcmp( (const char*)".notdef", + (const char*)name_table->elements[0] ) ) + { + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index */ + /* name and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ + + /* Index 0 name */ + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index 0 code */ + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index notdef_index name */ + error = T1_Add_Table( swap_table, 2, + name_table->elements[notdef_index], + name_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + /* Index notdef_index code */ + error = T1_Add_Table( swap_table, 3, + code_table->elements[notdef_index], + code_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, notdef_index, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, notdef_index, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + swap_table->elements[2], + swap_table->lengths [2] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + swap_table->elements[3], + swap_table->lengths [3] ); + if ( error ) + goto Fail; + + } + + return; + + Fail: + parser->root.error = error; + } + + + static FT_Error + t42_load_keyword( T42_Face face, + T42_Loader loader, + T1_Field field ) + { + FT_Error error; + void* dummy_object; + void** objects; + FT_UInt max_objects = 0; + + + /* if the keyword has a dedicated callback, call it */ + if ( field->type == T1_FIELD_TYPE_CALLBACK ) + { + field->reader( (FT_Face)face, loader ); + error = loader->parser.root.error; + goto Exit; + } + + /* now the keyword is either a simple field or a table of fields; */ + /* we are now going to take care of it */ + + switch ( field->location ) + { + case T1_FIELD_LOCATION_FONT_INFO: + dummy_object = &face->type1.font_info; + break; + + case T1_FIELD_LOCATION_BBOX: + dummy_object = &face->type1.font_bbox; + break; + + default: + dummy_object = &face->type1; + } + + objects = &dummy_object; + + if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || + field->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = T1_Load_Field_Table( &loader->parser, field, + objects, max_objects, 0 ); + else + error = T1_Load_Field( &loader->parser, field, + objects, max_objects, 0 ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + t42_parse_dict( T42_Face face, + T42_Loader loader, + FT_Byte* base, + FT_Long size ) + { + T42_Parser parser = &loader->parser; + FT_Byte* limit; + FT_Int n_keywords = (FT_Int)( sizeof ( t42_keywords ) / + sizeof ( t42_keywords[0] ) ); + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = T42_Err_Ok; + + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + FT_Byte* cur; + + + cur = parser->root.cursor; + + /* look for `FontDirectory' which causes problems for some fonts */ + if ( *cur == 'F' && cur + 25 < limit && + ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) + { + FT_Byte* cur2; + + + /* skip the `FontDirectory' keyword */ + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = cur2 = parser->root.cursor; + + /* look up the `known' keyword */ + while ( cur < limit ) + { + if ( *cur == 'k' && cur + 5 < limit && + ft_strncmp( (char*)cur, "known", 5 ) == 0 ) + break; + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } + + if ( cur < limit ) + { + T1_TokenRec token; + + + /* skip the `known' keyword and the token following it */ + T1_Skip_PS_Token( parser ); + T1_ToToken( parser, &token ); + + /* if the last token was an array, skip it! */ + if ( token.type == T1_TOKEN_TYPE_ARRAY ) + cur2 = parser->root.cursor; + } + parser->root.cursor = cur2; + } + + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) + { + int i; + + + /* now compare the immediate name to the keyword table */ + + /* loop through all known keywords */ + for ( i = 0; i < n_keywords; i++ ) + { + T1_Field keyword = (T1_Field)&t42_keywords[i]; + FT_Byte *name = (FT_Byte*)keyword->ident; + + + if ( !name ) + continue; + + if ( cur[0] == name[0] && + len == (FT_PtrDist)ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) + { + /* we found it -- run the parsing callback! */ + parser->root.error = t42_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + break; + } + } + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + } + + T1_Skip_Spaces( parser ); + } + + Exit: + return parser->root.error; + } + + + FT_LOCAL_DEF( void ) + t42_loader_init( T42_Loader loader, + T42_Face face ) + { + FT_UNUSED( face ); + + FT_MEM_ZERO( loader, sizeof ( *loader ) ); + loader->num_glyphs = 0; + loader->num_chars = 0; + + /* initialize the tables -- simply set their `init' field to 0 */ + loader->encoding_table.init = 0; + loader->charstrings.init = 0; + loader->glyph_names.init = 0; + } + + + FT_LOCAL_DEF( void ) + t42_loader_done( T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + + + /* finalize tables */ + T1_Release_Table( &loader->encoding_table ); + T1_Release_Table( &loader->charstrings ); + T1_Release_Table( &loader->glyph_names ); + T1_Release_Table( &loader->swap_table ); + + /* finalize parser */ + t42_parser_done( parser ); + } + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/t42parse.h b/src/3rdparty/freetype/src/type42/t42parse.h new file mode 100644 index 0000000000..f77ec4af4f --- /dev/null +++ b/src/3rdparty/freetype/src/type42/t42parse.h @@ -0,0 +1,90 @@ +/***************************************************************************/ +/* */ +/* t42parse.h */ +/* */ +/* Type 42 font parser (specification). */ +/* */ +/* Copyright 2002, 2003 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42PARSE_H__ +#define __T42PARSE_H__ + + +#include "t42objs.h" +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + typedef struct T42_ParserRec_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* base_dict; + FT_Long base_len; + + FT_Bool in_memory; + + } T42_ParserRec, *T42_Parser; + + + typedef struct T42_Loader_ + { + T42_ParserRec parser; /* parser used to read the stream */ + + FT_UInt num_chars; /* number of characters in encoding */ + PS_TableRec encoding_table; /* PS_Table used to store the */ + /* encoding character names */ + + FT_UInt num_glyphs; + PS_TableRec glyph_names; + PS_TableRec charstrings; + PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ + + } T42_LoaderRec, *T42_Loader; + + + FT_LOCAL( FT_Error ) + t42_parser_init( T42_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( void ) + t42_parser_done( T42_Parser parser ); + + + FT_LOCAL( FT_Error ) + t42_parse_dict( T42_Face face, + T42_Loader loader, + FT_Byte* base, + FT_Long size ); + + + FT_LOCAL( void ) + t42_loader_init( T42_Loader loader, + T42_Face face ); + + FT_LOCAL( void ) + t42_loader_done( T42_Loader loader ); + + + /* */ + +FT_END_HEADER + + +#endif /* __T42PARSE_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/t42types.h b/src/3rdparty/freetype/src/type42/t42types.h new file mode 100644 index 0000000000..c7c2db490d --- /dev/null +++ b/src/3rdparty/freetype/src/type42/t42types.h @@ -0,0 +1,56 @@ +/***************************************************************************/ +/* */ +/* t42types.h */ +/* */ +/* Type 42 font data types (specification only). */ +/* */ +/* Copyright 2002, 2003, 2006, 2008 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42TYPES_H__ +#define __T42TYPES_H__ + + +#include +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + typedef struct T42_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; +#if 0 + const void* afm_data; +#endif + FT_Byte* ttf_data; + FT_ULong ttf_size; + FT_Face ttf_face; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + PS_UnicodesRec unicode_map; + + } T42_FaceRec, *T42_Face; + + +FT_END_HEADER + +#endif /* __T42TYPES_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/type42/type42.c b/src/3rdparty/freetype/src/type42/type42.c new file mode 100644 index 0000000000..d13df56b10 --- /dev/null +++ b/src/3rdparty/freetype/src/type42/type42.c @@ -0,0 +1,25 @@ +/***************************************************************************/ +/* */ +/* type42.c */ +/* */ +/* FreeType Type 42 driver component. */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include +#include "t42objs.c" +#include "t42parse.c" +#include "t42drivr.c" + +/* END */ diff --git a/src/3rdparty/freetype/src/winfonts/Jamfile b/src/3rdparty/freetype/src/winfonts/Jamfile new file mode 100644 index 0000000000..71cf5678e8 --- /dev/null +++ b/src/3rdparty/freetype/src/winfonts/Jamfile @@ -0,0 +1,16 @@ +# FreeType 2 src/winfonts Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) winfonts ; + +Library $(FT2_LIB) : winfnt.c ; + +# end of src/winfonts Jamfile diff --git a/src/3rdparty/freetype/src/winfonts/fnterrs.h b/src/3rdparty/freetype/src/winfonts/fnterrs.h new file mode 100644 index 0000000000..ea80909715 --- /dev/null +++ b/src/3rdparty/freetype/src/winfonts/fnterrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* fnterrs.h */ +/* */ +/* Win FNT/FON error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Windows FNT/FON error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __FNTERRS_H__ +#define __FNTERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX FNT_Err_ +#define FT_ERR_BASE FT_Mod_Err_Winfonts + +#include FT_ERRORS_H + +#endif /* __FNTERRS_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/src/winfonts/module.mk b/src/3rdparty/freetype/src/winfonts/module.mk new file mode 100644 index 0000000000..b44d7f0570 --- /dev/null +++ b/src/3rdparty/freetype/src/winfonts/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Windows FNT/FON module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += WINDOWS_DRIVER + +define WINDOWS_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, winfnt_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)winfnt $(ECHO_DRIVER_DESC)Windows bitmap fonts with extension *.fnt or *.fon$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/src/3rdparty/freetype/src/winfonts/rules.mk b/src/3rdparty/freetype/src/winfonts/rules.mk new file mode 100644 index 0000000000..71a7df2d8a --- /dev/null +++ b/src/3rdparty/freetype/src/winfonts/rules.mk @@ -0,0 +1,65 @@ +# +# FreeType 2 Windows FNT/FON driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Windows driver directory +# +FNT_DIR := $(SRC_DIR)/winfonts + + +FNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(FNT_DIR)) + + +# Windows driver sources (i.e., C files) +# +FNT_DRV_SRC := $(FNT_DIR)/winfnt.c + +# Windows driver headers +# +FNT_DRV_H := $(FNT_DRV_SRC:%.c=%.h) \ + $(FNT_DIR)/fnterrs.h + + +# Windows driver object(s) +# +# FNT_DRV_OBJ_M is used during `multi' builds +# FNT_DRV_OBJ_S is used during `single' builds +# +FNT_DRV_OBJ_M := $(FNT_DRV_SRC:$(FNT_DIR)/%.c=$(OBJ_DIR)/%.$O) +FNT_DRV_OBJ_S := $(OBJ_DIR)/winfnt.$O + +# Windows driver source file for single build +# +FNT_DRV_SRC_S := $(FNT_DIR)/winfnt.c + + +# Windows driver - single object +# +$(FNT_DRV_OBJ_S): $(FNT_DRV_SRC_S) $(FNT_DRV_SRC) $(FREETYPE_H) $(FNT_DRV_H) + $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(FNT_DRV_SRC_S)) + + +# Windows driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(FNT_DIR)/%.c $(FREETYPE_H) $(FNT_DRV_H) + $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(FNT_DRV_OBJ_S) +DRV_OBJS_M += $(FNT_DRV_OBJ_M) + + +# EOF diff --git a/src/3rdparty/freetype/src/winfonts/winfnt.c b/src/3rdparty/freetype/src/winfonts/winfnt.c new file mode 100644 index 0000000000..f6e9859b44 --- /dev/null +++ b/src/3rdparty/freetype/src/winfonts/winfnt.c @@ -0,0 +1,1135 @@ +/***************************************************************************/ +/* */ +/* winfnt.c */ +/* */ +/* FreeType font driver for Windows FNT/FON files */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* Copyright 2003 Huw D M Davies for Codeweavers */ +/* Copyright 2007 Dmitry Timoshkov for Codeweavers */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_WINFONTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H + +#include "winfnt.h" +#include "fnterrs.h" +#include FT_SERVICE_WINFNT_H +#include FT_SERVICE_XFREE86_NAME_H + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_winfnt + + + static const FT_Frame_Field winmz_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinMZ_HeaderRec + + FT_FRAME_START( 64 ), + FT_FRAME_USHORT_LE ( magic ), + FT_FRAME_SKIP_BYTES( 29 * 2 ), + FT_FRAME_ULONG_LE ( lfanew ), + FT_FRAME_END + }; + + static const FT_Frame_Field winne_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinNE_HeaderRec + + FT_FRAME_START( 40 ), + FT_FRAME_USHORT_LE ( magic ), + FT_FRAME_SKIP_BYTES( 34 ), + FT_FRAME_USHORT_LE ( resource_tab_offset ), + FT_FRAME_USHORT_LE ( rname_tab_offset ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe32_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE32_HeaderRec + + FT_FRAME_START( 248 ), + FT_FRAME_ULONG_LE ( magic ), /* PE00 */ + FT_FRAME_USHORT_LE ( machine ), /* 0x014c - i386 */ + FT_FRAME_USHORT_LE ( number_of_sections ), + FT_FRAME_SKIP_BYTES( 12 ), + FT_FRAME_USHORT_LE ( size_of_optional_header ), + FT_FRAME_SKIP_BYTES( 2 ), + FT_FRAME_USHORT_LE ( magic32 ), /* 0x10b */ + FT_FRAME_SKIP_BYTES( 110 ), + FT_FRAME_ULONG_LE ( rsrc_virtual_address ), + FT_FRAME_ULONG_LE ( rsrc_size ), + FT_FRAME_SKIP_BYTES( 104 ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe32_section_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE32_SectionRec + + FT_FRAME_START( 40 ), + FT_FRAME_BYTES ( name, 8 ), + FT_FRAME_SKIP_BYTES( 4 ), + FT_FRAME_ULONG_LE ( virtual_address ), + FT_FRAME_ULONG_LE ( size_of_raw_data ), + FT_FRAME_ULONG_LE ( pointer_to_raw_data ), + FT_FRAME_SKIP_BYTES( 16 ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_dir_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDirRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE ( characteristics ), + FT_FRAME_ULONG_LE ( time_date_stamp ), + FT_FRAME_USHORT_LE( major_version ), + FT_FRAME_USHORT_LE( minor_version ), + FT_FRAME_USHORT_LE( number_of_named_entries ), + FT_FRAME_USHORT_LE( number_of_id_entries ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_dir_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDirEntryRec + + FT_FRAME_START( 8 ), + FT_FRAME_ULONG_LE( name ), + FT_FRAME_ULONG_LE( offset ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_data_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDataEntryRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE( offset_to_data ), + FT_FRAME_ULONG_LE( size ), + FT_FRAME_ULONG_LE( code_page ), + FT_FRAME_ULONG_LE( reserved ), + FT_FRAME_END + }; + + static const FT_Frame_Field winfnt_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_WinFNT_HeaderRec + + FT_FRAME_START( 148 ), + FT_FRAME_USHORT_LE( version ), + FT_FRAME_ULONG_LE ( file_size ), + FT_FRAME_BYTES ( copyright, 60 ), + FT_FRAME_USHORT_LE( file_type ), + FT_FRAME_USHORT_LE( nominal_point_size ), + FT_FRAME_USHORT_LE( vertical_resolution ), + FT_FRAME_USHORT_LE( horizontal_resolution ), + FT_FRAME_USHORT_LE( ascent ), + FT_FRAME_USHORT_LE( internal_leading ), + FT_FRAME_USHORT_LE( external_leading ), + FT_FRAME_BYTE ( italic ), + FT_FRAME_BYTE ( underline ), + FT_FRAME_BYTE ( strike_out ), + FT_FRAME_USHORT_LE( weight ), + FT_FRAME_BYTE ( charset ), + FT_FRAME_USHORT_LE( pixel_width ), + FT_FRAME_USHORT_LE( pixel_height ), + FT_FRAME_BYTE ( pitch_and_family ), + FT_FRAME_USHORT_LE( avg_width ), + FT_FRAME_USHORT_LE( max_width ), + FT_FRAME_BYTE ( first_char ), + FT_FRAME_BYTE ( last_char ), + FT_FRAME_BYTE ( default_char ), + FT_FRAME_BYTE ( break_char ), + FT_FRAME_USHORT_LE( bytes_per_row ), + FT_FRAME_ULONG_LE ( device_offset ), + FT_FRAME_ULONG_LE ( face_name_offset ), + FT_FRAME_ULONG_LE ( bits_pointer ), + FT_FRAME_ULONG_LE ( bits_offset ), + FT_FRAME_BYTE ( reserved ), + FT_FRAME_ULONG_LE ( flags ), + FT_FRAME_USHORT_LE( A_space ), + FT_FRAME_USHORT_LE( B_space ), + FT_FRAME_USHORT_LE( C_space ), + FT_FRAME_ULONG_LE ( color_table_offset ), + FT_FRAME_BYTES ( reserved1, 16 ), + FT_FRAME_END + }; + + + static void + fnt_font_done( FNT_Face face ) + { + FT_Memory memory = FT_FACE( face )->memory; + FT_Stream stream = FT_FACE( face )->stream; + FNT_Font font = face->font; + + + if ( !font ) + return; + + if ( font->fnt_frame ) + FT_FRAME_RELEASE( font->fnt_frame ); + FT_FREE( font->family_name ); + + FT_FREE( font ); + face->font = 0; + } + + + static FT_Error + fnt_font_load( FNT_Font font, + FT_Stream stream ) + { + FT_Error error; + FT_WinFNT_Header header = &font->header; + FT_Bool new_format; + FT_UInt size; + + + /* first of all, read the FNT header */ + if ( FT_STREAM_SEEK( font->offset ) || + FT_STREAM_READ_FIELDS( winfnt_header_fields, header ) ) + goto Exit; + + /* check header */ + if ( header->version != 0x200 && + header->version != 0x300 ) + { + FT_TRACE2(( "[not a valid FNT file]\n" )); + error = FNT_Err_Unknown_File_Format; + goto Exit; + } + + new_format = FT_BOOL( font->header.version == 0x300 ); + size = new_format ? 148 : 118; + + if ( header->file_size < size ) + { + FT_TRACE2(( "[not a valid FNT file]\n" )); + error = FNT_Err_Unknown_File_Format; + goto Exit; + } + + /* Version 2 doesn't have these fields */ + if ( header->version == 0x200 ) + { + header->flags = 0; + header->A_space = 0; + header->B_space = 0; + header->C_space = 0; + + header->color_table_offset = 0; + } + + if ( header->file_type & 1 ) + { + FT_TRACE2(( "[can't handle vector FNT fonts]\n" )); + error = FNT_Err_Unknown_File_Format; + goto Exit; + } + + /* this is a FNT file/table; extract its frame */ + if ( FT_STREAM_SEEK( font->offset ) || + FT_FRAME_EXTRACT( header->file_size, font->fnt_frame ) ) + goto Exit; + + Exit: + return error; + } + + + static FT_Error + fnt_face_get_dll_font( FNT_Face face, + FT_Int face_index ) + { + FT_Error error; + FT_Stream stream = FT_FACE( face )->stream; + FT_Memory memory = FT_FACE( face )->memory; + WinMZ_HeaderRec mz_header; + + + face->font = 0; + + /* does it begin with an MZ header? */ + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) ) + goto Exit; + + error = FNT_Err_Unknown_File_Format; + if ( mz_header.magic == WINFNT_MZ_MAGIC ) + { + /* yes, now look for an NE header in the file */ + WinNE_HeaderRec ne_header; + + + FT_TRACE2(( "MZ signature found\n" )); + + if ( FT_STREAM_SEEK( mz_header.lfanew ) || + FT_STREAM_READ_FIELDS( winne_header_fields, &ne_header ) ) + goto Exit; + + error = FNT_Err_Unknown_File_Format; + if ( ne_header.magic == WINFNT_NE_MAGIC ) + { + /* good, now look into the resource table for each FNT resource */ + FT_ULong res_offset = mz_header.lfanew + + ne_header.resource_tab_offset; + FT_UShort size_shift; + FT_UShort font_count = 0; + FT_ULong font_offset = 0; + + + FT_TRACE2(( "NE signature found\n" )); + + if ( FT_STREAM_SEEK( res_offset ) || + FT_FRAME_ENTER( ne_header.rname_tab_offset - + ne_header.resource_tab_offset ) ) + goto Exit; + + size_shift = FT_GET_USHORT_LE(); + + for (;;) + { + FT_UShort type_id, count; + + + type_id = FT_GET_USHORT_LE(); + if ( !type_id ) + break; + + count = FT_GET_USHORT_LE(); + + if ( type_id == 0x8008U ) + { + font_count = count; + font_offset = (FT_ULong)( FT_STREAM_POS() + 4 + + ( stream->cursor - stream->limit ) ); + break; + } + + stream->cursor += 4 + count * 12; + } + + FT_FRAME_EXIT(); + + if ( !font_count || !font_offset ) + { + FT_TRACE2(( "this file doesn't contain any FNT resources!\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + /* loading `winfnt_header_fields' needs at least 118 bytes; */ + /* use this as a rough measure to check the expected font size */ + if ( font_count * 118UL > stream->size ) + { + FT_TRACE2(( "invalid number of faces\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + face->root.num_faces = font_count; + + if ( face_index >= font_count ) + { + error = FNT_Err_Invalid_Argument; + goto Exit; + } + else if ( face_index < 0 ) + goto Exit; + + if ( FT_NEW( face->font ) ) + goto Exit; + + if ( FT_STREAM_SEEK( font_offset + face_index * 12 ) || + FT_FRAME_ENTER( 12 ) ) + goto Fail; + + face->font->offset = (FT_ULong)FT_GET_USHORT_LE() << size_shift; + face->font->fnt_size = (FT_ULong)FT_GET_USHORT_LE() << size_shift; + + stream->cursor += 8; + + FT_FRAME_EXIT(); + + error = fnt_font_load( face->font, stream ); + } + else if ( ne_header.magic == WINFNT_PE_MAGIC ) + { + WinPE32_HeaderRec pe32_header; + WinPE32_SectionRec pe32_section; + WinPE_RsrcDirRec root_dir, name_dir, lang_dir; + WinPE_RsrcDirEntryRec dir_entry1, dir_entry2, dir_entry3; + WinPE_RsrcDataEntryRec data_entry; + + FT_Long root_dir_offset, name_dir_offset, lang_dir_offset; + FT_UShort i, j, k; + + + FT_TRACE2(( "PE signature found\n" )); + + if ( FT_STREAM_SEEK( mz_header.lfanew ) || + FT_STREAM_READ_FIELDS( winpe32_header_fields, &pe32_header ) ) + goto Exit; + + FT_TRACE2(( "magic %04lx, machine %02x, number_of_sections %u, " + "size_of_optional_header %02x\n" + "magic32 %02x, rsrc_virtual_address %04lx, " + "rsrc_size %04lx\n", + pe32_header.magic, pe32_header.machine, + pe32_header.number_of_sections, + pe32_header.size_of_optional_header, + pe32_header.magic32, pe32_header.rsrc_virtual_address, + pe32_header.rsrc_size )); + + if ( pe32_header.magic != WINFNT_PE_MAGIC /* check full signature */ || + pe32_header.machine != 0x014c /* i386 */ || + pe32_header.size_of_optional_header != 0xe0 /* FIXME */ || + pe32_header.magic32 != 0x10b ) + { + FT_TRACE2(( "this file has an invalid PE header\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + face->root.num_faces = 0; + + for ( i = 0; i < pe32_header.number_of_sections; i++ ) + { + if ( FT_STREAM_READ_FIELDS( winpe32_section_fields, + &pe32_section ) ) + goto Exit; + + FT_TRACE2(( "name %.8s, va %04lx, size %04lx, offset %04lx\n", + pe32_section.name, pe32_section.virtual_address, + pe32_section.size_of_raw_data, + pe32_section.pointer_to_raw_data )); + + if ( pe32_header.rsrc_virtual_address == + pe32_section.virtual_address ) + goto Found_rsrc_section; + } + + FT_TRACE2(( "this file doesn't contain any resources\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + + Found_rsrc_section: + FT_TRACE2(( "found resources section %.8s\n", pe32_section.name )); + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &root_dir ) ) + goto Exit; + + root_dir_offset = pe32_section.pointer_to_raw_data; + + for ( i = 0; i < root_dir.number_of_named_entries + + root_dir.number_of_id_entries; i++ ) + { + if ( FT_STREAM_SEEK( root_dir_offset + 16 + i * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry1 ) ) + goto Exit; + + if ( !(dir_entry1.offset & 0x80000000UL ) /* DataIsDirectory */ ) + { + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + dir_entry1.offset &= ~0x80000000UL; + + name_dir_offset = pe32_section.pointer_to_raw_data + + dir_entry1.offset; + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data + + dir_entry1.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &name_dir ) ) + goto Exit; + + for ( j = 0; j < name_dir.number_of_named_entries + + name_dir.number_of_id_entries; j++ ) + { + if ( FT_STREAM_SEEK( name_dir_offset + 16 + j * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry2 ) ) + goto Exit; + + if ( !(dir_entry2.offset & 0x80000000UL ) /* DataIsDirectory */ ) + { + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + dir_entry2.offset &= ~0x80000000UL; + + lang_dir_offset = pe32_section.pointer_to_raw_data + + dir_entry2.offset; + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data + + dir_entry2.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &lang_dir ) ) + goto Exit; + + for ( k = 0; k < lang_dir.number_of_named_entries + + lang_dir.number_of_id_entries; k++ ) + { + if ( FT_STREAM_SEEK( lang_dir_offset + 16 + k * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry3 ) ) + goto Exit; + + if ( dir_entry2.offset & 0x80000000UL /* DataIsDirectory */ ) + { + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( dir_entry1.name == 8 /* RT_FONT */ ) + { + if ( FT_STREAM_SEEK( root_dir_offset + dir_entry3.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_data_entry_fields, + &data_entry ) ) + goto Exit; + + FT_TRACE2(( "found font #%lu, offset %04lx, " + "size %04lx, cp %lu\n", + dir_entry2.name, + pe32_section.pointer_to_raw_data + + data_entry.offset_to_data - + pe32_section.virtual_address, + data_entry.size, data_entry.code_page )); + + if ( face_index == face->root.num_faces ) + { + if ( FT_NEW( face->font ) ) + goto Exit; + + face->font->offset = pe32_section.pointer_to_raw_data + + data_entry.offset_to_data - + pe32_section.virtual_address; + face->font->fnt_size = data_entry.size; + + error = fnt_font_load( face->font, stream ); + if ( error ) + { + FT_TRACE2(( "font #%lu load error %d\n", + dir_entry2.name, error )); + goto Fail; + } + else + FT_TRACE2(( "font #%lu successfully loaded\n", + dir_entry2.name )); + } + + face->root.num_faces++; + } + } + } + } + } + + if ( !face->root.num_faces ) + { + FT_TRACE2(( "this file doesn't contain any RT_FONT resources\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( face_index >= face->root.num_faces ) + { + error = FNT_Err_Invalid_Argument; + goto Exit; + } + } + + Fail: + if ( error ) + fnt_font_done( face ); + + Exit: + return error; + } + + + typedef struct FNT_CMapRec_ + { + FT_CMapRec cmap; + FT_UInt32 first; + FT_UInt32 count; + + } FNT_CMapRec, *FNT_CMap; + + + static FT_Error + fnt_cmap_init( FNT_CMap cmap ) + { + FNT_Face face = (FNT_Face)FT_CMAP_FACE( cmap ); + FNT_Font font = face->font; + + + cmap->first = (FT_UInt32) font->header.first_char; + cmap->count = (FT_UInt32)( font->header.last_char - cmap->first + 1 ); + + return 0; + } + + + static FT_UInt + fnt_cmap_char_index( FNT_CMap cmap, + FT_UInt32 char_code ) + { + FT_UInt gindex = 0; + + + char_code -= cmap->first; + if ( char_code < cmap->count ) + /* we artificially increase the glyph index; */ + /* FNT_Load_Glyph reverts to the right one */ + gindex = (FT_UInt)( char_code + 1 ); + return gindex; + } + + + static FT_UInt + fnt_cmap_char_next( FNT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + if ( char_code <= cmap->first ) + { + result = cmap->first; + gindex = 1; + } + else + { + char_code -= cmap->first; + if ( char_code < cmap->count ) + { + result = cmap->first + char_code; + gindex = (FT_UInt)( char_code + 1 ); + } + } + + *pchar_code = result; + return gindex; + } + + + static const FT_CMap_ClassRec fnt_cmap_class_rec = + { + sizeof ( FNT_CMapRec ), + + (FT_CMap_InitFunc) fnt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)fnt_cmap_char_index, + (FT_CMap_CharNextFunc) fnt_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + static FT_CMap_Class const fnt_cmap_class = &fnt_cmap_class_rec; + + + static void + FNT_Face_Done( FNT_Face face ) + { + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + fnt_font_done( face ); + + FT_FREE( face->root.available_sizes ); + face->root.num_fixed_sizes = 0; + } + + + static FT_Error + FNT_Face_Init( FT_Stream stream, + FNT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + /* try to load font from a DLL */ + error = fnt_face_get_dll_font( face, face_index ); + if ( !error && face_index < 0 ) + goto Exit; + + if ( error == FNT_Err_Unknown_File_Format ) + { + /* this didn't work; try to load a single FNT font */ + FNT_Font font; + + if ( FT_NEW( face->font ) ) + goto Exit; + + face->root.num_faces = 1; + + font = face->font; + font->offset = 0; + font->fnt_size = stream->size; + + error = fnt_font_load( font, stream ); + + if ( !error ) + { + if ( face_index > 0 ) + error = FNT_Err_Invalid_Argument; + else if ( face_index < 0 ) + goto Exit; + } + } + + if ( error ) + goto Fail; + + /* we now need to fill the root FT_Face fields */ + /* with relevant information */ + { + FT_Face root = FT_FACE( face ); + FNT_Font font = face->font; + FT_PtrDist family_size; + + + root->face_index = face_index; + + root->face_flags = FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL; + + if ( font->header.avg_width == font->header.max_width ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( font->header.italic ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + if ( font->header.weight >= 800 ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + + /* set up the `fixed_sizes' array */ + if ( FT_NEW_ARRAY( root->available_sizes, 1 ) ) + goto Fail; + + root->num_fixed_sizes = 1; + + { + FT_Bitmap_Size* bsize = root->available_sizes; + FT_UShort x_res, y_res; + + + bsize->width = font->header.avg_width; + bsize->height = (FT_Short)( + font->header.pixel_height + font->header.external_leading ); + bsize->size = font->header.nominal_point_size << 6; + + x_res = font->header.horizontal_resolution; + if ( !x_res ) + x_res = 72; + + y_res = font->header.vertical_resolution; + if ( !y_res ) + y_res = 72; + + bsize->y_ppem = FT_MulDiv( bsize->size, y_res, 72 ); + bsize->y_ppem = FT_PIX_ROUND( bsize->y_ppem ); + + /* + * this reads: + * + * the nominal height is larger than the bbox's height + * + * => nominal_point_size contains incorrect value; + * use pixel_height as the nominal height + */ + if ( bsize->y_ppem > ( font->header.pixel_height << 6 ) ) + { + FT_TRACE2(( "use pixel_height as the nominal height\n" )); + + bsize->y_ppem = font->header.pixel_height << 6; + bsize->size = FT_MulDiv( bsize->y_ppem, 72, y_res ); + } + + bsize->x_ppem = FT_MulDiv( bsize->size, x_res, 72 ); + bsize->x_ppem = FT_PIX_ROUND( bsize->x_ppem ); + } + + { + FT_CharMapRec charmap; + + + charmap.encoding = FT_ENCODING_NONE; + charmap.platform_id = 0; + charmap.encoding_id = 0; + charmap.face = root; + + if ( font->header.charset == FT_WinFNT_ID_MAC ) + { + charmap.encoding = FT_ENCODING_APPLE_ROMAN; + charmap.platform_id = 1; +/* charmap.encoding_id = 0; */ + } + + error = FT_CMap_New( fnt_cmap_class, + NULL, + &charmap, + NULL ); + if ( error ) + goto Fail; + + /* Select default charmap */ + if ( root->num_charmaps ) + root->charmap = root->charmaps[0]; + } + + /* setup remaining flags */ + + /* reserve one slot for the .notdef glyph at index 0 */ + root->num_glyphs = font->header.last_char - + font->header.first_char + 1 + 1; + + if ( font->header.face_name_offset >= font->header.file_size ) + { + FT_TRACE2(( "invalid family name offset!\n" )); + error = FNT_Err_Invalid_File_Format; + goto Fail; + } + family_size = font->header.file_size - font->header.face_name_offset; + /* Some broken fonts don't delimit the face name with a final */ + /* NULL byte -- the frame is erroneously one byte too small. */ + /* We thus allocate one more byte, setting it explicitly to */ + /* zero. */ + if ( FT_ALLOC( font->family_name, family_size + 1 ) ) + goto Fail; + + FT_MEM_COPY( font->family_name, + font->fnt_frame + font->header.face_name_offset, + family_size ); + + font->family_name[family_size] = '\0'; + + if ( FT_REALLOC( font->family_name, + family_size, + ft_strlen( font->family_name ) + 1 ) ) + goto Fail; + + root->family_name = font->family_name; + root->style_name = (char *)"Regular"; + + if ( root->style_flags & FT_STYLE_FLAG_BOLD ) + { + if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Bold Italic"; + else + root->style_name = (char *)"Bold"; + } + else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Italic"; + } + goto Exit; + + Fail: + FNT_Face_Done( face ); + + Exit: + return error; + } + + + static FT_Error + FNT_Size_Select( FT_Size size ) + { + FNT_Face face = (FNT_Face)size->face; + FT_WinFNT_Header header = &face->font->header; + + + FT_Select_Metrics( size->face, 0 ); + + size->metrics.ascender = header->ascent * 64; + size->metrics.descender = -( header->pixel_height - + header->ascent ) * 64; + size->metrics.max_advance = header->max_width * 64; + + return FNT_Err_Ok; + } + + + static FT_Error + FNT_Size_Request( FT_Size size, + FT_Size_Request req ) + { + FNT_Face face = (FNT_Face)size->face; + FT_WinFNT_Header header = &face->font->header; + FT_Bitmap_Size* bsize = size->face->available_sizes; + FT_Error error = FNT_Err_Invalid_Pixel_Size; + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = FNT_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == header->pixel_height ) + error = FNT_Err_Ok; + break; + + default: + error = FNT_Err_Unimplemented_Feature; + break; + } + + if ( error ) + return error; + else + return FNT_Size_Select( size ); + } + + + static FT_Error + FNT_Load_Glyph( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FNT_Face face = (FNT_Face)FT_SIZE_FACE( size ); + FNT_Font font = face->font; + FT_Error error = FNT_Err_Ok; + FT_Byte* p; + FT_Int len; + FT_Bitmap* bitmap = &slot->bitmap; + FT_ULong offset; + FT_Bool new_format; + + FT_UNUSED( load_flags ); + + + if ( !face || !font || + glyph_index >= (FT_UInt)( FT_FACE( face )->num_glyphs ) ) + { + error = FNT_Err_Invalid_Argument; + goto Exit; + } + + if ( glyph_index > 0 ) + glyph_index--; /* revert to real index */ + else + glyph_index = font->header.default_char; /* the .notdef glyph */ + + new_format = FT_BOOL( font->header.version == 0x300 ); + len = new_format ? 6 : 4; + + /* jump to glyph entry */ + p = font->fnt_frame + ( new_format ? 148 : 118 ) + len * glyph_index; + + bitmap->width = FT_NEXT_SHORT_LE( p ); + + if ( new_format ) + offset = FT_NEXT_ULONG_LE( p ); + else + offset = FT_NEXT_USHORT_LE( p ); + + if ( offset >= font->header.file_size ) + { + FT_TRACE2(( "invalid FNT offset!\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + /* jump to glyph data */ + p = font->fnt_frame + /* font->header.bits_offset */ + offset; + + /* allocate and build bitmap */ + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + FT_Int pitch = ( bitmap->width + 7 ) >> 3; + FT_Byte* column; + FT_Byte* write; + + + bitmap->pitch = pitch; + bitmap->rows = font->header.pixel_height; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + + if ( offset + pitch * bitmap->rows >= font->header.file_size ) + { + FT_TRACE2(( "invalid bitmap width\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + /* note: since glyphs are stored in columns and not in rows we */ + /* can't use ft_glyphslot_set_bitmap */ + if ( FT_ALLOC_MULT( bitmap->buffer, pitch, bitmap->rows ) ) + goto Exit; + + column = (FT_Byte*)bitmap->buffer; + + for ( ; pitch > 0; pitch--, column++ ) + { + FT_Byte* limit = p + bitmap->rows; + + + for ( write = column; p < limit; p++, write += bitmap->pitch ) + *write = *p; + } + } + + slot->internal->flags = FT_GLYPH_OWN_BITMAP; + slot->bitmap_left = 0; + slot->bitmap_top = font->header.ascent; + slot->format = FT_GLYPH_FORMAT_BITMAP; + + /* now set up metrics */ + slot->metrics.width = bitmap->width << 6; + slot->metrics.height = bitmap->rows << 6; + slot->metrics.horiAdvance = bitmap->width << 6; + slot->metrics.horiBearingX = 0; + slot->metrics.horiBearingY = slot->bitmap_top << 6; + + ft_synthesize_vertical_metrics( &slot->metrics, + bitmap->rows << 6 ); + + Exit: + return error; + } + + + static FT_Error + winfnt_get_header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ) + { + FNT_Font font = ((FNT_Face)face)->font; + + + *aheader = font->header; + + return 0; + } + + + static const FT_Service_WinFntRec winfnt_service_rec = + { + winfnt_get_header + }; + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec winfnt_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_WINFNT }, + { FT_SERVICE_ID_WINFNT, &winfnt_service_rec }, + { NULL, NULL } + }; + + + static FT_Module_Interface + winfnt_get_service( FT_Driver driver, + const FT_String* service_id ) + { + FT_UNUSED( driver ); + + return ft_service_list_lookup( winfnt_services, service_id ); + } + + + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec winfnt_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + sizeof ( FT_DriverRec ), + + "winfonts", + 0x10000L, + 0x20000L, + + 0, + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) winfnt_get_service + }, + + sizeof( FNT_FaceRec ), + sizeof( FT_SizeRec ), + sizeof( FT_GlyphSlotRec ), + + (FT_Face_InitFunc) FNT_Face_Init, + (FT_Face_DoneFunc) FNT_Face_Done, + (FT_Size_InitFunc) 0, + (FT_Size_DoneFunc) 0, + (FT_Slot_InitFunc) 0, + (FT_Slot_DoneFunc) 0, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + (FT_Slot_LoadFunc) FNT_Load_Glyph, + + (FT_Face_GetKerningFunc) 0, + (FT_Face_AttachFunc) 0, + (FT_Face_GetAdvancesFunc) 0, + + (FT_Size_RequestFunc) FNT_Size_Request, + (FT_Size_SelectFunc) FNT_Size_Select + }; + + +/* END */ diff --git a/src/3rdparty/freetype/src/winfonts/winfnt.h b/src/3rdparty/freetype/src/winfonts/winfnt.h new file mode 100644 index 0000000000..ca75c9501a --- /dev/null +++ b/src/3rdparty/freetype/src/winfonts/winfnt.h @@ -0,0 +1,167 @@ +/***************************************************************************/ +/* */ +/* winfnt.h */ +/* */ +/* FreeType font driver for Windows FNT/FON files */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* Copyright 2007 Dmitry Timoshkov for Codeweavers */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __WINFNT_H__ +#define __WINFNT_H__ + + +#include +#include FT_WINFONTS_H +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + typedef struct WinMZ_HeaderRec_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort lfanew; + + } WinMZ_HeaderRec; + + + typedef struct WinNE_HeaderRec_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort resource_tab_offset; + FT_UShort rname_tab_offset; + + } WinNE_HeaderRec; + + + typedef struct WinPE32_HeaderRec_ + { + FT_ULong magic; + FT_UShort machine; + FT_UShort number_of_sections; + /* skipped content */ + FT_UShort size_of_optional_header; + /* skipped content */ + FT_UShort magic32; + /* skipped content */ + FT_ULong rsrc_virtual_address; + FT_ULong rsrc_size; + /* skipped content */ + + } WinPE32_HeaderRec; + + + typedef struct WinPE32_SectionRec_ + { + FT_Byte name[8]; + /* skipped content */ + FT_ULong virtual_address; + FT_ULong size_of_raw_data; + FT_ULong pointer_to_raw_data; + /* skipped content */ + + } WinPE32_SectionRec; + + + typedef struct WinPE_RsrcDirRec_ + { + FT_ULong characteristics; + FT_ULong time_date_stamp; + FT_UShort major_version; + FT_UShort minor_version; + FT_UShort number_of_named_entries; + FT_UShort number_of_id_entries; + + } WinPE_RsrcDirRec; + + + typedef struct WinPE_RsrcDirEntryRec_ + { + FT_ULong name; + FT_ULong offset; + + } WinPE_RsrcDirEntryRec; + + + typedef struct WinPE_RsrcDataEntryRec_ + { + FT_ULong offset_to_data; + FT_ULong size; + FT_ULong code_page; + FT_ULong reserved; + + } WinPE_RsrcDataEntryRec; + + + typedef struct WinNameInfoRec_ + { + FT_UShort offset; + FT_UShort length; + FT_UShort flags; + FT_UShort id; + FT_UShort handle; + FT_UShort usage; + + } WinNameInfoRec; + + + typedef struct WinResourceInfoRec_ + { + FT_UShort type_id; + FT_UShort count; + + } WinResourceInfoRec; + + +#define WINFNT_MZ_MAGIC 0x5A4D +#define WINFNT_NE_MAGIC 0x454E +#define WINFNT_PE_MAGIC 0x4550 + + + typedef struct FNT_FontRec_ + { + FT_ULong offset; + + FT_WinFNT_HeaderRec header; + + FT_Byte* fnt_frame; + FT_ULong fnt_size; + FT_String* family_name; + + } FNT_FontRec, *FNT_Font; + + + typedef struct FNT_FaceRec_ + { + FT_FaceRec root; + FNT_Font font; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + } FNT_FaceRec, *FNT_Face; + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) winfnt_driver_class; + + +FT_END_HEADER + + +#endif /* __WINFNT_H__ */ + + +/* END */ diff --git a/src/3rdparty/freetype/version.sed b/src/3rdparty/freetype/version.sed new file mode 100644 index 0000000000..c281ff506b --- /dev/null +++ b/src/3rdparty/freetype/version.sed @@ -0,0 +1,5 @@ +#! /usr/bin/sed -nf + +s/^#define *FREETYPE_MAJOR *\([^ ][^ ]*\).*$/freetype_major="\1" ;/p +s/^#define *FREETYPE_MINOR *\([^ ][^ ]*\).*$/freetype_minor=".\1" ;/p +s/^#define *FREETYPE_PATCH *\([^ ][^ ]*\).*$/freetype_patch=".\1" ;/p diff --git a/src/3rdparty/freetype/vms_make.com b/src/3rdparty/freetype/vms_make.com new file mode 100644 index 0000000000..1aa83e7e30 --- /dev/null +++ b/src/3rdparty/freetype/vms_make.com @@ -0,0 +1,1286 @@ +$! make Freetype2 under OpenVMS +$! +$! Copyright 2003, 2004, 2006, 2007 by +$! David Turner, Robert Wilhelm, and Werner Lemberg. +$! +$! This file is part of the FreeType project, and may only be used, modified, +$! and distributed under the terms of the FreeType project license, +$! LICENSE.TXT. By continuing to use, modify, or distribute this file you +$! indicate that you have read the license and understand and accept it +$! fully. +$! +$! +$! External libraries (like Freetype, XPM, etc.) are supported via the +$! config file VMSLIB.DAT. Please check the sample file, which is part of this +$! distribution, for the information you need to provide +$! +$! This procedure currently does support the following commandline options +$! in arbitrary order +$! +$! * DEBUG - Compile modules with /noopt/debug and link shareable image +$! with /debug +$! * LOPTS - Options to be passed to the link command +$! * CCOPT - Options to be passed to the C compiler +$! +$! In case of problems with the install you might contact me at +$! zinser@zinser.no-ip.info(preferred) or +$! zinser@sysdev.deutsche-boerse.com (work) +$! +$! Make procedure history for Freetype2 +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20040401 First version to receive a number +$! 0.02 20041030 Add error handling, Freetype 2.1.9 +$! +$ on error then goto err_exit +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$ th = tmpnam + ".h" +$ its_decc = false +$ its_vaxc = false +$ its_gnuc = false +$! +$! Setup variables holding "config" information +$! +$ Make = "" +$ ccopt = "/name=as_is/float=ieee" +$ lopts = "" +$ dnsrl = "" +$ aconf_in_file = "config.hin" +$ name = "Freetype2" +$ mapfile = name + ".map" +$ optfile = name + ".opt" +$ s_case = false +$ liblist = "" +$! +$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") +$ mydef = F$parse(whoami,,,"DEVICE") +$ mydir = f$parse(whoami,,,"DIRECTORY") - "][" +$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") +$! +$! Check for MMK/MMS +$! +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$! +$! Which command parameters were given +$! +$ gosub check_opts +$! +$! Create option file +$! +$ open/write optf 'optfile' +$! +$! Pull in external libraries +$! +$ create libs.opt +$ open/write libsf libs.opt +$ gosub check_create_vmslib +$! +$! Create objects +$! +$ if libdefs .nes. "" +$ then +$ ccopt = ccopt + "/define=(" + f$extract(0,f$length(libdefs)-1,libdefs) + ")" +$ endif +$! +$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - + then s_case = true +$ gosub crea_mms +$! +$ 'Make' /macro=(comp_flags="''ccopt'") +$ purge/nolog [...]descrip.mms +$! +$! Add them to options +$! +$FLOOP: +$ file = f$edit(f$search("[...]*.obj"),"UPCASE") +$ if (file .nes. "") +$ then +$ if f$locate("DEMOS",file) .eqs. f$length(file) then write optf file +$ goto floop +$ endif +$! +$ close optf +$! +$! +$! Alpha gets a shareable image +$! +$ If f$getsyi("HW_MODEL") .gt. 1024 +$ Then +$ write sys$output "Creating freetype2shr.exe" +$ call anal_obj_axp 'optfile' _link.opt +$ open/append optf 'optfile' +$ if s_case then WRITE optf "case_sensitive=YES" +$ close optf +$ LINK_/NODEB/SHARE=[.lib]freetype2shr.exe - + 'optfile'/opt,libs.opt/opt,_link.opt/opt +$ endif +$! +$ exit +$! +$ +$ERR_LIB: +$ write sys$output "Error reading config file vmslib.dat" +$ goto err_exit +$FT2_ERR: +$ write sys$output "Could not locate Freetype 2 include files" +$ goto err_exit +$ERR_EXIT: +$ set message/facil/ident/sever/text +$ close/nolog optf +$ close/nolog out +$ close/nolog libdata +$ close/nolog in +$ close/nolog atmp +$ close/nolog xtmp +$ write sys$output "Exiting..." +$ exit 2 +$! +$!------------------------------------------------------------------------------ +$! +$! If MMS/MMK are available dump out the descrip.mms if required +$! +$CREA_MMS: +$ write sys$output "Creating descrip.mms files ..." +$ write sys$output "... Main directory" +$ create descrip.mms +$ open/append out descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 build system -- top-level Makefile for OpenVMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +$ EOD +$ write out "CFLAGS = ", ccopt +$ copy sys$input: out +$ deck + + +all : + define freetype [--.include.freetype] + define psaux [-.psaux] + define autofit [-.autofit] + define autohint [-.autohint] + define base [-.base] + define cache [-.cache] + define cff [-.cff] + define cid [-.cid] + define pcf [-.pcf] + define psnames [-.psnames] + define raster [-.raster] + define sfnt [-.sfnt] + define smooth [-.smooth] + define truetype [-.truetype] + define type1 [-.type1] + define winfonts [-.winfonts] + if f$search("lib.dir") .eqs. "" then create/directory [.lib] + set default [.builds.vms] + $(MMS)$(MMSQUALIFIERS) +# set default [--.src.autofit] +# $(MMS)$(MMSQUALIFIERS) + set default [--.src.autohint] + $(MMS)$(MMSQUALIFIERS) + set default [-.base] + $(MMS)$(MMSQUALIFIERS) + set default [-.bdf] + $(MMS)$(MMSQUALIFIERS) + set default [-.cache] + $(MMS)$(MMSQUALIFIERS) + set default [-.cff] + $(MMS)$(MMSQUALIFIERS) + set default [-.cid] + $(MMS)$(MMSQUALIFIERS) + set default [-.gzip] + $(MMS)$(MMSQUALIFIERS) + set default [-.lzw] + $(MMS)$(MMSQUALIFIERS) + set default [-.otvalid] + $(MMS)$(MMSQUALIFIERS) + set default [-.pcf] + $(MMS)$(MMSQUALIFIERS) + set default [-.pfr] + $(MMS)$(MMSQUALIFIERS) + set default [-.psaux] + $(MMS)$(MMSQUALIFIERS) + set default [-.pshinter] + $(MMS)$(MMSQUALIFIERS) + set default [-.psnames] + $(MMS)$(MMSQUALIFIERS) + set default [-.raster] + $(MMS)$(MMSQUALIFIERS) + set default [-.sfnt] + $(MMS)$(MMSQUALIFIERS) + set default [-.smooth] + $(MMS)$(MMSQUALIFIERS) + set default [-.truetype] + $(MMS)$(MMSQUALIFIERS) + set default [-.type1] + $(MMS)$(MMSQUALIFIERS) + set default [-.type42] + $(MMS)$(MMSQUALIFIERS) + set default [-.winfonts] + $(MMS)$(MMSQUALIFIERS) + set default [--] + +# EOF +$ eod +$ close out +$ write sys$output "... [.builds.vms] directory" +$ create [.builds.vms]descrip.mms +$ open/append out [.builds.vms]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 system rules for VMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([],[--.include],[--.src.base]) + +OBJS=ftsystem.obj + +all : $(OBJS) + library/create [--.lib]freetype.olb $(OBJS) + +ftsystem.obj : ftsystem.c ftconfig.h + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.autofit] directory" +$ create [.src.autofit]descrip.mms +$ open/append out [.src.autofit]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 auto-fit module compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.autofit]) + +OBJS=afangles.obj,afhints.obj,aflatin.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.autohint] directory" +$ create [.src.autohint]descrip.mms +$ open/append out [.src.autohint]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 auto-hinter module compilation rules for VMS +# + + +# Copyright 2001, 2002 Catharon Productions Inc. +# +# This file is part of the Catharon Typography Project and shall only +# be used, modified, and distributed under the terms of the Catharon +# Open Source License that should come with this file under the name +# `CatharonLicense.txt'. By continuing to use, modify, or distribute +# this file you indicate that you have read the license and +# understand and accept it fully. +# +# Note that this license is compatible with the FreeType license. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/incl=([--.include],[--.src.autohint]) + +OBJS=autohint.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.base] directory" +$ create [.src.base]descrip.mms +$ open/append out [.src.base]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 base layer compilation rules for VMS +# + + +# Copyright 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.builds.vms],[--.include],[--.src.base]) + +OBJS=ftbase.obj,ftinit.obj,ftglyph.obj,ftdebug.obj,ftbdf.obj,ftmm.obj,\ + fttype1.obj,ftxf86.obj,ftpfr.obj,ftstroke.obj,ftwinfnt.obj,ftbbox.obj,\ + ftbitmap.obj ftlcdfil.obj ftgasp.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.bdf] directory" +$ create [.src.bdf]descrip.mms +$ open/append out [.src.bdf]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 BDF driver compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.bdf]) + +OBJS=bdf.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.cache] directory" +$ create [.src.cache]descrip.mms +$ open/append out [.src.cache]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 Cache compilation rules for VMS +# + + +# Copyright 2001, 2002, 2003, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cache]) + +OBJS=ftcache.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +ftcache.obj : ftcache.c ftcbasic.c ftccache.c ftccmap.c ftcglyph.c ftcimage.c \ + ftcmanag.c ftcmru.c ftcsbits.c + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.cff] directory" +$ create [.src.cff]descrip.mms +$ open/append out [.src.cff]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 OpenType/CFF driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cff]) + +OBJS=cff.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.cid] directory" +$ create [.src.cid]descrip.mms +$ open/append out [.src.cid]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 CID driver compilation rules for VMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cid]) + +OBJS=type1cid.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.gzip] directory" +$ create [.src.gzip]descrip.mms +$ open/append out [.src.gzip]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 GZip support compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +$EOD +$ if libincs .nes. "" then write out "LIBINCS = ", libincs - ",", "," +$ write out "COMP_FLAGS = ", ccopt +$ copy sys$input: out +$ deck + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=($(LIBINCS)[--.include],[--.src.gzip]) + +OBJS=ftgzip.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.lzw] directory" +$ create [.src.lzw]descrip.mms +$ open/append out [.src.lzw]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 LZW support compilation rules for VMS +# + + +# Copyright 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +$EOD +$ if libincs .nes. "" then write out "LIBINCS = ", libincs - ",", "," +$ write out "COMP_FLAGS = ", ccopt +$ copy sys$input: out +$ deck + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=($(LIBINCS)[--.include],[--.src.lzw]) + +OBJS=ftlzw.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.otlayout] directory" +$ create [.src.otlayout]descrip.mms +$ open/append out [.src.otlayout]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 OT layout compilation rules for VMS +# + + +# Copyright 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otlayout]) + +OBJS=otlbase.obj,otlcommn.obj,otlgdef.obj,otlgpos.obj,otlgsub.obj,\ + otljstf.obj,otlparse.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.otvalid] directory" +$ create [.src.otvalid]descrip.mms +$ open/append out [.src.otvalid]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 OpenType validation module compilation rules for VMS +# + + +# Copyright 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otvalid]) + +OBJS=otvalid.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.pcf] directory" +$ create [.src.pcf]descrip.mms +$ open/append out [.src.pcf]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 pcf driver compilation rules for VMS +# + + +# Copyright (C) 2001, 2002 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pcf]) + +OBJS=pcf.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.pfr] directory" +$ create [.src.pfr]descrip.mms +$ open/append out [.src.pfr]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 PFR driver compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pfr]) + +OBJS=pfr.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.psaux] directory" +$ create [.src.psaux]descrip.mms +$ open/append out [.src.psaux]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 PSaux driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psaux]) + +OBJS=psaux.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.pshinter] directory" +$ create [.src.pshinter]descrip.mms +$ open/append out [.src.pshinter]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 PSHinter driver compilation rules for OpenVMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) + +OBJS=pshinter.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.psnames] directory" +$ create [.src.psnames]descrip.mms +$ open/append out [.src.psnames]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 PSNames driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) + +OBJS=psnames.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.raster] directory" +$ create [.src.raster]descrip.mms +$ open/append out [.src.raster]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 renderer module compilation rules for VMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.raster]) + +OBJS=raster.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.sfnt] directory" +$ create [.src.sfnt]descrip.mms +$ open/append out [.src.sfnt]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 SFNT driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.sfnt]) + +OBJS=sfnt.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.smooth] directory" +$ create [.src.smooth]descrip.mms +$ open/append out [.src.smooth]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 smooth renderer module compilation rules for VMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.smooth]) + +OBJS=smooth.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.truetype] directory" +$ create [.src.truetype]descrip.mms +$ open/append out [.src.truetype]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 TrueType driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.truetype]) + +OBJS=truetype.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.type1] directory" +$ create [.src.type1]descrip.mms +$ open/append out [.src.type1]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 Type1 driver compilation rules for VMS +# + + +# Copyright 1996-2000, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type1]) + +OBJS=type1.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +type1.obj : type1.c t1parse.c t1load.c t1objs.c t1driver.c t1gload.c t1afm.c + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.type42] directory" +$ create [.src.type42]descrip.mms +$ open/append out [.src.type42]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 Type 42 driver compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type42]) + +OBJS=type42.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.winfonts] directory" +$ create [.src.winfonts]descrip.mms +$ open/append out [.src.winfonts]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 Windows FNT/FON driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.winfonts]) + +OBJS=winfnt.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ return +$!------------------------------------------------------------------------------ +$! +$! Check command line options and set symbols accordingly +$! +$ CHECK_OPTS: +$ i = 1 +$ OPT_LOOP: +$ if i .lt. 9 +$ then +$ cparm = f$edit(p'i',"upcase") +$ if cparm .eqs. "DEBUG" +$ then +$ ccopt = ccopt + "/noopt/deb" +$ lopts = lopts + "/deb" +$ endif +$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ ccopt = ccopt + f$extract(start,len,cparm) +$ endif +$ if cparm .eqs. "LINK" then linkonly = true +$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ lopts = lopts + f$extract(start,len,cparm) +$ endif +$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ cc_com = f$extract(start,len,cparm) + if (cc_com .nes. "DECC") .and. - + (cc_com .nes. "VAXC") .and. - + (cc_com .nes. "GNUC") +$ then +$ write sys$output "Unsupported compiler choice ''cc_com' ignored" +$ write sys$output "Use DECC, VAXC, or GNUC instead" +$ else +$ if cc_com .eqs. "DECC" then its_decc = true +$ if cc_com .eqs. "VAXC" then its_vaxc = true +$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ endif +$ endif +$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ mmks = f$extract(start,len,cparm) +$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ then +$ make = mmks +$ else +$ write sys$output "Unsupported make choice ''mmks' ignored" +$ write sys$output "Use MMK or MMS instead" +$ endif +$ endif +$ i = i + 1 +$ goto opt_loop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Take care of driver file with information about external libraries +$! +$! Version history +$! 0.01 20040220 First version to receive a number +$! 0.02 20040229 Echo current procedure name; use general error exit handler +$! Remove xpm hack -> Replaced by more general dnsrl handling +$CHECK_CREATE_VMSLIB: +$! +$ if f$search("VMSLIB.DAT") .eqs. "" +$ then +$ type/out=vmslib.dat sys$input +! +! This is a simple driver file with information used by vms_make.com to +! check if external libraries (like t1lib and freetype) are available on +! the system. +! +! Layout of the file: +! +! - Lines starting with ! are treated as comments +! - Elements in a data line are separated by # signs +! - The elements need to be listed in the following order +! 1.) Name of the Library (only used for informative messages +! from vms_make.com) +! 2.) Location where the object library can be found +! 3.) Location where the include files for the library can be found +! 4.) Include file used to verify library location +! 5.) CPP define to pass to the build to indicate availability of +! the library +! +! Example: The following lines show how definitions +! might look like. They are site specific and the locations of the +! library and include files need almost certainly to be changed. +! +! Location: All of the libaries can be found at the following addresses +! +! ZLIB: http://zinser.no-ip.info/vms/sw/zlib.htmlx +! +ZLIB # sys$library:libz.olb # sys$library: # zlib.h # FT_CONFIG_OPTION_SYSTEM_ZLIB +$ write sys$output "New driver file vmslib.dat created." +$ write sys$output "Please customize libary locations for your site" +$ write sys$output "and afterwards re-execute ''myproc'" +$ goto err_exit +$ endif +$! +$! Init symbols used to hold CPP definitions and include path +$! +$ libdefs = "" +$ libincs = "" +$! +$! Open data file with location of libraries +$! +$ open/read/end=end_lib/err=err_lib libdata VMSLIB.DAT +$LIB_LOOP: +$ read/end=end_lib libdata libline +$ libline = f$edit(libline, "UNCOMMENT,COLLAPSE") +$ if libline .eqs. "" then goto LIB_LOOP ! Comment line +$ libname = f$edit(f$element(0,"#",libline),"UPCASE") +$ write sys$output "Processing ''libname' setup ..." +$ libloc = f$element(1,"#",libline) +$ libsrc = f$element(2,"#",libline) +$ testinc = f$element(3,"#",libline) +$ cppdef = f$element(4,"#",libline) +$ old_cpp = f$locate("=1",cppdef) +$ if old_cpp.lt.f$length(cppdef) then cppdef = f$extract(0,old_cpp,cppdef) +$ if f$search("''libloc'").eqs. "" +$ then +$ write sys$output "Can not find library ''libloc' - Skipping ''libname'" +$ goto LIB_LOOP +$ endif +$ libsrc_elem = 0 +$ libsrc_found = false +$LIBSRC_LOOP: +$ libsrcdir = f$element(libsrc_elem,",",libsrc) +$ if (libsrcdir .eqs. ",") then goto END_LIBSRC +$ if f$search("''libsrcdir'''testinc'") .nes. "" then libsrc_found = true +$ libsrc_elem = libsrc_elem + 1 +$ goto LIBSRC_LOOP +$END_LIBSRC: +$ if .not. libsrc_found +$ then +$ write sys$output "Can not find includes at ''libsrc' - Skipping ''libname'" +$ goto LIB_LOOP +$ endif +$ if (cppdef .nes. "") then libdefs = libdefs + cppdef + "," +$ libincs = libincs + "," + libsrc +$ lqual = "/lib" +$ libtype = f$edit(f$parse(libloc,,,"TYPE"),"UPCASE") +$ if f$locate("EXE",libtype) .lt. f$length(libtype) then lqual = "/share" +$ write optf libloc , lqual +$ if (f$trnlnm("topt") .nes. "") then write topt libloc , lqual +$! +$! Nasty hack to get the freetype includes to work +$! +$ ft2def = false +$ if ((libname .eqs. "FREETYPE") .and. - + (f$locate("FREETYPE2",cppdef) .lt. f$length(cppdef))) +$ then +$ if ((f$search("freetype:freetype.h") .nes. "") .and. - + (f$search("freetype:[internal]ftobjs.h") .nes. "")) +$ then +$ write sys$output "Will use local definition of freetype logical" +$ else +$ ft2elem = 0 +$FT2_LOOP: +$ ft2srcdir = f$element(ft2elem,",",libsrc) +$ if f$search("''ft2srcdir'''testinc'") .nes. "" +$ then +$ if f$search("''ft2srcdir'internal.dir") .nes. "" +$ then +$ ft2dev = f$parse("''ft2srcdir'",,,"device","no_conceal") +$ ft2dir = f$parse("''ft2srcdir'",,,"directory","no_conceal") +$ ft2conc = f$locate("][",ft2dir) +$ ft2len = f$length(ft2dir) +$ if ft2conc .lt. ft2len +$ then +$ ft2dir = f$extract(0,ft2conc,ft2dir) + - + f$extract(ft2conc+2,ft2len-2,ft2dir) +$ endif +$ ft2dir = ft2dir - "]" + ".]" +$ define freetype 'ft2dev''ft2dir','ft2srcdir' +$ ft2def = true +$ else +$ goto ft2_err +$ endif +$ else +$ ft2elem = ft2elem + 1 +$ goto ft2_loop +$ endif +$ endif +$ endif +$ goto LIB_LOOP +$END_LIB: +$ close libdata +$ return +$!------------------------------------------------------------------------------ +$! +$! Analyze Object files for OpenVMS AXP to extract Procedure and Data +$! information to build a symbol vector for a shareable image +$! All the "brains" of this logic was suggested by Hartmut Becker +$! (Hartmut.Becker@compaq.com). All the bugs were introduced by me +$! (zinser@decus.de), so if you do have problem reports please do not +$! bother Hartmut/HP, but get in touch with me +$! +$! Version history +$! 0.01 20040006 Skip over shareable images in option file +$! +$ ANAL_OBJ_AXP: Subroutine +$ V = 'F$Verify(0) +$ SAY := "WRITE_ SYS$OUTPUT" +$ +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_aa +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "ANAL_OBJ_AXP: Error, no output file provided" +$ goto exit_aa +$ ENDIF +$ +$ open/read in 'p1 +$ create a.tmp +$ open/append atmp a.tmp +$ loop: +$ read/end=end_loop in line +$ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) +$ then +$ write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" +$ goto loop +$ endif +$ if f$locate("/LIB",f$edit(line,"upcase")) .lt. f$length(line) +$ then +$ write libsf line +$ write sys$output "ANAL_SKP_LIB-i-skiplib, ''line'" +$ goto loop +$ endif +$ f= f$search(line) +$ if f .eqs. "" +$ then +$ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" +$ goto loop +$ endif +$ def/user sys$output nl: +$ def/user sys$error nl: +$ anal/obj/gsd 'f /out=x.tmp +$ open/read xtmp x.tmp +$ XLOOP: +$ read/end=end_xloop xtmp xline +$ xline = f$edit(xline,"compress") +$ write atmp xline +$ goto xloop +$ END_XLOOP: +$ close xtmp +$ goto loop +$ end_loop: +$ close in +$ close atmp +$ if f$search("a.tmp") .eqs. "" - + then $ exit +$ ! all global definitions +$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp +$ ! all procedures +$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp +$ search c.tmp "symbol:"/out=d.tmp +$ def/user sys$output nl: +$ edito/edt/command=sys$input d.tmp +sub/symbol: "/symbol_vector=(/whole +sub/"/=PROCEDURE)/whole +exit +$ ! all data +$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp +$ search e.tmp "symbol:"/out=f.tmp +$ def/user sys$output nl: +$ edito/edt/command=sys$input f.tmp +sub/symbol: "/symbol_vector=(/whole +sub/"/=DATA)/whole +exit +$ sort/nodupl d.tmp,f.tmp 'p2' +$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;* +$ if f$search("x.tmp") .nes. "" - + then $ delete x.tmp;* +$! +$ close libsf +$ EXIT_AA: +$ if V then set verify +$ endsubroutine diff --git a/src/3rdparty/harfbuzz/.gitignore b/src/3rdparty/harfbuzz/.gitignore new file mode 100644 index 0000000000..572243facd --- /dev/null +++ b/src/3rdparty/harfbuzz/.gitignore @@ -0,0 +1,20 @@ +INSTALL +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h.in +config.sub +config.h +configure +depcomp +install-sh +ltmain.sh +missing +Makefile +config.status +config.log +libtool +stamp-h1 +compile +build diff --git a/src/3rdparty/harfbuzz/AUTHORS b/src/3rdparty/harfbuzz/AUTHORS new file mode 100644 index 0000000000..023488a5b9 --- /dev/null +++ b/src/3rdparty/harfbuzz/AUTHORS @@ -0,0 +1,6 @@ +David Turner +Werner Lemberg +Owen Taylor +Behdad Esfahbod +Lars Knoll +Simon Hausmann diff --git a/src/3rdparty/harfbuzz/COPYING b/src/3rdparty/harfbuzz/COPYING new file mode 100644 index 0000000000..820a9e6808 --- /dev/null +++ b/src/3rdparty/harfbuzz/COPYING @@ -0,0 +1,24 @@ +HarfBuzz was previously licensed under different licenses. This was +changed in January 2008. If you need to relicense your old copies, +consult the announcement of the license change on the internet. +Other than that, each copy of HarfBuzz is licensed under the COPYING +file included with it. The actual license follows: + + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. diff --git a/src/3rdparty/harfbuzz/ChangeLog b/src/3rdparty/harfbuzz/ChangeLog new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/3rdparty/harfbuzz/Makefile.am b/src/3rdparty/harfbuzz/Makefile.am new file mode 100644 index 0000000000..776b947eee --- /dev/null +++ b/src/3rdparty/harfbuzz/Makefile.am @@ -0,0 +1,2 @@ + +SUBDIRS = src tests diff --git a/src/3rdparty/harfbuzz/NEWS b/src/3rdparty/harfbuzz/NEWS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/3rdparty/harfbuzz/README b/src/3rdparty/harfbuzz/README new file mode 100644 index 0000000000..ca2546ae02 --- /dev/null +++ b/src/3rdparty/harfbuzz/README @@ -0,0 +1,7 @@ +This is HarfBuzz, an OpenType Layout engine library. + +To report bugs or post to discussion mailing list, see: + + http://freedesktop.org/wiki/Software/HarfBuzz + +For license information, see the file COPYING. diff --git a/src/3rdparty/harfbuzz/autogen.sh b/src/3rdparty/harfbuzz/autogen.sh new file mode 100755 index 0000000000..7fa1c3df61 --- /dev/null +++ b/src/3rdparty/harfbuzz/autogen.sh @@ -0,0 +1,116 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +set -e + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +ORIGDIR=`pwd` +cd $srcdir +PROJECT=harfbuzz +TEST_TYPE=-f +FILE=src/harfbuzz.h +ACLOCAL=${ACLOCAL-aclocal} +LIBTOOLIZE=${LIBTOOLIZE-libtoolize} +AUTOMAKE=${AUTOMAKE-automake} +AUTOHEADER=${AUTOHEADER-autoheader} +AUTOCONF=${AUTOCONF-autoconf} +LIBTOOLIZE_FLAGS="--copy --force" + +DIE=0 + +have_libtool=false +if $LIBTOOLIZE --version < /dev/null > /dev/null 2>&1 ; then + libtool_version=`$LIBTOOLIZE --version | sed 's/^[^0-9]*\([0-9].[0-9.]*\).*/\1/'` + case $libtool_version in + 1.4*|1.5*|1.6*|1.7*|2*) + have_libtool=true + ;; + esac +fi +if $have_libtool ; then : ; else + echo + echo "You must have libtool 1.4 installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +fi + +($AUTOCONF --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile $PROJECT." + echo "libtool the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +have_automake=false +need_libtoolize=true +if $AUTOMAKE --version < /dev/null > /dev/null 2>&1 ; then + automake_version=`$AUTOMAKE --version | grep 'automake (GNU automake)' | sed 's/^[^0-9]*\(.*\)/\1/'` + case $automake_version in + 1.2*|1.3*|1.4) + ;; + 1.4*) + have_automake=true + need_libtoolize=false + ;; + *) + have_automake=true + ;; + esac +fi +if $have_automake ; then : ; else + echo + echo "You must have automake 1.4-p1 installed to compile $PROJECT." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.4-p1.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +fi + +if test "$DIE" -eq 1; then + exit 1 +fi + +test $TEST_TYPE $FILE || { + echo "You must run this script in the top-level $PROJECT directory" + exit 1 +} + +if test -z "$AUTOGEN_SUBDIR_MODE"; then + if test -z "$*"; then + echo "I am going to run ./configure with no arguments - if you wish " + echo "to pass any to it, please specify them on the $0 command line." + fi +fi + +echo Running $ACLOCAL $ACLOCAL_FLAGS +$ACLOCAL $ACLOCAL_FLAGS + +# optionally run autoheader +if $AUTOHEADER --version < /dev/null > /dev/null 2>&1; then + echo Running $AUTOHEADER + $AUTOHEADER +fi + +case $need_libtoolize in + true) + echo Running $LIBTOOLIZE $LIBTOOLIZE_FLAGS + $LIBTOOLIZE $LIBTOOLIZE_FLAGS + ;; +esac + +echo Running $AUTOMAKE -a $am_opt +$AUTOMAKE -a $am_opt +echo Running $AUTOCONF +$AUTOCONF +cd $ORIGDIR + +if test -z "$AUTOGEN_SUBDIR_MODE"; then + echo Running $srcdir/configure "$@" + $srcdir/configure "$@" + + echo + echo "Now type 'make' to compile $PROJECT." +fi diff --git a/src/3rdparty/harfbuzz/configure.ac b/src/3rdparty/harfbuzz/configure.ac new file mode 100644 index 0000000000..8519279738 --- /dev/null +++ b/src/3rdparty/harfbuzz/configure.ac @@ -0,0 +1,54 @@ +AC_INIT(README) +AM_INIT_AUTOMAKE(harfbuzz, 0.1) +AC_PROG_CC +AC_PROG_CXX +AM_PROG_LIBTOOL +PKG_PROG_PKG_CONFIG +AM_CONFIG_HEADER(config.h) + +if test "x$ac_compiler_gnu" = xyes; then + CFLAGS="$CFLAGS -Wall -W -pedantic -ansi" + CXXFLAGS="$CXXFLAGS -Wall -W" +fi + +AC_PATH_PROG(ft_config,freetype-config,no) +if test "$ft_config" = "no"; then + AC_MSG_ERROR([You must have freetype installed; see http://www.freetype.org/]) +fi + +FREETYPE_CFLAGS="`$ft_config --cflags`" +FREETYPE_LIBS="`$ft_config --libs`" + +AC_SUBST(FREETYPE_LIBS) +AC_SUBST(FREETYPE_CFLAGS) + +AC_ARG_ENABLE(qt, AS_HELP_STRING([--disable-qt], [Build Qt support (default: auto)]), [QT=$enableval], [QT=auto]) + +if test "x$QT" = xauto; then + PKG_CHECK_MODULES(QT, [QtGui >= 4.3], [QT=yes], [QT=no]) +fi +if test "x$QT" = xyes; then + PKG_CHECK_MODULES(QT_GUI, [QtGui >= 4.3]) + PKG_CHECK_MODULES(QT_QTEST, [QtTest >= 4.3]) + + _PKG_CONFIG(QT_INCDIR, [variable=includedir], [QtGui >= 4.3]) + QT_GUI_CFLAGS="$QT_GUI_CFLAGS -I$pkg_cv_QT_INCDIR/../Qt" + + AC_SUBST(QT_GUI_CFLAGS) + AC_SUBST(QT_GUI_LIBS) + AC_SUBST(QT_QTEST_CFLAGS) + AC_SUBST(QT_QTEST_LIBS) + + _PKG_CONFIG(QT_MOC, [variable=moc_location], [QtGui >= 4.3]) + QT_MOC=$pkg_cv_QT_MOC + AC_SUBST(QT_MOC) +fi +AM_CONDITIONAL(QT, [test "x$QT" = xyes]) + +AC_OUTPUT([ +Makefile +src/Makefile +tests/Makefile +tests/linebreaking/Makefile +tests/shaping/Makefile +]) diff --git a/src/3rdparty/harfbuzz/src/.gitignore b/src/3rdparty/harfbuzz/src/.gitignore new file mode 100644 index 0000000000..74de98b140 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/.gitignore @@ -0,0 +1,7 @@ +*.o +*.lo +Makefile +*.la +.deps +.libs +*~ diff --git a/src/3rdparty/harfbuzz/src/Makefile.am b/src/3rdparty/harfbuzz/src/Makefile.am new file mode 100644 index 0000000000..51d06525da --- /dev/null +++ b/src/3rdparty/harfbuzz/src/Makefile.am @@ -0,0 +1,69 @@ +## Process this file with automake to produce Makefile.in + +noinst_LTLIBRARIES = libharfbuzz-1.la + +MAINSOURCES = \ + harfbuzz-buffer.c \ + harfbuzz-stream.c \ + harfbuzz-dump.c \ + harfbuzz-gdef.c \ + harfbuzz-gpos.c \ + harfbuzz-gsub.c \ + harfbuzz-impl.c \ + harfbuzz-open.c \ + harfbuzz-shaper.cpp \ + harfbuzz-greek.c \ + harfbuzz-tibetan.c \ + harfbuzz-khmer.c \ + harfbuzz-indic.cpp \ + harfbuzz-hebrew.c \ + harfbuzz-arabic.c \ + harfbuzz-hangul.c \ + harfbuzz-myanmar.c \ + harfbuzz-thai.c + +EXTRA_SOURCES = harfbuzz.c + +PUBLICHEADERS = \ + harfbuzz.h \ + harfbuzz-buffer.h \ + harfbuzz-dump.h \ + harfbuzz-gdef.h \ + harfbuzz-gpos.h \ + harfbuzz-gsub.h \ + harfbuzz-open.h \ + harfbuzz-global.h \ + harfbuzz-external.h \ + harfbuzz-shaper.h \ + harfbuzz-stream.h + +PRIVATEHEADERS = \ + harfbuzz-impl.h \ + harfbuzz-buffer-private.h \ + harfbuzz-stream-private.h \ + harfbuzz-gdef-private.h \ + harfbuzz-gpos-private.h \ + harfbuzz-gsub-private.h \ + harfbuzz-open-private.h \ + harfbuzz-shaper-private.h + +libharfbuzz_1_la_SOURCES = \ + $(MAINSOURCES) \ + $(PUBLICHEADERS) \ + $(PRIVATEHEADERS) + +#noinst_PROGRAMS = harfbuzz-dump +# +#harfbuzz_dump_SOURCES = \ +# harfbuzz-dump-main.c +# +#harfbuzz_dump_LDADD = \ +# libharfbuzz-1.la + +EXTRA_DIST = \ + README \ + COPYING.FTL \ + COPYING.GPL \ + COPYING \ + $(EXTRA_SOURCES) + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c b/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c new file mode 100644 index 0000000000..3837087f44 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-arabic.c @@ -0,0 +1,1144 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" + +#include + +static const HB_UChar16 ReplacementCharacter = 0xfffd; + +typedef struct { + unsigned char shape; + unsigned char justification; +} HB_ArabicProperties; + +typedef enum { + XIsolated, + XFinal, + XInitial, + XMedial, + /* intermediate state */ + XCausing +} ArabicShape; + +/* +// these groups correspond to the groups defined in the Unicode standard. +// Some of these groups are equal with regards to both joining and line breaking behaviour, +// and thus have the same enum value +// +// I'm not sure the mapping of syriac to arabic enums is correct with regards to justification, but as +// I couldn't find any better document I'll hope for the best. +*/ +typedef enum { + /* NonJoining */ + ArabicNone, + ArabicSpace, + /* Transparent */ + Transparent, + /* Causing */ + Center, + Kashida, + + /* Arabic */ + /* Dual */ + Beh, + Noon, + Meem = Noon, + Heh = Noon, + KnottedHeh = Noon, + HehGoal = Noon, + SwashKaf = Noon, + Yeh, + Hah, + Seen, + Sad = Seen, + Tah, + Kaf = Tah, + Gaf = Tah, + Lam = Tah, + Ain, + Feh = Ain, + Qaf = Ain, + /* Right */ + Alef, + Waw, + Dal, + TehMarbuta = Dal, + Reh, + HamzaOnHehGoal, + YehWithTail = HamzaOnHehGoal, + YehBarre = HamzaOnHehGoal, + + /* Syriac */ + /* Dual */ + Beth = Beh, + Gamal = Ain, + Heth = Noon, + Teth = Hah, + Yudh = Noon, + Kaph = Noon, + Lamadh = Lam, + Mim = Noon, + Nun = Noon, + Semakh = Noon, + FinalSemakh = Noon, + SyriacE = Ain, + Pe = Ain, + ReversedPe = Hah, + Qaph = Noon, + Shin = Noon, + Fe = Ain, + + /* Right */ + Alaph = Alef, + Dalath = Dal, + He = Dal, + SyriacWaw = Waw, + Zain = Alef, + YudhHe = Waw, + Sadhe = HamzaOnHehGoal, + Taw = Dal, + + /* Compiler bug? Otherwise ArabicGroupsEnd would be equal to Dal + 1. */ + Dummy = HamzaOnHehGoal, + ArabicGroupsEnd +} ArabicGroup; + +static const unsigned char arabic_group[0x150] = { + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + + Transparent, Transparent, Transparent, Transparent, + Transparent, Transparent, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + + ArabicNone, ArabicNone, Alef, Alef, + Waw, Alef, Yeh, Alef, + Beh, TehMarbuta, Beh, Beh, + Hah, Hah, Hah, Dal, + + Dal, Reh, Reh, Seen, + Seen, Sad, Sad, Tah, + Tah, Ain, Ain, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + + /* 0x640 */ + Kashida, Feh, Qaf, Kaf, + Lam, Meem, Noon, Heh, + Waw, Yeh, Yeh, Transparent, + Transparent, Transparent, Transparent, Transparent, + + Transparent, Transparent, Transparent, Transparent, + Transparent, Transparent, Transparent, Transparent, + Transparent, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, Beh, Qaf, + + Transparent, Alef, Alef, Alef, + ArabicNone, Alef, Waw, Waw, + Yeh, Beh, Beh, Beh, + Beh, Beh, Beh, Beh, + + /* 0x680 */ + Beh, Hah, Hah, Hah, + Hah, Hah, Hah, Hah, + Dal, Dal, Dal, Dal, + Dal, Dal, Dal, Dal, + + Dal, Reh, Reh, Reh, + Reh, Reh, Reh, Reh, + Reh, Reh, Seen, Seen, + Seen, Sad, Sad, Tah, + + Ain, Feh, Feh, Feh, + Feh, Feh, Feh, Qaf, + Qaf, Gaf, SwashKaf, Gaf, + Kaf, Kaf, Kaf, Gaf, + + Gaf, Gaf, Gaf, Gaf, + Gaf, Lam, Lam, Lam, + Lam, Noon, Noon, Noon, + Noon, Noon, KnottedHeh, Hah, + + /* 0x6c0 */ + TehMarbuta, HehGoal, HamzaOnHehGoal, HamzaOnHehGoal, + Waw, Waw, Waw, Waw, + Waw, Waw, Waw, Waw, + Yeh, YehWithTail, Yeh, Waw, + + Yeh, Yeh, YehBarre, YehBarre, + ArabicNone, TehMarbuta, Transparent, Transparent, + Transparent, Transparent, Transparent, Transparent, + Transparent, ArabicNone, ArabicNone, Transparent, + + Transparent, Transparent, Transparent, Transparent, + Transparent, ArabicNone, ArabicNone, Transparent, + Transparent, ArabicNone, Transparent, Transparent, + Transparent, Transparent, Dal, Reh, + + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, Seen, Sad, + Ain, ArabicNone, ArabicNone, KnottedHeh, + + /* 0x700 */ + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + ArabicNone, ArabicNone, ArabicNone, ArabicNone, + + Alaph, Transparent, Beth, Gamal, + Gamal, Dalath, Dalath, He, + SyriacWaw, Zain, Heth, Teth, + Teth, Yudh, YudhHe, Kaph, + + Lamadh, Mim, Nun, Semakh, + FinalSemakh, SyriacE, Pe, ReversedPe, + Sadhe, Qaph, Dalath, Shin, + Taw, Beth, Gamal, Dalath, + + Transparent, Transparent, Transparent, Transparent, + Transparent, Transparent, Transparent, Transparent, + Transparent, Transparent, Transparent, Transparent, + Transparent, Transparent, Transparent, Transparent, + + Transparent, Transparent, Transparent, Transparent, + Transparent, Transparent, Transparent, Transparent, + Transparent, Transparent, Transparent, ArabicNone, + ArabicNone, Zain, Kaph, Fe, +}; + +static ArabicGroup arabicGroup(unsigned short uc) +{ + if (uc >= 0x0600 && uc < 0x750) + return (ArabicGroup) arabic_group[uc-0x600]; + else if (uc == 0x200d) + return Center; + else if (HB_GetUnicodeCharCategory(uc) == HB_Separator_Space) + return ArabicSpace; + else + return ArabicNone; +} + + +/* + Arabic shaping obeys a number of rules according to the joining classes (see Unicode book, section on + arabic). + + Each unicode char has a joining class (right, dual (left&right), center (joincausing) or transparent). + transparent joining is not encoded in HB_UChar16::joining(), but applies to all combining marks and format marks. + + Right join-causing: dual + center + Left join-causing: dual + right + center + + Rules are as follows (for a string already in visual order, as we have it here): + + R1 Transparent characters do not affect joining behaviour. + R2 A right joining character, that has a right join-causing char on the right will get form XRight + (R3 A left joining character, that has a left join-causing char on the left will get form XLeft) + Note: the above rule is meaningless, as there are no pure left joining characters defined in Unicode + R4 A dual joining character, that has a left join-causing char on the left and a right join-causing char on + the right will get form XMedial + R5 A dual joining character, that has a right join causing char on the right, and no left join causing char on the left + will get form XRight + R6 A dual joining character, that has a left join causing char on the left, and no right join causing char on the right + will get form XLeft + R7 Otherwise the character will get form XIsolated + + Additionally we have to do the minimal ligature support for lam-alef ligatures: + + L1 Transparent characters do not affect ligature behaviour. + L2 Any sequence of Alef(XRight) + Lam(XMedial) will form the ligature Alef.Lam(XLeft) + L3 Any sequence of Alef(XRight) + Lam(XLeft) will form the ligature Alef.Lam(XIsolated) + + The state table below handles rules R1-R7. +*/ + +typedef enum { + JNone, + JCausing, + JDual, + JRight, + JTransparent +} Joining; + +static const Joining joining_for_group[ArabicGroupsEnd] = { + /* NonJoining */ + JNone, /* ArabicNone */ + JNone, /* ArabicSpace */ + /* Transparent */ + JTransparent, /* Transparent */ + /* Causing */ + JCausing, /* Center */ + JCausing, /* Kashida */ + /* Dual */ + JDual, /* Beh */ + JDual, /* Noon */ + JDual, /* Yeh */ + JDual, /* Hah */ + JDual, /* Seen */ + JDual, /* Tah */ + JDual, /* Ain */ + /* Right */ + JRight, /* Alef */ + JRight, /* Waw */ + JRight, /* Dal */ + JRight, /* Reh */ + JRight /* HamzaOnHehGoal */ +}; + + +typedef struct { + ArabicShape form1; + ArabicShape form2; +} JoiningPair; + +static const JoiningPair joining_table[5][4] = +/* None, Causing, Dual, Right */ +{ + { { XIsolated, XIsolated }, { XIsolated, XCausing }, { XIsolated, XInitial }, { XIsolated, XIsolated } }, /* XIsolated */ + { { XFinal, XIsolated }, { XFinal, XCausing }, { XFinal, XInitial }, { XFinal, XIsolated } }, /* XFinal */ + { { XIsolated, XIsolated }, { XInitial, XCausing }, { XInitial, XMedial }, { XInitial, XFinal } }, /* XInitial */ + { { XFinal, XIsolated }, { XMedial, XCausing }, { XMedial, XMedial }, { XMedial, XFinal } }, /* XMedial */ + { { XIsolated, XIsolated }, { XIsolated, XCausing }, { XIsolated, XMedial }, { XIsolated, XFinal } }, /* XCausing */ +}; + + +/* +According to http://www.microsoft.com/middleeast/Arabicdev/IE6/KBase.asp + +1. Find the priority of the connecting opportunities in each word +2. Add expansion at the highest priority connection opportunity +3. If more than one connection opportunity have the same highest value, + use the opportunity closest to the end of the word. + +Following is a chart that provides the priority for connection +opportunities and where expansion occurs. The character group names +are those in table 6.6 of the UNICODE 2.0 book. + + +PrioritY Glyph Condition Kashida Location + +Arabic_Kashida User inserted Kashida The user entered a Kashida in a position. After the user + (Shift+j or Shift+[E with hat]) Thus, it is the highest priority to insert an inserted kashida + automatic kashida. + +Arabic_Seen Seen, Sad Connecting to the next character. After the character. + (Initial or medial form). + +Arabic_HaaDal Teh Marbutah, Haa, Dal Connecting to previous character. Before the final form + of these characters. + +Arabic_Alef Alef, Tah, Lam, Connecting to previous character. Before the final form + Kaf and Gaf of these characters. + +Arabic_BaRa Reh, Yeh Connected to medial Beh Before preceding medial Baa + +Arabic_Waw Waw, Ain, Qaf, Feh Connecting to previous character. Before the final form of + these characters. + +Arabic_Normal Other connecting Connecting to previous character. Before the final form + characters of these characters. + + + +This seems to imply that we have at most one kashida point per arabic word. + +*/ + +static void getArabicProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties) +{ +/* qDebug("arabicSyriacOpenTypeShape: properties:"); */ + int lastPos = 0; + int lastGroup = ArabicNone; + int i = 0; + + ArabicGroup group = arabicGroup(chars[0]); + Joining j = joining_for_group[group]; + ArabicShape shape = joining_table[XIsolated][j].form2; + properties[0].justification = HB_NoJustification; + + for (i = 1; i < len; ++i) { + /* #### fix handling for spaces and punktuation */ + properties[i].justification = HB_NoJustification; + + group = arabicGroup(chars[i]); + j = joining_for_group[group]; + + if (j == JTransparent) { + properties[i].shape = XIsolated; + continue; + } + + properties[lastPos].shape = joining_table[shape][j].form1; + shape = joining_table[shape][j].form2; + + switch(lastGroup) { + case Seen: + if (properties[lastPos].shape == XInitial || properties[lastPos].shape == XMedial) + properties[i-1].justification = HB_Arabic_Seen; + break; + case Hah: + if (properties[lastPos].shape == XFinal) + properties[lastPos-1].justification = HB_Arabic_HaaDal; + break; + case Alef: + if (properties[lastPos].shape == XFinal) + properties[lastPos-1].justification = HB_Arabic_Alef; + break; + case Ain: + if (properties[lastPos].shape == XFinal) + properties[lastPos-1].justification = HB_Arabic_Waw; + break; + case Noon: + if (properties[lastPos].shape == XFinal) + properties[lastPos-1].justification = HB_Arabic_Normal; + break; + case ArabicNone: + break; + + default: + assert(FALSE); + } + + lastGroup = ArabicNone; + + switch(group) { + case ArabicNone: + case Transparent: + /* ### Center should probably be treated as transparent when it comes to justification. */ + case Center: + break; + case ArabicSpace: + properties[i].justification = HB_Arabic_Space; + break; + case Kashida: + properties[i].justification = HB_Arabic_Kashida; + break; + case Seen: + lastGroup = Seen; + break; + + case Hah: + case Dal: + lastGroup = Hah; + break; + + case Alef: + case Tah: + lastGroup = Alef; + break; + + case Yeh: + case Reh: + if (properties[lastPos].shape == XMedial && arabicGroup(chars[lastPos]) == Beh) + properties[lastPos-1].justification = HB_Arabic_BaRa; + break; + + case Ain: + case Waw: + lastGroup = Ain; + break; + + case Noon: + case Beh: + case HamzaOnHehGoal: + lastGroup = Noon; + break; + case ArabicGroupsEnd: + assert(FALSE); + } + + lastPos = i; + } + properties[lastPos].shape = joining_table[shape][JNone].form1; + + + /* + for (int i = 0; i < len; ++i) + qDebug("arabic properties(%d): uc=%x shape=%d, justification=%d", i, chars[i], properties[i].shape, properties[i].justification); + */ +} + +static Joining getNkoJoining(unsigned short uc) +{ + if (uc < 0x7ca) + return JNone; + if (uc <= 0x7ea) + return JDual; + if (uc <= 0x7f3) + return JTransparent; + if (uc <= 0x7f9) + return JNone; + if (uc == 0x7fa) + return JCausing; + return JNone; +} + +static void getNkoProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties) +{ + int lastPos = 0; + int i = 0; + + Joining j = getNkoJoining(chars[0]); + ArabicShape shape = joining_table[XIsolated][j].form2; + properties[0].justification = HB_NoJustification; + + for (i = 1; i < len; ++i) { + properties[i].justification = (HB_GetUnicodeCharCategory(chars[i]) == HB_Separator_Space) ? + ArabicSpace : ArabicNone; + + j = getNkoJoining(chars[i]); + + if (j == JTransparent) { + properties[i].shape = XIsolated; + continue; + } + + properties[lastPos].shape = joining_table[shape][j].form1; + shape = joining_table[shape][j].form2; + + + lastPos = i; + } + properties[lastPos].shape = joining_table[shape][JNone].form1; + + + /* + for (int i = 0; i < len; ++i) + qDebug("nko properties(%d): uc=%x shape=%d, justification=%d", i, chars[i], properties[i].shape, properties[i].justification); + */ +} + +/* +// The unicode to unicode shaping codec. +// does only presentation forms B at the moment, but that should be enough for +// simple display +*/ +static const hb_uint16 arabicUnicodeMapping[256][2] = { + /* base of shaped forms, and number-1 of them (0 for non shaping, + 1 for right binding and 3 for dual binding */ + + /* These are just the glyphs available in Unicode, + some characters are in R class, but have no glyphs in Unicode. */ + + { 0x0600, 0 }, /* 0x0600 */ + { 0x0601, 0 }, /* 0x0601 */ + { 0x0602, 0 }, /* 0x0602 */ + { 0x0603, 0 }, /* 0x0603 */ + { 0x0604, 0 }, /* 0x0604 */ + { 0x0605, 0 }, /* 0x0605 */ + { 0x0606, 0 }, /* 0x0606 */ + { 0x0607, 0 }, /* 0x0607 */ + { 0x0608, 0 }, /* 0x0608 */ + { 0x0609, 0 }, /* 0x0609 */ + { 0x060A, 0 }, /* 0x060A */ + { 0x060B, 0 }, /* 0x060B */ + { 0x060C, 0 }, /* 0x060C */ + { 0x060D, 0 }, /* 0x060D */ + { 0x060E, 0 }, /* 0x060E */ + { 0x060F, 0 }, /* 0x060F */ + + { 0x0610, 0 }, /* 0x0610 */ + { 0x0611, 0 }, /* 0x0611 */ + { 0x0612, 0 }, /* 0x0612 */ + { 0x0613, 0 }, /* 0x0613 */ + { 0x0614, 0 }, /* 0x0614 */ + { 0x0615, 0 }, /* 0x0615 */ + { 0x0616, 0 }, /* 0x0616 */ + { 0x0617, 0 }, /* 0x0617 */ + { 0x0618, 0 }, /* 0x0618 */ + { 0x0619, 0 }, /* 0x0619 */ + { 0x061A, 0 }, /* 0x061A */ + { 0x061B, 0 }, /* 0x061B */ + { 0x061C, 0 }, /* 0x061C */ + { 0x061D, 0 }, /* 0x061D */ + { 0x061E, 0 }, /* 0x061E */ + { 0x061F, 0 }, /* 0x061F */ + + { 0x0620, 0 }, /* 0x0620 */ + { 0xFE80, 0 }, /* 0x0621 HAMZA */ + { 0xFE81, 1 }, /* 0x0622 R ALEF WITH MADDA ABOVE */ + { 0xFE83, 1 }, /* 0x0623 R ALEF WITH HAMZA ABOVE */ + { 0xFE85, 1 }, /* 0x0624 R WAW WITH HAMZA ABOVE */ + { 0xFE87, 1 }, /* 0x0625 R ALEF WITH HAMZA BELOW */ + { 0xFE89, 3 }, /* 0x0626 D YEH WITH HAMZA ABOVE */ + { 0xFE8D, 1 }, /* 0x0627 R ALEF */ + { 0xFE8F, 3 }, /* 0x0628 D BEH */ + { 0xFE93, 1 }, /* 0x0629 R TEH MARBUTA */ + { 0xFE95, 3 }, /* 0x062A D TEH */ + { 0xFE99, 3 }, /* 0x062B D THEH */ + { 0xFE9D, 3 }, /* 0x062C D JEEM */ + { 0xFEA1, 3 }, /* 0x062D D HAH */ + { 0xFEA5, 3 }, /* 0x062E D KHAH */ + { 0xFEA9, 1 }, /* 0x062F R DAL */ + + { 0xFEAB, 1 }, /* 0x0630 R THAL */ + { 0xFEAD, 1 }, /* 0x0631 R REH */ + { 0xFEAF, 1 }, /* 0x0632 R ZAIN */ + { 0xFEB1, 3 }, /* 0x0633 D SEEN */ + { 0xFEB5, 3 }, /* 0x0634 D SHEEN */ + { 0xFEB9, 3 }, /* 0x0635 D SAD */ + { 0xFEBD, 3 }, /* 0x0636 D DAD */ + { 0xFEC1, 3 }, /* 0x0637 D TAH */ + { 0xFEC5, 3 }, /* 0x0638 D ZAH */ + { 0xFEC9, 3 }, /* 0x0639 D AIN */ + { 0xFECD, 3 }, /* 0x063A D GHAIN */ + { 0x063B, 0 }, /* 0x063B */ + { 0x063C, 0 }, /* 0x063C */ + { 0x063D, 0 }, /* 0x063D */ + { 0x063E, 0 }, /* 0x063E */ + { 0x063F, 0 }, /* 0x063F */ + + { 0x0640, 0 }, /* 0x0640 C TATWEEL // ### Join Causing, only one glyph */ + { 0xFED1, 3 }, /* 0x0641 D FEH */ + { 0xFED5, 3 }, /* 0x0642 D QAF */ + { 0xFED9, 3 }, /* 0x0643 D KAF */ + { 0xFEDD, 3 }, /* 0x0644 D LAM */ + { 0xFEE1, 3 }, /* 0x0645 D MEEM */ + { 0xFEE5, 3 }, /* 0x0646 D NOON */ + { 0xFEE9, 3 }, /* 0x0647 D HEH */ + { 0xFEED, 1 }, /* 0x0648 R WAW */ + { 0x0649, 3 }, /* 0x0649 ALEF MAKSURA // ### Dual, glyphs not consecutive, handle in code. */ + { 0xFEF1, 3 }, /* 0x064A D YEH */ + { 0x064B, 0 }, /* 0x064B */ + { 0x064C, 0 }, /* 0x064C */ + { 0x064D, 0 }, /* 0x064D */ + { 0x064E, 0 }, /* 0x064E */ + { 0x064F, 0 }, /* 0x064F */ + + { 0x0650, 0 }, /* 0x0650 */ + { 0x0651, 0 }, /* 0x0651 */ + { 0x0652, 0 }, /* 0x0652 */ + { 0x0653, 0 }, /* 0x0653 */ + { 0x0654, 0 }, /* 0x0654 */ + { 0x0655, 0 }, /* 0x0655 */ + { 0x0656, 0 }, /* 0x0656 */ + { 0x0657, 0 }, /* 0x0657 */ + { 0x0658, 0 }, /* 0x0658 */ + { 0x0659, 0 }, /* 0x0659 */ + { 0x065A, 0 }, /* 0x065A */ + { 0x065B, 0 }, /* 0x065B */ + { 0x065C, 0 }, /* 0x065C */ + { 0x065D, 0 }, /* 0x065D */ + { 0x065E, 0 }, /* 0x065E */ + { 0x065F, 0 }, /* 0x065F */ + + { 0x0660, 0 }, /* 0x0660 */ + { 0x0661, 0 }, /* 0x0661 */ + { 0x0662, 0 }, /* 0x0662 */ + { 0x0663, 0 }, /* 0x0663 */ + { 0x0664, 0 }, /* 0x0664 */ + { 0x0665, 0 }, /* 0x0665 */ + { 0x0666, 0 }, /* 0x0666 */ + { 0x0667, 0 }, /* 0x0667 */ + { 0x0668, 0 }, /* 0x0668 */ + { 0x0669, 0 }, /* 0x0669 */ + { 0x066A, 0 }, /* 0x066A */ + { 0x066B, 0 }, /* 0x066B */ + { 0x066C, 0 }, /* 0x066C */ + { 0x066D, 0 }, /* 0x066D */ + { 0x066E, 0 }, /* 0x066E */ + { 0x066F, 0 }, /* 0x066F */ + + { 0x0670, 0 }, /* 0x0670 */ + { 0xFB50, 1 }, /* 0x0671 R ALEF WASLA */ + { 0x0672, 0 }, /* 0x0672 */ + { 0x0673, 0 }, /* 0x0673 */ + { 0x0674, 0 }, /* 0x0674 */ + { 0x0675, 0 }, /* 0x0675 */ + { 0x0676, 0 }, /* 0x0676 */ + { 0x0677, 0 }, /* 0x0677 */ + { 0x0678, 0 }, /* 0x0678 */ + { 0xFB66, 3 }, /* 0x0679 D TTEH */ + { 0xFB5E, 3 }, /* 0x067A D TTEHEH */ + { 0xFB52, 3 }, /* 0x067B D BEEH */ + { 0x067C, 0 }, /* 0x067C */ + { 0x067D, 0 }, /* 0x067D */ + { 0xFB56, 3 }, /* 0x067E D PEH */ + { 0xFB62, 3 }, /* 0x067F D TEHEH */ + + { 0xFB5A, 3 }, /* 0x0680 D BEHEH */ + { 0x0681, 0 }, /* 0x0681 */ + { 0x0682, 0 }, /* 0x0682 */ + { 0xFB76, 3 }, /* 0x0683 D NYEH */ + { 0xFB72, 3 }, /* 0x0684 D DYEH */ + { 0x0685, 0 }, /* 0x0685 */ + { 0xFB7A, 3 }, /* 0x0686 D TCHEH */ + { 0xFB7E, 3 }, /* 0x0687 D TCHEHEH */ + { 0xFB88, 1 }, /* 0x0688 R DDAL */ + { 0x0689, 0 }, /* 0x0689 */ + { 0x068A, 0 }, /* 0x068A */ + { 0x068B, 0 }, /* 0x068B */ + { 0xFB84, 1 }, /* 0x068C R DAHAL */ + { 0xFB82, 1 }, /* 0x068D R DDAHAL */ + { 0xFB86, 1 }, /* 0x068E R DUL */ + { 0x068F, 0 }, /* 0x068F */ + + { 0x0690, 0 }, /* 0x0690 */ + { 0xFB8C, 1 }, /* 0x0691 R RREH */ + { 0x0692, 0 }, /* 0x0692 */ + { 0x0693, 0 }, /* 0x0693 */ + { 0x0694, 0 }, /* 0x0694 */ + { 0x0695, 0 }, /* 0x0695 */ + { 0x0696, 0 }, /* 0x0696 */ + { 0x0697, 0 }, /* 0x0697 */ + { 0xFB8A, 1 }, /* 0x0698 R JEH */ + { 0x0699, 0 }, /* 0x0699 */ + { 0x069A, 0 }, /* 0x069A */ + { 0x069B, 0 }, /* 0x069B */ + { 0x069C, 0 }, /* 0x069C */ + { 0x069D, 0 }, /* 0x069D */ + { 0x069E, 0 }, /* 0x069E */ + { 0x069F, 0 }, /* 0x069F */ + + { 0x06A0, 0 }, /* 0x06A0 */ + { 0x06A1, 0 }, /* 0x06A1 */ + { 0x06A2, 0 }, /* 0x06A2 */ + { 0x06A3, 0 }, /* 0x06A3 */ + { 0xFB6A, 3 }, /* 0x06A4 D VEH */ + { 0x06A5, 0 }, /* 0x06A5 */ + { 0xFB6E, 3 }, /* 0x06A6 D PEHEH */ + { 0x06A7, 0 }, /* 0x06A7 */ + { 0x06A8, 0 }, /* 0x06A8 */ + { 0xFB8E, 3 }, /* 0x06A9 D KEHEH */ + { 0x06AA, 0 }, /* 0x06AA */ + { 0x06AB, 0 }, /* 0x06AB */ + { 0x06AC, 0 }, /* 0x06AC */ + { 0xFBD3, 3 }, /* 0x06AD D NG */ + { 0x06AE, 0 }, /* 0x06AE */ + { 0xFB92, 3 }, /* 0x06AF D GAF */ + + { 0x06B0, 0 }, /* 0x06B0 */ + { 0xFB9A, 3 }, /* 0x06B1 D NGOEH */ + { 0x06B2, 0 }, /* 0x06B2 */ + { 0xFB96, 3 }, /* 0x06B3 D GUEH */ + { 0x06B4, 0 }, /* 0x06B4 */ + { 0x06B5, 0 }, /* 0x06B5 */ + { 0x06B6, 0 }, /* 0x06B6 */ + { 0x06B7, 0 }, /* 0x06B7 */ + { 0x06B8, 0 }, /* 0x06B8 */ + { 0x06B9, 0 }, /* 0x06B9 */ + { 0xFB9E, 1 }, /* 0x06BA R NOON GHUNNA */ + { 0xFBA0, 3 }, /* 0x06BB D RNOON */ + { 0x06BC, 0 }, /* 0x06BC */ + { 0x06BD, 0 }, /* 0x06BD */ + { 0xFBAA, 3 }, /* 0x06BE D HEH DOACHASHMEE */ + { 0x06BF, 0 }, /* 0x06BF */ + + { 0xFBA4, 1 }, /* 0x06C0 R HEH WITH YEH ABOVE */ + { 0xFBA6, 3 }, /* 0x06C1 D HEH GOAL */ + { 0x06C2, 0 }, /* 0x06C2 */ + { 0x06C3, 0 }, /* 0x06C3 */ + { 0x06C4, 0 }, /* 0x06C4 */ + { 0xFBE0, 1 }, /* 0x06C5 R KIRGHIZ OE */ + { 0xFBD9, 1 }, /* 0x06C6 R OE */ + { 0xFBD7, 1 }, /* 0x06C7 R U */ + { 0xFBDB, 1 }, /* 0x06C8 R YU */ + { 0xFBE2, 1 }, /* 0x06C9 R KIRGHIZ YU */ + { 0x06CA, 0 }, /* 0x06CA */ + { 0xFBDE, 1 }, /* 0x06CB R VE */ + { 0xFBFC, 3 }, /* 0x06CC D FARSI YEH */ + { 0x06CD, 0 }, /* 0x06CD */ + { 0x06CE, 0 }, /* 0x06CE */ + { 0x06CF, 0 }, /* 0x06CF */ + + { 0xFBE4, 3 }, /* 0x06D0 D E */ + { 0x06D1, 0 }, /* 0x06D1 */ + { 0xFBAE, 1 }, /* 0x06D2 R YEH BARREE */ + { 0xFBB0, 1 }, /* 0x06D3 R YEH BARREE WITH HAMZA ABOVE */ + { 0x06D4, 0 }, /* 0x06D4 */ + { 0x06D5, 0 }, /* 0x06D5 */ + { 0x06D6, 0 }, /* 0x06D6 */ + { 0x06D7, 0 }, /* 0x06D7 */ + { 0x06D8, 0 }, /* 0x06D8 */ + { 0x06D9, 0 }, /* 0x06D9 */ + { 0x06DA, 0 }, /* 0x06DA */ + { 0x06DB, 0 }, /* 0x06DB */ + { 0x06DC, 0 }, /* 0x06DC */ + { 0x06DD, 0 }, /* 0x06DD */ + { 0x06DE, 0 }, /* 0x06DE */ + { 0x06DF, 0 }, /* 0x06DF */ + + { 0x06E0, 0 }, /* 0x06E0 */ + { 0x06E1, 0 }, /* 0x06E1 */ + { 0x06E2, 0 }, /* 0x06E2 */ + { 0x06E3, 0 }, /* 0x06E3 */ + { 0x06E4, 0 }, /* 0x06E4 */ + { 0x06E5, 0 }, /* 0x06E5 */ + { 0x06E6, 0 }, /* 0x06E6 */ + { 0x06E7, 0 }, /* 0x06E7 */ + { 0x06E8, 0 }, /* 0x06E8 */ + { 0x06E9, 0 }, /* 0x06E9 */ + { 0x06EA, 0 }, /* 0x06EA */ + { 0x06EB, 0 }, /* 0x06EB */ + { 0x06EC, 0 }, /* 0x06EC */ + { 0x06ED, 0 }, /* 0x06ED */ + { 0x06EE, 0 }, /* 0x06EE */ + { 0x06EF, 0 }, /* 0x06EF */ + + { 0x06F0, 0 }, /* 0x06F0 */ + { 0x06F1, 0 }, /* 0x06F1 */ + { 0x06F2, 0 }, /* 0x06F2 */ + { 0x06F3, 0 }, /* 0x06F3 */ + { 0x06F4, 0 }, /* 0x06F4 */ + { 0x06F5, 0 }, /* 0x06F5 */ + { 0x06F6, 0 }, /* 0x06F6 */ + { 0x06F7, 0 }, /* 0x06F7 */ + { 0x06F8, 0 }, /* 0x06F8 */ + { 0x06F9, 0 }, /* 0x06F9 */ + { 0x06FA, 0 }, /* 0x06FA */ + { 0x06FB, 0 }, /* 0x06FB */ + { 0x06FC, 0 }, /* 0x06FC */ + { 0x06FD, 0 }, /* 0x06FD */ + { 0x06FE, 0 }, /* 0x06FE */ + { 0x06FF, 0 } /* 0x06FF */ +}; + +/* the arabicUnicodeMapping does not work for U+0649 ALEF MAKSURA, this table does */ +static const hb_uint16 alefMaksura[4] = {0xFEEF, 0xFEF0, 0xFBE8, 0xFBE9}; + +/* +// this is a bit tricky. Alef always binds to the right, so the second parameter descibing the shape +// of the lam can be either initial of medial. So initial maps to the isolated form of the ligature, +// medial to the final form +*/ +static const hb_uint16 arabicUnicodeLamAlefMapping[6][4] = { + { 0xfffd, 0xfffd, 0xfef5, 0xfef6 }, /* 0x622 R Alef with Madda above */ + { 0xfffd, 0xfffd, 0xfef7, 0xfef8 }, /* 0x623 R Alef with Hamza above */ + { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, /* 0x624 // Just to fill the table ;-) */ + { 0xfffd, 0xfffd, 0xfef9, 0xfefa }, /* 0x625 R Alef with Hamza below */ + { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, /* 0x626 // Just to fill the table ;-) */ + { 0xfffd, 0xfffd, 0xfefb, 0xfefc } /* 0x627 R Alef */ +}; + +static int getShape(hb_uint8 cell, int shape) +{ + /* the arabicUnicodeMapping does not work for U+0649 ALEF MAKSURA, handle this here */ + int ch = (cell != 0x49) + ? (shape ? arabicUnicodeMapping[cell][0] + shape : 0x600+cell) + : alefMaksura[shape] ; + return ch; +} + + +/* + Two small helper functions for arabic shaping. +*/ +static HB_UChar16 prevChar(const HB_UChar16 *str, int pos) +{ + /*qDebug("leftChar: pos=%d", pos); */ + const HB_UChar16 *ch = str + pos - 1; + pos--; + while(pos > -1) { + if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing) + return *ch; + pos--; + ch--; + } + return ReplacementCharacter; +} + +static HB_UChar16 nextChar(const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos) +{ + const HB_UChar16 *ch = str + pos + 1; + pos++; + while(pos < len) { + /*qDebug("rightChar: %d isLetter=%d, joining=%d", pos, ch.isLetter(), ch.joining()); */ + if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing) + return *ch; + /* assume it's a transparent char, this might not be 100% correct */ + pos++; + ch++; + } + return ReplacementCharacter; +} + +static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32 from, hb_uint32 len, HB_UChar16 *shapeBuffer, int *shapedLength, + HB_Bool reverse, HB_GlyphAttributes *attributes, unsigned short *logClusters) +{ + HB_ArabicProperties *properties; + hb_int32 f = from; + hb_uint32 l = len; + const HB_UChar16 *ch; + HB_UChar16 *data; + int clusterStart; + hb_uint32 i; + HB_STACKARRAY(HB_ArabicProperties, props, len + 2); + properties = props; + + assert(stringLength >= from + len); + + if(len == 0) { + *shapedLength = 0; + return; + } + + if (from > 0) { + --f; + ++l; + ++properties; + } + if (f + l < stringLength) + ++l; + getArabicProperties(uc+f, l, props); + + ch = uc + from; + data = shapeBuffer; + clusterStart = 0; + + for (i = 0; i < len; i++) { + hb_uint8 r = *ch >> 8; + int gpos = data - shapeBuffer; + + if (r != 0x06) { + if (r == 0x20) { + if (*ch == 0x200c || *ch == 0x200d) + /* remove ZWJ and ZWNJ */ + goto skip; + } + if (reverse) + *data = HB_GetMirroredChar(*ch); + else + *data = *ch; + } else { + hb_uint8 c = *ch & 0xff; + int pos = i + from; + int shape = properties[i].shape; +/* qDebug("mapping U+%x to shape %d glyph=0x%x", ch->unicode(), shape, getShape(c, shape)); */ + /* take care of lam-alef ligatures (lam right of alef) */ + hb_uint16 map; + switch (c) { + case 0x44: { /* lam */ + const HB_UChar16 pch = nextChar(uc, stringLength, pos); + if ((pch >> 8) == 0x06) { + switch (pch & 0xff) { + case 0x22: + case 0x23: + case 0x25: + case 0x27: +/* qDebug(" lam of lam-alef ligature"); */ + map = arabicUnicodeLamAlefMapping[(pch & 0xff) - 0x22][shape]; + goto next; + default: + break; + } + } + break; + } + case 0x22: /* alef with madda */ + case 0x23: /* alef with hamza above */ + case 0x25: /* alef with hamza below */ + case 0x27: /* alef */ + if (prevChar(uc, pos) == 0x0644) { + /* have a lam alef ligature */ + /*qDebug(" alef of lam-alef ligature"); */ + goto skip; + } + default: + break; + } + map = getShape(c, shape); + next: + *data = map; + } + /* ##### Fixme */ + /*glyphs[gpos].attributes.zeroWidth = zeroWidth; */ + if (HB_GetUnicodeCharCategory(*ch) == HB_Mark_NonSpacing) { + attributes[gpos].mark = TRUE; +/* qDebug("glyph %d (char %d) is mark!", gpos, i); */ + } else { + attributes[gpos].mark = FALSE; + clusterStart = data - shapeBuffer; + } + attributes[gpos].clusterStart = !attributes[gpos].mark; + attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(*ch); + attributes[gpos].justification = properties[i].justification; +/* qDebug("data[%d] = %x (from %x)", gpos, (uint)data->unicode(), ch->unicode());*/ + data++; + skip: + ch++; + logClusters[i] = clusterStart; + } + *shapedLength = data - shapeBuffer; + + HB_FREE_STACKARRAY(props); +} + +#ifndef NO_OPENTYPE + +static const HB_OpenTypeFeature arabic_features[] = { + { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, + { HB_MAKE_TAG('i', 's', 'o', 'l'), IsolProperty }, + { HB_MAKE_TAG('f', 'i', 'n', 'a'), FinaProperty }, + { HB_MAKE_TAG('m', 'e', 'd', 'i'), MediProperty }, + { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty }, + { HB_MAKE_TAG('r', 'l', 'i', 'g'), RligProperty }, + { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty }, + { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty }, + { HB_MAKE_TAG('d', 'l', 'i', 'g'), DligProperty }, + { HB_MAKE_TAG('c', 's', 'w', 'h'), CswhProperty }, + /* mset is used in old Win95 fonts that don't have a 'mark' positioning table. */ + { HB_MAKE_TAG('m', 's', 'e', 't'), MsetProperty }, + {0, 0} +}; + +static const HB_OpenTypeFeature syriac_features[] = { + { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, + { HB_MAKE_TAG('i', 's', 'o', 'l'), IsolProperty }, + { HB_MAKE_TAG('f', 'i', 'n', 'a'), FinaProperty }, + { HB_MAKE_TAG('f', 'i', 'n', '2'), FinaProperty }, + { HB_MAKE_TAG('f', 'i', 'n', '3'), FinaProperty }, + { HB_MAKE_TAG('m', 'e', 'd', 'i'), MediProperty }, + { HB_MAKE_TAG('m', 'e', 'd', '2'), MediProperty }, + { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty }, + { HB_MAKE_TAG('r', 'l', 'i', 'g'), RligProperty }, + { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty }, + { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty }, + { HB_MAKE_TAG('d', 'l', 'i', 'g'), DligProperty }, + {0, 0} +}; + +static HB_Bool arabicSyriacOpenTypeShape(HB_ShaperItem *item, HB_Bool *ot_ok) +{ + const HB_UChar16 *uc; + const int nglyphs = item->num_glyphs; + hb_int32 f; + hb_uint32 l; + HB_ArabicProperties *properties; + HB_DECLARE_STACKARRAY(HB_ArabicProperties, props) + HB_DECLARE_STACKARRAY(hb_uint32, apply) + HB_Bool shaped; + int i = 0; + + *ot_ok = TRUE; + + if (!HB_ConvertStringToGlyphIndices(item)) + return FALSE; + HB_HeuristicSetGlyphAttributes(item); + + HB_INIT_STACKARRAY(HB_ArabicProperties, props, item->item.length + 2); + HB_INIT_STACKARRAY(hb_uint32, apply, item->num_glyphs); + + uc = item->string + item->item.pos; + + properties = props; + f = 0; + l = item->item.length; + if (item->item.pos > 0) { + --f; + ++l; + ++properties; + } + if (f + l + item->item.pos < item->stringLength) { + ++l; + } + if (item->item.script == HB_Script_Nko) + getNkoProperties(uc+f, l, props); + else + getArabicProperties(uc+f, l, props); + + for (i = 0; i < (int)item->num_glyphs; i++) { + apply[i] = 0; + + if (properties[i].shape == XIsolated) + apply[i] |= MediProperty|FinaProperty|InitProperty; + else if (properties[i].shape == XMedial) + apply[i] |= IsolProperty|FinaProperty|InitProperty; + else if (properties[i].shape == XFinal) + apply[i] |= IsolProperty|MediProperty|InitProperty; + else if (properties[i].shape == XInitial) + apply[i] |= IsolProperty|MediProperty|FinaProperty; + + item->attributes[i].justification = properties[i].justification; + } + + HB_FREE_STACKARRAY(props); + + shaped = HB_OpenTypeShape(item, apply); + + HB_FREE_STACKARRAY(apply); + + if (!shaped) { + *ot_ok = FALSE; + return FALSE; + } + return HB_OpenTypePosition(item, nglyphs, /*doLogClusters*/TRUE); +} + +#endif + +/* #### stil missing: identify invalid character combinations */ +HB_Bool HB_ArabicShape(HB_ShaperItem *item) +{ + int slen; + HB_Bool haveGlyphs; + HB_STACKARRAY(HB_UChar16, shapedChars, item->item.length); + + assert(item->item.script == HB_Script_Arabic || item->item.script == HB_Script_Syriac + || item->item.script == HB_Script_Nko); + +#ifndef NO_OPENTYPE + + if (HB_SelectScript(item, item->item.script == HB_Script_Arabic ? arabic_features : syriac_features)) { + HB_Bool ot_ok; + if (arabicSyriacOpenTypeShape(item, &ot_ok)) + return TRUE; + if (ot_ok) + return FALSE; + /* fall through to the non OT code*/ + } +#endif + + if (item->item.script != HB_Script_Arabic) + return HB_BasicShape(item); + + shapedString(item->string, item->stringLength, item->item.pos, item->item.length, shapedChars, &slen, + item->item.bidiLevel % 2, + item->attributes, item->log_clusters); + + haveGlyphs = item->font->klass + ->convertStringToGlyphIndices(item->font, + shapedChars, slen, + item->glyphs, &item->num_glyphs, + item->item.bidiLevel % 2); + + HB_FREE_STACKARRAY(shapedChars); + + if (!haveGlyphs) + return FALSE; + + HB_HeuristicPosition(item); + return TRUE; +} + + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-buffer-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-buffer-private.h new file mode 100644 index 0000000000..5065f2e031 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-buffer-private.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2004,2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Owen Taylor, Behdad Esfahbod + */ + +#ifndef HARFBUZZ_BUFFER_PRIVATE_H +#define HARFBUZZ_BUFFER_PRIVATE_H + +#include "harfbuzz-impl.h" +#include "harfbuzz-buffer.h" + +HB_BEGIN_HEADER + +#define HB_GLYPH_PROPERTIES_UNKNOWN 0xFFFF + +HB_INTERNAL void +_hb_buffer_swap( HB_Buffer buffer ); + +HB_INTERNAL void +_hb_buffer_clear_output( HB_Buffer buffer ); + +HB_INTERNAL HB_Error +_hb_buffer_clear_positions( HB_Buffer buffer ); + +HB_INTERNAL HB_Error +_hb_buffer_add_output_glyphs( HB_Buffer buffer, + HB_UShort num_in, + HB_UShort num_out, + HB_UShort *glyph_data, + HB_UShort component, + HB_UShort ligID ); + +HB_INTERNAL HB_Error +_hb_buffer_add_output_glyph ( HB_Buffer buffer, + HB_UInt glyph_index, + HB_UShort component, + HB_UShort ligID ); + +HB_INTERNAL HB_Error +_hb_buffer_copy_output_glyph ( HB_Buffer buffer ); + +HB_INTERNAL HB_Error +_hb_buffer_replace_output_glyph ( HB_Buffer buffer, + HB_UInt glyph_index, + HB_Bool inplace ); + +HB_INTERNAL HB_UShort +_hb_buffer_allocate_ligid( HB_Buffer buffer ); + + +/* convenience macros */ + +#define IN_GLYPH( pos ) (buffer->in_string[(pos)].gindex) +#define IN_ITEM( pos ) (&buffer->in_string[(pos)]) +#define IN_CURGLYPH() (buffer->in_string[buffer->in_pos].gindex) +#define IN_CURITEM() (&buffer->in_string[buffer->in_pos]) +#define IN_PROPERTIES( pos ) (buffer->in_string[(pos)].properties) +#define IN_LIGID( pos ) (buffer->in_string[(pos)].ligID) +#define IN_COMPONENT( pos ) (buffer->in_string[(pos)].component) +#define POSITION( pos ) (&buffer->positions[(pos)]) +#define OUT_GLYPH( pos ) (buffer->out_string[(pos)].gindex) +#define OUT_ITEM( pos ) (&buffer->out_string[(pos)]) + +#define CHECK_Property( gdef, index, flags, property ) \ + ( ( error = _HB_GDEF_Check_Property( (gdef), (index), (flags), \ + (property) ) ) != HB_Err_Ok ) + +#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID ) \ + ( ( error = _hb_buffer_add_output_glyphs( (buffer), \ + (num_in), (num_out), \ + (glyph_data), (component), (ligID) \ + ) ) != HB_Err_Ok ) +#define ADD_Glyph( buffer, glyph_index, component, ligID ) \ + ( ( error = _hb_buffer_add_output_glyph( (buffer), \ + (glyph_index), (component), (ligID) \ + ) ) != HB_Err_Ok ) +#define REPLACE_Glyph( buffer, glyph_index, nesting_level ) \ + ( ( error = _hb_buffer_replace_output_glyph( (buffer), (glyph_index), \ + (nesting_level) == 1 ) ) != HB_Err_Ok ) +#define COPY_Glyph( buffer ) \ + ( (error = _hb_buffer_copy_output_glyph ( buffer ) ) != HB_Err_Ok ) + +HB_END_HEADER + +#endif /* HARFBUZZ_BUFFER_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.c b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.c new file mode 100644 index 0000000000..4d4c16717f --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.c @@ -0,0 +1,383 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2004,2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Owen Taylor, Behdad Esfahbod + */ + +#include "harfbuzz-impl.h" +#include "harfbuzz-buffer-private.h" +#include "harfbuzz-gsub-private.h" +#include "harfbuzz-gpos-private.h" + +/* Here is how the buffer works internally: + * + * There are two string pointers: in_string and out_string. They + * always have same allocated size, but different length and positions. + * + * As an optimization, both in_string and out_string may point to the + * same piece of memory, which is owned by in_string. This remains the + * case as long as: + * + * - copy_glyph() is called + * - replace_glyph() is called with inplace=TRUE + * - add_output_glyph() and add_output_glyphs() are not called + * + * In that case swap(), and copy_glyph(), and replace_glyph() are all + * mostly no-op. + * + * As soon an add_output_glyph[s]() or replace_glyph() with inplace=FALSE is + * called, out_string is moved over to an alternate buffer (alt_string), and + * its current contents (out_length entries) are copied to the alt buffer. + * This should all remain transparent to the user. swap() then switches + * in_string and alt_string. alt_string is not allocated until its needed, + * but after that it's grown with in_string unconditionally. + * + * The buffer->separate_out boolean keeps status of whether out_string points + * to in_string (FALSE) or alt_string (TRUE). + */ + +/* Internal API */ + +static HB_Error +hb_buffer_ensure( HB_Buffer buffer, + HB_UInt size ) +{ + HB_UInt new_allocated = buffer->allocated; + + if (size > new_allocated) + { + HB_Error error; + + while (size > new_allocated) + new_allocated += (new_allocated >> 1) + 8; + + if ( buffer->positions ) + { + if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) ) + return error; + } + + if ( REALLOC_ARRAY( buffer->in_string, new_allocated, HB_GlyphItemRec ) ) + return error; + + if ( buffer->separate_out ) + { + if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) ) + return error; + + buffer->out_string = buffer->alt_string; + } + else + { + buffer->out_string = buffer->in_string; + + if ( buffer->alt_string ) + { + if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) ) + return error; + } + } + + buffer->allocated = new_allocated; + } + + return HB_Err_Ok; +} + +static HB_Error +hb_buffer_duplicate_out_buffer( HB_Buffer buffer ) +{ + if ( !buffer->alt_string ) + { + HB_Error error; + + if ( ALLOC_ARRAY( buffer->alt_string, buffer->allocated, HB_GlyphItemRec ) ) + return error; + } + + buffer->out_string = buffer->alt_string; + memcpy( buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]) ); + buffer->separate_out = TRUE; + + return HB_Err_Ok; +} + +/* Public API */ + +HB_Error +hb_buffer_new( HB_Buffer *pbuffer ) +{ + HB_Buffer buffer; + HB_Error error; + + if ( ALLOC( buffer, sizeof( HB_BufferRec ) ) ) + return error; + + buffer->allocated = 0; + buffer->in_string = NULL; + buffer->alt_string = NULL; + buffer->positions = NULL; + + hb_buffer_clear( buffer ); + + *pbuffer = buffer; + + return HB_Err_Ok; +} + +void +hb_buffer_free( HB_Buffer buffer ) +{ + FREE( buffer->in_string ); + FREE( buffer->alt_string ); + buffer->out_string = NULL; + FREE( buffer->positions ); + FREE( buffer ); +} + +void +hb_buffer_clear( HB_Buffer buffer ) +{ + buffer->in_length = 0; + buffer->out_length = 0; + buffer->in_pos = 0; + buffer->out_pos = 0; + buffer->out_string = buffer->in_string; + buffer->separate_out = FALSE; + buffer->max_ligID = 0; +} + +HB_Error +hb_buffer_add_glyph( HB_Buffer buffer, + HB_UInt glyph_index, + HB_UInt properties, + HB_UInt cluster ) +{ + HB_Error error; + HB_GlyphItem glyph; + + error = hb_buffer_ensure( buffer, buffer->in_length + 1 ); + if ( error ) + return error; + + glyph = &buffer->in_string[buffer->in_length]; + glyph->gindex = glyph_index; + glyph->properties = properties; + glyph->cluster = cluster; + glyph->component = 0; + glyph->ligID = 0; + glyph->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN; + + buffer->in_length++; + + return HB_Err_Ok; +} + +/* HarfBuzz-Internal API */ + +HB_INTERNAL void +_hb_buffer_clear_output( HB_Buffer buffer ) +{ + buffer->out_length = 0; + buffer->out_pos = 0; + buffer->out_string = buffer->in_string; + buffer->separate_out = FALSE; +} + +HB_INTERNAL HB_Error +_hb_buffer_clear_positions( HB_Buffer buffer ) +{ + if ( !buffer->positions ) + { + HB_Error error; + + if ( ALLOC_ARRAY( buffer->positions, buffer->allocated, HB_PositionRec ) ) + return error; + } + + memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length); + + return HB_Err_Ok; +} + +HB_INTERNAL void +_hb_buffer_swap( HB_Buffer buffer ) +{ + HB_GlyphItem tmp_string; + int tmp_length; + int tmp_pos; + + if ( buffer->separate_out ) + { + tmp_string = buffer->in_string; + buffer->in_string = buffer->out_string; + buffer->out_string = tmp_string; + buffer->alt_string = buffer->out_string; + } + + tmp_length = buffer->in_length; + buffer->in_length = buffer->out_length; + buffer->out_length = tmp_length; + + tmp_pos = buffer->in_pos; + buffer->in_pos = buffer->out_pos; + buffer->out_pos = tmp_pos; +} + +/* The following function copies `num_out' elements from `glyph_data' + to `buffer->out_string', advancing the in array pointer in the structure + by `num_in' elements, and the out array pointer by `num_out' elements. + Finally, it sets the `length' field of `out' equal to + `pos' of the `out' structure. + + If `component' is 0xFFFF, the component value from buffer->in_pos + will copied `num_out' times, otherwise `component' itself will + be used to fill the `component' fields. + + If `ligID' is 0xFFFF, the ligID value from buffer->in_pos + will copied `num_out' times, otherwise `ligID' itself will + be used to fill the `ligID' fields. + + The properties for all replacement glyphs are taken + from the glyph at position `buffer->in_pos'. + + The cluster value for the glyph at position buffer->in_pos is used + for all replacement glyphs */ +HB_INTERNAL HB_Error +_hb_buffer_add_output_glyphs( HB_Buffer buffer, + HB_UShort num_in, + HB_UShort num_out, + HB_UShort *glyph_data, + HB_UShort component, + HB_UShort ligID ) +{ + HB_Error error; + HB_UShort i; + HB_UInt properties; + HB_UInt cluster; + + error = hb_buffer_ensure( buffer, buffer->out_pos + num_out ); + if ( error ) + return error; + + if ( !buffer->separate_out ) + { + error = hb_buffer_duplicate_out_buffer( buffer ); + if ( error ) + return error; + } + + properties = buffer->in_string[buffer->in_pos].properties; + cluster = buffer->in_string[buffer->in_pos].cluster; + if ( component == 0xFFFF ) + component = buffer->in_string[buffer->in_pos].component; + if ( ligID == 0xFFFF ) + ligID = buffer->in_string[buffer->in_pos].ligID; + + for ( i = 0; i < num_out; i++ ) + { + HB_GlyphItem item = &buffer->out_string[buffer->out_pos + i]; + + item->gindex = glyph_data[i]; + item->properties = properties; + item->cluster = cluster; + item->component = component; + item->ligID = ligID; + item->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN; + } + + buffer->in_pos += num_in; + buffer->out_pos += num_out; + + buffer->out_length = buffer->out_pos; + + return HB_Err_Ok; +} + +HB_INTERNAL HB_Error +_hb_buffer_add_output_glyph( HB_Buffer buffer, + HB_UInt glyph_index, + HB_UShort component, + HB_UShort ligID ) +{ + HB_UShort glyph_data = glyph_index; + + return _hb_buffer_add_output_glyphs ( buffer, 1, 1, + &glyph_data, component, ligID ); +} + +HB_INTERNAL HB_Error +_hb_buffer_copy_output_glyph ( HB_Buffer buffer ) +{ + HB_Error error; + + error = hb_buffer_ensure( buffer, buffer->out_pos + 1 ); + if ( error ) + return error; + + if ( buffer->separate_out ) + { + buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos]; + } + + buffer->in_pos++; + buffer->out_pos++; + buffer->out_length = buffer->out_pos; + + return HB_Err_Ok; +} + +HB_INTERNAL HB_Error +_hb_buffer_replace_output_glyph( HB_Buffer buffer, + HB_UInt glyph_index, + HB_Bool inplace ) +{ + + HB_Error error; + + if ( inplace ) + { + error = _hb_buffer_copy_output_glyph ( buffer ); + if ( error ) + return error; + + buffer->out_string[buffer->out_pos-1].gindex = glyph_index; + } + else + { + return _hb_buffer_add_output_glyph( buffer, glyph_index, 0xFFFF, 0xFFFF ); + } + + return HB_Err_Ok; +} + +HB_INTERNAL HB_UShort +_hb_buffer_allocate_ligid( HB_Buffer buffer ) +{ + buffer->max_ligID++; + if (HB_UNLIKELY (buffer->max_ligID == 0)) + buffer->max_ligID++; + + return buffer->max_ligID; +} diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h new file mode 100644 index 0000000000..0d631b20a6 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-buffer.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2004,2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Owen Taylor, Behdad Esfahbod + */ + +#ifndef HARFBUZZ_BUFFER_H +#define HARFBUZZ_BUFFER_H + +#include "harfbuzz-global.h" + +HB_BEGIN_HEADER + +typedef struct HB_GlyphItemRec_ { + HB_UInt gindex; + HB_UInt properties; + HB_UInt cluster; + HB_UShort component; + HB_UShort ligID; + HB_UShort gproperties; +} HB_GlyphItemRec, *HB_GlyphItem; + +typedef struct HB_PositionRec_ { + HB_Fixed x_pos; + HB_Fixed y_pos; + HB_Fixed x_advance; + HB_Fixed y_advance; + HB_UShort back; /* number of glyphs to go back + for drawing current glyph */ + HB_Short cursive_chain; /* character to which this connects, + may be positive or negative; used + only internally */ + HB_Bool new_advance; /* if set, the advance width values are + absolute, i.e., they won't be + added to the original glyph's value + but rather replace them. */ +} HB_PositionRec, *HB_Position; + + +typedef struct HB_BufferRec_{ + HB_UInt allocated; + + HB_UInt in_length; + HB_UInt out_length; + HB_UInt in_pos; + HB_UInt out_pos; + + HB_GlyphItem in_string; + HB_GlyphItem out_string; + HB_GlyphItem alt_string; + HB_Position positions; + HB_UShort max_ligID; + HB_Bool separate_out; +} HB_BufferRec, *HB_Buffer; + +HB_Error +hb_buffer_new( HB_Buffer *buffer ); + +void +hb_buffer_free( HB_Buffer buffer ); + +void +hb_buffer_clear( HB_Buffer buffer ); + +HB_Error +hb_buffer_add_glyph( HB_Buffer buffer, + HB_UInt glyph_index, + HB_UInt properties, + HB_UInt cluster ); + +HB_END_HEADER + +#endif /* HARFBUZZ_BUFFER_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c b/src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c new file mode 100644 index 0000000000..dfb35fbaaf --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-dump-main.c @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2000 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Owen Taylor + */ + +#include +#include + +#include "harfbuzz.h" +#include "harfbuzz-dump.h" + +#define N_ELEMENTS(arr) (sizeof(arr)/ sizeof((arr)[0])) + +static int +croak (const char *situation, HB_Error error) +{ + fprintf (stderr, "%s: Error %d\n", situation, error); + + exit (1); +} + +int +main (int argc, char **argv) +{ + HB_Error error; + FT_Library library; + HB_Font font; + HB_GSUB gsub; + HB_GPOS gpos; + + if (argc != 2) + { + fprintf (stderr, "Usage: harfbuzz-dump MYFONT.TTF\n"); + exit(1); + } + + if ((error = FT_Init_FreeType (&library))) + croak ("FT_Init_FreeType", error); + + if ((error = FT_New_Face (library, argv[1], 0, &font))) + croak ("FT_New_Face", error); + + printf ("\n"); + printf ("\n"); + + if (!(error = HB_Load_GSUB_Table (font, &gsub, NULL))) + { + HB_Dump_GSUB_Table (gsub, stdout); + + if ((error = HB_Done_GSUB_Table (gsub))) + croak ("HB_Done_GSUB_Table", error); + } + else if (error != HB_Err_Not_Covered) + fprintf (stderr, "HB_Load_GSUB_Table: error 0x%x\n", error); + + if (!(error = HB_Load_GPOS_Table (font, &gpos, NULL))) + { + HB_Dump_GPOS_Table (gpos, stdout); + + if ((error = HB_Done_GPOS_Table (gpos))) + croak ("HB_Done_GPOS_Table", error); + } + else if (error != HB_Err_Not_Covered) + fprintf (stderr, "HB_Load_GPOS_Table: error 0x%x\n", error); + + printf ("\n"); + + if ((error = FT_Done_Face (font))) + croak ("FT_Done_Face", error); + + if ((error = FT_Done_FreeType (library))) + croak ("FT_Done_FreeType", error); + + return 0; +} + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-dump.c b/src/3rdparty/harfbuzz/src/harfbuzz-dump.c new file mode 100644 index 0000000000..54d42e93d4 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-dump.c @@ -0,0 +1,767 @@ +/* + * Copyright (C) 2000, 2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Owen Taylor, Behdad Esfahbod + */ + +#include "harfbuzz-impl.h" +#include "harfbuzz-dump.h" +#include "harfbuzz-gdef-private.h" +#include "harfbuzz-gsub-private.h" +#include "harfbuzz-gpos-private.h" +#include "harfbuzz-open-private.h" +#include + +#define DUMP(format) dump (stream, indent, format) +#define DUMP1(format, arg1) dump (stream, indent, format, arg1) +#define DUMP2(format, arg1, arg2) dump (stream, indent, format, arg1, arg2) +#define DUMP3(format, arg1, arg2, arg3) dump (stream, indent, format, arg1, arg2, arg3) + +#define DUMP_FINT(strct,fld) dump (stream, indent, "<" #fld ">%d\n", (strct)->fld) +#define DUMP_FUINT(strct,fld) dump (stream, indent, "<" #fld ">%u\n", (strct)->fld) +#define DUMP_FGLYPH(strct,fld) dump (stream, indent, "<" #fld ">%#06x\n", (strct)->fld) +#define DUMP_FGLYPH(strct,fld) dump (stream, indent, "<" #fld ">%#06x\n", (strct)->fld) +#define DUMP_USHORT_ARRAY(strct,fld,cnt) Dump_UShort_Array ((strct)->fld, cnt, #fld, stream, indent); + +#define DEF_DUMP(type) static void Dump_ ## type (HB_ ## type *type, FILE *stream, int indent, HB_Type hb_type) +#define RECURSE(name, type, val) do { DUMP ("<" #name ">\n"); Dump_ ## type (val, stream, indent + 1, hb_type); DUMP ("\n"); } while (0) +#define RECURSE_NUM(name, i, type, val) do { DUMP1 ("<" #name "> \n", i); Dump_ ## type (val, stream, indent + 1, hb_type); DUMP ("\n"); } while (0) +#define DUMP_VALUE_RECORD(val, frmt) do { DUMP ("\n"); Dump_ValueRecord (val, stream, indent + 1, hb_type, frmt); DUMP ("\n"); } while (0) + +static void +do_indent (FILE *stream, int indent) +{ + fprintf (stream, "%*s", indent * 3, ""); +} + +static void +dump (FILE *stream, int indent, const char *format, ...) +{ + va_list list; + + do_indent (stream, indent); + + va_start (list, format); + vfprintf (stream, format, list); + va_end (list); +} + +static void +Dump_UShort_Array (HB_UShort *array, int count, const char *name, FILE *stream, int indent) +{ + int i; + + do_indent (stream, indent); + + fprintf (stream, "<%s>", name); + for (i = 0; i < count; i++) + fprintf (stream, "%d%s", array[i], i == 0 ? "" : " "); + fprintf (stream, "\n", name); +} + +static void +Print_Tag (HB_UInt tag, FILE *stream) +{ + fprintf (stream, "%c%c%c%c", + (unsigned char)(tag >> 24), + (unsigned char)((tag >> 16) & 0xff), + (unsigned char)((tag >> 8) & 0xff), + (unsigned char)(tag & 0xff)); +} + +DEF_DUMP (LangSys) +{ + int i; + + HB_UNUSED(hb_type); + + DUMP_FUINT (LangSys, LookupOrderOffset); + DUMP_FUINT (LangSys, ReqFeatureIndex); + DUMP_FUINT (LangSys, FeatureCount); + + for (i=0; i < LangSys->FeatureCount; i++) + DUMP1("%d\n", LangSys->FeatureIndex[i]); +} + +DEF_DUMP (ScriptTable) +{ + int i; + + RECURSE (DefaultLangSys, LangSys, &ScriptTable->DefaultLangSys); + + DUMP_FUINT (ScriptTable, LangSysCount); + + for (i=0; i < ScriptTable->LangSysCount; i++) + { + do_indent (stream, indent); + fprintf (stream, ""); + Print_Tag (ScriptTable->LangSysRecord[i].LangSysTag, stream); + fprintf (stream, "\n"); + RECURSE_NUM (LangSys, i, LangSys, &ScriptTable->LangSysRecord[i].LangSys); + } +} + +DEF_DUMP (ScriptList) +{ + int i; + + DUMP_FUINT (ScriptList, ScriptCount); + + for (i=0; i < ScriptList->ScriptCount; i++) + { + do_indent (stream, indent); + fprintf (stream, ""); + Print_Tag (ScriptList->ScriptRecord[i].ScriptTag, stream); + fprintf (stream, "\n"); + RECURSE_NUM (Script, i, ScriptTable, &ScriptList->ScriptRecord[i].Script); + } +} + +DEF_DUMP (Feature) +{ + int i; + + HB_UNUSED(hb_type); + + DUMP_FUINT (Feature, FeatureParams); + DUMP_FUINT (Feature, LookupListCount); + + for (i=0; i < Feature->LookupListCount; i++) + DUMP1("%d\n", Feature->LookupListIndex[i]); +} + +DEF_DUMP (MarkRecord) +{ + HB_UNUSED(hb_type); + + DUMP_FUINT (MarkRecord, Class); + DUMP1("%d\n", MarkRecord->MarkAnchor.PosFormat ); +} + +DEF_DUMP (MarkArray) +{ + int i; + + DUMP_FUINT (MarkArray, MarkCount); + + for (i=0; i < MarkArray->MarkCount; i++) + RECURSE_NUM (MarkRecord, i, MarkRecord, &MarkArray->MarkRecord[i]); +} + +DEF_DUMP (FeatureList) +{ + int i; + + DUMP_FUINT (FeatureList, FeatureCount); + + for (i=0; i < FeatureList->FeatureCount; i++) + { + do_indent (stream, indent); + fprintf (stream, ""); + Print_Tag (FeatureList->FeatureRecord[i].FeatureTag, stream); + fprintf (stream, " \n", i); + RECURSE_NUM (Feature, i, Feature, &FeatureList->FeatureRecord[i].Feature); + } +} + +DEF_DUMP (Coverage) +{ + HB_UNUSED(hb_type); + + DUMP_FUINT (Coverage, CoverageFormat); + + if (Coverage->CoverageFormat == 1) + { + int i; + DUMP_FUINT (&Coverage->cf.cf1, GlyphCount); + + for (i = 0; i < Coverage->cf.cf1.GlyphCount; i++) + DUMP2("%#06x \n", + Coverage->cf.cf1.GlyphArray[i], i); + } + else + { + int i; + DUMP_FUINT (&Coverage->cf.cf2, RangeCount); + + for ( i = 0; i < Coverage->cf.cf2.RangeCount; i++ ) + DUMP3("%#06x - %#06x \n", + Coverage->cf.cf2.RangeRecord[i].Start, + Coverage->cf.cf2.RangeRecord[i].End, i); + } +} + +DEF_DUMP (ClassRangeRecord) +{ + HB_UNUSED(hb_type); + + DUMP_FGLYPH (ClassRangeRecord, Start); + DUMP_FGLYPH (ClassRangeRecord, End); + DUMP_FUINT (ClassRangeRecord, Class); +} + +DEF_DUMP (ClassDefinition) +{ + HB_UNUSED(hb_type); + + DUMP_FUINT( ClassDefinition, ClassFormat); + DUMP_FUINT( ClassDefinition, loaded); + + if (ClassDefinition->ClassFormat == 1) + { + int i; + HB_ClassDefFormat1 *ClassDefFormat1 = &ClassDefinition->cd.cd1; + DUMP("\n"); + DUMP_FUINT (ClassDefFormat1, StartGlyph ); + DUMP_FUINT (ClassDefFormat1, GlyphCount ); + for (i = 0; i < ClassDefFormat1->GlyphCount; i++) + DUMP2(" %d ", ClassDefFormat1->ClassValueArray[i], + ClassDefFormat1->StartGlyph+i ); + } + else if (ClassDefinition->ClassFormat == 2) + { + int i; + HB_ClassDefFormat2 *ClassDefFormat2 = &ClassDefinition->cd.cd2; + DUMP_FUINT (ClassDefFormat2, ClassRangeCount); + + for (i = 0; i < ClassDefFormat2->ClassRangeCount; i++) + RECURSE_NUM (ClassRangeRecord, i, ClassRangeRecord, &ClassDefFormat2->ClassRangeRecord[i]); + } + else + fprintf(stderr, "invalid class def table!!!\n"); +} + +DEF_DUMP (SubstLookupRecord) +{ + HB_UNUSED(hb_type); + + DUMP_FUINT (SubstLookupRecord, SequenceIndex); + DUMP_FUINT (SubstLookupRecord, LookupListIndex); +} + +DEF_DUMP (ChainSubClassRule) +{ + int i; + + DUMP_USHORT_ARRAY (ChainSubClassRule, Backtrack, ChainSubClassRule->BacktrackGlyphCount); + DUMP_USHORT_ARRAY (ChainSubClassRule, Input, ChainSubClassRule->InputGlyphCount - 1); + DUMP_USHORT_ARRAY (ChainSubClassRule, Lookahead, ChainSubClassRule->LookaheadGlyphCount); + + for (i = 0; i < ChainSubClassRule->SubstCount; i++) + RECURSE_NUM (SubstLookupRecord, i, SubstLookupRecord, &ChainSubClassRule->SubstLookupRecord[i]); + + indent--; +} + +DEF_DUMP (ChainSubClassSet) +{ + int i; + + DUMP_FUINT( ChainSubClassSet, ChainSubClassRuleCount ); + for (i = 0; i < ChainSubClassSet->ChainSubClassRuleCount; i++) + RECURSE_NUM (ChainSubClassRule, i, ChainSubClassRule, &ChainSubClassSet->ChainSubClassRule[i]); +} + +static void +Dump_GSUB_Lookup_Single (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) +{ + HB_SingleSubst *SingleSubst = &subtable->st.gsub.single; + + DUMP_FUINT (SingleSubst, SubstFormat); + RECURSE (Coverage, Coverage, &SingleSubst->Coverage); + + if (SingleSubst->SubstFormat == 1) + { + DUMP_FINT (&SingleSubst->ssf.ssf1, DeltaGlyphID); + } + else + { + int i; + + DUMP_FINT (&SingleSubst->ssf.ssf2, GlyphCount); + for (i=0; i < SingleSubst->ssf.ssf2.GlyphCount; i++) + DUMP2("%#06x \n", SingleSubst->ssf.ssf2.Substitute[i], i); + } +} + +DEF_DUMP (Ligature) +{ + int i; + + HB_UNUSED(hb_type); + + DUMP_FGLYPH (Ligature, LigGlyph); + DUMP_FUINT (Ligature, ComponentCount); + + for (i=0; i < Ligature->ComponentCount - 1; i++) + DUMP1("%#06x\n", Ligature->Component[i]); +} + +DEF_DUMP (LigatureSet) +{ + int i; + + DUMP_FUINT (LigatureSet, LigatureCount); + + for (i=0; i < LigatureSet->LigatureCount; i++) + RECURSE_NUM (Ligature, i, Ligature, &LigatureSet->Ligature[i]); +} + +static void +Dump_GSUB_Lookup_Ligature (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) +{ + int i; + HB_LigatureSubst *LigatureSubst = &subtable->st.gsub.ligature; + + DUMP_FUINT (LigatureSubst, SubstFormat); + RECURSE (Coverage, Coverage, &LigatureSubst->Coverage); + + DUMP_FUINT (LigatureSubst, LigatureSetCount); + + for (i=0; i < LigatureSubst->LigatureSetCount; i++) + RECURSE_NUM (LigatureSet, i, LigatureSet, &LigatureSubst->LigatureSet[i]); +} + +DEF_DUMP (ContextSubstFormat1) +{ + HB_UNUSED(hb_type); + HB_UNUSED(ContextSubstFormat1); + + + DUMP("\n"); +} + +DEF_DUMP (ContextSubstFormat2) +{ + DUMP_FUINT (ContextSubstFormat2, MaxContextLength); + RECURSE (Coverage, Coverage, &ContextSubstFormat2->Coverage); + RECURSE (ClassDefinition, ClassDefinition, &ContextSubstFormat2->ClassDef); +} + +DEF_DUMP (ContextSubstFormat3) +{ + HB_UNUSED(hb_type); + HB_UNUSED(ContextSubstFormat3); + + DUMP("\n"); +} + +static void +Dump_GSUB_Lookup_Context (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) +{ + HB_ContextSubst *ContextSubst = &subtable->st.gsub.context; + + DUMP_FUINT (ContextSubst, SubstFormat); + switch( ContextSubst->SubstFormat ) + { + case 1: + Dump_ContextSubstFormat1 (&ContextSubst->csf.csf1, stream, indent+2, hb_type); + break; + case 2: + Dump_ContextSubstFormat2 (&ContextSubst->csf.csf2, stream, indent+2, hb_type); + break; + case 3: + Dump_ContextSubstFormat3 (&ContextSubst->csf.csf3, stream, indent+2, hb_type); + break; + default: + fprintf(stderr, "invalid subformat!!!!!\n"); + } +} + +DEF_DUMP (ChainContextSubstFormat1) +{ + HB_UNUSED(hb_type); + HB_UNUSED(ChainContextSubstFormat1); + + DUMP("\n"); +} + +DEF_DUMP (ChainContextSubstFormat2) +{ + int i; + + RECURSE (Coverage, Coverage, &ChainContextSubstFormat2->Coverage); + DUMP_FUINT (ChainContextSubstFormat2, MaxBacktrackLength); + RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->BacktrackClassDef); + DUMP_FUINT (ChainContextSubstFormat2, MaxInputLength); + RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->InputClassDef); + DUMP_FUINT (ChainContextSubstFormat2, MaxLookaheadLength); + RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->LookaheadClassDef); + + DUMP_FUINT (ChainContextSubstFormat2, ChainSubClassSetCount); + for (i = 0; i < ChainContextSubstFormat2->ChainSubClassSetCount; i++) + RECURSE (ChainSubClassSet, ChainSubClassSet, &ChainContextSubstFormat2->ChainSubClassSet[i]); +} + +DEF_DUMP (ChainContextSubstFormat3) +{ + int i; + + DUMP_FUINT (ChainContextSubstFormat3, BacktrackGlyphCount); + for (i = 0; i < ChainContextSubstFormat3->BacktrackGlyphCount; i++) + RECURSE (BacktrackCoverage, Coverage, &ChainContextSubstFormat3->BacktrackCoverage[i]); + DUMP_FUINT (ChainContextSubstFormat3, InputGlyphCount); + for (i = 0; i < ChainContextSubstFormat3->InputGlyphCount; i++) + RECURSE (InputCoverage, Coverage, &ChainContextSubstFormat3->InputCoverage[i]); + DUMP_FUINT (ChainContextSubstFormat3, LookaheadGlyphCount); + for (i = 0; i < ChainContextSubstFormat3->LookaheadGlyphCount; i++) + RECURSE (LookaheadCoverage, Coverage, &ChainContextSubstFormat3->LookaheadCoverage[i]); + + for (i = 0; i < ChainContextSubstFormat3->SubstCount; i++) + RECURSE_NUM (SubstLookupRecord, i, SubstLookupRecord, &ChainContextSubstFormat3->SubstLookupRecord[i]); + +} + +static void +Dump_GSUB_Lookup_Chain (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) +{ + HB_ChainContextSubst *chain = &subtable->st.gsub.chain; + + DUMP_FUINT (chain, SubstFormat); + switch (chain->SubstFormat) + { + case 1: + Dump_ChainContextSubstFormat1 (&chain->ccsf.ccsf1, stream, indent+2, hb_type); + break; + case 2: + Dump_ChainContextSubstFormat2 (&chain->ccsf.ccsf2, stream, indent+2, hb_type); + break; + case 3: + Dump_ChainContextSubstFormat3 (&chain->ccsf.ccsf3, stream, indent+2, hb_type); + break; + default: + fprintf(stderr, "invalid subformat!!!!!\n"); + } +} + +static void +Dump_Device (HB_Device *Device, FILE *stream, int indent, HB_Type hb_type) +{ + int i; + int bits; + int n_per; + unsigned int mask; + + HB_UNUSED(hb_type); + + DUMP_FUINT (Device, StartSize); + DUMP_FUINT (Device, EndSize); + DUMP_FUINT (Device, DeltaFormat); + switch (Device->DeltaFormat) + { + case 1: + bits = 2; + break; + case 2: + bits = 4; + break; + case 3: + bits = 8; + break; + default: + bits = 0; + break; + } + + DUMP (""); + if (!bits) + { + + fprintf(stderr, "invalid DeltaFormat!!!!!\n"); + } + else + { + n_per = 16 / bits; + mask = (1 << bits) - 1; + mask = mask << (16 - bits); + + for (i = Device->StartSize; i <= Device->EndSize ; i++) + { + HB_UShort val = Device->DeltaValue[i / n_per]; + HB_Short signed_val = ((val << ((i % n_per) * bits)) & mask); + dump (stream, indent, "%d", signed_val >> (16 - bits)); + if (i != Device->EndSize) + DUMP (", "); + } + } + DUMP ("\n"); +} + +static void +Dump_ValueRecord (HB_ValueRecord *ValueRecord, FILE *stream, int indent, HB_Type hb_type, HB_UShort value_format) +{ + if (value_format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT) + DUMP_FINT (ValueRecord, XPlacement); + if (value_format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT) + DUMP_FINT (ValueRecord, YPlacement); + if (value_format & HB_GPOS_FORMAT_HAVE_X_ADVANCE) + DUMP_FINT (ValueRecord, XAdvance); + if (value_format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE) + DUMP_FINT (ValueRecord, XAdvance); + if (value_format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE) + RECURSE (Device, Device, &*ValueRecord->DeviceTables[VR_X_PLACEMENT_DEVICE]); + if (value_format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE) + RECURSE (Device, Device, &*ValueRecord->DeviceTables[VR_Y_PLACEMENT_DEVICE]); + if (value_format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE) + RECURSE (Device, Device, &*ValueRecord->DeviceTables[VR_X_ADVANCE_DEVICE]); + if (value_format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE) + RECURSE (Device, Device, &*ValueRecord->DeviceTables[VR_Y_ADVANCE_DEVICE]); +#ifdef HB_SUPPORT_MULTIPLE_MASTER + if (value_format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT) + DUMP_FUINT (ValueRecord, XIdPlacement); + if (value_format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT) + DUMP_FUINT (ValueRecord, YIdPlacement); + if (value_format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE) + DUMP_FUINT (ValueRecord, XIdAdvance); + if (value_format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE) + DUMP_FUINT (ValueRecord, XIdAdvance); +#endif +} + +static void +Dump_GPOS_Lookup_Single (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) +{ + HB_SinglePos *SinglePos = &subtable->st.gpos.single; + + DUMP_FUINT (SinglePos, PosFormat); + RECURSE (Coverage, Coverage, &SinglePos->Coverage); + + DUMP_FUINT (SinglePos, ValueFormat); + + if (SinglePos->PosFormat == 1) + { + DUMP_VALUE_RECORD (&SinglePos->spf.spf1.Value, SinglePos->ValueFormat); + } + else + { + int i; + + DUMP_FUINT (&SinglePos->spf.spf2, ValueCount); + for (i = 0; i < SinglePos->spf.spf2.ValueCount; i++) + DUMP_VALUE_RECORD (&SinglePos->spf.spf2.Value[i], SinglePos->ValueFormat); + } +} + +static void +Dump_PairValueRecord (HB_PairValueRecord *PairValueRecord, FILE *stream, int indent, HB_Type hb_type, HB_UShort ValueFormat1, HB_UShort ValueFormat2) +{ + DUMP_FUINT (PairValueRecord, SecondGlyph); + DUMP_VALUE_RECORD (&PairValueRecord->Value1, ValueFormat1); + DUMP_VALUE_RECORD (&PairValueRecord->Value2, ValueFormat2); +} + +static void +Dump_PairSet (HB_PairSet *PairSet, FILE *stream, int indent, HB_Type hb_type, HB_UShort ValueFormat1, HB_UShort ValueFormat2) +{ + int i; + DUMP_FUINT (PairSet, PairValueCount); + + for (i = 0; i < PairSet->PairValueCount; i++) + { + DUMP ("\n"); + Dump_PairValueRecord (&PairSet->PairValueRecord[i], stream, indent + 1, hb_type, ValueFormat1, ValueFormat2); + DUMP ("\n"); + } +} + +static void +Dump_GPOS_Lookup_Pair (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) +{ + HB_PairPos *PairPos = &subtable->st.gpos.pair; + + DUMP_FUINT (PairPos, PosFormat); + RECURSE (Coverage, Coverage, &PairPos->Coverage); + + DUMP_FUINT (PairPos, ValueFormat1); + DUMP_FUINT (PairPos, ValueFormat2); + + if (PairPos->PosFormat == 1) + { + int i; + + DUMP_FUINT (&PairPos->ppf.ppf1, PairSetCount); + for (i = 0; i < PairPos->ppf.ppf1.PairSetCount; i++) + { + DUMP ("\n"); + Dump_PairSet (&PairPos->ppf.ppf1.PairSet[i], stream, indent + 1, hb_type, PairPos->ValueFormat1, PairPos->ValueFormat2); + DUMP ("\n"); + } + } + else + { + } +} + +static void +Dump_GPOS_Lookup_Markbase (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) +{ + int i; + HB_MarkBasePos *markbase = &subtable->st.gpos.markbase; + + DUMP_FUINT (markbase, PosFormat); + RECURSE (Coverage, Coverage, &markbase->MarkCoverage); + RECURSE (Coverage, Coverage, &markbase->BaseCoverage); + DUMP_FUINT (markbase, ClassCount); + RECURSE (MarkArray, MarkArray, &markbase->MarkArray); + + DUMP ("\n"); + indent++; + + DUMP_FUINT (&markbase->BaseArray, BaseCount); + for (i = 0; i < markbase->BaseArray.BaseCount; i++) + { + int j; + HB_BaseRecord *r = &markbase->BaseArray.BaseRecord[i]; + DUMP1 (" \n", i); + for (j = 0; j < markbase->ClassCount; j++) + DUMP1 (" %d\n", r->BaseAnchor->PosFormat); + DUMP ("\n"); + } + + indent--; + DUMP ("\n"); +} + +DEF_DUMP (Lookup) +{ + int i; + const char *lookup_name; + void (*lookup_func) (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) = NULL; + + if (hb_type == HB_Type_GSUB) + { + switch (Lookup->LookupType) + { + case HB_GSUB_LOOKUP_SINGLE: + lookup_name = "SINGLE"; + lookup_func = Dump_GSUB_Lookup_Single; + break; + case HB_GSUB_LOOKUP_MULTIPLE: + lookup_name = "MULTIPLE"; + break; + case HB_GSUB_LOOKUP_ALTERNATE: + lookup_name = "ALTERNATE"; + break; + case HB_GSUB_LOOKUP_LIGATURE: + lookup_name = "LIGATURE"; + lookup_func = Dump_GSUB_Lookup_Ligature; + break; + case HB_GSUB_LOOKUP_CONTEXT: + lookup_name = "CONTEXT"; + lookup_func = Dump_GSUB_Lookup_Context; + break; + case HB_GSUB_LOOKUP_CHAIN: + lookup_name = "CHAIN"; + lookup_func = Dump_GSUB_Lookup_Chain; + break; + default: + lookup_name = "(unknown)"; + lookup_func = NULL; + break; + } + } + else + { + switch (Lookup->LookupType) + { + case HB_GPOS_LOOKUP_SINGLE: + lookup_name = "SINGLE"; + lookup_func = Dump_GPOS_Lookup_Single; + break; + case HB_GPOS_LOOKUP_PAIR: + lookup_name = "PAIR"; + lookup_func = Dump_GPOS_Lookup_Pair; + break; + case HB_GPOS_LOOKUP_CURSIVE: + lookup_name = "CURSIVE"; + break; + case HB_GPOS_LOOKUP_MARKBASE: + lookup_name = "MARKBASE"; + lookup_func = Dump_GPOS_Lookup_Markbase; + break; + case HB_GPOS_LOOKUP_MARKLIG: + lookup_name = "MARKLIG"; + break; + case HB_GPOS_LOOKUP_MARKMARK: + lookup_name = "MARKMARK"; + break; + case HB_GPOS_LOOKUP_CONTEXT: + lookup_name = "CONTEXT"; + break; + case HB_GPOS_LOOKUP_CHAIN: + lookup_name = "CHAIN"; + break; + default: + lookup_name = "(unknown)"; + lookup_func = NULL; + break; + } + } + + DUMP2("%s \n", lookup_name, Lookup->LookupType); + DUMP1("%#06x\n", Lookup->LookupFlag); + + for (i=0; i < Lookup->SubTableCount; i++) + { + DUMP ("\n"); + if (lookup_func) + (*lookup_func) (&Lookup->SubTable[i], stream, indent + 1, hb_type); + DUMP ("\n"); + } +} + +DEF_DUMP (LookupList) +{ + int i; + + DUMP_FUINT (LookupList, LookupCount); + + for (i=0; i < LookupList->LookupCount; i++) + RECURSE_NUM (Lookup, i, Lookup, &LookupList->Lookup[i]); +} + +void +HB_Dump_GSUB_Table (HB_GSUB gsub, FILE *stream) +{ + int indent = 1; + HB_Type hb_type = HB_Type_GSUB; + + do_indent (stream, indent); + fprintf(stream, "\n"); + RECURSE (ScriptList, ScriptList, &gsub->ScriptList); + RECURSE (FeatureList, FeatureList, &gsub->FeatureList); + RECURSE (LookupList, LookupList, &gsub->LookupList); +} + +void +HB_Dump_GPOS_Table (HB_GPOS gpos, FILE *stream) +{ + int indent = 1; + HB_Type hb_type = HB_Type_GPOS; + + do_indent (stream, indent); + fprintf(stream, "\n"); + RECURSE (ScriptList, ScriptList, &gpos->ScriptList); + RECURSE (FeatureList, FeatureList, &gpos->FeatureList); + RECURSE (LookupList, LookupList, &gpos->LookupList); +} diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-dump.h b/src/3rdparty/harfbuzz/src/harfbuzz-dump.h new file mode 100644 index 0000000000..ea4a62b2e1 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-dump.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2000, 2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Owen Taylor, Behdad Esfahbod + */ + +#ifndef HARFBUZZ_DUMP_H +#define HARFBUZZ_DUMP_H + +#include +#include "harfbuzz-gsub.h" +#include "harfbuzz-gpos.h" + +HB_BEGIN_HEADER + +void HB_Dump_GSUB_Table (HB_GSUB gsub, FILE *stream); +void HB_Dump_GPOS_Table (HB_GPOS gpos, FILE *stream); + +HB_END_HEADER + +#endif /* HARFBUZZ_DUMP_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-external.h b/src/3rdparty/harfbuzz/src/harfbuzz-external.h new file mode 100644 index 0000000000..7644f0dd43 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-external.h @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_EXTERNAL_H +#define HARFBUZZ_EXTERNAL_H + +#include "harfbuzz-global.h" + +HB_BEGIN_HEADER + +/* This header contains some methods that are not part of + Harfbuzz itself, but referenced by it. + They need to be provided by the application/library +*/ + + +/* + see http://www.unicode.org/reports/tr14/tr14-19.html + we don't use the XX, AI and CB properties and map them to AL instead. + as we don't support any EBDIC based OS'es, NL is ignored and mapped to AL as well. +*/ +typedef enum { + HB_LineBreak_OP, HB_LineBreak_CL, HB_LineBreak_QU, HB_LineBreak_GL, HB_LineBreak_NS, + HB_LineBreak_EX, HB_LineBreak_SY, HB_LineBreak_IS, HB_LineBreak_PR, HB_LineBreak_PO, + HB_LineBreak_NU, HB_LineBreak_AL, HB_LineBreak_ID, HB_LineBreak_IN, HB_LineBreak_HY, + HB_LineBreak_BA, HB_LineBreak_BB, HB_LineBreak_B2, HB_LineBreak_ZW, HB_LineBreak_CM, + HB_LineBreak_WJ, HB_LineBreak_H2, HB_LineBreak_H3, HB_LineBreak_JL, HB_LineBreak_JV, + HB_LineBreak_JT, HB_LineBreak_SA, HB_LineBreak_SG, + HB_LineBreak_SP, HB_LineBreak_CR, HB_LineBreak_LF, HB_LineBreak_BK +} HB_LineBreakClass; + +typedef enum +{ + HB_NoCategory, + + HB_Mark_NonSpacing, /* Mn */ + HB_Mark_SpacingCombining, /* Mc */ + HB_Mark_Enclosing, /* Me */ + + HB_Number_DecimalDigit, /* Nd */ + HB_Number_Letter, /* Nl */ + HB_Number_Other, /* No */ + + HB_Separator_Space, /* Zs */ + HB_Separator_Line, /* Zl */ + HB_Separator_Paragraph, /* Zp */ + + HB_Other_Control, /* Cc */ + HB_Other_Format, /* Cf */ + HB_Other_Surrogate, /* Cs */ + HB_Other_PrivateUse, /* Co */ + HB_Other_NotAssigned, /* Cn */ + + HB_Letter_Uppercase, /* Lu */ + HB_Letter_Lowercase, /* Ll */ + HB_Letter_Titlecase, /* Lt */ + HB_Letter_Modifier, /* Lm */ + HB_Letter_Other, /* Lo */ + + HB_Punctuation_Connector, /* Pc */ + HB_Punctuation_Dash, /* Pd */ + HB_Punctuation_Open, /* Ps */ + HB_Punctuation_Close, /* Pe */ + HB_Punctuation_InitialQuote, /* Pi */ + HB_Punctuation_FinalQuote, /* Pf */ + HB_Punctuation_Other, /* Po */ + + HB_Symbol_Math, /* Sm */ + HB_Symbol_Currency, /* Sc */ + HB_Symbol_Modifier, /* Sk */ + HB_Symbol_Other /* So */ +} HB_CharCategory; + +typedef enum +{ + HB_Grapheme_Other, + HB_Grapheme_CR, + HB_Grapheme_LF, + HB_Grapheme_Control, + HB_Grapheme_Extend, + HB_Grapheme_L, + HB_Grapheme_V, + HB_Grapheme_T, + HB_Grapheme_LV, + HB_Grapheme_LVT +} HB_GraphemeClass; + + +typedef enum +{ + HB_Word_Other, + HB_Word_Format, + HB_Word_Katakana, + HB_Word_ALetter, + HB_Word_MidLetter, + HB_Word_MidNum, + HB_Word_Numeric, + HB_Word_ExtendNumLet +} HB_WordClass; + + +typedef enum +{ + HB_Sentence_Other, + HB_Sentence_Sep, + HB_Sentence_Format, + HB_Sentence_Sp, + HB_Sentence_Lower, + HB_Sentence_Upper, + HB_Sentence_OLetter, + HB_Sentence_Numeric, + HB_Sentence_ATerm, + HB_Sentence_STerm, + HB_Sentence_Close +} HB_SentenceClass; + +HB_GraphemeClass HB_GetGraphemeClass(HB_UChar32 ch); +HB_WordClass HB_GetWordClass(HB_UChar32 ch); +HB_SentenceClass HB_GetSentenceClass(HB_UChar32 ch); +HB_LineBreakClass HB_GetLineBreakClass(HB_UChar32 ch); + +void HB_GetGraphemeAndLineBreakClass(HB_UChar32 ch, HB_GraphemeClass *grapheme, HB_LineBreakClass *lineBreak); +void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass); +HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch); +int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch); +HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch); + +void *HB_Library_Resolve(const char *library, int version, const char *symbol); + +HB_END_HEADER + +#endif diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h new file mode 100644 index 0000000000..94e9b43e61 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gdef-private.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_GDEF_PRIVATE_H +#define HARFBUZZ_GDEF_PRIVATE_H + +#include "harfbuzz-impl.h" +#include "harfbuzz-stream-private.h" +#include "harfbuzz-buffer-private.h" +#include "harfbuzz-gdef.h" + +HB_BEGIN_HEADER + +/* Attachment related structures */ + +struct HB_AttachPoint_ +{ + HB_UShort* PointIndex; /* array of contour points */ + HB_UShort PointCount; /* size of the PointIndex array */ +}; + +/* Ligature Caret related structures */ + +struct HB_CaretValueFormat1_ +{ + HB_Short Coordinate; /* x or y value (in design units) */ +}; + +typedef struct HB_CaretValueFormat1_ HB_CaretValueFormat1; + + +struct HB_CaretValueFormat2_ +{ + HB_UShort CaretValuePoint; /* contour point index on glyph */ +}; + +typedef struct HB_CaretValueFormat2_ HB_CaretValueFormat2; + + +struct HB_CaretValueFormat3_ +{ + HB_Device* Device; /* Device table for x or y value */ + HB_Short Coordinate; /* x or y value (in design units) */ +}; + +typedef struct HB_CaretValueFormat3_ HB_CaretValueFormat3; + + +#ifdef HB_SUPPORT_MULTIPLE_MASTER +struct HB_CaretValueFormat4_ +{ + HB_UShort IdCaretValue; /* metric ID */ +}; + +typedef struct HB_CaretValueFormat4_ HB_CaretValueFormat4; +#endif + + +struct HB_CaretValue_ +{ + union + { + HB_CaretValueFormat1 cvf1; + HB_CaretValueFormat2 cvf2; + HB_CaretValueFormat3 cvf3; +#ifdef HB_SUPPORT_MULTIPLE_MASTER + HB_CaretValueFormat4 cvf4; +#endif + } cvf; + + HB_Byte CaretValueFormat; /* 1, 2, 3, or 4 */ +}; + +typedef struct HB_CaretValue_ HB_CaretValue; + + +struct HB_LigGlyph_ +{ + HB_CaretValue* CaretValue; /* array of caret values */ + HB_UShort CaretCount; /* number of caret values */ + HB_Bool loaded; +}; + + +HB_INTERNAL HB_Error +_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef, + HB_UShort glyphID, + HB_UShort property ); + +HB_INTERNAL HB_Error +_HB_GDEF_Check_Property( HB_GDEFHeader* gdef, + HB_GlyphItem item, + HB_UShort flags, + HB_UShort* property ); + +HB_INTERNAL HB_Error +_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef, + HB_Stream input, + HB_Lookup* lo, + HB_UShort num_lookups ); + +HB_END_HEADER + +#endif /* HARFBUZZ_GDEF_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c new file mode 100644 index 0000000000..966b167b90 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.c @@ -0,0 +1,1163 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-impl.h" +#include "harfbuzz-gdef-private.h" +#include "harfbuzz-open-private.h" + +static HB_Error Load_AttachList( HB_AttachList* al, + HB_Stream stream ); +static HB_Error Load_LigCaretList( HB_LigCaretList* lcl, + HB_Stream stream ); + +static void Free_AttachList( HB_AttachList* al); +static void Free_LigCaretList( HB_LigCaretList* lcl); + +static void Free_NewGlyphClasses( HB_GDEFHeader* gdef); + + + +/* GDEF glyph classes */ + +#define UNCLASSIFIED_GLYPH 0 +#define SIMPLE_GLYPH 1 +#define LIGATURE_GLYPH 2 +#define MARK_GLYPH 3 +#define COMPONENT_GLYPH 4 + + + + + + +HB_Error HB_New_GDEF_Table( HB_GDEFHeader** retptr ) +{ + HB_Error error; + + HB_GDEFHeader* gdef; + + if ( !retptr ) + return ERR(HB_Err_Invalid_Argument); + + if ( ALLOC( gdef, sizeof( *gdef ) ) ) + return error; + + gdef->GlyphClassDef.loaded = FALSE; + gdef->AttachList.loaded = FALSE; + gdef->LigCaretList.loaded = FALSE; + gdef->MarkAttachClassDef_offset = 0; + gdef->MarkAttachClassDef.loaded = FALSE; + + gdef->LastGlyph = 0; + gdef->NewGlyphClasses = NULL; + + *retptr = gdef; + + return HB_Err_Ok; +} + + +HB_Error HB_Load_GDEF_Table( HB_Stream stream, + HB_GDEFHeader** retptr ) +{ + HB_Error error; + HB_UInt cur_offset, new_offset, base_offset; + + HB_GDEFHeader* gdef; + + + if ( !retptr ) + return ERR(HB_Err_Invalid_Argument); + + if ( GOTO_Table( TTAG_GDEF ) ) + return error; + + if (( error = HB_New_GDEF_Table ( &gdef ) )) + return error; + + base_offset = FILE_Pos(); + + /* skip version */ + + if ( FILE_Seek( base_offset + 4L ) || + ACCESS_Frame( 2L ) ) + goto Fail0; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + /* all GDEF subtables are optional */ + + if ( new_offset ) + { + new_offset += base_offset; + + /* only classes 1-4 are allowed here */ + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_ClassDefinition( &gdef->GlyphClassDef, 5, + stream ) ) != HB_Err_Ok ) + goto Fail0; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_AttachList( &gdef->AttachList, + stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_LigCaretList( &gdef->LigCaretList, + stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + } + + /* OpenType 1.2 has introduced the `MarkAttachClassDef' field. We + first have to scan the LookupFlag values to find out whether we + must load it or not. Here we only store the offset of the table. */ + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + gdef->MarkAttachClassDef_offset = new_offset + base_offset; + else + gdef->MarkAttachClassDef_offset = 0; + + *retptr = gdef; + + return HB_Err_Ok; + +Fail3: + Free_LigCaretList( &gdef->LigCaretList ); + +Fail2: + Free_AttachList( &gdef->AttachList ); + +Fail1: + _HB_OPEN_Free_ClassDefinition( &gdef->GlyphClassDef ); + +Fail0: + FREE( gdef ); + + return error; +} + + +HB_Error HB_Done_GDEF_Table ( HB_GDEFHeader* gdef ) +{ + Free_LigCaretList( &gdef->LigCaretList ); + Free_AttachList( &gdef->AttachList ); + _HB_OPEN_Free_ClassDefinition( &gdef->GlyphClassDef ); + _HB_OPEN_Free_ClassDefinition( &gdef->MarkAttachClassDef ); + + Free_NewGlyphClasses( gdef ); + + FREE( gdef ); + + return HB_Err_Ok; +} + + + + +/******************************* + * AttachList related functions + *******************************/ + + +/* AttachPoint */ + +static HB_Error Load_AttachPoint( HB_AttachPoint* ap, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UShort* pi; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = ap->PointCount = GET_UShort(); + + FORGET_Frame(); + + ap->PointIndex = NULL; + + if ( count ) + { + if ( ALLOC_ARRAY( ap->PointIndex, count, HB_UShort ) ) + return error; + + pi = ap->PointIndex; + + if ( ACCESS_Frame( count * 2L ) ) + { + FREE( pi ); + return error; + } + + for ( n = 0; n < count; n++ ) + pi[n] = GET_UShort(); + + FORGET_Frame(); + } + + return HB_Err_Ok; +} + + +static void Free_AttachPoint( HB_AttachPoint* ap ) +{ + FREE( ap->PointIndex ); +} + + +/* AttachList */ + +static HB_Error Load_AttachList( HB_AttachList* al, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_AttachPoint* ap; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &al->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = al->GlyphCount = GET_UShort(); + + FORGET_Frame(); + + al->AttachPoint = NULL; + + if ( ALLOC_ARRAY( al->AttachPoint, count, HB_AttachPoint ) ) + goto Fail2; + + ap = al->AttachPoint; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_AttachPoint( &ap[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + al->loaded = TRUE; + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_AttachPoint( &ap[m] ); + + FREE( ap ); + +Fail2: + _HB_OPEN_Free_Coverage( &al->Coverage ); + return error; +} + + +static void Free_AttachList( HB_AttachList* al) +{ + HB_UShort n, count; + + HB_AttachPoint* ap; + + + if ( !al->loaded ) + return; + + if ( al->AttachPoint ) + { + count = al->GlyphCount; + ap = al->AttachPoint; + + for ( n = 0; n < count; n++ ) + Free_AttachPoint( &ap[n] ); + + FREE( ap ); + } + + _HB_OPEN_Free_Coverage( &al->Coverage ); +} + + + +/********************************* + * LigCaretList related functions + *********************************/ + + +/* CaretValueFormat1 */ +/* CaretValueFormat2 */ +/* CaretValueFormat3 */ +/* CaretValueFormat4 */ + +static HB_Error Load_CaretValue( HB_CaretValue* cv, + HB_Stream stream ) +{ + HB_Error error; + + HB_UInt cur_offset, new_offset, base_offset; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + cv->CaretValueFormat = GET_UShort(); + + FORGET_Frame(); + + switch ( cv->CaretValueFormat ) + { + case 1: + if ( ACCESS_Frame( 2L ) ) + return error; + + cv->cvf.cvf1.Coordinate = GET_Short(); + + FORGET_Frame(); + + break; + + case 2: + if ( ACCESS_Frame( 2L ) ) + return error; + + cv->cvf.cvf2.CaretValuePoint = GET_UShort(); + + FORGET_Frame(); + + break; + + case 3: + if ( ACCESS_Frame( 4L ) ) + return error; + + cv->cvf.cvf3.Coordinate = GET_Short(); + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Device( &cv->cvf.cvf3.Device, + stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + break; + + case 4: + if ( ACCESS_Frame( 2L ) ) + return error; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + cv->cvf.cvf4.IdCaretValue = GET_UShort(); +#else + (void) GET_UShort(); +#endif + + FORGET_Frame(); + break; + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; +} + + +static void Free_CaretValue( HB_CaretValue* cv) +{ + if ( cv->CaretValueFormat == 3 ) + _HB_OPEN_Free_Device( cv->cvf.cvf3.Device ); +} + + +/* LigGlyph */ + +static HB_Error Load_LigGlyph( HB_LigGlyph* lg, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_CaretValue* cv; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = lg->CaretCount = GET_UShort(); + + FORGET_Frame(); + + lg->CaretValue = NULL; + + if ( ALLOC_ARRAY( lg->CaretValue, count, HB_CaretValue ) ) + return error; + + cv = lg->CaretValue; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_CaretValue( &cv[n], stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_CaretValue( &cv[m] ); + + FREE( cv ); + return error; +} + + +static void Free_LigGlyph( HB_LigGlyph* lg) +{ + HB_UShort n, count; + + HB_CaretValue* cv; + + + if ( lg->CaretValue ) + { + count = lg->CaretCount; + cv = lg->CaretValue; + + for ( n = 0; n < count; n++ ) + Free_CaretValue( &cv[n] ); + + FREE( cv ); + } +} + + +/* LigCaretList */ + +static HB_Error Load_LigCaretList( HB_LigCaretList* lcl, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort m, n, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_LigGlyph* lg; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &lcl->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = lcl->LigGlyphCount = GET_UShort(); + + FORGET_Frame(); + + lcl->LigGlyph = NULL; + + if ( ALLOC_ARRAY( lcl->LigGlyph, count, HB_LigGlyph ) ) + goto Fail2; + + lg = lcl->LigGlyph; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_LigGlyph( &lg[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + lcl->loaded = TRUE; + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_LigGlyph( &lg[m] ); + + FREE( lg ); + +Fail2: + _HB_OPEN_Free_Coverage( &lcl->Coverage ); + return error; +} + + +static void Free_LigCaretList( HB_LigCaretList* lcl ) +{ + HB_UShort n, count; + + HB_LigGlyph* lg; + + + if ( !lcl->loaded ) + return; + + if ( lcl->LigGlyph ) + { + count = lcl->LigGlyphCount; + lg = lcl->LigGlyph; + + for ( n = 0; n < count; n++ ) + Free_LigGlyph( &lg[n] ); + + FREE( lg ); + } + + _HB_OPEN_Free_Coverage( &lcl->Coverage ); +} + + + +/*********** + * GDEF API + ***********/ + + +static HB_UShort Get_New_Class( HB_GDEFHeader* gdef, + HB_UShort glyphID, + HB_UShort index ) +{ + HB_UShort glyph_index, array_index, count; + HB_UShort byte, bits; + + HB_ClassRangeRecord* gcrr; + HB_UShort** ngc; + + + if ( glyphID >= gdef->LastGlyph ) + return 0; + + count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount; + gcrr = gdef->GlyphClassDef.cd.cd2.ClassRangeRecord; + ngc = gdef->NewGlyphClasses; + + if ( index < count && glyphID < gcrr[index].Start ) + { + array_index = index; + if ( index == 0 ) + glyph_index = glyphID; + else + glyph_index = glyphID - gcrr[index - 1].End - 1; + } + else + { + array_index = index + 1; + glyph_index = glyphID - gcrr[index].End - 1; + } + + byte = ngc[array_index][glyph_index / 4]; + bits = byte >> ( 16 - ( glyph_index % 4 + 1 ) * 4 ); + + return bits & 0x000F; +} + + + +HB_Error HB_GDEF_Get_Glyph_Property( HB_GDEFHeader* gdef, + HB_UShort glyphID, + HB_UShort* property ) +{ + HB_UShort class = 0, index = 0; /* shut compiler up */ + + HB_Error error; + + + if ( !gdef || !property ) + return ERR(HB_Err_Invalid_Argument); + + /* first, we check for mark attach classes */ + + if ( gdef->MarkAttachClassDef.loaded ) + { + error = _HB_OPEN_Get_Class( &gdef->MarkAttachClassDef, glyphID, &class, &index ); + if ( error && error != HB_Err_Not_Covered ) + return error; + if ( !error ) + { + *property = class << 8; + return HB_Err_Ok; + } + } + + error = _HB_OPEN_Get_Class( &gdef->GlyphClassDef, glyphID, &class, &index ); + if ( error && error != HB_Err_Not_Covered ) + return error; + + /* if we have a constructed class table, check whether additional + values have been assigned */ + + if ( error == HB_Err_Not_Covered && gdef->NewGlyphClasses ) + class = Get_New_Class( gdef, glyphID, index ); + + switch ( class ) + { + default: + case UNCLASSIFIED_GLYPH: + *property = 0; + break; + + case SIMPLE_GLYPH: + *property = HB_GDEF_BASE_GLYPH; + break; + + case LIGATURE_GLYPH: + *property = HB_GDEF_LIGATURE; + break; + + case MARK_GLYPH: + *property = HB_GDEF_MARK; + break; + + case COMPONENT_GLYPH: + *property = HB_GDEF_COMPONENT; + break; + } + + return HB_Err_Ok; +} + + +static HB_Error Make_ClassRange( HB_ClassDefinition* cd, + HB_UShort start, + HB_UShort end, + HB_UShort class ) +{ + HB_Error error; + HB_UShort index; + + HB_ClassDefFormat2* cdf2; + HB_ClassRangeRecord* crr; + + + cdf2 = &cd->cd.cd2; + + if ( REALLOC_ARRAY( cdf2->ClassRangeRecord, + cdf2->ClassRangeCount + 1 , + HB_ClassRangeRecord ) ) + return error; + + cdf2->ClassRangeCount++; + + crr = cdf2->ClassRangeRecord; + index = cdf2->ClassRangeCount - 1; + + crr[index].Start = start; + crr[index].End = end; + crr[index].Class = class; + + return HB_Err_Ok; +} + + + +HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef, + HB_UShort num_glyphs, + HB_UShort glyph_count, + HB_UShort* glyph_array, + HB_UShort* class_array ) +{ + HB_UShort start, curr_glyph, curr_class; + HB_UShort n, m, count; + HB_Error error; + + HB_ClassDefinition* gcd; + HB_ClassRangeRecord* gcrr; + HB_UShort** ngc; + + + if ( !gdef || !glyph_array || !class_array ) + return ERR(HB_Err_Invalid_Argument); + + gcd = &gdef->GlyphClassDef; + + /* We build a format 2 table */ + + gcd->ClassFormat = 2; + + gcd->cd.cd2.ClassRangeCount = 0; + gcd->cd.cd2.ClassRangeRecord = NULL; + + start = glyph_array[0]; + curr_class = class_array[0]; + curr_glyph = start; + + if ( curr_class >= 5 ) + { + error = ERR(HB_Err_Invalid_Argument); + goto Fail4; + } + + glyph_count--; + + for ( n = 0; n < glyph_count + 1; n++ ) + { + if ( curr_glyph == glyph_array[n] && curr_class == class_array[n] ) + { + if ( n == glyph_count ) + { + if ( ( error = Make_ClassRange( gcd, start, + curr_glyph, + curr_class) ) != HB_Err_Ok ) + goto Fail3; + } + else + { + if ( curr_glyph == 0xFFFF ) + { + error = ERR(HB_Err_Invalid_Argument); + goto Fail3; + } + else + curr_glyph++; + } + } + else + { + if ( ( error = Make_ClassRange( gcd, start, + curr_glyph - 1, + curr_class) ) != HB_Err_Ok ) + goto Fail3; + + if ( curr_glyph > glyph_array[n] ) + { + error = ERR(HB_Err_Invalid_Argument); + goto Fail3; + } + + start = glyph_array[n]; + curr_class = class_array[n]; + curr_glyph = start; + + if ( curr_class >= 5 ) + { + error = ERR(HB_Err_Invalid_Argument); + goto Fail3; + } + + if ( n == glyph_count ) + { + if ( ( error = Make_ClassRange( gcd, start, + curr_glyph, + curr_class) ) != HB_Err_Ok ) + goto Fail3; + } + else + { + if ( curr_glyph == 0xFFFF ) + { + error = ERR(HB_Err_Invalid_Argument); + goto Fail3; + } + else + curr_glyph++; + } + } + } + + /* now prepare the arrays for class values assigned during the lookup + process */ + + if ( ALLOC_ARRAY( gdef->NewGlyphClasses, + gcd->cd.cd2.ClassRangeCount + 1, HB_UShort* ) ) + goto Fail3; + + count = gcd->cd.cd2.ClassRangeCount; + gcrr = gcd->cd.cd2.ClassRangeRecord; + ngc = gdef->NewGlyphClasses; + + /* We allocate arrays for all glyphs not covered by the class range + records. Each element holds four class values. */ + + if ( count > 0 ) + { + if ( gcrr[0].Start ) + { + if ( ALLOC_ARRAY( ngc[0], ( gcrr[0].Start + 3 ) / 4, HB_UShort ) ) + goto Fail2; + } + + for ( n = 1; n < count; n++ ) + { + if ( gcrr[n].Start - gcrr[n - 1].End > 1 ) + if ( ALLOC_ARRAY( ngc[n], + ( gcrr[n].Start - gcrr[n - 1].End + 2 ) / 4, + HB_UShort ) ) + goto Fail1; + } + + if ( gcrr[count - 1].End != num_glyphs - 1 ) + { + if ( ALLOC_ARRAY( ngc[count], + ( num_glyphs - gcrr[count - 1].End + 2 ) / 4, + HB_UShort ) ) + goto Fail1; + } + } + else if ( num_glyphs > 0 ) + { + if ( ALLOC_ARRAY( ngc[count], + ( num_glyphs + 3 ) / 4, + HB_UShort ) ) + goto Fail2; + } + + gdef->LastGlyph = num_glyphs - 1; + + gdef->MarkAttachClassDef_offset = 0L; + gdef->MarkAttachClassDef.loaded = FALSE; + + gcd->loaded = TRUE; + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + FREE( ngc[m] ); + +Fail2: + FREE( gdef->NewGlyphClasses ); + +Fail3: + FREE( gcd->cd.cd2.ClassRangeRecord ); + +Fail4: + return error; +} + + +static void Free_NewGlyphClasses( HB_GDEFHeader* gdef ) +{ + HB_UShort** ngc; + HB_UShort n, count; + + + if ( gdef->NewGlyphClasses ) + { + count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount + 1; + ngc = gdef->NewGlyphClasses; + + for ( n = 0; n < count; n++ ) + FREE( ngc[n] ); + + FREE( ngc ); + } +} + + +HB_INTERNAL HB_Error +_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef, + HB_UShort glyphID, + HB_UShort property ) +{ + HB_Error error; + HB_UShort class, new_class, index = 0; /* shut compiler up */ + HB_UShort byte, bits, mask; + HB_UShort array_index, glyph_index, count; + + HB_ClassRangeRecord* gcrr; + HB_UShort** ngc; + + + error = _HB_OPEN_Get_Class( &gdef->GlyphClassDef, glyphID, &class, &index ); + if ( error && error != HB_Err_Not_Covered ) + return error; + + /* we don't accept glyphs covered in `GlyphClassDef' */ + + if ( !error ) + return HB_Err_Not_Covered; + + switch ( property ) + { + case 0: + new_class = UNCLASSIFIED_GLYPH; + break; + + case HB_GDEF_BASE_GLYPH: + new_class = SIMPLE_GLYPH; + break; + + case HB_GDEF_LIGATURE: + new_class = LIGATURE_GLYPH; + break; + + case HB_GDEF_MARK: + new_class = MARK_GLYPH; + break; + + case HB_GDEF_COMPONENT: + new_class = COMPONENT_GLYPH; + break; + + default: + return ERR(HB_Err_Invalid_Argument); + } + + count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount; + gcrr = gdef->GlyphClassDef.cd.cd2.ClassRangeRecord; + ngc = gdef->NewGlyphClasses; + + if ( index < count && glyphID < gcrr[index].Start ) + { + array_index = index; + if ( index == 0 ) + glyph_index = glyphID; + else + glyph_index = glyphID - gcrr[index - 1].End - 1; + } + else + { + array_index = index + 1; + glyph_index = glyphID - gcrr[index].End - 1; + } + + byte = ngc[array_index][glyph_index / 4]; + bits = byte >> ( 16 - ( glyph_index % 4 + 1 ) * 4 ); + class = bits & 0x000F; + + /* we don't overwrite existing entries */ + + if ( !class ) + { + bits = new_class << ( 16 - ( glyph_index % 4 + 1 ) * 4 ); + mask = ~( 0x000F << ( 16 - ( glyph_index % 4 + 1 ) * 4 ) ); + + ngc[array_index][glyph_index / 4] &= mask; + ngc[array_index][glyph_index / 4] |= bits; + } + + return HB_Err_Ok; +} + + +HB_INTERNAL HB_Error +_HB_GDEF_Check_Property( HB_GDEFHeader* gdef, + HB_GlyphItem gitem, + HB_UShort flags, + HB_UShort* property ) +{ + HB_Error error; + + if ( gdef ) + { + HB_UShort basic_glyph_class; + HB_UShort desired_attachment_class; + + if ( gitem->gproperties == HB_GLYPH_PROPERTIES_UNKNOWN ) + { + error = HB_GDEF_Get_Glyph_Property( gdef, gitem->gindex, &gitem->gproperties ); + if ( error ) + return error; + } + + *property = gitem->gproperties; + + /* If the glyph was found in the MarkAttachmentClass table, + * then that class value is the high byte of the result, + * otherwise the low byte contains the basic type of the glyph + * as defined by the GlyphClassDef table. + */ + if ( *property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) + basic_glyph_class = HB_GDEF_MARK; + else + basic_glyph_class = *property; + + /* Return Not_Covered, if, for example, basic_glyph_class + * is HB_GDEF_LIGATURE and LookFlags includes HB_LOOKUP_FLAG_IGNORE_LIGATURES + */ + if ( flags & basic_glyph_class ) + return HB_Err_Not_Covered; + + /* The high byte of LookupFlags has the meaning + * "ignore marks of attachment type different than + * the attachment type specified." + */ + desired_attachment_class = flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS; + if ( desired_attachment_class ) + { + if ( basic_glyph_class == HB_GDEF_MARK && + *property != desired_attachment_class ) + return HB_Err_Not_Covered; + } + } else { + *property = 0; + } + + return HB_Err_Ok; +} + +HB_INTERNAL HB_Error +_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef, + HB_Stream stream, + HB_Lookup* lo, + HB_UShort num_lookups) +{ + HB_Error error = HB_Err_Ok; + HB_UShort i; + + /* We now check the LookupFlags for values larger than 0xFF to find + out whether we need to load the `MarkAttachClassDef' field of the + GDEF table -- this hack is necessary for OpenType 1.2 tables since + the version field of the GDEF table hasn't been incremented. + + For constructed GDEF tables, we only load it if + `MarkAttachClassDef_offset' is not zero (nevertheless, a build of + a constructed mark attach table is not supported currently). */ + + if ( gdef && + gdef->MarkAttachClassDef_offset && !gdef->MarkAttachClassDef.loaded ) + { + for ( i = 0; i < num_lookups; i++ ) + { + + if ( lo[i].LookupFlag & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) + { + if ( FILE_Seek( gdef->MarkAttachClassDef_offset ) || + ( error = _HB_OPEN_Load_ClassDefinition( &gdef->MarkAttachClassDef, + 256, stream ) ) != HB_Err_Ok ) + goto Done; + + break; + } + } + } + +Done: + return error; +} + +/* END */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h new file mode 100644 index 0000000000..ccb6bf9734 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gdef.h @@ -0,0 +1,132 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_GDEF_H +#define HARFBUZZ_GDEF_H + +#include "harfbuzz-open.h" +#include "harfbuzz-stream.h" + +HB_BEGIN_HEADER + +/* GDEF glyph properties. Note that HB_GDEF_COMPONENT has no corresponding + * flag in the LookupFlag field. */ +#define HB_GDEF_BASE_GLYPH 0x0002 +#define HB_GDEF_LIGATURE 0x0004 +#define HB_GDEF_MARK 0x0008 +#define HB_GDEF_COMPONENT 0x0010 + + +typedef struct HB_AttachPoint_ HB_AttachPoint; + + +struct HB_AttachList_ +{ + HB_AttachPoint* AttachPoint; /* array of AttachPoint tables */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort GlyphCount; /* number of glyphs with + attachments */ + HB_Bool loaded; +}; + +typedef struct HB_AttachList_ HB_AttachList; + +typedef struct HB_LigGlyph_ HB_LigGlyph; + +struct HB_LigCaretList_ +{ + HB_LigGlyph* LigGlyph; /* array of LigGlyph tables */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort LigGlyphCount; /* number of ligature glyphs */ + HB_Bool loaded; +}; + +typedef struct HB_LigCaretList_ HB_LigCaretList; + + + +/* The `NewGlyphClasses' field is not defined in the TTO specification. + We use it for fonts with a constructed `GlyphClassDef' structure + (i.e., which don't have a GDEF table) to collect glyph classes + assigned during the lookup process. The number of arrays in this + pointer array is GlyphClassDef->cd.cd2.ClassRangeCount+1; the nth + array then contains the glyph class values of the glyphs not covered + by the ClassRangeRecords structures with index n-1 and n. We store + glyph class values for four glyphs in a single array element. + + `LastGlyph' is identical to the number of glyphs minus one in the + font; we need it only if `NewGlyphClasses' is not NULL (to have an + upper bound for the last array). + + Note that we first store the file offset to the `MarkAttachClassDef' + field (which has been introduced in OpenType 1.2) -- since the + `Version' field value hasn't been increased to indicate that we have + one more field for some obscure reason, we must parse the GSUB table + to find out whether class values refer to this table. Only then we + can finally load the MarkAttachClassDef structure if necessary. */ + +struct HB_GDEFHeader_ +{ + HB_UShort** NewGlyphClasses; + HB_UInt offset; + HB_UInt MarkAttachClassDef_offset; + + HB_16Dot16 Version; + + HB_ClassDefinition GlyphClassDef; + HB_AttachList AttachList; + HB_LigCaretList LigCaretList; + HB_ClassDefinition MarkAttachClassDef; /* new in OT 1.2 */ + + HB_UShort LastGlyph; +}; + +typedef struct HB_GDEFHeader_ HB_GDEFHeader; +typedef struct HB_GDEFHeader_* HB_GDEF; + + +HB_Error HB_New_GDEF_Table( HB_GDEFHeader** retptr ); + + +HB_Error HB_Load_GDEF_Table( HB_Stream stream, + HB_GDEFHeader** gdef ); + + +HB_Error HB_Done_GDEF_Table ( HB_GDEFHeader* gdef ); + + +HB_Error HB_GDEF_Get_Glyph_Property( HB_GDEFHeader* gdef, + HB_UShort glyphID, + HB_UShort* property ); + +HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef, + HB_UShort num_glyphs, + HB_UShort glyph_count, + HB_UShort* glyph_array, + HB_UShort* class_array ); + +HB_END_HEADER + +#endif /* HARFBUZZ_GDEF_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-global.h b/src/3rdparty/harfbuzz/src/harfbuzz-global.h new file mode 100644 index 0000000000..d4e6b466b6 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-global.h @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * Copyright (C) 2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + */ + +#ifndef HARFBUZZ_GLOBAL_H +#define HARFBUZZ_GLOBAL_H + +#include +#include + +#ifdef __cplusplus +#define HB_BEGIN_HEADER extern "C" { +#define HB_END_HEADER } +#else +#define HB_BEGIN_HEADER /* nothing */ +#define HB_END_HEADER /* nothing */ +#endif + +HB_BEGIN_HEADER + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +#define HB_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (HB_UInt)_x1 << 24 ) | \ + ( (HB_UInt)_x2 << 16 ) | \ + ( (HB_UInt)_x3 << 8 ) | \ + (HB_UInt)_x4 ) + +typedef char hb_int8; +typedef unsigned char hb_uint8; +typedef short hb_int16; +typedef unsigned short hb_uint16; +typedef int hb_int32; +typedef unsigned int hb_uint32; + +typedef hb_uint8 HB_Bool; + +typedef hb_uint8 HB_Byte; +typedef hb_uint16 HB_UShort; +typedef hb_uint32 HB_UInt; +typedef hb_int8 HB_Char; +typedef hb_int16 HB_Short; +typedef hb_int32 HB_Int; + +typedef hb_uint16 HB_UChar16; +typedef hb_uint32 HB_UChar32; +typedef hb_uint32 HB_Glyph; +typedef hb_int32 HB_Fixed; /* 26.6 */ + +#define HB_FIXED_CONSTANT(v) ((v) * 64) +#define HB_FIXED_ROUND(v) (((v)+32) & -64) + +typedef hb_int32 HB_16Dot16; /* 16.16 */ + +typedef void * HB_Pointer; +typedef hb_uint32 HB_Tag; + +typedef enum { + /* no error */ + HB_Err_Ok = 0x0000, + HB_Err_Not_Covered = 0xFFFF, + + /* _hb_err() is called whenever returning the following errors, + * and in a couple places for HB_Err_Not_Covered too. */ + + /* programmer error */ + HB_Err_Invalid_Argument = 0x1A66, + + /* font error */ + HB_Err_Invalid_SubTable_Format = 0x157F, + HB_Err_Invalid_SubTable = 0x1570, + HB_Err_Read_Error = 0x6EAD, + + /* system error */ + HB_Err_Out_Of_Memory = 0xDEAD +} HB_Error; + +typedef struct { + HB_Fixed x; + HB_Fixed y; +} HB_FixedPoint; + +typedef struct HB_Font_ *HB_Font; +typedef struct HB_StreamRec_ *HB_Stream; +typedef struct HB_FaceRec_ *HB_Face; + +HB_END_HEADER + +#endif diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h new file mode 100644 index 0000000000..63ba90797d --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos-private.h @@ -0,0 +1,721 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_GPOS_PRIVATE_H +#define HARFBUZZ_GPOS_PRIVATE_H + +#include "harfbuzz-impl.h" +#include "harfbuzz-stream-private.h" +#include "harfbuzz-gpos.h" + +HB_BEGIN_HEADER + +/* shared tables */ + +#define VR_X_PLACEMENT_DEVICE 0 +#define VR_Y_PLACEMENT_DEVICE 1 +#define VR_X_ADVANCE_DEVICE 2 +#define VR_Y_ADVANCE_DEVICE 3 + +struct HB_ValueRecord_ +{ + HB_Short XPlacement; /* horizontal adjustment for + placement */ + HB_Short YPlacement; /* vertical adjustment for + placement */ + HB_Short XAdvance; /* horizontal adjustment for + advance */ + HB_Short YAdvance; /* vertical adjustment for + advance */ + + HB_Device** DeviceTables; /* device tables for placement + and advance */ + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + HB_UShort XIdPlacement; /* horizontal placement metric ID */ + HB_UShort YIdPlacement; /* vertical placement metric ID */ + HB_UShort XIdAdvance; /* horizontal advance metric ID */ + HB_UShort YIdAdvance; /* vertical advance metric ID */ +#endif +}; + +typedef struct HB_ValueRecord_ HB_ValueRecord; + + +/* Mask values to scan the value format of the ValueRecord structure. + We always expand compressed ValueRecords of the font. */ + +#define HB_GPOS_FORMAT_HAVE_DEVICE_TABLES 0x00F0 + +#define HB_GPOS_FORMAT_HAVE_X_PLACEMENT 0x0001 +#define HB_GPOS_FORMAT_HAVE_Y_PLACEMENT 0x0002 +#define HB_GPOS_FORMAT_HAVE_X_ADVANCE 0x0004 +#define HB_GPOS_FORMAT_HAVE_Y_ADVANCE 0x0008 +#define HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE 0x0010 +#define HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE 0x0020 +#define HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE 0x0040 +#define HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE 0x0080 +#define HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT 0x0100 +#define HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT 0x0200 +#define HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE 0x0400 +#define HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE 0x0800 + + +struct HB_AnchorFormat1_ +{ + HB_Short XCoordinate; /* horizontal value */ + HB_Short YCoordinate; /* vertical value */ +}; + +typedef struct HB_AnchorFormat1_ HB_AnchorFormat1; + + +struct HB_AnchorFormat2_ +{ + HB_Short XCoordinate; /* horizontal value */ + HB_Short YCoordinate; /* vertical value */ + HB_UShort AnchorPoint; /* index to glyph contour point */ +}; + +typedef struct HB_AnchorFormat2_ HB_AnchorFormat2; + +#define AF3_X_DEVICE_TABLE 0 +#define AF3_Y_DEVICE_TABLE 1 + +struct HB_AnchorFormat3_ +{ + HB_Short XCoordinate; /* horizontal value */ + HB_Short YCoordinate; /* vertical value */ + HB_Device** DeviceTables; /* device tables for coordinates */ +}; + +typedef struct HB_AnchorFormat3_ HB_AnchorFormat3; + + +#ifdef HB_SUPPORT_MULTIPLE_MASTER +struct HB_AnchorFormat4_ +{ + HB_UShort XIdAnchor; /* horizontal metric ID */ + HB_UShort YIdAnchor; /* vertical metric ID */ +}; + +typedef struct HB_AnchorFormat4_ HB_AnchorFormat4; +#endif + + +struct HB_Anchor_ +{ + HB_Byte PosFormat; /* 1, 2, 3, or 4 -- 0 indicates + that there is no Anchor table */ + + union + { + HB_AnchorFormat1 af1; + HB_AnchorFormat2 af2; + HB_AnchorFormat3 af3; +#ifdef HB_SUPPORT_MULTIPLE_MASTER + HB_AnchorFormat4 af4; +#endif + } af; +}; + +typedef struct HB_Anchor_ HB_Anchor; + + +struct HB_MarkRecord_ +{ + HB_UShort Class; /* mark class */ + HB_Anchor MarkAnchor; /* anchor table */ +}; + +typedef struct HB_MarkRecord_ HB_MarkRecord; + + +struct HB_MarkArray_ +{ + HB_UShort MarkCount; /* number of MarkRecord tables */ + HB_MarkRecord* MarkRecord; /* array of MarkRecord tables */ +}; + +typedef struct HB_MarkArray_ HB_MarkArray; + + +/* LookupType 1 */ + +struct HB_SinglePosFormat1_ +{ + HB_ValueRecord Value; /* ValueRecord for all covered + glyphs */ +}; + +typedef struct HB_SinglePosFormat1_ HB_SinglePosFormat1; + + +struct HB_SinglePosFormat2_ +{ + HB_UShort ValueCount; /* number of ValueRecord tables */ + HB_ValueRecord* Value; /* array of ValueRecord tables */ +}; + +typedef struct HB_SinglePosFormat2_ HB_SinglePosFormat2; + + +struct HB_SinglePos_ +{ + HB_Byte PosFormat; /* 1 or 2 */ + HB_Coverage Coverage; /* Coverage table */ + + HB_UShort ValueFormat; /* format of ValueRecord table */ + + union + { + HB_SinglePosFormat1 spf1; + HB_SinglePosFormat2 spf2; + } spf; +}; + +typedef struct HB_SinglePos_ HB_SinglePos; + + +/* LookupType 2 */ + +struct HB_PairValueRecord_ +{ + HB_UShort SecondGlyph; /* glyph ID for second glyph */ + HB_ValueRecord Value1; /* pos. data for first glyph */ + HB_ValueRecord Value2; /* pos. data for second glyph */ +}; + +typedef struct HB_PairValueRecord_ HB_PairValueRecord; + + +struct HB_PairSet_ +{ + HB_UShort PairValueCount; + /* number of PairValueRecord tables */ + HB_PairValueRecord* PairValueRecord; + /* array of PairValueRecord tables */ +}; + +typedef struct HB_PairSet_ HB_PairSet; + + +struct HB_PairPosFormat1_ +{ + HB_UShort PairSetCount; /* number of PairSet tables */ + HB_PairSet* PairSet; /* array of PairSet tables */ +}; + +typedef struct HB_PairPosFormat1_ HB_PairPosFormat1; + + +struct HB_Class2Record_ +{ + HB_ValueRecord Value1; /* pos. data for first glyph */ + HB_ValueRecord Value2; /* pos. data for second glyph */ +}; + +typedef struct HB_Class2Record_ HB_Class2Record; + + +struct HB_Class1Record_ +{ + HB_Class2Record* Class2Record; /* array of Class2Record tables */ +}; + +typedef struct HB_Class1Record_ HB_Class1Record; + + +struct HB_PairPosFormat2_ +{ + HB_ClassDefinition ClassDef1; /* class def. for first glyph */ + HB_ClassDefinition ClassDef2; /* class def. for second glyph */ + HB_UShort Class1Count; /* number of classes in ClassDef1 + table */ + HB_UShort Class2Count; /* number of classes in ClassDef2 + table */ + HB_Class1Record* Class1Record; /* array of Class1Record tables */ +}; + +typedef struct HB_PairPosFormat2_ HB_PairPosFormat2; + + +struct HB_PairPos_ +{ + HB_Byte PosFormat; /* 1 or 2 */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort ValueFormat1; /* format of ValueRecord table + for first glyph */ + HB_UShort ValueFormat2; /* format of ValueRecord table + for second glyph */ + + union + { + HB_PairPosFormat1 ppf1; + HB_PairPosFormat2 ppf2; + } ppf; +}; + +typedef struct HB_PairPos_ HB_PairPos; + + +/* LookupType 3 */ + +struct HB_EntryExitRecord_ +{ + HB_Anchor EntryAnchor; /* entry Anchor table */ + HB_Anchor ExitAnchor; /* exit Anchor table */ +}; + + +typedef struct HB_EntryExitRecord_ HB_EntryExitRecord; + +struct HB_CursivePos_ +{ + HB_UShort PosFormat; /* always 1 */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort EntryExitCount; + /* number of EntryExitRecord tables */ + HB_EntryExitRecord* EntryExitRecord; + /* array of EntryExitRecord tables */ +}; + +typedef struct HB_CursivePos_ HB_CursivePos; + + +/* LookupType 4 */ + +struct HB_BaseRecord_ +{ + HB_Anchor* BaseAnchor; /* array of base glyph anchor + tables */ +}; + +typedef struct HB_BaseRecord_ HB_BaseRecord; + + +struct HB_BaseArray_ +{ + HB_UShort BaseCount; /* number of BaseRecord tables */ + HB_BaseRecord* BaseRecord; /* array of BaseRecord tables */ +}; + +typedef struct HB_BaseArray_ HB_BaseArray; + + +struct HB_MarkBasePos_ +{ + HB_UShort PosFormat; /* always 1 */ + HB_Coverage MarkCoverage; /* mark glyph coverage table */ + HB_Coverage BaseCoverage; /* base glyph coverage table */ + HB_UShort ClassCount; /* number of mark classes */ + HB_MarkArray MarkArray; /* mark array table */ + HB_BaseArray BaseArray; /* base array table */ +}; + +typedef struct HB_MarkBasePos_ HB_MarkBasePos; + + +/* LookupType 5 */ + +struct HB_ComponentRecord_ +{ + HB_Anchor* LigatureAnchor; /* array of ligature glyph anchor + tables */ +}; + +typedef struct HB_ComponentRecord_ HB_ComponentRecord; + + +struct HB_LigatureAttach_ +{ + HB_UShort ComponentCount; + /* number of ComponentRecord tables */ + HB_ComponentRecord* ComponentRecord; + /* array of ComponentRecord tables */ +}; + +typedef struct HB_LigatureAttach_ HB_LigatureAttach; + + +struct HB_LigatureArray_ +{ + HB_UShort LigatureCount; /* number of LigatureAttach tables */ + HB_LigatureAttach* LigatureAttach; + /* array of LigatureAttach tables */ +}; + +typedef struct HB_LigatureArray_ HB_LigatureArray; + + +struct HB_MarkLigPos_ +{ + HB_UShort PosFormat; /* always 1 */ + HB_Coverage MarkCoverage; /* mark glyph coverage table */ + HB_Coverage LigatureCoverage; + /* ligature glyph coverage table */ + HB_UShort ClassCount; /* number of mark classes */ + HB_MarkArray MarkArray; /* mark array table */ + HB_LigatureArray LigatureArray; /* ligature array table */ +}; + +typedef struct HB_MarkLigPos_ HB_MarkLigPos; + + +/* LookupType 6 */ + +struct HB_Mark2Record_ +{ + HB_Anchor* Mark2Anchor; /* array of mark glyph anchor + tables */ +}; + +typedef struct HB_Mark2Record_ HB_Mark2Record; + + +struct HB_Mark2Array_ +{ + HB_UShort Mark2Count; /* number of Mark2Record tables */ + HB_Mark2Record* Mark2Record; /* array of Mark2Record tables */ +}; + +typedef struct HB_Mark2Array_ HB_Mark2Array; + + +struct HB_MarkMarkPos_ +{ + HB_UShort PosFormat; /* always 1 */ + HB_Coverage Mark1Coverage; /* first mark glyph coverage table */ + HB_Coverage Mark2Coverage; /* second mark glyph coverave table */ + HB_UShort ClassCount; /* number of combining mark classes */ + HB_MarkArray Mark1Array; /* MarkArray table for first mark */ + HB_Mark2Array Mark2Array; /* MarkArray table for second mark */ +}; + +typedef struct HB_MarkMarkPos_ HB_MarkMarkPos; + + +/* needed by both lookup type 7 and 8 */ + +struct HB_PosLookupRecord_ +{ + HB_UShort SequenceIndex; /* index into current + glyph sequence */ + HB_UShort LookupListIndex; /* Lookup to apply to that pos. */ +}; + +typedef struct HB_PosLookupRecord_ HB_PosLookupRecord; + + +/* LookupType 7 */ + +struct HB_PosRule_ +{ + HB_UShort GlyphCount; /* total number of input glyphs */ + HB_UShort PosCount; /* number of PosLookupRecord tables */ + HB_UShort* Input; /* array of input glyph IDs */ + HB_PosLookupRecord* PosLookupRecord; + /* array of PosLookupRecord tables */ +}; + +typedef struct HB_PosRule_ HB_PosRule; + + +struct HB_PosRuleSet_ +{ + HB_UShort PosRuleCount; /* number of PosRule tables */ + HB_PosRule* PosRule; /* array of PosRule tables */ +}; + +typedef struct HB_PosRuleSet_ HB_PosRuleSet; + + +struct HB_ContextPosFormat1_ +{ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort PosRuleSetCount; /* number of PosRuleSet tables */ + HB_PosRuleSet* PosRuleSet; /* array of PosRuleSet tables */ +}; + +typedef struct HB_ContextPosFormat1_ HB_ContextPosFormat1; + + +struct HB_PosClassRule_ +{ + HB_UShort GlyphCount; /* total number of context classes */ + HB_UShort PosCount; /* number of PosLookupRecord tables */ + HB_UShort* Class; /* array of classes */ + HB_PosLookupRecord* PosLookupRecord; + /* array of PosLookupRecord tables */ +}; + +typedef struct HB_PosClassRule_ HB_PosClassRule; + + +struct HB_PosClassSet_ +{ + HB_UShort PosClassRuleCount; + /* number of PosClassRule tables */ + HB_PosClassRule* PosClassRule; /* array of PosClassRule tables */ +}; + +typedef struct HB_PosClassSet_ HB_PosClassSet; + + +/* The `MaxContextLength' field is not defined in the TTO specification + but simplifies the implementation of this format. It holds the + maximal context length used in the context rules. */ + +struct HB_ContextPosFormat2_ +{ + HB_UShort MaxContextLength; + /* maximal context length */ + HB_Coverage Coverage; /* Coverage table */ + HB_ClassDefinition ClassDef; /* ClassDef table */ + HB_UShort PosClassSetCount; + /* number of PosClassSet tables */ + HB_PosClassSet* PosClassSet; /* array of PosClassSet tables */ +}; + +typedef struct HB_ContextPosFormat2_ HB_ContextPosFormat2; + + +struct HB_ContextPosFormat3_ +{ + HB_UShort GlyphCount; /* number of input glyphs */ + HB_UShort PosCount; /* number of PosLookupRecord tables */ + HB_Coverage* Coverage; /* array of Coverage tables */ + HB_PosLookupRecord* PosLookupRecord; + /* array of PosLookupRecord tables */ +}; + +typedef struct HB_ContextPosFormat3_ HB_ContextPosFormat3; + + +struct HB_ContextPos_ +{ + HB_Byte PosFormat; /* 1, 2, or 3 */ + + union + { + HB_ContextPosFormat1 cpf1; + HB_ContextPosFormat2 cpf2; + HB_ContextPosFormat3 cpf3; + } cpf; +}; + +typedef struct HB_ContextPos_ HB_ContextPos; + + +/* LookupType 8 */ + +struct HB_ChainPosRule_ +{ + HB_UShort* Backtrack; /* array of backtrack glyph IDs */ + HB_UShort* Input; /* array of input glyph IDs */ + HB_UShort* Lookahead; /* array of lookahead glyph IDs */ + HB_PosLookupRecord* PosLookupRecord; + /* array of PosLookupRecords */ + HB_UShort BacktrackGlyphCount; + /* total number of backtrack glyphs */ + HB_UShort InputGlyphCount; + /* total number of input glyphs */ + HB_UShort LookaheadGlyphCount; + /* total number of lookahead glyphs */ + HB_UShort PosCount; /* number of PosLookupRecords */ +}; + +typedef struct HB_ChainPosRule_ HB_ChainPosRule; + + +struct HB_ChainPosRuleSet_ +{ + HB_UShort ChainPosRuleCount; + /* number of ChainPosRule tables */ + HB_ChainPosRule* ChainPosRule; /* array of ChainPosRule tables */ +}; + +typedef struct HB_ChainPosRuleSet_ HB_ChainPosRuleSet; + + +struct HB_ChainContextPosFormat1_ +{ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort ChainPosRuleSetCount; + /* number of ChainPosRuleSet tables */ + HB_ChainPosRuleSet* ChainPosRuleSet; + /* array of ChainPosRuleSet tables */ +}; + +typedef struct HB_ChainContextPosFormat1_ HB_ChainContextPosFormat1; + + +struct HB_ChainPosClassRule_ +{ + HB_UShort* Backtrack; /* array of backtrack classes */ + HB_UShort* Input; /* array of context classes */ + HB_UShort* Lookahead; /* array of lookahead classes */ + HB_PosLookupRecord* PosLookupRecord; + /* array of substitution lookups */ + HB_UShort BacktrackGlyphCount; + /* total number of backtrack + classes */ + HB_UShort InputGlyphCount; + /* total number of context classes */ + HB_UShort LookaheadGlyphCount; + /* total number of lookahead + classes */ + HB_UShort PosCount; /* number of PosLookupRecords */ +}; + +typedef struct HB_ChainPosClassRule_ HB_ChainPosClassRule; + + +struct HB_ChainPosClassSet_ +{ + HB_UShort ChainPosClassRuleCount; + /* number of ChainPosClassRule + tables */ + HB_ChainPosClassRule* ChainPosClassRule; + /* array of ChainPosClassRule + tables */ +}; + +typedef struct HB_ChainPosClassSet_ HB_ChainPosClassSet; + + +/* The `MaxXXXLength' fields are not defined in the TTO specification + but simplifies the implementation of this format. It holds the + maximal context length used in the specific context rules. */ + +struct HB_ChainContextPosFormat2_ +{ + HB_Coverage Coverage; /* Coverage table */ + + HB_UShort MaxBacktrackLength; + /* maximal backtrack length */ + HB_ClassDefinition BacktrackClassDef; + /* BacktrackClassDef table */ + HB_UShort MaxInputLength; + /* maximal input length */ + HB_ClassDefinition InputClassDef; + /* InputClassDef table */ + HB_UShort MaxLookaheadLength; + /* maximal lookahead length */ + HB_ClassDefinition LookaheadClassDef; + /* LookaheadClassDef table */ + + HB_UShort ChainPosClassSetCount; + /* number of ChainPosClassSet + tables */ + HB_ChainPosClassSet* ChainPosClassSet; + /* array of ChainPosClassSet + tables */ +}; + +typedef struct HB_ChainContextPosFormat2_ HB_ChainContextPosFormat2; + + +struct HB_ChainContextPosFormat3_ +{ + HB_UShort BacktrackGlyphCount; + /* number of backtrack glyphs */ + HB_Coverage* BacktrackCoverage; + /* array of backtrack Coverage + tables */ + HB_UShort InputGlyphCount; + /* number of input glyphs */ + HB_Coverage* InputCoverage; + /* array of input coverage + tables */ + HB_UShort LookaheadGlyphCount; + /* number of lookahead glyphs */ + HB_Coverage* LookaheadCoverage; + /* array of lookahead coverage + tables */ + HB_UShort PosCount; /* number of PosLookupRecords */ + HB_PosLookupRecord* PosLookupRecord; + /* array of substitution lookups */ +}; + +typedef struct HB_ChainContextPosFormat3_ HB_ChainContextPosFormat3; + + +struct HB_ChainContextPos_ +{ + HB_Byte PosFormat; /* 1, 2, or 3 */ + + union + { + HB_ChainContextPosFormat1 ccpf1; + HB_ChainContextPosFormat2 ccpf2; + HB_ChainContextPosFormat3 ccpf3; + } ccpf; +}; + +typedef struct HB_ChainContextPos_ HB_ChainContextPos; + + +#if 0 +/* LookupType 10 */ +struct HB_ExtensionPos_ +{ + HB_UShort PosFormat; /* always 1 */ + HB_UShort LookuptType; /* lookup-type of referenced subtable */ + HB_GPOS_SubTable *subtable; /* referenced subtable */ +}; + +typedef struct HB_ExtensionPos_ HB_ExtensionPos; +#endif + + +union HB_GPOS_SubTable_ +{ + HB_SinglePos single; + HB_PairPos pair; + HB_CursivePos cursive; + HB_MarkBasePos markbase; + HB_MarkLigPos marklig; + HB_MarkMarkPos markmark; + HB_ContextPos context; + HB_ChainContextPos chain; +}; + +typedef union HB_GPOS_SubTable_ HB_GPOS_SubTable; + + + +HB_INTERNAL HB_Error +_HB_GPOS_Load_SubTable( HB_GPOS_SubTable* st, + HB_Stream stream, + HB_UShort lookup_type ); + +HB_INTERNAL void +_HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st, + HB_UShort lookup_type ); + +HB_END_HEADER + +#endif /* HARFBUZZ_GPOS_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c new file mode 100644 index 0000000000..a21600579e --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.c @@ -0,0 +1,6091 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * Copyright (C) 2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + */ + +#include "harfbuzz-impl.h" +#include "harfbuzz-gpos-private.h" +#include "harfbuzz-open-private.h" +#include "harfbuzz-gdef-private.h" +#include "harfbuzz-shaper.h" + +struct GPOS_Instance_ +{ + HB_GPOSHeader* gpos; + HB_Font font; + HB_Bool dvi; + HB_UShort load_flags; /* how the glyph should be loaded */ + HB_Bool r2l; + + HB_UShort last; /* the last valid glyph -- used + with cursive positioning */ + HB_Fixed anchor_x; /* the coordinates of the anchor point */ + HB_Fixed anchor_y; /* of the last valid glyph */ +}; + +typedef struct GPOS_Instance_ GPOS_Instance; + + +static HB_Error GPOS_Do_Glyph_Lookup( GPOS_Instance* gpi, + HB_UShort lookup_index, + HB_Buffer buffer, + HB_UShort context_length, + int nesting_level ); + + + +#ifdef HB_SUPPORT_MULTIPLE_MASTER +/* the client application must replace this with something more + meaningful if multiple master fonts are to be supported. */ + +static HB_Error default_mmfunc( HB_Font font, + HB_UShort metric_id, + HB_Fixed* metric_value, + void* data ) +{ + HB_UNUSED(font); + HB_UNUSED(metric_id); + HB_UNUSED(metric_value); + HB_UNUSED(data); + return ERR(HB_Err_Not_Covered); /* ERR() call intended */ +} +#endif + + + +HB_Error HB_Load_GPOS_Table( HB_Stream stream, + HB_GPOSHeader** retptr, + HB_GDEFHeader* gdef, + HB_Stream gdefStream ) +{ + HB_UInt cur_offset, new_offset, base_offset; + + HB_GPOSHeader* gpos; + + HB_Error error; + + + if ( !retptr ) + return ERR(HB_Err_Invalid_Argument); + + if ( GOTO_Table( TTAG_GPOS ) ) + return error; + + base_offset = FILE_Pos(); + + if ( ALLOC ( gpos, sizeof( *gpos ) ) ) + return error; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + gpos->mmfunc = default_mmfunc; +#endif + + /* skip version */ + + if ( FILE_Seek( base_offset + 4L ) || + ACCESS_Frame( 2L ) ) + goto Fail4; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_ScriptList( &gpos->ScriptList, + stream ) ) != HB_Err_Ok ) + goto Fail4; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_FeatureList( &gpos->FeatureList, + stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_LookupList( &gpos->LookupList, + stream, HB_Type_GPOS ) ) != HB_Err_Ok ) + goto Fail2; + + gpos->gdef = gdef; /* can be NULL */ + + if ( ( error = _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, gdefStream, + gpos->LookupList.Lookup, + gpos->LookupList.LookupCount ) ) ) + goto Fail1; + + *retptr = gpos; + + return HB_Err_Ok; + +Fail1: + _HB_OPEN_Free_LookupList( &gpos->LookupList, HB_Type_GPOS ); + +Fail2: + _HB_OPEN_Free_FeatureList( &gpos->FeatureList ); + +Fail3: + _HB_OPEN_Free_ScriptList( &gpos->ScriptList ); + +Fail4: + FREE( gpos ); + + return error; +} + + +HB_Error HB_Done_GPOS_Table( HB_GPOSHeader* gpos ) +{ + _HB_OPEN_Free_LookupList( &gpos->LookupList, HB_Type_GPOS ); + _HB_OPEN_Free_FeatureList( &gpos->FeatureList ); + _HB_OPEN_Free_ScriptList( &gpos->ScriptList ); + + FREE( gpos ); + + return HB_Err_Ok; +} + + +/***************************** + * SubTable related functions + *****************************/ + +/* shared tables */ + +/* ValueRecord */ + +/* There is a subtle difference in the specs between a `table' and a + `record' -- offsets for device tables in ValueRecords are taken from + the parent table and not the parent record. */ + +static HB_Error Load_ValueRecord( HB_ValueRecord* vr, + HB_UShort format, + HB_UInt base_offset, + HB_Stream stream ) +{ + HB_Error error; + + HB_UInt cur_offset, new_offset; + + + if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT ) + { + if ( ACCESS_Frame( 2L ) ) + return error; + + vr->XPlacement = GET_Short(); + + FORGET_Frame(); + } + else + vr->XPlacement = 0; + + if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT ) + { + if ( ACCESS_Frame( 2L ) ) + return error; + + vr->YPlacement = GET_Short(); + + FORGET_Frame(); + } + else + vr->YPlacement = 0; + + if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE ) + { + if ( ACCESS_Frame( 2L ) ) + return error; + + vr->XAdvance = GET_Short(); + + FORGET_Frame(); + } + else + vr->XAdvance = 0; + + if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE ) + { + if ( ACCESS_Frame( 2L ) ) + return error; + + vr->YAdvance = GET_Short(); + + FORGET_Frame(); + } + else + vr->YAdvance = 0; + + if ( format & HB_GPOS_FORMAT_HAVE_DEVICE_TABLES ) + { + if ( ALLOC_ARRAY( vr->DeviceTables, 4, HB_Device ) ) + return error; + vr->DeviceTables[VR_X_ADVANCE_DEVICE] = 0; + vr->DeviceTables[VR_Y_ADVANCE_DEVICE] = 0; + vr->DeviceTables[VR_X_PLACEMENT_DEVICE] = 0; + vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] = 0; + } + else + { + vr->DeviceTables = 0; + } + + if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_X_PLACEMENT_DEVICE], + stream ) ) != HB_Err_Ok ) + goto Fail4; + (void)FILE_Seek( cur_offset ); + } + } + + if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_Y_PLACEMENT_DEVICE], + stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + } + } + + if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_X_ADVANCE_DEVICE], + stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + } + } + + if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_Y_ADVANCE_DEVICE], + stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + } + + if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + vr->XIdPlacement = GET_UShort(); +#else + (void) GET_UShort(); +#endif + + FORGET_Frame(); + } +#ifdef HB_SUPPORT_MULTIPLE_MASTER + else + vr->XIdPlacement = 0; +#endif + + if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + vr->YIdPlacement = GET_UShort(); +#else + (void) GET_UShort(); +#endif + + FORGET_Frame(); + } +#ifdef HB_SUPPORT_MULTIPLE_MASTER + else + vr->YIdPlacement = 0; +#endif + + if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + vr->XIdAdvance = GET_UShort(); +#else + (void) GET_UShort(); +#endif + + FORGET_Frame(); + } +#ifdef HB_SUPPORT_MULTIPLE_MASTER + else + vr->XIdAdvance = 0; +#endif + + if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + vr->YIdAdvance = GET_UShort(); +#else + (void) GET_UShort(); +#endif + + FORGET_Frame(); + } +#ifdef HB_SUPPORT_MULTIPLE_MASTER + else + vr->YIdAdvance = 0; +#endif + + return HB_Err_Ok; + +Fail1: + if ( vr->DeviceTables ) + _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE] ); + +Fail2: + if ( vr->DeviceTables ) + _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE] ); + +Fail3: + if ( vr->DeviceTables ) + _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] ); + +Fail4: + FREE( vr->DeviceTables ); + return error; +} + + +static void Free_ValueRecord( HB_ValueRecord* vr, + HB_UShort format ) +{ + if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE ) + _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE] ); + if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE ) + _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE] ); + if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE ) + _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] ); + if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE ) + _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_PLACEMENT_DEVICE] ); + FREE( vr->DeviceTables ); +} + + +static HB_Error Get_ValueRecord( GPOS_Instance* gpi, + HB_ValueRecord* vr, + HB_UShort format, + HB_Position gd ) +{ + HB_Short pixel_value; + HB_Error error = HB_Err_Ok; +#ifdef HB_SUPPORT_MULTIPLE_MASTER + HB_GPOSHeader* gpos = gpi->gpos; + HB_Fixed value; +#endif + + HB_UShort x_ppem, y_ppem; + HB_16Dot16 x_scale, y_scale; + + + if ( !format ) + return HB_Err_Ok; + + x_ppem = gpi->font->x_ppem; + y_ppem = gpi->font->y_ppem; + x_scale = gpi->font->x_scale; + y_scale = gpi->font->y_scale; + + /* design units -> fractional pixel */ + + if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT ) + gd->x_pos += x_scale * vr->XPlacement / 0x10000; + if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT ) + gd->y_pos += y_scale * vr->YPlacement / 0x10000; + if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE ) + gd->x_advance += x_scale * vr->XAdvance / 0x10000; + if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE ) + gd->y_advance += y_scale * vr->YAdvance / 0x10000; + + if ( !gpi->dvi ) + { + /* pixel -> fractional pixel */ + + if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE ) + { + _HB_OPEN_Get_Device( vr->DeviceTables[VR_X_PLACEMENT_DEVICE], x_ppem, &pixel_value ); + gd->x_pos += pixel_value << 6; + } + if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE ) + { + _HB_OPEN_Get_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE], y_ppem, &pixel_value ); + gd->y_pos += pixel_value << 6; + } + if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE ) + { + _HB_OPEN_Get_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE], x_ppem, &pixel_value ); + gd->x_advance += pixel_value << 6; + } + if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE ) + { + _HB_OPEN_Get_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE], y_ppem, &pixel_value ); + gd->y_advance += pixel_value << 6; + } + } + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + /* values returned from mmfunc() are already in fractional pixels */ + + if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT ) + { + error = (gpos->mmfunc)( gpi->font, vr->XIdPlacement, + &value, gpos->data ); + if ( error ) + return error; + gd->x_pos += value; + } + if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT ) + { + error = (gpos->mmfunc)( gpi->font, vr->YIdPlacement, + &value, gpos->data ); + if ( error ) + return error; + gd->y_pos += value; + } + if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE ) + { + error = (gpos->mmfunc)( gpi->font, vr->XIdAdvance, + &value, gpos->data ); + if ( error ) + return error; + gd->x_advance += value; + } + if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE ) + { + error = (gpos->mmfunc)( gpi->font, vr->YIdAdvance, + &value, gpos->data ); + if ( error ) + return error; + gd->y_advance += value; + } +#endif + + return error; +} + + +/* AnchorFormat1 */ +/* AnchorFormat2 */ +/* AnchorFormat3 */ +/* AnchorFormat4 */ + +static HB_Error Load_Anchor( HB_Anchor* an, + HB_Stream stream ) +{ + HB_Error error; + + HB_UInt cur_offset, new_offset, base_offset; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + an->PosFormat = GET_UShort(); + + FORGET_Frame(); + + switch ( an->PosFormat ) + { + case 1: + if ( ACCESS_Frame( 4L ) ) + return error; + + an->af.af1.XCoordinate = GET_Short(); + an->af.af1.YCoordinate = GET_Short(); + + FORGET_Frame(); + break; + + case 2: + if ( ACCESS_Frame( 6L ) ) + return error; + + an->af.af2.XCoordinate = GET_Short(); + an->af.af2.YCoordinate = GET_Short(); + an->af.af2.AnchorPoint = GET_UShort(); + + FORGET_Frame(); + break; + + case 3: + if ( ACCESS_Frame( 6L ) ) + return error; + + an->af.af3.XCoordinate = GET_Short(); + an->af.af3.YCoordinate = GET_Short(); + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + if ( ALLOC_ARRAY( an->af.af3.DeviceTables, 2, HB_Device ) ) + return error; + + an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] = 0; + an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] = 0; + + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Device( &an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE], + stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + if ( !an->af.af3.DeviceTables ) + { + if ( ALLOC_ARRAY( an->af.af3.DeviceTables, 2, HB_Device ) ) + return error; + + an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] = 0; + an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] = 0; + } + + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Device( &an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE], + stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + break; + + case 4: + if ( ACCESS_Frame( 4L ) ) + return error; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + an->af.af4.XIdAnchor = GET_UShort(); + an->af.af4.YIdAnchor = GET_UShort(); +#else + (void) GET_UShort(); + (void) GET_UShort(); +#endif + + FORGET_Frame(); + break; + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; + +Fail: + if ( an->af.af3.DeviceTables ) + _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] ); + +Fail2: + FREE( an->af.af3.DeviceTables ); + return error; +} + + +static void Free_Anchor( HB_Anchor* an) +{ + if ( an->PosFormat == 3 && an->af.af3.DeviceTables ) + { + _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] ); + _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] ); + FREE( an->af.af3.DeviceTables ); + } +} + + +static HB_Error Get_Anchor( GPOS_Instance* gpi, + HB_Anchor* an, + HB_UShort glyph_index, + HB_Fixed* x_value, + HB_Fixed* y_value ) +{ + HB_Error error = HB_Err_Ok; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + HB_GPOSHeader* gpos = gpi->gpos; +#endif + HB_UShort ap; + + HB_Short pixel_value; + + HB_UShort x_ppem, y_ppem; + HB_16Dot16 x_scale, y_scale; + + + x_ppem = gpi->font->x_ppem; + y_ppem = gpi->font->y_ppem; + x_scale = gpi->font->x_scale; + y_scale = gpi->font->y_scale; + + switch ( an->PosFormat ) + { + case 0: + /* The special case of an empty AnchorTable */ + default: + + return HB_Err_Not_Covered; + + case 1: + *x_value = x_scale * an->af.af1.XCoordinate / 0x10000; + *y_value = y_scale * an->af.af1.YCoordinate / 0x10000; + break; + + case 2: + if ( !gpi->dvi ) + { + hb_uint32 n_points = 0; + ap = an->af.af2.AnchorPoint; + if (!gpi->font->klass->getPointInOutline) + goto no_contour_point; + error = gpi->font->klass->getPointInOutline(gpi->font, glyph_index, gpi->load_flags, ap, x_value, y_value, &n_points); + if (error) + return error; + /* if n_points is set to zero, we use the design coordinate value pair. + * This can happen e.g. for sbit glyphs. */ + if (!n_points) + goto no_contour_point; + } + else + { + no_contour_point: + *x_value = x_scale * an->af.af3.XCoordinate / 0x10000; + *y_value = y_scale * an->af.af3.YCoordinate / 0x10000; + } + break; + + case 3: + if ( !gpi->dvi ) + { + _HB_OPEN_Get_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE], x_ppem, &pixel_value ); + *x_value = pixel_value << 6; + _HB_OPEN_Get_Device( an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE], y_ppem, &pixel_value ); + *y_value = pixel_value << 6; + } + else + *x_value = *y_value = 0; + + *x_value += x_scale * an->af.af3.XCoordinate / 0x10000; + *y_value += y_scale * an->af.af3.YCoordinate / 0x10000; + break; + + case 4: +#ifdef HB_SUPPORT_MULTIPLE_MASTER + error = (gpos->mmfunc)( gpi->font, an->af.af4.XIdAnchor, + x_value, gpos->data ); + if ( error ) + return error; + + error = (gpos->mmfunc)( gpi->font, an->af.af4.YIdAnchor, + y_value, gpos->data ); + if ( error ) + return error; + break; +#else + return ERR(HB_Err_Not_Covered); +#endif + } + + return error; +} + + +/* MarkArray */ + +static HB_Error Load_MarkArray ( HB_MarkArray* ma, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_MarkRecord* mr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = ma->MarkCount = GET_UShort(); + + FORGET_Frame(); + + ma->MarkRecord = NULL; + + if ( ALLOC_ARRAY( ma->MarkRecord, count, HB_MarkRecord ) ) + return error; + + mr = ma->MarkRecord; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 4L ) ) + goto Fail; + + mr[n].Class = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Anchor( &mr[n].MarkAnchor, stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_Anchor( &mr[m].MarkAnchor ); + + FREE( mr ); + return error; +} + + +static void Free_MarkArray( HB_MarkArray* ma ) +{ + HB_UShort n, count; + + HB_MarkRecord* mr; + + + if ( ma->MarkRecord ) + { + count = ma->MarkCount; + mr = ma->MarkRecord; + + for ( n = 0; n < count; n++ ) + Free_Anchor( &mr[n].MarkAnchor ); + + FREE( mr ); + } +} + + +/* LookupType 1 */ + +/* SinglePosFormat1 */ +/* SinglePosFormat2 */ + +static HB_Error Load_SinglePos( HB_GPOS_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_SinglePos* sp = &st->single; + + HB_UShort n, m, count, format; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ValueRecord* vr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 6L ) ) + return error; + + sp->PosFormat = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + format = sp->ValueFormat = GET_UShort(); + + FORGET_Frame(); + + if ( !format ) + return ERR(HB_Err_Invalid_SubTable); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &sp->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + switch ( sp->PosFormat ) + { + case 1: + error = Load_ValueRecord( &sp->spf.spf1.Value, format, + base_offset, stream ); + if ( error ) + goto Fail2; + break; + + case 2: + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = sp->spf.spf2.ValueCount = GET_UShort(); + + FORGET_Frame(); + + sp->spf.spf2.Value = NULL; + + if ( ALLOC_ARRAY( sp->spf.spf2.Value, count, HB_ValueRecord ) ) + goto Fail2; + + vr = sp->spf.spf2.Value; + + for ( n = 0; n < count; n++ ) + { + error = Load_ValueRecord( &vr[n], format, base_offset, stream ); + if ( error ) + goto Fail1; + } + break; + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_ValueRecord( &vr[m], format ); + + FREE( vr ); + +Fail2: + _HB_OPEN_Free_Coverage( &sp->Coverage ); + return error; +} + + +static void Free_SinglePos( HB_GPOS_SubTable* st ) +{ + HB_UShort n, count, format; + HB_SinglePos* sp = &st->single; + + HB_ValueRecord* v; + + + format = sp->ValueFormat; + + switch ( sp->PosFormat ) + { + case 1: + Free_ValueRecord( &sp->spf.spf1.Value, format ); + break; + + case 2: + if ( sp->spf.spf2.Value ) + { + count = sp->spf.spf2.ValueCount; + v = sp->spf.spf2.Value; + + for ( n = 0; n < count; n++ ) + Free_ValueRecord( &v[n], format ); + + FREE( v ); + } + break; + default: + break; + } + + _HB_OPEN_Free_Coverage( &sp->Coverage ); +} + +static HB_Error Lookup_SinglePos( GPOS_Instance* gpi, + HB_GPOS_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_Error error; + HB_GPOSHeader* gpos = gpi->gpos; + HB_SinglePos* sp = &st->single; + + HB_UNUSED(nesting_level); + + if ( context_length != 0xFFFF && context_length < 1 ) + return HB_Err_Not_Covered; + + if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &sp->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + switch ( sp->PosFormat ) + { + case 1: + error = Get_ValueRecord( gpi, &sp->spf.spf1.Value, + sp->ValueFormat, POSITION( buffer->in_pos ) ); + if ( error ) + return error; + break; + + case 2: + if ( index >= sp->spf.spf2.ValueCount ) + return ERR(HB_Err_Invalid_SubTable); + error = Get_ValueRecord( gpi, &sp->spf.spf2.Value[index], + sp->ValueFormat, POSITION( buffer->in_pos ) ); + if ( error ) + return error; + break; + + default: + return ERR(HB_Err_Invalid_SubTable); + } + + (buffer->in_pos)++; + + return HB_Err_Ok; +} + + +/* LookupType 2 */ + +/* PairSet */ + +static HB_Error Load_PairSet ( HB_PairSet* ps, + HB_UShort format1, + HB_UShort format2, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt base_offset; + + HB_PairValueRecord* pvr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = ps->PairValueCount = GET_UShort(); + + FORGET_Frame(); + + ps->PairValueRecord = NULL; + + if ( ALLOC_ARRAY( ps->PairValueRecord, count, HB_PairValueRecord ) ) + return error; + + pvr = ps->PairValueRecord; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + pvr[n].SecondGlyph = GET_UShort(); + + FORGET_Frame(); + + if ( format1 ) + { + error = Load_ValueRecord( &pvr[n].Value1, format1, + base_offset, stream ); + if ( error ) + goto Fail; + } + if ( format2 ) + { + error = Load_ValueRecord( &pvr[n].Value2, format2, + base_offset, stream ); + if ( error ) + { + if ( format1 ) + Free_ValueRecord( &pvr[n].Value1, format1 ); + goto Fail; + } + } + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + { + if ( format1 ) + Free_ValueRecord( &pvr[m].Value1, format1 ); + if ( format2 ) + Free_ValueRecord( &pvr[m].Value2, format2 ); + } + + FREE( pvr ); + return error; +} + + +static void Free_PairSet( HB_PairSet* ps, + HB_UShort format1, + HB_UShort format2 ) +{ + HB_UShort n, count; + + HB_PairValueRecord* pvr; + + + if ( ps->PairValueRecord ) + { + count = ps->PairValueCount; + pvr = ps->PairValueRecord; + + for ( n = 0; n < count; n++ ) + { + if ( format1 ) + Free_ValueRecord( &pvr[n].Value1, format1 ); + if ( format2 ) + Free_ValueRecord( &pvr[n].Value2, format2 ); + } + + FREE( pvr ); + } +} + + +/* PairPosFormat1 */ + +static HB_Error Load_PairPos1( HB_PairPosFormat1* ppf1, + HB_UShort format1, + HB_UShort format2, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_PairSet* ps; + + + base_offset = FILE_Pos() - 8L; + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = ppf1->PairSetCount = GET_UShort(); + + FORGET_Frame(); + + ppf1->PairSet = NULL; + + if ( ALLOC_ARRAY( ppf1->PairSet, count, HB_PairSet ) ) + return error; + + ps = ppf1->PairSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_PairSet( &ps[n], format1, + format2, stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_PairSet( &ps[m], format1, format2 ); + + FREE( ps ); + return error; +} + + +static void Free_PairPos1( HB_PairPosFormat1* ppf1, + HB_UShort format1, + HB_UShort format2 ) +{ + HB_UShort n, count; + + HB_PairSet* ps; + + + if ( ppf1->PairSet ) + { + count = ppf1->PairSetCount; + ps = ppf1->PairSet; + + for ( n = 0; n < count; n++ ) + Free_PairSet( &ps[n], format1, format2 ); + + FREE( ps ); + } +} + + +/* PairPosFormat2 */ + +static HB_Error Load_PairPos2( HB_PairPosFormat2* ppf2, + HB_UShort format1, + HB_UShort format2, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort m, n, k, count1, count2; + HB_UInt cur_offset, new_offset1, new_offset2, base_offset; + + HB_Class1Record* c1r; + HB_Class2Record* c2r; + + + base_offset = FILE_Pos() - 8L; + + if ( ACCESS_Frame( 8L ) ) + return error; + + new_offset1 = GET_UShort() + base_offset; + new_offset2 = GET_UShort() + base_offset; + + /* `Class1Count' and `Class2Count' are the upper limits for class + values, thus we read it now to make additional safety checks. */ + + count1 = ppf2->Class1Count = GET_UShort(); + count2 = ppf2->Class2Count = GET_UShort(); + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset1 ) || + ( error = _HB_OPEN_Load_ClassDefinition( &ppf2->ClassDef1, count1, + stream ) ) != HB_Err_Ok ) + return error; + if ( FILE_Seek( new_offset2 ) || + ( error = _HB_OPEN_Load_ClassDefinition( &ppf2->ClassDef2, count2, + stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + + ppf2->Class1Record = NULL; + + if ( ALLOC_ARRAY( ppf2->Class1Record, count1, HB_Class1Record ) ) + goto Fail2; + + c1r = ppf2->Class1Record; + + for ( m = 0; m < count1; m++ ) + { + c1r[m].Class2Record = NULL; + + if ( ALLOC_ARRAY( c1r[m].Class2Record, count2, HB_Class2Record ) ) + goto Fail1; + + c2r = c1r[m].Class2Record; + + for ( n = 0; n < count2; n++ ) + { + if ( format1 ) + { + error = Load_ValueRecord( &c2r[n].Value1, format1, + base_offset, stream ); + if ( error ) + goto Fail0; + } + if ( format2 ) + { + error = Load_ValueRecord( &c2r[n].Value2, format2, + base_offset, stream ); + if ( error ) + { + if ( format1 ) + Free_ValueRecord( &c2r[n].Value1, format1 ); + goto Fail0; + } + } + } + + continue; + + Fail0: + for ( k = 0; k < n; k++ ) + { + if ( format1 ) + Free_ValueRecord( &c2r[k].Value1, format1 ); + if ( format2 ) + Free_ValueRecord( &c2r[k].Value2, format2 ); + } + goto Fail1; + } + + return HB_Err_Ok; + +Fail1: + for ( k = 0; k < m; k++ ) + { + c2r = c1r[k].Class2Record; + + for ( n = 0; n < count2; n++ ) + { + if ( format1 ) + Free_ValueRecord( &c2r[n].Value1, format1 ); + if ( format2 ) + Free_ValueRecord( &c2r[n].Value2, format2 ); + } + + FREE( c2r ); + } + + FREE( c1r ); +Fail2: + + _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef2 ); + +Fail3: + _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef1 ); + return error; +} + + +static void Free_PairPos2( HB_PairPosFormat2* ppf2, + HB_UShort format1, + HB_UShort format2) +{ + HB_UShort m, n, count1, count2; + + HB_Class1Record* c1r; + HB_Class2Record* c2r; + + + if ( ppf2->Class1Record ) + { + c1r = ppf2->Class1Record; + count1 = ppf2->Class1Count; + count2 = ppf2->Class2Count; + + for ( m = 0; m < count1; m++ ) + { + c2r = c1r[m].Class2Record; + + for ( n = 0; n < count2; n++ ) + { + if ( format1 ) + Free_ValueRecord( &c2r[n].Value1, format1 ); + if ( format2 ) + Free_ValueRecord( &c2r[n].Value2, format2 ); + } + + FREE( c2r ); + } + + FREE( c1r ); + + _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef2 ); + _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef1 ); + } +} + + +static HB_Error Load_PairPos( HB_GPOS_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_PairPos* pp = &st->pair; + + HB_UShort format1, format2; + HB_UInt cur_offset, new_offset, base_offset; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 8L ) ) + return error; + + pp->PosFormat = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + format1 = pp->ValueFormat1 = GET_UShort(); + format2 = pp->ValueFormat2 = GET_UShort(); + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &pp->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + switch ( pp->PosFormat ) + { + case 1: + error = Load_PairPos1( &pp->ppf.ppf1, format1, format2, stream ); + if ( error ) + goto Fail; + break; + + case 2: + error = Load_PairPos2( &pp->ppf.ppf2, format1, format2, stream ); + if ( error ) + goto Fail; + break; + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; + +Fail: + _HB_OPEN_Free_Coverage( &pp->Coverage ); + return error; +} + + +static void Free_PairPos( HB_GPOS_SubTable* st ) +{ + HB_UShort format1, format2; + HB_PairPos* pp = &st->pair; + + + format1 = pp->ValueFormat1; + format2 = pp->ValueFormat2; + + switch ( pp->PosFormat ) + { + case 1: + Free_PairPos1( &pp->ppf.ppf1, format1, format2 ); + break; + + case 2: + Free_PairPos2( &pp->ppf.ppf2, format1, format2 ); + break; + + default: + break; + } + + _HB_OPEN_Free_Coverage( &pp->Coverage ); +} + + +static HB_Error Lookup_PairPos1( GPOS_Instance* gpi, + HB_PairPosFormat1* ppf1, + HB_Buffer buffer, + HB_UInt first_pos, + HB_UShort index, + HB_UShort format1, + HB_UShort format2 ) +{ + HB_Error error; + HB_UShort numpvr, glyph2; + + HB_PairValueRecord* pvr; + + + if ( index >= ppf1->PairSetCount ) + return ERR(HB_Err_Invalid_SubTable); + + pvr = ppf1->PairSet[index].PairValueRecord; + if ( !pvr ) + return ERR(HB_Err_Invalid_SubTable); + + glyph2 = IN_CURGLYPH(); + + for ( numpvr = ppf1->PairSet[index].PairValueCount; + numpvr; + numpvr--, pvr++ ) + { + if ( glyph2 == pvr->SecondGlyph ) + { + error = Get_ValueRecord( gpi, &pvr->Value1, format1, + POSITION( first_pos ) ); + if ( error ) + return error; + return Get_ValueRecord( gpi, &pvr->Value2, format2, + POSITION( buffer->in_pos ) ); + } + } + + return HB_Err_Not_Covered; +} + + +static HB_Error Lookup_PairPos2( GPOS_Instance* gpi, + HB_PairPosFormat2* ppf2, + HB_Buffer buffer, + HB_UInt first_pos, + HB_UShort format1, + HB_UShort format2 ) +{ + HB_Error error; + HB_UShort cl1 = 0, cl2 = 0; /* shut compiler up */ + + HB_Class1Record* c1r; + HB_Class2Record* c2r; + + + error = _HB_OPEN_Get_Class( &ppf2->ClassDef1, IN_GLYPH( first_pos ), + &cl1, NULL ); + if ( error && error != HB_Err_Not_Covered ) + return error; + error = _HB_OPEN_Get_Class( &ppf2->ClassDef2, IN_CURGLYPH(), + &cl2, NULL ); + if ( error && error != HB_Err_Not_Covered ) + return error; + + c1r = &ppf2->Class1Record[cl1]; + if ( !c1r ) + return ERR(HB_Err_Invalid_SubTable); + c2r = &c1r->Class2Record[cl2]; + + error = Get_ValueRecord( gpi, &c2r->Value1, format1, POSITION( first_pos ) ); + if ( error ) + return error; + return Get_ValueRecord( gpi, &c2r->Value2, format2, POSITION( buffer->in_pos ) ); +} + + +static HB_Error Lookup_PairPos( GPOS_Instance* gpi, + HB_GPOS_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_Error error; + HB_UShort index, property; + HB_UInt first_pos; + HB_GPOSHeader* gpos = gpi->gpos; + HB_PairPos* pp = &st->pair; + + HB_UNUSED(nesting_level); + + if ( buffer->in_pos >= buffer->in_length - 1 ) + return HB_Err_Not_Covered; /* Not enough glyphs in stream */ + + if ( context_length != 0xFFFF && context_length < 2 ) + return HB_Err_Not_Covered; + + if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &pp->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + /* second glyph */ + + first_pos = buffer->in_pos; + (buffer->in_pos)++; + + while ( CHECK_Property( gpos->gdef, IN_CURITEM(), + flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( buffer->in_pos == buffer->in_length ) + { + buffer->in_pos = first_pos; + return HB_Err_Not_Covered; + } + (buffer->in_pos)++; + + } + + switch ( pp->PosFormat ) + { + case 1: + error = Lookup_PairPos1( gpi, &pp->ppf.ppf1, buffer, + first_pos, index, + pp->ValueFormat1, pp->ValueFormat2 ); + break; + + case 2: + error = Lookup_PairPos2( gpi, &pp->ppf.ppf2, buffer, first_pos, + pp->ValueFormat1, pp->ValueFormat2 ); + break; + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + /* if we don't have coverage for the second glyph don't skip it for + further lookups but reset in_pos back to the first_glyph and let + the caller in Do_String_Lookup increment in_pos */ + if ( error == HB_Err_Not_Covered ) + buffer->in_pos = first_pos; + + /* adjusting the `next' glyph */ + + if ( pp->ValueFormat2 ) + (buffer->in_pos)++; + + return error; +} + + +/* LookupType 3 */ + +/* CursivePosFormat1 */ + +static HB_Error Load_CursivePos( HB_GPOS_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_CursivePos* cp = &st->cursive; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_EntryExitRecord* eer; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 4L ) ) + return error; + + cp->PosFormat = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &cp->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = cp->EntryExitCount = GET_UShort(); + + FORGET_Frame(); + + cp->EntryExitRecord = NULL; + + if ( ALLOC_ARRAY( cp->EntryExitRecord, count, HB_EntryExitRecord ) ) + goto Fail2; + + eer = cp->EntryExitRecord; + + for ( n = 0; n < count; n++ ) + { + HB_UInt entry_offset; + + if ( ACCESS_Frame( 2L ) ) + return error; + + entry_offset = new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Anchor( &eer[n].EntryAnchor, + stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + else + eer[n].EntryAnchor.PosFormat = 0; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Anchor( &eer[n].ExitAnchor, + stream ) ) != HB_Err_Ok ) + { + if ( entry_offset ) + Free_Anchor( &eer[n].EntryAnchor ); + goto Fail1; + } + (void)FILE_Seek( cur_offset ); + } + else + eer[n].ExitAnchor.PosFormat = 0; + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + { + Free_Anchor( &eer[m].EntryAnchor ); + Free_Anchor( &eer[m].ExitAnchor ); + } + + FREE( eer ); + +Fail2: + _HB_OPEN_Free_Coverage( &cp->Coverage ); + return error; +} + + +static void Free_CursivePos( HB_GPOS_SubTable* st ) +{ + HB_UShort n, count; + HB_CursivePos* cp = &st->cursive; + + HB_EntryExitRecord* eer; + + + if ( cp->EntryExitRecord ) + { + count = cp->EntryExitCount; + eer = cp->EntryExitRecord; + + for ( n = 0; n < count; n++ ) + { + Free_Anchor( &eer[n].EntryAnchor ); + Free_Anchor( &eer[n].ExitAnchor ); + } + + FREE( eer ); + } + + _HB_OPEN_Free_Coverage( &cp->Coverage ); +} + + +static HB_Error Lookup_CursivePos( GPOS_Instance* gpi, + HB_GPOS_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_Error error; + HB_GPOSHeader* gpos = gpi->gpos; + HB_CursivePos* cp = &st->cursive; + + HB_EntryExitRecord* eer; + HB_Fixed entry_x, entry_y; + HB_Fixed exit_x, exit_y; + + HB_UNUSED(nesting_level); + + if ( context_length != 0xFFFF && context_length < 1 ) + { + gpi->last = 0xFFFF; + return HB_Err_Not_Covered; + } + + /* Glyphs not having the right GDEF properties will be ignored, i.e., + gpi->last won't be reset (contrary to user defined properties). */ + + if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) ) + return error; + + /* We don't handle mark glyphs here. According to Andrei, this isn't + possible, but who knows... */ + + if ( property == HB_GDEF_MARK ) + { + gpi->last = 0xFFFF; + return HB_Err_Not_Covered; + } + + error = _HB_OPEN_Coverage_Index( &cp->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + { + gpi->last = 0xFFFF; + return error; + } + + if ( index >= cp->EntryExitCount ) + return ERR(HB_Err_Invalid_SubTable); + + eer = &cp->EntryExitRecord[index]; + + /* Now comes the messiest part of the whole OpenType + specification. At first glance, cursive connections seem easy + to understand, but there are pitfalls! The reason is that + the specs don't mention how to compute the advance values + resp. glyph offsets. I was told it would be an omission, to + be fixed in the next OpenType version... Again many thanks to + Andrei Burago for clarifications. + + Consider the following example: + + | xadv1 | + +---------+ + | | + +-----+--+ 1 | + | | .| | + | 0+--+------+ + | 2 | + | | + 0+--------+ + | xadv2 | + + glyph1: advance width = 12 + anchor point = (3,1) + + glyph2: advance width = 11 + anchor point = (9,4) + + LSB is 1 for both glyphs (so the boxes drawn above are glyph + bboxes). Writing direction is R2L; `0' denotes the glyph's + coordinate origin. + + Now the surprising part: The advance width of the *left* glyph + (resp. of the *bottom* glyph) will be modified, no matter + whether the writing direction is L2R or R2L (resp. T2B or + B2T)! This assymetry is caused by the fact that the glyph's + coordinate origin is always the lower left corner for all + writing directions. + + Continuing the above example, we can compute the new + (horizontal) advance width of glyph2 as + + 9 - 3 = 6 , + + and the new vertical offset of glyph2 as + + 1 - 4 = -3 . + + + Vertical writing direction is far more complicated: + + a) Assuming that we recompute the advance height of the lower glyph: + + -- + +---------+ + -- | | + +-----+--+ 1 | yadv1 + | | .| | + yadv2 | 0+--+------+ -- BSB1 -- + | 2 | -- -- y_offset + | | + BSB2 -- 0+--------+ -- + -- -- + + glyph1: advance height = 6 + anchor point = (3,1) + + glyph2: advance height = 7 + anchor point = (9,4) + + TSB is 1 for both glyphs; writing direction is T2B. + + + BSB1 = yadv1 - (TSB1 + ymax1) + BSB2 = yadv2 - (TSB2 + ymax2) + y_offset = y2 - y1 + + vertical advance width of glyph2 + = y_offset + BSB2 - BSB1 + = (y2 - y1) + (yadv2 - (TSB2 + ymax2)) - (yadv1 - (TSB1 + ymax1)) + = y2 - y1 + yadv2 - TSB2 - ymax2 - (yadv1 - TSB1 - ymax1) + = y2 - y1 + yadv2 - TSB2 - ymax2 - yadv1 + TSB1 + ymax1 + + + b) Assuming that we recompute the advance height of the upper glyph: + + -- -- + +---------+ -- TSB1 + -- -- | | + TSB2 -- +-----+--+ 1 | yadv1 ymax1 + | | .| | + yadv2 | 0+--+------+ -- -- + ymax2 | 2 | -- y_offset + | | + -- 0+--------+ -- + -- + + glyph1: advance height = 6 + anchor point = (3,1) + + glyph2: advance height = 7 + anchor point = (9,4) + + TSB is 1 for both glyphs; writing direction is T2B. + + y_offset = y2 - y1 + + vertical advance width of glyph2 + = TSB1 + ymax1 + y_offset - (TSB2 + ymax2) + = TSB1 + ymax1 + y2 - y1 - TSB2 - ymax2 + + + Comparing a) with b) shows that b) is easier to compute. I'll wait + for a reply from Andrei to see what should really be implemented... + + Since horizontal advance widths or vertical advance heights + can be used alone but not together, no ambiguity occurs. */ + + if ( gpi->last == 0xFFFF ) + goto end; + + /* Get_Anchor() returns HB_Err_Not_Covered if there is no anchor + table. */ + + error = Get_Anchor( gpi, &eer->EntryAnchor, IN_CURGLYPH(), + &entry_x, &entry_y ); + if ( error == HB_Err_Not_Covered ) + goto end; + if ( error ) + return error; + + if ( gpi->r2l ) + { + POSITION( buffer->in_pos )->x_advance = entry_x - gpi->anchor_x; + POSITION( buffer->in_pos )->new_advance = TRUE; + } + else + { + POSITION( gpi->last )->x_advance = gpi->anchor_x - entry_x; + POSITION( gpi->last )->new_advance = TRUE; + } + + if ( flags & HB_LOOKUP_FLAG_RIGHT_TO_LEFT ) + { + POSITION( gpi->last )->cursive_chain = gpi->last - buffer->in_pos; + POSITION( gpi->last )->y_pos = entry_y - gpi->anchor_y; + } + else + { + POSITION( buffer->in_pos )->cursive_chain = buffer->in_pos - gpi->last; + POSITION( buffer->in_pos )->y_pos = gpi->anchor_y - entry_y; + } + +end: + error = Get_Anchor( gpi, &eer->ExitAnchor, IN_CURGLYPH(), + &exit_x, &exit_y ); + if ( error == HB_Err_Not_Covered ) + gpi->last = 0xFFFF; + else + { + gpi->last = buffer->in_pos; + gpi->anchor_x = exit_x; + gpi->anchor_y = exit_y; + } + if ( error ) + return error; + + (buffer->in_pos)++; + + return HB_Err_Ok; +} + + +/* LookupType 4 */ + +/* BaseArray */ + +static HB_Error Load_BaseArray( HB_BaseArray* ba, + HB_UShort num_classes, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort m, n, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_BaseRecord *br; + HB_Anchor *ban, *bans; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = ba->BaseCount = GET_UShort(); + + FORGET_Frame(); + + ba->BaseRecord = NULL; + + if ( ALLOC_ARRAY( ba->BaseRecord, count, HB_BaseRecord ) ) + return error; + + br = ba->BaseRecord; + + bans = NULL; + + if ( ALLOC_ARRAY( bans, count * num_classes, HB_Anchor ) ) + goto Fail; + + for ( m = 0; m < count; m++ ) + { + br[m].BaseAnchor = NULL; + + ban = br[m].BaseAnchor = bans + m * num_classes; + + for ( n = 0; n < num_classes; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + if (new_offset == base_offset) { + /* XXX + * Doulos SIL Regular is buggy and has zero offsets here. + * Skip it + */ + ban[n].PosFormat = 0; + continue; + } + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Anchor( &ban[n], stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + } + + return HB_Err_Ok; + +Fail: + FREE( bans ); + FREE( br ); + return error; +} + + +static void Free_BaseArray( HB_BaseArray* ba, + HB_UShort num_classes ) +{ + HB_BaseRecord *br; + HB_Anchor *bans; + + if ( ba->BaseRecord ) + { + br = ba->BaseRecord; + + if ( ba->BaseCount ) + { + HB_UShort i, count; + count = num_classes * ba->BaseCount; + bans = br[0].BaseAnchor; + for (i = 0; i < count; i++) + Free_Anchor (&bans[i]); + FREE( bans ); + } + + FREE( br ); + } +} + + +/* MarkBasePosFormat1 */ + +static HB_Error Load_MarkBasePos( HB_GPOS_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_MarkBasePos* mbp = &st->markbase; + + HB_UInt cur_offset, new_offset, base_offset; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 4L ) ) + return error; + + mbp->PosFormat = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + if (mbp->PosFormat != 1) + return ERR(HB_Err_Invalid_SubTable_Format); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &mbp->MarkCoverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &mbp->BaseCoverage, stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 4L ) ) + goto Fail2; + + mbp->ClassCount = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_MarkArray( &mbp->MarkArray, stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_BaseArray( &mbp->BaseArray, mbp->ClassCount, + stream ) ) != HB_Err_Ok ) + goto Fail1; + + return HB_Err_Ok; + +Fail1: + Free_MarkArray( &mbp->MarkArray ); + +Fail2: + _HB_OPEN_Free_Coverage( &mbp->BaseCoverage ); + +Fail3: + _HB_OPEN_Free_Coverage( &mbp->MarkCoverage ); + return error; +} + + +static void Free_MarkBasePos( HB_GPOS_SubTable* st ) +{ + HB_MarkBasePos* mbp = &st->markbase; + + Free_BaseArray( &mbp->BaseArray, mbp->ClassCount ); + Free_MarkArray( &mbp->MarkArray ); + _HB_OPEN_Free_Coverage( &mbp->BaseCoverage ); + _HB_OPEN_Free_Coverage( &mbp->MarkCoverage ); +} + + +static HB_Error Lookup_MarkBasePos( GPOS_Instance* gpi, + HB_GPOS_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort i, j, mark_index, base_index, property, class; + HB_Fixed x_mark_value, y_mark_value, x_base_value, y_base_value; + HB_Error error; + HB_GPOSHeader* gpos = gpi->gpos; + HB_MarkBasePos* mbp = &st->markbase; + + HB_MarkArray* ma; + HB_BaseArray* ba; + HB_BaseRecord* br; + HB_Anchor* mark_anchor; + HB_Anchor* base_anchor; + + HB_Position o; + + HB_UNUSED(nesting_level); + + if ( context_length != 0xFFFF && context_length < 1 ) + return HB_Err_Not_Covered; + + if ( flags & HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS ) + return HB_Err_Not_Covered; + + if ( CHECK_Property( gpos->gdef, IN_CURITEM(), + flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &mbp->MarkCoverage, IN_CURGLYPH(), + &mark_index ); + if ( error ) + return error; + + /* now we search backwards for a non-mark glyph */ + + i = 1; + j = buffer->in_pos - 1; + + while ( i <= buffer->in_pos ) + { + error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ), + &property ); + if ( error ) + return error; + + if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) + break; + + i++; + j--; + } + + /* The following assertion is too strong -- at least for mangal.ttf. */ +#if 0 + if ( property != HB_GDEF_BASE_GLYPH ) + return HB_Err_Not_Covered; +#endif + + if ( i > buffer->in_pos ) + return HB_Err_Not_Covered; + + error = _HB_OPEN_Coverage_Index( &mbp->BaseCoverage, IN_GLYPH( j ), + &base_index ); + if ( error ) + return error; + + ma = &mbp->MarkArray; + + if ( mark_index >= ma->MarkCount ) + return ERR(HB_Err_Invalid_SubTable); + + class = ma->MarkRecord[mark_index].Class; + mark_anchor = &ma->MarkRecord[mark_index].MarkAnchor; + + if ( class >= mbp->ClassCount ) + return ERR(HB_Err_Invalid_SubTable); + + ba = &mbp->BaseArray; + + if ( base_index >= ba->BaseCount ) + return ERR(HB_Err_Invalid_SubTable); + + br = &ba->BaseRecord[base_index]; + base_anchor = &br->BaseAnchor[class]; + + error = Get_Anchor( gpi, mark_anchor, IN_CURGLYPH(), + &x_mark_value, &y_mark_value ); + if ( error ) + return error; + + error = Get_Anchor( gpi, base_anchor, IN_GLYPH( j ), + &x_base_value, &y_base_value ); + if ( error ) + return error; + + /* anchor points are not cumulative */ + + o = POSITION( buffer->in_pos ); + + o->x_pos = x_base_value - x_mark_value; + o->y_pos = y_base_value - y_mark_value; + o->x_advance = 0; + o->y_advance = 0; + o->back = i; + + (buffer->in_pos)++; + + return HB_Err_Ok; +} + + +/* LookupType 5 */ + +/* LigatureAttach */ + +static HB_Error Load_LigatureAttach( HB_LigatureAttach* lat, + HB_UShort num_classes, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort m, n, k, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ComponentRecord* cr; + HB_Anchor* lan; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = lat->ComponentCount = GET_UShort(); + + FORGET_Frame(); + + lat->ComponentRecord = NULL; + + if ( ALLOC_ARRAY( lat->ComponentRecord, count, HB_ComponentRecord ) ) + return error; + + cr = lat->ComponentRecord; + + for ( m = 0; m < count; m++ ) + { + cr[m].LigatureAnchor = NULL; + + if ( ALLOC_ARRAY( cr[m].LigatureAnchor, num_classes, HB_Anchor ) ) + goto Fail; + + lan = cr[m].LigatureAnchor; + + for ( n = 0; n < num_classes; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail0; + + new_offset = GET_UShort(); + + FORGET_Frame(); + + if ( new_offset ) + { + new_offset += base_offset; + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Anchor( &lan[n], stream ) ) != HB_Err_Ok ) + goto Fail0; + (void)FILE_Seek( cur_offset ); + } + else + lan[n].PosFormat = 0; + } + + continue; + Fail0: + for ( k = 0; k < n; k++ ) + Free_Anchor( &lan[k] ); + goto Fail; + } + + return HB_Err_Ok; + +Fail: + for ( k = 0; k < m; k++ ) + { + lan = cr[k].LigatureAnchor; + + for ( n = 0; n < num_classes; n++ ) + Free_Anchor( &lan[n] ); + + FREE( lan ); + } + + FREE( cr ); + return error; +} + + +static void Free_LigatureAttach( HB_LigatureAttach* lat, + HB_UShort num_classes ) +{ + HB_UShort m, n, count; + + HB_ComponentRecord* cr; + HB_Anchor* lan; + + + if ( lat->ComponentRecord ) + { + count = lat->ComponentCount; + cr = lat->ComponentRecord; + + for ( m = 0; m < count; m++ ) + { + lan = cr[m].LigatureAnchor; + + for ( n = 0; n < num_classes; n++ ) + Free_Anchor( &lan[n] ); + + FREE( lan ); + } + + FREE( cr ); + } +} + + +/* LigatureArray */ + +static HB_Error Load_LigatureArray( HB_LigatureArray* la, + HB_UShort num_classes, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_LigatureAttach* lat; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = la->LigatureCount = GET_UShort(); + + FORGET_Frame(); + + la->LigatureAttach = NULL; + + if ( ALLOC_ARRAY( la->LigatureAttach, count, HB_LigatureAttach ) ) + return error; + + lat = la->LigatureAttach; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_LigatureAttach( &lat[n], num_classes, + stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_LigatureAttach( &lat[m], num_classes ); + + FREE( lat ); + return error; +} + + +static void Free_LigatureArray( HB_LigatureArray* la, + HB_UShort num_classes ) +{ + HB_UShort n, count; + + HB_LigatureAttach* lat; + + + if ( la->LigatureAttach ) + { + count = la->LigatureCount; + lat = la->LigatureAttach; + + for ( n = 0; n < count; n++ ) + Free_LigatureAttach( &lat[n], num_classes ); + + FREE( lat ); + } +} + + +/* MarkLigPosFormat1 */ + +static HB_Error Load_MarkLigPos( HB_GPOS_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_MarkLigPos* mlp = &st->marklig; + + HB_UInt cur_offset, new_offset, base_offset; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 4L ) ) + return error; + + mlp->PosFormat = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &mlp->MarkCoverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &mlp->LigatureCoverage, + stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 4L ) ) + goto Fail2; + + mlp->ClassCount = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_MarkArray( &mlp->MarkArray, stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_LigatureArray( &mlp->LigatureArray, mlp->ClassCount, + stream ) ) != HB_Err_Ok ) + goto Fail1; + + return HB_Err_Ok; + +Fail1: + Free_MarkArray( &mlp->MarkArray ); + +Fail2: + _HB_OPEN_Free_Coverage( &mlp->LigatureCoverage ); + +Fail3: + _HB_OPEN_Free_Coverage( &mlp->MarkCoverage ); + return error; +} + + +static void Free_MarkLigPos( HB_GPOS_SubTable* st) +{ + HB_MarkLigPos* mlp = &st->marklig; + + Free_LigatureArray( &mlp->LigatureArray, mlp->ClassCount ); + Free_MarkArray( &mlp->MarkArray ); + _HB_OPEN_Free_Coverage( &mlp->LigatureCoverage ); + _HB_OPEN_Free_Coverage( &mlp->MarkCoverage ); +} + + +static HB_Error Lookup_MarkLigPos( GPOS_Instance* gpi, + HB_GPOS_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort i, j, mark_index, lig_index, property, class; + HB_UShort mark_glyph; + HB_Fixed x_mark_value, y_mark_value, x_lig_value, y_lig_value; + HB_Error error; + HB_GPOSHeader* gpos = gpi->gpos; + HB_MarkLigPos* mlp = &st->marklig; + + HB_MarkArray* ma; + HB_LigatureArray* la; + HB_LigatureAttach* lat; + HB_ComponentRecord* cr; + HB_UShort comp_index; + HB_Anchor* mark_anchor; + HB_Anchor* lig_anchor; + + HB_Position o; + + HB_UNUSED(nesting_level); + + if ( context_length != 0xFFFF && context_length < 1 ) + return HB_Err_Not_Covered; + + if ( flags & HB_LOOKUP_FLAG_IGNORE_LIGATURES ) + return HB_Err_Not_Covered; + + mark_glyph = IN_CURGLYPH(); + + if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &mlp->MarkCoverage, mark_glyph, &mark_index ); + if ( error ) + return error; + + /* now we search backwards for a non-mark glyph */ + + i = 1; + j = buffer->in_pos - 1; + + while ( i <= buffer->in_pos ) + { + error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ), + &property ); + if ( error ) + return error; + + if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) + break; + + i++; + j--; + } + + /* Similar to Lookup_MarkBasePos(), I suspect that this assertion is + too strong, thus it is commented out. */ +#if 0 + if ( property != HB_GDEF_LIGATURE ) + return HB_Err_Not_Covered; +#endif + + if ( i > buffer->in_pos ) + return HB_Err_Not_Covered; + + error = _HB_OPEN_Coverage_Index( &mlp->LigatureCoverage, IN_GLYPH( j ), + &lig_index ); + if ( error ) + return error; + + ma = &mlp->MarkArray; + + if ( mark_index >= ma->MarkCount ) + return ERR(HB_Err_Invalid_SubTable); + + class = ma->MarkRecord[mark_index].Class; + mark_anchor = &ma->MarkRecord[mark_index].MarkAnchor; + + if ( class >= mlp->ClassCount ) + return ERR(HB_Err_Invalid_SubTable); + + la = &mlp->LigatureArray; + + if ( lig_index >= la->LigatureCount ) + return ERR(HB_Err_Invalid_SubTable); + + lat = &la->LigatureAttach[lig_index]; + + /* We must now check whether the ligature ID of the current mark glyph + is identical to the ligature ID of the found ligature. If yes, we + can directly use the component index. If not, we attach the mark + glyph to the last component of the ligature. */ + + if ( IN_LIGID( j ) == IN_LIGID( buffer->in_pos) ) + { + comp_index = IN_COMPONENT( buffer->in_pos ); + if ( comp_index >= lat->ComponentCount ) + return HB_Err_Not_Covered; + } + else + comp_index = lat->ComponentCount - 1; + + cr = &lat->ComponentRecord[comp_index]; + lig_anchor = &cr->LigatureAnchor[class]; + + error = Get_Anchor( gpi, mark_anchor, IN_CURGLYPH(), + &x_mark_value, &y_mark_value ); + if ( error ) + return error; + error = Get_Anchor( gpi, lig_anchor, IN_GLYPH( j ), + &x_lig_value, &y_lig_value ); + if ( error ) + return error; + + /* anchor points are not cumulative */ + + o = POSITION( buffer->in_pos ); + + o->x_pos = x_lig_value - x_mark_value; + o->y_pos = y_lig_value - y_mark_value; + o->x_advance = 0; + o->y_advance = 0; + o->back = i; + + (buffer->in_pos)++; + + return HB_Err_Ok; +} + + +/* LookupType 6 */ + +/* Mark2Array */ + +static HB_Error Load_Mark2Array( HB_Mark2Array* m2a, + HB_UShort num_classes, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort m, n, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Mark2Record *m2r; + HB_Anchor *m2an, *m2ans; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = m2a->Mark2Count = GET_UShort(); + + FORGET_Frame(); + + m2a->Mark2Record = NULL; + + if ( ALLOC_ARRAY( m2a->Mark2Record, count, HB_Mark2Record ) ) + return error; + + m2r = m2a->Mark2Record; + + m2ans = NULL; + + if ( ALLOC_ARRAY( m2ans, count * num_classes, HB_Anchor ) ) + goto Fail; + + for ( m = 0; m < count; m++ ) + { + m2an = m2r[m].Mark2Anchor = m2ans + m * num_classes; + + for ( n = 0; n < num_classes; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + if (new_offset == base_offset) { + /* Anchor table not provided. Skip loading. + * Some versions of FreeSans hit this. */ + m2an[n].PosFormat = 0; + continue; + } + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Anchor( &m2an[n], stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + } + + return HB_Err_Ok; + +Fail: + FREE( m2ans ); + FREE( m2r ); + return error; +} + + +static void Free_Mark2Array( HB_Mark2Array* m2a, + HB_UShort num_classes ) +{ + HB_Mark2Record *m2r; + HB_Anchor *m2ans; + + HB_UNUSED(num_classes); + + if ( m2a->Mark2Record ) + { + m2r = m2a->Mark2Record; + + if ( m2a->Mark2Count ) + { + m2ans = m2r[0].Mark2Anchor; + FREE( m2ans ); + } + + FREE( m2r ); + } +} + + +/* MarkMarkPosFormat1 */ + +static HB_Error Load_MarkMarkPos( HB_GPOS_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_MarkMarkPos* mmp = &st->markmark; + + HB_UInt cur_offset, new_offset, base_offset; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 4L ) ) + return error; + + mmp->PosFormat = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &mmp->Mark1Coverage, + stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &mmp->Mark2Coverage, + stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 4L ) ) + goto Fail2; + + mmp->ClassCount = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_MarkArray( &mmp->Mark1Array, stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Mark2Array( &mmp->Mark2Array, mmp->ClassCount, + stream ) ) != HB_Err_Ok ) + goto Fail1; + + return HB_Err_Ok; + +Fail1: + Free_MarkArray( &mmp->Mark1Array ); + +Fail2: + _HB_OPEN_Free_Coverage( &mmp->Mark2Coverage ); + +Fail3: + _HB_OPEN_Free_Coverage( &mmp->Mark1Coverage ); + return error; +} + + +static void Free_MarkMarkPos( HB_GPOS_SubTable* st) +{ + HB_MarkMarkPos* mmp = &st->markmark; + + Free_Mark2Array( &mmp->Mark2Array, mmp->ClassCount ); + Free_MarkArray( &mmp->Mark1Array ); + _HB_OPEN_Free_Coverage( &mmp->Mark2Coverage ); + _HB_OPEN_Free_Coverage( &mmp->Mark1Coverage ); +} + + +static HB_Error Lookup_MarkMarkPos( GPOS_Instance* gpi, + HB_GPOS_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort i, j, mark1_index, mark2_index, property, class; + HB_Fixed x_mark1_value, y_mark1_value, + x_mark2_value, y_mark2_value; + HB_Error error; + HB_GPOSHeader* gpos = gpi->gpos; + HB_MarkMarkPos* mmp = &st->markmark; + + HB_MarkArray* ma1; + HB_Mark2Array* ma2; + HB_Mark2Record* m2r; + HB_Anchor* mark1_anchor; + HB_Anchor* mark2_anchor; + + HB_Position o; + + HB_UNUSED(nesting_level); + + if ( context_length != 0xFFFF && context_length < 1 ) + return HB_Err_Not_Covered; + + if ( flags & HB_LOOKUP_FLAG_IGNORE_MARKS ) + return HB_Err_Not_Covered; + + if ( CHECK_Property( gpos->gdef, IN_CURITEM(), + flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &mmp->Mark1Coverage, IN_CURGLYPH(), + &mark1_index ); + if ( error ) + return error; + + /* now we search backwards for a suitable mark glyph until a non-mark + glyph */ + + if ( buffer->in_pos == 0 ) + return HB_Err_Not_Covered; + + i = 1; + j = buffer->in_pos - 1; + while ( i <= buffer->in_pos ) + { + error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ), + &property ); + if ( error ) + return error; + + if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) + return HB_Err_Not_Covered; + + if ( flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) + { + if ( property == (flags & 0xFF00) ) + break; + } + else + break; + + i++; + j--; + } + + error = _HB_OPEN_Coverage_Index( &mmp->Mark2Coverage, IN_GLYPH( j ), + &mark2_index ); + if ( error ) + return error; + + ma1 = &mmp->Mark1Array; + + if ( mark1_index >= ma1->MarkCount ) + return ERR(HB_Err_Invalid_SubTable); + + class = ma1->MarkRecord[mark1_index].Class; + mark1_anchor = &ma1->MarkRecord[mark1_index].MarkAnchor; + + if ( class >= mmp->ClassCount ) + return ERR(HB_Err_Invalid_SubTable); + + ma2 = &mmp->Mark2Array; + + if ( mark2_index >= ma2->Mark2Count ) + return ERR(HB_Err_Invalid_SubTable); + + m2r = &ma2->Mark2Record[mark2_index]; + mark2_anchor = &m2r->Mark2Anchor[class]; + + error = Get_Anchor( gpi, mark1_anchor, IN_CURGLYPH(), + &x_mark1_value, &y_mark1_value ); + if ( error ) + return error; + error = Get_Anchor( gpi, mark2_anchor, IN_GLYPH( j ), + &x_mark2_value, &y_mark2_value ); + if ( error ) + return error; + + /* anchor points are not cumulative */ + + o = POSITION( buffer->in_pos ); + + o->x_pos = x_mark2_value - x_mark1_value; + o->y_pos = y_mark2_value - y_mark1_value; + o->x_advance = 0; + o->y_advance = 0; + o->back = 1; + + (buffer->in_pos)++; + + return HB_Err_Ok; +} + + +/* Do the actual positioning for a context positioning (either format + 7 or 8). This is only called after we've determined that the stream + matches the subrule. */ + +static HB_Error Do_ContextPos( GPOS_Instance* gpi, + HB_UShort GlyphCount, + HB_UShort PosCount, + HB_PosLookupRecord* pos, + HB_Buffer buffer, + int nesting_level ) +{ + HB_Error error; + HB_UInt i, old_pos; + + + i = 0; + + while ( i < GlyphCount ) + { + if ( PosCount && i == pos->SequenceIndex ) + { + old_pos = buffer->in_pos; + + /* Do a positioning */ + + error = GPOS_Do_Glyph_Lookup( gpi, pos->LookupListIndex, buffer, + GlyphCount, nesting_level ); + + if ( error ) + return error; + + pos++; + PosCount--; + i += buffer->in_pos - old_pos; + } + else + { + i++; + (buffer->in_pos)++; + } + } + + return HB_Err_Ok; +} + + +/* LookupType 7 */ + +/* PosRule */ + +static HB_Error Load_PosRule( HB_PosRule* pr, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UShort* i; + + HB_PosLookupRecord* plr; + + + if ( ACCESS_Frame( 4L ) ) + return error; + + pr->GlyphCount = GET_UShort(); + pr->PosCount = GET_UShort(); + + FORGET_Frame(); + + pr->Input = NULL; + + count = pr->GlyphCount - 1; /* only GlyphCount - 1 elements */ + + if ( ALLOC_ARRAY( pr->Input, count, HB_UShort ) ) + return error; + + i = pr->Input; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail2; + + for ( n = 0; n < count; n++ ) + i[n] = GET_UShort(); + + FORGET_Frame(); + + pr->PosLookupRecord = NULL; + + count = pr->PosCount; + + if ( ALLOC_ARRAY( pr->PosLookupRecord, count, HB_PosLookupRecord ) ) + goto Fail2; + + plr = pr->PosLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + plr[n].SequenceIndex = GET_UShort(); + plr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( plr ); + +Fail2: + FREE( i ); + return error; +} + + +static void Free_PosRule( HB_PosRule* pr ) +{ + FREE( pr->PosLookupRecord ); + FREE( pr->Input ); +} + + +/* PosRuleSet */ + +static HB_Error Load_PosRuleSet( HB_PosRuleSet* prs, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_PosRule* pr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = prs->PosRuleCount = GET_UShort(); + + FORGET_Frame(); + + prs->PosRule = NULL; + + if ( ALLOC_ARRAY( prs->PosRule, count, HB_PosRule ) ) + return error; + + pr = prs->PosRule; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_PosRule( &pr[n], stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_PosRule( &pr[m] ); + + FREE( pr ); + return error; +} + + +static void Free_PosRuleSet( HB_PosRuleSet* prs ) +{ + HB_UShort n, count; + + HB_PosRule* pr; + + + if ( prs->PosRule ) + { + count = prs->PosRuleCount; + pr = prs->PosRule; + + for ( n = 0; n < count; n++ ) + Free_PosRule( &pr[n] ); + + FREE( pr ); + } +} + + +/* ContextPosFormat1 */ + +static HB_Error Load_ContextPos1( HB_ContextPosFormat1* cpf1, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_PosRuleSet* prs; + + + base_offset = FILE_Pos() - 2L; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &cpf1->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = cpf1->PosRuleSetCount = GET_UShort(); + + FORGET_Frame(); + + cpf1->PosRuleSet = NULL; + + if ( ALLOC_ARRAY( cpf1->PosRuleSet, count, HB_PosRuleSet ) ) + goto Fail2; + + prs = cpf1->PosRuleSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_PosRuleSet( &prs[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_PosRuleSet( &prs[m] ); + + FREE( prs ); + +Fail2: + _HB_OPEN_Free_Coverage( &cpf1->Coverage ); + return error; +} + + +static void Free_ContextPos1( HB_ContextPosFormat1* cpf1 ) +{ + HB_UShort n, count; + + HB_PosRuleSet* prs; + + + if ( cpf1->PosRuleSet ) + { + count = cpf1->PosRuleSetCount; + prs = cpf1->PosRuleSet; + + for ( n = 0; n < count; n++ ) + Free_PosRuleSet( &prs[n] ); + + FREE( prs ); + } + + _HB_OPEN_Free_Coverage( &cpf1->Coverage ); +} + + +/* PosClassRule */ + +static HB_Error Load_PosClassRule( HB_ContextPosFormat2* cpf2, + HB_PosClassRule* pcr, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_UShort* c; + HB_PosLookupRecord* plr; + + + if ( ACCESS_Frame( 4L ) ) + return error; + + pcr->GlyphCount = GET_UShort(); + pcr->PosCount = GET_UShort(); + + FORGET_Frame(); + + if ( pcr->GlyphCount > cpf2->MaxContextLength ) + cpf2->MaxContextLength = pcr->GlyphCount; + + pcr->Class = NULL; + + count = pcr->GlyphCount - 1; /* only GlyphCount - 1 elements */ + + if ( ALLOC_ARRAY( pcr->Class, count, HB_UShort ) ) + return error; + + c = pcr->Class; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail2; + + for ( n = 0; n < count; n++ ) + c[n] = GET_UShort(); + + FORGET_Frame(); + + pcr->PosLookupRecord = NULL; + + count = pcr->PosCount; + + if ( ALLOC_ARRAY( pcr->PosLookupRecord, count, HB_PosLookupRecord ) ) + goto Fail2; + + plr = pcr->PosLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + plr[n].SequenceIndex = GET_UShort(); + plr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( plr ); + +Fail2: + FREE( c ); + return error; +} + + +static void Free_PosClassRule( HB_PosClassRule* pcr ) +{ + FREE( pcr->PosLookupRecord ); + FREE( pcr->Class ); +} + + +/* PosClassSet */ + +static HB_Error Load_PosClassSet( HB_ContextPosFormat2* cpf2, + HB_PosClassSet* pcs, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_PosClassRule* pcr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = pcs->PosClassRuleCount = GET_UShort(); + + FORGET_Frame(); + + pcs->PosClassRule = NULL; + + if ( ALLOC_ARRAY( pcs->PosClassRule, count, HB_PosClassRule ) ) + return error; + + pcr = pcs->PosClassRule; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_PosClassRule( cpf2, &pcr[n], + stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_PosClassRule( &pcr[m] ); + + FREE( pcr ); + return error; +} + + +static void Free_PosClassSet( HB_PosClassSet* pcs ) +{ + HB_UShort n, count; + + HB_PosClassRule* pcr; + + + if ( pcs->PosClassRule ) + { + count = pcs->PosClassRuleCount; + pcr = pcs->PosClassRule; + + for ( n = 0; n < count; n++ ) + Free_PosClassRule( &pcr[n] ); + + FREE( pcr ); + } +} + + +/* ContextPosFormat2 */ + +static HB_Error Load_ContextPos2( HB_ContextPosFormat2* cpf2, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_PosClassSet* pcs; + + + base_offset = FILE_Pos() - 2; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &cpf2->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 4L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + /* `PosClassSetCount' is the upper limit for class values, thus we + read it now to make an additional safety check. */ + + count = cpf2->PosClassSetCount = GET_UShort(); + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_ClassDefinition( &cpf2->ClassDef, count, + stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + + cpf2->PosClassSet = NULL; + cpf2->MaxContextLength = 0; + + if ( ALLOC_ARRAY( cpf2->PosClassSet, count, HB_PosClassSet ) ) + goto Fail2; + + pcs = cpf2->PosClassSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + if ( new_offset != base_offset ) /* not a NULL offset */ + { + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_PosClassSet( cpf2, &pcs[n], + stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + else + { + /* we create a PosClassSet table with no entries */ + + cpf2->PosClassSet[n].PosClassRuleCount = 0; + cpf2->PosClassSet[n].PosClassRule = NULL; + } + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; n++ ) + Free_PosClassSet( &pcs[m] ); + + FREE( pcs ); + +Fail2: + _HB_OPEN_Free_ClassDefinition( &cpf2->ClassDef ); + +Fail3: + _HB_OPEN_Free_Coverage( &cpf2->Coverage ); + return error; +} + + +static void Free_ContextPos2( HB_ContextPosFormat2* cpf2 ) +{ + HB_UShort n, count; + + HB_PosClassSet* pcs; + + + if ( cpf2->PosClassSet ) + { + count = cpf2->PosClassSetCount; + pcs = cpf2->PosClassSet; + + for ( n = 0; n < count; n++ ) + Free_PosClassSet( &pcs[n] ); + + FREE( pcs ); + } + + _HB_OPEN_Free_ClassDefinition( &cpf2->ClassDef ); + _HB_OPEN_Free_Coverage( &cpf2->Coverage ); +} + + +/* ContextPosFormat3 */ + +static HB_Error Load_ContextPos3( HB_ContextPosFormat3* cpf3, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Coverage* c; + HB_PosLookupRecord* plr; + + + base_offset = FILE_Pos() - 2L; + + if ( ACCESS_Frame( 4L ) ) + return error; + + cpf3->GlyphCount = GET_UShort(); + cpf3->PosCount = GET_UShort(); + + FORGET_Frame(); + + cpf3->Coverage = NULL; + + count = cpf3->GlyphCount; + + if ( ALLOC_ARRAY( cpf3->Coverage, count, HB_Coverage ) ) + return error; + + c = cpf3->Coverage; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &c[n], stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + } + + cpf3->PosLookupRecord = NULL; + + count = cpf3->PosCount; + + if ( ALLOC_ARRAY( cpf3->PosLookupRecord, count, HB_PosLookupRecord ) ) + goto Fail2; + + plr = cpf3->PosLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + plr[n].SequenceIndex = GET_UShort(); + plr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( plr ); + +Fail2: + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + return error; +} + + +static void Free_ContextPos3( HB_ContextPosFormat3* cpf3 ) +{ + HB_UShort n, count; + + HB_Coverage* c; + + + FREE( cpf3->PosLookupRecord ); + + if ( cpf3->Coverage ) + { + count = cpf3->GlyphCount; + c = cpf3->Coverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } +} + + +/* ContextPos */ + +static HB_Error Load_ContextPos( HB_GPOS_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_ContextPos* cp = &st->context; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + cp->PosFormat = GET_UShort(); + + FORGET_Frame(); + + switch ( cp->PosFormat ) + { + case 1: + return Load_ContextPos1( &cp->cpf.cpf1, stream ); + + case 2: + return Load_ContextPos2( &cp->cpf.cpf2, stream ); + + case 3: + return Load_ContextPos3( &cp->cpf.cpf3, stream ); + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + +static void Free_ContextPos( HB_GPOS_SubTable* st ) +{ + HB_ContextPos* cp = &st->context; + + switch ( cp->PosFormat ) + { + case 1: Free_ContextPos1( &cp->cpf.cpf1 ); break; + case 2: Free_ContextPos2( &cp->cpf.cpf2 ); break; + case 3: Free_ContextPos3( &cp->cpf.cpf3 ); break; + default: break; + } +} + + +static HB_Error Lookup_ContextPos1( GPOS_Instance* gpi, + HB_ContextPosFormat1* cpf1, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_UShort i, j, k, numpr; + HB_Error error; + HB_GPOSHeader* gpos = gpi->gpos; + + HB_PosRule* pr; + HB_GDEFHeader* gdef; + + + gdef = gpos->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &cpf1->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + pr = cpf1->PosRuleSet[index].PosRule; + numpr = cpf1->PosRuleSet[index].PosRuleCount; + + for ( k = 0; k < numpr; k++ ) + { + if ( context_length != 0xFFFF && context_length < pr[k].GlyphCount ) + goto next_posrule; + + if ( buffer->in_pos + pr[k].GlyphCount > buffer->in_length ) + goto next_posrule; /* context is too long */ + + for ( i = 1, j = buffer->in_pos + 1; i < pr[k].GlyphCount; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + pr[k].GlyphCount - i == (HB_Int)buffer->in_length ) + goto next_posrule; + j++; + } + + if ( IN_GLYPH( j ) != pr[k].Input[i - 1] ) + goto next_posrule; + } + + return Do_ContextPos( gpi, pr[k].GlyphCount, + pr[k].PosCount, pr[k].PosLookupRecord, + buffer, + nesting_level ); + + next_posrule: + ; + } + + return HB_Err_Not_Covered; +} + + +static HB_Error Lookup_ContextPos2( GPOS_Instance* gpi, + HB_ContextPosFormat2* cpf2, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_Error error; + HB_UShort i, j, k, known_classes; + + HB_UShort* classes; + HB_UShort* cl; + HB_GPOSHeader* gpos = gpi->gpos; + + HB_PosClassSet* pcs; + HB_PosClassRule* pr; + HB_GDEFHeader* gdef; + + + gdef = gpos->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + /* Note: The coverage table in format 2 doesn't give an index into + anything. It just lets us know whether or not we need to + do any lookup at all. */ + + error = _HB_OPEN_Coverage_Index( &cpf2->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + if (cpf2->MaxContextLength < 1) + return HB_Err_Not_Covered; + + if ( ALLOC_ARRAY( classes, cpf2->MaxContextLength, HB_UShort ) ) + return error; + + error = _HB_OPEN_Get_Class( &cpf2->ClassDef, IN_CURGLYPH(), + &classes[0], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End; + known_classes = 0; + + pcs = &cpf2->PosClassSet[classes[0]]; + if ( !pcs ) + { + error = ERR(HB_Err_Invalid_SubTable); + goto End; + } + + for ( k = 0; k < pcs->PosClassRuleCount; k++ ) + { + pr = &pcs->PosClassRule[k]; + + if ( context_length != 0xFFFF && context_length < pr->GlyphCount ) + goto next_posclassrule; + + if ( buffer->in_pos + pr->GlyphCount > buffer->in_length ) + goto next_posclassrule; /* context is too long */ + + cl = pr->Class; + + /* Start at 1 because [0] is implied */ + + for ( i = 1, j = buffer->in_pos + 1; i < pr->GlyphCount; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + goto End; + + if ( j + pr->GlyphCount - i == (HB_Int)buffer->in_length ) + goto next_posclassrule; + j++; + } + + if ( i > known_classes ) + { + /* Keeps us from having to do this for each rule */ + + error = _HB_OPEN_Get_Class( &cpf2->ClassDef, IN_GLYPH( j ), &classes[i], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End; + known_classes = i; + } + + if ( cl[i - 1] != classes[i] ) + goto next_posclassrule; + } + + error = Do_ContextPos( gpi, pr->GlyphCount, + pr->PosCount, pr->PosLookupRecord, + buffer, + nesting_level ); + goto End; + + next_posclassrule: + ; + } + + error = HB_Err_Not_Covered; + +End: + FREE( classes ); + return error; +} + + +static HB_Error Lookup_ContextPos3( GPOS_Instance* gpi, + HB_ContextPosFormat3* cpf3, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_Error error; + HB_UShort index, i, j, property; + HB_GPOSHeader* gpos = gpi->gpos; + + HB_Coverage* c; + HB_GDEFHeader* gdef; + + + gdef = gpos->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + if ( context_length != 0xFFFF && context_length < cpf3->GlyphCount ) + return HB_Err_Not_Covered; + + if ( buffer->in_pos + cpf3->GlyphCount > buffer->in_length ) + return HB_Err_Not_Covered; /* context is too long */ + + c = cpf3->Coverage; + + for ( i = 1, j = 1; i < cpf3->GlyphCount; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + cpf3->GlyphCount - i == (HB_Int)buffer->in_length ) + return HB_Err_Not_Covered; + j++; + } + + error = _HB_OPEN_Coverage_Index( &c[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + + return Do_ContextPos( gpi, cpf3->GlyphCount, + cpf3->PosCount, cpf3->PosLookupRecord, + buffer, + nesting_level ); +} + + +static HB_Error Lookup_ContextPos( GPOS_Instance* gpi, + HB_GPOS_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_ContextPos* cp = &st->context; + + switch ( cp->PosFormat ) + { + case 1: + return Lookup_ContextPos1( gpi, &cp->cpf.cpf1, buffer, + flags, context_length, nesting_level ); + + case 2: + return Lookup_ContextPos2( gpi, &cp->cpf.cpf2, buffer, + flags, context_length, nesting_level ); + + case 3: + return Lookup_ContextPos3( gpi, &cp->cpf.cpf3, buffer, + flags, context_length, nesting_level ); + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + +/* LookupType 8 */ + +/* ChainPosRule */ + +static HB_Error Load_ChainPosRule( HB_ChainPosRule* cpr, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UShort* b; + HB_UShort* i; + HB_UShort* l; + + HB_PosLookupRecord* plr; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + cpr->BacktrackGlyphCount = GET_UShort(); + + FORGET_Frame(); + + cpr->Backtrack = NULL; + + count = cpr->BacktrackGlyphCount; + + if ( ALLOC_ARRAY( cpr->Backtrack, count, HB_UShort ) ) + return error; + + b = cpr->Backtrack; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail4; + + for ( n = 0; n < count; n++ ) + b[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + cpr->InputGlyphCount = GET_UShort(); + + FORGET_Frame(); + + cpr->Input = NULL; + + count = cpr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */ + + if ( ALLOC_ARRAY( cpr->Input, count, HB_UShort ) ) + goto Fail4; + + i = cpr->Input; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail3; + + for ( n = 0; n < count; n++ ) + i[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + cpr->LookaheadGlyphCount = GET_UShort(); + + FORGET_Frame(); + + cpr->Lookahead = NULL; + + count = cpr->LookaheadGlyphCount; + + if ( ALLOC_ARRAY( cpr->Lookahead, count, HB_UShort ) ) + goto Fail3; + + l = cpr->Lookahead; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail2; + + for ( n = 0; n < count; n++ ) + l[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + cpr->PosCount = GET_UShort(); + + FORGET_Frame(); + + cpr->PosLookupRecord = NULL; + + count = cpr->PosCount; + + if ( ALLOC_ARRAY( cpr->PosLookupRecord, count, HB_PosLookupRecord ) ) + goto Fail2; + + plr = cpr->PosLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + plr[n].SequenceIndex = GET_UShort(); + plr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( plr ); + +Fail2: + FREE( l ); + +Fail3: + FREE( i ); + +Fail4: + FREE( b ); + return error; +} + + +static void Free_ChainPosRule( HB_ChainPosRule* cpr ) +{ + FREE( cpr->PosLookupRecord ); + FREE( cpr->Lookahead ); + FREE( cpr->Input ); + FREE( cpr->Backtrack ); +} + + +/* ChainPosRuleSet */ + +static HB_Error Load_ChainPosRuleSet( HB_ChainPosRuleSet* cprs, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ChainPosRule* cpr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = cprs->ChainPosRuleCount = GET_UShort(); + + FORGET_Frame(); + + cprs->ChainPosRule = NULL; + + if ( ALLOC_ARRAY( cprs->ChainPosRule, count, HB_ChainPosRule ) ) + return error; + + cpr = cprs->ChainPosRule; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_ChainPosRule( &cpr[n], stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_ChainPosRule( &cpr[m] ); + + FREE( cpr ); + return error; +} + + +static void Free_ChainPosRuleSet( HB_ChainPosRuleSet* cprs ) +{ + HB_UShort n, count; + + HB_ChainPosRule* cpr; + + + if ( cprs->ChainPosRule ) + { + count = cprs->ChainPosRuleCount; + cpr = cprs->ChainPosRule; + + for ( n = 0; n < count; n++ ) + Free_ChainPosRule( &cpr[n] ); + + FREE( cpr ); + } +} + + +/* ChainContextPosFormat1 */ + +static HB_Error Load_ChainContextPos1( HB_ChainContextPosFormat1* ccpf1, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ChainPosRuleSet* cprs; + + + base_offset = FILE_Pos() - 2L; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &ccpf1->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = ccpf1->ChainPosRuleSetCount = GET_UShort(); + + FORGET_Frame(); + + ccpf1->ChainPosRuleSet = NULL; + + if ( ALLOC_ARRAY( ccpf1->ChainPosRuleSet, count, HB_ChainPosRuleSet ) ) + goto Fail2; + + cprs = ccpf1->ChainPosRuleSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_ChainPosRuleSet( &cprs[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_ChainPosRuleSet( &cprs[m] ); + + FREE( cprs ); + +Fail2: + _HB_OPEN_Free_Coverage( &ccpf1->Coverage ); + return error; +} + + +static void Free_ChainContextPos1( HB_ChainContextPosFormat1* ccpf1 ) +{ + HB_UShort n, count; + + HB_ChainPosRuleSet* cprs; + + + if ( ccpf1->ChainPosRuleSet ) + { + count = ccpf1->ChainPosRuleSetCount; + cprs = ccpf1->ChainPosRuleSet; + + for ( n = 0; n < count; n++ ) + Free_ChainPosRuleSet( &cprs[n] ); + + FREE( cprs ); + } + + _HB_OPEN_Free_Coverage( &ccpf1->Coverage ); +} + + +/* ChainPosClassRule */ + +static HB_Error Load_ChainPosClassRule( + HB_ChainContextPosFormat2* ccpf2, + HB_ChainPosClassRule* cpcr, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_UShort* b; + HB_UShort* i; + HB_UShort* l; + HB_PosLookupRecord* plr; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + cpcr->BacktrackGlyphCount = GET_UShort(); + + FORGET_Frame(); + + if ( cpcr->BacktrackGlyphCount > ccpf2->MaxBacktrackLength ) + ccpf2->MaxBacktrackLength = cpcr->BacktrackGlyphCount; + + cpcr->Backtrack = NULL; + + count = cpcr->BacktrackGlyphCount; + + if ( ALLOC_ARRAY( cpcr->Backtrack, count, HB_UShort ) ) + return error; + + b = cpcr->Backtrack; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail4; + + for ( n = 0; n < count; n++ ) + b[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + cpcr->InputGlyphCount = GET_UShort(); + + if ( cpcr->InputGlyphCount > ccpf2->MaxInputLength ) + ccpf2->MaxInputLength = cpcr->InputGlyphCount; + + FORGET_Frame(); + + cpcr->Input = NULL; + + count = cpcr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */ + + if ( ALLOC_ARRAY( cpcr->Input, count, HB_UShort ) ) + goto Fail4; + + i = cpcr->Input; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail3; + + for ( n = 0; n < count; n++ ) + i[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + cpcr->LookaheadGlyphCount = GET_UShort(); + + FORGET_Frame(); + + if ( cpcr->LookaheadGlyphCount > ccpf2->MaxLookaheadLength ) + ccpf2->MaxLookaheadLength = cpcr->LookaheadGlyphCount; + + cpcr->Lookahead = NULL; + + count = cpcr->LookaheadGlyphCount; + + if ( ALLOC_ARRAY( cpcr->Lookahead, count, HB_UShort ) ) + goto Fail3; + + l = cpcr->Lookahead; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail2; + + for ( n = 0; n < count; n++ ) + l[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + cpcr->PosCount = GET_UShort(); + + FORGET_Frame(); + + cpcr->PosLookupRecord = NULL; + + count = cpcr->PosCount; + + if ( ALLOC_ARRAY( cpcr->PosLookupRecord, count, HB_PosLookupRecord ) ) + goto Fail2; + + plr = cpcr->PosLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + plr[n].SequenceIndex = GET_UShort(); + plr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( plr ); + +Fail2: + FREE( l ); + +Fail3: + FREE( i ); + +Fail4: + FREE( b ); + return error; +} + + +static void Free_ChainPosClassRule( HB_ChainPosClassRule* cpcr ) +{ + FREE( cpcr->PosLookupRecord ); + FREE( cpcr->Lookahead ); + FREE( cpcr->Input ); + FREE( cpcr->Backtrack ); +} + + +/* PosClassSet */ + +static HB_Error Load_ChainPosClassSet( + HB_ChainContextPosFormat2* ccpf2, + HB_ChainPosClassSet* cpcs, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ChainPosClassRule* cpcr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = cpcs->ChainPosClassRuleCount = GET_UShort(); + + FORGET_Frame(); + + cpcs->ChainPosClassRule = NULL; + + if ( ALLOC_ARRAY( cpcs->ChainPosClassRule, count, + HB_ChainPosClassRule ) ) + return error; + + cpcr = cpcs->ChainPosClassRule; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_ChainPosClassRule( ccpf2, &cpcr[n], + stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_ChainPosClassRule( &cpcr[m] ); + + FREE( cpcr ); + return error; +} + + +static void Free_ChainPosClassSet( HB_ChainPosClassSet* cpcs ) +{ + HB_UShort n, count; + + HB_ChainPosClassRule* cpcr; + + + if ( cpcs->ChainPosClassRule ) + { + count = cpcs->ChainPosClassRuleCount; + cpcr = cpcs->ChainPosClassRule; + + for ( n = 0; n < count; n++ ) + Free_ChainPosClassRule( &cpcr[n] ); + + FREE( cpcr ); + } +} + + +/* ChainContextPosFormat2 */ + +static HB_Error Load_ChainContextPos2( HB_ChainContextPosFormat2* ccpf2, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + HB_UInt backtrack_offset, input_offset, lookahead_offset; + + HB_ChainPosClassSet* cpcs; + + + base_offset = FILE_Pos() - 2; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &ccpf2->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 8L ) ) + goto Fail5; + + backtrack_offset = GET_UShort(); + input_offset = GET_UShort(); + lookahead_offset = GET_UShort(); + + /* `ChainPosClassSetCount' is the upper limit for input class values, + thus we read it now to make an additional safety check. No limit + is known or needed for the other two class definitions */ + + count = ccpf2->ChainPosClassSetCount = GET_UShort(); + + FORGET_Frame(); + + if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->BacktrackClassDef, 65535, + backtrack_offset, base_offset, + stream ) ) != HB_Err_Ok ) + goto Fail5; + if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->InputClassDef, count, + input_offset, base_offset, + stream ) ) != HB_Err_Ok ) + goto Fail4; + if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->LookaheadClassDef, 65535, + lookahead_offset, base_offset, + stream ) ) != HB_Err_Ok ) + goto Fail3; + + ccpf2->ChainPosClassSet = NULL; + ccpf2->MaxBacktrackLength = 0; + ccpf2->MaxInputLength = 0; + ccpf2->MaxLookaheadLength = 0; + + if ( ALLOC_ARRAY( ccpf2->ChainPosClassSet, count, HB_ChainPosClassSet ) ) + goto Fail2; + + cpcs = ccpf2->ChainPosClassSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + if ( new_offset != base_offset ) /* not a NULL offset */ + { + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_ChainPosClassSet( ccpf2, &cpcs[n], + stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + else + { + /* we create a ChainPosClassSet table with no entries */ + + ccpf2->ChainPosClassSet[n].ChainPosClassRuleCount = 0; + ccpf2->ChainPosClassSet[n].ChainPosClassRule = NULL; + } + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_ChainPosClassSet( &cpcs[m] ); + + FREE( cpcs ); + +Fail2: + _HB_OPEN_Free_ClassDefinition( &ccpf2->LookaheadClassDef ); + +Fail3: + _HB_OPEN_Free_ClassDefinition( &ccpf2->InputClassDef ); + +Fail4: + _HB_OPEN_Free_ClassDefinition( &ccpf2->BacktrackClassDef ); + +Fail5: + _HB_OPEN_Free_Coverage( &ccpf2->Coverage ); + return error; +} + + +static void Free_ChainContextPos2( HB_ChainContextPosFormat2* ccpf2 ) +{ + HB_UShort n, count; + + HB_ChainPosClassSet* cpcs; + + + if ( ccpf2->ChainPosClassSet ) + { + count = ccpf2->ChainPosClassSetCount; + cpcs = ccpf2->ChainPosClassSet; + + for ( n = 0; n < count; n++ ) + Free_ChainPosClassSet( &cpcs[n] ); + + FREE( cpcs ); + } + + _HB_OPEN_Free_ClassDefinition( &ccpf2->LookaheadClassDef ); + _HB_OPEN_Free_ClassDefinition( &ccpf2->InputClassDef ); + _HB_OPEN_Free_ClassDefinition( &ccpf2->BacktrackClassDef ); + + _HB_OPEN_Free_Coverage( &ccpf2->Coverage ); +} + + +/* ChainContextPosFormat3 */ + +static HB_Error Load_ChainContextPos3( HB_ChainContextPosFormat3* ccpf3, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, nb, ni, nl, m, count; + HB_UShort backtrack_count, input_count, lookahead_count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Coverage* b; + HB_Coverage* i; + HB_Coverage* l; + HB_PosLookupRecord* plr; + + + base_offset = FILE_Pos() - 2L; + + if ( ACCESS_Frame( 2L ) ) + return error; + + ccpf3->BacktrackGlyphCount = GET_UShort(); + + FORGET_Frame(); + + ccpf3->BacktrackCoverage = NULL; + + backtrack_count = ccpf3->BacktrackGlyphCount; + + if ( ALLOC_ARRAY( ccpf3->BacktrackCoverage, backtrack_count, + HB_Coverage ) ) + return error; + + b = ccpf3->BacktrackCoverage; + + for ( nb = 0; nb < backtrack_count; nb++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok ) + goto Fail4; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + ccpf3->InputGlyphCount = GET_UShort(); + + FORGET_Frame(); + + ccpf3->InputCoverage = NULL; + + input_count = ccpf3->InputGlyphCount; + + if ( ALLOC_ARRAY( ccpf3->InputCoverage, input_count, HB_Coverage ) ) + goto Fail4; + + i = ccpf3->InputCoverage; + + for ( ni = 0; ni < input_count; ni++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &i[ni], stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + ccpf3->LookaheadGlyphCount = GET_UShort(); + + FORGET_Frame(); + + ccpf3->LookaheadCoverage = NULL; + + lookahead_count = ccpf3->LookaheadGlyphCount; + + if ( ALLOC_ARRAY( ccpf3->LookaheadCoverage, lookahead_count, + HB_Coverage ) ) + goto Fail3; + + l = ccpf3->LookaheadCoverage; + + for ( nl = 0; nl < lookahead_count; nl++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + ccpf3->PosCount = GET_UShort(); + + FORGET_Frame(); + + ccpf3->PosLookupRecord = NULL; + + count = ccpf3->PosCount; + + if ( ALLOC_ARRAY( ccpf3->PosLookupRecord, count, HB_PosLookupRecord ) ) + goto Fail2; + + plr = ccpf3->PosLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + plr[n].SequenceIndex = GET_UShort(); + plr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( plr ); + +Fail2: + for ( m = 0; m < nl; m++ ) + _HB_OPEN_Free_Coverage( &l[m] ); + + FREE( l ); + +Fail3: + for ( m = 0; m < ni; m++ ) + _HB_OPEN_Free_Coverage( &i[m] ); + + FREE( i ); + +Fail4: + for ( m = 0; m < nb; m++ ) + _HB_OPEN_Free_Coverage( &b[m] ); + + FREE( b ); + return error; +} + + +static void Free_ChainContextPos3( HB_ChainContextPosFormat3* ccpf3 ) +{ + HB_UShort n, count; + + HB_Coverage* c; + + + FREE( ccpf3->PosLookupRecord ); + + if ( ccpf3->LookaheadCoverage ) + { + count = ccpf3->LookaheadGlyphCount; + c = ccpf3->LookaheadCoverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } + + if ( ccpf3->InputCoverage ) + { + count = ccpf3->InputGlyphCount; + c = ccpf3->InputCoverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } + + if ( ccpf3->BacktrackCoverage ) + { + count = ccpf3->BacktrackGlyphCount; + c = ccpf3->BacktrackCoverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } +} + + +/* ChainContextPos */ + +static HB_Error Load_ChainContextPos( HB_GPOS_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_ChainContextPos* ccp = &st->chain; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + ccp->PosFormat = GET_UShort(); + + FORGET_Frame(); + + switch ( ccp->PosFormat ) + { + case 1: + return Load_ChainContextPos1( &ccp->ccpf.ccpf1, stream ); + + case 2: + return Load_ChainContextPos2( &ccp->ccpf.ccpf2, stream ); + + case 3: + return Load_ChainContextPos3( &ccp->ccpf.ccpf3, stream ); + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + +static void Free_ChainContextPos( HB_GPOS_SubTable* st ) +{ + HB_ChainContextPos* ccp = &st->chain; + + switch ( ccp->PosFormat ) + { + case 1: Free_ChainContextPos1( &ccp->ccpf.ccpf1 ); break; + case 2: Free_ChainContextPos2( &ccp->ccpf.ccpf2 ); break; + case 3: Free_ChainContextPos3( &ccp->ccpf.ccpf3 ); break; + default: break; + } +} + + +static HB_Error Lookup_ChainContextPos1( + GPOS_Instance* gpi, + HB_ChainContextPosFormat1* ccpf1, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_UShort i, j, k, num_cpr; + HB_UShort bgc, igc, lgc; + HB_Error error; + HB_GPOSHeader* gpos = gpi->gpos; + + HB_ChainPosRule* cpr; + HB_ChainPosRule curr_cpr; + HB_GDEFHeader* gdef; + + + gdef = gpos->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &ccpf1->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + cpr = ccpf1->ChainPosRuleSet[index].ChainPosRule; + num_cpr = ccpf1->ChainPosRuleSet[index].ChainPosRuleCount; + + for ( k = 0; k < num_cpr; k++ ) + { + curr_cpr = cpr[k]; + bgc = curr_cpr.BacktrackGlyphCount; + igc = curr_cpr.InputGlyphCount; + lgc = curr_cpr.LookaheadGlyphCount; + + if ( context_length != 0xFFFF && context_length < igc ) + goto next_chainposrule; + + /* check whether context is too long; it is a first guess only */ + + if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length ) + goto next_chainposrule; + + if ( bgc ) + { + /* Since we don't know in advance the number of glyphs to inspect, + we search backwards for matches in the backtrack glyph array */ + + for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + 1 == bgc - i ) + goto next_chainposrule; + j--; + } + + /* In OpenType 1.3, it is undefined whether the offsets of + backtrack glyphs is in logical order or not. Version 1.4 + will clarify this: + + Logical order - a b c d e f g h i j + i + Input offsets - 0 1 + Backtrack offsets - 3 2 1 0 + Lookahead offsets - 0 1 2 3 */ + + if ( IN_GLYPH( j ) != curr_cpr.Backtrack[i] ) + goto next_chainposrule; + } + } + + /* Start at 1 because [0] is implied */ + + for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) + goto next_chainposrule; + j++; + } + + if ( IN_GLYPH( j ) != curr_cpr.Input[i - 1] ) + goto next_chainposrule; + } + + /* we are starting to check for lookahead glyphs right after the + last context glyph */ + + for ( i = 0; i < lgc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + lgc - i == (HB_Int)buffer->in_length ) + goto next_chainposrule; + j++; + } + + if ( IN_GLYPH( j ) != curr_cpr.Lookahead[i] ) + goto next_chainposrule; + } + + return Do_ContextPos( gpi, igc, + curr_cpr.PosCount, + curr_cpr.PosLookupRecord, + buffer, + nesting_level ); + + next_chainposrule: + ; + } + + return HB_Err_Not_Covered; +} + + +static HB_Error Lookup_ChainContextPos2( + GPOS_Instance* gpi, + HB_ChainContextPosFormat2* ccpf2, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_Error error; + HB_UShort i, j, k; + HB_UShort bgc, igc, lgc; + HB_UShort known_backtrack_classes, + known_input_classes, + known_lookahead_classes; + + HB_UShort* backtrack_classes; + HB_UShort* input_classes; + HB_UShort* lookahead_classes; + + HB_UShort* bc; + HB_UShort* ic; + HB_UShort* lc; + HB_GPOSHeader* gpos = gpi->gpos; + + HB_ChainPosClassSet* cpcs; + HB_ChainPosClassRule cpcr; + HB_GDEFHeader* gdef; + + + gdef = gpos->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + /* Note: The coverage table in format 2 doesn't give an index into + anything. It just lets us know whether or not we need to + do any lookup at all. */ + + error = _HB_OPEN_Coverage_Index( &ccpf2->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + if ( ALLOC_ARRAY( backtrack_classes, ccpf2->MaxBacktrackLength, HB_UShort ) ) + return error; + known_backtrack_classes = 0; + + if (ccpf2->MaxInputLength < 1) + return HB_Err_Not_Covered; + + if ( ALLOC_ARRAY( input_classes, ccpf2->MaxInputLength, HB_UShort ) ) + goto End3; + known_input_classes = 1; + + if ( ALLOC_ARRAY( lookahead_classes, ccpf2->MaxLookaheadLength, HB_UShort ) ) + goto End2; + known_lookahead_classes = 0; + + error = _HB_OPEN_Get_Class( &ccpf2->InputClassDef, IN_CURGLYPH(), + &input_classes[0], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End1; + + cpcs = &ccpf2->ChainPosClassSet[input_classes[0]]; + if ( !cpcs ) + { + error = ERR(HB_Err_Invalid_SubTable); + goto End1; + } + + for ( k = 0; k < cpcs->ChainPosClassRuleCount; k++ ) + { + cpcr = cpcs->ChainPosClassRule[k]; + bgc = cpcr.BacktrackGlyphCount; + igc = cpcr.InputGlyphCount; + lgc = cpcr.LookaheadGlyphCount; + + if ( context_length != 0xFFFF && context_length < igc ) + goto next_chainposclassrule; + + /* check whether context is too long; it is a first guess only */ + + if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length ) + goto next_chainposclassrule; + + if ( bgc ) + { + /* Since we don't know in advance the number of glyphs to inspect, + we search backwards for matches in the backtrack glyph array. + Note that `known_backtrack_classes' starts at index 0. */ + + bc = cpcr.Backtrack; + + for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + goto End1; + + if ( j + 1 == bgc - i ) + goto next_chainposclassrule; + j++; + } + + if ( i >= known_backtrack_classes ) + { + /* Keeps us from having to do this for each rule */ + + error = _HB_OPEN_Get_Class( &ccpf2->BacktrackClassDef, IN_GLYPH( j ), + &backtrack_classes[i], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End1; + known_backtrack_classes = i; + } + + if ( bc[i] != backtrack_classes[i] ) + goto next_chainposclassrule; + } + } + + ic = cpcr.Input; + + /* Start at 1 because [0] is implied */ + + for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + goto End1; + + if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) + goto next_chainposclassrule; + j++; + } + + if ( i >= known_input_classes ) + { + error = _HB_OPEN_Get_Class( &ccpf2->InputClassDef, IN_GLYPH( j ), + &input_classes[i], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End1; + known_input_classes = i; + } + + if ( ic[i - 1] != input_classes[i] ) + goto next_chainposclassrule; + } + + /* we are starting to check for lookahead glyphs right after the + last context glyph */ + + lc = cpcr.Lookahead; + + for ( i = 0; i < lgc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + goto End1; + + if ( j + lgc - i == (HB_Int)buffer->in_length ) + goto next_chainposclassrule; + j++; + } + + if ( i >= known_lookahead_classes ) + { + error = _HB_OPEN_Get_Class( &ccpf2->LookaheadClassDef, IN_GLYPH( j ), + &lookahead_classes[i], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End1; + known_lookahead_classes = i; + } + + if ( lc[i] != lookahead_classes[i] ) + goto next_chainposclassrule; + } + + error = Do_ContextPos( gpi, igc, + cpcr.PosCount, + cpcr.PosLookupRecord, + buffer, + nesting_level ); + goto End1; + + next_chainposclassrule: + ; + } + + error = HB_Err_Not_Covered; + +End1: + FREE( lookahead_classes ); + +End2: + FREE( input_classes ); + +End3: + FREE( backtrack_classes ); + return error; +} + + +static HB_Error Lookup_ChainContextPos3( + GPOS_Instance* gpi, + HB_ChainContextPosFormat3* ccpf3, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, i, j, property; + HB_UShort bgc, igc, lgc; + HB_Error error; + HB_GPOSHeader* gpos = gpi->gpos; + + HB_Coverage* bc; + HB_Coverage* ic; + HB_Coverage* lc; + HB_GDEFHeader* gdef; + + + gdef = gpos->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + bgc = ccpf3->BacktrackGlyphCount; + igc = ccpf3->InputGlyphCount; + lgc = ccpf3->LookaheadGlyphCount; + + if ( context_length != 0xFFFF && context_length < igc ) + return HB_Err_Not_Covered; + + /* check whether context is too long; it is a first guess only */ + + if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length ) + return HB_Err_Not_Covered; + + if ( bgc ) + { + /* Since we don't know in advance the number of glyphs to inspect, + we search backwards for matches in the backtrack glyph array */ + + bc = ccpf3->BacktrackCoverage; + + for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + 1 == bgc - i ) + return HB_Err_Not_Covered; + j--; + } + + error = _HB_OPEN_Coverage_Index( &bc[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + } + + ic = ccpf3->InputCoverage; + + for ( i = 0, j = buffer->in_pos; i < igc; i++, j++ ) + { + /* We already called CHECK_Property for IN_GLYPH ( buffer->in_pos ) */ + while ( j > buffer->in_pos && CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) + return HB_Err_Not_Covered; + j++; + } + + error = _HB_OPEN_Coverage_Index( &ic[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + + /* we are starting to check for lookahead glyphs right after the + last context glyph */ + + lc = ccpf3->LookaheadCoverage; + + for ( i = 0; i < lgc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + lgc - i == (HB_Int)buffer->in_length ) + return HB_Err_Not_Covered; + j++; + } + + error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + + return Do_ContextPos( gpi, igc, + ccpf3->PosCount, + ccpf3->PosLookupRecord, + buffer, + nesting_level ); +} + + +static HB_Error Lookup_ChainContextPos( + GPOS_Instance* gpi, + HB_GPOS_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_ChainContextPos* ccp = &st->chain; + + switch ( ccp->PosFormat ) + { + case 1: + return Lookup_ChainContextPos1( gpi, &ccp->ccpf.ccpf1, buffer, + flags, context_length, + nesting_level ); + + case 2: + return Lookup_ChainContextPos2( gpi, &ccp->ccpf.ccpf2, buffer, + flags, context_length, + nesting_level ); + + case 3: + return Lookup_ChainContextPos3( gpi, &ccp->ccpf.ccpf3, buffer, + flags, context_length, + nesting_level ); + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + + +/*********** + * GPOS API + ***********/ + + + +HB_Error HB_GPOS_Select_Script( HB_GPOSHeader* gpos, + HB_UInt script_tag, + HB_UShort* script_index ) +{ + HB_UShort n; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + + + if ( !gpos || !script_index ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gpos->ScriptList; + sr = sl->ScriptRecord; + + for ( n = 0; n < sl->ScriptCount; n++ ) + if ( script_tag == sr[n].ScriptTag ) + { + *script_index = n; + + return HB_Err_Ok; + } + + return HB_Err_Not_Covered; +} + + + +HB_Error HB_GPOS_Select_Language( HB_GPOSHeader* gpos, + HB_UInt language_tag, + HB_UShort script_index, + HB_UShort* language_index, + HB_UShort* req_feature_index ) +{ + HB_UShort n; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + HB_ScriptTable* s; + HB_LangSysRecord* lsr; + + + if ( !gpos || !language_index || !req_feature_index ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gpos->ScriptList; + sr = sl->ScriptRecord; + + if ( script_index >= sl->ScriptCount ) + return ERR(HB_Err_Invalid_Argument); + + s = &sr[script_index].Script; + lsr = s->LangSysRecord; + + for ( n = 0; n < s->LangSysCount; n++ ) + if ( language_tag == lsr[n].LangSysTag ) + { + *language_index = n; + *req_feature_index = lsr[n].LangSys.ReqFeatureIndex; + + return HB_Err_Ok; + } + + return HB_Err_Not_Covered; +} + + +/* selecting 0xFFFF for language_index asks for the values of the + default language (DefaultLangSys) */ + + +HB_Error HB_GPOS_Select_Feature( HB_GPOSHeader* gpos, + HB_UInt feature_tag, + HB_UShort script_index, + HB_UShort language_index, + HB_UShort* feature_index ) +{ + HB_UShort n; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + HB_ScriptTable* s; + HB_LangSysRecord* lsr; + HB_LangSys* ls; + HB_UShort* fi; + + HB_FeatureList* fl; + HB_FeatureRecord* fr; + + + if ( !gpos || !feature_index ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gpos->ScriptList; + sr = sl->ScriptRecord; + + fl = &gpos->FeatureList; + fr = fl->FeatureRecord; + + if ( script_index >= sl->ScriptCount ) + return ERR(HB_Err_Invalid_Argument); + + s = &sr[script_index].Script; + lsr = s->LangSysRecord; + + if ( language_index == 0xFFFF ) + ls = &s->DefaultLangSys; + else + { + if ( language_index >= s->LangSysCount ) + return ERR(HB_Err_Invalid_Argument); + + ls = &lsr[language_index].LangSys; + } + + fi = ls->FeatureIndex; + + for ( n = 0; n < ls->FeatureCount; n++ ) + { + if ( fi[n] >= fl->FeatureCount ) + return ERR(HB_Err_Invalid_SubTable_Format); + + if ( feature_tag == fr[fi[n]].FeatureTag ) + { + *feature_index = fi[n]; + + return HB_Err_Ok; + } + } + + return HB_Err_Not_Covered; +} + + +/* The next three functions return a null-terminated list */ + + +HB_Error HB_GPOS_Query_Scripts( HB_GPOSHeader* gpos, + HB_UInt** script_tag_list ) +{ + HB_Error error; + HB_UShort n; + HB_UInt* stl; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + + + if ( !gpos || !script_tag_list ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gpos->ScriptList; + sr = sl->ScriptRecord; + + if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, HB_UInt ) ) + return error; + + for ( n = 0; n < sl->ScriptCount; n++ ) + stl[n] = sr[n].ScriptTag; + stl[n] = 0; + + *script_tag_list = stl; + + return HB_Err_Ok; +} + + + +HB_Error HB_GPOS_Query_Languages( HB_GPOSHeader* gpos, + HB_UShort script_index, + HB_UInt** language_tag_list ) +{ + HB_Error error; + HB_UShort n; + HB_UInt* ltl; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + HB_ScriptTable* s; + HB_LangSysRecord* lsr; + + + if ( !gpos || !language_tag_list ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gpos->ScriptList; + sr = sl->ScriptRecord; + + if ( script_index >= sl->ScriptCount ) + return ERR(HB_Err_Invalid_Argument); + + s = &sr[script_index].Script; + lsr = s->LangSysRecord; + + if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, HB_UInt ) ) + return error; + + for ( n = 0; n < s->LangSysCount; n++ ) + ltl[n] = lsr[n].LangSysTag; + ltl[n] = 0; + + *language_tag_list = ltl; + + return HB_Err_Ok; +} + + +/* selecting 0xFFFF for language_index asks for the values of the + default language (DefaultLangSys) */ + + +HB_Error HB_GPOS_Query_Features( HB_GPOSHeader* gpos, + HB_UShort script_index, + HB_UShort language_index, + HB_UInt** feature_tag_list ) +{ + HB_UShort n; + HB_Error error; + HB_UInt* ftl; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + HB_ScriptTable* s; + HB_LangSysRecord* lsr; + HB_LangSys* ls; + HB_UShort* fi; + + HB_FeatureList* fl; + HB_FeatureRecord* fr; + + + if ( !gpos || !feature_tag_list ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gpos->ScriptList; + sr = sl->ScriptRecord; + + fl = &gpos->FeatureList; + fr = fl->FeatureRecord; + + if ( script_index >= sl->ScriptCount ) + return ERR(HB_Err_Invalid_Argument); + + s = &sr[script_index].Script; + lsr = s->LangSysRecord; + + if ( language_index == 0xFFFF ) + ls = &s->DefaultLangSys; + else + { + if ( language_index >= s->LangSysCount ) + return ERR(HB_Err_Invalid_Argument); + + ls = &lsr[language_index].LangSys; + } + + fi = ls->FeatureIndex; + + if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, HB_UInt ) ) + return error; + + for ( n = 0; n < ls->FeatureCount; n++ ) + { + if ( fi[n] >= fl->FeatureCount ) + { + FREE( ftl ); + return ERR(HB_Err_Invalid_SubTable_Format); + } + ftl[n] = fr[fi[n]].FeatureTag; + } + ftl[n] = 0; + + *feature_tag_list = ftl; + + return HB_Err_Ok; +} + + +/* Do an individual subtable lookup. Returns HB_Err_Ok if positioning + has been done, or HB_Err_Not_Covered if not. */ +static HB_Error GPOS_Do_Glyph_Lookup( GPOS_Instance* gpi, + HB_UShort lookup_index, + HB_Buffer buffer, + HB_UShort context_length, + int nesting_level ) +{ + HB_Error error = HB_Err_Not_Covered; + HB_UShort i, flags, lookup_count; + HB_GPOSHeader* gpos = gpi->gpos; + HB_Lookup* lo; + int lookup_type; + + + nesting_level++; + + if ( nesting_level > HB_MAX_NESTING_LEVEL ) + return ERR(HB_Err_Not_Covered); /* ERR() call intended */ + + lookup_count = gpos->LookupList.LookupCount; + if (lookup_index >= lookup_count) + return error; + + lo = &gpos->LookupList.Lookup[lookup_index]; + flags = lo->LookupFlag; + lookup_type = lo->LookupType; + + for ( i = 0; i < lo->SubTableCount; i++ ) + { + HB_GPOS_SubTable *st = &lo->SubTable[i].st.gpos; + + switch (lookup_type) { + case HB_GPOS_LOOKUP_SINGLE: + error = Lookup_SinglePos ( gpi, st, buffer, flags, context_length, nesting_level ); break; + case HB_GPOS_LOOKUP_PAIR: + error = Lookup_PairPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; + case HB_GPOS_LOOKUP_CURSIVE: + error = Lookup_CursivePos ( gpi, st, buffer, flags, context_length, nesting_level ); break; + case HB_GPOS_LOOKUP_MARKBASE: + error = Lookup_MarkBasePos ( gpi, st, buffer, flags, context_length, nesting_level ); break; + case HB_GPOS_LOOKUP_MARKLIG: + error = Lookup_MarkLigPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; + case HB_GPOS_LOOKUP_MARKMARK: + error = Lookup_MarkMarkPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; + case HB_GPOS_LOOKUP_CONTEXT: + error = Lookup_ContextPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; + case HB_GPOS_LOOKUP_CHAIN: + error = Lookup_ChainContextPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; + /*case HB_GPOS_LOOKUP_EXTENSION: + error = Lookup_ExtensionPos ( gpi, st, buffer, flags, context_length, nesting_level ); break;*/ + default: + error = HB_Err_Not_Covered; + } + + /* Check whether we have a successful positioning or an error other + than HB_Err_Not_Covered */ + if ( error != HB_Err_Not_Covered ) + return error; + } + + return HB_Err_Not_Covered; +} + + +HB_INTERNAL HB_Error +_HB_GPOS_Load_SubTable( HB_GPOS_SubTable* st, + HB_Stream stream, + HB_UShort lookup_type ) +{ + switch ( lookup_type ) { + case HB_GPOS_LOOKUP_SINGLE: return Load_SinglePos ( st, stream ); + case HB_GPOS_LOOKUP_PAIR: return Load_PairPos ( st, stream ); + case HB_GPOS_LOOKUP_CURSIVE: return Load_CursivePos ( st, stream ); + case HB_GPOS_LOOKUP_MARKBASE: return Load_MarkBasePos ( st, stream ); + case HB_GPOS_LOOKUP_MARKLIG: return Load_MarkLigPos ( st, stream ); + case HB_GPOS_LOOKUP_MARKMARK: return Load_MarkMarkPos ( st, stream ); + case HB_GPOS_LOOKUP_CONTEXT: return Load_ContextPos ( st, stream ); + case HB_GPOS_LOOKUP_CHAIN: return Load_ChainContextPos ( st, stream ); + /*case HB_GPOS_LOOKUP_EXTENSION: return Load_ExtensionPos ( st, stream );*/ + default: return ERR(HB_Err_Invalid_SubTable_Format); + } +} + + +HB_INTERNAL void +_HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st, + HB_UShort lookup_type ) +{ + switch ( lookup_type ) { + case HB_GPOS_LOOKUP_SINGLE: Free_SinglePos ( st ); return; + case HB_GPOS_LOOKUP_PAIR: Free_PairPos ( st ); return; + case HB_GPOS_LOOKUP_CURSIVE: Free_CursivePos ( st ); return; + case HB_GPOS_LOOKUP_MARKBASE: Free_MarkBasePos ( st ); return; + case HB_GPOS_LOOKUP_MARKLIG: Free_MarkLigPos ( st ); return; + case HB_GPOS_LOOKUP_MARKMARK: Free_MarkMarkPos ( st ); return; + case HB_GPOS_LOOKUP_CONTEXT: Free_ContextPos ( st ); return; + case HB_GPOS_LOOKUP_CHAIN: Free_ChainContextPos ( st ); return; + /*case HB_GPOS_LOOKUP_EXTENSION: Free_ExtensionPos ( st ); return;*/ + default: return; + } +} + + +/* apply one lookup to the input string object */ + +static HB_Error GPOS_Do_String_Lookup( GPOS_Instance* gpi, + HB_UShort lookup_index, + HB_Buffer buffer ) +{ + HB_Error error, retError = HB_Err_Not_Covered; + HB_GPOSHeader* gpos = gpi->gpos; + + HB_UInt* properties = gpos->LookupList.Properties; + + const int nesting_level = 0; + /* 0xFFFF indicates that we don't have a context length yet */ + const HB_UShort context_length = 0xFFFF; + + + gpi->last = 0xFFFF; /* no last valid glyph for cursive pos. */ + + buffer->in_pos = 0; + while ( buffer->in_pos < buffer->in_length ) + { + if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] ) + { + /* Note that the connection between mark and base glyphs hold + exactly one (string) lookup. For example, it would be possible + that in the first lookup, mark glyph X is attached to base + glyph A, and in the next lookup it is attached to base glyph B. + It is up to the font designer to provide meaningful lookups and + lookup order. */ + + error = GPOS_Do_Glyph_Lookup( gpi, lookup_index, buffer, context_length, nesting_level ); + if ( error && error != HB_Err_Not_Covered ) + return error; + } + else + { + /* Contrary to properties defined in GDEF, user-defined properties + will always stop a possible cursive positioning. */ + gpi->last = 0xFFFF; + + error = HB_Err_Not_Covered; + } + + if ( error == HB_Err_Not_Covered ) + (buffer->in_pos)++; + else + retError = error; + } + + return retError; +} + + +static HB_Error Position_CursiveChain ( HB_Buffer buffer ) +{ + HB_UInt i, j; + HB_Position positions = buffer->positions; + + /* First handle all left-to-right connections */ + for (j = 0; j < buffer->in_length; j++) + { + if (positions[j].cursive_chain > 0) + positions[j].y_pos += positions[j - positions[j].cursive_chain].y_pos; + } + + /* Then handle all right-to-left connections */ + for (i = buffer->in_length; i > 0; i--) + { + j = i - 1; + + if (positions[j].cursive_chain < 0) + positions[j].y_pos += positions[j - positions[j].cursive_chain].y_pos; + } + + return HB_Err_Ok; +} + + +HB_Error HB_GPOS_Add_Feature( HB_GPOSHeader* gpos, + HB_UShort feature_index, + HB_UInt property ) +{ + HB_UShort i; + + HB_Feature feature; + HB_UInt* properties; + HB_UShort* index; + HB_UShort lookup_count; + + /* Each feature can only be added once */ + + if ( !gpos || + feature_index >= gpos->FeatureList.FeatureCount || + gpos->FeatureList.ApplyCount == gpos->FeatureList.FeatureCount ) + return ERR(HB_Err_Invalid_Argument); + + gpos->FeatureList.ApplyOrder[gpos->FeatureList.ApplyCount++] = feature_index; + + properties = gpos->LookupList.Properties; + + feature = gpos->FeatureList.FeatureRecord[feature_index].Feature; + index = feature.LookupListIndex; + lookup_count = gpos->LookupList.LookupCount; + + for ( i = 0; i < feature.LookupListCount; i++ ) + { + HB_UShort lookup_index = index[i]; + if (lookup_index < lookup_count) + properties[lookup_index] |= property; + } + + return HB_Err_Ok; +} + + + +HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos ) +{ + HB_UShort i; + + HB_UInt* properties; + + + if ( !gpos ) + return ERR(HB_Err_Invalid_Argument); + + gpos->FeatureList.ApplyCount = 0; + + properties = gpos->LookupList.Properties; + + for ( i = 0; i < gpos->LookupList.LookupCount; i++ ) + properties[i] = 0; + + return HB_Err_Ok; +} + +#ifdef HB_SUPPORT_MULTIPLE_MASTER +HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos, + HB_MMFunction mmfunc, + void* data ) +{ + if ( !gpos ) + return ERR(HB_Err_Invalid_Argument); + + gpos->mmfunc = mmfunc; + gpos->data = data; + + return HB_Err_Ok; +} +#endif + +/* If `dvi' is TRUE, glyph contour points for anchor points and device + tables are ignored -- you will get device independent values. */ + + +HB_Error HB_GPOS_Apply_String( HB_Font font, + HB_GPOSHeader* gpos, + HB_UShort load_flags, + HB_Buffer buffer, + HB_Bool dvi, + HB_Bool r2l ) +{ + HB_Error error, retError = HB_Err_Not_Covered; + GPOS_Instance gpi; + int i, j, lookup_count, num_features; + + if ( !font || !gpos || !buffer ) + return ERR(HB_Err_Invalid_Argument); + + if ( buffer->in_length == 0 ) + return HB_Err_Not_Covered; + + gpi.font = font; + gpi.gpos = gpos; + gpi.load_flags = load_flags; + gpi.r2l = r2l; + gpi.dvi = dvi; + + lookup_count = gpos->LookupList.LookupCount; + num_features = gpos->FeatureList.ApplyCount; + + if ( num_features ) + { + error = _hb_buffer_clear_positions( buffer ); + if ( error ) + return error; + } + + for ( i = 0; i < num_features; i++ ) + { + HB_UShort feature_index = gpos->FeatureList.ApplyOrder[i]; + HB_Feature feature = gpos->FeatureList.FeatureRecord[feature_index].Feature; + + for ( j = 0; j < feature.LookupListCount; j++ ) + { + HB_UShort lookup_index = feature.LookupListIndex[j]; + + /* Skip nonexistant lookups */ + if (lookup_index >= lookup_count) + continue; + + error = GPOS_Do_String_Lookup( &gpi, lookup_index, buffer ); + if ( error ) + { + if ( error != HB_Err_Not_Covered ) + return error; + } + else + retError = error; + } + } + + if ( num_features ) + { + error = Position_CursiveChain ( buffer ); + if ( error ) + return error; + } + + return retError; +} + +/* END */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h new file mode 100644 index 0000000000..92bff84a94 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gpos.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_GPOS_H +#define HARFBUZZ_GPOS_H + +#include "harfbuzz-gdef.h" +#include "harfbuzz-buffer.h" + +HB_BEGIN_HEADER + + +/* Lookup types for glyph positioning */ + +#define HB_GPOS_LOOKUP_SINGLE 1 +#define HB_GPOS_LOOKUP_PAIR 2 +#define HB_GPOS_LOOKUP_CURSIVE 3 +#define HB_GPOS_LOOKUP_MARKBASE 4 +#define HB_GPOS_LOOKUP_MARKLIG 5 +#define HB_GPOS_LOOKUP_MARKMARK 6 +#define HB_GPOS_LOOKUP_CONTEXT 7 +#define HB_GPOS_LOOKUP_CHAIN 8 +#define HB_GPOS_LOOKUP_EXTENSION 9 + +#ifdef HB_SUPPORT_MULTIPLE_MASTER +/* A pointer to a function which accesses the PostScript interpreter. + Multiple Master fonts need this interface to convert a metric ID + (as stored in an OpenType font version 1.2 or higher) `metric_id' + into a metric value (returned in `metric_value'). + + `data' points to the user-defined structure specified during a + call to HB_GPOS_Register_MM_Function(). + + `metric_value' must be returned as a scaled value (but shouldn't + be rounded). */ + +typedef HB_Error (*HB_MMFunction)(HB_Font font, + HB_UShort metric_id, + HB_Fixed* metric_value, + void* data ); +#endif + + +struct HB_GPOSHeader_ +{ + HB_16Dot16 Version; + + HB_ScriptList ScriptList; + HB_FeatureList FeatureList; + HB_LookupList LookupList; + + HB_GDEFHeader* gdef; + +#ifdef HB_SUPPORT_MULTIPLE_MASTER + /* this is OpenType 1.2 -- Multiple Master fonts need this + callback function to get various metric values from the + PostScript interpreter. */ + + HB_MMFunction mmfunc; + void* data; +#endif +}; + +typedef struct HB_GPOSHeader_ HB_GPOSHeader; +typedef HB_GPOSHeader* HB_GPOS; + + +HB_Error HB_Load_GPOS_Table( HB_Stream stream, + HB_GPOSHeader** gpos, + HB_GDEFHeader* gdef, + HB_Stream gdefStream ); + + +HB_Error HB_Done_GPOS_Table( HB_GPOSHeader* gpos ); + + +HB_Error HB_GPOS_Select_Script( HB_GPOSHeader* gpos, + HB_UInt script_tag, + HB_UShort* script_index ); + +HB_Error HB_GPOS_Select_Language( HB_GPOSHeader* gpos, + HB_UInt language_tag, + HB_UShort script_index, + HB_UShort* language_index, + HB_UShort* req_feature_index ); + +HB_Error HB_GPOS_Select_Feature( HB_GPOSHeader* gpos, + HB_UInt feature_tag, + HB_UShort script_index, + HB_UShort language_index, + HB_UShort* feature_index ); + + +HB_Error HB_GPOS_Query_Scripts( HB_GPOSHeader* gpos, + HB_UInt** script_tag_list ); + +HB_Error HB_GPOS_Query_Languages( HB_GPOSHeader* gpos, + HB_UShort script_index, + HB_UInt** language_tag_list ); + +HB_Error HB_GPOS_Query_Features( HB_GPOSHeader* gpos, + HB_UShort script_index, + HB_UShort language_index, + HB_UInt** feature_tag_list ); + + +HB_Error HB_GPOS_Add_Feature( HB_GPOSHeader* gpos, + HB_UShort feature_index, + HB_UInt property ); + +HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos ); + + +#ifdef HB_SUPPORT_MULTIPLE_MASTER +HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos, + HB_MMFunction mmfunc, + void* data ); +#endif + +/* If `dvi' is TRUE, glyph contour points for anchor points and device + tables are ignored -- you will get device independent values. */ + + +HB_Error HB_GPOS_Apply_String( HB_Font font, + HB_GPOSHeader* gpos, + HB_UShort load_flags, + HB_Buffer buffer, + HB_Bool dvi, + HB_Bool r2l ); + +HB_END_HEADER + +#endif /* HARFBUZZ_GPOS_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-greek.c b/src/3rdparty/harfbuzz/src/harfbuzz-greek.c new file mode 100644 index 0000000000..8099838323 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-greek.c @@ -0,0 +1,447 @@ +/* + * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" +#include + +#ifndef NO_OPENTYPE +static const HB_OpenTypeFeature greek_features[] = { + { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, + { HB_MAKE_TAG('l', 'i', 'g', 'a'), CcmpProperty }, + { HB_MAKE_TAG('c', 'l', 'i', 'g'), CcmpProperty }, + {0, 0} +}; +#endif + +/* + Greek decompositions +*/ + + +typedef struct _hb_greek_decomposition { + HB_UChar16 composed; + HB_UChar16 base; +} hb_greek_decomposition; + +static const hb_greek_decomposition decompose_0x300[] = { + { 0x1FBA, 0x0391 }, + { 0x1FC8, 0x0395 }, + { 0x1FCA, 0x0397 }, + { 0x1FDA, 0x0399 }, + { 0x1FF8, 0x039F }, + { 0x1FEA, 0x03A5 }, + { 0x1FFA, 0x03A9 }, + { 0x1F70, 0x03B1 }, + { 0x1F72, 0x03B5 }, + { 0x1F74, 0x03B7 }, + { 0x1F76, 0x03B9 }, + { 0x1F78, 0x03BF }, + { 0x1F7A, 0x03C5 }, + { 0x1F7C, 0x03C9 }, + { 0x1FD2, 0x03CA }, + { 0x1FE2, 0x03CB }, + { 0x1F02, 0x1F00 }, + { 0, 0 } +}; + +static HB_UChar16 compose_0x300(HB_UChar16 base) +{ + if ((base ^ 0x1f00) < 0x100) { + if (base <= 0x1f69 && !(base & 0x6)) + return base + 2; + if (base == 0x1fbf) + return 0x1fcd; + if (base == 0x1ffe) + return 0x1fdd; + return 0; + } + { + const hb_greek_decomposition *d = decompose_0x300; + while (d->base && d->base != base) + ++d; + return d->composed; + } +} + +static const hb_greek_decomposition decompose_0x301[] = { + { 0x0386, 0x0391 }, + { 0x0388, 0x0395 }, + { 0x0389, 0x0397 }, + { 0x038A, 0x0399 }, + { 0x038C, 0x039F }, + { 0x038E, 0x03A5 }, + { 0x038F, 0x03A9 }, + { 0x03AC, 0x03B1 }, + { 0x03AD, 0x03B5 }, + { 0x03AE, 0x03B7 }, + { 0x03AF, 0x03B9 }, + { 0x03CC, 0x03BF }, + { 0x03CD, 0x03C5 }, + { 0x03CE, 0x03C9 }, + { 0x0390, 0x03CA }, + { 0x03B0, 0x03CB }, + { 0x03D3, 0x03D2 }, + { 0, 0 } +}; + + +static HB_UChar16 compose_0x301(HB_UChar16 base) +{ + if ((base ^ 0x1f00) < 0x100) { + if (base <= 0x1f69 && !(base & 0x6)) + return base + 4; + if (base == 0x1fbf) + return 0x1fce; + if (base == 0x1ffe) + return 0x1fde; + } + { + const hb_greek_decomposition *d = decompose_0x301; + while (d->base && d->base != base) + ++d; + return d->composed; + } +} + +static const hb_greek_decomposition decompose_0x304[] = { + { 0x1FB9, 0x0391 }, + { 0x1FD9, 0x0399 }, + { 0x1FE9, 0x03A5 }, + { 0x1FB1, 0x03B1 }, + { 0x1FD1, 0x03B9 }, + { 0x1FE1, 0x03C5 }, + { 0, 0 } +}; + +static HB_UChar16 compose_0x304(HB_UChar16 base) +{ + const hb_greek_decomposition *d = decompose_0x304; + while (d->base && d->base != base) + ++d; + return d->composed; +} + +static const hb_greek_decomposition decompose_0x306[] = { + { 0x1FB8, 0x0391 }, + { 0x1FD8, 0x0399 }, + { 0x1FE8, 0x03A5 }, + { 0x1FB0, 0x03B1 }, + { 0x1FD0, 0x03B9 }, + { 0x1FE0, 0x03C5 }, + { 0, 0 } +}; + +static HB_UChar16 compose_0x306(HB_UChar16 base) +{ + const hb_greek_decomposition *d = decompose_0x306; + while (d->base && d->base != base) + ++d; + return d->composed; +} + +static const hb_greek_decomposition decompose_0x308[] = { + { 0x03AA, 0x0399 }, + { 0x03AB, 0x03A5 }, + { 0x03CA, 0x03B9 }, + { 0x03CB, 0x03C5 }, + { 0x03D4, 0x03D2 }, + { 0, 0 } +}; + +static HB_UChar16 compose_0x308(HB_UChar16 base) +{ + const hb_greek_decomposition *d = decompose_0x308; + while (d->base && d->base != base) + ++d; + return d->composed; +} + + +static const hb_greek_decomposition decompose_0x313[] = { + { 0x1F08, 0x0391 }, + { 0x1F18, 0x0395 }, + { 0x1F28, 0x0397 }, + { 0x1F38, 0x0399 }, + { 0x1F48, 0x039F }, + { 0x1F68, 0x03A9 }, + { 0x1F00, 0x03B1 }, + { 0x1F10, 0x03B5 }, + { 0x1F20, 0x03B7 }, + { 0x1F30, 0x03B9 }, + { 0x1F40, 0x03BF }, + { 0x1FE4, 0x03C1 }, + { 0x1F50, 0x03C5 }, + { 0x1F60, 0x03C9 }, + { 0, 0 } +}; + +static HB_UChar16 compose_0x313(HB_UChar16 base) +{ + const hb_greek_decomposition *d = decompose_0x313; + while (d->base && d->base != base) + ++d; + return d->composed; +} + +static const hb_greek_decomposition decompose_0x314[] = { + { 0x1F09, 0x0391 }, + { 0x1F19, 0x0395 }, + { 0x1F29, 0x0397 }, + { 0x1F39, 0x0399 }, + { 0x1F49, 0x039F }, + { 0x1FEC, 0x03A1 }, + { 0x1F59, 0x03A5 }, + { 0x1F69, 0x03A9 }, + { 0x1F01, 0x03B1 }, + { 0x1F11, 0x03B5 }, + { 0x1F21, 0x03B7 }, + { 0x1F31, 0x03B9 }, + { 0x1F41, 0x03BF }, + { 0x1FE5, 0x03C1 }, + { 0x1F51, 0x03C5 }, + { 0x1F61, 0x03C9 }, + { 0, 0 } +}; + +static HB_UChar16 compose_0x314(HB_UChar16 base) +{ + const hb_greek_decomposition *d = decompose_0x314; + while (d->base && d->base != base) + ++d; + return d->composed; +} + +static const hb_greek_decomposition decompose_0x342[] = { + { 0x1FB6, 0x03B1 }, + { 0x1FC6, 0x03B7 }, + { 0x1FD6, 0x03B9 }, + { 0x1FE6, 0x03C5 }, + { 0x1FF6, 0x03C9 }, + { 0x1FD7, 0x03CA }, + { 0x1FE7, 0x03CB }, + { 0x1F06, 0x1F00 }, + { 0x1F07, 0x1F01 }, + { 0x1F0E, 0x1F08 }, + { 0x1F0F, 0x1F09 }, + { 0x1F26, 0x1F20 }, + { 0x1F27, 0x1F21 }, + { 0x1F2E, 0x1F28 }, + { 0x1F2F, 0x1F29 }, + { 0x1F36, 0x1F30 }, + { 0x1F37, 0x1F31 }, + { 0x1F3E, 0x1F38 }, + { 0x1F3F, 0x1F39 }, + { 0x1F56, 0x1F50 }, + { 0x1F57, 0x1F51 }, + { 0x1F5F, 0x1F59 }, + { 0x1F66, 0x1F60 }, + { 0x1F67, 0x1F61 }, + { 0x1F6E, 0x1F68 }, + { 0x1F6F, 0x1F69 }, + { 0x1FCF, 0x1FBF }, + { 0x1FDF, 0x1FFE }, + { 0, 0 } +}; + +static HB_UChar16 compose_0x342(HB_UChar16 base) +{ + const hb_greek_decomposition *d = decompose_0x342; + while (d->base && d->base != base) + ++d; + return d->composed; +} + +static const hb_greek_decomposition decompose_0x345[] = { + { 0x1FBC, 0x0391 }, + { 0x1FCC, 0x0397 }, + { 0x1FFC, 0x03A9 }, + { 0x1FB4, 0x03AC }, + { 0x1FC4, 0x03AE }, + { 0x1FB3, 0x03B1 }, + { 0x1FC3, 0x03B7 }, + { 0x1FF3, 0x03C9 }, + { 0x1FF4, 0x03CE }, + { 0x1F80, 0x1F00 }, + { 0x1F81, 0x1F01 }, + { 0x1F82, 0x1F02 }, + { 0x1F83, 0x1F03 }, + { 0x1F84, 0x1F04 }, + { 0x1F85, 0x1F05 }, + { 0x1F86, 0x1F06 }, + { 0x1F87, 0x1F07 }, + { 0x1F88, 0x1F08 }, + { 0x1F89, 0x1F09 }, + { 0x1F8A, 0x1F0A }, + { 0x1F8B, 0x1F0B }, + { 0x1F8C, 0x1F0C }, + { 0x1F8D, 0x1F0D }, + { 0x1F8E, 0x1F0E }, + { 0x1F8F, 0x1F0F }, + { 0x1F90, 0x1F20 }, + { 0x1F91, 0x1F21 }, + { 0x1F92, 0x1F22 }, + { 0x1F93, 0x1F23 }, + { 0x1F94, 0x1F24 }, + { 0x1F95, 0x1F25 }, + { 0x1F96, 0x1F26 }, + { 0x1F97, 0x1F27 }, + { 0x1F98, 0x1F28 }, + { 0x1F99, 0x1F29 }, + { 0x1F9A, 0x1F2A }, + { 0x1F9B, 0x1F2B }, + { 0x1F9C, 0x1F2C }, + { 0x1F9D, 0x1F2D }, + { 0x1F9E, 0x1F2E }, + { 0x1F9F, 0x1F2F }, + { 0x1FA0, 0x1F60 }, + { 0x1FA1, 0x1F61 }, + { 0x1FA2, 0x1F62 }, + { 0x1FA3, 0x1F63 }, + { 0x1FA4, 0x1F64 }, + { 0x1FA5, 0x1F65 }, + { 0x1FA6, 0x1F66 }, + { 0x1FA7, 0x1F67 }, + { 0x1FA8, 0x1F68 }, + { 0x1FA9, 0x1F69 }, + { 0x1FAA, 0x1F6A }, + { 0x1FAB, 0x1F6B }, + { 0x1FAC, 0x1F6C }, + { 0x1FAD, 0x1F6D }, + { 0x1FAE, 0x1F6E }, + { 0x1FAF, 0x1F6F }, + { 0x1FB2, 0x1F70 }, + { 0x1FC2, 0x1F74 }, + { 0x1FF2, 0x1F7C }, + { 0x1FB7, 0x1FB6 }, + { 0x1FC7, 0x1FC6 }, + { 0x1FF7, 0x1FF6 }, + { 0, 0 } +}; + +static HB_UChar16 compose_0x345(HB_UChar16 base) +{ + const hb_greek_decomposition *d = decompose_0x345; + while (d->base && d->base != base) + ++d; + return d->composed; +} + +/* + Greek shaping. Heuristic positioning can't render polytonic greek correctly. We're a lot + better off mapping greek chars with diacritics to the characters in the extended greek + region in Unicode if possible. +*/ +HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item) +{ + const int availableGlyphs = shaper_item->num_glyphs; + const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos; + unsigned short *logClusters = shaper_item->log_clusters; + HB_GlyphAttributes *attributes = shaper_item->attributes; + + HB_Bool haveGlyphs; + int slen = 1; + int cluster_start = 0; + hb_uint32 i; + + HB_STACKARRAY(HB_UChar16, shapedChars, 2 * shaper_item->item.length); + + assert(shaper_item->item.script == HB_Script_Greek); + + *shapedChars = *uc; + logClusters[0] = 0; + + for (i = 1; i < shaper_item->item.length; ++i) { + hb_uint16 base = shapedChars[slen-1]; + hb_uint16 shaped = 0; + if (uc[i] == 0x300) + shaped = compose_0x300(base); + else if (uc[i] == 0x301) + shaped = compose_0x301(base); + else if (uc[i] == 0x304) + shaped = compose_0x304(base); + else if (uc[i] == 0x306) + shaped = compose_0x306(base); + else if (uc[i] == 0x308) + shaped = compose_0x308(base); + else if (uc[i] == 0x313) + shaped = compose_0x313(base); + else if (uc[i] == 0x314) + shaped = compose_0x314(base); + else if (uc[i] == 0x342) + shaped = compose_0x342(base); + else if (uc[i] == 0x345) + shaped = compose_0x345(base); + + if (shaped) { + if (shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1)) { + shapedChars[slen-1] = shaped; + } else { + shaped = 0; + } + } + + if (!shaped) { + HB_CharCategory category; + int cmb; + shapedChars[slen] = uc[i]; + HB_GetUnicodeCharProperties(uc[i], &category, &cmb); + if (category != HB_Mark_NonSpacing) { + attributes[slen].clusterStart = TRUE; + attributes[slen].mark = FALSE; + attributes[slen].combiningClass = 0; + attributes[slen].dontPrint = HB_IsControlChar(uc[i]); + cluster_start = slen; + } else { + attributes[slen].clusterStart = FALSE; + attributes[slen].mark = TRUE; + attributes[slen].combiningClass = cmb; + } + ++slen; + } + logClusters[i] = cluster_start; + } + + haveGlyphs = shaper_item->font->klass + ->convertStringToGlyphIndices(shaper_item->font, + shapedChars, slen, + shaper_item->glyphs, &shaper_item->num_glyphs, + shaper_item->item.bidiLevel % 2); + + HB_FREE_STACKARRAY(shapedChars); + + if (!haveGlyphs) + return FALSE; + +#ifndef NO_OPENTYPE + if (HB_SelectScript(shaper_item, greek_features)) { + HB_OpenTypeShape(shaper_item, /*properties*/0); + return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/TRUE); + } +#endif + HB_HeuristicPosition(shaper_item); + + return TRUE; +} + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h new file mode 100644 index 0000000000..df0c3f639f --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gsub-private.h @@ -0,0 +1,475 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_GSUB_PRIVATE_H +#define HARFBUZZ_GSUB_PRIVATE_H + +#include "harfbuzz-impl.h" +#include "harfbuzz-stream-private.h" +#include "harfbuzz-gsub.h" + +HB_BEGIN_HEADER + +typedef union HB_GSUB_SubTable_ HB_GSUB_SubTable; + +/* LookupType 1 */ + +struct HB_SingleSubstFormat1_ +{ + HB_Short DeltaGlyphID; /* constant added to get + substitution glyph index */ +}; + +typedef struct HB_SingleSubstFormat1_ HB_SingleSubstFormat1; + + +struct HB_SingleSubstFormat2_ +{ + HB_UShort* Substitute; /* array of substitute glyph IDs */ + HB_UShort GlyphCount; /* number of glyph IDs in + Substitute array */ +}; + +typedef struct HB_SingleSubstFormat2_ HB_SingleSubstFormat2; + + +struct HB_SingleSubst_ +{ + union + { + HB_SingleSubstFormat1 ssf1; + HB_SingleSubstFormat2 ssf2; + } ssf; + + HB_Coverage Coverage; /* Coverage table */ + HB_Byte SubstFormat; /* 1 or 2 */ +}; + +typedef struct HB_SingleSubst_ HB_SingleSubst; + + +/* LookupType 2 */ + +struct HB_Sequence_ +{ + HB_UShort* Substitute; /* string of glyph IDs to + substitute */ + HB_UShort GlyphCount; /* number of glyph IDs in the + Substitute array */ +}; + +typedef struct HB_Sequence_ HB_Sequence; + + +struct HB_MultipleSubst_ +{ + HB_Sequence* Sequence; /* array of Sequence tables */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort SubstFormat; /* always 1 */ + HB_UShort SequenceCount; /* number of Sequence tables */ +}; + +typedef struct HB_MultipleSubst_ HB_MultipleSubst; + + +/* LookupType 3 */ + +struct HB_AlternateSet_ +{ + HB_UShort* Alternate; /* array of alternate glyph IDs */ + HB_UShort GlyphCount; /* number of glyph IDs in the + Alternate array */ +}; + +typedef struct HB_AlternateSet_ HB_AlternateSet; + + +struct HB_AlternateSubst_ +{ + HB_AlternateSet* AlternateSet; /* array of AlternateSet tables */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort SubstFormat; /* always 1 */ + HB_UShort AlternateSetCount; + /* number of AlternateSet tables */ +}; + +typedef struct HB_AlternateSubst_ HB_AlternateSubst; + + +/* LookupType 4 */ + +struct HB_Ligature_ +{ + HB_UShort* Component; /* array of component glyph IDs */ + HB_UShort LigGlyph; /* glyphID of ligature + to substitute */ + HB_UShort ComponentCount; /* number of components in ligature */ +}; + +typedef struct HB_Ligature_ HB_Ligature; + + +struct HB_LigatureSet_ +{ + HB_Ligature* Ligature; /* array of Ligature tables */ + HB_UShort LigatureCount; /* number of Ligature tables */ +}; + +typedef struct HB_LigatureSet_ HB_LigatureSet; + + +struct HB_LigatureSubst_ +{ + HB_LigatureSet* LigatureSet; /* array of LigatureSet tables */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort SubstFormat; /* always 1 */ + HB_UShort LigatureSetCount; /* number of LigatureSet tables */ +}; + +typedef struct HB_LigatureSubst_ HB_LigatureSubst; + + +/* needed by both lookup type 5 and 6 */ + +struct HB_SubstLookupRecord_ +{ + HB_UShort SequenceIndex; /* index into current + glyph sequence */ + HB_UShort LookupListIndex; /* Lookup to apply to that pos. */ +}; + +typedef struct HB_SubstLookupRecord_ HB_SubstLookupRecord; + + +/* LookupType 5 */ + +struct HB_SubRule_ +{ + HB_UShort* Input; /* array of input glyph IDs */ + HB_SubstLookupRecord* SubstLookupRecord; + /* array of SubstLookupRecord + tables */ + HB_UShort GlyphCount; /* total number of input glyphs */ + HB_UShort SubstCount; /* number of SubstLookupRecord + tables */ +}; + +typedef struct HB_SubRule_ HB_SubRule; + + +struct HB_SubRuleSet_ +{ + HB_SubRule* SubRule; /* array of SubRule tables */ + HB_UShort SubRuleCount; /* number of SubRule tables */ +}; + +typedef struct HB_SubRuleSet_ HB_SubRuleSet; + + +struct HB_ContextSubstFormat1_ +{ + HB_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort SubRuleSetCount; /* number of SubRuleSet tables */ +}; + +typedef struct HB_ContextSubstFormat1_ HB_ContextSubstFormat1; + + +struct HB_SubClassRule_ +{ + HB_UShort* Class; /* array of classes */ + HB_SubstLookupRecord* SubstLookupRecord; + /* array of SubstLookupRecord + tables */ + HB_UShort GlyphCount; /* total number of context classes */ + HB_UShort SubstCount; /* number of SubstLookupRecord + tables */ +}; + +typedef struct HB_SubClassRule_ HB_SubClassRule; + + +struct HB_SubClassSet_ +{ + HB_SubClassRule* SubClassRule; /* array of SubClassRule tables */ + HB_UShort SubClassRuleCount; + /* number of SubClassRule tables */ +}; + +typedef struct HB_SubClassSet_ HB_SubClassSet; + + +/* The `MaxContextLength' field is not defined in the TTO specification + but simplifies the implementation of this format. It holds the + maximal context length used in the context rules. */ + +struct HB_ContextSubstFormat2_ +{ + HB_SubClassSet* SubClassSet; /* array of SubClassSet tables */ + HB_Coverage Coverage; /* Coverage table */ + HB_ClassDefinition ClassDef; /* ClassDef table */ + HB_UShort SubClassSetCount; + /* number of SubClassSet tables */ + HB_UShort MaxContextLength; + /* maximal context length */ +}; + +typedef struct HB_ContextSubstFormat2_ HB_ContextSubstFormat2; + + +struct HB_ContextSubstFormat3_ +{ + HB_Coverage* Coverage; /* array of Coverage tables */ + HB_SubstLookupRecord* SubstLookupRecord; + /* array of substitution lookups */ + HB_UShort GlyphCount; /* number of input glyphs */ + HB_UShort SubstCount; /* number of SubstLookupRecords */ +}; + +typedef struct HB_ContextSubstFormat3_ HB_ContextSubstFormat3; + + +struct HB_ContextSubst_ +{ + union + { + HB_ContextSubstFormat1 csf1; + HB_ContextSubstFormat2 csf2; + HB_ContextSubstFormat3 csf3; + } csf; + + HB_Byte SubstFormat; /* 1, 2, or 3 */ +}; + +typedef struct HB_ContextSubst_ HB_ContextSubst; + + +/* LookupType 6 */ + +struct HB_ChainSubRule_ +{ + HB_UShort* Backtrack; /* array of backtrack glyph IDs */ + HB_UShort* Input; /* array of input glyph IDs */ + HB_UShort* Lookahead; /* array of lookahead glyph IDs */ + HB_SubstLookupRecord* SubstLookupRecord; + /* array of SubstLookupRecords */ + HB_UShort BacktrackGlyphCount; + /* total number of backtrack glyphs */ + HB_UShort InputGlyphCount; + /* total number of input glyphs */ + HB_UShort LookaheadGlyphCount; + /* total number of lookahead glyphs */ + HB_UShort SubstCount; /* number of SubstLookupRecords */ +}; + +typedef struct HB_ChainSubRule_ HB_ChainSubRule; + + +struct HB_ChainSubRuleSet_ +{ + HB_ChainSubRule* ChainSubRule; /* array of ChainSubRule tables */ + HB_UShort ChainSubRuleCount; + /* number of ChainSubRule tables */ +}; + +typedef struct HB_ChainSubRuleSet_ HB_ChainSubRuleSet; + + +struct HB_ChainContextSubstFormat1_ +{ + HB_ChainSubRuleSet* ChainSubRuleSet; + /* array of ChainSubRuleSet tables */ + HB_Coverage Coverage; /* Coverage table */ + HB_UShort ChainSubRuleSetCount; + /* number of ChainSubRuleSet tables */ +}; + +typedef struct HB_ChainContextSubstFormat1_ HB_ChainContextSubstFormat1; + + +struct HB_ChainSubClassRule_ +{ + HB_UShort* Backtrack; /* array of backtrack classes */ + HB_UShort* Input; /* array of context classes */ + HB_UShort* Lookahead; /* array of lookahead classes */ + HB_SubstLookupRecord* SubstLookupRecord; + /* array of substitution lookups */ + HB_UShort BacktrackGlyphCount; + /* total number of backtrack + classes */ + HB_UShort InputGlyphCount; + /* total number of context classes */ + HB_UShort LookaheadGlyphCount; + /* total number of lookahead + classes */ + HB_UShort SubstCount; /* number of SubstLookupRecords */ +}; + +typedef struct HB_ChainSubClassRule_ HB_ChainSubClassRule; + + +struct HB_ChainSubClassSet_ +{ + HB_ChainSubClassRule* ChainSubClassRule; + /* array of ChainSubClassRule + tables */ + HB_UShort ChainSubClassRuleCount; + /* number of ChainSubClassRule + tables */ +}; + +typedef struct HB_ChainSubClassSet_ HB_ChainSubClassSet; + + +/* The `MaxXXXLength' fields are not defined in the TTO specification + but simplifies the implementation of this format. It holds the + maximal context length used in the specific context rules. */ + +struct HB_ChainContextSubstFormat2_ +{ + HB_ChainSubClassSet* ChainSubClassSet; + /* array of ChainSubClassSet + tables */ + HB_Coverage Coverage; /* Coverage table */ + + HB_ClassDefinition BacktrackClassDef; + /* BacktrackClassDef table */ + HB_ClassDefinition InputClassDef; + /* InputClassDef table */ + HB_ClassDefinition LookaheadClassDef; + /* LookaheadClassDef table */ + + HB_UShort ChainSubClassSetCount; + /* number of ChainSubClassSet + tables */ + HB_UShort MaxBacktrackLength; + /* maximal backtrack length */ + HB_UShort MaxLookaheadLength; + /* maximal lookahead length */ + HB_UShort MaxInputLength; + /* maximal input length */ +}; + +typedef struct HB_ChainContextSubstFormat2_ HB_ChainContextSubstFormat2; + + +struct HB_ChainContextSubstFormat3_ +{ + HB_Coverage* BacktrackCoverage; + /* array of backtrack Coverage + tables */ + HB_Coverage* InputCoverage; + /* array of input coverage + tables */ + HB_Coverage* LookaheadCoverage; + /* array of lookahead coverage + tables */ + HB_SubstLookupRecord* SubstLookupRecord; + /* array of substitution lookups */ + HB_UShort BacktrackGlyphCount; + /* number of backtrack glyphs */ + HB_UShort InputGlyphCount; + /* number of input glyphs */ + HB_UShort LookaheadGlyphCount; + /* number of lookahead glyphs */ + HB_UShort SubstCount; /* number of SubstLookupRecords */ +}; + +typedef struct HB_ChainContextSubstFormat3_ HB_ChainContextSubstFormat3; + + +struct HB_ChainContextSubst_ +{ + union + { + HB_ChainContextSubstFormat1 ccsf1; + HB_ChainContextSubstFormat2 ccsf2; + HB_ChainContextSubstFormat3 ccsf3; + } ccsf; + + HB_Byte SubstFormat; /* 1, 2, or 3 */ +}; + +typedef struct HB_ChainContextSubst_ HB_ChainContextSubst; + + +#if 0 +/* LookupType 7 */ +struct HB_ExtensionSubst_ +{ + HB_GSUB_SubTable *subtable; /* referenced subtable */ + HB_UShort SubstFormat; /* always 1 */ + HB_UShort LookuptType; /* lookup-type of referenced subtable */ +}; + +typedef struct HB_ExtensionSubst_ HB_ExtensionSubst; +#endif + + +/* LookupType 8 */ +struct HB_ReverseChainContextSubst_ +{ + HB_Coverage* LookaheadCoverage; /* array of lookahead Coverage + tables */ + HB_UShort* Substitute; /* array of substitute Glyph ID */ + HB_Coverage* BacktrackCoverage; /* array of backtrack Coverage + tables */ + HB_Coverage Coverage; /* coverage table for input glyphs */ + HB_UShort SubstFormat; /* always 1 */ + HB_UShort BacktrackGlyphCount; /* number of backtrack glyphs */ + HB_UShort LookaheadGlyphCount; /* number of lookahead glyphs */ + HB_UShort GlyphCount; /* number of Glyph IDs */ +}; + +typedef struct HB_ReverseChainContextSubst_ HB_ReverseChainContextSubst; + + +union HB_GSUB_SubTable_ +{ + HB_SingleSubst single; + HB_MultipleSubst multiple; + HB_AlternateSubst alternate; + HB_LigatureSubst ligature; + HB_ContextSubst context; + HB_ChainContextSubst chain; + HB_ReverseChainContextSubst reverse; +}; + + + + +HB_INTERNAL HB_Error +_HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st, + HB_Stream stream, + HB_UShort lookup_type ); + +HB_INTERNAL void +_HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st, + HB_UShort lookup_type ); + +HB_END_HEADER + +#endif /* HARFBUZZ_GSUB_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.c b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.c new file mode 100644 index 0000000000..21fec51924 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.c @@ -0,0 +1,4329 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * Copyright (C) 2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + */ + +#include "harfbuzz-impl.h" +#include "harfbuzz-gsub-private.h" +#include "harfbuzz-open-private.h" +#include "harfbuzz-gdef-private.h" + +static HB_Error GSUB_Do_Glyph_Lookup( HB_GSUBHeader* gsub, + HB_UShort lookup_index, + HB_Buffer buffer, + HB_UShort context_length, + int nesting_level ); + + + +/********************** + * Auxiliary functions + **********************/ + + + +HB_Error HB_Load_GSUB_Table( HB_Stream stream, + HB_GSUBHeader** retptr, + HB_GDEFHeader* gdef, + HB_Stream gdefStream ) +{ + HB_Error error; + HB_UInt cur_offset, new_offset, base_offset; + + HB_GSUBHeader* gsub; + + if ( !retptr ) + return ERR(HB_Err_Invalid_Argument); + + if ( GOTO_Table( TTAG_GSUB ) ) + return error; + + base_offset = FILE_Pos(); + + if ( ALLOC ( gsub, sizeof( *gsub ) ) ) + return error; + + + /* skip version */ + + if ( FILE_Seek( base_offset + 4L ) || + ACCESS_Frame( 2L ) ) + goto Fail4; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_ScriptList( &gsub->ScriptList, + stream ) ) != HB_Err_Ok ) + goto Fail4; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_FeatureList( &gsub->FeatureList, + stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_LookupList( &gsub->LookupList, + stream, HB_Type_GSUB ) ) != HB_Err_Ok ) + goto Fail2; + + gsub->gdef = gdef; /* can be NULL */ + + if ( ( error = _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, gdefStream, + gsub->LookupList.Lookup, + gsub->LookupList.LookupCount ) ) ) + goto Fail1; + + *retptr = gsub; + + return HB_Err_Ok; + +Fail1: + _HB_OPEN_Free_LookupList( &gsub->LookupList, HB_Type_GSUB ); + +Fail2: + _HB_OPEN_Free_FeatureList( &gsub->FeatureList ); + +Fail3: + _HB_OPEN_Free_ScriptList( &gsub->ScriptList ); + +Fail4: + FREE ( gsub ); + + + return error; +} + + +HB_Error HB_Done_GSUB_Table( HB_GSUBHeader* gsub ) +{ + _HB_OPEN_Free_LookupList( &gsub->LookupList, HB_Type_GSUB ); + _HB_OPEN_Free_FeatureList( &gsub->FeatureList ); + _HB_OPEN_Free_ScriptList( &gsub->ScriptList ); + + FREE( gsub ); + + return HB_Err_Ok; +} + +/***************************** + * SubTable related functions + *****************************/ + + +/* LookupType 1 */ + +/* SingleSubstFormat1 */ +/* SingleSubstFormat2 */ + +static HB_Error Load_SingleSubst( HB_GSUB_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_SingleSubst* ss = &st->single; + + HB_UShort n, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_UShort* s; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 4L ) ) + return error; + + ss->SubstFormat = GET_UShort(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &ss->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + switch ( ss->SubstFormat ) + { + case 1: + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + ss->ssf.ssf1.DeltaGlyphID = GET_UShort(); + + FORGET_Frame(); + + break; + + case 2: + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = ss->ssf.ssf2.GlyphCount = GET_UShort(); + + FORGET_Frame(); + + ss->ssf.ssf2.Substitute = NULL; + + if ( ALLOC_ARRAY( ss->ssf.ssf2.Substitute, count, HB_UShort ) ) + goto Fail2; + + s = ss->ssf.ssf2.Substitute; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + s[n] = GET_UShort(); + + FORGET_Frame(); + + break; + + default: + return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; + +Fail1: + FREE( s ); + +Fail2: + _HB_OPEN_Free_Coverage( &ss->Coverage ); + return error; +} + + +static void Free_SingleSubst( HB_GSUB_SubTable* st ) +{ + HB_SingleSubst* ss = &st->single; + + switch ( ss->SubstFormat ) + { + case 1: + break; + + case 2: + FREE( ss->ssf.ssf2.Substitute ); + break; + + default: + break; + } + + _HB_OPEN_Free_Coverage( &ss->Coverage ); +} + + +static HB_Error Lookup_SingleSubst( HB_GSUBHeader* gsub, + HB_GSUB_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, value, property; + HB_Error error; + HB_SingleSubst* ss = &st->single; + HB_GDEFHeader* gdef = gsub->gdef; + + HB_UNUSED(nesting_level); + + if ( context_length != 0xFFFF && context_length < 1 ) + return HB_Err_Not_Covered; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &ss->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + switch ( ss->SubstFormat ) + { + case 1: + value = ( IN_CURGLYPH() + ss->ssf.ssf1.DeltaGlyphID ) & 0xFFFF; + if ( REPLACE_Glyph( buffer, value, nesting_level ) ) + return error; + break; + + case 2: + if ( index >= ss->ssf.ssf2.GlyphCount ) + return ERR(HB_Err_Invalid_SubTable); + value = ss->ssf.ssf2.Substitute[index]; + if ( REPLACE_Glyph( buffer, value, nesting_level ) ) + return error; + break; + + default: + return ERR(HB_Err_Invalid_SubTable); + } + + if ( gdef && gdef->NewGlyphClasses ) + { + /* we inherit the old glyph class to the substituted glyph */ + + error = _HB_GDEF_Add_Glyph_Property( gdef, value, property ); + if ( error && error != HB_Err_Not_Covered ) + return error; + } + + return HB_Err_Ok; +} + + +/* LookupType 2 */ + +/* Sequence */ + +static HB_Error Load_Sequence( HB_Sequence* s, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UShort* sub; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = s->GlyphCount = GET_UShort(); + + FORGET_Frame(); + + s->Substitute = NULL; + + if ( count ) + { + if ( ALLOC_ARRAY( s->Substitute, count, HB_UShort ) ) + return error; + + sub = s->Substitute; + + if ( ACCESS_Frame( count * 2L ) ) + { + FREE( sub ); + return error; + } + + for ( n = 0; n < count; n++ ) + sub[n] = GET_UShort(); + + FORGET_Frame(); + } + + return HB_Err_Ok; +} + + +static void Free_Sequence( HB_Sequence* s ) +{ + FREE( s->Substitute ); +} + + +/* MultipleSubstFormat1 */ + +static HB_Error Load_MultipleSubst( HB_GSUB_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_MultipleSubst* ms = &st->multiple; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Sequence* s; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 4L ) ) + return error; + + ms->SubstFormat = GET_UShort(); /* should be 1 */ + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &ms->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = ms->SequenceCount = GET_UShort(); + + FORGET_Frame(); + + ms->Sequence = NULL; + + if ( ALLOC_ARRAY( ms->Sequence, count, HB_Sequence ) ) + goto Fail2; + + s = ms->Sequence; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Sequence( &s[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_Sequence( &s[m] ); + + FREE( s ); + +Fail2: + _HB_OPEN_Free_Coverage( &ms->Coverage ); + return error; +} + + +static void Free_MultipleSubst( HB_GSUB_SubTable* st ) +{ + HB_UShort n, count; + HB_MultipleSubst* ms = &st->multiple; + + HB_Sequence* s; + + + if ( ms->Sequence ) + { + count = ms->SequenceCount; + s = ms->Sequence; + + for ( n = 0; n < count; n++ ) + Free_Sequence( &s[n] ); + + FREE( s ); + } + + _HB_OPEN_Free_Coverage( &ms->Coverage ); +} + + +static HB_Error Lookup_MultipleSubst( HB_GSUBHeader* gsub, + HB_GSUB_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_Error error; + HB_UShort index, property, n, count; + HB_UShort*s; + HB_MultipleSubst* ms = &st->multiple; + HB_GDEFHeader* gdef = gsub->gdef; + + HB_UNUSED(nesting_level); + + if ( context_length != 0xFFFF && context_length < 1 ) + return HB_Err_Not_Covered; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &ms->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + if ( index >= ms->SequenceCount ) + return ERR(HB_Err_Invalid_SubTable); + + count = ms->Sequence[index].GlyphCount; + s = ms->Sequence[index].Substitute; + + if ( ADD_String( buffer, 1, count, s, 0xFFFF, 0xFFFF ) ) + return error; + + if ( gdef && gdef->NewGlyphClasses ) + { + /* this is a guess only ... */ + + if ( property == HB_GDEF_LIGATURE ) + property = HB_GDEF_BASE_GLYPH; + + for ( n = 0; n < count; n++ ) + { + error = _HB_GDEF_Add_Glyph_Property( gdef, s[n], property ); + if ( error && error != HB_Err_Not_Covered ) + return error; + } + } + + return HB_Err_Ok; +} + + +/* LookupType 3 */ + +/* AlternateSet */ + +static HB_Error Load_AlternateSet( HB_AlternateSet* as, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UShort* a; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = as->GlyphCount = GET_UShort(); + + FORGET_Frame(); + + as->Alternate = NULL; + + if ( ALLOC_ARRAY( as->Alternate, count, HB_UShort ) ) + return error; + + a = as->Alternate; + + if ( ACCESS_Frame( count * 2L ) ) + { + FREE( a ); + return error; + } + + for ( n = 0; n < count; n++ ) + a[n] = GET_UShort(); + + FORGET_Frame(); + + return HB_Err_Ok; +} + + +static void Free_AlternateSet( HB_AlternateSet* as ) +{ + FREE( as->Alternate ); +} + + +/* AlternateSubstFormat1 */ + +static HB_Error Load_AlternateSubst( HB_GSUB_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_AlternateSubst* as = &st->alternate; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_AlternateSet* aset; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 4L ) ) + return error; + + as->SubstFormat = GET_UShort(); /* should be 1 */ + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &as->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = as->AlternateSetCount = GET_UShort(); + + FORGET_Frame(); + + as->AlternateSet = NULL; + + if ( ALLOC_ARRAY( as->AlternateSet, count, HB_AlternateSet ) ) + goto Fail2; + + aset = as->AlternateSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_AlternateSet( &aset[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_AlternateSet( &aset[m] ); + + FREE( aset ); + +Fail2: + _HB_OPEN_Free_Coverage( &as->Coverage ); + return error; +} + + +static void Free_AlternateSubst( HB_GSUB_SubTable* st ) +{ + HB_UShort n, count; + HB_AlternateSubst* as = &st->alternate; + + HB_AlternateSet* aset; + + + if ( as->AlternateSet ) + { + count = as->AlternateSetCount; + aset = as->AlternateSet; + + for ( n = 0; n < count; n++ ) + Free_AlternateSet( &aset[n] ); + + FREE( aset ); + } + + _HB_OPEN_Free_Coverage( &as->Coverage ); +} + + +static HB_Error Lookup_AlternateSubst( HB_GSUBHeader* gsub, + HB_GSUB_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_Error error; + HB_UShort index, value, alt_index, property; + HB_AlternateSubst* as = &st->alternate; + HB_GDEFHeader* gdef = gsub->gdef; + HB_AlternateSet aset; + + HB_UNUSED(nesting_level); + + if ( context_length != 0xFFFF && context_length < 1 ) + return HB_Err_Not_Covered; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &as->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + aset = as->AlternateSet[index]; + + /* we use a user-defined callback function to get the alternate index */ + + if ( gsub->altfunc ) + alt_index = (gsub->altfunc)( buffer->out_pos, IN_CURGLYPH(), + aset.GlyphCount, aset.Alternate, + gsub->data ); + else + alt_index = 0; + + value = aset.Alternate[alt_index]; + if ( REPLACE_Glyph( buffer, value, nesting_level ) ) + return error; + + if ( gdef && gdef->NewGlyphClasses ) + { + /* we inherit the old glyph class to the substituted glyph */ + + error = _HB_GDEF_Add_Glyph_Property( gdef, value, property ); + if ( error && error != HB_Err_Not_Covered ) + return error; + } + + return HB_Err_Ok; +} + + +/* LookupType 4 */ + +/* Ligature */ + +static HB_Error Load_Ligature( HB_Ligature* l, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UShort* c; + + + if ( ACCESS_Frame( 4L ) ) + return error; + + l->LigGlyph = GET_UShort(); + l->ComponentCount = GET_UShort(); + + FORGET_Frame(); + + l->Component = NULL; + + count = l->ComponentCount - 1; /* only ComponentCount - 1 elements */ + + if ( ALLOC_ARRAY( l->Component, count, HB_UShort ) ) + return error; + + c = l->Component; + + if ( ACCESS_Frame( count * 2L ) ) + { + FREE( c ); + return error; + } + + for ( n = 0; n < count; n++ ) + c[n] = GET_UShort(); + + FORGET_Frame(); + + return HB_Err_Ok; +} + + +static void Free_Ligature( HB_Ligature* l ) +{ + FREE( l->Component ); +} + + +/* LigatureSet */ + +static HB_Error Load_LigatureSet( HB_LigatureSet* ls, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Ligature* l; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = ls->LigatureCount = GET_UShort(); + + FORGET_Frame(); + + ls->Ligature = NULL; + + if ( ALLOC_ARRAY( ls->Ligature, count, HB_Ligature ) ) + return error; + + l = ls->Ligature; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Ligature( &l[n], stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_Ligature( &l[m] ); + + FREE( l ); + return error; +} + + +static void Free_LigatureSet( HB_LigatureSet* ls ) +{ + HB_UShort n, count; + + HB_Ligature* l; + + + if ( ls->Ligature ) + { + count = ls->LigatureCount; + l = ls->Ligature; + + for ( n = 0; n < count; n++ ) + Free_Ligature( &l[n] ); + + FREE( l ); + } +} + + +/* LigatureSubstFormat1 */ + +static HB_Error Load_LigatureSubst( HB_GSUB_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_LigatureSubst* ls = &st->ligature; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_LigatureSet* lset; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 4L ) ) + return error; + + ls->SubstFormat = GET_UShort(); /* should be 1 */ + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &ls->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = ls->LigatureSetCount = GET_UShort(); + + FORGET_Frame(); + + ls->LigatureSet = NULL; + + if ( ALLOC_ARRAY( ls->LigatureSet, count, HB_LigatureSet ) ) + goto Fail2; + + lset = ls->LigatureSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_LigatureSet( &lset[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_LigatureSet( &lset[m] ); + + FREE( lset ); + +Fail2: + _HB_OPEN_Free_Coverage( &ls->Coverage ); + return error; +} + + +static void Free_LigatureSubst( HB_GSUB_SubTable* st ) +{ + HB_UShort n, count; + HB_LigatureSubst* ls = &st->ligature; + + HB_LigatureSet* lset; + + + if ( ls->LigatureSet ) + { + count = ls->LigatureSetCount; + lset = ls->LigatureSet; + + for ( n = 0; n < count; n++ ) + Free_LigatureSet( &lset[n] ); + + FREE( lset ); + } + + _HB_OPEN_Free_Coverage( &ls->Coverage ); +} + + +static HB_Error Lookup_LigatureSubst( HB_GSUBHeader* gsub, + HB_GSUB_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_Error error; + HB_UShort numlig, i, j, is_mark, first_is_mark = FALSE; + HB_UShort* c; + HB_LigatureSubst* ls = &st->ligature; + HB_GDEFHeader* gdef = gsub->gdef; + + HB_Ligature* lig; + + HB_UNUSED(nesting_level); + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + if ( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) + first_is_mark = TRUE; + + error = _HB_OPEN_Coverage_Index( &ls->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + if ( index >= ls->LigatureSetCount ) + return ERR(HB_Err_Invalid_SubTable); + + lig = ls->LigatureSet[index].Ligature; + + for ( numlig = ls->LigatureSet[index].LigatureCount; + numlig; + numlig--, lig++ ) + { + if ( buffer->in_pos + lig->ComponentCount > buffer->in_length ) + goto next_ligature; /* Not enough glyphs in input */ + + c = lig->Component; + + is_mark = first_is_mark; + + if ( context_length != 0xFFFF && context_length < lig->ComponentCount ) + break; + + for ( i = 1, j = buffer->in_pos + 1; i < lig->ComponentCount; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + lig->ComponentCount - i == (HB_Int)buffer->in_length ) + goto next_ligature; + j++; + } + + if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) + is_mark = FALSE; + + if ( IN_GLYPH( j ) != c[i - 1] ) + goto next_ligature; + } + + if ( gdef && gdef->NewGlyphClasses ) + { + /* this is just a guess ... */ + + error = _HB_GDEF_Add_Glyph_Property( gdef, lig->LigGlyph, + is_mark ? HB_GDEF_MARK : HB_GDEF_LIGATURE ); + if ( error && error != HB_Err_Not_Covered ) + return error; + } + + if ( j == buffer->in_pos + i ) /* No input glyphs skipped */ + { + /* We don't use a new ligature ID if there are no skipped + glyphs and the ligature already has an ID. */ + + if ( IN_LIGID( buffer->in_pos ) ) + { + if ( ADD_String( buffer, i, 1, &lig->LigGlyph, + 0xFFFF, 0xFFFF ) ) + return error; + } + else + { + HB_UShort ligID = _hb_buffer_allocate_ligid( buffer ); + if ( ADD_String( buffer, i, 1, &lig->LigGlyph, + 0xFFFF, ligID ) ) + return error; + } + } + else + { + HB_UShort ligID = _hb_buffer_allocate_ligid( buffer ); + if ( ADD_Glyph( buffer, lig->LigGlyph, 0xFFFF, ligID ) ) + return error; + + /* Now we must do a second loop to copy the skipped glyphs to + `out' and assign component values to it. We start with the + glyph after the first component. Glyphs between component + i and i+1 belong to component i. Together with the ligID + value it is later possible to check whether a specific + component value really belongs to a given ligature. */ + + for ( i = 0; i < lig->ComponentCount - 1; i++ ) + { + while ( CHECK_Property( gdef, IN_CURITEM(), + flags, &property ) ) + if ( ADD_Glyph( buffer, IN_CURGLYPH(), i, ligID ) ) + return error; + + (buffer->in_pos)++; + } + } + + return HB_Err_Ok; + + next_ligature: + ; + } + + return HB_Err_Not_Covered; +} + + +/* Do the actual substitution for a context substitution (either format + 5 or 6). This is only called after we've determined that the input + matches the subrule. */ + +static HB_Error Do_ContextSubst( HB_GSUBHeader* gsub, + HB_UShort GlyphCount, + HB_UShort SubstCount, + HB_SubstLookupRecord* subst, + HB_Buffer buffer, + int nesting_level ) +{ + HB_Error error; + HB_UInt i, old_pos; + + + i = 0; + + while ( i < GlyphCount ) + { + if ( SubstCount && i == subst->SequenceIndex ) + { + old_pos = buffer->in_pos; + + /* Do a substitution */ + + error = GSUB_Do_Glyph_Lookup( gsub, subst->LookupListIndex, buffer, + GlyphCount, nesting_level ); + + subst++; + SubstCount--; + i += buffer->in_pos - old_pos; + + if ( error == HB_Err_Not_Covered ) + { + if ( COPY_Glyph( buffer ) ) + return error; + i++; + } + else if ( error ) + return error; + } + else + { + /* No substitution for this index */ + + if ( COPY_Glyph( buffer ) ) + return error; + i++; + } + } + + return HB_Err_Ok; +} + + +/* LookupType 5 */ + +/* SubRule */ + +static HB_Error Load_SubRule( HB_SubRule* sr, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UShort* i; + + HB_SubstLookupRecord* slr; + + + if ( ACCESS_Frame( 4L ) ) + return error; + + sr->GlyphCount = GET_UShort(); + sr->SubstCount = GET_UShort(); + + FORGET_Frame(); + + sr->Input = NULL; + + count = sr->GlyphCount - 1; /* only GlyphCount - 1 elements */ + + if ( ALLOC_ARRAY( sr->Input, count, HB_UShort ) ) + return error; + + i = sr->Input; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail2; + + for ( n = 0; n < count; n++ ) + i[n] = GET_UShort(); + + FORGET_Frame(); + + sr->SubstLookupRecord = NULL; + + count = sr->SubstCount; + + if ( ALLOC_ARRAY( sr->SubstLookupRecord, count, HB_SubstLookupRecord ) ) + goto Fail2; + + slr = sr->SubstLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + slr[n].SequenceIndex = GET_UShort(); + slr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( slr ); + +Fail2: + FREE( i ); + return error; +} + + +static void Free_SubRule( HB_SubRule* sr ) +{ + FREE( sr->SubstLookupRecord ); + FREE( sr->Input ); +} + + +/* SubRuleSet */ + +static HB_Error Load_SubRuleSet( HB_SubRuleSet* srs, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_SubRule* sr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = srs->SubRuleCount = GET_UShort(); + + FORGET_Frame(); + + srs->SubRule = NULL; + + if ( ALLOC_ARRAY( srs->SubRule, count, HB_SubRule ) ) + return error; + + sr = srs->SubRule; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_SubRule( &sr[n], stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_SubRule( &sr[m] ); + + FREE( sr ); + return error; +} + + +static void Free_SubRuleSet( HB_SubRuleSet* srs ) +{ + HB_UShort n, count; + + HB_SubRule* sr; + + + if ( srs->SubRule ) + { + count = srs->SubRuleCount; + sr = srs->SubRule; + + for ( n = 0; n < count; n++ ) + Free_SubRule( &sr[n] ); + + FREE( sr ); + } +} + + +/* ContextSubstFormat1 */ + +static HB_Error Load_ContextSubst1( HB_ContextSubstFormat1* csf1, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_SubRuleSet* srs; + + + base_offset = FILE_Pos() - 2L; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &csf1->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = csf1->SubRuleSetCount = GET_UShort(); + + FORGET_Frame(); + + csf1->SubRuleSet = NULL; + + if ( ALLOC_ARRAY( csf1->SubRuleSet, count, HB_SubRuleSet ) ) + goto Fail2; + + srs = csf1->SubRuleSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_SubRuleSet( &srs[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_SubRuleSet( &srs[m] ); + + FREE( srs ); + +Fail2: + _HB_OPEN_Free_Coverage( &csf1->Coverage ); + return error; +} + + +static void Free_ContextSubst1( HB_ContextSubstFormat1* csf1 ) +{ + HB_UShort n, count; + + HB_SubRuleSet* srs; + + + if ( csf1->SubRuleSet ) + { + count = csf1->SubRuleSetCount; + srs = csf1->SubRuleSet; + + for ( n = 0; n < count; n++ ) + Free_SubRuleSet( &srs[n] ); + + FREE( srs ); + } + + _HB_OPEN_Free_Coverage( &csf1->Coverage ); +} + + +/* SubClassRule */ + +static HB_Error Load_SubClassRule( HB_ContextSubstFormat2* csf2, + HB_SubClassRule* scr, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_UShort* c; + HB_SubstLookupRecord* slr; + + + if ( ACCESS_Frame( 4L ) ) + return error; + + scr->GlyphCount = GET_UShort(); + scr->SubstCount = GET_UShort(); + + if ( scr->GlyphCount > csf2->MaxContextLength ) + csf2->MaxContextLength = scr->GlyphCount; + + FORGET_Frame(); + + scr->Class = NULL; + + count = scr->GlyphCount - 1; /* only GlyphCount - 1 elements */ + + if ( ALLOC_ARRAY( scr->Class, count, HB_UShort ) ) + return error; + + c = scr->Class; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail2; + + for ( n = 0; n < count; n++ ) + c[n] = GET_UShort(); + + FORGET_Frame(); + + scr->SubstLookupRecord = NULL; + + count = scr->SubstCount; + + if ( ALLOC_ARRAY( scr->SubstLookupRecord, count, HB_SubstLookupRecord ) ) + goto Fail2; + + slr = scr->SubstLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + slr[n].SequenceIndex = GET_UShort(); + slr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( slr ); + +Fail2: + FREE( c ); + return error; +} + + +static void Free_SubClassRule( HB_SubClassRule* scr ) +{ + FREE( scr->SubstLookupRecord ); + FREE( scr->Class ); +} + + +/* SubClassSet */ + +static HB_Error Load_SubClassSet( HB_ContextSubstFormat2* csf2, + HB_SubClassSet* scs, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_SubClassRule* scr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = scs->SubClassRuleCount = GET_UShort(); + + FORGET_Frame(); + + scs->SubClassRule = NULL; + + if ( ALLOC_ARRAY( scs->SubClassRule, count, HB_SubClassRule ) ) + return error; + + scr = scs->SubClassRule; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_SubClassRule( csf2, &scr[n], + stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_SubClassRule( &scr[m] ); + + FREE( scr ); + return error; +} + + +static void Free_SubClassSet( HB_SubClassSet* scs ) +{ + HB_UShort n, count; + + HB_SubClassRule* scr; + + + if ( scs->SubClassRule ) + { + count = scs->SubClassRuleCount; + scr = scs->SubClassRule; + + for ( n = 0; n < count; n++ ) + Free_SubClassRule( &scr[n] ); + + FREE( scr ); + } +} + + +/* ContextSubstFormat2 */ + +static HB_Error Load_ContextSubst2( HB_ContextSubstFormat2* csf2, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_SubClassSet* scs; + + + base_offset = FILE_Pos() - 2; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &csf2->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 4L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + /* `SubClassSetCount' is the upper limit for class values, thus we + read it now to make an additional safety check. */ + + count = csf2->SubClassSetCount = GET_UShort(); + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_ClassDefinition( &csf2->ClassDef, count, + stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + + csf2->SubClassSet = NULL; + csf2->MaxContextLength = 0; + + if ( ALLOC_ARRAY( csf2->SubClassSet, count, HB_SubClassSet ) ) + goto Fail2; + + scs = csf2->SubClassSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + if ( new_offset != base_offset ) /* not a NULL offset */ + { + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_SubClassSet( csf2, &scs[n], + stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + else + { + /* we create a SubClassSet table with no entries */ + + csf2->SubClassSet[n].SubClassRuleCount = 0; + csf2->SubClassSet[n].SubClassRule = NULL; + } + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_SubClassSet( &scs[m] ); + + FREE( scs ); + +Fail2: + _HB_OPEN_Free_ClassDefinition( &csf2->ClassDef ); + +Fail3: + _HB_OPEN_Free_Coverage( &csf2->Coverage ); + return error; +} + + +static void Free_ContextSubst2( HB_ContextSubstFormat2* csf2 ) +{ + HB_UShort n, count; + + HB_SubClassSet* scs; + + + if ( csf2->SubClassSet ) + { + count = csf2->SubClassSetCount; + scs = csf2->SubClassSet; + + for ( n = 0; n < count; n++ ) + Free_SubClassSet( &scs[n] ); + + FREE( scs ); + } + + _HB_OPEN_Free_ClassDefinition( &csf2->ClassDef ); + _HB_OPEN_Free_Coverage( &csf2->Coverage ); +} + + +/* ContextSubstFormat3 */ + +static HB_Error Load_ContextSubst3( HB_ContextSubstFormat3* csf3, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Coverage* c; + HB_SubstLookupRecord* slr; + + + base_offset = FILE_Pos() - 2L; + + if ( ACCESS_Frame( 4L ) ) + return error; + + csf3->GlyphCount = GET_UShort(); + csf3->SubstCount = GET_UShort(); + + FORGET_Frame(); + + csf3->Coverage = NULL; + + count = csf3->GlyphCount; + + if ( ALLOC_ARRAY( csf3->Coverage, count, HB_Coverage ) ) + return error; + + c = csf3->Coverage; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &c[n], stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + } + + csf3->SubstLookupRecord = NULL; + + count = csf3->SubstCount; + + if ( ALLOC_ARRAY( csf3->SubstLookupRecord, count, + HB_SubstLookupRecord ) ) + goto Fail2; + + slr = csf3->SubstLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + slr[n].SequenceIndex = GET_UShort(); + slr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( slr ); + +Fail2: + for ( m = 0; m < n; m++ ) + _HB_OPEN_Free_Coverage( &c[m] ); + + FREE( c ); + return error; +} + + +static void Free_ContextSubst3( HB_ContextSubstFormat3* csf3 ) +{ + HB_UShort n, count; + + HB_Coverage* c; + + + FREE( csf3->SubstLookupRecord ); + + if ( csf3->Coverage ) + { + count = csf3->GlyphCount; + c = csf3->Coverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } +} + + +/* ContextSubst */ + +static HB_Error Load_ContextSubst( HB_GSUB_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_ContextSubst* cs = &st->context; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + cs->SubstFormat = GET_UShort(); + + FORGET_Frame(); + + switch ( cs->SubstFormat ) + { + case 1: return Load_ContextSubst1( &cs->csf.csf1, stream ); + case 2: return Load_ContextSubst2( &cs->csf.csf2, stream ); + case 3: return Load_ContextSubst3( &cs->csf.csf3, stream ); + default: return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + +static void Free_ContextSubst( HB_GSUB_SubTable* st ) +{ + HB_ContextSubst* cs = &st->context; + + switch ( cs->SubstFormat ) + { + case 1: Free_ContextSubst1( &cs->csf.csf1 ); break; + case 2: Free_ContextSubst2( &cs->csf.csf2 ); break; + case 3: Free_ContextSubst3( &cs->csf.csf3 ); break; + default: break; + } +} + + +static HB_Error Lookup_ContextSubst1( HB_GSUBHeader* gsub, + HB_ContextSubstFormat1* csf1, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_UShort i, j, k, numsr; + HB_Error error; + + HB_SubRule* sr; + HB_GDEFHeader* gdef; + + + gdef = gsub->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &csf1->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + sr = csf1->SubRuleSet[index].SubRule; + numsr = csf1->SubRuleSet[index].SubRuleCount; + + for ( k = 0; k < numsr; k++ ) + { + if ( context_length != 0xFFFF && context_length < sr[k].GlyphCount ) + goto next_subrule; + + if ( buffer->in_pos + sr[k].GlyphCount > buffer->in_length ) + goto next_subrule; /* context is too long */ + + for ( i = 1, j = buffer->in_pos + 1; i < sr[k].GlyphCount; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + sr[k].GlyphCount - i == (HB_Int)buffer->in_length ) + goto next_subrule; + j++; + } + + if ( IN_GLYPH( j ) != sr[k].Input[i - 1] ) + goto next_subrule; + } + + return Do_ContextSubst( gsub, sr[k].GlyphCount, + sr[k].SubstCount, sr[k].SubstLookupRecord, + buffer, + nesting_level ); + next_subrule: + ; + } + + return HB_Err_Not_Covered; +} + + +static HB_Error Lookup_ContextSubst2( HB_GSUBHeader* gsub, + HB_ContextSubstFormat2* csf2, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_Error error; + HB_UShort i, j, k, known_classes; + + HB_UShort* classes; + HB_UShort* cl; + + HB_SubClassSet* scs; + HB_SubClassRule* sr; + HB_GDEFHeader* gdef; + + + gdef = gsub->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + /* Note: The coverage table in format 2 doesn't give an index into + anything. It just lets us know whether or not we need to + do any lookup at all. */ + + error = _HB_OPEN_Coverage_Index( &csf2->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + if (csf2->MaxContextLength < 1) + return HB_Err_Not_Covered; + + if ( ALLOC_ARRAY( classes, csf2->MaxContextLength, HB_UShort ) ) + return error; + + error = _HB_OPEN_Get_Class( &csf2->ClassDef, IN_CURGLYPH(), + &classes[0], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End; + known_classes = 0; + + scs = &csf2->SubClassSet[classes[0]]; + if ( !scs ) + { + error = ERR(HB_Err_Invalid_SubTable); + goto End; + } + + for ( k = 0; k < scs->SubClassRuleCount; k++ ) + { + sr = &scs->SubClassRule[k]; + + if ( context_length != 0xFFFF && context_length < sr->GlyphCount ) + goto next_subclassrule; + + if ( buffer->in_pos + sr->GlyphCount > buffer->in_length ) + goto next_subclassrule; /* context is too long */ + + cl = sr->Class; + + /* Start at 1 because [0] is implied */ + + for ( i = 1, j = buffer->in_pos + 1; i < sr->GlyphCount; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + goto End; + + if ( j + sr->GlyphCount - i < (HB_Int)buffer->in_length ) + goto next_subclassrule; + j++; + } + + if ( i > known_classes ) + { + /* Keeps us from having to do this for each rule */ + + error = _HB_OPEN_Get_Class( &csf2->ClassDef, IN_GLYPH( j ), &classes[i], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End; + known_classes = i; + } + + if ( cl[i - 1] != classes[i] ) + goto next_subclassrule; + } + + error = Do_ContextSubst( gsub, sr->GlyphCount, + sr->SubstCount, sr->SubstLookupRecord, + buffer, + nesting_level ); + goto End; + + next_subclassrule: + ; + } + + error = HB_Err_Not_Covered; + +End: + FREE( classes ); + return error; +} + + +static HB_Error Lookup_ContextSubst3( HB_GSUBHeader* gsub, + HB_ContextSubstFormat3* csf3, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_Error error; + HB_UShort index, i, j, property; + + HB_Coverage* c; + HB_GDEFHeader* gdef; + + + gdef = gsub->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + if ( context_length != 0xFFFF && context_length < csf3->GlyphCount ) + return HB_Err_Not_Covered; + + if ( buffer->in_pos + csf3->GlyphCount > buffer->in_length ) + return HB_Err_Not_Covered; /* context is too long */ + + c = csf3->Coverage; + + for ( i = 1, j = buffer->in_pos + 1; i < csf3->GlyphCount; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + csf3->GlyphCount - i == (HB_Int)buffer->in_length ) + return HB_Err_Not_Covered; + j++; + } + + error = _HB_OPEN_Coverage_Index( &c[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + + return Do_ContextSubst( gsub, csf3->GlyphCount, + csf3->SubstCount, csf3->SubstLookupRecord, + buffer, + nesting_level ); +} + + +static HB_Error Lookup_ContextSubst( HB_GSUBHeader* gsub, + HB_GSUB_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_ContextSubst* cs = &st->context; + + switch ( cs->SubstFormat ) + { + case 1: return Lookup_ContextSubst1( gsub, &cs->csf.csf1, buffer, flags, context_length, nesting_level ); + case 2: return Lookup_ContextSubst2( gsub, &cs->csf.csf2, buffer, flags, context_length, nesting_level ); + case 3: return Lookup_ContextSubst3( gsub, &cs->csf.csf3, buffer, flags, context_length, nesting_level ); + default: return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + +/* LookupType 6 */ + +/* ChainSubRule */ + +static HB_Error Load_ChainSubRule( HB_ChainSubRule* csr, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + HB_UShort* b; + HB_UShort* i; + HB_UShort* l; + + HB_SubstLookupRecord* slr; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + csr->BacktrackGlyphCount = GET_UShort(); + + FORGET_Frame(); + + csr->Backtrack = NULL; + + count = csr->BacktrackGlyphCount; + + if ( ALLOC_ARRAY( csr->Backtrack, count, HB_UShort ) ) + return error; + + b = csr->Backtrack; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail4; + + for ( n = 0; n < count; n++ ) + b[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + csr->InputGlyphCount = GET_UShort(); + + FORGET_Frame(); + + csr->Input = NULL; + + count = csr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */ + + if ( ALLOC_ARRAY( csr->Input, count, HB_UShort ) ) + goto Fail4; + + i = csr->Input; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail3; + + for ( n = 0; n < count; n++ ) + i[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + csr->LookaheadGlyphCount = GET_UShort(); + + FORGET_Frame(); + + csr->Lookahead = NULL; + + count = csr->LookaheadGlyphCount; + + if ( ALLOC_ARRAY( csr->Lookahead, count, HB_UShort ) ) + goto Fail3; + + l = csr->Lookahead; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail2; + + for ( n = 0; n < count; n++ ) + l[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + csr->SubstCount = GET_UShort(); + + FORGET_Frame(); + + csr->SubstLookupRecord = NULL; + + count = csr->SubstCount; + + if ( ALLOC_ARRAY( csr->SubstLookupRecord, count, HB_SubstLookupRecord ) ) + goto Fail2; + + slr = csr->SubstLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + slr[n].SequenceIndex = GET_UShort(); + slr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( slr ); + +Fail2: + FREE( l ); + +Fail3: + FREE( i ); + +Fail4: + FREE( b ); + return error; +} + + +static void Free_ChainSubRule( HB_ChainSubRule* csr ) +{ + FREE( csr->SubstLookupRecord ); + FREE( csr->Lookahead ); + FREE( csr->Input ); + FREE( csr->Backtrack ); +} + + +/* ChainSubRuleSet */ + +static HB_Error Load_ChainSubRuleSet( HB_ChainSubRuleSet* csrs, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ChainSubRule* csr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = csrs->ChainSubRuleCount = GET_UShort(); + + FORGET_Frame(); + + csrs->ChainSubRule = NULL; + + if ( ALLOC_ARRAY( csrs->ChainSubRule, count, HB_ChainSubRule ) ) + return error; + + csr = csrs->ChainSubRule; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_ChainSubRule( &csr[n], stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_ChainSubRule( &csr[m] ); + + FREE( csr ); + return error; +} + + +static void Free_ChainSubRuleSet( HB_ChainSubRuleSet* csrs ) +{ + HB_UShort n, count; + + HB_ChainSubRule* csr; + + + if ( csrs->ChainSubRule ) + { + count = csrs->ChainSubRuleCount; + csr = csrs->ChainSubRule; + + for ( n = 0; n < count; n++ ) + Free_ChainSubRule( &csr[n] ); + + FREE( csr ); + } +} + + +/* ChainContextSubstFormat1 */ + +static HB_Error Load_ChainContextSubst1( + HB_ChainContextSubstFormat1* ccsf1, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ChainSubRuleSet* csrs; + + + base_offset = FILE_Pos() - 2L; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &ccsf1->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = ccsf1->ChainSubRuleSetCount = GET_UShort(); + + FORGET_Frame(); + + ccsf1->ChainSubRuleSet = NULL; + + if ( ALLOC_ARRAY( ccsf1->ChainSubRuleSet, count, HB_ChainSubRuleSet ) ) + goto Fail2; + + csrs = ccsf1->ChainSubRuleSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_ChainSubRuleSet( &csrs[n], stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_ChainSubRuleSet( &csrs[m] ); + + FREE( csrs ); + +Fail2: + _HB_OPEN_Free_Coverage( &ccsf1->Coverage ); + return error; +} + + +static void Free_ChainContextSubst1( HB_ChainContextSubstFormat1* ccsf1 ) +{ + HB_UShort n, count; + + HB_ChainSubRuleSet* csrs; + + + if ( ccsf1->ChainSubRuleSet ) + { + count = ccsf1->ChainSubRuleSetCount; + csrs = ccsf1->ChainSubRuleSet; + + for ( n = 0; n < count; n++ ) + Free_ChainSubRuleSet( &csrs[n] ); + + FREE( csrs ); + } + + _HB_OPEN_Free_Coverage( &ccsf1->Coverage ); +} + + +/* ChainSubClassRule */ + +static HB_Error Load_ChainSubClassRule( + HB_ChainContextSubstFormat2* ccsf2, + HB_ChainSubClassRule* cscr, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_UShort* b; + HB_UShort* i; + HB_UShort* l; + HB_SubstLookupRecord* slr; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + cscr->BacktrackGlyphCount = GET_UShort(); + + FORGET_Frame(); + + if ( cscr->BacktrackGlyphCount > ccsf2->MaxBacktrackLength ) + ccsf2->MaxBacktrackLength = cscr->BacktrackGlyphCount; + + cscr->Backtrack = NULL; + + count = cscr->BacktrackGlyphCount; + + if ( ALLOC_ARRAY( cscr->Backtrack, count, HB_UShort ) ) + return error; + + b = cscr->Backtrack; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail4; + + for ( n = 0; n < count; n++ ) + b[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + cscr->InputGlyphCount = GET_UShort(); + + FORGET_Frame(); + + if ( cscr->InputGlyphCount > ccsf2->MaxInputLength ) + ccsf2->MaxInputLength = cscr->InputGlyphCount; + + cscr->Input = NULL; + + count = cscr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */ + + if ( ALLOC_ARRAY( cscr->Input, count, HB_UShort ) ) + goto Fail4; + + i = cscr->Input; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail3; + + for ( n = 0; n < count; n++ ) + i[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + cscr->LookaheadGlyphCount = GET_UShort(); + + FORGET_Frame(); + + if ( cscr->LookaheadGlyphCount > ccsf2->MaxLookaheadLength ) + ccsf2->MaxLookaheadLength = cscr->LookaheadGlyphCount; + + cscr->Lookahead = NULL; + + count = cscr->LookaheadGlyphCount; + + if ( ALLOC_ARRAY( cscr->Lookahead, count, HB_UShort ) ) + goto Fail3; + + l = cscr->Lookahead; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail2; + + for ( n = 0; n < count; n++ ) + l[n] = GET_UShort(); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + cscr->SubstCount = GET_UShort(); + + FORGET_Frame(); + + cscr->SubstLookupRecord = NULL; + + count = cscr->SubstCount; + + if ( ALLOC_ARRAY( cscr->SubstLookupRecord, count, + HB_SubstLookupRecord ) ) + goto Fail2; + + slr = cscr->SubstLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + slr[n].SequenceIndex = GET_UShort(); + slr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( slr ); + +Fail2: + FREE( l ); + +Fail3: + FREE( i ); + +Fail4: + FREE( b ); + return error; +} + + +static void Free_ChainSubClassRule( HB_ChainSubClassRule* cscr ) +{ + FREE( cscr->SubstLookupRecord ); + FREE( cscr->Lookahead ); + FREE( cscr->Input ); + FREE( cscr->Backtrack ); +} + + +/* SubClassSet */ + +static HB_Error Load_ChainSubClassSet( + HB_ChainContextSubstFormat2* ccsf2, + HB_ChainSubClassSet* cscs, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ChainSubClassRule* cscr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = cscs->ChainSubClassRuleCount = GET_UShort(); + + FORGET_Frame(); + + cscs->ChainSubClassRule = NULL; + + if ( ALLOC_ARRAY( cscs->ChainSubClassRule, count, + HB_ChainSubClassRule ) ) + return error; + + cscr = cscs->ChainSubClassRule; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_ChainSubClassRule( ccsf2, &cscr[n], + stream ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_ChainSubClassRule( &cscr[m] ); + + FREE( cscr ); + return error; +} + + +static void Free_ChainSubClassSet( HB_ChainSubClassSet* cscs ) +{ + HB_UShort n, count; + + HB_ChainSubClassRule* cscr; + + + if ( cscs->ChainSubClassRule ) + { + count = cscs->ChainSubClassRuleCount; + cscr = cscs->ChainSubClassRule; + + for ( n = 0; n < count; n++ ) + Free_ChainSubClassRule( &cscr[n] ); + + FREE( cscr ); + } +} + + +/* ChainContextSubstFormat2 */ + +static HB_Error Load_ChainContextSubst2( + HB_ChainContextSubstFormat2* ccsf2, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n = 0, m, count; + HB_UInt cur_offset, new_offset, base_offset; + HB_UInt backtrack_offset, input_offset, lookahead_offset; + + HB_ChainSubClassSet* cscs; + + + base_offset = FILE_Pos() - 2; + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &ccsf2->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + if ( ACCESS_Frame( 8L ) ) + goto Fail5; + + backtrack_offset = GET_UShort(); + input_offset = GET_UShort(); + lookahead_offset = GET_UShort(); + + /* `ChainSubClassSetCount' is the upper limit for input class values, + thus we read it now to make an additional safety check. No limit + is known or needed for the other two class definitions */ + + count = ccsf2->ChainSubClassSetCount = GET_UShort(); + + FORGET_Frame(); + + if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->BacktrackClassDef, 65535, + backtrack_offset, base_offset, + stream ) ) != HB_Err_Ok ) + goto Fail5; + + if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->InputClassDef, count, + input_offset, base_offset, + stream ) ) != HB_Err_Ok ) + goto Fail4; + if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->LookaheadClassDef, 65535, + lookahead_offset, base_offset, + stream ) ) != HB_Err_Ok ) + goto Fail3; + + ccsf2->ChainSubClassSet = NULL; + ccsf2->MaxBacktrackLength = 0; + ccsf2->MaxInputLength = 0; + ccsf2->MaxLookaheadLength = 0; + + if ( ALLOC_ARRAY( ccsf2->ChainSubClassSet, count, HB_ChainSubClassSet ) ) + goto Fail2; + + cscs = ccsf2->ChainSubClassSet; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + if ( new_offset != base_offset ) /* not a NULL offset */ + { + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_ChainSubClassSet( ccsf2, &cscs[n], + stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + else + { + /* we create a ChainSubClassSet table with no entries */ + + ccsf2->ChainSubClassSet[n].ChainSubClassRuleCount = 0; + ccsf2->ChainSubClassSet[n].ChainSubClassRule = NULL; + } + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_ChainSubClassSet( &cscs[m] ); + + FREE( cscs ); + +Fail2: + _HB_OPEN_Free_ClassDefinition( &ccsf2->LookaheadClassDef ); + +Fail3: + _HB_OPEN_Free_ClassDefinition( &ccsf2->InputClassDef ); + +Fail4: + _HB_OPEN_Free_ClassDefinition( &ccsf2->BacktrackClassDef ); + +Fail5: + _HB_OPEN_Free_Coverage( &ccsf2->Coverage ); + return error; +} + + +static void Free_ChainContextSubst2( HB_ChainContextSubstFormat2* ccsf2 ) +{ + HB_UShort n, count; + + HB_ChainSubClassSet* cscs; + + + if ( ccsf2->ChainSubClassSet ) + { + count = ccsf2->ChainSubClassSetCount; + cscs = ccsf2->ChainSubClassSet; + + for ( n = 0; n < count; n++ ) + Free_ChainSubClassSet( &cscs[n] ); + + FREE( cscs ); + } + + _HB_OPEN_Free_ClassDefinition( &ccsf2->LookaheadClassDef ); + _HB_OPEN_Free_ClassDefinition( &ccsf2->InputClassDef ); + _HB_OPEN_Free_ClassDefinition( &ccsf2->BacktrackClassDef ); + + _HB_OPEN_Free_Coverage( &ccsf2->Coverage ); +} + + +/* ChainContextSubstFormat3 */ + +static HB_Error Load_ChainContextSubst3( + HB_ChainContextSubstFormat3* ccsf3, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, nb = 0, ni =0, nl = 0, m, count; + HB_UShort backtrack_count, input_count, lookahead_count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Coverage* b; + HB_Coverage* i; + HB_Coverage* l; + HB_SubstLookupRecord* slr; + + + base_offset = FILE_Pos() - 2L; + + if ( ACCESS_Frame( 2L ) ) + return error; + + ccsf3->BacktrackGlyphCount = GET_UShort(); + + FORGET_Frame(); + + ccsf3->BacktrackCoverage = NULL; + + backtrack_count = ccsf3->BacktrackGlyphCount; + + if ( ALLOC_ARRAY( ccsf3->BacktrackCoverage, backtrack_count, + HB_Coverage ) ) + return error; + + b = ccsf3->BacktrackCoverage; + + for ( nb = 0; nb < backtrack_count; nb++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok ) + goto Fail4; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + ccsf3->InputGlyphCount = GET_UShort(); + + FORGET_Frame(); + + ccsf3->InputCoverage = NULL; + + input_count = ccsf3->InputGlyphCount; + + if ( ALLOC_ARRAY( ccsf3->InputCoverage, input_count, HB_Coverage ) ) + goto Fail4; + + i = ccsf3->InputCoverage; + + for ( ni = 0; ni < input_count; ni++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &i[ni], stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + ccsf3->LookaheadGlyphCount = GET_UShort(); + + FORGET_Frame(); + + ccsf3->LookaheadCoverage = NULL; + + lookahead_count = ccsf3->LookaheadGlyphCount; + + if ( ALLOC_ARRAY( ccsf3->LookaheadCoverage, lookahead_count, + HB_Coverage ) ) + goto Fail3; + + l = ccsf3->LookaheadCoverage; + + for ( nl = 0; nl < lookahead_count; nl++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + ccsf3->SubstCount = GET_UShort(); + + FORGET_Frame(); + + ccsf3->SubstLookupRecord = NULL; + + count = ccsf3->SubstCount; + + if ( ALLOC_ARRAY( ccsf3->SubstLookupRecord, count, + HB_SubstLookupRecord ) ) + goto Fail2; + + slr = ccsf3->SubstLookupRecord; + + if ( ACCESS_Frame( count * 4L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + { + slr[n].SequenceIndex = GET_UShort(); + slr[n].LookupListIndex = GET_UShort(); + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( slr ); + +Fail2: + for ( m = 0; m < nl; m++ ) + _HB_OPEN_Free_Coverage( &l[m] ); + + FREE( l ); + +Fail3: + for ( m = 0; m < ni; m++ ) + _HB_OPEN_Free_Coverage( &i[m] ); + + FREE( i ); + +Fail4: + for ( m = 0; m < nb; m++ ) + _HB_OPEN_Free_Coverage( &b[m] ); + + FREE( b ); + return error; +} + + +static void Free_ChainContextSubst3( HB_ChainContextSubstFormat3* ccsf3 ) +{ + HB_UShort n, count; + + HB_Coverage* c; + + + FREE( ccsf3->SubstLookupRecord ); + + if ( ccsf3->LookaheadCoverage ) + { + count = ccsf3->LookaheadGlyphCount; + c = ccsf3->LookaheadCoverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } + + if ( ccsf3->InputCoverage ) + { + count = ccsf3->InputGlyphCount; + c = ccsf3->InputCoverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } + + if ( ccsf3->BacktrackCoverage ) + { + count = ccsf3->BacktrackGlyphCount; + c = ccsf3->BacktrackCoverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } +} + + +/* ChainContextSubst */ + +static HB_Error Load_ChainContextSubst( HB_GSUB_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_ChainContextSubst* ccs = &st->chain; + + if ( ACCESS_Frame( 2L ) ) + return error; + + ccs->SubstFormat = GET_UShort(); + + FORGET_Frame(); + + switch ( ccs->SubstFormat ) { + case 1: return Load_ChainContextSubst1( &ccs->ccsf.ccsf1, stream ); + case 2: return Load_ChainContextSubst2( &ccs->ccsf.ccsf2, stream ); + case 3: return Load_ChainContextSubst3( &ccs->ccsf.ccsf3, stream ); + default: return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + +static void Free_ChainContextSubst( HB_GSUB_SubTable* st ) +{ + HB_ChainContextSubst* ccs = &st->chain; + + switch ( ccs->SubstFormat ) { + case 1: Free_ChainContextSubst1( &ccs->ccsf.ccsf1 ); break; + case 2: Free_ChainContextSubst2( &ccs->ccsf.ccsf2 ); break; + case 3: Free_ChainContextSubst3( &ccs->ccsf.ccsf3 ); break; + default: break; + } +} + + +static HB_Error Lookup_ChainContextSubst1( HB_GSUBHeader* gsub, + HB_ChainContextSubstFormat1* ccsf1, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_UShort i, j, k, num_csr; + HB_UShort bgc, igc, lgc; + HB_Error error; + + HB_ChainSubRule* csr; + HB_ChainSubRule curr_csr; + HB_GDEFHeader* gdef; + + + gdef = gsub->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + error = _HB_OPEN_Coverage_Index( &ccsf1->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + csr = ccsf1->ChainSubRuleSet[index].ChainSubRule; + num_csr = ccsf1->ChainSubRuleSet[index].ChainSubRuleCount; + + for ( k = 0; k < num_csr; k++ ) + { + curr_csr = csr[k]; + bgc = curr_csr.BacktrackGlyphCount; + igc = curr_csr.InputGlyphCount; + lgc = curr_csr.LookaheadGlyphCount; + + if ( context_length != 0xFFFF && context_length < igc ) + goto next_chainsubrule; + + /* check whether context is too long; it is a first guess only */ + + if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length ) + goto next_chainsubrule; + + if ( bgc ) + { + /* since we don't know in advance the number of glyphs to inspect, + we search backwards for matches in the backtrack glyph array */ + + for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- ) + { + while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + 1 == bgc - i ) + goto next_chainsubrule; + j--; + } + + /* In OpenType 1.3, it is undefined whether the offsets of + backtrack glyphs is in logical order or not. Version 1.4 + will clarify this: + + Logical order - a b c d e f g h i j + i + Input offsets - 0 1 + Backtrack offsets - 3 2 1 0 + Lookahead offsets - 0 1 2 3 */ + + if ( OUT_GLYPH( j ) != curr_csr.Backtrack[i] ) + goto next_chainsubrule; + } + } + + /* Start at 1 because [0] is implied */ + + for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) + goto next_chainsubrule; + j++; + } + + if ( IN_GLYPH( j ) != curr_csr.Input[i - 1] ) + goto next_chainsubrule; + } + + /* we are starting to check for lookahead glyphs right after the + last context glyph */ + + for ( i = 0; i < lgc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + lgc - i == (HB_Int)buffer->in_length ) + goto next_chainsubrule; + j++; + } + + if ( IN_GLYPH( j ) != curr_csr.Lookahead[i] ) + goto next_chainsubrule; + } + + return Do_ContextSubst( gsub, igc, + curr_csr.SubstCount, + curr_csr.SubstLookupRecord, + buffer, + nesting_level ); + + next_chainsubrule: + ; + } + + return HB_Err_Not_Covered; +} + + +static HB_Error Lookup_ChainContextSubst2( HB_GSUBHeader* gsub, + HB_ChainContextSubstFormat2* ccsf2, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, property; + HB_Error error; + HB_UShort i, j, k; + HB_UShort bgc, igc, lgc; + HB_UShort known_backtrack_classes, + known_input_classes, + known_lookahead_classes; + + HB_UShort* backtrack_classes; + HB_UShort* input_classes; + HB_UShort* lookahead_classes; + + HB_UShort* bc; + HB_UShort* ic; + HB_UShort* lc; + + HB_ChainSubClassSet* cscs; + HB_ChainSubClassRule ccsr; + HB_GDEFHeader* gdef; + + + gdef = gsub->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + /* Note: The coverage table in format 2 doesn't give an index into + anything. It just lets us know whether or not we need to + do any lookup at all. */ + + error = _HB_OPEN_Coverage_Index( &ccsf2->Coverage, IN_CURGLYPH(), &index ); + if ( error ) + return error; + + if ( ALLOC_ARRAY( backtrack_classes, ccsf2->MaxBacktrackLength, HB_UShort ) ) + return error; + known_backtrack_classes = 0; + + if (ccsf2->MaxInputLength < 1) + return HB_Err_Not_Covered; + + if ( ALLOC_ARRAY( input_classes, ccsf2->MaxInputLength, HB_UShort ) ) + goto End3; + known_input_classes = 1; + + if ( ALLOC_ARRAY( lookahead_classes, ccsf2->MaxLookaheadLength, HB_UShort ) ) + goto End2; + known_lookahead_classes = 0; + + error = _HB_OPEN_Get_Class( &ccsf2->InputClassDef, IN_CURGLYPH(), + &input_classes[0], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End1; + + cscs = &ccsf2->ChainSubClassSet[input_classes[0]]; + if ( !cscs ) + { + error = ERR(HB_Err_Invalid_SubTable); + goto End1; + } + + for ( k = 0; k < cscs->ChainSubClassRuleCount; k++ ) + { + ccsr = cscs->ChainSubClassRule[k]; + bgc = ccsr.BacktrackGlyphCount; + igc = ccsr.InputGlyphCount; + lgc = ccsr.LookaheadGlyphCount; + + if ( context_length != 0xFFFF && context_length < igc ) + goto next_chainsubclassrule; + + /* check whether context is too long; it is a first guess only */ + + if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length ) + goto next_chainsubclassrule; + + if ( bgc ) + { + /* Since we don't know in advance the number of glyphs to inspect, + we search backwards for matches in the backtrack glyph array. + Note that `known_backtrack_classes' starts at index 0. */ + + bc = ccsr.Backtrack; + + for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- ) + { + while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + goto End1; + + if ( j + 1 == bgc - i ) + goto next_chainsubclassrule; + j--; + } + + if ( i >= known_backtrack_classes ) + { + /* Keeps us from having to do this for each rule */ + + error = _HB_OPEN_Get_Class( &ccsf2->BacktrackClassDef, OUT_GLYPH( j ), + &backtrack_classes[i], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End1; + known_backtrack_classes = i; + } + + if ( bc[i] != backtrack_classes[i] ) + goto next_chainsubclassrule; + } + } + + ic = ccsr.Input; + + /* Start at 1 because [0] is implied */ + + for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + goto End1; + + if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) + goto next_chainsubclassrule; + j++; + } + + if ( i >= known_input_classes ) + { + error = _HB_OPEN_Get_Class( &ccsf2->InputClassDef, IN_GLYPH( j ), + &input_classes[i], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End1; + known_input_classes = i; + } + + if ( ic[i - 1] != input_classes[i] ) + goto next_chainsubclassrule; + } + + /* we are starting to check for lookahead glyphs right after the + last context glyph */ + + lc = ccsr.Lookahead; + + for ( i = 0; i < lgc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + goto End1; + + if ( j + lgc - i == (HB_Int)buffer->in_length ) + goto next_chainsubclassrule; + j++; + } + + if ( i >= known_lookahead_classes ) + { + error = _HB_OPEN_Get_Class( &ccsf2->LookaheadClassDef, IN_GLYPH( j ), + &lookahead_classes[i], NULL ); + if ( error && error != HB_Err_Not_Covered ) + goto End1; + known_lookahead_classes = i; + } + + if ( lc[i] != lookahead_classes[i] ) + goto next_chainsubclassrule; + } + + error = Do_ContextSubst( gsub, igc, + ccsr.SubstCount, + ccsr.SubstLookupRecord, + buffer, + nesting_level ); + goto End1; + + next_chainsubclassrule: + ; + } + + error = HB_Err_Not_Covered; + +End1: + FREE( lookahead_classes ); + +End2: + FREE( input_classes ); + +End3: + FREE( backtrack_classes ); + return error; +} + + +static HB_Error Lookup_ChainContextSubst3( HB_GSUBHeader* gsub, + HB_ChainContextSubstFormat3* ccsf3, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, i, j, property; + HB_UShort bgc, igc, lgc; + HB_Error error; + + HB_Coverage* bc; + HB_Coverage* ic; + HB_Coverage* lc; + HB_GDEFHeader* gdef; + + + gdef = gsub->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + bgc = ccsf3->BacktrackGlyphCount; + igc = ccsf3->InputGlyphCount; + lgc = ccsf3->LookaheadGlyphCount; + + if ( context_length != 0xFFFF && context_length < igc ) + return HB_Err_Not_Covered; + + /* check whether context is too long; it is a first guess only */ + + if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length ) + return HB_Err_Not_Covered; + + if ( bgc ) + { + /* Since we don't know in advance the number of glyphs to inspect, + we search backwards for matches in the backtrack glyph array */ + + bc = ccsf3->BacktrackCoverage; + + for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- ) + { + while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + 1 == bgc - i ) + return HB_Err_Not_Covered; + j--; + } + + error = _HB_OPEN_Coverage_Index( &bc[i], OUT_GLYPH( j ), &index ); + if ( error ) + return error; + } + } + + ic = ccsf3->InputCoverage; + + for ( i = 0, j = buffer->in_pos; i < igc; i++, j++ ) + { + /* We already called CHECK_Property for IN_GLYPH( buffer->in_pos ) */ + while ( j > buffer->in_pos && CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) + return HB_Err_Not_Covered; + j++; + } + + error = _HB_OPEN_Coverage_Index( &ic[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + + /* we are starting for lookahead glyphs right after the last context + glyph */ + + lc = ccsf3->LookaheadCoverage; + + for ( i = 0; i < lgc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + lgc - i == (HB_Int)buffer->in_length ) + return HB_Err_Not_Covered; + j++; + } + + error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + + return Do_ContextSubst( gsub, igc, + ccsf3->SubstCount, + ccsf3->SubstLookupRecord, + buffer, + nesting_level ); +} + + +static HB_Error Lookup_ChainContextSubst( HB_GSUBHeader* gsub, + HB_GSUB_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_ChainContextSubst* ccs = &st->chain; + + switch ( ccs->SubstFormat ) { + case 1: return Lookup_ChainContextSubst1( gsub, &ccs->ccsf.ccsf1, buffer, flags, context_length, nesting_level ); + case 2: return Lookup_ChainContextSubst2( gsub, &ccs->ccsf.ccsf2, buffer, flags, context_length, nesting_level ); + case 3: return Lookup_ChainContextSubst3( gsub, &ccs->ccsf.ccsf3, buffer, flags, context_length, nesting_level ); + default: return ERR(HB_Err_Invalid_SubTable_Format); + } +} + + +static HB_Error Load_ReverseChainContextSubst( HB_GSUB_SubTable* st, + HB_Stream stream ) +{ + HB_Error error; + HB_ReverseChainContextSubst* rccs = &st->reverse; + + HB_UShort m, count; + + HB_UShort nb = 0, nl = 0, n; + HB_UShort backtrack_count, lookahead_count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Coverage* b; + HB_Coverage* l; + HB_UShort* sub; + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + rccs->SubstFormat = GET_UShort(); + + if ( rccs->SubstFormat != 1 ) + return ERR(HB_Err_Invalid_SubTable_Format); + + FORGET_Frame(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &rccs->Coverage, stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + + + if ( ACCESS_Frame( 2L ) ) + goto Fail4; + + rccs->BacktrackGlyphCount = GET_UShort(); + + FORGET_Frame(); + + rccs->BacktrackCoverage = NULL; + + backtrack_count = rccs->BacktrackGlyphCount; + + if ( ALLOC_ARRAY( rccs->BacktrackCoverage, backtrack_count, + HB_Coverage ) ) + goto Fail4; + + b = rccs->BacktrackCoverage; + + for ( nb = 0; nb < backtrack_count; nb++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok ) + goto Fail3; + (void)FILE_Seek( cur_offset ); + } + + + if ( ACCESS_Frame( 2L ) ) + goto Fail3; + + rccs->LookaheadGlyphCount = GET_UShort(); + + FORGET_Frame(); + + rccs->LookaheadCoverage = NULL; + + lookahead_count = rccs->LookaheadGlyphCount; + + if ( ALLOC_ARRAY( rccs->LookaheadCoverage, lookahead_count, + HB_Coverage ) ) + goto Fail3; + + l = rccs->LookaheadCoverage; + + for ( nl = 0; nl < lookahead_count; nl++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok ) + goto Fail2; + (void)FILE_Seek( cur_offset ); + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + rccs->GlyphCount = GET_UShort(); + + FORGET_Frame(); + + rccs->Substitute = NULL; + + count = rccs->GlyphCount; + + if ( ALLOC_ARRAY( rccs->Substitute, count, + HB_UShort ) ) + goto Fail2; + + sub = rccs->Substitute; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail1; + + for ( n = 0; n < count; n++ ) + sub[n] = GET_UShort(); + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail1: + FREE( sub ); + +Fail2: + for ( m = 0; m < nl; m++ ) + _HB_OPEN_Free_Coverage( &l[m] ); + + FREE( l ); + +Fail3: + for ( m = 0; m < nb; m++ ) + _HB_OPEN_Free_Coverage( &b[m] ); + + FREE( b ); + +Fail4: + _HB_OPEN_Free_Coverage( &rccs->Coverage ); + return error; +} + + +static void Free_ReverseChainContextSubst( HB_GSUB_SubTable* st ) +{ + HB_UShort n, count; + HB_ReverseChainContextSubst* rccs = &st->reverse; + + HB_Coverage* c; + + _HB_OPEN_Free_Coverage( &rccs->Coverage ); + + if ( rccs->LookaheadCoverage ) + { + count = rccs->LookaheadGlyphCount; + c = rccs->LookaheadCoverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } + + if ( rccs->BacktrackCoverage ) + { + count = rccs->BacktrackGlyphCount; + c = rccs->BacktrackCoverage; + + for ( n = 0; n < count; n++ ) + _HB_OPEN_Free_Coverage( &c[n] ); + + FREE( c ); + } + + FREE ( rccs->Substitute ); +} + + +static HB_Error Lookup_ReverseChainContextSubst( HB_GSUBHeader* gsub, + HB_GSUB_SubTable* st, + HB_Buffer buffer, + HB_UShort flags, + HB_UShort context_length, + int nesting_level ) +{ + HB_UShort index, input_index, i, j, property; + HB_UShort bgc, lgc; + HB_Error error; + + HB_ReverseChainContextSubst* rccs = &st->reverse; + HB_Coverage* bc; + HB_Coverage* lc; + HB_GDEFHeader* gdef; + + if ( nesting_level != 1 || context_length != 0xFFFF ) + return HB_Err_Not_Covered; + + gdef = gsub->gdef; + + if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) + return error; + + bgc = rccs->BacktrackGlyphCount; + lgc = rccs->LookaheadGlyphCount; + + /* check whether context is too long; it is a first guess only */ + + if ( bgc > buffer->in_pos || buffer->in_pos + 1 + lgc > buffer->in_length ) + return HB_Err_Not_Covered; + + if ( bgc ) + { + /* Since we don't know in advance the number of glyphs to inspect, + we search backwards for matches in the backtrack glyph array */ + + bc = rccs->BacktrackCoverage; + + for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + 1 == bgc - i ) + return HB_Err_Not_Covered; + j--; + } + + error = _HB_OPEN_Coverage_Index( &bc[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + } + + j = buffer->in_pos; + + error = _HB_OPEN_Coverage_Index( &rccs->Coverage, IN_GLYPH( j ), &input_index ); + if ( error ) + return error; + + lc = rccs->LookaheadCoverage; + + for ( i = 0, j = buffer->in_pos + 1; i < lgc; i++, j++ ) + { + while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) + { + if ( error && error != HB_Err_Not_Covered ) + return error; + + if ( j + lgc - i == (HB_Int)buffer->in_length ) + return HB_Err_Not_Covered; + j++; + } + + error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index ); + if ( error ) + return error; + } + + IN_CURGLYPH() = rccs->Substitute[input_index]; + buffer->in_pos--; /* Reverse! */ + + return error; +} + + + +/*********** + * GSUB API + ***********/ + + + +HB_Error HB_GSUB_Select_Script( HB_GSUBHeader* gsub, + HB_UInt script_tag, + HB_UShort* script_index ) +{ + HB_UShort n; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + + + if ( !gsub || !script_index ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gsub->ScriptList; + sr = sl->ScriptRecord; + + for ( n = 0; n < sl->ScriptCount; n++ ) + if ( script_tag == sr[n].ScriptTag ) + { + *script_index = n; + + return HB_Err_Ok; + } + + return HB_Err_Not_Covered; +} + + + +HB_Error HB_GSUB_Select_Language( HB_GSUBHeader* gsub, + HB_UInt language_tag, + HB_UShort script_index, + HB_UShort* language_index, + HB_UShort* req_feature_index ) +{ + HB_UShort n; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + HB_ScriptTable* s; + HB_LangSysRecord* lsr; + + + if ( !gsub || !language_index || !req_feature_index ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gsub->ScriptList; + sr = sl->ScriptRecord; + + if ( script_index >= sl->ScriptCount ) + return ERR(HB_Err_Invalid_Argument); + + s = &sr[script_index].Script; + lsr = s->LangSysRecord; + + for ( n = 0; n < s->LangSysCount; n++ ) + if ( language_tag == lsr[n].LangSysTag ) + { + *language_index = n; + *req_feature_index = lsr[n].LangSys.ReqFeatureIndex; + + return HB_Err_Ok; + } + + return HB_Err_Not_Covered; +} + + +/* selecting 0xFFFF for language_index asks for the values of the + default language (DefaultLangSys) */ + + +HB_Error HB_GSUB_Select_Feature( HB_GSUBHeader* gsub, + HB_UInt feature_tag, + HB_UShort script_index, + HB_UShort language_index, + HB_UShort* feature_index ) +{ + HB_UShort n; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + HB_ScriptTable* s; + HB_LangSysRecord* lsr; + HB_LangSys* ls; + HB_UShort* fi; + + HB_FeatureList* fl; + HB_FeatureRecord* fr; + + + if ( !gsub || !feature_index ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gsub->ScriptList; + sr = sl->ScriptRecord; + + fl = &gsub->FeatureList; + fr = fl->FeatureRecord; + + if ( script_index >= sl->ScriptCount ) + return ERR(HB_Err_Invalid_Argument); + + s = &sr[script_index].Script; + lsr = s->LangSysRecord; + + if ( language_index == 0xFFFF ) + ls = &s->DefaultLangSys; + else + { + if ( language_index >= s->LangSysCount ) + return ERR(HB_Err_Invalid_Argument); + + ls = &lsr[language_index].LangSys; + } + + fi = ls->FeatureIndex; + + for ( n = 0; n < ls->FeatureCount; n++ ) + { + if ( fi[n] >= fl->FeatureCount ) + return ERR(HB_Err_Invalid_SubTable_Format); + + if ( feature_tag == fr[fi[n]].FeatureTag ) + { + *feature_index = fi[n]; + + return HB_Err_Ok; + } + } + + return HB_Err_Not_Covered; +} + + +/* The next three functions return a null-terminated list */ + + +HB_Error HB_GSUB_Query_Scripts( HB_GSUBHeader* gsub, + HB_UInt** script_tag_list ) +{ + HB_UShort n; + HB_Error error; + HB_UInt* stl; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + + + if ( !gsub || !script_tag_list ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gsub->ScriptList; + sr = sl->ScriptRecord; + + if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, HB_UInt ) ) + return error; + + for ( n = 0; n < sl->ScriptCount; n++ ) + stl[n] = sr[n].ScriptTag; + stl[n] = 0; + + *script_tag_list = stl; + + return HB_Err_Ok; +} + + + +HB_Error HB_GSUB_Query_Languages( HB_GSUBHeader* gsub, + HB_UShort script_index, + HB_UInt** language_tag_list ) +{ + HB_UShort n; + HB_Error error; + HB_UInt* ltl; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + HB_ScriptTable* s; + HB_LangSysRecord* lsr; + + + if ( !gsub || !language_tag_list ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gsub->ScriptList; + sr = sl->ScriptRecord; + + if ( script_index >= sl->ScriptCount ) + return ERR(HB_Err_Invalid_Argument); + + s = &sr[script_index].Script; + lsr = s->LangSysRecord; + + if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, HB_UInt ) ) + return error; + + for ( n = 0; n < s->LangSysCount; n++ ) + ltl[n] = lsr[n].LangSysTag; + ltl[n] = 0; + + *language_tag_list = ltl; + + return HB_Err_Ok; +} + + +/* selecting 0xFFFF for language_index asks for the values of the + default language (DefaultLangSys) */ + + +HB_Error HB_GSUB_Query_Features( HB_GSUBHeader* gsub, + HB_UShort script_index, + HB_UShort language_index, + HB_UInt** feature_tag_list ) +{ + HB_UShort n; + HB_Error error; + HB_UInt* ftl; + + HB_ScriptList* sl; + HB_ScriptRecord* sr; + HB_ScriptTable* s; + HB_LangSysRecord* lsr; + HB_LangSys* ls; + HB_UShort* fi; + + HB_FeatureList* fl; + HB_FeatureRecord* fr; + + + if ( !gsub || !feature_tag_list ) + return ERR(HB_Err_Invalid_Argument); + + sl = &gsub->ScriptList; + sr = sl->ScriptRecord; + + fl = &gsub->FeatureList; + fr = fl->FeatureRecord; + + if ( script_index >= sl->ScriptCount ) + return ERR(HB_Err_Invalid_Argument); + + s = &sr[script_index].Script; + lsr = s->LangSysRecord; + + if ( language_index == 0xFFFF ) + ls = &s->DefaultLangSys; + else + { + if ( language_index >= s->LangSysCount ) + return ERR(HB_Err_Invalid_Argument); + + ls = &lsr[language_index].LangSys; + } + + fi = ls->FeatureIndex; + + if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, HB_UInt ) ) + return error; + + for ( n = 0; n < ls->FeatureCount; n++ ) + { + if ( fi[n] >= fl->FeatureCount ) + { + FREE( ftl ); + return ERR(HB_Err_Invalid_SubTable_Format); + } + ftl[n] = fr[fi[n]].FeatureTag; + } + ftl[n] = 0; + + *feature_tag_list = ftl; + + return HB_Err_Ok; +} + + +/* Do an individual subtable lookup. Returns HB_Err_Ok if substitution + has been done, or HB_Err_Not_Covered if not. */ +static HB_Error GSUB_Do_Glyph_Lookup( HB_GSUBHeader* gsub, + HB_UShort lookup_index, + HB_Buffer buffer, + HB_UShort context_length, + int nesting_level ) +{ + HB_Error error = HB_Err_Not_Covered; + HB_UShort i, flags, lookup_count; + HB_Lookup* lo; + int lookup_type; + + nesting_level++; + + if ( nesting_level > HB_MAX_NESTING_LEVEL ) + return ERR(HB_Err_Not_Covered); /* ERR() call intended */ + + lookup_count = gsub->LookupList.LookupCount; + if (lookup_index >= lookup_count) + return error; + + lo = &gsub->LookupList.Lookup[lookup_index]; + flags = lo->LookupFlag; + lookup_type = lo->LookupType; + + for ( i = 0; i < lo->SubTableCount; i++ ) + { + HB_GSUB_SubTable *st = &lo->SubTable[i].st.gsub; + + switch (lookup_type) { + case HB_GSUB_LOOKUP_SINGLE: + error = Lookup_SingleSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; + case HB_GSUB_LOOKUP_MULTIPLE: + error = Lookup_MultipleSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; + case HB_GSUB_LOOKUP_ALTERNATE: + error = Lookup_AlternateSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; + case HB_GSUB_LOOKUP_LIGATURE: + error = Lookup_LigatureSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; + case HB_GSUB_LOOKUP_CONTEXT: + error = Lookup_ContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; + case HB_GSUB_LOOKUP_CHAIN: + error = Lookup_ChainContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; + /*case HB_GSUB_LOOKUP_EXTENSION: + error = Lookup_ExtensionSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;*/ + case HB_GSUB_LOOKUP_REVERSE_CHAIN: + error = Lookup_ReverseChainContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; + default: + error = HB_Err_Not_Covered; + }; + + /* Check whether we have a successful substitution or an error other + than HB_Err_Not_Covered */ + if ( error != HB_Err_Not_Covered ) + return error; + } + + return HB_Err_Not_Covered; +} + + +HB_INTERNAL HB_Error +_HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st, + HB_Stream stream, + HB_UShort lookup_type ) +{ + switch (lookup_type) { + case HB_GSUB_LOOKUP_SINGLE: return Load_SingleSubst ( st, stream ); + case HB_GSUB_LOOKUP_MULTIPLE: return Load_MultipleSubst ( st, stream ); + case HB_GSUB_LOOKUP_ALTERNATE: return Load_AlternateSubst ( st, stream ); + case HB_GSUB_LOOKUP_LIGATURE: return Load_LigatureSubst ( st, stream ); + case HB_GSUB_LOOKUP_CONTEXT: return Load_ContextSubst ( st, stream ); + case HB_GSUB_LOOKUP_CHAIN: return Load_ChainContextSubst ( st, stream ); + /*case HB_GSUB_LOOKUP_EXTENSION: return Load_ExtensionSubst ( st, stream );*/ + case HB_GSUB_LOOKUP_REVERSE_CHAIN: return Load_ReverseChainContextSubst ( st, stream ); + default: return ERR(HB_Err_Invalid_SubTable_Format); + }; +} + + +HB_INTERNAL void +_HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st, + HB_UShort lookup_type ) +{ + switch ( lookup_type ) { + case HB_GSUB_LOOKUP_SINGLE: Free_SingleSubst ( st ); return; + case HB_GSUB_LOOKUP_MULTIPLE: Free_MultipleSubst ( st ); return; + case HB_GSUB_LOOKUP_ALTERNATE: Free_AlternateSubst ( st ); return; + case HB_GSUB_LOOKUP_LIGATURE: Free_LigatureSubst ( st ); return; + case HB_GSUB_LOOKUP_CONTEXT: Free_ContextSubst ( st ); return; + case HB_GSUB_LOOKUP_CHAIN: Free_ChainContextSubst ( st ); return; + /*case HB_GSUB_LOOKUP_EXTENSION: Free_ExtensionSubst ( st ); return;*/ + case HB_GSUB_LOOKUP_REVERSE_CHAIN: Free_ReverseChainContextSubst ( st ); return; + default: return; + }; +} + + + +/* apply one lookup to the input string object */ + +static HB_Error GSUB_Do_String_Lookup( HB_GSUBHeader* gsub, + HB_UShort lookup_index, + HB_Buffer buffer ) +{ + HB_Error error, retError = HB_Err_Not_Covered; + + HB_UInt* properties = gsub->LookupList.Properties; + int lookup_type = gsub->LookupList.Lookup[lookup_index].LookupType; + + const int nesting_level = 0; + /* 0xFFFF indicates that we don't have a context length yet */ + const HB_UShort context_length = 0xFFFF; + + switch (lookup_type) { + + case HB_GSUB_LOOKUP_SINGLE: + case HB_GSUB_LOOKUP_MULTIPLE: + case HB_GSUB_LOOKUP_ALTERNATE: + case HB_GSUB_LOOKUP_LIGATURE: + case HB_GSUB_LOOKUP_CONTEXT: + case HB_GSUB_LOOKUP_CHAIN: + /* in/out forward substitution (implemented lazy) */ + + _hb_buffer_clear_output ( buffer ); + buffer->in_pos = 0; + while ( buffer->in_pos < buffer->in_length ) + { + if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] ) + { + error = GSUB_Do_Glyph_Lookup( gsub, lookup_index, buffer, context_length, nesting_level ); + if ( error ) + { + if ( error != HB_Err_Not_Covered ) + return error; + } + else + retError = error; + } + else + error = HB_Err_Not_Covered; + + if ( error == HB_Err_Not_Covered ) + if ( COPY_Glyph ( buffer ) ) + return error; + } + /* we shouldn't swap if error occurred. + * + * also don't swap if nothing changed (ie HB_Err_Not_Covered). + * shouldn't matter in that case though. + */ + if ( retError == HB_Err_Ok ) + _hb_buffer_swap( buffer ); + + return retError; + + case HB_GSUB_LOOKUP_REVERSE_CHAIN: + /* in-place backward substitution */ + + buffer->in_pos = buffer->in_length - 1; + do + { + if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] ) + { + error = GSUB_Do_Glyph_Lookup( gsub, lookup_index, buffer, context_length, nesting_level ); + if ( error ) + { + if ( error != HB_Err_Not_Covered ) + return error; + } + else + retError = error; + } + else + error = HB_Err_Not_Covered; + + if ( error == HB_Err_Not_Covered ) + buffer->in_pos--; + } + while ((HB_Int) buffer->in_pos >= 0); + + return retError; + + /*case HB_GSUB_LOOKUP_EXTENSION:*/ + default: + return retError; + }; +} + + +HB_Error HB_GSUB_Add_Feature( HB_GSUBHeader* gsub, + HB_UShort feature_index, + HB_UInt property ) +{ + HB_UShort i; + + HB_Feature feature; + HB_UInt* properties; + HB_UShort* index; + HB_UShort lookup_count; + + /* Each feature can only be added once */ + + if ( !gsub || + feature_index >= gsub->FeatureList.FeatureCount || + gsub->FeatureList.ApplyCount == gsub->FeatureList.FeatureCount ) + return ERR(HB_Err_Invalid_Argument); + + gsub->FeatureList.ApplyOrder[gsub->FeatureList.ApplyCount++] = feature_index; + + properties = gsub->LookupList.Properties; + + feature = gsub->FeatureList.FeatureRecord[feature_index].Feature; + index = feature.LookupListIndex; + lookup_count = gsub->LookupList.LookupCount; + + for ( i = 0; i < feature.LookupListCount; i++ ) + { + HB_UShort lookup_index = index[i]; + if (lookup_index < lookup_count) + properties[lookup_index] |= property; + } + + return HB_Err_Ok; +} + + + +HB_Error HB_GSUB_Clear_Features( HB_GSUBHeader* gsub ) +{ + HB_UShort i; + + HB_UInt* properties; + + + if ( !gsub ) + return ERR(HB_Err_Invalid_Argument); + + gsub->FeatureList.ApplyCount = 0; + + properties = gsub->LookupList.Properties; + + for ( i = 0; i < gsub->LookupList.LookupCount; i++ ) + properties[i] = 0; + + return HB_Err_Ok; +} + + + +HB_Error HB_GSUB_Register_Alternate_Function( HB_GSUBHeader* gsub, + HB_AltFunction altfunc, + void* data ) +{ + if ( !gsub ) + return ERR(HB_Err_Invalid_Argument); + + gsub->altfunc = altfunc; + gsub->data = data; + + return HB_Err_Ok; +} + +/* returns error if one happened, otherwise returns HB_Err_Not_Covered if no + * feature were applied, or HB_Err_Ok otherwise. + */ +HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub, + HB_Buffer buffer ) +{ + HB_Error error, retError = HB_Err_Not_Covered; + int i, j, lookup_count, num_features; + + if ( !gsub || + !buffer) + return ERR(HB_Err_Invalid_Argument); + + if ( buffer->in_length == 0 ) + return retError; + + lookup_count = gsub->LookupList.LookupCount; + num_features = gsub->FeatureList.ApplyCount; + + for ( i = 0; i < num_features; i++) + { + HB_UShort feature_index = gsub->FeatureList.ApplyOrder[i]; + HB_Feature feature = gsub->FeatureList.FeatureRecord[feature_index].Feature; + + for ( j = 0; j < feature.LookupListCount; j++ ) + { + HB_UShort lookup_index = feature.LookupListIndex[j]; + + /* Skip nonexistant lookups */ + if (lookup_index >= lookup_count) + continue; + + error = GSUB_Do_String_Lookup( gsub, lookup_index, buffer ); + if ( error ) + { + if ( error != HB_Err_Not_Covered ) + return error; + } + else + retError = error; + } + } + + error = retError; + + return error; +} + + +/* END */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h new file mode 100644 index 0000000000..6e452bdb35 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-gsub.h @@ -0,0 +1,139 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_GSUB_H +#define HARFBUZZ_GSUB_H + +#include "harfbuzz-gdef.h" +#include "harfbuzz-buffer.h" + +HB_BEGIN_HEADER + +/* Lookup types for glyph substitution */ + +#define HB_GSUB_LOOKUP_SINGLE 1 +#define HB_GSUB_LOOKUP_MULTIPLE 2 +#define HB_GSUB_LOOKUP_ALTERNATE 3 +#define HB_GSUB_LOOKUP_LIGATURE 4 +#define HB_GSUB_LOOKUP_CONTEXT 5 +#define HB_GSUB_LOOKUP_CHAIN 6 +#define HB_GSUB_LOOKUP_EXTENSION 7 +#define HB_GSUB_LOOKUP_REVERSE_CHAIN 8 + + +/* A pointer to a function which selects the alternate glyph. `pos' is + the position of the glyph with index `glyphID', `num_alternates' + gives the number of alternates in the `alternates' array. `data' + points to the user-defined structure specified during a call to + HB_GSUB_Register_Alternate_Function(). The function must return an + index into the `alternates' array. */ + +typedef HB_UShort (*HB_AltFunction)(HB_UInt pos, + HB_UShort glyphID, + HB_UShort num_alternates, + HB_UShort* alternates, + void* data ); + + +struct HB_GSUBHeader_ +{ + HB_GDEFHeader* gdef; + + /* the next two fields are used for an alternate substitution callback + function to select the proper alternate glyph. */ + + void* data; + HB_AltFunction altfunc; + + HB_UInt offset; + + HB_16Dot16 Version; + + HB_ScriptList ScriptList; + HB_FeatureList FeatureList; + HB_LookupList LookupList; +}; + +typedef struct HB_GSUBHeader_ HB_GSUBHeader; +typedef HB_GSUBHeader* HB_GSUB; + + +HB_Error HB_Load_GSUB_Table( HB_Stream stream, + HB_GSUBHeader** gsub, + HB_GDEFHeader* gdef, + HB_Stream gdefStream ); + + +HB_Error HB_Done_GSUB_Table( HB_GSUBHeader* gsub ); + + +HB_Error HB_GSUB_Select_Script( HB_GSUBHeader* gsub, + HB_UInt script_tag, + HB_UShort* script_index ); + +HB_Error HB_GSUB_Select_Language( HB_GSUBHeader* gsub, + HB_UInt language_tag, + HB_UShort script_index, + HB_UShort* language_index, + HB_UShort* req_feature_index ); + +HB_Error HB_GSUB_Select_Feature( HB_GSUBHeader* gsub, + HB_UInt feature_tag, + HB_UShort script_index, + HB_UShort language_index, + HB_UShort* feature_index ); + + +HB_Error HB_GSUB_Query_Scripts( HB_GSUBHeader* gsub, + HB_UInt** script_tag_list ); + +HB_Error HB_GSUB_Query_Languages( HB_GSUBHeader* gsub, + HB_UShort script_index, + HB_UInt** language_tag_list ); + +HB_Error HB_GSUB_Query_Features( HB_GSUBHeader* gsub, + HB_UShort script_index, + HB_UShort language_index, + HB_UInt** feature_tag_list ); + + +HB_Error HB_GSUB_Add_Feature( HB_GSUBHeader* gsub, + HB_UShort feature_index, + HB_UInt property ); + +HB_Error HB_GSUB_Clear_Features( HB_GSUBHeader* gsub ); + + +HB_Error HB_GSUB_Register_Alternate_Function( HB_GSUBHeader* gsub, + HB_AltFunction altfunc, + void* data ); + + +HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub, + HB_Buffer buffer ); + +HB_END_HEADER + +#endif /* HARFBUZZ_GSUB_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-hangul.c b/src/3rdparty/harfbuzz/src/harfbuzz-hangul.c new file mode 100644 index 0000000000..6f89ed6b0b --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-hangul.c @@ -0,0 +1,268 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" + +#include + +/* +// Hangul is a syllable based script. Unicode reserves a large range +// for precomposed hangul, where syllables are already precomposed to +// their final glyph shape. In addition, a so called jamo range is +// defined, that can be used to express old Hangul. Modern hangul +// syllables can also be expressed as jamo, and should be composed +// into syllables. The operation is rather simple and mathematical. + +// Every hangul jamo is classified as being either a Leading consonant +// (L), and intermediat Vowel (V) or a trailing consonant (T). Modern +// hangul syllables (the ones in the precomposed area can be of type +// LV or LVT. +// +// Syllable breaks do _not_ occur between: +// +// L L, V or precomposed +// V, LV V, T +// LVT, T T +// +// A standard syllable is of the form L+V+T*. The above rules allow +// nonstandard syllables L*V*T*. To transform them into standard +// syllables fill characters L_f and V_f can be inserted. +*/ + +enum { + Hangul_SBase = 0xac00, + Hangul_LBase = 0x1100, + Hangul_VBase = 0x1161, + Hangul_TBase = 0x11a7, + Hangul_SCount = 11172, + Hangul_LCount = 19, + Hangul_VCount = 21, + Hangul_TCount = 28, + Hangul_NCount = 21*28 +}; + +#define hangul_isPrecomposed(uc) \ + (uc >= Hangul_SBase && uc < Hangul_SBase + Hangul_SCount) + +#define hangul_isLV(uc) \ + ((uc - Hangul_SBase) % Hangul_TCount == 0) + +typedef enum { + L, + V, + T, + LV, + LVT, + X +} HangulType; + +static HangulType hangul_type(unsigned short uc) { + if (uc > Hangul_SBase && uc < Hangul_SBase + Hangul_SCount) + return hangul_isLV(uc) ? LV : LVT; + if (uc < Hangul_LBase || uc > 0x11ff) + return X; + if (uc < Hangul_VBase) + return L; + if (uc < Hangul_TBase) + return V; + return T; +} + +static int hangul_nextSyllableBoundary(const HB_UChar16 *s, int start, int end) +{ + const HB_UChar16 *uc = s + start; + + HangulType state = hangul_type(*uc); + int pos = 1; + + while (pos < end - start) { + HangulType newState = hangul_type(uc[pos]); + switch(newState) { + case X: + goto finish; + case L: + case V: + case T: + if (state > newState) + goto finish; + state = newState; + break; + case LV: + if (state > L) + goto finish; + state = V; + break; + case LVT: + if (state > L) + goto finish; + state = T; + } + ++pos; + } + + finish: + return start+pos; +} + +#ifndef NO_OPENTYPE +static const HB_OpenTypeFeature hangul_features [] = { + { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, + { HB_MAKE_TAG('l', 'j', 'm', 'o'), CcmpProperty }, + { HB_MAKE_TAG('v', 'j', 'm', 'o'), CcmpProperty }, + { HB_MAKE_TAG('t', 'j', 'm', 'o'), CcmpProperty }, + { 0, 0 } +}; +#endif + +static HB_Bool hangul_shape_syllable(HB_ShaperItem *item, HB_Bool openType) +{ + const HB_UChar16 *ch = item->string + item->item.pos; + int len = item->item.length; +#ifndef NO_OPENTYPE + const int availableGlyphs = item->num_glyphs; +#endif + + int i; + HB_UChar16 composed = 0; + /* see if we can compose the syllable into a modern hangul */ + if (item->item.length == 2) { + int LIndex = ch[0] - Hangul_LBase; + int VIndex = ch[1] - Hangul_VBase; + if (LIndex >= 0 && LIndex < Hangul_LCount && + VIndex >= 0 && VIndex < Hangul_VCount) + composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + Hangul_SBase; + } else if (item->item.length == 3) { + int LIndex = ch[0] - Hangul_LBase; + int VIndex = ch[1] - Hangul_VBase; + int TIndex = ch[2] - Hangul_TBase; + if (LIndex >= 0 && LIndex < Hangul_LCount && + VIndex >= 0 && VIndex < Hangul_VCount && + TIndex >= 0 && TIndex < Hangul_TCount) + composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + TIndex + Hangul_SBase; + } + + + + /* if we have a modern hangul use the composed form */ + if (composed) { + ch = &composed; + len = 1; + } + + if (!item->font->klass->convertStringToGlyphIndices(item->font, + ch, len, + item->glyphs, &item->num_glyphs, + item->item.bidiLevel % 2)) + return FALSE; + for (i = 0; i < len; i++) { + item->attributes[i].mark = FALSE; + item->attributes[i].clusterStart = FALSE; + item->attributes[i].justification = 0; + item->attributes[i].zeroWidth = FALSE; + /*IDEBUG(" %d: %4x", i, ch[i].unicode()); */ + } + +#ifndef NO_OPENTYPE + if (!composed && openType) { + HB_Bool positioned; + + HB_STACKARRAY(unsigned short, logClusters, len); + for (i = 0; i < len; ++i) + logClusters[i] = i; + item->log_clusters = logClusters; + + HB_OpenTypeShape(item, /*properties*/0); + + positioned = HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE); + + HB_FREE_STACKARRAY(logClusters); + + if (!positioned) + return FALSE; + } else { + HB_HeuristicPosition(item); + } +#endif + + item->attributes[0].clusterStart = TRUE; + return TRUE; +} + +HB_Bool HB_HangulShape(HB_ShaperItem *item) +{ + const HB_UChar16 *uc = item->string + item->item.pos; + HB_Bool allPrecomposed = TRUE; + int i; + + assert(item->item.script == HB_Script_Hangul); + + for (i = 0; i < (int)item->item.length; ++i) { + if (!hangul_isPrecomposed(uc[i])) { + allPrecomposed = FALSE; + break; + } + } + + if (!allPrecomposed) { + HB_Bool openType = FALSE; + unsigned short *logClusters = item->log_clusters; + HB_ShaperItem syllable; + int first_glyph = 0; + int sstart = item->item.pos; + int end = sstart + item->item.length; + +#ifndef NO_OPENTYPE + openType = HB_SelectScript(item, hangul_features); +#endif + syllable = *item; + + while (sstart < end) { + int send = hangul_nextSyllableBoundary(item->string, sstart, end); + + syllable.item.pos = sstart; + syllable.item.length = send-sstart; + syllable.glyphs = item->glyphs + first_glyph; + syllable.attributes = item->attributes + first_glyph; + syllable.offsets = item->offsets + first_glyph; + syllable.advances = item->advances + first_glyph; + syllable.num_glyphs = item->num_glyphs - first_glyph; + if (!hangul_shape_syllable(&syllable, openType)) { + item->num_glyphs += syllable.num_glyphs; + return FALSE; + } + /* fix logcluster array */ + for (i = sstart; i < send; ++i) + logClusters[i-item->item.pos] = first_glyph; + sstart = send; + first_glyph += syllable.num_glyphs; + } + item->num_glyphs = first_glyph; + return TRUE; + } + + return HB_BasicShape(item); +} + + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c b/src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c new file mode 100644 index 0000000000..b5431a53e7 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-hebrew.c @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" +#include + +/* +// Uniscribe also defines dlig for Hebrew, but we leave this out for now, as it's mostly +// ligatures one does not want in modern Hebrew (as lam-alef ligatures). +*/ +#ifndef NO_OPENTYPE +static const HB_OpenTypeFeature hebrew_features[] = { + { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, + {0, 0} +}; +#endif + +/* Hebrew shaping. In the non opentype case we try to use the + presentation forms specified for Hebrew. Especially for the + ligatures with Dagesh this gives much better results than we could + achieve manually. +*/ +HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item) +{ + enum { + Dagesh = 0x5bc, + ShinDot = 0x5c1, + SinDot = 0x5c2, + Patah = 0x5b7, + Qamats = 0x5b8, + Holam = 0x5b9, + Rafe = 0x5bf + }; + + assert(shaper_item->item.script == HB_Script_Hebrew); + +#ifndef NO_OPENTYPE + if (HB_SelectScript(shaper_item, hebrew_features)) { + + const int availableGlyphs = shaper_item->num_glyphs; + if (!HB_ConvertStringToGlyphIndices(shaper_item)) + return FALSE; + + HB_HeuristicSetGlyphAttributes(shaper_item); + HB_OpenTypeShape(shaper_item, /*properties*/0); + return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/TRUE); + } +#endif + + { + const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos; + unsigned short *logClusters = shaper_item->log_clusters; + HB_GlyphAttributes *attributes = shaper_item->attributes; + + HB_Bool haveGlyphs; + int slen = 1; + int cluster_start = 0; + hb_uint32 i; + + HB_STACKARRAY(HB_UChar16, shapedChars, 2 * shaper_item->item.length); + *shapedChars = *uc; + logClusters[0] = 0; + + for (i = 1; i < shaper_item->item.length; ++i) { + hb_uint16 base = shapedChars[cluster_start]; + hb_uint16 shaped = 0; + HB_Bool invalid = FALSE; + if (uc[i] == Dagesh) { + if (base >= 0x5d0 + && base <= 0x5ea + && base != 0x5d7 + && base != 0x5dd + && base != 0x5df + && base != 0x5e2 + && base != 0x5e5) { + shaped = base - 0x5d0 + 0xfb30; + } else if (base == 0xfb2a || base == 0xfb2b /* Shin with Shin or Sin dot */) { + shaped = base + 2; + } else { + invalid = TRUE; + } + } else if (uc[i] == ShinDot) { + if (base == 0x05e9) + shaped = 0xfb2a; + else if (base == 0xfb49) + shaped = 0xfb2c; + else + invalid = TRUE; + } else if (uc[i] == SinDot) { + if (base == 0x05e9) + shaped = 0xfb2b; + else if (base == 0xfb49) + shaped = 0xfb2d; + else + invalid = TRUE; + } else if (uc[i] == Patah) { + if (base == 0x5d0) + shaped = 0xfb2e; + } else if (uc[i] == Qamats) { + if (base == 0x5d0) + shaped = 0xfb2f; + } else if (uc[i] == Holam) { + if (base == 0x5d5) + shaped = 0xfb4b; + } else if (uc[i] == Rafe) { + if (base == 0x5d1) + shaped = 0xfb4c; + else if (base == 0x5db) + shaped = 0xfb4d; + else if (base == 0x5e4) + shaped = 0xfb4e; + } + + if (invalid) { + shapedChars[slen] = 0x25cc; + attributes[slen].clusterStart = TRUE; + attributes[slen].mark = FALSE; + attributes[slen].combiningClass = 0; + cluster_start = slen; + ++slen; + } + if (shaped) { + if (shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1)) { + shapedChars[cluster_start] = shaped; + } else + shaped = 0; + } + if (!shaped) { + HB_CharCategory category; + int cmb; + shapedChars[slen] = uc[i]; + HB_GetUnicodeCharProperties(uc[i], &category, &cmb); + if (category != HB_Mark_NonSpacing) { + attributes[slen].clusterStart = TRUE; + attributes[slen].mark = FALSE; + attributes[slen].combiningClass = 0; + attributes[slen].dontPrint = HB_IsControlChar(uc[i]); + cluster_start = slen; + } else { + attributes[slen].clusterStart = FALSE; + attributes[slen].mark = TRUE; + attributes[slen].combiningClass = cmb; + } + ++slen; + } + logClusters[i] = cluster_start; + } + + haveGlyphs = shaper_item->font->klass + ->convertStringToGlyphIndices(shaper_item->font, + shapedChars, slen, + shaper_item->glyphs, &shaper_item->num_glyphs, + shaper_item->item.bidiLevel % 2); + + HB_FREE_STACKARRAY(shapedChars); + + if (!haveGlyphs) + return FALSE; + + HB_HeuristicPosition(shaper_item); + } + + return TRUE; +} + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-impl.c b/src/3rdparty/harfbuzz/src/harfbuzz-impl.c new file mode 100644 index 0000000000..ddbf36be0e --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-impl.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * Copyright (C) 2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + */ + +#include "harfbuzz-impl.h" + + +HB_INTERNAL HB_Pointer +_hb_alloc(size_t size, + HB_Error *perror ) +{ + HB_Error error = (HB_Error)0; + HB_Pointer block = NULL; + + if ( size > 0 ) + { + block = calloc( 1, size ); + if ( !block ) + error = ERR(HB_Err_Out_Of_Memory); + } + + *perror = error; + return block; +} + + +HB_INTERNAL HB_Pointer +_hb_realloc(HB_Pointer block, + size_t new_size, + HB_Error *perror ) +{ + HB_Pointer block2 = NULL; + HB_Error error = (HB_Error)0; + + block2 = realloc( block, new_size ); + if ( block2 == NULL && new_size != 0 ) + error = ERR(HB_Err_Out_Of_Memory); + + if ( !error ) + block = block2; + + *perror = error; + return block; +} + + +HB_INTERNAL void +_hb_free( HB_Pointer block ) +{ + if ( block ) + free( block ); +} + + +/* helper func to set a breakpoint on */ +HB_INTERNAL HB_Error +_hb_err (HB_Error code) +{ + return code; +} diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-impl.h b/src/3rdparty/harfbuzz/src/harfbuzz-impl.h new file mode 100644 index 0000000000..5f430498c4 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-impl.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_IMPL_H +#define HARFBUZZ_IMPL_H + +#include "harfbuzz-global.h" + +#include + +HB_BEGIN_HEADER + +#ifndef HB_INTERNAL +# define HB_INTERNAL +#endif + +#ifndef NULL +# define NULL ((void *)0) +#endif + +#ifndef FALSE +# define FALSE 0 +#endif + +#ifndef TRUE +# define TRUE 1 +#endif + +#ifndef TTAG_GDEF +# define TTAG_GDEF HB_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#endif +#ifndef TTAG_GPOS +# define TTAG_GPOS HB_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#endif +#ifndef TTAG_GSUB +# define TTAG_GSUB HB_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#endif + +#ifndef HB_UNUSED +# define HB_UNUSED(arg) ((arg) = (arg)) +#endif + +#define HB_LIKELY(cond) (cond) +#define HB_UNLIKELY(cond) (cond) + +#define ARRAY_LEN(Array) ((int)(sizeof (Array) / sizeof (Array)[0])) + + + +#define HB_IsHighSurrogate(ucs) \ + (((ucs) & 0xfc00) == 0xd800) + +#define HB_IsLowSurrogate(ucs) \ + (((ucs) & 0xfc00) == 0xdc00) + +#define HB_SurrogateToUcs4(high, low) \ + (((HB_UChar32)(high))<<10) + (low) - 0x35fdc00; + + + + + +#define ALLOC(_ptr,_size) \ + ( (_ptr) = _hb_alloc( _size, &error ), error != 0 ) + +#define REALLOC(_ptr,_newsz) \ + ( (_ptr) = _hb_realloc( (_ptr), (_newsz), &error ), error != 0 ) + +#define FREE(_ptr) \ + do { \ + if ( (_ptr) ) \ + { \ + _hb_free( _ptr ); \ + _ptr = NULL; \ + } \ + } while (0) + +#define ALLOC_ARRAY(_ptr,_count,_type) \ + ALLOC(_ptr,(_count)*sizeof(_type)) + +#define REALLOC_ARRAY(_ptr,_newcnt,_type) \ + REALLOC(_ptr,(_newcnt)*sizeof(_type)) + +#define MEM_Copy(dest,source,count) memcpy( (char*)(dest), (const char*)(source), (size_t)(count) ) + +#define ERR(err) _hb_err (err) + + +HB_INTERNAL HB_Pointer +_hb_alloc( size_t size, + HB_Error *perror_ ); + +HB_INTERNAL HB_Pointer +_hb_realloc( HB_Pointer block, + size_t new_size, + HB_Error *perror_ ); + +HB_INTERNAL void +_hb_free( HB_Pointer block ); + + +/* helper func to set a breakpoint on */ +HB_INTERNAL HB_Error +_hb_err (HB_Error code); + + +HB_END_HEADER + +#endif /* HARFBUZZ_IMPL_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp new file mode 100644 index 0000000000..bbf479e774 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp @@ -0,0 +1,1898 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" + +#include +#include + +#define FLAG(x) (1 << (x)) + +static HB_Bool isLetter(HB_UChar16 ucs) +{ + const int test = FLAG(HB_Letter_Uppercase) | + FLAG(HB_Letter_Lowercase) | + FLAG(HB_Letter_Titlecase) | + FLAG(HB_Letter_Modifier) | + FLAG(HB_Letter_Other); + return (FLAG(HB_GetUnicodeCharCategory(ucs)) & test) != 0; +} + +static HB_Bool isMark(HB_UChar16 ucs) +{ + const int test = FLAG(HB_Mark_NonSpacing) | + FLAG(HB_Mark_SpacingCombining) | + FLAG(HB_Mark_Enclosing); + return FLAG(HB_GetUnicodeCharCategory(ucs)) & test; +} + +enum Form { + Invalid = 0x0, + UnknownForm = Invalid, + Consonant, + Nukta, + Halant, + Matra, + VowelMark, + StressMark, + IndependentVowel, + LengthMark, + Control, + Other +}; + +static const unsigned char indicForms[0xe00-0x900] = { + // Devangari + Invalid, VowelMark, VowelMark, VowelMark, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, UnknownForm, UnknownForm, + Nukta, Other, Matra, Matra, + + Matra, Matra, Matra, Matra, + Matra, Matra, Matra, Matra, + Matra, Matra, Matra, Matra, + Matra, Halant, UnknownForm, UnknownForm, + + Other, StressMark, StressMark, StressMark, + StressMark, UnknownForm, UnknownForm, UnknownForm, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + IndependentVowel, IndependentVowel, VowelMark, VowelMark, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Consonant, + Consonant, Consonant /* ??? */, Consonant, Consonant, + + // Bengali + Invalid, VowelMark, VowelMark, VowelMark, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, Invalid, Invalid, IndependentVowel, + + IndependentVowel, Invalid, Invalid, IndependentVowel, + IndependentVowel, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Invalid, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Invalid, Consonant, Invalid, + Invalid, Invalid, Consonant, Consonant, + Consonant, Consonant, UnknownForm, UnknownForm, + Nukta, Other, Matra, Matra, + + Matra, Matra, Matra, Matra, + Matra, Invalid, Invalid, Matra, + Matra, Invalid, Invalid, Matra, + Matra, Halant, Consonant, UnknownForm, + + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, VowelMark, + Invalid, Invalid, Invalid, Invalid, + Consonant, Consonant, Invalid, Consonant, + + IndependentVowel, IndependentVowel, VowelMark, VowelMark, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + Consonant, Consonant, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + // Gurmukhi + Invalid, VowelMark, VowelMark, VowelMark, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, Invalid, + Invalid, Invalid, Invalid, IndependentVowel, + + IndependentVowel, Invalid, Invalid, IndependentVowel, + IndependentVowel, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Invalid, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Invalid, Consonant, Consonant, + Invalid, Consonant, Consonant, Invalid, + Consonant, Consonant, UnknownForm, UnknownForm, + Nukta, Other, Matra, Matra, + + Matra, Matra, Matra, Invalid, + Invalid, Invalid, Invalid, Matra, + Matra, Invalid, Invalid, Matra, + Matra, Halant, UnknownForm, UnknownForm, + + Invalid, Invalid, Invalid, Invalid, + Invalid, UnknownForm, UnknownForm, UnknownForm, + Invalid, Consonant, Consonant, Consonant, + Consonant, Invalid, Consonant, Invalid, + + Other, Other, Invalid, Invalid, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + StressMark, StressMark, Consonant, Consonant, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + // Gujarati + Invalid, VowelMark, VowelMark, VowelMark, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, Invalid, IndependentVowel, + + IndependentVowel, IndependentVowel, Invalid, IndependentVowel, + IndependentVowel, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Invalid, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Invalid, Consonant, Consonant, + Invalid, Consonant, Consonant, Consonant, + Consonant, Consonant, UnknownForm, UnknownForm, + Nukta, Other, Matra, Matra, + + Matra, Matra, Matra, Matra, + Matra, Matra, Invalid, Matra, + Matra, Matra, Invalid, Matra, + Matra, Halant, UnknownForm, UnknownForm, + + Other, UnknownForm, UnknownForm, UnknownForm, + UnknownForm, UnknownForm, UnknownForm, UnknownForm, + UnknownForm, UnknownForm, UnknownForm, UnknownForm, + UnknownForm, UnknownForm, UnknownForm, UnknownForm, + + IndependentVowel, IndependentVowel, VowelMark, VowelMark, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + // Oriya + Invalid, VowelMark, VowelMark, VowelMark, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, Invalid, Invalid, IndependentVowel, + + IndependentVowel, Invalid, Invalid, IndependentVowel, + IndependentVowel, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Invalid, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Invalid, Consonant, Consonant, + Invalid, Consonant, Consonant, Consonant, + Consonant, Consonant, UnknownForm, UnknownForm, + Nukta, Other, Matra, Matra, + + Matra, Matra, Matra, Matra, + Invalid, Invalid, Invalid, Matra, + Matra, Invalid, Invalid, Matra, + Matra, Halant, UnknownForm, UnknownForm, + + Other, Invalid, Invalid, Invalid, + Invalid, UnknownForm, LengthMark, LengthMark, + Invalid, Invalid, Invalid, Invalid, + Consonant, Consonant, Invalid, Consonant, + + IndependentVowel, IndependentVowel, Invalid, Invalid, + Invalid, Invalid, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + Other, Consonant, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + //Tamil + Invalid, Invalid, VowelMark, Other, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, Invalid, + Invalid, Invalid, IndependentVowel, IndependentVowel, + + IndependentVowel, Invalid, IndependentVowel, IndependentVowel, + IndependentVowel, Consonant, Invalid, Invalid, + Invalid, Consonant, Consonant, Invalid, + Consonant, Invalid, Consonant, Consonant, + + Invalid, Invalid, Invalid, Consonant, + Consonant, Invalid, Invalid, Invalid, + Consonant, Consonant, Consonant, Invalid, + Invalid, Invalid, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, UnknownForm, UnknownForm, + Invalid, Invalid, Matra, Matra, + + Matra, Matra, Matra, Invalid, + Invalid, Invalid, Matra, Matra, + Matra, Invalid, Matra, Matra, + Matra, Halant, Invalid, Invalid, + + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, LengthMark, + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, Invalid, + + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + // Telugu + Invalid, VowelMark, VowelMark, VowelMark, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, Invalid, IndependentVowel, IndependentVowel, + + IndependentVowel, Invalid, IndependentVowel, IndependentVowel, + IndependentVowel, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Invalid, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Invalid, Consonant, Consonant, Consonant, + Consonant, Consonant, UnknownForm, UnknownForm, + Invalid, Invalid, Matra, Matra, + + Matra, Matra, Matra, Matra, + Matra, Invalid, Matra, Matra, + Matra, Invalid, Matra, Matra, + Matra, Halant, Invalid, Invalid, + + Invalid, Invalid, Invalid, Invalid, + Invalid, LengthMark, Matra, Invalid, + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, Invalid, + + IndependentVowel, IndependentVowel, Invalid, Invalid, + Invalid, Invalid, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + // Kannada + Invalid, Invalid, VowelMark, VowelMark, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, Invalid, IndependentVowel, IndependentVowel, + + IndependentVowel, Invalid, IndependentVowel, IndependentVowel, + IndependentVowel, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Invalid, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Invalid, Consonant, Consonant, Consonant, + Consonant, Consonant, UnknownForm, UnknownForm, + Nukta, Other, Matra, Matra, + + Matra, Matra, Matra, Matra, + Matra, Invalid, Matra, Matra, + Matra, Invalid, Matra, Matra, + Matra, Halant, Invalid, Invalid, + + Invalid, Invalid, Invalid, Invalid, + Invalid, LengthMark, LengthMark, Invalid, + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Consonant, Invalid, + + IndependentVowel, IndependentVowel, VowelMark, VowelMark, + Invalid, Invalid, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + // Malayalam + Invalid, Invalid, VowelMark, VowelMark, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, Invalid, IndependentVowel, IndependentVowel, + + IndependentVowel, Invalid, IndependentVowel, IndependentVowel, + IndependentVowel, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Invalid, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, UnknownForm, UnknownForm, + Invalid, Invalid, Matra, Matra, + + Matra, Matra, Matra, Matra, + Invalid, Invalid, Matra, Matra, + Matra, Invalid, Matra, Matra, + Matra, Halant, Invalid, Invalid, + + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, Matra, + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, Invalid, + + IndependentVowel, IndependentVowel, Invalid, Invalid, + Invalid, Invalid, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, + + // Sinhala + Invalid, Invalid, VowelMark, VowelMark, + Invalid, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + + IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, + IndependentVowel, IndependentVowel, IndependentVowel, Invalid, + Invalid, Invalid, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + + Consonant, Consonant, Invalid, Consonant, + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Consonant, + Invalid, Consonant, Invalid, Invalid, + + Consonant, Consonant, Consonant, Consonant, + Consonant, Consonant, Consonant, Invalid, + Invalid, Invalid, Halant, Invalid, + Invalid, Invalid, Invalid, Matra, + + Matra, Matra, Matra, Matra, + Matra, Invalid, Matra, Invalid, + Matra, Matra, Matra, Matra, + Matra, Matra, Matra, Matra, + + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, Invalid, + Invalid, Invalid, Invalid, Invalid, + + Invalid, Invalid, Matra, Matra, + Other, Other, Other, Other, + Other, Other, Other, Other, + Other, Other, Other, Other, +}; + +enum Position { + None, + Pre, + Above, + Below, + Post, + Split, + Base, + Reph, + Vattu, + Inherit +}; + +static const unsigned char indicPosition[0xe00-0x900] = { + // Devanagari + None, Above, Above, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + Below, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, Post, Pre, + + Post, Below, Below, Below, + Below, Above, Above, Above, + Above, Post, Post, Post, + Post, None, None, None, + + None, Above, Below, Above, + Above, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, Below, Below, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Bengali + None, Above, Post, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + Below, None, None, Post, + + Below, None, None, None, + None, None, None, None, + None, None, None, None, + Below, None, Post, Pre, + + Post, Below, Below, Below, + Below, None, None, Pre, + Pre, None, None, Split, + Split, Below, None, None, + + None, None, None, None, + None, None, None, Post, + None, None, None, None, + None, None, None, None, + + None, None, Below, Below, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + Below, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Gurmukhi + None, Above, Above, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, Post, + + Below, None, None, None, + None, Below, None, None, + None, Below, None, None, + Below, None, Post, Pre, + + Post, Below, Below, None, + None, None, None, Above, + Above, None, None, Above, + Above, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + Above, Above, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Gujarati + None, Above, Above, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + Below, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, Post, Pre, + + Post, Below, Below, Below, + Below, Above, None, Above, + Above, Post, None, Post, + Post, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, Below, Below, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Oriya + None, Above, Post, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, Below, Below, Below, + Below, Below, Below, Below, + Below, Below, None, Below, + + Below, Below, Below, Below, + Below, Below, Below, Below, + Below, None, Below, Below, + Below, Below, Below, Post, + + Below, None, Below, Below, + None, Below, Below, Below, + Below, Below, None, None, + None, None, Post, Above, + + Post, Below, Below, Below, + None, None, None, Pre, + Split, None, None, Split, + Split, None, None, None, + + None, None, None, None, + None, None, Above, Post, + None, None, None, None, + None, None, None, Post, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, Below, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Tamil + None, None, Above, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, Post, Post, + + Above, Below, Below, None, + None, None, Pre, Pre, + Pre, None, Split, Split, + Split, Halant, None, None, + + None, None, None, None, + None, None, None, Post, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Telugu + None, Post, Post, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, Below, Below, Below, + Below, Below, Below, Below, + Below, Below, Below, Below, + + Below, Below, Below, Below, + Below, Below, Below, Below, + Below, None, Below, Below, + Below, Below, Below, Below, + + Below, None, Below, Below, + None, Below, Below, Below, + Below, Below, None, None, + None, None, Post, Above, + + Above, Post, Post, Post, + Post, None, Above, Above, + Split, None, Post, Above, + Above, Halant, None, None, + + None, None, None, None, + None, Above, Below, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Kannada + None, None, Post, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, Below, Below, Below, + Below, Below, Below, Below, + Below, Below, Below, Below, + + Below, Below, Below, Below, + Below, Below, Below, Below, + Below, Below, Below, Below, + Below, Below, Below, Below, + + Below, None, Below, Below, + None, Below, Below, Below, + Below, Below, None, None, + None, None, Post, Above, + + Split, Post, Post, Post, + Post, None, Above, Split, + Split, None, Split, Split, + Above, Halant, None, None, + + None, None, None, None, + None, Post, Post, None, + None, None, None, None, + None, None, Below, None, + + None, None, Below, Below, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Malayalam + None, None, Post, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, Post, + + Pre, None, Below, None, + None, Post, None, None, + None, None, None, None, + None, None, Post, Post, + + Post, Post, Post, Post, + None, None, Pre, Pre, + Pre, None, Split, Split, + Split, Halant, None, None, + + None, None, None, None, + None, None, None, Post, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + // Sinhala + None, None, Post, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, Post, + + Post, Post, Above, Above, + Below, None, Below, None, + Post, Pre, Split, Pre, + Split, Split, Split, Post, + + None, None, None, None, + None, None, None, None, + None, None, None, None, + None, None, None, None, + + None, None, Post, Post, + None, None, None, None, + None, None, None, None, + None, None, None, None +}; + +static inline Form form(unsigned short uc) { + if (uc < 0x900 || uc > 0xdff) { + if (uc == 0x25cc) + return Consonant; + if (uc == 0x200c || uc == 0x200d) + return Control; + return Other; + } + return (Form)indicForms[uc-0x900]; +} + +static inline Position indic_position(unsigned short uc) { + if (uc < 0x900 || uc > 0xdff) + return None; + return (Position) indicPosition[uc-0x900]; +} + + +enum IndicScriptProperties { + HasReph = 0x01, + HasSplit = 0x02 +}; + +const hb_uint8 scriptProperties[10] = { + // Devanagari, + HasReph, + // Bengali, + HasReph|HasSplit, + // Gurmukhi, + 0, + // Gujarati, + HasReph, + // Oriya, + HasReph|HasSplit, + // Tamil, + HasSplit, + // Telugu, + HasSplit, + // Kannada, + HasSplit|HasReph, + // Malayalam, + HasSplit, + // Sinhala, + HasSplit +}; + +struct IndicOrdering { + Form form; + Position position; +}; + +static const IndicOrdering devanagari_order [] = { + { Consonant, Below }, + { Matra, Below }, + { VowelMark, Below }, + { StressMark, Below }, + { Matra, Above }, + { Matra, Post }, + { Consonant, Reph }, + { VowelMark, Above }, + { StressMark, Above }, + { VowelMark, Post }, + { (Form)0, None } +}; + +static const IndicOrdering bengali_order [] = { + { Consonant, Below }, + { Matra, Below }, + { Matra, Above }, + { Consonant, Reph }, + { VowelMark, Above }, + { Consonant, Post }, + { Matra, Post }, + { VowelMark, Post }, + { (Form)0, None } +}; + +static const IndicOrdering gurmukhi_order [] = { + { Consonant, Below }, + { Matra, Below }, + { Matra, Above }, + { Consonant, Post }, + { Matra, Post }, + { VowelMark, Above }, + { (Form)0, None } +}; + +static const IndicOrdering tamil_order [] = { + { Matra, Above }, + { Matra, Post }, + { VowelMark, Post }, + { (Form)0, None } +}; + +static const IndicOrdering telugu_order [] = { + { Matra, Above }, + { Matra, Below }, + { Matra, Post }, + { Consonant, Below }, + { Consonant, Post }, + { VowelMark, Post }, + { (Form)0, None } +}; + +static const IndicOrdering kannada_order [] = { + { Matra, Above }, + { Matra, Post }, + { Consonant, Below }, + { Consonant, Post }, + { LengthMark, Post }, + { Consonant, Reph }, + { VowelMark, Post }, + { (Form)0, None } +}; + +static const IndicOrdering malayalam_order [] = { + { Consonant, Below }, + { Matra, Below }, + { Consonant, Reph }, + { Consonant, Post }, + { Matra, Post }, + { VowelMark, Post }, + { (Form)0, None } +}; + +static const IndicOrdering sinhala_order [] = { + { Matra, Below }, + { Matra, Above }, + { Matra, Post }, + { VowelMark, Post }, + { (Form)0, None } +}; + +static const IndicOrdering * const indic_order[] = { + devanagari_order, // Devanagari + bengali_order, // Bengali + gurmukhi_order, // Gurmukhi + devanagari_order, // Gujarati + bengali_order, // Oriya + tamil_order, // Tamil + telugu_order, // Telugu + kannada_order, // Kannada + malayalam_order, // Malayalam + sinhala_order // Sinhala +}; + + + +// vowel matras that have to be split into two parts. +static const unsigned short split_matras[] = { + // matra, split1, split2, split3 + + // bengalis + 0x9cb, 0x9c7, 0x9be, 0x0, + 0x9cc, 0x9c7, 0x9d7, 0x0, + // oriya + 0xb48, 0xb47, 0xb56, 0x0, + 0xb4b, 0xb47, 0xb3e, 0x0, + 0xb4c, 0xb47, 0xb57, 0x0, + // tamil + 0xbca, 0xbc6, 0xbbe, 0x0, + 0xbcb, 0xbc7, 0xbbe, 0x0, + 0xbcc, 0xbc6, 0xbd7, 0x0, + // telugu + 0xc48, 0xc46, 0xc56, 0x0, + // kannada + 0xcc0, 0xcbf, 0xcd5, 0x0, + 0xcc7, 0xcc6, 0xcd5, 0x0, + 0xcc8, 0xcc6, 0xcd6, 0x0, + 0xcca, 0xcc6, 0xcc2, 0x0, + 0xccb, 0xcc6, 0xcc2, 0xcd5, + // malayalam + 0xd4a, 0xd46, 0xd3e, 0x0, + 0xd4b, 0xd47, 0xd3e, 0x0, + 0xd4c, 0xd46, 0xd57, 0x0, + // sinhala + 0xdda, 0xdd9, 0xdca, 0x0, + 0xddc, 0xdd9, 0xdcf, 0x0, + 0xddd, 0xdd9, 0xdcf, 0xdca, + 0xdde, 0xdd9, 0xddf, 0x0, + 0xffff +}; + +static inline void splitMatra(unsigned short *reordered, int matra, int &len) +{ + unsigned short matra_uc = reordered[matra]; + //qDebug("matra=%d, reordered[matra]=%x", matra, reordered[matra]); + + const unsigned short *split = split_matras; + while (split[0] < matra_uc) + split += 4; + + assert(*split == matra_uc); + ++split; + + int added_chars = split[2] == 0x0 ? 1 : 2; + + memmove(reordered + matra + added_chars, reordered + matra, (len-matra)*sizeof(unsigned short)); + reordered[matra] = split[0]; + reordered[matra+1] = split[1]; + if(added_chars == 2) + reordered[matra+2] = split[2]; + len += added_chars; +} + +#ifndef NO_OPENTYPE +static const HB_OpenTypeFeature indic_features[] = { + { HB_MAKE_TAG('l', 'o', 'c', 'a'), LocaProperty }, + { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, + { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty }, + { HB_MAKE_TAG('n', 'u', 'k', 't'), NuktaProperty }, + { HB_MAKE_TAG('a', 'k', 'h', 'n'), AkhantProperty }, + { HB_MAKE_TAG('r', 'p', 'h', 'f'), RephProperty }, + { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty }, + { HB_MAKE_TAG('h', 'a', 'l', 'f'), HalfFormProperty }, + { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty }, + { HB_MAKE_TAG('c', 'j', 'c', 't'), ConjunctFormProperty }, + { HB_MAKE_TAG('v', 'a', 't', 'u'), VattuProperty }, + { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty }, + { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty }, + { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty }, + { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty }, + { HB_MAKE_TAG('h', 'a', 'l', 'n'), HalantProperty }, + { HB_MAKE_TAG('c', 'a', 'l', 't'), IndicCaltProperty }, + { 0, 0 } +}; +#endif + +// #define INDIC_DEBUG +#ifdef INDIC_DEBUG +#define IDEBUG hb_debug +#include + +static void hb_debug(const char *msg, ...) +{ + va_list ap; + va_start(ap, msg); // use variable arg list + vfprintf(stderr, msg, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +#else +#define IDEBUG if(0) printf +#endif + +#if 0 //def INDIC_DEBUG +static QString propertiesToString(int properties) +{ + QString res; + properties = ~properties; + if (properties & LocaProperty) + res += "Loca "; + if (properties & CcmpProperty) + res += "Ccmp "; + if (properties & InitProperty) + res += "Init "; + if (properties & NuktaProperty) + res += "Nukta "; + if (properties & AkhantProperty) + res += "Akhant "; + if (properties & RephProperty) + res += "Reph "; + if (properties & PreFormProperty) + res += "PreForm "; + if (properties & BelowFormProperty) + res += "BelowForm "; + if (properties & AboveFormProperty) + res += "AboveForm "; + if (properties & HalfFormProperty) + res += "HalfForm "; + if (properties & PostFormProperty) + res += "PostForm "; + if (properties & ConjunctFormProperty) + res += "PostForm "; + if (properties & VattuProperty) + res += "Vattu "; + if (properties & PreSubstProperty) + res += "PreSubst "; + if (properties & BelowSubstProperty) + res += "BelowSubst "; + if (properties & AboveSubstProperty) + res += "AboveSubst "; + if (properties & PostSubstProperty) + res += "PostSubst "; + if (properties & HalantProperty) + res += "Halant "; + if (properties & CligProperty) + res += "Clig "; + if (properties & IndicCaltProperty) + res += "Calt "; + return res; +} +#endif + +static bool indic_shape_syllable(HB_Bool openType, HB_ShaperItem *item, bool invalid) +{ + HB_Script script = item->item.script; + assert(script >= HB_Script_Devanagari && script <= HB_Script_Sinhala); + const unsigned short script_base = 0x0900 + 0x80*(script-HB_Script_Devanagari); + const unsigned short ra = script_base + 0x30; + const unsigned short halant = script_base + 0x4d; + const unsigned short nukta = script_base + 0x3c; + bool control = false; + + int len = (int)item->item.length; + IDEBUG(">>>>> indic shape: from=%d, len=%d invalid=%d", item->item.pos, item->item.length, invalid); + + if ((int)item->num_glyphs < len+4) { + item->num_glyphs = len+4; + return false; + } + + HB_STACKARRAY(HB_UChar16, reordered, len + 4); + HB_STACKARRAY(hb_uint8, position, len + 4); + + unsigned char properties = scriptProperties[script-HB_Script_Devanagari]; + + if (invalid) { + *reordered = 0x25cc; + memcpy(reordered+1, item->string + item->item.pos, len*sizeof(HB_UChar16)); + len++; + } else { + memcpy(reordered, item->string + item->item.pos, len*sizeof(HB_UChar16)); + } + if (reordered[len-1] == 0x200c) // zero width non joiner + len--; + + int i; + int base = 0; + int reph = -1; + +#ifdef INDIC_DEBUG + IDEBUG("original:"); + for (i = 0; i < len; i++) { + IDEBUG(" %d: %4x", i, reordered[i]); + } +#endif + + if (len != 1) { + HB_UChar16 *uc = reordered; + bool beginsWithRa = false; + + // Rule 1: find base consonant + // + // The shaping engine finds the base consonant of the + // syllable, using the following algorithm: starting from the + // end of the syllable, move backwards until a consonant is + // found that does not have a below-base or post-base form + // (post-base forms have to follow below-base forms), or + // arrive at the first consonant. The consonant stopped at + // will be the base. + // + // * If the syllable starts with Ra + H (in a script that has + // 'Reph'), Ra is excluded from candidates for base + // consonants. + // + // * In Kannada and Telugu, the base consonant cannot be + // farther than 3 consonants from the end of the syllable. + // #### replace the HasReph property by testing if the feature exists in the font! + if (form(*uc) == Consonant || (script == HB_Script_Bengali && form(*uc) == IndependentVowel)) { + if ((properties & HasReph) && (len > 2) && + (*uc == ra || *uc == 0x9f0) && *(uc+1) == halant) + beginsWithRa = true; + + if (beginsWithRa && form(*(uc+2)) == Control) + beginsWithRa = false; + + base = (beginsWithRa ? 2 : 0); + IDEBUG(" length = %d, beginsWithRa = %d, base=%d", len, beginsWithRa, base); + + int lastConsonant = 0; + int matra = -1; + // we remember: + // * the last consonant since we need it for rule 2 + // * the matras position for rule 3 and 4 + + // figure out possible base glyphs + memset(position, 0, len); + if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) { + bool vattu = false; + for (i = base; i < len; ++i) { + position[i] = form(uc[i]); + if (position[i] == Consonant) { + lastConsonant = i; + vattu = (!vattu && uc[i] == ra); + if (vattu) { + IDEBUG("excluding vattu glyph at %d from base candidates", i); + position[i] = Vattu; + } + } else if (position[i] == Matra) { + matra = i; + } + } + } else { + for (i = base; i < len; ++i) { + position[i] = form(uc[i]); + if (position[i] == Consonant) + lastConsonant = i; + else if (matra < 0 && position[i] == Matra) + matra = i; + } + } + int skipped = 0; + Position pos = Post; + for (i = len-1; i >= base; i--) { + if (position[i] != Consonant && (position[i] != Control || script == HB_Script_Kannada)) + continue; + + if (i < len-1 && position[i] == Control && position[i+1] == Consonant) { + base = i+1; + break; + } + + Position charPosition = indic_position(uc[i]); + if (pos == Post && charPosition == Post) { + pos = Post; + } else if ((pos == Post || pos == Below) && charPosition == Below) { + if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) + base = i; + pos = Below; + } else { + base = i; + break; + } + if (skipped == 2 && (script == HB_Script_Kannada || script == HB_Script_Telugu)) { + base = i; + break; + } + ++skipped; + } + + IDEBUG(" base consonant at %d skipped=%d, lastConsonant=%d", base, skipped, lastConsonant); + + // Rule 2: + // + // If the base consonant is not the last one, Uniscribe + // moves the halant from the base consonant to the last + // one. + if (lastConsonant > base) { + int halantPos = 0; + if (uc[base+1] == halant) + halantPos = base + 1; + else if (uc[base+1] == nukta && uc[base+2] == halant) + halantPos = base + 2; + if (halantPos > 0) { + IDEBUG(" moving halant from %d to %d!", base+1, lastConsonant); + for (i = halantPos; i < lastConsonant; i++) + uc[i] = uc[i+1]; + uc[lastConsonant] = halant; + } + } + + // Rule 3: + // + // If the syllable starts with Ra + H, Uniscribe moves + // this combination so that it follows either: + + // * the post-base 'matra' (if any) or the base consonant + // (in scripts that show similarity to Devanagari, i.e., + // Devanagari, Gujarati, Bengali) + // * the base consonant (other scripts) + // * the end of the syllable (Kannada) + + Position matra_position = None; + if (matra > 0) + matra_position = indic_position(uc[matra]); + IDEBUG(" matra at %d with form %d, base=%d", matra, matra_position, base); + + if (beginsWithRa && base != 0) { + int toPos = base+1; + if (toPos < len && uc[toPos] == nukta) + toPos++; + if (toPos < len && uc[toPos] == halant) + toPos++; + if (toPos < len && uc[toPos] == 0x200d) + toPos++; + if (toPos < len-1 && uc[toPos] == ra && uc[toPos+1] == halant) + toPos += 2; + if (script == HB_Script_Devanagari || script == HB_Script_Gujarati || script == HB_Script_Bengali) { + if (matra_position == Post || matra_position == Split) { + toPos = matra+1; + matra -= 2; + } + } else if (script == HB_Script_Kannada) { + toPos = len; + matra -= 2; + } + + IDEBUG("moving leading ra+halant to position %d", toPos); + for (i = 2; i < toPos; i++) + uc[i-2] = uc[i]; + uc[toPos-2] = ra; + uc[toPos-1] = halant; + base -= 2; + if (properties & HasReph) + reph = toPos-2; + } + + // Rule 4: + + // Uniscribe splits two- or three-part matras into their + // parts. This splitting is a character-to-character + // operation). + // + // Uniscribe describes some moving operations for these + // matras here. For shaping however all pre matras need + // to be at the beginning of the syllable, so we just move + // them there now. + if (matra_position == Split) { + splitMatra(uc, matra, len); + // Handle three-part matras (0xccb in Kannada) + matra_position = indic_position(uc[matra]); + } + + if (matra_position == Pre) { + unsigned short m = uc[matra]; + while (matra--) + uc[matra+1] = uc[matra]; + uc[0] = m; + base++; + } + } + + // Rule 5: + // + // Uniscribe classifies consonants and 'matra' parts as + // pre-base, above-base (Reph), below-base or post-base. This + // classification exists on the character code level and is + // language-dependent, not font-dependent. + for (i = 0; i < base; ++i) + position[i] = Pre; + position[base] = Base; + for (i = base+1; i < len; ++i) { + position[i] = indic_position(uc[i]); + // #### replace by adjusting table + if (uc[i] == nukta || uc[i] == halant) + position[i] = Inherit; + } + if (reph > 0) { + // recalculate reph, it might have changed. + for (i = base+1; i < len; ++i) + if (uc[i] == ra) + reph = i; + position[reph] = Reph; + position[reph+1] = Inherit; + } + + // all reordering happens now to the chars after the base + int fixed = base+1; + if (fixed < len && uc[fixed] == nukta) + fixed++; + if (fixed < len && uc[fixed] == halant) + fixed++; + if (fixed < len && uc[fixed] == 0x200d) + fixed++; + +#ifdef INDIC_DEBUG + for (i = fixed; i < len; ++i) + IDEBUG("position[%d] = %d, form=%d uc=%x", i, position[i], form(uc[i]), uc[i]); +#endif + // we continuosly position the matras and vowel marks and increase the fixed + // until we reached the end. + const IndicOrdering *finalOrder = indic_order[script-HB_Script_Devanagari]; + + IDEBUG(" reordering pass:"); + IDEBUG(" base=%d fixed=%d", base, fixed); + int toMove = 0; + while (finalOrder[toMove].form && fixed < len-1) { + IDEBUG(" fixed = %d, toMove=%d, moving form %d with pos %d", fixed, toMove, finalOrder[toMove].form, finalOrder[toMove].position); + for (i = fixed; i < len; i++) { +// IDEBUG() << " i=" << i << "uc=" << hex << uc[i] << "form=" << form(uc[i]) +// << "position=" << position[i]; + if (form(uc[i]) == finalOrder[toMove].form && + position[i] == finalOrder[toMove].position) { + // need to move this glyph + int to = fixed; + if (i < len-1 && position[i+1] == Inherit) { + IDEBUG(" moving two chars from %d to %d", i, to); + unsigned short ch = uc[i]; + unsigned short ch2 = uc[i+1]; + unsigned char pos = position[i]; + for (int j = i+1; j > to+1; j--) { + uc[j] = uc[j-2]; + position[j] = position[j-2]; + } + uc[to] = ch; + uc[to+1] = ch2; + position[to] = pos; + position[to+1] = pos; + fixed += 2; + } else { + IDEBUG(" moving one char from %d to %d", i, to); + unsigned short ch = uc[i]; + unsigned char pos = position[i]; + for (int j = i; j > to; j--) { + uc[j] = uc[j-1]; + position[j] = position[j-1]; + } + uc[to] = ch; + position[to] = pos; + fixed++; + } + } + } + toMove++; + } + + } + + if (reph > 0) { + // recalculate reph, it might have changed. + for (i = base+1; i < len; ++i) + if (reordered[i] == ra) + reph = i; + } + +#ifndef NO_OPENTYPE + const int availableGlyphs = item->num_glyphs; +#endif + if (!item->font->klass->convertStringToGlyphIndices(item->font, + reordered, len, + item->glyphs, &item->num_glyphs, + item->item.bidiLevel % 2)) + goto error; + + + IDEBUG(" base=%d, reph=%d", base, reph); + IDEBUG("reordered:"); + for (i = 0; i < len; i++) { + item->attributes[i].mark = false; + item->attributes[i].clusterStart = false; + item->attributes[i].justification = 0; + item->attributes[i].zeroWidth = false; + IDEBUG(" %d: %4x", i, reordered[i]); + } + + // now we have the syllable in the right order, and can start running it through open type. + + for (i = 0; i < len; ++i) + control |= (form(reordered[i]) == Control); + +#ifndef NO_OPENTYPE + if (openType) { + + // we need to keep track of where the base glyph is for some + // scripts and use the cluster feature for this. This + // also means we have to correct the logCluster output from + // the open type engine manually afterwards. for indic this + // is rather simple, as all chars just point to the first + // glyph in the syllable. + HB_STACKARRAY(unsigned short, clusters, len); + HB_STACKARRAY(unsigned int, properties, len); + + for (i = 0; i < len; ++i) + clusters[i] = i; + + // features we should always apply + for (i = 0; i < len; ++i) + properties[i] = ~(LocaProperty + | CcmpProperty + | NuktaProperty + | VattuProperty + | ConjunctFormProperty + | PreSubstProperty + | BelowSubstProperty + | AboveSubstProperty + | PostSubstProperty + | HalantProperty + | IndicCaltProperty + | PositioningProperties); + + // Loca always applies + // Ccmp always applies + // Init + if (item->item.pos == 0 + || !(isLetter(item->string[item->item.pos-1]) || isMark(item->string[item->item.pos-1]))) + properties[0] &= ~InitProperty; + + // Nukta always applies + // Akhant + for (i = 0; i <= base; ++i) + properties[i] &= ~AkhantProperty; + // Reph + if (reph >= 0) { + properties[reph] &= ~RephProperty; + properties[reph+1] &= ~RephProperty; + } + // BelowForm + for (i = base+1; i < len; ++i) + properties[i] &= ~BelowFormProperty; + + if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) { + // vattu glyphs need this aswell + bool vattu = false; + for (i = base-2; i > 1; --i) { + if (form(reordered[i]) == Consonant) { + vattu = (!vattu && reordered[i] == ra); + if (vattu) { + IDEBUG("forming vattu ligature at %d", i); + properties[i] &= ~BelowFormProperty; + properties[i+1] &= ~BelowFormProperty; + } + } + } + } + // HalfFormProperty + for (i = 0; i < base; ++i) + properties[i] &= ~HalfFormProperty; + if (control) { + for (i = 2; i < len; ++i) { + if (reordered[i] == 0x200d /* ZWJ */) { + properties[i-1] &= ~HalfFormProperty; + properties[i-2] &= ~HalfFormProperty; + } else if (reordered[i] == 0x200c /* ZWNJ */) { + properties[i-1] &= ~HalfFormProperty; + properties[i-2] &= ~HalfFormProperty; + } + } + } + // PostFormProperty + for (i = base+1; i < len; ++i) + properties[i] &= ~PostFormProperty; + // vattu always applies + // pres always applies + // blws always applies + // abvs always applies + // psts always applies + // halant always applies + // calt always applies + +#ifdef INDIC_DEBUG +// { +// IDEBUG("OT properties:"); +// for (int i = 0; i < len; ++i) +// qDebug(" i: %s", ::propertiesToString(properties[i]).toLatin1().data()); +// } +#endif + + // initialize + item->log_clusters = clusters; + HB_OpenTypeShape(item, properties); + + int newLen = item->face->buffer->in_length; + HB_GlyphItem otl_glyphs = item->face->buffer->in_string; + + // move the left matra back to its correct position in malayalam and tamil + if ((script == HB_Script_Malayalam || script == HB_Script_Tamil) && (form(reordered[0]) == Matra)) { +// qDebug("reordering matra, len=%d", newLen); + // need to find the base in the shaped string and move the matra there + int basePos = 0; + while (basePos < newLen && (int)otl_glyphs[basePos].cluster <= base) + basePos++; + --basePos; + if (basePos < newLen && basePos > 1) { +// qDebug("moving prebase matra to position %d in syllable newlen=%d", basePos, newLen); + HB_GlyphItemRec m = otl_glyphs[0]; + --basePos; + for (i = 0; i < basePos; ++i) + otl_glyphs[i] = otl_glyphs[i+1]; + otl_glyphs[basePos] = m; + } + } + + HB_Bool positioned = HB_OpenTypePosition(item, availableGlyphs, false); + + HB_FREE_STACKARRAY(clusters); + HB_FREE_STACKARRAY(properties); + + if (!positioned) + goto error; + + if (control) { + IDEBUG("found a control char in the syllable"); + hb_uint32 i = 0, j = 0; + while (i < item->num_glyphs) { + if (form(reordered[otl_glyphs[i].cluster]) == Control) { + ++i; + if (i >= item->num_glyphs) + break; + } + item->glyphs[j] = item->glyphs[i]; + item->attributes[j] = item->attributes[i]; + item->advances[j] = item->advances[i]; + ++i; + ++j; + } + item->num_glyphs = j; + } + + } else { + HB_HeuristicPosition(item); + } +#endif // NO_OPENTYPE + item->attributes[0].clusterStart = true; + + HB_FREE_STACKARRAY(reordered); + HB_FREE_STACKARRAY(position); + + IDEBUG("<<<<<<"); + return true; + +error: + HB_FREE_STACKARRAY(reordered); + HB_FREE_STACKARRAY(position); + return false; +} + +/* syllables are of the form: + + (Consonant Nukta? Halant)* Consonant Matra? VowelMark? StressMark? + (Consonant Nukta? Halant)* Consonant Halant + IndependentVowel VowelMark? StressMark? + + We return syllable boundaries on invalid combinations aswell +*/ +static int indic_nextSyllableBoundary(HB_Script script, const HB_UChar16 *s, int start, int end, bool *invalid) +{ + *invalid = false; + IDEBUG("indic_nextSyllableBoundary: start=%d, end=%d", start, end); + const HB_UChar16 *uc = s+start; + + int pos = 0; + Form state = form(uc[pos]); + IDEBUG("state[%d]=%d (uc=%4x)", pos, state, uc[pos]); + pos++; + + if (state != Consonant && state != IndependentVowel) { + if (state != Other) + *invalid = true; + goto finish; + } + + while (pos < end - start) { + Form newState = form(uc[pos]); + IDEBUG("state[%d]=%d (uc=%4x)", pos, newState, uc[pos]); + switch(newState) { + case Control: + newState = state; + if (state == Halant && uc[pos] == 0x200d /* ZWJ */) + break; + // the control character should be the last char in the item + if (state == Consonant && script == HB_Script_Bengali && uc[pos-1] == 0x09B0 && uc[pos] == 0x200d /* ZWJ */) + break; + if (state == Consonant && script == HB_Script_Kannada && uc[pos-1] == 0x0CB0 && uc[pos] == 0x200d /* ZWJ */) + break; + // Bengali and Kannada has a special exception for rendering yaphala with ra (to avoid reph) see http://www.unicode.org/faq/indic.html#15 + ++pos; + goto finish; + case Consonant: + if (state == Halant && (script != HB_Script_Sinhala || uc[pos-1] == 0x200d /* ZWJ */)) + break; + goto finish; + case Halant: + if (state == Nukta || state == Consonant) + break; + // Bengali has a special exception allowing the combination Vowel_A/E + Halant + Ya + if (script == HB_Script_Bengali && pos == 1 && + (uc[0] == 0x0985 || uc[0] == 0x098f)) + break; + // Sinhala uses the Halant as a component of certain matras. Allow these, but keep the state on Matra. + if (script == HB_Script_Sinhala && state == Matra) { + ++pos; + continue; + } + if (script == HB_Script_Malayalam && state == Matra && uc[pos-1] == 0x0d41) { + ++pos; + continue; + } + goto finish; + case Nukta: + if (state == Consonant) + break; + goto finish; + case StressMark: + if (state == VowelMark) + break; + // fall through + case VowelMark: + if (state == Matra || state == LengthMark || state == IndependentVowel) + break; + // fall through + case Matra: + if (state == Consonant || state == Nukta) + break; + if (state == Matra) { + // ### needs proper testing for correct two/three part matras + break; + } + // ### not sure if this is correct. If it is, does it apply only to Bengali or should + // it work for all Indic languages? + // the combination Independent_A + Vowel Sign AA is allowed. + if (script == HB_Script_Bengali && uc[pos] == 0x9be && uc[pos-1] == 0x985) + break; + if (script == HB_Script_Tamil && state == Matra) { + if (uc[pos-1] == 0x0bc6 && + (uc[pos] == 0xbbe || uc[pos] == 0xbd7)) + break; + if (uc[pos-1] == 0x0bc7 && uc[pos] == 0xbbe) + break; + } + goto finish; + + case LengthMark: + if (state == Matra) { + // ### needs proper testing for correct two/three part matras + break; + } + case IndependentVowel: + case Invalid: + case Other: + goto finish; + } + state = newState; + pos++; + } + finish: + return pos+start; +} + +HB_Bool HB_IndicShape(HB_ShaperItem *item) +{ + assert(item->item.script >= HB_Script_Devanagari && item->item.script <= HB_Script_Sinhala); + + HB_Bool openType = false; +#ifndef NO_OPENTYPE + openType = HB_SelectScript(item, indic_features); +#endif + unsigned short *logClusters = item->log_clusters; + + HB_ShaperItem syllable = *item; + int first_glyph = 0; + + int sstart = item->item.pos; + int end = sstart + item->item.length; + IDEBUG("indic_shape: from %d length %d", item->item.pos, item->item.length); + while (sstart < end) { + bool invalid; + int send = indic_nextSyllableBoundary(item->item.script, item->string, sstart, end, &invalid); + IDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, + invalid ? "true" : "false"); + syllable.item.pos = sstart; + syllable.item.length = send-sstart; + syllable.glyphs = item->glyphs + first_glyph; + syllable.attributes = item->attributes + first_glyph; + syllable.offsets = item->offsets + first_glyph; + syllable.advances = item->advances + first_glyph; + syllable.num_glyphs = item->num_glyphs - first_glyph; + if (!indic_shape_syllable(openType, &syllable, invalid)) { + IDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs); + item->num_glyphs += syllable.num_glyphs; + return false; + } + // fix logcluster array + IDEBUG("syllable:"); + hb_uint32 g; + for (g = first_glyph; g < first_glyph + syllable.num_glyphs; ++g) + IDEBUG(" %d -> glyph %x", g, item->glyphs[g]); + IDEBUG(" logclusters:"); + int i; + for (i = sstart; i < send; ++i) { + IDEBUG(" %d -> glyph %d", i, first_glyph); + logClusters[i-item->item.pos] = first_glyph; + } + sstart = send; + first_glyph += syllable.num_glyphs; + } + item->num_glyphs = first_glyph; + return true; +} + +void HB_IndicAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) +{ + int end = from + len; + const HB_UChar16 *uc = text + from; + attributes += from; + hb_uint32 i = 0; + while (i < len) { + bool invalid; + hb_uint32 boundary = indic_nextSyllableBoundary(script, text, from+i, end, &invalid) - from; + attributes[i].charStop = true; + + if (boundary > len-1) boundary = len; + i++; + while (i < boundary) { + attributes[i].charStop = false; + ++uc; + ++i; + } + assert(i == boundary); + } + + +} + + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-khmer.c b/src/3rdparty/harfbuzz/src/harfbuzz-khmer.c new file mode 100644 index 0000000000..958069e866 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-khmer.c @@ -0,0 +1,667 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" + +#include +#include + +/* +// Vocabulary +// Base -> A consonant or an independent vowel in its full (not subscript) form. It is the +// center of the syllable, it can be surrounded by coeng (subscript) consonants, vowels, +// split vowels, signs... but there is only one base in a syllable, it has to be coded as +// the first character of the syllable. +// split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant). +// Khmer language has five of them. Khmer split vowels either have one part before the +// base and one after the base or they have a part before the base and a part above the base. +// The first part of all Khmer split vowels is the same character, identical to +// the glyph of Khmer dependent vowel SRA EI +// coeng --> modifier used in Khmer to construct coeng (subscript) consonants +// Differently than indian languages, the coeng modifies the consonant that follows it, +// not the one preceding it Each consonant has two forms, the base form and the subscript form +// the base form is the normal one (using the consonants code-point), the subscript form is +// displayed when the combination coeng + consonant is encountered. +// Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant +// Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO) +// Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA) +// Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds +// if it is attached to a consonant of the first series or a consonant of the second series +// Most consonants have an equivalent in the other series, but some of theme exist only in +// one series (for example SA). If we want to use the consonant SA with a vowel sound that +// can only be done with a vowel sound that corresponds to a vowel accompanying a consonant +// of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN +// x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and +// MUSIKATOAN a second series consonant to have a first series vowel sound. +// Consonant shifter are both normally supercript marks, but, when they are followed by a +// superscript, they change shape and take the form of subscript dependent vowel SRA U. +// If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they +// should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should +// be placed after the coeng consonant. +// Dependent vowel -> In khmer dependent vowels can be placed above, below, before or after the base +// Each vowel has its own position. Only one vowel per syllable is allowed. +// Signs -> Khmer has above signs and post signs. Only one above sign and/or one post sign are +// Allowed in a syllable. +// +// +// order is important here! This order must be the same that is found in each horizontal +// line in the statetable for Khmer (see khmerStateTable) . +*/ +enum KhmerCharClassValues { + CC_RESERVED = 0, + CC_CONSONANT = 1, /* Consonant of type 1 or independent vowel */ + CC_CONSONANT2 = 2, /* Consonant of type 2 */ + CC_CONSONANT3 = 3, /* Consonant of type 3 */ + CC_ZERO_WIDTH_NJ_MARK = 4, /* Zero Width non joiner character (0x200C) */ + CC_CONSONANT_SHIFTER = 5, + CC_ROBAT = 6, /* Khmer special diacritic accent -treated differently in state table */ + CC_COENG = 7, /* Subscript consonant combining character */ + CC_DEPENDENT_VOWEL = 8, + CC_SIGN_ABOVE = 9, + CC_SIGN_AFTER = 10, + CC_ZERO_WIDTH_J_MARK = 11, /* Zero width joiner character */ + CC_COUNT = 12 /* This is the number of character classes */ +}; + + +enum KhmerCharClassFlags { + CF_CLASS_MASK = 0x0000FFFF, + + CF_CONSONANT = 0x01000000, /* flag to speed up comparing */ + CF_SPLIT_VOWEL = 0x02000000, /* flag for a split vowel -> the first part is added in front of the syllable */ + CF_DOTTED_CIRCLE = 0x04000000, /* add a dotted circle if a character with this flag is the first in a syllable */ + CF_COENG = 0x08000000, /* flag to speed up comparing */ + CF_SHIFTER = 0x10000000, /* flag to speed up comparing */ + CF_ABOVE_VOWEL = 0x20000000, /* flag to speed up comparing */ + + /* position flags */ + CF_POS_BEFORE = 0x00080000, + CF_POS_BELOW = 0x00040000, + CF_POS_ABOVE = 0x00020000, + CF_POS_AFTER = 0x00010000, + CF_POS_MASK = 0x000f0000 +}; + + +/* Characters that get referred to by name */ +enum KhmerChar { + C_SIGN_ZWNJ = 0x200C, + C_SIGN_ZWJ = 0x200D, + C_RO = 0x179A, + C_VOWEL_AA = 0x17B6, + C_SIGN_NIKAHIT = 0x17C6, + C_VOWEL_E = 0x17C1, + C_COENG = 0x17D2 +}; + + +/* +// simple classes, they are used in the statetable (in this file) to control the length of a syllable +// they are also used to know where a character should be placed (location in reference to the base character) +// and also to know if a character, when independently displayed, should be displayed with a dotted-circle to +// indicate error in syllable construction +*/ +enum { + _xx = CC_RESERVED, + _sa = CC_SIGN_ABOVE | CF_DOTTED_CIRCLE | CF_POS_ABOVE, + _sp = CC_SIGN_AFTER | CF_DOTTED_CIRCLE| CF_POS_AFTER, + _c1 = CC_CONSONANT | CF_CONSONANT, + _c2 = CC_CONSONANT2 | CF_CONSONANT, + _c3 = CC_CONSONANT3 | CF_CONSONANT, + _rb = CC_ROBAT | CF_POS_ABOVE | CF_DOTTED_CIRCLE, + _cs = CC_CONSONANT_SHIFTER | CF_DOTTED_CIRCLE | CF_SHIFTER, + _dl = CC_DEPENDENT_VOWEL | CF_POS_BEFORE | CF_DOTTED_CIRCLE, + _db = CC_DEPENDENT_VOWEL | CF_POS_BELOW | CF_DOTTED_CIRCLE, + _da = CC_DEPENDENT_VOWEL | CF_POS_ABOVE | CF_DOTTED_CIRCLE | CF_ABOVE_VOWEL, + _dr = CC_DEPENDENT_VOWEL | CF_POS_AFTER | CF_DOTTED_CIRCLE, + _co = CC_COENG | CF_COENG | CF_DOTTED_CIRCLE, + + /* split vowel */ + _va = _da | CF_SPLIT_VOWEL, + _vr = _dr | CF_SPLIT_VOWEL +}; + + +/* +// Character class: a character class value +// ORed with character class flags. +*/ +typedef unsigned long KhmerCharClass; + + +/* +// Character class tables +// _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs... +// _sa Sign placed above the base +// _sp Sign placed after the base +// _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants) +// _c2 Consonant of type 2 (only RO) +// _c3 Consonant of type 3 +// _rb Khmer sign robat u17CC. combining mark for subscript consonants +// _cd Consonant-shifter +// _dl Dependent vowel placed before the base (left of the base) +// _db Dependent vowel placed below the base +// _da Dependent vowel placed above the base +// _dr Dependent vowel placed behind the base (right of the base) +// _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following +// it to create a subscript consonant or independent vowel +// _va Khmer split vowel in which the first part is before the base and the second one above the base +// _vr Khmer split vowel in which the first part is before the base and the second one behind (right of) the base +*/ +static const KhmerCharClass khmerCharClasses[] = { + _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, /* 1780 - 178F */ + _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c2, _c1, _c1, _c1, _c3, _c3, /* 1790 - 179F */ + _c1, _c3, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, /* 17A0 - 17AF */ + _c1, _c1, _c1, _c1, _dr, _dr, _dr, _da, _da, _da, _da, _db, _db, _db, _va, _vr, /* 17B0 - 17BF */ + _vr, _dl, _dl, _dl, _vr, _vr, _sa, _sp, _sp, _cs, _cs, _sa, _rb, _sa, _sa, _sa, /* 17C0 - 17CF */ + _sa, _sa, _co, _sa, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _sa, _xx, _xx /* 17D0 - 17DF */ +}; + +/* this enum must reflect the range of khmerCharClasses */ +enum KhmerCharClassesRange { + KhmerFirstChar = 0x1780, + KhmerLastChar = 0x17df +}; + +/* +// Below we define how a character in the input string is either in the khmerCharClasses table +// (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear +// within the syllable, but are not in the table) we also get their type back, or an unknown object +// in which case we get _xx (CC_RESERVED) back +*/ +static KhmerCharClass getKhmerCharClass(HB_UChar16 uc) +{ + if (uc == C_SIGN_ZWJ) { + return CC_ZERO_WIDTH_J_MARK; + } + + if (uc == C_SIGN_ZWNJ) { + return CC_ZERO_WIDTH_NJ_MARK; + } + + if (uc < KhmerFirstChar || uc > KhmerLastChar) { + return CC_RESERVED; + } + + return khmerCharClasses[uc - KhmerFirstChar]; +} + + +/* +// The stateTable is used to calculate the end (the length) of a well +// formed Khmer Syllable. +// +// Each horizontal line is ordered exactly the same way as the values in KhmerClassTable +// CharClassValues. This coincidence of values allows the follow up of the table. +// +// Each line corresponds to a state, which does not necessarily need to be a type +// of component... for example, state 2 is a base, with is always a first character +// in the syllable, but the state could be produced a consonant of any type when +// it is the first character that is analysed (in ground state). +// +// Differentiating 3 types of consonants is necessary in order to +// forbid the use of certain combinations, such as having a second +// coeng after a coeng RO, +// The inexistent possibility of having a type 3 after another type 3 is permitted, +// eliminating it would very much complicate the table, and it does not create typing +// problems, as the case above. +// +// The table is quite complex, in order to limit the number of coeng consonants +// to 2 (by means of the table). +// +// There a peculiarity, as far as Unicode is concerned: +// - The consonant-shifter is considered in two possible different +// locations, the one considered in Unicode 3.0 and the one considered in +// Unicode 4.0. (there is a backwards compatibility problem in this standard). +// +// +// xx independent character, such as a number, punctuation sign or non-khmer char +// +// c1 Khmer consonant of type 1 or an independent vowel +// that is, a letter in which the subscript for is only under the +// base, not taking any space to the right or to the left +// +// c2 Khmer consonant of type 2, the coeng form takes space under +// and to the left of the base (only RO is of this type) +// +// c3 Khmer consonant of type 3. Its subscript form takes space under +// and to the right of the base. +// +// cs Khmer consonant shifter +// +// rb Khmer robat +// +// co coeng character (u17D2) +// +// dv dependent vowel (including split vowels, they are treated in the same way). +// even if dv is not defined above, the component that is really tested for is +// KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels +// +// zwj Zero Width joiner +// +// zwnj Zero width non joiner +// +// sa above sign +// +// sp post sign +// +// there are lines with equal content but for an easier understanding +// (and maybe change in the future) we did not join them +*/ +static const signed char khmerStateTable[][CC_COUNT] = +{ + /* xx c1 c2 c3 zwnj cs rb co dv sa sp zwj */ + { 1, 2, 2, 2, 1, 1, 1, 6, 1, 1, 1, 2}, /* 0 - ground state */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sign to the right of the syllable) */ + {-1, -1, -1, -1, 3, 4, 5, 6, 16, 17, 1, -1}, /* 2 - Base consonant */ + {-1, -1, -1, -1, -1, 4, -1, -1, 16, -1, -1, -1}, /* 3 - First ZWNJ before a register shifter It can only be followed by a shifter or a vowel */ + {-1, -1, -1, -1, 15, -1, -1, 6, 16, 17, 1, 14}, /* 4 - First register shifter */ + {-1, -1, -1, -1, -1, -1, -1, -1, 20, -1, 1, -1}, /* 5 - Robat */ + {-1, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1}, /* 6 - First Coeng */ + {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, /* 7 - First consonant of type 1 after coeng */ + {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 1, 14}, /* 8 - First consonant of type 2 after coeng */ + {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, /* 9 - First consonant or type 3 after ceong */ + {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, /* 10 - Second Coeng (no register shifter before) */ + {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, /* 11 - Second coeng consonant (or ind. vowel) no register shifter before */ + {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, /* 12 - Second ZWNJ before a register shifter */ + {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, /* 13 - Second register shifter */ + {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 14 - ZWJ before vowel */ + {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 15 - ZWNJ before vowel */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 1, 18}, /* 16 - dependent vowel */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, /* 17 - sign above */ + {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, /* 18 - ZWJ after vowel */ + {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 19 - Third coeng */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 20 - dependent vowel after a Robat */ +}; + + +/* #define KHMER_DEBUG */ +#ifdef KHMER_DEBUG +#define KHDEBUG qDebug +#else +#define KHDEBUG if(0) printf +#endif + +/* +// Given an input string of characters and a location in which to start looking +// calculate, using the state table, which one is the last character of the syllable +// that starts in the starting position. +*/ +static int khmer_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid) +{ + const HB_UChar16 *uc = s + start; + int state = 0; + int pos = start; + *invalid = FALSE; + + while (pos < end) { + KhmerCharClass charClass = getKhmerCharClass(*uc); + if (pos == start) { + *invalid = (charClass > 0) && ! (charClass & CF_CONSONANT); + } + state = khmerStateTable[state][charClass & CF_CLASS_MASK]; + + KHDEBUG("state[%d]=%d class=%8lx (uc=%4x)", pos - start, state, + charClass, *uc ); + + if (state < 0) { + break; + } + ++uc; + ++pos; + } + return pos; +} + +#ifndef NO_OPENTYPE +static const HB_OpenTypeFeature khmer_features[] = { + { HB_MAKE_TAG( 'p', 'r', 'e', 'f' ), PreFormProperty }, + { HB_MAKE_TAG( 'b', 'l', 'w', 'f' ), BelowFormProperty }, + { HB_MAKE_TAG( 'a', 'b', 'v', 'f' ), AboveFormProperty }, + { HB_MAKE_TAG( 'p', 's', 't', 'f' ), PostFormProperty }, + { HB_MAKE_TAG( 'p', 'r', 'e', 's' ), PreSubstProperty }, + { HB_MAKE_TAG( 'b', 'l', 'w', 's' ), BelowSubstProperty }, + { HB_MAKE_TAG( 'a', 'b', 'v', 's' ), AboveSubstProperty }, + { HB_MAKE_TAG( 'p', 's', 't', 's' ), PostSubstProperty }, + { HB_MAKE_TAG( 'c', 'l', 'i', 'g' ), CligProperty }, + { 0, 0 } +}; +#endif + + +static HB_Bool khmer_shape_syllable(HB_Bool openType, HB_ShaperItem *item) +{ +/* KHDEBUG("syllable from %d len %d, str='%s'", item->from, item->length, + item->string->mid(item->from, item->length).toUtf8().data()); */ + + int len = 0; + int syllableEnd = item->item.pos + item->item.length; + unsigned short reordered[16]; + unsigned char properties[16]; + enum { + AboveForm = 0x01, + PreForm = 0x02, + PostForm = 0x04, + BelowForm = 0x08 + }; +#ifndef NO_OPENTYPE + const int availableGlyphs = item->num_glyphs; +#endif + int coengRo; + int i; + + /* according to the specs this is the max length one can get + ### the real value should be smaller */ + assert(item->item.length < 13); + + memset(properties, 0, 16*sizeof(unsigned char)); + +#ifdef KHMER_DEBUG + qDebug("original:"); + for (int i = from; i < syllableEnd; i++) { + qDebug(" %d: %4x", i, string[i]); + } +#endif + + /* + // write a pre vowel or the pre part of a split vowel first + // and look out for coeng + ro. RO is the only vowel of type 2, and + // therefore the only one that requires saving space before the base. + */ + coengRo = -1; /* There is no Coeng Ro, if found this value will change */ + for (i = item->item.pos; i < syllableEnd; i += 1) { + KhmerCharClass charClass = getKhmerCharClass(item->string[i]); + + /* if a split vowel, write the pre part. In Khmer the pre part + is the same for all split vowels, same glyph as pre vowel C_VOWEL_E */ + if (charClass & CF_SPLIT_VOWEL) { + reordered[len] = C_VOWEL_E; + properties[len] = PreForm; + ++len; + break; /* there can be only one vowel */ + } + /* if a vowel with pos before write it out */ + if (charClass & CF_POS_BEFORE) { + reordered[len] = item->string[i]; + properties[len] = PreForm; + ++len; + break; /* there can be only one vowel */ + } + /* look for coeng + ro and remember position + works because coeng + ro is always in front of a vowel (if there is a vowel) + and because CC_CONSONANT2 is enough to identify it, as it is the only consonant + with this flag */ + if ( (charClass & CF_COENG) && (i + 1 < syllableEnd) && + ( (getKhmerCharClass(item->string[i+1]) & CF_CLASS_MASK) == CC_CONSONANT2) ) { + coengRo = i; + } + } + + /* write coeng + ro if found */ + if (coengRo > -1) { + reordered[len] = C_COENG; + properties[len] = PreForm; + ++len; + reordered[len] = C_RO; + properties[len] = PreForm; + ++len; + } + + /* + shall we add a dotted circle? + If in the position in which the base should be (first char in the string) there is + a character that has the Dotted circle flag (a character that cannot be a base) + then write a dotted circle */ + if (getKhmerCharClass(item->string[item->item.pos]) & CF_DOTTED_CIRCLE) { + reordered[len] = C_DOTTED_CIRCLE; + ++len; + } + + /* copy what is left to the output, skipping before vowels and + coeng Ro if they are present */ + for (i = item->item.pos; i < syllableEnd; i += 1) { + HB_UChar16 uc = item->string[i]; + KhmerCharClass charClass = getKhmerCharClass(uc); + + /* skip a before vowel, it was already processed */ + if (charClass & CF_POS_BEFORE) { + continue; + } + + /* skip coeng + ro, it was already processed */ + if (i == coengRo) { + i += 1; + continue; + } + + switch (charClass & CF_POS_MASK) + { + case CF_POS_ABOVE : + reordered[len] = uc; + properties[len] = AboveForm; + ++len; + break; + + case CF_POS_AFTER : + reordered[len] = uc; + properties[len] = PostForm; + ++len; + break; + + case CF_POS_BELOW : + reordered[len] = uc; + properties[len] = BelowForm; + ++len; + break; + + default: + /* assign the correct flags to a coeng consonant + Consonants of type 3 are taged as Post forms and those type 1 as below forms */ + if ( (charClass & CF_COENG) && i + 1 < syllableEnd ) { + unsigned char property = (getKhmerCharClass(item->string[i+1]) & CF_CLASS_MASK) == CC_CONSONANT3 ? + PostForm : BelowForm; + reordered[len] = uc; + properties[len] = property; + ++len; + i += 1; + reordered[len] = item->string[i]; + properties[len] = property; + ++len; + break; + } + + /* if a shifter is followed by an above vowel change the shifter to below form, + an above vowel can have two possible positions i + 1 or i + 3 + (position i+1 corresponds to unicode 3, position i+3 to Unicode 4) + and there is an extra rule for C_VOWEL_AA + C_SIGN_NIKAHIT also for two + different positions, right after the shifter or after a vowel (Unicode 4) */ + if ( (charClass & CF_SHIFTER) && (i + 1 < syllableEnd) ) { + if (getKhmerCharClass(item->string[i+1]) & CF_ABOVE_VOWEL ) { + reordered[len] = uc; + properties[len] = BelowForm; + ++len; + break; + } + if (i + 2 < syllableEnd && + (item->string[i+1] == C_VOWEL_AA) && + (item->string[i+2] == C_SIGN_NIKAHIT) ) + { + reordered[len] = uc; + properties[len] = BelowForm; + ++len; + break; + } + if (i + 3 < syllableEnd && (getKhmerCharClass(item->string[i+3]) & CF_ABOVE_VOWEL) ) { + reordered[len] = uc; + properties[len] = BelowForm; + ++len; + break; + } + if (i + 4 < syllableEnd && + (item->string[i+3] == C_VOWEL_AA) && + (item->string[i+4] == C_SIGN_NIKAHIT) ) + { + reordered[len] = uc; + properties[len] = BelowForm; + ++len; + break; + } + } + + /* default - any other characters */ + reordered[len] = uc; + ++len; + break; + } /* switch */ + } /* for */ + + if (!item->font->klass->convertStringToGlyphIndices(item->font, + reordered, len, + item->glyphs, &item->num_glyphs, + item->item.bidiLevel % 2)) + return FALSE; + + + KHDEBUG("after shaping: len=%d", len); + for (i = 0; i < len; i++) { + item->attributes[i].mark = FALSE; + item->attributes[i].clusterStart = FALSE; + item->attributes[i].justification = 0; + item->attributes[i].zeroWidth = FALSE; + KHDEBUG(" %d: %4x property=%x", i, reordered[i], properties[i]); + } + + /* now we have the syllable in the right order, and can start running it through open type. */ + +#ifndef NO_OPENTYPE + if (openType) { + hb_uint32 where[16]; + for (i = 0; i < len; ++i) { + where[i] = ~(PreSubstProperty + | BelowSubstProperty + | AboveSubstProperty + | PostSubstProperty + | CligProperty + | PositioningProperties); + if (properties[i] == PreForm) + where[i] &= ~PreFormProperty; + else if (properties[i] == BelowForm) + where[i] &= ~BelowFormProperty; + else if (properties[i] == AboveForm) + where[i] &= ~AboveFormProperty; + else if (properties[i] == PostForm) + where[i] &= ~PostFormProperty; + } + + HB_OpenTypeShape(item, where); + if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE)) + return FALSE; + } else +#endif + { + KHDEBUG("Not using openType"); + HB_HeuristicPosition(item); + } + + item->attributes[0].clusterStart = TRUE; + return TRUE; +} + +HB_Bool HB_KhmerShape(HB_ShaperItem *item) +{ + HB_Bool openType = FALSE; + unsigned short *logClusters = item->log_clusters; + int i; + + HB_ShaperItem syllable = *item; + int first_glyph = 0; + + int sstart = item->item.pos; + int end = sstart + item->item.length; + + assert(item->item.script == HB_Script_Khmer); + +#ifndef NO_OPENTYPE + openType = HB_SelectScript(item, khmer_features); +#endif + + KHDEBUG("khmer_shape: from %d length %d", item->item.pos, item->item.length); + while (sstart < end) { + HB_Bool invalid; + int send = khmer_nextSyllableBoundary(item->string, sstart, end, &invalid); + KHDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, + invalid ? "TRUE" : "FALSE"); + syllable.item.pos = sstart; + syllable.item.length = send-sstart; + syllable.glyphs = item->glyphs + first_glyph; + syllable.attributes = item->attributes + first_glyph; + syllable.offsets = item->offsets + first_glyph; + syllable.advances = item->advances + first_glyph; + syllable.num_glyphs = item->num_glyphs - first_glyph; + if (!khmer_shape_syllable(openType, &syllable)) { + KHDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs); + item->num_glyphs += syllable.num_glyphs; + return FALSE; + } + /* fix logcluster array */ + KHDEBUG("syllable:"); + for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i) + KHDEBUG(" %d -> glyph %x", i, item->glyphs[i]); + KHDEBUG(" logclusters:"); + for (i = sstart; i < send; ++i) { + KHDEBUG(" %d -> glyph %d", i, first_glyph); + logClusters[i-item->item.pos] = first_glyph; + } + sstart = send; + first_glyph += syllable.num_glyphs; + } + item->num_glyphs = first_glyph; + return TRUE; +} + +void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) +{ + int end = from + len; + const HB_UChar16 *uc = text + from; + hb_uint32 i = 0; + HB_UNUSED(script); + attributes += from; + while ( i < len ) { + HB_Bool invalid; + hb_uint32 boundary = khmer_nextSyllableBoundary( text, from+i, end, &invalid ) - from; + + attributes[i].charStop = TRUE; + + if ( boundary > len-1 ) boundary = len; + i++; + while ( i < boundary ) { + attributes[i].charStop = FALSE; + ++uc; + ++i; + } + assert( i == boundary ); + } +} + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c b/src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c new file mode 100644 index 0000000000..4b68e64d85 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-myanmar.c @@ -0,0 +1,538 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" + +#include +#include + +enum MymrCharClassValues +{ + Mymr_CC_RESERVED = 0, + Mymr_CC_CONSONANT = 1, /* Consonant of type 1, that has subscript form */ + Mymr_CC_CONSONANT2 = 2, /* Consonant of type 2, that has no subscript form */ + Mymr_CC_NGA = 3, /* Consonant NGA */ + Mymr_CC_YA = 4, /* Consonant YA */ + Mymr_CC_RA = 5, /* Consonant RA */ + Mymr_CC_WA = 6, /* Consonant WA */ + Mymr_CC_HA = 7, /* Consonant HA */ + Mymr_CC_IND_VOWEL = 8, /* Independent vowel */ + Mymr_CC_ZERO_WIDTH_NJ_MARK = 9, /* Zero Width non joiner character (0x200C) */ + Mymr_CC_VIRAMA = 10, /* Subscript consonant combining character */ + Mymr_CC_PRE_VOWEL = 11, /* Dependent vowel, prebase (Vowel e) */ + Mymr_CC_BELOW_VOWEL = 12, /* Dependent vowel, prebase (Vowel u, uu) */ + Mymr_CC_ABOVE_VOWEL = 13, /* Dependent vowel, prebase (Vowel i, ii, ai) */ + Mymr_CC_POST_VOWEL = 14, /* Dependent vowel, prebase (Vowel aa) */ + Mymr_CC_SIGN_ABOVE = 15, + Mymr_CC_SIGN_BELOW = 16, + Mymr_CC_SIGN_AFTER = 17, + Mymr_CC_ZERO_WIDTH_J_MARK = 18, /* Zero width joiner character */ + Mymr_CC_COUNT = 19 /* This is the number of character classes */ +}; + +enum MymrCharClassFlags +{ + Mymr_CF_CLASS_MASK = 0x0000FFFF, + + Mymr_CF_CONSONANT = 0x01000000, /* flag to speed up comparing */ + Mymr_CF_MEDIAL = 0x02000000, /* flag to speed up comparing */ + Mymr_CF_IND_VOWEL = 0x04000000, /* flag to speed up comparing */ + Mymr_CF_DEP_VOWEL = 0x08000000, /* flag to speed up comparing */ + Mymr_CF_DOTTED_CIRCLE = 0x10000000, /* add a dotted circle if a character with this flag is the first in a syllable */ + Mymr_CF_VIRAMA = 0x20000000, /* flag to speed up comparing */ + + /* position flags */ + Mymr_CF_POS_BEFORE = 0x00080000, + Mymr_CF_POS_BELOW = 0x00040000, + Mymr_CF_POS_ABOVE = 0x00020000, + Mymr_CF_POS_AFTER = 0x00010000, + Mymr_CF_POS_MASK = 0x000f0000, + + Mymr_CF_AFTER_KINZI = 0x00100000 +}; + +/* Characters that get refrered to by name */ +enum MymrChar +{ + Mymr_C_SIGN_ZWNJ = 0x200C, + Mymr_C_SIGN_ZWJ = 0x200D, + Mymr_C_DOTTED_CIRCLE = 0x25CC, + Mymr_C_RA = 0x101B, + Mymr_C_YA = 0x101A, + Mymr_C_NGA = 0x1004, + Mymr_C_VOWEL_E = 0x1031, + Mymr_C_VIRAMA = 0x1039 +}; + +enum +{ + Mymr_xx = Mymr_CC_RESERVED, + Mymr_c1 = Mymr_CC_CONSONANT | Mymr_CF_CONSONANT | Mymr_CF_POS_BELOW, + Mymr_c2 = Mymr_CC_CONSONANT2 | Mymr_CF_CONSONANT, + Mymr_ng = Mymr_CC_NGA | Mymr_CF_CONSONANT | Mymr_CF_POS_ABOVE, + Mymr_ya = Mymr_CC_YA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_AFTER | Mymr_CF_AFTER_KINZI, + Mymr_ra = Mymr_CC_RA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BEFORE, + Mymr_wa = Mymr_CC_WA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW, + Mymr_ha = Mymr_CC_HA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW, + Mymr_id = Mymr_CC_IND_VOWEL | Mymr_CF_IND_VOWEL, + Mymr_vi = Mymr_CC_VIRAMA | Mymr_CF_VIRAMA | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE, + Mymr_dl = Mymr_CC_PRE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BEFORE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, + Mymr_db = Mymr_CC_BELOW_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, + Mymr_da = Mymr_CC_ABOVE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, + Mymr_dr = Mymr_CC_POST_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, + Mymr_sa = Mymr_CC_SIGN_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_ABOVE | Mymr_CF_AFTER_KINZI, + Mymr_sb = Mymr_CC_SIGN_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_BELOW | Mymr_CF_AFTER_KINZI, + Mymr_sp = Mymr_CC_SIGN_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI +}; + + +typedef int MymrCharClass; + + +static const MymrCharClass mymrCharClasses[] = +{ + Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_ng, Mymr_c1, Mymr_c1, Mymr_c1, + Mymr_c1, Mymr_c1, Mymr_c2, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, /* 1000 - 100F */ + Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, + Mymr_c1, Mymr_c1, Mymr_ya, Mymr_ra, Mymr_c1, Mymr_wa, Mymr_c1, Mymr_ha, /* 1010 - 101F */ + Mymr_c2, Mymr_c2, Mymr_xx, Mymr_id, Mymr_id, Mymr_id, Mymr_id, Mymr_id, + Mymr_xx, Mymr_id, Mymr_id, Mymr_xx, Mymr_dr, Mymr_da, Mymr_da, Mymr_db, /* 1020 - 102F */ + Mymr_db, Mymr_dl, Mymr_da, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_sa, Mymr_sb, + Mymr_sp, Mymr_vi, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1030 - 103F */ + Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, + Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1040 - 104F */ + Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, + Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1050 - 105F */ +}; + +static MymrCharClass +getMyanmarCharClass (HB_UChar16 ch) +{ + if (ch == Mymr_C_SIGN_ZWJ) + return Mymr_CC_ZERO_WIDTH_J_MARK; + + if (ch == Mymr_C_SIGN_ZWNJ) + return Mymr_CC_ZERO_WIDTH_NJ_MARK; + + if (ch < 0x1000 || ch > 0x105f) + return Mymr_CC_RESERVED; + + return mymrCharClasses[ch - 0x1000]; +} + +static const signed char mymrStateTable[][Mymr_CC_COUNT] = +{ +/* xx c1, c2 ng ya ra wa ha id zwnj vi dl db da dr sa sb sp zwj */ + { 1, 4, 4, 2, 4, 4, 4, 4, 24, 1, 27, 17, 18, 19, 20, 21, 1, 1, 4}, /* 0 - ground state */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sp to the right of the syllable) */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 17, 18, 19, 20, 21, -1, -1, 4}, /* 2 - NGA */ + {-1, 4, 4, 4, 4, 4, 4, 4, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 3 - Virama after NGA */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 17, 18, 19, 20, 21, 1, 1, -1}, /* 4 - Base consonant */ + {-2, 6, -2, -2, 7, 8, 9, 10, -2, 23, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 5 - First virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 17, 18, 19, 20, 21, -1, -1, -1}, /* 6 - c1 after virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 7 - ya after virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 8 - ra after virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 9 - wa after virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 10 - ha after virama */ + {-1, -1, -1, -1, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 11 - Virama after NGA+zwj */ + {-2, -2, -2, -2, -2, -2, 13, 14, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 12 - Second virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 18, 19, 20, 21, -1, -1, -1}, /* 13 - wa after virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 14 - ha after virama */ + {-2, -2, -2, -2, -2, -2, -2, 16, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 15 - Third virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 16 - ha after virama */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, 1, 1, -1}, /* 17 - dl, Dependent vowel e */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, 21, 1, 1, -1}, /* 18 - db, Dependent vowel u,uu */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1}, /* 19 - da, Dependent vowel i,ii,ai */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 1, 1, -1}, /* 20 - dr, Dependent vowel aa */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 21 - sa, Sign anusvara */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 22 - atha */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 23 - zwnj for atha */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 24 - Independent vowel */ + {-2, -2, -2, -2, 26, 26, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 25 - Virama after subscript consonant */ + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, 1, -1}, /* 26 - ra/ya after subscript consonant + virama */ + {-1, 6, -1, -1, 7, 8, 9, 10, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 27 - Virama after ground state */ +/* exit state -2 is for invalid order of medials and combination of invalids + with virama where virama should treat as start of next syllable + */ +}; + + + +/*#define MYANMAR_DEBUG */ +#ifdef MYANMAR_DEBUG +#define MMDEBUG qDebug +#else +#define MMDEBUG if(0) printf +#endif + +/* +// Given an input string of characters and a location in which to start looking +// calculate, using the state table, which one is the last character of the syllable +// that starts in the starting position. +*/ +static int myanmar_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid) +{ + const HB_UChar16 *uc = s + start; + int state = 0; + int pos = start; + *invalid = FALSE; + + while (pos < end) { + MymrCharClass charClass = getMyanmarCharClass(*uc); + state = mymrStateTable[state][charClass & Mymr_CF_CLASS_MASK]; + if (pos == start) + *invalid = (HB_Bool)(charClass & Mymr_CF_DOTTED_CIRCLE); + + MMDEBUG("state[%d]=%d class=%8x (uc=%4x)", pos - start, state, charClass, *uc); + + if (state < 0) { + if (state < -1) + --pos; + break; + } + ++uc; + ++pos; + } + return pos; +} + +#ifndef NO_OPENTYPE +/* ###### might have to change order of above and below forms and substitutions, + but according to Unicode below comes before above */ +static const HB_OpenTypeFeature myanmar_features[] = { + { HB_MAKE_TAG('p', 'r', 'e', 'f'), PreFormProperty }, + { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty }, + { HB_MAKE_TAG('a', 'b', 'v', 'f'), AboveFormProperty }, + { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty }, + { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty }, + { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty }, + { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty }, + { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty }, + { HB_MAKE_TAG('r', 'l', 'i', 'g'), CligProperty }, /* Myanmar1 uses this instead of the other features */ + { 0, 0 } +}; +#endif + + +/* +// Visual order before shaping should be: +// +// [Vowel Mark E] +// [Virama + Medial Ra] +// [Base] +// [Virama + Consonant] +// [Nga + Virama] (Kinzi) ### should probably come before post forms (medial ya) +// [Vowels] +// [Marks] +// +// This means that we can keep the logical order apart from having to +// move the pre vowel, medial ra and kinzi +*/ + +static HB_Bool myanmar_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid) +{ + /* +// MMDEBUG("\nsyllable from %d len %d, str='%s'", item->item.pos, item->item.length, +// item->string->mid(item->from, item->length).toUtf8().data()); + */ + +#ifndef NO_OPENTYPE + const int availableGlyphs = item->num_glyphs; +#endif + const HB_UChar16 *uc = item->string + item->item.pos; + int vowel_e = -1; + int kinzi = -1; + int medial_ra = -1; + int base = -1; + int i; + int len = 0; + unsigned short reordered[32]; + unsigned char properties[32]; + enum { + AboveForm = 0x01, + PreForm = 0x02, + PostForm = 0x04, + BelowForm = 0x08 + }; + HB_Bool lastWasVirama = FALSE; + int basePos = -1; + + memset(properties, 0, 32*sizeof(unsigned char)); + + /* according to the table the max length of a syllable should be around 14 chars */ + assert(item->item.length < 32); + +#ifdef MYANMAR_DEBUG + printf("original:"); + for (i = 0; i < (int)item->item.length; i++) { + printf(" %d: %4x", i, uc[i]); + } +#endif + for (i = 0; i < (int)item->item.length; ++i) { + HB_UChar16 chr = uc[i]; + + if (chr == Mymr_C_VOWEL_E) { + vowel_e = i; + continue; + } + if (i == 0 + && chr == Mymr_C_NGA + && i + 2 < (int)item->item.length + && uc[i+1] == Mymr_C_VIRAMA) { + int mc = getMyanmarCharClass(uc[i+2]); + /*MMDEBUG("maybe kinzi: mc=%x", mc);*/ + if ((mc & Mymr_CF_CONSONANT) == Mymr_CF_CONSONANT) { + kinzi = i; + continue; + } + } + if (base >= 0 + && chr == Mymr_C_VIRAMA + && i + 1 < (int)item->item.length + && uc[i+1] == Mymr_C_RA) { + medial_ra = i; + continue; + } + if (base < 0) + base = i; + } + + MMDEBUG("\n base=%d, vowel_e=%d, kinzi=%d, medial_ra=%d", base, vowel_e, kinzi, medial_ra); + /* write vowel_e if found */ + if (vowel_e >= 0) { + reordered[0] = Mymr_C_VOWEL_E; + len = 1; + } + /* write medial_ra */ + if (medial_ra >= 0) { + reordered[len] = Mymr_C_VIRAMA; + reordered[len+1] = Mymr_C_RA; + properties[len] = PreForm; + properties[len+1] = PreForm; + len += 2; + } + + /* shall we add a dotted circle? + If in the position in which the base should be (first char in the string) there is + a character that has the Dotted circle flag (a character that cannot be a base) + then write a dotted circle */ + if (invalid) { + reordered[len] = C_DOTTED_CIRCLE; + ++len; + } + + /* copy the rest of the syllable to the output, inserting the kinzi + at the correct place */ + for (i = 0; i < (int)item->item.length; ++i) { + hb_uint16 chr = uc[i]; + MymrCharClass cc; + if (i == vowel_e) + continue; + if (i == medial_ra || i == kinzi) { + ++i; + continue; + } + + cc = getMyanmarCharClass(uc[i]); + if (kinzi >= 0 && i > base && (cc & Mymr_CF_AFTER_KINZI)) { + reordered[len] = Mymr_C_NGA; + reordered[len+1] = Mymr_C_VIRAMA; + properties[len-1] = AboveForm; + properties[len] = AboveForm; + len += 2; + kinzi = -1; + } + + if (lastWasVirama) { + int prop = 0; + switch(cc & Mymr_CF_POS_MASK) { + case Mymr_CF_POS_BEFORE: + prop = PreForm; + break; + case Mymr_CF_POS_BELOW: + prop = BelowForm; + break; + case Mymr_CF_POS_ABOVE: + prop = AboveForm; + break; + case Mymr_CF_POS_AFTER: + prop = PostForm; + break; + default: + break; + } + properties[len-1] = prop; + properties[len] = prop; + if(basePos >= 0 && basePos == len-2) + properties[len-2] = prop; + } + lastWasVirama = (chr == Mymr_C_VIRAMA); + if(i == base) + basePos = len; + + if ((chr != Mymr_C_SIGN_ZWNJ && chr != Mymr_C_SIGN_ZWJ) || !len) { + reordered[len] = chr; + ++len; + } + } + if (kinzi >= 0) { + reordered[len] = Mymr_C_NGA; + reordered[len+1] = Mymr_C_VIRAMA; + properties[len] = AboveForm; + properties[len+1] = AboveForm; + len += 2; + } + + if (!item->font->klass->convertStringToGlyphIndices(item->font, + reordered, len, + item->glyphs, &item->num_glyphs, + item->item.bidiLevel % 2)) + return FALSE; + + MMDEBUG("after shaping: len=%d", len); + for (i = 0; i < len; i++) { + item->attributes[i].mark = FALSE; + item->attributes[i].clusterStart = FALSE; + item->attributes[i].justification = 0; + item->attributes[i].zeroWidth = FALSE; + MMDEBUG(" %d: %4x property=%x", i, reordered[i], properties[i]); + } + + /* now we have the syllable in the right order, and can start running it through open type. */ + +#ifndef NO_OPENTYPE + if (openType) { + hb_uint32 where[32]; + + for (i = 0; i < len; ++i) { + where[i] = ~(PreSubstProperty + | BelowSubstProperty + | AboveSubstProperty + | PostSubstProperty + | CligProperty + | PositioningProperties); + if (properties[i] & PreForm) + where[i] &= ~PreFormProperty; + if (properties[i] & BelowForm) + where[i] &= ~BelowFormProperty; + if (properties[i] & AboveForm) + where[i] &= ~AboveFormProperty; + if (properties[i] & PostForm) + where[i] &= ~PostFormProperty; + } + + HB_OpenTypeShape(item, where); + if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE)) + return FALSE; + } else +#endif + { + MMDEBUG("Not using openType"); + HB_HeuristicPosition(item); + } + + item->attributes[0].clusterStart = TRUE; + return TRUE; +} + +HB_Bool HB_MyanmarShape(HB_ShaperItem *item) +{ + HB_Bool openType = FALSE; + unsigned short *logClusters = item->log_clusters; + + HB_ShaperItem syllable = *item; + int first_glyph = 0; + + int sstart = item->item.pos; + int end = sstart + item->item.length; + int i = 0; + + assert(item->item.script == HB_Script_Myanmar); +#ifndef NO_OPENTYPE + openType = HB_SelectScript(item, myanmar_features); +#endif + + MMDEBUG("myanmar_shape: from %d length %d", item->item.pos, item->item.length); + while (sstart < end) { + HB_Bool invalid; + int send = myanmar_nextSyllableBoundary(item->string, sstart, end, &invalid); + MMDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, + invalid ? "TRUE" : "FALSE"); + syllable.item.pos = sstart; + syllable.item.length = send-sstart; + syllable.glyphs = item->glyphs + first_glyph; + syllable.attributes = item->attributes + first_glyph; + syllable.advances = item->advances + first_glyph; + syllable.offsets = item->offsets + first_glyph; + syllable.num_glyphs = item->num_glyphs - first_glyph; + if (!myanmar_shape_syllable(openType, &syllable, invalid)) { + MMDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs); + item->num_glyphs += syllable.num_glyphs; + return FALSE; + } + + /* fix logcluster array */ + MMDEBUG("syllable:"); + for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i) + MMDEBUG(" %d -> glyph %x", i, item->glyphs[i]); + MMDEBUG(" logclusters:"); + for (i = sstart; i < send; ++i) { + MMDEBUG(" %d -> glyph %d", i, first_glyph); + logClusters[i-item->item.pos] = first_glyph; + } + sstart = send; + first_glyph += syllable.num_glyphs; + } + item->num_glyphs = first_glyph; + return TRUE; +} + +void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) +{ + int end = from + len; + const HB_UChar16 *uc = text + from; + hb_uint32 i = 0; + HB_UNUSED(script); + attributes += from; + while (i < len) { + HB_Bool invalid; + hb_uint32 boundary = myanmar_nextSyllableBoundary(text, from+i, end, &invalid) - from; + + attributes[i].charStop = TRUE; + if (i) + attributes[i-1].lineBreakType = HB_Break; + + if (boundary > len-1) + boundary = len; + i++; + while (i < boundary) { + attributes[i].charStop = FALSE; + ++uc; + ++i; + } + assert(i == boundary); + } +} + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h new file mode 100644 index 0000000000..f1ca27809b --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-open-private.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_OPEN_PRIVATE_H +#define HARFBUZZ_OPEN_PRIVATE_H + +#include "harfbuzz-impl.h" +#include "harfbuzz-open.h" +#include "harfbuzz-gsub-private.h" +#include "harfbuzz-gpos-private.h" + +HB_BEGIN_HEADER + + +struct HB_SubTable_ +{ + union + { + HB_GSUB_SubTable gsub; + HB_GPOS_SubTable gpos; + } st; +}; + + +HB_INTERNAL HB_Error +_HB_OPEN_Load_ScriptList( HB_ScriptList* sl, + HB_Stream input ); +HB_INTERNAL HB_Error +_HB_OPEN_Load_FeatureList( HB_FeatureList* fl, + HB_Stream input ); +HB_INTERNAL HB_Error +_HB_OPEN_Load_LookupList( HB_LookupList* ll, + HB_Stream input, + HB_Type type ); + +HB_INTERNAL HB_Error +_HB_OPEN_Load_Coverage( HB_Coverage* c, + HB_Stream input ); +HB_INTERNAL HB_Error +_HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd, + HB_UShort limit, + HB_Stream input ); +HB_INTERNAL HB_Error +_HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd, + HB_UShort limit, + HB_UInt class_offset, + HB_UInt base_offset, + HB_Stream input ); +HB_INTERNAL HB_Error +_HB_OPEN_Load_Device( HB_Device** d, + HB_Stream input ); + +HB_INTERNAL void _HB_OPEN_Free_ScriptList( HB_ScriptList* sl ); +HB_INTERNAL void _HB_OPEN_Free_FeatureList( HB_FeatureList* fl ); +HB_INTERNAL void _HB_OPEN_Free_LookupList( HB_LookupList* ll, + HB_Type type ); + +HB_INTERNAL void _HB_OPEN_Free_Coverage( HB_Coverage* c ); +HB_INTERNAL void _HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd ); +HB_INTERNAL void _HB_OPEN_Free_Device( HB_Device* d ); + + + +HB_INTERNAL HB_Error +_HB_OPEN_Coverage_Index( HB_Coverage* c, + HB_UShort glyphID, + HB_UShort* index ); +HB_INTERNAL HB_Error +_HB_OPEN_Get_Class( HB_ClassDefinition* cd, + HB_UShort glyphID, + HB_UShort* klass, + HB_UShort* index ); +HB_INTERNAL HB_Error +_HB_OPEN_Get_Device( HB_Device* d, + HB_UShort size, + HB_Short* value ); + +HB_END_HEADER + +#endif /* HARFBUZZ_OPEN_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open.c b/src/3rdparty/harfbuzz/src/harfbuzz-open.c new file mode 100644 index 0000000000..f12f5b7f08 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-open.c @@ -0,0 +1,1433 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-impl.h" +#include "harfbuzz-open-private.h" + + +/*************************** + * Script related functions + ***************************/ + + +/* LangSys */ + +static HB_Error Load_LangSys( HB_LangSys* ls, + HB_Stream stream ) +{ + HB_Error error; + HB_UShort n, count; + HB_UShort* fi; + + + if ( ACCESS_Frame( 6L ) ) + return error; + + ls->LookupOrderOffset = GET_UShort(); /* should be 0 */ + ls->ReqFeatureIndex = GET_UShort(); + count = ls->FeatureCount = GET_UShort(); + + FORGET_Frame(); + + ls->FeatureIndex = NULL; + + if ( ALLOC_ARRAY( ls->FeatureIndex, count, HB_UShort ) ) + return error; + + if ( ACCESS_Frame( count * 2L ) ) + { + FREE( ls->FeatureIndex ); + return error; + } + + fi = ls->FeatureIndex; + + for ( n = 0; n < count; n++ ) + fi[n] = GET_UShort(); + + FORGET_Frame(); + + return HB_Err_Ok; +} + + +static void Free_LangSys( HB_LangSys* ls ) +{ + FREE( ls->FeatureIndex ); +} + + +/* Script */ + +static HB_Error Load_Script( HB_ScriptTable* s, + HB_Stream stream ) +{ + HB_Error error; + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_LangSysRecord* lsr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + if ( new_offset != base_offset ) /* not a NULL offset */ + { + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_LangSys( &s->DefaultLangSys, + stream ) ) != HB_Err_Ok ) + return error; + (void)FILE_Seek( cur_offset ); + } + else + { + /* we create a DefaultLangSys table with no entries */ + + s->DefaultLangSys.LookupOrderOffset = 0; + s->DefaultLangSys.ReqFeatureIndex = 0xFFFF; + s->DefaultLangSys.FeatureCount = 0; + s->DefaultLangSys.FeatureIndex = NULL; + } + + if ( ACCESS_Frame( 2L ) ) + goto Fail2; + + count = s->LangSysCount = GET_UShort(); + + /* safety check; otherwise the official handling of TrueType Open + fonts won't work */ + + if ( s->LangSysCount == 0 && s->DefaultLangSys.FeatureCount == 0 ) + { + error = HB_Err_Not_Covered; + goto Fail2; + } + + FORGET_Frame(); + + s->LangSysRecord = NULL; + + if ( ALLOC_ARRAY( s->LangSysRecord, count, HB_LangSysRecord ) ) + goto Fail2; + + lsr = s->LangSysRecord; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 6L ) ) + goto Fail1; + + lsr[n].LangSysTag = GET_ULong(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_LangSys( &lsr[n].LangSys, stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_LangSys( &lsr[m].LangSys ); + + FREE( s->LangSysRecord ); + +Fail2: + Free_LangSys( &s->DefaultLangSys ); + return error; +} + + +static void Free_Script( HB_ScriptTable* s ) +{ + HB_UShort n, count; + + HB_LangSysRecord* lsr; + + + Free_LangSys( &s->DefaultLangSys ); + + if ( s->LangSysRecord ) + { + count = s->LangSysCount; + lsr = s->LangSysRecord; + + for ( n = 0; n < count; n++ ) + Free_LangSys( &lsr[n].LangSys ); + + FREE( lsr ); + } +} + + +/* ScriptList */ + +HB_INTERNAL HB_Error +_HB_OPEN_Load_ScriptList( HB_ScriptList* sl, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, script_count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_ScriptRecord* sr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + script_count = GET_UShort(); + + FORGET_Frame(); + + sl->ScriptRecord = NULL; + + if ( ALLOC_ARRAY( sl->ScriptRecord, script_count, HB_ScriptRecord ) ) + return error; + + sr = sl->ScriptRecord; + + sl->ScriptCount= 0; + for ( n = 0; n < script_count; n++ ) + { + if ( ACCESS_Frame( 6L ) ) + goto Fail; + + sr[sl->ScriptCount].ScriptTag = GET_ULong(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + + if ( FILE_Seek( new_offset ) ) + goto Fail; + + error = Load_Script( &sr[sl->ScriptCount].Script, stream ); + if ( error == HB_Err_Ok ) + sl->ScriptCount += 1; + else if ( error != HB_Err_Not_Covered ) + goto Fail; + + (void)FILE_Seek( cur_offset ); + } + + /* Empty tables are harmless and generated by fontforge. + * See http://bugzilla.gnome.org/show_bug.cgi?id=347073 + */ +#if 0 + if ( sl->ScriptCount == 0 ) + { + error = ERR(HB_Err_Invalid_SubTable); + goto Fail; + } +#endif + + return HB_Err_Ok; + +Fail: + for ( n = 0; n < sl->ScriptCount; n++ ) + Free_Script( &sr[n].Script ); + + FREE( sl->ScriptRecord ); + return error; +} + + +HB_INTERNAL void +_HB_OPEN_Free_ScriptList( HB_ScriptList* sl ) +{ + HB_UShort n, count; + + HB_ScriptRecord* sr; + + + if ( sl->ScriptRecord ) + { + count = sl->ScriptCount; + sr = sl->ScriptRecord; + + for ( n = 0; n < count; n++ ) + Free_Script( &sr[n].Script ); + + FREE( sr ); + } +} + + + +/********************************* + * Feature List related functions + *********************************/ + + +/* Feature */ + +static HB_Error Load_Feature( HB_Feature* f, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_UShort* lli; + + + if ( ACCESS_Frame( 4L ) ) + return error; + + f->FeatureParams = GET_UShort(); /* should be 0 */ + count = f->LookupListCount = GET_UShort(); + + FORGET_Frame(); + + f->LookupListIndex = NULL; + + if ( ALLOC_ARRAY( f->LookupListIndex, count, HB_UShort ) ) + return error; + + lli = f->LookupListIndex; + + if ( ACCESS_Frame( count * 2L ) ) + { + FREE( f->LookupListIndex ); + return error; + } + + for ( n = 0; n < count; n++ ) + lli[n] = GET_UShort(); + + FORGET_Frame(); + + return HB_Err_Ok; +} + + +static void Free_Feature( HB_Feature* f ) +{ + FREE( f->LookupListIndex ); +} + + +/* FeatureList */ + +HB_INTERNAL HB_Error +_HB_OPEN_Load_FeatureList( HB_FeatureList* fl, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_FeatureRecord* fr; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = fl->FeatureCount = GET_UShort(); + + FORGET_Frame(); + + fl->FeatureRecord = NULL; + + if ( ALLOC_ARRAY( fl->FeatureRecord, count, HB_FeatureRecord ) ) + return error; + if ( ALLOC_ARRAY( fl->ApplyOrder, count, HB_UShort ) ) + goto Fail2; + + fl->ApplyCount = 0; + + fr = fl->FeatureRecord; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 6L ) ) + goto Fail1; + + fr[n].FeatureTag = GET_ULong(); + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Feature( &fr[n].Feature, stream ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + for ( m = 0; m < n; m++ ) + Free_Feature( &fr[m].Feature ); + + FREE( fl->ApplyOrder ); + +Fail2: + FREE( fl->FeatureRecord ); + + return error; +} + + +HB_INTERNAL void +_HB_OPEN_Free_FeatureList( HB_FeatureList* fl ) +{ + HB_UShort n, count; + + HB_FeatureRecord* fr; + + + if ( fl->FeatureRecord ) + { + count = fl->FeatureCount; + fr = fl->FeatureRecord; + + for ( n = 0; n < count; n++ ) + Free_Feature( &fr[n].Feature ); + + FREE( fr ); + } + + FREE( fl->ApplyOrder ); +} + + + +/******************************** + * Lookup List related functions + ********************************/ + +/* the subroutines of the following two functions are defined in + ftxgsub.c and ftxgpos.c respectively */ + + +/* SubTable */ + +static HB_Error Load_SubTable( HB_SubTable* st, + HB_Stream stream, + HB_Type table_type, + HB_UShort lookup_type ) +{ + if ( table_type == HB_Type_GSUB ) + return _HB_GSUB_Load_SubTable ( &st->st.gsub, stream, lookup_type ); + else + return _HB_GPOS_Load_SubTable ( &st->st.gpos, stream, lookup_type ); +} + + +static void Free_SubTable( HB_SubTable* st, + HB_Type table_type, + HB_UShort lookup_type ) +{ + if ( table_type == HB_Type_GSUB ) + _HB_GSUB_Free_SubTable ( &st->st.gsub, lookup_type ); + else + _HB_GPOS_Free_SubTable ( &st->st.gpos, lookup_type ); +} + + +/* Lookup */ + +static HB_Error Load_Lookup( HB_Lookup* l, + HB_Stream stream, + HB_Type type ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_SubTable* st; + + HB_Bool is_extension = FALSE; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 6L ) ) + return error; + + l->LookupType = GET_UShort(); + l->LookupFlag = GET_UShort(); + count = l->SubTableCount = GET_UShort(); + + FORGET_Frame(); + + l->SubTable = NULL; + + if ( ALLOC_ARRAY( l->SubTable, count, HB_SubTable ) ) + return error; + + st = l->SubTable; + + if ( ( type == HB_Type_GSUB && l->LookupType == HB_GSUB_LOOKUP_EXTENSION ) || + ( type == HB_Type_GPOS && l->LookupType == HB_GPOS_LOOKUP_EXTENSION ) ) + is_extension = TRUE; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + + if ( is_extension ) + { + if ( FILE_Seek( new_offset ) || ACCESS_Frame( 8L ) ) + goto Fail; + + if (GET_UShort() != 1) /* format should be 1 */ + goto Fail; + + l->LookupType = GET_UShort(); + new_offset += GET_ULong(); + + FORGET_Frame(); + } + + if ( FILE_Seek( new_offset ) || + ( error = Load_SubTable( &st[n], stream, + type, l->LookupType ) ) != HB_Err_Ok ) + goto Fail; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail: + for ( m = 0; m < n; m++ ) + Free_SubTable( &st[m], type, l->LookupType ); + + FREE( l->SubTable ); + return error; +} + + +static void Free_Lookup( HB_Lookup* l, + HB_Type type) +{ + HB_UShort n, count; + + HB_SubTable* st; + + + if ( l->SubTable ) + { + count = l->SubTableCount; + st = l->SubTable; + + for ( n = 0; n < count; n++ ) + Free_SubTable( &st[n], type, l->LookupType ); + + FREE( st ); + } +} + + +/* LookupList */ + +HB_INTERNAL HB_Error +_HB_OPEN_Load_LookupList( HB_LookupList* ll, + HB_Stream stream, + HB_Type type ) +{ + HB_Error error; + + HB_UShort n, m, count; + HB_UInt cur_offset, new_offset, base_offset; + + HB_Lookup* l; + + + base_offset = FILE_Pos(); + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = ll->LookupCount = GET_UShort(); + + FORGET_Frame(); + + ll->Lookup = NULL; + + if ( ALLOC_ARRAY( ll->Lookup, count, HB_Lookup ) ) + return error; + if ( ALLOC_ARRAY( ll->Properties, count, HB_UInt ) ) + goto Fail2; + + l = ll->Lookup; + + for ( n = 0; n < count; n++ ) + { + if ( ACCESS_Frame( 2L ) ) + goto Fail1; + + new_offset = GET_UShort() + base_offset; + + FORGET_Frame(); + + cur_offset = FILE_Pos(); + if ( FILE_Seek( new_offset ) || + ( error = Load_Lookup( &l[n], stream, type ) ) != HB_Err_Ok ) + goto Fail1; + (void)FILE_Seek( cur_offset ); + } + + return HB_Err_Ok; + +Fail1: + FREE( ll->Properties ); + + for ( m = 0; m < n; m++ ) + Free_Lookup( &l[m], type ); + +Fail2: + FREE( ll->Lookup ); + return error; +} + + +HB_INTERNAL void +_HB_OPEN_Free_LookupList( HB_LookupList* ll, + HB_Type type ) +{ + HB_UShort n, count; + + HB_Lookup* l; + + + FREE( ll->Properties ); + + if ( ll->Lookup ) + { + count = ll->LookupCount; + l = ll->Lookup; + + for ( n = 0; n < count; n++ ) + Free_Lookup( &l[n], type ); + + FREE( l ); + } +} + + + +/***************************** + * Coverage related functions + *****************************/ + + +/* CoverageFormat1 */ + +static HB_Error Load_Coverage1( HB_CoverageFormat1* cf1, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_UShort* ga; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = cf1->GlyphCount = GET_UShort(); + + FORGET_Frame(); + + cf1->GlyphArray = NULL; + + if ( ALLOC_ARRAY( cf1->GlyphArray, count, HB_UShort ) ) + return error; + + ga = cf1->GlyphArray; + + if ( ACCESS_Frame( count * 2L ) ) + { + FREE( cf1->GlyphArray ); + return error; + } + + for ( n = 0; n < count; n++ ) + ga[n] = GET_UShort(); + + FORGET_Frame(); + + return HB_Err_Ok; +} + + +static void Free_Coverage1( HB_CoverageFormat1* cf1) +{ + FREE( cf1->GlyphArray ); +} + + +/* CoverageFormat2 */ + +static HB_Error Load_Coverage2( HB_CoverageFormat2* cf2, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_RangeRecord* rr; + + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = cf2->RangeCount = GET_UShort(); + + FORGET_Frame(); + + cf2->RangeRecord = NULL; + + if ( ALLOC_ARRAY( cf2->RangeRecord, count, HB_RangeRecord ) ) + return error; + + rr = cf2->RangeRecord; + + if ( ACCESS_Frame( count * 6L ) ) + goto Fail; + + for ( n = 0; n < count; n++ ) + { + rr[n].Start = GET_UShort(); + rr[n].End = GET_UShort(); + rr[n].StartCoverageIndex = GET_UShort(); + + /* sanity check; we are limited to 16bit integers */ + if ( rr[n].Start > rr[n].End || + ( rr[n].End - rr[n].Start + (long)rr[n].StartCoverageIndex ) >= + 0x10000L ) + { + error = ERR(HB_Err_Invalid_SubTable); + goto Fail; + } + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail: + FREE( cf2->RangeRecord ); + return error; +} + + +static void Free_Coverage2( HB_CoverageFormat2* cf2 ) +{ + FREE( cf2->RangeRecord ); +} + + +HB_INTERNAL HB_Error +_HB_OPEN_Load_Coverage( HB_Coverage* c, + HB_Stream stream ) +{ + HB_Error error; + + if ( ACCESS_Frame( 2L ) ) + return error; + + c->CoverageFormat = GET_UShort(); + + FORGET_Frame(); + + switch ( c->CoverageFormat ) + { + case 1: return Load_Coverage1( &c->cf.cf1, stream ); + case 2: return Load_Coverage2( &c->cf.cf2, stream ); + default: return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + +HB_INTERNAL void +_HB_OPEN_Free_Coverage( HB_Coverage* c ) +{ + switch ( c->CoverageFormat ) + { + case 1: Free_Coverage1( &c->cf.cf1 ); break; + case 2: Free_Coverage2( &c->cf.cf2 ); break; + default: break; + } +} + + +static HB_Error Coverage_Index1( HB_CoverageFormat1* cf1, + HB_UShort glyphID, + HB_UShort* index ) +{ + HB_UShort min, max, new_min, new_max, middle; + + HB_UShort* array = cf1->GlyphArray; + + + /* binary search */ + + if ( cf1->GlyphCount == 0 ) + return HB_Err_Not_Covered; + + new_min = 0; + new_max = cf1->GlyphCount - 1; + + do + { + min = new_min; + max = new_max; + + /* we use (min + max) / 2 = max - (max - min) / 2 to avoid + overflow and rounding errors */ + + middle = max - ( ( max - min ) >> 1 ); + + if ( glyphID == array[middle] ) + { + *index = middle; + return HB_Err_Ok; + } + else if ( glyphID < array[middle] ) + { + if ( middle == min ) + break; + new_max = middle - 1; + } + else + { + if ( middle == max ) + break; + new_min = middle + 1; + } + } while ( min < max ); + + return HB_Err_Not_Covered; +} + + +static HB_Error Coverage_Index2( HB_CoverageFormat2* cf2, + HB_UShort glyphID, + HB_UShort* index ) +{ + HB_UShort min, max, new_min, new_max, middle; + + HB_RangeRecord* rr = cf2->RangeRecord; + + + /* binary search */ + + if ( cf2->RangeCount == 0 ) + return HB_Err_Not_Covered; + + new_min = 0; + new_max = cf2->RangeCount - 1; + + do + { + min = new_min; + max = new_max; + + /* we use (min + max) / 2 = max - (max - min) / 2 to avoid + overflow and rounding errors */ + + middle = max - ( ( max - min ) >> 1 ); + + if ( glyphID >= rr[middle].Start && glyphID <= rr[middle].End ) + { + *index = rr[middle].StartCoverageIndex + glyphID - rr[middle].Start; + return HB_Err_Ok; + } + else if ( glyphID < rr[middle].Start ) + { + if ( middle == min ) + break; + new_max = middle - 1; + } + else + { + if ( middle == max ) + break; + new_min = middle + 1; + } + } while ( min < max ); + + return HB_Err_Not_Covered; +} + + +HB_INTERNAL HB_Error +_HB_OPEN_Coverage_Index( HB_Coverage* c, + HB_UShort glyphID, + HB_UShort* index ) +{ + switch ( c->CoverageFormat ) + { + case 1: return Coverage_Index1( &c->cf.cf1, glyphID, index ); + case 2: return Coverage_Index2( &c->cf.cf2, glyphID, index ); + default: return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + + +/************************************* + * Class Definition related functions + *************************************/ + + +/* ClassDefFormat1 */ + +static HB_Error Load_ClassDef1( HB_ClassDefinition* cd, + HB_UShort limit, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_UShort* cva; + + HB_ClassDefFormat1* cdf1; + + + cdf1 = &cd->cd.cd1; + + if ( ACCESS_Frame( 4L ) ) + return error; + + cdf1->StartGlyph = GET_UShort(); + count = cdf1->GlyphCount = GET_UShort(); + + FORGET_Frame(); + + /* sanity check; we are limited to 16bit integers */ + + if ( cdf1->StartGlyph + (long)count >= 0x10000L ) + return ERR(HB_Err_Invalid_SubTable); + + cdf1->ClassValueArray = NULL; + + if ( ALLOC_ARRAY( cdf1->ClassValueArray, count, HB_UShort ) ) + return error; + + cva = cdf1->ClassValueArray; + + if ( ACCESS_Frame( count * 2L ) ) + goto Fail; + + for ( n = 0; n < count; n++ ) + { + cva[n] = GET_UShort(); + if ( cva[n] >= limit ) + { + error = ERR(HB_Err_Invalid_SubTable); + goto Fail; + } + } + + FORGET_Frame(); + + return HB_Err_Ok; + +Fail: + FREE( cva ); + + return error; +} + + +static void Free_ClassDef1( HB_ClassDefFormat1* cdf1 ) +{ + FREE( cdf1->ClassValueArray ); +} + + +/* ClassDefFormat2 */ + +static HB_Error Load_ClassDef2( HB_ClassDefinition* cd, + HB_UShort limit, + HB_Stream stream ) +{ + HB_Error error; + + HB_UShort n, count; + + HB_ClassRangeRecord* crr; + + HB_ClassDefFormat2* cdf2; + + + cdf2 = &cd->cd.cd2; + + if ( ACCESS_Frame( 2L ) ) + return error; + + count = GET_UShort(); + cdf2->ClassRangeCount = 0; /* zero for now. we fill with the number of good entries later */ + + FORGET_Frame(); + + cdf2->ClassRangeRecord = NULL; + + if ( ALLOC_ARRAY( cdf2->ClassRangeRecord, count, HB_ClassRangeRecord ) ) + return error; + + crr = cdf2->ClassRangeRecord; + + if ( ACCESS_Frame( count * 6L ) ) + goto Fail; + + for ( n = 0; n < count; n++ ) + { + crr[n].Start = GET_UShort(); + crr[n].End = GET_UShort(); + crr[n].Class = GET_UShort(); + + /* sanity check */ + + if ( crr[n].Start > crr[n].End || + crr[n].Class >= limit ) + { + /* XXX + * Corrupt entry. Skip it. + * This is hit by Nafees Nastaliq font for example + */ + n--; + count--; + } + } + + FORGET_Frame(); + + cdf2->ClassRangeCount = count; + + return HB_Err_Ok; + +Fail: + FREE( crr ); + + return error; +} + + +static void Free_ClassDef2( HB_ClassDefFormat2* cdf2 ) +{ + FREE( cdf2->ClassRangeRecord ); +} + + +/* ClassDefinition */ + +HB_INTERNAL HB_Error +_HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd, + HB_UShort limit, + HB_Stream stream ) +{ + HB_Error error; + + if ( ACCESS_Frame( 2L ) ) + return error; + + cd->ClassFormat = GET_UShort(); + + FORGET_Frame(); + + switch ( cd->ClassFormat ) + { + case 1: error = Load_ClassDef1( cd, limit, stream ); break; + case 2: error = Load_ClassDef2( cd, limit, stream ); break; + default: error = ERR(HB_Err_Invalid_SubTable_Format); break; + } + + if ( error ) + return error; + + cd->loaded = TRUE; + + return HB_Err_Ok; +} + + +static HB_Error +_HB_OPEN_Load_EmptyClassDefinition( HB_ClassDefinition* cd ) +{ + HB_Error error; + + cd->ClassFormat = 1; /* Meaningless */ + + if ( ALLOC_ARRAY( cd->cd.cd1.ClassValueArray, 1, HB_UShort ) ) + return error; + + cd->loaded = TRUE; + + return HB_Err_Ok; +} + +HB_INTERNAL HB_Error +_HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd, + HB_UShort limit, + HB_UInt class_offset, + HB_UInt base_offset, + HB_Stream stream ) +{ + HB_Error error; + HB_UInt cur_offset; + + cur_offset = FILE_Pos(); + + if ( class_offset ) + { + if ( !FILE_Seek( class_offset + base_offset ) ) + error = _HB_OPEN_Load_ClassDefinition( cd, limit, stream ); + } + else + error = _HB_OPEN_Load_EmptyClassDefinition ( cd ); + + if (error == HB_Err_Ok) + (void)FILE_Seek( cur_offset ); /* Changes error as a side-effect */ + + return error; +} + +HB_INTERNAL void +_HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd ) +{ + if ( !cd->loaded ) + return; + + switch ( cd->ClassFormat ) + { + case 1: Free_ClassDef1( &cd->cd.cd1 ); break; + case 2: Free_ClassDef2( &cd->cd.cd2 ); break; + default: break; + } +} + + +static HB_Error Get_Class1( HB_ClassDefFormat1* cdf1, + HB_UShort glyphID, + HB_UShort* klass, + HB_UShort* index ) +{ + HB_UShort* cva = cdf1->ClassValueArray; + + + if ( index ) + *index = 0; + + if ( glyphID >= cdf1->StartGlyph && + glyphID < cdf1->StartGlyph + cdf1->GlyphCount ) + { + *klass = cva[glyphID - cdf1->StartGlyph]; + return HB_Err_Ok; + } + else + { + *klass = 0; + return HB_Err_Not_Covered; + } +} + + +/* we need the index value of the last searched class range record + in case of failure for constructed GDEF tables */ + +static HB_Error Get_Class2( HB_ClassDefFormat2* cdf2, + HB_UShort glyphID, + HB_UShort* klass, + HB_UShort* index ) +{ + HB_Error error = HB_Err_Ok; + HB_UShort min, max, new_min, new_max, middle; + + HB_ClassRangeRecord* crr = cdf2->ClassRangeRecord; + + + /* binary search */ + + if ( cdf2->ClassRangeCount == 0 ) + { + *klass = 0; + if ( index ) + *index = 0; + + return HB_Err_Not_Covered; + } + + new_min = 0; + new_max = cdf2->ClassRangeCount - 1; + + do + { + min = new_min; + max = new_max; + + /* we use (min + max) / 2 = max - (max - min) / 2 to avoid + overflow and rounding errors */ + + middle = max - ( ( max - min ) >> 1 ); + + if ( glyphID >= crr[middle].Start && glyphID <= crr[middle].End ) + { + *klass = crr[middle].Class; + error = HB_Err_Ok; + break; + } + else if ( glyphID < crr[middle].Start ) + { + if ( middle == min ) + { + *klass = 0; + error = HB_Err_Not_Covered; + break; + } + new_max = middle - 1; + } + else + { + if ( middle == max ) + { + *klass = 0; + error = HB_Err_Not_Covered; + break; + } + new_min = middle + 1; + } + } while ( min < max ); + + if ( index ) + *index = middle; + + return error; +} + + +HB_INTERNAL HB_Error +_HB_OPEN_Get_Class( HB_ClassDefinition* cd, + HB_UShort glyphID, + HB_UShort* klass, + HB_UShort* index ) +{ + switch ( cd->ClassFormat ) + { + case 1: return Get_Class1( &cd->cd.cd1, glyphID, klass, index ); + case 2: return Get_Class2( &cd->cd.cd2, glyphID, klass, index ); + default: return ERR(HB_Err_Invalid_SubTable_Format); + } + + return HB_Err_Ok; /* never reached */ +} + + + +/*************************** + * Device related functions + ***************************/ + + +HB_INTERNAL HB_Error +_HB_OPEN_Load_Device( HB_Device** device, + HB_Stream stream ) +{ + HB_Device* d; + HB_Error error; + + HB_UShort n, count; + + HB_UShort* dv; + + + if ( ACCESS_Frame( 6L ) ) + return error; + + if ( ALLOC( *device, sizeof(HB_Device)) ) + { + *device = 0; + return error; + } + + d = *device; + + d->StartSize = GET_UShort(); + d->EndSize = GET_UShort(); + d->DeltaFormat = GET_UShort(); + + FORGET_Frame(); + + d->DeltaValue = NULL; + + if ( d->StartSize > d->EndSize || + d->DeltaFormat == 0 || d->DeltaFormat > 3 ) + { + /* XXX + * I've seen fontforge generate DeltaFormat == 0. + * Just return Ok and let the NULL DeltaValue disable + * this table. + */ + return HB_Err_Ok; + } + + count = ( ( d->EndSize - d->StartSize + 1 ) >> + ( 4 - d->DeltaFormat ) ) + 1; + + if ( ALLOC_ARRAY( d->DeltaValue, count, HB_UShort ) ) + { + FREE( *device ); + *device = 0; + return error; + } + + if ( ACCESS_Frame( count * 2L ) ) + { + FREE( d->DeltaValue ); + FREE( *device ); + *device = 0; + return error; + } + + dv = d->DeltaValue; + + for ( n = 0; n < count; n++ ) + dv[n] = GET_UShort(); + + FORGET_Frame(); + + return HB_Err_Ok; +} + + +HB_INTERNAL void +_HB_OPEN_Free_Device( HB_Device* d ) +{ + if ( d ) + { + FREE( d->DeltaValue ); + FREE( d ); + } +} + + +/* Since we have the delta values stored in compressed form, we must + uncompress it now. To simplify the interface, the function always + returns a meaningful value in `value'; the error is just for + information. + | | + format = 1: 0011223344556677|8899101112131415|... + | | + byte 1 byte 2 + + 00: (byte >> 14) & mask + 11: (byte >> 12) & mask + ... + + mask = 0x0003 + | | + format = 2: 0000111122223333|4444555566667777|... + | | + byte 1 byte 2 + + 0000: (byte >> 12) & mask + 1111: (byte >> 8) & mask + ... + + mask = 0x000F + | | + format = 3: 0000000011111111|2222222233333333|... + | | + byte 1 byte 2 + + 00000000: (byte >> 8) & mask + 11111111: (byte >> 0) & mask + .... + + mask = 0x00FF */ + +HB_INTERNAL HB_Error +_HB_OPEN_Get_Device( HB_Device* d, + HB_UShort size, + HB_Short* value ) +{ + HB_UShort byte, bits, mask, s; + + if ( d && d->DeltaValue && size >= d->StartSize && size <= d->EndSize ) + { + HB_UShort f = d->DeltaFormat; + s = size - d->StartSize; + byte = d->DeltaValue[s >> ( 4 - f )]; + bits = byte >> ( 16 - ( ( s % ( 1 << ( 4 - f ) ) + 1 ) << f ) ); + mask = 0xFFFF >> ( 16 - ( 1 << f ) ); + + *value = (HB_Short)( bits & mask ); + + /* conversion to a signed value */ + + if ( *value >= ( ( mask + 1 ) >> 1 ) ) + *value -= mask + 1; + + return HB_Err_Ok; + } + else + { + *value = 0; + return HB_Err_Not_Covered; + } +} + + +/* END */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-open.h b/src/3rdparty/harfbuzz/src/harfbuzz-open.h new file mode 100644 index 0000000000..9ad7c98b2c --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-open.h @@ -0,0 +1,280 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_OPEN_H +#define HARFBUZZ_OPEN_H + +#include "harfbuzz-global.h" + +HB_BEGIN_HEADER + +/* Use this if a feature applies to all glyphs */ +#define HB_ALL_GLYPHS 0xFFFF + +#define HB_DEFAULT_LANGUAGE 0xFFFF + +#define HB_MAX_NESTING_LEVEL 100 + + +/* Script list related structures */ + +struct HB_LangSys_ +{ + HB_UShort* FeatureIndex; /* array of Feature indices */ + HB_UShort LookupOrderOffset; /* always 0 for TT Open 1.0 */ + HB_UShort ReqFeatureIndex; /* required FeatureIndex */ + HB_UShort FeatureCount; /* number of Feature indices */ +}; + +typedef struct HB_LangSys_ HB_LangSys; + + +struct HB_LangSysRecord_ +{ + HB_LangSys LangSys; /* LangSys table */ + HB_UInt LangSysTag; /* LangSysTag identifier */ +}; + +typedef struct HB_LangSysRecord_ HB_LangSysRecord; + + +struct HB_ScriptTable_ +{ + HB_LangSysRecord* LangSysRecord; /* array of LangSysRecords */ + HB_LangSys DefaultLangSys; /* DefaultLangSys table */ + HB_UShort LangSysCount; /* number of LangSysRecords */ +}; + +typedef struct HB_ScriptTable_ HB_ScriptTable; + + +struct HB_ScriptRecord_ +{ + HB_UInt ScriptTag; /* ScriptTag identifier */ + HB_ScriptTable Script; /* Script table */ +}; + +typedef struct HB_ScriptRecord_ HB_ScriptRecord; + + +struct HB_ScriptList_ +{ + HB_ScriptRecord* ScriptRecord; /* array of ScriptRecords */ + HB_UShort ScriptCount; /* number of ScriptRecords */ +}; + +typedef struct HB_ScriptList_ HB_ScriptList; + + +/* Feature list related structures */ + +struct HB_Feature_ +{ + HB_UShort* LookupListIndex; /* array of LookupList indices */ + HB_UShort FeatureParams; /* always 0 for TT Open 1.0 */ + HB_UShort LookupListCount; /* number of LookupList indices */ +}; + +typedef struct HB_Feature_ HB_Feature; + + +struct HB_FeatureRecord_ +{ + HB_UInt FeatureTag; /* FeatureTag identifier */ + HB_Feature Feature; /* Feature table */ +}; + +typedef struct HB_FeatureRecord_ HB_FeatureRecord; + + +struct HB_FeatureList_ +{ + HB_UShort* ApplyOrder; /* order to apply features */ + HB_FeatureRecord* FeatureRecord; /* array of FeatureRecords */ + HB_UShort FeatureCount; /* number of FeatureRecords */ + HB_UShort ApplyCount; /* number of elements in ApplyOrder */ +}; + +typedef struct HB_FeatureList_ HB_FeatureList; + + +/* Lookup list related structures */ + +typedef struct HB_SubTable_ HB_SubTable; + + +struct HB_Lookup_ +{ + HB_SubTable* SubTable; /* array of SubTables */ + HB_UShort LookupType; /* Lookup type */ + HB_UShort LookupFlag; /* Lookup qualifiers */ + HB_UShort SubTableCount; /* number of SubTables */ +}; + +typedef struct HB_Lookup_ HB_Lookup; + + +/* The `Properties' field is not defined in the OpenType specification but + is needed for processing lookups. If properties[n] is > 0, the + functions HB_GSUB_Apply_String() resp. HB_GPOS_Apply_String() will + process Lookup[n] for glyphs which have the specific bit not set in + the `properties' field of the input string object. */ + +struct HB_LookupList_ +{ + HB_Lookup* Lookup; /* array of Lookup records */ + HB_UInt* Properties; /* array of flags */ + HB_UShort LookupCount; /* number of Lookups */ +}; + +typedef struct HB_LookupList_ HB_LookupList; + + +/* Possible LookupFlag bit masks. `HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS' comes from the + OpenType 1.2 specification; HB_LOOKUP_FLAG_RIGHT_TO_LEFT has been (re)introduced in + OpenType 1.3 -- if set, the last glyph in a cursive attachment + sequence has to be positioned on the baseline -- regardless of the + writing direction. */ + +#define HB_LOOKUP_FLAG_RIGHT_TO_LEFT 0x0001 +#define HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS 0x0002 +#define HB_LOOKUP_FLAG_IGNORE_LIGATURES 0x0004 +#define HB_LOOKUP_FLAG_IGNORE_MARKS 0x0008 +#define HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS 0xFF00 + + +struct HB_CoverageFormat1_ +{ + HB_UShort* GlyphArray; /* array of glyph IDs */ + HB_UShort GlyphCount; /* number of glyphs in GlyphArray */ +}; + +typedef struct HB_CoverageFormat1_ HB_CoverageFormat1; + + +struct HB_RangeRecord_ +{ + HB_UShort Start; /* first glyph ID in the range */ + HB_UShort End; /* last glyph ID in the range */ + HB_UShort StartCoverageIndex; /* coverage index of first + glyph ID in the range */ +}; + +typedef struct HB_RangeRecord_ HB_RangeRecord; + + +struct HB_CoverageFormat2_ +{ + HB_RangeRecord* RangeRecord; /* array of RangeRecords */ + HB_UShort RangeCount; /* number of RangeRecords */ +}; + +typedef struct HB_CoverageFormat2_ HB_CoverageFormat2; + + +struct HB_Coverage_ +{ + HB_Byte CoverageFormat; /* 1 or 2 */ + + union + { + HB_CoverageFormat1 cf1; + HB_CoverageFormat2 cf2; + } cf; +}; + +typedef struct HB_Coverage_ HB_Coverage; + + +struct HB_ClassDefFormat1_ +{ + HB_UShort* ClassValueArray; /* array of class values */ + HB_UShort StartGlyph; /* first glyph ID of the + ClassValueArray */ + HB_UShort GlyphCount; /* size of the ClassValueArray */ +}; + +typedef struct HB_ClassDefFormat1_ HB_ClassDefFormat1; + + +struct HB_ClassRangeRecord_ +{ + HB_UShort Start; /* first glyph ID in the range */ + HB_UShort End; /* last glyph ID in the range */ + HB_UShort Class; /* applied to all glyphs in range */ +}; + +typedef struct HB_ClassRangeRecord_ HB_ClassRangeRecord; + + +struct HB_ClassDefFormat2_ +{ + HB_ClassRangeRecord* ClassRangeRecord; + /* array of ClassRangeRecords */ + HB_UShort ClassRangeCount; + /* number of ClassRangeRecords */ +}; + +typedef struct HB_ClassDefFormat2_ HB_ClassDefFormat2; + + +struct HB_ClassDefinition_ +{ + union + { + HB_ClassDefFormat1 cd1; + HB_ClassDefFormat2 cd2; + } cd; + + HB_Byte ClassFormat; /* 1 or 2 */ + HB_Bool loaded; +}; + +typedef struct HB_ClassDefinition_ HB_ClassDefinition; + + +struct HB_Device_ +{ + HB_UShort* DeltaValue; /* array of compressed data */ + HB_UShort StartSize; /* smallest size to correct */ + HB_UShort EndSize; /* largest size to correct */ + HB_Byte DeltaFormat; /* DeltaValue array data format: + 1, 2, or 3 */ +}; + +typedef struct HB_Device_ HB_Device; + + +enum HB_Type_ +{ + HB_Type_GSUB, + HB_Type_GPOS +}; + +typedef enum HB_Type_ HB_Type; + +HB_END_HEADER + +#endif /* HARFBUZZ_OPEN_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shape.h b/src/3rdparty/harfbuzz/src/harfbuzz-shape.h new file mode 100644 index 0000000000..e4b5f9ad8a --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shape.h @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2006 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Owen Taylor + */ + +#include + +/* Base Types */ + +typedef hb_uint16 HB_CodePoint; /* UTF-16 codepoint (not character ) */ +typedef char HB_Boolean; +typedef hb_uint32 HB_Fixed; /* 26.6 */ +typedef hb_uint32 HB_Glyph; +typedef hb_uint32 HB_Unichar; + +/* Metrics reported by the font backend for use of the shaper */ +typedef struct _HB_GlyphMetrics HB_GlyphMetrics; +struct _HB_GlyphMetrics +{ + HB_Fixed advance; + + /* Do we need ink/logical extents for the glyph here? */ +}; + +/* + * HB_Font: Abstract font interface. + * First pass of this might just have FT_Face *getFace(); + */ +typedef struct _HB_Font HB_Font; +typedef struct _HB_FontClass HB_FontClass; + +struct HB_FontClass { + HB_Glyph (*charToGlyph)(HB_Font *font, HB_Unichar chr); + void (*getMetrics)(HB_Font *font, HB_Glyph glyph, HB_GlyphMetrics *metrics); + HB_Boolean (*getSFontTable)(HB_Font *font, void **cookie, char **start, int *len); + HB_Boolean (*freeSFontTable)(void **cookie); +}; + +struct _HB_Font { + HB_FontClass *clazz; +}; + +/* + * Language tags, of the form en-us; represented as interned, canonicalized + * strings. hb_language_from_string("en_US"), hb_language_from_string("en-us") + * both return the same (pointer-comparable) HB_Language). + */ +typedef struct HB_Language_ *HB_Language; + +HB_Language hb_language_from_string(const char *str); +const char *hb_language_to_string(HB_Language language); + +/* Special treatment for the edges of runs. + */ +typedef enum { + HB_RUN_EDGE_LINE_VISUAL_EDGE = 1 << 0, + HB_RUN_EDGE_LINE_LOGICAL_EDGE = 1 << 1, + HB_RUN_EDGE_LINE_ADD_HYPHEN = 1 << 2 /* ???? */ +} HB_RunEdge; + +/* Defines optional informaiton in HB_ShapeInput; this allows extension + * of HB_ShapeInput while keeping binary compatibility + */ +typedef enum { + HB_SHAPE_START_TYPE = 1 << 0, + HB_SHAPE_END_TYPE = 1 << 1 +} HB_ShapeFlags; + +/* Attributes types are described by "interned strings"; this is a little + * annoying if you want to write a switch statement, but keeps things + * simple. + */ +typedef struct _HB_AttributeType *HB_AttributeType; + +HB_AttributeType hb_attribute_type_from_string(const char *str); +const char *hb_attribute_type_to_string(HB_AttributeType attribute_type); + +struct HB_Attribute { + HB_AttributeType type; + int start; + int end; +}; + + +/** + * You could handle this like HB_Language, but an enum seems a little nicer; + * another approach would be to use OpenType script tags. + */ +typedef enum { + HB_SCRIPT_LATIN + /* ... */ +} HB_ShapeScript; + +/* This is just the subset of direction information needed by the shaper */ +typedef enum { + HB_DIRECTION_LTR, + HB_DIRECTION_RTL, + HB_DIRECTION_TTB +} HB_Direction; + +typedef struct _HB_ShapeInput HB_ShapeInput; +struct _HB_ShapeInput { + /* Defines what fields the caller has initialized - fields not in + * the enum are mandatory. + */ + HB_ShapeFlags flags; + + HB_CodePoint *text; + int length; /* total length of text to shape */ + int shape_offset; /* start of section to shape */ + int shape_length; /* number of code points to shape */ + + HB_Direction direction; + HB_ShapeScript script; + HB_Language language; + + HB_AttributeType *attributes; + int n_attributes; + + HB_RunEdge start_type; + HB_RunEdge end_type; +}; + +struct HB_GlyphItem { + HB_Glyph glyph; + + HB_Fixed x_offset; + HB_Fixed y_offset; + HB_Fixed advance; + + /* Add kashida information, etc, here */ +}; + +typedef enum { + HB_RESULT_SUCCESS, + HB_RESULT_NO_MEMORY, + HB_SHAPE_RESULT_FAILED +} HB_Result; + +/* + * Buffer for output + */ +typedef struct _HB_GlyphBuffer HB_GlyphBuffer; +struct _HB_GlyphBuffer { + int glyph_item_size; + int total_glyphs; + + int *log_clusters; /* Uniscribe style */ + int cluster_space; + + int glyph_space; + void *glyph_buffer; +}; + +/* Making this self-allocating simplifies writing shapers and + * also keeps things easier for caller. item_size passed in + * must be at least sizeof(HB_GlyphItem) but can be bigger, + * to accomodate application structures that extend HB_GlyphItem. + * The allocated items will be zero-initialized. + * + * (Hack: Harfbuzz could choose to use even a *bigger* item size + * and stick internal information before the public item structure. + * This hack could possibly be used to unify this with HB_Buffer) + */ +HB_GlyphBuffer *hb_glyph_buffer_new (size_t item_size); +void hb_glyph_buffer_clear (HB_GlyphBuffer *buf); +HB_Result hb_glyph_buffer_extend_glyphs (HB_GlyphBuffer *buf, int n_items); +HB_Result hb_glyph_buffer_extend_clusters (HB_GlyphBuffer *buf, int n_clusters); +void hb_glyph_buffer_free (HB_GlyphBuffer *buf); + + +/* Accessor for a particular glyph */ +#define HB_GLYPH_BUFFER_ITEM(buffer, index) + +/* + * Main shaping function + */ +HB_Result hb_shape(HB_ShapeInput *input, HB_GlyphBuffer *output); diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp new file mode 100644 index 0000000000..2dae501305 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.cpp" +#include "harfbuzz-indic.cpp" +extern "C" { +#include "harfbuzz-greek.c" +#include "harfbuzz-tibetan.c" +#include "harfbuzz-khmer.c" +#include "harfbuzz-hebrew.c" +#include "harfbuzz-arabic.c" +#include "harfbuzz-hangul.c" +#include "harfbuzz-myanmar.c" +#include "harfbuzz-thai.c" +} + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-shaper-private.h new file mode 100644 index 0000000000..e1360c774a --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper-private.h @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_SHAPER_PRIVATE_H +#define HARFBUZZ_SHAPER_PRIVATE_H + +HB_BEGIN_HEADER + +enum { + C_DOTTED_CIRCLE = 0x25CC +}; + +typedef enum +{ + HB_Combining_BelowLeftAttached = 200, + HB_Combining_BelowAttached = 202, + HB_Combining_BelowRightAttached = 204, + HB_Combining_LeftAttached = 208, + HB_Combining_RightAttached = 210, + HB_Combining_AboveLeftAttached = 212, + HB_Combining_AboveAttached = 214, + HB_Combining_AboveRightAttached = 216, + + HB_Combining_BelowLeft = 218, + HB_Combining_Below = 220, + HB_Combining_BelowRight = 222, + HB_Combining_Left = 224, + HB_Combining_Right = 226, + HB_Combining_AboveLeft = 228, + HB_Combining_Above = 230, + HB_Combining_AboveRight = 232, + + HB_Combining_DoubleBelow = 233, + HB_Combining_DoubleAbove = 234, + HB_Combining_IotaSubscript = 240 +} HB_CombiningClass; + +typedef enum { + LocaProperty = 0x1, + CcmpProperty = 0x2, + InitProperty = 0x4, + IsolProperty = 0x8, + FinaProperty = 0x10, + MediProperty = 0x20, + RligProperty = 0x40, + CaltProperty = 0x80, + LigaProperty = 0x100, + DligProperty = 0x200, + CswhProperty = 0x400, + MsetProperty = 0x800, + + /* used by indic and myanmar shaper */ + NuktaProperty = 0x8, + AkhantProperty = 0x10, + RephProperty = 0x20, + PreFormProperty = 0x40, + BelowFormProperty = 0x80, + AboveFormProperty = 0x100, + HalfFormProperty = 0x200, + PostFormProperty = 0x400, + ConjunctFormProperty = 0x800, + VattuProperty = 0x1000, + PreSubstProperty = 0x2000, + BelowSubstProperty = 0x4000, + AboveSubstProperty = 0x8000, + PostSubstProperty = 0x10000, + HalantProperty = 0x20000, + CligProperty = 0x40000, + IndicCaltProperty = 0x80000 + +} HB_OpenTypeProperty; + +/* return true if ok. */ +typedef HB_Bool (*HB_ShapeFunction)(HB_ShaperItem *shaper_item); +typedef void (*HB_AttributeFunction)(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); + +typedef struct { + HB_ShapeFunction shape; + HB_AttributeFunction charAttributes; +} HB_ScriptEngine; + +extern const HB_ScriptEngine hb_scriptEngines[]; + +extern HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item); +extern HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item); +extern HB_Bool HB_TibetanShape(HB_ShaperItem *shaper_item); +extern HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item); +extern HB_Bool HB_ArabicShape(HB_ShaperItem *shaper_item); +extern HB_Bool HB_HangulShape(HB_ShaperItem *shaper_item); +extern HB_Bool HB_MyanmarShape(HB_ShaperItem *shaper_item); +extern HB_Bool HB_KhmerShape(HB_ShaperItem *shaper_item); +extern HB_Bool HB_IndicShape(HB_ShaperItem *shaper_item); + +extern void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); + +extern void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); + +extern void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); + +extern void HB_IndicAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); + +extern void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); + +typedef struct { + hb_uint32 tag; + hb_uint32 property; +} HB_OpenTypeFeature; + +#define PositioningProperties 0x80000000 + +HB_Bool HB_SelectScript(HB_ShaperItem *item, const HB_OpenTypeFeature *features); + +HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties); +HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters); + +void HB_HeuristicPosition(HB_ShaperItem *item); +void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item); + +#define HB_IsControlChar(uc) \ + ((uc >= 0x200b && uc <= 0x200f /* ZW Space, ZWNJ, ZWJ, LRM and RLM */) \ + || (uc >= 0x2028 && uc <= 0x202f /* LS, PS, LRE, RLE, PDF, LRO, RLO, NNBSP */) \ + || (uc >= 0x206a && uc <= 0x206f /* ISS, ASS, IAFS, AFS, NADS, NODS */)) + +HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item); + +#define HB_GetGlyphAdvances(shaper_item) \ + shaper_item->font->klass->getGlyphAdvances(shaper_item->font, \ + shaper_item->glyphs, shaper_item->num_glyphs, \ + shaper_item->advances, \ + shaper_item->face->current_flags); + +#define HB_DECLARE_STACKARRAY(Type, Name) \ + Type stack##Name[512]; \ + Type *Name = stack##Name; + +#define HB_INIT_STACKARRAY(Type, Name, Length) \ + if ((Length) >= 512) \ + Name = (Type *)malloc((Length) * sizeof(Type)); + +#define HB_STACKARRAY(Type, Name, Length) \ + HB_DECLARE_STACKARRAY(Type, Name) \ + HB_INIT_STACKARRAY(Type, Name, Length) + +#define HB_FREE_STACKARRAY(Name) \ + if (stack##Name != Name) \ + free(Name); + +HB_END_HEADER + +#endif diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp new file mode 100644 index 0000000000..c202e1f52b --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp @@ -0,0 +1,1367 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" + +#include "harfbuzz-stream-private.h" +#include +#include + +#define HB_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define HB_MAX(a, b) ((a) > (b) ? (a) : (b)) + +// ----------------------------------------------------------------------------------------------------- +// +// The line break algorithm. See http://www.unicode.org/reports/tr14/tr14-13.html +// +// ----------------------------------------------------------------------------------------------------- + +/* The Unicode algorithm does in our opinion allow line breaks at some + places they shouldn't be allowed. The following changes were thus + made in comparison to the Unicode reference: + + EX->AL from DB to IB + SY->AL from DB to IB + SY->PO from DB to IB + SY->PR from DB to IB + SY->OP from DB to IB + AL->PR from DB to IB + AL->PO from DB to IB + PR->PR from DB to IB + PO->PO from DB to IB + PR->PO from DB to IB + PO->PR from DB to IB + HY->PO from DB to IB + HY->PR from DB to IB + HY->OP from DB to IB + NU->EX from PB to IB + EX->PO from DB to IB +*/ + +// The following line break classes are not treated by the table: +// AI, BK, CB, CR, LF, NL, SA, SG, SP, XX + +enum break_class { + // the first 4 values have to agree with the enum in QCharAttributes + ProhibitedBreak, // PB in table + DirectBreak, // DB in table + IndirectBreak, // IB in table + CombiningIndirectBreak, // CI in table + CombiningProhibitedBreak // CP in table +}; +#define DB DirectBreak +#define IB IndirectBreak +#define CI CombiningIndirectBreak +#define CP CombiningProhibitedBreak +#define PB ProhibitedBreak + +static const hb_uint8 breakTable[HB_LineBreak_JT+1][HB_LineBreak_JT+1] = +{ +/* OP CL QU GL NS EX SY IS PR PO NU AL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT */ +/* OP */ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB }, +/* CL */ { DB, PB, IB, IB, PB, PB, PB, PB, IB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* QU */ { PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB }, +/* GL */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB }, +/* NS */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* EX */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* SY */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* IS */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* PR */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, IB }, +/* PO */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* NU */ { IB, PB, IB, IB, IB, IB, PB, PB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* AL */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* ID */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* IN */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* HY */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* BA */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* BB */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB }, +/* B2 */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, DB, PB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* ZW */ { DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, DB, DB, DB, DB, DB, DB, DB }, +/* CM */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, +/* WJ */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB }, +/* H2 */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB }, +/* H3 */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB }, +/* JL */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, DB }, +/* JV */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB }, +/* JT */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB } +}; +#undef DB +#undef IB +#undef CI +#undef CP +#undef PB + +static const hb_uint8 graphemeTable[HB_Grapheme_LVT + 1][HB_Grapheme_LVT + 1] = +{ +// Other, CR, LF, Control,Extend,L, V, T, LV, LVT + { true , true , true , true , true , true , true , true , true , true }, // Other, + { true , true , true , true , true , true , true , true , true , true }, // CR, + { true , false, true , true , true , true , true , true , true , true }, // LF, + { true , true , true , true , true , true , true , true , true , true }, // Control, + { false, true , true , true , false, false, false, false, false, false }, // Extend, + { true , true , true , true , true , false, true , true , true , true }, // L, + { true , true , true , true , true , false, false, true , false, true }, // V, + { true , true , true , true , true , true , false, false, false, false }, // T, + { true , true , true , true , true , false, true , true , true , true }, // LV, + { true , true , true , true , true , false, true , true , true , true }, // LVT +}; + +static void calcLineBreaks(const HB_UChar16 *uc, hb_uint32 len, HB_CharAttributes *charAttributes) +{ + if (!len) + return; + + // ##### can this fail if the first char is a surrogate? + HB_LineBreakClass cls; + HB_GraphemeClass grapheme; + HB_GetGraphemeAndLineBreakClass(*uc, &grapheme, &cls); + // handle case where input starts with an LF + if (cls == HB_LineBreak_LF) + cls = HB_LineBreak_BK; + + charAttributes[0].whiteSpace = (cls == HB_LineBreak_SP || cls == HB_LineBreak_BK); + charAttributes[0].charStop = true; + + int lcls = cls; + for (hb_uint32 i = 1; i < len; ++i) { + charAttributes[i].whiteSpace = false; + charAttributes[i].charStop = true; + + HB_UChar32 code = uc[i]; + HB_GraphemeClass ngrapheme; + HB_LineBreakClass ncls; + HB_GetGraphemeAndLineBreakClass(code, &ngrapheme, &ncls); + charAttributes[i].charStop = graphemeTable[ngrapheme][grapheme]; + // handle surrogates + if (ncls == HB_LineBreak_SG) { + if (HB_IsHighSurrogate(uc[i]) && i < len - 1 && HB_IsLowSurrogate(uc[i+1])) { + continue; + } else if (HB_IsLowSurrogate(uc[i]) && HB_IsHighSurrogate(uc[i-1])) { + code = HB_SurrogateToUcs4(uc[i-1], uc[i]); + HB_GetGraphemeAndLineBreakClass(code, &ngrapheme, &ncls); + charAttributes[i].charStop = false; + } else { + ncls = HB_LineBreak_AL; + } + } + + // set white space and char stop flag + if (ncls >= HB_LineBreak_SP) + charAttributes[i].whiteSpace = true; + + HB_LineBreakType lineBreakType = HB_NoBreak; + if (cls >= HB_LineBreak_LF) { + lineBreakType = HB_ForcedBreak; + } else if(cls == HB_LineBreak_CR) { + lineBreakType = (ncls == HB_LineBreak_LF) ? HB_NoBreak : HB_ForcedBreak; + } + + if (ncls == HB_LineBreak_SP) + goto next_no_cls_update; + if (ncls >= HB_LineBreak_CR) + goto next; + + { + int tcls = ncls; + // for south east asian chars that require a complex (dictionary analysis), the unicode + // standard recommends to treat them as AL. thai_attributes and other attribute methods that + // do dictionary analysis can override + if (tcls >= HB_LineBreak_SA) + tcls = HB_LineBreak_AL; + if (cls >= HB_LineBreak_SA) + cls = HB_LineBreak_AL; + + int brk = breakTable[cls][tcls]; + switch (brk) { + case DirectBreak: + lineBreakType = HB_Break; + if (uc[i-1] == 0xad) // soft hyphen + lineBreakType = HB_SoftHyphen; + break; + case IndirectBreak: + lineBreakType = (lcls == HB_LineBreak_SP) ? HB_Break : HB_NoBreak; + break; + case CombiningIndirectBreak: + lineBreakType = HB_NoBreak; + if (lcls == HB_LineBreak_SP){ + if (i > 1) + charAttributes[i-2].lineBreakType = HB_Break; + } else { + goto next_no_cls_update; + } + break; + case CombiningProhibitedBreak: + lineBreakType = HB_NoBreak; + if (lcls != HB_LineBreak_SP) + goto next_no_cls_update; + case ProhibitedBreak: + default: + break; + } + } + next: + cls = ncls; + next_no_cls_update: + lcls = ncls; + grapheme = ngrapheme; + charAttributes[i-1].lineBreakType = lineBreakType; + } + charAttributes[len-1].lineBreakType = HB_ForcedBreak; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------- +// +// Basic processing +// +// -------------------------------------------------------------------------------------------------------------------------------------------- + +static inline void positionCluster(HB_ShaperItem *item, int gfrom, int glast) +{ + int nmarks = glast - gfrom; + assert(nmarks > 0); + + HB_Glyph *glyphs = item->glyphs; + HB_GlyphAttributes *attributes = item->attributes; + + HB_GlyphMetrics baseMetrics; + item->font->klass->getGlyphMetrics(item->font, glyphs[gfrom], &baseMetrics); + + if (item->item.script == HB_Script_Hebrew + && (-baseMetrics.y) > baseMetrics.height) + // we need to attach below the baseline, because of the hebrew iud. + baseMetrics.height = -baseMetrics.y; + +// qDebug("---> positionCluster: cluster from %d to %d", gfrom, glast); +// qDebug("baseInfo: %f/%f (%f/%f) off=%f/%f", baseInfo.x, baseInfo.y, baseInfo.width, baseInfo.height, baseInfo.xoff, baseInfo.yoff); + + HB_Fixed size = item->font->klass->getFontMetric(item->font, HB_FontAscent) / 10; + HB_Fixed offsetBase = HB_FIXED_CONSTANT(1) + (size - HB_FIXED_CONSTANT(4)) / 4; + if (size > HB_FIXED_CONSTANT(4)) + offsetBase += HB_FIXED_CONSTANT(4); + else + offsetBase += size; + //qreal offsetBase = (size - 4) / 4 + qMin(size, 4) + 1; +// qDebug("offset = %f", offsetBase); + + bool rightToLeft = item->item.bidiLevel % 2; + + int i; + unsigned char lastCmb = 0; + HB_GlyphMetrics attachmentRect; + memset(&attachmentRect, 0, sizeof(attachmentRect)); + + for(i = 1; i <= nmarks; i++) { + HB_Glyph mark = glyphs[gfrom+i]; + HB_GlyphMetrics markMetrics; + item->font->klass->getGlyphMetrics(item->font, mark, &markMetrics); + HB_FixedPoint p; + p.x = p.y = 0; +// qDebug("markInfo: %f/%f (%f/%f) off=%f/%f", markInfo.x, markInfo.y, markInfo.width, markInfo.height, markInfo.xoff, markInfo.yoff); + + HB_Fixed offset = offsetBase; + unsigned char cmb = attributes[gfrom+i].combiningClass; + + // ### maybe the whole position determination should move down to heuristicSetGlyphAttributes. Would save some + // bits in the glyphAttributes structure. + if (cmb < 200) { + // fixed position classes. We approximate by mapping to one of the others. + // currently I added only the ones for arabic, hebrew, lao and thai. + + // for Lao and Thai marks with class 0, see below (heuristicSetGlyphAttributes) + + // add a bit more offset to arabic, a bit hacky + if (cmb >= 27 && cmb <= 36 && offset < 3) + offset +=1; + // below + if ((cmb >= 10 && cmb <= 18) || + cmb == 20 || cmb == 22 || + cmb == 29 || cmb == 32) + cmb = HB_Combining_Below; + // above + else if (cmb == 23 || cmb == 27 || cmb == 28 || + cmb == 30 || cmb == 31 || (cmb >= 33 && cmb <= 36)) + cmb = HB_Combining_Above; + //below-right + else if (cmb == 9 || cmb == 103 || cmb == 118) + cmb = HB_Combining_BelowRight; + // above-right + else if (cmb == 24 || cmb == 107 || cmb == 122) + cmb = HB_Combining_AboveRight; + else if (cmb == 25) + cmb = HB_Combining_AboveLeft; + // fixed: + // 19 21 + + } + + // combining marks of different class don't interact. Reset the rectangle. + if (cmb != lastCmb) { + //qDebug("resetting rect"); + attachmentRect = baseMetrics; + } + + switch(cmb) { + case HB_Combining_DoubleBelow: + // ### wrong in rtl context! + case HB_Combining_BelowLeft: + p.y += offset; + case HB_Combining_BelowLeftAttached: + p.x += attachmentRect.x - markMetrics.x; + p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y; + break; + case HB_Combining_Below: + p.y += offset; + case HB_Combining_BelowAttached: + p.x += attachmentRect.x - markMetrics.x; + p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y; + + p.x += (attachmentRect.width - markMetrics.width) / 2; + break; + case HB_Combining_BelowRight: + p.y += offset; + case HB_Combining_BelowRightAttached: + p.x += attachmentRect.x + attachmentRect.width - markMetrics.width - markMetrics.x; + p.y += attachmentRect.y + attachmentRect.height - markMetrics.y; + break; + case HB_Combining_Left: + p.x -= offset; + case HB_Combining_LeftAttached: + break; + case HB_Combining_Right: + p.x += offset; + case HB_Combining_RightAttached: + break; + case HB_Combining_DoubleAbove: + // ### wrong in RTL context! + case HB_Combining_AboveLeft: + p.y -= offset; + case HB_Combining_AboveLeftAttached: + p.x += attachmentRect.x - markMetrics.x; + p.y += attachmentRect.y - markMetrics.y - markMetrics.height; + break; + case HB_Combining_Above: + p.y -= offset; + case HB_Combining_AboveAttached: + p.x += attachmentRect.x - markMetrics.x; + p.y += attachmentRect.y - markMetrics.y - markMetrics.height; + + p.x += (attachmentRect.width - markMetrics.width) / 2; + break; + case HB_Combining_AboveRight: + p.y -= offset; + case HB_Combining_AboveRightAttached: + p.x += attachmentRect.x + attachmentRect.width - markMetrics.x - markMetrics.width; + p.y += attachmentRect.y - markMetrics.y - markMetrics.height; + break; + + case HB_Combining_IotaSubscript: + default: + break; + } +// qDebug("char=%x combiningClass = %d offset=%f/%f", mark, cmb, p.x(), p.y()); + markMetrics.x += p.x; + markMetrics.y += p.y; + + HB_GlyphMetrics unitedAttachmentRect = attachmentRect; + unitedAttachmentRect.x = HB_MIN(attachmentRect.x, markMetrics.x); + unitedAttachmentRect.y = HB_MIN(attachmentRect.y, markMetrics.y); + unitedAttachmentRect.width = HB_MAX(attachmentRect.x + attachmentRect.width, markMetrics.x + markMetrics.width) - unitedAttachmentRect.x; + unitedAttachmentRect.height = HB_MAX(attachmentRect.y + attachmentRect.height, markMetrics.y + markMetrics.height) - unitedAttachmentRect.y; + attachmentRect = unitedAttachmentRect; + + lastCmb = cmb; + if (rightToLeft) { + item->offsets[gfrom+i].x = p.x; + item->offsets[gfrom+i].y = p.y; + } else { + item->offsets[gfrom+i].x = p.x - baseMetrics.xOffset; + item->offsets[gfrom+i].y = p.y - baseMetrics.yOffset; + } + item->advances[gfrom+i] = 0; + } +} + +void HB_HeuristicPosition(HB_ShaperItem *item) +{ + HB_GetGlyphAdvances(item); + HB_GlyphAttributes *attributes = item->attributes; + + int cEnd = -1; + int i = item->num_glyphs; + while (i--) { + if (cEnd == -1 && attributes[i].mark) { + cEnd = i; + } else if (cEnd != -1 && !attributes[i].mark) { + positionCluster(item, i, cEnd); + cEnd = -1; + } + } +} + +// set the glyph attributes heuristically. Assumes a 1 to 1 relationship between chars and glyphs +// and no reordering. +// also computes logClusters heuristically +void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item) +{ + const HB_UChar16 *uc = item->string + item->item.pos; + hb_uint32 length = item->item.length; + + // ### zeroWidth and justification are missing here!!!!! + + assert(item->num_glyphs <= length); + +// qDebug("QScriptEngine::heuristicSetGlyphAttributes, num_glyphs=%d", item->num_glyphs); + HB_GlyphAttributes *attributes = item->attributes; + unsigned short *logClusters = item->log_clusters; + + hb_uint32 glyph_pos = 0; + hb_uint32 i; + for (i = 0; i < length; i++) { + if (HB_IsHighSurrogate(uc[i]) && i < length - 1 + && HB_IsLowSurrogate(uc[i + 1])) { + logClusters[i] = glyph_pos; + logClusters[++i] = glyph_pos; + } else { + logClusters[i] = glyph_pos; + } + ++glyph_pos; + } + assert(glyph_pos == item->num_glyphs); + + // first char in a run is never (treated as) a mark + int cStart = 0; + const bool symbolFont = item->face->isSymbolFont; + attributes[0].mark = false; + attributes[0].clusterStart = true; + attributes[0].dontPrint = (!symbolFont && uc[0] == 0x00ad) || HB_IsControlChar(uc[0]); + + int pos = 0; + HB_CharCategory lastCat; + int dummy; + HB_GetUnicodeCharProperties(uc[0], &lastCat, &dummy); + for (i = 1; i < length; ++i) { + if (logClusters[i] == pos) + // same glyph + continue; + ++pos; + while (pos < logClusters[i]) { + attributes[pos] = attributes[pos-1]; + ++pos; + } + // hide soft-hyphens by default + if ((!symbolFont && uc[i] == 0x00ad) || HB_IsControlChar(uc[i])) + attributes[pos].dontPrint = true; + HB_CharCategory cat; + int cmb; + HB_GetUnicodeCharProperties(uc[i], &cat, &cmb); + if (cat != HB_Mark_NonSpacing) { + attributes[pos].mark = false; + attributes[pos].clusterStart = true; + attributes[pos].combiningClass = 0; + cStart = logClusters[i]; + } else { + if (cmb == 0) { + // Fix 0 combining classes + if ((uc[pos] & 0xff00) == 0x0e00) { + // thai or lao + if (uc[pos] == 0xe31 || + uc[pos] == 0xe34 || + uc[pos] == 0xe35 || + uc[pos] == 0xe36 || + uc[pos] == 0xe37 || + uc[pos] == 0xe47 || + uc[pos] == 0xe4c || + uc[pos] == 0xe4d || + uc[pos] == 0xe4e) { + cmb = HB_Combining_AboveRight; + } else if (uc[pos] == 0xeb1 || + uc[pos] == 0xeb4 || + uc[pos] == 0xeb5 || + uc[pos] == 0xeb6 || + uc[pos] == 0xeb7 || + uc[pos] == 0xebb || + uc[pos] == 0xecc || + uc[pos] == 0xecd) { + cmb = HB_Combining_Above; + } else if (uc[pos] == 0xebc) { + cmb = HB_Combining_Below; + } + } + } + + attributes[pos].mark = true; + attributes[pos].clusterStart = false; + attributes[pos].combiningClass = cmb; + logClusters[i] = cStart; + } + // one gets an inter character justification point if the current char is not a non spacing mark. + // as then the current char belongs to the last one and one gets a space justification point + // after the space char. + if (lastCat == HB_Separator_Space) + attributes[pos-1].justification = HB_Space; + else if (cat != HB_Mark_NonSpacing) + attributes[pos-1].justification = HB_Character; + else + attributes[pos-1].justification = HB_NoJustification; + + lastCat = cat; + } + pos = logClusters[length-1]; + if (lastCat == HB_Separator_Space) + attributes[pos].justification = HB_Space; + else + attributes[pos].justification = HB_Character; +} + +#ifndef NO_OPENTYPE +static const HB_OpenTypeFeature basic_features[] = { + { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, + { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty }, + { HB_MAKE_TAG('c', 'l', 'i', 'g'), CligProperty }, + {0, 0} +}; + +static const HB_OpenTypeFeature disabled_features[] = { + { HB_MAKE_TAG('c', 'p', 'c', 't'), PositioningProperties }, + { HB_MAKE_TAG('h', 'a', 'l', 't'), PositioningProperties }, + // TODO: we need to add certain HB_ShaperFlag for vertical + // writing mode to enable these vertical writing features: + { HB_MAKE_TAG('v', 'a', 'l', 't'), PositioningProperties }, + { HB_MAKE_TAG('v', 'h', 'a', 'l'), PositioningProperties }, + { HB_MAKE_TAG('v', 'k', 'r', 'n'), PositioningProperties }, + { HB_MAKE_TAG('v', 'p', 'a', 'l'), PositioningProperties }, + {0, 0} +}; +#endif + +HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item) +{ + if (shaper_item->glyphIndicesPresent) { + shaper_item->num_glyphs = shaper_item->initialGlyphCount; + shaper_item->glyphIndicesPresent = false; + return true; + } + return shaper_item->font->klass + ->convertStringToGlyphIndices(shaper_item->font, + shaper_item->string + shaper_item->item.pos, shaper_item->item.length, + shaper_item->glyphs, &shaper_item->num_glyphs, + shaper_item->item.bidiLevel % 2); +} + +HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item) +{ +#ifndef NO_OPENTYPE + const int availableGlyphs = shaper_item->num_glyphs; +#endif + + if (!HB_ConvertStringToGlyphIndices(shaper_item)) + return false; + + HB_HeuristicSetGlyphAttributes(shaper_item); + +#ifndef NO_OPENTYPE + if (HB_SelectScript(shaper_item, basic_features)) { + HB_OpenTypeShape(shaper_item, /*properties*/0); + return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/true); + } +#endif + + HB_HeuristicPosition(shaper_item); + return true; +} + +const HB_ScriptEngine HB_ScriptEngines[] = { + // Common + { HB_BasicShape, 0}, + // Greek + { HB_GreekShape, 0}, + // Cyrillic + { HB_BasicShape, 0}, + // Armenian + { HB_BasicShape, 0}, + // Hebrew + { HB_HebrewShape, 0 }, + // Arabic + { HB_ArabicShape, 0}, + // Syriac + { HB_ArabicShape, 0}, + // Thaana + { HB_BasicShape, 0 }, + // Devanagari + { HB_IndicShape, HB_IndicAttributes }, + // Bengali + { HB_IndicShape, HB_IndicAttributes }, + // Gurmukhi + { HB_IndicShape, HB_IndicAttributes }, + // Gujarati + { HB_IndicShape, HB_IndicAttributes }, + // Oriya + { HB_IndicShape, HB_IndicAttributes }, + // Tamil + { HB_IndicShape, HB_IndicAttributes }, + // Telugu + { HB_IndicShape, HB_IndicAttributes }, + // Kannada + { HB_IndicShape, HB_IndicAttributes }, + // Malayalam + { HB_IndicShape, HB_IndicAttributes }, + // Sinhala + { HB_IndicShape, HB_IndicAttributes }, + // Thai + { HB_BasicShape, HB_ThaiAttributes }, + // Lao + { HB_BasicShape, 0 }, + // Tibetan + { HB_TibetanShape, HB_TibetanAttributes }, + // Myanmar + { HB_MyanmarShape, HB_MyanmarAttributes }, + // Georgian + { HB_BasicShape, 0 }, + // Hangul + { HB_HangulShape, 0 }, + // Ogham + { HB_BasicShape, 0 }, + // Runic + { HB_BasicShape, 0 }, + // Khmer + { HB_KhmerShape, HB_KhmerAttributes }, + // N'Ko + { HB_ArabicShape, 0} +}; + +void HB_GetCharAttributes(const HB_UChar16 *string, hb_uint32 stringLength, + const HB_ScriptItem *items, hb_uint32 numItems, + HB_CharAttributes *attributes) +{ + calcLineBreaks(string, stringLength, attributes); + + for (hb_uint32 i = 0; i < numItems; ++i) { + HB_Script script = items[i].script; + if (script == HB_Script_Inherited) + script = HB_Script_Common; + HB_AttributeFunction attributeFunction = HB_ScriptEngines[script].charAttributes; + if (!attributeFunction) + continue; + attributeFunction(script, string, items[i].pos, items[i].length, attributes); + } +} + + +enum BreakRule { NoBreak = 0, Break = 1, Middle = 2 }; + +static const hb_uint8 wordbreakTable[HB_Word_ExtendNumLet + 1][HB_Word_ExtendNumLet + 1] = { +// Other Format Katakana ALetter MidLetter MidNum Numeric ExtendNumLet + { Break, Break, Break, Break, Break, Break, Break, Break }, // Other + { Break, Break, Break, Break, Break, Break, Break, Break }, // Format + { Break, Break, NoBreak, Break, Break, Break, Break, NoBreak }, // Katakana + { Break, Break, Break, NoBreak, Middle, Break, NoBreak, NoBreak }, // ALetter + { Break, Break, Break, Break, Break, Break, Break, Break }, // MidLetter + { Break, Break, Break, Break, Break, Break, Break, Break }, // MidNum + { Break, Break, Break, NoBreak, Break, Middle, NoBreak, NoBreak }, // Numeric + { Break, Break, NoBreak, NoBreak, Break, Break, NoBreak, NoBreak }, // ExtendNumLet +}; + +void HB_GetWordBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, + const HB_ScriptItem * /*items*/, hb_uint32 /*numItems*/, + HB_CharAttributes *attributes) +{ + if (stringLength == 0) + return; + unsigned int brk = HB_GetWordClass(string[0]); + attributes[0].wordBoundary = true; + for (hb_uint32 i = 1; i < stringLength; ++i) { + if (!attributes[i].charStop) { + attributes[i].wordBoundary = false; + continue; + } + hb_uint32 nbrk = HB_GetWordClass(string[i]); + if (nbrk == HB_Word_Format) { + attributes[i].wordBoundary = (HB_GetSentenceClass(string[i-1]) == HB_Sentence_Sep); + continue; + } + BreakRule rule = (BreakRule)wordbreakTable[brk][nbrk]; + if (rule == Middle) { + rule = Break; + hb_uint32 lookahead = i + 1; + while (lookahead < stringLength) { + hb_uint32 testbrk = HB_GetWordClass(string[lookahead]); + if (testbrk == HB_Word_Format && HB_GetSentenceClass(string[lookahead]) != HB_Sentence_Sep) { + ++lookahead; + continue; + } + if (testbrk == brk) { + rule = NoBreak; + while (i < lookahead) + attributes[i++].wordBoundary = false; + nbrk = testbrk; + } + break; + } + } + attributes[i].wordBoundary = (rule == Break); + brk = nbrk; + } +} + + +enum SentenceBreakStates { + SB_Initial, + SB_Upper, + SB_UpATerm, + SB_ATerm, + SB_ATermC, + SB_ACS, + SB_STerm, + SB_STermC, + SB_SCS, + SB_BAfter, + SB_Break, + SB_Look +}; + +static const hb_uint8 sentenceBreakTable[HB_Sentence_Close + 1][HB_Sentence_Close + 1] = { +// Other Sep Format Sp Lower Upper OLetter Numeric ATerm STerm Close + { SB_Initial, SB_BAfter , SB_Initial, SB_Initial, SB_Initial, SB_Upper , SB_Initial, SB_Initial, SB_ATerm , SB_STerm , SB_Initial }, // SB_Initial, + { SB_Initial, SB_BAfter , SB_Upper , SB_Initial, SB_Initial, SB_Upper , SB_Initial, SB_Initial, SB_UpATerm, SB_STerm , SB_Initial }, // SB_Upper + + { SB_Look , SB_BAfter , SB_UpATerm, SB_ACS , SB_Initial, SB_Upper , SB_Break , SB_Initial, SB_ATerm , SB_STerm , SB_ATermC }, // SB_UpATerm + { SB_Look , SB_BAfter , SB_ATerm , SB_ACS , SB_Initial, SB_Break , SB_Break , SB_Initial, SB_ATerm , SB_STerm , SB_ATermC }, // SB_ATerm + { SB_Look , SB_BAfter , SB_ATermC , SB_ACS , SB_Initial, SB_Break , SB_Break , SB_Look , SB_ATerm , SB_STerm , SB_ATermC }, // SB_ATermC, + { SB_Look , SB_BAfter , SB_ACS , SB_ACS , SB_Initial, SB_Break , SB_Break , SB_Look , SB_ATerm , SB_STerm , SB_Look }, // SB_ACS, + + { SB_Break , SB_BAfter , SB_STerm , SB_SCS , SB_Break , SB_Break , SB_Break , SB_Break , SB_ATerm , SB_STerm , SB_STermC }, // SB_STerm, + { SB_Break , SB_BAfter , SB_STermC , SB_SCS , SB_Break , SB_Break , SB_Break , SB_Break , SB_ATerm , SB_STerm , SB_STermC }, // SB_STermC, + { SB_Break , SB_BAfter , SB_SCS , SB_SCS , SB_Break , SB_Break , SB_Break , SB_Break , SB_ATerm , SB_STerm , SB_Break }, // SB_SCS, + { SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break }, // SB_BAfter, +}; + +void HB_GetSentenceBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, + const HB_ScriptItem * /*items*/, hb_uint32 /*numItems*/, + HB_CharAttributes *attributes) +{ + if (stringLength == 0) + return; + hb_uint32 brk = sentenceBreakTable[SB_Initial][HB_GetSentenceClass(string[0])]; + attributes[0].sentenceBoundary = true; + for (hb_uint32 i = 1; i < stringLength; ++i) { + if (!attributes[i].charStop) { + attributes[i].sentenceBoundary = false; + continue; + } + brk = sentenceBreakTable[brk][HB_GetSentenceClass(string[i])]; + if (brk == SB_Look) { + brk = SB_Break; + hb_uint32 lookahead = i + 1; + while (lookahead < stringLength) { + hb_uint32 sbrk = HB_GetSentenceClass(string[lookahead]); + if (sbrk != HB_Sentence_Other && sbrk != HB_Sentence_Numeric && sbrk != HB_Sentence_Close) { + break; + } else if (sbrk == HB_Sentence_Lower) { + brk = SB_Initial; + break; + } + ++lookahead; + } + if (brk == SB_Initial) { + while (i < lookahead) + attributes[i++].sentenceBoundary = false; + } + } + if (brk == SB_Break) { + attributes[i].sentenceBoundary = true; + brk = sentenceBreakTable[SB_Initial][HB_GetSentenceClass(string[i])]; + } else { + attributes[i].sentenceBoundary = false; + } + } +} + + +static inline char *tag_to_string(HB_UInt tag) +{ + static char string[5]; + string[0] = (tag >> 24)&0xff; + string[1] = (tag >> 16)&0xff; + string[2] = (tag >> 8)&0xff; + string[3] = tag&0xff; + string[4] = 0; + return string; +} + +#ifdef OT_DEBUG +static void dump_string(HB_Buffer buffer) +{ + for (uint i = 0; i < buffer->in_length; ++i) { + qDebug(" %x: cluster=%d", buffer->in_string[i].gindex, buffer->in_string[i].cluster); + } +} +#define DEBUG printf +#else +#define DEBUG if (1) ; else printf +#endif + +#define DefaultLangSys 0xffff +#define DefaultScript HB_MAKE_TAG('D', 'F', 'L', 'T') + +enum { + RequiresGsub = 1, + RequiresGpos = 2 +}; + +struct OTScripts { + unsigned int tag; + int flags; +}; +static const OTScripts ot_scripts [] = { + // Common + { HB_MAKE_TAG('l', 'a', 't', 'n'), 0 }, + // Greek + { HB_MAKE_TAG('g', 'r', 'e', 'k'), 0 }, + // Cyrillic + { HB_MAKE_TAG('c', 'y', 'r', 'l'), 0 }, + // Armenian + { HB_MAKE_TAG('a', 'r', 'm', 'n'), 0 }, + // Hebrew + { HB_MAKE_TAG('h', 'e', 'b', 'r'), 1 }, + // Arabic + { HB_MAKE_TAG('a', 'r', 'a', 'b'), 1 }, + // Syriac + { HB_MAKE_TAG('s', 'y', 'r', 'c'), 1 }, + // Thaana + { HB_MAKE_TAG('t', 'h', 'a', 'a'), 1 }, + // Devanagari + { HB_MAKE_TAG('d', 'e', 'v', 'a'), 1 }, + // Bengali + { HB_MAKE_TAG('b', 'e', 'n', 'g'), 1 }, + // Gurmukhi + { HB_MAKE_TAG('g', 'u', 'r', 'u'), 1 }, + // Gujarati + { HB_MAKE_TAG('g', 'u', 'j', 'r'), 1 }, + // Oriya + { HB_MAKE_TAG('o', 'r', 'y', 'a'), 1 }, + // Tamil + { HB_MAKE_TAG('t', 'a', 'm', 'l'), 1 }, + // Telugu + { HB_MAKE_TAG('t', 'e', 'l', 'u'), 1 }, + // Kannada + { HB_MAKE_TAG('k', 'n', 'd', 'a'), 1 }, + // Malayalam + { HB_MAKE_TAG('m', 'l', 'y', 'm'), 1 }, + // Sinhala + { HB_MAKE_TAG('s', 'i', 'n', 'h'), 1 }, + // Thai + { HB_MAKE_TAG('t', 'h', 'a', 'i'), 1 }, + // Lao + { HB_MAKE_TAG('l', 'a', 'o', ' '), 1 }, + // Tibetan + { HB_MAKE_TAG('t', 'i', 'b', 't'), 1 }, + // Myanmar + { HB_MAKE_TAG('m', 'y', 'm', 'r'), 1 }, + // Georgian + { HB_MAKE_TAG('g', 'e', 'o', 'r'), 0 }, + // Hangul + { HB_MAKE_TAG('h', 'a', 'n', 'g'), 1 }, + // Ogham + { HB_MAKE_TAG('o', 'g', 'a', 'm'), 0 }, + // Runic + { HB_MAKE_TAG('r', 'u', 'n', 'r'), 0 }, + // Khmer + { HB_MAKE_TAG('k', 'h', 'm', 'r'), 1 }, + // N'Ko + { HB_MAKE_TAG('n', 'k', 'o', ' '), 1 } +}; +enum { NumOTScripts = sizeof(ot_scripts)/sizeof(OTScripts) }; + +static HB_Bool checkScript(HB_Face face, int script) +{ + assert(script < HB_ScriptCount); + + if (!face->gsub && !face->gpos) + return false; + + unsigned int tag = ot_scripts[script].tag; + int requirements = ot_scripts[script].flags; + + if (requirements & RequiresGsub) { + if (!face->gsub) + return false; + + HB_UShort script_index; + HB_Error error = HB_GSUB_Select_Script(face->gsub, tag, &script_index); + if (error) { + DEBUG("could not select script %d in GSub table: %d", (int)script, error); + error = HB_GSUB_Select_Script(face->gsub, HB_MAKE_TAG('D', 'F', 'L', 'T'), &script_index); + if (error) + return false; + } + } + + if (requirements & RequiresGpos) { + if (!face->gpos) + return false; + + HB_UShort script_index; + HB_Error error = HB_GPOS_Select_Script(face->gpos, script, &script_index); + if (error) { + DEBUG("could not select script in gpos table: %d", error); + error = HB_GPOS_Select_Script(face->gpos, HB_MAKE_TAG('D', 'F', 'L', 'T'), &script_index); + if (error) + return false; + } + + } + return true; +} + +static HB_Stream getTableStream(void *font, HB_GetFontTableFunc tableFunc, HB_Tag tag) +{ + HB_Error error; + HB_UInt length = 0; + HB_Stream stream = 0; + + if (!font) + return 0; + + error = tableFunc(font, tag, 0, &length); + if (error) + return 0; + stream = (HB_Stream)malloc(sizeof(HB_StreamRec)); + if (!stream) + return 0; + stream->base = (HB_Byte*)malloc(length); + if (!stream->base) { + free(stream); + return 0; + } + error = tableFunc(font, tag, stream->base, &length); + if (error) { + _hb_close_stream(stream); + return 0; + } + stream->size = length; + stream->pos = 0; + stream->cursor = NULL; + return stream; +} + +HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc) +{ + HB_Face face = (HB_Face )malloc(sizeof(HB_FaceRec)); + if (!face) + return 0; + + face->isSymbolFont = false; + face->gdef = 0; + face->gpos = 0; + face->gsub = 0; + face->current_script = HB_ScriptCount; + face->current_flags = HB_ShaperFlag_Default; + face->has_opentype_kerning = false; + face->tmpAttributes = 0; + face->tmpLogClusters = 0; + face->glyphs_substituted = false; + face->buffer = 0; + + HB_Error error = HB_Err_Ok; + HB_Stream stream; + HB_Stream gdefStream; + + gdefStream = getTableStream(font, tableFunc, TTAG_GDEF); + error = HB_Err_Not_Covered; + if (!gdefStream || (error = HB_Load_GDEF_Table(gdefStream, &face->gdef))) { + //DEBUG("error loading gdef table: %d", error); + face->gdef = 0; + } + + //DEBUG() << "trying to load gsub table"; + stream = getTableStream(font, tableFunc, TTAG_GSUB); + error = HB_Err_Not_Covered; + if (!stream || (error = HB_Load_GSUB_Table(stream, &face->gsub, face->gdef, gdefStream))) { + face->gsub = 0; + if (error != HB_Err_Not_Covered) { + //DEBUG("error loading gsub table: %d", error); + } else { + //DEBUG("face doesn't have a gsub table"); + } + } + _hb_close_stream(stream); + + stream = getTableStream(font, tableFunc, TTAG_GPOS); + error = HB_Err_Not_Covered; + if (!stream || (error = HB_Load_GPOS_Table(stream, &face->gpos, face->gdef, gdefStream))) { + face->gpos = 0; + DEBUG("error loading gpos table: %d", error); + } + _hb_close_stream(stream); + + _hb_close_stream(gdefStream); + + for (unsigned int i = 0; i < HB_ScriptCount; ++i) + face->supported_scripts[i] = checkScript(face, i); + + if (hb_buffer_new(&face->buffer) != HB_Err_Ok) { + HB_FreeFace(face); + return 0; + } + + return face; +} + +void HB_FreeFace(HB_Face face) +{ + if (!face) + return; + if (face->gpos) + HB_Done_GPOS_Table(face->gpos); + if (face->gsub) + HB_Done_GSUB_Table(face->gsub); + if (face->gdef) + HB_Done_GDEF_Table(face->gdef); + if (face->buffer) + hb_buffer_free(face->buffer); + if (face->tmpAttributes) + free(face->tmpAttributes); + if (face->tmpLogClusters) + free(face->tmpLogClusters); + free(face); +} + +HB_Bool HB_SelectScript(HB_ShaperItem *shaper_item, const HB_OpenTypeFeature *features) +{ + HB_Script script = shaper_item->item.script; + + HB_Face face = shaper_item->face; + if (face->current_script == script && face->current_flags == shaper_item->shaperFlags) + return shaper_item->face->supported_scripts[script] ? true : false; + + face->current_script = script; + face->current_flags = shaper_item->shaperFlags; + + if (!shaper_item->face->supported_scripts[script]) + return false; + + assert(script < HB_ScriptCount); + // find script in our list of supported scripts. + unsigned int tag = ot_scripts[script].tag; + + if (face->gsub && features) { +#ifdef OT_DEBUG + { + HB_FeatureList featurelist = face->gsub->FeatureList; + int numfeatures = featurelist.FeatureCount; + DEBUG("gsub table has %d features", numfeatures); + for (int i = 0; i < numfeatures; i++) { + HB_FeatureRecord *r = featurelist.FeatureRecord + i; + DEBUG(" feature '%s'", tag_to_string(r->FeatureTag)); + } + } +#endif + HB_GSUB_Clear_Features(face->gsub); + HB_UShort script_index; + HB_Error error = HB_GSUB_Select_Script(face->gsub, tag, &script_index); + if (!error) { + DEBUG("script %s has script index %d", tag_to_string(script), script_index); + while (features->tag) { + HB_UShort feature_index; + error = HB_GSUB_Select_Feature(face->gsub, features->tag, script_index, 0xffff, &feature_index); + if (!error) { + DEBUG(" adding feature %s", tag_to_string(features->tag)); + HB_GSUB_Add_Feature(face->gsub, feature_index, features->property); + } + ++features; + } + } + } + + // reset + face->has_opentype_kerning = false; + + if (face->gpos) { + HB_GPOS_Clear_Features(face->gpos); + HB_UShort script_index; + HB_Error error = HB_GPOS_Select_Script(face->gpos, tag, &script_index); + if (!error) { +#ifdef OT_DEBUG + { + HB_FeatureList featurelist = face->gpos->FeatureList; + int numfeatures = featurelist.FeatureCount; + DEBUG("gpos table has %d features", numfeatures); + for(int i = 0; i < numfeatures; i++) { + HB_FeatureRecord *r = featurelist.FeatureRecord + i; + HB_UShort feature_index; + HB_GPOS_Select_Feature(face->gpos, r->FeatureTag, script_index, 0xffff, &feature_index); + DEBUG(" feature '%s'", tag_to_string(r->FeatureTag)); + } + } +#endif + HB_UInt *feature_tag_list_buffer; + error = HB_GPOS_Query_Features(face->gpos, script_index, 0xffff, &feature_tag_list_buffer); + if (!error) { + HB_UInt *feature_tag_list = feature_tag_list_buffer; + while (*feature_tag_list) { + HB_UShort feature_index; + bool skip = false; + if (*feature_tag_list == HB_MAKE_TAG('k', 'e', 'r', 'n')) { + if (face->current_flags & HB_ShaperFlag_NoKerning) + skip = true; + else + face->has_opentype_kerning = true; + } + features = disabled_features; + while (features->tag) { + if (*feature_tag_list == features->tag) { + skip = true; + break; + } + ++features; + } + // 'palt' should be turned off by default unless 'kern' is on + if (!face->has_opentype_kerning && + *feature_tag_list == HB_MAKE_TAG('p', 'a', 'l', 't')) + skip = true; + + if (skip) { + ++feature_tag_list; + continue; + } + error = HB_GPOS_Select_Feature(face->gpos, *feature_tag_list, script_index, 0xffff, &feature_index); + if (!error) + HB_GPOS_Add_Feature(face->gpos, feature_index, PositioningProperties); + ++feature_tag_list; + } + FREE(feature_tag_list_buffer); + } + } + } + + return true; +} + +HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties) +{ + HB_GlyphAttributes *tmpAttributes; + unsigned int *tmpLogClusters; + + HB_Face face = item->face; + + face->length = item->num_glyphs; + + hb_buffer_clear(face->buffer); + + tmpAttributes = (HB_GlyphAttributes *) realloc(face->tmpAttributes, face->length*sizeof(HB_GlyphAttributes)); + if (!tmpAttributes) + return false; + face->tmpAttributes = tmpAttributes; + + tmpLogClusters = (unsigned int *) realloc(face->tmpLogClusters, face->length*sizeof(unsigned int)); + if (!tmpLogClusters) + return false; + face->tmpLogClusters = tmpLogClusters; + + for (int i = 0; i < face->length; ++i) { + hb_buffer_add_glyph(face->buffer, item->glyphs[i], properties ? properties[i] : 0, i); + face->tmpAttributes[i] = item->attributes[i]; + face->tmpLogClusters[i] = item->log_clusters[i]; + } + +#ifdef OT_DEBUG + DEBUG("-----------------------------------------"); +// DEBUG("log clusters before shaping:"); +// for (int j = 0; j < length; j++) +// DEBUG(" log[%d] = %d", j, item->log_clusters[j]); + DEBUG("original glyphs: %p", item->glyphs); + for (int i = 0; i < length; ++i) + DEBUG(" glyph=%4x", hb_buffer->in_string[i].gindex); +// dump_string(hb_buffer); +#endif + + face->glyphs_substituted = false; + if (face->gsub) { + unsigned int error = HB_GSUB_Apply_String(face->gsub, face->buffer); + if (error && error != HB_Err_Not_Covered) + return false; + face->glyphs_substituted = (error != HB_Err_Not_Covered); + } + +#ifdef OT_DEBUG +// DEBUG("log clusters before shaping:"); +// for (int j = 0; j < length; j++) +// DEBUG(" log[%d] = %d", j, item->log_clusters[j]); + DEBUG("shaped glyphs:"); + for (int i = 0; i < length; ++i) + DEBUG(" glyph=%4x", hb_buffer->in_string[i].gindex); + DEBUG("-----------------------------------------"); +// dump_string(hb_buffer); +#endif + + return true; +} + +HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters) +{ + HB_Face face = item->face; + + bool glyphs_positioned = false; + if (face->gpos) { + if (face->buffer->positions) + memset(face->buffer->positions, 0, face->buffer->in_length*sizeof(HB_PositionRec)); + // #### check that passing "false,false" is correct + glyphs_positioned = HB_GPOS_Apply_String(item->font, face->gpos, face->current_flags, face->buffer, false, false) != HB_Err_Not_Covered; + } + + if (!face->glyphs_substituted && !glyphs_positioned) { + HB_HeuristicPosition(item); + return true; // nothing to do for us + } + + // make sure we have enough space to write everything back + if (availableGlyphs < (int)face->buffer->in_length) { + item->num_glyphs = face->buffer->in_length; + return false; + } + + HB_Glyph *glyphs = item->glyphs; + HB_GlyphAttributes *attributes = item->attributes; + + for (unsigned int i = 0; i < face->buffer->in_length; ++i) { + glyphs[i] = face->buffer->in_string[i].gindex; + attributes[i] = face->tmpAttributes[face->buffer->in_string[i].cluster]; + if (i && face->buffer->in_string[i].cluster == face->buffer->in_string[i-1].cluster) + attributes[i].clusterStart = false; + } + item->num_glyphs = face->buffer->in_length; + + if (doLogClusters && face->glyphs_substituted) { + // we can't do this for indic, as we pass the stuf in syllables and it's easier to do it in the shaper. + unsigned short *logClusters = item->log_clusters; + int clusterStart = 0; + int oldCi = 0; + // #### the reconstruction of the logclusters currently does not work if the original string + // contains surrogate pairs + for (unsigned int i = 0; i < face->buffer->in_length; ++i) { + int ci = face->buffer->in_string[i].cluster; + // DEBUG(" ci[%d] = %d mark=%d, cmb=%d, cs=%d", + // i, ci, glyphAttributes[i].mark, glyphAttributes[i].combiningClass, glyphAttributes[i].clusterStart); + if (!attributes[i].mark && attributes[i].clusterStart && ci != oldCi) { + for (int j = oldCi; j < ci; j++) + logClusters[j] = clusterStart; + clusterStart = i; + oldCi = ci; + } + } + for (int j = oldCi; j < face->length; j++) + logClusters[j] = clusterStart; + } + + // calulate the advances for the shaped glyphs +// DEBUG("unpositioned: "); + + // positioning code: + if (glyphs_positioned) { + HB_GetGlyphAdvances(item); + HB_Position positions = face->buffer->positions; + HB_Fixed *advances = item->advances; + +// DEBUG("positioned glyphs:"); + for (unsigned int i = 0; i < face->buffer->in_length; i++) { +// DEBUG(" %d:\t orig advance: (%d/%d)\tadv=(%d/%d)\tpos=(%d/%d)\tback=%d\tnew_advance=%d", i, +// glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(), +// (int)(positions[i].x_advance >> 6), (int)(positions[i].y_advance >> 6), +// (int)(positions[i].x_pos >> 6), (int)(positions[i].y_pos >> 6), +// positions[i].back, positions[i].new_advance); + + HB_Fixed adjustment = (item->item.bidiLevel % 2) ? -positions[i].x_advance : positions[i].x_advance; + + if (!(face->current_flags & HB_ShaperFlag_UseDesignMetrics)) + adjustment = HB_FIXED_ROUND(adjustment); + + if (positions[i].new_advance) { + advances[i] = adjustment; + } else { + advances[i] += adjustment; + } + + int back = 0; + HB_FixedPoint *offsets = item->offsets; + offsets[i].x = positions[i].x_pos; + offsets[i].y = positions[i].y_pos; + while (positions[i - back].back) { + back += positions[i - back].back; + offsets[i].x += positions[i - back].x_pos; + offsets[i].y += positions[i - back].y_pos; + } + offsets[i].y = -offsets[i].y; + + if (item->item.bidiLevel % 2) { + // ### may need to go back multiple glyphs like in ltr + back = positions[i].back; + while (back--) + offsets[i].x -= advances[i-back]; + } else { + back = 0; + while (positions[i - back].back) { + back += positions[i - back].back; + offsets[i].x -= advances[i-back]; + } + } +// DEBUG(" ->\tadv=%d\tpos=(%d/%d)", +// glyphs[i].advance.x.toInt(), glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt()); + } + item->kerning_applied = face->has_opentype_kerning; + } else { + HB_HeuristicPosition(item); + } + +#ifdef OT_DEBUG + if (doLogClusters) { + DEBUG("log clusters after shaping:"); + for (int j = 0; j < length; j++) + DEBUG(" log[%d] = %d", j, item->log_clusters[j]); + } + DEBUG("final glyphs:"); + for (int i = 0; i < (int)hb_buffer->in_length; ++i) + DEBUG(" glyph=%4x char_index=%d mark: %d cmp: %d, clusterStart: %d advance=%d/%d offset=%d/%d", + glyphs[i].glyph, hb_buffer->in_string[i].cluster, glyphs[i].attributes.mark, + glyphs[i].attributes.combiningClass, glyphs[i].attributes.clusterStart, + glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(), + glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt()); + DEBUG("-----------------------------------------"); +#endif + return true; +} + +HB_Bool HB_ShapeItem(HB_ShaperItem *shaper_item) +{ + HB_Bool result = false; + if (shaper_item->num_glyphs < shaper_item->item.length) { + shaper_item->num_glyphs = shaper_item->item.length; + return false; + } + assert(shaper_item->item.script < HB_ScriptCount); + result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item); + shaper_item->glyphIndicesPresent = false; + return result; +} + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h new file mode 100644 index 0000000000..470e27b6f9 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.h @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_SHAPER_H +#define HARFBUZZ_SHAPER_H + +#include "harfbuzz-global.h" +#include "harfbuzz-gdef.h" +#include "harfbuzz-gpos.h" +#include "harfbuzz-gsub.h" +#include "harfbuzz-external.h" +#include "harfbuzz-stream-private.h" + +HB_BEGIN_HEADER + +/* + using anything else than signed or unsigned for bitfields in C is non standard, + but accepted by almost all compilers. And it gives a significant reduction in + memory consumption as HB_CharAttributes and HB_GlyphAttributes will not have + a 4 byte alignment +*/ +#ifdef __xlC__ +typedef unsigned hb_bitfield; +#else +typedef hb_uint8 hb_bitfield; +#endif + +typedef enum { + HB_Script_Common, + HB_Script_Greek, + HB_Script_Cyrillic, + HB_Script_Armenian, + HB_Script_Hebrew, + HB_Script_Arabic, + HB_Script_Syriac, + HB_Script_Thaana, + HB_Script_Devanagari, + HB_Script_Bengali, + HB_Script_Gurmukhi, + HB_Script_Gujarati, + HB_Script_Oriya, + HB_Script_Tamil, + HB_Script_Telugu, + HB_Script_Kannada, + HB_Script_Malayalam, + HB_Script_Sinhala, + HB_Script_Thai, + HB_Script_Lao, + HB_Script_Tibetan, + HB_Script_Myanmar, + HB_Script_Georgian, + HB_Script_Hangul, + HB_Script_Ogham, + HB_Script_Runic, + HB_Script_Khmer, + HB_Script_Nko, + HB_Script_Inherited, + HB_ScriptCount = HB_Script_Inherited + /* + HB_Script_Latin = Common, + HB_Script_Ethiopic = Common, + HB_Script_Cherokee = Common, + HB_Script_CanadianAboriginal = Common, + HB_Script_Mongolian = Common, + HB_Script_Hiragana = Common, + HB_Script_Katakana = Common, + HB_Script_Bopomofo = Common, + HB_Script_Han = Common, + HB_Script_Yi = Common, + HB_Script_OldItalic = Common, + HB_Script_Gothic = Common, + HB_Script_Deseret = Common, + HB_Script_Tagalog = Common, + HB_Script_Hanunoo = Common, + HB_Script_Buhid = Common, + HB_Script_Tagbanwa = Common, + HB_Script_Limbu = Common, + HB_Script_TaiLe = Common, + HB_Script_LinearB = Common, + HB_Script_Ugaritic = Common, + HB_Script_Shavian = Common, + HB_Script_Osmanya = Common, + HB_Script_Cypriot = Common, + HB_Script_Braille = Common, + HB_Script_Buginese = Common, + HB_Script_Coptic = Common, + HB_Script_NewTaiLue = Common, + HB_Script_Glagolitic = Common, + HB_Script_Tifinagh = Common, + HB_Script_SylotiNagri = Common, + HB_Script_OldPersian = Common, + HB_Script_Kharoshthi = Common, + HB_Script_Balinese = Common, + HB_Script_Cuneiform = Common, + HB_Script_Phoenician = Common, + HB_Script_PhagsPa = Common, + */ +} HB_Script; + +typedef struct +{ + hb_uint32 pos; + hb_uint32 length; + HB_Script script; + hb_uint8 bidiLevel; +} HB_ScriptItem; + +typedef enum { + HB_NoBreak, + HB_SoftHyphen, + HB_Break, + HB_ForcedBreak +} HB_LineBreakType; + + +typedef struct { + /*HB_LineBreakType*/ hb_bitfield lineBreakType :2; + /*HB_Bool*/ hb_bitfield whiteSpace :1; /* A unicode whitespace character, except NBSP, ZWNBSP */ + /*HB_Bool*/ hb_bitfield charStop :1; /* Valid cursor position (for left/right arrow) */ + /*HB_Bool*/ hb_bitfield wordBoundary :1; + /*HB_Bool*/ hb_bitfield sentenceBoundary :1; + hb_bitfield unused :2; +} HB_CharAttributes; + +void HB_GetCharAttributes(const HB_UChar16 *string, hb_uint32 stringLength, + const HB_ScriptItem *items, hb_uint32 numItems, + HB_CharAttributes *attributes); + +/* requires HB_GetCharAttributes to be called before */ +void HB_GetWordBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, + const HB_ScriptItem *items, hb_uint32 numItems, + HB_CharAttributes *attributes); + +/* requires HB_GetCharAttributes to be called before */ +void HB_GetSentenceBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, + const HB_ScriptItem *items, hb_uint32 numItems, + HB_CharAttributes *attributes); + + +typedef enum { + HB_LeftToRight = 0, + HB_RightToLeft = 1 +} HB_StringToGlyphsFlags; + +typedef enum { + HB_ShaperFlag_Default = 0, + HB_ShaperFlag_NoKerning = 1, + HB_ShaperFlag_UseDesignMetrics = 2 +} HB_ShaperFlag; + +/* + highest value means highest priority for justification. Justification is done by first inserting kashidas + starting with the highest priority positions, then stretching spaces, afterwards extending inter char + spacing, and last spacing between arabic words. + NoJustification is for example set for arabic where no Kashida can be inserted or for diacritics. +*/ +typedef enum { + HB_NoJustification= 0, /* Justification can't be applied after this glyph */ + HB_Arabic_Space = 1, /* This glyph represents a space inside arabic text */ + HB_Character = 2, /* Inter-character justification point follows this glyph */ + HB_Space = 4, /* This glyph represents a blank outside an Arabic run */ + HB_Arabic_Normal = 7, /* Normal Middle-Of-Word glyph that connects to the right (begin) */ + HB_Arabic_Waw = 8, /* Next character is final form of Waw/Ain/Qaf/Fa */ + HB_Arabic_BaRa = 9, /* Next two chars are Ba + Ra/Ya/AlefMaksura */ + HB_Arabic_Alef = 10, /* Next character is final form of Alef/Tah/Lam/Kaf/Gaf */ + HB_Arabic_HaaDal = 11, /* Next character is final form of Haa/Dal/Taa Marbutah */ + HB_Arabic_Seen = 12, /* Initial or Medial form Of Seen/Sad */ + HB_Arabic_Kashida = 13 /* Kashida(U+640) in middle of word */ +} HB_JustificationClass; + +/* This structure is binary compatible with Uniscribe's SCRIPT_VISATTR. Would be nice to keep + * it like that. If this is a problem please tell Trolltech :) + */ +typedef struct { + hb_bitfield justification :4; /* Justification class */ + hb_bitfield clusterStart :1; /* First glyph of representation of cluster */ + hb_bitfield mark :1; /* needs to be positioned around base char */ + hb_bitfield zeroWidth :1; /* ZWJ, ZWNJ etc, with no width */ + hb_bitfield dontPrint :1; + hb_bitfield combiningClass :8; +} HB_GlyphAttributes; + +typedef struct HB_FaceRec_ { + HB_Bool isSymbolFont; + + HB_GDEF gdef; + HB_GSUB gsub; + HB_GPOS gpos; + HB_Bool supported_scripts[HB_ScriptCount]; + HB_Buffer buffer; + HB_Script current_script; + int current_flags; /* HB_ShaperFlags */ + HB_Bool has_opentype_kerning; + HB_Bool glyphs_substituted; + HB_GlyphAttributes *tmpAttributes; + unsigned int *tmpLogClusters; + int length; + int orig_nglyphs; +} HB_FaceRec; + +typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length); + +HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc); +void HB_FreeFace(HB_Face face); + +typedef struct { + HB_Fixed x, y; + HB_Fixed width, height; + HB_Fixed xOffset, yOffset; +} HB_GlyphMetrics; + +typedef enum { + HB_FontAscent +} HB_FontMetric; + +typedef struct { + HB_Bool (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft); + void (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/); + HB_Bool (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 length); + /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD_NO_SCALE */ + HB_Error (*getPointInOutline)(HB_Font font, HB_Glyph glyph, int flags /*HB_ShaperFlag*/, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints); + void (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics); + HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric); +} HB_FontClass; + +typedef struct HB_Font_ { + const HB_FontClass *klass; + + /* Metrics */ + HB_UShort x_ppem, y_ppem; + HB_16Dot16 x_scale, y_scale; + + void *userData; +} HB_FontRec; + +typedef struct HB_ShaperItem_ HB_ShaperItem; + +struct HB_ShaperItem_ { + const HB_UChar16 *string; /* input: the Unicode UTF16 text to be shaped */ + hb_uint32 stringLength; /* input: the length of the input in 16-bit words */ + HB_ScriptItem item; /* input: the current run to be shaped: a run of text all in the same script that is a substring of */ + HB_Font font; /* input: the font: scale, units and function pointers supplying glyph indices and metrics */ + HB_Face face; /* input: the shaper state; current script, access to the OpenType tables , etc. */ + int shaperFlags; /* input (unused) should be set to 0; intended to support flags defined in HB_ShaperFlag */ + HB_Bool glyphIndicesPresent; /* input: true if the array contains glyph indices ready to be shaped */ + hb_uint32 initialGlyphCount; /* input: if glyphIndicesPresent is true, the number of glyph indices in the array */ + + hb_uint32 num_glyphs; /* input: capacity of output arrays , , , , and ; */ + /* output: required capacity (may be larger than actual capacity) */ + + HB_Glyph *glyphs; /* output: indices of shaped glyphs */ + HB_GlyphAttributes *attributes; /* output: glyph attributes */ + HB_Fixed *advances; /* output: advances */ + HB_FixedPoint *offsets; /* output: offsets */ + unsigned short *log_clusters; /* output: for each output glyph, the index in the input of the start of its logical cluster */ + + /* internal */ + HB_Bool kerning_applied; /* output: true if kerning was applied by the shaper */ +}; + +HB_Bool HB_ShapeItem(HB_ShaperItem *item); + +HB_END_HEADER + +#endif diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-stream-private.h b/src/3rdparty/harfbuzz/src/harfbuzz-stream-private.h new file mode 100644 index 0000000000..fbd9f81379 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-stream-private.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_STREAM_PRIVATE_H +#define HARFBUZZ_STREAM_PRIVATE_H + +#include "harfbuzz-impl.h" +#include "harfbuzz-stream.h" + +HB_BEGIN_HEADER + +HB_INTERNAL void +_hb_close_stream( HB_Stream stream ); + +HB_INTERNAL HB_Int +_hb_stream_pos( HB_Stream stream ); + +HB_INTERNAL HB_Error +_hb_stream_seek( HB_Stream stream, + HB_UInt pos ); + +HB_INTERNAL HB_Error +_hb_stream_frame_enter( HB_Stream stream, + HB_UInt size ); + +HB_INTERNAL void +_hb_stream_frame_exit( HB_Stream stream ); + +/* convenience macros */ + +#define SET_ERR(c) ( (error = (c)) != 0 ) + +#define GOTO_Table(tag) (0) +#define FILE_Pos() _hb_stream_pos( stream ) +#define FILE_Seek(pos) SET_ERR( _hb_stream_seek( stream, pos ) ) +#define ACCESS_Frame(size) SET_ERR( _hb_stream_frame_enter( stream, size ) ) +#define FORGET_Frame() _hb_stream_frame_exit( stream ) + +#define GET_Byte() (*stream->cursor++) +#define GET_Short() (stream->cursor += 2, (HB_Short)( \ + (*(((HB_Byte*)stream->cursor)-2) << 8) | \ + *(((HB_Byte*)stream->cursor)-1) \ + )) +#define GET_Long() (stream->cursor += 4, (HB_Int)( \ + (*(((HB_Byte*)stream->cursor)-4) << 24) | \ + (*(((HB_Byte*)stream->cursor)-3) << 16) | \ + (*(((HB_Byte*)stream->cursor)-2) << 8) | \ + *(((HB_Byte*)stream->cursor)-1) \ + )) + + +#define GET_Char() ((HB_Char)GET_Byte()) +#define GET_UShort() ((HB_UShort)GET_Short()) +#define GET_ULong() ((HB_UInt)GET_Long()) +#define GET_Tag4() GET_ULong() + +HB_END_HEADER + +#endif /* HARFBUZZ_STREAM_PRIVATE_H */ diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-stream.c b/src/3rdparty/harfbuzz/src/harfbuzz-stream.c new file mode 100644 index 0000000000..2d9638f6b6 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-stream.c @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2005 David Turner + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * Copyright (C) 2007 Red Hat, Inc. + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + */ + +#include "harfbuzz-impl.h" +#include "harfbuzz-stream-private.h" +#include + +#if 0 +#include +#define LOG(x) _hb_log x + +static void +_hb_log( const char* format, ... ) +{ + va_list ap; + + va_start( ap, format ); + vfprintf( stderr, format, ap ); + va_end( ap ); +} + +#else +#define LOG(x) do {} while (0) +#endif + +HB_INTERNAL void +_hb_close_stream( HB_Stream stream ) +{ + if (!stream) + return; + free(stream->base); + free(stream); +} + + +HB_INTERNAL HB_Int +_hb_stream_pos( HB_Stream stream ) +{ + LOG(( "_hb_stream_pos() -> %ld\n", stream->pos )); + return stream->pos; +} + + +HB_INTERNAL HB_Error +_hb_stream_seek( HB_Stream stream, + HB_UInt pos ) +{ + HB_Error error = (HB_Error)0; + + stream->pos = pos; + if (pos > stream->size) + error = ERR(HB_Err_Read_Error); + + LOG(( "_hb_stream_seek(%ld) -> 0x%04X\n", pos, error )); + return error; +} + + +HB_INTERNAL HB_Error +_hb_stream_frame_enter( HB_Stream stream, + HB_UInt count ) +{ + HB_Error error = HB_Err_Ok; + + /* check new position, watch for overflow */ + if (HB_UNLIKELY (stream->pos + count > stream->size || + stream->pos + count < stream->pos)) + { + error = ERR(HB_Err_Read_Error); + goto Exit; + } + + /* set cursor */ + stream->cursor = stream->base + stream->pos; + stream->pos += count; + +Exit: + LOG(( "_hb_stream_frame_enter(%ld) -> 0x%04X\n", count, error )); + return error; +} + + +HB_INTERNAL void +_hb_stream_frame_exit( HB_Stream stream ) +{ + stream->cursor = NULL; + + LOG(( "_hb_stream_frame_exit()\n" )); +} diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-stream.h b/src/3rdparty/harfbuzz/src/harfbuzz-stream.h new file mode 100644 index 0000000000..cfbfb1c4fe --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-stream.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2005 David Turner + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_STREAM_H +#define HARFBUZZ_STREAM_H + +#include "harfbuzz-global.h" + +HB_BEGIN_HEADER + +typedef struct HB_StreamRec_ +{ + HB_Byte* base; + HB_Byte* cursor; + HB_UInt size; + HB_UInt pos; +} HB_StreamRec; + +HB_END_HEADER + +#endif diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-thai.c b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c new file mode 100644 index 0000000000..e80e2c5880 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-thai.c @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" +#include "harfbuzz-external.h" + +#include +#include + +typedef int (*th_brk_def)(const char*, int[], int); +static th_brk_def th_brk = 0; +static int libthai_resolved = 0; + +static void resolve_libthai() +{ + if (!th_brk) + th_brk = (th_brk_def)HB_Library_Resolve("thai", 0, "th_brk"); + libthai_resolved = 1; +} + +static void to_tis620(const HB_UChar16 *string, hb_uint32 len, const char *cstr) +{ + hb_uint32 i; + unsigned char *result = (unsigned char *)cstr; + + for (i = 0; i < len; ++i) { + if (string[i] <= 0xa0) + result[i] = (unsigned char)string[i]; + if (string[i] >= 0xe01 && string[i] <= 0xe5b) + result[i] = (unsigned char)(string[i] - 0xe00 + 0xa0); + else + result[i] = '?'; + } + + result[len] = 0; +} + +static void thaiWordBreaks(const HB_UChar16 *string, hb_uint32 len, HB_CharAttributes *attributes) +{ + char s[128]; + char *cstr = s; + int brp[128]; + int *break_positions = brp; + hb_uint32 numbreaks; + hb_uint32 i; + + if (!libthai_resolved) + resolve_libthai(); + + if (!th_brk) + return; + + if (len >= 128) + cstr = (char *)malloc(len*sizeof(char) + 1); + + to_tis620(string, len, cstr); + + numbreaks = th_brk(cstr, break_positions, 128); + if (numbreaks > 128) { + break_positions = (int *)malloc(numbreaks * sizeof(int)); + numbreaks = th_brk(cstr, break_positions, numbreaks); + } + + for (i = 0; i < len; ++i) { + attributes[i].lineBreakType = HB_NoBreak; + attributes[i].wordBoundary = FALSE; + } + + for (i = 0; i < numbreaks; ++i) { + if (break_positions[i] > 0) { + attributes[break_positions[i]-1].lineBreakType = HB_Break; + attributes[break_positions[i]-1].wordBoundary = TRUE; + } + } + + if (break_positions != brp) + free(break_positions); + + if (len >= 128) + free(cstr); +} + +void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) +{ + assert(script == HB_Script_Thai); + attributes += from; + thaiWordBreaks(text + from, len, attributes); +} + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c b/src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c new file mode 100644 index 0000000000..bfa31b1def --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz-tibetan.c @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include "harfbuzz-shaper.h" +#include "harfbuzz-shaper-private.h" + +#include + +/* + tibetan syllables are of the form: + head position consonant + first sub-joined consonant + ....intermediate sub-joined consonants (if any) + last sub-joined consonant + sub-joined vowel (a-chung U+0F71) + standard or compound vowel sign (or 'virama' for devanagari transliteration) +*/ + +typedef enum { + TibetanOther, + TibetanHeadConsonant, + TibetanSubjoinedConsonant, + TibetanSubjoinedVowel, + TibetanVowel +} TibetanForm; + +/* this table starts at U+0f40 */ +static const unsigned char tibetanForm[0x80] = { + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, + TibetanOther, TibetanOther, TibetanOther, TibetanOther, + + TibetanOther, TibetanVowel, TibetanVowel, TibetanVowel, + TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, + TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, + TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, + + TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, + TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, + TibetanOther, TibetanOther, TibetanOther, TibetanOther, + TibetanOther, TibetanOther, TibetanOther, TibetanOther, + + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, + TibetanSubjoinedConsonant, TibetanOther, TibetanOther, TibetanOther +}; + + +#define tibetan_form(c) \ + (TibetanForm)tibetanForm[c - 0x0f40] + +static const HB_OpenTypeFeature tibetan_features[] = { + { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, + { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty }, + { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty }, + { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty }, + {0, 0} +}; + +static HB_Bool tibetan_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid) +{ + hb_uint32 i; + const HB_UChar16 *str = item->string + item->item.pos; + int len = item->item.length; +#ifndef NO_OPENTYPE + const int availableGlyphs = item->num_glyphs; +#endif + HB_Bool haveGlyphs; + HB_STACKARRAY(HB_UChar16, reordered, len + 4); + + if (item->num_glyphs < item->item.length + 4) { + item->num_glyphs = item->item.length + 4; + return FALSE; + } + + if (invalid) { + *reordered = 0x25cc; + memcpy(reordered+1, str, len*sizeof(HB_UChar16)); + len++; + str = reordered; + } + + haveGlyphs = item->font->klass->convertStringToGlyphIndices(item->font, + str, len, + item->glyphs, &item->num_glyphs, + item->item.bidiLevel % 2); + + HB_FREE_STACKARRAY(reordered); + + if (!haveGlyphs) + return FALSE; + + for (i = 0; i < item->item.length; i++) { + item->attributes[i].mark = FALSE; + item->attributes[i].clusterStart = FALSE; + item->attributes[i].justification = 0; + item->attributes[i].zeroWidth = FALSE; +/* IDEBUG(" %d: %4x", i, str[i]); */ + } + + /* now we have the syllable in the right order, and can start running it through open type. */ + +#ifndef NO_OPENTYPE + if (openType) { + HB_OpenTypeShape(item, /*properties*/0); + if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE)) + return FALSE; + } else { + HB_HeuristicPosition(item); + } +#endif + + item->attributes[0].clusterStart = TRUE; + return TRUE; +} + + +static int tibetan_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid) +{ + const HB_UChar16 *uc = s + start; + + int pos = 0; + TibetanForm state = tibetan_form(*uc); + +/* qDebug("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);*/ + pos++; + + if (state != TibetanHeadConsonant) { + if (state != TibetanOther) + *invalid = TRUE; + goto finish; + } + + while (pos < end - start) { + TibetanForm newState = tibetan_form(uc[pos]); + switch(newState) { + case TibetanSubjoinedConsonant: + case TibetanSubjoinedVowel: + if (state != TibetanHeadConsonant && + state != TibetanSubjoinedConsonant) + goto finish; + state = newState; + break; + case TibetanVowel: + if (state != TibetanHeadConsonant && + state != TibetanSubjoinedConsonant && + state != TibetanSubjoinedVowel) + goto finish; + break; + case TibetanOther: + case TibetanHeadConsonant: + goto finish; + } + pos++; + } + +finish: + *invalid = FALSE; + return start+pos; +} + +HB_Bool HB_TibetanShape(HB_ShaperItem *item) +{ + + HB_Bool openType = FALSE; + unsigned short *logClusters = item->log_clusters; + + HB_ShaperItem syllable = *item; + int first_glyph = 0; + + int sstart = item->item.pos; + int end = sstart + item->item.length; + + assert(item->item.script == HB_Script_Tibetan); + +#ifndef QT_NO_OPENTYPE + openType = HB_SelectScript(item, tibetan_features); +#endif + + while (sstart < end) { + HB_Bool invalid; + int i; + int send = tibetan_nextSyllableBoundary(item->string, sstart, end, &invalid); +/* IDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, + invalid ? "TRUE" : "FALSE"); */ + syllable.item.pos = sstart; + syllable.item.length = send-sstart; + syllable.glyphs = item->glyphs + first_glyph; + syllable.attributes = item->attributes + first_glyph; + syllable.offsets = item->offsets + first_glyph; + syllable.advances = item->advances + first_glyph; + syllable.num_glyphs = item->num_glyphs - first_glyph; + if (!tibetan_shape_syllable(openType, &syllable, invalid)) { + item->num_glyphs += syllable.num_glyphs; + return FALSE; + } + /* fix logcluster array */ + for (i = sstart; i < send; ++i) + logClusters[i-item->item.pos] = first_glyph; + sstart = send; + first_glyph += syllable.num_glyphs; + } + item->num_glyphs = first_glyph; + return TRUE; +} + +void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) +{ + int end = from + len; + const HB_UChar16 *uc = text + from; + hb_uint32 i = 0; + HB_UNUSED(script); + attributes += from; + while (i < len) { + HB_Bool invalid; + hb_uint32 boundary = tibetan_nextSyllableBoundary(text, from+i, end, &invalid) - from; + + attributes[i].charStop = TRUE; + + if (boundary > len-1) boundary = len; + i++; + while (i < boundary) { + attributes[i].charStop = FALSE; + ++uc; + ++i; + } + assert(i == boundary); + } +} + + diff --git a/src/3rdparty/harfbuzz/src/harfbuzz.c b/src/3rdparty/harfbuzz/src/harfbuzz.c new file mode 100644 index 0000000000..3e4a30a125 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz.c @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#define HB_INTERNAL static +#include "harfbuzz-buffer.c" +#include "harfbuzz-gdef.c" +#include "harfbuzz-gsub.c" +#include "harfbuzz-gpos.c" +#include "harfbuzz-impl.c" +#include "harfbuzz-open.c" +#include "harfbuzz-stream.c" diff --git a/src/3rdparty/harfbuzz/src/harfbuzz.h b/src/3rdparty/harfbuzz/src/harfbuzz.h new file mode 100644 index 0000000000..e91a33eb71 --- /dev/null +++ b/src/3rdparty/harfbuzz/src/harfbuzz.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 1998-2004 David Turner and Werner Lemberg + * Copyright (C) 2006 Behdad Esfahbod + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HARFBUZZ_H +#define HARFBUZZ_H + +#include "harfbuzz-external.h" +#include "harfbuzz-global.h" +#include "harfbuzz-buffer.h" +#include "harfbuzz-gdef.h" +#include "harfbuzz-gsub.h" +#include "harfbuzz-gpos.h" +#include "harfbuzz-open.h" +#include "harfbuzz-shaper.h" + +#endif /* HARFBUZZ_OPEN_H */ diff --git a/src/3rdparty/harfbuzz/tests/Makefile.am b/src/3rdparty/harfbuzz/tests/Makefile.am new file mode 100644 index 0000000000..febf8909fa --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/Makefile.am @@ -0,0 +1,7 @@ + +SUBDIRS = + +if QT +SUBDIRS += linebreaking shaping +endif + diff --git a/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc b/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc new file mode 100644 index 0000000000..133577a09c --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/fuzzing/fuzz.cc @@ -0,0 +1,124 @@ +// This is a fuzzing harness for Harfbuzz. Since Harfbuzz's input is generally +// expected to be controlled by a remote party it's a possible vector for +// security issues. +// +// Fuzzing is a black-box testing scheme where the black-box (Harfbuzz's shaping +// engine in this case) is fed random input to see if it will misbehave. +// Misbehaviours can often be turned into security or crash issues. +// +// It's expected that one will generally run this under valgrind in order to get +// better detection of problems. + +#include +#include + +#include +#include FT_FREETYPE_H + +#include "../../src/harfbuzz-shaper.h" +#include "../../src/harfbuzz-global.h" +#include "../../src/harfbuzz-gpos.h" + +extern "C" { +#include "../../contrib/harfbuzz-unicode.h" +#include "../../contrib/harfbuzz-freetype.h" +} + +static FT_Library freetype; + +static FT_Face loadFace(const char *path) +{ + FT_Face face; + + if (FT_New_Face(freetype, path, /* index */ 0, &face)) + return 0; + return face; +} + +static const int kWidth = 100; +static const int kHeight = 100; + +static int +usage(const char *argv0) { + fprintf(stderr, "Usage: %s \n", argv0); + return 1; +} + +int +main(int argc, char **argv) { + FT_Init_FreeType(&freetype); + + if (argc != 2) + return usage(argv[0]); + + FT_Face face; + if (FT_New_Face(freetype, argv[1], 0 /* face index */, &face)) { + fprintf(stderr, "Failed to load font file\n"); + return 1; + } + + HB_Face hbFace = HB_NewFace(face, hb_freetype_table_sfnt_get); + + HB_FontRec hbFont; + hbFont.klass = &hb_freetype_class; + hbFont.userData = face; + hbFont.x_ppem = face->size->metrics.x_ppem; + hbFont.y_ppem = face->size->metrics.y_ppem; + hbFont.x_scale = face->size->metrics.x_scale; + hbFont.y_scale = face->size->metrics.y_scale; + + // This is the maximum number of bytes of input which we'll feed to Harfbuzz + // in one shot. We also overload it and make it the size of the output arrays + // as well. (Must be a power of two.) + static const unsigned kMaxInputBytes = 1024; + uint8_t str[kMaxInputBytes]; + + HB_ShaperItem shaper_item; + shaper_item.kerning_applied = false; + shaper_item.string = (HB_UChar16 *) str; + shaper_item.stringLength = 0; + shaper_item.item.bidiLevel = 0; + shaper_item.shaperFlags = 0; + shaper_item.font = &hbFont; + shaper_item.face = hbFace; + shaper_item.glyphIndicesPresent = false; + shaper_item.initialGlyphCount = 0; + + HB_Glyph out_glyphs[kMaxInputBytes]; + HB_GlyphAttributes out_attrs[kMaxInputBytes]; + HB_Fixed out_advs[kMaxInputBytes]; + HB_FixedPoint out_offsets[kMaxInputBytes]; + unsigned short out_logClusters[kMaxInputBytes]; + + shaper_item.glyphs = out_glyphs; + shaper_item.attributes = out_attrs; + shaper_item.advances = out_advs; + shaper_item.offsets = out_offsets; + shaper_item.log_clusters = out_logClusters; + shaper_item.num_glyphs = kMaxInputBytes; + + FILE *urandom = fopen("/dev/urandom", "rb"); + if (!urandom) { + fprintf(stderr, "Cannot open /dev/urandom\n"); + return 1; + } + + for (;;) { + uint16_t len; + fread(&len, sizeof(len), 1, urandom); + len &= (kMaxInputBytes - 1); + len &= ~1; + fread(str, len, 1, urandom); + + ssize_t iterator = 0; + + for (;;) { + if (!hb_utf16_script_run_next(NULL, &shaper_item.item, (uint16_t *) str, len >> 1, &iterator)) + break; + + HB_ShapeItem(&shaper_item); + } + } + + HB_FreeFace(hbFace); +} diff --git a/src/3rdparty/harfbuzz/tests/linebreaking/.gitignore b/src/3rdparty/harfbuzz/tests/linebreaking/.gitignore new file mode 100644 index 0000000000..81e019d5b9 --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/linebreaking/.gitignore @@ -0,0 +1,4 @@ +.deps +linebreaking +*.moc +*.o diff --git a/src/3rdparty/harfbuzz/tests/linebreaking/Makefile.am b/src/3rdparty/harfbuzz/tests/linebreaking/Makefile.am new file mode 100644 index 0000000000..b710896d6f --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/linebreaking/Makefile.am @@ -0,0 +1,12 @@ + +check_PROGRAMS = linebreaking + +linebreaking_SOURCES = main.cpp harfbuzz-qt.cpp +linebreaking_LDADD = $(QT_GUI_LIBS) $(QT_QTEST_LIBS) ../../src/libharfbuzz-1.la + +main.o: main.moc + +main.moc: $(srcdir)/main.cpp + $(QT_MOC) -o main.moc $(srcdir)/main.cpp + +INCLUDES = -I$(top_srcdir)/src $(FREETYPE_CFLAGS) $(QT_GUI_CFLAGS) $(QT_QTEST_CFLAGS) diff --git a/src/3rdparty/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp b/src/3rdparty/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp new file mode 100644 index 0000000000..f0048b75ef --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include +#include +#include +#include + +extern "C" { + +HB_LineBreakClass HB_GetLineBreakClass(HB_UChar32 ch) +{ +#if QT_VERSION >= 0x040300 + return (HB_LineBreakClass)QUnicodeTables::lineBreakClass(ch); +#else +#error "This test currently requires Qt >= 4.3" +#endif +} + +void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass) +{ + *category = (HB_CharCategory)QChar::category(ch); + *combiningClass = QChar::combiningClass(ch); +} + +HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch) +{ + return (HB_CharCategory)QChar::category(ch); +} + +int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch) +{ + return QChar::combiningClass(ch); +} + +HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch) +{ + return QChar::mirroredChar(ch); +} + +HB_WordClass HB_GetWordClass(HB_UChar32 ch) +{ + const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ch); + return (HB_WordClass) prop->wordBreak; +} + + +HB_SentenceClass HB_GetSentenceClass(HB_UChar32 ch) +{ + const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ch); + return (HB_SentenceClass) prop->sentenceBreak; +} + +void HB_GetGraphemeAndLineBreakClass(HB_UChar32 ch, HB_GraphemeClass *grapheme, HB_LineBreakClass *lineBreak) +{ + const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ch); + *grapheme = (HB_GraphemeClass) prop->graphemeBreak; + *lineBreak = (HB_LineBreakClass) prop->line_break_class; +} + +void *HB_Library_Resolve(const char *library, int version, const char *symbol) +{ + return QLibrary::resolve(library, version, symbol); +} + +} diff --git a/src/3rdparty/harfbuzz/tests/linebreaking/main.cpp b/src/3rdparty/harfbuzz/tests/linebreaking/main.cpp new file mode 100644 index 0000000000..3b2734ac02 --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/linebreaking/main.cpp @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +/* + !!!!!! Warning !!!!! + Please don't save this file in emacs. It contains utf8 text sequences emacs will + silently convert to a series of question marks. + */ +#include +#include + +#include + +static QVector getCharAttributes(const QString &str, HB_Script script = HB_Script_Common) +{ + QVector attrs(str.length()); + HB_ScriptItem item; + item.pos = 0; + item.length = str.length(); + item.script = script; + HB_GetCharAttributes(str.utf16(), str.length(), + &item, 1, + attrs.data()); + return attrs; +} + +class tst_CharAttributes : public QObject +{ + Q_OBJECT + +public: + tst_CharAttributes(); + virtual ~tst_CharAttributes(); + +public slots: + void init(); + void cleanup(); +private slots: + void lineBreaking(); + void charWordStopOnLineSeparator(); + void charStopForSurrogatePairs(); + void thaiWordBreak(); +}; + + +tst_CharAttributes::tst_CharAttributes() +{ +} + +tst_CharAttributes::~tst_CharAttributes() +{ +} + +void tst_CharAttributes::init() +{ +} + +void tst_CharAttributes::cleanup() +{ +} + + +void tst_CharAttributes::lineBreaking() +{ + struct Breaks { + const char *utf8; + uchar breaks[32]; + }; + Breaks brks[] = { + { "11", { false, 0xff } }, + { "aa", { false, 0xff } }, + { "++", { false, 0xff } }, + { "--", { false, 0xff } }, + { "((", { false, 0xff } }, + { "))", { false, 0xff } }, + { "..", { false, 0xff } }, + { "\"\"", { false, 0xff } }, + { "$$", { false, 0xff } }, + { "!!", { false, 0xff } }, + { "??", { false, 0xff } }, + { ",,", { false, 0xff } }, + + { ")()", { true, false, 0xff } }, + { "?!?", { false, false, 0xff } }, + { ".,.", { false, false, 0xff } }, + { "+-+", { false, false, 0xff } }, + { "+=+", { false, false, 0xff } }, + { "+(+", { false, false, 0xff } }, + { "+)+", { false, false, 0xff } }, + + { "a b", { false, true, 0xff } }, + { "a(b", { false, false, 0xff } }, + { "a)b", { false, false, 0xff } }, + { "a-b", { false, true, 0xff } }, + { "a.b", { false, false, 0xff } }, + { "a+b", { false, false, 0xff } }, + { "a?b", { false, false, 0xff } }, + { "a!b", { false, false, 0xff } }, + { "a$b", { false, false, 0xff } }, + { "a,b", { false, false, 0xff } }, + { "a/b", { false, false, 0xff } }, + { "1/2", { false, false, 0xff } }, + { "./.", { false, false, 0xff } }, + { ",/,", { false, false, 0xff } }, + { "!/!", { false, false, 0xff } }, + { "\\/\\", { false, false, 0xff } }, + { "1 2", { false, true, 0xff } }, + { "1(2", { false, false, 0xff } }, + { "1)2", { false, false, 0xff } }, + { "1-2", { false, false, 0xff } }, + { "1.2", { false, false, 0xff } }, + { "1+2", { false, false, 0xff } }, + { "1?2", { false, true, 0xff } }, + { "1!2", { false, true, 0xff } }, + { "1$2", { false, false, 0xff } }, + { "1,2", { false, false, 0xff } }, + { "1/2", { false, false, 0xff } }, + { "\330\260\331\216\331\204\331\220\331\203\331\216", { false, false, false, false, false, 0xff } }, + { "\330\247\331\204\331\205 \330\247\331\204\331\205", { false, false, false, true, false, false, 0xff } }, + { "1#2", { false, false, 0xff } }, + { "!#!", { false, false, 0xff } }, + { 0, {} } + }; + Breaks *b = brks; + while (b->utf8) { + QString str = QString::fromUtf8(b->utf8); + + QVector attrs = getCharAttributes(str); + + int i; + for (i = 0; i < (int)str.length() - 1; ++i) { + QVERIFY(b->breaks[i] != 0xff); + if ( (attrs[i].lineBreakType != HB_NoBreak) != (bool)b->breaks[i] ) { + qDebug("test case \"%s\" failed at char %d; break type: %d", b->utf8, i, attrs[i].lineBreakType); + QCOMPARE( (attrs[i].lineBreakType != HB_NoBreak), (bool)b->breaks[i] ); + } + } + QVERIFY(attrs[i].lineBreakType == HB_ForcedBreak); + QCOMPARE(b->breaks[i], (uchar)0xff); + ++b; + } +} + +void tst_CharAttributes::charWordStopOnLineSeparator() +{ + const QChar lineSeparator(QChar::LineSeparator); + QString txt; + txt.append(lineSeparator); + txt.append(lineSeparator); + QVector attrs = getCharAttributes(txt); + QVERIFY(attrs[1].charStop); +} + +void tst_CharAttributes::charStopForSurrogatePairs() +{ + QString txt; + txt.append("a"); + txt.append(0xd87e); + txt.append(0xdc25); + txt.append("b"); + QVector attrs = getCharAttributes(txt); + QVERIFY(attrs[0].charStop); + QVERIFY(attrs[1].charStop); + QVERIFY(!attrs[2].charStop); + QVERIFY(attrs[3].charStop); +} + +void tst_CharAttributes::thaiWordBreak() +{ + // สวัสดีครับ นี่เป็นà¸à¸²à¸£à¸‡à¸—ดสอบตัวเอ + QTextCodec *codec = QTextCodec::codecForMib(2259); + QString txt = codec->toUnicode(QByteArray("\xca\xc7\xd1\xca\xb4\xd5\xa4\xc3\xd1\xba\x20\xb9\xd5\xe8\xe0\xbb\xe7\xb9\xa1\xd2\xc3\xb7\xb4\xca\xcd\xba\xb5\xd1\xc7\xe0\xcd\xa7")); + + + QCOMPARE(txt.length(), 32); + QVector attrs = getCharAttributes(txt, HB_Script_Thai); + QVERIFY(attrs[0].lineBreakType == HB_NoBreak); + QVERIFY(attrs[1].lineBreakType == HB_NoBreak); + QVERIFY(attrs[2].lineBreakType == HB_NoBreak); + QVERIFY(attrs[3].lineBreakType == HB_NoBreak); + QVERIFY(attrs[4].lineBreakType == HB_NoBreak); + QVERIFY(attrs[5].lineBreakType == HB_Break); + QVERIFY(attrs[6].lineBreakType == HB_NoBreak); + QVERIFY(attrs[7].lineBreakType == HB_NoBreak); + QVERIFY(attrs[8].lineBreakType == HB_NoBreak); + QVERIFY(attrs[9].lineBreakType == HB_NoBreak); + QVERIFY(attrs[10].lineBreakType == HB_Break); + QVERIFY(attrs[11].lineBreakType == HB_NoBreak); + QVERIFY(attrs[12].lineBreakType == HB_NoBreak); + QVERIFY(attrs[13].lineBreakType == HB_Break); + QVERIFY(attrs[14].lineBreakType == HB_NoBreak); + QVERIFY(attrs[15].lineBreakType == HB_NoBreak); + QVERIFY(attrs[16].lineBreakType == HB_NoBreak); + QVERIFY(attrs[17].lineBreakType == HB_Break); + QVERIFY(attrs[18].lineBreakType == HB_NoBreak); + QVERIFY(attrs[19].lineBreakType == HB_NoBreak); + QVERIFY(attrs[20].lineBreakType == HB_Break); + QVERIFY(attrs[21].lineBreakType == HB_NoBreak); + QVERIFY(attrs[22].lineBreakType == HB_NoBreak); + QVERIFY(attrs[23].lineBreakType == HB_NoBreak); + QVERIFY(attrs[24].lineBreakType == HB_NoBreak); + QVERIFY(attrs[25].lineBreakType == HB_Break); + QVERIFY(attrs[26].lineBreakType == HB_NoBreak); + for (int i = 27; i < 32; ++i) + QVERIFY(attrs[i].lineBreakType == HB_NoBreak); +} + +QTEST_MAIN(tst_CharAttributes) +#include "main.moc" diff --git a/src/3rdparty/harfbuzz/tests/shaping/.gitignore b/src/3rdparty/harfbuzz/tests/shaping/.gitignore new file mode 100644 index 0000000000..3f32cbeb9a --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/shaping/.gitignore @@ -0,0 +1,2 @@ +harfbuzz-test-fonts-0.1.tar.bz2 +fonts diff --git a/src/3rdparty/harfbuzz/tests/shaping/Makefile.am b/src/3rdparty/harfbuzz/tests/shaping/Makefile.am new file mode 100644 index 0000000000..31c6db73b4 --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/shaping/Makefile.am @@ -0,0 +1,14 @@ + +check_PROGRAMS = shaping + +shaping_SOURCES = main.cpp ../linebreaking/harfbuzz-qt.cpp +shaping_LDADD = $(QT_GUI_LIBS) $(QT_QTEST_LIBS) ../../src/libharfbuzz-1.la + +main.o: main.moc + +main.moc: $(srcdir)/main.cpp + $(QT_MOC) -o main.moc $(srcdir)/main.cpp + +INCLUDES = -I$(top_srcdir)/src $(FREETYPE_CFLAGS) $(QT_GUI_CFLAGS) $(QT_QTEST_CFLAGS) +AM_CPPFLAGS = -DQT_GUI_LIB -DSRCDIR=\"$(srcdir)\" + diff --git a/src/3rdparty/harfbuzz/tests/shaping/README b/src/3rdparty/harfbuzz/tests/shaping/README new file mode 100644 index 0000000000..1db1c5a708 --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/shaping/README @@ -0,0 +1,9 @@ +These shaper tests need some specific TrueType fonts. You can get a package of +them from + + http://people.freedesktop.org/~hausmann/harfbuzz-test-fonts-0.1.tar.bz2 + +In addition you may need two fonts (Mangal and Tunga) from Microsoft Windows +for some of the test cases. These fonts are not freely redistributable. + +The test program looks for them in a fonts/ subdirectory. diff --git a/src/3rdparty/harfbuzz/tests/shaping/main.cpp b/src/3rdparty/harfbuzz/tests/shaping/main.cpp new file mode 100644 index 0000000000..73760a89f2 --- /dev/null +++ b/src/3rdparty/harfbuzz/tests/shaping/main.cpp @@ -0,0 +1,1320 @@ +/* + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) + * + * This is part of HarfBuzz, an OpenType Layout engine library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#include + +#include +#include FT_FREETYPE_H +#include FT_TRUETYPE_TABLES_H + +#include +#include +#include + +static FT_Library freetype; + +static FT_Face loadFace(const char *name) +{ + FT_Face face; + char path[256]; + + strcpy(path, SRCDIR); + strcat(path, "/fonts/"); + strcat(path, name); + + if (FT_New_Face(freetype, path, /*index*/0, &face)) + return 0; + return face; +} + +static HB_UChar32 getChar(const HB_UChar16 *string, hb_uint32 length, hb_uint32 &i) +{ + HB_UChar32 ch; + if (HB_IsHighSurrogate(string[i]) + && i < length - 1 + && HB_IsLowSurrogate(string[i + 1])) { + ch = HB_SurrogateToUcs4(string[i], string[i + 1]); + ++i; + } else { + ch = string[i]; + } + return ch; +} + +static HB_Bool hb_stringToGlyphs(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool /*rightToLeft*/) +{ + FT_Face face = (FT_Face)font->userData; + if (length > *numGlyphs) + return false; + + int glyph_pos = 0; + for (hb_uint32 i = 0; i < length; ++i) { + glyphs[glyph_pos] = FT_Get_Char_Index(face, getChar(string, length, i)); + ++glyph_pos; + } + + *numGlyphs = glyph_pos; + + return true; +} + +static void hb_getAdvances(HB_Font /*font*/, const HB_Glyph * /*glyphs*/, hb_uint32 numGlyphs, HB_Fixed *advances, int /*flags*/) +{ + for (hb_uint32 i = 0; i < numGlyphs; ++i) + advances[i] = 0; // ### not tested right now +} + +static HB_Bool hb_canRender(HB_Font font, const HB_UChar16 *string, hb_uint32 length) +{ + FT_Face face = (FT_Face)font->userData; + + for (hb_uint32 i = 0; i < length; ++i) + if (!FT_Get_Char_Index(face, getChar(string, length, i))) + return false; + + return true; +} + +static HB_Error hb_getSFntTable(void *font, HB_Tag tableTag, HB_Byte *buffer, HB_UInt *length) +{ + FT_Face face = (FT_Face)font; + FT_ULong ftlen = *length; + FT_Error error = 0; + + if (!FT_IS_SFNT(face)) + return HB_Err_Invalid_Argument; + + error = FT_Load_Sfnt_Table(face, tableTag, 0, buffer, &ftlen); + *length = ftlen; + return (HB_Error)error; +} + +HB_Error hb_getPointInOutline(HB_Font font, HB_Glyph glyph, int flags, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints) +{ + HB_Error error = HB_Err_Ok; + FT_Face face = (FT_Face)font->userData; + + int load_flags = (flags & HB_ShaperFlag_UseDesignMetrics) ? FT_LOAD_NO_HINTING : FT_LOAD_DEFAULT; + + if ((error = (HB_Error)FT_Load_Glyph(face, glyph, load_flags))) + return error; + + if (face->glyph->format != ft_glyph_format_outline) + return (HB_Error)HB_Err_Invalid_SubTable; + + *nPoints = face->glyph->outline.n_points; + if (!(*nPoints)) + return HB_Err_Ok; + + if (point > *nPoints) + return (HB_Error)HB_Err_Invalid_SubTable; + + *xpos = face->glyph->outline.points[point].x; + *ypos = face->glyph->outline.points[point].y; + + return HB_Err_Ok; +} + +void hb_getGlyphMetrics(HB_Font, HB_Glyph, HB_GlyphMetrics *metrics) +{ + // ### + metrics->x = metrics->y = metrics->width = metrics->height = metrics->xOffset = metrics->yOffset = 0; +} + +HB_Fixed hb_getFontMetric(HB_Font, HB_FontMetric ) +{ + return 0; // #### +} + +const HB_FontClass hb_fontClass = { + hb_stringToGlyphs, hb_getAdvances, hb_canRender, + hb_getPointInOutline, hb_getGlyphMetrics, hb_getFontMetric +}; + + +//TESTED_CLASS= +//TESTED_FILES= gui/text/qscriptengine.cpp + +class tst_QScriptEngine : public QObject +{ +Q_OBJECT + +public: + tst_QScriptEngine(); + virtual ~tst_QScriptEngine(); + + +public slots: + void initTestCase(); + void cleanupTestCase(); +private slots: + void greek(); + + void devanagari(); + void bengali(); + void gurmukhi(); + // gujarati missing + void oriya(); + void tamil(); + void telugu(); + void kannada(); + void malayalam(); + void sinhala(); + + void khmer(); + void nko(); + void linearB(); +}; + +tst_QScriptEngine::tst_QScriptEngine() +{ +} + +tst_QScriptEngine::~tst_QScriptEngine() +{ +} + +void tst_QScriptEngine::initTestCase() +{ + FT_Init_FreeType(&freetype); +} + +void tst_QScriptEngine::cleanupTestCase() +{ + FT_Done_FreeType(freetype); +} + +class Shaper +{ +public: + Shaper(FT_Face face, HB_Script script, const QString &str); + + HB_FontRec hbFont; + HB_ShaperItem shaper_item; + QVarLengthArray hb_glyphs; + QVarLengthArray hb_attributes; + QVarLengthArray hb_advances; + QVarLengthArray hb_offsets; + QVarLengthArray hb_logClusters; + +}; + +Shaper::Shaper(FT_Face face, HB_Script script, const QString &str) +{ + HB_Face hbFace = HB_NewFace(face, hb_getSFntTable); + + hbFont.klass = &hb_fontClass; + hbFont.userData = face; + hbFont.x_ppem = face->size->metrics.x_ppem; + hbFont.y_ppem = face->size->metrics.y_ppem; + hbFont.x_scale = face->size->metrics.x_scale; + hbFont.y_scale = face->size->metrics.y_scale; + + shaper_item.kerning_applied = false; + shaper_item.string = reinterpret_cast(str.constData()); + shaper_item.stringLength = str.length(); + shaper_item.item.script = script; + shaper_item.item.pos = 0; + shaper_item.item.length = shaper_item.stringLength; + shaper_item.item.bidiLevel = 0; // ### + shaper_item.shaperFlags = 0; + shaper_item.font = &hbFont; + shaper_item.face = hbFace; + shaper_item.num_glyphs = shaper_item.item.length; + shaper_item.glyphIndicesPresent = false; + shaper_item.initialGlyphCount = 0; + + + while (1) { + hb_glyphs.resize(shaper_item.num_glyphs); + hb_attributes.resize(shaper_item.num_glyphs); + hb_advances.resize(shaper_item.num_glyphs); + hb_offsets.resize(shaper_item.num_glyphs); + hb_logClusters.resize(shaper_item.num_glyphs); + + memset(hb_glyphs.data(), 0, hb_glyphs.size() * sizeof(HB_Glyph)); + memset(hb_attributes.data(), 0, hb_attributes.size() * sizeof(HB_GlyphAttributes)); + memset(hb_advances.data(), 0, hb_advances.size() * sizeof(HB_Fixed)); + memset(hb_offsets.data(), 0, hb_offsets.size() * sizeof(HB_FixedPoint)); + + shaper_item.glyphs = hb_glyphs.data(); + shaper_item.attributes = hb_attributes.data(); + shaper_item.advances = hb_advances.data(); + shaper_item.offsets = hb_offsets.data(); + shaper_item.log_clusters = hb_logClusters.data(); + + if (HB_ShapeItem(&shaper_item)) + break; + } + + HB_FreeFace(hbFace); +} + + +static bool decomposedShaping(FT_Face face, HB_Script script, const QChar &ch) +{ + QString uc = QString().append(ch); + Shaper shaper(face, script, uc); + + uc = uc.normalized(QString::NormalizationForm_D); + Shaper decomposed(face, script, uc); + + if( shaper.shaper_item.num_glyphs != decomposed.shaper_item.num_glyphs ) + goto error; + + for (unsigned int i = 0; i < shaper.shaper_item.num_glyphs; ++i) { + if ((shaper.shaper_item.glyphs[i]&0xffffff) != (decomposed.shaper_item.glyphs[i]&0xffffff)) + goto error; + } + return true; + error: + QString str = ""; + int i = 0; + while (i < uc.length()) { + str += QString("%1 ").arg(uc[i].unicode(), 4, 16); + ++i; + } + qDebug("%s: decomposedShaping of char %4x failed\n decomposedString: %s\n nglyphs=%d, decomposed nglyphs %d", + face->family_name, + ch.unicode(), str.toLatin1().data(), + shaper.shaper_item.num_glyphs, + decomposed.shaper_item.num_glyphs); + + str = ""; + i = 0; + while (i < shaper.shaper_item.num_glyphs) { + str += QString("%1 ").arg(shaper.shaper_item.glyphs[i], 4, 16); + ++i; + } + qDebug(" composed glyph result = %s", str.toLatin1().constData()); + str = ""; + i = 0; + while (i < decomposed.shaper_item.num_glyphs) { + str += QString("%1 ").arg(decomposed.shaper_item.glyphs[i], 4, 16); + ++i; + } + qDebug(" decomposed glyph result = %s", str.toLatin1().constData()); + return false; +} + +struct ShapeTable { + unsigned short unicode[16]; + unsigned short glyphs[16]; +}; + +static bool shaping(FT_Face face, const ShapeTable *s, HB_Script script) +{ + Shaper shaper(face, script, QString::fromUtf16( s->unicode )); + + hb_uint32 nglyphs = 0; + const unsigned short *g = s->glyphs; + while ( *g ) { + nglyphs++; + g++; + } + + if( nglyphs != shaper.shaper_item.num_glyphs ) + goto error; + + for (hb_uint32 i = 0; i < nglyphs; ++i) { + if ((shaper.shaper_item.glyphs[i]&0xffffff) != s->glyphs[i]) + goto error; + } + return true; + error: + QString str = ""; + const unsigned short *uc = s->unicode; + while (*uc) { + str += QString("%1 ").arg(*uc, 4, 16); + ++uc; + } + qDebug("%s: shaping of string %s failed, nglyphs=%d, expected %d", + face->family_name, + str.toLatin1().constData(), + shaper.shaper_item.num_glyphs, nglyphs); + + str = ""; + hb_uint32 i = 0; + while (i < shaper.shaper_item.num_glyphs) { + str += QString("%1 ").arg(shaper.shaper_item.glyphs[i], 4, 16); + ++i; + } + qDebug(" glyph result = %s", str.toLatin1().constData()); + return false; +} + + +void tst_QScriptEngine::greek() +{ + FT_Face face = loadFace("DejaVuSans.ttf"); + if (face) { + for (int uc = 0x1f00; uc <= 0x1fff; ++uc) { + QString str; + str.append(uc); + if (str.normalized(QString::NormalizationForm_D).normalized(QString::NormalizationForm_C) != str) { + //qDebug() << "skipping" << hex << uc; + continue; + } + if (uc == 0x1fc1 || uc == 0x1fed) + continue; + QVERIFY( decomposedShaping(face, HB_Script_Greek, QChar(uc)) ); + } + FT_Done_Face(face); + } else { + QSKIP("couln't find DejaVu Sans", SkipAll); + } + + + face = loadFace("SBL_grk.ttf"); + if (face) { + for (int uc = 0x1f00; uc <= 0x1fff; ++uc) { + QString str; + str.append(uc); + if (str.normalized(QString::NormalizationForm_D).normalized(QString::NormalizationForm_C) != str) { + //qDebug() << "skipping" << hex << uc; + continue; + } + if (uc == 0x1fc1 || uc == 0x1fed) + continue; + QVERIFY( decomposedShaping(face, HB_Script_Greek, QChar(uc)) ); + + } + + const ShapeTable shape_table [] = { + { { 0x3b1, 0x300, 0x313, 0x0 }, + { 0xb8, 0x3d3, 0x3c7, 0x0 } }, + { { 0x3b1, 0x313, 0x300, 0x0 }, + { 0xd4, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Greek) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find DejaVu Sans", SkipAll); + } +} + + +void tst_QScriptEngine::devanagari() +{ + { + FT_Face face = loadFace("raghu.ttf"); + if (face) { + const ShapeTable shape_table [] = { + // Ka + { { 0x0915, 0x0 }, + { 0x0080, 0x0 } }, + // Ka Halant + { { 0x0915, 0x094d, 0x0 }, + { 0x0080, 0x0051, 0x0 } }, + // Ka Halant Ka + { { 0x0915, 0x094d, 0x0915, 0x0 }, + { 0x00c8, 0x0080, 0x0 } }, + // Ka MatraI + { { 0x0915, 0x093f, 0x0 }, + { 0x01d1, 0x0080, 0x0 } }, + // Ra Halant Ka + { { 0x0930, 0x094d, 0x0915, 0x0 }, + { 0x0080, 0x005b, 0x0 } }, + // Ra Halant Ka MatraI + { { 0x0930, 0x094d, 0x0915, 0x093f, 0x0 }, + { 0x01d1, 0x0080, 0x005b, 0x0 } }, + // MatraI + { { 0x093f, 0x0 }, + { 0x01d4, 0x029c, 0x0 } }, + // Ka Nukta + { { 0x0915, 0x093c, 0x0 }, + { 0x00a4, 0x0 } }, + // Ka Halant Ra + { { 0x0915, 0x094d, 0x0930, 0x0 }, + { 0x0110, 0x0 } }, + // Ka Halant Ra Halant Ka + { { 0x0915, 0x094d, 0x0930, 0x094d, 0x0915, 0x0 }, + { 0x0158, 0x0080, 0x0 } }, + { { 0x0930, 0x094d, 0x200d, 0x0 }, + { 0x00e2, 0x0 } }, + { { 0x0915, 0x094d, 0x0930, 0x094d, 0x200d, 0x0 }, + { 0x0158, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Devanagari) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find raghu.ttf", SkipAll); + } + } + + { + FT_Face face = loadFace("mangal.ttf"); + if (face) { + const ShapeTable shape_table [] = { + // Ka + { { 0x0915, 0x0 }, + { 0x0080, 0x0 } }, + // Ka Halant + { { 0x0915, 0x094d, 0x0 }, + { 0x0080, 0x0051, 0x0 } }, + // Ka Halant Ka + { { 0x0915, 0x094d, 0x0915, 0x0 }, + { 0x00c8, 0x0080, 0x0 } }, + // Ka MatraI + { { 0x0915, 0x093f, 0x0 }, + { 0x01d1, 0x0080, 0x0 } }, + // Ra Halant Ka + { { 0x0930, 0x094d, 0x0915, 0x0 }, + { 0x0080, 0x005b, 0x0 } }, + // Ra Halant Ka MatraI + { { 0x0930, 0x094d, 0x0915, 0x093f, 0x0 }, + { 0x01d1, 0x0080, 0x005b, 0x0 } }, + // MatraI + { { 0x093f, 0x0 }, + { 0x01d4, 0x029c, 0x0 } }, + // Ka Nukta + { { 0x0915, 0x093c, 0x0 }, + { 0x00a4, 0x0 } }, + // Ka Halant Ra + { { 0x0915, 0x094d, 0x0930, 0x0 }, + { 0x0110, 0x0 } }, + // Ka Halant Ra Halant Ka + { { 0x0915, 0x094d, 0x0930, 0x094d, 0x0915, 0x0 }, + { 0x0158, 0x0080, 0x0 } }, + + { { 0x92b, 0x94d, 0x930, 0x0 }, + { 0x125, 0x0 } }, + { { 0x92b, 0x93c, 0x94d, 0x930, 0x0 }, + { 0x149, 0x0 } }, + { {0}, {0} } + }; + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Devanagari) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couldn't find mangal.ttf", SkipAll); + } + } +} + +void tst_QScriptEngine::bengali() +{ + { + FT_Face face = loadFace("AkaashNormal.ttf"); + if (face) { + const ShapeTable shape_table [] = { + // Ka + { { 0x0995, 0x0 }, + { 0x0151, 0x0 } }, + // Ka Halant + { { 0x0995, 0x09cd, 0x0 }, + { 0x0151, 0x017d, 0x0 } }, + // Ka Halant Ka + { { 0x0995, 0x09cd, 0x0995, 0x0 }, + { 0x019b, 0x0 } }, + // Ka MatraI + { { 0x0995, 0x09bf, 0x0 }, + { 0x0173, 0x0151, 0x0 } }, + // Ra Halant Ka + { { 0x09b0, 0x09cd, 0x0995, 0x0 }, + { 0x0151, 0x0276, 0x0 } }, + // Ra Halant Ka MatraI + { { 0x09b0, 0x09cd, 0x0995, 0x09bf, 0x0 }, + { 0x0173, 0x0151, 0x0276, 0x0 } }, + // Ka Nukta + { { 0x0995, 0x09bc, 0x0 }, + { 0x0151, 0x0171, 0x0 } }, + // Ka Halant Ra + { { 0x0995, 0x09cd, 0x09b0, 0x0 }, + { 0x01f4, 0x0 } }, + // Ka Halant Ra Halant Ka + { { 0x0995, 0x09cd, 0x09b0, 0x09cd, 0x0995, 0x0 }, + { 0x025c, 0x0276, 0x0151, 0x0 } }, + // Ya + Halant + { { 0x09af, 0x09cd, 0x0 }, + { 0x016a, 0x017d, 0x0 } }, + // Da Halant Ya -> Da Ya-Phala + { { 0x09a6, 0x09cd, 0x09af, 0x0 }, + { 0x01e5, 0x0 } }, + // A Halant Ya -> A Ya-phala + { { 0x0985, 0x09cd, 0x09af, 0x0 }, + { 0x0145, 0x01cf, 0x0 } }, + // Na Halant Ka + { { 0x09a8, 0x09cd, 0x0995, 0x0 }, + { 0x026f, 0x0151, 0x0 } }, + // Na Halant ZWNJ Ka + { { 0x09a8, 0x09cd, 0x200c, 0x0995, 0x0 }, + { 0x0164, 0x017d, 0x0151, 0x0 } }, + // Na Halant ZWJ Ka + { { 0x09a8, 0x09cd, 0x200d, 0x0995, 0x0 }, + { 0x026f, 0x0151, 0x0 } }, + // Ka Halant ZWNJ Ka + { { 0x0995, 0x09cd, 0x200c, 0x0995, 0x0 }, + { 0x0151, 0x017d, 0x0151, 0x0 } }, + // Ka Halant ZWJ Ka + { { 0x0995, 0x09cd, 0x200d, 0x0995, 0x0 }, + { 0x025c, 0x0151, 0x0 } }, + // Na Halant Ra + { { 0x09a8, 0x09cd, 0x09b0, 0x0 }, + { 0x0207, 0x0 } }, + // Na Halant ZWNJ Ra + { { 0x09a8, 0x09cd, 0x200c, 0x09b0, 0x0 }, + { 0x0164, 0x017d, 0x016b, 0x0 } }, + // Na Halant ZWJ Ra + { { 0x09a8, 0x09cd, 0x200d, 0x09b0, 0x0 }, + { 0x026f, 0x016b, 0x0 } }, + // Na Halant Ba + { { 0x09a8, 0x09cd, 0x09ac, 0x0 }, + { 0x022f, 0x0 } }, + // Na Halant ZWNJ Ba + { { 0x09a8, 0x09cd, 0x200c, 0x09ac, 0x0 }, + { 0x0164, 0x017d, 0x0167, 0x0 } }, + // Na Halant ZWJ Ba + { { 0x09a8, 0x09cd, 0x200d, 0x09ac, 0x0 }, + { 0x026f, 0x0167, 0x0 } }, + // Na Halant Dha + { { 0x09a8, 0x09cd, 0x09a7, 0x0 }, + { 0x01d3, 0x0 } }, + // Na Halant ZWNJ Dha + { { 0x09a8, 0x09cd, 0x200c, 0x09a7, 0x0 }, + { 0x0164, 0x017d, 0x0163, 0x0 } }, + // Na Halant ZWJ Dha + { { 0x09a8, 0x09cd, 0x200d, 0x09a7, 0x0 }, + { 0x026f, 0x0163, 0x0 } }, + // Ra Halant Ka MatraAU + { { 0x09b0, 0x09cd, 0x0995, 0x09cc, 0x0 }, + { 0x0179, 0x0151, 0x0276, 0x017e, 0x0 } }, + // Ra Halant Ba Halant Ba + { { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0x0 }, + { 0x0232, 0x0276, 0x0 } }, + { { 0x9b0, 0x9cd, 0x995, 0x9be, 0x982, 0x0 }, + { 0x151, 0x276, 0x172, 0x143, 0x0 } }, + { { 0x9b0, 0x9cd, 0x995, 0x9be, 0x983, 0x0 }, + { 0x151, 0x276, 0x172, 0x144, 0x0 } }, + // test decomposed two parts matras + { { 0x995, 0x9c7, 0x9be, 0x0 }, + { 0x179, 0x151, 0x172, 0x0 } }, + { { 0x995, 0x9c7, 0x9d7, 0x0 }, + { 0x179, 0x151, 0x17e, 0x0 } }, + { { 0x9b0, 0x9cd, 0x9ad, 0x0 }, + { 0x168, 0x276, 0x0 } }, + { { 0x9f0, 0x9cd, 0x9ad, 0x0 }, + { 0x168, 0x276, 0x0 } }, + { { 0x9f1, 0x9cd, 0x9ad, 0x0 }, + { 0x191, 0x17d, 0x168, 0x0 } }, + + // Ra ZWJ Halant Ya + { { 0x09b0, 0x200d, 0x09cd, 0x09af, 0x0 }, + { 0x016b, 0x01cf, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Bengali) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find AkaashNormal.ttf", SkipAll); + } + } + { + FT_Face face = loadFace("MuktiNarrow.ttf"); + if (face) { + const ShapeTable shape_table [] = { + // Ka + { { 0x0995, 0x0 }, + { 0x0073, 0x0 } }, + // Ka Halant + { { 0x0995, 0x09cd, 0x0 }, + { 0x00b9, 0x0 } }, + // Ka Halant Ka + { { 0x0995, 0x09cd, 0x0995, 0x0 }, + { 0x0109, 0x0 } }, + // Ka MatraI + { { 0x0995, 0x09bf, 0x0 }, + { 0x0095, 0x0073, 0x0 } }, + // Ra Halant Ka + { { 0x09b0, 0x09cd, 0x0995, 0x0 }, + { 0x0073, 0x00e1, 0x0 } }, + // Ra Halant Ka MatraI + { { 0x09b0, 0x09cd, 0x0995, 0x09bf, 0x0 }, + { 0x0095, 0x0073, 0x00e1, 0x0 } }, + // MatraI + { { 0x09bf, 0x0 }, + { 0x0095, 0x01c8, 0x0 } }, + // Ka Nukta + { { 0x0995, 0x09bc, 0x0 }, + { 0x0073, 0x0093, 0x0 } }, + // Ka Halant Ra + { { 0x0995, 0x09cd, 0x09b0, 0x0 }, + { 0x00e5, 0x0 } }, + // Ka Halant Ra Halant Ka + { { 0x995, 0x9cd, 0x9b0, 0x9cd, 0x995, 0x0 }, + { 0x234, 0x24e, 0x73, 0x0 } }, + // Ya + Halant + { { 0x09af, 0x09cd, 0x0 }, + { 0x00d2, 0x0 } }, + // Da Halant Ya -> Da Ya-Phala + { { 0x09a6, 0x09cd, 0x09af, 0x0 }, + { 0x0084, 0x00e2, 0x0 } }, + // A Halant Ya -> A Ya-phala + { { 0x0985, 0x09cd, 0x09af, 0x0 }, + { 0x0067, 0x00e2, 0x0 } }, + // Na Halant Ka + { { 0x09a8, 0x09cd, 0x0995, 0x0 }, + { 0x0188, 0x0 } }, + // Na Halant ZWNJ Ka + { { 0x9a8, 0x9cd, 0x200c, 0x995, 0x0 }, + { 0xcc, 0x73, 0x0 } }, + // Na Halant ZWJ Ka + { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 }, + { 0x247, 0x73, 0x0 } }, + // Ka Halant ZWNJ Ka + { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 }, + { 0x247, 0x73, 0x0 } }, + // Ka Halant ZWJ Ka + { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 }, + { 0x247, 0x73, 0x0 } }, + // Na Halant Ra + { { 0x09a8, 0x09cd, 0x09b0, 0x0 }, + { 0x00f8, 0x0 } }, + // Na Halant ZWNJ Ra + { { 0x09a8, 0x09cd, 0x200c, 0x09b0, 0x0 }, + { 0xcc, 0x8d, 0x0 } }, + // Na Halant ZWJ Ra + { { 0x9a8, 0x9cd, 0x200d, 0x9b0, 0x0 }, + { 0x247, 0x8d, 0x0 } }, + // Na Halant Ba + { { 0x09a8, 0x09cd, 0x09ac, 0x0 }, + { 0x0139, 0x0 } }, + // Na Halant ZWNJ Ba + { { 0x9a8, 0x9cd, 0x200c, 0x9ac, 0x0 }, + { 0xcc, 0x89, 0x0 } }, + // Na Halant ZWJ Ba + { { 0x9a8, 0x9cd, 0x200d, 0x9ac, 0x0 }, + { 0x247, 0x89, 0x0 } }, + // Na Halant Dha + { { 0x09a8, 0x09cd, 0x09a7, 0x0 }, + { 0x0145, 0x0 } }, + // Na Halant ZWNJ Dha + { { 0x09a8, 0x09cd, 0x200c, 0x09a7, 0x0 }, + { 0xcc, 0x85, 0x0 } }, + // Na Halant ZWJ Dha + { { 0x09a8, 0x09cd, 0x200d, 0x09a7, 0x0 }, + { 0x247, 0x85, 0x0 } }, + // Ra Halant Ka MatraAU + { { 0x9b0, 0x9cd, 0x995, 0x9cc, 0x0 }, + { 0x232, 0x73, 0xe1, 0xa0, 0x0 } }, + // Ra Halant Ba Halant Ba + { { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0x0 }, + { 0x013b, 0x00e1, 0x0 } }, + + // Init feature for vowel sign E should only be + // applied when it's initial character (QTBUG-13620) + { { 0x09a8, 0x09c7, 0x0 }, + { 0x0232, 0x0086, 0x0 } }, + { { 0x09a8, 0x09a8, 0x09c7, 0x0 }, + { 0x0086, 0x009b, 0x0086, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Bengali) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find MuktiNarrow.ttf", SkipAll); + } + } + { + FT_Face face = loadFace("LikhanNormal.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0x09a8, 0x09cd, 0x09af, 0x0 }, + { 0x01ca, 0x0 } }, + { { 0x09b8, 0x09cd, 0x09af, 0x0 }, + { 0x020e, 0x0 } }, + { { 0x09b6, 0x09cd, 0x09af, 0x0 }, + { 0x01f4, 0x0 } }, + { { 0x09b7, 0x09cd, 0x09af, 0x0 }, + { 0x01fe, 0x0 } }, + { { 0x09b0, 0x09cd, 0x09a8, 0x09cd, 0x200d, 0x0 }, + { 0x10b, 0x167, 0x0 } }, + { { 0x9b0, 0x9cd, 0x9ad, 0x0 }, + { 0xa1, 0x167, 0x0 } }, + { { 0x9f0, 0x9cd, 0x9ad, 0x0 }, + { 0xa1, 0x167, 0x0 } }, + { { 0x9f1, 0x9cd, 0x9ad, 0x0 }, + { 0x11c, 0xa1, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Bengali) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find LikhanNormal.ttf", SkipAll); + } + } +} + +void tst_QScriptEngine::gurmukhi() +{ + { + FT_Face face = loadFace("lohit_pa.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0xA15, 0xA4D, 0xa39, 0x0 }, + { 0x3b, 0x8b, 0x0 } }, + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Gurmukhi) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find lohit.punjabi.1.1.ttf", SkipAll); + } + } +} + +void tst_QScriptEngine::oriya() +{ + { + FT_Face face = loadFace("utkalm.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0xb15, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 }, + { 0x150, 0x125, 0x0 } }, + { { 0xb24, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 }, + { 0x151, 0x120, 0x0 } }, + { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 }, + { 0x152, 0x120, 0x0 } }, + { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 }, + { 0x152, 0x120, 0x0 } }, + { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 }, + { 0x176, 0x0 } }, + { { 0xb38, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 }, + { 0x177, 0x0 } }, + { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0xb4d, 0xb2f, 0x0 }, + { 0x176, 0x124, 0x0 } }, + + // QTBUG-13542 + { { 0x0b2c, 0x0b4d, 0x0b21, 0x0 }, + { 0x0089, 0x00fc, 0x0 } }, + { { 0x0b36, 0x0b4d, 0x0b2b, 0x0 }, + { 0x0092, 0x0105, 0x0 } }, + { { 0x0b36, 0x0b4d, 0x0b1f, 0x0 }, + { 0x0092, 0x00fa, 0x0 } }, + { { 0x0b39, 0x0b4d, 0x0b1f, 0x0 }, + { 0x0095, 0x00fa, 0x0 } }, + { { 0x0b15, 0x0b4d, 0x0b16, 0x0 }, + { 0x0073, 0x00f1, 0x0 } }, + + { {0}, {0} } + + }; + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Oriya) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find utkalm.ttf", SkipAll); + } + } +} + + +void tst_QScriptEngine::tamil() +{ + { + FT_Face face = loadFace("akruti1.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0x0b95, 0x0bc2, 0x0 }, + { 0x004e, 0x0 } }, + { { 0x0bae, 0x0bc2, 0x0 }, + { 0x009e, 0x0 } }, + { { 0x0b9a, 0x0bc2, 0x0 }, + { 0x0058, 0x0 } }, + { { 0x0b99, 0x0bc2, 0x0 }, + { 0x0053, 0x0 } }, + { { 0x0bb0, 0x0bc2, 0x0 }, + { 0x00a8, 0x0 } }, + { { 0x0ba4, 0x0bc2, 0x0 }, + { 0x008e, 0x0 } }, + { { 0x0b9f, 0x0bc2, 0x0 }, + { 0x0062, 0x0 } }, + { { 0x0b95, 0x0bc6, 0x0 }, + { 0x000a, 0x0031, 0x0 } }, + { { 0x0b95, 0x0bca, 0x0 }, + { 0x000a, 0x0031, 0x0007, 0x0 } }, + { { 0x0b95, 0x0bc6, 0x0bbe, 0x0 }, + { 0x000a, 0x0031, 0x007, 0x0 } }, + { { 0x0b95, 0x0bcd, 0x0bb7, 0x0 }, + { 0x0049, 0x0 } }, + { { 0x0b95, 0x0bcd, 0x0bb7, 0x0bca, 0x0 }, + { 0x000a, 0x0049, 0x007, 0x0 } }, + { { 0x0b95, 0x0bcd, 0x0bb7, 0x0bc6, 0x0bbe, 0x0 }, + { 0x000a, 0x0049, 0x007, 0x0 } }, + { { 0x0b9f, 0x0bbf, 0x0 }, + { 0x005f, 0x0 } }, + { { 0x0b9f, 0x0bc0, 0x0 }, + { 0x0060, 0x0 } }, + { { 0x0bb2, 0x0bc0, 0x0 }, + { 0x00ab, 0x0 } }, + { { 0x0bb2, 0x0bbf, 0x0 }, + { 0x00aa, 0x0 } }, + { { 0x0bb0, 0x0bcd, 0x0 }, + { 0x00a4, 0x0 } }, + { { 0x0bb0, 0x0bbf, 0x0 }, + { 0x00a5, 0x0 } }, + { { 0x0bb0, 0x0bc0, 0x0 }, + { 0x00a6, 0x0 } }, + { { 0x0b83, 0x0 }, + { 0x0025, 0x0 } }, + { { 0x0b83, 0x0b95, 0x0 }, + { 0x0025, 0x0031, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Tamil) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find akruti1.ttf", SkipAll); + } + } +} + + +void tst_QScriptEngine::telugu() +{ + { + FT_Face face = loadFace("Pothana2000.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0xc15, 0xc4d, 0x0 }, + { 0xbb, 0x0 } }, + { { 0xc15, 0xc4d, 0xc37, 0x0 }, + { 0x4b, 0x0 } }, + { { 0xc15, 0xc4d, 0xc37, 0xc4d, 0x0 }, + { 0xe0, 0x0 } }, + { { 0xc15, 0xc4d, 0xc37, 0xc4d, 0xc23, 0x0 }, + { 0x4b, 0x91, 0x0 } }, + { { 0xc15, 0xc4d, 0xc30, 0x0 }, + { 0x5a, 0xb2, 0x0 } }, + { { 0xc15, 0xc4d, 0xc30, 0xc4d, 0x0 }, + { 0xbb, 0xb2, 0x0 } }, + { { 0xc15, 0xc4d, 0xc30, 0xc4d, 0xc15, 0x0 }, + { 0x5a, 0xb2, 0x83, 0x0 } }, + { { 0xc15, 0xc4d, 0xc30, 0xc3f, 0x0 }, + { 0xe2, 0xb2, 0x0 } }, + { { 0xc15, 0xc4d, 0xc15, 0xc48, 0x0 }, + { 0xe6, 0xb3, 0x83, 0x0 } }, + { { 0xc15, 0xc4d, 0xc30, 0xc48, 0x0 }, + { 0xe6, 0xb3, 0x9f, 0x0 } }, + { { 0xc15, 0xc46, 0xc56, 0x0 }, + { 0xe6, 0xb3, 0x0 } }, + { {0}, {0} } + }; + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Telugu) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find Pothana2000.ttf", SkipAll); + } + } +} + + +void tst_QScriptEngine::kannada() +{ + { + FT_Face face = loadFace("Sampige.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0x0ca8, 0x0ccd, 0x0ca8, 0x0 }, + { 0x0049, 0x00ba, 0x0 } }, + { { 0x0ca8, 0x0ccd, 0x0ca1, 0x0 }, + { 0x0049, 0x00b3, 0x0 } }, + { { 0x0caf, 0x0cc2, 0x0 }, + { 0x004f, 0x005d, 0x0 } }, + { { 0x0ce0, 0x0 }, + { 0x006a, 0x0 } }, + { { 0x0ce6, 0x0ce7, 0x0ce8, 0x0 }, + { 0x006b, 0x006c, 0x006d, 0x0 } }, + { { 0x0cb5, 0x0ccb, 0x0 }, + { 0x015f, 0x0067, 0x0 } }, + { { 0x0cb0, 0x0ccd, 0x0cae, 0x0 }, + { 0x004e, 0x0082, 0x0 } }, + { { 0x0cb0, 0x0ccd, 0x0c95, 0x0 }, + { 0x0036, 0x0082, 0x0 } }, + { { 0x0c95, 0x0ccd, 0x0cb0, 0x0 }, + { 0x0036, 0x00c1, 0x0 } }, + { { 0x0cb0, 0x0ccd, 0x200d, 0x0c95, 0x0 }, + { 0x0050, 0x00a7, 0x0 } }, + + // Kaphala + { { 0x0cb0, 0x200d, 0x0ccd, 0x0c95, 0x0 }, + { 0x0050, 0x00a7, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Kannada) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find Sampige.ttf", SkipAll); + } + } + { + FT_Face face = loadFace("tunga.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0x0cb7, 0x0cc6, 0x0 }, + { 0x00b0, 0x006c, 0x0 } }, + { { 0x0cb7, 0x0ccd, 0x0 }, + { 0x0163, 0x0 } }, + { { 0xc95, 0xcbf, 0xcd5, 0x0 }, + { 0x114, 0x73, 0x0 } }, + { { 0xc95, 0xcc6, 0xcd5, 0x0 }, + { 0x90, 0x6c, 0x73, 0x0 } }, + { { 0xc95, 0xcc6, 0xcd6, 0x0 }, + { 0x90, 0x6c, 0x74, 0x0 } }, + { { 0xc95, 0xcc6, 0xcc2, 0x0 }, + { 0x90, 0x6c, 0x69, 0x0 } }, + { { 0xc95, 0xcca, 0xcd5, 0x0 }, + { 0x90, 0x6c, 0x69, 0x73, 0x0 } }, + + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Kannada) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find tunga.ttf", SkipAll); + } + } +} + + + +void tst_QScriptEngine::malayalam() +{ + { + FT_Face face = loadFace("AkrutiMal2Normal.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0x0d15, 0x0d46, 0x0 }, + { 0x005e, 0x0034, 0x0 } }, + { { 0x0d15, 0x0d47, 0x0 }, + { 0x005f, 0x0034, 0x0 } }, + { { 0x0d15, 0x0d4b, 0x0 }, + { 0x005f, 0x0034, 0x0058, 0x0 } }, + { { 0x0d15, 0x0d48, 0x0 }, + { 0x0060, 0x0034, 0x0 } }, + { { 0x0d15, 0x0d4a, 0x0 }, + { 0x005e, 0x0034, 0x0058, 0x0 } }, + { { 0x0d30, 0x0d4d, 0x0d15, 0x0 }, + { 0x009e, 0x0034, 0x0 } }, + { { 0x0d15, 0x0d4d, 0x0d35, 0x0 }, + { 0x0034, 0x007a, 0x0 } }, + { { 0x0d15, 0x0d4d, 0x0d2f, 0x0 }, + { 0x0034, 0x00a2, 0x0 } }, + { { 0x0d1f, 0x0d4d, 0x0d1f, 0x0 }, + { 0x0069, 0x0 } }, + { { 0x0d26, 0x0d4d, 0x0d26, 0x0 }, + { 0x0074, 0x0 } }, + { { 0x0d30, 0x0d4d, 0x0 }, + { 0x009e, 0x0 } }, + { { 0x0d30, 0x0d4d, 0x200c, 0x0 }, + { 0x009e, 0x0 } }, + { { 0x0d30, 0x0d4d, 0x200d, 0x0 }, + { 0x009e, 0x0 } }, + { { 0xd15, 0xd46, 0xd3e, 0x0 }, + { 0x5e, 0x34, 0x58, 0x0 } }, + { { 0xd15, 0xd47, 0xd3e, 0x0 }, + { 0x5f, 0x34, 0x58, 0x0 } }, + { { 0xd15, 0xd46, 0xd57, 0x0 }, + { 0x5e, 0x34, 0x65, 0x0 } }, + { { 0xd15, 0xd57, 0x0 }, + { 0x34, 0x65, 0x0 } }, + { { 0xd1f, 0xd4d, 0xd1f, 0xd41, 0xd4d, 0x0 }, + { 0x69, 0x5b, 0x64, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Malayalam) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find AkrutiMal2Normal.ttf", SkipAll); + } + } + + { + FT_Face face = loadFace("Rachana.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0xd37, 0xd4d, 0xd1f, 0xd4d, 0xd30, 0xd40, 0x0 }, + { 0x385, 0xa3, 0x0 } }, + { { 0xd2f, 0xd4d, 0xd15, 0xd4d, 0xd15, 0xd41, 0x0 }, + { 0x2ff, 0x0 } }, + { { 0xd33, 0xd4d, 0xd33, 0x0 }, + { 0x3f8, 0x0 } }, + { { 0xd2f, 0xd4d, 0xd15, 0xd4d, 0xd15, 0xd41, 0x0 }, + { 0x2ff, 0x0 } }, + { { 0xd30, 0xd4d, 0x200d, 0xd35, 0xd4d, 0xd35, 0x0 }, + { 0xf3, 0x350, 0x0 } }, + + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Malayalam) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find Rachana.ttf", SkipAll); + } + } + +} + +void tst_QScriptEngine::sinhala() +{ + { + FT_Face face = loadFace("FM-MalithiUW46.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0xd9a, 0xdd9, 0xdcf, 0x0 }, + { 0x4a, 0x61, 0x42, 0x0 } }, + { { 0xd9a, 0xdd9, 0xddf, 0x0 }, + { 0x4a, 0x61, 0x50, 0x0 } }, + { { 0xd9a, 0xdd9, 0xdca, 0x0 }, + { 0x4a, 0x62, 0x0 } }, + { { 0xd9a, 0xddc, 0xdca, 0x0 }, + { 0x4a, 0x61, 0x42, 0x41, 0x0 } }, + { { 0xd9a, 0xdda, 0x0 }, + { 0x4a, 0x62, 0x0 } }, + { { 0xd9a, 0xddd, 0x0 }, + { 0x4a, 0x61, 0x42, 0x41, 0x0 } }, + { {0}, {0} } + }; + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Sinhala) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find FM-MalithiUW46.ttf", SkipAll); + } + } +} + + +void tst_QScriptEngine::khmer() +{ + { + FT_Face face = loadFace("KhmerOS.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0x179a, 0x17cd, 0x0 }, + { 0x24c, 0x27f, 0x0 } }, + { { 0x179f, 0x17c5, 0x0 }, + { 0x273, 0x203, 0x0 } }, + { { 0x1790, 0x17d2, 0x1784, 0x17c3, 0x0 }, + { 0x275, 0x242, 0x182, 0x0 } }, + { { 0x179a, 0x0 }, + { 0x24c, 0x0 } }, + { { 0x1781, 0x17d2, 0x1798, 0x17c2, 0x0 }, + { 0x274, 0x233, 0x197, 0x0 } }, + { { 0x1798, 0x17b6, 0x0 }, + { 0x1cb, 0x0 } }, + { { 0x179a, 0x17b8, 0x0 }, + { 0x24c, 0x26a, 0x0 } }, + { { 0x1787, 0x17b6, 0x0 }, + { 0x1ba, 0x0 } }, + { { 0x1798, 0x17d2, 0x1796, 0x17bb, 0x0 }, + { 0x24a, 0x195, 0x26d, 0x0 } }, + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Khmer) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find KhmerOS.ttf", SkipAll); + } + } +} + +void tst_QScriptEngine::nko() +{ + { + FT_Face face = loadFace("DejaVuSans.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0x7ca, 0x0 }, + { 0x5c1, 0x0 } }, + { { 0x7ca, 0x7ca, 0x0 }, + { 0x14db, 0x14d9, 0x0 } }, + { { 0x7ca, 0x7fa, 0x7ca, 0x0 }, + { 0x14db, 0x5ec, 0x14d9, 0x0 } }, + { { 0x7ca, 0x7f3, 0x7ca, 0x0 }, + { 0x14db, 0x5e7, 0x14d9, 0x0 } }, + { { 0x7ca, 0x7f3, 0x7fa, 0x7ca, 0x0 }, + { 0x14db, 0x5e7, 0x5ec, 0x14d9, 0x0 } }, + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Nko) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find DejaVuSans.ttf", SkipAll); + } + } +} + + +void tst_QScriptEngine::linearB() +{ + { + FT_Face face = loadFace("penuture.ttf"); + if (face) { + const ShapeTable shape_table [] = { + { { 0xd800, 0xdc01, 0xd800, 0xdc02, 0xd800, 0xdc03, 0 }, + { 0x5, 0x6, 0x7, 0 } }, + { {0}, {0} } + }; + + + const ShapeTable *s = shape_table; + while (s->unicode[0]) { + QVERIFY( shaping(face, s, HB_Script_Common) ); + ++s; + } + + FT_Done_Face(face); + } else { + QSKIP("couln't find PENUTURE.TTF", SkipAll); + } + } +} + + +QTEST_MAIN(tst_QScriptEngine) +#include "main.moc" diff --git a/src/3rdparty/libgq.pri b/src/3rdparty/libgq.pri new file mode 100644 index 0000000000..a89706a1e7 --- /dev/null +++ b/src/3rdparty/libgq.pri @@ -0,0 +1,9 @@ +INCLUDEPATH += $$PWD/libgq/gconf + +HEADERS += \ + $$PWD/libgq/gconf/gconfitem.h \ + $$PWD/libgq/gconf/GConfItem + +SOURCES += \ + $$PWD/libgq/gconf/gconfitem.cpp + diff --git a/src/3rdparty/libgq/.gitignore b/src/3rdparty/libgq/.gitignore new file mode 100644 index 0000000000..70a4735f37 --- /dev/null +++ b/src/3rdparty/libgq/.gitignore @@ -0,0 +1,37 @@ +/Makefile.in +/aclocal.m4 +/autom4te.cache/ +/config.guess +/config.sub +/configure +/depcomp +/gconf/Makefile.in +/install-sh +/ltmain.sh +/missing +/Makefile +/config.log +/config.status +/gconf/.deps/ +/gconf/Makefile +/libtool +/confdefs.h +/gconf/.libs/ +/gconf/libgq-gconf.la +/gconf/gq-gconf.pc +/gconf/moc_gconfitem_h.cpp +/gconf/mocs.cpp +/gconf/test-gconf +/gconf/gconfitem_moc.cpp +/gconf/test-gconf_moc.cpp +/libgq-*.tar.gz +/debian/libgq-gconf-dev/ +/debian/libgq-gconf0/ +/debian/tmp/ +/debian/libgq-gconf0-dbg/ +/debian/libgq-gconf-doc/ +/debian/*.debhelper.log +/debian/*.substvars +/debian/files +/debian/*.debhelper +/gconf/html/ diff --git a/src/3rdparty/libgq/Makefile.am b/src/3rdparty/libgq/Makefile.am new file mode 100644 index 0000000000..42b3ece04b --- /dev/null +++ b/src/3rdparty/libgq/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = gconf + +dist-hook: + rm -rf `find $(distdir) -name '*_moc.cpp'` diff --git a/src/3rdparty/libgq/README b/src/3rdparty/libgq/README new file mode 100644 index 0000000000..c37abba8ae --- /dev/null +++ b/src/3rdparty/libgq/README @@ -0,0 +1,6 @@ +This is libgq, a set of small libraries with Q wrappers for G things. + +* GConf + +The libgq-gconf library contains the GConfItem class for accessing +GConf. diff --git a/src/3rdparty/libgq/autogen.sh b/src/3rdparty/libgq/autogen.sh new file mode 100755 index 0000000000..0a4a0343ab --- /dev/null +++ b/src/3rdparty/libgq/autogen.sh @@ -0,0 +1,2 @@ +#! /bin/sh +autoreconf --install --force -v diff --git a/src/3rdparty/libgq/configure.ac b/src/3rdparty/libgq/configure.ac new file mode 100644 index 0000000000..f4fc2be604 --- /dev/null +++ b/src/3rdparty/libgq/configure.ac @@ -0,0 +1,23 @@ +AC_INIT([libgq],[0.2],[marius.vollmer@nokia.com],[libgq]) +AC_CONFIG_SRCDIR([Makefile.am]) +AM_INIT_AUTOMAKE([-Wall -Werror tar-ustar foreign]) + +AC_PROG_CXX +AC_PROG_LIBTOOL + +PKG_CHECK_MODULES([QT], [QtCore]) +PKG_CHECK_MODULES([QTEST], [QtTest]) +PKG_CHECK_MODULES([GLIB], [glib-2.0]) +PKG_CHECK_MODULES([GCONF], [gconf-2.0]) + +MOC=`pkg-config QtCore --variable=moc_location` +RCC=`pkg-config QtCore --variable=exec_prefix`/bin/rcc + +AC_SUBST([MOC]) +AC_SUBST([RCC]) + +AC_CONFIG_FILES([Makefile + gconf/Makefile + gconf/gq-gconf.pc]) + +AC_OUTPUT diff --git a/src/3rdparty/libgq/debian/README.scratchbox b/src/3rdparty/libgq/debian/README.scratchbox new file mode 100644 index 0000000000..23ba7935ce --- /dev/null +++ b/src/3rdparty/libgq/debian/README.scratchbox @@ -0,0 +1,28 @@ +This packages behaves a bit wierdly inside Scratchbox 1, by design. + +When building it with dpkg-buildpackage or equivalent, it will disable +all devkits and adjust PATH. This means that almost all build +dependencies will come from your installed packages, and not from +Scratchbox or the configured devkits. + +Since some of our packages do not work with Scratchboxes fakeroot +(because the latter is too old), you should use the targets fakeroot +instead. + +You can disable this behavior by setting SBOX_DONT_SANITIZE in the +environment. + +When this package is build in a certain buildbot, it will go further +and permantly change the Scratchbox target. This should not happen to +anyone but the buildbot, but there is a chance it will happen to you +by accident. + +The buildbot is recognized via the $USER environment variable. If it +matches "bifh[0-9]", the permanent changes will be done. + +The permanent changes mostly consist of running apt-get dist-upgrade +and making sure that the targets fakeroot is used. + +This weirdness is brought to you by: + + http://maemo.gitorious.org/maemo-af/maemoify-tools diff --git a/src/3rdparty/libgq/debian/changelog b/src/3rdparty/libgq/debian/changelog new file mode 100644 index 0000000000..f6242540bf --- /dev/null +++ b/src/3rdparty/libgq/debian/changelog @@ -0,0 +1,31 @@ +libgq (0.4+0m6) unstable; urgency=low + + * This entry has been added by BIFH queue processor + version has been changed to 0.4+0m6 + + -- Marius Vollmer Fri, 04 Jun 2010 18:28:43 +0300 + +libgq (0.4) unstable; urgency=low + + * Never release the GConf client, to avoid having to recreate it + immediately. Might fix NB#164690. + + -- Marius Vollmer Fri, 04 Jun 2010 18:10:50 +0300 + +libgq (0.3) unstable; urgency=low + + * Added autotools to Build-Depends. + + -- Marius Vollmer Tue, 23 Feb 2010 12:04:45 +0200 + +libgq (0.2) unstable; urgency=low + + * Build fixes. + + -- Marius Vollmer Wed, 16 Dec 2009 15:56:05 +0200 + +libgq (0.1) unstable; urgency=low + + * Initial release. + + -- Marius Vollmer Wed, 16 Dec 2009 15:54:46 +0200 diff --git a/src/3rdparty/libgq/debian/compat b/src/3rdparty/libgq/debian/compat new file mode 100644 index 0000000000..7f8f011eb7 --- /dev/null +++ b/src/3rdparty/libgq/debian/compat @@ -0,0 +1 @@ +7 diff --git a/src/3rdparty/libgq/debian/control b/src/3rdparty/libgq/debian/control new file mode 100644 index 0000000000..3feaa466ea --- /dev/null +++ b/src/3rdparty/libgq/debian/control @@ -0,0 +1,43 @@ +Source: libgq +Section: libs +Priority: extra +Maintainer: Marius Vollmer +Origin: maemo +Build-Depends: debhelper (>= 7), libqt4-dev, doxygen, libgconf2-dev, libglib2.0-dev, autoconf, automake, libtool +Vcs-Browser: http://gitorious.org/maemo-af/libgq +Vcs-Git: git@gitorious.org:maemo-af/libgq.git + +Package: libgq-gconf0 +Architecture: any +Depends: ${shlibs:Depends} +Description: a Qt wrapper for GConf + This library contains the GConfItem class, for easy + access to GConf from Qt programs. + . + This package contains the shared run-time library. + +Package: libgq-gconf0-dbg +Architecture: any +Depends: libgq-gconf0 (= ${source:Version}) +Description: a Qt wrapper for GConf + This library contains the GConfItem class, for easy + access to GConf from Qt programs. + . + This package contains the debugging symbols. + +Package: libgq-gconf-dev +Architecture: any +Depends: libgq-gconf0 (= ${source:Version}), libqt4-dev, libgconf2-dev +Description: a Qt wrapper for GConf + This library contains the GConfItem class, for easy + access to GConf from Qt programs. + . + This package contains the development files. + +Package: libgq-gconf-doc +Architecture: all +Description: a Qt wrapper for GConf + This library contains the GConfItem class, for easy + access to GConf from Qt programs. + . + This package contains the documentation. diff --git a/src/3rdparty/libgq/debian/copyright b/src/3rdparty/libgq/debian/copyright new file mode 100644 index 0000000000..45b04e6929 --- /dev/null +++ b/src/3rdparty/libgq/debian/copyright @@ -0,0 +1,8 @@ +Copyright (c) 2009 Nokia Corporation. + +This program, is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License version +2.1 as published by the Free Software Foundation. + +The full text of the LGPL 2.1 can be found in +/usr/share/common-licenses. diff --git a/src/3rdparty/libgq/debian/fixup-scratchbox b/src/3rdparty/libgq/debian/fixup-scratchbox new file mode 100755 index 0000000000..b39ad5fc28 --- /dev/null +++ b/src/3rdparty/libgq/debian/fixup-scratchbox @@ -0,0 +1,79 @@ +#! /bin/sh + +# XXX - this needs to run under fakeroot... + +exec 3>&1 1>&2 + +real_dpkg_checkbuilddeps () { + SBOX_REDIRECT_IGNORE=/usr/bin/perl /usr/bin/perl /usr/bin/dpkg-checkbuilddeps "$@" +} + +finish () { + if ! real_dpkg_checkbuilddeps; then + echo "This package does not use any devkits." + echo "Please install all build dependencies as real packages." + echo >&3 FAIL + fi + exit 0 +} + +# The stamp file can not be in the source tree because then it would +# end up in the source package, which is not what we want. We put it +# into /var/tmp so that it gets deleted when a new rootstrap is +# extracted. + +STAMP=/var/tmp/SANITIZED.$(head debian/changelog | md5sum | cut -d' ' -f1) + +if [ -e $STAMP ]; then + exit 0; +fi + +# Only do permanent changes if this is BIFH + +echo "$USER" | grep -q 'bifh[0-9]' || finish + +# prevent bash from killing the system +rm -f /var/lib/bash/provide-sh + +# clean ~/.texmf-var to avoid trouble with stale things hiding there. +rm -rf ~/.texmf-var/ + +pfx="dpkg-checkbuilddeps: Unmet build dependencies:" +deps=`real_dpkg_checkbuilddeps 2>&1 | grep "^$pfx" | \ + sed -e "s/$pfx//" -e s'/([^)]*)//g' -e 's/|//'` +deps="$deps build-essential automake autoconf libtool ed gawk diff dpkg-dev" +for d in $deps; do + echo apt-get "$@" install $d + apt-get -o DPkg::Options::=--force-confold -q --force-yes --yes install $d +done +apt-get -o DPkg::Options::=--force-confold -q --force-yes --yes dist-upgrade + +# Make sure we get a fresh fakeroot installation + +# We can't seem to control the value of LD_PRELOAD well enough, so we +# just copy the good version of libfakeroot over the bad one that +# Scratchbox uses. This will result in a good version of libfakeroot +# talking to a bad version of faked, but that seems to work well +# enough. The protocol between the two is really simple and unlikely +# to change even when new syscalls are wrapped. And this is a +# desperate hack anyway, so it's OK if there is blood all over the +# floor from time to time. +# +# After we have overwritten libfakeroot, it no longer works with any +# host binaries, such as the ones in /scratchbox/compilers/bin or +# /scratchbox/tools/bin. Thus, we must avoid running those when +# fakerooted. +# +# We use "cp -l" here to avoid overwriting a library that is in use. +# +if [ "$(fakeroot -v)" = "fakeroot version 1.4.2" ]; then + apt-get -q --force-yes --yes --reinstall install fakeroot + cp -fl /usr/lib/libfakeroot/libfakeroot-sysv.so /usr/lib/libfakeroot-sysv/libfakeroot.so.0 + cp -fl /usr/lib/libfakeroot/libfakeroot-tcp.so /usr/lib/libfakeroot-tcp/libfakeroot.so.0 +else + echo "We have $(fakeroot -v), hurray!" +fi + +touch $STAMP + +finish diff --git a/src/3rdparty/libgq/debian/libgq-gconf-dev.install b/src/3rdparty/libgq/debian/libgq-gconf-dev.install new file mode 100644 index 0000000000..b3d949f416 --- /dev/null +++ b/src/3rdparty/libgq/debian/libgq-gconf-dev.install @@ -0,0 +1,5 @@ +usr/include/gq/GConfItem +usr/include/gq/gconfitem.h +usr/lib/libgq-gconf.so +usr/lib/libgq-gconf.a +usr/lib/pkgconfig/gq-gconf.pc diff --git a/src/3rdparty/libgq/debian/libgq-gconf-doc.install b/src/3rdparty/libgq/debian/libgq-gconf-doc.install new file mode 100644 index 0000000000..9007055b25 --- /dev/null +++ b/src/3rdparty/libgq/debian/libgq-gconf-doc.install @@ -0,0 +1 @@ +gconf/html usr/share/doc/libgq-gconf-doc/ diff --git a/src/3rdparty/libgq/debian/libgq-gconf0.install b/src/3rdparty/libgq/debian/libgq-gconf0.install new file mode 100644 index 0000000000..4ca628315b --- /dev/null +++ b/src/3rdparty/libgq/debian/libgq-gconf0.install @@ -0,0 +1 @@ +usr/lib/libgq-gconf.so.* diff --git a/src/3rdparty/libgq/debian/maemo-sanitize b/src/3rdparty/libgq/debian/maemo-sanitize new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/3rdparty/libgq/debian/rules b/src/3rdparty/libgq/debian/rules new file mode 100755 index 0000000000..1f293b3348 --- /dev/null +++ b/src/3rdparty/libgq/debian/rules @@ -0,0 +1,32 @@ +#! /usr/bin/make -f + +# Sanitize build environment when running inside Scratchbox 1 +ifneq (,$(wildcard /targets)) + ifeq (,$(SBOX_DONT_SANITIZE)) + export PATH:=/bin:/usr/bin + export MAKE:=make + ifeq (,$(FAKEROOTKEY)) + export SBOX_REDIRECT_TO_DIRS:=/scratchbox/compilers/bin + else + export SBOX_REDIRECT_TO_DIRS:= + endif + ifneq (,$(shell debian/fixup-scratchbox)) + $(error Error) + endif + endif +endif + +override_dh_auto_configure: + ./autogen.sh + dh_auto_configure + +override_dh_auto_build: + dh_auto_build + cd gconf && doxygen + +override_dh_strip: + dh_strip -plibgq-gconf0 --dbg-package=libgq-gconf0-dbg + dh_strip + +%: + dh $@ diff --git a/src/3rdparty/libgq/gconf/Doxyfile b/src/3rdparty/libgq/gconf/Doxyfile new file mode 100644 index 0000000000..7f5c11a3d5 --- /dev/null +++ b/src/3rdparty/libgq/gconf/Doxyfile @@ -0,0 +1,1514 @@ +# Doxyfile 1.6.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = gq-gconf + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = gconfitem.h gconfitem.cpp + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) +# there is already a search function so this one should typically +# be disabled. + +SEARCHENGINE = YES + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/src/3rdparty/libgq/gconf/GConfItem b/src/3rdparty/libgq/gconf/GConfItem new file mode 100644 index 0000000000..0a5867141d --- /dev/null +++ b/src/3rdparty/libgq/gconf/GConfItem @@ -0,0 +1 @@ +#include "gconfitem.h" diff --git a/src/3rdparty/libgq/gconf/Makefile.am b/src/3rdparty/libgq/gconf/Makefile.am new file mode 100644 index 0000000000..353970d452 --- /dev/null +++ b/src/3rdparty/libgq/gconf/Makefile.am @@ -0,0 +1,37 @@ +AM_CXXFLAGS = $(QT_CFLAGS) $(GLIB_CFLAGS) $(GCONF_CFLAGS) +LIBS += $(QT_LIBS) $(GLIB_LIBS) $(GCONF_LIBS) + +lib_LTLIBRARIES = libgq-gconf.la + +libgq_gconf_la_SOURCES = GConfItem \ + gconfitem.h \ + gconfitem.cpp \ + gconfitem_moc.cpp + +gqincludedir=$(includedir)/gq +gqinclude_HEADERS = gconfitem.h GConfItem + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = gq-gconf.pc + +# Tests + +check_PROGRAMS = test-gconf + +test_gconf_SOURCES = test-gconf.h test-gconf.cpp test-gconf_moc.cpp +test_gconf_CFLAGS = $(QTEST_CFLAGS) +test_gconf_LDADD = libgq-gconf.la $(QTEST_LIBS) + +TESTS = run-test-gconf + +EXTRA_DIST = run-test-gconf + +# Moccing + +%_moc.cpp: %.h + $(MOC) -o "$@" "$<" + +clean-moc: + rm -f *_moc.cpp *_moc.lo + +clean-local: clean-moc diff --git a/src/3rdparty/libgq/gconf/gconfitem.cpp b/src/3rdparty/libgq/gconf/gconfitem.cpp new file mode 100644 index 0000000000..d8c565a7c9 --- /dev/null +++ b/src/3rdparty/libgq/gconf/gconfitem.cpp @@ -0,0 +1,376 @@ +/* * This file is part of libgq * + * + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * + * Contact: Marius Vollmer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include + +#include "gconfitem.h" + +#include +#include +#include + +struct GConfItemPrivate { + QString key; + QVariant value; + guint notify_id; + + static void notify_trampoline(GConfClient*, guint, GConfEntry *, gpointer); +}; + +/* We get the default client and never release it, on purpose, to + avoid disconnecting from the GConf daemon when a program happens to + not have any GConfItems for short periods of time. + */ +static GConfClient * +get_gconf_client () +{ + static bool initialized = false; + static GConfClient *client; + + if (initialized) + return client; + + g_type_init (); + client = gconf_client_get_default(); + initialized = true; + + return client; +} + +/* Sometimes I like being too clever... + */ +#define withClient(c) for (GConfClient *c = get_gconf_client (); c; c = NULL) + +static QByteArray convertKey (QString key) +{ + if (key.startsWith('/')) + return key.toUtf8(); + else + { + qWarning() << "Using dot-separated key names with GConfItem is deprecated."; + qWarning() << "Please use" << '/' + key.replace('.', '/') << "instead of" << key; + return '/' + key.replace('.', '/').toUtf8(); + } +} + +static QString convertKey(const char *key) +{ + return QString::fromUtf8(key); +} + +static QVariant convertValue(GConfValue *src) +{ + if (!src) { + return QVariant(); + } else { + switch (src->type) { + case GCONF_VALUE_INVALID: + return QVariant(QVariant::Invalid); + case GCONF_VALUE_BOOL: + return QVariant((bool)gconf_value_get_bool(src)); + case GCONF_VALUE_INT: + return QVariant(gconf_value_get_int(src)); + case GCONF_VALUE_FLOAT: + return QVariant(gconf_value_get_float(src)); + case GCONF_VALUE_STRING: + return QVariant(QString::fromUtf8(gconf_value_get_string(src))); + case GCONF_VALUE_LIST: + switch (gconf_value_get_list_type(src)) { + case GCONF_VALUE_STRING: + { + QStringList result; + for (GSList *elts = gconf_value_get_list(src); elts; elts = elts->next) + result.append(QString::fromUtf8(gconf_value_get_string((GConfValue *)elts->data))); + return QVariant(result); + } + default: + { + QList result; + for (GSList *elts = gconf_value_get_list(src); elts; elts = elts->next) + result.append(convertValue((GConfValue *)elts->data)); + return QVariant(result); + } + } + case GCONF_VALUE_SCHEMA: + default: + return QVariant(); + } + } +} + +static GConfValue *convertString(const QString &str) +{ + GConfValue *v = gconf_value_new (GCONF_VALUE_STRING); + gconf_value_set_string (v, str.toUtf8().data()); + return v; +} + +static GConfValueType primitiveType (const QVariant &elt) +{ + switch(elt.type()) { + case QVariant::String: + return GCONF_VALUE_STRING; + case QVariant::Int: + return GCONF_VALUE_INT; + case QVariant::Double: + return GCONF_VALUE_FLOAT; + case QVariant::Bool: + return GCONF_VALUE_BOOL; + default: + return GCONF_VALUE_INVALID; + } +} + +static GConfValueType uniformType(const QList &list) +{ + GConfValueType result = GCONF_VALUE_INVALID; + + foreach (const QVariant &elt, list) { + GConfValueType elt_type = primitiveType (elt); + + if (elt_type == GCONF_VALUE_INVALID) + return GCONF_VALUE_INVALID; + + if (result == GCONF_VALUE_INVALID) + result = elt_type; + else if (result != elt_type) + return GCONF_VALUE_INVALID; + } + + if (result == GCONF_VALUE_INVALID) + return GCONF_VALUE_STRING; // empty list. + else + return result; +} + +static int convertValue(const QVariant &src, GConfValue **valp) +{ + GConfValue *v; + + switch(src.type()) { + case QVariant::Invalid: + v = NULL; + break; + case QVariant::Bool: + v = gconf_value_new (GCONF_VALUE_BOOL); + gconf_value_set_bool (v, src.toBool()); + break; + case QVariant::Int: + v = gconf_value_new (GCONF_VALUE_INT); + gconf_value_set_int (v, src.toInt()); + break; + case QVariant::Double: + v = gconf_value_new (GCONF_VALUE_FLOAT); + gconf_value_set_float (v, src.toDouble()); + break; + case QVariant::String: + v = convertString(src.toString()); + break; + case QVariant::StringList: + { + GSList *elts = NULL; + v = gconf_value_new(GCONF_VALUE_LIST); + gconf_value_set_list_type(v, GCONF_VALUE_STRING); + foreach (const QString &str, src.toStringList()) + elts = g_slist_prepend(elts, convertString(str)); + gconf_value_set_list_nocopy(v, g_slist_reverse(elts)); + break; + } + case QVariant::List: + { + GConfValueType elt_type = uniformType(src.toList()); + if (elt_type == GCONF_VALUE_INVALID) + v = NULL; + else + { + GSList *elts = NULL; + v = gconf_value_new(GCONF_VALUE_LIST); + gconf_value_set_list_type(v, elt_type); + foreach (const QVariant &elt, src.toList()) + { + GConfValue *val = NULL; + convertValue(elt, &val); // guaranteed to succeed. + elts = g_slist_prepend(elts, val); + } + gconf_value_set_list_nocopy(v, g_slist_reverse(elts)); + } + break; + } + default: + return 0; + } + + *valp = v; + return 1; +} + +void GConfItemPrivate::notify_trampoline (GConfClient*, + guint, + GConfEntry *, + gpointer data) +{ + GConfItem *item = (GConfItem *)data; + item->update_value (true); +} + +void GConfItem::update_value (bool emit_signal) +{ + QVariant new_value; + + withClient(client) { + GError *error = NULL; + QByteArray k = convertKey(priv->key); + GConfValue *v = gconf_client_get(client, k.data(), &error); + + if (error) { + qWarning() << error->message; + g_error_free (error); + new_value = priv->value; + } else { + new_value = convertValue(v); + if (v) + gconf_value_free(v); + } + } + + if (new_value != priv->value) { + priv->value = new_value; + if (emit_signal) + emit valueChanged(); + } +} + +QString GConfItem::key() const +{ + return priv->key; +} + +QVariant GConfItem::value() const +{ + return priv->value; +} + +QVariant GConfItem::value(const QVariant &def) const +{ + if (priv->value.isNull()) + return def; + else + return priv->value; +} + +void GConfItem::set(const QVariant &val) +{ + withClient(client) { + QByteArray k = convertKey(priv->key); + GConfValue *v; + if (convertValue(val, &v)) { + GError *error = NULL; + + if (v) { + gconf_client_set(client, k.data(), v, &error); + gconf_value_free(v); + } else { + gconf_client_unset(client, k.data(), &error); + } + + if (error) { + qWarning() << error->message; + g_error_free(error); + } else if (priv->value != val) { + priv->value = val; + emit valueChanged(); + } + + } else + qWarning() << "Can't store a" << val.typeName(); + } +} + +void GConfItem::unset() { + set(QVariant()); +} + +QList GConfItem::listDirs() const +{ + QList children; + + withClient(client) { + QByteArray k = convertKey(priv->key); + GSList *dirs = gconf_client_all_dirs(client, k.data(), NULL); + for (GSList *d = dirs; d; d = d->next) { + children.append(convertKey((char *)d->data)); + g_free (d->data); + } + g_slist_free (dirs); + } + + return children; +} + +QList GConfItem::listEntries() const +{ + QList children; + + withClient(client) { + QByteArray k = convertKey(priv->key); + GSList *entries = gconf_client_all_entries(client, k.data(), NULL); + for (GSList *e = entries; e; e = e->next) { + children.append(convertKey(((GConfEntry *)e->data)->key)); + gconf_entry_free ((GConfEntry *)e->data); + } + g_slist_free (entries); + } + + return children; +} + +GConfItem::GConfItem(const QString &key, QObject *parent) + : QObject (parent) +{ + priv = new GConfItemPrivate; + priv->key = key; + priv->notify_id = 0; + withClient(client) { + update_value (false); + QByteArray k = convertKey(priv->key); + gconf_client_add_dir (client, k.data(), GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + priv->notify_id = gconf_client_notify_add (client, k.data(), + GConfItemPrivate::notify_trampoline, this, + NULL, NULL); + } +} + +GConfItem::~GConfItem() +{ + withClient(client) { + QByteArray k = convertKey(priv->key); + if (priv->notify_id) + gconf_client_notify_remove (client, priv->notify_id); + gconf_client_remove_dir (client, k.data(), NULL); + } + delete priv; +} diff --git a/src/3rdparty/libgq/gconf/gconfitem.h b/src/3rdparty/libgq/gconf/gconfitem.h new file mode 100644 index 0000000000..17ca04e74a --- /dev/null +++ b/src/3rdparty/libgq/gconf/gconfitem.h @@ -0,0 +1,147 @@ +/* * This file is part of libgq * + * + * Copyright (C) 2009 Nokia Corporation. + * + * Contact: Marius Vollmer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef GCONFITEM_H +#define GCONFITEM_H + +#include +#include +#include + +/*! + + \brief GConfItem is a simple C++ wrapper for GConf. + + Creating a GConfItem instance gives you access to a single GConf + key. You can get and set its value, and connect to its + valueChanged() signal to be notified about changes. + + The value of a GConf key is returned to you as a QVariant, and you + pass in a QVariant when setting the value. GConfItem converts + between a QVariant and GConf values as needed, and according to the + following rules: + + - A QVariant of type QVariant::Invalid denotes an unset GConf key. + + - QVariant::Int, QVariant::Double, QVariant::Bool are converted to + and from the obvious equivalents. + + - QVariant::String is converted to/from a GConf string and always + uses the UTF-8 encoding. No other encoding is supported. + + - QVariant::StringList is converted to a list of UTF-8 strings. + + - QVariant::List (which denotes a QList) is converted + to/from a GConf list. All elements of such a list must have the + same type, and that type must be one of QVariant::Int, + QVariant::Double, QVariant::Bool, or QVariant::String. (A list of + strings is returned as a QVariant::StringList, however, when you + get it back.) + + - Any other QVariant or GConf value is essentially ignored. + + \warning GConfItem is as thread-safe as GConf. + +*/ + +class GConfItem : public QObject +{ + Q_OBJECT + + public: + /*! Initializes a GConfItem to access the GConf key denoted by + \a key. Key names should follow the normal GConf conventions + like "/myapp/settings/first". + + \param key The name of the key. + \param parent Parent object + */ + explicit GConfItem(const QString &key, QObject *parent = 0); + + /*! Finalizes a GConfItem. + */ + virtual ~GConfItem(); + + /*! Returns the key of this item, as given to the constructor. + */ + QString key() const; + + /*! Returns the current value of this item, as a QVariant. + */ + QVariant value() const; + + /*! Returns the current value of this item, as a QVariant. If + * there is no value for this item, return \a def instead. + */ + QVariant value(const QVariant &def) const; + + /*! Set the value of this item to \a val. If \a val can not be + represented in GConf or GConf refuses to accept it for other + reasons, the current value is not changed and nothing happens. + + When the new value is different from the old value, the + changedValue() signal is emitted on this GConfItem as part + of calling set(), but other GConfItem:s for the same key do + only receive a notification once the main loop runs. + + \param val The new value. + */ + void set(const QVariant &val); + + /*! Unset this item. This is equivalent to + + \code + item.set(QVariant(QVariant::Invalid)); + \endcode + */ + void unset(); + + /*! Return a list of the directories below this item. The + returned strings are absolute key names like + "/myapp/settings". + + A directory is a key that has children. The same key might + also have a value, but that is confusing and best avoided. + */ + QList listDirs() const; + + /*! Return a list of entries below this item. The returned + strings are absolute key names like "/myapp/settings/first". + + A entry is a key that has a value. The same key might also + have children, but that is confusing and is best avoided. + */ + QList listEntries() const; + + signals: + /*! Emitted when the value of this item has changed. + */ + void valueChanged(); + + private: + friend struct GConfItemPrivate; + struct GConfItemPrivate *priv; + + void update_value(bool emit_signal); +}; + +#endif // GCONFITEM_H diff --git a/src/3rdparty/libgq/gconf/gq-gconf.pc.in b/src/3rdparty/libgq/gconf/gq-gconf.pc.in new file mode 100644 index 0000000000..bd76d65423 --- /dev/null +++ b/src/3rdparty/libgq/gconf/gq-gconf.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: gq-gconf +Description: Qt/GConf wrapper +Version: @VERSION@ +Requires: QtCore +Libs: -L${libdir} -lgq-gconf +Cflags: -I${includedir}/gq diff --git a/src/3rdparty/libgq/gconf/run-test-gconf b/src/3rdparty/libgq/gconf/run-test-gconf new file mode 100755 index 0000000000..67f90907c0 --- /dev/null +++ b/src/3rdparty/libgq/gconf/run-test-gconf @@ -0,0 +1,49 @@ +#!/bin/sh + +# please make sure that the en_US.UTF-8 locale is available! +# - apt-get install locales +# - make sure /etc/locale.gen contains the line "en_US.UTF-8 UTF-8" +# - run /usr/sbin/locale-gen +LC_ALL=en_US.UTF-8 +export LC_ALL + +gconftool-2 -s -t bool /Test/Bool true +VALUE=$(gconftool-2 -g /Test/Bool) +if [ "$VALUE" != "true" ]; then + echo "GConf is not running, skipping all tests" + exit 77 +fi + +# Setup values expected by the external_values() test. + +gconftool-2 -s -t int /Test/Int 123 +gconftool-2 -s -t string /Test/String "Hello GConf" +gconftool-2 -s -t float /Test/Double 3.5 +gconftool-2 -s -t list --list-type string /Test/StringList "[Hello,GConf,ÄÖÜ]" +gconftool-2 -s -t list --list-type int /Test/IntList "[1,2,3,4]" +gconftool-2 -s -t list --list-type float /Test/DoubleList "[3.5,3.5,3.5]" +gconftool-2 -s -t list --list-type bool /Test/BoolList "[false,true,true,false]" +gconftool-2 -u /Test/UnsetBefore +gconftool-2 -s -t int /Test/UnsetAfter 100 +gconftool-2 -s -t int /Test/Dir/Entry 200 + +./test-gconf $* || exit 1 + +# Check what set_external() has left behind. + +compare() { + if [ "$1" != "$2" ]; then + echo "FAIL: '$1' != '$2'" + exit 1 + fi +} + +compare "`gconftool-2 -g /Test/Bool`" false +compare "`gconftool-2 -g /Test/Int`" 54321 +compare "`gconftool-2 -g /Test/String`" "Good bye GConf" +compare "`gconftool-2 -g /Test/Double`" -2.5 +compare "`gconftool-2 -g /Test/StringList`" "[Good,bye,GConf,äöü]" +compare "`gconftool-2 -g /Test/IntList`" "[5,4,3,2,1]" +compare "`gconftool-2 -g /Test/DoubleList`" "[-2.5,-2.5]" +compare "`gconftool-2 -g /Test/BoolList`" "[false,false,true,true]" +compare "`gconftool-2 -g /Test/UnsetAfter 2>&1`" 'No value set for `/Test/UnsetAfter'"'" diff --git a/src/3rdparty/libgq/gconf/test-gconf.cpp b/src/3rdparty/libgq/gconf/test-gconf.cpp new file mode 100644 index 0000000000..52eb28171a --- /dev/null +++ b/src/3rdparty/libgq/gconf/test-gconf.cpp @@ -0,0 +1,299 @@ +#include "test-gconf.h" + +#define MYLOGLEVEL 2 +void myMessageOutput(QtMsgType type, const char *msg) +{ + switch (type) { + case QtDebugMsg: + if (MYLOGLEVEL <= 0) + fprintf(stderr, "Debug: %s\n", msg); + break; + case QtWarningMsg: + if (MYLOGLEVEL <= 1) + fprintf(stderr, "Warning: %s\n", msg); + break; + case QtCriticalMsg: + if (MYLOGLEVEL <= 2) + fprintf(stderr, "Critical: %s\n", msg); + break; + case QtFatalMsg: + if (MYLOGLEVEL <= 3) + fprintf(stderr, "Fatal: %s\n", msg); + abort(); + } +} + +// +// Definition of testcases: Normal tests +// + +void GConfItemTests::timeout() +{ + timed_out = true; + timer.stop(); +} + +// Before all tests +void GConfItemTests::initTestCase() +{ + connect(&timer, SIGNAL(timeout()), + this, SLOT(timeout())); +} + +// After all tests +void GConfItemTests::cleanupTestCase() +{ +} + +// Before each test +void GConfItemTests::init() +{ + boolItem = new GConfItem("/Test/Bool"); + intItem = new GConfItem("/Test/Int"); + stringItem = new GConfItem("/Test/String"); + doubleItem = new GConfItem("/Test/Double"); + stringListItem = new GConfItem("/Test/StringList"); + intListItem = new GConfItem("/Test/IntList"); + doubleListItem = new GConfItem("/Test/DoubleList"); + boolListItem = new GConfItem("/Test/BoolList"); + unsetBeforeItem = new GConfItem("/Test/UnsetBefore"); + unsetAfterItem = new GConfItem("/Test/UnsetAfter"); + signalSpy = new SignalListener(); + QObject::connect(boolItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::connect(intItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::connect(stringItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::connect(doubleItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::connect(stringListItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::connect(intListItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::connect(doubleListItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::connect(boolListItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); +} + +// After each test +void GConfItemTests::cleanup() +{ + QObject::disconnect(boolItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::disconnect(intItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::disconnect(stringItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::disconnect(doubleItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::disconnect(stringListItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::disconnect(intListItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::disconnect(doubleListItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + QObject::disconnect(boolListItem, SIGNAL(valueChanged()), signalSpy, SLOT(valueChanged())); + delete signalSpy; + delete boolItem; + delete intItem; + delete stringItem; + delete doubleItem; + delete stringListItem; + delete intListItem; + delete doubleListItem; + delete boolListItem; + delete unsetBeforeItem; + delete unsetAfterItem; + + timer.stop(); +} + +void GConfItemTests::path() +{ + QCOMPARE(boolItem->key(), QString("/Test/Bool")); + QCOMPARE(intItem->key(), QString("/Test/Int")); + QCOMPARE(stringItem->key(), QString("/Test/String")); + QCOMPARE(doubleItem->key(), QString("/Test/Double")); + QCOMPARE(stringListItem->key(), QString("/Test/StringList")); + QCOMPARE(intListItem->key(), QString("/Test/IntList")); + QCOMPARE(doubleListItem->key(), QString("/Test/DoubleList")); + QCOMPARE(boolListItem->key(), QString("/Test/BoolList")); + QCOMPARE(unsetBeforeItem->key(), QString("/Test/UnsetBefore")); + QCOMPARE(unsetAfterItem->key(), QString("/Test/UnsetAfter")); +} + +void GConfItemTests::external_values() +{ + // These values are set before this program starts. + QCOMPARE(boolItem->value().toBool(), true); + QCOMPARE(intItem->value().toInt(), 123); + QCOMPARE(stringItem->value().toString(), QString("Hello GConf")); + QCOMPARE(doubleItem->value().toDouble(), 3.5); + QCOMPARE(stringListItem->value().toStringList(), QStringList() << "Hello" << "GConf" << QString::fromUtf8("ÄÖÜ")); + QCOMPARE(intListItem->value().toList(), QList() << 1 << 2 << 3 << 4); + QCOMPARE(doubleListItem->value().toList(), QList() << 3.5 << 3.5 << 3.5); + QCOMPARE(boolListItem->value().toList(), QList() << false << true << true << false); + QCOMPARE(unsetBeforeItem->value().isValid(), false); + QCOMPARE(unsetAfterItem->value().isValid(), true); +} + +void GConfItemTests::set_bool() +{ + signalSpy->numberOfCalls = 0; + + boolItem->set(false); + QCOMPARE(boolItem->value().toBool(), false); + boolItem->set(true); + QCOMPARE(boolItem->value().toBool(), true); + + QCOMPARE(signalSpy->numberOfCalls, 2); +} + +void GConfItemTests::set_int() +{ + signalSpy->numberOfCalls = 0; + + intItem->set(12); + QCOMPARE(intItem->value().toInt(), 12); + intItem->set(-5); + QCOMPARE(intItem->value().toInt(), -5); + + QCOMPARE(signalSpy->numberOfCalls, 2); +} + +void GConfItemTests::set_string() +{ + signalSpy->numberOfCalls = 0; + + stringItem->set("Hi"); + QCOMPARE(stringItem->value().toString(), QString("Hi")); + + QCOMPARE(signalSpy->numberOfCalls, 1); +} + +void GConfItemTests::set_unicode_string() +{ + signalSpy->numberOfCalls = 0; + + stringItem->set(QString::fromUtf8("Höäü")); + QCOMPARE(stringItem->value().toString(), QString::fromUtf8("Höäü")); + + QCOMPARE(signalSpy->numberOfCalls, 1); +} + +void GConfItemTests::set_double() +{ + signalSpy->numberOfCalls = 0; + + doubleItem->set(1.2345); + QCOMPARE(doubleItem->value().toDouble(), 1.2345); + + QCOMPARE(signalSpy->numberOfCalls, 1); +} + +void GConfItemTests::set_string_list() +{ + signalSpy->numberOfCalls = 0; + + stringListItem->set(QStringList() << "one" << "two" << "three"); + QCOMPARE(stringListItem->value().toStringList(), QStringList() << "one" << "two" << "three"); + + QCOMPARE(signalSpy->numberOfCalls, 1); +} + +void GConfItemTests::set_int_list() +{ + signalSpy->numberOfCalls = 0; + + intListItem->set(QList() << 10 << 11 << 12); + QCOMPARE(intListItem->value().toList(), QList() << 10 << 11 << 12); + + QCOMPARE(signalSpy->numberOfCalls, 1); +} + +void GConfItemTests::set_double_list() +{ + signalSpy->numberOfCalls = 0; + + doubleListItem->set(QList() << 1.1 << 2.2 << 3.3); + QCOMPARE(doubleListItem->value().toList(), QList() << 1.1 << 2.2 << 3.3); + + QCOMPARE(signalSpy->numberOfCalls, 1); +} + +void GConfItemTests::set_bool_list() +{ + signalSpy->numberOfCalls = 0; + + boolListItem->set(QList() << true << true << false); + QCOMPARE(boolListItem->value().toList(), QList() << true << true << false); + + QCOMPARE(signalSpy->numberOfCalls, 1); +} + +void GConfItemTests::unset () +{ + signalSpy->numberOfCalls = 0; + + boolItem->unset(); + QCOMPARE(boolItem->value().isValid(), false); + + QCOMPARE(signalSpy->numberOfCalls, 1); +} + +void GConfItemTests::list_dirs () +{ + GConfItem test("/Test"); + QStringList dirs = test.listDirs(); + + QVERIFY (!dirs.contains("/Test/Bool")); + QVERIFY (!dirs.contains("/Test/Int")); + QVERIFY (!dirs.contains("/Test/String")); + QVERIFY (!dirs.contains("/Test/Double")); + QVERIFY (!dirs.contains("/Test/StringList")); + QVERIFY (!dirs.contains("/Test/IntList")); + QVERIFY (!dirs.contains("/Test/DoubleList")); + QVERIFY (!dirs.contains("/Test/BoolList")); + QVERIFY (!dirs.contains("/Test/UnsetBefore")); + QVERIFY (!dirs.contains("/Test/UnsetAfter")); + QVERIFY (dirs.contains("/Test/Dir")); +} + +void GConfItemTests::list_entries () +{ + GConfItem test("/Test"); + QStringList entries = test.listEntries(); + + QVERIFY (!entries.contains("/Test/Bool")); // has been unset above + QVERIFY (entries.contains("/Test/Int")); + QVERIFY (entries.contains("/Test/String")); + QVERIFY (entries.contains("/Test/Double")); + QVERIFY (entries.contains("/Test/StringList")); + QVERIFY (entries.contains("/Test/IntList")); + QVERIFY (entries.contains("/Test/DoubleList")); + QVERIFY (entries.contains("/Test/BoolList")); + QVERIFY (!entries.contains("/Test/UnsetBefore")); + QVERIFY (entries.contains("/Test/UnsetAfter")); + QVERIFY (!entries.contains("/Test/Dir")); +} + +void GConfItemTests::get_default () +{ + intItem->unset(); + QCOMPARE(intItem->value(123).toInt(), 123); + intItem->set(234); + QCOMPARE(intItem->value(123).toInt(), 234); +} + +void GConfItemTests::propagate () +{ + GConfItem secondIntItem("/Test/Int"); + secondIntItem.set(3000); + QVERIFY_TIMEOUT(2000, intItem->value() == secondIntItem.value()); + QCOMPARE(signalSpy->numberOfCalls, 2); +} + +void GConfItemTests::set_external() +{ + // This must be the last test case. The values that are set here + // are checked after this program exits. + + boolItem->set(false); + intItem->set(54321); + stringItem->set("Good bye GConf"); + doubleItem->set(-2.5); + stringListItem->set(QStringList() << "Good" << "bye" << "GConf" << QString::fromUtf8("äöü")); + intListItem->set(QList() << 5 << 4 << 3 << 2 << 1); + doubleListItem->set(QList() << -2.5 << -2.5); + boolListItem->set(QList() << false << false << true << true); + unsetAfterItem->set(QVariant()); +} + +QTEST_MAIN(GConfItemTests); diff --git a/src/3rdparty/libgq/gconf/test-gconf.h b/src/3rdparty/libgq/gconf/test-gconf.h new file mode 100644 index 0000000000..36eaeccca4 --- /dev/null +++ b/src/3rdparty/libgq/gconf/test-gconf.h @@ -0,0 +1,86 @@ +#include +#include +#include + +#include "GConfItem" + +// Helper class for listening to signals +class SignalListener : public QObject +{ + Q_OBJECT +public: + int numberOfCalls; + SignalListener() : numberOfCalls(0) { + } + +public slots: + void valueChanged() + { + numberOfCalls++; + } +}; + +// Tests for the public API +class GConfItemTests : public QObject +{ + Q_OBJECT + + // Stored pointers etc. +private: + GConfItem *boolItem; + GConfItem *intItem; + GConfItem *stringItem; + GConfItem *doubleItem; + GConfItem *stringListItem; + GConfItem *intListItem; + GConfItem *doubleListItem; + GConfItem *boolListItem; + GConfItem *unsetBeforeItem; + GConfItem *unsetAfterItem; + + SignalListener *signalSpy; + + QTimer timer; + bool timed_out; + + // Tests +private slots: + // Init and cleanup helper functions + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + void timeout (); + + // Public API + void path(); + void external_values(); + void set_bool(); + void set_int(); + void set_string(); + void set_unicode_string(); + void set_double(); + void set_string_list(); + void set_int_list(); + void set_double_list(); + void set_bool_list(); + void unset(); + void get_default(); + void list_dirs(); + void list_entries(); + void propagate(); + void set_external(); +}; + +// Useful if you need to process some events until a condition becomes +// true. + +#define QVERIFY_TIMEOUT(msecs, expr) \ + do { \ + timed_out = false; \ + timer.start(msecs); \ + while (!timed_out && !(expr)) { \ + QCoreApplication::processEvents(QEventLoop::WaitForMoreEvents); \ + } \ + QVERIFY((expr)); \ + } while(0) diff --git a/src/3rdparty/libjpeg.pri b/src/3rdparty/libjpeg.pri new file mode 100644 index 0000000000..63f2aca5dc --- /dev/null +++ b/src/3rdparty/libjpeg.pri @@ -0,0 +1,63 @@ +wince*: { + DEFINES += NO_GETENV + contains(CE_ARCH,x86):CONFIG -= stl exceptions + contains(CE_ARCH,x86):CONFIG += exceptions_off +} + +#Disable warnings in 3rdparty code due to unused arguments +symbian: { + QMAKE_CXXFLAGS.CW += -W nounusedarg + TARGET.UID3=0x2001E61B +} else:contains(QMAKE_CC, gcc): { + QMAKE_CFLAGS_WARN_ON += -Wno-unused-parameter -Wno-main +} + + +INCLUDEPATH += $$PWD/libjpeg +SOURCES += \ + $$PWD/libjpeg/jaricom.c \ + $$PWD/libjpeg/jcapimin.c \ + $$PWD/libjpeg/jcapistd.c \ + $$PWD/libjpeg/jcarith.c \ + $$PWD/libjpeg/jccoefct.c \ + $$PWD/libjpeg/jccolor.c \ + $$PWD/libjpeg/jcdctmgr.c \ + $$PWD/libjpeg/jchuff.c \ + $$PWD/libjpeg/jcinit.c \ + $$PWD/libjpeg/jcmainct.c \ + $$PWD/libjpeg/jcmarker.c \ + $$PWD/libjpeg/jcmaster.c \ + $$PWD/libjpeg/jcomapi.c \ + $$PWD/libjpeg/jcparam.c \ + $$PWD/libjpeg/jcprepct.c \ + $$PWD/libjpeg/jcsample.c \ + $$PWD/libjpeg/jctrans.c \ + $$PWD/libjpeg/jdapimin.c \ + $$PWD/libjpeg/jdapistd.c \ + $$PWD/libjpeg/jdarith.c \ + $$PWD/libjpeg/jdatadst.c \ + $$PWD/libjpeg/jdatasrc.c \ + $$PWD/libjpeg/jdcoefct.c \ + $$PWD/libjpeg/jdcolor.c \ + $$PWD/libjpeg/jddctmgr.c \ + $$PWD/libjpeg/jdhuff.c \ + $$PWD/libjpeg/jdinput.c \ + $$PWD/libjpeg/jdmainct.c \ + $$PWD/libjpeg/jdmarker.c \ + $$PWD/libjpeg/jdmaster.c \ + $$PWD/libjpeg/jdmerge.c \ + $$PWD/libjpeg/jdpostct.c \ + $$PWD/libjpeg/jdsample.c \ + $$PWD/libjpeg/jdtrans.c \ + $$PWD/libjpeg/jerror.c \ + $$PWD/libjpeg/jfdctflt.c \ + $$PWD/libjpeg/jfdctfst.c \ + $$PWD/libjpeg/jfdctint.c \ + $$PWD/libjpeg/jidctflt.c \ + $$PWD/libjpeg/jidctfst.c \ + $$PWD/libjpeg/jidctint.c \ + $$PWD/libjpeg/jquant1.c \ + $$PWD/libjpeg/jquant2.c \ + $$PWD/libjpeg/jutils.c \ + $$PWD/libjpeg/jmemmgr.c \ + $$PWD/libjpeg/jmemnobs.c diff --git a/src/3rdparty/libjpeg/README b/src/3rdparty/libjpeg/README new file mode 100644 index 0000000000..451265d764 --- /dev/null +++ b/src/3rdparty/libjpeg/README @@ -0,0 +1,326 @@ +The Independent JPEG Group's JPEG software +========================================== + +README for release 8c of 16-Jan-2011 +==================================== + +This distribution contains the eighth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone, +Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson, +Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers, +and other members of the Independent JPEG Group. + +IJG is not affiliated with the official ISO JPEG standards committee. + + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +ACKNOWLEDGMENTS Special thanks. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + install.txt How to configure and install the IJG software. + usage.txt Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.txt). + wizard.txt Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.txt How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.txt Overview of the JPEG library's internal structure. + filelist.txt Road map of IJG files. + coderules.txt Coding style rules --- please read if you contribute code. + +Please read at least the files install.txt and usage.txt. Some information +can also be found in the JPEG FAQ (Frequently Asked Questions) article. See +ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + + +OVERVIEW +======== + +This package contains C software to implement JPEG image encoding, decoding, +and transcoding. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +We have made no provision for supporting the hierarchical or lossless +processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. + +We have also included "jpegtran", a utility for lossless transcoding between +different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple +applications for inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +REFERENCES +========== + +We recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of Wallace's article is +available at http://www.ijg.org/files/wallace.ps.gz. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and IEEE, +and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by +M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides +good explanations and example C code for a multitude of compression methods +including JPEG. It is an excellent source if you are comfortable reading C +code but don't know much about data compression in general. The book's JPEG +sample code is far from industrial-strength, but when you are ready to look +at a full implementation, you've got one here... + +The best currently available description of JPEG is the textbook "JPEG Still +Image Data Compression Standard" by William B. Pennebaker and Joan L. +Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. +Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG +standards (DIS 10918-1 and draft DIS 10918-2). +Although this is by far the most detailed and comprehensive exposition of +JPEG publicly available, we point out that it is still missing an explanation +of the most essential properties and algorithms of the underlying DCT +technology. +If you think that you know about DCT-based JPEG after reading this book, +then you are in delusion. The real fundamentals and corresponding potential +of DCT-based JPEG are not publicly known so far, and that is the reason for +all the mistaken developments taking place in the image coding domain. + +The original JPEG standard is divided into two parts, Part 1 being the actual +specification, while Part 2 covers compliance testing methods. Part 1 is +titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. +IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension +which is specified in a contributed document at ITU and ISO with title "ITU-T +JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced Image Coding", April +2006, Geneva, Switzerland. The latest version of the document is Revision 3. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report +and thus received a formal publication status. It is available as a free +download in PDF format from +http://www.ecma-international.org/publications/techreports/E-TR-098.htm. +A PostScript version of the JFIF document is available at +http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at +http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures. + +The TIFF 6.0 file format specification can be obtained by FTP from +ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from +http://www.ijg.org/files/. It is expected that the next revision +of the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is www.ijg.org. +The most recent released version can always be found there in +directory "files". This particular version will be archived as +http://www.ijg.org/files/jpegsrc.v8c.tar.gz, and in Windows-compatible +"zip" archive format as http://www.ijg.org/files/jpegsr8c.zip. + +The JPEG FAQ (Frequently Asked Questions) article is a source of some +general information about JPEG. +It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ +and other news.answers archive sites, including the official news.answers +archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. +If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + + +ACKNOWLEDGMENTS +=============== + +Thank to Juergen Bruder for providing me with a copy of the common DCT +algorithm article, only to find out that I had come to the same result +in a more direct and comprehensible way with a more generative approach. + +Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the +ITU JPEG (Study Group 16) meeting in Geneva, Switzerland. + +Thank to Thomas Wiegand and Gary Sullivan for inviting me to the +Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland. + +Thank to John Korejwa and Massimo Ballerini for inviting me to +fruitful consultations in Boston, MA and Milan, Italy. + +Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther +Maier-Gerber, Walter Stoeber, Fred Schmitz, and Norbert Braunagel +for corresponding business development. + +Thank to Nico Zschach and Dirk Stelling of the technical support team +at the Digital Images company in Halle for providing me with extra +equipment for configuration tests. + +Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful +communication about JPEG configuration in Sigma Photo Pro software. + +Thank to Andrew Finkenstadt for hosting the ijg.org site. + +Last but not least special thank to Thomas G. Lane for the original +design and development of this singular software package. + + +FILE FORMAT WARS +================ + +The ISO JPEG standards committee actually promotes different formats like +"JPEG 2000" or "JPEG XR" which are incompatible with original DCT-based +JPEG and which are based on faulty technologies. IJG therefore does not +and will not support such momentary mistakes (see REFERENCES). +We have little or no sympathy for the promotion of these formats. Indeed, +one of the original reasons for developing this free software was to help +force convergence on common, interoperable format standards for JPEG files. +Don't use an incompatible file format! +(In any case, our decoder will remain capable of reading existing JPEG +image files indefinitely.) + + +TO DO +===== + +Version 8 is the first release of a new generation JPEG standard +to overcome the limitations of the original JPEG specification. +More features are being prepared for coming releases... + +Please send bug reports, offers of help, etc. to jpeg-info@uc.ag. diff --git a/src/3rdparty/libjpeg/cderror.h b/src/3rdparty/libjpeg/cderror.h new file mode 100644 index 0000000000..e19c475c5c --- /dev/null +++ b/src/3rdparty/libjpeg/cderror.h @@ -0,0 +1,134 @@ +/* + * cderror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the cjpeg/djpeg + * applications. These strings are not needed as part of the JPEG library + * proper. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef CDERROR_H +#define CDERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* CDERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */ + +#ifdef BMP_SUPPORTED +JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format") +JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported") +JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length") +JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1") +JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB") +JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported") +JMESSAGE(JERR_BMP_EMPTY, "Empty BMP image") +JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM") +JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image") +JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image") +JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image") +JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image") +#endif /* BMP_SUPPORTED */ + +#ifdef GIF_SUPPORTED +JMESSAGE(JERR_GIF_BUG, "GIF output got confused") +JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d") +JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB") +JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file") +JMESSAGE(JERR_GIF_NOT, "Not a GIF file") +JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image") +JMESSAGE(JTRC_GIF_BADVERSION, + "Warning: unexpected GIF version number '%c%c%c'") +JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x") +JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input") +JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file") +JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring") +JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image") +JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits") +#endif /* GIF_SUPPORTED */ + +#ifdef PPM_SUPPORTED +JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB") +JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file") +JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file") +JMESSAGE(JTRC_PGM, "%ux%u PGM image") +JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image") +JMESSAGE(JTRC_PPM, "%ux%u PPM image") +JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image") +#endif /* PPM_SUPPORTED */ + +#ifdef RLE_SUPPORTED +JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library") +JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB") +JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE") +JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file") +JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header") +JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header") +JMESSAGE(JERR_RLE_NOT, "Not an RLE file") +JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE") +JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup") +JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file") +JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d") +JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file") +JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d") +JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d") +#endif /* RLE_SUPPORTED */ + +#ifdef TARGA_SUPPORTED +JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format") +JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file") +JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB") +JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image") +JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image") +JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image") +#else +JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled") +#endif /* TARGA_SUPPORTED */ + +JMESSAGE(JERR_BAD_CMAP_FILE, + "Color map file is invalid or of unsupported format") +JMESSAGE(JERR_TOO_MANY_COLORS, + "Output file format cannot handle %d colormap entries") +JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed") +#ifdef TARGA_SUPPORTED +JMESSAGE(JERR_UNKNOWN_FORMAT, + "Unrecognized input file format --- perhaps you need -targa") +#else +JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format") +#endif +JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTADDONCODE +} ADDON_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE diff --git a/src/3rdparty/libjpeg/cdjpeg.h b/src/3rdparty/libjpeg/cdjpeg.h new file mode 100644 index 0000000000..ed024ac3ae --- /dev/null +++ b/src/3rdparty/libjpeg/cdjpeg.h @@ -0,0 +1,187 @@ +/* + * cdjpeg.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains common declarations for the sample applications + * cjpeg and djpeg. It is NOT used by the core JPEG library. + */ + +#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */ +#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jerror.h" /* get library error codes too */ +#include "cderror.h" /* get application-specific error codes */ + + +/* + * Object interface for cjpeg's source file decoding modules + */ + +typedef struct cjpeg_source_struct * cjpeg_source_ptr; + +struct cjpeg_source_struct { + JMETHOD(void, start_input, (j_compress_ptr cinfo, + cjpeg_source_ptr sinfo)); + JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo, + cjpeg_source_ptr sinfo)); + JMETHOD(void, finish_input, (j_compress_ptr cinfo, + cjpeg_source_ptr sinfo)); + + FILE *input_file; + + JSAMPARRAY buffer; + JDIMENSION buffer_height; +}; + + +/* + * Object interface for djpeg's output file encoding modules + */ + +typedef struct djpeg_dest_struct * djpeg_dest_ptr; + +struct djpeg_dest_struct { + /* start_output is called after jpeg_start_decompress finishes. + * The color map will be ready at this time, if one is needed. + */ + JMETHOD(void, start_output, (j_decompress_ptr cinfo, + djpeg_dest_ptr dinfo)); + /* Emit the specified number of pixel rows from the buffer. */ + JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo, + djpeg_dest_ptr dinfo, + JDIMENSION rows_supplied)); + /* Finish up at the end of the image. */ + JMETHOD(void, finish_output, (j_decompress_ptr cinfo, + djpeg_dest_ptr dinfo)); + + /* Target file spec; filled in by djpeg.c after object is created. */ + FILE * output_file; + + /* Output pixel-row buffer. Created by module init or start_output. + * Width is cinfo->output_width * cinfo->output_components; + * height is buffer_height. + */ + JSAMPARRAY buffer; + JDIMENSION buffer_height; +}; + + +/* + * cjpeg/djpeg may need to perform extra passes to convert to or from + * the source/destination file format. The JPEG library does not know + * about these passes, but we'd like them to be counted by the progress + * monitor. We use an expanded progress monitor object to hold the + * additional pass count. + */ + +struct cdjpeg_progress_mgr { + struct jpeg_progress_mgr pub; /* fields known to JPEG library */ + int completed_extra_passes; /* extra passes completed */ + int total_extra_passes; /* total extra */ + /* last printed percentage stored here to avoid multiple printouts */ + int percent_done; +}; + +typedef struct cdjpeg_progress_mgr * cd_progress_ptr; + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jinit_read_bmp jIRdBMP +#define jinit_write_bmp jIWrBMP +#define jinit_read_gif jIRdGIF +#define jinit_write_gif jIWrGIF +#define jinit_read_ppm jIRdPPM +#define jinit_write_ppm jIWrPPM +#define jinit_read_rle jIRdRLE +#define jinit_write_rle jIWrRLE +#define jinit_read_targa jIRdTarga +#define jinit_write_targa jIWrTarga +#define read_quant_tables RdQTables +#define read_scan_script RdScnScript +#define set_quality_ratings SetQRates +#define set_quant_slots SetQSlots +#define set_sample_factors SetSFacts +#define read_color_map RdCMap +#define enable_signal_catcher EnSigCatcher +#define start_progress_monitor StProgMon +#define end_progress_monitor EnProgMon +#define read_stdin RdStdin +#define write_stdout WrStdout +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + +/* Module selection routines for I/O modules. */ + +EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo, + boolean is_os2)); +EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo)); +EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo)); +EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo)); +EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo)); +EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo)); + +/* cjpeg support routines (in rdswitch.c) */ + +EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename, + boolean force_baseline)); +EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename)); +EXTERN(boolean) set_quality_ratings JPP((j_compress_ptr cinfo, char *arg, + boolean force_baseline)); +EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg)); +EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg)); + +/* djpeg support routines (in rdcolmap.c) */ + +EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* common support routines (in cdjpeg.c) */ + +EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo)); +EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo, + cd_progress_ptr progress)); +EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo)); +EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars)); +EXTERN(FILE *) read_stdin JPP((void)); +EXTERN(FILE *) write_stdout JPP((void)); + +/* miscellaneous useful macros */ + +#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ +#define READ_BINARY "r" +#define WRITE_BINARY "w" +#else +#ifdef VMS /* VMS is very nonstandard */ +#define READ_BINARY "rb", "ctx=stm" +#define WRITE_BINARY "wb", "ctx=stm" +#else /* standard ANSI-compliant case */ +#define READ_BINARY "rb" +#define WRITE_BINARY "wb" +#endif +#endif + +#ifndef EXIT_FAILURE /* define exit() codes if not provided */ +#define EXIT_FAILURE 1 +#endif +#ifndef EXIT_SUCCESS +#ifdef VMS +#define EXIT_SUCCESS 1 /* VMS is very nonstandard */ +#else +#define EXIT_SUCCESS 0 +#endif +#endif +#ifndef EXIT_WARNING +#ifdef VMS +#define EXIT_WARNING 1 /* VMS is very nonstandard */ +#else +#define EXIT_WARNING 2 +#endif +#endif diff --git a/src/3rdparty/libjpeg/change.log b/src/3rdparty/libjpeg/change.log new file mode 100644 index 0000000000..94865b3f9c --- /dev/null +++ b/src/3rdparty/libjpeg/change.log @@ -0,0 +1,326 @@ +CHANGE LOG for Independent JPEG Group's JPEG software + + +Version 8c 16-Jan-2011 +----------------------- + +Add option to compression library and cjpeg (-block N) to use +different DCT block size. +All N from 1 to 16 are possible. Default is 8 (baseline format). +Larger values produce higher compression, +smaller values produce higher quality. +SmartScale capable decoder (introduced with IJG JPEG 8) required. + + +Version 8b 16-May-2010 +----------------------- + +Repair problem in new memory source manager with corrupt JPEG data. +Thank to Ted Campbell and Samuel Chun for the report. + +Repair problem in Makefile.am test target. +Thank to anonymous user for the report. + +Support MinGW installation with automatic configure. +Thank to Volker Grabsch for the suggestion. + + +Version 8a 28-Feb-2010 +----------------------- + +Writing tables-only datastreams via jpeg_write_tables works again. + +Support 32-bit BMPs (RGB image with Alpha channel) for read in cjpeg. +Thank to Brett Blackham for the suggestion. + +Improve accuracy in floating point IDCT calculation. +Thank to Robert Hooke for the hint. + + +Version 8 10-Jan-2010 +---------------------- + +jpegtran now supports the same -scale option as djpeg for "lossless" resize. +An implementation of the JPEG SmartScale extension is required for this +feature. A (draft) specification of the JPEG SmartScale extension is +available as a contributed document at ITU and ISO. Revision 2 or later +of the document is required (latest document version is Revision 3). +The SmartScale extension will enable more features beside lossless resize +in future implementations, as described in the document (new compression +options). + +Add sanity check in BMP reader module to avoid cjpeg crash for empty input +image (thank to Isaev Ildar of ISP RAS, Moscow, RU for reporting this error). + +Add data source and destination managers for read from and write to +memory buffers. New API functions jpeg_mem_src and jpeg_mem_dest. +Thank to Roberto Boni from Italy for the suggestion. + + +Version 7 27-Jun-2009 +---------------------- + +New scaled DCTs implemented. +djpeg now supports scalings N/8 with all N from 1 to 16. +cjpeg now supports scalings 8/N with all N from 1 to 16. +Scaled DCTs with size larger than 8 are now also used for resolving the +common 2x2 chroma subsampling case without additional spatial resampling. +Separate spatial resampling for those kind of files is now only necessary +for N>8 scaling cases. +Furthermore, separate scaled DCT functions are provided for direct resolving +of the common asymmetric subsampling cases (2x1 and 1x2) without additional +spatial resampling. + +cjpeg -quality option has been extended for support of separate quality +settings for luminance and chrominance (or in general, for every provided +quantization table slot). +New API function jpeg_default_qtables() and q_scale_factor array in library. + +Added -nosmooth option to cjpeg, complementary to djpeg. +New variable "do_fancy_downsampling" in library, complement to fancy +upsampling. Fancy upsampling now uses direct DCT scaling with sizes +larger than 8. The old method is not reversible and has been removed. + +Support arithmetic entropy encoding and decoding. +Added files jaricom.c, jcarith.c, jdarith.c. + +Straighten the file structure: +Removed files jidctred.c, jcphuff.c, jchuff.h, jdphuff.c, jdhuff.h. + +jpegtran has a new "lossless" cropping feature. + +Implement -perfect option in jpegtran, new API function +jtransform_perfect_transform() in transupp. (DP 204_perfect.dpatch) + +Better error messages for jpegtran fopen failure. +(DP 203_jpegtran_errmsg.dpatch) + +Fix byte order issue with 16bit PPM/PGM files in rdppm.c/wrppm.c: +according to Netpbm, the de facto standard implementation of the PNM formats, +the most significant byte is first. (DP 203_rdppm.dpatch) + +Add -raw option to rdjpgcom not to mangle the output. +(DP 205_rdjpgcom_raw.dpatch) + +Make rdjpgcom locale aware. (DP 201_rdjpgcom_locale.dpatch) + +Add extern "C" to jpeglib.h. +This avoids the need to put extern "C" { ... } around #include "jpeglib.h" +in your C++ application. Defining the symbol DONT_USE_EXTERN_C in the +configuration prevents this. (DP 202_jpeglib.h_c++.dpatch) + + +Version 6b 27-Mar-1998 +----------------------- + +jpegtran has new features for lossless image transformations (rotation +and flipping) as well as "lossless" reduction to grayscale. + +jpegtran now copies comments by default; it has a -copy switch to enable +copying all APPn blocks as well, or to suppress comments. (Formerly it +always suppressed comments and APPn blocks.) jpegtran now also preserves +JFIF version and resolution information. + +New decompressor library feature: COM and APPn markers found in the input +file can be saved in memory for later use by the application. (Before, +you had to code this up yourself with a custom marker processor.) + +There is an unused field "void * client_data" now in compress and decompress +parameter structs; this may be useful in some applications. + +JFIF version number information is now saved by the decoder and accepted by +the encoder. jpegtran uses this to copy the source file's version number, +to ensure "jpegtran -copy all" won't create bogus files that contain JFXX +extensions but claim to be version 1.01. Applications that generate their +own JFXX extension markers also (finally) have a supported way to cause the +encoder to emit JFIF version number 1.02. + +djpeg's trace mode reports JFIF 1.02 thumbnail images as such, rather +than as unknown APP0 markers. + +In -verbose mode, djpeg and rdjpgcom will try to print the contents of +APP12 markers as text. Some digital cameras store useful text information +in APP12 markers. + +Handling of truncated data streams is more robust: blocks beyond the one in +which the error occurs will be output as uniform gray, or left unchanged +if decoding a progressive JPEG. The appearance no longer depends on the +Huffman tables being used. + +Huffman tables are checked for validity much more carefully than before. + +To avoid the Unisys LZW patent, djpeg's GIF output capability has been +changed to produce "uncompressed GIFs", and cjpeg's GIF input capability +has been removed altogether. We're not happy about it either, but there +seems to be no good alternative. + +The configure script now supports building libjpeg as a shared library +on many flavors of Unix (all the ones that GNU libtool knows how to +build shared libraries for). Use "./configure --enable-shared" to +try this out. + +New jconfig file and makefiles for Microsoft Visual C++ and Developer Studio. +Also, a jconfig file and a build script for Metrowerks CodeWarrior +on Apple Macintosh. makefile.dj has been updated for DJGPP v2, and there +are miscellaneous other minor improvements in the makefiles. + +jmemmac.c now knows how to create temporary files following Mac System 7 +conventions. + +djpeg's -map switch is now able to read raw-format PPM files reliably. + +cjpeg -progressive -restart no longer generates any unnecessary DRI markers. + +Multiple calls to jpeg_simple_progression for a single JPEG object +no longer leak memory. + + +Version 6a 7-Feb-96 +-------------------- + +Library initialization sequence modified to detect version mismatches +and struct field packing mismatches between library and calling application. +This change requires applications to be recompiled, but does not require +any application source code change. + +All routine declarations changed to the style "GLOBAL(type) name ...", +that is, GLOBAL, LOCAL, METHODDEF, EXTERN are now macros taking the +routine's return type as an argument. This makes it possible to add +Microsoft-style linkage keywords to all the routines by changing just +these macros. Note that any application code that was using these macros +will have to be changed. + +DCT coefficient quantization tables are now stored in normal array order +rather than zigzag order. Application code that calls jpeg_add_quant_table, +or otherwise manipulates quantization tables directly, will need to be +changed. If you need to make such code work with either older or newer +versions of the library, a test like "#if JPEG_LIB_VERSION >= 61" is +recommended. + +djpeg's trace capability now dumps DQT tables in natural order, not zigzag +order. This allows the trace output to be made into a "-qtables" file +more easily. + +New system-dependent memory manager module for use on Apple Macintosh. + +Fix bug in cjpeg's -smooth option: last one or two scanlines would be +duplicates of the prior line unless the image height mod 16 was 1 or 2. + +Repair minor problems in VMS, BCC, MC6 makefiles. + +New configure script based on latest GNU Autoconf. + +Correct the list of include files needed by MetroWerks C for ccommand(). + +Numerous small documentation updates. + + +Version 6 2-Aug-95 +------------------- + +Progressive JPEG support: library can read and write full progressive JPEG +files. A "buffered image" mode supports incremental decoding for on-the-fly +display of progressive images. Simply recompiling an existing IJG-v5-based +decoder with v6 should allow it to read progressive files, though of course +without any special progressive display. + +New "jpegtran" application performs lossless transcoding between different +JPEG formats; primarily, it can be used to convert baseline to progressive +JPEG and vice versa. In support of jpegtran, the library now allows lossless +reading and writing of JPEG files as DCT coefficient arrays. This ability +may be of use in other applications. + +Notes for programmers: +* We changed jpeg_start_decompress() to be able to suspend; this makes all +decoding modes available to suspending-input applications. However, +existing applications that use suspending input will need to be changed +to check the return value from jpeg_start_decompress(). You don't need to +do anything if you don't use a suspending data source. +* We changed the interface to the virtual array routines: access_virt_array +routines now take a count of the number of rows to access this time. The +last parameter to request_virt_array routines is now interpreted as the +maximum number of rows that may be accessed at once, but not necessarily +the height of every access. + + +Version 5b 15-Mar-95 +--------------------- + +Correct bugs with grayscale images having v_samp_factor > 1. + +jpeg_write_raw_data() now supports output suspension. + +Correct bugs in "configure" script for case of compiling in +a directory other than the one containing the source files. + +Repair bug in jquant1.c: sometimes didn't use as many colors as it could. + +Borland C makefile and jconfig file work under either MS-DOS or OS/2. + +Miscellaneous improvements to documentation. + + +Version 5a 7-Dec-94 +-------------------- + +Changed color conversion roundoff behavior so that grayscale values are +represented exactly. (This causes test image files to change.) + +Make ordered dither use 16x16 instead of 4x4 pattern for a small quality +improvement. + +New configure script based on latest GNU Autoconf. +Fix configure script to handle CFLAGS correctly. +Rename *.auto files to *.cfg, so that configure script still works if +file names have been truncated for DOS. + +Fix bug in rdbmp.c: didn't allow for extra data between header and image. + +Modify rdppm.c/wrppm.c to handle 2-byte raw PPM/PGM formats for 12-bit data. + +Fix several bugs in rdrle.c. + +NEED_SHORT_EXTERNAL_NAMES option was broken. + +Revise jerror.h/jerror.c for more flexibility in message table. + +Repair oversight in jmemname.c NO_MKTEMP case: file could be there +but unreadable. + + +Version 5 24-Sep-94 +-------------------- + +Version 5 represents a nearly complete redesign and rewrite of the IJG +software. Major user-visible changes include: + * Automatic configuration simplifies installation for most Unix systems. + * A range of speed vs. image quality tradeoffs are supported. + This includes resizing of an image during decompression: scaling down + by a factor of 1/2, 1/4, or 1/8 is handled very efficiently. + * New programs rdjpgcom and wrjpgcom allow insertion and extraction + of text comments in a JPEG file. + +The application programmer's interface to the library has changed completely. +Notable improvements include: + * We have eliminated the use of callback routines for handling the + uncompressed image data. The application now sees the library as a + set of routines that it calls to read or write image data on a + scanline-by-scanline basis. + * The application image data is represented in a conventional interleaved- + pixel format, rather than as a separate array for each color channel. + This can save a copying step in many programs. + * The handling of compressed data has been cleaned up: the application can + supply routines to source or sink the compressed data. It is possible to + suspend processing on source/sink buffer overrun, although this is not + supported in all operating modes. + * All static state has been eliminated from the library, so that multiple + instances of compression or decompression can be active concurrently. + * JPEG abbreviated datastream formats are supported, ie, quantization and + Huffman tables can be stored separately from the image data. + * And not only that, but the documentation of the library has improved + considerably! + + +The last widely used release before the version 5 rewrite was version 4A of +18-Feb-93. Change logs before that point have been discarded, since they +are not of much interest after the rewrite. diff --git a/src/3rdparty/libjpeg/ckconfig.c b/src/3rdparty/libjpeg/ckconfig.c new file mode 100644 index 0000000000..e658623fa5 --- /dev/null +++ b/src/3rdparty/libjpeg/ckconfig.c @@ -0,0 +1,402 @@ +/* + * ckconfig.c + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + */ + +/* + * This program is intended to help you determine how to configure the JPEG + * software for installation on a particular system. The idea is to try to + * compile and execute this program. If your compiler fails to compile the + * program, make changes as indicated in the comments below. Once you can + * compile the program, run it, and it will produce a "jconfig.h" file for + * your system. + * + * As a general rule, each time you try to compile this program, + * pay attention only to the *first* error message you get from the compiler. + * Many C compilers will issue lots of spurious error messages once they + * have gotten confused. Go to the line indicated in the first error message, + * and read the comments preceding that line to see what to change. + * + * Almost all of the edits you may need to make to this program consist of + * changing a line that reads "#define SOME_SYMBOL" to "#undef SOME_SYMBOL", + * or vice versa. This is called defining or undefining that symbol. + */ + + +/* First we must see if your system has the include files we need. + * We start out with the assumption that your system has all the ANSI-standard + * include files. If you get any error trying to include one of these files, + * undefine the corresponding HAVE_xxx symbol. + */ + +#define HAVE_STDDEF_H /* replace 'define' by 'undef' if error here */ +#ifdef HAVE_STDDEF_H /* next line will be skipped if you undef... */ +#include +#endif + +#define HAVE_STDLIB_H /* same thing for stdlib.h */ +#ifdef HAVE_STDLIB_H +#include +#endif + +#include /* If you ain't got this, you ain't got C. */ + +/* We have to see if your string functions are defined by + * strings.h (old BSD convention) or string.h (everybody else). + * We try the non-BSD convention first; define NEED_BSD_STRINGS + * if the compiler says it can't find string.h. + */ + +#undef NEED_BSD_STRINGS + +#ifdef NEED_BSD_STRINGS +#include +#else +#include +#endif + +/* On some systems (especially older Unix machines), type size_t is + * defined only in the include file . If you get a failure + * on the size_t test below, try defining NEED_SYS_TYPES_H. + */ + +#undef NEED_SYS_TYPES_H /* start by assuming we don't need it */ +#ifdef NEED_SYS_TYPES_H +#include +#endif + + +/* Usually type size_t is defined in one of the include files we've included + * above. If not, you'll get an error on the "typedef size_t my_size_t;" line. + * In that case, first try defining NEED_SYS_TYPES_H just above. + * If that doesn't work, you'll have to search through your system library + * to figure out which include file defines "size_t". Look for a line that + * says "typedef something-or-other size_t;". Then, change the line below + * that says "#include " to instead include the file + * you found size_t in, and define NEED_SPECIAL_INCLUDE. If you can't find + * type size_t anywhere, try replacing "#include " with + * "typedef unsigned int size_t;". + */ + +#undef NEED_SPECIAL_INCLUDE /* assume we DON'T need it, for starters */ + +#ifdef NEED_SPECIAL_INCLUDE +#include +#endif + +typedef size_t my_size_t; /* The payoff: do we have size_t now? */ + + +/* The next question is whether your compiler supports ANSI-style function + * prototypes. You need to know this in order to choose between using + * makefile.ansi and using makefile.unix. + * The #define line below is set to assume you have ANSI function prototypes. + * If you get an error in this group of lines, undefine HAVE_PROTOTYPES. + */ + +#define HAVE_PROTOTYPES + +#ifdef HAVE_PROTOTYPES +int testfunction (int arg1, int * arg2); /* check prototypes */ + +struct methods_struct { /* check method-pointer declarations */ + int (*error_exit) (char *msgtext); + int (*trace_message) (char *msgtext); + int (*another_method) (void); +}; + +int testfunction (int arg1, int * arg2) /* check definitions */ +{ + return arg2[arg1]; +} + +int test2function (void) /* check void arg list */ +{ + return 0; +} +#endif + + +/* Now we want to find out if your compiler knows what "unsigned char" means. + * If you get an error on the "unsigned char un_char;" line, + * then undefine HAVE_UNSIGNED_CHAR. + */ + +#define HAVE_UNSIGNED_CHAR + +#ifdef HAVE_UNSIGNED_CHAR +unsigned char un_char; +#endif + + +/* Now we want to find out if your compiler knows what "unsigned short" means. + * If you get an error on the "unsigned short un_short;" line, + * then undefine HAVE_UNSIGNED_SHORT. + */ + +#define HAVE_UNSIGNED_SHORT + +#ifdef HAVE_UNSIGNED_SHORT +unsigned short un_short; +#endif + + +/* Now we want to find out if your compiler understands type "void". + * If you get an error anywhere in here, undefine HAVE_VOID. + */ + +#define HAVE_VOID + +#ifdef HAVE_VOID +/* Caution: a C++ compiler will insist on complete prototypes */ +typedef void * void_ptr; /* check void * */ +#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */ +typedef void (*void_func) (int a, int b); +#else +typedef void (*void_func) (); +#endif + +#ifdef HAVE_PROTOTYPES /* check void function result */ +void test3function (void_ptr arg1, void_func arg2) +#else +void test3function (arg1, arg2) + void_ptr arg1; + void_func arg2; +#endif +{ + char * locptr = (char *) arg1; /* check casting to and from void * */ + arg1 = (void *) locptr; + (*arg2) (1, 2); /* check call of fcn returning void */ +} +#endif + + +/* Now we want to find out if your compiler knows what "const" means. + * If you get an error here, undefine HAVE_CONST. + */ + +#define HAVE_CONST + +#ifdef HAVE_CONST +static const int carray[3] = {1, 2, 3}; + +#ifdef HAVE_PROTOTYPES +int test4function (const int arg1) +#else +int test4function (arg1) + const int arg1; +#endif +{ + return carray[arg1]; +} +#endif + + +/* If you get an error or warning about this structure definition, + * define INCOMPLETE_TYPES_BROKEN. + */ + +#undef INCOMPLETE_TYPES_BROKEN + +#ifndef INCOMPLETE_TYPES_BROKEN +typedef struct undefined_structure * undef_struct_ptr; +#endif + + +/* If you get an error about duplicate names, + * define NEED_SHORT_EXTERNAL_NAMES. + */ + +#undef NEED_SHORT_EXTERNAL_NAMES + +#ifndef NEED_SHORT_EXTERNAL_NAMES + +int possibly_duplicate_function () +{ + return 0; +} + +int possibly_dupli_function () +{ + return 1; +} + +#endif + + + +/************************************************************************ + * OK, that's it. You should not have to change anything beyond this + * point in order to compile and execute this program. (You might get + * some warnings, but you can ignore them.) + * When you run the program, it will make a couple more tests that it + * can do automatically, and then it will create jconfig.h and print out + * any additional suggestions it has. + ************************************************************************ + */ + + +#ifdef HAVE_PROTOTYPES +int is_char_signed (int arg) +#else +int is_char_signed (arg) + int arg; +#endif +{ + if (arg == 189) { /* expected result for unsigned char */ + return 0; /* type char is unsigned */ + } + else if (arg != -67) { /* expected result for signed char */ + printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + } + return 1; /* assume char is signed otherwise */ +} + + +#ifdef HAVE_PROTOTYPES +int is_shifting_signed (long arg) +#else +int is_shifting_signed (arg) + long arg; +#endif +/* See whether right-shift on a long is signed or not. */ +{ + long res = arg >> 4; + + if (res == -0x7F7E80CL) { /* expected result for signed shift */ + return 1; /* right shift is signed */ + } + /* see if unsigned-shift hack will fix it. */ + /* we can't just test exact value since it depends on width of long... */ + res |= (~0L) << (32-4); + if (res == -0x7F7E80CL) { /* expected result now? */ + return 0; /* right shift is unsigned */ + } + printf("Right shift isn't acting as I expect it to.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + return 0; /* try it with unsigned anyway */ +} + + +#ifdef HAVE_PROTOTYPES +int main (int argc, char ** argv) +#else +int main (argc, argv) + int argc; + char ** argv; +#endif +{ + char signed_char_check = (char) (-67); + FILE *outfile; + + /* Attempt to write jconfig.h */ + if ((outfile = fopen("jconfig.h", "w")) == NULL) { + printf("Failed to write jconfig.h\n"); + return 1; + } + + /* Write out all the info */ + fprintf(outfile, "/* jconfig.h --- generated by ckconfig.c */\n"); + fprintf(outfile, "/* see jconfig.txt for explanations */\n\n"); +#ifdef HAVE_PROTOTYPES + fprintf(outfile, "#define HAVE_PROTOTYPES\n"); +#else + fprintf(outfile, "#undef HAVE_PROTOTYPES\n"); +#endif +#ifdef HAVE_UNSIGNED_CHAR + fprintf(outfile, "#define HAVE_UNSIGNED_CHAR\n"); +#else + fprintf(outfile, "#undef HAVE_UNSIGNED_CHAR\n"); +#endif +#ifdef HAVE_UNSIGNED_SHORT + fprintf(outfile, "#define HAVE_UNSIGNED_SHORT\n"); +#else + fprintf(outfile, "#undef HAVE_UNSIGNED_SHORT\n"); +#endif +#ifdef HAVE_VOID + fprintf(outfile, "/* #define void char */\n"); +#else + fprintf(outfile, "#define void char\n"); +#endif +#ifdef HAVE_CONST + fprintf(outfile, "/* #define const */\n"); +#else + fprintf(outfile, "#define const\n"); +#endif + if (is_char_signed((int) signed_char_check)) + fprintf(outfile, "#undef CHAR_IS_UNSIGNED\n"); + else + fprintf(outfile, "#define CHAR_IS_UNSIGNED\n"); +#ifdef HAVE_STDDEF_H + fprintf(outfile, "#define HAVE_STDDEF_H\n"); +#else + fprintf(outfile, "#undef HAVE_STDDEF_H\n"); +#endif +#ifdef HAVE_STDLIB_H + fprintf(outfile, "#define HAVE_STDLIB_H\n"); +#else + fprintf(outfile, "#undef HAVE_STDLIB_H\n"); +#endif +#ifdef NEED_BSD_STRINGS + fprintf(outfile, "#define NEED_BSD_STRINGS\n"); +#else + fprintf(outfile, "#undef NEED_BSD_STRINGS\n"); +#endif +#ifdef NEED_SYS_TYPES_H + fprintf(outfile, "#define NEED_SYS_TYPES_H\n"); +#else + fprintf(outfile, "#undef NEED_SYS_TYPES_H\n"); +#endif + fprintf(outfile, "#undef NEED_FAR_POINTERS\n"); +#ifdef NEED_SHORT_EXTERNAL_NAMES + fprintf(outfile, "#define NEED_SHORT_EXTERNAL_NAMES\n"); +#else + fprintf(outfile, "#undef NEED_SHORT_EXTERNAL_NAMES\n"); +#endif +#ifdef INCOMPLETE_TYPES_BROKEN + fprintf(outfile, "#define INCOMPLETE_TYPES_BROKEN\n"); +#else + fprintf(outfile, "#undef INCOMPLETE_TYPES_BROKEN\n"); +#endif + fprintf(outfile, "\n#ifdef JPEG_INTERNALS\n\n"); + if (is_shifting_signed(-0x7F7E80B1L)) + fprintf(outfile, "#undef RIGHT_SHIFT_IS_UNSIGNED\n"); + else + fprintf(outfile, "#define RIGHT_SHIFT_IS_UNSIGNED\n"); + fprintf(outfile, "\n#endif /* JPEG_INTERNALS */\n"); + fprintf(outfile, "\n#ifdef JPEG_CJPEG_DJPEG\n\n"); + fprintf(outfile, "#define BMP_SUPPORTED /* BMP image file format */\n"); + fprintf(outfile, "#define GIF_SUPPORTED /* GIF image file format */\n"); + fprintf(outfile, "#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */\n"); + fprintf(outfile, "#undef RLE_SUPPORTED /* Utah RLE image file format */\n"); + fprintf(outfile, "#define TARGA_SUPPORTED /* Targa image file format */\n\n"); + fprintf(outfile, "#undef TWO_FILE_COMMANDLINE /* You may need this on non-Unix systems */\n"); + fprintf(outfile, "#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */\n"); + fprintf(outfile, "#undef DONT_USE_B_MODE\n"); + fprintf(outfile, "/* #define PROGRESS_REPORT */ /* optional */\n"); + fprintf(outfile, "\n#endif /* JPEG_CJPEG_DJPEG */\n"); + + /* Close the jconfig.h file */ + fclose(outfile); + + /* User report */ + printf("Configuration check for Independent JPEG Group's software done.\n"); + printf("\nI have written the jconfig.h file for you.\n\n"); +#ifdef HAVE_PROTOTYPES + printf("You should use makefile.ansi as the starting point for your Makefile.\n"); +#else + printf("You should use makefile.unix as the starting point for your Makefile.\n"); +#endif + +#ifdef NEED_SPECIAL_INCLUDE + printf("\nYou'll need to change jconfig.h to include the system include file\n"); + printf("that you found type size_t in, or add a direct definition of type\n"); + printf("size_t if that's what you used. Just add it to the end.\n"); +#endif + + return 0; +} diff --git a/src/3rdparty/libjpeg/coderules.txt b/src/3rdparty/libjpeg/coderules.txt new file mode 100644 index 0000000000..357929fb44 --- /dev/null +++ b/src/3rdparty/libjpeg/coderules.txt @@ -0,0 +1,118 @@ +IJG JPEG LIBRARY: CODING RULES + +Copyright (C) 1991-1996, Thomas G. Lane. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +Since numerous people will be contributing code and bug fixes, it's important +to establish a common coding style. The goal of using similar coding styles +is much more important than the details of just what that style is. + +In general we follow the recommendations of "Recommended C Style and Coding +Standards" revision 6.1 (Cannon et al. as modified by Spencer, Keppel and +Brader). This document is available in the IJG FTP archive (see +jpeg/doc/cstyle.ms.tbl.Z, or cstyle.txt.Z for those without nroff/tbl). + +Block comments should be laid out thusly: + +/* + * Block comments in this style. + */ + +We indent statements in K&R style, e.g., + if (test) { + then-part; + } else { + else-part; + } +with two spaces per indentation level. (This indentation convention is +handled automatically by GNU Emacs and many other text editors.) + +Multi-word names should be written in lower case with underscores, e.g., +multi_word_name (not multiWordName). Preprocessor symbols and enum constants +are similar but upper case (MULTI_WORD_NAME). Names should be unique within +the first fifteen characters. (On some older systems, global names must be +unique within six characters. We accommodate this without cluttering the +source code by using macros to substitute shorter names.) + +We use function prototypes everywhere; we rely on automatic source code +transformation to feed prototype-less C compilers. Transformation is done +by the simple and portable tool 'ansi2knr.c' (courtesy of Ghostscript). +ansi2knr is not very bright, so it imposes a format requirement on function +declarations: the function name MUST BEGIN IN COLUMN 1. Thus all functions +should be written in the following style: + +LOCAL(int *) +function_name (int a, char *b) +{ + code... +} + +Note that each function definition must begin with GLOBAL(type), LOCAL(type), +or METHODDEF(type). These macros expand to "static type" or just "type" as +appropriate. They provide a readable indication of the routine's usage and +can readily be changed for special needs. (For instance, special linkage +keywords can be inserted for use in Windows DLLs.) + +ansi2knr does not transform method declarations (function pointers in +structs). We handle these with a macro JMETHOD, defined as + #ifdef HAVE_PROTOTYPES + #define JMETHOD(type,methodname,arglist) type (*methodname) arglist + #else + #define JMETHOD(type,methodname,arglist) type (*methodname) () + #endif +which is used like this: + struct function_pointers { + JMETHOD(void, init_entropy_encoder, (int somearg, jparms *jp)); + JMETHOD(void, term_entropy_encoder, (void)); + }; +Note the set of parentheses surrounding the parameter list. + +A similar solution is used for forward and external function declarations +(see the EXTERN and JPP macros). + +If the code is to work on non-ANSI compilers, we cannot rely on a prototype +declaration to coerce actual parameters into the right types. Therefore, use +explicit casts on actual parameters whenever the actual parameter type is not +identical to the formal parameter. Beware of implicit conversions to "int". + +It seems there are some non-ANSI compilers in which the sizeof() operator +is defined to return int, yet size_t is defined as long. Needless to say, +this is brain-damaged. Always use the SIZEOF() macro in place of sizeof(), +so that the result is guaranteed to be of type size_t. + + +The JPEG library is intended to be used within larger programs. Furthermore, +we want it to be reentrant so that it can be used by applications that process +multiple images concurrently. The following rules support these requirements: + +1. Avoid direct use of file I/O, "malloc", error report printouts, etc; +pass these through the common routines provided. + +2. Minimize global namespace pollution. Functions should be declared static +wherever possible. (Note that our method-based calling conventions help this +a lot: in many modules only the initialization function will ever need to be +called directly, so only that function need be externally visible.) All +global function names should begin with "jpeg_", and should have an +abbreviated name (unique in the first six characters) substituted by macro +when NEED_SHORT_EXTERNAL_NAMES is set. + +3. Don't use global variables; anything that must be used in another module +should be in the common data structures. + +4. Don't use static variables except for read-only constant tables. Variables +that should be private to a module can be placed into private structures (see +the system architecture document, structure.txt). + +5. Source file names should begin with "j" for files that are part of the +library proper; source files that are not part of the library, such as cjpeg.c +and djpeg.c, do not begin with "j". Keep source file names to eight +characters (plus ".c" or ".h", etc) to make life easy for MS-DOSers. Keep +compression and decompression code in separate source files --- some +applications may want only one half of the library. + +Note: these rules (particularly #4) are not followed religiously in the +modules that are used in cjpeg/djpeg but are not part of the JPEG library +proper. Those modules are not really intended to be used in other +applications. diff --git a/src/3rdparty/libjpeg/example.c b/src/3rdparty/libjpeg/example.c new file mode 100644 index 0000000000..1d6f6cc30b --- /dev/null +++ b/src/3rdparty/libjpeg/example.c @@ -0,0 +1,433 @@ +/* + * example.c + * + * This file illustrates how to use the IJG code as a subroutine library + * to read or write JPEG image files. You should look at this code in + * conjunction with the documentation file libjpeg.txt. + * + * This code will not do anything useful as-is, but it may be helpful as a + * skeleton for constructing routines that call the JPEG library. + * + * We present these routines in the same coding style used in the JPEG code + * (ANSI function definitions, etc); but you are of course free to code your + * routines in a different style if you prefer. + */ + +#include + +/* + * Include file for users of JPEG library. + * You will need to have included system headers that define at least + * the typedefs FILE and size_t before you can include jpeglib.h. + * (stdio.h is sufficient on ANSI-conforming systems.) + * You may also wish to include "jerror.h". + */ + +#include "jpeglib.h" + +/* + * is used for the optional error recovery mechanism shown in + * the second part of the example. + */ + +#include + + + +/******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/ + +/* This half of the example shows how to feed data into the JPEG compressor. + * We present a minimal version that does not worry about refinements such + * as error recovery (the JPEG code will just exit() if it gets an error). + */ + + +/* + * IMAGE DATA FORMATS: + * + * The standard input image format is a rectangular array of pixels, with + * each pixel having the same number of "component" values (color channels). + * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars). + * If you are working with color data, then the color values for each pixel + * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit + * RGB color. + * + * For this example, we'll assume that this data structure matches the way + * our application has stored the image in memory, so we can just pass a + * pointer to our image buffer. In particular, let's say that the image is + * RGB color and is described by: + */ + +extern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */ +extern int image_height; /* Number of rows in image */ +extern int image_width; /* Number of columns in image */ + + +/* + * Sample routine for JPEG compression. We assume that the target file name + * and a compression quality factor are passed in. + */ + +GLOBAL(void) +write_JPEG_file (char * filename, int quality) +{ + /* This struct contains the JPEG compression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + * It is possible to have several such structures, representing multiple + * compression/decompression processes, in existence at once. We refer + * to any one struct (and its associated working data) as a "JPEG object". + */ + struct jpeg_compress_struct cinfo; + /* This struct represents a JPEG error handler. It is declared separately + * because applications often want to supply a specialized error handler + * (see the second half of this file for an example). But here we just + * take the easy way out and use the standard error handler, which will + * print a message on stderr and call exit() if compression fails. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct jpeg_error_mgr jerr; + /* More stuff */ + FILE * outfile; /* target file */ + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + int row_stride; /* physical row width in image buffer */ + + /* Step 1: allocate and initialize JPEG compression object */ + + /* We have to set up the error handler first, in case the initialization + * step fails. (Unlikely, but it could happen if you are out of memory.) + * This routine fills in the contents of struct jerr, and returns jerr's + * address which we place into the link field in cinfo. + */ + cinfo.err = jpeg_std_error(&jerr); + /* Now we can initialize the JPEG compression object. */ + jpeg_create_compress(&cinfo); + + /* Step 2: specify data destination (eg, a file) */ + /* Note: steps 2 and 3 can be done in either order. */ + + /* Here we use the library-supplied code to send compressed data to a + * stdio stream. You can also write your own code to do something else. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to write binary files. + */ + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + + /* Step 3: set parameters for compression */ + + /* First we supply a description of the input image. + * Four fields of the cinfo struct must be filled in: + */ + cinfo.image_width = image_width; /* image width and height, in pixels */ + cinfo.image_height = image_height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + /* Now use the library's routine to set default compression parameters. + * (You must set at least cinfo.in_color_space before calling this, + * since the defaults depend on the source color space.) + */ + jpeg_set_defaults(&cinfo); + /* Now you can set any non-default parameters you wish to. + * Here we just illustrate the use of quality (quantization table) scaling: + */ + jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); + + /* Step 4: Start compressor */ + + /* TRUE ensures that we will write a complete interchange-JPEG file. + * Pass TRUE unless you are very sure of what you're doing. + */ + jpeg_start_compress(&cinfo, TRUE); + + /* Step 5: while (scan lines remain to be written) */ + /* jpeg_write_scanlines(...); */ + + /* Here we use the library's state variable cinfo.next_scanline as the + * loop counter, so that we don't have to keep track ourselves. + * To keep things simple, we pass one scanline per call; you can pass + * more if you wish, though. + */ + row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + /* jpeg_write_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could pass + * more than one scanline at a time if that's more convenient. + */ + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + + /* Step 6: Finish compression */ + + jpeg_finish_compress(&cinfo); + /* After finish_compress, we can close the output file. */ + fclose(outfile); + + /* Step 7: release JPEG compression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_compress(&cinfo); + + /* And we're done! */ +} + + +/* + * SOME FINE POINTS: + * + * In the above loop, we ignored the return value of jpeg_write_scanlines, + * which is the number of scanlines actually written. We could get away + * with this because we were only relying on the value of cinfo.next_scanline, + * which will be incremented correctly. If you maintain additional loop + * variables then you should be careful to increment them properly. + * Actually, for output to a stdio stream you needn't worry, because + * then jpeg_write_scanlines will write all the lines passed (or else exit + * with a fatal error). Partial writes can only occur if you use a data + * destination module that can demand suspension of the compressor. + * (If you don't know what that's for, you don't need it.) + * + * If the compressor requires full-image buffers (for entropy-coding + * optimization or a multi-scan JPEG file), it will create temporary + * files for anything that doesn't fit within the maximum-memory setting. + * (Note that temp files are NOT needed if you use the default parameters.) + * On some systems you may need to set up a signal handler to ensure that + * temporary files are deleted if the program is interrupted. See libjpeg.txt. + * + * Scanlines MUST be supplied in top-to-bottom order if you want your JPEG + * files to be compatible with everyone else's. If you cannot readily read + * your data in that order, you'll need an intermediate array to hold the + * image. See rdtarga.c or rdbmp.c for examples of handling bottom-to-top + * source data using the JPEG code's internal virtual-array mechanisms. + */ + + + +/******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/ + +/* This half of the example shows how to read data from the JPEG decompressor. + * It's a bit more refined than the above, in that we show: + * (a) how to modify the JPEG library's standard error-reporting behavior; + * (b) how to allocate workspace using the library's memory manager. + * + * Just to make this example a little different from the first one, we'll + * assume that we do not intend to put the whole image into an in-memory + * buffer, but to send it line-by-line someplace else. We need a one- + * scanline-high JSAMPLE array as a work buffer, and we will let the JPEG + * memory manager allocate it for us. This approach is actually quite useful + * because we don't need to remember to deallocate the buffer separately: it + * will go away automatically when the JPEG object is cleaned up. + */ + + +/* + * ERROR HANDLING: + * + * The JPEG library's standard error handler (jerror.c) is divided into + * several "methods" which you can override individually. This lets you + * adjust the behavior without duplicating a lot of code, which you might + * have to update with each future release. + * + * Our example here shows how to override the "error_exit" method so that + * control is returned to the library's caller when a fatal error occurs, + * rather than calling exit() as the standard error_exit method does. + * + * We use C's setjmp/longjmp facility to return control. This means that the + * routine which calls the JPEG library must first execute a setjmp() call to + * establish the return point. We want the replacement error_exit to do a + * longjmp(). But we need to make the setjmp buffer accessible to the + * error_exit routine. To do this, we make a private extension of the + * standard JPEG error handler object. (If we were using C++, we'd say we + * were making a subclass of the regular error handler.) + * + * Here's the extended error handler struct: + */ + +struct my_error_mgr { + struct jpeg_error_mgr pub; /* "public" fields */ + + jmp_buf setjmp_buffer; /* for return to caller */ +}; + +typedef struct my_error_mgr * my_error_ptr; + +/* + * Here's the routine that will replace the standard error_exit method: + */ + +METHODDEF(void) +my_error_exit (j_common_ptr cinfo) +{ + /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ + my_error_ptr myerr = (my_error_ptr) cinfo->err; + + /* Always display the message. */ + /* We could postpone this until after returning, if we chose. */ + (*cinfo->err->output_message) (cinfo); + + /* Return control to the setjmp point */ + longjmp(myerr->setjmp_buffer, 1); +} + + +/* + * Sample routine for JPEG decompression. We assume that the source file name + * is passed in. We want to return 1 on success, 0 on error. + */ + + +GLOBAL(int) +read_JPEG_file (char * filename) +{ + /* This struct contains the JPEG decompression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + */ + struct jpeg_decompress_struct cinfo; + /* We use our private extension JPEG error handler. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct my_error_mgr jerr; + /* More stuff */ + FILE * infile; /* source file */ + JSAMPARRAY buffer; /* Output row buffer */ + int row_stride; /* physical row width in output buffer */ + + /* In this example we want to open the input file before doing anything else, + * so that the setjmp() error recovery below can assume the file is open. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to read binary files. + */ + + if ((infile = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + return 0; + } + + /* Step 1: allocate and initialize JPEG decompression object */ + + /* We set up the normal JPEG error routines, then override error_exit. */ + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = my_error_exit; + /* Establish the setjmp return context for my_error_exit to use. */ + if (setjmp(jerr.setjmp_buffer)) { + /* If we get here, the JPEG code has signaled an error. + * We need to clean up the JPEG object, close the input file, and return. + */ + jpeg_destroy_decompress(&cinfo); + fclose(infile); + return 0; + } + /* Now we can initialize the JPEG decompression object. */ + jpeg_create_decompress(&cinfo); + + /* Step 2: specify data source (eg, a file) */ + + jpeg_stdio_src(&cinfo, infile); + + /* Step 3: read file parameters with jpeg_read_header() */ + + (void) jpeg_read_header(&cinfo, TRUE); + /* We can ignore the return value from jpeg_read_header since + * (a) suspension is not possible with the stdio data source, and + * (b) we passed TRUE to reject a tables-only JPEG file as an error. + * See libjpeg.txt for more info. + */ + + /* Step 4: set parameters for decompression */ + + /* In this example, we don't need to change any of the defaults set by + * jpeg_read_header(), so we do nothing here. + */ + + /* Step 5: Start decompressor */ + + (void) jpeg_start_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* We may need to do some setup of our own at this point before reading + * the data. After jpeg_start_decompress() we have the correct scaled + * output image dimensions available, as well as the output colormap + * if we asked for color quantization. + * In this example, we need to make an output work buffer of the right size. + */ + /* JSAMPLEs per row in output buffer */ + row_stride = cinfo.output_width * cinfo.output_components; + /* Make a one-row-high sample array that will go away when done with image */ + buffer = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + + /* Step 6: while (scan lines remain to be read) */ + /* jpeg_read_scanlines(...); */ + + /* Here we use the library's state variable cinfo.output_scanline as the + * loop counter, so that we don't have to keep track ourselves. + */ + while (cinfo.output_scanline < cinfo.output_height) { + /* jpeg_read_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could ask for + * more than one scanline at a time if that's more convenient. + */ + (void) jpeg_read_scanlines(&cinfo, buffer, 1); + /* Assume put_scanline_someplace wants a pointer and sample count. */ + put_scanline_someplace(buffer[0], row_stride); + } + + /* Step 7: Finish decompression */ + + (void) jpeg_finish_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* Step 8: Release JPEG decompression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_decompress(&cinfo); + + /* After finish_decompress, we can close the input file. + * Here we postpone it until after no more JPEG errors are possible, + * so as to simplify the setjmp error logic above. (Actually, I don't + * think that jpeg_destroy can do an error exit, but why assume anything...) + */ + fclose(infile); + + /* At this point you may want to check to see whether any corrupt-data + * warnings occurred (test whether jerr.pub.num_warnings is nonzero). + */ + + /* And we're done! */ + return 1; +} + + +/* + * SOME FINE POINTS: + * + * In the above code, we ignored the return value of jpeg_read_scanlines, + * which is the number of scanlines actually read. We could get away with + * this because we asked for only one line at a time and we weren't using + * a suspending data source. See libjpeg.txt for more info. + * + * We cheated a bit by calling alloc_sarray() after jpeg_start_decompress(); + * we should have done it beforehand to ensure that the space would be + * counted against the JPEG max_memory setting. In some systems the above + * code would risk an out-of-memory error. However, in general we don't + * know the output image dimensions before jpeg_start_decompress(), unless we + * call jpeg_calc_output_dimensions(). See libjpeg.txt for more about this. + * + * Scanlines are returned in the same order as they appear in the JPEG file, + * which is standardly top-to-bottom. If you must emit data bottom-to-top, + * you can use one of the virtual arrays provided by the JPEG memory manager + * to invert the data. See wrbmp.c for an example. + * + * As with compression, some operating modes may require temporary files. + * On some systems you may need to set up a signal handler to ensure that + * temporary files are deleted if the program is interrupted. See libjpeg.txt. + */ diff --git a/src/3rdparty/libjpeg/filelist.txt b/src/3rdparty/libjpeg/filelist.txt new file mode 100644 index 0000000000..7e053869a6 --- /dev/null +++ b/src/3rdparty/libjpeg/filelist.txt @@ -0,0 +1,215 @@ +IJG JPEG LIBRARY: FILE LIST + +Copyright (C) 1994-2009, Thomas G. Lane, Guido Vollbeding. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +Here is a road map to the files in the IJG JPEG distribution. The +distribution includes the JPEG library proper, plus two application +programs ("cjpeg" and "djpeg") which use the library to convert JPEG +files to and from some other popular image formats. A third application +"jpegtran" uses the library to do lossless conversion between different +variants of JPEG. There are also two stand-alone applications, +"rdjpgcom" and "wrjpgcom". + + +THE JPEG LIBRARY +================ + +Include files: + +jpeglib.h JPEG library's exported data and function declarations. +jconfig.h Configuration declarations. Note: this file is not present + in the distribution; it is generated during installation. +jmorecfg.h Additional configuration declarations; need not be changed + for a standard installation. +jerror.h Declares JPEG library's error and trace message codes. +jinclude.h Central include file used by all IJG .c files to reference + system include files. +jpegint.h JPEG library's internal data structures. +jdct.h Private declarations for forward & reverse DCT subsystems. +jmemsys.h Private declarations for memory management subsystem. +jversion.h Version information. + +Applications using the library should include jpeglib.h (which in turn +includes jconfig.h and jmorecfg.h). Optionally, jerror.h may be included +if the application needs to reference individual JPEG error codes. The +other include files are intended for internal use and would not normally +be included by an application program. (cjpeg/djpeg/etc do use jinclude.h, +since its function is to improve portability of the whole IJG distribution. +Most other applications will directly include the system include files they +want, and hence won't need jinclude.h.) + + +C source code files: + +These files contain most of the functions intended to be called directly by +an application program: + +jcapimin.c Application program interface: core routines for compression. +jcapistd.c Application program interface: standard compression. +jdapimin.c Application program interface: core routines for decompression. +jdapistd.c Application program interface: standard decompression. +jcomapi.c Application program interface routines common to compression + and decompression. +jcparam.c Compression parameter setting helper routines. +jctrans.c API and library routines for transcoding compression. +jdtrans.c API and library routines for transcoding decompression. + +Compression side of the library: + +jcinit.c Initialization: determines which other modules to use. +jcmaster.c Master control: setup and inter-pass sequencing logic. +jcmainct.c Main buffer controller (preprocessor => JPEG compressor). +jcprepct.c Preprocessor buffer controller. +jccoefct.c Buffer controller for DCT coefficient buffer. +jccolor.c Color space conversion. +jcsample.c Downsampling. +jcdctmgr.c DCT manager (DCT implementation selection & control). +jfdctint.c Forward DCT using slow-but-accurate integer method. +jfdctfst.c Forward DCT using faster, less accurate integer method. +jfdctflt.c Forward DCT using floating-point arithmetic. +jchuff.c Huffman entropy coding. +jcarith.c Arithmetic entropy coding. +jcmarker.c JPEG marker writing. +jdatadst.c Data destination managers for memory and stdio output. + +Decompression side of the library: + +jdmaster.c Master control: determines which other modules to use. +jdinput.c Input controller: controls input processing modules. +jdmainct.c Main buffer controller (JPEG decompressor => postprocessor). +jdcoefct.c Buffer controller for DCT coefficient buffer. +jdpostct.c Postprocessor buffer controller. +jdmarker.c JPEG marker reading. +jdhuff.c Huffman entropy decoding. +jdarith.c Arithmetic entropy decoding. +jddctmgr.c IDCT manager (IDCT implementation selection & control). +jidctint.c Inverse DCT using slow-but-accurate integer method. +jidctfst.c Inverse DCT using faster, less accurate integer method. +jidctflt.c Inverse DCT using floating-point arithmetic. +jdsample.c Upsampling. +jdcolor.c Color space conversion. +jdmerge.c Merged upsampling/color conversion (faster, lower quality). +jquant1.c One-pass color quantization using a fixed-spacing colormap. +jquant2.c Two-pass color quantization using a custom-generated colormap. + Also handles one-pass quantization to an externally given map. +jdatasrc.c Data source managers for memory and stdio input. + +Support files for both compression and decompression: + +jaricom.c Tables for common use in arithmetic entropy encoding and + decoding routines. +jerror.c Standard error handling routines (application replaceable). +jmemmgr.c System-independent (more or less) memory management code. +jutils.c Miscellaneous utility routines. + +jmemmgr.c relies on a system-dependent memory management module. The IJG +distribution includes the following implementations of the system-dependent +module: + +jmemnobs.c "No backing store": assumes adequate virtual memory exists. +jmemansi.c Makes temporary files with ANSI-standard routine tmpfile(). +jmemname.c Makes temporary files with program-generated file names. +jmemdos.c Custom implementation for MS-DOS (16-bit environment only): + can use extended and expanded memory as well as temp files. +jmemmac.c Custom implementation for Apple Macintosh. + +Exactly one of the system-dependent modules should be configured into an +installed JPEG library (see install.txt for hints about which one to use). +On unusual systems you may find it worthwhile to make a special +system-dependent memory manager. + + +Non-C source code files: + +jmemdosa.asm 80x86 assembly code support for jmemdos.c; used only in + MS-DOS-specific configurations of the JPEG library. + + +CJPEG/DJPEG/JPEGTRAN +==================== + +Include files: + +cdjpeg.h Declarations shared by cjpeg/djpeg/jpegtran modules. +cderror.h Additional error and trace message codes for cjpeg et al. +transupp.h Declarations for jpegtran support routines in transupp.c. + +C source code files: + +cjpeg.c Main program for cjpeg. +djpeg.c Main program for djpeg. +jpegtran.c Main program for jpegtran. +cdjpeg.c Utility routines used by all three programs. +rdcolmap.c Code to read a colormap file for djpeg's "-map" switch. +rdswitch.c Code to process some of cjpeg's more complex switches. + Also used by jpegtran. +transupp.c Support code for jpegtran: lossless image manipulations. + +Image file reader modules for cjpeg: + +rdbmp.c BMP file input. +rdgif.c GIF file input (now just a stub). +rdppm.c PPM/PGM file input. +rdrle.c Utah RLE file input. +rdtarga.c Targa file input. + +Image file writer modules for djpeg: + +wrbmp.c BMP file output. +wrgif.c GIF file output (a mere shadow of its former self). +wrppm.c PPM/PGM file output. +wrrle.c Utah RLE file output. +wrtarga.c Targa file output. + + +RDJPGCOM/WRJPGCOM +================= + +C source code files: + +rdjpgcom.c Stand-alone rdjpgcom application. +wrjpgcom.c Stand-alone wrjpgcom application. + +These programs do not depend on the IJG library. They do use +jconfig.h and jinclude.h, only to improve portability. + + +ADDITIONAL FILES +================ + +Documentation (see README for a guide to the documentation files): + +README Master documentation file. +*.txt Other documentation files. +*.1 Documentation in Unix man page format. +change.log Version-to-version change highlights. +example.c Sample code for calling JPEG library. + +Configuration/installation files and programs (see install.txt for more info): + +configure Unix shell script to perform automatic configuration. +configure.ac Source file for use with Autoconf to generate configure. +ltmain.sh Support scripts for configure (from GNU libtool). +config.guess +config.sub +depcomp +missing +install-sh Install shell script for those Unix systems lacking one. +Makefile.in Makefile input for configure. +Makefile.am Source file for use with Automake to generate Makefile.in. +ckconfig.c Program to generate jconfig.h on non-Unix systems. +jconfig.txt Template for making jconfig.h by hand. +mak*.* Sample makefiles for particular systems. +jconfig.* Sample jconfig.h for particular systems. +libjpeg.map Script to generate shared library with versioned symbols. +aclocal.m4 M4 macro definitions for use with Autoconf. +ansi2knr.c De-ANSIfier for pre-ANSI C compilers (courtesy of + L. Peter Deutsch and Aladdin Enterprises). + +Test files (see install.txt for test procedure): + +test*.* Source and comparison files for confidence test. + These are binary image files, NOT text files. diff --git a/src/3rdparty/libjpeg/jaricom.c b/src/3rdparty/libjpeg/jaricom.c new file mode 100644 index 0000000000..f43e2ea7fa --- /dev/null +++ b/src/3rdparty/libjpeg/jaricom.c @@ -0,0 +1,153 @@ +/* + * jaricom.c + * + * Developed 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains probability estimation tables for common use in + * arithmetic entropy encoding and decoding routines. + * + * This data represents Table D.2 in the JPEG spec (ISO/IEC IS 10918-1 + * and CCITT Recommendation ITU-T T.81) and Table 24 in the JBIG spec + * (ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82). + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +/* The following #define specifies the packing of the four components + * into the compact INT32 representation. + * Note that this formula must match the actual arithmetic encoder + * and decoder implementation. The implementation has to be changed + * if this formula is changed. + * The current organization is leaned on Markus Kuhn's JBIG + * implementation (jbig_tab.c). + */ + +#define V(i,a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b) + +const INT32 jpeg_aritab[113+1] = { +/* + * Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS + */ + V( 0, 0x5a1d, 1, 1, 1 ), + V( 1, 0x2586, 14, 2, 0 ), + V( 2, 0x1114, 16, 3, 0 ), + V( 3, 0x080b, 18, 4, 0 ), + V( 4, 0x03d8, 20, 5, 0 ), + V( 5, 0x01da, 23, 6, 0 ), + V( 6, 0x00e5, 25, 7, 0 ), + V( 7, 0x006f, 28, 8, 0 ), + V( 8, 0x0036, 30, 9, 0 ), + V( 9, 0x001a, 33, 10, 0 ), + V( 10, 0x000d, 35, 11, 0 ), + V( 11, 0x0006, 9, 12, 0 ), + V( 12, 0x0003, 10, 13, 0 ), + V( 13, 0x0001, 12, 13, 0 ), + V( 14, 0x5a7f, 15, 15, 1 ), + V( 15, 0x3f25, 36, 16, 0 ), + V( 16, 0x2cf2, 38, 17, 0 ), + V( 17, 0x207c, 39, 18, 0 ), + V( 18, 0x17b9, 40, 19, 0 ), + V( 19, 0x1182, 42, 20, 0 ), + V( 20, 0x0cef, 43, 21, 0 ), + V( 21, 0x09a1, 45, 22, 0 ), + V( 22, 0x072f, 46, 23, 0 ), + V( 23, 0x055c, 48, 24, 0 ), + V( 24, 0x0406, 49, 25, 0 ), + V( 25, 0x0303, 51, 26, 0 ), + V( 26, 0x0240, 52, 27, 0 ), + V( 27, 0x01b1, 54, 28, 0 ), + V( 28, 0x0144, 56, 29, 0 ), + V( 29, 0x00f5, 57, 30, 0 ), + V( 30, 0x00b7, 59, 31, 0 ), + V( 31, 0x008a, 60, 32, 0 ), + V( 32, 0x0068, 62, 33, 0 ), + V( 33, 0x004e, 63, 34, 0 ), + V( 34, 0x003b, 32, 35, 0 ), + V( 35, 0x002c, 33, 9, 0 ), + V( 36, 0x5ae1, 37, 37, 1 ), + V( 37, 0x484c, 64, 38, 0 ), + V( 38, 0x3a0d, 65, 39, 0 ), + V( 39, 0x2ef1, 67, 40, 0 ), + V( 40, 0x261f, 68, 41, 0 ), + V( 41, 0x1f33, 69, 42, 0 ), + V( 42, 0x19a8, 70, 43, 0 ), + V( 43, 0x1518, 72, 44, 0 ), + V( 44, 0x1177, 73, 45, 0 ), + V( 45, 0x0e74, 74, 46, 0 ), + V( 46, 0x0bfb, 75, 47, 0 ), + V( 47, 0x09f8, 77, 48, 0 ), + V( 48, 0x0861, 78, 49, 0 ), + V( 49, 0x0706, 79, 50, 0 ), + V( 50, 0x05cd, 48, 51, 0 ), + V( 51, 0x04de, 50, 52, 0 ), + V( 52, 0x040f, 50, 53, 0 ), + V( 53, 0x0363, 51, 54, 0 ), + V( 54, 0x02d4, 52, 55, 0 ), + V( 55, 0x025c, 53, 56, 0 ), + V( 56, 0x01f8, 54, 57, 0 ), + V( 57, 0x01a4, 55, 58, 0 ), + V( 58, 0x0160, 56, 59, 0 ), + V( 59, 0x0125, 57, 60, 0 ), + V( 60, 0x00f6, 58, 61, 0 ), + V( 61, 0x00cb, 59, 62, 0 ), + V( 62, 0x00ab, 61, 63, 0 ), + V( 63, 0x008f, 61, 32, 0 ), + V( 64, 0x5b12, 65, 65, 1 ), + V( 65, 0x4d04, 80, 66, 0 ), + V( 66, 0x412c, 81, 67, 0 ), + V( 67, 0x37d8, 82, 68, 0 ), + V( 68, 0x2fe8, 83, 69, 0 ), + V( 69, 0x293c, 84, 70, 0 ), + V( 70, 0x2379, 86, 71, 0 ), + V( 71, 0x1edf, 87, 72, 0 ), + V( 72, 0x1aa9, 87, 73, 0 ), + V( 73, 0x174e, 72, 74, 0 ), + V( 74, 0x1424, 72, 75, 0 ), + V( 75, 0x119c, 74, 76, 0 ), + V( 76, 0x0f6b, 74, 77, 0 ), + V( 77, 0x0d51, 75, 78, 0 ), + V( 78, 0x0bb6, 77, 79, 0 ), + V( 79, 0x0a40, 77, 48, 0 ), + V( 80, 0x5832, 80, 81, 1 ), + V( 81, 0x4d1c, 88, 82, 0 ), + V( 82, 0x438e, 89, 83, 0 ), + V( 83, 0x3bdd, 90, 84, 0 ), + V( 84, 0x34ee, 91, 85, 0 ), + V( 85, 0x2eae, 92, 86, 0 ), + V( 86, 0x299a, 93, 87, 0 ), + V( 87, 0x2516, 86, 71, 0 ), + V( 88, 0x5570, 88, 89, 1 ), + V( 89, 0x4ca9, 95, 90, 0 ), + V( 90, 0x44d9, 96, 91, 0 ), + V( 91, 0x3e22, 97, 92, 0 ), + V( 92, 0x3824, 99, 93, 0 ), + V( 93, 0x32b4, 99, 94, 0 ), + V( 94, 0x2e17, 93, 86, 0 ), + V( 95, 0x56a8, 95, 96, 1 ), + V( 96, 0x4f46, 101, 97, 0 ), + V( 97, 0x47e5, 102, 98, 0 ), + V( 98, 0x41cf, 103, 99, 0 ), + V( 99, 0x3c3d, 104, 100, 0 ), + V( 100, 0x375e, 99, 93, 0 ), + V( 101, 0x5231, 105, 102, 0 ), + V( 102, 0x4c0f, 106, 103, 0 ), + V( 103, 0x4639, 107, 104, 0 ), + V( 104, 0x415e, 103, 99, 0 ), + V( 105, 0x5627, 105, 106, 1 ), + V( 106, 0x50e7, 108, 107, 0 ), + V( 107, 0x4b85, 109, 103, 0 ), + V( 108, 0x5597, 110, 109, 0 ), + V( 109, 0x504f, 111, 107, 0 ), + V( 110, 0x5a10, 110, 111, 1 ), + V( 111, 0x5522, 112, 109, 0 ), + V( 112, 0x59eb, 112, 111, 1 ), +/* + * This last entry is used for fixed probability estimate of 0.5 + * as recommended in Section 10.3 Table 5 of ITU-T Rec. T.851. + */ + V( 113, 0x5a1d, 113, 113, 0 ) +}; diff --git a/src/3rdparty/libjpeg/jcapimin.c b/src/3rdparty/libjpeg/jcapimin.c new file mode 100644 index 0000000000..639ce86f44 --- /dev/null +++ b/src/3rdparty/libjpeg/jcapimin.c @@ -0,0 +1,288 @@ +/* + * jcapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the compression half + * of the JPEG library. These are the "minimum" API routines that may be + * needed in either the normal full-compression case or the transcoding-only + * case. + * + * Most of the routines intended to be called directly by an application + * are in this file or in jcapistd.c. But also see jcparam.c for + * parameter-setup helper routines, jcomapi.c for routines shared by + * compression and decompression, and jctrans.c for the transcoding case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Initialization of a JPEG compression object. + * The error manager must already be set up (in case memory manager fails). + */ + +GLOBAL(void) +jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize) +{ + int i; + + /* Guard against version mismatches between library and caller. */ + cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ + if (version != JPEG_LIB_VERSION) + ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); + if (structsize != SIZEOF(struct jpeg_compress_struct)) + ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, + (int) SIZEOF(struct jpeg_compress_struct), (int) structsize); + + /* For debugging purposes, we zero the whole master structure. + * But the application has already set the err pointer, and may have set + * client_data, so we have to save and restore those fields. + * Note: if application hasn't set client_data, tools like Purify may + * complain here. + */ + { + struct jpeg_error_mgr * err = cinfo->err; + void * client_data = cinfo->client_data; /* ignore Purify complaint here */ + MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct)); + cinfo->err = err; + cinfo->client_data = client_data; + } + cinfo->is_decompressor = FALSE; + + /* Initialize a memory manager instance for this object */ + jinit_memory_mgr((j_common_ptr) cinfo); + + /* Zero out pointers to permanent structures. */ + cinfo->progress = NULL; + cinfo->dest = NULL; + + cinfo->comp_info = NULL; + + for (i = 0; i < NUM_QUANT_TBLS; i++) { + cinfo->quant_tbl_ptrs[i] = NULL; + cinfo->q_scale_factor[i] = 100; + } + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + /* Must do it here for emit_dqt in case jpeg_write_tables is used */ + cinfo->block_size = DCTSIZE; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + + cinfo->script_space = NULL; + + cinfo->input_gamma = 1.0; /* in case application forgets */ + + /* OK, I'm ready */ + cinfo->global_state = CSTATE_START; +} + + +/* + * Destruction of a JPEG compression object + */ + +GLOBAL(void) +jpeg_destroy_compress (j_compress_ptr cinfo) +{ + jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Abort processing of a JPEG compression operation, + * but don't destroy the object itself. + */ + +GLOBAL(void) +jpeg_abort_compress (j_compress_ptr cinfo) +{ + jpeg_abort((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Forcibly suppress or un-suppress all quantization and Huffman tables. + * Marks all currently defined tables as already written (if suppress) + * or not written (if !suppress). This will control whether they get emitted + * by a subsequent jpeg_start_compress call. + * + * This routine is exported for use by applications that want to produce + * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but + * since it is called by jpeg_start_compress, we put it here --- otherwise + * jcparam.o would be linked whether the application used it or not. + */ + +GLOBAL(void) +jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress) +{ + int i; + JQUANT_TBL * qtbl; + JHUFF_TBL * htbl; + + for (i = 0; i < NUM_QUANT_TBLS; i++) { + if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL) + qtbl->sent_table = suppress; + } + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL) + htbl->sent_table = suppress; + if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL) + htbl->sent_table = suppress; + } +} + + +/* + * Finish JPEG compression. + * + * If a multipass operating mode was selected, this may do a great deal of + * work including most of the actual output. + */ + +GLOBAL(void) +jpeg_finish_compress (j_compress_ptr cinfo) +{ + JDIMENSION iMCU_row; + + if (cinfo->global_state == CSTATE_SCANNING || + cinfo->global_state == CSTATE_RAW_OK) { + /* Terminate first pass */ + if (cinfo->next_scanline < cinfo->image_height) + ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); + (*cinfo->master->finish_pass) (cinfo); + } else if (cinfo->global_state != CSTATE_WRCOEFS) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Perform any remaining passes */ + while (! cinfo->master->is_last_pass) { + (*cinfo->master->prepare_for_pass) (cinfo); + for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) { + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) iMCU_row; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + /* We bypass the main controller and invoke coef controller directly; + * all work is being done from the coefficient buffer. + */ + if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + } + (*cinfo->master->finish_pass) (cinfo); + } + /* Write EOI, do final cleanup */ + (*cinfo->marker->write_file_trailer) (cinfo); + (*cinfo->dest->term_destination) (cinfo); + /* We can use jpeg_abort to release memory and reset global_state */ + jpeg_abort((j_common_ptr) cinfo); +} + + +/* + * Write a special marker. + * This is only recommended for writing COM or APPn markers. + * Must be called after jpeg_start_compress() and before + * first call to jpeg_write_scanlines() or jpeg_write_raw_data(). + */ + +GLOBAL(void) +jpeg_write_marker (j_compress_ptr cinfo, int marker, + const JOCTET *dataptr, unsigned int datalen) +{ + JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val)); + + if (cinfo->next_scanline != 0 || + (cinfo->global_state != CSTATE_SCANNING && + cinfo->global_state != CSTATE_RAW_OK && + cinfo->global_state != CSTATE_WRCOEFS)) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); + write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */ + while (datalen--) { + (*write_marker_byte) (cinfo, *dataptr); + dataptr++; + } +} + +/* Same, but piecemeal. */ + +GLOBAL(void) +jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen) +{ + if (cinfo->next_scanline != 0 || + (cinfo->global_state != CSTATE_SCANNING && + cinfo->global_state != CSTATE_RAW_OK && + cinfo->global_state != CSTATE_WRCOEFS)) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); +} + +GLOBAL(void) +jpeg_write_m_byte (j_compress_ptr cinfo, int val) +{ + (*cinfo->marker->write_marker_byte) (cinfo, val); +} + + +/* + * Alternate compression function: just write an abbreviated table file. + * Before calling this, all parameters and a data destination must be set up. + * + * To produce a pair of files containing abbreviated tables and abbreviated + * image data, one would proceed as follows: + * + * initialize JPEG object + * set JPEG parameters + * set destination to table file + * jpeg_write_tables(cinfo); + * set destination to image file + * jpeg_start_compress(cinfo, FALSE); + * write data... + * jpeg_finish_compress(cinfo); + * + * jpeg_write_tables has the side effect of marking all tables written + * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress + * will not re-emit the tables unless it is passed write_all_tables=TRUE. + */ + +GLOBAL(void) +jpeg_write_tables (j_compress_ptr cinfo) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Initialize the marker writer ... bit of a crock to do it here. */ + jinit_marker_writer(cinfo); + /* Write them tables! */ + (*cinfo->marker->write_tables_only) (cinfo); + /* And clean up. */ + (*cinfo->dest->term_destination) (cinfo); + /* + * In library releases up through v6a, we called jpeg_abort() here to free + * any working memory allocated by the destination manager and marker + * writer. Some applications had a problem with that: they allocated space + * of their own from the library memory manager, and didn't want it to go + * away during write_tables. So now we do nothing. This will cause a + * memory leak if an app calls write_tables repeatedly without doing a full + * compression cycle or otherwise resetting the JPEG object. However, that + * seems less bad than unexpectedly freeing memory in the normal case. + * An app that prefers the old behavior can call jpeg_abort for itself after + * each call to jpeg_write_tables(). + */ +} diff --git a/src/3rdparty/libjpeg/jcapistd.c b/src/3rdparty/libjpeg/jcapistd.c new file mode 100644 index 0000000000..c0320b1b19 --- /dev/null +++ b/src/3rdparty/libjpeg/jcapistd.c @@ -0,0 +1,161 @@ +/* + * jcapistd.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the compression half + * of the JPEG library. These are the "standard" API routines that are + * used in the normal full-compression case. They are not used by a + * transcoding-only application. Note that if an application links in + * jpeg_start_compress, it will end up linking in the entire compressor. + * We thus must separate this file from jcapimin.c to avoid linking the + * whole compression library into a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Compression initialization. + * Before calling this, all parameters and a data destination must be set up. + * + * We require a write_all_tables parameter as a failsafe check when writing + * multiple datastreams from the same compression object. Since prior runs + * will have left all the tables marked sent_table=TRUE, a subsequent run + * would emit an abbreviated stream (no tables) by default. This may be what + * is wanted, but for safety's sake it should not be the default behavior: + * programmers should have to make a deliberate choice to emit abbreviated + * images. Therefore the documentation and examples should encourage people + * to pass write_all_tables=TRUE; then it will take active thought to do the + * wrong thing. + */ + +GLOBAL(void) +jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (write_all_tables) + jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */ + + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Perform master selection of active modules */ + jinit_compress_master(cinfo); + /* Set up for the first pass */ + (*cinfo->master->prepare_for_pass) (cinfo); + /* Ready for application to drive first pass through jpeg_write_scanlines + * or jpeg_write_raw_data. + */ + cinfo->next_scanline = 0; + cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING); +} + + +/* + * Write some scanlines of data to the JPEG compressor. + * + * The return value will be the number of lines actually written. + * This should be less than the supplied num_lines only in case that + * the data destination module has requested suspension of the compressor, + * or if more than image_height scanlines are passed in. + * + * Note: we warn about excess calls to jpeg_write_scanlines() since + * this likely signals an application programmer error. However, + * excess scanlines passed in the last valid call are *silently* ignored, + * so that the application need not adjust num_lines for end-of-image + * when using a multiple-scanline buffer. + */ + +GLOBAL(JDIMENSION) +jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines, + JDIMENSION num_lines) +{ + JDIMENSION row_ctr, rows_left; + + if (cinfo->global_state != CSTATE_SCANNING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->next_scanline >= cinfo->image_height) + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->next_scanline; + cinfo->progress->pass_limit = (long) cinfo->image_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Give master control module another chance if this is first call to + * jpeg_write_scanlines. This lets output of the frame/scan headers be + * delayed so that application can write COM, etc, markers between + * jpeg_start_compress and jpeg_write_scanlines. + */ + if (cinfo->master->call_pass_startup) + (*cinfo->master->pass_startup) (cinfo); + + /* Ignore any extra scanlines at bottom of image. */ + rows_left = cinfo->image_height - cinfo->next_scanline; + if (num_lines > rows_left) + num_lines = rows_left; + + row_ctr = 0; + (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines); + cinfo->next_scanline += row_ctr; + return row_ctr; +} + + +/* + * Alternate entry point to write raw data. + * Processes exactly one iMCU row per call, unless suspended. + */ + +GLOBAL(JDIMENSION) +jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data, + JDIMENSION num_lines) +{ + JDIMENSION lines_per_iMCU_row; + + if (cinfo->global_state != CSTATE_RAW_OK) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->next_scanline >= cinfo->image_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->next_scanline; + cinfo->progress->pass_limit = (long) cinfo->image_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Give master control module another chance if this is first call to + * jpeg_write_raw_data. This lets output of the frame/scan headers be + * delayed so that application can write COM, etc, markers between + * jpeg_start_compress and jpeg_write_raw_data. + */ + if (cinfo->master->call_pass_startup) + (*cinfo->master->pass_startup) (cinfo); + + /* Verify that at least one iMCU row has been passed. */ + lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE; + if (num_lines < lines_per_iMCU_row) + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* Directly compress the row. */ + if (! (*cinfo->coef->compress_data) (cinfo, data)) { + /* If compressor did not consume the whole row, suspend processing. */ + return 0; + } + + /* OK, we processed one iMCU row. */ + cinfo->next_scanline += lines_per_iMCU_row; + return lines_per_iMCU_row; +} diff --git a/src/3rdparty/libjpeg/jcarith.c b/src/3rdparty/libjpeg/jcarith.c new file mode 100644 index 0000000000..0b7ea55d40 --- /dev/null +++ b/src/3rdparty/libjpeg/jcarith.c @@ -0,0 +1,934 @@ +/* + * jcarith.c + * + * Developed 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains portable arithmetic entropy encoding routines for JPEG + * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). + * + * Both sequential and progressive modes are supported in this single module. + * + * Suspension is not currently supported in this module. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Expanded entropy encoder object for arithmetic encoding. */ + +typedef struct { + struct jpeg_entropy_encoder pub; /* public fields */ + + INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */ + INT32 a; /* A register, normalized size of coding interval */ + INT32 sc; /* counter for stacked 0xFF values which might overflow */ + INT32 zc; /* counter for pending 0x00 output values which might * + * be discarded at the end ("Pacman" termination) */ + int ct; /* bit shift counter, determines when next byte will be written */ + int buffer; /* buffer for most recent output byte != 0xFF */ + + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + int next_restart_num; /* next restart number to write (0-7) */ + + /* Pointers to statistics areas (these workspaces have image lifespan) */ + unsigned char * dc_stats[NUM_ARITH_TBLS]; + unsigned char * ac_stats[NUM_ARITH_TBLS]; + + /* Statistics bin for coding with fixed probability 0.5 */ + unsigned char fixed_bin[4]; +} arith_entropy_encoder; + +typedef arith_entropy_encoder * arith_entropy_ptr; + +/* The following two definitions specify the allocation chunk size + * for the statistics area. + * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least + * 49 statistics bins for DC, and 245 statistics bins for AC coding. + * + * We use a compact representation with 1 byte per statistics bin, + * thus the numbers directly represent byte sizes. + * This 1 byte per statistics bin contains the meaning of the MPS + * (more probable symbol) in the highest bit (mask 0x80), and the + * index into the probability estimation state machine table + * in the lower bits (mask 0x7F). + */ + +#define DC_STAT_BINS 64 +#define AC_STAT_BINS 256 + +/* NOTE: Uncomment the following #define if you want to use the + * given formula for calculating the AC conditioning parameter Kx + * for spectral selection progressive coding in section G.1.3.2 + * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4). + * Although the spec and P&M authors claim that this "has proven + * to give good results for 8 bit precision samples", I'm not + * convinced yet that this is really beneficial. + * Early tests gave only very marginal compression enhancements + * (a few - around 5 or so - bytes even for very large files), + * which would turn out rather negative if we'd suppress the + * DAC (Define Arithmetic Conditioning) marker segments for + * the default parameters in the future. + * Note that currently the marker writing module emits 12-byte + * DAC segments for a full-component scan in a color image. + * This is not worth worrying about IMHO. However, since the + * spec defines the default values to be used if the tables + * are omitted (unlike Huffman tables, which are required + * anyway), one might optimize this behaviour in the future, + * and then it would be disadvantageous to use custom tables if + * they don't provide sufficient gain to exceed the DAC size. + * + * On the other hand, I'd consider it as a reasonable result + * that the conditioning has no significant influence on the + * compression performance. This means that the basic + * statistical model is already rather stable. + * + * Thus, at the moment, we use the default conditioning values + * anyway, and do not use the custom formula. + * +#define CALCULATE_SPECTRAL_CONDITIONING + */ + +/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. + * We assume that int right shift is unsigned if INT32 right shift is, + * which should be safe. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS int ishift_temp; +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +LOCAL(void) +emit_byte (int val, j_compress_ptr cinfo) +/* Write next output byte; we do not support suspension in this module. */ +{ + struct jpeg_destination_mgr * dest = cinfo->dest; + + *dest->next_output_byte++ = (JOCTET) val; + if (--dest->free_in_buffer == 0) + if (! (*dest->empty_output_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); +} + + +/* + * Finish up at the end of an arithmetic-compressed scan. + */ + +METHODDEF(void) +finish_pass (j_compress_ptr cinfo) +{ + arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + INT32 temp; + + /* Section D.1.8: Termination of encoding */ + + /* Find the e->c in the coding interval with the largest + * number of trailing zero bits */ + if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c) + e->c = temp + 0x8000L; + else + e->c = temp; + /* Send remaining bytes to output */ + e->c <<= e->ct; + if (e->c & 0xF8000000L) { + /* One final overflow has to be handled */ + if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer + 1, cinfo); + if (e->buffer + 1 == 0xFF) + emit_byte(0x00, cinfo); + } + e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ + e->sc = 0; + } else { + if (e->buffer == 0) + ++e->zc; + else if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer, cinfo); + } + if (e->sc) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + do { + emit_byte(0xFF, cinfo); + emit_byte(0x00, cinfo); + } while (--e->sc); + } + } + /* Output final bytes only if they are not 0x00 */ + if (e->c & 0x7FFF800L) { + if (e->zc) /* output final pending zero bytes */ + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte((e->c >> 19) & 0xFF, cinfo); + if (((e->c >> 19) & 0xFF) == 0xFF) + emit_byte(0x00, cinfo); + if (e->c & 0x7F800L) { + emit_byte((e->c >> 11) & 0xFF, cinfo); + if (((e->c >> 11) & 0xFF) == 0xFF) + emit_byte(0x00, cinfo); + } + } +} + + +/* + * The core arithmetic encoding routine (common in JPEG and JBIG). + * This needs to go as fast as possible. + * Machine-dependent optimization facilities + * are not utilized in this portable implementation. + * However, this code should be fairly efficient and + * may be a good base for further optimizations anyway. + * + * Parameter 'val' to be encoded may be 0 or 1 (binary decision). + * + * Note: I've added full "Pacman" termination support to the + * byte output routines, which is equivalent to the optional + * Discard_final_zeros procedure (Figure D.15) in the spec. + * Thus, we always produce the shortest possible output + * stream compliant to the spec (no trailing zero bytes, + * except for FF stuffing). + * + * I've also introduced a new scheme for accessing + * the probability estimation state machine table, + * derived from Markus Kuhn's JBIG implementation. + */ + +LOCAL(void) +arith_encode (j_compress_ptr cinfo, unsigned char *st, int val) +{ + register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + register unsigned char nl, nm; + register INT32 qe, temp; + register int sv; + + /* Fetch values from our compact representation of Table D.2: + * Qe values and probability estimation state machine + */ + sv = *st; + qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ + nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ + nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ + + /* Encode & estimation procedures per sections D.1.4 & D.1.5 */ + e->a -= qe; + if (val != (sv >> 7)) { + /* Encode the less probable symbol */ + if (e->a >= qe) { + /* If the interval size (qe) for the less probable symbol (LPS) + * is larger than the interval size for the MPS, then exchange + * the two symbols for coding efficiency, otherwise code the LPS + * as usual: */ + e->c += e->a; + e->a = qe; + } + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + } else { + /* Encode the more probable symbol */ + if (e->a >= 0x8000L) + return; /* A >= 0x8000 -> ready, no renormalization required */ + if (e->a < qe) { + /* If the interval size (qe) for the less probable symbol (LPS) + * is larger than the interval size for the MPS, then exchange + * the two symbols for coding efficiency: */ + e->c += e->a; + e->a = qe; + } + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } + + /* Renormalization & data output per section D.1.6 */ + do { + e->a <<= 1; + e->c <<= 1; + if (--e->ct == 0) { + /* Another byte is ready for output */ + temp = e->c >> 19; + if (temp > 0xFF) { + /* Handle overflow over all stacked 0xFF bytes */ + if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer + 1, cinfo); + if (e->buffer + 1 == 0xFF) + emit_byte(0x00, cinfo); + } + e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ + e->sc = 0; + /* Note: The 3 spacer bits in the C register guarantee + * that the new buffer byte can't be 0xFF here + * (see page 160 in the P&M JPEG book). */ + e->buffer = temp & 0xFF; /* new output byte, might overflow later */ + } else if (temp == 0xFF) { + ++e->sc; /* stack 0xFF byte (which might overflow later) */ + } else { + /* Output all stacked 0xFF bytes, they will not overflow any more */ + if (e->buffer == 0) + ++e->zc; + else if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer, cinfo); + } + if (e->sc) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + do { + emit_byte(0xFF, cinfo); + emit_byte(0x00, cinfo); + } while (--e->sc); + } + e->buffer = temp & 0xFF; /* new output byte (can still overflow) */ + } + e->c &= 0x7FFFFL; + e->ct += 8; + } + } while (e->a < 0x8000L); +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(void) +emit_restart (j_compress_ptr cinfo, int restart_num) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci; + jpeg_component_info * compptr; + + finish_pass(cinfo); + + emit_byte(0xFF, cinfo); + emit_byte(JPEG_RST0 + restart_num, cinfo); + + /* Re-initialize statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); + /* Reset DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); + } + } + + /* Reset arithmetic encoding variables */ + entropy->c = 0; + entropy->a = 0x10000L; + entropy->sc = 0; + entropy->zc = 0; + entropy->ct = 11; + entropy->buffer = -1; /* empty */ +} + + +/* + * MCU encoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl; + int v, v2, m; + ISHIFT_TEMPS + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; + + /* Compute the DC value after the required point transform by Al. + * This is simply an arithmetic right shift. + */ + m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al); + + /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.4: Encode_DC_DIFF */ + if ((v = m - entropy->last_dc_val[ci]) == 0) { + arith_encode(cinfo, st, 0); + entropy->dc_context[ci] = 0; /* zero diff category */ + } else { + entropy->last_dc_val[ci] = m; + arith_encode(cinfo, st, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ + st += 2; /* Table F.4: SP = S0 + 2 */ + entropy->dc_context[ci] = 4; /* small positive diff category */ + } else { + v = -v; + arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ + st += 3; /* Table F.4: SN = S0 + 3 */ + entropy->dc_context[ci] = 8; /* small negative diff category */ + } + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + arith_encode(cinfo, st, 0); + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] += 8; /* large diff category */ + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + } + + return TRUE; +} + + +/* + * MCU encoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, k, ke; + int v, v2, m; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->Se; ke > 0; ke--) + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if ((v = (*block)[natural_order[ke]]) >= 0) { + if (v >>= cinfo->Al) break; + } else { + v = -v; + if (v >>= cinfo->Al) break; + } + + /* Figure F.5: Encode_AC_Coefficients */ + for (k = cinfo->Ss; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 0); /* EOB decision */ + for (;;) { + if ((v = (*block)[natural_order[k]]) >= 0) { + if (v >>= cinfo->Al) { + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 0); + break; + } + } else { + v = -v; + if (v >>= cinfo->Al) { + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 1); + break; + } + } + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + st += 2; + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + if (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + } + arith_encode(cinfo, st, 0); + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + /* Encode EOB decision only if k <= cinfo->Se */ + if (k <= cinfo->Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + + return TRUE; +} + + +/* + * MCU encoding for DC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + unsigned char *st; + int Al, blkn; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + st = entropy->fixed_bin; /* use fixed probability estimation */ + Al = cinfo->Al; + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + /* We simply emit the Al'th bit of the DC coefficient value. */ + arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1); + } + + return TRUE; +} + + +/* + * MCU encoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, k, ke, kex; + int v; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Section G.1.3.3: Encoding of AC coefficients */ + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->Se; ke > 0; ke--) + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if ((v = (*block)[natural_order[ke]]) >= 0) { + if (v >>= cinfo->Al) break; + } else { + v = -v; + if (v >>= cinfo->Al) break; + } + + /* Establish EOBx (previous stage end-of-block) index */ + for (kex = ke; kex > 0; kex--) + if ((v = (*block)[natural_order[kex]]) >= 0) { + if (v >>= cinfo->Ah) break; + } else { + v = -v; + if (v >>= cinfo->Ah) break; + } + + /* Figure G.10: Encode_AC_Coefficients_SA */ + for (k = cinfo->Ss; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (k > kex) + arith_encode(cinfo, st, 0); /* EOB decision */ + for (;;) { + if ((v = (*block)[natural_order[k]]) >= 0) { + if (v >>= cinfo->Al) { + if (v >> 1) /* previously nonzero coef */ + arith_encode(cinfo, st + 2, (v & 1)); + else { /* newly nonzero coef */ + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 0); + } + break; + } + } else { + v = -v; + if (v >>= cinfo->Al) { + if (v >> 1) /* previously nonzero coef */ + arith_encode(cinfo, st + 2, (v & 1)); + else { /* newly nonzero coef */ + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 1); + } + break; + } + } + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + } + /* Encode EOB decision only if k <= cinfo->Se */ + if (k <= cinfo->Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + + return TRUE; +} + + +/* + * Encode and output one MCU's worth of arithmetic-compressed coefficients. + */ + +METHODDEF(boolean) +encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + jpeg_component_info * compptr; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, k, ke; + int v, v2, m; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ + + tbl = compptr->dc_tbl_no; + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.4: Encode_DC_DIFF */ + if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) { + arith_encode(cinfo, st, 0); + entropy->dc_context[ci] = 0; /* zero diff category */ + } else { + entropy->last_dc_val[ci] = (*block)[0]; + arith_encode(cinfo, st, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ + st += 2; /* Table F.4: SP = S0 + 2 */ + entropy->dc_context[ci] = 4; /* small positive diff category */ + } else { + v = -v; + arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ + st += 3; /* Table F.4: SN = S0 + 3 */ + entropy->dc_context[ci] = 8; /* small negative diff category */ + } + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + arith_encode(cinfo, st, 0); + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] += 8; /* large diff category */ + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + + /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ + + tbl = compptr->ac_tbl_no; + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->lim_Se; ke > 0; ke--) + if ((*block)[natural_order[ke]]) break; + + /* Figure F.5: Encode_AC_Coefficients */ + for (k = 1; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 0); /* EOB decision */ + while ((v = (*block)[natural_order[k]]) == 0) { + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + arith_encode(cinfo, st + 1, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, entropy->fixed_bin, 0); + } else { + v = -v; + arith_encode(cinfo, entropy->fixed_bin, 1); + } + st += 2; + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + if (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + } + arith_encode(cinfo, st, 0); + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + /* Encode EOB decision only if k <= cinfo->lim_Se */ + if (k <= cinfo->lim_Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + } + + return TRUE; +} + + +/* + * Initialize for an arithmetic-compressed scan. + */ + +METHODDEF(void) +start_pass (j_compress_ptr cinfo, boolean gather_statistics) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (gather_statistics) + /* Make sure to avoid that in the master control logic! + * We are fully adaptive here and need no extra + * statistics gathering pass! + */ + ERREXIT(cinfo, JERR_NOT_COMPILED); + + /* We assume jcmaster.c already validated the progressive scan parameters. */ + + /* Select execution routines */ + if (cinfo->progressive_mode) { + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_refine; + else + entropy->pub.encode_mcu = encode_mcu_AC_refine; + } + } else + entropy->pub.encode_mcu = encode_mcu; + + /* Allocate & initialize requested statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->dc_stats[tbl] == NULL) + entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); + MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->ac_stats[tbl] == NULL) + entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); + MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); +#ifdef CALCULATE_SPECTRAL_CONDITIONING + if (cinfo->progressive_mode) + /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */ + cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4); +#endif + } + } + + /* Initialize arithmetic encoding variables */ + entropy->c = 0; + entropy->a = 0x10000L; + entropy->sc = 0; + entropy->zc = 0; + entropy->ct = 11; + entropy->buffer = -1; /* empty */ + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} + + +/* + * Module initialization routine for arithmetic entropy encoding. + */ + +GLOBAL(void) +jinit_arith_encoder (j_compress_ptr cinfo) +{ + arith_entropy_ptr entropy; + int i; + + entropy = (arith_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(arith_entropy_encoder)); + cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; + entropy->pub.start_pass = start_pass; + entropy->pub.finish_pass = finish_pass; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + entropy->dc_stats[i] = NULL; + entropy->ac_stats[i] = NULL; + } + + /* Initialize index for fixed probability estimation */ + entropy->fixed_bin[0] = 113; +} diff --git a/src/3rdparty/libjpeg/jccoefct.c b/src/3rdparty/libjpeg/jccoefct.c new file mode 100644 index 0000000000..d775313b86 --- /dev/null +++ b/src/3rdparty/libjpeg/jccoefct.c @@ -0,0 +1,453 @@ +/* + * jccoefct.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the coefficient buffer controller for compression. + * This controller is the top level of the JPEG compressor proper. + * The coefficient buffer lies between forward-DCT and entropy encoding steps. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* We use a full-image coefficient buffer when doing Huffman optimization, + * and also for writing multiple-scan JPEG files. In all cases, the DCT + * step is run during the first pass, and subsequent passes need only read + * the buffered coefficients. + */ +#ifdef ENTROPY_OPT_SUPPORTED +#define FULL_COEF_BUFFER_SUPPORTED +#else +#ifdef C_MULTISCAN_FILES_SUPPORTED +#define FULL_COEF_BUFFER_SUPPORTED +#endif +#endif + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_coef_controller pub; /* public fields */ + + JDIMENSION iMCU_row_num; /* iMCU row # within image */ + JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* For single-pass compression, it's sufficient to buffer just one MCU + * (although this may prove a bit slow in practice). We allocate a + * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each + * MCU constructed and sent. (On 80x86, the workspace is FAR even though + * it's not really very big; this is to keep the module interfaces unchanged + * when a large coefficient buffer is necessary.) + * In multi-pass modes, this array points to the current MCU's blocks + * within the virtual arrays. + */ + JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; + + /* In multi-pass modes, we need a virtual block array for each component. */ + jvirt_barray_ptr whole_image[MAX_COMPONENTS]; +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + + +/* Forward declarations */ +METHODDEF(boolean) compress_data + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +#ifdef FULL_COEF_BUFFER_SUPPORTED +METHODDEF(boolean) compress_first_pass + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +METHODDEF(boolean) compress_output + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +#endif + + +LOCAL(void) +start_iMCU_row (j_compress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->mcu_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + coef->iMCU_row_num = 0; + start_iMCU_row(cinfo); + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (coef->whole_image[0] != NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_data; + break; +#ifdef FULL_COEF_BUFFER_SUPPORTED + case JBUF_SAVE_AND_PASS: + if (coef->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_first_pass; + break; + case JBUF_CRANK_DEST: + if (coef->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_output; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data in the single-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the image. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf contains a plane for each component in image, + * which we index according to the component's SOF position. + */ + +METHODDEF(boolean) +compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, bi, ci, yindex, yoffset, blockcnt; + JDIMENSION ypos, xpos; + jpeg_component_info *compptr; + forward_DCT_ptr forward_DCT; + + /* Loop to write as much as one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col; + MCU_col_num++) { + /* Determine where data comes from in input_buf and do the DCT thing. + * Each call on forward_DCT processes a horizontal row of DCT blocks + * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks + * sequentially. Dummy blocks at the right or bottom edge are filled in + * specially. The data in them does not matter for image reconstruction, + * so we fill them with values that will encode to the smallest amount of + * data, viz: all zeroes in the AC entries, DC entries equal to previous + * block's DC value. (Thanks to Thomas Kinsman for this idea.) + */ + blkn = 0; + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + forward_DCT = cinfo->fdct->forward_DCT[compptr->component_index]; + blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + xpos = MCU_col_num * compptr->MCU_sample_width; + ypos = yoffset * compptr->DCT_v_scaled_size; + /* ypos == (yoffset+yindex) * DCTSIZE */ + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (coef->iMCU_row_num < last_iMCU_row || + yoffset+yindex < compptr->last_row_height) { + (*forward_DCT) (cinfo, compptr, + input_buf[compptr->component_index], + coef->MCU_buffer[blkn], + ypos, xpos, (JDIMENSION) blockcnt); + if (blockcnt < compptr->MCU_width) { + /* Create some dummy blocks at the right edge of the image. */ + jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt], + (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); + for (bi = blockcnt; bi < compptr->MCU_width; bi++) { + coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; + } + } + } else { + /* Create a row of dummy blocks at the bottom of the image. */ + jzero_far((void FAR *) coef->MCU_buffer[blkn], + compptr->MCU_width * SIZEOF(JBLOCK)); + for (bi = 0; bi < compptr->MCU_width; bi++) { + coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; + } + } + blkn += compptr->MCU_width; + ypos += compptr->DCT_v_scaled_size; + } + } + /* Try to write the MCU. In event of a suspension failure, we will + * re-DCT the MCU on restart (a bit inefficient, could be fixed...) + */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + + +#ifdef FULL_COEF_BUFFER_SUPPORTED + +/* + * Process some data in the first pass of a multi-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the image. + * This amount of data is read from the source buffer, DCT'd and quantized, + * and saved into the virtual arrays. We also generate suitable dummy blocks + * as needed at the right and lower edges. (The dummy blocks are constructed + * in the virtual arrays, which have been padded appropriately.) This makes + * it possible for subsequent passes not to worry about real vs. dummy blocks. + * + * We must also emit the data to the entropy encoder. This is conveniently + * done by calling compress_output() after we've loaded the current strip + * of the virtual arrays. + * + * NB: input_buf contains a plane for each component in image. All + * components are DCT'd and loaded into the virtual arrays in this pass. + * However, it may be that only a subset of the components are emitted to + * the entropy encoder during this first pass; be careful about looking + * at the scan-dependent variables (MCU dimensions, etc). + */ + +METHODDEF(boolean) +compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION blocks_across, MCUs_across, MCUindex; + int bi, ci, h_samp_factor, block_row, block_rows, ndummy; + JCOEF lastDC; + jpeg_component_info *compptr; + JBLOCKARRAY buffer; + JBLOCKROW thisblockrow, lastblockrow; + forward_DCT_ptr forward_DCT; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Align the virtual buffer for this component. */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, TRUE); + /* Count non-dummy DCT block rows in this iMCU row. */ + if (coef->iMCU_row_num < last_iMCU_row) + block_rows = compptr->v_samp_factor; + else { + /* NB: can't use last_row_height here, since may not be set! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + } + blocks_across = compptr->width_in_blocks; + h_samp_factor = compptr->h_samp_factor; + /* Count number of dummy blocks to be added at the right margin. */ + ndummy = (int) (blocks_across % h_samp_factor); + if (ndummy > 0) + ndummy = h_samp_factor - ndummy; + forward_DCT = cinfo->fdct->forward_DCT[ci]; + /* Perform DCT for all non-dummy blocks in this iMCU row. Each call + * on forward_DCT processes a complete horizontal row of DCT blocks. + */ + for (block_row = 0; block_row < block_rows; block_row++) { + thisblockrow = buffer[block_row]; + (*forward_DCT) (cinfo, compptr, input_buf[ci], thisblockrow, + (JDIMENSION) (block_row * compptr->DCT_v_scaled_size), + (JDIMENSION) 0, blocks_across); + if (ndummy > 0) { + /* Create dummy blocks at the right edge of the image. */ + thisblockrow += blocks_across; /* => first dummy block */ + jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); + lastDC = thisblockrow[-1][0]; + for (bi = 0; bi < ndummy; bi++) { + thisblockrow[bi][0] = lastDC; + } + } + } + /* If at end of image, create dummy block rows as needed. + * The tricky part here is that within each MCU, we want the DC values + * of the dummy blocks to match the last real block's DC value. + * This squeezes a few more bytes out of the resulting file... + */ + if (coef->iMCU_row_num == last_iMCU_row) { + blocks_across += ndummy; /* include lower right corner */ + MCUs_across = blocks_across / h_samp_factor; + for (block_row = block_rows; block_row < compptr->v_samp_factor; + block_row++) { + thisblockrow = buffer[block_row]; + lastblockrow = buffer[block_row-1]; + jzero_far((void FAR *) thisblockrow, + (size_t) (blocks_across * SIZEOF(JBLOCK))); + for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { + lastDC = lastblockrow[h_samp_factor-1][0]; + for (bi = 0; bi < h_samp_factor; bi++) { + thisblockrow[bi][0] = lastDC; + } + thisblockrow += h_samp_factor; /* advance to next MCU in row */ + lastblockrow += h_samp_factor; + } + } + } + } + /* NB: compress_output will increment iMCU_row_num if successful. + * A suspension return will result in redoing all the work above next time. + */ + + /* Emit data to the entropy encoder, sharing code with subsequent passes */ + return compress_output(cinfo, input_buf); +} + + +/* + * Process some data in subsequent passes of a multi-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the scan. + * The data is obtained from the virtual arrays and fed to the entropy coder. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf is ignored; it is likely to be a NULL pointer. + */ + +METHODDEF(boolean) +compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + int blkn, ci, xindex, yindex, yoffset; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. + * NB: during first pass, this is safe only because the buffers will + * already be aligned properly, so jmemmgr.c won't need to do any I/O. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < compptr->MCU_width; xindex++) { + coef->MCU_buffer[blkn++] = buffer_ptr++; + } + } + } + /* Try to write the MCU. */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + +#endif /* FULL_COEF_BUFFER_SUPPORTED */ + + +/* + * Initialize coefficient buffer controller. + */ + +GLOBAL(void) +jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_coef_ptr coef; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_c_coef_controller *) coef; + coef->pub.start_pass = start_pass_coef; + + /* Create the coefficient buffer. */ + if (need_full_buffer) { +#ifdef FULL_COEF_BUFFER_SUPPORTED + /* Allocate a full-image virtual array for each component, */ + /* padded to a multiple of samp_factor DCT blocks in each direction. */ + int ci; + jpeg_component_info *compptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + (JDIMENSION) jround_up((long) compptr->width_in_blocks, + (long) compptr->h_samp_factor), + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor), + (JDIMENSION) compptr->v_samp_factor); + } +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + } else { + /* We only need a single-MCU buffer. */ + JBLOCKROW buffer; + int i; + + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { + coef->MCU_buffer[i] = buffer + i; + } + coef->whole_image[0] = NULL; /* flag for no virtual arrays */ + } +} diff --git a/src/3rdparty/libjpeg/jccolor.c b/src/3rdparty/libjpeg/jccolor.c new file mode 100644 index 0000000000..0a8a4b5d13 --- /dev/null +++ b/src/3rdparty/libjpeg/jccolor.c @@ -0,0 +1,459 @@ +/* + * jccolor.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains input colorspace conversion routines. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private subobject */ + +typedef struct { + struct jpeg_color_converter pub; /* public fields */ + + /* Private state for RGB->YCC conversion */ + INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */ +} my_color_converter; + +typedef my_color_converter * my_cconvert_ptr; + + +/**************** RGB -> YCbCr conversion: most common case **************/ + +/* + * YCbCr is defined per CCIR 601-1, except that Cb and Cr are + * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. + * The conversion equations to be implemented are therefore + * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B + * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE + * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE + * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) + * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2, + * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and + * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0) + * were not represented exactly. Now we sacrifice exact representation of + * maximum red and maximum blue in order to get exact grayscales. + * + * To avoid floating-point arithmetic, we represent the fractional constants + * as integers scaled up by 2^16 (about 4 digits precision); we have to divide + * the products by 2^16, with appropriate rounding, to get the correct answer. + * + * For even more speed, we avoid doing any multiplications in the inner loop + * by precalculating the constants times R,G,B for all possible values. + * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); + * for 12-bit samples it is still acceptable. It's not very reasonable for + * 16-bit samples, but if you want lossless storage you shouldn't be changing + * colorspace anyway. + * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included + * in the tables to save adding them separately in the inner loop. + */ + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS) +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L< Y section */ +#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */ +#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */ +#define R_CB_OFF (3*(MAXJSAMPLE+1)) +#define G_CB_OFF (4*(MAXJSAMPLE+1)) +#define B_CB_OFF (5*(MAXJSAMPLE+1)) +#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */ +#define G_CR_OFF (6*(MAXJSAMPLE+1)) +#define B_CR_OFF (7*(MAXJSAMPLE+1)) +#define TABLE_SIZE (8*(MAXJSAMPLE+1)) + + +/* + * Initialize for RGB->YCC colorspace conversion. + */ + +METHODDEF(void) +rgb_ycc_start (j_compress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + INT32 * rgb_ycc_tab; + INT32 i; + + /* Allocate and fill in the conversion tables. */ + cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (TABLE_SIZE * SIZEOF(INT32))); + + for (i = 0; i <= MAXJSAMPLE; i++) { + rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i; + rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i; + rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF; + rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i; + rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i; + /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr. + * This ensures that the maximum output will round to MAXJSAMPLE + * not MAXJSAMPLE+1, and thus that we don't have to range-limit. + */ + rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; +/* B=>Cb and R=>Cr tables are the same + rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; +*/ + rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i; + rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i; + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * + * Note that we change from the application's interleaved-pixel format + * to our internal noninterleaved, one-plane-per-component format. + * The input buffer is therefore three times as wide as the output buffer. + * + * A starting row offset is provided only for the output buffer. The caller + * can easily adjust the passed input_buf value to accommodate any row + * offset required on that side. + */ + +METHODDEF(void) +rgb_ycc_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr0, outptr1, outptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr0 = output_buf[0][output_row]; + outptr1 = output_buf[1][output_row]; + outptr2 = output_buf[2][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = GETJSAMPLE(inptr[RGB_RED]); + g = GETJSAMPLE(inptr[RGB_GREEN]); + b = GETJSAMPLE(inptr[RGB_BLUE]); + inptr += RGB_PIXELSIZE; + /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations + * must be too; we do not need an explicit range-limiting operation. + * Hence the value being shifted is never negative, and we don't + * need the general RIGHT_SHIFT macro. + */ + /* Y */ + outptr0[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + /* Cb */ + outptr1[col] = (JSAMPLE) + ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) + >> SCALEBITS); + /* Cr */ + outptr2[col] = (JSAMPLE) + ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) + >> SCALEBITS); + } + } +} + + +/**************** Cases other than RGB -> YCbCr **************/ + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles RGB->grayscale conversion, which is the same + * as the RGB->Y portion of RGB->YCbCr. + * We assume rgb_ycc_start has been called (we only use the Y tables). + */ + +METHODDEF(void) +rgb_gray_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr = output_buf[0][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = GETJSAMPLE(inptr[RGB_RED]); + g = GETJSAMPLE(inptr[RGB_GREEN]); + b = GETJSAMPLE(inptr[RGB_BLUE]); + inptr += RGB_PIXELSIZE; + /* Y */ + outptr[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles Adobe-style CMYK->YCCK conversion, + * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same + * conversion as above, while passing K (black) unchanged. + * We assume rgb_ycc_start has been called. + */ + +METHODDEF(void) +cmyk_ycck_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr0, outptr1, outptr2, outptr3; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr0 = output_buf[0][output_row]; + outptr1 = output_buf[1][output_row]; + outptr2 = output_buf[2][output_row]; + outptr3 = output_buf[3][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = MAXJSAMPLE - GETJSAMPLE(inptr[0]); + g = MAXJSAMPLE - GETJSAMPLE(inptr[1]); + b = MAXJSAMPLE - GETJSAMPLE(inptr[2]); + /* K passes through as-is */ + outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */ + inptr += 4; + /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations + * must be too; we do not need an explicit range-limiting operation. + * Hence the value being shifted is never negative, and we don't + * need the general RIGHT_SHIFT macro. + */ + /* Y */ + outptr0[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + /* Cb */ + outptr1[col] = (JSAMPLE) + ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) + >> SCALEBITS); + /* Cr */ + outptr2[col] = (JSAMPLE) + ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) + >> SCALEBITS); + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles grayscale output with no conversion. + * The source can be either plain grayscale or YCbCr (since Y == gray). + */ + +METHODDEF(void) +grayscale_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + int instride = cinfo->input_components; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr = output_buf[0][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */ + inptr += instride; + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles multi-component colorspaces without conversion. + * We assume input_components == num_components. + */ + +METHODDEF(void) +null_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + register int ci; + int nc = cinfo->num_components; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + /* It seems fastest to make a separate pass for each component. */ + for (ci = 0; ci < nc; ci++) { + inptr = *input_buf; + outptr = output_buf[ci][output_row]; + for (col = 0; col < num_cols; col++) { + outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */ + inptr += nc; + } + } + input_buf++; + output_row++; + } +} + + +/* + * Empty method for start_pass. + */ + +METHODDEF(void) +null_method (j_compress_ptr cinfo) +{ + /* no work needed */ +} + + +/* + * Module initialization routine for input colorspace conversion. + */ + +GLOBAL(void) +jinit_color_converter (j_compress_ptr cinfo) +{ + my_cconvert_ptr cconvert; + + cconvert = (my_cconvert_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_color_converter)); + cinfo->cconvert = (struct jpeg_color_converter *) cconvert; + /* set start_pass to null method until we find out differently */ + cconvert->pub.start_pass = null_method; + + /* Make sure input_components agrees with in_color_space */ + switch (cinfo->in_color_space) { + case JCS_GRAYSCALE: + if (cinfo->input_components != 1) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + case JCS_RGB: +#if RGB_PIXELSIZE != 3 + if (cinfo->input_components != RGB_PIXELSIZE) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; +#endif /* else share code with YCbCr */ + + case JCS_YCbCr: + if (cinfo->input_components != 3) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + case JCS_CMYK: + case JCS_YCCK: + if (cinfo->input_components != 4) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + default: /* JCS_UNKNOWN can be anything */ + if (cinfo->input_components < 1) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + } + + /* Check num_components, set conversion method based on requested space */ + switch (cinfo->jpeg_color_space) { + case JCS_GRAYSCALE: + if (cinfo->num_components != 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_GRAYSCALE) + cconvert->pub.color_convert = grayscale_convert; + else if (cinfo->in_color_space == JCS_RGB) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = rgb_gray_convert; + } else if (cinfo->in_color_space == JCS_YCbCr) + cconvert->pub.color_convert = grayscale_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_RGB: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_YCbCr: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_RGB) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = rgb_ycc_convert; + } else if (cinfo->in_color_space == JCS_YCbCr) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_CMYK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_CMYK) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_YCCK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_CMYK) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = cmyk_ycck_convert; + } else if (cinfo->in_color_space == JCS_YCCK) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + default: /* allow null conversion of JCS_UNKNOWN */ + if (cinfo->jpeg_color_space != cinfo->in_color_space || + cinfo->num_components != cinfo->input_components) + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + cconvert->pub.color_convert = null_convert; + break; + } +} diff --git a/src/3rdparty/libjpeg/jcdctmgr.c b/src/3rdparty/libjpeg/jcdctmgr.c new file mode 100644 index 0000000000..0bbdbb685d --- /dev/null +++ b/src/3rdparty/libjpeg/jcdctmgr.c @@ -0,0 +1,482 @@ +/* + * jcdctmgr.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the forward-DCT management logic. + * This code selects a particular DCT implementation to be used, + * and it performs related housekeeping chores including coefficient + * quantization. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + + +/* Private subobject for this module */ + +typedef struct { + struct jpeg_forward_dct pub; /* public fields */ + + /* Pointer to the DCT routine actually in use */ + forward_DCT_method_ptr do_dct[MAX_COMPONENTS]; + + /* The actual post-DCT divisors --- not identical to the quant table + * entries, because of scaling (especially for an unnormalized DCT). + * Each table is given in normal array order. + */ + DCTELEM * divisors[NUM_QUANT_TBLS]; + +#ifdef DCT_FLOAT_SUPPORTED + /* Same as above for the floating-point case. */ + float_DCT_method_ptr do_float_dct[MAX_COMPONENTS]; + FAST_FLOAT * float_divisors[NUM_QUANT_TBLS]; +#endif +} my_fdct_controller; + +typedef my_fdct_controller * my_fdct_ptr; + + +/* The current scaled-DCT routines require ISLOW-style divisor tables, + * so be sure to compile that code if either ISLOW or SCALING is requested. + */ +#ifdef DCT_ISLOW_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#else +#ifdef DCT_SCALING_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#endif +#endif + + +/* + * Perform forward DCT on one or more blocks of a component. + * + * The input samples are taken from the sample_data[] array starting at + * position start_row/start_col, and moving to the right for any additional + * blocks. The quantized coefficients are returned in coef_blocks[]. + */ + +METHODDEF(void) +forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks) +/* This version is used for integer DCT implementations. */ +{ + /* This routine is heavily used, so it's worth coding it tightly. */ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index]; + DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no]; + DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */ + JDIMENSION bi; + + sample_data += start_row; /* fold in the vertical offset once */ + + for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) { + /* Perform the DCT */ + (*do_dct) (workspace, sample_data, start_col); + + /* Quantize/descale the coefficients, and store into coef_blocks[] */ + { register DCTELEM temp, qval; + register int i; + register JCOEFPTR output_ptr = coef_blocks[bi]; + + for (i = 0; i < DCTSIZE2; i++) { + qval = divisors[i]; + temp = workspace[i]; + /* Divide the coefficient value by qval, ensuring proper rounding. + * Since C does not specify the direction of rounding for negative + * quotients, we have to force the dividend positive for portability. + * + * In most files, at least half of the output values will be zero + * (at default quantization settings, more like three-quarters...) + * so we should ensure that this case is fast. On many machines, + * a comparison is enough cheaper than a divide to make a special test + * a win. Since both inputs will be nonnegative, we need only test + * for a < b to discover whether a/b is 0. + * If your machine's division is fast enough, define FAST_DIVIDE. + */ +#ifdef FAST_DIVIDE +#define DIVIDE_BY(a,b) a /= b +#else +#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0 +#endif + if (temp < 0) { + temp = -temp; + temp += qval>>1; /* for rounding */ + DIVIDE_BY(temp, qval); + temp = -temp; + } else { + temp += qval>>1; /* for rounding */ + DIVIDE_BY(temp, qval); + } + output_ptr[i] = (JCOEF) temp; + } + } + } +} + + +#ifdef DCT_FLOAT_SUPPORTED + +METHODDEF(void) +forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks) +/* This version is used for floating-point DCT implementations. */ +{ + /* This routine is heavily used, so it's worth coding it tightly. */ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index]; + FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no]; + FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */ + JDIMENSION bi; + + sample_data += start_row; /* fold in the vertical offset once */ + + for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) { + /* Perform the DCT */ + (*do_dct) (workspace, sample_data, start_col); + + /* Quantize/descale the coefficients, and store into coef_blocks[] */ + { register FAST_FLOAT temp; + register int i; + register JCOEFPTR output_ptr = coef_blocks[bi]; + + for (i = 0; i < DCTSIZE2; i++) { + /* Apply the quantization and scaling factor */ + temp = workspace[i] * divisors[i]; + /* Round to nearest integer. + * Since C does not specify the direction of rounding for negative + * quotients, we have to force the dividend positive for portability. + * The maximum coefficient size is +-16K (for 12-bit data), so this + * code should work for either 16-bit or 32-bit ints. + */ + output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384); + } + } + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ + + +/* + * Initialize for a processing pass. + * Verify that all referenced Q-tables are present, and set up + * the divisor table for each one. + * In the current implementation, DCT of all components is done during + * the first pass, even if only some components will be output in the + * first scan. Hence all components should be examined here. + */ + +METHODDEF(void) +start_pass_fdctmgr (j_compress_ptr cinfo) +{ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + int ci, qtblno, i; + jpeg_component_info *compptr; + int method = 0; + JQUANT_TBL * qtbl; + DCTELEM * dtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Select the proper DCT routine for this component's scaling */ + switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) { +#ifdef DCT_SCALING_SUPPORTED + case ((1 << 8) + 1): + fdct->do_dct[ci] = jpeg_fdct_1x1; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_2x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((3 << 8) + 3): + fdct->do_dct[ci] = jpeg_fdct_3x3; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_4x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((5 << 8) + 5): + fdct->do_dct[ci] = jpeg_fdct_5x5; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_6x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((7 << 8) + 7): + fdct->do_dct[ci] = jpeg_fdct_7x7; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((9 << 8) + 9): + fdct->do_dct[ci] = jpeg_fdct_9x9; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((10 << 8) + 10): + fdct->do_dct[ci] = jpeg_fdct_10x10; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((11 << 8) + 11): + fdct->do_dct[ci] = jpeg_fdct_11x11; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((12 << 8) + 12): + fdct->do_dct[ci] = jpeg_fdct_12x12; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((13 << 8) + 13): + fdct->do_dct[ci] = jpeg_fdct_13x13; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((14 << 8) + 14): + fdct->do_dct[ci] = jpeg_fdct_14x14; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((15 << 8) + 15): + fdct->do_dct[ci] = jpeg_fdct_15x15; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((16 << 8) + 16): + fdct->do_dct[ci] = jpeg_fdct_16x16; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((16 << 8) + 8): + fdct->do_dct[ci] = jpeg_fdct_16x8; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((14 << 8) + 7): + fdct->do_dct[ci] = jpeg_fdct_14x7; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((12 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_12x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((10 << 8) + 5): + fdct->do_dct[ci] = jpeg_fdct_10x5; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((8 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_8x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 3): + fdct->do_dct[ci] = jpeg_fdct_6x3; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_4x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 1): + fdct->do_dct[ci] = jpeg_fdct_2x1; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((8 << 8) + 16): + fdct->do_dct[ci] = jpeg_fdct_8x16; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((7 << 8) + 14): + fdct->do_dct[ci] = jpeg_fdct_7x14; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 12): + fdct->do_dct[ci] = jpeg_fdct_6x12; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((5 << 8) + 10): + fdct->do_dct[ci] = jpeg_fdct_5x10; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 8): + fdct->do_dct[ci] = jpeg_fdct_4x8; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((3 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_3x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_2x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((1 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_1x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; +#endif + case ((DCTSIZE << 8) + DCTSIZE): + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + fdct->do_dct[ci] = jpeg_fdct_islow; + method = JDCT_ISLOW; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + fdct->do_dct[ci] = jpeg_fdct_ifast; + method = JDCT_IFAST; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + fdct->do_float_dct[ci] = jpeg_fdct_float; + method = JDCT_FLOAT; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + break; + default: + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size); + break; + } + qtblno = compptr->quant_tbl_no; + /* Make sure specified quantization table is present */ + if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || + cinfo->quant_tbl_ptrs[qtblno] == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); + qtbl = cinfo->quant_tbl_ptrs[qtblno]; + /* Compute divisors for this quant table */ + /* We may do this more than once for same table, but it's not a big deal */ + switch (method) { +#ifdef PROVIDE_ISLOW_TABLES + case JDCT_ISLOW: + /* For LL&M IDCT method, divisors are equal to raw quantization + * coefficients multiplied by 8 (to counteract scaling). + */ + if (fdct->divisors[qtblno] == NULL) { + fdct->divisors[qtblno] = (DCTELEM *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(DCTELEM)); + } + dtbl = fdct->divisors[qtblno]; + for (i = 0; i < DCTSIZE2; i++) { + dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3; + } + fdct->pub.forward_DCT[ci] = forward_DCT; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + { + /* For AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + */ +#define CONST_BITS 14 + static const INT16 aanscales[DCTSIZE2] = { + /* precomputed values scaled up by 14 bits */ + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, + 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, + 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, + 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, + 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 + }; + SHIFT_TEMPS + + if (fdct->divisors[qtblno] == NULL) { + fdct->divisors[qtblno] = (DCTELEM *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(DCTELEM)); + } + dtbl = fdct->divisors[qtblno]; + for (i = 0; i < DCTSIZE2; i++) { + dtbl[i] = (DCTELEM) + DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], + (INT32) aanscales[i]), + CONST_BITS-3); + } + } + fdct->pub.forward_DCT[ci] = forward_DCT; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + { + /* For float AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + * What's actually stored is 1/divisor so that the inner loop can + * use a multiplication rather than a division. + */ + FAST_FLOAT * fdtbl; + int row, col; + static const double aanscalefactor[DCTSIZE] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + }; + + if (fdct->float_divisors[qtblno] == NULL) { + fdct->float_divisors[qtblno] = (FAST_FLOAT *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(FAST_FLOAT)); + } + fdtbl = fdct->float_divisors[qtblno]; + i = 0; + for (row = 0; row < DCTSIZE; row++) { + for (col = 0; col < DCTSIZE; col++) { + fdtbl[i] = (FAST_FLOAT) + (1.0 / (((double) qtbl->quantval[i] * + aanscalefactor[row] * aanscalefactor[col] * 8.0))); + i++; + } + } + } + fdct->pub.forward_DCT[ci] = forward_DCT_float; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + +/* + * Initialize FDCT manager. + */ + +GLOBAL(void) +jinit_forward_dct (j_compress_ptr cinfo) +{ + my_fdct_ptr fdct; + int i; + + fdct = (my_fdct_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_fdct_controller)); + cinfo->fdct = (struct jpeg_forward_dct *) fdct; + fdct->pub.start_pass = start_pass_fdctmgr; + + /* Mark divisor tables unallocated */ + for (i = 0; i < NUM_QUANT_TBLS; i++) { + fdct->divisors[i] = NULL; +#ifdef DCT_FLOAT_SUPPORTED + fdct->float_divisors[i] = NULL; +#endif + } +} diff --git a/src/3rdparty/libjpeg/jchuff.c b/src/3rdparty/libjpeg/jchuff.c new file mode 100644 index 0000000000..257d7aa1f5 --- /dev/null +++ b/src/3rdparty/libjpeg/jchuff.c @@ -0,0 +1,1576 @@ +/* + * jchuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2006-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy encoding routines. + * Both sequential and progressive modes are supported in this single module. + * + * Much of the complexity here has to do with supporting output suspension. + * If the data destination module demands suspension, we want to be able to + * back up to the start of the current MCU. To do this, we copy state + * variables into local working storage, and update them back to the + * permanent JPEG objects only upon successful completion of an MCU. + * + * We do not support output suspension for the progressive JPEG mode, since + * the library currently does not allow multiple-scan files to be written + * with output suspension. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* The legal range of a DCT coefficient is + * -1024 .. +1023 for 8-bit data; + * -16384 .. +16383 for 12-bit data. + * Hence the magnitude should always fit in 10 or 14 bits respectively. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MAX_COEF_BITS 10 +#else +#define MAX_COEF_BITS 14 +#endif + +/* Derived data constructed for each Huffman table */ + +typedef struct { + unsigned int ehufco[256]; /* code for each symbol */ + char ehufsi[256]; /* length of code for each symbol */ + /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ +} c_derived_tbl; + + +/* Expanded entropy encoder object for Huffman encoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + INT32 put_buffer; /* current bit-accumulation buffer */ + int put_bits; /* # of bits now in it */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).put_buffer = (src).put_buffer, \ + (dest).put_bits = (src).put_bits, \ + (dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_encoder pub; /* public fields */ + + savable_state saved; /* Bit buffer & DC state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + int next_restart_num; /* next restart number to write (0-7) */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; + c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; + + /* Statistics tables for optimization */ + long * dc_count_ptrs[NUM_HUFF_TBLS]; + long * ac_count_ptrs[NUM_HUFF_TBLS]; + + /* Following fields used only in progressive mode */ + + /* Mode flag: TRUE for optimization, FALSE for actual data output */ + boolean gather_statistics; + + /* next_output_byte/free_in_buffer are local copies of cinfo->dest fields. + */ + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ + + /* Coding status for AC components */ + int ac_tbl_no; /* the table number of the single component */ + unsigned int EOBRUN; /* run length of EOBs */ + unsigned int BE; /* # of buffered correction bits before MCU */ + char * bit_buffer; /* buffer for correction bits (1 per char) */ + /* packing correction bits tightly would save some space but cost time... */ +} huff_entropy_encoder; + +typedef huff_entropy_encoder * huff_entropy_ptr; + +/* Working state while writing an MCU (sequential mode). + * This struct contains all the fields that are needed by subroutines. + */ + +typedef struct { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + savable_state cur; /* Current bit buffer & DC state */ + j_compress_ptr cinfo; /* dump_buffer needs access to this */ +} working_state; + +/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit + * buffer can hold. Larger sizes may slightly improve compression, but + * 1000 is already well into the realm of overkill. + * The minimum safe size is 64 bits. + */ + +#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ + +/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. + * We assume that int right shift is unsigned if INT32 right shift is, + * which should be safe. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS int ishift_temp; +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + */ + +LOCAL(void) +jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno, + c_derived_tbl ** pdtbl) +{ + JHUFF_TBL *htbl; + c_derived_tbl *dtbl; + int p, i, l, lastp, si, maxsymbol; + char huffsize[257]; + unsigned int huffcode[257]; + unsigned int code; + + /* Note that huffsize[] and huffcode[] are filled in code-length order, + * paralleling the order of the symbols themselves in htbl->huffval[]. + */ + + /* Find the input Huffman table */ + if (tblno < 0 || tblno >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + htbl = + isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + + /* Allocate a workspace if we haven't already done so. */ + if (*pdtbl == NULL) + *pdtbl = (c_derived_tbl *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(c_derived_tbl)); + dtbl = *pdtbl; + + /* Figure C.1: make table of Huffman code length for each symbol */ + + p = 0; + for (l = 1; l <= 16; l++) { + i = (int) htbl->bits[l]; + if (i < 0 || p + i > 256) /* protect against table overrun */ + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + while (i--) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + lastp = p; + + /* Figure C.2: generate the codes themselves */ + /* We also validate that the counts represent a legal Huffman code tree. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + /* code is now 1 more than the last code used for codelength si; but + * it must still fit in si bits, since no code is allowed to be all ones. + */ + if (((INT32) code) >= (((INT32) 1) << si)) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + code <<= 1; + si++; + } + + /* Figure C.3: generate encoding tables */ + /* These are code and size indexed by symbol value */ + + /* Set all codeless symbols to have code length 0; + * this lets us detect duplicate VAL entries here, and later + * allows emit_bits to detect any attempt to emit such symbols. + */ + MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi)); + + /* This is also a convenient place to check for out-of-range + * and duplicated VAL entries. We allow 0..255 for AC symbols + * but only 0..15 for DC. (We could constrain them further + * based on data depth and mode, but this seems enough.) + */ + maxsymbol = isDC ? 15 : 255; + + for (p = 0; p < lastp; p++) { + i = htbl->huffval[p]; + if (i < 0 || i > maxsymbol || dtbl->ehufsi[i]) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + dtbl->ehufco[i] = huffcode[p]; + dtbl->ehufsi[i] = huffsize[p]; + } +} + + +/* Outputting bytes to the file. + * NB: these must be called only when actually outputting, + * that is, entropy->gather_statistics == FALSE. + */ + +/* Emit a byte, taking 'action' if must suspend. */ +#define emit_byte_s(state,val,action) \ + { *(state)->next_output_byte++ = (JOCTET) (val); \ + if (--(state)->free_in_buffer == 0) \ + if (! dump_buffer_s(state)) \ + { action; } } + +/* Emit a byte */ +#define emit_byte_e(entropy,val) \ + { *(entropy)->next_output_byte++ = (JOCTET) (val); \ + if (--(entropy)->free_in_buffer == 0) \ + dump_buffer_e(entropy); } + + +LOCAL(boolean) +dump_buffer_s (working_state * state) +/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */ +{ + struct jpeg_destination_mgr * dest = state->cinfo->dest; + + if (! (*dest->empty_output_buffer) (state->cinfo)) + return FALSE; + /* After a successful buffer dump, must reset buffer pointers */ + state->next_output_byte = dest->next_output_byte; + state->free_in_buffer = dest->free_in_buffer; + return TRUE; +} + + +LOCAL(void) +dump_buffer_e (huff_entropy_ptr entropy) +/* Empty the output buffer; we do not support suspension in this case. */ +{ + struct jpeg_destination_mgr * dest = entropy->cinfo->dest; + + if (! (*dest->empty_output_buffer) (entropy->cinfo)) + ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); + /* After a successful buffer dump, must reset buffer pointers */ + entropy->next_output_byte = dest->next_output_byte; + entropy->free_in_buffer = dest->free_in_buffer; +} + + +/* Outputting bits to the file */ + +/* Only the right 24 bits of put_buffer are used; the valid bits are + * left-justified in this part. At most 16 bits can be passed to emit_bits + * in one call, and we never retain more than 7 bits in put_buffer + * between calls, so 24 bits are sufficient. + */ + +INLINE +LOCAL(boolean) +emit_bits_s (working_state * state, unsigned int code, int size) +/* Emit some bits; return TRUE if successful, FALSE if must suspend */ +{ + /* This routine is heavily used, so it's worth coding tightly. */ + register INT32 put_buffer = (INT32) code; + register int put_bits = state->cur.put_bits; + + /* if size is 0, caller used an invalid Huffman table entry */ + if (size == 0) + ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE); + + put_buffer &= (((INT32) 1)<cur.put_buffer; /* and merge with old buffer contents */ + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte_s(state, c, return FALSE); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte_s(state, 0, return FALSE); + } + put_buffer <<= 8; + put_bits -= 8; + } + + state->cur.put_buffer = put_buffer; /* update state variables */ + state->cur.put_bits = put_bits; + + return TRUE; +} + + +INLINE +LOCAL(void) +emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size) +/* Emit some bits, unless we are in gather mode */ +{ + /* This routine is heavily used, so it's worth coding tightly. */ + register INT32 put_buffer = (INT32) code; + register int put_bits = entropy->saved.put_bits; + + /* if size is 0, caller used an invalid Huffman table entry */ + if (size == 0) + ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); + + if (entropy->gather_statistics) + return; /* do nothing if we're only getting stats */ + + put_buffer &= (((INT32) 1)<saved.put_buffer; + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte_e(entropy, c); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte_e(entropy, 0); + } + put_buffer <<= 8; + put_bits -= 8; + } + + entropy->saved.put_buffer = put_buffer; /* update variables */ + entropy->saved.put_bits = put_bits; +} + + +LOCAL(boolean) +flush_bits_s (working_state * state) +{ + if (! emit_bits_s(state, 0x7F, 7)) /* fill any partial byte with ones */ + return FALSE; + state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ + state->cur.put_bits = 0; + return TRUE; +} + + +LOCAL(void) +flush_bits_e (huff_entropy_ptr entropy) +{ + emit_bits_e(entropy, 0x7F, 7); /* fill any partial byte with ones */ + entropy->saved.put_buffer = 0; /* and reset bit-buffer to empty */ + entropy->saved.put_bits = 0; +} + + +/* + * Emit (or just count) a Huffman symbol. + */ + +INLINE +LOCAL(void) +emit_dc_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->dc_count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->dc_derived_tbls[tbl_no]; + emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +INLINE +LOCAL(void) +emit_ac_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->ac_count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->ac_derived_tbls[tbl_no]; + emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +/* + * Emit bits from a correction bit buffer. + */ + +LOCAL(void) +emit_buffered_bits (huff_entropy_ptr entropy, char * bufstart, + unsigned int nbits) +{ + if (entropy->gather_statistics) + return; /* no real work */ + + while (nbits > 0) { + emit_bits_e(entropy, (unsigned int) (*bufstart), 1); + bufstart++; + nbits--; + } +} + + +/* + * Emit any pending EOBRUN symbol. + */ + +LOCAL(void) +emit_eobrun (huff_entropy_ptr entropy) +{ + register int temp, nbits; + + if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ + temp = entropy->EOBRUN; + nbits = 0; + while ((temp >>= 1)) + nbits++; + /* safety check: shouldn't happen given limited correction-bit buffer */ + if (nbits > 14) + ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); + + emit_ac_symbol(entropy, entropy->ac_tbl_no, nbits << 4); + if (nbits) + emit_bits_e(entropy, entropy->EOBRUN, nbits); + + entropy->EOBRUN = 0; + + /* Emit any buffered correction bits */ + emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE); + entropy->BE = 0; + } +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(boolean) +emit_restart_s (working_state * state, int restart_num) +{ + int ci; + + if (! flush_bits_s(state)) + return FALSE; + + emit_byte_s(state, 0xFF, return FALSE); + emit_byte_s(state, JPEG_RST0 + restart_num, return FALSE); + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < state->cinfo->comps_in_scan; ci++) + state->cur.last_dc_val[ci] = 0; + + /* The restart counter is not updated until we successfully write the MCU. */ + + return TRUE; +} + + +LOCAL(void) +emit_restart_e (huff_entropy_ptr entropy, int restart_num) +{ + int ci; + + emit_eobrun(entropy); + + if (! entropy->gather_statistics) { + flush_bits_e(entropy); + emit_byte_e(entropy, 0xFF); + emit_byte_e(entropy, JPEG_RST0 + restart_num); + } + + if (entropy->cinfo->Ss == 0) { + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + } else { + /* Re-initialize all AC-related fields to 0 */ + entropy->EOBRUN = 0; + entropy->BE = 0; + } +} + + +/* + * MCU encoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + int blkn, ci; + int Al = cinfo->Al; + JBLOCKROW block; + jpeg_component_info * compptr; + ISHIFT_TEMPS + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Compute the DC value after the required point transform by Al. + * This is simply an arithmetic right shift. + */ + temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al); + + /* DC differences are figured on the point-transformed values. */ + temp = temp2 - entropy->saved.last_dc_val[ci]; + entropy->saved.last_dc_val[ci] = temp2; + + /* Encode the DC coefficient difference per section G.1.2.1 */ + temp2 = temp; + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* For a negative input, want temp2 = bitwise complement of abs(input) */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count/emit the Huffman-coded symbol for the number of bits */ + emit_dc_symbol(entropy, compptr->dc_tbl_no, nbits); + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (nbits) /* emit_bits rejects calls with size 0 */ + emit_bits_e(entropy, (unsigned int) temp2, nbits); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + register int r, k; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + + /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ + + r = 0; /* r = run length of zeros */ + + for (k = cinfo->Ss; k <= Se; k++) { + if ((temp = (*block)[natural_order[k]]) == 0) { + r++; + continue; + } + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value; so the code is + * interwoven with finding the abs value (temp) and output bits (temp2). + */ + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + temp >>= Al; /* apply the point transform */ + /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ + temp2 = ~temp; + } else { + temp >>= Al; /* apply the point transform */ + temp2 = temp; + } + /* Watch out for case that nonzero coef is zero after point transform */ + if (temp == 0) { + r++; + continue; + } + + /* Emit any pending EOBRUN */ + if (entropy->EOBRUN > 0) + emit_eobrun(entropy); + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0); + r -= 16; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count/emit Huffman symbol for run length / number of bits */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + emit_bits_e(entropy, (unsigned int) temp2, nbits); + + r = 0; /* reset zero run length */ + } + + if (r > 0) { /* If there are trailing zeroes, */ + entropy->EOBRUN++; /* count an EOB */ + if (entropy->EOBRUN == 0x7FFF) + emit_eobrun(entropy); /* force it out to avoid overflow */ + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp; + int blkn; + int Al = cinfo->Al; + JBLOCKROW block; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* We simply emit the Al'th bit of the DC coefficient value. */ + temp = (*block)[0]; + emit_bits_e(entropy, (unsigned int) (temp >> Al), 1); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp; + register int r, k; + int EOB; + char *BR_buffer; + unsigned int BR; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + int absvalues[DCTSIZE2]; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + + /* It is convenient to make a pre-pass to determine the transformed + * coefficients' absolute values and the EOB position. + */ + EOB = 0; + for (k = cinfo->Ss; k <= Se; k++) { + temp = (*block)[natural_order[k]]; + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if (temp < 0) + temp = -temp; /* temp is abs value of input */ + temp >>= Al; /* apply the point transform */ + absvalues[k] = temp; /* save abs value for main pass */ + if (temp == 1) + EOB = k; /* EOB = index of last newly-nonzero coef */ + } + + /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ + + r = 0; /* r = run length of zeros */ + BR = 0; /* BR = count of buffered bits added now */ + BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ + + for (k = cinfo->Ss; k <= Se; k++) { + if ((temp = absvalues[k]) == 0) { + r++; + continue; + } + + /* Emit any required ZRLs, but not if they can be folded into EOB */ + while (r > 15 && k <= EOB) { + /* emit any pending EOBRUN and the BE correction bits */ + emit_eobrun(entropy); + /* Emit ZRL */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0); + r -= 16; + /* Emit buffered correction bits that must be associated with ZRL */ + emit_buffered_bits(entropy, BR_buffer, BR); + BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ + BR = 0; + } + + /* If the coef was previously nonzero, it only needs a correction bit. + * NOTE: a straight translation of the spec's figure G.7 would suggest + * that we also need to test r > 15. But if r > 15, we can only get here + * if k > EOB, which implies that this coefficient is not 1. + */ + if (temp > 1) { + /* The correction bit is the next bit of the absolute value. */ + BR_buffer[BR++] = (char) (temp & 1); + continue; + } + + /* Emit any pending EOBRUN and the BE correction bits */ + emit_eobrun(entropy); + + /* Count/emit Huffman symbol for run length / number of bits */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); + + /* Emit output bit for newly-nonzero coef */ + temp = ((*block)[natural_order[k]] < 0) ? 0 : 1; + emit_bits_e(entropy, (unsigned int) temp, 1); + + /* Emit buffered correction bits that must be associated with this code */ + emit_buffered_bits(entropy, BR_buffer, BR); + BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ + BR = 0; + r = 0; /* reset zero run length */ + } + + if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ + entropy->EOBRUN++; /* count an EOB */ + entropy->BE += BR; /* concat my correction bits to older ones */ + /* We force out the EOB if we risk either: + * 1. overflow of the EOB counter; + * 2. overflow of the correction bit buffer during the next MCU. + */ + if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1)) + emit_eobrun(entropy); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* Encode a single block's worth of coefficients */ + +LOCAL(boolean) +encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, + c_derived_tbl *dctbl, c_derived_tbl *actbl) +{ + register int temp, temp2; + register int nbits; + register int k, r, i; + int Se = state->cinfo->lim_Se; + const int * natural_order = state->cinfo->natural_order; + + /* Encode the DC coefficient difference per section F.1.2.1 */ + + temp = temp2 = block[0] - last_dc_val; + + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* For a negative input, want temp2 = bitwise complement of abs(input) */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); + + /* Emit the Huffman-coded symbol for the number of bits */ + if (! emit_bits_s(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits])) + return FALSE; + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (nbits) /* emit_bits rejects calls with size 0 */ + if (! emit_bits_s(state, (unsigned int) temp2, nbits)) + return FALSE; + + /* Encode the AC coefficients per section F.1.2.2 */ + + r = 0; /* r = run length of zeros */ + + for (k = 1; k <= Se; k++) { + if ((temp = block[natural_order[k]]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + if (! emit_bits_s(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0])) + return FALSE; + r -= 16; + } + + temp2 = temp; + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); + + /* Emit Huffman symbol for run length / number of bits */ + i = (r << 4) + nbits; + if (! emit_bits_s(state, actbl->ehufco[i], actbl->ehufsi[i])) + return FALSE; + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (! emit_bits_s(state, (unsigned int) temp2, nbits)) + return FALSE; + + r = 0; + } + } + + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) + if (! emit_bits_s(state, actbl->ehufco[0], actbl->ehufsi[0])) + return FALSE; + + return TRUE; +} + + +/* + * Encode and output one MCU's worth of Huffman-compressed coefficients. + */ + +METHODDEF(boolean) +encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + working_state state; + int blkn, ci; + jpeg_component_info * compptr; + + /* Load up working state */ + state.next_output_byte = cinfo->dest->next_output_byte; + state.free_in_buffer = cinfo->dest->free_in_buffer; + ASSIGN_STATE(state.cur, entropy->saved); + state.cinfo = cinfo; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! emit_restart_s(&state, entropy->next_restart_num)) + return FALSE; + } + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + if (! encode_one_block(&state, + MCU_data[blkn][0], state.cur.last_dc_val[ci], + entropy->dc_derived_tbls[compptr->dc_tbl_no], + entropy->ac_derived_tbls[compptr->ac_tbl_no])) + return FALSE; + /* Update last_dc_val */ + state.cur.last_dc_val[ci] = MCU_data[blkn][0][0]; + } + + /* Completed MCU, so update state */ + cinfo->dest->next_output_byte = state.next_output_byte; + cinfo->dest->free_in_buffer = state.free_in_buffer; + ASSIGN_STATE(entropy->saved, state.cur); + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * Finish up at the end of a Huffman-compressed scan. + */ + +METHODDEF(void) +finish_pass_huff (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + working_state state; + + if (cinfo->progressive_mode) { + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Flush out any buffered data */ + emit_eobrun(entropy); + flush_bits_e(entropy); + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + } else { + /* Load up working state ... flush_bits needs it */ + state.next_output_byte = cinfo->dest->next_output_byte; + state.free_in_buffer = cinfo->dest->free_in_buffer; + ASSIGN_STATE(state.cur, entropy->saved); + state.cinfo = cinfo; + + /* Flush out the last data */ + if (! flush_bits_s(&state)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + + /* Update state */ + cinfo->dest->next_output_byte = state.next_output_byte; + cinfo->dest->free_in_buffer = state.free_in_buffer; + ASSIGN_STATE(entropy->saved, state.cur); + } +} + + +/* + * Huffman coding optimization. + * + * We first scan the supplied data and count the number of uses of each symbol + * that is to be Huffman-coded. (This process MUST agree with the code above.) + * Then we build a Huffman coding tree for the observed counts. + * Symbols which are not needed at all for the particular image are not + * assigned any code, which saves space in the DHT marker as well as in + * the compressed data. + */ + + +/* Process a single block's worth of coefficients */ + +LOCAL(void) +htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val, + long dc_counts[], long ac_counts[]) +{ + register int temp; + register int nbits; + register int k, r; + int Se = cinfo->lim_Se; + const int * natural_order = cinfo->natural_order; + + /* Encode the DC coefficient difference per section F.1.2.1 */ + + temp = block[0] - last_dc_val; + if (temp < 0) + temp = -temp; + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count the Huffman symbol for the number of bits */ + dc_counts[nbits]++; + + /* Encode the AC coefficients per section F.1.2.2 */ + + r = 0; /* r = run length of zeros */ + + for (k = 1; k <= Se; k++) { + if ((temp = block[natural_order[k]]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + ac_counts[0xF0]++; + r -= 16; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + if (temp < 0) + temp = -temp; + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count Huffman symbol for run length / number of bits */ + ac_counts[(r << 4) + nbits]++; + + r = 0; + } + } + + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) + ac_counts[0]++; +} + + +/* + * Trial-encode one MCU's worth of Huffman-compressed coefficients. + * No data is actually output, so no suspension return is possible. + */ + +METHODDEF(boolean) +encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int blkn, ci; + jpeg_component_info * compptr; + + /* Take care of restart intervals if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + /* Update restart state */ + entropy->restarts_to_go = cinfo->restart_interval; + } + entropy->restarts_to_go--; + } + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci], + entropy->dc_count_ptrs[compptr->dc_tbl_no], + entropy->ac_count_ptrs[compptr->ac_tbl_no]); + entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0]; + } + + return TRUE; +} + + +/* + * Generate the best Huffman code table for the given counts, fill htbl. + * + * The JPEG standard requires that no symbol be assigned a codeword of all + * one bits (so that padding bits added at the end of a compressed segment + * can't look like a valid code). Because of the canonical ordering of + * codewords, this just means that there must be an unused slot in the + * longest codeword length category. Section K.2 of the JPEG spec suggests + * reserving such a slot by pretending that symbol 256 is a valid symbol + * with count 1. In theory that's not optimal; giving it count zero but + * including it in the symbol set anyway should give a better Huffman code. + * But the theoretically better code actually seems to come out worse in + * practice, because it produces more all-ones bytes (which incur stuffed + * zero bytes in the final file). In any case the difference is tiny. + * + * The JPEG standard requires Huffman codes to be no more than 16 bits long. + * If some symbols have a very small but nonzero probability, the Huffman tree + * must be adjusted to meet the code length restriction. We currently use + * the adjustment method suggested in JPEG section K.2. This method is *not* + * optimal; it may not choose the best possible limited-length code. But + * typically only very-low-frequency symbols will be given less-than-optimal + * lengths, so the code is almost optimal. Experimental comparisons against + * an optimal limited-length-code algorithm indicate that the difference is + * microscopic --- usually less than a hundredth of a percent of total size. + * So the extra complexity of an optimal algorithm doesn't seem worthwhile. + */ + +LOCAL(void) +jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]) +{ +#define MAX_CLEN 32 /* assumed maximum initial code length */ + UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */ + int codesize[257]; /* codesize[k] = code length of symbol k */ + int others[257]; /* next symbol in current branch of tree */ + int c1, c2; + int p, i, j; + long v; + + /* This algorithm is explained in section K.2 of the JPEG standard */ + + MEMZERO(bits, SIZEOF(bits)); + MEMZERO(codesize, SIZEOF(codesize)); + for (i = 0; i < 257; i++) + others[i] = -1; /* init links to empty */ + + freq[256] = 1; /* make sure 256 has a nonzero count */ + /* Including the pseudo-symbol 256 in the Huffman procedure guarantees + * that no real symbol is given code-value of all ones, because 256 + * will be placed last in the largest codeword category. + */ + + /* Huffman's basic algorithm to assign optimal code lengths to symbols */ + + for (;;) { + /* Find the smallest nonzero frequency, set c1 = its symbol */ + /* In case of ties, take the larger symbol number */ + c1 = -1; + v = 1000000000L; + for (i = 0; i <= 256; i++) { + if (freq[i] && freq[i] <= v) { + v = freq[i]; + c1 = i; + } + } + + /* Find the next smallest nonzero frequency, set c2 = its symbol */ + /* In case of ties, take the larger symbol number */ + c2 = -1; + v = 1000000000L; + for (i = 0; i <= 256; i++) { + if (freq[i] && freq[i] <= v && i != c1) { + v = freq[i]; + c2 = i; + } + } + + /* Done if we've merged everything into one frequency */ + if (c2 < 0) + break; + + /* Else merge the two counts/trees */ + freq[c1] += freq[c2]; + freq[c2] = 0; + + /* Increment the codesize of everything in c1's tree branch */ + codesize[c1]++; + while (others[c1] >= 0) { + c1 = others[c1]; + codesize[c1]++; + } + + others[c1] = c2; /* chain c2 onto c1's tree branch */ + + /* Increment the codesize of everything in c2's tree branch */ + codesize[c2]++; + while (others[c2] >= 0) { + c2 = others[c2]; + codesize[c2]++; + } + } + + /* Now count the number of symbols of each code length */ + for (i = 0; i <= 256; i++) { + if (codesize[i]) { + /* The JPEG standard seems to think that this can't happen, */ + /* but I'm paranoid... */ + if (codesize[i] > MAX_CLEN) + ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW); + + bits[codesize[i]]++; + } + } + + /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure + * Huffman procedure assigned any such lengths, we must adjust the coding. + * Here is what the JPEG spec says about how this next bit works: + * Since symbols are paired for the longest Huffman code, the symbols are + * removed from this length category two at a time. The prefix for the pair + * (which is one bit shorter) is allocated to one of the pair; then, + * skipping the BITS entry for that prefix length, a code word from the next + * shortest nonzero BITS entry is converted into a prefix for two code words + * one bit longer. + */ + + for (i = MAX_CLEN; i > 16; i--) { + while (bits[i] > 0) { + j = i - 2; /* find length of new prefix to be used */ + while (bits[j] == 0) + j--; + + bits[i] -= 2; /* remove two symbols */ + bits[i-1]++; /* one goes in this length */ + bits[j+1] += 2; /* two new symbols in this length */ + bits[j]--; /* symbol of this length is now a prefix */ + } + } + + /* Remove the count for the pseudo-symbol 256 from the largest codelength */ + while (bits[i] == 0) /* find largest codelength still in use */ + i--; + bits[i]--; + + /* Return final symbol counts (only for lengths 0..16) */ + MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits)); + + /* Return a list of the symbols sorted by code length */ + /* It's not real clear to me why we don't need to consider the codelength + * changes made above, but the JPEG spec seems to think this works. + */ + p = 0; + for (i = 1; i <= MAX_CLEN; i++) { + for (j = 0; j <= 255; j++) { + if (codesize[j] == i) { + htbl->huffval[p] = (UINT8) j; + p++; + } + } + } + + /* Set sent_table FALSE so updated table will be written to JPEG file. */ + htbl->sent_table = FALSE; +} + + +/* + * Finish up a statistics-gathering pass and create the new Huffman tables. + */ + +METHODDEF(void) +finish_pass_gather (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + JHUFF_TBL **htblptr; + boolean did_dc[NUM_HUFF_TBLS]; + boolean did_ac[NUM_HUFF_TBLS]; + + /* It's important not to apply jpeg_gen_optimal_table more than once + * per table, because it clobbers the input frequency counts! + */ + if (cinfo->progressive_mode) + /* Flush out buffered data (all we care about is counting the EOB symbol) */ + emit_eobrun(entropy); + + MEMZERO(did_dc, SIZEOF(did_dc)); + MEMZERO(did_ac, SIZEOF(did_ac)); + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (! did_dc[tbl]) { + htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[tbl]); + did_dc[tbl] = TRUE; + } + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (! did_ac[tbl]) { + htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[tbl]); + did_ac[tbl] = TRUE; + } + } + } +} + + +/* + * Initialize for a Huffman-compressed scan. + * If gather_statistics is TRUE, we do not output anything during the scan, + * just count the Huffman symbols used and generate Huffman code tables. + */ + +METHODDEF(void) +start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (gather_statistics) + entropy->pub.finish_pass = finish_pass_gather; + else + entropy->pub.finish_pass = finish_pass_huff; + + if (cinfo->progressive_mode) { + entropy->cinfo = cinfo; + entropy->gather_statistics = gather_statistics; + + /* We assume jcmaster.c already validated the scan parameters. */ + + /* Select execution routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_refine; + else { + entropy->pub.encode_mcu = encode_mcu_AC_refine; + /* AC refinement needs a correction bit buffer */ + if (entropy->bit_buffer == NULL) + entropy->bit_buffer = (char *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + MAX_CORR_BITS * SIZEOF(char)); + } + } + + /* Initialize AC stuff */ + entropy->ac_tbl_no = cinfo->cur_comp_info[0]->ac_tbl_no; + entropy->EOBRUN = 0; + entropy->BE = 0; + } else { + if (gather_statistics) + entropy->pub.encode_mcu = encode_mcu_gather; + else + entropy->pub.encode_mcu = encode_mcu_huff; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (gather_statistics) { + /* Check for invalid table index */ + /* (make_c_derived_tbl does this in the other path) */ + if (tbl < 0 || tbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); + /* Allocate and zero the statistics tables */ + /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ + if (entropy->dc_count_ptrs[tbl] == NULL) + entropy->dc_count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long)); + } else { + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + jpeg_make_c_derived_tbl(cinfo, TRUE, tbl, + & entropy->dc_derived_tbls[tbl]); + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (gather_statistics) { + if (tbl < 0 || tbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); + if (entropy->ac_count_ptrs[tbl] == NULL) + entropy->ac_count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long)); + } else { + jpeg_make_c_derived_tbl(cinfo, FALSE, tbl, + & entropy->ac_derived_tbls[tbl]); + } + } + } + + /* Initialize bit buffer to empty */ + entropy->saved.put_buffer = 0; + entropy->saved.put_bits = 0; + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} + + +/* + * Module initialization routine for Huffman entropy encoding. + */ + +GLOBAL(void) +jinit_huff_encoder (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy; + int i; + + entropy = (huff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(huff_entropy_encoder)); + cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; + entropy->pub.start_pass = start_pass_huff; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; + entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL; + } + + if (cinfo->progressive_mode) + entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ +} diff --git a/src/3rdparty/libjpeg/jcinit.c b/src/3rdparty/libjpeg/jcinit.c new file mode 100644 index 0000000000..0ba310f217 --- /dev/null +++ b/src/3rdparty/libjpeg/jcinit.c @@ -0,0 +1,65 @@ +/* + * jcinit.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains initialization logic for the JPEG compressor. + * This routine is in charge of selecting the modules to be executed and + * making an initialization call to each one. + * + * Logically, this code belongs in jcmaster.c. It's split out because + * linking this routine implies linking the entire compression library. + * For a transcoding-only application, we want to be able to use jcmaster.c + * without linking in the whole library. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Master selection of compression modules. + * This is done once at the start of processing an image. We determine + * which modules will be used and give them appropriate initialization calls. + */ + +GLOBAL(void) +jinit_compress_master (j_compress_ptr cinfo) +{ + /* Initialize master control (includes parameter checking/processing) */ + jinit_c_master_control(cinfo, FALSE /* full compression */); + + /* Preprocessing */ + if (! cinfo->raw_data_in) { + jinit_color_converter(cinfo); + jinit_downsampler(cinfo); + jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */); + } + /* Forward DCT */ + jinit_forward_dct(cinfo); + /* Entropy encoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_encoder(cinfo); + else { + jinit_huff_encoder(cinfo); + } + + /* Need a full-image coefficient buffer in any multi-pass mode. */ + jinit_c_coef_controller(cinfo, + (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding)); + jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */); + + jinit_marker_writer(cinfo); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Write the datastream header (SOI) immediately. + * Frame and scan headers are postponed till later. + * This lets application insert special markers after the SOI. + */ + (*cinfo->marker->write_file_header) (cinfo); +} diff --git a/src/3rdparty/libjpeg/jcmainct.c b/src/3rdparty/libjpeg/jcmainct.c new file mode 100644 index 0000000000..7de75d1675 --- /dev/null +++ b/src/3rdparty/libjpeg/jcmainct.c @@ -0,0 +1,293 @@ +/* + * jcmainct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the main buffer controller for compression. + * The main buffer lies between the pre-processor and the JPEG + * compressor proper; it holds downsampled data in the JPEG colorspace. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Note: currently, there is no operating mode in which a full-image buffer + * is needed at this step. If there were, that mode could not be used with + * "raw data" input, since this module is bypassed in that case. However, + * we've left the code here for possible use in special applications. + */ +#undef FULL_MAIN_BUFFER_SUPPORTED + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_main_controller pub; /* public fields */ + + JDIMENSION cur_iMCU_row; /* number of current iMCU row */ + JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */ + boolean suspended; /* remember if we suspended output */ + J_BUF_MODE pass_mode; /* current operating mode */ + + /* If using just a strip buffer, this points to the entire set of buffers + * (we allocate one for each component). In the full-image case, this + * points to the currently accessible strips of the virtual arrays. + */ + JSAMPARRAY buffer[MAX_COMPONENTS]; + +#ifdef FULL_MAIN_BUFFER_SUPPORTED + /* If using full-image storage, this array holds pointers to virtual-array + * control blocks for each component. Unused if not full-image storage. + */ + jvirt_sarray_ptr whole_image[MAX_COMPONENTS]; +#endif +} my_main_controller; + +typedef my_main_controller * my_main_ptr; + + +/* Forward declarations */ +METHODDEF(void) process_data_simple_main + JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); +#ifdef FULL_MAIN_BUFFER_SUPPORTED +METHODDEF(void) process_data_buffer_main + JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); +#endif + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + + /* Do nothing in raw-data mode. */ + if (cinfo->raw_data_in) + return; + + main->cur_iMCU_row = 0; /* initialize counters */ + main->rowgroup_ctr = 0; + main->suspended = FALSE; + main->pass_mode = pass_mode; /* save mode for use by process_data */ + + switch (pass_mode) { + case JBUF_PASS_THRU: +#ifdef FULL_MAIN_BUFFER_SUPPORTED + if (main->whole_image[0] != NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + main->pub.process_data = process_data_simple_main; + break; +#ifdef FULL_MAIN_BUFFER_SUPPORTED + case JBUF_SAVE_SOURCE: + case JBUF_CRANK_DEST: + case JBUF_SAVE_AND_PASS: + if (main->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + main->pub.process_data = process_data_buffer_main; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data. + * This routine handles the simple pass-through mode, + * where we have only a strip buffer. + */ + +METHODDEF(void) +process_data_simple_main (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail) +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + + while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { + /* Read input data if we haven't filled the main buffer yet */ + if (main->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size) + (*cinfo->prep->pre_process_data) (cinfo, + input_buf, in_row_ctr, in_rows_avail, + main->buffer, &main->rowgroup_ctr, + (JDIMENSION) cinfo->min_DCT_v_scaled_size); + + /* If we don't have a full iMCU row buffered, return to application for + * more data. Note that preprocessor will always pad to fill the iMCU row + * at the bottom of the image. + */ + if (main->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size) + return; + + /* Send the completed row to the compressor */ + if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { + /* If compressor did not consume the whole row, then we must need to + * suspend processing and return to the application. In this situation + * we pretend we didn't yet consume the last input row; otherwise, if + * it happened to be the last row of the image, the application would + * think we were done. + */ + if (! main->suspended) { + (*in_row_ctr)--; + main->suspended = TRUE; + } + return; + } + /* We did finish the row. Undo our little suspension hack if a previous + * call suspended; then mark the main buffer empty. + */ + if (main->suspended) { + (*in_row_ctr)++; + main->suspended = FALSE; + } + main->rowgroup_ctr = 0; + main->cur_iMCU_row++; + } +} + + +#ifdef FULL_MAIN_BUFFER_SUPPORTED + +/* + * Process some data. + * This routine handles all of the modes that use a full-size buffer. + */ + +METHODDEF(void) +process_data_buffer_main (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail) +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + int ci; + jpeg_component_info *compptr; + boolean writing = (main->pass_mode != JBUF_CRANK_DEST); + + while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { + /* Realign the virtual buffers if at the start of an iMCU row. */ + if (main->rowgroup_ctr == 0) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + main->buffer[ci] = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, main->whole_image[ci], + main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE), + (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing); + } + /* In a read pass, pretend we just read some source data. */ + if (! writing) { + *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE; + main->rowgroup_ctr = DCTSIZE; + } + } + + /* If a write pass, read input data until the current iMCU row is full. */ + /* Note: preprocessor will pad if necessary to fill the last iMCU row. */ + if (writing) { + (*cinfo->prep->pre_process_data) (cinfo, + input_buf, in_row_ctr, in_rows_avail, + main->buffer, &main->rowgroup_ctr, + (JDIMENSION) DCTSIZE); + /* Return to application if we need more data to fill the iMCU row. */ + if (main->rowgroup_ctr < DCTSIZE) + return; + } + + /* Emit data, unless this is a sink-only pass. */ + if (main->pass_mode != JBUF_SAVE_SOURCE) { + if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { + /* If compressor did not consume the whole row, then we must need to + * suspend processing and return to the application. In this situation + * we pretend we didn't yet consume the last input row; otherwise, if + * it happened to be the last row of the image, the application would + * think we were done. + */ + if (! main->suspended) { + (*in_row_ctr)--; + main->suspended = TRUE; + } + return; + } + /* We did finish the row. Undo our little suspension hack if a previous + * call suspended; then mark the main buffer empty. + */ + if (main->suspended) { + (*in_row_ctr)++; + main->suspended = FALSE; + } + } + + /* If get here, we are done with this iMCU row. Mark buffer empty. */ + main->rowgroup_ctr = 0; + main->cur_iMCU_row++; + } +} + +#endif /* FULL_MAIN_BUFFER_SUPPORTED */ + + +/* + * Initialize main buffer controller. + */ + +GLOBAL(void) +jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_main_ptr main; + int ci; + jpeg_component_info *compptr; + + main = (my_main_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_main_controller)); + cinfo->main = (struct jpeg_c_main_controller *) main; + main->pub.start_pass = start_pass_main; + + /* We don't need to create a buffer in raw-data mode. */ + if (cinfo->raw_data_in) + return; + + /* Create the buffer. It holds downsampled data, so each component + * may be of a different size. + */ + if (need_full_buffer) { +#ifdef FULL_MAIN_BUFFER_SUPPORTED + /* Allocate a full-image virtual array for each component */ + /* Note we pad the bottom to a multiple of the iMCU height */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + main->whole_image[ci] = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor) * DCTSIZE, + (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); + } +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + } else { +#ifdef FULL_MAIN_BUFFER_SUPPORTED + main->whole_image[0] = NULL; /* flag for no virtual arrays */ +#endif + /* Allocate a strip buffer for each component */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + main->buffer[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); + } + } +} diff --git a/src/3rdparty/libjpeg/jcmarker.c b/src/3rdparty/libjpeg/jcmarker.c new file mode 100644 index 0000000000..606c19af39 --- /dev/null +++ b/src/3rdparty/libjpeg/jcmarker.c @@ -0,0 +1,682 @@ +/* + * jcmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to write JPEG datastream markers. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP1 = 0xe1, + M_APP2 = 0xe2, + M_APP3 = 0xe3, + M_APP4 = 0xe4, + M_APP5 = 0xe5, + M_APP6 = 0xe6, + M_APP7 = 0xe7, + M_APP8 = 0xe8, + M_APP9 = 0xe9, + M_APP10 = 0xea, + M_APP11 = 0xeb, + M_APP12 = 0xec, + M_APP13 = 0xed, + M_APP14 = 0xee, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; + + +/* Private state */ + +typedef struct { + struct jpeg_marker_writer pub; /* public fields */ + + unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */ +} my_marker_writer; + +typedef my_marker_writer * my_marker_ptr; + + +/* + * Basic output routines. + * + * Note that we do not support suspension while writing a marker. + * Therefore, an application using suspension must ensure that there is + * enough buffer space for the initial markers (typ. 600-700 bytes) before + * calling jpeg_start_compress, and enough space to write the trailing EOI + * (a few bytes) before calling jpeg_finish_compress. Multipass compression + * modes are not supported at all with suspension, so those two are the only + * points where markers will be written. + */ + +LOCAL(void) +emit_byte (j_compress_ptr cinfo, int val) +/* Emit a byte */ +{ + struct jpeg_destination_mgr * dest = cinfo->dest; + + *(dest->next_output_byte)++ = (JOCTET) val; + if (--dest->free_in_buffer == 0) { + if (! (*dest->empty_output_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + } +} + + +LOCAL(void) +emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark) +/* Emit a marker code */ +{ + emit_byte(cinfo, 0xFF); + emit_byte(cinfo, (int) mark); +} + + +LOCAL(void) +emit_2bytes (j_compress_ptr cinfo, int value) +/* Emit a 2-byte integer; these are always MSB first in JPEG files */ +{ + emit_byte(cinfo, (value >> 8) & 0xFF); + emit_byte(cinfo, value & 0xFF); +} + + +/* + * Routines to write specific marker types. + */ + +LOCAL(int) +emit_dqt (j_compress_ptr cinfo, int index) +/* Emit a DQT marker */ +/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */ +{ + JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index]; + int prec; + int i; + + if (qtbl == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index); + + prec = 0; + for (i = 0; i <= cinfo->lim_Se; i++) { + if (qtbl->quantval[cinfo->natural_order[i]] > 255) + prec = 1; + } + + if (! qtbl->sent_table) { + emit_marker(cinfo, M_DQT); + + emit_2bytes(cinfo, + prec ? cinfo->lim_Se * 2 + 2 + 1 + 2 : cinfo->lim_Se + 1 + 1 + 2); + + emit_byte(cinfo, index + (prec<<4)); + + for (i = 0; i <= cinfo->lim_Se; i++) { + /* The table entries must be emitted in zigzag order. */ + unsigned int qval = qtbl->quantval[cinfo->natural_order[i]]; + if (prec) + emit_byte(cinfo, (int) (qval >> 8)); + emit_byte(cinfo, (int) (qval & 0xFF)); + } + + qtbl->sent_table = TRUE; + } + + return prec; +} + + +LOCAL(void) +emit_dht (j_compress_ptr cinfo, int index, boolean is_ac) +/* Emit a DHT marker */ +{ + JHUFF_TBL * htbl; + int length, i; + + if (is_ac) { + htbl = cinfo->ac_huff_tbl_ptrs[index]; + index += 0x10; /* output index has AC bit set */ + } else { + htbl = cinfo->dc_huff_tbl_ptrs[index]; + } + + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index); + + if (! htbl->sent_table) { + emit_marker(cinfo, M_DHT); + + length = 0; + for (i = 1; i <= 16; i++) + length += htbl->bits[i]; + + emit_2bytes(cinfo, length + 2 + 1 + 16); + emit_byte(cinfo, index); + + for (i = 1; i <= 16; i++) + emit_byte(cinfo, htbl->bits[i]); + + for (i = 0; i < length; i++) + emit_byte(cinfo, htbl->huffval[i]); + + htbl->sent_table = TRUE; + } +} + + +LOCAL(void) +emit_dac (j_compress_ptr cinfo) +/* Emit a DAC marker */ +/* Since the useful info is so small, we want to emit all the tables in */ +/* one DAC marker. Therefore this routine does its own scan of the table. */ +{ +#ifdef C_ARITH_CODING_SUPPORTED + char dc_in_use[NUM_ARITH_TBLS]; + char ac_in_use[NUM_ARITH_TBLS]; + int length, i; + jpeg_component_info *compptr; + + for (i = 0; i < NUM_ARITH_TBLS; i++) + dc_in_use[i] = ac_in_use[i] = 0; + + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) + dc_in_use[compptr->dc_tbl_no] = 1; + /* AC needs no table when not present */ + if (cinfo->Se) + ac_in_use[compptr->ac_tbl_no] = 1; + } + + length = 0; + for (i = 0; i < NUM_ARITH_TBLS; i++) + length += dc_in_use[i] + ac_in_use[i]; + + if (length) { + emit_marker(cinfo, M_DAC); + + emit_2bytes(cinfo, length*2 + 2); + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + if (dc_in_use[i]) { + emit_byte(cinfo, i); + emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); + } + if (ac_in_use[i]) { + emit_byte(cinfo, i + 0x10); + emit_byte(cinfo, cinfo->arith_ac_K[i]); + } + } + } +#endif /* C_ARITH_CODING_SUPPORTED */ +} + + +LOCAL(void) +emit_dri (j_compress_ptr cinfo) +/* Emit a DRI marker */ +{ + emit_marker(cinfo, M_DRI); + + emit_2bytes(cinfo, 4); /* fixed length */ + + emit_2bytes(cinfo, (int) cinfo->restart_interval); +} + + +LOCAL(void) +emit_sof (j_compress_ptr cinfo, JPEG_MARKER code) +/* Emit a SOF marker */ +{ + int ci; + jpeg_component_info *compptr; + + emit_marker(cinfo, code); + + emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */ + + /* Make sure image isn't bigger than SOF field can handle */ + if ((long) cinfo->jpeg_height > 65535L || + (long) cinfo->jpeg_width > 65535L) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535); + + emit_byte(cinfo, cinfo->data_precision); + emit_2bytes(cinfo, (int) cinfo->jpeg_height); + emit_2bytes(cinfo, (int) cinfo->jpeg_width); + + emit_byte(cinfo, cinfo->num_components); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + emit_byte(cinfo, compptr->component_id); + emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor); + emit_byte(cinfo, compptr->quant_tbl_no); + } +} + + +LOCAL(void) +emit_sos (j_compress_ptr cinfo) +/* Emit a SOS marker */ +{ + int i, td, ta; + jpeg_component_info *compptr; + + emit_marker(cinfo, M_SOS); + + emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */ + + emit_byte(cinfo, cinfo->comps_in_scan); + + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + emit_byte(cinfo, compptr->component_id); + + /* We emit 0 for unused field(s); this is recommended by the P&M text + * but does not seem to be specified in the standard. + */ + + /* DC needs no table for refinement scan */ + td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0; + /* AC needs no table when not present */ + ta = cinfo->Se ? compptr->ac_tbl_no : 0; + + emit_byte(cinfo, (td << 4) + ta); + } + + emit_byte(cinfo, cinfo->Ss); + emit_byte(cinfo, cinfo->Se); + emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al); +} + + +LOCAL(void) +emit_pseudo_sos (j_compress_ptr cinfo) +/* Emit a pseudo SOS marker */ +{ + emit_marker(cinfo, M_SOS); + + emit_2bytes(cinfo, 2 + 1 + 3); /* length */ + + emit_byte(cinfo, 0); /* Ns */ + + emit_byte(cinfo, 0); /* Ss */ + emit_byte(cinfo, cinfo->block_size * cinfo->block_size - 1); /* Se */ + emit_byte(cinfo, 0); /* Ah/Al */ +} + + +LOCAL(void) +emit_jfif_app0 (j_compress_ptr cinfo) +/* Emit a JFIF-compliant APP0 marker */ +{ + /* + * Length of APP0 block (2 bytes) + * Block ID (4 bytes - ASCII "JFIF") + * Zero byte (1 byte to terminate the ID string) + * Version Major, Minor (2 bytes - major first) + * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm) + * Xdpu (2 bytes - dots per unit horizontal) + * Ydpu (2 bytes - dots per unit vertical) + * Thumbnail X size (1 byte) + * Thumbnail Y size (1 byte) + */ + + emit_marker(cinfo, M_APP0); + + emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */ + + emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */ + emit_byte(cinfo, 0x46); + emit_byte(cinfo, 0x49); + emit_byte(cinfo, 0x46); + emit_byte(cinfo, 0); + emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */ + emit_byte(cinfo, cinfo->JFIF_minor_version); + emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */ + emit_2bytes(cinfo, (int) cinfo->X_density); + emit_2bytes(cinfo, (int) cinfo->Y_density); + emit_byte(cinfo, 0); /* No thumbnail image */ + emit_byte(cinfo, 0); +} + + +LOCAL(void) +emit_adobe_app14 (j_compress_ptr cinfo) +/* Emit an Adobe APP14 marker */ +{ + /* + * Length of APP14 block (2 bytes) + * Block ID (5 bytes - ASCII "Adobe") + * Version Number (2 bytes - currently 100) + * Flags0 (2 bytes - currently 0) + * Flags1 (2 bytes - currently 0) + * Color transform (1 byte) + * + * Although Adobe TN 5116 mentions Version = 101, all the Adobe files + * now in circulation seem to use Version = 100, so that's what we write. + * + * We write the color transform byte as 1 if the JPEG color space is + * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with + * whether the encoder performed a transformation, which is pretty useless. + */ + + emit_marker(cinfo, M_APP14); + + emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */ + + emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */ + emit_byte(cinfo, 0x64); + emit_byte(cinfo, 0x6F); + emit_byte(cinfo, 0x62); + emit_byte(cinfo, 0x65); + emit_2bytes(cinfo, 100); /* Version */ + emit_2bytes(cinfo, 0); /* Flags0 */ + emit_2bytes(cinfo, 0); /* Flags1 */ + switch (cinfo->jpeg_color_space) { + case JCS_YCbCr: + emit_byte(cinfo, 1); /* Color transform = 1 */ + break; + case JCS_YCCK: + emit_byte(cinfo, 2); /* Color transform = 2 */ + break; + default: + emit_byte(cinfo, 0); /* Color transform = 0 */ + break; + } +} + + +/* + * These routines allow writing an arbitrary marker with parameters. + * The only intended use is to emit COM or APPn markers after calling + * write_file_header and before calling write_frame_header. + * Other uses are not guaranteed to produce desirable results. + * Counting the parameter bytes properly is the caller's responsibility. + */ + +METHODDEF(void) +write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen) +/* Emit an arbitrary marker header */ +{ + if (datalen > (unsigned int) 65533) /* safety check */ + ERREXIT(cinfo, JERR_BAD_LENGTH); + + emit_marker(cinfo, (JPEG_MARKER) marker); + + emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */ +} + +METHODDEF(void) +write_marker_byte (j_compress_ptr cinfo, int val) +/* Emit one byte of marker parameters following write_marker_header */ +{ + emit_byte(cinfo, val); +} + + +/* + * Write datastream header. + * This consists of an SOI and optional APPn markers. + * We recommend use of the JFIF marker, but not the Adobe marker, + * when using YCbCr or grayscale data. The JFIF marker should NOT + * be used for any other JPEG colorspace. The Adobe marker is helpful + * to distinguish RGB, CMYK, and YCCK colorspaces. + * Note that an application can write additional header markers after + * jpeg_start_compress returns. + */ + +METHODDEF(void) +write_file_header (j_compress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + emit_marker(cinfo, M_SOI); /* first the SOI */ + + /* SOI is defined to reset restart interval to 0 */ + marker->last_restart_interval = 0; + + if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */ + emit_jfif_app0(cinfo); + if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */ + emit_adobe_app14(cinfo); +} + + +/* + * Write frame header. + * This consists of DQT and SOFn markers, and a conditional pseudo SOS marker. + * Note that we do not emit the SOF until we have emitted the DQT(s). + * This avoids compatibility problems with incorrect implementations that + * try to error-check the quant table numbers as soon as they see the SOF. + */ + +METHODDEF(void) +write_frame_header (j_compress_ptr cinfo) +{ + int ci, prec; + boolean is_baseline; + jpeg_component_info *compptr; + + /* Emit DQT for each quantization table. + * Note that emit_dqt() suppresses any duplicate tables. + */ + prec = 0; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + prec += emit_dqt(cinfo, compptr->quant_tbl_no); + } + /* now prec is nonzero iff there are any 16-bit quant tables. */ + + /* Check for a non-baseline specification. + * Note we assume that Huffman table numbers won't be changed later. + */ + if (cinfo->arith_code || cinfo->progressive_mode || + cinfo->data_precision != 8 || cinfo->block_size != DCTSIZE) { + is_baseline = FALSE; + } else { + is_baseline = TRUE; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1) + is_baseline = FALSE; + } + if (prec && is_baseline) { + is_baseline = FALSE; + /* If it's baseline except for quantizer size, warn the user */ + TRACEMS(cinfo, 0, JTRC_16BIT_TABLES); + } + } + + /* Emit the proper SOF marker */ + if (cinfo->arith_code) { + if (cinfo->progressive_mode) + emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */ + else + emit_sof(cinfo, M_SOF9); /* SOF code for sequential arithmetic */ + } else { + if (cinfo->progressive_mode) + emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */ + else if (is_baseline) + emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */ + else + emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */ + } + + /* Check to emit pseudo SOS marker */ + if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE) + emit_pseudo_sos(cinfo); +} + + +/* + * Write scan header. + * This consists of DHT or DAC markers, optional DRI, and SOS. + * Compressed data will be written following the SOS. + */ + +METHODDEF(void) +write_scan_header (j_compress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + int i; + jpeg_component_info *compptr; + + if (cinfo->arith_code) { + /* Emit arith conditioning info. We may have some duplication + * if the file has multiple scans, but it's so small it's hardly + * worth worrying about. + */ + emit_dac(cinfo); + } else { + /* Emit Huffman tables. + * Note that emit_dht() suppresses any duplicate tables. + */ + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) + emit_dht(cinfo, compptr->dc_tbl_no, FALSE); + /* AC needs no table when not present */ + if (cinfo->Se) + emit_dht(cinfo, compptr->ac_tbl_no, TRUE); + } + } + + /* Emit DRI if required --- note that DRI value could change for each scan. + * We avoid wasting space with unnecessary DRIs, however. + */ + if (cinfo->restart_interval != marker->last_restart_interval) { + emit_dri(cinfo); + marker->last_restart_interval = cinfo->restart_interval; + } + + emit_sos(cinfo); +} + + +/* + * Write datastream trailer. + */ + +METHODDEF(void) +write_file_trailer (j_compress_ptr cinfo) +{ + emit_marker(cinfo, M_EOI); +} + + +/* + * Write an abbreviated table-specification datastream. + * This consists of SOI, DQT and DHT tables, and EOI. + * Any table that is defined and not marked sent_table = TRUE will be + * emitted. Note that all tables will be marked sent_table = TRUE at exit. + */ + +METHODDEF(void) +write_tables_only (j_compress_ptr cinfo) +{ + int i; + + emit_marker(cinfo, M_SOI); + + for (i = 0; i < NUM_QUANT_TBLS; i++) { + if (cinfo->quant_tbl_ptrs[i] != NULL) + (void) emit_dqt(cinfo, i); + } + + if (! cinfo->arith_code) { + for (i = 0; i < NUM_HUFF_TBLS; i++) { + if (cinfo->dc_huff_tbl_ptrs[i] != NULL) + emit_dht(cinfo, i, FALSE); + if (cinfo->ac_huff_tbl_ptrs[i] != NULL) + emit_dht(cinfo, i, TRUE); + } + } + + emit_marker(cinfo, M_EOI); +} + + +/* + * Initialize the marker writer module. + */ + +GLOBAL(void) +jinit_marker_writer (j_compress_ptr cinfo) +{ + my_marker_ptr marker; + + /* Create the subobject */ + marker = (my_marker_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_marker_writer)); + cinfo->marker = (struct jpeg_marker_writer *) marker; + /* Initialize method pointers */ + marker->pub.write_file_header = write_file_header; + marker->pub.write_frame_header = write_frame_header; + marker->pub.write_scan_header = write_scan_header; + marker->pub.write_file_trailer = write_file_trailer; + marker->pub.write_tables_only = write_tables_only; + marker->pub.write_marker_header = write_marker_header; + marker->pub.write_marker_byte = write_marker_byte; + /* Initialize private state */ + marker->last_restart_interval = 0; +} diff --git a/src/3rdparty/libjpeg/jcmaster.c b/src/3rdparty/libjpeg/jcmaster.c new file mode 100644 index 0000000000..caf80a53b3 --- /dev/null +++ b/src/3rdparty/libjpeg/jcmaster.c @@ -0,0 +1,858 @@ +/* + * jcmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2003-2011 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains master control logic for the JPEG compressor. + * These routines are concerned with parameter validation, initial setup, + * and inter-pass control (determining the number of passes and the work + * to be done in each pass). + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef enum { + main_pass, /* input data, also do first output step */ + huff_opt_pass, /* Huffman code optimization pass */ + output_pass /* data output pass */ +} c_pass_type; + +typedef struct { + struct jpeg_comp_master pub; /* public fields */ + + c_pass_type pass_type; /* the type of the current pass */ + + int pass_number; /* # of passes completed */ + int total_passes; /* total # of passes needed */ + + int scan_number; /* current index in scan_info[] */ +} my_comp_master; + +typedef my_comp_master * my_master_ptr; + + +/* + * Support routines that do various essential calculations. + */ + +/* + * Compute JPEG image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + */ + +GLOBAL(void) +jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo) +/* Do computations that are needed before master selection phase */ +{ +#ifdef DCT_SCALING_SUPPORTED + + /* Sanity check on input image dimensions to prevent overflow in + * following calculation. + * We do check jpeg_width and jpeg_height in initial_setup below, + * but image_width and image_height can come from arbitrary data, + * and we need some space for multiplication by block_size. + */ + if (((long) cinfo->image_width >> 24) || ((long) cinfo->image_height >> 24)) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* Compute actual JPEG image dimensions and DCT scaling choices. */ + if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/1 scaling */ + cinfo->jpeg_width = cinfo->image_width * cinfo->block_size; + cinfo->jpeg_height = cinfo->image_height * cinfo->block_size; + cinfo->min_DCT_h_scaled_size = 1; + cinfo->min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/2 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 2L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 2L); + cinfo->min_DCT_h_scaled_size = 2; + cinfo->min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/3 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L); + cinfo->min_DCT_h_scaled_size = 3; + cinfo->min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/4 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 4L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 4L); + cinfo->min_DCT_h_scaled_size = 4; + cinfo->min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/5 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L); + cinfo->min_DCT_h_scaled_size = 5; + cinfo->min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/6 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L); + cinfo->min_DCT_h_scaled_size = 6; + cinfo->min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/7 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L); + cinfo->min_DCT_h_scaled_size = 7; + cinfo->min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/8 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 8L); + cinfo->min_DCT_h_scaled_size = 8; + cinfo->min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * 9 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/9 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 9L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 9L); + cinfo->min_DCT_h_scaled_size = 9; + cinfo->min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/10 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L); + cinfo->min_DCT_h_scaled_size = 10; + cinfo->min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/11 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L); + cinfo->min_DCT_h_scaled_size = 11; + cinfo->min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/12 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L); + cinfo->min_DCT_h_scaled_size = 12; + cinfo->min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/13 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L); + cinfo->min_DCT_h_scaled_size = 13; + cinfo->min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/14 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L); + cinfo->min_DCT_h_scaled_size = 14; + cinfo->min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/15 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L); + cinfo->min_DCT_h_scaled_size = 15; + cinfo->min_DCT_v_scaled_size = 15; + } else { + /* Provide block_size/16 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L); + cinfo->min_DCT_h_scaled_size = 16; + cinfo->min_DCT_v_scaled_size = 16; + } + +#else /* !DCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->jpeg_width = cinfo->image_width; + cinfo->jpeg_height = cinfo->image_height; + cinfo->min_DCT_h_scaled_size = DCTSIZE; + cinfo->min_DCT_v_scaled_size = DCTSIZE; + +#endif /* DCT_SCALING_SUPPORTED */ +} + + +LOCAL(void) +jpeg_calc_trans_dimensions (j_compress_ptr cinfo) +{ + if (cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + cinfo->min_DCT_h_scaled_size, cinfo->min_DCT_v_scaled_size); + + cinfo->block_size = cinfo->min_DCT_h_scaled_size; +} + + +LOCAL(void) +initial_setup (j_compress_ptr cinfo, boolean transcode_only) +/* Do computations that are needed before master selection phase */ +{ + int ci, ssize; + jpeg_component_info *compptr; + long samplesperrow; + JDIMENSION jd_samplesperrow; + + if (transcode_only) + jpeg_calc_trans_dimensions(cinfo); + else + jpeg_calc_jpeg_dimensions(cinfo); + + /* Sanity check on block_size */ + if (cinfo->block_size < 1 || cinfo->block_size > 16) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->block_size, cinfo->block_size); + + /* Derive natural_order from block_size */ + switch (cinfo->block_size) { + case 2: cinfo->natural_order = jpeg_natural_order2; break; + case 3: cinfo->natural_order = jpeg_natural_order3; break; + case 4: cinfo->natural_order = jpeg_natural_order4; break; + case 5: cinfo->natural_order = jpeg_natural_order5; break; + case 6: cinfo->natural_order = jpeg_natural_order6; break; + case 7: cinfo->natural_order = jpeg_natural_order7; break; + default: cinfo->natural_order = jpeg_natural_order; break; + } + + /* Derive lim_Se from block_size */ + cinfo->lim_Se = cinfo->block_size < DCTSIZE ? + cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1; + + /* Sanity check on image dimensions */ + if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 || + cinfo->num_components <= 0 || cinfo->input_components <= 0) + ERREXIT(cinfo, JERR_EMPTY_IMAGE); + + /* Make sure image isn't bigger than I can handle */ + if ((long) cinfo->jpeg_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* Width of an input scanline must be representable as JDIMENSION. */ + samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components; + jd_samplesperrow = (JDIMENSION) samplesperrow; + if ((long) jd_samplesperrow != samplesperrow) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + + /* For now, precision must match compiled-in value... */ + if (cinfo->data_precision != BITS_IN_JSAMPLE) + ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); + + /* Check that number of components won't exceed internal array sizes */ + if (cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + ERREXIT(cinfo, JERR_BAD_SAMPLING); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* Compute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Fill in the correct component_index value; don't rely on application */ + compptr->component_index = ci; + /* In selecting the actual DCT scaling for each component, we try to + * scale down the chroma components via DCT scaling rather than downsampling. + * This saves time if the downsampler gets to use 1:1 scaling. + * Note this code adapts subsampling ratios which are powers of 2. + */ + ssize = 1; +#ifdef DCT_SCALING_SUPPORTED + while (cinfo->min_DCT_h_scaled_size * ssize <= + (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } +#endif + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; + ssize = 1; +#ifdef DCT_SCALING_SUPPORTED + while (cinfo->min_DCT_v_scaled_size * ssize <= + (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } +#endif + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; + + /* We don't support DCT ratios larger than 2. */ + if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) + compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; + else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) + compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; + + /* Size in DCT blocks */ + compptr->width_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* Size in samples */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_width * + (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height * + (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* Mark component needed (this flag isn't actually used for compression) */ + compptr->component_needed = TRUE; + } + + /* Compute number of fully interleaved MCU rows (number of times that + * main controller will call coefficient controller). + */ + cinfo->total_iMCU_rows = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); +} + + +#ifdef C_MULTISCAN_FILES_SUPPORTED + +LOCAL(void) +validate_script (j_compress_ptr cinfo) +/* Verify that the scan script in cinfo->scan_info[] is valid; also + * determine whether it uses progressive JPEG, and set cinfo->progressive_mode. + */ +{ + const jpeg_scan_info * scanptr; + int scanno, ncomps, ci, coefi, thisi; + int Ss, Se, Ah, Al; + boolean component_sent[MAX_COMPONENTS]; +#ifdef C_PROGRESSIVE_SUPPORTED + int * last_bitpos_ptr; + int last_bitpos[MAX_COMPONENTS][DCTSIZE2]; + /* -1 until that coefficient has been seen; then last Al for it */ +#endif + + if (cinfo->num_scans <= 0) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0); + + /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1; + * for progressive JPEG, no scan can have this. + */ + scanptr = cinfo->scan_info; + if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) { +#ifdef C_PROGRESSIVE_SUPPORTED + cinfo->progressive_mode = TRUE; + last_bitpos_ptr = & last_bitpos[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (coefi = 0; coefi < DCTSIZE2; coefi++) + *last_bitpos_ptr++ = -1; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + cinfo->progressive_mode = FALSE; + for (ci = 0; ci < cinfo->num_components; ci++) + component_sent[ci] = FALSE; + } + + for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) { + /* Validate component indexes */ + ncomps = scanptr->comps_in_scan; + if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN); + for (ci = 0; ci < ncomps; ci++) { + thisi = scanptr->component_index[ci]; + if (thisi < 0 || thisi >= cinfo->num_components) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + /* Components must appear in SOF order within each scan */ + if (ci > 0 && thisi <= scanptr->component_index[ci-1]) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + } + /* Validate progression parameters */ + Ss = scanptr->Ss; + Se = scanptr->Se; + Ah = scanptr->Ah; + Al = scanptr->Al; + if (cinfo->progressive_mode) { +#ifdef C_PROGRESSIVE_SUPPORTED + /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that + * seems wrong: the upper bound ought to depend on data precision. + * Perhaps they really meant 0..N+1 for N-bit precision. + * Here we allow 0..10 for 8-bit data; Al larger than 10 results in + * out-of-range reconstructed DC values during the first DC scan, + * which might cause problems for some decoders. + */ +#if BITS_IN_JSAMPLE == 8 +#define MAX_AH_AL 10 +#else +#define MAX_AH_AL 13 +#endif + if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 || + Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + if (Ss == 0) { + if (Se != 0) /* DC and AC together not OK */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } else { + if (ncomps != 1) /* AC scans must be for only one component */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } + for (ci = 0; ci < ncomps; ci++) { + last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0]; + if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + for (coefi = Ss; coefi <= Se; coefi++) { + if (last_bitpos_ptr[coefi] < 0) { + /* first scan of this coefficient */ + if (Ah != 0) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } else { + /* not first scan */ + if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } + last_bitpos_ptr[coefi] = Al; + } + } +#endif + } else { + /* For sequential JPEG, all progression parameters must be these: */ + if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + /* Make sure components are not sent twice */ + for (ci = 0; ci < ncomps; ci++) { + thisi = scanptr->component_index[ci]; + if (component_sent[thisi]) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + component_sent[thisi] = TRUE; + } + } + } + + /* Now verify that everything got sent. */ + if (cinfo->progressive_mode) { +#ifdef C_PROGRESSIVE_SUPPORTED + /* For progressive mode, we only check that at least some DC data + * got sent for each component; the spec does not require that all bits + * of all coefficients be transmitted. Would it be wiser to enforce + * transmission of all coefficient bits?? + */ + for (ci = 0; ci < cinfo->num_components; ci++) { + if (last_bitpos[ci][0] < 0) + ERREXIT(cinfo, JERR_MISSING_DATA); + } +#endif + } else { + for (ci = 0; ci < cinfo->num_components; ci++) { + if (! component_sent[ci]) + ERREXIT(cinfo, JERR_MISSING_DATA); + } + } +} + + +LOCAL(void) +reduce_script (j_compress_ptr cinfo) +/* Adapt scan script for use with reduced block size; + * assume that script has been validated before. + */ +{ + jpeg_scan_info * scanptr; + int idxout, idxin; + + /* Circumvent const declaration for this function */ + scanptr = (jpeg_scan_info *) cinfo->scan_info; + idxout = 0; + + for (idxin = 0; idxin < cinfo->num_scans; idxin++) { + /* After skipping, idxout becomes smaller than idxin */ + if (idxin != idxout) + /* Copy rest of data; + * note we stay in given chunk of allocated memory. + */ + scanptr[idxout] = scanptr[idxin]; + if (scanptr[idxout].Ss > cinfo->lim_Se) + /* Entire scan out of range - skip this entry */ + continue; + if (scanptr[idxout].Se > cinfo->lim_Se) + /* Limit scan to end of block */ + scanptr[idxout].Se = cinfo->lim_Se; + idxout++; + } + + cinfo->num_scans = idxout; +} + +#endif /* C_MULTISCAN_FILES_SUPPORTED */ + + +LOCAL(void) +select_scan_parameters (j_compress_ptr cinfo) +/* Set up the scan parameters for the current scan */ +{ + int ci; + +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (cinfo->scan_info != NULL) { + /* Prepare for current scan --- the script is already validated */ + my_master_ptr master = (my_master_ptr) cinfo->master; + const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number; + + cinfo->comps_in_scan = scanptr->comps_in_scan; + for (ci = 0; ci < scanptr->comps_in_scan; ci++) { + cinfo->cur_comp_info[ci] = + &cinfo->comp_info[scanptr->component_index[ci]]; + } + if (cinfo->progressive_mode) { + cinfo->Ss = scanptr->Ss; + cinfo->Se = scanptr->Se; + cinfo->Ah = scanptr->Ah; + cinfo->Al = scanptr->Al; + return; + } + } + else +#endif + { + /* Prepare for single sequential-JPEG scan containing all components */ + if (cinfo->num_components > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPS_IN_SCAN); + cinfo->comps_in_scan = cinfo->num_components; + for (ci = 0; ci < cinfo->num_components; ci++) { + cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; + } + } + cinfo->Ss = 0; + cinfo->Se = cinfo->block_size * cinfo->block_size - 1; + cinfo->Ah = 0; + cinfo->Al = 0; +} + + +LOCAL(void) +per_scan_setup (j_compress_ptr cinfo) +/* Do computations that are needed before processing a JPEG scan */ +/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */ +{ + int ci, mcublks, tmp; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan == 1) { + + /* Noninterleaved (single-component) scan */ + compptr = cinfo->cur_comp_info[0]; + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = compptr->width_in_blocks; + cinfo->MCU_rows_in_scan = compptr->height_in_blocks; + + /* For noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + compptr->MCU_sample_width = compptr->DCT_h_scaled_size; + compptr->last_col_width = 1; + /* For noninterleaved scans, it is convenient to define last_row_height + * as the number of block rows present in the last iMCU row. + */ + tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (tmp == 0) tmp = compptr->v_samp_factor; + compptr->last_row_height = tmp; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + } else { + + /* Interleaved (multi-component) scan */ + if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, + MAX_COMPS_IN_SCAN); + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_width, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Sampling factors give # of blocks of component in each MCU */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size; + /* Figure number of non-dummy blocks in last MCU column & row */ + tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); + if (tmp == 0) tmp = compptr->MCU_width; + compptr->last_col_width = tmp; + tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); + if (tmp == 0) tmp = compptr->MCU_height; + compptr->last_row_height = tmp; + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU) + ERREXIT(cinfo, JERR_BAD_MCU_SIZE); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + } + + /* Convert restart specified in rows to actual MCU count. */ + /* Note that count must fit in 16 bits, so we provide limiting. */ + if (cinfo->restart_in_rows > 0) { + long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row; + cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L); + } +} + + +/* + * Per-pass setup. + * This is called at the beginning of each pass. We determine which modules + * will be active during this pass and give them appropriate start_pass calls. + * We also set is_last_pass to indicate whether any more passes will be + * required. + */ + +METHODDEF(void) +prepare_for_pass (j_compress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + switch (master->pass_type) { + case main_pass: + /* Initial pass: will collect input data, and do either Huffman + * optimization or data output for the first scan. + */ + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + if (! cinfo->raw_data_in) { + (*cinfo->cconvert->start_pass) (cinfo); + (*cinfo->downsample->start_pass) (cinfo); + (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU); + } + (*cinfo->fdct->start_pass) (cinfo); + (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding); + (*cinfo->coef->start_pass) (cinfo, + (master->total_passes > 1 ? + JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); + (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); + if (cinfo->optimize_coding) { + /* No immediate data output; postpone writing frame/scan headers */ + master->pub.call_pass_startup = FALSE; + } else { + /* Will write frame/scan headers at first jpeg_write_scanlines call */ + master->pub.call_pass_startup = TRUE; + } + break; +#ifdef ENTROPY_OPT_SUPPORTED + case huff_opt_pass: + /* Do Huffman optimization for a scan after the first one. */ + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + if (cinfo->Ss != 0 || cinfo->Ah == 0) { + (*cinfo->entropy->start_pass) (cinfo, TRUE); + (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); + master->pub.call_pass_startup = FALSE; + break; + } + /* Special case: Huffman DC refinement scans need no Huffman table + * and therefore we can skip the optimization pass for them. + */ + master->pass_type = output_pass; + master->pass_number++; + /*FALLTHROUGH*/ +#endif + case output_pass: + /* Do a data-output pass. */ + /* We need not repeat per-scan setup if prior optimization pass did it. */ + if (! cinfo->optimize_coding) { + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + } + (*cinfo->entropy->start_pass) (cinfo, FALSE); + (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); + /* We emit frame/scan headers now */ + if (master->scan_number == 0) + (*cinfo->marker->write_frame_header) (cinfo); + (*cinfo->marker->write_scan_header) (cinfo); + master->pub.call_pass_startup = FALSE; + break; + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + } + + master->pub.is_last_pass = (master->pass_number == master->total_passes-1); + + /* Set up progress monitor's pass info if present */ + if (cinfo->progress != NULL) { + cinfo->progress->completed_passes = master->pass_number; + cinfo->progress->total_passes = master->total_passes; + } +} + + +/* + * Special start-of-pass hook. + * This is called by jpeg_write_scanlines if call_pass_startup is TRUE. + * In single-pass processing, we need this hook because we don't want to + * write frame/scan headers during jpeg_start_compress; we want to let the + * application write COM markers etc. between jpeg_start_compress and the + * jpeg_write_scanlines loop. + * In multi-pass processing, this routine is not used. + */ + +METHODDEF(void) +pass_startup (j_compress_ptr cinfo) +{ + cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */ + + (*cinfo->marker->write_frame_header) (cinfo); + (*cinfo->marker->write_scan_header) (cinfo); +} + + +/* + * Finish up at end of pass. + */ + +METHODDEF(void) +finish_pass_master (j_compress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + /* The entropy coder always needs an end-of-pass call, + * either to analyze statistics or to flush its output buffer. + */ + (*cinfo->entropy->finish_pass) (cinfo); + + /* Update state for next pass */ + switch (master->pass_type) { + case main_pass: + /* next pass is either output of scan 0 (after optimization) + * or output of scan 1 (if no optimization). + */ + master->pass_type = output_pass; + if (! cinfo->optimize_coding) + master->scan_number++; + break; + case huff_opt_pass: + /* next pass is always output of current scan */ + master->pass_type = output_pass; + break; + case output_pass: + /* next pass is either optimization or output of next scan */ + if (cinfo->optimize_coding) + master->pass_type = huff_opt_pass; + master->scan_number++; + break; + } + + master->pass_number++; +} + + +/* + * Initialize master compression control. + */ + +GLOBAL(void) +jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) +{ + my_master_ptr master; + + master = (my_master_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_comp_master)); + cinfo->master = (struct jpeg_comp_master *) master; + master->pub.prepare_for_pass = prepare_for_pass; + master->pub.pass_startup = pass_startup; + master->pub.finish_pass = finish_pass_master; + master->pub.is_last_pass = FALSE; + + /* Validate parameters, determine derived values */ + initial_setup(cinfo, transcode_only); + + if (cinfo->scan_info != NULL) { +#ifdef C_MULTISCAN_FILES_SUPPORTED + validate_script(cinfo); + if (cinfo->block_size < DCTSIZE) + reduce_script(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + cinfo->progressive_mode = FALSE; + cinfo->num_scans = 1; + } + + if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) && + !cinfo->arith_code) /* TEMPORARY HACK ??? */ + /* assume default tables no good for progressive or downscale mode */ + cinfo->optimize_coding = TRUE; + + /* Initialize my private state */ + if (transcode_only) { + /* no main pass in transcoding */ + if (cinfo->optimize_coding) + master->pass_type = huff_opt_pass; + else + master->pass_type = output_pass; + } else { + /* for normal compression, first pass is always this type: */ + master->pass_type = main_pass; + } + master->scan_number = 0; + master->pass_number = 0; + if (cinfo->optimize_coding) + master->total_passes = cinfo->num_scans * 2; + else + master->total_passes = cinfo->num_scans; +} diff --git a/src/3rdparty/libjpeg/jcomapi.c b/src/3rdparty/libjpeg/jcomapi.c new file mode 100644 index 0000000000..9b1fa7568a --- /dev/null +++ b/src/3rdparty/libjpeg/jcomapi.c @@ -0,0 +1,106 @@ +/* + * jcomapi.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface routines that are used for both + * compression and decompression. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Abort processing of a JPEG compression or decompression operation, + * but don't destroy the object itself. + * + * For this, we merely clean up all the nonpermanent memory pools. + * Note that temp files (virtual arrays) are not allowed to belong to + * the permanent pool, so we will be able to close all temp files here. + * Closing a data source or destination, if necessary, is the application's + * responsibility. + */ + +GLOBAL(void) +jpeg_abort (j_common_ptr cinfo) +{ + int pool; + + /* Do nothing if called on a not-initialized or destroyed JPEG object. */ + if (cinfo->mem == NULL) + return; + + /* Releasing pools in reverse order might help avoid fragmentation + * with some (brain-damaged) malloc libraries. + */ + for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) { + (*cinfo->mem->free_pool) (cinfo, pool); + } + + /* Reset overall state for possible reuse of object */ + if (cinfo->is_decompressor) { + cinfo->global_state = DSTATE_START; + /* Try to keep application from accessing now-deleted marker list. + * A bit kludgy to do it here, but this is the most central place. + */ + ((j_decompress_ptr) cinfo)->marker_list = NULL; + } else { + cinfo->global_state = CSTATE_START; + } +} + + +/* + * Destruction of a JPEG object. + * + * Everything gets deallocated except the master jpeg_compress_struct itself + * and the error manager struct. Both of these are supplied by the application + * and must be freed, if necessary, by the application. (Often they are on + * the stack and so don't need to be freed anyway.) + * Closing a data source or destination, if necessary, is the application's + * responsibility. + */ + +GLOBAL(void) +jpeg_destroy (j_common_ptr cinfo) +{ + /* We need only tell the memory manager to release everything. */ + /* NB: mem pointer is NULL if memory mgr failed to initialize. */ + if (cinfo->mem != NULL) + (*cinfo->mem->self_destruct) (cinfo); + cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */ + cinfo->global_state = 0; /* mark it destroyed */ +} + + +/* + * Convenience routines for allocating quantization and Huffman tables. + * (Would jutils.c be a more reasonable place to put these?) + */ + +GLOBAL(JQUANT_TBL *) +jpeg_alloc_quant_table (j_common_ptr cinfo) +{ + JQUANT_TBL *tbl; + + tbl = (JQUANT_TBL *) + (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL)); + tbl->sent_table = FALSE; /* make sure this is false in any new table */ + return tbl; +} + + +GLOBAL(JHUFF_TBL *) +jpeg_alloc_huff_table (j_common_ptr cinfo) +{ + JHUFF_TBL *tbl; + + tbl = (JHUFF_TBL *) + (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL)); + tbl->sent_table = FALSE; /* make sure this is false in any new table */ + return tbl; +} diff --git a/src/3rdparty/libjpeg/jconfig.bcc b/src/3rdparty/libjpeg/jconfig.bcc new file mode 100644 index 0000000000..e4da3d72c2 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.bcc @@ -0,0 +1,48 @@ +/* jconfig.bcc --- jconfig.h for Borland C (Turbo C) on MS-DOS or OS/2. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#ifdef __MSDOS__ +#define NEED_FAR_POINTERS /* for small or medium memory model */ +#endif +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN /* this assumes you have -w-stu in CFLAGS */ + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#ifdef __MSDOS__ +#define USE_MSDOS_MEMMGR /* Define this if you use jmemdos.c */ +#define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */ +#define USE_FMEM /* Borland has _fmemcpy() and _fmemset() */ +#endif + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define USE_SETMODE /* Borland has setmode() */ +#ifdef __MSDOS__ +#define NEED_SIGNAL_CATCHER /* Define this if you use jmemdos.c */ +#endif +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.cfg b/src/3rdparty/libjpeg/jconfig.cfg new file mode 100644 index 0000000000..bb7435c9ff --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.cfg @@ -0,0 +1,53 @@ +/* jconfig.cfg --- source file edited by configure script */ +/* see jconfig.txt for explanations */ + +#undef HAVE_PROTOTYPES +#undef HAVE_UNSIGNED_CHAR +#undef HAVE_UNSIGNED_SHORT +#undef void +#undef const +#undef CHAR_IS_UNSIGNED +#undef HAVE_STDDEF_H +#undef HAVE_STDLIB_H +#undef HAVE_LOCALE_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +/* Define this if you get warnings about undefined structures. */ +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, on Windows systems. */ +#ifdef _WIN32 +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED +#undef INLINE +/* These are for configuring the JPEG memory manager. */ +#undef DEFAULT_MAX_MEM +#undef NO_MKTEMP + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +#undef PROGRESS_REPORT + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.dj b/src/3rdparty/libjpeg/jconfig.dj new file mode 100644 index 0000000000..a0d4092f20 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.dj @@ -0,0 +1,38 @@ +/* jconfig.dj --- jconfig.h for DJGPP (Delorie's GNU C port) on MS-DOS. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* DJGPP uses flat 32-bit addressing */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Needed to make one-file style work in DJGPP */ +#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.h b/src/3rdparty/libjpeg/jconfig.h new file mode 100644 index 0000000000..b96d312492 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.h @@ -0,0 +1,164 @@ +/* + * jconfig.txt + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file documents the configuration options that are required to + * customize the JPEG software for a particular system. + * + * The actual configuration options for a particular installation are stored + * in jconfig.h. On many machines, jconfig.h can be generated automatically + * or copied from one of the "canned" jconfig files that we supply. But if + * you need to generate a jconfig.h file by hand, this file tells you how. + * + * DO NOT EDIT THIS FILE --- IT WON'T ACCOMPLISH ANYTHING. + * EDIT A COPY NAMED JCONFIG.H. + */ + + +/* + * These symbols indicate the properties of your machine or compiler. + * #define the symbol if yes, #undef it if no. + */ + +/* Does your compiler support function prototypes? + * (If not, you also need to use ansi2knr, see install.txt) + */ +#define HAVE_PROTOTYPES + +/* Does your compiler support the declaration "unsigned char" ? + * How about "unsigned short" ? + */ +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT + +/* Define "void" as "char" if your compiler doesn't know about type void. + * NOTE: be sure to define void such that "void *" represents the most general + * pointer type, e.g., that returned by malloc(). + */ +/* #define void char */ + +/* Define "const" as empty if your compiler doesn't know the "const" keyword. + */ +/* #define const */ + +/* Define this if an ordinary "char" type is unsigned. + * If you're not sure, leaving it undefined will work at some cost in speed. + * If you defined HAVE_UNSIGNED_CHAR then the speed difference is minimal. + */ +#undef CHAR_IS_UNSIGNED + +/* Define this if your system has an ANSI-conforming file. + */ +#define HAVE_STDDEF_H + +/* Define this if your system has an ANSI-conforming file. + */ +#define HAVE_STDLIB_H + +/* Define this if your system does not have an ANSI/SysV , + * but does have a BSD-style . + */ +#undef NEED_BSD_STRINGS + +/* Define this if your system does not provide typedef size_t in any of the + * ANSI-standard places (stddef.h, stdlib.h, or stdio.h), but places it in + * instead. + */ +#undef NEED_SYS_TYPES_H + +/* For 80x86 machines, you need to define NEED_FAR_POINTERS, + * unless you are using a large-data memory model or 80386 flat-memory mode. + * On less brain-damaged CPUs this symbol must not be defined. + * (Defining this symbol causes large data structures to be referenced through + * "far" pointers and to be allocated with a special version of malloc.) + */ +#undef NEED_FAR_POINTERS + +/* Define this if your linker needs global names to be unique in less + * than the first 15 characters. + */ +#undef NEED_SHORT_EXTERNAL_NAMES + +/* Although a real ANSI C compiler can deal perfectly well with pointers to + * unspecified structures (see "incomplete types" in the spec), a few pre-ANSI + * and pseudo-ANSI compilers get confused. To keep one of these bozos happy, + * define INCOMPLETE_TYPES_BROKEN. This is not recommended unless you + * actually get "missing structure definition" warnings or errors while + * compiling the JPEG code. + */ +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, on Windows systems. + */ +#ifdef _WIN32 +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + + +/* + * The following options affect code selection within the JPEG library, + * but they don't need to be visible to applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS has been defined. + */ + +#ifdef JPEG_INTERNALS + +/* Define this if your compiler implements ">>" on signed values as a logical + * (unsigned) shift; leave it undefined if ">>" is a signed (arithmetic) shift, + * which is the normal and rational definition. + */ +#undef RIGHT_SHIFT_IS_UNSIGNED + + +#endif /* JPEG_INTERNALS */ + + +/* + * The remaining options do not affect the JPEG library proper, + * but only the sample applications cjpeg/djpeg (see cjpeg.c, djpeg.c). + * Other applications can ignore these. + */ + +#ifdef JPEG_CJPEG_DJPEG + +/* These defines indicate which image (non-JPEG) file formats are allowed. */ + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +/* Define this if you want to name both input and output files on the command + * line, rather than using stdout and optionally stdin. You MUST do this if + * your system can't cope with binary I/O to stdin/stdout. See comments at + * head of cjpeg.c or djpeg.c. + */ +#undef TWO_FILE_COMMANDLINE + +/* Define this if your system needs explicit cleanup of temporary files. + * This is crucial under MS-DOS, where the temporary "files" may be areas + * of extended memory; on most other systems it's not as important. + */ +#undef NEED_SIGNAL_CATCHER + +/* By default, we open image files with fopen(...,"rb") or fopen(...,"wb"). + * This is necessary on systems that distinguish text files from binary files, + * and is harmless on most systems that don't. If you have one of the rare + * systems that complains about the "b" spec, define this symbol. + */ +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. + */ +#undef PROGRESS_REPORT + + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.mac b/src/3rdparty/libjpeg/jconfig.mac new file mode 100644 index 0000000000..70ed66c187 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.mac @@ -0,0 +1,43 @@ +/* jconfig.mac --- jconfig.h for CodeWarrior on Apple Macintosh */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define USE_MAC_MEMMGR /* Define this if you use jmemmac.c */ + +#define ALIGN_TYPE long /* Needed for 680x0 Macs */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define USE_CCOMMAND /* Command line reader for Macintosh */ +#define TWO_FILE_COMMANDLINE /* Binary I/O thru stdin/stdout doesn't work */ + +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.manx b/src/3rdparty/libjpeg/jconfig.manx new file mode 100644 index 0000000000..cd529d7d15 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.manx @@ -0,0 +1,43 @@ +/* jconfig.manx --- jconfig.h for Amiga systems using Manx Aztec C ver 5.x. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define TEMP_DIRECTORY "JPEGTMP:" /* recommended setting for Amiga */ + +#define SHORTxSHORT_32 /* produces better DCT code with Aztec C */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#define signal_catcher _abort /* hack for Aztec C naming requirements */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.mc6 b/src/3rdparty/libjpeg/jconfig.mc6 new file mode 100644 index 0000000000..ad5651b8ce --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.mc6 @@ -0,0 +1,52 @@ +/* jconfig.mc6 --- jconfig.h for Microsoft C on MS-DOS, version 6.00A & up. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#define NEED_FAR_POINTERS /* for small or medium memory model */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define USE_MSDOS_MEMMGR /* Define this if you use jmemdos.c */ + +#define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */ + +#define USE_FMEM /* Microsoft has _fmemcpy() and _fmemset() */ + +#define NEED_FHEAPMIN /* far heap management routines are broken */ + +#define SHORTxLCONST_32 /* enable compiler-specific DCT optimization */ +/* Note: the above define is known to improve the code with Microsoft C 6.00A. + * I do not know whether it is good for later compiler versions. + * Please report any info on this point to jpeg-info@uc.ag. + */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define USE_SETMODE /* Microsoft has setmode() */ +#define NEED_SIGNAL_CATCHER /* Define this if you use jmemdos.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.sas b/src/3rdparty/libjpeg/jconfig.sas new file mode 100644 index 0000000000..b8a1819259 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.sas @@ -0,0 +1,43 @@ +/* jconfig.sas --- jconfig.h for Amiga systems using SAS C 6.0 and up. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define TEMP_DIRECTORY "JPEGTMP:" /* recommended setting for Amiga */ + +#define NO_MKTEMP /* SAS C doesn't have mktemp() */ + +#define SHORTxSHORT_32 /* produces better DCT code with SAS C */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE +#define NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.st b/src/3rdparty/libjpeg/jconfig.st new file mode 100644 index 0000000000..5afa0b6ce5 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.st @@ -0,0 +1,42 @@ +/* jconfig.st --- jconfig.h for Atari ST/STE/TT using Pure C or Turbo C. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#define INCOMPLETE_TYPES_BROKEN /* suppress undefined-structure warnings */ + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#define ALIGN_TYPE long /* apparently double is a weird size? */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE /* optional -- undef if you like Unix style */ +/* Note: if you undef TWO_FILE_COMMANDLINE, you may need to define + * USE_SETMODE. Some Atari compilers require it, some do not. + */ +#define NEED_SIGNAL_CATCHER /* needed if you use jmemname.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.txt b/src/3rdparty/libjpeg/jconfig.txt new file mode 100644 index 0000000000..b96d312492 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.txt @@ -0,0 +1,164 @@ +/* + * jconfig.txt + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file documents the configuration options that are required to + * customize the JPEG software for a particular system. + * + * The actual configuration options for a particular installation are stored + * in jconfig.h. On many machines, jconfig.h can be generated automatically + * or copied from one of the "canned" jconfig files that we supply. But if + * you need to generate a jconfig.h file by hand, this file tells you how. + * + * DO NOT EDIT THIS FILE --- IT WON'T ACCOMPLISH ANYTHING. + * EDIT A COPY NAMED JCONFIG.H. + */ + + +/* + * These symbols indicate the properties of your machine or compiler. + * #define the symbol if yes, #undef it if no. + */ + +/* Does your compiler support function prototypes? + * (If not, you also need to use ansi2knr, see install.txt) + */ +#define HAVE_PROTOTYPES + +/* Does your compiler support the declaration "unsigned char" ? + * How about "unsigned short" ? + */ +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT + +/* Define "void" as "char" if your compiler doesn't know about type void. + * NOTE: be sure to define void such that "void *" represents the most general + * pointer type, e.g., that returned by malloc(). + */ +/* #define void char */ + +/* Define "const" as empty if your compiler doesn't know the "const" keyword. + */ +/* #define const */ + +/* Define this if an ordinary "char" type is unsigned. + * If you're not sure, leaving it undefined will work at some cost in speed. + * If you defined HAVE_UNSIGNED_CHAR then the speed difference is minimal. + */ +#undef CHAR_IS_UNSIGNED + +/* Define this if your system has an ANSI-conforming file. + */ +#define HAVE_STDDEF_H + +/* Define this if your system has an ANSI-conforming file. + */ +#define HAVE_STDLIB_H + +/* Define this if your system does not have an ANSI/SysV , + * but does have a BSD-style . + */ +#undef NEED_BSD_STRINGS + +/* Define this if your system does not provide typedef size_t in any of the + * ANSI-standard places (stddef.h, stdlib.h, or stdio.h), but places it in + * instead. + */ +#undef NEED_SYS_TYPES_H + +/* For 80x86 machines, you need to define NEED_FAR_POINTERS, + * unless you are using a large-data memory model or 80386 flat-memory mode. + * On less brain-damaged CPUs this symbol must not be defined. + * (Defining this symbol causes large data structures to be referenced through + * "far" pointers and to be allocated with a special version of malloc.) + */ +#undef NEED_FAR_POINTERS + +/* Define this if your linker needs global names to be unique in less + * than the first 15 characters. + */ +#undef NEED_SHORT_EXTERNAL_NAMES + +/* Although a real ANSI C compiler can deal perfectly well with pointers to + * unspecified structures (see "incomplete types" in the spec), a few pre-ANSI + * and pseudo-ANSI compilers get confused. To keep one of these bozos happy, + * define INCOMPLETE_TYPES_BROKEN. This is not recommended unless you + * actually get "missing structure definition" warnings or errors while + * compiling the JPEG code. + */ +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, on Windows systems. + */ +#ifdef _WIN32 +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + + +/* + * The following options affect code selection within the JPEG library, + * but they don't need to be visible to applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS has been defined. + */ + +#ifdef JPEG_INTERNALS + +/* Define this if your compiler implements ">>" on signed values as a logical + * (unsigned) shift; leave it undefined if ">>" is a signed (arithmetic) shift, + * which is the normal and rational definition. + */ +#undef RIGHT_SHIFT_IS_UNSIGNED + + +#endif /* JPEG_INTERNALS */ + + +/* + * The remaining options do not affect the JPEG library proper, + * but only the sample applications cjpeg/djpeg (see cjpeg.c, djpeg.c). + * Other applications can ignore these. + */ + +#ifdef JPEG_CJPEG_DJPEG + +/* These defines indicate which image (non-JPEG) file formats are allowed. */ + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +/* Define this if you want to name both input and output files on the command + * line, rather than using stdout and optionally stdin. You MUST do this if + * your system can't cope with binary I/O to stdin/stdout. See comments at + * head of cjpeg.c or djpeg.c. + */ +#undef TWO_FILE_COMMANDLINE + +/* Define this if your system needs explicit cleanup of temporary files. + * This is crucial under MS-DOS, where the temporary "files" may be areas + * of extended memory; on most other systems it's not as important. + */ +#undef NEED_SIGNAL_CATCHER + +/* By default, we open image files with fopen(...,"rb") or fopen(...,"wb"). + * This is necessary on systems that distinguish text files from binary files, + * and is harmless on most systems that don't. If you have one of the rare + * systems that complains about the "b" spec, define this symbol. + */ +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. + */ +#undef PROGRESS_REPORT + + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.vc b/src/3rdparty/libjpeg/jconfig.vc new file mode 100644 index 0000000000..679404da4e --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.vc @@ -0,0 +1,45 @@ +/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, per Windows custom */ +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ + + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Microsoft has setmode() */ +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.vms b/src/3rdparty/libjpeg/jconfig.vms new file mode 100644 index 0000000000..8337b0b69b --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.vms @@ -0,0 +1,37 @@ +/* jconfig.vms --- jconfig.h for use on Digital VMS. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE /* Needed on VMS */ +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jconfig.wat b/src/3rdparty/libjpeg/jconfig.wat new file mode 100644 index 0000000000..190cc75fd5 --- /dev/null +++ b/src/3rdparty/libjpeg/jconfig.wat @@ -0,0 +1,38 @@ +/* jconfig.wat --- jconfig.h for Watcom C/C++ on MS-DOS or OS/2. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#define CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* Watcom uses flat 32-bit addressing */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Needed to make one-file style work in Watcom */ +#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */ +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/3rdparty/libjpeg/jcparam.c b/src/3rdparty/libjpeg/jcparam.c new file mode 100644 index 0000000000..c5e85dda55 --- /dev/null +++ b/src/3rdparty/libjpeg/jcparam.c @@ -0,0 +1,632 @@ +/* + * jcparam.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2008 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains optional default-setting code for the JPEG compressor. + * Applications do not have to use this file, but those that don't use it + * must know a lot more about the innards of the JPEG code. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Quantization table setup routines + */ + +GLOBAL(void) +jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, boolean force_baseline) +/* Define a quantization table equal to the basic_table times + * a scale factor (given as a percentage). + * If force_baseline is TRUE, the computed quantization table entries + * are limited to 1..255 for JPEG baseline compatibility. + */ +{ + JQUANT_TBL ** qtblptr; + int i; + long temp; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS) + ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl); + + qtblptr = & cinfo->quant_tbl_ptrs[which_tbl]; + + if (*qtblptr == NULL) + *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo); + + for (i = 0; i < DCTSIZE2; i++) { + temp = ((long) basic_table[i] * scale_factor + 50L) / 100L; + /* limit the values to the valid range */ + if (temp <= 0L) temp = 1L; + if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */ + if (force_baseline && temp > 255L) + temp = 255L; /* limit to baseline range if requested */ + (*qtblptr)->quantval[i] = (UINT16) temp; + } + + /* Initialize sent_table FALSE so table will be written to JPEG file. */ + (*qtblptr)->sent_table = FALSE; +} + + +/* These are the sample quantization tables given in JPEG spec section K.1. + * The spec says that the values given produce "good" quality, and + * when divided by 2, "very good" quality. + */ +static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99 +}; +static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + + +GLOBAL(void) +jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables + * and straight percentage-scaling quality scales. + * This entry point allows different scalings for luminance and chrominance. + */ +{ + /* Set up two quantization tables using the specified scaling */ + jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + cinfo->q_scale_factor[0], force_baseline); + jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + cinfo->q_scale_factor[1], force_baseline); +} + + +GLOBAL(void) +jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, + boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables + * and a straight percentage-scaling quality scale. In most cases it's better + * to use jpeg_set_quality (below); this entry point is provided for + * applications that insist on a linear percentage scaling. + */ +{ + /* Set up two quantization tables using the specified scaling */ + jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + scale_factor, force_baseline); + jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + scale_factor, force_baseline); +} + + +GLOBAL(int) +jpeg_quality_scaling (int quality) +/* Convert a user-specified quality rating to a percentage scaling factor + * for an underlying quantization table, using our recommended scaling curve. + * The input 'quality' factor should be 0 (terrible) to 100 (very good). + */ +{ + /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ + if (quality <= 0) quality = 1; + if (quality > 100) quality = 100; + + /* The basic table is used as-is (scaling 100) for a quality of 50. + * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; + * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table + * to make all the table entries 1 (hence, minimum quantization loss). + * Qualities 1..50 are converted to scaling percentage 5000/Q. + */ + if (quality < 50) + quality = 5000 / quality; + else + quality = 200 - quality*2; + + return quality; +} + + +GLOBAL(void) +jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables. + * This is the standard quality-adjusting entry point for typical user + * interfaces; only those who want detailed control over quantization tables + * would use the preceding three routines directly. + */ +{ + /* Convert user 0-100 rating to percentage scaling */ + quality = jpeg_quality_scaling(quality); + + /* Set up standard quality tables */ + jpeg_set_linear_quality(cinfo, quality, force_baseline); +} + + +/* + * Huffman table setup routines + */ + +LOCAL(void) +add_huff_table (j_compress_ptr cinfo, + JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) +/* Define a Huffman table */ +{ + int nsymbols, len; + + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + + /* Copy the number-of-symbols-of-each-code-length counts */ + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + + /* Validate the counts. We do this here mainly so we can copy the right + * number of symbols from the val[] array, without risking marching off + * the end of memory. jchuff.c will do a more thorough test later. + */ + nsymbols = 0; + for (len = 1; len <= 16; len++) + nsymbols += bits[len]; + if (nsymbols < 1 || nsymbols > 256) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + + MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8)); + + /* Initialize sent_table FALSE so table will be written to JPEG file. */ + (*htblptr)->sent_table = FALSE; +} + + +LOCAL(void) +std_huff_tables (j_compress_ptr cinfo) +/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ +/* IMPORTANT: these are only valid for 8-bit data precision! */ +{ + static const UINT8 bits_dc_luminance[17] = + { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + static const UINT8 val_dc_luminance[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 bits_dc_chrominance[17] = + { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; + static const UINT8 val_dc_chrominance[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 bits_ac_luminance[17] = + { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; + static const UINT8 val_ac_luminance[] = + { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa }; + + static const UINT8 bits_ac_chrominance[17] = + { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; + static const UINT8 val_ac_chrominance[] = + { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa }; + + add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], + bits_dc_luminance, val_dc_luminance); + add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], + bits_ac_luminance, val_ac_luminance); + add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], + bits_dc_chrominance, val_dc_chrominance); + add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], + bits_ac_chrominance, val_ac_chrominance); +} + + +/* + * Default parameter setup for compression. + * + * Applications that don't choose to use this routine must do their + * own setup of all these parameters. Alternately, you can call this + * to establish defaults and then alter parameters selectively. This + * is the recommended approach since, if we add any new parameters, + * your code will still work (they'll be set to reasonable defaults). + */ + +GLOBAL(void) +jpeg_set_defaults (j_compress_ptr cinfo) +{ + int i; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* Allocate comp_info array large enough for maximum component count. + * Array is made permanent in case application wants to compress + * multiple images at same param settings. + */ + if (cinfo->comp_info == NULL) + cinfo->comp_info = (jpeg_component_info *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + MAX_COMPONENTS * SIZEOF(jpeg_component_info)); + + /* Initialize everything not dependent on the color space */ + + cinfo->scale_num = 1; /* 1:1 scaling */ + cinfo->scale_denom = 1; + cinfo->data_precision = BITS_IN_JSAMPLE; + /* Set up two quantization tables using default quality of 75 */ + jpeg_set_quality(cinfo, 75, TRUE); + /* Set up two Huffman tables */ + std_huff_tables(cinfo); + + /* Initialize default arithmetic coding conditioning */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + + /* Default is no multiple-scan output */ + cinfo->scan_info = NULL; + cinfo->num_scans = 0; + + /* Expect normal source image, not raw downsampled data */ + cinfo->raw_data_in = FALSE; + + /* Use Huffman coding, not arithmetic coding, by default */ + cinfo->arith_code = FALSE; + + /* By default, don't do extra passes to optimize entropy coding */ + cinfo->optimize_coding = FALSE; + /* The standard Huffman tables are only valid for 8-bit data precision. + * If the precision is higher, force optimization on so that usable + * tables will be computed. This test can be removed if default tables + * are supplied that are valid for the desired precision. + */ + if (cinfo->data_precision > 8) + cinfo->optimize_coding = TRUE; + + /* By default, use the simpler non-cosited sampling alignment */ + cinfo->CCIR601_sampling = FALSE; + + /* By default, apply fancy downsampling */ + cinfo->do_fancy_downsampling = TRUE; + + /* No input smoothing */ + cinfo->smoothing_factor = 0; + + /* DCT algorithm preference */ + cinfo->dct_method = JDCT_DEFAULT; + + /* No restart markers */ + cinfo->restart_interval = 0; + cinfo->restart_in_rows = 0; + + /* Fill in default JFIF marker parameters. Note that whether the marker + * will actually be written is determined by jpeg_set_colorspace. + * + * By default, the library emits JFIF version code 1.01. + * An application that wants to emit JFIF 1.02 extension markers should set + * JFIF_minor_version to 2. We could probably get away with just defaulting + * to 1.02, but there may still be some decoders in use that will complain + * about that; saying 1.01 should minimize compatibility problems. + */ + cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */ + cinfo->JFIF_minor_version = 1; + cinfo->density_unit = 0; /* Pixel size is unknown by default */ + cinfo->X_density = 1; /* Pixel aspect ratio is square by default */ + cinfo->Y_density = 1; + + /* Choose JPEG colorspace based on input space, set defaults accordingly */ + + jpeg_default_colorspace(cinfo); +} + + +/* + * Select an appropriate JPEG colorspace for in_color_space. + */ + +GLOBAL(void) +jpeg_default_colorspace (j_compress_ptr cinfo) +{ + switch (cinfo->in_color_space) { + case JCS_GRAYSCALE: + jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); + break; + case JCS_RGB: + jpeg_set_colorspace(cinfo, JCS_YCbCr); + break; + case JCS_YCbCr: + jpeg_set_colorspace(cinfo, JCS_YCbCr); + break; + case JCS_CMYK: + jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */ + break; + case JCS_YCCK: + jpeg_set_colorspace(cinfo, JCS_YCCK); + break; + case JCS_UNKNOWN: + jpeg_set_colorspace(cinfo, JCS_UNKNOWN); + break; + default: + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + } +} + + +/* + * Set the JPEG colorspace, and choose colorspace-dependent default values. + */ + +GLOBAL(void) +jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) +{ + jpeg_component_info * compptr; + int ci; + +#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \ + (compptr = &cinfo->comp_info[index], \ + compptr->component_id = (id), \ + compptr->h_samp_factor = (hsamp), \ + compptr->v_samp_factor = (vsamp), \ + compptr->quant_tbl_no = (quant), \ + compptr->dc_tbl_no = (dctbl), \ + compptr->ac_tbl_no = (actbl) ) + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* For all colorspaces, we use Q and Huff tables 0 for luminance components, + * tables 1 for chrominance components. + */ + + cinfo->jpeg_color_space = colorspace; + + cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */ + cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */ + + switch (colorspace) { + case JCS_GRAYSCALE: + cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ + cinfo->num_components = 1; + /* JFIF specifies component ID 1 */ + SET_COMP(0, 1, 1,1, 0, 0,0); + break; + case JCS_RGB: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */ + cinfo->num_components = 3; + SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0); + SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0); + SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0); + break; + case JCS_YCbCr: + cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ + cinfo->num_components = 3; + /* JFIF specifies component IDs 1,2,3 */ + /* We default to 2x2 subsamples of chrominance */ + SET_COMP(0, 1, 2,2, 0, 0,0); + SET_COMP(1, 2, 1,1, 1, 1,1); + SET_COMP(2, 3, 1,1, 1, 1,1); + break; + case JCS_CMYK: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */ + cinfo->num_components = 4; + SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0); + SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0); + SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0); + SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0); + break; + case JCS_YCCK: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */ + cinfo->num_components = 4; + SET_COMP(0, 1, 2,2, 0, 0,0); + SET_COMP(1, 2, 1,1, 1, 1,1); + SET_COMP(2, 3, 1,1, 1, 1,1); + SET_COMP(3, 4, 2,2, 0, 0,0); + break; + case JCS_UNKNOWN: + cinfo->num_components = cinfo->input_components; + if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + for (ci = 0; ci < cinfo->num_components; ci++) { + SET_COMP(ci, ci, 1,1, 0, 0,0); + } + break; + default: + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + } +} + + +#ifdef C_PROGRESSIVE_SUPPORTED + +LOCAL(jpeg_scan_info *) +fill_a_scan (jpeg_scan_info * scanptr, int ci, + int Ss, int Se, int Ah, int Al) +/* Support routine: generate one scan for specified component */ +{ + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = ci; + scanptr->Ss = Ss; + scanptr->Se = Se; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + return scanptr; +} + +LOCAL(jpeg_scan_info *) +fill_scans (jpeg_scan_info * scanptr, int ncomps, + int Ss, int Se, int Ah, int Al) +/* Support routine: generate one scan for each component */ +{ + int ci; + + for (ci = 0; ci < ncomps; ci++) { + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = ci; + scanptr->Ss = Ss; + scanptr->Se = Se; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + } + return scanptr; +} + +LOCAL(jpeg_scan_info *) +fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al) +/* Support routine: generate interleaved DC scan if possible, else N scans */ +{ + int ci; + + if (ncomps <= MAX_COMPS_IN_SCAN) { + /* Single interleaved DC scan */ + scanptr->comps_in_scan = ncomps; + for (ci = 0; ci < ncomps; ci++) + scanptr->component_index[ci] = ci; + scanptr->Ss = scanptr->Se = 0; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + } else { + /* Noninterleaved DC scan for each component */ + scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al); + } + return scanptr; +} + + +/* + * Create a recommended progressive-JPEG script. + * cinfo->num_components and cinfo->jpeg_color_space must be correct. + */ + +GLOBAL(void) +jpeg_simple_progression (j_compress_ptr cinfo) +{ + int ncomps = cinfo->num_components; + int nscans; + jpeg_scan_info * scanptr; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* Figure space needed for script. Calculation must match code below! */ + if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { + /* Custom script for YCbCr color images. */ + nscans = 10; + } else { + /* All-purpose script for other color spaces. */ + if (ncomps > MAX_COMPS_IN_SCAN) + nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */ + else + nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */ + } + + /* Allocate space for script. + * We need to put it in the permanent pool in case the application performs + * multiple compressions without changing the settings. To avoid a memory + * leak if jpeg_simple_progression is called repeatedly for the same JPEG + * object, we try to re-use previously allocated space, and we allocate + * enough space to handle YCbCr even if initially asked for grayscale. + */ + if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) { + cinfo->script_space_size = MAX(nscans, 10); + cinfo->script_space = (jpeg_scan_info *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + cinfo->script_space_size * SIZEOF(jpeg_scan_info)); + } + scanptr = cinfo->script_space; + cinfo->scan_info = scanptr; + cinfo->num_scans = nscans; + + if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { + /* Custom script for YCbCr color images. */ + /* Initial DC scan */ + scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); + /* Initial AC scan: get some luma data out in a hurry */ + scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2); + /* Chroma data is too small to be worth expending many scans on */ + scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1); + scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1); + /* Complete spectral selection for luma AC */ + scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2); + /* Refine next bit of luma AC */ + scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1); + /* Finish DC successive approximation */ + scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); + /* Finish AC successive approximation */ + scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0); + scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0); + /* Luma bottom bit comes last since it's usually largest scan */ + scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0); + } else { + /* All-purpose script for other color spaces. */ + /* Successive approximation first pass */ + scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); + scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2); + scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2); + /* Successive approximation second pass */ + scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1); + /* Successive approximation final pass */ + scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); + scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0); + } +} + +#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jcprepct.c b/src/3rdparty/libjpeg/jcprepct.c new file mode 100644 index 0000000000..be44cc4b45 --- /dev/null +++ b/src/3rdparty/libjpeg/jcprepct.c @@ -0,0 +1,358 @@ +/* + * jcprepct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the compression preprocessing controller. + * This controller manages the color conversion, downsampling, + * and edge expansion steps. + * + * Most of the complexity here is associated with buffering input rows + * as required by the downsampler. See the comments at the head of + * jcsample.c for the downsampler's needs. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* At present, jcsample.c can request context rows only for smoothing. + * In the future, we might also need context rows for CCIR601 sampling + * or other more-complex downsampling procedures. The code to support + * context rows should be compiled only if needed. + */ +#ifdef INPUT_SMOOTHING_SUPPORTED +#define CONTEXT_ROWS_SUPPORTED +#endif + + +/* + * For the simple (no-context-row) case, we just need to buffer one + * row group's worth of pixels for the downsampling step. At the bottom of + * the image, we pad to a full row group by replicating the last pixel row. + * The downsampler's last output row is then replicated if needed to pad + * out to a full iMCU row. + * + * When providing context rows, we must buffer three row groups' worth of + * pixels. Three row groups are physically allocated, but the row pointer + * arrays are made five row groups high, with the extra pointers above and + * below "wrapping around" to point to the last and first real row groups. + * This allows the downsampler to access the proper context rows. + * At the top and bottom of the image, we create dummy context rows by + * copying the first or last real pixel row. This copying could be avoided + * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the + * trouble on the compression side. + */ + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_prep_controller pub; /* public fields */ + + /* Downsampling input buffer. This buffer holds color-converted data + * until we have enough to do a downsample step. + */ + JSAMPARRAY color_buf[MAX_COMPONENTS]; + + JDIMENSION rows_to_go; /* counts rows remaining in source image */ + int next_buf_row; /* index of next row to store in color_buf */ + +#ifdef CONTEXT_ROWS_SUPPORTED /* only needed for context case */ + int this_row_group; /* starting row index of group to process */ + int next_buf_stop; /* downsample when we reach this index */ +#endif +} my_prep_controller; + +typedef my_prep_controller * my_prep_ptr; + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + + if (pass_mode != JBUF_PASS_THRU) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + /* Initialize total-height counter for detecting bottom of image */ + prep->rows_to_go = cinfo->image_height; + /* Mark the conversion buffer empty */ + prep->next_buf_row = 0; +#ifdef CONTEXT_ROWS_SUPPORTED + /* Preset additional state variables for context mode. + * These aren't used in non-context mode, so we needn't test which mode. + */ + prep->this_row_group = 0; + /* Set next_buf_stop to stop after two row groups have been read in. */ + prep->next_buf_stop = 2 * cinfo->max_v_samp_factor; +#endif +} + + +/* + * Expand an image vertically from height input_rows to height output_rows, + * by duplicating the bottom row. + */ + +LOCAL(void) +expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols, + int input_rows, int output_rows) +{ + register int row; + + for (row = input_rows; row < output_rows; row++) { + jcopy_sample_rows(image_data, input_rows-1, image_data, row, + 1, num_cols); + } +} + + +/* + * Process some data in the simple no-context case. + * + * Preprocessor output data is counted in "row groups". A row group + * is defined to be v_samp_factor sample rows of each component. + * Downsampling will produce this much data from each max_v_samp_factor + * input rows. + */ + +METHODDEF(void) +pre_process_data (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int numrows, ci; + JDIMENSION inrows; + jpeg_component_info * compptr; + + while (*in_row_ctr < in_rows_avail && + *out_row_group_ctr < out_row_groups_avail) { + /* Do color conversion to fill the conversion buffer. */ + inrows = in_rows_avail - *in_row_ctr; + numrows = cinfo->max_v_samp_factor - prep->next_buf_row; + numrows = (int) MIN((JDIMENSION) numrows, inrows); + (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, + prep->color_buf, + (JDIMENSION) prep->next_buf_row, + numrows); + *in_row_ctr += numrows; + prep->next_buf_row += numrows; + prep->rows_to_go -= numrows; + /* If at bottom of image, pad to fill the conversion buffer. */ + if (prep->rows_to_go == 0 && + prep->next_buf_row < cinfo->max_v_samp_factor) { + for (ci = 0; ci < cinfo->num_components; ci++) { + expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, + prep->next_buf_row, cinfo->max_v_samp_factor); + } + prep->next_buf_row = cinfo->max_v_samp_factor; + } + /* If we've filled the conversion buffer, empty it. */ + if (prep->next_buf_row == cinfo->max_v_samp_factor) { + (*cinfo->downsample->downsample) (cinfo, + prep->color_buf, (JDIMENSION) 0, + output_buf, *out_row_group_ctr); + prep->next_buf_row = 0; + (*out_row_group_ctr)++; + } + /* If at bottom of image, pad the output to a full iMCU height. + * Note we assume the caller is providing a one-iMCU-height output buffer! + */ + if (prep->rows_to_go == 0 && + *out_row_group_ctr < out_row_groups_avail) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + numrows = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + expand_bottom_edge(output_buf[ci], + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (int) (*out_row_group_ctr * numrows), + (int) (out_row_groups_avail * numrows)); + } + *out_row_group_ctr = out_row_groups_avail; + break; /* can exit outer loop without test */ + } + } +} + + +#ifdef CONTEXT_ROWS_SUPPORTED + +/* + * Process some data in the context case. + */ + +METHODDEF(void) +pre_process_context (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int numrows, ci; + int buf_height = cinfo->max_v_samp_factor * 3; + JDIMENSION inrows; + + while (*out_row_group_ctr < out_row_groups_avail) { + if (*in_row_ctr < in_rows_avail) { + /* Do color conversion to fill the conversion buffer. */ + inrows = in_rows_avail - *in_row_ctr; + numrows = prep->next_buf_stop - prep->next_buf_row; + numrows = (int) MIN((JDIMENSION) numrows, inrows); + (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, + prep->color_buf, + (JDIMENSION) prep->next_buf_row, + numrows); + /* Pad at top of image, if first time through */ + if (prep->rows_to_go == cinfo->image_height) { + for (ci = 0; ci < cinfo->num_components; ci++) { + int row; + for (row = 1; row <= cinfo->max_v_samp_factor; row++) { + jcopy_sample_rows(prep->color_buf[ci], 0, + prep->color_buf[ci], -row, + 1, cinfo->image_width); + } + } + } + *in_row_ctr += numrows; + prep->next_buf_row += numrows; + prep->rows_to_go -= numrows; + } else { + /* Return for more data, unless we are at the bottom of the image. */ + if (prep->rows_to_go != 0) + break; + /* When at bottom of image, pad to fill the conversion buffer. */ + if (prep->next_buf_row < prep->next_buf_stop) { + for (ci = 0; ci < cinfo->num_components; ci++) { + expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, + prep->next_buf_row, prep->next_buf_stop); + } + prep->next_buf_row = prep->next_buf_stop; + } + } + /* If we've gotten enough data, downsample a row group. */ + if (prep->next_buf_row == prep->next_buf_stop) { + (*cinfo->downsample->downsample) (cinfo, + prep->color_buf, + (JDIMENSION) prep->this_row_group, + output_buf, *out_row_group_ctr); + (*out_row_group_ctr)++; + /* Advance pointers with wraparound as necessary. */ + prep->this_row_group += cinfo->max_v_samp_factor; + if (prep->this_row_group >= buf_height) + prep->this_row_group = 0; + if (prep->next_buf_row >= buf_height) + prep->next_buf_row = 0; + prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor; + } + } +} + + +/* + * Create the wrapped-around downsampling input buffer needed for context mode. + */ + +LOCAL(void) +create_context_buffer (j_compress_ptr cinfo) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int rgroup_height = cinfo->max_v_samp_factor; + int ci, i; + jpeg_component_info * compptr; + JSAMPARRAY true_buffer, fake_buffer; + + /* Grab enough space for fake row pointers for all the components; + * we need five row groups' worth of pointers for each component. + */ + fake_buffer = (JSAMPARRAY) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (cinfo->num_components * 5 * rgroup_height) * + SIZEOF(JSAMPROW)); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Allocate the actual buffer space (3 row groups) for this component. + * We make the buffer wide enough to allow the downsampler to edge-expand + * horizontally within the buffer, if it so chooses. + */ + true_buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (((long) compptr->width_in_blocks * + cinfo->min_DCT_h_scaled_size * + cinfo->max_h_samp_factor) / compptr->h_samp_factor), + (JDIMENSION) (3 * rgroup_height)); + /* Copy true buffer row pointers into the middle of the fake row array */ + MEMCOPY(fake_buffer + rgroup_height, true_buffer, + 3 * rgroup_height * SIZEOF(JSAMPROW)); + /* Fill in the above and below wraparound pointers */ + for (i = 0; i < rgroup_height; i++) { + fake_buffer[i] = true_buffer[2 * rgroup_height + i]; + fake_buffer[4 * rgroup_height + i] = true_buffer[i]; + } + prep->color_buf[ci] = fake_buffer + rgroup_height; + fake_buffer += 5 * rgroup_height; /* point to space for next component */ + } +} + +#endif /* CONTEXT_ROWS_SUPPORTED */ + + +/* + * Initialize preprocessing controller. + */ + +GLOBAL(void) +jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_prep_ptr prep; + int ci; + jpeg_component_info * compptr; + + if (need_full_buffer) /* safety check */ + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + prep = (my_prep_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_prep_controller)); + cinfo->prep = (struct jpeg_c_prep_controller *) prep; + prep->pub.start_pass = start_pass_prep; + + /* Allocate the color conversion buffer. + * We make the buffer wide enough to allow the downsampler to edge-expand + * horizontally within the buffer, if it so chooses. + */ + if (cinfo->downsample->need_context_rows) { + /* Set up to provide context rows */ +#ifdef CONTEXT_ROWS_SUPPORTED + prep->pub.pre_process_data = pre_process_context; + create_context_buffer(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + /* No context, just make it tall enough for one row group */ + prep->pub.pre_process_data = pre_process_data; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + prep->color_buf[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (((long) compptr->width_in_blocks * + cinfo->min_DCT_h_scaled_size * + cinfo->max_h_samp_factor) / compptr->h_samp_factor), + (JDIMENSION) cinfo->max_v_samp_factor); + } + } +} diff --git a/src/3rdparty/libjpeg/jcsample.c b/src/3rdparty/libjpeg/jcsample.c new file mode 100644 index 0000000000..4d36f85f35 --- /dev/null +++ b/src/3rdparty/libjpeg/jcsample.c @@ -0,0 +1,545 @@ +/* + * jcsample.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains downsampling routines. + * + * Downsampling input data is counted in "row groups". A row group + * is defined to be max_v_samp_factor pixel rows of each component, + * from which the downsampler produces v_samp_factor sample rows. + * A single row group is processed in each call to the downsampler module. + * + * The downsampler is responsible for edge-expansion of its output data + * to fill an integral number of DCT blocks horizontally. The source buffer + * may be modified if it is helpful for this purpose (the source buffer is + * allocated wide enough to correspond to the desired output width). + * The caller (the prep controller) is responsible for vertical padding. + * + * The downsampler may request "context rows" by setting need_context_rows + * during startup. In this case, the input arrays will contain at least + * one row group's worth of pixels above and below the passed-in data; + * the caller will create dummy rows at image top and bottom by replicating + * the first or last real pixel row. + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + * + * The downsampling algorithm used here is a simple average of the source + * pixels covered by the output pixel. The hi-falutin sampling literature + * refers to this as a "box filter". In general the characteristics of a box + * filter are not very good, but for the specific cases we normally use (1:1 + * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not + * nearly so bad. If you intend to use other sampling ratios, you'd be well + * advised to improve this code. + * + * A simple input-smoothing capability is provided. This is mainly intended + * for cleaning up color-dithered GIF input files (if you find it inadequate, + * we suggest using an external filtering program such as pnmconvol). When + * enabled, each input pixel P is replaced by a weighted sum of itself and its + * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF, + * where SF = (smoothing_factor / 1024). + * Currently, smoothing is only supported for 2h2v sampling factors. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Pointer to routine to downsample a single component */ +typedef JMETHOD(void, downsample1_ptr, + (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data)); + +/* Private subobject */ + +typedef struct { + struct jpeg_downsampler pub; /* public fields */ + + /* Downsampling method pointers, one per component */ + downsample1_ptr methods[MAX_COMPONENTS]; + + /* Height of an output row group for each component. */ + int rowgroup_height[MAX_COMPONENTS]; + + /* These arrays save pixel expansion factors so that int_downsample need not + * recompute them each time. They are unused for other downsampling methods. + */ + UINT8 h_expand[MAX_COMPONENTS]; + UINT8 v_expand[MAX_COMPONENTS]; +} my_downsampler; + +typedef my_downsampler * my_downsample_ptr; + + +/* + * Initialize for a downsampling pass. + */ + +METHODDEF(void) +start_pass_downsample (j_compress_ptr cinfo) +{ + /* no work for now */ +} + + +/* + * Expand a component horizontally from width input_cols to width output_cols, + * by duplicating the rightmost samples. + */ + +LOCAL(void) +expand_right_edge (JSAMPARRAY image_data, int num_rows, + JDIMENSION input_cols, JDIMENSION output_cols) +{ + register JSAMPROW ptr; + register JSAMPLE pixval; + register int count; + int row; + int numcols = (int) (output_cols - input_cols); + + if (numcols > 0) { + for (row = 0; row < num_rows; row++) { + ptr = image_data[row] + input_cols; + pixval = ptr[-1]; /* don't need GETJSAMPLE() here */ + for (count = numcols; count > 0; count--) + *ptr++ = pixval; + } + } +} + + +/* + * Do downsampling for a whole row group (all components). + * + * In this version we simply downsample each component independently. + */ + +METHODDEF(void) +sep_downsample (j_compress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_index, + JSAMPIMAGE output_buf, JDIMENSION out_row_group_index) +{ + my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; + int ci; + jpeg_component_info * compptr; + JSAMPARRAY in_ptr, out_ptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + in_ptr = input_buf[ci] + in_row_index; + out_ptr = output_buf[ci] + + (out_row_group_index * downsample->rowgroup_height[ci]); + (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr); + } +} + + +/* + * Downsample pixel values of a single component. + * One row group is processed per call. + * This version handles arbitrary integral sampling ratios, without smoothing. + * Note that this version is not actually used for customary sampling ratios. + */ + +METHODDEF(void) +int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; + int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v; + JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */ + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + JSAMPROW inptr, outptr; + INT32 outvalue; + + h_expand = downsample->h_expand[compptr->component_index]; + v_expand = downsample->v_expand[compptr->component_index]; + numpix = h_expand * v_expand; + numpix2 = numpix/2; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * h_expand); + + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + outptr = output_data[outrow]; + for (outcol = 0, outcol_h = 0; outcol < output_cols; + outcol++, outcol_h += h_expand) { + outvalue = 0; + for (v = 0; v < v_expand; v++) { + inptr = input_data[inrow+v] + outcol_h; + for (h = 0; h < h_expand; h++) { + outvalue += (INT32) GETJSAMPLE(*inptr++); + } + } + *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix); + } + inrow += v_expand; + outrow++; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the special case of a full-size component, + * without smoothing. + */ + +METHODDEF(void) +fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + /* Copy the data */ + jcopy_sample_rows(input_data, 0, output_data, 0, + cinfo->max_v_samp_factor, cinfo->image_width); + /* Edge-expand */ + expand_right_edge(output_data, cinfo->max_v_samp_factor, cinfo->image_width, + compptr->width_in_blocks * compptr->DCT_h_scaled_size); +} + + +/* + * Downsample pixel values of a single component. + * This version handles the common case of 2:1 horizontal and 1:1 vertical, + * without smoothing. + * + * A note about the "bias" calculations: when rounding fractional values to + * integer, we do not want to always round 0.5 up to the next integer. + * If we did that, we'd introduce a noticeable bias towards larger values. + * Instead, this code is arranged so that 0.5 will be rounded up or down at + * alternate pixel locations (a simple ordered dither pattern). + */ + +METHODDEF(void) +h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow; + JDIMENSION outcol; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + register JSAMPROW inptr, outptr; + register int bias; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * 2); + + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + outptr = output_data[inrow]; + inptr = input_data[inrow]; + bias = 0; /* bias = 0,1,0,1,... for successive samples */ + for (outcol = 0; outcol < output_cols; outcol++) { + *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) + + bias) >> 1); + bias ^= 1; /* 0=>1, 1=>0 */ + inptr += 2; + } + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the standard case of 2:1 horizontal and 2:1 vertical, + * without smoothing. + */ + +METHODDEF(void) +h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow, outrow; + JDIMENSION outcol; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + register JSAMPROW inptr0, inptr1, outptr; + register int bias; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * 2); + + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + outptr = output_data[outrow]; + inptr0 = input_data[inrow]; + inptr1 = input_data[inrow+1]; + bias = 1; /* bias = 1,2,1,2,... for successive samples */ + for (outcol = 0; outcol < output_cols; outcol++) { + *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) + + bias) >> 2); + bias ^= 3; /* 1=>2, 2=>1 */ + inptr0 += 2; inptr1 += 2; + } + inrow += 2; + outrow++; + } +} + + +#ifdef INPUT_SMOOTHING_SUPPORTED + +/* + * Downsample pixel values of a single component. + * This version handles the standard case of 2:1 horizontal and 2:1 vertical, + * with smoothing. One row of context is required. + */ + +METHODDEF(void) +h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow, outrow; + JDIMENSION colctr; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr; + INT32 membersum, neighsum, memberscale, neighscale; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, + cinfo->image_width, output_cols * 2); + + /* We don't bother to form the individual "smoothed" input pixel values; + * we can directly compute the output which is the average of the four + * smoothed values. Each of the four member pixels contributes a fraction + * (1-8*SF) to its own smoothed image and a fraction SF to each of the three + * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final + * output. The four corner-adjacent neighbor pixels contribute a fraction + * SF to just one smoothed pixel, or SF/4 to the final output; while the + * eight edge-adjacent neighbors contribute SF to each of two smoothed + * pixels, or SF/2 overall. In order to use integer arithmetic, these + * factors are scaled by 2^16 = 65536. + * Also recall that SF = smoothing_factor / 1024. + */ + + memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */ + neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */ + + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + outptr = output_data[outrow]; + inptr0 = input_data[inrow]; + inptr1 = input_data[inrow+1]; + above_ptr = input_data[inrow-1]; + below_ptr = input_data[inrow+2]; + + /* Special case for first column: pretend column -1 is same as column 0 */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]); + neighsum += neighsum; + neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]); + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; + + for (colctr = output_cols - 2; colctr > 0; colctr--) { + /* sum of pixels directly mapped to this output element */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + /* sum of edge-neighbor pixels */ + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) + + GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]); + /* The edge-neighbors count twice as much as corner-neighbors */ + neighsum += neighsum; + /* Add in the corner-neighbors */ + neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) + + GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]); + /* form final output scaled up by 2^16 */ + membersum = membersum * memberscale + neighsum * neighscale; + /* round, descale and output it */ + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; + } + + /* Special case for last column */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]); + neighsum += neighsum; + neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]); + membersum = membersum * memberscale + neighsum * neighscale; + *outptr = (JSAMPLE) ((membersum + 32768) >> 16); + + inrow += 2; + outrow++; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the special case of a full-size component, + * with smoothing. One row of context is required. + */ + +METHODDEF(void) +fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow; + JDIMENSION colctr; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + register JSAMPROW inptr, above_ptr, below_ptr, outptr; + INT32 membersum, neighsum, memberscale, neighscale; + int colsum, lastcolsum, nextcolsum; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, + cinfo->image_width, output_cols); + + /* Each of the eight neighbor pixels contributes a fraction SF to the + * smoothed pixel, while the main pixel contributes (1-8*SF). In order + * to use integer arithmetic, these factors are multiplied by 2^16 = 65536. + * Also recall that SF = smoothing_factor / 1024. + */ + + memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */ + neighscale = cinfo->smoothing_factor * 64; /* scaled SF */ + + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + outptr = output_data[inrow]; + inptr = input_data[inrow]; + above_ptr = input_data[inrow-1]; + below_ptr = input_data[inrow+1]; + + /* Special case for first column */ + colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) + + GETJSAMPLE(*inptr); + membersum = GETJSAMPLE(*inptr++); + nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + + GETJSAMPLE(*inptr); + neighsum = colsum + (colsum - membersum) + nextcolsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + lastcolsum = colsum; colsum = nextcolsum; + + for (colctr = output_cols - 2; colctr > 0; colctr--) { + membersum = GETJSAMPLE(*inptr++); + above_ptr++; below_ptr++; + nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + + GETJSAMPLE(*inptr); + neighsum = lastcolsum + (colsum - membersum) + nextcolsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + lastcolsum = colsum; colsum = nextcolsum; + } + + /* Special case for last column */ + membersum = GETJSAMPLE(*inptr); + neighsum = lastcolsum + (colsum - membersum) + colsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr = (JSAMPLE) ((membersum + 32768) >> 16); + + } +} + +#endif /* INPUT_SMOOTHING_SUPPORTED */ + + +/* + * Module initialization routine for downsampling. + * Note that we must select a routine for each component. + */ + +GLOBAL(void) +jinit_downsampler (j_compress_ptr cinfo) +{ + my_downsample_ptr downsample; + int ci; + jpeg_component_info * compptr; + boolean smoothok = TRUE; + int h_in_group, v_in_group, h_out_group, v_out_group; + + downsample = (my_downsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_downsampler)); + cinfo->downsample = (struct jpeg_downsampler *) downsample; + downsample->pub.start_pass = start_pass_downsample; + downsample->pub.downsample = sep_downsample; + downsample->pub.need_context_rows = FALSE; + + if (cinfo->CCIR601_sampling) + ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); + + /* Verify we can handle the sampling factors, and set up method pointers */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Compute size of an "output group" for DCT scaling. This many samples + * are to be converted from max_h_samp_factor * max_v_samp_factor pixels. + */ + h_out_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) / + cinfo->min_DCT_h_scaled_size; + v_out_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + h_in_group = cinfo->max_h_samp_factor; + v_in_group = cinfo->max_v_samp_factor; + downsample->rowgroup_height[ci] = v_out_group; /* save for use later */ + if (h_in_group == h_out_group && v_in_group == v_out_group) { +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor) { + downsample->methods[ci] = fullsize_smooth_downsample; + downsample->pub.need_context_rows = TRUE; + } else +#endif + downsample->methods[ci] = fullsize_downsample; + } else if (h_in_group == h_out_group * 2 && + v_in_group == v_out_group) { + smoothok = FALSE; + downsample->methods[ci] = h2v1_downsample; + } else if (h_in_group == h_out_group * 2 && + v_in_group == v_out_group * 2) { +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor) { + downsample->methods[ci] = h2v2_smooth_downsample; + downsample->pub.need_context_rows = TRUE; + } else +#endif + downsample->methods[ci] = h2v2_downsample; + } else if ((h_in_group % h_out_group) == 0 && + (v_in_group % v_out_group) == 0) { + smoothok = FALSE; + downsample->methods[ci] = int_downsample; + downsample->h_expand[ci] = (UINT8) (h_in_group / h_out_group); + downsample->v_expand[ci] = (UINT8) (v_in_group / v_out_group); + } else + ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); + } + +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor && !smoothok) + TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL); +#endif +} diff --git a/src/3rdparty/libjpeg/jctrans.c b/src/3rdparty/libjpeg/jctrans.c new file mode 100644 index 0000000000..cee6b0f343 --- /dev/null +++ b/src/3rdparty/libjpeg/jctrans.c @@ -0,0 +1,382 @@ +/* + * jctrans.c + * + * Copyright (C) 1995-1998, Thomas G. Lane. + * Modified 2000-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains library routines for transcoding compression, + * that is, writing raw DCT coefficient arrays to an output JPEG file. + * The routines in jcapimin.c will also be needed by a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(void) transencode_master_selection + JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); +LOCAL(void) transencode_coef_controller + JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); + + +/* + * Compression initialization for writing raw-coefficient data. + * Before calling this, all parameters and a data destination must be set up. + * Call jpeg_finish_compress() to actually write the data. + * + * The number of passed virtual arrays must match cinfo->num_components. + * Note that the virtual arrays need not be filled or even realized at + * the time write_coefficients is called; indeed, if the virtual arrays + * were requested from this compression object's memory manager, they + * typically will be realized during this routine and filled afterwards. + */ + +GLOBAL(void) +jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Mark all tables to be written */ + jpeg_suppress_tables(cinfo, FALSE); + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Perform master selection of active modules */ + transencode_master_selection(cinfo, coef_arrays); + /* Wait for jpeg_finish_compress() call */ + cinfo->next_scanline = 0; /* so jpeg_write_marker works */ + cinfo->global_state = CSTATE_WRCOEFS; +} + + +/* + * Initialize the compression object with default parameters, + * then copy from the source object all parameters needed for lossless + * transcoding. Parameters that can be varied without loss (such as + * scan script and Huffman optimization) are left in their default states. + */ + +GLOBAL(void) +jpeg_copy_critical_parameters (j_decompress_ptr srcinfo, + j_compress_ptr dstinfo) +{ + JQUANT_TBL ** qtblptr; + jpeg_component_info *incomp, *outcomp; + JQUANT_TBL *c_quant, *slot_quant; + int tblno, ci, coefi; + + /* Safety check to ensure start_compress not called yet. */ + if (dstinfo->global_state != CSTATE_START) + ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state); + /* Copy fundamental image dimensions */ + dstinfo->image_width = srcinfo->image_width; + dstinfo->image_height = srcinfo->image_height; + dstinfo->input_components = srcinfo->num_components; + dstinfo->in_color_space = srcinfo->jpeg_color_space; + dstinfo->jpeg_width = srcinfo->output_width; + dstinfo->jpeg_height = srcinfo->output_height; + dstinfo->min_DCT_h_scaled_size = srcinfo->min_DCT_h_scaled_size; + dstinfo->min_DCT_v_scaled_size = srcinfo->min_DCT_v_scaled_size; + /* Initialize all parameters to default values */ + jpeg_set_defaults(dstinfo); + /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB. + * Fix it to get the right header markers for the image colorspace. + */ + jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space); + dstinfo->data_precision = srcinfo->data_precision; + dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling; + /* Copy the source's quantization tables. */ + for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { + if (srcinfo->quant_tbl_ptrs[tblno] != NULL) { + qtblptr = & dstinfo->quant_tbl_ptrs[tblno]; + if (*qtblptr == NULL) + *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo); + MEMCOPY((*qtblptr)->quantval, + srcinfo->quant_tbl_ptrs[tblno]->quantval, + SIZEOF((*qtblptr)->quantval)); + (*qtblptr)->sent_table = FALSE; + } + } + /* Copy the source's per-component info. + * Note we assume jpeg_set_defaults has allocated the dest comp_info array. + */ + dstinfo->num_components = srcinfo->num_components; + if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS) + ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components, + MAX_COMPONENTS); + for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info; + ci < dstinfo->num_components; ci++, incomp++, outcomp++) { + outcomp->component_id = incomp->component_id; + outcomp->h_samp_factor = incomp->h_samp_factor; + outcomp->v_samp_factor = incomp->v_samp_factor; + outcomp->quant_tbl_no = incomp->quant_tbl_no; + /* Make sure saved quantization table for component matches the qtable + * slot. If not, the input file re-used this qtable slot. + * IJG encoder currently cannot duplicate this. + */ + tblno = outcomp->quant_tbl_no; + if (tblno < 0 || tblno >= NUM_QUANT_TBLS || + srcinfo->quant_tbl_ptrs[tblno] == NULL) + ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno); + slot_quant = srcinfo->quant_tbl_ptrs[tblno]; + c_quant = incomp->quant_table; + if (c_quant != NULL) { + for (coefi = 0; coefi < DCTSIZE2; coefi++) { + if (c_quant->quantval[coefi] != slot_quant->quantval[coefi]) + ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno); + } + } + /* Note: we do not copy the source's Huffman table assignments; + * instead we rely on jpeg_set_colorspace to have made a suitable choice. + */ + } + /* Also copy JFIF version and resolution information, if available. + * Strictly speaking this isn't "critical" info, but it's nearly + * always appropriate to copy it if available. In particular, + * if the application chooses to copy JFIF 1.02 extension markers from + * the source file, we need to copy the version to make sure we don't + * emit a file that has 1.02 extensions but a claimed version of 1.01. + * We will *not*, however, copy version info from mislabeled "2.01" files. + */ + if (srcinfo->saw_JFIF_marker) { + if (srcinfo->JFIF_major_version == 1) { + dstinfo->JFIF_major_version = srcinfo->JFIF_major_version; + dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version; + } + dstinfo->density_unit = srcinfo->density_unit; + dstinfo->X_density = srcinfo->X_density; + dstinfo->Y_density = srcinfo->Y_density; + } +} + + +/* + * Master selection of compression modules for transcoding. + * This substitutes for jcinit.c's initialization of the full compressor. + */ + +LOCAL(void) +transencode_master_selection (j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays) +{ + /* Initialize master control (includes parameter checking/processing) */ + jinit_c_master_control(cinfo, TRUE /* transcode only */); + + /* Entropy encoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_encoder(cinfo); + else { + jinit_huff_encoder(cinfo); + } + + /* We need a special coefficient buffer controller. */ + transencode_coef_controller(cinfo, coef_arrays); + + jinit_marker_writer(cinfo); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Write the datastream header (SOI, JFIF) immediately. + * Frame and scan headers are postponed till later. + * This lets application insert special markers after the SOI. + */ + (*cinfo->marker->write_file_header) (cinfo); +} + + +/* + * The rest of this file is a special implementation of the coefficient + * buffer controller. This is similar to jccoefct.c, but it handles only + * output from presupplied virtual arrays. Furthermore, we generate any + * dummy padding blocks on-the-fly rather than expecting them to be present + * in the arrays. + */ + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_coef_controller pub; /* public fields */ + + JDIMENSION iMCU_row_num; /* iMCU row # within image */ + JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* Virtual block array for each component. */ + jvirt_barray_ptr * whole_image; + + /* Workspace for constructing dummy blocks at right/bottom edges. */ + JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU]; +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + + +LOCAL(void) +start_iMCU_row (j_compress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->mcu_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + if (pass_mode != JBUF_CRANK_DEST) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + coef->iMCU_row_num = 0; + start_iMCU_row(cinfo); +} + + +/* + * Process some data. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the scan. + * The data is obtained from the virtual arrays and fed to the entropy coder. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf is ignored; it is likely to be a NULL pointer. + */ + +METHODDEF(boolean) +compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, ci, xindex, yindex, yoffset, blockcnt; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (coef->iMCU_row_num < last_iMCU_row || + yindex+yoffset < compptr->last_row_height) { + /* Fill in pointers to real blocks in this row */ + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < blockcnt; xindex++) + MCU_buffer[blkn++] = buffer_ptr++; + } else { + /* At bottom of image, need a whole row of dummy blocks */ + xindex = 0; + } + /* Fill in any dummy blocks needed in this row. + * Dummy blocks are filled in the same way as in jccoefct.c: + * all zeroes in the AC entries, DC entries equal to previous + * block's DC value. The init routine has already zeroed the + * AC entries, so we need only set the DC entries correctly. + */ + for (; xindex < compptr->MCU_width; xindex++) { + MCU_buffer[blkn] = coef->dummy_buffer[blkn]; + MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0]; + blkn++; + } + } + } + /* Try to write the MCU. */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + + +/* + * Initialize coefficient buffer controller. + * + * Each passed coefficient array must be the right size for that + * coefficient: width_in_blocks wide and height_in_blocks high, + * with unitheight at least v_samp_factor. + */ + +LOCAL(void) +transencode_coef_controller (j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays) +{ + my_coef_ptr coef; + JBLOCKROW buffer; + int i; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_c_coef_controller *) coef; + coef->pub.start_pass = start_pass_coef; + coef->pub.compress_data = compress_output; + + /* Save pointer to virtual arrays */ + coef->whole_image = coef_arrays; + + /* Allocate and pre-zero space for dummy DCT blocks. */ + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { + coef->dummy_buffer[i] = buffer + i; + } +} diff --git a/src/3rdparty/libjpeg/jdapimin.c b/src/3rdparty/libjpeg/jdapimin.c new file mode 100644 index 0000000000..7f1ce4c05b --- /dev/null +++ b/src/3rdparty/libjpeg/jdapimin.c @@ -0,0 +1,396 @@ +/* + * jdapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the decompression half + * of the JPEG library. These are the "minimum" API routines that may be + * needed in either the normal full-decompression case or the + * transcoding-only case. + * + * Most of the routines intended to be called directly by an application + * are in this file or in jdapistd.c. But also see jcomapi.c for routines + * shared by compression and decompression, and jdtrans.c for the transcoding + * case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Initialization of a JPEG decompression object. + * The error manager must already be set up (in case memory manager fails). + */ + +GLOBAL(void) +jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize) +{ + int i; + + /* Guard against version mismatches between library and caller. */ + cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ + if (version != JPEG_LIB_VERSION) + ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); + if (structsize != SIZEOF(struct jpeg_decompress_struct)) + ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, + (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize); + + /* For debugging purposes, we zero the whole master structure. + * But the application has already set the err pointer, and may have set + * client_data, so we have to save and restore those fields. + * Note: if application hasn't set client_data, tools like Purify may + * complain here. + */ + { + struct jpeg_error_mgr * err = cinfo->err; + void * client_data = cinfo->client_data; /* ignore Purify complaint here */ + MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct)); + cinfo->err = err; + cinfo->client_data = client_data; + } + cinfo->is_decompressor = TRUE; + + /* Initialize a memory manager instance for this object */ + jinit_memory_mgr((j_common_ptr) cinfo); + + /* Zero out pointers to permanent structures. */ + cinfo->progress = NULL; + cinfo->src = NULL; + + for (i = 0; i < NUM_QUANT_TBLS; i++) + cinfo->quant_tbl_ptrs[i] = NULL; + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + /* Initialize marker processor so application can override methods + * for COM, APPn markers before calling jpeg_read_header. + */ + cinfo->marker_list = NULL; + jinit_marker_reader(cinfo); + + /* And initialize the overall input controller. */ + jinit_input_controller(cinfo); + + /* OK, I'm ready */ + cinfo->global_state = DSTATE_START; +} + + +/* + * Destruction of a JPEG decompression object + */ + +GLOBAL(void) +jpeg_destroy_decompress (j_decompress_ptr cinfo) +{ + jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Abort processing of a JPEG decompression operation, + * but don't destroy the object itself. + */ + +GLOBAL(void) +jpeg_abort_decompress (j_decompress_ptr cinfo) +{ + jpeg_abort((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Set default decompression parameters. + */ + +LOCAL(void) +default_decompress_parms (j_decompress_ptr cinfo) +{ + /* Guess the input colorspace, and set output colorspace accordingly. */ + /* (Wish JPEG committee had provided a real way to specify this...) */ + /* Note application may override our guesses. */ + switch (cinfo->num_components) { + case 1: + cinfo->jpeg_color_space = JCS_GRAYSCALE; + cinfo->out_color_space = JCS_GRAYSCALE; + break; + + case 3: + if (cinfo->saw_JFIF_marker) { + cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */ + } else if (cinfo->saw_Adobe_marker) { + switch (cinfo->Adobe_transform) { + case 0: + cinfo->jpeg_color_space = JCS_RGB; + break; + case 1: + cinfo->jpeg_color_space = JCS_YCbCr; + break; + default: + WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); + cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ + break; + } + } else { + /* Saw no special markers, try to guess from the component IDs */ + int cid0 = cinfo->comp_info[0].component_id; + int cid1 = cinfo->comp_info[1].component_id; + int cid2 = cinfo->comp_info[2].component_id; + + if (cid0 == 1 && cid1 == 2 && cid2 == 3) + cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */ + else if (cid0 == 82 && cid1 == 71 && cid2 == 66) + cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */ + else { + TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); + cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ + } + } + /* Always guess RGB is proper output colorspace. */ + cinfo->out_color_space = JCS_RGB; + break; + + case 4: + if (cinfo->saw_Adobe_marker) { + switch (cinfo->Adobe_transform) { + case 0: + cinfo->jpeg_color_space = JCS_CMYK; + break; + case 2: + cinfo->jpeg_color_space = JCS_YCCK; + break; + default: + WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); + cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ + break; + } + } else { + /* No special markers, assume straight CMYK. */ + cinfo->jpeg_color_space = JCS_CMYK; + } + cinfo->out_color_space = JCS_CMYK; + break; + + default: + cinfo->jpeg_color_space = JCS_UNKNOWN; + cinfo->out_color_space = JCS_UNKNOWN; + break; + } + + /* Set defaults for other decompression parameters. */ + cinfo->scale_num = cinfo->block_size; /* 1:1 scaling */ + cinfo->scale_denom = cinfo->block_size; + cinfo->output_gamma = 1.0; + cinfo->buffered_image = FALSE; + cinfo->raw_data_out = FALSE; + cinfo->dct_method = JDCT_DEFAULT; + cinfo->do_fancy_upsampling = TRUE; + cinfo->do_block_smoothing = TRUE; + cinfo->quantize_colors = FALSE; + /* We set these in case application only sets quantize_colors. */ + cinfo->dither_mode = JDITHER_FS; +#ifdef QUANT_2PASS_SUPPORTED + cinfo->two_pass_quantize = TRUE; +#else + cinfo->two_pass_quantize = FALSE; +#endif + cinfo->desired_number_of_colors = 256; + cinfo->colormap = NULL; + /* Initialize for no mode change in buffered-image mode. */ + cinfo->enable_1pass_quant = FALSE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; +} + + +/* + * Decompression startup: read start of JPEG datastream to see what's there. + * Need only initialize JPEG object and supply a data source before calling. + * + * This routine will read as far as the first SOS marker (ie, actual start of + * compressed data), and will save all tables and parameters in the JPEG + * object. It will also initialize the decompression parameters to default + * values, and finally return JPEG_HEADER_OK. On return, the application may + * adjust the decompression parameters and then call jpeg_start_decompress. + * (Or, if the application only wanted to determine the image parameters, + * the data need not be decompressed. In that case, call jpeg_abort or + * jpeg_destroy to release any temporary space.) + * If an abbreviated (tables only) datastream is presented, the routine will + * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then + * re-use the JPEG object to read the abbreviated image datastream(s). + * It is unnecessary (but OK) to call jpeg_abort in this case. + * The JPEG_SUSPENDED return code only occurs if the data source module + * requests suspension of the decompressor. In this case the application + * should load more source data and then re-call jpeg_read_header to resume + * processing. + * If a non-suspending data source is used and require_image is TRUE, then the + * return code need not be inspected since only JPEG_HEADER_OK is possible. + * + * This routine is now just a front end to jpeg_consume_input, with some + * extra error checking. + */ + +GLOBAL(int) +jpeg_read_header (j_decompress_ptr cinfo, boolean require_image) +{ + int retcode; + + if (cinfo->global_state != DSTATE_START && + cinfo->global_state != DSTATE_INHEADER) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + retcode = jpeg_consume_input(cinfo); + + switch (retcode) { + case JPEG_REACHED_SOS: + retcode = JPEG_HEADER_OK; + break; + case JPEG_REACHED_EOI: + if (require_image) /* Complain if application wanted an image */ + ERREXIT(cinfo, JERR_NO_IMAGE); + /* Reset to start state; it would be safer to require the application to + * call jpeg_abort, but we can't change it now for compatibility reasons. + * A side effect is to free any temporary memory (there shouldn't be any). + */ + jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */ + retcode = JPEG_HEADER_TABLES_ONLY; + break; + case JPEG_SUSPENDED: + /* no work */ + break; + } + + return retcode; +} + + +/* + * Consume data in advance of what the decompressor requires. + * This can be called at any time once the decompressor object has + * been created and a data source has been set up. + * + * This routine is essentially a state machine that handles a couple + * of critical state-transition actions, namely initial setup and + * transition from header scanning to ready-for-start_decompress. + * All the actual input is done via the input controller's consume_input + * method. + */ + +GLOBAL(int) +jpeg_consume_input (j_decompress_ptr cinfo) +{ + int retcode = JPEG_SUSPENDED; + + /* NB: every possible DSTATE value should be listed in this switch */ + switch (cinfo->global_state) { + case DSTATE_START: + /* Start-of-datastream actions: reset appropriate modules */ + (*cinfo->inputctl->reset_input_controller) (cinfo); + /* Initialize application's data source module */ + (*cinfo->src->init_source) (cinfo); + cinfo->global_state = DSTATE_INHEADER; + /*FALLTHROUGH*/ + case DSTATE_INHEADER: + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */ + /* Set up default parameters based on header data */ + default_decompress_parms(cinfo); + /* Set global state: ready for start_decompress */ + cinfo->global_state = DSTATE_READY; + } + break; + case DSTATE_READY: + /* Can't advance past first SOS until start_decompress is called */ + retcode = JPEG_REACHED_SOS; + break; + case DSTATE_PRELOAD: + case DSTATE_PRESCAN: + case DSTATE_SCANNING: + case DSTATE_RAW_OK: + case DSTATE_BUFIMAGE: + case DSTATE_BUFPOST: + case DSTATE_STOPPING: + retcode = (*cinfo->inputctl->consume_input) (cinfo); + break; + default: + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + return retcode; +} + + +/* + * Have we finished reading the input file? + */ + +GLOBAL(boolean) +jpeg_input_complete (j_decompress_ptr cinfo) +{ + /* Check for valid jpeg object */ + if (cinfo->global_state < DSTATE_START || + cinfo->global_state > DSTATE_STOPPING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return cinfo->inputctl->eoi_reached; +} + + +/* + * Is there more than one scan? + */ + +GLOBAL(boolean) +jpeg_has_multiple_scans (j_decompress_ptr cinfo) +{ + /* Only valid after jpeg_read_header completes */ + if (cinfo->global_state < DSTATE_READY || + cinfo->global_state > DSTATE_STOPPING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return cinfo->inputctl->has_multiple_scans; +} + + +/* + * Finish JPEG decompression. + * + * This will normally just verify the file trailer and release temp storage. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_finish_decompress (j_decompress_ptr cinfo) +{ + if ((cinfo->global_state == DSTATE_SCANNING || + cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) { + /* Terminate final pass of non-buffered mode */ + if (cinfo->output_scanline < cinfo->output_height) + ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); + (*cinfo->master->finish_output_pass) (cinfo); + cinfo->global_state = DSTATE_STOPPING; + } else if (cinfo->global_state == DSTATE_BUFIMAGE) { + /* Finishing after a buffered-image operation */ + cinfo->global_state = DSTATE_STOPPING; + } else if (cinfo->global_state != DSTATE_STOPPING) { + /* STOPPING = repeat call after a suspension, anything else is error */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + /* Read until EOI */ + while (! cinfo->inputctl->eoi_reached) { + if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) + return FALSE; /* Suspend, come back later */ + } + /* Do final cleanup */ + (*cinfo->src->term_source) (cinfo); + /* We can use jpeg_abort to release memory and reset global_state */ + jpeg_abort((j_common_ptr) cinfo); + return TRUE; +} diff --git a/src/3rdparty/libjpeg/jdapistd.c b/src/3rdparty/libjpeg/jdapistd.c new file mode 100644 index 0000000000..9d74537772 --- /dev/null +++ b/src/3rdparty/libjpeg/jdapistd.c @@ -0,0 +1,275 @@ +/* + * jdapistd.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the decompression half + * of the JPEG library. These are the "standard" API routines that are + * used in the normal full-decompression case. They are not used by a + * transcoding-only application. Note that if an application links in + * jpeg_start_decompress, it will end up linking in the entire decompressor. + * We thus must separate this file from jdapimin.c to avoid linking the + * whole decompression library into a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo)); + + +/* + * Decompression initialization. + * jpeg_read_header must be completed before calling this. + * + * If a multipass operating mode was selected, this will do all but the + * last pass, and thus may take a great deal of time. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_start_decompress (j_decompress_ptr cinfo) +{ + if (cinfo->global_state == DSTATE_READY) { + /* First call: initialize master control, select active modules */ + jinit_master_decompress(cinfo); + if (cinfo->buffered_image) { + /* No more work here; expecting jpeg_start_output next */ + cinfo->global_state = DSTATE_BUFIMAGE; + return TRUE; + } + cinfo->global_state = DSTATE_PRELOAD; + } + if (cinfo->global_state == DSTATE_PRELOAD) { + /* If file has multiple scans, absorb them all into the coef buffer */ + if (cinfo->inputctl->has_multiple_scans) { +#ifdef D_MULTISCAN_FILES_SUPPORTED + for (;;) { + int retcode; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + /* Absorb some more input */ + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_SUSPENDED) + return FALSE; + if (retcode == JPEG_REACHED_EOI) + break; + /* Advance progress counter if appropriate */ + if (cinfo->progress != NULL && + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { + /* jdmaster underestimated number of scans; ratchet up one scan */ + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; + } + } + } +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + } + cinfo->output_scan_number = cinfo->input_scan_number; + } else if (cinfo->global_state != DSTATE_PRESCAN) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Perform any dummy output passes, and set up for the final pass */ + return output_pass_setup(cinfo); +} + + +/* + * Set up for an output pass, and perform any dummy pass(es) needed. + * Common subroutine for jpeg_start_decompress and jpeg_start_output. + * Entry: global_state = DSTATE_PRESCAN only if previously suspended. + * Exit: If done, returns TRUE and sets global_state for proper output mode. + * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN. + */ + +LOCAL(boolean) +output_pass_setup (j_decompress_ptr cinfo) +{ + if (cinfo->global_state != DSTATE_PRESCAN) { + /* First call: do pass setup */ + (*cinfo->master->prepare_for_output_pass) (cinfo); + cinfo->output_scanline = 0; + cinfo->global_state = DSTATE_PRESCAN; + } + /* Loop over any required dummy passes */ + while (cinfo->master->is_dummy_pass) { +#ifdef QUANT_2PASS_SUPPORTED + /* Crank through the dummy pass */ + while (cinfo->output_scanline < cinfo->output_height) { + JDIMENSION last_scanline; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + /* Process some data */ + last_scanline = cinfo->output_scanline; + (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL, + &cinfo->output_scanline, (JDIMENSION) 0); + if (cinfo->output_scanline == last_scanline) + return FALSE; /* No progress made, must suspend */ + } + /* Finish up dummy pass, and set up for another one */ + (*cinfo->master->finish_output_pass) (cinfo); + (*cinfo->master->prepare_for_output_pass) (cinfo); + cinfo->output_scanline = 0; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* QUANT_2PASS_SUPPORTED */ + } + /* Ready for application to drive output pass through + * jpeg_read_scanlines or jpeg_read_raw_data. + */ + cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING; + return TRUE; +} + + +/* + * Read some scanlines of data from the JPEG decompressor. + * + * The return value will be the number of lines actually read. + * This may be less than the number requested in several cases, + * including bottom of image, data source suspension, and operating + * modes that emit multiple scanlines at a time. + * + * Note: we warn about excess calls to jpeg_read_scanlines() since + * this likely signals an application programmer error. However, + * an oversize buffer (max_lines > scanlines remaining) is not an error. + */ + +GLOBAL(JDIMENSION) +jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines, + JDIMENSION max_lines) +{ + JDIMENSION row_ctr; + + if (cinfo->global_state != DSTATE_SCANNING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->output_scanline >= cinfo->output_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Process some data */ + row_ctr = 0; + (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines); + cinfo->output_scanline += row_ctr; + return row_ctr; +} + + +/* + * Alternate entry point to read raw data. + * Processes exactly one iMCU row per call, unless suspended. + */ + +GLOBAL(JDIMENSION) +jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, + JDIMENSION max_lines) +{ + JDIMENSION lines_per_iMCU_row; + + if (cinfo->global_state != DSTATE_RAW_OK) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->output_scanline >= cinfo->output_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Verify that at least one iMCU row can be returned. */ + lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size; + if (max_lines < lines_per_iMCU_row) + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* Decompress directly into user's buffer. */ + if (! (*cinfo->coef->decompress_data) (cinfo, data)) + return 0; /* suspension forced, can do nothing more */ + + /* OK, we processed one iMCU row. */ + cinfo->output_scanline += lines_per_iMCU_row; + return lines_per_iMCU_row; +} + + +/* Additional entry points for buffered-image mode. */ + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Initialize for an output pass in buffered-image mode. + */ + +GLOBAL(boolean) +jpeg_start_output (j_decompress_ptr cinfo, int scan_number) +{ + if (cinfo->global_state != DSTATE_BUFIMAGE && + cinfo->global_state != DSTATE_PRESCAN) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Limit scan number to valid range */ + if (scan_number <= 0) + scan_number = 1; + if (cinfo->inputctl->eoi_reached && + scan_number > cinfo->input_scan_number) + scan_number = cinfo->input_scan_number; + cinfo->output_scan_number = scan_number; + /* Perform any dummy output passes, and set up for the real pass */ + return output_pass_setup(cinfo); +} + + +/* + * Finish up after an output pass in buffered-image mode. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_finish_output (j_decompress_ptr cinfo) +{ + if ((cinfo->global_state == DSTATE_SCANNING || + cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) { + /* Terminate this pass. */ + /* We do not require the whole pass to have been completed. */ + (*cinfo->master->finish_output_pass) (cinfo); + cinfo->global_state = DSTATE_BUFPOST; + } else if (cinfo->global_state != DSTATE_BUFPOST) { + /* BUFPOST = repeat call after a suspension, anything else is error */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + /* Read markers looking for SOS or EOI */ + while (cinfo->input_scan_number <= cinfo->output_scan_number && + ! cinfo->inputctl->eoi_reached) { + if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) + return FALSE; /* Suspend, come back later */ + } + cinfo->global_state = DSTATE_BUFIMAGE; + return TRUE; +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jdarith.c b/src/3rdparty/libjpeg/jdarith.c new file mode 100644 index 0000000000..c858b248b6 --- /dev/null +++ b/src/3rdparty/libjpeg/jdarith.c @@ -0,0 +1,772 @@ +/* + * jdarith.c + * + * Developed 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains portable arithmetic entropy decoding routines for JPEG + * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). + * + * Both sequential and progressive modes are supported in this single module. + * + * Suspension is not currently supported in this module. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Expanded entropy decoder object for arithmetic decoding. */ + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + INT32 c; /* C register, base of coding interval + input bit buffer */ + INT32 a; /* A register, normalized size of coding interval */ + int ct; /* bit shift counter, # of bits left in bit buffer part of C */ + /* init: ct = -16 */ + /* run: ct = 0..7 */ + /* error: ct = -1 */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Pointers to statistics areas (these workspaces have image lifespan) */ + unsigned char * dc_stats[NUM_ARITH_TBLS]; + unsigned char * ac_stats[NUM_ARITH_TBLS]; + + /* Statistics bin for coding with fixed probability 0.5 */ + unsigned char fixed_bin[4]; +} arith_entropy_decoder; + +typedef arith_entropy_decoder * arith_entropy_ptr; + +/* The following two definitions specify the allocation chunk size + * for the statistics area. + * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least + * 49 statistics bins for DC, and 245 statistics bins for AC coding. + * + * We use a compact representation with 1 byte per statistics bin, + * thus the numbers directly represent byte sizes. + * This 1 byte per statistics bin contains the meaning of the MPS + * (more probable symbol) in the highest bit (mask 0x80), and the + * index into the probability estimation state machine table + * in the lower bits (mask 0x7F). + */ + +#define DC_STAT_BINS 64 +#define AC_STAT_BINS 256 + + +LOCAL(int) +get_byte (j_decompress_ptr cinfo) +/* Read next input byte; we do not support suspension in this module. */ +{ + struct jpeg_source_mgr * src = cinfo->src; + + if (src->bytes_in_buffer == 0) + if (! (*src->fill_input_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + src->bytes_in_buffer--; + return GETJOCTET(*src->next_input_byte++); +} + + +/* + * The core arithmetic decoding routine (common in JPEG and JBIG). + * This needs to go as fast as possible. + * Machine-dependent optimization facilities + * are not utilized in this portable implementation. + * However, this code should be fairly efficient and + * may be a good base for further optimizations anyway. + * + * Return value is 0 or 1 (binary decision). + * + * Note: I've changed the handling of the code base & bit + * buffer register C compared to other implementations + * based on the standards layout & procedures. + * While it also contains both the actual base of the + * coding interval (16 bits) and the next-bits buffer, + * the cut-point between these two parts is floating + * (instead of fixed) with the bit shift counter CT. + * Thus, we also need only one (variable instead of + * fixed size) shift for the LPS/MPS decision, and + * we can get away with any renormalization update + * of C (except for new data insertion, of course). + * + * I've also introduced a new scheme for accessing + * the probability estimation state machine table, + * derived from Markus Kuhn's JBIG implementation. + */ + +LOCAL(int) +arith_decode (j_decompress_ptr cinfo, unsigned char *st) +{ + register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + register unsigned char nl, nm; + register INT32 qe, temp; + register int sv, data; + + /* Renormalization & data input per section D.2.6 */ + while (e->a < 0x8000L) { + if (--e->ct < 0) { + /* Need to fetch next data byte */ + if (cinfo->unread_marker) + data = 0; /* stuff zero data */ + else { + data = get_byte(cinfo); /* read next input byte */ + if (data == 0xFF) { /* zero stuff or marker code */ + do data = get_byte(cinfo); + while (data == 0xFF); /* swallow extra 0xFF bytes */ + if (data == 0) + data = 0xFF; /* discard stuffed zero byte */ + else { + /* Note: Different from the Huffman decoder, hitting + * a marker while processing the compressed data + * segment is legal in arithmetic coding. + * The convention is to supply zero data + * then until decoding is complete. + */ + cinfo->unread_marker = data; + data = 0; + } + } + } + e->c = (e->c << 8) | data; /* insert data into C register */ + if ((e->ct += 8) < 0) /* update bit shift counter */ + /* Need more initial bytes */ + if (++e->ct == 0) + /* Got 2 initial bytes -> re-init A and exit loop */ + e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */ + } + e->a <<= 1; + } + + /* Fetch values from our compact representation of Table D.2: + * Qe values and probability estimation state machine + */ + sv = *st; + qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ + nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ + nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ + + /* Decode & estimation procedures per sections D.2.4 & D.2.5 */ + temp = e->a - qe; + e->a = temp; + temp <<= e->ct; + if (e->c >= temp) { + e->c -= temp; + /* Conditional LPS (less probable symbol) exchange */ + if (e->a < qe) { + e->a = qe; + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } else { + e->a = qe; + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + sv ^= 0x80; /* Exchange LPS/MPS */ + } + } else if (e->a < 0x8000L) { + /* Conditional MPS (more probable symbol) exchange */ + if (e->a < qe) { + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + sv ^= 0x80; /* Exchange LPS/MPS */ + } else { + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } + } + + return sv >> 7; +} + + +/* + * Check for a restart marker & resynchronize decoder. + */ + +LOCAL(void) +process_restart (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci; + jpeg_component_info * compptr; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + + /* Re-initialize statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { + MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); + /* Reset DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + if ((! cinfo->progressive_mode && cinfo->lim_Se) || + (cinfo->progressive_mode && cinfo->Ss)) { + MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); + } + } + + /* Reset arithmetic decoding variables */ + entropy->c = 0; + entropy->a = 0; + entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Arithmetic MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * arithmetic-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. + */ + +/* + * MCU decoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, sign; + int v, m; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; + + /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.19: Decode_DC_DIFF */ + if (arith_decode(cinfo, st) == 0) + entropy->dc_context[ci] = 0; + else { + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, st + 1); + st += 2; st += sign; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ + else + entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + entropy->last_dc_val[ci] += v; + } + + /* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (entropy->last_dc_val[ci] << cinfo->Al); + } + + return TRUE; +} + + +/* + * MCU decoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, sign, k; + int v, m; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ + + /* Figure F.20: Decode_AC_coefficients */ + for (k = cinfo->Ss; k <= cinfo->Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (arith_decode(cinfo, st)) break; /* EOB flag */ + while (arith_decode(cinfo, st + 1) == 0) { + st += 3; k++; + if (k > cinfo->Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, entropy->fixed_bin); + st += 2; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + if (arith_decode(cinfo, st)) { + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + } + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al); + } + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + unsigned char *st; + int p1, blkn; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + st = entropy->fixed_bin; /* use fixed probability estimation */ + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + /* Encoded data is simply the next bit of the two's-complement DC value */ + if (arith_decode(cinfo, st)) + MCU_data[blkn][0][0] |= p1; + } + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + JCOEFPTR thiscoef; + unsigned char *st; + int tbl, k, kex; + int p1, m1; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + + /* Establish EOBx (previous stage end-of-block) index */ + for (kex = cinfo->Se; kex > 0; kex--) + if ((*block)[natural_order[kex]]) break; + + for (k = cinfo->Ss; k <= cinfo->Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (k > kex) + if (arith_decode(cinfo, st)) break; /* EOB flag */ + for (;;) { + thiscoef = *block + natural_order[k]; + if (*thiscoef) { /* previously nonzero coef */ + if (arith_decode(cinfo, st + 2)) { + if (*thiscoef < 0) + *thiscoef += m1; + else + *thiscoef += p1; + } + break; + } + if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */ + if (arith_decode(cinfo, entropy->fixed_bin)) + *thiscoef = m1; + else + *thiscoef = p1; + break; + } + st += 3; k++; + if (k > cinfo->Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + } + + return TRUE; +} + + +/* + * Decode one MCU's worth of arithmetic-compressed coefficients. + */ + +METHODDEF(boolean) +decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + jpeg_component_info * compptr; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, sign, k; + int v, m; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ + + tbl = compptr->dc_tbl_no; + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.19: Decode_DC_DIFF */ + if (arith_decode(cinfo, st) == 0) + entropy->dc_context[ci] = 0; + else { + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, st + 1); + st += 2; st += sign; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ + else + entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + entropy->last_dc_val[ci] += v; + } + + (*block)[0] = (JCOEF) entropy->last_dc_val[ci]; + + /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ + + tbl = compptr->ac_tbl_no; + + /* Figure F.20: Decode_AC_coefficients */ + for (k = 1; k <= cinfo->lim_Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (arith_decode(cinfo, st)) break; /* EOB flag */ + while (arith_decode(cinfo, st + 1) == 0) { + st += 3; k++; + if (k > cinfo->lim_Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, entropy->fixed_bin); + st += 2; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + if (arith_decode(cinfo, st)) { + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + } + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + (*block)[natural_order[k]] = (JCOEF) v; + } + } + + return TRUE; +} + + +/* + * Initialize for an arithmetic-compressed scan. + */ + +METHODDEF(void) +start_pass (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (cinfo->progressive_mode) { + /* Validate progressive scan parameters */ + if (cinfo->Ss == 0) { + if (cinfo->Se != 0) + goto bad; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se) + goto bad; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + goto bad; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Ah-1 != cinfo->Al) + goto bad; + } + if (cinfo->Al > 13) { /* need not check for < 0 */ + bad: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + } + /* Update progression status, and verify that scan order is legal. + * Note that inter-scan inconsistencies are treated as warnings + * not fatal errors ... not clear if this is right way to behave. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + int coefi, cindex = cinfo->cur_comp_info[ci]->component_index; + int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { + int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; + if (cinfo->Ah != expected) + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); + coef_bit_ptr[coefi] = cinfo->Al; + } + } + /* Select MCU decoding routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + } else { + /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. + * This ought to be an error condition, but we make it a warning. + */ + if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 || + (cinfo->Se < DCTSIZE2 && cinfo->Se != cinfo->lim_Se)) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + /* Select MCU decoding routine */ + entropy->pub.decode_mcu = decode_mcu; + } + + /* Allocate & initialize requested statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { + tbl = compptr->dc_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->dc_stats[tbl] == NULL) + entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); + MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + if ((! cinfo->progressive_mode && cinfo->lim_Se) || + (cinfo->progressive_mode && cinfo->Ss)) { + tbl = compptr->ac_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->ac_stats[tbl] == NULL) + entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); + MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); + } + } + + /* Initialize arithmetic decoding variables */ + entropy->c = 0; + entropy->a = 0; + entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Module initialization routine for arithmetic entropy decoding. + */ + +GLOBAL(void) +jinit_arith_decoder (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy; + int i; + + entropy = (arith_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(arith_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + entropy->dc_stats[i] = NULL; + entropy->ac_stats[i] = NULL; + } + + /* Initialize index for fixed probability estimation */ + entropy->fixed_bin[0] = 113; + + if (cinfo->progressive_mode) { + /* Create progression status table */ + int *coef_bit_ptr, ci; + cinfo->coef_bits = (int (*)[DCTSIZE2]) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components*DCTSIZE2*SIZEOF(int)); + coef_bit_ptr = & cinfo->coef_bits[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (i = 0; i < DCTSIZE2; i++) + *coef_bit_ptr++ = -1; + } +} diff --git a/src/3rdparty/libjpeg/jdatadst.c b/src/3rdparty/libjpeg/jdatadst.c new file mode 100644 index 0000000000..472d5f3241 --- /dev/null +++ b/src/3rdparty/libjpeg/jdatadst.c @@ -0,0 +1,267 @@ +/* + * jdatadst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains compression data destination routines for the case of + * emitting JPEG data to memory or to a file (or any stdio stream). + * While these routines are sufficient for most applications, + * some will want to use a different destination manager. + * IMPORTANT: we assume that fwrite() will correctly transcribe an array of + * JOCTETs into 8-bit-wide elements on external storage. If char is wider + * than 8 bits on your machine, you may need to do some tweaking. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jerror.h" + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + + +/* Expanded data destination object for stdio output */ + +typedef struct { + struct jpeg_destination_mgr pub; /* public fields */ + + FILE * outfile; /* target stream */ + JOCTET * buffer; /* start of buffer */ +} my_destination_mgr; + +typedef my_destination_mgr * my_dest_ptr; + +#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ + + +/* Expanded data destination object for memory output */ + +typedef struct { + struct jpeg_destination_mgr pub; /* public fields */ + + unsigned char ** outbuffer; /* target buffer */ + unsigned long * outsize; + unsigned char * newbuffer; /* newly allocated buffer */ + JOCTET * buffer; /* start of buffer */ + size_t bufsize; +} my_mem_destination_mgr; + +typedef my_mem_destination_mgr * my_mem_dest_ptr; + + +/* + * Initialize destination --- called by jpeg_start_compress + * before any data is actually written. + */ + +METHODDEF(void) +init_destination (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + + /* Allocate the output buffer --- it will be released when done with image */ + dest->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + OUTPUT_BUF_SIZE * SIZEOF(JOCTET)); + + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; +} + +METHODDEF(void) +init_mem_destination (j_compress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Empty the output buffer --- called whenever buffer fills up. + * + * In typical applications, this should write the entire output buffer + * (ignoring the current state of next_output_byte & free_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been dumped. + * + * In applications that need to be able to suspend compression due to output + * overrun, a FALSE return indicates that the buffer cannot be emptied now. + * In this situation, the compressor will return to its caller (possibly with + * an indication that it has not accepted all the supplied scanlines). The + * application should resume compression after it has made more room in the + * output buffer. Note that there are substantial restrictions on the use of + * suspension --- see the documentation. + * + * When suspending, the compressor will back up to a convenient restart point + * (typically the start of the current MCU). next_output_byte & free_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point will be regenerated after resumption, so do not + * write it out when emptying the buffer externally. + */ + +METHODDEF(boolean) +empty_output_buffer (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + + if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) != + (size_t) OUTPUT_BUF_SIZE) + ERREXIT(cinfo, JERR_FILE_WRITE); + + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; + + return TRUE; +} + +METHODDEF(boolean) +empty_mem_output_buffer (j_compress_ptr cinfo) +{ + size_t nextsize; + JOCTET * nextbuffer; + my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; + + /* Try to allocate new buffer with double size */ + nextsize = dest->bufsize * 2; + nextbuffer = malloc(nextsize); + + if (nextbuffer == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); + + MEMCOPY(nextbuffer, dest->buffer, dest->bufsize); + + if (dest->newbuffer != NULL) + free(dest->newbuffer); + + dest->newbuffer = nextbuffer; + + dest->pub.next_output_byte = nextbuffer + dest->bufsize; + dest->pub.free_in_buffer = dest->bufsize; + + dest->buffer = nextbuffer; + dest->bufsize = nextsize; + + return TRUE; +} + + +/* + * Terminate destination --- called by jpeg_finish_compress + * after all data has been written. Usually needs to flush buffer. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +METHODDEF(void) +term_destination (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer; + + /* Write any data remaining in the buffer */ + if (datacount > 0) { + if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount) + ERREXIT(cinfo, JERR_FILE_WRITE); + } + fflush(dest->outfile); + /* Make sure we wrote the output file OK */ + if (ferror(dest->outfile)) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + +METHODDEF(void) +term_mem_destination (j_compress_ptr cinfo) +{ + my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; + + *dest->outbuffer = dest->buffer; + *dest->outsize = dest->bufsize - dest->pub.free_in_buffer; +} + + +/* + * Prepare for output to a stdio stream. + * The caller must have already opened the stream, and is responsible + * for closing it after finishing compression. + */ + +GLOBAL(void) +jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile) +{ + my_dest_ptr dest; + + /* The destination object is made permanent so that multiple JPEG images + * can be written to the same file without re-executing jpeg_stdio_dest. + * This makes it dangerous to use this manager and a different destination + * manager serially with the same JPEG object, because their private object + * sizes may be different. Caveat programmer. + */ + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ + cinfo->dest = (struct jpeg_destination_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_destination_mgr)); + } + + dest = (my_dest_ptr) cinfo->dest; + dest->pub.init_destination = init_destination; + dest->pub.empty_output_buffer = empty_output_buffer; + dest->pub.term_destination = term_destination; + dest->outfile = outfile; +} + + +/* + * Prepare for output to a memory buffer. + * The caller may supply an own initial buffer with appropriate size. + * Otherwise, or when the actual data output exceeds the given size, + * the library adapts the buffer size as necessary. + * The standard library functions malloc/free are used for allocating + * larger memory, so the buffer is available to the application after + * finishing compression, and then the application is responsible for + * freeing the requested memory. + */ + +GLOBAL(void) +jpeg_mem_dest (j_compress_ptr cinfo, + unsigned char ** outbuffer, unsigned long * outsize) +{ + my_mem_dest_ptr dest; + + if (outbuffer == NULL || outsize == NULL) /* sanity check */ + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* The destination object is made permanent so that multiple JPEG images + * can be written to the same buffer without re-executing jpeg_mem_dest. + */ + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ + cinfo->dest = (struct jpeg_destination_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_mem_destination_mgr)); + } + + dest = (my_mem_dest_ptr) cinfo->dest; + dest->pub.init_destination = init_mem_destination; + dest->pub.empty_output_buffer = empty_mem_output_buffer; + dest->pub.term_destination = term_mem_destination; + dest->outbuffer = outbuffer; + dest->outsize = outsize; + dest->newbuffer = NULL; + + if (*outbuffer == NULL || *outsize == 0) { + /* Allocate initial buffer */ + dest->newbuffer = *outbuffer = malloc(OUTPUT_BUF_SIZE); + if (dest->newbuffer == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); + *outsize = OUTPUT_BUF_SIZE; + } + + dest->pub.next_output_byte = dest->buffer = *outbuffer; + dest->pub.free_in_buffer = dest->bufsize = *outsize; +} diff --git a/src/3rdparty/libjpeg/jdatasrc.c b/src/3rdparty/libjpeg/jdatasrc.c new file mode 100644 index 0000000000..c8fe3daf33 --- /dev/null +++ b/src/3rdparty/libjpeg/jdatasrc.c @@ -0,0 +1,274 @@ +/* + * jdatasrc.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains decompression data source routines for the case of + * reading JPEG data from memory or from a file (or any stdio stream). + * While these routines are sufficient for most applications, + * some will want to use a different source manager. + * IMPORTANT: we assume that fread() will correctly transcribe an array of + * JOCTETs from 8-bit-wide elements on external storage. If char is wider + * than 8 bits on your machine, you may need to do some tweaking. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jerror.h" + + +/* Expanded data source object for stdio input */ + +typedef struct { + struct jpeg_source_mgr pub; /* public fields */ + + FILE * infile; /* source stream */ + JOCTET * buffer; /* start of buffer */ + boolean start_of_file; /* have we gotten any data yet? */ +} my_source_mgr; + +typedef my_source_mgr * my_src_ptr; + +#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ + + +/* + * Initialize source --- called by jpeg_read_header + * before any data is actually read. + */ + +METHODDEF(void) +init_source (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + /* We reset the empty-input-file flag for each image, + * but we don't clear the input buffer. + * This is correct behavior for reading a series of images from one source. + */ + src->start_of_file = TRUE; +} + +METHODDEF(void) +init_mem_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Fill the input buffer --- called whenever buffer is emptied. + * + * In typical applications, this should read fresh data into the buffer + * (ignoring the current state of next_input_byte & bytes_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been reloaded. It is not necessary to + * fill the buffer entirely, only to obtain at least one more byte. + * + * There is no such thing as an EOF return. If the end of the file has been + * reached, the routine has a choice of ERREXIT() or inserting fake data into + * the buffer. In most cases, generating a warning message and inserting a + * fake EOI marker is the best course of action --- this will allow the + * decompressor to output however much of the image is there. However, + * the resulting error message is misleading if the real problem is an empty + * input file, so we handle that case specially. + * + * In applications that need to be able to suspend compression due to input + * not being available yet, a FALSE return indicates that no more data can be + * obtained right now, but more may be forthcoming later. In this situation, + * the decompressor will return to its caller (with an indication of the + * number of scanlines it has read, if any). The application should resume + * decompression after it has loaded more data into the input buffer. Note + * that there are substantial restrictions on the use of suspension --- see + * the documentation. + * + * When suspending, the decompressor will back up to a convenient restart point + * (typically the start of the current MCU). next_input_byte & bytes_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point must be rescanned after resumption, so move it to + * the front of the buffer rather than discarding it. + */ + +METHODDEF(boolean) +fill_input_buffer (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + size_t nbytes; + + nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE); + + if (nbytes <= 0) { + if (src->start_of_file) /* Treat empty input file as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + src->buffer[0] = (JOCTET) 0xFF; + src->buffer[1] = (JOCTET) JPEG_EOI; + nbytes = 2; + } + + src->pub.next_input_byte = src->buffer; + src->pub.bytes_in_buffer = nbytes; + src->start_of_file = FALSE; + + return TRUE; +} + +METHODDEF(boolean) +fill_mem_input_buffer (j_decompress_ptr cinfo) +{ + static JOCTET mybuffer[4]; + + /* The whole JPEG data is expected to reside in the supplied memory + * buffer, so any request for more data beyond the given buffer size + * is treated as an error. + */ + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + mybuffer[0] = (JOCTET) 0xFF; + mybuffer[1] = (JOCTET) JPEG_EOI; + + cinfo->src->next_input_byte = mybuffer; + cinfo->src->bytes_in_buffer = 2; + + return TRUE; +} + + +/* + * Skip data --- used to skip over a potentially large amount of + * uninteresting data (such as an APPn marker). + * + * Writers of suspendable-input applications must note that skip_input_data + * is not granted the right to give a suspension return. If the skip extends + * beyond the data currently in the buffer, the buffer can be marked empty so + * that the next read will cause a fill_input_buffer call that can suspend. + * Arranging for additional bytes to be discarded before reloading the input + * buffer is the application writer's problem. + */ + +METHODDEF(void) +skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ + struct jpeg_source_mgr * src = cinfo->src; + + /* Just a dumb implementation for now. Could use fseek() except + * it doesn't work on pipes. Not clear that being smart is worth + * any trouble anyway --- large skips are infrequent. + */ + if (num_bytes > 0) { + while (num_bytes > (long) src->bytes_in_buffer) { + num_bytes -= (long) src->bytes_in_buffer; + (void) (*src->fill_input_buffer) (cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + src->next_input_byte += (size_t) num_bytes; + src->bytes_in_buffer -= (size_t) num_bytes; + } +} + + +/* + * An additional method that can be provided by data source modules is the + * resync_to_restart method for error recovery in the presence of RST markers. + * For the moment, this source module just uses the default resync method + * provided by the JPEG library. That method assumes that no backtracking + * is possible. + */ + + +/* + * Terminate source --- called by jpeg_finish_decompress + * after all data has been read. Often a no-op. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +METHODDEF(void) +term_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Prepare for input from a stdio stream. + * The caller must have already opened the stream, and is responsible + * for closing it after finishing decompression. + */ + +GLOBAL(void) +jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) +{ + my_src_ptr src; + + /* The source object and input buffer are made permanent so that a series + * of JPEG images can be read from the same file by calling jpeg_stdio_src + * only before the first one. (If we discarded the buffer at the end of + * one image, we'd likely lose the start of the next one.) + * This makes it unsafe to use this manager and a different source + * manager serially with the same JPEG object. Caveat programmer. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_source_mgr)); + src = (my_src_ptr) cinfo->src; + src->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + INPUT_BUF_SIZE * SIZEOF(JOCTET)); + } + + src = (my_src_ptr) cinfo->src; + src->pub.init_source = init_source; + src->pub.fill_input_buffer = fill_input_buffer; + src->pub.skip_input_data = skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = term_source; + src->infile = infile; + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->pub.next_input_byte = NULL; /* until buffer loaded */ +} + + +/* + * Prepare for input from a supplied memory buffer. + * The buffer must contain the whole JPEG data. + */ + +GLOBAL(void) +jpeg_mem_src (j_decompress_ptr cinfo, + unsigned char * inbuffer, unsigned long insize) +{ + struct jpeg_source_mgr * src; + + if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + + /* The source object is made permanent so that a series of JPEG images + * can be read from the same buffer by calling jpeg_mem_src only before + * the first one. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(struct jpeg_source_mgr)); + } + + src = cinfo->src; + src->init_source = init_mem_source; + src->fill_input_buffer = fill_mem_input_buffer; + src->skip_input_data = skip_input_data; + src->resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->term_source = term_source; + src->bytes_in_buffer = (size_t) insize; + src->next_input_byte = (JOCTET *) inbuffer; +} diff --git a/src/3rdparty/libjpeg/jdcoefct.c b/src/3rdparty/libjpeg/jdcoefct.c new file mode 100644 index 0000000000..462e92c612 --- /dev/null +++ b/src/3rdparty/libjpeg/jdcoefct.c @@ -0,0 +1,736 @@ +/* + * jdcoefct.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the coefficient buffer controller for decompression. + * This controller is the top level of the JPEG decompressor proper. + * The coefficient buffer lies between entropy decoding and inverse-DCT steps. + * + * In buffered-image mode, this controller is the interface between + * input-oriented processing and output-oriented processing. + * Also, the input side (only) is used when reading a file for transcoding. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +/* Block smoothing is only applicable for progressive JPEG, so: */ +#ifndef D_PROGRESSIVE_SUPPORTED +#undef BLOCK_SMOOTHING_SUPPORTED +#endif + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_coef_controller pub; /* public fields */ + + /* These variables keep track of the current location of the input side. */ + /* cinfo->input_iMCU_row is also used for this. */ + JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* The output side's location is represented by cinfo->output_iMCU_row. */ + + /* In single-pass modes, it's sufficient to buffer just one MCU. + * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, + * and let the entropy decoder write into that workspace each time. + * (On 80x86, the workspace is FAR even though it's not really very big; + * this is to keep the module interfaces unchanged when a large coefficient + * buffer is necessary.) + * In multi-pass modes, this array points to the current MCU's blocks + * within the virtual arrays; it is used only by the input side. + */ + JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU]; + +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* In multi-pass modes, we need a virtual block array for each component. */ + jvirt_barray_ptr whole_image[MAX_COMPONENTS]; +#endif + +#ifdef BLOCK_SMOOTHING_SUPPORTED + /* When doing block smoothing, we latch coefficient Al values here */ + int * coef_bits_latch; +#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ +#endif +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + +/* Forward declarations */ +METHODDEF(int) decompress_onepass + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#ifdef D_MULTISCAN_FILES_SUPPORTED +METHODDEF(int) decompress_data + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#endif +#ifdef BLOCK_SMOOTHING_SUPPORTED +LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo)); +METHODDEF(int) decompress_smooth_data + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#endif + + +LOCAL(void) +start_iMCU_row (j_decompress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row (input side) */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->MCU_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for an input processing pass. + */ + +METHODDEF(void) +start_input_pass (j_decompress_ptr cinfo) +{ + cinfo->input_iMCU_row = 0; + start_iMCU_row(cinfo); +} + + +/* + * Initialize for an output processing pass. + */ + +METHODDEF(void) +start_output_pass (j_decompress_ptr cinfo) +{ +#ifdef BLOCK_SMOOTHING_SUPPORTED + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* If multipass, check to see whether to use block smoothing on this pass */ + if (coef->pub.coef_arrays != NULL) { + if (cinfo->do_block_smoothing && smoothing_ok(cinfo)) + coef->pub.decompress_data = decompress_smooth_data; + else + coef->pub.decompress_data = decompress_data; + } +#endif + cinfo->output_iMCU_row = 0; +} + + +/* + * Decompress and return some data in the single-pass case. + * Always attempts to emit one fully interleaved MCU row ("iMCU" row). + * Input and output must run in lockstep since we have only a one-MCU buffer. + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + * + * NB: output_buf contains a plane for each component in image, + * which we index according to the component's SOF position. + */ + +METHODDEF(int) +decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, ci, xindex, yindex, yoffset, useful_width; + JSAMPARRAY output_ptr; + JDIMENSION start_col, output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + + /* Loop to process as much as one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; + MCU_col_num++) { + /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ + jzero_far((void FAR *) coef->MCU_buffer[0], + (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); + if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->MCU_ctr = MCU_col_num; + return JPEG_SUSPENDED; + } + /* Determine where data should go in output_buf and do the IDCT thing. + * We skip dummy blocks at the right and bottom edges (but blkn gets + * incremented past them!). Note the inner loop relies on having + * allocated the MCU_buffer[] blocks sequentially. + */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) { + blkn += compptr->MCU_blocks; + continue; + } + inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; + useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + output_ptr = output_buf[compptr->component_index] + + yoffset * compptr->DCT_v_scaled_size; + start_col = MCU_col_num * compptr->MCU_sample_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (cinfo->input_iMCU_row < last_iMCU_row || + yoffset+yindex < compptr->last_row_height) { + output_col = start_col; + for (xindex = 0; xindex < useful_width; xindex++) { + (*inverse_DCT) (cinfo, compptr, + (JCOEFPTR) coef->MCU_buffer[blkn+xindex], + output_ptr, output_col); + output_col += compptr->DCT_h_scaled_size; + } + } + blkn += compptr->MCU_width; + output_ptr += compptr->DCT_v_scaled_size; + } + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->MCU_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + cinfo->output_iMCU_row++; + if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + start_iMCU_row(cinfo); + return JPEG_ROW_COMPLETED; + } + /* Completed the scan */ + (*cinfo->inputctl->finish_input_pass) (cinfo); + return JPEG_SCAN_COMPLETED; +} + + +/* + * Dummy consume-input routine for single-pass operation. + */ + +METHODDEF(int) +dummy_consume_data (j_decompress_ptr cinfo) +{ + return JPEG_SUSPENDED; /* Always indicate nothing was done */ +} + + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Consume input data and store it in the full-image coefficient buffer. + * We read as much as one fully interleaved MCU row ("iMCU" row) per call, + * ie, v_samp_factor block rows for each component in the scan. + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + */ + +METHODDEF(int) +consume_data (j_decompress_ptr cinfo) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + int blkn, ci, xindex, yindex, yoffset; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + cinfo->input_iMCU_row * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, TRUE); + /* Note: entropy decoder expects buffer to be zeroed, + * but this is handled automatically by the memory manager + * because we requested a pre-zeroed array. + */ + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < compptr->MCU_width; xindex++) { + coef->MCU_buffer[blkn++] = buffer_ptr++; + } + } + } + /* Try to fetch the MCU. */ + if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->MCU_ctr = MCU_col_num; + return JPEG_SUSPENDED; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->MCU_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + start_iMCU_row(cinfo); + return JPEG_ROW_COMPLETED; + } + /* Completed the scan */ + (*cinfo->inputctl->finish_input_pass) (cinfo); + return JPEG_SCAN_COMPLETED; +} + + +/* + * Decompress and return some data in the multi-pass case. + * Always attempts to emit one fully interleaved MCU row ("iMCU" row). + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + * + * NB: output_buf contains a plane for each component in image. + */ + +METHODDEF(int) +decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION block_num; + int ci, block_row, block_rows; + JBLOCKARRAY buffer; + JBLOCKROW buffer_ptr; + JSAMPARRAY output_ptr; + JDIMENSION output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + + /* Force some input to be done if we are getting ahead of the input. */ + while (cinfo->input_scan_number < cinfo->output_scan_number || + (cinfo->input_scan_number == cinfo->output_scan_number && + cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { + if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) + return JPEG_SUSPENDED; + } + + /* OK, output from the virtual arrays. */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) + continue; + /* Align the virtual buffer for this component. */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + cinfo->output_iMCU_row * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + /* Count non-dummy DCT block rows in this iMCU row. */ + if (cinfo->output_iMCU_row < last_iMCU_row) + block_rows = compptr->v_samp_factor; + else { + /* NB: can't use last_row_height here; it is input-side-dependent! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + } + inverse_DCT = cinfo->idct->inverse_DCT[ci]; + output_ptr = output_buf[ci]; + /* Loop over all DCT blocks to be processed. */ + for (block_row = 0; block_row < block_rows; block_row++) { + buffer_ptr = buffer[block_row]; + output_col = 0; + for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) { + (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, + output_ptr, output_col); + buffer_ptr++; + output_col += compptr->DCT_h_scaled_size; + } + output_ptr += compptr->DCT_v_scaled_size; + } + } + + if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + return JPEG_ROW_COMPLETED; + return JPEG_SCAN_COMPLETED; +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + + +#ifdef BLOCK_SMOOTHING_SUPPORTED + +/* + * This code applies interblock smoothing as described by section K.8 + * of the JPEG standard: the first 5 AC coefficients are estimated from + * the DC values of a DCT block and its 8 neighboring blocks. + * We apply smoothing only for progressive JPEG decoding, and only if + * the coefficients it can estimate are not yet known to full precision. + */ + +/* Natural-order array positions of the first 5 zigzag-order coefficients */ +#define Q01_POS 1 +#define Q10_POS 8 +#define Q20_POS 16 +#define Q11_POS 9 +#define Q02_POS 2 + +/* + * Determine whether block smoothing is applicable and safe. + * We also latch the current states of the coef_bits[] entries for the + * AC coefficients; otherwise, if the input side of the decompressor + * advances into a new scan, we might think the coefficients are known + * more accurately than they really are. + */ + +LOCAL(boolean) +smoothing_ok (j_decompress_ptr cinfo) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + boolean smoothing_useful = FALSE; + int ci, coefi; + jpeg_component_info *compptr; + JQUANT_TBL * qtable; + int * coef_bits; + int * coef_bits_latch; + + if (! cinfo->progressive_mode || cinfo->coef_bits == NULL) + return FALSE; + + /* Allocate latch area if not already done */ + if (coef->coef_bits_latch == NULL) + coef->coef_bits_latch = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * + (SAVED_COEFS * SIZEOF(int))); + coef_bits_latch = coef->coef_bits_latch; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* All components' quantization values must already be latched. */ + if ((qtable = compptr->quant_table) == NULL) + return FALSE; + /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ + if (qtable->quantval[0] == 0 || + qtable->quantval[Q01_POS] == 0 || + qtable->quantval[Q10_POS] == 0 || + qtable->quantval[Q20_POS] == 0 || + qtable->quantval[Q11_POS] == 0 || + qtable->quantval[Q02_POS] == 0) + return FALSE; + /* DC values must be at least partly known for all components. */ + coef_bits = cinfo->coef_bits[ci]; + if (coef_bits[0] < 0) + return FALSE; + /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ + for (coefi = 1; coefi <= 5; coefi++) { + coef_bits_latch[coefi] = coef_bits[coefi]; + if (coef_bits[coefi] != 0) + smoothing_useful = TRUE; + } + coef_bits_latch += SAVED_COEFS; + } + + return smoothing_useful; +} + + +/* + * Variant of decompress_data for use when doing block smoothing. + */ + +METHODDEF(int) +decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION block_num, last_block_column; + int ci, block_row, block_rows, access_rows; + JBLOCKARRAY buffer; + JBLOCKROW buffer_ptr, prev_block_row, next_block_row; + JSAMPARRAY output_ptr; + JDIMENSION output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + boolean first_row, last_row; + JBLOCK workspace; + int *coef_bits; + JQUANT_TBL *quanttbl; + INT32 Q00,Q01,Q02,Q10,Q11,Q20, num; + int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9; + int Al, pred; + + /* Force some input to be done if we are getting ahead of the input. */ + while (cinfo->input_scan_number <= cinfo->output_scan_number && + ! cinfo->inputctl->eoi_reached) { + if (cinfo->input_scan_number == cinfo->output_scan_number) { + /* If input is working on current scan, we ordinarily want it to + * have completed the current row. But if input scan is DC, + * we want it to keep one row ahead so that next block row's DC + * values are up to date. + */ + JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; + if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta) + break; + } + if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) + return JPEG_SUSPENDED; + } + + /* OK, output from the virtual arrays. */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) + continue; + /* Count non-dummy DCT block rows in this iMCU row. */ + if (cinfo->output_iMCU_row < last_iMCU_row) { + block_rows = compptr->v_samp_factor; + access_rows = block_rows * 2; /* this and next iMCU row */ + last_row = FALSE; + } else { + /* NB: can't use last_row_height here; it is input-side-dependent! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + access_rows = block_rows; /* this iMCU row only */ + last_row = TRUE; + } + /* Align the virtual buffer for this component. */ + if (cinfo->output_iMCU_row > 0) { + access_rows += compptr->v_samp_factor; /* prior iMCU row too */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, + (JDIMENSION) access_rows, FALSE); + buffer += compptr->v_samp_factor; /* point to current iMCU row */ + first_row = FALSE; + } else { + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE); + first_row = TRUE; + } + /* Fetch component-dependent info */ + coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); + quanttbl = compptr->quant_table; + Q00 = quanttbl->quantval[0]; + Q01 = quanttbl->quantval[Q01_POS]; + Q10 = quanttbl->quantval[Q10_POS]; + Q20 = quanttbl->quantval[Q20_POS]; + Q11 = quanttbl->quantval[Q11_POS]; + Q02 = quanttbl->quantval[Q02_POS]; + inverse_DCT = cinfo->idct->inverse_DCT[ci]; + output_ptr = output_buf[ci]; + /* Loop over all DCT blocks to be processed. */ + for (block_row = 0; block_row < block_rows; block_row++) { + buffer_ptr = buffer[block_row]; + if (first_row && block_row == 0) + prev_block_row = buffer_ptr; + else + prev_block_row = buffer[block_row-1]; + if (last_row && block_row == block_rows-1) + next_block_row = buffer_ptr; + else + next_block_row = buffer[block_row+1]; + /* We fetch the surrounding DC values using a sliding-register approach. + * Initialize all nine here so as to do the right thing on narrow pics. + */ + DC1 = DC2 = DC3 = (int) prev_block_row[0][0]; + DC4 = DC5 = DC6 = (int) buffer_ptr[0][0]; + DC7 = DC8 = DC9 = (int) next_block_row[0][0]; + output_col = 0; + last_block_column = compptr->width_in_blocks - 1; + for (block_num = 0; block_num <= last_block_column; block_num++) { + /* Fetch current DCT block into workspace so we can modify it. */ + jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1); + /* Update DC values */ + if (block_num < last_block_column) { + DC3 = (int) prev_block_row[1][0]; + DC6 = (int) buffer_ptr[1][0]; + DC9 = (int) next_block_row[1][0]; + } + /* Compute coefficient estimates per K.8. + * An estimate is applied only if coefficient is still zero, + * and is not known to be fully accurate. + */ + /* AC01 */ + if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) { + num = 36 * Q00 * (DC4 - DC6); + if (num >= 0) { + pred = (int) (((Q01<<7) + num) / (Q01<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q10<<7) + num) / (Q10<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q20<<7) + num) / (Q20<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q11<<7) + num) / (Q11<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q02<<7) + num) / (Q02<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<DCT_h_scaled_size; + } + output_ptr += compptr->DCT_v_scaled_size; + } + } + + if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + return JPEG_ROW_COMPLETED; + return JPEG_SCAN_COMPLETED; +} + +#endif /* BLOCK_SMOOTHING_SUPPORTED */ + + +/* + * Initialize coefficient buffer controller. + */ + +GLOBAL(void) +jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_coef_ptr coef; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_d_coef_controller *) coef; + coef->pub.start_input_pass = start_input_pass; + coef->pub.start_output_pass = start_output_pass; +#ifdef BLOCK_SMOOTHING_SUPPORTED + coef->coef_bits_latch = NULL; +#endif + + /* Create the coefficient buffer. */ + if (need_full_buffer) { +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* Allocate a full-image virtual array for each component, */ + /* padded to a multiple of samp_factor DCT blocks in each direction. */ + /* Note we ask for a pre-zeroed array. */ + int ci, access_rows; + jpeg_component_info *compptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + access_rows = compptr->v_samp_factor; +#ifdef BLOCK_SMOOTHING_SUPPORTED + /* If block smoothing could be used, need a bigger window */ + if (cinfo->progressive_mode) + access_rows *= 3; +#endif + coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, + (JDIMENSION) jround_up((long) compptr->width_in_blocks, + (long) compptr->h_samp_factor), + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor), + (JDIMENSION) access_rows); + } + coef->pub.consume_data = consume_data; + coef->pub.decompress_data = decompress_data; + coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + /* We only need a single-MCU buffer. */ + JBLOCKROW buffer; + int i; + + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { + coef->MCU_buffer[i] = buffer + i; + } + coef->pub.consume_data = dummy_consume_data; + coef->pub.decompress_data = decompress_onepass; + coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ + } +} diff --git a/src/3rdparty/libjpeg/jdcolor.c b/src/3rdparty/libjpeg/jdcolor.c new file mode 100644 index 0000000000..6c04dfe8aa --- /dev/null +++ b/src/3rdparty/libjpeg/jdcolor.c @@ -0,0 +1,396 @@ +/* + * jdcolor.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains output colorspace conversion routines. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private subobject */ + +typedef struct { + struct jpeg_color_deconverter pub; /* public fields */ + + /* Private state for YCC->RGB conversion */ + int * Cr_r_tab; /* => table for Cr to R conversion */ + int * Cb_b_tab; /* => table for Cb to B conversion */ + INT32 * Cr_g_tab; /* => table for Cr to G conversion */ + INT32 * Cb_g_tab; /* => table for Cb to G conversion */ +} my_color_deconverter; + +typedef my_color_deconverter * my_cconvert_ptr; + + +/**************** YCbCr -> RGB conversion: most common case **************/ + +/* + * YCbCr is defined per CCIR 601-1, except that Cb and Cr are + * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. + * The conversion equations to be implemented are therefore + * R = Y + 1.40200 * Cr + * G = Y - 0.34414 * Cb - 0.71414 * Cr + * B = Y + 1.77200 * Cb + * where Cb and Cr represent the incoming values less CENTERJSAMPLE. + * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) + * + * To avoid floating-point arithmetic, we represent the fractional constants + * as integers scaled up by 2^16 (about 4 digits precision); we have to divide + * the products by 2^16, with appropriate rounding, to get the correct answer. + * Notice that Y, being an integral input, does not contribute any fraction + * so it need not participate in the rounding. + * + * For even more speed, we avoid doing any multiplications in the inner loop + * by precalculating the constants times Cb and Cr for all possible values. + * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); + * for 12-bit samples it is still acceptable. It's not very reasonable for + * 16-bit samples, but if you want lossless storage you shouldn't be changing + * colorspace anyway. + * The Cr=>R and Cb=>B values can be rounded to integers in advance; the + * values for the G calculation are left scaled up, since we must add them + * together before rounding. + */ + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. + */ + +LOCAL(void) +build_ycc_rgb_table (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + int i; + INT32 x; + SHIFT_TEMPS + + cconvert->Cr_r_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + cconvert->Cb_b_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + cconvert->Cr_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + cconvert->Cb_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + + for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { + /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ + /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ + /* Cr=>R value is nearest int to 1.40200 * x */ + cconvert->Cr_r_tab[i] = (int) + RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); + /* Cb=>B value is nearest int to 1.77200 * x */ + cconvert->Cb_b_tab[i] = (int) + RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); + /* Cr=>G value is scaled-up -0.71414 * x */ + cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x; + /* Cb=>G value is scaled-up -0.34414 * x */ + /* We also add in ONE_HALF so that need not do it in inner loop */ + cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; + } +} + + +/* + * Convert some rows of samples to the output colorspace. + * + * Note that we change from noninterleaved, one-plane-per-component format + * to interleaved-pixel format. The output buffer is therefore three times + * as wide as the input buffer. + * A starting row offset is provided only for the input buffer. The caller + * can easily adjust the passed output_buf value to accommodate any row + * offset required on that side. + */ + +METHODDEF(void) +ycc_rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int y, cb, cr; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + register int * Crrtab = cconvert->Cr_r_tab; + register int * Cbbtab = cconvert->Cb_b_tab; + register INT32 * Crgtab = cconvert->Cr_g_tab; + register INT32 * Cbgtab = cconvert->Cb_g_tab; + SHIFT_TEMPS + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + y = GETJSAMPLE(inptr0[col]); + cb = GETJSAMPLE(inptr1[col]); + cr = GETJSAMPLE(inptr2[col]); + /* Range-limiting is essential due to noise introduced by DCT losses. */ + outptr[RGB_RED] = range_limit[y + Crrtab[cr]]; + outptr[RGB_GREEN] = range_limit[y + + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], + SCALEBITS))]; + outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]]; + outptr += RGB_PIXELSIZE; + } + } +} + + +/**************** Cases other than YCbCr -> RGB **************/ + + +/* + * Color conversion for no colorspace change: just copy the data, + * converting from separate-planes to interleaved representation. + */ + +METHODDEF(void) +null_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW inptr, outptr; + register JDIMENSION count; + register int num_components = cinfo->num_components; + JDIMENSION num_cols = cinfo->output_width; + int ci; + + while (--num_rows >= 0) { + for (ci = 0; ci < num_components; ci++) { + inptr = input_buf[ci][input_row]; + outptr = output_buf[0] + ci; + for (count = num_cols; count > 0; count--) { + *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */ + outptr += num_components; + } + } + input_row++; + output_buf++; + } +} + + +/* + * Color conversion for grayscale: just copy the data. + * This also works for YCbCr -> grayscale conversion, in which + * we just copy the Y (luminance) component and ignore chrominance. + */ + +METHODDEF(void) +grayscale_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0, + num_rows, cinfo->output_width); +} + + +/* + * Convert grayscale to RGB: just duplicate the graylevel three times. + * This is provided to support applications that don't want to cope + * with grayscale as a separate case. + */ + +METHODDEF(void) +gray_rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW inptr, outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + + while (--num_rows >= 0) { + inptr = input_buf[0][input_row++]; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + /* We can dispense with GETJSAMPLE() here */ + outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col]; + outptr += RGB_PIXELSIZE; + } + } +} + + +/* + * Adobe-style YCCK->CMYK conversion. + * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same + * conversion as above, while passing K (black) unchanged. + * We assume build_ycc_rgb_table has been called. + */ + +METHODDEF(void) +ycck_cmyk_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int y, cb, cr; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2, inptr3; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + register int * Crrtab = cconvert->Cr_r_tab; + register int * Cbbtab = cconvert->Cb_b_tab; + register INT32 * Crgtab = cconvert->Cr_g_tab; + register INT32 * Cbgtab = cconvert->Cb_g_tab; + SHIFT_TEMPS + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + inptr3 = input_buf[3][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + y = GETJSAMPLE(inptr0[col]); + cb = GETJSAMPLE(inptr1[col]); + cr = GETJSAMPLE(inptr2[col]); + /* Range-limiting is essential due to noise introduced by DCT losses. */ + outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */ + outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */ + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], + SCALEBITS)))]; + outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */ + /* K passes through unchanged */ + outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */ + outptr += 4; + } + } +} + + +/* + * Empty method for start_pass. + */ + +METHODDEF(void) +start_pass_dcolor (j_decompress_ptr cinfo) +{ + /* no work needed */ +} + + +/* + * Module initialization routine for output colorspace conversion. + */ + +GLOBAL(void) +jinit_color_deconverter (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert; + int ci; + + cconvert = (my_cconvert_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_color_deconverter)); + cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert; + cconvert->pub.start_pass = start_pass_dcolor; + + /* Make sure num_components agrees with jpeg_color_space */ + switch (cinfo->jpeg_color_space) { + case JCS_GRAYSCALE: + if (cinfo->num_components != 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + case JCS_RGB: + case JCS_YCbCr: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + case JCS_CMYK: + case JCS_YCCK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + default: /* JCS_UNKNOWN can be anything */ + if (cinfo->num_components < 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + } + + /* Set out_color_components and conversion method based on requested space. + * Also clear the component_needed flags for any unused components, + * so that earlier pipeline stages can avoid useless computation. + */ + + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + cinfo->out_color_components = 1; + if (cinfo->jpeg_color_space == JCS_GRAYSCALE || + cinfo->jpeg_color_space == JCS_YCbCr) { + cconvert->pub.color_convert = grayscale_convert; + /* For color->grayscale conversion, only the Y (0) component is needed */ + for (ci = 1; ci < cinfo->num_components; ci++) + cinfo->comp_info[ci].component_needed = FALSE; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_RGB: + cinfo->out_color_components = RGB_PIXELSIZE; + if (cinfo->jpeg_color_space == JCS_YCbCr) { + cconvert->pub.color_convert = ycc_rgb_convert; + build_ycc_rgb_table(cinfo); + } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { + cconvert->pub.color_convert = gray_rgb_convert; + } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) { + cconvert->pub.color_convert = null_convert; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_CMYK: + cinfo->out_color_components = 4; + if (cinfo->jpeg_color_space == JCS_YCCK) { + cconvert->pub.color_convert = ycck_cmyk_convert; + build_ycc_rgb_table(cinfo); + } else if (cinfo->jpeg_color_space == JCS_CMYK) { + cconvert->pub.color_convert = null_convert; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + default: + /* Permit null conversion to same output space */ + if (cinfo->out_color_space == cinfo->jpeg_color_space) { + cinfo->out_color_components = cinfo->num_components; + cconvert->pub.color_convert = null_convert; + } else /* unsupported non-null conversion */ + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + } + + if (cinfo->quantize_colors) + cinfo->output_components = 1; /* single colormapped output component */ + else + cinfo->output_components = cinfo->out_color_components; +} diff --git a/src/3rdparty/libjpeg/jdct.h b/src/3rdparty/libjpeg/jdct.h new file mode 100644 index 0000000000..360dec80c9 --- /dev/null +++ b/src/3rdparty/libjpeg/jdct.h @@ -0,0 +1,393 @@ +/* + * jdct.h + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file contains common declarations for the forward and + * inverse DCT modules. These declarations are private to the DCT managers + * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms. + * The individual DCT algorithms are kept in separate files to ease + * machine-dependent tuning (e.g., assembly coding). + */ + + +/* + * A forward DCT routine is given a pointer to an input sample array and + * a pointer to a work area of type DCTELEM[]; the DCT is to be performed + * in-place in that buffer. Type DCTELEM is int for 8-bit samples, INT32 + * for 12-bit samples. (NOTE: Floating-point DCT implementations use an + * array of type FAST_FLOAT, instead.) + * The input data is to be fetched from the sample array starting at a + * specified column. (Any row offset needed will be applied to the array + * pointer before it is passed to the FDCT code.) + * Note that the number of samples fetched by the FDCT routine is + * DCT_h_scaled_size * DCT_v_scaled_size. + * The DCT outputs are returned scaled up by a factor of 8; they therefore + * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This + * convention improves accuracy in integer implementations and saves some + * work in floating-point ones. + * Quantization of the output coefficients is done by jcdctmgr.c. + */ + +#if BITS_IN_JSAMPLE == 8 +typedef int DCTELEM; /* 16 or 32 bits is fine */ +#else +typedef INT32 DCTELEM; /* must have 32 bits */ +#endif + +typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data, + JSAMPARRAY sample_data, + JDIMENSION start_col)); +typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data, + JSAMPARRAY sample_data, + JDIMENSION start_col)); + + +/* + * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer + * to an output sample array. The routine must dequantize the input data as + * well as perform the IDCT; for dequantization, it uses the multiplier table + * pointed to by compptr->dct_table. The output data is to be placed into the + * sample array starting at a specified column. (Any row offset needed will + * be applied to the array pointer before it is passed to the IDCT code.) + * Note that the number of samples emitted by the IDCT routine is + * DCT_h_scaled_size * DCT_v_scaled_size. + */ + +/* typedef inverse_DCT_method_ptr is declared in jpegint.h */ + +/* + * Each IDCT routine has its own ideas about the best dct_table element type. + */ + +typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */ +#if BITS_IN_JSAMPLE == 8 +typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */ +#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */ +#else +typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */ +#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */ +#endif +typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ + + +/* + * Each IDCT routine is responsible for range-limiting its results and + * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could + * be quite far out of range if the input data is corrupt, so a bulletproof + * range-limiting step is required. We use a mask-and-table-lookup method + * to do the combined operations quickly. See the comments with + * prepare_range_limit_table (in jdmaster.c) for more info. + */ + +#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE) + +#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */ + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_fdct_islow jFDislow +#define jpeg_fdct_ifast jFDifast +#define jpeg_fdct_float jFDfloat +#define jpeg_fdct_7x7 jFD7x7 +#define jpeg_fdct_6x6 jFD6x6 +#define jpeg_fdct_5x5 jFD5x5 +#define jpeg_fdct_4x4 jFD4x4 +#define jpeg_fdct_3x3 jFD3x3 +#define jpeg_fdct_2x2 jFD2x2 +#define jpeg_fdct_1x1 jFD1x1 +#define jpeg_fdct_9x9 jFD9x9 +#define jpeg_fdct_10x10 jFD10x10 +#define jpeg_fdct_11x11 jFD11x11 +#define jpeg_fdct_12x12 jFD12x12 +#define jpeg_fdct_13x13 jFD13x13 +#define jpeg_fdct_14x14 jFD14x14 +#define jpeg_fdct_15x15 jFD15x15 +#define jpeg_fdct_16x16 jFD16x16 +#define jpeg_fdct_16x8 jFD16x8 +#define jpeg_fdct_14x7 jFD14x7 +#define jpeg_fdct_12x6 jFD12x6 +#define jpeg_fdct_10x5 jFD10x5 +#define jpeg_fdct_8x4 jFD8x4 +#define jpeg_fdct_6x3 jFD6x3 +#define jpeg_fdct_4x2 jFD4x2 +#define jpeg_fdct_2x1 jFD2x1 +#define jpeg_fdct_8x16 jFD8x16 +#define jpeg_fdct_7x14 jFD7x14 +#define jpeg_fdct_6x12 jFD6x12 +#define jpeg_fdct_5x10 jFD5x10 +#define jpeg_fdct_4x8 jFD4x8 +#define jpeg_fdct_3x6 jFD3x6 +#define jpeg_fdct_2x4 jFD2x4 +#define jpeg_fdct_1x2 jFD1x2 +#define jpeg_idct_islow jRDislow +#define jpeg_idct_ifast jRDifast +#define jpeg_idct_float jRDfloat +#define jpeg_idct_7x7 jRD7x7 +#define jpeg_idct_6x6 jRD6x6 +#define jpeg_idct_5x5 jRD5x5 +#define jpeg_idct_4x4 jRD4x4 +#define jpeg_idct_3x3 jRD3x3 +#define jpeg_idct_2x2 jRD2x2 +#define jpeg_idct_1x1 jRD1x1 +#define jpeg_idct_9x9 jRD9x9 +#define jpeg_idct_10x10 jRD10x10 +#define jpeg_idct_11x11 jRD11x11 +#define jpeg_idct_12x12 jRD12x12 +#define jpeg_idct_13x13 jRD13x13 +#define jpeg_idct_14x14 jRD14x14 +#define jpeg_idct_15x15 jRD15x15 +#define jpeg_idct_16x16 jRD16x16 +#define jpeg_idct_16x8 jRD16x8 +#define jpeg_idct_14x7 jRD14x7 +#define jpeg_idct_12x6 jRD12x6 +#define jpeg_idct_10x5 jRD10x5 +#define jpeg_idct_8x4 jRD8x4 +#define jpeg_idct_6x3 jRD6x3 +#define jpeg_idct_4x2 jRD4x2 +#define jpeg_idct_2x1 jRD2x1 +#define jpeg_idct_8x16 jRD8x16 +#define jpeg_idct_7x14 jRD7x14 +#define jpeg_idct_6x12 jRD6x12 +#define jpeg_idct_5x10 jRD5x10 +#define jpeg_idct_4x8 jRD4x8 +#define jpeg_idct_3x6 jRD3x8 +#define jpeg_idct_2x4 jRD2x4 +#define jpeg_idct_1x2 jRD1x2 +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + +/* Extern declarations for the forward and inverse DCT routines. */ + +EXTERN(void) jpeg_fdct_islow + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_ifast + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_float + JPP((FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_7x7 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_5x5 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_3x3 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_1x1 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_9x9 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_10x10 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_11x11 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_12x12 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_13x13 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_14x14 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_15x15 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_16x16 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_16x8 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_14x7 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_12x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_10x5 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_8x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x3 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x1 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_8x16 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_7x14 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x12 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_5x10 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x8 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_3x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_1x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); + +EXTERN(void) jpeg_idct_islow + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_ifast + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_float + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_7x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x5 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_3x3 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_1x1 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_9x9 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_11x11 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_13x13 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_15x15 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x8 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x5 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_8x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x3 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x1 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_8x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_7x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x8 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_3x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_1x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); + + +/* + * Macros for handling fixed-point arithmetic; these are used by many + * but not all of the DCT/IDCT modules. + * + * All values are expected to be of type INT32. + * Fractional constants are scaled left by CONST_BITS bits. + * CONST_BITS is defined within each module using these macros, + * and may differ from one module to the next. + */ + +#define ONE ((INT32) 1) +#define CONST_SCALE (ONE << CONST_BITS) + +/* Convert a positive real constant to an integer scaled by CONST_SCALE. + * Caution: some C compilers fail to reduce "FIX(constant)" at compile time, + * thus causing a lot of useless floating-point operations at run time. + */ + +#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) + +/* Descale and correctly round an INT32 value that's scaled by N bits. + * We assume RIGHT_SHIFT rounds towards minus infinity, so adding + * the fudge factor is correct for either sign of X. + */ + +#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * This macro is used only when the two inputs will actually be no more than + * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a + * full 32x32 multiply. This provides a useful speedup on many machines. + * Unfortunately there is no way to specify a 16x16->32 multiply portably + * in C, but some C compilers will do the right thing if you provide the + * correct combination of casts. + */ + +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const))) +#endif +#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ +#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const))) +#endif + +#ifndef MULTIPLY16C16 /* default definition */ +#define MULTIPLY16C16(var,const) ((var) * (const)) +#endif + +/* Same except both inputs are variables. */ + +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2))) +#endif + +#ifndef MULTIPLY16V16 /* default definition */ +#define MULTIPLY16V16(var1,var2) ((var1) * (var2)) +#endif diff --git a/src/3rdparty/libjpeg/jddctmgr.c b/src/3rdparty/libjpeg/jddctmgr.c new file mode 100644 index 0000000000..0ded9d5741 --- /dev/null +++ b/src/3rdparty/libjpeg/jddctmgr.c @@ -0,0 +1,384 @@ +/* + * jddctmgr.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2002-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the inverse-DCT management logic. + * This code selects a particular IDCT implementation to be used, + * and it performs related housekeeping chores. No code in this file + * is executed per IDCT step, only during output pass setup. + * + * Note that the IDCT routines are responsible for performing coefficient + * dequantization as well as the IDCT proper. This module sets up the + * dequantization multiplier table needed by the IDCT routine. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + + +/* + * The decompressor input side (jdinput.c) saves away the appropriate + * quantization table for each component at the start of the first scan + * involving that component. (This is necessary in order to correctly + * decode files that reuse Q-table slots.) + * When we are ready to make an output pass, the saved Q-table is converted + * to a multiplier table that will actually be used by the IDCT routine. + * The multiplier table contents are IDCT-method-dependent. To support + * application changes in IDCT method between scans, we can remake the + * multiplier tables if necessary. + * In buffered-image mode, the first output pass may occur before any data + * has been seen for some components, and thus before their Q-tables have + * been saved away. To handle this case, multiplier tables are preset + * to zeroes; the result of the IDCT will be a neutral gray level. + */ + + +/* Private subobject for this module */ + +typedef struct { + struct jpeg_inverse_dct pub; /* public fields */ + + /* This array contains the IDCT method code that each multiplier table + * is currently set up for, or -1 if it's not yet set up. + * The actual multiplier tables are pointed to by dct_table in the + * per-component comp_info structures. + */ + int cur_method[MAX_COMPONENTS]; +} my_idct_controller; + +typedef my_idct_controller * my_idct_ptr; + + +/* Allocated multiplier tables: big enough for any supported variant */ + +typedef union { + ISLOW_MULT_TYPE islow_array[DCTSIZE2]; +#ifdef DCT_IFAST_SUPPORTED + IFAST_MULT_TYPE ifast_array[DCTSIZE2]; +#endif +#ifdef DCT_FLOAT_SUPPORTED + FLOAT_MULT_TYPE float_array[DCTSIZE2]; +#endif +} multiplier_table; + + +/* The current scaled-IDCT routines require ISLOW-style multiplier tables, + * so be sure to compile that code if either ISLOW or SCALING is requested. + */ +#ifdef DCT_ISLOW_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#else +#ifdef IDCT_SCALING_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#endif +#endif + + +/* + * Prepare for an output pass. + * Here we select the proper IDCT routine for each component and build + * a matching multiplier table. + */ + +METHODDEF(void) +start_pass (j_decompress_ptr cinfo) +{ + my_idct_ptr idct = (my_idct_ptr) cinfo->idct; + int ci, i; + jpeg_component_info *compptr; + int method = 0; + inverse_DCT_method_ptr method_ptr = NULL; + JQUANT_TBL * qtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Select the proper IDCT routine for this component's scaling */ + switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) { +#ifdef IDCT_SCALING_SUPPORTED + case ((1 << 8) + 1): + method_ptr = jpeg_idct_1x1; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 2): + method_ptr = jpeg_idct_2x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((3 << 8) + 3): + method_ptr = jpeg_idct_3x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 4): + method_ptr = jpeg_idct_4x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((5 << 8) + 5): + method_ptr = jpeg_idct_5x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 6): + method_ptr = jpeg_idct_6x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((7 << 8) + 7): + method_ptr = jpeg_idct_7x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((9 << 8) + 9): + method_ptr = jpeg_idct_9x9; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((10 << 8) + 10): + method_ptr = jpeg_idct_10x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((11 << 8) + 11): + method_ptr = jpeg_idct_11x11; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((12 << 8) + 12): + method_ptr = jpeg_idct_12x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((13 << 8) + 13): + method_ptr = jpeg_idct_13x13; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((14 << 8) + 14): + method_ptr = jpeg_idct_14x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((15 << 8) + 15): + method_ptr = jpeg_idct_15x15; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((16 << 8) + 16): + method_ptr = jpeg_idct_16x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((16 << 8) + 8): + method_ptr = jpeg_idct_16x8; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((14 << 8) + 7): + method_ptr = jpeg_idct_14x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((12 << 8) + 6): + method_ptr = jpeg_idct_12x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((10 << 8) + 5): + method_ptr = jpeg_idct_10x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((8 << 8) + 4): + method_ptr = jpeg_idct_8x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 3): + method_ptr = jpeg_idct_6x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 2): + method_ptr = jpeg_idct_4x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 1): + method_ptr = jpeg_idct_2x1; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((8 << 8) + 16): + method_ptr = jpeg_idct_8x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((7 << 8) + 14): + method_ptr = jpeg_idct_7x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 12): + method_ptr = jpeg_idct_6x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((5 << 8) + 10): + method_ptr = jpeg_idct_5x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 8): + method_ptr = jpeg_idct_4x8; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((3 << 8) + 6): + method_ptr = jpeg_idct_3x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 4): + method_ptr = jpeg_idct_2x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((1 << 8) + 2): + method_ptr = jpeg_idct_1x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; +#endif + case ((DCTSIZE << 8) + DCTSIZE): + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + method_ptr = jpeg_idct_islow; + method = JDCT_ISLOW; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + method_ptr = jpeg_idct_ifast; + method = JDCT_IFAST; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + method_ptr = jpeg_idct_float; + method = JDCT_FLOAT; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + break; + default: + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size); + break; + } + idct->pub.inverse_DCT[ci] = method_ptr; + /* Create multiplier table from quant table. + * However, we can skip this if the component is uninteresting + * or if we already built the table. Also, if no quant table + * has yet been saved for the component, we leave the + * multiplier table all-zero; we'll be reading zeroes from the + * coefficient controller's buffer anyway. + */ + if (! compptr->component_needed || idct->cur_method[ci] == method) + continue; + qtbl = compptr->quant_table; + if (qtbl == NULL) /* happens if no data yet for component */ + continue; + idct->cur_method[ci] = method; + switch (method) { +#ifdef PROVIDE_ISLOW_TABLES + case JDCT_ISLOW: + { + /* For LL&M IDCT method, multipliers are equal to raw quantization + * coefficients, but are stored as ints to ensure access efficiency. + */ + ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table; + for (i = 0; i < DCTSIZE2; i++) { + ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i]; + } + } + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + { + /* For AA&N IDCT method, multipliers are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * For integer operation, the multiplier table is to be scaled by + * IFAST_SCALE_BITS. + */ + IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table; +#define CONST_BITS 14 + static const INT16 aanscales[DCTSIZE2] = { + /* precomputed values scaled up by 14 bits */ + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, + 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, + 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, + 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, + 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 + }; + SHIFT_TEMPS + + for (i = 0; i < DCTSIZE2; i++) { + ifmtbl[i] = (IFAST_MULT_TYPE) + DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], + (INT32) aanscales[i]), + CONST_BITS-IFAST_SCALE_BITS); + } + } + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + { + /* For float AA&N IDCT method, multipliers are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 1/8. + */ + FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; + int row, col; + static const double aanscalefactor[DCTSIZE] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + }; + + i = 0; + for (row = 0; row < DCTSIZE; row++) { + for (col = 0; col < DCTSIZE; col++) { + fmtbl[i] = (FLOAT_MULT_TYPE) + ((double) qtbl->quantval[i] * + aanscalefactor[row] * aanscalefactor[col] * 0.125); + i++; + } + } + } + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + +/* + * Initialize IDCT manager. + */ + +GLOBAL(void) +jinit_inverse_dct (j_decompress_ptr cinfo) +{ + my_idct_ptr idct; + int ci; + jpeg_component_info *compptr; + + idct = (my_idct_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_idct_controller)); + cinfo->idct = (struct jpeg_inverse_dct *) idct; + idct->pub.start_pass = start_pass; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Allocate and pre-zero a multiplier table for each component */ + compptr->dct_table = + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(multiplier_table)); + MEMZERO(compptr->dct_table, SIZEOF(multiplier_table)); + /* Mark multiplier table not yet set up for any method */ + idct->cur_method[ci] = -1; + } +} diff --git a/src/3rdparty/libjpeg/jdhuff.c b/src/3rdparty/libjpeg/jdhuff.c new file mode 100644 index 0000000000..06f92fe47f --- /dev/null +++ b/src/3rdparty/libjpeg/jdhuff.c @@ -0,0 +1,1541 @@ +/* + * jdhuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2006-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy decoding routines. + * Both sequential and progressive modes are supported in this single module. + * + * Much of the complexity here has to do with supporting input suspension. + * If the data source module demands suspension, we want to be able to back + * up to the start of the current MCU. To do this, we copy state variables + * into local working storage, and update them back to the permanent + * storage only upon successful completion of an MCU. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Derived data constructed for each Huffman table */ + +#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ + +typedef struct { + /* Basic tables: (element [0] of each array is unused) */ + INT32 maxcode[18]; /* largest code of length k (-1 if none) */ + /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ + INT32 valoffset[17]; /* huffval[] offset for codes of length k */ + /* valoffset[k] = huffval[] index of 1st symbol of code length k, less + * the smallest code of length k; so given a code of length k, the + * corresponding symbol is huffval[code + valoffset[k]] + */ + + /* Link to public Huffman table (needed only in jpeg_huff_decode) */ + JHUFF_TBL *pub; + + /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of + * the input data stream. If the next Huffman code is no more + * than HUFF_LOOKAHEAD bits long, we can obtain its length and + * the corresponding symbol directly from these tables. + */ + int look_nbits[1< 32 bits on your machine, and shifting/masking longs is + * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE + * appropriately should be a win. Unfortunately we can't define the size + * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) + * because not all machines measure sizeof in 8-bit bytes. + */ + +typedef struct { /* Bitreading state saved across MCUs */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ +} bitread_perm_state; + +typedef struct { /* Bitreading working state within an MCU */ + /* Current data source location */ + /* We need a copy, rather than munging the original, in case of suspension */ + const JOCTET * next_input_byte; /* => next byte to read from source */ + size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ + /* Bit input buffer --- note these values are kept in register variables, + * not in this struct, inside the inner loops. + */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ + /* Pointer needed by jpeg_fill_bit_buffer. */ + j_decompress_ptr cinfo; /* back link to decompress master record */ +} bitread_working_state; + +/* Macros to declare and load/save bitread local variables. */ +#define BITREAD_STATE_VARS \ + register bit_buf_type get_buffer; \ + register int bits_left; \ + bitread_working_state br_state + +#define BITREAD_LOAD_STATE(cinfop,permstate) \ + br_state.cinfo = cinfop; \ + br_state.next_input_byte = cinfop->src->next_input_byte; \ + br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ + get_buffer = permstate.get_buffer; \ + bits_left = permstate.bits_left; + +#define BITREAD_SAVE_STATE(cinfop,permstate) \ + cinfop->src->next_input_byte = br_state.next_input_byte; \ + cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ + permstate.get_buffer = get_buffer; \ + permstate.bits_left = bits_left + +/* + * These macros provide the in-line portion of bit fetching. + * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer + * before using GET_BITS, PEEK_BITS, or DROP_BITS. + * The variables get_buffer and bits_left are assumed to be locals, + * but the state struct might not be (jpeg_huff_decode needs this). + * CHECK_BIT_BUFFER(state,n,action); + * Ensure there are N bits in get_buffer; if suspend, take action. + * val = GET_BITS(n); + * Fetch next N bits. + * val = PEEK_BITS(n); + * Fetch next N bits without removing them from the buffer. + * DROP_BITS(n); + * Discard next N bits. + * The value N should be a simple variable, not an expression, because it + * is evaluated multiple times. + */ + +#define CHECK_BIT_BUFFER(state,nbits,action) \ + { if (bits_left < (nbits)) { \ + if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ + { action; } \ + get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } + +#define GET_BITS(nbits) \ + (((int) (get_buffer >> (bits_left -= (nbits)))) & BIT_MASK(nbits)) + +#define PEEK_BITS(nbits) \ + (((int) (get_buffer >> (bits_left - (nbits)))) & BIT_MASK(nbits)) + +#define DROP_BITS(nbits) \ + (bits_left -= (nbits)) + + +/* + * Code for extracting next Huffman-coded symbol from input bit stream. + * Again, this is time-critical and we make the main paths be macros. + * + * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits + * without looping. Usually, more than 95% of the Huffman codes will be 8 + * or fewer bits long. The few overlength codes are handled with a loop, + * which need not be inline code. + * + * Notes about the HUFF_DECODE macro: + * 1. Near the end of the data segment, we may fail to get enough bits + * for a lookahead. In that case, we do it the hard way. + * 2. If the lookahead table contains no entry, the next code must be + * more than HUFF_LOOKAHEAD bits long. + * 3. jpeg_huff_decode returns -1 if forced to suspend. + */ + +#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ +{ register int nb, look; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + nb = 1; goto slowlabel; \ + } \ + } \ + look = PEEK_BITS(HUFF_LOOKAHEAD); \ + if ((nb = htbl->look_nbits[look]) != 0) { \ + DROP_BITS(nb); \ + result = htbl->look_sym[look]; \ + } else { \ + nb = HUFF_LOOKAHEAD+1; \ +slowlabel: \ + if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ + { failaction; } \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + } \ +} + + +/* + * Expanded entropy decoder object for Huffman decoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).EOBRUN = (src).EOBRUN, \ + (dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + /* These fields are loaded into local variables at start of each MCU. + * In case of suspension, we exit WITHOUT updating them. + */ + bitread_perm_state bitstate; /* Bit buffer at start of MCU */ + savable_state saved; /* Other state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + boolean insufficient_data; /* set TRUE after emitting warning */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Following two fields used only in progressive mode */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; + + d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ + + /* Following fields used only in sequential mode */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; + d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; + + /* Precalculated info set up by start_pass for use in decode_mcu: */ + + /* Pointers to derived tables to be used for each block within an MCU */ + d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU]; + d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU]; + /* Whether we care about the DC and AC coefficient values for each block */ + int coef_limit[D_MAX_BLOCKS_IN_MCU]; +} huff_entropy_decoder; + +typedef huff_entropy_decoder * huff_entropy_ptr; + + +static const int jpeg_zigzag_order[8][8] = { + { 0, 1, 5, 6, 14, 15, 27, 28 }, + { 2, 4, 7, 13, 16, 26, 29, 42 }, + { 3, 8, 12, 17, 25, 30, 41, 43 }, + { 9, 11, 18, 24, 31, 40, 44, 53 }, + { 10, 19, 23, 32, 39, 45, 52, 54 }, + { 20, 22, 33, 38, 46, 51, 55, 60 }, + { 21, 34, 37, 47, 50, 56, 59, 61 }, + { 35, 36, 48, 49, 57, 58, 62, 63 } +}; + +static const int jpeg_zigzag_order7[7][7] = { + { 0, 1, 5, 6, 14, 15, 27 }, + { 2, 4, 7, 13, 16, 26, 28 }, + { 3, 8, 12, 17, 25, 29, 38 }, + { 9, 11, 18, 24, 30, 37, 39 }, + { 10, 19, 23, 31, 36, 40, 45 }, + { 20, 22, 32, 35, 41, 44, 46 }, + { 21, 33, 34, 42, 43, 47, 48 } +}; + +static const int jpeg_zigzag_order6[6][6] = { + { 0, 1, 5, 6, 14, 15 }, + { 2, 4, 7, 13, 16, 25 }, + { 3, 8, 12, 17, 24, 26 }, + { 9, 11, 18, 23, 27, 32 }, + { 10, 19, 22, 28, 31, 33 }, + { 20, 21, 29, 30, 34, 35 } +}; + +static const int jpeg_zigzag_order5[5][5] = { + { 0, 1, 5, 6, 14 }, + { 2, 4, 7, 13, 15 }, + { 3, 8, 12, 16, 21 }, + { 9, 11, 17, 20, 22 }, + { 10, 18, 19, 23, 24 } +}; + +static const int jpeg_zigzag_order4[4][4] = { + { 0, 1, 5, 6 }, + { 2, 4, 7, 12 }, + { 3, 8, 11, 13 }, + { 9, 10, 14, 15 } +}; + +static const int jpeg_zigzag_order3[3][3] = { + { 0, 1, 5 }, + { 2, 4, 6 }, + { 3, 7, 8 } +}; + +static const int jpeg_zigzag_order2[2][2] = { + { 0, 1 }, + { 2, 3 } +}; + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + */ + +LOCAL(void) +jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, + d_derived_tbl ** pdtbl) +{ + JHUFF_TBL *htbl; + d_derived_tbl *dtbl; + int p, i, l, si, numsymbols; + int lookbits, ctr; + char huffsize[257]; + unsigned int huffcode[257]; + unsigned int code; + + /* Note that huffsize[] and huffcode[] are filled in code-length order, + * paralleling the order of the symbols themselves in htbl->huffval[]. + */ + + /* Find the input Huffman table */ + if (tblno < 0 || tblno >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + htbl = + isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + + /* Allocate a workspace if we haven't already done so. */ + if (*pdtbl == NULL) + *pdtbl = (d_derived_tbl *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(d_derived_tbl)); + dtbl = *pdtbl; + dtbl->pub = htbl; /* fill in back link */ + + /* Figure C.1: make table of Huffman code length for each symbol */ + + p = 0; + for (l = 1; l <= 16; l++) { + i = (int) htbl->bits[l]; + if (i < 0 || p + i > 256) /* protect against table overrun */ + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + while (i--) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + numsymbols = p; + + /* Figure C.2: generate the codes themselves */ + /* We also validate that the counts represent a legal Huffman code tree. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + /* code is now 1 more than the last code used for codelength si; but + * it must still fit in si bits, since no code is allowed to be all ones. + */ + if (((INT32) code) >= (((INT32) 1) << si)) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + code <<= 1; + si++; + } + + /* Figure F.15: generate decoding tables for bit-sequential decoding */ + + p = 0; + for (l = 1; l <= 16; l++) { + if (htbl->bits[l]) { + /* valoffset[l] = huffval[] index of 1st symbol of code length l, + * minus the minimum code of length l + */ + dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p]; + p += htbl->bits[l]; + dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */ + } else { + dtbl->maxcode[l] = -1; /* -1 if no codes of this length */ + } + } + dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */ + + /* Compute lookahead tables to speed up decoding. + * First we set all the table entries to 0, indicating "too long"; + * then we iterate through the Huffman codes that are short enough and + * fill in all the entries that correspond to bit sequences starting + * with that code. + */ + + MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits)); + + p = 0; + for (l = 1; l <= HUFF_LOOKAHEAD; l++) { + for (i = 1; i <= (int) htbl->bits[l]; i++, p++) { + /* l = current code's length, p = its index in huffcode[] & huffval[]. */ + /* Generate left-justified code followed by all possible bit sequences */ + lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l); + for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) { + dtbl->look_nbits[lookbits] = l; + dtbl->look_sym[lookbits] = htbl->huffval[p]; + lookbits++; + } + } + } + + /* Validate symbols as being reasonable. + * For AC tables, we make no check, but accept all byte values 0..255. + * For DC tables, we require the symbols to be in range 0..15. + * (Tighter bounds could be applied depending on the data depth and mode, + * but this is sufficient to ensure safe decoding.) + */ + if (isDC) { + for (i = 0; i < numsymbols; i++) { + int sym = htbl->huffval[i]; + if (sym < 0 || sym > 15) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + } + } +} + + +/* + * Out-of-line code for bit fetching. + * Note: current values of get_buffer and bits_left are passed as parameters, + * but are returned in the corresponding fields of the state struct. + * + * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width + * of get_buffer to be used. (On machines with wider words, an even larger + * buffer could be used.) However, on some machines 32-bit shifts are + * quite slow and take time proportional to the number of places shifted. + * (This is true with most PC compilers, for instance.) In this case it may + * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the + * average shift distance at the cost of more calls to jpeg_fill_bit_buffer. + */ + +#ifdef SLOW_SHIFT_32 +#define MIN_GET_BITS 15 /* minimum allowable value */ +#else +#define MIN_GET_BITS (BIT_BUF_SIZE-7) +#endif + + +LOCAL(boolean) +jpeg_fill_bit_buffer (bitread_working_state * state, + register bit_buf_type get_buffer, register int bits_left, + int nbits) +/* Load up the bit buffer to a depth of at least nbits */ +{ + /* Copy heavily used state fields into locals (hopefully registers) */ + register const JOCTET * next_input_byte = state->next_input_byte; + register size_t bytes_in_buffer = state->bytes_in_buffer; + j_decompress_ptr cinfo = state->cinfo; + + /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */ + /* (It is assumed that no request will be for more than that many bits.) */ + /* We fail to do so only if we hit a marker or are forced to suspend. */ + + if (cinfo->unread_marker == 0) { /* cannot advance past a marker */ + while (bits_left < MIN_GET_BITS) { + register int c; + + /* Attempt to read a byte */ + if (bytes_in_buffer == 0) { + if (! (*cinfo->src->fill_input_buffer) (cinfo)) + return FALSE; + next_input_byte = cinfo->src->next_input_byte; + bytes_in_buffer = cinfo->src->bytes_in_buffer; + } + bytes_in_buffer--; + c = GETJOCTET(*next_input_byte++); + + /* If it's 0xFF, check and discard stuffed zero byte */ + if (c == 0xFF) { + /* Loop here to discard any padding FF's on terminating marker, + * so that we can save a valid unread_marker value. NOTE: we will + * accept multiple FF's followed by a 0 as meaning a single FF data + * byte. This data pattern is not valid according to the standard. + */ + do { + if (bytes_in_buffer == 0) { + if (! (*cinfo->src->fill_input_buffer) (cinfo)) + return FALSE; + next_input_byte = cinfo->src->next_input_byte; + bytes_in_buffer = cinfo->src->bytes_in_buffer; + } + bytes_in_buffer--; + c = GETJOCTET(*next_input_byte++); + } while (c == 0xFF); + + if (c == 0) { + /* Found FF/00, which represents an FF data byte */ + c = 0xFF; + } else { + /* Oops, it's actually a marker indicating end of compressed data. + * Save the marker code for later use. + * Fine point: it might appear that we should save the marker into + * bitread working state, not straight into permanent state. But + * once we have hit a marker, we cannot need to suspend within the + * current MCU, because we will read no more bytes from the data + * source. So it is OK to update permanent state right away. + */ + cinfo->unread_marker = c; + /* See if we need to insert some fake zero bits. */ + goto no_more_bytes; + } + } + + /* OK, load c into get_buffer */ + get_buffer = (get_buffer << 8) | c; + bits_left += 8; + } /* end while */ + } else { + no_more_bytes: + /* We get here if we've read the marker that terminates the compressed + * data segment. There should be enough bits in the buffer register + * to satisfy the request; if so, no problem. + */ + if (nbits > bits_left) { + /* Uh-oh. Report corrupted data to user and stuff zeroes into + * the data stream, so that we can produce some kind of image. + * We use a nonvolatile flag to ensure that only one warning message + * appears per data segment. + */ + if (! ((huff_entropy_ptr) cinfo->entropy)->insufficient_data) { + WARNMS(cinfo, JWRN_HIT_MARKER); + ((huff_entropy_ptr) cinfo->entropy)->insufficient_data = TRUE; + } + /* Fill the buffer with zero bits */ + get_buffer <<= MIN_GET_BITS - bits_left; + bits_left = MIN_GET_BITS; + } + } + + /* Unload the local registers */ + state->next_input_byte = next_input_byte; + state->bytes_in_buffer = bytes_in_buffer; + state->get_buffer = get_buffer; + state->bits_left = bits_left; + + return TRUE; +} + + +/* + * Figure F.12: extend sign bit. + * On some machines, a shift and sub will be faster than a table lookup. + */ + +#ifdef AVOID_TABLES + +#define BIT_MASK(nbits) ((1<<(nbits))-1) +#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) - ((1<<(s))-1) : (x)) + +#else + +#define BIT_MASK(nbits) bmask[nbits] +#define HUFF_EXTEND(x,s) ((x) <= bmask[(s) - 1] ? (x) - bmask[s] : (x)) + +static const int bmask[16] = /* bmask[n] is mask for n rightmost bits */ + { 0, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, + 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF }; + +#endif /* AVOID_TABLES */ + + +/* + * Out-of-line code for Huffman code decoding. + */ + +LOCAL(int) +jpeg_huff_decode (bitread_working_state * state, + register bit_buf_type get_buffer, register int bits_left, + d_derived_tbl * htbl, int min_bits) +{ + register int l = min_bits; + register INT32 code; + + /* HUFF_DECODE has determined that the code is at least min_bits */ + /* bits long, so fetch that many bits in one swoop. */ + + CHECK_BIT_BUFFER(*state, l, return -1); + code = GET_BITS(l); + + /* Collect the rest of the Huffman code one bit at a time. */ + /* This is per Figure F.16 in the JPEG spec. */ + + while (code > htbl->maxcode[l]) { + code <<= 1; + CHECK_BIT_BUFFER(*state, 1, return -1); + code |= GET_BITS(1); + l++; + } + + /* Unload the local registers */ + state->get_buffer = get_buffer; + state->bits_left = bits_left; + + /* With garbage input we may reach the sentinel value l = 17. */ + + if (l > 16) { + WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE); + return 0; /* fake a zero as the safest result */ + } + + return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ]; +} + + +/* + * Check for a restart marker & resynchronize decoder. + * Returns FALSE if must suspend. + */ + +LOCAL(boolean) +process_restart (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci; + + /* Throw away any unused bits remaining in bit buffer; */ + /* include any full bytes in next_marker's count of discarded bytes */ + cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; + entropy->bitstate.bits_left = 0; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + return FALSE; + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + /* Re-init EOB run count, too */ + entropy->saved.EOBRUN = 0; + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; + + /* Reset out-of-data flag, unless read_restart_marker left us smack up + * against a marker. In that case we will end up treating the next data + * segment as empty, and we can avoid producing bogus output pixels by + * leaving the flag set. + */ + if (cinfo->unread_marker == 0) + entropy->insufficient_data = FALSE; + + return TRUE; +} + + +/* + * Huffman MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * Huffman-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. + * (Wholesale zeroing is usually a little faster than retail...) + * + * We return FALSE if data source requested suspension. In that case no + * changes have been made to permanent state. (Exception: some output + * coefficients may already have been assigned. This is harmless for + * spectral selection, since we'll just re-assign them on the next call. + * Successive approximation AC refinement has to be more careful, however.) + */ + +/* + * MCU decoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int Al = cinfo->Al; + register int s, r; + int blkn, ci; + JBLOCKROW block; + BITREAD_STATE_VARS; + savable_state state; + d_derived_tbl * tbl; + jpeg_component_info * compptr; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + tbl = entropy->derived_tbls[compptr->dc_tbl_no]; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + HUFF_DECODE(s, br_state, tbl, return FALSE, label1); + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + + /* Convert DC difference to actual value, update last_dc_val */ + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (s << Al); + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int s, k, r; + unsigned int EOBRUN; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Load up working state. + * We can avoid loading/saving bitread state if in an EOB run. + */ + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + + if (EOBRUN > 0) /* if it's a band of zeroes... */ + EOBRUN--; /* ...process it now (we do nothing) */ + else { + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + for (k = cinfo->Ss; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, return FALSE, label2); + r = s >> 4; + s &= 15; + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[natural_order[k]] = (JCOEF) (s << Al); + } else { + if (r == 15) { /* ZRL */ + k += 15; /* skip 15 zeroes in band */ + } else { /* EOBr, run length is 2^r + appended bits */ + EOBRUN = 1 << r; + if (r) { /* EOBr, r > 0 */ + CHECK_BIT_BUFFER(br_state, r, return FALSE); + r = GET_BITS(r); + EOBRUN += r; + } + EOBRUN--; /* this band is processed at this moment */ + break; /* force end-of-band */ + } + } + } + + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + } + + /* Completed MCU, so update state */ + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + int blkn; + JBLOCKROW block; + BITREAD_STATE_VARS; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* Not worth the cycles to check insufficient_data here, + * since we will not change the data anyway if we read zeroes. + */ + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* Encoded data is simply the next bit of the two's-complement DC value */ + CHECK_BIT_BUFFER(br_state, 1, return FALSE); + if (GET_BITS(1)) + (*block)[0] |= p1; + /* Note: since we use |=, repeating the assignment later is safe */ + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int s, k, r; + unsigned int EOBRUN; + int Se, p1, m1; + const int * natural_order; + JBLOCKROW block; + JCOEFPTR thiscoef; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + int num_newnz; + int newnz_pos[DCTSIZE2]; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, don't modify the MCU. + */ + if (! entropy->insufficient_data) { + + Se = cinfo->Se; + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + natural_order = cinfo->natural_order; + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + /* If we are forced to suspend, we must undo the assignments to any newly + * nonzero coefficients in the block, because otherwise we'd get confused + * next time about which coefficients were already nonzero. + * But we need not undo addition of bits to already-nonzero coefficients; + * instead, we can test the current bit to see if we already did it. + */ + num_newnz = 0; + + /* initialize coefficient loop counter to start of band */ + k = cinfo->Ss; + + if (EOBRUN == 0) { + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, goto undoit, label3); + r = s >> 4; + s &= 15; + if (s) { + if (s != 1) /* size of new coef should always be 1 */ + WARNMS(cinfo, JWRN_HUFF_BAD_CODE); + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) + s = p1; /* newly nonzero coef is positive */ + else + s = m1; /* newly nonzero coef is negative */ + } else { + if (r != 15) { + EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ + if (r) { + CHECK_BIT_BUFFER(br_state, r, goto undoit); + r = GET_BITS(r); + EOBRUN += r; + } + break; /* rest of block is handled by EOB logic */ + } + /* note s = 0 for processing ZRL */ + } + /* Advance over already-nonzero coefs and r still-zero coefs, + * appending correction bits to the nonzeroes. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + do { + thiscoef = *block + natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } else { + if (--r < 0) + break; /* reached target zero coefficient */ + } + k++; + } while (k <= Se); + if (s) { + int pos = natural_order[k]; + /* Output newly nonzero coefficient */ + (*block)[pos] = (JCOEF) s; + /* Remember its position in case we have to suspend */ + newnz_pos[num_newnz++] = pos; + } + } + } + + if (EOBRUN > 0) { + /* Scan any remaining coefficient positions after the end-of-band + * (the last newly nonzero coefficient, if any). Append a correction + * bit to each already-nonzero coefficient. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + for (; k <= Se; k++) { + thiscoef = *block + natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } + } + /* Count one block completed in EOB run */ + EOBRUN--; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; + +undoit: + /* Re-zero any output coefficients that we made newly nonzero */ + while (num_newnz > 0) + (*block)[newnz_pos[--num_newnz]] = 0; + + return FALSE; +} + + +/* + * Decode one MCU's worth of Huffman-compressed coefficients, + * partial blocks. + */ + +METHODDEF(boolean) +decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + const int * natural_order; + int Se, blkn; + BITREAD_STATE_VARS; + savable_state state; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + natural_order = cinfo->natural_order; + Se = cinfo->lim_Se; + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + JBLOCKROW block = MCU_data[blkn]; + d_derived_tbl * htbl; + register int s, k, r; + int coef_limit, ci; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + htbl = entropy->dc_cur_tbls[blkn]; + HUFF_DECODE(s, br_state, htbl, return FALSE, label1); + + htbl = entropy->ac_cur_tbls[blkn]; + k = 1; + coef_limit = entropy->coef_limit[blkn]; + if (coef_limit) { + /* Convert DC difference to actual value, update last_dc_val */ + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient */ + (*block)[0] = (JCOEF) s; + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (; k < coef_limit; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label2); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Output coefficient in natural (dezigzagged) order. + * Note: the extra entries in natural_order[] will save us + * if k > Se, which could happen if the data is corrupted. + */ + (*block)[natural_order[k]] = (JCOEF) s; + } else { + if (r != 15) + goto EndOfBlock; + k += 15; + } + } + } else { + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } + } + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label3); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } else { + if (r != 15) + break; + k += 15; + } + } + + EndOfBlock: ; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * Decode one MCU's worth of Huffman-compressed coefficients, + * full-size blocks. + */ + +METHODDEF(boolean) +decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int blkn; + BITREAD_STATE_VARS; + savable_state state; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + JBLOCKROW block = MCU_data[blkn]; + d_derived_tbl * htbl; + register int s, k, r; + int coef_limit, ci; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + htbl = entropy->dc_cur_tbls[blkn]; + HUFF_DECODE(s, br_state, htbl, return FALSE, label1); + + htbl = entropy->ac_cur_tbls[blkn]; + k = 1; + coef_limit = entropy->coef_limit[blkn]; + if (coef_limit) { + /* Convert DC difference to actual value, update last_dc_val */ + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient */ + (*block)[0] = (JCOEF) s; + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (; k < coef_limit; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label2); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Output coefficient in natural (dezigzagged) order. + * Note: the extra entries in jpeg_natural_order[] will save us + * if k >= DCTSIZE2, which could happen if the data is corrupted. + */ + (*block)[jpeg_natural_order[k]] = (JCOEF) s; + } else { + if (r != 15) + goto EndOfBlock; + k += 15; + } + } + } else { + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } + } + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (; k < DCTSIZE2; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label3); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } else { + if (r != 15) + break; + k += 15; + } + } + + EndOfBlock: ; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * Initialize for a Huffman-compressed scan. + */ + +METHODDEF(void) +start_pass_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, blkn, tbl, i; + jpeg_component_info * compptr; + + if (cinfo->progressive_mode) { + /* Validate progressive scan parameters */ + if (cinfo->Ss == 0) { + if (cinfo->Se != 0) + goto bad; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se) + goto bad; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + goto bad; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Ah-1 != cinfo->Al) + goto bad; + } + if (cinfo->Al > 13) { /* need not check for < 0 */ + /* Arguably the maximum Al value should be less than 13 for 8-bit precision, + * but the spec doesn't say so, and we try to be liberal about what we + * accept. Note: large Al values could result in out-of-range DC + * coefficients during early scans, leading to bizarre displays due to + * overflows in the IDCT math. But we won't crash. + */ + bad: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + } + /* Update progression status, and verify that scan order is legal. + * Note that inter-scan inconsistencies are treated as warnings + * not fatal errors ... not clear if this is right way to behave. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + int coefi, cindex = cinfo->cur_comp_info[ci]->component_index; + int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { + int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; + if (cinfo->Ah != expected) + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); + coef_bit_ptr[coefi] = cinfo->Al; + } + } + + /* Select MCU decoding routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Make sure requested tables are present, and compute derived tables. + * We may build same derived table more than once, but it's not expensive. + */ + if (cinfo->Ss == 0) { + if (cinfo->Ah == 0) { /* DC refinement needs no table */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->derived_tbls[tbl]); + } + } else { + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->derived_tbls[tbl]); + /* remember the single active table */ + entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Initialize private state variables */ + entropy->saved.EOBRUN = 0; + } else { + /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. + * This ought to be an error condition, but we make it a warning because + * there are some baseline files out there with all zeroes in these bytes. + */ + if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 || + ((cinfo->is_baseline || cinfo->Se < DCTSIZE2) && + cinfo->Se != cinfo->lim_Se)) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + + /* Select MCU decoding routine */ + /* We retain the hard-coded case for full-size blocks. + * This is not necessary, but it appears that this version is slightly + * more performant in the given implementation. + * With an improved implementation we would prefer a single optimized + * function. + */ + if (cinfo->lim_Se != DCTSIZE2-1) + entropy->pub.decode_mcu = decode_mcu_sub; + else + entropy->pub.decode_mcu = decode_mcu; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->dc_derived_tbls[tbl]); + if (cinfo->lim_Se) { /* AC needs no table when not present */ + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->ac_derived_tbls[tbl]); + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Precalculate decoding info for each block in an MCU of this scan */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + /* Precalculate which table to use for each block */ + entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no]; + entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no]; + /* Decide whether we really care about the coefficient values */ + if (compptr->component_needed) { + ci = compptr->DCT_v_scaled_size; + i = compptr->DCT_h_scaled_size; + switch (cinfo->lim_Se) { + case (1*1-1): + entropy->coef_limit[blkn] = 1; + break; + case (2*2-1): + if (ci <= 0 || ci > 2) ci = 2; + if (i <= 0 || i > 2) i = 2; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order2[ci - 1][i - 1]; + break; + case (3*3-1): + if (ci <= 0 || ci > 3) ci = 3; + if (i <= 0 || i > 3) i = 3; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order3[ci - 1][i - 1]; + break; + case (4*4-1): + if (ci <= 0 || ci > 4) ci = 4; + if (i <= 0 || i > 4) i = 4; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order4[ci - 1][i - 1]; + break; + case (5*5-1): + if (ci <= 0 || ci > 5) ci = 5; + if (i <= 0 || i > 5) i = 5; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order5[ci - 1][i - 1]; + break; + case (6*6-1): + if (ci <= 0 || ci > 6) ci = 6; + if (i <= 0 || i > 6) i = 6; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order6[ci - 1][i - 1]; + break; + case (7*7-1): + if (ci <= 0 || ci > 7) ci = 7; + if (i <= 0 || i > 7) i = 7; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order7[ci - 1][i - 1]; + break; + default: + if (ci <= 0 || ci > 8) ci = 8; + if (i <= 0 || i > 8) i = 8; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1]; + break; + } + } else { + entropy->coef_limit[blkn] = 0; + } + } + } + + /* Initialize bitread state variables */ + entropy->bitstate.bits_left = 0; + entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ + entropy->insufficient_data = FALSE; + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Module initialization routine for Huffman entropy decoding. + */ + +GLOBAL(void) +jinit_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy; + int i; + + entropy = (huff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(huff_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass_huff_decoder; + + if (cinfo->progressive_mode) { + /* Create progression status table */ + int *coef_bit_ptr, ci; + cinfo->coef_bits = (int (*)[DCTSIZE2]) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components*DCTSIZE2*SIZEOF(int)); + coef_bit_ptr = & cinfo->coef_bits[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (i = 0; i < DCTSIZE2; i++) + *coef_bit_ptr++ = -1; + + /* Mark derived tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->derived_tbls[i] = NULL; + } + } else { + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; + } + } +} diff --git a/src/3rdparty/libjpeg/jdinput.c b/src/3rdparty/libjpeg/jdinput.c new file mode 100644 index 0000000000..2c5c717b9c --- /dev/null +++ b/src/3rdparty/libjpeg/jdinput.c @@ -0,0 +1,661 @@ +/* + * jdinput.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains input control logic for the JPEG decompressor. + * These routines are concerned with controlling the decompressor's input + * processing (marker reading and coefficient decoding). The actual input + * reading is done in jdmarker.c, jdhuff.c, and jdarith.c. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_input_controller pub; /* public fields */ + + int inheaders; /* Nonzero until first SOS is reached */ +} my_input_controller; + +typedef my_input_controller * my_inputctl_ptr; + + +/* Forward declarations */ +METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); + + +/* + * Routines to calculate various quantities related to the size of the image. + */ + + +/* + * Compute output image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + */ + +GLOBAL(void) +jpeg_core_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase. + * This function is used for transcoding and full decompression. + */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; + + /* Compute actual output image dimensions and DCT scaling choices. */ + if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) { + /* Provide 1/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 1; + cinfo->min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) { + /* Provide 2/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 2; + cinfo->min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 3) { + /* Provide 3/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 3L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 3L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 3; + cinfo->min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) { + /* Provide 4/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 4; + cinfo->min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 5) { + /* Provide 5/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 5L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 5L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 5; + cinfo->min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 6) { + /* Provide 6/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 6L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 6L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 6; + cinfo->min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 7) { + /* Provide 7/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 7L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 7L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 7; + cinfo->min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) { + /* Provide 8/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 8; + cinfo->min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 9) { + /* Provide 9/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 9L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 9L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 9; + cinfo->min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 10) { + /* Provide 10/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 10L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 10L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 10; + cinfo->min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 11) { + /* Provide 11/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 11L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 11L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 11; + cinfo->min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 12) { + /* Provide 12/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 12L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 12L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 12; + cinfo->min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 13) { + /* Provide 13/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 13L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 13L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 13; + cinfo->min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 14) { + /* Provide 14/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 14L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 14L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 14; + cinfo->min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 15) { + /* Provide 15/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 15L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 15L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 15; + cinfo->min_DCT_v_scaled_size = 15; + } else { + /* Provide 16/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 16L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 16L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 16; + cinfo->min_DCT_v_scaled_size = 16; + } + + /* Recompute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size; + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size; + } + +#else /* !IDCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->output_width = cinfo->image_width; + cinfo->output_height = cinfo->image_height; + /* jdinput.c has already initialized DCT_scaled_size, + * and has computed unscaled downsampled_width and downsampled_height. + */ + +#endif /* IDCT_SCALING_SUPPORTED */ +} + + +LOCAL(void) +initial_setup (j_decompress_ptr cinfo) +/* Called once, when first SOS marker is reached */ +{ + int ci; + jpeg_component_info *compptr; + + /* Make sure image isn't bigger than I can handle */ + if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* For now, precision must match compiled-in value... */ + if (cinfo->data_precision != BITS_IN_JSAMPLE) + ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); + + /* Check that number of components won't exceed internal array sizes */ + if (cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + ERREXIT(cinfo, JERR_BAD_SAMPLING); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* Derive block_size, natural_order, and lim_Se */ + if (cinfo->is_baseline || (cinfo->progressive_mode && + cinfo->comps_in_scan)) { /* no pseudo SOS marker */ + cinfo->block_size = DCTSIZE; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + } else + switch (cinfo->Se) { + case (1*1-1): + cinfo->block_size = 1; + cinfo->natural_order = jpeg_natural_order; /* not needed */ + cinfo->lim_Se = cinfo->Se; + break; + case (2*2-1): + cinfo->block_size = 2; + cinfo->natural_order = jpeg_natural_order2; + cinfo->lim_Se = cinfo->Se; + break; + case (3*3-1): + cinfo->block_size = 3; + cinfo->natural_order = jpeg_natural_order3; + cinfo->lim_Se = cinfo->Se; + break; + case (4*4-1): + cinfo->block_size = 4; + cinfo->natural_order = jpeg_natural_order4; + cinfo->lim_Se = cinfo->Se; + break; + case (5*5-1): + cinfo->block_size = 5; + cinfo->natural_order = jpeg_natural_order5; + cinfo->lim_Se = cinfo->Se; + break; + case (6*6-1): + cinfo->block_size = 6; + cinfo->natural_order = jpeg_natural_order6; + cinfo->lim_Se = cinfo->Se; + break; + case (7*7-1): + cinfo->block_size = 7; + cinfo->natural_order = jpeg_natural_order7; + cinfo->lim_Se = cinfo->Se; + break; + case (8*8-1): + cinfo->block_size = 8; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (9*9-1): + cinfo->block_size = 9; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (10*10-1): + cinfo->block_size = 10; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (11*11-1): + cinfo->block_size = 11; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (12*12-1): + cinfo->block_size = 12; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (13*13-1): + cinfo->block_size = 13; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (14*14-1): + cinfo->block_size = 14; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (15*15-1): + cinfo->block_size = 15; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (16*16-1): + cinfo->block_size = 16; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + default: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + break; + } + + /* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size. + * In the full decompressor, + * this will be overridden by jpeg_calc_output_dimensions in jdmaster.c; + * but in the transcoder, + * jpeg_calc_output_dimensions is not used, so we must do it here. + */ + cinfo->min_DCT_h_scaled_size = cinfo->block_size; + cinfo->min_DCT_v_scaled_size = cinfo->block_size; + + /* Compute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_h_scaled_size = cinfo->block_size; + compptr->DCT_v_scaled_size = cinfo->block_size; + /* Size in DCT blocks */ + compptr->width_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* downsampled_width and downsampled_height will also be overridden by + * jdmaster.c if we are doing full decompression. The transcoder library + * doesn't use these values, but the calling application might. + */ + /* Size in samples */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) cinfo->max_h_samp_factor); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) cinfo->max_v_samp_factor); + /* Mark component needed, until color conversion says otherwise */ + compptr->component_needed = TRUE; + /* Mark no quantization table yet saved for component */ + compptr->quant_table = NULL; + } + + /* Compute number of fully interleaved MCU rows. */ + cinfo->total_iMCU_rows = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + + /* Decide whether file contains multiple scans */ + if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) + cinfo->inputctl->has_multiple_scans = TRUE; + else + cinfo->inputctl->has_multiple_scans = FALSE; +} + + +LOCAL(void) +per_scan_setup (j_decompress_ptr cinfo) +/* Do computations that are needed before processing a JPEG scan */ +/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */ +{ + int ci, mcublks, tmp; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan == 1) { + + /* Noninterleaved (single-component) scan */ + compptr = cinfo->cur_comp_info[0]; + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = compptr->width_in_blocks; + cinfo->MCU_rows_in_scan = compptr->height_in_blocks; + + /* For noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + compptr->MCU_sample_width = compptr->DCT_h_scaled_size; + compptr->last_col_width = 1; + /* For noninterleaved scans, it is convenient to define last_row_height + * as the number of block rows present in the last iMCU row. + */ + tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (tmp == 0) tmp = compptr->v_samp_factor; + compptr->last_row_height = tmp; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + } else { + + /* Interleaved (multi-component) scan */ + if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, + MAX_COMPS_IN_SCAN); + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Sampling factors give # of blocks of component in each MCU */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size; + /* Figure number of non-dummy blocks in last MCU column & row */ + tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); + if (tmp == 0) tmp = compptr->MCU_width; + compptr->last_col_width = tmp; + tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); + if (tmp == 0) tmp = compptr->MCU_height; + compptr->last_row_height = tmp; + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU) + ERREXIT(cinfo, JERR_BAD_MCU_SIZE); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + } +} + + +/* + * Save away a copy of the Q-table referenced by each component present + * in the current scan, unless already saved during a prior scan. + * + * In a multiple-scan JPEG file, the encoder could assign different components + * the same Q-table slot number, but change table definitions between scans + * so that each component uses a different Q-table. (The IJG encoder is not + * currently capable of doing this, but other encoders might.) Since we want + * to be able to dequantize all the components at the end of the file, this + * means that we have to save away the table actually used for each component. + * We do this by copying the table at the start of the first scan containing + * the component. + * The JPEG spec prohibits the encoder from changing the contents of a Q-table + * slot between scans of a component using that slot. If the encoder does so + * anyway, this decoder will simply use the Q-table values that were current + * at the start of the first scan for the component. + * + * The decompressor output side looks only at the saved quant tables, + * not at the current Q-table slots. + */ + +LOCAL(void) +latch_quant_tables (j_decompress_ptr cinfo) +{ + int ci, qtblno; + jpeg_component_info *compptr; + JQUANT_TBL * qtbl; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* No work if we already saved Q-table for this component */ + if (compptr->quant_table != NULL) + continue; + /* Make sure specified quantization table is present */ + qtblno = compptr->quant_tbl_no; + if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || + cinfo->quant_tbl_ptrs[qtblno] == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); + /* OK, save away the quantization table */ + qtbl = (JQUANT_TBL *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(JQUANT_TBL)); + MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL)); + compptr->quant_table = qtbl; + } +} + + +/* + * Initialize the input modules to read a scan of compressed data. + * The first call to this is done by jdmaster.c after initializing + * the entire decompressor (during jpeg_start_decompress). + * Subsequent calls come from consume_markers, below. + */ + +METHODDEF(void) +start_input_pass (j_decompress_ptr cinfo) +{ + per_scan_setup(cinfo); + latch_quant_tables(cinfo); + (*cinfo->entropy->start_pass) (cinfo); + (*cinfo->coef->start_input_pass) (cinfo); + cinfo->inputctl->consume_input = cinfo->coef->consume_data; +} + + +/* + * Finish up after inputting a compressed-data scan. + * This is called by the coefficient controller after it's read all + * the expected data of the scan. + */ + +METHODDEF(void) +finish_input_pass (j_decompress_ptr cinfo) +{ + cinfo->inputctl->consume_input = consume_markers; +} + + +/* + * Read JPEG markers before, between, or after compressed-data scans. + * Change state as necessary when a new scan is reached. + * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + * + * The consume_input method pointer points either here or to the + * coefficient controller's consume_data routine, depending on whether + * we are reading a compressed data segment or inter-segment markers. + * + * Note: This function should NOT return a pseudo SOS marker (with zero + * component number) to the caller. A pseudo marker received by + * read_markers is processed and then skipped for other markers. + */ + +METHODDEF(int) +consume_markers (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; + int val; + + if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ + return JPEG_REACHED_EOI; + + for (;;) { /* Loop to pass pseudo SOS marker */ + val = (*cinfo->marker->read_markers) (cinfo); + + switch (val) { + case JPEG_REACHED_SOS: /* Found SOS */ + if (inputctl->inheaders) { /* 1st SOS */ + if (inputctl->inheaders == 1) + initial_setup(cinfo); + if (cinfo->comps_in_scan == 0) { /* pseudo SOS marker */ + inputctl->inheaders = 2; + break; + } + inputctl->inheaders = 0; + /* Note: start_input_pass must be called by jdmaster.c + * before any more input can be consumed. jdapimin.c is + * responsible for enforcing this sequencing. + */ + } else { /* 2nd or later SOS marker */ + if (! inputctl->pub.has_multiple_scans) + ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ + if (cinfo->comps_in_scan == 0) /* unexpected pseudo SOS marker */ + break; + start_input_pass(cinfo); + } + return val; + case JPEG_REACHED_EOI: /* Found EOI */ + inputctl->pub.eoi_reached = TRUE; + if (inputctl->inheaders) { /* Tables-only datastream, apparently */ + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_NO_SOS); + } else { + /* Prevent infinite loop in coef ctlr's decompress_data routine + * if user set output_scan_number larger than number of scans. + */ + if (cinfo->output_scan_number > cinfo->input_scan_number) + cinfo->output_scan_number = cinfo->input_scan_number; + } + return val; + case JPEG_SUSPENDED: + return val; + default: + return val; + } + } +} + + +/* + * Reset state to begin a fresh datastream. + */ + +METHODDEF(void) +reset_input_controller (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; + + inputctl->pub.consume_input = consume_markers; + inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ + inputctl->pub.eoi_reached = FALSE; + inputctl->inheaders = 1; + /* Reset other modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->marker->reset_marker_reader) (cinfo); + /* Reset progression state -- would be cleaner if entropy decoder did this */ + cinfo->coef_bits = NULL; +} + + +/* + * Initialize the input controller module. + * This is called only once, when the decompression object is created. + */ + +GLOBAL(void) +jinit_input_controller (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl; + + /* Create subobject in permanent pool */ + inputctl = (my_inputctl_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_input_controller)); + cinfo->inputctl = (struct jpeg_input_controller *) inputctl; + /* Initialize method pointers */ + inputctl->pub.consume_input = consume_markers; + inputctl->pub.reset_input_controller = reset_input_controller; + inputctl->pub.start_input_pass = start_input_pass; + inputctl->pub.finish_input_pass = finish_input_pass; + /* Initialize state: can't use reset_input_controller since we don't + * want to try to reset other modules yet. + */ + inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ + inputctl->pub.eoi_reached = FALSE; + inputctl->inheaders = 1; +} diff --git a/src/3rdparty/libjpeg/jdmainct.c b/src/3rdparty/libjpeg/jdmainct.c new file mode 100644 index 0000000000..02723ca732 --- /dev/null +++ b/src/3rdparty/libjpeg/jdmainct.c @@ -0,0 +1,512 @@ +/* + * jdmainct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the main buffer controller for decompression. + * The main buffer lies between the JPEG decompressor proper and the + * post-processor; it holds downsampled data in the JPEG colorspace. + * + * Note that this code is bypassed in raw-data mode, since the application + * supplies the equivalent of the main buffer in that case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * In the current system design, the main buffer need never be a full-image + * buffer; any full-height buffers will be found inside the coefficient or + * postprocessing controllers. Nonetheless, the main controller is not + * trivial. Its responsibility is to provide context rows for upsampling/ + * rescaling, and doing this in an efficient fashion is a bit tricky. + * + * Postprocessor input data is counted in "row groups". A row group + * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) + * sample rows of each component. (We require DCT_scaled_size values to be + * chosen such that these numbers are integers. In practice DCT_scaled_size + * values will likely be powers of two, so we actually have the stronger + * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.) + * Upsampling will typically produce max_v_samp_factor pixel rows from each + * row group (times any additional scale factor that the upsampler is + * applying). + * + * The coefficient controller will deliver data to us one iMCU row at a time; + * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or + * exactly min_DCT_scaled_size row groups. (This amount of data corresponds + * to one row of MCUs when the image is fully interleaved.) Note that the + * number of sample rows varies across components, but the number of row + * groups does not. Some garbage sample rows may be included in the last iMCU + * row at the bottom of the image. + * + * Depending on the vertical scaling algorithm used, the upsampler may need + * access to the sample row(s) above and below its current input row group. + * The upsampler is required to set need_context_rows TRUE at global selection + * time if so. When need_context_rows is FALSE, this controller can simply + * obtain one iMCU row at a time from the coefficient controller and dole it + * out as row groups to the postprocessor. + * + * When need_context_rows is TRUE, this controller guarantees that the buffer + * passed to postprocessing contains at least one row group's worth of samples + * above and below the row group(s) being processed. Note that the context + * rows "above" the first passed row group appear at negative row offsets in + * the passed buffer. At the top and bottom of the image, the required + * context rows are manufactured by duplicating the first or last real sample + * row; this avoids having special cases in the upsampling inner loops. + * + * The amount of context is fixed at one row group just because that's a + * convenient number for this controller to work with. The existing + * upsamplers really only need one sample row of context. An upsampler + * supporting arbitrary output rescaling might wish for more than one row + * group of context when shrinking the image; tough, we don't handle that. + * (This is justified by the assumption that downsizing will be handled mostly + * by adjusting the DCT_scaled_size values, so that the actual scale factor at + * the upsample step needn't be much less than one.) + * + * To provide the desired context, we have to retain the last two row groups + * of one iMCU row while reading in the next iMCU row. (The last row group + * can't be processed until we have another row group for its below-context, + * and so we have to save the next-to-last group too for its above-context.) + * We could do this most simply by copying data around in our buffer, but + * that'd be very slow. We can avoid copying any data by creating a rather + * strange pointer structure. Here's how it works. We allocate a workspace + * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number + * of row groups per iMCU row). We create two sets of redundant pointers to + * the workspace. Labeling the physical row groups 0 to M+1, the synthesized + * pointer lists look like this: + * M+1 M-1 + * master pointer --> 0 master pointer --> 0 + * 1 1 + * ... ... + * M-3 M-3 + * M-2 M + * M-1 M+1 + * M M-2 + * M+1 M-1 + * 0 0 + * We read alternate iMCU rows using each master pointer; thus the last two + * row groups of the previous iMCU row remain un-overwritten in the workspace. + * The pointer lists are set up so that the required context rows appear to + * be adjacent to the proper places when we pass the pointer lists to the + * upsampler. + * + * The above pictures describe the normal state of the pointer lists. + * At top and bottom of the image, we diddle the pointer lists to duplicate + * the first or last sample row as necessary (this is cheaper than copying + * sample rows around). + * + * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that + * situation each iMCU row provides only one row group so the buffering logic + * must be different (eg, we must read two iMCU rows before we can emit the + * first row group). For now, we simply do not support providing context + * rows when min_DCT_scaled_size is 1. That combination seems unlikely to + * be worth providing --- if someone wants a 1/8th-size preview, they probably + * want it quick and dirty, so a context-free upsampler is sufficient. + */ + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_main_controller pub; /* public fields */ + + /* Pointer to allocated workspace (M or M+2 row groups). */ + JSAMPARRAY buffer[MAX_COMPONENTS]; + + boolean buffer_full; /* Have we gotten an iMCU row from decoder? */ + JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */ + + /* Remaining fields are only used in the context case. */ + + /* These are the master pointers to the funny-order pointer lists. */ + JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */ + + int whichptr; /* indicates which pointer set is now in use */ + int context_state; /* process_data state machine status */ + JDIMENSION rowgroups_avail; /* row groups available to postprocessor */ + JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */ +} my_main_controller; + +typedef my_main_controller * my_main_ptr; + +/* context_state values: */ +#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */ +#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */ +#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */ + + +/* Forward declarations */ +METHODDEF(void) process_data_simple_main + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +METHODDEF(void) process_data_context_main + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +#ifdef QUANT_2PASS_SUPPORTED +METHODDEF(void) process_data_crank_post + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +#endif + + +LOCAL(void) +alloc_funny_pointers (j_decompress_ptr cinfo) +/* Allocate space for the funny pointer lists. + * This is done only once, not once per pass. + */ +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + int ci, rgroup; + int M = cinfo->min_DCT_v_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY xbuf; + + /* Get top-level space for component array pointers. + * We alloc both arrays with one call to save a few cycles. + */ + main->xbuffer[0] = (JSAMPIMAGE) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); + main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + /* Get space for pointer lists --- M+4 row groups in each list. + * We alloc both pointer lists with one call to save a few cycles. + */ + xbuf = (JSAMPARRAY) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); + xbuf += rgroup; /* want one row group at negative offsets */ + main->xbuffer[0][ci] = xbuf; + xbuf += rgroup * (M + 4); + main->xbuffer[1][ci] = xbuf; + } +} + + +LOCAL(void) +make_funny_pointers (j_decompress_ptr cinfo) +/* Create the funny pointer lists discussed in the comments above. + * The actual workspace is already allocated (in main->buffer), + * and the space for the pointer lists is allocated too. + * This routine just fills in the curiously ordered lists. + * This will be repeated at the beginning of each pass. + */ +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + int ci, i, rgroup; + int M = cinfo->min_DCT_v_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY buf, xbuf0, xbuf1; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + xbuf0 = main->xbuffer[0][ci]; + xbuf1 = main->xbuffer[1][ci]; + /* First copy the workspace pointers as-is */ + buf = main->buffer[ci]; + for (i = 0; i < rgroup * (M + 2); i++) { + xbuf0[i] = xbuf1[i] = buf[i]; + } + /* In the second list, put the last four row groups in swapped order */ + for (i = 0; i < rgroup * 2; i++) { + xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i]; + xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i]; + } + /* The wraparound pointers at top and bottom will be filled later + * (see set_wraparound_pointers, below). Initially we want the "above" + * pointers to duplicate the first actual data line. This only needs + * to happen in xbuffer[0]. + */ + for (i = 0; i < rgroup; i++) { + xbuf0[i - rgroup] = xbuf0[0]; + } + } +} + + +LOCAL(void) +set_wraparound_pointers (j_decompress_ptr cinfo) +/* Set up the "wraparound" pointers at top and bottom of the pointer lists. + * This changes the pointer list state from top-of-image to the normal state. + */ +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + int ci, i, rgroup; + int M = cinfo->min_DCT_v_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY xbuf0, xbuf1; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + xbuf0 = main->xbuffer[0][ci]; + xbuf1 = main->xbuffer[1][ci]; + for (i = 0; i < rgroup; i++) { + xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i]; + xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i]; + xbuf0[rgroup*(M+2) + i] = xbuf0[i]; + xbuf1[rgroup*(M+2) + i] = xbuf1[i]; + } + } +} + + +LOCAL(void) +set_bottom_pointers (j_decompress_ptr cinfo) +/* Change the pointer lists to duplicate the last sample row at the bottom + * of the image. whichptr indicates which xbuffer holds the final iMCU row. + * Also sets rowgroups_avail to indicate number of nondummy row groups in row. + */ +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + int ci, i, rgroup, iMCUheight, rows_left; + jpeg_component_info *compptr; + JSAMPARRAY xbuf; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Count sample rows in one iMCU row and in one row group */ + iMCUheight = compptr->v_samp_factor * compptr->DCT_v_scaled_size; + rgroup = iMCUheight / cinfo->min_DCT_v_scaled_size; + /* Count nondummy sample rows remaining for this component */ + rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight); + if (rows_left == 0) rows_left = iMCUheight; + /* Count nondummy row groups. Should get same answer for each component, + * so we need only do it once. + */ + if (ci == 0) { + main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1); + } + /* Duplicate the last real sample row rgroup*2 times; this pads out the + * last partial rowgroup and ensures at least one full rowgroup of context. + */ + xbuf = main->xbuffer[main->whichptr][ci]; + for (i = 0; i < rgroup * 2; i++) { + xbuf[rows_left + i] = xbuf[rows_left-1]; + } + } +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (cinfo->upsample->need_context_rows) { + main->pub.process_data = process_data_context_main; + make_funny_pointers(cinfo); /* Create the xbuffer[] lists */ + main->whichptr = 0; /* Read first iMCU row into xbuffer[0] */ + main->context_state = CTX_PREPARE_FOR_IMCU; + main->iMCU_row_ctr = 0; + } else { + /* Simple case with no context needed */ + main->pub.process_data = process_data_simple_main; + } + main->buffer_full = FALSE; /* Mark buffer empty */ + main->rowgroup_ctr = 0; + break; +#ifdef QUANT_2PASS_SUPPORTED + case JBUF_CRANK_DEST: + /* For last pass of 2-pass quantization, just crank the postprocessor */ + main->pub.process_data = process_data_crank_post; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data. + * This handles the simple case where no context is required. + */ + +METHODDEF(void) +process_data_simple_main (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + JDIMENSION rowgroups_avail; + + /* Read input data if we haven't filled the main buffer yet */ + if (! main->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer)) + return; /* suspension forced, can do nothing more */ + main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + } + + /* There are always min_DCT_scaled_size row groups in an iMCU row. */ + rowgroups_avail = (JDIMENSION) cinfo->min_DCT_v_scaled_size; + /* Note: at the bottom of the image, we may pass extra garbage row groups + * to the postprocessor. The postprocessor has to check for bottom + * of image anyway (at row resolution), so no point in us doing it too. + */ + + /* Feed the postprocessor */ + (*cinfo->post->post_process_data) (cinfo, main->buffer, + &main->rowgroup_ctr, rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + + /* Has postprocessor consumed all the data yet? If so, mark buffer empty */ + if (main->rowgroup_ctr >= rowgroups_avail) { + main->buffer_full = FALSE; + main->rowgroup_ctr = 0; + } +} + + +/* + * Process some data. + * This handles the case where context rows must be provided. + */ + +METHODDEF(void) +process_data_context_main (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + + /* Read input data if we haven't filled the main buffer yet */ + if (! main->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, + main->xbuffer[main->whichptr])) + return; /* suspension forced, can do nothing more */ + main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + main->iMCU_row_ctr++; /* count rows received */ + } + + /* Postprocessor typically will not swallow all the input data it is handed + * in one call (due to filling the output buffer first). Must be prepared + * to exit and restart. This switch lets us keep track of how far we got. + * Note that each case falls through to the next on successful completion. + */ + switch (main->context_state) { + case CTX_POSTPONED_ROW: + /* Call postprocessor using previously set pointers for postponed row */ + (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr], + &main->rowgroup_ctr, main->rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + if (main->rowgroup_ctr < main->rowgroups_avail) + return; /* Need to suspend */ + main->context_state = CTX_PREPARE_FOR_IMCU; + if (*out_row_ctr >= out_rows_avail) + return; /* Postprocessor exactly filled output buf */ + /*FALLTHROUGH*/ + case CTX_PREPARE_FOR_IMCU: + /* Prepare to process first M-1 row groups of this iMCU row */ + main->rowgroup_ctr = 0; + main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1); + /* Check for bottom of image: if so, tweak pointers to "duplicate" + * the last sample row, and adjust rowgroups_avail to ignore padding rows. + */ + if (main->iMCU_row_ctr == cinfo->total_iMCU_rows) + set_bottom_pointers(cinfo); + main->context_state = CTX_PROCESS_IMCU; + /*FALLTHROUGH*/ + case CTX_PROCESS_IMCU: + /* Call postprocessor using previously set pointers */ + (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr], + &main->rowgroup_ctr, main->rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + if (main->rowgroup_ctr < main->rowgroups_avail) + return; /* Need to suspend */ + /* After the first iMCU, change wraparound pointers to normal state */ + if (main->iMCU_row_ctr == 1) + set_wraparound_pointers(cinfo); + /* Prepare to load new iMCU row using other xbuffer list */ + main->whichptr ^= 1; /* 0=>1 or 1=>0 */ + main->buffer_full = FALSE; + /* Still need to process last row group of this iMCU row, */ + /* which is saved at index M+1 of the other xbuffer */ + main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1); + main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2); + main->context_state = CTX_POSTPONED_ROW; + } +} + + +/* + * Process some data. + * Final pass of two-pass quantization: just call the postprocessor. + * Source data will be the postprocessor controller's internal buffer. + */ + +#ifdef QUANT_2PASS_SUPPORTED + +METHODDEF(void) +process_data_crank_post (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL, + (JDIMENSION *) NULL, (JDIMENSION) 0, + output_buf, out_row_ctr, out_rows_avail); +} + +#endif /* QUANT_2PASS_SUPPORTED */ + + +/* + * Initialize main buffer controller. + */ + +GLOBAL(void) +jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_main_ptr main; + int ci, rgroup, ngroups; + jpeg_component_info *compptr; + + main = (my_main_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_main_controller)); + cinfo->main = (struct jpeg_d_main_controller *) main; + main->pub.start_pass = start_pass_main; + + if (need_full_buffer) /* shouldn't happen */ + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + /* Allocate the workspace. + * ngroups is the number of row groups we need. + */ + if (cinfo->upsample->need_context_rows) { + if (cinfo->min_DCT_v_scaled_size < 2) /* unsupported, see comments above */ + ERREXIT(cinfo, JERR_NOTIMPL); + alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */ + ngroups = cinfo->min_DCT_v_scaled_size + 2; + } else { + ngroups = cinfo->min_DCT_v_scaled_size; + } + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + main->buffer[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (JDIMENSION) (rgroup * ngroups)); + } +} diff --git a/src/3rdparty/libjpeg/jdmarker.c b/src/3rdparty/libjpeg/jdmarker.c new file mode 100644 index 0000000000..f2a9cc4295 --- /dev/null +++ b/src/3rdparty/libjpeg/jdmarker.c @@ -0,0 +1,1406 @@ +/* + * jdmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to decode JPEG datastream markers. + * Most of the complexity arises from our desire to support input + * suspension: if not all of the data for a marker is available, + * we must exit back to the application. On resumption, we reprocess + * the marker. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP1 = 0xe1, + M_APP2 = 0xe2, + M_APP3 = 0xe3, + M_APP4 = 0xe4, + M_APP5 = 0xe5, + M_APP6 = 0xe6, + M_APP7 = 0xe7, + M_APP8 = 0xe8, + M_APP9 = 0xe9, + M_APP10 = 0xea, + M_APP11 = 0xeb, + M_APP12 = 0xec, + M_APP13 = 0xed, + M_APP14 = 0xee, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; + + +/* Private state */ + +typedef struct { + struct jpeg_marker_reader pub; /* public fields */ + + /* Application-overridable marker processing methods */ + jpeg_marker_parser_method process_COM; + jpeg_marker_parser_method process_APPn[16]; + + /* Limit on marker data length to save for each marker type */ + unsigned int length_limit_COM; + unsigned int length_limit_APPn[16]; + + /* Status of COM/APPn marker saving */ + jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */ + unsigned int bytes_read; /* data bytes read so far in marker */ + /* Note: cur_marker is not linked into marker_list until it's all read. */ +} my_marker_reader; + +typedef my_marker_reader * my_marker_ptr; + + +/* + * Macros for fetching data from the data source module. + * + * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect + * the current restart point; we update them only when we have reached a + * suitable place to restart if a suspension occurs. + */ + +/* Declare and initialize local copies of input pointer/count */ +#define INPUT_VARS(cinfo) \ + struct jpeg_source_mgr * datasrc = (cinfo)->src; \ + const JOCTET * next_input_byte = datasrc->next_input_byte; \ + size_t bytes_in_buffer = datasrc->bytes_in_buffer + +/* Unload the local copies --- do this only at a restart boundary */ +#define INPUT_SYNC(cinfo) \ + ( datasrc->next_input_byte = next_input_byte, \ + datasrc->bytes_in_buffer = bytes_in_buffer ) + +/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */ +#define INPUT_RELOAD(cinfo) \ + ( next_input_byte = datasrc->next_input_byte, \ + bytes_in_buffer = datasrc->bytes_in_buffer ) + +/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available. + * Note we do *not* do INPUT_SYNC before calling fill_input_buffer, + * but we must reload the local copies after a successful fill. + */ +#define MAKE_BYTE_AVAIL(cinfo,action) \ + if (bytes_in_buffer == 0) { \ + if (! (*datasrc->fill_input_buffer) (cinfo)) \ + { action; } \ + INPUT_RELOAD(cinfo); \ + } + +/* Read a byte into variable V. + * If must suspend, take the specified action (typically "return FALSE"). + */ +#define INPUT_BYTE(cinfo,V,action) \ + MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V = GETJOCTET(*next_input_byte++); ) + +/* As above, but read two bytes interpreted as an unsigned 16-bit integer. + * V should be declared unsigned int or perhaps INT32. + */ +#define INPUT_2BYTES(cinfo,V,action) \ + MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \ + MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V += GETJOCTET(*next_input_byte++); ) + + +/* + * Routines to process JPEG markers. + * + * Entry condition: JPEG marker itself has been read and its code saved + * in cinfo->unread_marker; input restart point is just after the marker. + * + * Exit: if return TRUE, have read and processed any parameters, and have + * updated the restart point to point after the parameters. + * If return FALSE, was forced to suspend before reaching end of + * marker parameters; restart point has not been moved. Same routine + * will be called again after application supplies more input data. + * + * This approach to suspension assumes that all of a marker's parameters + * can fit into a single input bufferload. This should hold for "normal" + * markers. Some COM/APPn markers might have large parameter segments + * that might not fit. If we are simply dropping such a marker, we use + * skip_input_data to get past it, and thereby put the problem on the + * source manager's shoulders. If we are saving the marker's contents + * into memory, we use a slightly different convention: when forced to + * suspend, the marker processor updates the restart point to the end of + * what it's consumed (ie, the end of the buffer) before returning FALSE. + * On resumption, cinfo->unread_marker still contains the marker code, + * but the data source will point to the next chunk of marker data. + * The marker processor must retain internal state to deal with this. + * + * Note that we don't bother to avoid duplicate trace messages if a + * suspension occurs within marker parameters. Other side effects + * require more care. + */ + + +LOCAL(boolean) +get_soi (j_decompress_ptr cinfo) +/* Process an SOI marker */ +{ + int i; + + TRACEMS(cinfo, 1, JTRC_SOI); + + if (cinfo->marker->saw_SOI) + ERREXIT(cinfo, JERR_SOI_DUPLICATE); + + /* Reset all parameters that are defined to be reset by SOI */ + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + cinfo->restart_interval = 0; + + /* Set initial assumptions for colorspace etc */ + + cinfo->jpeg_color_space = JCS_UNKNOWN; + cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */ + + cinfo->saw_JFIF_marker = FALSE; + cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */ + cinfo->JFIF_minor_version = 1; + cinfo->density_unit = 0; + cinfo->X_density = 1; + cinfo->Y_density = 1; + cinfo->saw_Adobe_marker = FALSE; + cinfo->Adobe_transform = 0; + + cinfo->marker->saw_SOI = TRUE; + + return TRUE; +} + + +LOCAL(boolean) +get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog, + boolean is_arith) +/* Process a SOFn marker */ +{ + INT32 length; + int c, ci; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + cinfo->is_baseline = is_baseline; + cinfo->progressive_mode = is_prog; + cinfo->arith_code = is_arith; + + INPUT_2BYTES(cinfo, length, return FALSE); + + INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE); + INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE); + INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE); + INPUT_BYTE(cinfo, cinfo->num_components, return FALSE); + + length -= 8; + + TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker, + (int) cinfo->image_width, (int) cinfo->image_height, + cinfo->num_components); + + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_DUPLICATE); + + /* We don't support files in which the image height is initially specified */ + /* as 0 and is later redefined by DNL. As long as we have to check that, */ + /* might as well have a general sanity check. */ + if (cinfo->image_height <= 0 || cinfo->image_width <= 0 + || cinfo->num_components <= 0) + ERREXIT(cinfo, JERR_EMPTY_IMAGE); + + if (length != (cinfo->num_components * 3)) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + if (cinfo->comp_info == NULL) /* do only once, even if suspend */ + cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * SIZEOF(jpeg_component_info)); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->component_index = ci; + INPUT_BYTE(cinfo, compptr->component_id, return FALSE); + INPUT_BYTE(cinfo, c, return FALSE); + compptr->h_samp_factor = (c >> 4) & 15; + compptr->v_samp_factor = (c ) & 15; + INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE); + + TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT, + compptr->component_id, compptr->h_samp_factor, + compptr->v_samp_factor, compptr->quant_tbl_no); + } + + cinfo->marker->saw_SOF = TRUE; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_sos (j_decompress_ptr cinfo) +/* Process a SOS marker */ +{ + INT32 length; + int i, ci, n, c, cc; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + if (! cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOS_NO_SOF); + + INPUT_2BYTES(cinfo, length, return FALSE); + + INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ + + TRACEMS1(cinfo, 1, JTRC_SOS, n); + + if (length != (n * 2 + 6) || n > MAX_COMPS_IN_SCAN || + (n == 0 && !cinfo->progressive_mode)) + /* pseudo SOS marker only allowed in progressive mode */ + ERREXIT(cinfo, JERR_BAD_LENGTH); + + cinfo->comps_in_scan = n; + + /* Collect the component-spec parameters */ + + for (i = 0; i < n; i++) { + INPUT_BYTE(cinfo, cc, return FALSE); + INPUT_BYTE(cinfo, c, return FALSE); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (cc == compptr->component_id) + goto id_found; + } + + ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); + + id_found: + + cinfo->cur_comp_info[i] = compptr; + compptr->dc_tbl_no = (c >> 4) & 15; + compptr->ac_tbl_no = (c ) & 15; + + TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, + compptr->dc_tbl_no, compptr->ac_tbl_no); + } + + /* Collect the additional scan parameters Ss, Se, Ah/Al. */ + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Ss = c; + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Se = c; + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Ah = (c >> 4) & 15; + cinfo->Al = (c ) & 15; + + TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, + cinfo->Ah, cinfo->Al); + + /* Prepare to scan data & restart markers */ + cinfo->marker->next_restart_num = 0; + + /* Count another (non-pseudo) SOS marker */ + if (n) cinfo->input_scan_number++; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +#ifdef D_ARITH_CODING_SUPPORTED + +LOCAL(boolean) +get_dac (j_decompress_ptr cinfo) +/* Process a DAC marker */ +{ + INT32 length; + int index, val; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + INPUT_BYTE(cinfo, index, return FALSE); + INPUT_BYTE(cinfo, val, return FALSE); + + length -= 2; + + TRACEMS2(cinfo, 1, JTRC_DAC, index, val); + + if (index < 0 || index >= (2*NUM_ARITH_TBLS)) + ERREXIT1(cinfo, JERR_DAC_INDEX, index); + + if (index >= NUM_ARITH_TBLS) { /* define AC table */ + cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; + } else { /* define DC table */ + cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); + cinfo->arith_dc_U[index] = (UINT8) (val >> 4); + if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) + ERREXIT1(cinfo, JERR_DAC_VALUE, val); + } + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + +#else /* ! D_ARITH_CODING_SUPPORTED */ + +#define get_dac(cinfo) skip_variable(cinfo) + +#endif /* D_ARITH_CODING_SUPPORTED */ + + +LOCAL(boolean) +get_dht (j_decompress_ptr cinfo) +/* Process a DHT marker */ +{ + INT32 length; + UINT8 bits[17]; + UINT8 huffval[256]; + int i, index, count; + JHUFF_TBL **htblptr; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 16) { + INPUT_BYTE(cinfo, index, return FALSE); + + TRACEMS1(cinfo, 1, JTRC_DHT, index); + + bits[0] = 0; + count = 0; + for (i = 1; i <= 16; i++) { + INPUT_BYTE(cinfo, bits[i], return FALSE); + count += bits[i]; + } + + length -= 1 + 16; + + TRACEMS8(cinfo, 2, JTRC_HUFFBITS, + bits[1], bits[2], bits[3], bits[4], + bits[5], bits[6], bits[7], bits[8]); + TRACEMS8(cinfo, 2, JTRC_HUFFBITS, + bits[9], bits[10], bits[11], bits[12], + bits[13], bits[14], bits[15], bits[16]); + + /* Here we just do minimal validation of the counts to avoid walking + * off the end of our table space. jdhuff.c will check more carefully. + */ + if (count > 256 || ((INT32) count) > length) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + + for (i = 0; i < count; i++) + INPUT_BYTE(cinfo, huffval[i], return FALSE); + + length -= count; + + if (index & 0x10) { /* AC table definition */ + index -= 0x10; + htblptr = &cinfo->ac_huff_tbl_ptrs[index]; + } else { /* DC table definition */ + htblptr = &cinfo->dc_huff_tbl_ptrs[index]; + } + + if (index < 0 || index >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_DHT_INDEX, index); + + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_dqt (j_decompress_ptr cinfo) +/* Process a DQT marker */ +{ + INT32 length, count, i; + int n, prec; + unsigned int tmp; + JQUANT_TBL *quant_ptr; + const int *natural_order; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + length--; + INPUT_BYTE(cinfo, n, return FALSE); + prec = n >> 4; + n &= 0x0F; + + TRACEMS2(cinfo, 1, JTRC_DQT, n, prec); + + if (n >= NUM_QUANT_TBLS) + ERREXIT1(cinfo, JERR_DQT_INDEX, n); + + if (cinfo->quant_tbl_ptrs[n] == NULL) + cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); + quant_ptr = cinfo->quant_tbl_ptrs[n]; + + if (prec) { + if (length < DCTSIZE2 * 2) { + /* Initialize full table for safety. */ + for (i = 0; i < DCTSIZE2; i++) { + quant_ptr->quantval[i] = 1; + } + count = length >> 1; + } else + count = DCTSIZE2; + } else { + if (length < DCTSIZE2) { + /* Initialize full table for safety. */ + for (i = 0; i < DCTSIZE2; i++) { + quant_ptr->quantval[i] = 1; + } + count = length; + } else + count = DCTSIZE2; + } + + switch (count) { + case (2*2): natural_order = jpeg_natural_order2; break; + case (3*3): natural_order = jpeg_natural_order3; break; + case (4*4): natural_order = jpeg_natural_order4; break; + case (5*5): natural_order = jpeg_natural_order5; break; + case (6*6): natural_order = jpeg_natural_order6; break; + case (7*7): natural_order = jpeg_natural_order7; break; + default: natural_order = jpeg_natural_order; break; + } + + for (i = 0; i < count; i++) { + if (prec) + INPUT_2BYTES(cinfo, tmp, return FALSE); + else + INPUT_BYTE(cinfo, tmp, return FALSE); + /* We convert the zigzag-order table to natural array order. */ + quant_ptr->quantval[natural_order[i]] = (UINT16) tmp; + } + + if (cinfo->err->trace_level >= 2) { + for (i = 0; i < DCTSIZE2; i += 8) { + TRACEMS8(cinfo, 2, JTRC_QUANTVALS, + quant_ptr->quantval[i], quant_ptr->quantval[i+1], + quant_ptr->quantval[i+2], quant_ptr->quantval[i+3], + quant_ptr->quantval[i+4], quant_ptr->quantval[i+5], + quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]); + } + } + + length -= count; + if (prec) length -= count; + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_dri (j_decompress_ptr cinfo) +/* Process a DRI marker */ +{ + INT32 length; + unsigned int tmp; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + + if (length != 4) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_2BYTES(cinfo, tmp, return FALSE); + + TRACEMS1(cinfo, 1, JTRC_DRI, tmp); + + cinfo->restart_interval = tmp; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +/* + * Routines for processing APPn and COM markers. + * These are either saved in memory or discarded, per application request. + * APP0 and APP14 are specially checked to see if they are + * JFIF and Adobe markers, respectively. + */ + +#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */ +#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */ +#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */ + + +LOCAL(void) +examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data, + unsigned int datalen, INT32 remaining) +/* Examine first few bytes from an APP0. + * Take appropriate action if it is a JFIF marker. + * datalen is # of bytes at data[], remaining is length of rest of marker data. + */ +{ + INT32 totallen = (INT32) datalen + remaining; + + if (datalen >= APP0_DATA_LEN && + GETJOCTET(data[0]) == 0x4A && + GETJOCTET(data[1]) == 0x46 && + GETJOCTET(data[2]) == 0x49 && + GETJOCTET(data[3]) == 0x46 && + GETJOCTET(data[4]) == 0) { + /* Found JFIF APP0 marker: save info */ + cinfo->saw_JFIF_marker = TRUE; + cinfo->JFIF_major_version = GETJOCTET(data[5]); + cinfo->JFIF_minor_version = GETJOCTET(data[6]); + cinfo->density_unit = GETJOCTET(data[7]); + cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); + cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); + /* Check version. + * Major version must be 1, anything else signals an incompatible change. + * (We used to treat this as an error, but now it's a nonfatal warning, + * because some bozo at Hijaak couldn't read the spec.) + * Minor version should be 0..2, but process anyway if newer. + */ + if (cinfo->JFIF_major_version != 1) + WARNMS2(cinfo, JWRN_JFIF_MAJOR, + cinfo->JFIF_major_version, cinfo->JFIF_minor_version); + /* Generate trace messages */ + TRACEMS5(cinfo, 1, JTRC_JFIF, + cinfo->JFIF_major_version, cinfo->JFIF_minor_version, + cinfo->X_density, cinfo->Y_density, cinfo->density_unit); + /* Validate thumbnail dimensions and issue appropriate messages */ + if (GETJOCTET(data[12]) | GETJOCTET(data[13])) + TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, + GETJOCTET(data[12]), GETJOCTET(data[13])); + totallen -= APP0_DATA_LEN; + if (totallen != + ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3)) + TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen); + } else if (datalen >= 6 && + GETJOCTET(data[0]) == 0x4A && + GETJOCTET(data[1]) == 0x46 && + GETJOCTET(data[2]) == 0x58 && + GETJOCTET(data[3]) == 0x58 && + GETJOCTET(data[4]) == 0) { + /* Found JFIF "JFXX" extension APP0 marker */ + /* The library doesn't actually do anything with these, + * but we try to produce a helpful trace message. + */ + switch (GETJOCTET(data[5])) { + case 0x10: + TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen); + break; + case 0x11: + TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen); + break; + case 0x13: + TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen); + break; + default: + TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, + GETJOCTET(data[5]), (int) totallen); + break; + } + } else { + /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ + TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen); + } +} + + +LOCAL(void) +examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data, + unsigned int datalen, INT32 remaining) +/* Examine first few bytes from an APP14. + * Take appropriate action if it is an Adobe marker. + * datalen is # of bytes at data[], remaining is length of rest of marker data. + */ +{ + unsigned int version, flags0, flags1, transform; + + if (datalen >= APP14_DATA_LEN && + GETJOCTET(data[0]) == 0x41 && + GETJOCTET(data[1]) == 0x64 && + GETJOCTET(data[2]) == 0x6F && + GETJOCTET(data[3]) == 0x62 && + GETJOCTET(data[4]) == 0x65) { + /* Found Adobe APP14 marker */ + version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); + flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); + flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); + transform = GETJOCTET(data[11]); + TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); + cinfo->saw_Adobe_marker = TRUE; + cinfo->Adobe_transform = (UINT8) transform; + } else { + /* Start of APP14 does not match "Adobe", or too short */ + TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining)); + } +} + + +METHODDEF(boolean) +get_interesting_appn (j_decompress_ptr cinfo) +/* Process an APP0 or APP14 marker without saving it */ +{ + INT32 length; + JOCTET b[APPN_DATA_LEN]; + unsigned int i, numtoread; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + /* get the interesting part of the marker data */ + if (length >= APPN_DATA_LEN) + numtoread = APPN_DATA_LEN; + else if (length > 0) + numtoread = (unsigned int) length; + else + numtoread = 0; + for (i = 0; i < numtoread; i++) + INPUT_BYTE(cinfo, b[i], return FALSE); + length -= numtoread; + + /* process it */ + switch (cinfo->unread_marker) { + case M_APP0: + examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length); + break; + case M_APP14: + examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length); + break; + default: + /* can't get here unless jpeg_save_markers chooses wrong processor */ + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); + break; + } + + /* skip any remaining data -- could be lots */ + INPUT_SYNC(cinfo); + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + + +#ifdef SAVE_MARKERS_SUPPORTED + +METHODDEF(boolean) +save_marker (j_decompress_ptr cinfo) +/* Save an APPn or COM marker into the marker list */ +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + jpeg_saved_marker_ptr cur_marker = marker->cur_marker; + unsigned int bytes_read, data_length; + JOCTET FAR * data; + INT32 length = 0; + INPUT_VARS(cinfo); + + if (cur_marker == NULL) { + /* begin reading a marker */ + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + if (length >= 0) { /* watch out for bogus length word */ + /* figure out how much we want to save */ + unsigned int limit; + if (cinfo->unread_marker == (int) M_COM) + limit = marker->length_limit_COM; + else + limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0]; + if ((unsigned int) length < limit) + limit = (unsigned int) length; + /* allocate and initialize the marker item */ + cur_marker = (jpeg_saved_marker_ptr) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(struct jpeg_marker_struct) + limit); + cur_marker->next = NULL; + cur_marker->marker = (UINT8) cinfo->unread_marker; + cur_marker->original_length = (unsigned int) length; + cur_marker->data_length = limit; + /* data area is just beyond the jpeg_marker_struct */ + data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1); + marker->cur_marker = cur_marker; + marker->bytes_read = 0; + bytes_read = 0; + data_length = limit; + } else { + /* deal with bogus length word */ + bytes_read = data_length = 0; + data = NULL; + } + } else { + /* resume reading a marker */ + bytes_read = marker->bytes_read; + data_length = cur_marker->data_length; + data = cur_marker->data + bytes_read; + } + + while (bytes_read < data_length) { + INPUT_SYNC(cinfo); /* move the restart point to here */ + marker->bytes_read = bytes_read; + /* If there's not at least one byte in buffer, suspend */ + MAKE_BYTE_AVAIL(cinfo, return FALSE); + /* Copy bytes with reasonable rapidity */ + while (bytes_read < data_length && bytes_in_buffer > 0) { + *data++ = *next_input_byte++; + bytes_in_buffer--; + bytes_read++; + } + } + + /* Done reading what we want to read */ + if (cur_marker != NULL) { /* will be NULL if bogus length word */ + /* Add new marker to end of list */ + if (cinfo->marker_list == NULL) { + cinfo->marker_list = cur_marker; + } else { + jpeg_saved_marker_ptr prev = cinfo->marker_list; + while (prev->next != NULL) + prev = prev->next; + prev->next = cur_marker; + } + /* Reset pointer & calc remaining data length */ + data = cur_marker->data; + length = cur_marker->original_length - data_length; + } + /* Reset to initial state for next marker */ + marker->cur_marker = NULL; + + /* Process the marker if interesting; else just make a generic trace msg */ + switch (cinfo->unread_marker) { + case M_APP0: + examine_app0(cinfo, data, data_length, length); + break; + case M_APP14: + examine_app14(cinfo, data, data_length, length); + break; + default: + TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, + (int) (data_length + length)); + break; + } + + /* skip any remaining data -- could be lots */ + INPUT_SYNC(cinfo); /* do before skip_input_data */ + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + +#endif /* SAVE_MARKERS_SUPPORTED */ + + +METHODDEF(boolean) +skip_variable (j_decompress_ptr cinfo) +/* Skip over an unknown or uninteresting variable-length marker */ +{ + INT32 length; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length); + + INPUT_SYNC(cinfo); /* do before skip_input_data */ + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + + +/* + * Find the next JPEG marker, save it in cinfo->unread_marker. + * Returns FALSE if had to suspend before reaching a marker; + * in that case cinfo->unread_marker is unchanged. + * + * Note that the result might not be a valid marker code, + * but it will never be 0 or FF. + */ + +LOCAL(boolean) +next_marker (j_decompress_ptr cinfo) +{ + int c; + INPUT_VARS(cinfo); + + for (;;) { + INPUT_BYTE(cinfo, c, return FALSE); + /* Skip any non-FF bytes. + * This may look a bit inefficient, but it will not occur in a valid file. + * We sync after each discarded byte so that a suspending data source + * can discard the byte from its buffer. + */ + while (c != 0xFF) { + cinfo->marker->discarded_bytes++; + INPUT_SYNC(cinfo); + INPUT_BYTE(cinfo, c, return FALSE); + } + /* This loop swallows any duplicate FF bytes. Extra FFs are legal as + * pad bytes, so don't count them in discarded_bytes. We assume there + * will not be so many consecutive FF bytes as to overflow a suspending + * data source's input buffer. + */ + do { + INPUT_BYTE(cinfo, c, return FALSE); + } while (c == 0xFF); + if (c != 0) + break; /* found a valid marker, exit loop */ + /* Reach here if we found a stuffed-zero data sequence (FF/00). + * Discard it and loop back to try again. + */ + cinfo->marker->discarded_bytes += 2; + INPUT_SYNC(cinfo); + } + + if (cinfo->marker->discarded_bytes != 0) { + WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); + cinfo->marker->discarded_bytes = 0; + } + + cinfo->unread_marker = c; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +first_marker (j_decompress_ptr cinfo) +/* Like next_marker, but used to obtain the initial SOI marker. */ +/* For this marker, we do not allow preceding garbage or fill; otherwise, + * we might well scan an entire input file before realizing it ain't JPEG. + * If an application wants to process non-JFIF files, it must seek to the + * SOI before calling the JPEG library. + */ +{ + int c, c2; + INPUT_VARS(cinfo); + + INPUT_BYTE(cinfo, c, return FALSE); + INPUT_BYTE(cinfo, c2, return FALSE); + if (c != 0xFF || c2 != (int) M_SOI) + ERREXIT2(cinfo, JERR_NO_SOI, c, c2); + + cinfo->unread_marker = c2; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +/* + * Read markers until SOS or EOI. + * + * Returns same codes as are defined for jpeg_consume_input: + * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + * + * Note: This function may return a pseudo SOS marker (with zero + * component number) for treat by input controller's consume_input. + * consume_input itself should filter out (skip) the pseudo marker + * after processing for the caller. + */ + +METHODDEF(int) +read_markers (j_decompress_ptr cinfo) +{ + /* Outer loop repeats once for each marker. */ + for (;;) { + /* Collect the marker proper, unless we already did. */ + /* NB: first_marker() enforces the requirement that SOI appear first. */ + if (cinfo->unread_marker == 0) { + if (! cinfo->marker->saw_SOI) { + if (! first_marker(cinfo)) + return JPEG_SUSPENDED; + } else { + if (! next_marker(cinfo)) + return JPEG_SUSPENDED; + } + } + /* At this point cinfo->unread_marker contains the marker code and the + * input point is just past the marker proper, but before any parameters. + * A suspension will cause us to return with this state still true. + */ + switch (cinfo->unread_marker) { + case M_SOI: + if (! get_soi(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_SOF0: /* Baseline */ + if (! get_sof(cinfo, TRUE, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF1: /* Extended sequential, Huffman */ + if (! get_sof(cinfo, FALSE, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF2: /* Progressive, Huffman */ + if (! get_sof(cinfo, FALSE, TRUE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF9: /* Extended sequential, arithmetic */ + if (! get_sof(cinfo, FALSE, FALSE, TRUE)) + return JPEG_SUSPENDED; + break; + + case M_SOF10: /* Progressive, arithmetic */ + if (! get_sof(cinfo, FALSE, TRUE, TRUE)) + return JPEG_SUSPENDED; + break; + + /* Currently unsupported SOFn types */ + case M_SOF3: /* Lossless, Huffman */ + case M_SOF5: /* Differential sequential, Huffman */ + case M_SOF6: /* Differential progressive, Huffman */ + case M_SOF7: /* Differential lossless, Huffman */ + case M_JPG: /* Reserved for JPEG extensions */ + case M_SOF11: /* Lossless, arithmetic */ + case M_SOF13: /* Differential sequential, arithmetic */ + case M_SOF14: /* Differential progressive, arithmetic */ + case M_SOF15: /* Differential lossless, arithmetic */ + ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker); + break; + + case M_SOS: + if (! get_sos(cinfo)) + return JPEG_SUSPENDED; + cinfo->unread_marker = 0; /* processed the marker */ + return JPEG_REACHED_SOS; + + case M_EOI: + TRACEMS(cinfo, 1, JTRC_EOI); + cinfo->unread_marker = 0; /* processed the marker */ + return JPEG_REACHED_EOI; + + case M_DAC: + if (! get_dac(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DHT: + if (! get_dht(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DQT: + if (! get_dqt(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DRI: + if (! get_dri(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_APP0: + case M_APP1: + case M_APP2: + case M_APP3: + case M_APP4: + case M_APP5: + case M_APP6: + case M_APP7: + case M_APP8: + case M_APP9: + case M_APP10: + case M_APP11: + case M_APP12: + case M_APP13: + case M_APP14: + case M_APP15: + if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[ + cinfo->unread_marker - (int) M_APP0]) (cinfo)) + return JPEG_SUSPENDED; + break; + + case M_COM: + if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo)) + return JPEG_SUSPENDED; + break; + + case M_RST0: /* these are all parameterless */ + case M_RST1: + case M_RST2: + case M_RST3: + case M_RST4: + case M_RST5: + case M_RST6: + case M_RST7: + case M_TEM: + TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker); + break; + + case M_DNL: /* Ignore DNL ... perhaps the wrong thing */ + if (! skip_variable(cinfo)) + return JPEG_SUSPENDED; + break; + + default: /* must be DHP, EXP, JPGn, or RESn */ + /* For now, we treat the reserved markers as fatal errors since they are + * likely to be used to signal incompatible JPEG Part 3 extensions. + * Once the JPEG 3 version-number marker is well defined, this code + * ought to change! + */ + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); + break; + } + /* Successfully processed marker, so reset state variable */ + cinfo->unread_marker = 0; + } /* end loop */ +} + + +/* + * Read a restart marker, which is expected to appear next in the datastream; + * if the marker is not there, take appropriate recovery action. + * Returns FALSE if suspension is required. + * + * This is called by the entropy decoder after it has read an appropriate + * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder + * has already read a marker from the data source. Under normal conditions + * cinfo->unread_marker will be reset to 0 before returning; if not reset, + * it holds a marker which the decoder will be unable to read past. + */ + +METHODDEF(boolean) +read_restart_marker (j_decompress_ptr cinfo) +{ + /* Obtain a marker unless we already did. */ + /* Note that next_marker will complain if it skips any data. */ + if (cinfo->unread_marker == 0) { + if (! next_marker(cinfo)) + return FALSE; + } + + if (cinfo->unread_marker == + ((int) M_RST0 + cinfo->marker->next_restart_num)) { + /* Normal case --- swallow the marker and let entropy decoder continue */ + TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num); + cinfo->unread_marker = 0; + } else { + /* Uh-oh, the restart markers have been messed up. */ + /* Let the data source manager determine how to resync. */ + if (! (*cinfo->src->resync_to_restart) (cinfo, + cinfo->marker->next_restart_num)) + return FALSE; + } + + /* Update next-restart state */ + cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7; + + return TRUE; +} + + +/* + * This is the default resync_to_restart method for data source managers + * to use if they don't have any better approach. Some data source managers + * may be able to back up, or may have additional knowledge about the data + * which permits a more intelligent recovery strategy; such managers would + * presumably supply their own resync method. + * + * read_restart_marker calls resync_to_restart if it finds a marker other than + * the restart marker it was expecting. (This code is *not* used unless + * a nonzero restart interval has been declared.) cinfo->unread_marker is + * the marker code actually found (might be anything, except 0 or FF). + * The desired restart marker number (0..7) is passed as a parameter. + * This routine is supposed to apply whatever error recovery strategy seems + * appropriate in order to position the input stream to the next data segment. + * Note that cinfo->unread_marker is treated as a marker appearing before + * the current data-source input point; usually it should be reset to zero + * before returning. + * Returns FALSE if suspension is required. + * + * This implementation is substantially constrained by wanting to treat the + * input as a data stream; this means we can't back up. Therefore, we have + * only the following actions to work with: + * 1. Simply discard the marker and let the entropy decoder resume at next + * byte of file. + * 2. Read forward until we find another marker, discarding intervening + * data. (In theory we could look ahead within the current bufferload, + * without having to discard data if we don't find the desired marker. + * This idea is not implemented here, in part because it makes behavior + * dependent on buffer size and chance buffer-boundary positions.) + * 3. Leave the marker unread (by failing to zero cinfo->unread_marker). + * This will cause the entropy decoder to process an empty data segment, + * inserting dummy zeroes, and then we will reprocess the marker. + * + * #2 is appropriate if we think the desired marker lies ahead, while #3 is + * appropriate if the found marker is a future restart marker (indicating + * that we have missed the desired restart marker, probably because it got + * corrupted). + * We apply #2 or #3 if the found marker is a restart marker no more than + * two counts behind or ahead of the expected one. We also apply #2 if the + * found marker is not a legal JPEG marker code (it's certainly bogus data). + * If the found marker is a restart marker more than 2 counts away, we do #1 + * (too much risk that the marker is erroneous; with luck we will be able to + * resync at some future point). + * For any valid non-restart JPEG marker, we apply #3. This keeps us from + * overrunning the end of a scan. An implementation limited to single-scan + * files might find it better to apply #2 for markers other than EOI, since + * any other marker would have to be bogus data in that case. + */ + +GLOBAL(boolean) +jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired) +{ + int marker = cinfo->unread_marker; + int action = 1; + + /* Always put up a warning. */ + WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired); + + /* Outer loop handles repeated decision after scanning forward. */ + for (;;) { + if (marker < (int) M_SOF0) + action = 2; /* invalid marker */ + else if (marker < (int) M_RST0 || marker > (int) M_RST7) + action = 3; /* valid non-restart marker */ + else { + if (marker == ((int) M_RST0 + ((desired+1) & 7)) || + marker == ((int) M_RST0 + ((desired+2) & 7))) + action = 3; /* one of the next two expected restarts */ + else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || + marker == ((int) M_RST0 + ((desired-2) & 7))) + action = 2; /* a prior restart, so advance */ + else + action = 1; /* desired restart or too far away */ + } + TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action); + switch (action) { + case 1: + /* Discard marker and let entropy decoder resume processing. */ + cinfo->unread_marker = 0; + return TRUE; + case 2: + /* Scan to the next marker, and repeat the decision loop. */ + if (! next_marker(cinfo)) + return FALSE; + marker = cinfo->unread_marker; + break; + case 3: + /* Return without advancing past this marker. */ + /* Entropy decoder will be forced to process an empty segment. */ + return TRUE; + } + } /* end loop */ +} + + +/* + * Reset marker processing state to begin a fresh datastream. + */ + +METHODDEF(void) +reset_marker_reader (j_decompress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + cinfo->comp_info = NULL; /* until allocated by get_sof */ + cinfo->input_scan_number = 0; /* no SOS seen yet */ + cinfo->unread_marker = 0; /* no pending marker */ + marker->pub.saw_SOI = FALSE; /* set internal state too */ + marker->pub.saw_SOF = FALSE; + marker->pub.discarded_bytes = 0; + marker->cur_marker = NULL; +} + + +/* + * Initialize the marker reader module. + * This is called only once, when the decompression object is created. + */ + +GLOBAL(void) +jinit_marker_reader (j_decompress_ptr cinfo) +{ + my_marker_ptr marker; + int i; + + /* Create subobject in permanent pool */ + marker = (my_marker_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_marker_reader)); + cinfo->marker = (struct jpeg_marker_reader *) marker; + /* Initialize public method pointers */ + marker->pub.reset_marker_reader = reset_marker_reader; + marker->pub.read_markers = read_markers; + marker->pub.read_restart_marker = read_restart_marker; + /* Initialize COM/APPn processing. + * By default, we examine and then discard APP0 and APP14, + * but simply discard COM and all other APPn. + */ + marker->process_COM = skip_variable; + marker->length_limit_COM = 0; + for (i = 0; i < 16; i++) { + marker->process_APPn[i] = skip_variable; + marker->length_limit_APPn[i] = 0; + } + marker->process_APPn[0] = get_interesting_appn; + marker->process_APPn[14] = get_interesting_appn; + /* Reset marker processing state */ + reset_marker_reader(cinfo); +} + + +/* + * Control saving of COM and APPn markers into marker_list. + */ + +#ifdef SAVE_MARKERS_SUPPORTED + +GLOBAL(void) +jpeg_save_markers (j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + long maxlength; + jpeg_marker_parser_method processor; + + /* Length limit mustn't be larger than what we can allocate + * (should only be a concern in a 16-bit environment). + */ + maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct); + if (((long) length_limit) > maxlength) + length_limit = (unsigned int) maxlength; + + /* Choose processor routine to use. + * APP0/APP14 have special requirements. + */ + if (length_limit) { + processor = save_marker; + /* If saving APP0/APP14, save at least enough for our internal use. */ + if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN) + length_limit = APP0_DATA_LEN; + else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN) + length_limit = APP14_DATA_LEN; + } else { + processor = skip_variable; + /* If discarding APP0/APP14, use our regular on-the-fly processor. */ + if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14) + processor = get_interesting_appn; + } + + if (marker_code == (int) M_COM) { + marker->process_COM = processor; + marker->length_limit_COM = length_limit; + } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) { + marker->process_APPn[marker_code - (int) M_APP0] = processor; + marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit; + } else + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); +} + +#endif /* SAVE_MARKERS_SUPPORTED */ + + +/* + * Install a special processing method for COM or APPn markers. + */ + +GLOBAL(void) +jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + if (marker_code == (int) M_COM) + marker->process_COM = routine; + else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) + marker->process_APPn[marker_code - (int) M_APP0] = routine; + else + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); +} diff --git a/src/3rdparty/libjpeg/jdmaster.c b/src/3rdparty/libjpeg/jdmaster.c new file mode 100644 index 0000000000..8c1146e4fe --- /dev/null +++ b/src/3rdparty/libjpeg/jdmaster.c @@ -0,0 +1,533 @@ +/* + * jdmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains master control logic for the JPEG decompressor. + * These routines are concerned with selecting the modules to be executed + * and with determining the number of passes and the work to be done in each + * pass. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_decomp_master pub; /* public fields */ + + int pass_number; /* # of passes completed */ + + boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */ + + /* Saved references to initialized quantizer modules, + * in case we need to switch modes. + */ + struct jpeg_color_quantizer * quantizer_1pass; + struct jpeg_color_quantizer * quantizer_2pass; +} my_decomp_master; + +typedef my_decomp_master * my_master_ptr; + + +/* + * Determine whether merged upsample/color conversion should be used. + * CRUCIAL: this must match the actual capabilities of jdmerge.c! + */ + +LOCAL(boolean) +use_merged_upsample (j_decompress_ptr cinfo) +{ +#ifdef UPSAMPLE_MERGING_SUPPORTED + /* Merging is the equivalent of plain box-filter upsampling */ + if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling) + return FALSE; + /* jdmerge.c only supports YCC=>RGB color conversion */ + if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 || + cinfo->out_color_space != JCS_RGB || + cinfo->out_color_components != RGB_PIXELSIZE) + return FALSE; + /* and it only handles 2h1v or 2h2v sampling ratios */ + if (cinfo->comp_info[0].h_samp_factor != 2 || + cinfo->comp_info[1].h_samp_factor != 1 || + cinfo->comp_info[2].h_samp_factor != 1 || + cinfo->comp_info[0].v_samp_factor > 2 || + cinfo->comp_info[1].v_samp_factor != 1 || + cinfo->comp_info[2].v_samp_factor != 1) + return FALSE; + /* furthermore, it doesn't work if we've scaled the IDCTs differently */ + if (cinfo->comp_info[0].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[1].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[2].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[0].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size || + cinfo->comp_info[1].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size || + cinfo->comp_info[2].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size) + return FALSE; + /* ??? also need to test for upsample-time rescaling, when & if supported */ + return TRUE; /* by golly, it'll work... */ +#else + return FALSE; +#endif +} + + +/* + * Compute output image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + * Also note that it may be called before the master module is initialized! + */ + +GLOBAL(void) +jpeg_calc_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase. + * This function is used for full decompression. + */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; +#endif + + /* Prevent application from calling me at wrong times */ + if (cinfo->global_state != DSTATE_READY) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* Compute core output image dimensions and DCT scaling choices. */ + jpeg_core_output_dimensions(cinfo); + +#ifdef IDCT_SCALING_SUPPORTED + + /* In selecting the actual DCT scaling for each component, we try to + * scale up the chroma components via IDCT scaling rather than upsampling. + * This saves time if the upsampler gets to use 1:1 scaling. + * Note this code adapts subsampling ratios which are powers of 2. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + int ssize = 1; + while (cinfo->min_DCT_h_scaled_size * ssize <= + (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; + ssize = 1; + while (cinfo->min_DCT_v_scaled_size * ssize <= + (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; + + /* We don't support IDCT ratios larger than 2. */ + if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) + compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; + else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) + compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; + } + + /* Recompute downsampled dimensions of components; + * application needs to know these if using raw downsampled data. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Size in samples, after IDCT scaling */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * + (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * + (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + } + +#endif /* IDCT_SCALING_SUPPORTED */ + + /* Report number of components in selected colorspace. */ + /* Probably this should be in the color conversion module... */ + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + cinfo->out_color_components = 1; + break; + case JCS_RGB: +#if RGB_PIXELSIZE != 3 + cinfo->out_color_components = RGB_PIXELSIZE; + break; +#endif /* else share code with YCbCr */ + case JCS_YCbCr: + cinfo->out_color_components = 3; + break; + case JCS_CMYK: + case JCS_YCCK: + cinfo->out_color_components = 4; + break; + default: /* else must be same colorspace as in file */ + cinfo->out_color_components = cinfo->num_components; + break; + } + cinfo->output_components = (cinfo->quantize_colors ? 1 : + cinfo->out_color_components); + + /* See if upsampler will want to emit more than one row at a time */ + if (use_merged_upsample(cinfo)) + cinfo->rec_outbuf_height = cinfo->max_v_samp_factor; + else + cinfo->rec_outbuf_height = 1; +} + + +/* + * Several decompression processes need to range-limit values to the range + * 0..MAXJSAMPLE; the input value may fall somewhat outside this range + * due to noise introduced by quantization, roundoff error, etc. These + * processes are inner loops and need to be as fast as possible. On most + * machines, particularly CPUs with pipelines or instruction prefetch, + * a (subscript-check-less) C table lookup + * x = sample_range_limit[x]; + * is faster than explicit tests + * if (x < 0) x = 0; + * else if (x > MAXJSAMPLE) x = MAXJSAMPLE; + * These processes all use a common table prepared by the routine below. + * + * For most steps we can mathematically guarantee that the initial value + * of x is within MAXJSAMPLE+1 of the legal range, so a table running from + * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial + * limiting step (just after the IDCT), a wildly out-of-range value is + * possible if the input data is corrupt. To avoid any chance of indexing + * off the end of memory and getting a bad-pointer trap, we perform the + * post-IDCT limiting thus: + * x = range_limit[x & MASK]; + * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit + * samples. Under normal circumstances this is more than enough range and + * a correct output will be generated; with bogus input data the mask will + * cause wraparound, and we will safely generate a bogus-but-in-range output. + * For the post-IDCT step, we want to convert the data from signed to unsigned + * representation by adding CENTERJSAMPLE at the same time that we limit it. + * So the post-IDCT limiting table ends up looking like this: + * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE, + * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), + * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), + * 0,1,...,CENTERJSAMPLE-1 + * Negative inputs select values from the upper half of the table after + * masking. + * + * We can save some space by overlapping the start of the post-IDCT table + * with the simpler range limiting table. The post-IDCT table begins at + * sample_range_limit + CENTERJSAMPLE. + * + * Note that the table is allocated in near data space on PCs; it's small + * enough and used often enough to justify this. + */ + +LOCAL(void) +prepare_range_limit_table (j_decompress_ptr cinfo) +/* Allocate and fill in the sample_range_limit table */ +{ + JSAMPLE * table; + int i; + + table = (JSAMPLE *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE)); + table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */ + cinfo->sample_range_limit = table; + /* First segment of "simple" table: limit[x] = 0 for x < 0 */ + MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE)); + /* Main part of "simple" table: limit[x] = x */ + for (i = 0; i <= MAXJSAMPLE; i++) + table[i] = (JSAMPLE) i; + table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */ + /* End of simple table, rest of first half of post-IDCT table */ + for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) + table[i] = MAXJSAMPLE; + /* Second half of post-IDCT table */ + MEMZERO(table + (2 * (MAXJSAMPLE+1)), + (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE)); + MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE), + cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE)); +} + + +/* + * Master selection of decompression modules. + * This is done once at jpeg_start_decompress time. We determine + * which modules will be used and give them appropriate initialization calls. + * We also initialize the decompressor input side to begin consuming data. + * + * Since jpeg_read_header has finished, we know what is in the SOF + * and (first) SOS markers. We also have all the application parameter + * settings. + */ + +LOCAL(void) +master_selection (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + boolean use_c_buffer; + long samplesperrow; + JDIMENSION jd_samplesperrow; + + /* Initialize dimensions and other stuff */ + jpeg_calc_output_dimensions(cinfo); + prepare_range_limit_table(cinfo); + + /* Width of an output scanline must be representable as JDIMENSION. */ + samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components; + jd_samplesperrow = (JDIMENSION) samplesperrow; + if ((long) jd_samplesperrow != samplesperrow) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + + /* Initialize my private state */ + master->pass_number = 0; + master->using_merged_upsample = use_merged_upsample(cinfo); + + /* Color quantizer selection */ + master->quantizer_1pass = NULL; + master->quantizer_2pass = NULL; + /* No mode changes if not using buffered-image mode. */ + if (! cinfo->quantize_colors || ! cinfo->buffered_image) { + cinfo->enable_1pass_quant = FALSE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; + } + if (cinfo->quantize_colors) { + if (cinfo->raw_data_out) + ERREXIT(cinfo, JERR_NOTIMPL); + /* 2-pass quantizer only works in 3-component color space. */ + if (cinfo->out_color_components != 3) { + cinfo->enable_1pass_quant = TRUE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; + cinfo->colormap = NULL; + } else if (cinfo->colormap != NULL) { + cinfo->enable_external_quant = TRUE; + } else if (cinfo->two_pass_quantize) { + cinfo->enable_2pass_quant = TRUE; + } else { + cinfo->enable_1pass_quant = TRUE; + } + + if (cinfo->enable_1pass_quant) { +#ifdef QUANT_1PASS_SUPPORTED + jinit_1pass_quantizer(cinfo); + master->quantizer_1pass = cinfo->cquantize; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + + /* We use the 2-pass code to map to external colormaps. */ + if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) { +#ifdef QUANT_2PASS_SUPPORTED + jinit_2pass_quantizer(cinfo); + master->quantizer_2pass = cinfo->cquantize; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + /* If both quantizers are initialized, the 2-pass one is left active; + * this is necessary for starting with quantization to an external map. + */ + } + + /* Post-processing: in particular, color conversion first */ + if (! cinfo->raw_data_out) { + if (master->using_merged_upsample) { +#ifdef UPSAMPLE_MERGING_SUPPORTED + jinit_merged_upsampler(cinfo); /* does color conversion too */ +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + jinit_color_deconverter(cinfo); + jinit_upsampler(cinfo); + } + jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant); + } + /* Inverse DCT */ + jinit_inverse_dct(cinfo); + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_decoder(cinfo); + else { + jinit_huff_decoder(cinfo); + } + + /* Initialize principal buffer controllers. */ + use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image; + jinit_d_coef_controller(cinfo, use_c_buffer); + + if (! cinfo->raw_data_out) + jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Initialize input side of decompressor to consume first scan. */ + (*cinfo->inputctl->start_input_pass) (cinfo); + +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* If jpeg_start_decompress will read the whole file, initialize + * progress monitoring appropriately. The input step is counted + * as one pass. + */ + if (cinfo->progress != NULL && ! cinfo->buffered_image && + cinfo->inputctl->has_multiple_scans) { + int nscans; + /* Estimate number of scans to set pass_limit. */ + if (cinfo->progressive_mode) { + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ + nscans = 2 + 3 * cinfo->num_components; + } else { + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ + nscans = cinfo->num_components; + } + cinfo->progress->pass_counter = 0L; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; + cinfo->progress->completed_passes = 0; + cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2); + /* Count the input pass as done */ + master->pass_number++; + } +#endif /* D_MULTISCAN_FILES_SUPPORTED */ +} + + +/* + * Per-pass setup. + * This is called at the beginning of each output pass. We determine which + * modules will be active during this pass and give them appropriate + * start_pass calls. We also set is_dummy_pass to indicate whether this + * is a "real" output pass or a dummy pass for color quantization. + * (In the latter case, jdapistd.c will crank the pass to completion.) + */ + +METHODDEF(void) +prepare_for_output_pass (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (master->pub.is_dummy_pass) { +#ifdef QUANT_2PASS_SUPPORTED + /* Final pass of 2-pass quantization */ + master->pub.is_dummy_pass = FALSE; + (*cinfo->cquantize->start_pass) (cinfo, FALSE); + (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST); + (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* QUANT_2PASS_SUPPORTED */ + } else { + if (cinfo->quantize_colors && cinfo->colormap == NULL) { + /* Select new quantization method */ + if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) { + cinfo->cquantize = master->quantizer_2pass; + master->pub.is_dummy_pass = TRUE; + } else if (cinfo->enable_1pass_quant) { + cinfo->cquantize = master->quantizer_1pass; + } else { + ERREXIT(cinfo, JERR_MODE_CHANGE); + } + } + (*cinfo->idct->start_pass) (cinfo); + (*cinfo->coef->start_output_pass) (cinfo); + if (! cinfo->raw_data_out) { + if (! master->using_merged_upsample) + (*cinfo->cconvert->start_pass) (cinfo); + (*cinfo->upsample->start_pass) (cinfo); + if (cinfo->quantize_colors) + (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass); + (*cinfo->post->start_pass) (cinfo, + (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); + (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); + } + } + + /* Set up progress monitor's pass info if present */ + if (cinfo->progress != NULL) { + cinfo->progress->completed_passes = master->pass_number; + cinfo->progress->total_passes = master->pass_number + + (master->pub.is_dummy_pass ? 2 : 1); + /* In buffered-image mode, we assume one more output pass if EOI not + * yet reached, but no more passes if EOI has been reached. + */ + if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) { + cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1); + } + } +} + + +/* + * Finish up at end of an output pass. + */ + +METHODDEF(void) +finish_output_pass (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (cinfo->quantize_colors) + (*cinfo->cquantize->finish_pass) (cinfo); + master->pass_number++; +} + + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Switch to a new external colormap between output passes. + */ + +GLOBAL(void) +jpeg_new_colormap (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + /* Prevent application from calling me at wrong times */ + if (cinfo->global_state != DSTATE_BUFIMAGE) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (cinfo->quantize_colors && cinfo->enable_external_quant && + cinfo->colormap != NULL) { + /* Select 2-pass quantizer for external colormap use */ + cinfo->cquantize = master->quantizer_2pass; + /* Notify quantizer of colormap change */ + (*cinfo->cquantize->new_color_map) (cinfo); + master->pub.is_dummy_pass = FALSE; /* just in case */ + } else + ERREXIT(cinfo, JERR_MODE_CHANGE); +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + + +/* + * Initialize master decompression control and select active modules. + * This is performed at the start of jpeg_start_decompress. + */ + +GLOBAL(void) +jinit_master_decompress (j_decompress_ptr cinfo) +{ + my_master_ptr master; + + master = (my_master_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_decomp_master)); + cinfo->master = (struct jpeg_decomp_master *) master; + master->pub.prepare_for_output_pass = prepare_for_output_pass; + master->pub.finish_output_pass = finish_output_pass; + + master->pub.is_dummy_pass = FALSE; + + master_selection(cinfo); +} diff --git a/src/3rdparty/libjpeg/jdmerge.c b/src/3rdparty/libjpeg/jdmerge.c new file mode 100644 index 0000000000..37444468c2 --- /dev/null +++ b/src/3rdparty/libjpeg/jdmerge.c @@ -0,0 +1,400 @@ +/* + * jdmerge.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains code for merged upsampling/color conversion. + * + * This file combines functions from jdsample.c and jdcolor.c; + * read those files first to understand what's going on. + * + * When the chroma components are to be upsampled by simple replication + * (ie, box filtering), we can save some work in color conversion by + * calculating all the output pixels corresponding to a pair of chroma + * samples at one time. In the conversion equations + * R = Y + K1 * Cr + * G = Y + K2 * Cb + K3 * Cr + * B = Y + K4 * Cb + * only the Y term varies among the group of pixels corresponding to a pair + * of chroma samples, so the rest of the terms can be calculated just once. + * At typical sampling ratios, this eliminates half or three-quarters of the + * multiplications needed for color conversion. + * + * This file currently provides implementations for the following cases: + * YCbCr => RGB color conversion only. + * Sampling ratios of 2h1v or 2h2v. + * No scaling needed at upsample time. + * Corner-aligned (non-CCIR601) sampling alignment. + * Other special cases could be added, but in most applications these are + * the only common cases. (For uncommon cases we fall back on the more + * general code in jdsample.c and jdcolor.c.) + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef UPSAMPLE_MERGING_SUPPORTED + + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Pointer to routine to do actual upsampling/conversion of one row group */ + JMETHOD(void, upmethod, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf)); + + /* Private state for YCC->RGB conversion */ + int * Cr_r_tab; /* => table for Cr to R conversion */ + int * Cb_b_tab; /* => table for Cb to B conversion */ + INT32 * Cr_g_tab; /* => table for Cr to G conversion */ + INT32 * Cb_g_tab; /* => table for Cb to G conversion */ + + /* For 2:1 vertical sampling, we produce two output rows at a time. + * We need a "spare" row buffer to hold the second output row if the + * application provides just a one-row buffer; we also use the spare + * to discard the dummy last row if the image height is odd. + */ + JSAMPROW spare_row; + boolean spare_full; /* T if spare buffer is occupied */ + + JDIMENSION out_row_width; /* samples per output row */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ +} my_upsampler; + +typedef my_upsampler * my_upsample_ptr; + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. + * This is taken directly from jdcolor.c; see that file for more info. + */ + +LOCAL(void) +build_ycc_rgb_table (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + int i; + INT32 x; + SHIFT_TEMPS + + upsample->Cr_r_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + upsample->Cb_b_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + upsample->Cr_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + upsample->Cb_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + + for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { + /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ + /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ + /* Cr=>R value is nearest int to 1.40200 * x */ + upsample->Cr_r_tab[i] = (int) + RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); + /* Cb=>B value is nearest int to 1.77200 * x */ + upsample->Cb_b_tab[i] = (int) + RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); + /* Cr=>G value is scaled-up -0.71414 * x */ + upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; + /* Cb=>G value is scaled-up -0.34414 * x */ + /* We also add in ONE_HALF so that need not do it in inner loop */ + upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; + } +} + + +/* + * Initialize for an upsampling pass. + */ + +METHODDEF(void) +start_pass_merged_upsample (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Mark the spare buffer empty */ + upsample->spare_full = FALSE; + /* Initialize total-height counter for detecting bottom of image */ + upsample->rows_to_go = cinfo->output_height; +} + + +/* + * Control routine to do upsampling (and color conversion). + * + * The control routine just handles the row buffering considerations. + */ + +METHODDEF(void) +merged_2v_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +/* 2:1 vertical sampling case: may need a spare row. */ +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + JSAMPROW work_ptrs[2]; + JDIMENSION num_rows; /* number of rows returned to caller */ + + if (upsample->spare_full) { + /* If we have a spare row saved from a previous cycle, just return it. */ + jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, + 1, upsample->out_row_width); + num_rows = 1; + upsample->spare_full = FALSE; + } else { + /* Figure number of rows to return to caller. */ + num_rows = 2; + /* Not more than the distance to the end of the image. */ + if (num_rows > upsample->rows_to_go) + num_rows = upsample->rows_to_go; + /* And not more than what the client can accept: */ + out_rows_avail -= *out_row_ctr; + if (num_rows > out_rows_avail) + num_rows = out_rows_avail; + /* Create output pointer array for upsampler. */ + work_ptrs[0] = output_buf[*out_row_ctr]; + if (num_rows > 1) { + work_ptrs[1] = output_buf[*out_row_ctr + 1]; + } else { + work_ptrs[1] = upsample->spare_row; + upsample->spare_full = TRUE; + } + /* Now do the upsampling. */ + (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); + } + + /* Adjust counts */ + *out_row_ctr += num_rows; + upsample->rows_to_go -= num_rows; + /* When the buffer is emptied, declare this input row group consumed */ + if (! upsample->spare_full) + (*in_row_group_ctr)++; +} + + +METHODDEF(void) +merged_1v_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +/* 1:1 vertical sampling case: much easier, never need a spare row. */ +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Just do the upsampling. */ + (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, + output_buf + *out_row_ctr); + /* Adjust counts */ + (*out_row_ctr)++; + (*in_row_group_ctr)++; +} + + +/* + * These are the routines invoked by the control routines to do + * the actual upsampling/conversion. One row group is processed per call. + * + * Note: since we may be writing directly into application-supplied buffers, + * we have to be honest about the output width; we can't assume the buffer + * has been rounded up to an even width. + */ + + +/* + * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. + */ + +METHODDEF(void) +h2v1_merged_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + register int y, cred, cgreen, cblue; + int cb, cr; + register JSAMPROW outptr; + JSAMPROW inptr0, inptr1, inptr2; + JDIMENSION col; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + int * Crrtab = upsample->Cr_r_tab; + int * Cbbtab = upsample->Cb_b_tab; + INT32 * Crgtab = upsample->Cr_g_tab; + INT32 * Cbgtab = upsample->Cb_g_tab; + SHIFT_TEMPS + + inptr0 = input_buf[0][in_row_group_ctr]; + inptr1 = input_buf[1][in_row_group_ctr]; + inptr2 = input_buf[2][in_row_group_ctr]; + outptr = output_buf[0]; + /* Loop for each pair of output pixels */ + for (col = cinfo->output_width >> 1; col > 0; col--) { + /* Do the chroma part of the calculation */ + cb = GETJSAMPLE(*inptr1++); + cr = GETJSAMPLE(*inptr2++); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + /* Fetch 2 Y values and emit 2 pixels */ + y = GETJSAMPLE(*inptr0++); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + outptr += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr0++); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + outptr += RGB_PIXELSIZE; + } + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + cb = GETJSAMPLE(*inptr1); + cr = GETJSAMPLE(*inptr2); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + y = GETJSAMPLE(*inptr0); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + } +} + + +/* + * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. + */ + +METHODDEF(void) +h2v2_merged_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + register int y, cred, cgreen, cblue; + int cb, cr; + register JSAMPROW outptr0, outptr1; + JSAMPROW inptr00, inptr01, inptr1, inptr2; + JDIMENSION col; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + int * Crrtab = upsample->Cr_r_tab; + int * Cbbtab = upsample->Cb_b_tab; + INT32 * Crgtab = upsample->Cr_g_tab; + INT32 * Cbgtab = upsample->Cb_g_tab; + SHIFT_TEMPS + + inptr00 = input_buf[0][in_row_group_ctr*2]; + inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; + inptr1 = input_buf[1][in_row_group_ctr]; + inptr2 = input_buf[2][in_row_group_ctr]; + outptr0 = output_buf[0]; + outptr1 = output_buf[1]; + /* Loop for each group of output pixels */ + for (col = cinfo->output_width >> 1; col > 0; col--) { + /* Do the chroma part of the calculation */ + cb = GETJSAMPLE(*inptr1++); + cr = GETJSAMPLE(*inptr2++); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + /* Fetch 4 Y values and emit 4 pixels */ + y = GETJSAMPLE(*inptr00++); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + outptr0 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr00++); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + outptr0 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr01++); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + outptr1 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr01++); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + outptr1 += RGB_PIXELSIZE; + } + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + cb = GETJSAMPLE(*inptr1); + cr = GETJSAMPLE(*inptr2); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + y = GETJSAMPLE(*inptr00); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + y = GETJSAMPLE(*inptr01); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + } +} + + +/* + * Module initialization routine for merged upsampling/color conversion. + * + * NB: this is called under the conditions determined by use_merged_upsample() + * in jdmaster.c. That routine MUST correspond to the actual capabilities + * of this module; no safety checks are made here. + */ + +GLOBAL(void) +jinit_merged_upsampler (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample; + + upsample = (my_upsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_upsampler)); + cinfo->upsample = (struct jpeg_upsampler *) upsample; + upsample->pub.start_pass = start_pass_merged_upsample; + upsample->pub.need_context_rows = FALSE; + + upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; + + if (cinfo->max_v_samp_factor == 2) { + upsample->pub.upsample = merged_2v_upsample; + upsample->upmethod = h2v2_merged_upsample; + /* Allocate a spare row buffer */ + upsample->spare_row = (JSAMPROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); + } else { + upsample->pub.upsample = merged_1v_upsample; + upsample->upmethod = h2v1_merged_upsample; + /* No spare row needed */ + upsample->spare_row = NULL; + } + + build_ycc_rgb_table(cinfo); +} + +#endif /* UPSAMPLE_MERGING_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jdpostct.c b/src/3rdparty/libjpeg/jdpostct.c new file mode 100644 index 0000000000..571563d728 --- /dev/null +++ b/src/3rdparty/libjpeg/jdpostct.c @@ -0,0 +1,290 @@ +/* + * jdpostct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the decompression postprocessing controller. + * This controller manages the upsampling, color conversion, and color + * quantization/reduction steps; specifically, it controls the buffering + * between upsample/color conversion and color quantization/reduction. + * + * If no color quantization/reduction is required, then this module has no + * work to do, and it just hands off to the upsample/color conversion code. + * An integrated upsample/convert/quantize process would replace this module + * entirely. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_post_controller pub; /* public fields */ + + /* Color quantization source buffer: this holds output data from + * the upsample/color conversion step to be passed to the quantizer. + * For two-pass color quantization, we need a full-image buffer; + * for one-pass operation, a strip buffer is sufficient. + */ + jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */ + JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */ + JDIMENSION strip_height; /* buffer size in rows */ + /* for two-pass mode only: */ + JDIMENSION starting_row; /* row # of first row in current strip */ + JDIMENSION next_row; /* index of next row to fill/empty in strip */ +} my_post_controller; + +typedef my_post_controller * my_post_ptr; + + +/* Forward declarations */ +METHODDEF(void) post_process_1pass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +#ifdef QUANT_2PASS_SUPPORTED +METHODDEF(void) post_process_prepass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +METHODDEF(void) post_process_2pass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +#endif + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (cinfo->quantize_colors) { + /* Single-pass processing with color quantization. */ + post->pub.post_process_data = post_process_1pass; + /* We could be doing buffered-image output before starting a 2-pass + * color quantization; in that case, jinit_d_post_controller did not + * allocate a strip buffer. Use the virtual-array buffer as workspace. + */ + if (post->buffer == NULL) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + (JDIMENSION) 0, post->strip_height, TRUE); + } + } else { + /* For single-pass processing without color quantization, + * I have no work to do; just call the upsampler directly. + */ + post->pub.post_process_data = cinfo->upsample->upsample; + } + break; +#ifdef QUANT_2PASS_SUPPORTED + case JBUF_SAVE_AND_PASS: + /* First pass of 2-pass quantization */ + if (post->whole_image == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + post->pub.post_process_data = post_process_prepass; + break; + case JBUF_CRANK_DEST: + /* Second pass of 2-pass quantization */ + if (post->whole_image == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + post->pub.post_process_data = post_process_2pass; + break; +#endif /* QUANT_2PASS_SUPPORTED */ + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } + post->starting_row = post->next_row = 0; +} + + +/* + * Process some data in the one-pass (strip buffer) case. + * This is used for color precision reduction as well as one-pass quantization. + */ + +METHODDEF(void) +post_process_1pass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION num_rows, max_rows; + + /* Fill the buffer, but not more than what we can dump out in one go. */ + /* Note we rely on the upsampler to detect bottom of image. */ + max_rows = out_rows_avail - *out_row_ctr; + if (max_rows > post->strip_height) + max_rows = post->strip_height; + num_rows = 0; + (*cinfo->upsample->upsample) (cinfo, + input_buf, in_row_group_ctr, in_row_groups_avail, + post->buffer, &num_rows, max_rows); + /* Quantize and emit data. */ + (*cinfo->cquantize->color_quantize) (cinfo, + post->buffer, output_buf + *out_row_ctr, (int) num_rows); + *out_row_ctr += num_rows; +} + + +#ifdef QUANT_2PASS_SUPPORTED + +/* + * Process some data in the first pass of 2-pass quantization. + */ + +METHODDEF(void) +post_process_prepass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION old_next_row, num_rows; + + /* Reposition virtual buffer if at start of strip. */ + if (post->next_row == 0) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + post->starting_row, post->strip_height, TRUE); + } + + /* Upsample some data (up to a strip height's worth). */ + old_next_row = post->next_row; + (*cinfo->upsample->upsample) (cinfo, + input_buf, in_row_group_ctr, in_row_groups_avail, + post->buffer, &post->next_row, post->strip_height); + + /* Allow quantizer to scan new data. No data is emitted, */ + /* but we advance out_row_ctr so outer loop can tell when we're done. */ + if (post->next_row > old_next_row) { + num_rows = post->next_row - old_next_row; + (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row, + (JSAMPARRAY) NULL, (int) num_rows); + *out_row_ctr += num_rows; + } + + /* Advance if we filled the strip. */ + if (post->next_row >= post->strip_height) { + post->starting_row += post->strip_height; + post->next_row = 0; + } +} + + +/* + * Process some data in the second pass of 2-pass quantization. + */ + +METHODDEF(void) +post_process_2pass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION num_rows, max_rows; + + /* Reposition virtual buffer if at start of strip. */ + if (post->next_row == 0) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + post->starting_row, post->strip_height, FALSE); + } + + /* Determine number of rows to emit. */ + num_rows = post->strip_height - post->next_row; /* available in strip */ + max_rows = out_rows_avail - *out_row_ctr; /* available in output area */ + if (num_rows > max_rows) + num_rows = max_rows; + /* We have to check bottom of image here, can't depend on upsampler. */ + max_rows = cinfo->output_height - post->starting_row; + if (num_rows > max_rows) + num_rows = max_rows; + + /* Quantize and emit data. */ + (*cinfo->cquantize->color_quantize) (cinfo, + post->buffer + post->next_row, output_buf + *out_row_ctr, + (int) num_rows); + *out_row_ctr += num_rows; + + /* Advance if we filled the strip. */ + post->next_row += num_rows; + if (post->next_row >= post->strip_height) { + post->starting_row += post->strip_height; + post->next_row = 0; + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ + + +/* + * Initialize postprocessing controller. + */ + +GLOBAL(void) +jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_post_ptr post; + + post = (my_post_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_post_controller)); + cinfo->post = (struct jpeg_d_post_controller *) post; + post->pub.start_pass = start_pass_dpost; + post->whole_image = NULL; /* flag for no virtual arrays */ + post->buffer = NULL; /* flag for no strip buffer */ + + /* Create the quantization buffer, if needed */ + if (cinfo->quantize_colors) { + /* The buffer strip height is max_v_samp_factor, which is typically + * an efficient number of rows for upsampling to return. + * (In the presence of output rescaling, we might want to be smarter?) + */ + post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor; + if (need_full_buffer) { + /* Two-pass color quantization: need full-image storage. */ + /* We round up the number of rows to a multiple of the strip height. */ +#ifdef QUANT_2PASS_SUPPORTED + post->whole_image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + cinfo->output_width * cinfo->out_color_components, + (JDIMENSION) jround_up((long) cinfo->output_height, + (long) post->strip_height), + post->strip_height); +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif /* QUANT_2PASS_SUPPORTED */ + } else { + /* One-pass color quantization: just make a strip buffer. */ + post->buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->output_width * cinfo->out_color_components, + post->strip_height); + } + } +} diff --git a/src/3rdparty/libjpeg/jdsample.c b/src/3rdparty/libjpeg/jdsample.c new file mode 100644 index 0000000000..7bc8885b02 --- /dev/null +++ b/src/3rdparty/libjpeg/jdsample.c @@ -0,0 +1,361 @@ +/* + * jdsample.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2002-2008 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains upsampling routines. + * + * Upsampling input data is counted in "row groups". A row group + * is defined to be (v_samp_factor * DCT_v_scaled_size / min_DCT_v_scaled_size) + * sample rows of each component. Upsampling will normally produce + * max_v_samp_factor pixel rows from each row group (but this could vary + * if the upsampler is applying a scale factor of its own). + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Pointer to routine to upsample a single component */ +typedef JMETHOD(void, upsample1_ptr, + (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Color conversion buffer. When using separate upsampling and color + * conversion steps, this buffer holds one upsampled row group until it + * has been color converted and output. + * Note: we do not allocate any storage for component(s) which are full-size, + * ie do not need rescaling. The corresponding entry of color_buf[] is + * simply set to point to the input data array, thereby avoiding copying. + */ + JSAMPARRAY color_buf[MAX_COMPONENTS]; + + /* Per-component upsampling method pointers */ + upsample1_ptr methods[MAX_COMPONENTS]; + + int next_row_out; /* counts rows emitted from color_buf */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ + + /* Height of an input row group for each component. */ + int rowgroup_height[MAX_COMPONENTS]; + + /* These arrays save pixel expansion factors so that int_expand need not + * recompute them each time. They are unused for other upsampling methods. + */ + UINT8 h_expand[MAX_COMPONENTS]; + UINT8 v_expand[MAX_COMPONENTS]; +} my_upsampler; + +typedef my_upsampler * my_upsample_ptr; + + +/* + * Initialize for an upsampling pass. + */ + +METHODDEF(void) +start_pass_upsample (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Mark the conversion buffer empty */ + upsample->next_row_out = cinfo->max_v_samp_factor; + /* Initialize total-height counter for detecting bottom of image */ + upsample->rows_to_go = cinfo->output_height; +} + + +/* + * Control routine to do upsampling (and color conversion). + * + * In this version we upsample each component independently. + * We upsample one row group into the conversion buffer, then apply + * color conversion a row at a time. + */ + +METHODDEF(void) +sep_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + int ci; + jpeg_component_info * compptr; + JDIMENSION num_rows; + + /* Fill the conversion buffer, if it's empty */ + if (upsample->next_row_out >= cinfo->max_v_samp_factor) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Invoke per-component upsample method. Notice we pass a POINTER + * to color_buf[ci], so that fullsize_upsample can change it. + */ + (*upsample->methods[ci]) (cinfo, compptr, + input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]), + upsample->color_buf + ci); + } + upsample->next_row_out = 0; + } + + /* Color-convert and emit rows */ + + /* How many we have in the buffer: */ + num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out); + /* Not more than the distance to the end of the image. Need this test + * in case the image height is not a multiple of max_v_samp_factor: + */ + if (num_rows > upsample->rows_to_go) + num_rows = upsample->rows_to_go; + /* And not more than what the client can accept: */ + out_rows_avail -= *out_row_ctr; + if (num_rows > out_rows_avail) + num_rows = out_rows_avail; + + (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf, + (JDIMENSION) upsample->next_row_out, + output_buf + *out_row_ctr, + (int) num_rows); + + /* Adjust counts */ + *out_row_ctr += num_rows; + upsample->rows_to_go -= num_rows; + upsample->next_row_out += num_rows; + /* When the buffer is emptied, declare this input row group consumed */ + if (upsample->next_row_out >= cinfo->max_v_samp_factor) + (*in_row_group_ctr)++; +} + + +/* + * These are the routines invoked by sep_upsample to upsample pixel values + * of a single component. One row group is processed per call. + */ + + +/* + * For full-size components, we just make color_buf[ci] point at the + * input buffer, and thus avoid copying any data. Note that this is + * safe only because sep_upsample doesn't declare the input row group + * "consumed" until we are done color converting and emitting it. + */ + +METHODDEF(void) +fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + *output_data_ptr = input_data; +} + + +/* + * This is a no-op version used for "uninteresting" components. + * These components will not be referenced by color conversion. + */ + +METHODDEF(void) +noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + *output_data_ptr = NULL; /* safety check */ +} + + +/* + * This version handles any integral sampling ratios. + * This is not used for typical JPEG files, so it need not be fast. + * Nor, for that matter, is it particularly accurate: the algorithm is + * simple replication of the input pixel onto the corresponding output + * pixels. The hi-falutin sampling literature refers to this as a + * "box filter". A box filter tends to introduce visible artifacts, + * so if you are actually going to use 3:1 or 4:1 sampling ratios + * you would be well advised to improve this code. + */ + +METHODDEF(void) +int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + register int h; + JSAMPROW outend; + int h_expand, v_expand; + int inrow, outrow; + + h_expand = upsample->h_expand[compptr->component_index]; + v_expand = upsample->v_expand[compptr->component_index]; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + /* Generate one output row with proper horizontal expansion */ + inptr = input_data[inrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + for (h = h_expand; h > 0; h--) { + *outptr++ = invalue; + } + } + /* Generate any additional output rows by duplicating the first one */ + if (v_expand > 1) { + jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + v_expand-1, cinfo->output_width); + } + inrow++; + outrow += v_expand; + } +} + + +/* + * Fast processing for the common case of 2:1 horizontal and 1:1 vertical. + * It's still a box filter. + */ + +METHODDEF(void) +h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + JSAMPROW outend; + int outrow; + + for (outrow = 0; outrow < cinfo->max_v_samp_factor; outrow++) { + inptr = input_data[outrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + *outptr++ = invalue; + *outptr++ = invalue; + } + } +} + + +/* + * Fast processing for the common case of 2:1 horizontal and 2:1 vertical. + * It's still a box filter. + */ + +METHODDEF(void) +h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + JSAMPROW outend; + int inrow, outrow; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + inptr = input_data[inrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + *outptr++ = invalue; + *outptr++ = invalue; + } + jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + 1, cinfo->output_width); + inrow++; + outrow += 2; + } +} + + +/* + * Module initialization routine for upsampling. + */ + +GLOBAL(void) +jinit_upsampler (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample; + int ci; + jpeg_component_info * compptr; + boolean need_buffer; + int h_in_group, v_in_group, h_out_group, v_out_group; + + upsample = (my_upsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_upsampler)); + cinfo->upsample = (struct jpeg_upsampler *) upsample; + upsample->pub.start_pass = start_pass_upsample; + upsample->pub.upsample = sep_upsample; + upsample->pub.need_context_rows = FALSE; /* until we find out differently */ + + if (cinfo->CCIR601_sampling) /* this isn't supported */ + ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); + + /* Verify we can handle the sampling factors, select per-component methods, + * and create storage as needed. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Compute size of an "input group" after IDCT scaling. This many samples + * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. + */ + h_in_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) / + cinfo->min_DCT_h_scaled_size; + v_in_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + h_out_group = cinfo->max_h_samp_factor; + v_out_group = cinfo->max_v_samp_factor; + upsample->rowgroup_height[ci] = v_in_group; /* save for use later */ + need_buffer = TRUE; + if (! compptr->component_needed) { + /* Don't bother to upsample an uninteresting component. */ + upsample->methods[ci] = noop_upsample; + need_buffer = FALSE; + } else if (h_in_group == h_out_group && v_in_group == v_out_group) { + /* Fullsize components can be processed without any work. */ + upsample->methods[ci] = fullsize_upsample; + need_buffer = FALSE; + } else if (h_in_group * 2 == h_out_group && + v_in_group == v_out_group) { + /* Special case for 2h1v upsampling */ + upsample->methods[ci] = h2v1_upsample; + } else if (h_in_group * 2 == h_out_group && + v_in_group * 2 == v_out_group) { + /* Special case for 2h2v upsampling */ + upsample->methods[ci] = h2v2_upsample; + } else if ((h_out_group % h_in_group) == 0 && + (v_out_group % v_in_group) == 0) { + /* Generic integral-factors upsampling method */ + upsample->methods[ci] = int_upsample; + upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group); + upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group); + } else + ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); + if (need_buffer) { + upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) jround_up((long) cinfo->output_width, + (long) cinfo->max_h_samp_factor), + (JDIMENSION) cinfo->max_v_samp_factor); + } + } +} diff --git a/src/3rdparty/libjpeg/jdtrans.c b/src/3rdparty/libjpeg/jdtrans.c new file mode 100644 index 0000000000..22dd47fb5c --- /dev/null +++ b/src/3rdparty/libjpeg/jdtrans.c @@ -0,0 +1,140 @@ +/* + * jdtrans.c + * + * Copyright (C) 1995-1997, Thomas G. Lane. + * Modified 2000-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains library routines for transcoding decompression, + * that is, reading raw DCT coefficient arrays from an input JPEG file. + * The routines in jdapimin.c will also be needed by a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo)); + + +/* + * Read the coefficient arrays from a JPEG file. + * jpeg_read_header must be completed before calling this. + * + * The entire image is read into a set of virtual coefficient-block arrays, + * one per component. The return value is a pointer to the array of + * virtual-array descriptors. These can be manipulated directly via the + * JPEG memory manager, or handed off to jpeg_write_coefficients(). + * To release the memory occupied by the virtual arrays, call + * jpeg_finish_decompress() when done with the data. + * + * An alternative usage is to simply obtain access to the coefficient arrays + * during a buffered-image-mode decompression operation. This is allowed + * after any jpeg_finish_output() call. The arrays can be accessed until + * jpeg_finish_decompress() is called. (Note that any call to the library + * may reposition the arrays, so don't rely on access_virt_barray() results + * to stay valid across library calls.) + * + * Returns NULL if suspended. This case need be checked only if + * a suspending data source is used. + */ + +GLOBAL(jvirt_barray_ptr *) +jpeg_read_coefficients (j_decompress_ptr cinfo) +{ + if (cinfo->global_state == DSTATE_READY) { + /* First call: initialize active modules */ + transdecode_master_selection(cinfo); + cinfo->global_state = DSTATE_RDCOEFS; + } + if (cinfo->global_state == DSTATE_RDCOEFS) { + /* Absorb whole file into the coef buffer */ + for (;;) { + int retcode; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + /* Absorb some more input */ + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_SUSPENDED) + return NULL; + if (retcode == JPEG_REACHED_EOI) + break; + /* Advance progress counter if appropriate */ + if (cinfo->progress != NULL && + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { + /* startup underestimated number of scans; ratchet up one scan */ + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; + } + } + } + /* Set state so that jpeg_finish_decompress does the right thing */ + cinfo->global_state = DSTATE_STOPPING; + } + /* At this point we should be in state DSTATE_STOPPING if being used + * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access + * to the coefficients during a full buffered-image-mode decompression. + */ + if ((cinfo->global_state == DSTATE_STOPPING || + cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) { + return cinfo->coef->coef_arrays; + } + /* Oops, improper usage */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return NULL; /* keep compiler happy */ +} + + +/* + * Master selection of decompression modules for transcoding. + * This substitutes for jdmaster.c's initialization of the full decompressor. + */ + +LOCAL(void) +transdecode_master_selection (j_decompress_ptr cinfo) +{ + /* This is effectively a buffered-image operation. */ + cinfo->buffered_image = TRUE; + + /* Compute output image dimensions and related values. */ + jpeg_core_output_dimensions(cinfo); + + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_decoder(cinfo); + else { + jinit_huff_decoder(cinfo); + } + + /* Always get a full-image coefficient buffer. */ + jinit_d_coef_controller(cinfo, TRUE); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Initialize input side of decompressor to consume first scan. */ + (*cinfo->inputctl->start_input_pass) (cinfo); + + /* Initialize progress monitoring. */ + if (cinfo->progress != NULL) { + int nscans; + /* Estimate number of scans to set pass_limit. */ + if (cinfo->progressive_mode) { + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ + nscans = 2 + 3 * cinfo->num_components; + } else if (cinfo->inputctl->has_multiple_scans) { + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ + nscans = cinfo->num_components; + } else { + nscans = 1; + } + cinfo->progress->pass_counter = 0L; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; + cinfo->progress->completed_passes = 0; + cinfo->progress->total_passes = 1; + } +} diff --git a/src/3rdparty/libjpeg/jerror.c b/src/3rdparty/libjpeg/jerror.c new file mode 100644 index 0000000000..3da7be86a0 --- /dev/null +++ b/src/3rdparty/libjpeg/jerror.c @@ -0,0 +1,252 @@ +/* + * jerror.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains simple error-reporting and trace-message routines. + * These are suitable for Unix-like systems and others where writing to + * stderr is the right thing to do. Many applications will want to replace + * some or all of these routines. + * + * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile, + * you get a Windows-specific hack to display error messages in a dialog box. + * It ain't much, but it beats dropping error messages into the bit bucket, + * which is what happens to output to stderr under most Windows C compilers. + * + * These routines are used by both the compression and decompression code. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jversion.h" +#include "jerror.h" + +#ifdef USE_WINDOWS_MESSAGEBOX +#include +#endif + +#ifndef EXIT_FAILURE /* define exit() codes if not provided */ +#define EXIT_FAILURE 1 +#endif + + +/* + * Create the message string table. + * We do this from the master message list in jerror.h by re-reading + * jerror.h with a suitable definition for macro JMESSAGE. + * The message table is made an external symbol just in case any applications + * want to refer to it directly. + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_message_table jMsgTable +#endif + +#define JMESSAGE(code,string) string , + +const char * const jpeg_std_message_table[] = { +#include "jerror.h" + NULL +}; + + +/* + * Error exit handler: must not return to caller. + * + * Applications may override this if they want to get control back after + * an error. Typically one would longjmp somewhere instead of exiting. + * The setjmp buffer can be made a private field within an expanded error + * handler object. Note that the info needed to generate an error message + * is stored in the error object, so you can generate the message now or + * later, at your convenience. + * You should make sure that the JPEG object is cleaned up (with jpeg_abort + * or jpeg_destroy) at some point. + */ + +METHODDEF(void) +error_exit (j_common_ptr cinfo) +{ + /* Always display the message */ + (*cinfo->err->output_message) (cinfo); + + /* Let the memory manager delete any temp files before we die */ + jpeg_destroy(cinfo); + + exit(EXIT_FAILURE); +} + + +/* + * Actual output of an error or trace message. + * Applications may override this method to send JPEG messages somewhere + * other than stderr. + * + * On Windows, printing to stderr is generally completely useless, + * so we provide optional code to produce an error-dialog popup. + * Most Windows applications will still prefer to override this routine, + * but if they don't, it'll do something at least marginally useful. + * + * NOTE: to use the library in an environment that doesn't support the + * C stdio library, you may have to delete the call to fprintf() entirely, + * not just not use this routine. + */ + +METHODDEF(void) +output_message (j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + + /* Create the message */ + (*cinfo->err->format_message) (cinfo, buffer); + +#ifdef USE_WINDOWS_MESSAGEBOX + /* Display it in a message dialog box */ + MessageBox(GetActiveWindow(), buffer, "JPEG Library Error", + MB_OK | MB_ICONERROR); +#else + /* Send it to stderr, adding a newline */ + fprintf(stderr, "%s\n", buffer); +#endif +} + + +/* + * Decide whether to emit a trace or warning message. + * msg_level is one of: + * -1: recoverable corrupt-data warning, may want to abort. + * 0: important advisory messages (always display to user). + * 1: first level of tracing detail. + * 2,3,...: successively more detailed tracing messages. + * An application might override this method if it wanted to abort on warnings + * or change the policy about which messages to display. + */ + +METHODDEF(void) +emit_message (j_common_ptr cinfo, int msg_level) +{ + struct jpeg_error_mgr * err = cinfo->err; + + if (msg_level < 0) { + /* It's a warning message. Since corrupt files may generate many warnings, + * the policy implemented here is to show only the first warning, + * unless trace_level >= 3. + */ + if (err->num_warnings == 0 || err->trace_level >= 3) + (*err->output_message) (cinfo); + /* Always count warnings in num_warnings. */ + err->num_warnings++; + } else { + /* It's a trace message. Show it if trace_level >= msg_level. */ + if (err->trace_level >= msg_level) + (*err->output_message) (cinfo); + } +} + + +/* + * Format a message string for the most recent JPEG error or message. + * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX + * characters. Note that no '\n' character is added to the string. + * Few applications should need to override this method. + */ + +METHODDEF(void) +format_message (j_common_ptr cinfo, char * buffer) +{ + struct jpeg_error_mgr * err = cinfo->err; + int msg_code = err->msg_code; + const char * msgtext = NULL; + const char * msgptr; + char ch; + boolean isstring; + + /* Look up message string in proper table */ + if (msg_code > 0 && msg_code <= err->last_jpeg_message) { + msgtext = err->jpeg_message_table[msg_code]; + } else if (err->addon_message_table != NULL && + msg_code >= err->first_addon_message && + msg_code <= err->last_addon_message) { + msgtext = err->addon_message_table[msg_code - err->first_addon_message]; + } + + /* Defend against bogus message number */ + if (msgtext == NULL) { + err->msg_parm.i[0] = msg_code; + msgtext = err->jpeg_message_table[0]; + } + + /* Check for string parameter, as indicated by %s in the message text */ + isstring = FALSE; + msgptr = msgtext; + while ((ch = *msgptr++) != '\0') { + if (ch == '%') { + if (*msgptr == 's') isstring = TRUE; + break; + } + } + + /* Format the message into the passed buffer */ + if (isstring) + sprintf(buffer, msgtext, err->msg_parm.s); + else + sprintf(buffer, msgtext, + err->msg_parm.i[0], err->msg_parm.i[1], + err->msg_parm.i[2], err->msg_parm.i[3], + err->msg_parm.i[4], err->msg_parm.i[5], + err->msg_parm.i[6], err->msg_parm.i[7]); +} + + +/* + * Reset error state variables at start of a new image. + * This is called during compression startup to reset trace/error + * processing to default state, without losing any application-specific + * method pointers. An application might possibly want to override + * this method if it has additional error processing state. + */ + +METHODDEF(void) +reset_error_mgr (j_common_ptr cinfo) +{ + cinfo->err->num_warnings = 0; + /* trace_level is not reset since it is an application-supplied parameter */ + cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */ +} + + +/* + * Fill in the standard error-handling methods in a jpeg_error_mgr object. + * Typical call is: + * struct jpeg_compress_struct cinfo; + * struct jpeg_error_mgr err; + * + * cinfo.err = jpeg_std_error(&err); + * after which the application may override some of the methods. + */ + +GLOBAL(struct jpeg_error_mgr *) +jpeg_std_error (struct jpeg_error_mgr * err) +{ + err->error_exit = error_exit; + err->emit_message = emit_message; + err->output_message = output_message; + err->format_message = format_message; + err->reset_error_mgr = reset_error_mgr; + + err->trace_level = 0; /* default = no tracing */ + err->num_warnings = 0; /* no warnings emitted yet */ + err->msg_code = 0; /* may be useful as a flag for "no error" */ + + /* Initialize message table pointers */ + err->jpeg_message_table = jpeg_std_message_table; + err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1; + + err->addon_message_table = NULL; + err->first_addon_message = 0; /* for safety */ + err->last_addon_message = 0; + + return err; +} diff --git a/src/3rdparty/libjpeg/jerror.h b/src/3rdparty/libjpeg/jerror.h new file mode 100644 index 0000000000..1cfb2b19d8 --- /dev/null +++ b/src/3rdparty/libjpeg/jerror.h @@ -0,0 +1,304 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") +JMESSAGE(JERR_BAD_DROP_SAMPLING, + "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (cinfo)->err->msg_parm.i[4] = (p5), \ + (cinfo)->err->msg_parm.i[5] = (p6), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff --git a/src/3rdparty/libjpeg/jfdctflt.c b/src/3rdparty/libjpeg/jfdctflt.c new file mode 100644 index 0000000000..74d0d862dc --- /dev/null +++ b/src/3rdparty/libjpeg/jfdctflt.c @@ -0,0 +1,174 @@ +/* + * jfdctflt.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a floating-point implementation of the + * forward DCT (Discrete Cosine Transform). + * + * This implementation should be more accurate than either of the integer + * DCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_FLOAT_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_float (FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + FAST_FLOAT tmp10, tmp11, tmp12, tmp13; + FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; + FAST_FLOAT *dataptr; + JSAMPROW elemptr; + int ctr; + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Load data into workspace */ + tmp0 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7])); + tmp7 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7])); + tmp1 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6])); + tmp6 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6])); + tmp2 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5])); + tmp5 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5])); + tmp3 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4])); + tmp4 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4])); + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Apply unsigned->signed conversion */ + dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */ + dataptr[4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ + dataptr[2] = tmp13 + z1; /* phase 5 */ + dataptr[6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ + z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ + z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[5] = z13 + z2; /* phase 6 */ + dataptr[3] = z13 - z2; + dataptr[1] = z11 + z4; + dataptr[7] = z11 - z4; + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ + dataptr[DCTSIZE*4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ + dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ + dataptr[DCTSIZE*6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ + z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ + z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ + dataptr[DCTSIZE*3] = z13 - z2; + dataptr[DCTSIZE*1] = z11 + z4; + dataptr[DCTSIZE*7] = z11 - z4; + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jfdctfst.c b/src/3rdparty/libjpeg/jfdctfst.c new file mode 100644 index 0000000000..8cad5f2293 --- /dev/null +++ b/src/3rdparty/libjpeg/jfdctfst.c @@ -0,0 +1,230 @@ +/* + * jfdctfst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a fast, not so accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with fixed-point math, + * accuracy is lost due to imprecise representation of the scaled + * quantization values. The smaller the quantization table entry, the less + * precise the scaled value, so this implementation does worse with high- + * quality-setting files than with low-quality ones. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_IFAST_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling decisions are generally the same as in the LL&M algorithm; + * see jfdctint.c for more details. However, we choose to descale + * (right shift) multiplication products as soon as they are formed, + * rather than carrying additional fractional bits into subsequent additions. + * This compromises accuracy slightly, but it lets us save a few shifts. + * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) + * everywhere except in the multiplications proper; this saves a good deal + * of work on 16-bit-int machines. + * + * Again to save a few shifts, the intermediate results between pass 1 and + * pass 2 are not upscaled, but are represented only to integral precision. + * + * A final compromise is to represent the multiplicative constants to only + * 8 fractional bits, rather than 13. This saves some shifting work on some + * machines, and may also reduce the cost of multiplication (since there + * are fewer one-bits in the constants). + */ + +#define CONST_BITS 8 + + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 8 +#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */ +#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */ +#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */ +#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */ +#else +#define FIX_0_382683433 FIX(0.382683433) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_707106781 FIX(0.707106781) +#define FIX_1_306562965 FIX(1.306562965) +#endif + + +/* We can gain a little more speed, with a further compromise in accuracy, + * by omitting the addition in a descaling shift. This yields an incorrectly + * rounded result half the time... + */ + +#ifndef USE_ACCURATE_ROUNDING +#undef DESCALE +#define DESCALE(x,n) RIGHT_SHIFT(x, n) +#endif + + +/* Multiply a DCTELEM variable by an INT32 constant, and immediately + * descale to yield a DCTELEM result. + */ + +#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_ifast (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z1, z2, z3, z4, z5, z11, z13; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Load data into workspace */ + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp7 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp6 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp5 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + tmp4 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Apply unsigned->signed conversion */ + dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */ + dataptr[4] = tmp10 - tmp11; + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ + dataptr[2] = tmp13 + z1; /* phase 5 */ + dataptr[6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[5] = z13 + z2; /* phase 6 */ + dataptr[3] = z13 - z2; + dataptr[1] = z11 + z4; + dataptr[7] = z11 - z4; + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ + dataptr[DCTSIZE*4] = tmp10 - tmp11; + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ + dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ + dataptr[DCTSIZE*6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ + dataptr[DCTSIZE*3] = z13 - z2; + dataptr[DCTSIZE*1] = z11 + z4; + dataptr[DCTSIZE*7] = z11 - z4; + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_IFAST_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jfdctint.c b/src/3rdparty/libjpeg/jfdctint.c new file mode 100644 index 0000000000..1dde58c499 --- /dev/null +++ b/src/3rdparty/libjpeg/jfdctint.c @@ -0,0 +1,4348 @@ +/* + * jfdctint.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modification developed 2003-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + * + * We also provide FDCT routines with various input sample block sizes for + * direct resolution reduction or enlargement and for direct resolving the + * common 2x1 and 1x2 subsampling cases without additional resampling: NxN + * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 output DCT block. + * + * For N<8 we fill the remaining block coefficients with zero. + * For N>8 we apply a partial N-point FDCT on the input samples, computing + * just the lower 8 frequency coefficients and discarding the rest. + * + * We must scale the output coefficients of the N-point FDCT appropriately + * to the standard 8-point FDCT level by 8/N per 1-D pass. This scaling + * is folded into the constant multipliers (pass 2) and/or final/initial + * shifting. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */ +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D DCT step produces outputs which are a factor of sqrt(N) + * larger than the true DCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D DCT, + * because the y0 and y4 outputs need not be divided by sqrt(N). + * In the IJG code, this factor of 8 is removed by the quantization step + * (in jcdctmgr.c), NOT in this module. + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (For 12-bit sample data, the intermediate + * array is INT32 anyway.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + /* Add fudge factor here for final descale. */ + tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1)); + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + dataptr[DCTSIZE*2] = (DCTELEM) + RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + +#ifdef DCT_SCALING_SUPPORTED + + +/* + * Perform the forward DCT on a 7x7 sample block. + */ + +GLOBAL(void) +jpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/14). */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]); + tmp3 = GETJSAMPLE(elemptr[3]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]); + + z1 = tmp0 + tmp2; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.353553391)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123)); /* c6 */ + dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734)); /* c4 */ + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693)); /* c3+c1-c5 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/7)**2 = 64/49, which we fold + * into the constant multipliers: + * cK now represents sqrt(2) * cos(K*pi/14) * 64/49. + */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4]; + + z1 = tmp0 + tmp2; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */ + CONST_BITS+PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.461784020)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509)); /* c4 */ + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355)); /* c3+c1-c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x6 sample block. + */ + +GLOBAL(void) +jpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS)); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS)); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)**2 = 16/9, which we fold + * into the constant multipliers: + * cK now represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 5x5 sample block. + */ + +GLOBAL(void) +jpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/10). */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]); + tmp2 = GETJSAMPLE(elemptr[2]); + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << (PASS1_BITS+1)); + tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.353553391)); /* (c2-c4)/2 */ + dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS-1); + dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876)); /* c3 */ + + dataptr[1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */ + CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/5)**2 = 64/25, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * cK now represents sqrt(2) * cos(K*pi/10) * 32/25. + */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2]; + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(1.011928851)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.452548340)); /* (c2-c4)/2 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x4 sample block. + */ + +GLOBAL(void) +jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by (8/4)**2 = 2**2, which we add here. */ + /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+2)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+2)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-3); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-2); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-2); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS+PASS1_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 3x3 sample block. + */ + +GLOBAL(void) +jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2**2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/6). */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]); + tmp1 = GETJSAMPLE(elemptr[1]); + + tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+2)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */ + CONST_BITS-PASS1_BITS-2); + + /* Odd part */ + + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(1.224744871)), /* c1 */ + CONST_BITS-PASS1_BITS-2); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/3)**2 = 64/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * cK now represents sqrt(2) * cos(K*pi/6) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1]; + + tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(2.177324216)), /* c1 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x2 sample block. + */ + +GLOBAL(void) +jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + JSAMPROW elemptr; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + + /* Row 0 */ + elemptr = sample_data[0] + start_col; + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]); + tmp1 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]); + + /* Row 1 */ + elemptr = sample_data[1] + start_col; + + tmp2 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]); + tmp3 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]); + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/2)**2 = 2**4. + */ + + /* Column 0 */ + /* Apply unsigned->signed conversion */ + data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp2 - 4 * CENTERJSAMPLE) << 4); + data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp2) << 4); + + /* Column 1 */ + data[DCTSIZE*0+1] = (DCTELEM) ((tmp1 + tmp3) << 4); + data[DCTSIZE*1+1] = (DCTELEM) ((tmp1 - tmp3) << 4); +} + + +/* + * Perform the forward DCT on a 1x1 sample block. + */ + +GLOBAL(void) +jpeg_fdct_1x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* We leave the result scaled up by an overall factor of 8. */ + /* We must also scale the output by (8/1)**2 = 2**6. */ + /* Apply unsigned->signed conversion */ + data[0] = (DCTELEM) + ((GETJSAMPLE(sample_data[0][start_col]) - CENTERJSAMPLE) << 6); +} + + +/* + * Perform the forward DCT on a 9x9 sample block. + */ + +GLOBAL(void) +jpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2; + DCTELEM workspace[8]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/18). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[8]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[7]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[6]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[5]); + tmp4 = GETJSAMPLE(elemptr[4]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[8]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[7]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[6]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[5]); + + z1 = tmp0 + tmp2 + tmp3; + z2 = tmp1 + tmp4; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((z1 + z2 - 9 * CENTERJSAMPLE) << 1); + dataptr[6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z2 - z2, FIX(0.707106781)), /* c6 */ + CONST_BITS-1); + z1 = MULTIPLY(tmp0 - tmp2, FIX(1.328926049)); /* c2 */ + z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(0.707106781)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.083350441)) /* c4 */ + + z1 + z2, CONST_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.245575608)) /* c8 */ + + z1 - z2, CONST_BITS-1); + + /* Odd part */ + + dataptr[3] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.224744871)), /* c3 */ + CONST_BITS-1); + + tmp11 = MULTIPLY(tmp11, FIX(1.224744871)); /* c3 */ + tmp0 = MULTIPLY(tmp10 + tmp12, FIX(0.909038955)); /* c5 */ + tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.483689525)); /* c7 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS-1); + + tmp2 = MULTIPLY(tmp12 - tmp13, FIX(1.392728481)); /* c1 */ + + dataptr[5] = (DCTELEM) DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 9) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/9)**2 = 64/81, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/18) * 128/81. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*0]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*7]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*6]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*5]; + tmp4 = dataptr[DCTSIZE*4]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*0]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*7]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*6]; + tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*5]; + + z1 = tmp0 + tmp2 + tmp3; + z2 = tmp1 + tmp4; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + z2, FIX(1.580246914)), /* 128/81 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z2 - z2, FIX(1.117403309)), /* c6 */ + CONST_BITS+2); + z1 = MULTIPLY(tmp0 - tmp2, FIX(2.100031287)); /* c2 */ + z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(1.117403309)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.711961190)) /* c4 */ + + z1 + z2, CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.388070096)) /* c8 */ + + z1 - z2, CONST_BITS+2); + + /* Odd part */ + + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.935399303)), /* c3 */ + CONST_BITS+2); + + tmp11 = MULTIPLY(tmp11, FIX(1.935399303)); /* c3 */ + tmp0 = MULTIPLY(tmp10 + tmp12, FIX(1.436506004)); /* c5 */ + tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.764348879)); /* c7 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS+2); + + tmp2 = MULTIPLY(tmp12 - tmp13, FIX(2.200854883)); /* c1 */ + + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 10x10 sample block. + */ + +GLOBAL(void) +jpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM workspace[8*2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/20). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]); + tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]); + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << 1); + tmp12 += tmp12; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.437016024)), /* c8 */ + CONST_BITS-1); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)), /* c2-c6 */ + CONST_BITS-1); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)), /* c2+c6 */ + CONST_BITS-1); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << 1); + tmp2 <<= CONST_BITS; + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.642039522)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.221231742)), /* c9 */ + CONST_BITS-1); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.587785252)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) + /* (c3-c7)/2 */ + (tmp11 << (CONST_BITS - 1)) - tmp2; + dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 10) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/10)**2 = 16/25, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/20) * 32/25. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0]; + tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */ + CONST_BITS+2); + tmp12 += tmp12; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.559380511)), /* c8 */ + CONST_BITS+2); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)), /* c2-c6 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)), /* c2+c6 */ + CONST_BITS+2); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+2); + tmp2 = MULTIPLY(tmp2, FIX(1.28)); /* 32/25 */ + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.821810588)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.283176630)), /* c9 */ + CONST_BITS+2); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.752365123)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) + /* (c3-c7)/2 */ + MULTIPLY(tmp11, FIX(0.64)) - tmp2; /* 16/25 */ + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on an 11x11 sample block. + */ + +GLOBAL(void) +jpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 z1, z2, z3; + DCTELEM workspace[8*3]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/22). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[10]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[9]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[8]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[7]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[6]); + tmp5 = GETJSAMPLE(elemptr[5]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[10]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[9]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[8]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[7]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 - 11 * CENTERJSAMPLE) << 1); + tmp5 += tmp5; + tmp0 -= tmp5; + tmp1 -= tmp5; + tmp2 -= tmp5; + tmp3 -= tmp5; + tmp4 -= tmp5; + z1 = MULTIPLY(tmp0 + tmp3, FIX(1.356927976)) + /* c2 */ + MULTIPLY(tmp2 + tmp4, FIX(0.201263574)); /* c10 */ + z2 = MULTIPLY(tmp1 - tmp3, FIX(0.926112931)); /* c6 */ + z3 = MULTIPLY(tmp0 - tmp1, FIX(1.189712156)); /* c4 */ + dataptr[2] = (DCTELEM) + DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.018300590)) /* c2+c8-c6 */ + - MULTIPLY(tmp4, FIX(1.390975730)), /* c4+c10 */ + CONST_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.062335650)) /* c4-c6-c10 */ + - MULTIPLY(tmp2, FIX(1.356927976)) /* c2 */ + + MULTIPLY(tmp4, FIX(0.587485545)), /* c8 */ + CONST_BITS-1); + dataptr[6] = (DCTELEM) + DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.620527200)) /* c2+c4-c6 */ + - MULTIPLY(tmp2, FIX(0.788749120)), /* c8+c10 */ + CONST_BITS-1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.286413905)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.068791298)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.764581576)); /* c7 */ + tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.719967871)) /* c7+c5+c3-c1 */ + + MULTIPLY(tmp14, FIX(0.398430003)); /* c9 */ + tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.764581576)); /* -c7 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.399818907)); /* -c1 */ + tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.276416582)) /* c9+c7+c1-c3 */ + - MULTIPLY(tmp14, FIX(1.068791298)); /* c5 */ + tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.398430003)); /* c9 */ + tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(1.989053629)) /* c9+c5+c3-c7 */ + + MULTIPLY(tmp14, FIX(1.399818907)); /* c1 */ + tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.305598626)) /* c1+c5-c9-c7 */ + - MULTIPLY(tmp14, FIX(1.286413905)); /* c3 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-1); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-1); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 11) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/11)**2 = 64/121, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/22) * 128/121. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*1]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*0]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*7]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*6]; + tmp5 = dataptr[DCTSIZE*5]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*2]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*1]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*0]; + tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*7]; + tmp14 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5, + FIX(1.057851240)), /* 128/121 */ + CONST_BITS+2); + tmp5 += tmp5; + tmp0 -= tmp5; + tmp1 -= tmp5; + tmp2 -= tmp5; + tmp3 -= tmp5; + tmp4 -= tmp5; + z1 = MULTIPLY(tmp0 + tmp3, FIX(1.435427942)) + /* c2 */ + MULTIPLY(tmp2 + tmp4, FIX(0.212906922)); /* c10 */ + z2 = MULTIPLY(tmp1 - tmp3, FIX(0.979689713)); /* c6 */ + z3 = MULTIPLY(tmp0 - tmp1, FIX(1.258538479)); /* c4 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.077210542)) /* c2+c8-c6 */ + - MULTIPLY(tmp4, FIX(1.471445400)), /* c4+c10 */ + CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.065941844)) /* c4-c6-c10 */ + - MULTIPLY(tmp2, FIX(1.435427942)) /* c2 */ + + MULTIPLY(tmp4, FIX(0.621472312)), /* c8 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.714276708)) /* c2+c4-c6 */ + - MULTIPLY(tmp2, FIX(0.834379234)), /* c8+c10 */ + CONST_BITS+2); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.360834544)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.130622199)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.808813568)); /* c7 */ + tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.819470145)) /* c7+c5+c3-c1 */ + + MULTIPLY(tmp14, FIX(0.421479672)); /* c9 */ + tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.808813568)); /* -c7 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.480800167)); /* -c1 */ + tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.350258864)) /* c9+c7+c1-c3 */ + - MULTIPLY(tmp14, FIX(1.130622199)); /* c5 */ + tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.421479672)); /* c9 */ + tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(2.104122847)) /* c9+c5+c3-c7 */ + + MULTIPLY(tmp14, FIX(1.480800167)); /* c1 */ + tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.381129125)) /* c1+c5-c9-c7 */ + - MULTIPLY(tmp14, FIX(1.360834544)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 12x12 sample block. + */ + +GLOBAL(void) +jpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM workspace[8*4]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/24). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]); + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) (tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE); + dataptr[6] = (DCTELEM) (tmp13 - tmp14 - tmp15); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */ + CONST_BITS); + dataptr[2] = (DCTELEM) + DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */ + CONST_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.184591911)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.860918669)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(1.121971054)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX_0_541196100); /* c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 12) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/12)**2 = 4/9, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/24) * 8/9. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6]; + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)), /* c4 */ + CONST_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) + /* 8/9 */ + MULTIPLY(tmp13 + tmp15, FIX(1.214244803)), /* c2 */ + CONST_BITS+1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200)); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102)); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502)); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.164081699)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.765261039)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(0.997307603)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 13x13 sample block. + */ + +GLOBAL(void) +jpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 z1, z2; + DCTELEM workspace[8*5]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/26). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[12]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[11]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[10]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[9]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[8]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[7]); + tmp6 = GETJSAMPLE(elemptr[6]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[12]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[11]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[10]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[9]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[8]); + tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + (tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 - 13 * CENTERJSAMPLE); + tmp6 += tmp6; + tmp0 -= tmp6; + tmp1 -= tmp6; + tmp2 -= tmp6; + tmp3 -= tmp6; + tmp4 -= tmp6; + tmp5 -= tmp6; + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.373119086)) + /* c2 */ + MULTIPLY(tmp1, FIX(1.058554052)) + /* c6 */ + MULTIPLY(tmp2, FIX(0.501487041)) - /* c10 */ + MULTIPLY(tmp3, FIX(0.170464608)) - /* c12 */ + MULTIPLY(tmp4, FIX(0.803364869)) - /* c8 */ + MULTIPLY(tmp5, FIX(1.252223920)), /* c4 */ + CONST_BITS); + z1 = MULTIPLY(tmp0 - tmp2, FIX(1.155388986)) - /* (c4+c6)/2 */ + MULTIPLY(tmp3 - tmp4, FIX(0.435816023)) - /* (c2-c10)/2 */ + MULTIPLY(tmp1 - tmp5, FIX(0.316450131)); /* (c8-c12)/2 */ + z2 = MULTIPLY(tmp0 + tmp2, FIX(0.096834934)) - /* (c4-c6)/2 */ + MULTIPLY(tmp3 + tmp4, FIX(0.937303064)) + /* (c2+c10)/2 */ + MULTIPLY(tmp1 + tmp5, FIX(0.486914739)); /* (c8+c12)/2 */ + + dataptr[4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.322312651)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.163874945)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.937797057)) + /* c7 */ + MULTIPLY(tmp14 + tmp15, FIX(0.338443458)); /* c11 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(tmp10, FIX(2.020082300)) + /* c3+c5+c7-c1 */ + MULTIPLY(tmp14, FIX(0.318774355)); /* c9-c11 */ + tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.937797057)) - /* c7 */ + MULTIPLY(tmp11 + tmp12, FIX(0.338443458)); /* c11 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.163874945)); /* -c5 */ + tmp1 += tmp4 + tmp5 + + MULTIPLY(tmp11, FIX(0.837223564)) - /* c5+c9+c11-c3 */ + MULTIPLY(tmp14, FIX(2.341699410)); /* c1+c7 */ + tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.657217813)); /* -c9 */ + tmp2 += tmp4 + tmp6 - + MULTIPLY(tmp12, FIX(1.572116027)) + /* c1+c5-c9-c11 */ + MULTIPLY(tmp15, FIX(2.260109708)); /* c3+c7 */ + tmp3 += tmp5 + tmp6 + + MULTIPLY(tmp13, FIX(2.205608352)) - /* c3+c5+c9-c7 */ + MULTIPLY(tmp15, FIX(1.742345811)); /* c1+c11 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 13) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/13)**2 = 64/169, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/26) * 128/169. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*2]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*1]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*0]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*7]; + tmp6 = dataptr[DCTSIZE*6]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*4]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*3]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*2]; + tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*1]; + tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*0]; + tmp15 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6, + FIX(0.757396450)), /* 128/169 */ + CONST_BITS+1); + tmp6 += tmp6; + tmp0 -= tmp6; + tmp1 -= tmp6; + tmp2 -= tmp6; + tmp3 -= tmp6; + tmp4 -= tmp6; + tmp5 -= tmp6; + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.039995521)) + /* c2 */ + MULTIPLY(tmp1, FIX(0.801745081)) + /* c6 */ + MULTIPLY(tmp2, FIX(0.379824504)) - /* c10 */ + MULTIPLY(tmp3, FIX(0.129109289)) - /* c12 */ + MULTIPLY(tmp4, FIX(0.608465700)) - /* c8 */ + MULTIPLY(tmp5, FIX(0.948429952)), /* c4 */ + CONST_BITS+1); + z1 = MULTIPLY(tmp0 - tmp2, FIX(0.875087516)) - /* (c4+c6)/2 */ + MULTIPLY(tmp3 - tmp4, FIX(0.330085509)) - /* (c2-c10)/2 */ + MULTIPLY(tmp1 - tmp5, FIX(0.239678205)); /* (c8-c12)/2 */ + z2 = MULTIPLY(tmp0 + tmp2, FIX(0.073342435)) - /* (c4-c6)/2 */ + MULTIPLY(tmp3 + tmp4, FIX(0.709910013)) + /* (c2+c10)/2 */ + MULTIPLY(tmp1 + tmp5, FIX(0.368787494)); /* (c8+c12)/2 */ + + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS+1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.001514908)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(0.881514751)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.710284161)) + /* c7 */ + MULTIPLY(tmp14 + tmp15, FIX(0.256335874)); /* c11 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(tmp10, FIX(1.530003162)) + /* c3+c5+c7-c1 */ + MULTIPLY(tmp14, FIX(0.241438564)); /* c9-c11 */ + tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.710284161)) - /* c7 */ + MULTIPLY(tmp11 + tmp12, FIX(0.256335874)); /* c11 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(0.881514751)); /* -c5 */ + tmp1 += tmp4 + tmp5 + + MULTIPLY(tmp11, FIX(0.634110155)) - /* c5+c9+c11-c3 */ + MULTIPLY(tmp14, FIX(1.773594819)); /* c1+c7 */ + tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.497774438)); /* -c9 */ + tmp2 += tmp4 + tmp6 - + MULTIPLY(tmp12, FIX(1.190715098)) + /* c1+c5-c9-c11 */ + MULTIPLY(tmp15, FIX(1.711799069)); /* c3+c7 */ + tmp3 += tmp5 + tmp6 + + MULTIPLY(tmp13, FIX(1.670519935)) - /* c3+c5+c9-c7 */ + MULTIPLY(tmp15, FIX(1.319646532)); /* c1+c11 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 14x14 sample block. + */ + +GLOBAL(void) +jpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + DCTELEM workspace[8*6]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/28). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]); + tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]); + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + (tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE); + tmp13 += tmp13; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.881747734)), /* c8 */ + CONST_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686)); /* c6 */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.613604268)), /* c10 */ + CONST_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(1.378756276)), /* c2 */ + CONST_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[7] = (DCTELEM) (tmp0 - tmp10 + tmp3 - tmp11 - tmp6); + tmp3 <<= CONST_BITS; + tmp10 = MULTIPLY(tmp10, - FIX(0.158341681)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(1.405321284)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.752406978)); /* c9 */ + dataptr[5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(1.119999435)), /* c1+c11-c9 */ + CONST_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.467085129)); /* c11 */ + dataptr[3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(3.069855259)), /* c1+c5+c11 */ + CONST_BITS); + dataptr[1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + tmp6 - + MULTIPLY(tmp0 + tmp6, FIX(1.126980169)), /* c3+c5-c1 */ + CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 14) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/14)**2 = 16/49, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/28) * 32/49. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3]; + tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+1); + tmp13 += tmp13; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.575835255)), /* c8 */ + CONST_BITS+1); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570)); /* c6 */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.400721155)), /* c10 */ + CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(0.900412262)), /* c2 */ + CONST_BITS+1); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+1); + tmp3 = MULTIPLY(tmp3 , FIX(0.653061224)); /* 32/49 */ + tmp10 = MULTIPLY(tmp10, - FIX(0.103406812)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(0.917760839)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.491367823)); /* c9 */ + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(0.731428202)), /* c1+c11-c9 */ + CONST_BITS+1); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.305035186)); /* c11 */ + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(2.004803435)), /* c1+c5+c11 */ + CONST_BITS+1); + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + - MULTIPLY(tmp0, FIX(0.735987049)) /* c3+c5-c1 */ + - MULTIPLY(tmp6, FIX(0.082925825)), /* c9-c11-c13 */ + CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 15x15 sample block. + */ + +GLOBAL(void) +jpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM workspace[8*7]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/30). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[14]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[13]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[12]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[11]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[10]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[9]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[8]); + tmp7 = GETJSAMPLE(elemptr[7]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[14]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[13]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[12]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[11]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[10]); + tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[9]); + tmp16 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[8]); + + z1 = tmp0 + tmp4 + tmp5; + z2 = tmp1 + tmp3 + tmp6; + z3 = tmp2 + tmp7; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) (z1 + z2 + z3 - 15 * CENTERJSAMPLE); + z3 += z3; + dataptr[6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z3, FIX(1.144122806)) - /* c6 */ + MULTIPLY(z2 - z3, FIX(0.437016024)), /* c12 */ + CONST_BITS); + tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7; + z1 = MULTIPLY(tmp3 - tmp2, FIX(1.531135173)) - /* c2+c14 */ + MULTIPLY(tmp6 - tmp2, FIX(2.238241955)); /* c4+c8 */ + z2 = MULTIPLY(tmp5 - tmp2, FIX(0.798468008)) - /* c8-c14 */ + MULTIPLY(tmp0 - tmp2, FIX(0.091361227)); /* c2-c4 */ + z3 = MULTIPLY(tmp0 - tmp3, FIX(1.383309603)) + /* c2 */ + MULTIPLY(tmp6 - tmp5, FIX(0.946293579)) + /* c8 */ + MULTIPLY(tmp1 - tmp4, FIX(0.790569415)); /* (c6+c12)/2 */ + + dataptr[2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS); + dataptr[4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS); + + /* Odd part */ + + tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16, + FIX(1.224744871)); /* c5 */ + tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.344997024)) + /* c3 */ + MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.831253876)); /* c9 */ + tmp12 = MULTIPLY(tmp12, FIX(1.224744871)); /* c5 */ + tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.406466353)) + /* c1 */ + MULTIPLY(tmp11 + tmp14, FIX(1.344997024)) + /* c3 */ + MULTIPLY(tmp13 + tmp15, FIX(0.575212477)); /* c11 */ + tmp0 = MULTIPLY(tmp13, FIX(0.475753014)) - /* c7-c11 */ + MULTIPLY(tmp14, FIX(0.513743148)) + /* c3-c9 */ + MULTIPLY(tmp16, FIX(1.700497885)) + tmp4 + tmp12; /* c1+c13 */ + tmp3 = MULTIPLY(tmp10, - FIX(0.355500862)) - /* -(c1-c7) */ + MULTIPLY(tmp11, FIX(2.176250899)) - /* c3+c9 */ + MULTIPLY(tmp15, FIX(0.869244010)) + tmp4 - tmp12; /* c11+c13 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 15) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/15)**2 = 64/225, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/30) * 256/225. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*3]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*2]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*1]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*0]; + tmp7 = dataptr[DCTSIZE*7]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*4]; + tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*3]; + tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*2]; + tmp15 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*1]; + tmp16 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*0]; + + z1 = tmp0 + tmp4 + tmp5; + z2 = tmp1 + tmp3 + tmp6; + z3 = tmp2 + tmp7; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + z2 + z3, FIX(1.137777778)), /* 256/225 */ + CONST_BITS+2); + z3 += z3; + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z3, FIX(1.301757503)) - /* c6 */ + MULTIPLY(z2 - z3, FIX(0.497227121)), /* c12 */ + CONST_BITS+2); + tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7; + z1 = MULTIPLY(tmp3 - tmp2, FIX(1.742091575)) - /* c2+c14 */ + MULTIPLY(tmp6 - tmp2, FIX(2.546621957)); /* c4+c8 */ + z2 = MULTIPLY(tmp5 - tmp2, FIX(0.908479156)) - /* c8-c14 */ + MULTIPLY(tmp0 - tmp2, FIX(0.103948774)); /* c2-c4 */ + z3 = MULTIPLY(tmp0 - tmp3, FIX(1.573898926)) + /* c2 */ + MULTIPLY(tmp6 - tmp5, FIX(1.076671805)) + /* c8 */ + MULTIPLY(tmp1 - tmp4, FIX(0.899492312)); /* (c6+c12)/2 */ + + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS+2); + + /* Odd part */ + + tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16, + FIX(1.393487498)); /* c5 */ + tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.530307725)) + /* c3 */ + MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.945782187)); /* c9 */ + tmp12 = MULTIPLY(tmp12, FIX(1.393487498)); /* c5 */ + tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.600246161)) + /* c1 */ + MULTIPLY(tmp11 + tmp14, FIX(1.530307725)) + /* c3 */ + MULTIPLY(tmp13 + tmp15, FIX(0.654463974)); /* c11 */ + tmp0 = MULTIPLY(tmp13, FIX(0.541301207)) - /* c7-c11 */ + MULTIPLY(tmp14, FIX(0.584525538)) + /* c3-c9 */ + MULTIPLY(tmp16, FIX(1.934788705)) + tmp4 + tmp12; /* c1+c13 */ + tmp3 = MULTIPLY(tmp10, - FIX(0.404480980)) - /* -(c1-c7) */ + MULTIPLY(tmp11, FIX(2.476089912)) - /* c3+c9 */ + MULTIPLY(tmp15, FIX(0.989006518)) + tmp4 - tmp12; /* c11+c13 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 16x16 sample block. + */ + +GLOBAL(void) +jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + DCTELEM workspace[DCTSIZE2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/32). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]); + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == DCTSIZE * 2) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/16)**2 = 1/2**2. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0]; + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS+PASS1_BITS+2); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+10 */ + CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS+PASS1_BITS+2); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 16x8 sample block. + * + * 16-point FDCT in pass 1 (rows), 8-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). */ + + dataptr = data; + ctr = 0; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]); + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by 8/16 = 1/2. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+1); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS+PASS1_BITS+1); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, + CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 14x7 sample block. + * + * 14-point FDCT in pass 1 (rows), 7-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero bottom row of output coefficient block. */ + MEMZERO(&data[DCTSIZE*7], SIZEOF(DCTELEM) * DCTSIZE); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28). */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]); + tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]); + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE) << PASS1_BITS); + tmp13 += tmp13; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.881747734)), /* c8 */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686)); /* c6 */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.613604268)), /* c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(1.378756276)), /* c2 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[7] = (DCTELEM) ((tmp0 - tmp10 + tmp3 - tmp11 - tmp6) << PASS1_BITS); + tmp3 <<= CONST_BITS; + tmp10 = MULTIPLY(tmp10, - FIX(0.158341681)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(1.405321284)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.752406978)); /* c9 */ + dataptr[5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(1.119999435)), /* c1+c11-c9 */ + CONST_BITS-PASS1_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.467085129)); /* c11 */ + dataptr[3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(3.069855259)), /* c1+c5+c11 */ + CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + tmp6 - + MULTIPLY(tmp0 + tmp6, FIX(1.126980169)), /* c3+c5-c1 */ + CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/14)*(8/7) = 32/49, which we + * partially fold into the constant multipliers and final shifting: + * 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14) * 64/49. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4]; + + z1 = tmp0 + tmp2; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */ + CONST_BITS+PASS1_BITS+1); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.461784020)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS+1); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509)); /* c4 */ + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355)); /* c3+c1-c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 12x6 sample block. + * + * 12-point FDCT in pass 1 (rows), 6-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 2 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*6], SIZEOF(DCTELEM) * DCTSIZE * 2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]); + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[6] = (DCTELEM) ((tmp13 - tmp14 - tmp15) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */ + CONST_BITS-PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.184591911)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.860918669)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(1.121971054)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX_0_541196100); /* c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/12)*(8/6) = 8/9, which we + * partially fold into the constant multipliers and final shifting: + * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 10x5 sample block. + * + * 10-point FDCT in pass 1 (rows), 5-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 3 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*5], SIZEOF(DCTELEM) * DCTSIZE * 3); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20). */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]); + tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]); + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << PASS1_BITS); + tmp12 += tmp12; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.437016024)), /* c8 */ + CONST_BITS-PASS1_BITS); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << PASS1_BITS); + tmp2 <<= CONST_BITS; + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.642039522)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.221231742)), /* c9 */ + CONST_BITS-PASS1_BITS); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.587785252)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) + /* (c3-c7)/2 */ + (tmp11 << (CONST_BITS - 1)) - tmp2; + dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/10)*(8/5) = 32/25, which we + * fold into the constant multipliers: + * 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10) * 32/25. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2]; + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(1.011928851)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.452548340)); /* (c2-c4)/2 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on an 8x4 sample block. + * + * 8-point FDCT in pass 1 (rows), 4-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 4 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*4], SIZEOF(DCTELEM) * DCTSIZE * 4); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by 8/4 = 2, which we add here. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << (PASS1_BITS+1)); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-2); + dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS-1); + dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS-1); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-2); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS-1); + dataptr[5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS-1); + dataptr[7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS+PASS1_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x3 sample block. + * + * 6-point FDCT in pass 1 (rows), 3-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS-1); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << (PASS1_BITS+1))); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << (PASS1_BITS+1)); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << (PASS1_BITS+1))); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1]; + + tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(2.177324216)), /* c1 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x2 sample block. + * + * 4-point FDCT in pass 1 (rows), 2-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here. */ + /* 4-point FDCT kernel, */ + /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */ + + dataptr = data; + for (ctr = 0; ctr < 2; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-4); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-3); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-3); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x1 sample block. + * + * 2-point FDCT in pass 1 (rows), 1-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + JSAMPROW elemptr; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + elemptr = sample_data[0] + start_col; + + tmp0 = GETJSAMPLE(elemptr[0]); + tmp1 = GETJSAMPLE(elemptr[1]); + + /* We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/2)*(8/1) = 2**5. + */ + + /* Even part */ + /* Apply unsigned->signed conversion */ + data[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5); + + /* Odd part */ + data[1] = (DCTELEM) ((tmp0 - tmp1) << 5); +} + + +/* + * Perform the forward DCT on an 8x16 sample block. + * + * 8-point FDCT in pass 1 (rows), 16-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + INT32 z1; + DCTELEM workspace[DCTSIZE2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == DCTSIZE * 2) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by 8/16 = 1/2. + * 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0]; + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS+PASS1_BITS+1); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 7x14 sample block. + * + * 7-point FDCT in pass 1 (rows), 14-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM workspace[8*6]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]); + tmp3 = GETJSAMPLE(elemptr[3]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]); + + z1 = tmp0 + tmp2; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.353553391)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123)); /* c6 */ + dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734)); /* c4 */ + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693)); /* c3+c1-c5 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 14) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/7)*(8/14) = 32/49, which we + * fold into the constant multipliers: + * 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28) * 32/49. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3]; + tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+PASS1_BITS); + tmp13 += tmp13; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.575835255)), /* c8 */ + CONST_BITS+PASS1_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570)); /* c6 */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.400721155)), /* c10 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(0.900412262)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+PASS1_BITS); + tmp3 = MULTIPLY(tmp3 , FIX(0.653061224)); /* 32/49 */ + tmp10 = MULTIPLY(tmp10, - FIX(0.103406812)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(0.917760839)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.491367823)); /* c9 */ + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(0.731428202)), /* c1+c11-c9 */ + CONST_BITS+PASS1_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.305035186)); /* c11 */ + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(2.004803435)), /* c1+c5+c11 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + - MULTIPLY(tmp0, FIX(0.735987049)) /* c3+c5-c1 */ + - MULTIPLY(tmp6, FIX(0.082925825)), /* c9-c11-c13 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x12 sample block. + * + * 6-point FDCT in pass 1 (rows), 12-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM workspace[8*4]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS)); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS)); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 12) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/12) = 8/9, which we + * fold into the constant multipliers: + * 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24) * 8/9. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6]; + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)), /* c4 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) + /* 8/9 */ + MULTIPLY(tmp13 + tmp15, FIX(1.214244803)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200)); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102)); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502)); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.164081699)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.765261039)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(0.997307603)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 5x10 sample block. + * + * 5-point FDCT in pass 1 (rows), 10-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM workspace[8*2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]); + tmp2 = GETJSAMPLE(elemptr[2]); + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.353553391)); /* (c2-c4)/2 */ + dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876)); /* c3 */ + + dataptr[1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */ + CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */ + CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 10) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/5)*(8/10) = 32/25, which we + * fold into the constant multipliers: + * 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20) * 32/25. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0]; + tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp12 += tmp12; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.559380511)), /* c8 */ + CONST_BITS+PASS1_BITS); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp2 = MULTIPLY(tmp2, FIX(1.28)); /* 32/25 */ + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.821810588)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.283176630)), /* c9 */ + CONST_BITS+PASS1_BITS); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.752365123)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) + /* (c3-c7)/2 */ + MULTIPLY(tmp11, FIX(0.64)) - tmp2; /* 16/25 */ + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x8 sample block. + * + * 4-point FDCT in pass 1 (rows), 8-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by 8/4 = 2, which we add here. */ + /* 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+1)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-2); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + /* Add fudge factor here for final descale. */ + tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1)); + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + dataptr[DCTSIZE*2] = (DCTELEM) + RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 3x6 sample block. + * + * 3-point FDCT in pass 1 (rows), 6-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]); + tmp1 = GETJSAMPLE(elemptr[1]); + + tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */ + CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(1.224744871)), /* c1 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x4 sample block. + * + * 2-point FDCT in pass 1 (rows), 4-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]); + tmp1 = GETJSAMPLE(elemptr[1]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3); + + /* Odd part */ + + dataptr[1] = (DCTELEM) ((tmp0 - tmp1) << 3); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * 4-point FDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. + */ + + dataptr = data; + for (ctr = 0; ctr < 2; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) (tmp0 + tmp1); + dataptr[DCTSIZE*2] = (DCTELEM) (tmp0 - tmp1); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 1x2 sample block. + * + * 1-point FDCT in pass 1 (rows), 2-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_1x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + tmp0 = GETJSAMPLE(sample_data[0][start_col]); + tmp1 = GETJSAMPLE(sample_data[1][start_col]); + + /* We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/1)*(8/2) = 2**5. + */ + + /* Even part */ + /* Apply unsigned->signed conversion */ + data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5); + + /* Odd part */ + data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp1) << 5); +} + +#endif /* DCT_SCALING_SUPPORTED */ +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jidctflt.c b/src/3rdparty/libjpeg/jidctflt.c new file mode 100644 index 0000000000..23ae9d333b --- /dev/null +++ b/src/3rdparty/libjpeg/jidctflt.c @@ -0,0 +1,235 @@ +/* + * jidctflt.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a floating-point implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * This implementation should be more accurate than either of the integer + * IDCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_FLOAT_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce a float result. + */ + +#define DEQUANTIZE(coef,quantval) (((FAST_FLOAT) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + FAST_FLOAT tmp10, tmp11, tmp12, tmp13; + FAST_FLOAT z5, z10, z11, z12, z13; + JCOEFPTR inptr; + FLOAT_MULT_TYPE * quantptr; + FAST_FLOAT * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = cinfo->sample_range_limit; + int ctr; + FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */ + + z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ + tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */ + tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 - tmp5; + + wsptr[DCTSIZE*0] = tmp0 + tmp7; + wsptr[DCTSIZE*7] = tmp0 - tmp7; + wsptr[DCTSIZE*1] = tmp1 + tmp6; + wsptr[DCTSIZE*6] = tmp1 - tmp6; + wsptr[DCTSIZE*2] = tmp2 + tmp5; + wsptr[DCTSIZE*5] = tmp2 - tmp5; + wsptr[DCTSIZE*3] = tmp3 + tmp4; + wsptr[DCTSIZE*4] = tmp3 - tmp4; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * And testing floats for zero is relatively expensive, so we don't bother. + */ + + /* Even part */ + + /* Apply signed->unsigned and prepare float->int conversion */ + z5 = wsptr[0] + ((FAST_FLOAT) CENTERJSAMPLE + (FAST_FLOAT) 0.5); + tmp10 = z5 + wsptr[4]; + tmp11 = z5 - wsptr[4]; + + tmp13 = wsptr[2] + wsptr[6]; + tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = wsptr[5] + wsptr[3]; + z10 = wsptr[5] - wsptr[3]; + z11 = wsptr[1] + wsptr[7]; + z12 = wsptr[1] - wsptr[7]; + + tmp7 = z11 + z13; + tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); + + z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ + tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */ + tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 - tmp5; + + /* Final output stage: float->int conversion and range-limit */ + + outptr[0] = range_limit[((int) (tmp0 + tmp7)) & RANGE_MASK]; + outptr[7] = range_limit[((int) (tmp0 - tmp7)) & RANGE_MASK]; + outptr[1] = range_limit[((int) (tmp1 + tmp6)) & RANGE_MASK]; + outptr[6] = range_limit[((int) (tmp1 - tmp6)) & RANGE_MASK]; + outptr[2] = range_limit[((int) (tmp2 + tmp5)) & RANGE_MASK]; + outptr[5] = range_limit[((int) (tmp2 - tmp5)) & RANGE_MASK]; + outptr[3] = range_limit[((int) (tmp3 + tmp4)) & RANGE_MASK]; + outptr[4] = range_limit[((int) (tmp3 - tmp4)) & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jidctfst.c b/src/3rdparty/libjpeg/jidctfst.c new file mode 100644 index 0000000000..dba4216fb9 --- /dev/null +++ b/src/3rdparty/libjpeg/jidctfst.c @@ -0,0 +1,368 @@ +/* + * jidctfst.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a fast, not so accurate integer implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with fixed-point math, + * accuracy is lost due to imprecise representation of the scaled + * quantization values. The smaller the quantization table entry, the less + * precise the scaled value, so this implementation does worse with high- + * quality-setting files than with low-quality ones. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_IFAST_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling decisions are generally the same as in the LL&M algorithm; + * see jidctint.c for more details. However, we choose to descale + * (right shift) multiplication products as soon as they are formed, + * rather than carrying additional fractional bits into subsequent additions. + * This compromises accuracy slightly, but it lets us save a few shifts. + * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) + * everywhere except in the multiplications proper; this saves a good deal + * of work on 16-bit-int machines. + * + * The dequantized coefficients are not integers because the AA&N scaling + * factors have been incorporated. We represent them scaled up by PASS1_BITS, + * so that the first and second IDCT rounds have the same input scaling. + * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to + * avoid a descaling shift; this compromises accuracy rather drastically + * for small quantization table entries, but it saves a lot of shifts. + * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway, + * so we use a much larger scaling factor to preserve accuracy. + * + * A final compromise is to represent the multiplicative constants to only + * 8 fractional bits, rather than 13. This saves some shifting work on some + * machines, and may also reduce the cost of multiplication (since there + * are fewer one-bits in the constants). + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 8 +#define PASS1_BITS 2 +#else +#define CONST_BITS 8 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 8 +#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */ +#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */ +#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */ +#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */ +#else +#define FIX_1_082392200 FIX(1.082392200) +#define FIX_1_414213562 FIX(1.414213562) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_2_613125930 FIX(2.613125930) +#endif + + +/* We can gain a little more speed, with a further compromise in accuracy, + * by omitting the addition in a descaling shift. This yields an incorrectly + * rounded result half the time... + */ + +#ifndef USE_ACCURATE_ROUNDING +#undef DESCALE +#define DESCALE(x,n) RIGHT_SHIFT(x, n) +#endif + + +/* Multiply a DCTELEM variable by an INT32 constant, and immediately + * descale to yield a DCTELEM result. + */ + +#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce a DCTELEM result. For 8-bit data a 16x16->16 + * multiplication will do. For 12-bit data, the multiplier table is + * declared INT32, so a 32-bit multiply will be used. + */ + +#if BITS_IN_JSAMPLE == 8 +#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval)) +#else +#define DEQUANTIZE(coef,quantval) \ + DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS) +#endif + + +/* Like DESCALE, but applies to a DCTELEM and produces an int. + * We assume that int right shift is unsigned if INT32 right shift is. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS DCTELEM ishift_temp; +#if BITS_IN_JSAMPLE == 8 +#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */ +#else +#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */ +#endif +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + +#ifdef USE_ACCURATE_ROUNDING +#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n)) +#else +#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n)) +#endif + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z5, z10, z11, z12, z13; + JCOEFPTR inptr; + IFAST_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS /* for DESCALE */ + ISHIFT_TEMPS /* for IDESCALE */ + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (IFAST_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); + wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); + wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); + wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); + wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5); + wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); + wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); + wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part */ + + tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); + tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); + + tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); + tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562) + - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; + z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; + z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; + z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + /* Final output stage: scale down by a factor of 8 and range-limit */ + + outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_IFAST_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jidctint.c b/src/3rdparty/libjpeg/jidctint.c new file mode 100644 index 0000000000..dcdf7ce454 --- /dev/null +++ b/src/3rdparty/libjpeg/jidctint.c @@ -0,0 +1,5137 @@ +/* + * jidctint.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modification developed 2002-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + * + * We also provide IDCT routines with various output sample block sizes for + * direct resolution reduction or enlargement and for direct resolving the + * common 2x1 and 1x2 subsampling cases without additional resampling: NxN + * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 input DCT block. + * + * For N<8 we simply take the corresponding low-frequency coefficients of + * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block + * to yield the downscaled outputs. + * This can be seen as direct low-pass downsampling from the DCT domain + * point of view rather than the usual spatial domain point of view, + * yielding significant computational savings and results at least + * as good as common bilinear (averaging) spatial downsampling. + * + * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as + * lower frequencies and higher frequencies assumed to be zero. + * It turns out that the computational effort is similar to the 8x8 IDCT + * regarding the output size. + * Furthermore, the scaling and descaling is the same for all IDCT sizes. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */ +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) + * larger than the true IDCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D IDCT, + * because the y0 and y4 inputs need not be divided by sqrt(N). + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (To scale up 12-bit sample data further, an + * intermediate INT32 array would be needed.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce an int result. In this module, both inputs and result + * are 16 bits or less, so either int or short multiply will work. + */ + +#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#ifdef IDCT_SCALING_SUPPORTED + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x7 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/14). + */ + +GLOBAL(void) +jpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[7*7]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp13 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp13 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp13 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) RIGHT_SHIFT(tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp13 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp13 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x6 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/12). + */ + +GLOBAL(void) +jpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) (tmp11 + tmp1); + wsptr[6*4] = (int) (tmp11 - tmp1); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 5x5 output block. + * + * Optimized algorithm with 5 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/10). + */ + +GLOBAL(void) +jpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[5*5]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp0 = (INT32) wsptr[2]; + tmp1 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 4x4 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + +GLOBAL(void) +jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[4*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << PASS1_BITS; + tmp12 = (tmp0 - tmp2) << PASS1_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Final output stage */ + + wsptr[4*0] = (int) (tmp10 + tmp0); + wsptr[4*3] = (int) (tmp10 - tmp0); + wsptr[4*1] = (int) (tmp12 + tmp2); + wsptr[4*2] = (int) (tmp12 - tmp2); + } + + /* Pass 2: process 4 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp2 = (INT32) wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x3 output block. + * + * Optimized algorithm with 2 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/6). + */ + +GLOBAL(void) +jpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*3]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 2x2 output block. + * + * Multiplication-less algorithm. + */ + +GLOBAL(void) +jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Pass 1: process columns from input. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Column 0 */ + tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]); + /* Add fudge factor here for final descale. */ + tmp4 += ONE << 2; + + tmp0 = tmp4 + tmp5; + tmp2 = tmp4 - tmp5; + + /* Column 1 */ + tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0+1], quantptr[DCTSIZE*0+1]); + tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1+1], quantptr[DCTSIZE*1+1]); + + tmp1 = tmp4 + tmp5; + tmp3 = tmp4 - tmp5; + + /* Pass 2: process 2 rows, store into output array. */ + + /* Row 0 */ + outptr = output_buf[0] + output_col; + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK]; + + /* Row 1 */ + outptr = output_buf[1] + output_col; + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 1x1 output block. + * + * We hardly need an inverse DCT routine for this: just take the + * average pixel value, which is one-eighth of the DC coefficient. + */ + +GLOBAL(void) +jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + int dcval; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* 1x1 is trivial: just take the DC coefficient divided by 8. */ + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + dcval = DEQUANTIZE(coef_block[0], quantptr[0]); + dcval = (int) DESCALE((INT32) dcval, 3); + + output_buf[0][output_col] = range_limit[dcval & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 9x9 output block. + * + * Optimized algorithm with 10 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/18). + */ + +GLOBAL(void) +jpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*9]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp13 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp13 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 9 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 9; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x10 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/20). + */ + +GLOBAL(void) +jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*10]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) (tmp22 + tmp12); + wsptr[8*7] = (int) (tmp22 - tmp12); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 11x11 output block. + * + * Optimized algorithm with 24 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/22). + */ + +GLOBAL(void) +jpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*11]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 11 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 11; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x12 output block. + * + * Optimized algorithm with 15 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/24). + */ + +GLOBAL(void) +jpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*12]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 13x13 output block. + * + * Optimized algorithm with 29 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/26). + */ + +GLOBAL(void) +jpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*13]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 13 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 13; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x14 output block. + * + * Optimized algorithm with 20 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/28). + */ + +GLOBAL(void) +jpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*14]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) (tmp23 + tmp13); + wsptr[8*10] = (int) (tmp23 - tmp13); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 15x15 output block. + * + * Optimized algorithm with 22 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/30). + */ + +GLOBAL(void) +jpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*15]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z4 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 15 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 15; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z4 = (INT32) wsptr[5]; + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = (INT32) wsptr[7]; + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x16 output block. + * + * Optimized algorithm with 28 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/32). + */ + +GLOBAL(void) +jpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*16]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += 1 << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 16 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 16; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x8 output block. + * + * 8-point IDCT in pass 1 (columns), 16-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*8]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process 8 rows from work array, store into output array. + * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x7 output block. + * + * 7-point IDCT in pass 1 (columns), 14-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*7]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp23 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp23 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp23 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp10 = z1 + z3; + z2 -= tmp10; + tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */ + tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp10 = tmp11 - tmp12; + tmp11 += tmp12; + tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp11 += tmp12; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp10 += z2; + tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. + * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28). + */ + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x6 output block. + * + * 6-point IDCT in pass 1 (columns), 12-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp12 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */ + tmp11 = tmp10 + tmp20; + tmp21 = RIGHT_SHIFT(tmp10 - tmp20 - tmp20, CONST_BITS-PASS1_BITS); + tmp20 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */ + tmp20 = tmp11 + tmp10; + tmp22 = tmp11 - tmp10; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp10 = tmp11 + ((z1 + z2) << CONST_BITS); + tmp12 = tmp11 + ((z3 - z2) << CONST_BITS); + tmp11 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) (tmp21 + tmp11); + wsptr[8*4] = (int) (tmp21 - tmp11); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. + * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24). + */ + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x5 output block. + * + * 5-point IDCT in pass 1 (columns), 10-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*5]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp13 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp14 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp10 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp11 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. + * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20). + */ + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 8x4 output block. + * + * 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << PASS1_BITS; + tmp12 = (tmp0 - tmp2) << PASS1_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Final output stage */ + + wsptr[8*0] = (int) (tmp10 + tmp0); + wsptr[8*3] = (int) (tmp10 - tmp0); + wsptr[8*1] = (int) (tmp12 + tmp2); + wsptr[8*2] = (int) (tmp12 - tmp2); + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x3 output block. + * + * 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*3]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 4x2 output block. + * + * 2-point IDCT in pass 1 (columns), 4-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + INT32 * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + INT32 workspace[4*2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + /* Odd part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* Final output stage */ + + wsptr[4*0] = tmp10 + tmp0; + wsptr[4*1] = tmp10 - tmp0; + } + + /* Pass 2: process 2 rows from work array, store into output array. + * 4-point IDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = wsptr[0] + (ONE << 2); + tmp2 = wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = wsptr[1]; + z3 = wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 2x1 output block. + * + * 1-point IDCT in pass 1 (columns), 2-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10; + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Pass 1: empty. */ + + /* Pass 2: process 1 row from input, store into output array. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + outptr = output_buf[0] + output_col; + + /* Even part */ + + tmp10 = DEQUANTIZE(coef_block[0], quantptr[0]); + /* Add fudge factor here for final descale. */ + tmp10 += ONE << 2; + + /* Odd part */ + + tmp0 = DEQUANTIZE(coef_block[1], quantptr[1]); + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 8x16 output block. + * + * 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*16]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < 16; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x14 output block. + * + * 14-point IDCT in pass 1 (columns), 7-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[7*14]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[7*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[7*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[7*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) (tmp23 + tmp13); + wsptr[7*10] = (int) (tmp23 - tmp13); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[7*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[7*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[7*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. + * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14). + */ + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp23 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp23 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp10 = z1 + z3; + z2 -= tmp10; + tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */ + tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp10 = tmp11 - tmp12; + tmp11 += tmp12; + tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp11 += tmp12; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp10 += z2; + tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 6x12 output block. + * + * 12-point IDCT in pass 1 (columns), 6-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*12]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[6*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[6*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[6*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[6*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[6*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[6*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[6*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + tmp12 = (INT32) wsptr[4]; + tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */ + tmp11 = tmp10 + tmp20; + tmp21 = tmp10 - tmp20 - tmp20; + tmp20 = (INT32) wsptr[2]; + tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */ + tmp20 = tmp11 + tmp10; + tmp22 = tmp11 - tmp10; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp10 = tmp11 + ((z1 + z2) << CONST_BITS); + tmp12 = tmp11 + ((z3 - z2) << CONST_BITS); + tmp11 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 5x10 output block. + * + * 10-point IDCT in pass 1 (columns), 5-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[5*10]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[5*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[5*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) (tmp22 + tmp12); + wsptr[5*7] = (int) (tmp22 - tmp12); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[5*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[5*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. + * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10). + */ + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp13 = (INT32) wsptr[2]; + tmp14 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 4x8 output block. + * + * 8-point IDCT in pass 1 (columns), 4-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[4*8]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 4; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[4*0] = dcval; + wsptr[4*1] = dcval; + wsptr[4*2] = dcval; + wsptr[4*3] = dcval; + wsptr[4*4] = dcval; + wsptr[4*5] = dcval; + wsptr[4*6] = dcval; + wsptr[4*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[4*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[4*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[4*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[4*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[4*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[4*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[4*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[4*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process 8 rows from work array, store into output array. + * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp2 = (INT32) wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x6 output block. + * + * 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) (tmp11 + tmp1); + wsptr[3*4] = (int) (tmp11 - tmp1); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[3*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. + * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6). + */ + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 2x4 output block. + * + * 4-point IDCT in pass 1 (columns), 2-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + INT32 * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + INT32 workspace[2*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 4-point IDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + wsptr[2*0] = tmp10 + tmp0; + wsptr[2*3] = tmp10 - tmp0; + wsptr[2*1] = tmp12 + tmp2; + wsptr[2*2] = tmp12 - tmp2; + } + + /* Pass 2: process 4 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = wsptr[0] + (ONE << (CONST_BITS+2)); + + /* Odd part */ + + tmp0 = wsptr[1]; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS+3) + & RANGE_MASK]; + + wsptr += 2; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 1x2 output block. + * + * 2-point IDCT in pass 1 (columns), 1-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Process 1 column from input, store into output array. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Even part */ + + tmp10 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]); + /* Add fudge factor here for final descale. */ + tmp10 += ONE << 2; + + /* Odd part */ + + tmp0 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* Final output stage */ + + output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) + & RANGE_MASK]; + output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) + & RANGE_MASK]; +} + +#endif /* IDCT_SCALING_SUPPORTED */ +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jinclude.h b/src/3rdparty/libjpeg/jinclude.h new file mode 100644 index 0000000000..a61939daaa --- /dev/null +++ b/src/3rdparty/libjpeg/jinclude.h @@ -0,0 +1,95 @@ +/* + * jinclude.h + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file exists to provide a single place to fix any problems with + * including the wrong system include files. (Common problems are taken + * care of by the standard jconfig symbols, but on really weird systems + * you may have to edit this file.) + * + * NOTE: this file is NOT intended to be included by applications using the + * JPEG library. Most applications need only include jpeglib.h. + */ + + +/* Include auto-config file to find out which system include files we need. */ + +#include "jconfig.h" /* auto configuration options */ +#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ + +#ifdef _MSC_VER +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* + * We need the NULL macro and size_t typedef. + * On an ANSI-conforming system it is sufficient to include . + * Otherwise, we get them from or ; we may have to + * pull in as well. + * Note that the core JPEG library does not require ; + * only the default error handler and data source/destination modules do. + * But we must pull it in because of the references to FILE in jpeglib.h. + * You can remove those references if you want to compile without . + */ + +#ifdef HAVE_STDDEF_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif + +#ifdef NEED_SYS_TYPES_H +#include +#endif + +#include + +/* + * We need memory copying and zeroing functions, plus strncpy(). + * ANSI and System V implementations declare these in . + * BSD doesn't have the mem() functions, but it does have bcopy()/bzero(). + * Some systems may declare memset and memcpy in . + * + * NOTE: we assume the size parameters to these functions are of type size_t. + * Change the casts in these macros if not! + */ + +#ifdef NEED_BSD_STRINGS + +#include +#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size)) +#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size)) + +#else /* not BSD, assume ANSI/SysV string lib */ + +#include +#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) +#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) + +#endif + +/* + * In ANSI C, and indeed any rational implementation, size_t is also the + * type returned by sizeof(). However, it seems there are some irrational + * implementations out there, in which sizeof() returns an int even though + * size_t is defined as long or unsigned long. To ensure consistent results + * we always use this SIZEOF() macro in place of using sizeof() directly. + */ + +#define SIZEOF(object) ((size_t) sizeof(object)) + +/* + * The modules that use fread() and fwrite() always invoke them through + * these macros. On some systems you may need to twiddle the argument casts. + * CAUTION: argument order is different from underlying functions! + */ + +#define JFREAD(file,buf,sizeofbuf) \ + ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) +#define JFWRITE(file,buf,sizeofbuf) \ + ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) diff --git a/src/3rdparty/libjpeg/jmemansi.c b/src/3rdparty/libjpeg/jmemansi.c new file mode 100644 index 0000000000..2d93e49625 --- /dev/null +++ b/src/3rdparty/libjpeg/jmemansi.c @@ -0,0 +1,167 @@ +/* + * jmemansi.c + * + * Copyright (C) 1992-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides a simple generic implementation of the system- + * dependent portion of the JPEG memory manager. This implementation + * assumes that you have the ANSI-standard library routine tmpfile(). + * Also, the problem of determining the amount of memory available + * is shoved onto the user. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + +#ifndef SEEK_SET /* pre-ANSI systems may not define this; */ +#define SEEK_SET 0 /* if not, assume 0 is correct */ +#endif + + +/* + * Memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * "Large" objects are treated the same as "small" ones. + * NB: although we include FAR keywords in the routine declarations, + * this file won't actually work in 80x86 small/medium model; at least, + * you probably won't be able to process useful-size images in only 64KB. + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * This routine computes the total memory space available for allocation. + * It's impossible to do this in a portable way; our current solution is + * to make the user tell us (with a default value set at compile time). + * If you can actually get the available space, it's a good idea to subtract + * a slop factor of 5% or so. + */ + +#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ +#define DEFAULT_MAX_MEM 1000000L /* default: one megabyte */ +#endif + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return cinfo->mem->max_memory_to_use - already_allocated; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + + +METHODDEF(void) +read_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFREAD(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFWRITE(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_backing_store (j_common_ptr cinfo, backing_store_ptr info) +{ + fclose(info->temp_file); + /* Since this implementation uses tmpfile() to create the file, + * no explicit file deletion is needed. + */ +} + + +/* + * Initial opening of a backing-store object. + * + * This version uses tmpfile(), which constructs a suitable file name + * behind the scenes. We don't have to use info->temp_name[] at all; + * indeed, we can't even find out the actual name of the temp file. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + if ((info->temp_file = tmpfile()) == NULL) + ERREXITS(cinfo, JERR_TFILE_CREATE, ""); + info->read_backing_store = read_backing_store; + info->write_backing_store = write_backing_store; + info->close_backing_store = close_backing_store; +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/src/3rdparty/libjpeg/jmemdos.c b/src/3rdparty/libjpeg/jmemdos.c new file mode 100644 index 0000000000..60b45c6938 --- /dev/null +++ b/src/3rdparty/libjpeg/jmemdos.c @@ -0,0 +1,638 @@ +/* + * jmemdos.c + * + * Copyright (C) 1992-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides an MS-DOS-compatible implementation of the system- + * dependent portion of the JPEG memory manager. Temporary data can be + * stored in extended or expanded memory as well as in regular DOS files. + * + * If you use this file, you must be sure that NEED_FAR_POINTERS is defined + * if you compile in a small-data memory model; it should NOT be defined if + * you use a large-data memory model. This file is not recommended if you + * are using a flat-memory-space 386 environment such as DJGCC or Watcom C. + * Also, this code will NOT work if struct fields are aligned on greater than + * 2-byte boundaries. + * + * Based on code contributed by Ge' Weijers. + */ + +/* + * If you have both extended and expanded memory, you may want to change the + * order in which they are tried in jopen_backing_store. On a 286 machine + * expanded memory is usually faster, since extended memory access involves + * an expensive protected-mode-and-back switch. On 386 and better, extended + * memory is usually faster. As distributed, the code tries extended memory + * first (what? not everyone has a 386? :-). + * + * You can disable use of extended/expanded memory entirely by altering these + * definitions or overriding them from the Makefile (eg, -DEMS_SUPPORTED=0). + */ + +#ifndef XMS_SUPPORTED +#define XMS_SUPPORTED 1 +#endif +#ifndef EMS_SUPPORTED +#define EMS_SUPPORTED 1 +#endif + + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef HAVE_STDLIB_H /* should declare these */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +extern char * getenv JPP((const char * name)); +#endif + +#ifdef NEED_FAR_POINTERS + +#ifdef __TURBOC__ +/* These definitions work for Borland C (Turbo C) */ +#include /* need farmalloc(), farfree() */ +#define far_malloc(x) farmalloc(x) +#define far_free(x) farfree(x) +#else +/* These definitions work for Microsoft C and compatible compilers */ +#include /* need _fmalloc(), _ffree() */ +#define far_malloc(x) _fmalloc(x) +#define far_free(x) _ffree(x) +#endif + +#else /* not NEED_FAR_POINTERS */ + +#define far_malloc(x) malloc(x) +#define far_free(x) free(x) + +#endif /* NEED_FAR_POINTERS */ + +#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ +#define READ_BINARY "r" +#else +#define READ_BINARY "rb" +#endif + +#ifndef USE_MSDOS_MEMMGR /* make sure user got configuration right */ + You forgot to define USE_MSDOS_MEMMGR in jconfig.h. /* deliberate syntax error */ +#endif + +#if MAX_ALLOC_CHUNK >= 65535L /* make sure jconfig.h got this right */ + MAX_ALLOC_CHUNK should be less than 64K. /* deliberate syntax error */ +#endif + + +/* + * Declarations for assembly-language support routines (see jmemdosa.asm). + * + * The functions are declared "far" as are all their pointer arguments; + * this ensures the assembly source code will work regardless of the + * compiler memory model. We assume "short" is 16 bits, "long" is 32. + */ + +typedef void far * XMSDRIVER; /* actually a pointer to code */ +typedef struct { /* registers for calling XMS driver */ + unsigned short ax, dx, bx; + void far * ds_si; + } XMScontext; +typedef struct { /* registers for calling EMS driver */ + unsigned short ax, dx, bx; + void far * ds_si; + } EMScontext; + +extern short far jdos_open JPP((short far * handle, char far * filename)); +extern short far jdos_close JPP((short handle)); +extern short far jdos_seek JPP((short handle, long offset)); +extern short far jdos_read JPP((short handle, void far * buffer, + unsigned short count)); +extern short far jdos_write JPP((short handle, void far * buffer, + unsigned short count)); +extern void far jxms_getdriver JPP((XMSDRIVER far *)); +extern void far jxms_calldriver JPP((XMSDRIVER, XMScontext far *)); +extern short far jems_available JPP((void)); +extern void far jems_calldriver JPP((EMScontext far *)); + + +/* + * Selection of a file name for a temporary file. + * This is highly system-dependent, and you may want to customize it. + */ + +static int next_file_num; /* to distinguish among several temp files */ + +LOCAL(void) +select_file_name (char * fname) +{ + const char * env; + char * ptr; + FILE * tfile; + + /* Keep generating file names till we find one that's not in use */ + for (;;) { + /* Get temp directory name from environment TMP or TEMP variable; + * if none, use "." + */ + if ((env = (const char *) getenv("TMP")) == NULL) + if ((env = (const char *) getenv("TEMP")) == NULL) + env = "."; + if (*env == '\0') /* null string means "." */ + env = "."; + ptr = fname; /* copy name to fname */ + while (*env != '\0') + *ptr++ = *env++; + if (ptr[-1] != '\\' && ptr[-1] != '/') + *ptr++ = '\\'; /* append backslash if not in env variable */ + /* Append a suitable file name */ + next_file_num++; /* advance counter */ + sprintf(ptr, "JPG%03d.TMP", next_file_num); + /* Probe to see if file name is already in use */ + if ((tfile = fopen(fname, READ_BINARY)) == NULL) + break; + fclose(tfile); /* oops, it's there; close tfile & try again */ + } +} + + +/* + * Near-memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * "Large" objects are allocated in far memory, if possible + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) far_malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + far_free(object); +} + + +/* + * This routine computes the total memory space available for allocation. + * It's impossible to do this in a portable way; our current solution is + * to make the user tell us (with a default value set at compile time). + * If you can actually get the available space, it's a good idea to subtract + * a slop factor of 5% or so. + */ + +#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ +#define DEFAULT_MAX_MEM 300000L /* for total usage about 450K */ +#endif + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return cinfo->mem->max_memory_to_use - already_allocated; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + +/* + * For MS-DOS we support three types of backing storage: + * 1. Conventional DOS files. We access these by direct DOS calls rather + * than via the stdio package. This provides a bit better performance, + * but the real reason is that the buffers to be read or written are FAR. + * The stdio library for small-data memory models can't cope with that. + * 2. Extended memory, accessed per the XMS V2.0 specification. + * 3. Expanded memory, accessed per the LIM/EMS 4.0 specification. + * You'll need copies of those specs to make sense of the related code. + * The specs are available by Internet FTP from the SIMTEL archives + * (oak.oakland.edu and its various mirror sites). See files + * pub/msdos/microsoft/xms20.arc and pub/msdos/info/limems41.zip. + */ + + +/* + * Access methods for a DOS file. + */ + + +METHODDEF(void) +read_file_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (jdos_seek(info->handle.file_handle, file_offset)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ + if (byte_count > 65535L) /* safety check */ + ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); + if (jdos_read(info->handle.file_handle, buffer_address, + (unsigned short) byte_count)) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_file_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (jdos_seek(info->handle.file_handle, file_offset)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ + if (byte_count > 65535L) /* safety check */ + ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); + if (jdos_write(info->handle.file_handle, buffer_address, + (unsigned short) byte_count)) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_file_store (j_common_ptr cinfo, backing_store_ptr info) +{ + jdos_close(info->handle.file_handle); /* close the file */ + remove(info->temp_name); /* delete the file */ +/* If your system doesn't have remove(), try unlink() instead. + * remove() is the ANSI-standard name for this function, but + * unlink() was more common in pre-ANSI systems. + */ + TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name); +} + + +LOCAL(boolean) +open_file_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + short handle; + + select_file_name(info->temp_name); + if (jdos_open((short far *) & handle, (char far *) info->temp_name)) { + /* might as well exit since jpeg_open_backing_store will fail anyway */ + ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); + return FALSE; + } + info->handle.file_handle = handle; + info->read_backing_store = read_file_store; + info->write_backing_store = write_file_store; + info->close_backing_store = close_file_store; + TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); + return TRUE; /* succeeded */ +} + + +/* + * Access methods for extended memory. + */ + +#if XMS_SUPPORTED + +static XMSDRIVER xms_driver; /* saved address of XMS driver */ + +typedef union { /* either long offset or real-mode pointer */ + long offset; + void far * ptr; + } XMSPTR; + +typedef struct { /* XMS move specification structure */ + long length; + XMSH src_handle; + XMSPTR src; + XMSH dst_handle; + XMSPTR dst; + } XMSspec; + +#define ODD(X) (((X) & 1L) != 0) + + +METHODDEF(void) +read_xms_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + XMScontext ctx; + XMSspec spec; + char endbuffer[2]; + + /* The XMS driver can't cope with an odd length, so handle the last byte + * specially if byte_count is odd. We don't expect this to be common. + */ + + spec.length = byte_count & (~ 1L); + spec.src_handle = info->handle.xms_handle; + spec.src.offset = file_offset; + spec.dst_handle = 0; + spec.dst.ptr = buffer_address; + + ctx.ds_si = (void far *) & spec; + ctx.ax = 0x0b00; /* EMB move */ + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + if (ctx.ax != 1) + ERREXIT(cinfo, JERR_XMS_READ); + + if (ODD(byte_count)) { + read_xms_store(cinfo, info, (void FAR *) endbuffer, + file_offset + byte_count - 1L, 2L); + ((char FAR *) buffer_address)[byte_count - 1L] = endbuffer[0]; + } +} + + +METHODDEF(void) +write_xms_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + XMScontext ctx; + XMSspec spec; + char endbuffer[2]; + + /* The XMS driver can't cope with an odd length, so handle the last byte + * specially if byte_count is odd. We don't expect this to be common. + */ + + spec.length = byte_count & (~ 1L); + spec.src_handle = 0; + spec.src.ptr = buffer_address; + spec.dst_handle = info->handle.xms_handle; + spec.dst.offset = file_offset; + + ctx.ds_si = (void far *) & spec; + ctx.ax = 0x0b00; /* EMB move */ + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + if (ctx.ax != 1) + ERREXIT(cinfo, JERR_XMS_WRITE); + + if (ODD(byte_count)) { + read_xms_store(cinfo, info, (void FAR *) endbuffer, + file_offset + byte_count - 1L, 2L); + endbuffer[0] = ((char FAR *) buffer_address)[byte_count - 1L]; + write_xms_store(cinfo, info, (void FAR *) endbuffer, + file_offset + byte_count - 1L, 2L); + } +} + + +METHODDEF(void) +close_xms_store (j_common_ptr cinfo, backing_store_ptr info) +{ + XMScontext ctx; + + ctx.dx = info->handle.xms_handle; + ctx.ax = 0x0a00; + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + TRACEMS1(cinfo, 1, JTRC_XMS_CLOSE, info->handle.xms_handle); + /* we ignore any error return from the driver */ +} + + +LOCAL(boolean) +open_xms_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + XMScontext ctx; + + /* Get address of XMS driver */ + jxms_getdriver((XMSDRIVER far *) & xms_driver); + if (xms_driver == NULL) + return FALSE; /* no driver to be had */ + + /* Get version number, must be >= 2.00 */ + ctx.ax = 0x0000; + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + if (ctx.ax < (unsigned short) 0x0200) + return FALSE; + + /* Try to get space (expressed in kilobytes) */ + ctx.dx = (unsigned short) ((total_bytes_needed + 1023L) >> 10); + ctx.ax = 0x0900; + jxms_calldriver(xms_driver, (XMScontext far *) & ctx); + if (ctx.ax != 1) + return FALSE; + + /* Succeeded, save the handle and away we go */ + info->handle.xms_handle = ctx.dx; + info->read_backing_store = read_xms_store; + info->write_backing_store = write_xms_store; + info->close_backing_store = close_xms_store; + TRACEMS1(cinfo, 1, JTRC_XMS_OPEN, ctx.dx); + return TRUE; /* succeeded */ +} + +#endif /* XMS_SUPPORTED */ + + +/* + * Access methods for expanded memory. + */ + +#if EMS_SUPPORTED + +/* The EMS move specification structure requires word and long fields aligned + * at odd byte boundaries. Some compilers will align struct fields at even + * byte boundaries. While it's usually possible to force byte alignment, + * that causes an overall performance penalty and may pose problems in merging + * JPEG into a larger application. Instead we accept some rather dirty code + * here. Note this code would fail if the hardware did not allow odd-byte + * word & long accesses, but all 80x86 CPUs do. + */ + +typedef void far * EMSPTR; + +typedef union { /* EMS move specification structure */ + long length; /* It's easy to access first 4 bytes */ + char bytes[18]; /* Misaligned fields in here! */ + } EMSspec; + +/* Macros for accessing misaligned fields */ +#define FIELD_AT(spec,offset,type) (*((type *) &(spec.bytes[offset]))) +#define SRC_TYPE(spec) FIELD_AT(spec,4,char) +#define SRC_HANDLE(spec) FIELD_AT(spec,5,EMSH) +#define SRC_OFFSET(spec) FIELD_AT(spec,7,unsigned short) +#define SRC_PAGE(spec) FIELD_AT(spec,9,unsigned short) +#define SRC_PTR(spec) FIELD_AT(spec,7,EMSPTR) +#define DST_TYPE(spec) FIELD_AT(spec,11,char) +#define DST_HANDLE(spec) FIELD_AT(spec,12,EMSH) +#define DST_OFFSET(spec) FIELD_AT(spec,14,unsigned short) +#define DST_PAGE(spec) FIELD_AT(spec,16,unsigned short) +#define DST_PTR(spec) FIELD_AT(spec,14,EMSPTR) + +#define EMSPAGESIZE 16384L /* gospel, see the EMS specs */ + +#define HIBYTE(W) (((W) >> 8) & 0xFF) +#define LOBYTE(W) ((W) & 0xFF) + + +METHODDEF(void) +read_ems_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + EMScontext ctx; + EMSspec spec; + + spec.length = byte_count; + SRC_TYPE(spec) = 1; + SRC_HANDLE(spec) = info->handle.ems_handle; + SRC_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); + SRC_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); + DST_TYPE(spec) = 0; + DST_HANDLE(spec) = 0; + DST_PTR(spec) = buffer_address; + + ctx.ds_si = (void far *) & spec; + ctx.ax = 0x5700; /* move memory region */ + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0) + ERREXIT(cinfo, JERR_EMS_READ); +} + + +METHODDEF(void) +write_ems_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + EMScontext ctx; + EMSspec spec; + + spec.length = byte_count; + SRC_TYPE(spec) = 0; + SRC_HANDLE(spec) = 0; + SRC_PTR(spec) = buffer_address; + DST_TYPE(spec) = 1; + DST_HANDLE(spec) = info->handle.ems_handle; + DST_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); + DST_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); + + ctx.ds_si = (void far *) & spec; + ctx.ax = 0x5700; /* move memory region */ + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0) + ERREXIT(cinfo, JERR_EMS_WRITE); +} + + +METHODDEF(void) +close_ems_store (j_common_ptr cinfo, backing_store_ptr info) +{ + EMScontext ctx; + + ctx.ax = 0x4500; + ctx.dx = info->handle.ems_handle; + jems_calldriver((EMScontext far *) & ctx); + TRACEMS1(cinfo, 1, JTRC_EMS_CLOSE, info->handle.ems_handle); + /* we ignore any error return from the driver */ +} + + +LOCAL(boolean) +open_ems_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + EMScontext ctx; + + /* Is EMS driver there? */ + if (! jems_available()) + return FALSE; + + /* Get status, make sure EMS is OK */ + ctx.ax = 0x4000; + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0) + return FALSE; + + /* Get version, must be >= 4.0 */ + ctx.ax = 0x4600; + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0 || LOBYTE(ctx.ax) < 0x40) + return FALSE; + + /* Try to allocate requested space */ + ctx.ax = 0x4300; + ctx.bx = (unsigned short) ((total_bytes_needed + EMSPAGESIZE-1L) / EMSPAGESIZE); + jems_calldriver((EMScontext far *) & ctx); + if (HIBYTE(ctx.ax) != 0) + return FALSE; + + /* Succeeded, save the handle and away we go */ + info->handle.ems_handle = ctx.dx; + info->read_backing_store = read_ems_store; + info->write_backing_store = write_ems_store; + info->close_backing_store = close_ems_store; + TRACEMS1(cinfo, 1, JTRC_EMS_OPEN, ctx.dx); + return TRUE; /* succeeded */ +} + +#endif /* EMS_SUPPORTED */ + + +/* + * Initial opening of a backing-store object. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + /* Try extended memory, then expanded memory, then regular file. */ +#if XMS_SUPPORTED + if (open_xms_store(cinfo, info, total_bytes_needed)) + return; +#endif +#if EMS_SUPPORTED + if (open_ems_store(cinfo, info, total_bytes_needed)) + return; +#endif + if (open_file_store(cinfo, info, total_bytes_needed)) + return; + ERREXITS(cinfo, JERR_TFILE_CREATE, ""); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + next_file_num = 0; /* initialize temp file name generator */ + return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* Microsoft C, at least in v6.00A, will not successfully reclaim freed + * blocks of size > 32Kbytes unless we give it a kick in the rear, like so: + */ +#ifdef NEED_FHEAPMIN + _fheapmin(); +#endif +} diff --git a/src/3rdparty/libjpeg/jmemdosa.asm b/src/3rdparty/libjpeg/jmemdosa.asm new file mode 100644 index 0000000000..ecd43729fe --- /dev/null +++ b/src/3rdparty/libjpeg/jmemdosa.asm @@ -0,0 +1,379 @@ +; +; jmemdosa.asm +; +; Copyright (C) 1992, Thomas G. Lane. +; This file is part of the Independent JPEG Group's software. +; For conditions of distribution and use, see the accompanying README file. +; +; This file contains low-level interface routines to support the MS-DOS +; backing store manager (jmemdos.c). Routines are provided to access disk +; files through direct DOS calls, and to access XMS and EMS drivers. +; +; This file should assemble with Microsoft's MASM or any compatible +; assembler (including Borland's Turbo Assembler). If you haven't got +; a compatible assembler, better fall back to jmemansi.c or jmemname.c. +; +; To minimize dependence on the C compiler's register usage conventions, +; we save and restore all 8086 registers, even though most compilers only +; require SI,DI,DS to be preserved. Also, we use only 16-bit-wide return +; values, which everybody returns in AX. +; +; Based on code contributed by Ge' Weijers. +; + +JMEMDOSA_TXT segment byte public 'CODE' + + assume cs:JMEMDOSA_TXT + + public _jdos_open + public _jdos_close + public _jdos_seek + public _jdos_read + public _jdos_write + public _jxms_getdriver + public _jxms_calldriver + public _jems_available + public _jems_calldriver + +; +; short far jdos_open (short far * handle, char far * filename) +; +; Create and open a temporary file +; +_jdos_open proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov cx,0 ; normal file attributes + lds dx,dword ptr [bp+10] ; get filename pointer + mov ah,3ch ; create file + int 21h + jc open_err ; if failed, return error code + lds bx,dword ptr [bp+6] ; get handle pointer + mov word ptr [bx],ax ; save the handle + xor ax,ax ; return zero for OK +open_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_open endp + + +; +; short far jdos_close (short handle) +; +; Close the file handle +; +_jdos_close proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov bx,word ptr [bp+6] ; file handle + mov ah,3eh ; close file + int 21h + jc close_err ; if failed, return error code + xor ax,ax ; return zero for OK +close_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_close endp + + +; +; short far jdos_seek (short handle, long offset) +; +; Set file position +; +_jdos_seek proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov bx,word ptr [bp+6] ; file handle + mov dx,word ptr [bp+8] ; LS offset + mov cx,word ptr [bp+10] ; MS offset + mov ax,4200h ; absolute seek + int 21h + jc seek_err ; if failed, return error code + xor ax,ax ; return zero for OK +seek_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_seek endp + + +; +; short far jdos_read (short handle, void far * buffer, unsigned short count) +; +; Read from file +; +_jdos_read proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov bx,word ptr [bp+6] ; file handle + lds dx,dword ptr [bp+8] ; buffer address + mov cx,word ptr [bp+12] ; number of bytes + mov ah,3fh ; read file + int 21h + jc read_err ; if failed, return error code + cmp ax,word ptr [bp+12] ; make sure all bytes were read + je read_ok + mov ax,1 ; else return 1 for not OK + jmp short read_err +read_ok: xor ax,ax ; return zero for OK +read_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_read endp + + +; +; short far jdos_write (short handle, void far * buffer, unsigned short count) +; +; Write to file +; +_jdos_write proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov bx,word ptr [bp+6] ; file handle + lds dx,dword ptr [bp+8] ; buffer address + mov cx,word ptr [bp+12] ; number of bytes + mov ah,40h ; write file + int 21h + jc write_err ; if failed, return error code + cmp ax,word ptr [bp+12] ; make sure all bytes written + je write_ok + mov ax,1 ; else return 1 for not OK + jmp short write_err +write_ok: xor ax,ax ; return zero for OK +write_err: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jdos_write endp + + +; +; void far jxms_getdriver (XMSDRIVER far *) +; +; Get the address of the XMS driver, or NULL if not available +; +_jxms_getdriver proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov ax,4300h ; call multiplex interrupt with + int 2fh ; a magic cookie, hex 4300 + cmp al,80h ; AL should contain hex 80 + je xmsavail + xor dx,dx ; no XMS driver available + xor ax,ax ; return a nil pointer + jmp short xmsavail_done +xmsavail: mov ax,4310h ; fetch driver address with + int 2fh ; another magic cookie + mov dx,es ; copy address to dx:ax + mov ax,bx +xmsavail_done: les bx,dword ptr [bp+6] ; get pointer to return value + mov word ptr es:[bx],ax + mov word ptr es:[bx+2],dx + pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jxms_getdriver endp + + +; +; void far jxms_calldriver (XMSDRIVER, XMScontext far *) +; +; The XMScontext structure contains values for the AX,DX,BX,SI,DS registers. +; These are loaded, the XMS call is performed, and the new values of the +; AX,DX,BX registers are written back to the context structure. +; +_jxms_calldriver proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + les bx,dword ptr [bp+10] ; get XMScontext pointer + mov ax,word ptr es:[bx] ; load registers + mov dx,word ptr es:[bx+2] + mov si,word ptr es:[bx+6] + mov ds,word ptr es:[bx+8] + mov bx,word ptr es:[bx+4] + call dword ptr [bp+6] ; call the driver + mov cx,bx ; save returned BX for a sec + les bx,dword ptr [bp+10] ; get XMScontext pointer + mov word ptr es:[bx],ax ; put back ax,dx,bx + mov word ptr es:[bx+2],dx + mov word ptr es:[bx+4],cx + pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jxms_calldriver endp + + +; +; short far jems_available (void) +; +; Have we got an EMS driver? (this comes straight from the EMS 4.0 specs) +; +_jems_available proc far + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + mov ax,3567h ; get interrupt vector 67h + int 21h + push cs + pop ds + mov di,000ah ; check offs 10 in returned seg + lea si,ASCII_device_name ; against literal string + mov cx,8 + cld + repe cmpsb + jne no_ems + mov ax,1 ; match, it's there + jmp short avail_done +no_ems: xor ax,ax ; it's not there +avail_done: pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + ret + +ASCII_device_name db "EMMXXXX0" + +_jems_available endp + + +; +; void far jems_calldriver (EMScontext far *) +; +; The EMScontext structure contains values for the AX,DX,BX,SI,DS registers. +; These are loaded, the EMS trap is performed, and the new values of the +; AX,DX,BX registers are written back to the context structure. +; +_jems_calldriver proc far + push bp ; linkage + mov bp,sp + push si ; save all registers for safety + push di + push bx + push cx + push dx + push es + push ds + les bx,dword ptr [bp+6] ; get EMScontext pointer + mov ax,word ptr es:[bx] ; load registers + mov dx,word ptr es:[bx+2] + mov si,word ptr es:[bx+6] + mov ds,word ptr es:[bx+8] + mov bx,word ptr es:[bx+4] + int 67h ; call the EMS driver + mov cx,bx ; save returned BX for a sec + les bx,dword ptr [bp+6] ; get EMScontext pointer + mov word ptr es:[bx],ax ; put back ax,dx,bx + mov word ptr es:[bx+2],dx + mov word ptr es:[bx+4],cx + pop ds ; restore registers and exit + pop es + pop dx + pop cx + pop bx + pop di + pop si + pop bp + ret +_jems_calldriver endp + +JMEMDOSA_TXT ends + + end diff --git a/src/3rdparty/libjpeg/jmemmac.c b/src/3rdparty/libjpeg/jmemmac.c new file mode 100644 index 0000000000..106f9bea05 --- /dev/null +++ b/src/3rdparty/libjpeg/jmemmac.c @@ -0,0 +1,289 @@ +/* + * jmemmac.c + * + * Copyright (C) 1992-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * jmemmac.c provides an Apple Macintosh implementation of the system- + * dependent portion of the JPEG memory manager. + * + * If you use jmemmac.c, then you must define USE_MAC_MEMMGR in the + * JPEG_INTERNALS part of jconfig.h. + * + * jmemmac.c uses the Macintosh toolbox routines NewPtr and DisposePtr + * instead of malloc and free. It accurately determines the amount of + * memory available by using CompactMem. Notice that if left to its + * own devices, this code can chew up all available space in the + * application's zone, with the exception of the rather small "slop" + * factor computed in jpeg_mem_available(). The application can ensure + * that more space is left over by reducing max_memory_to_use. + * + * Large images are swapped to disk using temporary files and System 7.0+'s + * temporary folder functionality. + * + * Note that jmemmac.c depends on two features of MacOS that were first + * introduced in System 7: FindFolder and the FSSpec-based calls. + * If your application uses jmemmac.c and is run under System 6 or earlier, + * and the jpeg library decides it needs a temporary file, it will abort, + * printing error messages about requiring System 7. (If no temporary files + * are created, it will run fine.) + * + * If you want to use jmemmac.c in an application that might be used with + * System 6 or earlier, then you should remove dependencies on FindFolder + * and the FSSpec calls. You will need to replace FindFolder with some + * other mechanism for finding a place to put temporary files, and you + * should replace the FSSpec calls with their HFS equivalents: + * + * FSpDelete -> HDelete + * FSpGetFInfo -> HGetFInfo + * FSpCreate -> HCreate + * FSpOpenDF -> HOpen *** Note: not HOpenDF *** + * FSMakeFSSpec -> (fill in spec by hand.) + * + * (Use HOpen instead of HOpenDF. HOpen is just a glue-interface to PBHOpen, + * which is on all HFS macs. HOpenDF is a System 7 addition which avoids the + * ages-old problem of names starting with a period.) + * + * Contributed by Sam Bushell (jsam@iagu.on.net) and + * Dan Gildor (gyld@in-touch.com). + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef USE_MAC_MEMMGR /* make sure user got configuration right */ + You forgot to define USE_MAC_MEMMGR in jconfig.h. /* deliberate syntax error */ +#endif + +#include /* we use the MacOS memory manager */ +#include /* we use the MacOS File stuff */ +#include /* we use the MacOS HFS stuff */ +#include /* for smSystemScript */ +#include /* we use Gestalt to test for specific functionality */ + +#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ +#define TEMP_FILE_NAME "JPG%03d.TMP" +#endif + +static int next_file_num; /* to distinguish among several temp files */ + + +/* + * Memory allocation and freeing are controlled by the MacOS library + * routines NewPtr() and DisposePtr(), which allocate fixed-address + * storage. Unfortunately, the IJG library isn't smart enough to cope + * with relocatable storage. + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) NewPtr(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + DisposePtr((Ptr) object); +} + + +/* + * "Large" objects are treated the same as "small" ones. + * NB: we include FAR keywords in the routine declarations simply for + * consistency with the rest of the IJG code; FAR should expand to empty + * on rational architectures like the Mac. + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) NewPtr(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + DisposePtr((Ptr) object); +} + + +/* + * This routine computes the total memory space available for allocation. + */ + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + long limit = cinfo->mem->max_memory_to_use - already_allocated; + long slop, mem; + + /* Don't ask for more than what application has told us we may use */ + if (max_bytes_needed > limit && limit > 0) + max_bytes_needed = limit; + /* Find whether there's a big enough free block in the heap. + * CompactMem tries to create a contiguous block of the requested size, + * and then returns the size of the largest free block (which could be + * much more or much less than we asked for). + * We add some slop to ensure we don't use up all available memory. + */ + slop = max_bytes_needed / 16 + 32768L; + mem = CompactMem(max_bytes_needed + slop) - slop; + if (mem < 0) + mem = 0; /* sigh, couldn't even get the slop */ + /* Don't take more than the application says we can have */ + if (mem > limit && limit > 0) + mem = limit; + return mem; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + + +METHODDEF(void) +read_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + long bytes = byte_count; + long retVal; + + if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr ) + ERREXIT(cinfo, JERR_TFILE_SEEK); + + retVal = FSRead ( info->temp_file, &bytes, + (unsigned char *) buffer_address ); + if ( retVal != noErr || bytes != byte_count ) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + long bytes = byte_count; + long retVal; + + if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr ) + ERREXIT(cinfo, JERR_TFILE_SEEK); + + retVal = FSWrite ( info->temp_file, &bytes, + (unsigned char *) buffer_address ); + if ( retVal != noErr || bytes != byte_count ) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_backing_store (j_common_ptr cinfo, backing_store_ptr info) +{ + FSClose ( info->temp_file ); + FSpDelete ( &(info->tempSpec) ); +} + + +/* + * Initial opening of a backing-store object. + * + * This version uses FindFolder to find the Temporary Items folder, + * and puts the temporary file in there. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + short tmpRef, vRefNum; + long dirID; + FInfo finderInfo; + FSSpec theSpec; + Str255 fName; + OSErr osErr; + long gestaltResponse = 0; + + /* Check that FSSpec calls are available. */ + osErr = Gestalt( gestaltFSAttr, &gestaltResponse ); + if ( ( osErr != noErr ) + || !( gestaltResponse & (1<temp_name, TEMP_FILE_NAME, next_file_num); + strcpy ( (Ptr)fName+1, info->temp_name ); + *fName = strlen (info->temp_name); + osErr = FSMakeFSSpec ( vRefNum, dirID, fName, &theSpec ); + + if ( (osErr = FSpGetFInfo ( &theSpec, &finderInfo ) ) != noErr ) + break; + } + + osErr = FSpCreate ( &theSpec, '????', '????', smSystemScript ); + if ( osErr != noErr ) + ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); + + osErr = FSpOpenDF ( &theSpec, fsRdWrPerm, &(info->temp_file) ); + if ( osErr != noErr ) + ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); + + info->tempSpec = theSpec; + + info->read_backing_store = read_backing_store; + info->write_backing_store = write_backing_store; + info->close_backing_store = close_backing_store; + TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + next_file_num = 0; + + /* max_memory_to_use will be initialized to FreeMem()'s result; + * the calling application might later reduce it, for example + * to leave room to invoke multiple JPEG objects. + * Note that FreeMem returns the total number of free bytes; + * it may not be possible to allocate a single block of this size. + */ + return FreeMem(); +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/src/3rdparty/libjpeg/jmemmgr.c b/src/3rdparty/libjpeg/jmemmgr.c new file mode 100644 index 0000000000..d801b322da --- /dev/null +++ b/src/3rdparty/libjpeg/jmemmgr.c @@ -0,0 +1,1118 @@ +/* + * jmemmgr.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the JPEG system-independent memory management + * routines. This code is usable across a wide variety of machines; most + * of the system dependencies have been isolated in a separate file. + * The major functions provided here are: + * * pool-based allocation and freeing of memory; + * * policy decisions about how to divide available memory among the + * virtual arrays; + * * control logic for swapping virtual arrays between main memory and + * backing storage. + * The separate system-dependent file provides the actual backing-storage + * access code, and it contains the policy decision about how much total + * main memory to use. + * This file is system-dependent in the sense that some of its functions + * are unnecessary in some systems. For example, if there is enough virtual + * memory so that backing storage will never be used, much of the virtual + * array control logic could be removed. (Of course, if you have that much + * memory then you shouldn't care about a little bit of unused code...) + */ + +#define JPEG_INTERNALS +#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef NO_GETENV +#ifndef HAVE_STDLIB_H /* should declare getenv() */ +extern char * getenv JPP((const char * name)); +#endif +#endif + + +/* + * Some important notes: + * The allocation routines provided here must never return NULL. + * They should exit to error_exit if unsuccessful. + * + * It's not a good idea to try to merge the sarray and barray routines, + * even though they are textually almost the same, because samples are + * usually stored as bytes while coefficients are shorts or ints. Thus, + * in machines where byte pointers have a different representation from + * word pointers, the resulting machine code could not be the same. + */ + + +/* + * Many machines require storage alignment: longs must start on 4-byte + * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc() + * always returns pointers that are multiples of the worst-case alignment + * requirement, and we had better do so too. + * There isn't any really portable way to determine the worst-case alignment + * requirement. This module assumes that the alignment requirement is + * multiples of sizeof(ALIGN_TYPE). + * By default, we define ALIGN_TYPE as double. This is necessary on some + * workstations (where doubles really do need 8-byte alignment) and will work + * fine on nearly everything. If your machine has lesser alignment needs, + * you can save a few bytes by making ALIGN_TYPE smaller. + * The only place I know of where this will NOT work is certain Macintosh + * 680x0 compilers that define double as a 10-byte IEEE extended float. + * Doing 10-byte alignment is counterproductive because longwords won't be + * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have + * such a compiler. + */ + +#ifndef ALIGN_TYPE /* so can override from jconfig.h */ +#define ALIGN_TYPE double +#endif + + +/* + * We allocate objects from "pools", where each pool is gotten with a single + * request to jpeg_get_small() or jpeg_get_large(). There is no per-object + * overhead within a pool, except for alignment padding. Each pool has a + * header with a link to the next pool of the same class. + * Small and large pool headers are identical except that the latter's + * link pointer must be FAR on 80x86 machines. + * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE + * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple + * of the alignment requirement of ALIGN_TYPE. + */ + +typedef union small_pool_struct * small_pool_ptr; + +typedef union small_pool_struct { + struct { + small_pool_ptr next; /* next in list of pools */ + size_t bytes_used; /* how many bytes already used within pool */ + size_t bytes_left; /* bytes still available in this pool */ + } hdr; + ALIGN_TYPE dummy; /* included in union to ensure alignment */ +} small_pool_hdr; + +typedef union large_pool_struct FAR * large_pool_ptr; + +typedef union large_pool_struct { + struct { + large_pool_ptr next; /* next in list of pools */ + size_t bytes_used; /* how many bytes already used within pool */ + size_t bytes_left; /* bytes still available in this pool */ + } hdr; + ALIGN_TYPE dummy; /* included in union to ensure alignment */ +} large_pool_hdr; + + +/* + * Here is the full definition of a memory manager object. + */ + +typedef struct { + struct jpeg_memory_mgr pub; /* public fields */ + + /* Each pool identifier (lifetime class) names a linked list of pools. */ + small_pool_ptr small_list[JPOOL_NUMPOOLS]; + large_pool_ptr large_list[JPOOL_NUMPOOLS]; + + /* Since we only have one lifetime class of virtual arrays, only one + * linked list is necessary (for each datatype). Note that the virtual + * array control blocks being linked together are actually stored somewhere + * in the small-pool list. + */ + jvirt_sarray_ptr virt_sarray_list; + jvirt_barray_ptr virt_barray_list; + + /* This counts total space obtained from jpeg_get_small/large */ + long total_space_allocated; + + /* alloc_sarray and alloc_barray set this value for use by virtual + * array routines. + */ + JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */ +} my_memory_mgr; + +typedef my_memory_mgr * my_mem_ptr; + + +/* + * The control blocks for virtual arrays. + * Note that these blocks are allocated in the "small" pool area. + * System-dependent info for the associated backing store (if any) is hidden + * inside the backing_store_info struct. + */ + +struct jvirt_sarray_control { + JSAMPARRAY mem_buffer; /* => the in-memory buffer */ + JDIMENSION rows_in_array; /* total virtual array height */ + JDIMENSION samplesperrow; /* width of array (and of memory buffer) */ + JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */ + JDIMENSION rows_in_mem; /* height of memory buffer */ + JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ + JDIMENSION cur_start_row; /* first logical row # in the buffer */ + JDIMENSION first_undef_row; /* row # of first uninitialized row */ + boolean pre_zero; /* pre-zero mode requested? */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + jvirt_sarray_ptr next; /* link to next virtual sarray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + +struct jvirt_barray_control { + JBLOCKARRAY mem_buffer; /* => the in-memory buffer */ + JDIMENSION rows_in_array; /* total virtual array height */ + JDIMENSION blocksperrow; /* width of array (and of memory buffer) */ + JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */ + JDIMENSION rows_in_mem; /* height of memory buffer */ + JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ + JDIMENSION cur_start_row; /* first logical row # in the buffer */ + JDIMENSION first_undef_row; /* row # of first uninitialized row */ + boolean pre_zero; /* pre-zero mode requested? */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + jvirt_barray_ptr next; /* link to next virtual barray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + + +#ifdef MEM_STATS /* optional extra stuff for statistics */ + +LOCAL(void) +print_mem_stats (j_common_ptr cinfo, int pool_id) +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr shdr_ptr; + large_pool_ptr lhdr_ptr; + + /* Since this is only a debugging stub, we can cheat a little by using + * fprintf directly rather than going through the trace message code. + * This is helpful because message parm array can't handle longs. + */ + fprintf(stderr, "Freeing pool %d, total space = %ld\n", + pool_id, mem->total_space_allocated); + + for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL; + lhdr_ptr = lhdr_ptr->hdr.next) { + fprintf(stderr, " Large chunk used %ld\n", + (long) lhdr_ptr->hdr.bytes_used); + } + + for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL; + shdr_ptr = shdr_ptr->hdr.next) { + fprintf(stderr, " Small chunk used %ld free %ld\n", + (long) shdr_ptr->hdr.bytes_used, + (long) shdr_ptr->hdr.bytes_left); + } +} + +#endif /* MEM_STATS */ + + +LOCAL(void) +out_of_memory (j_common_ptr cinfo, int which) +/* Report an out-of-memory error and stop execution */ +/* If we compiled MEM_STATS support, report alloc requests before dying */ +{ +#ifdef MEM_STATS + cinfo->err->trace_level = 2; /* force self_destruct to report stats */ +#endif + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which); +} + + +/* + * Allocation of "small" objects. + * + * For these, we use pooled storage. When a new pool must be created, + * we try to get enough space for the current request plus a "slop" factor, + * where the slop will be the amount of leftover space in the new pool. + * The speed vs. space tradeoff is largely determined by the slop values. + * A different slop value is provided for each pool class (lifetime), + * and we also distinguish the first pool of a class from later ones. + * NOTE: the values given work fairly well on both 16- and 32-bit-int + * machines, but may be too small if longs are 64 bits or more. + */ + +static const size_t first_pool_slop[JPOOL_NUMPOOLS] = +{ + 1600, /* first PERMANENT pool */ + 16000 /* first IMAGE pool */ +}; + +static const size_t extra_pool_slop[JPOOL_NUMPOOLS] = +{ + 0, /* additional PERMANENT pools */ + 5000 /* additional IMAGE pools */ +}; + +#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */ + + +METHODDEF(void *) +alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject) +/* Allocate a "small" object */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr hdr_ptr, prev_hdr_ptr; + char * data_ptr; + size_t odd_bytes, min_request, slop; + + /* Check for unsatisfiable request (do now to ensure no overflow below) */ + if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr))) + out_of_memory(cinfo, 1); /* request exceeds malloc's ability */ + + /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ + odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); + if (odd_bytes > 0) + sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; + + /* See if space is available in any existing pool */ + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + prev_hdr_ptr = NULL; + hdr_ptr = mem->small_list[pool_id]; + while (hdr_ptr != NULL) { + if (hdr_ptr->hdr.bytes_left >= sizeofobject) + break; /* found pool with enough space */ + prev_hdr_ptr = hdr_ptr; + hdr_ptr = hdr_ptr->hdr.next; + } + + /* Time to make a new pool? */ + if (hdr_ptr == NULL) { + /* min_request is what we need now, slop is what will be leftover */ + min_request = sizeofobject + SIZEOF(small_pool_hdr); + if (prev_hdr_ptr == NULL) /* first pool in class? */ + slop = first_pool_slop[pool_id]; + else + slop = extra_pool_slop[pool_id]; + /* Don't ask for more than MAX_ALLOC_CHUNK */ + if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request)) + slop = (size_t) (MAX_ALLOC_CHUNK-min_request); + /* Try to get space, if fail reduce slop and try again */ + for (;;) { + hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop); + if (hdr_ptr != NULL) + break; + slop /= 2; + if (slop < MIN_SLOP) /* give up when it gets real small */ + out_of_memory(cinfo, 2); /* jpeg_get_small failed */ + } + mem->total_space_allocated += min_request + slop; + /* Success, initialize the new pool header and add to end of list */ + hdr_ptr->hdr.next = NULL; + hdr_ptr->hdr.bytes_used = 0; + hdr_ptr->hdr.bytes_left = sizeofobject + slop; + if (prev_hdr_ptr == NULL) /* first pool in class? */ + mem->small_list[pool_id] = hdr_ptr; + else + prev_hdr_ptr->hdr.next = hdr_ptr; + } + + /* OK, allocate the object from the current pool */ + data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */ + data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */ + hdr_ptr->hdr.bytes_used += sizeofobject; + hdr_ptr->hdr.bytes_left -= sizeofobject; + + return (void *) data_ptr; +} + + +/* + * Allocation of "large" objects. + * + * The external semantics of these are the same as "small" objects, + * except that FAR pointers are used on 80x86. However the pool + * management heuristics are quite different. We assume that each + * request is large enough that it may as well be passed directly to + * jpeg_get_large; the pool management just links everything together + * so that we can free it all on demand. + * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY + * structures. The routines that create these structures (see below) + * deliberately bunch rows together to ensure a large request size. + */ + +METHODDEF(void FAR *) +alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject) +/* Allocate a "large" object */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + large_pool_ptr hdr_ptr; + size_t odd_bytes; + + /* Check for unsatisfiable request (do now to ensure no overflow below) */ + if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr))) + out_of_memory(cinfo, 3); /* request exceeds malloc's ability */ + + /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ + odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); + if (odd_bytes > 0) + sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; + + /* Always make a new pool */ + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject + + SIZEOF(large_pool_hdr)); + if (hdr_ptr == NULL) + out_of_memory(cinfo, 4); /* jpeg_get_large failed */ + mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr); + + /* Success, initialize the new pool header and add to list */ + hdr_ptr->hdr.next = mem->large_list[pool_id]; + /* We maintain space counts in each pool header for statistical purposes, + * even though they are not needed for allocation. + */ + hdr_ptr->hdr.bytes_used = sizeofobject; + hdr_ptr->hdr.bytes_left = 0; + mem->large_list[pool_id] = hdr_ptr; + + return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */ +} + + +/* + * Creation of 2-D sample arrays. + * The pointers are in near heap, the samples themselves in FAR heap. + * + * To minimize allocation overhead and to allow I/O of large contiguous + * blocks, we allocate the sample rows in groups of as many rows as possible + * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request. + * NB: the virtual array control routines, later in this file, know about + * this chunking of rows. The rowsperchunk value is left in the mem manager + * object so that it can be saved away if this sarray is the workspace for + * a virtual array. + */ + +METHODDEF(JSAMPARRAY) +alloc_sarray (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, JDIMENSION numrows) +/* Allocate a 2-D sample array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + JSAMPARRAY result; + JSAMPROW workspace; + JDIMENSION rowsperchunk, currow, i; + long ltemp; + + /* Calculate max # of rows allowed in one allocation chunk */ + ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / + ((long) samplesperrow * SIZEOF(JSAMPLE)); + if (ltemp <= 0) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + if (ltemp < (long) numrows) + rowsperchunk = (JDIMENSION) ltemp; + else + rowsperchunk = numrows; + mem->last_rowsperchunk = rowsperchunk; + + /* Get space for row pointers (small object) */ + result = (JSAMPARRAY) alloc_small(cinfo, pool_id, + (size_t) (numrows * SIZEOF(JSAMPROW))); + + /* Get the rows themselves (large objects) */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JSAMPROW) alloc_large(cinfo, pool_id, + (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow + * SIZEOF(JSAMPLE))); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += samplesperrow; + } + } + + return result; +} + + +/* + * Creation of 2-D coefficient-block arrays. + * This is essentially the same as the code for sample arrays, above. + */ + +METHODDEF(JBLOCKARRAY) +alloc_barray (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, JDIMENSION numrows) +/* Allocate a 2-D coefficient-block array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + JBLOCKARRAY result; + JBLOCKROW workspace; + JDIMENSION rowsperchunk, currow, i; + long ltemp; + + /* Calculate max # of rows allowed in one allocation chunk */ + ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / + ((long) blocksperrow * SIZEOF(JBLOCK)); + if (ltemp <= 0) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + if (ltemp < (long) numrows) + rowsperchunk = (JDIMENSION) ltemp; + else + rowsperchunk = numrows; + mem->last_rowsperchunk = rowsperchunk; + + /* Get space for row pointers (small object) */ + result = (JBLOCKARRAY) alloc_small(cinfo, pool_id, + (size_t) (numrows * SIZEOF(JBLOCKROW))); + + /* Get the rows themselves (large objects) */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JBLOCKROW) alloc_large(cinfo, pool_id, + (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow + * SIZEOF(JBLOCK))); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += blocksperrow; + } + } + + return result; +} + + +/* + * About virtual array management: + * + * The above "normal" array routines are only used to allocate strip buffers + * (as wide as the image, but just a few rows high). Full-image-sized buffers + * are handled as "virtual" arrays. The array is still accessed a strip at a + * time, but the memory manager must save the whole array for repeated + * accesses. The intended implementation is that there is a strip buffer in + * memory (as high as is possible given the desired memory limit), plus a + * backing file that holds the rest of the array. + * + * The request_virt_array routines are told the total size of the image and + * the maximum number of rows that will be accessed at once. The in-memory + * buffer must be at least as large as the maxaccess value. + * + * The request routines create control blocks but not the in-memory buffers. + * That is postponed until realize_virt_arrays is called. At that time the + * total amount of space needed is known (approximately, anyway), so free + * memory can be divided up fairly. + * + * The access_virt_array routines are responsible for making a specific strip + * area accessible (after reading or writing the backing file, if necessary). + * Note that the access routines are told whether the caller intends to modify + * the accessed strip; during a read-only pass this saves having to rewrite + * data to disk. The access routines are also responsible for pre-zeroing + * any newly accessed rows, if pre-zeroing was requested. + * + * In current usage, the access requests are usually for nonoverlapping + * strips; that is, successive access start_row numbers differ by exactly + * num_rows = maxaccess. This means we can get good performance with simple + * buffer dump/reload logic, by making the in-memory buffer be a multiple + * of the access height; then there will never be accesses across bufferload + * boundaries. The code will still work with overlapping access requests, + * but it doesn't handle bufferload overlaps very efficiently. + */ + + +METHODDEF(jvirt_sarray_ptr) +request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero, + JDIMENSION samplesperrow, JDIMENSION numrows, + JDIMENSION maxaccess) +/* Request a virtual 2-D sample array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + jvirt_sarray_ptr result; + + /* Only IMAGE-lifetime virtual arrays are currently supported */ + if (pool_id != JPOOL_IMAGE) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + /* get control block */ + result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id, + SIZEOF(struct jvirt_sarray_control)); + + result->mem_buffer = NULL; /* marks array not yet realized */ + result->rows_in_array = numrows; + result->samplesperrow = samplesperrow; + result->maxaccess = maxaccess; + result->pre_zero = pre_zero; + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = mem->virt_sarray_list; /* add to list of virtual arrays */ + mem->virt_sarray_list = result; + + return result; +} + + +METHODDEF(jvirt_barray_ptr) +request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero, + JDIMENSION blocksperrow, JDIMENSION numrows, + JDIMENSION maxaccess) +/* Request a virtual 2-D coefficient-block array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + jvirt_barray_ptr result; + + /* Only IMAGE-lifetime virtual arrays are currently supported */ + if (pool_id != JPOOL_IMAGE) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + /* get control block */ + result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id, + SIZEOF(struct jvirt_barray_control)); + + result->mem_buffer = NULL; /* marks array not yet realized */ + result->rows_in_array = numrows; + result->blocksperrow = blocksperrow; + result->maxaccess = maxaccess; + result->pre_zero = pre_zero; + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = mem->virt_barray_list; /* add to list of virtual arrays */ + mem->virt_barray_list = result; + + return result; +} + + +METHODDEF(void) +realize_virt_arrays (j_common_ptr cinfo) +/* Allocate the in-memory buffers for any unrealized virtual arrays */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + long space_per_minheight, maximum_space, avail_mem; + long minheights, max_minheights; + jvirt_sarray_ptr sptr; + jvirt_barray_ptr bptr; + + /* Compute the minimum space needed (maxaccess rows in each buffer) + * and the maximum space needed (full image height in each buffer). + * These may be of use to the system-dependent jpeg_mem_available routine. + */ + space_per_minheight = 0; + maximum_space = 0; + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_minheight += (long) sptr->maxaccess * + (long) sptr->samplesperrow * SIZEOF(JSAMPLE); + maximum_space += (long) sptr->rows_in_array * + (long) sptr->samplesperrow * SIZEOF(JSAMPLE); + } + } + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_minheight += (long) bptr->maxaccess * + (long) bptr->blocksperrow * SIZEOF(JBLOCK); + maximum_space += (long) bptr->rows_in_array * + (long) bptr->blocksperrow * SIZEOF(JBLOCK); + } + } + + if (space_per_minheight <= 0) + return; /* no unrealized arrays, no work */ + + /* Determine amount of memory to actually use; this is system-dependent. */ + avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space, + mem->total_space_allocated); + + /* If the maximum space needed is available, make all the buffers full + * height; otherwise parcel it out with the same number of minheights + * in each buffer. + */ + if (avail_mem >= maximum_space) + max_minheights = 1000000000L; + else { + max_minheights = avail_mem / space_per_minheight; + /* If there doesn't seem to be enough space, try to get the minimum + * anyway. This allows a "stub" implementation of jpeg_mem_available(). + */ + if (max_minheights <= 0) + max_minheights = 1; + } + + /* Allocate the in-memory buffers and initialize backing store as needed. */ + + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L; + if (minheights <= max_minheights) { + /* This buffer fits in memory */ + sptr->rows_in_mem = sptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess); + jpeg_open_backing_store(cinfo, & sptr->b_s_info, + (long) sptr->rows_in_array * + (long) sptr->samplesperrow * + (long) SIZEOF(JSAMPLE)); + sptr->b_s_open = TRUE; + } + sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE, + sptr->samplesperrow, sptr->rows_in_mem); + sptr->rowsperchunk = mem->last_rowsperchunk; + sptr->cur_start_row = 0; + sptr->first_undef_row = 0; + sptr->dirty = FALSE; + } + } + + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L; + if (minheights <= max_minheights) { + /* This buffer fits in memory */ + bptr->rows_in_mem = bptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess); + jpeg_open_backing_store(cinfo, & bptr->b_s_info, + (long) bptr->rows_in_array * + (long) bptr->blocksperrow * + (long) SIZEOF(JBLOCK)); + bptr->b_s_open = TRUE; + } + bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE, + bptr->blocksperrow, bptr->rows_in_mem); + bptr->rowsperchunk = mem->last_rowsperchunk; + bptr->cur_start_row = 0; + bptr->first_undef_row = 0; + bptr->dirty = FALSE; + } + } +} + + +LOCAL(void) +do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing) +/* Do backing store read or write of a virtual sample array */ +{ + long bytesperrow, file_offset, byte_count, rows, thisrow, i; + + bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); + /* Transfer no more than is currently defined */ + thisrow = (long) ptr->cur_start_row + i; + rows = MIN(rows, (long) ptr->first_undef_row - thisrow); + /* Transfer no more than fits in file */ + rows = MIN(rows, (long) ptr->rows_in_array - thisrow); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +LOCAL(void) +do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing) +/* Do backing store read or write of a virtual coefficient-block array */ +{ + long bytesperrow, file_offset, byte_count, rows, thisrow, i; + + bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); + /* Transfer no more than is currently defined */ + thisrow = (long) ptr->cur_start_row + i; + rows = MIN(rows, (long) ptr->first_undef_row - thisrow); + /* Transfer no more than fits in file */ + rows = MIN(rows, (long) ptr->rows_in_array - thisrow); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +METHODDEF(JSAMPARRAY) +access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr, + JDIMENSION start_row, JDIMENSION num_rows, + boolean writable) +/* Access the part of a virtual sample array starting at start_row */ +/* and extending for num_rows rows. writable is true if */ +/* caller intends to modify the accessed area. */ +{ + JDIMENSION end_row = start_row + num_rows; + JDIMENSION undef_row; + + /* debugging check */ + if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || + ptr->mem_buffer == NULL) + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + end_row > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(cinfo, JERR_VIRTUAL_BUG); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_sarray_io(cinfo, ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target area is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + /* use long arithmetic here to avoid overflow & unsigned problems */ + long ltemp; + + ltemp = (long) end_row - (long) ptr->rows_in_mem; + if (ltemp < 0) + ltemp = 0; /* don't fall off front end of file */ + ptr->cur_start_row = (JDIMENSION) ltemp; + } + /* Read in the selected part of the array. + * During the initial write pass, we will do no actual read + * because the selected part is all undefined. + */ + do_sarray_io(cinfo, ptr, FALSE); + } + /* Ensure the accessed part of the array is defined; prezero if needed. + * To improve locality of access, we only prezero the part of the array + * that the caller is about to access, not the entire in-memory array. + */ + if (ptr->first_undef_row < end_row) { + if (ptr->first_undef_row < start_row) { + if (writable) /* writer skipped over a section of array */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + undef_row = start_row; /* but reader is allowed to read ahead */ + } else { + undef_row = ptr->first_undef_row; + } + if (writable) + ptr->first_undef_row = end_row; + if (ptr->pre_zero) { + size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE); + undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ + end_row -= ptr->cur_start_row; + while (undef_row < end_row) { + jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + undef_row++; + } + } else { + if (! writable) /* reader looking at undefined data */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +METHODDEF(JBLOCKARRAY) +access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr, + JDIMENSION start_row, JDIMENSION num_rows, + boolean writable) +/* Access the part of a virtual block array starting at start_row */ +/* and extending for num_rows rows. writable is true if */ +/* caller intends to modify the accessed area. */ +{ + JDIMENSION end_row = start_row + num_rows; + JDIMENSION undef_row; + + /* debugging check */ + if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || + ptr->mem_buffer == NULL) + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + end_row > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(cinfo, JERR_VIRTUAL_BUG); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_barray_io(cinfo, ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target area is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + /* use long arithmetic here to avoid overflow & unsigned problems */ + long ltemp; + + ltemp = (long) end_row - (long) ptr->rows_in_mem; + if (ltemp < 0) + ltemp = 0; /* don't fall off front end of file */ + ptr->cur_start_row = (JDIMENSION) ltemp; + } + /* Read in the selected part of the array. + * During the initial write pass, we will do no actual read + * because the selected part is all undefined. + */ + do_barray_io(cinfo, ptr, FALSE); + } + /* Ensure the accessed part of the array is defined; prezero if needed. + * To improve locality of access, we only prezero the part of the array + * that the caller is about to access, not the entire in-memory array. + */ + if (ptr->first_undef_row < end_row) { + if (ptr->first_undef_row < start_row) { + if (writable) /* writer skipped over a section of array */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + undef_row = start_row; /* but reader is allowed to read ahead */ + } else { + undef_row = ptr->first_undef_row; + } + if (writable) + ptr->first_undef_row = end_row; + if (ptr->pre_zero) { + size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK); + undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ + end_row -= ptr->cur_start_row; + while (undef_row < end_row) { + jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + undef_row++; + } + } else { + if (! writable) /* reader looking at undefined data */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +/* + * Release all objects belonging to a specified pool. + */ + +METHODDEF(void) +free_pool (j_common_ptr cinfo, int pool_id) +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr shdr_ptr; + large_pool_ptr lhdr_ptr; + size_t space_freed; + + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + +#ifdef MEM_STATS + if (cinfo->err->trace_level > 1) + print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */ +#endif + + /* If freeing IMAGE pool, close any virtual arrays first */ + if (pool_id == JPOOL_IMAGE) { + jvirt_sarray_ptr sptr; + jvirt_barray_ptr bptr; + + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->b_s_open) { /* there may be no backing store */ + sptr->b_s_open = FALSE; /* prevent recursive close if error */ + (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info); + } + } + mem->virt_sarray_list = NULL; + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->b_s_open) { /* there may be no backing store */ + bptr->b_s_open = FALSE; /* prevent recursive close if error */ + (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info); + } + } + mem->virt_barray_list = NULL; + } + + /* Release large objects */ + lhdr_ptr = mem->large_list[pool_id]; + mem->large_list[pool_id] = NULL; + + while (lhdr_ptr != NULL) { + large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next; + space_freed = lhdr_ptr->hdr.bytes_used + + lhdr_ptr->hdr.bytes_left + + SIZEOF(large_pool_hdr); + jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed); + mem->total_space_allocated -= space_freed; + lhdr_ptr = next_lhdr_ptr; + } + + /* Release small objects */ + shdr_ptr = mem->small_list[pool_id]; + mem->small_list[pool_id] = NULL; + + while (shdr_ptr != NULL) { + small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next; + space_freed = shdr_ptr->hdr.bytes_used + + shdr_ptr->hdr.bytes_left + + SIZEOF(small_pool_hdr); + jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed); + mem->total_space_allocated -= space_freed; + shdr_ptr = next_shdr_ptr; + } +} + + +/* + * Close up shop entirely. + * Note that this cannot be called unless cinfo->mem is non-NULL. + */ + +METHODDEF(void) +self_destruct (j_common_ptr cinfo) +{ + int pool; + + /* Close all backing store, release all memory. + * Releasing pools in reverse order might help avoid fragmentation + * with some (brain-damaged) malloc libraries. + */ + for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { + free_pool(cinfo, pool); + } + + /* Release the memory manager control block too. */ + jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr)); + cinfo->mem = NULL; /* ensures I will be called only once */ + + jpeg_mem_term(cinfo); /* system-dependent cleanup */ +} + + +/* + * Memory manager initialization. + * When this is called, only the error manager pointer is valid in cinfo! + */ + +GLOBAL(void) +jinit_memory_mgr (j_common_ptr cinfo) +{ + my_mem_ptr mem; + long max_to_use; + int pool; + size_t test_mac; + + cinfo->mem = NULL; /* for safety if init fails */ + + /* Check for configuration errors. + * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably + * doesn't reflect any real hardware alignment requirement. + * The test is a little tricky: for X>0, X and X-1 have no one-bits + * in common if and only if X is a power of 2, ie has only one one-bit. + * Some compilers may give an "unreachable code" warning here; ignore it. + */ + if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0) + ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE); + /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be + * a multiple of SIZEOF(ALIGN_TYPE). + * Again, an "unreachable code" warning may be ignored here. + * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK. + */ + test_mac = (size_t) MAX_ALLOC_CHUNK; + if ((long) test_mac != MAX_ALLOC_CHUNK || + (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0) + ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); + + max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */ + + /* Attempt to allocate memory manager's control block */ + mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr)); + + if (mem == NULL) { + jpeg_mem_term(cinfo); /* system-dependent cleanup */ + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0); + } + + /* OK, fill in the method pointers */ + mem->pub.alloc_small = alloc_small; + mem->pub.alloc_large = alloc_large; + mem->pub.alloc_sarray = alloc_sarray; + mem->pub.alloc_barray = alloc_barray; + mem->pub.request_virt_sarray = request_virt_sarray; + mem->pub.request_virt_barray = request_virt_barray; + mem->pub.realize_virt_arrays = realize_virt_arrays; + mem->pub.access_virt_sarray = access_virt_sarray; + mem->pub.access_virt_barray = access_virt_barray; + mem->pub.free_pool = free_pool; + mem->pub.self_destruct = self_destruct; + + /* Make MAX_ALLOC_CHUNK accessible to other modules */ + mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK; + + /* Initialize working state */ + mem->pub.max_memory_to_use = max_to_use; + + for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { + mem->small_list[pool] = NULL; + mem->large_list[pool] = NULL; + } + mem->virt_sarray_list = NULL; + mem->virt_barray_list = NULL; + + mem->total_space_allocated = SIZEOF(my_memory_mgr); + + /* Declare ourselves open for business */ + cinfo->mem = & mem->pub; + + /* Check for an environment variable JPEGMEM; if found, override the + * default max_memory setting from jpeg_mem_init. Note that the + * surrounding application may again override this value. + * If your system doesn't support getenv(), define NO_GETENV to disable + * this feature. + */ +#ifndef NO_GETENV + { char * memenv; + + if ((memenv = getenv("JPEGMEM")) != NULL) { + char ch = 'x'; + + if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) { + if (ch == 'm' || ch == 'M') + max_to_use *= 1000L; + mem->pub.max_memory_to_use = max_to_use * 1000L; + } + } + } +#endif + +} diff --git a/src/3rdparty/libjpeg/jmemname.c b/src/3rdparty/libjpeg/jmemname.c new file mode 100644 index 0000000000..ed96dee1bc --- /dev/null +++ b/src/3rdparty/libjpeg/jmemname.c @@ -0,0 +1,276 @@ +/* + * jmemname.c + * + * Copyright (C) 1992-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides a generic implementation of the system-dependent + * portion of the JPEG memory manager. This implementation assumes that + * you must explicitly construct a name for each temp file. + * Also, the problem of determining the amount of memory available + * is shoved onto the user. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + +#ifndef SEEK_SET /* pre-ANSI systems may not define this; */ +#define SEEK_SET 0 /* if not, assume 0 is correct */ +#endif + +#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ +#define READ_BINARY "r" +#define RW_BINARY "w+" +#else +#ifdef VMS /* VMS is very nonstandard */ +#define READ_BINARY "rb", "ctx=stm" +#define RW_BINARY "w+b", "ctx=stm" +#else /* standard ANSI-compliant case */ +#define READ_BINARY "rb" +#define RW_BINARY "w+b" +#endif +#endif + + +/* + * Selection of a file name for a temporary file. + * This is system-dependent! + * + * The code as given is suitable for most Unix systems, and it is easily + * modified for most non-Unix systems. Some notes: + * 1. The temp file is created in the directory named by TEMP_DIRECTORY. + * The default value is /usr/tmp, which is the conventional place for + * creating large temp files on Unix. On other systems you'll probably + * want to change the file location. You can do this by editing the + * #define, or (preferred) by defining TEMP_DIRECTORY in jconfig.h. + * + * 2. If you need to change the file name as well as its location, + * you can override the TEMP_FILE_NAME macro. (Note that this is + * actually a printf format string; it must contain %s and %d.) + * Few people should need to do this. + * + * 3. mktemp() is used to ensure that multiple processes running + * simultaneously won't select the same file names. If your system + * doesn't have mktemp(), define NO_MKTEMP to do it the hard way. + * (If you don't have , also define NO_ERRNO_H.) + * + * 4. You probably want to define NEED_SIGNAL_CATCHER so that cjpeg.c/djpeg.c + * will cause the temp files to be removed if you stop the program early. + */ + +#ifndef TEMP_DIRECTORY /* can override from jconfig.h or Makefile */ +#define TEMP_DIRECTORY "/usr/tmp/" /* recommended setting for Unix */ +#endif + +static int next_file_num; /* to distinguish among several temp files */ + +#ifdef NO_MKTEMP + +#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ +#define TEMP_FILE_NAME "%sJPG%03d.TMP" +#endif + +#ifndef NO_ERRNO_H +#include /* to define ENOENT */ +#endif + +/* ANSI C specifies that errno is a macro, but on older systems it's more + * likely to be a plain int variable. And not all versions of errno.h + * bother to declare it, so we have to in order to be most portable. Thus: + */ +#ifndef errno +extern int errno; +#endif + + +LOCAL(void) +select_file_name (char * fname) +{ + FILE * tfile; + + /* Keep generating file names till we find one that's not in use */ + for (;;) { + next_file_num++; /* advance counter */ + sprintf(fname, TEMP_FILE_NAME, TEMP_DIRECTORY, next_file_num); + if ((tfile = fopen(fname, READ_BINARY)) == NULL) { + /* fopen could have failed for a reason other than the file not + * being there; for example, file there but unreadable. + * If isn't available, then we cannot test the cause. + */ +#ifdef ENOENT + if (errno != ENOENT) + continue; +#endif + break; + } + fclose(tfile); /* oops, it's there; close tfile & try again */ + } +} + +#else /* ! NO_MKTEMP */ + +/* Note that mktemp() requires the initial filename to end in six X's */ +#ifndef TEMP_FILE_NAME /* can override from jconfig.h or Makefile */ +#define TEMP_FILE_NAME "%sJPG%dXXXXXX" +#endif + +LOCAL(void) +select_file_name (char * fname) +{ + next_file_num++; /* advance counter */ + sprintf(fname, TEMP_FILE_NAME, TEMP_DIRECTORY, next_file_num); + mktemp(fname); /* make sure file name is unique */ + /* mktemp replaces the trailing XXXXXX with a unique string of characters */ +} + +#endif /* NO_MKTEMP */ + + +/* + * Memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * "Large" objects are treated the same as "small" ones. + * NB: although we include FAR keywords in the routine declarations, + * this file won't actually work in 80x86 small/medium model; at least, + * you probably won't be able to process useful-size images in only 64KB. + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * This routine computes the total memory space available for allocation. + * It's impossible to do this in a portable way; our current solution is + * to make the user tell us (with a default value set at compile time). + * If you can actually get the available space, it's a good idea to subtract + * a slop factor of 5% or so. + */ + +#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ +#define DEFAULT_MAX_MEM 1000000L /* default: one megabyte */ +#endif + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return cinfo->mem->max_memory_to_use - already_allocated; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + + +METHODDEF(void) +read_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFREAD(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFWRITE(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_backing_store (j_common_ptr cinfo, backing_store_ptr info) +{ + fclose(info->temp_file); /* close the file */ + unlink(info->temp_name); /* delete the file */ +/* If your system doesn't have unlink(), use remove() instead. + * remove() is the ANSI-standard name for this function, but if + * your system was ANSI you'd be using jmemansi.c, right? + */ + TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name); +} + + +/* + * Initial opening of a backing-store object. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + select_file_name(info->temp_name); + if ((info->temp_file = fopen(info->temp_name, RW_BINARY)) == NULL) + ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); + info->read_backing_store = read_backing_store; + info->write_backing_store = write_backing_store; + info->close_backing_store = close_backing_store; + TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + next_file_num = 0; /* initialize temp file name generator */ + return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/src/3rdparty/libjpeg/jmemnobs.c b/src/3rdparty/libjpeg/jmemnobs.c new file mode 100644 index 0000000000..eb8c337725 --- /dev/null +++ b/src/3rdparty/libjpeg/jmemnobs.c @@ -0,0 +1,109 @@ +/* + * jmemnobs.c + * + * Copyright (C) 1992-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides a really simple implementation of the system- + * dependent portion of the JPEG memory manager. This implementation + * assumes that no backing-store files are needed: all required space + * can be obtained from malloc(). + * This is very portable in the sense that it'll compile on almost anything, + * but you'd better have lots of main memory (or virtual memory) if you want + * to process big images. + * Note that the max_memory_to_use option is ignored by this implementation. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + + +/* + * Memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * "Large" objects are treated the same as "small" ones. + * NB: although we include FAR keywords in the routine declarations, + * this file won't actually work in 80x86 small/medium model; at least, + * you probably won't be able to process useful-size images in only 64KB. + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * This routine computes the total memory space available for allocation. + * Here we always say, "we got all you want bud!" + */ + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return max_bytes_needed; +} + + +/* + * Backing store (temporary file) management. + * Since jpeg_mem_available always promised the moon, + * this should never be called and we can just error out. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + ERREXIT(cinfo, JERR_NO_BACKING_STORE); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. Here, there isn't any. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + return 0; /* just set max_memory_to_use to 0 */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/src/3rdparty/libjpeg/jmemsys.h b/src/3rdparty/libjpeg/jmemsys.h new file mode 100644 index 0000000000..6c3c6d348f --- /dev/null +++ b/src/3rdparty/libjpeg/jmemsys.h @@ -0,0 +1,198 @@ +/* + * jmemsys.h + * + * Copyright (C) 1992-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file defines the interface between the system-independent + * and system-dependent portions of the JPEG memory manager. No other + * modules need include it. (The system-independent portion is jmemmgr.c; + * there are several different versions of the system-dependent portion.) + * + * This file works as-is for the system-dependent memory managers supplied + * in the IJG distribution. You may need to modify it if you write a + * custom memory manager. If system-dependent changes are needed in + * this file, the best method is to #ifdef them based on a configuration + * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR + * and USE_MAC_MEMMGR. + */ + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_get_small jGetSmall +#define jpeg_free_small jFreeSmall +#define jpeg_get_large jGetLarge +#define jpeg_free_large jFreeLarge +#define jpeg_mem_available jMemAvail +#define jpeg_open_backing_store jOpenBackStore +#define jpeg_mem_init jMemInit +#define jpeg_mem_term jMemTerm +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* + * These two functions are used to allocate and release small chunks of + * memory. (Typically the total amount requested through jpeg_get_small is + * no more than 20K or so; this will be requested in chunks of a few K each.) + * Behavior should be the same as for the standard library functions malloc + * and free; in particular, jpeg_get_small must return NULL on failure. + * On most systems, these ARE malloc and free. jpeg_free_small is passed the + * size of the object being freed, just in case it's needed. + * On an 80x86 machine using small-data memory model, these manage near heap. + */ + +EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject)); +EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object, + size_t sizeofobject)); + +/* + * These two functions are used to allocate and release large chunks of + * memory (up to the total free space designated by jpeg_mem_available). + * The interface is the same as above, except that on an 80x86 machine, + * far pointers are used. On most other machines these are identical to + * the jpeg_get/free_small routines; but we keep them separate anyway, + * in case a different allocation strategy is desirable for large chunks. + */ + +EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo, + size_t sizeofobject)); +EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object, + size_t sizeofobject)); + +/* + * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may + * be requested in a single call to jpeg_get_large (and jpeg_get_small for that + * matter, but that case should never come into play). This macro is needed + * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. + * On those machines, we expect that jconfig.h will provide a proper value. + * On machines with 32-bit flat address spaces, any large constant may be used. + * + * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type + * size_t and will be a multiple of sizeof(align_type). + */ + +#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */ +#define MAX_ALLOC_CHUNK 1000000000L +#endif + +/* + * This routine computes the total space still available for allocation by + * jpeg_get_large. If more space than this is needed, backing store will be + * used. NOTE: any memory already allocated must not be counted. + * + * There is a minimum space requirement, corresponding to the minimum + * feasible buffer sizes; jmemmgr.c will request that much space even if + * jpeg_mem_available returns zero. The maximum space needed, enough to hold + * all working storage in memory, is also passed in case it is useful. + * Finally, the total space already allocated is passed. If no better + * method is available, cinfo->mem->max_memory_to_use - already_allocated + * is often a suitable calculation. + * + * It is OK for jpeg_mem_available to underestimate the space available + * (that'll just lead to more backing-store access than is really necessary). + * However, an overestimate will lead to failure. Hence it's wise to subtract + * a slop factor from the true available space. 5% should be enough. + * + * On machines with lots of virtual memory, any large constant may be returned. + * Conversely, zero may be returned to always use the minimum amount of memory. + */ + +EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo, + long min_bytes_needed, + long max_bytes_needed, + long already_allocated)); + + +/* + * This structure holds whatever state is needed to access a single + * backing-store object. The read/write/close method pointers are called + * by jmemmgr.c to manipulate the backing-store object; all other fields + * are private to the system-dependent backing store routines. + */ + +#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ + + +#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */ + +typedef unsigned short XMSH; /* type of extended-memory handles */ +typedef unsigned short EMSH; /* type of expanded-memory handles */ + +typedef union { + short file_handle; /* DOS file handle if it's a temp file */ + XMSH xms_handle; /* handle if it's a chunk of XMS */ + EMSH ems_handle; /* handle if it's a chunk of EMS */ +} handle_union; + +#endif /* USE_MSDOS_MEMMGR */ + +#ifdef USE_MAC_MEMMGR /* Mac-specific junk */ +#include +#endif /* USE_MAC_MEMMGR */ + + +typedef struct backing_store_struct * backing_store_ptr; + +typedef struct backing_store_struct { + /* Methods for reading/writing/closing this backing-store object */ + JMETHOD(void, read_backing_store, (j_common_ptr cinfo, + backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count)); + JMETHOD(void, write_backing_store, (j_common_ptr cinfo, + backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count)); + JMETHOD(void, close_backing_store, (j_common_ptr cinfo, + backing_store_ptr info)); + + /* Private fields for system-dependent backing-store management */ +#ifdef USE_MSDOS_MEMMGR + /* For the MS-DOS manager (jmemdos.c), we need: */ + handle_union handle; /* reference to backing-store storage object */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else +#ifdef USE_MAC_MEMMGR + /* For the Mac manager (jmemmac.c), we need: */ + short temp_file; /* file reference number to temp file */ + FSSpec tempSpec; /* the FSSpec for the temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else + /* For a typical implementation with temp files, we need: */ + FILE * temp_file; /* stdio reference to temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ +#endif +#endif +} backing_store_info; + + +/* + * Initial opening of a backing-store object. This must fill in the + * read/write/close pointers in the object. The read/write routines + * may take an error exit if the specified maximum file size is exceeded. + * (If jpeg_mem_available always returns a large value, this routine can + * just take an error exit.) + */ + +EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo, + backing_store_ptr info, + long total_bytes_needed)); + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. jpeg_mem_init will be called before anything is + * allocated (and, therefore, nothing in cinfo is of use except the error + * manager pointer). It should return a suitable default value for + * max_memory_to_use; this may subsequently be overridden by the surrounding + * application. (Note that max_memory_to_use is only important if + * jpeg_mem_available chooses to consult it ... no one else will.) + * jpeg_mem_term may assume that all requested memory has been freed and that + * all opened backing-store objects have been closed. + */ + +EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo)); diff --git a/src/3rdparty/libjpeg/jmorecfg.h b/src/3rdparty/libjpeg/jmorecfg.h new file mode 100644 index 0000000000..83653925f6 --- /dev/null +++ b/src/3rdparty/libjpeg/jmorecfg.h @@ -0,0 +1,377 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ +#ifndef _BASETSD_H /* MinGW is slightly different */ +#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ +#ifndef VXWORKS +typedef long INT32; +#endif +#endif +#endif +#endif +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +#if defined(VXWORKS) && defined(LOCAL) +#undef LOCAL +#endif + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifndef FAR +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef int boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not + * useful if you are using JPEG color spaces other than YCbCr or grayscale. + * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/src/3rdparty/libjpeg/jpegint.h b/src/3rdparty/libjpeg/jpegint.h new file mode 100644 index 0000000000..0c27a4e4a0 --- /dev/null +++ b/src/3rdparty/libjpeg/jpegint.h @@ -0,0 +1,407 @@ +/* + * jpegint.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides common declarations for the various JPEG modules. + * These declarations are considered internal to the JPEG library; most + * applications using the library shouldn't need to include this file. + */ + + +/* Declarations for both compression & decompression */ + +typedef enum { /* Operating modes for buffer controllers */ + JBUF_PASS_THRU, /* Plain stripwise operation */ + /* Remaining modes require a full-image buffer to have been created */ + JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ + JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ + JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ +} J_BUF_MODE; + +/* Values of global_state field (jdapi.c has some dependencies on ordering!) */ +#define CSTATE_START 100 /* after create_compress */ +#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ +#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ +#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ +#define DSTATE_START 200 /* after create_decompress */ +#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ +#define DSTATE_READY 202 /* found SOS, ready for start_decompress */ +#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ +#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ +#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ +#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ +#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ +#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ +#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ +#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ + + +/* Declarations for compression modules */ + +/* Master control module */ +struct jpeg_comp_master { + JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); + JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); + JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean call_pass_startup; /* True if pass_startup must be called */ + boolean is_last_pass; /* True during last pass */ +}; + +/* Main buffer control (downsampled-data buffer) */ +struct jpeg_c_main_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, process_data, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail)); +}; + +/* Compression preprocessing (downsampling input buffer control) */ +struct jpeg_c_prep_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, + JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail)); +}; + +/* Coefficient buffer control */ +struct jpeg_c_coef_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, + JSAMPIMAGE input_buf)); +}; + +/* Colorspace conversion */ +struct jpeg_color_converter { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + JMETHOD(void, color_convert, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows)); +}; + +/* Downsampling */ +struct jpeg_downsampler { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + JMETHOD(void, downsample, (j_compress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_index, + JSAMPIMAGE output_buf, + JDIMENSION out_row_group_index)); + + boolean need_context_rows; /* TRUE if need rows above & below */ +}; + +/* Forward DCT (also controls coefficient quantization) */ +typedef JMETHOD(void, forward_DCT_ptr, + (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks)); + +struct jpeg_forward_dct { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + /* It is useful to allow each component to have a separate FDCT method. */ + forward_DCT_ptr forward_DCT[MAX_COMPONENTS]; +}; + +/* Entropy encoding */ +struct jpeg_entropy_encoder { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); + JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); + JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); +}; + +/* Marker writing */ +struct jpeg_marker_writer { + JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); + JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); + /* These routines are exported to allow insertion of extra markers */ + /* Probably only COM and APPn markers should be written this way */ + JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, + unsigned int datalen)); + JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); +}; + + +/* Declarations for decompression modules */ + +/* Master control module */ +struct jpeg_decomp_master { + JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ +}; + +/* Input control module */ +struct jpeg_input_controller { + JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); + JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); + JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean has_multiple_scans; /* True if file has multiple scans */ + boolean eoi_reached; /* True when EOI has been consumed */ +}; + +/* Main buffer control (downsampled-data buffer) */ +struct jpeg_d_main_controller { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, process_data, (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +}; + +/* Coefficient buffer control */ +struct jpeg_d_coef_controller { + JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); + JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); + JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); + JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, + JSAMPIMAGE output_buf)); + /* Pointer to array of coefficient virtual arrays, or NULL if none */ + jvirt_barray_ptr *coef_arrays; +}; + +/* Decompression postprocessing (color quantization buffer control) */ +struct jpeg_d_post_controller { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, + JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +}; + +/* Marker reading & parsing */ +struct jpeg_marker_reader { + JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); + /* Read markers until SOS or EOI. + * Returns same codes as are defined for jpeg_consume_input: + * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + */ + JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); + /* Read a restart marker --- exported for use by entropy decoder only */ + jpeg_marker_parser_method read_restart_marker; + + /* State of marker reader --- nominally internal, but applications + * supplying COM or APPn handlers might like to know the state. + */ + boolean saw_SOI; /* found SOI? */ + boolean saw_SOF; /* found SOF? */ + int next_restart_num; /* next restart number expected (0-7) */ + unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ +}; + +/* Entropy decoding */ +struct jpeg_entropy_decoder { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); +}; + +/* Inverse DCT (also performs dequantization) */ +typedef JMETHOD(void, inverse_DCT_method_ptr, + (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col)); + +struct jpeg_inverse_dct { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + /* It is useful to allow each component to have a separate IDCT method. */ + inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS]; +}; + +/* Upsampling (note that upsampler must also call color converter) */ +struct jpeg_upsampler { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, upsample, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, + JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); + + boolean need_context_rows; /* TRUE if need rows above & below */ +}; + +/* Colorspace conversion */ +struct jpeg_color_deconverter { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, color_convert, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows)); +}; + +/* Color quantization or color precision reduction */ +struct jpeg_color_quantizer { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); + JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, + int num_rows)); + JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); +}; + + +/* Miscellaneous useful macros */ + +#undef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#undef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + + +/* We assume that right shift corresponds to signed division by 2 with + * rounding towards minus infinity. This is correct for typical "arithmetic + * shift" instructions that shift in copies of the sign bit. But some + * C compilers implement >> with an unsigned shift. For these machines you + * must define RIGHT_SHIFT_IS_UNSIGNED. + * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. + * It is only applied with constant shift counts. SHIFT_TEMPS must be + * included in the variables of any routine using RIGHT_SHIFT. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define SHIFT_TEMPS INT32 shift_temp; +#define RIGHT_SHIFT(x,shft) \ + ((shift_temp = (x)) < 0 ? \ + (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ + (shift_temp >> (shft))) +#else +#define SHIFT_TEMPS +#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jinit_compress_master jICompress +#define jinit_c_master_control jICMaster +#define jinit_c_main_controller jICMainC +#define jinit_c_prep_controller jICPrepC +#define jinit_c_coef_controller jICCoefC +#define jinit_color_converter jICColor +#define jinit_downsampler jIDownsampler +#define jinit_forward_dct jIFDCT +#define jinit_huff_encoder jIHEncoder +#define jinit_arith_encoder jIAEncoder +#define jinit_marker_writer jIMWriter +#define jinit_master_decompress jIDMaster +#define jinit_d_main_controller jIDMainC +#define jinit_d_coef_controller jIDCoefC +#define jinit_d_post_controller jIDPostC +#define jinit_input_controller jIInCtlr +#define jinit_marker_reader jIMReader +#define jinit_huff_decoder jIHDecoder +#define jinit_arith_decoder jIADecoder +#define jinit_inverse_dct jIIDCT +#define jinit_upsampler jIUpsampler +#define jinit_color_deconverter jIDColor +#define jinit_1pass_quantizer jI1Quant +#define jinit_2pass_quantizer jI2Quant +#define jinit_merged_upsampler jIMUpsampler +#define jinit_memory_mgr jIMemMgr +#define jdiv_round_up jDivRound +#define jround_up jRound +#define jcopy_sample_rows jCopySamples +#define jcopy_block_row jCopyBlocks +#define jzero_far jZeroFar +#define jpeg_zigzag_order jZIGTable +#define jpeg_natural_order jZAGTable +#define jpeg_natural_order7 jZAGTable7 +#define jpeg_natural_order6 jZAGTable6 +#define jpeg_natural_order5 jZAGTable5 +#define jpeg_natural_order4 jZAGTable4 +#define jpeg_natural_order3 jZAGTable3 +#define jpeg_natural_order2 jZAGTable2 +#define jpeg_aritab jAriTab +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Compression module initialization routines */ +EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, + boolean transcode_only)); +EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); +/* Decompression module initialization routines */ +EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); +/* Memory manager initialization */ +EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); + +/* Utility routines in jutils.c */ +EXTERN(long) jdiv_round_up JPP((long a, long b)); +EXTERN(long) jround_up JPP((long a, long b)); +EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, JDIMENSION num_cols)); +EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, + JDIMENSION num_blocks)); +EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); +/* Constant tables in jutils.c */ +#if 0 /* This table is not actually needed in v6a */ +extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ +#endif +extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ +extern const int jpeg_natural_order7[]; /* zz to natural order for 7x7 block */ +extern const int jpeg_natural_order6[]; /* zz to natural order for 6x6 block */ +extern const int jpeg_natural_order5[]; /* zz to natural order for 5x5 block */ +extern const int jpeg_natural_order4[]; /* zz to natural order for 4x4 block */ +extern const int jpeg_natural_order3[]; /* zz to natural order for 3x3 block */ +extern const int jpeg_natural_order2[]; /* zz to natural order for 2x2 block */ + +/* Arithmetic coding probability estimation tables in jaricom.c */ +extern const INT32 jpeg_aritab[]; + +/* Suppress undefined-structure complaints if necessary. */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +#endif +#endif /* INCOMPLETE_TYPES_BROKEN */ diff --git a/src/3rdparty/libjpeg/jpeglib.h b/src/3rdparty/libjpeg/jpeglib.h new file mode 100644 index 0000000000..1eb1fac033 --- /dev/null +++ b/src/3rdparty/libjpeg/jpeglib.h @@ -0,0 +1,1160 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2002-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +extern "C" { +#endif +#endif + +/* Version IDs for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". + */ + +#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */ +#define JPEG_LIB_VERSION_MAJOR 8 +#define JPEG_LIB_VERSION_MINOR 3 + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples, + * reflecting any scaling we choose to apply during the DCT step. + * Values from 1 to 16 are supported. + * Note that different components may receive different DCT scalings. + */ + int DCT_h_scaled_size; + int DCT_v_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface); + * DCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) + * and similarly for height. + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + JDIMENSION jpeg_width; /* scaled JPEG image width */ + JDIMENSION jpeg_height; /* scaled JPEG image height */ + /* Dimensions of actual JPEG image that will be written to file, + * derived from input dimensions by scaling factors above. + * These fields are computed by jpeg_start_compress(). + * You can also use jpeg_calc_jpeg_dimensions() to determine these values + * in advance of calling jpeg_start_compress(). + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + int q_scale_factor[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined, + * and corresponding scale factors (percentage, initialized 100). + */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* These fields are derived from Se of first SOS marker. + */ + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array for entropy decode */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_mem_dest jMemDest +#define jpeg_mem_src jMemSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_default_qtables jDefQTables +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_calc_jpeg_dimensions jCjpegDimensions +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_core_output_dimensions jCoreDimensions +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Data source and destination managers: memory buffers. */ +EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, + unsigned char ** outbuffer, + unsigned long * outsize)); +EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, + unsigned char * inbuffer, + unsigned long insize)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Precalculate JPEG dimensions for current compression parameters. */ +EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.txt concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +} +#endif +#endif + +#endif /* JPEGLIB_H */ diff --git a/src/3rdparty/libjpeg/jpegtran.1 b/src/3rdparty/libjpeg/jpegtran.1 new file mode 100644 index 0000000000..0ad1bbc841 --- /dev/null +++ b/src/3rdparty/libjpeg/jpegtran.1 @@ -0,0 +1,285 @@ +.TH JPEGTRAN 1 "28 December 2009" +.SH NAME +jpegtran \- lossless transformation of JPEG files +.SH SYNOPSIS +.B jpegtran +[ +.I options +] +[ +.I filename +] +.LP +.SH DESCRIPTION +.LP +.B jpegtran +performs various useful transformations of JPEG files. +It can translate the coded representation from one variant of JPEG to another, +for example from baseline JPEG to progressive JPEG or vice versa. It can also +perform some rearrangements of the image data, for example turning an image +from landscape to portrait format by rotation. +.PP +.B jpegtran +works by rearranging the compressed data (DCT coefficients), without +ever fully decoding the image. Therefore, its transformations are lossless: +there is no image degradation at all, which would not be true if you used +.B djpeg +followed by +.B cjpeg +to accomplish the same conversion. But by the same token, +.B jpegtran +cannot perform lossy operations such as changing the image quality. +.PP +.B jpegtran +reads the named JPEG/JFIF file, or the standard input if no file is +named, and produces a JPEG/JFIF file on the standard output. +.SH OPTIONS +All switch names may be abbreviated; for example, +.B \-optimize +may be written +.B \-opt +or +.BR \-o . +Upper and lower case are equivalent. +British spellings are also accepted (e.g., +.BR \-optimise ), +though for brevity these are not mentioned below. +.PP +To specify the coded JPEG representation used in the output file, +.B jpegtran +accepts a subset of the switches recognized by +.BR cjpeg : +.TP +.B \-optimize +Perform optimization of entropy encoding parameters. +.TP +.B \-progressive +Create progressive JPEG file. +.TP +.BI \-restart " N" +Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is +attached to the number. +.TP +.B \-arithmetic +Use arithmetic coding. +.TP +.BI \-scans " file" +Use the scan script given in the specified text file. +.PP +See +.BR cjpeg (1) +for more details about these switches. +If you specify none of these switches, you get a plain baseline-JPEG output +file. The quality setting and so forth are determined by the input file. +.PP +The image can be losslessly transformed by giving one of these switches: +.TP +.B \-flip horizontal +Mirror image horizontally (left-right). +.TP +.B \-flip vertical +Mirror image vertically (top-bottom). +.TP +.B \-rotate 90 +Rotate image 90 degrees clockwise. +.TP +.B \-rotate 180 +Rotate image 180 degrees. +.TP +.B \-rotate 270 +Rotate image 270 degrees clockwise (or 90 ccw). +.TP +.B \-transpose +Transpose image (across UL-to-LR axis). +.TP +.B \-transverse +Transverse transpose (across UR-to-LL axis). +.IP +The transpose transformation has no restrictions regarding image dimensions. +The other transformations operate rather oddly if the image dimensions are not +a multiple of the iMCU size (usually 8 or 16 pixels), because they can only +transform complete blocks of DCT coefficient data in the desired way. +.IP +.BR jpegtran 's +default behavior when transforming an odd-size image is designed +to preserve exact reversibility and mathematical consistency of the +transformation set. As stated, transpose is able to flip the entire image +area. Horizontal mirroring leaves any partial iMCU column at the right edge +untouched, but is able to flip all rows of the image. Similarly, vertical +mirroring leaves any partial iMCU row at the bottom edge untouched, but is +able to flip all columns. The other transforms can be built up as sequences +of transpose and flip operations; for consistency, their actions on edge +pixels are defined to be the same as the end result of the corresponding +transpose-and-flip sequence. +.IP +For practical use, you may prefer to discard any untransformable edge pixels +rather than having a strange-looking strip along the right and/or bottom edges +of a transformed image. To do this, add the +.B \-trim +switch: +.TP +.B \-trim +Drop non-transformable edge blocks. +.IP +Obviously, a transformation with +.B \-trim +is not reversible, so strictly speaking +.B jpegtran +with this switch is not lossless. Also, the expected mathematical +equivalences between the transformations no longer hold. For example, +.B \-rot 270 -trim +trims only the bottom edge, but +.B \-rot 90 -trim +followed by +.B \-rot 180 -trim +trims both edges. +.IP +If you are only interested in perfect transformation, add the +.B \-perfect +switch: +.TP +.B \-perfect +Fails with an error if the transformation is not perfect. +.IP +For example you may want to do +.IP +.B (jpegtran \-rot 90 -perfect +.I foo.jpg +.B || djpeg +.I foo.jpg +.B | pnmflip \-r90 | cjpeg) +.IP +to do a perfect rotation if available or an approximated one if not. +.PP +We also offer a lossless-crop option, which discards data outside a given +image region but losslessly preserves what is inside. Like the rotate and +flip transforms, lossless crop is restricted by the current JPEG format: the +upper left corner of the selected region must fall on an iMCU boundary. If +this does not hold for the given crop parameters, we silently move the upper +left corner up and/or left to make it so, simultaneously increasing the region +dimensions to keep the lower right crop corner unchanged. (Thus, the output +image covers at least the requested region, but may cover more.) + +The image can be losslessly cropped by giving the switch: +.TP +.B \-crop WxH+X+Y +Crop to a rectangular subarea of width W, height H starting at point X,Y. +.PP +Other not-strictly-lossless transformation switches are: +.TP +.B \-grayscale +Force grayscale output. +.IP +This option discards the chrominance channels if the input image is YCbCr +(ie, a standard color JPEG), resulting in a grayscale JPEG file. The +luminance channel is preserved exactly, so this is a better method of reducing +to grayscale than decompression, conversion, and recompression. This switch +is particularly handy for fixing a monochrome picture that was mistakenly +encoded as a color JPEG. (In such a case, the space savings from getting rid +of the near-empty chroma channels won't be large; but the decoding time for +a grayscale JPEG is substantially less than that for a color JPEG.) +.TP +.BI \-scale " M/N" +Scale the output image by a factor M/N. +.IP +Currently supported scale factors are M/N with all M from 1 to 16, where N is +the source DCT size, which is 8 for baseline JPEG. If the /N part is omitted, +then M specifies the DCT scaled size to be applied on the given input. For +baseline JPEG this is equivalent to M/8 scaling, since the source DCT size +for baseline JPEG is 8. +.B Caution: +An implementation of the JPEG SmartScale extension is required for this +feature. SmartScale enabled JPEG is not yet widely implemented, so many +decoders will be unable to view a SmartScale extended JPEG file at all. +.PP +.B jpegtran +also recognizes these switches that control what to do with "extra" markers, +such as comment blocks: +.TP +.B \-copy none +Copy no extra markers from source file. This setting suppresses all +comments and other excess baggage present in the source file. +.TP +.B \-copy comments +Copy only comment markers. This setting copies comments from the source file, +but discards any other inessential (for image display) data. +.TP +.B \-copy all +Copy all extra markers. This setting preserves miscellaneous markers +found in the source file, such as JFIF thumbnails, Exif data, and Photoshop +settings. In some files these extra markers can be sizable. +.IP +The default behavior is +.BR "\-copy comments" . +(Note: in IJG releases v6 and v6a, +.B jpegtran +always did the equivalent of +.BR "\-copy none" .) +.PP +Additional switches recognized by jpegtran are: +.TP +.BI \-maxmemory " N" +Set limit for amount of memory to use in processing large images. Value is +in thousands of bytes, or millions of bytes if "M" is attached to the +number. For example, +.B \-max 4m +selects 4000000 bytes. If more space is needed, temporary files will be used. +.TP +.BI \-outfile " name" +Send output image to the named file, not to standard output. +.TP +.B \-verbose +Enable debug printout. More +.BR \-v 's +give more output. Also, version information is printed at startup. +.TP +.B \-debug +Same as +.BR \-verbose . +.SH EXAMPLES +.LP +This example converts a baseline JPEG file to progressive form: +.IP +.B jpegtran \-progressive +.I foo.jpg +.B > +.I fooprog.jpg +.PP +This example rotates an image 90 degrees clockwise, discarding any +unrotatable edge pixels: +.IP +.B jpegtran \-rot 90 -trim +.I foo.jpg +.B > +.I foo90.jpg +.SH ENVIRONMENT +.TP +.B JPEGMEM +If this environment variable is set, its value is the default memory limit. +The value is specified as described for the +.B \-maxmemory +switch. +.B JPEGMEM +overrides the default value specified when the program was compiled, and +itself is overridden by an explicit +.BR \-maxmemory . +.SH SEE ALSO +.BR cjpeg (1), +.BR djpeg (1), +.BR rdjpgcom (1), +.BR wrjpgcom (1) +.br +Wallace, Gregory K. "The JPEG Still Picture Compression Standard", +Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. +.SH AUTHOR +Independent JPEG Group +.SH BUGS +The transform options can't transform odd-size images perfectly. Use +.B \-trim +or +.B \-perfect +if you don't like the results. +.PP +The entire image is read into memory and then written out again, even in +cases where this isn't really necessary. Expect swapping on large images, +especially when using the more complex transform options. diff --git a/src/3rdparty/libjpeg/jquant1.c b/src/3rdparty/libjpeg/jquant1.c new file mode 100644 index 0000000000..b2f96aa15d --- /dev/null +++ b/src/3rdparty/libjpeg/jquant1.c @@ -0,0 +1,856 @@ +/* + * jquant1.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 1-pass color quantization (color mapping) routines. + * These routines provide mapping to a fixed color map using equally spaced + * color values. Optional Floyd-Steinberg or ordered dithering is available. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef QUANT_1PASS_SUPPORTED + + +/* + * The main purpose of 1-pass quantization is to provide a fast, if not very + * high quality, colormapped output capability. A 2-pass quantizer usually + * gives better visual quality; however, for quantized grayscale output this + * quantizer is perfectly adequate. Dithering is highly recommended with this + * quantizer, though you can turn it off if you really want to. + * + * In 1-pass quantization the colormap must be chosen in advance of seeing the + * image. We use a map consisting of all combinations of Ncolors[i] color + * values for the i'th component. The Ncolors[] values are chosen so that + * their product, the total number of colors, is no more than that requested. + * (In most cases, the product will be somewhat less.) + * + * Since the colormap is orthogonal, the representative value for each color + * component can be determined without considering the other components; + * then these indexes can be combined into a colormap index by a standard + * N-dimensional-array-subscript calculation. Most of the arithmetic involved + * can be precalculated and stored in the lookup table colorindex[]. + * colorindex[i][j] maps pixel value j in component i to the nearest + * representative value (grid plane) for that component; this index is + * multiplied by the array stride for component i, so that the + * index of the colormap entry closest to a given pixel value is just + * sum( colorindex[component-number][pixel-component-value] ) + * Aside from being fast, this scheme allows for variable spacing between + * representative values with no additional lookup cost. + * + * If gamma correction has been applied in color conversion, it might be wise + * to adjust the color grid spacing so that the representative colors are + * equidistant in linear space. At this writing, gamma correction is not + * implemented by jdcolor, so nothing is done here. + */ + + +/* Declarations for ordered dithering. + * + * We use a standard 16x16 ordered dither array. The basic concept of ordered + * dithering is described in many references, for instance Dale Schumacher's + * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991). + * In place of Schumacher's comparisons against a "threshold" value, we add a + * "dither" value to the input pixel and then round the result to the nearest + * output value. The dither value is equivalent to (0.5 - threshold) times + * the distance between output values. For ordered dithering, we assume that + * the output colors are equally spaced; if not, results will probably be + * worse, since the dither may be too much or too little at a given point. + * + * The normal calculation would be to form pixel value + dither, range-limit + * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual. + * We can skip the separate range-limiting step by extending the colorindex + * table in both directions. + */ + +#define ODITHER_SIZE 16 /* dimension of dither matrix */ +/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */ +#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE) /* # cells in matrix */ +#define ODITHER_MASK (ODITHER_SIZE-1) /* mask for wrapping around counters */ + +typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE]; +typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE]; + +static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = { + /* Bayer's order-4 dither array. Generated by the code given in + * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I. + * The values in this array must range from 0 to ODITHER_CELLS-1. + */ + { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 }, + { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 }, + { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 }, + { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 }, + { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 }, + { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 }, + { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 }, + { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 }, + { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 }, + { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 }, + { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 }, + { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 }, + { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 }, + { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 }, + { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 }, + { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 } +}; + + +/* Declarations for Floyd-Steinberg dithering. + * + * Errors are accumulated into the array fserrors[], at a resolution of + * 1/16th of a pixel count. The error at a given pixel is propagated + * to its not-yet-processed neighbors using the standard F-S fractions, + * ... (here) 7/16 + * 3/16 5/16 1/16 + * We work left-to-right on even rows, right-to-left on odd rows. + * + * We can get away with a single array (holding one row's worth of errors) + * by using it to store the current row's errors at pixel columns not yet + * processed, but the next row's errors at columns already processed. We + * need only a few extra variables to hold the errors immediately around the + * current column. (If we are lucky, those variables are in registers, but + * even if not, they're probably cheaper to access than array elements are.) + * + * The fserrors[] array is indexed [component#][position]. + * We provide (#columns + 2) entries per component; the extra entry at each + * end saves us from special-casing the first and last pixels. + * + * Note: on a wide image, we might not have enough room in a PC's near data + * segment to hold the error array; so it is allocated with alloc_large. + */ + +#if BITS_IN_JSAMPLE == 8 +typedef INT16 FSERROR; /* 16 bits should be enough */ +typedef int LOCFSERROR; /* use 'int' for calculation temps */ +#else +typedef INT32 FSERROR; /* may need more than 16 bits */ +typedef INT32 LOCFSERROR; /* be sure calculation temps are big enough */ +#endif + +typedef FSERROR FAR *FSERRPTR; /* pointer to error array (in FAR storage!) */ + + +/* Private subobject */ + +#define MAX_Q_COMPS 4 /* max components I can handle */ + +typedef struct { + struct jpeg_color_quantizer pub; /* public fields */ + + /* Initially allocated colormap is saved here */ + JSAMPARRAY sv_colormap; /* The color map as a 2-D pixel array */ + int sv_actual; /* number of entries in use */ + + JSAMPARRAY colorindex; /* Precomputed mapping for speed */ + /* colorindex[i][j] = index of color closest to pixel value j in component i, + * premultiplied as described above. Since colormap indexes must fit into + * JSAMPLEs, the entries of this array will too. + */ + boolean is_padded; /* is the colorindex padded for odither? */ + + int Ncolors[MAX_Q_COMPS]; /* # of values alloced to each component */ + + /* Variables for ordered dithering */ + int row_index; /* cur row's vertical index in dither matrix */ + ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */ + + /* Variables for Floyd-Steinberg dithering */ + FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */ + boolean on_odd_row; /* flag to remember which row we are on */ +} my_cquantizer; + +typedef my_cquantizer * my_cquantize_ptr; + + +/* + * Policy-making subroutines for create_colormap and create_colorindex. + * These routines determine the colormap to be used. The rest of the module + * only assumes that the colormap is orthogonal. + * + * * select_ncolors decides how to divvy up the available colors + * among the components. + * * output_value defines the set of representative values for a component. + * * largest_input_value defines the mapping from input values to + * representative values for a component. + * Note that the latter two routines may impose different policies for + * different components, though this is not currently done. + */ + + +LOCAL(int) +select_ncolors (j_decompress_ptr cinfo, int Ncolors[]) +/* Determine allocation of desired colors to components, */ +/* and fill in Ncolors[] array to indicate choice. */ +/* Return value is total number of colors (product of Ncolors[] values). */ +{ + int nc = cinfo->out_color_components; /* number of color components */ + int max_colors = cinfo->desired_number_of_colors; + int total_colors, iroot, i, j; + boolean changed; + long temp; + static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE }; + + /* We can allocate at least the nc'th root of max_colors per component. */ + /* Compute floor(nc'th root of max_colors). */ + iroot = 1; + do { + iroot++; + temp = iroot; /* set temp = iroot ** nc */ + for (i = 1; i < nc; i++) + temp *= iroot; + } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */ + iroot--; /* now iroot = floor(root) */ + + /* Must have at least 2 color values per component */ + if (iroot < 2) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp); + + /* Initialize to iroot color values for each component */ + total_colors = 1; + for (i = 0; i < nc; i++) { + Ncolors[i] = iroot; + total_colors *= iroot; + } + /* We may be able to increment the count for one or more components without + * exceeding max_colors, though we know not all can be incremented. + * Sometimes, the first component can be incremented more than once! + * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.) + * In RGB colorspace, try to increment G first, then R, then B. + */ + do { + changed = FALSE; + for (i = 0; i < nc; i++) { + j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i); + /* calculate new total_colors if Ncolors[j] is incremented */ + temp = total_colors / Ncolors[j]; + temp *= Ncolors[j]+1; /* done in long arith to avoid oflo */ + if (temp > (long) max_colors) + break; /* won't fit, done with this pass */ + Ncolors[j]++; /* OK, apply the increment */ + total_colors = (int) temp; + changed = TRUE; + } + } while (changed); + + return total_colors; +} + + +LOCAL(int) +output_value (j_decompress_ptr cinfo, int ci, int j, int maxj) +/* Return j'th output value, where j will range from 0 to maxj */ +/* The output values must fall in 0..MAXJSAMPLE in increasing order */ +{ + /* We always provide values 0 and MAXJSAMPLE for each component; + * any additional values are equally spaced between these limits. + * (Forcing the upper and lower values to the limits ensures that + * dithering can't produce a color outside the selected gamut.) + */ + return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj); +} + + +LOCAL(int) +largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj) +/* Return largest input value that should map to j'th output value */ +/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */ +{ + /* Breakpoints are halfway between values returned by output_value */ + return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj)); +} + + +/* + * Create the colormap. + */ + +LOCAL(void) +create_colormap (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPARRAY colormap; /* Created colormap */ + int total_colors; /* Number of distinct output colors */ + int i,j,k, nci, blksize, blkdist, ptr, val; + + /* Select number of colors for each component */ + total_colors = select_ncolors(cinfo, cquantize->Ncolors); + + /* Report selected color counts */ + if (cinfo->out_color_components == 3) + TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS, + total_colors, cquantize->Ncolors[0], + cquantize->Ncolors[1], cquantize->Ncolors[2]); + else + TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors); + + /* Allocate and fill in the colormap. */ + /* The colors are ordered in the map in standard row-major order, */ + /* i.e. rightmost (highest-indexed) color changes most rapidly. */ + + colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components); + + /* blksize is number of adjacent repeated entries for a component */ + /* blkdist is distance between groups of identical entries for a component */ + blkdist = total_colors; + + for (i = 0; i < cinfo->out_color_components; i++) { + /* fill in colormap entries for i'th color component */ + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + blksize = blkdist / nci; + for (j = 0; j < nci; j++) { + /* Compute j'th output value (out of nci) for component */ + val = output_value(cinfo, i, j, nci-1); + /* Fill in all colormap entries that have this value of this component */ + for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) { + /* fill in blksize entries beginning at ptr */ + for (k = 0; k < blksize; k++) + colormap[i][ptr+k] = (JSAMPLE) val; + } + } + blkdist = blksize; /* blksize of this color is blkdist of next */ + } + + /* Save the colormap in private storage, + * where it will survive color quantization mode changes. + */ + cquantize->sv_colormap = colormap; + cquantize->sv_actual = total_colors; +} + + +/* + * Create the color index table. + */ + +LOCAL(void) +create_colorindex (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPROW indexptr; + int i,j,k, nci, blksize, val, pad; + + /* For ordered dither, we pad the color index tables by MAXJSAMPLE in + * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE). + * This is not necessary in the other dithering modes. However, we + * flag whether it was done in case user changes dithering mode. + */ + if (cinfo->dither_mode == JDITHER_ORDERED) { + pad = MAXJSAMPLE*2; + cquantize->is_padded = TRUE; + } else { + pad = 0; + cquantize->is_padded = FALSE; + } + + cquantize->colorindex = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (MAXJSAMPLE+1 + pad), + (JDIMENSION) cinfo->out_color_components); + + /* blksize is number of adjacent repeated entries for a component */ + blksize = cquantize->sv_actual; + + for (i = 0; i < cinfo->out_color_components; i++) { + /* fill in colorindex entries for i'th color component */ + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + blksize = blksize / nci; + + /* adjust colorindex pointers to provide padding at negative indexes. */ + if (pad) + cquantize->colorindex[i] += MAXJSAMPLE; + + /* in loop, val = index of current output value, */ + /* and k = largest j that maps to current val */ + indexptr = cquantize->colorindex[i]; + val = 0; + k = largest_input_value(cinfo, i, 0, nci-1); + for (j = 0; j <= MAXJSAMPLE; j++) { + while (j > k) /* advance val if past boundary */ + k = largest_input_value(cinfo, i, ++val, nci-1); + /* premultiply so that no multiplication needed in main processing */ + indexptr[j] = (JSAMPLE) (val * blksize); + } + /* Pad at both ends if necessary */ + if (pad) + for (j = 1; j <= MAXJSAMPLE; j++) { + indexptr[-j] = indexptr[0]; + indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE]; + } + } +} + + +/* + * Create an ordered-dither array for a component having ncolors + * distinct output values. + */ + +LOCAL(ODITHER_MATRIX_PTR) +make_odither_array (j_decompress_ptr cinfo, int ncolors) +{ + ODITHER_MATRIX_PTR odither; + int j,k; + INT32 num,den; + + odither = (ODITHER_MATRIX_PTR) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(ODITHER_MATRIX)); + /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1). + * Hence the dither value for the matrix cell with fill order f + * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1). + * On 16-bit-int machine, be careful to avoid overflow. + */ + den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1)); + for (j = 0; j < ODITHER_SIZE; j++) { + for (k = 0; k < ODITHER_SIZE; k++) { + num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k]))) + * MAXJSAMPLE; + /* Ensure round towards zero despite C's lack of consistency + * about rounding negative values in integer division... + */ + odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den); + } + } + return odither; +} + + +/* + * Create the ordered-dither tables. + * Components having the same number of representative colors may + * share a dither table. + */ + +LOCAL(void) +create_odither_tables (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + ODITHER_MATRIX_PTR odither; + int i, j, nci; + + for (i = 0; i < cinfo->out_color_components; i++) { + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + odither = NULL; /* search for matching prior component */ + for (j = 0; j < i; j++) { + if (nci == cquantize->Ncolors[j]) { + odither = cquantize->odither[j]; + break; + } + } + if (odither == NULL) /* need a new table? */ + odither = make_odither_array(cinfo, nci); + cquantize->odither[i] = odither; + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +METHODDEF(void) +color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPARRAY colorindex = cquantize->colorindex; + register int pixcode, ci; + register JSAMPROW ptrin, ptrout; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + register int nc = cinfo->out_color_components; + + for (row = 0; row < num_rows; row++) { + ptrin = input_buf[row]; + ptrout = output_buf[row]; + for (col = width; col > 0; col--) { + pixcode = 0; + for (ci = 0; ci < nc; ci++) { + pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]); + } + *ptrout++ = (JSAMPLE) pixcode; + } + } +} + + +METHODDEF(void) +color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* Fast path for out_color_components==3, no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register int pixcode; + register JSAMPROW ptrin, ptrout; + JSAMPROW colorindex0 = cquantize->colorindex[0]; + JSAMPROW colorindex1 = cquantize->colorindex[1]; + JSAMPROW colorindex2 = cquantize->colorindex[2]; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + ptrin = input_buf[row]; + ptrout = output_buf[row]; + for (col = width; col > 0; col--) { + pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]); + pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]); + pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]); + *ptrout++ = (JSAMPLE) pixcode; + } + } +} + + +METHODDEF(void) +quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, with ordered dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex_ci; + int * dither; /* points to active row of dither matrix */ + int row_index, col_index; /* current indexes into dither matrix */ + int nc = cinfo->out_color_components; + int ci; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + /* Initialize output values to 0 so can process components separately */ + jzero_far((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); + row_index = cquantize->row_index; + for (ci = 0; ci < nc; ci++) { + input_ptr = input_buf[row] + ci; + output_ptr = output_buf[row]; + colorindex_ci = cquantize->colorindex[ci]; + dither = cquantize->odither[ci][row_index]; + col_index = 0; + + for (col = width; col > 0; col--) { + /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE, + * select output value, accumulate into output code for this pixel. + * Range-limiting need not be done explicitly, as we have extended + * the colorindex table to produce the right answers for out-of-range + * inputs. The maximum dither is +- MAXJSAMPLE; this sets the + * required amount of padding. + */ + *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]]; + input_ptr += nc; + output_ptr++; + col_index = (col_index + 1) & ODITHER_MASK; + } + } + /* Advance row index for next row */ + row_index = (row_index + 1) & ODITHER_MASK; + cquantize->row_index = row_index; + } +} + + +METHODDEF(void) +quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* Fast path for out_color_components==3, with ordered dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register int pixcode; + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex0 = cquantize->colorindex[0]; + JSAMPROW colorindex1 = cquantize->colorindex[1]; + JSAMPROW colorindex2 = cquantize->colorindex[2]; + int * dither0; /* points to active row of dither matrix */ + int * dither1; + int * dither2; + int row_index, col_index; /* current indexes into dither matrix */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + row_index = cquantize->row_index; + input_ptr = input_buf[row]; + output_ptr = output_buf[row]; + dither0 = cquantize->odither[0][row_index]; + dither1 = cquantize->odither[1][row_index]; + dither2 = cquantize->odither[2][row_index]; + col_index = 0; + + for (col = width; col > 0; col--) { + pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) + + dither0[col_index]]); + pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) + + dither1[col_index]]); + pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) + + dither2[col_index]]); + *output_ptr++ = (JSAMPLE) pixcode; + col_index = (col_index + 1) & ODITHER_MASK; + } + row_index = (row_index + 1) & ODITHER_MASK; + cquantize->row_index = row_index; + } +} + + +METHODDEF(void) +quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, with Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register LOCFSERROR cur; /* current error or pixel value */ + LOCFSERROR belowerr; /* error for pixel below cur */ + LOCFSERROR bpreverr; /* error for below/prev col */ + LOCFSERROR bnexterr; /* error for below/next col */ + LOCFSERROR delta; + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex_ci; + JSAMPROW colormap_ci; + int pixcode; + int nc = cinfo->out_color_components; + int dir; /* 1 for left-to-right, -1 for right-to-left */ + int dirnc; /* dir * nc */ + int ci; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + SHIFT_TEMPS + + for (row = 0; row < num_rows; row++) { + /* Initialize output values to 0 so can process components separately */ + jzero_far((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); + for (ci = 0; ci < nc; ci++) { + input_ptr = input_buf[row] + ci; + output_ptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + input_ptr += (width-1) * nc; /* so point to rightmost pixel */ + output_ptr += width-1; + dir = -1; + dirnc = -nc; + errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */ + } else { + /* work left to right in this row */ + dir = 1; + dirnc = nc; + errorptr = cquantize->fserrors[ci]; /* => entry before first column */ + } + colorindex_ci = cquantize->colorindex[ci]; + colormap_ci = cquantize->sv_colormap[ci]; + /* Preset error values: no error propagated to first pixel from left */ + cur = 0; + /* and no error propagated to row below yet */ + belowerr = bpreverr = 0; + + for (col = width; col > 0; col--) { + /* cur holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4); + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE; this sets the required size + * of the range_limit array. + */ + cur += GETJSAMPLE(*input_ptr); + cur = GETJSAMPLE(range_limit[cur]); + /* Select output value, accumulate into output code for this pixel */ + pixcode = GETJSAMPLE(colorindex_ci[cur]); + *output_ptr += (JSAMPLE) pixcode; + /* Compute actual representation error at this pixel */ + /* Note: we can do this even though we don't have the final */ + /* pixel code, because the colormap is orthogonal. */ + cur -= GETJSAMPLE(colormap_ci[pixcode]); + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + bnexterr = cur; + delta = cur * 2; + cur += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr + cur); + cur += delta; /* form error * 5 */ + bpreverr = belowerr + cur; + belowerr = bnexterr; + cur += delta; /* form error * 7 */ + /* At this point cur contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + input_ptr += dirnc; /* advance input ptr to next column */ + output_ptr += dir; /* advance output ptr to next column */ + errorptr += dir; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error value into the + * final fserrors[] entry. Note we need not unload belowerr because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */ + } + cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE); + } +} + + +/* + * Allocate workspace for Floyd-Steinberg errors. + */ + +LOCAL(void) +alloc_fs_workspace (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + size_t arraysize; + int i; + + arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + for (i = 0; i < cinfo->out_color_components; i++) { + cquantize->fserrors[i] = (FSERRPTR) + (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + } +} + + +/* + * Initialize for one-pass color quantization. + */ + +METHODDEF(void) +start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + size_t arraysize; + int i; + + /* Install my colormap. */ + cinfo->colormap = cquantize->sv_colormap; + cinfo->actual_number_of_colors = cquantize->sv_actual; + + /* Initialize for desired dithering mode. */ + switch (cinfo->dither_mode) { + case JDITHER_NONE: + if (cinfo->out_color_components == 3) + cquantize->pub.color_quantize = color_quantize3; + else + cquantize->pub.color_quantize = color_quantize; + break; + case JDITHER_ORDERED: + if (cinfo->out_color_components == 3) + cquantize->pub.color_quantize = quantize3_ord_dither; + else + cquantize->pub.color_quantize = quantize_ord_dither; + cquantize->row_index = 0; /* initialize state for ordered dither */ + /* If user changed to ordered dither from another mode, + * we must recreate the color index table with padding. + * This will cost extra space, but probably isn't very likely. + */ + if (! cquantize->is_padded) + create_colorindex(cinfo); + /* Create ordered-dither tables if we didn't already. */ + if (cquantize->odither[0] == NULL) + create_odither_tables(cinfo); + break; + case JDITHER_FS: + cquantize->pub.color_quantize = quantize_fs_dither; + cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */ + /* Allocate Floyd-Steinberg workspace if didn't already. */ + if (cquantize->fserrors[0] == NULL) + alloc_fs_workspace(cinfo); + /* Initialize the propagated errors to zero. */ + arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + for (i = 0; i < cinfo->out_color_components; i++) + jzero_far((void FAR *) cquantize->fserrors[i], arraysize); + break; + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } +} + + +/* + * Finish up at the end of the pass. + */ + +METHODDEF(void) +finish_pass_1_quant (j_decompress_ptr cinfo) +{ + /* no work in 1-pass case */ +} + + +/* + * Switch to a new external colormap between output passes. + * Shouldn't get to this module! + */ + +METHODDEF(void) +new_color_map_1_quant (j_decompress_ptr cinfo) +{ + ERREXIT(cinfo, JERR_MODE_CHANGE); +} + + +/* + * Module initialization routine for 1-pass color quantization. + */ + +GLOBAL(void) +jinit_1pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + + cquantize = (my_cquantize_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_cquantizer)); + cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_1_quant; + cquantize->pub.finish_pass = finish_pass_1_quant; + cquantize->pub.new_color_map = new_color_map_1_quant; + cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */ + cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */ + + /* Make sure my internal arrays won't overflow */ + if (cinfo->out_color_components > MAX_Q_COMPS) + ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS); + /* Make sure colormap indexes can be represented by JSAMPLEs */ + if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1)) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1); + + /* Create the colormap and color index table. */ + create_colormap(cinfo); + create_colorindex(cinfo); + + /* Allocate Floyd-Steinberg workspace now if requested. + * We do this now since it is FAR storage and may affect the memory + * manager's space calculations. If the user changes to FS dither + * mode in a later pass, we will allocate the space then, and will + * possibly overrun the max_memory_to_use setting. + */ + if (cinfo->dither_mode == JDITHER_FS) + alloc_fs_workspace(cinfo); +} + +#endif /* QUANT_1PASS_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jquant2.c b/src/3rdparty/libjpeg/jquant2.c new file mode 100644 index 0000000000..af601e334b --- /dev/null +++ b/src/3rdparty/libjpeg/jquant2.c @@ -0,0 +1,1310 @@ +/* + * jquant2.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 2-pass color quantization (color mapping) routines. + * These routines provide selection of a custom color map for an image, + * followed by mapping of the image to that color map, with optional + * Floyd-Steinberg dithering. + * It is also possible to use just the second pass to map to an arbitrary + * externally-given color map. + * + * Note: ordered dithering is not supported, since there isn't any fast + * way to compute intercolor distances; it's unclear that ordered dither's + * fundamental assumptions even hold with an irregularly spaced color map. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef QUANT_2PASS_SUPPORTED + + +/* + * This module implements the well-known Heckbert paradigm for color + * quantization. Most of the ideas used here can be traced back to + * Heckbert's seminal paper + * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display", + * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304. + * + * In the first pass over the image, we accumulate a histogram showing the + * usage count of each possible color. To keep the histogram to a reasonable + * size, we reduce the precision of the input; typical practice is to retain + * 5 or 6 bits per color, so that 8 or 4 different input values are counted + * in the same histogram cell. + * + * Next, the color-selection step begins with a box representing the whole + * color space, and repeatedly splits the "largest" remaining box until we + * have as many boxes as desired colors. Then the mean color in each + * remaining box becomes one of the possible output colors. + * + * The second pass over the image maps each input pixel to the closest output + * color (optionally after applying a Floyd-Steinberg dithering correction). + * This mapping is logically trivial, but making it go fast enough requires + * considerable care. + * + * Heckbert-style quantizers vary a good deal in their policies for choosing + * the "largest" box and deciding where to cut it. The particular policies + * used here have proved out well in experimental comparisons, but better ones + * may yet be found. + * + * In earlier versions of the IJG code, this module quantized in YCbCr color + * space, processing the raw upsampled data without a color conversion step. + * This allowed the color conversion math to be done only once per colormap + * entry, not once per pixel. However, that optimization precluded other + * useful optimizations (such as merging color conversion with upsampling) + * and it also interfered with desired capabilities such as quantizing to an + * externally-supplied colormap. We have therefore abandoned that approach. + * The present code works in the post-conversion color space, typically RGB. + * + * To improve the visual quality of the results, we actually work in scaled + * RGB space, giving G distances more weight than R, and R in turn more than + * B. To do everything in integer math, we must use integer scale factors. + * The 2/3/1 scale factors used here correspond loosely to the relative + * weights of the colors in the NTSC grayscale equation. + * If you want to use this code to quantize a non-RGB color space, you'll + * probably need to change these scale factors. + */ + +#define R_SCALE 2 /* scale R distances by this much */ +#define G_SCALE 3 /* scale G distances by this much */ +#define B_SCALE 1 /* and B by this much */ + +/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined + * in jmorecfg.h. As the code stands, it will do the right thing for R,G,B + * and B,G,R orders. If you define some other weird order in jmorecfg.h, + * you'll get compile errors until you extend this logic. In that case + * you'll probably want to tweak the histogram sizes too. + */ + +#if RGB_RED == 0 +#define C0_SCALE R_SCALE +#endif +#if RGB_BLUE == 0 +#define C0_SCALE B_SCALE +#endif +#if RGB_GREEN == 1 +#define C1_SCALE G_SCALE +#endif +#if RGB_RED == 2 +#define C2_SCALE R_SCALE +#endif +#if RGB_BLUE == 2 +#define C2_SCALE B_SCALE +#endif + + +/* + * First we have the histogram data structure and routines for creating it. + * + * The number of bits of precision can be adjusted by changing these symbols. + * We recommend keeping 6 bits for G and 5 each for R and B. + * If you have plenty of memory and cycles, 6 bits all around gives marginally + * better results; if you are short of memory, 5 bits all around will save + * some space but degrade the results. + * To maintain a fully accurate histogram, we'd need to allocate a "long" + * (preferably unsigned long) for each cell. In practice this is overkill; + * we can get by with 16 bits per cell. Few of the cell counts will overflow, + * and clamping those that do overflow to the maximum value will give close- + * enough results. This reduces the recommended histogram size from 256Kb + * to 128Kb, which is a useful savings on PC-class machines. + * (In the second pass the histogram space is re-used for pixel mapping data; + * in that capacity, each cell must be able to store zero to the number of + * desired colors. 16 bits/cell is plenty for that too.) + * Since the JPEG code is intended to run in small memory model on 80x86 + * machines, we can't just allocate the histogram in one chunk. Instead + * of a true 3-D array, we use a row of pointers to 2-D arrays. Each + * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and + * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries. Note that + * on 80x86 machines, the pointer row is in near memory but the actual + * arrays are in far memory (same arrangement as we use for image arrays). + */ + +#define MAXNUMCOLORS (MAXJSAMPLE+1) /* maximum size of colormap */ + +/* These will do the right thing for either R,G,B or B,G,R color order, + * but you may not like the results for other color orders. + */ +#define HIST_C0_BITS 5 /* bits of precision in R/B histogram */ +#define HIST_C1_BITS 6 /* bits of precision in G histogram */ +#define HIST_C2_BITS 5 /* bits of precision in B/R histogram */ + +/* Number of elements along histogram axes. */ +#define HIST_C0_ELEMS (1<cquantize; + register JSAMPROW ptr; + register histptr histp; + register hist3d histogram = cquantize->histogram; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + ptr = input_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the histogram */ + histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT] + [GETJSAMPLE(ptr[1]) >> C1_SHIFT] + [GETJSAMPLE(ptr[2]) >> C2_SHIFT]; + /* increment, check for overflow and undo increment if so. */ + if (++(*histp) <= 0) + (*histp)--; + ptr += 3; + } + } +} + + +/* + * Next we have the really interesting routines: selection of a colormap + * given the completed histogram. + * These routines work with a list of "boxes", each representing a rectangular + * subset of the input color space (to histogram precision). + */ + +typedef struct { + /* The bounds of the box (inclusive); expressed as histogram indexes */ + int c0min, c0max; + int c1min, c1max; + int c2min, c2max; + /* The volume (actually 2-norm) of the box */ + INT32 volume; + /* The number of nonzero histogram cells within this box */ + long colorcount; +} box; + +typedef box * boxptr; + + +LOCAL(boxptr) +find_biggest_color_pop (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest color population */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register long maxc = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->colorcount > maxc && boxp->volume > 0) { + which = boxp; + maxc = boxp->colorcount; + } + } + return which; +} + + +LOCAL(boxptr) +find_biggest_volume (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest (scaled) volume */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register INT32 maxv = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->volume > maxv) { + which = boxp; + maxv = boxp->volume; + } + } + return which; +} + + +LOCAL(void) +update_box (j_decompress_ptr cinfo, boxptr boxp) +/* Shrink the min/max bounds of a box to enclose only nonzero elements, */ +/* and recompute its volume and population */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + INT32 dist0,dist1,dist2; + long ccount; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + if (c0max > c0min) + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0min = c0min = c0; + goto have_c0min; + } + } + have_c0min: + if (c0max > c0min) + for (c0 = c0max; c0 >= c0min; c0--) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0max = c0max = c0; + goto have_c0max; + } + } + have_c0max: + if (c1max > c1min) + for (c1 = c1min; c1 <= c1max; c1++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1min = c1min = c1; + goto have_c1min; + } + } + have_c1min: + if (c1max > c1min) + for (c1 = c1max; c1 >= c1min; c1--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1max = c1max = c1; + goto have_c1max; + } + } + have_c1max: + if (c2max > c2min) + for (c2 = c2min; c2 <= c2max; c2++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2min = c2min = c2; + goto have_c2min; + } + } + have_c2min: + if (c2max > c2min) + for (c2 = c2max; c2 >= c2min; c2--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2max = c2max = c2; + goto have_c2max; + } + } + have_c2max: + + /* Update box volume. + * We use 2-norm rather than real volume here; this biases the method + * against making long narrow boxes, and it has the side benefit that + * a box is splittable iff norm > 0. + * Since the differences are expressed in histogram-cell units, + * we have to shift back to JSAMPLE units to get consistent distances; + * after which, we scale according to the selected distance scale factors. + */ + dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE; + dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; + dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; + boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; + + /* Now scan remaining volume of box and compute population */ + ccount = 0; + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++, histp++) + if (*histp != 0) { + ccount++; + } + } + boxp->colorcount = ccount; +} + + +LOCAL(int) +median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes, + int desired_colors) +/* Repeatedly select and split the largest box until we have enough boxes */ +{ + int n,lb; + int c0,c1,c2,cmax; + register boxptr b1,b2; + + while (numboxes < desired_colors) { + /* Select box to split. + * Current algorithm: by population for first half, then by volume. + */ + if (numboxes*2 <= desired_colors) { + b1 = find_biggest_color_pop(boxlist, numboxes); + } else { + b1 = find_biggest_volume(boxlist, numboxes); + } + if (b1 == NULL) /* no splittable boxes left! */ + break; + b2 = &boxlist[numboxes]; /* where new box will go */ + /* Copy the color bounds to the new box. */ + b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max; + b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min; + /* Choose which axis to split the box on. + * Current algorithm: longest scaled axis. + * See notes in update_box about scaling distances. + */ + c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE; + c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE; + c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE; + /* We want to break any ties in favor of green, then red, blue last. + * This code does the right thing for R,G,B or B,G,R color orders only. + */ +#if RGB_RED == 0 + cmax = c1; n = 1; + if (c0 > cmax) { cmax = c0; n = 0; } + if (c2 > cmax) { n = 2; } +#else + cmax = c1; n = 1; + if (c2 > cmax) { cmax = c2; n = 2; } + if (c0 > cmax) { n = 0; } +#endif + /* Choose split point along selected axis, and update box bounds. + * Current algorithm: split at halfway point. + * (Since the box has been shrunk to minimum volume, + * any split will produce two nonempty subboxes.) + * Note that lb value is max for lower box, so must be < old max. + */ + switch (n) { + case 0: + lb = (b1->c0max + b1->c0min) / 2; + b1->c0max = lb; + b2->c0min = lb+1; + break; + case 1: + lb = (b1->c1max + b1->c1min) / 2; + b1->c1max = lb; + b2->c1min = lb+1; + break; + case 2: + lb = (b1->c2max + b1->c2min) / 2; + b1->c2max = lb; + b2->c2min = lb+1; + break; + } + /* Update stats for boxes */ + update_box(cinfo, b1); + update_box(cinfo, b2); + numboxes++; + } + return numboxes; +} + + +LOCAL(void) +compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor) +/* Compute representative color for a box, put it in colormap[icolor] */ +{ + /* Current algorithm: mean weighted by pixels (not colors) */ + /* Note it is important to get the rounding correct! */ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + long count; + long total = 0; + long c0total = 0; + long c1total = 0; + long c2total = 0; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) { + if ((count = *histp++) != 0) { + total += count; + c0total += ((c0 << C0_SHIFT) + ((1<>1)) * count; + c1total += ((c1 << C1_SHIFT) + ((1<>1)) * count; + c2total += ((c2 << C2_SHIFT) + ((1<>1)) * count; + } + } + } + + cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); + cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); + cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); +} + + +LOCAL(void) +select_colors (j_decompress_ptr cinfo, int desired_colors) +/* Master routine for color selection */ +{ + boxptr boxlist; + int numboxes; + int i; + + /* Allocate workspace for box list */ + boxlist = (boxptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box)); + /* Initialize one box containing whole space */ + numboxes = 1; + boxlist[0].c0min = 0; + boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT; + boxlist[0].c1min = 0; + boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT; + boxlist[0].c2min = 0; + boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT; + /* Shrink it to actually-used volume and set its statistics */ + update_box(cinfo, & boxlist[0]); + /* Perform median-cut to produce final box list */ + numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors); + /* Compute the representative color for each box, fill colormap */ + for (i = 0; i < numboxes; i++) + compute_color(cinfo, & boxlist[i], i); + cinfo->actual_number_of_colors = numboxes; + TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes); +} + + +/* + * These routines are concerned with the time-critical task of mapping input + * colors to the nearest color in the selected colormap. + * + * We re-use the histogram space as an "inverse color map", essentially a + * cache for the results of nearest-color searches. All colors within a + * histogram cell will be mapped to the same colormap entry, namely the one + * closest to the cell's center. This may not be quite the closest entry to + * the actual input color, but it's almost as good. A zero in the cache + * indicates we haven't found the nearest color for that cell yet; the array + * is cleared to zeroes before starting the mapping pass. When we find the + * nearest color for a cell, its colormap index plus one is recorded in the + * cache for future use. The pass2 scanning routines call fill_inverse_cmap + * when they need to use an unfilled entry in the cache. + * + * Our method of efficiently finding nearest colors is based on the "locally + * sorted search" idea described by Heckbert and on the incremental distance + * calculation described by Spencer W. Thomas in chapter III.1 of Graphics + * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that + * the distances from a given colormap entry to each cell of the histogram can + * be computed quickly using an incremental method: the differences between + * distances to adjacent cells themselves differ by a constant. This allows a + * fairly fast implementation of the "brute force" approach of computing the + * distance from every colormap entry to every histogram cell. Unfortunately, + * it needs a work array to hold the best-distance-so-far for each histogram + * cell (because the inner loop has to be over cells, not colormap entries). + * The work array elements have to be INT32s, so the work array would need + * 256Kb at our recommended precision. This is not feasible in DOS machines. + * + * To get around these problems, we apply Thomas' method to compute the + * nearest colors for only the cells within a small subbox of the histogram. + * The work array need be only as big as the subbox, so the memory usage + * problem is solved. Furthermore, we need not fill subboxes that are never + * referenced in pass2; many images use only part of the color gamut, so a + * fair amount of work is saved. An additional advantage of this + * approach is that we can apply Heckbert's locality criterion to quickly + * eliminate colormap entries that are far away from the subbox; typically + * three-fourths of the colormap entries are rejected by Heckbert's criterion, + * and we need not compute their distances to individual cells in the subbox. + * The speed of this approach is heavily influenced by the subbox size: too + * small means too much overhead, too big loses because Heckbert's criterion + * can't eliminate as many colormap entries. Empirically the best subbox + * size seems to be about 1/512th of the histogram (1/8th in each direction). + * + * Thomas' article also describes a refined method which is asymptotically + * faster than the brute-force method, but it is also far more complex and + * cannot efficiently be applied to small subboxes. It is therefore not + * useful for programs intended to be portable to DOS machines. On machines + * with plenty of memory, filling the whole histogram in one shot with Thomas' + * refined method might be faster than the present code --- but then again, + * it might not be any faster, and it's certainly more complicated. + */ + + +/* log2(histogram cells in update box) for each axis; this can be adjusted */ +#define BOX_C0_LOG (HIST_C0_BITS-3) +#define BOX_C1_LOG (HIST_C1_BITS-3) +#define BOX_C2_LOG (HIST_C2_BITS-3) + +#define BOX_C0_ELEMS (1<actual_number_of_colors; + int maxc0, maxc1, maxc2; + int centerc0, centerc1, centerc2; + int i, x, ncolors; + INT32 minmaxdist, min_dist, max_dist, tdist; + INT32 mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */ + + /* Compute true coordinates of update box's upper corner and center. + * Actually we compute the coordinates of the center of the upper-corner + * histogram cell, which are the upper bounds of the volume we care about. + * Note that since ">>" rounds down, the "center" values may be closer to + * min than to max; hence comparisons to them must be "<=", not "<". + */ + maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT)); + centerc0 = (minc0 + maxc0) >> 1; + maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); + centerc1 = (minc1 + maxc1) >> 1; + maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); + centerc2 = (minc2 + maxc2) >> 1; + + /* For each color in colormap, find: + * 1. its minimum squared-distance to any point in the update box + * (zero if color is within update box); + * 2. its maximum squared-distance to any point in the update box. + * Both of these can be found by considering only the corners of the box. + * We save the minimum distance for each color in mindist[]; + * only the smallest maximum distance is of interest. + */ + minmaxdist = 0x7FFFFFFFL; + + for (i = 0; i < numcolors; i++) { + /* We compute the squared-c0-distance term, then add in the other two. */ + x = GETJSAMPLE(cinfo->colormap[0][i]); + if (x < minc0) { + tdist = (x - minc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else if (x > maxc0) { + tdist = (x - maxc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + min_dist = 0; + if (x <= centerc0) { + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[1][i]); + if (x < minc1) { + tdist = (x - minc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc1) { + tdist = (x - maxc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc1) { + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[2][i]); + if (x < minc2) { + tdist = (x - minc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc2) { + tdist = (x - maxc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc2) { + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } + } + + mindist[i] = min_dist; /* save away the results */ + if (max_dist < minmaxdist) + minmaxdist = max_dist; + } + + /* Now we know that no cell in the update box is more than minmaxdist + * away from some colormap entry. Therefore, only colors that are + * within minmaxdist of some part of the box need be considered. + */ + ncolors = 0; + for (i = 0; i < numcolors; i++) { + if (mindist[i] <= minmaxdist) + colorlist[ncolors++] = (JSAMPLE) i; + } + return ncolors; +} + + +LOCAL(void) +find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2, + int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[]) +/* Find the closest colormap entry for each cell in the update box, + * given the list of candidate colors prepared by find_nearby_colors. + * Return the indexes of the closest entries in the bestcolor[] array. + * This routine uses Thomas' incremental distance calculation method to + * find the distance from a colormap entry to successive cells in the box. + */ +{ + int ic0, ic1, ic2; + int i, icolor; + register INT32 * bptr; /* pointer into bestdist[] array */ + JSAMPLE * cptr; /* pointer into bestcolor[] array */ + INT32 dist0, dist1; /* initial distance values */ + register INT32 dist2; /* current distance in inner loop */ + INT32 xx0, xx1; /* distance increments */ + register INT32 xx2; + INT32 inc0, inc1, inc2; /* initial values for increments */ + /* This array holds the distance to the nearest-so-far color for each cell */ + INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Initialize best-distance for each cell of the update box */ + bptr = bestdist; + for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) + *bptr++ = 0x7FFFFFFFL; + + /* For each color selected by find_nearby_colors, + * compute its distance to the center of each cell in the box. + * If that's less than best-so-far, update best distance and color number. + */ + + /* Nominal steps between cell centers ("x" in Thomas article) */ +#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) +#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) +#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) + + for (i = 0; i < numcolors; i++) { + icolor = GETJSAMPLE(colorlist[i]); + /* Compute (square of) distance from minc0/c1/c2 to this color */ + inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE; + dist0 = inc0*inc0; + inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE; + dist0 += inc1*inc1; + inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE; + dist0 += inc2*inc2; + /* Form the initial difference increments */ + inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; + inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; + inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; + /* Now loop over all cells in box, updating distance per Thomas method */ + bptr = bestdist; + cptr = bestcolor; + xx0 = inc0; + for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) { + dist1 = dist0; + xx1 = inc1; + for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) { + dist2 = dist1; + xx2 = inc2; + for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) { + if (dist2 < *bptr) { + *bptr = dist2; + *cptr = (JSAMPLE) icolor; + } + dist2 += xx2; + xx2 += 2 * STEP_C2 * STEP_C2; + bptr++; + cptr++; + } + dist1 += xx1; + xx1 += 2 * STEP_C1 * STEP_C1; + } + dist0 += xx0; + xx0 += 2 * STEP_C0 * STEP_C0; + } + } +} + + +LOCAL(void) +fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2) +/* Fill the inverse-colormap entries in the update box that contains */ +/* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */ +/* we can fill as many others as we wish.) */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int minc0, minc1, minc2; /* lower left corner of update box */ + int ic0, ic1, ic2; + register JSAMPLE * cptr; /* pointer into bestcolor[] array */ + register histptr cachep; /* pointer into main cache array */ + /* This array lists the candidate colormap indexes. */ + JSAMPLE colorlist[MAXNUMCOLORS]; + int numcolors; /* number of candidate colors */ + /* This array holds the actually closest colormap index for each cell. */ + JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Convert cell coordinates to update box ID */ + c0 >>= BOX_C0_LOG; + c1 >>= BOX_C1_LOG; + c2 >>= BOX_C2_LOG; + + /* Compute true coordinates of update box's origin corner. + * Actually we compute the coordinates of the center of the corner + * histogram cell, which are the lower bounds of the volume we care about. + */ + minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); + minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); + minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); + + /* Determine which colormap entries are close enough to be candidates + * for the nearest entry to some cell in the update box. + */ + numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist); + + /* Determine the actually nearest colors. */ + find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist, + bestcolor); + + /* Save the best color numbers (plus 1) in the main cache array */ + c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ + c1 <<= BOX_C1_LOG; + c2 <<= BOX_C2_LOG; + cptr = bestcolor; + for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) { + for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { + cachep = & histogram[c0+ic0][c1+ic1][c2]; + for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { + *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1); + } + } + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +METHODDEF(void) +pass2_no_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register JSAMPROW inptr, outptr; + register histptr cachep; + register int c0, c1, c2; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the cache */ + c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT; + c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT; + c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT; + cachep = & histogram[c0][c1][c2]; + /* If we have not seen this color before, find nearest colormap entry */ + /* and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, c0,c1,c2); + /* Now emit the colormap index for this cell */ + *outptr++ = (JSAMPLE) (*cachep - 1); + } + } +} + + +METHODDEF(void) +pass2_fs_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */ + LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */ + LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */ + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + JSAMPROW inptr; /* => current input pixel */ + JSAMPROW outptr; /* => current output pixel */ + histptr cachep; + int dir; /* +1 or -1 depending on direction */ + int dir3; /* 3*dir, for advancing inptr & errorptr */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + int *error_limit = cquantize->error_limiter; + JSAMPROW colormap0 = cinfo->colormap[0]; + JSAMPROW colormap1 = cinfo->colormap[1]; + JSAMPROW colormap2 = cinfo->colormap[2]; + SHIFT_TEMPS + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + inptr += (width-1) * 3; /* so point to rightmost pixel */ + outptr += width-1; + dir = -1; + dir3 = -3; + errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */ + cquantize->on_odd_row = FALSE; /* flip for next time */ + } else { + /* work left to right in this row */ + dir = 1; + dir3 = 3; + errorptr = cquantize->fserrors; /* => entry before first real column */ + cquantize->on_odd_row = TRUE; /* flip for next time */ + } + /* Preset error values: no error propagated to first pixel from left */ + cur0 = cur1 = cur2 = 0; + /* and no error propagated to row below yet */ + belowerr0 = belowerr1 = belowerr2 = 0; + bpreverr0 = bpreverr1 = bpreverr2 = 0; + + for (col = width; col > 0; col--) { + /* curN holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4); + cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4); + cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4); + /* Limit the error using transfer function set by init_error_limit. + * See comments with init_error_limit for rationale. + */ + cur0 = error_limit[cur0]; + cur1 = error_limit[cur1]; + cur2 = error_limit[cur2]; + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE (or less with error limiting); + * this sets the required size of the range_limit array. + */ + cur0 += GETJSAMPLE(inptr[0]); + cur1 += GETJSAMPLE(inptr[1]); + cur2 += GETJSAMPLE(inptr[2]); + cur0 = GETJSAMPLE(range_limit[cur0]); + cur1 = GETJSAMPLE(range_limit[cur1]); + cur2 = GETJSAMPLE(range_limit[cur2]); + /* Index into the cache with adjusted pixel value */ + cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT]; + /* If we have not seen this color before, find nearest colormap */ + /* entry and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT); + /* Now emit the colormap index for this cell */ + { register int pixcode = *cachep - 1; + *outptr = (JSAMPLE) pixcode; + /* Compute representation error for this pixel */ + cur0 -= GETJSAMPLE(colormap0[pixcode]); + cur1 -= GETJSAMPLE(colormap1[pixcode]); + cur2 -= GETJSAMPLE(colormap2[pixcode]); + } + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + { register LOCFSERROR bnexterr, delta; + + bnexterr = cur0; /* Process component 0 */ + delta = cur0 * 2; + cur0 += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr0 + cur0); + cur0 += delta; /* form error * 5 */ + bpreverr0 = belowerr0 + cur0; + belowerr0 = bnexterr; + cur0 += delta; /* form error * 7 */ + bnexterr = cur1; /* Process component 1 */ + delta = cur1 * 2; + cur1 += delta; /* form error * 3 */ + errorptr[1] = (FSERROR) (bpreverr1 + cur1); + cur1 += delta; /* form error * 5 */ + bpreverr1 = belowerr1 + cur1; + belowerr1 = bnexterr; + cur1 += delta; /* form error * 7 */ + bnexterr = cur2; /* Process component 2 */ + delta = cur2 * 2; + cur2 += delta; /* form error * 3 */ + errorptr[2] = (FSERROR) (bpreverr2 + cur2); + cur2 += delta; /* form error * 5 */ + bpreverr2 = belowerr2 + cur2; + belowerr2 = bnexterr; + cur2 += delta; /* form error * 7 */ + } + /* At this point curN contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + inptr += dir3; /* Advance pixel pointers to next column */ + outptr += dir; + errorptr += dir3; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error values into the + * final fserrors[] entry. Note we need not unload belowerrN because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */ + errorptr[1] = (FSERROR) bpreverr1; + errorptr[2] = (FSERROR) bpreverr2; + } +} + + +/* + * Initialize the error-limiting transfer function (lookup table). + * The raw F-S error computation can potentially compute error values of up to + * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be + * much less, otherwise obviously wrong pixels will be created. (Typical + * effects include weird fringes at color-area boundaries, isolated bright + * pixels in a dark area, etc.) The standard advice for avoiding this problem + * is to ensure that the "corners" of the color cube are allocated as output + * colors; then repeated errors in the same direction cannot cause cascading + * error buildup. However, that only prevents the error from getting + * completely out of hand; Aaron Giles reports that error limiting improves + * the results even with corner colors allocated. + * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty + * well, but the smoother transfer function used below is even better. Thanks + * to Aaron Giles for this idea. + */ + +LOCAL(void) +init_error_limit (j_decompress_ptr cinfo) +/* Allocate and fill in the error_limiter table */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + int * table; + int in, out; + + table = (int *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int)); + table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */ + cquantize->error_limiter = table; + +#define STEPSIZE ((MAXJSAMPLE+1)/16) + /* Map errors 1:1 up to +- MAXJSAMPLE/16 */ + out = 0; + for (in = 0; in < STEPSIZE; in++, out++) { + table[in] = out; table[-in] = -out; + } + /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */ + for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) { + table[in] = out; table[-in] = -out; + } + /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */ + for (; in <= MAXJSAMPLE; in++) { + table[in] = out; table[-in] = -out; + } +#undef STEPSIZE +} + + +/* + * Finish up at the end of each pass. + */ + +METHODDEF(void) +finish_pass1 (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Select the representative colors and fill in cinfo->colormap */ + cinfo->colormap = cquantize->sv_colormap; + select_colors(cinfo, cquantize->desired); + /* Force next pass to zero the color index table */ + cquantize->needs_zeroed = TRUE; +} + + +METHODDEF(void) +finish_pass2 (j_decompress_ptr cinfo) +{ + /* no work */ +} + + +/* + * Initialize for each processing pass. + */ + +METHODDEF(void) +start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int i; + + /* Only F-S dithering or no dithering is supported. */ + /* If user asks for ordered dither, give him F-S. */ + if (cinfo->dither_mode != JDITHER_NONE) + cinfo->dither_mode = JDITHER_FS; + + if (is_pre_scan) { + /* Set up method pointers */ + cquantize->pub.color_quantize = prescan_quantize; + cquantize->pub.finish_pass = finish_pass1; + cquantize->needs_zeroed = TRUE; /* Always zero histogram */ + } else { + /* Set up method pointers */ + if (cinfo->dither_mode == JDITHER_FS) + cquantize->pub.color_quantize = pass2_fs_dither; + else + cquantize->pub.color_quantize = pass2_no_dither; + cquantize->pub.finish_pass = finish_pass2; + + /* Make sure color count is acceptable */ + i = cinfo->actual_number_of_colors; + if (i < 1) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1); + if (i > MAXNUMCOLORS) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); + + if (cinfo->dither_mode == JDITHER_FS) { + size_t arraysize = (size_t) ((cinfo->output_width + 2) * + (3 * SIZEOF(FSERROR))); + /* Allocate Floyd-Steinberg workspace if we didn't already. */ + if (cquantize->fserrors == NULL) + cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + /* Initialize the propagated errors to zero. */ + jzero_far((void FAR *) cquantize->fserrors, arraysize); + /* Make the error-limit table if we didn't already. */ + if (cquantize->error_limiter == NULL) + init_error_limit(cinfo); + cquantize->on_odd_row = FALSE; + } + + } + /* Zero the histogram or inverse color map, if necessary */ + if (cquantize->needs_zeroed) { + for (i = 0; i < HIST_C0_ELEMS; i++) { + jzero_far((void FAR *) histogram[i], + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + } + cquantize->needs_zeroed = FALSE; + } +} + + +/* + * Switch to a new external colormap between output passes. + */ + +METHODDEF(void) +new_color_map_2_quant (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Reset the inverse color map */ + cquantize->needs_zeroed = TRUE; +} + + +/* + * Module initialization routine for 2-pass color quantization. + */ + +GLOBAL(void) +jinit_2pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + int i; + + cquantize = (my_cquantize_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_cquantizer)); + cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_2_quant; + cquantize->pub.new_color_map = new_color_map_2_quant; + cquantize->fserrors = NULL; /* flag optional arrays not allocated */ + cquantize->error_limiter = NULL; + + /* Make sure jdmaster didn't give me a case I can't handle */ + if (cinfo->out_color_components != 3) + ERREXIT(cinfo, JERR_NOTIMPL); + + /* Allocate the histogram/inverse colormap storage */ + cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d)); + for (i = 0; i < HIST_C0_ELEMS; i++) { + cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + } + cquantize->needs_zeroed = TRUE; /* histogram is garbage now */ + + /* Allocate storage for the completed colormap, if required. + * We do this now since it is FAR storage and may affect + * the memory manager's space calculations. + */ + if (cinfo->enable_2pass_quant) { + /* Make sure color count is acceptable */ + int desired = cinfo->desired_number_of_colors; + /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */ + if (desired < 8) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8); + /* Make sure colormap indexes can be represented by JSAMPLEs */ + if (desired > MAXNUMCOLORS) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); + cquantize->sv_colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3); + cquantize->desired = desired; + } else + cquantize->sv_colormap = NULL; + + /* Only F-S dithering or no dithering is supported. */ + /* If user asks for ordered dither, give him F-S. */ + if (cinfo->dither_mode != JDITHER_NONE) + cinfo->dither_mode = JDITHER_FS; + + /* Allocate Floyd-Steinberg workspace if necessary. + * This isn't really needed until pass 2, but again it is FAR storage. + * Although we will cope with a later change in dither_mode, + * we do not promise to honor max_memory_to_use if dither_mode changes. + */ + if (cinfo->dither_mode == JDITHER_FS) { + cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR)))); + /* Might as well create the error-limiting table too. */ + init_error_limit(cinfo); + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ diff --git a/src/3rdparty/libjpeg/jutils.c b/src/3rdparty/libjpeg/jutils.c new file mode 100644 index 0000000000..04351797cd --- /dev/null +++ b/src/3rdparty/libjpeg/jutils.c @@ -0,0 +1,231 @@ +/* + * jutils.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains tables and miscellaneous utility routines needed + * for both compression and decompression. + * Note we prefix all global names with "j" to minimize conflicts with + * a surrounding application. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element + * of a DCT block read in natural order (left to right, top to bottom). + */ + +#if 0 /* This table is not actually needed in v6a */ + +const int jpeg_zigzag_order[DCTSIZE2] = { + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63 +}; + +#endif + +/* + * jpeg_natural_order[i] is the natural-order position of the i'th element + * of zigzag order. + * + * When reading corrupted data, the Huffman decoders could attempt + * to reference an entry beyond the end of this array (if the decoded + * zero run length reaches past the end of the block). To prevent + * wild stores without adding an inner-loop test, we put some extra + * "63"s after the real entries. This will cause the extra coefficient + * to be stored in location 63 of the block, not somewhere random. + * The worst case would be a run-length of 15, which means we need 16 + * fake entries. + */ + +const int jpeg_natural_order[DCTSIZE2+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order7[7*7+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 14, 21, 28, 35, + 42, 49, 50, 43, 36, 29, 22, 30, + 37, 44, 51, 52, 45, 38, 46, 53, + 54, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order6[6*6+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 41, 34, 27, + 20, 13, 21, 28, 35, 42, 43, 36, + 29, 37, 44, 45, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order5[5*5+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 12, + 19, 26, 33, 34, 27, 20, 28, 35, + 36, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order4[4*4+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 25, 18, 11, 19, 26, 27, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order3[3*3+16] = { + 0, 1, 8, 16, 9, 2, 10, 17, + 18, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order2[2*2+16] = { + 0, 1, 8, 9, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + + +/* + * Arithmetic utilities + */ + +GLOBAL(long) +jdiv_round_up (long a, long b) +/* Compute a/b rounded up to next integer, ie, ceil(a/b) */ +/* Assumes a >= 0, b > 0 */ +{ + return (a + b - 1L) / b; +} + + +GLOBAL(long) +jround_up (long a, long b) +/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */ +/* Assumes a >= 0, b > 0 */ +{ + a += b - 1L; + return a - (a % b); +} + + +/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays + * and coefficient-block arrays. This won't work on 80x86 because the arrays + * are FAR and we're assuming a small-pointer memory model. However, some + * DOS compilers provide far-pointer versions of memcpy() and memset() even + * in the small-model libraries. These will be used if USE_FMEM is defined. + * Otherwise, the routines below do it the hard way. (The performance cost + * is not all that great, because these routines aren't very heavily used.) + */ + +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ +#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) +#define FMEMZERO(target,size) MEMZERO(target,size) +#else /* 80x86 case, define if we can */ +#ifdef USE_FMEM +#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size)) +#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) +#endif +#endif + + +GLOBAL(void) +jcopy_sample_rows (JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, JDIMENSION num_cols) +/* Copy some rows of samples from one place to another. + * num_rows rows are copied from input_array[source_row++] + * to output_array[dest_row++]; these areas may overlap for duplication. + * The source and destination arrays must be at least as wide as num_cols. + */ +{ + register JSAMPROW inptr, outptr; +#ifdef FMEMCOPY + register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); +#else + register JDIMENSION count; +#endif + register int row; + + input_array += source_row; + output_array += dest_row; + + for (row = num_rows; row > 0; row--) { + inptr = *input_array++; + outptr = *output_array++; +#ifdef FMEMCOPY + FMEMCOPY(outptr, inptr, count); +#else + for (count = num_cols; count > 0; count--) + *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */ +#endif + } +} + + +GLOBAL(void) +jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, + JDIMENSION num_blocks) +/* Copy a row of coefficient blocks from one place to another. */ +{ +#ifdef FMEMCOPY + FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF))); +#else + register JCOEFPTR inptr, outptr; + register long count; + + inptr = (JCOEFPTR) input_row; + outptr = (JCOEFPTR) output_row; + for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) { + *outptr++ = *inptr++; + } +#endif +} + + +GLOBAL(void) +jzero_far (void FAR * target, size_t bytestozero) +/* Zero out a chunk of FAR memory. */ +/* This might be sample-array data, block-array data, or alloc_large data. */ +{ +#ifdef FMEMZERO + FMEMZERO(target, bytestozero); +#else + register char FAR * ptr = (char FAR *) target; + register size_t count; + + for (count = bytestozero; count > 0; count--) { + *ptr++ = 0; + } +#endif +} diff --git a/src/3rdparty/libjpeg/jversion.h b/src/3rdparty/libjpeg/jversion.h new file mode 100644 index 0000000000..e868538c88 --- /dev/null +++ b/src/3rdparty/libjpeg/jversion.h @@ -0,0 +1,14 @@ +/* + * jversion.h + * + * Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains software version identification. + */ + + +#define JVERSION "8c 16-Jan-2011" + +#define JCOPYRIGHT "Copyright (C) 2011, Thomas G. Lane, Guido Vollbeding" diff --git a/src/3rdparty/libjpeg/libjpeg.txt b/src/3rdparty/libjpeg/libjpeg.txt new file mode 100644 index 0000000000..2d98e22fc4 --- /dev/null +++ b/src/3rdparty/libjpeg/libjpeg.txt @@ -0,0 +1,3084 @@ +USING THE IJG JPEG LIBRARY + +Copyright (C) 1994-2010, Thomas G. Lane, Guido Vollbeding. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file describes how to use the IJG JPEG library within an application +program. Read it if you want to write a program that uses the library. + +The file example.c provides heavily commented skeleton code for calling the +JPEG library. Also see jpeglib.h (the include file to be used by application +programs) for full details about data structures and function parameter lists. +The library source code, of course, is the ultimate reference. + +Note that there have been *major* changes from the application interface +presented by IJG version 4 and earlier versions. The old design had several +inherent limitations, and it had accumulated a lot of cruft as we added +features while trying to minimize application-interface changes. We have +sacrificed backward compatibility in the version 5 rewrite, but we think the +improvements justify this. + + +TABLE OF CONTENTS +----------------- + +Overview: + Functions provided by the library + Outline of typical usage +Basic library usage: + Data formats + Compression details + Decompression details + Mechanics of usage: include files, linking, etc +Advanced features: + Compression parameter selection + Decompression parameter selection + Special color spaces + Error handling + Compressed data handling (source and destination managers) + I/O suspension + Progressive JPEG support + Buffered-image mode + Abbreviated datastreams and multiple images + Special markers + Raw (downsampled) image data + Really raw data: DCT coefficients + Progress monitoring + Memory management + Memory usage + Library compile-time options + Portability considerations + Notes for MS-DOS implementors + +You should read at least the overview and basic usage sections before trying +to program with the library. The sections on advanced features can be read +if and when you need them. + + +OVERVIEW +======== + +Functions provided by the library +--------------------------------- + +The IJG JPEG library provides C code to read and write JPEG-compressed image +files. The surrounding application program receives or supplies image data a +scanline at a time, using a straightforward uncompressed image format. All +details of color conversion and other preprocessing/postprocessing can be +handled by the library. + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. The application indirectly selects use of this code +by specifying the format in which it wishes to supply or receive image data. +For example, if colormapped output is requested, then the decompression +library automatically invokes color quantization. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + +A word about functions *not* provided by the library. We handle a subset of +the ISO JPEG standard; most baseline, extended-sequential, and progressive +JPEG processes are supported. (Our subset includes all features now in common +use.) Unsupported ISO options include: + * Hierarchical storage + * Lossless JPEG + * DNL marker + * Nonintegral subsampling ratios +We support both 8- and 12-bit data precision, but this is a compile-time +choice rather than a run-time choice; hence it is difficult to use both +precisions in a single application. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, this library is +used by the free LIBTIFF library to support JPEG compression in TIFF.) + + +Outline of typical usage +------------------------ + +The rough outline of a JPEG compression operation is: + + Allocate and initialize a JPEG compression object + Specify the destination for the compressed data (eg, a file) + Set parameters for compression, including image size & colorspace + jpeg_start_compress(...); + while (scan lines remain to be written) + jpeg_write_scanlines(...); + jpeg_finish_compress(...); + Release the JPEG compression object + +A JPEG compression object holds parameters and working state for the JPEG +library. We make creation/destruction of the object separate from starting +or finishing compression of an image; the same object can be re-used for a +series of image compression operations. This makes it easy to re-use the +same parameter settings for a sequence of images. Re-use of a JPEG object +also has important implications for processing abbreviated JPEG datastreams, +as discussed later. + +The image data to be compressed is supplied to jpeg_write_scanlines() from +in-memory buffers. If the application is doing file-to-file compression, +reading image data from the source file is the application's responsibility. +The library emits compressed data by calling a "data destination manager", +which typically will write the data into a file; but the application can +provide its own destination manager to do something else. + +Similarly, the rough outline of a JPEG decompression operation is: + + Allocate and initialize a JPEG decompression object + Specify the source of the compressed data (eg, a file) + Call jpeg_read_header() to obtain image info + Set parameters for decompression + jpeg_start_decompress(...); + while (scan lines remain to be read) + jpeg_read_scanlines(...); + jpeg_finish_decompress(...); + Release the JPEG decompression object + +This is comparable to the compression outline except that reading the +datastream header is a separate step. This is helpful because information +about the image's size, colorspace, etc is available when the application +selects decompression parameters. For example, the application can choose an +output scaling ratio that will fit the image into the available screen size. + +The decompression library obtains compressed data by calling a data source +manager, which typically will read the data from a file; but other behaviors +can be obtained with a custom source manager. Decompressed data is delivered +into in-memory buffers passed to jpeg_read_scanlines(). + +It is possible to abort an incomplete compression or decompression operation +by calling jpeg_abort(); or, if you do not need to retain the JPEG object, +simply release it by calling jpeg_destroy(). + +JPEG compression and decompression objects are two separate struct types. +However, they share some common fields, and certain routines such as +jpeg_destroy() can work on either type of object. + +The JPEG library has no static variables: all state is in the compression +or decompression object. Therefore it is possible to process multiple +compression and decompression operations concurrently, using multiple JPEG +objects. + +Both compression and decompression can be done in an incremental memory-to- +memory fashion, if suitable source/destination managers are used. See the +section on "I/O suspension" for more details. + + +BASIC LIBRARY USAGE +=================== + +Data formats +------------ + +Before diving into procedural details, it is helpful to understand the +image data format that the JPEG library expects or returns. + +The standard input image format is a rectangular array of pixels, with each +pixel having the same number of "component" or "sample" values (color +channels). You must specify how many components there are and the colorspace +interpretation of the components. Most applications will use RGB data +(three components per pixel) or grayscale data (one component per pixel). +PLEASE NOTE THAT RGB DATA IS THREE SAMPLES PER PIXEL, GRAYSCALE ONLY ONE. +A remarkable number of people manage to miss this, only to find that their +programs don't work with grayscale JPEG files. + +There is no provision for colormapped input. JPEG files are always full-color +or full grayscale (or sometimes another colorspace such as CMYK). You can +feed in a colormapped image by expanding it to full-color format. However +JPEG often doesn't work very well with source data that has been colormapped, +because of dithering noise. This is discussed in more detail in the JPEG FAQ +and the other references mentioned in the README file. + +Pixels are stored by scanlines, with each scanline running from left to +right. The component values for each pixel are adjacent in the row; for +example, R,G,B,R,G,B,R,G,B,... for 24-bit RGB color. Each scanline is an +array of data type JSAMPLE --- which is typically "unsigned char", unless +you've changed jmorecfg.h. (You can also change the RGB pixel layout, say +to B,G,R order, by modifying jmorecfg.h. But see the restrictions listed in +that file before doing so.) + +A 2-D array of pixels is formed by making a list of pointers to the starts of +scanlines; so the scanlines need not be physically adjacent in memory. Even +if you process just one scanline at a time, you must make a one-element +pointer array to conform to this structure. Pointers to JSAMPLE rows are of +type JSAMPROW, and the pointer to the pointer array is of type JSAMPARRAY. + +The library accepts or supplies one or more complete scanlines per call. +It is not possible to process part of a row at a time. Scanlines are always +processed top-to-bottom. You can process an entire image in one call if you +have it all in memory, but usually it's simplest to process one scanline at +a time. + +For best results, source data values should have the precision specified by +BITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compress +data that's only 6 bits/channel, you should left-justify each value in a +byte before passing it to the compressor. If you need to compress data +that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12. +(See "Library compile-time options", later.) + + +The data format returned by the decompressor is the same in all details, +except that colormapped output is supported. (Again, a JPEG file is never +colormapped. But you can ask the decompressor to perform on-the-fly color +quantization to deliver colormapped output.) If you request colormapped +output then the returned data array contains a single JSAMPLE per pixel; +its value is an index into a color map. The color map is represented as +a 2-D JSAMPARRAY in which each row holds the values of one color component, +that is, colormap[i][j] is the value of the i'th color component for pixel +value (map index) j. Note that since the colormap indexes are stored in +JSAMPLEs, the maximum number of colors is limited by the size of JSAMPLE +(ie, at most 256 colors for an 8-bit JPEG library). + + +Compression details +------------------- + +Here we revisit the JPEG compression outline given in the overview. + +1. Allocate and initialize a JPEG compression object. + +A JPEG compression object is a "struct jpeg_compress_struct". (It also has +a bunch of subsidiary structures which are allocated via malloc(), but the +application doesn't control those directly.) This struct can be just a local +variable in the calling routine, if a single routine is going to execute the +whole JPEG compression sequence. Otherwise it can be static or allocated +from malloc(). + +You will also need a structure representing a JPEG error handler. The part +of this that the library cares about is a "struct jpeg_error_mgr". If you +are providing your own error handler, you'll typically want to embed the +jpeg_error_mgr struct in a larger structure; this is discussed later under +"Error handling". For now we'll assume you are just using the default error +handler. The default error handler will print JPEG error/warning messages +on stderr, and it will call exit() if a fatal error occurs. + +You must initialize the error handler structure, store a pointer to it into +the JPEG object's "err" field, and then call jpeg_create_compress() to +initialize the rest of the JPEG object. + +Typical code for this step, if you are using the default error handler, is + + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + +jpeg_create_compress allocates a small amount of memory, so it could fail +if you are out of memory. In that case it will exit via the error handler; +that's why the error handler must be initialized first. + + +2. Specify the destination for the compressed data (eg, a file). + +As previously mentioned, the JPEG library delivers compressed data to a +"data destination" module. The library includes one data destination +module which knows how to write to a stdio stream. You can use your own +destination module if you want to do something else, as discussed later. + +If you use the standard destination module, you must open the target stdio +stream beforehand. Typical code for this step looks like: + + FILE * outfile; + ... + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + +where the last line invokes the standard destination module. + +WARNING: it is critical that the binary compressed data be delivered to the +output file unchanged. On non-Unix systems the stdio library may perform +newline translation or otherwise corrupt binary data. To suppress this +behavior, you may need to use a "b" option to fopen (as shown above), or use +setmode() or another routine to put the stdio stream in binary mode. See +cjpeg.c and djpeg.c for code that has been found to work on many systems. + +You can select the data destination after setting other parameters (step 3), +if that's more convenient. You may not change the destination between +calling jpeg_start_compress() and jpeg_finish_compress(). + + +3. Set parameters for compression, including image size & colorspace. + +You must supply information about the source image by setting the following +fields in the JPEG object (cinfo structure): + + image_width Width of image, in pixels + image_height Height of image, in pixels + input_components Number of color channels (samples per pixel) + in_color_space Color space of source image + +The image dimensions are, hopefully, obvious. JPEG supports image dimensions +of 1 to 64K pixels in either direction. The input color space is typically +RGB or grayscale, and input_components is 3 or 1 accordingly. (See "Special +color spaces", later, for more info.) The in_color_space field must be +assigned one of the J_COLOR_SPACE enum constants, typically JCS_RGB or +JCS_GRAYSCALE. + +JPEG has a large number of compression parameters that determine how the +image is encoded. Most applications don't need or want to know about all +these parameters. You can set all the parameters to reasonable defaults by +calling jpeg_set_defaults(); then, if there are particular values you want +to change, you can do so after that. The "Compression parameter selection" +section tells about all the parameters. + +You must set in_color_space correctly before calling jpeg_set_defaults(), +because the defaults depend on the source image colorspace. However the +other three source image parameters need not be valid until you call +jpeg_start_compress(). There's no harm in calling jpeg_set_defaults() more +than once, if that happens to be convenient. + +Typical code for a 24-bit RGB source image is + + cinfo.image_width = Width; /* image width and height, in pixels */ + cinfo.image_height = Height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + + jpeg_set_defaults(&cinfo); + /* Make optional parameter settings here */ + + +4. jpeg_start_compress(...); + +After you have established the data destination and set all the necessary +source image info and other parameters, call jpeg_start_compress() to begin +a compression cycle. This will initialize internal state, allocate working +storage, and emit the first few bytes of the JPEG datastream header. + +Typical code: + + jpeg_start_compress(&cinfo, TRUE); + +The "TRUE" parameter ensures that a complete JPEG interchange datastream +will be written. This is appropriate in most cases. If you think you might +want to use an abbreviated datastream, read the section on abbreviated +datastreams, below. + +Once you have called jpeg_start_compress(), you may not alter any JPEG +parameters or other fields of the JPEG object until you have completed +the compression cycle. + + +5. while (scan lines remain to be written) + jpeg_write_scanlines(...); + +Now write all the required image data by calling jpeg_write_scanlines() +one or more times. You can pass one or more scanlines in each call, up +to the total image height. In most applications it is convenient to pass +just one or a few scanlines at a time. The expected format for the passed +data is discussed under "Data formats", above. + +Image data should be written in top-to-bottom scanline order. The JPEG spec +contains some weasel wording about how top and bottom are application-defined +terms (a curious interpretation of the English language...) but if you want +your files to be compatible with everyone else's, you WILL use top-to-bottom +order. If the source data must be read in bottom-to-top order, you can use +the JPEG library's virtual array mechanism to invert the data efficiently. +Examples of this can be found in the sample application cjpeg. + +The library maintains a count of the number of scanlines written so far +in the next_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.next_scanline < cinfo.image_height)". + +Code for this step depends heavily on the way that you store the source data. +example.c shows the following code for the case of a full-size 2-D source +array containing 3-byte RGB pixels: + + JSAMPROW row_pointer[1]; /* pointer to a single row */ + int row_stride; /* physical row width in buffer */ + + row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + +jpeg_write_scanlines() returns the number of scanlines actually written. +This will normally be equal to the number passed in, so you can usually +ignore the return value. It is different in just two cases: + * If you try to write more scanlines than the declared image height, + the additional scanlines are ignored. + * If you use a suspending data destination manager, output buffer overrun + will cause the compressor to return before accepting all the passed lines. + This feature is discussed under "I/O suspension", below. The normal + stdio destination manager will NOT cause this to happen. +In any case, the return value is the same as the change in the value of +next_scanline. + + +6. jpeg_finish_compress(...); + +After all the image data has been written, call jpeg_finish_compress() to +complete the compression cycle. This step is ESSENTIAL to ensure that the +last bufferload of data is written to the data destination. +jpeg_finish_compress() also releases working memory associated with the JPEG +object. + +Typical code: + + jpeg_finish_compress(&cinfo); + +If using the stdio destination manager, don't forget to close the output +stdio stream (if necessary) afterwards. + +If you have requested a multi-pass operating mode, such as Huffman code +optimization, jpeg_finish_compress() will perform the additional passes using +data buffered by the first pass. In this case jpeg_finish_compress() may take +quite a while to complete. With the default compression parameters, this will +not happen. + +It is an error to call jpeg_finish_compress() before writing the necessary +total number of scanlines. If you wish to abort compression, call +jpeg_abort() as discussed below. + +After completing a compression cycle, you may dispose of the JPEG object +as discussed next, or you may use it to compress another image. In that case +return to step 2, 3, or 4 as appropriate. If you do not change the +destination manager, the new datastream will be written to the same target. +If you do not change any JPEG parameters, the new datastream will be written +with the same parameters as before. Note that you can change the input image +dimensions freely between cycles, but if you change the input colorspace, you +should call jpeg_set_defaults() to adjust for the new colorspace; and then +you'll need to repeat all of step 3. + + +7. Release the JPEG compression object. + +When you are done with a JPEG compression object, destroy it by calling +jpeg_destroy_compress(). This will free all subsidiary memory (regardless of +the previous state of the object). Or you can call jpeg_destroy(), which +works for either compression or decompression objects --- this may be more +convenient if you are sharing code between compression and decompression +cases. (Actually, these routines are equivalent except for the declared type +of the passed pointer. To avoid gripes from ANSI C compilers, jpeg_destroy() +should be passed a j_common_ptr.) + +If you allocated the jpeg_compress_struct structure from malloc(), freeing +it is your responsibility --- jpeg_destroy() won't. Ditto for the error +handler structure. + +Typical code: + + jpeg_destroy_compress(&cinfo); + + +8. Aborting. + +If you decide to abort a compression cycle before finishing, you can clean up +in either of two ways: + +* If you don't need the JPEG object any more, just call + jpeg_destroy_compress() or jpeg_destroy() to release memory. This is + legitimate at any point after calling jpeg_create_compress() --- in fact, + it's safe even if jpeg_create_compress() fails. + +* If you want to re-use the JPEG object, call jpeg_abort_compress(), or call + jpeg_abort() which works on both compression and decompression objects. + This will return the object to an idle state, releasing any working memory. + jpeg_abort() is allowed at any time after successful object creation. + +Note that cleaning up the data destination, if required, is your +responsibility; neither of these routines will call term_destination(). +(See "Compressed data handling", below, for more about that.) + +jpeg_destroy() and jpeg_abort() are the only safe calls to make on a JPEG +object that has reported an error by calling error_exit (see "Error handling" +for more info). The internal state of such an object is likely to be out of +whack. Either of these two routines will return the object to a known state. + + +Decompression details +--------------------- + +Here we revisit the JPEG decompression outline given in the overview. + +1. Allocate and initialize a JPEG decompression object. + +This is just like initialization for compression, as discussed above, +except that the object is a "struct jpeg_decompress_struct" and you +call jpeg_create_decompress(). Error handling is exactly the same. + +Typical code: + + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + +(Both here and in the IJG code, we usually use variable name "cinfo" for +both compression and decompression objects.) + + +2. Specify the source of the compressed data (eg, a file). + +As previously mentioned, the JPEG library reads compressed data from a "data +source" module. The library includes one data source module which knows how +to read from a stdio stream. You can use your own source module if you want +to do something else, as discussed later. + +If you use the standard source module, you must open the source stdio stream +beforehand. Typical code for this step looks like: + + FILE * infile; + ... + if ((infile = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_src(&cinfo, infile); + +where the last line invokes the standard source module. + +WARNING: it is critical that the binary compressed data be read unchanged. +On non-Unix systems the stdio library may perform newline translation or +otherwise corrupt binary data. To suppress this behavior, you may need to use +a "b" option to fopen (as shown above), or use setmode() or another routine to +put the stdio stream in binary mode. See cjpeg.c and djpeg.c for code that +has been found to work on many systems. + +You may not change the data source between calling jpeg_read_header() and +jpeg_finish_decompress(). If you wish to read a series of JPEG images from +a single source file, you should repeat the jpeg_read_header() to +jpeg_finish_decompress() sequence without reinitializing either the JPEG +object or the data source module; this prevents buffered input data from +being discarded. + + +3. Call jpeg_read_header() to obtain image info. + +Typical code for this step is just + + jpeg_read_header(&cinfo, TRUE); + +This will read the source datastream header markers, up to the beginning +of the compressed data proper. On return, the image dimensions and other +info have been stored in the JPEG object. The application may wish to +consult this information before selecting decompression parameters. + +More complex code is necessary if + * A suspending data source is used --- in that case jpeg_read_header() + may return before it has read all the header data. See "I/O suspension", + below. The normal stdio source manager will NOT cause this to happen. + * Abbreviated JPEG files are to be processed --- see the section on + abbreviated datastreams. Standard applications that deal only in + interchange JPEG files need not be concerned with this case either. + +It is permissible to stop at this point if you just wanted to find out the +image dimensions and other header info for a JPEG file. In that case, +call jpeg_destroy() when you are done with the JPEG object, or call +jpeg_abort() to return it to an idle state before selecting a new data +source and reading another header. + + +4. Set parameters for decompression. + +jpeg_read_header() sets appropriate default decompression parameters based on +the properties of the image (in particular, its colorspace). However, you +may well want to alter these defaults before beginning the decompression. +For example, the default is to produce full color output from a color file. +If you want colormapped output you must ask for it. Other options allow the +returned image to be scaled and allow various speed/quality tradeoffs to be +selected. "Decompression parameter selection", below, gives details. + +If the defaults are appropriate, nothing need be done at this step. + +Note that all default values are set by each call to jpeg_read_header(). +If you reuse a decompression object, you cannot expect your parameter +settings to be preserved across cycles, as you can for compression. +You must set desired parameter values each time. + + +5. jpeg_start_decompress(...); + +Once the parameter values are satisfactory, call jpeg_start_decompress() to +begin decompression. This will initialize internal state, allocate working +memory, and prepare for returning data. + +Typical code is just + + jpeg_start_decompress(&cinfo); + +If you have requested a multi-pass operating mode, such as 2-pass color +quantization, jpeg_start_decompress() will do everything needed before data +output can begin. In this case jpeg_start_decompress() may take quite a while +to complete. With a single-scan (non progressive) JPEG file and default +decompression parameters, this will not happen; jpeg_start_decompress() will +return quickly. + +After this call, the final output image dimensions, including any requested +scaling, are available in the JPEG object; so is the selected colormap, if +colormapped output has been requested. Useful fields include + + output_width image width and height, as scaled + output_height + out_color_components # of color components in out_color_space + output_components # of color components returned per pixel + colormap the selected colormap, if any + actual_number_of_colors number of entries in colormap + +output_components is 1 (a colormap index) when quantizing colors; otherwise it +equals out_color_components. It is the number of JSAMPLE values that will be +emitted per pixel in the output arrays. + +Typically you will need to allocate data buffers to hold the incoming image. +You will need output_width * output_components JSAMPLEs per scanline in your +output buffer, and a total of output_height scanlines will be returned. + +Note: if you are using the JPEG library's internal memory manager to allocate +data buffers (as djpeg does), then the manager's protocol requires that you +request large buffers *before* calling jpeg_start_decompress(). This is a +little tricky since the output_XXX fields are not normally valid then. You +can make them valid by calling jpeg_calc_output_dimensions() after setting the +relevant parameters (scaling, output color space, and quantization flag). + + +6. while (scan lines remain to be read) + jpeg_read_scanlines(...); + +Now you can read the decompressed image data by calling jpeg_read_scanlines() +one or more times. At each call, you pass in the maximum number of scanlines +to be read (ie, the height of your working buffer); jpeg_read_scanlines() +will return up to that many lines. The return value is the number of lines +actually read. The format of the returned data is discussed under "Data +formats", above. Don't forget that grayscale and color JPEGs will return +different data formats! + +Image data is returned in top-to-bottom scanline order. If you must write +out the image in bottom-to-top order, you can use the JPEG library's virtual +array mechanism to invert the data efficiently. Examples of this can be +found in the sample application djpeg. + +The library maintains a count of the number of scanlines returned so far +in the output_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.output_scanline < cinfo.output_height)". (Note that the test +should NOT be against image_height, unless you never use scaling. The +image_height field is the height of the original unscaled image.) +The return value always equals the change in the value of output_scanline. + +If you don't use a suspending data source, it is safe to assume that +jpeg_read_scanlines() reads at least one scanline per call, until the +bottom of the image has been reached. + +If you use a buffer larger than one scanline, it is NOT safe to assume that +jpeg_read_scanlines() fills it. (The current implementation returns only a +few scanlines per call, no matter how large a buffer you pass.) So you must +always provide a loop that calls jpeg_read_scanlines() repeatedly until the +whole image has been read. + + +7. jpeg_finish_decompress(...); + +After all the image data has been read, call jpeg_finish_decompress() to +complete the decompression cycle. This causes working memory associated +with the JPEG object to be released. + +Typical code: + + jpeg_finish_decompress(&cinfo); + +If using the stdio source manager, don't forget to close the source stdio +stream if necessary. + +It is an error to call jpeg_finish_decompress() before reading the correct +total number of scanlines. If you wish to abort decompression, call +jpeg_abort() as discussed below. + +After completing a decompression cycle, you may dispose of the JPEG object as +discussed next, or you may use it to decompress another image. In that case +return to step 2 or 3 as appropriate. If you do not change the source +manager, the next image will be read from the same source. + + +8. Release the JPEG decompression object. + +When you are done with a JPEG decompression object, destroy it by calling +jpeg_destroy_decompress() or jpeg_destroy(). The previous discussion of +destroying compression objects applies here too. + +Typical code: + + jpeg_destroy_decompress(&cinfo); + + +9. Aborting. + +You can abort a decompression cycle by calling jpeg_destroy_decompress() or +jpeg_destroy() if you don't need the JPEG object any more, or +jpeg_abort_decompress() or jpeg_abort() if you want to reuse the object. +The previous discussion of aborting compression cycles applies here too. + + +Mechanics of usage: include files, linking, etc +----------------------------------------------- + +Applications using the JPEG library should include the header file jpeglib.h +to obtain declarations of data types and routines. Before including +jpeglib.h, include system headers that define at least the typedefs FILE and +size_t. On ANSI-conforming systems, including is sufficient; on +older Unix systems, you may need to define size_t. + +If the application needs to refer to individual JPEG library error codes, also +include jerror.h to define those symbols. + +jpeglib.h indirectly includes the files jconfig.h and jmorecfg.h. If you are +installing the JPEG header files in a system directory, you will want to +install all four files: jpeglib.h, jerror.h, jconfig.h, jmorecfg.h. + +The most convenient way to include the JPEG code into your executable program +is to prepare a library file ("libjpeg.a", or a corresponding name on non-Unix +machines) and reference it at your link step. If you use only half of the +library (only compression or only decompression), only that much code will be +included from the library, unless your linker is hopelessly brain-damaged. +The supplied makefiles build libjpeg.a automatically (see install.txt). + +While you can build the JPEG library as a shared library if the whim strikes +you, we don't really recommend it. The trouble with shared libraries is that +at some point you'll probably try to substitute a new version of the library +without recompiling the calling applications. That generally doesn't work +because the parameter struct declarations usually change with each new +version. In other words, the library's API is *not* guaranteed binary +compatible across versions; we only try to ensure source-code compatibility. +(In hindsight, it might have been smarter to hide the parameter structs from +applications and introduce a ton of access functions instead. Too late now, +however.) + +On some systems your application may need to set up a signal handler to ensure +that temporary files are deleted if the program is interrupted. This is most +critical if you are on MS-DOS and use the jmemdos.c memory manager back end; +it will try to grab extended memory for temp files, and that space will NOT be +freed automatically. See cjpeg.c or djpeg.c for an example signal handler. + +It may be worth pointing out that the core JPEG library does not actually +require the stdio library: only the default source/destination managers and +error handler need it. You can use the library in a stdio-less environment +if you replace those modules and use jmemnobs.c (or another memory manager of +your own devising). More info about the minimum system library requirements +may be found in jinclude.h. + + +ADVANCED FEATURES +================= + +Compression parameter selection +------------------------------- + +This section describes all the optional parameters you can set for JPEG +compression, as well as the "helper" routines provided to assist in this +task. Proper setting of some parameters requires detailed understanding +of the JPEG standard; if you don't know what a parameter is for, it's best +not to mess with it! See REFERENCES in the README file for pointers to +more info about JPEG. + +It's a good idea to call jpeg_set_defaults() first, even if you plan to set +all the parameters; that way your code is more likely to work with future JPEG +libraries that have additional parameters. For the same reason, we recommend +you use a helper routine where one is provided, in preference to twiddling +cinfo fields directly. + +The helper routines are: + +jpeg_set_defaults (j_compress_ptr cinfo) + This routine sets all JPEG parameters to reasonable defaults, using + only the input image's color space (field in_color_space, which must + already be set in cinfo). Many applications will only need to use + this routine and perhaps jpeg_set_quality(). + +jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) + Sets the JPEG file's colorspace (field jpeg_color_space) as specified, + and sets other color-space-dependent parameters appropriately. See + "Special color spaces", below, before using this. A large number of + parameters, including all per-component parameters, are set by this + routine; if you want to twiddle individual parameters you should call + jpeg_set_colorspace() before rather than after. + +jpeg_default_colorspace (j_compress_ptr cinfo) + Selects an appropriate JPEG colorspace based on cinfo->in_color_space, + and calls jpeg_set_colorspace(). This is actually a subroutine of + jpeg_set_defaults(). It's broken out in case you want to change + just the colorspace-dependent JPEG parameters. + +jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) + Constructs JPEG quantization tables appropriate for the indicated + quality setting. The quality value is expressed on the 0..100 scale + recommended by IJG (cjpeg's "-quality" switch uses this routine). + Note that the exact mapping from quality values to tables may change + in future IJG releases as more is learned about DCT quantization. + If the force_baseline parameter is TRUE, then the quantization table + entries are constrained to the range 1..255 for full JPEG baseline + compatibility. In the current implementation, this only makes a + difference for quality settings below 25, and it effectively prevents + very small/low quality files from being generated. The IJG decoder + is capable of reading the non-baseline files generated at low quality + settings when force_baseline is FALSE, but other decoders may not be. + +jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, + boolean force_baseline) + Same as jpeg_set_quality() except that the generated tables are the + sample tables given in the JPEC spec section K.1, multiplied by the + specified scale factor (which is expressed as a percentage; thus + scale_factor = 100 reproduces the spec's tables). Note that larger + scale factors give lower quality. This entry point is useful for + conforming to the Adobe PostScript DCT conventions, but we do not + recommend linear scaling as a user-visible quality scale otherwise. + force_baseline again constrains the computed table entries to 1..255. + +int jpeg_quality_scaling (int quality) + Converts a value on the IJG-recommended quality scale to a linear + scaling percentage. Note that this routine may change or go away + in future releases --- IJG may choose to adopt a scaling method that + can't be expressed as a simple scalar multiplier, in which case the + premise of this routine collapses. Caveat user. + +jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) + Set default quantization tables with linear q_scale_factor[] values + (see below). + +jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, boolean force_baseline) + Allows an arbitrary quantization table to be created. which_tbl + indicates which table slot to fill. basic_table points to an array + of 64 unsigned ints given in normal array order. These values are + multiplied by scale_factor/100 and then clamped to the range 1..65535 + (or to 1..255 if force_baseline is TRUE). + CAUTION: prior to library version 6a, jpeg_add_quant_table expected + the basic table to be given in JPEG zigzag order. If you need to + write code that works with either older or newer versions of this + routine, you must check the library version number. Something like + "#if JPEG_LIB_VERSION >= 61" is the right test. + +jpeg_simple_progression (j_compress_ptr cinfo) + Generates a default scan script for writing a progressive-JPEG file. + This is the recommended method of creating a progressive file, + unless you want to make a custom scan sequence. You must ensure that + the JPEG color space is set correctly before calling this routine. + + +Compression parameters (cinfo fields) include: + +int block_size + Set DCT block size. All N from 1 to 16 are possible. + Default is 8 (baseline format). + Larger values produce higher compression, + smaller values produce higher quality. + An exact DCT stage is possible with 1 or 2. + With the default quality of 75 and default Luminance qtable + the DCT+Quantization stage is lossless for value 1. + Note that values other than 8 require a SmartScale capable decoder, + introduced with IJG JPEG 8. Setting the block_size parameter for + compression works with version 8c and later. + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are: + JDCT_ISLOW: slow but accurate integer algorithm + JDCT_IFAST: faster, less accurate integer method + JDCT_FLOAT: floating-point method + JDCT_DEFAULT: default method (normally JDCT_ISLOW) + JDCT_FASTEST: fastest method (normally JDCT_IFAST) + The FLOAT method is very slightly more accurate than the ISLOW method, + but may give different results on different machines due to varying + roundoff behavior. The integer methods should give the same results + on all machines. On machines with sufficiently fast FP hardware, the + floating-point method may also be the fastest. The IFAST method is + considerably less accurate than the other two; its use is not + recommended if high quality is a concern. JDCT_DEFAULT and + JDCT_FASTEST are macros configurable by each installation. + +unsigned int scale_num, scale_denom + Scale the image by the fraction scale_num/scale_denom. Default is + 1/1, or no scaling. Currently, the supported scaling ratios are + M/N with all N from 1 to 16, where M is the destination DCT size, + which is 8 by default (see block_size parameter above). + (The library design allows for arbitrary scaling ratios but this + is not likely to be implemented any time soon.) + +J_COLOR_SPACE jpeg_color_space +int num_components + The JPEG color space and corresponding number of components; see + "Special color spaces", below, for more info. We recommend using + jpeg_set_color_space() if you want to change these. + +boolean optimize_coding + TRUE causes the compressor to compute optimal Huffman coding tables + for the image. This requires an extra pass over the data and + therefore costs a good deal of space and time. The default is + FALSE, which tells the compressor to use the supplied or default + Huffman tables. In most cases optimal tables save only a few percent + of file size compared to the default tables. Note that when this is + TRUE, you need not supply Huffman tables at all, and any you do + supply will be overwritten. + +unsigned int restart_interval +int restart_in_rows + To emit restart markers in the JPEG file, set one of these nonzero. + Set restart_interval to specify the exact interval in MCU blocks. + Set restart_in_rows to specify the interval in MCU rows. (If + restart_in_rows is not 0, then restart_interval is set after the + image width in MCUs is computed.) Defaults are zero (no restarts). + One restart marker per MCU row is often a good choice. + NOTE: the overhead of restart markers is higher in grayscale JPEG + files than in color files, and MUCH higher in progressive JPEGs. + If you use restarts, you may want to use larger intervals in those + cases. + +const jpeg_scan_info * scan_info +int num_scans + By default, scan_info is NULL; this causes the compressor to write a + single-scan sequential JPEG file. If not NULL, scan_info points to + an array of scan definition records of length num_scans. The + compressor will then write a JPEG file having one scan for each scan + definition record. This is used to generate noninterleaved or + progressive JPEG files. The library checks that the scan array + defines a valid JPEG scan sequence. (jpeg_simple_progression creates + a suitable scan definition array for progressive JPEG.) This is + discussed further under "Progressive JPEG support". + +boolean do_fancy_downsampling + If TRUE, use direct DCT scaling with DCT size > 8 for downsampling + of chroma components. + If FALSE, use only DCT size <= 8 and simple separate downsampling. + Default is TRUE. + For better image stability in multiple generation compression cycles + it is preferable that this value matches the corresponding + do_fancy_upsampling value in decompression. + +int smoothing_factor + If non-zero, the input image is smoothed; the value should be 1 for + minimal smoothing to 100 for maximum smoothing. Consult jcsample.c + for details of the smoothing algorithm. The default is zero. + +boolean write_JFIF_header + If TRUE, a JFIF APP0 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if a JFIF-legal JPEG color space + (ie, YCbCr or grayscale) is selected, otherwise FALSE. + +UINT8 JFIF_major_version +UINT8 JFIF_minor_version + The version number to be written into the JFIF marker. + jpeg_set_defaults() initializes the version to 1.01 (major=minor=1). + You should set it to 1.02 (major=1, minor=2) if you plan to write + any JFIF 1.02 extension markers. + +UINT8 density_unit +UINT16 X_density +UINT16 Y_density + The resolution information to be written into the JFIF marker; + not used otherwise. density_unit may be 0 for unknown, + 1 for dots/inch, or 2 for dots/cm. The default values are 0,1,1 + indicating square pixels of unknown size. + +boolean write_Adobe_marker + If TRUE, an Adobe APP14 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if JPEG color space RGB, CMYK, + or YCCK is selected, otherwise FALSE. It is generally a bad idea + to set both write_JFIF_header and write_Adobe_marker. In fact, + you probably shouldn't change the default settings at all --- the + default behavior ensures that the JPEG file's color space can be + recognized by the decoder. + +JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS] + Pointers to coefficient quantization tables, one per table slot, + or NULL if no table is defined for a slot. Usually these should + be set via one of the above helper routines; jpeg_add_quant_table() + is general enough to define any quantization table. The other + routines will set up table slot 0 for luminance quality and table + slot 1 for chrominance. + +int q_scale_factor[NUM_QUANT_TBLS] + Linear quantization scaling factors (percentage, initialized 100) + for use with jpeg_default_qtables(). + See rdswitch.c and cjpeg.c for an example of usage. + Note that the q_scale_factor[] fields are the "linear" scales, so you + have to convert from user-defined ratings via jpeg_quality_scaling(). + Here is an example code which corresponds to cjpeg -quality 90,70: + + jpeg_set_defaults(cinfo); + + /* Set luminance quality 90. */ + cinfo->q_scale_factor[0] = jpeg_quality_scaling(90); + /* Set chrominance quality 70. */ + cinfo->q_scale_factor[1] = jpeg_quality_scaling(70); + + jpeg_default_qtables(cinfo, force_baseline); + + CAUTION: You must also set 1x1 subsampling for efficient separate + color quality selection, since the default value used by library + is 2x2: + + cinfo->comp_info[0].v_samp_factor = 1; + cinfo->comp_info[0].h_samp_factor = 1; + +JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS] +JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS] + Pointers to Huffman coding tables, one per table slot, or NULL if + no table is defined for a slot. Slots 0 and 1 are filled with the + JPEG sample tables by jpeg_set_defaults(). If you need to allocate + more table structures, jpeg_alloc_huff_table() may be used. + Note that optimal Huffman tables can be computed for an image + by setting optimize_coding, as discussed above; there's seldom + any need to mess with providing your own Huffman tables. + + +The actual dimensions of the JPEG image that will be written to the file are +given by the following fields. These are computed from the input image +dimensions and the compression parameters by jpeg_start_compress(). You can +also call jpeg_calc_jpeg_dimensions() to obtain the values that will result +from the current parameter settings. This can be useful if you are trying +to pick a scaling ratio that will get close to a desired target size. + +JDIMENSION jpeg_width Actual dimensions of output image. +JDIMENSION jpeg_height + + +Per-component parameters are stored in the struct cinfo.comp_info[i] for +component number i. Note that components here refer to components of the +JPEG color space, *not* the source image color space. A suitably large +comp_info[] array is allocated by jpeg_set_defaults(); if you choose not +to use that routine, it's up to you to allocate the array. + +int component_id + The one-byte identifier code to be recorded in the JPEG file for + this component. For the standard color spaces, we recommend you + leave the default values alone. + +int h_samp_factor +int v_samp_factor + Horizontal and vertical sampling factors for the component; must + be 1..4 according to the JPEG standard. Note that larger sampling + factors indicate a higher-resolution component; many people find + this behavior quite unintuitive. The default values are 2,2 for + luminance components and 1,1 for chrominance components, except + for grayscale where 1,1 is used. + +int quant_tbl_no + Quantization table number for component. The default value is + 0 for luminance components and 1 for chrominance components. + +int dc_tbl_no +int ac_tbl_no + DC and AC entropy coding table numbers. The default values are + 0 for luminance components and 1 for chrominance components. + +int component_index + Must equal the component's index in comp_info[]. (Beginning in + release v6, the compressor library will fill this in automatically; + you don't have to.) + + +Decompression parameter selection +--------------------------------- + +Decompression parameter selection is somewhat simpler than compression +parameter selection, since all of the JPEG internal parameters are +recorded in the source file and need not be supplied by the application. +(Unless you are working with abbreviated files, in which case see +"Abbreviated datastreams", below.) Decompression parameters control +the postprocessing done on the image to deliver it in a format suitable +for the application's use. Many of the parameters control speed/quality +tradeoffs, in which faster decompression may be obtained at the price of +a poorer-quality image. The defaults select the highest quality (slowest) +processing. + +The following fields in the JPEG object are set by jpeg_read_header() and +may be useful to the application in choosing decompression parameters: + +JDIMENSION image_width Width and height of image +JDIMENSION image_height +int num_components Number of color components +J_COLOR_SPACE jpeg_color_space Colorspace of image +boolean saw_JFIF_marker TRUE if a JFIF APP0 marker was seen + UINT8 JFIF_major_version Version information from JFIF marker + UINT8 JFIF_minor_version + UINT8 density_unit Resolution data from JFIF marker + UINT16 X_density + UINT16 Y_density +boolean saw_Adobe_marker TRUE if an Adobe APP14 marker was seen + UINT8 Adobe_transform Color transform code from Adobe marker + +The JPEG color space, unfortunately, is something of a guess since the JPEG +standard proper does not provide a way to record it. In practice most files +adhere to the JFIF or Adobe conventions, and the decoder will recognize these +correctly. See "Special color spaces", below, for more info. + + +The decompression parameters that determine the basic properties of the +returned image are: + +J_COLOR_SPACE out_color_space + Output color space. jpeg_read_header() sets an appropriate default + based on jpeg_color_space; typically it will be RGB or grayscale. + The application can change this field to request output in a different + colorspace. For example, set it to JCS_GRAYSCALE to get grayscale + output from a color file. (This is useful for previewing: grayscale + output is faster than full color since the color components need not + be processed.) Note that not all possible color space transforms are + currently implemented; you may need to extend jdcolor.c if you want an + unusual conversion. + +unsigned int scale_num, scale_denom + Scale the image by the fraction scale_num/scale_denom. Currently, + the supported scaling ratios are M/N with all M from 1 to 16, where + N is the source DCT size, which is 8 for baseline JPEG. (The library + design allows for arbitrary scaling ratios but this is not likely + to be implemented any time soon.) The values are initialized by + jpeg_read_header() with the source DCT size. For baseline JPEG + this is 8/8. If you change only the scale_num value while leaving + the other unchanged, then this specifies the DCT scaled size to be + applied on the given input. For baseline JPEG this is equivalent + to M/8 scaling, since the source DCT size for baseline JPEG is 8. + Smaller scaling ratios permit significantly faster decoding since + fewer pixels need be processed and a simpler IDCT method can be used. + +boolean quantize_colors + If set TRUE, colormapped output will be delivered. Default is FALSE, + meaning that full-color output will be delivered. + +The next three parameters are relevant only if quantize_colors is TRUE. + +int desired_number_of_colors + Maximum number of colors to use in generating a library-supplied color + map (the actual number of colors is returned in a different field). + Default 256. Ignored when the application supplies its own color map. + +boolean two_pass_quantize + If TRUE, an extra pass over the image is made to select a custom color + map for the image. This usually looks a lot better than the one-size- + fits-all colormap that is used otherwise. Default is TRUE. Ignored + when the application supplies its own color map. + +J_DITHER_MODE dither_mode + Selects color dithering method. Supported values are: + JDITHER_NONE no dithering: fast, very low quality + JDITHER_ORDERED ordered dither: moderate speed and quality + JDITHER_FS Floyd-Steinberg dither: slow, high quality + Default is JDITHER_FS. (At present, ordered dither is implemented + only in the single-pass, standard-colormap case. If you ask for + ordered dither when two_pass_quantize is TRUE or when you supply + an external color map, you'll get F-S dithering.) + +When quantize_colors is TRUE, the target color map is described by the next +two fields. colormap is set to NULL by jpeg_read_header(). The application +can supply a color map by setting colormap non-NULL and setting +actual_number_of_colors to the map size. Otherwise, jpeg_start_decompress() +selects a suitable color map and sets these two fields itself. +[Implementation restriction: at present, an externally supplied colormap is +only accepted for 3-component output color spaces.] + +JSAMPARRAY colormap + The color map, represented as a 2-D pixel array of out_color_components + rows and actual_number_of_colors columns. Ignored if not quantizing. + CAUTION: if the JPEG library creates its own colormap, the storage + pointed to by this field is released by jpeg_finish_decompress(). + Copy the colormap somewhere else first, if you want to save it. + +int actual_number_of_colors + The number of colors in the color map. + +Additional decompression parameters that the application may set include: + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are the same + as described above for compression. + +boolean do_fancy_upsampling + If TRUE, use direct DCT scaling with DCT size > 8 for upsampling + of chroma components. + If FALSE, use only DCT size <= 8 and simple separate upsampling. + Default is TRUE. + For better image stability in multiple generation compression cycles + it is preferable that this value matches the corresponding + do_fancy_downsampling value in compression. + +boolean do_block_smoothing + If TRUE, interblock smoothing is applied in early stages of decoding + progressive JPEG files; if FALSE, not. Default is TRUE. Early + progression stages look "fuzzy" with smoothing, "blocky" without. + In any case, block smoothing ceases to be applied after the first few + AC coefficients are known to full accuracy, so it is relevant only + when using buffered-image mode for progressive images. + +boolean enable_1pass_quant +boolean enable_external_quant +boolean enable_2pass_quant + These are significant only in buffered-image mode, which is + described in its own section below. + + +The output image dimensions are given by the following fields. These are +computed from the source image dimensions and the decompression parameters +by jpeg_start_decompress(). You can also call jpeg_calc_output_dimensions() +to obtain the values that will result from the current parameter settings. +This can be useful if you are trying to pick a scaling ratio that will get +close to a desired target size. It's also important if you are using the +JPEG library's memory manager to allocate output buffer space, because you +are supposed to request such buffers *before* jpeg_start_decompress(). + +JDIMENSION output_width Actual dimensions of output image. +JDIMENSION output_height +int out_color_components Number of color components in out_color_space. +int output_components Number of color components returned. +int rec_outbuf_height Recommended height of scanline buffer. + +When quantizing colors, output_components is 1, indicating a single color map +index per pixel. Otherwise it equals out_color_components. The output arrays +are required to be output_width * output_components JSAMPLEs wide. + +rec_outbuf_height is the recommended minimum height (in scanlines) of the +buffer passed to jpeg_read_scanlines(). If the buffer is smaller, the +library will still work, but time will be wasted due to unnecessary data +copying. In high-quality modes, rec_outbuf_height is always 1, but some +faster, lower-quality modes set it to larger values (typically 2 to 4). +If you are going to ask for a high-speed processing mode, you may as well +go to the trouble of honoring rec_outbuf_height so as to avoid data copying. +(An output buffer larger than rec_outbuf_height lines is OK, but won't +provide any material speed improvement over that height.) + + +Special color spaces +-------------------- + +The JPEG standard itself is "color blind" and doesn't specify any particular +color space. It is customary to convert color data to a luminance/chrominance +color space before compressing, since this permits greater compression. The +existing de-facto JPEG file format standards specify YCbCr or grayscale data +(JFIF), or grayscale, RGB, YCbCr, CMYK, or YCCK (Adobe). For special +applications such as multispectral images, other color spaces can be used, +but it must be understood that such files will be unportable. + +The JPEG library can handle the most common colorspace conversions (namely +RGB <=> YCbCr and CMYK <=> YCCK). It can also deal with data of an unknown +color space, passing it through without conversion. If you deal extensively +with an unusual color space, you can easily extend the library to understand +additional color spaces and perform appropriate conversions. + +For compression, the source data's color space is specified by field +in_color_space. This is transformed to the JPEG file's color space given +by jpeg_color_space. jpeg_set_defaults() chooses a reasonable JPEG color +space depending on in_color_space, but you can override this by calling +jpeg_set_colorspace(). Of course you must select a supported transformation. +jccolor.c currently supports the following transformations: + RGB => YCbCr + RGB => GRAYSCALE + YCbCr => GRAYSCALE + CMYK => YCCK +plus the null transforms: GRAYSCALE => GRAYSCALE, RGB => RGB, +YCbCr => YCbCr, CMYK => CMYK, YCCK => YCCK, and UNKNOWN => UNKNOWN. + +The de-facto file format standards (JFIF and Adobe) specify APPn markers that +indicate the color space of the JPEG file. It is important to ensure that +these are written correctly, or omitted if the JPEG file's color space is not +one of the ones supported by the de-facto standards. jpeg_set_colorspace() +will set the compression parameters to include or omit the APPn markers +properly, so long as it is told the truth about the JPEG color space. +For example, if you are writing some random 3-component color space without +conversion, don't try to fake out the library by setting in_color_space and +jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN. You may want to write an +APPn marker of your own devising to identify the colorspace --- see "Special +markers", below. + +When told that the color space is UNKNOWN, the library will default to using +luminance-quality compression parameters for all color components. You may +well want to change these parameters. See the source code for +jpeg_set_colorspace(), in jcparam.c, for details. + +For decompression, the JPEG file's color space is given in jpeg_color_space, +and this is transformed to the output color space out_color_space. +jpeg_read_header's setting of jpeg_color_space can be relied on if the file +conforms to JFIF or Adobe conventions, but otherwise it is no better than a +guess. If you know the JPEG file's color space for certain, you can override +jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also +selects a default output color space based on (its guess of) jpeg_color_space; +set out_color_space to override this. Again, you must select a supported +transformation. jdcolor.c currently supports + YCbCr => GRAYSCALE + YCbCr => RGB + GRAYSCALE => RGB + YCCK => CMYK +as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an +application can force grayscale JPEGs to look like color JPEGs if it only +wants to handle one case.) + +The two-pass color quantizer, jquant2.c, is specialized to handle RGB data +(it weights distances appropriately for RGB colors). You'll need to modify +the code if you want to use it for non-RGB output color spaces. Note that +jquant2.c is used to map to an application-supplied colormap as well as for +the normal two-pass colormap selection process. + +CAUTION: it appears that Adobe Photoshop writes inverted data in CMYK JPEG +files: 0 represents 100% ink coverage, rather than 0% ink as you'd expect. +This is arguably a bug in Photoshop, but if you need to work with Photoshop +CMYK files, you will have to deal with it in your application. We cannot +"fix" this in the library by inverting the data during the CMYK<=>YCCK +transform, because that would break other applications, notably Ghostscript. +Photoshop versions prior to 3.0 write EPS files containing JPEG-encoded CMYK +data in the same inverted-YCCK representation used in bare JPEG files, but +the surrounding PostScript code performs an inversion using the PS image +operator. I am told that Photoshop 3.0 will write uninverted YCCK in +EPS/JPEG files, and will omit the PS-level inversion. (But the data +polarity used in bare JPEG files will not change in 3.0.) In either case, +the JPEG library must not invert the data itself, or else Ghostscript would +read these EPS files incorrectly. + + +Error handling +-------------- + +When the default error handler is used, any error detected inside the JPEG +routines will cause a message to be printed on stderr, followed by exit(). +You can supply your own error handling routines to override this behavior +and to control the treatment of nonfatal warnings and trace/debug messages. +The file example.c illustrates the most common case, which is to have the +application regain control after an error rather than exiting. + +The JPEG library never writes any message directly; it always goes through +the error handling routines. Three classes of messages are recognized: + * Fatal errors: the library cannot continue. + * Warnings: the library can continue, but the data is corrupt, and a + damaged output image is likely to result. + * Trace/informational messages. These come with a trace level indicating + the importance of the message; you can control the verbosity of the + program by adjusting the maximum trace level that will be displayed. + +You may, if you wish, simply replace the entire JPEG error handling module +(jerror.c) with your own code. However, you can avoid code duplication by +only replacing some of the routines depending on the behavior you need. +This is accomplished by calling jpeg_std_error() as usual, but then overriding +some of the method pointers in the jpeg_error_mgr struct, as illustrated by +example.c. + +All of the error handling routines will receive a pointer to the JPEG object +(a j_common_ptr which points to either a jpeg_compress_struct or a +jpeg_decompress_struct; if you need to tell which, test the is_decompressor +field). This struct includes a pointer to the error manager struct in its +"err" field. Frequently, custom error handler routines will need to access +additional data which is not known to the JPEG library or the standard error +handler. The most convenient way to do this is to embed either the JPEG +object or the jpeg_error_mgr struct in a larger structure that contains +additional fields; then casting the passed pointer provides access to the +additional fields. Again, see example.c for one way to do it. (Beginning +with IJG version 6b, there is also a void pointer "client_data" in each +JPEG object, which the application can also use to find related data. +The library does not touch client_data at all.) + +The individual methods that you might wish to override are: + +error_exit (j_common_ptr cinfo) + Receives control for a fatal error. Information sufficient to + generate the error message has been stored in cinfo->err; call + output_message to display it. Control must NOT return to the caller; + generally this routine will exit() or longjmp() somewhere. + Typically you would override this routine to get rid of the exit() + default behavior. Note that if you continue processing, you should + clean up the JPEG object with jpeg_abort() or jpeg_destroy(). + +output_message (j_common_ptr cinfo) + Actual output of any JPEG message. Override this to send messages + somewhere other than stderr. Note that this method does not know + how to generate a message, only where to send it. + +format_message (j_common_ptr cinfo, char * buffer) + Constructs a readable error message string based on the error info + stored in cinfo->err. This method is called by output_message. Few + applications should need to override this method. One possible + reason for doing so is to implement dynamic switching of error message + language. + +emit_message (j_common_ptr cinfo, int msg_level) + Decide whether or not to emit a warning or trace message; if so, + calls output_message. The main reason for overriding this method + would be to abort on warnings. msg_level is -1 for warnings, + 0 and up for trace messages. + +Only error_exit() and emit_message() are called from the rest of the JPEG +library; the other two are internal to the error handler. + +The actual message texts are stored in an array of strings which is pointed to +by the field err->jpeg_message_table. The messages are numbered from 0 to +err->last_jpeg_message, and it is these code numbers that are used in the +JPEG library code. You could replace the message texts (for instance, with +messages in French or German) by changing the message table pointer. See +jerror.h for the default texts. CAUTION: this table will almost certainly +change or grow from one library version to the next. + +It may be useful for an application to add its own message texts that are +handled by the same mechanism. The error handler supports a second "add-on" +message table for this purpose. To define an addon table, set the pointer +err->addon_message_table and the message numbers err->first_addon_message and +err->last_addon_message. If you number the addon messages beginning at 1000 +or so, you won't have to worry about conflicts with the library's built-in +messages. See the sample applications cjpeg/djpeg for an example of using +addon messages (the addon messages are defined in cderror.h). + +Actual invocation of the error handler is done via macros defined in jerror.h: + ERREXITn(...) for fatal errors + WARNMSn(...) for corrupt-data warnings + TRACEMSn(...) for trace and informational messages. +These macros store the message code and any additional parameters into the +error handler struct, then invoke the error_exit() or emit_message() method. +The variants of each macro are for varying numbers of additional parameters. +The additional parameters are inserted into the generated message using +standard printf() format codes. + +See jerror.h and jerror.c for further details. + + +Compressed data handling (source and destination managers) +---------------------------------------------------------- + +The JPEG compression library sends its compressed data to a "destination +manager" module. The default destination manager just writes the data to a +memory buffer or to a stdio stream, but you can provide your own manager to +do something else. Similarly, the decompression library calls a "source +manager" to obtain the compressed data; you can provide your own source +manager if you want the data to come from somewhere other than a memory +buffer or a stdio stream. + +In both cases, compressed data is processed a bufferload at a time: the +destination or source manager provides a work buffer, and the library invokes +the manager only when the buffer is filled or emptied. (You could define a +one-character buffer to force the manager to be invoked for each byte, but +that would be rather inefficient.) The buffer's size and location are +controlled by the manager, not by the library. For example, the memory +source manager just makes the buffer pointer and length point to the original +data in memory. In this case the buffer-reload procedure will be invoked +only if the decompressor ran off the end of the datastream, which would +indicate an erroneous datastream. + +The work buffer is defined as an array of datatype JOCTET, which is generally +"char" or "unsigned char". On a machine where char is not exactly 8 bits +wide, you must define JOCTET as a wider data type and then modify the data +source and destination modules to transcribe the work arrays into 8-bit units +on external storage. + +A data destination manager struct contains a pointer and count defining the +next byte to write in the work buffer and the remaining free space: + + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is filled. The manager's empty_output_buffer method must reset the pointer +and count. The manager is expected to remember the buffer's starting address +and total size in private fields not visible to the library. + +A data destination manager provides three methods: + +init_destination (j_compress_ptr cinfo) + Initialize destination. This is called by jpeg_start_compress() + before any data is actually written. It must initialize + next_output_byte and free_in_buffer. free_in_buffer must be + initialized to a positive value. + +empty_output_buffer (j_compress_ptr cinfo) + This is called whenever the buffer has filled (free_in_buffer + reaches zero). In typical applications, it should write out the + *entire* buffer (use the saved start address and buffer length; + ignore the current state of next_output_byte and free_in_buffer). + Then reset the pointer & count to the start of the buffer, and + return TRUE indicating that the buffer has been dumped. + free_in_buffer must be set to a positive value when TRUE is + returned. A FALSE return should only be used when I/O suspension is + desired (this operating mode is discussed in the next section). + +term_destination (j_compress_ptr cinfo) + Terminate destination --- called by jpeg_finish_compress() after all + data has been written. In most applications, this must flush any + data remaining in the buffer. Use either next_output_byte or + free_in_buffer to determine how much data is in the buffer. + +term_destination() is NOT called by jpeg_abort() or jpeg_destroy(). If you +want the destination manager to be cleaned up during an abort, you must do it +yourself. + +You will also need code to create a jpeg_destination_mgr struct, fill in its +method pointers, and insert a pointer to the struct into the "dest" field of +the JPEG compression object. This can be done in-line in your setup code if +you like, but it's probably cleaner to provide a separate routine similar to +the jpeg_stdio_dest() or jpeg_mem_dest() routines of the supplied destination +managers. + +Decompression source managers follow a parallel design, but with some +additional frammishes. The source manager struct contains a pointer and count +defining the next byte to read from the work buffer and the number of bytes +remaining: + + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is emptied. The manager's fill_input_buffer method must reset the pointer and +count. In most applications, the manager must remember the buffer's starting +address and total size in private fields not visible to the library. + +A data source manager provides five methods: + +init_source (j_decompress_ptr cinfo) + Initialize source. This is called by jpeg_read_header() before any + data is actually read. Unlike init_destination(), it may leave + bytes_in_buffer set to 0 (in which case a fill_input_buffer() call + will occur immediately). + +fill_input_buffer (j_decompress_ptr cinfo) + This is called whenever bytes_in_buffer has reached zero and more + data is wanted. In typical applications, it should read fresh data + into the buffer (ignoring the current state of next_input_byte and + bytes_in_buffer), reset the pointer & count to the start of the + buffer, and return TRUE indicating that the buffer has been reloaded. + It is not necessary to fill the buffer entirely, only to obtain at + least one more byte. bytes_in_buffer MUST be set to a positive value + if TRUE is returned. A FALSE return should only be used when I/O + suspension is desired (this mode is discussed in the next section). + +skip_input_data (j_decompress_ptr cinfo, long num_bytes) + Skip num_bytes worth of data. The buffer pointer and count should + be advanced over num_bytes input bytes, refilling the buffer as + needed. This is used to skip over a potentially large amount of + uninteresting data (such as an APPn marker). In some applications + it may be possible to optimize away the reading of the skipped data, + but it's not clear that being smart is worth much trouble; large + skips are uncommon. bytes_in_buffer may be zero on return. + A zero or negative skip count should be treated as a no-op. + +resync_to_restart (j_decompress_ptr cinfo, int desired) + This routine is called only when the decompressor has failed to find + a restart (RSTn) marker where one is expected. Its mission is to + find a suitable point for resuming decompression. For most + applications, we recommend that you just use the default resync + procedure, jpeg_resync_to_restart(). However, if you are able to back + up in the input data stream, or if you have a-priori knowledge about + the likely location of restart markers, you may be able to do better. + Read the read_restart_marker() and jpeg_resync_to_restart() routines + in jdmarker.c if you think you'd like to implement your own resync + procedure. + +term_source (j_decompress_ptr cinfo) + Terminate source --- called by jpeg_finish_decompress() after all + data has been read. Often a no-op. + +For both fill_input_buffer() and skip_input_data(), there is no such thing +as an EOF return. If the end of the file has been reached, the routine has +a choice of exiting via ERREXIT() or inserting fake data into the buffer. +In most cases, generating a warning message and inserting a fake EOI marker +is the best course of action --- this will allow the decompressor to output +however much of the image is there. In pathological cases, the decompressor +may swallow the EOI and again demand data ... just keep feeding it fake EOIs. +jdatasrc.c illustrates the recommended error recovery behavior. + +term_source() is NOT called by jpeg_abort() or jpeg_destroy(). If you want +the source manager to be cleaned up during an abort, you must do it yourself. + +You will also need code to create a jpeg_source_mgr struct, fill in its method +pointers, and insert a pointer to the struct into the "src" field of the JPEG +decompression object. This can be done in-line in your setup code if you +like, but it's probably cleaner to provide a separate routine similar to the +jpeg_stdio_src() or jpeg_mem_src() routines of the supplied source managers. + +For more information, consult the memory and stdio source and destination +managers in jdatasrc.c and jdatadst.c. + + +I/O suspension +-------------- + +Some applications need to use the JPEG library as an incremental memory-to- +memory filter: when the compressed data buffer is filled or emptied, they want +control to return to the outer loop, rather than expecting that the buffer can +be emptied or reloaded within the data source/destination manager subroutine. +The library supports this need by providing an "I/O suspension" mode, which we +describe in this section. + +The I/O suspension mode is not a panacea: nothing is guaranteed about the +maximum amount of time spent in any one call to the library, so it will not +eliminate response-time problems in single-threaded applications. If you +need guaranteed response time, we suggest you "bite the bullet" and implement +a real multi-tasking capability. + +To use I/O suspension, cooperation is needed between the calling application +and the data source or destination manager; you will always need a custom +source/destination manager. (Please read the previous section if you haven't +already.) The basic idea is that the empty_output_buffer() or +fill_input_buffer() routine is a no-op, merely returning FALSE to indicate +that it has done nothing. Upon seeing this, the JPEG library suspends +operation and returns to its caller. The surrounding application is +responsible for emptying or refilling the work buffer before calling the +JPEG library again. + +Compression suspension: + +For compression suspension, use an empty_output_buffer() routine that returns +FALSE; typically it will not do anything else. This will cause the +compressor to return to the caller of jpeg_write_scanlines(), with the return +value indicating that not all the supplied scanlines have been accepted. +The application must make more room in the output buffer, adjust the output +buffer pointer/count appropriately, and then call jpeg_write_scanlines() +again, pointing to the first unconsumed scanline. + +When forced to suspend, the compressor will backtrack to a convenient stopping +point (usually the start of the current MCU); it will regenerate some output +data when restarted. Therefore, although empty_output_buffer() is only +called when the buffer is filled, you should NOT write out the entire buffer +after a suspension. Write only the data up to the current position of +next_output_byte/free_in_buffer. The data beyond that point will be +regenerated after resumption. + +Because of the backtracking behavior, a good-size output buffer is essential +for efficiency; you don't want the compressor to suspend often. (In fact, an +overly small buffer could lead to infinite looping, if a single MCU required +more data than would fit in the buffer.) We recommend a buffer of at least +several Kbytes. You may want to insert explicit code to ensure that you don't +call jpeg_write_scanlines() unless there is a reasonable amount of space in +the output buffer; in other words, flush the buffer before trying to compress +more data. + +The compressor does not allow suspension while it is trying to write JPEG +markers at the beginning and end of the file. This means that: + * At the beginning of a compression operation, there must be enough free + space in the output buffer to hold the header markers (typically 600 or + so bytes). The recommended buffer size is bigger than this anyway, so + this is not a problem as long as you start with an empty buffer. However, + this restriction might catch you if you insert large special markers, such + as a JFIF thumbnail image, without flushing the buffer afterwards. + * When you call jpeg_finish_compress(), there must be enough space in the + output buffer to emit any buffered data and the final EOI marker. In the + current implementation, half a dozen bytes should suffice for this, but + for safety's sake we recommend ensuring that at least 100 bytes are free + before calling jpeg_finish_compress(). + +A more significant restriction is that jpeg_finish_compress() cannot suspend. +This means you cannot use suspension with multi-pass operating modes, namely +Huffman code optimization and multiple-scan output. Those modes write the +whole file during jpeg_finish_compress(), which will certainly result in +buffer overrun. (Note that this restriction applies only to compression, +not decompression. The decompressor supports input suspension in all of its +operating modes.) + +Decompression suspension: + +For decompression suspension, use a fill_input_buffer() routine that simply +returns FALSE (except perhaps during error recovery, as discussed below). +This will cause the decompressor to return to its caller with an indication +that suspension has occurred. This can happen at four places: + * jpeg_read_header(): will return JPEG_SUSPENDED. + * jpeg_start_decompress(): will return FALSE, rather than its usual TRUE. + * jpeg_read_scanlines(): will return the number of scanlines already + completed (possibly 0). + * jpeg_finish_decompress(): will return FALSE, rather than its usual TRUE. +The surrounding application must recognize these cases, load more data into +the input buffer, and repeat the call. In the case of jpeg_read_scanlines(), +increment the passed pointers past any scanlines successfully read. + +Just as with compression, the decompressor will typically backtrack to a +convenient restart point before suspending. When fill_input_buffer() is +called, next_input_byte/bytes_in_buffer point to the current restart point, +which is where the decompressor will backtrack to if FALSE is returned. +The data beyond that position must NOT be discarded if you suspend; it needs +to be re-read upon resumption. In most implementations, you'll need to shift +this data down to the start of your work buffer and then load more data after +it. Again, this behavior means that a several-Kbyte work buffer is essential +for decent performance; furthermore, you should load a reasonable amount of +new data before resuming decompression. (If you loaded, say, only one new +byte each time around, you could waste a LOT of cycles.) + +The skip_input_data() source manager routine requires special care in a +suspension scenario. This routine is NOT granted the ability to suspend the +decompressor; it can decrement bytes_in_buffer to zero, but no more. If the +requested skip distance exceeds the amount of data currently in the input +buffer, then skip_input_data() must set bytes_in_buffer to zero and record the +additional skip distance somewhere else. The decompressor will immediately +call fill_input_buffer(), which should return FALSE, which will cause a +suspension return. The surrounding application must then arrange to discard +the recorded number of bytes before it resumes loading the input buffer. +(Yes, this design is rather baroque, but it avoids complexity in the far more +common case where a non-suspending source manager is used.) + +If the input data has been exhausted, we recommend that you emit a warning +and insert dummy EOI markers just as a non-suspending data source manager +would do. This can be handled either in the surrounding application logic or +within fill_input_buffer(); the latter is probably more efficient. If +fill_input_buffer() knows that no more data is available, it can set the +pointer/count to point to a dummy EOI marker and then return TRUE just as +though it had read more data in a non-suspending situation. + +The decompressor does not attempt to suspend within standard JPEG markers; +instead it will backtrack to the start of the marker and reprocess the whole +marker next time. Hence the input buffer must be large enough to hold the +longest standard marker in the file. Standard JPEG markers should normally +not exceed a few hundred bytes each (DHT tables are typically the longest). +We recommend at least a 2K buffer for performance reasons, which is much +larger than any correct marker is likely to be. For robustness against +damaged marker length counts, you may wish to insert a test in your +application for the case that the input buffer is completely full and yet +the decoder has suspended without consuming any data --- otherwise, if this +situation did occur, it would lead to an endless loop. (The library can't +provide this test since it has no idea whether "the buffer is full", or +even whether there is a fixed-size input buffer.) + +The input buffer would need to be 64K to allow for arbitrary COM or APPn +markers, but these are handled specially: they are either saved into allocated +memory, or skipped over by calling skip_input_data(). In the former case, +suspension is handled correctly, and in the latter case, the problem of +buffer overrun is placed on skip_input_data's shoulders, as explained above. +Note that if you provide your own marker handling routine for large markers, +you should consider how to deal with buffer overflow. + +Multiple-buffer management: + +In some applications it is desirable to store the compressed data in a linked +list of buffer areas, so as to avoid data copying. This can be handled by +having empty_output_buffer() or fill_input_buffer() set the pointer and count +to reference the next available buffer; FALSE is returned only if no more +buffers are available. Although seemingly straightforward, there is a +pitfall in this approach: the backtrack that occurs when FALSE is returned +could back up into an earlier buffer. For example, when fill_input_buffer() +is called, the current pointer & count indicate the backtrack restart point. +Since fill_input_buffer() will set the pointer and count to refer to a new +buffer, the restart position must be saved somewhere else. Suppose a second +call to fill_input_buffer() occurs in the same library call, and no +additional input data is available, so fill_input_buffer must return FALSE. +If the JPEG library has not moved the pointer/count forward in the current +buffer, then *the correct restart point is the saved position in the prior +buffer*. Prior buffers may be discarded only after the library establishes +a restart point within a later buffer. Similar remarks apply for output into +a chain of buffers. + +The library will never attempt to backtrack over a skip_input_data() call, +so any skipped data can be permanently discarded. You still have to deal +with the case of skipping not-yet-received data, however. + +It's much simpler to use only a single buffer; when fill_input_buffer() is +called, move any unconsumed data (beyond the current pointer/count) down to +the beginning of this buffer and then load new data into the remaining buffer +space. This approach requires a little more data copying but is far easier +to get right. + + +Progressive JPEG support +------------------------ + +Progressive JPEG rearranges the stored data into a series of scans of +increasing quality. In situations where a JPEG file is transmitted across a +slow communications link, a decoder can generate a low-quality image very +quickly from the first scan, then gradually improve the displayed quality as +more scans are received. The final image after all scans are complete is +identical to that of a regular (sequential) JPEG file of the same quality +setting. Progressive JPEG files are often slightly smaller than equivalent +sequential JPEG files, but the possibility of incremental display is the main +reason for using progressive JPEG. + +The IJG encoder library generates progressive JPEG files when given a +suitable "scan script" defining how to divide the data into scans. +Creation of progressive JPEG files is otherwise transparent to the encoder. +Progressive JPEG files can also be read transparently by the decoder library. +If the decoding application simply uses the library as defined above, it +will receive a final decoded image without any indication that the file was +progressive. Of course, this approach does not allow incremental display. +To perform incremental display, an application needs to use the decoder +library's "buffered-image" mode, in which it receives a decoded image +multiple times. + +Each displayed scan requires about as much work to decode as a full JPEG +image of the same size, so the decoder must be fairly fast in relation to the +data transmission rate in order to make incremental display useful. However, +it is possible to skip displaying the image and simply add the incoming bits +to the decoder's coefficient buffer. This is fast because only Huffman +decoding need be done, not IDCT, upsampling, colorspace conversion, etc. +The IJG decoder library allows the application to switch dynamically between +displaying the image and simply absorbing the incoming bits. A properly +coded application can automatically adapt the number of display passes to +suit the time available as the image is received. Also, a final +higher-quality display cycle can be performed from the buffered data after +the end of the file is reached. + +Progressive compression: + +To create a progressive JPEG file (or a multiple-scan sequential JPEG file), +set the scan_info cinfo field to point to an array of scan descriptors, and +perform compression as usual. Instead of constructing your own scan list, +you can call the jpeg_simple_progression() helper routine to create a +recommended progression sequence; this method should be used by all +applications that don't want to get involved in the nitty-gritty of +progressive scan sequence design. (If you want to provide user control of +scan sequences, you may wish to borrow the scan script reading code found +in rdswitch.c, so that you can read scan script files just like cjpeg's.) +When scan_info is not NULL, the compression library will store DCT'd data +into a buffer array as jpeg_write_scanlines() is called, and will emit all +the requested scans during jpeg_finish_compress(). This implies that +multiple-scan output cannot be created with a suspending data destination +manager, since jpeg_finish_compress() does not support suspension. We +should also note that the compressor currently forces Huffman optimization +mode when creating a progressive JPEG file, because the default Huffman +tables are unsuitable for progressive files. + +Progressive decompression: + +When buffered-image mode is not used, the decoder library will read all of +a multi-scan file during jpeg_start_decompress(), so that it can provide a +final decoded image. (Here "multi-scan" means either progressive or +multi-scan sequential.) This makes multi-scan files transparent to the +decoding application. However, existing applications that used suspending +input with version 5 of the IJG library will need to be modified to check +for a suspension return from jpeg_start_decompress(). + +To perform incremental display, an application must use the library's +buffered-image mode. This is described in the next section. + + +Buffered-image mode +------------------- + +In buffered-image mode, the library stores the partially decoded image in a +coefficient buffer, from which it can be read out as many times as desired. +This mode is typically used for incremental display of progressive JPEG files, +but it can be used with any JPEG file. Each scan of a progressive JPEG file +adds more data (more detail) to the buffered image. The application can +display in lockstep with the source file (one display pass per input scan), +or it can allow input processing to outrun display processing. By making +input and display processing run independently, it is possible for the +application to adapt progressive display to a wide range of data transmission +rates. + +The basic control flow for buffered-image decoding is + + jpeg_create_decompress() + set data source + jpeg_read_header() + set overall decompression parameters + cinfo.buffered_image = TRUE; /* select buffered-image mode */ + jpeg_start_decompress() + for (each output pass) { + adjust output decompression parameters if required + jpeg_start_output() /* start a new output pass */ + for (all scanlines in image) { + jpeg_read_scanlines() + display scanlines + } + jpeg_finish_output() /* terminate output pass */ + } + jpeg_finish_decompress() + jpeg_destroy_decompress() + +This differs from ordinary unbuffered decoding in that there is an additional +level of looping. The application can choose how many output passes to make +and how to display each pass. + +The simplest approach to displaying progressive images is to do one display +pass for each scan appearing in the input file. In this case the outer loop +condition is typically + while (! jpeg_input_complete(&cinfo)) +and the start-output call should read + jpeg_start_output(&cinfo, cinfo.input_scan_number); +The second parameter to jpeg_start_output() indicates which scan of the input +file is to be displayed; the scans are numbered starting at 1 for this +purpose. (You can use a loop counter starting at 1 if you like, but using +the library's input scan counter is easier.) The library automatically reads +data as necessary to complete each requested scan, and jpeg_finish_output() +advances to the next scan or end-of-image marker (hence input_scan_number +will be incremented by the time control arrives back at jpeg_start_output()). +With this technique, data is read from the input file only as needed, and +input and output processing run in lockstep. + +After reading the final scan and reaching the end of the input file, the +buffered image remains available; it can be read additional times by +repeating the jpeg_start_output()/jpeg_read_scanlines()/jpeg_finish_output() +sequence. For example, a useful technique is to use fast one-pass color +quantization for display passes made while the image is arriving, followed by +a final display pass using two-pass quantization for highest quality. This +is done by changing the library parameters before the final output pass. +Changing parameters between passes is discussed in detail below. + +In general the last scan of a progressive file cannot be recognized as such +until after it is read, so a post-input display pass is the best approach if +you want special processing in the final pass. + +When done with the image, be sure to call jpeg_finish_decompress() to release +the buffered image (or just use jpeg_destroy_decompress()). + +If input data arrives faster than it can be displayed, the application can +cause the library to decode input data in advance of what's needed to produce +output. This is done by calling the routine jpeg_consume_input(). +The return value is one of the following: + JPEG_REACHED_SOS: reached an SOS marker (the start of a new scan) + JPEG_REACHED_EOI: reached the EOI marker (end of image) + JPEG_ROW_COMPLETED: completed reading one MCU row of compressed data + JPEG_SCAN_COMPLETED: completed reading last MCU row of current scan + JPEG_SUSPENDED: suspended before completing any of the above +(JPEG_SUSPENDED can occur only if a suspending data source is used.) This +routine can be called at any time after initializing the JPEG object. It +reads some additional data and returns when one of the indicated significant +events occurs. (If called after the EOI marker is reached, it will +immediately return JPEG_REACHED_EOI without attempting to read more data.) + +The library's output processing will automatically call jpeg_consume_input() +whenever the output processing overtakes the input; thus, simple lockstep +display requires no direct calls to jpeg_consume_input(). But by adding +calls to jpeg_consume_input(), you can absorb data in advance of what is +being displayed. This has two benefits: + * You can limit buildup of unprocessed data in your input buffer. + * You can eliminate extra display passes by paying attention to the + state of the library's input processing. + +The first of these benefits only requires interspersing calls to +jpeg_consume_input() with your display operations and any other processing +you may be doing. To avoid wasting cycles due to backtracking, it's best to +call jpeg_consume_input() only after a hundred or so new bytes have arrived. +This is discussed further under "I/O suspension", above. (Note: the JPEG +library currently is not thread-safe. You must not call jpeg_consume_input() +from one thread of control if a different library routine is working on the +same JPEG object in another thread.) + +When input arrives fast enough that more than one new scan is available +before you start a new output pass, you may as well skip the output pass +corresponding to the completed scan. This occurs for free if you pass +cinfo.input_scan_number as the target scan number to jpeg_start_output(). +The input_scan_number field is simply the index of the scan currently being +consumed by the input processor. You can ensure that this is up-to-date by +emptying the input buffer just before calling jpeg_start_output(): call +jpeg_consume_input() repeatedly until it returns JPEG_SUSPENDED or +JPEG_REACHED_EOI. + +The target scan number passed to jpeg_start_output() is saved in the +cinfo.output_scan_number field. The library's output processing calls +jpeg_consume_input() whenever the current input scan number and row within +that scan is less than or equal to the current output scan number and row. +Thus, input processing can "get ahead" of the output processing but is not +allowed to "fall behind". You can achieve several different effects by +manipulating this interlock rule. For example, if you pass a target scan +number greater than the current input scan number, the output processor will +wait until that scan starts to arrive before producing any output. (To avoid +an infinite loop, the target scan number is automatically reset to the last +scan number when the end of image is reached. Thus, if you specify a large +target scan number, the library will just absorb the entire input file and +then perform an output pass. This is effectively the same as what +jpeg_start_decompress() does when you don't select buffered-image mode.) +When you pass a target scan number equal to the current input scan number, +the image is displayed no faster than the current input scan arrives. The +final possibility is to pass a target scan number less than the current input +scan number; this disables the input/output interlock and causes the output +processor to simply display whatever it finds in the image buffer, without +waiting for input. (However, the library will not accept a target scan +number less than one, so you can't avoid waiting for the first scan.) + +When data is arriving faster than the output display processing can advance +through the image, jpeg_consume_input() will store data into the buffered +image beyond the point at which the output processing is reading data out +again. If the input arrives fast enough, it may "wrap around" the buffer to +the point where the input is more than one whole scan ahead of the output. +If the output processing simply proceeds through its display pass without +paying attention to the input, the effect seen on-screen is that the lower +part of the image is one or more scans better in quality than the upper part. +Then, when the next output scan is started, you have a choice of what target +scan number to use. The recommended choice is to use the current input scan +number at that time, which implies that you've skipped the output scans +corresponding to the input scans that were completed while you processed the +previous output scan. In this way, the decoder automatically adapts its +speed to the arriving data, by skipping output scans as necessary to keep up +with the arriving data. + +When using this strategy, you'll want to be sure that you perform a final +output pass after receiving all the data; otherwise your last display may not +be full quality across the whole screen. So the right outer loop logic is +something like this: + do { + absorb any waiting input by calling jpeg_consume_input() + final_pass = jpeg_input_complete(&cinfo); + adjust output decompression parameters if required + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + } while (! final_pass); +rather than quitting as soon as jpeg_input_complete() returns TRUE. This +arrangement makes it simple to use higher-quality decoding parameters +for the final pass. But if you don't want to use special parameters for +the final pass, the right loop logic is like this: + for (;;) { + absorb any waiting input by calling jpeg_consume_input() + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + if (jpeg_input_complete(&cinfo) && + cinfo.input_scan_number == cinfo.output_scan_number) + break; + } +In this case you don't need to know in advance whether an output pass is to +be the last one, so it's not necessary to have reached EOF before starting +the final output pass; rather, what you want to test is whether the output +pass was performed in sync with the final input scan. This form of the loop +will avoid an extra output pass whenever the decoder is able (or nearly able) +to keep up with the incoming data. + +When the data transmission speed is high, you might begin a display pass, +then find that much or all of the file has arrived before you can complete +the pass. (You can detect this by noting the JPEG_REACHED_EOI return code +from jpeg_consume_input(), or equivalently by testing jpeg_input_complete().) +In this situation you may wish to abort the current display pass and start a +new one using the newly arrived information. To do so, just call +jpeg_finish_output() and then start a new pass with jpeg_start_output(). + +A variant strategy is to abort and restart display if more than one complete +scan arrives during an output pass; this can be detected by noting +JPEG_REACHED_SOS returns and/or examining cinfo.input_scan_number. This +idea should be employed with caution, however, since the display process +might never get to the bottom of the image before being aborted, resulting +in the lower part of the screen being several passes worse than the upper. +In most cases it's probably best to abort an output pass only if the whole +file has arrived and you want to begin the final output pass immediately. + +When receiving data across a communication link, we recommend always using +the current input scan number for the output target scan number; if a +higher-quality final pass is to be done, it should be started (aborting any +incomplete output pass) as soon as the end of file is received. However, +many other strategies are possible. For example, the application can examine +the parameters of the current input scan and decide whether to display it or +not. If the scan contains only chroma data, one might choose not to use it +as the target scan, expecting that the scan will be small and will arrive +quickly. To skip to the next scan, call jpeg_consume_input() until it +returns JPEG_REACHED_SOS or JPEG_REACHED_EOI. Or just use the next higher +number as the target scan for jpeg_start_output(); but that method doesn't +let you inspect the next scan's parameters before deciding to display it. + + +In buffered-image mode, jpeg_start_decompress() never performs input and +thus never suspends. An application that uses input suspension with +buffered-image mode must be prepared for suspension returns from these +routines: +* jpeg_start_output() performs input only if you request 2-pass quantization + and the target scan isn't fully read yet. (This is discussed below.) +* jpeg_read_scanlines(), as always, returns the number of scanlines that it + was able to produce before suspending. +* jpeg_finish_output() will read any markers following the target scan, + up to the end of the file or the SOS marker that begins another scan. + (But it reads no input if jpeg_consume_input() has already reached the + end of the file or a SOS marker beyond the target output scan.) +* jpeg_finish_decompress() will read until the end of file, and thus can + suspend if the end hasn't already been reached (as can be tested by + calling jpeg_input_complete()). +jpeg_start_output(), jpeg_finish_output(), and jpeg_finish_decompress() +all return TRUE if they completed their tasks, FALSE if they had to suspend. +In the event of a FALSE return, the application must load more input data +and repeat the call. Applications that use non-suspending data sources need +not check the return values of these three routines. + + +It is possible to change decoding parameters between output passes in the +buffered-image mode. The decoder library currently supports only very +limited changes of parameters. ONLY THE FOLLOWING parameter changes are +allowed after jpeg_start_decompress() is called: +* dct_method can be changed before each call to jpeg_start_output(). + For example, one could use a fast DCT method for early scans, changing + to a higher quality method for the final scan. +* dither_mode can be changed before each call to jpeg_start_output(); + of course this has no impact if not using color quantization. Typically + one would use ordered dither for initial passes, then switch to + Floyd-Steinberg dither for the final pass. Caution: changing dither mode + can cause more memory to be allocated by the library. Although the amount + of memory involved is not large (a scanline or so), it may cause the + initial max_memory_to_use specification to be exceeded, which in the worst + case would result in an out-of-memory failure. +* do_block_smoothing can be changed before each call to jpeg_start_output(). + This setting is relevant only when decoding a progressive JPEG image. + During the first DC-only scan, block smoothing provides a very "fuzzy" look + instead of the very "blocky" look seen without it; which is better seems a + matter of personal taste. But block smoothing is nearly always a win + during later stages, especially when decoding a successive-approximation + image: smoothing helps to hide the slight blockiness that otherwise shows + up on smooth gradients until the lowest coefficient bits are sent. +* Color quantization mode can be changed under the rules described below. + You *cannot* change between full-color and quantized output (because that + would alter the required I/O buffer sizes), but you can change which + quantization method is used. + +When generating color-quantized output, changing quantization method is a +very useful way of switching between high-speed and high-quality display. +The library allows you to change among its three quantization methods: +1. Single-pass quantization to a fixed color cube. + Selected by cinfo.two_pass_quantize = FALSE and cinfo.colormap = NULL. +2. Single-pass quantization to an application-supplied colormap. + Selected by setting cinfo.colormap to point to the colormap (the value of + two_pass_quantize is ignored); also set cinfo.actual_number_of_colors. +3. Two-pass quantization to a colormap chosen specifically for the image. + Selected by cinfo.two_pass_quantize = TRUE and cinfo.colormap = NULL. + (This is the default setting selected by jpeg_read_header, but it is + probably NOT what you want for the first pass of progressive display!) +These methods offer successively better quality and lesser speed. However, +only the first method is available for quantizing in non-RGB color spaces. + +IMPORTANT: because the different quantizer methods have very different +working-storage requirements, the library requires you to indicate which +one(s) you intend to use before you call jpeg_start_decompress(). (If we did +not require this, the max_memory_to_use setting would be a complete fiction.) +You do this by setting one or more of these three cinfo fields to TRUE: + enable_1pass_quant Fixed color cube colormap + enable_external_quant Externally-supplied colormap + enable_2pass_quant Two-pass custom colormap +All three are initialized FALSE by jpeg_read_header(). But +jpeg_start_decompress() automatically sets TRUE the one selected by the +current two_pass_quantize and colormap settings, so you only need to set the +enable flags for any other quantization methods you plan to change to later. + +After setting the enable flags correctly at jpeg_start_decompress() time, you +can change to any enabled quantization method by setting two_pass_quantize +and colormap properly just before calling jpeg_start_output(). The following +special rules apply: +1. You must explicitly set cinfo.colormap to NULL when switching to 1-pass + or 2-pass mode from a different mode, or when you want the 2-pass + quantizer to be re-run to generate a new colormap. +2. To switch to an external colormap, or to change to a different external + colormap than was used on the prior pass, you must call + jpeg_new_colormap() after setting cinfo.colormap. +NOTE: if you want to use the same colormap as was used in the prior pass, +you should not do either of these things. This will save some nontrivial +switchover costs. +(These requirements exist because cinfo.colormap will always be non-NULL +after completing a prior output pass, since both the 1-pass and 2-pass +quantizers set it to point to their output colormaps. Thus you have to +do one of these two things to notify the library that something has changed. +Yup, it's a bit klugy, but it's necessary to do it this way for backwards +compatibility.) + +Note that in buffered-image mode, the library generates any requested colormap +during jpeg_start_output(), not during jpeg_start_decompress(). + +When using two-pass quantization, jpeg_start_output() makes a pass over the +buffered image to determine the optimum color map; it therefore may take a +significant amount of time, whereas ordinarily it does little work. The +progress monitor hook is called during this pass, if defined. It is also +important to realize that if the specified target scan number is greater than +or equal to the current input scan number, jpeg_start_output() will attempt +to consume input as it makes this pass. If you use a suspending data source, +you need to check for a FALSE return from jpeg_start_output() under these +conditions. The combination of 2-pass quantization and a not-yet-fully-read +target scan is the only case in which jpeg_start_output() will consume input. + + +Application authors who support buffered-image mode may be tempted to use it +for all JPEG images, even single-scan ones. This will work, but it is +inefficient: there is no need to create an image-sized coefficient buffer for +single-scan images. Requesting buffered-image mode for such an image wastes +memory. Worse, it can cost time on large images, since the buffered data has +to be swapped out or written to a temporary file. If you are concerned about +maximum performance on baseline JPEG files, you should use buffered-image +mode only when the incoming file actually has multiple scans. This can be +tested by calling jpeg_has_multiple_scans(), which will return a correct +result at any time after jpeg_read_header() completes. + +It is also worth noting that when you use jpeg_consume_input() to let input +processing get ahead of output processing, the resulting pattern of access to +the coefficient buffer is quite nonsequential. It's best to use the memory +manager jmemnobs.c if you can (ie, if you have enough real or virtual main +memory). If not, at least make sure that max_memory_to_use is set as high as +possible. If the JPEG memory manager has to use a temporary file, you will +probably see a lot of disk traffic and poor performance. (This could be +improved with additional work on the memory manager, but we haven't gotten +around to it yet.) + +In some applications it may be convenient to use jpeg_consume_input() for all +input processing, including reading the initial markers; that is, you may +wish to call jpeg_consume_input() instead of jpeg_read_header() during +startup. This works, but note that you must check for JPEG_REACHED_SOS and +JPEG_REACHED_EOI return codes as the equivalent of jpeg_read_header's codes. +Once the first SOS marker has been reached, you must call +jpeg_start_decompress() before jpeg_consume_input() will consume more input; +it'll just keep returning JPEG_REACHED_SOS until you do. If you read a +tables-only file this way, jpeg_consume_input() will return JPEG_REACHED_EOI +without ever returning JPEG_REACHED_SOS; be sure to check for this case. +If this happens, the decompressor will not read any more input until you call +jpeg_abort() to reset it. It is OK to call jpeg_consume_input() even when not +using buffered-image mode, but in that case it's basically a no-op after the +initial markers have been read: it will just return JPEG_SUSPENDED. + + +Abbreviated datastreams and multiple images +------------------------------------------- + +A JPEG compression or decompression object can be reused to process multiple +images. This saves a small amount of time per image by eliminating the +"create" and "destroy" operations, but that isn't the real purpose of the +feature. Rather, reuse of an object provides support for abbreviated JPEG +datastreams. Object reuse can also simplify processing a series of images in +a single input or output file. This section explains these features. + +A JPEG file normally contains several hundred bytes worth of quantization +and Huffman tables. In a situation where many images will be stored or +transmitted with identical tables, this may represent an annoying overhead. +The JPEG standard therefore permits tables to be omitted. The standard +defines three classes of JPEG datastreams: + * "Interchange" datastreams contain an image and all tables needed to decode + the image. These are the usual kind of JPEG file. + * "Abbreviated image" datastreams contain an image, but are missing some or + all of the tables needed to decode that image. + * "Abbreviated table specification" (henceforth "tables-only") datastreams + contain only table specifications. +To decode an abbreviated image, it is necessary to load the missing table(s) +into the decoder beforehand. This can be accomplished by reading a separate +tables-only file. A variant scheme uses a series of images in which the first +image is an interchange (complete) datastream, while subsequent ones are +abbreviated and rely on the tables loaded by the first image. It is assumed +that once the decoder has read a table, it will remember that table until a +new definition for the same table number is encountered. + +It is the application designer's responsibility to figure out how to associate +the correct tables with an abbreviated image. While abbreviated datastreams +can be useful in a closed environment, their use is strongly discouraged in +any situation where data exchange with other applications might be needed. +Caveat designer. + +The JPEG library provides support for reading and writing any combination of +tables-only datastreams and abbreviated images. In both compression and +decompression objects, a quantization or Huffman table will be retained for +the lifetime of the object, unless it is overwritten by a new table definition. + + +To create abbreviated image datastreams, it is only necessary to tell the +compressor not to emit some or all of the tables it is using. Each +quantization and Huffman table struct contains a boolean field "sent_table", +which normally is initialized to FALSE. For each table used by the image, the +header-writing process emits the table and sets sent_table = TRUE unless it is +already TRUE. (In normal usage, this prevents outputting the same table +definition multiple times, as would otherwise occur because the chroma +components typically share tables.) Thus, setting this field to TRUE before +calling jpeg_start_compress() will prevent the table from being written at +all. + +If you want to create a "pure" abbreviated image file containing no tables, +just call "jpeg_suppress_tables(&cinfo, TRUE)" after constructing all the +tables. If you want to emit some but not all tables, you'll need to set the +individual sent_table fields directly. + +To create an abbreviated image, you must also call jpeg_start_compress() +with a second parameter of FALSE, not TRUE. Otherwise jpeg_start_compress() +will force all the sent_table fields to FALSE. (This is a safety feature to +prevent abbreviated images from being created accidentally.) + +To create a tables-only file, perform the same parameter setup that you +normally would, but instead of calling jpeg_start_compress() and so on, call +jpeg_write_tables(&cinfo). This will write an abbreviated datastream +containing only SOI, DQT and/or DHT markers, and EOI. All the quantization +and Huffman tables that are currently defined in the compression object will +be emitted unless their sent_tables flag is already TRUE, and then all the +sent_tables flags will be set TRUE. + +A sure-fire way to create matching tables-only and abbreviated image files +is to proceed as follows: + + create JPEG compression object + set JPEG parameters + set destination to tables-only file + jpeg_write_tables(&cinfo); + set destination to image file + jpeg_start_compress(&cinfo, FALSE); + write data... + jpeg_finish_compress(&cinfo); + +Since the JPEG parameters are not altered between writing the table file and +the abbreviated image file, the same tables are sure to be used. Of course, +you can repeat the jpeg_start_compress() ... jpeg_finish_compress() sequence +many times to produce many abbreviated image files matching the table file. + +You cannot suppress output of the computed Huffman tables when Huffman +optimization is selected. (If you could, there'd be no way to decode the +image...) Generally, you don't want to set optimize_coding = TRUE when +you are trying to produce abbreviated files. + +In some cases you might want to compress an image using tables which are +not stored in the application, but are defined in an interchange or +tables-only file readable by the application. This can be done by setting up +a JPEG decompression object to read the specification file, then copying the +tables into your compression object. See jpeg_copy_critical_parameters() +for an example of copying quantization tables. + + +To read abbreviated image files, you simply need to load the proper tables +into the decompression object before trying to read the abbreviated image. +If the proper tables are stored in the application program, you can just +allocate the table structs and fill in their contents directly. For example, +to load a fixed quantization table into table slot "n": + + if (cinfo.quant_tbl_ptrs[n] == NULL) + cinfo.quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) &cinfo); + quant_ptr = cinfo.quant_tbl_ptrs[n]; /* quant_ptr is JQUANT_TBL* */ + for (i = 0; i < 64; i++) { + /* Qtable[] is desired quantization table, in natural array order */ + quant_ptr->quantval[i] = Qtable[i]; + } + +Code to load a fixed Huffman table is typically (for AC table "n"): + + if (cinfo.ac_huff_tbl_ptrs[n] == NULL) + cinfo.ac_huff_tbl_ptrs[n] = jpeg_alloc_huff_table((j_common_ptr) &cinfo); + huff_ptr = cinfo.ac_huff_tbl_ptrs[n]; /* huff_ptr is JHUFF_TBL* */ + for (i = 1; i <= 16; i++) { + /* counts[i] is number of Huffman codes of length i bits, i=1..16 */ + huff_ptr->bits[i] = counts[i]; + } + for (i = 0; i < 256; i++) { + /* symbols[] is the list of Huffman symbols, in code-length order */ + huff_ptr->huffval[i] = symbols[i]; + } + +(Note that trying to set cinfo.quant_tbl_ptrs[n] to point directly at a +constant JQUANT_TBL object is not safe. If the incoming file happened to +contain a quantization table definition, your master table would get +overwritten! Instead allocate a working table copy and copy the master table +into it, as illustrated above. Ditto for Huffman tables, of course.) + +You might want to read the tables from a tables-only file, rather than +hard-wiring them into your application. The jpeg_read_header() call is +sufficient to read a tables-only file. You must pass a second parameter of +FALSE to indicate that you do not require an image to be present. Thus, the +typical scenario is + + create JPEG decompression object + set source to tables-only file + jpeg_read_header(&cinfo, FALSE); + set source to abbreviated image file + jpeg_read_header(&cinfo, TRUE); + set decompression parameters + jpeg_start_decompress(&cinfo); + read data... + jpeg_finish_decompress(&cinfo); + +In some cases, you may want to read a file without knowing whether it contains +an image or just tables. In that case, pass FALSE and check the return value +from jpeg_read_header(): it will be JPEG_HEADER_OK if an image was found, +JPEG_HEADER_TABLES_ONLY if only tables were found. (A third return value, +JPEG_SUSPENDED, is possible when using a suspending data source manager.) +Note that jpeg_read_header() will not complain if you read an abbreviated +image for which you haven't loaded the missing tables; the missing-table check +occurs later, in jpeg_start_decompress(). + + +It is possible to read a series of images from a single source file by +repeating the jpeg_read_header() ... jpeg_finish_decompress() sequence, +without releasing/recreating the JPEG object or the data source module. +(If you did reinitialize, any partial bufferload left in the data source +buffer at the end of one image would be discarded, causing you to lose the +start of the next image.) When you use this method, stored tables are +automatically carried forward, so some of the images can be abbreviated images +that depend on tables from earlier images. + +If you intend to write a series of images into a single destination file, +you might want to make a specialized data destination module that doesn't +flush the output buffer at term_destination() time. This would speed things +up by some trifling amount. Of course, you'd need to remember to flush the +buffer after the last image. You can make the later images be abbreviated +ones by passing FALSE to jpeg_start_compress(). + + +Special markers +--------------- + +Some applications may need to insert or extract special data in the JPEG +datastream. The JPEG standard provides marker types "COM" (comment) and +"APP0" through "APP15" (application) to hold application-specific data. +Unfortunately, the use of these markers is not specified by the standard. +COM markers are fairly widely used to hold user-supplied text. The JFIF file +format spec uses APP0 markers with specified initial strings to hold certain +data. Adobe applications use APP14 markers beginning with the string "Adobe" +for miscellaneous data. Other APPn markers are rarely seen, but might +contain almost anything. + +If you wish to store user-supplied text, we recommend you use COM markers +and place readable 7-bit ASCII text in them. Newline conventions are not +standardized --- expect to find LF (Unix style), CR/LF (DOS style), or CR +(Mac style). A robust COM reader should be able to cope with random binary +garbage, including nulls, since some applications generate COM markers +containing non-ASCII junk. (But yours should not be one of them.) + +For program-supplied data, use an APPn marker, and be sure to begin it with an +identifying string so that you can tell whether the marker is actually yours. +It's probably best to avoid using APP0 or APP14 for any private markers. +(NOTE: the upcoming SPIFF standard will use APP8 markers; we recommend you +not use APP8 markers for any private purposes, either.) + +Keep in mind that at most 65533 bytes can be put into one marker, but you +can have as many markers as you like. + +By default, the IJG compression library will write a JFIF APP0 marker if the +selected JPEG colorspace is grayscale or YCbCr, or an Adobe APP14 marker if +the selected colorspace is RGB, CMYK, or YCCK. You can disable this, but +we don't recommend it. The decompression library will recognize JFIF and +Adobe markers and will set the JPEG colorspace properly when one is found. + + +You can write special markers immediately following the datastream header by +calling jpeg_write_marker() after jpeg_start_compress() and before the first +call to jpeg_write_scanlines(). When you do this, the markers appear after +the SOI and the JFIF APP0 and Adobe APP14 markers (if written), but before +all else. Specify the marker type parameter as "JPEG_COM" for COM or +"JPEG_APP0 + n" for APPn. (Actually, jpeg_write_marker will let you write +any marker type, but we don't recommend writing any other kinds of marker.) +For example, to write a user comment string pointed to by comment_text: + jpeg_write_marker(cinfo, JPEG_COM, comment_text, strlen(comment_text)); + +If it's not convenient to store all the marker data in memory at once, +you can instead call jpeg_write_m_header() followed by multiple calls to +jpeg_write_m_byte(). If you do it this way, it's your responsibility to +call jpeg_write_m_byte() exactly the number of times given in the length +parameter to jpeg_write_m_header(). (This method lets you empty the +output buffer partway through a marker, which might be important when +using a suspending data destination module. In any case, if you are using +a suspending destination, you should flush its buffer after inserting +any special markers. See "I/O suspension".) + +Or, if you prefer to synthesize the marker byte sequence yourself, +you can just cram it straight into the data destination module. + +If you are writing JFIF 1.02 extension markers (thumbnail images), don't +forget to set cinfo.JFIF_minor_version = 2 so that the encoder will write the +correct JFIF version number in the JFIF header marker. The library's default +is to write version 1.01, but that's wrong if you insert any 1.02 extension +markers. (We could probably get away with just defaulting to 1.02, but there +used to be broken decoders that would complain about unknown minor version +numbers. To reduce compatibility risks it's safest not to write 1.02 unless +you are actually using 1.02 extensions.) + + +When reading, two methods of handling special markers are available: +1. You can ask the library to save the contents of COM and/or APPn markers +into memory, and then examine them at your leisure afterwards. +2. You can supply your own routine to process COM and/or APPn markers +on-the-fly as they are read. +The first method is simpler to use, especially if you are using a suspending +data source; writing a marker processor that copes with input suspension is +not easy (consider what happens if the marker is longer than your available +input buffer). However, the second method conserves memory since the marker +data need not be kept around after it's been processed. + +For either method, you'd normally set up marker handling after creating a +decompression object and before calling jpeg_read_header(), because the +markers of interest will typically be near the head of the file and so will +be scanned by jpeg_read_header. Once you've established a marker handling +method, it will be used for the life of that decompression object +(potentially many datastreams), unless you change it. Marker handling is +determined separately for COM markers and for each APPn marker code. + + +To save the contents of special markers in memory, call + jpeg_save_markers(cinfo, marker_code, length_limit) +where marker_code is the marker type to save, JPEG_COM or JPEG_APP0+n. +(To arrange to save all the special marker types, you need to call this +routine 17 times, for COM and APP0-APP15.) If the incoming marker is longer +than length_limit data bytes, only length_limit bytes will be saved; this +parameter allows you to avoid chewing up memory when you only need to see the +first few bytes of a potentially large marker. If you want to save all the +data, set length_limit to 0xFFFF; that is enough since marker lengths are only +16 bits. As a special case, setting length_limit to 0 prevents that marker +type from being saved at all. (That is the default behavior, in fact.) + +After jpeg_read_header() completes, you can examine the special markers by +following the cinfo->marker_list pointer chain. All the special markers in +the file appear in this list, in order of their occurrence in the file (but +omitting any markers of types you didn't ask for). Both the original data +length and the saved data length are recorded for each list entry; the latter +will not exceed length_limit for the particular marker type. Note that these +lengths exclude the marker length word, whereas the stored representation +within the JPEG file includes it. (Hence the maximum data length is really +only 65533.) + +It is possible that additional special markers appear in the file beyond the +SOS marker at which jpeg_read_header stops; if so, the marker list will be +extended during reading of the rest of the file. This is not expected to be +common, however. If you are short on memory you may want to reset the length +limit to zero for all marker types after finishing jpeg_read_header, to +ensure that the max_memory_to_use setting cannot be exceeded due to addition +of later markers. + +The marker list remains stored until you call jpeg_finish_decompress or +jpeg_abort, at which point the memory is freed and the list is set to empty. +(jpeg_destroy also releases the storage, of course.) + +Note that the library is internally interested in APP0 and APP14 markers; +if you try to set a small nonzero length limit on these types, the library +will silently force the length up to the minimum it wants. (But you can set +a zero length limit to prevent them from being saved at all.) Also, in a +16-bit environment, the maximum length limit may be constrained to less than +65533 by malloc() limitations. It is therefore best not to assume that the +effective length limit is exactly what you set it to be. + + +If you want to supply your own marker-reading routine, you do it by calling +jpeg_set_marker_processor(). A marker processor routine must have the +signature + boolean jpeg_marker_parser_method (j_decompress_ptr cinfo) +Although the marker code is not explicitly passed, the routine can find it +in cinfo->unread_marker. At the time of call, the marker proper has been +read from the data source module. The processor routine is responsible for +reading the marker length word and the remaining parameter bytes, if any. +Return TRUE to indicate success. (FALSE should be returned only if you are +using a suspending data source and it tells you to suspend. See the standard +marker processors in jdmarker.c for appropriate coding methods if you need to +use a suspending data source.) + +If you override the default APP0 or APP14 processors, it is up to you to +recognize JFIF and Adobe markers if you want colorspace recognition to occur +properly. We recommend copying and extending the default processors if you +want to do that. (A better idea is to save these marker types for later +examination by calling jpeg_save_markers(); that method doesn't interfere +with the library's own processing of these markers.) + +jpeg_set_marker_processor() and jpeg_save_markers() are mutually exclusive +--- if you call one it overrides any previous call to the other, for the +particular marker type specified. + +A simple example of an external COM processor can be found in djpeg.c. +Also, see jpegtran.c for an example of using jpeg_save_markers. + + +Raw (downsampled) image data +---------------------------- + +Some applications need to supply already-downsampled image data to the JPEG +compressor, or to receive raw downsampled data from the decompressor. The +library supports this requirement by allowing the application to write or +read raw data, bypassing the normal preprocessing or postprocessing steps. +The interface is different from the standard one and is somewhat harder to +use. If your interest is merely in bypassing color conversion, we recommend +that you use the standard interface and simply set jpeg_color_space = +in_color_space (or jpeg_color_space = out_color_space for decompression). +The mechanism described in this section is necessary only to supply or +receive downsampled image data, in which not all components have the same +dimensions. + + +To compress raw data, you must supply the data in the colorspace to be used +in the JPEG file (please read the earlier section on Special color spaces) +and downsampled to the sampling factors specified in the JPEG parameters. +You must supply the data in the format used internally by the JPEG library, +namely a JSAMPIMAGE array. This is an array of pointers to two-dimensional +arrays, each of type JSAMPARRAY. Each 2-D array holds the values for one +color component. This structure is necessary since the components are of +different sizes. If the image dimensions are not a multiple of the MCU size, +you must also pad the data correctly (usually, this is done by replicating +the last column and/or row). The data must be padded to a multiple of a DCT +block in each component: that is, each downsampled row must contain a +multiple of 8 valid samples, and there must be a multiple of 8 sample rows +for each component. (For applications such as conversion of digital TV +images, the standard image size is usually a multiple of the DCT block size, +so that no padding need actually be done.) + +The procedure for compression of raw data is basically the same as normal +compression, except that you call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). Before calling jpeg_start_compress(), you must do +the following: + * Set cinfo->raw_data_in to TRUE. (It is set FALSE by jpeg_set_defaults().) + This notifies the library that you will be supplying raw data. + Furthermore, set cinfo->do_fancy_downsampling to FALSE if you want to use + real downsampled data. (It is set TRUE by jpeg_set_defaults().) + * Ensure jpeg_color_space is correct --- an explicit jpeg_set_colorspace() + call is a good idea. Note that since color conversion is bypassed, + in_color_space is ignored, except that jpeg_set_defaults() uses it to + choose the default jpeg_color_space setting. + * Ensure the sampling factors, cinfo->comp_info[i].h_samp_factor and + cinfo->comp_info[i].v_samp_factor, are correct. Since these indicate the + dimensions of the data you are supplying, it's wise to set them + explicitly, rather than assuming the library's defaults are what you want. + +To pass raw data to the library, call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). The two routines work similarly except that +jpeg_write_raw_data takes a JSAMPIMAGE data array rather than JSAMPARRAY. +The scanlines count passed to and returned from jpeg_write_raw_data is +measured in terms of the component with the largest v_samp_factor. + +jpeg_write_raw_data() processes one MCU row per call, which is to say +v_samp_factor*DCTSIZE sample rows of each component. The passed num_lines +value must be at least max_v_samp_factor*DCTSIZE, and the return value will +be exactly that amount (or possibly some multiple of that amount, in future +library versions). This is true even on the last call at the bottom of the +image; don't forget to pad your data as necessary. + +The required dimensions of the supplied data can be computed for each +component as + cinfo->comp_info[i].width_in_blocks*DCTSIZE samples per row + cinfo->comp_info[i].height_in_blocks*DCTSIZE rows in image +after jpeg_start_compress() has initialized those fields. If the valid data +is smaller than this, it must be padded appropriately. For some sampling +factors and image sizes, additional dummy DCT blocks are inserted to make +the image a multiple of the MCU dimensions. The library creates such dummy +blocks itself; it does not read them from your supplied data. Therefore you +need never pad by more than DCTSIZE samples. An example may help here. +Assume 2h2v downsampling of YCbCr data, that is + cinfo->comp_info[0].h_samp_factor = 2 for Y + cinfo->comp_info[0].v_samp_factor = 2 + cinfo->comp_info[1].h_samp_factor = 1 for Cb + cinfo->comp_info[1].v_samp_factor = 1 + cinfo->comp_info[2].h_samp_factor = 1 for Cr + cinfo->comp_info[2].v_samp_factor = 1 +and suppose that the nominal image dimensions (cinfo->image_width and +cinfo->image_height) are 101x101 pixels. Then jpeg_start_compress() will +compute downsampled_width = 101 and width_in_blocks = 13 for Y, +downsampled_width = 51 and width_in_blocks = 7 for Cb and Cr (and the same +for the height fields). You must pad the Y data to at least 13*8 = 104 +columns and rows, the Cb/Cr data to at least 7*8 = 56 columns and rows. The +MCU height is max_v_samp_factor = 2 DCT rows so you must pass at least 16 +scanlines on each call to jpeg_write_raw_data(), which is to say 16 actual +sample rows of Y and 8 each of Cb and Cr. A total of 7 MCU rows are needed, +so you must pass a total of 7*16 = 112 "scanlines". The last DCT block row +of Y data is dummy, so it doesn't matter what you pass for it in the data +arrays, but the scanlines count must total up to 112 so that all of the Cb +and Cr data gets passed. + +Output suspension is supported with raw-data compression: if the data +destination module suspends, jpeg_write_raw_data() will return 0. +In this case the same data rows must be passed again on the next call. + + +Decompression with raw data output implies bypassing all postprocessing. +You must deal with the color space and sampling factors present in the +incoming file. If your application only handles, say, 2h1v YCbCr data, +you must check for and fail on other color spaces or other sampling factors. +The library will not convert to a different color space for you. + +To obtain raw data output, set cinfo->raw_data_out = TRUE before +jpeg_start_decompress() (it is set FALSE by jpeg_read_header()). Be sure to +verify that the color space and sampling factors are ones you can handle. +Furthermore, set cinfo->do_fancy_upsampling = FALSE if you want to get real +downsampled data (it is set TRUE by jpeg_read_header()). +Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The +decompression process is otherwise the same as usual. + +jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a +buffer of at least max_v_samp_factor*DCTSIZE scanlines (scanline counting is +the same as for raw-data compression). The buffer you pass must be large +enough to hold the actual data plus padding to DCT-block boundaries. As with +compression, any entirely dummy DCT blocks are not processed so you need not +allocate space for them, but the total scanline count includes them. The +above example of computing buffer dimensions for raw-data compression is +equally valid for decompression. + +Input suspension is supported with raw-data decompression: if the data source +module suspends, jpeg_read_raw_data() will return 0. You can also use +buffered-image mode to read raw data in multiple passes. + + +Really raw data: DCT coefficients +--------------------------------- + +It is possible to read or write the contents of a JPEG file as raw DCT +coefficients. This facility is mainly intended for use in lossless +transcoding between different JPEG file formats. Other possible applications +include lossless cropping of a JPEG image, lossless reassembly of a +multi-strip or multi-tile TIFF/JPEG file into a single JPEG datastream, etc. + +To read the contents of a JPEG file as DCT coefficients, open the file and do +jpeg_read_header() as usual. But instead of calling jpeg_start_decompress() +and jpeg_read_scanlines(), call jpeg_read_coefficients(). This will read the +entire image into a set of virtual coefficient-block arrays, one array per +component. The return value is a pointer to an array of virtual-array +descriptors. Each virtual array can be accessed directly using the JPEG +memory manager's access_virt_barray method (see Memory management, below, +and also read structure.txt's discussion of virtual array handling). Or, +for simple transcoding to a different JPEG file format, the array list can +just be handed directly to jpeg_write_coefficients(). + +Each block in the block arrays contains quantized coefficient values in +normal array order (not JPEG zigzag order). The block arrays contain only +DCT blocks containing real data; any entirely-dummy blocks added to fill out +interleaved MCUs at the right or bottom edges of the image are discarded +during reading and are not stored in the block arrays. (The size of each +block array can be determined from the width_in_blocks and height_in_blocks +fields of the component's comp_info entry.) This is also the data format +expected by jpeg_write_coefficients(). + +When you are done using the virtual arrays, call jpeg_finish_decompress() +to release the array storage and return the decompression object to an idle +state; or just call jpeg_destroy() if you don't need to reuse the object. + +If you use a suspending data source, jpeg_read_coefficients() will return +NULL if it is forced to suspend; a non-NULL return value indicates successful +completion. You need not test for a NULL return value when using a +non-suspending data source. + +It is also possible to call jpeg_read_coefficients() to obtain access to the +decoder's coefficient arrays during a normal decode cycle in buffered-image +mode. This frammish might be useful for progressively displaying an incoming +image and then re-encoding it without loss. To do this, decode in buffered- +image mode as discussed previously, then call jpeg_read_coefficients() after +the last jpeg_finish_output() call. The arrays will be available for your use +until you call jpeg_finish_decompress(). + + +To write the contents of a JPEG file as DCT coefficients, you must provide +the DCT coefficients stored in virtual block arrays. You can either pass +block arrays read from an input JPEG file by jpeg_read_coefficients(), or +allocate virtual arrays from the JPEG compression object and fill them +yourself. In either case, jpeg_write_coefficients() is substituted for +jpeg_start_compress() and jpeg_write_scanlines(). Thus the sequence is + * Create compression object + * Set all compression parameters as necessary + * Request virtual arrays if needed + * jpeg_write_coefficients() + * jpeg_finish_compress() + * Destroy or re-use compression object +jpeg_write_coefficients() is passed a pointer to an array of virtual block +array descriptors; the number of arrays is equal to cinfo.num_components. + +The virtual arrays need only have been requested, not realized, before +jpeg_write_coefficients() is called. A side-effect of +jpeg_write_coefficients() is to realize any virtual arrays that have been +requested from the compression object's memory manager. Thus, when obtaining +the virtual arrays from the compression object, you should fill the arrays +after calling jpeg_write_coefficients(). The data is actually written out +when you call jpeg_finish_compress(); jpeg_write_coefficients() only writes +the file header. + +When writing raw DCT coefficients, it is crucial that the JPEG quantization +tables and sampling factors match the way the data was encoded, or the +resulting file will be invalid. For transcoding from an existing JPEG file, +we recommend using jpeg_copy_critical_parameters(). This routine initializes +all the compression parameters to default values (like jpeg_set_defaults()), +then copies the critical information from a source decompression object. +The decompression object should have just been used to read the entire +JPEG input file --- that is, it should be awaiting jpeg_finish_decompress(). + +jpeg_write_coefficients() marks all tables stored in the compression object +as needing to be written to the output file (thus, it acts like +jpeg_start_compress(cinfo, TRUE)). This is for safety's sake, to avoid +emitting abbreviated JPEG files by accident. If you really want to emit an +abbreviated JPEG file, call jpeg_suppress_tables(), or set the tables' +individual sent_table flags, between calling jpeg_write_coefficients() and +jpeg_finish_compress(). + + +Progress monitoring +------------------- + +Some applications may need to regain control from the JPEG library every so +often. The typical use of this feature is to produce a percent-done bar or +other progress display. (For a simple example, see cjpeg.c or djpeg.c.) +Although you do get control back frequently during the data-transferring pass +(the jpeg_read_scanlines or jpeg_write_scanlines loop), any additional passes +will occur inside jpeg_finish_compress or jpeg_start_decompress; those +routines may take a long time to execute, and you don't get control back +until they are done. + +You can define a progress-monitor routine which will be called periodically +by the library. No guarantees are made about how often this call will occur, +so we don't recommend you use it for mouse tracking or anything like that. +At present, a call will occur once per MCU row, scanline, or sample row +group, whichever unit is convenient for the current processing mode; so the +wider the image, the longer the time between calls. During the data +transferring pass, only one call occurs per call of jpeg_read_scanlines or +jpeg_write_scanlines, so don't pass a large number of scanlines at once if +you want fine resolution in the progress count. (If you really need to use +the callback mechanism for time-critical tasks like mouse tracking, you could +insert additional calls inside some of the library's inner loops.) + +To establish a progress-monitor callback, create a struct jpeg_progress_mgr, +fill in its progress_monitor field with a pointer to your callback routine, +and set cinfo->progress to point to the struct. The callback will be called +whenever cinfo->progress is non-NULL. (This pointer is set to NULL by +jpeg_create_compress or jpeg_create_decompress; the library will not change +it thereafter. So if you allocate dynamic storage for the progress struct, +make sure it will live as long as the JPEG object does. Allocating from the +JPEG memory manager with lifetime JPOOL_PERMANENT will work nicely.) You +can use the same callback routine for both compression and decompression. + +The jpeg_progress_mgr struct contains four fields which are set by the library: + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +During any one pass, pass_counter increases from 0 up to (not including) +pass_limit; the step size is usually but not necessarily 1. The pass_limit +value may change from one pass to another. The expected total number of +passes is in total_passes, and the number of passes already completed is in +completed_passes. Thus the fraction of work completed may be estimated as + completed_passes + (pass_counter/pass_limit) + -------------------------------------------- + total_passes +ignoring the fact that the passes may not be equal amounts of work. + +When decompressing, pass_limit can even change within a pass, because it +depends on the number of scans in the JPEG file, which isn't always known in +advance. The computed fraction-of-work-done may jump suddenly (if the library +discovers it has overestimated the number of scans) or even decrease (in the +opposite case). It is not wise to put great faith in the work estimate. + +When using the decompressor's buffered-image mode, the progress monitor work +estimate is likely to be completely unhelpful, because the library has no way +to know how many output passes will be demanded of it. Currently, the library +sets total_passes based on the assumption that there will be one more output +pass if the input file end hasn't yet been read (jpeg_input_complete() isn't +TRUE), but no more output passes if the file end has been reached when the +output pass is started. This means that total_passes will rise as additional +output passes are requested. If you have a way of determining the input file +size, estimating progress based on the fraction of the file that's been read +will probably be more useful than using the library's value. + + +Memory management +----------------- + +This section covers some key facts about the JPEG library's built-in memory +manager. For more info, please read structure.txt's section about the memory +manager, and consult the source code if necessary. + +All memory and temporary file allocation within the library is done via the +memory manager. If necessary, you can replace the "back end" of the memory +manager to control allocation yourself (for example, if you don't want the +library to use malloc() and free() for some reason). + +Some data is allocated "permanently" and will not be freed until the JPEG +object is destroyed. Most data is allocated "per image" and is freed by +jpeg_finish_compress, jpeg_finish_decompress, or jpeg_abort. You can call the +memory manager yourself to allocate structures that will automatically be +freed at these times. Typical code for this is + ptr = (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, size); +Use JPOOL_PERMANENT to get storage that lasts as long as the JPEG object. +Use alloc_large instead of alloc_small for anything bigger than a few Kbytes. +There are also alloc_sarray and alloc_barray routines that automatically +build 2-D sample or block arrays. + +The library's minimum space requirements to process an image depend on the +image's width, but not on its height, because the library ordinarily works +with "strip" buffers that are as wide as the image but just a few rows high. +Some operating modes (eg, two-pass color quantization) require full-image +buffers. Such buffers are treated as "virtual arrays": only the current strip +need be in memory, and the rest can be swapped out to a temporary file. + +If you use the simplest memory manager back end (jmemnobs.c), then no +temporary files are used; virtual arrays are simply malloc()'d. Images bigger +than memory can be processed only if your system supports virtual memory. +The other memory manager back ends support temporary files of various flavors +and thus work in machines without virtual memory. They may also be useful on +Unix machines if you need to process images that exceed available swap space. + +When using temporary files, the library will make the in-memory buffers for +its virtual arrays just big enough to stay within a "maximum memory" setting. +Your application can set this limit by setting cinfo->mem->max_memory_to_use +after creating the JPEG object. (Of course, there is still a minimum size for +the buffers, so the max-memory setting is effective only if it is bigger than +the minimum space needed.) If you allocate any large structures yourself, you +must allocate them before jpeg_start_compress() or jpeg_start_decompress() in +order to have them counted against the max memory limit. Also keep in mind +that space allocated with alloc_small() is ignored, on the assumption that +it's too small to be worth worrying about; so a reasonable safety margin +should be left when setting max_memory_to_use. + +If you use the jmemname.c or jmemdos.c memory manager back end, it is +important to clean up the JPEG object properly to ensure that the temporary +files get deleted. (This is especially crucial with jmemdos.c, where the +"temporary files" may be extended-memory segments; if they are not freed, +DOS will require a reboot to recover the memory.) Thus, with these memory +managers, it's a good idea to provide a signal handler that will trap any +early exit from your program. The handler should call either jpeg_abort() +or jpeg_destroy() for any active JPEG objects. A handler is not needed with +jmemnobs.c, and shouldn't be necessary with jmemansi.c or jmemmac.c either, +since the C library is supposed to take care of deleting files made with +tmpfile(). + + +Memory usage +------------ + +Working memory requirements while performing compression or decompression +depend on image dimensions, image characteristics (such as colorspace and +JPEG process), and operating mode (application-selected options). + +As of v6b, the decompressor requires: + 1. About 24K in more-or-less-fixed-size data. This varies a bit depending + on operating mode and image characteristics (particularly color vs. + grayscale), but it doesn't depend on image dimensions. + 2. Strip buffers (of size proportional to the image width) for IDCT and + upsampling results. The worst case for commonly used sampling factors + is about 34 bytes * width in pixels for a color image. A grayscale image + only needs about 8 bytes per pixel column. + 3. A full-image DCT coefficient buffer is needed to decode a multi-scan JPEG + file (including progressive JPEGs), or whenever you select buffered-image + mode. This takes 2 bytes/coefficient. At typical 2x2 sampling, that's + 3 bytes per pixel for a color image. Worst case (1x1 sampling) requires + 6 bytes/pixel. For grayscale, figure 2 bytes/pixel. + 4. To perform 2-pass color quantization, the decompressor also needs a + 128K color lookup table and a full-image pixel buffer (3 bytes/pixel). +This does not count any memory allocated by the application, such as a +buffer to hold the final output image. + +The above figures are valid for 8-bit JPEG data precision and a machine with +32-bit ints. For 12-bit JPEG data, double the size of the strip buffers and +quantization pixel buffer. The "fixed-size" data will be somewhat smaller +with 16-bit ints, larger with 64-bit ints. Also, CMYK or other unusual +color spaces will require different amounts of space. + +The full-image coefficient and pixel buffers, if needed at all, do not +have to be fully RAM resident; you can have the library use temporary +files instead when the total memory usage would exceed a limit you set. +(But if your OS supports virtual memory, it's probably better to just use +jmemnobs and let the OS do the swapping.) + +The compressor's memory requirements are similar, except that it has no need +for color quantization. Also, it needs a full-image DCT coefficient buffer +if Huffman-table optimization is asked for, even if progressive mode is not +requested. + +If you need more detailed information about memory usage in a particular +situation, you can enable the MEM_STATS code in jmemmgr.c. + + +Library compile-time options +---------------------------- + +A number of compile-time options are available by modifying jmorecfg.h. + +The JPEG standard provides for both the baseline 8-bit DCT process and +a 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define +BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be +larger than a char, so it affects the surrounding application's image data. +The sample applications cjpeg and djpeg can support 12-bit mode only for PPM +and GIF file formats; you must disable the other file formats to compile a +12-bit cjpeg or djpeg. (install.txt has more information about that.) +At present, a 12-bit library can handle *only* 12-bit images, not both +precisions. (If you need to include both 8- and 12-bit libraries in a single +application, you could probably do it by defining NEED_SHORT_EXTERNAL_NAMES +for just one of the copies. You'd have to access the 8-bit and 12-bit copies +from separate application source files. This is untested ... if you try it, +we'd like to hear whether it works!) + +Note that a 12-bit library always compresses in Huffman optimization mode, +in order to generate valid Huffman tables. This is necessary because our +default Huffman tables only cover 8-bit data. If you need to output 12-bit +files in one pass, you'll have to supply suitable default Huffman tables. +You may also want to supply your own DCT quantization tables; the existing +quality-scaling code has been developed for 8-bit use, and probably doesn't +generate especially good tables for 12-bit. + +The maximum number of components (color channels) in the image is determined +by MAX_COMPONENTS. The JPEG standard allows up to 255 components, but we +expect that few applications will need more than four or so. + +On machines with unusual data type sizes, you may be able to improve +performance or reduce memory space by tweaking the various typedefs in +jmorecfg.h. In particular, on some RISC CPUs, access to arrays of "short"s +is quite slow; consider trading memory for speed by making JCOEF, INT16, and +UINT16 be "int" or "unsigned int". UINT8 is also a candidate to become int. +You probably don't want to make JSAMPLE be int unless you have lots of memory +to burn. + +You can reduce the size of the library by compiling out various optional +functions. To do this, undefine xxx_SUPPORTED symbols as necessary. + +You can also save a few K by not having text error messages in the library; +the standard error message table occupies about 5Kb. This is particularly +reasonable for embedded applications where there's no good way to display +a message anyway. To do this, remove the creation of the message table +(jpeg_std_message_table[]) from jerror.c, and alter format_message to do +something reasonable without it. You could output the numeric value of the +message code number, for example. If you do this, you can also save a couple +more K by modifying the TRACEMSn() macros in jerror.h to expand to nothing; +you don't need trace capability anyway, right? + + +Portability considerations +-------------------------- + +The JPEG library has been written to be extremely portable; the sample +applications cjpeg and djpeg are slightly less so. This section summarizes +the design goals in this area. (If you encounter any bugs that cause the +library to be less portable than is claimed here, we'd appreciate hearing +about them.) + +The code works fine on ANSI C, C++, and pre-ANSI C compilers, using any of +the popular system include file setups, and some not-so-popular ones too. +See install.txt for configuration procedures. + +The code is not dependent on the exact sizes of the C data types. As +distributed, we make the assumptions that + char is at least 8 bits wide + short is at least 16 bits wide + int is at least 16 bits wide + long is at least 32 bits wide +(These are the minimum requirements of the ANSI C standard.) Wider types will +work fine, although memory may be used inefficiently if char is much larger +than 8 bits or short is much bigger than 16 bits. The code should work +equally well with 16- or 32-bit ints. + +In a system where these assumptions are not met, you may be able to make the +code work by modifying the typedefs in jmorecfg.h. However, you will probably +have difficulty if int is less than 16 bits wide, since references to plain +int abound in the code. + +char can be either signed or unsigned, although the code runs faster if an +unsigned char type is available. If char is wider than 8 bits, you will need +to redefine JOCTET and/or provide custom data source/destination managers so +that JOCTET represents exactly 8 bits of data on external storage. + +The JPEG library proper does not assume ASCII representation of characters. +But some of the image file I/O modules in cjpeg/djpeg do have ASCII +dependencies in file-header manipulation; so does cjpeg's select_file_type() +routine. + +The JPEG library does not rely heavily on the C library. In particular, C +stdio is used only by the data source/destination modules and the error +handler, all of which are application-replaceable. (cjpeg/djpeg are more +heavily dependent on stdio.) malloc and free are called only from the memory +manager "back end" module, so you can use a different memory allocator by +replacing that one file. + +The code generally assumes that C names must be unique in the first 15 +characters. However, global function names can be made unique in the +first 6 characters by defining NEED_SHORT_EXTERNAL_NAMES. + +More info about porting the code may be gleaned by reading jconfig.txt, +jmorecfg.h, and jinclude.h. + + +Notes for MS-DOS implementors +----------------------------- + +The IJG code is designed to work efficiently in 80x86 "small" or "medium" +memory models (i.e., data pointers are 16 bits unless explicitly declared +"far"; code pointers can be either size). You may be able to use small +model to compile cjpeg or djpeg by itself, but you will probably have to use +medium model for any larger application. This won't make much difference in +performance. You *will* take a noticeable performance hit if you use a +large-data memory model (perhaps 10%-25%), and you should avoid "huge" model +if at all possible. + +The JPEG library typically needs 2Kb-3Kb of stack space. It will also +malloc about 20K-30K of near heap space while executing (and lots of far +heap, but that doesn't count in this calculation). This figure will vary +depending on selected operating mode, and to a lesser extent on image size. +There is also about 5Kb-6Kb of constant data which will be allocated in the +near data segment (about 4Kb of this is the error message table). +Thus you have perhaps 20K available for other modules' static data and near +heap space before you need to go to a larger memory model. The C library's +static data will account for several K of this, but that still leaves a good +deal for your needs. (If you are tight on space, you could reduce the sizes +of the I/O buffers allocated by jdatasrc.c and jdatadst.c, say from 4K to +1K. Another possibility is to move the error message table to far memory; +this should be doable with only localized hacking on jerror.c.) + +About 2K of the near heap space is "permanent" memory that will not be +released until you destroy the JPEG object. This is only an issue if you +save a JPEG object between compression or decompression operations. + +Far data space may also be a tight resource when you are dealing with large +images. The most memory-intensive case is decompression with two-pass color +quantization, or single-pass quantization to an externally supplied color +map. This requires a 128Kb color lookup table plus strip buffers amounting +to about 40 bytes per column for typical sampling ratios (eg, about 25600 +bytes for a 640-pixel-wide image). You may not be able to process wide +images if you have large data structures of your own. + +Of course, all of these concerns vanish if you use a 32-bit flat-memory-model +compiler, such as DJGPP or Watcom C. We highly recommend flat model if you +can use it; the JPEG library is significantly faster in flat model. diff --git a/src/3rdparty/libjpeg/rdjpgcom.1 b/src/3rdparty/libjpeg/rdjpgcom.1 new file mode 100644 index 0000000000..97611df813 --- /dev/null +++ b/src/3rdparty/libjpeg/rdjpgcom.1 @@ -0,0 +1,63 @@ +.TH RDJPGCOM 1 "02 April 2009" +.SH NAME +rdjpgcom \- display text comments from a JPEG file +.SH SYNOPSIS +.B rdjpgcom +[ +.B \-raw +] +[ +.B \-verbose +] +[ +.I filename +] +.LP +.SH DESCRIPTION +.LP +.B rdjpgcom +reads the named JPEG/JFIF file, or the standard input if no file is named, +and prints any text comments found in the file on the standard output. +.PP +The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. +Although the standard doesn't actually define what COM blocks are for, they +are widely used to hold user-supplied text strings. This lets you add +annotations, titles, index terms, etc to your JPEG files, and later retrieve +them as text. COM blocks do not interfere with the image stored in the JPEG +file. The maximum size of a COM block is 64K, but you can have as many of +them as you like in one JPEG file. +.SH OPTIONS +.TP +.B \-raw +Normally +.B rdjpgcom +escapes non-printable characters in comments, for security reasons. +This option avoids that. +.PP +.B \-verbose +Causes +.B rdjpgcom +to also display the JPEG image dimensions. +.PP +Switch names may be abbreviated, and are not case sensitive. +.SH HINTS +.B rdjpgcom +does not depend on the IJG JPEG library. Its source code is intended as an +illustration of the minimum amount of code required to parse a JPEG file +header correctly. +.PP +In +.B \-verbose +mode, +.B rdjpgcom +will also attempt to print the contents of any "APP12" markers as text. +Some digital cameras produce APP12 markers containing useful textual +information. If you like, you can modify the source code to print +other APPn marker types as well. +.SH SEE ALSO +.BR cjpeg (1), +.BR djpeg (1), +.BR jpegtran (1), +.BR wrjpgcom (1) +.SH AUTHOR +Independent JPEG Group diff --git a/src/3rdparty/libjpeg/structure.txt b/src/3rdparty/libjpeg/structure.txt new file mode 100644 index 0000000000..fe88701e31 --- /dev/null +++ b/src/3rdparty/libjpeg/structure.txt @@ -0,0 +1,945 @@ +IJG JPEG LIBRARY: SYSTEM ARCHITECTURE + +Copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file provides an overview of the architecture of the IJG JPEG software; +that is, the functions of the various modules in the system and the interfaces +between modules. For more precise details about any data structure or calling +convention, see the include files and comments in the source code. + +We assume that the reader is already somewhat familiar with the JPEG standard. +The README file includes references for learning about JPEG. The file +libjpeg.txt describes the library from the viewpoint of an application +programmer using the library; it's best to read that file before this one. +Also, the file coderules.txt describes the coding style conventions we use. + +In this document, JPEG-specific terminology follows the JPEG standard: + A "component" means a color channel, e.g., Red or Luminance. + A "sample" is a single component value (i.e., one number in the image data). + A "coefficient" is a frequency coefficient (a DCT transform output number). + A "block" is an 8x8 group of samples or coefficients. + An "MCU" (minimum coded unit) is an interleaved set of blocks of size + determined by the sampling factors, or a single block in a + noninterleaved scan. +We do not use the terms "pixel" and "sample" interchangeably. When we say +pixel, we mean an element of the full-size image, while a sample is an element +of the downsampled image. Thus the number of samples may vary across +components while the number of pixels does not. (This terminology is not used +rigorously throughout the code, but it is used in places where confusion would +otherwise result.) + + +*** System features *** + +The IJG distribution contains two parts: + * A subroutine library for JPEG compression and decompression. + * cjpeg/djpeg, two sample applications that use the library to transform + JFIF JPEG files to and from several other image formats. +cjpeg/djpeg are of no great intellectual complexity: they merely add a simple +command-line user interface and I/O routines for several uncompressed image +formats. This document concentrates on the library itself. + +We desire the library to be capable of supporting all JPEG baseline, extended +sequential, and progressive DCT processes. Hierarchical processes are not +supported. + +The library does not support the lossless (spatial) JPEG process. Lossless +JPEG shares little or no code with lossy JPEG, and would normally be used +without the extensive pre- and post-processing provided by this library. +We feel that lossless JPEG is better handled by a separate library. + +Within these limits, any set of compression parameters allowed by the JPEG +spec should be readable for decompression. (We can be more restrictive about +what formats we can generate.) Although the system design allows for all +parameter values, some uncommon settings are not yet implemented and may +never be; nonintegral sampling ratios are the prime example. Furthermore, +we treat 8-bit vs. 12-bit data precision as a compile-time switch, not a +run-time option, because most machines can store 8-bit pixels much more +compactly than 12-bit. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, libtiff uses this +library to implement JPEG compression within the TIFF file format.) + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. This code can be omitted if not needed. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + + +*** Portability issues *** + +Portability is an essential requirement for the library. The key portability +issues that show up at the level of system architecture are: + +1. Memory usage. We want the code to be able to run on PC-class machines +with limited memory. Images should therefore be processed sequentially (in +strips), to avoid holding the whole image in memory at once. Where a +full-image buffer is necessary, we should be able to use either virtual memory +or temporary files. + +2. Near/far pointer distinction. To run efficiently on 80x86 machines, the +code should distinguish "small" objects (kept in near data space) from +"large" ones (kept in far data space). This is an annoying restriction, but +fortunately it does not impact code quality for less brain-damaged machines, +and the source code clutter turns out to be minimal with sufficient use of +pointer typedefs. + +3. Data precision. We assume that "char" is at least 8 bits, "short" and +"int" at least 16, "long" at least 32. The code will work fine with larger +data sizes, although memory may be used inefficiently in some cases. However, +the JPEG compressed datastream must ultimately appear on external storage as a +sequence of 8-bit bytes if it is to conform to the standard. This may pose a +problem on machines where char is wider than 8 bits. The library represents +compressed data as an array of values of typedef JOCTET. If no data type +exactly 8 bits wide is available, custom data source and data destination +modules must be written to unpack and pack the chosen JOCTET datatype into +8-bit external representation. + + +*** System overview *** + +The compressor and decompressor are each divided into two main sections: +the JPEG compressor or decompressor proper, and the preprocessing or +postprocessing functions. The interface between these two sections is the +image data that the official JPEG spec regards as its input or output: this +data is in the colorspace to be used for compression, and it is downsampled +to the sampling factors to be used. The preprocessing and postprocessing +steps are responsible for converting a normal image representation to or from +this form. (Those few applications that want to deal with YCbCr downsampled +data can skip the preprocessing or postprocessing step.) + +Looking more closely, the compressor library contains the following main +elements: + + Preprocessing: + * Color space conversion (e.g., RGB to YCbCr). + * Edge expansion and downsampling. Optionally, this step can do simple + smoothing --- this is often helpful for low-quality source data. + JPEG proper: + * MCU assembly, DCT, quantization. + * Entropy coding (sequential or progressive, Huffman or arithmetic). + +In addition to these modules we need overall control, marker generation, +and support code (memory management & error handling). There is also a +module responsible for physically writing the output data --- typically +this is just an interface to fwrite(), but some applications may need to +do something else with the data. + +The decompressor library contains the following main elements: + + JPEG proper: + * Entropy decoding (sequential or progressive, Huffman or arithmetic). + * Dequantization, inverse DCT, MCU disassembly. + Postprocessing: + * Upsampling. Optionally, this step may be able to do more general + rescaling of the image. + * Color space conversion (e.g., YCbCr to RGB). This step may also + provide gamma adjustment [ currently it does not ]. + * Optional color quantization (e.g., reduction to 256 colors). + * Optional color precision reduction (e.g., 24-bit to 15-bit color). + [This feature is not currently implemented.] + +We also need overall control, marker parsing, and a data source module. +The support code (memory management & error handling) can be shared with +the compression half of the library. + +There may be several implementations of each of these elements, particularly +in the decompressor, where a wide range of speed/quality tradeoffs is very +useful. It must be understood that some of the best speedups involve +merging adjacent steps in the pipeline. For example, upsampling, color space +conversion, and color quantization might all be done at once when using a +low-quality ordered-dither technique. The system architecture is designed to +allow such merging where appropriate. + + +Note: it is convenient to regard edge expansion (padding to block boundaries) +as a preprocessing/postprocessing function, even though the JPEG spec includes +it in compression/decompression. We do this because downsampling/upsampling +can be simplified a little if they work on padded data: it's not necessary to +have special cases at the right and bottom edges. Therefore the interface +buffer is always an integral number of blocks wide and high, and we expect +compression preprocessing to pad the source data properly. Padding will occur +only to the next block (8-sample) boundary. In an interleaved-scan situation, +additional dummy blocks may be used to fill out MCUs, but the MCU assembly and +disassembly logic will create or discard these blocks internally. (This is +advantageous for speed reasons, since we avoid DCTing the dummy blocks. +It also permits a small reduction in file size, because the compressor can +choose dummy block contents so as to minimize their size in compressed form. +Finally, it makes the interface buffer specification independent of whether +the file is actually interleaved or not.) Applications that wish to deal +directly with the downsampled data must provide similar buffering and padding +for odd-sized images. + + +*** Poor man's object-oriented programming *** + +It should be clear by now that we have a lot of quasi-independent processing +steps, many of which have several possible behaviors. To avoid cluttering the +code with lots of switch statements, we use a simple form of object-style +programming to separate out the different possibilities. + +For example, two different color quantization algorithms could be implemented +as two separate modules that present the same external interface; at runtime, +the calling code will access the proper module indirectly through an "object". + +We can get the limited features we need while staying within portable C. +The basic tool is a function pointer. An "object" is just a struct +containing one or more function pointer fields, each of which corresponds to +a method name in real object-oriented languages. During initialization we +fill in the function pointers with references to whichever module we have +determined we need to use in this run. Then invocation of the module is done +by indirecting through a function pointer; on most machines this is no more +expensive than a switch statement, which would be the only other way of +making the required run-time choice. The really significant benefit, of +course, is keeping the source code clean and well structured. + +We can also arrange to have private storage that varies between different +implementations of the same kind of object. We do this by making all the +module-specific object structs be separately allocated entities, which will +be accessed via pointers in the master compression or decompression struct. +The "public" fields or methods for a given kind of object are specified by +a commonly known struct. But a module's initialization code can allocate +a larger struct that contains the common struct as its first member, plus +additional private fields. With appropriate pointer casting, the module's +internal functions can access these private fields. (For a simple example, +see jdatadst.c, which implements the external interface specified by struct +jpeg_destination_mgr, but adds extra fields.) + +(Of course this would all be a lot easier if we were using C++, but we are +not yet prepared to assume that everyone has a C++ compiler.) + +An important benefit of this scheme is that it is easy to provide multiple +versions of any method, each tuned to a particular case. While a lot of +precalculation might be done to select an optimal implementation of a method, +the cost per invocation is constant. For example, the upsampling step might +have a "generic" method, plus one or more "hardwired" methods for the most +popular sampling factors; the hardwired methods would be faster because they'd +use straight-line code instead of for-loops. The cost to determine which +method to use is paid only once, at startup, and the selection criteria are +hidden from the callers of the method. + +This plan differs a little bit from usual object-oriented structures, in that +only one instance of each object class will exist during execution. The +reason for having the class structure is that on different runs we may create +different instances (choose to execute different modules). You can think of +the term "method" as denoting the common interface presented by a particular +set of interchangeable functions, and "object" as denoting a group of related +methods, or the total shared interface behavior of a group of modules. + + +*** Overall control structure *** + +We previously mentioned the need for overall control logic in the compression +and decompression libraries. In IJG implementations prior to v5, overall +control was mostly provided by "pipeline control" modules, which proved to be +large, unwieldy, and hard to understand. To improve the situation, the +control logic has been subdivided into multiple modules. The control modules +consist of: + +1. Master control for module selection and initialization. This has two +responsibilities: + + 1A. Startup initialization at the beginning of image processing. + The individual processing modules to be used in this run are selected + and given initialization calls. + + 1B. Per-pass control. This determines how many passes will be performed + and calls each active processing module to configure itself + appropriately at the beginning of each pass. End-of-pass processing, + where necessary, is also invoked from the master control module. + + Method selection is partially distributed, in that a particular processing + module may contain several possible implementations of a particular method, + which it will select among when given its initialization call. The master + control code need only be concerned with decisions that affect more than + one module. + +2. Data buffering control. A separate control module exists for each + inter-processing-step data buffer. This module is responsible for + invoking the processing steps that write or read that data buffer. + +Each buffer controller sees the world as follows: + +input data => processing step A => buffer => processing step B => output data + | | | + ------------------ controller ------------------ + +The controller knows the dataflow requirements of steps A and B: how much data +they want to accept in one chunk and how much they output in one chunk. Its +function is to manage its buffer and call A and B at the proper times. + +A data buffer control module may itself be viewed as a processing step by a +higher-level control module; thus the control modules form a binary tree with +elementary processing steps at the leaves of the tree. + +The control modules are objects. A considerable amount of flexibility can +be had by replacing implementations of a control module. For example: +* Merging of adjacent steps in the pipeline is done by replacing a control + module and its pair of processing-step modules with a single processing- + step module. (Hence the possible merges are determined by the tree of + control modules.) +* In some processing modes, a given interstep buffer need only be a "strip" + buffer large enough to accommodate the desired data chunk sizes. In other + modes, a full-image buffer is needed and several passes are required. + The control module determines which kind of buffer is used and manipulates + virtual array buffers as needed. One or both processing steps may be + unaware of the multi-pass behavior. + +In theory, we might be able to make all of the data buffer controllers +interchangeable and provide just one set of implementations for all. In +practice, each one contains considerable special-case processing for its +particular job. The buffer controller concept should be regarded as an +overall system structuring principle, not as a complete description of the +task performed by any one controller. + + +*** Compression object structure *** + +Here is a sketch of the logical structure of the JPEG compression library: + + |-- Colorspace conversion + |-- Preprocessing controller --| + | |-- Downsampling +Main controller --| + | |-- Forward DCT, quantize + |-- Coefficient controller --| + |-- Entropy encoding + +This sketch also describes the flow of control (subroutine calls) during +typical image data processing. Each of the components shown in the diagram is +an "object" which may have several different implementations available. One +or more source code files contain the actual implementation(s) of each object. + +The objects shown above are: + +* Main controller: buffer controller for the subsampled-data buffer, which + holds the preprocessed input data. This controller invokes preprocessing to + fill the subsampled-data buffer, and JPEG compression to empty it. There is + usually no need for a full-image buffer here; a strip buffer is adequate. + +* Preprocessing controller: buffer controller for the downsampling input data + buffer, which lies between colorspace conversion and downsampling. Note + that a unified conversion/downsampling module would probably replace this + controller entirely. + +* Colorspace conversion: converts application image data into the desired + JPEG color space; also changes the data from pixel-interleaved layout to + separate component planes. Processes one pixel row at a time. + +* Downsampling: performs reduction of chroma components as required. + Optionally may perform pixel-level smoothing as well. Processes a "row + group" at a time, where a row group is defined as Vmax pixel rows of each + component before downsampling, and Vk sample rows afterwards (remember Vk + differs across components). Some downsampling or smoothing algorithms may + require context rows above and below the current row group; the + preprocessing controller is responsible for supplying these rows via proper + buffering. The downsampler is responsible for edge expansion at the right + edge (i.e., extending each sample row to a multiple of 8 samples); but the + preprocessing controller is responsible for vertical edge expansion (i.e., + duplicating the bottom sample row as needed to make a multiple of 8 rows). + +* Coefficient controller: buffer controller for the DCT-coefficient data. + This controller handles MCU assembly, including insertion of dummy DCT + blocks when needed at the right or bottom edge. When performing + Huffman-code optimization or emitting a multiscan JPEG file, this + controller is responsible for buffering the full image. The equivalent of + one fully interleaved MCU row of subsampled data is processed per call, + even when the JPEG file is noninterleaved. + +* Forward DCT and quantization: Perform DCT, quantize, and emit coefficients. + Works on one or more DCT blocks at a time. (Note: the coefficients are now + emitted in normal array order, which the entropy encoder is expected to + convert to zigzag order as necessary. Prior versions of the IJG code did + the conversion to zigzag order within the quantization step.) + +* Entropy encoding: Perform Huffman or arithmetic entropy coding and emit the + coded data to the data destination module. Works on one MCU per call. + For progressive JPEG, the same DCT blocks are fed to the entropy coder + during each pass, and the coder must emit the appropriate subset of + coefficients. + +In addition to the above objects, the compression library includes these +objects: + +* Master control: determines the number of passes required, controls overall + and per-pass initialization of the other modules. + +* Marker writing: generates JPEG markers (except for RSTn, which is emitted + by the entropy encoder when needed). + +* Data destination manager: writes the output JPEG datastream to its final + destination (e.g., a file). The destination manager supplied with the + library knows how to write to a stdio stream; for other behaviors, the + surrounding application may provide its own destination manager. + +* Memory manager: allocates and releases memory, controls virtual arrays + (with backing store management, where required). + +* Error handler: performs formatting and output of error and trace messages; + determines handling of nonfatal errors. The surrounding application may + override some or all of this object's methods to change error handling. + +* Progress monitor: supports output of "percent-done" progress reports. + This object represents an optional callback to the surrounding application: + if wanted, it must be supplied by the application. + +The error handler, destination manager, and progress monitor objects are +defined as separate objects in order to simplify application-specific +customization of the JPEG library. A surrounding application may override +individual methods or supply its own all-new implementation of one of these +objects. The object interfaces for these objects are therefore treated as +part of the application interface of the library, whereas the other objects +are internal to the library. + +The error handler and memory manager are shared by JPEG compression and +decompression; the progress monitor, if used, may be shared as well. + + +*** Decompression object structure *** + +Here is a sketch of the logical structure of the JPEG decompression library: + + |-- Entropy decoding + |-- Coefficient controller --| + | |-- Dequantize, Inverse DCT +Main controller --| + | |-- Upsampling + |-- Postprocessing controller --| |-- Colorspace conversion + |-- Color quantization + |-- Color precision reduction + +As before, this diagram also represents typical control flow. The objects +shown are: + +* Main controller: buffer controller for the subsampled-data buffer, which + holds the output of JPEG decompression proper. This controller's primary + task is to feed the postprocessing procedure. Some upsampling algorithms + may require context rows above and below the current row group; when this + is true, the main controller is responsible for managing its buffer so as + to make context rows available. In the current design, the main buffer is + always a strip buffer; a full-image buffer is never required. + +* Coefficient controller: buffer controller for the DCT-coefficient data. + This controller handles MCU disassembly, including deletion of any dummy + DCT blocks at the right or bottom edge. When reading a multiscan JPEG + file, this controller is responsible for buffering the full image. + (Buffering DCT coefficients, rather than samples, is necessary to support + progressive JPEG.) The equivalent of one fully interleaved MCU row of + subsampled data is processed per call, even when the source JPEG file is + noninterleaved. + +* Entropy decoding: Read coded data from the data source module and perform + Huffman or arithmetic entropy decoding. Works on one MCU per call. + For progressive JPEG decoding, the coefficient controller supplies the prior + coefficients of each MCU (initially all zeroes), which the entropy decoder + modifies in each scan. + +* Dequantization and inverse DCT: like it says. Note that the coefficients + buffered by the coefficient controller have NOT been dequantized; we + merge dequantization and inverse DCT into a single step for speed reasons. + When scaled-down output is asked for, simplified DCT algorithms may be used + that need fewer coefficients and emit fewer samples per DCT block, not the + full 8x8. Works on one DCT block at a time. + +* Postprocessing controller: buffer controller for the color quantization + input buffer, when quantization is in use. (Without quantization, this + controller just calls the upsampler.) For two-pass quantization, this + controller is responsible for buffering the full-image data. + +* Upsampling: restores chroma components to full size. (May support more + general output rescaling, too. Note that if undersized DCT outputs have + been emitted by the DCT module, this module must adjust so that properly + sized outputs are created.) Works on one row group at a time. This module + also calls the color conversion module, so its top level is effectively a + buffer controller for the upsampling->color conversion buffer. However, in + all but the highest-quality operating modes, upsampling and color + conversion are likely to be merged into a single step. + +* Colorspace conversion: convert from JPEG color space to output color space, + and change data layout from separate component planes to pixel-interleaved. + Works on one pixel row at a time. + +* Color quantization: reduce the data to colormapped form, using either an + externally specified colormap or an internally generated one. This module + is not used for full-color output. Works on one pixel row at a time; may + require two passes to generate a color map. Note that the output will + always be a single component representing colormap indexes. In the current + design, the output values are JSAMPLEs, so an 8-bit compilation cannot + quantize to more than 256 colors. This is unlikely to be a problem in + practice. + +* Color reduction: this module handles color precision reduction, e.g., + generating 15-bit color (5 bits/primary) from JPEG's 24-bit output. + Not quite clear yet how this should be handled... should we merge it with + colorspace conversion??? + +Note that some high-speed operating modes might condense the entire +postprocessing sequence to a single module (upsample, color convert, and +quantize in one step). + +In addition to the above objects, the decompression library includes these +objects: + +* Master control: determines the number of passes required, controls overall + and per-pass initialization of the other modules. This is subdivided into + input and output control: jdinput.c controls only input-side processing, + while jdmaster.c handles overall initialization and output-side control. + +* Marker reading: decodes JPEG markers (except for RSTn). + +* Data source manager: supplies the input JPEG datastream. The source + manager supplied with the library knows how to read from a stdio stream; + for other behaviors, the surrounding application may provide its own source + manager. + +* Memory manager: same as for compression library. + +* Error handler: same as for compression library. + +* Progress monitor: same as for compression library. + +As with compression, the data source manager, error handler, and progress +monitor are candidates for replacement by a surrounding application. + + +*** Decompression input and output separation *** + +To support efficient incremental display of progressive JPEG files, the +decompressor is divided into two sections that can run independently: + +1. Data input includes marker parsing, entropy decoding, and input into the + coefficient controller's DCT coefficient buffer. Note that this + processing is relatively cheap and fast. + +2. Data output reads from the DCT coefficient buffer and performs the IDCT + and all postprocessing steps. + +For a progressive JPEG file, the data input processing is allowed to get +arbitrarily far ahead of the data output processing. (This occurs only +if the application calls jpeg_consume_input(); otherwise input and output +run in lockstep, since the input section is called only when the output +section needs more data.) In this way the application can avoid making +extra display passes when data is arriving faster than the display pass +can run. Furthermore, it is possible to abort an output pass without +losing anything, since the coefficient buffer is read-only as far as the +output section is concerned. See libjpeg.txt for more detail. + +A full-image coefficient array is only created if the JPEG file has multiple +scans (or if the application specifies buffered-image mode anyway). When +reading a single-scan file, the coefficient controller normally creates only +a one-MCU buffer, so input and output processing must run in lockstep in this +case. jpeg_consume_input() is effectively a no-op in this situation. + +The main impact of dividing the decompressor in this fashion is that we must +be very careful with shared variables in the cinfo data structure. Each +variable that can change during the course of decompression must be +classified as belonging to data input or data output, and each section must +look only at its own variables. For example, the data output section may not +depend on any of the variables that describe the current scan in the JPEG +file, because these may change as the data input section advances into a new +scan. + +The progress monitor is (somewhat arbitrarily) defined to treat input of the +file as one pass when buffered-image mode is not used, and to ignore data +input work completely when buffered-image mode is used. Note that the +library has no reliable way to predict the number of passes when dealing +with a progressive JPEG file, nor can it predict the number of output passes +in buffered-image mode. So the work estimate is inherently bogus anyway. + +No comparable division is currently made in the compression library, because +there isn't any real need for it. + + +*** Data formats *** + +Arrays of pixel sample values use the following data structure: + + typedef something JSAMPLE; a pixel component value, 0..MAXJSAMPLE + typedef JSAMPLE *JSAMPROW; ptr to a row of samples + typedef JSAMPROW *JSAMPARRAY; ptr to a list of rows + typedef JSAMPARRAY *JSAMPIMAGE; ptr to a list of color-component arrays + +The basic element type JSAMPLE will typically be one of unsigned char, +(signed) char, or short. Short will be used if samples wider than 8 bits are +to be supported (this is a compile-time option). Otherwise, unsigned char is +used if possible. If the compiler only supports signed chars, then it is +necessary to mask off the value when reading. Thus, all reads of JSAMPLE +values must be coded as "GETJSAMPLE(value)", where the macro will be defined +as "((value) & 0xFF)" on signed-char machines and "((int) (value))" elsewhere. + +With these conventions, JSAMPLE values can be assumed to be >= 0. This helps +simplify correct rounding during downsampling, etc. The JPEG standard's +specification that sample values run from -128..127 is accommodated by +subtracting 128 from the sample value in the DCT step. Similarly, during +decompression the output of the IDCT step will be immediately shifted back to +0..255. (NB: different values are required when 12-bit samples are in use. +The code is written in terms of MAXJSAMPLE and CENTERJSAMPLE, which will be +defined as 255 and 128 respectively in an 8-bit implementation, and as 4095 +and 2048 in a 12-bit implementation.) + +We use a pointer per row, rather than a two-dimensional JSAMPLE array. This +choice costs only a small amount of memory and has several benefits: +* Code using the data structure doesn't need to know the allocated width of + the rows. This simplifies edge expansion/compression, since we can work + in an array that's wider than the logical picture width. +* Indexing doesn't require multiplication; this is a performance win on many + machines. +* Arrays with more than 64K total elements can be supported even on machines + where malloc() cannot allocate chunks larger than 64K. +* The rows forming a component array may be allocated at different times + without extra copying. This trick allows some speedups in smoothing steps + that need access to the previous and next rows. + +Note that each color component is stored in a separate array; we don't use the +traditional layout in which the components of a pixel are stored together. +This simplifies coding of modules that work on each component independently, +because they don't need to know how many components there are. Furthermore, +we can read or write each component to a temporary file independently, which +is helpful when dealing with noninterleaved JPEG files. + +In general, a specific sample value is accessed by code such as + GETJSAMPLE(image[colorcomponent][row][col]) +where col is measured from the image left edge, but row is measured from the +first sample row currently in memory. Either of the first two indexings can +be precomputed by copying the relevant pointer. + + +Since most image-processing applications prefer to work on images in which +the components of a pixel are stored together, the data passed to or from the +surrounding application uses the traditional convention: a single pixel is +represented by N consecutive JSAMPLE values, and an image row is an array of +(# of color components)*(image width) JSAMPLEs. One or more rows of data can +be represented by a pointer of type JSAMPARRAY in this scheme. This scheme is +converted to component-wise storage inside the JPEG library. (Applications +that want to skip JPEG preprocessing or postprocessing will have to contend +with component-wise storage.) + + +Arrays of DCT-coefficient values use the following data structure: + + typedef short JCOEF; a 16-bit signed integer + typedef JCOEF JBLOCK[DCTSIZE2]; an 8x8 block of coefficients + typedef JBLOCK *JBLOCKROW; ptr to one horizontal row of 8x8 blocks + typedef JBLOCKROW *JBLOCKARRAY; ptr to a list of such rows + typedef JBLOCKARRAY *JBLOCKIMAGE; ptr to a list of color component arrays + +The underlying type is at least a 16-bit signed integer; while "short" is big +enough on all machines of interest, on some machines it is preferable to use +"int" for speed reasons, despite the storage cost. Coefficients are grouped +into 8x8 blocks (but we always use #defines DCTSIZE and DCTSIZE2 rather than +"8" and "64"). + +The contents of a coefficient block may be in either "natural" or zigzagged +order, and may be true values or divided by the quantization coefficients, +depending on where the block is in the processing pipeline. In the current +library, coefficient blocks are kept in natural order everywhere; the entropy +codecs zigzag or dezigzag the data as it is written or read. The blocks +contain quantized coefficients everywhere outside the DCT/IDCT subsystems. +(This latter decision may need to be revisited to support variable +quantization a la JPEG Part 3.) + +Notice that the allocation unit is now a row of 8x8 blocks, corresponding to +eight rows of samples. Otherwise the structure is much the same as for +samples, and for the same reasons. + +On machines where malloc() can't handle a request bigger than 64Kb, this data +structure limits us to rows of less than 512 JBLOCKs, or a picture width of +4000+ pixels. This seems an acceptable restriction. + + +On 80x86 machines, the bottom-level pointer types (JSAMPROW and JBLOCKROW) +must be declared as "far" pointers, but the upper levels can be "near" +(implying that the pointer lists are allocated in the DS segment). +We use a #define symbol FAR, which expands to the "far" keyword when +compiling on 80x86 machines and to nothing elsewhere. + + +*** Suspendable processing *** + +In some applications it is desirable to use the JPEG library as an +incremental, memory-to-memory filter. In this situation the data source or +destination may be a limited-size buffer, and we can't rely on being able to +empty or refill the buffer at arbitrary times. Instead the application would +like to have control return from the library at buffer overflow/underrun, and +then resume compression or decompression at a later time. + +This scenario is supported for simple cases. (For anything more complex, we +recommend that the application "bite the bullet" and develop real multitasking +capability.) The libjpeg.txt file goes into more detail about the usage and +limitations of this capability; here we address the implications for library +structure. + +The essence of the problem is that the entropy codec (coder or decoder) must +be prepared to stop at arbitrary times. In turn, the controllers that call +the entropy codec must be able to stop before having produced or consumed all +the data that they normally would handle in one call. That part is reasonably +straightforward: we make the controller call interfaces include "progress +counters" which indicate the number of data chunks successfully processed, and +we require callers to test the counter rather than just assume all of the data +was processed. + +Rather than trying to restart at an arbitrary point, the current Huffman +codecs are designed to restart at the beginning of the current MCU after a +suspension due to buffer overflow/underrun. At the start of each call, the +codec's internal state is loaded from permanent storage (in the JPEG object +structures) into local variables. On successful completion of the MCU, the +permanent state is updated. (This copying is not very expensive, and may even +lead to *improved* performance if the local variables can be registerized.) +If a suspension occurs, the codec simply returns without updating the state, +thus effectively reverting to the start of the MCU. Note that this implies +leaving some data unprocessed in the source/destination buffer (ie, the +compressed partial MCU). The data source/destination module interfaces are +specified so as to make this possible. This also implies that the data buffer +must be large enough to hold a worst-case compressed MCU; a couple thousand +bytes should be enough. + +In a successive-approximation AC refinement scan, the progressive Huffman +decoder has to be able to undo assignments of newly nonzero coefficients if it +suspends before the MCU is complete, since decoding requires distinguishing +previously-zero and previously-nonzero coefficients. This is a bit tedious +but probably won't have much effect on performance. Other variants of Huffman +decoding need not worry about this, since they will just store the same values +again if forced to repeat the MCU. + +This approach would probably not work for an arithmetic codec, since its +modifiable state is quite large and couldn't be copied cheaply. Instead it +would have to suspend and resume exactly at the point of the buffer end. + +The JPEG marker reader is designed to cope with suspension at an arbitrary +point. It does so by backing up to the start of the marker parameter segment, +so the data buffer must be big enough to hold the largest marker of interest. +Again, a couple KB should be adequate. (A special "skip" convention is used +to bypass COM and APPn markers, so these can be larger than the buffer size +without causing problems; otherwise a 64K buffer would be needed in the worst +case.) + +The JPEG marker writer currently does *not* cope with suspension. +We feel that this is not necessary; it is much easier simply to require +the application to ensure there is enough buffer space before starting. (An +empty 2K buffer is more than sufficient for the header markers; and ensuring +there are a dozen or two bytes available before calling jpeg_finish_compress() +will suffice for the trailer.) This would not work for writing multi-scan +JPEG files, but we simply do not intend to support that capability with +suspension. + + +*** Memory manager services *** + +The JPEG library's memory manager controls allocation and deallocation of +memory, and it manages large "virtual" data arrays on machines where the +operating system does not provide virtual memory. Note that the same +memory manager serves both compression and decompression operations. + +In all cases, allocated objects are tied to a particular compression or +decompression master record, and they will be released when that master +record is destroyed. + +The memory manager does not provide explicit deallocation of objects. +Instead, objects are created in "pools" of free storage, and a whole pool +can be freed at once. This approach helps prevent storage-leak bugs, and +it speeds up operations whenever malloc/free are slow (as they often are). +The pools can be regarded as lifetime identifiers for objects. Two +pools/lifetimes are defined: + * JPOOL_PERMANENT lasts until master record is destroyed + * JPOOL_IMAGE lasts until done with image (JPEG datastream) +Permanent lifetime is used for parameters and tables that should be carried +across from one datastream to another; this includes all application-visible +parameters. Image lifetime is used for everything else. (A third lifetime, +JPOOL_PASS = one processing pass, was originally planned. However it was +dropped as not being worthwhile. The actual usage patterns are such that the +peak memory usage would be about the same anyway; and having per-pass storage +substantially complicates the virtual memory allocation rules --- see below.) + +The memory manager deals with three kinds of object: +1. "Small" objects. Typically these require no more than 10K-20K total. +2. "Large" objects. These may require tens to hundreds of K depending on + image size. Semantically they behave the same as small objects, but we + distinguish them for two reasons: + * On MS-DOS machines, large objects are referenced by FAR pointers, + small objects by NEAR pointers. + * Pool allocation heuristics may differ for large and small objects. + Note that individual "large" objects cannot exceed the size allowed by + type size_t, which may be 64K or less on some machines. +3. "Virtual" objects. These are large 2-D arrays of JSAMPLEs or JBLOCKs + (typically large enough for the entire image being processed). The + memory manager provides stripwise access to these arrays. On machines + without virtual memory, the rest of the array may be swapped out to a + temporary file. + +(Note: JSAMPARRAY and JBLOCKARRAY data structures are a combination of large +objects for the data proper and small objects for the row pointers. For +convenience and speed, the memory manager provides single routines to create +these structures. Similarly, virtual arrays include a small control block +and a JSAMPARRAY or JBLOCKARRAY working buffer, all created with one call.) + +In the present implementation, virtual arrays are only permitted to have image +lifespan. (Permanent lifespan would not be reasonable, and pass lifespan is +not very useful since a virtual array's raison d'etre is to store data for +multiple passes through the image.) We also expect that only "small" objects +will be given permanent lifespan, though this restriction is not required by +the memory manager. + +In a non-virtual-memory machine, some performance benefit can be gained by +making the in-memory buffers for virtual arrays be as large as possible. +(For small images, the buffers might fit entirely in memory, so blind +swapping would be very wasteful.) The memory manager will adjust the height +of the buffers to fit within a prespecified maximum memory usage. In order +to do this in a reasonably optimal fashion, the manager needs to allocate all +of the virtual arrays at once. Therefore, there isn't a one-step allocation +routine for virtual arrays; instead, there is a "request" routine that simply +allocates the control block, and a "realize" routine (called just once) that +determines space allocation and creates all of the actual buffers. The +realize routine must allow for space occupied by non-virtual large objects. +(We don't bother to factor in the space needed for small objects, on the +grounds that it isn't worth the trouble.) + +To support all this, we establish the following protocol for doing business +with the memory manager: + 1. Modules must request virtual arrays (which may have only image lifespan) + during the initial setup phase, i.e., in their jinit_xxx routines. + 2. All "large" objects (including JSAMPARRAYs and JBLOCKARRAYs) must also be + allocated during initial setup. + 3. realize_virt_arrays will be called at the completion of initial setup. + The above conventions ensure that sufficient information is available + for it to choose a good size for virtual array buffers. +Small objects of any lifespan may be allocated at any time. We expect that +the total space used for small objects will be small enough to be negligible +in the realize_virt_arrays computation. + +In a virtual-memory machine, we simply pretend that the available space is +infinite, thus causing realize_virt_arrays to decide that it can allocate all +the virtual arrays as full-size in-memory buffers. The overhead of the +virtual-array access protocol is very small when no swapping occurs. + +A virtual array can be specified to be "pre-zeroed"; when this flag is set, +never-yet-written sections of the array are set to zero before being made +available to the caller. If this flag is not set, never-written sections +of the array contain garbage. (This feature exists primarily because the +equivalent logic would otherwise be needed in jdcoefct.c for progressive +JPEG mode; we may as well make it available for possible other uses.) + +The first write pass on a virtual array is required to occur in top-to-bottom +order; read passes, as well as any write passes after the first one, may +access the array in any order. This restriction exists partly to simplify +the virtual array control logic, and partly because some file systems may not +support seeking beyond the current end-of-file in a temporary file. The main +implication of this restriction is that rearrangement of rows (such as +converting top-to-bottom data order to bottom-to-top) must be handled while +reading data out of the virtual array, not while putting it in. + + +*** Memory manager internal structure *** + +To isolate system dependencies as much as possible, we have broken the +memory manager into two parts. There is a reasonably system-independent +"front end" (jmemmgr.c) and a "back end" that contains only the code +likely to change across systems. All of the memory management methods +outlined above are implemented by the front end. The back end provides +the following routines for use by the front end (none of these routines +are known to the rest of the JPEG code): + +jpeg_mem_init, jpeg_mem_term system-dependent initialization/shutdown + +jpeg_get_small, jpeg_free_small interface to malloc and free library routines + (or their equivalents) + +jpeg_get_large, jpeg_free_large interface to FAR malloc/free in MSDOS machines; + else usually the same as + jpeg_get_small/jpeg_free_small + +jpeg_mem_available estimate available memory + +jpeg_open_backing_store create a backing-store object + +read_backing_store, manipulate a backing-store object +write_backing_store, +close_backing_store + +On some systems there will be more than one type of backing-store object +(specifically, in MS-DOS a backing store file might be an area of extended +memory as well as a disk file). jpeg_open_backing_store is responsible for +choosing how to implement a given object. The read/write/close routines +are method pointers in the structure that describes a given object; this +lets them be different for different object types. + +It may be necessary to ensure that backing store objects are explicitly +released upon abnormal program termination. For example, MS-DOS won't free +extended memory by itself. To support this, we will expect the main program +or surrounding application to arrange to call self_destruct (typically via +jpeg_destroy) upon abnormal termination. This may require a SIGINT signal +handler or equivalent. We don't want to have the back end module install its +own signal handler, because that would pre-empt the surrounding application's +ability to control signal handling. + +The IJG distribution includes several memory manager back end implementations. +Usually the same back end should be suitable for all applications on a given +system, but it is possible for an application to supply its own back end at +need. + + +*** Implications of DNL marker *** + +Some JPEG files may use a DNL marker to postpone definition of the image +height (this would be useful for a fax-like scanner's output, for instance). +In these files the SOF marker claims the image height is 0, and you only +find out the true image height at the end of the first scan. + +We could read these files as follows: +1. Upon seeing zero image height, replace it by 65535 (the maximum allowed). +2. When the DNL is found, update the image height in the global image + descriptor. +This implies that control modules must avoid making copies of the image +height, and must re-test for termination after each MCU row. This would +be easy enough to do. + +In cases where image-size data structures are allocated, this approach will +result in very inefficient use of virtual memory or much-larger-than-necessary +temporary files. This seems acceptable for something that probably won't be a +mainstream usage. People might have to forgo use of memory-hogging options +(such as two-pass color quantization or noninterleaved JPEG files) if they +want efficient conversion of such files. (One could improve efficiency by +demanding a user-supplied upper bound for the height, less than 65536; in most +cases it could be much less.) + +The standard also permits the SOF marker to overestimate the image height, +with a DNL to give the true, smaller height at the end of the first scan. +This would solve the space problems if the overestimate wasn't too great. +However, it implies that you don't even know whether DNL will be used. + +This leads to a couple of very serious objections: +1. Testing for a DNL marker must occur in the inner loop of the decompressor's + Huffman decoder; this implies a speed penalty whether the feature is used + or not. +2. There is no way to hide the last-minute change in image height from an + application using the decoder. Thus *every* application using the IJG + library would suffer a complexity penalty whether it cared about DNL or + not. +We currently do not support DNL because of these problems. + +A different approach is to insist that DNL-using files be preprocessed by a +separate program that reads ahead to the DNL, then goes back and fixes the SOF +marker. This is a much simpler solution and is probably far more efficient. +Even if one wants piped input, buffering the first scan of the JPEG file needs +a lot smaller temp file than is implied by the maximum-height method. For +this approach we'd simply treat DNL as a no-op in the decompressor (at most, +check that it matches the SOF image height). + +We will not worry about making the compressor capable of outputting DNL. +Something similar to the first scheme above could be applied if anyone ever +wants to make that work. diff --git a/src/3rdparty/libjpeg/transupp.h b/src/3rdparty/libjpeg/transupp.h new file mode 100644 index 0000000000..7c16c19c44 --- /dev/null +++ b/src/3rdparty/libjpeg/transupp.h @@ -0,0 +1,210 @@ +/* + * transupp.h + * + * Copyright (C) 1997-2009, Thomas G. Lane, Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains declarations for image transformation routines and + * other utility code used by the jpegtran sample application. These are + * NOT part of the core JPEG library. But we keep these routines separate + * from jpegtran.c to ease the task of maintaining jpegtran-like programs + * that have other user interfaces. + * + * NOTE: all the routines declared here have very specific requirements + * about when they are to be executed during the reading and writing of the + * source and destination files. See the comments in transupp.c, or see + * jpegtran.c for an example of correct usage. + */ + +/* If you happen not to want the image transform support, disable it here */ +#ifndef TRANSFORMS_SUPPORTED +#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */ +#endif + +/* + * Although rotating and flipping data expressed as DCT coefficients is not + * hard, there is an asymmetry in the JPEG format specification for images + * whose dimensions aren't multiples of the iMCU size. The right and bottom + * image edges are padded out to the next iMCU boundary with junk data; but + * no padding is possible at the top and left edges. If we were to flip + * the whole image including the pad data, then pad garbage would become + * visible at the top and/or left, and real pixels would disappear into the + * pad margins --- perhaps permanently, since encoders & decoders may not + * bother to preserve DCT blocks that appear to be completely outside the + * nominal image area. So, we have to exclude any partial iMCUs from the + * basic transformation. + * + * Transpose is the only transformation that can handle partial iMCUs at the + * right and bottom edges completely cleanly. flip_h can flip partial iMCUs + * at the bottom, but leaves any partial iMCUs at the right edge untouched. + * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched. + * The other transforms are defined as combinations of these basic transforms + * and process edge blocks in a way that preserves the equivalence. + * + * The "trim" option causes untransformable partial iMCUs to be dropped; + * this is not strictly lossless, but it usually gives the best-looking + * result for odd-size images. Note that when this option is active, + * the expected mathematical equivalences between the transforms may not hold. + * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim + * followed by -rot 180 -trim trims both edges.) + * + * We also offer a lossless-crop option, which discards data outside a given + * image region but losslessly preserves what is inside. Like the rotate and + * flip transforms, lossless crop is restricted by the JPEG format: the upper + * left corner of the selected region must fall on an iMCU boundary. If this + * does not hold for the given crop parameters, we silently move the upper left + * corner up and/or left to make it so, simultaneously increasing the region + * dimensions to keep the lower right crop corner unchanged. (Thus, the + * output image covers at least the requested region, but may cover more.) + * + * We also provide a lossless-resize option, which is kind of a lossless-crop + * operation in the DCT coefficient block domain - it discards higher-order + * coefficients and losslessly preserves lower-order coefficients of a + * sub-block. + * + * Rotate/flip transform, resize, and crop can be requested together in a + * single invocation. The crop is applied last --- that is, the crop region + * is specified in terms of the destination image after transform/resize. + * + * We also offer a "force to grayscale" option, which simply discards the + * chrominance channels of a YCbCr image. This is lossless in the sense that + * the luminance channel is preserved exactly. It's not the same kind of + * thing as the rotate/flip transformations, but it's convenient to handle it + * as part of this package, mainly because the transformation routines have to + * be aware of the option to know how many components to work on. + */ + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jtransform_parse_crop_spec jTrParCrop +#define jtransform_request_workspace jTrRequest +#define jtransform_adjust_parameters jTrAdjust +#define jtransform_execute_transform jTrExec +#define jtransform_perfect_transform jTrPerfect +#define jcopy_markers_setup jCMrkSetup +#define jcopy_markers_execute jCMrkExec +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* + * Codes for supported types of image transformations. + */ + +typedef enum { + JXFORM_NONE, /* no transformation */ + JXFORM_FLIP_H, /* horizontal flip */ + JXFORM_FLIP_V, /* vertical flip */ + JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */ + JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */ + JXFORM_ROT_90, /* 90-degree clockwise rotation */ + JXFORM_ROT_180, /* 180-degree rotation */ + JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */ +} JXFORM_CODE; + +/* + * Codes for crop parameters, which can individually be unspecified, + * positive, or negative. (Negative width or height makes no sense, though.) + */ + +typedef enum { + JCROP_UNSET, + JCROP_POS, + JCROP_NEG +} JCROP_CODE; + +/* + * Transform parameters struct. + * NB: application must not change any elements of this struct after + * calling jtransform_request_workspace. + */ + +typedef struct { + /* Options: set by caller */ + JXFORM_CODE transform; /* image transform operator */ + boolean perfect; /* if TRUE, fail if partial MCUs are requested */ + boolean trim; /* if TRUE, trim partial MCUs as needed */ + boolean force_grayscale; /* if TRUE, convert color image to grayscale */ + boolean crop; /* if TRUE, crop source image */ + + /* Crop parameters: application need not set these unless crop is TRUE. + * These can be filled in by jtransform_parse_crop_spec(). + */ + JDIMENSION crop_width; /* Width of selected region */ + JCROP_CODE crop_width_set; + JDIMENSION crop_height; /* Height of selected region */ + JCROP_CODE crop_height_set; + JDIMENSION crop_xoffset; /* X offset of selected region */ + JCROP_CODE crop_xoffset_set; /* (negative measures from right edge) */ + JDIMENSION crop_yoffset; /* Y offset of selected region */ + JCROP_CODE crop_yoffset_set; /* (negative measures from bottom edge) */ + + /* Internal workspace: caller should not touch these */ + int num_components; /* # of components in workspace */ + jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */ + JDIMENSION output_width; /* cropped destination dimensions */ + JDIMENSION output_height; + JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */ + JDIMENSION y_crop_offset; + int iMCU_sample_width; /* destination iMCU size */ + int iMCU_sample_height; +} jpeg_transform_info; + + +#if TRANSFORMS_SUPPORTED + +/* Parse a crop specification (written in X11 geometry style) */ +EXTERN(boolean) jtransform_parse_crop_spec + JPP((jpeg_transform_info *info, const char *spec)); +/* Request any required workspace */ +EXTERN(boolean) jtransform_request_workspace + JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info)); +/* Adjust output image parameters */ +EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters + JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + jvirt_barray_ptr *src_coef_arrays, + jpeg_transform_info *info)); +/* Execute the actual transformation, if any */ +EXTERN(void) jtransform_execute_transform + JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + jvirt_barray_ptr *src_coef_arrays, + jpeg_transform_info *info)); +/* Determine whether lossless transformation is perfectly + * possible for a specified image and transformation. + */ +EXTERN(boolean) jtransform_perfect_transform + JPP((JDIMENSION image_width, JDIMENSION image_height, + int MCU_width, int MCU_height, + JXFORM_CODE transform)); + +/* jtransform_execute_transform used to be called + * jtransform_execute_transformation, but some compilers complain about + * routine names that long. This macro is here to avoid breaking any + * old source code that uses the original name... + */ +#define jtransform_execute_transformation jtransform_execute_transform + +#endif /* TRANSFORMS_SUPPORTED */ + + +/* + * Support for copying optional markers from source to destination file. + */ + +typedef enum { + JCOPYOPT_NONE, /* copy no optional markers */ + JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */ + JCOPYOPT_ALL /* copy all optional markers */ +} JCOPY_OPTION; + +#define JCOPYOPT_DEFAULT JCOPYOPT_COMMENTS /* recommended default */ + +/* Setup decompression object to save desired markers in memory */ +EXTERN(void) jcopy_markers_setup + JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option)); +/* Copy markers saved in the given source object to the destination object */ +EXTERN(void) jcopy_markers_execute + JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, + JCOPY_OPTION option)); diff --git a/src/3rdparty/libjpeg/usage.txt b/src/3rdparty/libjpeg/usage.txt new file mode 100644 index 0000000000..eae58425f0 --- /dev/null +++ b/src/3rdparty/libjpeg/usage.txt @@ -0,0 +1,631 @@ +USAGE instructions for the Independent JPEG Group's JPEG software +================================================================= + +This file describes usage of the JPEG conversion programs cjpeg and djpeg, +as well as the utility programs jpegtran, rdjpgcom and wrjpgcom. (See +the other documentation files if you wish to use the JPEG library within +your own programs.) + +If you are on a Unix machine you may prefer to read the Unix-style manual +pages in files cjpeg.1, djpeg.1, jpegtran.1, rdjpgcom.1, wrjpgcom.1. + + +INTRODUCTION + +These programs implement JPEG image encoding, decoding, and transcoding. +JPEG (pronounced "jay-peg") is a standardized compression method for +full-color and gray-scale images. + + +GENERAL USAGE + +We provide two programs, cjpeg to compress an image file into JPEG format, +and djpeg to decompress a JPEG file back into a conventional image format. + +On Unix-like systems, you say: + cjpeg [switches] [imagefile] >jpegfile +or + djpeg [switches] [jpegfile] >imagefile +The programs read the specified input file, or standard input if none is +named. They always write to standard output (with trace/error messages to +standard error). These conventions are handy for piping images between +programs. + +On most non-Unix systems, you say: + cjpeg [switches] imagefile jpegfile +or + djpeg [switches] jpegfile imagefile +i.e., both the input and output files are named on the command line. This +style is a little more foolproof, and it loses no functionality if you don't +have pipes. (You can get this style on Unix too, if you prefer, by defining +TWO_FILE_COMMANDLINE when you compile the programs; see install.txt.) + +You can also say: + cjpeg [switches] -outfile jpegfile imagefile +or + djpeg [switches] -outfile imagefile jpegfile +This syntax works on all systems, so it is useful for scripts. + +The currently supported image file formats are: PPM (PBMPLUS color format), +PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster Toolkit +format). (RLE is supported only if the URT library is available.) +cjpeg recognizes the input image format automatically, with the exception +of some Targa-format files. You have to tell djpeg which format to generate. + +JPEG files are in the defacto standard JFIF file format. There are other, +less widely used JPEG-based file formats, but we don't support them. + +All switch names may be abbreviated; for example, -grayscale may be written +-gray or -gr. Most of the "basic" switches can be abbreviated to as little as +one letter. Upper and lower case are equivalent (-BMP is the same as -bmp). +British spellings are also accepted (e.g., -greyscale), though for brevity +these are not mentioned below. + + +CJPEG DETAILS + +The basic command line switches for cjpeg are: + + -quality N[,...] Scale quantization tables to adjust image quality. + Quality is 0 (worst) to 100 (best); default is 75. + (See below for more info.) + + -grayscale Create monochrome JPEG file from color input. + Be sure to use this switch when compressing a grayscale + BMP file, because cjpeg isn't bright enough to notice + whether a BMP file uses only shades of gray. By + saying -grayscale, you'll get a smaller JPEG file that + takes less time to process. + + -optimize Perform optimization of entropy encoding parameters. + Without this, default encoding parameters are used. + -optimize usually makes the JPEG file a little smaller, + but cjpeg runs somewhat slower and needs much more + memory. Image quality and speed of decompression are + unaffected by -optimize. + + -progressive Create progressive JPEG file (see below). + + -scale M/N Scale the output image by a factor M/N. Currently + supported scale factors are M/N with all N from 1 to + 16, where M is the destination DCT size, which is 8 by + default (see -block N switch below). + + -targa Input file is Targa format. Targa files that contain + an "identification" field will not be automatically + recognized by cjpeg; for such files you must specify + -targa to make cjpeg treat the input as Targa format. + For most Targa files, you won't need this switch. + +The -quality switch lets you trade off compressed file size against quality of +the reconstructed image: the higher the quality setting, the larger the JPEG +file, and the closer the output image will be to the original input. Normally +you want to use the lowest quality setting (smallest file) that decompresses +into something visually indistinguishable from the original image. For this +purpose the quality setting should be between 50 and 95; the default of 75 is +often about right. If you see defects at -quality 75, then go up 5 or 10 +counts at a time until you are happy with the output image. (The optimal +setting will vary from one image to another.) + +-quality 100 will generate a quantization table of all 1's, minimizing loss +in the quantization step (but there is still information loss in subsampling, +as well as roundoff error). This setting is mainly of interest for +experimental purposes. Quality values above about 95 are NOT recommended for +normal use; the compressed file size goes up dramatically for hardly any gain +in output image quality. + +In the other direction, quality values below 50 will produce very small files +of low image quality. Settings around 5 to 10 might be useful in preparing an +index of a large image library, for example. Try -quality 2 (or so) for some +amusing Cubist effects. (Note: quality values below about 25 generate 2-byte +quantization tables, which are considered optional in the JPEG standard. +cjpeg emits a warning message when you give such a quality value, because some +other JPEG programs may be unable to decode the resulting file. Use -baseline +if you need to ensure compatibility at low quality values.) + +The -quality option has been extended in IJG version 7 for support of separate +quality settings for luminance and chrominance (or in general, for every +provided quantization table slot). This feature is useful for high-quality +applications which cannot accept the damage of color data by coarse +subsampling settings. You can now easily reduce the color data amount more +smoothly with finer control without separate subsampling. The resulting file +is fully compliant with standard JPEG decoders. +Note that the -quality ratings refer to the quantization table slots, and that +the last value is replicated if there are more q-table slots than parameters. +The default q-table slots are 0 for luminance and 1 for chrominance with +default tables as given in the JPEG standard. This is compatible with the old +behaviour in case that only one parameter is given, which is then used for +both luminance and chrominance (slots 0 and 1). More or custom quantization +tables can be set with -qtables and assigned to components with -qslots +parameter (see the "wizard" switches below). +CAUTION: You must explicitly add -sample 1x1 for efficient separate color +quality selection, since the default value used by library is 2x2! + +The -progressive switch creates a "progressive JPEG" file. In this type of +JPEG file, the data is stored in multiple scans of increasing quality. If the +file is being transmitted over a slow communications link, the decoder can use +the first scan to display a low-quality image very quickly, and can then +improve the display with each subsequent scan. The final image is exactly +equivalent to a standard JPEG file of the same quality setting, and the total +file size is about the same --- often a little smaller. + +Switches for advanced users: + + -block N Set DCT block size. All N from 1 to 16 are possible. + Default is 8 (baseline format). + Larger values produce higher compression, + smaller values produce higher quality + (exact DCT stage possible with 1 or 2; with the + default quality of 75 and default Luminance qtable + the DCT+Quantization stage is lossless for N=1). + CAUTION: An implementation of the JPEG SmartScale + extension is required for this feature. SmartScale + enabled JPEG is not yet widely implemented, so many + decoders will be unable to view a SmartScale extended + JPEG file at all. + + -dct int Use integer DCT method (default). + -dct fast Use fast integer DCT (less accurate). + -dct float Use floating-point DCT method. + The float method is very slightly more accurate than + the int method, but is much slower unless your machine + has very fast floating-point hardware. Also note that + results of the floating-point method may vary slightly + across machines, while the integer methods should give + the same results everywhere. The fast integer method + is much less accurate than the other two. + + -nosmooth Don't use high-quality downsampling. + + -restart N Emit a JPEG restart marker every N MCU rows, or every + N MCU blocks if "B" is attached to the number. + -restart 0 (the default) means no restart markers. + + -smooth N Smooth the input image to eliminate dithering noise. + N, ranging from 1 to 100, indicates the strength of + smoothing. 0 (the default) means no smoothing. + + -maxmemory N Set limit for amount of memory to use in processing + large images. Value is in thousands of bytes, or + millions of bytes if "M" is attached to the number. + For example, -max 4m selects 4000000 bytes. If more + space is needed, temporary files will be used. + + -verbose Enable debug printout. More -v's give more printout. + or -debug Also, version information is printed at startup. + +The -restart option inserts extra markers that allow a JPEG decoder to +resynchronize after a transmission error. Without restart markers, any damage +to a compressed file will usually ruin the image from the point of the error +to the end of the image; with restart markers, the damage is usually confined +to the portion of the image up to the next restart marker. Of course, the +restart markers occupy extra space. We recommend -restart 1 for images that +will be transmitted across unreliable networks such as Usenet. + +The -smooth option filters the input to eliminate fine-scale noise. This is +often useful when converting dithered images to JPEG: a moderate smoothing +factor of 10 to 50 gets rid of dithering patterns in the input file, resulting +in a smaller JPEG file and a better-looking image. Too large a smoothing +factor will visibly blur the image, however. + +Switches for wizards: + + -arithmetic Use arithmetic coding. CAUTION: arithmetic coded JPEG + is not yet widely implemented, so many decoders will + be unable to view an arithmetic coded JPEG file at + all. + + -baseline Force baseline-compatible quantization tables to be + generated. This clamps quantization values to 8 bits + even at low quality settings. (This switch is poorly + named, since it does not ensure that the output is + actually baseline JPEG. For example, you can use + -baseline and -progressive together.) + + -qtables file Use the quantization tables given in the specified + text file. + + -qslots N[,...] Select which quantization table to use for each color + component. + + -sample HxV[,...] Set JPEG sampling factors for each color component. + + -scans file Use the scan script given in the specified text file. + +The "wizard" switches are intended for experimentation with JPEG. If you +don't know what you are doing, DON'T USE THEM. These switches are documented +further in the file wizard.txt. + + +DJPEG DETAILS + +The basic command line switches for djpeg are: + + -colors N Reduce image to at most N colors. This reduces the + or -quantize N number of colors used in the output image, so that it + can be displayed on a colormapped display or stored in + a colormapped file format. For example, if you have + an 8-bit display, you'd need to reduce to 256 or fewer + colors. (-colors is the recommended name, -quantize + is provided only for backwards compatibility.) + + -fast Select recommended processing options for fast, low + quality output. (The default options are chosen for + highest quality output.) Currently, this is equivalent + to "-dct fast -nosmooth -onepass -dither ordered". + + -grayscale Force gray-scale output even if JPEG file is color. + Useful for viewing on monochrome displays; also, + djpeg runs noticeably faster in this mode. + + -scale M/N Scale the output image by a factor M/N. Currently + supported scale factors are M/N with all M from 1 to + 16, where N is the source DCT size, which is 8 for + baseline JPEG. If the /N part is omitted, then M + specifies the DCT scaled size to be applied on the + given input. For baseline JPEG this is equivalent to + M/8 scaling, since the source DCT size for baseline + JPEG is 8. Scaling is handy if the image is larger + than your screen; also, djpeg runs much faster when + scaling down the output. + + -bmp Select BMP output format (Windows flavor). 8-bit + colormapped format is emitted if -colors or -grayscale + is specified, or if the JPEG file is gray-scale; + otherwise, 24-bit full-color format is emitted. + + -gif Select GIF output format. Since GIF does not support + more than 256 colors, -colors 256 is assumed (unless + you specify a smaller number of colors). If you + specify -fast, the default number of colors is 216. + + -os2 Select BMP output format (OS/2 1.x flavor). 8-bit + colormapped format is emitted if -colors or -grayscale + is specified, or if the JPEG file is gray-scale; + otherwise, 24-bit full-color format is emitted. + + -pnm Select PBMPLUS (PPM/PGM) output format (this is the + default format). PGM is emitted if the JPEG file is + gray-scale or if -grayscale is specified; otherwise + PPM is emitted. + + -rle Select RLE output format. (Requires URT library.) + + -targa Select Targa output format. Gray-scale format is + emitted if the JPEG file is gray-scale or if + -grayscale is specified; otherwise, colormapped format + is emitted if -colors is specified; otherwise, 24-bit + full-color format is emitted. + +Switches for advanced users: + + -dct int Use integer DCT method (default). + -dct fast Use fast integer DCT (less accurate). + -dct float Use floating-point DCT method. + The float method is very slightly more accurate than + the int method, but is much slower unless your machine + has very fast floating-point hardware. Also note that + results of the floating-point method may vary slightly + across machines, while the integer methods should give + the same results everywhere. The fast integer method + is much less accurate than the other two. + + -dither fs Use Floyd-Steinberg dithering in color quantization. + -dither ordered Use ordered dithering in color quantization. + -dither none Do not use dithering in color quantization. + By default, Floyd-Steinberg dithering is applied when + quantizing colors; this is slow but usually produces + the best results. Ordered dither is a compromise + between speed and quality; no dithering is fast but + usually looks awful. Note that these switches have + no effect unless color quantization is being done. + Ordered dither is only available in -onepass mode. + + -map FILE Quantize to the colors used in the specified image + file. This is useful for producing multiple files + with identical color maps, or for forcing a predefined + set of colors to be used. The FILE must be a GIF + or PPM file. This option overrides -colors and + -onepass. + + -nosmooth Don't use high-quality upsampling. + + -onepass Use one-pass instead of two-pass color quantization. + The one-pass method is faster and needs less memory, + but it produces a lower-quality image. -onepass is + ignored unless you also say -colors N. Also, + the one-pass method is always used for gray-scale + output (the two-pass method is no improvement then). + + -maxmemory N Set limit for amount of memory to use in processing + large images. Value is in thousands of bytes, or + millions of bytes if "M" is attached to the number. + For example, -max 4m selects 4000000 bytes. If more + space is needed, temporary files will be used. + + -verbose Enable debug printout. More -v's give more printout. + or -debug Also, version information is printed at startup. + + +HINTS FOR CJPEG + +Color GIF files are not the ideal input for JPEG; JPEG is really intended for +compressing full-color (24-bit) images. In particular, don't try to convert +cartoons, line drawings, and other images that have only a few distinct +colors. GIF works great on these, JPEG does not. If you want to convert a +GIF to JPEG, you should experiment with cjpeg's -quality and -smooth options +to get a satisfactory conversion. -smooth 10 or so is often helpful. + +Avoid running an image through a series of JPEG compression/decompression +cycles. Image quality loss will accumulate; after ten or so cycles the image +may be noticeably worse than it was after one cycle. It's best to use a +lossless format while manipulating an image, then convert to JPEG format when +you are ready to file the image away. + +The -optimize option to cjpeg is worth using when you are making a "final" +version for posting or archiving. It's also a win when you are using low +quality settings to make very small JPEG files; the percentage improvement +is often a lot more than it is on larger files. (At present, -optimize +mode is always selected when generating progressive JPEG files.) + +GIF input files are no longer supported, to avoid the Unisys LZW patent. +(Conversion of GIF files to JPEG is usually a bad idea anyway.) + + +HINTS FOR DJPEG + +To get a quick preview of an image, use the -grayscale and/or -scale switches. +"-grayscale -scale 1/8" is the fastest case. + +Several options are available that trade off image quality to gain speed. +"-fast" turns on the recommended settings. + +"-dct fast" and/or "-nosmooth" gain speed at a small sacrifice in quality. +When producing a color-quantized image, "-onepass -dither ordered" is fast but +much lower quality than the default behavior. "-dither none" may give +acceptable results in two-pass mode, but is seldom tolerable in one-pass mode. + +If you are fortunate enough to have very fast floating point hardware, +"-dct float" may be even faster than "-dct fast". But on most machines +"-dct float" is slower than "-dct int"; in this case it is not worth using, +because its theoretical accuracy advantage is too small to be significant +in practice. + +Two-pass color quantization requires a good deal of memory; on MS-DOS machines +it may run out of memory even with -maxmemory 0. In that case you can still +decompress, with some loss of image quality, by specifying -onepass for +one-pass quantization. + +To avoid the Unisys LZW patent, djpeg produces uncompressed GIF files. These +are larger than they should be, but are readable by standard GIF decoders. + + +HINTS FOR BOTH PROGRAMS + +If more space is needed than will fit in the available main memory (as +determined by -maxmemory), temporary files will be used. (MS-DOS versions +will try to get extended or expanded memory first.) The temporary files are +often rather large: in typical cases they occupy three bytes per pixel, for +example 3*800*600 = 1.44Mb for an 800x600 image. If you don't have enough +free disk space, leave out -progressive and -optimize (for cjpeg) or specify +-onepass (for djpeg). + +On MS-DOS, the temporary files are created in the directory named by the TMP +or TEMP environment variable, or in the current directory if neither of those +exist. Amiga implementations put the temp files in the directory named by +JPEGTMP:, so be sure to assign JPEGTMP: to a disk partition with adequate free +space. + +The default memory usage limit (-maxmemory) is set when the software is +compiled. If you get an "insufficient memory" error, try specifying a smaller +-maxmemory value, even -maxmemory 0 to use the absolute minimum space. You +may want to recompile with a smaller default value if this happens often. + +On machines that have "environment" variables, you can define the environment +variable JPEGMEM to set the default memory limit. The value is specified as +described for the -maxmemory switch. JPEGMEM overrides the default value +specified when the program was compiled, and itself is overridden by an +explicit -maxmemory switch. + +On MS-DOS machines, -maxmemory is the amount of main (conventional) memory to +use. (Extended or expanded memory is also used if available.) Most +DOS-specific versions of this software do their own memory space estimation +and do not need you to specify -maxmemory. + + +JPEGTRAN + +jpegtran performs various useful transformations of JPEG files. +It can translate the coded representation from one variant of JPEG to another, +for example from baseline JPEG to progressive JPEG or vice versa. It can also +perform some rearrangements of the image data, for example turning an image +from landscape to portrait format by rotation. + +jpegtran works by rearranging the compressed data (DCT coefficients), without +ever fully decoding the image. Therefore, its transformations are lossless: +there is no image degradation at all, which would not be true if you used +djpeg followed by cjpeg to accomplish the same conversion. But by the same +token, jpegtran cannot perform lossy operations such as changing the image +quality. + +jpegtran uses a command line syntax similar to cjpeg or djpeg. +On Unix-like systems, you say: + jpegtran [switches] [inputfile] >outputfile +On most non-Unix systems, you say: + jpegtran [switches] inputfile outputfile +where both the input and output files are JPEG files. + +To specify the coded JPEG representation used in the output file, +jpegtran accepts a subset of the switches recognized by cjpeg: + -optimize Perform optimization of entropy encoding parameters. + -progressive Create progressive JPEG file. + -restart N Emit a JPEG restart marker every N MCU rows, or every + N MCU blocks if "B" is attached to the number. + -arithmetic Use arithmetic coding. + -scans file Use the scan script given in the specified text file. +See the previous discussion of cjpeg for more details about these switches. +If you specify none of these switches, you get a plain baseline-JPEG output +file. The quality setting and so forth are determined by the input file. + +The image can be losslessly transformed by giving one of these switches: + -flip horizontal Mirror image horizontally (left-right). + -flip vertical Mirror image vertically (top-bottom). + -rotate 90 Rotate image 90 degrees clockwise. + -rotate 180 Rotate image 180 degrees. + -rotate 270 Rotate image 270 degrees clockwise (or 90 ccw). + -transpose Transpose image (across UL-to-LR axis). + -transverse Transverse transpose (across UR-to-LL axis). + +The transpose transformation has no restrictions regarding image dimensions. +The other transformations operate rather oddly if the image dimensions are not +a multiple of the iMCU size (usually 8 or 16 pixels), because they can only +transform complete blocks of DCT coefficient data in the desired way. + +jpegtran's default behavior when transforming an odd-size image is designed +to preserve exact reversibility and mathematical consistency of the +transformation set. As stated, transpose is able to flip the entire image +area. Horizontal mirroring leaves any partial iMCU column at the right edge +untouched, but is able to flip all rows of the image. Similarly, vertical +mirroring leaves any partial iMCU row at the bottom edge untouched, but is +able to flip all columns. The other transforms can be built up as sequences +of transpose and flip operations; for consistency, their actions on edge +pixels are defined to be the same as the end result of the corresponding +transpose-and-flip sequence. + +For practical use, you may prefer to discard any untransformable edge pixels +rather than having a strange-looking strip along the right and/or bottom edges +of a transformed image. To do this, add the -trim switch: + -trim Drop non-transformable edge blocks. +Obviously, a transformation with -trim is not reversible, so strictly speaking +jpegtran with this switch is not lossless. Also, the expected mathematical +equivalences between the transformations no longer hold. For example, +"-rot 270 -trim" trims only the bottom edge, but "-rot 90 -trim" followed by +"-rot 180 -trim" trims both edges. + +If you are only interested in perfect transformation, add the -perfect switch: + -perfect Fails with an error if the transformation is not + perfect. +For example you may want to do + jpegtran -rot 90 -perfect foo.jpg || djpeg foo.jpg | pnmflip -r90 | cjpeg +to do a perfect rotation if available or an approximated one if not. + +We also offer a lossless-crop option, which discards data outside a given +image region but losslessly preserves what is inside. Like the rotate and +flip transforms, lossless crop is restricted by the current JPEG format: the +upper left corner of the selected region must fall on an iMCU boundary. If +this does not hold for the given crop parameters, we silently move the upper +left corner up and/or left to make it so, simultaneously increasing the region +dimensions to keep the lower right crop corner unchanged. (Thus, the output +image covers at least the requested region, but may cover more.) + +The image can be losslessly cropped by giving the switch: + -crop WxH+X+Y Crop to a rectangular subarea of width W, height H + starting at point X,Y. + +Other not-strictly-lossless transformation switches are: + + -grayscale Force grayscale output. +This option discards the chrominance channels if the input image is YCbCr +(ie, a standard color JPEG), resulting in a grayscale JPEG file. The +luminance channel is preserved exactly, so this is a better method of reducing +to grayscale than decompression, conversion, and recompression. This switch +is particularly handy for fixing a monochrome picture that was mistakenly +encoded as a color JPEG. (In such a case, the space savings from getting rid +of the near-empty chroma channels won't be large; but the decoding time for +a grayscale JPEG is substantially less than that for a color JPEG.) + + -scale M/N Scale the output image by a factor M/N. +Currently supported scale factors are M/N with all M from 1 to 16, where N is +the source DCT size, which is 8 for baseline JPEG. If the /N part is omitted, +then M specifies the DCT scaled size to be applied on the given input. For +baseline JPEG this is equivalent to M/8 scaling, since the source DCT size +for baseline JPEG is 8. CAUTION: An implementation of the JPEG SmartScale +extension is required for this feature. SmartScale enabled JPEG is not yet +widely implemented, so many decoders will be unable to view a SmartScale +extended JPEG file at all. + +jpegtran also recognizes these switches that control what to do with "extra" +markers, such as comment blocks: + -copy none Copy no extra markers from source file. This setting + suppresses all comments and other excess baggage + present in the source file. + -copy comments Copy only comment markers. This setting copies + comments from the source file, but discards + any other inessential (for image display) data. + -copy all Copy all extra markers. This setting preserves + miscellaneous markers found in the source file, such + as JFIF thumbnails, Exif data, and Photoshop settings. + In some files these extra markers can be sizable. +The default behavior is -copy comments. (Note: in IJG releases v6 and v6a, +jpegtran always did the equivalent of -copy none.) + +Additional switches recognized by jpegtran are: + -outfile filename + -maxmemory N + -verbose + -debug +These work the same as in cjpeg or djpeg. + + +THE COMMENT UTILITIES + +The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. +Although the standard doesn't actually define what COM blocks are for, they +are widely used to hold user-supplied text strings. This lets you add +annotations, titles, index terms, etc to your JPEG files, and later retrieve +them as text. COM blocks do not interfere with the image stored in the JPEG +file. The maximum size of a COM block is 64K, but you can have as many of +them as you like in one JPEG file. + +We provide two utility programs to display COM block contents and add COM +blocks to a JPEG file. + +rdjpgcom searches a JPEG file and prints the contents of any COM blocks on +standard output. The command line syntax is + rdjpgcom [-raw] [-verbose] [inputfilename] +The switch "-raw" (or just "-r") causes rdjpgcom to also output non-printable +characters in comments, which are normally escaped for security reasons. +The switch "-verbose" (or just "-v") causes rdjpgcom to also display the JPEG +image dimensions. If you omit the input file name from the command line, +the JPEG file is read from standard input. (This may not work on some +operating systems, if binary data can't be read from stdin.) + +wrjpgcom adds a COM block, containing text you provide, to a JPEG file. +Ordinarily, the COM block is added after any existing COM blocks, but you +can delete the old COM blocks if you wish. wrjpgcom produces a new JPEG +file; it does not modify the input file. DO NOT try to overwrite the input +file by directing wrjpgcom's output back into it; on most systems this will +just destroy your file. + +The command line syntax for wrjpgcom is similar to cjpeg's. On Unix-like +systems, it is + wrjpgcom [switches] [inputfilename] +The output file is written to standard output. The input file comes from +the named file, or from standard input if no input file is named. + +On most non-Unix systems, the syntax is + wrjpgcom [switches] inputfilename outputfilename +where both input and output file names must be given explicitly. + +wrjpgcom understands three switches: + -replace Delete any existing COM blocks from the file. + -comment "Comment text" Supply new COM text on command line. + -cfile name Read text for new COM block from named file. +(Switch names can be abbreviated.) If you have only one line of comment text +to add, you can provide it on the command line with -comment. The comment +text must be surrounded with quotes so that it is treated as a single +argument. Longer comments can be read from a text file. + +If you give neither -comment nor -cfile, then wrjpgcom will read the comment +text from standard input. (In this case an input image file name MUST be +supplied, so that the source JPEG file comes from somewhere else.) You can +enter multiple lines, up to 64KB worth. Type an end-of-file indicator +(usually control-D or control-Z) to terminate the comment text entry. + +wrjpgcom will not add a COM block if the provided comment string is empty. +Therefore -replace -comment "" can be used to delete all COM blocks from a +file. + +These utility programs do not depend on the IJG JPEG library. In +particular, the source code for rdjpgcom is intended as an illustration of +the minimum amount of code required to parse a JPEG file header correctly. diff --git a/src/3rdparty/libjpeg/wizard.txt b/src/3rdparty/libjpeg/wizard.txt new file mode 100644 index 0000000000..54170b227d --- /dev/null +++ b/src/3rdparty/libjpeg/wizard.txt @@ -0,0 +1,211 @@ +Advanced usage instructions for the Independent JPEG Group's JPEG software +========================================================================== + +This file describes cjpeg's "switches for wizards". + +The "wizard" switches are intended for experimentation with JPEG by persons +who are reasonably knowledgeable about the JPEG standard. If you don't know +what you are doing, DON'T USE THESE SWITCHES. You'll likely produce files +with worse image quality and/or poorer compression than you'd get from the +default settings. Furthermore, these switches must be used with caution +when making files intended for general use, because not all JPEG decoders +will support unusual JPEG parameter settings. + + +Quantization Table Adjustment +----------------------------- + +Ordinarily, cjpeg starts with a default set of tables (the same ones given +as examples in the JPEG standard) and scales them up or down according to +the -quality setting. The details of the scaling algorithm can be found in +jcparam.c. At very low quality settings, some quantization table entries +can get scaled up to values exceeding 255. Although 2-byte quantization +values are supported by the IJG software, this feature is not in baseline +JPEG and is not supported by all implementations. If you need to ensure +wide compatibility of low-quality files, you can constrain the scaled +quantization values to no more than 255 by giving the -baseline switch. +Note that use of -baseline will result in poorer quality for the same file +size, since more bits than necessary are expended on higher AC coefficients. + +You can substitute a different set of quantization values by using the +-qtables switch: + + -qtables file Use the quantization tables given in the named file. + +The specified file should be a text file containing decimal quantization +values. The file should contain one to four tables, each of 64 elements. +The tables are implicitly numbered 0,1,etc. in order of appearance. Table +entries appear in normal array order (NOT in the zigzag order in which they +will be stored in the JPEG file). + +Quantization table files are free format, in that arbitrary whitespace can +appear between numbers. Also, comments can be included: a comment starts +with '#' and extends to the end of the line. Here is an example file that +duplicates the default quantization tables: + + # Quantization tables given in JPEG spec, section K.1 + + # This is table 0 (the luminance table): + 16 11 10 16 24 40 51 61 + 12 12 14 19 26 58 60 55 + 14 13 16 24 40 57 69 56 + 14 17 22 29 51 87 80 62 + 18 22 37 56 68 109 103 77 + 24 35 55 64 81 104 113 92 + 49 64 78 87 103 121 120 101 + 72 92 95 98 112 100 103 99 + + # This is table 1 (the chrominance table): + 17 18 24 47 99 99 99 99 + 18 21 26 66 99 99 99 99 + 24 26 56 99 99 99 99 99 + 47 66 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + +If the -qtables switch is used without -quality, then the specified tables +are used exactly as-is. If both -qtables and -quality are used, then the +tables taken from the file are scaled in the same fashion that the default +tables would be scaled for that quality setting. If -baseline appears, then +the quantization values are constrained to the range 1-255. + +By default, cjpeg will use quantization table 0 for luminance components and +table 1 for chrominance components. To override this choice, use the -qslots +switch: + + -qslots N[,...] Select which quantization table to use for + each color component. + +The -qslots switch specifies a quantization table number for each color +component, in the order in which the components appear in the JPEG SOF marker. +For example, to create a separate table for each of Y,Cb,Cr, you could +provide a -qtables file that defines three quantization tables and say +"-qslots 0,1,2". If -qslots gives fewer table numbers than there are color +components, then the last table number is repeated as necessary. + + +Sampling Factor Adjustment +-------------------------- + +By default, cjpeg uses 2:1 horizontal and vertical downsampling when +compressing YCbCr data, and no downsampling for all other color spaces. +You can override this default with the -sample switch: + + -sample HxV[,...] Set JPEG sampling factors for each color + component. + +The -sample switch specifies the JPEG sampling factors for each color +component, in the order in which they appear in the JPEG SOF marker. +If you specify fewer HxV pairs than there are components, the remaining +components are set to 1x1 sampling. For example, the default YCbCr setting +is equivalent to "-sample 2x2,1x1,1x1", which can be abbreviated to +"-sample 2x2". + +There are still some JPEG decoders in existence that support only 2x1 +sampling (also called 4:2:2 sampling). Compatibility with such decoders can +be achieved by specifying "-sample 2x1". This is not recommended unless +really necessary, since it increases file size and encoding/decoding time +with very little quality gain. + + +Multiple Scan / Progression Control +----------------------------------- + +By default, cjpeg emits a single-scan sequential JPEG file. The +-progressive switch generates a progressive JPEG file using a default series +of progression parameters. You can create multiple-scan sequential JPEG +files or progressive JPEG files with custom progression parameters by using +the -scans switch: + + -scans file Use the scan sequence given in the named file. + +The specified file should be a text file containing a "scan script". +The script specifies the contents and ordering of the scans to be emitted. +Each entry in the script defines one scan. A scan definition specifies +the components to be included in the scan, and for progressive JPEG it also +specifies the progression parameters Ss,Se,Ah,Al for the scan. Scan +definitions are separated by semicolons (';'). A semicolon after the last +scan definition is optional. + +Each scan definition contains one to four component indexes, optionally +followed by a colon (':') and the four progressive-JPEG parameters. The +component indexes denote which color component(s) are to be transmitted in +the scan. Components are numbered in the order in which they appear in the +JPEG SOF marker, with the first component being numbered 0. (Note that these +indexes are not the "component ID" codes assigned to the components, just +positional indexes.) + +The progression parameters for each scan are: + Ss Zigzag index of first coefficient included in scan + Se Zigzag index of last coefficient included in scan + Ah Zero for first scan of a coefficient, else Al of prior scan + Al Successive approximation low bit position for scan +If the progression parameters are omitted, the values 0,63,0,0 are used, +producing a sequential JPEG file. cjpeg automatically determines whether +the script represents a progressive or sequential file, by observing whether +Ss and Se values other than 0 and 63 appear. (The -progressive switch is +not needed to specify this; in fact, it is ignored when -scans appears.) +The scan script must meet the JPEG restrictions on progression sequences. +(cjpeg checks that the spec's requirements are obeyed.) + +Scan script files are free format, in that arbitrary whitespace can appear +between numbers and around punctuation. Also, comments can be included: a +comment starts with '#' and extends to the end of the line. For additional +legibility, commas or dashes can be placed between values. (Actually, any +single punctuation character other than ':' or ';' can be inserted.) For +example, the following two scan definitions are equivalent: + 0 1 2: 0 63 0 0; + 0,1,2 : 0-63, 0,0 ; + +Here is an example of a scan script that generates a partially interleaved +sequential JPEG file: + + 0; # Y only in first scan + 1 2; # Cb and Cr in second scan + +Here is an example of a progressive scan script using only spectral selection +(no successive approximation): + + # Interleaved DC scan for Y,Cb,Cr: + 0,1,2: 0-0, 0, 0 ; + # AC scans: + 0: 1-2, 0, 0 ; # First two Y AC coefficients + 0: 3-5, 0, 0 ; # Three more + 1: 1-63, 0, 0 ; # All AC coefficients for Cb + 2: 1-63, 0, 0 ; # All AC coefficients for Cr + 0: 6-9, 0, 0 ; # More Y coefficients + 0: 10-63, 0, 0 ; # Remaining Y coefficients + +Here is an example of a successive-approximation script. This is equivalent +to the default script used by "cjpeg -progressive" for YCbCr images: + + # Initial DC scan for Y,Cb,Cr (lowest bit not sent) + 0,1,2: 0-0, 0, 1 ; + # First AC scan: send first 5 Y AC coefficients, minus 2 lowest bits: + 0: 1-5, 0, 2 ; + # Send all Cr,Cb AC coefficients, minus lowest bit: + # (chroma data is usually too small to be worth subdividing further; + # but note we send Cr first since eye is least sensitive to Cb) + 2: 1-63, 0, 1 ; + 1: 1-63, 0, 1 ; + # Send remaining Y AC coefficients, minus 2 lowest bits: + 0: 6-63, 0, 2 ; + # Send next-to-lowest bit of all Y AC coefficients: + 0: 1-63, 2, 1 ; + # At this point we've sent all but the lowest bit of all coefficients. + # Send lowest bit of DC coefficients + 0,1,2: 0-0, 1, 0 ; + # Send lowest bit of AC coefficients + 2: 1-63, 1, 0 ; + 1: 1-63, 1, 0 ; + # Y AC lowest bit scan is last; it's usually the largest scan + 0: 1-63, 1, 0 ; + +It may be worth pointing out that this script is tuned for quality settings +of around 50 to 75. For lower quality settings, you'd probably want to use +a script with fewer stages of successive approximation (otherwise the +initial scans will be really bad). For higher quality settings, you might +want to use more stages of successive approximation (so that the initial +scans are not too large). diff --git a/src/3rdparty/libjpeg/wrjpgcom.1 b/src/3rdparty/libjpeg/wrjpgcom.1 new file mode 100644 index 0000000000..d419a99993 --- /dev/null +++ b/src/3rdparty/libjpeg/wrjpgcom.1 @@ -0,0 +1,103 @@ +.TH WRJPGCOM 1 "15 June 1995" +.SH NAME +wrjpgcom \- insert text comments into a JPEG file +.SH SYNOPSIS +.B wrjpgcom +[ +.B \-replace +] +[ +.BI \-comment " text" +] +[ +.BI \-cfile " name" +] +[ +.I filename +] +.LP +.SH DESCRIPTION +.LP +.B wrjpgcom +reads the named JPEG/JFIF file, or the standard input if no file is named, +and generates a new JPEG/JFIF file on standard output. A comment block is +added to the file. +.PP +The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. +Although the standard doesn't actually define what COM blocks are for, they +are widely used to hold user-supplied text strings. This lets you add +annotations, titles, index terms, etc to your JPEG files, and later retrieve +them as text. COM blocks do not interfere with the image stored in the JPEG +file. The maximum size of a COM block is 64K, but you can have as many of +them as you like in one JPEG file. +.PP +.B wrjpgcom +adds a COM block, containing text you provide, to a JPEG file. +Ordinarily, the COM block is added after any existing COM blocks; but you +can delete the old COM blocks if you wish. +.SH OPTIONS +Switch names may be abbreviated, and are not case sensitive. +.TP +.B \-replace +Delete any existing COM blocks from the file. +.TP +.BI \-comment " text" +Supply text for new COM block on command line. +.TP +.BI \-cfile " name" +Read text for new COM block from named file. +.PP +If you have only one line of comment text to add, you can provide it on the +command line with +.BR \-comment . +The comment text must be surrounded with quotes so that it is treated as a +single argument. Longer comments can be read from a text file. +.PP +If you give neither +.B \-comment +nor +.BR \-cfile , +then +.B wrjpgcom +will read the comment text from standard input. (In this case an input image +file name MUST be supplied, so that the source JPEG file comes from somewhere +else.) You can enter multiple lines, up to 64KB worth. Type an end-of-file +indicator (usually control-D) to terminate the comment text entry. +.PP +.B wrjpgcom +will not add a COM block if the provided comment string is empty. Therefore +\fB\-replace \-comment ""\fR can be used to delete all COM blocks from a file. +.SH EXAMPLES +.LP +Add a short comment to in.jpg, producing out.jpg: +.IP +.B wrjpgcom \-c +\fI"View of my back yard" in.jpg +.B > +.I out.jpg +.PP +Attach a long comment previously stored in comment.txt: +.IP +.B wrjpgcom +.I in.jpg +.B < +.I comment.txt +.B > +.I out.jpg +.PP +or equivalently +.IP +.B wrjpgcom +.B -cfile +.I comment.txt +.B < +.I in.jpg +.B > +.I out.jpg +.SH SEE ALSO +.BR cjpeg (1), +.BR djpeg (1), +.BR jpegtran (1), +.BR rdjpgcom (1) +.SH AUTHOR +Independent JPEG Group diff --git a/src/3rdparty/libmng.pri b/src/3rdparty/libmng.pri new file mode 100644 index 0000000000..7b682100ee --- /dev/null +++ b/src/3rdparty/libmng.pri @@ -0,0 +1,25 @@ +DEFINES += MNG_BUILD_SO +DEFINES += MNG_NO_INCLUDE_JNG +INCLUDEPATH += $$PWD/libmng +SOURCES += \ + $$PWD/libmng/libmng_callback_xs.c \ + $$PWD/libmng/libmng_chunk_io.c \ + $$PWD/libmng/libmng_chunk_descr.c \ + $$PWD/libmng/libmng_chunk_prc.c \ + $$PWD/libmng/libmng_chunk_xs.c \ + $$PWD/libmng/libmng_cms.c \ + $$PWD/libmng/libmng_display.c \ + $$PWD/libmng/libmng_dither.c \ + $$PWD/libmng/libmng_error.c \ + $$PWD/libmng/libmng_filter.c \ + $$PWD/libmng/libmng_hlapi.c \ + $$PWD/libmng/libmng_jpeg.c \ + $$PWD/libmng/libmng_object_prc.c \ + $$PWD/libmng/libmng_pixels.c \ + $$PWD/libmng/libmng_prop_xs.c \ + $$PWD/libmng/libmng_read.c \ + $$PWD/libmng/libmng_trace.c \ + $$PWD/libmng/libmng_write.c \ + $$PWD/libmng/libmng_zlib.c + +include($$PWD/zlib_dependency.pri) diff --git a/src/3rdparty/libmng/CHANGES b/src/3rdparty/libmng/CHANGES new file mode 100644 index 0000000000..eeacf33246 --- /dev/null +++ b/src/3rdparty/libmng/CHANGES @@ -0,0 +1,1447 @@ +----------------------------------------------------------- + +1.0.10 (Jul 13th 2007) +---------------------- + +in short: + +intermediate CVS + +------------------- + +bugfixes: + +core: +- fixed some compiler-warnings +- fixed display routines called twice for FULL_MNG support in mozlibmngconf.h +- standard windows dll upgraded to zlib 1.2.3 +- fixed problem with CLON object during readdisplay() (thanks Winfried!) +- added typecast to appease the compiler (G R-P) +- added more SKIPCHUNK conditionals (G R-P) +- added MORE MNG_NO_1_2_4BIT_SUPPORT (G R-P) +- added provisional support for anIM(mpNG) proposal +- added provisional support for ANG proposal + +samples: +- xmngview upgraded to 0.6 (thanks Winfried!) + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.9 (jan 30th 2005) +--------------------- + +in short: + +New optimizations save over 20KB on footprint. +Also a few bugfixes and several patches. + +Thanks to those sending in their additions and for testing! + +To turn on the optimizations do: + +#DEFINE MNG_OPTIMIZE_CHUNKINITFREE +#DEFINE MNG_OPTIMIZE_OBJCLEANUP +#DEFINE MNG_OPTIMIZE_CHUNKASSIGN +#DEFINE MNG_OPTIMIZE_CHUNKREADER + +(eg. they're not on by default (yet) !) + +------------------- + +bugfixes: +- fixed chunk pushing mechanism +- fixed bug in writing sBIT for indexed color +- fixed PPLT getchunk/putchunk routines +- fixed MNG_NO_1_2_4BIT_SUPPORT for TBBN1G04.PNG +- cleaned up macro-invocations (thanks to D. Airlie) + +core: +- added more SKIPCHUNK conditionals +- replaced MNG_TWEAK_LARGE_FILES with permanent solution +- improved handling of cheap transparency when 16-bit support is disabled +- added some MNG_SUPPORT_WRITE conditionals +- added function to retrieve current FRAM delay +- added MNG_NO_1_2_4BIT_SUPPORT +- added bgr565_a8 canvas-style (thanks to J. Elvander) +- standard windows dll upgraded to zlib 1.2.2 +- added LITTLEENDIAN/BIGENDIAN fixtures (thanks J.Stiles) +- inclusion of zlib/lcms/ijgsrc6b with <> instead of "" +- added conditional MNG_OPTIMIZE_CHUNKINITFREE +- added conditional MNG_OPTIMIZE_OBJCLEANUP +- added conditional MNG_OPTIMIZE_CHUNKASSIGN +- added conditional MNG_OPTIMIZE_CHUNKREADER +- fixed problem with global PLTE/tRNS + +samples: + +contrib: + +doc: +- patched jng & mng manual pages (Thanks Peter Breitenlohner) + +makefiles: + +autoconf: +- patched makefile.am & configure.in (Thanks Peter Breitenlohner) + +----------------------------------------------------------- + +1.0.8 (aug 5th 2004) +-------------------- + +in short: + +added special data-pushing mechanisms and a few other tid-bits + +------------------- + +bugfixes: +- fixed problem with PAST usage where source > dest + +core: +- added missing get-/put-chunk-jdaa +- added CRC existence & checking flags +- added data-push mechanisms for specialized decoders +- some speed optimizations (thanks to John Stiles) +- defend against using undefined closestream function +- defend against using undefined openstream function +- added check for extreme chunk-lengths +- change worst-case iAlphadepth to 1 for standalone PNGs +- added support for 3+byte pixelsize for JPEG's +- added conditional to allow easier writing of large MNG's + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.7 (March 21st 2004) +----------------------- + +in short: + +A bunch of new canvas-styles, some bug-fixes, upgraded to latest zlib/lcms +and yet more work to please the Mozilla crowd. +Releasing beta's doesn't seem very responsive, and this one's hardly changed +much anyway. I just wanted to bump to a regular version for Mozilla +re-integration. + +------------------- + +bugfixes: +- fixed inclusion of IJNG chunk for non-JNG use (J.S) +- fixed bug in chunk-storage of SHOW chunk (where from == to) +- fixed bug in promote_g8_g8 with 16bit support off + +core: +- added CANVAS_RGB565 and CANVAS_BGR565 (big thanx to Raphael Assenat!!) +- added CANVAS_RGBA565 and CANVAS_BGRA565 ( -- ditto -- ) +- upgraded to zlib 1.2.1 +- upgraded to lcms 1.11 +- added premultiplied alpha canvas' for RGBA, ARGB, ABGR (thx to John Stiles) +- more optimizations with 16bit support off +- put conditionals around openstream/closestream callbacks. +- fixed typo (MNG_SKIPCHUNK_SAVE -> MNG_SKIPCHUNK_nEED) +- fixed some 64-bit platform compiler warnings + +samples: + +contrib: +- fixed mngtree sample (Raphael) +- added 5-6-5 canvas to SDL sample (Raphael) + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.6 (oct 19th 2003) +--------------------- + +in short: + +Final release from beta1. No feedback is good feedback I presume, +so here's 1.0.6-final! + + +------------------- + +bugfixes: + +core: + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.6-beta1 (sep 14th 2003) +--------------------------- + +in short: + +further footprint-reductions +removing email-addresses + +1.0.6 (final) will be out shortly + +------------------- + +bugfixes: + +core: +- added support for reducing the footprint of libmng by macros that optionally + skip unused chunks, remove 16-bit sample support, remove Delta support, and + remove JNG support, to accomodate Mozilla/Firebird. +- further optional removal of unused functions +- added MNG_NO_SUPPORT_FUNCQUERY conditional +- added iPNGdepth member to pData structure +- added conditionals around MAGN chunk support +- added conditionals around non-VLC chunk support +- added conditionals around "mng_display_go*" and other unused functions +- added more conditionals around "promote" functions +- removed email references as appropriate + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.6-alpha1 (aug 2nd 2003) +--------------------------- + +in short: + +This is mostly in the light of footprint-reduction to please the Mozilla +crew with a leaner and meaner libmng. See bug 18574 if you're interested: +http://bugzilla.mozilla.org/show_bug.cgi?id=18574 + +------------------- + +bugfixes: +- B719420 - fixed several MNG_APP_CMS problems + +core: +- removed some compiler-warnings +- hiding 12-bit JPEG stuff +- fixed problem with infinite loops during readdisplay() +- added size-optimiation COMPOSE routine usage +- added conditionals around canvas update routines +- added MNG_SKIPCHUNK_cHNK footprint optimizations +- added conditionals around some JNG-supporting code +- added conditionals around 16-bit supporting code +- combined init functions into one function +- replaced nested switches with simple init setup function +- added conditionals zlib and jpeg property accessors +- added size-optimization DIV255B8 routine usage +- added conditionals around 8-bit magn routines +- removed conditionals around 8-bit magn routines +- added MNG_NO_16BIT_SUPPORT and MNG_NO_DELTA_PNG conditionals +- reversed many loops to use decrementing counter +- converted some switches to array references +- removed some redundant checks for iRawlen==0 +- optionally use zlib's crc32 function instead of local mng_update_crc +- bugfix empty "if" statement when 16-bit code is enabled +- restored two misplaced #else/#endif blocks +- added conditionals around "mng_display_go*" and other unused functions +- added MNG_NO_LOOP_SIGNALS_SUPPORTED conditional +- fixed duplicate for-loop +- fixed invalid test in promote_imageobject +- added conditionals around PAST chunk support +- fixed "FOOTPRINT_COMPOSEIV" typo (now "FOOTPRINT_DIV") + +samples: + +contrib: +- updated xmngview +- added MSVC project for creating delta-MNGs: makemng (thanks Alex!) +- added MSVC lib-file for use with the standard libmng.dll (again thanks Alex) + +doc: +- updated readme.contrib + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.5 (mar 1st 2003) +-------------------- + +in short: + +Only a small fix for progressive jpeg suspension problem. + +This is the long-awaited final release containing the new 'dynamic MNG' feature +and bringing MNG compliance to near 100%! + +------------------- + +bugfixes: +- B683152 - libjpeg suspension not always honored correctly + +core: + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.5-rc3 (jan 20th 2003) +------------------------- + +in short: + +Third release-candidate for the upcoming 1.0.5 version. + +Minor bug-fixes and finalizing the accepted proposal (by official vote) for +the TERM/frame_delay changes on mng-list (nov-dec/2002). + +------------------- + +bugfixes: +- B654627 - fixed SEGV when no gettickcount callback (thanks Adam!) +- B664383 - fixed typo (thanks Dimitri) +- B664911 - fixed buffer overflow during init (thanks Alex!) + +core: +- finalized changes in TERM/final_delay to elected proposal (positive vote) + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.5-rc2 (dec 9th 2002) +------------------------ + +in short: + +Second release-candidate for the upcoming 1.0.5 version. +This contains fixes for a few minor details reported by the loyal testers. +It fixes some issues with the goframe/golayer/gotime processing and related +stuff. And it adds a way to disable playback-caching from within the MNG, +which is very useful for streaming-MNG encoders (such as gserver!). + +------------------- + +bugfixes: + +core: +- fixed layer- & frame-counting during read() +- changed FRAMECOUNT/LAYERCOUNT/PLAYTIME error to warning +- fixed goframe/golayer/gotime processing +- added support for nEED "MNG 1.1" +- added support for nEED "CACHEOFF"; turn playback caching off for streaming MNG +- fixed magnification bug with object 0 +- added support to get totals for frames/layers/playtime after mng_read() +- fixed some issues in init_app_cms() +- fixed goxxxxx() support for zero values + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.5-rc1 (nov 1st 2002) +------------------------ + +in short: + +First release-candidate for the upcoming 1.0.5 version. +This fixes a few small problems and brings the TERM/MEND processing, with +respect to interframe_delay as per the current discussion on MNG-list, +up-to-date with the latest proposal. + +------------------- + +bugfixes: + +core: +- fixed initialization of pIds in dISC read routine (Thanks Winfried!) +- fixed issue in freeing evNT chunk (Thanks Winfried!) +- fixed clipping-problem with BACK tiling (Thanks Sakura!) +- fixed processing for multiple objects in MAGN (Thanks Sakura!) +- fixed display of visible target of PAST operation (Thanks Sakura!) +- modified TERM/MEND processing for max(1, TERM_delay, interframe_delay) + +samples: + +contrib: +- fixed typo in Makefile for gtk-mng-view sample + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.5-b3 (oct 15th 2002) +------------------------ + +in short: + +Fairly quick after beta2, since that introduced a couple of unfortunate +booboo's and wasn't very workable. It also changes the standard configure +script to build a standard shared object similar to what I intended. + +------------------- + +bugfixes: + +core: +- fixed support for condition=2 in TERM chunk +- fixed trace-constants for PAST chunk +- added mng_status_dynamic to supports function + +samples: + +contrib: + +doc: +- small cosmetic changes in man/libmng.3 + +makefiles: + +autoconf: +- fixed configure.in to build a 'standard' SO primarily + +----------------------------------------------------------- + +1.0.5-b2 (oct 9th 2002) +------------------------ + +in short: + +Second beta for next 1.0.5 release. This addresses some minor problems +detected during testing. It adds the proposed change to the MNG spec as +discussed on the "mng-list" recently; eg. Adam's option 4. +And it adds a little function to check at run-time if the lib is a beta or not. + +------------------- + +bugfixes: + +core: +- fixed chunk-storage for evNT chunk +- fixed dropping mix of frozen/unfrozen objects +- fixed problem with cloned objects marked as invalid +- fixed problem cloning frozen object_buffers +- fixed DISC support +- added proposed change in handling of TERM- & interframe-delay +- added another fix for misplaced TERM chunk +- added check for TERM placement during create/write +- completed support for condition=2 in TERM chunk +- added beta version function & constant + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.5-b1 (sep 24th 2002) +------------------------ + +in short: + +First beta of a large maintenance release. This completes support of the MNG +specification to nearly 100% (PAST, PROM, delta-images, BACK image+tile). +It adds "dynamic" MNG and a few other neat routines as well as fixes several +bugs reported through SourceForge or to me directly. + +------------------- + +bugfixes: +- B575832 - library has wrong patch version number +- B578572 - remove in 1.0.0! +- B578940 - some functions not implemented +- B581625 - large chunks fail with suspension reads +- B597134 - libmng pollutes the linker namespace + +core: +- added sanity check for improbable chunklengths +- removed eMNGma hack (thanks Dimitri!) +- unimplemented functions return an errorcode now +- added test-option for PNG filter method 192 (= levelling) +- added test-option for PNG filter method 193 (= no filtering) + (both are conditional and only for testing purposes!!!) +- completed PROM support +- completed delta-image support +- completed MAGN support (16-bit functions) +- added HLAPI function to copy a chunk from a read MNG to a newly created MNG +- added option for soft-handling of errors (only for repair software!!!) +- fixed some routine inclusion/exclusion for undefined conditionals +- pre-fixed all internal routines with mng_ +- added symbol MNG_LOCAL (= static) to really local functions +- fixed reading of FRAM with just frame_mode and name +- fixed read/write of MAGN chunk +- added event handling for dynamic MNG +- added 'supports' call to check function availability +- fixed copyright notice in the headers of all libmng modules +- fixed LOOP iteration=0 special case +- re-compiled standard Windows dll with lcms-1.0.9 +- added warning for too much IDAT data +- warnings are ignored by default now +- misplaced TERM is now treated as warning +- fixed color-correction for restore-background handling +- optimized restore-background for bKGD cases +- cleaned up some old stuff +- completed support for BACK image & tiling +- completed support for PAST +- added bgrx8 canvas (filler byte) +- fixed reset_object_detail to clear old buffer +- added in-memory color-correction of abstract images +- added compose over/under routines for PAST processing +- added flip & tile routines for PAST processing + +samples: +- Added new BCB sample for fixing invalid JASC Animation Shop files + (shows new copy_chunks function; use of MNG_SOFTERRORS & static linking) + +contrib: +- added xmngview by Winfried Szukalski (Vielen dank!) +- Updated the Delphi mngview sample to handle dynamic MNGs +- Added Kylix example (simplified port of the Delphi mngview sample) + +doc: +- added diff to add MNG&JNG to a systems 'magic' file (Thanks Winfried) +- fixed docs about using mng_display_resume after display_reset + (should read to use mng_display!) + +makefiles: +- added makefile to build a libmng.dll for MingW + (makefile.mingwdll - thanks to Frank Richter!) + +autoconf: +- fixing libtool version-number to be in line with what it should be + +----------------------------------------------------------- + +1.0.4 (Jun 23rd 2002) +--------------------- + +in short: + +Just some small fixes +Standard dll now compiled with zlib 1.1.4 and lcms 1.0.8 + +------------------- + +bugfixes: +- B495442 - invalid returnvalue in mng_get_suspensionmode +- B495443 - incorrect suspend check in read_databuffer +- B526138 - returned IJGSRC6B calling convention to default for MSVC +- B558212 - off by one error +- B557677 - can't find lcms.h + +core: +- fixed possible compile-problem in cleanup_rowproc +- MNG subimage alpha composite wrong for rgba8 images + +samples: + +contrib: + +doc: + +makefiles: +- fixed check for lcms.h in configure.in + +autoconf: + +----------------------------------------------------------- + +1.0.3 (Sep 18th 2001) +--------------------- + +in short: + +Small cosmetic changes. Cleaning up the contributions. +New makefile for mingw32, and new fbcon example. +Major thanks to Greg for helping out with the *nix stuff! +Note that there's also a separate download for ASM programmers now. +Check http://www.libmng.com for details (download/ports&packages page). + +It may be a while for the next release. I'm "off duty" for the next 8 or +so months... + +Gerard + +------------------- + +bugfixes: +- B459058 - wrong include for lcms headers + +core: +- changed inclusion of lcms.h header for Linux platforms (suggested by Greg) +- added get function for last processed BACK chunk + +samples: +- replaced the gtk & sdl viewer apps with updates by Greg Roelofs + +contrib: + +doc: + +makefiles: +- changed makefile.linux & makefile.unix as suggested by Greg Roelofs + (makefile.linux now compiles with lcms by default) +- added makefile.mingw for mingw32 by Benoit Blanchon (thanks Mate!) + +autoconf: + +----------------------------------------------------------- + +1.0.2 (Jul 7th 2001) +-------------------- + +in short: + +Another maintenance release with a few added extra's. + +------------------- + +bugfixes: +- B421427 - writes wrong format in bKGD and tRNS +- B434583 - compiler-warning if MNG_STORE_CHUNKS undefined + +core: +- added optimization option for MNG-video playback +- added processterm callback +- added late binding errorcode (not used internally) +- fixed memory-leak with delta-images (Thanks Michael!) +- added option to turn off progressive refresh for large images + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.1 (May 2nd 2001) +-------------------- + +in short: + +Maintenance release. +Fixed several memory-leaks with the help of Gregg Kelly, added/fixed some CMS +handling, exported JPEG functions from standard DLL, and some other minor fixes. + +The CMS fix now makes libmng automagically work in MNG_FULL_CMS mode as a +sRGB compliant system. YOU WILL NEED TO CHANGE THIS IF YOU ARE NOT ON AN sRGB +COMPLIANT SYSTEM AND WANT TO USE CMS!!!! +(look in libmng.h for the proper function-calls) + +------------------- + +bugfixes: + +core: +- added MEND processing callback +- fixed first FRAM_MODE=4 timing problem +- added handle status-copy function (use with care) +- exported JPEG functions from standard DLL +- added BGRA8 canvas with premultiplied alpha (contrib by Gregg Kelly) +- fixed problem with display_reset/display_resume (Thanks Gregg!) +- fixed several memory-leaks (Thanks Gregg!) +- fixed reset_rundata to drop all objects (Thanks again, Gregg!) +- fixed problem with cms profile being created multiple times when both + iCCP & cHRM/gAMA are present (And again... Gregg) +- moved mng_clear_cms to libmng_cms +- added "default" sRGB generation (Thanks Marti!) + +samples: + +contrib: + +doc: + +makefiles: + +autoconf: + +----------------------------------------------------------- + +1.0.0 (Feb 6th 2001) +-------------------- + +in short: + +First public release. Finally(!) + +This is the 0.9.5 CVS version, which will never be released, because I feel it +is now ready for a public release. So apart from the version-numbers here and +there, all other changes are listed under 0.9.5. + +This library will work with every MNG/JNG known and available to me. Note that +there are still parts that need to be coded, and that MNG support is around +90-95% (JNG at 100%). It is however compliant with the latest and greatest +MNG 1.0 specification. + +I hope to dedicate a bit more time this year to finish up full support and fill +in the remaining blanks. But this is coming out of my spare time. And extra +help is always appreciated. + +Please enjoy! + +Gerard + +----------------------------------------------------------- + +0.9.5 (no release) +------------------ + +in short: + +intermediate CVS + +------------------- + +bugfixes: +B129681 - fixed compiler warnings SGI/Irix (thanks Dimitri) + +core: +- fixed compiler-warnings Mozilla (thanks Tim) +- fixed timing-problem with switching framing_modes +- fixed some small compiler warnings (thanks Nikki) + +samples: + +contrib: +- fixed library-paths for MSVC DLL project (thanks Chad) + +doc: + +makefiles: +- added makefile for DJGPP (thanks Silvio) + +autoconf: + +----------------------------------------------------------- + +0.9.4 (Jan 19th 2001) +---------------------- + +in short: + +Now that the MNG spec is at 1.0, this should be the last beta. There's a few +small changes to make it inline with the spec, and a couple of bug-fixes. +This is a serious release-candidate for libmng-1.0!! +Please... test test test test!! + +------------------- + +bugfixes: +B123314 - fixed number of TERM related problems +B123322 - fixed unwanted repetition in mng_readdisplay() +B123443 - fixed by Ralph +B124910 - fixed definition for WIN32_LEAN_AND_MEAN (thanks Chad) +B125750 - fixed by Ralph +B125756 - fixed mixup of data- & function-pointers (thanks Dimitri) +B127517 - changed inclusion of the lcms header file for non-windows platforms + +core: +- version numbers +- fixed possible loop in display_resume() (Thanks Vova!) +- fixed unwanted repetition in mng_readdisplay() +- changed inclusion of the lcms header file for non-windows platforms +- changed IHDR filter_method check for PNGs +- moved restore of object 0 to libmng_display +- added restore of object 0 to TERM processing (B123314) +- fixed TERM delay processing (B123314) +- fixed TERM end processing when count = 0 (B123314) +- changed callback convention for MSVC (Thanks Chad) +- fixed mixup of data- & function-pointers (thanks Dimitri) +- added support for "nEED MNG-1.0" +- added errorcode for MAGN methods +- added errorchecking for MAGN methods +- removed "old" MAGN methods 3 & 4 +- added "new" MAGN methods 3, 4 & 5 +- removed test filter-methods 1 & 65 +- set default level-set for filtertype=64 to all zeroes + +samples: + +contrib: +- added GTK mng-view example by Vova Babin +- added MSVC MNGview sample by Nikolaus Brennig +- updated Jason Summer's mngplg to version 0.9.2 + (that's mngplg-0.9.2 based on libmng-0.9.3 !!!) +- rearranged contrib directory slightly +- added MSVC project to build libmng.dll by Chad Austin + +doc: +- added README.dll +- added README.config + +makefiles: +- added a makefile for MS Visual C++ (Thanks to Atsushi Matsuda) + +autoconf: +- fixed configure.in for lcms (FreeBSD port by Mikhail Teterin) +- by default configure includes CMS support if lcms is present + +----------------------------------------------------------- + +0.9.3 (October 29th 2000) +------------------------- + +in short: + +Another beta release. The number of changes in the MNG specification have +resulted in a lot of new code and some changed code. At the same time I saw +no need to withhold some new functionality as it was pretty clear there was +going to be another beta-round. If things go well, I'm going to try to release +libmng 1.0.0 very shortly after this one. + +Many thanks to a lot of people for helping out, sending contributions, making +suggestions and testing this little baby. This would get nowhere without YOU!!! + +- fixed bug 111300/117103 +- added workaround for faulty PhotoShop iCCP chunk +- added MAGN/JDAA chunks +- added support for new filter_types +- added PNG/MNG spec version indicators +- added BCB mngview contribution by Andy Protano +- added BCB mngdump; a GUI-based MNG dumping utility (Andy Protano) +- implemented support for nEED "draft nn" +- implemented app-defined support for bKGD for PNG images +- removed trace-options from default SO/DLL builds (!!!) +- raised initial maximum canvas size to 10000x10000 (!!!) + (an App that wants to protect from overly large images should call + mng_set_maxcanvassize() with appropriate values) +- fixed other assorted stuff + +------------------- + +bugfixes: +B111300 - fixup for improved portability +B117103 - fixed compilation errors on *nix with lcms (thanks Ralph!) + +core: +- fixed compiler-warnings from Mozilla +- added check for simplicity-bits in MHDR +- added workaround for faulty PhotoShop iCCP chunk +- fixed app-supplied background restore +- fixed TERM processing delay of 0 msecs +- fixed write-code for zTXt & iTXt +- fixed read-code for iTXt +- added MAGN chunk +- fixed sRGB precedence for gamma_only corection +- added support for new filter_types +- fixed problem with no refresh after TERM +- fixed DEFI behavior +- fixed inclusion parameters to make the external libs work together +- added export of zlib functions from windows dll +- fixed timing & refresh behavior for single PNG/JNG +- removed trace-options from default SO/DLL builds (!!!) +- fixed MAGN rounding errors (thanks Matthias!) +- fixed small timing problem when FRAM delay = 0 +- fixed simplicity-check in compliance with draft 81/0.98a +- fixed alpha-blending for all alpha-canvasstyles +- added support for alpha-depth prediction +- fixed processing of unknown critical chunks +- removed test-MaGN +- added PNG/MNG spec version indicators +- implemented support for nEED +- added support for JDAA +- added functions to retrieve PNG/JNG specific header-info +- added optional support for bKGD for PNG images +- raised initial maximum canvas size to 10000x10000 +- added support for delta-JNG +- added callback to process non-critical unknown chunks +- fixed support for delta-images during read() / display() +- added closestream() processing for mng_cleanup() +- fixed delta-processing behavior +- added storage for pixel-/alpha-sampledepth for delta's +- implemented delayed delta-processing +- fixed putchunk_plte() to set bEmpty parameter (thanks Ben!) +- added errorcode for delayed delta-processing +- added get/set for bKGD preference setting +- added get function for interlace/progressive display +- fixed bug in empty PLTE handling +- fixed seperate read() & display() processing +- fixed tRNS processing for gray-image < 8-bits + +samples: +- added BCB mngview contribution by Andy Protano + +contrib: +- added BCB mngdump; a GUI-based MNG dumping utility (Andy Protano) + +doc: +- updated RPM spec-file by MATSUURA Takanori +- updated README.contrib + +makefiles: +- fixed some stuff in automake/autoconf/libtool +- fixed auto* for bug B117103 + +----------------------------------------------------------- + +0.9.2 (August 7th 2000) +----------------------- + +in short: + +Third beta release! Last one??? + +!!IMPORTANT!! All file-names are now prefixed with "libmng_" !!IMPORTANT!! + +Many thanks to Albert Chin-A-Young for his contribution of the +autoconf/automake/libtool stuff and to Ralph Giles for helping me +put it in the right places. + +There's a special README.autoconf so please read it! + +- fixed bug 110320/110546/110547/111096 +- added several status retrieval functions +- fixed other small bugs in display processing +- fixed number of small problems and documentation typos +- added autoconf/automake/libtool +- added latest MNG plugin (0.9.0) by Jason Summers + +------------------- + +bugfixes: +B110320 - fixed GCC warning about mix-sized pointer math +B110546 - fixed for improperly returning UNEXPECTEDEOF +B110547 - fixed bug in interlace code +B111096 - fixed large-buffer read-suspension + +core: +- version numbers +- fixed small bugs in display processing +- removed Nextbackxxx fields (no longer used) +- fixed problem with trace-functions improperly wrapped +- put specific code in add_chunk() inside MNG_SUPPORT_WRITE wrapper +- fixed documentation typos +- fixed wrapping of suspension parameters +- added status_xxxx functions +- added trace-codes/-strings for status_xxxxx functions +- changed file-prefixes +- added function to set simplicity field +- added trace-code/-string for updatemngsimplicity +- fixed putchunk_unknown() function + +samples: + +contrib: +- added latest MNG plugin (0.9.0) by Jason Summers + +doc: +- version numbers +- added autoconf readme +- version numbers in RPM stuff + +makefiles: +- fixed for new file-prefix +- added autoconf/automake/libtool + +----------------------------------------------------------- + +0.9.1 (July 26th 2000) +---------------------- + +in short: + +Second beta release. + +Given the enormous amount of bug-reports (not ;-), this will most likely +be one of the last betas. If things remain upright, the first public release +(1.0.0) is fairly eminent in the weeks to come... + +- added SDL mng player by Ralph Giles to contributions +- fixed timing and added internal buffering for I/O-suspension scenarios +- added get routines for internal display-state variables (frame/layer/playtime) +- changed read-processing for improved I/O-suspension (internal buffering) +- fixed several problems with create- & write-support +- added a load of documentation +- lots of small stuff + +------------------- + +bugfixes: + +core: +- fixed mandatory BACK color to be opaque +- changed mng_display_resume to allow to be called after a suspension + return with MNG_NEEDMOREDATA +- changed comments to indicate modified behavior for timer & suspension breaks +- added variables for go_xxxx processing +- implemented support for freeze/reset/resume & go_xxxx +- added trace-codes/-strings for special display processing +- added variables for improved timing support +- added support for improved timing +- added get routines for internal display variables +- added get/set routines for suspensionmode variable +- added trace-code/-string for get/set suspensionmode +- added trace-codes/-strings for get/set display variables +- added support for improved I/O-suspension +- changed read-processing for improved I/O-suspension +- added trace-code/-string for read_databuffer (I/O-suspension) +- added suspendbuffer constants +- changed EOF processing behavior +- fixed TERM delay processing +- changed pre-draft48 frame_mode=3 to frame_mode=1 +- added callbacks for SAVE/SEEK processing +- added trace-codes/-strings for SAVE/SEEK callbacks +- added variable for NEEDSECTIONWAIT breaks +- added trace-codes/-strings for get/set sectionbreaks +- added NEEDSECTIONWAIT error-code/-string +- added macro + routine to set returncode without calling error callback +- added trace-code/-string for special error routine +- changed default readbuffer size from 1024 to 4200 +- added variable for freeze & reset processing +- fixed storage of images during mng_read() +- fixed support for mng_display() after mng_read() +- added error cleanup processing +- fixed support for mng_display_reset() +- fixed suspension-buffering for 32K+ chunks +- added function to set frame-/layer-count & playtime +- added trace-code/-string for updatemngheader +- added error-code/-string for updatemngheader if not a MNG +- fixed creation-code +- fixed writing of signature +- fixed several chunk-writing routines + +samples: +- fixed the libmng.pas module in line with libmng.h + +contrib: +- added the SDL based mngplay viewer by Ralph Giles + +doc: +- extended the RPM contribution by MATSUURA Takanori +- added libmng.txt, a full description of the library and its usage +- added man-pages for mng(5), jng(5) and libmng(3) + +makefiles: + +----------------------------------------------------------- + +0.9.0 (June 30th 2000) +---------------------- + +in short: + +This is the first beta!!! Yippee!!! + +Thanks to all the people who helped to guide me in the right direction. +You know who you are! + +A special thanks to the guys with early implementations, who stood by and +put up with my whims :-) + +changes over 0.5.3: + +- updated mngplg to 0.4.1 (the latest & greatest) +- changed refresh parameters to 'x,y,width,height' + +----------------------------------------------------------- + +0.5.3 (never released) +---------------------- + +in short: + +This is a working version only; the next release will be 0.9.0 (first Beta!) + +There are a few incompatible changes with previous versions. The userdata +variable has been changed from mng_uint32 to mng_ptr to accomodate 64-bit +systems. For the same reason memory allocation size parameters have been +changed to a mng_size_t type which is a typedef of size_t. + +Thanks to Aleks Jakulin for helping to iron out some 64-bit platform issues! + +- implemented the update-region parameters of the refresh callback +- added support for most common delta-image options +- added an animation-speed modifier +- added an image-level parameter for the processtext callback +- updated mngplg to 0.4.0 (supports JNG, full CMS, and other enhancements!) +- fixed a lot of small things +- added support for PPLT chunk +- fixed to support 64-bit platforms + +------------------- + +bugfixes: + +core: +- added processing of color-info on delta-image +- fixed handling of empty SAVE chunk +- fixed display of stored JNG images +- fixed problem with BASI-IEND as object 0 +- changed the version parameters (obviously) +- added update-region parms for refresh calback +- added Needrefresh parameter +- added initialization of update-region for refresh +- added initialization of Needrefresh parameter +- changed progressive-display processing +- added tracecodes for tracing JPEG progression +- added tracing of JPEG calls +- added Deltaimmediate parm for faster delta-processing +- added extra checks for delta-images +- many changes to support delta-images +- optimized some store_xxx routines +- fixed some small things (as precaution) +- fixed possible trouble if IEND display-processing got broken up +- fixed nasty bug with embedded PNG after delta-image +- added processing of PLTE & tRNS for delta-images +- added processing of PLTE/tRNS & color-info for delta-images in the + ani_objects chain +- fixed problem with color-correction for stored images +- added get/set for speedtype to facilitate testing +- added trace-codes & -strings for get/set speedtype +- added speed-modifier to timing routine +- added get-routine of imagelevel for processtext callback +- added trace-code & -string for get imagelevel +- added administration of imagelevel parameter +- added support for PPLT chunk +- added trace-codes & -strings for PPLT chunk processing +- fixed problem with incorrect gamma-correction +- fixed inclusion of IJG read/write code +- fixed problem with 16-bit GA format +- fixed problem with cheap transparency for 4-bit gray +- fixed display_xxxx routines for interlaced images +- added precaution against faulty iCCP chunks from PS +- changed userdata variable to mng_ptr +- added typedef for mng_size_t +- changed size parameter for memory allocation to mng_size_t +- fixed compiler-warning for non-initialized iB variable +- changed definition for 32-bit ints (64-bit platforms) +- changed definition for mng_handle (64-bit platforms) +- swapped refresh parameters +- fixed initialization routine for new mng_handle type +- added inclusion of stdlib.h for abs() +- fixed some 64-bit warnings +- fixed incompatible return-types + +samples: + +contrib: +- updated mngplg to 0.3.0 (supports JNG & full color-correction!) +- updated mngplg to 0.4.0 (Jason is picking up the pace ;-) + +doc: +- added rpm directory with rpm spec-file (contributed by MATSUURA Takanori) + +makefiles: +- changed makefile.linux to reflect versionnr for shared-lib +- changed makefile.linux to depend on mng_conf.h & mng_types.h + +----------------------------------------------------------- + +0.5.2 (June 10th 2000) +---------------------- + +in short: + +This is the third release for developers +Another milestone since JNG is now fully supported +The next release will most likely be numbered 0.9.0 as the first Beta!! + +Fixed bug 106017 & 106019 +Added many constants regarding chunk-property values +Implemented full JNG support +Added all the error- & trace-strings +Added get/set routines for default ZLIB/IJG parameters +Added a generic makefile for Unix platforms (contributed by Tim Rowley) +Added canvasstyle for separate RGB + A canvas (eg. mozilla-style) +Separated configuration-options into a separate file: "mng_conf.h" +Fixed stuff for generic Unix compilation (contributed by Tim Rowley) +Upgraded to lcms1.0.6 (now supports 16-bit endian-peculiarities) +Added a makefile for Linux ELF & fixed some code-issues to go along with gcc +Added support for suspended input-buffer processing +Implemented the display-routines for RGBA/ARGB/BGRA/ABGR canvasstyles +Implemented the application background-restore functionality +Fixed & tested the mngtree Unix-sample (runs on Linux-RH6.2 with libmng.so) +Upgraded mngplg to v0.2.2 (based on the latest code including JNG) +Fixed a lot of other assorted stuff + +------------------- + +bugfixes: +B003(106017) - fixed problem with being proprietary to BCB +B004(106019) - fixed problem when MNG_SUPPORT_WRITE not defined + +core: +- bumped version-numbers up to 0.5.2 (yeah, really) +- fixed support for IJGSRC6B +- cleaned up some code regarding mixed support-options +- complemented constants for chunk-property values +- fixed MNG_UINT_pHYg value +- implemented JNG support +- fixed problem with DEFI clipping +- added error telltale strings & support +- added trace telltale strings & support +- added support for global color-chunks inside TERM/LOOP +- added support for global PLTE,tRNS,bKGD inside TERM/LOOP +- added default IJG compression parameters and such +- moved init of default zlib parms to "mng_hlapi.c" +- added init of default IJG parms +- added support for get/set of zlib/IJG default parms +- added tracestrings for global animation color-chunks +- added tracestrings for get/set of default ZLIB/IJG parms +- added tracestrings for global PLTE,tRNS,bKGD +- added framenr/layernr/playtime to object header +- added initialization of framenr/layernr/playtime +- changed ani_create calls not returning object pointer +- create ani objects always (not just inside TERM/LOOP) +- fixed inconsistancy with freeing global iCCP profile +- fixed minor bugs 16-bit pixel-handling +- added object promotion routine (PROM handling) +- added trace-codes & -strings for image-object promotion +- added trace-codes & -strings for delta-image processing +- added error-codes & -strings for delta-image processing +- added support for delta-image processing +- added ani-object routines for delta-image processing +- added delta-image fields +- added compression/filter/interlace fields to object-buffer for + delta-image processing +- added delta-image row-processing routines +- fixed up punctuation in several files (contributed by Tim Rowley) +- removed useless definition in "mng_chunks.h" (contributed by Tim Rowley) +- fixed pointer confusion in "mng_display.c" (contributed by Tim Rowley) +- fixed inclusion for memcpy (contributed by Tim Rowley) +- added mng_int32p (contributed by Tim Rowley) +- added internal delta-image processing callbacks +- separated configuration-options into "mng_conf.h" +- changed to most likely configuration +- added RGB8_A8 canvasstyle +- added getalphaline callback for RGB8_A8 canvasstyle +- fixed some makeup for Linux gcc compile +- implemented app bkgd restore routines +- implemented RGBA8, ARGB8, BGRA8 & ABGR8 display routines +- added support for RGB8_A8 canvasstyle +- added support for suspended input-buffer processing +- added mng_read_resume HLAPI function to support read-suspension +- fixed timer-handling to run with Mozilla (Tim Rowley) +- fixed alpha-handling for alpha canvasstyles +- fixed some compilation-warnings (contrib Jason Morris) + +samples: +- fixed mngview(delphi) to work with the new core +- synchronized libmng.pas(delphi) with the new libmng.h header +- removed the error- & trace-strings from libmng.pas(delphi) +- fixed mngtree(Unix) to compile on Linux (runs with libmng.so) +- added makefile.linux for mngtree(Unix) (tested on RedHat6.2) + +contrib: +- updated mngplg to 0.2.2 (based on latest code; supports JNG!) + +doc: +- this file obviously +- added Tim Rowley as contributing author +- changed the examples.readme doc +- updated the design-schematics in line with the current code + +makefiles: +- changed the directory to "makefiles" to avoid name-conflicts +- added generic Unix makefile (thanks to Tim Rowley) +- added Linux ELF makefile (tested on RedHat6.2) + +----------------------------------------------------------- + +0.5.1 May 16th 2000 +------------------- + +in short: + +This is the second release for developers +It's a bit of a milestone since all the chunk functionality is in place and +functioning (read, examine, create & write) +This version is incompatible with 0.5.0 since some of the callback prototypes +have changed (should be the last time that happens!) +There are a few more samples and even a real contribution! + +Fixed bug 105795 & 105797 +Fixed a mis-alignment in animation-timing +Added chunk-access functions +Finished all chunk-storage routine-bits +Finished all chunk-write routines +Changed the callback prototypes to allow error-reporting back to the library +Fixed some routines to allow for callback error-reporting +Added version-control functions & constants +Added two functions to set display- & sRGB-profile from memory +Moved CRC table to dynamic structure (for improved thread-safety) +Added SAVE & SEEK save&restore functionality +Finished the application-based CMS-callbacks +Fixed a few BCB specifics +Changed the Win32 DLL and samples to use __stdcall +Did some more assorted little changes +Added 2 BCB samples +Added 1 Unix sample +Added the MNG plugin by Jason Summers in the contrib section +Changed some documents to reflect these changes + +------------------- + +bugfixes: +B001(105795) - fixed wrong lcms call & memory-leak for gammatables +B002(105797) - fixed problem with missing sRGB profile + +core: +- changed chunk iteration function +- added chunk access functions +- added version control constants & functions +- changed strict-ANSI stuff +- added set_outputprofile2 & set_srgbprofile2 +- added empty-chunk put-routines +- added version_dll & VERSION_DLL (for consistency) +- added version control explanatory text & samples +- added iteratechunk callback definition +- improved definitions for DLL support +- added 8-bit palette definition +- added general array definitions +- added MNG_NULL definition +- changed most callback prototypes to allow the app + to report errors during callback processing +- added CRC table to main structure (for thread-safety) +- added iPLTEentries for checking hIST-length +- changed palette definition to exported palette-type +- removed frozen indicator +- added create/write indicators +- added eMNGma hack (will be removed in 1.0.0 !!!) +- added TERM animation object pointer (easier reference) +- added saved-data structure for SAVE/SEEK processing +- added some errorcodes +- added application errorcodes (used with callbacks) +- moved chunk-access errorcodes to severity 5 +- added chunk-access function trace-codes +- changed trace to macro for callback error-reporting +- added save_state & restore_state trace-codes +- put in some extra comments +- fixed layout for sBIT, PPLT +- changed write callback definition +- fixed layout for PPLT again (missed deltatype ?!?) +- cleaned up left-over teststuff in the BACK chunk routine +- changed CRC initialization to use dynamic structure + (wasn't thread-safe the old way !) +- filled in many missing sequence&length checks +- filled in many missing chunk-store snippets +- added checks for running animations +- filled remaining write routines +- fixed read_pplt with regard to deltatype +- added callback error-reporting support +- added pre-draft48 support (short MHDR, frame_mode, LOOP) +- fixed chunk-storage bit in several routines +- supplemented the SAVE & SEEK display processing +- added init of iPLTEcount +- changed calling-convention definition +- changed status-handling of display-routines +- added versioning-control routines +- filled the write routine +- fixed frame_delay misalignment +- added sanity check for frozen status +- changed display_mend to reset state to initial or SAVE +- added save_state and restore_state for SAVE/SEEK/TERM + processing +- added process_save & process_seek routines +- changed and filled iterate-chunk function +- added getchunk functions +- added putchunk functions +- added empty-chunk put-routines +- filled application-based color-management routines +- added creatememprofile +- filled the deflatedata routine +- added cleanup of saved-data (SAVE/SEEK processing) +- moved the actual write_graphic functionality from mng_hlapi.c + to it's appropriate function in the mng_write.c module +- moved standard header includes into mng_types.h + (stdlib/mem for mem-mngmt & math for fp gamma-calc) +- added getimgdata & putimgdata functions + +samples: +- fixed mngview(delphi) to work with the new core +- synchronized libmng.pas(delphi) with the new libmng.h header +- added mngtree(bcb) sample +- added bogus(bcb) sample +- added mngtree(unix) sample + +contrib: +- added mngplg 0.1.0 / a MNG plugin for Win32 by Jason Summers + +doc: +- added this changes.readme file +- changed the samples.readme doc accordingly +- changed the contrib.readme doc accordingly + +----------------------------------------------------------- + +0.5.0 May 1st 2000 +------------------ + +in short: + +This is the first developers release. +It's roughly about 60% done. diff --git a/src/3rdparty/libmng/LICENSE b/src/3rdparty/libmng/LICENSE new file mode 100644 index 0000000000..2b624c00a7 --- /dev/null +++ b/src/3rdparty/libmng/LICENSE @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* * * */ +/* * COPYRIGHT NOTICE: * */ +/* * * */ +/* * Copyright (c) 2000-2007 Gerard Juyn (gerard@libmng.com) * */ +/* * [You may insert additional notices after this sentence if you modify * */ +/* * this source] * */ +/* * * */ +/* * For the purposes of this copyright and license, "Contributing Authors" * */ +/* * is defined as the following set of individuals: * */ +/* * * */ +/* * Gerard Juyn * */ +/* * Glenn Randers-Pehrson * */ +/* * * */ +/* * The MNG Library is supplied "AS IS". The Contributing Authors * */ +/* * disclaim all warranties, expressed or implied, including, without * */ +/* * limitation, the warranties of merchantability and of fitness for any * */ +/* * purpose. The Contributing Authors assume no liability for direct, * */ +/* * indirect, incidental, special, exemplary, or consequential damages, * */ +/* * which may result from the use of the MNG Library, even if advised of * */ +/* * the possibility of such damage. * */ +/* * * */ +/* * Permission is hereby granted to use, copy, modify, and distribute this * */ +/* * source code, or portions hereof, for any purpose, without fee, subject * */ +/* * to the following restrictions: * */ +/* * * */ +/* * 1. The origin of this source code must not be misrepresented; * */ +/* * you must not claim that you wrote the original software. * */ +/* * * */ +/* * 2. Altered versions must be plainly marked as such and must not be * */ +/* * misrepresented as being the original source. * */ +/* * * */ +/* * 3. This Copyright notice may not be removed or altered from any source * */ +/* * or altered source distribution. * */ +/* * * */ +/* * The Contributing Authors specifically permit, without fee, and * */ +/* * encourage the use of this source code as a component to supporting * */ +/* * the MNG and JNG file format in commercial products. If you use this * */ +/* * source code in a product, acknowledgment would be highly appreciated. * */ +/* * * */ +/* ************************************************************************** */ +/* * * */ +/* * Parts of this software have been adapted from the libpng package. * */ +/* * Although this library supports all features from the PNG specification * */ +/* * (as MNG descends from it) it does not require the libpng package. * */ +/* * It does require the zlib library and optionally the IJG jpeg library, * */ +/* * and/or the "little-cms" library by Marti Maria (depending on the * */ +/* * inclusion of support for JNG and Full-Color-Management respectively. * */ +/* * * */ +/* * This library's function is primarily to read and display MNG * */ +/* * animations. It is not meant as a full-featured image-editing * */ +/* * component! It does however offer creation and editing functionality * */ +/* * at the chunk level. * */ +/* * (future modifications may include some more support for creation * */ +/* * and or editing) * */ +/* * * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/README b/src/3rdparty/libmng/README new file mode 100644 index 0000000000..a8e67cad53 --- /dev/null +++ b/src/3rdparty/libmng/README @@ -0,0 +1,36 @@ +libmng 1.0.10 +------------- + +Added provisional ANG and anIM support, and made some minor bugfixes. + +libmng 1.0.9 +------------ + +A number of optimizations in the chunk handling and reader/writer code. +This saves over 20KB on binary footprint! + +Also several bugfixes and a couple of patches bring it another step +closer to perfection.... :-) + +See CHANGELOG for details. + + +Y.T. + +Gerard + + +For more information please visit: + +The official libmng web-site: + http://www.libmng.com/ + +Libmng's community on SourceForge: + https://sourceforge.net/project/?group_id=5635 + +The official MNG homepage: + http://www.libpng.org/pub/mng/ + +The official PNG homepage: + http://www.libpng.org/pub/png/ + diff --git a/src/3rdparty/libmng/README.autoconf b/src/3rdparty/libmng/README.autoconf new file mode 100644 index 0000000000..753f7b4fde --- /dev/null +++ b/src/3rdparty/libmng/README.autoconf @@ -0,0 +1,213 @@ +********************************************************************** +********************************************************************** + + ***** this is unmaintained ***** + +If you happen to find problems with autoconfiguration and building, +I simply cannot help you. I'm looking for a maintainer that doesn't mind +spending a few minutes every now and then on the next release to make sure +things are still in working order. + +For the moment all autoconf stuff ahs been moved into unmaintained!! + +********************************************************************** +********************************************************************** + + + + +Configuration from CVS +====================== + +If you're using source checked out from CVS, rather than a source +distribution tarball, please be aware that you can use ./autogen.sh in +place of ./configure below. + +Because this is a cross-platform project, the source templates for +the autoconf scripts are sequestered in the 'makefiles' directory. +Running './autogen.sh' will copy them into their conventional places at +the lop level. If you already see the files there, you don't need to +worry about this step. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/src/3rdparty/libmng/README.config b/src/3rdparty/libmng/README.config new file mode 100644 index 0000000000..d5cd4541d0 --- /dev/null +++ b/src/3rdparty/libmng/README.config @@ -0,0 +1,104 @@ +Configuration options in libmng +=============================== + +The library is fairly configurable through the use of a number of defines. +Please note however that certain defines are for internal use only. +The following list gives a summary of options that can be used externally to +define the functionality of the library: + +======================================== + +#define MNG_BUILD_DLL + +This is used to indicate that a "standard" DLL should result from compiling +the library. Please note the remarks in README.dll if you intend to work +with the library as a DLL. The purpose of this option is to ensure that +DLL builds have the same set of functions. + +#define MNG_BUILD_SO + +This is used to indicate that a "standard" shared library (SO) should result +from a compilation. The purpose of this option is to ensure that all +shared libraries generated this way will have the same set of functions. + +#define MNG_USE_DLL / #define MNG_USE_SO + +These should be used when including the library header in the compilation +of an application to indicate that the compiler/linker must take the +necessary steps to make the binary executable to use the standard DLL +or shared library (SO). + +#define MNG_SKIP_ZLIB / #define MNG_SKIP_LCMS / #define MNG_SKIP_IJG6B + +Use these in conjunction with MNG_USE_DLL / MNG_USE_SO. This is useful if +you only need the external definitions of the MNG library and not the others, +which will speed up the compilation process. + +#define MNG_SUPPORT_FULL / #define MNG_SUPPORT_LC / #define MNG_SUPPORT_VLC + +These can be used to indicate the level of MNG spec compliance required. +Currently only full MNG compliance is supported. + +#define MNG_SUPPORT_IJG6B + +This can be used to indicate if JNG support is required. This option will +include the IJG JPEG-library. Note that MNG_SUPPORT_FULL will automatically +set this option. Use this only if you need JNG support with MNG-(V)LC. + +#define MNG_FULL_CMS / #define MNG_GAMMA_ONLY / #define MNG_NO_CMS / +#define MNG_APP_CMS + +These indicate the color-correction support level of the library. +If you are on a platform that supports lcms (Little CMS by Marti Maria Saguar) +then it is highly recommended to define MNG_FULL_CMS. +If your platform has it's own CMS then select MNG_APP_CMS and be sure to +include the appropriate callbacks in your app. +In all other cases it is recommended to define MNG_GAMMA_ONLY. + +#define MNG_SUPPORT_READ / #define MNG_SUPPORT_WRITE / +#define MNG_SUPPORT_DISPLAY + +These indicate the high-level support for reading, writing and/or +displaying files. Note that in order to display a file, you'll need to read +it first. (yes, really!) + +#define MNG_STORE_CHUNKS + +This indicates that the library should store chunk-information when reading +a file. This information can then be processed through the +MNG_ITERATE_CHUNKS() function. Note that you must specify this option if +you want to create and write a new file. + +#define MNG_ACCESS_CHUNKS + +This is used to indicate that the app may need access to internally stored +chunk information. MNG_STORE_CHUNKS must be defined as well for this option +to function properly. + +#define MNG_INTERNAL_MEMMNGMT + +You can use this to have the library handle it's own memory allocation and +deallocation through the "standard" memory functions. This option is turned +off by default, which means your app must define the memory callbacks. + +#define MNG_ERROR_TELLTALE + +Set this on to allow human-readable error-messages to be included in the +library and the error function and callback. + +#define MNG_BIGENDIAN_SUPPORTED + +This option should be used to indicate the hardware is based on big endian +integers. + +#define MNG_SUPPORT_TRACE / #define MNG_TRACE_TELLTALE + +These two can be used when debugging an app. You'll need to have the trace +callback setup also. This allows for a rather thorough investigation of the +libraries function paths. + +======================================== + +Any other optional defines you may encounter are for internal use only. +please do not specify them externally. In case of doubt, consult the +support email lists. More info can be found on http://www.libmng.com diff --git a/src/3rdparty/libmng/README.contrib b/src/3rdparty/libmng/README.contrib new file mode 100644 index 0000000000..9b287532a4 --- /dev/null +++ b/src/3rdparty/libmng/README.contrib @@ -0,0 +1,95 @@ +The contrib directory contains contributions made by fellow +enthousiasts. (Check respective web-sites for the latest version) + +---------------------------------------------------------------------- + +mngplg - A Netscape plugin for MNG - by Jason Summers + +http://pobox.com/~jason1/imaging/mngplg/ + +The very first contribution, and what a start! +GIF look out, MNG is on the prowl and ready to swat you like a fly! + +---------------------------------------------------------------------- + +mngplay - An SDL based MNG viewer - by Ralph Giles + +http://snow.ashlu.bc.ca/~giles/mng/ + +Another nice contribution. View MNG files on practically any platform +with this standalone viewer. +Source-code only; Requires SDL library and libmng.so + +(Modified by Greg Roelofs) + +---------------------------------------------------------------------- + +mngview - A BCB port of the Delphi sample - by Andy Protano + +I have added this nice little port to the BCB samples directory. +It adds a nifty progressbar while reading a file. Excellent work! +Requires libmng.dll +(note: this is in the BCB samples directory) + +---------------------------------------------------------------------- + +mngdump - A BCB GUI-based dump utility - by Andy Protano + +Andy has sent me this fully functional MNG dump utility, that gives +detailed information of the contents of any MNG file. +Requires libmng.dll + +---------------------------------------------------------------------- + +mng-view - A GTK-based MNG viewer - by Vova Babin + +Vova has been hacking away with the libmng code and has come up with +this nice little sample how to write a MNG viewer using GTK. +Thanks mate! +Source-code only +Requires GTK+ (1.2 or higher) and libmng (0.9.2 or higher) + +(Modified by Greg Roelofs) + +---------------------------------------------------------------------- + +mngview - Another MNG viewer; this one for MSVC - by Nicholaus Brennig + +A welcome contribution from Nicholaus. Author of SlowView. A very nice +image-handling utility for Windows. A welcome contribution since there +have been numerous questions about linking libmng with MSVC. +Well, look no further. Here it is! + +---------------------------------------------------------------------- + +MSVC libmng project - An MSVC project to build libmng.dll + - by Chad Austin + +Chad has contributed some project-files that you could use to build +libmng.dll with MSVC. Please be sure to read the README file included. + +---------------------------------------------------------------------- + +fbmngplay - A simple fbcon based mng player - by Stefan Reinauer + +Stefan has contributed this little example, based on Ralph's +SDL player. It uses the kernel framebuffer device to display mng +animations through the libmng interface. +(currently for 16-bit buffers only) + +---------------------------------------------------------------------- + +xmngview - Lesstif/Motif standalone player for MNG files + - by Winfried Szukalski + +Winfried contributed this MNG player for X-based systems. +(recently updated) + +---------------------------------------------------------------------- + +makemng - A delta-MNG creation utility for MSVC - by Alex Volkov + +Alex sent me this nice utility that will allow you to create highly +optmized MNGs using the delta-PNG capabilities of MNG. + +---------------------------------------------------------------------- diff --git a/src/3rdparty/libmng/README.dll b/src/3rdparty/libmng/README.dll new file mode 100644 index 0000000000..2f779e81a4 --- /dev/null +++ b/src/3rdparty/libmng/README.dll @@ -0,0 +1,41 @@ +Standard Windows DLL +==================== + +The DLL provided in the BCB/win32dll directory is meant as the sole candidate +for distributions, based on libmng.dll, that install the DLL into the public +Windows system-directory. The outline herein defines the requirements to +which such a distribution must comply. If you cannot comply with these +requirements please install the dll in the same directory as your application +and NOT in the Windows system-directory!!! + + +1) Only the DLL already assembled in the libmng distribution may be used for + other distributions! + +2) Only stable public releases are eligible for distribution! A public release + is one where the y-value of the x.y.z version-code is an even number. + Eg. 1.0.0, 1.2.1, 2.4.7, etc. + +3) The installation program MUST store the DLL in the Windows system-directory! + Eg. C:\WinNT\System32, C:\Windows98\System + (Note: InstallShield users can use the variable) + +3) The installation program MUST flag the file as a shared library! + +4) The installation program MUST NOT install the DLL if a newer version + already exists in the Windows system-directory! The standard DLL provided + contains the Windows-default version-numbering system. PLEASE USE IT!! + DO NOT rely on the date or size of the files. + +5) An uninstall procedure MAY NOT remove the DLL if other applications are + still linked to it! Proper handling as a shared library is imperitive. + +6) TEST IT, TEST IT, TEST IT!!! (I just can't stress this enough) + If you don't have enough time, let someone else test it BEFORE you + distribute! + + +The penalty for violating these rules is inclusion of your name in the list +of endangered but useless species (just below the GIF entry!), and on my +blacklist. YOU HAVE BEEN FOREWARNED! + diff --git a/src/3rdparty/libmng/README.examples b/src/3rdparty/libmng/README.examples new file mode 100644 index 0000000000..1ba94c1404 --- /dev/null +++ b/src/3rdparty/libmng/README.examples @@ -0,0 +1,48 @@ +The samples are in platform-specific directories. + +!!! contributions are very welcome !!! + + +bcb - Borland C++ Builder (3.0) (found under bcb/xxx) +----------------------------------------------------- + +win32dll - sample project to create a Windows dll. Requires zlib1.2.1, + IJG jpgsrc6b and lcms1.0.14. The directories containing these + libraries must be at the same level as the libmng directory. + So if you're in the directory with this file and the libmng + sources, they should be in ..\zlib , ..\jpgsrc6b and ..\lcms + respectively. + +!!! To run the other Win32 samples you need to copy the libmng.dll + file from here into the sample's directory !!! + +mngtree - sample project to create a little command-line tool that dumps + the chunk-structure of a given file onto stdout. + +bogus - a completely bogus example on how to create a perfectly valid + (though slightly biased) MNG. + +mngview - port of the Delphi mngview sample. contributed by Andy Protano. + see also README.contrib + +mngrepair- an example on how to fix invalid MNG files + uses the new mng_copy_chunks() function and MNG_SOFTERRORS to + 'ignore' certain input-errors. This conditional *MUST* only be used + for exactly this kind of software; eg. repair utilities. + + +delphi - Borland Delphi (3.0+) (found under contrib/delphi/xxx) +--------------------------------------------------------------- + +mngview - sample project for a simple mng-viewer. The general unit in + the delphi directory was translated from libmng.h It can be + used in other projects to access libmng.dll created with the + win32dll example above. + + +unix - Unix (found under contrib/gcc/xxx) +----------------------------------------- + +mngtree - basically a copy of the BCB sample. It includes a makefile for + Linux and it's been tested on RedHat6.2 + diff --git a/src/3rdparty/libmng/README.footprint b/src/3rdparty/libmng/README.footprint new file mode 100644 index 0000000000..34dba7f180 --- /dev/null +++ b/src/3rdparty/libmng/README.footprint @@ -0,0 +1,46 @@ +/* + You can use one or more of the following defines to + reduce the size of the compiled library. Define the + SKIPCANVAS macros for any canvas configurations that + your application doesn't use. Define the SKIPCHUNK + macros for any chunks that your application doesn't + process. Define MNG_OPTIMIZE_FOOTPRINT to choose + smaller code size over faster execution and less memory + usage. These macros became available in version 1.0.6. +*/ + +/* eliminate unused features from libmng */ +#define MNG_OPTIMIZE_FOOTPRINT +#define MNG_OPTIMIZE_OBJCLEANUP +#define MNG_OPTIMIZE_CHUNKINITFREE +#define MNG_OPTIMIZE_CHUNKASSIGN +#define MNG_OPTIMIZE_CHUNKREADER + +#define MNG_SKIPCANVAS_ABGR8 +#define MNG_SKIPCANVAS_ARGB8 +#define MNG_SKIPCANVAS_BGR8 +#define MNG_SKIPCANVAS_BGRA8 +#define MNG_SKIPCANVAS_BGRA8_PM +#define MNG_SKIPCANVAS_BGRX8 +#define MNG_SKIPCANVAS_RGBA8 +#define MNG_SKIPCANVAS_BGR565 +#define MNG_SKIPCANVAS_RGB565 +#define MNG_SKIPCANVAS_BGRA565 +#define MNG_SKIPCANVAS_RGBA565 + +#define MNG_SKIPCHUNK_iCCP +#define MNG_SKIPCHUNK_tEXt +#define MNG_SKIPCHUNK_zTXt +#define MNG_SKIPCHUNK_iTXt +#define MNG_SKIPCHUNK_bKGD +#define MNG_SKIPCHUNK_pHYs +#define MNG_SKIPCHUNK_sBIT +#define MNG_SKIPCHUNK_sPLT +#define MNG_SKIPCHUNK_hIST +#define MNG_SKIPCHUNK_tIME +#define MNG_SKIPCHUNK_eXPI +#define MNG_SKIPCHUNK_fPRI +#define MNG_SKIPCHUNK_nEED +#define MNG_SKIPCHUNK_pHYg + + diff --git a/src/3rdparty/libmng/README.packaging b/src/3rdparty/libmng/README.packaging new file mode 100644 index 0000000000..da0db3e7bb --- /dev/null +++ b/src/3rdparty/libmng/README.packaging @@ -0,0 +1,24 @@ +Packaging Libmng for distribution +--------------------------------- + +These are some notes for those building binaries for distribution. + +We're interested to hear about anywhere libmng is helpful, so let us +know if you're including it with your application or OS. Also, if your +build is publicly accessible, we'd be happy to link to it from +the libmng site. + +However, We respectfully request that you *not* distribute binaries as a +shared library (DLL) with any of the major features disabled. While +there is support for this in terms of #ifdef directives (in +libmng_conf.h) and autoconf switches they are intended for embedded +application and testing. The default compilation options support the +full MNG specification, and we wish to avoid the confusion among +general users that partial support would engender. + + +Platform specific notes: + +We have a basic .spec file for generating rpms. Send us a note if you'd +like to clean it up. + diff --git a/src/3rdparty/libmng/doc/Plan1.png b/src/3rdparty/libmng/doc/Plan1.png new file mode 100644 index 0000000000..ced5517278 Binary files /dev/null and b/src/3rdparty/libmng/doc/Plan1.png differ diff --git a/src/3rdparty/libmng/doc/Plan2.png b/src/3rdparty/libmng/doc/Plan2.png new file mode 100644 index 0000000000..3619ea6631 Binary files /dev/null and b/src/3rdparty/libmng/doc/Plan2.png differ diff --git a/src/3rdparty/libmng/doc/doc.readme b/src/3rdparty/libmng/doc/doc.readme new file mode 100644 index 0000000000..e92e93cb5a --- /dev/null +++ b/src/3rdparty/libmng/doc/doc.readme @@ -0,0 +1,19 @@ +This directory hosts the documentation for libmng. + +You will find a lot of useful info on the web-site: +http://www.libmng.com + +Man-pages are in the man sub-directory + +RPM specification files are in the RPM sub-directory + +Files in this directory: + +- libmng.txt + +Description of the library proper and its usage + +- Plan1.png & Plan2.png + +Visual representation of the functional and technical +design of the library (in PNG format of course!) diff --git a/src/3rdparty/libmng/doc/libmng.txt b/src/3rdparty/libmng/doc/libmng.txt new file mode 100644 index 0000000000..b9e9bc4b89 --- /dev/null +++ b/src/3rdparty/libmng/doc/libmng.txt @@ -0,0 +1,1107 @@ +libmng - Multiple-image Network Graphics (MNG) Reference Library 1.0.9 + +DESCRIPTION +The libmng library supports decoding, displaying, encoding, and various +other manipulations of the Multiple-image Network Graphics (MNG) format +image files. It uses the zlib compression library, and optionally the +JPEG library by the Independant JPEG Group (IJG) and/or +lcms (little cms), a color-management library by Marti Maria Saguer. + + +I. Introduction + +This file describes how to use and modify the MNG reference library +(known as libmng) for your own use. There are seven sections to this +file: introduction, callbacks, housekeeping, reading, displaying, +writing, and modification and configuration notes for various special +platforms. We assume that libmng is already installed; see the +INSTALL.README file for instructions on how to install libmng. + +Libmng was written to support and promote the MNG specification. + +The latest MNG specification (currently 1.0) is available at + http://www.libpng.org/pub/mng/ + +Other information about MNG can be found at the MNG home page at + http://www.libpng.org/pub/mng/ + +The latest version of libmng can be found at its own homepage at + http://www.libmng.com/ + +In most cases the library will not need to be changed. +For standardization purposes the library contains both a Windows DLL +and a makefile for building a shared library (SO). The library is +written in C, but an interface for Borland Delphi is also available. + +Libmng has been designed to handle multiple sessions at one time, +to be easily modifiable, to be portable to the vast majority of +machines (ANSI, K&R, 32-, and 64-bit) available, and to be easy +to use. + +Libmng uses zlib for its compression and decompression of MNG files. +Further information about zlib, and the latest version of zlib, can be +found at the zlib home page, . +The zlib compression utility is a general purpose utility that is +useful for more than MNG/PNG files, and can be used without libmng. +See the documentation delivered with zlib for more details. + +Libmng optionally uses the JPEG library by the Independant JPEG Group +(IJG). This library is used for the JNG sub-format, which is part of +the MNG specification, and allows for inclusion of JPEG decoded and +thus highly compressed (photographic) images. +Further information about the IJG JPEG library and the latest sources +can be found at . + +Libmng can also optionally use the lcms (little CMS) library by +Marti Maria Saguer. This library provides an excellent color-management +system (CMS), which gives libmng the ability to provide full +color-correction for images with the proper color-information encoded. +Further information and the latest sources can be found at +. + +Libmng is thread safe, provided the threads are using different +handles as returned by the initialization call. +Each thread should have its own handle and thus its own image. +Libmng does not protect itself against two threads using the +same instance of a handle. + +The libmng.h header file is the single reference needed for programming +with libmng: + +#include + + +II. Callbacks + +Libmng makes extensive use of callback functions. This is meant to +keep the library as platform-independant and flexible as possible. +Actually, the first call you will make to the library, already contains +three parameters you can use to provide callback entry-points. + +Most functions must return a mng_bool (boolean). Returning MNG_FALSE +indicates the library the callback failed in some way and the library +will immediately return from whatever it was doing back to the +application. Returning MNG_TRUE indicates there were no problems and +processing can continue. + +Let's step through each of the possible callbacks. The sections on +reading, displaying and writing will also explain which callbacks are +needed when and where. + +- mng_ptr mng_memalloc (mng_size_t iLen) + +A very basic function which the library uses to allocate a memory-block +with the given size. A typical implementation would be: + + mng_ptr my_alloc (mng_size_t iLen) { + return calloc (1, iSize); + } + +Note that the library requires you to zero-out the memory-block!!! + +- void mng_memfree (mng_ptr pPtr, + mng_size_t iLen) + +Counterpart of the previous function. Typically: + + void my_free (mng_ptr pPtr, mng_size_t iLen) { + free (pPtr); + } + +- mng_bool mng_openstream (mng_handle hHandle) +- mng_bool mng_closestream (mng_handle hHandle) + +These are called by the library just before it starts to process +(either read or write) a file and just after the processing stops. +This is the recommended place to do I/O initialization & finalization. +Whether you do or not, is up to you. The library does not put any +meaning into the calls. They are simply provided for your convenience. + +- mng_bool mng_readdata (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pRead) + +This function is called when the library needs some more input while +reading an image. The reading process supports two modes: +Suspension-mode (SMOD) and non-suspension-mode (NSMOD). +See mng_set_suspensionmode() for a more detailed description. + +In NSMOD, the library requires you to return exactly the amount of bytes +requested (= iBuflen). Any lesser amount indicates the input file +is exhausted and the library will return a MNG_UNEXPECTEDEOF errorcode. + +In SMOD, you may return a smaller amount of bytes than requested. +This tells the library it should temporarily wait for more input to +arrive. The lib will return with MNG_NEEDMOREDATA, and will expect a +call to mng_read_resume() or mng_display_resume() next, as soon as +more input-data has arrived. + +For NSMOD this function could be as simple as: + + mng_bool my_read (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pRead) { + *pRead = fread (pBuf, 1, iBuflen, myfile); + return MNG_TRUE; + } + +- mng_bool mng_writedata (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pWritten) + +This function is called during the mng_write() function to actually +output data to the file. There is no suspension-mode during write, +so the application must return the exact number of bytes the library +requests to be written. + +A typical implementation could be: + + mng_bool my_write (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pWritten) { + *pWritten = fwrite (pBuf, 1, iBuflen, myfile); + return MNG_TRUE; + } + +- mng_bool mng_errorproc (mng_handle hHandle, + mng_int32 iErrorcode, + mng_int8 iSeverity, + mng_chunkid iChunkname, + mng_uint32 iChunkseq, + mng_int32 iExtra1, + mng_int32 iExtra2, + mng_pchar zErrortext) + +This function is called whenever an error is detected inside the +library. This may be caused by invalid input, callbacks indicating +failure, or wrongfully calling functions out of place. + +If you do not provide this callback the library will still return +an errorcode from the called function, and the mng_getlasterror() +function can be used to retrieve the other parameters. + +This function is currently only provided for convenience, but may +at some point be used to indicate certain errors may be acceptable, +and processing should continue. + +- mng_bool mng_traceproc (mng_handle hHandle, + mng_int32 iFuncnr, + mng_int32 iFuncseq, + mng_pchar zFuncname) + +This function is provided to allow a functional analysis of the +library. This may be useful if you encounter certain errors and +cannot determine what the problem is. + +Almost all functions inside the library will activate this +callback with an appropriate function-name at the start and end +of the function. Please note that large images may generate an +enormous amount of calls. + +- mng_bool mng_processheader (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight) + +This function is called once the header information of an input- +image has been processed. At this point the image dimensions are +available and also some other properties depending on the type +of the image. Eg. for a MNG the frame-/layercount, playtime & +simplicity fields are known. + +The primary purpose of this callback is to inform the application +of the size of the image, and for the application to initialize +the drawing canvas to be used by the library. This is also a good +point to set the canvas-style. Eg. mng_set_canvasstyle(). + +- mng_bool mng_processtext (mng_handle hHandle, + mng_uint8 iType, + mng_pchar zKeyword, + mng_pchar zText, + mng_pchar zLanguage, + mng_pchar zTranslation) + +This callback is activated for each textual chunk in the input- +image. These are tEXt, zTXt & iTXt. It may be used to retain +specific comments for presentation to the user. + +- mng_bool mng_processsave (mng_handle hHandle) +- mng_bool mng_processseek (mng_handle hHandle, + mng_pchar zName) + +The purpose of these callbacks is to signal the processing of the +SAVE & SEEK chunks in a MNG input-file. This may be used in the +future to specify some special processing. At the moment these +functions are only provided as a signal. + +- mng_ptr mng_getcanvasline (mng_handle hHandle, + mng_uint32 iLinenr) +- mng_ptr mng_getbkgdline (mng_handle hHandle, + mng_uint32 iLinenr) +- mng_ptr mng_getalphaline (mng_handle hHandle, + mng_uint32 iLinenr) + +These callbacks are used to access the drawing canvas, background +canvas and an optional separate alpha-channel canvas. The latter is +used only with the MNG_CANVAS_RGB8_A8 canvas-style. + +If the getbkgdline() callback is not supplied the library will +composite full or partially transparent pixels in the image against +a specified background color. See mng_set_bgcolor() for more details. +If a chosen canvas-style includes an alpha-channel, this callback +is very likely not needed. + +The application is responsible for returning a pointer to a line of +pixels, which should be in the exact format as defined by the call +to mng_set_canvasstyle() and mng_set_bkgdstyle(), without gaps between +the representation of each pixel. + +- mng_bool mng_refresh (mng_handle hHandle, + mng_uint32 iX, + mng_uint32 iY, + mng_uint32 iWidth, + mng_uint32 iHeight) + +This callback is called when the library has drawn a complete frame +onto the drawing canvas, and it is ready to be displayed. +The application is responsible for transferring the drawing canvas +from memory onto the actual output device. + +- mng_uint32 mng_gettickcount (mng_handle hHandle) + +This function should return the number of milliseconds on some internal +clock. The entire animation timing depends heavily on this function, +1and the number returned should be as accurate as possible. + +- mng_bool mng_settimer (mng_handle hHandle, + mng_uint32 iMsecs) + +This callback is activated every time the library requires a "pause". +Note that the function itself should NOT execute the wait. It should +simply store the time-field and allow the library to return. Libmng +will return with the MNG_NEEDTIMERWAIT code, indicating the callback +was called and it is now time to execute the pause. + +After the indicated number of milliseconds have elapsed, the application +should call mng_display_resume(), to resume the animation as planned. + +This method allows for both a real timer or a simple wait command in the +application. Whichever method you select, both the gettickcount() and +settimer() callbacks are crucial for proper animation timing. + +- mng_bool mng_processgamma (mng_handle hHandle, + mng_uint32 iGamma) +- mng_bool mng_processchroma (mng_handle hHandle, + mng_uint32 iWhitepointx, + mng_uint32 iWhitepointy, + mng_uint32 iRedx, + mng_uint32 iRedy, + mng_uint32 iGreenx, + mng_uint32 iGreeny, + mng_uint32 iBluex, + mng_uint32 iBluey) +- mng_bool mng_processsrgb (mng_handle hHandle, + mng_uint8 iRenderingintent) +- mng_bool mng_processiccp (mng_handle hHandle, + mng_uint32 iProfilesize, + mng_ptr pProfile) +- mng_bool mng_processarow (mng_handle hHandle, + mng_uint32 iRowsamples, + mng_bool bIsRGBA16, + mng_ptr pRow) + +These callbacks are only required when you selected the MNG_APP_CMS +directive during compilation of the library. See the configuration +section for more details. + +- mng_bool mng_iteratechunk (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid iChunkid, + mng_uint32 iChunkseq) + +This callback is only used for the mng_iterate_chunks() function. +It is called exactly once for each chunk stored. + + +III. Housekeeping + + +> Memory management + +The library can use internal memory allocation/deallocation or use +provided callbacks for its memory management. The choice is made at +compilation time. See the section on customization for details. + +If internal management has been selected, the memory callback functions +need not be supplied. Even if you do supply them they will not be used. +The actual code used is similar to the code discussed in the callback +section: + + pPtr = calloc (1, iSize); + + free (pPtr); + +If your compiler does not support these functions, or you wish to monitor +the library's use of memory for certain reasons, you can choose to +compile the library with external memory management. In this case the +memory callback functions MUST be supplied, and should function as if the +above code was used. + + +> Initialization + +The basic initialization of the library is short and swift: + + myhandle = mng_initialize (myuserdata, my_alloc, + my_free, MNG_NULL); + if (myhandle == MNG_NULL) + /* process error */; + +The first field is an application-only parameter. It is saved in +libmng's internal structures and available at all times through the +mng_get_userdata() function. This is especially handy in callback functions +if your program may be handling multiple files at the same time. + +The second and third field supply the library with the memory callback +1function entry-points. These are described in more detail in the callback +section and the previous paragraph. + +The fourth and last field may be used to supply the library with the +entry-point of a trace callback function. For regular use you will not +need this! + +The function returns a handle which will be your ticket to MNG-heaven. +All other functions rely on this handle. It is the single fixed unique +reference-point between your application and the library. + +You should call the initialization function for each image you wish to +process simultaneously. If you are processing images consecutively, you can +reset the internal status of the library with the mng_reset() function. +This function will clear all internal state variables, free any stored +chunks and/or objects, etc, etc. Your callbacks and other external parameters +will be retained. + +After you successfully received the handle it is time to set the required +callbacks. The sections on reading, displaying & writing indicate which +callbacks are required and which are optional. +To set the callbacks simply do: + + myretcode = mng_setcb_xxxxxx (myhandle, my_xxxxxx); + if (myretcode != MNG_NOERROR) + /* process error */; + +Naturally you'd replace the x's with the name of the callback. + + +> Cleanup + +Once you've gotten hold of that precious mng_handle, you should always, +and I mean always, call the cleanup function when you're done. +Just do: + + mng_cleanup (myhandle); + +And you're done. There shouldn't be an ounce of memory spilled after +that call. + +Note that if you would like to process multiple files consecutively +you do not need to do mng_cleanup() / mng_initialize() between each file +but simply + + myretcode = mng_reset (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + +will suffice. Saves some time and effort, that. + + +> Error handling + +From the examples in the previous paragraphs you may have noticed a +meticulous scheme for error handling. And yes, that's exactly what it is. +Practically each call simply returns an errorcode, indicating success, +eg. MNG_NOERROR or failure, anything else but MNG_NEEDMOREDATA and +MNG_NEEDTIMERWAIT. These latter two will be discussed in more detail in +their respective fields of interest: the reading section and displaying +section respectively. + +It is the application's responsibility to check the returncode after +each call. You can call mng_getlasterror() to receive the details of +the last detected error. This even includes a discriptive error-message +if you enabled that option during compilation of the library. + +Note that after receiving an error it is still possible to call the +library, but it's also very likely that any following call will fail. +The only functions deemed to work will be mng_reset() and mng_cleanup(). +Yes, if you abort your program after an error, you should still call +mng_cleanup(). + + +IV. Reading + +Reading a MNG, JNG or PNG is fairly easy. It depends slightly on your +ultimate goal how certain specifics are to be handled, but the basics +are similar in all cases. + +For the read functioins to work you must have compiled the library with +the MNG_READ_SUPPRT directive. The standard DLL and Shared Library +have this on by default! + + +> Setup + +Naturally you must have initialized the library and be the owner of +a mng_handle. The following callbacks are essential: + + mng_openstream, mng_readdata, mng_closestream + +You may optionally define: + + mng_errorproc, mng_traceproc + mng_processheader, mng_processtext + mng_processsave, mng_processseek + +The reading bit will also fail if you are already creating or +displaying a file. Seems a bit obvious, but I thought I'd mention it, +just in case. + + +> To suspend or not to suspend + +There is one choice you need to make before calling the read function. +Are you in need of suspension-mode or not? + +If you're reading from a disk you most certainly do not need +suspension-mode. Even the oldest and slowest of disks will be fast +enough for straight reading. + +However, if your input comes from a really slow device, such as a +dialup-line or the likes, you may opt for suspension-mode. This is done +by calling + + myretcode = mng_set_suspensionmode (myhandle, + MNG_TRUE); + if (myretcode != MNG_NOERROR) + /* process error */; + +Suspension-mode will force the library to use special buffering on the +input. This allows your application to receive data of arbitrarily length +and return this in the mng_readdata() callback, without disturbing the +chunk processing routines of the library. + +Suspension-mode does require a little extra care in the main logic of the +1application. The read function may return with MNG_NEEDMOREDATA when the +mng_readdata() callback returns less data then it needs to process the +next chunk. This indicates the application to wait for more data to arrive +and then resume processing by calling mng_read_resume(). + + +> The read HLAPI + +The actual reading is just plain simple. Since all I/O is done +1outside the library through the callbacks, the library can focus on +its real task. Understanding, checking and labelling the input data! + +All you really need to do is this: + + myretcode = mng_read (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + +Of course, if you're on suspension-mode the code is a little more +complicated: + + myretcode = mng_read (myhandle); + + while (myretcode == MNG_NEEDMOREDATA) { + /* wait for input-data to arrive */ + myretcode = mng_read_resume (myhandle); + } + + if (myretcode != MNG_NOERROR) + /* process error */; + +This is rather crude and more sophisticated programming methods may +dictate another approach. Whatever method you decide on, it should +act as if the above code was in its place. + +There is also the mng_readdisplay() function, but this is discussed +in the displaying section. It functions pretty much as the mng_read() +function, but also immediately starts displaying the image. +mng_read_resume() should be replaced by mng_display_resume() in that +case! + + +> What happens inside + +What actually happens inside the library depends on the configuration +options set during the compilation of the library. + +Basically the library will first read the 8-byte file header, to determine +its validity and the type of image it is about to process. Then it will +repeatedly read a 4-byte chunk-length and then the remainder of the chunk +until it either reaches EOF (indicated by the mng_readdata() callback) or +implicitly decides EOF as it processed the logically last chunk of the +image. + +Applications that require strict conformity and do not allow superfluous +data after the ending chunk, will need to perform this check in their +mng_closestream() callback. + +Each chunk is then checked on CRC, after which it is handed over to the +appropriate chunk processing routine. These routines will disect the +chunk, check the validity of its contents, check its position with respect +to other chunks, etc, etc. + +If everything checks out, the chunk is further processed as follows: + +If display support has been selected during compilation, certain pre-display +initialization will take place. + +If chunk-storage support has been selected during compilation, the chunks +data may be stored in a special internal structure and held for future +reference. + + +> Storing and accessing chunks + +One of the compilation options activates support for chunk storage. +This option may be useful if you want to examine an image. The directive +is MNG_STORE_CHUNKS. You must also turn on the MNG_ACCESS_CHUNKS +directive. + +The actual storage facility can be turned on or off with the +mng_set_storechunks() function. If set to MNG_TRUE, chunks will be +stored as they are read. + +At any point you can then call the mng_iterate_chunks() function +to iterate through the current list of chunks. This function requires +a callback which is called for each chunk and receives a specific +chunk-handle. This chunk-handle can be used to call the appropriate +mng_getchunk_xxxx() function, to access the chunks properties. + +A typical implementation may look like this: + + mng_bool my_iteratechunk (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid iChunkid, + mng_uint32 iChunkseq) { + switch (iChunkid) { + case MNG_UINT_MHDR : { /* process MHDR */; + break; } + case MNG_UINT_FRAM : { /* process FRAM */; + break; } + + ...etc... + + case MNG_UINT_HUH : { /* unknown chunk */; + break; } + default : { /* duh; forgot one */; } + } + + return MNG_TRUE; /* keep'm coming */ + } + +To get to the actual chunk fields of lets say a SHOW chunk you would do: + + mng_bool isempty; + mng_uint16 firstid, lastid; + mng_uint8 showmode; + + myretcode mng_getchunk_show (hHandle, hChunk, + isempty, firstid, + lastid, showmode); + if (myretcode != MNG_NOERROR) + /* process error */; + + +V. Displaying + + +> Setup + +Assuming you have initialized the library and are the owner of +a mng_handle. The following callbacks are essential: + + mng_getcanvasline, mng_refresh + mng_gettickcount, mng_settimer + +If you wish to use an application supplied background you must supply: + + mng_getbkgdline + +If you wish to use the MNG_CANVAS_RGB8_A8 canvas style you must supply: + + mng_getalphaline + +You may optionally define: + + mng_errorproc, mng_traceproc + mng_processheader, mng_processtext + mng_processsave, mng_processseek + +Note that the mng_processheader() callback is optional but will +be quite significant for proper operation! + +Displaying an image will fail if you are creating a file or already +displaying one. Yes, you can't display it twice! + + +> A word on canvas styles + +The canvas style describes how your drawing canvas is made up. +You must set this before the library actually starts drawing, so +the mng_processheader() callback is a pretty good place for it. + +Currently only 8-bit RGB canvas styles are supported, either with +or without an alpha channel. + +If you like to do alpha composition yourself you can select one of +the canvas styles that include an alpha channel. You can even have +a separate alpha canvas by selecting the MNG_CANVAS_RGB8_A8 style. + +All styles require a compact model. Eg. MNG_CANVAS_BGR8 requires +your canvas lines in bgrbgrbgr... storage, where each letter +represents an 8-bit value of the corresponding color, and each +threesome makes up the values of one(1) pixel. + +The library processes a line at a time, so the canvas lines do not +actually need to be consecutive in memory. + + +> Alpha composition and application backgrounds + +All Network Graphics can be partially transparent. This requires +special processing if you need to display an image against some +background. Note that the MNG header (MHDR chunk) contains a +simplicity field indicating whether transparency information in +the file is critical or not. This only applies to embedded images, +which means the full image-frame of the MNG may still contain fully +transparent pixels! + +Depending on your needs you can supply a single background color, +a background canvas or tell the library to return the alpha-channel +and do alpha composition yourself. + +This is different from the BACK chunk in a MNG, or the bKGD chunk +in an (embedded) PNG or JNG. The BACK chunk indicates an optional or +mandatory background color and/or image. The bKGD chunk only indicates +an optional background color. These chunks indicate the Authors +preferences. They may be absent in which case you need to supply +some sort of background yourself. + +> Composing against a background color + +This is the easiest method. Call the mng_set_bgcolor() function to +set the values of the red, green and blue component of your preferred +background color. + +Use one of the canvas styles that do not have an alpha-channel, and +which matches your output requirements. + +> Composing against a background canvas + +This is somewhat more complicated. You will need to set the +mng_getbkgdline() callback. This will be called whenever the library +needs to compose a partially transparent line. + +This canvas must hold the background against which the image should +be composed. Its size must match exactly with the image dimensions +and thus the drawing canvas! + +Use one of the canvas styles that do not have an alpha-channel, and +which matches your output requirements. The canvas style of the +background canvas may even differ from the drawing canvas. The library's +composing will still function properly. + +> Composing within the application + +If you have the option in your application to draw a (partially) +transparent canvas to the output device, this option is preferred. + +Select one of the canvas styles that do have an alpha-channel. +The library will now supply the appropriate alpha information, +allowing the application to compose the image as it sees fit. + + +> Color information and CMS + +Network Graphics may, and usually will, contain color-correction +information. This information is intended to compensate for the +difference in recording and display devices used. + +This document does not address the specifics of color-management. +See the PNG specification for a more detailed description. + +> Using little cms by Marti Maria Saguer + +This is the easiest method, providing you can compile the lcms package. +Select the MNG_FULL_CMS directive during compilation, and sit back and +relax. The library will take care of all color-correction for you. + +> Using an OS- or application-supplied CMS + +If you are so lucky to have access to CMS functionality from within +your application, you may instruct the library to leave color-correction +to you. + +Select the MNG_APP_CMS directive during compilation of the library. +You MUST also set the following callbacks: + + mng_processgamma, mng_processchroma, + mng_processsrgb, mng_processiccp and + mng_processarow + +The last callback is called when the library needs you to correct +an arbitrary line of pixels. The other callbacks are called when +the corresponding color-information is encountered in the file. +You must store this information somewhere for use in the +mng_processarow() callback. + +> Using gamma-only correction + +This isn't a preferred method, but it's better than no correction +at all. Gamma-only correction will at least compensate for +gamma-differences between the original recorder and your output device. + +Select the MNG_GAMMA_ONLY directive during compilation +of the library. Your compiler MUST support fp operations. + +> No color correction + +Ouch. This is really bad. This is the least preferred method, +but may be necessary if your system cannot use lcms, doesn't +have its own CMS, and does not allow fp operations, ruling out +the gamma-only option. + +Select the MNG_NO_CMS directive during compilation. +Images will definitely not be displayed as seen by the Author!!! + + +> Animations and timing + +Animations require some form of timing support. The library relies +on two callbacks for this purpose. The mng_gettickcount() and +mng_settimer() callbacks. mng_gettickcount() is used to determine +the passing of time in milliseconds since the beginning of the +animation. This is also used to compensate during suspension-mode +if you are using the mng_readdisplay() function to read & display +the file simultaneously. + +The callback may return an arbitrary number of milliseconds, but +this number must increase proportionaly between calls. Most modern +systems will have some tickcount() function which derives its +input from an internal clock. The value returned from this function +is more than adequate for libmng. + +The mng_settimer() callback is called when the library determines +a little "pause" is required before rendering another frame of the +animation. The pause interval is also expressed in milliseconds. +Your application should store this value and return immediately. +The library will then make appropriate arrangements to store its +internal state and returns to your application with the +MNG_NEEDTIMERWAIT code. + +At that point you should suspend processing and wait the given +interval. Please use your OS features for this. Do not engage some +sort of loop. That is real bad programming practice. Most modern +systems will have some timing functions. A simple wait() function +may suffice, but this may prevent your applications main-task from +running, and possibly prevent the actual update of your output device. + + +> The mng_refresh() callback + +The mng_refresh() callback is called whenever the library has +"finished" drawing a new frame onto your canvas, and just before it +will call the mng_settimer() callback. + +This allows you to perform some actions necessary to "refresh" the +canvas onto your output device. Please do NOT suspend processing +inside this callback. This must be handled after the mng_settimer() +callback! + + +> Displaying while reading + +This method is preferred if you are reading from a slow input device +(such as a dialup-line) and you wish to start displaying something +as quickly as possible. This functionality is provided mainly for +browser-type applications but may be appropriate for other +applications as well. + +The method is usually used in unison with the suspension-mode of +the read module. A typical implementation would look like this: + + /* initiale library and set required callbacks */ + + /* activate suspension-mode */ + myretcode = mng_set_suspensionmode (myhandle, + MNG_TRUE); + if (myretcode != MNG_NOERROR) + /* process error */; + + myretcode = mng_readdisplay (myhandle); + + while ((myretcode == MNG_NEEDMOREDATA) || + (myretcode == MNG_NEEDTIMERWAIT)) { + if (myretcode == MNG_NEEDMOREDATA) + /* wait for more input-data */; + else + /* wait for timer interval */; + + myretcode = mng_display_resume (myhandle); + } + + if (myretcode != MNG_NOERROR) + /* process error */; + +More advanced programming methods may require a different approach, +but the final result should function as in the code above. + + +> Displaying after reading + +This method is used to display a file that was previously read. +It is primarily meant for viewers with direct file access, such as +1a local harddisk. + +Once you have successfully read the file, all you need to do is: + + myretcode = mng_display (myhandle); + + while (myretcode == MNG_NEEDTIMERWAIT) { + /* wait for timer interval */; + myretcode = mng_display_resume (myhandle); + } + + if (myretcode != MNG_NOERROR) + /* process error */; + +Again, more advanced programming methods may require a different +approach, but the final result should function as in the code above. + + +> Display manipulation + +Several HLAPI functions are provided to allow a user to manipulate +the normal flow of an animation. + +- mng_display_freeze (mng_handle hHandle) + +This will "freeze" the animation in place. + +- mng_display_resume (mng_handle hHandle) + +This function can be used to resume a frozen animation, or to force +the library to advance the animation to the next frame. + +- mng_display_reset (mng_handle hHandle) + +This function will "reset" the animation into its pristine state. +Calling mng_display() afterwards will re-display the animation +from the first frame. + +- mng_display_golayer (mng_handle hHandle, + mng_uint32 iLayer) +- mng_display_goframe (mng_handle hHandle, + mng_uint32 iFrame) +- mng_display_goplaytime (mng_handle hHandle, + mng_uint32 iPlaytime) + +These three functions can be used to "jump" to a specific layer, frame +or timeslot in the animation. You must "freeze" the animation before +using any of these functions. + +All above functions may only be called during a timer interval! +It is the applications responsibility to cleanup any resources with +respect to the timer wait. + + +VI. Writing + +The main focus of the library lies in its displaying capabilites. +But it does offer writing support as well. +You can create and write a file, or you can write a file you +have previously read, providing the storage of chunks was enabled +and active. + +For this to work you must have compiled the library with the +MNG_WRITE_SUPPO1RT and MNG_ACCESS_CHUNKS directives. The standard DLL and +Shared Library have this on by default! + + +> Setup + +As always you must have initialized the library and be the owner of +a mng_handle. The following callbacks are essential: + + mng_openstream, mng_writedata, mng_closestream + +You can optionally define: + + mng_errorproc, mng_traceproc + +The creation and writing functions will fail if you are in the middle +of reading, creating or writing a file. + + +> Creating a new file + +To start a new file the library must be in its initial state. +First you need to tell the library your intentions: + + myretcode = mng_create (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + +After that you start adding the appropriate chunks: + + myretcode = mng_putchunk_mhdr (myhandle, ...); + if (myretcode != MNG_NOERROR) + /* process error */; + +And so on, and so forth. Note that the library will automatically signal +the logical end of the file by the ending chunk. Also the first chunk +will indicate the library the filetype (eg. PNG, JNG or MNG) and force +the proper signature when writing the file. + +The code above can be simplified, as you can always get the last errorcode +by using the mng_getlasterror() function: + + if ( (mng_putchunk_xxxx (myhandle, ...)) or + (mng_putchunk_xxxx (myhandle, ...)) or + ...etc... ) + /* process error */; + +Please note that you must have a pretty good understanding of the chunk +specification. Unlike the read functions, there are virtually no checks, +so it is quite possible to write completely wrong files. +It is a good practice to read back your file into the library to verify +its integrity. + +Once you've got all the chunks added, all you do is: + + myretcode mng_write (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + +And presto. You're done. The real work is of course carried out in +your callbacks. Note that this is a single operation as opposed to +the read & display functions that may return with MNG_NEEDMOREDATA +and/or MNG_NEEDTIMERWAIT. The write function just does the job, and +only returns after it's finished or if it encounters some +unrecoverable error. + + +> Writing a previously read file + +If you have already successfully read a file, you can use the library to +write it out as a copy or something. You MUST have compiled the library +with the MNG_STORE_CHUNKS directive, and you must have done +mng_set_storechunks (myhandle, MNG_TRUE). + +This doesn't require the MNG_ACCESS_CHUNKS directive, unless you want +to fiddle with the chunks as well. + +Again all you need to do is: + + myretcode mng_write (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + + +VII. Modifying/Customizing libmng: + +to do + +> Compilation directives + +to do + +> Platform dependant modification + +to do + + +References : + +libmng : + http://www.libmng.com/ + +zlib : + http://www.info-zip.org/pub/infozip/zlib/ + +IJG JPEG library : + http://www.ijg.org/ + +lcms (little CMS) by Marti Maria Saguer : + http://www.littlecms.com/ + +MNG specification: + http://www.libpng.org/pub/mng + + +In the case of any inconsistency between the MNG specification +and this library, the specification takes precedence. + + +The contributing authors would like to thank all those who helped +with testing, bug fixes, and patience. This wouldn't have been +possible without all of you!!! + + +COPYRIGHT NOTICE: + +Copyright (c) 2000,2001 Gerard Juyn + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Gerard Juyn + +The MNG Library is supplied "AS IS". The Contributing Authors +disclaim all warranties, expressed or implied, including, without +limitation, the warranties of merchantability and of fitness for any +purpose. The Contributing Authors assume no liability for direct, +indirect, incidental, special, exemplary, or consequential damages, +which may result from the use of the MNG Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented; +you must not claim that you wrote the original software. + +2. Altered versions must be plainly marked as such and must not be +misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any source +or altered source distribution. + +The Contributing Authors specifically permit, without fee, and +encourage the use of this source code as a component to supporting +the MNG and JNG file format in commercial products. If you use this +source code in a product, acknowledgment would be highly appreciated. + + +Remarks : + +Parts of this software have been adapted from the libpng library. +Although this library supports all features from the PNG specification +(as MNG descends from it) it does not require the libpng library. +It does require the zlib library and optionally the IJG JPEG library, +and/or the "little-cms" library by Marti Maria Saguer (depending on the +inclusion of support for JNG and Full-Color-Management respectively. + +This library's function is primarily to read and display MNG +animations. It is not meant as a full-featured image-editing +component! It does however offer creation and editing functionality +at the chunk level. (future modifications may include some more +support for creation and or editing) + diff --git a/src/3rdparty/libmng/doc/man/jng.5 b/src/3rdparty/libmng/doc/man/jng.5 new file mode 100644 index 0000000000..0e371ad0eb --- /dev/null +++ b/src/3rdparty/libmng/doc/man/jng.5 @@ -0,0 +1,37 @@ +.TH JNG 5 "July 26, 2000" +.SH NAME +jng \- JPEG Network Graphics (JNG) sub-format +.SH DESCRIPTION +JNG (JPEG Network Graphics) is a sub-format of the MNG (Multiple-image +Network Graphics) format. As with MNG it extends on the features of the +popular PNG (Portable Network Graphics) image-format. +.br + +This sub-format was designed to support a lossy compression-method. +It is based completely on the JPEG specification. It adds the high-compression +ratios of JPEG for photographic images. + +As a member of the Network Graphics family, JNG was deemed adequate as a +stand-alone format as it extends the JPEG format with color-correction and +transparency features. + +.SH "SEE ALSO" +.IR png(5) ", " mng(5) ", " libmng(3) +.LP +MNG 1.00, February 9, 2001: +.IP +http://www.libpng.org/pub/mng + +.SH AUTHORS +This man page: Gerard Juyn +.LP +Multiple-image Network Graphics (MNG) Specification Version 1.00 (Februari 9, 2001): +Glenn Randers-Pehrson and others (png-list@ccrc.wustl.edu). +.LP + +.SH COPYRIGHT NOTICE +The MNG-1.00 specification is copyright (c) 1998-2001 Glenn Randers-Pehrson. +See the specification for conditions of use and distribution. +.LP +.\" end of man page + diff --git a/src/3rdparty/libmng/doc/man/libmng.3 b/src/3rdparty/libmng/doc/man/libmng.3 new file mode 100644 index 0000000000..5321faaa17 --- /dev/null +++ b/src/3rdparty/libmng/doc/man/libmng.3 @@ -0,0 +1,1146 @@ +.TH LIBMNG 3 "January 30th, 2005" +.SH NAME +libmng \- Multiple-image Network Graphics (MNG) Reference Library 1.0.9 +.SH SYNOPSIS +\fI\fB + +\fB#include \fP + + +.SH DESCRIPTION +The +.I libmng +library supports decoding, displaying, encoding, and various other +manipulations of the Multiple-image Network Graphics (MNG) format +image files. It uses the +.IR zlib(3) +compression library, and optionally the JPEG library by the Independant +JPEG Group (IJG) and/or lcms (little cms), a color-management library +by Marti Maria Saguer. + + +.SH I. Introduction + +This file describes how to use and modify the MNG reference library +(known as libmng) for your own use. There are seven sections to this +file: introduction, callbacks, housekeeping, reading, displaying, +writing, and modification and configuration notes for various special +platforms. We assume that libmng is already installed; see the +INSTALL.README file for instructions on how to install libmng. + +Libmng was written to support and promote the MNG specification. + +The MNG-1.0 specification is available at +. + +Other information about MNG can be found at the MNG home page, +. +The latest version of libmng can be found at its own homepage at +. + +In most cases the library will not need to be changed. +For standardization purposes the library contains both a Windows DLL +and a makefile for building a shared library (SO). The library is +written in C, but an interface for Borland Delphi is also available. + +Libmng has been designed to handle multiple sessions at one time, +to be easily modifiable, to be portable to the vast majority of +machines (ANSI, K&R, 32-, and 64-bit) available, and to be easy +to use. + +Libmng uses zlib for its compression and decompression of MNG files. +Further information about zlib, and the latest version of zlib, can be +found at the zlib home page, . +The zlib compression utility is a general purpose utility that is +useful for more than MNG/PNG files, and can be used without libmng. +See the documentation delivered with zlib for more details. + +Libmng optionally uses the JPEG library by the Independant JPEG Group +(IJG). This library is used for the JNG sub-format, which is part of +the MNG specification, and allows for inclusion of JPEG decoded and +thus highly compressed (photographic) images. +Further information about the IJG JPEG library and the latest sources +can be found at . + +Libmng can also optionally use the lcms (little CMS) library by +Marti Maria Saguer. This library provides an excellent color-management +system (CMS), which gives libmng the ability to provide full +color-correction for images with the proper color-information encoded. +Further information and the latest sources can be found at +. + +Libmng is thread safe, provided the threads are using different +handles as returned by the initialization call. +Each thread should have its own handle and thus its own image. +Libmng does not protect itself against two threads using the +same instance of a handle. + +The libmng.h header file is the single reference needed for programming +with libmng: + +#include + + +.SH II. Callbacks + +Libmng makes extensive use of callback functions. This is meant to +keep the library as platform-independant and flexible as possible. +Actually, the first call you will make to the library, already contains +three parameters you can use to provide callback entry-points. + +Most functions must return a mng_bool (boolean). Returning MNG_FALSE +indicates the library the callback failed in some way and the library +will immediately return from whatever it was doing back to the +application. Returning MNG_TRUE indicates there were no problems and +processing can continue. + +Let's step through each of the possible callbacks. The sections on +reading, displaying and writing will also explain which callbacks are +needed when and where. + +\- mng_ptr mng_memalloc (mng_size_t iLen) + +A very basic function which the library uses to allocate a memory-block +with the given size. A typical implementation would be: + + mng_ptr my_alloc (mng_size_t iLen) { + return calloc (1, iLen); + } + +Note that the library requires you to zero-out the memory-block!!! + +\- void mng_memfree (mng_ptr pPtr, + mng_size_t iLen) + +Counterpart of the previous function. Typically: + + void my_free (mng_ptr pPtr, mng_size_t iLen) { + free (pPtr); + } + +\- mng_bool mng_openstream (mng_handle hHandle) + +\- mng_bool mng_closestream (mng_handle hHandle) + +These are called by the library just before it starts to process +(either read or write) a file and just after the processing stops. +This is the recommended place to do I/O initialization & finalization. +Whether you do or not, is up to you. The library does not put any +meaning into the calls. They are simply provided for your convenience. + +\- mng_bool mng_readdata (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pRead) + +This function is called when the library needs some more input while +reading an image. The reading process supports two modes: +Suspension-mode (SMOD) and non-suspension-mode (NSMOD). +See mng_set_suspensionmode() for a more detailed description. + +In NSMOD, the library requires you to return exactly the amount of bytes +requested (= iBuflen). Any lesser amount indicates the input file +is exhausted and the library will return a MNG_UNEXPECTEDEOF errorcode. + +In SMOD, you may return a smaller amount of bytes than requested. +This tells the library it should temporarily wait for more input to +arrive. The lib will return with MNG_NEEDMOREDATA, and will expect a +call to mng_read_resume() or mng_display_resume() next, as soon as +more input-data has arrived. + +For NSMOD this function could be as simple as: + + mng_bool my_read (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pRead) { + *pRead = fread (pBuf, 1, iBuflen, myfile); + return MNG_TRUE; + } + +\- mng_bool mng_writedata (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pWritten) + +This function is called during the mng_write() function to actually +output data to the file. There is no suspension-mode during write, +so the application must return the exact number of bytes the library +requests to be written. + +A typical implementation could be: + + mng_bool my_write (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pWritten) { + *pWritten = fwrite (pBuf, 1, iBuflen, myfile); + return MNG_TRUE; + } + +\- mng_bool mng_errorproc (mng_handle hHandle, + mng_int32 iErrorcode, + mng_int8 iSeverity, + mng_chunkid iChunkname, + mng_uint32 iChunkseq, + mng_int32 iExtra1, + mng_int32 iExtra2, + mng_pchar zErrortext) + +This function is called whenever an error is detected inside the +library. This may be caused by invalid input, callbacks indicating +failure, or wrongfully calling functions out of place. + +If you do not provide this callback the library will still return +an errorcode from the called function, and the mng_getlasterror() +function can be used to retrieve the other parameters. + +This function is currently only provided for convenience, but may +at some point be used to indicate certain errors may be acceptable, +and processing should continue. + +\- mng_bool mng_traceproc (mng_handle hHandle, + mng_int32 iFuncnr, + mng_int32 iFuncseq, + mng_pchar zFuncname) + +This function is provided to allow a functional analysis of the +library. This may be useful if you encounter certain errors and +cannot determine what the problem is. + +Almost all functions inside the library will activate this +callback with an appropriate function-name at the start and end +of the function. Please note that large images may generate an +enormous amount of calls. + +\- mng_bool mng_processheader (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight) + +This function is called once the header information of an input- +image has been processed. At this point the image dimensions are +available and also some other properties depending on the type +of the image. Eg. for a MNG the frame-/layercount, playtime & +simplicity fields are known. + +The primary purpose of this callback is to inform the application +of the size of the image, and for the application to initialize +the drawing canvas to be used by the library. This is also a good +point to set the canvas-style. Eg. mng_set_canvasstyle(). + +\- mng_bool mng_processtext (mng_handle hHandle, + mng_uint8 iType, + mng_pchar zKeyword, + mng_pchar zText, + mng_pchar zLanguage, + mng_pchar zTranslation) + +This callback is activated for each textual chunk in the input- +image. These are tEXt, zTXt & iTXt. It may be used to retain +specific comments for presentation to the user. + +\- mng_bool mng_processsave (mng_handle hHandle) + +\- mng_bool mng_processseek (mng_handle hHandle, + mng_pchar zName) + +The purpose of these callbacks is to signal the processing of the +SAVE & SEEK chunks in a MNG input-file. This may be used in the +future to specify some special processing. At the moment these +functions are only provided as a signal. + +\- mng_ptr mng_getcanvasline (mng_handle hHandle, + mng_uint32 iLinenr) + +\- mng_ptr mng_getbkgdline (mng_handle hHandle, + mng_uint32 iLinenr) + +\- mng_ptr mng_getalphaline (mng_handle hHandle, + mng_uint32 iLinenr) + +These callbacks are used to access the drawing canvas, background +canvas and an optional separate alpha-channel canvas. The latter is +used only with the MNG_CANVAS_RGB8_A8 canvas-style. + +If the getbkgdline() callback is not supplied the library will +composite fully or partially transparent pixels in the image against +a specified background color. See mng_set_bgcolor() for more details. +If a chosen canvas-style includes an alpha-channel, this callback +is very likely not needed. + +The application is responsible for returning a pointer to a line of +pixels, which should be in the exact format as defined by the call +to mng_set_canvasstyle() and mng_set_bkgdstyle(), without gaps between +the representation of each pixel, unless specified by the canvas-style. + +\- mng_bool mng_refresh (mng_handle hHandle, + mng_uint32 iX, + mng_uint32 iY, + mng_uint32 iWidth, + mng_uint32 iHeight) + +This callback is called when the library has drawn a complete frame +onto the drawing canvas, and it is ready to be displayed. +The application is responsible for transferring the drawing canvas +from memory onto the actual output device. + +\- mng_uint32 mng_gettickcount (mng_handle hHandle) + +This function should return the number of milliseconds on some internal +clock. The entire animation timing depends heavily on this function, +and the number returned should be as accurate as possible. + +\- mng_bool mng_settimer (mng_handle hHandle, + mng_uint32 iMsecs) + +This callback is activated every time the library requires a "pause". +Note that the function itself should NOT execute the wait. It should +simply store the time-field and allow the library to return. Libmng +will return with the MNG_NEEDTIMERWAIT code, indicating the callback +was called and it is now time to execute the pause. + +After the indicated number of milliseconds have elapsed, the application +should call mng_display_resume(), to resume the animation as planned. + +This method allows for both a real timer or a simple wait command in the +application. Whichever method you select, both the gettickcount() and +settimer() callbacks are crucial for proper animation timing. + +\- mng_bool mng_processgamma (mng_handle hHandle, + mng_uint32 iGamma) + +\- mng_bool mng_processchroma (mng_handle hHandle, + mng_uint32 iWhitepointx, + mng_uint32 iWhitepointy, + mng_uint32 iRedx, + mng_uint32 iRedy, + mng_uint32 iGreenx, + mng_uint32 iGreeny, + mng_uint32 iBluex, + mng_uint32 iBluey) + +\- mng_bool mng_processsrgb (mng_handle hHandle, + mng_uint8 iRenderingintent) + +\- mng_bool mng_processiccp (mng_handle hHandle, + mng_uint32 iProfilesize, + mng_ptr pProfile) + +\- mng_bool mng_processarow (mng_handle hHandle, + mng_uint32 iRowsamples, + mng_bool bIsRGBA16, + mng_ptr pRow) + +These callbacks are only required when you selected the MNG_APP_CMS +directive during compilation of the library. See the configuration +section for more details. + +\- mng_bool mng_iteratechunk (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid iChunkid, + mng_uint32 iChunkseq) + +This callback is only used for the mng_iterate_chunks() function. +It is called exactly once for each chunk stored. + + +.SH III. Housekeeping + + +.SS Memory management + +The library can use internal memory allocation/deallocation or use +provided callbacks for its memory management. The choice is made at +compilation time. See the section on customization for details. + +If internal management has been selected, the memory callback functions +need not be supplied. Even if you do supply them they will not be used. +The actual code used is similar to the code discussed in the callback +section: + + pPtr = calloc (1, iLen); + + free (pPtr); + +If your compiler does not support these functions, or you wish to monitor +the library's use of memory for certain reasons, you can choose to +compile the library with external memory management. In this case the +memory callback functions MUST be supplied, and should function as if the +above code was used. + + +.SS Initialization + +The basic initialization of the library is short and swift: + + myhandle = mng_initialize (myuserdata, my_alloc, + my_free, MNG_NULL); + if (myhandle == MNG_NULL) + /* process error */; + +The first field is an application-only parameter. It is saved in +libmng's internal structures and available at all times through the +mng_get_userdata() function. This is especially handy in callback functions +if your program may be handling multiple files at the same time. + +The second and third field supply the library with the memory callback +function entry-points. These are described in more detail in the callback +section and the previous paragraph. + +The fourth and last field may be used to supply the library with the +entry-point of a trace callback function. For regular use you will not +need this! + +The function returns a handle which will be your ticket to MNG-heaven. +All other functions rely on this handle. It is the single fixed unique +reference-point between your application and the library. + +You should call the initialization function for each image you wish to +process simultaneously. If you are processing images consecutively, you can +reset the internal status of the library with the mng_reset() function. +This function will clear all internal state variables, free any stored +chunks and/or objects, etc, etc. Your callbacks and other external parameters +will be retained. + +After you successfully received the handle it is time to set the required +callbacks. The sections on reading, displaying & writing indicate which +callbacks are required and which are optional. +To set the callbacks simply do: + + myretcode = mng_setcb_xxxxxx (myhandle, my_xxxxxx); + if (myretcode != MNG_NOERROR) + /* process error */; + +Naturally you'd replace the x's with the name of the callback. + + +.SS Cleanup + +Once you've gotten hold of that precious mng_handle, you should always, +and I mean always, call the cleanup function when you're done. +Just do: + + mng_cleanup (myhandle); + +And you're done. There shouldn't be an ounce of memory spilled after +that call. + +Note that if you would like to process multiple files consecutively +you do not need to do mng_cleanup() / mng_initialize() between each file +but simply + + myretcode = mng_reset (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + +will suffice. Saves some time and effort, that. + + +.SS Error handling + +From the examples in the previous paragraphs you may have noticed a +meticulous scheme for error handling. And yes, that's exactly what it is. +Practically each call simply returns an errorcode, indicating success, +eg. MNG_NOERROR or failure, anything else but MNG_NEEDMOREDATA and +MNG_NEEDTIMERWAIT. These latter two will be discussed in more detail in +their respective fields of interest: the reading section and displaying +section respectively. + +It is the application's responsibility to check the returncode after +each call. You can call mng_getlasterror() to receive the details of +the last detected error. This even includes a discriptive error-message +if you enabled that option during compilation of the library. + +Note that after receiving an error it is still possible to call the +library, but it's also very likely that any following call will fail. +The only functions deemed to work will be mng_reset() and mng_cleanup(). +Yes, if you abort your program after an error, you should still call +mng_cleanup(). + + +.SH IV. Reading + +Reading a MNG, JNG or PNG is fairly easy. It depends slightly on your +ultimate goal how certain specifics are to be handled, but the basics +are similar in all cases. + +For the read functioins to work you must have compiled the library with +the MNG_READ_SUPPRT directive. The standard DLL and Shared Library +have this on by default! + + +.SS Setup + +Naturally you must have initialized the library and be the owner of +a mng_handle. The following callbacks are essential: + + mng_openstream, mng_readdata, mng_closestream + +You may optionally define: + + mng_errorproc, mng_traceproc + mng_processheader, mng_processtext + mng_processsave, mng_processseek + +The reading bit will also fail if you are already creating or +displaying a file. Seems a bit obvious, but I thought I'd mention it, +just in case. + + +.SS To suspend or not to suspend + +There is one choice you need to make before calling the read function. +Are you in need of suspension-mode or not? + +If you're reading from a disk you most certainly do not need +suspension-mode. Even the oldest and slowest of disks will be fast +enough for straight reading. + +However, if your input comes from a really slow device, such as a +dialup-line or the likes, you may opt for suspension-mode. This is done +by calling + + myretcode = mng_set_suspensionmode (myhandle, + MNG_TRUE); + if (myretcode != MNG_NOERROR) + /* process error */; + +Suspension-mode will force the library to use special buffering on the +input. This allows your application to receive data of arbitrarily length +and return this in the mng_readdata() callback, without disturbing the +chunk processing routines of the library. + +Suspension-mode does require a little extra care in the main logic of the +application. The read function may return with MNG_NEEDMOREDATA when the +mng_readdata() callback returns less data then it needs to process the +next chunk. This indicates the application to wait for more data to arrive +and then resume processing by calling mng_read_resume(). + + +.SS The read HLAPI + +The actual reading is just plain simple. Since all I/O is done +outside the library through the callbacks, the library can focus on +its real task. Understanding, checking and labelling the input data! + +All you really need to do is this: + + myretcode = mng_read (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + +Of course, if you're on suspension-mode the code is a little more +complicated: + + myretcode = mng_read (myhandle); + + while (myretcode == MNG_NEEDMOREDATA) { + /* wait for input-data to arrive */ + myretcode = mng_read_resume (myhandle); + } + + if (myretcode != MNG_NOERROR) + /* process error */; + +This is rather crude and more sophisticated programming methods may +dictate another approach. Whatever method you decide on, it should +act as if the above code was in its place. + +There is also the mng_readdisplay() function, but this is discussed +in the displaying section. It functions pretty much as the mng_read() +function, but also immediately starts displaying the image. +mng_read_resume() should be replaced by mng_display_resume() in that +case! + + +.SS What happens inside + +What actually happens inside the library depends on the configuration +options set during the compilation of the library. + +Basically the library will first read the 8-byte file header, to determine +its validity and the type of image it is about to process. Then it will +repeatedly read a 4-byte chunk-length and then the remainder of the chunk +until it either reaches EOF (indicated by the mng_readdata() callback) or +implicitly decides EOF as it processed the logically last chunk of the +image. + +Applications that require strict conformity and do not allow superfluous +data after the ending chunk, will need to perform this check in their +mng_closestream() callback. + +Each chunk is then checked on CRC, after which it is handed over to the +appropriate chunk processing routine. These routines will disect the +chunk, check the validity of its contents, check its position with respect +to other chunks, etc, etc. + +If everything checks out, the chunk is further processed as follows: + +If display support has been selected during compilation, certain pre-display +initialization will take place. + +If chunk-storage support has been selected during compilation, the chunks +data may be stored in a special internal structure and held for future +reference. + + +.SS Storing and accessing chunks + +One of the compilation options activates support for chunk storage. +This option may be useful if you want to examine an image. The directive +is MNG_STORE_CHUNKS. You must also turn on the MNG_ACCESS_CHUNKS +directive. + +The actual storage facility can be turned on or off with the +mng_set_storechunks() function. If set to MNG_TRUE, chunks will be +stored as they are read. + +At any point you can then call the mng_iterate_chunks() function +to iterate through the current list of chunks. This function requires +a callback which is called for each chunk and receives a specific +chunk-handle. This chunk-handle can be used to call the appropriate +mng_getchunk_xxxx() function, to access the chunks properties. + +A typical implementation may look like this: + + mng_bool my_iteratechunk (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid iChunkid, + mng_uint32 iChunkseq) { + switch (iChunkid) { + case MNG_UINT_MHDR : { /* process MHDR */; + break; } + case MNG_UINT_FRAM : { /* process FRAM */; + break; } + + ...etc... + + case MNG_UINT_HUH : { /* unknown chunk */; + break; } + default : { /* duh; forgot one */; } + } + + return MNG_TRUE; /* keep'm coming */ + } + +To get to the actual chunk fields of lets say a SHOW chunk you would do: + + mng_bool isempty; + mng_uint16 firstid, lastid; + mng_uint8 showmode; + + myretcode mng_getchunk_show (hHandle, hChunk, + isempty, firstid, + lastid, showmode); + if (myretcode != MNG_NOERROR) + /* process error */; + + +.SH V. Displaying + + +.SS Setup + +Assuming you have initialized the library and are the owner of +a mng_handle. The following callbacks are essential: + + mng_getcanvasline, mng_refresh + mng_gettickcount, mng_settimer + +If you wish to use an application supplied background you must supply: + + mng_getbkgdline + +If you wish to use the MNG_CANVAS_RGB8_A8 canvas style you must supply: + + mng_getalphaline + +You may optionally define: + + mng_errorproc, mng_traceproc + mng_processheader, mng_processtext + mng_processsave, mng_processseek + +Note that the mng_processheader() callback is optional but will +be quite significant for proper operation! + +Displaying an image will fail if you are creating a file or already +displaying one. Yes, you can't display it twice! + + +.SS A word on canvas styles + +The canvas style describes how your drawing canvas is made up. +You must set this before the library actually starts drawing, so +the mng_processheader() callback is a pretty good place for it. + +Currently only 8-bit RGB canvas styles are supported, either with +or without an alpha channel. + +If you like to do alpha composition yourself you can select one of +the canvas styles that include an alpha channel. You can even have +a separate alpha canvas by selecting the MNG_CANVAS_RGB8_A8 style. + +All styles require a compact model. Eg. MNG_CANVAS_BGR8 requires +your canvas lines in bgrbgrbgr... storage, where each letter +represents an 8-bit value of the corresponding color, and each +threesome makes up the values of one(1) pixel. + +The library processes a line at a time, so the canvas lines do not +actually need to be consecutive in memory. + + +.SS Alpha composition and application backgrounds + +All Network Graphics can be partially transparent. This requires +special processing if you need to display an image against some +background. Note that the MNG header (MHDR chunk) contains a +simplicity field indicating whether transparency information in +the file is critical or not. This only applies to embedded images, +which means the full image-frame of the MNG may still contain fully +transparent pixels! + +Depending on your needs you can supply a single background color, +a background canvas or tell the library to return the alpha-channel +and do alpha composition yourself. + +This is different from the BACK chunk in a MNG, or the bKGD chunk +in an (embedded) PNG or JNG. The BACK chunk indicates an optional or +mandatory background color and/or image. The bKGD chunk only indicates +an optional background color. These chunks indicate the Authors +preferences. They may be absent in which case you need to supply +some sort of background yourself. + +.SS Composing against a background color + +This is the easiest method. Call the mng_set_bgcolor() function to +set the values of the red, green and blue component of your preferred +background color. + +Use one of the canvas styles that do not have an alpha-channel, and +which matches your output requirements. + +.SS Composing against a background canvas + +This is somewhat more complicated. You will need to set the +mng_getbkgdline() callback. This will be called whenever the library +needs to compose a partially transparent line. + +This canvas must hold the background against which the image should +be composed. Its size must match exactly with the image dimensions +and thus the drawing canvas! + +Use one of the canvas styles that do not have an alpha-channel, and +which matches your output requirements. The canvas style of the +background canvas may even differ from the drawing canvas. The library's +composing will still function properly. + +.SS Composing within the application + +If you have the option in your application to draw a (partially) +transparent canvas to the output device, this option is preferred. + +Select one of the canvas styles that do have an alpha-channel. +The library will now supply the appropriate alpha information, +allowing the application to compose the image as it sees fit. + + +.SS Color information and CMS + +Network Graphics may, and usually will, contain color-correction +information. This information is intended to compensate for the +difference in recording and display devices used. + +This document does not address the specifics of color-management. +See the PNG specification for a more detailed description. + +.SS Using little cms by Marti Maria Saguer + +This is the easiest method, providing you can compile the lcms package. +Select the MNG_FULL_CMS directive during compilation, and sit back and +relax. The library will take care of all color-correction for you. + +.SS Using an OS- or application-supplied CMS + +If you are so lucky to have access to CMS functionality from within +your application, you may instruct the library to leave color-correction +to you. + +Select the MNG_APP_CMS directive during compilation of the library. +You MUST also set the following callbacks: + + mng_processgamma, mng_processchroma, + mng_processsrgb, mng_processiccp and + mng_processarow + +The last callback is called when the library needs you to correct +an arbitrary line of pixels. The other callbacks are called when +the corresponding color-information is encountered in the file. +You must store this information somewhere for use in the +mng_processarow() callback. + +.SS Using gamma-only correction + +This isn't a preferred method, but it's better than no correction +at all. Gamma-only correction will at least compensate for +gamma-differences between the original recorder and your output device. + +Select the MNG_GAMMA_ONLY directive during compilation +of the library. Your compiler MUST support fp operations. + +.SS No color correction + +Ouch. This is really bad. This is the least preferred method, +but may be necessary if your system cannot use lcms, doesn't +have its own CMS, and does not allow fp operations, ruling out +the gamma-only option. + +Select the MNG_NO_CMS directive during compilation. +Images will definitely not be displayed as seen by the Author!!! + + +.SS Animations and timing + +Animations require some form of timing support. The library relies +on two callbacks for this purpose. The mng_gettickcount() and +mng_settimer() callbacks. mng_gettickcount() is used to determine +the passing of time in milliseconds since the beginning of the +animation. This is also used to compensate during suspension-mode +if you are using the mng_readdisplay() function to read & display +the file simultaneously. + +The callback may return an arbitrary number of milliseconds, but +this number must increase proportionaly between calls. Most modern +systems will have some tickcount() function which derives its +input from an internal clock. The value returned from this function +is more than adequate for libmng. + +The mng_settimer() callback is called when the library determines +a little "pause" is required before rendering another frame of the +animation. The pause interval is also expressed in milliseconds. +Your application should store this value and return immediately. +The library will then make appropriate arrangements to store its +internal state and returns to your application with the +MNG_NEEDTIMERWAIT code. + +At that point you should suspend processing and wait the given +interval. Please use your OS features for this. Do not engage some +sort of loop. That is real bad programming practice. Most modern +systems will have some timing functions. A simple wait() function +may suffice, but this may prevent your applications main-task from +running, and possibly prevent the actual update of your output device. + + +.SS The mng_refresh() callback + +The mng_refresh() callback is called whenever the library has +"finished" drawing a new frame onto your canvas, and just before it +will call the mng_settimer() callback. + +This allows you to perform some actions necessary to "refresh" the +canvas onto your output device. Please do NOT suspend processing +inside this callback. This must be handled after the mng_settimer() +callback! + + +.SS Displaying while reading + +This method is preferred if you are reading from a slow input device +(such as a dialup-line) and you wish to start displaying something +as quickly as possible. This functionality is provided mainly for +browser-type applications but may be appropriate for other +applications as well. + +The method is usually used in unison with the suspension-mode of +the read module. A typical implementation would look like this: + + /* initiale library and set required callbacks */ + + /* activate suspension-mode */ + myretcode = mng_set_suspensionmode (myhandle, + MNG_TRUE); + if (myretcode != MNG_NOERROR) + /* process error */; + + myretcode = mng_readdisplay (myhandle); + + while ((myretcode == MNG_NEEDMOREDATA) || + (myretcode == MNG_NEEDTIMERWAIT)) { + if (myretcode == MNG_NEEDMOREDATA) + /* wait for more input-data */; + else + /* wait for timer interval */; + + myretcode = mng_display_resume (myhandle); + } + + if (myretcode != MNG_NOERROR) + /* process error */; + +More advanced programming methods may require a different approach, +but the final result should function as in the code above. + + +.SS Displaying after reading + +This method is used to display a file that was previously read. +It is primarily meant for viewers with direct file access, such as +1a local harddisk. + +Once you have successfully read the file, all you need to do is: + + myretcode = mng_display (myhandle); + + while (myretcode == MNG_NEEDTIMERWAIT) { + /* wait for timer interval */; + myretcode = mng_display_resume (myhandle); + } + + if (myretcode != MNG_NOERROR) + /* process error */; + +Again, more advanced programming methods may require a different +approach, but the final result should function as in the code above. + + +.SS Display manipulation + +Several HLAPI functions are provided to allow a user to manipulate +the normal flow of an animation. + +\- mng_display_freeze (mng_handle hHandle) + +This will "freeze" the animation in place. + +\- mng_display_resume (mng_handle hHandle) + +This function can be used to resume a frozen animation, or to force +the library to advance the animation to the next frame. + +\- mng_display_reset (mng_handle hHandle) + +This function will "reset" the animation into its pristine state. +Calling mng_display() afterwards will re-display the animation +from the first frame. + +\- mng_display_golayer (mng_handle hHandle, + mng_uint32 iLayer) + +\- mng_display_goframe (mng_handle hHandle, + mng_uint32 iFrame) + +\- mng_display_gotime (mng_handle hHandle, + mng_uint32 iPlaytime) + +These three functions can be used to "jump" to a specific layer, frame +or timeslot in the animation. You must "freeze" the animation before +using any of these functions. + +All above functions may only be called during a timer interval! +It is the applications responsibility to cleanup any resources with +respect to the timer wait. + + +.SH VI. Writing + +The main focus of the library lies in its displaying capabilites. +But it does offer writing support as well. +You can create and write a file, or you can write a file you +have previously read, providing the storage of chunks was enabled +and active. + +For this to work you must have compiled the library with the +MNG_WRITE_SUPPO1RT and MNG_ACCESS_CHUNKS directives. The standard DLL and +Shared Library have this on by default! + + +.SS Setup + +As always you must have initialized the library and be the owner of +a mng_handle. The following callbacks are essential: + + mng_openstream, mng_writedata, mng_closestream + +You can optionally define: + + mng_errorproc, mng_traceproc + +The creation and writing functions will fail if you are in the middle +of reading, creating or writing a file. + + +.SS Creating a new file + +To start a new file the library must be in its initial state. +First you need to tell the library your intentions: + + myretcode = mng_create (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + +After that you start adding the appropriate chunks: + + myretcode = mng_put1chunk_mhdr (myhandle, ...); + if (myretcode != MNG_NOERROR) + /* process error */; + +And so on, and so forth. Note that the library will automatically signal +the logical end of the file by the ending chunk. Also the first chunk +will indicate the library the filetype (eg. PNG, JNG or MNG) and force +the proper signature when writing the file. + +The code above can be simplified, as you can always get the last errorcode +by using the mng_getlasterror() function: + + if ( (mng_putchunk_xxxx (myhandle, ...)) or + (mng_putchunk_xxxx (myhandle, ...)) or + ...etc... ) + /* process error */; + +Please note that you must have a pretty good understanding of the chunk +specification. Unlike the read functions, there are virtually no checks, +so it is quite possible to write completely wrong files. +It is a good practice to read back your file into the library to verify +its integrity. + +Once you've got all the chunks added, all you do is: + + myretcode mng_write (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + +And presto. You're done. The real work is of course carried out in +your callbacks. Note that this is a single operation as opposed to +the read & display functions that may return with MNG_NEEDMOREDATA +and/or MNG_NEEDTIMERWAIT. The write function just does the job, and +only returns after it's finished or if it encounters some +unrecoverable error. + + +.SS Writing a previously read file + +If you have already successfully read a file, you can use the library to +write it out as a copy or something. You MUST have compiled the library +with the MNG_STORE_CHUNKS directive, and you must have done +mng_set_storechunks (myhandle, MNG_TRUE). + +This doesn't require the MNG_ACCESS_CHUNKS directive, unless you want +to fiddle with the chunks as well. + +Again all you need to do is: + + myretcode mng_write (myhandle); + if (myretcode != MNG_NOERROR) + /* process error */; + + +.SH VII. Modifying/Customizing libmng: + +not finished yet + +.SS Compilation directives + +not finished yet + +.SS Platform dependant modification + +not finished yet + +.SH "SEE ALSO" +.IR mng(5), jng(5), png(5), libpng(3) + +.LP +libmng : +.IP +.br +http://www.libmng.com + +.LP +zlib : +.IP +.br +http://www.info-zip.org/pub/infozip/zlib/ + +.LP +IJG JPEG library : +.IP +.br +http://www.ijg.org + +.LP +lcms (little CMS) by Marti Maria Saguer : +.IP +.br +http://www.littlecms.com/ + +.LP +MNG specification: +.IP +.br +http://www.libpng.org/pub/mng + +.LP +In the case of any inconsistency between the MNG specification +and this library, the specification takes precedence. + + +.SH AUTHORS +This man page: Gerard Juyn + + +The contributing authors would like to thank all those who helped +with testing, bug fixes, and patience. This wouldn't have been +possible without all of you!!! + + +.SH COPYRIGHT NOTICE: + +Copyright (c) 2000-2002 Gerard Juyn + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Gerard Juyn + +The MNG Library is supplied "AS IS". The Contributing Authors +disclaim all warranties, expressed or implied, including, without +limitation, the warranties of merchantability and of fitness for any +purpose. The Contributing Authors assume no liability for direct, +indirect, incidental, special, exemplary, or consequential damages, +which may result from the use of the MNG Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented; +you must not claim that you wrote the original software. + +2. Altered versions must be plainly marked as such and must not be +misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any source +or altered source distribution. + +The Contributing Authors specifically permit, without fee, and +encourage the use of this source code as a component to supporting +the MNG and JNG file format in commercial products. If you use this +source code in a product, acknowledgment would be highly appreciated. + +.SH Remarks + +Parts of this software have been adapted from the libpng library. +Although this library supports all features from the PNG specification +(as MNG descends from it) it does not require the libpng library. +It does require the zlib library and optionally the IJG JPEG library, +and/or the "little-cms" library by Marti Maria Saguer (depending on the +inclusion of support for JNG and Full-Color-Management respectively. + +This library's function is primarily to read and display MNG +animations. It is not meant as a full-featured image-editing +component! It does however offer creation and editing functionality +at the chunk level. (future modifications may include some more +support for creation and or editing) + +.\" end of man page diff --git a/src/3rdparty/libmng/doc/man/mng.5 b/src/3rdparty/libmng/doc/man/mng.5 new file mode 100644 index 0000000000..e40c249100 --- /dev/null +++ b/src/3rdparty/libmng/doc/man/mng.5 @@ -0,0 +1,42 @@ +.TH MNG 5 "July 25, 2000" +.SH NAME +mng \- Multiple-image Network Graphics (MNG) format +.SH DESCRIPTION +MNG (Multiple-image Network Graphics) is the animation extension of the +popular PNG image-format. PNG (Portable Network Graphics) is an +extensible file format for the lossless, portable, well-compressed +storage of raster images. +.br + +MNG has advanced animation features which make it very useful as a full +replacement for GIF animations. These features allow animations that +are impossible with GIF or result in much smaller files as GIF. + +As MNG builds on the same structure as PNG, it is robust, extensible and +free of patents. It retains the same clever file integrity checks as in PNG. + +MNG also embraces the lossy JPEG image-format in a sub-format named JNG, +which allows for alpha-transparency and color-correction on highly +compressed (photographic) images. + +.SH "SEE ALSO" +.IR png(5) ", " jng(5) ", " libmng(3) ", " libpng(3) ", " zlib(3) ", " +deflate(5) ", " zlib(5) ", " jpeg(5) +.LP +MNG 1.00, Februari 9, 2001: +.IP +.br +http://www.libpng.org/pub/mng +.SH AUTHORS +This man page: Gerard Juyn +.LP +Multiple-image Network Graphics (MNG) Specification Version 1.00 (Februari 9, 2001): +Glenn Randers-Pehrson and others (png-list@ccrc.wustl.edu). +.LP + +.SH COPYRIGHT NOTICE +The MNG-1.00 specification is copyright (c) 1998-2001 Glenn Randers-Pehrson. +See the specification for conditions of use and distribution. +.LP +.\" end of man page + diff --git a/src/3rdparty/libmng/doc/misc/magic.dif b/src/3rdparty/libmng/doc/misc/magic.dif new file mode 100644 index 0000000000..005ad5a746 --- /dev/null +++ b/src/3rdparty/libmng/doc/misc/magic.dif @@ -0,0 +1,30 @@ +--- magic.orig Wed Aug 14 16:48:56 2002 ++++ magic Wed Aug 14 16:50:09 2002 +@@ -2544,6 +2544,27 @@ + >>28 byte 1 interlaced + 1 string PNG PNG image data, CORRUPTED + ++#MNG ++# 0x8a M N G 0x0d 0x0a 0x1a 0x0a [4-byte pad] ++# M H D R [4-byte width][4-byte height][4-byte ticks][4-byte layers] ++# [4-byte frame][4-byte time] ++# ++0 string \x8aMNG MNG image data, ++>4 belong !0x0d0a1a0a CORRUPTED ++>4 belong 0x0d0a1a0a ++>>16 belong x %ld x ++>>20 belong x %ld ++ ++#JNG ++# 0x8b J N G 0x0d 0x0a 0x1a 0x0a [4-byte pad] ++# J H D R [4-byte width][4-byte height] ++# ++0 string \x8bJNG JNG image data, ++>4 belong !0x0d0a1a0a CORRUPTED ++>4 belong 0x0d0a1a0a ++>>16 belong x %ld x ++>>20 belong x %ld ++ + # GIF + 0 string GIF8 GIF image data + >4 string 7a \b, version 8%s, diff --git a/src/3rdparty/libmng/doc/rpm/libmng-1.0.10-rhconf.patch b/src/3rdparty/libmng/doc/rpm/libmng-1.0.10-rhconf.patch new file mode 100644 index 0000000000..a73b79dbe5 --- /dev/null +++ b/src/3rdparty/libmng/doc/rpm/libmng-1.0.10-rhconf.patch @@ -0,0 +1,38 @@ +--- libmng/makefiles/makefile.linux.orig Sat Jul 1 15:10:35 2000 ++++ libmng/makefiles/makefile.linux Sat Jul 1 15:14:52 2000 +@@ -13,19 +13,19 @@ + OPTIONS = -DMNG_BUILD_SO + + # where "make install" puts libmng.a,libmng.so*,libmng.h,libmng_conf.h,libmng_types.h +-prefix=/usr/local ++prefix=/usr + + # Where the zlib library and include files are located +-ZLIBLIB=../zlib +-ZLIBINC=../zlib ++ZLIBLIB=/usr/lib ++ZLIBINC=/usr/include + + # Where the jpeg library and include files are located +-JPEGLIB=../jpgsrc +-JPEGINC=../jpgsrc ++JPEGLIB=/usr/lib ++JPEGINC=/usr/include + + # Where the lcms library and include files are located +-LCMSLIB=../lcms/lib +-LCMSINC=../lcms/source ++LCMSLIB=/usr/lib ++LCMSINC=/usr/include + + ALIGN= + # for i386: +@@ -37,7 +37,7 @@ + + # for pgcc version 2.95.1, -O3 is buggy; don't use it. + +-CFLAGS=-I$(ZLIBINC) -I$(JPEGINC) -I$(LCMSINC) -Wall -O3 -funroll-loops \ ++CFLAGS=-I$(ZLIBINC) -I$(JPEGINC) -I$(LCMSINC) -Wall $(RPM_OPT_FLAGS) \ + $(OPTIONS) $(ALIGN) # $(WARNMORE) -g + LDFLAGS=-L. -Wl,-rpath,. \ + -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) \ diff --git a/src/3rdparty/libmng/doc/rpm/libmng.spec b/src/3rdparty/libmng/doc/rpm/libmng.spec new file mode 100644 index 0000000000..89908d7a97 --- /dev/null +++ b/src/3rdparty/libmng/doc/rpm/libmng.spec @@ -0,0 +1,116 @@ +Summary: A library of functions for manipulating MNG format files. +Name: libmng +Version: 1.0.10 +Release: 2.1 +Copyright: AS IS +Group: System Environment/Libraries +Source0: libmng-%{PACKAGE_VERSION}.tar.gz +Patch: libmng-%{PACKAGE_VERSION}-rhconf.patch +URL: http://www.libmng.com/ +BuildRoot: /var/tmp/libmng-root +BuildPrereq: libjpeg-devel, zlib-devel, lcms-devel + +%description +libmng - library for reading, writing, displaying and examing +Multiple-Image Network Graphics. MNG is the animation extension to the +popular PNG image-format. + +%package devel +Summary: Development tools for programs to manipulate MNG format files. +Group: Development/Libraries +Requires: libmng = %{PACKAGE_VERSION} +%description devel +The libmng-devel package contains the header files and static +libraries necessary for developing programs using the MNG +(Multiple-Image Network Graphics) library. + +If you want to develop programs which will manipulate MNG image format +files, you should install libmng-devel. You'll also need to install +the libmng package. + +%changelog +* Fri Jul 13 2007 Glenn Randers-Pehrson +- updated to 1.0.10 + +* Thu Aug 5 2004 Gerard Juyn +* Sun Jan 30 2005 Gerard Juyn +- updated to 1.0.9 + +* Thu Aug 5 2004 Gerard Juyn +- updated to 1.0.8 + +* Sun Mar 21 2004 Gerard Juyn +- updated to 1.0.7 + +* Sun Oct 19 2003 Gerard Juyn +- updated to 1.0.6 + +* Tue Sep 24 2002 Gerard Juyn +- updated to 1.0.5 + +* Sun Jun 23 2002 Gerard Juyn +- updated to 1.0.4 + +* Mon Sep 18 2001 Gerard Juyn +- updated to 1.0.3 + +* Sat Jul 7 2001 Gerard Juyn +- updated to 1.0.2 + +* Wed May 2 2001 Gerard Juyn +- updated to 1.0.1 + +* Mon Feb 5 2001 Gerard Juyn +- updated to 1.0.0 + +* Fri Jan 19 2001 Gerard Juyn +- updated to 0.9.4 + +* Sat Oct 28 2000 Gerard Juyn +- updated to 0.9.3 + +* Tue Aug 15 2000 MATSUURA Takanori +- based on libmng-0.9.2/doc/rpm/libmng.spec +- use %%configure and %%makeinstall + +* Sat Aug 5 2000 Gerard Juyn +- updated to 0.9.2 + +* Wed Jul 26 2000 Gerard Juyn +- updated to 0.9.1 + +* Sat Jul 1 2000 MATSUURA Takanori +- updated to 0.9.0 + +* Sat Jun 24 2000 MATSUURA Takanori +- 1st release for RPM + +%prep +%setup +%configure + +%build +make + +%install +rm -rf $RPM_BUILD_ROOT +%makeinstall + +%clean +rm -rf $RPM_BUILD_ROOT + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%defattr(-,root,root) +%doc CHANGES LICENSE README doc +/usr/lib/libmng.so.* + +%files devel +%defattr(-,root,root) +/usr/include/* +/usr/lib/libmng.a +/usr/lib/libmng.so + diff --git a/src/3rdparty/libmng/libmng.h b/src/3rdparty/libmng/libmng.h new file mode 100644 index 0000000000..b3b1ab1418 --- /dev/null +++ b/src/3rdparty/libmng/libmng.h @@ -0,0 +1,2932 @@ +/* ************************************************************************** */ +/* * * */ +/* * COPYRIGHT NOTICE: * */ +/* * * */ +/* * Copyright (c) 2000-2007 Gerard Juyn * */ +/* * [You may insert additional notices after this sentence if you modify * */ +/* * this source] * */ +/* * * */ +/* * For the purposes of this copyright and license, "Contributing Authors" * */ +/* * is defined as the following set of individuals: * */ +/* * * */ +/* * Gerard Juyn - gjuyn :at: users.sourceforge.net * */ +/* * Glenn Randers-Pehrson - glennrp :at: users.sourceforge.net * */ +/* * Raphael Assenat - raph :at: raphnet.net * */ +/* * John Stiles - * */ +/* * * */ +/* * The MNG Library is supplied "AS IS". The Contributing Authors * */ +/* * disclaim all warranties, expressed or implied, including, without * */ +/* * limitation, the warranties of merchantability and of fitness for any * */ +/* * purpose. The Contributing Authors assume no liability for direct, * */ +/* * indirect, incidental, special, exemplary, or consequential damages, * */ +/* * which may result from the use of the MNG Library, even if advised of * */ +/* * the possibility of such damage. * */ +/* * * */ +/* * Permission is hereby granted to use, copy, modify, and distribute this * */ +/* * source code, or portions hereof, for any purpose, without fee, subject * */ +/* * to the following restrictions: * */ +/* * * */ +/* * 1. The origin of this source code must not be misrepresented; * */ +/* * you must not claim that you wrote the original software. * */ +/* * * */ +/* * 2. Altered versions must be plainly marked as such and must not be * */ +/* * misrepresented as being the original source. * */ +/* * * */ +/* * 3. This Copyright notice may not be removed or altered from any source * */ +/* * or altered source distribution. * */ +/* * * */ +/* * The Contributing Authors specifically permit, without fee, and * */ +/* * encourage the use of this source code as a component to supporting * */ +/* * the MNG and JNG file format in commercial products. If you use this * */ +/* * source code in a product, acknowledgment would be highly appreciated. * */ +/* * * */ +/* ************************************************************************** */ +/* * * */ +/* * Parts of this software have been adapted from the libpng package. * */ +/* * Although this library supports all features from the PNG specification * */ +/* * (as MNG descends from it) it does not require the libpng package. * */ +/* * It does require the zlib library and optionally the IJG jpeg library, * */ +/* * and/or the "little-cms" library by Marti Maria (depending on the * */ +/* * inclusion of support for JNG and Full-Color-Management respectively. * */ +/* * * */ +/* * This library's function is primarily to read and display MNG * */ +/* * animations. It is not meant as a full-featured image-editing * */ +/* * component! It does however offer creation and editing functionality * */ +/* * at the chunk level. * */ +/* * (future modifications may include some more support for creation * */ +/* * and or editing) * */ +/* * * */ +/* ************************************************************************** */ + +/* ************************************************************************** */ +/* * * */ +/* * Version numbering * */ +/* * * */ +/* * X.Y.Z : X = release (0 = initial build) * */ +/* * Y = major version (uneven = test; even = production) * */ +/* * Z = minor version (bugfixes; 2 is older than 10) * */ +/* * * */ +/* * production versions only appear when a test-version is extensively * */ +/* * tested and found stable or for intermediate bug-fixes (recognized by * */ +/* * a change in the Z number) * */ +/* * * */ +/* * x.1.x = test version * */ +/* * x.2.x = production version * */ +/* * x.3.x = test version * */ +/* * x.4.x = production version * */ +/* * etc. * */ +/* * * */ +/* ************************************************************************** */ +/* * * */ +/* * Identifier naming conventions throughout this library * */ +/* * * */ +/* * iXxxx = an integer * */ +/* * dXxxx = a float * */ +/* * pXxxx = a pointer * */ +/* * bXxxx = a boolean * */ +/* * eXxxx = an enumeration * */ +/* * hXxxx = a handle * */ +/* * zXxxx = a zero-terminated string (pchar) * */ +/* * fXxxx = a pointer to a function (callback) * */ +/* * aXxxx = an array * */ +/* * sXxxx = a structure * */ +/* * * */ +/* * Macros & defines are in all uppercase. * */ +/* * Functions & typedefs in all lowercase. * */ +/* * Exported stuff is prefixed with MNG_ or mng_ respectively. * */ +/* * * */ +/* * (I may have missed a couple; don't hesitate to let me know!) * */ +/* * * */ +/* ************************************************************************** */ + +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : main application interface * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : The main application interface. An application should not * */ +/* * need access to any of the other modules! * */ +/* * * */ +/* * changes : 0.5.1 - 05/06/2000 - G.Juyn * */ +/* * - changed chunk iteration function * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - added chunk access functions * */ +/* * - added version control constants & functions * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added set_outputprofile2 & set_srgbprofile2 * */ +/* * - added empty-chunk put-routines * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - added version_dll & VERSION_DLL (for consistency) * */ +/* * - added version control explanatory text & samples * */ +/* * 0.5.1 - 05/15/2000 - G.Juyn * */ +/* * - added getimgdata & putimgdata functions * */ +/* * * */ +/* * 0.5.2 - 05/16/2000 - G.Juyn * */ +/* * - changed the version parameters (obviously) * */ +/* * 0.5.2 - 05/18/2000 - G.Juyn * */ +/* * - complimented constants for chunk-property values * */ +/* * 0.5.2 - 05/23/2000 - G.Juyn * */ +/* * - fixed MNG_UINT_pHYg value * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added support for get/set default zlib/IJG parms * */ +/* * 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - added MNG_BIGENDIAN_SUPPORT (contributed by Tim Rowley) * */ +/* * - separated configuration-options into "mng_conf.h" * */ +/* * - added RGB8_A8 canvasstyle * */ +/* * - added getalphaline callback for RGB8_A8 canvasstyle * */ +/* * 0.5.2 - 06/06/2000 - G.Juyn * */ +/* * - moved errorcodes from "mng_error.h" * */ +/* * - added mng_read_resume function to support * */ +/* * read-suspension * */ +/* * * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - changed the version parameters (obviously) * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added get/set for speedtype to facilitate testing * */ +/* * - added get for imagelevel during processtext callback * */ +/* * 0.5.3 - 06/24/2000 - G.Juyn * */ +/* * - fixed inclusion of IJG read/write code * */ +/* * 0.5.3 - 06/26/2000 - G.Juyn * */ +/* * - changed userdata variable to mng_ptr * */ +/* * * */ +/* * 0.9.0 - 06/30/2000 - G.Juyn * */ +/* * - changed refresh parameters to 'x,y,width,height' * */ +/* * * */ +/* * 0.9.1 - 07/06/2000 - G.Juyn * */ +/* * - added MNG_NEEDTIMERWAIT errorcode * */ +/* * - changed comments to indicate modified behavior for * */ +/* * timer & suspension breaks * */ +/* * 0.9.1 - 07/08/2000 - G.Juyn * */ +/* * - added get routines for internal display variables * */ +/* * - added get/set routines for suspensionmode variable * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added callbacks for SAVE/SEEK processing * */ +/* * - added get/set routines for sectionbreak variable * */ +/* * - added NEEDSECTIONWAIT errorcode * */ +/* * 0.9.1 - 07/19/2000 - G.Juyn * */ +/* * - added function to set frame-/layer-count & playtime * */ +/* * - added errorcode for updatemngheader if not a MNG * */ +/* * * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - fixed problem with trace-functions improperly wrapped * */ +/* * - added status_xxxx functions * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * - added function to set simplicity field * */ +/* * * */ +/* * 0.9.3 - 08/09/2000 - G.Juyn * */ +/* * - added check for simplicity-bits in MHDR * */ +/* * 0.9.3 - 08/12/2000 - G.Juyn * */ +/* * - added workaround for faulty PhotoShop iCCP chunk * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * 0.9.3 - 10/10/2000 - G.Juyn * */ +/* * - added support for alpha-depth prediction * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - fixed processing of unknown critical chunks * */ +/* * - removed test-MaGN * */ +/* * - added PNG/MNG spec version indicators * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added functions to retrieve PNG/JNG specific header-info * */ +/* * - added JDAA chunk * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added callback to process non-critical unknown chunks * */ +/* * 0.9.3 - 10/20/2000 - G.Juyn * */ +/* * - added errocode for delayed delta-processing * */ +/* * - added get/set for bKGD preference setting * */ +/* * 0.9.3 - 10/21/2000 - G.Juyn * */ +/* * - added get function for interlace/progressive display * */ +/* * * */ +/* * 0.9.4 - 01/18/2001 - G.Juyn * */ +/* * - added errorcode for MAGN methods * */ +/* * - removed test filter-methods 1 & 65 * */ +/* * * */ +/* * 1.0.0 - 02/05/2001 - G.Juyn * */ +/* * - version numbers (obviously) * */ +/* * * */ +/* * 1.0.1 - 02/08/2001 - G.Juyn * */ +/* * - added MEND processing callback * */ +/* * 1.0.1 - 04/21/2001 - G.Juyn (code by G.Kelly) * */ +/* * - added BGRA8 canvas with premultiplied alpha * */ +/* * 1.0.1 - 05/02/2001 - G.Juyn * */ +/* * - added "default" sRGB generation (Thanks Marti!) * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added optimization option for MNG-video playback * */ +/* * - added processterm callback * */ +/* * 1.0.2 - 06/25/2001 - G.Juyn * */ +/* * - added late binding errorcode (not used internally) * */ +/* * - added option to turn off progressive refresh * */ +/* * * */ +/* * 1.0.3 - 08/06/2001 - G.Juyn * */ +/* * - added get function for last processed BACK chunk * */ +/* * * */ +/* * 1.0.5 - 07/04/2002 - G.Juyn * */ +/* * - added errorcode for extreme chunk-sizes * */ +/* * 1.0.5 - 08/07/2002 - G.Juyn * */ +/* * - added test-option for PNG filter method 193 (=no filter) * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * - completed delta-image support * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - added HLAPI function to copy chunks * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * - added 'supports' call to check function availability * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - fixed LOOP iteration=0 special case * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 09/22/2002 - G.Juyn * */ +/* * - added bgrx8 canvas (filler byte) * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - added check for TERM placement during create/write * */ +/* * - added beta version function & constant * */ +/* * 1.0.5 - 11/07/2002 - G.Juyn * */ +/* * - added support to get totals after mng_read() * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G. Randers-Pehrson * */ +/* * - added support for reducing the footprint of libmng * */ +/* * by macros that optionally skip unused chunks, remove * */ +/* * 16-bit sample support, remove Delta support, and * */ +/* * remove JNG support, to accomodate Mozilla/Firebird. * */ +/* * 1.0.6 - 07/14/2003 - G. Randers-Pehrson * */ +/* * - further optional removal of unused functions * */ +/* * * */ +/* * 1.0.7 - 11/27/2003 - R.A * */ +/* * - added CANVAS_RGB565 and CANVAS_BGR565 * */ +/* * 1.0.7 - 12/06/2003 - R.A * */ +/* * - added CANVAS_RGBA565 and CANVAS_BGRA565 * */ +/* * 1.0.7 - 01/25/2004 - J.S * */ +/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */ +/* * 1.0.7 - 03/07/2004 - G. Randers-Pehrson * */ +/* * - put gamma, cms-related declarations inside #ifdef * */ +/* * 1.0.7 - 03/10/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * * */ +/* * 1.0.8 - 04/02/2004 - G.Juyn * */ +/* * - added CRC existence & checking flags * */ +/* * 1.0.8 - 04/12/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * 1.0.8 - 06/05/2004 - G.R-P * */ +/* * - define MNG_INCLUDE_ZLIB when MNG_USE_ZLIB_CRC is defined * */ +/* * * */ +/* * 1.0.9 - 10/03/2004 - G.Juyn * */ +/* * - added function to retrieve current FRAM delay * */ +/* * 1.0.9 - 10/14/2004 - G.Juyn * */ +/* * - added bgr565_a8 canvas-style (thanks to J. Elvander) * */ +/* * 1.0.9 - 10/17/2004 - G.Juyn * */ +/* * - fixed PPLT getchunk/putchunk routines * */ +/* * * */ +/* * 1.0.10 - 03/07/2006 - (thanks to W. Manthey) * */ +/* * - added CANVAS_RGB555 and CANVAS_BGR555 * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_h_ +#define _libmng_h_ + +/* ************************************************************************** */ + +#include "libmng_conf.h" /* user-specific configuration options */ + +/* ************************************************************************** */ + +#define MNG_CHECK_BAD_ICCP /* let's catch that sucker !!! */ + +#ifdef MNG_SUPPORT_READ /* dependencies based on user-configuration */ +#define MNG_INCLUDE_READ_PROCS +#endif + +#ifdef MNG_SUPPORT_WRITE +#define MNG_INCLUDE_WRITE_PROCS +#endif + +#ifdef MNG_USE_ZLIB_CRC +#define MNG_INCLUDE_ZLIB +#endif + +#ifdef MNG_SUPPORT_DISPLAY +#define MNG_INCLUDE_FILTERS +#define MNG_INCLUDE_INTERLACE +#define MNG_INCLUDE_OBJECTS +#define MNG_INCLUDE_DISPLAY_PROCS +#define MNG_INCLUDE_TIMING_PROCS +#define MNG_INCLUDE_ZLIB +#endif + +#ifdef MNG_STORE_CHUNKS +#define MNG_INCLUDE_ZLIB +#endif + +#ifdef MNG_SUPPORT_IJG6B +#define MNG_INCLUDE_JNG +#define MNG_INCLUDE_IJG6B +#define MNG_USE_SETJMP +#endif + +#ifdef MNG_INCLUDE_JNG +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_ACCESS_CHUNKS) +#define MNG_INCLUDE_JNG_READ +#endif +#if defined(MNG_SUPPORT_WRITE) || defined(MNG_ACCESS_CHUNKS) +#define MNG_INCLUDE_JNG_WRITE +#endif +#endif + +#ifdef MNG_FULL_CMS +#define MNG_INCLUDE_LCMS +#endif + +#ifdef MNG_AUTO_DITHER +#define MNG_INCLUDE_DITHERING +#endif + +#ifdef MNG_SUPPORT_TRACE +#define MNG_INCLUDE_TRACE_PROCS +#ifdef MNG_TRACE_TELLTALE +#define MNG_INCLUDE_TRACE_STRINGS +#endif +#endif + +#ifdef MNG_ERROR_TELLTALE +#define MNG_INCLUDE_ERROR_STRINGS +#endif + +#ifdef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_OPTIMIZE_CHUNKACCESS +#define MNG_OPTIMIZE_CHUNKACCESS +#endif +#else +#ifdef MNG_OPTIMIZE_CHUNKACCESS +#undef MNG_OPTIMIZE_CHUNKACCESS +#endif +#endif + +/* ************************************************************************** */ + +#include "libmng_types.h" /* platform-specific definitions + and other assorted stuff */ + +/* ************************************************************************** */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Versioning control * */ +/* * * */ +/* * version_so and version_dll will NOT reflect version_major; * */ +/* * these will only change for binary incompatible changes (which will * */ +/* * hopefully never occur) * */ +/* * note: they will be set to 1 on the first public release !!! * */ +/* * * */ +/* * first public release: * */ +/* * #define MNG_VERSION_TEXT "1.0.0" * */ +/* * #define MNG_VERSION_SO 1 eg. libmng.so.1 * */ +/* * #define MNG_VERSION_DLL 1 eg. libmng.dll * */ +/* * #define MNG_VERSION_MAJOR 1 * */ +/* * #define MNG_VERSION_MINOR 0 * */ +/* * #define MNG_VERSION_RELEASE 0 * */ +/* * * */ +/* * bug fix & cosmetics : * */ +/* * #define MNG_VERSION_TEXT "1.0.1" * */ +/* * #define MNG_VERSION_SO 1 eg. libmng.so.1 * */ +/* * #define MNG_VERSION_DLL 1 eg. libmng.dll * */ +/* * #define MNG_VERSION_MAJOR 1 * */ +/* * #define MNG_VERSION_MINOR 0 * */ +/* * #define MNG_VERSION_RELEASE 1 * */ +/* * * */ +/* * feature change : * */ +/* * #define MNG_VERSION_TEXT "1.2.0" * */ +/* * #define MNG_VERSION_SO 1 eg. libmng.so.1 * */ +/* * #define MNG_VERSION_DLL 1 eg. libmng.dll * */ +/* * #define MNG_VERSION_MAJOR 1 * */ +/* * #define MNG_VERSION_MINOR 2 * */ +/* * #define MNG_VERSION_RELEASE 0 * */ +/* * * */ +/* * major rewrite (still binary compatible) : * */ +/* * #define MNG_VERSION_TEXT "2.0.0" * */ +/* * #define MNG_VERSION_SO 1 eg. libmng.so.1 * */ +/* * #define MNG_VERSION_DLL 1 eg. libmng.dll * */ +/* * #define MNG_VERSION_MAJOR 2 * */ +/* * #define MNG_VERSION_MINOR 0 * */ +/* * #define MNG_VERSION_RELEASE 0 * */ +/* * * */ +/* * binary incompatible change: * */ +/* * #define MNG_VERSION_TEXT "13.0.0" * */ +/* * #define MNG_VERSION_SO 2 eg. libmng.so.2 * */ +/* * #define MNG_VERSION_DLL 2 eg. libmng2.dll * */ +/* * #define MNG_VERSION_MAJOR 13 * */ +/* * #define MNG_VERSION_MINOR 0 * */ +/* * #define MNG_VERSION_RELEASE 0 * */ +/* * * */ +/* * note that version_so & version_dll will always remain equal so it * */ +/* * doesn't matter which one is called to do version-checking; they are * */ +/* * just provided for their target platform * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_VERSION_TEXT "1.0.10" +#define MNG_VERSION_SO 1 /* eg. libmng.so.1 */ +#define MNG_VERSION_DLL 1 /* but: libmng.dll (!) */ +#define MNG_VERSION_MAJOR 1 +#define MNG_VERSION_MINOR 0 +#define MNG_VERSION_RELEASE 10 +#define MNG_VERSION_BETA MNG_FALSE + +MNG_EXT mng_pchar MNG_DECL mng_version_text (void); +MNG_EXT mng_uint8 MNG_DECL mng_version_so (void); +MNG_EXT mng_uint8 MNG_DECL mng_version_dll (void); +MNG_EXT mng_uint8 MNG_DECL mng_version_major (void); +MNG_EXT mng_uint8 MNG_DECL mng_version_minor (void); +MNG_EXT mng_uint8 MNG_DECL mng_version_release (void); +MNG_EXT mng_bool MNG_DECL mng_version_beta (void); + +/* use the following call to check wether the version of libmng your app + is using supports the given function; this is useful in apps that dynamically + load the library to make sure a certain function will work; the result will + be MNG_TRUE if the given function is implemented in this version of the library; + Major/Minor/Version indicate the version the function became available; + (if these fields are zero the function is not yet implemented!) */ +#ifdef MNG_SUPPORT_FUNCQUERY +MNG_EXT mng_bool MNG_DECL mng_supports_func (mng_pchar zFunction, + mng_uint8* iMajor, + mng_uint8* iMinor, + mng_uint8* iRelease); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * MNG/PNG specification level conformance * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_PNG_VERSION "1.2" +#define MNG_PNG_VERSION_MAJ 1 +#define MNG_PNG_VERSION_MIN 2 + +#define MNG_MNG_VERSION "1.1" +#define MNG_MNG_VERSION_MAJ 1 +#define MNG_MNG_VERSION_MIN 1 +#define MNG_MNG_DRAFT 99 /* deprecated; + only used for nEED "MNG DRAFT nn" */ + +/* ************************************************************************** */ +/* * * */ +/* * High-level application functions * */ +/* * * */ +/* ************************************************************************** */ + +/* library initialization function */ +/* must be the first called before anything can be done at all */ +/* initializes internal datastructure(s) */ +MNG_EXT mng_handle MNG_DECL mng_initialize (mng_ptr pUserdata, + mng_memalloc fMemalloc, + mng_memfree fMemfree, + mng_traceproc fTraceproc); + +/* library reset function */ +/* can be used to re-initialize the library, so another image can be + processed. there's absolutely no harm in calling it, even when it's not + really necessary */ +MNG_EXT mng_retcode MNG_DECL mng_reset (mng_handle hHandle); + +/* library cleanup function */ +/* must be the last called to clean up internal datastructure(s) */ +MNG_EXT mng_retcode MNG_DECL mng_cleanup (mng_handle* hHandle); + +/* high-level read functions */ +/* use mng_read if you simply want to read a Network Graphic */ +/* mng_read_resume is used in I/O-read-suspension scenarios, where the + "readdata" callback may return FALSE & length=0 indicating its buffer is + depleted or too short to supply the required bytes, and the buffer needs + to be refilled; libmng will return the errorcode MNG_NEEDMOREDATA telling + the app to refill its read-buffer after which it must call mng_read_resume + (or mng_display_resume if it also displaying the image simultaneously) */ +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_retcode MNG_DECL mng_read (mng_handle hHandle); +MNG_EXT mng_retcode MNG_DECL mng_read_resume (mng_handle hHandle); +#endif + +/* high-level "data push" functions */ +/* these functions can be used in situations where data is streaming into the + application and needs to be buffered by libmng before it is actually + requested by libmng itself. the pushing complements the normal reading + mechanism, but applications can decide to always return "0 bytes read" to + make libmng go into suspension mode with the returncode MNG_NEEDMOREDATA */ +/* mng_read_pushdata can be used to push blobs of data of arbitrary size; + mng_read_pushsig and mng_read_pushchunk can be used if the application + has already done some low-level decoding (eg. at the chunk level) */ +/* the data being pushed into libmng with mng_read_pushdata *must* contain + the regular 4-byte chunklength, but *must not* contain it with + mng_read_pushchunk!!! */ +/* mng_read_pushsig is used to prevent libmng from trying to parse the regular + PNG/JNG/MNG signature bytes; the application must have done this itself + and *must* indicate the proper type in the function call or things will + go amiss!! + also you *must* call this first, so pretty much right after mng_initialize + and certainly before any call to mng_read or mng_readdisplay !!!! */ +/* IMPORTANT!!! data can only be safely pushed when libmng is in a + "wait" state; eg. during MNG_NEEDTIMERWAIT, MNG_NEEDSECTIONWAIT or + MNG_NEEDMOREDATA !!! this just means you can't have one thread displaying + and another thread pushing data !!! */ +/* if bOwnership = MNG_TRUE, libmng will retain the supplied pointer and + *will* expect the buffer to remain available until libmng is finished + with it; what happens then depends on whether or not you have set the + releasedata() callback; if this is set than the supplied buffer will + be returned through this callback and your application can take care of + cleaning it up, otherwise libmng will use its internal freeing mechanism + (which, depending on compile-options, will be the standard C free() call, + or the memfree() callback */ +/* if bOwnership = MNG_FALSE, libmng will just copy the data into its own + buffers and dispose of it in the normal way */ +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_retcode MNG_DECL mng_read_pushdata (mng_handle hHandle, + mng_ptr pData, + mng_size_t iLength, + mng_bool bTakeownership); +MNG_EXT mng_retcode MNG_DECL mng_read_pushsig (mng_handle hHandle, + mng_imgtype eSigtype); +MNG_EXT mng_retcode MNG_DECL mng_read_pushchunk (mng_handle hHandle, + mng_ptr pChunk, + mng_size_t iLength, + mng_bool bTakeownership); +#endif + +/* high-level write & create functions */ +/* use this if you want to write a previously read Network Graphic or + if you want to create a new graphic and write it */ +/* to write a previously read graphic you must have defined MNG_STORE_CHUNKS */ +/* to create a new graphic you'll also need access to the chunks + (eg. #define MNG_ACCESS_CHUNKS !) */ +#ifdef MNG_SUPPORT_WRITE +MNG_EXT mng_retcode MNG_DECL mng_write (mng_handle hHandle); +MNG_EXT mng_retcode MNG_DECL mng_create (mng_handle hHandle); +#endif + +/* high-level display functions */ +/* use these to display a previously read or created graphic or + to read & display a graphic simultaneously */ +/* mng_display_resume should be called after a timer-interval + expires that was set through the settimer-callback, after a + read suspension-break, or, to resume an animation after a call + to mng_display_freeze/mng_display_reset */ +/* mng_display_freeze thru mng_display_gotime can be used to influence + the display of an image, BUT ONLY if it has been completely read! */ +#ifdef MNG_SUPPORT_DISPLAY +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_retcode MNG_DECL mng_readdisplay (mng_handle hHandle); +#endif +MNG_EXT mng_retcode MNG_DECL mng_display (mng_handle hHandle); +MNG_EXT mng_retcode MNG_DECL mng_display_resume (mng_handle hHandle); +MNG_EXT mng_retcode MNG_DECL mng_display_freeze (mng_handle hHandle); +MNG_EXT mng_retcode MNG_DECL mng_display_reset (mng_handle hHandle); +#ifndef MNG_NO_DISPLAY_GO_SUPPORTED +MNG_EXT mng_retcode MNG_DECL mng_display_goframe (mng_handle hHandle, + mng_uint32 iFramenr); +MNG_EXT mng_retcode MNG_DECL mng_display_golayer (mng_handle hHandle, + mng_uint32 iLayernr); +MNG_EXT mng_retcode MNG_DECL mng_display_gotime (mng_handle hHandle, + mng_uint32 iPlaytime); +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* event processing function */ +/* this needs to be called by the app when dynamic MNG is enabled and + a specific event occurs in the user-interface */ +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG) +MNG_EXT mng_retcode MNG_DECL mng_trapevent (mng_handle hHandle, + mng_uint8 iEventtype, + mng_int32 iX, + mng_int32 iY); +#endif + +/* error reporting function */ +/* use this if you need more detailed info on the last error */ +/* iExtra1 & iExtra2 may contain errorcodes from zlib, jpeg, etc... */ +/* zErrortext will only be filled if you #define MNG_ERROR_TELLTALE */ +MNG_EXT mng_retcode MNG_DECL mng_getlasterror (mng_handle hHandle, + mng_int8* iSeverity, + mng_chunkid* iChunkname, + mng_uint32* iChunkseq, + mng_int32* iExtra1, + mng_int32* iExtra2, + mng_pchar* zErrortext); + +/* ************************************************************************** */ +/* * * */ +/* * Callback set functions * */ +/* * * */ +/* ************************************************************************** */ + +/* memory callbacks */ +/* called to allocate and release internal datastructures */ +#ifndef MNG_INTERNAL_MEMMNGMT +MNG_EXT mng_retcode MNG_DECL mng_setcb_memalloc (mng_handle hHandle, + mng_memalloc fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_memfree (mng_handle hHandle, + mng_memfree fProc); +#endif /* MNG_INTERNAL_MEMMNGMT */ + +/* open- & close-stream callbacks */ +/* called to open & close streams for input or output */ +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) +#ifndef MNG_NO_OPEN_CLOSE_STREAM +MNG_EXT mng_retcode MNG_DECL mng_setcb_openstream (mng_handle hHandle, + mng_openstream fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_closestream (mng_handle hHandle, + mng_closestream fProc); +#endif +#endif + +/* read callback */ +/* called to get data from the inputstream */ +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_retcode MNG_DECL mng_setcb_readdata (mng_handle hHandle, + mng_readdata fProc); +#endif + +/* write callback */ +/* called to put data into the outputstream */ +#ifdef MNG_SUPPORT_WRITE +MNG_EXT mng_retcode MNG_DECL mng_setcb_writedata (mng_handle hHandle, + mng_writedata fProc); +#endif + +/* error callback */ +/* called when an error occurs */ +/* the application can determine if the error is recoverable, + and may inform the library by setting specific returncodes */ +MNG_EXT mng_retcode MNG_DECL mng_setcb_errorproc (mng_handle hHandle, + mng_errorproc fProc); + +/* trace callback */ +/* called to show the currently executing function */ +#ifdef MNG_SUPPORT_TRACE +MNG_EXT mng_retcode MNG_DECL mng_setcb_traceproc (mng_handle hHandle, + mng_traceproc fProc); +#endif + +/* callbacks for read processing */ +/* processheader is called when all header information has been gathered + from the inputstream */ +/* processtext is called for every tEXt, zTXt and iTXt chunk in the + inputstream (iType=0 for tEXt, 1 for zTXt and 2 for iTXt); + you can call get_imagelevel to check at what nesting-level the chunk is + encountered (eg. tEXt inside an embedded image inside a MNG -> level == 2; + in most other case -> level == 1) */ +/* processsave & processseek are called for SAVE/SEEK chunks */ +/* processneed is called for the nEED chunk; you should specify a callback + for this as the default behavior will be to abort processing, unless + the requirement is one of: + - a supported chunk + - the text "draft nn" where nn is a numeric value + - the text "MNG-1.0" or "MNG-1.1" + - the text "CACHEOFF" */ +/* processmend is called at the very end of the animation-stream; + note that this may not be the end of the animation though! */ +/* processterm is called when a TERM chunk is encountered; there can be only + 1 in the stream (or none) */ +/* processunknown is called after reading each non-critical unknown chunk */ +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_retcode MNG_DECL mng_setcb_processheader (mng_handle hHandle, + mng_processheader fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processtext (mng_handle hHandle, + mng_processtext fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processsave (mng_handle hHandle, + mng_processsave fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processseek (mng_handle hHandle, + mng_processseek fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processneed (mng_handle hHandle, + mng_processneed fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processmend (mng_handle hHandle, + mng_processmend fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processterm (mng_handle hHandle, + mng_processterm fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processunknown(mng_handle hHandle, + mng_processunknown fProc); +#endif + +/* callbacks for display processing */ +/* getcanvasline is called to get an access-pointer to a line on the + drawing-canvas */ +/* getbkgdline is called to get an access-pointer to a line from the + background-canvas */ +/* refresh is called to inform the GUI to redraw the current canvas onto + its output device (eg. in Win32 this would mean sending an + invalidate message for the specified region */ +/* NOTE that the update-region is specified as x,y,width,height; eg. the + invalidate message for Windows requires left,top,right,bottom parameters + where the bottom-right is exclusive of the region!! + to get these correctly is as simple as: + left = x; + top = y; + right = x + width; + bottom = y + height; + if your implementation requires inclusive points, simply subtract 1 from + both the right & bottom values calculated above. + */ +#ifdef MNG_SUPPORT_DISPLAY +MNG_EXT mng_retcode MNG_DECL mng_setcb_getcanvasline (mng_handle hHandle, + mng_getcanvasline fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_getbkgdline (mng_handle hHandle, + mng_getbkgdline fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_getalphaline (mng_handle hHandle, + mng_getalphaline fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_refresh (mng_handle hHandle, + mng_refresh fProc); + +/* timing callbacks */ +/* gettickcount is called to get the system tickcount (milliseconds); + this is used to determine the remaining interval between frames */ +/* settimer is called to inform the application that it should set a timer; + when the timer is triggered the app must call mng_display_resume */ +MNG_EXT mng_retcode MNG_DECL mng_setcb_gettickcount (mng_handle hHandle, + mng_gettickcount fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_settimer (mng_handle hHandle, + mng_settimer fProc); + +/* color management callbacks */ +/* called to transmit color management information to the application */ +/* these are only used when you #define MNG_APP_CMS */ +#ifdef MNG_APP_CMS +MNG_EXT mng_retcode MNG_DECL mng_setcb_processgamma (mng_handle hHandle, + mng_processgamma fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processchroma (mng_handle hHandle, + mng_processchroma fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processsrgb (mng_handle hHandle, + mng_processsrgb fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processiccp (mng_handle hHandle, + mng_processiccp fProc); +MNG_EXT mng_retcode MNG_DECL mng_setcb_processarow (mng_handle hHandle, + mng_processarow fProc); +#endif /* MNG_APP_CMS */ +#endif /* MNG_SUPPORT_DISPLAY */ + +/* release push data callback */ +/* used when the app pushes data into libmng (as opposed to libmng pulling it) + and relinquishes ownership of the pushed data-buffer, but *does* want to + release (free) the buffer itself once libmng has finished processing it */ +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_retcode MNG_DECL mng_setcb_releasedata (mng_handle hHandle, + mng_releasedata fProc); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Callback get functions * */ +/* * * */ +/* ************************************************************************** */ + +/* see _setcb_ */ +#ifndef MNG_INTERNAL_MEMMNGMT +MNG_EXT mng_memalloc MNG_DECL mng_getcb_memalloc (mng_handle hHandle); +MNG_EXT mng_memfree MNG_DECL mng_getcb_memfree (mng_handle hHandle); +#endif + +/* see _setcb_ */ +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_releasedata MNG_DECL mng_getcb_releasedata (mng_handle hHandle); +#endif + +/* see _setcb_ */ +#if defined(MNG_SUPPORT_READ) || defined(MNG_WRITE_SUPPORT) +#ifndef MNG_NO_OPEN_CLOSE_STREAM +MNG_EXT mng_openstream MNG_DECL mng_getcb_openstream (mng_handle hHandle); +MNG_EXT mng_closestream MNG_DECL mng_getcb_closestream (mng_handle hHandle); +#endif +#endif + +/* see _setcb_ */ +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_readdata MNG_DECL mng_getcb_readdata (mng_handle hHandle); +#endif + +/* see _setcb_ */ +#ifdef MNG_SUPPORT_WRITE +MNG_EXT mng_writedata MNG_DECL mng_getcb_writedata (mng_handle hHandle); +#endif + +/* see _setcb_ */ +MNG_EXT mng_errorproc MNG_DECL mng_getcb_errorproc (mng_handle hHandle); + +/* see _setcb_ */ +#ifdef MNG_SUPPORT_TRACE +MNG_EXT mng_traceproc MNG_DECL mng_getcb_traceproc (mng_handle hHandle); +#endif + +/* see _setcb_ */ +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_processheader MNG_DECL mng_getcb_processheader (mng_handle hHandle); +MNG_EXT mng_processtext MNG_DECL mng_getcb_processtext (mng_handle hHandle); +MNG_EXT mng_processsave MNG_DECL mng_getcb_processsave (mng_handle hHandle); +MNG_EXT mng_processseek MNG_DECL mng_getcb_processseek (mng_handle hHandle); +MNG_EXT mng_processneed MNG_DECL mng_getcb_processneed (mng_handle hHandle); +MNG_EXT mng_processunknown MNG_DECL mng_getcb_processunknown (mng_handle hHandle); +MNG_EXT mng_processterm MNG_DECL mng_getcb_processterm (mng_handle hHandle); +#endif + +/* see _setcb_ */ +#ifdef MNG_SUPPORT_DISPLAY +MNG_EXT mng_getcanvasline MNG_DECL mng_getcb_getcanvasline (mng_handle hHandle); +MNG_EXT mng_getbkgdline MNG_DECL mng_getcb_getbkgdline (mng_handle hHandle); +MNG_EXT mng_getalphaline MNG_DECL mng_getcb_getalphaline (mng_handle hHandle); +MNG_EXT mng_refresh MNG_DECL mng_getcb_refresh (mng_handle hHandle); + +/* see _setcb_ */ +MNG_EXT mng_gettickcount MNG_DECL mng_getcb_gettickcount (mng_handle hHandle); +MNG_EXT mng_settimer MNG_DECL mng_getcb_settimer (mng_handle hHandle); + +/* see _setcb_ */ +#ifdef MNG_APP_CMS +MNG_EXT mng_processgamma MNG_DECL mng_getcb_processgamma (mng_handle hHandle); +MNG_EXT mng_processchroma MNG_DECL mng_getcb_processchroma (mng_handle hHandle); +MNG_EXT mng_processsrgb MNG_DECL mng_getcb_processsrgb (mng_handle hHandle); +MNG_EXT mng_processiccp MNG_DECL mng_getcb_processiccp (mng_handle hHandle); +MNG_EXT mng_processarow MNG_DECL mng_getcb_processarow (mng_handle hHandle); +#endif /* MNG_APP_CMS */ +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ +/* * * */ +/* * Property set functions * */ +/* * * */ +/* ************************************************************************** */ + +/* Application data pointer */ +/* provided for application use; not used by the library */ +MNG_EXT mng_retcode MNG_DECL mng_set_userdata (mng_handle hHandle, + mng_ptr pUserdata); + +/* The style of the drawing- & background-canvas */ +/* only used for displaying images */ +/* both are initially set to 24-bit RGB (eg. 8-bit per channel) */ +MNG_EXT mng_retcode MNG_DECL mng_set_canvasstyle (mng_handle hHandle, + mng_uint32 iStyle); +MNG_EXT mng_retcode MNG_DECL mng_set_bkgdstyle (mng_handle hHandle, + mng_uint32 iStyle); + +/* The default background color */ +/* only used if the getbkgdline callback is not defined */ +/* for initially painting the canvas and restoring (part of) the background */ +MNG_EXT mng_retcode MNG_DECL mng_set_bgcolor (mng_handle hHandle, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue); + +/* Indicates preferred use of the bKGD chunk for PNG images */ +MNG_EXT mng_retcode MNG_DECL mng_set_usebkgd (mng_handle hHandle, + mng_bool bUseBKGD); + +/* Indicates storage of read chunks */ +/* only useful if you #define mng_store_chunks */ +/* can be used to dynamically change storage management */ +MNG_EXT mng_retcode MNG_DECL mng_set_storechunks (mng_handle hHandle, + mng_bool bStorechunks); + +/* Indicates breaks requested when processing SAVE/SEEK */ +/* set this to let the app handle section breaks; the library will return + MNG_NEEDSECTIONWAIT return-codes for each SEEK chunk */ +MNG_EXT mng_retcode MNG_DECL mng_set_sectionbreaks (mng_handle hHandle, + mng_bool bSectionbreaks); + +/* Indicates storage of playback info (ON by default!) */ +/* can be used to turn off caching of playback info; this is useful to + specifically optimize MNG-video playback; note that if caching is turned off + LOOP chunks will be flagged as errors! TERM chunks will be ignored and only + passed to the processterm() callback if it is defined by the app; also, this + feature can only be used with mng_readdisplay(); mng_read(), + mng_display_reset() and mng_display_goxxxx() will return an error; + once this option is turned off it can't be turned on for the same stream!!! */ +MNG_EXT mng_retcode MNG_DECL mng_set_cacheplayback (mng_handle hHandle, + mng_bool bCacheplayback); + +/* Indicates automatic progressive refreshes for large images (ON by default!) */ +/* turn this off if you do not want intermittent painting while a large image + is being read. useful if the input-stream comes from a fast medium, such + as a local harddisk */ +MNG_EXT mng_retcode MNG_DECL mng_set_doprogressive (mng_handle hHandle, + mng_bool bDoProgressive); + +/* Indicates existence and required checking of the CRC in input streams, + and generation in output streams */ +/* !!!! Use this ONLY if you know what you are doing !!!! */ +/* The value is a combination of the following flags: + 0x0000001 = CRC is present in the input stream + 0x0000002 = CRC must be generated in the output stream + 0x0000010 = CRC should be checked for ancillary chunks + 0x0000020 = a faulty CRC for ancillary chunks generates a warning only + 0x0000040 = a faulty CRC for ancillary chunks generates an error + 0x0000100 = CRC should be checked for critical chunks + 0x0000200 = a faulty CRC for critical chunks generates a warning only + 0x0000400 = a faulty CRC for critical chunks generates an error + + The default is 0x00000533 = CRC present in input streams; should be checked; + warning for ancillary chunks; error for critical + chunks; generate CRC for output streams + + Note that some combinations are meaningless; eg. if the CRC is not present + it won't do any good to turn the checking flags on; if a checking flag + is off, it doesn't do any good to ask for generation of warnings or errors. + Also libmng will generate either an error or a warning, not both, + so if you specify both the default will be to generate an error! + The only useful combinations for input are 331, 551, 351, 531, 0, 301, 501 + and optionally 031 and 051, but only checking ancillary chunks and not + critical chunks is generally not a very good idea!!! + If you've also writing these values should be combined with 0x02 if + CRC's are required in the output stream + */ +MNG_EXT mng_retcode MNG_DECL mng_set_crcmode (mng_handle hHandle, + mng_uint32 iCrcmode); + +/* Color-management necessaries */ +/* + ************************************************************************* + !!!!!!!! THIS NEXT BIT IS IMPORTANT !!!!!!!!! + ************************************************************************* + + If you have defined MNG_FULL_CMS (and are using lcms), you will have to + think hard about the following routines. + + lcms requires 2 profiles to work off the differences in the input-image + and the output-device. The ICC profile for the input-image will be + embedded within it to reflect its color-characteristics, but the output + profile depends on the output-device, which is something only *YOU* know + about. sRGB (standard RGB) is common for x86 compatible environments + (eg. Windows, Linux and some others) + + If you are compiling for a sRGB compliant system you probably won't have + to do anything special. (unless you want to of course) + + If you are compiling for a non-sRGB compliant system + (eg. SGI, Mac, Next, others...) + you *MUST* define a proper ICC profile for the generic output-device + associated with that platform. + + In either event, you may also want to offer an option to your users to + set the profile manually, or, if you know how, set it from a + system-defined default. + + TO RECAP: for sRGB systems (Windows, Linux) no action required! + for non-sRGB systems (SGI, Mac, Next) ACTION REQUIRED! + + Please visit http://www.srgb.com, http://www.color.org and + http://www.littlecms.com for more info. + + ************************************************************************* + !!!!!!!! THE BIT ABOVE IS IMPORTANT !!!!!!!!! + ************************************************************************* +*/ +/* mng_set_srgb tells libmng if it's running on a sRGB compliant system or not + the default is already set to MNG_TRUE */ +/* mng_set_outputprofile, mng_set_outputprofile2, mng_set_outputsrgb + are used to set the default profile describing the output-device + by default it is already initialized with an sRGB profile */ +/* mng_set_srgbprofile, mng_set_srgbprofile2, mng_set_srgbimplicit + are used to set the default profile describing a standard sRGB device + this is used when the input-image is tagged only as being sRGB, but the + output-device is defined as not being sRGB compliant + by default it is already initialized with a standard sRGB profile */ +#if defined(MNG_SUPPORT_DISPLAY) +MNG_EXT mng_retcode MNG_DECL mng_set_srgb (mng_handle hHandle, + mng_bool bIssRGB); +MNG_EXT mng_retcode MNG_DECL mng_set_outputprofile (mng_handle hHandle, + mng_pchar zFilename); +MNG_EXT mng_retcode MNG_DECL mng_set_outputprofile2 (mng_handle hHandle, + mng_uint32 iProfilesize, + mng_ptr pProfile); +MNG_EXT mng_retcode MNG_DECL mng_set_outputsrgb (mng_handle hHandle); +MNG_EXT mng_retcode MNG_DECL mng_set_srgbprofile (mng_handle hHandle, + mng_pchar zFilename); +MNG_EXT mng_retcode MNG_DECL mng_set_srgbprofile2 (mng_handle hHandle, + mng_uint32 iProfilesize, + mng_ptr pProfile); +MNG_EXT mng_retcode MNG_DECL mng_set_srgbimplicit (mng_handle hHandle); +#endif + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +/* Gamma settings */ +/* ... blabla (explain gamma processing a little; eg. formula & stuff) ... */ +MNG_EXT mng_retcode MNG_DECL mng_set_viewgamma (mng_handle hHandle, + mng_float dGamma); +MNG_EXT mng_retcode MNG_DECL mng_set_displaygamma (mng_handle hHandle, + mng_float dGamma); +MNG_EXT mng_retcode MNG_DECL mng_set_dfltimggamma (mng_handle hHandle, + mng_float dGamma); +MNG_EXT mng_retcode MNG_DECL mng_set_viewgammaint (mng_handle hHandle, + mng_uint32 iGamma); +MNG_EXT mng_retcode MNG_DECL mng_set_displaygammaint (mng_handle hHandle, + mng_uint32 iGamma); +MNG_EXT mng_retcode MNG_DECL mng_set_dfltimggammaint (mng_handle hHandle, + mng_uint32 iGamma); +#endif + +#ifndef MNG_SKIP_MAXCANVAS +/* Ultimate clipping size */ +/* used to limit extreme graphics from overloading the system */ +/* if a graphic exceeds these limits a warning is issued, which can + be ignored by the app (using the errorproc callback). in that case + the library will use these settings to clip the input graphic, and + the app's canvas must account for this */ +MNG_EXT mng_retcode MNG_DECL mng_set_maxcanvaswidth (mng_handle hHandle, + mng_uint32 iMaxwidth); +MNG_EXT mng_retcode MNG_DECL mng_set_maxcanvasheight (mng_handle hHandle, + mng_uint32 iMaxheight); +MNG_EXT mng_retcode MNG_DECL mng_set_maxcanvassize (mng_handle hHandle, + mng_uint32 iMaxwidth, + mng_uint32 iMaxheight); +#endif + +/* ZLIB default compression parameters */ +/* these are used when writing out chunks */ +/* they are also used when compressing PNG image-data or JNG alpha-data; + in this case you can set them just before calling mng_putimgdata_ihdr */ +/* set to your liking; usually the defaults will suffice though! */ +/* check the documentation for ZLIB for details on these parameters */ +#ifdef MNG_INCLUDE_ZLIB +MNG_EXT mng_retcode MNG_DECL mng_set_zlib_level (mng_handle hHandle, + mng_int32 iZlevel); +MNG_EXT mng_retcode MNG_DECL mng_set_zlib_method (mng_handle hHandle, + mng_int32 iZmethod); +MNG_EXT mng_retcode MNG_DECL mng_set_zlib_windowbits (mng_handle hHandle, + mng_int32 iZwindowbits); +MNG_EXT mng_retcode MNG_DECL mng_set_zlib_memlevel (mng_handle hHandle, + mng_int32 iZmemlevel); +MNG_EXT mng_retcode MNG_DECL mng_set_zlib_strategy (mng_handle hHandle, + mng_int32 iZstrategy); + +MNG_EXT mng_retcode MNG_DECL mng_set_zlib_maxidat (mng_handle hHandle, + mng_uint32 iMaxIDAT); +#endif /* MNG_INCLUDE_ZLIB */ + +/* JNG default compression parameters (based on IJG code) */ +/* these are used when compressing JNG image-data; so you can set them + just before calling mng_putimgdata_jhdr */ +/* set to your liking; usually the defaults will suffice though! */ +/* check the documentation for IJGSRC6B for details on these parameters */ +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_INCLUDE_IJG6B +MNG_EXT mng_retcode MNG_DECL mng_set_jpeg_dctmethod (mng_handle hHandle, + mngjpeg_dctmethod eJPEGdctmethod); +#endif +MNG_EXT mng_retcode MNG_DECL mng_set_jpeg_quality (mng_handle hHandle, + mng_int32 iJPEGquality); +MNG_EXT mng_retcode MNG_DECL mng_set_jpeg_smoothing (mng_handle hHandle, + mng_int32 iJPEGsmoothing); +MNG_EXT mng_retcode MNG_DECL mng_set_jpeg_progressive(mng_handle hHandle, + mng_bool bJPEGprogressive); +MNG_EXT mng_retcode MNG_DECL mng_set_jpeg_optimized (mng_handle hHandle, + mng_bool bJPEGoptimized); + +MNG_EXT mng_retcode MNG_DECL mng_set_jpeg_maxjdat (mng_handle hHandle, + mng_uint32 iMaxJDAT); +#endif /* MNG_INCLUDE_JNG */ + +/* Suspension-mode setting */ +/* use this to activate the internal suspension-buffer to improve + read-suspension processing */ +/* TODO: write-suspension ??? */ +#if defined(MNG_SUPPORT_READ) +MNG_EXT mng_retcode MNG_DECL mng_set_suspensionmode (mng_handle hHandle, + mng_bool bSuspensionmode); +#endif + +/* Speed setting */ +/* use this to influence the display-speed of animations */ +#if defined(MNG_SUPPORT_DISPLAY) +MNG_EXT mng_retcode MNG_DECL mng_set_speed (mng_handle hHandle, + mng_speedtype iSpeed); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Property get functions * */ +/* * * */ +/* ************************************************************************** */ + +/* see _set_ */ +MNG_EXT mng_ptr MNG_DECL mng_get_userdata (mng_handle hHandle); + +/* Network Graphic header details */ +/* these get filled once the graphics header is processed, + so they are available in the processheader callback; before that + they are zeroed out and imagetype is set to it_unknown */ +/* this might be a good point for the app to initialize the drawing-canvas! */ +/* note that some fields are only set for the first(!) header-chunk: + MNG/MHDR (imagetype = mng_it_mng) - ticks thru simplicity + PNG/IHDR (imagetype = mng_it_png) - bitdepth thru interlace + JNG/JHDR (imagetype = mng_it_jng) - bitdepth thru compression & + interlace thru alphainterlace */ +MNG_EXT mng_imgtype MNG_DECL mng_get_sigtype (mng_handle hHandle); +MNG_EXT mng_imgtype MNG_DECL mng_get_imagetype (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_imagewidth (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_imageheight (mng_handle hHandle); + +MNG_EXT mng_uint32 MNG_DECL mng_get_ticks (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_framecount (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_layercount (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_playtime (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_simplicity (mng_handle hHandle); + +MNG_EXT mng_uint8 MNG_DECL mng_get_bitdepth (mng_handle hHandle); +MNG_EXT mng_uint8 MNG_DECL mng_get_colortype (mng_handle hHandle); +MNG_EXT mng_uint8 MNG_DECL mng_get_compression (mng_handle hHandle); +MNG_EXT mng_uint8 MNG_DECL mng_get_filter (mng_handle hHandle); +MNG_EXT mng_uint8 MNG_DECL mng_get_interlace (mng_handle hHandle); +MNG_EXT mng_uint8 MNG_DECL mng_get_alphabitdepth (mng_handle hHandle); +MNG_EXT mng_uint8 MNG_DECL mng_get_alphacompression(mng_handle hHandle); +MNG_EXT mng_uint8 MNG_DECL mng_get_alphafilter (mng_handle hHandle); +MNG_EXT mng_uint8 MNG_DECL mng_get_alphainterlace (mng_handle hHandle); + +/* indicates the predicted alpha-depth required to properly display the image */ +/* gets set once the graphics header is processed and is available in the + processheader callback for any type of input-image (PNG, JNG or MNG) */ +/* possible values are 0,1,2,4,8,16 + 0 = no transparency required + 1 = on/off transparency required (alpha-values are 0 or 2^bit_depth-1) + 2+ = semi-transparency required (values will be scaled to the bitdepth of the + canvasstyle supplied by the application) */ +MNG_EXT mng_uint8 MNG_DECL mng_get_alphadepth (mng_handle hHandle); + +/* defines whether a refresh() callback is called for an interlace pass (PNG) + or progressive scan (JNG) */ +/* returns the interlace pass number for PNG or a fabricated pass number for JNG; + returns 0 in all other cases */ +/* only useful if the image_type = mng_it_png or mng_it_jng and if the image + is actually interlaced (PNG) or progressive (JNG) */ +#ifdef MNG_SUPPORT_DISPLAY +MNG_EXT mng_uint8 MNG_DECL mng_get_refreshpass (mng_handle hHandle); +#endif + +/* see _set_ */ +MNG_EXT mng_uint32 MNG_DECL mng_get_canvasstyle (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_bkgdstyle (mng_handle hHandle); + +/* see _set_ */ +MNG_EXT mng_retcode MNG_DECL mng_get_bgcolor (mng_handle hHandle, + mng_uint16* iRed, + mng_uint16* iGreen, + mng_uint16* iBlue); + +/* see _set_ */ +MNG_EXT mng_bool MNG_DECL mng_get_usebkgd (mng_handle hHandle); + +/* see _set_ */ +MNG_EXT mng_bool MNG_DECL mng_get_storechunks (mng_handle hHandle); + +/* see _set_ */ +MNG_EXT mng_bool MNG_DECL mng_get_sectionbreaks (mng_handle hHandle); + +/* see _set_ */ +MNG_EXT mng_bool MNG_DECL mng_get_cacheplayback (mng_handle hHandle); + +/* see _set_ */ +MNG_EXT mng_bool MNG_DECL mng_get_doprogressive (mng_handle hHandle); + +/* see _set_ */ +MNG_EXT mng_uint32 MNG_DECL mng_get_crcmode (mng_handle hHandle); + +/* see _set_ */ +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_FULL_CMS) +MNG_EXT mng_bool MNG_DECL mng_get_srgb (mng_handle hHandle); +#endif + +/* see _set_ */ +MNG_EXT mng_float MNG_DECL mng_get_viewgamma (mng_handle hHandle); +MNG_EXT mng_float MNG_DECL mng_get_displaygamma (mng_handle hHandle); +MNG_EXT mng_float MNG_DECL mng_get_dfltimggamma (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_viewgammaint (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_displaygammaint (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_dfltimggammaint (mng_handle hHandle); + +#ifndef MNG_SKIP_MAXCANVAS +/* see _set_ */ +MNG_EXT mng_uint32 MNG_DECL mng_get_maxcanvaswidth (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_maxcanvasheight (mng_handle hHandle); +#endif + +/* see _set_ */ +#ifdef MNG_INCLUDE_ZLIB +MNG_EXT mng_int32 MNG_DECL mng_get_zlib_level (mng_handle hHandle); +MNG_EXT mng_int32 MNG_DECL mng_get_zlib_method (mng_handle hHandle); +MNG_EXT mng_int32 MNG_DECL mng_get_zlib_windowbits (mng_handle hHandle); +MNG_EXT mng_int32 MNG_DECL mng_get_zlib_memlevel (mng_handle hHandle); +MNG_EXT mng_int32 MNG_DECL mng_get_zlib_strategy (mng_handle hHandle); + +MNG_EXT mng_uint32 MNG_DECL mng_get_zlib_maxidat (mng_handle hHandle); +#endif /* MNG_INCLUDE_ZLIB */ + +/* see _set_ */ +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_INCLUDE_IJG6B +MNG_EXT mngjpeg_dctmethod + MNG_DECL mng_get_jpeg_dctmethod (mng_handle hHandle); +#endif +MNG_EXT mng_int32 MNG_DECL mng_get_jpeg_quality (mng_handle hHandle); +MNG_EXT mng_int32 MNG_DECL mng_get_jpeg_smoothing (mng_handle hHandle); +MNG_EXT mng_bool MNG_DECL mng_get_jpeg_progressive(mng_handle hHandle); +MNG_EXT mng_bool MNG_DECL mng_get_jpeg_optimized (mng_handle hHandle); + +MNG_EXT mng_uint32 MNG_DECL mng_get_jpeg_maxjdat (mng_handle hHandle); +#endif /* MNG_INCLUDE_JNG */ + +/* see _set_ */ +#if defined(MNG_SUPPORT_READ) +MNG_EXT mng_bool MNG_DECL mng_get_suspensionmode (mng_handle hHandle); +#endif + +/* see _set_ */ +#if defined(MNG_SUPPORT_DISPLAY) +MNG_EXT mng_speedtype + MNG_DECL mng_get_speed (mng_handle hHandle); +#endif + +/* Image-level */ +/* this can be used inside the processtext callback to determine the level of + text of the image being processed; the value 1 is returned for top-level + texts, and the value 2 for a text inside an embedded image inside a MNG */ +MNG_EXT mng_uint32 MNG_DECL mng_get_imagelevel (mng_handle hHandle); + +/* BACK info */ +/* can be used to retrieve the color & mandatory values for the last processed + BACK chunk of a MNG (will fail for other image-types); + if no BACK chunk was processed yet, it will return all zeroes */ +#ifdef MNG_SUPPORT_DISPLAY +MNG_EXT mng_retcode MNG_DECL mng_get_lastbackchunk (mng_handle hHandle, + mng_uint16* iRed, + mng_uint16* iGreen, + mng_uint16* iBlue, + mng_uint8* iMandatory); +#endif + +/* SEEK info */ +/* can be used to retrieve the segmentname of the last processed SEEK chunk; + if no SEEK chunk was processed or its segmentname was empty, the function + will return an empty string; the provided buffer must be at least 80 bytes!! */ +#ifdef MNG_SUPPORT_DISPLAY +MNG_EXT mng_retcode MNG_DECL mng_get_lastseekname (mng_handle hHandle, + mng_pchar zSegmentname); +#endif + +/* FRAM info */ +/* can be used to retrieve the current FRAM delay; this may be useful when + retrieving a stream of frames with their corresponding delays by "fake" + reading and displaying the file */ +#ifdef MNG_SUPPORT_DISPLAY +MNG_EXT mng_uint32 MNG_DECL mng_get_currframdelay (mng_handle hHandle); +#endif + +/* Display status variables */ +/* these get filled & updated during display processing */ +/* starttime is the tickcount at the start of displaying the animation */ +/* runtime is the actual number of millisecs since the start of the animation */ +/* currentframe, currentlayer & currentplaytime indicate the current + frame/layer/playtime(msecs) in the animation (these keep increasing; + even after the animation loops back to the TERM chunk) */ +/* totalframes, totallayers & totalplaytime are filled after a complete run + of an animation (eg. at MEND); they are also valid after just reading the MNG */ +#ifdef MNG_SUPPORT_DISPLAY +MNG_EXT mng_uint32 MNG_DECL mng_get_starttime (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_runtime (mng_handle hHandle); +#ifndef MNG_NO_CURRENT_INFO +MNG_EXT mng_uint32 MNG_DECL mng_get_currentframe (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_currentlayer (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_currentplaytime (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_totalframes (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_totallayers (mng_handle hHandle); +MNG_EXT mng_uint32 MNG_DECL mng_get_totalplaytime (mng_handle hHandle); +#endif +#endif + +/* Status variables */ +/* these indicate the internal state of the library */ +/* most indicate exactly what you would expect - + status_error: true if the last function call returned an errorcode + status_reading: true if the library is (still) reading an image + status_suspendbreak: true if the library has suspended for "I/O" + status_creating: true if the library is in the middle of creating an image + status_writing: true if the library is in the middle of writing an image + status_displaying: true if the library is displaying an image + status_running: true if display processing is active (eg. not frozen or reset) + status_timerbreak: true if the library has suspended for a "timer-break" + status_dynamic: true if the library encountered an evNT chunk in the MNG + status_runningevent: true if the library is processing an external event */ +/* eg. mng_readdisplay() will turn the reading, displaying and running status on; + when EOF is reached the reading status will be turned off */ +MNG_EXT mng_bool MNG_DECL mng_status_error (mng_handle hHandle); +#ifdef MNG_SUPPORT_READ +MNG_EXT mng_bool MNG_DECL mng_status_reading (mng_handle hHandle); +MNG_EXT mng_bool MNG_DECL mng_status_suspendbreak (mng_handle hHandle); +#endif +#ifdef MNG_SUPPORT_WRITE +MNG_EXT mng_bool MNG_DECL mng_status_creating (mng_handle hHandle); +MNG_EXT mng_bool MNG_DECL mng_status_writing (mng_handle hHandle); +#endif +#ifdef MNG_SUPPORT_DISPLAY +MNG_EXT mng_bool MNG_DECL mng_status_displaying (mng_handle hHandle); +MNG_EXT mng_bool MNG_DECL mng_status_running (mng_handle hHandle); +MNG_EXT mng_bool MNG_DECL mng_status_timerbreak (mng_handle hHandle); +#endif +#ifdef MNG_SUPPORT_DYNAMICMNG +MNG_EXT mng_bool MNG_DECL mng_status_dynamic (mng_handle hHandle); +MNG_EXT mng_bool MNG_DECL mng_status_runningevent (mng_handle hHandle); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Chunk access functions * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_ACCESS_CHUNKS + +/* ************************************************************************** */ + +/* use this to iterate the stored chunks */ +/* requires MNG_ACCESS_CHUNKS & MNG_STORE_CHUNKS */ +/* starts from the supplied chunk-index-nr; the first chunk has index 0!! */ +MNG_EXT mng_retcode MNG_DECL mng_iterate_chunks (mng_handle hHandle, + mng_uint32 iChunkseq, + mng_iteratechunk fProc); + +/* use the next function inside your 'iteratechunk' callback to copy + the given chunk to a new mng you are creating */ +/* the 'out' handle should be in 'create' status! */ +#ifdef MNG_SUPPORT_WRITE +MNG_EXT mng_retcode MNG_DECL mng_copy_chunk (mng_handle hHandle, + mng_handle hChunk, + mng_handle hHandleOut); +#endif + +/* ************************************************************************** */ + +/* use these to get chunk data from within the callback in iterate_chunks */ +MNG_EXT mng_retcode MNG_DECL mng_getchunk_ihdr (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_uint8 *iBitdepth, + mng_uint8 *iColortype, + mng_uint8 *iCompression, + mng_uint8 *iFilter, + mng_uint8 *iInterlace); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_plte (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount, + mng_palette8 *aPalette); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_idat (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iRawlen, + mng_ptr *pRawdata); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_trns (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_bool *bGlobal, + mng_uint8 *iType, + mng_uint32 *iCount, + mng_uint8arr *aAlphas, + mng_uint16 *iGray, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue, + mng_uint32 *iRawlen, + mng_uint8arr *aRawdata); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_gama (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iGamma); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_chrm (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iWhitepointx, + mng_uint32 *iWhitepointy, + mng_uint32 *iRedx, + mng_uint32 *iRedy, + mng_uint32 *iGreenx, + mng_uint32 *iGreeny, + mng_uint32 *iBluex, + mng_uint32 *iBluey); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_srgb (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iRenderingintent); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_iccp (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iNamesize, + mng_pchar *zName, + mng_uint8 *iCompression, + mng_uint32 *iProfilesize, + mng_ptr *pProfile); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_text (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iKeywordsize, + mng_pchar *zKeyword, + mng_uint32 *iTextsize, + mng_pchar *zText); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_ztxt (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iKeywordsize, + mng_pchar *zKeyword, + mng_uint8 *iCompression, + mng_uint32 *iTextsize, + mng_pchar *zText); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_itxt (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iKeywordsize, + mng_pchar *zKeyword, + mng_uint8 *iCompressionflag, + mng_uint8 *iCompressionmethod, + mng_uint32 *iLanguagesize, + mng_pchar *zLanguage, + mng_uint32 *iTranslationsize, + mng_pchar *zTranslation, + mng_uint32 *iTextsize, + mng_pchar *zText); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_bkgd (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iType, + mng_uint8 *iIndex, + mng_uint16 *iGray, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_phys (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iSizex, + mng_uint32 *iSizey, + mng_uint8 *iUnit); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_sbit (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iType, + mng_uint8arr4 *aBits); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_splt (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iNamesize, + mng_pchar *zName, + mng_uint8 *iSampledepth, + mng_uint32 *iEntrycount, + mng_ptr *pEntries); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_hist (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iEntrycount, + mng_uint16arr *aEntries); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_time (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iYear, + mng_uint8 *iMonth, + mng_uint8 *iDay, + mng_uint8 *iHour, + mng_uint8 *iMinute, + mng_uint8 *iSecond); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_mhdr (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_uint32 *iTicks, + mng_uint32 *iLayercount, + mng_uint32 *iFramecount, + mng_uint32 *iPlaytime, + mng_uint32 *iSimplicity); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_loop (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iLevel, + mng_uint32 *iRepeat, + mng_uint8 *iTermination, + mng_uint32 *iItermin, + mng_uint32 *iItermax, + mng_uint32 *iCount, + mng_uint32p *pSignals); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_endl (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iLevel); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_defi (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iObjectid, + mng_uint8 *iDonotshow, + mng_uint8 *iConcrete, + mng_bool *bHasloca, + mng_int32 *iXlocation, + mng_int32 *iYlocation, + mng_bool *bHasclip, + mng_int32 *iLeftcb, + mng_int32 *iRightcb, + mng_int32 *iTopcb, + mng_int32 *iBottomcb); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_basi (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_uint8 *iBitdepth, + mng_uint8 *iColortype, + mng_uint8 *iCompression, + mng_uint8 *iFilter, + mng_uint8 *iInterlace, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue, + mng_uint16 *iAlpha, + mng_uint8 *iViewable); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_clon (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iSourceid, + mng_uint16 *iCloneid, + mng_uint8 *iClonetype, + mng_uint8 *iDonotshow, + mng_uint8 *iConcrete, + mng_bool *bHasloca, + mng_uint8 *iLocationtype, + mng_int32 *iLocationx, + mng_int32 *iLocationy); + +#ifndef MNG_SKIPCHUNK_PAST +MNG_EXT mng_retcode MNG_DECL mng_getchunk_past (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iDestid, + mng_uint8 *iTargettype, + mng_int32 *iTargetx, + mng_int32 *iTargety, + mng_uint32 *iCount); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_past_src (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint16 *iSourceid, + mng_uint8 *iComposition, + mng_uint8 *iOrientation, + mng_uint8 *iOffsettype, + mng_int32 *iOffsetx, + mng_int32 *iOffsety, + mng_uint8 *iBoundarytype, + mng_int32 *iBoundaryl, + mng_int32 *iBoundaryr, + mng_int32 *iBoundaryt, + mng_int32 *iBoundaryb); +#endif + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_disc (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount, + mng_uint16p *pObjectids); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_back (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue, + mng_uint8 *iMandatory, + mng_uint16 *iImageid, + mng_uint8 *iTile); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_fram (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iMode, + mng_uint32 *iNamesize, + mng_pchar *zName, + mng_uint8 *iChangedelay, + mng_uint8 *iChangetimeout, + mng_uint8 *iChangeclipping, + mng_uint8 *iChangesyncid, + mng_uint32 *iDelay, + mng_uint32 *iTimeout, + mng_uint8 *iBoundarytype, + mng_int32 *iBoundaryl, + mng_int32 *iBoundaryr, + mng_int32 *iBoundaryt, + mng_int32 *iBoundaryb, + mng_uint32 *iCount, + mng_uint32p *pSyncids); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_move (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iFirstid, + mng_uint16 *iLastid, + mng_uint8 *iMovetype, + mng_int32 *iMovex, + mng_int32 *iMovey); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_clip (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iFirstid, + mng_uint16 *iLastid, + mng_uint8 *iCliptype, + mng_int32 *iClipl, + mng_int32 *iClipr, + mng_int32 *iClipt, + mng_int32 *iClipb); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_show (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint16 *iFirstid, + mng_uint16 *iLastid, + mng_uint8 *iMode); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_term (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iTermaction, + mng_uint8 *iIteraction, + mng_uint32 *iDelay, + mng_uint32 *iItermax); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_save (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iOffsettype, + mng_uint32 *iCount); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_save_entry (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint8 *iEntrytype, + mng_uint32arr2 *iOffset, + mng_uint32arr2 *iStarttime, + mng_uint32 *iLayernr, + mng_uint32 *iFramenr, + mng_uint32 *iNamesize, + mng_pchar *zName); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_seek (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iNamesize, + mng_pchar *zName); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_expi (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iSnapshotid, + mng_uint32 *iNamesize, + mng_pchar *zName); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_fpri (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iDeltatype, + mng_uint8 *iPriority); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_need (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iKeywordssize, + mng_pchar *zKeywords); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_phyg (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iSizex, + mng_uint32 *iSizey, + mng_uint8 *iUnit); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_jhdr (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_uint8 *iColortype, + mng_uint8 *iImagesampledepth, + mng_uint8 *iImagecompression, + mng_uint8 *iImageinterlace, + mng_uint8 *iAlphasampledepth, + mng_uint8 *iAlphacompression, + mng_uint8 *iAlphafilter, + mng_uint8 *iAlphainterlace); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_jdat (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iRawlen, + mng_ptr *pRawdata); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_jdaa (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iRawlen, + mng_ptr *pRawdata); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_dhdr (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iObjectid, + mng_uint8 *iImagetype, + mng_uint8 *iDeltatype, + mng_uint32 *iBlockwidth, + mng_uint32 *iBlockheight, + mng_uint32 *iBlockx, + mng_uint32 *iBlocky); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_prom (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iColortype, + mng_uint8 *iSampledepth, + mng_uint8 *iFilltype); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_pplt (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iDeltatype, + mng_uint32 *iCount); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_pplt_entry (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue, + mng_uint16 *iAlpha, + mng_bool *bUsed); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_drop (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount, + mng_chunkidp *pChunknames); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_dbyk (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid *iChunkname, + mng_uint8 *iPolarity, + mng_uint32 *iKeywordssize, + mng_pchar *zKeywords); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_ordr (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_ordr_entry (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_chunkid *iChunkname, + mng_uint8 *iOrdertype); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_magn (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iFirstid, + mng_uint16 *iLastid, + mng_uint16 *iMethodX, + mng_uint16 *iMX, + mng_uint16 *iMY, + mng_uint16 *iML, + mng_uint16 *iMR, + mng_uint16 *iMT, + mng_uint16 *iMB, + mng_uint16 *iMethodY); + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_EXT mng_retcode MNG_DECL mng_getchunk_mpng (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iFramewidth, + mng_uint32 *iFrameheight, + mng_uint16 *iNumplays, + mng_uint16 *iTickspersec, + mng_uint8 *iCompressionmethod, + mng_uint32 *iCount); +MNG_EXT mng_retcode MNG_DECL mng_getchunk_mpng_frame (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint32 *iX, + mng_uint32 *iY, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_int32 *iXoffset, + mng_int32 *iYoffset, + mng_uint16 *iTicks); +#endif + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_evnt (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_evnt_entry (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint8 *iEventtype, + mng_uint8 *iMasktype, + mng_int32 *iLeft, + mng_int32 *iRight, + mng_int32 *iTop, + mng_int32 *iBottom, + mng_uint16 *iObjectid, + mng_uint8 *iIndex, + mng_uint32 *iSegmentnamesize, + mng_pchar *zSegmentname); + +MNG_EXT mng_retcode MNG_DECL mng_getchunk_unknown (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid *iChunkname, + mng_uint32 *iRawlen, + mng_ptr *pRawdata); + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +/* use these to create new chunks at the end of the chunk-list */ +/* requires at least MNG_ACCESS_CHUNKS (MNG_SUPPORT_WRITE may be nice too) */ +MNG_EXT mng_retcode MNG_DECL mng_putchunk_ihdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_plte (mng_handle hHandle, + mng_uint32 iCount, + mng_palette8 aPalette); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_idat (mng_handle hHandle, + mng_uint32 iRawlen, + mng_ptr pRawdata); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_iend (mng_handle hHandle); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_trns (mng_handle hHandle, + mng_bool bEmpty, + mng_bool bGlobal, + mng_uint8 iType, + mng_uint32 iCount, + mng_uint8arr aAlphas, + mng_uint16 iGray, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint32 iRawlen, + mng_uint8arr aRawdata); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_gama (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iGamma); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_chrm (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iWhitepointx, + mng_uint32 iWhitepointy, + mng_uint32 iRedx, + mng_uint32 iRedy, + mng_uint32 iGreenx, + mng_uint32 iGreeny, + mng_uint32 iBluex, + mng_uint32 iBluey); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_srgb (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iRenderingintent); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_iccp (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iNamesize, + mng_pchar zName, + mng_uint8 iCompression, + mng_uint32 iProfilesize, + mng_ptr pProfile); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_text (mng_handle hHandle, + mng_uint32 iKeywordsize, + mng_pchar zKeyword, + mng_uint32 iTextsize, + mng_pchar zText); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_ztxt (mng_handle hHandle, + mng_uint32 iKeywordsize, + mng_pchar zKeyword, + mng_uint8 iCompression, + mng_uint32 iTextsize, + mng_pchar zText); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_itxt (mng_handle hHandle, + mng_uint32 iKeywordsize, + mng_pchar zKeyword, + mng_uint8 iCompressionflag, + mng_uint8 iCompressionmethod, + mng_uint32 iLanguagesize, + mng_pchar zLanguage, + mng_uint32 iTranslationsize, + mng_pchar zTranslation, + mng_uint32 iTextsize, + mng_pchar zText); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_bkgd (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iType, + mng_uint8 iIndex, + mng_uint16 iGray, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_phys (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iSizex, + mng_uint32 iSizey, + mng_uint8 iUnit); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_sbit (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iType, + mng_uint8arr4 aBits); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_splt (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iNamesize, + mng_pchar zName, + mng_uint8 iSampledepth, + mng_uint32 iEntrycount, + mng_ptr pEntries); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_hist (mng_handle hHandle, + mng_uint32 iEntrycount, + mng_uint16arr aEntries); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_time (mng_handle hHandle, + mng_uint16 iYear, + mng_uint8 iMonth, + mng_uint8 iDay, + mng_uint8 iHour, + mng_uint8 iMinute, + mng_uint8 iSecond); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_mhdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint32 iTicks, + mng_uint32 iLayercount, + mng_uint32 iFramecount, + mng_uint32 iPlaytime, + mng_uint32 iSimplicity); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_mend (mng_handle hHandle); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_loop (mng_handle hHandle, + mng_uint8 iLevel, + mng_uint32 iRepeat, + mng_uint8 iTermination, + mng_uint32 iItermin, + mng_uint32 iItermax, + mng_uint32 iCount, + mng_uint32p pSignals); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_endl (mng_handle hHandle, + mng_uint8 iLevel); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_defi (mng_handle hHandle, + mng_uint16 iObjectid, + mng_uint8 iDonotshow, + mng_uint8 iConcrete, + mng_bool bHasloca, + mng_int32 iXlocation, + mng_int32 iYlocation, + mng_bool bHasclip, + mng_int32 iLeftcb, + mng_int32 iRightcb, + mng_int32 iTopcb, + mng_int32 iBottomcb); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_basi (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint16 iAlpha, + mng_uint8 iViewable); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_clon (mng_handle hHandle, + mng_uint16 iSourceid, + mng_uint16 iCloneid, + mng_uint8 iClonetype, + mng_uint8 iDonotshow, + mng_uint8 iConcrete, + mng_bool bHasloca, + mng_uint8 iLocationtype, + mng_int32 iLocationx, + mng_int32 iLocationy); + +#ifndef MNG_SKIPCHUNK_PAST +MNG_EXT mng_retcode MNG_DECL mng_putchunk_past (mng_handle hHandle, + mng_uint16 iDestid, + mng_uint8 iTargettype, + mng_int32 iTargetx, + mng_int32 iTargety, + mng_uint32 iCount); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_past_src (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint16 iSourceid, + mng_uint8 iComposition, + mng_uint8 iOrientation, + mng_uint8 iOffsettype, + mng_int32 iOffsetx, + mng_int32 iOffsety, + mng_uint8 iBoundarytype, + mng_int32 iBoundaryl, + mng_int32 iBoundaryr, + mng_int32 iBoundaryt, + mng_int32 iBoundaryb); +#endif + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_disc (mng_handle hHandle, + mng_uint32 iCount, + mng_uint16p pObjectids); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_back (mng_handle hHandle, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint8 iMandatory, + mng_uint16 iImageid, + mng_uint8 iTile); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_fram (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iMode, + mng_uint32 iNamesize, + mng_pchar zName, + mng_uint8 iChangedelay, + mng_uint8 iChangetimeout, + mng_uint8 iChangeclipping, + mng_uint8 iChangesyncid, + mng_uint32 iDelay, + mng_uint32 iTimeout, + mng_uint8 iBoundarytype, + mng_int32 iBoundaryl, + mng_int32 iBoundaryr, + mng_int32 iBoundaryt, + mng_int32 iBoundaryb, + mng_uint32 iCount, + mng_uint32p pSyncids); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_move (mng_handle hHandle, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMovetype, + mng_int32 iMovex, + mng_int32 iMovey); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_clip (mng_handle hHandle, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_show (mng_handle hHandle, + mng_bool bEmpty, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMode); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_term (mng_handle hHandle, + mng_uint8 iTermaction, + mng_uint8 iIteraction, + mng_uint32 iDelay, + mng_uint32 iItermax); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_save (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iOffsettype, + mng_uint32 iCount); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_save_entry (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint8 iEntrytype, + mng_uint32arr2 iOffset, + mng_uint32arr2 iStarttime, + mng_uint32 iLayernr, + mng_uint32 iFramenr, + mng_uint32 iNamesize, + mng_pchar zName); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_seek (mng_handle hHandle, + mng_uint32 iNamesize, + mng_pchar zName); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_expi (mng_handle hHandle, + mng_uint16 iSnapshotid, + mng_uint32 iNamesize, + mng_pchar zName); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_fpri (mng_handle hHandle, + mng_uint8 iDeltatype, + mng_uint8 iPriority); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_need (mng_handle hHandle, + mng_uint32 iKeywordssize, + mng_pchar zKeywords); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_phyg (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iSizex, + mng_uint32 iSizey, + mng_uint8 iUnit); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_jhdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iColortype, + mng_uint8 iImagesampledepth, + mng_uint8 iImagecompression, + mng_uint8 iImageinterlace, + mng_uint8 iAlphasampledepth, + mng_uint8 iAlphacompression, + mng_uint8 iAlphafilter, + mng_uint8 iAlphainterlace); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_jdat (mng_handle hHandle, + mng_uint32 iRawlen, + mng_ptr pRawdata); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_jdaa (mng_handle hHandle, + mng_uint32 iRawlen, + mng_ptr pRawdata); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_jsep (mng_handle hHandle); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_dhdr (mng_handle hHandle, + mng_uint16 iObjectid, + mng_uint8 iImagetype, + mng_uint8 iDeltatype, + mng_uint32 iBlockwidth, + mng_uint32 iBlockheight, + mng_uint32 iBlockx, + mng_uint32 iBlocky); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_prom (mng_handle hHandle, + mng_uint8 iColortype, + mng_uint8 iSampledepth, + mng_uint8 iFilltype); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_ipng (mng_handle hHandle); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_pplt (mng_handle hHandle, + mng_uint8 iDeltatype, + mng_uint32 iCount); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_pplt_entry (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint16 iAlpha); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_jpng (mng_handle hHandle); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_drop (mng_handle hHandle, + mng_uint32 iCount, + mng_chunkidp pChunknames); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_dbyk (mng_handle hHandle, + mng_chunkid iChunkname, + mng_uint8 iPolarity, + mng_uint32 iKeywordssize, + mng_pchar zKeywords); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_ordr (mng_handle hHandle, + mng_uint32 iCount); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_ordr_entry (mng_handle hHandle, + mng_uint32 iEntry, + mng_chunkid iChunkname, + mng_uint8 iOrdertype); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_magn (mng_handle hHandle, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint16 iMethodX, + mng_uint16 iMX, + mng_uint16 iMY, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint16 iMT, + mng_uint16 iMB, + mng_uint16 iMethodY); + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_EXT mng_retcode MNG_DECL mng_putchunk_mpng (mng_handle hHandle, + mng_uint32 iFramewidth, + mng_uint32 iFrameheight, + mng_uint16 iNumplays, + mng_uint16 iTickspersec, + mng_uint8 iCompressionmethod, + mng_uint32 iCount); +MNG_EXT mng_retcode MNG_DECL mng_putchunk_mpng_frame (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint32 iX, + mng_uint32 iY, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_int32 iXoffset, + mng_int32 iYoffset, + mng_uint16 iTicks); +#endif + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_evnt (mng_handle hHandle, + mng_uint32 iCount); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_evnt_entry (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint8 iEventtype, + mng_uint8 iMasktype, + mng_int32 iLeft, + mng_int32 iRight, + mng_int32 iTop, + mng_int32 iBottom, + mng_uint16 iObjectid, + mng_uint8 iIndex, + mng_uint32 iSegmentnamesize, + mng_pchar zSegmentname); + +MNG_EXT mng_retcode MNG_DECL mng_putchunk_unknown (mng_handle hHandle, + mng_chunkid iChunkname, + mng_uint32 iRawlen, + mng_ptr pRawdata); + +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +/* ************************************************************************** */ + +/* use these functions to access the actual image-data in stored chunks, + as opposed to the IDAT/JDAT data */ +/* to get accurate pixel-data the canvasstyle should seriously reflect the + bitdepth/colortype combination of the preceding IHDR/JHDR/BASI/DHDR; + all input can be converted to rgb(a)8 (rgb(a)16 for 16-bit images), but + there are only limited conversions back (see below for putimgdata) */ + +/* call this function if you want to extract the nth image from the list; + the first image is designated seqnr 0! */ +/* this function finds the IHDR/JHDR/BASI/DHDR with the appropriate seqnr, + starting from the beginning of the chunk-list; this may tend to get a little + slow for animations with a large number of chunks for images near the end */ +/* supplying a seqnr past the last image in the animation will return with + an errorcode */ +MNG_EXT mng_retcode MNG_DECL mng_getimgdata_seq (mng_handle hHandle, + mng_uint32 iSeqnr, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline); + +/* both the following functions will search forward to find the first IDAT/JDAT, + and then traverse back to find the start of the image (IHDR,JHDR,DHDR,BASI); + note that this is very fast compared to decoding the IDAT/JDAT, so there's + not really a need for optimization; either can be called from the + iterate_chunks callback when a IHDR/JHDR is encountered; for BASI/DHDR there + may not be real image-data so it's wisest to keep iterating till the IEND, + and then call either of these functions if necessary (remember the correct seqnr!) */ + +/* call this function if you want to extract the image starting at or after the nth + position in the chunk-list; this number is returned in the iterate_chunks callback */ +MNG_EXT mng_retcode MNG_DECL mng_getimgdata_chunkseq (mng_handle hHandle, + mng_uint32 iSeqnr, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline); + +/* call this function if you want to extract the image starting at or after the + indicated chunk; the handle of a chunk is returned in the iterate_chunks callback */ +MNG_EXT mng_retcode MNG_DECL mng_getimgdata_chunk (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline); + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +/* use the following functions to add image-data to the list of stored chunks */ +/* note that this only adds the IDAT or JDAT chunks and no others; you must call + one of these functions after you 'put' the initial chunks of the image and + before you 'put' the closing chunks */ +/* the canvasstyle should seriously reflect the bitdepth/colortype combination; + eg. bitdepth=16 would expect a 16-bit canvasstyle, + colortype=g or ga would expect a gray or gray+alpha style respectively + and so on, and so forth ... + (nb. the number of conversions will be extremely limited for the moment!) */ + +MNG_EXT mng_retcode MNG_DECL mng_putimgdata_ihdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iColortype, + mng_uint8 iBitdepth, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline); + +MNG_EXT mng_retcode MNG_DECL mng_putimgdata_jhdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iColortype, + mng_uint8 iBitdepth, + mng_uint8 iCompression, + mng_uint8 iInterlace, + mng_uint8 iAlphaBitdepth, + mng_uint8 iAlphaCompression, + mng_uint8 iAlphaFilter, + mng_uint8 iAlphaInterlace, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline); + +/* ************************************************************************** */ + +/* use the following functions to set the framecount/layercount/playtime or + simplicity of an animation you are creating; this may be useful if these + variables are calculated during the creation-process */ + +MNG_EXT mng_retcode MNG_DECL mng_updatemngheader (mng_handle hHandle, + mng_uint32 iFramecount, + mng_uint32 iLayercount, + mng_uint32 iPlaytime); + +MNG_EXT mng_retcode MNG_DECL mng_updatemngsimplicity (mng_handle hHandle, + mng_uint32 iSimplicity); + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +#endif /* MNG_ACCESS_CHUNKS */ + +/* ************************************************************************** */ +/* * * */ +/* * Error-code structure * */ +/* * * */ +/* * 0b0000 00xx xxxx xxxx - basic errors; severity 9 (environment) * */ +/* * 0b0000 01xx xxxx xxxx - chunk errors; severity 9 (image induced) * */ +/* * 0b0000 10xx xxxx xxxx - severity 5 errors (application induced) * */ +/* * 0b0001 00xx xxxx xxxx - severity 2 warnings (recoverable) * */ +/* * 0b0010 00xx xxxx xxxx - severity 1 warnings (recoverable) * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_NOERROR (mng_retcode)0 /* er.. indicates all's well */ + +#define MNG_OUTOFMEMORY (mng_retcode)1 /* oops, buy some megabytes! */ +#define MNG_INVALIDHANDLE (mng_retcode)2 /* call mng_initialize first */ +#define MNG_NOCALLBACK (mng_retcode)3 /* set the callbacks please */ +#define MNG_UNEXPECTEDEOF (mng_retcode)4 /* what'd ya do with the data? */ +#define MNG_ZLIBERROR (mng_retcode)5 /* zlib burped */ +#define MNG_JPEGERROR (mng_retcode)6 /* jpglib complained */ +#define MNG_LCMSERROR (mng_retcode)7 /* little cms stressed out */ +#define MNG_NOOUTPUTPROFILE (mng_retcode)8 /* no output-profile defined */ +#define MNG_NOSRGBPROFILE (mng_retcode)9 /* no sRGB-profile defined */ +#define MNG_BUFOVERFLOW (mng_retcode)10 /* zlib output-buffer overflow */ +#define MNG_FUNCTIONINVALID (mng_retcode)11 /* ay, totally inappropriate */ +#define MNG_OUTPUTERROR (mng_retcode)12 /* disk full ? */ +#define MNG_JPEGBUFTOOSMALL (mng_retcode)13 /* can't handle buffer overflow*/ +#define MNG_NEEDMOREDATA (mng_retcode)14 /* I'm hungry, give me more */ +#define MNG_NEEDTIMERWAIT (mng_retcode)15 /* Sleep a while then wake me */ +#define MNG_NEEDSECTIONWAIT (mng_retcode)16 /* just processed a SEEK */ +#define MNG_LOOPWITHCACHEOFF (mng_retcode)17 /* LOOP when playback info off */ + +#define MNG_DLLNOTLOADED (mng_retcode)99 /* late binding failed */ + +#define MNG_APPIOERROR (mng_retcode)901 /* application I/O error */ +#define MNG_APPTIMERERROR (mng_retcode)902 /* application timing error */ +#define MNG_APPCMSERROR (mng_retcode)903 /* application CMS error */ +#define MNG_APPMISCERROR (mng_retcode)904 /* application other error */ +#define MNG_APPTRACEABORT (mng_retcode)905 /* application aborts on trace */ + +#define MNG_INTERNALERROR (mng_retcode)999 /* internal inconsistancy */ + +#define MNG_INVALIDSIG (mng_retcode)1025 /* invalid graphics file */ +#define MNG_INVALIDCRC (mng_retcode)1027 /* crc check failed */ +#define MNG_INVALIDLENGTH (mng_retcode)1028 /* chunklength mystifies me */ +#define MNG_SEQUENCEERROR (mng_retcode)1029 /* invalid chunk sequence */ +#define MNG_CHUNKNOTALLOWED (mng_retcode)1030 /* completely out-of-place */ +#define MNG_MULTIPLEERROR (mng_retcode)1031 /* only one occurence allowed */ +#define MNG_PLTEMISSING (mng_retcode)1032 /* indexed-color requires PLTE */ +#define MNG_IDATMISSING (mng_retcode)1033 /* IHDR-block requires IDAT */ +#define MNG_CANNOTBEEMPTY (mng_retcode)1034 /* must contain some data */ +#define MNG_GLOBALLENGTHERR (mng_retcode)1035 /* global data incorrect */ +#define MNG_INVALIDBITDEPTH (mng_retcode)1036 /* bitdepth out-of-range */ +#define MNG_INVALIDCOLORTYPE (mng_retcode)1037 /* colortype out-of-range */ +#define MNG_INVALIDCOMPRESS (mng_retcode)1038 /* compression method invalid */ +#define MNG_INVALIDFILTER (mng_retcode)1039 /* filter method invalid */ +#define MNG_INVALIDINTERLACE (mng_retcode)1040 /* interlace method invalid */ +#define MNG_NOTENOUGHIDAT (mng_retcode)1041 /* ran out of compressed data */ +#define MNG_PLTEINDEXERROR (mng_retcode)1042 /* palette-index out-of-range */ +#define MNG_NULLNOTFOUND (mng_retcode)1043 /* couldn't find null-separator*/ +#define MNG_KEYWORDNULL (mng_retcode)1044 /* keyword cannot be empty */ +#define MNG_OBJECTUNKNOWN (mng_retcode)1045 /* the object can't be found */ +#define MNG_OBJECTEXISTS (mng_retcode)1046 /* the object already exists */ +#define MNG_TOOMUCHIDAT (mng_retcode)1047 /* got too much compressed data*/ +#define MNG_INVSAMPLEDEPTH (mng_retcode)1048 /* sampledepth out-of-range */ +#define MNG_INVOFFSETSIZE (mng_retcode)1049 /* invalid offset-size */ +#define MNG_INVENTRYTYPE (mng_retcode)1050 /* invalid entry-type */ +#define MNG_ENDWITHNULL (mng_retcode)1051 /* may not end with NULL */ +#define MNG_INVIMAGETYPE (mng_retcode)1052 /* invalid image_type */ +#define MNG_INVDELTATYPE (mng_retcode)1053 /* invalid delta_type */ +#define MNG_INVALIDINDEX (mng_retcode)1054 /* index-value invalid */ +#define MNG_TOOMUCHJDAT (mng_retcode)1055 /* got too much compressed data*/ +#define MNG_JPEGPARMSERR (mng_retcode)1056 /* JHDR/JPEG parms do not match*/ +#define MNG_INVFILLMETHOD (mng_retcode)1057 /* invalid fill_method */ +#define MNG_OBJNOTCONCRETE (mng_retcode)1058 /* object must be concrete */ +#define MNG_TARGETNOALPHA (mng_retcode)1059 /* object has no alpha-channel */ +#define MNG_MNGTOOCOMPLEX (mng_retcode)1060 /* can't handle complexity */ +#define MNG_UNKNOWNCRITICAL (mng_retcode)1061 /* unknown critical chunk found*/ +#define MNG_UNSUPPORTEDNEED (mng_retcode)1062 /* nEED requirement unsupported*/ +#define MNG_INVALIDDELTA (mng_retcode)1063 /* Delta operation illegal */ +#define MNG_INVALIDMETHOD (mng_retcode)1064 /* invalid MAGN method */ +#define MNG_IMPROBABLELENGTH (mng_retcode)1065 /* impropable chunk length */ +#define MNG_INVALIDBLOCK (mng_retcode)1066 /* invalid delta block */ +#define MNG_INVALIDEVENT (mng_retcode)1067 /* invalid event_type */ +#define MNG_INVALIDMASK (mng_retcode)1068 /* invalid mask_type */ +#define MNG_NOMATCHINGLOOP (mng_retcode)1069 /* ENDL without matching LOOP */ +#define MNG_SEEKNOTFOUND (mng_retcode)1070 /* EvNT points to unknown SEEK */ +#define MNG_OBJNOTABSTRACT (mng_retcode)1071 /* object must be abstract */ +#define MNG_TERMSEQERROR (mng_retcode)1072 /* TERM in wrong place */ +#define MNG_INVALIDFIELDVAL (mng_retcode)1073 /* invalid fieldvalue (generic)*/ +#define MNG_INVALIDWIDTH (mng_retcode)1074 /* invalid frame/image width */ +#define MNG_INVALIDHEIGHT (mng_retcode)1075 /* invalid frame/image height */ + +#define MNG_INVALIDCNVSTYLE (mng_retcode)2049 /* can't make anything of this */ +#define MNG_WRONGCHUNK (mng_retcode)2050 /* accessing the wrong chunk */ +#define MNG_INVALIDENTRYIX (mng_retcode)2051 /* accessing the wrong entry */ +#define MNG_NOHEADER (mng_retcode)2052 /* must have had header first */ +#define MNG_NOCORRCHUNK (mng_retcode)2053 /* can't find parent chunk */ +#define MNG_NOMHDR (mng_retcode)2054 /* no MNG header available */ + +#define MNG_IMAGETOOLARGE (mng_retcode)4097 /* input-image way too big */ +#define MNG_NOTANANIMATION (mng_retcode)4098 /* file not a MNG */ +#define MNG_FRAMENRTOOHIGH (mng_retcode)4099 /* frame-nr out-of-range */ +#define MNG_LAYERNRTOOHIGH (mng_retcode)4100 /* layer-nr out-of-range */ +#define MNG_PLAYTIMETOOHIGH (mng_retcode)4101 /* playtime out-of-range */ +#define MNG_FNNOTIMPLEMENTED (mng_retcode)4102 /* function not yet available */ + +#define MNG_IMAGEFROZEN (mng_retcode)8193 /* stopped displaying */ + +#define MNG_LCMS_NOHANDLE 1 /* LCMS returned NULL handle */ +#define MNG_LCMS_NOMEM 2 /* LCMS returned NULL gammatab */ +#define MNG_LCMS_NOTRANS 3 /* LCMS returned NULL transform*/ + +/* ************************************************************************** */ +/* * * */ +/* * Canvas styles * */ +/* * * */ +/* * Note that the intentions are pretty darn good, but that the focus * */ +/* * is currently on 8-bit color support * */ +/* * * */ +/* * The RGB8_A8 style is defined for apps that require a separate * */ +/* * canvas for the color-planes and the alpha-plane (eg. mozilla) * */ +/* * This requires for the app to supply the "getalphaline" callback!!! * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_CANVAS_RGB8 0x00000000L +#define MNG_CANVAS_RGBA8 0x00001000L +#define MNG_CANVAS_RGBA8_PM 0x00009000L +#define MNG_CANVAS_ARGB8 0x00003000L +#define MNG_CANVAS_ARGB8_PM 0x0000B000L +#define MNG_CANVAS_RGB8_A8 0x00005000L +#define MNG_CANVAS_BGR8 0x00000001L +#define MNG_CANVAS_BGRX8 0x00010001L +#define MNG_CANVAS_BGRA8 0x00001001L +#define MNG_CANVAS_BGRA8PM 0x00009001L /* backward compatibility */ +#define MNG_CANVAS_BGRA8_PM 0x00009001L +#define MNG_CANVAS_ABGR8 0x00003001L +#define MNG_CANVAS_ABGR8_PM 0x0000B001L +#define MNG_CANVAS_RGB16 0x00000100L /* not supported yet */ +#define MNG_CANVAS_RGBA16 0x00001100L /* not supported yet */ +#define MNG_CANVAS_ARGB16 0x00003100L /* not supported yet */ +#define MNG_CANVAS_BGR16 0x00000101L /* not supported yet */ +#define MNG_CANVAS_BGRA16 0x00001101L /* not supported yet */ +#define MNG_CANVAS_ABGR16 0x00003101L /* not supported yet */ +#define MNG_CANVAS_GRAY8 0x00000002L /* not supported yet */ +#define MNG_CANVAS_GRAY16 0x00000102L /* not supported yet */ +#define MNG_CANVAS_GRAYA8 0x00001002L /* not supported yet */ +#define MNG_CANVAS_GRAYA16 0x00001102L /* not supported yet */ +#define MNG_CANVAS_AGRAY8 0x00003002L /* not supported yet */ +#define MNG_CANVAS_AGRAY16 0x00003102L /* not supported yet */ +#define MNG_CANVAS_DX15 0x00000003L /* not supported yet */ +#define MNG_CANVAS_DX16 0x00000004L /* not supported yet */ + +#define MNG_CANVAS_RGB565 0x00000005L +#define MNG_CANVAS_RGBA565 0x00001005L +#define MNG_CANVAS_BGR565 0x00000006L +#define MNG_CANVAS_BGRA565 0x00001006L +#define MNG_CANVAS_BGR565_A8 0x00004006L + +#define MNG_CANVAS_RGB555 0x00000007L +#define MNG_CANVAS_BGR555 0x00000008L + +#define MNG_CANVAS_PIXELTYPE(C) (C & 0x000000FFL) +#define MNG_CANVAS_BITDEPTH(C) (C & 0x00000100L) +#define MNG_CANVAS_HASALPHA(C) (C & 0x00001000L) +#define MNG_CANVAS_ALPHAFIRST(C) (C & 0x00002000L) +#define MNG_CANVAS_ALPHASEPD(C) (C & 0x00004000L) +#define MNG_CANVAS_ALPHAPM(C) (C & 0x00008000L) +#define MNG_CANVAS_HASFILLER(C) (C & 0x00010000L) + +#define MNG_CANVAS_RGB(C) (MNG_CANVAS_PIXELTYPE (C) == 0) +#define MNG_CANVAS_BGR(C) (MNG_CANVAS_PIXELTYPE (C) == 1) +#define MNG_CANVAS_GRAY(C) (MNG_CANVAS_PIXELTYPE (C) == 2) +#define MNG_CANVAS_DIRECTX15(C) (MNG_CANVAS_PIXELTYPE (C) == 3) +#define MNG_CANVAS_DIRECTX16(C) (MNG_CANVAS_PIXELTYPE (C) == 4) +#define MNG_CANVAS_RGB_565(C) (MNG_CANVAS_PIXELTYPE (C) == 5) +#define MNG_CANVAS_BGR_565(C) (MNG_CANVAS_PIXELTYPE (C) == 6) +#define MNG_CANVAS_8BIT(C) (!MNG_CANVAS_BITDEPTH (C)) +#define MNG_CANVAS_16BIT(C) (MNG_CANVAS_BITDEPTH (C)) +#define MNG_CANVAS_PIXELFIRST(C) (!MNG_CANVAS_ALPHAFIRST (C)) + +/* ************************************************************************** */ +/* * * */ +/* * Chunk names (idea adapted from libpng 1.1.0 - png.h) * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_UINT_HUH 0x40404040L + +#define MNG_UINT_BACK 0x4241434bL +#define MNG_UINT_BASI 0x42415349L +#define MNG_UINT_CLIP 0x434c4950L +#define MNG_UINT_CLON 0x434c4f4eL +#define MNG_UINT_DBYK 0x4442594bL +#define MNG_UINT_DEFI 0x44454649L +#define MNG_UINT_DHDR 0x44484452L +#define MNG_UINT_DISC 0x44495343L +#define MNG_UINT_DROP 0x44524f50L +#define MNG_UINT_ENDL 0x454e444cL +#define MNG_UINT_FRAM 0x4652414dL +#define MNG_UINT_IDAT 0x49444154L +#define MNG_UINT_IEND 0x49454e44L +#define MNG_UINT_IHDR 0x49484452L +#define MNG_UINT_IJNG 0x494a4e47L +#define MNG_UINT_IPNG 0x49504e47L +#define MNG_UINT_JDAA 0x4a444141L +#define MNG_UINT_JDAT 0x4a444154L +#define MNG_UINT_JHDR 0x4a484452L +#define MNG_UINT_JSEP 0x4a534550L +#define MNG_UINT_JdAA 0x4a644141L +#define MNG_UINT_LOOP 0x4c4f4f50L +#define MNG_UINT_MAGN 0x4d41474eL +#define MNG_UINT_MEND 0x4d454e44L +#define MNG_UINT_MHDR 0x4d484452L +#define MNG_UINT_MOVE 0x4d4f5645L +#define MNG_UINT_ORDR 0x4f524452L +#define MNG_UINT_PAST 0x50415354L +#define MNG_UINT_PLTE 0x504c5445L +#define MNG_UINT_PPLT 0x50504c54L +#define MNG_UINT_PROM 0x50524f4dL +#define MNG_UINT_SAVE 0x53415645L +#define MNG_UINT_SEEK 0x5345454bL +#define MNG_UINT_SHOW 0x53484f57L +#define MNG_UINT_TERM 0x5445524dL +#define MNG_UINT_adAT 0x61644154L +#define MNG_UINT_ahDR 0x61684452L +#define MNG_UINT_bKGD 0x624b4744L +#define MNG_UINT_cHRM 0x6348524dL +#define MNG_UINT_eXPI 0x65585049L +#define MNG_UINT_evNT 0x65764e54L +#define MNG_UINT_fPRI 0x66505249L +#define MNG_UINT_gAMA 0x67414d41L +#define MNG_UINT_hIST 0x68495354L +#define MNG_UINT_iCCP 0x69434350L +#define MNG_UINT_iTXt 0x69545874L +#define MNG_UINT_mpNG 0x6d704e47L +#define MNG_UINT_nEED 0x6e454544L +#define MNG_UINT_oFFs 0x6f464673L +#define MNG_UINT_pCAL 0x7043414cL +#define MNG_UINT_pHYg 0x70444167L +#define MNG_UINT_pHYs 0x70485973L +#define MNG_UINT_sBIT 0x73424954L +#define MNG_UINT_sCAL 0x7343414cL +#define MNG_UINT_sPLT 0x73504c54L +#define MNG_UINT_sRGB 0x73524742L +#define MNG_UINT_tEXt 0x74455874L +#define MNG_UINT_tIME 0x74494d45L +#define MNG_UINT_tRNS 0x74524e53L +#define MNG_UINT_zTXt 0x7a545874L + +/* ************************************************************************** */ +/* * * */ +/* * Chunk property values * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_BITDEPTH_1 1 /* IHDR, BASI, JHDR, PROM */ +#define MNG_BITDEPTH_2 2 +#define MNG_BITDEPTH_4 4 +#define MNG_BITDEPTH_8 8 /* sPLT */ +#define MNG_BITDEPTH_16 16 + +#define MNG_COLORTYPE_GRAY 0 /* IHDR, BASI, PROM */ +#define MNG_COLORTYPE_RGB 2 +#define MNG_COLORTYPE_INDEXED 3 +#define MNG_COLORTYPE_GRAYA 4 +#define MNG_COLORTYPE_RGBA 6 + +#define MNG_COMPRESSION_DEFLATE 0 /* IHDR, zTXt, iTXt, iCCP, + BASI, JHDR */ + +#define MNG_FILTER_ADAPTIVE 0 /* IHDR, BASI, JHDR */ +/* #define MNG_FILTER_NO_ADAPTIVE 1 +#define MNG_FILTER_NO_DIFFERING 0 +#define MNG_FILTER_DIFFERING 0x40 +#define MNG_FILTER_MASK (MNG_FILTER_NO_ADAPTIVE | MNG_FILTER_DIFFERING) */ +#ifdef FILTER192 +#define MNG_FILTER_DIFFERING 0xC0 +#endif +#ifdef FILTER193 +#define MNG_FILTER_NOFILTER 0xC1 +#endif + +#define MNG_INTERLACE_NONE 0 /* IHDR, BASI, JHDR */ +#define MNG_INTERLACE_ADAM7 1 + +#define MNG_FILTER_NONE 0 /* IDAT */ +#define MNG_FILTER_SUB 1 +#define MNG_FILTER_UP 2 +#define MNG_FILTER_AVERAGE 3 +#define MNG_FILTER_PAETH 4 + +#define MNG_INTENT_PERCEPTUAL 0 /* sRGB */ +#define MNG_INTENT_RELATIVECOLORIMETRIC 1 +#define MNG_INTENT_SATURATION 2 +#define MNG_INTENT_ABSOLUTECOLORIMETRIC 3 + /* tEXt, zTXt, iTXt */ +#define MNG_TEXT_TITLE "Title" +#define MNG_TEXT_AUTHOR "Author" +#define MNG_TEXT_DESCRIPTION "Description" +#define MNG_TEXT_COPYRIGHT "Copyright" +#define MNG_TEXT_CREATIONTIME "Creation Time" +#define MNG_TEXT_SOFTWARE "Software" +#define MNG_TEXT_DISCLAIMER "Disclaimer" +#define MNG_TEXT_WARNING "Warning" +#define MNG_TEXT_SOURCE "Source" +#define MNG_TEXT_COMMENT "Comment" + +#define MNG_FLAG_UNCOMPRESSED 0 /* iTXt */ +#define MNG_FLAG_COMPRESSED 1 + +#define MNG_UNIT_UNKNOWN 0 /* pHYs, pHYg */ +#define MNG_UNIT_METER 1 + /* MHDR */ +#define MNG_SIMPLICITY_VALID 0x00000001 +#define MNG_SIMPLICITY_SIMPLEFEATURES 0x00000002 +#define MNG_SIMPLICITY_COMPLEXFEATURES 0x00000004 +#define MNG_SIMPLICITY_TRANSPARENCY 0x00000008 +#define MNG_SIMPLICITY_JNG 0x00000010 +#define MNG_SIMPLICITY_DELTAPNG 0x00000020 + +#define MNG_TERMINATION_DECODER_NC 0 /* LOOP */ +#define MNG_TERMINATION_USER_NC 1 +#define MNG_TERMINATION_EXTERNAL_NC 2 +#define MNG_TERMINATION_DETERMINISTIC_NC 3 +#define MNG_TERMINATION_DECODER_C 4 +#define MNG_TERMINATION_USER_C 5 +#define MNG_TERMINATION_EXTERNAL_C 6 +#define MNG_TERMINATION_DETERMINISTIC_C 7 + +#define MNG_DONOTSHOW_VISIBLE 0 /* DEFI */ +#define MNG_DONOTSHOW_NOTVISIBLE 1 + +#define MNG_ABSTRACT 0 /* DEFI */ +#define MNG_CONCRETE 1 + +#define MNG_NOTVIEWABLE 0 /* BASI */ +#define MNG_VIEWABLE 1 + +#define MNG_FULL_CLONE 0 /* CLON */ +#define MNG_PARTIAL_CLONE 1 +#define MNG_RENUMBER 2 + +#define MNG_CONCRETE_ASPARENT 0 /* CLON */ +#define MNG_CONCRETE_MAKEABSTRACT 1 + +#define MNG_LOCATION_ABSOLUTE 0 /* CLON, MOVE */ +#define MNG_LOCATION_RELATIVE 1 + +#ifndef MNG_SKIPCHUNK_PAST +#define MNG_TARGET_ABSOLUTE 0 /* PAST */ +#define MNG_TARGET_RELATIVE_SAMEPAST 1 +#define MNG_TARGET_RELATIVE_PREVPAST 2 + +#define MNG_COMPOSITE_OVER 0 /* PAST */ +#define MNG_COMPOSITE_REPLACE 1 +#define MNG_COMPOSITE_UNDER 2 + +#define MNG_ORIENTATION_SAME 0 /* PAST */ +#define MNG_ORIENTATION_180DEG 2 +#define MNG_ORIENTATION_FLIPHORZ 4 +#define MNG_ORIENTATION_FLIPVERT 6 +#define MNG_ORIENTATION_TILED 8 + +#define MNG_OFFSET_ABSOLUTE 0 /* PAST */ +#define MNG_OFFSET_RELATIVE 1 +#endif + +#define MNG_BOUNDARY_ABSOLUTE 0 /* PAST, FRAM */ +#define MNG_BOUNDARY_RELATIVE 1 + +#define MNG_BACKGROUNDCOLOR_MANDATORY 0x01 /* BACK */ +#define MNG_BACKGROUNDIMAGE_MANDATORY 0x02 /* BACK */ + +#define MNG_BACKGROUNDIMAGE_NOTILE 0 /* BACK */ +#define MNG_BACKGROUNDIMAGE_TILE 1 + +#define MNG_FRAMINGMODE_NOCHANGE 0 /* FRAM */ +#define MNG_FRAMINGMODE_1 1 +#define MNG_FRAMINGMODE_2 2 +#define MNG_FRAMINGMODE_3 3 +#define MNG_FRAMINGMODE_4 4 + +#define MNG_CHANGEDELAY_NO 0 /* FRAM */ +#define MNG_CHANGEDELAY_NEXTSUBFRAME 1 +#define MNG_CHANGEDELAY_DEFAULT 2 + +#define MNG_CHANGETIMOUT_NO 0 /* FRAM */ +#define MNG_CHANGETIMOUT_DETERMINISTIC_1 1 +#define MNG_CHANGETIMOUT_DETERMINISTIC_2 2 +#define MNG_CHANGETIMOUT_DECODER_1 3 +#define MNG_CHANGETIMOUT_DECODER_2 4 +#define MNG_CHANGETIMOUT_USER_1 5 +#define MNG_CHANGETIMOUT_USER_2 6 +#define MNG_CHANGETIMOUT_EXTERNAL_1 7 +#define MNG_CHANGETIMOUT_EXTERNAL_2 8 + +#define MNG_CHANGECLIPPING_NO 0 /* FRAM */ +#define MNG_CHANGECLIPPING_NEXTSUBFRAME 1 +#define MNG_CHANGECLIPPING_DEFAULT 2 + +#define MNG_CHANGESYNCID_NO 0 /* FRAM */ +#define MNG_CHANGESYNCID_NEXTSUBFRAME 1 +#define MNG_CHANGESYNCID_DEFAULT 2 + +#define MNG_CLIPPING_ABSOLUTE 0 /* CLIP */ +#define MNG_CLIPPING_RELATIVE 1 + +#define MNG_SHOWMODE_0 0 /* SHOW */ +#define MNG_SHOWMODE_1 1 +#define MNG_SHOWMODE_2 2 +#define MNG_SHOWMODE_3 3 +#define MNG_SHOWMODE_4 4 +#define MNG_SHOWMODE_5 5 +#define MNG_SHOWMODE_6 6 +#define MNG_SHOWMODE_7 7 + +#define MNG_TERMACTION_LASTFRAME 0 /* TERM */ +#define MNG_TERMACTION_CLEAR 1 +#define MNG_TERMACTION_FIRSTFRAME 2 +#define MNG_TERMACTION_REPEAT 3 + +#define MNG_ITERACTION_LASTFRAME 0 /* TERM */ +#define MNG_ITERACTION_CLEAR 1 +#define MNG_ITERACTION_FIRSTFRAME 2 + +#define MNG_SAVEOFFSET_4BYTE 4 /* SAVE */ +#define MNG_SAVEOFFSET_8BYTE 8 + +#define MNG_SAVEENTRY_SEGMENTFULL 0 /* SAVE */ +#define MNG_SAVEENTRY_SEGMENT 1 +#define MNG_SAVEENTRY_SUBFRAME 2 +#define MNG_SAVEENTRY_EXPORTEDIMAGE 3 + +#define MNG_PRIORITY_ABSOLUTE 0 /* fPRI */ +#define MNG_PRIORITY_RELATIVE 1 + +#ifdef MNG_INCLUDE_JNG +#define MNG_COLORTYPE_JPEGGRAY 8 /* JHDR */ +#define MNG_COLORTYPE_JPEGCOLOR 10 +#define MNG_COLORTYPE_JPEGGRAYA 12 +#define MNG_COLORTYPE_JPEGCOLORA 14 + +#define MNG_BITDEPTH_JPEG8 8 /* JHDR */ +#define MNG_BITDEPTH_JPEG12 12 +#define MNG_BITDEPTH_JPEG8AND12 20 + +#define MNG_COMPRESSION_BASELINEJPEG 8 /* JHDR */ + +#define MNG_INTERLACE_SEQUENTIAL 0 /* JHDR */ +#define MNG_INTERLACE_PROGRESSIVE 8 +#endif /* MNG_INCLUDE_JNG */ + +#define MNG_IMAGETYPE_UNKNOWN 0 /* DHDR */ +#define MNG_IMAGETYPE_PNG 1 +#define MNG_IMAGETYPE_JNG 2 + +#define MNG_DELTATYPE_REPLACE 0 /* DHDR */ +#define MNG_DELTATYPE_BLOCKPIXELADD 1 +#define MNG_DELTATYPE_BLOCKALPHAADD 2 +#define MNG_DELTATYPE_BLOCKCOLORADD 3 +#define MNG_DELTATYPE_BLOCKPIXELREPLACE 4 +#define MNG_DELTATYPE_BLOCKALPHAREPLACE 5 +#define MNG_DELTATYPE_BLOCKCOLORREPLACE 6 +#define MNG_DELTATYPE_NOCHANGE 7 + +#define MNG_FILLMETHOD_LEFTBITREPLICATE 0 /* PROM */ +#define MNG_FILLMETHOD_ZEROFILL 1 + +#define MNG_DELTATYPE_REPLACERGB 0 /* PPLT */ +#define MNG_DELTATYPE_DELTARGB 1 +#define MNG_DELTATYPE_REPLACEALPHA 2 +#define MNG_DELTATYPE_DELTAALPHA 3 +#define MNG_DELTATYPE_REPLACERGBA 4 +#define MNG_DELTATYPE_DELTARGBA 5 + +#define MNG_POLARITY_ONLY 0 /* DBYK */ +#define MNG_POLARITY_ALLBUT 1 + +#define MNG_EVENT_NONE 0 /* evNT */ +#define MNG_EVENT_MOUSEENTER 1 +#define MNG_EVENT_MOUSEMOVE 2 +#define MNG_EVENT_MOUSEEXIT 3 +#define MNG_EVENT_MOUSEDOWN 4 +#define MNG_EVENT_MOUSEUP 5 + +#define MNG_MASK_NONE 0 /* evNT */ +#define MNG_MASK_BOX 1 +#define MNG_MASK_OBJECT 2 +#define MNG_MASK_OBJECTIX 3 +#define MNG_MASK_BOXOBJECT 4 +#define MNG_MASK_BOXOBJECTIX 5 + +/* ************************************************************************** */ +/* * * */ +/* * Processtext callback types * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_TYPE_TEXT 0 +#define MNG_TYPE_ZTXT 1 +#define MNG_TYPE_ITXT 2 + +/* ************************************************************************** */ +/* * * */ +/* * CRC processing masks * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_CRC_INPUT 0x0000000f +#define MNG_CRC_INPUT_NONE 0x00000000 +#define MNG_CRC_INPUT_PRESENT 0x00000001 +#define MNG_CRC_OUTPUT 0x000000f0 +#define MNG_CRC_OUTPUT_NONE 0x00000000 +#define MNG_CRC_OUTPUT_GENERATE 0x00000020 +#define MNG_CRC_OUTPUT_DUMMY 0x00000040 +#define MNG_CRC_ANCILLARY 0x00000f00 +#define MNG_CRC_ANCILLARY_IGNORE 0x00000000 +#define MNG_CRC_ANCILLARY_DISCARD 0x00000100 +#define MNG_CRC_ANCILLARY_WARNING 0x00000200 +#define MNG_CRC_ANCILLARY_ERROR 0x00000300 +#define MNG_CRC_CRITICAL 0x0000f000 +#define MNG_CRC_CRITICAL_IGNORE 0x00000000 +#define MNG_CRC_CRITICAL_WARNING 0x00002000 +#define MNG_CRC_CRITICAL_ERROR 0x00003000 +#define MNG_CRC_DEFAULT 0x00002121 + +/* ************************************************************************** */ + +#ifdef __cplusplus +} +#endif + +#endif /* _libmng_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_callback_xs.c b/src/3rdparty/libmng/libmng_callback_xs.c new file mode 100644 index 0000000000..ff1a22a70b --- /dev/null +++ b/src/3rdparty/libmng/libmng_callback_xs.c @@ -0,0 +1,1239 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_callback_xs.c copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : callback get/set interface (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the callback get/set functions * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - fixed calling convention * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.5.2 - 05/31/2000 - G.Juyn * */ +/* * - fixed up punctuation (contribution by Tim Rowley) * */ +/* * 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - added getalphaline callback for RGB8_A8 canvasstyle * */ +/* * * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added callbacks for SAVE/SEEK processing * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added callback to process non-critical unknown chunks * */ +/* * * */ +/* * 1.0.1 - 02/08/2001 - G.Juyn * */ +/* * - added MEND processing callback * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added processterm callback * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G. R-P * */ +/* * - added SKIPCHUNK feature * */ +/* * * */ +/* * 1.0.7 - 03/10/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * 1.0.7 - 03/19/2004 - G.R-P * */ +/* * - fixed typo (MNG_SKIPCHUNK_SAVE -> MNG_SKIPCHUNK_nEED * */ +/* * * */ +/* * 1.0.8 - 04/10/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * * */ +/* * 1.0.9 - 09/18/2004 - G.R-P. * */ +/* * - added two SKIPCHUNK_TERM conditionals * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Callback set functions * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_INTERNAL_MEMMNGMT +mng_retcode MNG_DECL mng_setcb_memalloc (mng_handle hHandle, + mng_memalloc fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_MEMALLOC, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fMemalloc = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_MEMALLOC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INTERNAL_MEMMNGMT */ + +/* ************************************************************************** */ + +#ifndef MNG_INTERNAL_MEMMNGMT +mng_retcode MNG_DECL mng_setcb_memfree (mng_handle hHandle, + mng_memfree fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_MEMFREE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fMemfree = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_MEMFREE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INTERNAL_MEMMNGMT */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_setcb_releasedata (mng_handle hHandle, + mng_releasedata fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_RELEASEDATA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fReleasedata = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_RELEASEDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) +#ifndef MNG_NO_OPEN_CLOSE_STREAM +mng_retcode MNG_DECL mng_setcb_openstream (mng_handle hHandle, + mng_openstream fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_OPENSTREAM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fOpenstream = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_OPENSTREAM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) +#ifndef MNG_NO_OPEN_CLOSE_STREAM +mng_retcode MNG_DECL mng_setcb_closestream (mng_handle hHandle, + mng_closestream fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_CLOSESTREAM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fClosestream = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_CLOSESTREAM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_setcb_readdata (mng_handle hHandle, + mng_readdata fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_READDATA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fReaddata = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_READDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_setcb_writedata (mng_handle hHandle, + mng_writedata fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_WRITEDATA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fWritedata = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_WRITEDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_setcb_errorproc (mng_handle hHandle, + mng_errorproc fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_ERRORPROC, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fErrorproc = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_ERRORPROC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_TRACE +mng_retcode MNG_DECL mng_setcb_traceproc (mng_handle hHandle, + mng_traceproc fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_TRACEPROC, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fTraceproc = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_TRACEPROC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_TRACE */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_setcb_processheader (mng_handle hHandle, + mng_processheader fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSHEADER, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessheader = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSHEADER, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_tEXt +mng_retcode MNG_DECL mng_setcb_processtext (mng_handle hHandle, + mng_processtext fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSTEXT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcesstext = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSTEXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode MNG_DECL mng_setcb_processsave (mng_handle hHandle, + mng_processsave fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSSAVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcesssave = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSSAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode MNG_DECL mng_setcb_processseek (mng_handle hHandle, + mng_processseek fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSSEEK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessseek = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSSEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_nEED +mng_retcode MNG_DECL mng_setcb_processneed (mng_handle hHandle, + mng_processneed fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSNEED, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessneed = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSNEED, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_setcb_processmend (mng_handle hHandle, + mng_processmend fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSMEND, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessmend = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSMEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_setcb_processunknown (mng_handle hHandle, + mng_processunknown fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSUNKNOWN, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessunknown = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSUNKNOWN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_TERM +mng_retcode MNG_DECL mng_setcb_processterm (mng_handle hHandle, + mng_processterm fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSTERM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessterm = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSTERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_setcb_getcanvasline (mng_handle hHandle, + mng_getcanvasline fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_GETCANVASLINE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fGetcanvasline = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_GETCANVASLINE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_setcb_getbkgdline (mng_handle hHandle, + mng_getbkgdline fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_GETBKGDLINE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fGetbkgdline = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_GETBKGDLINE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_setcb_getalphaline (mng_handle hHandle, + mng_getalphaline fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_GETALPHALINE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fGetalphaline = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_GETALPHALINE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_setcb_refresh (mng_handle hHandle, + mng_refresh fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_REFRESH, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fRefresh = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_REFRESH, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_setcb_gettickcount (mng_handle hHandle, + mng_gettickcount fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_GETTICKCOUNT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fGettickcount = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_GETTICKCOUNT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_setcb_settimer (mng_handle hHandle, + mng_settimer fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_SETTIMER, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fSettimer = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_SETTIMER, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +mng_retcode MNG_DECL mng_setcb_processgamma (mng_handle hHandle, + mng_processgamma fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSGAMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessgamma = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSGAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +#ifndef MNG_SKIPCHUNK_cHRM +mng_retcode MNG_DECL mng_setcb_processchroma (mng_handle hHandle, + mng_processchroma fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSCHROMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcesschroma = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSCHROMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +mng_retcode MNG_DECL mng_setcb_processsrgb (mng_handle hHandle, + mng_processsrgb fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSSRGB, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcesssrgb = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSSRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +#ifndef MNG_SKIPCHUNK_iCCP +mng_retcode MNG_DECL mng_setcb_processiccp (mng_handle hHandle, + mng_processiccp fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSICCP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessiccp = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSICCP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +mng_retcode MNG_DECL mng_setcb_processarow (mng_handle hHandle, + mng_processarow fProc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSAROW, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->fProcessarow = fProc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SETCB_PROCESSAROW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ +/* * * */ +/* * Callback get functions * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_INTERNAL_MEMMNGMT +mng_memalloc MNG_DECL mng_getcb_memalloc (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_MEMALLOC, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_MEMALLOC, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fMemalloc; +} +#endif /* MNG_INTERNAL_MEMMNGMT */ + +/* ************************************************************************** */ + +#ifndef MNG_INTERNAL_MEMMNGMT +mng_memfree MNG_DECL mng_getcb_memfree (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_MEMFREE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_MEMFREE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fMemfree; +} +#endif /* MNG_INTERNAL_MEMMNGMT */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_releasedata MNG_DECL mng_getcb_releasedata (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_RELEASEDATA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_RELEASEDATA, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fReleasedata; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_readdata MNG_DECL mng_getcb_readdata (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_READDATA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_READDATA, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fReaddata; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) +#ifndef MNG_NO_OPEN_CLOSE_STREAM +mng_openstream MNG_DECL mng_getcb_openstream (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_OPENSTREAM, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_OPENSTREAM, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fOpenstream; +} +#endif +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) +#ifndef MNG_NO_OPEN_CLOSE_STREAM +mng_closestream MNG_DECL mng_getcb_closestream (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_CLOSESTREAM, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_CLOSESTREAM, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fClosestream; +} +#endif +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_WRITE +mng_writedata MNG_DECL mng_getcb_writedata (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_WRITEDATA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_WRITEDATA, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fWritedata; +} +#endif /* MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +mng_errorproc MNG_DECL mng_getcb_errorproc (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_ERRORPROC, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_ERRORPROC, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fErrorproc; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_TRACE +mng_traceproc MNG_DECL mng_getcb_traceproc (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_TRACEPROC, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_TRACEPROC, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fTraceproc; +} +#endif /* MNG_SUPPORT_TRACE */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_processheader MNG_DECL mng_getcb_processheader (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSHEADER, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSHEADER, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessheader; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_tEXt +mng_processtext MNG_DECL mng_getcb_processtext (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSTEXT, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSTEXT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcesstext; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_SAVE +mng_processsave MNG_DECL mng_getcb_processsave (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSSAVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSSAVE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcesssave; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_SEEK +mng_processseek MNG_DECL mng_getcb_processseek (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSSEEK, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSSEEK, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessseek; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_nEED +mng_processneed MNG_DECL mng_getcb_processneed (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSNEED, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSNEED, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessneed; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_processmend MNG_DECL mng_getcb_processmend (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSMEND, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSMEND, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessmend; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_processunknown MNG_DECL mng_getcb_processunknown (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSUNKNOWN, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSUNKNOWN, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessunknown; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +#ifndef MNG_SKIPCHUNK_TERM +mng_processterm MNG_DECL mng_getcb_processterm (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSTERM, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSTERM, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessterm; +} +#endif +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_getcanvasline MNG_DECL mng_getcb_getcanvasline (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_GETCANVASLINE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_GETCANVASLINE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fGetcanvasline; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_getbkgdline MNG_DECL mng_getcb_getbkgdline (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_GETBKGDLINE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_GETBKGDLINE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fGetbkgdline; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_getalphaline MNG_DECL mng_getcb_getalphaline (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_GETALPHALINE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_GETALPHALINE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fGetalphaline; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_refresh MNG_DECL mng_getcb_refresh (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_REFRESH, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_REFRESH, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fRefresh; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_gettickcount MNG_DECL mng_getcb_gettickcount (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_GETTICKCOUNT, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_GETTICKCOUNT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fGettickcount; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_settimer MNG_DECL mng_getcb_settimer (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_SETTIMER, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_SETTIMER, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fSettimer; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +mng_processgamma MNG_DECL mng_getcb_processgamma (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSGAMMA, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessgamma; +} +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +#ifndef MNG_SKIPCHUNK_cHRM +mng_processchroma MNG_DECL mng_getcb_processchroma (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSCHROMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSCHROMA, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcesschroma; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +mng_processsrgb MNG_DECL mng_getcb_processsrgb (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSSRGB, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSSRGB, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcesssrgb; +} +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +#ifndef MNG_SKIPCHUNK_iCCP +mng_processiccp MNG_DECL mng_getcb_processiccp (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSICCP, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSICCP, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessiccp; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_APP_CMS) +mng_processarow MNG_DECL mng_getcb_processarow (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSAROW, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GETCB_PROCESSAROW, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->fProcessarow; +} +#endif /* MNG_SUPPORT_DISPLAY && MNG_APP_CMS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + + + diff --git a/src/3rdparty/libmng/libmng_chunk_descr.c b/src/3rdparty/libmng/libmng_chunk_descr.c new file mode 100644 index 0000000000..e1004a5404 --- /dev/null +++ b/src/3rdparty/libmng/libmng_chunk_descr.c @@ -0,0 +1,6090 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_chunk_descr.c copyright (c) 2005-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Chunk descriptor functions (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the chunk- anf field-descriptor * */ +/* * routines * */ +/* * * */ +/* * changes : 1.0.9 - 12/06/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */ +/* * 1.0.9 - 12/11/2004 - G.Juyn * */ +/* * - made all constants 'static' * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * 1.0.9 - 01/17/2005 - G.Juyn * */ +/* * - fixed problem with global PLTE/tRNS * */ +/* * * */ +/* * 1.0.10 - 01/17/2005 - G.R-P. * */ +/* * - added typecast to appease the compiler * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#include /* needed for offsetof() */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_memory.h" +#include "libmng_objects.h" +#include "libmng_chunks.h" +#include "libmng_chunk_descr.h" +#include "libmng_object_prc.h" +#include "libmng_chunk_prc.h" +#include "libmng_chunk_io.h" +#include "libmng_display.h" + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +#include "libmng_pixels.h" +#include "libmng_filter.h" +#endif + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_CHUNKREADER +#if defined(MNG_INCLUDE_READ_PROCS) || defined(MNG_INCLUDE_WRITE_PROCS) + +/* ************************************************************************** */ +/* ************************************************************************** */ +/* PNG chunks */ + +MNG_LOCAL mng_field_descriptor mng_fields_ihdr [] = + { + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_NOHIGHBIT, + 1, 0, 4, 4, + offsetof(mng_ihdr, iWidth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_NOHIGHBIT, + 1, 0, 4, 4, + offsetof(mng_ihdr, iHeight), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 1, 16, 1, 1, + offsetof(mng_ihdr, iBitdepth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 6, 1, 1, + offsetof(mng_ihdr, iColortype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_ihdr, iCompression), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_ihdr, iFilter), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_ihdr, iInterlace), MNG_NULL, MNG_NULL} + }; + +/* ************************************************************************** */ + +MNG_LOCAL mng_field_descriptor mng_fields_plte [] = + { + {mng_debunk_plte, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; + +/* ************************************************************************** */ + +MNG_LOCAL mng_field_descriptor mng_fields_idat [] = + { + {MNG_NULL, + MNG_NULL, + 0, 0, 0, 0, + offsetof(mng_idat, pData), MNG_NULL, offsetof(mng_idat, iDatasize)} + }; + +/* ************************************************************************** */ + +MNG_LOCAL mng_field_descriptor mng_fields_trns [] = + { + {mng_debunk_trns, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_gAMA +MNG_LOCAL mng_field_descriptor mng_fields_gama [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_gama, iGamma), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +MNG_LOCAL mng_field_descriptor mng_fields_chrm [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_chrm, iWhitepointx), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_chrm, iWhitepointy), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_chrm, iRedx), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_chrm, iRedy), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_chrm, iGreeny), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_chrm, iGreeny), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_chrm, iBluex), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_chrm, iBluey), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sRGB +MNG_LOCAL mng_field_descriptor mng_fields_srgb [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 4, 1, 1, + offsetof(mng_srgb, iRenderingintent), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +MNG_LOCAL mng_field_descriptor mng_fields_iccp [] = + { + {MNG_NULL, + MNG_FIELD_TERMINATOR, + 0, 0, 1, 79, + offsetof(mng_iccp, zName), MNG_NULL, offsetof(mng_iccp, iNamesize)}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_iccp, iCompression), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_DEFLATED, + 0, 0, 0, 0, + offsetof(mng_iccp, pProfile), MNG_NULL, offsetof(mng_iccp, iProfilesize)} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +MNG_LOCAL mng_field_descriptor mng_fields_text [] = + { + {MNG_NULL, + MNG_FIELD_TERMINATOR, + 0, 0, 1, 79, + offsetof(mng_text, zKeyword), MNG_NULL, offsetof(mng_text, iKeywordsize)}, + {MNG_NULL, + MNG_NULL, + 0, 0, 0, 0, + offsetof(mng_text, zText), MNG_NULL, offsetof(mng_text, iTextsize)} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +MNG_LOCAL mng_field_descriptor mng_fields_ztxt [] = + { + {MNG_NULL, + MNG_FIELD_TERMINATOR, + 0, 0, 1, 79, + offsetof(mng_ztxt, zKeyword), MNG_NULL, offsetof(mng_ztxt, iKeywordsize)}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_ztxt, iCompression), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_DEFLATED, + 0, 0, 0, 0, + offsetof(mng_ztxt, zText), MNG_NULL, offsetof(mng_ztxt, iTextsize)} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +MNG_LOCAL mng_field_descriptor mng_fields_itxt [] = + { + {MNG_NULL, + MNG_FIELD_TERMINATOR, + 0, 0, 1, 79, + offsetof(mng_itxt, zKeyword), MNG_NULL, offsetof(mng_itxt, iKeywordsize)}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_itxt, iCompressionflag), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_itxt, iCompressionmethod), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_TERMINATOR, + 0, 0, 0, 0, + offsetof(mng_itxt, zLanguage), MNG_NULL, offsetof(mng_itxt, iLanguagesize)}, + {MNG_NULL, + MNG_FIELD_TERMINATOR, + 0, 0, 0, 0, + offsetof(mng_itxt, zTranslation), MNG_NULL, offsetof(mng_itxt, iTranslationsize)}, + {mng_deflate_itxt, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +MNG_LOCAL mng_field_descriptor mng_fields_bkgd [] = + { + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_PUTIMGTYPE, + 0, 0, 0, 0, + offsetof(mng_bkgd, iType), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE3, + 0, 0xFF, 1, 1, + offsetof(mng_bkgd, iIndex), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE0 | MNG_FIELD_IFIMGTYPE4, + 0, 0xFFFF, 2, 2, + offsetof(mng_bkgd, iGray), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE6, + 0, 0xFFFF, 2, 2, + offsetof(mng_bkgd, iRed), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE6, + 0, 0xFFFF, 2, 2, + offsetof(mng_bkgd, iGreen), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE6, + 0, 0xFFFF, 2, 2, + offsetof(mng_bkgd, iBlue), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYs +MNG_LOCAL mng_field_descriptor mng_fields_phys [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_phys, iSizex), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_phys, iSizey), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_phys, iUnit), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sBIT +MNG_LOCAL mng_field_descriptor mng_fields_sbit [] = + { + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_PUTIMGTYPE, + 0, 0, 0, 0, + offsetof(mng_sbit, iType), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPES, + 0, 0xFF, 1, 1, + offsetof(mng_sbit, aBits[0]), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE3 | MNG_FIELD_IFIMGTYPE4 | MNG_FIELD_IFIMGTYPE6, + 0, 0xFF, 1, 1, + offsetof(mng_sbit, aBits[1]), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE3 | MNG_FIELD_IFIMGTYPE6, + 0, 0xFF, 1, 1, + offsetof(mng_sbit, aBits[2]), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE6, + 0, 0xFF, 1, 1, + offsetof(mng_sbit, aBits[3]), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +MNG_LOCAL mng_field_descriptor mng_fields_splt [] = + { + {MNG_NULL, + MNG_NULL, + 0, 0, 1, 79, + offsetof(mng_splt, zName), MNG_NULL, offsetof(mng_splt, iNamesize)}, + {MNG_NULL, + MNG_FIELD_INT, + 8, 16, 1, 1, + offsetof(mng_splt, iSampledepth), MNG_NULL, MNG_NULL}, + {mng_splt_entries, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_hIST +MNG_LOCAL mng_field_descriptor mng_fields_hist [] = + { + {mng_hist_entries, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tIME +MNG_LOCAL mng_field_descriptor mng_fields_time [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_time, iYear), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 1, 12, 1, 1, + offsetof(mng_time, iMonth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 1, 31, 1, 1, + offsetof(mng_time, iDay), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 24, 1, 1, + offsetof(mng_time, iHour), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 60, 1, 1, + offsetof(mng_time, iMinute), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 60, 1, 1, + offsetof(mng_time, iSecond), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ +/* JNG chunks */ + +#ifdef MNG_INCLUDE_JNG +MNG_LOCAL mng_field_descriptor mng_fields_jhdr [] = + { + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_NOHIGHBIT, + 1, 0, 4, 4, + offsetof(mng_jhdr, iWidth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_NOHIGHBIT, + 1, 0, 4, 4, + offsetof(mng_jhdr, iHeight), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 8, 16, 1, 1, + offsetof(mng_jhdr, iColortype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 8, 20, 1, 1, + offsetof(mng_jhdr, iImagesampledepth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 8, 8, 1, 1, + offsetof(mng_jhdr, iImagecompression), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 8, 1, 1, + offsetof(mng_jhdr, iImageinterlace), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 16, 1, 1, + offsetof(mng_jhdr, iAlphasampledepth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 8, 1, 1, + offsetof(mng_jhdr, iAlphacompression), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_jhdr, iAlphafilter), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_jhdr, iAlphainterlace), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#define mng_fields_jdaa mng_fields_idat +#define mng_fields_jdat mng_fields_idat +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ +/* MNG chunks */ + +MNG_LOCAL mng_field_descriptor mng_fields_mhdr [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_mhdr, iWidth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_mhdr, iHeight), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_mhdr, iTicks), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_mhdr, iLayercount), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_mhdr, iFramecount), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_mhdr, iPlaytime), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_mhdr, iSimplicity), MNG_NULL, MNG_NULL} + }; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +MNG_LOCAL mng_field_descriptor mng_fields_loop [] = + { + {mng_debunk_loop, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +MNG_LOCAL mng_field_descriptor mng_fields_endl [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFF, 1, 1, + offsetof(mng_endl, iLevel), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DEFI +MNG_LOCAL mng_field_descriptor mng_fields_defi [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_defi, iObjectid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 0xFF, 1, 1, + offsetof(mng_defi, iDonotshow), offsetof(mng_defi, bHasdonotshow), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 0xFF, 1, 1, + offsetof(mng_defi, iConcrete), offsetof(mng_defi, bHasconcrete), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0, 4, 4, + offsetof(mng_defi, iXlocation), offsetof(mng_defi, bHasloca), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0, 4, 4, + offsetof(mng_defi, iYlocation), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2, + 0, 0, 4, 4, + offsetof(mng_defi, iLeftcb), offsetof(mng_defi, bHasclip), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2, + 0, 0, 4, 4, + offsetof(mng_defi, iRightcb), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2, + 0, 0, 4, 4, + offsetof(mng_defi, iTopcb), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2, + 0, 0, 4, 4, + offsetof(mng_defi, iBottomcb), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BASI +MNG_LOCAL mng_field_descriptor mng_fields_basi [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_basi, iWidth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_basi, iHeight), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 1, 16, 1, 1, + offsetof(mng_basi, iBitdepth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 6, 1, 1, + offsetof(mng_basi, iColortype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_basi, iCompression), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_basi, iFilter), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_basi, iInterlace), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0xFFFF, 2, 2, + offsetof(mng_basi, iRed), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0xFFFF, 2, 2, + offsetof(mng_basi, iGreen), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0xFFFF, 2, 2, + offsetof(mng_basi, iBlue), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 0xFFFF, 2, 2, + offsetof(mng_basi, iAlpha), offsetof(mng_basi, bHasalpha), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 1, 1, 1, + offsetof(mng_basi, iViewable), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLON +MNG_LOCAL mng_field_descriptor mng_fields_clon [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_clon, iSourceid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_clon, iCloneid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 2, 1, 1, + offsetof(mng_clon, iClonetype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 1, 1, 1, + offsetof(mng_clon, iDonotshow), offsetof(mng_clon, bHasdonotshow), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 1, 1, 1, + offsetof(mng_clon, iConcrete), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 2, 1, 1, + offsetof(mng_clon, iLocationtype), offsetof(mng_clon, bHasloca), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0, 4, 4, + offsetof(mng_clon, iLocationx), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0, 4, 4, + offsetof(mng_clon, iLocationy), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +MNG_LOCAL mng_field_descriptor mng_fields_past [] = + { + {mng_debunk_past, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +MNG_LOCAL mng_field_descriptor mng_fields_disc [] = + { + {mng_disc_entries, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BACK +MNG_LOCAL mng_field_descriptor mng_fields_back [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_back, iRed), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_back, iGreen), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_back, iBlue), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 3, 1, 1, + offsetof(mng_back, iMandatory), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 0xFFFF, 2, 2, + offsetof(mng_back, iImageid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 1, 1, 1, + offsetof(mng_back, iTile), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +MNG_LOCAL mng_field_descriptor mng_fields_fram [] = + { + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 4, 1, 1, + offsetof(mng_fram, iMode), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_TERMINATOR | MNG_FIELD_OPTIONAL, + 0, 0, 1, 79, + offsetof(mng_fram, zName), MNG_NULL, offsetof(mng_fram, iNamesize)}, + {mng_fram_remainder, + MNG_FIELD_OPTIONAL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MOVE +MNG_LOCAL mng_field_descriptor mng_fields_move [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_move, iFirstid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_move, iLastid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_move, iMovetype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_move, iMovex), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_move, iMovey), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLIP +MNG_LOCAL mng_field_descriptor mng_fields_clip [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_clip, iFirstid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_clip, iLastid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_clip, iCliptype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_clip, iClipl), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_clip, iClipr), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_clip, iClipt), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_clip, iClipb), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SHOW +MNG_LOCAL mng_field_descriptor mng_fields_show [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 1, 0xFFFF, 2, 2, + offsetof(mng_show, iFirstid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 1, 0xFFFF, 2, 2, + offsetof(mng_show, iLastid), offsetof(mng_show, bHaslastid), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL, + 0, 7, 1, 1, + offsetof(mng_show, iMode), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_TERM +MNG_LOCAL mng_field_descriptor mng_fields_term [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 3, 1, 1, + offsetof(mng_term, iTermaction), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 2, 1, 1, + offsetof(mng_term, iIteraction), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0, 4, 4, + offsetof(mng_term, iDelay), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0, 4, 4, + offsetof(mng_term, iItermax), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +MNG_LOCAL mng_field_descriptor mng_fields_save [] = + { + {mng_save_entries, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +MNG_LOCAL mng_field_descriptor mng_fields_seek [] = + { + {MNG_NULL, + MNG_NULL, + 0, 0, 1, 79, + offsetof(mng_seek, zName), MNG_NULL, offsetof(mng_seek, iNamesize)} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +MNG_LOCAL mng_field_descriptor mng_fields_expi [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_expi, iSnapshotid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_NULL, + 0, 0, 1, 79, + offsetof(mng_expi, zName), MNG_NULL, offsetof(mng_expi, iNamesize)} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_fPRI +MNG_LOCAL mng_field_descriptor mng_fields_fpri [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_fpri, iDeltatype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFF, 1, 1, + offsetof(mng_fpri, iPriority), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +MNG_LOCAL mng_field_descriptor mng_fields_need [] = + { + {MNG_NULL, + MNG_NULL, + 0, 0, 1, 0, + offsetof(mng_need, zKeywords), MNG_NULL, offsetof(mng_need, iKeywordssize)} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYg +#define mng_fields_phyg mng_fields_phys +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_field_descriptor mng_fields_dhdr [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_dhdr, iObjectid), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 2, 1, 1, + offsetof(mng_dhdr, iImagetype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 7, 1, 1, + offsetof(mng_dhdr, iDeltatype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0, 4, 4, + offsetof(mng_dhdr, iBlockwidth), offsetof(mng_dhdr, bHasblocksize), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1, + 0, 0, 4, 4, + offsetof(mng_dhdr, iBlockheight), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2, + 0, 0, 4, 4, + offsetof(mng_dhdr, iBlockx), offsetof(mng_dhdr, bHasblockloc), MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2, + 0, 0, 4, 4, + offsetof(mng_dhdr, iBlocky), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_field_descriptor mng_fields_prom [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 14, 1, 1, + offsetof(mng_prom, iColortype), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 16, 1, 1, + offsetof(mng_prom, iSampledepth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_prom, iFilltype), MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_field_descriptor mng_fields_pplt [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 5, 1, 1, + offsetof(mng_pplt, iDeltatype), MNG_NULL, MNG_NULL}, + {mng_pplt_entries, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_field_descriptor mng_fields_drop [] = + { + {mng_drop_entries, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +MNG_LOCAL mng_field_descriptor mng_fields_dbyk [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_dbyk, iChunkname), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_dbyk, iPolarity), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_NULL, + 0, 0, 1, 0, + offsetof(mng_dbyk, zKeywords), MNG_NULL, offsetof(mng_dbyk, iKeywordssize)} + }; +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +MNG_LOCAL mng_field_descriptor mng_fields_ordr [] = + { + {mng_drop_entries, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +MNG_LOCAL mng_field_descriptor mng_fields_magn [] = + { + {mng_debunk_magn, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_LOCAL mng_field_descriptor mng_fields_mpng [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 1, 0, 4, 4, + offsetof(mng_mpng, iFramewidth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 1, 0, 4, 4, + offsetof(mng_mpng, iFrameheight), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0xFFFF, 2, 2, + offsetof(mng_mpng, iNumplays), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 1, 0xFFFF, 2, 2, + offsetof(mng_mpng, iTickspersec), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 1, 1, + offsetof(mng_mpng, iCompressionmethod), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_DEFLATED, + 0, 0, 1, 0, + offsetof(mng_mpng, pFrames), MNG_NULL, offsetof(mng_mpng, iFramessize)} + }; +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +MNG_LOCAL mng_field_descriptor mng_fields_ahdr [] = + { + {MNG_NULL, + MNG_FIELD_INT, + 1, 0, 4, 4, + offsetof(mng_ahdr, iNumframes), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_ahdr, iTickspersec), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 0, 4, 4, + offsetof(mng_ahdr, iNumplays), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 1, 0, 4, 4, + offsetof(mng_ahdr, iTilewidth), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 1, 0, 4, 4, + offsetof(mng_ahdr, iTileheight), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_ahdr, iInterlace), MNG_NULL, MNG_NULL}, + {MNG_NULL, + MNG_FIELD_INT, + 0, 1, 1, 1, + offsetof(mng_ahdr, iStillused), MNG_NULL, MNG_NULL} + }; + +MNG_LOCAL mng_field_descriptor mng_fields_adat [] = + { + {mng_adat_tiles, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +MNG_LOCAL mng_field_descriptor mng_fields_evnt [] = + { + {mng_evnt_entries, + MNG_NULL, + 0, 0, 0, 0, + MNG_NULL, MNG_NULL, MNG_NULL} + }; +#endif + +/* ************************************************************************** */ + +MNG_LOCAL mng_field_descriptor mng_fields_unknown [] = + { + {MNG_NULL, + MNG_NULL, + 0, 0, 1, 0, + offsetof(mng_unknown_chunk, pData), MNG_NULL, offsetof(mng_unknown_chunk, iDatasize)} + }; + +/* ************************************************************************** */ +/* ************************************************************************** */ +/* PNG chunks */ + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ihdr = + {mng_it_png, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_ihdr, + mng_fields_ihdr, (sizeof(mng_fields_ihdr) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL, + MNG_NULL, + MNG_DESCR_NOIHDR | MNG_DESCR_NOJHDR | MNG_DESCR_NOBASI | MNG_DESCR_NOIDAT | MNG_DESCR_NOPLTE}; + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_plte = + {mng_it_png, mng_create_none, 0, offsetof(mng_plte, bEmpty), + MNG_NULL, MNG_NULL, mng_special_plte, + mng_fields_plte, (sizeof(mng_fields_plte) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED, + MNG_DESCR_GenHDR, + MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_idat = + {mng_it_png, mng_create_none, 0, offsetof(mng_idat, bEmpty), + MNG_NULL, MNG_NULL, mng_special_idat, + mng_fields_idat, (sizeof(mng_fields_idat) / sizeof(mng_field_descriptor)), + MNG_DESCR_EMPTYEMBED, + MNG_DESCR_GenHDR, + MNG_DESCR_NOJSEP}; + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_iend = + {mng_it_png, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_iend, + MNG_NULL, 0, + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED, + MNG_DESCR_GenHDR, + MNG_NULL}; + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_trns = + {mng_it_png, mng_create_none, 0, offsetof(mng_trns, bEmpty), + MNG_NULL, MNG_NULL, mng_special_trns, + mng_fields_trns, (sizeof(mng_fields_trns) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED, + MNG_DESCR_GenHDR, + MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; + +#ifndef MNG_SKIPCHUNK_gAMA +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_gama = + {mng_it_png, mng_create_none, 0, offsetof(mng_gama, bEmpty), + MNG_NULL, MNG_NULL, mng_special_gama, + mng_fields_gama, (sizeof(mng_fields_gama) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_GenHDR, + MNG_DESCR_NOPLTE | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_cHRM +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_chrm = + {mng_it_png, mng_create_none, 0, offsetof(mng_chrm, bEmpty), + MNG_NULL, MNG_NULL, mng_special_chrm, + mng_fields_chrm, (sizeof(mng_fields_chrm) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_GenHDR, + MNG_DESCR_NOPLTE | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_sRGB +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_srgb = + {mng_it_png, mng_create_none, 0, offsetof(mng_srgb, bEmpty), + MNG_NULL, MNG_NULL, mng_special_srgb, + mng_fields_srgb, (sizeof(mng_fields_srgb) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_GenHDR, + MNG_DESCR_NOPLTE | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_iCCP +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_iccp = + {mng_it_png, mng_create_none, 0, offsetof(mng_iccp, bEmpty), + MNG_NULL, MNG_NULL, mng_special_iccp, + mng_fields_iccp, (sizeof(mng_fields_iccp) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_GenHDR, + MNG_DESCR_NOPLTE | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_tEXt +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_text = + {mng_it_png, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_text, + mng_fields_text, (sizeof(mng_fields_text) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL, + MNG_DESCR_GenHDR, + MNG_NULL}; +#endif + +#ifndef MNG_SKIPCHUNK_zTXt +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ztxt = + {mng_it_png, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_ztxt, + mng_fields_ztxt, (sizeof(mng_fields_ztxt) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL, + MNG_DESCR_GenHDR, + MNG_NULL}; +#endif + +#ifndef MNG_SKIPCHUNK_iTXt +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_itxt = + {mng_it_png, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_itxt, + mng_fields_itxt, (sizeof(mng_fields_itxt) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL, + MNG_DESCR_GenHDR, + MNG_NULL}; +#endif + +#ifndef MNG_SKIPCHUNK_bKGD +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_bkgd = + {mng_it_png, mng_create_none, 0, offsetof(mng_bkgd, bEmpty), + MNG_NULL, MNG_NULL, mng_special_bkgd, + mng_fields_bkgd, (sizeof(mng_fields_bkgd) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_GenHDR, + MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_pHYs +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_phys = + {mng_it_png, mng_create_none, 0, offsetof(mng_phys, bEmpty), + MNG_NULL, MNG_NULL, mng_special_phys, + mng_fields_phys, (sizeof(mng_fields_phys) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_GenHDR, + MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_sBIT +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_sbit = + {mng_it_png, mng_create_none, 0, offsetof(mng_sbit, bEmpty), + MNG_NULL, MNG_NULL, mng_special_sbit, + mng_fields_sbit, (sizeof(mng_fields_sbit) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_GenHDR, + MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_sPLT +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_splt = + {mng_it_png, mng_create_none, 0, offsetof(mng_splt, bEmpty), + MNG_NULL, MNG_NULL, mng_special_splt, + mng_fields_splt, (sizeof(mng_fields_splt) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_GenHDR, + MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_hIST +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_hist = + {mng_it_png, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_hist, + mng_fields_hist, (sizeof(mng_fields_hist) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_GenHDR | MNG_DESCR_PLTE, + MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA}; +#endif + +#ifndef MNG_SKIPCHUNK_tIME +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_time = + {mng_it_png, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_time, + mng_fields_time, (sizeof(mng_fields_time) / sizeof(mng_field_descriptor)), + MNG_DESCR_GLOBAL, + MNG_DESCR_GenHDR, + MNG_NULL}; +#endif + +/* ************************************************************************** */ +/* JNG chunks */ + +#ifdef MNG_INCLUDE_JNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_jhdr = + {mng_it_jng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_jhdr, + mng_fields_jhdr, (sizeof(mng_fields_jhdr) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_NULL, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifdef MNG_INCLUDE_JNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_jdaa = + {mng_it_jng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_jdaa, + mng_fields_jdaa, (sizeof(mng_fields_jdaa) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_JngHDR, + MNG_DESCR_NOJSEP}; +#endif + +#ifdef MNG_INCLUDE_JNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_jdat = + {mng_it_jng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_jdat, + mng_fields_jdat, (sizeof(mng_fields_jdat) / sizeof(mng_field_descriptor)), + MNG_DESCR_EMPTYEMBED, + MNG_DESCR_JngHDR, + MNG_NULL}; +#endif + +#ifdef MNG_INCLUDE_JNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_jsep = + {mng_it_jng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_jsep, + MNG_NULL, 0, + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED, + MNG_DESCR_JngHDR, + MNG_DESCR_NOJSEP}; +#endif + +/* ************************************************************************** */ +/* MNG chunks */ + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_mhdr = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_mhdr, + mng_fields_mhdr, (sizeof(mng_fields_mhdr) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_NULL, + MNG_DESCR_NOMHDR | MNG_DESCR_NOIHDR | MNG_DESCR_NOJHDR}; + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_mend = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_mend, + MNG_NULL, 0, + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_MHDR, + MNG_NULL}; + +#ifndef MNG_SKIPCHUNK_LOOP +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_loop = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_loop, + mng_fields_loop, (sizeof(mng_fields_loop) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_endl = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_endl, + mng_fields_endl, (sizeof(mng_fields_endl) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_DEFI +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_defi = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_defi, + mng_fields_defi, (sizeof(mng_fields_defi) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_BASI +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_basi = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_basi, + mng_fields_basi, (sizeof(mng_fields_basi) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_CLON +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_clon = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_clon, + mng_fields_clon, (sizeof(mng_fields_clon) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_PAST +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_past = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_past, + mng_fields_past, (sizeof(mng_fields_past) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_DISC +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_disc = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_disc, + mng_fields_disc, (sizeof(mng_fields_disc) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_BACK +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_back = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_back, + mng_fields_back, (sizeof(mng_fields_back) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_FRAM +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_fram = + {mng_it_mng, mng_create_none, 0, offsetof(mng_fram, bEmpty), + MNG_NULL, MNG_NULL, mng_special_fram, + mng_fields_fram, (sizeof(mng_fields_fram) / sizeof(mng_field_descriptor)), + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_MOVE +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_move = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_move, + mng_fields_move, (sizeof(mng_fields_move) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_CLIP +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_clip = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_clip, + mng_fields_clip, (sizeof(mng_fields_clip) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_SHOW +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_show = + {mng_it_mng, mng_create_none, 0, offsetof(mng_show, bEmpty), + MNG_NULL, MNG_NULL, mng_special_show, + mng_fields_show, (sizeof(mng_fields_show) / sizeof(mng_field_descriptor)), + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_TERM +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_term = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_term, + mng_fields_term, (sizeof(mng_fields_term) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR | MNG_DESCR_NOTERM | MNG_DESCR_NOLOOP}; +#endif + +#ifndef MNG_SKIPCHUNK_SAVE +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_save = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_save, + mng_fields_save, (sizeof(mng_fields_save) / sizeof(mng_field_descriptor)), + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_MHDR, + MNG_DESCR_NOSAVE | MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_SEEK +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_seek = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_seek, + mng_fields_seek, (sizeof(mng_fields_seek) / sizeof(mng_field_descriptor)), + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL, + MNG_DESCR_MHDR | MNG_DESCR_SAVE, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_eXPI +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_expi = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_expi, + mng_fields_expi, (sizeof(mng_fields_expi) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_fPRI +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_fpri = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_fpri, + mng_fields_fpri, (sizeof(mng_fields_fpri) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_nEED +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_need = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_need, + mng_fields_need, (sizeof(mng_fields_need) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_pHYg +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_phyg = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_phyg, + mng_fields_phyg, (sizeof(mng_fields_phyg) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_dhdr = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_dhdr, + mng_fields_dhdr, (sizeof(mng_fields_dhdr) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_prom = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_prom, + mng_fields_prom, (sizeof(mng_fields_prom) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR | MNG_DESCR_DHDR, + MNG_NULL}; +#endif + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ipng = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_ipng, + MNG_NULL, 0, + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED, + MNG_DESCR_MHDR | MNG_DESCR_DHDR, + MNG_NULL}; +#endif + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_pplt = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_pplt, + mng_fields_pplt, (sizeof(mng_fields_pplt) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR | MNG_DESCR_DHDR, + MNG_NULL}; +#endif + +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ijng = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_ijng, + MNG_NULL, 0, + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED, + MNG_DESCR_MHDR | MNG_DESCR_DHDR, + MNG_NULL}; +#endif +#endif + +#ifndef MNG_NO_DELTA_PNG +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_drop = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_drop, + mng_fields_drop, (sizeof(mng_fields_drop) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR | MNG_DESCR_DHDR, + MNG_NULL}; +#endif + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_dbyk = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_dbyk, + mng_fields_dbyk, (sizeof(mng_fields_dbyk) / sizeof(mng_field_descriptor)), + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED, + MNG_DESCR_MHDR | MNG_DESCR_DHDR, + MNG_NULL}; +#endif +#endif + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ordr = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_ordr, + mng_fields_ordr, (sizeof(mng_fields_ordr) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR | MNG_DESCR_DHDR, + MNG_NULL}; +#endif +#endif + +#ifndef MNG_SKIPCHUNK_MAGN +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_magn = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_magn, + mng_fields_magn, (sizeof(mng_fields_magn) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR}; +#endif + +#ifndef MNG_SKIPCHUNK_evNT +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_evnt = + {mng_it_mng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_evnt, + mng_fields_evnt, (sizeof(mng_fields_evnt) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_MHDR, + MNG_DESCR_NOSAVE}; +#endif + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_mpng = + {mng_it_mpng, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_mpng, + mng_fields_mpng, (sizeof(mng_fields_mpng) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_NULL, + MNG_DESCR_NOMHDR | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT}; +#endif + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ahdr = + {mng_it_ang, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_ahdr, + mng_fields_ahdr, (sizeof(mng_fields_ahdr) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_IHDR, + MNG_DESCR_NOMHDR | MNG_DESCR_NOJHDR | MNG_DESCR_NOIDAT}; + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_adat = + {mng_it_ang, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_adat, + mng_fields_adat, (sizeof(mng_fields_adat) / sizeof(mng_field_descriptor)), + MNG_NULL, + MNG_DESCR_IHDR, + MNG_DESCR_NOMHDR | MNG_DESCR_NOJHDR}; +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ +/* the good ol' unknown babe */ + +MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_unknown = + {mng_it_png, mng_create_none, 0, 0, + MNG_NULL, MNG_NULL, mng_special_unknown, + mng_fields_unknown, (sizeof(mng_fields_unknown) / sizeof(mng_field_descriptor)), + MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED, + MNG_NULL, + MNG_NULL}; + +/* ************************************************************************** */ +/* ************************************************************************** */ + +MNG_LOCAL mng_chunk_header mng_chunk_unknown = + {MNG_UINT_HUH, mng_init_general, mng_free_unknown, + mng_read_general, mng_write_unknown, mng_assign_unknown, + 0, 0, sizeof(mng_unknown_chunk), &mng_chunk_descr_unknown}; + +/* ************************************************************************** */ + + /* the table-idea & binary search code was adapted from + libpng 1.1.0 (pngread.c) */ + /* NOTE1: the table must remain sorted by chunkname, otherwise the binary + search will break !!! (ps. watch upper-/lower-case chunknames !!) */ + /* NOTE2: the layout must remain equal to the header part of all the + chunk-structures (yes, that means even the pNext and pPrev fields; + it's wasting a bit of space, but hey, the code is a lot easier) */ + +MNG_LOCAL mng_chunk_header mng_chunk_table [] = + { +#ifndef MNG_SKIPCHUNK_BACK + {MNG_UINT_BACK, mng_init_general, mng_free_general, mng_read_general, mng_write_back, mng_assign_general, 0, 0, sizeof(mng_back), &mng_chunk_descr_back}, +#endif +#ifndef MNG_SKIPCHUNK_BASI + {MNG_UINT_BASI, mng_init_general, mng_free_general, mng_read_general, mng_write_basi, mng_assign_general, 0, 0, sizeof(mng_basi), &mng_chunk_descr_basi}, +#endif +#ifndef MNG_SKIPCHUNK_CLIP + {MNG_UINT_CLIP, mng_init_general, mng_free_general, mng_read_general, mng_write_clip, mng_assign_general, 0, 0, sizeof(mng_clip), &mng_chunk_descr_clip}, +#endif +#ifndef MNG_SKIPCHUNK_CLON + {MNG_UINT_CLON, mng_init_general, mng_free_general, mng_read_general, mng_write_clon, mng_assign_general, 0, 0, sizeof(mng_clon), &mng_chunk_descr_clon}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK + {MNG_UINT_DBYK, mng_init_general, mng_free_dbyk, mng_read_general, mng_write_dbyk, mng_assign_dbyk, 0, 0, sizeof(mng_dbyk), &mng_chunk_descr_dbyk}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_DEFI + {MNG_UINT_DEFI, mng_init_general, mng_free_general, mng_read_general, mng_write_defi, mng_assign_general, 0, 0, sizeof(mng_defi), &mng_chunk_descr_defi}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_UINT_DHDR, mng_init_general, mng_free_general, mng_read_general, mng_write_dhdr, mng_assign_general, 0, 0, sizeof(mng_dhdr), &mng_chunk_descr_dhdr}, +#endif +#ifndef MNG_SKIPCHUNK_DISC + {MNG_UINT_DISC, mng_init_general, mng_free_disc, mng_read_general, mng_write_disc, mng_assign_disc, 0, 0, sizeof(mng_disc), &mng_chunk_descr_disc}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DROP + {MNG_UINT_DROP, mng_init_general, mng_free_drop, mng_read_general, mng_write_drop, mng_assign_drop, 0, 0, sizeof(mng_drop), &mng_chunk_descr_drop}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_LOOP + {MNG_UINT_ENDL, mng_init_general, mng_free_general, mng_read_general, mng_write_endl, mng_assign_general, 0, 0, sizeof(mng_endl), &mng_chunk_descr_endl}, +#endif +#ifndef MNG_SKIPCHUNK_FRAM + {MNG_UINT_FRAM, mng_init_general, mng_free_fram, mng_read_general, mng_write_fram, mng_assign_fram, 0, 0, sizeof(mng_fram), &mng_chunk_descr_fram}, +#endif + {MNG_UINT_IDAT, mng_init_general, mng_free_idat, mng_read_general, mng_write_idat, mng_assign_idat, 0, 0, sizeof(mng_idat), &mng_chunk_descr_idat}, /* 12-th element! */ + {MNG_UINT_IEND, mng_init_general, mng_free_general, mng_read_general, mng_write_iend, mng_assign_general, 0, 0, sizeof(mng_iend), &mng_chunk_descr_iend}, + {MNG_UINT_IHDR, mng_init_general, mng_free_general, mng_read_general, mng_write_ihdr, mng_assign_general, 0, 0, sizeof(mng_ihdr), &mng_chunk_descr_ihdr}, +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG + {MNG_UINT_IJNG, mng_init_general, mng_free_general, mng_read_general, mng_write_ijng, mng_assign_general, 0, 0, sizeof(mng_ijng), &mng_chunk_descr_ijng}, +#endif + {MNG_UINT_IPNG, mng_init_general, mng_free_general, mng_read_general, mng_write_ipng, mng_assign_general, 0, 0, sizeof(mng_ipng), &mng_chunk_descr_ipng}, +#endif +#ifdef MNG_INCLUDE_JNG + {MNG_UINT_JDAA, mng_init_general, mng_free_jdaa, mng_read_general, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa), &mng_chunk_descr_jdaa}, + {MNG_UINT_JDAT, mng_init_general, mng_free_jdat, mng_read_general, mng_write_jdat, mng_assign_jdat, 0, 0, sizeof(mng_jdat), &mng_chunk_descr_jdat}, + {MNG_UINT_JHDR, mng_init_general, mng_free_general, mng_read_general, mng_write_jhdr, mng_assign_general, 0, 0, sizeof(mng_jhdr), &mng_chunk_descr_jhdr}, + {MNG_UINT_JSEP, mng_init_general, mng_free_general, mng_read_general, mng_write_jsep, mng_assign_general, 0, 0, sizeof(mng_jsep), &mng_chunk_descr_jsep}, + {MNG_UINT_JdAA, mng_init_general, mng_free_jdaa, mng_read_general, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa), &mng_chunk_descr_jdaa}, +#endif +#ifndef MNG_SKIPCHUNK_LOOP + {MNG_UINT_LOOP, mng_init_general, mng_free_loop, mng_read_general, mng_write_loop, mng_assign_loop, 0, 0, sizeof(mng_loop), &mng_chunk_descr_loop}, +#endif +#ifndef MNG_SKIPCHUNK_MAGN + {MNG_UINT_MAGN, mng_init_general, mng_free_general, mng_read_general, mng_write_magn, mng_assign_general, 0, 0, sizeof(mng_magn), &mng_chunk_descr_magn}, +#endif + {MNG_UINT_MEND, mng_init_general, mng_free_general, mng_read_general, mng_write_mend, mng_assign_general, 0, 0, sizeof(mng_mend), &mng_chunk_descr_mend}, + {MNG_UINT_MHDR, mng_init_general, mng_free_general, mng_read_general, mng_write_mhdr, mng_assign_general, 0, 0, sizeof(mng_mhdr), &mng_chunk_descr_mhdr}, +#ifndef MNG_SKIPCHUNK_MOVE + {MNG_UINT_MOVE, mng_init_general, mng_free_general, mng_read_general, mng_write_move, mng_assign_general, 0, 0, sizeof(mng_move), &mng_chunk_descr_move}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR + {MNG_UINT_ORDR, mng_init_general, mng_free_ordr, mng_read_general, mng_write_ordr, mng_assign_ordr, 0, 0, sizeof(mng_ordr), &mng_chunk_descr_ordr}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_PAST + {MNG_UINT_PAST, mng_init_general, mng_free_past, mng_read_general, mng_write_past, mng_assign_past, 0, 0, sizeof(mng_past), &mng_chunk_descr_past}, +#endif + {MNG_UINT_PLTE, mng_init_general, mng_free_general, mng_read_general, mng_write_plte, mng_assign_general, 0, 0, sizeof(mng_plte), &mng_chunk_descr_plte}, +#ifndef MNG_NO_DELTA_PNG + {MNG_UINT_PPLT, mng_init_general, mng_free_general, mng_read_general, mng_write_pplt, mng_assign_general, 0, 0, sizeof(mng_pplt), &mng_chunk_descr_pplt}, + {MNG_UINT_PROM, mng_init_general, mng_free_general, mng_read_general, mng_write_prom, mng_assign_general, 0, 0, sizeof(mng_prom), &mng_chunk_descr_prom}, +#endif +#ifndef MNG_SKIPCHUNK_SAVE + {MNG_UINT_SAVE, mng_init_general, mng_free_save, mng_read_general, mng_write_save, mng_assign_save, 0, 0, sizeof(mng_save), &mng_chunk_descr_save}, +#endif +#ifndef MNG_SKIPCHUNK_SEEK + {MNG_UINT_SEEK, mng_init_general, mng_free_seek, mng_read_general, mng_write_seek, mng_assign_seek, 0, 0, sizeof(mng_seek), &mng_chunk_descr_seek}, +#endif +#ifndef MNG_SKIPCHUNK_SHOW + {MNG_UINT_SHOW, mng_init_general, mng_free_general, mng_read_general, mng_write_show, mng_assign_general, 0, 0, sizeof(mng_show), &mng_chunk_descr_show}, +#endif +#ifndef MNG_SKIPCHUNK_TERM + {MNG_UINT_TERM, mng_init_general, mng_free_general, mng_read_general, mng_write_term, mng_assign_general, 0, 0, sizeof(mng_term), &mng_chunk_descr_term}, +#endif +#ifdef MNG_INCLUDE_ANG_PROPOSAL + {MNG_UINT_adAT, mng_init_general, mng_free_adat, mng_read_general, mng_write_adat, mng_assign_adat, 0, 0, sizeof(mng_adat), &mng_chunk_descr_adat}, + {MNG_UINT_ahDR, mng_init_general, mng_free_general, mng_read_general, mng_write_ahdr, mng_assign_ahdr, 0, 0, sizeof(mng_ahdr), &mng_chunk_descr_ahdr}, +#endif +#ifndef MNG_SKIPCHUNK_bKGD + {MNG_UINT_bKGD, mng_init_general, mng_free_general, mng_read_general, mng_write_bkgd, mng_assign_general, 0, 0, sizeof(mng_bkgd), &mng_chunk_descr_bkgd}, +#endif +#ifndef MNG_SKIPCHUNK_cHRM + {MNG_UINT_cHRM, mng_init_general, mng_free_general, mng_read_general, mng_write_chrm, mng_assign_general, 0, 0, sizeof(mng_chrm), &mng_chunk_descr_chrm}, +#endif +#ifndef MNG_SKIPCHUNK_eXPI + {MNG_UINT_eXPI, mng_init_general, mng_free_expi, mng_read_general, mng_write_expi, mng_assign_expi, 0, 0, sizeof(mng_expi), &mng_chunk_descr_expi}, +#endif +#ifndef MNG_SKIPCHUNK_evNT + {MNG_UINT_evNT, mng_init_general, mng_free_evnt, mng_read_general, mng_write_evnt, mng_assign_evnt, 0, 0, sizeof(mng_evnt), &mng_chunk_descr_evnt}, +#endif +#ifndef MNG_SKIPCHUNK_fPRI + {MNG_UINT_fPRI, mng_init_general, mng_free_general, mng_read_general, mng_write_fpri, mng_assign_general, 0, 0, sizeof(mng_fpri), &mng_chunk_descr_fpri}, +#endif +#ifndef MNG_SKIPCHUNK_gAMA + {MNG_UINT_gAMA, mng_init_general, mng_free_general, mng_read_general, mng_write_gama, mng_assign_general, 0, 0, sizeof(mng_gama), &mng_chunk_descr_gama}, +#endif +#ifndef MNG_SKIPCHUNK_hIST + {MNG_UINT_hIST, mng_init_general, mng_free_general, mng_read_general, mng_write_hist, mng_assign_general, 0, 0, sizeof(mng_hist), &mng_chunk_descr_hist}, +#endif +#ifndef MNG_SKIPCHUNK_iCCP + {MNG_UINT_iCCP, mng_init_general, mng_free_iccp, mng_read_general, mng_write_iccp, mng_assign_iccp, 0, 0, sizeof(mng_iccp), &mng_chunk_descr_iccp}, +#endif +#ifndef MNG_SKIPCHUNK_iTXt + {MNG_UINT_iTXt, mng_init_general, mng_free_itxt, mng_read_general, mng_write_itxt, mng_assign_itxt, 0, 0, sizeof(mng_itxt), &mng_chunk_descr_itxt}, +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_UINT_mpNG, mng_init_general, mng_free_mpng, mng_read_general, mng_write_mpng, mng_assign_mpng, 0, 0, sizeof(mng_mpng), &mng_chunk_descr_mpng}, +#endif +#ifndef MNG_SKIPCHUNK_nEED + {MNG_UINT_nEED, mng_init_general, mng_free_need, mng_read_general, mng_write_need, mng_assign_need, 0, 0, sizeof(mng_need), &mng_chunk_descr_need}, +#endif +/* TODO: {MNG_UINT_oFFs, 0, 0, 0, 0, 0, 0}, */ +/* TODO: {MNG_UINT_pCAL, 0, 0, 0, 0, 0, 0}, */ +#ifndef MNG_SKIPCHUNK_pHYg + {MNG_UINT_pHYg, mng_init_general, mng_free_general, mng_read_general, mng_write_phyg, mng_assign_general, 0, 0, sizeof(mng_phyg), &mng_chunk_descr_phyg}, +#endif +#ifndef MNG_SKIPCHUNK_pHYs + {MNG_UINT_pHYs, mng_init_general, mng_free_general, mng_read_general, mng_write_phys, mng_assign_general, 0, 0, sizeof(mng_phys), &mng_chunk_descr_phys}, +#endif +#ifndef MNG_SKIPCHUNK_sBIT + {MNG_UINT_sBIT, mng_init_general, mng_free_general, mng_read_general, mng_write_sbit, mng_assign_general, 0, 0, sizeof(mng_sbit), &mng_chunk_descr_sbit}, +#endif +/* TODO: {MNG_UINT_sCAL, 0, 0, 0, 0, 0, 0}, */ +#ifndef MNG_SKIPCHUNK_sPLT + {MNG_UINT_sPLT, mng_init_general, mng_free_splt, mng_read_general, mng_write_splt, mng_assign_splt, 0, 0, sizeof(mng_splt), &mng_chunk_descr_splt}, +#endif + {MNG_UINT_sRGB, mng_init_general, mng_free_general, mng_read_general, mng_write_srgb, mng_assign_general, 0, 0, sizeof(mng_srgb), &mng_chunk_descr_srgb}, +#ifndef MNG_SKIPCHUNK_tEXt + {MNG_UINT_tEXt, mng_init_general, mng_free_text, mng_read_general, mng_write_text, mng_assign_text, 0, 0, sizeof(mng_text), &mng_chunk_descr_text}, +#endif +#ifndef MNG_SKIPCHUNK_tIME + {MNG_UINT_tIME, mng_init_general, mng_free_general, mng_read_general, mng_write_time, mng_assign_general, 0, 0, sizeof(mng_time), &mng_chunk_descr_time}, +#endif + {MNG_UINT_tRNS, mng_init_general, mng_free_general, mng_read_general, mng_write_trns, mng_assign_general, 0, 0, sizeof(mng_trns), &mng_chunk_descr_trns}, +#ifndef MNG_SKIPCHUNK_zTXt + {MNG_UINT_zTXt, mng_init_general, mng_free_ztxt, mng_read_general, mng_write_ztxt, mng_assign_ztxt, 0, 0, sizeof(mng_ztxt), &mng_chunk_descr_ztxt}, +#endif + }; + +/* ************************************************************************** */ +/* ************************************************************************** */ + +void mng_get_chunkheader (mng_chunkid iChunkname, + mng_chunk_headerp pResult) +{ + /* binary search variables */ + mng_int32 iTop, iLower, iUpper, iMiddle; + mng_chunk_headerp pEntry; /* pointer to found entry */ + /* determine max index of table */ + iTop = (sizeof (mng_chunk_table) / sizeof (mng_chunk_table [0])) - 1; + + /* binary search; with 54 chunks, worst-case is 7 comparisons */ + iLower = 0; +#ifndef MNG_NO_DELTA_PNG + iMiddle = 11; /* start with the IDAT entry */ +#else + iMiddle = 8; +#endif + iUpper = iTop; + pEntry = 0; /* no goods yet! */ + + do /* the binary search itself */ + { + if (mng_chunk_table [iMiddle].iChunkname < iChunkname) + iLower = iMiddle + 1; + else if (mng_chunk_table [iMiddle].iChunkname > iChunkname) + iUpper = iMiddle - 1; + else + { + pEntry = &mng_chunk_table [iMiddle]; + break; + } + iMiddle = (iLower + iUpper) >> 1; + } + while (iLower <= iUpper); + + if (!pEntry) /* unknown chunk ? */ + pEntry = &mng_chunk_unknown; /* make it so! */ + + MNG_COPY (pResult, pEntry, sizeof(mng_chunk_header)); + + return; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ +/* PNG chunks */ + +MNG_C_SPECIALFUNC (mng_special_ihdr) +{ + pData->bHasIHDR = MNG_TRUE; /* indicate IHDR is present */ + /* and store interesting fields */ + if ((!pData->bHasDHDR) || (pData->iDeltatype == MNG_DELTATYPE_NOCHANGE)) + { + pData->iDatawidth = ((mng_ihdrp)pChunk)->iWidth; + pData->iDataheight = ((mng_ihdrp)pChunk)->iHeight; + } + + pData->iBitdepth = ((mng_ihdrp)pChunk)->iBitdepth; + pData->iColortype = ((mng_ihdrp)pChunk)->iColortype; + pData->iCompression = ((mng_ihdrp)pChunk)->iCompression; + pData->iFilter = ((mng_ihdrp)pChunk)->iFilter; + pData->iInterlace = ((mng_ihdrp)pChunk)->iInterlace; + +#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT) + pData->iPNGmult = 1; + pData->iPNGdepth = pData->iBitdepth; +#endif + +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iBitdepth < 8) + pData->iBitdepth = 8; +#endif + +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth > 8) + { + pData->iBitdepth = 8; + pData->iPNGmult = 2; + } +#endif + + if ((pData->iBitdepth != 8) /* parameter validity checks */ +#ifndef MNG_NO_1_2_4BIT_SUPPORT + && (pData->iBitdepth != 1) && + (pData->iBitdepth != 2) && + (pData->iBitdepth != 4) +#endif +#ifndef MNG_NO_16BIT_SUPPORT + && (pData->iBitdepth != 16) +#endif + ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ((pData->iColortype != MNG_COLORTYPE_GRAY ) && + (pData->iColortype != MNG_COLORTYPE_RGB ) && + (pData->iColortype != MNG_COLORTYPE_INDEXED) && + (pData->iColortype != MNG_COLORTYPE_GRAYA ) && + (pData->iColortype != MNG_COLORTYPE_RGBA ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8)) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (((pData->iColortype == MNG_COLORTYPE_RGB ) || + (pData->iColortype == MNG_COLORTYPE_GRAYA ) || + (pData->iColortype == MNG_COLORTYPE_RGBA ) ) && + (pData->iBitdepth < 8 ) ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (pData->iCompression != MNG_COMPRESSION_DEFLATE) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + +#if defined(FILTER192) || defined(FILTER193) + if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) && +#if defined(FILTER192) && defined(FILTER193) + (pData->iFilter != MNG_FILTER_DIFFERING) && + (pData->iFilter != MNG_FILTER_NOFILTER ) ) +#else +#ifdef FILTER192 + (pData->iFilter != MNG_FILTER_DIFFERING) ) +#else + (pData->iFilter != MNG_FILTER_NOFILTER ) ) +#endif +#endif + MNG_ERROR (pData, MNG_INVALIDFILTER); +#else + if (pData->iFilter) + MNG_ERROR (pData, MNG_INVALIDFILTER); +#endif + + if ((pData->iInterlace != MNG_INTERLACE_NONE ) && + (pData->iInterlace != MNG_INTERLACE_ADAM7) ) + MNG_ERROR (pData, MNG_INVALIDINTERLACE); + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* check the colortype for delta-images ! */ + { + mng_imagedatap pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + + if (pData->iColortype != pBuf->iColortype) + { + if ( ( (pData->iColortype != MNG_COLORTYPE_INDEXED) || + (pBuf->iColortype == MNG_COLORTYPE_GRAY ) ) && + ( (pData->iColortype != MNG_COLORTYPE_GRAY ) || + (pBuf->iColortype == MNG_COLORTYPE_INDEXED) ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + } + } +#endif +#endif + + if (!pData->bHasheader) /* first chunk ? */ + { + pData->bHasheader = MNG_TRUE; /* we've got a header */ + pData->eImagetype = mng_it_png; /* then this must be a PNG */ + pData->iWidth = pData->iDatawidth; + pData->iHeight = pData->iDataheight; + /* predict alpha-depth ! */ + if ((pData->iColortype == MNG_COLORTYPE_GRAYA ) || + (pData->iColortype == MNG_COLORTYPE_RGBA ) ) + pData->iAlphadepth = pData->iBitdepth; + else + if (pData->iColortype == MNG_COLORTYPE_INDEXED) + pData->iAlphadepth = 8; /* worst case scenario */ + else + pData->iAlphadepth = 1; /* Possible tRNS cheap binary transparency */ + /* fits on maximum canvas ? */ + if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight)) + MNG_WARNING (pData, MNG_IMAGETOOLARGE); + +#if !defined(MNG_INCLUDE_MPNG_PROPOSAL) || !defined(MNG_SUPPORT_DISPLAY) + if (pData->fProcessheader) /* inform the app ? */ + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); +#endif + } + + if (!pData->bHasDHDR) + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_SUPPORT_DISPLAY + return mng_process_display_ihdr (pData); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} + +/* ************************************************************************** */ + +MNG_F_SPECIALFUNC (mng_debunk_plte) +{ + mng_pltep pPLTE = (mng_pltep)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + /* length must be multiple of 3 */ + if (((iRawlen % 3) != 0) || (iRawlen > 768)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + /* this is the exact length */ + pPLTE->iEntrycount = iRawlen / 3; + + MNG_COPY (pPLTE->aEntries, pRawdata, iRawlen); + + *piRawlen = 0; + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_C_SPECIALFUNC (mng_special_plte) +{ /* multiple PLTE only inside BASI */ + if ((pData->bHasPLTE) && (!pData->bHasBASI)) + MNG_ERROR (pData, MNG_MULTIPLEERROR); + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { /* only allowed for indexed-color or + rgb(a)-color! */ + if ((pData->iColortype != MNG_COLORTYPE_RGB ) && + (pData->iColortype != MNG_COLORTYPE_INDEXED) && + (pData->iColortype != MNG_COLORTYPE_RGBA ) ) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + /* empty only allowed if global present */ + if ((((mng_pltep)pChunk)->bEmpty) && (!pData->bHasglobalPLTE)) + MNG_ERROR (pData, MNG_CANNOTBEEMPTY); + } + else + { + if (((mng_pltep)pChunk)->bEmpty) /* cannot be empty as global! */ + MNG_ERROR (pData, MNG_CANNOTBEEMPTY); + } + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + pData->bHasPLTE = MNG_TRUE; /* got it! */ + else + pData->bHasglobalPLTE = MNG_TRUE; + + pData->iPLTEcount = ((mng_pltep)pChunk)->iEntrycount; + +#ifdef MNG_SUPPORT_DISPLAY + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { + mng_imagep pImage; + mng_imagedatap pBuf; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* processing delta-image ? */ + { /* store in object 0 !!! */ + pImage = (mng_imagep)pData->pObjzero; + pBuf = pImage->pImgbuf; + pBuf->bHasPLTE = MNG_TRUE; /* it's definitely got a PLTE now */ + pBuf->iPLTEcount = ((mng_pltep)pChunk)->iEntrycount; + MNG_COPY (pBuf->aPLTEentries, ((mng_pltep)pChunk)->aEntries, + sizeof (pBuf->aPLTEentries)); + } + else +#endif + { /* get the current object */ + pImage = (mng_imagep)pData->pCurrentobj; + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address the object buffer */ + pBuf->bHasPLTE = MNG_TRUE; /* and tell it it's got a PLTE now */ + + if (((mng_pltep)pChunk)->bEmpty) /* if empty, inherit from global */ + { + pBuf->iPLTEcount = pData->iGlobalPLTEcount; + MNG_COPY (pBuf->aPLTEentries, pData->aGlobalPLTEentries, + sizeof (pBuf->aPLTEentries)); + + if (pData->bHasglobalTRNS) /* also copy global tRNS ? */ + { + mng_uint32 iRawlen2 = pData->iGlobalTRNSrawlen; + mng_uint8p pRawdata2 = (mng_uint8p)(pData->aGlobalTRNSrawdata); + /* indicate tRNS available */ + pBuf->bHasTRNS = MNG_TRUE; + /* global length oke ? */ + if ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount)) + MNG_ERROR (pData, MNG_GLOBALLENGTHERR); + /* copy it */ + pBuf->iTRNScount = iRawlen2; + MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2); + } + } + else + { /* store fields for future reference */ + pBuf->iPLTEcount = ((mng_pltep)pChunk)->iEntrycount; + MNG_COPY (pBuf->aPLTEentries, ((mng_pltep)pChunk)->aEntries, + sizeof (pBuf->aPLTEentries)); + } + } + } + else /* store as global */ + { + pData->iGlobalPLTEcount = ((mng_pltep)pChunk)->iEntrycount; + MNG_COPY (pData->aGlobalPLTEentries, ((mng_pltep)pChunk)->aEntries, + sizeof (pData->aGlobalPLTEentries)); + /* create an animation object */ + return mng_create_ani_plte (pData); + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +MNG_C_SPECIALFUNC (mng_special_idat) +{ +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasJHDR) && + (pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); +#endif + /* not allowed for deltatype NO_CHANGE */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && ((pData->iDeltatype == MNG_DELTATYPE_NOCHANGE))) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); +#endif + /* can only be empty in BASI-block! */ + if ((((mng_idatp)pChunk)->bEmpty) && (!pData->bHasBASI)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + /* indexed-color requires PLTE */ + if ((pData->bHasIHDR) && (pData->iColortype == 3) && (!pData->bHasPLTE)) + MNG_ERROR (pData, MNG_PLTEMISSING); + + pData->bHasIDAT = MNG_TRUE; /* got some IDAT now, don't we */ + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +MNG_C_SPECIALFUNC (mng_special_iend) +{ /* IHDR-block requires IDAT */ + if ((pData->bHasIHDR) && (!pData->bHasIDAT)) + MNG_ERROR (pData, MNG_IDATMISSING); + + pData->iImagelevel--; /* one level up */ + +#ifdef MNG_SUPPORT_DISPLAY + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_image (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* display processing */ + iRetcode = mng_process_display_iend (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_SUPPORT_DISPLAY + if (!pData->bTimerset) /* reset only if not broken !!! */ + { +#endif + /* IEND signals the end for most ... */ + pData->bHasIHDR = MNG_FALSE; + pData->bHasBASI = MNG_FALSE; + pData->bHasDHDR = MNG_FALSE; +#ifdef MNG_INCLUDE_JNG + pData->bHasJHDR = MNG_FALSE; + pData->bHasJSEP = MNG_FALSE; + pData->bHasJDAA = MNG_FALSE; + pData->bHasJDAT = MNG_FALSE; +#endif + pData->bHasPLTE = MNG_FALSE; + pData->bHasTRNS = MNG_FALSE; + pData->bHasGAMA = MNG_FALSE; + pData->bHasCHRM = MNG_FALSE; + pData->bHasSRGB = MNG_FALSE; + pData->bHasICCP = MNG_FALSE; + pData->bHasBKGD = MNG_FALSE; + pData->bHasIDAT = MNG_FALSE; +#ifdef MNG_SUPPORT_DISPLAY + } +#endif + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +MNG_F_SPECIALFUNC (mng_debunk_trns) +{ + mng_trnsp pTRNS = (mng_trnsp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { /* not global! */ + pTRNS->bGlobal = MNG_FALSE; + pTRNS->iType = pData->iColortype; + + if (iRawlen != 0) + { + switch (pData->iColortype) /* store fields */ + { + case 0: { /* gray */ + if (iRawlen != 2) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + pTRNS->iGray = mng_get_uint16 (pRawdata); + break; + } + case 2: { /* rgb */ + if (iRawlen != 6) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + pTRNS->iRed = mng_get_uint16 (pRawdata); + pTRNS->iGreen = mng_get_uint16 (pRawdata+2); + pTRNS->iBlue = mng_get_uint16 (pRawdata+4); + break; + } + case 3: { /* indexed */ + if (iRawlen > 256) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + pTRNS->iCount = iRawlen; + MNG_COPY (pTRNS->aEntries, pRawdata, iRawlen); + break; + } + } + } + } + else /* it's global! */ + { + if (iRawlen == 0) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + pTRNS->bGlobal = MNG_TRUE; + pTRNS->iType = 0; + pTRNS->iRawlen = iRawlen; + MNG_COPY (pTRNS->aRawdata, pRawdata, iRawlen); + + pData->iGlobalTRNSrawlen = iRawlen; + MNG_COPY (pData->aGlobalTRNSrawdata, pRawdata, iRawlen); + } + + *piRawlen = 0; + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_C_SPECIALFUNC (mng_special_trns) +{ /* multiple tRNS only inside BASI */ + if ((pData->bHasTRNS) && (!pData->bHasBASI)) + MNG_ERROR (pData, MNG_MULTIPLEERROR); + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { /* not allowed with full alpha-channel */ + if ((pData->iColortype == 4) || (pData->iColortype == 6)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + + if (!((mng_trnsp)pChunk)->bEmpty) /* filled ? */ + { +#ifdef MNG_SUPPORT_DISPLAY + if (pData->iColortype == 3) + { + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + mng_imagedatap pBuf; + + if (!pImage) /* no object then check obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address object buffer */ + + if (((mng_trnsp)pChunk)->iCount > pBuf->iPLTEcount) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } +#endif + } + else /* if empty there must be global stuff! */ + { + if (!pData->bHasglobalTRNS) + MNG_ERROR (pData, MNG_CANNOTBEEMPTY); + } + } + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + pData->bHasTRNS = MNG_TRUE; /* indicate tRNS available */ + else + pData->bHasglobalTRNS = MNG_TRUE; + +#ifdef MNG_SUPPORT_DISPLAY + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { + mng_imagep pImage; + mng_imagedatap pBuf; + mng_uint8p pRawdata2; + mng_uint32 iRawlen2; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* processing delta-image ? */ + { /* store in object 0 !!! */ +#if defined(MNG_NO_1_2_4BIT_SUPPORT) + mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1,0,0,0,0,0,0,0,1}; +#endif + pImage = (mng_imagep)pData->pObjzero; + pBuf = pImage->pImgbuf; /* address object buffer */ + pBuf->bHasTRNS = MNG_TRUE; /* tell it it's got a tRNS now */ + pBuf->iTRNSgray = 0; + pBuf->iTRNSred = 0; + pBuf->iTRNSgreen = 0; + pBuf->iTRNSblue = 0; + pBuf->iTRNScount = 0; + + switch (pData->iColortype) /* store fields for future reference */ + { + case 0: { /* gray */ + pBuf->iTRNSgray = ((mng_trnsp)pChunk)->iGray; +#if defined(MNG_NO_1_2_4BIT_SUPPORT) + pBuf->iTRNSgray *= multiplier[pData->iPNGdepth]; +#endif +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + pBuf->iTRNSgray >>= 8; +#endif + break; + } + case 2: { /* rgb */ + pBuf->iTRNSred = ((mng_trnsp)pChunk)->iRed; + pBuf->iTRNSgreen = ((mng_trnsp)pChunk)->iGreen; + pBuf->iTRNSblue = ((mng_trnsp)pChunk)->iBlue; +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + { + pBuf->iTRNSred >>= 8; + pBuf->iTRNSgreen >>= 8; + pBuf->iTRNSblue >>= 8; + } +#endif + break; + } + case 3: { /* indexed */ + pBuf->iTRNScount = ((mng_trnsp)pChunk)->iCount; + MNG_COPY (pBuf->aTRNSentries, + ((mng_trnsp)pChunk)->aEntries, + ((mng_trnsp)pChunk)->iCount); + break; + } + } + } + else +#endif + { /* address current object */ + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address object buffer */ + pBuf->bHasTRNS = MNG_TRUE; /* and tell it it's got a tRNS now */ + pBuf->iTRNSgray = 0; + pBuf->iTRNSred = 0; + pBuf->iTRNSgreen = 0; + pBuf->iTRNSblue = 0; + pBuf->iTRNScount = 0; + + if (((mng_trnsp)pChunk)->bEmpty) /* if empty, inherit from global */ + { + iRawlen2 = pData->iGlobalTRNSrawlen; + pRawdata2 = (mng_ptr)(pData->aGlobalTRNSrawdata); + /* global length oke ? */ + if ((pData->iColortype == 0) && (iRawlen2 != 2)) + MNG_ERROR (pData, MNG_GLOBALLENGTHERR); + + if ((pData->iColortype == 2) && (iRawlen2 != 6)) + MNG_ERROR (pData, MNG_GLOBALLENGTHERR); + + if ((pData->iColortype == 3) && ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount))) + MNG_ERROR (pData, MNG_GLOBALLENGTHERR); + + switch (pData->iColortype) /* store fields for future reference */ + { + case 0: { /* gray */ + pBuf->iTRNSgray = mng_get_uint16 (pRawdata2); +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + pBuf->iTRNSgray >>= 8; +#endif + break; + } + case 2: { /* rgb */ + pBuf->iTRNSred = mng_get_uint16 (pRawdata2); + pBuf->iTRNSgreen = mng_get_uint16 (pRawdata2+2); + pBuf->iTRNSblue = mng_get_uint16 (pRawdata2+4); +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + { + pBuf->iTRNSred >>= 8; + pBuf->iTRNSgreen >>= 8; + pBuf->iTRNSblue >>= 8; + } +#endif + break; + } + case 3: { /* indexed */ + pBuf->iTRNScount = iRawlen2; + MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2); + break; + } + } + } + else + { + switch (pData->iColortype) /* store fields for future reference */ + { + case 0: { /* gray */ + pBuf->iTRNSgray = ((mng_trnsp)pChunk)->iGray; +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + pBuf->iTRNSgray >>= 8; +#endif + break; + } + case 2: { /* rgb */ + pBuf->iTRNSred = ((mng_trnsp)pChunk)->iRed; + pBuf->iTRNSgreen = ((mng_trnsp)pChunk)->iGreen; + pBuf->iTRNSblue = ((mng_trnsp)pChunk)->iBlue; +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + { + pBuf->iTRNSred >>= 8; + pBuf->iTRNSgreen >>= 8; + pBuf->iTRNSblue >>= 8; + } +#endif + break; + } + case 3: { /* indexed */ + pBuf->iTRNScount = ((mng_trnsp)pChunk)->iCount; + MNG_COPY (pBuf->aTRNSentries, + ((mng_trnsp)pChunk)->aEntries, + ((mng_trnsp)pChunk)->iCount); + break; + } + } + } + } + } + else + { /* create an animation object */ + return mng_create_ani_trns (pData); + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +MNG_C_SPECIALFUNC (mng_special_gama) +{ +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasGAMA = MNG_TRUE; /* indicate we've got it */ + else + pData->bHasglobalGAMA = (mng_bool)!((mng_gamap)pChunk)->bEmpty; + +#ifdef MNG_SUPPORT_DISPLAY +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + mng_imagep pImage; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* update delta image ? */ + pImage = (mng_imagep)pData->pObjzero; + else +#endif + { + pImage = (mng_imagep)pData->pCurrentobj; + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + } + /* store for color-processing routines */ + pImage->pImgbuf->iGamma = ((mng_gamap)pChunk)->iGamma; + pImage->pImgbuf->bHasGAMA = MNG_TRUE; + } + else + { /* store as global */ + if (!((mng_gamap)pChunk)->bEmpty) + pData->iGlobalGamma = ((mng_gamap)pChunk)->iGamma; + /* create an animation object */ + return mng_create_ani_gama (pData, pChunk); + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +MNG_C_SPECIALFUNC (mng_special_chrm) +{ +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasCHRM = MNG_TRUE; /* indicate we've got it */ + else + pData->bHasglobalCHRM = (mng_bool)!((mng_chrmp)pChunk)->bEmpty; + +#ifdef MNG_SUPPORT_DISPLAY + { +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + mng_imagep pImage; + mng_imagedatap pBuf; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* update delta image ? */ + pImage = (mng_imagep)pData->pObjzero; + else +#endif + { + pImage = (mng_imagep)pData->pCurrentobj; + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + } + + pBuf = pImage->pImgbuf; /* address object buffer */ + pBuf->bHasCHRM = MNG_TRUE; /* and tell it it's got a CHRM now */ + /* store for color-processing routines */ + pBuf->iWhitepointx = ((mng_chrmp)pChunk)->iWhitepointx; + pBuf->iWhitepointy = ((mng_chrmp)pChunk)->iWhitepointy; + pBuf->iPrimaryredx = ((mng_chrmp)pChunk)->iRedx; + pBuf->iPrimaryredy = ((mng_chrmp)pChunk)->iRedy; + pBuf->iPrimarygreenx = ((mng_chrmp)pChunk)->iGreenx; + pBuf->iPrimarygreeny = ((mng_chrmp)pChunk)->iGreeny; + pBuf->iPrimarybluex = ((mng_chrmp)pChunk)->iBluex; + pBuf->iPrimarybluey = ((mng_chrmp)pChunk)->iBluey; + } + else + { /* store as global */ + if (!((mng_chrmp)pChunk)->bEmpty) + { + pData->iGlobalWhitepointx = ((mng_chrmp)pChunk)->iWhitepointx; + pData->iGlobalWhitepointy = ((mng_chrmp)pChunk)->iWhitepointy; + pData->iGlobalPrimaryredx = ((mng_chrmp)pChunk)->iRedx; + pData->iGlobalPrimaryredy = ((mng_chrmp)pChunk)->iRedy; + pData->iGlobalPrimarygreenx = ((mng_chrmp)pChunk)->iGreenx; + pData->iGlobalPrimarygreeny = ((mng_chrmp)pChunk)->iGreeny; + pData->iGlobalPrimarybluex = ((mng_chrmp)pChunk)->iBluex; + pData->iGlobalPrimarybluey = ((mng_chrmp)pChunk)->iBluey; + } + /* create an animation object */ + return mng_create_ani_chrm (pData, pChunk); + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +MNG_C_SPECIALFUNC (mng_special_srgb) +{ +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasSRGB = MNG_TRUE; /* indicate we've got it */ + else + pData->bHasglobalSRGB = (mng_bool)!((mng_srgbp)pChunk)->bEmpty; + +#ifdef MNG_SUPPORT_DISPLAY +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + mng_imagep pImage; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* update delta image ? */ + pImage = (mng_imagep)pData->pObjzero; + else +#endif + { + pImage = (mng_imagep)pData->pCurrentobj; + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + } + /* store for color-processing routines */ + pImage->pImgbuf->iRenderingintent = ((mng_srgbp)pChunk)->iRenderingintent; + pImage->pImgbuf->bHasSRGB = MNG_TRUE; + } + else + { /* store as global */ + if (!((mng_srgbp)pChunk)->bEmpty) + pData->iGlobalRendintent = ((mng_srgbp)pChunk)->iRenderingintent; + /* create an animation object */ + return mng_create_ani_srgb (pData, pChunk); + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +MNG_C_SPECIALFUNC (mng_special_iccp) +{ + mng_retcode iRetcode; + mng_chunk_headerp pDummy; + +#ifdef MNG_CHECK_BAD_ICCP /* Check for bad iCCP chunk */ + if (!strncmp (((mng_iccpp)pChunk)->zName, "Photoshop ICC profile", 21)) + { + if (((mng_iccpp)pChunk)->iProfilesize == 2615) /* is it the sRGB profile ? */ + { + mng_chunk_header chunk_srgb; + mng_get_chunkheader (MNG_UINT_sRGB, &chunk_srgb); + /* pretend it's an sRGB chunk then ! */ + iRetcode = mng_read_general (pData, &chunk_srgb, 1, (mng_ptr)"0", &pDummy); + if (iRetcode) /* on error bail out */ + return iRetcode; + + pDummy->fCleanup (pData, pDummy); + } + } + else + { +#endif /* MNG_CHECK_BAD_ICCP */ + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasICCP = MNG_TRUE; /* indicate we've got it */ + else + pData->bHasglobalICCP = (mng_bool)!((mng_iccpp)pChunk)->bEmpty; + +#ifdef MNG_SUPPORT_DISPLAY +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + mng_imagep pImage; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* update delta image ? */ + { /* store in object 0 ! */ + pImage = (mng_imagep)pData->pObjzero; + + if (pImage->pImgbuf->pProfile) /* profile existed ? */ + MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize); + /* allocate a buffer & copy it */ + MNG_ALLOC (pData, pImage->pImgbuf->pProfile, ((mng_iccpp)pChunk)->iProfilesize); + MNG_COPY (pImage->pImgbuf->pProfile, ((mng_iccpp)pChunk)->pProfile, ((mng_iccpp)pChunk)->iProfilesize); + /* store its length as well */ + pImage->pImgbuf->iProfilesize = ((mng_iccpp)pChunk)->iProfilesize; + pImage->pImgbuf->bHasICCP = MNG_TRUE; + } + else +#endif + { + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + if (pImage->pImgbuf->pProfile) /* profile existed ? */ + MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize); + /* allocate a buffer & copy it */ + MNG_ALLOC (pData, pImage->pImgbuf->pProfile, ((mng_iccpp)pChunk)->iProfilesize); + MNG_COPY (pImage->pImgbuf->pProfile, ((mng_iccpp)pChunk)->pProfile, ((mng_iccpp)pChunk)->iProfilesize); + /* store its length as well */ + pImage->pImgbuf->iProfilesize = ((mng_iccpp)pChunk)->iProfilesize; + pImage->pImgbuf->bHasICCP = MNG_TRUE; + } + } + else + { /* store as global */ + if (pData->pGlobalProfile) /* did we have a global profile ? */ + MNG_FREEX (pData, pData->pGlobalProfile, pData->iGlobalProfilesize); + + if (((mng_iccpp)pChunk)->bEmpty) /* empty chunk ? */ + { + pData->iGlobalProfilesize = 0; /* reset to null */ + pData->pGlobalProfile = MNG_NULL; + } + else + { /* allocate a global buffer & copy it */ + MNG_ALLOC (pData, pData->pGlobalProfile, ((mng_iccpp)pChunk)->iProfilesize); + MNG_COPY (pData->pGlobalProfile, ((mng_iccpp)pChunk)->pProfile, ((mng_iccpp)pChunk)->iProfilesize); + /* store its length as well */ + pData->iGlobalProfilesize = ((mng_iccpp)pChunk)->iProfilesize; + } + /* create an animation object */ + return mng_create_ani_iccp (pData, pChunk); + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_CHECK_BAD_ICCP + } +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +MNG_C_SPECIALFUNC (mng_special_text) +{ + if (pData->fProcesstext) /* inform the application ? */ + { + mng_bool bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_TEXT, + ((mng_textp)pChunk)->zKeyword, + ((mng_textp)pChunk)->zText, 0, 0); + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +MNG_C_SPECIALFUNC (mng_special_ztxt) +{ + if (pData->fProcesstext) /* inform the application ? */ + { + mng_bool bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ZTXT, + ((mng_ztxtp)pChunk)->zKeyword, + ((mng_ztxtp)pChunk)->zText, 0, 0); + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +MNG_F_SPECIALFUNC (mng_deflate_itxt) +{ + mng_itxtp pITXT = (mng_itxtp)pChunk; + mng_uint32 iBufsize = 0; + mng_uint8p pBuf = 0; + mng_uint32 iTextlen = 0; + + if (pITXT->iCompressionflag) /* decompress the text ? */ + { + mng_retcode iRetcode = mng_inflate_buffer (pData, *ppRawdata, *piRawlen, + &pBuf, &iBufsize, &iTextlen); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + + MNG_ALLOC (pData, pITXT->zText, iTextlen+1); + MNG_COPY (pITXT->zText, pBuf, iTextlen); + + pITXT->iTextsize = iTextlen; + + MNG_FREEX (pData, pBuf, iBufsize); + + } else { + + MNG_ALLOC (pData, pITXT->zText, (*piRawlen)+1); + MNG_COPY (pITXT->zText, *ppRawdata, *piRawlen); + + pITXT->iTextsize = *piRawlen; + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +MNG_C_SPECIALFUNC (mng_special_itxt) +{ + if (pData->fProcesstext) /* inform the application ? */ + { + mng_bool bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ITXT, + ((mng_itxtp)pChunk)->zKeyword, + ((mng_itxtp)pChunk)->zText, + ((mng_itxtp)pChunk)->zLanguage, + ((mng_itxtp)pChunk)->zTranslation); + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +MNG_C_SPECIALFUNC (mng_special_bkgd) +{ +#ifdef MNG_SUPPORT_DISPLAY + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + mng_imagedatap pBuf; +#endif + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasBKGD = MNG_TRUE; /* indicate bKGD available */ + else + pData->bHasglobalBKGD = (mng_bool)!(((mng_bkgdp)pChunk)->bEmpty); + +#ifdef MNG_SUPPORT_DISPLAY + if (!pImage) /* if no object dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + pBuf = pImage->pImgbuf; /* address object buffer */ + +#ifdef MNG_INCLUDE_JNG + if (pData->bHasJHDR) + { + pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */ + + switch (pData->iJHDRcolortype) /* store fields for future reference */ + { + case 8 : ; /* gray */ + case 12 : { /* graya */ + pBuf->iBKGDgray = ((mng_bkgdp)pChunk)->iGray; + break; + } + case 10 : ; /* rgb */ + case 14 : { /* rgba */ + pBuf->iBKGDred = ((mng_bkgdp)pChunk)->iRed; + pBuf->iBKGDgreen = ((mng_bkgdp)pChunk)->iGreen; + pBuf->iBKGDblue = ((mng_bkgdp)pChunk)->iBlue; + break; + } + } + } + else +#endif /* MNG_INCLUDE_JNG */ + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { + pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */ + + switch (pData->iColortype) /* store fields for future reference */ + { + case 0 : ; /* gray */ + case 4 : { /* graya */ + pBuf->iBKGDgray = ((mng_bkgdp)pChunk)->iGray; + break; + } + case 2 : ; /* rgb */ + case 6 : { /* rgba */ + pBuf->iBKGDred = ((mng_bkgdp)pChunk)->iRed; + pBuf->iBKGDgreen = ((mng_bkgdp)pChunk)->iGreen; + pBuf->iBKGDblue = ((mng_bkgdp)pChunk)->iBlue; + break; + } + case 3 : { /* indexed */ + pBuf->iBKGDindex = ((mng_bkgdp)pChunk)->iIndex; + break; + } + } + } + else /* store as global */ + { + if (!(((mng_bkgdp)pChunk)->bEmpty)) + { + pData->iGlobalBKGDred = ((mng_bkgdp)pChunk)->iRed; + pData->iGlobalBKGDgreen = ((mng_bkgdp)pChunk)->iGreen; + pData->iGlobalBKGDblue = ((mng_bkgdp)pChunk)->iBlue; + } + /* create an animation object */ + return mng_create_ani_bkgd (pData); + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYs +MNG_C_SPECIALFUNC (mng_special_phys) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sBIT +MNG_C_SPECIALFUNC (mng_special_sbit) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +MNG_F_SPECIALFUNC (mng_splt_entries) +{ + mng_spltp pSPLT = (mng_spltp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + + if ((pSPLT->iSampledepth != MNG_BITDEPTH_8 ) && + (pSPLT->iSampledepth != MNG_BITDEPTH_16) ) + MNG_ERROR (pData, MNG_INVSAMPLEDEPTH); + /* check remaining length */ + if ( ((pSPLT->iSampledepth == MNG_BITDEPTH_8 ) && (iRawlen % 6 != 0)) || + ((pSPLT->iSampledepth == MNG_BITDEPTH_16) && (iRawlen % 10 != 0)) ) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if (pSPLT->iSampledepth == MNG_BITDEPTH_8) + pSPLT->iEntrycount = iRawlen / 6; + else + pSPLT->iEntrycount = iRawlen / 10; + + if (iRawlen) + { + MNG_ALLOC (pData, pSPLT->pEntries, iRawlen); + MNG_COPY (pSPLT->pEntries, pRawdata, iRawlen); + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +MNG_C_SPECIALFUNC (mng_special_splt) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_hIST +MNG_F_SPECIALFUNC (mng_hist_entries) +{ + mng_histp pHIST = (mng_histp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_uint32 iX; + + if ( ((iRawlen & 0x01) != 0) || ((iRawlen >> 1) != pData->iPLTEcount) ) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pHIST->iEntrycount = iRawlen >> 1; + + for (iX = 0; iX < pHIST->iEntrycount; iX++) + { + pHIST->aEntries[iX] = mng_get_uint16 (pRawdata); + pRawdata += 2; + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_hIST +MNG_C_SPECIALFUNC (mng_special_hist) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tIME +MNG_C_SPECIALFUNC (mng_special_time) +{ +/* if (pData->fProcesstime) */ /* inform the application ? */ +/* { + + pData->fProcesstime ((mng_handle)pData, ); + } */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ +/* JNG chunks */ + +#ifdef MNG_INCLUDE_JNG +MNG_C_SPECIALFUNC (mng_special_jhdr) +{ + if ((pData->eSigtype == mng_it_jng) && (pData->iChunkseq > 1)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* inside a JHDR-IEND block now */ + pData->bHasJHDR = MNG_TRUE; + /* and store interesting fields */ + pData->iDatawidth = ((mng_jhdrp)pChunk)->iWidth; + pData->iDataheight = ((mng_jhdrp)pChunk)->iHeight; + pData->iJHDRcolortype = ((mng_jhdrp)pChunk)->iColortype; + pData->iJHDRimgbitdepth = ((mng_jhdrp)pChunk)->iImagesampledepth; + pData->iJHDRimgcompression = ((mng_jhdrp)pChunk)->iImagecompression; + pData->iJHDRimginterlace = ((mng_jhdrp)pChunk)->iImageinterlace; + pData->iJHDRalphabitdepth = ((mng_jhdrp)pChunk)->iAlphasampledepth; + pData->iJHDRalphacompression = ((mng_jhdrp)pChunk)->iAlphacompression; + pData->iJHDRalphafilter = ((mng_jhdrp)pChunk)->iAlphafilter; + pData->iJHDRalphainterlace = ((mng_jhdrp)pChunk)->iAlphainterlace; + +#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT) + pData->iPNGmult = 1; + pData->iPNGdepth = pData->iJHDRalphabitdepth; +#endif + +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iJHDRalphabitdepth < 8) + pData->iJHDRalphabitdepth = 8; +#endif + +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iJHDRalphabitdepth > 8) + { + pData->iPNGmult = 2; + pData->iJHDRalphabitdepth = 8; + } +#endif + /* parameter validity checks */ + if ((pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAY ) && + (pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLOR ) && + (pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAYA ) && + (pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLORA) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + if ((pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8 ) && + (pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG12 ) && + (pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8AND12) ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) + { + if ((pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 ) +#ifndef MNG_NO_1_2_4BIT_SUPPORT + && (pData->iJHDRalphabitdepth != MNG_BITDEPTH_1 ) && + (pData->iJHDRalphabitdepth != MNG_BITDEPTH_2 ) && + (pData->iJHDRalphabitdepth != MNG_BITDEPTH_4 ) +#endif +#ifndef MNG_NO_16BIT_SUPPORT + && (pData->iJHDRalphabitdepth != MNG_BITDEPTH_16) +#endif + ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ((pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE ) && + (pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG) ) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + + if ((pData->iJHDRalphacompression == MNG_COMPRESSION_BASELINEJPEG) && + (pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 ) ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + +#if defined(FILTER192) || defined(FILTER193) + if ((pData->iJHDRalphafilter != MNG_FILTER_ADAPTIVE ) && +#if defined(FILTER192) && defined(FILTER193) + (pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) && + (pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) ) +#else +#ifdef FILTER192 + (pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) ) +#else + (pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) ) +#endif +#endif + MNG_ERROR (pData, MNG_INVALIDFILTER); +#else + if (pData->iJHDRalphafilter) + MNG_ERROR (pData, MNG_INVALIDFILTER); +#endif + + } + else + { + if (pData->iJHDRalphabitdepth) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + if (pData->iJHDRalphacompression) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + if (pData->iJHDRalphafilter) + MNG_ERROR (pData, MNG_INVALIDFILTER); + if (pData->iJHDRalphainterlace) + MNG_ERROR (pData, MNG_INVALIDINTERLACE); + } + + if (!pData->bHasheader) /* first chunk ? */ + { + pData->bHasheader = MNG_TRUE; /* we've got a header */ + pData->eImagetype = mng_it_jng; /* then this must be a JNG */ + pData->iWidth = ((mng_jhdrp)pChunk)->iWidth; + pData->iHeight = ((mng_jhdrp)pChunk)->iHeight; + /* predict alpha-depth ! */ + if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) + pData->iAlphadepth = pData->iJHDRalphabitdepth; + else + pData->iAlphadepth = 0; + /* fits on maximum canvas ? */ + if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight)) + MNG_WARNING (pData, MNG_IMAGETOOLARGE); + + if (pData->fProcessheader) /* inform the app ? */ + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + } + + pData->iColortype = 0; /* fake grayscale for other routines */ + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode = mng_process_display_jhdr (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_NO_16BIT_SUPPORT + if (((mng_jhdrp)pChunk)->iAlphasampledepth > 8) + ((mng_jhdrp)pChunk)->iAlphasampledepth = 8; +#endif + + return MNG_NOERROR; /* done */ +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +MNG_C_SPECIALFUNC (mng_special_jdaa) +{ + if (pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + pData->bHasJDAA = MNG_TRUE; /* got some JDAA now, don't we */ + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +MNG_C_SPECIALFUNC (mng_special_jdat) +{ + pData->bHasJDAT = MNG_TRUE; /* got some JDAT now, don't we */ + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +MNG_C_SPECIALFUNC (mng_special_jsep) +{ + pData->bHasJSEP = MNG_TRUE; /* indicate we've had the 8-/12-bit separator */ + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ +/* ************************************************************************** */ +/* MNG chunks */ + +MNG_C_SPECIALFUNC (mng_special_mhdr) +{ + if (pData->bHasheader) /* can only be the first chunk! */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + pData->bHasMHDR = MNG_TRUE; /* oh boy, a real MNG */ + pData->bHasheader = MNG_TRUE; /* we've got a header */ + pData->eImagetype = mng_it_mng; /* fill header fields */ + pData->iWidth = ((mng_mhdrp)pChunk)->iWidth; + pData->iHeight = ((mng_mhdrp)pChunk)->iHeight; + pData->iTicks = ((mng_mhdrp)pChunk)->iTicks; + pData->iLayercount = ((mng_mhdrp)pChunk)->iLayercount; + pData->iFramecount = ((mng_mhdrp)pChunk)->iFramecount; + pData->iPlaytime = ((mng_mhdrp)pChunk)->iPlaytime; + pData->iSimplicity = ((mng_mhdrp)pChunk)->iSimplicity; +#ifndef MNG_NO_OLD_VERSIONS + pData->bPreDraft48 = MNG_FALSE; +#endif + /* predict alpha-depth */ + if ((pData->iSimplicity & 0x00000001) == 0) +#ifndef MNG_NO_16BIT_SUPPORT + pData->iAlphadepth = 16; /* no indicators = assume the worst */ +#else + pData->iAlphadepth = 8; /* anything else = assume the worst */ +#endif + else + if ((pData->iSimplicity & 0x00000008) == 0) + pData->iAlphadepth = 0; /* no transparency at all */ + else + if ((pData->iSimplicity & 0x00000140) == 0x00000040) + pData->iAlphadepth = 1; /* no semi-transparency guaranteed */ + else +#ifndef MNG_NO_16BIT_SUPPORT + pData->iAlphadepth = 16; /* anything else = assume the worst */ +#else + pData->iAlphadepth = 8; /* anything else = assume the worst */ +#endif + +#ifdef MNG_INCLUDE_JNG /* can we handle the complexity ? */ + if (pData->iSimplicity & 0x0000FC00) +#else + if (pData->iSimplicity & 0x0000FC10) +#endif + MNG_ERROR (pData, MNG_MNGTOOCOMPLEX); + /* fits on maximum canvas ? */ + if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight)) + MNG_WARNING (pData, MNG_IMAGETOOLARGE); + + if (pData->fProcessheader) /* inform the app ? */ + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + pData->iImagelevel++; /* one level deeper */ + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +MNG_C_SPECIALFUNC (mng_special_mend) +{ +#ifdef MNG_SUPPORT_DISPLAY + { /* do something */ + mng_retcode iRetcode = mng_process_display_mend (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (!pData->iTotalframes) /* save totals */ + pData->iTotalframes = pData->iFrameseq; + if (!pData->iTotallayers) + pData->iTotallayers = pData->iLayerseq; + if (!pData->iTotalplaytime) + pData->iTotalplaytime = pData->iFrametime; + } +#endif /* MNG_SUPPORT_DISPLAY */ + + pData->bHasMHDR = MNG_FALSE; /* end of the line, bro! */ + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +MNG_F_SPECIALFUNC (mng_debunk_loop) +{ + mng_loopp pLOOP = (mng_loopp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + + if (iRawlen >= 5) /* length checks */ + { + if (iRawlen >= 6) + { + if ((iRawlen - 6) % 4 != 0) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if (iRawlen >= 5) /* store the fields */ + { + pLOOP->iLevel = *pRawdata; + +#ifndef MNG_NO_OLD_VERSIONS + if (pData->bPreDraft48) + { + pLOOP->iTermination = *(pRawdata+1); + pLOOP->iRepeat = mng_get_uint32 (pRawdata+2); + } + else +#endif + { + pLOOP->iRepeat = mng_get_uint32 (pRawdata+1); + } + + if (iRawlen >= 6) + { +#ifndef MNG_NO_OLD_VERSIONS + if (!pData->bPreDraft48) +#endif + pLOOP->iTermination = *(pRawdata+5); + + if (iRawlen >= 10) + { + pLOOP->iItermin = mng_get_uint32 (pRawdata+6); + +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + if (iRawlen >= 14) + { + pLOOP->iItermax = mng_get_uint32 (pRawdata+10); + pLOOP->iCount = (iRawlen - 14) / 4; + + if (pLOOP->iCount) + { + MNG_ALLOC (pData, pLOOP->pSignals, pLOOP->iCount << 2); + +#ifndef MNG_BIGENDIAN_SUPPORTED + { + mng_uint32 iX; + mng_uint8p pIn = pRawdata + 14; + mng_uint32p pOut = (mng_uint32p)pLOOP->pSignals; + + for (iX = 0; iX < pLOOP->iCount; iX++) + { + *pOut++ = mng_get_uint32 (pIn); + pIn += 4; + } + } +#else + MNG_COPY (pLOOP->pSignals, pRawdata + 14, pLOOP->iCount << 2); +#endif /* !MNG_BIGENDIAN_SUPPORTED */ + } + } +#endif + } + } + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +MNG_C_SPECIALFUNC (mng_special_loop) +{ + if (!pData->bCacheplayback) /* must store playback info to work!! */ + MNG_ERROR (pData, MNG_LOOPWITHCACHEOFF); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + + pData->bHasLOOP = MNG_TRUE; /* indicate we're inside a loop */ + /* create the LOOP ani-object */ + iRetcode = mng_create_ani_loop (pData, pChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* skip till matching ENDL if iteration=0 */ + if ((!pData->bSkipping) && (((mng_loopp)pChunk)->iRepeat == 0)) + pData->bSkipping = MNG_TRUE; + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +MNG_C_SPECIALFUNC (mng_special_endl) +{ +#ifdef MNG_SUPPORT_DISPLAY + if (pData->bHasLOOP) /* are we really processing a loop ? */ + { + mng_uint8 iLevel = ((mng_endlp)pChunk)->iLevel; + /* create an ENDL animation object */ + return mng_create_ani_endl (pData, iLevel); + } + else + MNG_ERROR (pData, MNG_NOMATCHINGLOOP); +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DEFI +MNG_C_SPECIALFUNC (mng_special_defi) +{ +#ifdef MNG_SUPPORT_DISPLAY + mng_retcode iRetcode; + + pData->iDEFIobjectid = ((mng_defip)pChunk)->iObjectid; + pData->bDEFIhasdonotshow = ((mng_defip)pChunk)->bHasdonotshow; + pData->iDEFIdonotshow = ((mng_defip)pChunk)->iDonotshow; + pData->bDEFIhasconcrete = ((mng_defip)pChunk)->bHasconcrete; + pData->iDEFIconcrete = ((mng_defip)pChunk)->iConcrete; + pData->bDEFIhasloca = ((mng_defip)pChunk)->bHasloca; + pData->iDEFIlocax = ((mng_defip)pChunk)->iXlocation; + pData->iDEFIlocay = ((mng_defip)pChunk)->iYlocation; + pData->bDEFIhasclip = ((mng_defip)pChunk)->bHasclip; + pData->iDEFIclipl = ((mng_defip)pChunk)->iLeftcb; + pData->iDEFIclipr = ((mng_defip)pChunk)->iRightcb; + pData->iDEFIclipt = ((mng_defip)pChunk)->iTopcb; + pData->iDEFIclipb = ((mng_defip)pChunk)->iBottomcb; + /* create an animation object */ + iRetcode = mng_create_ani_defi (pData); + if (!iRetcode) /* do display processing */ + iRetcode = mng_process_display_defi (pData); + return iRetcode; +#else + return MNG_NOERROR; /* done */ +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BASI +MNG_C_SPECIALFUNC (mng_special_basi) +{ + pData->bHasBASI = MNG_TRUE; /* inside a BASI-IEND block now */ + /* store interesting fields */ + pData->iDatawidth = ((mng_basip)pChunk)->iWidth; + pData->iDataheight = ((mng_basip)pChunk)->iHeight; + pData->iBitdepth = ((mng_basip)pChunk)->iBitdepth; + pData->iColortype = ((mng_basip)pChunk)->iColortype; + pData->iCompression = ((mng_basip)pChunk)->iCompression; + pData->iFilter = ((mng_basip)pChunk)->iFilter; + pData->iInterlace = ((mng_basip)pChunk)->iInterlace; + +#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT) + pData->iPNGmult = 1; + pData->iPNGdepth = pData->iBitdepth; +#endif + +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iBitdepth < 8) + pData->iBitdepth = 8; +#endif +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth > 8) + { + pData->iBitdepth = 8; + pData->iPNGmult = 2; + } +#endif + + if ((pData->iBitdepth != 8) /* parameter validity checks */ +#ifndef MNG_NO_1_2_4BIT_SUPPORT + && (pData->iBitdepth != 1) && + (pData->iBitdepth != 2) && + (pData->iBitdepth != 4) +#endif +#ifndef MNG_NO_16BIT_SUPPORT + && (pData->iBitdepth != 16) +#endif + ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ((pData->iColortype != MNG_COLORTYPE_GRAY ) && + (pData->iColortype != MNG_COLORTYPE_RGB ) && + (pData->iColortype != MNG_COLORTYPE_INDEXED) && + (pData->iColortype != MNG_COLORTYPE_GRAYA ) && + (pData->iColortype != MNG_COLORTYPE_RGBA ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8)) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (((pData->iColortype == MNG_COLORTYPE_RGB ) || + (pData->iColortype == MNG_COLORTYPE_GRAYA ) || + (pData->iColortype == MNG_COLORTYPE_RGBA ) ) && + (pData->iBitdepth < 8 ) ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + +#if defined(FILTER192) || defined(FILTER193) + if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) && +#if defined(FILTER192) && defined(FILTER193) + (pData->iFilter != MNG_FILTER_DIFFERING) && + (pData->iFilter != MNG_FILTER_NOFILTER ) ) +#else +#ifdef FILTER192 + (pData->iFilter != MNG_FILTER_DIFFERING) ) +#else + (pData->iFilter != MNG_FILTER_NOFILTER ) ) +#endif +#endif + MNG_ERROR (pData, MNG_INVALIDFILTER); +#else + if (pData->iFilter) + MNG_ERROR (pData, MNG_INVALIDFILTER); +#endif + + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_SUPPORT_DISPLAY + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_basi (pData, pChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_NO_16BIT_SUPPORT + if (((mng_basip)pChunk)->iBitdepth > 8) + ((mng_basip)pChunk)->iBitdepth = 8; +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLON +MNG_C_SPECIALFUNC (mng_special_clon) +{ +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ani_clon (pData, pChunk); +#else + return MNG_NOERROR; /* done */ +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +MNG_F_SPECIALFUNC (mng_debunk_past) +{ + mng_pastp pPAST = (mng_pastp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_uint32 iSize; + mng_uint32 iX; + mng_past_sourcep pSource; + /* check the length */ + if ((iRawlen < 41) || (((iRawlen - 11) % 30) != 0)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pPAST->iDestid = mng_get_uint16 (pRawdata); + pPAST->iTargettype = *(pRawdata+2); + pPAST->iTargetx = mng_get_int32 (pRawdata+3); + pPAST->iTargety = mng_get_int32 (pRawdata+7); + pPAST->iCount = ((iRawlen - 11) / 30); /* how many entries again? */ + iSize = pPAST->iCount * sizeof (mng_past_source); + + pRawdata += 11; + /* get a buffer for all the source blocks */ + MNG_ALLOC (pData, pPAST->pSources, iSize); + + pSource = (mng_past_sourcep)(pPAST->pSources); + + for (iX = pPAST->iCount; iX > 0; iX--) + { /* now copy the source blocks */ + pSource->iSourceid = mng_get_uint16 (pRawdata); + pSource->iComposition = *(pRawdata+2); + pSource->iOrientation = *(pRawdata+3); + pSource->iOffsettype = *(pRawdata+4); + pSource->iOffsetx = mng_get_int32 (pRawdata+5); + pSource->iOffsety = mng_get_int32 (pRawdata+9); + pSource->iBoundarytype = *(pRawdata+13); + pSource->iBoundaryl = mng_get_int32 (pRawdata+14); + pSource->iBoundaryr = mng_get_int32 (pRawdata+18); + pSource->iBoundaryt = mng_get_int32 (pRawdata+22); + pSource->iBoundaryb = mng_get_int32 (pRawdata+26); + + pSource++; + pRawdata += 30; + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +MNG_C_SPECIALFUNC (mng_special_past) +{ +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ani_past (pData, pChunk); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +MNG_F_SPECIALFUNC (mng_disc_entries) +{ + mng_discp pDISC = (mng_discp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + + if ((iRawlen % 2) != 0) /* check the length */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pDISC->iCount = (iRawlen / sizeof (mng_uint16)); + + if (pDISC->iCount) + { + MNG_ALLOC (pData, pDISC->pObjectids, iRawlen); + +#ifndef MNG_BIGENDIAN_SUPPORTED + { + mng_uint32 iX; + mng_uint8p pIn = pRawdata; + mng_uint16p pOut = pDISC->pObjectids; + + for (iX = pDISC->iCount; iX > 0; iX--) + { + *pOut++ = mng_get_uint16 (pIn); + pIn += 2; + } + } +#else + MNG_COPY (pDISC->pObjectids, pRawdata, iRawlen); +#endif /* !MNG_BIGENDIAN_SUPPORTED */ + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +MNG_C_SPECIALFUNC (mng_special_disc) +{ +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ani_disc (pData, pChunk); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BACK +MNG_C_SPECIALFUNC (mng_special_back) +{ +#ifdef MNG_SUPPORT_DISPLAY + /* retrieve the fields */ + pData->bHasBACK = MNG_TRUE; + pData->iBACKred = ((mng_backp)pChunk)->iRed; + pData->iBACKgreen = ((mng_backp)pChunk)->iGreen; + pData->iBACKblue = ((mng_backp)pChunk)->iBlue; + pData->iBACKmandatory = ((mng_backp)pChunk)->iMandatory; + pData->iBACKimageid = ((mng_backp)pChunk)->iImageid; + pData->iBACKtile = ((mng_backp)pChunk)->iTile; + + return mng_create_ani_back (pData); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +MNG_F_SPECIALFUNC (mng_fram_remainder) +{ + mng_framp pFRAM = (mng_framp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_uint32 iRequired = 0; + + if (iRawlen < 4) /* must have at least 4 bytes */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + iRequired = 4; /* calculate and check required remaining length */ + + pFRAM->iChangedelay = *pRawdata; + pFRAM->iChangetimeout = *(pRawdata+1); + pFRAM->iChangeclipping = *(pRawdata+2); + pFRAM->iChangesyncid = *(pRawdata+3); + + if (pFRAM->iChangedelay ) { iRequired += 4; } + if (pFRAM->iChangetimeout ) { iRequired += 4; } + if (pFRAM->iChangeclipping) { iRequired += 17; } + + if (pFRAM->iChangesyncid) + { + if ((iRawlen - iRequired) % 4 != 0) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else + { + if (iRawlen != iRequired) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + + pRawdata += 4; + + if (pFRAM->iChangedelay) /* delay changed ? */ + { + pFRAM->iDelay = mng_get_uint32 (pRawdata); + pRawdata += 4; + } + + if (pFRAM->iChangetimeout) /* timeout changed ? */ + { + pFRAM->iTimeout = mng_get_uint32 (pRawdata); + pRawdata += 4; + } + + if (pFRAM->iChangeclipping) /* clipping changed ? */ + { + pFRAM->iBoundarytype = *pRawdata; + pFRAM->iBoundaryl = mng_get_int32 (pRawdata+1); + pFRAM->iBoundaryr = mng_get_int32 (pRawdata+5); + pFRAM->iBoundaryt = mng_get_int32 (pRawdata+9); + pFRAM->iBoundaryb = mng_get_int32 (pRawdata+13); + pRawdata += 17; + } + + if (pFRAM->iChangesyncid) + { + pFRAM->iCount = (iRawlen - iRequired) / 4; + + if (pFRAM->iCount) + { + MNG_ALLOC (pData, pFRAM->pSyncids, pFRAM->iCount * 4); + +#ifndef MNG_BIGENDIAN_SUPPORTED + { + mng_uint32 iX; + mng_uint32p pOut = pFRAM->pSyncids; + + for (iX = pFRAM->iCount; iX > 0; iX--) + { + *pOut++ = mng_get_uint32 (pRawdata); + pRawdata += 4; + } + } +#else + MNG_COPY (pFRAM->pSyncids, pRawdata, pFRAM->iCount * 4); +#endif /* !MNG_BIGENDIAN_SUPPORTED */ + } + } + +#ifndef MNG_NO_OLD_VERSIONS + if (pData->bPreDraft48) /* old style input-stream ? */ + { + switch (pFRAM->iMode) /* fix the framing mode then */ + { + case 0: { break; } + case 1: { pFRAM->iMode = 3; break; } + case 2: { pFRAM->iMode = 4; break; } + case 3: { pFRAM->iMode = 1; break; } + case 4: { pFRAM->iMode = 1; break; } + case 5: { pFRAM->iMode = 2; break; } + default: { pFRAM->iMode = 1; break; } + } + } +#endif + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +MNG_C_SPECIALFUNC (mng_special_fram) +{ +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ani_fram (pData, pChunk); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MOVE +MNG_C_SPECIALFUNC (mng_special_move) +{ +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ani_move (pData, pChunk); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLIP +MNG_C_SPECIALFUNC (mng_special_clip) +{ +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ani_clip (pData, pChunk); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SHOW +MNG_C_SPECIALFUNC (mng_special_show) +{ +#ifdef MNG_SUPPORT_DISPLAY + mng_retcode iRetcode; + + if (!((mng_showp)pChunk)->bEmpty) /* any data ? */ + { + if (!((mng_showp)pChunk)->bHaslastid) + ((mng_showp)pChunk)->iLastid = ((mng_showp)pChunk)->iFirstid; + + pData->iSHOWfromid = ((mng_showp)pChunk)->iFirstid; + pData->iSHOWtoid = ((mng_showp)pChunk)->iLastid; + pData->iSHOWmode = ((mng_showp)pChunk)->iMode; + } + else /* use defaults then */ + { + pData->iSHOWfromid = 1; + pData->iSHOWtoid = 65535; + pData->iSHOWmode = 2; + } + /* create a SHOW animation object */ + iRetcode = mng_create_ani_show (pData); + if (!iRetcode) /* go and do it! */ + iRetcode = mng_process_display_show (pData); + +#endif /* MNG_SUPPORT_DISPLAY */ + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_TERM +MNG_C_SPECIALFUNC (mng_special_term) +{ + /* should be behind MHDR or SAVE !! */ + if ((!pData->bHasSAVE) && (pData->iChunkseq > 2)) + { + pData->bMisplacedTERM = MNG_TRUE; /* indicate we found a misplaced TERM */ + /* and send a warning signal!!! */ + MNG_WARNING (pData, MNG_SEQUENCEERROR); + } + + pData->bHasTERM = MNG_TRUE; + + if (pData->fProcessterm) /* inform the app ? */ + if (!pData->fProcessterm (((mng_handle)pData), + ((mng_termp)pChunk)->iTermaction, + ((mng_termp)pChunk)->iIteraction, + ((mng_termp)pChunk)->iDelay, + ((mng_termp)pChunk)->iItermax)) + MNG_ERROR (pData, MNG_APPMISCERROR); + +#ifdef MNG_SUPPORT_DISPLAY + { /* create the TERM ani-object */ + mng_retcode iRetcode = mng_create_ani_term (pData, pChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* save for future reference */ + pData->pTermaniobj = pData->pLastaniobj; + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +MNG_F_SPECIALFUNC (mng_save_entries) +{ + mng_savep pSAVE = (mng_savep)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_save_entryp pEntry = MNG_NULL; + mng_uint32 iCount = 0; + mng_uint8 iOtype = *pRawdata; + mng_uint8 iEtype; + mng_uint8p pTemp; + mng_uint8p pNull; + mng_uint32 iLen; + mng_uint32 iOffset[2]; + mng_uint32 iStarttime[2]; + mng_uint32 iFramenr; + mng_uint32 iLayernr; + mng_uint32 iX; + mng_uint32 iNamesize; + + if ((iOtype != 4) && (iOtype != 8)) + MNG_ERROR (pData, MNG_INVOFFSETSIZE); + + pSAVE->iOffsettype = iOtype; + + for (iX = 0; iX < 2; iX++) /* do this twice to get the count first ! */ + { + pTemp = pRawdata + 1; + iLen = iRawlen - 1; + + if (iX) /* second run ? */ + { + MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_save_entry))); + + pSAVE->iCount = iCount; + pSAVE->pEntries = pEntry; + } + + while (iLen) /* anything left ? */ + { + iEtype = *pTemp; /* entrytype */ + + if ((iEtype != 0) && (iEtype != 1) && (iEtype != 2) && (iEtype != 3)) + MNG_ERROR (pData, MNG_INVENTRYTYPE); + + pTemp++; + + if (iEtype > 1) + { + iOffset [0] = 0; + iOffset [1] = 0; + iStarttime [0] = 0; + iStarttime [1] = 0; + iLayernr = 0; + iFramenr = 0; + } + else + { + if (iOtype == 4) + { + iOffset [0] = 0; + iOffset [1] = mng_get_uint32 (pTemp); + + pTemp += 4; + } + else + { + iOffset [0] = mng_get_uint32 (pTemp); + iOffset [1] = mng_get_uint32 (pTemp+4); + + pTemp += 8; + } + + if (iEtype > 0) + { + iStarttime [0] = 0; + iStarttime [1] = 0; + iLayernr = 0; + iFramenr = 0; + } + else + { + if (iOtype == 4) + { + iStarttime [0] = 0; + iStarttime [1] = mng_get_uint32 (pTemp+0); + iLayernr = mng_get_uint32 (pTemp+4); + iFramenr = mng_get_uint32 (pTemp+8); + + pTemp += 12; + } + else + { + iStarttime [0] = mng_get_uint32 (pTemp+0); + iStarttime [1] = mng_get_uint32 (pTemp+4); + iLayernr = mng_get_uint32 (pTemp+8); + iFramenr = mng_get_uint32 (pTemp+12); + + pTemp += 16; + } + } + } + + pNull = pTemp; /* get the name length */ + while (*pNull) + pNull++; + + if ((pNull - pRawdata) > (mng_int32)iRawlen) + { + iNamesize = iLen; /* no null found; so end of SAVE */ + iLen = 0; + } + else + { + iNamesize = pNull - pTemp; /* should be another entry */ + iLen -= iNamesize; + + if (!iLen) /* must not end with a null ! */ + MNG_ERROR (pData, MNG_ENDWITHNULL); + } + + if (!pEntry) + { + iCount++; + } + else + { + pEntry->iEntrytype = iEtype; + pEntry->iOffset [0] = iOffset [0]; + pEntry->iOffset [1] = iOffset [1]; + pEntry->iStarttime [0] = iStarttime [0]; + pEntry->iStarttime [1] = iStarttime [1]; + pEntry->iLayernr = iLayernr; + pEntry->iFramenr = iFramenr; + pEntry->iNamesize = iNamesize; + + if (iNamesize) + { + MNG_ALLOC (pData, pEntry->zName, iNamesize+1); + MNG_COPY (pEntry->zName, pTemp, iNamesize); + } + + pEntry++; + } + + pTemp += iNamesize; + } + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +MNG_C_SPECIALFUNC (mng_special_save) +{ + pData->bHasSAVE = MNG_TRUE; + + if (pData->fProcesssave) /* inform the application ? */ + { + mng_bool bOke = pData->fProcesssave ((mng_handle)pData); + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + + /* TODO: something with the parameters */ + + /* create a SAVE animation object */ + iRetcode = mng_create_ani_save (pData); + if (!iRetcode) /* process it */ + iRetcode = mng_process_display_save (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +MNG_C_SPECIALFUNC (mng_special_seek) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_DISPLAY + /* create a SEEK animation object */ + iRetcode = mng_create_ani_seek (pData, pChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + +#endif /* MNG_SUPPORT_DISPLAY */ + + if (pData->fProcessseek) /* inform the app ? */ + if (!pData->fProcessseek ((mng_handle)pData, ((mng_seekp)pChunk)->zName)) + MNG_ERROR (pData, MNG_APPMISCERROR); + +#ifdef MNG_SUPPORT_DISPLAY + return mng_process_display_seek (pData); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +MNG_C_SPECIALFUNC (mng_special_expi) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_fPRI +MNG_C_SPECIALFUNC (mng_special_fpri) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +MNG_LOCAL mng_bool CheckKeyword (mng_datap pData, + mng_uint8p pKeyword) +{ + mng_chunkid handled_chunks [] = + { + MNG_UINT_BACK, /* keep it sorted !!!! */ + MNG_UINT_BASI, + MNG_UINT_CLIP, + MNG_UINT_CLON, +#ifndef MNG_NO_DELTA_PNG +/* TODO: MNG_UINT_DBYK, */ +#endif + MNG_UINT_DEFI, +#ifndef MNG_NO_DELTA_PNG + MNG_UINT_DHDR, +#endif + MNG_UINT_DISC, +#ifndef MNG_NO_DELTA_PNG +/* TODO: MNG_UINT_DROP, */ +#endif + MNG_UINT_ENDL, + MNG_UINT_FRAM, + MNG_UINT_IDAT, + MNG_UINT_IEND, + MNG_UINT_IHDR, +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG + MNG_UINT_IJNG, +#endif + MNG_UINT_IPNG, +#endif +#ifdef MNG_INCLUDE_JNG + MNG_UINT_JDAA, + MNG_UINT_JDAT, + MNG_UINT_JHDR, +/* TODO: MNG_UINT_JSEP, */ + MNG_UINT_JdAA, +#endif + MNG_UINT_LOOP, + MNG_UINT_MAGN, + MNG_UINT_MEND, + MNG_UINT_MHDR, + MNG_UINT_MOVE, +/* TODO: MNG_UINT_ORDR, */ + MNG_UINT_PAST, + MNG_UINT_PLTE, +#ifndef MNG_NO_DELTA_PNG + MNG_UINT_PPLT, + MNG_UINT_PROM, +#endif + MNG_UINT_SAVE, + MNG_UINT_SEEK, + MNG_UINT_SHOW, + MNG_UINT_TERM, + MNG_UINT_bKGD, + MNG_UINT_cHRM, +/* TODO: MNG_UINT_eXPI, */ + MNG_UINT_evNT, +/* TODO: MNG_UINT_fPRI, */ + MNG_UINT_gAMA, +/* TODO: MNG_UINT_hIST, */ + MNG_UINT_iCCP, + MNG_UINT_iTXt, + MNG_UINT_nEED, +/* TODO: MNG_UINT_oFFs, */ +/* TODO: MNG_UINT_pCAL, */ +/* TODO: MNG_UINT_pHYg, */ +/* TODO: MNG_UINT_pHYs, */ +/* TODO: MNG_UINT_sBIT, */ +/* TODO: MNG_UINT_sCAL, */ +/* TODO: MNG_UINT_sPLT, */ + MNG_UINT_sRGB, + MNG_UINT_tEXt, + MNG_UINT_tIME, + MNG_UINT_tRNS, + MNG_UINT_zTXt, + }; + + mng_bool bOke = MNG_FALSE; + + if (pData->fProcessneed) /* does the app handle it ? */ + bOke = pData->fProcessneed ((mng_handle)pData, (mng_pchar)pKeyword); + + if (!bOke) + { /* find the keyword length */ + mng_uint8p pNull = pKeyword; + while (*pNull) + pNull++; + + if ((pNull - pKeyword) == 4) /* test a chunk ? */ + { /* get the chunk-id */ + mng_chunkid iChunkid = (*pKeyword << 24) + (*(pKeyword+1) << 16) + + (*(pKeyword+2) << 8) + (*(pKeyword+3) ); + /* binary search variables */ + mng_int32 iTop, iLower, iUpper, iMiddle; + /* determine max index of table */ + iTop = (sizeof (handled_chunks) / sizeof (handled_chunks [0])) - 1; + + /* binary search; with 52 chunks, worst-case is 7 comparisons */ + iLower = 0; + iMiddle = iTop >> 1; + iUpper = iTop; + + do /* the binary search itself */ + { + if (handled_chunks [iMiddle] < iChunkid) + iLower = iMiddle + 1; + else if (handled_chunks [iMiddle] > iChunkid) + iUpper = iMiddle - 1; + else + { + bOke = MNG_TRUE; + break; + } + + iMiddle = (iLower + iUpper) >> 1; + } + while (iLower <= iUpper); + } + /* test draft ? */ + if ((!bOke) && ((pNull - pKeyword) == 8) && + (*pKeyword == 'd') && (*(pKeyword+1) == 'r') && + (*(pKeyword+2) == 'a') && (*(pKeyword+3) == 'f') && + (*(pKeyword+4) == 't') && (*(pKeyword+5) == ' ')) + { + mng_uint32 iDraft; + + iDraft = (*(pKeyword+6) - '0') * 10 + (*(pKeyword+7) - '0'); + bOke = (mng_bool)(iDraft <= MNG_MNG_DRAFT); + } + /* test MNG 1.0/1.1 ? */ + if ((!bOke) && ((pNull - pKeyword) == 7) && + (*pKeyword == 'M') && (*(pKeyword+1) == 'N') && + (*(pKeyword+2) == 'G') && (*(pKeyword+3) == '-') && + (*(pKeyword+4) == '1') && (*(pKeyword+5) == '.') && + ((*(pKeyword+6) == '0') || (*(pKeyword+6) == '1'))) + bOke = MNG_TRUE; + /* test CACHEOFF ? */ + if ((!bOke) && ((pNull - pKeyword) == 8) && + (*pKeyword == 'C') && (*(pKeyword+1) == 'A') && + (*(pKeyword+2) == 'C') && (*(pKeyword+3) == 'H') && + (*(pKeyword+4) == 'E') && (*(pKeyword+5) == 'O') && + (*(pKeyword+6) == 'F') && (*(pKeyword+7) == 'F')) + { + if (!pData->pFirstaniobj) /* only if caching hasn't started yet ! */ + { + bOke = MNG_TRUE; + pData->bCacheplayback = MNG_FALSE; + pData->bStorechunks = MNG_FALSE; + } + } + } + + return bOke; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +MNG_C_SPECIALFUNC (mng_special_need) +{ + /* let's check it */ + mng_bool bOke = MNG_TRUE; + mng_uint8p pNull, pTemp, pMax; + + pTemp = (mng_uint8p)((mng_needp)pChunk)->zKeywords; + pMax = (mng_uint8p)(pTemp + ((mng_needp)pChunk)->iKeywordssize); + pNull = pTemp; + while (*pNull) + pNull++; + + while ((bOke) && (pNull < pMax)) + { + bOke = CheckKeyword (pData, pTemp); + pTemp = pNull + 1; + pNull = pTemp; + while (*pNull) + pNull++; + } + + if (bOke) + bOke = CheckKeyword (pData, pTemp); + + if (!bOke) + MNG_ERROR (pData, MNG_UNSUPPORTEDNEED); + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYg +MNG_C_SPECIALFUNC (mng_special_phyg) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_C_SPECIALFUNC (mng_special_dhdr) +{ + if ((((mng_dhdrp)pChunk)->iDeltatype == MNG_DELTATYPE_REPLACE) && (((mng_dhdrp)pChunk)->bHasblockloc)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + if ((((mng_dhdrp)pChunk)->iDeltatype == MNG_DELTATYPE_NOCHANGE) && (((mng_dhdrp)pChunk)->bHasblocksize)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pData->bHasDHDR = MNG_TRUE; /* inside a DHDR-IEND block now */ + pData->iDeltatype = ((mng_dhdrp)pChunk)->iDeltatype; + + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ani_dhdr (pData, pChunk); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_C_SPECIALFUNC (mng_special_prom) +{ + if ((((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_GRAY ) && + (((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_RGB ) && + (((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_INDEXED) && + (((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_GRAYA ) && + (((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_RGBA ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + +#ifdef MNG_NO_16BIT_SUPPORT + if (((mng_promp)pChunk)->iSampledepth == MNG_BITDEPTH_16 ) + ((mng_promp)pChunk)->iSampledepth = MNG_BITDEPTH_8; +#endif + + if ((((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_1 ) && + (((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_2 ) && + (((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_4 ) && + (((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_8 ) +#ifndef MNG_NO_16BIT_SUPPORT + && (((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_16) +#endif + ) + MNG_ERROR (pData, MNG_INVSAMPLEDEPTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode = mng_create_ani_prom (pData, pChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_C_SPECIALFUNC (mng_special_ipng) +{ +#ifdef MNG_SUPPORT_DISPLAY + mng_retcode iRetcode = mng_create_ani_ipng (pData); + if (!iRetcode) /* process it */ + iRetcode = mng_process_display_ipng (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_F_SPECIALFUNC (mng_pplt_entries) +{ + mng_ppltp pPPLT = (mng_ppltp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_uint8 iDeltatype = pPPLT->iDeltatype; + mng_uint32 iMax = 0; + mng_int32 iX, iY, iM; + mng_rgbpaltab aIndexentries; + mng_uint8arr aAlphaentries; + mng_uint8arr aUsedentries; + /* must be indexed color ! */ + if (pData->iColortype != MNG_COLORTYPE_INDEXED) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + for (iY = 255; iY >= 0; iY--) /* reset arrays */ + { + aIndexentries [iY].iRed = 0; + aIndexentries [iY].iGreen = 0; + aIndexentries [iY].iBlue = 0; + aAlphaentries [iY] = 255; + aUsedentries [iY] = 0; + } + + while (iRawlen) /* as long as there are entries left ... */ + { + mng_uint32 iDiff; + + if (iRawlen < 2) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + iX = (mng_int32)(*pRawdata); /* get start and end index */ + iM = (mng_int32)(*(pRawdata+1)); + + if (iM < iX) + MNG_ERROR (pData, MNG_INVALIDINDEX); + + if (iM >= (mng_int32) iMax) /* determine highest used index */ + iMax = iM + 1; + + pRawdata += 2; + iRawlen -= 2; + iDiff = (iM - iX + 1); + if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) || + (iDeltatype == MNG_DELTATYPE_DELTARGB ) ) + iDiff = iDiff * 3; + else + if ((iDeltatype == MNG_DELTATYPE_REPLACERGBA) || + (iDeltatype == MNG_DELTATYPE_DELTARGBA ) ) + iDiff = iDiff * 4; + + if (iRawlen < iDiff) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) || + (iDeltatype == MNG_DELTATYPE_DELTARGB ) ) + { + for (iY = iX; iY <= iM; iY++) + { + aIndexentries [iY].iRed = *pRawdata; + aIndexentries [iY].iGreen = *(pRawdata+1); + aIndexentries [iY].iBlue = *(pRawdata+2); + aUsedentries [iY] = 1; + + pRawdata += 3; + iRawlen -= 3; + } + } + else + if ((iDeltatype == MNG_DELTATYPE_REPLACEALPHA) || + (iDeltatype == MNG_DELTATYPE_DELTAALPHA ) ) + { + for (iY = iX; iY <= iM; iY++) + { + aAlphaentries [iY] = *pRawdata; + aUsedentries [iY] = 1; + + pRawdata++; + iRawlen--; + } + } + else + { + for (iY = iX; iY <= iM; iY++) + { + aIndexentries [iY].iRed = *pRawdata; + aIndexentries [iY].iGreen = *(pRawdata+1); + aIndexentries [iY].iBlue = *(pRawdata+2); + aAlphaentries [iY] = *(pRawdata+3); + aUsedentries [iY] = 1; + + pRawdata += 4; + iRawlen -= 4; + } + } + } + + switch (pData->iBitdepth) /* check maximum allowed entries for bitdepth */ + { + case MNG_BITDEPTH_1 : { + if (iMax > 2) + MNG_ERROR (pData, MNG_INVALIDINDEX); + break; + } + case MNG_BITDEPTH_2 : { + if (iMax > 4) + MNG_ERROR (pData, MNG_INVALIDINDEX); + break; + } + case MNG_BITDEPTH_4 : { + if (iMax > 16) + MNG_ERROR (pData, MNG_INVALIDINDEX); + break; + } + } + + pPPLT->iCount = iMax; + + for (iY = 255; iY >= 0; iY--) + { + pPPLT->aEntries [iY].iRed = aIndexentries [iY].iRed; + pPPLT->aEntries [iY].iGreen = aIndexentries [iY].iGreen; + pPPLT->aEntries [iY].iBlue = aIndexentries [iY].iBlue; + pPPLT->aEntries [iY].iAlpha = aAlphaentries [iY]; + pPPLT->aEntries [iY].bUsed = (mng_bool)(aUsedentries [iY]); + } + + { /* create animation object */ + mng_retcode iRetcode = mng_create_ani_pplt (pData, iDeltatype, iMax, + aIndexentries, aAlphaentries, + aUsedentries); + if (iRetcode) + return iRetcode; + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_C_SPECIALFUNC (mng_special_pplt) +{ + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +MNG_C_SPECIALFUNC (mng_special_ijng) +{ +#ifdef MNG_SUPPORT_DISPLAY + mng_retcode iRetcode = mng_create_ani_ijng (pData); + if (!iRetcode) /* process it */ + iRetcode = mng_process_display_ijng (pData); + return iRetcode; +#else + return MNG_NOERROR; /* done */ +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_F_SPECIALFUNC (mng_drop_entries) +{ + mng_dropp pDROP = (mng_dropp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_uint32 iX; + mng_uint32p pEntry; + /* check length */ + if ((iRawlen < 4) || ((iRawlen % 4) != 0)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + MNG_ALLOC (pData, pEntry, iRawlen); + pDROP->iCount = iRawlen / 4; + pDROP->pChunknames = (mng_ptr)pEntry; + + for (iX = pDROP->iCount; iX > 0; iX--) + { + *pEntry++ = mng_get_uint32 (pRawdata); + pRawdata += 4; + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +MNG_C_SPECIALFUNC (mng_special_drop) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +MNG_C_SPECIALFUNC (mng_special_dbyk) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +MNG_F_SPECIALFUNC (mng_ordr_entries) +{ + mng_ordrp pORDR = (mng_ordrp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_uint32 iX; + mng_ordr_entryp pEntry; + /* check length */ + if ((iRawlen < 5) || ((iRawlen % 5) != 0)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + MNG_ALLOC (pData, pEntry, iRawlen); + pORDR->iCount = iRawlen / 5; + pORDR->pEntries = (mng_ptr)pEntry; + + for (iX = pORDR->iCount; iX > 0; iX--) + { + pEntry->iChunkname = mng_get_uint32 (pRawdata); + pEntry->iOrdertype = *(pRawdata+4); + pEntry++; + pRawdata += 5; + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +MNG_C_SPECIALFUNC (mng_special_ordr) +{ +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +MNG_F_SPECIALFUNC (mng_debunk_magn) +{ + mng_magnp pMAGN = (mng_magnp)pChunk; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_bool bFaulty; + /* check length */ + if (iRawlen > 20) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + /* following is an ugly hack to allow faulty layout caused by previous + versions of libmng and MNGeye, which wrote MAGN with a 16-bit + MethodX/MethodY (as opposed to the proper 8-bit as defined in the spec!) */ + + if ((iRawlen == 6) || (iRawlen == 8) || (iRawlen == 10) || (iRawlen == 12) || + (iRawlen == 14) || (iRawlen == 16) || (iRawlen == 20)) + bFaulty = MNG_TRUE; /* these lengths are all wrong */ + else /* length 18 can be right or wrong !!! */ + if ((iRawlen == 18) && (mng_get_uint16 (pRawdata+4) <= 5) && + (mng_get_uint16 (pRawdata+6) < 256) && + (mng_get_uint16 (pRawdata+8) < 256) && + (mng_get_uint16 (pRawdata+10) < 256) && + (mng_get_uint16 (pRawdata+12) < 256) && + (mng_get_uint16 (pRawdata+14) < 256) && + (mng_get_uint16 (pRawdata+16) < 256)) + bFaulty = MNG_TRUE; /* this is very likely the wrong layout */ + else + bFaulty = MNG_FALSE; /* all other cases are handled as right */ + + if (bFaulty) /* wrong layout ? */ + { + if (iRawlen > 0) /* get the fields */ + pMAGN->iFirstid = mng_get_uint16 (pRawdata); + else + pMAGN->iFirstid = 0; + + if (iRawlen > 2) + pMAGN->iLastid = mng_get_uint16 (pRawdata+2); + else + pMAGN->iLastid = pMAGN->iFirstid; + + if (iRawlen > 4) + pMAGN->iMethodX = (mng_uint8)(mng_get_uint16 (pRawdata+4)); + else + pMAGN->iMethodX = 0; + + if (iRawlen > 6) + pMAGN->iMX = mng_get_uint16 (pRawdata+6); + else + pMAGN->iMX = 1; + + if (iRawlen > 8) + pMAGN->iMY = mng_get_uint16 (pRawdata+8); + else + pMAGN->iMY = pMAGN->iMX; + + if (iRawlen > 10) + pMAGN->iML = mng_get_uint16 (pRawdata+10); + else + pMAGN->iML = pMAGN->iMX; + + if (iRawlen > 12) + pMAGN->iMR = mng_get_uint16 (pRawdata+12); + else + pMAGN->iMR = pMAGN->iMX; + + if (iRawlen > 14) + pMAGN->iMT = mng_get_uint16 (pRawdata+14); + else + pMAGN->iMT = pMAGN->iMY; + + if (iRawlen > 16) + pMAGN->iMB = mng_get_uint16 (pRawdata+16); + else + pMAGN->iMB = pMAGN->iMY; + + if (iRawlen > 18) + pMAGN->iMethodY = (mng_uint8)(mng_get_uint16 (pRawdata+18)); + else + pMAGN->iMethodY = pMAGN->iMethodX; + } + else /* proper layout !!!! */ + { + if (iRawlen > 0) /* get the fields */ + pMAGN->iFirstid = mng_get_uint16 (pRawdata); + else + pMAGN->iFirstid = 0; + + if (iRawlen > 2) + pMAGN->iLastid = mng_get_uint16 (pRawdata+2); + else + pMAGN->iLastid = pMAGN->iFirstid; + + if (iRawlen > 4) + pMAGN->iMethodX = *(pRawdata+4); + else + pMAGN->iMethodX = 0; + + if (iRawlen > 5) + pMAGN->iMX = mng_get_uint16 (pRawdata+5); + else + pMAGN->iMX = 1; + + if (iRawlen > 7) + pMAGN->iMY = mng_get_uint16 (pRawdata+7); + else + pMAGN->iMY = pMAGN->iMX; + + if (iRawlen > 9) + pMAGN->iML = mng_get_uint16 (pRawdata+9); + else + pMAGN->iML = pMAGN->iMX; + + if (iRawlen > 11) + pMAGN->iMR = mng_get_uint16 (pRawdata+11); + else + pMAGN->iMR = pMAGN->iMX; + + if (iRawlen > 13) + pMAGN->iMT = mng_get_uint16 (pRawdata+13); + else + pMAGN->iMT = pMAGN->iMY; + + if (iRawlen > 15) + pMAGN->iMB = mng_get_uint16 (pRawdata+15); + else + pMAGN->iMB = pMAGN->iMY; + + if (iRawlen > 17) + pMAGN->iMethodY = *(pRawdata+17); + else + pMAGN->iMethodY = pMAGN->iMethodX; + } + /* check field validity */ + if ((pMAGN->iMethodX > 5) || (pMAGN->iMethodY > 5)) + MNG_ERROR (pData, MNG_INVALIDMETHOD); + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +MNG_C_SPECIALFUNC (mng_special_magn) +{ +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ani_magn (pData, pChunk); +#else + return MNG_NOERROR; +#endif /* MNG_SUPPORT_DISPLAY */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +MNG_F_SPECIALFUNC (mng_evnt_entries) +{ + mng_evntp pEVNT = (mng_evntp)pChunk; + mng_uint32 iRawlen; + mng_uint8p pRawdata; +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG) + mng_retcode iRetcode; +#endif + mng_uint8p pNull; + mng_uint8 iEventtype; + mng_uint8 iMasktype; + mng_int32 iLeft; + mng_int32 iRight; + mng_int32 iTop; + mng_int32 iBottom; + mng_uint16 iObjectid; + mng_uint8 iIndex; + mng_uint32 iNamesize; + mng_uint32 iCount = 0; + mng_evnt_entryp pEntry = MNG_NULL; + mng_uint32 iX; + + for (iX = 0; iX < 2; iX++) + { + iRawlen = *piRawlen; + pRawdata = *ppRawdata; + + if (iX) /* second run ? */ + { + MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_evnt_entry))); + pEVNT->iCount = iCount; + pEVNT->pEntries = pEntry; + } + + while (iRawlen) /* anything left ? */ + { + if (iRawlen < 2) /* must have at least 2 bytes ! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + iEventtype = *pRawdata; /* eventtype */ + if (iEventtype > 5) + MNG_ERROR (pData, MNG_INVALIDEVENT); + + pRawdata++; + + iMasktype = *pRawdata; /* masktype */ + if (iMasktype > 5) + MNG_ERROR (pData, MNG_INVALIDMASK); + + pRawdata++; + iRawlen -= 2; + + iLeft = 0; + iRight = 0; + iTop = 0; + iBottom = 0; + iObjectid = 0; + iIndex = 0; + + switch (iMasktype) + { + case 1 : + { + if (iRawlen > 16) + { + iLeft = mng_get_int32 (pRawdata); + iRight = mng_get_int32 (pRawdata+4); + iTop = mng_get_int32 (pRawdata+8); + iBottom = mng_get_int32 (pRawdata+12); + pRawdata += 16; + iRawlen -= 16; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 2 : + { + if (iRawlen > 2) + { + iObjectid = mng_get_uint16 (pRawdata); + pRawdata += 2; + iRawlen -= 2; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 3 : + { + if (iRawlen > 3) + { + iObjectid = mng_get_uint16 (pRawdata); + iIndex = *(pRawdata+2); + pRawdata += 3; + iRawlen -= 3; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 4 : + { + if (iRawlen > 18) + { + iLeft = mng_get_int32 (pRawdata); + iRight = mng_get_int32 (pRawdata+4); + iTop = mng_get_int32 (pRawdata+8); + iBottom = mng_get_int32 (pRawdata+12); + iObjectid = mng_get_uint16 (pRawdata+16); + pRawdata += 18; + iRawlen -= 18; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 5 : + { + if (iRawlen > 19) + { + iLeft = mng_get_int32 (pRawdata); + iRight = mng_get_int32 (pRawdata+4); + iTop = mng_get_int32 (pRawdata+8); + iBottom = mng_get_int32 (pRawdata+12); + iObjectid = mng_get_uint16 (pRawdata+16); + iIndex = *(pRawdata+18); + pRawdata += 19; + iRawlen -= 19; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + } + + pNull = pRawdata; /* get the name length */ + while (*pNull) + pNull++; + + if ((pNull - pRawdata) > (mng_int32)iRawlen) + { + iNamesize = iRawlen; /* no null found; so end of evNT */ + iRawlen = 0; + } + else + { + iNamesize = pNull - pRawdata; /* should be another entry */ + iRawlen = iRawlen - iNamesize - 1; + + if (!iRawlen) /* must not end with a null ! */ + MNG_ERROR (pData, MNG_ENDWITHNULL); + } + + if (!iX) + { + iCount++; + } + else + { + pEntry->iEventtype = iEventtype; + pEntry->iMasktype = iMasktype; + pEntry->iLeft = iLeft; + pEntry->iRight = iRight; + pEntry->iTop = iTop; + pEntry->iBottom = iBottom; + pEntry->iObjectid = iObjectid; + pEntry->iIndex = iIndex; + pEntry->iSegmentnamesize = iNamesize; + + if (iNamesize) + { + MNG_ALLOC (pData, pEntry->zSegmentname, iNamesize+1); + MNG_COPY (pEntry->zSegmentname, pRawdata, iNamesize); + } + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG) + iRetcode = mng_create_event (pData, (mng_ptr)pEntry); + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif + + pEntry++; + } + + pRawdata = pRawdata + iNamesize + 1; + } + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +MNG_C_SPECIALFUNC (mng_special_evnt) +{ + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_C_SPECIALFUNC (mng_special_mpng) +{ + if ((pData->eImagetype != mng_it_png) && (pData->eImagetype != mng_it_jng)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_mpng_obj (pData, pChunk); +#else + return MNG_NOERROR; +#endif +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +MNG_C_SPECIALFUNC (mng_special_ahdr) +{ +#ifdef MNG_SUPPORT_DISPLAY + return mng_create_ang_obj (pData, pChunk); +#else + return MNG_NOERROR; +#endif +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +MNG_F_SPECIALFUNC (mng_adat_tiles) +{ + if ((pData->eImagetype != mng_it_ang) || (!pData->pANG)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + + { + mng_adatp pADAT = (mng_adatp)pChunk; + mng_ang_objp pANG = (mng_ang_objp)pData->pANG; + mng_uint32 iRawlen = *piRawlen; + mng_uint8p pRawdata = *ppRawdata; + mng_retcode iRetcode; + mng_uint8p pBuf; + mng_uint32 iBufsize; + mng_uint32 iRealsize; + mng_uint8p pTemp; + mng_uint8p pTemp2; + mng_int32 iX; + mng_int32 iSize; + +#ifdef MNG_SUPPORT_DISPLAY + mng_imagep pImage; + mng_int32 iTemplen; + mng_uint8p pSwap; + + mng_processobject pProcess; + + mng_uint32 iSavedatawidth; + mng_uint32 iSavedataheight; + + mng_fptr fSaveinitrowproc; + mng_fptr fSavestorerow; + mng_fptr fSaveprocessrow; + mng_fptr fSavedifferrow; + mng_imagep fSavestoreobj; + mng_imagedatap fSavestorebuf; + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + png_imgtype eSavepngimgtype; +#endif + + mng_uint8 iSaveinterlace; + mng_int8 iSavepass; + mng_int32 iSaverow; + mng_int32 iSaverowinc; + mng_int32 iSavecol; + mng_int32 iSavecolinc; + mng_int32 iSaverowsamples; + mng_int32 iSavesamplemul; + mng_int32 iSavesampleofs; + mng_int32 iSavesamplediv; + mng_int32 iSaverowsize; + mng_int32 iSaverowmax; + mng_int32 iSavefilterofs; + mng_int32 iSavepixelofs; + mng_uint32 iSavelevel0; + mng_uint32 iSavelevel1; + mng_uint32 iSavelevel2; + mng_uint32 iSavelevel3; + mng_uint8p pSaveworkrow; + mng_uint8p pSaveprevrow; + mng_uint8p pSaverGBArow; + mng_bool bSaveisRGBA16; + mng_bool bSaveisOpaque; + mng_int32 iSavefilterbpp; + + mng_int32 iSavedestl; + mng_int32 iSavedestt; + mng_int32 iSavedestr; + mng_int32 iSavedestb; + mng_int32 iSavesourcel; + mng_int32 iSavesourcet; + mng_int32 iSavesourcer; + mng_int32 iSavesourceb; +#endif /* MNG_SUPPORT_DISPLAY */ + + iRetcode = mng_inflate_buffer (pData, pRawdata, iRawlen, + &pBuf, &iBufsize, &iRealsize); + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + /* get buffer for tile info in ADAT chunk */ + pADAT->iTilessize = pANG->iNumframes * sizeof(mng_adat_tile); + MNG_ALLOCX (pData, pADAT->pTiles, pADAT->iTilessize); + if (!pADAT->pTiles) + { + pADAT->iTilessize = 0; + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + pTemp = pBuf; + pTemp2 = (mng_uint8p)pADAT->pTiles; + + if (!pANG->iStillused) + iSize = 12; + else + iSize = 13; + + for (iX = 0; iX < pANG->iNumframes; iX++) + { + MNG_COPY (pTemp2, pTemp, iSize); + pTemp += iSize; + pTemp2 += sizeof(mng_adat_tile); + } + +#ifdef MNG_SUPPORT_DISPLAY + /* get buffer for tile info in ANG object */ + pANG->iTilessize = pADAT->iTilessize; + MNG_ALLOCX (pData, pANG->pTiles, pANG->iTilessize); + if (!pANG->pTiles) + { + pANG->iTilessize = 0; + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + /* copy it from the ADAT object */ + MNG_COPY (pANG->pTiles, pADAT->pTiles, pANG->iTilessize); + + /* save IDAT work-parms */ + fSaveinitrowproc = pData->fInitrowproc; + fSavestorerow = pData->fDisplayrow; + fSaveprocessrow = pData->fProcessrow; + fSavedifferrow = pData->fDifferrow; + fSavestoreobj = pData->pStoreobj; + fSavestorebuf = pData->pStorebuf; + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + eSavepngimgtype = pData->ePng_imgtype; +#endif + + iSavedatawidth = pData->iDatawidth; + iSavedataheight = pData->iDataheight; + iSaveinterlace = pData->iInterlace; + iSavepass = pData->iPass; + iSaverow = pData->iRow; + iSaverowinc = pData->iRowinc; + iSavecol = pData->iCol; + iSavecolinc = pData->iColinc; + iSaverowsamples = pData->iRowsamples; + iSavesamplemul = pData->iSamplemul; + iSavesampleofs = pData->iSampleofs; + iSavesamplediv = pData->iSamplediv; + iSaverowsize = pData->iRowsize; + iSaverowmax = pData->iRowmax; + iSavefilterofs = pData->iFilterofs; + iSavepixelofs = pData->iPixelofs; + iSavelevel0 = pData->iLevel0; + iSavelevel1 = pData->iLevel1; + iSavelevel2 = pData->iLevel2; + iSavelevel3 = pData->iLevel3; + pSaveworkrow = pData->pWorkrow; + pSaveprevrow = pData->pPrevrow; + pSaverGBArow = pData->pRGBArow; + bSaveisRGBA16 = pData->bIsRGBA16; + bSaveisOpaque = pData->bIsOpaque; + iSavefilterbpp = pData->iFilterbpp; + iSavedestl = pData->iDestl; + iSavedestt = pData->iDestt; + iSavedestr = pData->iDestr; + iSavedestb = pData->iDestb; + iSavesourcel = pData->iSourcel; + iSavesourcet = pData->iSourcet; + iSavesourcer = pData->iSourcer; + iSavesourceb = pData->iSourceb; + + pData->iDatawidth = pANG->iTilewidth; + pData->iDataheight = pANG->iTileheight; + + pData->iDestl = 0; + pData->iDestt = 0; + pData->iDestr = pANG->iTilewidth; + pData->iDestb = pANG->iTileheight; + pData->iSourcel = 0; + pData->iSourcet = 0; + pData->iSourcer = pANG->iTilewidth; + pData->iSourceb = pANG->iTileheight; + + pData->fInitrowproc = MNG_NULL; + pData->fStorerow = MNG_NULL; + pData->fProcessrow = MNG_NULL; + pData->fDifferrow = MNG_NULL; + + /* clone image object to store the pixel-data from object 0 */ + iRetcode = mng_clone_imageobject (pData, 1, MNG_FALSE, MNG_FALSE, MNG_FALSE, + MNG_FALSE, 0, 0, 0, pData->pObjzero, &pImage); + if (iRetcode) /* on error, drop temp buffer and bail */ + { + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + + /* make sure we got the right dimensions and interlacing */ + iRetcode = mng_reset_object_details (pData, pImage, pANG->iTilewidth, pANG->iTileheight, + pImage->pImgbuf->iBitdepth, pImage->pImgbuf->iColortype, + pImage->pImgbuf->iCompression, pImage->pImgbuf->iFilter, + pANG->iInterlace, MNG_FALSE); + if (iRetcode) /* on error, drop temp buffer and bail */ + { + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + + pData->pStoreobj = pImage; + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + pData->fInitrowproc = (mng_fptr)mng_init_rowproc; + pData->ePng_imgtype = mng_png_imgtype(pData->iColortype,pData->iBitdepth); +#else + switch (pData->iColortype) /* determine row initialization routine */ + { + case 0 : { /* gray */ + switch (pData->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g1_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g1_i; + + break; + } + case 2 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g2_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g2_i; + + break; + } + case 4 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g4_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g4_i; + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g16_i; + + break; + } +#endif + } + + break; + } + case 2 : { /* rgb */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgb8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgb8_i; + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgb16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgb16_i; + + break; + } +#endif + } + + break; + } + case 3 : { /* indexed */ + switch (pData->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx1_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx1_i; + + break; + } + case 2 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx2_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx2_i; + + break; + } + case 4 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx4_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx4_i; + + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx8_i; + + break; + } + } + + break; + } + case 4 : { /* gray+alpha */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_ga8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_ga8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_ga16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_ga16_i; + break; + } +#endif + } + + break; + } + case 6 : { /* rgb+alpha */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgba8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgba8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgba16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgba16_i; + + break; + } +#endif + } + + break; + } + } +#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */ + + pData->iFilterofs = 0; /* determine filter characteristics */ + pData->iLevel0 = 0; /* default levels */ + pData->iLevel1 = 0; + pData->iLevel2 = 0; + pData->iLevel3 = 0; + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + { + switch (pData->iColortype) + { + case 0 : { + if (pData->iBitdepth <= 8) + pData->iFilterofs = 1; + else + pData->iFilterofs = 2; + + break; + } + case 2 : { + if (pData->iBitdepth <= 8) + pData->iFilterofs = 3; + else + pData->iFilterofs = 6; + + break; + } + case 3 : { + pData->iFilterofs = 1; + break; + } + case 4 : { + if (pData->iBitdepth <= 8) + pData->iFilterofs = 2; + else + pData->iFilterofs = 4; + + break; + } + case 6 : { + if (pData->iBitdepth <= 8) + pData->iFilterofs = 4; + else + pData->iFilterofs = 8; + + break; + } + } + } +#endif + +#ifdef FILTER193 /* no adaptive filtering ? */ + if (pData->iFilter == MNG_FILTER_NOFILTER) + pData->iPixelofs = pData->iFilterofs; + else +#endif + pData->iPixelofs = pData->iFilterofs + 1; + + if (pData->fInitrowproc) /* need to initialize row processing? */ + { + iRetcode = ((mng_initrowproc)pData->fInitrowproc) (pData); + if (iRetcode) + { + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + } + /* calculate remainder of buffer */ + pTemp = pBuf + (mng_int32)(pANG->iNumframes * iSize); + iTemplen = iRealsize - (mng_int32)(pANG->iNumframes * iSize); + + do + { + if (iTemplen > pData->iRowmax) /* get a pixel-row from the temp buffer */ + { + MNG_COPY (pData->pWorkrow, pTemp, pData->iRowmax); + } + else + { + MNG_COPY (pData->pWorkrow, pTemp, iTemplen); + } + + { /* image not completed yet ? */ + if (pData->iRow < (mng_int32)pData->iDataheight) + { +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iPNGdepth == 1) + { + /* Inflate Workrow to 8-bit */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8p pDest = pSrc + pData->iRowsize - (pData->iRowsize+7)/8; + + for (iX = ((pData->iRowsize+7)/8) ; iX > 0 ; iX--) + *pDest++ = *pSrc++; + + pDest = pData->pWorkrow+1; + pSrc = pDest + pData->iRowsize - (pData->iRowsize+7)/8; + for (iX = pData->iRowsize; ;) + { + *pDest++ = (((*pSrc)>>7)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>6)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>5)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>4)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>3)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>2)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>1)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc) )&1); + if (iX-- <= 0) + break; + pSrc++; + } + } + else if (pData->iPNGdepth == 2) + { + /* Inflate Workrow to 8-bit */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8p pDest = pSrc + pData->iRowsize - (2*pData->iRowsize+7)/8; + + for (iX = ((2*pData->iRowsize+7)/8) ; iX > 0 ; iX--) + *pDest++ = *pSrc++; + + pDest = pData->pWorkrow+1; + pSrc = pDest + pData->iRowsize - (2*pData->iRowsize+7)/8; + for (iX = pData->iRowsize; ;) + { + *pDest++ = (((*pSrc)>>6)&3); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>4)&3); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>2)&3); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc) )&3); + if (iX-- <= 0) + break; + pSrc++; + } + } + else if (pData->iPNGdepth == 4) + { + /* Inflate Workrow to 8-bit */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8p pDest = pSrc + pData->iRowsize - (4*pData->iRowsize+7)/8; + + for (iX = ((4*pData->iRowsize+7)/8) ; iX > 0 ; iX--) + *pDest++ = *pSrc++; + + pDest = pData->pWorkrow+1; + pSrc = pDest + pData->iRowsize - (4*pData->iRowsize+7)/8; + for (iX = pData->iRowsize; ;) + { + *pDest++ = (((*pSrc)>>4)&0x0f); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc) )&0x0f); + if (iX-- <= 0) + break; + pSrc++; + } + } + if (pData->iPNGdepth < 8 && pData->iColortype == 0) + { + /* Expand samples to 8-bit by LBR */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1}; + + for (iX = pData->iRowsize; iX > 0; iX--) + *pSrc++ *= multiplier[pData->iPNGdepth]; + } +#endif +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iPNGdepth > 8) + { + /* Reduce Workrow to 8-bit */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8p pDest = pSrc; + + for (iX = pData->iRowsize; iX > 0; iX--) + { + *pDest = *pSrc; + pDest++; + pSrc+=2; + } + } +#endif + +#ifdef FILTER192 /* has leveling info ? */ + if (pData->iFilterofs == MNG_FILTER_DIFFERING) + iRetcode = init_rowdiffering (pData); + else +#endif + iRetcode = MNG_NOERROR; + /* filter the row if necessary */ + if ((!iRetcode) && (pData->iFilterofs < pData->iPixelofs ) && + (*(pData->pWorkrow + pData->iFilterofs)) ) + iRetcode = mng_filter_a_row (pData); + + /* additional leveling/differing ? */ + if ((!iRetcode) && (pData->fDifferrow)) + { + iRetcode = ((mng_differrow)pData->fDifferrow) (pData); + + pSwap = pData->pWorkrow; + pData->pWorkrow = pData->pPrevrow; + pData->pPrevrow = pSwap; /* make sure we're processing the right data */ + } + + if (!iRetcode) + { + { /* process this row */ + if ((!iRetcode) && (pData->fProcessrow)) + iRetcode = ((mng_processrow)pData->fProcessrow) (pData); + /* store in object ? */ + if ((!iRetcode) && (pData->fStorerow)) + iRetcode = ((mng_storerow)pData->fStorerow) (pData); + } + } + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, iRetcode); + } + + if (!pData->fDifferrow) /* swap row-pointers */ + { + pSwap = pData->pWorkrow; + pData->pWorkrow = pData->pPrevrow; + pData->pPrevrow = pSwap; /* so prev points to the processed row! */ + } + /* adjust variables for next row */ + iRetcode = mng_next_row (pData); + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, iRetcode); + } + } + } + + pTemp += pData->iRowmax; + iTemplen -= pData->iRowmax; + } /* until some error or EOI + or all pixels received */ + while ( (iTemplen > 0) && + ( (pData->iRow < (mng_int32)pData->iDataheight) || + ( (pData->iPass >= 0) && (pData->iPass < 7) ) ) ); + + mng_cleanup_rowproc (pData); /* cleanup row processing buffers !! */ + + /* restore saved work-parms */ + pData->iDatawidth = iSavedatawidth; + pData->iDataheight = iSavedataheight; + + pData->fInitrowproc = fSaveinitrowproc; + pData->fDisplayrow = fSavestorerow; + pData->fProcessrow = fSaveprocessrow; + pData->fDifferrow = fSavedifferrow; + pData->pStoreobj = fSavestoreobj; + pData->pStorebuf = fSavestorebuf; + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + pData->ePng_imgtype = eSavepngimgtype; +#endif + + pData->iInterlace = iSaveinterlace; + pData->iPass = iSavepass; + pData->iRow = iSaverow; + pData->iRowinc = iSaverowinc; + pData->iCol = iSavecol; + pData->iColinc = iSavecolinc; + pData->iRowsamples = iSaverowsamples; + pData->iSamplemul = iSavesamplemul; + pData->iSampleofs = iSavesampleofs; + pData->iSamplediv = iSavesamplediv; + pData->iRowsize = iSaverowsize; + pData->iRowmax = iSaverowmax; + pData->iFilterofs = iSavefilterofs; + pData->iPixelofs = iSavepixelofs; + pData->iLevel0 = iSavelevel0; + pData->iLevel1 = iSavelevel1; + pData->iLevel2 = iSavelevel2; + pData->iLevel3 = iSavelevel3; + pData->pWorkrow = pSaveworkrow; + pData->pPrevrow = pSaveprevrow; + pData->pRGBArow = pSaverGBArow; + pData->bIsRGBA16 = bSaveisRGBA16; + pData->bIsOpaque = bSaveisOpaque; + pData->iFilterbpp = iSavefilterbpp; + pData->iDestl = iSavedestl; + pData->iDestt = iSavedestt; + pData->iDestr = iSavedestr; + pData->iDestb = iSavedestb; + pData->iSourcel = iSavesourcel; + pData->iSourcet = iSavesourcet; + pData->iSourcer = iSavesourcer; + pData->iSourceb = iSavesourceb; + + /* create the animation directives ! */ + pProcess = (mng_processobject)pANG->sHeader.fProcess; + iRetcode = pProcess (pData, (mng_objectp)pData->pANG); + if (iRetcode) + return iRetcode; + +#endif /* MNG_SUPPORT_DISPLAY */ + + MNG_FREE (pData, pBuf, iBufsize); /* always free the temp buffer ! */ + } + + *piRawlen = 0; + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +MNG_C_SPECIALFUNC (mng_special_adat) +{ + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +MNG_C_SPECIALFUNC (mng_special_unknown) +{ + /* critical chunk ? */ + if ((((mng_uint32)pData->iChunkname & 0x20000000) == 0) +#ifdef MNG_SKIPCHUNK_SAVE + && (pData->iChunkname != MNG_UINT_SAVE) +#endif +#ifdef MNG_SKIPCHUNK_SEEK + && (pData->iChunkname != MNG_UINT_SEEK) +#endif +#ifdef MNG_SKIPCHUNK_DBYK + && (pData->iChunkname != MNG_UINT_DBYK) +#endif +#ifdef MNG_SKIPCHUNK_ORDR + && (pData->iChunkname != MNG_UINT_ORDR) +#endif + ) + MNG_ERROR (pData, MNG_UNKNOWNCRITICAL); + + if (pData->fProcessunknown) /* let the app handle it ? */ + { + mng_bool bOke = pData->fProcessunknown ((mng_handle)pData, pData->iChunkname, + ((mng_unknown_chunkp)pChunk)->iDatasize, + ((mng_unknown_chunkp)pChunk)->pData); + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_READ_PROCS || MNG_INCLUDE_WRITE_PROCS */ +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + + + + + diff --git a/src/3rdparty/libmng/libmng_chunk_descr.h b/src/3rdparty/libmng/libmng_chunk_descr.h new file mode 100644 index 0000000000..3781ab0525 --- /dev/null +++ b/src/3rdparty/libmng/libmng_chunk_descr.h @@ -0,0 +1,146 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_chunk_descr.h copyright (c) 2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Chunk descriptor functions (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : definition of the chunk- anf field-descriptor routines * */ +/* * * */ +/* * changes : 1.0.9 - 12/06/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_chunk_descr_h_ +#define _libmng_chunk_descr_h_ + +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_CHUNKREADER +#if defined(MNG_INCLUDE_READ_PROCS) || defined(MNG_INCLUDE_WRITE_PROCS) + +/* ************************************************************************** */ + +void mng_get_chunkheader (mng_chunkid iChunkname, + mng_chunk_headerp pResult); + +/* ************************************************************************** */ + +#define MNG_F_SPECIALFUNC(n) mng_retcode n (mng_datap pData, \ + mng_chunkp pChunk, \ + mng_uint32* piRawlen, \ + mng_uint8p* ppRawdata) + +MNG_F_SPECIALFUNC (mng_debunk_plte) ; +MNG_F_SPECIALFUNC (mng_debunk_trns) ; +MNG_F_SPECIALFUNC (mng_deflate_itxt) ; +MNG_F_SPECIALFUNC (mng_splt_entries) ; +MNG_F_SPECIALFUNC (mng_hist_entries) ; + +MNG_F_SPECIALFUNC (mng_debunk_loop) ; +MNG_F_SPECIALFUNC (mng_debunk_past) ; +MNG_F_SPECIALFUNC (mng_disc_entries) ; +MNG_F_SPECIALFUNC (mng_fram_remainder) ; +MNG_F_SPECIALFUNC (mng_save_entries) ; +MNG_F_SPECIALFUNC (mng_pplt_entries) ; +MNG_F_SPECIALFUNC (mng_drop_entries) ; +MNG_F_SPECIALFUNC (mng_ordr_entries) ; +MNG_F_SPECIALFUNC (mng_debunk_magn) ; +MNG_F_SPECIALFUNC (mng_evnt_entries) ; +MNG_F_SPECIALFUNC (mng_adat_tiles) ; + +/* ************************************************************************** */ + +#define MNG_C_SPECIALFUNC(n) mng_retcode n (mng_datap pData, \ + mng_chunkp pChunk) + +MNG_C_SPECIALFUNC (mng_special_ihdr) ; +MNG_C_SPECIALFUNC (mng_special_plte) ; +MNG_C_SPECIALFUNC (mng_special_idat) ; +MNG_C_SPECIALFUNC (mng_special_iend) ; +MNG_C_SPECIALFUNC (mng_special_trns) ; +MNG_C_SPECIALFUNC (mng_special_gama) ; +MNG_C_SPECIALFUNC (mng_special_chrm) ; +MNG_C_SPECIALFUNC (mng_special_srgb) ; +MNG_C_SPECIALFUNC (mng_special_iccp) ; +MNG_C_SPECIALFUNC (mng_special_text) ; +MNG_C_SPECIALFUNC (mng_special_ztxt) ; +MNG_C_SPECIALFUNC (mng_special_itxt) ; +MNG_C_SPECIALFUNC (mng_special_bkgd) ; +MNG_C_SPECIALFUNC (mng_special_phys) ; +MNG_C_SPECIALFUNC (mng_special_sbit) ; +MNG_C_SPECIALFUNC (mng_special_splt) ; +MNG_C_SPECIALFUNC (mng_special_hist) ; +MNG_C_SPECIALFUNC (mng_special_time) ; + +MNG_C_SPECIALFUNC (mng_special_jhdr) ; +MNG_C_SPECIALFUNC (mng_special_jdaa) ; +MNG_C_SPECIALFUNC (mng_special_jdat) ; +MNG_C_SPECIALFUNC (mng_special_jsep) ; + +MNG_C_SPECIALFUNC (mng_special_mhdr) ; +MNG_C_SPECIALFUNC (mng_special_mend) ; +MNG_C_SPECIALFUNC (mng_special_loop) ; +MNG_C_SPECIALFUNC (mng_special_endl) ; +MNG_C_SPECIALFUNC (mng_special_defi) ; +MNG_C_SPECIALFUNC (mng_special_basi) ; +MNG_C_SPECIALFUNC (mng_special_clon) ; +MNG_C_SPECIALFUNC (mng_special_past) ; +MNG_C_SPECIALFUNC (mng_special_disc) ; +MNG_C_SPECIALFUNC (mng_special_back) ; +MNG_C_SPECIALFUNC (mng_special_fram) ; +MNG_C_SPECIALFUNC (mng_special_move) ; +MNG_C_SPECIALFUNC (mng_special_clip) ; +MNG_C_SPECIALFUNC (mng_special_show) ; +MNG_C_SPECIALFUNC (mng_special_term) ; +MNG_C_SPECIALFUNC (mng_special_save) ; +MNG_C_SPECIALFUNC (mng_special_seek) ; +MNG_C_SPECIALFUNC (mng_special_expi) ; +MNG_C_SPECIALFUNC (mng_special_fpri) ; +MNG_C_SPECIALFUNC (mng_special_need) ; +MNG_C_SPECIALFUNC (mng_special_phyg) ; + +MNG_C_SPECIALFUNC (mng_special_dhdr) ; +MNG_C_SPECIALFUNC (mng_special_prom) ; +MNG_C_SPECIALFUNC (mng_special_ipng) ; +MNG_C_SPECIALFUNC (mng_special_pplt) ; +MNG_C_SPECIALFUNC (mng_special_ijng) ; +MNG_C_SPECIALFUNC (mng_special_drop) ; +MNG_C_SPECIALFUNC (mng_special_dbyk) ; +MNG_C_SPECIALFUNC (mng_special_ordr) ; + +MNG_C_SPECIALFUNC (mng_special_magn) ; +MNG_C_SPECIALFUNC (mng_special_evnt) ; +MNG_C_SPECIALFUNC (mng_special_mpng) ; +MNG_C_SPECIALFUNC (mng_special_ahdr) ; +MNG_C_SPECIALFUNC (mng_special_adat) ; +MNG_C_SPECIALFUNC (mng_special_unknown) ; + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_READ_PROCS) || MNG_INCLUDE_WRITE_PROCS */ +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + +/* ************************************************************************** */ + +#endif /* _libmng_chunk_descr_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_chunk_io.c b/src/3rdparty/libmng/libmng_chunk_io.c new file mode 100644 index 0000000000..eb18099fd6 --- /dev/null +++ b/src/3rdparty/libmng/libmng_chunk_io.c @@ -0,0 +1,10740 @@ +/** ************************************************************************* */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_chunk_io.c copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Chunk I/O routines (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of chunk input/output routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/01/2000 - G.Juyn * */ +/* * - cleaned up left-over teststuff in the BACK chunk routine * */ +/* * 0.5.1 - 05/04/2000 - G.Juyn * */ +/* * - changed CRC initialization to use dynamic structure * */ +/* * (wasn't thread-safe the old way !) * */ +/* * 0.5.1 - 05/06/2000 - G.Juyn * */ +/* * - filled in many missing sequence&length checks * */ +/* * - filled in many missing chunk-store snippets * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - added checks for running animations * */ +/* * - filled some write routines * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/10/2000 - G.Juyn * */ +/* * - filled some more write routines * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - filled remaining write routines * */ +/* * - fixed read_pplt with regard to deltatype * */ +/* * - added callback error-reporting support * */ +/* * - added pre-draft48 support (short MHDR, frame_mode, LOOP) * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * - fixed chunk-storage bit in several routines * */ +/* * 0.5.1 - 05/13/2000 - G.Juyn * */ +/* * - added eMNGma hack (will be removed in 1.0.0 !!!) * */ +/* * - added TERM animation object pointer (easier reference) * */ +/* * - supplemented the SAVE & SEEK display processing * */ +/* * * */ +/* * 0.5.2 - 05/18/2000 - G.Juyn * */ +/* * - B004 - fixed problem with MNG_SUPPORT_WRITE not defined * */ +/* * also for MNG_SUPPORT_WRITE without MNG_INCLUDE_JNG * */ +/* * 0.5.2 - 05/19/2000 - G.Juyn * */ +/* * - cleaned up some code regarding mixed support * */ +/* * 0.5.2 - 05/20/2000 - G.Juyn * */ +/* * - implemented JNG support * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added support for global color-chunks in animation * */ +/* * - added support for global PLTE,tRNS,bKGD in animation * */ +/* * - added support for SAVE & SEEK in animation * */ +/* * 0.5.2 - 05/29/2000 - G.Juyn * */ +/* * - changed ani_create calls not returning object pointer * */ +/* * - create ani objects always (not just inside TERM/LOOP) * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added support for delta-image processing * */ +/* * 0.5.2 - 05/31/2000 - G.Juyn * */ +/* * - fixed up punctuation (contributed by Tim Rowley) * */ +/* * 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - changed SWAP_ENDIAN to BIGENDIAN_SUPPORTED * */ +/* * 0.5.2 - 06/03/2000 - G.Juyn * */ +/* * - fixed makeup for Linux gcc compile * */ +/* * * */ +/* * 0.5.3 - 06/12/2000 - G.Juyn * */ +/* * - added processing of color-info on delta-image * */ +/* * 0.5.3 - 06/13/2000 - G.Juyn * */ +/* * - fixed handling of empty SAVE chunk * */ +/* * 0.5.3 - 06/17/2000 - G.Juyn * */ +/* * - changed to support delta-images * */ +/* * - added extra checks for delta-images * */ +/* * 0.5.3 - 06/20/2000 - G.Juyn * */ +/* * - fixed possible trouble if IEND display-process got * */ +/* * broken up * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added processing of PLTE & tRNS for delta-images * */ +/* * - added administration of imagelevel parameter * */ +/* * 0.5.3 - 06/22/2000 - G.Juyn * */ +/* * - implemented support for PPLT chunk * */ +/* * 0.5.3 - 06/26/2000 - G.Juyn * */ +/* * - added precaution against faulty iCCP chunks from PS * */ +/* * 0.5.3 - 06/29/2000 - G.Juyn * */ +/* * - fixed some 64-bit warnings * */ +/* * * */ +/* * 0.9.1 - 07/14/2000 - G.Juyn * */ +/* * - changed pre-draft48 frame_mode=3 to frame_mode=1 * */ +/* * 0.9.1 - 07/16/2000 - G.Juyn * */ +/* * - fixed storage of images during mng_read() * */ +/* * - fixed support for mng_display() after mng_read() * */ +/* * 0.9.1 - 07/19/2000 - G.Juyn * */ +/* * - fixed several chunk-writing routines * */ +/* * 0.9.1 - 07/24/2000 - G.Juyn * */ +/* * - fixed reading of still-images * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/07/2000 - G.Juyn * */ +/* * - B111300 - fixup for improved portability * */ +/* * 0.9.3 - 08/08/2000 - G.Juyn * */ +/* * - fixed compiler-warnings from Mozilla * */ +/* * 0.9.3 - 08/09/2000 - G.Juyn * */ +/* * - added check for simplicity-bits in MHDR * */ +/* * 0.9.3 - 08/12/2000 - G.Juyn * */ +/* * - fixed check for simplicity-bits in MHDR (JNG) * */ +/* * 0.9.3 - 08/12/2000 - G.Juyn * */ +/* * - added workaround for faulty PhotoShop iCCP chunk * */ +/* * 0.9.3 - 08/22/2000 - G.Juyn * */ +/* * - fixed write-code for zTXt & iTXt * */ +/* * - fixed read-code for iTXt * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * 0.9.3 - 09/10/2000 - G.Juyn * */ +/* * - fixed DEFI behavior * */ +/* * 0.9.3 - 10/02/2000 - G.Juyn * */ +/* * - fixed simplicity-check in compliance with draft 81/0.98a * */ +/* * 0.9.3 - 10/10/2000 - G.Juyn * */ +/* * - added support for alpha-depth prediction * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added support for JDAA * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - fixed support for MAGN * */ +/* * - implemented nEED "xxxx" (where "xxxx" is a chunkid) * */ +/* * - added callback to process non-critical unknown chunks * */ +/* * - fixed support for bKGD * */ +/* * 0.9.3 - 10/23/2000 - G.Juyn * */ +/* * - fixed bug in empty PLTE handling * */ +/* * * */ +/* * 0.9.4 - 11/20/2000 - G.Juyn * */ +/* * - changed IHDR filter_method check for PNGs * */ +/* * 0.9.4 - 1/18/2001 - G.Juyn * */ +/* * - added errorchecking for MAGN methods * */ +/* * - removed test filter-methods 1 & 65 * */ +/* * * */ +/* * 0.9.5 - 1/25/2001 - G.Juyn * */ +/* * - fixed some small compiler warnings (thanks Nikki) * */ +/* * * */ +/* * 1.0.2 - 05/05/2000 - G.Juyn * */ +/* * - B421427 - writes wrong format in bKGD and tRNS * */ +/* * 1.0.2 - 06/20/2000 - G.Juyn * */ +/* * - B434583 - compiler-warning if MNG_STORE_CHUNKS undefined * */ +/* * * */ +/* * 1.0.5 - 07/08/2002 - G.Juyn * */ +/* * - B578572 - removed eMNGma hack (thanks Dimitri!) * */ +/* * 1.0.5 - 08/07/2002 - G.Juyn * */ +/* * - added test-option for PNG filter method 193 (=no filter) * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/07/2002 - G.Juyn * */ +/* * - fixed reading of FRAM with just frame_mode and name * */ +/* * 1.0.5 - 09/13/2002 - G.Juyn * */ +/* * - fixed read/write of MAGN chunk * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - fixed LOOP iteration=0 special case * */ +/* * 1.0.5 - 09/19/2002 - G.Juyn * */ +/* * - misplaced TERM is now treated as warning * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 10/03/2002 - G.Juyn * */ +/* * - fixed chunk-storage for evNT chunk * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - fixed DISC support * */ +/* * - added another fix for misplaced TERM chunk * */ +/* * 1.0.5 - 10/17/2002 - G.Juyn * */ +/* * - fixed initializtion of pIds in dISC read routine * */ +/* * 1.0.5 - 11/06/2002 - G.Juyn * */ +/* * - added support for nEED "MNG 1.1" * */ +/* * - added support for nEED "CACHEOFF" * */ +/* * * */ +/* * 1.0.6 - 05/25/2003 - G.R-P * */ +/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */ +/* * 1.0.6 - 06/02/2003 - G.R-P * */ +/* * - removed some redundant checks for iRawlen==0 * */ +/* * 1.0.6 - 06/22/2003 - G.R-P * */ +/* * - added MNG_NO_16BIT_SUPPORT, MNG_NO_DELTA_PNG reductions * */ +/* * - optionally use zlib's crc32 function instead of * */ +/* * local mng_update_crc * */ +/* * 1.0.6 - 07/14/2003 - G.R-P * */ +/* * - added MNG_NO_LOOP_SIGNALS_SUPPORTED conditional * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * 1.0.6 - 08/17/2003 - G.R-P * */ +/* * - added conditionals around non-VLC chunk support * */ +/* * * */ +/* * 1.0.7 - 10/29/2003 - G.R-P * */ +/* * - revised JDAA and JDAT readers to avoid compiler bug * */ +/* * 1.0.7 - 01/25/2004 - J.S * */ +/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */ +/* * 1.0.7 - 01/27/2004 - J.S * */ +/* * - fixed inclusion of IJNG chunk for non-JNG use * */ +/* * 1.0.7 - 02/26/2004 - G.Juyn * */ +/* * - fixed bug in chunk-storage of SHOW chunk (from == to) * */ +/* * * */ +/* * 1.0.8 - 04/02/2004 - G.Juyn * */ +/* * - added CRC existence & checking flags * */ +/* * 1.0.8 - 07/07/2004 - G.R-P * */ +/* * - change worst-case iAlphadepth to 1 for standalone PNGs * */ +/* * * */ +/* * 1.0.9 - 09/28/2004 - G.R-P * */ +/* * - improved handling of cheap transparency when 16-bit * */ +/* * support is disabled * */ +/* * 1.0.9 - 10/04/2004 - G.Juyn * */ +/* * - fixed bug in writing sBIT for indexed color * */ +/* * 1.0.9 - 10/10/2004 - G.R-P. * */ +/* * - added MNG_NO_1_2_4BIT_SUPPORT * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKINITFREE * */ +/* * 1.0.9 - 12/06/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKASSIGN * */ +/* * 1.0.9 - 12/07/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */ +/* * 1.0.9 - 12/11/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_DISPLAYCALLS * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * 1.0.9 - 01/17/2005 - G.Juyn * */ +/* * - fixed problem with global PLTE/tRNS * */ +/* * * */ +/* * 1.0.10 - 02/07/2005 - G.Juyn * */ +/* * - fixed display routines called twice for FULL_MNG * */ +/* * support in mozlibmngconf.h * */ +/* * 1.0.10 - 12/04/2005 - G.R-P. * */ +/* * - #ifdef out use of mng_inflate_buffer when it is not * */ +/* * available. * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * 1.0.10 - 05/02/2007 - G.Juyn * */ +/* * - fixed inflate_buffer for extreme compression ratios * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_objects.h" +#include "libmng_object_prc.h" +#include "libmng_chunks.h" +#ifdef MNG_CHECK_BAD_ICCP +#include "libmng_chunk_prc.h" +#endif +#include "libmng_memory.h" +#include "libmng_display.h" +#include "libmng_zlib.h" +#include "libmng_pixels.h" +#include "libmng_chunk_io.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ +/* * * */ +/* * CRC - Cyclic Redundancy Check * */ +/* * * */ +/* * The code below is taken directly from the sample provided with the * */ +/* * PNG specification. * */ +/* * (it is only adapted to the library's internal data-definitions) * */ +/* * * */ +/* ************************************************************************** */ +/* Make the table for a fast CRC. */ +#ifndef MNG_USE_ZLIB_CRC +MNG_LOCAL void make_crc_table (mng_datap pData) +{ + mng_uint32 iC; + mng_int32 iN, iK; + + for (iN = 0; iN < 256; iN++) + { + iC = (mng_uint32) iN; + + for (iK = 0; iK < 8; iK++) + { + if (iC & 1) + iC = 0xedb88320U ^ (iC >> 1); + else + iC = iC >> 1; + } + + pData->aCRCtable [iN] = iC; + } + + pData->bCRCcomputed = MNG_TRUE; +} +#endif + +/* Update a running CRC with the bytes buf[0..len-1]--the CRC + should be initialized to all 1's, and the transmitted value + is the 1's complement of the final running CRC (see the + crc() routine below). */ + +MNG_LOCAL mng_uint32 update_crc (mng_datap pData, + mng_uint32 iCrc, + mng_uint8p pBuf, + mng_int32 iLen) +{ +#ifdef MNG_USE_ZLIB_CRC + return crc32 (iCrc, pBuf, iLen); +#else + mng_uint32 iC = iCrc; + mng_int32 iN; + + if (!pData->bCRCcomputed) + make_crc_table (pData); + + for (iN = 0; iN < iLen; iN++) + iC = pData->aCRCtable [(iC ^ pBuf [iN]) & 0xff] ^ (iC >> 8); + + return iC; +#endif +} + +/* Return the CRC of the bytes buf[0..len-1]. */ +mng_uint32 mng_crc (mng_datap pData, + mng_uint8p pBuf, + mng_int32 iLen) +{ +#ifdef MNG_USE_ZLIB_CRC + return update_crc (pData, 0, pBuf, iLen); +#else + return update_crc (pData, 0xffffffffU, pBuf, iLen) ^ 0xffffffffU; +#endif +} + +/* ************************************************************************** */ +/* * * */ +/* * Routines for swapping byte-order from and to graphic files * */ +/* * (This code is adapted from the libpng package) * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_BIGENDIAN_SUPPORTED + +/* ************************************************************************** */ + +mng_uint32 mng_get_uint32 (mng_uint8p pBuf) +{ + mng_uint32 i = ((mng_uint32)(*pBuf) << 24) + + ((mng_uint32)(*(pBuf + 1)) << 16) + + ((mng_uint32)(*(pBuf + 2)) << 8) + + (mng_uint32)(*(pBuf + 3)); + return (i); +} + +/* ************************************************************************** */ + +mng_int32 mng_get_int32 (mng_uint8p pBuf) +{ + mng_int32 i = ((mng_int32)(*pBuf) << 24) + + ((mng_int32)(*(pBuf + 1)) << 16) + + ((mng_int32)(*(pBuf + 2)) << 8) + + (mng_int32)(*(pBuf + 3)); + return (i); +} + +/* ************************************************************************** */ + +mng_uint16 mng_get_uint16 (mng_uint8p pBuf) +{ + mng_uint16 i = (mng_uint16)(((mng_uint16)(*pBuf) << 8) + + (mng_uint16)(*(pBuf + 1))); + return (i); +} + +/* ************************************************************************** */ + +void mng_put_uint32 (mng_uint8p pBuf, + mng_uint32 i) +{ + *pBuf = (mng_uint8)((i >> 24) & 0xff); + *(pBuf+1) = (mng_uint8)((i >> 16) & 0xff); + *(pBuf+2) = (mng_uint8)((i >> 8) & 0xff); + *(pBuf+3) = (mng_uint8)(i & 0xff); +} + +/* ************************************************************************** */ + +void mng_put_int32 (mng_uint8p pBuf, + mng_int32 i) +{ + *pBuf = (mng_uint8)((i >> 24) & 0xff); + *(pBuf+1) = (mng_uint8)((i >> 16) & 0xff); + *(pBuf+2) = (mng_uint8)((i >> 8) & 0xff); + *(pBuf+3) = (mng_uint8)(i & 0xff); +} + +/* ************************************************************************** */ + +void mng_put_uint16 (mng_uint8p pBuf, + mng_uint16 i) +{ + *pBuf = (mng_uint8)((i >> 8) & 0xff); + *(pBuf+1) = (mng_uint8)(i & 0xff); +} + +/* ************************************************************************** */ + +#endif /* !MNG_BIGENDIAN_SUPPORTED */ + +/* ************************************************************************** */ +/* * * */ +/* * Helper routines to simplify chunk-data extraction * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_READ_PROCS + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +MNG_LOCAL mng_uint8p find_null (mng_uint8p pIn) +{ + mng_uint8p pOut = pIn; + while (*pOut) /* the read_graphic routine has made sure there's */ + pOut++; /* always at least 1 zero-byte in the buffer */ + return pOut; +} +#endif + +/* ************************************************************************** */ + +#if !defined(MNG_SKIPCHUNK_iCCP) || !defined(MNG_SKIPCHUNK_zTXt) || \ + !defined(MNG_SKIPCHUNK_iTXt) || defined(MNG_INCLUDE_MPNG_PROPOSAL) || \ + defined(MNG_INCLUDE_ANG_PROPOSAL) +mng_retcode mng_inflate_buffer (mng_datap pData, + mng_uint8p pInbuf, + mng_uint32 iInsize, + mng_uint8p *pOutbuf, + mng_uint32 *iOutsize, + mng_uint32 *iRealsize) +{ + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INFLATE_BUFFER, MNG_LC_START); +#endif + + if (iInsize) /* anything to do ? */ + { + *iOutsize = iInsize * 3; /* estimate uncompressed size */ + /* and allocate a temporary buffer */ + MNG_ALLOC (pData, *pOutbuf, *iOutsize); + + do + { + mngzlib_inflateinit (pData); /* initialize zlib */ + /* let zlib know where to store the output */ + pData->sZlib.next_out = *pOutbuf; + /* "size - 1" so we've got space for the + zero-termination of a possible string */ + pData->sZlib.avail_out = *iOutsize - 1; + /* ok; let's inflate... */ + iRetcode = mngzlib_inflatedata (pData, iInsize, pInbuf); + /* determine actual output size */ + *iRealsize = (mng_uint32)pData->sZlib.total_out; + + mngzlib_inflatefree (pData); /* zlib's done */ + + if (iRetcode == MNG_BUFOVERFLOW) /* not enough space ? */ + { /* then get some more */ + MNG_FREEX (pData, *pOutbuf, *iOutsize); + *iOutsize = *iOutsize + *iOutsize; + MNG_ALLOC (pData, *pOutbuf, *iOutsize); + } + } /* repeat if we didn't have enough space */ + while ((iRetcode == MNG_BUFOVERFLOW) && + (*iOutsize < 200 * iInsize)); + + if (!iRetcode) /* if oke ? */ + *((*pOutbuf) + *iRealsize) = 0; /* then put terminator zero */ + + } + else + { + *pOutbuf = 0; /* nothing to do; then there's no output */ + *iOutsize = 0; + *iRealsize = 0; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INFLATE_BUFFER, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_READ_PROCS */ + +/* ************************************************************************** */ +/* * * */ +/* * Helper routines to simplify chunk writing * */ +/* * * */ +/* ************************************************************************** */ +#ifdef MNG_INCLUDE_WRITE_PROCS +/* ************************************************************************** */ + +#if !defined(MNG_SKIPCHUNK_iCCP) || !defined(MNG_SKIPCHUNK_zTXt) || !defined(MNG_SKIPCHUNK_iTXt) +MNG_LOCAL mng_retcode deflate_buffer (mng_datap pData, + mng_uint8p pInbuf, + mng_uint32 iInsize, + mng_uint8p *pOutbuf, + mng_uint32 *iOutsize, + mng_uint32 *iRealsize) +{ + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DEFLATE_BUFFER, MNG_LC_START); +#endif + + if (iInsize) /* anything to do ? */ + { + *iOutsize = (iInsize * 5) >> 2; /* estimate compressed size */ + /* and allocate a temporary buffer */ + MNG_ALLOC (pData, *pOutbuf, *iOutsize); + + do + { + mngzlib_deflateinit (pData); /* initialize zlib */ + /* let zlib know where to store the output */ + pData->sZlib.next_out = *pOutbuf; + pData->sZlib.avail_out = *iOutsize; + /* ok; let's deflate... */ + iRetcode = mngzlib_deflatedata (pData, iInsize, pInbuf); + /* determine actual output size */ + *iRealsize = pData->sZlib.total_out; + + mngzlib_deflatefree (pData); /* zlib's done */ + + if (iRetcode == MNG_BUFOVERFLOW) /* not enough space ? */ + { /* then get some more */ + MNG_FREEX (pData, *pOutbuf, *iOutsize); + *iOutsize = *iOutsize + (iInsize >> 1); + MNG_ALLOC (pData, *pOutbuf, *iOutsize); + } + } /* repeat if we didn't have enough space */ + while (iRetcode == MNG_BUFOVERFLOW); + } + else + { + *pOutbuf = 0; /* nothing to do; then there's no output */ + *iOutsize = 0; + *iRealsize = 0; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DEFLATE_BUFFER, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode write_raw_chunk (mng_datap pData, + mng_chunkid iChunkname, + mng_uint32 iRawlen, + mng_uint8p pRawdata) +{ + mng_uint32 iCrc; + mng_uint32 iWritten; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_RAW_CHUNK, MNG_LC_START); +#endif + /* temporary buffer ? */ + if ((pRawdata != 0) && (pRawdata != pData->pWritebuf+8)) + { /* store length & chunktype in default buffer */ + mng_put_uint32 (pData->pWritebuf, iRawlen); + mng_put_uint32 (pData->pWritebuf+4, (mng_uint32)iChunkname); + + if (pData->iCrcmode & MNG_CRC_OUTPUT) + { + if ((pData->iCrcmode & MNG_CRC_OUTPUT) == MNG_CRC_OUTPUT_GENERATE) + { /* calculate the crc */ + iCrc = update_crc (pData, 0xffffffffL, pData->pWritebuf+4, 4); + iCrc = update_crc (pData, iCrc, pRawdata, iRawlen) ^ 0xffffffffL; + } else { + iCrc = 0; /* dummy crc */ + } /* store in default buffer */ + mng_put_uint32 (pData->pWritebuf+8, iCrc); + } + /* write the length & chunktype */ + if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, 8, &iWritten)) + MNG_ERROR (pData, MNG_APPIOERROR); + + if (iWritten != 8) /* disk full ? */ + MNG_ERROR (pData, MNG_OUTPUTERROR); + /* write the temporary buffer */ + if (!pData->fWritedata ((mng_handle)pData, pRawdata, iRawlen, &iWritten)) + MNG_ERROR (pData, MNG_APPIOERROR); + + if (iWritten != iRawlen) /* disk full ? */ + MNG_ERROR (pData, MNG_OUTPUTERROR); + + if (pData->iCrcmode & MNG_CRC_OUTPUT) + { /* write the crc */ + if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf+8, 4, &iWritten)) + MNG_ERROR (pData, MNG_APPIOERROR); + + if (iWritten != 4) /* disk full ? */ + MNG_ERROR (pData, MNG_OUTPUTERROR); + } + } + else + { /* prefix with length & chunktype */ + mng_put_uint32 (pData->pWritebuf, iRawlen); + mng_put_uint32 (pData->pWritebuf+4, (mng_uint32)iChunkname); + + if (pData->iCrcmode & MNG_CRC_OUTPUT) + { + if ((pData->iCrcmode & MNG_CRC_OUTPUT) == MNG_CRC_OUTPUT_GENERATE) + /* calculate the crc */ + iCrc = mng_crc (pData, pData->pWritebuf+4, iRawlen + 4); + else + iCrc = 0; /* dummy crc */ + /* add it to the buffer */ + mng_put_uint32 (pData->pWritebuf + iRawlen + 8, iCrc); + /* write it in a single pass */ + if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, iRawlen + 12, &iWritten)) + MNG_ERROR (pData, MNG_APPIOERROR); + + if (iWritten != iRawlen + 12) /* disk full ? */ + MNG_ERROR (pData, MNG_OUTPUTERROR); + } else { + if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, iRawlen + 8, &iWritten)) + MNG_ERROR (pData, MNG_APPIOERROR); + + if (iWritten != iRawlen + 8) /* disk full ? */ + MNG_ERROR (pData, MNG_OUTPUTERROR); + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_RAW_CHUNK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* B004 */ +#endif /* MNG_INCLUDE_WRITE_PROCS */ +/* B004 */ +/* ************************************************************************** */ +/* * * */ +/* * chunk read functions * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_READ_PROCS + +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_CHUNKREADER + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode create_chunk_storage (mng_datap pData, + mng_chunkp pHeader, + mng_uint32 iRawlen, + mng_uint8p pRawdata, + mng_field_descp pField, + mng_uint16 iFields, + mng_chunkp* ppChunk, + mng_bool bWorkcopy) +{ + mng_field_descp pTempfield = pField; + mng_uint16 iFieldcount = iFields; + mng_uint8p pTempdata = pRawdata; + mng_uint32 iTemplen = iRawlen; + mng_uint16 iLastgroup = 0; + mng_uint8p pChunkdata; + mng_uint32 iDatalen; + mng_uint8 iColortype; + mng_bool bProcess; + /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (((mng_chunk_headerp)(*ppChunk))->iChunkname == MNG_UINT_HUH) + ((mng_chunk_headerp)(*ppChunk))->iChunkname = pData->iChunkname; + + if ((!bWorkcopy) || + ((((mng_chunk_headerp)pHeader)->iChunkname != MNG_UINT_IDAT) && + (((mng_chunk_headerp)pHeader)->iChunkname != MNG_UINT_JDAT) && + (((mng_chunk_headerp)pHeader)->iChunkname != MNG_UINT_JDAA) )) + { + pChunkdata = (mng_uint8p)(*ppChunk); + +#ifdef MNG_INCLUDE_JNG /* determine current colortype */ + if (pData->bHasJHDR) + iColortype = (mng_uint8)(pData->iJHDRcolortype - 8); + else +#endif /* MNG_INCLUDE_JNG */ + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + iColortype = pData->iColortype; + else + iColortype = 6; + + if (iTemplen) /* not empty ? */ + { /* then go fill the fields */ + while ((iFieldcount) && (iTemplen)) + { + if (pTempfield->iOffsetchunk) + { + if (pTempfield->iFlags & MNG_FIELD_PUTIMGTYPE) + { + *(pChunkdata+pTempfield->iOffsetchunk) = iColortype; + bProcess = MNG_FALSE; + } + else + if (pTempfield->iFlags & MNG_FIELD_IFIMGTYPES) + bProcess = (mng_bool)(((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE0) && (iColortype == 0)) || + ((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE2) && (iColortype == 2)) || + ((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE3) && (iColortype == 3)) || + ((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE4) && (iColortype == 4)) || + ((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE6) && (iColortype == 6)) ); + else + bProcess = MNG_TRUE; + + if (bProcess) + { + iLastgroup = (mng_uint16)(pTempfield->iFlags & MNG_FIELD_GROUPMASK); + /* numeric field ? */ + if (pTempfield->iFlags & MNG_FIELD_INT) + { + if (iTemplen < pTempfield->iLengthmax) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + switch (pTempfield->iLengthmax) + { + case 1 : { mng_uint8 iNum = *pTempdata; + if (((mng_uint16)iNum < pTempfield->iMinvalue) || + ((mng_uint16)iNum > pTempfield->iMaxvalue) ) + MNG_ERROR (pData, MNG_INVALIDFIELDVAL); + *(pChunkdata+pTempfield->iOffsetchunk) = iNum; + break; } + case 2 : { mng_uint16 iNum = mng_get_uint16 (pTempdata); + if ((iNum < pTempfield->iMinvalue) || (iNum > pTempfield->iMaxvalue)) + MNG_ERROR (pData, MNG_INVALIDFIELDVAL); + *((mng_uint16p)(pChunkdata+pTempfield->iOffsetchunk)) = iNum; + break; } + case 4 : { mng_uint32 iNum = mng_get_uint32 (pTempdata); + if ((iNum < pTempfield->iMinvalue) || + ((pTempfield->iFlags & MNG_FIELD_NOHIGHBIT) && (iNum & 0x80000000)) ) + MNG_ERROR (pData, MNG_INVALIDFIELDVAL); + *((mng_uint32p)(pChunkdata+pTempfield->iOffsetchunk)) = iNum; + break; } + } + + pTempdata += pTempfield->iLengthmax; + iTemplen -= pTempfield->iLengthmax; + + } else { /* not numeric so it's a bunch of bytes */ + + if (!pTempfield->iOffsetchunklen) /* big fat NONO */ + MNG_ERROR (pData, MNG_INTERNALERROR); + /* with terminating 0 ? */ + if (pTempfield->iFlags & MNG_FIELD_TERMINATOR) + { + mng_uint8p pWork = pTempdata; + while (*pWork) /* find the zero */ + pWork++; + iDatalen = (mng_uint32)(pWork - pTempdata); + } else { /* no terminator, so everything that's left ! */ + iDatalen = iTemplen; + } + + if ((pTempfield->iLengthmax) && (iDatalen > pTempfield->iLengthmax)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); +#if !defined(MNG_SKIPCHUNK_iCCP) || !defined(MNG_SKIPCHUNK_zTXt) || \ + !defined(MNG_SKIPCHUNK_iTXt) || defined(MNG_INCLUDE_MPNG_PROPOSAL) || \ + defined(MNG_INCLUDE_ANG_PROPOSAL) + /* needs decompression ? */ + if (pTempfield->iFlags & MNG_FIELD_DEFLATED) + { + mng_uint8p pBuf = 0; + mng_uint32 iBufsize = 0; + mng_uint32 iRealsize; + mng_ptr pWork; + + iRetcode = mng_inflate_buffer (pData, pTempdata, iDatalen, + &pBuf, &iBufsize, &iRealsize); + +#ifdef MNG_CHECK_BAD_ICCP /* Check for bad iCCP chunk */ + if ((iRetcode) && (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_iCCP)) + { + *((mng_ptr *)(pChunkdata+pTempfield->iOffsetchunk)) = MNG_NULL; + *((mng_uint32p)(pChunkdata+pTempfield->iOffsetchunklen)) = iDatalen; + } + else +#endif + { + if (iRetcode) + return iRetcode; + +#if defined(MNG_INCLUDE_MPNG_PROPOSAL) || defined(MNG_INCLUDE_ANG_PROPOSAL) + if ( (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_mpNG) || + (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_adAT) ) + { + MNG_ALLOC (pData, pWork, iRealsize); + } + else + { +#endif + /* don't forget to generate null terminator */ + MNG_ALLOC (pData, pWork, iRealsize+1); +#if defined(MNG_INCLUDE_MPNG_PROPOSAL) || defined(MNG_INCLUDE_ANG_PROPOSAL) + } +#endif + MNG_COPY (pWork, pBuf, iRealsize); + + *((mng_ptr *)(pChunkdata+pTempfield->iOffsetchunk)) = pWork; + *((mng_uint32p)(pChunkdata+pTempfield->iOffsetchunklen)) = iRealsize; + } + + if (pBuf) /* free the temporary buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + + } else +#endif + { /* no decompression, so just copy */ + + mng_ptr pWork; + /* don't forget to generate null terminator */ + MNG_ALLOC (pData, pWork, iDatalen+1); + MNG_COPY (pWork, pTempdata, iDatalen); + + *((mng_ptr *)(pChunkdata+pTempfield->iOffsetchunk)) = pWork; + *((mng_uint32p)(pChunkdata+pTempfield->iOffsetchunklen)) = iDatalen; + } + + if (pTempfield->iFlags & MNG_FIELD_TERMINATOR) + iDatalen++; /* skip the terminating zero as well !!! */ + + iTemplen -= iDatalen; + pTempdata += iDatalen; + } + /* need to set an indicator ? */ + if (pTempfield->iOffsetchunkind) + *((mng_uint8p)(pChunkdata+pTempfield->iOffsetchunkind)) = MNG_TRUE; + } + } + + if (pTempfield->pSpecialfunc) /* special function required ? */ + { + iRetcode = pTempfield->pSpecialfunc(pData, *ppChunk, &iTemplen, &pTempdata); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + + pTempfield++; /* Neeeeeeexxxtt */ + iFieldcount--; + } + + if (iTemplen) /* extra data ??? */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + while (iFieldcount) /* not enough data ??? */ + { + if (pTempfield->iFlags & MNG_FIELD_IFIMGTYPES) + bProcess = (mng_bool)(((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE0) && (iColortype == 0)) || + ((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE2) && (iColortype == 2)) || + ((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE3) && (iColortype == 3)) || + ((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE4) && (iColortype == 4)) || + ((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE6) && (iColortype == 6)) ); + else + bProcess = MNG_TRUE; + + if (bProcess) + { + if (!(pTempfield->iFlags & MNG_FIELD_OPTIONAL)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + if ((pTempfield->iFlags & MNG_FIELD_GROUPMASK) && + ((mng_uint16)(pTempfield->iFlags & MNG_FIELD_GROUPMASK) == iLastgroup)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + + pTempfield++; + iFieldcount--; + } + } + } + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +READ_CHUNK (mng_read_general) +{ + mng_retcode iRetcode = MNG_NOERROR; + mng_chunk_descp pDescr = ((mng_chunk_headerp)pHeader)->pChunkdescr; + mng_field_descp pField; + mng_uint16 iFields; + + if (!pDescr) /* this is a bad booboo !!! */ + MNG_ERROR (pData, MNG_INTERNALERROR); + + pField = pDescr->pFielddesc; + iFields = pDescr->iFielddesc; + /* check chunk against signature */ + if ((pDescr->eImgtype == mng_it_mng) && (pData->eSigtype != mng_it_mng)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + + if ((pDescr->eImgtype == mng_it_jng) && (pData->eSigtype == mng_it_png)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + /* empties allowed ? */ + if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTY))) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->eImagetype != mng_it_mng) || (!(pDescr->iAllowed & MNG_DESCR_GLOBAL))) + { /* *a* header required ? */ + if ((pDescr->iMusthaves & MNG_DESCR_GenHDR) && +#ifdef MNG_INCLUDE_JNG + (!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + (!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pDescr->iMusthaves & MNG_DESCR_JngHDR) && + (!pData->bHasDHDR) && (!pData->bHasJHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); +#endif + } + /* specific chunk pre-requisite ? */ + if (((pDescr->iMusthaves & MNG_DESCR_IHDR) && (!pData->bHasIHDR)) || +#ifdef MNG_INCLUDE_JNG + ((pDescr->iMusthaves & MNG_DESCR_JHDR) && (!pData->bHasJHDR)) || +#endif + ((pDescr->iMusthaves & MNG_DESCR_DHDR) && (!pData->bHasDHDR)) || + ((pDescr->iMusthaves & MNG_DESCR_LOOP) && (!pData->bHasLOOP)) || + ((pDescr->iMusthaves & MNG_DESCR_PLTE) && (!pData->bHasPLTE)) || + ((pDescr->iMusthaves & MNG_DESCR_MHDR) && (!pData->bHasMHDR)) || + ((pDescr->iMusthaves & MNG_DESCR_SAVE) && (!pData->bHasSAVE)) ) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* specific chunk undesired ? */ + if (((pDescr->iMustNOThaves & MNG_DESCR_NOIHDR) && (pData->bHasIHDR)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOBASI) && (pData->bHasBASI)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NODHDR) && (pData->bHasDHDR)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOIDAT) && (pData->bHasIDAT)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOPLTE) && (pData->bHasPLTE)) || +#ifdef MNG_INCLUDE_JNG + ((pDescr->iMustNOThaves & MNG_DESCR_NOJHDR) && (pData->bHasJHDR)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOJDAT) && (pData->bHasJDAT)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOJDAA) && (pData->bHasJDAA)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOJSEP) && (pData->bHasJSEP)) || +#endif + ((pDescr->iMustNOThaves & MNG_DESCR_NOMHDR) && (pData->bHasMHDR)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOLOOP) && (pData->bHasLOOP)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOTERM) && (pData->bHasTERM)) || + ((pDescr->iMustNOThaves & MNG_DESCR_NOSAVE) && (pData->bHasSAVE)) ) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (pData->eSigtype == mng_it_mng) /* check global and embedded empty chunks */ + { +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTYEMBED))) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } else { + if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTYGLOBAL))) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + } + + if (pDescr->pSpecialfunc) /* need special processing ? */ + { + iRetcode = create_chunk_storage (pData, pHeader, iRawlen, pRawdata, + pField, iFields, ppChunk, MNG_TRUE); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* empty indicator ? */ + if ((!iRawlen) && (pDescr->iOffsetempty)) + *(((mng_uint8p)*ppChunk)+pDescr->iOffsetempty) = MNG_TRUE; + + iRetcode = pDescr->pSpecialfunc(pData, *ppChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + + if ((((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT) || + (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT) || + (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA) ) + { + iRetcode = ((mng_chunk_headerp)*ppChunk)->fCleanup (pData, *ppChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + *ppChunk = MNG_NULL; + } else { +#ifdef MNG_STORE_CHUNKS + if (!pData->bStorechunks) +#endif + { + iRetcode = ((mng_chunk_headerp)*ppChunk)->fCleanup (pData, *ppChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + *ppChunk = MNG_NULL; + } + } + } + +#ifdef MNG_SUPPORT_DISPLAY + if (iRawlen) + { +#ifdef MNG_OPTIMIZE_DISPLAYCALLS + pData->iRawlen = iRawlen; + pData->pRawdata = pRawdata; +#endif + + /* display processing */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT) + iRetcode = mng_process_display_idat (pData, iRawlen, pRawdata); +#ifdef MNG_INCLUDE_JNG + else + if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT) + iRetcode = mng_process_display_jdat (pData, iRawlen, pRawdata); + else + if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA) + iRetcode = mng_process_display_jdaa (pData, iRawlen, pRawdata); +#endif +#else + if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT) + iRetcode = mng_process_display_idat (pData); +#ifdef MNG_INCLUDE_JNG + else + if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT) + iRetcode = mng_process_display_jdat (pData); + else + if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA) + iRetcode = mng_process_display_jdaa (pData); +#endif +#endif + + if (iRetcode) + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if ((pData->bStorechunks) && (!(*ppChunk))) + { + iRetcode = create_chunk_storage (pData, pHeader, iRawlen, pRawdata, + pField, iFields, ppChunk, MNG_FALSE); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* empty indicator ? */ + if ((!iRawlen) && (pDescr->iOffsetempty)) + *(((mng_uint8p)*ppChunk)+pDescr->iOffsetempty) = MNG_TRUE; + } +#endif /* MNG_STORE_CHUNKS */ + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_ihdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_START); +#endif + + if (iRawlen != 13) /* length oke ? */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + /* only allowed inside PNG or MNG */ + if ((pData->eSigtype != mng_it_png) && (pData->eSigtype != mng_it_mng)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + /* sequence checks */ + if ((pData->eSigtype == mng_it_png) && (pData->iChunkseq > 1)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasIDAT) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasIDAT)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + pData->bHasIHDR = MNG_TRUE; /* indicate IHDR is present */ + /* and store interesting fields */ + if ((!pData->bHasDHDR) || (pData->iDeltatype == MNG_DELTATYPE_NOCHANGE)) + { + pData->iDatawidth = mng_get_uint32 (pRawdata); + pData->iDataheight = mng_get_uint32 (pRawdata+4); + } + + pData->iBitdepth = *(pRawdata+8); + pData->iColortype = *(pRawdata+9); + pData->iCompression = *(pRawdata+10); + pData->iFilter = *(pRawdata+11); + pData->iInterlace = *(pRawdata+12); + +#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT) + pData->iPNGmult = 1; + pData->iPNGdepth = pData->iBitdepth; +#endif + +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iBitdepth < 8) + pData->iBitdepth = 8; +#endif + +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth > 8) + { + pData->iBitdepth = 8; + pData->iPNGmult = 2; + } +#endif + + if ((pData->iBitdepth != 8) /* parameter validity checks */ +#ifndef MNG_NO_1_2_4BIT_SUPPORT + && (pData->iBitdepth != 1) && + (pData->iBitdepth != 2) && + (pData->iBitdepth != 4) +#endif +#ifndef MNG_NO_16BIT_SUPPORT + && (pData->iBitdepth != 16) +#endif + ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ((pData->iColortype != MNG_COLORTYPE_GRAY ) && + (pData->iColortype != MNG_COLORTYPE_RGB ) && + (pData->iColortype != MNG_COLORTYPE_INDEXED) && + (pData->iColortype != MNG_COLORTYPE_GRAYA ) && + (pData->iColortype != MNG_COLORTYPE_RGBA ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8)) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (((pData->iColortype == MNG_COLORTYPE_RGB ) || + (pData->iColortype == MNG_COLORTYPE_GRAYA ) || + (pData->iColortype == MNG_COLORTYPE_RGBA ) ) && + (pData->iBitdepth < 8 ) ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (pData->iCompression != MNG_COMPRESSION_DEFLATE) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + +#if defined(FILTER192) || defined(FILTER193) + if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) && +#if defined(FILTER192) && defined(FILTER193) + (pData->iFilter != MNG_FILTER_DIFFERING) && + (pData->iFilter != MNG_FILTER_NOFILTER ) ) +#else +#ifdef FILTER192 + (pData->iFilter != MNG_FILTER_DIFFERING) ) +#else + (pData->iFilter != MNG_FILTER_NOFILTER ) ) +#endif +#endif + MNG_ERROR (pData, MNG_INVALIDFILTER); +#else + if (pData->iFilter) + MNG_ERROR (pData, MNG_INVALIDFILTER); +#endif + + if ((pData->iInterlace != MNG_INTERLACE_NONE ) && + (pData->iInterlace != MNG_INTERLACE_ADAM7) ) + MNG_ERROR (pData, MNG_INVALIDINTERLACE); + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* check the colortype for delta-images ! */ + { + mng_imagedatap pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + + if (pData->iColortype != pBuf->iColortype) + { + if ( ( (pData->iColortype != MNG_COLORTYPE_INDEXED) || + (pBuf->iColortype == MNG_COLORTYPE_GRAY ) ) && + ( (pData->iColortype != MNG_COLORTYPE_GRAY ) || + (pBuf->iColortype == MNG_COLORTYPE_INDEXED) ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + } + } +#endif +#endif + + if (!pData->bHasheader) /* first chunk ? */ + { + pData->bHasheader = MNG_TRUE; /* we've got a header */ + pData->eImagetype = mng_it_png; /* then this must be a PNG */ + pData->iWidth = pData->iDatawidth; + pData->iHeight = pData->iDataheight; + /* predict alpha-depth ! */ + if ((pData->iColortype == MNG_COLORTYPE_GRAYA ) || + (pData->iColortype == MNG_COLORTYPE_RGBA ) ) + pData->iAlphadepth = pData->iBitdepth; + else + if (pData->iColortype == MNG_COLORTYPE_INDEXED) + pData->iAlphadepth = 8; /* worst case scenario */ + else + pData->iAlphadepth = 1; /* Possible tRNS cheap binary transparency */ + /* fits on maximum canvas ? */ + if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight)) + MNG_WARNING (pData, MNG_IMAGETOOLARGE); + +#if !defined(MNG_INCLUDE_MPNG_PROPOSAL) || !defined(MNG_SUPPORT_DISPLAY) + if (pData->fProcessheader) /* inform the app ? */ + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); +#endif + } + + if (!pData->bHasDHDR) + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode = mng_process_display_ihdr (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the fields */ + ((mng_ihdrp)*ppChunk)->iWidth = mng_get_uint32 (pRawdata); + ((mng_ihdrp)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4); + ((mng_ihdrp)*ppChunk)->iBitdepth = pData->iBitdepth; + ((mng_ihdrp)*ppChunk)->iColortype = pData->iColortype; + ((mng_ihdrp)*ppChunk)->iCompression = pData->iCompression; + ((mng_ihdrp)*ppChunk)->iFilter = pData->iFilter; + ((mng_ihdrp)*ppChunk)->iInterlace = pData->iInterlace; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_plte) +{ +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + mng_uint32 iX; + mng_uint8p pRawdata2; +#endif +#ifdef MNG_SUPPORT_DISPLAY + mng_uint32 iRawlen2; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIDAT) || (pData->bHasJHDR)) +#else + if (pData->bHasIDAT) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* multiple PLTE only inside BASI */ + if ((pData->bHasPLTE) && (!pData->bHasBASI)) + MNG_ERROR (pData, MNG_MULTIPLEERROR); + /* length must be multiple of 3 */ + if (((iRawlen % 3) != 0) || (iRawlen > 768)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { /* only allowed for indexed-color or + rgb(a)-color! */ + if ((pData->iColortype != 2) && (pData->iColortype != 3) && (pData->iColortype != 6)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + /* empty only allowed if global present */ + if ((iRawlen == 0) && (!pData->bHasglobalPLTE)) + MNG_ERROR (pData, MNG_CANNOTBEEMPTY); + } + else + { + if (iRawlen == 0) /* cannot be empty as global! */ + MNG_ERROR (pData, MNG_CANNOTBEEMPTY); + } + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + pData->bHasPLTE = MNG_TRUE; /* got it! */ + else + pData->bHasglobalPLTE = MNG_TRUE; + + pData->iPLTEcount = iRawlen / 3; + +#ifdef MNG_SUPPORT_DISPLAY + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { + mng_imagep pImage; + mng_imagedatap pBuf; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* processing delta-image ? */ + { /* store in object 0 !!! */ + pImage = (mng_imagep)pData->pObjzero; + pBuf = pImage->pImgbuf; + pBuf->bHasPLTE = MNG_TRUE; /* it's definitely got a PLTE now */ + pBuf->iPLTEcount = iRawlen / 3; /* this is the exact length */ + pRawdata2 = pRawdata; /* copy the entries */ + + for (iX = 0; iX < iRawlen / 3; iX++) + { + pBuf->aPLTEentries[iX].iRed = *pRawdata2; + pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1); + pBuf->aPLTEentries[iX].iBlue = *(pRawdata2+2); + + pRawdata2 += 3; + } + } + else +#endif + { /* get the current object */ + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address the object buffer */ + pBuf->bHasPLTE = MNG_TRUE; /* and tell it it's got a PLTE now */ + + if (!iRawlen) /* if empty, inherit from global */ + { + pBuf->iPLTEcount = pData->iGlobalPLTEcount; + MNG_COPY (pBuf->aPLTEentries, pData->aGlobalPLTEentries, + sizeof (pBuf->aPLTEentries)); + + if (pData->bHasglobalTRNS) /* also copy global tRNS ? */ + { /* indicate tRNS available */ + pBuf->bHasTRNS = MNG_TRUE; + + iRawlen2 = pData->iGlobalTRNSrawlen; + pRawdata2 = (mng_uint8p)(pData->aGlobalTRNSrawdata); + /* global length oke ? */ + if ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount)) + MNG_ERROR (pData, MNG_GLOBALLENGTHERR); + /* copy it */ + pBuf->iTRNScount = iRawlen2; + MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2); + } + } + else + { /* store fields for future reference */ + pBuf->iPLTEcount = iRawlen / 3; + pRawdata2 = pRawdata; + + for (iX = 0; iX < pBuf->iPLTEcount; iX++) + { + pBuf->aPLTEentries[iX].iRed = *pRawdata2; + pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1); + pBuf->aPLTEentries[iX].iBlue = *(pRawdata2+2); + + pRawdata2 += 3; + } + } + } + } + else /* store as global */ + { + pData->iGlobalPLTEcount = iRawlen / 3; + pRawdata2 = pRawdata; + + for (iX = 0; iX < pData->iGlobalPLTEcount; iX++) + { + pData->aGlobalPLTEentries[iX].iRed = *pRawdata2; + pData->aGlobalPLTEentries[iX].iGreen = *(pRawdata2+1); + pData->aGlobalPLTEentries[iX].iBlue = *(pRawdata2+2); + + pRawdata2 += 3; + } + + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_plte (pData, pData->iGlobalPLTEcount, + pData->aGlobalPLTEentries); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_pltep)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + ((mng_pltep)*ppChunk)->iEntrycount = iRawlen / 3; + pRawdata2 = pRawdata; + + for (iX = 0; iX < ((mng_pltep)*ppChunk)->iEntrycount; iX++) + { + ((mng_pltep)*ppChunk)->aEntries[iX].iRed = *pRawdata2; + ((mng_pltep)*ppChunk)->aEntries[iX].iGreen = *(pRawdata2+1); + ((mng_pltep)*ppChunk)->aEntries[iX].iBlue = *(pRawdata2+2); + + pRawdata2 += 3; + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_idat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_JNG /* sequence checks */ + if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasJHDR) && + (pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (pData->bHasJSEP) + MNG_ERROR (pData, MNG_SEQUENCEERROR); +#endif + /* not allowed for deltatype NO_CHANGE */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && ((pData->iDeltatype == MNG_DELTATYPE_NOCHANGE))) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); +#endif + /* can only be empty in BASI-block! */ + if ((iRawlen == 0) && (!pData->bHasBASI)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + /* indexed-color requires PLTE */ + if ((pData->bHasIHDR) && (pData->iColortype == 3) && (!pData->bHasPLTE)) + MNG_ERROR (pData, MNG_PLTEMISSING); + + pData->bHasIDAT = MNG_TRUE; /* got some IDAT now, don't we */ + +#ifdef MNG_SUPPORT_DISPLAY + if (iRawlen) + { /* display processing */ + mng_retcode iRetcode = mng_process_display_idat (pData, iRawlen, pRawdata); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_idatp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + ((mng_idatp)*ppChunk)->iDatasize = iRawlen; + + if (iRawlen != 0) /* is there any data ? */ + { + MNG_ALLOC (pData, ((mng_idatp)*ppChunk)->pData, iRawlen); + MNG_COPY (((mng_idatp)*ppChunk)->pData, pRawdata, iRawlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_iend) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_START); +#endif + + if (iRawlen > 0) /* must not contain data! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_INCLUDE_JNG /* sequence checks */ + if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* IHDR-block requires IDAT */ + if ((pData->bHasIHDR) && (!pData->bHasIDAT)) + MNG_ERROR (pData, MNG_IDATMISSING); + + pData->iImagelevel--; /* one level up */ + +#ifdef MNG_SUPPORT_DISPLAY + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_image (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* display processing */ + iRetcode = mng_process_display_iend (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_SUPPORT_DISPLAY + if (!pData->bTimerset) /* reset only if not broken !!! */ + { +#endif + /* IEND signals the end for most ... */ + pData->bHasIHDR = MNG_FALSE; + pData->bHasBASI = MNG_FALSE; + pData->bHasDHDR = MNG_FALSE; +#ifdef MNG_INCLUDE_JNG + pData->bHasJHDR = MNG_FALSE; + pData->bHasJSEP = MNG_FALSE; + pData->bHasJDAA = MNG_FALSE; + pData->bHasJDAT = MNG_FALSE; +#endif + pData->bHasPLTE = MNG_FALSE; + pData->bHasTRNS = MNG_FALSE; + pData->bHasGAMA = MNG_FALSE; + pData->bHasCHRM = MNG_FALSE; + pData->bHasSRGB = MNG_FALSE; + pData->bHasICCP = MNG_FALSE; + pData->bHasBKGD = MNG_FALSE; + pData->bHasIDAT = MNG_FALSE; +#ifdef MNG_SUPPORT_DISPLAY + } +#endif + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_trns) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIDAT) || (pData->bHasJHDR)) +#else + if (pData->bHasIDAT) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* multiple tRNS only inside BASI */ + if ((pData->bHasTRNS) && (!pData->bHasBASI)) + MNG_ERROR (pData, MNG_MULTIPLEERROR); + + if (iRawlen > 256) /* it just can't be bigger than that! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { /* not allowed with full alpha-channel */ + if ((pData->iColortype == 4) || (pData->iColortype == 6)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + + if (iRawlen != 0) /* filled ? */ + { /* length checks */ + if ((pData->iColortype == 0) && (iRawlen != 2)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iColortype == 2) && (iRawlen != 6)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + if (pData->iColortype == 3) + { + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + mng_imagedatap pBuf; + + if (!pImage) /* no object then check obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address object buffer */ + + if (iRawlen > pBuf->iPLTEcount) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } +#endif + } + else /* if empty there must be global stuff! */ + { + if (!pData->bHasglobalTRNS) + MNG_ERROR (pData, MNG_CANNOTBEEMPTY); + } + } + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + pData->bHasTRNS = MNG_TRUE; /* indicate tRNS available */ + else + pData->bHasglobalTRNS = MNG_TRUE; + +#ifdef MNG_SUPPORT_DISPLAY + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { + mng_imagep pImage; + mng_imagedatap pBuf; + mng_uint8p pRawdata2; + mng_uint32 iRawlen2; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* processing delta-image ? */ + { /* store in object 0 !!! */ + pImage = (mng_imagep)pData->pObjzero; + pBuf = pImage->pImgbuf; /* address object buffer */ + + switch (pData->iColortype) /* store fields for future reference */ + { + case 0: { /* gray */ +#if defined(MNG_NO_1_2_4BIT_SUPPORT) + mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1, + 0,0,0,0,0,0,0,1}; +#endif + pBuf->iTRNSgray = mng_get_uint16 (pRawdata); + pBuf->iTRNSred = 0; + pBuf->iTRNSgreen = 0; + pBuf->iTRNSblue = 0; + pBuf->iTRNScount = 0; +#if defined(MNG_NO_1_2_4BIT_SUPPORT) + pBuf->iTRNSgray *= multiplier[pData->iPNGdepth]; +#endif +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + pBuf->iTRNSgray >>= 8; +#endif + break; + } + case 2: { /* rgb */ + pBuf->iTRNSgray = 0; + pBuf->iTRNSred = mng_get_uint16 (pRawdata); + pBuf->iTRNSgreen = mng_get_uint16 (pRawdata+2); + pBuf->iTRNSblue = mng_get_uint16 (pRawdata+4); + pBuf->iTRNScount = 0; +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + { + pBuf->iTRNSred >>= 8; + pBuf->iTRNSgreen >>= 8; + pBuf->iTRNSblue >>= 8; + } +#endif + break; + } + case 3: { /* indexed */ + pBuf->iTRNSgray = 0; + pBuf->iTRNSred = 0; + pBuf->iTRNSgreen = 0; + pBuf->iTRNSblue = 0; + pBuf->iTRNScount = iRawlen; + MNG_COPY (pBuf->aTRNSentries, pRawdata, iRawlen); + break; + } + } + + pBuf->bHasTRNS = MNG_TRUE; /* tell it it's got a tRNS now */ + } + else +#endif + { /* address current object */ + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address object buffer */ + pBuf->bHasTRNS = MNG_TRUE; /* and tell it it's got a tRNS now */ + + if (iRawlen == 0) /* if empty, inherit from global */ + { + iRawlen2 = pData->iGlobalTRNSrawlen; + pRawdata2 = (mng_ptr)(pData->aGlobalTRNSrawdata); + /* global length oke ? */ + if ((pData->iColortype == 0) && (iRawlen2 != 2)) + MNG_ERROR (pData, MNG_GLOBALLENGTHERR); + + if ((pData->iColortype == 2) && (iRawlen2 != 6)) + MNG_ERROR (pData, MNG_GLOBALLENGTHERR); + + if ((pData->iColortype == 3) && ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount))) + MNG_ERROR (pData, MNG_GLOBALLENGTHERR); + } + else + { + iRawlen2 = iRawlen; + pRawdata2 = pRawdata; + } + + switch (pData->iColortype) /* store fields for future reference */ + { + case 0: { /* gray */ + pBuf->iTRNSgray = mng_get_uint16 (pRawdata2); + pBuf->iTRNSred = 0; + pBuf->iTRNSgreen = 0; + pBuf->iTRNSblue = 0; + pBuf->iTRNScount = 0; +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + pBuf->iTRNSgray >>= 8; +#endif + break; + } + case 2: { /* rgb */ + pBuf->iTRNSgray = 0; + pBuf->iTRNSred = mng_get_uint16 (pRawdata2); + pBuf->iTRNSgreen = mng_get_uint16 (pRawdata2+2); + pBuf->iTRNSblue = mng_get_uint16 (pRawdata2+4); + pBuf->iTRNScount = 0; +#if defined(MNG_NO_16BIT_SUPPORT) + if (pData->iPNGmult == 2) + { + pBuf->iTRNSred >>= 8; + pBuf->iTRNSgreen >>= 8; + pBuf->iTRNSblue >>= 8; + } +#endif + break; + } + case 3: { /* indexed */ + pBuf->iTRNSgray = 0; + pBuf->iTRNSred = 0; + pBuf->iTRNSgreen = 0; + pBuf->iTRNSblue = 0; + pBuf->iTRNScount = iRawlen2; + MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2); + break; + } + } + } + } + else /* store as global */ + { + pData->iGlobalTRNSrawlen = iRawlen; + MNG_COPY (pData->aGlobalTRNSrawdata, pRawdata, iRawlen); + + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_trns (pData, pData->iGlobalTRNSrawlen, + pData->aGlobalTRNSrawdata); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { /* not global! */ + ((mng_trnsp)*ppChunk)->bGlobal = MNG_FALSE; + ((mng_trnsp)*ppChunk)->iType = pData->iColortype; + + if (iRawlen == 0) /* if empty, indicate so */ + ((mng_trnsp)*ppChunk)->bEmpty = MNG_TRUE; + else + { + ((mng_trnsp)*ppChunk)->bEmpty = MNG_FALSE; + + switch (pData->iColortype) /* store fields */ + { + case 0: { /* gray */ + ((mng_trnsp)*ppChunk)->iGray = mng_get_uint16 (pRawdata); + break; + } + case 2: { /* rgb */ + ((mng_trnsp)*ppChunk)->iRed = mng_get_uint16 (pRawdata); + ((mng_trnsp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2); + ((mng_trnsp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4); + break; + } + case 3: { /* indexed */ + ((mng_trnsp)*ppChunk)->iCount = iRawlen; + MNG_COPY (((mng_trnsp)*ppChunk)->aEntries, pRawdata, iRawlen); + break; + } + } + } + } + else /* it's global! */ + { + ((mng_trnsp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + ((mng_trnsp)*ppChunk)->bGlobal = MNG_TRUE; + ((mng_trnsp)*ppChunk)->iType = 0; + ((mng_trnsp)*ppChunk)->iRawlen = iRawlen; + + MNG_COPY (((mng_trnsp)*ppChunk)->aRawdata, pRawdata, iRawlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_gama) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_GAMA, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA)) +#else + if ((pData->bHasIDAT) || (pData->bHasPLTE)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { /* length must be exactly 4 */ + if (iRawlen != 4) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else + { /* length must be empty or exactly 4 */ + if ((iRawlen != 0) && (iRawlen != 4)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasGAMA = MNG_TRUE; /* indicate we've got it */ + else + pData->bHasglobalGAMA = (mng_bool)(iRawlen != 0); + +#ifdef MNG_SUPPORT_DISPLAY +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + mng_imagep pImage; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* update delta image ? */ + { /* store in object 0 ! */ + pImage = (mng_imagep)pData->pObjzero; + /* store for color-processing routines */ + pImage->pImgbuf->iGamma = mng_get_uint32 (pRawdata); + pImage->pImgbuf->bHasGAMA = MNG_TRUE; + } + else +#endif + { + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + /* store for color-processing routines */ + pImage->pImgbuf->iGamma = mng_get_uint32 (pRawdata); + pImage->pImgbuf->bHasGAMA = MNG_TRUE; + } + } + else + { /* store as global */ + if (iRawlen != 0) + pData->iGlobalGamma = mng_get_uint32 (pRawdata); + + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_gama (pData, (mng_bool)(iRawlen == 0), + pData->iGlobalGamma); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_gamap)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + ((mng_gamap)*ppChunk)->iGamma = mng_get_uint32 (pRawdata); + + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_cHRM +READ_CHUNK (mng_read_chrm) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CHRM, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA)) +#else + if ((pData->bHasIDAT) || (pData->bHasPLTE)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { /* length must be exactly 32 */ + if (iRawlen != 32) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else + { /* length must be empty or exactly 32 */ + if ((iRawlen != 0) && (iRawlen != 32)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasCHRM = MNG_TRUE; /* indicate we've got it */ + else + pData->bHasglobalCHRM = (mng_bool)(iRawlen != 0); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_uint32 iWhitepointx, iWhitepointy; + mng_uint32 iPrimaryredx, iPrimaryredy; + mng_uint32 iPrimarygreenx, iPrimarygreeny; + mng_uint32 iPrimarybluex, iPrimarybluey; + + iWhitepointx = mng_get_uint32 (pRawdata); + iWhitepointy = mng_get_uint32 (pRawdata+4); + iPrimaryredx = mng_get_uint32 (pRawdata+8); + iPrimaryredy = mng_get_uint32 (pRawdata+12); + iPrimarygreenx = mng_get_uint32 (pRawdata+16); + iPrimarygreeny = mng_get_uint32 (pRawdata+20); + iPrimarybluex = mng_get_uint32 (pRawdata+24); + iPrimarybluey = mng_get_uint32 (pRawdata+28); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + mng_imagep pImage; + mng_imagedatap pBuf; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* update delta image ? */ + { /* store it in object 0 ! */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address object buffer */ + pBuf->bHasCHRM = MNG_TRUE; /* and tell it it's got a CHRM now */ + /* store for color-processing routines */ + pBuf->iWhitepointx = iWhitepointx; + pBuf->iWhitepointy = iWhitepointy; + pBuf->iPrimaryredx = iPrimaryredx; + pBuf->iPrimaryredy = iPrimaryredy; + pBuf->iPrimarygreenx = iPrimarygreenx; + pBuf->iPrimarygreeny = iPrimarygreeny; + pBuf->iPrimarybluex = iPrimarybluex; + pBuf->iPrimarybluey = iPrimarybluey; + } + else +#endif + { + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address object buffer */ + pBuf->bHasCHRM = MNG_TRUE; /* and tell it it's got a CHRM now */ + /* store for color-processing routines */ + pBuf->iWhitepointx = iWhitepointx; + pBuf->iWhitepointy = iWhitepointy; + pBuf->iPrimaryredx = iPrimaryredx; + pBuf->iPrimaryredy = iPrimaryredy; + pBuf->iPrimarygreenx = iPrimarygreenx; + pBuf->iPrimarygreeny = iPrimarygreeny; + pBuf->iPrimarybluex = iPrimarybluex; + pBuf->iPrimarybluey = iPrimarybluey; + } + } + else + { /* store as global */ + if (iRawlen != 0) + { + pData->iGlobalWhitepointx = iWhitepointx; + pData->iGlobalWhitepointy = iWhitepointy; + pData->iGlobalPrimaryredx = iPrimaryredx; + pData->iGlobalPrimaryredy = iPrimaryredy; + pData->iGlobalPrimarygreenx = iPrimarygreenx; + pData->iGlobalPrimarygreeny = iPrimarygreeny; + pData->iGlobalPrimarybluex = iPrimarybluex; + pData->iGlobalPrimarybluey = iPrimarybluey; + } + + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_chrm (pData, (mng_bool)(iRawlen == 0), + iWhitepointx, iWhitepointy, + iPrimaryredx, iPrimaryredy, + iPrimarygreenx, iPrimarygreeny, + iPrimarybluex, iPrimarybluey); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_chrmp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + { + ((mng_chrmp)*ppChunk)->iWhitepointx = mng_get_uint32 (pRawdata); + ((mng_chrmp)*ppChunk)->iWhitepointy = mng_get_uint32 (pRawdata+4); + ((mng_chrmp)*ppChunk)->iRedx = mng_get_uint32 (pRawdata+8); + ((mng_chrmp)*ppChunk)->iRedy = mng_get_uint32 (pRawdata+12); + ((mng_chrmp)*ppChunk)->iGreenx = mng_get_uint32 (pRawdata+16); + ((mng_chrmp)*ppChunk)->iGreeny = mng_get_uint32 (pRawdata+20); + ((mng_chrmp)*ppChunk)->iBluex = mng_get_uint32 (pRawdata+24); + ((mng_chrmp)*ppChunk)->iBluey = mng_get_uint32 (pRawdata+28); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_srgb) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SRGB, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA)) +#else + if ((pData->bHasIDAT) || (pData->bHasPLTE)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { /* length must be exactly 1 */ + if (iRawlen != 1) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else + { /* length must be empty or exactly 1 */ + if ((iRawlen != 0) && (iRawlen != 1)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasSRGB = MNG_TRUE; /* indicate we've got it */ + else + pData->bHasglobalSRGB = (mng_bool)(iRawlen != 0); + +#ifdef MNG_SUPPORT_DISPLAY +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + mng_imagep pImage; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* update delta image ? */ + { /* store in object 0 ! */ + pImage = (mng_imagep)pData->pObjzero; + /* store for color-processing routines */ + pImage->pImgbuf->iRenderingintent = *pRawdata; + pImage->pImgbuf->bHasSRGB = MNG_TRUE; + } + else +#endif + { + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + /* store for color-processing routines */ + pImage->pImgbuf->iRenderingintent = *pRawdata; + pImage->pImgbuf->bHasSRGB = MNG_TRUE; + } + } + else + { /* store as global */ + if (iRawlen != 0) + pData->iGlobalRendintent = *pRawdata; + + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_srgb (pData, (mng_bool)(iRawlen == 0), + pData->iGlobalRendintent); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_srgbp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + ((mng_srgbp)*ppChunk)->iRenderingintent = *pRawdata; + + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_iCCP +READ_CHUNK (mng_read_iccp) +{ + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint32 iCompressedsize; + mng_uint32 iProfilesize; + mng_uint32 iBufsize = 0; + mng_uint8p pBuf = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ICCP, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA)) +#else + if ((pData->bHasIDAT) || (pData->bHasPLTE)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { /* length must be at least 2 */ + if (iRawlen < 2) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else + { /* length must be empty or at least 2 */ + if ((iRawlen != 0) && (iRawlen < 2)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + + pTemp = find_null (pRawdata); /* find null-separator */ + /* not found inside input-data ? */ + if ((pTemp - pRawdata) > (mng_int32)iRawlen) + MNG_ERROR (pData, MNG_NULLNOTFOUND); + /* determine size of compressed profile */ + iCompressedsize = (mng_uint32)(iRawlen - (pTemp - pRawdata) - 2); + /* decompress the profile */ + iRetcode = mng_inflate_buffer (pData, pTemp+2, iCompressedsize, + &pBuf, &iBufsize, &iProfilesize); + +#ifdef MNG_CHECK_BAD_ICCP /* Check for bad iCCP chunk */ + if ((iRetcode) && (!strncmp ((char *)pRawdata, "Photoshop ICC profile", 21))) + { + if (iRawlen == 2615) /* is it the sRGB profile ? */ + { + mng_chunk_header chunk_srgb = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_sRGB, mng_init_general, mng_free_general, mng_read_srgb, mng_write_srgb, mng_assign_general, 0, 0, sizeof(mng_srgb)}; +#else + {MNG_UINT_sRGB, mng_init_srgb, mng_free_srgb, mng_read_srgb, mng_write_srgb, mng_assign_srgb, 0, 0}; +#endif + /* pretend it's an sRGB chunk then ! */ + iRetcode = mng_read_srgb (pData, &chunk_srgb, 1, (mng_ptr)"0", ppChunk); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + } + } + else + { +#endif /* MNG_CHECK_BAD_ICCP */ + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasICCP = MNG_TRUE; /* indicate we've got it */ + else + pData->bHasglobalICCP = (mng_bool)(iRawlen != 0); + +#ifdef MNG_SUPPORT_DISPLAY +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + { + mng_imagep pImage; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* update delta image ? */ + { /* store in object 0 ! */ + pImage = (mng_imagep)pData->pObjzero; + + if (pImage->pImgbuf->pProfile) /* profile existed ? */ + MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize); + /* allocate a buffer & copy it */ + MNG_ALLOC (pData, pImage->pImgbuf->pProfile, iProfilesize); + MNG_COPY (pImage->pImgbuf->pProfile, pBuf, iProfilesize); + /* store its length as well */ + pImage->pImgbuf->iProfilesize = iProfilesize; + pImage->pImgbuf->bHasICCP = MNG_TRUE; + } + else +#endif + { + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* no object then dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + if (pImage->pImgbuf->pProfile) /* profile existed ? */ + MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize); + /* allocate a buffer & copy it */ + MNG_ALLOC (pData, pImage->pImgbuf->pProfile, iProfilesize); + MNG_COPY (pImage->pImgbuf->pProfile, pBuf, iProfilesize); + /* store its length as well */ + pImage->pImgbuf->iProfilesize = iProfilesize; + pImage->pImgbuf->bHasICCP = MNG_TRUE; + } + } + else + { /* store as global */ + if (iRawlen == 0) /* empty chunk ? */ + { + if (pData->pGlobalProfile) /* did we have a global profile ? */ + MNG_FREEX (pData, pData->pGlobalProfile, pData->iGlobalProfilesize); + + pData->iGlobalProfilesize = 0; /* reset to null */ + pData->pGlobalProfile = MNG_NULL; + } + else + { /* allocate a global buffer & copy it */ + MNG_ALLOC (pData, pData->pGlobalProfile, iProfilesize); + MNG_COPY (pData->pGlobalProfile, pBuf, iProfilesize); + /* store its length as well */ + pData->iGlobalProfilesize = iProfilesize; + } + + /* create an animation object */ + iRetcode = mng_create_ani_iccp (pData, (mng_bool)(iRawlen == 0), + pData->iGlobalProfilesize, + pData->pGlobalProfile); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + /* store the fields */ + ((mng_iccpp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) /* not empty ? */ + { + if (!pBuf) /* hasn't been unpuzzled it yet ? */ + { /* find null-separator */ + pTemp = find_null (pRawdata); + /* not found inside input-data ? */ + if ((pTemp - pRawdata) > (mng_int32)iRawlen) + MNG_ERROR (pData, MNG_NULLNOTFOUND); + /* determine size of compressed profile */ + iCompressedsize = iRawlen - (pTemp - pRawdata) - 2; + /* decompress the profile */ + iRetcode = mng_inflate_buffer (pData, pTemp+2, iCompressedsize, + &pBuf, &iBufsize, &iProfilesize); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + } + + ((mng_iccpp)*ppChunk)->iNamesize = (mng_uint32)(pTemp - pRawdata); + + if (((mng_iccpp)*ppChunk)->iNamesize) + { + MNG_ALLOC (pData, ((mng_iccpp)*ppChunk)->zName, + ((mng_iccpp)*ppChunk)->iNamesize + 1); + MNG_COPY (((mng_iccpp)*ppChunk)->zName, pRawdata, + ((mng_iccpp)*ppChunk)->iNamesize); + } + + ((mng_iccpp)*ppChunk)->iCompression = *(pTemp+1); + ((mng_iccpp)*ppChunk)->iProfilesize = iProfilesize; + + MNG_ALLOC (pData, ((mng_iccpp)*ppChunk)->pProfile, iProfilesize); + MNG_COPY (((mng_iccpp)*ppChunk)->pProfile, pBuf, iProfilesize); + } + } +#endif /* MNG_STORE_CHUNKS */ + + if (pBuf) /* free the temporary buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + +#ifdef MNG_CHECK_BAD_ICCP + } +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ICCP, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_tEXt +READ_CHUNK (mng_read_text) +{ + mng_uint32 iKeywordlen, iTextlen; + mng_pchar zKeyword, zText; + mng_uint8p pTemp; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_TEXT, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 2) /* length must be at least 2 */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pTemp = find_null (pRawdata); /* find the null separator */ + /* not found inside input-data ? */ + if ((pTemp - pRawdata) > (mng_int32)iRawlen) + MNG_ERROR (pData, MNG_NULLNOTFOUND); + + if (pTemp == pRawdata) /* there must be at least 1 char for keyword */ + MNG_ERROR (pData, MNG_KEYWORDNULL); + + iKeywordlen = (mng_uint32)(pTemp - pRawdata); + iTextlen = iRawlen - iKeywordlen - 1; + + if (pData->fProcesstext) /* inform the application ? */ + { + mng_bool bOke; + + MNG_ALLOC (pData, zKeyword, iKeywordlen + 1); + MNG_COPY (zKeyword, pRawdata, iKeywordlen); + + MNG_ALLOCX (pData, zText, iTextlen + 1); + + if (!zText) /* on error bail out */ + { + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + if (iTextlen) + MNG_COPY (zText, pTemp+1, iTextlen); + + bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_TEXT, zKeyword, zText, 0, 0); + + MNG_FREEX (pData, zText, iTextlen + 1); + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + + } + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_textp)*ppChunk)->iKeywordsize = iKeywordlen; + ((mng_textp)*ppChunk)->iTextsize = iTextlen; + + if (iKeywordlen) + { + MNG_ALLOC (pData, ((mng_textp)*ppChunk)->zKeyword, iKeywordlen+1); + MNG_COPY (((mng_textp)*ppChunk)->zKeyword, pRawdata, iKeywordlen); + } + + if (iTextlen) + { + MNG_ALLOC (pData, ((mng_textp)*ppChunk)->zText, iTextlen+1); + MNG_COPY (((mng_textp)*ppChunk)->zText, pTemp+1, iTextlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_TEXT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_zTXt +READ_CHUNK (mng_read_ztxt) +{ + mng_retcode iRetcode; + mng_uint32 iKeywordlen, iTextlen; + mng_pchar zKeyword; + mng_uint8p pTemp; + mng_uint32 iCompressedsize; + mng_uint32 iBufsize; + mng_uint8p pBuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ZTXT, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 3) /* length must be at least 3 */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pTemp = find_null (pRawdata); /* find the null separator */ + /* not found inside input-data ? */ + if ((pTemp - pRawdata) > (mng_int32)iRawlen) + MNG_ERROR (pData, MNG_NULLNOTFOUND); + + if (pTemp == pRawdata) /* there must be at least 1 char for keyword */ + MNG_ERROR (pData, MNG_KEYWORDNULL); + + if (*(pTemp+1) != 0) /* only deflate compression-method allowed */ + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + + iKeywordlen = (mng_uint32)(pTemp - pRawdata); + iCompressedsize = (mng_uint32)(iRawlen - iKeywordlen - 2); + + zKeyword = 0; /* there's no keyword buffer yet */ + pBuf = 0; /* or a temporary buffer ! */ + + if (pData->fProcesstext) /* inform the application ? */ + { /* decompress the text */ + iRetcode = mng_inflate_buffer (pData, pTemp+2, iCompressedsize, + &pBuf, &iBufsize, &iTextlen); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + + MNG_ALLOCX (pData, zKeyword, iKeywordlen+1); + + if (!zKeyword) /* on error bail out */ + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + MNG_COPY (zKeyword, pRawdata, iKeywordlen); + + if (!pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ZTXT, zKeyword, (mng_pchar)pBuf, 0, 0)) + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, pBuf, iBufsize); + MNG_FREEX (pData, zKeyword, iKeywordlen+1); + MNG_ERROR (pData, MNG_APPMISCERROR); + } + } + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, pBuf, iBufsize); + MNG_FREEX (pData, zKeyword, iKeywordlen+1); + return iRetcode; + } + /* store the fields */ + ((mng_ztxtp)*ppChunk)->iKeywordsize = iKeywordlen; + ((mng_ztxtp)*ppChunk)->iCompression = *(pTemp+1); + + if ((!pBuf) && (iCompressedsize)) /* did we not get a text-buffer yet ? */ + { /* decompress the text */ + iRetcode = mng_inflate_buffer (pData, pTemp+2, iCompressedsize, + &pBuf, &iBufsize, &iTextlen); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, pBuf, iBufsize); + MNG_FREEX (pData, zKeyword, iKeywordlen+1); + return iRetcode; + } + } + + MNG_ALLOCX (pData, ((mng_ztxtp)*ppChunk)->zKeyword, iKeywordlen + 1); + /* on error bail out */ + if (!((mng_ztxtp)*ppChunk)->zKeyword) + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, pBuf, iBufsize); + MNG_FREEX (pData, zKeyword, iKeywordlen+1); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + MNG_COPY (((mng_ztxtp)*ppChunk)->zKeyword, pRawdata, iKeywordlen); + + ((mng_ztxtp)*ppChunk)->iTextsize = iTextlen; + + if (iCompressedsize) + { + MNG_ALLOCX (pData, ((mng_ztxtp)*ppChunk)->zText, iTextlen + 1); + /* on error bail out */ + if (!((mng_ztxtp)*ppChunk)->zText) + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, pBuf, iBufsize); + MNG_FREEX (pData, zKeyword, iKeywordlen+1); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + MNG_COPY (((mng_ztxtp)*ppChunk)->zText, pBuf, iTextlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + + MNG_FREEX (pData, pBuf, iBufsize); /* free the temporary buffers */ + MNG_FREEX (pData, zKeyword, iKeywordlen+1); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ZTXT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_iTXt +READ_CHUNK (mng_read_itxt) +{ + mng_retcode iRetcode; + mng_uint32 iKeywordlen, iTextlen, iLanguagelen, iTranslationlen; + mng_pchar zKeyword, zLanguage, zTranslation; + mng_uint8p pNull1, pNull2, pNull3; + mng_uint32 iCompressedsize; + mng_uint8 iCompressionflag; + mng_uint32 iBufsize; + mng_uint8p pBuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ITXT, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 6) /* length must be at least 6 */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pNull1 = find_null (pRawdata); /* find the null separators */ + pNull2 = find_null (pNull1+3); + pNull3 = find_null (pNull2+1); + /* not found inside input-data ? */ + if (((pNull1 - pRawdata) > (mng_int32)iRawlen) || + ((pNull2 - pRawdata) > (mng_int32)iRawlen) || + ((pNull3 - pRawdata) > (mng_int32)iRawlen) ) + MNG_ERROR (pData, MNG_NULLNOTFOUND); + + if (pNull1 == pRawdata) /* there must be at least 1 char for keyword */ + MNG_ERROR (pData, MNG_KEYWORDNULL); + /* compression or not ? */ + if ((*(pNull1+1) != 0) && (*(pNull1+1) != 1)) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + + if (*(pNull1+2) != 0) /* only deflate compression-method allowed */ + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + + iKeywordlen = (mng_uint32)(pNull1 - pRawdata); + iLanguagelen = (mng_uint32)(pNull2 - pNull1 - 3); + iTranslationlen = (mng_uint32)(pNull3 - pNull2 - 1); + iCompressedsize = (mng_uint32)(iRawlen - iKeywordlen - iLanguagelen - iTranslationlen - 5); + iCompressionflag = *(pNull1+1); + + zKeyword = 0; /* no buffers acquired yet */ + zLanguage = 0; + zTranslation = 0; + pBuf = 0; + iTextlen = 0; + + if (pData->fProcesstext) /* inform the application ? */ + { + if (iCompressionflag) /* decompress the text ? */ + { + iRetcode = mng_inflate_buffer (pData, pNull3+1, iCompressedsize, + &pBuf, &iBufsize, &iTextlen); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffer */ + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + } + else + { + iTextlen = iCompressedsize; + iBufsize = iTextlen+1; /* plus 1 for terminator byte!!! */ + + MNG_ALLOC (pData, pBuf, iBufsize); + MNG_COPY (pBuf, pNull3+1, iTextlen); + } + + MNG_ALLOCX (pData, zKeyword, iKeywordlen + 1); + MNG_ALLOCX (pData, zLanguage, iLanguagelen + 1); + MNG_ALLOCX (pData, zTranslation, iTranslationlen + 1); + /* on error bail out */ + if ((!zKeyword) || (!zLanguage) || (!zTranslation)) + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, zTranslation, iTranslationlen + 1); + MNG_FREEX (pData, zLanguage, iLanguagelen + 1); + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + MNG_COPY (zKeyword, pRawdata, iKeywordlen); + MNG_COPY (zLanguage, pNull1+3, iLanguagelen); + MNG_COPY (zTranslation, pNull2+1, iTranslationlen); + + if (!pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ITXT, zKeyword, (mng_pchar)pBuf, + zLanguage, zTranslation)) + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, zTranslation, iTranslationlen + 1); + MNG_FREEX (pData, zLanguage, iLanguagelen + 1); + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + MNG_FREEX (pData, pBuf, iBufsize); + + MNG_ERROR (pData, MNG_APPMISCERROR); + } + } + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, zTranslation, iTranslationlen + 1); + MNG_FREEX (pData, zLanguage, iLanguagelen + 1); + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + /* store the fields */ + ((mng_itxtp)*ppChunk)->iKeywordsize = iKeywordlen; + ((mng_itxtp)*ppChunk)->iLanguagesize = iLanguagelen; + ((mng_itxtp)*ppChunk)->iTranslationsize = iTranslationlen; + ((mng_itxtp)*ppChunk)->iCompressionflag = *(pNull1+1); + ((mng_itxtp)*ppChunk)->iCompressionmethod = *(pNull1+2); + + if ((!pBuf) && (iCompressedsize)) /* did we not get a text-buffer yet ? */ + { + if (iCompressionflag) /* decompress the text ? */ + { + iRetcode = mng_inflate_buffer (pData, pNull3+1, iCompressedsize, + &pBuf, &iBufsize, &iTextlen); + + if (iRetcode) /* on error bail out */ + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, zTranslation, iTranslationlen + 1); + MNG_FREEX (pData, zLanguage, iLanguagelen + 1); + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + } + else + { + iTextlen = iCompressedsize; + iBufsize = iTextlen+1; /* plus 1 for terminator byte!!! */ + + MNG_ALLOC (pData, pBuf, iBufsize); + MNG_COPY (pBuf, pNull3+1, iTextlen); + } + } + + MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zKeyword, iKeywordlen + 1); + MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zLanguage, iLanguagelen + 1); + MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zTranslation, iTranslationlen + 1); + /* on error bail out */ + if ((!((mng_itxtp)*ppChunk)->zKeyword ) || + (!((mng_itxtp)*ppChunk)->zLanguage ) || + (!((mng_itxtp)*ppChunk)->zTranslation) ) + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, zTranslation, iTranslationlen + 1); + MNG_FREEX (pData, zLanguage, iLanguagelen + 1); + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + MNG_COPY (((mng_itxtp)*ppChunk)->zKeyword, pRawdata, iKeywordlen); + MNG_COPY (((mng_itxtp)*ppChunk)->zLanguage, pNull1+3, iLanguagelen); + MNG_COPY (((mng_itxtp)*ppChunk)->zTranslation, pNull2+1, iTranslationlen); + + ((mng_itxtp)*ppChunk)->iTextsize = iTextlen; + + if (iTextlen) + { + MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zText, iTextlen + 1); + + if (!((mng_itxtp)*ppChunk)->zText) + { /* don't forget to drop the temp buffers */ + MNG_FREEX (pData, zTranslation, iTranslationlen + 1); + MNG_FREEX (pData, zLanguage, iLanguagelen + 1); + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + MNG_COPY (((mng_itxtp)*ppChunk)->zText, pBuf, iTextlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + /* free the temporary buffers */ + MNG_FREEX (pData, zTranslation, iTranslationlen + 1); + MNG_FREEX (pData, zLanguage, iLanguagelen + 1); + MNG_FREEX (pData, zKeyword, iKeywordlen + 1); + MNG_FREEX (pData, pBuf, iBufsize); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ITXT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_bKGD +READ_CHUNK (mng_read_bkgd) +{ +#ifdef MNG_SUPPORT_DISPLAY + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + mng_imagedatap pBuf; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_BKGD, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA)) +#else + if (pData->bHasIDAT) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen > 6) /* it just can't be bigger than that! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_INCLUDE_JNG /* length checks */ + if (pData->bHasJHDR) + { + if (((pData->iJHDRcolortype == 8) || (pData->iJHDRcolortype == 12)) && (iRawlen != 2)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if (((pData->iJHDRcolortype == 10) || (pData->iJHDRcolortype == 14)) && (iRawlen != 6)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else +#endif /* MNG_INCLUDE_JNG */ + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { + if (((pData->iColortype == 0) || (pData->iColortype == 4)) && (iRawlen != 2)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if (((pData->iColortype == 2) || (pData->iColortype == 6)) && (iRawlen != 6)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iColortype == 3) && (iRawlen != 1)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else + { + if (iRawlen != 6) /* global is always 16-bit RGB ! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + pData->bHasBKGD = MNG_TRUE; /* indicate bKGD available */ + else + pData->bHasglobalBKGD = (mng_bool)(iRawlen != 0); + +#ifdef MNG_SUPPORT_DISPLAY + if (!pImage) /* if no object dump it in obj 0 */ + pImage = (mng_imagep)pData->pObjzero; + + pBuf = pImage->pImgbuf; /* address object buffer */ + +#ifdef MNG_INCLUDE_JNG + if (pData->bHasJHDR) + { + pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */ + + switch (pData->iJHDRcolortype) /* store fields for future reference */ + { + case 8 : ; /* gray */ + case 12 : { /* graya */ + pBuf->iBKGDgray = mng_get_uint16 (pRawdata); + break; + } + case 10 : ; /* rgb */ + case 14 : { /* rgba */ + pBuf->iBKGDred = mng_get_uint16 (pRawdata); + pBuf->iBKGDgreen = mng_get_uint16 (pRawdata+2); + pBuf->iBKGDblue = mng_get_uint16 (pRawdata+4); + break; + } + } + } + else +#endif /* MNG_INCLUDE_JNG */ + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { + pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */ + + switch (pData->iColortype) /* store fields for future reference */ + { + case 0 : ; /* gray */ + case 4 : { /* graya */ + pBuf->iBKGDgray = mng_get_uint16 (pRawdata); + break; + } + case 2 : ; /* rgb */ + case 6 : { /* rgba */ + pBuf->iBKGDred = mng_get_uint16 (pRawdata); + pBuf->iBKGDgreen = mng_get_uint16 (pRawdata+2); + pBuf->iBKGDblue = mng_get_uint16 (pRawdata+4); + break; + } + case 3 : { /* indexed */ + pBuf->iBKGDindex = *pRawdata; + break; + } + } + } + else /* store as global */ + { + if (iRawlen) + { + pData->iGlobalBKGDred = mng_get_uint16 (pRawdata); + pData->iGlobalBKGDgreen = mng_get_uint16 (pRawdata+2); + pData->iGlobalBKGDblue = mng_get_uint16 (pRawdata+4); + } + + { /* create an animation object */ + mng_retcode iRetcode = mng_create_ani_bkgd (pData, pData->iGlobalBKGDred, + pData->iGlobalBKGDgreen, + pData->iGlobalBKGDblue); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_bkgdp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + ((mng_bkgdp)*ppChunk)->iType = pData->iColortype; + + if (iRawlen) + { + switch (iRawlen) /* guess from length */ + { + case 1 : { /* indexed */ + ((mng_bkgdp)*ppChunk)->iType = 3; + ((mng_bkgdp)*ppChunk)->iIndex = *pRawdata; + break; + } + case 2 : { /* gray */ + ((mng_bkgdp)*ppChunk)->iType = 0; + ((mng_bkgdp)*ppChunk)->iGray = mng_get_uint16 (pRawdata); + break; + } + case 6 : { /* rgb */ + ((mng_bkgdp)*ppChunk)->iType = 2; + ((mng_bkgdp)*ppChunk)->iRed = mng_get_uint16 (pRawdata); + ((mng_bkgdp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2); + ((mng_bkgdp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4); + break; + } + } + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_pHYs +READ_CHUNK (mng_read_phys) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PHYS, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA)) +#else + if (pData->bHasIDAT) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* it's 9 bytes or empty; no more, no less! */ + if ((iRawlen != 9) && (iRawlen != 0)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_physp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + { + ((mng_physp)*ppChunk)->iSizex = mng_get_uint32 (pRawdata); + ((mng_physp)*ppChunk)->iSizey = mng_get_uint32 (pRawdata+4); + ((mng_physp)*ppChunk)->iUnit = *(pRawdata+8); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PHYS, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_sBIT +READ_CHUNK (mng_read_sbit) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SBIT, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasPLTE) || (pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA)) +#else + if ((pData->bHasPLTE) || (pData->bHasIDAT)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen > 4) /* it just can't be bigger than that! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_INCLUDE_JNG /* length checks */ + if (pData->bHasJHDR) + { + if ((pData->iJHDRcolortype == 8) && (iRawlen != 1)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iJHDRcolortype == 10) && (iRawlen != 3)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iJHDRcolortype == 12) && (iRawlen != 2)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iJHDRcolortype == 14) && (iRawlen != 4)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else +#endif /* MNG_INCLUDE_JNG */ + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) + { + if ((pData->iColortype == 0) && (iRawlen != 1)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iColortype == 2) && (iRawlen != 3)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iColortype == 3) && (iRawlen != 3)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iColortype == 4) && (iRawlen != 2)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((pData->iColortype == 6) && (iRawlen != 4)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else + { /* global = empty or RGBA */ + if ((iRawlen != 0) && (iRawlen != 4)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_sbitp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + { +#ifdef MNG_INCLUDE_JNG + if (pData->bHasJHDR) + ((mng_sbitp)*ppChunk)->iType = pData->iJHDRcolortype; + else +#endif + if (pData->bHasIHDR) + ((mng_sbitp)*ppChunk)->iType = pData->iColortype; + else /* global ! */ + ((mng_sbitp)*ppChunk)->iType = 6; + + if (iRawlen > 0) + ((mng_sbitp)*ppChunk)->aBits [0] = *pRawdata; + if (iRawlen > 1) + ((mng_sbitp)*ppChunk)->aBits [1] = *(pRawdata+1); + if (iRawlen > 2) + ((mng_sbitp)*ppChunk)->aBits [2] = *(pRawdata+2); + if (iRawlen > 3) + ((mng_sbitp)*ppChunk)->aBits [3] = *(pRawdata+3); + + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SBIT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_sPLT +READ_CHUNK (mng_read_splt) +{ + mng_uint8p pTemp; + mng_uint32 iNamelen; + mng_uint8 iSampledepth; + mng_uint32 iRemain; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SPLT, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (pData->bHasIDAT) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen) + { + pTemp = find_null (pRawdata); /* find null-separator */ + /* not found inside input-data ? */ + if ((pTemp - pRawdata) > (mng_int32)iRawlen) + MNG_ERROR (pData, MNG_NULLNOTFOUND); + + iNamelen = (mng_uint32)(pTemp - pRawdata); + iSampledepth = *(pTemp+1); + iRemain = (iRawlen - 2 - iNamelen); + + if ((iSampledepth != 1) && (iSampledepth != 2)) + MNG_ERROR (pData, MNG_INVSAMPLEDEPTH); + /* check remaining length */ + if ( ((iSampledepth == 1) && (iRemain % 6 != 0)) || + ((iSampledepth == 2) && (iRemain % 10 != 0)) ) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + } + else + { + pTemp = MNG_NULL; + iNamelen = 0; + iSampledepth = 0; + iRemain = 0; + } + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_spltp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + { + ((mng_spltp)*ppChunk)->iNamesize = iNamelen; + ((mng_spltp)*ppChunk)->iSampledepth = iSampledepth; + + if (iSampledepth == 1) + ((mng_spltp)*ppChunk)->iEntrycount = iRemain / 6; + else + ((mng_spltp)*ppChunk)->iEntrycount = iRemain / 10; + + if (iNamelen) + { + MNG_ALLOC (pData, ((mng_spltp)*ppChunk)->zName, iNamelen+1); + MNG_COPY (((mng_spltp)*ppChunk)->zName, pRawdata, iNamelen); + } + + if (iRemain) + { + MNG_ALLOC (pData, ((mng_spltp)*ppChunk)->pEntries, iRemain); + MNG_COPY (((mng_spltp)*ppChunk)->pEntries, pTemp+2, iRemain); + } + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_hIST +READ_CHUNK (mng_read_hist) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_HIST, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) ) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if ((!pData->bHasPLTE) || (pData->bHasIDAT)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* length oke ? */ + if ( ((iRawlen & 0x01) != 0) || ((iRawlen >> 1) != pData->iPLTEcount) ) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { + mng_uint32 iX; + /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_histp)*ppChunk)->iEntrycount = iRawlen >> 1; + + for (iX = 0; iX < (iRawlen >> 1); iX++) + { + ((mng_histp)*ppChunk)->aEntries [iX] = mng_get_uint16 (pRawdata); + pRawdata += 2; + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_HIST, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_tIME +READ_CHUNK (mng_read_time) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_TIME, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 7) /* length must be exactly 7 */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +/* if (pData->fProcesstime) */ /* inform the application ? */ +/* { + + pData->fProcesstime ((mng_handle)pData, ); + } */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_timep)*ppChunk)->iYear = mng_get_uint16 (pRawdata); + ((mng_timep)*ppChunk)->iMonth = *(pRawdata+2); + ((mng_timep)*ppChunk)->iDay = *(pRawdata+3); + ((mng_timep)*ppChunk)->iHour = *(pRawdata+4); + ((mng_timep)*ppChunk)->iMinute = *(pRawdata+5); + ((mng_timep)*ppChunk)->iSecond = *(pRawdata+6); + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_TIME, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_mhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MHDR, MNG_LC_START); +#endif + + if (pData->eSigtype != mng_it_mng) /* sequence checks */ + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + + if (pData->bHasheader) /* can only be the first chunk! */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* correct length ? */ +#ifndef MNG_NO_OLD_VERSIONS + if ((iRawlen != 28) && (iRawlen != 12)) +#else + if ((iRawlen != 28)) +#endif + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pData->bHasMHDR = MNG_TRUE; /* oh boy, a real MNG */ + pData->bHasheader = MNG_TRUE; /* we've got a header */ + pData->eImagetype = mng_it_mng; /* fill header fields */ + pData->iWidth = mng_get_uint32 (pRawdata); + pData->iHeight = mng_get_uint32 (pRawdata+4); + pData->iTicks = mng_get_uint32 (pRawdata+8); + +#ifndef MNG_NO_OLD_VERSIONS + if (iRawlen == 28) /* proper MHDR ? */ + { +#endif + pData->iLayercount = mng_get_uint32 (pRawdata+12); + pData->iFramecount = mng_get_uint32 (pRawdata+16); + pData->iPlaytime = mng_get_uint32 (pRawdata+20); + pData->iSimplicity = mng_get_uint32 (pRawdata+24); + +#ifndef MNG_NO_OLD_VERSIONS + pData->bPreDraft48 = MNG_FALSE; + } + else /* probably pre-draft48 then */ + { + pData->iLayercount = 0; + pData->iFramecount = 0; + pData->iPlaytime = 0; + pData->iSimplicity = 0; + + pData->bPreDraft48 = MNG_TRUE; + } +#endif + /* predict alpha-depth */ + if ((pData->iSimplicity & 0x00000001) == 0) +#ifndef MNG_NO_16BIT_SUPPORT + pData->iAlphadepth = 16; /* no indicators = assume the worst */ +#else + pData->iAlphadepth = 8; /* anything else = assume the worst */ +#endif + else + if ((pData->iSimplicity & 0x00000008) == 0) + pData->iAlphadepth = 0; /* no transparency at all */ + else + if ((pData->iSimplicity & 0x00000140) == 0x00000040) + pData->iAlphadepth = 1; /* no semi-transparency guaranteed */ + else +#ifndef MNG_NO_16BIT_SUPPORT + pData->iAlphadepth = 16; /* anything else = assume the worst */ +#else + pData->iAlphadepth = 8; /* anything else = assume the worst */ +#endif + +#ifdef MNG_INCLUDE_JNG /* can we handle the complexity ? */ + if (pData->iSimplicity & 0x0000FC00) +#else + if (pData->iSimplicity & 0x0000FC10) +#endif + MNG_ERROR (pData, MNG_MNGTOOCOMPLEX); + /* fits on maximum canvas ? */ + if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight)) + MNG_WARNING (pData, MNG_IMAGETOOLARGE); + + if (pData->fProcessheader) /* inform the app ? */ + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_mhdrp)*ppChunk)->iWidth = pData->iWidth; + ((mng_mhdrp)*ppChunk)->iHeight = pData->iHeight; + ((mng_mhdrp)*ppChunk)->iTicks = pData->iTicks; + ((mng_mhdrp)*ppChunk)->iLayercount = pData->iLayercount; + ((mng_mhdrp)*ppChunk)->iFramecount = pData->iFramecount; + ((mng_mhdrp)*ppChunk)->iPlaytime = pData->iPlaytime; + ((mng_mhdrp)*ppChunk)->iSimplicity = pData->iSimplicity; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_mend) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MEND, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen > 0) /* must not contain data! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { /* do something */ + mng_retcode iRetcode = mng_process_display_mend (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (!pData->iTotalframes) /* save totals */ + pData->iTotalframes = pData->iFrameseq; + if (!pData->iTotallayers) + pData->iTotallayers = pData->iLayerseq; + if (!pData->iTotalplaytime) + pData->iTotalplaytime = pData->iFrametime; + } +#endif /* MNG_SUPPORT_DISPLAY */ + + pData->bHasMHDR = MNG_FALSE; /* end of the line, bro! */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MEND, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_LOOP +READ_CHUNK (mng_read_loop) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_LOOP, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (!pData->bCacheplayback) /* must store playback info to work!! */ + MNG_ERROR (pData, MNG_LOOPWITHCACHEOFF); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen >= 5) /* length checks */ + { + if (iRawlen >= 6) + { + if ((iRawlen - 6) % 4 != 0) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_uint8 iLevel; + mng_uint32 iRepeat; + mng_uint8 iTermination = 0; + mng_uint32 iItermin = 1; + mng_uint32 iItermax = 0x7fffffffL; + mng_retcode iRetcode; + + pData->bHasLOOP = MNG_TRUE; /* indicate we're inside a loop */ + + iLevel = *pRawdata; /* determine the fields for processing */ + +#ifndef MNG_NO_OLD_VERSIONS + if (pData->bPreDraft48) + { + iTermination = *(pRawdata+1); + + iRepeat = mng_get_uint32 (pRawdata+2); + } + else +#endif + iRepeat = mng_get_uint32 (pRawdata+1); + + if (iRawlen >= 6) + { +#ifndef MNG_NO_OLD_VERSIONS + if (!pData->bPreDraft48) +#endif + iTermination = *(pRawdata+5); + + if (iRawlen >= 10) + { + iItermin = mng_get_uint32 (pRawdata+6); + + if (iRawlen >= 14) + { + iItermax = mng_get_uint32 (pRawdata+10); + + /* TODO: process signals */ + + } + } + } + /* create the LOOP ani-object */ + iRetcode = mng_create_ani_loop (pData, iLevel, iRepeat, iTermination, + iItermin, iItermax, 0, 0); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* skip till matching ENDL if iteration=0 */ + if ((!pData->bSkipping) && (iRepeat == 0)) + pData->bSkipping = MNG_TRUE; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (iRawlen >= 5) /* store the fields */ + { + ((mng_loopp)*ppChunk)->iLevel = *pRawdata; + +#ifndef MNG_NO_OLD_VERSIONS + if (pData->bPreDraft48) + { + ((mng_loopp)*ppChunk)->iTermination = *(pRawdata+1); + ((mng_loopp)*ppChunk)->iRepeat = mng_get_uint32 (pRawdata+2); + } + else +#endif + { + ((mng_loopp)*ppChunk)->iRepeat = mng_get_uint32 (pRawdata+1); + } + + if (iRawlen >= 6) + { +#ifndef MNG_NO_OLD_VERSIONS + if (!pData->bPreDraft48) +#endif + ((mng_loopp)*ppChunk)->iTermination = *(pRawdata+5); + + if (iRawlen >= 10) + { + ((mng_loopp)*ppChunk)->iItermin = mng_get_uint32 (pRawdata+6); + +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + if (iRawlen >= 14) + { + ((mng_loopp)*ppChunk)->iItermax = mng_get_uint32 (pRawdata+10); + ((mng_loopp)*ppChunk)->iCount = (iRawlen - 14) / 4; + + if (((mng_loopp)*ppChunk)->iCount) + { + MNG_ALLOC (pData, ((mng_loopp)*ppChunk)->pSignals, + ((mng_loopp)*ppChunk)->iCount << 2); + +#ifndef MNG_BIGENDIAN_SUPPORTED + { + mng_uint32 iX; + mng_uint8p pIn = pRawdata + 14; + mng_uint32p pOut = (mng_uint32p)((mng_loopp)*ppChunk)->pSignals; + + for (iX = 0; iX < ((mng_loopp)*ppChunk)->iCount; iX++) + { + *pOut++ = mng_get_uint32 (pIn); + pIn += 4; + } + } +#else + MNG_COPY (((mng_loopp)*ppChunk)->pSignals, pRawdata + 14, + ((mng_loopp)*ppChunk)->iCount << 2); +#endif /* !MNG_BIGENDIAN_SUPPORTED */ + } + } +#endif + } + } + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_LOOP, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_LOOP +READ_CHUNK (mng_read_endl) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ENDL, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 1) /* length must be exactly 1 */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + if (pData->bHasLOOP) /* are we really processing a loop ? */ + { + mng_uint8 iLevel = *pRawdata; /* get the nest level */ + /* create an ENDL animation object */ + mng_retcode iRetcode = mng_create_ani_endl (pData, iLevel); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +/* { + mng_ani_endlp pENDL = (mng_ani_endlp)pData->pLastaniobj; + + iRetcode = pENDL->sHeader.fProcess (pData, pENDL); + + if (iRetcode) + return iRetcode; + } */ + } + else + MNG_ERROR (pData, MNG_NOMATCHINGLOOP); + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_endlp)*ppChunk)->iLevel = *pRawdata; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_DEFI +READ_CHUNK (mng_read_defi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DEFI, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check the length */ + if ((iRawlen != 2) && (iRawlen != 3) && (iRawlen != 4) && + (iRawlen != 12) && (iRawlen != 28)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + + pData->iDEFIobjectid = mng_get_uint16 (pRawdata); + + if (iRawlen > 2) + { + pData->bDEFIhasdonotshow = MNG_TRUE; + pData->iDEFIdonotshow = *(pRawdata+2); + } + else + { + pData->bDEFIhasdonotshow = MNG_FALSE; + pData->iDEFIdonotshow = 0; + } + + if (iRawlen > 3) + { + pData->bDEFIhasconcrete = MNG_TRUE; + pData->iDEFIconcrete = *(pRawdata+3); + } + else + { + pData->bDEFIhasconcrete = MNG_FALSE; + pData->iDEFIconcrete = 0; + } + + if (iRawlen > 4) + { + pData->bDEFIhasloca = MNG_TRUE; + pData->iDEFIlocax = mng_get_int32 (pRawdata+4); + pData->iDEFIlocay = mng_get_int32 (pRawdata+8); + } + else + { + pData->bDEFIhasloca = MNG_FALSE; + pData->iDEFIlocax = 0; + pData->iDEFIlocay = 0; + } + + if (iRawlen > 12) + { + pData->bDEFIhasclip = MNG_TRUE; + pData->iDEFIclipl = mng_get_int32 (pRawdata+12); + pData->iDEFIclipr = mng_get_int32 (pRawdata+16); + pData->iDEFIclipt = mng_get_int32 (pRawdata+20); + pData->iDEFIclipb = mng_get_int32 (pRawdata+24); + } + else + { + pData->bDEFIhasclip = MNG_FALSE; + pData->iDEFIclipl = 0; + pData->iDEFIclipr = 0; + pData->iDEFIclipt = 0; + pData->iDEFIclipb = 0; + } + /* create an animation object */ + iRetcode = mng_create_ani_defi (pData); + + if (!iRetcode) /* do display processing */ + iRetcode = mng_process_display_defi (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_defip)*ppChunk)->iObjectid = mng_get_uint16 (pRawdata); + + if (iRawlen > 2) + { + ((mng_defip)*ppChunk)->bHasdonotshow = MNG_TRUE; + ((mng_defip)*ppChunk)->iDonotshow = *(pRawdata+2); + } + else + ((mng_defip)*ppChunk)->bHasdonotshow = MNG_FALSE; + + if (iRawlen > 3) + { + ((mng_defip)*ppChunk)->bHasconcrete = MNG_TRUE; + ((mng_defip)*ppChunk)->iConcrete = *(pRawdata+3); + } + else + ((mng_defip)*ppChunk)->bHasconcrete = MNG_FALSE; + + if (iRawlen > 4) + { + ((mng_defip)*ppChunk)->bHasloca = MNG_TRUE; + ((mng_defip)*ppChunk)->iXlocation = mng_get_int32 (pRawdata+4); + ((mng_defip)*ppChunk)->iYlocation = mng_get_int32 (pRawdata+8); + } + else + ((mng_defip)*ppChunk)->bHasloca = MNG_FALSE; + + if (iRawlen > 12) + { + ((mng_defip)*ppChunk)->bHasclip = MNG_TRUE; + ((mng_defip)*ppChunk)->iLeftcb = mng_get_int32 (pRawdata+12); + ((mng_defip)*ppChunk)->iRightcb = mng_get_int32 (pRawdata+16); + ((mng_defip)*ppChunk)->iTopcb = mng_get_int32 (pRawdata+20); + ((mng_defip)*ppChunk)->iBottomcb = mng_get_int32 (pRawdata+24); + } + else + ((mng_defip)*ppChunk)->bHasclip = MNG_FALSE; + + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_BASI +READ_CHUNK (mng_read_basi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_BASI, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check the length */ + if ((iRawlen != 13) && (iRawlen != 19) && (iRawlen != 21) && (iRawlen != 22)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pData->bHasBASI = MNG_TRUE; /* inside a BASI-IEND block now */ + /* store interesting fields */ + pData->iDatawidth = mng_get_uint32 (pRawdata); + pData->iDataheight = mng_get_uint32 (pRawdata+4); + pData->iBitdepth = *(pRawdata+8); + pData->iColortype = *(pRawdata+9); + pData->iCompression = *(pRawdata+10); + pData->iFilter = *(pRawdata+11); + pData->iInterlace = *(pRawdata+12); + + +#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT) + pData->iPNGmult = 1; + pData->iPNGdepth = pData->iBitdepth; +#endif + +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iBitdepth < 8) + pData->iBitdepth = 8; +#endif +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth > 8) + { + pData->iBitdepth = 8; + pData->iPNGmult = 2; + } +#endif + + if ((pData->iBitdepth != 8) /* parameter validity checks */ +#ifndef MNG_NO_1_2_4BIT_SUPPORT + && (pData->iBitdepth != 1) && + (pData->iBitdepth != 2) && + (pData->iBitdepth != 4) +#endif +#ifndef MNG_NO_16BIT_SUPPORT + && (pData->iBitdepth != 16) +#endif + ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ((pData->iColortype != MNG_COLORTYPE_GRAY ) && + (pData->iColortype != MNG_COLORTYPE_RGB ) && + (pData->iColortype != MNG_COLORTYPE_INDEXED) && + (pData->iColortype != MNG_COLORTYPE_GRAYA ) && + (pData->iColortype != MNG_COLORTYPE_RGBA ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8)) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (((pData->iColortype == MNG_COLORTYPE_RGB ) || + (pData->iColortype == MNG_COLORTYPE_GRAYA ) || + (pData->iColortype == MNG_COLORTYPE_RGBA ) ) && + (pData->iBitdepth < 8 ) ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (pData->iCompression != MNG_COMPRESSION_DEFLATE) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + +#if defined(FILTER192) || defined(FILTER193) + if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) && +#if defined(FILTER192) && defined(FILTER193) + (pData->iFilter != MNG_FILTER_DIFFERING) && + (pData->iFilter != MNG_FILTER_NOFILTER ) ) +#else +#ifdef FILTER192 + (pData->iFilter != MNG_FILTER_DIFFERING) ) +#else + (pData->iFilter != MNG_FILTER_NOFILTER ) ) +#endif +#endif + MNG_ERROR (pData, MNG_INVALIDFILTER); +#else + if (pData->iFilter) + MNG_ERROR (pData, MNG_INVALIDFILTER); +#endif + + if ((pData->iInterlace != MNG_INTERLACE_NONE ) && + (pData->iInterlace != MNG_INTERLACE_ADAM7) ) + MNG_ERROR (pData, MNG_INVALIDINTERLACE); + + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_uint16 iRed = 0; + mng_uint16 iGreen = 0; + mng_uint16 iBlue = 0; + mng_bool bHasalpha = MNG_FALSE; + mng_uint16 iAlpha = 0xFFFF; + mng_uint8 iViewable = 0; + mng_retcode iRetcode; + + if (iRawlen > 13) /* get remaining fields, if any */ + { + iRed = mng_get_uint16 (pRawdata+13); + iGreen = mng_get_uint16 (pRawdata+15); + iBlue = mng_get_uint16 (pRawdata+17); + } + + if (iRawlen > 19) + { + bHasalpha = MNG_TRUE; + iAlpha = mng_get_uint16 (pRawdata+19); + } + + if (iRawlen > 21) + iViewable = *(pRawdata+21); + /* create an animation object */ + iRetcode = mng_create_ani_basi (pData, iRed, iGreen, iBlue, + bHasalpha, iAlpha, iViewable); + +/* if (!iRetcode) + iRetcode = mng_process_display_basi (pData, iRed, iGreen, iBlue, + bHasalpha, iAlpha, iViewable); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_basip)*ppChunk)->iWidth = mng_get_uint32 (pRawdata); + ((mng_basip)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4); +#ifdef MNG_NO_16BIT_SUPPORT + if (*(pRawdata+8) > 8) + ((mng_basip)*ppChunk)->iBitdepth = 8; + else +#endif + ((mng_basip)*ppChunk)->iBitdepth = *(pRawdata+8); + ((mng_basip)*ppChunk)->iColortype = *(pRawdata+9); + ((mng_basip)*ppChunk)->iCompression = *(pRawdata+10); + ((mng_basip)*ppChunk)->iFilter = *(pRawdata+11); + ((mng_basip)*ppChunk)->iInterlace = *(pRawdata+12); + + if (iRawlen > 13) + { + ((mng_basip)*ppChunk)->iRed = mng_get_uint16 (pRawdata+13); + ((mng_basip)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+15); + ((mng_basip)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+17); + } + + if (iRawlen > 19) + ((mng_basip)*ppChunk)->iAlpha = mng_get_uint16 (pRawdata+19); + + if (iRawlen > 21) + ((mng_basip)*ppChunk)->iViewable = *(pRawdata+21); + + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_BASI, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_CLON +READ_CHUNK (mng_read_clon) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CLON, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check the length */ + if ((iRawlen != 4) && (iRawlen != 5) && (iRawlen != 6) && + (iRawlen != 7) && (iRawlen != 16)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_uint16 iSourceid, iCloneid; + mng_uint8 iClonetype = 0; + mng_bool bHasdonotshow = MNG_FALSE; + mng_uint8 iDonotshow = 0; + mng_uint8 iConcrete = 0; + mng_bool bHasloca = MNG_FALSE; + mng_uint8 iLocationtype = 0; + mng_int32 iLocationx = 0; + mng_int32 iLocationy = 0; + mng_retcode iRetcode; + + iSourceid = mng_get_uint16 (pRawdata); + iCloneid = mng_get_uint16 (pRawdata+2); + + if (iRawlen > 4) + iClonetype = *(pRawdata+4); + + if (iRawlen > 5) + { + bHasdonotshow = MNG_TRUE; + iDonotshow = *(pRawdata+5); + } + + if (iRawlen > 6) + iConcrete = *(pRawdata+6); + + if (iRawlen > 7) + { + bHasloca = MNG_TRUE; + iLocationtype = *(pRawdata+7); + iLocationx = mng_get_int32 (pRawdata+8); + iLocationy = mng_get_int32 (pRawdata+12); + } + + iRetcode = mng_create_ani_clon (pData, iSourceid, iCloneid, iClonetype, + bHasdonotshow, iDonotshow, iConcrete, + bHasloca, iLocationtype, iLocationx, iLocationy); + +/* if (!iRetcode) + iRetcode = mng_process_display_clon (pData, iSourceid, iCloneid, iClonetype, + bHasdonotshow, iDonotshow, iConcrete, + bHasloca, iLocationtype, iLocationx, + iLocationy); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_clonp)*ppChunk)->iSourceid = mng_get_uint16 (pRawdata); + ((mng_clonp)*ppChunk)->iCloneid = mng_get_uint16 (pRawdata+2); + + if (iRawlen > 4) + ((mng_clonp)*ppChunk)->iClonetype = *(pRawdata+4); + + if (iRawlen > 5) + ((mng_clonp)*ppChunk)->iDonotshow = *(pRawdata+5); + + if (iRawlen > 6) + ((mng_clonp)*ppChunk)->iConcrete = *(pRawdata+6); + + if (iRawlen > 7) + { + ((mng_clonp)*ppChunk)->bHasloca = MNG_TRUE; + ((mng_clonp)*ppChunk)->iLocationtype = *(pRawdata+7); + ((mng_clonp)*ppChunk)->iLocationx = mng_get_int32 (pRawdata+8); + ((mng_clonp)*ppChunk)->iLocationy = mng_get_int32 (pRawdata+12); + } + else + { + ((mng_clonp)*ppChunk)->bHasloca = MNG_FALSE; + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_PAST +READ_CHUNK (mng_read_past) +{ +#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY) + mng_retcode iRetcode; + mng_uint16 iTargetid; + mng_uint8 iTargettype; + mng_int32 iTargetx; + mng_int32 iTargety; + mng_uint32 iCount; + mng_uint32 iSize; + mng_ptr pSources; + mng_uint32 iX; + mng_past_sourcep pSource; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PAST, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + /* check the length */ + if ((iRawlen < 41) || (((iRawlen - 11) % 30) != 0)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY) + iTargetid = mng_get_uint16 (pRawdata); + iTargettype = *(pRawdata+2); + iTargetx = mng_get_int32 (pRawdata+3); + iTargety = mng_get_int32 (pRawdata+7); + iCount = ((iRawlen - 11) / 30); /* how many entries again? */ + iSize = iCount * sizeof (mng_past_source); + + pRawdata += 11; + /* get a buffer for all the source blocks */ + MNG_ALLOC (pData, pSources, iSize); + + pSource = (mng_past_sourcep)pSources; + + for (iX = 0; iX < iCount; iX++) /* now copy the source blocks */ + { + pSource->iSourceid = mng_get_uint16 (pRawdata); + pSource->iComposition = *(pRawdata+2); + pSource->iOrientation = *(pRawdata+3); + pSource->iOffsettype = *(pRawdata+4); + pSource->iOffsetx = mng_get_int32 (pRawdata+5); + pSource->iOffsety = mng_get_int32 (pRawdata+9); + pSource->iBoundarytype = *(pRawdata+13); + pSource->iBoundaryl = mng_get_int32 (pRawdata+14); + pSource->iBoundaryr = mng_get_int32 (pRawdata+18); + pSource->iBoundaryt = mng_get_int32 (pRawdata+22); + pSource->iBoundaryb = mng_get_int32 (pRawdata+26); + + pSource++; + pRawdata += 30; + } +#endif + +#ifdef MNG_SUPPORT_DISPLAY + { /* create playback object */ + iRetcode = mng_create_ani_past (pData, iTargetid, iTargettype, iTargetx, + iTargety, iCount, pSources); + +/* if (!iRetcode) + iRetcode = mng_process_display_past (pData, iTargetid, iTargettype, iTargetx, + iTargety, iCount, pSources); */ + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pSources, iSize); + return iRetcode; + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pSources, iSize); + return iRetcode; + } + /* store the fields */ + ((mng_pastp)*ppChunk)->iDestid = iTargetid; + ((mng_pastp)*ppChunk)->iTargettype = iTargettype; + ((mng_pastp)*ppChunk)->iTargetx = iTargetx; + ((mng_pastp)*ppChunk)->iTargety = iTargety; + ((mng_pastp)*ppChunk)->iCount = iCount; + /* get a buffer & copy the source blocks */ + MNG_ALLOC (pData, ((mng_pastp)*ppChunk)->pSources, iSize); + MNG_COPY (((mng_pastp)*ppChunk)->pSources, pSources, iSize); + } +#endif /* MNG_STORE_CHUNKS */ + +#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY) + /* free the source block buffer */ + MNG_FREEX (pData, pSources, iSize); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PAST, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_DISC +READ_CHUNK (mng_read_disc) +{ +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + mng_uint32 iCount; + mng_uint16p pIds = MNG_NULL; + mng_retcode iRetcode; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DISC, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if ((iRawlen % 2) != 0) /* check the length */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + iCount = (iRawlen / sizeof (mng_uint16)); + + if (iCount) + { + MNG_ALLOC (pData, pIds, iRawlen); + +#ifndef MNG_BIGENDIAN_SUPPORTED + { + mng_uint32 iX; + mng_uint8p pIn = pRawdata; + mng_uint16p pOut = pIds; + + for (iX = 0; iX < iCount; iX++) + { + *pOut++ = mng_get_uint16 (pIn); + pIn += 2; + } + } +#else + MNG_COPY (pIds, pRawdata, iRawlen); +#endif /* !MNG_BIGENDIAN_SUPPORTED */ + } +#endif + +#ifdef MNG_SUPPORT_DISPLAY + { /* create playback object */ + iRetcode = mng_create_ani_disc (pData, iCount, pIds); + +/* if (!iRetcode) + iRetcode = mng_process_display_disc (pData, iCount, pIds); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_discp)*ppChunk)->iCount = iCount; + + if (iRawlen) + { + MNG_ALLOC (pData, ((mng_discp)*ppChunk)->pObjectids, iRawlen); + MNG_COPY (((mng_discp)*ppChunk)->pObjectids, pIds, iRawlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + if (iRawlen) + MNG_FREEX (pData, pIds, iRawlen); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DISC, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_BACK +READ_CHUNK (mng_read_back) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_BACK, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check the length */ + if ((iRawlen != 6) && (iRawlen != 7) && (iRawlen != 9) && (iRawlen != 10)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + /* retrieve the fields */ + pData->bHasBACK = MNG_TRUE; + pData->iBACKred = mng_get_uint16 (pRawdata); + pData->iBACKgreen = mng_get_uint16 (pRawdata+2); + pData->iBACKblue = mng_get_uint16 (pRawdata+4); + + if (iRawlen > 6) + pData->iBACKmandatory = *(pRawdata+6); + else + pData->iBACKmandatory = 0; + + if (iRawlen > 7) + pData->iBACKimageid = mng_get_uint16 (pRawdata+7); + else + pData->iBACKimageid = 0; + + if (iRawlen > 9) + pData->iBACKtile = *(pRawdata+9); + else + pData->iBACKtile = 0; + + iRetcode = mng_create_ani_back (pData, pData->iBACKred, pData->iBACKgreen, + pData->iBACKblue, pData->iBACKmandatory, + pData->iBACKimageid, pData->iBACKtile); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_backp)*ppChunk)->iRed = mng_get_uint16 (pRawdata); + ((mng_backp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2); + ((mng_backp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4); + + if (iRawlen > 6) + ((mng_backp)*ppChunk)->iMandatory = *(pRawdata+6); + + if (iRawlen > 7) + ((mng_backp)*ppChunk)->iImageid = mng_get_uint16 (pRawdata+7); + + if (iRawlen > 9) + ((mng_backp)*ppChunk)->iTile = *(pRawdata+9); + + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_FRAM +READ_CHUNK (mng_read_fram) +{ + mng_uint8p pTemp; +#ifdef MNG_STORE_CHUNKS + mng_uint32 iNamelen; +#endif + mng_uint32 iRemain; + mng_uint32 iRequired = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_FRAM, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen <= 1) /* only framing-mode ? */ + { +#ifdef MNG_STORE_CHUNKS + iNamelen = 0; /* indicate so */ +#endif + iRemain = 0; + pTemp = MNG_NULL; + } + else + { + pTemp = find_null (pRawdata+1); /* find null-separator */ + /* not found inside input-data ? */ + if ((pTemp - pRawdata) > (mng_int32)iRawlen) + pTemp = pRawdata + iRawlen; /* than remainder is name */ + +#ifdef MNG_STORE_CHUNKS + iNamelen = (mng_uint32)((pTemp - pRawdata) - 1); +#endif + iRemain = (mng_uint32)(iRawlen - (pTemp - pRawdata)); + + if (iRemain) /* if there is remaining data it's less 1 byte */ + iRemain--; + + if ((iRemain) && (iRemain < 4)) /* remains must be empty or at least 4 bytes */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if (iRemain) + { + iRequired = 4; /* calculate and check required remaining length */ + + if (*(pTemp+1)) { iRequired += 4; } + if (*(pTemp+2)) { iRequired += 4; } + if (*(pTemp+3)) { iRequired += 17; } + + if (*(pTemp+4)) + { + if ((iRemain - iRequired) % 4 != 0) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + else + { + if (iRemain != iRequired) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + } + } + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_uint8p pWork = pTemp; + mng_uint8 iFramemode = 0; + mng_uint8 iChangedelay = 0; + mng_uint32 iDelay = 0; + mng_uint8 iChangetimeout = 0; + mng_uint32 iTimeout = 0; + mng_uint8 iChangeclipping = 0; + mng_uint8 iCliptype = 0; + mng_int32 iClipl = 0; + mng_int32 iClipr = 0; + mng_int32 iClipt = 0; + mng_int32 iClipb = 0; + mng_retcode iRetcode; + + if (iRawlen) /* any data specified ? */ + { + if (*(pRawdata)) /* save the new framing mode ? */ + { + iFramemode = *(pRawdata); + +#ifndef MNG_NO_OLD_VERSIONS + if (pData->bPreDraft48) /* old style input-stream ? */ + { + switch (iFramemode) + { + case 0: { break; } + case 1: { iFramemode = 3; break; } + case 2: { iFramemode = 4; break; } + case 3: { iFramemode = 1; break; } + case 4: { iFramemode = 1; break; } + case 5: { iFramemode = 2; break; } + default: { iFramemode = 1; break; } + } + } +#endif + } + + if (iRemain) + { + iChangedelay = *(pWork+1); + iChangetimeout = *(pWork+2); + iChangeclipping = *(pWork+3); + pWork += 5; + + if (iChangedelay) /* delay changed ? */ + { + iDelay = mng_get_uint32 (pWork); + pWork += 4; + } + + if (iChangetimeout) /* timeout changed ? */ + { + iTimeout = mng_get_uint32 (pWork); + pWork += 4; + } + + if (iChangeclipping) /* clipping changed ? */ + { + iCliptype = *pWork; + iClipl = mng_get_int32 (pWork+1); + iClipr = mng_get_int32 (pWork+5); + iClipt = mng_get_int32 (pWork+9); + iClipb = mng_get_int32 (pWork+13); + } + } + } + + iRetcode = mng_create_ani_fram (pData, iFramemode, iChangedelay, iDelay, + iChangetimeout, iTimeout, + iChangeclipping, iCliptype, + iClipl, iClipr, iClipt, iClipb); + +/* if (!iRetcode) + iRetcode = mng_process_display_fram (pData, iFramemode, iChangedelay, iDelay, + iChangetimeout, iTimeout, + iChangeclipping, iCliptype, + iClipl, iClipr, iClipt, iClipb); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_framp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + { + mng_uint8 iFramemode = *(pRawdata); + +#ifndef MNG_NO_OLD_VERSIONS + if (pData->bPreDraft48) /* old style input-stream ? */ + { + switch (iFramemode) + { + case 1: { iFramemode = 3; break; } + case 2: { iFramemode = 4; break; } + case 3: { iFramemode = 5; break; } /* TODO: provision for mode=5 ??? */ + case 4: { iFramemode = 1; break; } + case 5: { iFramemode = 2; break; } + default: { iFramemode = 1; break; } + } + } +#endif + + ((mng_framp)*ppChunk)->iMode = iFramemode; + ((mng_framp)*ppChunk)->iNamesize = iNamelen; + + if (iNamelen) + { + MNG_ALLOC (pData, ((mng_framp)*ppChunk)->zName, iNamelen+1); + MNG_COPY (((mng_framp)*ppChunk)->zName, pRawdata+1, iNamelen); + } + + if (iRemain) + { + ((mng_framp)*ppChunk)->iChangedelay = *(pTemp+1); + ((mng_framp)*ppChunk)->iChangetimeout = *(pTemp+2); + ((mng_framp)*ppChunk)->iChangeclipping = *(pTemp+3); + ((mng_framp)*ppChunk)->iChangesyncid = *(pTemp+4); + + pTemp += 5; + + if (((mng_framp)*ppChunk)->iChangedelay) + { + ((mng_framp)*ppChunk)->iDelay = mng_get_uint32 (pTemp); + pTemp += 4; + } + + if (((mng_framp)*ppChunk)->iChangetimeout) + { + ((mng_framp)*ppChunk)->iTimeout = mng_get_uint32 (pTemp); + pTemp += 4; + } + + if (((mng_framp)*ppChunk)->iChangeclipping) + { + ((mng_framp)*ppChunk)->iBoundarytype = *pTemp; + ((mng_framp)*ppChunk)->iBoundaryl = mng_get_int32 (pTemp+1); + ((mng_framp)*ppChunk)->iBoundaryr = mng_get_int32 (pTemp+5); + ((mng_framp)*ppChunk)->iBoundaryt = mng_get_int32 (pTemp+9); + ((mng_framp)*ppChunk)->iBoundaryb = mng_get_int32 (pTemp+13); + pTemp += 17; + } + + if (((mng_framp)*ppChunk)->iChangesyncid) + { + ((mng_framp)*ppChunk)->iCount = (iRemain - iRequired) / 4; + + if (((mng_framp)*ppChunk)->iCount) + { + MNG_ALLOC (pData, ((mng_framp)*ppChunk)->pSyncids, + ((mng_framp)*ppChunk)->iCount * 4); + +#ifndef MNG_BIGENDIAN_SUPPORTED + { + mng_uint32 iX; + mng_uint32p pOut = ((mng_framp)*ppChunk)->pSyncids; + + for (iX = 0; iX < ((mng_framp)*ppChunk)->iCount; iX++) + { + *pOut++ = mng_get_uint32 (pTemp); + pTemp += 4; + } + } +#else + MNG_COPY (((mng_framp)*ppChunk)->pSyncids, pTemp, + ((mng_framp)*ppChunk)->iCount * 4); +#endif /* !MNG_BIGENDIAN_SUPPORTED */ + } + } + } + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_FRAM, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_MOVE +READ_CHUNK (mng_read_move) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MOVE, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 13) /* check the length */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + /* create a MOVE animation object */ + iRetcode = mng_create_ani_move (pData, mng_get_uint16 (pRawdata), + mng_get_uint16 (pRawdata+2), + *(pRawdata+4), + mng_get_int32 (pRawdata+5), + mng_get_int32 (pRawdata+9)); + +/* if (!iRetcode) + iRetcode = mng_process_display_move (pData, + mng_get_uint16 (pRawdata), + mng_get_uint16 (pRawdata+2), + *(pRawdata+4), + mng_get_int32 (pRawdata+5), + mng_get_int32 (pRawdata+9)); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_movep)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata); + ((mng_movep)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2); + ((mng_movep)*ppChunk)->iMovetype = *(pRawdata+4); + ((mng_movep)*ppChunk)->iMovex = mng_get_int32 (pRawdata+5); + ((mng_movep)*ppChunk)->iMovey = mng_get_int32 (pRawdata+9); + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MOVE, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_CLIP +READ_CHUNK (mng_read_clip) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CLIP, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 21) /* check the length */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + /* create a CLIP animation object */ + iRetcode = mng_create_ani_clip (pData, mng_get_uint16 (pRawdata), + mng_get_uint16 (pRawdata+2), + *(pRawdata+4), + mng_get_int32 (pRawdata+5), + mng_get_int32 (pRawdata+9), + mng_get_int32 (pRawdata+13), + mng_get_int32 (pRawdata+17)); + +/* if (!iRetcode) + iRetcode = mng_process_display_clip (pData, + mng_get_uint16 (pRawdata), + mng_get_uint16 (pRawdata+2), + *(pRawdata+4), + mng_get_int32 (pRawdata+5), + mng_get_int32 (pRawdata+9), + mng_get_int32 (pRawdata+13), + mng_get_int32 (pRawdata+17)); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_clipp)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata); + ((mng_clipp)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2); + ((mng_clipp)*ppChunk)->iCliptype = *(pRawdata+4); + ((mng_clipp)*ppChunk)->iClipl = mng_get_int32 (pRawdata+5); + ((mng_clipp)*ppChunk)->iClipr = mng_get_int32 (pRawdata+9); + ((mng_clipp)*ppChunk)->iClipt = mng_get_int32 (pRawdata+13); + ((mng_clipp)*ppChunk)->iClipb = mng_get_int32 (pRawdata+17); + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CLIP, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_SHOW +READ_CHUNK (mng_read_show) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SHOW, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check the length */ + if ((iRawlen != 0) && (iRawlen != 2) && (iRawlen != 4) && (iRawlen != 5)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + + if (iRawlen) /* determine parameters if any */ + { + pData->iSHOWfromid = mng_get_uint16 (pRawdata); + + if (iRawlen > 2) + pData->iSHOWtoid = mng_get_uint16 (pRawdata+2); + else + pData->iSHOWtoid = pData->iSHOWfromid; + + if (iRawlen > 4) + pData->iSHOWmode = *(pRawdata+4); + else + pData->iSHOWmode = 0; + } + else /* use defaults then */ + { + pData->iSHOWmode = 2; + pData->iSHOWfromid = 1; + pData->iSHOWtoid = 65535; + } + /* create a SHOW animation object */ + iRetcode = mng_create_ani_show (pData, pData->iSHOWfromid, + pData->iSHOWtoid, pData->iSHOWmode); + + if (!iRetcode) + iRetcode = mng_process_display_show (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_showp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + { + ((mng_showp)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata); + + if (iRawlen > 2) + ((mng_showp)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2); + else + ((mng_showp)*ppChunk)->iLastid = ((mng_showp)*ppChunk)->iFirstid; + + if (iRawlen > 4) + ((mng_showp)*ppChunk)->iMode = *(pRawdata+4); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_TERM +READ_CHUNK (mng_read_term) +{ + mng_uint8 iTermaction; + mng_uint8 iIteraction = 0; + mng_uint32 iDelay = 0; + mng_uint32 iItermax = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_TERM, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + /* should be behind MHDR or SAVE !! */ + if ((!pData->bHasSAVE) && (pData->iChunkseq > 2)) + { + pData->bMisplacedTERM = MNG_TRUE; /* indicate we found a misplaced TERM */ + /* and send a warning signal!!! */ + MNG_WARNING (pData, MNG_SEQUENCEERROR); + } + + if (pData->bHasLOOP) /* no way, jose! */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (pData->bHasTERM) /* only 1 allowed! */ + MNG_ERROR (pData, MNG_MULTIPLEERROR); + /* check the length */ + if ((iRawlen != 1) && (iRawlen != 10)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pData->bHasTERM = MNG_TRUE; + + iTermaction = *pRawdata; /* get the fields */ + + if (iRawlen > 1) + { + iIteraction = *(pRawdata+1); + iDelay = mng_get_uint32 (pRawdata+2); + iItermax = mng_get_uint32 (pRawdata+6); + } + + if (pData->fProcessterm) /* inform the app ? */ + if (!pData->fProcessterm (((mng_handle)pData), iTermaction, iIteraction, + iDelay, iItermax)) + MNG_ERROR (pData, MNG_APPMISCERROR); + +#ifdef MNG_SUPPORT_DISPLAY + { /* create the TERM ani-object */ + mng_retcode iRetcode = mng_create_ani_term (pData, iTermaction, iIteraction, + iDelay, iItermax); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* save for future reference */ + pData->pTermaniobj = pData->pLastaniobj; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_termp)*ppChunk)->iTermaction = iTermaction; + ((mng_termp)*ppChunk)->iIteraction = iIteraction; + ((mng_termp)*ppChunk)->iDelay = iDelay; + ((mng_termp)*ppChunk)->iItermax = iItermax; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_SAVE +READ_CHUNK (mng_read_save) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SAVE, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (pData->bHasSAVE)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + pData->bHasSAVE = MNG_TRUE; + + if (pData->fProcesssave) /* inform the application ? */ + { + mng_bool bOke = pData->fProcesssave ((mng_handle)pData); + + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + + + /* TODO: something with the parameters */ + + + /* create a SAVE animation object */ + iRetcode = mng_create_ani_save (pData); + + if (!iRetcode) + iRetcode = mng_process_display_save (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_savep)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) /* not empty ? */ + { + mng_uint8 iOtype = *pRawdata; + mng_uint8 iEtype; + mng_uint32 iCount = 0; + mng_uint8p pTemp; + mng_uint8p pNull; + mng_uint32 iLen; + mng_uint32 iOffset[2]; + mng_uint32 iStarttime[2]; + mng_uint32 iFramenr; + mng_uint32 iLayernr; + mng_uint32 iX; + mng_save_entryp pEntry = MNG_NULL; + mng_uint32 iNamesize; + + if ((iOtype != 4) && (iOtype != 8)) + MNG_ERROR (pData, MNG_INVOFFSETSIZE); + + ((mng_savep)*ppChunk)->iOffsettype = iOtype; + + for (iX = 0; iX < 2; iX++) /* do this twice to get the count first ! */ + { + pTemp = pRawdata + 1; + iLen = iRawlen - 1; + + if (iX) /* second run ? */ + { + MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_save_entry))); + + ((mng_savep)*ppChunk)->iCount = iCount; + ((mng_savep)*ppChunk)->pEntries = pEntry; + } + + while (iLen) /* anything left ? */ + { + iEtype = *pTemp; /* entrytype */ + + if ((iEtype != 0) && (iEtype != 1) && (iEtype != 2) && (iEtype != 3)) + MNG_ERROR (pData, MNG_INVENTRYTYPE); + + pTemp++; + + if (iEtype > 1) + { + iOffset [0] = 0; + iOffset [1] = 0; + iStarttime [0] = 0; + iStarttime [1] = 0; + iLayernr = 0; + iFramenr = 0; + } + else + { + if (iOtype == 4) + { + iOffset [0] = 0; + iOffset [1] = mng_get_uint32 (pTemp); + + pTemp += 4; + } + else + { + iOffset [0] = mng_get_uint32 (pTemp); + iOffset [1] = mng_get_uint32 (pTemp+4); + + pTemp += 8; + } + + if (iEtype > 0) + { + iStarttime [0] = 0; + iStarttime [1] = 0; + iLayernr = 0; + iFramenr = 0; + } + else + { + if (iOtype == 4) + { + iStarttime [0] = 0; + iStarttime [1] = mng_get_uint32 (pTemp+0); + iLayernr = mng_get_uint32 (pTemp+4); + iFramenr = mng_get_uint32 (pTemp+8); + + pTemp += 12; + } + else + { + iStarttime [0] = mng_get_uint32 (pTemp+0); + iStarttime [1] = mng_get_uint32 (pTemp+4); + iLayernr = mng_get_uint32 (pTemp+8); + iFramenr = mng_get_uint32 (pTemp+12); + + pTemp += 16; + } + } + } + + pNull = find_null (pTemp); /* get the name length */ + + if ((pNull - pRawdata) > (mng_int32)iRawlen) + { + iNamesize = iLen; /* no null found; so end of SAVE */ + iLen = 0; + } + else + { + iNamesize = pNull - pTemp; /* should be another entry */ + iLen -= iNamesize; + + if (!iLen) /* must not end with a null ! */ + MNG_ERROR (pData, MNG_ENDWITHNULL); + } + + if (!pEntry) + { + iCount++; + } + else + { + pEntry->iEntrytype = iEtype; + pEntry->iOffset [0] = iOffset [0]; + pEntry->iOffset [1] = iOffset [1]; + pEntry->iStarttime [0] = iStarttime [0]; + pEntry->iStarttime [1] = iStarttime [1]; + pEntry->iLayernr = iLayernr; + pEntry->iFramenr = iFramenr; + pEntry->iNamesize = iNamesize; + + if (iNamesize) + { + MNG_ALLOC (pData, pEntry->zName, iNamesize+1); + MNG_COPY (pEntry->zName, pTemp, iNamesize); + } + + pEntry++; + } + + pTemp += iNamesize; + } + } + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_SEEK +READ_CHUNK (mng_read_seek) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SEEK, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (!pData->bHasSAVE)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_SUPPORT_DISPLAY + /* create a SEEK animation object */ + iRetcode = mng_create_ani_seek (pData, iRawlen, (mng_pchar)pRawdata); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#endif /* MNG_SUPPORT_DISPLAY */ + + if (pData->fProcessseek) /* inform the app ? */ + { + mng_bool bOke; + mng_pchar zName; + + MNG_ALLOC (pData, zName, iRawlen + 1); + + if (iRawlen) + MNG_COPY (zName, pRawdata, iRawlen); + + bOke = pData->fProcessseek ((mng_handle)pData, zName); + + MNG_FREEX (pData, zName, iRawlen + 1); + + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + +#ifdef MNG_SUPPORT_DISPLAY + /* do display processing of the SEEK */ + iRetcode = mng_process_display_seek (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_seekp)*ppChunk)->iNamesize = iRawlen; + + if (iRawlen) + { + MNG_ALLOC (pData, ((mng_seekp)*ppChunk)->zName, iRawlen+1); + MNG_COPY (((mng_seekp)*ppChunk)->zName, pRawdata, iRawlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_SEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_eXPI +READ_CHUNK (mng_read_expi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_EXPI, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 3) /* check the length */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_expip)*ppChunk)->iSnapshotid = mng_get_uint16 (pRawdata); + ((mng_expip)*ppChunk)->iNamesize = iRawlen - 2; + + if (((mng_expip)*ppChunk)->iNamesize) + { + MNG_ALLOC (pData, ((mng_expip)*ppChunk)->zName, + ((mng_expip)*ppChunk)->iNamesize + 1); + MNG_COPY (((mng_expip)*ppChunk)->zName, pRawdata+2, + ((mng_expip)*ppChunk)->iNamesize); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_EXPI, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_fPRI +READ_CHUNK (mng_read_fpri) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_FPRI, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 2) /* must be two bytes long */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_fprip)*ppChunk)->iDeltatype = *pRawdata; + ((mng_fprip)*ppChunk)->iPriority = *(pRawdata+1); + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_FPRI, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_nEED +MNG_LOCAL mng_bool CheckKeyword (mng_datap pData, + mng_uint8p pKeyword) +{ + mng_chunkid handled_chunks [] = + { + MNG_UINT_BACK, /* keep it sorted !!!! */ + MNG_UINT_BASI, + MNG_UINT_CLIP, + MNG_UINT_CLON, +#ifndef MNG_NO_DELTA_PNG +/* TODO: MNG_UINT_DBYK, */ +#endif + MNG_UINT_DEFI, +#ifndef MNG_NO_DELTA_PNG + MNG_UINT_DHDR, +#endif + MNG_UINT_DISC, +#ifndef MNG_NO_DELTA_PNG +/* TODO: MNG_UINT_DROP, */ +#endif + MNG_UINT_ENDL, + MNG_UINT_FRAM, + MNG_UINT_IDAT, + MNG_UINT_IEND, + MNG_UINT_IHDR, +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG + MNG_UINT_IJNG, +#endif + MNG_UINT_IPNG, +#endif +#ifdef MNG_INCLUDE_JNG + MNG_UINT_JDAA, + MNG_UINT_JDAT, + MNG_UINT_JHDR, +/* TODO: MNG_UINT_JSEP, */ + MNG_UINT_JdAA, +#endif + MNG_UINT_LOOP, + MNG_UINT_MAGN, + MNG_UINT_MEND, + MNG_UINT_MHDR, + MNG_UINT_MOVE, +/* TODO: MNG_UINT_ORDR, */ + MNG_UINT_PAST, + MNG_UINT_PLTE, +#ifndef MNG_NO_DELTA_PNG + MNG_UINT_PPLT, + MNG_UINT_PROM, +#endif + MNG_UINT_SAVE, + MNG_UINT_SEEK, + MNG_UINT_SHOW, + MNG_UINT_TERM, +#ifdef MNG_INCLUDE_ANG_PROPOSAL + MNG_UINT_adAT, + MNG_UINT_ahDR, +#endif + MNG_UINT_bKGD, + MNG_UINT_cHRM, +/* TODO: MNG_UINT_eXPI, */ + MNG_UINT_evNT, +/* TODO: MNG_UINT_fPRI, */ + MNG_UINT_gAMA, +/* TODO: MNG_UINT_hIST, */ + MNG_UINT_iCCP, + MNG_UINT_iTXt, +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + MNG_UINT_mpNG, +#endif + MNG_UINT_nEED, +/* TODO: MNG_UINT_oFFs, */ +/* TODO: MNG_UINT_pCAL, */ +/* TODO: MNG_UINT_pHYg, */ +/* TODO: MNG_UINT_pHYs, */ +/* TODO: MNG_UINT_sBIT, */ +/* TODO: MNG_UINT_sCAL, */ +/* TODO: MNG_UINT_sPLT, */ + MNG_UINT_sRGB, + MNG_UINT_tEXt, + MNG_UINT_tIME, + MNG_UINT_tRNS, + MNG_UINT_zTXt, + }; + + mng_bool bOke = MNG_FALSE; + + if (pData->fProcessneed) /* does the app handle it ? */ + bOke = pData->fProcessneed ((mng_handle)pData, (mng_pchar)pKeyword); + + if (!bOke) + { /* find the keyword length */ + mng_uint8p pNull = find_null (pKeyword); + + if (pNull - pKeyword == 4) /* test a chunk ? */ + { /* get the chunk-id */ + mng_chunkid iChunkid = (*pKeyword << 24) + (*(pKeyword+1) << 16) + + (*(pKeyword+2) << 8) + (*(pKeyword+3) ); + /* binary search variables */ + mng_int32 iTop, iLower, iUpper, iMiddle; + /* determine max index of table */ + iTop = (sizeof (handled_chunks) / sizeof (handled_chunks [0])) - 1; + + /* binary search; with 52 chunks, worst-case is 7 comparisons */ + iLower = 0; + iMiddle = iTop >> 1; + iUpper = iTop; + + do /* the binary search itself */ + { + if (handled_chunks [iMiddle] < iChunkid) + iLower = iMiddle + 1; + else if (handled_chunks [iMiddle] > iChunkid) + iUpper = iMiddle - 1; + else + { + bOke = MNG_TRUE; + break; + } + + iMiddle = (iLower + iUpper) >> 1; + } + while (iLower <= iUpper); + } + /* test draft ? */ + if ((!bOke) && (pNull - pKeyword == 8) && + (*pKeyword == 'd') && (*(pKeyword+1) == 'r') && + (*(pKeyword+2) == 'a') && (*(pKeyword+3) == 'f') && + (*(pKeyword+4) == 't') && (*(pKeyword+5) == ' ')) + { + mng_uint32 iDraft; + + iDraft = (*(pKeyword+6) - '0') * 10 + (*(pKeyword+7) - '0'); + bOke = (mng_bool)(iDraft <= MNG_MNG_DRAFT); + } + /* test MNG 1.0/1.1 ? */ + if ((!bOke) && (pNull - pKeyword == 7) && + (*pKeyword == 'M') && (*(pKeyword+1) == 'N') && + (*(pKeyword+2) == 'G') && (*(pKeyword+3) == '-') && + (*(pKeyword+4) == '1') && (*(pKeyword+5) == '.') && + ((*(pKeyword+6) == '0') || (*(pKeyword+6) == '1'))) + bOke = MNG_TRUE; + /* test CACHEOFF ? */ + if ((!bOke) && (pNull - pKeyword == 8) && + (*pKeyword == 'C') && (*(pKeyword+1) == 'A') && + (*(pKeyword+2) == 'C') && (*(pKeyword+3) == 'H') && + (*(pKeyword+4) == 'E') && (*(pKeyword+5) == 'O') && + (*(pKeyword+6) == 'F') && (*(pKeyword+7) == 'F')) + { + if (!pData->pFirstaniobj) /* only if caching hasn't started yet ! */ + { + bOke = MNG_TRUE; + pData->bCacheplayback = MNG_FALSE; + pData->bStorechunks = MNG_FALSE; + } + } + } + + return bOke; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_nEED +READ_CHUNK (mng_read_need) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_NEED, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 1) /* check the length */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + { /* let's check it */ + mng_bool bOke = MNG_TRUE; + mng_pchar zKeywords; + mng_uint8p pNull, pTemp; + + MNG_ALLOC (pData, zKeywords, iRawlen + 1); + + if (iRawlen) + MNG_COPY (zKeywords, pRawdata, iRawlen); + + pTemp = (mng_uint8p)zKeywords; + pNull = find_null (pTemp); + + while ((bOke) && (pNull < (mng_uint8p)zKeywords + iRawlen)) + { + bOke = CheckKeyword (pData, pTemp); + pTemp = pNull + 1; + pNull = find_null (pTemp); + } + + if (bOke) + bOke = CheckKeyword (pData, pTemp); + + MNG_FREEX (pData, zKeywords, iRawlen + 1); + + if (!bOke) + MNG_ERROR (pData, MNG_UNSUPPORTEDNEED); + } + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_needp)*ppChunk)->iKeywordssize = iRawlen; + + if (iRawlen) + { + MNG_ALLOC (pData, ((mng_needp)*ppChunk)->zKeywords, iRawlen+1); + MNG_COPY (((mng_needp)*ppChunk)->zKeywords, pRawdata, iRawlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_NEED, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_pHYg +READ_CHUNK (mng_read_phyg) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PHYG, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* it's 9 bytes or empty; no more, no less! */ + if ((iRawlen != 9) && (iRawlen != 0)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_phygp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + + if (iRawlen) + { + ((mng_phygp)*ppChunk)->iSizex = mng_get_uint32 (pRawdata); + ((mng_phygp)*ppChunk)->iSizey = mng_get_uint32 (pRawdata+4); + ((mng_phygp)*ppChunk)->iUnit = *(pRawdata+8); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PHYG, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_INCLUDE_JNG +READ_CHUNK (mng_read_jhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_JHDR, MNG_LC_START); +#endif + /* sequence checks */ + if ((pData->eSigtype != mng_it_jng) && (pData->eSigtype != mng_it_mng)) + MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); + + if ((pData->eSigtype == mng_it_jng) && (pData->iChunkseq > 1)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 16) /* length oke ? */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + /* inside a JHDR-IEND block now */ + pData->bHasJHDR = MNG_TRUE; + /* and store interesting fields */ + pData->iDatawidth = mng_get_uint32 (pRawdata); + pData->iDataheight = mng_get_uint32 (pRawdata+4); + pData->iJHDRcolortype = *(pRawdata+8); + pData->iJHDRimgbitdepth = *(pRawdata+9); + pData->iJHDRimgcompression = *(pRawdata+10); + pData->iJHDRimginterlace = *(pRawdata+11); + pData->iJHDRalphabitdepth = *(pRawdata+12); + pData->iJHDRalphacompression = *(pRawdata+13); + pData->iJHDRalphafilter = *(pRawdata+14); + pData->iJHDRalphainterlace = *(pRawdata+15); + + +#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT) + pData->iPNGmult = 1; + pData->iPNGdepth = pData->iJHDRalphabitdepth; +#endif + +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iJHDRalphabitdepth < 8) + pData->iJHDRalphabitdepth = 8; +#endif + +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iJHDRalphabitdepth > 8) + { + pData->iPNGmult = 2; + pData->iJHDRalphabitdepth = 8; + } +#endif + /* parameter validity checks */ + if ((pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAY ) && + (pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLOR ) && + (pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAYA ) && + (pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLORA) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + if ((pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8 ) && + (pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG12 ) && + (pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8AND12) ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (pData->iJHDRimgcompression != MNG_COMPRESSION_BASELINEJPEG) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + + if ((pData->iJHDRimginterlace != MNG_INTERLACE_SEQUENTIAL ) && + (pData->iJHDRimginterlace != MNG_INTERLACE_PROGRESSIVE) ) + MNG_ERROR (pData, MNG_INVALIDINTERLACE); + + if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) + { + if ((pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 ) +#ifndef MNG_NO_1_2_4BIT_SUPPORT + && (pData->iJHDRalphabitdepth != MNG_BITDEPTH_1 ) && + (pData->iJHDRalphabitdepth != MNG_BITDEPTH_2 ) && + (pData->iJHDRalphabitdepth != MNG_BITDEPTH_4 ) +#endif +#ifndef MNG_NO_16BIT_SUPPORT + && (pData->iJHDRalphabitdepth != MNG_BITDEPTH_16) +#endif + ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ((pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE ) && + (pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG) ) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + + if ((pData->iJHDRalphacompression == MNG_COMPRESSION_BASELINEJPEG) && + (pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 ) ) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + +#if defined(FILTER192) || defined(FILTER193) + if ((pData->iJHDRalphafilter != MNG_FILTER_ADAPTIVE ) && +#if defined(FILTER192) && defined(FILTER193) + (pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) && + (pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) ) +#else +#ifdef FILTER192 + (pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) ) +#else + (pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) ) +#endif +#endif + MNG_ERROR (pData, MNG_INVALIDFILTER); +#else + if (pData->iJHDRalphafilter) + MNG_ERROR (pData, MNG_INVALIDFILTER); +#endif + + if ((pData->iJHDRalphainterlace != MNG_INTERLACE_NONE ) && + (pData->iJHDRalphainterlace != MNG_INTERLACE_ADAM7) ) + MNG_ERROR (pData, MNG_INVALIDINTERLACE); + + } + else + { + if (pData->iJHDRalphabitdepth) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if (pData->iJHDRalphacompression) + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + + if (pData->iJHDRalphafilter) + MNG_ERROR (pData, MNG_INVALIDFILTER); + + if (pData->iJHDRalphainterlace) + MNG_ERROR (pData, MNG_INVALIDINTERLACE); + + } + + if (!pData->bHasheader) /* first chunk ? */ + { + pData->bHasheader = MNG_TRUE; /* we've got a header */ + pData->eImagetype = mng_it_jng; /* then this must be a JNG */ + pData->iWidth = mng_get_uint32 (pRawdata); + pData->iHeight = mng_get_uint32 (pRawdata+4); + /* predict alpha-depth ! */ + if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) + pData->iAlphadepth = pData->iJHDRalphabitdepth; + else + pData->iAlphadepth = 0; + /* fits on maximum canvas ? */ + if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight)) + MNG_WARNING (pData, MNG_IMAGETOOLARGE); + + if (pData->fProcessheader) /* inform the app ? */ + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + } + + pData->iColortype = 0; /* fake grayscale for other routines */ + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode = mng_process_display_jhdr (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_jhdrp)*ppChunk)->iWidth = mng_get_uint32 (pRawdata); + ((mng_jhdrp)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4); + ((mng_jhdrp)*ppChunk)->iColortype = *(pRawdata+8); + ((mng_jhdrp)*ppChunk)->iImagesampledepth = *(pRawdata+9); + ((mng_jhdrp)*ppChunk)->iImagecompression = *(pRawdata+10); + ((mng_jhdrp)*ppChunk)->iImageinterlace = *(pRawdata+11); + ((mng_jhdrp)*ppChunk)->iAlphasampledepth = *(pRawdata+12); +#ifdef MNG_NO_16BIT_SUPPORT + if (*(pRawdata+12) > 8) + ((mng_jhdrp)*ppChunk)->iAlphasampledepth = 8; +#endif + ((mng_jhdrp)*ppChunk)->iAlphacompression = *(pRawdata+13); + ((mng_jhdrp)*ppChunk)->iAlphafilter = *(pRawdata+14); + ((mng_jhdrp)*ppChunk)->iAlphainterlace = *(pRawdata+15); + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_JHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#else +#define read_jhdr 0 +#endif /* MNG_INCLUDE_JNG */ +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_INCLUDE_JNG +READ_CHUNK (mng_read_jdaa) +{ +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + volatile mng_retcode iRetcode; + + iRetcode=MNG_NOERROR; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_JDAA, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasJHDR) && (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (pData->bHasJSEP) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen == 0) /* can never be empty */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pData->bHasJDAA = MNG_TRUE; /* got some JDAA now, don't we */ + +#ifdef MNG_SUPPORT_DISPLAY + iRetcode = mng_process_display_jdaa (pData, iRawlen, pRawdata); + + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_jdaap)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + ((mng_jdaap)*ppChunk)->iDatasize = iRawlen; + + if (iRawlen != 0) /* is there any data ? */ + { + MNG_ALLOC (pData, ((mng_jdaap)*ppChunk)->pData, iRawlen); + MNG_COPY (((mng_jdaap)*ppChunk)->pData, pRawdata, iRawlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_JDAA, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#else +#define read_jdaa 0 +#endif /* MNG_INCLUDE_JNG */ +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_INCLUDE_JNG +READ_CHUNK (mng_read_jdat) +{ +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + volatile mng_retcode iRetcode; + + iRetcode=MNG_NOERROR; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_JDAT, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasJHDR) && (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen == 0) /* can never be empty */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pData->bHasJDAT = MNG_TRUE; /* got some JDAT now, don't we */ + +#ifdef MNG_SUPPORT_DISPLAY + iRetcode = mng_process_display_jdat (pData, iRawlen, pRawdata); + + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_jdatp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); + ((mng_jdatp)*ppChunk)->iDatasize = iRawlen; + + if (iRawlen != 0) /* is there any data ? */ + { + MNG_ALLOC (pData, ((mng_jdatp)*ppChunk)->pData, iRawlen); + MNG_COPY (((mng_jdatp)*ppChunk)->pData, pRawdata, iRawlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_JDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#else +#define read_jdat 0 +#endif /* MNG_INCLUDE_JNG */ +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_INCLUDE_JNG +READ_CHUNK (mng_read_jsep) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_JSEP, MNG_LC_START); +#endif + + if (!pData->bHasJHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 0) /* must be empty ! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pData->bHasJSEP = MNG_TRUE; /* indicate we've had the 8-/12-bit separator */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_JSEP, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#else +#define read_jsep 0 +#endif /* MNG_INCLUDE_JNG */ +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_NO_DELTA_PNG +READ_CHUNK (mng_read_dhdr) +{ + mng_uint8 iImagetype, iDeltatype; +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DHDR, MNG_LC_START); +#endif + + if (!pData->bHasMHDR) /* sequence checks */ + MNG_ERROR (pData, MNG_SEQUENCEERROR); + +#ifdef MNG_INCLUDE_JNG + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check for valid length */ + if ((iRawlen != 4) && (iRawlen != 12) && (iRawlen != 20)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + iImagetype = *(pRawdata+2); /* check fields for validity */ + iDeltatype = *(pRawdata+3); + + if (iImagetype > MNG_IMAGETYPE_JNG) + MNG_ERROR (pData, MNG_INVIMAGETYPE); + + if (iDeltatype > MNG_DELTATYPE_NOCHANGE) + MNG_ERROR (pData, MNG_INVDELTATYPE); + + if ((iDeltatype == MNG_DELTATYPE_REPLACE) && (iRawlen > 12)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((iDeltatype == MNG_DELTATYPE_NOCHANGE) && (iRawlen > 4)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + pData->bHasDHDR = MNG_TRUE; /* inside a DHDR-IEND block now */ + pData->iDeltatype = iDeltatype; + + pData->iImagelevel++; /* one level deeper */ + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_uint16 iObjectid = mng_get_uint16 (pRawdata); + mng_uint32 iBlockwidth = 0; + mng_uint32 iBlockheight = 0; + mng_uint32 iBlockx = 0; + mng_uint32 iBlocky = 0; + mng_retcode iRetcode; + + if (iRawlen > 4) + { + iBlockwidth = mng_get_uint32 (pRawdata+4); + iBlockheight = mng_get_uint32 (pRawdata+8); + } + + if (iRawlen > 12) + { + iBlockx = mng_get_uint32 (pRawdata+12); + iBlocky = mng_get_uint32 (pRawdata+16); + } + + iRetcode = mng_create_ani_dhdr (pData, iObjectid, iImagetype, iDeltatype, + iBlockwidth, iBlockheight, iBlockx, iBlocky); + +/* if (!iRetcode) + iRetcode = mng_process_display_dhdr (pData, iObjectid, iImagetype, iDeltatype, + iBlockwidth, iBlockheight, iBlockx, iBlocky); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_dhdrp)*ppChunk)->iObjectid = mng_get_uint16 (pRawdata); + ((mng_dhdrp)*ppChunk)->iImagetype = iImagetype; + ((mng_dhdrp)*ppChunk)->iDeltatype = iDeltatype; + + if (iRawlen > 4) + { + ((mng_dhdrp)*ppChunk)->iBlockwidth = mng_get_uint32 (pRawdata+4); + ((mng_dhdrp)*ppChunk)->iBlockheight = mng_get_uint32 (pRawdata+8); + } + + if (iRawlen > 12) + { + ((mng_dhdrp)*ppChunk)->iBlockx = mng_get_uint32 (pRawdata+12); + ((mng_dhdrp)*ppChunk)->iBlocky = mng_get_uint32 (pRawdata+16); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_NO_DELTA_PNG +READ_CHUNK (mng_read_prom) +{ + mng_uint8 iColortype; + mng_uint8 iSampledepth; + mng_uint8 iFilltype; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PROM, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 3) /* gotta be exactly 3 bytes */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + iColortype = *pRawdata; /* check fields for validity */ + iSampledepth = *(pRawdata+1); + iFilltype = *(pRawdata+2); + + if ((iColortype != MNG_COLORTYPE_GRAY ) && + (iColortype != MNG_COLORTYPE_RGB ) && + (iColortype != MNG_COLORTYPE_INDEXED) && + (iColortype != MNG_COLORTYPE_GRAYA ) && + (iColortype != MNG_COLORTYPE_RGBA ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + +#ifdef MNG_NO_16BIT_SUPPORT + if (iSampledepth == MNG_BITDEPTH_16 ) + iSampledepth = MNG_BITDEPTH_8; +#endif + + if ((iSampledepth != MNG_BITDEPTH_1 ) && + (iSampledepth != MNG_BITDEPTH_2 ) && + (iSampledepth != MNG_BITDEPTH_4 ) && + (iSampledepth != MNG_BITDEPTH_8 ) +#ifndef MNG_NO_16BIT_SUPPORT + && (iSampledepth != MNG_BITDEPTH_16) +#endif + ) + MNG_ERROR (pData, MNG_INVSAMPLEDEPTH); + + if ((iFilltype != MNG_FILLMETHOD_LEFTBITREPLICATE) && + (iFilltype != MNG_FILLMETHOD_ZEROFILL ) ) + MNG_ERROR (pData, MNG_INVFILLMETHOD); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode = mng_create_ani_prom (pData, iSampledepth, + iColortype, iFilltype); + +/* if (!iRetcode) + iRetcode = mng_process_display_prom (pData, iSampledepth, + iColortype, iFilltype); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_promp)*ppChunk)->iColortype = iColortype; + ((mng_promp)*ppChunk)->iSampledepth = iSampledepth; + ((mng_promp)*ppChunk)->iFilltype = iFilltype; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PROM, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_NO_DELTA_PNG +READ_CHUNK (mng_read_ipng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IPNG, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 0) /* gotta be empty */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode = mng_create_ani_ipng (pData); + + if (!iRetcode) + iRetcode = mng_process_display_ipng (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_NO_DELTA_PNG +READ_CHUNK (mng_read_pplt) +{ + mng_uint8 iDeltatype; + mng_uint8p pTemp; + mng_uint32 iLen; + mng_uint8 iX, iM; + mng_uint32 iY; + mng_uint32 iMax; + mng_rgbpaltab aIndexentries; + mng_uint8arr aAlphaentries; + mng_uint8arr aUsedentries; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PPLT, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) && (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 1) /* must have at least 1 byte */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + iDeltatype = *pRawdata; + /* valid ? */ + if (iDeltatype > MNG_DELTATYPE_DELTARGBA) + MNG_ERROR (pData, MNG_INVDELTATYPE); + /* must be indexed color ! */ + if (pData->iColortype != MNG_COLORTYPE_INDEXED) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + pTemp = pRawdata + 1; + iLen = iRawlen - 1; + iMax = 0; + + for (iY = 0; iY < 256; iY++) /* reset arrays */ + { + aIndexentries [iY].iRed = 0; + aIndexentries [iY].iGreen = 0; + aIndexentries [iY].iBlue = 0; + aAlphaentries [iY] = 255; + aUsedentries [iY] = 0; + } + + while (iLen) /* as long as there are entries left ... */ + { + mng_uint32 iDiff; + + if (iLen < 2) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + iX = *pTemp; /* get start and end index */ + iM = *(pTemp+1); + + if (iM < iX) + MNG_ERROR (pData, MNG_INVALIDINDEX); + + if ((mng_uint32)iM >= iMax) /* determine highest used index */ + iMax = (mng_uint32)iM + 1; + + pTemp += 2; + iLen -= 2; + iDiff = (iM - iX + 1); + if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) || + (iDeltatype == MNG_DELTATYPE_DELTARGB ) ) + iDiff = iDiff * 3; + else + if ((iDeltatype == MNG_DELTATYPE_REPLACERGBA) || + (iDeltatype == MNG_DELTATYPE_DELTARGBA ) ) + iDiff = iDiff * 4; + + if (iLen < iDiff) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) || + (iDeltatype == MNG_DELTATYPE_DELTARGB ) ) + { + for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++) + { + aIndexentries [iY].iRed = *pTemp; + aIndexentries [iY].iGreen = *(pTemp+1); + aIndexentries [iY].iBlue = *(pTemp+2); + aUsedentries [iY] = 1; + + pTemp += 3; + iLen -= 3; + } + } + else + if ((iDeltatype == MNG_DELTATYPE_REPLACEALPHA) || + (iDeltatype == MNG_DELTATYPE_DELTAALPHA ) ) + { + for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++) + { + aAlphaentries [iY] = *pTemp; + aUsedentries [iY] = 1; + + pTemp++; + iLen--; + } + } + else + { + for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++) + { + aIndexentries [iY].iRed = *pTemp; + aIndexentries [iY].iGreen = *(pTemp+1); + aIndexentries [iY].iBlue = *(pTemp+2); + aAlphaentries [iY] = *(pTemp+3); + aUsedentries [iY] = 1; + + pTemp += 4; + iLen -= 4; + } + } + } + + switch (pData->iBitdepth) /* check maximum allowed entries for bitdepth */ + { + case MNG_BITDEPTH_1 : { + if (iMax > 2) + MNG_ERROR (pData, MNG_INVALIDINDEX); + break; + } + case MNG_BITDEPTH_2 : { + if (iMax > 4) + MNG_ERROR (pData, MNG_INVALIDINDEX); + break; + } + case MNG_BITDEPTH_4 : { + if (iMax > 16) + MNG_ERROR (pData, MNG_INVALIDINDEX); + break; + } + } + +#ifdef MNG_SUPPORT_DISPLAY + { /* create animation object */ + mng_retcode iRetcode = mng_create_ani_pplt (pData, iDeltatype, iMax, + aIndexentries, aAlphaentries, + aUsedentries); + +/* if (!iRetcode) + iRetcode = mng_process_display_pplt (pData, iDeltatype, iMax, aIndexentries, + aAlphaentries, aUsedentries); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_ppltp)*ppChunk)->iDeltatype = iDeltatype; + ((mng_ppltp)*ppChunk)->iCount = iMax; + + for (iY = 0; iY < 256; iY++) + { + ((mng_ppltp)*ppChunk)->aEntries [iY].iRed = aIndexentries [iY].iRed; + ((mng_ppltp)*ppChunk)->aEntries [iY].iGreen = aIndexentries [iY].iGreen; + ((mng_ppltp)*ppChunk)->aEntries [iY].iBlue = aIndexentries [iY].iBlue; + ((mng_ppltp)*ppChunk)->aEntries [iY].iAlpha = aAlphaentries [iY]; + ((mng_ppltp)*ppChunk)->aEntries [iY].bUsed = (mng_bool)(aUsedentries [iY]); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_PPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +READ_CHUNK (mng_read_ijng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IJNG, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen != 0) /* gotta be empty */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode = mng_create_ani_ijng (pData); + + if (!iRetcode) + iRetcode = mng_process_display_ijng (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_NO_DELTA_PNG +READ_CHUNK (mng_read_drop) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DROP, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check length */ + if ((iRawlen < 4) || ((iRawlen % 4) != 0)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_dropp)*ppChunk)->iCount = iRawlen / 4; + + if (iRawlen) + { + mng_uint32 iX; + mng_uint8p pTemp = pRawdata; + mng_uint32p pEntry; + + MNG_ALLOC (pData, pEntry, iRawlen); + + ((mng_dropp)*ppChunk)->pChunknames = (mng_ptr)pEntry; + + for (iX = 0; iX < iRawlen / 4; iX++) + { + *pEntry = mng_get_uint32 (pTemp); + + pTemp += 4; + pEntry++; + } + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DROP, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +READ_CHUNK (mng_read_dbyk) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DBYK, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 6) /* must be at least 6 long */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_dbykp)*ppChunk)->iChunkname = mng_get_uint32 (pRawdata); + ((mng_dbykp)*ppChunk)->iPolarity = *(pRawdata+4); + ((mng_dbykp)*ppChunk)->iKeywordssize = iRawlen - 5; + + if (iRawlen > 5) + { + MNG_ALLOC (pData, ((mng_dbykp)*ppChunk)->zKeywords, iRawlen-4); + MNG_COPY (((mng_dbykp)*ppChunk)->zKeywords, pRawdata+5, iRawlen-5); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DBYK, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +READ_CHUNK (mng_read_ordr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ORDR, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (!pData->bHasDHDR)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check length */ + if ((iRawlen < 5) || ((iRawlen % 5) != 0)) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#ifdef MNG_SUPPORT_DISPLAY + { + + + /* TODO: something !!! */ + + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_ordrp)*ppChunk)->iCount = iRawlen / 5; + + if (iRawlen) + { + mng_uint32 iX; + mng_ordr_entryp pEntry; + mng_uint8p pTemp = pRawdata; + + MNG_ALLOC (pData, pEntry, iRawlen); + + ((mng_ordrp)*ppChunk)->pEntries = pEntry; + + for (iX = 0; iX < iRawlen / 5; iX++) + { + pEntry->iChunkname = mng_get_uint32 (pTemp); + pEntry->iOrdertype = *(pTemp+4); + + pTemp += 5; + pEntry++; + } + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_ORDR, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_MAGN +READ_CHUNK (mng_read_magn) +{ + mng_uint16 iFirstid, iLastid; + mng_uint8 iMethodX, iMethodY; + mng_uint16 iMX, iMY, iML, iMR, iMT, iMB; + mng_bool bFaulty; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MAGN, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_SUPPORT_JNG + if ((!pData->bHasMHDR) || (pData->bHasIHDR) || (pData->bHasDHDR) || (pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) || (pData->bHasIHDR) || (pData->bHasDHDR)) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* check length */ + if (iRawlen > 20) + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + /* following is an ugly hack to allow faulty layout caused by previous + versions of libmng and MNGeye, which wrote MAGN with a 16-bit + MethodX/MethodY (as opposed to the proper 8-bit as defined in the spec!) */ + + if ((iRawlen == 6) || (iRawlen == 8) || (iRawlen == 10) || (iRawlen == 12) || + (iRawlen == 14) || (iRawlen == 16) || (iRawlen == 20)) + bFaulty = MNG_TRUE; /* these lengths are all wrong */ + else /* length 18 can be right or wrong !!! */ + if ((iRawlen == 18) && (mng_get_uint16 (pRawdata+4) <= 5) && + (mng_get_uint16 (pRawdata+6) < 256) && + (mng_get_uint16 (pRawdata+8) < 256) && + (mng_get_uint16 (pRawdata+10) < 256) && + (mng_get_uint16 (pRawdata+12) < 256) && + (mng_get_uint16 (pRawdata+14) < 256) && + (mng_get_uint16 (pRawdata+16) < 256)) + bFaulty = MNG_TRUE; /* this is very likely the wrong layout */ + else + bFaulty = MNG_FALSE; /* all other cases are handled as right */ + + if (bFaulty) /* wrong layout ? */ + { + if (iRawlen > 0) /* get the fields */ + iFirstid = mng_get_uint16 (pRawdata); + else + iFirstid = 0; + + if (iRawlen > 2) + iLastid = mng_get_uint16 (pRawdata+2); + else + iLastid = iFirstid; + + if (iRawlen > 4) + iMethodX = (mng_uint8)(mng_get_uint16 (pRawdata+4)); + else + iMethodX = 0; + + if (iRawlen > 6) + iMX = mng_get_uint16 (pRawdata+6); + else + iMX = 1; + + if (iRawlen > 8) + iMY = mng_get_uint16 (pRawdata+8); + else + iMY = iMX; + + if (iRawlen > 10) + iML = mng_get_uint16 (pRawdata+10); + else + iML = iMX; + + if (iRawlen > 12) + iMR = mng_get_uint16 (pRawdata+12); + else + iMR = iMX; + + if (iRawlen > 14) + iMT = mng_get_uint16 (pRawdata+14); + else + iMT = iMY; + + if (iRawlen > 16) + iMB = mng_get_uint16 (pRawdata+16); + else + iMB = iMY; + + if (iRawlen > 18) + iMethodY = (mng_uint8)(mng_get_uint16 (pRawdata+18)); + else + iMethodY = iMethodX; + } + else /* proper layout !!!! */ + { + if (iRawlen > 0) /* get the fields */ + iFirstid = mng_get_uint16 (pRawdata); + else + iFirstid = 0; + + if (iRawlen > 2) + iLastid = mng_get_uint16 (pRawdata+2); + else + iLastid = iFirstid; + + if (iRawlen > 4) + iMethodX = *(pRawdata+4); + else + iMethodX = 0; + + if (iRawlen > 5) + iMX = mng_get_uint16 (pRawdata+5); + else + iMX = 1; + + if (iRawlen > 7) + iMY = mng_get_uint16 (pRawdata+7); + else + iMY = iMX; + + if (iRawlen > 9) + iML = mng_get_uint16 (pRawdata+9); + else + iML = iMX; + + if (iRawlen > 11) + iMR = mng_get_uint16 (pRawdata+11); + else + iMR = iMX; + + if (iRawlen > 13) + iMT = mng_get_uint16 (pRawdata+13); + else + iMT = iMY; + + if (iRawlen > 15) + iMB = mng_get_uint16 (pRawdata+15); + else + iMB = iMY; + + if (iRawlen > 17) + iMethodY = *(pRawdata+17); + else + iMethodY = iMethodX; + } + /* check field validity */ + if ((iMethodX > 5) || (iMethodY > 5)) + MNG_ERROR (pData, MNG_INVALIDMETHOD); + +#ifdef MNG_SUPPORT_DISPLAY + { + mng_retcode iRetcode; + + iRetcode = mng_create_ani_magn (pData, iFirstid, iLastid, iMethodX, + iMX, iMY, iML, iMR, iMT, iMB, iMethodY); + +/* if (!iRetcode) + iRetcode = mng_process_display_magn (pData, iFirstid, iLastid, iMethodX, + iMX, iMY, iML, iMR, iMT, iMB, iMethodY); */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_magnp)*ppChunk)->iFirstid = iFirstid; + ((mng_magnp)*ppChunk)->iLastid = iLastid; + ((mng_magnp)*ppChunk)->iMethodX = iMethodX; + ((mng_magnp)*ppChunk)->iMX = iMX; + ((mng_magnp)*ppChunk)->iMY = iMY; + ((mng_magnp)*ppChunk)->iML = iML; + ((mng_magnp)*ppChunk)->iMR = iMR; + ((mng_magnp)*ppChunk)->iMT = iMT; + ((mng_magnp)*ppChunk)->iMB = iMB; + ((mng_magnp)*ppChunk)->iMethodY = iMethodY; + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +READ_CHUNK (mng_read_mpng) +{ + mng_uint32 iFramewidth; + mng_uint32 iFrameheight; + mng_uint16 iTickspersec; + mng_uint32 iFramessize; + mng_uint32 iCompressedsize; +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + mng_retcode iRetcode; + mng_uint16 iNumplays; + mng_uint32 iBufsize; + mng_uint8p pBuf = 0; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MPNG, MNG_LC_START); +#endif + /* sequence checks */ + if (!pData->bHasIHDR) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 41) /* length must be at least 41 */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + + iFramewidth = mng_get_int32 (pRawdata); + if (iFramewidth == 0) /* frame_width must not be zero */ + MNG_ERROR (pData, MNG_INVALIDWIDTH); + + iFrameheight = mng_get_int32 (pRawdata+4); + if (iFrameheight == 0) /* frame_height must not be zero */ + MNG_ERROR (pData, MNG_INVALIDHEIGHT); + + iTickspersec = mng_get_uint16 (pRawdata+10); + if (iTickspersec == 0) /* delay_den must not be zero */ + MNG_ERROR (pData, MNG_INVALIDFIELDVAL); + + if (*(pRawdata+12) != 0) /* only deflate compression-method allowed */ + MNG_ERROR (pData, MNG_INVALIDCOMPRESS); + +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + iNumplays = mng_get_uint16 (pRawdata+8); + iCompressedsize = (mng_uint32)(iRawlen - 13); +#endif + +#ifdef MNG_SUPPORT_DISPLAY + { + iRetcode = mng_inflate_buffer (pData, pRawdata+13, iCompressedsize, + &pBuf, &iBufsize, &iFramessize); + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + + if (iFramessize % 26) + { + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } + + iRetcode = mng_create_mpng_obj (pData, iFramewidth, iFrameheight, iNumplays, + iTickspersec, iFramessize, pBuf); + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + } +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the fields */ + ((mng_mpngp)*ppChunk)->iFramewidth = iFramewidth; + ((mng_mpngp)*ppChunk)->iFrameheight = iFrameheight; + ((mng_mpngp)*ppChunk)->iNumplays = iNumplays; + ((mng_mpngp)*ppChunk)->iTickspersec = iTickspersec; + ((mng_mpngp)*ppChunk)->iCompressionmethod = *(pRawdata+14); + +#ifndef MNG_SUPPORT_DISPLAY + iRetcode = mng_inflate_buffer (pData, pRawdata+13, iCompressedsize, + &pBuf, &iBufsize, &iFramessize); + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pBuf, iBufsize); + return iRetcode; + } + + if (iFramessize % 26) + { + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_INVALIDLENGTH); + } +#endif + + if (iFramessize) + { + MNG_ALLOCX (pData, ((mng_mpngp)*ppChunk)->pFrames, iFramessize); + if (((mng_mpngp)*ppChunk)->pFrames == 0) + { + MNG_FREEX (pData, pBuf, iBufsize); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + ((mng_mpngp)*ppChunk)->iFramessize = iFramessize; + MNG_COPY (((mng_mpngp)*ppChunk)->pFrames, pBuf, iFramessize); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) + MNG_FREEX (pData, pBuf, iBufsize); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_MPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifndef MNG_SKIPCHUNK_evNT +READ_CHUNK (mng_read_evnt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_EVNT, MNG_LC_START); +#endif + /* sequence checks */ + if ((!pData->bHasMHDR) || (pData->bHasSAVE)) + MNG_ERROR (pData, MNG_SEQUENCEERROR); + + if (iRawlen < 2) /* must have at least 1 entry ! */ + MNG_ERROR (pData, MNG_INVALIDLENGTH); + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG) + { + if (iRawlen) /* not empty ? */ + { + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint8p pNull; + mng_uint32 iLen; + mng_uint8 iEventtype; + mng_uint8 iMasktype; + mng_int32 iLeft; + mng_int32 iRight; + mng_int32 iTop; + mng_int32 iBottom; + mng_uint16 iObjectid; + mng_uint8 iIndex; + mng_uint32 iNamesize; + + pTemp = pRawdata; + iLen = iRawlen; + + while (iLen) /* anything left ? */ + { + iEventtype = *pTemp; /* eventtype */ + if (iEventtype > 5) + MNG_ERROR (pData, MNG_INVALIDEVENT); + + pTemp++; + + iMasktype = *pTemp; /* masktype */ + if (iMasktype > 5) + MNG_ERROR (pData, MNG_INVALIDMASK); + + pTemp++; + iLen -= 2; + + iLeft = 0; + iRight = 0; + iTop = 0; + iBottom = 0; + iObjectid = 0; + iIndex = 0; + + switch (iMasktype) + { + case 1 : + { + if (iLen > 16) + { + iLeft = mng_get_int32 (pTemp); + iRight = mng_get_int32 (pTemp+4); + iTop = mng_get_int32 (pTemp+8); + iBottom = mng_get_int32 (pTemp+12); + pTemp += 16; + iLen -= 16; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 2 : + { + if (iLen > 2) + { + iObjectid = mng_get_uint16 (pTemp); + pTemp += 2; + iLen -= 2; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 3 : + { + if (iLen > 3) + { + iObjectid = mng_get_uint16 (pTemp); + iIndex = *(pTemp+2); + pTemp += 3; + iLen -= 3; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 4 : + { + if (iLen > 18) + { + iLeft = mng_get_int32 (pTemp); + iRight = mng_get_int32 (pTemp+4); + iTop = mng_get_int32 (pTemp+8); + iBottom = mng_get_int32 (pTemp+12); + iObjectid = mng_get_uint16 (pTemp+16); + pTemp += 18; + iLen -= 18; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 5 : + { + if (iLen > 19) + { + iLeft = mng_get_int32 (pTemp); + iRight = mng_get_int32 (pTemp+4); + iTop = mng_get_int32 (pTemp+8); + iBottom = mng_get_int32 (pTemp+12); + iObjectid = mng_get_uint16 (pTemp+16); + iIndex = *(pTemp+18); + pTemp += 19; + iLen -= 19; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + } + + pNull = find_null (pTemp); /* get the name length */ + + if ((pNull - pTemp) > (mng_int32)iLen) + { + iNamesize = iLen; /* no null found; so end of evNT */ + iLen = 0; + } + else + { + iNamesize = pNull - pTemp; /* should be another entry */ + iLen = iLen - iNamesize - 1; + + if (!iLen) /* must not end with a null ! */ + MNG_ERROR (pData, MNG_ENDWITHNULL); + } + + iRetcode = mng_create_event (pData, iEventtype, iMasktype, iLeft, iRight, + iTop, iBottom, iObjectid, iIndex, + iNamesize, (mng_pchar)pTemp); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pTemp = pTemp + iNamesize + 1; + } + } + } +#endif /* MNG_SUPPORT_DISPLAY && MNG_SUPPORT_DYNAMICMNG */ + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (iRawlen) /* not empty ? */ + { + mng_uint32 iX; + mng_uint32 iCount = 0; + mng_uint8p pTemp; + mng_uint8p pNull; + mng_uint32 iLen; + mng_uint8 iEventtype; + mng_uint8 iMasktype; + mng_int32 iLeft; + mng_int32 iRight; + mng_int32 iTop; + mng_int32 iBottom; + mng_uint16 iObjectid; + mng_uint8 iIndex; + mng_uint32 iNamesize; + mng_evnt_entryp pEntry = MNG_NULL; + + for (iX = 0; iX < 2; iX++) /* do this twice to get the count first ! */ + { + pTemp = pRawdata; + iLen = iRawlen; + + if (iX) /* second run ? */ + { + MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_evnt_entry))); + + ((mng_evntp)*ppChunk)->iCount = iCount; + ((mng_evntp)*ppChunk)->pEntries = pEntry; + } + + while (iLen) /* anything left ? */ + { + iEventtype = *pTemp; /* eventtype */ + if (iEventtype > 5) + MNG_ERROR (pData, MNG_INVALIDEVENT); + + pTemp++; + + iMasktype = *pTemp; /* masktype */ + if (iMasktype > 5) + MNG_ERROR (pData, MNG_INVALIDMASK); + + pTemp++; + iLen -= 2; + + iLeft = 0; + iRight = 0; + iTop = 0; + iBottom = 0; + iObjectid = 0; + iIndex = 0; + + switch (iMasktype) + { + case 1 : + { + if (iLen > 16) + { + iLeft = mng_get_int32 (pTemp); + iRight = mng_get_int32 (pTemp+4); + iTop = mng_get_int32 (pTemp+8); + iBottom = mng_get_int32 (pTemp+12); + pTemp += 16; + iLen -= 16; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 2 : + { + if (iLen > 2) + { + iObjectid = mng_get_uint16 (pTemp); + pTemp += 2; + iLen -= 2; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 3 : + { + if (iLen > 3) + { + iObjectid = mng_get_uint16 (pTemp); + iIndex = *(pTemp+2); + pTemp += 3; + iLen -= 3; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 4 : + { + if (iLen > 18) + { + iLeft = mng_get_int32 (pTemp); + iRight = mng_get_int32 (pTemp+4); + iTop = mng_get_int32 (pTemp+8); + iBottom = mng_get_int32 (pTemp+12); + iObjectid = mng_get_uint16 (pTemp+16); + pTemp += 18; + iLen -= 18; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + case 5 : + { + if (iLen > 19) + { + iLeft = mng_get_int32 (pTemp); + iRight = mng_get_int32 (pTemp+4); + iTop = mng_get_int32 (pTemp+8); + iBottom = mng_get_int32 (pTemp+12); + iObjectid = mng_get_uint16 (pTemp+16); + iIndex = *(pTemp+18); + pTemp += 19; + iLen -= 19; + } + else + MNG_ERROR (pData, MNG_INVALIDLENGTH); + break; + } + } + + pNull = find_null (pTemp); /* get the name length */ + + if ((pNull - pTemp) > (mng_int32)iLen) + { + iNamesize = iLen; /* no null found; so end of evNT */ + iLen = 0; + } + else + { + iNamesize = pNull - pTemp; /* should be another entry */ + iLen = iLen - iNamesize - 1; + + if (!iLen) /* must not end with a null ! */ + MNG_ERROR (pData, MNG_ENDWITHNULL); + } + + if (!iX) + { + iCount++; + } + else + { + pEntry->iEventtype = iEventtype; + pEntry->iMasktype = iMasktype; + pEntry->iLeft = iLeft; + pEntry->iRight = iRight; + pEntry->iTop = iTop; + pEntry->iBottom = iBottom; + pEntry->iObjectid = iObjectid; + pEntry->iIndex = iIndex; + pEntry->iSegmentnamesize = iNamesize; + + if (iNamesize) + { + MNG_ALLOC (pData, pEntry->zSegmentname, iNamesize+1); + MNG_COPY (pEntry->zSegmentname, pTemp, iNamesize); + } + + pEntry++; + } + + pTemp = pTemp + iNamesize + 1; + } + } + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_EVNT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_unknown) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_UNKNOWN, MNG_LC_START); +#endif + /* sequence checks */ +#ifdef MNG_INCLUDE_JNG + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && + (!pData->bHasBASI) && (!pData->bHasDHDR) ) +#endif + MNG_ERROR (pData, MNG_SEQUENCEERROR); + /* critical chunk ? */ + if ((((mng_uint32)pData->iChunkname & 0x20000000) == 0) +#ifdef MNG_SKIPCHUNK_SAVE + && (pData->iChunkname != MNG_UINT_SAVE) +#endif +#ifdef MNG_SKIPCHUNK_SEEK + && (pData->iChunkname != MNG_UINT_SEEK) +#endif +#ifdef MNG_SKIPCHUNK_DBYK + && (pData->iChunkname != MNG_UINT_DBYK) +#endif +#ifdef MNG_SKIPCHUNK_ORDR + && (pData->iChunkname != MNG_UINT_ORDR) +#endif + ) + MNG_ERROR (pData, MNG_UNKNOWNCRITICAL); + + if (pData->fProcessunknown) /* let the app handle it ? */ + { + mng_bool bOke = pData->fProcessunknown ((mng_handle)pData, pData->iChunkname, + iRawlen, (mng_ptr)pRawdata); + + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + +#ifdef MNG_STORE_CHUNKS + if (pData->bStorechunks) + { /* initialize storage */ + mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* store the length */ + ((mng_chunk_headerp)*ppChunk)->iChunkname = pData->iChunkname; + ((mng_unknown_chunkp)*ppChunk)->iDatasize = iRawlen; + + if (iRawlen == 0) /* any data at all ? */ + ((mng_unknown_chunkp)*ppChunk)->pData = 0; + else + { /* then store it */ + MNG_ALLOC (pData, ((mng_unknown_chunkp)*ppChunk)->pData, iRawlen); + MNG_COPY (((mng_unknown_chunkp)*ppChunk)->pData, pRawdata, iRawlen); + } + } +#endif /* MNG_STORE_CHUNKS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_UNKNOWN, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} +#endif + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_READ_PROCS */ + +/* ************************************************************************** */ +/* * * */ +/* * chunk write functions * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_ihdr) +{ + mng_ihdrp pIHDR; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IHDR, MNG_LC_START); +#endif + + pIHDR = (mng_ihdrp)pChunk; /* address the proper chunk */ + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 13; + /* fill the output buffer */ + mng_put_uint32 (pRawdata, pIHDR->iWidth); + mng_put_uint32 (pRawdata+4, pIHDR->iHeight); + + *(pRawdata+8) = pIHDR->iBitdepth; + *(pRawdata+9) = pIHDR->iColortype; + *(pRawdata+10) = pIHDR->iCompression; + *(pRawdata+11) = pIHDR->iFilter; + *(pRawdata+12) = pIHDR->iInterlace; + /* and write it */ + iRetcode = write_raw_chunk (pData, pIHDR->sHeader.iChunkname, iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IHDR, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_plte) +{ + mng_pltep pPLTE; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PLTE, MNG_LC_START); +#endif + + pPLTE = (mng_pltep)pChunk; /* address the proper chunk */ + + if (pPLTE->bEmpty) /* write empty chunk ? */ + iRetcode = write_raw_chunk (pData, pPLTE->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pPLTE->iEntrycount * 3; + /* fill the output buffer */ + pTemp = pRawdata; + + for (iX = 0; iX < pPLTE->iEntrycount; iX++) + { + *pTemp = pPLTE->aEntries [iX].iRed; + *(pTemp+1) = pPLTE->aEntries [iX].iGreen; + *(pTemp+2) = pPLTE->aEntries [iX].iBlue; + + pTemp += 3; + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pPLTE->sHeader.iChunkname, iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PLTE, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_idat) +{ + mng_idatp pIDAT; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IDAT, MNG_LC_START); +#endif + + pIDAT = (mng_idatp)pChunk; /* address the proper chunk */ + + if (pIDAT->bEmpty) /* and write it */ + iRetcode = write_raw_chunk (pData, pIDAT->sHeader.iChunkname, 0, 0); + else + iRetcode = write_raw_chunk (pData, pIDAT->sHeader.iChunkname, + pIDAT->iDatasize, pIDAT->pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IDAT, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_iend) +{ + mng_iendp pIEND; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IEND, MNG_LC_START); +#endif + + pIEND = (mng_iendp)pChunk; /* address the proper chunk */ + /* and write it */ + iRetcode = write_raw_chunk (pData, pIEND->sHeader.iChunkname, 0, 0); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IEND, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_trns) +{ + mng_trnsp pTRNS; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_TRNS, MNG_LC_START); +#endif + + pTRNS = (mng_trnsp)pChunk; /* address the proper chunk */ + + if (pTRNS->bEmpty) /* write empty chunk ? */ + iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname, 0, 0); + else + if (pTRNS->bGlobal) /* write global chunk ? */ + iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname, + pTRNS->iRawlen, (mng_uint8p)pTRNS->aRawdata); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer */ + iRawlen = 0; /* and default size */ + + switch (pTRNS->iType) + { + case 0: { + iRawlen = 2; /* fill the size & output buffer */ + mng_put_uint16 (pRawdata, pTRNS->iGray); + + break; + } + case 2: { + iRawlen = 6; /* fill the size & output buffer */ + mng_put_uint16 (pRawdata, pTRNS->iRed); + mng_put_uint16 (pRawdata+2, pTRNS->iGreen); + mng_put_uint16 (pRawdata+4, pTRNS->iBlue); + + break; + } + case 3: { /* init output buffer size */ + iRawlen = pTRNS->iCount; + + pTemp = pRawdata; /* fill the output buffer */ + + for (iX = 0; iX < pTRNS->iCount; iX++) + { + *pTemp = pTRNS->aEntries[iX]; + pTemp++; + } + + break; + } + } + /* write the chunk */ + iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_TRNS, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_gama) +{ + mng_gamap pGAMA; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_GAMA, MNG_LC_START); +#endif + + pGAMA = (mng_gamap)pChunk; /* address the proper chunk */ + + if (pGAMA->bEmpty) /* write empty ? */ + iRetcode = write_raw_chunk (pData, pGAMA->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 4; + /* fill the buffer */ + mng_put_uint32 (pRawdata, pGAMA->iGamma); + /* and write it */ + iRetcode = write_raw_chunk (pData, pGAMA->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_GAMA, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +WRITE_CHUNK (mng_write_chrm) +{ + mng_chrmp pCHRM; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_CHRM, MNG_LC_START); +#endif + + pCHRM = (mng_chrmp)pChunk; /* address the proper chunk */ + + if (pCHRM->bEmpty) /* write empty ? */ + iRetcode = write_raw_chunk (pData, pCHRM->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 32; + /* fill the buffer */ + mng_put_uint32 (pRawdata, pCHRM->iWhitepointx); + mng_put_uint32 (pRawdata+4, pCHRM->iWhitepointy); + mng_put_uint32 (pRawdata+8, pCHRM->iRedx); + mng_put_uint32 (pRawdata+12, pCHRM->iRedy); + mng_put_uint32 (pRawdata+16, pCHRM->iGreenx); + mng_put_uint32 (pRawdata+20, pCHRM->iGreeny); + mng_put_uint32 (pRawdata+24, pCHRM->iBluex); + mng_put_uint32 (pRawdata+28, pCHRM->iBluey); + /* and write it */ + iRetcode = write_raw_chunk (pData, pCHRM->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_CHRM, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_srgb) +{ + mng_srgbp pSRGB; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SRGB, MNG_LC_START); +#endif + + pSRGB = (mng_srgbp)pChunk; /* address the proper chunk */ + + if (pSRGB->bEmpty) /* write empty ? */ + iRetcode = write_raw_chunk (pData, pSRGB->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 1; + /* fill the buffer */ + *pRawdata = pSRGB->iRenderingintent; + /* and write it */ + iRetcode = write_raw_chunk (pData, pSRGB->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SRGB, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +WRITE_CHUNK (mng_write_iccp) +{ + mng_iccpp pICCP; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint8p pBuf = 0; + mng_uint32 iBuflen; + mng_uint32 iReallen; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ICCP, MNG_LC_START); +#endif + + pICCP = (mng_iccpp)pChunk; /* address the proper chunk */ + + if (pICCP->bEmpty) /* write empty ? */ + iRetcode = write_raw_chunk (pData, pICCP->sHeader.iChunkname, 0, 0); + else + { /* compress the profile */ + iRetcode = deflate_buffer (pData, pICCP->pProfile, pICCP->iProfilesize, + &pBuf, &iBuflen, &iReallen); + + if (!iRetcode) /* still oke ? */ + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pICCP->iNamesize + 2 + iReallen; + /* requires large buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_ALLOC (pData, pRawdata, iRawlen); + + pTemp = pRawdata; /* fill the buffer */ + + if (pICCP->iNamesize) + { + MNG_COPY (pTemp, pICCP->zName, pICCP->iNamesize); + pTemp += pICCP->iNamesize; + } + + *pTemp = 0; + *(pTemp+1) = pICCP->iCompression; + pTemp += 2; + + if (iReallen) + MNG_COPY (pTemp, pBuf, iReallen); + /* and write it */ + iRetcode = write_raw_chunk (pData, pICCP->sHeader.iChunkname, + iRawlen, pRawdata); + /* drop the temp buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_FREEX (pData, pRawdata, iRawlen); + + } + + MNG_FREEX (pData, pBuf, iBuflen); /* always drop the extra buffer */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ICCP, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +WRITE_CHUNK (mng_write_text) +{ + mng_textp pTEXT; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_TEXT, MNG_LC_START); +#endif + + pTEXT = (mng_textp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pTEXT->iKeywordsize + 1 + pTEXT->iTextsize; + /* requires large buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_ALLOC (pData, pRawdata, iRawlen); + + pTemp = pRawdata; /* fill the buffer */ + + if (pTEXT->iKeywordsize) + { + MNG_COPY (pTemp, pTEXT->zKeyword, pTEXT->iKeywordsize); + pTemp += pTEXT->iKeywordsize; + } + + *pTemp = 0; + pTemp += 1; + + if (pTEXT->iTextsize) + MNG_COPY (pTemp, pTEXT->zText, pTEXT->iTextsize); + /* and write it */ + iRetcode = write_raw_chunk (pData, pTEXT->sHeader.iChunkname, + iRawlen, pRawdata); + + if (iRawlen > pData->iWritebufsize) /* drop the temp buffer ? */ + MNG_FREEX (pData, pRawdata, iRawlen); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_TEXT, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +WRITE_CHUNK (mng_write_ztxt) +{ + mng_ztxtp pZTXT; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint8p pBuf = 0; + mng_uint32 iBuflen; + mng_uint32 iReallen; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ZTXT, MNG_LC_START); +#endif + + pZTXT = (mng_ztxtp)pChunk; /* address the proper chunk */ + /* compress the text */ + iRetcode = deflate_buffer (pData, (mng_uint8p)pZTXT->zText, pZTXT->iTextsize, + &pBuf, &iBuflen, &iReallen); + + if (!iRetcode) /* all ok ? */ + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pZTXT->iKeywordsize + 2 + iReallen; + /* requires large buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_ALLOC (pData, pRawdata, iRawlen); + + pTemp = pRawdata; /* fill the buffer */ + + if (pZTXT->iKeywordsize) + { + MNG_COPY (pTemp, pZTXT->zKeyword, pZTXT->iKeywordsize); + pTemp += pZTXT->iKeywordsize; + } + + *pTemp = 0; /* terminator zero */ + pTemp++; + *pTemp = 0; /* compression type */ + pTemp++; + + if (iReallen) + MNG_COPY (pTemp, pBuf, iReallen); + /* and write it */ + iRetcode = write_raw_chunk (pData, pZTXT->sHeader.iChunkname, + iRawlen, pRawdata); + /* drop the temp buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_FREEX (pData, pRawdata, iRawlen); + + } + + MNG_FREEX (pData, pBuf, iBuflen); /* always drop the compression buffer */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ZTXT, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +WRITE_CHUNK (mng_write_itxt) +{ + mng_itxtp pITXT; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint8p pBuf = 0; + mng_uint32 iBuflen; + mng_uint32 iReallen; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ITXT, MNG_LC_START); +#endif + + pITXT = (mng_itxtp)pChunk; /* address the proper chunk */ + + if (pITXT->iCompressionflag) /* compress the text */ + iRetcode = deflate_buffer (pData, (mng_uint8p)pITXT->zText, pITXT->iTextsize, + &pBuf, &iBuflen, &iReallen); + else + iRetcode = MNG_NOERROR; + + if (!iRetcode) /* all ok ? */ + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pITXT->iKeywordsize + pITXT->iLanguagesize + + pITXT->iTranslationsize + 5; + + if (pITXT->iCompressionflag) + iRawlen = iRawlen + iReallen; + else + iRawlen = iRawlen + pITXT->iTextsize; + /* requires large buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_ALLOC (pData, pRawdata, iRawlen); + + pTemp = pRawdata; /* fill the buffer */ + + if (pITXT->iKeywordsize) + { + MNG_COPY (pTemp, pITXT->zKeyword, pITXT->iKeywordsize); + pTemp += pITXT->iKeywordsize; + } + + *pTemp = 0; + pTemp++; + *pTemp = pITXT->iCompressionflag; + pTemp++; + *pTemp = pITXT->iCompressionmethod; + pTemp++; + + if (pITXT->iLanguagesize) + { + MNG_COPY (pTemp, pITXT->zLanguage, pITXT->iLanguagesize); + pTemp += pITXT->iLanguagesize; + } + + *pTemp = 0; + pTemp++; + + if (pITXT->iTranslationsize) + { + MNG_COPY (pTemp, pITXT->zTranslation, pITXT->iTranslationsize); + pTemp += pITXT->iTranslationsize; + } + + *pTemp = 0; + pTemp++; + + if (pITXT->iCompressionflag) + { + if (iReallen) + MNG_COPY (pTemp, pBuf, iReallen); + } + else + { + if (pITXT->iTextsize) + MNG_COPY (pTemp, pITXT->zText, pITXT->iTextsize); + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pITXT->sHeader.iChunkname, + iRawlen, pRawdata); + /* drop the temp buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_FREEX (pData, pRawdata, iRawlen); + + } + + MNG_FREEX (pData, pBuf, iBuflen); /* always drop the compression buffer */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ITXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +WRITE_CHUNK (mng_write_bkgd) +{ + mng_bkgdp pBKGD; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_BKGD, MNG_LC_START); +#endif + + pBKGD = (mng_bkgdp)pChunk; /* address the proper chunk */ + + if (pBKGD->bEmpty) /* write empty ? */ + iRetcode = write_raw_chunk (pData, pBKGD->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 0; /* and default size */ + + switch (pBKGD->iType) + { + case 0: { /* gray */ + iRawlen = 2; /* fill the size & output buffer */ + mng_put_uint16 (pRawdata, pBKGD->iGray); + + break; + } + case 2: { /* rgb */ + iRawlen = 6; /* fill the size & output buffer */ + mng_put_uint16 (pRawdata, pBKGD->iRed); + mng_put_uint16 (pRawdata+2, pBKGD->iGreen); + mng_put_uint16 (pRawdata+4, pBKGD->iBlue); + + break; + } + case 3: { /* indexed */ + iRawlen = 1; /* fill the size & output buffer */ + *pRawdata = pBKGD->iIndex; + + break; + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pBKGD->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_BKGD, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYs +WRITE_CHUNK (mng_write_phys) +{ + mng_physp pPHYS; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PHYS, MNG_LC_START); +#endif + + pPHYS = (mng_physp)pChunk; /* address the proper chunk */ + + if (pPHYS->bEmpty) /* write empty ? */ + iRetcode = write_raw_chunk (pData, pPHYS->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 9; + /* fill the output buffer */ + mng_put_uint32 (pRawdata, pPHYS->iSizex); + mng_put_uint32 (pRawdata+4, pPHYS->iSizey); + + *(pRawdata+8) = pPHYS->iUnit; + /* and write it */ + iRetcode = write_raw_chunk (pData, pPHYS->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PHYS, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sBIT +WRITE_CHUNK (mng_write_sbit) +{ + mng_sbitp pSBIT; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SBIT, MNG_LC_START); +#endif + + pSBIT = (mng_sbitp)pChunk; /* address the proper chunk */ + + if (pSBIT->bEmpty) /* write empty ? */ + iRetcode = write_raw_chunk (pData, pSBIT->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 0; /* and default size */ + + switch (pSBIT->iType) + { + case 0: { /* gray */ + iRawlen = 1; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + + break; + } + case 2: { /* rgb */ + iRawlen = 3; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + *(pRawdata+1) = pSBIT->aBits[1]; + *(pRawdata+2) = pSBIT->aBits[2]; + + break; + } + case 3: { /* indexed */ + iRawlen = 3; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + *pRawdata = pSBIT->aBits[1]; + *pRawdata = pSBIT->aBits[2]; + + break; + } + case 4: { /* gray + alpha */ + iRawlen = 2; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + *(pRawdata+1) = pSBIT->aBits[1]; + + break; + } + case 6: { /* rgb + alpha */ + iRawlen = 4; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + *(pRawdata+1) = pSBIT->aBits[1]; + *(pRawdata+2) = pSBIT->aBits[2]; + *(pRawdata+3) = pSBIT->aBits[3]; + + break; + } + case 10: { /* jpeg gray */ + iRawlen = 1; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + + break; + } + case 12: { /* jpeg rgb */ + iRawlen = 3; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + *(pRawdata+1) = pSBIT->aBits[1]; + *(pRawdata+2) = pSBIT->aBits[2]; + + break; + } + case 14: { /* jpeg gray + alpha */ + iRawlen = 2; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + *(pRawdata+1) = pSBIT->aBits[1]; + + break; + } + case 16: { /* jpeg rgb + alpha */ + iRawlen = 4; /* fill the size & output buffer */ + *pRawdata = pSBIT->aBits[0]; + *(pRawdata+1) = pSBIT->aBits[1]; + *(pRawdata+2) = pSBIT->aBits[2]; + *(pRawdata+3) = pSBIT->aBits[3]; + + break; + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pSBIT->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SBIT, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +WRITE_CHUNK (mng_write_splt) +{ + mng_spltp pSPLT; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint32 iEntrieslen; + mng_uint8p pTemp; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SPLT, MNG_LC_START); +#endif + + pSPLT = (mng_spltp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iEntrieslen = ((pSPLT->iSampledepth >> 3) * 4 + 2) * pSPLT->iEntrycount; + iRawlen = pSPLT->iNamesize + 2 + iEntrieslen; + /* requires large buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_ALLOC (pData, pRawdata, iRawlen); + + pTemp = pRawdata; /* fill the buffer */ + + if (pSPLT->iNamesize) + { + MNG_COPY (pTemp, pSPLT->zName, pSPLT->iNamesize); + pTemp += pSPLT->iNamesize; + } + + *pTemp = 0; + *(pTemp+1) = pSPLT->iSampledepth; + pTemp += 2; + + if (pSPLT->iEntrycount) + MNG_COPY (pTemp, pSPLT->pEntries, iEntrieslen); + /* and write it */ + iRetcode = write_raw_chunk (pData, pSPLT->sHeader.iChunkname, + iRawlen, pRawdata); + + if (iRawlen > pData->iWritebufsize) /* drop the temp buffer ? */ + MNG_FREEX (pData, pRawdata, iRawlen); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SPLT, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_hIST +WRITE_CHUNK (mng_write_hist) +{ + mng_histp pHIST; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_HIST, MNG_LC_START); +#endif + + pHIST = (mng_histp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pHIST->iEntrycount << 1; + + pTemp = pRawdata; /* fill the output buffer */ + + for (iX = 0; iX < pHIST->iEntrycount; iX++) + { + mng_put_uint16 (pTemp, pHIST->aEntries [iX]); + pTemp += 2; + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pHIST->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_HIST, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tIME +WRITE_CHUNK (mng_write_time) +{ + mng_timep pTIME; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_TIME, MNG_LC_START); +#endif + + pTIME = (mng_timep)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 7; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pTIME->iYear); + + *(pRawdata+2) = pTIME->iMonth; + *(pRawdata+3) = pTIME->iDay; + *(pRawdata+4) = pTIME->iHour; + *(pRawdata+5) = pTIME->iMinute; + *(pRawdata+6) = pTIME->iSecond; + /* and write it */ + iRetcode = write_raw_chunk (pData, pTIME->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_TIME, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_mhdr) +{ + mng_mhdrp pMHDR; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MHDR, MNG_LC_START); +#endif + + pMHDR = (mng_mhdrp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 28; + /* fill the output buffer */ + mng_put_uint32 (pRawdata, pMHDR->iWidth); + mng_put_uint32 (pRawdata+4, pMHDR->iHeight); + mng_put_uint32 (pRawdata+8, pMHDR->iTicks); + mng_put_uint32 (pRawdata+12, pMHDR->iLayercount); + mng_put_uint32 (pRawdata+16, pMHDR->iFramecount); + mng_put_uint32 (pRawdata+20, pMHDR->iPlaytime); + mng_put_uint32 (pRawdata+24, pMHDR->iSimplicity); + + /* and write it */ + iRetcode = write_raw_chunk (pData, pMHDR->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MHDR, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_mend) +{ + mng_mendp pMEND; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MEND, MNG_LC_START); +#endif + + pMEND = (mng_mendp)pChunk; /* address the proper chunk */ + /* and write it */ + iRetcode = write_raw_chunk (pData, pMEND->sHeader.iChunkname, 0, 0); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MEND, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_loop) +{ + mng_loopp pLOOP; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + mng_uint8p pTemp1; + mng_uint32p pTemp2; + mng_uint32 iX; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_LOOP, MNG_LC_START); +#endif + + pLOOP = (mng_loopp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 5; + /* fill the output buffer */ + *pRawdata = pLOOP->iLevel; + mng_put_uint32 (pRawdata+1, pLOOP->iRepeat); + + if (pLOOP->iTermination) + { + iRawlen++; + *(pRawdata+5) = pLOOP->iTermination; + + if ((pLOOP->iCount) || + (pLOOP->iItermin != 1) || (pLOOP->iItermax != 0x7FFFFFFFL)) + { + iRawlen += 8; + + mng_put_uint32 (pRawdata+6, pLOOP->iItermin); + mng_put_uint32 (pRawdata+10, pLOOP->iItermax); + +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + if (pLOOP->iCount) + { + iRawlen += pLOOP->iCount * 4; + + pTemp1 = pRawdata+14; + pTemp2 = pLOOP->pSignals; + + for (iX = 0; iX < pLOOP->iCount; iX++) + { + mng_put_uint32 (pTemp1, *pTemp2); + + pTemp1 += 4; + pTemp2++; + } + } +#endif + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pLOOP->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_LOOP, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_endl) +{ + mng_endlp pENDL; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ENDL, MNG_LC_START); +#endif + + pENDL = (mng_endlp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 1; + + *pRawdata = pENDL->iLevel; /* fill the output buffer */ + /* and write it */ + iRetcode = write_raw_chunk (pData, pENDL->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ENDL, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_defi) +{ + mng_defip pDEFI; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DEFI, MNG_LC_START); +#endif + + pDEFI = (mng_defip)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 2; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pDEFI->iObjectid); + + if ((pDEFI->iDonotshow) || (pDEFI->iConcrete) || (pDEFI->bHasloca) || (pDEFI->bHasclip)) + { + iRawlen++; + *(pRawdata+2) = pDEFI->iDonotshow; + + if ((pDEFI->iConcrete) || (pDEFI->bHasloca) || (pDEFI->bHasclip)) + { + iRawlen++; + *(pRawdata+3) = pDEFI->iConcrete; + + if ((pDEFI->bHasloca) || (pDEFI->bHasclip)) + { + iRawlen += 8; + + mng_put_uint32 (pRawdata+4, pDEFI->iXlocation); + mng_put_uint32 (pRawdata+8, pDEFI->iYlocation); + + if (pDEFI->bHasclip) + { + iRawlen += 16; + + mng_put_uint32 (pRawdata+12, pDEFI->iLeftcb); + mng_put_uint32 (pRawdata+16, pDEFI->iRightcb); + mng_put_uint32 (pRawdata+20, pDEFI->iTopcb); + mng_put_uint32 (pRawdata+24, pDEFI->iBottomcb); + } + } + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pDEFI->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DEFI, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_basi) +{ + mng_basip pBASI; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_bool bOpaque; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_BASI, MNG_LC_START); +#endif + + pBASI = (mng_basip)pChunk; /* address the proper chunk */ + +#ifndef MNG_NO_16BIT_SUPPORT + if (pBASI->iBitdepth <= 8) /* determine opacity alpha-field */ +#endif + bOpaque = (mng_bool)(pBASI->iAlpha == 0xFF); +#ifndef MNG_NO_16BIT_SUPPORT + else + bOpaque = (mng_bool)(pBASI->iAlpha == 0xFFFF); +#endif + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 13; + /* fill the output buffer */ + mng_put_uint32 (pRawdata, pBASI->iWidth); + mng_put_uint32 (pRawdata+4, pBASI->iHeight); + + *(pRawdata+8) = pBASI->iBitdepth; + *(pRawdata+9) = pBASI->iColortype; + *(pRawdata+10) = pBASI->iCompression; + *(pRawdata+11) = pBASI->iFilter; + *(pRawdata+12) = pBASI->iInterlace; + + if ((pBASI->iRed) || (pBASI->iGreen) || (pBASI->iBlue) || + (!bOpaque) || (pBASI->iViewable)) + { + iRawlen += 6; + mng_put_uint16 (pRawdata+13, pBASI->iRed); + mng_put_uint16 (pRawdata+15, pBASI->iGreen); + mng_put_uint16 (pRawdata+17, pBASI->iBlue); + + if ((!bOpaque) || (pBASI->iViewable)) + { + iRawlen += 2; + mng_put_uint16 (pRawdata+19, pBASI->iAlpha); + + if (pBASI->iViewable) + { + iRawlen++; + *(pRawdata+21) = pBASI->iViewable; + } + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pBASI->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_BASI, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_clon) +{ + mng_clonp pCLON; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_CLON, MNG_LC_START); +#endif + + pCLON = (mng_clonp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 4; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pCLON->iSourceid); + mng_put_uint16 (pRawdata+2, pCLON->iCloneid); + + if ((pCLON->iClonetype) || (pCLON->iDonotshow) || (pCLON->iConcrete) || (pCLON->bHasloca)) + { + iRawlen++; + *(pRawdata+4) = pCLON->iClonetype; + + if ((pCLON->iDonotshow) || (pCLON->iConcrete) || (pCLON->bHasloca)) + { + iRawlen++; + *(pRawdata+5) = pCLON->iDonotshow; + + if ((pCLON->iConcrete) || (pCLON->bHasloca)) + { + iRawlen++; + *(pRawdata+6) = pCLON->iConcrete; + + if (pCLON->bHasloca) + { + iRawlen += 9; + *(pRawdata+7) = pCLON->iLocationtype; + mng_put_int32 (pRawdata+8, pCLON->iLocationx); + mng_put_int32 (pRawdata+12, pCLON->iLocationy); + } + } + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pCLON->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_CLON, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +WRITE_CHUNK (mng_write_past) +{ + mng_pastp pPAST; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_past_sourcep pSource; + mng_uint32 iX; + mng_uint8p pTemp; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PAST, MNG_LC_START); +#endif + + pPAST = (mng_pastp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 11 + (30 * pPAST->iCount); + /* requires large buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_ALLOC (pData, pRawdata, iRawlen); + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pPAST->iDestid); + + *(pRawdata+2) = pPAST->iTargettype; + + mng_put_int32 (pRawdata+3, pPAST->iTargetx); + mng_put_int32 (pRawdata+7, pPAST->iTargety); + + pTemp = pRawdata+11; + pSource = pPAST->pSources; + + for (iX = 0; iX < pPAST->iCount; iX++) + { + mng_put_uint16 (pTemp, pSource->iSourceid); + + *(pTemp+2) = pSource->iComposition; + *(pTemp+3) = pSource->iOrientation; + *(pTemp+4) = pSource->iOffsettype; + + mng_put_int32 (pTemp+5, pSource->iOffsetx); + mng_put_int32 (pTemp+9, pSource->iOffsety); + + *(pTemp+13) = pSource->iBoundarytype; + + mng_put_int32 (pTemp+14, pSource->iBoundaryl); + mng_put_int32 (pTemp+18, pSource->iBoundaryr); + mng_put_int32 (pTemp+22, pSource->iBoundaryt); + mng_put_int32 (pTemp+26, pSource->iBoundaryb); + + pSource++; + pTemp += 30; + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pPAST->sHeader.iChunkname, + iRawlen, pRawdata); + /* free temporary buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_FREEX (pData, pRawdata, iRawlen); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PAST, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_disc) +{ + mng_discp pDISC; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint32 iX; + mng_uint8p pTemp1; + mng_uint16p pTemp2; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DISC, MNG_LC_START); +#endif + + pDISC = (mng_discp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pDISC->iCount << 1; + + pTemp1 = pRawdata; /* fill the output buffer */ + pTemp2 = pDISC->pObjectids; + + for (iX = 0; iX < pDISC->iCount; iX++) + { + mng_put_uint16 (pTemp1, *pTemp2); + + pTemp2++; + pTemp1 += 2; + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pDISC->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DISC, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_back) +{ + mng_backp pBACK; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_BACK, MNG_LC_START); +#endif + + pBACK = (mng_backp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 6; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pBACK->iRed); + mng_put_uint16 (pRawdata+2, pBACK->iGreen); + mng_put_uint16 (pRawdata+4, pBACK->iBlue); + + if ((pBACK->iMandatory) || (pBACK->iImageid) || (pBACK->iTile)) + { + iRawlen++; + *(pRawdata+6) = pBACK->iMandatory; + + if ((pBACK->iImageid) || (pBACK->iTile)) + { + iRawlen += 2; + mng_put_uint16 (pRawdata+7, pBACK->iImageid); + + if (pBACK->iTile) + { + iRawlen++; + *(pRawdata+9) = pBACK->iTile; + } + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pBACK->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_BACK, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_fram) +{ + mng_framp pFRAM; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_uint32p pTemp2; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_FRAM, MNG_LC_START); +#endif + + pFRAM = (mng_framp)pChunk; /* address the proper chunk */ + + if (pFRAM->bEmpty) /* empty ? */ + iRetcode = write_raw_chunk (pData, pFRAM->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 1; + /* fill the output buffer */ + *pRawdata = pFRAM->iMode; + + if ((pFRAM->iNamesize ) || + (pFRAM->iChangedelay ) || (pFRAM->iChangetimeout) || + (pFRAM->iChangeclipping) || (pFRAM->iChangesyncid ) ) + { + if (pFRAM->iNamesize) + MNG_COPY (pRawdata+1, pFRAM->zName, pFRAM->iNamesize); + + iRawlen += pFRAM->iNamesize; + pTemp = pRawdata + pFRAM->iNamesize + 1; + + if ((pFRAM->iChangedelay ) || (pFRAM->iChangetimeout) || + (pFRAM->iChangeclipping) || (pFRAM->iChangesyncid ) ) + { + *pTemp = 0; + *(pTemp+1) = pFRAM->iChangedelay; + *(pTemp+2) = pFRAM->iChangetimeout; + *(pTemp+3) = pFRAM->iChangeclipping; + *(pTemp+4) = pFRAM->iChangesyncid; + + iRawlen += 5; + pTemp += 5; + + if (pFRAM->iChangedelay) + { + mng_put_uint32 (pTemp, pFRAM->iDelay); + iRawlen += 4; + pTemp += 4; + } + + if (pFRAM->iChangetimeout) + { + mng_put_uint32 (pTemp, pFRAM->iTimeout); + iRawlen += 4; + pTemp += 4; + } + + if (pFRAM->iChangeclipping) + { + *pTemp = pFRAM->iBoundarytype; + + mng_put_uint32 (pTemp+1, pFRAM->iBoundaryl); + mng_put_uint32 (pTemp+5, pFRAM->iBoundaryr); + mng_put_uint32 (pTemp+9, pFRAM->iBoundaryt); + mng_put_uint32 (pTemp+13, pFRAM->iBoundaryb); + + iRawlen += 17; + pTemp += 17; + } + + if (pFRAM->iChangesyncid) + { + iRawlen += pFRAM->iCount * 4; + pTemp2 = pFRAM->pSyncids; + + for (iX = 0; iX < pFRAM->iCount; iX++) + { + mng_put_uint32 (pTemp, *pTemp2); + + pTemp2++; + pTemp += 4; + } + } + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pFRAM->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_FRAM, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_move) +{ + mng_movep pMOVE; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MOVE, MNG_LC_START); +#endif + + pMOVE = (mng_movep)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 13; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pMOVE->iFirstid); + mng_put_uint16 (pRawdata+2, pMOVE->iLastid); + + *(pRawdata+4) = pMOVE->iMovetype; + + mng_put_int32 (pRawdata+5, pMOVE->iMovex); + mng_put_int32 (pRawdata+9, pMOVE->iMovey); + /* and write it */ + iRetcode = write_raw_chunk (pData, pMOVE->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MOVE, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_clip) +{ + mng_clipp pCLIP; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_CLIP, MNG_LC_START); +#endif + + pCLIP = (mng_clipp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 21; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pCLIP->iFirstid); + mng_put_uint16 (pRawdata+2, pCLIP->iLastid); + + *(pRawdata+4) = pCLIP->iCliptype; + + mng_put_int32 (pRawdata+5, pCLIP->iClipl); + mng_put_int32 (pRawdata+9, pCLIP->iClipr); + mng_put_int32 (pRawdata+13, pCLIP->iClipt); + mng_put_int32 (pRawdata+17, pCLIP->iClipb); + /* and write it */ + iRetcode = write_raw_chunk (pData, pCLIP->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_CLIP, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_show) +{ + mng_showp pSHOW; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SHOW, MNG_LC_START); +#endif + + pSHOW = (mng_showp)pChunk; /* address the proper chunk */ + + if (pSHOW->bEmpty) /* empty ? */ + iRetcode = write_raw_chunk (pData, pSHOW->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 2; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pSHOW->iFirstid); + + if ((pSHOW->iLastid != pSHOW->iFirstid) || (pSHOW->iMode)) + { + iRawlen += 2; + mng_put_uint16 (pRawdata+2, pSHOW->iLastid); + + if (pSHOW->iMode) + { + iRawlen++; + *(pRawdata+4) = pSHOW->iMode; + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pSHOW->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SHOW, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_term) +{ + mng_termp pTERM; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_TERM, MNG_LC_START); +#endif + + pTERM = (mng_termp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 1; + + *pRawdata = pTERM->iTermaction; /* fill the output buffer */ + + if (pTERM->iTermaction == 3) + { + iRawlen = 10; + *(pRawdata+1) = pTERM->iIteraction; + + mng_put_uint32 (pRawdata+2, pTERM->iDelay); + mng_put_uint32 (pRawdata+6, pTERM->iItermax); + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pTERM->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_TERM, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +WRITE_CHUNK (mng_write_save) +{ + mng_savep pSAVE; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_save_entryp pEntry; + mng_uint32 iEntrysize; + mng_uint8p pTemp; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SAVE, MNG_LC_START); +#endif + + pSAVE = (mng_savep)pChunk; /* address the proper chunk */ + + if (pSAVE->bEmpty) /* empty ? */ + iRetcode = write_raw_chunk (pData, pSAVE->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 1; + + *pRawdata = pSAVE->iOffsettype; /* fill the output buffer */ + + if (pSAVE->iOffsettype == 16) + iEntrysize = 25; + else + iEntrysize = 17; + + pTemp = pRawdata+1; + pEntry = pSAVE->pEntries; + + for (iX = 0; iX < pSAVE->iCount; iX++) + { + if (iX) /* put separator null-byte, except the first */ + { + *pTemp = 0; + pTemp++; + iRawlen++; + } + + iRawlen += iEntrysize + pEntry->iNamesize; + *pTemp = pEntry->iEntrytype; + + if (pSAVE->iOffsettype == 16) + { + mng_put_uint32 (pTemp+1, pEntry->iOffset[0]); + mng_put_uint32 (pTemp+5, pEntry->iOffset[1]); + mng_put_uint32 (pTemp+9, pEntry->iStarttime[0]); + mng_put_uint32 (pTemp+13, pEntry->iStarttime[1]); + mng_put_uint32 (pTemp+17, pEntry->iLayernr); + mng_put_uint32 (pTemp+21, pEntry->iFramenr); + + pTemp += 25; + } + else + { + mng_put_uint32 (pTemp+1, pEntry->iOffset[1]); + mng_put_uint32 (pTemp+5, pEntry->iStarttime[1]); + mng_put_uint32 (pTemp+9, pEntry->iLayernr); + mng_put_uint32 (pTemp+13, pEntry->iFramenr); + + pTemp += 17; + } + + if (pEntry->iNamesize) + { + MNG_COPY (pTemp, pEntry->zName, pEntry->iNamesize); + pTemp += pEntry->iNamesize; + } + + pEntry++; + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pSAVE->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SAVE, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +WRITE_CHUNK (mng_write_seek) +{ + mng_seekp pSEEK; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SEEK, MNG_LC_START); +#endif + + pSEEK = (mng_seekp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pSEEK->iNamesize; + + if (iRawlen) /* fill the output buffer */ + MNG_COPY (pRawdata, pSEEK->zName, iRawlen); + /* and write it */ + iRetcode = write_raw_chunk (pData, pSEEK->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_SEEK, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +WRITE_CHUNK (mng_write_expi) +{ + mng_expip pEXPI; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_EXPI, MNG_LC_START); +#endif + + pEXPI = (mng_expip)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 2 + pEXPI->iNamesize; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pEXPI->iSnapshotid); + + if (pEXPI->iNamesize) + MNG_COPY (pRawdata+2, pEXPI->zName, pEXPI->iNamesize); + /* and write it */ + iRetcode = write_raw_chunk (pData, pEXPI->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_EXPI, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_fPRI +WRITE_CHUNK (mng_write_fpri) +{ + mng_fprip pFPRI; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_FPRI, MNG_LC_START); +#endif + + pFPRI = (mng_fprip)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 2; + + *pRawdata = pFPRI->iDeltatype; /* fill the output buffer */ + *(pRawdata+1) = pFPRI->iPriority; + /* and write it */ + iRetcode = write_raw_chunk (pData, pFPRI->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_FPRI, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +WRITE_CHUNK (mng_write_need) +{ + mng_needp pNEED; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_NEED, MNG_LC_START); +#endif + + pNEED = (mng_needp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pNEED->iKeywordssize; + /* fill the output buffer */ + if (pNEED->iKeywordssize) + MNG_COPY (pRawdata, pNEED->zKeywords, pNEED->iKeywordssize); + /* and write it */ + iRetcode = write_raw_chunk (pData, pNEED->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_NEED, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYg +WRITE_CHUNK (mng_write_phyg) +{ + mng_phygp pPHYG; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PHYG, MNG_LC_START); +#endif + + pPHYG = (mng_phygp)pChunk; /* address the proper chunk */ + + if (pPHYG->bEmpty) /* write empty ? */ + iRetcode = write_raw_chunk (pData, pPHYG->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 9; + /* fill the output buffer */ + mng_put_uint32 (pRawdata, pPHYG->iSizex); + mng_put_uint32 (pRawdata+4, pPHYG->iSizey); + + *(pRawdata+8) = pPHYG->iUnit; + /* and write it */ + iRetcode = write_raw_chunk (pData, pPHYG->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PHYG, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +/* B004 */ +#ifdef MNG_INCLUDE_JNG +/* B004 */ +WRITE_CHUNK (mng_write_jhdr) +{ + mng_jhdrp pJHDR; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_JHDR, MNG_LC_START); +#endif + + pJHDR = (mng_jhdrp)pChunk; /* address the proper chunk */ + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 16; + /* fill the output buffer */ + mng_put_uint32 (pRawdata, pJHDR->iWidth); + mng_put_uint32 (pRawdata+4, pJHDR->iHeight); + + *(pRawdata+8) = pJHDR->iColortype; + *(pRawdata+9) = pJHDR->iImagesampledepth; + *(pRawdata+10) = pJHDR->iImagecompression; + *(pRawdata+11) = pJHDR->iImageinterlace; + *(pRawdata+12) = pJHDR->iAlphasampledepth; + *(pRawdata+13) = pJHDR->iAlphacompression; + *(pRawdata+14) = pJHDR->iAlphafilter; + *(pRawdata+15) = pJHDR->iAlphainterlace; + /* and write it */ + iRetcode = write_raw_chunk (pData, pJHDR->sHeader.iChunkname, iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_JHDR, MNG_LC_END); +#endif + + return iRetcode; +} +#else +#define write_jhdr 0 +/* B004 */ +#endif /* MNG_INCLUDE_JNG */ +/* B004 */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +WRITE_CHUNK (mng_write_jdaa) +{ + mng_jdatp pJDAA; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_JDAA, MNG_LC_START); +#endif + + pJDAA = (mng_jdaap)pChunk; /* address the proper chunk */ + + if (pJDAA->bEmpty) /* and write it */ + iRetcode = write_raw_chunk (pData, pJDAA->sHeader.iChunkname, 0, 0); + else + iRetcode = write_raw_chunk (pData, pJDAA->sHeader.iChunkname, + pJDAA->iDatasize, pJDAA->pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_JDAA, MNG_LC_END); +#endif + + return iRetcode; +} +#else +#define write_jdaa 0 +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +/* B004 */ +#ifdef MNG_INCLUDE_JNG +/* B004 */ +WRITE_CHUNK (mng_write_jdat) +{ + mng_jdatp pJDAT; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_JDAT, MNG_LC_START); +#endif + + pJDAT = (mng_jdatp)pChunk; /* address the proper chunk */ + + if (pJDAT->bEmpty) /* and write it */ + iRetcode = write_raw_chunk (pData, pJDAT->sHeader.iChunkname, 0, 0); + else + iRetcode = write_raw_chunk (pData, pJDAT->sHeader.iChunkname, + pJDAT->iDatasize, pJDAT->pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_JDAT, MNG_LC_END); +#endif + + return iRetcode; +} +#else +#define write_jdat 0 +/* B004 */ +#endif /* MNG_INCLUDE_JNG */ +/* B004 */ + +/* ************************************************************************** */ + +/* B004 */ +#ifdef MNG_INCLUDE_JNG +/* B004 */ +WRITE_CHUNK (mng_write_jsep) +{ + mng_jsepp pJSEP; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_JSEP, MNG_LC_START); +#endif + + pJSEP = (mng_jsepp)pChunk; /* address the proper chunk */ + /* and write it */ + iRetcode = write_raw_chunk (pData, pJSEP->sHeader.iChunkname, 0, 0); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_JSEP, MNG_LC_END); +#endif + + return iRetcode; +} +#else +#define write_jsep 0 +/* B004 */ +#endif /* MNG_INCLUDE_JNG */ +/* B004 */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +WRITE_CHUNK (mng_write_dhdr) +{ + mng_dhdrp pDHDR; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DHDR, MNG_LC_START); +#endif + + pDHDR = (mng_dhdrp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 4; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pDHDR->iObjectid); + + *(pRawdata+2) = pDHDR->iImagetype; + *(pRawdata+3) = pDHDR->iDeltatype; + + if (pDHDR->iDeltatype != 7) + { + iRawlen += 8; + mng_put_uint32 (pRawdata+4, pDHDR->iBlockwidth); + mng_put_uint32 (pRawdata+8, pDHDR->iBlockheight); + + if (pDHDR->iDeltatype != 0) + { + iRawlen += 8; + mng_put_uint32 (pRawdata+12, pDHDR->iBlockx); + mng_put_uint32 (pRawdata+16, pDHDR->iBlocky); + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pDHDR->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DHDR, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +WRITE_CHUNK (mng_write_prom) +{ + mng_promp pPROM; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PROM, MNG_LC_START); +#endif + + pPROM = (mng_promp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 3; + + *pRawdata = pPROM->iColortype; /* fill the output buffer */ + *(pRawdata+1) = pPROM->iSampledepth; + *(pRawdata+2) = pPROM->iFilltype; + /* and write it */ + iRetcode = write_raw_chunk (pData, pPROM->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PROM, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +WRITE_CHUNK (mng_write_ipng) +{ + mng_ipngp pIPNG; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IPNG, MNG_LC_START); +#endif + + pIPNG = (mng_ipngp)pChunk; /* address the proper chunk */ + /* and write it */ + iRetcode = write_raw_chunk (pData, pIPNG->sHeader.iChunkname, 0, 0); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IPNG, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +WRITE_CHUNK (mng_write_pplt) +{ + mng_ppltp pPPLT; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_pplt_entryp pEntry; + mng_uint8p pTemp; + mng_uint32 iX; + mng_bool bHasgroup; + mng_uint8p pLastid = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PPLT, MNG_LC_START); +#endif + + pPPLT = (mng_ppltp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 1; + + *pRawdata = pPPLT->iDeltatype; /* fill the output buffer */ + + pTemp = pRawdata+1; + bHasgroup = MNG_FALSE; + + for (iX = 0; iX < pPPLT->iCount; iX++) + { + pEntry = &pPPLT->aEntries[iX]; + + if (pEntry->bUsed) /* valid entry ? */ + { + if (!bHasgroup) /* start a new group ? */ + { + bHasgroup = MNG_TRUE; + pLastid = pTemp+1; + + *pTemp = (mng_uint8)iX; + *(pTemp+1) = 0; + + pTemp += 2; + iRawlen += 2; + } + + switch (pPPLT->iDeltatype) /* add group-entry depending on type */ + { + case 0: ; + case 1: { + *pTemp = pEntry->iRed; + *(pTemp+1) = pEntry->iGreen; + *(pTemp+2) = pEntry->iBlue; + + pTemp += 3; + iRawlen += 3; + + break; + } + + case 2: ; + case 3: { + *pTemp = pEntry->iAlpha; + + pTemp++; + iRawlen++; + + break; + } + + case 4: ; + case 5: { + *pTemp = pEntry->iRed; + *(pTemp+1) = pEntry->iGreen; + *(pTemp+2) = pEntry->iBlue; + *(pTemp+3) = pEntry->iAlpha; + + pTemp += 4; + iRawlen += 4; + + break; + } + + } + } + else + { + if (bHasgroup) /* finish off a group ? */ + *pLastid = (mng_uint8)(iX-1); + + bHasgroup = MNG_FALSE; + } + } + + if (bHasgroup) /* last group unfinished ? */ + *pLastid = (mng_uint8)(pPPLT->iCount-1); + /* write the output buffer */ + iRetcode = write_raw_chunk (pData, pPPLT->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_PPLT, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +WRITE_CHUNK (mng_write_ijng) +{ + mng_ijngp pIJNG; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IJNG, MNG_LC_START); +#endif + + pIJNG = (mng_ijngp)pChunk; /* address the proper chunk */ + /* and write it */ + iRetcode = write_raw_chunk (pData, pIJNG->sHeader.iChunkname, 0, 0); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_IJNG, MNG_LC_END); +#endif + + return iRetcode; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +WRITE_CHUNK (mng_write_drop) +{ + mng_dropp pDROP; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint32 iX; + mng_uint8p pTemp1; + mng_chunkidp pTemp2; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DROP, MNG_LC_START); +#endif + + pDROP = (mng_dropp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pDROP->iCount << 2; + + pTemp1 = pRawdata; /* fill the output buffer */ + pTemp2 = pDROP->pChunknames; + + for (iX = 0; iX < pDROP->iCount; iX++) + { + mng_put_uint32 (pTemp1, (mng_uint32)*pTemp2); + + pTemp2++; + pTemp1 += 4; + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pDROP->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DROP, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +WRITE_CHUNK (mng_write_dbyk) +{ + mng_dbykp pDBYK; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DBYK, MNG_LC_START); +#endif + + pDBYK = (mng_dbykp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 5 + pDBYK->iKeywordssize; + /* fill the output buffer */ + mng_put_uint32 (pRawdata, pDBYK->iChunkname); + *(pRawdata+4) = pDBYK->iPolarity; + + if (pDBYK->iKeywordssize) + MNG_COPY (pRawdata+5, pDBYK->zKeywords, pDBYK->iKeywordssize); + /* and write it */ + iRetcode = write_raw_chunk (pData, pDBYK->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_DBYK, MNG_LC_END); +#endif + + return iRetcode; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +WRITE_CHUNK (mng_write_ordr) +{ + mng_ordrp pORDR; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pTemp; + mng_ordr_entryp pEntry; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ORDR, MNG_LC_START); +#endif + + pORDR = (mng_ordrp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = pORDR->iCount * 5; + + pTemp = pRawdata; /* fill the output buffer */ + pEntry = pORDR->pEntries; + + for (iX = 0; iX < pORDR->iCount; iX++) + { + mng_put_uint32 (pTemp, pEntry->iChunkname); + *(pTemp+4) = pEntry->iOrdertype; + pTemp += 5; + pEntry++; + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pORDR->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_ORDR, MNG_LC_END); +#endif + + return iRetcode; +} +#endif +#endif + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_magn) +{ + mng_magnp pMAGN; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MAGN, MNG_LC_START); +#endif + + pMAGN = (mng_magnp)pChunk; /* address the proper chunk */ + + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 18; + /* fill the output buffer */ + mng_put_uint16 (pRawdata, pMAGN->iFirstid); + mng_put_uint16 (pRawdata+2, pMAGN->iLastid); + *(pRawdata+4) = pMAGN->iMethodX; + mng_put_uint16 (pRawdata+5, pMAGN->iMX); + mng_put_uint16 (pRawdata+7, pMAGN->iMY); + mng_put_uint16 (pRawdata+9, pMAGN->iML); + mng_put_uint16 (pRawdata+11, pMAGN->iMR); + mng_put_uint16 (pRawdata+13, pMAGN->iMT); + mng_put_uint16 (pRawdata+15, pMAGN->iMB); + *(pRawdata+17) = pMAGN->iMethodY; + /* optimize length */ + if (pMAGN->iMethodY == pMAGN->iMethodX) + { + iRawlen--; + + if (pMAGN->iMB == pMAGN->iMY) + { + iRawlen -= 2; + + if (pMAGN->iMT == pMAGN->iMY) + { + iRawlen -= 2; + + if (pMAGN->iMR == pMAGN->iMX) + { + iRawlen -= 2; + + if (pMAGN->iML == pMAGN->iMX) + { + iRawlen -= 2; + + if (pMAGN->iMY == pMAGN->iMX) + { + iRawlen -= 2; + + if (pMAGN->iMX == 1) + { + iRawlen -= 2; + + if (pMAGN->iMethodX == 0) + { + iRawlen--; + + if (pMAGN->iLastid == pMAGN->iFirstid) + { + iRawlen -= 2; + + if (pMAGN->iFirstid == 0) + iRawlen = 0; + + } + } + } + } + } + } + } + } + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pMAGN->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MAGN, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +WRITE_CHUNK (mng_write_mpng) +{ + mng_mpngp pMPNG; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_uint8p pBuf = 0; + mng_uint32 iBuflen; + mng_uint32 iReallen; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MPNG, MNG_LC_START); +#endif + + pMPNG = (mng_mpngp)pChunk; /* address the proper chunk */ + /* compress the frame structures */ + iRetcode = deflate_buffer (pData, (mng_uint8p)pMPNG->pFrames, pMPNG->iFramessize, + &pBuf, &iBuflen, &iReallen); + + if (!iRetcode) /* all ok ? */ + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 15 + iReallen; + /* requires large buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_ALLOC (pData, pRawdata, iRawlen); + /* fill the buffer */ + mng_put_uint32 (pRawdata, pMPNG->iFramewidth); + mng_put_uint32 (pRawdata+4, pMPNG->iFrameheight); + mng_put_uint16 (pRawdata+8, pMPNG->iNumplays); + mng_put_uint16 (pRawdata+10, pMPNG->iTickspersec); + *(pRawdata+12) = pMPNG->iCompressionmethod; + + if (iReallen) + MNG_COPY (pRawdata+13, pBuf, iReallen); + /* and write it */ + iRetcode = write_raw_chunk (pData, pMPNG->sHeader.iChunkname, + iRawlen, pRawdata); + /* drop the temp buffer ? */ + if (iRawlen > pData->iWritebufsize) + MNG_FREEX (pData, pRawdata, iRawlen); + } + + MNG_FREEX (pData, pBuf, iBuflen); /* always drop the compression buffer */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_MPNG, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +WRITE_CHUNK (mng_write_ahdr) +{ + mng_ahdrp pAHDR; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_AHDR, MNG_LC_START); +#endif + + pAHDR = (mng_ahdrp)pChunk; /* address the proper chunk */ + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 22; + /* fill the buffer */ + mng_put_uint32 (pRawdata, pAHDR->iNumframes); + mng_put_uint32 (pRawdata+4, pAHDR->iTickspersec); + mng_put_uint32 (pRawdata+8, pAHDR->iNumplays); + mng_put_uint32 (pRawdata+12, pAHDR->iTilewidth); + mng_put_uint32 (pRawdata+16, pAHDR->iTileheight); + *(pRawdata+20) = pAHDR->iInterlace; + *(pRawdata+21) = pAHDR->iStillused; + /* and write it */ + iRetcode = write_raw_chunk (pData, pAHDR->sHeader.iChunkname, + iRawlen, pRawdata); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_AHDR, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +WRITE_CHUNK (mng_write_adat) +{ + + /* TODO: something */ + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +WRITE_CHUNK (mng_write_evnt) +{ + mng_evntp pEVNT; + mng_uint8p pRawdata; + mng_uint32 iRawlen; + mng_retcode iRetcode; + mng_evnt_entryp pEntry; + mng_uint8p pTemp; + mng_uint32 iX; + mng_uint32 iNamesize; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_EVNT, MNG_LC_START); +#endif + + pEVNT = (mng_evntp)pChunk; /* address the proper chunk */ + + if (!pEVNT->iCount) /* empty ? */ + iRetcode = write_raw_chunk (pData, pEVNT->sHeader.iChunkname, 0, 0); + else + { + pRawdata = pData->pWritebuf+8; /* init output buffer & size */ + iRawlen = 0; + pTemp = pRawdata; + pEntry = pEVNT->pEntries; + + for (iX = 0; iX < pEVNT->iCount; iX++) + { + if (iX) /* put separator null-byte, except the first */ + { + *pTemp = 0; + pTemp++; + iRawlen++; + } + + *pTemp = pEntry->iEventtype; + *(pTemp+1) = pEntry->iMasktype; + pTemp += 2; + iRawlen += 2; + + switch (pEntry->iMasktype) + { + case 1 : + { + mng_put_int32 (pTemp, pEntry->iLeft); + mng_put_int32 (pTemp+4, pEntry->iRight); + mng_put_int32 (pTemp+8, pEntry->iTop); + mng_put_int32 (pTemp+12, pEntry->iBottom); + pTemp += 16; + iRawlen += 16; + break; + } + case 2 : + { + mng_put_uint16 (pTemp, pEntry->iObjectid); + pTemp += 2; + iRawlen += 2; + break; + } + case 3 : + { + mng_put_uint16 (pTemp, pEntry->iObjectid); + *(pTemp+2) = pEntry->iIndex; + pTemp += 3; + iRawlen += 3; + break; + } + case 4 : + { + mng_put_int32 (pTemp, pEntry->iLeft); + mng_put_int32 (pTemp+4, pEntry->iRight); + mng_put_int32 (pTemp+8, pEntry->iTop); + mng_put_int32 (pTemp+12, pEntry->iBottom); + mng_put_uint16 (pTemp+16, pEntry->iObjectid); + pTemp += 18; + iRawlen += 18; + break; + } + case 5 : + { + mng_put_int32 (pTemp, pEntry->iLeft); + mng_put_int32 (pTemp+4, pEntry->iRight); + mng_put_int32 (pTemp+8, pEntry->iTop); + mng_put_int32 (pTemp+12, pEntry->iBottom); + mng_put_uint16 (pTemp+16, pEntry->iObjectid); + *(pTemp+18) = pEntry->iIndex; + pTemp += 19; + iRawlen += 19; + break; + } + } + + iNamesize = pEntry->iSegmentnamesize; + + if (iNamesize) + { + MNG_COPY (pTemp, pEntry->zSegmentname, iNamesize); + pTemp += iNamesize; + iRawlen += iNamesize; + } + + pEntry++; + } + /* and write it */ + iRetcode = write_raw_chunk (pData, pEVNT->sHeader.iChunkname, + iRawlen, pRawdata); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_EVNT, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +WRITE_CHUNK (mng_write_unknown) +{ + mng_unknown_chunkp pUnknown; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_UNKNOWN, MNG_LC_START); +#endif + /* address the proper chunk */ + pUnknown = (mng_unknown_chunkp)pChunk; + /* and write it */ + iRetcode = write_raw_chunk (pData, pUnknown->sHeader.iChunkname, + pUnknown->iDatasize, pUnknown->pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_UNKNOWN, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_chunk_io.h b/src/3rdparty/libmng/libmng_chunk_io.h new file mode 100644 index 0000000000..f8505baece --- /dev/null +++ b/src/3rdparty/libmng/libmng_chunk_io.h @@ -0,0 +1,415 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_chunk_io.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.109 * */ +/* * * */ +/* * purpose : Chunk I/O routines (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the chunk input/output routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/04/2000 - G.Juyn * */ +/* * - changed CRC initialization to use dynamic structure * */ +/* * (wasn't thread-safe the old way !) * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed write routines definition * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added support for JDAA * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added SKIP_CHUNK and NO_DELTA_PNG support * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * * */ +/* * 1.0.7 - 03/24/2004 - G.R-P * */ +/* * - fixed SKIPCHUNK_itXT and SKIPCHUNK_ztXT typos * */ +/* * * */ +/* * 1.0.9 - 12/07/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_chunk_io_h_ +#define _libmng_chunk_io_h_ + +/* ************************************************************************** */ + +mng_uint32 mng_crc (mng_datap pData, + mng_uint8p buf, + mng_int32 len); + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_READ_PROCS + +/* ************************************************************************** */ + +mng_retcode mng_inflate_buffer (mng_datap pData, + mng_uint8p pInbuf, + mng_uint32 iInsize, + mng_uint8p *pOutbuf, + mng_uint32 *iOutsize, + mng_uint32 *iRealsize); + +/* ************************************************************************** */ + +#define READ_CHUNK(n) mng_retcode n (mng_datap pData, \ + mng_chunkp pHeader, \ + mng_uint32 iRawlen, \ + mng_uint8p pRawdata, \ + mng_chunkp* ppChunk) + +#ifdef MNG_OPTIMIZE_CHUNKREADER +READ_CHUNK (mng_read_general) ; +#endif + +READ_CHUNK (mng_read_ihdr) ; +READ_CHUNK (mng_read_plte) ; +READ_CHUNK (mng_read_idat) ; +READ_CHUNK (mng_read_iend) ; +READ_CHUNK (mng_read_trns) ; +READ_CHUNK (mng_read_gama) ; +READ_CHUNK (mng_read_chrm) ; +READ_CHUNK (mng_read_srgb) ; +#ifndef MNG_SKIPCHUNK_iCCP +READ_CHUNK (mng_read_iccp) ; +#endif +#ifndef MNG_SKIPCHUNK_tEXt +READ_CHUNK (mng_read_text) ; +#endif +#ifndef MNG_SKIPCHUNK_zTXt +READ_CHUNK (mng_read_ztxt) ; +#endif +#ifndef MNG_SKIPCHUNK_iTXt +READ_CHUNK (mng_read_itxt) ; +#endif +#ifndef MNG_SKIPCHUNK_bKGD +READ_CHUNK (mng_read_bkgd) ; +#endif +#ifndef MNG_SKIPCHUNK_pHYs +READ_CHUNK (mng_read_phys) ; +#endif +#ifndef MNG_SKIPCHUNK_sBIT +READ_CHUNK (mng_read_sbit) ; +#endif +#ifndef MNG_SKIPCHUNK_sPLT +READ_CHUNK (mng_read_splt) ; +#endif +#ifndef MNG_SKIPCHUNK_hIST +READ_CHUNK (mng_read_hist) ; +#endif +#ifndef MNG_SKIPCHUNK_tIME +READ_CHUNK (mng_read_time) ; +#endif +READ_CHUNK (mng_read_mhdr) ; +READ_CHUNK (mng_read_mend) ; +READ_CHUNK (mng_read_loop) ; +READ_CHUNK (mng_read_endl) ; +READ_CHUNK (mng_read_defi) ; +READ_CHUNK (mng_read_basi) ; +READ_CHUNK (mng_read_clon) ; +#ifndef MNG_SKIPCHUNK_PAST +READ_CHUNK (mng_read_past) ; +#endif +READ_CHUNK (mng_read_disc) ; +READ_CHUNK (mng_read_back) ; +READ_CHUNK (mng_read_fram) ; +READ_CHUNK (mng_read_move) ; +READ_CHUNK (mng_read_clip) ; +READ_CHUNK (mng_read_show) ; +READ_CHUNK (mng_read_term) ; +READ_CHUNK (mng_read_save) ; +READ_CHUNK (mng_read_seek) ; +#ifndef MNG_SKIPCHUNK_eXPI +READ_CHUNK (mng_read_expi) ; +#endif +#ifndef MNG_SKIPCHUNK_fPRI +READ_CHUNK (mng_read_fpri) ; +#endif +#ifndef MNG_SKIPCHUNK_pHYg +READ_CHUNK (mng_read_phyg) ; +#endif +#ifdef MNG_INCLUDE_JNG +READ_CHUNK (mng_read_jhdr) ; +READ_CHUNK (mng_read_jdaa) ; +READ_CHUNK (mng_read_jdat) ; +READ_CHUNK (mng_read_jsep) ; +#endif +#ifndef MNG_NO_DELTA_PNG +READ_CHUNK (mng_read_dhdr) ; +READ_CHUNK (mng_read_prom) ; +READ_CHUNK (mng_read_ipng) ; +READ_CHUNK (mng_read_pplt) ; +#ifdef MNG_INCLUDE_JNG +READ_CHUNK (mng_read_ijng) ; +#endif +READ_CHUNK (mng_read_drop) ; +READ_CHUNK (mng_read_dbyk) ; +READ_CHUNK (mng_read_ordr) ; +#endif +READ_CHUNK (mng_read_magn) ; +#ifndef MNG_SKIPCHUNK_nEED +READ_CHUNK (mng_read_need) ; +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +READ_CHUNK (mng_read_mpng) ; +#endif +#ifndef MNG_SKIPCHUNK_evNT +READ_CHUNK (mng_read_evnt) ; +#endif +READ_CHUNK (mng_read_unknown) ; + +/* ************************************************************************** */ + +#else /* MNG_INCLUDE_READ_PROCS */ +#define mng_read_ihdr 0 +#define mng_read_plte 0 +#define mng_read_idat 0 +#define mng_read_iend 0 +#define mng_read_trns 0 +#define mng_read_gama 0 +#define mng_read_chrm 0 +#define mng_read_srgb 0 +#define mng_read_iccp 0 +#define mng_read_text 0 +#define mng_read_ztxt 0 +#define mng_read_itxt 0 +#define mng_read_bkgd 0 +#define mng_read_phys 0 +#define mng_read_sbit 0 +#define mng_read_splt 0 +#define mng_read_hist 0 +#define mng_read_time 0 +#define mng_read_mhdr 0 +#define mng_read_mend 0 +#define mng_read_loop 0 +#define mng_read_endl 0 +#define mng_read_defi 0 +#define mng_read_basi 0 +#define mng_read_clon 0 +#ifndef MNG_SKIPCHUNK_PAST +#define mng_read_past 0 +#endif +#define mng_read_disc 0 +#define mng_read_back 0 +#define mng_read_fram 0 +#define mng_read_move 0 +#define mng_read_clip 0 +#define mng_read_show 0 +#define mng_read_term 0 +#define mng_read_save 0 +#define mng_read_seek 0 +#define mng_read_expi 0 +#define mng_read_fpri 0 +#define mng_read_phyg 0 +#ifdef MNG_INCLUDE_JNG +#define mng_read_jhdr 0 +#define mng_read_jdaa 0 +#define mng_read_jdat 0 +#define mng_read_jsep 0 +#endif +#ifndef MNG_NO_DELTA_PNG +#define mng_read_dhdr 0 +#define mng_read_prom 0 +#define mng_read_ipng 0 +#define mng_read_pplt 0 +#ifdef MNG_INCLUDE_JNG +#define mng_read_ijng 0 +#endif +#define mng_read_drop 0 +#define mng_read_dbyk 0 +#define mng_read_ordr 0 +#endif +#define mng_read_magn 0 +#define mng_read_need 0 +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +#define mng_read_mpng 0 +#endif +#define mng_read_evnt 0 +#define mng_read_unknown 0 +#endif /* MNG_INCLUDE_READ_PROCS */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +#define WRITE_CHUNK(n) mng_retcode n (mng_datap pData, \ + mng_chunkp pChunk) + +WRITE_CHUNK (mng_write_ihdr) ; +WRITE_CHUNK (mng_write_plte) ; +WRITE_CHUNK (mng_write_idat) ; +WRITE_CHUNK (mng_write_iend) ; +WRITE_CHUNK (mng_write_trns) ; +WRITE_CHUNK (mng_write_gama) ; +WRITE_CHUNK (mng_write_chrm) ; +WRITE_CHUNK (mng_write_srgb) ; +WRITE_CHUNK (mng_write_iccp) ; +WRITE_CHUNK (mng_write_text) ; +WRITE_CHUNK (mng_write_ztxt) ; +WRITE_CHUNK (mng_write_itxt) ; +WRITE_CHUNK (mng_write_bkgd) ; +WRITE_CHUNK (mng_write_phys) ; +WRITE_CHUNK (mng_write_sbit) ; +WRITE_CHUNK (mng_write_splt) ; +WRITE_CHUNK (mng_write_hist) ; +WRITE_CHUNK (mng_write_time) ; +WRITE_CHUNK (mng_write_mhdr) ; +WRITE_CHUNK (mng_write_mend) ; +WRITE_CHUNK (mng_write_loop) ; +WRITE_CHUNK (mng_write_endl) ; +WRITE_CHUNK (mng_write_defi) ; +WRITE_CHUNK (mng_write_basi) ; +WRITE_CHUNK (mng_write_clon) ; +#ifndef MNG_SKIPCHUNK_PAST +WRITE_CHUNK (mng_write_past) ; +#endif +WRITE_CHUNK (mng_write_disc) ; +WRITE_CHUNK (mng_write_back) ; +WRITE_CHUNK (mng_write_fram) ; +WRITE_CHUNK (mng_write_move) ; +WRITE_CHUNK (mng_write_clip) ; +WRITE_CHUNK (mng_write_show) ; +WRITE_CHUNK (mng_write_term) ; +WRITE_CHUNK (mng_write_save) ; +WRITE_CHUNK (mng_write_seek) ; +WRITE_CHUNK (mng_write_expi) ; +WRITE_CHUNK (mng_write_fpri) ; +WRITE_CHUNK (mng_write_phyg) ; +#ifdef MNG_INCLUDE_JNG +WRITE_CHUNK (mng_write_jhdr) ; +WRITE_CHUNK (mng_write_jdaa) ; +WRITE_CHUNK (mng_write_jdat) ; +WRITE_CHUNK (mng_write_jsep) ; +#endif +#ifndef MNG_NO_DELTA_PNG +WRITE_CHUNK (mng_write_dhdr) ; +WRITE_CHUNK (mng_write_prom) ; +WRITE_CHUNK (mng_write_ipng) ; +WRITE_CHUNK (mng_write_pplt) ; +#ifdef MNG_INCLUDE_JNG +WRITE_CHUNK (mng_write_ijng) ; +#endif +WRITE_CHUNK (mng_write_drop) ; +WRITE_CHUNK (mng_write_dbyk) ; +WRITE_CHUNK (mng_write_ordr) ; +#endif +WRITE_CHUNK (mng_write_magn) ; +WRITE_CHUNK (mng_write_need) ; +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +WRITE_CHUNK (mng_write_mpng) ; +#endif +#ifdef MNG_INCLUDE_ANG_PROPOSAL +WRITE_CHUNK (mng_write_ahdr) ; +WRITE_CHUNK (mng_write_adat) ; +#endif +WRITE_CHUNK (mng_write_evnt) ; +WRITE_CHUNK (mng_write_unknown) ; + +/* ************************************************************************** */ + +#else /* MNG_INCLUDE_WRITE_PROCS */ +#define mng_write_ihdr 0 +#define mng_write_plte 0 +#define mng_write_idat 0 +#define mng_write_iend 0 +#define mng_write_trns 0 +#define mng_write_gama 0 +#define mng_write_chrm 0 +#define mng_write_srgb 0 +#define mng_write_iccp 0 +#define mng_write_text 0 +#define mng_write_ztxt 0 +#define mng_write_itxt 0 +#define mng_write_bkgd 0 +#define mng_write_phys 0 +#define mng_write_sbit 0 +#define mng_write_splt 0 +#define mng_write_hist 0 +#define mng_write_time 0 +#define mng_write_mhdr 0 +#define mng_write_mend 0 +#define mng_write_loop 0 +#define mng_write_endl 0 +#define mng_write_defi 0 +#define mng_write_basi 0 +#define mng_write_clon 0 +#ifndef MNG_SKIPCHUNK_PAST +#define mng_write_past 0 +#endif +#define mng_write_disc 0 +#define mng_write_back 0 +#define mng_write_fram 0 +#define mng_write_move 0 +#define mng_write_clip 0 +#define mng_write_show 0 +#define mng_write_term 0 +#define mng_write_save 0 +#define mng_write_seek 0 +#define mng_write_expi 0 +#define mng_write_fpri 0 +#define mng_write_phyg 0 +#ifdef MNG_INCLUDE_JNG +#define mng_write_jhdr 0 +#define mng_write_jdaa 0 +#define mng_write_jdat 0 +#define mng_write_jsep 0 +#endif +#ifndef MNG_NO_DELTA_PNG +#define mng_write_dhdr 0 +#define mng_write_prom 0 +#define mng_write_ipng 0 +#define mng_write_pplt 0 +#ifdef MNG_INCLUDE_JNG +#define mng_write_ijng 0 +#endif +#define mng_write_drop 0 +#define mng_write_dbyk 0 +#define mng_write_ordr 0 +#endif +#define mng_write_magn 0 +#define mng_write_need 0 +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +#define mng_write_mpng 0 +#endif +#ifdef MNG_INCLUDE_ANG_PROPOSAL +#define mng_write_adat 0 +#define mng_write_ahdr 0 +#endif +#define mng_write_evnt 0 +#define mng_write_unknown 0 +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +/* ************************************************************************** */ + +#endif /* _libmng_chunk_io_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_chunk_prc.c b/src/3rdparty/libmng/libmng_chunk_prc.c new file mode 100644 index 0000000000..e633e7e260 --- /dev/null +++ b/src/3rdparty/libmng/libmng_chunk_prc.c @@ -0,0 +1,4452 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_chunk_prc.c copyright (c) 2000-2005 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Chunk initialization & cleanup (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the chunk initialization & cleanup * */ +/* * routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.9.1 - 07/19/2000 - G.Juyn * */ +/* * - fixed creation-code * */ +/* * * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - put add_chunk() inside MNG_INCLUDE_WRITE_PROCS wrapper * */ +/* * 0.9.2 - 08/01/2000 - G.Juyn * */ +/* * - wrapper for add_chunk() changed * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added support for JDAA * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * - added HLAPI function to copy chunks * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 10/04/2002 - G.Juyn * */ +/* * - fixed chunk-storage for evNT chunk * */ +/* * 1.0.5 - 10/17/2002 - G.Juyn * */ +/* * - fixed issue in freeing evNT chunk * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */ +/* * - added MNG_NO_DELTA_PNG reduction feature * */ +/* * 1.0.6 - 07/14/2003 - G.R-P * */ +/* * - added MNG_NO_LOOP_SIGNALS_SUPPORTED conditional * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * 1.0.6 - 08/17/2003 - G.R-P * */ +/* * - added conditionals around non-VLC chunk support * */ +/* * * */ +/* * 1.0.7 - 03/24/2004 - G.R-P * */ +/* * - fixed SKIPCHUNK_eXPI -> fPRI typo * */ +/* * * */ +/* * 1.0.9 - 09/25/2004 - G.Juyn * */ +/* * - replaced MNG_TWEAK_LARGE_FILES with permanent solution * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKINITFREE * */ +/* * 1.0.9 - 12/06/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKASSIGN * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* * 1.0.10 - 07/30/2005 - G.Juyn * */ +/* * - fixed problem with CLON object during readdisplay() * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_memory.h" +#include "libmng_chunks.h" +#include "libmng_chunk_prc.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ +/* * * */ +/* * General chunk routines * */ +/* * * */ +/* ************************************************************************** */ + +void mng_add_chunk (mng_datap pData, + mng_chunkp pChunk) +{ + if (!pData->pFirstchunk) /* list is still empty ? */ + { + pData->pFirstchunk = pChunk; /* then this becomes the first */ + +#ifdef MNG_SUPPORT_WRITE + if (!pData->iFirstchunkadded) + { + pData->iFirstchunkadded = ((mng_chunk_headerp)pChunk)->iChunkname; +#endif + + if (((mng_chunk_headerp)pChunk)->iChunkname == MNG_UINT_IHDR) + pData->eImagetype = mng_it_png; + else +#ifdef MNG_INCLUDE_JNG + if (((mng_chunk_headerp)pChunk)->iChunkname == MNG_UINT_JHDR) + pData->eImagetype = mng_it_jng; + else +#endif + pData->eImagetype = mng_it_mng; + + pData->eSigtype = pData->eImagetype; +#ifdef MNG_SUPPORT_WRITE + } +#endif + } + else + { /* else we make appropriate links */ + ((mng_chunk_headerp)pChunk)->pPrev = pData->pLastchunk; + ((mng_chunk_headerp)pData->pLastchunk)->pNext = pChunk; + } + + pData->pLastchunk = pChunk; /* and it's always the last */ + + return; +} + +/* ************************************************************************** */ +/* * * */ +/* * Chunk specific initialization routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_CHUNKINITFREE +INIT_CHUNK_HDR (mng_init_general) +{ + MNG_ALLOC (pData, *ppChunk, ((mng_chunk_headerp)pHeader)->iChunksize); + MNG_COPY (*ppChunk, pHeader, sizeof (mng_chunk_header)); + return MNG_NOERROR; +} + +#else /* MNG_OPTIMIZE_CHUNKINITFREE */ + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_ihdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IHDR, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_ihdr)); + ((mng_ihdrp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_plte) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PLTE, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_plte)); + ((mng_pltep)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_idat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDAT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_idat)); + ((mng_idatp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_iend) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IEND, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_iend)); + ((mng_iendp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_trns) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_TRNS, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_trns)); + ((mng_trnsp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_gAMA +INIT_CHUNK_HDR (mng_init_gama) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GAMA, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_gama)); + ((mng_gamap)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +INIT_CHUNK_HDR (mng_init_chrm) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_CHRM, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_chrm)); + ((mng_chrmp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sRGB +INIT_CHUNK_HDR (mng_init_srgb) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SRGB, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_srgb)); + ((mng_srgbp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +INIT_CHUNK_HDR (mng_init_iccp) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ICCP, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_iccp)); + ((mng_iccpp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ICCP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +INIT_CHUNK_HDR (mng_init_text) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_TEXT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_text)); + ((mng_textp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_TEXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +INIT_CHUNK_HDR (mng_init_ztxt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ZTXT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_ztxt)); + ((mng_ztxtp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ZTXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +INIT_CHUNK_HDR (mng_init_itxt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ITXT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_itxt)); + ((mng_itxtp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ITXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +INIT_CHUNK_HDR (mng_init_bkgd) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_BKGD, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_bkgd)); + ((mng_bkgdp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYs +INIT_CHUNK_HDR (mng_init_phys) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PHYS, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_phys)); + ((mng_physp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PHYS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sBIT +INIT_CHUNK_HDR (mng_init_sbit) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SBIT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_sbit)); + ((mng_sbitp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SBIT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +INIT_CHUNK_HDR (mng_init_splt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SPLT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_splt)); + ((mng_spltp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_hIST +INIT_CHUNK_HDR (mng_init_hist) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_HIST, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_hist)); + ((mng_histp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_HIST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tIME +INIT_CHUNK_HDR (mng_init_time) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_TIME, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_time)); + ((mng_timep)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_TIME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_mhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_MHDR, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_mhdr)); + ((mng_mhdrp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_MHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_mend) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_MEND, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_mend)); + ((mng_mendp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_MEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +INIT_CHUNK_HDR (mng_init_loop) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_LOOP, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_loop)); + ((mng_loopp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_LOOP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_endl) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ENDL, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_endl)); + ((mng_endlp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DEFI +INIT_CHUNK_HDR (mng_init_defi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DEFI, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_defi)); + ((mng_defip)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BASI +INIT_CHUNK_HDR (mng_init_basi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_BASI, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_basi)); + ((mng_basip)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_BASI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLON +INIT_CHUNK_HDR (mng_init_clon) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_CLON, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_clon)); + ((mng_clonp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +INIT_CHUNK_HDR (mng_init_past) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PAST, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_past)); + ((mng_pastp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PAST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +INIT_CHUNK_HDR (mng_init_disc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DISC, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_disc)); + ((mng_discp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DISC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BACK +INIT_CHUNK_HDR (mng_init_back) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_BACK, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_back)); + ((mng_backp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +INIT_CHUNK_HDR (mng_init_fram) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_FRAM, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_fram)); + ((mng_framp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_FRAM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MOVE +INIT_CHUNK_HDR (mng_init_move) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_MOVE, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_move)); + ((mng_movep)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_MOVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLIP +INIT_CHUNK_HDR (mng_init_clip) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_CLIP, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_clip)); + ((mng_clipp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_CLIP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SHOW +INIT_CHUNK_HDR (mng_init_show) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SHOW, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_show)); + ((mng_showp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_TERM +INIT_CHUNK_HDR (mng_init_term) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_TERM, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_term)); + ((mng_termp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +INIT_CHUNK_HDR (mng_init_save) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SAVE, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_save)); + ((mng_savep)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; + +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +INIT_CHUNK_HDR (mng_init_seek) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SEEK, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_seek)); + ((mng_seekp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_SEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +INIT_CHUNK_HDR (mng_init_expi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_EXPI, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_expi)); + ((mng_expip)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_EXPI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_fPRI +INIT_CHUNK_HDR (mng_init_fpri) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_FPRI, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_fpri)); + ((mng_fprip)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_FPRI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +INIT_CHUNK_HDR (mng_init_need) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_NEED, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_need)); + ((mng_needp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_NEED, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYg +INIT_CHUNK_HDR (mng_init_phyg) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PHYG, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_phyg)); + ((mng_phygp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PHYG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +INIT_CHUNK_HDR (mng_init_jhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JHDR, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_jhdr)); + ((mng_jhdrp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +INIT_CHUNK_HDR (mng_init_jdaa) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JDAA, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_jdaa)); + ((mng_jdaap)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JDAA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +INIT_CHUNK_HDR (mng_init_jdat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JDAT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_jdat)); + ((mng_jdatp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +INIT_CHUNK_HDR (mng_init_jsep) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JSEP, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_jsep)); + ((mng_jsepp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JSEP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +INIT_CHUNK_HDR (mng_init_dhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DHDR, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_dhdr)); + ((mng_dhdrp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +INIT_CHUNK_HDR (mng_init_prom) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PROM, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_prom)); + ((mng_promp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PROM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +INIT_CHUNK_HDR (mng_init_ipng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IPNG, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_ipng)); + ((mng_ipngp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +INIT_CHUNK_HDR (mng_init_pplt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PPLT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_pplt)); + ((mng_ppltp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_PPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +INIT_CHUNK_HDR (mng_init_ijng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IJNG, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_ijng)); + ((mng_ijngp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +INIT_CHUNK_HDR (mng_init_drop) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DROP, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_drop)); + ((mng_dropp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DROP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +INIT_CHUNK_HDR (mng_init_dbyk) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DBYK, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_dbyk)); + ((mng_dbykp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_DBYK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +INIT_CHUNK_HDR (mng_init_ordr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ORDR, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_ordr)); + ((mng_ordrp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ORDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +INIT_CHUNK_HDR (mng_init_magn) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_MAGN, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_magn)); + ((mng_magnp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +INIT_CHUNK_HDR (mng_init_evnt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_EVNT, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_evnt)); + ((mng_evntp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_EVNT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +INIT_CHUNK_HDR (mng_init_unknown) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_UNKNOWN, MNG_LC_START); +#endif + + MNG_ALLOC (pData, *ppChunk, sizeof (mng_unknown_chunk)); + ((mng_unknown_chunkp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_UNKNOWN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_OPTIMIZE_CHUNKINITFREE */ + +/* ************************************************************************** */ +/* * * */ +/* * Chunk specific cleanup routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_general) +{ + MNG_FREEX (pData, pHeader, ((mng_chunk_headerp)pHeader)->iChunksize); + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_ihdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IHDR, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_ihdr)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_plte) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PLTE, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_plte)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +FREE_CHUNK_HDR (mng_free_idat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IDAT, MNG_LC_START); +#endif + + if (((mng_idatp)pHeader)->iDatasize) + MNG_FREEX (pData, ((mng_idatp)pHeader)->pData, + ((mng_idatp)pHeader)->iDatasize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_idat)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IDAT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_iend) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IEND, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_iend)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_trns) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_TRNS, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_trns)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_gAMA +FREE_CHUNK_HDR (mng_free_gama) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_GAMA, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_gama)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_cHRM +FREE_CHUNK_HDR (mng_free_chrm) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_CHRM, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_chrm)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_sRGB +FREE_CHUNK_HDR (mng_free_srgb) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SRGB, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_srgb)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +FREE_CHUNK_HDR (mng_free_iccp) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ICCP, MNG_LC_START); +#endif + + if (((mng_iccpp)pHeader)->iNamesize) + MNG_FREEX (pData, ((mng_iccpp)pHeader)->zName, + ((mng_iccpp)pHeader)->iNamesize + 1); + + if (((mng_iccpp)pHeader)->iProfilesize) + MNG_FREEX (pData, ((mng_iccpp)pHeader)->pProfile, + ((mng_iccpp)pHeader)->iProfilesize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_iccp)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ICCP, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +FREE_CHUNK_HDR (mng_free_text) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_TEXT, MNG_LC_START); +#endif + + if (((mng_textp)pHeader)->iKeywordsize) + MNG_FREEX (pData, ((mng_textp)pHeader)->zKeyword, + ((mng_textp)pHeader)->iKeywordsize + 1); + + if (((mng_textp)pHeader)->iTextsize) + MNG_FREEX (pData, ((mng_textp)pHeader)->zText, + ((mng_textp)pHeader)->iTextsize + 1); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_text)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_TEXT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +FREE_CHUNK_HDR (mng_free_ztxt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ZTXT, MNG_LC_START); +#endif + + if (((mng_ztxtp)pHeader)->iKeywordsize) + MNG_FREEX (pData, ((mng_ztxtp)pHeader)->zKeyword, + ((mng_ztxtp)pHeader)->iKeywordsize + 1); + + if (((mng_ztxtp)pHeader)->iTextsize) + MNG_FREEX (pData, ((mng_ztxtp)pHeader)->zText, + ((mng_ztxtp)pHeader)->iTextsize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_ztxt)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ZTXT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ +#ifndef MNG_SKIPCHUNK_iTXt +FREE_CHUNK_HDR (mng_free_itxt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ITXT, MNG_LC_START); +#endif + + if (((mng_itxtp)pHeader)->iKeywordsize) + MNG_FREEX (pData, ((mng_itxtp)pHeader)->zKeyword, + ((mng_itxtp)pHeader)->iKeywordsize + 1); + + if (((mng_itxtp)pHeader)->iLanguagesize) + MNG_FREEX (pData, ((mng_itxtp)pHeader)->zLanguage, + ((mng_itxtp)pHeader)->iLanguagesize + 1); + + if (((mng_itxtp)pHeader)->iTranslationsize) + MNG_FREEX (pData, ((mng_itxtp)pHeader)->zTranslation, + ((mng_itxtp)pHeader)->iTranslationsize + 1); + + if (((mng_itxtp)pHeader)->iTextsize) + MNG_FREEX (pData, ((mng_itxtp)pHeader)->zText, + ((mng_itxtp)pHeader)->iTextsize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_itxt)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ITXT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +FREE_CHUNK_HDR (mng_free_mpng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MPNG, MNG_LC_START); +#endif + + if (((mng_mpngp)pHeader)->iFramessize) + MNG_FREEX (pData, ((mng_mpngp)pHeader)->pFrames, + ((mng_mpngp)pHeader)->iFramessize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_mpng)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MPNG, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ +#ifdef MNG_INCLUDE_ANG_PROPOSAL +FREE_CHUNK_HDR (mng_free_adat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ADAT, MNG_LC_START); +#endif + + if (((mng_adatp)pHeader)->iTilessize) + MNG_FREEX (pData, ((mng_adatp)pHeader)->pTiles, ((mng_adatp)pHeader)->iTilessize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_adat)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ADAT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_bKGD +FREE_CHUNK_HDR (mng_free_bkgd) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_BKGD, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_bkgd)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_pHYs +FREE_CHUNK_HDR (mng_free_phys) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PHYS, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_phys)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PHYS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_sBIT +FREE_CHUNK_HDR (mng_free_sbit) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SBIT, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_sbit)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SBIT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +FREE_CHUNK_HDR (mng_free_splt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SPLT, MNG_LC_START); +#endif + + if (((mng_spltp)pHeader)->iNamesize) + MNG_FREEX (pData, ((mng_spltp)pHeader)->zName, + ((mng_spltp)pHeader)->iNamesize + 1); + + if (((mng_spltp)pHeader)->iEntrycount) + MNG_FREEX (pData, ((mng_spltp)pHeader)->pEntries, + ((mng_spltp)pHeader)->iEntrycount * + (((mng_spltp)pHeader)->iSampledepth * 3 + sizeof (mng_uint16)) ); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_splt)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SPLT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_hIST +FREE_CHUNK_HDR (mng_free_hist) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_HIST, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_hist)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_HIST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_tIME +FREE_CHUNK_HDR (mng_free_time) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_TIME, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_time)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_TIME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_mhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MHDR, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_mhdr)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_mend) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MEND, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_mend)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +FREE_CHUNK_HDR (mng_free_loop) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_LOOP, MNG_LC_START); +#endif + +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + if (((mng_loopp)pHeader)->iCount) + MNG_FREEX (pData, ((mng_loopp)pHeader)->pSignals, + ((mng_loopp)pHeader)->iCount * sizeof (mng_uint32) ); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_loop)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_LOOP, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_endl) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ENDL, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_endl)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_DEFI +FREE_CHUNK_HDR (mng_free_defi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DEFI, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_defi)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_BASI +FREE_CHUNK_HDR (mng_free_basi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_BASI, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_basi)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_BASI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_CLON +FREE_CHUNK_HDR (mng_free_clon) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_CLON, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_clon)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +FREE_CHUNK_HDR (mng_free_past) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PAST, MNG_LC_START); +#endif + + if (((mng_pastp)pHeader)->iCount) + MNG_FREEX (pData, ((mng_pastp)pHeader)->pSources, + ((mng_pastp)pHeader)->iCount * sizeof (mng_past_source) ); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_past)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PAST, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +FREE_CHUNK_HDR (mng_free_disc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DISC, MNG_LC_START); +#endif + + if (((mng_discp)pHeader)->iCount) + MNG_FREEX (pData, ((mng_discp)pHeader)->pObjectids, + ((mng_discp)pHeader)->iCount * sizeof (mng_uint16) ); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_disc)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DISC, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_BACK +FREE_CHUNK_HDR (mng_free_back) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_BACK, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_back)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +FREE_CHUNK_HDR (mng_free_fram) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_FRAM, MNG_LC_START); +#endif + + if (((mng_framp)pHeader)->iNamesize) + MNG_FREEX (pData, ((mng_framp)pHeader)->zName, + ((mng_framp)pHeader)->iNamesize + 1); + + if (((mng_framp)pHeader)->iCount) + MNG_FREEX (pData, ((mng_framp)pHeader)->pSyncids, + ((mng_framp)pHeader)->iCount * sizeof (mng_uint32) ); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_fram)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_FRAM, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_MOVE +FREE_CHUNK_HDR (mng_free_move) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MOVE, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_move)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MOVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_CLIP +FREE_CHUNK_HDR (mng_free_clip) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_CLIP, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_clip)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_CLIP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_SHOW +FREE_CHUNK_HDR (mng_free_show) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SHOW, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_show)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_TERM +FREE_CHUNK_HDR (mng_free_term) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_TERM, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_term)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +FREE_CHUNK_HDR (mng_free_save) +{ + mng_save_entryp pEntry = ((mng_savep)pHeader)->pEntries; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SAVE, MNG_LC_START); +#endif + + for (iX = 0; iX < ((mng_savep)pHeader)->iCount; iX++) + { + if (pEntry->iNamesize) + MNG_FREEX (pData, pEntry->zName, pEntry->iNamesize); + + pEntry = pEntry + sizeof (mng_save_entry); + } + + if (((mng_savep)pHeader)->iCount) + MNG_FREEX (pData, ((mng_savep)pHeader)->pEntries, + ((mng_savep)pHeader)->iCount * sizeof (mng_save_entry) ); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_save)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SAVE, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +FREE_CHUNK_HDR (mng_free_seek) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SEEK, MNG_LC_START); +#endif + + if (((mng_seekp)pHeader)->iNamesize) + MNG_FREEX (pData, ((mng_seekp)pHeader)->zName, + ((mng_seekp)pHeader)->iNamesize + 1); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_seek)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_SEEK, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +FREE_CHUNK_HDR (mng_free_expi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_EXPI, MNG_LC_START); +#endif + + if (((mng_expip)pHeader)->iNamesize) + MNG_FREEX (pData, ((mng_expip)pHeader)->zName, + ((mng_expip)pHeader)->iNamesize + 1); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_expi)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_EXPI, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_fPRI +FREE_CHUNK_HDR (mng_free_fpri) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_FPRI, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_fpri)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_FPRI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +FREE_CHUNK_HDR (mng_free_need) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_NEED, MNG_LC_START); +#endif + + if (((mng_needp)pHeader)->iKeywordssize) + MNG_FREEX (pData, ((mng_needp)pHeader)->zKeywords, + ((mng_needp)pHeader)->iKeywordssize + 1); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_need)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_NEED, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_pHYg +FREE_CHUNK_HDR (mng_free_phyg) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PHYG, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_phyg)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PHYG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifdef MNG_INCLUDE_JNG +FREE_CHUNK_HDR (mng_free_jhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_JHDR, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_jhdr)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_JHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +FREE_CHUNK_HDR (mng_free_jdaa) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_JDAA, MNG_LC_START); +#endif + + if (((mng_jdaap)pHeader)->iDatasize) + MNG_FREEX (pData, ((mng_jdaap)pHeader)->pData, + ((mng_jdaap)pHeader)->iDatasize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_jdaa)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_JDAA, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +FREE_CHUNK_HDR (mng_free_jdat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_JDAT, MNG_LC_START); +#endif + + if (((mng_jdatp)pHeader)->iDatasize) + MNG_FREEX (pData, ((mng_jdatp)pHeader)->pData, + ((mng_jdatp)pHeader)->iDatasize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_jdat)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_JDAT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifdef MNG_INCLUDE_JNG +FREE_CHUNK_HDR (mng_free_jsep) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_JSEP, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_jsep)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_JSEP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_NO_DELTA_PNG +FREE_CHUNK_HDR (mng_free_dhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DHDR, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_dhdr)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_NO_DELTA_PNG +FREE_CHUNK_HDR (mng_free_prom) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PROM, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_prom)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PROM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_NO_DELTA_PNG +FREE_CHUNK_HDR (mng_free_ipng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IPNG, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_ipng)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_NO_DELTA_PNG +FREE_CHUNK_HDR (mng_free_pplt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PPLT, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_pplt)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_PPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +FREE_CHUNK_HDR (mng_free_ijng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IJNG, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_ijng)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +FREE_CHUNK_HDR (mng_free_drop) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DROP, MNG_LC_START); +#endif + + if (((mng_dropp)pHeader)->iCount) + MNG_FREEX (pData, ((mng_dropp)pHeader)->pChunknames, + ((mng_dropp)pHeader)->iCount * sizeof (mng_chunkid) ); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_drop)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DROP, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +FREE_CHUNK_HDR (mng_free_dbyk) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DBYK, MNG_LC_START); +#endif + + if (((mng_dbykp)pHeader)->iKeywordssize) + MNG_FREEX (pData, ((mng_dbykp)pHeader)->zKeywords, + ((mng_dbykp)pHeader)->iKeywordssize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_dbyk)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_DBYK, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +FREE_CHUNK_HDR (mng_free_ordr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ORDR, MNG_LC_START); +#endif + + if (((mng_ordrp)pHeader)->iCount) + MNG_FREEX (pData, ((mng_ordrp)pHeader)->pEntries, + ((mng_ordrp)pHeader)->iCount * sizeof (mng_ordr_entry) ); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_ordr)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ORDR, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE +#ifndef MNG_SKIPCHUNK_MAGN +FREE_CHUNK_HDR (mng_free_magn) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MAGN, MNG_LC_START); +#endif + + MNG_FREEX (pData, pHeader, sizeof (mng_magn)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +FREE_CHUNK_HDR (mng_free_evnt) +{ + mng_evnt_entryp pEntry = ((mng_evntp)pHeader)->pEntries; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_EVNT, MNG_LC_START); +#endif + + for (iX = 0; iX < ((mng_evntp)pHeader)->iCount; iX++) + { + if (pEntry->iSegmentnamesize) + MNG_FREEX (pData, pEntry->zSegmentname, pEntry->iSegmentnamesize+1); + + pEntry++; + } + + if (((mng_evntp)pHeader)->iCount) + MNG_FREEX (pData, ((mng_evntp)pHeader)->pEntries, + ((mng_evntp)pHeader)->iCount * sizeof (mng_evnt_entry) ); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_evnt)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_EVNT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} +#endif + +/* ************************************************************************** */ + +FREE_CHUNK_HDR (mng_free_unknown) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_UNKNOWN, MNG_LC_START); +#endif + + if (((mng_unknown_chunkp)pHeader)->iDatasize) + MNG_FREEX (pData, ((mng_unknown_chunkp)pHeader)->pData, + ((mng_unknown_chunkp)pHeader)->iDatasize); + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + MNG_FREEX (pData, pHeader, sizeof (mng_unknown_chunk)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_UNKNOWN, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_CHUNKINITFREE + return MNG_NOERROR; +#else + return mng_free_general(pData, pHeader); +#endif +} + +/* ************************************************************************** */ +/* * * */ +/* * Chunk specific copy routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_general) +{ + mng_ptr pSrc = (mng_uint8p)pChunkfrom + sizeof (mng_chunk_header); + mng_ptr pDst = (mng_uint8p)pChunkto + sizeof (mng_chunk_header); + mng_size_t iLen = ((mng_chunk_headerp)pChunkfrom)->iChunksize - sizeof (mng_chunk_header); + + MNG_COPY (pDst, pSrc, iLen); + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_ihdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IHDR, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_IHDR) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_ihdrp)pChunkto)->iWidth = ((mng_ihdrp)pChunkfrom)->iWidth; + ((mng_ihdrp)pChunkto)->iHeight = ((mng_ihdrp)pChunkfrom)->iHeight; + ((mng_ihdrp)pChunkto)->iBitdepth = ((mng_ihdrp)pChunkfrom)->iBitdepth; + ((mng_ihdrp)pChunkto)->iColortype = ((mng_ihdrp)pChunkfrom)->iColortype; + ((mng_ihdrp)pChunkto)->iCompression = ((mng_ihdrp)pChunkfrom)->iCompression; + ((mng_ihdrp)pChunkto)->iFilter = ((mng_ihdrp)pChunkfrom)->iFilter; + ((mng_ihdrp)pChunkto)->iInterlace = ((mng_ihdrp)pChunkfrom)->iInterlace; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_plte) +{ + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PLTE, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_PLTE) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_pltep)pChunkto)->bEmpty = ((mng_pltep)pChunkfrom)->bEmpty; + ((mng_pltep)pChunkto)->iEntrycount = ((mng_pltep)pChunkfrom)->iEntrycount; + + for (iX = 0; iX < ((mng_pltep)pChunkto)->iEntrycount; iX++) + ((mng_pltep)pChunkto)->aEntries [iX] = ((mng_pltep)pChunkfrom)->aEntries [iX]; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +ASSIGN_CHUNK_HDR (mng_assign_idat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IDAT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_IDAT) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_idatp)pChunkto)->bEmpty = ((mng_idatp)pChunkfrom)->bEmpty; + ((mng_idatp)pChunkto)->iDatasize = ((mng_idatp)pChunkfrom)->iDatasize; + + if (((mng_idatp)pChunkto)->iDatasize) + { + MNG_ALLOC (pData, ((mng_idatp)pChunkto)->pData, ((mng_idatp)pChunkto)->iDatasize); + MNG_COPY (((mng_idatp)pChunkto)->pData, ((mng_idatp)pChunkfrom)->pData, + ((mng_idatp)pChunkto)->iDatasize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_iend) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IEND, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_IEND) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_trns) +{ + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_TRNS, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_tRNS) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_trnsp)pChunkto)->bEmpty = ((mng_trnsp)pChunkfrom)->bEmpty; + ((mng_trnsp)pChunkto)->bGlobal = ((mng_trnsp)pChunkfrom)->bGlobal; + ((mng_trnsp)pChunkto)->iType = ((mng_trnsp)pChunkfrom)->iType; + ((mng_trnsp)pChunkto)->iCount = ((mng_trnsp)pChunkfrom)->iCount; + ((mng_trnsp)pChunkto)->iGray = ((mng_trnsp)pChunkfrom)->iGray; + ((mng_trnsp)pChunkto)->iRed = ((mng_trnsp)pChunkfrom)->iRed; + ((mng_trnsp)pChunkto)->iGreen = ((mng_trnsp)pChunkfrom)->iGreen; + ((mng_trnsp)pChunkto)->iBlue = ((mng_trnsp)pChunkfrom)->iBlue; + ((mng_trnsp)pChunkto)->iRawlen = ((mng_trnsp)pChunkfrom)->iRawlen; + + for (iX = 0; iX < ((mng_trnsp)pChunkto)->iCount; iX++) + ((mng_trnsp)pChunkto)->aEntries [iX] = ((mng_trnsp)pChunkfrom)->aEntries [iX]; + + for (iX = 0; iX < ((mng_trnsp)pChunkto)->iRawlen; iX++) + ((mng_trnsp)pChunkto)->aRawdata [iX] = ((mng_trnsp)pChunkfrom)->aRawdata [iX]; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_gAMA +ASSIGN_CHUNK_HDR (mng_assign_gama) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_GAMA, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_gAMA) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_gamap)pChunkto)->bEmpty = ((mng_gamap)pChunkfrom)->bEmpty; + ((mng_gamap)pChunkto)->iGamma = ((mng_gamap)pChunkfrom)->iGamma; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_cHRM +ASSIGN_CHUNK_HDR (mng_assign_chrm) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_CHRM, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_cHRM) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_chrmp)pChunkto)->bEmpty = ((mng_chrmp)pChunkfrom)->bEmpty; + ((mng_chrmp)pChunkto)->iWhitepointx = ((mng_chrmp)pChunkfrom)->iWhitepointx; + ((mng_chrmp)pChunkto)->iWhitepointy = ((mng_chrmp)pChunkfrom)->iWhitepointy; + ((mng_chrmp)pChunkto)->iRedx = ((mng_chrmp)pChunkfrom)->iRedx; + ((mng_chrmp)pChunkto)->iRedy = ((mng_chrmp)pChunkfrom)->iRedy; + ((mng_chrmp)pChunkto)->iGreenx = ((mng_chrmp)pChunkfrom)->iGreenx; + ((mng_chrmp)pChunkto)->iGreeny = ((mng_chrmp)pChunkfrom)->iGreeny; + ((mng_chrmp)pChunkto)->iBluex = ((mng_chrmp)pChunkfrom)->iBluex; + ((mng_chrmp)pChunkto)->iBluey = ((mng_chrmp)pChunkfrom)->iBluey; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_sRGB +ASSIGN_CHUNK_HDR (mng_assign_srgb) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SRGB, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_sRGB) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_srgbp)pChunkto)->iRenderingintent = ((mng_srgbp)pChunkfrom)->iRenderingintent; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +ASSIGN_CHUNK_HDR (mng_assign_iccp) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ICCP, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_iCCP) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_iccpp)pChunkto)->bEmpty = ((mng_iccpp)pChunkfrom)->bEmpty; + ((mng_iccpp)pChunkto)->iNamesize = ((mng_iccpp)pChunkfrom)->iNamesize; + ((mng_iccpp)pChunkto)->iCompression = ((mng_iccpp)pChunkfrom)->iCompression; + ((mng_iccpp)pChunkto)->iProfilesize = ((mng_iccpp)pChunkfrom)->iProfilesize; + + if (((mng_iccpp)pChunkto)->iNamesize) + { + MNG_ALLOC (pData, ((mng_iccpp)pChunkto)->zName, ((mng_iccpp)pChunkto)->iNamesize); + MNG_COPY (((mng_iccpp)pChunkto)->zName, ((mng_iccpp)pChunkfrom)->zName, + ((mng_iccpp)pChunkto)->iNamesize); + } + + if (((mng_iccpp)pChunkto)->iProfilesize) + { + MNG_ALLOC (pData, ((mng_iccpp)pChunkto)->pProfile, ((mng_iccpp)pChunkto)->iProfilesize); + MNG_COPY (((mng_iccpp)pChunkto)->pProfile, ((mng_iccpp)pChunkfrom)->pProfile, + ((mng_iccpp)pChunkto)->iProfilesize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ICCP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +ASSIGN_CHUNK_HDR (mng_assign_text) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_TEXT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_tEXt) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_textp)pChunkto)->iKeywordsize = ((mng_textp)pChunkfrom)->iKeywordsize; + ((mng_textp)pChunkto)->iTextsize = ((mng_textp)pChunkfrom)->iTextsize; + + if (((mng_textp)pChunkto)->iKeywordsize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunkto)->zKeyword, ((mng_textp)pChunkto)->iKeywordsize); + MNG_COPY (((mng_itxtp)pChunkto)->zKeyword, ((mng_textp)pChunkfrom)->zKeyword, + ((mng_itxtp)pChunkto)->iKeywordsize); + } + + if (((mng_textp)pChunkto)->iTextsize) + { + MNG_ALLOC (pData, ((mng_textp)pChunkto)->zText, ((mng_textp)pChunkto)->iTextsize); + MNG_COPY (((mng_textp)pChunkto)->zText, ((mng_textp)pChunkfrom)->zText, + ((mng_textp)pChunkto)->iTextsize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_TEXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +ASSIGN_CHUNK_HDR (mng_assign_ztxt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ZTXT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_zTXt) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_ztxtp)pChunkto)->iKeywordsize = ((mng_ztxtp)pChunkfrom)->iKeywordsize; + ((mng_ztxtp)pChunkto)->iCompression = ((mng_ztxtp)pChunkfrom)->iCompression; + ((mng_ztxtp)pChunkto)->iTextsize = ((mng_ztxtp)pChunkfrom)->iTextsize; + + if (((mng_ztxtp)pChunkto)->iKeywordsize) + { + MNG_ALLOC (pData, ((mng_ztxtp)pChunkto)->zKeyword, ((mng_ztxtp)pChunkto)->iKeywordsize); + MNG_COPY (((mng_ztxtp)pChunkto)->zKeyword, ((mng_ztxtp)pChunkfrom)->zKeyword, + ((mng_ztxtp)pChunkto)->iKeywordsize); + } + + if (((mng_ztxtp)pChunkto)->iTextsize) + { + MNG_ALLOC (pData, ((mng_ztxtp)pChunkto)->zText, ((mng_ztxtp)pChunkto)->iTextsize); + MNG_COPY (((mng_ztxtp)pChunkto)->zText, ((mng_ztxtp)pChunkfrom)->zText, + ((mng_ztxtp)pChunkto)->iTextsize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ZTXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +ASSIGN_CHUNK_HDR (mng_assign_itxt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ITXT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_iTXt) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_itxtp)pChunkto)->iKeywordsize = ((mng_itxtp)pChunkfrom)->iKeywordsize; + ((mng_itxtp)pChunkto)->iCompressionflag = ((mng_itxtp)pChunkfrom)->iCompressionflag; + ((mng_itxtp)pChunkto)->iCompressionmethod = ((mng_itxtp)pChunkfrom)->iCompressionmethod; + ((mng_itxtp)pChunkto)->iLanguagesize = ((mng_itxtp)pChunkfrom)->iLanguagesize; + ((mng_itxtp)pChunkto)->iTranslationsize = ((mng_itxtp)pChunkfrom)->iTranslationsize; + ((mng_itxtp)pChunkto)->iTextsize = ((mng_itxtp)pChunkfrom)->iTextsize; + + if (((mng_itxtp)pChunkto)->iKeywordsize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunkto)->zKeyword, ((mng_itxtp)pChunkto)->iKeywordsize); + MNG_COPY (((mng_itxtp)pChunkto)->zKeyword, ((mng_itxtp)pChunkfrom)->zKeyword, + ((mng_itxtp)pChunkto)->iKeywordsize); + } + + if (((mng_itxtp)pChunkto)->iTextsize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunkto)->zLanguage, ((mng_itxtp)pChunkto)->iLanguagesize); + MNG_COPY (((mng_itxtp)pChunkto)->zLanguage, ((mng_itxtp)pChunkfrom)->zLanguage, + ((mng_itxtp)pChunkto)->iLanguagesize); + } + + if (((mng_itxtp)pChunkto)->iTextsize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunkto)->zTranslation, ((mng_itxtp)pChunkto)->iTranslationsize); + MNG_COPY (((mng_itxtp)pChunkto)->zTranslation, ((mng_itxtp)pChunkfrom)->zTranslation, + ((mng_itxtp)pChunkto)->iTranslationsize); + } + + if (((mng_itxtp)pChunkto)->iTextsize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunkto)->zText, ((mng_itxtp)pChunkto)->iTextsize); + MNG_COPY (((mng_itxtp)pChunkto)->zText, ((mng_itxtp)pChunkfrom)->zText, + ((mng_itxtp)pChunkto)->iTextsize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ITXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_bKGD +ASSIGN_CHUNK_HDR (mng_assign_bkgd) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_BKGD, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_bKGD) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_bkgdp)pChunkto)->bEmpty = ((mng_bkgdp)pChunkfrom)->bEmpty; + ((mng_bkgdp)pChunkto)->iType = ((mng_bkgdp)pChunkfrom)->iType; + ((mng_bkgdp)pChunkto)->iIndex = ((mng_bkgdp)pChunkfrom)->iIndex; + ((mng_bkgdp)pChunkto)->iGray = ((mng_bkgdp)pChunkfrom)->iGray; + ((mng_bkgdp)pChunkto)->iRed = ((mng_bkgdp)pChunkfrom)->iRed; + ((mng_bkgdp)pChunkto)->iGreen = ((mng_bkgdp)pChunkfrom)->iGreen; + ((mng_bkgdp)pChunkto)->iBlue = ((mng_bkgdp)pChunkfrom)->iBlue; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_pHYs +ASSIGN_CHUNK_HDR (mng_assign_phys) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PHYS, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_pHYs) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_physp)pChunkto)->bEmpty = ((mng_physp)pChunkfrom)->bEmpty; + ((mng_physp)pChunkto)->iSizex = ((mng_physp)pChunkfrom)->iSizex; + ((mng_physp)pChunkto)->iSizey = ((mng_physp)pChunkfrom)->iSizey; + ((mng_physp)pChunkto)->iUnit = ((mng_physp)pChunkfrom)->iUnit; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PHYS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_sBIT +ASSIGN_CHUNK_HDR (mng_assign_sbit) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SBIT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_sBIT) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_sbitp)pChunkto)->bEmpty = ((mng_sbitp)pChunkfrom)->bEmpty; + ((mng_sbitp)pChunkto)->iType = ((mng_sbitp)pChunkfrom)->iType; + ((mng_sbitp)pChunkto)->aBits [0] = ((mng_sbitp)pChunkfrom)->aBits [0]; + ((mng_sbitp)pChunkto)->aBits [1] = ((mng_sbitp)pChunkfrom)->aBits [1]; + ((mng_sbitp)pChunkto)->aBits [2] = ((mng_sbitp)pChunkfrom)->aBits [2]; + ((mng_sbitp)pChunkto)->aBits [3] = ((mng_sbitp)pChunkfrom)->aBits [3]; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SBIT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +ASSIGN_CHUNK_HDR (mng_assign_splt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SPLT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_sPLT) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_spltp)pChunkto)->bEmpty = ((mng_spltp)pChunkfrom)->bEmpty; + ((mng_spltp)pChunkto)->iNamesize = ((mng_spltp)pChunkfrom)->iNamesize; + ((mng_spltp)pChunkto)->iSampledepth = ((mng_spltp)pChunkfrom)->iSampledepth; + ((mng_spltp)pChunkto)->iEntrycount = ((mng_spltp)pChunkfrom)->iEntrycount; + ((mng_spltp)pChunkto)->pEntries = ((mng_spltp)pChunkfrom)->pEntries; + + if (((mng_spltp)pChunkto)->iNamesize) + { + MNG_ALLOC (pData, ((mng_spltp)pChunkto)->zName, ((mng_spltp)pChunkto)->iNamesize); + MNG_COPY (((mng_spltp)pChunkto)->zName, ((mng_spltp)pChunkfrom)->zName, + ((mng_spltp)pChunkto)->iNamesize); + } + + if (((mng_spltp)pChunkto)->iEntrycount) + { + mng_uint32 iLen = ((mng_spltp)pChunkto)->iEntrycount * + (((mng_spltp)pChunkto)->iSampledepth * 3 + sizeof (mng_uint16)); + + MNG_ALLOC (pData, ((mng_spltp)pChunkto)->pEntries, iLen); + MNG_COPY (((mng_spltp)pChunkto)->pEntries, ((mng_spltp)pChunkfrom)->pEntries, iLen); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_hIST +ASSIGN_CHUNK_HDR (mng_assign_hist) +{ + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_HIST, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_hIST) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_histp)pChunkto)->iEntrycount = ((mng_histp)pChunkfrom)->iEntrycount; + + for (iX = 0; iX < ((mng_histp)pChunkto)->iEntrycount; iX++) + ((mng_histp)pChunkto)->aEntries [iX] = ((mng_histp)pChunkfrom)->aEntries [iX]; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_HIST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_tIME +ASSIGN_CHUNK_HDR (mng_assign_time) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_TIME, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_tIME) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_timep)pChunkto)->iYear = ((mng_timep)pChunkfrom)->iYear; + ((mng_timep)pChunkto)->iMonth = ((mng_timep)pChunkfrom)->iMonth; + ((mng_timep)pChunkto)->iDay = ((mng_timep)pChunkfrom)->iDay; + ((mng_timep)pChunkto)->iHour = ((mng_timep)pChunkfrom)->iHour; + ((mng_timep)pChunkto)->iMinute = ((mng_timep)pChunkfrom)->iMinute; + ((mng_timep)pChunkto)->iSecond = ((mng_timep)pChunkfrom)->iSecond; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_TIME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_mhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MHDR, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_mhdrp)pChunkto)->iWidth = ((mng_mhdrp)pChunkfrom)->iWidth; + ((mng_mhdrp)pChunkto)->iHeight = ((mng_mhdrp)pChunkfrom)->iHeight; + ((mng_mhdrp)pChunkto)->iTicks = ((mng_mhdrp)pChunkfrom)->iTicks; + ((mng_mhdrp)pChunkto)->iLayercount = ((mng_mhdrp)pChunkfrom)->iLayercount; + ((mng_mhdrp)pChunkto)->iFramecount = ((mng_mhdrp)pChunkfrom)->iFramecount; + ((mng_mhdrp)pChunkto)->iPlaytime = ((mng_mhdrp)pChunkfrom)->iPlaytime; + ((mng_mhdrp)pChunkto)->iSimplicity = ((mng_mhdrp)pChunkfrom)->iSimplicity; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_mend) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MEND, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_MEND) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +ASSIGN_CHUNK_HDR (mng_assign_loop) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_LOOP, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_LOOP) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_loopp)pChunkto)->iLevel = ((mng_loopp)pChunkfrom)->iLevel; + ((mng_loopp)pChunkto)->iRepeat = ((mng_loopp)pChunkfrom)->iRepeat; + ((mng_loopp)pChunkto)->iTermination = ((mng_loopp)pChunkfrom)->iTermination; + ((mng_loopp)pChunkto)->iItermin = ((mng_loopp)pChunkfrom)->iItermin; + ((mng_loopp)pChunkto)->iItermax = ((mng_loopp)pChunkfrom)->iItermax; + ((mng_loopp)pChunkto)->iCount = ((mng_loopp)pChunkfrom)->iCount; + +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + if (((mng_loopp)pChunkto)->iCount) + { + mng_uint32 iLen = ((mng_loopp)pChunkto)->iCount * sizeof (mng_uint32); + MNG_ALLOC (pData, ((mng_loopp)pChunkto)->pSignals, iLen); + MNG_COPY (((mng_loopp)pChunkto)->pSignals, ((mng_loopp)pChunkfrom)->pSignals, iLen); + } +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_LOOP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_endl) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ENDL, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_ENDL) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_endlp)pChunkto)->iLevel = ((mng_endlp)pChunkfrom)->iLevel; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_DEFI +ASSIGN_CHUNK_HDR (mng_assign_defi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DEFI, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_DEFI) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_defip)pChunkto)->iObjectid = ((mng_defip)pChunkfrom)->iObjectid; + ((mng_defip)pChunkto)->bHasdonotshow = ((mng_defip)pChunkfrom)->bHasdonotshow; + ((mng_defip)pChunkto)->iDonotshow = ((mng_defip)pChunkfrom)->iDonotshow; + ((mng_defip)pChunkto)->bHasconcrete = ((mng_defip)pChunkfrom)->bHasconcrete; + ((mng_defip)pChunkto)->iConcrete = ((mng_defip)pChunkfrom)->iConcrete; + ((mng_defip)pChunkto)->bHasloca = ((mng_defip)pChunkfrom)->bHasloca; + ((mng_defip)pChunkto)->iXlocation = ((mng_defip)pChunkfrom)->iXlocation; + ((mng_defip)pChunkto)->iYlocation = ((mng_defip)pChunkfrom)->iYlocation; + ((mng_defip)pChunkto)->bHasclip = ((mng_defip)pChunkfrom)->bHasclip; + ((mng_defip)pChunkto)->iLeftcb = ((mng_defip)pChunkfrom)->iLeftcb; + ((mng_defip)pChunkto)->iRightcb = ((mng_defip)pChunkfrom)->iRightcb; + ((mng_defip)pChunkto)->iTopcb = ((mng_defip)pChunkfrom)->iTopcb; + ((mng_defip)pChunkto)->iBottomcb = ((mng_defip)pChunkfrom)->iBottomcb; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_BASI +ASSIGN_CHUNK_HDR (mng_assign_basi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_BASI, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_BASI) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_basip)pChunkto)->iWidth = ((mng_basip)pChunkfrom)->iWidth; + ((mng_basip)pChunkto)->iHeight = ((mng_basip)pChunkfrom)->iHeight; + ((mng_basip)pChunkto)->iBitdepth = ((mng_basip)pChunkfrom)->iBitdepth; + ((mng_basip)pChunkto)->iColortype = ((mng_basip)pChunkfrom)->iColortype; + ((mng_basip)pChunkto)->iCompression = ((mng_basip)pChunkfrom)->iCompression; + ((mng_basip)pChunkto)->iFilter = ((mng_basip)pChunkfrom)->iFilter; + ((mng_basip)pChunkto)->iInterlace = ((mng_basip)pChunkfrom)->iInterlace; + ((mng_basip)pChunkto)->iRed = ((mng_basip)pChunkfrom)->iRed; + ((mng_basip)pChunkto)->iGreen = ((mng_basip)pChunkfrom)->iGreen; + ((mng_basip)pChunkto)->iBlue = ((mng_basip)pChunkfrom)->iBlue; + ((mng_basip)pChunkto)->iAlpha = ((mng_basip)pChunkfrom)->iAlpha; + ((mng_basip)pChunkto)->iViewable = ((mng_basip)pChunkfrom)->iViewable; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_BASI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_CLON +ASSIGN_CHUNK_HDR (mng_assign_clon) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_CLON, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_CLON) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_clonp)pChunkto)->iSourceid = ((mng_clonp)pChunkfrom)->iSourceid; + ((mng_clonp)pChunkto)->iCloneid = ((mng_clonp)pChunkfrom)->iCloneid; + ((mng_clonp)pChunkto)->iClonetype = ((mng_clonp)pChunkfrom)->iClonetype; +#ifdef MNG_OPTIMIZE_CHUNKREADER + ((mng_clonp)pChunkto)->bHasdonotshow = ((mng_clonp)pChunkfrom)->bHasdonotshow; +#endif + ((mng_clonp)pChunkto)->iDonotshow = ((mng_clonp)pChunkfrom)->iDonotshow; + ((mng_clonp)pChunkto)->iConcrete = ((mng_clonp)pChunkfrom)->iConcrete; + ((mng_clonp)pChunkto)->bHasloca = ((mng_clonp)pChunkfrom)->bHasloca; + ((mng_clonp)pChunkto)->iLocationtype = ((mng_clonp)pChunkfrom)->iLocationtype; + ((mng_clonp)pChunkto)->iLocationx = ((mng_clonp)pChunkfrom)->iLocationx; + ((mng_clonp)pChunkto)->iLocationy = ((mng_clonp)pChunkfrom)->iLocationy; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +ASSIGN_CHUNK_HDR (mng_assign_past) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PAST, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_PAST) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_pastp)pChunkto)->iDestid = ((mng_pastp)pChunkfrom)->iDestid; + ((mng_pastp)pChunkto)->iTargettype = ((mng_pastp)pChunkfrom)->iTargettype; + ((mng_pastp)pChunkto)->iTargetx = ((mng_pastp)pChunkfrom)->iTargetx; + ((mng_pastp)pChunkto)->iTargety = ((mng_pastp)pChunkfrom)->iTargety; + ((mng_pastp)pChunkto)->iCount = ((mng_pastp)pChunkfrom)->iCount; + + if (((mng_pastp)pChunkto)->iCount) + { + mng_uint32 iLen = ((mng_pastp)pChunkto)->iCount * sizeof (mng_past_source); + + MNG_ALLOC (pData, ((mng_pastp)pChunkto)->pSources, iLen); + MNG_COPY (((mng_pastp)pChunkto)->pSources, ((mng_pastp)pChunkfrom)->pSources, iLen); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PAST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +ASSIGN_CHUNK_HDR (mng_assign_disc) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DISC, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_DISC) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_discp)pChunkto)->iCount = ((mng_discp)pChunkfrom)->iCount; + + if (((mng_discp)pChunkto)->iCount) + { + mng_uint32 iLen = ((mng_discp)pChunkto)->iCount * sizeof (mng_uint16); + + MNG_ALLOC (pData, ((mng_discp)pChunkto)->pObjectids, iLen); + MNG_COPY (((mng_discp)pChunkto)->pObjectids, ((mng_discp)pChunkfrom)->pObjectids, iLen); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DISC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_BACK +ASSIGN_CHUNK_HDR (mng_assign_back) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_BACK, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_BACK) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_backp)pChunkto)->iRed = ((mng_backp)pChunkfrom)->iRed; + ((mng_backp)pChunkto)->iGreen = ((mng_backp)pChunkfrom)->iGreen; + ((mng_backp)pChunkto)->iBlue = ((mng_backp)pChunkfrom)->iBlue; + ((mng_backp)pChunkto)->iMandatory = ((mng_backp)pChunkfrom)->iMandatory; + ((mng_backp)pChunkto)->iImageid = ((mng_backp)pChunkfrom)->iImageid; + ((mng_backp)pChunkto)->iTile = ((mng_backp)pChunkfrom)->iTile; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +ASSIGN_CHUNK_HDR (mng_assign_fram) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_FRAM, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_FRAM) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_framp)pChunkto)->bEmpty = ((mng_framp)pChunkfrom)->bEmpty; + ((mng_framp)pChunkto)->iMode = ((mng_framp)pChunkfrom)->iMode; + ((mng_framp)pChunkto)->iNamesize = ((mng_framp)pChunkfrom)->iNamesize; + ((mng_framp)pChunkto)->iChangedelay = ((mng_framp)pChunkfrom)->iChangedelay; + ((mng_framp)pChunkto)->iChangetimeout = ((mng_framp)pChunkfrom)->iChangetimeout; + ((mng_framp)pChunkto)->iChangeclipping = ((mng_framp)pChunkfrom)->iChangeclipping; + ((mng_framp)pChunkto)->iChangesyncid = ((mng_framp)pChunkfrom)->iChangesyncid; + ((mng_framp)pChunkto)->iDelay = ((mng_framp)pChunkfrom)->iDelay; + ((mng_framp)pChunkto)->iTimeout = ((mng_framp)pChunkfrom)->iTimeout; + ((mng_framp)pChunkto)->iBoundarytype = ((mng_framp)pChunkfrom)->iBoundarytype; + ((mng_framp)pChunkto)->iBoundaryl = ((mng_framp)pChunkfrom)->iBoundaryl; + ((mng_framp)pChunkto)->iBoundaryr = ((mng_framp)pChunkfrom)->iBoundaryr; + ((mng_framp)pChunkto)->iBoundaryt = ((mng_framp)pChunkfrom)->iBoundaryt; + ((mng_framp)pChunkto)->iBoundaryb = ((mng_framp)pChunkfrom)->iBoundaryb; + ((mng_framp)pChunkto)->iCount = ((mng_framp)pChunkfrom)->iCount; + + if (((mng_framp)pChunkto)->iNamesize) + { + MNG_ALLOC (pData, ((mng_framp)pChunkto)->zName, ((mng_framp)pChunkto)->iNamesize); + MNG_COPY (((mng_framp)pChunkto)->zName, ((mng_framp)pChunkfrom)->zName, + ((mng_framp)pChunkto)->iNamesize); + } + + if (((mng_framp)pChunkto)->iCount) + { + mng_uint32 iLen = ((mng_framp)pChunkto)->iCount * sizeof (mng_uint32); + + MNG_ALLOC (pData, ((mng_framp)pChunkto)->pSyncids, iLen); + MNG_COPY (((mng_framp)pChunkto)->pSyncids, ((mng_framp)pChunkfrom)->pSyncids, iLen); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_FRAM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_MOVE +ASSIGN_CHUNK_HDR (mng_assign_move) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MOVE, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_MOVE) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_movep)pChunkto)->iFirstid = ((mng_movep)pChunkfrom)->iFirstid; + ((mng_movep)pChunkto)->iLastid = ((mng_movep)pChunkfrom)->iLastid; + ((mng_movep)pChunkto)->iMovetype = ((mng_movep)pChunkfrom)->iMovetype; + ((mng_movep)pChunkto)->iMovex = ((mng_movep)pChunkfrom)->iMovex; + ((mng_movep)pChunkto)->iMovey = ((mng_movep)pChunkfrom)->iMovey; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MOVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_CLIP +ASSIGN_CHUNK_HDR (mng_assign_clip) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_CLIP, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_CLIP) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_clipp)pChunkto)->iFirstid = ((mng_clipp)pChunkfrom)->iFirstid; + ((mng_clipp)pChunkto)->iLastid = ((mng_clipp)pChunkfrom)->iLastid; + ((mng_clipp)pChunkto)->iCliptype = ((mng_clipp)pChunkfrom)->iCliptype; + ((mng_clipp)pChunkto)->iClipl = ((mng_clipp)pChunkfrom)->iClipl; + ((mng_clipp)pChunkto)->iClipr = ((mng_clipp)pChunkfrom)->iClipr; + ((mng_clipp)pChunkto)->iClipt = ((mng_clipp)pChunkfrom)->iClipt; + ((mng_clipp)pChunkto)->iClipb = ((mng_clipp)pChunkfrom)->iClipb; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_CLIP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_SHOW +ASSIGN_CHUNK_HDR (mng_assign_show) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SHOW, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_SHOW) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_showp)pChunkto)->bEmpty = ((mng_showp)pChunkfrom)->bEmpty; + ((mng_showp)pChunkto)->iFirstid = ((mng_showp)pChunkfrom)->iFirstid; + ((mng_showp)pChunkto)->iLastid = ((mng_showp)pChunkfrom)->iLastid; + ((mng_showp)pChunkto)->iMode = ((mng_showp)pChunkfrom)->iMode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_TERM +ASSIGN_CHUNK_HDR (mng_assign_term) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_TERM, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_TERM) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_termp)pChunkto)->iTermaction = ((mng_termp)pChunkfrom)->iTermaction; + ((mng_termp)pChunkto)->iIteraction = ((mng_termp)pChunkfrom)->iIteraction; + ((mng_termp)pChunkto)->iDelay = ((mng_termp)pChunkfrom)->iDelay; + ((mng_termp)pChunkto)->iItermax = ((mng_termp)pChunkfrom)->iItermax; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +ASSIGN_CHUNK_HDR (mng_assign_save) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SAVE, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_SAVE) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_savep)pChunkto)->bEmpty = ((mng_savep)pChunkfrom)->bEmpty; + ((mng_savep)pChunkto)->iOffsettype = ((mng_savep)pChunkfrom)->iOffsettype; + ((mng_savep)pChunkto)->iCount = ((mng_savep)pChunkfrom)->iCount; + + if (((mng_savep)pChunkto)->iCount) + { + mng_uint32 iX; + mng_save_entryp pEntry; + mng_uint32 iLen = ((mng_savep)pChunkto)->iCount * sizeof (mng_save_entry); + + MNG_ALLOC (pData, ((mng_savep)pChunkto)->pEntries, iLen); + MNG_COPY (((mng_savep)pChunkto)->pEntries, ((mng_savep)pChunkfrom)->pEntries, iLen); + + pEntry = ((mng_savep)pChunkto)->pEntries; + + for (iX = 0; iX < ((mng_savep)pChunkto)->iCount; iX++) + { + if (pEntry->iNamesize) + { + mng_pchar pTemp = pEntry->zName; + + MNG_ALLOC (pData, pEntry->zName, pEntry->iNamesize); + MNG_COPY (pEntry->zName, pTemp, pEntry->iNamesize); + } + else + { + pEntry->zName = MNG_NULL; + } + + pEntry++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +ASSIGN_CHUNK_HDR (mng_assign_seek) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SEEK, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_SEEK) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_seekp)pChunkto)->iNamesize = ((mng_seekp)pChunkfrom)->iNamesize; + + if (((mng_seekp)pChunkto)->iNamesize) + { + MNG_ALLOC (pData, ((mng_seekp)pChunkto)->zName, ((mng_seekp)pChunkto)->iNamesize); + MNG_COPY (((mng_seekp)pChunkto)->zName, ((mng_seekp)pChunkfrom)->zName, + ((mng_seekp)pChunkto)->iNamesize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_SEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +ASSIGN_CHUNK_HDR (mng_assign_expi) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_EXPI, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_eXPI) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_expip)pChunkto)->iSnapshotid = ((mng_expip)pChunkfrom)->iSnapshotid; + ((mng_expip)pChunkto)->iNamesize = ((mng_expip)pChunkfrom)->iNamesize; + + if (((mng_expip)pChunkto)->iNamesize) + { + MNG_ALLOC (pData, ((mng_expip)pChunkto)->zName, ((mng_expip)pChunkto)->iNamesize); + MNG_COPY (((mng_expip)pChunkto)->zName, ((mng_expip)pChunkfrom)->zName, + ((mng_expip)pChunkto)->iNamesize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_EXPI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_fPRI +ASSIGN_CHUNK_HDR (mng_assign_fpri) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_FPRI, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_fPRI) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_fprip)pChunkto)->iDeltatype = ((mng_fprip)pChunkfrom)->iDeltatype; + ((mng_fprip)pChunkto)->iPriority = ((mng_fprip)pChunkfrom)->iPriority; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_FPRI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +ASSIGN_CHUNK_HDR (mng_assign_need) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_NEED, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_nEED) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_needp)pChunkto)->iKeywordssize = ((mng_needp)pChunkfrom)->iKeywordssize; + + if (((mng_needp)pChunkto)->iKeywordssize) + { + MNG_ALLOC (pData, ((mng_needp)pChunkto)->zKeywords, ((mng_needp)pChunkto)->iKeywordssize); + MNG_COPY (((mng_needp)pChunkto)->zKeywords, ((mng_needp)pChunkfrom)->zKeywords, + ((mng_needp)pChunkto)->iKeywordssize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_NEED, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_pHYg +ASSIGN_CHUNK_HDR (mng_assign_phyg) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PHYG, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_pHYg) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_phygp)pChunkto)->bEmpty = ((mng_phygp)pChunkfrom)->bEmpty; + ((mng_phygp)pChunkto)->iSizex = ((mng_phygp)pChunkfrom)->iSizex; + ((mng_phygp)pChunkto)->iSizey = ((mng_phygp)pChunkfrom)->iSizey; + ((mng_phygp)pChunkto)->iUnit = ((mng_phygp)pChunkfrom)->iUnit; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PHYG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifdef MNG_INCLUDE_JNG +ASSIGN_CHUNK_HDR (mng_assign_jhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_JHDR, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_JHDR) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_jhdrp)pChunkto)->iWidth = ((mng_jhdrp)pChunkfrom)->iWidth; + ((mng_jhdrp)pChunkto)->iHeight = ((mng_jhdrp)pChunkfrom)->iHeight; + ((mng_jhdrp)pChunkto)->iColortype = ((mng_jhdrp)pChunkfrom)->iColortype; + ((mng_jhdrp)pChunkto)->iImagesampledepth = ((mng_jhdrp)pChunkfrom)->iImagesampledepth; + ((mng_jhdrp)pChunkto)->iImagecompression = ((mng_jhdrp)pChunkfrom)->iImagecompression; + ((mng_jhdrp)pChunkto)->iImageinterlace = ((mng_jhdrp)pChunkfrom)->iImageinterlace; + ((mng_jhdrp)pChunkto)->iAlphasampledepth = ((mng_jhdrp)pChunkfrom)->iAlphasampledepth; + ((mng_jhdrp)pChunkto)->iAlphacompression = ((mng_jhdrp)pChunkfrom)->iAlphacompression; + ((mng_jhdrp)pChunkto)->iAlphafilter = ((mng_jhdrp)pChunkfrom)->iAlphafilter; + ((mng_jhdrp)pChunkto)->iAlphainterlace = ((mng_jhdrp)pChunkfrom)->iAlphainterlace; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_JHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +ASSIGN_CHUNK_HDR (mng_assign_jdaa) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_JDAA, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_JDAA) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_jdaap)pChunkto)->bEmpty = ((mng_jdaap)pChunkfrom)->bEmpty; + ((mng_jdaap)pChunkto)->iDatasize = ((mng_jdaap)pChunkfrom)->iDatasize; + + if (((mng_jdaap)pChunkto)->iDatasize) + { + MNG_ALLOC (pData, ((mng_jdaap)pChunkto)->pData, ((mng_jdaap)pChunkto)->iDatasize); + MNG_COPY (((mng_jdaap)pChunkto)->pData, ((mng_jdaap)pChunkfrom)->pData, + ((mng_jdaap)pChunkto)->iDatasize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_JDAA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +ASSIGN_CHUNK_HDR (mng_assign_jdat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_JDAT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_JDAT) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_jdatp)pChunkto)->bEmpty = ((mng_jdatp)pChunkfrom)->bEmpty; + ((mng_jdatp)pChunkto)->iDatasize = ((mng_jdatp)pChunkfrom)->iDatasize; + + if (((mng_jdatp)pChunkto)->iDatasize) + { + MNG_ALLOC (pData, ((mng_jdatp)pChunkto)->pData, ((mng_jdatp)pChunkto)->iDatasize); + MNG_COPY (((mng_jdatp)pChunkto)->pData, ((mng_jdatp)pChunkfrom)->pData, + ((mng_jdatp)pChunkto)->iDatasize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_JDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifdef MNG_INCLUDE_JNG +ASSIGN_CHUNK_HDR (mng_assign_jsep) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_JSEP, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_JSEP) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_JSEP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_NO_DELTA_PNG +ASSIGN_CHUNK_HDR (mng_assign_dhdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DHDR, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_DHDR) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_dhdrp)pChunkto)->iObjectid = ((mng_dhdrp)pChunkfrom)->iObjectid; + ((mng_dhdrp)pChunkto)->iImagetype = ((mng_dhdrp)pChunkfrom)->iImagetype; + ((mng_dhdrp)pChunkto)->iDeltatype = ((mng_dhdrp)pChunkfrom)->iDeltatype; + ((mng_dhdrp)pChunkto)->iBlockwidth = ((mng_dhdrp)pChunkfrom)->iBlockwidth; + ((mng_dhdrp)pChunkto)->iBlockheight = ((mng_dhdrp)pChunkfrom)->iBlockheight; + ((mng_dhdrp)pChunkto)->iBlockx = ((mng_dhdrp)pChunkfrom)->iBlockx; + ((mng_dhdrp)pChunkto)->iBlocky = ((mng_dhdrp)pChunkfrom)->iBlocky; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_NO_DELTA_PNG +ASSIGN_CHUNK_HDR (mng_assign_prom) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PROM, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_PROM) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_promp)pChunkto)->iColortype = ((mng_promp)pChunkfrom)->iColortype; + ((mng_promp)pChunkto)->iSampledepth = ((mng_promp)pChunkfrom)->iSampledepth; + ((mng_promp)pChunkto)->iFilltype = ((mng_promp)pChunkfrom)->iFilltype; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PROM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_NO_DELTA_PNG +ASSIGN_CHUNK_HDR (mng_assign_ipng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IPNG, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_IPNG) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_NO_DELTA_PNG +ASSIGN_CHUNK_HDR (mng_assign_pplt) +{ + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PPLT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_PPLT) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_ppltp)pChunkto)->iDeltatype = ((mng_ppltp)pChunkfrom)->iDeltatype; + ((mng_ppltp)pChunkto)->iCount = ((mng_ppltp)pChunkfrom)->iCount; + + for (iX = 0; iX < ((mng_ppltp)pChunkto)->iCount; iX++) + ((mng_ppltp)pChunkto)->aEntries [iX] = ((mng_ppltp)pChunkfrom)->aEntries [iX]; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_PPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +ASSIGN_CHUNK_HDR (mng_assign_ijng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IJNG, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_IJNG) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +ASSIGN_CHUNK_HDR (mng_assign_drop) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DROP, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_DROP) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_dropp)pChunkto)->iCount = ((mng_dropp)pChunkfrom)->iCount; + + if (((mng_dropp)pChunkto)->iCount) + { + mng_uint32 iLen = ((mng_dropp)pChunkto)->iCount * sizeof (mng_uint32); + + MNG_ALLOC (pData, ((mng_dropp)pChunkto)->pChunknames, iLen); + MNG_COPY (((mng_dropp)pChunkto)->pChunknames, ((mng_dropp)pChunkfrom)->pChunknames, iLen); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DROP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +ASSIGN_CHUNK_HDR (mng_assign_dbyk) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DBYK, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_DBYK) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_dbykp)pChunkto)->iChunkname = ((mng_dbykp)pChunkfrom)->iChunkname; + ((mng_dbykp)pChunkto)->iPolarity = ((mng_dbykp)pChunkfrom)->iPolarity; + ((mng_dbykp)pChunkto)->iKeywordssize = ((mng_dbykp)pChunkfrom)->iKeywordssize; + + if (((mng_dbykp)pChunkto)->iKeywordssize) + { + MNG_ALLOC (pData, ((mng_dbykp)pChunkto)->zKeywords, ((mng_dbykp)pChunkto)->iKeywordssize); + MNG_COPY (((mng_dbykp)pChunkto)->zKeywords, ((mng_dbykp)pChunkfrom)->zKeywords, + ((mng_dbykp)pChunkto)->iKeywordssize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_DBYK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +ASSIGN_CHUNK_HDR (mng_assign_ordr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ORDR, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_ORDR) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_ordrp)pChunkto)->iCount = ((mng_ordrp)pChunkfrom)->iCount; + + if (((mng_ordrp)pChunkto)->iCount) + { + mng_uint32 iLen = ((mng_ordrp)pChunkto)->iCount * sizeof (mng_ordr_entry); + + MNG_ALLOC (pData, ((mng_ordrp)pChunkto)->pEntries, iLen); + MNG_COPY (((mng_ordrp)pChunkto)->pEntries, ((mng_ordrp)pChunkfrom)->pEntries, iLen); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ORDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKASSIGN +#ifndef MNG_SKIPCHUNK_MAGN +ASSIGN_CHUNK_HDR (mng_assign_magn) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MAGN, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_MAGN) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_magnp)pChunkto)->iFirstid = ((mng_magnp)pChunkfrom)->iFirstid; + ((mng_magnp)pChunkto)->iLastid = ((mng_magnp)pChunkfrom)->iLastid; + ((mng_magnp)pChunkto)->iMethodX = ((mng_magnp)pChunkfrom)->iMethodX; + ((mng_magnp)pChunkto)->iMX = ((mng_magnp)pChunkfrom)->iMX; + ((mng_magnp)pChunkto)->iMY = ((mng_magnp)pChunkfrom)->iMY; + ((mng_magnp)pChunkto)->iML = ((mng_magnp)pChunkfrom)->iML; + ((mng_magnp)pChunkto)->iMR = ((mng_magnp)pChunkfrom)->iMR; + ((mng_magnp)pChunkto)->iMT = ((mng_magnp)pChunkfrom)->iMT; + ((mng_magnp)pChunkto)->iMB = ((mng_magnp)pChunkfrom)->iMB; + ((mng_magnp)pChunkto)->iMethodY = ((mng_magnp)pChunkfrom)->iMethodY; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +ASSIGN_CHUNK_HDR (mng_assign_mpng) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MPNG, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_mpNG) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_mpngp)pChunkto)->iFramewidth = ((mng_mpngp)pChunkfrom)->iFramewidth; + ((mng_mpngp)pChunkto)->iFrameheight = ((mng_mpngp)pChunkfrom)->iFrameheight; + ((mng_mpngp)pChunkto)->iNumplays = ((mng_mpngp)pChunkfrom)->iNumplays; + ((mng_mpngp)pChunkto)->iTickspersec = ((mng_mpngp)pChunkfrom)->iTickspersec; + ((mng_mpngp)pChunkto)->iCompressionmethod = ((mng_mpngp)pChunkfrom)->iCompressionmethod; + ((mng_mpngp)pChunkto)->iFramessize = ((mng_mpngp)pChunkfrom)->iFramessize; + + if (((mng_mpngp)pChunkto)->iFramessize) + { + MNG_ALLOC (pData, ((mng_mpngp)pChunkto)->pFrames, ((mng_mpngp)pChunkto)->iFramessize); + MNG_COPY (((mng_mpngp)pChunkto)->pFrames, ((mng_mpngp)pChunkfrom)->pFrames, + ((mng_mpngp)pChunkto)->iFramessize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_MPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +ASSIGN_CHUNK_HDR (mng_assign_ahdr) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_AHDR, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_ahDR) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_ahdrp)pChunkto)->iNumframes = ((mng_ahdrp)pChunkfrom)->iNumframes; + ((mng_ahdrp)pChunkto)->iTickspersec = ((mng_ahdrp)pChunkfrom)->iTickspersec; + ((mng_ahdrp)pChunkto)->iNumplays = ((mng_ahdrp)pChunkfrom)->iNumplays; + ((mng_ahdrp)pChunkto)->iTilewidth = ((mng_ahdrp)pChunkfrom)->iTilewidth; + ((mng_ahdrp)pChunkto)->iTileheight = ((mng_ahdrp)pChunkfrom)->iTileheight; + ((mng_ahdrp)pChunkto)->iInterlace = ((mng_ahdrp)pChunkfrom)->iInterlace; + ((mng_ahdrp)pChunkto)->iStillused = ((mng_ahdrp)pChunkfrom)->iStillused; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_AHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +ASSIGN_CHUNK_HDR (mng_assign_adat) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ADAT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_adAT) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_adatp)pChunkto)->iTilessize = ((mng_adatp)pChunkfrom)->iTilessize; + + if (((mng_adatp)pChunkto)->iTilessize) + { + MNG_ALLOC (pData, ((mng_adatp)pChunkto)->pTiles, ((mng_adatp)pChunkto)->iTilessize); + MNG_COPY (((mng_adatp)pChunkto)->pTiles, ((mng_adatp)pChunkfrom)->pTiles, + ((mng_adatp)pChunkto)->iTilessize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_ADAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +ASSIGN_CHUNK_HDR (mng_assign_evnt) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_EVNT, MNG_LC_START); +#endif + + if (((mng_chunk_headerp)pChunkfrom)->iChunkname != MNG_UINT_evNT) + MNG_ERROR (pData, MNG_WRONGCHUNK); /* ouch */ + + ((mng_evntp)pChunkto)->iCount = ((mng_evntp)pChunkfrom)->iCount; + + if (((mng_evntp)pChunkto)->iCount) + { + mng_uint32 iX; + mng_evnt_entryp pEntry; + mng_uint32 iLen = ((mng_evntp)pChunkto)->iCount * sizeof (mng_evnt_entry); + + MNG_ALLOC (pData, ((mng_evntp)pChunkto)->pEntries, iLen); + MNG_COPY (((mng_evntp)pChunkto)->pEntries, ((mng_evntp)pChunkfrom)->pEntries, iLen); + + pEntry = ((mng_evntp)pChunkto)->pEntries; + + for (iX = 0; iX < ((mng_evntp)pChunkto)->iCount; iX++) + { + if (pEntry->iSegmentnamesize) + { + mng_pchar pTemp = pEntry->zSegmentname; + + MNG_ALLOC (pData, pEntry->zSegmentname, pEntry->iSegmentnamesize+1); + MNG_COPY (pEntry->zSegmentname, pTemp, pEntry->iSegmentnamesize); + } + else + { + pEntry->zSegmentname = MNG_NULL; + } + + pEntry++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_EVNT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +ASSIGN_CHUNK_HDR (mng_assign_unknown) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_UNKNOWN, MNG_LC_START); +#endif + + ((mng_unknown_chunkp)pChunkto)->iDatasize = ((mng_unknown_chunkp)pChunkfrom)->iDatasize; + + if (((mng_unknown_chunkp)pChunkto)->iDatasize) + { + MNG_ALLOC (pData, ((mng_unknown_chunkp)pChunkto)->pData, ((mng_unknown_chunkp)pChunkto)->iDatasize); + MNG_COPY (((mng_unknown_chunkp)pChunkto)->pData, ((mng_unknown_chunkp)pChunkfrom)->pData, + ((mng_unknown_chunkp)pChunkto)->iDatasize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ASSIGN_UNKNOWN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_chunk_prc.h b/src/3rdparty/libmng/libmng_chunk_prc.h new file mode 100644 index 0000000000..0cf0f3c1d5 --- /dev/null +++ b/src/3rdparty/libmng/libmng_chunk_prc.h @@ -0,0 +1,381 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_chunk_prc.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Chunk initialization & cleanup (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : definition of the chunk initialization & cleanup routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added support for JDAA * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added NO_DELTA_PNG support * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKINITFREE * */ +/* * 1.0.9 - 12/06/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKASSIGN * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_chunk_prc_h_ +#define _libmng_chunk_prc_h_ + +/* ************************************************************************** */ + +void mng_add_chunk (mng_datap pData, + mng_chunkp pChunk); + +/* ************************************************************************** */ + +#define INIT_CHUNK_HDR(n) mng_retcode n (mng_datap pData, \ + mng_chunkp pHeader, \ + mng_chunkp* ppChunk) + +#ifdef MNG_OPTIMIZE_CHUNKINITFREE +INIT_CHUNK_HDR (mng_init_general) ; +#else +INIT_CHUNK_HDR (mng_init_ihdr) ; +INIT_CHUNK_HDR (mng_init_plte) ; +INIT_CHUNK_HDR (mng_init_idat) ; +INIT_CHUNK_HDR (mng_init_iend) ; +INIT_CHUNK_HDR (mng_init_trns) ; +INIT_CHUNK_HDR (mng_init_gama) ; +INIT_CHUNK_HDR (mng_init_chrm) ; +INIT_CHUNK_HDR (mng_init_srgb) ; +INIT_CHUNK_HDR (mng_init_iccp) ; +INIT_CHUNK_HDR (mng_init_text) ; +INIT_CHUNK_HDR (mng_init_ztxt) ; +INIT_CHUNK_HDR (mng_init_itxt) ; +INIT_CHUNK_HDR (mng_init_bkgd) ; +INIT_CHUNK_HDR (mng_init_phys) ; +INIT_CHUNK_HDR (mng_init_sbit) ; +INIT_CHUNK_HDR (mng_init_splt) ; +INIT_CHUNK_HDR (mng_init_hist) ; +INIT_CHUNK_HDR (mng_init_time) ; +INIT_CHUNK_HDR (mng_init_mhdr) ; +INIT_CHUNK_HDR (mng_init_mend) ; +INIT_CHUNK_HDR (mng_init_loop) ; +INIT_CHUNK_HDR (mng_init_endl) ; +INIT_CHUNK_HDR (mng_init_defi) ; +INIT_CHUNK_HDR (mng_init_basi) ; +INIT_CHUNK_HDR (mng_init_clon) ; +#ifndef MNG_SKIPCHUNK_PAST +INIT_CHUNK_HDR (mng_init_past) ; +#endif +INIT_CHUNK_HDR (mng_init_disc) ; +INIT_CHUNK_HDR (mng_init_back) ; +INIT_CHUNK_HDR (mng_init_fram) ; +INIT_CHUNK_HDR (mng_init_move) ; +INIT_CHUNK_HDR (mng_init_clip) ; +INIT_CHUNK_HDR (mng_init_show) ; +INIT_CHUNK_HDR (mng_init_term) ; +INIT_CHUNK_HDR (mng_init_save) ; +INIT_CHUNK_HDR (mng_init_seek) ; +INIT_CHUNK_HDR (mng_init_expi) ; +INIT_CHUNK_HDR (mng_init_fpri) ; +INIT_CHUNK_HDR (mng_init_need) ; +INIT_CHUNK_HDR (mng_init_phyg) ; +#ifdef MNG_INCLUDE_JNG +INIT_CHUNK_HDR (mng_init_jhdr) ; +INIT_CHUNK_HDR (mng_init_jdaa) ; +INIT_CHUNK_HDR (mng_init_jdat) ; +INIT_CHUNK_HDR (mng_init_jsep) ; +#endif +#ifndef MNG_NO_DELTA_PNG +INIT_CHUNK_HDR (mng_init_dhdr) ; +INIT_CHUNK_HDR (mng_init_prom) ; +INIT_CHUNK_HDR (mng_init_ipng) ; +INIT_CHUNK_HDR (mng_init_pplt) ; +#ifdef MNG_INCLUDE_JNG +INIT_CHUNK_HDR (mng_init_ijng) ; +#endif +INIT_CHUNK_HDR (mng_init_drop) ; +INIT_CHUNK_HDR (mng_init_dbyk) ; +INIT_CHUNK_HDR (mng_init_ordr) ; +#endif +INIT_CHUNK_HDR (mng_init_magn) ; +INIT_CHUNK_HDR (mng_init_evnt) ; +INIT_CHUNK_HDR (mng_init_unknown) ; +#endif /* MNG_OPTIMIZE_CHUNKINITFREE */ + +/* ************************************************************************** */ + +#define FREE_CHUNK_HDR(n) mng_retcode n (mng_datap pData, \ + mng_chunkp pHeader) + +#ifdef MNG_OPTIMIZE_CHUNKINITFREE +FREE_CHUNK_HDR (mng_free_general) ; +#else /* MNG_OPTIMIZE_CHUNKINITFREE */ +FREE_CHUNK_HDR (mng_free_ihdr) ; +FREE_CHUNK_HDR (mng_free_plte) ; +FREE_CHUNK_HDR (mng_free_iend) ; +FREE_CHUNK_HDR (mng_free_trns) ; +FREE_CHUNK_HDR (mng_free_gama) ; +FREE_CHUNK_HDR (mng_free_chrm) ; +FREE_CHUNK_HDR (mng_free_srgb) ; +FREE_CHUNK_HDR (mng_free_bkgd) ; +FREE_CHUNK_HDR (mng_free_phys) ; +FREE_CHUNK_HDR (mng_free_sbit) ; +FREE_CHUNK_HDR (mng_free_hist) ; +FREE_CHUNK_HDR (mng_free_time) ; +FREE_CHUNK_HDR (mng_free_mhdr) ; +FREE_CHUNK_HDR (mng_free_mend) ; +FREE_CHUNK_HDR (mng_free_endl) ; +FREE_CHUNK_HDR (mng_free_defi) ; +FREE_CHUNK_HDR (mng_free_basi) ; +FREE_CHUNK_HDR (mng_free_clon) ; +FREE_CHUNK_HDR (mng_free_back) ; +FREE_CHUNK_HDR (mng_free_move) ; +FREE_CHUNK_HDR (mng_free_clip) ; +FREE_CHUNK_HDR (mng_free_show) ; +FREE_CHUNK_HDR (mng_free_term) ; +FREE_CHUNK_HDR (mng_free_fpri) ; +FREE_CHUNK_HDR (mng_free_phyg) ; +#ifdef MNG_INCLUDE_JNG +FREE_CHUNK_HDR (mng_free_jhdr) ; +FREE_CHUNK_HDR (mng_free_jsep) ; +#endif +#ifndef MNG_NO_DELTA_PNG +FREE_CHUNK_HDR (mng_free_dhdr) ; +FREE_CHUNK_HDR (mng_free_prom) ; +FREE_CHUNK_HDR (mng_free_ipng) ; +FREE_CHUNK_HDR (mng_free_pplt) ; +#ifdef MNG_INCLUDE_JNG +FREE_CHUNK_HDR (mng_free_ijng) ; +#endif +#endif +FREE_CHUNK_HDR (mng_free_magn) ; +#endif /* MNG_OPTIMIZE_CHUNKINITFREE */ + +FREE_CHUNK_HDR (mng_free_idat) ; +FREE_CHUNK_HDR (mng_free_iccp) ; +FREE_CHUNK_HDR (mng_free_text) ; +FREE_CHUNK_HDR (mng_free_ztxt) ; +FREE_CHUNK_HDR (mng_free_itxt) ; +FREE_CHUNK_HDR (mng_free_splt) ; +FREE_CHUNK_HDR (mng_free_loop) ; +#ifndef MNG_SKIPCHUNK_PAST +FREE_CHUNK_HDR (mng_free_past) ; +#endif +FREE_CHUNK_HDR (mng_free_disc) ; +FREE_CHUNK_HDR (mng_free_fram) ; +FREE_CHUNK_HDR (mng_free_save) ; +FREE_CHUNK_HDR (mng_free_seek) ; +FREE_CHUNK_HDR (mng_free_expi) ; +FREE_CHUNK_HDR (mng_free_need) ; +#ifdef MNG_INCLUDE_JNG +FREE_CHUNK_HDR (mng_free_jdaa) ; +FREE_CHUNK_HDR (mng_free_jdat) ; +#endif +#ifndef MNG_NO_DELTA_PNG +FREE_CHUNK_HDR (mng_free_drop) ; +FREE_CHUNK_HDR (mng_free_dbyk) ; +FREE_CHUNK_HDR (mng_free_ordr) ; +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +FREE_CHUNK_HDR (mng_free_mpng) ; +#endif +#ifdef MNG_INCLUDE_ANG_PROPOSAL +FREE_CHUNK_HDR (mng_free_adat) ; +#endif +FREE_CHUNK_HDR (mng_free_evnt) ; +FREE_CHUNK_HDR (mng_free_unknown) ; + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +#define ASSIGN_CHUNK_HDR(n) mng_retcode n (mng_datap pData, \ + mng_chunkp pChunkto, \ + mng_chunkp pChunkfrom) + +#ifdef MNG_OPTIMIZE_CHUNKASSIGN +ASSIGN_CHUNK_HDR (mng_assign_general) ; +#else /* MNG_OPTIMIZE_CHUNKASSIGN */ +ASSIGN_CHUNK_HDR (mng_assign_ihdr) ; +ASSIGN_CHUNK_HDR (mng_assign_plte) ; +ASSIGN_CHUNK_HDR (mng_assign_iend) ; +ASSIGN_CHUNK_HDR (mng_assign_trns) ; +ASSIGN_CHUNK_HDR (mng_assign_gama) ; +ASSIGN_CHUNK_HDR (mng_assign_chrm) ; +ASSIGN_CHUNK_HDR (mng_assign_srgb) ; +ASSIGN_CHUNK_HDR (mng_assign_bkgd) ; +ASSIGN_CHUNK_HDR (mng_assign_phys) ; +ASSIGN_CHUNK_HDR (mng_assign_sbit) ; +ASSIGN_CHUNK_HDR (mng_assign_hist) ; +ASSIGN_CHUNK_HDR (mng_assign_time) ; +ASSIGN_CHUNK_HDR (mng_assign_mhdr) ; +ASSIGN_CHUNK_HDR (mng_assign_mend) ; +ASSIGN_CHUNK_HDR (mng_assign_endl) ; +ASSIGN_CHUNK_HDR (mng_assign_defi) ; +ASSIGN_CHUNK_HDR (mng_assign_basi) ; +ASSIGN_CHUNK_HDR (mng_assign_clon) ; +ASSIGN_CHUNK_HDR (mng_assign_back) ; +ASSIGN_CHUNK_HDR (mng_assign_move) ; +ASSIGN_CHUNK_HDR (mng_assign_clip) ; +ASSIGN_CHUNK_HDR (mng_assign_show) ; +ASSIGN_CHUNK_HDR (mng_assign_term) ; +ASSIGN_CHUNK_HDR (mng_assign_fpri) ; +ASSIGN_CHUNK_HDR (mng_assign_phyg) ; +#ifdef MNG_INCLUDE_JNG +ASSIGN_CHUNK_HDR (mng_assign_jhdr) ; +ASSIGN_CHUNK_HDR (mng_assign_jsep) ; +#endif +#ifndef MNG_NO_DELTA_PNG +ASSIGN_CHUNK_HDR (mng_assign_dhdr) ; +ASSIGN_CHUNK_HDR (mng_assign_prom) ; +ASSIGN_CHUNK_HDR (mng_assign_ipng) ; +ASSIGN_CHUNK_HDR (mng_assign_pplt) ; +#ifdef MNG_INCLUDE_JNG +ASSIGN_CHUNK_HDR (mng_assign_ijng) ; +#endif +#endif +ASSIGN_CHUNK_HDR (mng_assign_magn) ; +#endif /* MNG_OPTIMIZE_CHUNKASSIGN */ + +ASSIGN_CHUNK_HDR (mng_assign_idat) ; +ASSIGN_CHUNK_HDR (mng_assign_iccp) ; +ASSIGN_CHUNK_HDR (mng_assign_text) ; +ASSIGN_CHUNK_HDR (mng_assign_ztxt) ; +ASSIGN_CHUNK_HDR (mng_assign_itxt) ; +ASSIGN_CHUNK_HDR (mng_assign_splt) ; +ASSIGN_CHUNK_HDR (mng_assign_loop) ; +#ifndef MNG_SKIPCHUNK_PAST +ASSIGN_CHUNK_HDR (mng_assign_past) ; +#endif +ASSIGN_CHUNK_HDR (mng_assign_disc) ; +ASSIGN_CHUNK_HDR (mng_assign_fram) ; +ASSIGN_CHUNK_HDR (mng_assign_save) ; +ASSIGN_CHUNK_HDR (mng_assign_seek) ; +ASSIGN_CHUNK_HDR (mng_assign_need) ; +ASSIGN_CHUNK_HDR (mng_assign_expi) ; +#ifdef MNG_INCLUDE_JNG +ASSIGN_CHUNK_HDR (mng_assign_jdaa) ; +ASSIGN_CHUNK_HDR (mng_assign_jdat) ; +#endif +#ifndef MNG_NO_DELTA_PNG +ASSIGN_CHUNK_HDR (mng_assign_drop) ; +ASSIGN_CHUNK_HDR (mng_assign_dbyk) ; +ASSIGN_CHUNK_HDR (mng_assign_ordr) ; +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +ASSIGN_CHUNK_HDR (mng_assign_mpng) ; +#endif +#ifdef MNG_INCLUDE_ANG_PROPOSAL +ASSIGN_CHUNK_HDR (mng_assign_ahdr) ; +ASSIGN_CHUNK_HDR (mng_assign_adat) ; +#endif +ASSIGN_CHUNK_HDR (mng_assign_evnt) ; +ASSIGN_CHUNK_HDR (mng_assign_unknown) ; + +/* ************************************************************************** */ + +#else /* MNG_INCLUDE_WRITE_PROCS */ +#define mng_assign_general 0 +#define mng_assign_ihdr 0 +#define mng_assign_plte 0 +#define mng_assign_idat 0 +#define mng_assign_iend 0 +#define mng_assign_trns 0 +#define mng_assign_gama 0 +#define mng_assign_chrm 0 +#define mng_assign_srgb 0 +#define mng_assign_iccp 0 +#define mng_assign_text 0 +#define mng_assign_ztxt 0 +#define mng_assign_itxt 0 +#define mng_assign_bkgd 0 +#define mng_assign_phys 0 +#define mng_assign_sbit 0 +#define mng_assign_splt 0 +#define mng_assign_hist 0 +#define mng_assign_time 0 +#define mng_assign_mhdr 0 +#define mng_assign_mend 0 +#define mng_assign_loop 0 +#define mng_assign_endl 0 +#define mng_assign_defi 0 +#define mng_assign_basi 0 +#define mng_assign_clon 0 +#ifndef MNG_SKIPCHUNK_PAST +#define mng_assign_past 0 +#endif +#define mng_assign_disc 0 +#define mng_assign_back 0 +#define mng_assign_fram 0 +#define mng_assign_move 0 +#define mng_assign_clip 0 +#define mng_assign_show 0 +#define mng_assign_term 0 +#define mng_assign_save 0 +#define mng_assign_seek 0 +#define mng_assign_expi 0 +#define mng_assign_fpri 0 +#define mng_assign_phyg 0 +#ifdef MNG_INCLUDE_JNG +#define mng_assign_jhdr 0 +#define mng_assign_jdaa 0 +#define mng_assign_jdat 0 +#define mng_assign_jsep 0 +#endif +#ifndef MNG_NO_DELTA_PNG +#define mng_assign_dhdr 0 +#define mng_assign_prom 0 +#define mng_assign_ipng 0 +#define mng_assign_pplt 0 +#ifdef MNG_INCLUDE_JNG +#define mng_assign_ijng 0 +#endif +#define mng_assign_drop 0 +#define mng_assign_dbyk 0 +#define mng_assign_ordr 0 +#endif +#define mng_assign_magn 0 +#define mng_assign_need 0 +#define mng_assign_mpng 0 +#define mng_assign_ahdr 0 +#define mng_assign_adat 0 +#define mng_assign_evnt 0 +#define mng_assign_unknown 0 +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +/* ************************************************************************** */ + +#endif /* _libmng_chunk_prc_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_chunk_xs.c b/src/3rdparty/libmng/libmng_chunk_xs.c new file mode 100644 index 0000000000..13114090d6 --- /dev/null +++ b/src/3rdparty/libmng/libmng_chunk_xs.c @@ -0,0 +1,7016 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_chunk_xs.c copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : chunk access functions (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the chunk access functions * */ +/* * * */ +/* * changes : 0.5.1 - 05/06/2000 - G.Juyn * */ +/* * - changed and filled iterate-chunk function * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - fixed calling convention * */ +/* * - added getchunk functions * */ +/* * - added putchunk functions * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added empty-chunk put-routines * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * 0.5.1 - 05/15/2000 - G.Juyn * */ +/* * - added getimgdata & putimgdata functions * */ +/* * * */ +/* * 0.5.2 - 05/19/2000 - G.Juyn * */ +/* * - B004 - fixed problem with MNG_SUPPORT_WRITE not defined * */ +/* * also for MNG_SUPPORT_WRITE without MNG_INCLUDE_JNG * */ +/* * - Cleaned up some code regarding mixed support * */ +/* * * */ +/* * 0.9.1 - 07/19/2000 - G.Juyn * */ +/* * - fixed creation-code * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * - added function to set simplicity field * */ +/* * - fixed putchunk_unknown() function * */ +/* * * */ +/* * 0.9.3 - 08/07/2000 - G.Juyn * */ +/* * - B111300 - fixup for improved portability * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 10/20/2000 - G.Juyn * */ +/* * - fixed putchunk_plte() to set bEmpty parameter * */ +/* * * */ +/* * 0.9.5 - 01/25/2001 - G.Juyn * */ +/* * - fixed some small compiler warnings (thanks Nikki) * */ +/* * * */ +/* * 1.0.5 - 09/07/2002 - G.Juyn * */ +/* * - B578940 - unimplemented functions return errorcode * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * - added HLAPI function to copy chunks * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - added check for TERM placement during create/write * */ +/* * 1.0.5 - 11/28/2002 - G.Juyn * */ +/* * - fixed definition of iMethodX/Y for MAGN chunk * */ +/* * * */ +/* * 1.0.6 - 05/25/2003 - G.R-P * */ +/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added MNG_NO_DELTA_PNG reduction and more SKIPCHUNK * */ +/* * optimizations * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * 1.0.6 - 08/17/2003 - G.R-P * */ +/* * - added conditionals around non-VLC chunk support * */ +/* * * */ +/* * 1.0.8 - 04/01/2004 - G.Juyn * */ +/* * - added missing get-/put-chunk-jdaa * */ +/* * 1.0.8 - 08/02/2004 - G.Juyn * */ +/* * - added conditional to allow easier writing of large MNG's * */ +/* * * */ +/* * 1.0.9 - 09/17/2004 - G.R-P * */ +/* * - added two more conditionals * */ +/* * 1.0.9 - 09/25/2004 - G.Juyn * */ +/* * - replaced MNG_TWEAK_LARGE_FILES with permanent solution * */ +/* * 1.0.9 - 17/14/2004 - G.Juyn * */ +/* * - fixed PPLT getchunk/putchunk routines * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKINITFREE * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_memory.h" +#include "libmng_chunks.h" +#ifdef MNG_OPTIMIZE_CHUNKREADER +#include "libmng_chunk_descr.h" +#endif +#include "libmng_chunk_prc.h" +#include "libmng_chunk_io.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_ACCESS_CHUNKS + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_iterate_chunks (mng_handle hHandle, + mng_uint32 iChunkseq, + mng_iteratechunk fProc) +{ + mng_uint32 iSeq; + mng_chunkid iChunkname; + mng_datap pData; + mng_chunkp pChunk; + mng_bool bCont; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_ITERATE_CHUNKS, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + + iSeq = 0; + bCont = MNG_TRUE; + pChunk = pData->pFirstchunk; /* get the first chunk */ + /* as long as there are some more */ + while ((pChunk) && (bCont)) /* and the app didn't signal a stop */ + { + if (iSeq >= iChunkseq) /* reached the first target ? */ + { /* then call this and next ones back in... */ + iChunkname = ((mng_chunk_headerp)pChunk)->iChunkname; + bCont = fProc (hHandle, (mng_handle)pChunk, iChunkname, iSeq); + } + + iSeq++; /* next one */ + pChunk = ((mng_chunk_headerp)pChunk)->pNext; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_ITERATE_CHUNKS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_copy_chunk (mng_handle hHandle, + mng_handle hChunk, + mng_handle hHandleOut) +{ + mng_datap pDataOut; + mng_chunkp pChunk; + mng_chunkp pChunkOut; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_COPY_CHUNK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handles */ + MNG_VALIDHANDLE (hHandleOut) + + pDataOut = (mng_datap)hHandleOut; /* make outhandle addressable */ + pChunk = (mng_chunkp)hChunk; /* address the chunk */ + + if (!pDataOut->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pDataOut, MNG_FUNCTIONINVALID) + /* create a new chunk */ + iRetcode = ((mng_createchunk)((mng_chunk_headerp)pChunk)->fCreate) + (pDataOut, ((mng_chunk_headerp)pChunk), &pChunkOut); + if (!iRetcode) /* assign the chunk-specific data */ + iRetcode = ((mng_assignchunk)((mng_chunk_headerp)pChunk)->fAssign) + (pDataOut, pChunkOut, pChunk); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + mng_add_chunk (pDataOut, pChunkOut); /* and put it in the output-stream */ + + /* could it be the end of the chain ? */ + if (((mng_chunk_headerp)pChunkOut)->iChunkname == MNG_UINT_IEND) + { +#ifdef MNG_INCLUDE_JNG + if ((pDataOut->iFirstchunkadded == MNG_UINT_IHDR) || + (pDataOut->iFirstchunkadded == MNG_UINT_JHDR) ) +#else + if (pDataOut->iFirstchunkadded == MNG_UINT_IHDR) +#endif + pDataOut->bCreating = MNG_FALSE; /* right; this should be the last chunk !!! */ + } + + if (((mng_chunk_headerp)pChunkOut)->iChunkname == MNG_UINT_MEND) + pDataOut->bCreating = MNG_FALSE; /* definitely this should be the last !!! */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_COPY_CHUNK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_ihdr (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_uint8 *iBitdepth, + mng_uint8 *iColortype, + mng_uint8 *iCompression, + mng_uint8 *iFilter, + mng_uint8 *iInterlace) +{ + mng_datap pData; + mng_ihdrp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_IHDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_ihdrp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_IHDR) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iWidth = pChunk->iWidth; /* fill the fields */ + *iHeight = pChunk->iHeight; + *iBitdepth = pChunk->iBitdepth; + *iColortype = pChunk->iColortype; + *iCompression = pChunk->iCompression; + *iFilter = pChunk->iFilter; + *iInterlace = pChunk->iInterlace; + + /* fill the chunk */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_IHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_plte (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount, + mng_palette8 *aPalette) +{ + mng_datap pData; + mng_pltep pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PLTE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_pltep)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_PLTE) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iCount = pChunk->iEntrycount; /* fill the fields */ + + MNG_COPY (*aPalette, pChunk->aEntries, sizeof (mng_palette8)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_idat (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iRawlen, + mng_ptr *pRawdata) +{ + mng_datap pData; + mng_idatp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_IDAT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_idatp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_IDAT) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iRawlen = pChunk->iDatasize; /* fill the fields */ + *pRawdata = pChunk->pData; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_IDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_trns (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_bool *bGlobal, + mng_uint8 *iType, + mng_uint32 *iCount, + mng_uint8arr *aAlphas, + mng_uint16 *iGray, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue, + mng_uint32 *iRawlen, + mng_uint8arr *aRawdata) +{ + mng_datap pData; + mng_trnsp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TRNS, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_trnsp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_tRNS) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *bGlobal = pChunk->bGlobal; + *iType = pChunk->iType; + *iCount = pChunk->iCount; + *iGray = pChunk->iGray; + *iRed = pChunk->iRed; + *iGreen = pChunk->iGreen; + *iBlue = pChunk->iBlue; + *iRawlen = pChunk->iRawlen; + + MNG_COPY (*aAlphas, pChunk->aEntries, sizeof (mng_uint8arr)); + MNG_COPY (*aRawdata, pChunk->aRawdata, sizeof (mng_uint8arr)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_gAMA +mng_retcode MNG_DECL mng_getchunk_gama (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iGamma) +{ + mng_datap pData; + mng_gamap pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_GAMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_gamap)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_gAMA) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iGamma = pChunk->iGamma; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +mng_retcode MNG_DECL mng_getchunk_chrm (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iWhitepointx, + mng_uint32 *iWhitepointy, + mng_uint32 *iRedx, + mng_uint32 *iRedy, + mng_uint32 *iGreenx, + mng_uint32 *iGreeny, + mng_uint32 *iBluex, + mng_uint32 *iBluey) +{ + mng_datap pData; + mng_chrmp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CHRM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_chrmp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_cHRM) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iWhitepointx = pChunk->iWhitepointx; + *iWhitepointy = pChunk->iWhitepointy; + *iRedx = pChunk->iRedx; + *iRedy = pChunk->iRedy; + *iGreenx = pChunk->iGreenx; + *iGreeny = pChunk->iGreeny; + *iBluex = pChunk->iBluex; + *iBluey = pChunk->iBluey; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sRGB +mng_retcode MNG_DECL mng_getchunk_srgb (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iRenderingintent) +{ + mng_datap pData; + mng_srgbp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SRGB, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_srgbp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_sRGB) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iRenderingintent = pChunk->iRenderingintent; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +mng_retcode MNG_DECL mng_getchunk_iccp (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iNamesize, + mng_pchar *zName, + mng_uint8 *iCompression, + mng_uint32 *iProfilesize, + mng_ptr *pProfile) +{ + mng_datap pData; + mng_iccpp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ICCP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_iccpp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_iCCP) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iNamesize = pChunk->iNamesize; + *zName = pChunk->zName; + *iCompression = pChunk->iCompression; + *iProfilesize = pChunk->iProfilesize; + *pProfile = pChunk->pProfile; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ICCP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +mng_retcode MNG_DECL mng_getchunk_text (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iKeywordsize, + mng_pchar *zKeyword, + mng_uint32 *iTextsize, + mng_pchar *zText) +{ + mng_datap pData; + mng_textp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TEXT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_textp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_tEXt) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + /* fill the fields */ + *iKeywordsize = pChunk->iKeywordsize; + *zKeyword = pChunk->zKeyword; + *iTextsize = pChunk->iTextsize; + *zText = pChunk->zText; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TEXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +mng_retcode MNG_DECL mng_getchunk_ztxt (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iKeywordsize, + mng_pchar *zKeyword, + mng_uint8 *iCompression, + mng_uint32 *iTextsize, + mng_pchar *zText) +{ + mng_datap pData; + mng_ztxtp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ZTXT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_ztxtp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_zTXt) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + /* fill the fields */ + *iKeywordsize = pChunk->iKeywordsize; + *zKeyword = pChunk->zKeyword; + *iCompression = pChunk->iCompression; + *iTextsize = pChunk->iTextsize; + *zText = pChunk->zText; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ZTXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +mng_retcode MNG_DECL mng_getchunk_itxt (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iKeywordsize, + mng_pchar *zKeyword, + mng_uint8 *iCompressionflag, + mng_uint8 *iCompressionmethod, + mng_uint32 *iLanguagesize, + mng_pchar *zLanguage, + mng_uint32 *iTranslationsize, + mng_pchar *zTranslation, + mng_uint32 *iTextsize, + mng_pchar *zText) +{ + mng_datap pData; + mng_itxtp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ITXT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_itxtp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_iTXt) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + /* fill the fields */ + *iKeywordsize = pChunk->iKeywordsize; + *zKeyword = pChunk->zKeyword; + *iCompressionflag = pChunk->iCompressionflag; + *iCompressionmethod = pChunk->iCompressionmethod; + *iLanguagesize = pChunk->iLanguagesize; + *zLanguage = pChunk->zLanguage; + *iTranslationsize = pChunk->iTranslationsize; + *zTranslation = pChunk->zTranslation; + *iTextsize = pChunk->iTextsize; + *zText = pChunk->zText; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ITXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +mng_retcode MNG_DECL mng_getchunk_bkgd (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iType, + mng_uint8 *iIndex, + mng_uint16 *iGray, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue) +{ + mng_datap pData; + mng_bkgdp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BKGD, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_bkgdp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_bKGD) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iType = pChunk->iType; + *iIndex = pChunk->iIndex; + *iGray = pChunk->iGray; + *iRed = pChunk->iRed; + *iGreen = pChunk->iGreen; + *iBlue = pChunk->iBlue; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYs +mng_retcode MNG_DECL mng_getchunk_phys (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iSizex, + mng_uint32 *iSizey, + mng_uint8 *iUnit) +{ + mng_datap pData; + mng_physp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PHYS, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_physp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_pHYs) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iSizex = pChunk->iSizex; + *iSizey = pChunk->iSizey; + *iUnit = pChunk->iUnit; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PHYS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sBIT +mng_retcode MNG_DECL mng_getchunk_sbit (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iType, + mng_uint8arr4 *aBits) +{ + mng_datap pData; + mng_sbitp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SBIT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_sbitp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_sBIT) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; + *iType = pChunk->iType; + (*aBits)[0] = pChunk->aBits[0]; + (*aBits)[1] = pChunk->aBits[1]; + (*aBits)[2] = pChunk->aBits[2]; + (*aBits)[3] = pChunk->aBits[3]; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SBIT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +mng_retcode MNG_DECL mng_getchunk_splt (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iNamesize, + mng_pchar *zName, + mng_uint8 *iSampledepth, + mng_uint32 *iEntrycount, + mng_ptr *pEntries) +{ + mng_datap pData; + mng_spltp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SPLT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_spltp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_sPLT) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iNamesize = pChunk->iNamesize; + *zName = pChunk->zName; + *iSampledepth = pChunk->iSampledepth; + *iEntrycount = pChunk->iEntrycount; + *pEntries = pChunk->pEntries; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_hIST +mng_retcode MNG_DECL mng_getchunk_hist (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iEntrycount, + mng_uint16arr *aEntries) +{ + mng_datap pData; + mng_histp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_HIST, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_histp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_hIST) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iEntrycount = pChunk->iEntrycount; /* fill the fields */ + + MNG_COPY (*aEntries, pChunk->aEntries, sizeof (mng_uint16arr)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_HIST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tIME +mng_retcode MNG_DECL mng_getchunk_time (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iYear, + mng_uint8 *iMonth, + mng_uint8 *iDay, + mng_uint8 *iHour, + mng_uint8 *iMinute, + mng_uint8 *iSecond) +{ + mng_datap pData; + mng_timep pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TIME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_timep)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_tIME) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iYear = pChunk->iYear; /* fill the fields */ + *iMonth = pChunk->iMonth; + *iDay = pChunk->iDay; + *iHour = pChunk->iHour; + *iMinute = pChunk->iMinute; + *iSecond = pChunk->iSecond; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TIME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_mhdr (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_uint32 *iTicks, + mng_uint32 *iLayercount, + mng_uint32 *iFramecount, + mng_uint32 *iPlaytime, + mng_uint32 *iSimplicity) +{ + mng_datap pData; + mng_mhdrp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MHDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_mhdrp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iWidth = pChunk->iWidth; /* fill the fields */ + *iHeight = pChunk->iHeight; + *iTicks = pChunk->iTicks; + *iLayercount = pChunk->iLayercount; + *iFramecount = pChunk->iFramecount; + *iPlaytime = pChunk->iPlaytime; + *iSimplicity = pChunk->iSimplicity; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +mng_retcode MNG_DECL mng_getchunk_loop (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iLevel, + mng_uint32 *iRepeat, + mng_uint8 *iTermination, + mng_uint32 *iItermin, + mng_uint32 *iItermax, + mng_uint32 *iCount, + mng_uint32p *pSignals) +{ + mng_datap pData; + mng_loopp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_LOOP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_loopp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_LOOP) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iLevel = pChunk->iLevel; /* fill teh fields */ + *iRepeat = pChunk->iRepeat; + *iTermination = pChunk->iTermination; + *iItermin = pChunk->iItermin; + *iItermax = pChunk->iItermax; + *iCount = pChunk->iCount; + *pSignals = pChunk->pSignals; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_LOOP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_endl (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iLevel) +{ + mng_datap pData; + mng_endlp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ENDL, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_endlp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_ENDL) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iLevel = pChunk->iLevel; /* fill the field */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DEFI +mng_retcode MNG_DECL mng_getchunk_defi (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iObjectid, + mng_uint8 *iDonotshow, + mng_uint8 *iConcrete, + mng_bool *bHasloca, + mng_int32 *iXlocation, + mng_int32 *iYlocation, + mng_bool *bHasclip, + mng_int32 *iLeftcb, + mng_int32 *iRightcb, + mng_int32 *iTopcb, + mng_int32 *iBottomcb) +{ + mng_datap pData; + mng_defip pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DEFI, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_defip)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_DEFI) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iObjectid = pChunk->iObjectid; /* fill the fields */ + *iDonotshow = pChunk->iDonotshow; + *iConcrete = pChunk->iConcrete; + *bHasloca = pChunk->bHasloca; + *iXlocation = pChunk->iXlocation; + *iYlocation = pChunk->iYlocation; + *bHasclip = pChunk->bHasclip; + *iLeftcb = pChunk->iLeftcb; + *iRightcb = pChunk->iRightcb; + *iTopcb = pChunk->iTopcb; + *iBottomcb = pChunk->iBottomcb; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BASI +mng_retcode MNG_DECL mng_getchunk_basi (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_uint8 *iBitdepth, + mng_uint8 *iColortype, + mng_uint8 *iCompression, + mng_uint8 *iFilter, + mng_uint8 *iInterlace, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue, + mng_uint16 *iAlpha, + mng_uint8 *iViewable) +{ + mng_datap pData; + mng_basip pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BASI, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_basip)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_BASI) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iWidth = pChunk->iWidth; /* fill the fields */ + *iHeight = pChunk->iHeight; + *iBitdepth = pChunk->iBitdepth; + *iColortype = pChunk->iColortype; + *iCompression = pChunk->iCompression; + *iFilter = pChunk->iFilter; + *iInterlace = pChunk->iInterlace; + *iRed = pChunk->iRed; + *iGreen = pChunk->iGreen; + *iBlue = pChunk->iBlue; + *iAlpha = pChunk->iAlpha; + *iViewable = pChunk->iViewable; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BASI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLON +mng_retcode MNG_DECL mng_getchunk_clon (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iSourceid, + mng_uint16 *iCloneid, + mng_uint8 *iClonetype, + mng_uint8 *iDonotshow, + mng_uint8 *iConcrete, + mng_bool *bHasloca, + mng_uint8 *iLocationtype, + mng_int32 *iLocationx, + mng_int32 *iLocationy) +{ + mng_datap pData; + mng_clonp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CLON, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_clonp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_CLON) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iSourceid = pChunk->iSourceid; /* fill the fields */ + *iCloneid = pChunk->iCloneid; + *iClonetype = pChunk->iClonetype; + *iDonotshow = pChunk->iDonotshow; + *iConcrete = pChunk->iConcrete; + *bHasloca = pChunk->bHasloca; + *iLocationtype = pChunk->iLocationtype; + *iLocationx = pChunk->iLocationx; + *iLocationy = pChunk->iLocationy; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode MNG_DECL mng_getchunk_past (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iDestid, + mng_uint8 *iTargettype, + mng_int32 *iTargetx, + mng_int32 *iTargety, + mng_uint32 *iCount) +{ + mng_datap pData; + mng_pastp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PAST, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_pastp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_PAST) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iDestid = pChunk->iDestid; /* fill the fields */ + *iTargettype = pChunk->iTargettype; + *iTargetx = pChunk->iTargetx; + *iTargety = pChunk->iTargety; + *iCount = pChunk->iCount; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PAST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode MNG_DECL mng_getchunk_past_src (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint16 *iSourceid, + mng_uint8 *iComposition, + mng_uint8 *iOrientation, + mng_uint8 *iOffsettype, + mng_int32 *iOffsetx, + mng_int32 *iOffsety, + mng_uint8 *iBoundarytype, + mng_int32 *iBoundaryl, + mng_int32 *iBoundaryr, + mng_int32 *iBoundaryt, + mng_int32 *iBoundaryb) +{ + mng_datap pData; + mng_pastp pChunk; + mng_past_sourcep pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PAST_SRC, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_pastp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_PAST) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + if (iEntry >= pChunk->iCount) /* valid index ? */ + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + /* address the entry */ + pEntry = pChunk->pSources + iEntry; + + *iSourceid = pEntry->iSourceid; /* fill the fields */ + *iComposition = pEntry->iComposition; + *iOrientation = pEntry->iOrientation; + *iOffsettype = pEntry->iOffsettype; + *iOffsetx = pEntry->iOffsetx; + *iOffsety = pEntry->iOffsety; + *iBoundarytype = pEntry->iBoundarytype; + *iBoundaryl = pEntry->iBoundaryl; + *iBoundaryr = pEntry->iBoundaryr; + *iBoundaryt = pEntry->iBoundaryt; + *iBoundaryb = pEntry->iBoundaryb; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PAST_SRC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +mng_retcode MNG_DECL mng_getchunk_disc (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount, + mng_uint16p *pObjectids) +{ + mng_datap pData; + mng_discp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DISC, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_discp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_DISC) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iCount = pChunk->iCount; /* fill the fields */ + *pObjectids = pChunk->pObjectids; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DISC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BACK +mng_retcode MNG_DECL mng_getchunk_back (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue, + mng_uint8 *iMandatory, + mng_uint16 *iImageid, + mng_uint8 *iTile) +{ + mng_datap pData; + mng_backp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BACK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_backp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_BACK) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iRed = pChunk->iRed; /* fill the fields */ + *iGreen = pChunk->iGreen; + *iBlue = pChunk->iBlue; + *iMandatory = pChunk->iMandatory; + *iImageid = pChunk->iImageid; + *iTile = pChunk->iTile; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +mng_retcode MNG_DECL mng_getchunk_fram (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iMode, + mng_uint32 *iNamesize, + mng_pchar *zName, + mng_uint8 *iChangedelay, + mng_uint8 *iChangetimeout, + mng_uint8 *iChangeclipping, + mng_uint8 *iChangesyncid, + mng_uint32 *iDelay, + mng_uint32 *iTimeout, + mng_uint8 *iBoundarytype, + mng_int32 *iBoundaryl, + mng_int32 *iBoundaryr, + mng_int32 *iBoundaryt, + mng_int32 *iBoundaryb, + mng_uint32 *iCount, + mng_uint32p *pSyncids) +{ + mng_datap pData; + mng_framp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_FRAM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_framp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_FRAM) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iMode = pChunk->iMode; + *iNamesize = pChunk->iNamesize; + *zName = pChunk->zName; + *iChangedelay = pChunk->iChangedelay; + *iChangetimeout = pChunk->iChangetimeout; + *iChangeclipping = pChunk->iChangeclipping; + *iChangesyncid = pChunk->iChangesyncid; + *iDelay = pChunk->iDelay; + *iTimeout = pChunk->iTimeout; + *iBoundarytype = pChunk->iBoundarytype; + *iBoundaryl = pChunk->iBoundaryl; + *iBoundaryr = pChunk->iBoundaryr; + *iBoundaryt = pChunk->iBoundaryt; + *iBoundaryb = pChunk->iBoundaryb; + *iCount = pChunk->iCount; + *pSyncids = pChunk->pSyncids; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_FRAM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MOVE +mng_retcode MNG_DECL mng_getchunk_move (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iFirstid, + mng_uint16 *iLastid, + mng_uint8 *iMovetype, + mng_int32 *iMovex, + mng_int32 *iMovey) +{ + mng_datap pData; + mng_movep pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MOVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_movep)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_MOVE) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iFirstid = pChunk->iFirstid; /* fill the fields */ + *iLastid = pChunk->iLastid; + *iMovetype = pChunk->iMovetype; + *iMovex = pChunk->iMovex; + *iMovey = pChunk->iMovey; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MOVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLIP +mng_retcode MNG_DECL mng_getchunk_clip (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iFirstid, + mng_uint16 *iLastid, + mng_uint8 *iCliptype, + mng_int32 *iClipl, + mng_int32 *iClipr, + mng_int32 *iClipt, + mng_int32 *iClipb) +{ + mng_datap pData; + mng_clipp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CLIP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_clipp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_CLIP) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iFirstid = pChunk->iFirstid; /* fill the fields */ + *iLastid = pChunk->iLastid; + *iCliptype = pChunk->iCliptype; + *iClipl = pChunk->iClipl; + *iClipr = pChunk->iClipr; + *iClipt = pChunk->iClipt; + *iClipb = pChunk->iClipb; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CLIP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SHOW +mng_retcode MNG_DECL mng_getchunk_show (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint16 *iFirstid, + mng_uint16 *iLastid, + mng_uint8 *iMode) +{ + mng_datap pData; + mng_showp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SHOW, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_showp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_SHOW) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iFirstid = pChunk->iFirstid; + *iLastid = pChunk->iLastid; + *iMode = pChunk->iMode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_TERM +mng_retcode MNG_DECL mng_getchunk_term (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iTermaction, + mng_uint8 *iIteraction, + mng_uint32 *iDelay, + mng_uint32 *iItermax) +{ + mng_datap pData; + mng_termp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TERM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_termp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_TERM) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iTermaction = pChunk->iTermaction; /* fill the fields */ + *iIteraction = pChunk->iIteraction; + *iDelay = pChunk->iDelay; + *iItermax = pChunk->iItermax; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode MNG_DECL mng_getchunk_save (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint8 *iOffsettype, + mng_uint32 *iCount) +{ + mng_datap pData; + mng_savep pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SAVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_savep)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_SAVE) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iOffsettype = pChunk->iOffsettype; + *iCount = pChunk->iCount; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_save_entry (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint8 *iEntrytype, + mng_uint32arr2 *iOffset, + mng_uint32arr2 *iStarttime, + mng_uint32 *iLayernr, + mng_uint32 *iFramenr, + mng_uint32 *iNamesize, + mng_pchar *zName) +{ + mng_datap pData; + mng_savep pChunk; + mng_save_entryp pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SAVE_ENTRY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_savep)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_SAVE) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + if (iEntry >= pChunk->iCount) /* valid index ? */ + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + + pEntry = pChunk->pEntries + iEntry; /* address the entry */ + /* fill the fields */ + *iEntrytype = pEntry->iEntrytype; + (*iOffset)[0] = pEntry->iOffset[0]; + (*iOffset)[1] = pEntry->iOffset[1]; + (*iStarttime)[0] = pEntry->iStarttime[0]; + (*iStarttime)[1] = pEntry->iStarttime[1]; + *iLayernr = pEntry->iLayernr; + *iFramenr = pEntry->iFramenr; + *iNamesize = pEntry->iNamesize; + *zName = pEntry->zName; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SAVE_ENTRY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode MNG_DECL mng_getchunk_seek (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iNamesize, + mng_pchar *zName) +{ + mng_datap pData; + mng_seekp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SEEK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_seekp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_SEEK) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iNamesize = pChunk->iNamesize; /* fill the fields */ + *zName = pChunk->zName; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +mng_retcode MNG_DECL mng_getchunk_expi (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iSnapshotid, + mng_uint32 *iNamesize, + mng_pchar *zName) +{ + mng_datap pData; + mng_expip pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EXPI, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_expip)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_eXPI) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iSnapshotid = pChunk->iSnapshotid; /* fill the fields */ + *iNamesize = pChunk->iNamesize; + *zName = pChunk->zName; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EXPI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_fPRI +mng_retcode MNG_DECL mng_getchunk_fpri (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iDeltatype, + mng_uint8 *iPriority) +{ + mng_datap pData; + mng_fprip pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_FPRI, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_fprip)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_fPRI) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iDeltatype = pChunk->iDeltatype; /* fill the fields */ + *iPriority = pChunk->iPriority; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_FPRI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +mng_retcode MNG_DECL mng_getchunk_need (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iKeywordssize, + mng_pchar *zKeywords) +{ + mng_datap pData; + mng_needp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_NEED, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_needp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_nEED) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + /* fill the fields */ + *iKeywordssize = pChunk->iKeywordssize; + *zKeywords = pChunk->zKeywords; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_NEED, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYg +mng_retcode MNG_DECL mng_getchunk_phyg (mng_handle hHandle, + mng_handle hChunk, + mng_bool *bEmpty, + mng_uint32 *iSizex, + mng_uint32 *iSizey, + mng_uint8 *iUnit) +{ + mng_datap pData; + mng_phygp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PHYG, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_phygp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_pHYg) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *bEmpty = pChunk->bEmpty; /* fill the fields */ + *iSizex = pChunk->iSizex; + *iSizey = pChunk->iSizey; + *iUnit = pChunk->iUnit; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PHYG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +mng_retcode MNG_DECL mng_getchunk_jhdr (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_uint8 *iColortype, + mng_uint8 *iImagesampledepth, + mng_uint8 *iImagecompression, + mng_uint8 *iImageinterlace, + mng_uint8 *iAlphasampledepth, + mng_uint8 *iAlphacompression, + mng_uint8 *iAlphafilter, + mng_uint8 *iAlphainterlace) +{ + mng_datap pData; + mng_jhdrp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JHDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_jhdrp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_JHDR) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iWidth = pChunk->iWidth; /* fill the fields */ + *iHeight = pChunk->iHeight; + *iColortype = pChunk->iColortype; + *iImagesampledepth = pChunk->iImagesampledepth; + *iImagecompression = pChunk->iImagecompression; + *iImageinterlace = pChunk->iImageinterlace; + *iAlphasampledepth = pChunk->iAlphasampledepth; + *iAlphacompression = pChunk->iAlphacompression; + *iAlphafilter = pChunk->iAlphafilter; + *iAlphainterlace = pChunk->iAlphainterlace; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +mng_retcode MNG_DECL mng_getchunk_jdat (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iRawlen, + mng_ptr *pRawdata) +{ + mng_datap pData; + mng_jdatp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JDAT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_jdatp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_JDAT) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iRawlen = pChunk->iDatasize; /* fill the fields */ + *pRawdata = pChunk->pData; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +mng_retcode MNG_DECL mng_getchunk_jdaa (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iRawlen, + mng_ptr *pRawdata) +{ + mng_datap pData; + mng_jdaap pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JDAA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_jdaap)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_JDAA) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iRawlen = pChunk->iDatasize; /* fill the fields */ + *pRawdata = pChunk->pData; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JDAA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_getchunk_dhdr (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iObjectid, + mng_uint8 *iImagetype, + mng_uint8 *iDeltatype, + mng_uint32 *iBlockwidth, + mng_uint32 *iBlockheight, + mng_uint32 *iBlockx, + mng_uint32 *iBlocky) +{ + mng_datap pData; + mng_dhdrp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DHDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_dhdrp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_DHDR) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iObjectid = pChunk->iObjectid; /* fill the fields */ + *iImagetype = pChunk->iImagetype; + *iDeltatype = pChunk->iDeltatype; + *iBlockwidth = pChunk->iBlockwidth; + *iBlockheight = pChunk->iBlockheight; + *iBlockx = pChunk->iBlockx; + *iBlocky = pChunk->iBlocky; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_getchunk_prom (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iColortype, + mng_uint8 *iSampledepth, + mng_uint8 *iFilltype) +{ + mng_datap pData; + mng_promp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PROM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_promp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_PROM) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iColortype = pChunk->iColortype; /* fill the fields */ + *iSampledepth = pChunk->iSampledepth; + *iFilltype = pChunk->iFilltype; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PROM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_getchunk_pplt (mng_handle hHandle, + mng_handle hChunk, + mng_uint8 *iDeltatype, + mng_uint32 *iCount) +{ + mng_datap pData; + mng_ppltp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PPLT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_ppltp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_PPLT) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iDeltatype = pChunk->iDeltatype; /* fill the fields */ + *iCount = pChunk->iCount; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_getchunk_pplt_entry (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint16 *iRed, + mng_uint16 *iGreen, + mng_uint16 *iBlue, + mng_uint16 *iAlpha, + mng_bool *bUsed) +{ + mng_datap pData; + mng_ppltp pChunk; + mng_pplt_entryp pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PPLT_ENTRY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_ppltp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_PPLT) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + if (iEntry >= pChunk->iCount) /* valid index ? */ + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + + pEntry = &pChunk->aEntries[iEntry]; /* address the entry */ + + *iRed = pEntry->iRed; /* fill the fields */ + *iGreen = pEntry->iGreen; + *iBlue = pEntry->iBlue; + *iAlpha = pEntry->iAlpha; + *bUsed = pEntry->bUsed; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PPLT_ENTRY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_getchunk_drop (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount, + mng_chunkidp *pChunknames) +{ + mng_datap pData; + mng_dropp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DROP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_dropp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_DROP) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iCount = pChunk->iCount; /* fill the fields */ + *pChunknames = pChunk->pChunknames; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DROP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +mng_retcode MNG_DECL mng_getchunk_dbyk (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid *iChunkname, + mng_uint8 *iPolarity, + mng_uint32 *iKeywordssize, + mng_pchar *zKeywords) +{ + mng_datap pData; + mng_dbykp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DBYK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_dbykp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_DBYK) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iChunkname = pChunk->iChunkname; /* fill the fields */ + *iPolarity = pChunk->iPolarity; + *iKeywordssize = pChunk->iKeywordssize; + *zKeywords = pChunk->zKeywords; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DBYK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +mng_retcode MNG_DECL mng_getchunk_ordr (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount) +{ + mng_datap pData; + mng_ordrp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ORDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_ordrp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_ORDR) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iCount = pChunk->iCount; /* fill the field */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ORDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +mng_retcode MNG_DECL mng_getchunk_ordr_entry (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_chunkid *iChunkname, + mng_uint8 *iOrdertype) +{ + mng_datap pData; + mng_ordrp pChunk; + mng_ordr_entryp pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ORDR_ENTRY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_ordrp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_ORDR) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + if (iEntry >= pChunk->iCount) /* valid index ? */ + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + + pEntry = pChunk->pEntries + iEntry; /* address the proper entry */ + + *iChunkname = pEntry->iChunkname; /* fill the fields */ + *iOrdertype = pEntry->iOrdertype; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ORDR_ENTRY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +mng_retcode MNG_DECL mng_getchunk_magn (mng_handle hHandle, + mng_handle hChunk, + mng_uint16 *iFirstid, + mng_uint16 *iLastid, + mng_uint16 *iMethodX, + mng_uint16 *iMX, + mng_uint16 *iMY, + mng_uint16 *iML, + mng_uint16 *iMR, + mng_uint16 *iMT, + mng_uint16 *iMB, + mng_uint16 *iMethodY) +{ + mng_datap pData; + mng_magnp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MAGN, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_magnp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_MAGN) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iFirstid = pChunk->iFirstid; /* fill the fields */ + *iLastid = pChunk->iLastid; + *iMethodX = (mng_uint16)pChunk->iMethodX; + *iMX = pChunk->iMX; + *iMY = pChunk->iMY; + *iML = pChunk->iML; + *iMR = pChunk->iMR; + *iMT = pChunk->iMT; + *iMB = pChunk->iMB; + *iMethodY = (mng_uint16)pChunk->iMethodY; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_EXT mng_retcode MNG_DECL mng_getchunk_mpng (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iFramewidth, + mng_uint32 *iFrameheight, + mng_uint16 *iNumplays, + mng_uint16 *iTickspersec, + mng_uint8 *iCompressionmethod, + mng_uint32 *iCount) +{ + mng_datap pData; + mng_mpngp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MPNG, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_mpngp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_mpNG) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + /* fill the fields */ + *iFramewidth = pChunk->iFramewidth; + *iFrameheight = pChunk->iFrameheight; + *iNumplays = pChunk->iNumplays; + *iTickspersec = pChunk->iTickspersec; + *iCompressionmethod = pChunk->iCompressionmethod; + *iCount = pChunk->iFramessize / sizeof (mng_mpng_frame); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_EXT mng_retcode MNG_DECL mng_getchunk_mpng_frame (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint32 *iX, + mng_uint32 *iY, + mng_uint32 *iWidth, + mng_uint32 *iHeight, + mng_int32 *iXoffset, + mng_int32 *iYoffset, + mng_uint16 *iTicks) +{ + mng_datap pData; + mng_mpngp pChunk; + mng_mpng_framep pFrame; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MPNG_FRAME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_mpngp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_mpNG) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + /* valid index ? */ + if (iEntry >= (pChunk->iFramessize / sizeof (mng_mpng_frame))) + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + + pFrame = pChunk->pFrames + iEntry; /* address the entry */ + /* fill the fields */ + *iX = pFrame->iX; + *iY = pFrame->iY; + *iWidth = pFrame->iWidth; + *iHeight = pFrame->iHeight; + *iXoffset = pFrame->iXoffset; + *iYoffset = pFrame->iYoffset; + *iTicks = pFrame->iTicks; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MPNG_FRAME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +mng_retcode MNG_DECL mng_getchunk_evnt (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 *iCount) +{ + mng_datap pData; + mng_evntp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EVNT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_evntp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_evNT) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + *iCount = pChunk->iCount; /* fill the fields */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EVNT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_evnt_entry (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iEntry, + mng_uint8 *iEventtype, + mng_uint8 *iMasktype, + mng_int32 *iLeft, + mng_int32 *iRight, + mng_int32 *iTop, + mng_int32 *iBottom, + mng_uint16 *iObjectid, + mng_uint8 *iIndex, + mng_uint32 *iSegmentnamesize, + mng_pchar *zSegmentname) +{ + mng_datap pData; + mng_evntp pChunk; + mng_evnt_entryp pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EVNT_ENTRY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_evntp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.iChunkname != MNG_UINT_evNT) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + + if (iEntry >= pChunk->iCount) /* valid index ? */ + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + + pEntry = pChunk->pEntries + iEntry; /* address the entry */ + /* fill the fields */ + *iEventtype = pEntry->iEventtype; + *iMasktype = pEntry->iMasktype; + *iLeft = pEntry->iLeft; + *iRight = pEntry->iRight; + *iTop = pEntry->iTop; + *iBottom = pEntry->iBottom; + *iObjectid = pEntry->iObjectid; + *iIndex = pEntry->iIndex; + *iSegmentnamesize = pEntry->iSegmentnamesize; + *zSegmentname = pEntry->zSegmentname; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EVNT_ENTRY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getchunk_unknown (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid *iChunkname, + mng_uint32 *iRawlen, + mng_ptr *pRawdata) +{ + mng_datap pData; + mng_unknown_chunkp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_UNKNOWN, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + pChunk = (mng_unknown_chunkp)hChunk; /* address the chunk */ + + if (pChunk->sHeader.fCleanup != mng_free_unknown) + MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */ + /* fill the fields */ + *iChunkname = pChunk->sHeader.iChunkname; + *iRawlen = pChunk->iDatasize; + *pRawdata = pChunk->pData; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_UNKNOWN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_TERM +MNG_LOCAL mng_bool check_term (mng_datap pData, + mng_chunkid iChunkname) +{ + mng_chunk_headerp pChunk = (mng_chunk_headerp)pData->pLastchunk; + + if (!pChunk) /* nothing added yet ? */ + return MNG_TRUE; + /* last added chunk is TERM ? */ + if (pChunk->iChunkname != MNG_UINT_TERM) + return MNG_TRUE; + /* previous to last is MHDR ? */ + if ((pChunk->pPrev) && (((mng_chunk_headerp)pChunk->pPrev)->iChunkname == MNG_UINT_MHDR)) + return MNG_TRUE; + + if (iChunkname == MNG_UINT_SEEK) /* new chunk to be added is SEEK ? */ + return MNG_TRUE; + + return MNG_FALSE; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_ihdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_IHDR, mng_init_general, mng_free_general, mng_read_ihdr, mng_write_ihdr, mng_assign_general, 0, 0, sizeof(mng_ihdr)}; +#else + {MNG_UINT_IHDR, mng_init_ihdr, mng_free_ihdr, mng_read_ihdr, mng_write_ihdr, mng_assign_ihdr, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IHDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_IHDR)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_ihdr (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_IHDR, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + ((mng_ihdrp)pChunk)->iWidth = iWidth; + ((mng_ihdrp)pChunk)->iHeight = iHeight; + ((mng_ihdrp)pChunk)->iBitdepth = iBitdepth; + ((mng_ihdrp)pChunk)->iColortype = iColortype; + ((mng_ihdrp)pChunk)->iCompression = iCompression; + ((mng_ihdrp)pChunk)->iFilter = iFilter; + ((mng_ihdrp)pChunk)->iInterlace = iInterlace; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_plte (mng_handle hHandle, + mng_uint32 iCount, + mng_palette8 aPalette) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_PLTE, mng_init_general, mng_free_general, mng_read_plte, mng_write_plte, mng_assign_general, 0, 0, sizeof(mng_plte)}; +#else + {MNG_UINT_PLTE, mng_init_plte, mng_free_plte, mng_read_plte, mng_write_plte, mng_assign_plte, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PLTE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_PLTE)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_plte (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_PLTE, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_pltep)pChunk)->iEntrycount = iCount; + ((mng_pltep)pChunk)->bEmpty = (mng_bool)(iCount == 0); + + MNG_COPY (((mng_pltep)pChunk)->aEntries, aPalette, sizeof (mng_palette8)); + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_idat (mng_handle hHandle, + mng_uint32 iRawlen, + mng_ptr pRawdata) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_IDAT, mng_init_general, mng_free_idat, mng_read_idat, mng_write_idat, mng_assign_idat, 0, 0, sizeof(mng_idat)}; +#else + {MNG_UINT_IDAT, mng_init_idat, mng_free_idat, mng_read_idat, mng_write_idat, mng_assign_idat, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IDAT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_IDAT)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_idat (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_IDAT, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_idatp)pChunk)->bEmpty = (mng_bool)(iRawlen == 0); + ((mng_idatp)pChunk)->iDatasize = iRawlen; + + if (iRawlen) + { + MNG_ALLOC (pData, ((mng_idatp)pChunk)->pData, iRawlen); + MNG_COPY (((mng_idatp)pChunk)->pData, pRawdata, iRawlen); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_iend (mng_handle hHandle) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_IEND, mng_init_general, mng_free_general, mng_read_iend, mng_write_iend, mng_assign_general, 0, 0, sizeof(mng_iend)}; +#else + {MNG_UINT_IEND, mng_init_iend, mng_free_iend, mng_read_iend, mng_write_iend, mng_assign_iend, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IEND, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_IEND)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_iend (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_IEND, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_INCLUDE_JNG + if ((pData->iFirstchunkadded == MNG_UINT_IHDR) || + (pData->iFirstchunkadded == MNG_UINT_JHDR) ) +#else + if (pData->iFirstchunkadded == MNG_UINT_IHDR) +#endif + pData->bCreating = MNG_FALSE; /* should be last chunk !!! */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_trns (mng_handle hHandle, + mng_bool bEmpty, + mng_bool bGlobal, + mng_uint8 iType, + mng_uint32 iCount, + mng_uint8arr aAlphas, + mng_uint16 iGray, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint32 iRawlen, + mng_uint8arr aRawdata) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_tRNS, mng_init_general, mng_free_general, mng_read_trns, mng_write_trns, mng_assign_general, 0, 0, sizeof(mng_trns)}; +#else + {MNG_UINT_tRNS, mng_init_trns, mng_free_trns, mng_read_trns, mng_write_trns, mng_assign_trns, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TRNS, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_tRNS)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_trns (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_tRNS, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_trnsp)pChunk)->bEmpty = bEmpty; + ((mng_trnsp)pChunk)->bGlobal = bGlobal; + ((mng_trnsp)pChunk)->iType = iType; + ((mng_trnsp)pChunk)->iCount = iCount; + ((mng_trnsp)pChunk)->iGray = iGray; + ((mng_trnsp)pChunk)->iRed = iRed; + ((mng_trnsp)pChunk)->iGreen = iGreen; + ((mng_trnsp)pChunk)->iBlue = iBlue; + ((mng_trnsp)pChunk)->iRawlen = iRawlen; + + MNG_COPY (((mng_trnsp)pChunk)->aEntries, aAlphas, sizeof (mng_uint8arr)); + MNG_COPY (((mng_trnsp)pChunk)->aRawdata, aRawdata, sizeof (mng_uint8arr)); + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_gAMA +mng_retcode MNG_DECL mng_putchunk_gama (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iGamma) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_gAMA, mng_init_general, mng_free_general, mng_read_gama, mng_write_gama, mng_assign_general, 0, 0, sizeof(mng_gama)}; +#else + {MNG_UINT_gAMA, mng_init_gama, mng_free_gama, mng_read_gama, mng_write_gama, mng_assign_gama, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_GAMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_gAMA)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_gama (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_gAMA, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_gamap)pChunk)->bEmpty = bEmpty; + ((mng_gamap)pChunk)->iGamma = iGamma; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +mng_retcode MNG_DECL mng_putchunk_chrm (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iWhitepointx, + mng_uint32 iWhitepointy, + mng_uint32 iRedx, + mng_uint32 iRedy, + mng_uint32 iGreenx, + mng_uint32 iGreeny, + mng_uint32 iBluex, + mng_uint32 iBluey) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_cHRM, mng_init_general, mng_free_general, mng_read_chrm, mng_write_chrm, mng_assign_general, 0, 0, sizeof(mng_chrm)}; +#else + {MNG_UINT_cHRM, mng_init_chrm, mng_free_chrm, mng_read_chrm, mng_write_chrm, mng_assign_chrm, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CHRM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_cHRM)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_chrm (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_cHRM, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_chrmp)pChunk)->bEmpty = bEmpty; + ((mng_chrmp)pChunk)->iWhitepointx = iWhitepointx; + ((mng_chrmp)pChunk)->iWhitepointy = iWhitepointy; + ((mng_chrmp)pChunk)->iRedx = iRedx; + ((mng_chrmp)pChunk)->iRedy = iRedy; + ((mng_chrmp)pChunk)->iGreenx = iGreenx; + ((mng_chrmp)pChunk)->iGreeny = iGreeny; + ((mng_chrmp)pChunk)->iBluex = iBluex; + ((mng_chrmp)pChunk)->iBluey = iBluey; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sRGB +mng_retcode MNG_DECL mng_putchunk_srgb (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iRenderingintent) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_sRGB, mng_init_general, mng_free_general, mng_read_srgb, mng_write_srgb, mng_assign_general, 0, 0, sizeof(mng_srgb)}; +#else + {MNG_UINT_sRGB, mng_init_srgb, mng_free_srgb, mng_read_srgb, mng_write_srgb, mng_assign_srgb, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SRGB, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_sRGB)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_srgb (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_sRGB, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_srgbp)pChunk)->bEmpty = bEmpty; + ((mng_srgbp)pChunk)->iRenderingintent = iRenderingintent; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +mng_retcode MNG_DECL mng_putchunk_iccp (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iNamesize, + mng_pchar zName, + mng_uint8 iCompression, + mng_uint32 iProfilesize, + mng_ptr pProfile) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_iCCP, mng_init_general, mng_free_iccp, mng_read_iccp, mng_write_iccp, mng_assign_iccp, 0, 0, sizeof(mng_iccp)}; +#else + {MNG_UINT_iCCP, mng_init_iccp, mng_free_iccp, mng_read_iccp, mng_write_iccp, mng_assign_iccp, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ICCP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_iCCP)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_iccp (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_iCCP, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_iccpp)pChunk)->bEmpty = bEmpty; + ((mng_iccpp)pChunk)->iNamesize = iNamesize; + ((mng_iccpp)pChunk)->iCompression = iCompression; + ((mng_iccpp)pChunk)->iProfilesize = iProfilesize; + + if (iNamesize) + { + MNG_ALLOC (pData, ((mng_iccpp)pChunk)->zName, iNamesize + 1); + MNG_COPY (((mng_iccpp)pChunk)->zName, zName, iNamesize); + } + + if (iProfilesize) + { + MNG_ALLOC (pData, ((mng_iccpp)pChunk)->pProfile, iProfilesize); + MNG_COPY (((mng_iccpp)pChunk)->pProfile, pProfile, iProfilesize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ICCP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +mng_retcode MNG_DECL mng_putchunk_text (mng_handle hHandle, + mng_uint32 iKeywordsize, + mng_pchar zKeyword, + mng_uint32 iTextsize, + mng_pchar zText) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_tEXt, mng_init_general, mng_free_text, mng_read_text, mng_write_text, mng_assign_text, 0, 0, sizeof(mng_text)}; +#else + {MNG_UINT_tEXt, mng_init_text, mng_free_text, mng_read_text, mng_write_text, mng_assign_text, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TEXT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_tEXt)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_text (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_tEXt, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_textp)pChunk)->iKeywordsize = iKeywordsize; + ((mng_textp)pChunk)->iTextsize = iTextsize; + + if (iKeywordsize) + { + MNG_ALLOC (pData, ((mng_textp)pChunk)->zKeyword, iKeywordsize + 1); + MNG_COPY (((mng_textp)pChunk)->zKeyword, zKeyword, iKeywordsize); + } + + if (iTextsize) + { + MNG_ALLOC (pData, ((mng_textp)pChunk)->zText, iTextsize + 1); + MNG_COPY (((mng_textp)pChunk)->zText, zText, iTextsize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TEXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +mng_retcode MNG_DECL mng_putchunk_ztxt (mng_handle hHandle, + mng_uint32 iKeywordsize, + mng_pchar zKeyword, + mng_uint8 iCompression, + mng_uint32 iTextsize, + mng_pchar zText) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_zTXt, mng_init_general, mng_free_ztxt, mng_read_ztxt, mng_write_ztxt, mng_assign_ztxt, 0, 0, sizeof(mng_ztxt)}; +#else + {MNG_UINT_zTXt, mng_init_ztxt, mng_free_ztxt, mng_read_ztxt, mng_write_ztxt, mng_assign_ztxt, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ZTXT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_zTXt)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_ztxt (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_zTXt, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_ztxtp)pChunk)->iKeywordsize = iKeywordsize; + ((mng_ztxtp)pChunk)->iCompression = iCompression; + ((mng_ztxtp)pChunk)->iTextsize = iTextsize; + + if (iKeywordsize) + { + MNG_ALLOC (pData, ((mng_ztxtp)pChunk)->zKeyword, iKeywordsize + 1); + MNG_COPY (((mng_ztxtp)pChunk)->zKeyword, zKeyword, iKeywordsize); + } + + if (iTextsize) + { + MNG_ALLOC (pData, ((mng_ztxtp)pChunk)->zText, iTextsize + 1); + MNG_COPY (((mng_ztxtp)pChunk)->zText, zText, iTextsize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ZTXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +mng_retcode MNG_DECL mng_putchunk_itxt (mng_handle hHandle, + mng_uint32 iKeywordsize, + mng_pchar zKeyword, + mng_uint8 iCompressionflag, + mng_uint8 iCompressionmethod, + mng_uint32 iLanguagesize, + mng_pchar zLanguage, + mng_uint32 iTranslationsize, + mng_pchar zTranslation, + mng_uint32 iTextsize, + mng_pchar zText) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_iTXt, mng_init_general, mng_free_itxt, mng_read_itxt, mng_write_itxt, mng_assign_itxt, 0, 0, sizeof(mng_itxt)}; +#else + {MNG_UINT_iTXt, mng_init_itxt, mng_free_itxt, mng_read_itxt, mng_write_itxt, mng_assign_itxt, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ITXT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_iTXt)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_itxt (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_iTXt, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_itxtp)pChunk)->iKeywordsize = iKeywordsize; + ((mng_itxtp)pChunk)->iCompressionflag = iCompressionflag; + ((mng_itxtp)pChunk)->iCompressionmethod = iCompressionmethod; + ((mng_itxtp)pChunk)->iLanguagesize = iLanguagesize; + ((mng_itxtp)pChunk)->iTranslationsize = iTranslationsize; + ((mng_itxtp)pChunk)->iTextsize = iTextsize; + + if (iKeywordsize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunk)->zKeyword, iKeywordsize + 1); + MNG_COPY (((mng_itxtp)pChunk)->zKeyword, zKeyword, iKeywordsize); + } + + if (iLanguagesize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunk)->zLanguage, iLanguagesize + 1); + MNG_COPY (((mng_itxtp)pChunk)->zLanguage, zLanguage, iLanguagesize); + } + + if (iTranslationsize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunk)->zTranslation, iTranslationsize + 1); + MNG_COPY (((mng_itxtp)pChunk)->zTranslation, zTranslation, iTranslationsize); + } + + if (iTextsize) + { + MNG_ALLOC (pData, ((mng_itxtp)pChunk)->zText, iTextsize + 1); + MNG_COPY (((mng_itxtp)pChunk)->zText, zText, iTextsize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ITXT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +mng_retcode MNG_DECL mng_putchunk_bkgd (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iType, + mng_uint8 iIndex, + mng_uint16 iGray, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_bKGD, mng_init_general, mng_free_general, mng_read_bkgd, mng_write_bkgd, mng_assign_general, 0, 0, sizeof(mng_bkgd)}; +#else + {MNG_UINT_bKGD, mng_init_bkgd, mng_free_bkgd, mng_read_bkgd, mng_write_bkgd, mng_assign_bkgd, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BKGD, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_bKGD)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_bkgd (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_bKGD, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_bkgdp)pChunk)->bEmpty = bEmpty; + ((mng_bkgdp)pChunk)->iType = iType; + ((mng_bkgdp)pChunk)->iIndex = iIndex; + ((mng_bkgdp)pChunk)->iGray = iGray; + ((mng_bkgdp)pChunk)->iRed = iRed; + ((mng_bkgdp)pChunk)->iGreen = iGreen; + ((mng_bkgdp)pChunk)->iBlue = iBlue; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYs +mng_retcode MNG_DECL mng_putchunk_phys (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iSizex, + mng_uint32 iSizey, + mng_uint8 iUnit) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_pHYs, mng_init_general, mng_free_general, mng_read_phys, mng_write_phys, mng_assign_general, 0, 0, sizeof(mng_phys)}; +#else + {MNG_UINT_pHYs, mng_init_phys, mng_free_phys, mng_read_phys, mng_write_phys, mng_assign_phys, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PHYS, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_pHYs)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_phys (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_pHYs, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_physp)pChunk)->bEmpty = bEmpty; + ((mng_physp)pChunk)->iSizex = iSizex; + ((mng_physp)pChunk)->iSizey = iSizey; + ((mng_physp)pChunk)->iUnit = iUnit; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PHYS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sBIT +mng_retcode MNG_DECL mng_putchunk_sbit (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iType, + mng_uint8arr4 aBits) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_sBIT, mng_init_general, mng_free_general, mng_read_sbit, mng_write_sbit, mng_assign_general, 0, 0, sizeof(mng_sbit)}; +#else + {MNG_UINT_sBIT, mng_init_sbit, mng_free_sbit, mng_read_sbit, mng_write_sbit, mng_assign_sbit, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SBIT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_sBIT)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_sbit (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_sBIT, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_sbitp)pChunk)->bEmpty = bEmpty; + ((mng_sbitp)pChunk)->iType = iType; + ((mng_sbitp)pChunk)->aBits[0] = aBits[0]; + ((mng_sbitp)pChunk)->aBits[1] = aBits[1]; + ((mng_sbitp)pChunk)->aBits[2] = aBits[2]; + ((mng_sbitp)pChunk)->aBits[3] = aBits[3]; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SBIT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +mng_retcode MNG_DECL mng_putchunk_splt (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iNamesize, + mng_pchar zName, + mng_uint8 iSampledepth, + mng_uint32 iEntrycount, + mng_ptr pEntries) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_sPLT, mng_init_general, mng_free_splt, mng_read_splt, mng_write_splt, mng_assign_splt, 0, 0, sizeof(mng_splt)}; +#else + {MNG_UINT_sPLT, mng_init_splt, mng_free_splt, mng_read_splt, mng_write_splt, mng_assign_splt, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SPLT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_sPLT)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_splt (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_sPLT, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_spltp)pChunk)->bEmpty = bEmpty; + ((mng_spltp)pChunk)->iNamesize = iNamesize; + ((mng_spltp)pChunk)->iSampledepth = iSampledepth; + ((mng_spltp)pChunk)->iEntrycount = iEntrycount; + + if (iNamesize) + { + MNG_ALLOC (pData, ((mng_spltp)pChunk)->zName, iNamesize + 1); + MNG_COPY (((mng_spltp)pChunk)->zName, zName, iNamesize); + } + + if (iEntrycount) + { + mng_uint32 iSize = iEntrycount * ((iSampledepth >> 1) + 2); + + MNG_ALLOC (pData, ((mng_spltp)pChunk)->pEntries, iSize); + MNG_COPY (((mng_spltp)pChunk)->pEntries, pEntries, iSize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_hIST +mng_retcode MNG_DECL mng_putchunk_hist (mng_handle hHandle, + mng_uint32 iEntrycount, + mng_uint16arr aEntries) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_hIST, mng_init_general, mng_free_general, mng_read_hist, mng_write_hist, mng_assign_general, 0, 0, sizeof(mng_hist)}; +#else + {MNG_UINT_hIST, mng_init_hist, mng_free_hist, mng_read_hist, mng_write_hist, mng_assign_hist, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_HIST, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_hIST)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_hist (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_hIST, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_histp)pChunk)->iEntrycount = iEntrycount; + + MNG_COPY (((mng_histp)pChunk)->aEntries, aEntries, sizeof (mng_uint16arr)); + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_HIST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tIME +mng_retcode MNG_DECL mng_putchunk_time (mng_handle hHandle, + mng_uint16 iYear, + mng_uint8 iMonth, + mng_uint8 iDay, + mng_uint8 iHour, + mng_uint8 iMinute, + mng_uint8 iSecond) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_tIME, mng_init_general, mng_free_general, mng_read_time, mng_write_time, mng_assign_general, 0, 0, sizeof(mng_time)}; +#else + {MNG_UINT_tIME, mng_init_time, mng_free_time, mng_read_time, mng_write_time, mng_assign_time, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TIME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_tIME)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_time (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_tIME, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_timep)pChunk)->iYear = iYear; + ((mng_timep)pChunk)->iMonth = iMonth; + ((mng_timep)pChunk)->iDay = iDay; + ((mng_timep)pChunk)->iHour = iHour; + ((mng_timep)pChunk)->iMinute = iMinute; + ((mng_timep)pChunk)->iSecond = iSecond; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TIME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_mhdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint32 iTicks, + mng_uint32 iLayercount, + mng_uint32 iFramecount, + mng_uint32 iPlaytime, + mng_uint32 iSimplicity) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_MHDR, mng_init_general, mng_free_general, mng_read_mhdr, mng_write_mhdr, mng_assign_general, 0, 0, sizeof(mng_mhdr)}; +#else + {MNG_UINT_MHDR, mng_init_mhdr, mng_free_mhdr, mng_read_mhdr, mng_write_mhdr, mng_assign_mhdr, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MHDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must be very first! */ + if (pData->iFirstchunkadded != 0) + MNG_ERROR (pData, MNG_SEQUENCEERROR) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_MHDR)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_mhdr (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_MHDR, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_mhdrp)pChunk)->iWidth = iWidth; + ((mng_mhdrp)pChunk)->iHeight = iHeight; + ((mng_mhdrp)pChunk)->iTicks = iTicks; + ((mng_mhdrp)pChunk)->iLayercount = iLayercount; + ((mng_mhdrp)pChunk)->iFramecount = iFramecount; + ((mng_mhdrp)pChunk)->iPlaytime = iPlaytime; + ((mng_mhdrp)pChunk)->iSimplicity = iSimplicity; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_mend (mng_handle hHandle) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_MEND, mng_init_general, mng_free_general, mng_read_mend, mng_write_mend, mng_assign_general, 0, 0, sizeof(mng_mend)}; +#else + {MNG_UINT_MEND, mng_init_mend, mng_free_mend, mng_read_mend, mng_write_mend, mng_assign_mend, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MEND, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_MEND)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_mend (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_MEND, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + + pData->bCreating = MNG_FALSE; /* should be last chunk !!! */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +mng_retcode MNG_DECL mng_putchunk_loop (mng_handle hHandle, + mng_uint8 iLevel, + mng_uint32 iRepeat, + mng_uint8 iTermination, + mng_uint32 iItermin, + mng_uint32 iItermax, + mng_uint32 iCount, + mng_uint32p pSignals) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_LOOP, mng_init_general, mng_free_loop, mng_read_loop, mng_write_loop, mng_assign_loop, 0, 0, sizeof(mng_loop)}; +#else + {MNG_UINT_LOOP, mng_init_loop, mng_free_loop, mng_read_loop, mng_write_loop, mng_assign_loop, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_LOOP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_LOOP)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_loop (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_LOOP, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_loopp)pChunk)->iLevel = iLevel; + ((mng_loopp)pChunk)->iRepeat = iRepeat; + ((mng_loopp)pChunk)->iTermination = iTermination; + ((mng_loopp)pChunk)->iItermin = iItermin; + ((mng_loopp)pChunk)->iItermax = iItermax; + ((mng_loopp)pChunk)->iCount = iCount; + ((mng_loopp)pChunk)->pSignals = pSignals; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_LOOP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_endl (mng_handle hHandle, + mng_uint8 iLevel) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_ENDL, mng_init_general, mng_free_general, mng_read_endl, mng_write_endl, mng_assign_general, 0, 0, sizeof(mng_endl)}; +#else + {MNG_UINT_ENDL, mng_init_endl, mng_free_endl, mng_read_endl, mng_write_endl, mng_assign_endl, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ENDL, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_ENDL)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_endl (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_ENDL, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_endlp)pChunk)->iLevel = iLevel; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DEFI +mng_retcode MNG_DECL mng_putchunk_defi (mng_handle hHandle, + mng_uint16 iObjectid, + mng_uint8 iDonotshow, + mng_uint8 iConcrete, + mng_bool bHasloca, + mng_int32 iXlocation, + mng_int32 iYlocation, + mng_bool bHasclip, + mng_int32 iLeftcb, + mng_int32 iRightcb, + mng_int32 iTopcb, + mng_int32 iBottomcb) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_DEFI, mng_init_general, mng_free_general, mng_read_defi, mng_write_defi, mng_assign_general, 0, 0, sizeof(mng_defi)}; +#else + {MNG_UINT_DEFI, mng_init_defi, mng_free_defi, mng_read_defi, mng_write_defi, mng_assign_defi, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DEFI, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_DEFI)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_defi (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_DEFI, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_defip)pChunk)->iObjectid = iObjectid; + ((mng_defip)pChunk)->iDonotshow = iDonotshow; + ((mng_defip)pChunk)->iConcrete = iConcrete; + ((mng_defip)pChunk)->bHasloca = bHasloca; + ((mng_defip)pChunk)->iXlocation = iXlocation; + ((mng_defip)pChunk)->iYlocation = iYlocation; + ((mng_defip)pChunk)->bHasclip = bHasclip; + ((mng_defip)pChunk)->iLeftcb = iLeftcb; + ((mng_defip)pChunk)->iRightcb = iRightcb; + ((mng_defip)pChunk)->iTopcb = iTopcb; + ((mng_defip)pChunk)->iBottomcb = iBottomcb; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BASI +mng_retcode MNG_DECL mng_putchunk_basi (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint16 iAlpha, + mng_uint8 iViewable) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_BASI, mng_init_general, mng_free_general, mng_read_basi, mng_write_basi, mng_assign_general, 0, 0, sizeof(mng_basi)}; +#else + {MNG_UINT_BASI, mng_init_basi, mng_free_basi, mng_read_basi, mng_write_basi, mng_assign_basi, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BASI, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_BASI)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_basi (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_BASI, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_basip)pChunk)->iWidth = iWidth; + ((mng_basip)pChunk)->iHeight = iHeight; + ((mng_basip)pChunk)->iBitdepth = iBitdepth; + ((mng_basip)pChunk)->iColortype = iColortype; + ((mng_basip)pChunk)->iCompression = iCompression; + ((mng_basip)pChunk)->iFilter = iFilter; + ((mng_basip)pChunk)->iInterlace = iInterlace; + ((mng_basip)pChunk)->iRed = iRed; + ((mng_basip)pChunk)->iGreen = iGreen; + ((mng_basip)pChunk)->iBlue = iBlue; + ((mng_basip)pChunk)->iAlpha = iAlpha; + ((mng_basip)pChunk)->iViewable = iViewable; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BASI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLON +mng_retcode MNG_DECL mng_putchunk_clon (mng_handle hHandle, + mng_uint16 iSourceid, + mng_uint16 iCloneid, + mng_uint8 iClonetype, + mng_uint8 iDonotshow, + mng_uint8 iConcrete, + mng_bool bHasloca, + mng_uint8 iLocationtype, + mng_int32 iLocationx, + mng_int32 iLocationy) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_CLON, mng_init_general, mng_free_general, mng_read_clon, mng_write_clon, mng_assign_general, 0, 0, sizeof(mng_clon)}; +#else + {MNG_UINT_CLON, mng_init_clon, mng_free_clon, mng_read_clon, mng_write_clon, mng_assign_clon, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CLON, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_CLON)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_clon (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_CLON, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_clonp)pChunk)->iSourceid = iSourceid; + ((mng_clonp)pChunk)->iCloneid = iCloneid; + ((mng_clonp)pChunk)->iClonetype = iClonetype; + ((mng_clonp)pChunk)->iDonotshow = iDonotshow; + ((mng_clonp)pChunk)->iConcrete = iConcrete; + ((mng_clonp)pChunk)->bHasloca = bHasloca; + ((mng_clonp)pChunk)->iLocationtype = iLocationtype; + ((mng_clonp)pChunk)->iLocationx = iLocationx; + ((mng_clonp)pChunk)->iLocationy = iLocationy; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode MNG_DECL mng_putchunk_past (mng_handle hHandle, + mng_uint16 iDestid, + mng_uint8 iTargettype, + mng_int32 iTargetx, + mng_int32 iTargety, + mng_uint32 iCount) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_PAST, mng_init_general, mng_free_past, mng_read_past, mng_write_past, mng_assign_past, 0, 0, sizeof(mng_past)}; +#else + {MNG_UINT_PAST, mng_init_past, mng_free_past, mng_read_past, mng_write_past, mng_assign_past, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PAST, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_PAST)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_past (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_PAST, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_pastp)pChunk)->iDestid = iDestid; + ((mng_pastp)pChunk)->iTargettype = iTargettype; + ((mng_pastp)pChunk)->iTargetx = iTargetx; + ((mng_pastp)pChunk)->iTargety = iTargety; + ((mng_pastp)pChunk)->iCount = iCount; + + if (iCount) + MNG_ALLOC (pData, ((mng_pastp)pChunk)->pSources, iCount * sizeof (mng_past_source)); + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PAST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode MNG_DECL mng_putchunk_past_src (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint16 iSourceid, + mng_uint8 iComposition, + mng_uint8 iOrientation, + mng_uint8 iOffsettype, + mng_int32 iOffsetx, + mng_int32 iOffsety, + mng_uint8 iBoundarytype, + mng_int32 iBoundaryl, + mng_int32 iBoundaryr, + mng_int32 iBoundaryt, + mng_int32 iBoundaryb) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_past_sourcep pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PAST_SRC, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + + pChunk = pData->pLastchunk; /* last one must have been PAST ! */ + + if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_PAST) + MNG_ERROR (pData, MNG_NOCORRCHUNK) + /* index out of bounds ? */ + if (iEntry >= ((mng_pastp)pChunk)->iCount) + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + /* address proper entry */ + pEntry = ((mng_pastp)pChunk)->pSources + iEntry; + + pEntry->iSourceid = iSourceid; /* fill entry */ + pEntry->iComposition = iComposition; + pEntry->iOrientation = iOrientation; + pEntry->iOffsettype = iOffsettype; + pEntry->iOffsetx = iOffsetx; + pEntry->iOffsety = iOffsety; + pEntry->iBoundarytype = iBoundarytype; + pEntry->iBoundaryl = iBoundaryl; + pEntry->iBoundaryr = iBoundaryr; + pEntry->iBoundaryt = iBoundaryt; + pEntry->iBoundaryb = iBoundaryb; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PAST_SRC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +mng_retcode MNG_DECL mng_putchunk_disc (mng_handle hHandle, + mng_uint32 iCount, + mng_uint16p pObjectids) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_DISC, mng_init_general, mng_free_disc, mng_read_disc, mng_write_disc, mng_assign_disc, 0, 0, sizeof(mng_disc)}; +#else + {MNG_UINT_DISC, mng_init_disc, mng_free_disc, mng_read_disc, mng_write_disc, mng_assign_disc, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DISC, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_DISC)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_disc (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_DISC, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_discp)pChunk)->iCount = iCount; + + if (iCount) + { + mng_uint32 iSize = iCount * sizeof (mng_uint32); + + MNG_ALLOC (pData, ((mng_discp)pChunk)->pObjectids, iSize); + MNG_COPY (((mng_discp)pChunk)->pObjectids, pObjectids, iSize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DISC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BACK +mng_retcode MNG_DECL mng_putchunk_back (mng_handle hHandle, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint8 iMandatory, + mng_uint16 iImageid, + mng_uint8 iTile) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_BACK, mng_init_general, mng_free_general, mng_read_back, mng_write_back, mng_assign_general, 0, 0, sizeof(mng_back)}; +#else + {MNG_UINT_BACK, mng_init_back, mng_free_back, mng_read_back, mng_write_back, mng_assign_back, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BACK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_BACK)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_back (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_BACK, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_backp)pChunk)->iRed = iRed; + ((mng_backp)pChunk)->iGreen = iGreen; + ((mng_backp)pChunk)->iBlue = iBlue; + ((mng_backp)pChunk)->iMandatory = iMandatory; + ((mng_backp)pChunk)->iImageid = iImageid; + ((mng_backp)pChunk)->iTile = iTile; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +mng_retcode MNG_DECL mng_putchunk_fram (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iMode, + mng_uint32 iNamesize, + mng_pchar zName, + mng_uint8 iChangedelay, + mng_uint8 iChangetimeout, + mng_uint8 iChangeclipping, + mng_uint8 iChangesyncid, + mng_uint32 iDelay, + mng_uint32 iTimeout, + mng_uint8 iBoundarytype, + mng_int32 iBoundaryl, + mng_int32 iBoundaryr, + mng_int32 iBoundaryt, + mng_int32 iBoundaryb, + mng_uint32 iCount, + mng_uint32p pSyncids) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_FRAM, mng_init_general, mng_free_fram, mng_read_fram, mng_write_fram, mng_assign_fram, 0, 0, sizeof(mng_fram)}; +#else + {MNG_UINT_FRAM, mng_init_fram, mng_free_fram, mng_read_fram, mng_write_fram, mng_assign_fram, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_FRAM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_FRAM)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_fram (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_FRAM, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_framp)pChunk)->bEmpty = bEmpty; + ((mng_framp)pChunk)->iMode = iMode; + ((mng_framp)pChunk)->iNamesize = iNamesize; + ((mng_framp)pChunk)->iChangedelay = iChangedelay; + ((mng_framp)pChunk)->iChangetimeout = iChangetimeout; + ((mng_framp)pChunk)->iChangeclipping = iChangeclipping; + ((mng_framp)pChunk)->iChangesyncid = iChangesyncid; + ((mng_framp)pChunk)->iDelay = iDelay; + ((mng_framp)pChunk)->iTimeout = iTimeout; + ((mng_framp)pChunk)->iBoundarytype = iBoundarytype; + ((mng_framp)pChunk)->iBoundaryl = iBoundaryl; + ((mng_framp)pChunk)->iBoundaryr = iBoundaryr; + ((mng_framp)pChunk)->iBoundaryt = iBoundaryt; + ((mng_framp)pChunk)->iBoundaryb = iBoundaryb; + ((mng_framp)pChunk)->iCount = iCount; + + if (iNamesize) + { + MNG_ALLOC (pData, ((mng_framp)pChunk)->zName, iNamesize + 1); + MNG_COPY (((mng_framp)pChunk)->zName, zName, iNamesize); + } + + if (iCount) + { + mng_uint32 iSize = iCount * sizeof (mng_uint32); + + MNG_ALLOC (pData, ((mng_framp)pChunk)->pSyncids, iSize); + MNG_COPY (((mng_framp)pChunk)->pSyncids, pSyncids, iSize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_FRAM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MOVE +mng_retcode MNG_DECL mng_putchunk_move (mng_handle hHandle, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMovetype, + mng_int32 iMovex, + mng_int32 iMovey) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_MOVE, mng_init_general, mng_free_general, mng_read_move, mng_write_move, mng_assign_general, 0, 0, sizeof(mng_move)}; +#else + {MNG_UINT_MOVE, mng_init_move, mng_free_move, mng_read_move, mng_write_move, mng_assign_move, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MOVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_MOVE)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_move (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_MOVE, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_movep)pChunk)->iFirstid = iFirstid; + ((mng_movep)pChunk)->iLastid = iLastid; + ((mng_movep)pChunk)->iMovetype = iMovetype; + ((mng_movep)pChunk)->iMovex = iMovex; + ((mng_movep)pChunk)->iMovey = iMovey; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MOVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLIP +mng_retcode MNG_DECL mng_putchunk_clip (mng_handle hHandle, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_CLIP, mng_init_general, mng_free_general, mng_read_clip, mng_write_clip, mng_assign_general, 0, 0, sizeof(mng_clip)}; +#else + {MNG_UINT_CLIP, mng_init_clip, mng_free_clip, mng_read_clip, mng_write_clip, mng_assign_clip, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CLIP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_CLIP)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_clip (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_CLIP, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_clipp)pChunk)->iFirstid = iFirstid; + ((mng_clipp)pChunk)->iLastid = iLastid; + ((mng_clipp)pChunk)->iCliptype = iCliptype; + ((mng_clipp)pChunk)->iClipl = iClipl; + ((mng_clipp)pChunk)->iClipr = iClipr; + ((mng_clipp)pChunk)->iClipt = iClipt; + ((mng_clipp)pChunk)->iClipb = iClipb; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CLIP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SHOW +mng_retcode MNG_DECL mng_putchunk_show (mng_handle hHandle, + mng_bool bEmpty, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMode) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_SHOW, mng_init_general, mng_free_general, mng_read_show, mng_write_show, mng_assign_general, 0, 0, sizeof(mng_show)}; +#else + {MNG_UINT_SHOW, mng_init_show, mng_free_show, mng_read_show, mng_write_show, mng_assign_show, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SHOW, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_SHOW)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_show (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_SHOW, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_showp)pChunk)->bEmpty = bEmpty; + ((mng_showp)pChunk)->iFirstid = iFirstid; + ((mng_showp)pChunk)->iLastid = iLastid; + ((mng_showp)pChunk)->iMode = iMode; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_TERM +mng_retcode MNG_DECL mng_putchunk_term (mng_handle hHandle, + mng_uint8 iTermaction, + mng_uint8 iIteraction, + mng_uint32 iDelay, + mng_uint32 iItermax) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_TERM, mng_init_general, mng_free_general, mng_read_term, mng_write_term, mng_assign_general, 0, 0, sizeof(mng_term)}; +#else + {MNG_UINT_TERM, mng_init_term, mng_free_term, mng_read_term, mng_write_term, mng_assign_term, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TERM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_term (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_TERM, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_termp)pChunk)->iTermaction = iTermaction; + ((mng_termp)pChunk)->iIteraction = iIteraction; + ((mng_termp)pChunk)->iDelay = iDelay; + ((mng_termp)pChunk)->iItermax = iItermax; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode MNG_DECL mng_putchunk_save (mng_handle hHandle, + mng_bool bEmpty, + mng_uint8 iOffsettype, + mng_uint32 iCount) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_SAVE, mng_init_general, mng_free_save, mng_read_save, mng_write_save, mng_assign_save, 0, 0, sizeof(mng_save)}; +#else + {MNG_UINT_SAVE, mng_init_save, mng_free_save, mng_read_save, mng_write_save, mng_assign_save, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SAVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_SAVE)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_save (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_SAVE, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_savep)pChunk)->bEmpty = bEmpty; + ((mng_savep)pChunk)->iOffsettype = iOffsettype; + ((mng_savep)pChunk)->iCount = iCount; + + if (iCount) + MNG_ALLOC (pData, ((mng_savep)pChunk)->pEntries, iCount * sizeof (mng_save_entry)); + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_save_entry (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint8 iEntrytype, + mng_uint32arr2 iOffset, + mng_uint32arr2 iStarttime, + mng_uint32 iLayernr, + mng_uint32 iFramenr, + mng_uint32 iNamesize, + mng_pchar zName) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_save_entryp pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SAVE_ENTRY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + + pChunk = pData->pLastchunk; /* last one must have been SAVE ! */ + + if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_SAVE) + MNG_ERROR (pData, MNG_NOCORRCHUNK) + /* index out of bounds ? */ + if (iEntry >= ((mng_savep)pChunk)->iCount) + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + /* address proper entry */ + pEntry = ((mng_savep)pChunk)->pEntries + iEntry; + + pEntry->iEntrytype = iEntrytype; /* fill entry */ + pEntry->iOffset[0] = iOffset[0]; + pEntry->iOffset[1] = iOffset[1]; + pEntry->iStarttime[0] = iStarttime[0]; + pEntry->iStarttime[1] = iStarttime[1]; + pEntry->iLayernr = iLayernr; + pEntry->iFramenr = iFramenr; + pEntry->iNamesize = iNamesize; + + if (iNamesize) + { + MNG_ALLOC (pData, pEntry->zName, iNamesize + 1); + MNG_COPY (pEntry->zName, zName, iNamesize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SAVE_ENTRY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode MNG_DECL mng_putchunk_seek (mng_handle hHandle, + mng_uint32 iNamesize, + mng_pchar zName) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_SEEK, mng_init_general, mng_free_seek, mng_read_seek, mng_write_seek, mng_assign_seek, 0, 0, sizeof(mng_seek)}; +#else + {MNG_UINT_SEEK, mng_init_seek, mng_free_seek, mng_read_seek, mng_write_seek, mng_assign_seek, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SEEK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_SEEK)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_seek (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_SEEK, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_seekp)pChunk)->iNamesize = iNamesize; + + if (iNamesize) + { + MNG_ALLOC (pData, ((mng_seekp)pChunk)->zName, iNamesize + 1); + MNG_COPY (((mng_seekp)pChunk)->zName, zName, iNamesize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +mng_retcode MNG_DECL mng_putchunk_expi (mng_handle hHandle, + mng_uint16 iSnapshotid, + mng_uint32 iNamesize, + mng_pchar zName) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_eXPI, mng_init_general, mng_free_expi, mng_read_expi, mng_write_expi, mng_assign_general, 0, 0, sizeof(mng_expi)}; +#else + {MNG_UINT_eXPI, mng_init_expi, mng_free_expi, mng_read_expi, mng_write_expi, mng_assign_expi, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EXPI, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_eXPI)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_expi (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_eXPI, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_expip)pChunk)->iSnapshotid = iSnapshotid; + ((mng_expip)pChunk)->iNamesize = iNamesize; + + if (iNamesize) + { + MNG_ALLOC (pData, ((mng_expip)pChunk)->zName, iNamesize + 1); + MNG_COPY (((mng_expip)pChunk)->zName, zName, iNamesize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EXPI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_fPRI +mng_retcode MNG_DECL mng_putchunk_fpri (mng_handle hHandle, + mng_uint8 iDeltatype, + mng_uint8 iPriority) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_fPRI, mng_init_general, mng_free_general, mng_read_fpri, mng_write_fpri, mng_assign_general, 0, 0, sizeof(mng_fpri)}; +#else + {MNG_UINT_fPRI, mng_init_fpri, mng_free_fpri, mng_read_fpri, mng_write_fpri, mng_assign_fpri, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_FPRI, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_fPRI)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_fpri (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_fPRI, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_fprip)pChunk)->iDeltatype = iDeltatype; + ((mng_fprip)pChunk)->iPriority = iPriority; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_FPRI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +mng_retcode MNG_DECL mng_putchunk_need (mng_handle hHandle, + mng_uint32 iKeywordssize, + mng_pchar zKeywords) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_nEED, mng_init_general, mng_free_need, mng_read_need, mng_write_need, mng_assign_need, 0, 0, sizeof(mng_need)}; +#else + {MNG_UINT_nEED, mng_init_need, mng_free_need, mng_read_need, mng_write_need, mng_assign_need, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_NEED, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_nEED)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_need (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_nEED, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_needp)pChunk)->iKeywordssize = iKeywordssize; + + if (iKeywordssize) + { + MNG_ALLOC (pData, ((mng_needp)pChunk)->zKeywords, iKeywordssize + 1); + MNG_COPY (((mng_needp)pChunk)->zKeywords, zKeywords, iKeywordssize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_NEED, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYg +mng_retcode MNG_DECL mng_putchunk_phyg (mng_handle hHandle, + mng_bool bEmpty, + mng_uint32 iSizex, + mng_uint32 iSizey, + mng_uint8 iUnit) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_pHYg, mng_init_general, mng_free_general, mng_read_phyg, mng_write_phyg, mng_assign_general, 0, 0, sizeof(mng_phyg)}; +#else + {MNG_UINT_pHYg, mng_init_phyg, mng_free_phyg, mng_read_phyg, mng_write_phyg, mng_assign_phyg, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PHYG, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_pHYg)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_phyg (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_pHYg, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_phygp)pChunk)->bEmpty = bEmpty; + ((mng_phygp)pChunk)->iSizex = iSizex; + ((mng_phygp)pChunk)->iSizey = iSizey; + ((mng_phygp)pChunk)->iUnit = iUnit; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PHYG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +mng_retcode MNG_DECL mng_putchunk_jhdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iColortype, + mng_uint8 iImagesampledepth, + mng_uint8 iImagecompression, + mng_uint8 iImageinterlace, + mng_uint8 iAlphasampledepth, + mng_uint8 iAlphacompression, + mng_uint8 iAlphafilter, + mng_uint8 iAlphainterlace) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_JHDR, mng_init_general, mng_free_general, mng_read_jhdr, mng_write_jhdr, mng_assign_general, 0, 0, sizeof(mng_jhdr)}; +#else + {MNG_UINT_JHDR, mng_init_jhdr, mng_free_jhdr, mng_read_jhdr, mng_write_jhdr, mng_assign_jhdr, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JHDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_JHDR)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_jhdr (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_JHDR, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_jhdrp)pChunk)->iWidth = iWidth; + ((mng_jhdrp)pChunk)->iHeight = iHeight; + ((mng_jhdrp)pChunk)->iColortype = iColortype; + ((mng_jhdrp)pChunk)->iImagesampledepth = iImagesampledepth; + ((mng_jhdrp)pChunk)->iImagecompression = iImagecompression; + ((mng_jhdrp)pChunk)->iImageinterlace = iImageinterlace; + ((mng_jhdrp)pChunk)->iAlphasampledepth = iAlphasampledepth; + ((mng_jhdrp)pChunk)->iAlphacompression = iAlphacompression; + ((mng_jhdrp)pChunk)->iAlphafilter = iAlphafilter; + ((mng_jhdrp)pChunk)->iAlphainterlace = iAlphainterlace; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +mng_retcode MNG_DECL mng_putchunk_jdat (mng_handle hHandle, + mng_uint32 iRawlen, + mng_ptr pRawdata) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_JDAT, mng_init_general, mng_free_jdat, mng_read_jdat, mng_write_jdat, mng_assign_jdat, 0, 0, sizeof(mng_jdat)}; +#else + {MNG_UINT_JDAT, mng_init_jdat, mng_free_jdat, mng_read_jdat, mng_write_jdat, mng_assign_jdat, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JDAT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR or JHDR first! */ + if ((pData->iFirstchunkadded != MNG_UINT_MHDR) && + (pData->iFirstchunkadded != MNG_UINT_JHDR) ) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_JDAT)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_jdat (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_JDAT, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_jdatp)pChunk)->iDatasize = iRawlen; + + if (iRawlen) + { + MNG_ALLOC (pData, ((mng_jdatp)pChunk)->pData, iRawlen); + MNG_COPY (((mng_jdatp)pChunk)->pData, pRawdata, iRawlen); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +mng_retcode MNG_DECL mng_putchunk_jdaa (mng_handle hHandle, + mng_uint32 iRawlen, + mng_ptr pRawdata) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_JDAA, mng_init_general, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa)}; +#else + {MNG_UINT_JDAA, mng_init_jdaa, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JDAA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR or JHDR first! */ + if ((pData->iFirstchunkadded != MNG_UINT_MHDR) && + (pData->iFirstchunkadded != MNG_UINT_JHDR) ) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_JDAA)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_jdaa (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_JDAA, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_jdaap)pChunk)->iDatasize = iRawlen; + + if (iRawlen) + { + MNG_ALLOC (pData, ((mng_jdaap)pChunk)->pData, iRawlen); + MNG_COPY (((mng_jdaap)pChunk)->pData, pRawdata, iRawlen); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JDAA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +mng_retcode MNG_DECL mng_putchunk_jsep (mng_handle hHandle) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_JSEP, mng_init_general, mng_free_general, mng_read_jsep, mng_write_jsep, mng_assign_general, 0, 0, sizeof(mng_jsep)}; +#else + {MNG_UINT_JSEP, mng_init_jsep, mng_free_jsep, mng_read_jsep, mng_write_jsep, mng_assign_jsep, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JSEP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR or JHDR first! */ + if ((pData->iFirstchunkadded != MNG_UINT_MHDR) && + (pData->iFirstchunkadded != MNG_UINT_JHDR) ) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_JSEP)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_jsep (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_JSEP, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JSEP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_putchunk_dhdr (mng_handle hHandle, + mng_uint16 iObjectid, + mng_uint8 iImagetype, + mng_uint8 iDeltatype, + mng_uint32 iBlockwidth, + mng_uint32 iBlockheight, + mng_uint32 iBlockx, + mng_uint32 iBlocky) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_DHDR, mng_init_general, mng_free_general, mng_read_dhdr, mng_write_dhdr, mng_assign_general, 0, 0, sizeof(mng_dhdr)}; +#else + {MNG_UINT_DHDR, mng_init_dhdr, mng_free_dhdr, mng_read_dhdr, mng_write_dhdr, mng_assign_dhdr, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DHDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_DHDR)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_dhdr (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_DHDR, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_dhdrp)pChunk)->iObjectid = iObjectid; + ((mng_dhdrp)pChunk)->iImagetype = iImagetype; + ((mng_dhdrp)pChunk)->iDeltatype = iDeltatype; + ((mng_dhdrp)pChunk)->iBlockwidth = iBlockwidth; + ((mng_dhdrp)pChunk)->iBlockheight = iBlockheight; + ((mng_dhdrp)pChunk)->iBlockx = iBlockx; + ((mng_dhdrp)pChunk)->iBlocky = iBlocky; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_putchunk_prom (mng_handle hHandle, + mng_uint8 iColortype, + mng_uint8 iSampledepth, + mng_uint8 iFilltype) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_PROM, mng_init_general, mng_free_general, mng_read_prom, mng_write_prom, mng_assign_general, 0, 0, sizeof(mng_prom)}; +#else + {MNG_UINT_PROM, mng_init_prom, mng_free_prom, mng_read_prom, mng_write_prom, mng_assign_prom, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PROM, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_PROM)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_prom (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_PROM, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_promp)pChunk)->iColortype = iColortype; + ((mng_promp)pChunk)->iSampledepth = iSampledepth; + ((mng_promp)pChunk)->iFilltype = iFilltype; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PROM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_putchunk_ipng (mng_handle hHandle) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_IPNG, mng_init_general, mng_free_general, mng_read_ipng, mng_write_ipng, mng_assign_general, 0, 0, sizeof(mng_ipng)}; +#else + {MNG_UINT_IPNG, mng_init_ipng, mng_free_ipng, mng_read_ipng, mng_write_ipng, mng_assign_ipng, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IPNG, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_IPNG)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_ipng (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_IPNG, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_putchunk_pplt (mng_handle hHandle, + mng_uint8 iDeltatype, + mng_uint32 iCount) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_PPLT, mng_init_general, mng_free_general, mng_read_pplt, mng_write_pplt, mng_assign_general, 0, 0, sizeof(mng_pplt)}; +#else + {MNG_UINT_PPLT, mng_init_pplt, mng_free_pplt, mng_read_pplt, mng_write_pplt, mng_assign_pplt, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PPLT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_PPLT)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_pplt (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_PPLT, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_ppltp)pChunk)->iDeltatype = iDeltatype; + ((mng_ppltp)pChunk)->iCount = iCount; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_putchunk_pplt_entry (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint16 iAlpha) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_pplt_entryp pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PPLT_ENTRY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + + pChunk = pData->pLastchunk; /* last one must have been PPLT ! */ + + if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_PPLT) + MNG_ERROR (pData, MNG_NOCORRCHUNK) + + /* index out of bounds ? */ + if (iEntry >= ((mng_ppltp)pChunk)->iCount) + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + /* address proper entry */ + pEntry = (mng_pplt_entryp)(((mng_ppltp)pChunk)->aEntries) + iEntry; + + pEntry->iRed = (mng_uint8)iRed; /* fill the entry */ + pEntry->iGreen = (mng_uint8)iGreen; + pEntry->iBlue = (mng_uint8)iBlue; + pEntry->iAlpha = (mng_uint8)iAlpha; + pEntry->bUsed = MNG_TRUE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PPLT_ENTRY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +mng_retcode MNG_DECL mng_putchunk_ijng (mng_handle hHandle) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_IJNG, mng_init_general, mng_free_general, mng_read_ijng, mng_write_ijng, mng_assign_general, 0, 0, sizeof(mng_ijng)}; +#else + {MNG_UINT_IJNG, mng_init_ijng, mng_free_ijng, mng_read_ijng, mng_write_ijng, mng_assign_ijng, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IJNG, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_IJNG)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_ijng (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_IJNG, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode MNG_DECL mng_putchunk_drop (mng_handle hHandle, + mng_uint32 iCount, + mng_chunkidp pChunknames) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_DROP, mng_init_general, mng_free_drop, mng_read_drop, mng_write_drop, mng_assign_drop, 0, 0, sizeof(mng_drop)}; +#else + {MNG_UINT_DROP, mng_init_drop, mng_free_drop, mng_read_drop, mng_write_drop, mng_assign_drop, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DROP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_DROP)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_drop (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_DROP, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_dropp)pChunk)->iCount = iCount; + + if (iCount) + { + mng_uint32 iSize = iCount * sizeof (mng_chunkid); + + MNG_ALLOC (pData, ((mng_dropp)pChunk)->pChunknames, iSize); + MNG_COPY (((mng_dropp)pChunk)->pChunknames, pChunknames, iSize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DROP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK +mng_retcode MNG_DECL mng_putchunk_dbyk (mng_handle hHandle, + mng_chunkid iChunkname, + mng_uint8 iPolarity, + mng_uint32 iKeywordssize, + mng_pchar zKeywords) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_DBYK, mng_init_general, mng_free_dbyk, mng_read_dbyk, mng_write_dbyk, mng_assign_dbyk, 0, 0, sizeof(mng_dbyk)}; +#else + {MNG_UINT_DBYK, mng_init_dbyk, mng_free_dbyk, mng_read_dbyk, mng_write_dbyk, mng_assign_dbyk, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DBYK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_DBYK)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_dbyk (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_DBYK, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_dbykp)pChunk)->iChunkname = iChunkname; + ((mng_dbykp)pChunk)->iPolarity = iPolarity; + ((mng_dbykp)pChunk)->iKeywordssize = iKeywordssize; + + if (iKeywordssize) + { + MNG_ALLOC (pData, ((mng_dbykp)pChunk)->zKeywords, iKeywordssize + 1); + MNG_COPY (((mng_dbykp)pChunk)->zKeywords, zKeywords, iKeywordssize); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DBYK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +mng_retcode MNG_DECL mng_putchunk_ordr (mng_handle hHandle, + mng_uint32 iCount) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_ORDR, mng_init_general, mng_free_ordr, mng_read_ordr, mng_write_ordr, mng_assign_ordr, 0, 0, sizeof(mng_ordr)}; +#else + {MNG_UINT_ORDR, mng_init_ordr, mng_free_ordr, mng_read_ordr, mng_write_ordr, mng_assign_ordr, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ORDR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_ORDR)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_ordr (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_ORDR, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_ordrp)pChunk)->iCount = iCount; + + if (iCount) + MNG_ALLOC (pData, ((mng_ordrp)pChunk)->pEntries, iCount * sizeof (mng_ordr_entry)); + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ORDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR +mng_retcode MNG_DECL mng_putchunk_ordr_entry (mng_handle hHandle, + mng_uint32 iEntry, + mng_chunkid iChunkname, + mng_uint8 iOrdertype) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_ordr_entryp pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ORDR_ENTRY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + + pChunk = pData->pLastchunk; /* last one must have been ORDR ! */ + + if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_ORDR) + MNG_ERROR (pData, MNG_NOCORRCHUNK) + /* index out of bounds ? */ + if (iEntry >= ((mng_ordrp)pChunk)->iCount) + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + /* address proper entry */ + pEntry = ((mng_ordrp)pChunk)->pEntries + iEntry; + + pEntry->iChunkname = iChunkname; /* fill the entry */ + pEntry->iOrdertype = iOrdertype; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ORDR_ENTRY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +mng_retcode MNG_DECL mng_putchunk_magn (mng_handle hHandle, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint16 iMethodX, + mng_uint16 iMX, + mng_uint16 iMY, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint16 iMT, + mng_uint16 iMB, + mng_uint16 iMethodY) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_MAGN, mng_init_general, mng_free_general, mng_read_magn, mng_write_magn, mng_assign_general, 0, 0, sizeof(mng_magn)}; +#else + {MNG_UINT_MAGN, mng_init_magn, mng_free_magn, mng_read_magn, mng_write_magn, mng_assign_magn, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MAGN, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_MAGN)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_magn (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_MAGN, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_magnp)pChunk)->iFirstid = iFirstid; + ((mng_magnp)pChunk)->iLastid = iLastid; + ((mng_magnp)pChunk)->iMethodX = (mng_uint8)iMethodX; + ((mng_magnp)pChunk)->iMX = iMX; + ((mng_magnp)pChunk)->iMY = iMY; + ((mng_magnp)pChunk)->iML = iML; + ((mng_magnp)pChunk)->iMR = iMR; + ((mng_magnp)pChunk)->iMT = iMT; + ((mng_magnp)pChunk)->iMB = iMB; + ((mng_magnp)pChunk)->iMethodY = (mng_uint8)iMethodY; + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_EXT mng_retcode MNG_DECL mng_putchunk_mpng (mng_handle hHandle, + mng_uint32 iFramewidth, + mng_uint32 iFrameheight, + mng_uint16 iNumplays, + mng_uint16 iTickspersec, + mng_uint8 iCompressionmethod, + mng_uint32 iCount) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_mpNG, mng_init_general, mng_free_mpng, mng_read_mpng, mng_write_mpng, mng_assign_mpng, 0, 0, sizeof(mng_mpng)}; +#else + {MNG_UINT_mpNG, mng_init_mpng, mng_free_mpng, mng_read_mpng, mng_write_mpng, mng_assign_mpng, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MPNG, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a IHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_IHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_mpng (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_mpNG, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_mpngp)pChunk)->iFramewidth = iFramewidth; + ((mng_mpngp)pChunk)->iFrameheight = iFrameheight; + ((mng_mpngp)pChunk)->iNumplays = iNumplays; + ((mng_mpngp)pChunk)->iTickspersec = iTickspersec; + ((mng_mpngp)pChunk)->iCompressionmethod = iCompressionmethod; + ((mng_mpngp)pChunk)->iFramessize = iCount * sizeof (mng_mpng_frame); + + if (iCount) + MNG_ALLOC (pData, ((mng_mpngp)pChunk)->pFrames, ((mng_mpngp)pChunk)->iFramessize); + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +MNG_EXT mng_retcode MNG_DECL mng_putchunk_mpng_frame (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint32 iX, + mng_uint32 iY, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_int32 iXoffset, + mng_int32 iYoffset, + mng_uint16 iTicks) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_mpng_framep pFrame; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MPNG_FRAME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a IHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_IHDR) + MNG_ERROR (pData, MNG_NOHEADER) + + pChunk = pData->pLastchunk; /* last one must have been mpNG ! */ + + if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_mpNG) + MNG_ERROR (pData, MNG_NOCORRCHUNK) + /* index out of bounds ? */ + if (iEntry >= (((mng_mpngp)pChunk)->iFramessize / sizeof (mng_mpng_frame))) + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + /* address proper entry */ + pFrame = ((mng_mpngp)pChunk)->pFrames + iEntry; + /* fill entry */ + pFrame->iX = iX; + pFrame->iY = iY; + pFrame->iWidth = iWidth; + pFrame->iHeight = iHeight; + pFrame->iXoffset = iXoffset; + pFrame->iYoffset = iYoffset; + pFrame->iTicks = iTicks; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MPNG_FRAME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_evNT +mng_retcode MNG_DECL mng_putchunk_evnt (mng_handle hHandle, + mng_uint32 iCount) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_evNT, mng_init_general, mng_free_evnt, mng_read_evnt, mng_write_evnt, mng_assign_evnt, 0, 0, sizeof(mng_evnt)}; +#else + {MNG_UINT_evNT, mng_init_evnt, mng_free_evnt, mng_read_evnt, mng_write_evnt, mng_assign_evnt, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EVNT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, MNG_UINT_evNT)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_evnt (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_evNT, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_evntp)pChunk)->iCount = iCount; + + if (iCount) + MNG_ALLOC (pData, ((mng_evntp)pChunk)->pEntries, iCount * sizeof (mng_evnt_entry)); + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EVNT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_evnt_entry (mng_handle hHandle, + mng_uint32 iEntry, + mng_uint8 iEventtype, + mng_uint8 iMasktype, + mng_int32 iLeft, + mng_int32 iRight, + mng_int32 iTop, + mng_int32 iBottom, + mng_uint16 iObjectid, + mng_uint8 iIndex, + mng_uint32 iSegmentnamesize, + mng_pchar zSegmentname) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_evnt_entryp pEntry; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EVNT_ENTRY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a MHDR first! */ + if (pData->iFirstchunkadded != MNG_UINT_MHDR) + MNG_ERROR (pData, MNG_NOHEADER) + + pChunk = pData->pLastchunk; /* last one must have been evNT ! */ + + if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_evNT) + MNG_ERROR (pData, MNG_NOCORRCHUNK) + /* index out of bounds ? */ + if (iEntry >= ((mng_evntp)pChunk)->iCount) + MNG_ERROR (pData, MNG_INVALIDENTRYIX) + /* address proper entry */ + pEntry = ((mng_evntp)pChunk)->pEntries + iEntry; + /* fill entry */ + pEntry->iEventtype = iEventtype; + pEntry->iMasktype = iMasktype; + pEntry->iLeft = iLeft; + pEntry->iRight = iRight; + pEntry->iTop = iTop; + pEntry->iBottom = iBottom; + pEntry->iObjectid = iObjectid; + pEntry->iIndex = iIndex; + pEntry->iSegmentnamesize = iSegmentnamesize; + + if (iSegmentnamesize) + { + MNG_ALLOC (pData, pEntry->zSegmentname, iSegmentnamesize + 1); + MNG_COPY (pEntry->zSegmentname, zSegmentname, iSegmentnamesize); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EVNT_ENTRY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putchunk_unknown (mng_handle hHandle, + mng_chunkid iChunkname, + mng_uint32 iRawlen, + mng_ptr pRawdata) +{ + mng_datap pData; + mng_chunkp pChunk; + mng_retcode iRetcode; +#ifndef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_header sChunkheader = +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + {MNG_UINT_HUH, mng_init_general, mng_free_unknown, mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0, sizeof(mng_unknown_chunk)}; +#else + {MNG_UINT_HUH, mng_init_unknown, mng_free_unknown, mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0}; +#endif +#else + mng_chunk_header sChunkheader; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_UNKNOWN, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must have had a header first! */ + if (pData->iFirstchunkadded == 0) + MNG_ERROR (pData, MNG_NOHEADER) + /* prevent misplaced TERM ! */ + if (!check_term (pData, iChunkname)) + MNG_ERROR (pData, MNG_TERMSEQERROR) + /* create the chunk */ +#ifndef MNG_OPTIMIZE_CHUNKREADER +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#else + iRetcode = mng_init_unknown (pData, &sChunkheader, &pChunk); +#endif +#else + mng_get_chunkheader(MNG_UINT_HUH, &sChunkheader); + iRetcode = mng_init_general (pData, &sChunkheader, &pChunk); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fill the chunk */ + ((mng_unknown_chunkp)pChunk)->sHeader.iChunkname = iChunkname; + ((mng_unknown_chunkp)pChunk)->iDatasize = iRawlen; + + if (iRawlen) + { + MNG_ALLOC (pData, ((mng_unknown_chunkp)pChunk)->pData, iRawlen); + MNG_COPY (((mng_unknown_chunkp)pChunk)->pData, pRawdata, iRawlen); + } + + mng_add_chunk (pData, pChunk); /* add it to the list */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_UNKNOWN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +/* ************************************************************************** */ +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getimgdata_seq (mng_handle hHandle, + mng_uint32 iSeqnr, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_SEQ, MNG_LC_START); +#endif + + + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_SEQ, MNG_LC_END); +#endif + + return MNG_FNNOTIMPLEMENTED; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getimgdata_chunkseq (mng_handle hHandle, + mng_uint32 iSeqnr, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_CHUNKSEQ, MNG_LC_START); +#endif + + + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_CHUNKSEQ, MNG_LC_END); +#endif + + return MNG_FNNOTIMPLEMENTED; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getimgdata_chunk (mng_handle hHandle, + mng_handle hChunk, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_CHUNK, MNG_LC_START); +#endif + + + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_CHUNK, MNG_LC_END); +#endif + + return MNG_FNNOTIMPLEMENTED; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_putimgdata_ihdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iColortype, + mng_uint8 iBitdepth, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTIMGDATA_IHDR, MNG_LC_START); +#endif + + + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTIMGDATA_IHDR, MNG_LC_END); +#endif + + return MNG_FNNOTIMPLEMENTED; +} + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +mng_retcode MNG_DECL mng_putimgdata_jhdr (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iColortype, + mng_uint8 iBitdepth, + mng_uint8 iCompression, + mng_uint8 iInterlace, + mng_uint8 iAlphaBitdepth, + mng_uint8 iAlphaCompression, + mng_uint8 iAlphaFilter, + mng_uint8 iAlphaInterlace, + mng_uint32 iCanvasstyle, + mng_getcanvasline fGetcanvasline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTIMGDATA_JHDR, MNG_LC_START); +#endif + + + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTIMGDATA_JHDR, MNG_LC_END); +#endif + + return MNG_FNNOTIMPLEMENTED; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_updatemngheader (mng_handle hHandle, + mng_uint32 iFramecount, + mng_uint32 iLayercount, + mng_uint32 iPlaytime) +{ + mng_datap pData; + mng_chunkp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_UPDATEMNGHEADER, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must be a MNG animation! */ + if ((pData->eImagetype != mng_it_mng) || (pData->iFirstchunkadded != MNG_UINT_MHDR)) + MNG_ERROR (pData, MNG_NOMHDR) + + pChunk = pData->pFirstchunk; /* get the first chunk */ + /* and update the variables */ + ((mng_mhdrp)pChunk)->iFramecount = iFramecount; + ((mng_mhdrp)pChunk)->iLayercount = iLayercount; + ((mng_mhdrp)pChunk)->iPlaytime = iPlaytime; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_UPDATEMNGHEADER, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_updatemngsimplicity (mng_handle hHandle, + mng_uint32 iSimplicity) +{ + mng_datap pData; + mng_chunkp pChunk; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_UPDATEMNGSIMPLICITY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = (mng_datap)hHandle; /* and make it addressable */ + + if (!pData->bCreating) /* aren't we creating a new file ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID) + /* must be a MNG animation! */ + if ((pData->eImagetype != mng_it_mng) || (pData->iFirstchunkadded != MNG_UINT_MHDR)) + MNG_ERROR (pData, MNG_NOMHDR) + + pChunk = pData->pFirstchunk; /* get the first chunk */ + /* and update the variable */ + ((mng_mhdrp)pChunk)->iSimplicity = iSimplicity; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_UPDATEMNGSIMPLICITY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +/* ************************************************************************** */ + +#endif /* MNG_ACCESS_CHUNKS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + + + diff --git a/src/3rdparty/libmng/libmng_chunks.h b/src/3rdparty/libmng/libmng_chunks.h new file mode 100644 index 0000000000..d10bf2dc79 --- /dev/null +++ b/src/3rdparty/libmng/libmng_chunks.h @@ -0,0 +1,1026 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_chunks.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Chunk structures (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of known chunk structures * */ +/* * * */ +/* * changes : 0.5.1 - 05/04/2000 - G.Juyn * */ +/* * - put in some extra comments * */ +/* * 0.5.1 - 05/06/2000 - G.Juyn * */ +/* * - fixed layout for sBIT, PPLT * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed write callback definition * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - fixed layout for PPLT again (missed deltatype ?!?) * */ +/* * * */ +/* * 0.5.2 - 05/31/2000 - G.Juyn * */ +/* * - removed useless definition (contributed by Tim Rowley) * */ +/* * 0.5.2 - 06/03/2000 - G.Juyn * */ +/* * - fixed makeup for Linux gcc compile * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/10/2000 - G.Juyn * */ +/* * - fixed DEFI behavior * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added JDAA chunk * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - added HLAPI function to copy chunks * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 11/28/2002 - G.Juyn * */ +/* * - fixed definition of iMethodX/Y for MAGN chunk * */ +/* * * */ +/* * 1.0.6 - 05/25/2003 - G.R-P * */ +/* * added MNG_SKIPCHUNK_cHNK footprint optimizations * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * * */ +/* * 1.0.7 - 03/24/2004 - G.R-P * */ +/* * - added conditional around MNG_NO_DELTA_PNG support * */ +/* * * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKINITFREE * */ +/* * 1.0.9 - 12/06/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_chunks_h_ +#define _libmng_chunks_h_ + +/* ************************************************************************** */ + +#ifdef MNG_SWAP_ENDIAN +#define PNG_SIG 0x474e5089L +#define JNG_SIG 0x474e4a8bL +#define MNG_SIG 0x474e4d8aL +#define POST_SIG 0x0a1a0a0dL +#else +#define PNG_SIG 0x89504e47L +#define JNG_SIG 0x8b4a4e47L +#define MNG_SIG 0x8a4d4e47L +#define POST_SIG 0x0d0a1a0aL +#endif + +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_CHUNKREADER + +typedef mng_retcode (*mng_f_specialfunc) (mng_datap pData, + mng_chunkp pChunk, + mng_uint32* piRawlen, + mng_uint8p* ppRawdata); + +typedef mng_retcode (*mng_c_specialfunc) (mng_datap pData, + mng_chunkp pChunk); + +#define MNG_FIELD_OPTIONAL 0x0001 +#define MNG_FIELD_TERMINATOR 0x0002 +#define MNG_FIELD_REPETITIVE 0x0004 +#define MNG_FIELD_DEFLATED 0x0008 +#define MNG_FIELD_IFIMGTYPES 0x01F0 /* image-type mask */ +#define MNG_FIELD_IFIMGTYPE0 0x0010 +#define MNG_FIELD_IFIMGTYPE2 0x0020 +#define MNG_FIELD_IFIMGTYPE3 0x0040 +#define MNG_FIELD_IFIMGTYPE4 0x0080 +#define MNG_FIELD_IFIMGTYPE6 0x0100 +#define MNG_FIELD_PUTIMGTYPE 0x0200 +#define MNG_FIELD_NOHIGHBIT 0x0400 +#define MNG_FIELD_GROUPMASK 0x7000 +#define MNG_FIELD_GROUP1 0x1000 +#define MNG_FIELD_GROUP2 0x2000 +#define MNG_FIELD_GROUP3 0x3000 +#define MNG_FIELD_GROUP4 0x4000 +#define MNG_FIELD_GROUP5 0x5000 +#define MNG_FIELD_GROUP6 0x6000 +#define MNG_FIELD_GROUP7 0x7000 +#define MNG_FIELD_INT 0x8000 + +typedef struct { /* chunk-field descriptor */ + mng_f_specialfunc pSpecialfunc; + mng_uint16 iFlags; + mng_uint16 iMinvalue; + mng_uint16 iMaxvalue; + mng_uint16 iLengthmin; + mng_uint16 iLengthmax; + mng_uint16 iOffsetchunk; + mng_uint16 iOffsetchunkind; + mng_uint16 iOffsetchunklen; + } mng_field_descriptor; +typedef mng_field_descriptor * mng_field_descp; + +#define MNG_DESCR_GLOBAL 0x0001 +#define MNG_DESCR_EMPTY 0x0002 +#define MNG_DESCR_EMPTYEMBED 0x0006 +#define MNG_DESCR_EMPTYGLOBAL 0x000A + +#define MNG_DESCR_GenHDR 0x0001 /* IHDR/JHDR/BASI/DHDR */ +#define MNG_DESCR_JngHDR 0x0002 /* JHDR/DHDR */ +#define MNG_DESCR_MHDR 0x0004 +#define MNG_DESCR_IHDR 0x0008 +#define MNG_DESCR_JHDR 0x0010 +#define MNG_DESCR_DHDR 0x0020 +#define MNG_DESCR_LOOP 0x0040 +#define MNG_DESCR_PLTE 0x0080 +#define MNG_DESCR_SAVE 0x0100 + +#define MNG_DESCR_NOIHDR 0x0001 +#define MNG_DESCR_NOJHDR 0x0002 +#define MNG_DESCR_NOBASI 0x0004 +#define MNG_DESCR_NODHDR 0x0008 +#define MNG_DESCR_NOIDAT 0x0010 +#define MNG_DESCR_NOJDAT 0x0020 +#define MNG_DESCR_NOJDAA 0x0040 +#define MNG_DESCR_NOPLTE 0x0080 +#define MNG_DESCR_NOJSEP 0x0100 +#define MNG_DESCR_NOMHDR 0x0200 +#define MNG_DESCR_NOTERM 0x0400 +#define MNG_DESCR_NOLOOP 0x0800 +#define MNG_DESCR_NOSAVE 0x1000 + +typedef struct { /* chunk descriptor */ + mng_imgtype eImgtype; + mng_createobjtype eCreateobject; + mng_uint16 iObjsize; + mng_uint16 iOffsetempty; + mng_ptr pObjcleanup; + mng_ptr pObjprocess; + mng_c_specialfunc pSpecialfunc; + mng_field_descp pFielddesc; + mng_uint16 iFielddesc; + mng_uint16 iAllowed; + mng_uint16 iMusthaves; + mng_uint16 iMustNOThaves; + } mng_chunk_descriptor; +typedef mng_chunk_descriptor * mng_chunk_descp; + +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + +/* ************************************************************************** */ + +typedef mng_retcode (*mng_createchunk) (mng_datap pData, + mng_chunkp pHeader, + mng_chunkp* ppChunk); + +typedef mng_retcode (*mng_cleanupchunk) (mng_datap pData, + mng_chunkp pHeader); + +typedef mng_retcode (*mng_readchunk) (mng_datap pData, + mng_chunkp pHeader, + mng_uint32 iRawlen, + mng_uint8p pRawdata, + mng_chunkp* pChunk); + +typedef mng_retcode (*mng_writechunk) (mng_datap pData, + mng_chunkp pChunk); + +typedef mng_retcode (*mng_assignchunk) (mng_datap pData, + mng_chunkp pChunkto, + mng_chunkp pChunkfrom); + +/* ************************************************************************** */ + +typedef struct { /* generic header */ + mng_chunkid iChunkname; + mng_createchunk fCreate; + mng_cleanupchunk fCleanup; + mng_readchunk fRead; + mng_writechunk fWrite; + mng_assignchunk fAssign; + mng_chunkp pNext; /* for double-linked list */ + mng_chunkp pPrev; +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + mng_size_t iChunksize; +#endif +#ifdef MNG_OPTIMIZE_CHUNKREADER + mng_chunk_descp pChunkdescr; +#endif + } mng_chunk_header; +typedef mng_chunk_header * mng_chunk_headerp; + +/* ************************************************************************** */ + +typedef struct { /* IHDR */ + mng_chunk_header sHeader; + mng_uint32 iWidth; + mng_uint32 iHeight; + mng_uint8 iBitdepth; + mng_uint8 iColortype; + mng_uint8 iCompression; + mng_uint8 iFilter; + mng_uint8 iInterlace; + } mng_ihdr; +typedef mng_ihdr * mng_ihdrp; + +/* ************************************************************************** */ + +typedef struct { /* PLTE */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint32 iEntrycount; + mng_rgbpaltab aEntries; + } mng_plte; +typedef mng_plte * mng_pltep; + +/* ************************************************************************** */ + +typedef struct { /* IDAT */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint32 iDatasize; + mng_ptr pData; + } mng_idat; +typedef mng_idat * mng_idatp; + +/* ************************************************************************** */ + +typedef struct { /* IEND */ + mng_chunk_header sHeader; + } mng_iend; +typedef mng_iend * mng_iendp; + +/* ************************************************************************** */ + +typedef struct { /* tRNS */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_bool bGlobal; + mng_uint8 iType; /* colortype (0,2,3) */ + mng_uint32 iCount; + mng_uint8arr aEntries; + mng_uint16 iGray; + mng_uint16 iRed; + mng_uint16 iGreen; + mng_uint16 iBlue; + mng_uint32 iRawlen; + mng_uint8arr aRawdata; + } mng_trns; +typedef mng_trns * mng_trnsp; + +/* ************************************************************************** */ + +typedef struct { /* gAMA */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint32 iGamma; + } mng_gama; +typedef mng_gama * mng_gamap; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +typedef struct { /* cHRM */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint32 iWhitepointx; + mng_uint32 iWhitepointy; + mng_uint32 iRedx; + mng_uint32 iRedy; + mng_uint32 iGreenx; + mng_uint32 iGreeny; + mng_uint32 iBluex; + mng_uint32 iBluey; + } mng_chrm; +typedef mng_chrm * mng_chrmp; +#endif + +/* ************************************************************************** */ + +typedef struct { /* sRGB */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint8 iRenderingintent; + } mng_srgb; +typedef mng_srgb * mng_srgbp; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +typedef struct { /* iCCP */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint32 iNamesize; + mng_pchar zName; + mng_uint8 iCompression; + mng_uint32 iProfilesize; + mng_ptr pProfile; + } mng_iccp; +typedef mng_iccp * mng_iccpp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tEXt +typedef struct { /* tEXt */ + mng_chunk_header sHeader; + mng_uint32 iKeywordsize; + mng_pchar zKeyword; + mng_uint32 iTextsize; + mng_pchar zText; + } mng_text; +typedef mng_text * mng_textp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_zTXt +typedef struct { /* zTXt */ + mng_chunk_header sHeader; + mng_uint32 iKeywordsize; + mng_pchar zKeyword; + mng_uint8 iCompression; + mng_uint32 iTextsize; + mng_pchar zText; + } mng_ztxt; +typedef mng_ztxt * mng_ztxtp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iTXt +typedef struct { /* iTXt */ + mng_chunk_header sHeader; + mng_uint32 iKeywordsize; + mng_pchar zKeyword; + mng_uint8 iCompressionflag; + mng_uint8 iCompressionmethod; + mng_uint32 iLanguagesize; + mng_pchar zLanguage; + mng_uint32 iTranslationsize; + mng_pchar zTranslation; + mng_uint32 iTextsize; + mng_pchar zText; + } mng_itxt; +typedef mng_itxt * mng_itxtp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +typedef struct { /* bKGD */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint8 iType; /* 3=indexed, 0=gray, 2=rgb */ + mng_uint8 iIndex; + mng_uint16 iGray; + mng_uint16 iRed; + mng_uint16 iGreen; + mng_uint16 iBlue; + } mng_bkgd; +typedef mng_bkgd * mng_bkgdp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYs +typedef struct { /* pHYs */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint32 iSizex; + mng_uint32 iSizey; + mng_uint8 iUnit; + } mng_phys; +typedef mng_phys * mng_physp; +#endif + +/* ************************************************************************** */ +#ifndef MNG_SKIPCHUNK_sBIT + +typedef struct { /* sBIT */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint8 iType; /* colortype (0,2,3,4,6,10,12,14,16) */ + mng_uint8arr4 aBits; + } mng_sbit; +typedef mng_sbit * mng_sbitp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sPLT +typedef struct { /* sPLT */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint32 iNamesize; + mng_pchar zName; + mng_uint8 iSampledepth; + mng_uint32 iEntrycount; + mng_ptr pEntries; + } mng_splt; +typedef mng_splt * mng_spltp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_hIST +typedef struct { /* hIST */ + mng_chunk_header sHeader; + mng_uint32 iEntrycount; + mng_uint16arr aEntries; + } mng_hist; +typedef mng_hist * mng_histp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_tIME +typedef struct { /* tIME */ + mng_chunk_header sHeader; + mng_uint16 iYear; + mng_uint8 iMonth; + mng_uint8 iDay; + mng_uint8 iHour; + mng_uint8 iMinute; + mng_uint8 iSecond; + } mng_time; +typedef mng_time * mng_timep; +#endif + +/* ************************************************************************** */ + +typedef struct { /* MHDR */ + mng_chunk_header sHeader; + mng_uint32 iWidth; + mng_uint32 iHeight; + mng_uint32 iTicks; + mng_uint32 iLayercount; + mng_uint32 iFramecount; + mng_uint32 iPlaytime; + mng_uint32 iSimplicity; + } mng_mhdr; +typedef mng_mhdr * mng_mhdrp; + +/* ************************************************************************** */ + +typedef struct { /* MEND */ + mng_chunk_header sHeader; + } mng_mend; +typedef mng_mend * mng_mendp; + +/* ************************************************************************** */ + +typedef struct { /* LOOP */ + mng_chunk_header sHeader; + mng_uint8 iLevel; + mng_uint32 iRepeat; + mng_uint8 iTermination; + mng_uint32 iItermin; + mng_uint32 iItermax; + mng_uint32 iCount; + mng_uint32p pSignals; + } mng_loop; +typedef mng_loop * mng_loopp; + +/* ************************************************************************** */ + +typedef struct { /* ENDL */ + mng_chunk_header sHeader; + mng_uint8 iLevel; + } mng_endl; +typedef mng_endl * mng_endlp; + +/* ************************************************************************** */ + +typedef struct { /* DEFI */ + mng_chunk_header sHeader; + mng_uint16 iObjectid; + mng_bool bHasdonotshow; + mng_uint8 iDonotshow; + mng_bool bHasconcrete; + mng_uint8 iConcrete; + mng_bool bHasloca; + mng_int32 iXlocation; + mng_int32 iYlocation; + mng_bool bHasclip; + mng_int32 iLeftcb; + mng_int32 iRightcb; + mng_int32 iTopcb; + mng_int32 iBottomcb; + } mng_defi; +typedef mng_defi * mng_defip; + +/* ************************************************************************** */ + +typedef struct { /* BASI */ + mng_chunk_header sHeader; + mng_uint32 iWidth; + mng_uint32 iHeight; + mng_uint8 iBitdepth; + mng_uint8 iColortype; + mng_uint8 iCompression; + mng_uint8 iFilter; + mng_uint8 iInterlace; + mng_uint16 iRed; + mng_uint16 iGreen; + mng_uint16 iBlue; +#ifdef MNG_OPTIMIZE_CHUNKREADER + mng_bool bHasalpha; +#endif + mng_uint16 iAlpha; + mng_uint8 iViewable; + } mng_basi; +typedef mng_basi * mng_basip; + +/* ************************************************************************** */ + +typedef struct { /* CLON */ + mng_chunk_header sHeader; + mng_uint16 iSourceid; + mng_uint16 iCloneid; + mng_uint8 iClonetype; +#ifdef MNG_OPTIMIZE_CHUNKREADER + mng_bool bHasdonotshow; +#endif + mng_uint8 iDonotshow; + mng_uint8 iConcrete; + mng_bool bHasloca; + mng_uint8 iLocationtype; + mng_int32 iLocationx; + mng_int32 iLocationy; + } mng_clon; +typedef mng_clon * mng_clonp; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +typedef struct { /* PAST source */ + mng_uint16 iSourceid; + mng_uint8 iComposition; + mng_uint8 iOrientation; + mng_uint8 iOffsettype; + mng_int32 iOffsetx; + mng_int32 iOffsety; + mng_uint8 iBoundarytype; + mng_int32 iBoundaryl; + mng_int32 iBoundaryr; + mng_int32 iBoundaryt; + mng_int32 iBoundaryb; + } mng_past_source; +typedef mng_past_source * mng_past_sourcep; + +typedef struct { /* PAST */ + mng_chunk_header sHeader; + mng_uint16 iDestid; + mng_uint8 iTargettype; + mng_int32 iTargetx; + mng_int32 iTargety; + mng_uint32 iCount; + mng_past_sourcep pSources; + } mng_past; +typedef mng_past * mng_pastp; +#endif + +/* ************************************************************************** */ + +typedef struct { /* DISC */ + mng_chunk_header sHeader; + mng_uint32 iCount; + mng_uint16p pObjectids; + } mng_disc; +typedef mng_disc * mng_discp; + +/* ************************************************************************** */ + +typedef struct { /* BACK */ + mng_chunk_header sHeader; + mng_uint16 iRed; + mng_uint16 iGreen; + mng_uint16 iBlue; + mng_uint8 iMandatory; + mng_uint16 iImageid; + mng_uint8 iTile; + } mng_back; +typedef mng_back * mng_backp; + +/* ************************************************************************** */ + +typedef struct { /* FRAM */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint8 iMode; + mng_uint32 iNamesize; + mng_pchar zName; + mng_uint8 iChangedelay; + mng_uint8 iChangetimeout; + mng_uint8 iChangeclipping; + mng_uint8 iChangesyncid; + mng_uint32 iDelay; + mng_uint32 iTimeout; + mng_uint8 iBoundarytype; + mng_int32 iBoundaryl; + mng_int32 iBoundaryr; + mng_int32 iBoundaryt; + mng_int32 iBoundaryb; + mng_uint32 iCount; + mng_uint32p pSyncids; + } mng_fram; +typedef mng_fram * mng_framp; + +/* ************************************************************************** */ + +typedef struct { /* MOVE */ + mng_chunk_header sHeader; + mng_uint16 iFirstid; + mng_uint16 iLastid; + mng_uint8 iMovetype; + mng_int32 iMovex; + mng_int32 iMovey; + } mng_move; +typedef mng_move * mng_movep; + +/* ************************************************************************** */ + +typedef struct { /* CLIP */ + mng_chunk_header sHeader; + mng_uint16 iFirstid; + mng_uint16 iLastid; + mng_uint8 iCliptype; + mng_int32 iClipl; + mng_int32 iClipr; + mng_int32 iClipt; + mng_int32 iClipb; + } mng_clip; +typedef mng_clip * mng_clipp; + +/* ************************************************************************** */ + +typedef struct { /* SHOW */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint16 iFirstid; +#ifdef MNG_OPTIMIZE_CHUNKREADER + mng_bool bHaslastid; +#endif + mng_uint16 iLastid; + mng_uint8 iMode; + } mng_show; +typedef mng_show * mng_showp; + +/* ************************************************************************** */ + +typedef struct { /* TERM */ + mng_chunk_header sHeader; + mng_uint8 iTermaction; + mng_uint8 iIteraction; + mng_uint32 iDelay; + mng_uint32 iItermax; + } mng_term; +typedef mng_term * mng_termp; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +typedef struct { /* SAVE entry */ + mng_uint8 iEntrytype; + mng_uint32arr2 iOffset; /* 0=MSI, 1=LSI */ + mng_uint32arr2 iStarttime; /* 0=MSI, 1=LSI */ + mng_uint32 iLayernr; + mng_uint32 iFramenr; + mng_uint32 iNamesize; + mng_pchar zName; + } mng_save_entry; +typedef mng_save_entry * mng_save_entryp; + +typedef struct { /* SAVE */ + mng_chunk_header sHeader; + mng_bool bEmpty; + mng_uint8 iOffsettype; + mng_uint32 iCount; + mng_save_entryp pEntries; + } mng_save; +typedef mng_save * mng_savep; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +typedef struct { /* SEEK */ + mng_chunk_header sHeader; + mng_uint32 iNamesize; + mng_pchar zName; + } mng_seek; +typedef mng_seek * mng_seekp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_eXPI +typedef struct { /* eXPI */ + mng_chunk_header sHeader; + mng_uint16 iSnapshotid; + mng_uint32 iNamesize; + mng_pchar zName; + } mng_expi; +typedef mng_expi * mng_expip; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_fPRI +typedef struct { /* fPRI */ + mng_chunk_header sHeader; + mng_uint8 iDeltatype; + mng_uint8 iPriority; + } mng_fpri; +typedef mng_fpri * mng_fprip; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_nEED +typedef struct { /* nEED */ + mng_chunk_header sHeader; + mng_uint32 iKeywordssize; + mng_pchar zKeywords; + } mng_need; +typedef mng_need * mng_needp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_pHYg +typedef mng_phys mng_phyg; /* pHYg */ +typedef mng_phyg * mng_phygp; +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +typedef struct { /* JHDR */ + mng_chunk_header sHeader; + mng_uint32 iWidth; + mng_uint32 iHeight; + mng_uint8 iColortype; + mng_uint8 iImagesampledepth; + mng_uint8 iImagecompression; + mng_uint8 iImageinterlace; + mng_uint8 iAlphasampledepth; + mng_uint8 iAlphacompression; + mng_uint8 iAlphafilter; + mng_uint8 iAlphainterlace; + } mng_jhdr; +typedef mng_jhdr * mng_jhdrp; + +/* ************************************************************************** */ + +typedef mng_idat mng_jdaa; /* JDAA */ +typedef mng_jdaa * mng_jdaap; + +/* ************************************************************************** */ + +typedef mng_idat mng_jdat; /* JDAT */ +typedef mng_jdat * mng_jdatp; + +/* ************************************************************************** */ + +typedef struct { /* JSEP */ + mng_chunk_header sHeader; + } mng_jsep; +typedef mng_jsep * mng_jsepp; + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG + +typedef struct { /* DHDR */ + mng_chunk_header sHeader; + mng_uint16 iObjectid; + mng_uint8 iImagetype; + mng_uint8 iDeltatype; +#ifdef MNG_OPTIMIZE_CHUNKREADER + mng_bool bHasblocksize; +#endif + mng_uint32 iBlockwidth; + mng_uint32 iBlockheight; +#ifdef MNG_OPTIMIZE_CHUNKREADER + mng_bool bHasblockloc; +#endif + mng_uint32 iBlockx; + mng_uint32 iBlocky; + } mng_dhdr; +typedef mng_dhdr * mng_dhdrp; + +/* ************************************************************************** */ + +typedef struct { /* PROM */ + mng_chunk_header sHeader; + mng_uint8 iColortype; + mng_uint8 iSampledepth; + mng_uint8 iFilltype; + } mng_prom; +typedef mng_prom * mng_promp; + +/* ************************************************************************** */ + +typedef struct { /* IPNG */ + mng_chunk_header sHeader; + } mng_ipng; +typedef mng_ipng *mng_ipngp; + +/* ************************************************************************** */ + +typedef struct { /* PPLT entry */ + mng_uint8 iRed; + mng_uint8 iGreen; + mng_uint8 iBlue; + mng_uint8 iAlpha; + mng_bool bUsed; + } mng_pplt_entry; +typedef mng_pplt_entry * mng_pplt_entryp; + +typedef struct { /* PPLT */ + mng_chunk_header sHeader; + mng_uint8 iDeltatype; + mng_uint32 iCount; + mng_pplt_entry aEntries [256]; + } mng_pplt; +typedef mng_pplt * mng_ppltp; + +/* ************************************************************************** */ + +typedef struct { /* IJNG */ + mng_chunk_header sHeader; + } mng_ijng; +typedef mng_ijng *mng_ijngp; + +/* ************************************************************************** */ + +typedef struct { /* DROP */ + mng_chunk_header sHeader; + mng_uint32 iCount; + mng_chunkidp pChunknames; + } mng_drop; +typedef mng_drop * mng_dropp; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DBYK +typedef struct { /* DBYK */ + mng_chunk_header sHeader; + mng_chunkid iChunkname; + mng_uint8 iPolarity; + mng_uint32 iKeywordssize; + mng_pchar zKeywords; + } mng_dbyk; +typedef mng_dbyk * mng_dbykp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_ORDR +typedef struct { /* ORDR entry */ + mng_chunkid iChunkname; + mng_uint8 iOrdertype; + } mng_ordr_entry; +typedef mng_ordr_entry * mng_ordr_entryp; + +typedef struct mng_ordr_struct { /* ORDR */ + mng_chunk_header sHeader; + mng_uint32 iCount; + mng_ordr_entryp pEntries; + } mng_ordr; +typedef mng_ordr * mng_ordrp; +#endif +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ + +typedef struct { /* MAGN */ + mng_chunk_header sHeader; + mng_uint16 iFirstid; + mng_uint16 iLastid; + mng_uint8 iMethodX; + mng_uint16 iMX; + mng_uint16 iMY; + mng_uint16 iML; + mng_uint16 iMR; + mng_uint16 iMT; + mng_uint16 iMB; + mng_uint8 iMethodY; + } mng_magn; +typedef mng_magn * mng_magnp; + +/* ************************************************************************** */ + +typedef struct { /* evNT entry */ + mng_uint8 iEventtype; + mng_uint8 iMasktype; + mng_int32 iLeft; + mng_int32 iRight; + mng_int32 iTop; + mng_int32 iBottom; + mng_uint16 iObjectid; + mng_uint8 iIndex; + mng_uint32 iSegmentnamesize; + mng_pchar zSegmentname; + } mng_evnt_entry; +typedef mng_evnt_entry * mng_evnt_entryp; + +typedef struct { /* evNT */ + mng_chunk_header sHeader; + mng_uint32 iCount; + mng_evnt_entryp pEntries; + } mng_evnt; +typedef mng_evnt * mng_evntp; + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +typedef struct { /* mpNG frame */ + mng_uint32 iX; + mng_uint32 iY; + mng_uint32 iWidth; + mng_uint32 iHeight; + mng_int32 iXoffset; + mng_int32 iYoffset; + mng_uint16 iTicks; + } mng_mpng_frame; +typedef mng_mpng_frame * mng_mpng_framep; + +typedef struct { /* mpNG */ + mng_chunk_header sHeader; + mng_uint32 iFramewidth; + mng_uint32 iFrameheight; + mng_uint16 iNumplays; + mng_uint16 iTickspersec; + mng_uint8 iCompressionmethod; + mng_uint32 iFramessize; + mng_mpng_framep pFrames; + } mng_mpng; +typedef mng_mpng * mng_mpngp; +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +typedef struct { /* ahDR */ + mng_chunk_header sHeader; + mng_uint32 iNumframes; + mng_uint32 iTickspersec; + mng_uint32 iNumplays; + mng_uint32 iTilewidth; + mng_uint32 iTileheight; + mng_uint8 iInterlace; + mng_uint8 iStillused; + } mng_ahdr; +typedef mng_ahdr * mng_ahdrp; + +typedef struct { /* adAT tile */ + mng_uint32 iTicks; + mng_int32 iXoffset; + mng_int32 iYoffset; + mng_uint8 iTilesource; + } mng_adat_tile; +typedef mng_adat_tile * mng_adat_tilep; + +typedef struct { /* adAT */ + mng_chunk_header sHeader; + mng_uint32 iTilessize; + mng_adat_tilep pTiles; + } mng_adat; +typedef mng_adat * mng_adatp; +#endif + +/* ************************************************************************** */ + +typedef struct { /* unknown chunk */ + mng_chunk_header sHeader; + mng_uint32 iDatasize; + mng_ptr pData; + } mng_unknown_chunk; +typedef mng_unknown_chunk * mng_unknown_chunkp; + +/* ************************************************************************** */ + +#endif /* _libmng_chunks_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_cms.c b/src/3rdparty/libmng/libmng_cms.c new file mode 100644 index 0000000000..999575f66e --- /dev/null +++ b/src/3rdparty/libmng/libmng_cms.c @@ -0,0 +1,758 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_cms.c copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : color management routines (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the color management routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/01/2000 - G.Juyn * */ +/* * - B001(105795) - fixed a typo and misconception about * */ +/* * freeing allocated gamma-table. (reported by Marti Maria) * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/09/2000 - G.Juyn * */ +/* * - filled application-based color-management routines * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added creatememprofile * */ +/* * - added callback error-reporting support * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.5.2 - 06/10/2000 - G.Juyn * */ +/* * - fixed some compilation-warnings (contrib Jason Morris) * */ +/* * * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - fixed problem with color-correction for stored images * */ +/* * 0.5.3 - 06/23/2000 - G.Juyn * */ +/* * - fixed problem with incorrect gamma-correction * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/31/2000 - G.Juyn * */ +/* * - fixed sRGB precedence for gamma_only corection * */ +/* * * */ +/* * 0.9.4 - 12/16/2000 - G.Juyn * */ +/* * - fixed mixup of data- & function-pointers (thanks Dimitri)* */ +/* * * */ +/* * 1.0.1 - 03/31/2001 - G.Juyn * */ +/* * - ignore gamma=0 (see png-list for more info) * */ +/* * 1.0.1 - 04/25/2001 - G.Juyn (reported by Gregg Kelly) * */ +/* * - fixed problem with cms profile being created multiple * */ +/* * times when both iCCP & cHRM/gAMA are present * */ +/* * 1.0.1 - 04/25/2001 - G.Juyn * */ +/* * - moved mng_clear_cms to libmng_cms * */ +/* * 1.0.1 - 05/02/2001 - G.Juyn * */ +/* * - added "default" sRGB generation (Thanks Marti!) * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/19/2002 - G.Juyn * */ +/* * - optimized color-correction routines * */ +/* * 1.0.5 - 09/23/2002 - G.Juyn * */ +/* * - added in-memory color-correction of abstract images * */ +/* * 1.0.5 - 11/08/2002 - G.Juyn * */ +/* * - fixed issues in init_app_cms() * */ +/* * * */ +/* * 1.0.6 - 04/11/2003 - G.Juyn * */ +/* * - B719420 - fixed several MNG_APP_CMS problems * */ +/* * 1.0.6 - 07/11/2003 - G. R-P * */ +/* * - added conditional MNG_SKIPCHUNK_cHRM/iCCP * */ +/* * * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_objects.h" +#include "libmng_cms.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_DISPLAY_PROCS + +/* ************************************************************************** */ +/* * * */ +/* * Little CMS helper routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_LCMS + +#define MNG_CMS_FLAGS 0 + +/* ************************************************************************** */ + +void mnglcms_initlibrary () +{ + cmsErrorAction (LCMS_ERROR_IGNORE); /* LCMS should ignore errors! */ +} + +/* ************************************************************************** */ + +mng_cmsprof mnglcms_createfileprofile (mng_pchar zFilename) +{ + return cmsOpenProfileFromFile (zFilename, "r"); +} + +/* ************************************************************************** */ + +mng_cmsprof mnglcms_creatememprofile (mng_uint32 iProfilesize, + mng_ptr pProfile) +{ + return cmsOpenProfileFromMem (pProfile, iProfilesize); +} + +/* ************************************************************************** */ + +mng_cmsprof mnglcms_createsrgbprofile (void) +{ + cmsCIExyY D65; + cmsCIExyYTRIPLE Rec709Primaries = { + {0.6400, 0.3300, 1.0}, + {0.3000, 0.6000, 1.0}, + {0.1500, 0.0600, 1.0} + }; + LPGAMMATABLE Gamma24[3]; + mng_cmsprof hsRGB; + + cmsWhitePointFromTemp(6504, &D65); + Gamma24[0] = Gamma24[1] = Gamma24[2] = cmsBuildGamma(256, 2.4); + hsRGB = cmsCreateRGBProfile(&D65, &Rec709Primaries, Gamma24); + cmsFreeGamma(Gamma24[0]); + + return hsRGB; +} + +/* ************************************************************************** */ + +void mnglcms_freeprofile (mng_cmsprof hProf) +{ + cmsCloseProfile (hProf); + return; +} + +/* ************************************************************************** */ + +void mnglcms_freetransform (mng_cmstrans hTrans) +{ +/* B001 start */ + cmsDeleteTransform (hTrans); +/* B001 end */ + return; +} + +/* ************************************************************************** */ + +mng_retcode mng_clear_cms (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLEAR_CMS, MNG_LC_START); +#endif + + if (pData->hTrans) /* transformation still active ? */ + mnglcms_freetransform (pData->hTrans); + + pData->hTrans = 0; + + if (pData->hProf1) /* file profile still active ? */ + mnglcms_freeprofile (pData->hProf1); + + pData->hProf1 = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLEAR_CMS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_LCMS */ + +/* ************************************************************************** */ +/* * * */ +/* * Color-management initialization & correction routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_LCMS + +mng_retcode mng_init_full_cms (mng_datap pData, + mng_bool bGlobal, + mng_bool bObject, + mng_bool bRetrobj) +{ + mng_cmsprof hProf; + mng_cmstrans hTrans; + mng_imagep pImage = MNG_NULL; + mng_imagedatap pBuf = MNG_NULL; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_FULL_CMS, MNG_LC_START); +#endif + + if (bObject) /* use object if present ? */ + { /* current object ? */ + if ((mng_imagep)pData->pCurrentobj) + pImage = (mng_imagep)pData->pCurrentobj; + else /* if not; use object 0 */ + pImage = (mng_imagep)pData->pObjzero; + } + + if (bRetrobj) /* retrieving from an object ? */ + pImage = (mng_imagep)pData->pRetrieveobj; + + if (pImage) /* are we using an object ? */ + pBuf = pImage->pImgbuf; /* then address the buffer */ + + if ((!pBuf) || (!pBuf->bCorrected)) /* is the buffer already corrected ? */ + { +#ifndef MNG_SKIPCHUNK_iCCP + if (((pBuf) && (pBuf->bHasICCP)) || ((bGlobal) && (pData->bHasglobalICCP))) + { + if (!pData->hProf2) /* output profile not defined ? */ + { /* then assume sRGB !! */ + pData->hProf2 = mnglcms_createsrgbprofile (); + + if (!pData->hProf2) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); + } + + if ((pBuf) && (pBuf->bHasICCP)) /* generate a profile handle */ + hProf = cmsOpenProfileFromMem (pBuf->pProfile, pBuf->iProfilesize); + else + hProf = cmsOpenProfileFromMem (pData->pGlobalProfile, pData->iGlobalProfilesize); + + pData->hProf1 = hProf; /* save for future use */ + + if (!hProf) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); + +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->bIsRGBA16) /* 16-bit intermediates ? */ + hTrans = cmsCreateTransform (hProf, TYPE_RGBA_16_SE, + pData->hProf2, TYPE_RGBA_16_SE, + INTENT_PERCEPTUAL, MNG_CMS_FLAGS); + else +#endif + hTrans = cmsCreateTransform (hProf, TYPE_RGBA_8, + pData->hProf2, TYPE_RGBA_8, + INTENT_PERCEPTUAL, MNG_CMS_FLAGS); + + pData->hTrans = hTrans; /* save for future use */ + + if (!hTrans) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOTRANS); + /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_full_cms; + + return MNG_NOERROR; /* and done */ + } + else +#endif + if (((pBuf) && (pBuf->bHasSRGB)) || ((bGlobal) && (pData->bHasglobalSRGB))) + { + mng_uint8 iIntent; + + if (pData->bIssRGB) /* sRGB system ? */ + return MNG_NOERROR; /* no conversion required */ + + if (!pData->hProf3) /* sRGB profile not defined ? */ + { /* then create it implicitly !! */ + pData->hProf3 = mnglcms_createsrgbprofile (); + + if (!pData->hProf3) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); + } + + hProf = pData->hProf3; /* convert from sRGB profile */ + + if ((pBuf) && (pBuf->bHasSRGB)) /* determine rendering intent */ + iIntent = pBuf->iRenderingintent; + else + iIntent = pData->iGlobalRendintent; + + if (pData->bIsRGBA16) /* 16-bit intermediates ? */ + hTrans = cmsCreateTransform (hProf, TYPE_RGBA_16_SE, + pData->hProf2, TYPE_RGBA_16_SE, + iIntent, MNG_CMS_FLAGS); + else + hTrans = cmsCreateTransform (hProf, TYPE_RGBA_8, + pData->hProf2, TYPE_RGBA_8, + iIntent, MNG_CMS_FLAGS); + + pData->hTrans = hTrans; /* save for future use */ + + if (!hTrans) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOTRANS); + /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_full_cms; + + return MNG_NOERROR; /* and done */ + } + else + if ( (((pBuf) && (pBuf->bHasCHRM)) || ((bGlobal) && (pData->bHasglobalCHRM))) && + ( ((pBuf) && (pBuf->bHasGAMA) && (pBuf->iGamma > 0)) || + ((bGlobal) && (pData->bHasglobalGAMA) && (pData->iGlobalGamma > 0)) ) ) + { + mng_CIExyY sWhitepoint; + mng_CIExyYTRIPLE sPrimaries; + mng_gammatabp pGammatable[3]; + mng_float dGamma; + + if (!pData->hProf2) /* output profile not defined ? */ + { /* then assume sRGB !! */ + pData->hProf2 = mnglcms_createsrgbprofile (); + + if (!pData->hProf2) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); + } + +#ifndef MNG_SKIPCHUNK_cHRM + if ((pBuf) && (pBuf->bHasCHRM)) /* local cHRM ? */ + { + sWhitepoint.x = (mng_float)pBuf->iWhitepointx / 100000; + sWhitepoint.y = (mng_float)pBuf->iWhitepointy / 100000; + sPrimaries.Red.x = (mng_float)pBuf->iPrimaryredx / 100000; + sPrimaries.Red.y = (mng_float)pBuf->iPrimaryredy / 100000; + sPrimaries.Green.x = (mng_float)pBuf->iPrimarygreenx / 100000; + sPrimaries.Green.y = (mng_float)pBuf->iPrimarygreeny / 100000; + sPrimaries.Blue.x = (mng_float)pBuf->iPrimarybluex / 100000; + sPrimaries.Blue.y = (mng_float)pBuf->iPrimarybluey / 100000; + } + else + { + sWhitepoint.x = (mng_float)pData->iGlobalWhitepointx / 100000; + sWhitepoint.y = (mng_float)pData->iGlobalWhitepointy / 100000; + sPrimaries.Red.x = (mng_float)pData->iGlobalPrimaryredx / 100000; + sPrimaries.Red.y = (mng_float)pData->iGlobalPrimaryredy / 100000; + sPrimaries.Green.x = (mng_float)pData->iGlobalPrimarygreenx / 100000; + sPrimaries.Green.y = (mng_float)pData->iGlobalPrimarygreeny / 100000; + sPrimaries.Blue.x = (mng_float)pData->iGlobalPrimarybluex / 100000; + sPrimaries.Blue.y = (mng_float)pData->iGlobalPrimarybluey / 100000; + } +#endif + + sWhitepoint.Y = /* Y component is always 1.0 */ + sPrimaries.Red.Y = + sPrimaries.Green.Y = + sPrimaries.Blue.Y = 1.0; + + if ((pBuf) && (pBuf->bHasGAMA)) /* get the gamma value */ + dGamma = (mng_float)pBuf->iGamma / 100000; + else + dGamma = (mng_float)pData->iGlobalGamma / 100000; + + dGamma = pData->dViewgamma / dGamma; + + pGammatable [0] = /* and build the lookup tables */ + pGammatable [1] = + pGammatable [2] = cmsBuildGamma (256, dGamma); + + if (!pGammatable [0]) /* enough memory ? */ + MNG_ERRORL (pData, MNG_LCMS_NOMEM); + /* create the profile */ + hProf = cmsCreateRGBProfile (&sWhitepoint, &sPrimaries, pGammatable); + + cmsFreeGamma (pGammatable [0]); /* free the temporary gamma tables ? */ + /* yes! but just the one! */ + + pData->hProf1 = hProf; /* save for future use */ + + if (!hProf) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); + + if (pData->bIsRGBA16) /* 16-bit intermediates ? */ + hTrans = cmsCreateTransform (hProf, TYPE_RGBA_16_SE, + pData->hProf2, TYPE_RGBA_16_SE, + INTENT_PERCEPTUAL, MNG_CMS_FLAGS); + else + hTrans = cmsCreateTransform (hProf, TYPE_RGBA_8, + pData->hProf2, TYPE_RGBA_8, + INTENT_PERCEPTUAL, MNG_CMS_FLAGS); + + pData->hTrans = hTrans; /* save for future use */ + + if (!hTrans) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOTRANS); + /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_full_cms; + + return MNG_NOERROR; /* and done */ + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_FULL_CMS, MNG_LC_END); +#endif + /* if we get here, we'll only do gamma */ + return mng_init_gamma_only (pData, bGlobal, bObject, bRetrobj); +} +#endif /* MNG_INCLUDE_LCMS */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_LCMS +mng_retcode mng_correct_full_cms (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CORRECT_FULL_CMS, MNG_LC_START); +#endif + + cmsDoTransform (pData->hTrans, pData->pRGBArow, pData->pRGBArow, pData->iRowsamples); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CORRECT_FULL_CMS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_LCMS */ + +/* ************************************************************************** */ + +#if defined(MNG_GAMMA_ONLY) || defined(MNG_FULL_CMS) || defined(MNG_APP_CMS) +mng_retcode mng_init_gamma_only (mng_datap pData, + mng_bool bGlobal, + mng_bool bObject, + mng_bool bRetrobj) +{ + mng_float dGamma; + mng_imagep pImage = MNG_NULL; + mng_imagedatap pBuf = MNG_NULL; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GAMMA_ONLY, MNG_LC_START); +#endif + + if (bObject) /* use object if present ? */ + { /* current object ? */ + if ((mng_imagep)pData->pCurrentobj) + pImage = (mng_imagep)pData->pCurrentobj; + else /* if not; use object 0 */ + pImage = (mng_imagep)pData->pObjzero; + } + + if (bRetrobj) /* retrieving from an object ? */ + pImage = (mng_imagep)pData->pRetrieveobj; + + if (pImage) /* are we using an object ? */ + pBuf = pImage->pImgbuf; /* then address the buffer */ + + if ((!pBuf) || (!pBuf->bCorrected)) /* is the buffer already corrected ? */ + { + if ((pBuf) && (pBuf->bHasSRGB)) /* get the gamma value */ + dGamma = 0.45455; + else + if ((pBuf) && (pBuf->bHasGAMA)) + dGamma = (mng_float)pBuf->iGamma / 100000; + else + if ((bGlobal) && (pData->bHasglobalSRGB)) + dGamma = 0.45455; + else + if ((bGlobal) && (pData->bHasglobalGAMA)) + dGamma = (mng_float)pData->iGlobalGamma / 100000; + else + dGamma = pData->dDfltimggamma; + + if (dGamma > 0) /* ignore gamma=0 */ + { + dGamma = pData->dViewgamma / (dGamma * pData->dDisplaygamma); + + if (dGamma != pData->dLastgamma) /* lookup table needs to be computed ? */ + { + mng_int32 iX; + + pData->aGammatab [0] = 0; + + for (iX = 1; iX <= 255; iX++) + pData->aGammatab [iX] = (mng_uint8)(pow (iX / 255.0, dGamma) * 255 + 0.5); + + pData->dLastgamma = dGamma; /* keep for next time */ + } + /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_gamma_only; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GAMMA_ONLY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_GAMMA_ONLY || MNG_FULL_CMS || MNG_APP_CMS */ + +/* ************************************************************************** */ + +#if defined(MNG_GAMMA_ONLY) || defined(MNG_FULL_CMS) || defined(MNG_APP_CMS) +mng_retcode mng_correct_gamma_only (mng_datap pData) +{ + mng_uint8p pWork; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CORRECT_GAMMA_ONLY, MNG_LC_START); +#endif + + pWork = pData->pRGBArow; /* address intermediate row */ + + if (pData->bIsRGBA16) /* 16-bit intermediate row ? */ + { + + + /* TODO: 16-bit precision gamma processing */ + /* we'll just do the high-order byte for now */ + + + /* convert all samples in the row */ + for (iX = 0; iX < pData->iRowsamples; iX++) + { /* using the precalculated gamma lookup table */ + *pWork = pData->aGammatab [*pWork]; + *(pWork+2) = pData->aGammatab [*(pWork+2)]; + *(pWork+4) = pData->aGammatab [*(pWork+4)]; + + pWork += 8; + } + } + else + { /* convert all samples in the row */ + for (iX = 0; iX < pData->iRowsamples; iX++) + { /* using the precalculated gamma lookup table */ + *pWork = pData->aGammatab [*pWork]; + *(pWork+1) = pData->aGammatab [*(pWork+1)]; + *(pWork+2) = pData->aGammatab [*(pWork+2)]; + + pWork += 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CORRECT_GAMMA_ONLY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_GAMMA_ONLY || MNG_FULL_CMS || MNG_APP_CMS */ + +/* ************************************************************************** */ + +#ifdef MNG_APP_CMS +mng_retcode mng_init_app_cms (mng_datap pData, + mng_bool bGlobal, + mng_bool bObject, + mng_bool bRetrobj) +{ + mng_imagep pImage = MNG_NULL; + mng_imagedatap pBuf = MNG_NULL; + mng_bool bDone = MNG_FALSE; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_APP_CMS, MNG_LC_START); +#endif + + if (bObject) /* use object if present ? */ + { /* current object ? */ + if ((mng_imagep)pData->pCurrentobj) + pImage = (mng_imagep)pData->pCurrentobj; + else /* if not; use object 0 */ + pImage = (mng_imagep)pData->pObjzero; + } + + if (bRetrobj) /* retrieving from an object ? */ + pImage = (mng_imagep)pData->pRetrieveobj; + + if (pImage) /* are we using an object ? */ + pBuf = pImage->pImgbuf; /* then address the buffer */ + + if ((!pBuf) || (!pBuf->bCorrected)) /* is the buffer already corrected ? */ + { +#ifndef MNG_SKIPCHUNK_iCCP + if ( (pData->fProcessiccp) && + (((pBuf) && (pBuf->bHasICCP)) || ((bGlobal) && (pData->bHasglobalICCP))) ) + { + mng_uint32 iProfilesize; + mng_ptr pProfile; + + if ((pBuf) && (pBuf->bHasICCP)) /* get the right profile */ + { + iProfilesize = pBuf->iProfilesize; + pProfile = pBuf->pProfile; + } + else + { + iProfilesize = pData->iGlobalProfilesize; + pProfile = pData->pGlobalProfile; + } + /* inform the app */ + if (!pData->fProcessiccp ((mng_handle)pData, iProfilesize, pProfile)) + MNG_ERROR (pData, MNG_APPCMSERROR); + /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_app_cms; + bDone = MNG_TRUE; + } +#endif + + if ( (pData->fProcesssrgb) && + (((pBuf) && (pBuf->bHasSRGB)) || ((bGlobal) && (pData->bHasglobalSRGB))) ) + { + mng_uint8 iIntent; + + if ((pBuf) && (pBuf->bHasSRGB)) /* determine rendering intent */ + iIntent = pBuf->iRenderingintent; + else + iIntent = pData->iGlobalRendintent; + /* inform the app */ + if (!pData->fProcesssrgb ((mng_handle)pData, iIntent)) + MNG_ERROR (pData, MNG_APPCMSERROR); + /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_app_cms; + bDone = MNG_TRUE; + } + +#ifndef MNG_SKIPCHUNK_cHRM + if ( (pData->fProcesschroma) && + (((pBuf) && (pBuf->bHasCHRM)) || ((bGlobal) && (pData->bHasglobalCHRM))) ) + { + mng_uint32 iWhitepointx, iWhitepointy; + mng_uint32 iPrimaryredx, iPrimaryredy; + mng_uint32 iPrimarygreenx, iPrimarygreeny; + mng_uint32 iPrimarybluex, iPrimarybluey; + + if ((pBuf) && (pBuf->bHasCHRM)) /* local cHRM ? */ + { + iWhitepointx = pBuf->iWhitepointx; + iWhitepointy = pBuf->iWhitepointy; + iPrimaryredx = pBuf->iPrimaryredx; + iPrimaryredy = pBuf->iPrimaryredy; + iPrimarygreenx = pBuf->iPrimarygreenx; + iPrimarygreeny = pBuf->iPrimarygreeny; + iPrimarybluex = pBuf->iPrimarybluex; + iPrimarybluey = pBuf->iPrimarybluey; + } + else + { + iWhitepointx = pData->iGlobalWhitepointx; + iWhitepointy = pData->iGlobalWhitepointy; + iPrimaryredx = pData->iGlobalPrimaryredx; + iPrimaryredy = pData->iGlobalPrimaryredy; + iPrimarygreenx = pData->iGlobalPrimarygreenx; + iPrimarygreeny = pData->iGlobalPrimarygreeny; + iPrimarybluex = pData->iGlobalPrimarybluex; + iPrimarybluey = pData->iGlobalPrimarybluey; + } + /* inform the app */ + if (!pData->fProcesschroma ((mng_handle)pData, iWhitepointx, iWhitepointy, + iPrimaryredx, iPrimaryredy, + iPrimarygreenx, iPrimarygreeny, + iPrimarybluex, iPrimarybluey)) + MNG_ERROR (pData, MNG_APPCMSERROR); + /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_app_cms; + bDone = MNG_TRUE; + } +#endif + + if ( (pData->fProcessgamma) && + (((pBuf) && (pBuf->bHasGAMA)) || ((bGlobal) && (pData->bHasglobalGAMA))) ) + { + mng_uint32 iGamma; + + if ((pBuf) && (pBuf->bHasGAMA)) /* get the gamma value */ + iGamma = pBuf->iGamma; + else + iGamma = pData->iGlobalGamma; + /* inform the app */ + if (!pData->fProcessgamma ((mng_handle)pData, iGamma)) + { /* app wants us to use internal routines ! */ + iRetcode = mng_init_gamma_only (pData, bGlobal, bObject, bRetrobj); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + else + { /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_app_cms; + } + + bDone = MNG_TRUE; + } + + if (!bDone) /* no color-info at all ? */ + { + /* then use default image gamma ! */ + if (!pData->fProcessgamma ((mng_handle)pData, + (mng_uint32)((pData->dDfltimggamma * 100000) + 0.5))) + { /* app wants us to use internal routines ! */ + iRetcode = mng_init_gamma_only (pData, bGlobal, bObject, bRetrobj); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + else + { /* load color-correction routine */ + pData->fCorrectrow = (mng_fptr)mng_correct_app_cms; + } + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_APP_CMS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_APP_CMS */ + +/* ************************************************************************** */ + +#ifdef MNG_APP_CMS +mng_retcode mng_correct_app_cms (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CORRECT_APP_CMS, MNG_LC_START); +#endif + + if (pData->fProcessarow) /* let the app do something with our row */ + if (!pData->fProcessarow ((mng_handle)pData, pData->iRowsamples, + pData->bIsRGBA16, pData->pRGBArow)) + MNG_ERROR (pData, MNG_APPCMSERROR); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CORRECT_APP_CMS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_APP_CMS */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_DISPLAY_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + + + diff --git a/src/3rdparty/libmng/libmng_cms.h b/src/3rdparty/libmng/libmng_cms.h new file mode 100644 index 0000000000..4459f805f8 --- /dev/null +++ b/src/3rdparty/libmng/libmng_cms.h @@ -0,0 +1,92 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_cms.h copyright (c) 2000-2003 G.Juyn * */ +/* * version : 1.0.6 * */ +/* * * */ +/* * purpose : color management routines (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of color management routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added creatememprofile * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 1.0.1 - 04/25/2001 - G.Juyn * */ +/* * - moved mng_clear_cms to libmng_cms * */ +/* * 1.0.1 - 05/02/2001 - G.Juyn * */ +/* * - added "default" sRGB generation (Thanks Marti!) * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/19/2002 - G.Juyn * */ +/* * - optimized color-correction routines * */ +/* * * */ +/* * 1.0.6 - 04/11/2003 - G.Juyn * */ +/* * - B719420 - fixed several MNG_APP_CMS problems * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_cms_h_ +#define _libmng_cms_h_ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_LCMS +void mnglcms_initlibrary (void); +mng_cmsprof mnglcms_createfileprofile (mng_pchar zFilename); +mng_cmsprof mnglcms_creatememprofile (mng_uint32 iProfilesize, + mng_ptr pProfile ); +mng_cmsprof mnglcms_createsrgbprofile (void); +void mnglcms_freeprofile (mng_cmsprof hProf ); +void mnglcms_freetransform (mng_cmstrans hTrans ); + +mng_retcode mng_clear_cms (mng_datap pData ); +#endif + +/* ************************************************************************** */ + +#ifdef MNG_FULL_CMS +mng_retcode mng_init_full_cms (mng_datap pData, + mng_bool bGlobal, + mng_bool bObject, + mng_bool bRetrobj); +mng_retcode mng_correct_full_cms (mng_datap pData); +#endif + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_retcode mng_init_gamma_only (mng_datap pData, + mng_bool bGlobal, + mng_bool bObject, + mng_bool bRetrobj); +mng_retcode mng_correct_gamma_only (mng_datap pData); +#endif + +#ifdef MNG_APP_CMS +mng_retcode mng_init_app_cms (mng_datap pData, + mng_bool bGlobal, + mng_bool bObject, + mng_bool bRetrobj); +mng_retcode mng_correct_app_cms (mng_datap pData); +#endif + +/* ************************************************************************** */ + +#endif /* _libmng_cms_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_conf.h b/src/3rdparty/libmng/libmng_conf.h new file mode 100644 index 0000000000..8441ee0874 --- /dev/null +++ b/src/3rdparty/libmng/libmng_conf.h @@ -0,0 +1,295 @@ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_conf.h copyright (c) G.Juyn 2000-2004 * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : main configuration file * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : The configuration file. Change this to include/exclude * */ +/* * the options you want or do not want in libmng. * */ +/* * * */ +/* * changes : 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - separated configuration-options into this file * */ +/* * - changed to most likely configuration (?) * */ +/* * 0.5.2 - 06/03/2000 - G.Juyn * */ +/* * - changed options to create a standard so-library * */ +/* * with everything enabled * */ +/* * 0.5.2 - 06/04/2000 - G.Juyn * */ +/* * - changed options to create a standard win32-dll * */ +/* * with everything enabled * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/12/2000 - G.Juyn * */ +/* * - added workaround for faulty PhotoShop iCCP chunk * */ +/* * 0.9.3 - 09/16/2000 - G.Juyn * */ +/* * - removed trace-options from default SO/DLL builds * */ +/* * * */ +/* * 1.0.4 - 06/22/2002 - G.Juyn * */ +/* * - B526138 - returned IJGSRC6B calling convention to * */ +/* * default for MSVC * */ +/* * * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * - added 'supports' call to check function availability * */ +/* * * */ +/* * 1.0.6 - 06/22/2002 - G.R-P * */ +/* * - added MNG_NO_INCLUDE_JNG conditional * */ +/* * - added MNG_SKIPCHUNK_evNT conditional * */ +/* * 1.0.6 - 07/14/2002 - G.R-P * */ +/* * - added MNG_NO_SUPPORT_FUNCQUERY conditional * */ +/* * * */ +/* * 1.0.7 - 03/07/2004 - G.R-P * */ +/* * - added MNG_VERSION_QUERY_SUPPORT_ conditional * */ +/* * * */ +/* * 1.0.9 - 05/12/2004 - G.Juyn * */ +/* * - clearified MNG_BIGENDIAN_SUPPORTED conditional * */ +/* * - added MNG_LITTLEENDIAN_SUPPORTED conditional * */ +/* * * */ +/* ************************************************************************** */ + + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_conf_h_ +#define _libmng_conf_h_ + +#ifdef MNG_MOZILLA_CFG +#include "special\mozcfg\mozlibmngconf.h" +#endif + +/* ************************************************************************** */ +/* * * */ +/* * User-selectable compile-time options * */ +/* * * */ +/* ************************************************************************** */ + +/* enable exactly one(1) of the MNG-(sub)set selectors */ +/* use this to select which (sub)set of the MNG specification you wish + to support */ +/* generally you'll want full support as the library provides it automatically + for you! if you're really strung on memory-requirements you can opt + to enable less support (but it's just NOT a good idea!) */ +/* NOTE that this isn't actually implemented yet */ + +#if !defined(MNG_SUPPORT_FULL) && !defined(MNG_SUPPORT_LC) && !defined(MNG_SUPPORT_VLC) +#define MNG_SUPPORT_FULL +/* #define MNG_SUPPORT_LC */ +/* #define MNG_SUPPORT_VLC */ +#endif + +/* ************************************************************************** */ + +/* enable JPEG support if required */ +/* use this to enable the JNG support routines */ +/* this requires an external jpeg package; + currently only IJG's jpgsrc6b is supported! */ +/* NOTE that the IJG code can be either 8- or 12-bit (eg. not both); + so choose the one you've defined in jconfig.h; if you don't know what + the heck I'm talking about, just leave it at 8-bit support (thank you!) */ + +#ifndef MNG_NO_INCLUDE_JNG +#ifdef MNG_SUPPORT_FULL /* full support includes JNG */ +#define MNG_SUPPORT_IJG6B +#endif + +#ifndef MNG_SUPPORT_IJG6B +#if defined(MNG_BUILD_SO) || defined(MNG_USE_SO) || defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#define MNG_SUPPORT_IJG6B +#endif +#endif + +#if defined(MNG_SUPPORT_IJG6B) && !defined(MNG_SUPPORT_JPEG8) && !defined(MNG_SUPPORT_JPEG12) +#define MNG_SUPPORT_JPEG8 +/* #define MNG_SUPPORT_JPEG12 */ +#endif + +/* The following is required to export the IJG routines from the DLL in + the Windows-standard calling convention; + currently this only works for Borland C++ !!! */ + +#if defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#if defined(MNG_SUPPORT_IJG6B) && defined(__BORLANDC__) +#define MNG_DEFINE_JPEG_STDCALL +#endif +#endif +#endif + +/* ************************************************************************** */ + +/* enable required high-level functions */ +/* use this to select the high-level functions you require */ +/* if you only need to display a MNG, disable write support! */ +/* if you only need to examine a MNG, disable write & display support! */ +/* if you only need to copy a MNG, disable display support! */ +/* if you only need to create a MNG, disable read & display support! */ +/* NOTE that turning all options off will be very unuseful! */ + +#if !defined(MNG_SUPPORT_READ) && !defined(MNG_SUPPORT_WRITE) && !defined(MNG_SUPPORT_DISPLAY) +#define MNG_SUPPORT_READ +#if defined(MNG_BUILD_SO) || defined(MNG_USE_SO) || defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#define MNG_SUPPORT_WRITE +#endif +#define MNG_SUPPORT_DISPLAY +#endif + +/* ************************************************************************** */ + +/* enable chunk access functions */ +/* use this to select whether you need access to the individual chunks */ +/* useful if you want to examine a read MNG (you'll also need MNG_STORE_CHUNKS !)*/ +/* required if you need to create & write a new MNG! */ + +#ifndef MNG_ACCESS_CHUNKS +#if defined(MNG_BUILD_SO) || defined(MNG_USE_SO) || defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#define MNG_ACCESS_CHUNKS +#endif +#endif + +/* ************************************************************************** */ + +/* enable exactly one(1) of the color-management functionality selectors */ +/* use this to select the level of automatic color support */ +/* MNG_FULL_CMS requires the lcms (little cms) external package ! */ +/* if you want your own app (or the OS) to handle color-management + select MNG_APP_CMS */ + +#define MNG_GAMMA_ONLY +/* #define MNG_FULL_CMS */ +/* #define MNG_APP_CMS */ + +/* ************************************************************************** */ + +/* enable automatic dithering */ +/* use this if you need dithering support to convert high-resolution + images to a low-resolution output-device */ +/* NOTE that this is not supported yet */ + +/* #define MNG_AUTO_DITHER */ + +/* ************************************************************************** */ + +/* enable whether chunks should be stored for reference later */ +/* use this if you need to examine the chunks of a MNG you have read, + or (re-)write a MNG you have read */ +/* turn this off if you want to reduce memory-consumption */ + +#ifndef MNG_STORE_CHUNKS +#if defined(MNG_BUILD_SO) || defined(MNG_USE_SO) || defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#define MNG_STORE_CHUNKS +#endif +#endif + +/* ************************************************************************** */ + +/* enable internal memory management (if your compiler supports it) */ +/* use this if your compiler supports the 'standard' memory functions + (calloc & free), and you want the library to use these functions and not + bother your app with memory-callbacks */ + +/* #define MNG_INTERNAL_MEMMNGMT */ + +/* ************************************************************************** */ + +/* enable internal tracing-functionality (manual debugging purposes) */ +/* use this if you have trouble location bugs or problems */ +/* NOTE that you'll need to specify the trace callback function! */ + +/* #define MNG_SUPPORT_TRACE */ + +/* ************************************************************************** */ + +/* enable extended error- and trace-telltaling */ +/* use this if you need explanatory messages with errors and/or tracing */ + +#if !defined(MNG_ERROR_TELLTALE) && !defined(MNG_TRACE_TELLTALE) +#if defined(MNG_BUILD_SO) || defined(MNG_USE_SO) || defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#define MNG_ERROR_TELLTALE +#define MNG_TRACE_TELLTALE +#endif +#endif + +/* ************************************************************************** */ + +/* enable BIG/LITTLE endian optimizations */ +/* enable BIG if you're on an architecture that supports big-endian reads + and writes that aren't word-aligned */ +/* according to reliable sources this only works for PowerPC (bigendian mode) + and 680x0 */ +/* enable LITTLE if you're on an architecture that supports little-endian */ +/* when in doubt leave both off !!! */ + +/* #define MNG_BIGENDIAN_SUPPORTED */ +/* #define MNG_LITTLEENDIAN_SUPPORTED */ + +/* ************************************************************************** */ +/* enable 'version' functions */ +#if !defined(MNG_VERSION_QUERY_SUPPORT) && \ + !defined(MNG_NO_VERSION_QUERY_SUPPORT) +#define MNG_VERSION_QUERY_SUPPORT +#endif + +/* enable 'supports' function */ +/* use this if you need to query the availability of functions at runtime; + useful for apps that dynamically load the library and that need specific + functions */ + +#if !defined(MNG_NO_SUPPORT_FUNCQUERY) && !defined(MNG_SUPPORT_FUNCQUERY) +#if defined(MNG_BUILD_SO) || defined(MNG_USE_SO) || \ + defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#define MNG_SUPPORT_FUNCQUERY +#endif +#endif + +/* ************************************************************************** */ + +/* enable dynamic MNG features */ +/* use this if you would like to have dynamic support for specifically + designed MNGs; eg. this is useful for 'rollover' effects such as common + on the world wide web */ + +#ifndef MNG_SUPPORT_DYNAMICMNG +#if defined(MNG_BUILD_SO) || defined(MNG_USE_SO) || defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#define MNG_SUPPORT_DYNAMICMNG +#endif +#endif +#ifndef MNG_SUPPORT_DYNAMICMNG +#ifndef MNG_SKIPCHUNK_evNT +#define MNG_SKIPCHUNK_evNT +#endif +#endif + +#ifdef MNG_INCLUDE_JNG +#ifndef MNG_NO_ACCESS_JPEG +#ifndef MNG_ACCESS_JPEG +#define MNG_ACCESS_JPEG +#endif +#endif +#endif + +#ifdef MNG_INCLUDE_ZLIB +#ifndef MNG_NO_ACCESS_ZLIB +#ifndef MNG_ACCESS_ZLIB +#define MNG_ACCESS_ZLIB +#endif +#endif +#endif + +/* ************************************************************************** */ +/* * * */ +/* * End of user-selectable compile-time options * */ +/* * * */ +/* ************************************************************************** */ + +#endif /* _libmng_conf_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_data.h b/src/3rdparty/libmng/libmng_data.h new file mode 100644 index 0000000000..6a007632d5 --- /dev/null +++ b/src/3rdparty/libmng/libmng_data.h @@ -0,0 +1,1032 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_data.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : main data structure definition * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the library main data structure * */ +/* * * */ +/* * changes : 0.5.1 - 05/04/2000 - G.Juyn * */ +/* * - added CRC table to main structure (for thread-safety) * */ +/* * 0.5.1 - 05/06/2000 - G.Juyn * */ +/* * - added iPLTEentries for checking hIST-length * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed palette definition to exported palette-type * */ +/* * - removed frozen indicator * */ +/* * - added create/write indicators * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/13/2000 - G.Juyn * */ +/* * - added eMNGma hack (will be removed in 1.0.0 !!!) * */ +/* * - added TERM animation object pointer (easier reference) * */ +/* * - added saved-data structure for SAVE/SEEK processing * */ +/* * * */ +/* * 0.5.2 - 05/18/2000 - G.Juyn * */ +/* * - added fields for JNG support (IJG-based) * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - changed global tRNS definition * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added delta-image fields * */ +/* * 0.5.2 - 06/01/2000 - G.Juyn * */ +/* * - added internal delta-image processing callbacks * */ +/* * 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - changed SWAP_ENDIAN to BIGENDIAN_SUPPORTED * */ +/* * (contributed by Tim Rowley) * */ +/* * - added getalphaline callback for RGB8_A8 canvasstyle * */ +/* * 0.5.2 - 06/06/2000 - G.Juyn * */ +/* * - added parameter for delayed buffer-processing * */ +/* * * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - added update-region parms for refresh calback * */ +/* * - added Needrefresh parameter * */ +/* * 0.5.3 - 06/17/2000 - G.Juyn * */ +/* * - added Deltaimmediate parm for faster delta-processing * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added Speed parameter to facilitate testing * */ +/* * - added Imagelevel parameter for processtext callback * */ +/* * 0.5.3 - 06/26/2000 - G.Juyn * */ +/* * - changed userdata variable to mng_ptr * */ +/* * * */ +/* * 0.9.1 - 07/07/2000 - G.Juyn * */ +/* * - added variables for go_xxxx processing * */ +/* * 0.9.1 - 07/08/2000 - G.Juyn * */ +/* * - added variables for improved timing support * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added callbacks for SAVE/SEEK processing * */ +/* * - added variable for NEEDSECTIONWAIT breaks * */ +/* * - added variable for freeze & reset processing * */ +/* * 0.9.1 - 07/17/2000 - G.Juyn * */ +/* * - fixed suspension-buffering for 32K+ chunks * */ +/* * * */ +/* * 0.9.2 - 07/29/2000 - G.Juyn * */ +/* * - removed Nextbackxxx fields (no longer used) * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - fixed wrapping of suspension parameters * */ +/* * 0.9.2 - 08/04/2000 - G.Juyn * */ +/* * - B111096 - fixed large-buffer read-suspension * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * 0.9.3 - 09/10/2000 - G.Juyn * */ +/* * - fixed DEFI behavior * */ +/* * 0.9.3 - 10/10/2000 - G.Juyn * */ +/* * - added support for alpha-depth prediction * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added optional support for bKGD for PNG images * */ +/* * - added support for JDAA * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added callback to process non-critical unknown chunks * */ +/* * - fixed support for bKGD * */ +/* * 0.9.3 - 10/19/2000 - G.Juyn * */ +/* * - implemented delayed delta-processing * */ +/* * 0.9.4 - 12/16/2000 - G.Juyn * */ +/* * - fixed mixup of data- & function-pointers (thanks Dimitri)* */ +/* * * */ +/* * 1.0.1 - 02/08/2001 - G.Juyn * */ +/* * - added MEND processing callback * */ +/* * 1.0.1 - 02/13/2001 - G.Juyn * */ +/* * - fixed first FRAM_MODE=4 timing problem * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added optimization option for MNG-video playback * */ +/* * - added processterm callback * */ +/* * 1.0.2 - 06/25/2001 - G.Juyn * */ +/* * - added option to turn off progressive refresh * */ +/* * * */ +/* * 1.0.5 - 07/08/2002 - G.Juyn * */ +/* * - B578572 - removed eMNGma hack (thanks Dimitri!) * */ +/* * 1.0.5 - 07/16/2002 - G.Juyn * */ +/* * - B581625 - large chunks fail with suspension reads * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - fixed LOOP iteration=0 special case * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - finished support for BACK image & tiling * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - added another fix for misplaced TERM chunk * */ +/* * - completed support for condition=2 in TERM chunk * */ +/* * 1.0.5 - 10/20/2002 - G.Juyn * */ +/* * - fixed processing for multiple objects in MAGN * */ +/* * - fixed display of visible target of PAST operation * */ +/* * 1.0.5 - 11/07/2002 - G.Juyn * */ +/* * - added support to get totals after mng_read() * */ +/* * 1.0.5 - 24/02/2003 - G.Juyn * */ +/* * - B683152 - libjpeg suspension not always honored correctly* */ +/* * * */ +/* * 1.0.6 - 04/11/2003 - G.Juyn * */ +/* * - B719420 - fixed several MNG_APP_CMS problems * */ +/* * 1.0.6 - 07/05/2003 - G. R-P * */ +/* * - optionally use zlib's crc32() function * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added SKIPCHUNK conditionals around PAST chunk support * */ +/* * 1.0.6 - 08/17/2003 - G.R-P * */ +/* * - added iPNGdepth member to pData structure * */ +/* * * */ +/* * 1.0.7 - 03/10/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * 1.0.7 - 03/24/2004 - G.R-P * */ +/* * - added more SKIPCHUNK conditionals * */ +/* * * */ +/* * 1.0.8 - 04/02/2004 - G.Juyn * */ +/* * - added CRC existence & checking flags * */ +/* * 1.0.8 - 04/10/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * * */ +/* * 1.0.9 - 12/11/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_DISPLAYCALLS * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_data_h_ +#define _libmng_data_h_ + +/* ************************************************************************** */ + +#define MNG_MAGIC 0x52530a0aL + +/* ************************************************************************** */ +/* * * */ +/* * Internal structures * */ +/* * * */ +/* ************************************************************************** */ + +typedef mng_palette8 mng_rgbpaltab; + +/* ************************************************************************** */ +/* * * */ +/* * The saved_data structure * */ +/* * * */ +/* * This contains the saved data after a SAVE chunk has been processed. * */ +/* * The data is saved from the main data structure during SAVE processing, * */ +/* * and restored to the main data structure during SEEK processing. * */ +/* * * */ +/* ************************************************************************** */ + +typedef struct mng_savedata_struct { + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) + mng_bool bHasglobalPLTE; /* global PLTE chunk processed */ + mng_bool bHasglobalTRNS; /* global tRNS chunk processed */ + mng_bool bHasglobalGAMA; /* global gAMA chunk processed */ + mng_bool bHasglobalCHRM; /* global cHRM chunk processed */ + mng_bool bHasglobalSRGB; /* global sRGB chunk processed */ + mng_bool bHasglobalICCP; /* global iCCP chunk processed */ + mng_bool bHasglobalBKGD; /* global bKGD chunk processed */ +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +#ifdef MNG_SUPPORT_DISPLAY + mng_uint16 iBACKred; /* BACK fields */ + mng_uint16 iBACKgreen; + mng_uint16 iBACKblue; + mng_uint8 iBACKmandatory; + mng_uint16 iBACKimageid; + mng_uint8 iBACKtile; + + mng_uint8 iFRAMmode; /* FRAM fields (global) */ + mng_uint32 iFRAMdelay; + mng_uint32 iFRAMtimeout; + mng_bool bFRAMclipping; + mng_int32 iFRAMclipl; + mng_int32 iFRAMclipr; + mng_int32 iFRAMclipt; + mng_int32 iFRAMclipb; + + mng_uint32 iGlobalPLTEcount; /* global PLTE fields */ + mng_rgbpaltab aGlobalPLTEentries; + + mng_uint32 iGlobalTRNSrawlen; /* global tRNS fields */ + mng_uint8arr aGlobalTRNSrawdata; + + mng_uint32 iGlobalGamma; /* global gAMA fields */ + +#ifndef MNG_SKIPCHUNK_cHRM + mng_uint32 iGlobalWhitepointx; /* global cHRM fields */ + mng_uint32 iGlobalWhitepointy; + mng_uint32 iGlobalPrimaryredx; + mng_uint32 iGlobalPrimaryredy; + mng_uint32 iGlobalPrimarygreenx; + mng_uint32 iGlobalPrimarygreeny; + mng_uint32 iGlobalPrimarybluex; + mng_uint32 iGlobalPrimarybluey; +#endif + + mng_uint8 iGlobalRendintent; /* global sRGB fields */ + + mng_uint32 iGlobalProfilesize; /* global iCCP fields */ + mng_ptr pGlobalProfile; + + mng_uint16 iGlobalBKGDred; /* global bKGD fields */ + mng_uint16 iGlobalBKGDgreen; + mng_uint16 iGlobalBKGDblue; +#endif /* MNG_SUPPORT_DISPLAY */ + + } mng_savedata; + +typedef mng_savedata * mng_savedatap; + +/* ************************************************************************** */ +/* * * */ +/* * Internal buffer structure for data push mechanisms * */ +/* * * */ +/* ************************************************************************** */ + +typedef struct { + mng_ptr pNext; /* for linked list */ + mng_ptr pData; /* used for chunks & data */ + mng_uint32 iLength; + mng_bool bOwned; + mng_uint8p pDatanext; /* only used for data */ + mng_uint32 iRemaining; + } mng_pushdata; +typedef mng_pushdata * mng_pushdatap; + +/* ************************************************************************** */ +/* * * */ +/* * The main libmng data structure * */ +/* * * */ +/* * The handle used in all functions points to this structure which * */ +/* * contains all volatile data necessary to process the network graphic. * */ +/* * * */ +/* ************************************************************************** */ + +typedef struct mng_data_struct { + + mng_uint32 iMagic; /* magic number to validate + a given handle */ + mng_ptr pUserdata; /* application workdata */ + + mng_imgtype eSigtype; /* image information */ + mng_imgtype eImagetype; /* initially zeroed */ + mng_uint32 iWidth; /* filled after header is processed */ + mng_uint32 iHeight; + mng_uint32 iTicks; /* these only after MHDR */ + mng_uint32 iLayercount; + mng_uint32 iFramecount; + mng_uint32 iPlaytime; + mng_uint32 iSimplicity; + mng_uint8 iAlphadepth; /* indicates expected alpha-depth */ + + mng_uint32 iImagelevel; /* level of image inside a stream */ + + mng_uint32 iCanvasstyle; /* layout of the drawing-canvas */ + mng_uint32 iBkgdstyle; /* layout of the background-canvas */ + + mng_int8 iMagnify; /* magnification factor (not used yet) */ + mng_uint32 iOffsetx; /* x-offset for extremely large image */ + mng_uint32 iOffsety; /* y-offset for extremely large image */ + mng_uint32 iCanvaswidth; /* real canvas size */ + mng_uint32 iCanvasheight; /* must be set by processheader callback */ + + mng_uint16 iBGred; /* default background color */ + mng_uint16 iBGgreen; /* initially "black" */ + mng_uint16 iBGblue; + mng_bool bUseBKGD; /* preferred use of bKGD for PNG */ + + mng_bool bIssRGB; /* indicates sRGB system */ + +#ifdef MNG_FULL_CMS /* little CMS variables */ + mng_cmsprof hProf1; /* image input profile */ + mng_cmsprof hProf2; /* default output profile */ + mng_cmsprof hProf3; /* default sRGB profile */ + mng_cmstrans hTrans; /* current transformation handle */ +#endif + + mng_float dViewgamma; /* gamma calculation variables */ + mng_float dDisplaygamma; /* initially set for sRGB conditions */ + mng_float dDfltimggamma; + + mng_bool bStorechunks; /* switch for storing chunkdata */ + mng_bool bSectionbreaks; /* indicate NEEDSECTIONWAIT breaks */ + mng_bool bCacheplayback; /* switch to cache playback info */ + mng_bool bDoProgressive; /* progressive refresh for large images */ + mng_uint32 iCrcmode; /* CRC existence & checking flags */ + + mng_speedtype iSpeed; /* speed-modifier for animations */ + + mng_uint32 iMaxwidth; /* maximum canvas size */ + mng_uint32 iMaxheight; /* initially set to 1024 x 1024 */ + + mng_int32 iErrorcode; /* error reporting fields */ + mng_int8 iSeverity; + mng_int32 iErrorx1; + mng_int32 iErrorx2; + mng_pchar zErrortext; + + mng_memalloc fMemalloc; /* callback pointers */ + mng_memfree fMemfree; /* initially nulled */ + mng_releasedata fReleasedata; +#ifndef MNG_NO_OPEN_CLOSE_STREAM + mng_openstream fOpenstream; + mng_closestream fClosestream; +#endif + mng_readdata fReaddata; + mng_writedata fWritedata; + mng_errorproc fErrorproc; + mng_traceproc fTraceproc; + mng_processheader fProcessheader; + mng_processtext fProcesstext; + mng_processsave fProcesssave; + mng_processseek fProcessseek; + mng_processneed fProcessneed; + mng_processmend fProcessmend; + mng_processunknown fProcessunknown; + mng_processterm fProcessterm; + mng_getcanvasline fGetcanvasline; + mng_getbkgdline fGetbkgdline; + mng_getalphaline fGetalphaline; + mng_refresh fRefresh; + mng_gettickcount fGettickcount; + mng_settimer fSettimer; + mng_processgamma fProcessgamma; + mng_processchroma fProcesschroma; + mng_processsrgb fProcesssrgb; + mng_processiccp fProcessiccp; + mng_processarow fProcessarow; + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) +#ifndef MNG_NO_OLD_VERSIONS + mng_bool bPreDraft48; /* flags ancient style draft */ +#endif + + mng_chunkid iChunkname; /* read/write-state variables */ + mng_uint32 iChunkseq; + mng_chunkp pFirstchunk; /* double-linked list of */ + mng_chunkp pLastchunk; /* stored chunk-structures */ + + mng_bool bHasheader; /* first header chunk processed */ + mng_bool bHasMHDR; /* inside a MHDR-MEND sequence */ + mng_bool bHasIHDR; /* inside a IHDR-IEND sequence */ + mng_bool bHasBASI; /* inside a BASI-IEND sequence */ + mng_bool bHasDHDR; /* inside a DHDR-IEND sequence */ +#ifdef MNG_INCLUDE_JNG + mng_bool bHasJHDR; /* inside a JHDR-IEND sequence */ + mng_bool bHasJSEP; /* passed the JSEP separator */ + mng_bool bHasJDAA; /* at least 1 JDAA processed */ + mng_bool bHasJDAT; /* at least 1 JDAT processed */ +#endif + mng_bool bHasPLTE; /* PLTE chunk processed */ + mng_bool bHasTRNS; /* tRNS chunk processed */ + mng_bool bHasGAMA; /* gAMA chunk processed */ + mng_bool bHasCHRM; /* cHRM chunk processed */ + mng_bool bHasSRGB; /* sRGB chunk processed */ + mng_bool bHasICCP; /* iCCP chunk processed */ + mng_bool bHasBKGD; /* bKGD chunk processed */ + mng_bool bHasIDAT; /* at least 1 IDAT processed */ + + mng_bool bHasSAVE; /* SAVE chunk processed */ + mng_bool bHasBACK; /* BACK chunk processed */ + mng_bool bHasFRAM; /* FRAM chunk processed */ + mng_bool bHasTERM; /* TERM chunk processed */ + mng_bool bHasLOOP; /* at least 1 LOOP open */ + + mng_bool bHasglobalPLTE; /* global PLTE chunk processed */ + mng_bool bHasglobalTRNS; /* global tRNS chunk processed */ + mng_bool bHasglobalGAMA; /* global gAMA chunk processed */ + mng_bool bHasglobalCHRM; /* global cHRM chunk processed */ + mng_bool bHasglobalSRGB; /* global sRGB chunk processed */ + mng_bool bHasglobalICCP; /* global iCCP chunk processed */ + mng_bool bHasglobalBKGD; /* global bKGD chunk processed */ + + mng_uint32 iDatawidth; /* IHDR/BASI/DHDR fields */ + mng_uint32 iDataheight; /* valid if inside IHDR-IEND, */ + mng_uint8 iBitdepth; /* BASI-IEND or DHDR-IEND */ + mng_uint8 iColortype; + mng_uint8 iCompression; + mng_uint8 iFilter; + mng_uint8 iInterlace; + + mng_uint32 iPLTEcount; /* PLTE fields */ + +#ifdef MNG_INCLUDE_JNG + mng_uint8 iJHDRcolortype; /* JHDR fields */ + mng_uint8 iJHDRimgbitdepth; /* valid if inside JHDR-IEND */ + mng_uint8 iJHDRimgcompression; + mng_uint8 iJHDRimginterlace; + mng_uint8 iJHDRalphabitdepth; + mng_uint8 iJHDRalphacompression; + mng_uint8 iJHDRalphafilter; + mng_uint8 iJHDRalphainterlace; +#endif + +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +#ifdef MNG_SUPPORT_READ + mng_bool bReading; /* read processing variables */ + mng_bool bHavesig; + mng_bool bEOF; + mng_uint32 iReadbufsize; + mng_uint8p pReadbuf; + + mng_uint32 iLargebufsize; /* temp for very large chunks */ + mng_uint8p pLargebuf; + + mng_uint32 iSuspendtime; /* tickcount at last suspension */ + mng_bool bSuspended; /* input-reading has been suspended; + we're expecting a call to + mng_read_resume! */ + mng_uint8 iSuspendpoint; /* indicates at which point the flow + was broken to suspend input-reading */ + + mng_bool bSuspensionmode; /* I/O-suspension variables */ + mng_uint32 iSuspendbufsize; + mng_uint8p pSuspendbuf; + mng_uint8p pSuspendbufnext; + mng_uint32 iSuspendbufleft; + mng_uint32 iChunklen; /* chunk length */ + mng_uint8p pReadbufnext; /* 32K+ suspension-processing */ + mng_uint8p pLargebufnext; + + mng_pushdatap pFirstpushchunk; /* variables for push mechanisms */ + mng_pushdatap pLastpushchunk; + mng_pushdatap pFirstpushdata; + mng_pushdatap pLastpushdata; +#endif /* MNG_SUPPORT_READ */ + +#ifdef MNG_SUPPORT_WRITE + mng_bool bCreating; /* create/write processing variables */ + mng_bool bWriting; + mng_chunkid iFirstchunkadded; + mng_uint32 iWritebufsize; + mng_uint8p pWritebuf; +#endif + +#ifdef MNG_SUPPORT_DISPLAY + mng_bool bDisplaying; /* display-state variables */ + mng_bool bFramedone; + mng_uint32 iFrameseq; + mng_uint32 iLayerseq; + mng_uint32 iFrametime; /* millisecs */ + + mng_uint32 iTotalframes; /* end-totals after mng_read() */ + mng_uint32 iTotallayers; + mng_uint32 iTotalplaytime; /* millisecs */ + + mng_bool bSkipping; /* LOOP iteration=0 */ + +#ifdef MNG_SUPPORT_DYNAMICMNG + mng_bool bDynamic; /* MNG is dynamic (eg. has events) */ + mng_bool bRunningevent; /* currently processing an event */ + mng_bool bStopafterseek; /* stop after next SEEK */ + mng_int32 iEventx; /* X/Y of current event */ + mng_int32 iEventy; + mng_objectp pLastmousemove; /* last event triggered */ +#endif + + mng_uint32 iRequestframe; /* go_xxxx variables */ + mng_uint32 iRequestlayer; + mng_uint32 iRequesttime; + mng_bool bSearching; + + mng_bool bRestorebkgd; /* flags restore required before IDAT/JDAT */ + + mng_uint32 iRuntime; /* millisecs since start */ + mng_uint32 iSynctime; /* tickcount at last framesync */ + mng_uint32 iStarttime; /* tickcount at start */ + mng_uint32 iEndtime; /* tickcount at end */ + mng_bool bRunning; /* animation is active */ + mng_bool bTimerset; /* the timer has been set; + we're expecting a call to + mng_display_resume! */ + mng_uint8 iBreakpoint; /* indicates at which point the + flow was broken to run the timer */ + mng_bool bSectionwait; /* indicates a section break */ + mng_bool bFreezing; /* indicates app requested a freeze */ + mng_bool bResetting; /* indicates app requested a reset */ + mng_bool bNeedrefresh; /* indicates screen-refresh is needed */ + mng_bool bMisplacedTERM; /* indicates TERM is out of place */ + mng_bool bOnlyfirstframe; /* show first frame after TERM and stop */ + mng_uint32 iFramesafterTERM; /* determines frame-count after TERM */ + mng_objectp pCurrentobj; /* current "object" */ + mng_objectp pCurraniobj; /* current animation object + "to be"/"being" processed */ + mng_objectp pTermaniobj; /* TERM animation object */ + mng_uint32 iIterations; /* TERM/MEND iteration count */ + mng_objectp pObjzero; /* "on-the-fly" image (object = 0) */ + mng_objectp pLastclone; /* last clone */ + mng_objectp pStoreobj; /* current store object for row routines */ + mng_objectp pStorebuf; /* current store object-buffer for row routines */ + mng_objectp pRetrieveobj; /* current retrieve object for row routines */ + mng_savedatap pSavedata; /* pointer to saved data (after SAVE) */ + + mng_uint32 iUpdateleft; /* update region for refresh */ + mng_uint32 iUpdateright; + mng_uint32 iUpdatetop; + mng_uint32 iUpdatebottom; + + mng_int8 iPass; /* current interlacing pass; + negative value means no interlace */ + mng_int32 iRow; /* current row counter */ + mng_int32 iRowinc; /* row increment for this pass */ + mng_int32 iCol; /* current starting column */ + mng_int32 iColinc; /* column increment for this pass */ + mng_int32 iRowsamples; /* nr. of samples in current workrow */ + mng_int32 iSamplemul; /* needed to calculate rowsize */ + mng_int32 iSampleofs; /* from rowsamples */ + mng_int32 iSamplediv; + mng_int32 iRowsize; /* size of actual data in work row */ + mng_int32 iRowmax; /* maximum size of data in work row */ + mng_int32 iFilterofs; /* offset to filter-byte in work row */ + mng_int32 iPixelofs; /* offset to pixel-bytes in work row */ + mng_uint32 iLevel0; /* leveling variables */ + mng_uint32 iLevel1; + mng_uint32 iLevel2; + mng_uint32 iLevel3; + mng_uint8p pWorkrow; /* working row of pixel-data */ + mng_uint8p pPrevrow; /* previous row of pixel-data */ + mng_uint8p pRGBArow; /* intermediate row of RGBA8 or RGBA16 data */ + mng_bool bIsRGBA16; /* indicates intermediate row is RGBA16 */ + mng_bool bIsOpaque; /* indicates intermediate row is fully opaque */ + mng_int32 iFilterbpp; /* bpp index for filtering routines */ + + mng_int32 iSourcel; /* variables for showing objects */ + mng_int32 iSourcer; + mng_int32 iSourcet; + mng_int32 iSourceb; + mng_int32 iDestl; + mng_int32 iDestr; + mng_int32 iDestt; + mng_int32 iDestb; + + mng_objectp pFirstimgobj; /* double-linked list of */ + mng_objectp pLastimgobj; /* image-object structures */ + mng_objectp pFirstaniobj; /* double-linked list of */ + mng_objectp pLastaniobj; /* animation-object structures */ +#ifdef MNG_SUPPORT_DYNAMICMNG + mng_objectp pFirstevent; /* double-linked list of */ + mng_objectp pLastevent; /* event-object structures */ +#endif + +#if defined(MNG_GAMMA_ONLY) || defined(MNG_FULL_CMS) || defined(MNG_APP_CMS) + mng_uint8 aGammatab[256]; /* precomputed gamma lookup table */ + mng_float dLastgamma; /* last gamma used to compute table */ +#endif + + mng_fptr fDisplayrow; /* internal callback to display an + uncompressed/unfiltered/ + color-corrected row */ + mng_fptr fRestbkgdrow; /* internal callback for restore- + background processing of a row */ + mng_fptr fCorrectrow; /* internal callback to color-correct an + uncompressed/unfiltered row */ + mng_fptr fRetrieverow; /* internal callback to retrieve an + uncompressed/unfiltered row of data */ + mng_fptr fStorerow; /* internal callback to store an + uncompressed/unfiltered row of data */ + mng_fptr fProcessrow; /* internal callback to process an + uncompressed row of data */ + mng_fptr fDifferrow; /* internal callback to perform + added filter leveling and + differing on an unfiltered row */ + mng_fptr fScalerow; /* internal callback to scale a + delta-row to the bitdepth of its target */ + mng_fptr fDeltarow; /* internal callback to execute a + delta-row onto a target */ +#ifndef MNG_SKIPCHUNK_PAST + mng_fptr fFliprow; /* internal callback to flip a row of pixels + left<->right for a PAST operation */ + mng_fptr fTilerow; /* internal callback to tile a row of pixels + during a PAST operation */ +#endif + mng_fptr fInitrowproc; /* internal callback to initialize + the row processing */ + + mng_uint16 iDEFIobjectid; /* DEFI fields */ + mng_bool bDEFIhasdonotshow; + mng_uint8 iDEFIdonotshow; + mng_bool bDEFIhasconcrete; + mng_uint8 iDEFIconcrete; + mng_bool bDEFIhasloca; + mng_int32 iDEFIlocax; + mng_int32 iDEFIlocay; + mng_bool bDEFIhasclip; + mng_int32 iDEFIclipl; + mng_int32 iDEFIclipr; + mng_int32 iDEFIclipt; + mng_int32 iDEFIclipb; + + mng_uint16 iBACKred; /* BACK fields */ + mng_uint16 iBACKgreen; + mng_uint16 iBACKblue; + mng_uint8 iBACKmandatory; + mng_uint16 iBACKimageid; + mng_uint8 iBACKtile; + + mng_int32 iBackimgoffsx; /* temp variables for restore_bkgd */ + mng_int32 iBackimgoffsy; + mng_uint32 iBackimgwidth; + mng_uint32 iBackimgheight; + +#ifndef MNG_SKIPCHUNK_FRAM + mng_uint8 iFRAMmode; /* FRAM fields (global) */ + mng_uint32 iFRAMdelay; + mng_uint32 iFRAMtimeout; + mng_bool bFRAMclipping; + mng_int32 iFRAMclipl; + mng_int32 iFRAMclipr; + mng_int32 iFRAMclipt; + mng_int32 iFRAMclipb; + + mng_uint8 iFramemode; /* current subframe variables */ + mng_uint32 iFramedelay; + mng_uint32 iFrametimeout; + mng_bool bFrameclipping; + mng_int32 iFrameclipl; + mng_int32 iFrameclipr; + mng_int32 iFrameclipt; + mng_int32 iFrameclipb; + + mng_uint32 iNextdelay; /* delay *after* next image */ + + mng_bool bForcedelay; + mng_uint32 iAccumdelay; +#endif + +#ifndef MNG_SKIPCHUNK_SHOW + mng_uint8 iSHOWmode; /* SHOW fields */ + mng_uint16 iSHOWfromid; + mng_uint16 iSHOWtoid; + mng_uint16 iSHOWnextid; + mng_int16 iSHOWskip; +#endif + + mng_uint32 iGlobalPLTEcount; /* global PLTE fields */ + mng_rgbpaltab aGlobalPLTEentries; + + mng_uint32 iGlobalTRNSrawlen; /* global tRNS fields */ + mng_uint8arr aGlobalTRNSrawdata; + + mng_uint32 iGlobalGamma; /* global gAMA fields */ + +#ifndef MNG_SKIPCHUNK_cHRM + mng_uint32 iGlobalWhitepointx; /* global cHRM fields */ + mng_uint32 iGlobalWhitepointy; + mng_uint32 iGlobalPrimaryredx; + mng_uint32 iGlobalPrimaryredy; + mng_uint32 iGlobalPrimarygreenx; + mng_uint32 iGlobalPrimarygreeny; + mng_uint32 iGlobalPrimarybluex; + mng_uint32 iGlobalPrimarybluey; +#endif + + mng_uint8 iGlobalRendintent; /* global sRGB fields */ + +#ifndef MNG_SKIPCHUNK_iCCP + mng_uint32 iGlobalProfilesize; /* global iCCP fields */ + mng_ptr pGlobalProfile; +#endif + + mng_uint16 iGlobalBKGDred; /* global bKGD fields */ + mng_uint16 iGlobalBKGDgreen; + mng_uint16 iGlobalBKGDblue; + + mng_ptr pDeltaImage; /* delta-image fields */ + mng_uint8 iDeltaImagetype; +#endif /* MNG_SUPPORT_DISPLAY */ + mng_uint8 iDeltatype; /* need this one in read processing !! */ +#ifdef MNG_SUPPORT_DISPLAY + mng_uint32 iDeltaBlockwidth; + mng_uint32 iDeltaBlockheight; + mng_uint32 iDeltaBlockx; + mng_uint32 iDeltaBlocky; + mng_bool bDeltaimmediate; + + mng_fptr fDeltagetrow; /* internal delta-proc callbacks */ + mng_fptr fDeltaaddrow; + mng_fptr fDeltareplacerow; + mng_fptr fDeltaputrow; + +#ifndef MNG_SKIPCHUNK_PROM + mng_fptr fPromoterow; /* internal PROM fields */ + mng_fptr fPromBitdepth; + mng_ptr pPromBuf; + mng_uint8 iPromColortype; + mng_uint8 iPromBitdepth; + mng_uint8 iPromFilltype; + mng_uint32 iPromWidth; + mng_ptr pPromSrc; + mng_ptr pPromDst; +#endif + +#ifndef MNG_SKIPCHUNK_MAGN + mng_uint16 iMAGNfromid; + mng_uint16 iMAGNcurrentid; + mng_uint16 iMAGNtoid; +#endif + +#ifndef MNG_SKIPCHUNK_PAST + mng_uint16 iPASTid; + mng_int32 iPastx; /* target x/y of last PAST */ + mng_int32 iPasty; +#endif + + mng_objectp pLastseek; /* last processed ani_seek object */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + mng_objectp pMPNG; /* mpNG object if available */ +#endif +#ifdef MNG_INCLUDE_ANG_PROPOSAL + mng_objectp pANG; /* ANG object if available */ +#endif + +#endif /* MNG_SUPPORT_DISPLAY */ + +#ifdef MNG_INCLUDE_ZLIB + z_stream sZlib; /* zlib (de)compression variables */ + + mng_int32 iZlevel; /* zlib compression parameters */ + mng_int32 iZmethod; + mng_int32 iZwindowbits; + mng_int32 iZmemlevel; + mng_int32 iZstrategy; + + mng_uint32 iMaxIDAT; /* maximum size of IDAT data */ + + mng_bool bInflating; /* indicates "inflate" in progress */ + mng_bool bDeflating; /* indicates "deflate" in progress */ +#endif /* MNG_INCLUDE_ZLIB */ + +#ifdef MNG_INCLUDE_JNG + mngjpeg_dctmethod eJPEGdctmethod; /* IJG compression variables */ + mng_int32 iJPEGquality; + mng_int32 iJPEGsmoothing; + mng_bool bJPEGcompressprogr; + mng_bool bJPEGcompressopt; + + mng_uint32 iMaxJDAT; /* maximum size of JDAT/JDAA data */ + + mngjpeg_compp pJPEGcinfo; /* compression structure */ + mngjpeg_errorp pJPEGcerr; /* error-manager compress */ + + mngjpeg_decompp pJPEGdinfo; /* decompression structure (JDAT) */ + mngjpeg_errorp pJPEGderr; /* error-manager decompress (JDAT) */ + mngjpeg_sourcep pJPEGdsrc; /* source-manager decompress (JDAT) */ + + mngjpeg_decompp pJPEGdinfo2; /* decompression structure (JDAA) */ + mngjpeg_errorp pJPEGderr2; /* error-manager decompress (JDAA) */ + mngjpeg_sourcep pJPEGdsrc2; /* source-manager decompress (JDAA) */ + + mng_uint8p pJPEGbuf; /* buffer for JPEG (de)compression (JDAT) */ + mng_uint32 iJPEGbufmax; /* allocated space for buffer (JDAT) */ + mng_uint8p pJPEGcurrent; /* current pointer into buffer (JDAT) */ + mng_uint32 iJPEGbufremain; /* remaining bytes in buffer (JDAT) */ + mng_uint32 iJPEGtoskip; /* bytes to skip on next input-block (JDAT) */ + + mng_uint8p pJPEGbuf2; /* buffer for JPEG (de)compression (JDAA) */ + mng_uint32 iJPEGbufmax2; /* allocated space for buffer (JDAA) */ + mng_uint8p pJPEGcurrent2; /* current pointer into buffer (JDAA) */ + mng_uint32 iJPEGbufremain2; /* remaining bytes in buffer (JDAA) */ + mng_uint32 iJPEGtoskip2; /* bytes to skip on next input-block (JDAA) */ + + mng_uint8p pJPEGrow; /* buffer for a JPEG row of samples (JDAT) */ + mng_uint32 iJPEGrowlen; + + mng_uint8p pJPEGrow2; /* buffer for a JPEG row of samples (JDAA) */ + mng_uint32 iJPEGrowlen2; + + mng_bool bJPEGcompress; /* indicates "compress" initialized */ + + mng_bool bJPEGdecompress; /* indicates "decompress" initialized (JDAT) */ + mng_bool bJPEGhasheader; /* indicates "readheader" succeeded (JDAT) */ + mng_bool bJPEGdecostarted; /* indicates "decompress" started (JDAT) */ + mng_bool bJPEGscanstarted; /* indicates "first scan" started (JDAT) */ + mng_bool bJPEGscanending; /* indicates "finish_output" suspended (JDAT) */ + mng_bool bJPEGprogressive; /* indicates a progressive image (JDAT) */ + + mng_bool bJPEGdecompress2; /* indicates "decompress" initialized (JDAA) */ + mng_bool bJPEGhasheader2; /* indicates "readheader" succeeded (JDAA) */ + mng_bool bJPEGdecostarted2; /* indicates "decompress" started (JDAA) */ + mng_bool bJPEGscanstarted2; /* indicates "first scan" started (JDAA) */ + mng_bool bJPEGprogressive2; /* indicates a progressive image (JDAA) */ + + mng_fptr fStorerow2; /* internal callback to store an + uncompressed/unfiltered row of JPEG-data (JDAT) */ + + mng_fptr fStorerow3; /* internal callback to store an + uncompressed/unfiltered row of JPEG-data (JDAA) */ + + mng_uint32 iJPEGrow; /* row-number for current JPEG row */ + mng_uint32 iJPEGalpharow; /* nr. of rows filled with alpha */ + mng_uint32 iJPEGrgbrow; /* nr. of rows filled with 'color'-info */ + mng_uint32 iJPEGdisprow; /* nr. of rows already displayed "on-the-fly" */ + +#if defined(MNG_USE_SETJMP) && defined (MNG_INCLUDE_IJG6B) + jmp_buf sErrorbuf; /* setjmp/longjmp buffer (error-recovery) */ +#endif + +#endif /* MNG_INCLUDE_JNG */ + +#ifndef MNG_USE_ZLIB_CRC + mng_uint32 aCRCtable [256]; /* CRC prefab table */ + mng_bool bCRCcomputed; /* "has been built" indicator */ +#endif + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + png_imgtype ePng_imgtype; +#endif + +#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT) + mng_uint8 iPNGdepth; /* Real input depth */ + mng_uint8 iPNGmult; +#endif + +#ifdef MNG_OPTIMIZE_DISPLAYCALLS + mng_uint32 iRawlen; /* temp vars for display processing */ + mng_uint8p pRawdata; +#ifndef MNG_SKIPCHUNK_BASI + mng_uint16 iBASIred; + mng_uint16 iBASIgreen; + mng_uint16 iBASIblue; + mng_bool bBASIhasalpha; + mng_uint16 iBASIalpha; + mng_uint8 iBASIviewable; +#endif +#ifndef MNG_SKIPCHUNK_CLON + mng_uint16 iCLONsourceid; + mng_uint16 iCLONcloneid; + mng_uint8 iCLONclonetype; + mng_bool bCLONhasdonotshow; + mng_uint8 iCLONdonotshow; + mng_uint8 iCLONconcrete; + mng_bool bCLONhasloca; + mng_uint8 iCLONlocationtype; + mng_int32 iCLONlocationx; + mng_int32 iCLONlocationy; +#endif +#ifndef MNG_SKIPCHUNK_DISC + mng_uint32 iDISCcount; + mng_uint16p pDISCids; +#endif +#ifndef MNG_SKIPCHUNK_FRAM + mng_uint8 iTempFramemode; + mng_uint8 iTempChangedelay; + mng_uint32 iTempDelay; + mng_uint8 iTempChangetimeout; + mng_uint32 iTempTimeout; + mng_uint8 iTempChangeclipping; + mng_uint8 iTempCliptype; + mng_int32 iTempClipl; + mng_int32 iTempClipr; + mng_int32 iTempClipt; + mng_int32 iTempClipb; +#endif +#ifndef MNG_SKIPCHUNK_MOVE + mng_uint16 iMOVEfromid; + mng_uint16 iMOVEtoid; + mng_uint8 iMOVEmovetype; + mng_int32 iMOVEmovex; + mng_int32 iMOVEmovey; +#endif +#ifndef MNG_SKIPCHUNK_CLIP + mng_uint16 iCLIPfromid; + mng_uint16 iCLIPtoid; + mng_uint8 iCLIPcliptype; + mng_int32 iCLIPclipl; + mng_int32 iCLIPclipr; + mng_int32 iCLIPclipt; + mng_int32 iCLIPclipb; +#endif +#ifndef MNG_NO_DELTA_PNG + mng_uint16 iDHDRobjectid; + mng_uint8 iDHDRimagetype; + mng_uint8 iDHDRdeltatype; + mng_uint32 iDHDRblockwidth; + mng_uint32 iDHDRblockheight; + mng_uint32 iDHDRblockx; + mng_uint32 iDHDRblocky; + mng_uint8 iPROMbitdepth; + mng_uint8 iPROMcolortype; + mng_uint8 iPROMfilltype; + mng_uint8 iPPLTtype; + mng_uint32 iPPLTcount; + mng_palette8ep paPPLTindexentries; + mng_uint8p paPPLTalphaentries; + mng_uint8p paPPLTusedentries; +#endif +#ifndef MNG_SKIPCHUNK_MAGN + mng_uint16 iMAGNfirstid; + mng_uint16 iMAGNlastid; + mng_uint8 iMAGNmethodX; + mng_uint16 iMAGNmX; + mng_uint16 iMAGNmY; + mng_uint16 iMAGNmL; + mng_uint16 iMAGNmR; + mng_uint16 iMAGNmT; + mng_uint16 iMAGNmB; + mng_uint8 iMAGNmethodY; +#endif +#ifndef MNG_SKIPCHUNK_PAST + mng_uint16 iPASTtargetid; + mng_uint8 iPASTtargettype; + mng_int32 iPASTtargetx; + mng_int32 iPASTtargety; + mng_uint32 iPASTcount; + mng_ptr pPASTsources; +#endif +#endif /* MNG_OPTIMIZE_DISPLAYCALLS */ + + } mng_data; + +typedef mng_data * mng_datap; + +/* ************************************************************************** */ +/* * * */ +/* * Internal Callback-Function prototypes * */ +/* * * */ +/* ************************************************************************** */ + +typedef mng_retcode(*mng_displayrow) (mng_datap pData); +typedef mng_retcode(*mng_restbkgdrow) (mng_datap pData); +typedef mng_retcode(*mng_correctrow) (mng_datap pData); +typedef mng_retcode(*mng_retrieverow) (mng_datap pData); +typedef mng_retcode(*mng_storerow) (mng_datap pData); +typedef mng_retcode(*mng_processrow) (mng_datap pData); +typedef mng_retcode(*mng_initrowproc) (mng_datap pData); +typedef mng_retcode(*mng_differrow) (mng_datap pData); +typedef mng_retcode(*mng_scalerow) (mng_datap pData); +typedef mng_retcode(*mng_deltarow) (mng_datap pData); +typedef mng_retcode(*mng_promoterow) (mng_datap pData); +typedef mng_retcode(*mng_fliprow) (mng_datap pData); +typedef mng_retcode(*mng_tilerow) (mng_datap pData); + +typedef mng_uint8 (*mng_bitdepth_8) (mng_uint8 iB); +typedef mng_uint16 (*mng_bitdepth_16) (mng_uint8 iB); + +typedef mng_retcode(*mng_magnify_x) (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p iSrcline, + mng_uint8p iDstline); +typedef mng_retcode(*mng_magnify_y) (mng_datap pData, + mng_int32 iM, + mng_int32 iS, + mng_uint32 iWidth, + mng_uint8p iSrcline1, + mng_uint8p iSrcline2, + mng_uint8p iDstline); + +/* ************************************************************************** */ +/* * * */ +/* * Routines for swapping byte-order from and to graphic files * */ +/* * (This code is adapted from the libpng package) * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_BIGENDIAN_SUPPORTED +mng_uint32 mng_get_uint32 (mng_uint8p pBuf); +mng_int32 mng_get_int32 (mng_uint8p pBuf); +mng_uint16 mng_get_uint16 (mng_uint8p pBuf); +void mng_put_uint32 (mng_uint8p pBuf, + mng_uint32 i); +void mng_put_int32 (mng_uint8p pBuf, + mng_int32 i); +void mng_put_uint16 (mng_uint8p pBuf, + mng_uint16 i); +#else /* MNG_BIGENDIAN_SUPPORTED */ +#define mng_get_uint32(P) *(mng_uint32p)(P) +#define mng_get_int32(P) *(mng_int32p)(P) +#define mng_get_uint16(P) *(mng_uint16p)(P) +#define mng_put_uint32(P,I) *(mng_uint32p)(P) = (I) +#define mng_put_int32(P,I) *(mng_int32p)(P) = (I) +#define mng_put_uint16(P,I) *(mng_uint16p)(P) = (I) +#endif /* MNG_BIGENDIAN_SUPPORTED */ + +/* ************************************************************************** */ +/* * * */ +/* * Some handy(?) macro definitions * */ +/* * * */ +/* ************************************************************************** */ + +#define MAX_COORD(a, b) (((a) > (b)) ? (a) : (b)) +#define MIN_COORD(a, b) (((a) < (b)) ? (a) : (b)) + +/* ************************************************************************** */ + +#endif /* _libmng_data_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_display.c b/src/3rdparty/libmng/libmng_display.c new file mode 100644 index 0000000000..81c2484b54 --- /dev/null +++ b/src/3rdparty/libmng/libmng_display.c @@ -0,0 +1,7140 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_display.c copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Display management (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the display management routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added callback error-reporting support * */ +/* * - fixed frame_delay misalignment * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - added sanity check for frozen status * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * 0.5.1 - 05/13/2000 - G.Juyn * */ +/* * - changed display_mend to reset state to initial or SAVE * */ +/* * - added eMNGma hack (will be removed in 1.0.0 !!!) * */ +/* * - added TERM animation object pointer (easier reference) * */ +/* * - added process_save & process_seek routines * */ +/* * 0.5.1 - 05/14/2000 - G.Juyn * */ +/* * - added save_state and restore_state for SAVE/SEEK/TERM * */ +/* * processing * */ +/* * * */ +/* * 0.5.2 - 05/20/2000 - G.Juyn * */ +/* * - added JNG support (JHDR/JDAT) * */ +/* * 0.5.2 - 05/23/2000 - G.Juyn * */ +/* * - fixed problem with DEFI clipping * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added delta-image support (DHDR,PROM,IPNG,IJNG) * */ +/* * 0.5.2 - 05/31/2000 - G.Juyn * */ +/* * - fixed pointer confusion (contributed by Tim Rowley) * */ +/* * 0.5.2 - 06/03/2000 - G.Juyn * */ +/* * - fixed makeup for Linux gcc compile * */ +/* * 0.5.2 - 06/05/2000 - G.Juyn * */ +/* * - added support for RGB8_A8 canvasstyle * */ +/* * 0.5.2 - 06/09/2000 - G.Juyn * */ +/* * - fixed timer-handling to run with Mozilla (Tim Rowley) * */ +/* * 0.5.2 - 06/10/2000 - G.Juyn * */ +/* * - fixed some compilation-warnings (contrib Jason Morris) * */ +/* * * */ +/* * 0.5.3 - 06/12/2000 - G.Juyn * */ +/* * - fixed display of stored JNG images * */ +/* * 0.5.3 - 06/13/2000 - G.Juyn * */ +/* * - fixed problem with BASI-IEND as object 0 * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - changed progressive-display processing * */ +/* * 0.5.3 - 06/17/2000 - G.Juyn * */ +/* * - changed delta-image processing * */ +/* * 0.5.3 - 06/20/2000 - G.Juyn * */ +/* * - fixed some minor stuff * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added speed-modifier to timing routine * */ +/* * 0.5.3 - 06/22/2000 - G.Juyn * */ +/* * - added support for PPLT chunk processing * */ +/* * 0.5.3 - 06/29/2000 - G.Juyn * */ +/* * - swapped refresh parameters * */ +/* * * */ +/* * 0.9.0 - 06/30/2000 - G.Juyn * */ +/* * - changed refresh parameters to 'x,y,width,height' * */ +/* * * */ +/* * 0.9.1 - 07/07/2000 - G.Juyn * */ +/* * - implemented support for freeze/reset/resume & go_xxxx * */ +/* * 0.9.1 - 07/08/2000 - G.Juyn * */ +/* * - added support for improved timing * */ +/* * 0.9.1 - 07/14/2000 - G.Juyn * */ +/* * - changed EOF processing behavior * */ +/* * - fixed TERM delay processing * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - fixed freeze & reset processing * */ +/* * 0.9.1 - 07/16/2000 - G.Juyn * */ +/* * - fixed storage of images during mng_read() * */ +/* * - fixed support for mng_display() after mng_read() * */ +/* * 0.9.1 - 07/24/2000 - G.Juyn * */ +/* * - fixed reading of still-images * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/07/2000 - G.Juyn * */ +/* * - B111300 - fixup for improved portability * */ +/* * 0.9.3 - 08/21/2000 - G.Juyn * */ +/* * - fixed TERM processing delay of 0 msecs * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/10/2000 - G.Juyn * */ +/* * - fixed problem with no refresh after TERM * */ +/* * - fixed DEFI behavior * */ +/* * 0.9.3 - 09/16/2000 - G.Juyn * */ +/* * - fixed timing & refresh behavior for single PNG/JNG * */ +/* * 0.9.3 - 09/19/2000 - G.Juyn * */ +/* * - refixed timing & refresh behavior for single PNG/JNG * */ +/* * 0.9.3 - 10/02/2000 - G.Juyn * */ +/* * - fixed timing again (this is getting boring...) * */ +/* * - refixed problem with no refresh after TERM * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added JDAA chunk * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - fixed support for bKGD * */ +/* * 0.9.3 - 10/18/2000 - G.Juyn * */ +/* * - fixed delta-processing behavior * */ +/* * 0.9.3 - 10/19/2000 - G.Juyn * */ +/* * - added storage for pixel-/alpha-sampledepth for delta's * */ +/* * 0.9.3 - 10/27/2000 - G.Juyn * */ +/* * - fixed separate read() & display() processing * */ +/* * * */ +/* * 0.9.4 - 10/31/2000 - G.Juyn * */ +/* * - fixed possible loop in display_resume() (Thanks Vova!) * */ +/* * 0.9.4 - 11/20/2000 - G.Juyn * */ +/* * - fixed unwanted repetition in mng_readdisplay() * */ +/* * 0.9.4 - 11/24/2000 - G.Juyn * */ +/* * - moved restore of object 0 to libmng_display * */ +/* * - added restore of object 0 to TERM processing !!! * */ +/* * - fixed TERM delay processing * */ +/* * - fixed TERM end processing (count = 0) * */ +/* * 0.9.4 - 12/16/2000 - G.Juyn * */ +/* * - fixed mixup of data- & function-pointers (thanks Dimitri)* */ +/* * 0.9.4 - 1/18/2001 - G.Juyn * */ +/* * - removed test filter-methods 1 & 65 * */ +/* * - set default level-set for filtertype=64 to all zeroes * */ +/* * * */ +/* * 0.9.5 - 1/20/2001 - G.Juyn * */ +/* * - fixed compiler-warnings Mozilla (thanks Tim) * */ +/* * 0.9.5 - 1/23/2001 - G.Juyn * */ +/* * - fixed timing-problem with switching framing_modes * */ +/* * * */ +/* * 1.0.1 - 02/08/2001 - G.Juyn * */ +/* * - added MEND processing callback * */ +/* * 1.0.1 - 02/13/2001 - G.Juyn * */ +/* * - fixed first FRAM_MODE=4 timing problem * */ +/* * 1.0.1 - 04/21/2001 - G.Juyn * */ +/* * - fixed memory-leak for JNGs with alpha (Thanks Gregg!) * */ +/* * - added BGRA8 canvas with premultiplied alpha * */ +/* * * */ +/* * 1.0.2 - 06/25/2001 - G.Juyn * */ +/* * - fixed memory-leak with delta-images (Thanks Michael!) * */ +/* * * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * - completed delta-image support * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/13/2002 - G.Juyn * */ +/* * - fixed read/write of MAGN chunk * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - fixed LOOP iteration=0 special case * */ +/* * 1.0.5 - 09/19/2002 - G.Juyn * */ +/* * - fixed color-correction for restore-background handling * */ +/* * - optimized restore-background for bKGD cases * */ +/* * - cleaned up some old stuff * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - finished support for BACK image & tiling * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 09/22/2002 - G.Juyn * */ +/* * - added bgrx8 canvas (filler byte) * */ +/* * 1.0.5 - 10/05/2002 - G.Juyn * */ +/* * - fixed dropping mix of frozen/unfrozen objects * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - added proposed change in handling of TERM- & if-delay * */ +/* * - added another fix for misplaced TERM chunk * */ +/* * - completed support for condition=2 in TERM chunk * */ +/* * 1.0.5 - 10/18/2002 - G.Juyn * */ +/* * - fixed clipping-problem with BACK tiling (Thanks Sakura!) * */ +/* * 1.0.5 - 10/20/2002 - G.Juyn * */ +/* * - fixed processing for multiple objects in MAGN * */ +/* * - fixed display of visible target of PAST operation * */ +/* * 1.0.5 - 10/30/2002 - G.Juyn * */ +/* * - modified TERM/MEND processing for max(1, TERM_delay, * */ +/* * interframe_delay) * */ +/* * 1.0.5 - 11/04/2002 - G.Juyn * */ +/* * - fixed layer- & frame-counting during read() * */ +/* * - fixed goframe/golayer/gotime processing * */ +/* * 1.0.5 - 01/19/2003 - G.Juyn * */ +/* * - B654627 - fixed SEGV when no gettickcount callback * */ +/* * - B664383 - fixed typo * */ +/* * - finalized changes in TERM/final_delay to elected proposal* */ +/* * * */ +/* * 1.0.6 - 05/11/2003 - G. Juyn * */ +/* * - added conditionals around canvas update routines * */ +/* * 1.0.6 - 05/25/2003 - G.R-P * */ +/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added conditionals around some JNG-supporting code * */ +/* * - added conditionals around 16-bit supporting code * */ +/* * - reversed some loops to use decrementing counter * */ +/* * - combined init functions into one function * */ +/* * 1.0.6 - 07/10/2003 - G.R-P * */ +/* * - replaced nested switches with simple init setup function * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * 1.0.6 - 08/17/2003 - G.R-P * */ +/* * - added conditionals around non-VLC chunk support * */ +/* * * */ +/* * 1.0.7 - 11/27/2003 - R.A * */ +/* * - added CANVAS_RGB565 and CANVAS_BGR565 * */ +/* * 1.0.7 - 12/06/2003 - R.A * */ +/* * - added CANVAS_RGBA565 and CANVAS_BGRA565 * */ +/* * 1.0.7 - 01/25/2004 - J.S * */ +/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */ +/* * * */ +/* * 1.0.8 - 03/31/2004 - G.Juyn * */ +/* * - fixed problem with PAST usage where source > dest * */ +/* * 1.0.8 - 05/04/2004 - G.R-P. * */ +/* * - fixed misplaced 16-bit conditionals * */ +/* * * */ +/* * 1.0.9 - 09/18/2004 - G.R-P. * */ +/* * - revised some SKIPCHUNK conditionals * */ +/* * 1.0.9 - 10/10/2004 - G.R-P. * */ +/* * - added MNG_NO_1_2_4BIT_SUPPORT * */ +/* * 1.0.9 - 10/14/2004 - G.Juyn * */ +/* * - added bgr565_a8 canvas-style (thanks to J. Elvander) * */ +/* * 1.0.9 - 12/11/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_DISPLAYCALLS * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* * 1.0.10 - 07/06/2005 - G.R-P. * */ +/* * - added more SKIPCHUNK conditionals * */ +/* * 1.0.10 - 12/28/2005 - G.R-P. * */ +/* * - added missing SKIPCHUNK_MAGN conditional * */ +/* * 1.0.10 - 03/07/2006 - (thanks to W. Manthey) * */ +/* * - added CANVAS_RGB555 and CANVAS_BGR555 * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - fixed several compiler warnings * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_chunks.h" +#include "libmng_objects.h" +#include "libmng_object_prc.h" +#include "libmng_memory.h" +#include "libmng_zlib.h" +#include "libmng_jpeg.h" +#include "libmng_cms.h" +#include "libmng_pixels.h" +#include "libmng_display.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_DISPLAY_PROCS + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode set_delay (mng_datap pData, + mng_uint32 iInterval) +{ + if (!iInterval) /* at least 1 msec please! */ + iInterval = 1; + + if (pData->bRunning) /* only when really displaying */ + if (!pData->fSettimer ((mng_handle)pData, iInterval)) + MNG_ERROR (pData, MNG_APPTIMERERROR); + +#ifdef MNG_SUPPORT_DYNAMICMNG + if ((!pData->bDynamic) || (pData->bRunning)) +#else + if (pData->bRunning) +#endif + pData->bTimerset = MNG_TRUE; /* and indicate so */ + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_uint32 calculate_delay (mng_datap pData, + mng_uint32 iDelay) +{ + mng_uint32 iTicks = pData->iTicks; + mng_uint32 iWaitfor = 1; /* default non-MNG delay */ + + if (!iTicks) /* tick_count not specified ? */ + if (pData->eImagetype == mng_it_mng) + iTicks = 1000; + + if (iTicks) + { + switch (pData->iSpeed) /* honor speed modifier */ + { + case mng_st_fast : + { + iWaitfor = (mng_uint32)(( 500 * iDelay) / iTicks); + break; + } + case mng_st_slow : + { + iWaitfor = (mng_uint32)((3000 * iDelay) / iTicks); + break; + } + case mng_st_slowest : + { + iWaitfor = (mng_uint32)((8000 * iDelay) / iTicks); + break; + } + default : + { + iWaitfor = (mng_uint32)((1000 * iDelay) / iTicks); + } + } + } + + return iWaitfor; +} + +/* ************************************************************************** */ +/* * * */ +/* * Progressive display refresh - does the call to the refresh callback * */ +/* * and sets the timer to allow the app to perform the actual refresh to * */ +/* * the screen (eg. process its main message-loop) * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_display_progressive_refresh (mng_datap pData, + mng_uint32 iInterval) +{ + { /* let the app refresh first ? */ + if ((pData->bRunning) && (!pData->bSkipping) && + (pData->iUpdatetop < pData->iUpdatebottom) && (pData->iUpdateleft < pData->iUpdateright)) + { + if (!pData->fRefresh (((mng_handle)pData), + pData->iUpdateleft, pData->iUpdatetop, + pData->iUpdateright - pData->iUpdateleft, + pData->iUpdatebottom - pData->iUpdatetop)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + pData->iUpdateleft = 0; /* reset update-region */ + pData->iUpdateright = 0; + pData->iUpdatetop = 0; + pData->iUpdatebottom = 0; /* reset refreshneeded indicator */ + pData->bNeedrefresh = MNG_FALSE; + /* interval requested ? */ + if ((!pData->bFreezing) && (iInterval)) + { /* setup the timer */ + mng_retcode iRetcode = set_delay (pData, iInterval); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + } + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* * * */ +/* * Generic display routines * */ +/* * * */ +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode interframe_delay (mng_datap pData) +{ + mng_uint32 iWaitfor = 0; + mng_uint32 iInterval; + mng_uint32 iRuninterval; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INTERFRAME_DELAY, MNG_LC_START); +#endif + + { +#ifndef MNG_SKIPCHUNK_FRAM + if (pData->iFramedelay > 0 || pData->bForcedelay) /* real delay ? */ + { /* let the app refresh first ? */ + pData->bForcedelay = MNG_FALSE; + if ((pData->bRunning) && (!pData->bSkipping) && + (pData->iUpdatetop < pData->iUpdatebottom) && (pData->iUpdateleft < pData->iUpdateright)) + if (!pData->fRefresh (((mng_handle)pData), + pData->iUpdateleft, pData->iUpdatetop, + pData->iUpdateright - pData->iUpdateleft, + pData->iUpdatebottom - pData->iUpdatetop)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + pData->iUpdateleft = 0; /* reset update-region */ + pData->iUpdateright = 0; + pData->iUpdatetop = 0; + pData->iUpdatebottom = 0; /* reset refreshneeded indicator */ + pData->bNeedrefresh = MNG_FALSE; + +#ifndef MNG_SKIPCHUNK_TERM + if (pData->bOnlyfirstframe) /* only processing first frame after TERM ? */ + { + pData->iFramesafterTERM++; + /* did we do a frame yet ? */ + if (pData->iFramesafterTERM > 1) + { /* then that's it; just stop right here ! */ + pData->pCurraniobj = MNG_NULL; + pData->bRunning = MNG_FALSE; + + return MNG_NOERROR; + } + } +#endif + + if (pData->fGettickcount) + { /* get current tickcount */ + pData->iRuntime = pData->fGettickcount ((mng_handle)pData); + /* calculate interval since last sync-point */ + if (pData->iRuntime < pData->iSynctime) + iRuninterval = pData->iRuntime + ~pData->iSynctime + 1; + else + iRuninterval = pData->iRuntime - pData->iSynctime; + /* calculate actual run-time */ + if (pData->iRuntime < pData->iStarttime) + pData->iRuntime = pData->iRuntime + ~pData->iStarttime + 1; + else + pData->iRuntime = pData->iRuntime - pData->iStarttime; + } + else + { + iRuninterval = 0; + } + + iWaitfor = calculate_delay (pData, pData->iFramedelay); + + if (iWaitfor > iRuninterval) /* delay necessary ? */ + iInterval = iWaitfor - iRuninterval; + else + iInterval = 1; /* force app to process messageloop */ + /* set the timer ? */ + if (((pData->bRunning) || (pData->bSearching) || (pData->bReading)) && + (!pData->bSkipping)) + { + iRetcode = set_delay (pData, iInterval); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + + if (!pData->bSkipping) /* increase frametime in advance */ + pData->iFrametime = pData->iFrametime + iWaitfor; + /* setup for next delay */ + pData->iFramedelay = pData->iNextdelay; + pData->iAccumdelay += pData->iFramedelay; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INTERFRAME_DELAY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL void set_display_routine (mng_datap pData) +{ /* actively running ? */ + if (((pData->bRunning) || (pData->bSearching)) && (!pData->bSkipping)) + { + switch (pData->iCanvasstyle) /* determine display routine */ + { +#ifndef MNG_SKIPCANVAS_RGB8 + case MNG_CANVAS_RGB8 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb8; break; } +#endif +#ifndef MNG_SKIPCANVAS_RGBA8 + case MNG_CANVAS_RGBA8 : { pData->fDisplayrow = (mng_fptr)mng_display_rgba8; break; } +#endif +#ifndef MNG_SKIPCANVAS_RGBA8_PM + case MNG_CANVAS_RGBA8_PM: { pData->fDisplayrow = (mng_fptr)mng_display_rgba8_pm; break; } +#endif +#ifndef MNG_SKIPCANVAS_ARGB8 + case MNG_CANVAS_ARGB8 : { pData->fDisplayrow = (mng_fptr)mng_display_argb8; break; } +#endif +#ifndef MNG_SKIPCANVAS_ARGB8_PM + case MNG_CANVAS_ARGB8_PM: { pData->fDisplayrow = (mng_fptr)mng_display_argb8_pm; break; } +#endif +#ifndef MNG_SKIPCANVAS_RGB8_A8 + case MNG_CANVAS_RGB8_A8 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb8_a8; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGR8 + case MNG_CANVAS_BGR8 : { pData->fDisplayrow = (mng_fptr)mng_display_bgr8; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGRX8 + case MNG_CANVAS_BGRX8 : { pData->fDisplayrow = (mng_fptr)mng_display_bgrx8; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGRA8 + case MNG_CANVAS_BGRA8 : { pData->fDisplayrow = (mng_fptr)mng_display_bgra8; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGRA8_PM + case MNG_CANVAS_BGRA8_PM: { pData->fDisplayrow = (mng_fptr)mng_display_bgra8_pm; break; } +#endif +#ifndef MNG_SKIPCANVAS_ABGR8 + case MNG_CANVAS_ABGR8 : { pData->fDisplayrow = (mng_fptr)mng_display_abgr8; break; } +#endif +#ifndef MNG_SKIPCANVAS_ABGR8_PM + case MNG_CANVAS_ABGR8_PM: { pData->fDisplayrow = (mng_fptr)mng_display_abgr8_pm; break; } +#endif +#ifndef MNG_SKIPCANVAS_RGB565 + case MNG_CANVAS_RGB565 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb565; break; } +#endif +#ifndef MNG_SKIPCANVAS_RGBA565 + case MNG_CANVAS_RGBA565 : { pData->fDisplayrow = (mng_fptr)mng_display_rgba565; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGR565 + case MNG_CANVAS_BGR565 : { pData->fDisplayrow = (mng_fptr)mng_display_bgr565; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGRA565 + case MNG_CANVAS_BGRA565 : { pData->fDisplayrow = (mng_fptr)mng_display_bgra565; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGR565_A8 + case MNG_CANVAS_BGR565_A8 : { pData->fDisplayrow = (mng_fptr)mng_display_bgr565_a8; break; } +#endif +#ifndef MNG_SKIPCANVAS_RGB555 + case MNG_CANVAS_RGB555 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb555; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGR555 + case MNG_CANVAS_BGR555 : { pData->fDisplayrow = (mng_fptr)mng_display_bgr555; break; } +#endif + +#ifndef MNG_NO_16BIT_SUPPORT +/* case MNG_CANVAS_RGB16 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb16; break; } */ +/* case MNG_CANVAS_RGBA16 : { pData->fDisplayrow = (mng_fptr)mng_display_rgba16; break; } */ +/* case MNG_CANVAS_ARGB16 : { pData->fDisplayrow = (mng_fptr)mng_display_argb16; break; } */ +/* case MNG_CANVAS_BGR16 : { pData->fDisplayrow = (mng_fptr)mng_display_bgr16; break; } */ +/* case MNG_CANVAS_BGRA16 : { pData->fDisplayrow = (mng_fptr)mng_display_bgra16; break; } */ +/* case MNG_CANVAS_ABGR16 : { pData->fDisplayrow = (mng_fptr)mng_display_abgr16; break; } */ +#endif +/* case MNG_CANVAS_INDEX8 : { pData->fDisplayrow = (mng_fptr)mng_display_index8; break; } */ +/* case MNG_CANVAS_INDEXA8 : { pData->fDisplayrow = (mng_fptr)mng_display_indexa8; break; } */ +/* case MNG_CANVAS_AINDEX8 : { pData->fDisplayrow = (mng_fptr)mng_display_aindex8; break; } */ +/* case MNG_CANVAS_GRAY8 : { pData->fDisplayrow = (mng_fptr)mng_display_gray8; break; } */ +/* case MNG_CANVAS_AGRAY8 : { pData->fDisplayrow = (mng_fptr)mng_display_agray8; break; } */ +/* case MNG_CANVAS_GRAYA8 : { pData->fDisplayrow = (mng_fptr)mng_display_graya8; break; } */ +#ifndef MNG_NO_16BIT_SUPPORT +/* case MNG_CANVAS_GRAY16 : { pData->fDisplayrow = (mng_fptr)mng_display_gray16; break; } */ +/* case MNG_CANVAS_GRAYA16 : { pData->fDisplayrow = (mng_fptr)mng_display_graya16; break; } */ +/* case MNG_CANVAS_AGRAY16 : { pData->fDisplayrow = (mng_fptr)mng_display_agray16; break; } */ +#endif +/* case MNG_CANVAS_DX15 : { pData->fDisplayrow = (mng_fptr)mng_display_dx15; break; } */ +/* case MNG_CANVAS_DX16 : { pData->fDisplayrow = (mng_fptr)mng_display_dx16; break; } */ + } + } + + return; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode load_bkgdlayer (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_LOAD_BKGDLAYER, MNG_LC_START); +#endif + /* actively running ? */ + if (((pData->bRunning) || (pData->bSearching)) && (!pData->bSkipping)) + { + mng_int32 iY; + mng_retcode iRetcode; + mng_bool bColorcorr = MNG_FALSE; + /* save values */ + mng_int32 iDestl = pData->iDestl; + mng_int32 iDestr = pData->iDestr; + mng_int32 iDestt = pData->iDestt; + mng_int32 iDestb = pData->iDestb; + mng_int32 iSourcel = pData->iSourcel; + mng_int32 iSourcer = pData->iSourcer; + mng_int32 iSourcet = pData->iSourcet; + mng_int32 iSourceb = pData->iSourceb; + mng_int8 iPass = pData->iPass; + mng_int32 iRow = pData->iRow; + mng_int32 iRowinc = pData->iRowinc; + mng_int32 iCol = pData->iCol; + mng_int32 iColinc = pData->iColinc; + mng_int32 iRowsamples = pData->iRowsamples; + mng_int32 iRowsize = pData->iRowsize; + mng_uint8p pPrevrow = pData->pPrevrow; + mng_uint8p pRGBArow = pData->pRGBArow; + mng_bool bIsRGBA16 = pData->bIsRGBA16; + mng_bool bIsOpaque = pData->bIsOpaque; + mng_fptr fCorrectrow = pData->fCorrectrow; + mng_fptr fDisplayrow = pData->fDisplayrow; + mng_fptr fRetrieverow = pData->fRetrieverow; + mng_objectp pCurrentobj = pData->pCurrentobj; + mng_objectp pRetrieveobj = pData->pRetrieveobj; + + pData->iDestl = 0; /* determine clipping region */ + pData->iDestt = 0; + pData->iDestr = pData->iWidth; + pData->iDestb = pData->iHeight; + +#ifndef MNG_SKIPCHUNK_FRAM + if (pData->bFrameclipping) /* frame clipping specified ? */ + { + pData->iDestl = MAX_COORD (pData->iDestl, pData->iFrameclipl); + pData->iDestt = MAX_COORD (pData->iDestt, pData->iFrameclipt); + pData->iDestr = MIN_COORD (pData->iDestr, pData->iFrameclipr); + pData->iDestb = MIN_COORD (pData->iDestb, pData->iFrameclipb); + } +#endif + /* anything to clear ? */ + if ((pData->iDestr >= pData->iDestl) && (pData->iDestb >= pData->iDestt)) + { + pData->iPass = -1; /* these are the object's dimensions now */ + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iWidth; + pData->iRowsize = pData->iRowsamples << 2; + pData->bIsRGBA16 = MNG_FALSE; /* let's keep it simple ! */ + pData->bIsOpaque = MNG_TRUE; + + pData->iSourcel = 0; /* source relative to destination */ + pData->iSourcer = pData->iDestr - pData->iDestl; + pData->iSourcet = 0; + pData->iSourceb = pData->iDestb - pData->iDestt; + + set_display_routine (pData); /* determine display routine */ + /* default restore using preset BG color */ + pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgcolor; + +#ifndef MNG_SKIPCHUNK_bKGD + if (((pData->eImagetype == mng_it_png) || (pData->eImagetype == mng_it_jng)) && + (pData->bUseBKGD)) + { /* prefer bKGD in PNG/JNG */ + if (!pData->pCurrentobj) + pData->pCurrentobj = pData->pObjzero; + + if (((mng_imagep)pData->pCurrentobj)->pImgbuf->bHasBKGD) + { + pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bkgd; + bColorcorr = MNG_TRUE; + } + } +#endif + + if (pData->fGetbkgdline) /* background-canvas-access callback set ? */ + { + switch (pData->iBkgdstyle) + { +#ifndef MNG_SKIPCANVAS_RGB8 + case MNG_CANVAS_RGB8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_rgb8; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGR8 + case MNG_CANVAS_BGR8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgr8; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGRX8 + case MNG_CANVAS_BGRX8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgrx8; break; } +#endif +#ifndef MNG_SKIPCANVAS_BGR565 + case MNG_CANVAS_BGR565 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgr565; break; } +#endif +#ifndef MNG_SKIPCANVAS_RGB565 + case MNG_CANVAS_RGB565 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_rgb565; break; } +#endif +#ifndef MNG_NO_16BIT_SUPPORT + /* case MNG_CANVAS_RGB16 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_rgb16; break; } */ + /* case MNG_CANVAS_BGR16 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgr16; break; } */ +#endif + /* case MNG_CANVAS_INDEX8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_index8; break; } */ + /* case MNG_CANVAS_GRAY8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_gray8; break; } */ +#ifndef MNG_NO_16BIT_SUPPORT + /* case MNG_CANVAS_GRAY16 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_gray16; break; } */ +#endif + /* case MNG_CANVAS_DX15 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_dx15; break; } */ + /* case MNG_CANVAS_DX16 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_dx16; break; } */ + } + } + +#ifndef MNG_SKIPCHUNK_BACK + if (pData->bHasBACK) + { /* background image ? */ + if ((pData->iBACKmandatory & 0x02) && (pData->iBACKimageid)) + { + pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_backcolor; + bColorcorr = MNG_TRUE; + } + else /* background color ? */ + if (pData->iBACKmandatory & 0x01) + { + pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_backcolor; + bColorcorr = MNG_TRUE; + } + } +#endif + + pData->fCorrectrow = MNG_NULL; /* default no color-correction */ + + if (bColorcorr) /* do we have to do color-correction ? */ + { +#ifdef MNG_NO_CMS + iRetcode = MNG_NOERROR; +#else +#if defined(MNG_FULL_CMS) /* determine color-management routine */ + iRetcode = mng_init_full_cms (pData, MNG_TRUE, MNG_FALSE, MNG_FALSE); +#elif defined(MNG_GAMMA_ONLY) + iRetcode = mng_init_gamma_only (pData, MNG_TRUE, MNG_FALSE, MNG_FALSE); +#elif defined(MNG_APP_CMS) + iRetcode = mng_init_app_cms (pData, MNG_TRUE, MNG_FALSE, MNG_FALSE); +#endif + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif /* MNG_NO_CMS */ + } + /* get a temporary row-buffer */ + MNG_ALLOC (pData, pData->pRGBArow, pData->iRowsize); + + iY = pData->iDestt; /* this is where we start */ + iRetcode = MNG_NOERROR; /* so far, so good */ + + while ((!iRetcode) && (iY < pData->iDestb)) + { /* restore a background row */ + iRetcode = ((mng_restbkgdrow)pData->fRestbkgdrow) (pData); + /* color correction ? */ + if ((!iRetcode) && (pData->fCorrectrow)) + iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData); + + if (!iRetcode) /* so... display it */ + iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData); + + if (!iRetcode) + iRetcode = mng_next_row (pData); + + iY++; /* and next line */ + } + /* drop the temporary row-buffer */ + MNG_FREE (pData, pData->pRGBArow, pData->iRowsize); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#if defined(MNG_FULL_CMS) /* cleanup cms stuff */ + if (bColorcorr) /* did we do color-correction ? */ + { + iRetcode = mng_clear_cms (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif +#ifndef MNG_SKIPCHUNK_BACK + /* background image ? */ + if ((pData->bHasBACK) && (pData->iBACKmandatory & 0x02) && (pData->iBACKimageid)) + { + mng_imagep pImage; + /* let's find that object then */ + pData->pRetrieveobj = mng_find_imageobject (pData, pData->iBACKimageid); + pImage = (mng_imagep)pData->pRetrieveobj; + /* exists, viewable and visible ? */ + if ((pImage) && (pImage->bViewable) && (pImage->bVisible)) + { /* will it fall within the target region ? */ + if ((pImage->iPosx < pData->iDestr) && (pImage->iPosy < pData->iDestb) && + ((pData->iBACKtile) || + ((pImage->iPosx + (mng_int32)pImage->pImgbuf->iWidth >= pData->iDestl) && + (pImage->iPosy + (mng_int32)pImage->pImgbuf->iHeight >= pData->iDestt) )) && + ((!pImage->bClipped) || + ((pImage->iClipl <= pImage->iClipr) && (pImage->iClipt <= pImage->iClipb) && + (pImage->iClipl < pData->iDestr) && (pImage->iClipr >= pData->iDestl) && + (pImage->iClipt < pData->iDestb) && (pImage->iClipb >= pData->iDestt) ))) + { /* right; we've got ourselves something to do */ + if (pImage->bClipped) /* clip output region with image's clipping region ? */ + { + if (pImage->iClipl > pData->iDestl) + pData->iDestl = pImage->iClipl; + if (pImage->iClipr < pData->iDestr) + pData->iDestr = pImage->iClipr; + if (pImage->iClipt > pData->iDestt) + pData->iDestt = pImage->iClipt; + if (pImage->iClipb < pData->iDestb) + pData->iDestb = pImage->iClipb; + } + /* image offset does some extra clipping too ! */ + if (pImage->iPosx > pData->iDestl) + pData->iDestl = pImage->iPosx; + if (pImage->iPosy > pData->iDestt) + pData->iDestt = pImage->iPosy; + + if (!pData->iBACKtile) /* without tiling further clipping is needed */ + { + if (pImage->iPosx + (mng_int32)pImage->pImgbuf->iWidth < pData->iDestr) + pData->iDestr = pImage->iPosx + (mng_int32)pImage->pImgbuf->iWidth; + if (pImage->iPosy + (mng_int32)pImage->pImgbuf->iHeight < pData->iDestb) + pData->iDestb = pImage->iPosy + (mng_int32)pImage->pImgbuf->iHeight; + } + + pData->iSourcel = 0; /* source relative to destination */ + pData->iSourcer = pData->iDestr - pData->iDestl; + pData->iSourcet = 0; + pData->iSourceb = pData->iDestb - pData->iDestt; + /* 16-bit background ? */ + +#ifdef MNG_NO_16BIT_SUPPORT + pData->bIsRGBA16 = MNG_FALSE; +#else + pData->bIsRGBA16 = (mng_bool)(pImage->pImgbuf->iBitdepth > 8); +#endif + /* let restore routine know the offsets !!! */ + pData->iBackimgoffsx = pImage->iPosx; + pData->iBackimgoffsy = pImage->iPosy; + pData->iBackimgwidth = pImage->pImgbuf->iWidth; + pData->iBackimgheight = pImage->pImgbuf->iHeight; + pData->iRow = 0; /* start at the top again !! */ + /* determine background object retrieval routine */ + switch (pImage->pImgbuf->iColortype) + { + case 0 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_g16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_g8; + + pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); + break; + } + + case 2 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb8; + + pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); + break; + } + + case 3 : { pData->fRetrieverow = (mng_fptr)mng_retrieve_idx8; + pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); + break; + } + + case 4 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + case 6 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + case 8 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_g16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_g8; + + pData->bIsOpaque = MNG_TRUE; + break; + } + + case 10 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb8; + + pData->bIsOpaque = MNG_TRUE; + break; + } + + case 12 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + case 14 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + } + +#ifdef MNG_NO_CMS + iRetcode = MNG_NOERROR; +#else +#if defined(MNG_FULL_CMS) /* determine color-management routine */ + iRetcode = mng_init_full_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#elif defined(MNG_GAMMA_ONLY) + iRetcode = mng_init_gamma_only (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#elif defined(MNG_APP_CMS) + iRetcode = mng_init_app_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#endif + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif /* MNG_NO_CMS */ + /* get temporary row-buffers */ + MNG_ALLOC (pData, pData->pPrevrow, pData->iRowsize); + MNG_ALLOC (pData, pData->pRGBArow, pData->iRowsize); + + iY = pData->iDestt; /* this is where we start */ + iRetcode = MNG_NOERROR; /* so far, so good */ + + while ((!iRetcode) && (iY < pData->iDestb)) + { /* restore a background row */ + iRetcode = mng_restore_bkgd_backimage (pData); + /* color correction ? */ + if ((!iRetcode) && (pData->fCorrectrow)) + iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData); + + if (!iRetcode) /* so... display it */ + iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData); + + if (!iRetcode) + iRetcode = mng_next_row (pData); + + iY++; /* and next line */ + } + /* drop temporary row-buffers */ + MNG_FREE (pData, pData->pRGBArow, pData->iRowsize); + MNG_FREE (pData, pData->pPrevrow, pData->iRowsize); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#if defined(MNG_FULL_CMS) /* cleanup cms stuff */ + iRetcode = mng_clear_cms (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif + } + } + } +#endif + } + + pData->iDestl = iDestl; /* restore values */ + pData->iDestr = iDestr; + pData->iDestt = iDestt; + pData->iDestb = iDestb; + pData->iSourcel = iSourcel; + pData->iSourcer = iSourcer; + pData->iSourcet = iSourcet; + pData->iSourceb = iSourceb; + pData->iPass = iPass; + pData->iRow = iRow; + pData->iRowinc = iRowinc; + pData->iCol = iCol; + pData->iColinc = iColinc; + pData->iRowsamples = iRowsamples; + pData->iRowsize = iRowsize; + pData->pPrevrow = pPrevrow; + pData->pRGBArow = pRGBArow; + pData->bIsRGBA16 = bIsRGBA16; + pData->bIsOpaque = bIsOpaque; + pData->fCorrectrow = fCorrectrow; + pData->fDisplayrow = fDisplayrow; + pData->fRetrieverow = fRetrieverow; + pData->pCurrentobj = pCurrentobj; + pData->pRetrieveobj = pRetrieveobj; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_LOAD_BKGDLAYER, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode clear_canvas (mng_datap pData) +{ + mng_int32 iY; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLEAR_CANVAS, MNG_LC_START); +#endif + + pData->iDestl = 0; /* clipping region is full canvas! */ + pData->iDestt = 0; + pData->iDestr = pData->iWidth; + pData->iDestb = pData->iHeight; + + pData->iSourcel = 0; /* source is same as destination */ + pData->iSourcer = pData->iWidth; + pData->iSourcet = 0; + pData->iSourceb = pData->iHeight; + + pData->iPass = -1; /* these are the object's dimensions now */ + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iWidth; + pData->iRowsize = pData->iRowsamples << 2; + pData->bIsRGBA16 = MNG_FALSE; /* let's keep it simple ! */ + pData->bIsOpaque = MNG_TRUE; + + set_display_routine (pData); /* determine display routine */ + /* get a temporary row-buffer */ + /* it's transparent black by default!! */ + MNG_ALLOC (pData, pData->pRGBArow, pData->iRowsize); + + iY = pData->iDestt; /* this is where we start */ + iRetcode = MNG_NOERROR; /* so far, so good */ + + while ((!iRetcode) && (iY < pData->iDestb)) + { /* clear a row then */ + iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData); + + if (!iRetcode) + iRetcode = mng_next_row (pData); /* adjust variables for next row */ + + iY++; /* and next line */ + } + /* drop the temporary row-buffer */ + MNG_FREE (pData, pData->pRGBArow, pData->iRowsize); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLEAR_CANVAS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode next_frame (mng_datap pData, + mng_uint8 iFramemode, + mng_uint8 iChangedelay, + mng_uint32 iDelay, + mng_uint8 iChangetimeout, + mng_uint32 iTimeout, + mng_uint8 iChangeclipping, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb) +{ + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_FRAME, MNG_LC_START); +#endif + + if (!pData->iBreakpoint) /* no previous break here ? */ + { +#ifndef MNG_SKIPCHUNK_FRAM + mng_uint8 iOldmode = pData->iFramemode; + /* interframe delay required ? */ + if ((iOldmode == 2) || (iOldmode == 4)) + { + if ((pData->iFrameseq) && (iFramemode != 1) && (iFramemode != 3)) + iRetcode = interframe_delay (pData); + else + pData->iFramedelay = pData->iNextdelay; + } + else + { /* delay before inserting background layer? */ + if ((pData->bFramedone) && (iFramemode == 4)) + iRetcode = interframe_delay (pData); + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* now we'll assume we're in the next frame! */ + if (iFramemode) /* save the new framing mode ? */ + { + pData->iFRAMmode = iFramemode; + pData->iFramemode = iFramemode; + } + else /* reload default */ + pData->iFramemode = pData->iFRAMmode; + + if (iChangedelay) /* delay changed ? */ + { + pData->iNextdelay = iDelay; /* for *after* next subframe */ + + if ((iOldmode == 2) || (iOldmode == 4)) + pData->iFramedelay = pData->iFRAMdelay; + + if (iChangedelay == 2) /* also overall ? */ + pData->iFRAMdelay = iDelay; + } + else + { /* reload default */ + pData->iNextdelay = pData->iFRAMdelay; + } + + if (iChangetimeout) /* timeout changed ? */ + { /* for next subframe */ + pData->iFrametimeout = iTimeout; + + if ((iChangetimeout == 2) || /* also overall ? */ + (iChangetimeout == 4) || + (iChangetimeout == 6) || + (iChangetimeout == 8)) + pData->iFRAMtimeout = iTimeout; + } + else /* reload default */ + pData->iFrametimeout = pData->iFRAMtimeout; + + if (iChangeclipping) /* clipping changed ? */ + { + pData->bFrameclipping = MNG_TRUE; + + if (!iCliptype) /* absolute ? */ + { + pData->iFrameclipl = iClipl; + pData->iFrameclipr = iClipr; + pData->iFrameclipt = iClipt; + pData->iFrameclipb = iClipb; + } + else /* relative */ + { + pData->iFrameclipl = pData->iFrameclipl + iClipl; + pData->iFrameclipr = pData->iFrameclipr + iClipr; + pData->iFrameclipt = pData->iFrameclipt + iClipt; + pData->iFrameclipb = pData->iFrameclipb + iClipb; + } + + if (iChangeclipping == 2) /* also overall ? */ + { + pData->bFRAMclipping = MNG_TRUE; + + if (!iCliptype) /* absolute ? */ + { + pData->iFRAMclipl = iClipl; + pData->iFRAMclipr = iClipr; + pData->iFRAMclipt = iClipt; + pData->iFRAMclipb = iClipb; + } + else /* relative */ + { + pData->iFRAMclipl = pData->iFRAMclipl + iClipl; + pData->iFRAMclipr = pData->iFRAMclipr + iClipr; + pData->iFRAMclipt = pData->iFRAMclipt + iClipt; + pData->iFRAMclipb = pData->iFRAMclipb + iClipb; + } + } + } + else + { /* reload defaults */ + pData->bFrameclipping = pData->bFRAMclipping; + pData->iFrameclipl = pData->iFRAMclipl; + pData->iFrameclipr = pData->iFRAMclipr; + pData->iFrameclipt = pData->iFRAMclipt; + pData->iFrameclipb = pData->iFRAMclipb; + } +#endif + } + + if (!pData->bTimerset) /* timer still off ? */ + { + if ( +#ifndef MNG_SKIPCHUNK_FRAM + (pData->iFramemode == 4) || /* insert background layer after a new frame */ +#endif + (!pData->iLayerseq)) /* and certainly before the very first layer */ + iRetcode = load_bkgdlayer (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pData->iFrameseq++; /* count the frame ! */ + pData->bFramedone = MNG_TRUE; /* and indicate we've done one */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_FRAME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode next_layer (mng_datap pData) +{ + mng_imagep pImage; + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_LAYER, MNG_LC_START); +#endif + +#ifndef MNG_SKIPCHUNK_FRAM + if (!pData->iBreakpoint) /* no previous break here ? */ + { /* interframe delay required ? */ + if ((pData->eImagetype == mng_it_mng) && (pData->iLayerseq) && + ((pData->iFramemode == 1) || (pData->iFramemode == 3))) + iRetcode = interframe_delay (pData); + else + pData->iFramedelay = pData->iNextdelay; + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif + + if (!pData->bTimerset) /* timer still off ? */ + { + if (!pData->iLayerseq) /* restore background for the very first layer ? */ + { /* wait till IDAT/JDAT for PNGs & JNGs !!! */ + if ((pData->eImagetype == mng_it_png) || (pData->eImagetype == mng_it_jng)) + pData->bRestorebkgd = MNG_TRUE; + else + { /* for MNG we do it right away */ + iRetcode = load_bkgdlayer (pData); + pData->iLayerseq++; /* and it counts as a layer then ! */ + } + } +#ifndef MNG_SKIPCHUNK_FRAM + else + if (pData->iFramemode == 3) /* restore background for each layer ? */ + iRetcode = load_bkgdlayer (pData); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* processing a delta-image ? */ + pImage = (mng_imagep)pData->pDeltaImage; + else +#endif + pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* not an active object ? */ + pImage = (mng_imagep)pData->pObjzero; + /* determine display rectangle */ + pData->iDestl = MAX_COORD ((mng_int32)0, pImage->iPosx); + pData->iDestt = MAX_COORD ((mng_int32)0, pImage->iPosy); + /* is it a valid buffer ? */ + if ((pImage->pImgbuf->iWidth) && (pImage->pImgbuf->iHeight)) + { + pData->iDestr = MIN_COORD ((mng_int32)pData->iWidth, + pImage->iPosx + (mng_int32)pImage->pImgbuf->iWidth ); + pData->iDestb = MIN_COORD ((mng_int32)pData->iHeight, + pImage->iPosy + (mng_int32)pImage->pImgbuf->iHeight); + } + else /* it's a single image ! */ + { + pData->iDestr = MIN_COORD ((mng_int32)pData->iWidth, + (mng_int32)pData->iDatawidth ); + pData->iDestb = MIN_COORD ((mng_int32)pData->iHeight, + (mng_int32)pData->iDataheight); + } + +#ifndef MNG_SKIPCHUNK_FRAM + if (pData->bFrameclipping) /* frame clipping specified ? */ + { + pData->iDestl = MAX_COORD (pData->iDestl, pData->iFrameclipl); + pData->iDestt = MAX_COORD (pData->iDestt, pData->iFrameclipt); + pData->iDestr = MIN_COORD (pData->iDestr, pData->iFrameclipr); + pData->iDestb = MIN_COORD (pData->iDestb, pData->iFrameclipb); + } +#endif + + if (pImage->bClipped) /* is the image clipped itself ? */ + { + pData->iDestl = MAX_COORD (pData->iDestl, pImage->iClipl); + pData->iDestt = MAX_COORD (pData->iDestt, pImage->iClipt); + pData->iDestr = MIN_COORD (pData->iDestr, pImage->iClipr); + pData->iDestb = MIN_COORD (pData->iDestb, pImage->iClipb); + } + /* determine source starting point */ + pData->iSourcel = MAX_COORD ((mng_int32)0, pData->iDestl - pImage->iPosx); + pData->iSourcet = MAX_COORD ((mng_int32)0, pData->iDestt - pImage->iPosy); + + if ((pImage->pImgbuf->iWidth) && (pImage->pImgbuf->iHeight)) + { /* and maximum size */ + pData->iSourcer = MIN_COORD ((mng_int32)pImage->pImgbuf->iWidth, + pData->iSourcel + pData->iDestr - pData->iDestl); + pData->iSourceb = MIN_COORD ((mng_int32)pImage->pImgbuf->iHeight, + pData->iSourcet + pData->iDestb - pData->iDestt); + } + else /* it's a single image ! */ + { + pData->iSourcer = pData->iSourcel + pData->iDestr - pData->iDestl; + pData->iSourceb = pData->iSourcet + pData->iDestb - pData->iDestt; + } + + pData->iLayerseq++; /* count the layer ! */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_LAYER, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_display_image (mng_datap pData, + mng_imagep pImage, + mng_bool bLayeradvanced) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_IMAGE, MNG_LC_START); +#endif + /* actively running ? */ +#ifndef MNG_SKIPCHUNK_MAGN + if (((pData->bRunning) || (pData->bSearching)) && (!pData->bSkipping)) + { + if ( (!pData->iBreakpoint) && /* needs magnification ? */ + ( (pImage->iMAGN_MethodX) || (pImage->iMAGN_MethodY) ) ) + { + iRetcode = mng_magnify_imageobject (pData, pImage); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } +#endif + + pData->pRetrieveobj = pImage; /* so retrieve-row and color-correction can find it */ + + if (!bLayeradvanced) /* need to advance the layer ? */ + { + mng_imagep pSave = pData->pCurrentobj; + pData->pCurrentobj = pImage; + next_layer (pData); /* advance to next layer */ + pData->pCurrentobj = pSave; + } + /* need to restore the background ? */ + if ((!pData->bTimerset) && (pData->bRestorebkgd)) + { + mng_imagep pSave = pData->pCurrentobj; + pData->pCurrentobj = pImage; + pData->bRestorebkgd = MNG_FALSE; + iRetcode = load_bkgdlayer (pData); + pData->pCurrentobj = pSave; + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pData->iLayerseq++; /* and it counts as a layer then ! */ + } + /* actively running ? */ + if (((pData->bRunning) || (pData->bSearching)) && (!pData->bSkipping)) + { + if (!pData->bTimerset) /* all systems still go ? */ + { + pData->iBreakpoint = 0; /* let's make absolutely sure... */ + /* anything to display ? */ + if ((pData->iDestr >= pData->iDestl) && (pData->iDestb >= pData->iDestt)) + { + mng_int32 iY; + + set_display_routine (pData); /* determine display routine */ + /* and image-buffer retrieval routine */ + switch (pImage->pImgbuf->iColortype) + { + case 0 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_g16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_g8; + + pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); + break; + } + + case 2 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb8; + + pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); + break; + } + + + case 3 : { pData->fRetrieverow = (mng_fptr)mng_retrieve_idx8; + pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); + break; + } + + + case 4 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + + case 6 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + case 8 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_g16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_g8; + + pData->bIsOpaque = MNG_TRUE; + break; + } + + case 10 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb8; + + pData->bIsOpaque = MNG_TRUE; + break; + } + + + case 12 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + + case 14 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + } + + pData->iPass = -1; /* these are the object's dimensions now */ + pData->iRow = pData->iSourcet; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pImage->pImgbuf->iWidth; + pData->iRowsize = pData->iRowsamples << 2; + pData->bIsRGBA16 = MNG_FALSE; + /* adjust for 16-bit object ? */ +#ifndef MNG_NO_16BIT_SUPPORT + if (pImage->pImgbuf->iBitdepth > 8) + { + pData->bIsRGBA16 = MNG_TRUE; + pData->iRowsize = pData->iRowsamples << 3; + } +#endif + + pData->fCorrectrow = MNG_NULL; /* default no color-correction */ + +#ifdef MNG_NO_CMS + iRetcode = MNG_NOERROR; +#else +#if defined(MNG_FULL_CMS) /* determine color-management routine */ + iRetcode = mng_init_full_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#elif defined(MNG_GAMMA_ONLY) + iRetcode = mng_init_gamma_only (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#elif defined(MNG_APP_CMS) + iRetcode = mng_init_app_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#endif + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif /* MNG_NO_CMS */ + /* get a temporary row-buffer */ + MNG_ALLOC (pData, pData->pRGBArow, pData->iRowsize); + + iY = pData->iSourcet; /* this is where we start */ + + while ((!iRetcode) && (iY < pData->iSourceb)) + { /* get a row */ + iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData); + /* color correction ? */ + if ((!iRetcode) && (pData->fCorrectrow)) + iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData); + + if (!iRetcode) /* so... display it */ + iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData); + + if (!iRetcode) /* adjust variables for next row */ + iRetcode = mng_next_row (pData); + + iY++; /* and next line */ + } + /* drop the temporary row-buffer */ + MNG_FREE (pData, pData->pRGBArow, pData->iRowsize); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#if defined(MNG_FULL_CMS) /* cleanup cms stuff */ + iRetcode = mng_clear_cms (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif + } + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_IMAGE, MNG_LC_END); +#endif + + return MNG_NOERROR; /* whehehe, this is good ! */ +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_execute_delta_image (mng_datap pData, + mng_imagep pTarget, + mng_imagep pDelta) +{ + mng_imagedatap pBuftarget = pTarget->pImgbuf; + mng_imagedatap pBufdelta = pDelta->pImgbuf; + mng_uint32 iY; + mng_retcode iRetcode; + mng_ptr pSaveRGBA; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_EXECUTE_DELTA_IMAGE, MNG_LC_START); +#endif + /* actively running ? */ + if (((pData->bRunning) || (pData->bSearching)) && (!pData->bSkipping)) + { + if (pBufdelta->bHasPLTE) /* palette in delta ? */ + { + mng_uint32 iX; + /* new palette larger than old one ? */ + if ((!pBuftarget->bHasPLTE) || (pBuftarget->iPLTEcount < pBufdelta->iPLTEcount)) + pBuftarget->iPLTEcount = pBufdelta->iPLTEcount; + /* it's definitely got a PLTE now */ + pBuftarget->bHasPLTE = MNG_TRUE; + + for (iX = 0; iX < pBufdelta->iPLTEcount; iX++) + { + pBuftarget->aPLTEentries[iX].iRed = pBufdelta->aPLTEentries[iX].iRed; + pBuftarget->aPLTEentries[iX].iGreen = pBufdelta->aPLTEentries[iX].iGreen; + pBuftarget->aPLTEentries[iX].iBlue = pBufdelta->aPLTEentries[iX].iBlue; + } + } + + if (pBufdelta->bHasTRNS) /* cheap transparency in delta ? */ + { + switch (pData->iColortype) /* drop it into the target */ + { + case 0: { /* gray */ + pBuftarget->iTRNSgray = pBufdelta->iTRNSgray; + pBuftarget->iTRNSred = 0; + pBuftarget->iTRNSgreen = 0; + pBuftarget->iTRNSblue = 0; + pBuftarget->iTRNScount = 0; + break; + } + case 2: { /* rgb */ + pBuftarget->iTRNSgray = 0; + pBuftarget->iTRNSred = pBufdelta->iTRNSred; + pBuftarget->iTRNSgreen = pBufdelta->iTRNSgreen; + pBuftarget->iTRNSblue = pBufdelta->iTRNSblue; + pBuftarget->iTRNScount = 0; + break; + } + case 3: { /* indexed */ + pBuftarget->iTRNSgray = 0; + pBuftarget->iTRNSred = 0; + pBuftarget->iTRNSgreen = 0; + pBuftarget->iTRNSblue = 0; + /* existing range smaller than new one ? */ + if ((!pBuftarget->bHasTRNS) || (pBuftarget->iTRNScount < pBufdelta->iTRNScount)) + pBuftarget->iTRNScount = pBufdelta->iTRNScount; + + MNG_COPY (pBuftarget->aTRNSentries, pBufdelta->aTRNSentries, pBufdelta->iTRNScount); + break; + } + } + + pBuftarget->bHasTRNS = MNG_TRUE; /* tell it it's got a tRNS now */ + } + +#ifndef MNG_SKIPCHUNK_bKGD + if (pBufdelta->bHasBKGD) /* bkgd in source ? */ + { /* drop it onto the target */ + pBuftarget->bHasBKGD = MNG_TRUE; + pBuftarget->iBKGDindex = pBufdelta->iBKGDindex; + pBuftarget->iBKGDgray = pBufdelta->iBKGDgray; + pBuftarget->iBKGDred = pBufdelta->iBKGDred; + pBuftarget->iBKGDgreen = pBufdelta->iBKGDgreen; + pBuftarget->iBKGDblue = pBufdelta->iBKGDblue; + } +#endif + + if (pBufdelta->bHasGAMA) /* gamma in source ? */ + { + pBuftarget->bHasGAMA = MNG_TRUE; /* drop it onto the target */ + pBuftarget->iGamma = pBufdelta->iGamma; + } + +#ifndef MNG_SKIPCHUNK_cHRM + if (pBufdelta->bHasCHRM) /* chroma in delta ? */ + { /* drop it onto the target */ + pBuftarget->bHasCHRM = MNG_TRUE; + pBuftarget->iWhitepointx = pBufdelta->iWhitepointx; + pBuftarget->iWhitepointy = pBufdelta->iWhitepointy; + pBuftarget->iPrimaryredx = pBufdelta->iPrimaryredx; + pBuftarget->iPrimaryredy = pBufdelta->iPrimaryredy; + pBuftarget->iPrimarygreenx = pBufdelta->iPrimarygreenx; + pBuftarget->iPrimarygreeny = pBufdelta->iPrimarygreeny; + pBuftarget->iPrimarybluex = pBufdelta->iPrimarybluex; + pBuftarget->iPrimarybluey = pBufdelta->iPrimarybluey; + } +#endif + +#ifndef MNG_SKIPCHUNK_sRGB + if (pBufdelta->bHasSRGB) /* sRGB in delta ? */ + { /* drop it onto the target */ + pBuftarget->bHasSRGB = MNG_TRUE; + pBuftarget->iRenderingintent = pBufdelta->iRenderingintent; + } +#endif + +#ifndef MNG_SKIPCHUNK_iCCP + if (pBufdelta->bHasICCP) /* ICC profile in delta ? */ + { + pBuftarget->bHasICCP = MNG_TRUE; /* drop it onto the target */ + + if (pBuftarget->pProfile) /* profile existed ? */ + MNG_FREEX (pData, pBuftarget->pProfile, pBuftarget->iProfilesize); + /* allocate a buffer & copy it */ + MNG_ALLOC (pData, pBuftarget->pProfile, pBufdelta->iProfilesize); + MNG_COPY (pBuftarget->pProfile, pBufdelta->pProfile, pBufdelta->iProfilesize); + /* store its length as well */ + pBuftarget->iProfilesize = pBufdelta->iProfilesize; + } +#endif + /* need to execute delta pixels ? */ + if ((!pData->bDeltaimmediate) && (pData->iDeltatype != MNG_DELTATYPE_NOCHANGE)) + { + pData->fScalerow = MNG_NULL; /* not needed by default */ + + switch (pBufdelta->iBitdepth) /* determine scaling routine */ + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + switch (pBuftarget->iBitdepth) + { + case 2 : { pData->fScalerow = (mng_fptr)mng_scale_g1_g2; break; } + case 4 : { pData->fScalerow = (mng_fptr)mng_scale_g1_g4; break; } + + case 8 : { pData->fScalerow = (mng_fptr)mng_scale_g1_g8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fScalerow = (mng_fptr)mng_scale_g1_g16; break; } +#endif + } + break; + } + + case 2 : { + switch (pBuftarget->iBitdepth) + { + case 1 : { pData->fScalerow = (mng_fptr)mng_scale_g2_g1; break; } + case 4 : { pData->fScalerow = (mng_fptr)mng_scale_g2_g4; break; } + case 8 : { pData->fScalerow = (mng_fptr)mng_scale_g2_g8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fScalerow = (mng_fptr)mng_scale_g2_g16; break; } +#endif + } + break; + } + + case 4 : { + switch (pBuftarget->iBitdepth) + { + case 1 : { pData->fScalerow = (mng_fptr)mng_scale_g4_g1; break; } + case 2 : { pData->fScalerow = (mng_fptr)mng_scale_g4_g2; break; } + case 8 : { pData->fScalerow = (mng_fptr)mng_scale_g4_g8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fScalerow = (mng_fptr)mng_scale_g4_g16; break; } +#endif + } + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + + case 8 : { + switch (pBufdelta->iColortype) + { + case 0 : ; + case 3 : ; + case 8 : { + switch (pBuftarget->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { pData->fScalerow = (mng_fptr)mng_scale_g8_g1; break; } + case 2 : { pData->fScalerow = (mng_fptr)mng_scale_g8_g2; break; } + case 4 : { pData->fScalerow = (mng_fptr)mng_scale_g8_g4; break; } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fScalerow = (mng_fptr)mng_scale_g8_g16; break; } +#endif + } + break; + } + case 2 : ; + case 10 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuftarget->iBitdepth == 16) + pData->fScalerow = (mng_fptr)mng_scale_rgb8_rgb16; +#endif + break; + } + case 4 : ; + case 12 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuftarget->iBitdepth == 16) + pData->fScalerow = (mng_fptr)mng_scale_ga8_ga16; +#endif + break; + } + case 6 : ; + case 14 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuftarget->iBitdepth == 16) + pData->fScalerow = (mng_fptr)mng_scale_rgba8_rgba16; +#endif + break; + } + } + break; + } + +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + switch (pBufdelta->iColortype) + { + case 0 : ; + case 3 : ; + case 8 : { + switch (pBuftarget->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { pData->fScalerow = (mng_fptr)mng_scale_g16_g1; break; } + case 2 : { pData->fScalerow = (mng_fptr)mng_scale_g16_g2; break; } + case 4 : { pData->fScalerow = (mng_fptr)mng_scale_g16_g4; break; } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { pData->fScalerow = (mng_fptr)mng_scale_g16_g8; break; } + } + break; + } + case 2 : ; + case 10 : { + if (pBuftarget->iBitdepth == 8) + pData->fScalerow = (mng_fptr)mng_scale_rgb16_rgb8; + break; + } + case 4 : ; + case 12 : { + if (pBuftarget->iBitdepth == 8) + pData->fScalerow = (mng_fptr)mng_scale_ga16_ga8; + break; + } + case 6 : ; + case 14 : { + if (pBuftarget->iBitdepth == 8) + pData->fScalerow = (mng_fptr)mng_scale_rgba16_rgba8; + break; + } + } + break; + } +#endif + + } + + pData->fDeltarow = MNG_NULL; /* let's assume there's nothing to do */ + + switch (pBuftarget->iColortype) /* determine delta processing routine */ + { + case 0 : ; + case 8 : { /* gray */ + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + if ((pBufdelta->iColortype == 0) || (pBufdelta->iColortype == 3) || + (pBufdelta->iColortype == 8)) + { + switch (pBuftarget->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { pData->fDeltarow = (mng_fptr)mng_delta_g1_g1; break; } + case 2 : { pData->fDeltarow = (mng_fptr)mng_delta_g2_g2; break; } + case 4 : { pData->fDeltarow = (mng_fptr)mng_delta_g4_g4; break; } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_g8_g8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fDeltarow = (mng_fptr)mng_delta_g16_g16; break; } +#endif + } + } + } + + break; + } + + case 2 : ; + case 10 : { /* rgb */ + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + if ((pBufdelta->iColortype == 2) || (pBufdelta->iColortype == 10)) + { + switch (pBuftarget->iBitdepth) + { + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_rgb8_rgb8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fDeltarow = (mng_fptr)mng_delta_rgb16_rgb16; break; } +#endif + } + } + } + + break; + } + + case 3 : { /* indexed; abuse gray routines */ + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + if ((pBufdelta->iColortype == 0) || (pBufdelta->iColortype == 3)) + { + switch (pBuftarget->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { pData->fDeltarow = (mng_fptr)mng_delta_g1_g1; break; } + case 2 : { pData->fDeltarow = (mng_fptr)mng_delta_g2_g2; break; } + case 4 : { pData->fDeltarow = (mng_fptr)mng_delta_g4_g4; break; } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_g8_g8; break; } + } + } + } + + break; + } + + case 4 : ; + case 12 : { /* gray + alpha */ + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + if ((pBufdelta->iColortype == 4) || (pBufdelta->iColortype == 12)) + { + switch (pBuftarget->iBitdepth) + { + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_ga8_ga8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fDeltarow = (mng_fptr)mng_delta_ga16_ga16; break; } +#endif + } + } + } + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) ) + { + if ((pBufdelta->iColortype == 0) || (pBufdelta->iColortype == 3) || + (pBufdelta->iColortype == 8)) + { + switch (pBuftarget->iBitdepth) + { + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_ga8_g8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fDeltarow = (mng_fptr)mng_delta_ga16_g16; break; } +#endif + } + } + } + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) ) + { + if ((pBufdelta->iColortype == 0) || (pBufdelta->iColortype == 3)) + { + switch (pBuftarget->iBitdepth) + { + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_ga8_a8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fDeltarow = (mng_fptr)mng_delta_ga16_a16; break; } +#endif + } + } + } + + break; + } + + case 6 : ; + case 14 : { /* rgb + alpha */ + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + if ((pBufdelta->iColortype == 6) || (pBufdelta->iColortype == 14)) + { + switch (pBuftarget->iBitdepth) + { + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_rgba8_rgba8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fDeltarow = (mng_fptr)mng_delta_rgba16_rgba16; break; } +#endif + } + } + } + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) ) + { + if ((pBufdelta->iColortype == 2) || (pBufdelta->iColortype == 10)) + { + switch (pBuftarget->iBitdepth) + { + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_rgba8_rgb8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fDeltarow = (mng_fptr)mng_delta_rgba16_rgb16; break; } +#endif + } + } + } + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) ) + { + if ((pBufdelta->iColortype == 0) || (pBufdelta->iColortype == 3)) + { + switch (pBuftarget->iBitdepth) + { + case 8 : { pData->fDeltarow = (mng_fptr)mng_delta_rgba8_a8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fDeltarow = (mng_fptr)mng_delta_rgba16_a16; break; } +#endif + } + } + } + + break; + } + + } + + if (pData->fDeltarow) /* do we need to take action ? */ + { + pData->iPass = -1; /* setup row dimensions and stuff */ + pData->iRow = pData->iDeltaBlocky; + pData->iRowinc = 1; + pData->iCol = pData->iDeltaBlockx; + pData->iColinc = 1; + pData->iRowsamples = pBufdelta->iWidth; + pData->iRowsize = pBuftarget->iRowsize; + /* indicate where to retrieve & where to store */ + pData->pRetrieveobj = (mng_objectp)pDelta; + pData->pStoreobj = (mng_objectp)pTarget; + + pSaveRGBA = pData->pRGBArow; /* save current temp-buffer! */ + /* get a temporary row-buffer */ + MNG_ALLOC (pData, pData->pRGBArow, (pBufdelta->iRowsize << 1)); + + iY = 0; /* this is where we start */ + iRetcode = MNG_NOERROR; /* still oke for now */ + + while ((!iRetcode) && (iY < pBufdelta->iHeight)) + { /* get a row */ + mng_uint8p pWork = pBufdelta->pImgdata + (iY * pBufdelta->iRowsize); + + MNG_COPY (pData->pRGBArow, pWork, pBufdelta->iRowsize); + + if (pData->fScalerow) /* scale it (if necessary) */ + iRetcode = ((mng_scalerow)pData->fScalerow) (pData); + + if (!iRetcode) /* and... execute it */ + iRetcode = ((mng_deltarow)pData->fDeltarow) (pData); + + if (!iRetcode) /* adjust variables for next row */ + iRetcode = mng_next_row (pData); + + iY++; /* and next line */ + } + /* drop the temporary row-buffer */ + MNG_FREE (pData, pData->pRGBArow, (pBufdelta->iRowsize << 1)); + pData->pRGBArow = pSaveRGBA; /* restore saved temp-buffer! */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } + else + MNG_ERROR (pData, MNG_INVALIDDELTA); + + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_EXECUTE_DELTA_IMAGE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +MNG_LOCAL mng_retcode save_state (mng_datap pData) +{ + mng_savedatap pSave; + mng_imagep pImage; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SAVE_STATE, MNG_LC_START); +#endif + + if (pData->pSavedata) /* sanity check */ + MNG_ERROR (pData, MNG_INTERNALERROR); + /* get a buffer for saving */ + MNG_ALLOC (pData, pData->pSavedata, sizeof (mng_savedata)); + + pSave = pData->pSavedata; /* address it more directly */ + /* and copy global data from the main struct */ +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) + pSave->bHasglobalPLTE = pData->bHasglobalPLTE; + pSave->bHasglobalTRNS = pData->bHasglobalTRNS; + pSave->bHasglobalGAMA = pData->bHasglobalGAMA; + pSave->bHasglobalCHRM = pData->bHasglobalCHRM; + pSave->bHasglobalSRGB = pData->bHasglobalSRGB; + pSave->bHasglobalICCP = pData->bHasglobalICCP; + pSave->bHasglobalBKGD = pData->bHasglobalBKGD; +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +#ifndef MNG_SKIPCHUNK_BACK + pSave->iBACKred = pData->iBACKred; + pSave->iBACKgreen = pData->iBACKgreen; + pSave->iBACKblue = pData->iBACKblue; + pSave->iBACKmandatory = pData->iBACKmandatory; + pSave->iBACKimageid = pData->iBACKimageid; + pSave->iBACKtile = pData->iBACKtile; +#endif + +#ifndef MNG_SKIPCHUNK_FRAM + pSave->iFRAMmode = pData->iFRAMmode; + pSave->iFRAMdelay = pData->iFRAMdelay; + pSave->iFRAMtimeout = pData->iFRAMtimeout; + pSave->bFRAMclipping = pData->bFRAMclipping; + pSave->iFRAMclipl = pData->iFRAMclipl; + pSave->iFRAMclipr = pData->iFRAMclipr; + pSave->iFRAMclipt = pData->iFRAMclipt; + pSave->iFRAMclipb = pData->iFRAMclipb; +#endif + + pSave->iGlobalPLTEcount = pData->iGlobalPLTEcount; + + MNG_COPY (pSave->aGlobalPLTEentries, pData->aGlobalPLTEentries, sizeof (mng_rgbpaltab)); + + pSave->iGlobalTRNSrawlen = pData->iGlobalTRNSrawlen; + MNG_COPY (pSave->aGlobalTRNSrawdata, pData->aGlobalTRNSrawdata, 256); + + pSave->iGlobalGamma = pData->iGlobalGamma; + +#ifndef MNG_SKIPCHUNK_cHRM + pSave->iGlobalWhitepointx = pData->iGlobalWhitepointx; + pSave->iGlobalWhitepointy = pData->iGlobalWhitepointy; + pSave->iGlobalPrimaryredx = pData->iGlobalPrimaryredx; + pSave->iGlobalPrimaryredy = pData->iGlobalPrimaryredy; + pSave->iGlobalPrimarygreenx = pData->iGlobalPrimarygreenx; + pSave->iGlobalPrimarygreeny = pData->iGlobalPrimarygreeny; + pSave->iGlobalPrimarybluex = pData->iGlobalPrimarybluex; + pSave->iGlobalPrimarybluey = pData->iGlobalPrimarybluey; +#endif + +#ifndef MNG_SKIPCHUNK_sRGB + pSave->iGlobalRendintent = pData->iGlobalRendintent; +#endif + +#ifndef MNG_SKIPCHUNK_iCCP + pSave->iGlobalProfilesize = pData->iGlobalProfilesize; + + if (pSave->iGlobalProfilesize) /* has a profile ? */ + { /* then copy that ! */ + MNG_ALLOC (pData, pSave->pGlobalProfile, pSave->iGlobalProfilesize); + MNG_COPY (pSave->pGlobalProfile, pData->pGlobalProfile, pSave->iGlobalProfilesize); + } +#endif + +#ifndef MNG_SKIPCHUNK_bKGD + pSave->iGlobalBKGDred = pData->iGlobalBKGDred; + pSave->iGlobalBKGDgreen = pData->iGlobalBKGDgreen; + pSave->iGlobalBKGDblue = pData->iGlobalBKGDblue; +#endif + + /* freeze current image objects */ + pImage = (mng_imagep)pData->pFirstimgobj; + + while (pImage) + { /* freeze the object AND its buffer */ + pImage->bFrozen = MNG_TRUE; + pImage->pImgbuf->bFrozen = MNG_TRUE; + /* neeeext */ + pImage = (mng_imagep)pImage->sHeader.pNext; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SAVE_STATE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_reset_objzero (mng_datap pData) +{ + mng_imagep pImage = (mng_imagep)pData->pObjzero; + mng_retcode iRetcode = mng_reset_object_details (pData, pImage, 0, 0, 0, + 0, 0, 0, 0, MNG_TRUE); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pImage->bVisible = MNG_TRUE; + pImage->bViewable = MNG_TRUE; + pImage->iPosx = 0; + pImage->iPosy = 0; + pImage->bClipped = MNG_FALSE; + pImage->iClipl = 0; + pImage->iClipr = 0; + pImage->iClipt = 0; + pImage->iClipb = 0; +#ifndef MNG_SKIPCHUNK_MAGN + pImage->iMAGN_MethodX = 0; + pImage->iMAGN_MethodY = 0; + pImage->iMAGN_MX = 0; + pImage->iMAGN_MY = 0; + pImage->iMAGN_ML = 0; + pImage->iMAGN_MR = 0; + pImage->iMAGN_MT = 0; + pImage->iMAGN_MB = 0; +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode restore_state (mng_datap pData) +{ +#ifndef MNG_SKIPCHUNK_SAVE + mng_savedatap pSave; +#endif + mng_imagep pImage; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_STATE, MNG_LC_START); +#endif + /* restore object 0 status !!! */ + iRetcode = mng_reset_objzero (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* fresh cycle; fake no frames done yet */ + pData->bFramedone = MNG_FALSE; + +#ifndef MNG_SKIPCHUNK_SAVE + if (pData->pSavedata) /* do we have a saved state ? */ + { + pSave = pData->pSavedata; /* address it more directly */ + /* and copy it back to the main struct */ +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) + pData->bHasglobalPLTE = pSave->bHasglobalPLTE; + pData->bHasglobalTRNS = pSave->bHasglobalTRNS; + pData->bHasglobalGAMA = pSave->bHasglobalGAMA; + pData->bHasglobalCHRM = pSave->bHasglobalCHRM; + pData->bHasglobalSRGB = pSave->bHasglobalSRGB; + pData->bHasglobalICCP = pSave->bHasglobalICCP; + pData->bHasglobalBKGD = pSave->bHasglobalBKGD; +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +#ifndef MNG_SKIPCHUNK_BACK + pData->iBACKred = pSave->iBACKred; + pData->iBACKgreen = pSave->iBACKgreen; + pData->iBACKblue = pSave->iBACKblue; + pData->iBACKmandatory = pSave->iBACKmandatory; + pData->iBACKimageid = pSave->iBACKimageid; + pData->iBACKtile = pSave->iBACKtile; +#endif + +#ifndef MNG_SKIPCHUNK_FRAM + pData->iFRAMmode = pSave->iFRAMmode; +/* pData->iFRAMdelay = pSave->iFRAMdelay; */ + pData->iFRAMtimeout = pSave->iFRAMtimeout; + pData->bFRAMclipping = pSave->bFRAMclipping; + pData->iFRAMclipl = pSave->iFRAMclipl; + pData->iFRAMclipr = pSave->iFRAMclipr; + pData->iFRAMclipt = pSave->iFRAMclipt; + pData->iFRAMclipb = pSave->iFRAMclipb; + /* NOOOOOOOOOOOO */ +/* pData->iFramemode = pSave->iFRAMmode; + pData->iFramedelay = pSave->iFRAMdelay; + pData->iFrametimeout = pSave->iFRAMtimeout; + pData->bFrameclipping = pSave->bFRAMclipping; + pData->iFrameclipl = pSave->iFRAMclipl; + pData->iFrameclipr = pSave->iFRAMclipr; + pData->iFrameclipt = pSave->iFRAMclipt; + pData->iFrameclipb = pSave->iFRAMclipb; */ + +/* pData->iNextdelay = pSave->iFRAMdelay; */ + pData->iNextdelay = pData->iFramedelay; +#endif + + pData->iGlobalPLTEcount = pSave->iGlobalPLTEcount; + MNG_COPY (pData->aGlobalPLTEentries, pSave->aGlobalPLTEentries, sizeof (mng_rgbpaltab)); + + pData->iGlobalTRNSrawlen = pSave->iGlobalTRNSrawlen; + MNG_COPY (pData->aGlobalTRNSrawdata, pSave->aGlobalTRNSrawdata, 256); + + pData->iGlobalGamma = pSave->iGlobalGamma; + +#ifndef MNG_SKIPCHUNK_cHRM + pData->iGlobalWhitepointx = pSave->iGlobalWhitepointx; + pData->iGlobalWhitepointy = pSave->iGlobalWhitepointy; + pData->iGlobalPrimaryredx = pSave->iGlobalPrimaryredx; + pData->iGlobalPrimaryredy = pSave->iGlobalPrimaryredy; + pData->iGlobalPrimarygreenx = pSave->iGlobalPrimarygreenx; + pData->iGlobalPrimarygreeny = pSave->iGlobalPrimarygreeny; + pData->iGlobalPrimarybluex = pSave->iGlobalPrimarybluex; + pData->iGlobalPrimarybluey = pSave->iGlobalPrimarybluey; +#endif + + pData->iGlobalRendintent = pSave->iGlobalRendintent; + +#ifndef MNG_SKIPCHUNK_iCCP + pData->iGlobalProfilesize = pSave->iGlobalProfilesize; + + if (pData->iGlobalProfilesize) /* has a profile ? */ + { /* then copy that ! */ + MNG_ALLOC (pData, pData->pGlobalProfile, pData->iGlobalProfilesize); + MNG_COPY (pData->pGlobalProfile, pSave->pGlobalProfile, pData->iGlobalProfilesize); + } +#endif + +#ifndef MNG_SKIPCHUNK_bKGD + pData->iGlobalBKGDred = pSave->iGlobalBKGDred; + pData->iGlobalBKGDgreen = pSave->iGlobalBKGDgreen; + pData->iGlobalBKGDblue = pSave->iGlobalBKGDblue; +#endif + } + else /* no saved-data; so reset the lot */ +#endif /* SKIPCHUNK_SAVE */ + { +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) + pData->bHasglobalPLTE = MNG_FALSE; + pData->bHasglobalTRNS = MNG_FALSE; + pData->bHasglobalGAMA = MNG_FALSE; + pData->bHasglobalCHRM = MNG_FALSE; + pData->bHasglobalSRGB = MNG_FALSE; + pData->bHasglobalICCP = MNG_FALSE; + pData->bHasglobalBKGD = MNG_FALSE; +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +#ifndef MNG_SKIPCHUNK_TERM + if (!pData->bMisplacedTERM) /* backward compatible ugliness !!! */ + { + pData->iBACKred = 0; + pData->iBACKgreen = 0; + pData->iBACKblue = 0; + pData->iBACKmandatory = 0; + pData->iBACKimageid = 0; + pData->iBACKtile = 0; + } +#endif + +#ifndef MNG_SKIPCHUNK_FRAM + pData->iFRAMmode = 1; +/* pData->iFRAMdelay = 1; */ + pData->iFRAMtimeout = 0x7fffffffl; + pData->bFRAMclipping = MNG_FALSE; + pData->iFRAMclipl = 0; + pData->iFRAMclipr = 0; + pData->iFRAMclipt = 0; + pData->iFRAMclipb = 0; + /* NOOOOOOOOOOOO */ +/* pData->iFramemode = 1; + pData->iFramedelay = 1; + pData->iFrametimeout = 0x7fffffffl; + pData->bFrameclipping = MNG_FALSE; + pData->iFrameclipl = 0; + pData->iFrameclipr = 0; + pData->iFrameclipt = 0; + pData->iFrameclipb = 0; */ + +/* pData->iNextdelay = 1; */ + pData->iNextdelay = pData->iFramedelay; +#endif + + pData->iGlobalPLTEcount = 0; + + pData->iGlobalTRNSrawlen = 0; + + pData->iGlobalGamma = 0; + +#ifndef MNG_SKIPCHUNK_cHRM + pData->iGlobalWhitepointx = 0; + pData->iGlobalWhitepointy = 0; + pData->iGlobalPrimaryredx = 0; + pData->iGlobalPrimaryredy = 0; + pData->iGlobalPrimarygreenx = 0; + pData->iGlobalPrimarygreeny = 0; + pData->iGlobalPrimarybluex = 0; + pData->iGlobalPrimarybluey = 0; +#endif + + pData->iGlobalRendintent = 0; + +#ifndef MNG_SKIPCHUNK_iCCP + if (pData->iGlobalProfilesize) /* free a previous profile ? */ + MNG_FREE (pData, pData->pGlobalProfile, pData->iGlobalProfilesize); + + pData->iGlobalProfilesize = 0; +#endif + +#ifndef MNG_SKIPCHUNK_bKGD + pData->iGlobalBKGDred = 0; + pData->iGlobalBKGDgreen = 0; + pData->iGlobalBKGDblue = 0; +#endif + } + +#ifndef MNG_SKIPCHUNK_TERM + if (!pData->bMisplacedTERM) /* backward compatible ugliness !!! */ + { + pImage = (mng_imagep)pData->pFirstimgobj; + /* drop un-frozen image objects */ + while (pImage) + { + mng_imagep pNext = (mng_imagep)pImage->sHeader.pNext; + + if (!pImage->bFrozen) /* is it un-frozen ? */ + { + mng_imagep pPrev = (mng_imagep)pImage->sHeader.pPrev; + + if (pPrev) /* unlink it */ + pPrev->sHeader.pNext = pNext; + else + pData->pFirstimgobj = pNext; + + if (pNext) + pNext->sHeader.pPrev = pPrev; + else + pData->pLastimgobj = pPrev; + + if (pImage->pImgbuf->bFrozen) /* buffer frozen ? */ + { + if (pImage->pImgbuf->iRefcount < 2) + MNG_ERROR (pData, MNG_INTERNALERROR); + /* decrease ref counter */ + pImage->pImgbuf->iRefcount--; + /* just cleanup the object then */ + MNG_FREEX (pData, pImage, sizeof (mng_image)); + } + else + { /* free the image buffer */ + iRetcode = mng_free_imagedataobject (pData, pImage->pImgbuf); + /* and cleanup the object */ + MNG_FREEX (pData, pImage, sizeof (mng_image)); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + + pImage = pNext; /* neeeext */ + } + } +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_STATE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* * * */ +/* * General display processing routine * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_process_display (mng_datap pData) +{ + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY, MNG_LC_START); +#endif + + if (!pData->iBreakpoint) /* not broken previously ? */ + { + if ((pData->iRequestframe) || (pData->iRequestlayer) || (pData->iRequesttime)) + { + pData->bSearching = MNG_TRUE; /* indicate we're searching */ + + iRetcode = clear_canvas (pData); /* make the canvas virgin black ?!? */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* let's start from the top, shall we */ + pData->pCurraniobj = pData->pFirstaniobj; + } + } + + do /* process the objects */ + { + if (pData->bSearching) /* clear timer-flag when searching !!! */ + pData->bTimerset = MNG_FALSE; + /* do we need to finish something first ? */ + if ((pData->iBreakpoint) && (pData->iBreakpoint < 99)) + { + switch (pData->iBreakpoint) /* return to broken display routine */ + { +#ifndef MNG_SKIPCHUNK_FRAM + case 1 : { iRetcode = mng_process_display_fram2 (pData); break; } +#endif +#ifndef MNG_SKIPCHUNK_SHOW + case 3 : ; /* same as 4 !!! */ + case 4 : { iRetcode = mng_process_display_show (pData); break; } +#endif +#ifndef MNG_SKIPCHUNK_CLON + case 5 : { iRetcode = mng_process_display_clon2 (pData); break; } +#endif +#ifndef MNG_SKIPCHUNK_MAGN + case 9 : { iRetcode = mng_process_display_magn2 (pData); break; } + case 10 : { iRetcode = mng_process_display_mend2 (pData); break; } +#endif +#ifndef MNG_SKIPCHUNK_PAST + case 11 : { iRetcode = mng_process_display_past2 (pData); break; } +#endif + default : MNG_ERROR (pData, MNG_INTERNALERROR); + } + } + else + { + if (pData->pCurraniobj) + iRetcode = ((mng_object_headerp)pData->pCurraniobj)->fProcess (pData, pData->pCurraniobj); + } + + if (!pData->bTimerset) /* reset breakpoint flag ? */ + pData->iBreakpoint = 0; + /* can we advance to next object ? */ + if ((!iRetcode) && (pData->pCurraniobj) && + (!pData->bTimerset) && (!pData->bSectionwait)) + { + pData->pCurraniobj = ((mng_object_headerp)pData->pCurraniobj)->pNext; + /* MEND processing to be done ? */ + if ((pData->eImagetype == mng_it_mng) && (!pData->pCurraniobj)) + iRetcode = mng_process_display_mend (pData); + + if (!pData->pCurraniobj) /* refresh after last image ? */ + pData->bNeedrefresh = MNG_TRUE; + } + + if (pData->bSearching) /* are we looking for something ? */ + { + if ((pData->iRequestframe) && (pData->iRequestframe <= pData->iFrameseq)) + { + pData->iRequestframe = 0; /* found the frame ! */ + pData->bSearching = MNG_FALSE; + } + else + if ((pData->iRequestlayer) && (pData->iRequestlayer <= pData->iLayerseq)) + { + pData->iRequestlayer = 0; /* found the layer ! */ + pData->bSearching = MNG_FALSE; + } + else + if ((pData->iRequesttime) && (pData->iRequesttime <= pData->iFrametime)) + { + pData->iRequesttime = 0; /* found the playtime ! */ + pData->bSearching = MNG_FALSE; + } + } + } /* until error or a break or no more objects */ + while ((!iRetcode) && (pData->pCurraniobj) && + (((pData->bRunning) && (!pData->bTimerset)) || (pData->bSearching)) && + (!pData->bSectionwait) && (!pData->bFreezing)); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* refresh needed ? */ + if ((!pData->bTimerset) && (pData->bNeedrefresh)) + { + iRetcode = mng_display_progressive_refresh (pData, 1); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + /* timer break ? */ + if ((pData->bTimerset) && (!pData->iBreakpoint)) + pData->iBreakpoint = 99; + else + if (!pData->bTimerset) + pData->iBreakpoint = 0; /* reset if no timer break */ + + if ((!pData->bTimerset) && (!pData->pCurraniobj)) + pData->bRunning = MNG_FALSE; /* all done now ! */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* * * */ +/* * Chunk display processing routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT +png_imgtype mng_png_imgtype(mng_uint8 colortype, mng_uint8 bitdepth) +{ + png_imgtype ret; + switch (bitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1: + { + png_imgtype imgtype[]={png_g1,png_none,png_none,png_idx1}; + ret=imgtype[colortype]; + break; + } + case 2: + { + png_imgtype imgtype[]={png_g2,png_none,png_none,png_idx2}; + ret=imgtype[colortype]; + break; + } + case 4: + { + png_imgtype imgtype[]={png_g4,png_none,png_none,png_idx4}; + ret=imgtype[colortype]; + break; + } +#endif + case 8: + { + png_imgtype imgtype[]={png_g8,png_none,png_rgb8,png_idx8,png_ga8, + png_none,png_rgba8}; + ret=imgtype[colortype]; + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16: + { + png_imgtype imgtype[]={png_g16,png_none,png_rgb16,png_none,png_ga16, + png_none,png_rgba16}; + ret=imgtype[colortype]; + break; + } +#endif + default: + ret=png_none; + break; + } + return (ret); +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */ + +/* ************************************************************************** */ + +mng_retcode mng_process_display_ihdr (mng_datap pData) +{ /* address the current "object" if any */ + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IHDR, MNG_LC_START); +#endif + + if (!pData->bHasDHDR) + { + pData->fInitrowproc = MNG_NULL; /* do nothing by default */ + pData->fDisplayrow = MNG_NULL; + pData->fCorrectrow = MNG_NULL; + pData->fStorerow = MNG_NULL; + pData->fProcessrow = MNG_NULL; + pData->fDifferrow = MNG_NULL; + pData->pStoreobj = MNG_NULL; + } + + if (!pData->iBreakpoint) /* not previously broken ? */ + { + mng_retcode iRetcode = MNG_NOERROR; + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* is a delta-image ? */ + { + if (pData->iDeltatype == MNG_DELTATYPE_REPLACE) + iRetcode = mng_reset_object_details (pData, (mng_imagep)pData->pDeltaImage, + pData->iDatawidth, pData->iDataheight, + pData->iBitdepth, pData->iColortype, + pData->iCompression, pData->iFilter, + pData->iInterlace, MNG_TRUE); + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iPixelsampledepth = pData->iBitdepth; + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iAlphasampledepth = pData->iBitdepth; + } + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) ) + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iAlphasampledepth = pData->iBitdepth; + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) ) + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iPixelsampledepth = pData->iBitdepth; + + if (!iRetcode) + { /* process immediately if bitdepth & colortype are equal */ + pData->bDeltaimmediate = + (mng_bool)((pData->iBitdepth == ((mng_imagep)pData->pDeltaImage)->pImgbuf->iBitdepth ) && + (pData->iColortype == ((mng_imagep)pData->pDeltaImage)->pImgbuf->iColortype) ); + /* be sure to reset object 0 */ + iRetcode = mng_reset_object_details (pData, (mng_imagep)pData->pObjzero, + pData->iDatawidth, pData->iDataheight, + pData->iBitdepth, pData->iColortype, + pData->iCompression, pData->iFilter, + pData->iInterlace, MNG_TRUE); + } + } + else +#endif + { + if (pImage) /* update object buffer ? */ + iRetcode = mng_reset_object_details (pData, pImage, + pData->iDatawidth, pData->iDataheight, + pData->iBitdepth, pData->iColortype, + pData->iCompression, pData->iFilter, + pData->iInterlace, MNG_TRUE); + else + iRetcode = mng_reset_object_details (pData, (mng_imagep)pData->pObjzero, + pData->iDatawidth, pData->iDataheight, + pData->iBitdepth, pData->iColortype, + pData->iCompression, pData->iFilter, + pData->iInterlace, MNG_TRUE); + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + +#ifndef MNG_NO_DELTA_PNG + if (!pData->bHasDHDR) +#endif + { + if (pImage) /* real object ? */ + pData->pStoreobj = pImage; /* tell the row routines */ + else /* otherwise use object 0 */ + pData->pStoreobj = pData->pObjzero; + +#if !defined(MNG_INCLUDE_MPNG_PROPOSAL) && !defined(MNG_INCLUDE_ANG_PROPOSAL) + if ( /* display "on-the-fly" ? */ +#ifndef MNG_SKIPCHUNK_MAGN + (((mng_imagep)pData->pStoreobj)->iMAGN_MethodX == 0) && + (((mng_imagep)pData->pStoreobj)->iMAGN_MethodY == 0) && +#endif + ( (pData->eImagetype == mng_it_png ) || + (((mng_imagep)pData->pStoreobj)->bVisible) ) ) + { + next_layer (pData); /* that's a new layer then ! */ + + if (pData->bTimerset) /* timer break ? */ + pData->iBreakpoint = 2; + else + { + pData->iBreakpoint = 0; + /* anything to display ? */ + if ((pData->iDestr > pData->iDestl) && (pData->iDestb > pData->iDestt)) + set_display_routine (pData); /* then determine display routine */ + } + } +#endif + } + + if (!pData->bTimerset) /* no timer break ? */ + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + pData->fInitrowproc = (mng_fptr)mng_init_rowproc; + pData->ePng_imgtype=mng_png_imgtype(pData->iColortype,pData->iBitdepth); +#else + switch (pData->iColortype) /* determine row initialization routine */ + { + case 0 : { /* gray */ + switch (pData->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g1_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g1_i; + + break; + } + case 2 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g2_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g2_i; + + break; + } + case 4 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g4_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g4_i; + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g16_i; + + break; + } +#endif + } + + break; + } + case 2 : { /* rgb */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgb8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgb8_i; + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgb16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgb16_i; + + break; + } +#endif + } + + break; + } + case 3 : { /* indexed */ + switch (pData->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx1_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx1_i; + + break; + } + case 2 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx2_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx2_i; + + break; + } + case 4 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx4_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx4_i; + + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx8_i; + + break; + } + } + + break; + } + case 4 : { /* gray+alpha */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_ga8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_ga8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_ga16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_ga16_i; + break; + } +#endif + } + + break; + } + case 6 : { /* rgb+alpha */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgba8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgba8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgba16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgba16_i; + + break; + } +#endif + } + + break; + } + } +#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */ + + pData->iFilterofs = 0; /* determine filter characteristics */ + pData->iLevel0 = 0; /* default levels */ + pData->iLevel1 = 0; + pData->iLevel2 = 0; + pData->iLevel3 = 0; + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + { + switch (pData->iColortype) + { + case 0 : { + if (pData->iBitdepth <= 8) + pData->iFilterofs = 1; + else + pData->iFilterofs = 2; + + break; + } + case 2 : { + if (pData->iBitdepth <= 8) + pData->iFilterofs = 3; + else + pData->iFilterofs = 6; + + break; + } + case 3 : { + pData->iFilterofs = 1; + break; + } + case 4 : { + if (pData->iBitdepth <= 8) + pData->iFilterofs = 2; + else + pData->iFilterofs = 4; + + break; + } + case 6 : { + if (pData->iBitdepth <= 8) + pData->iFilterofs = 4; + else + pData->iFilterofs = 8; + + break; + } + } + } +#endif + +#ifdef FILTER193 /* no adaptive filtering ? */ + if (pData->iFilter == MNG_FILTER_NOFILTER) + pData->iPixelofs = pData->iFilterofs; + else +#endif + pData->iPixelofs = pData->iFilterofs + 1; + + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +mng_retcode mng_process_display_mpng (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MPNG, MNG_LC_START); +#endif + + pData->iAlphadepth = 8; /* assume transparency !! */ + + if (pData->fProcessheader) /* inform the app (creating the output canvas) ? */ + { + pData->iWidth = ((mng_mpng_objp)pData->pMPNG)->iFramewidth; + pData->iHeight = ((mng_mpng_objp)pData->pMPNG)->iFrameheight; + + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + + next_layer (pData); /* first mPNG layer then ! */ + pData->bTimerset = MNG_FALSE; + pData->iBreakpoint = 0; + + if ((pData->iDestr > pData->iDestl) && (pData->iDestb > pData->iDestt)) + set_display_routine (pData); /* then determine display routine */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +mng_retcode mng_process_display_ang (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_ANG, MNG_LC_START); +#endif + + if (pData->fProcessheader) /* inform the app (creating the output canvas) ? */ + { + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + + next_layer (pData); /* first mPNG layer then ! */ + pData->bTimerset = MNG_FALSE; + pData->iBreakpoint = 0; + + if ((pData->iDestr > pData->iDestl) && (pData->iDestb > pData->iDestt)) + set_display_routine (pData); /* then determine display routine */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_ANG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_idat (mng_datap pData, + mng_uint32 iRawlen, + mng_uint8p pRawdata) +#else +mng_retcode mng_process_display_idat (mng_datap pData) +#endif +{ + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IDAT, MNG_LC_START); +#endif + +#if defined(MNG_INCLUDE_MPNG_PROPOSAL) || defined(MNG_INCLUDE_ANG_PROPOSAL) + if ((pData->eImagetype == mng_it_png) && (pData->iLayerseq <= 0)) + { + if (pData->fProcessheader) /* inform the app (creating the output canvas) ? */ + if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + next_layer (pData); /* first regular PNG layer then ! */ + pData->bTimerset = MNG_FALSE; + pData->iBreakpoint = 0; + + if ((pData->iDestr > pData->iDestl) && (pData->iDestb > pData->iDestt)) + set_display_routine (pData); /* then determine display routine */ + } +#endif + + if (pData->bRestorebkgd) /* need to restore the background ? */ + { + pData->bRestorebkgd = MNG_FALSE; + iRetcode = load_bkgdlayer (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pData->iLayerseq++; /* and it counts as a layer then ! */ + } + + if (pData->fInitrowproc) /* need to initialize row processing? */ + { + iRetcode = ((mng_initrowproc)pData->fInitrowproc) (pData); + pData->fInitrowproc = MNG_NULL; /* only call this once !!! */ + } + + if ((!iRetcode) && (!pData->bInflating)) + /* initialize inflate */ + iRetcode = mngzlib_inflateinit (pData); + + if (!iRetcode) /* all ok? then inflate, my man */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mngzlib_inflaterows (pData, iRawlen, pRawdata); +#else + iRetcode = mngzlib_inflaterows (pData, pData->iRawlen, pData->pRawdata); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_display_iend (mng_datap pData) +{ + mng_retcode iRetcode, iRetcode2; + mng_bool bDodisplay = MNG_FALSE; + mng_bool bMagnify = MNG_FALSE; + mng_bool bCleanup = (mng_bool)(pData->iBreakpoint != 0); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IEND, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_JNG /* progressive+alpha JNG can be displayed now */ + if ( (pData->bHasJHDR ) && + ( (pData->bJPEGprogressive) || (pData->bJPEGprogressive2)) && + ( (pData->eImagetype == mng_it_jng ) || + (((mng_imagep)pData->pStoreobj)->bVisible) ) && + ( (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) ) + bDodisplay = MNG_TRUE; +#endif + +#ifndef MNG_SKIPCHUNK_MAGN + if ( (pData->pStoreobj) && /* on-the-fly magnification ? */ + ( (((mng_imagep)pData->pStoreobj)->iMAGN_MethodX) || + (((mng_imagep)pData->pStoreobj)->iMAGN_MethodY) ) ) + bMagnify = MNG_TRUE; +#endif + + if ((pData->bHasBASI) || /* was it a BASI stream */ + (bDodisplay) || /* or should we display the JNG */ +#ifndef MNG_SKIPCHUNK_MAGN + (bMagnify) || /* or should we magnify it */ +#endif + /* or did we get broken here last time ? */ + ((pData->iBreakpoint) && (pData->iBreakpoint != 8))) + { + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + + if (!pImage) /* or was it object 0 ? */ + pImage = (mng_imagep)pData->pObjzero; + /* display it now then ? */ + if ((pImage->bVisible) && (pImage->bViewable)) + { /* ok, so do it */ + iRetcode = mng_display_image (pData, pImage, bDodisplay); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (pData->bTimerset) /* timer break ? */ + pData->iBreakpoint = 6; + } + } +#ifndef MNG_NO_DELTA_PNG + else + if ((pData->bHasDHDR) || /* was it a DHDR stream */ + (pData->iBreakpoint == 8)) /* or did we get broken here last time ? */ + { + mng_imagep pImage = (mng_imagep)pData->pDeltaImage; + + if (!pData->iBreakpoint) + { /* perform the delta operations needed */ + iRetcode = mng_execute_delta_image (pData, pImage, (mng_imagep)pData->pObjzero); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + /* display it now then ? */ + if ((pImage->bVisible) && (pImage->bViewable)) + { /* ok, so do it */ + iRetcode = mng_display_image (pData, pImage, MNG_FALSE); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (pData->bTimerset) /* timer break ? */ + pData->iBreakpoint = 8; + } + } +#endif + + if (!pData->bTimerset) /* can we continue ? */ + { + pData->iBreakpoint = 0; /* clear this flag now ! */ + + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + if (pData->eImagetype == mng_it_mpng) + { + pData->pCurraniobj = pData->pFirstaniobj; + } else +#endif +#ifdef MNG_INCLUDE_ANG_PROPOSAL + if (pData->eImagetype == mng_it_ang) + { + pData->pCurraniobj = pData->pFirstaniobj; + } else +#endif + { /* cleanup object 0 */ + mng_reset_object_details (pData, (mng_imagep)pData->pObjzero, + 0, 0, 0, 0, 0, 0, 0, MNG_TRUE); + } + + if (pData->bInflating) /* if we've been inflating */ + { /* cleanup row-processing, */ + iRetcode = mng_cleanup_rowproc (pData); + /* also cleanup inflate! */ + iRetcode2 = mngzlib_inflatefree (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + if (iRetcode2) + return iRetcode2; + } + +#ifdef MNG_INCLUDE_JNG + if (pData->bJPEGdecompress) /* if we've been decompressing JDAT */ + { /* cleanup row-processing, */ + iRetcode = mng_cleanup_rowproc (pData); + /* also cleanup decompress! */ + iRetcode2 = mngjpeg_decompressfree (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + if (iRetcode2) + return iRetcode2; + } + + if (pData->bJPEGdecompress2) /* if we've been decompressing JDAA */ + { /* cleanup row-processing, */ + iRetcode = mng_cleanup_rowproc (pData); + /* also cleanup decompress! */ + iRetcode2 = mngjpeg_decompressfree2 (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + if (iRetcode2) + return iRetcode2; + } +#endif + + if (bCleanup) /* if we got broken last time we need to cleanup */ + { + pData->bHasIHDR = MNG_FALSE; /* IEND signals the end for most ... */ + pData->bHasBASI = MNG_FALSE; + pData->bHasDHDR = MNG_FALSE; +#ifdef MNG_INCLUDE_JNG + pData->bHasJHDR = MNG_FALSE; + pData->bHasJSEP = MNG_FALSE; + pData->bHasJDAA = MNG_FALSE; + pData->bHasJDAT = MNG_FALSE; +#endif + pData->bHasPLTE = MNG_FALSE; + pData->bHasTRNS = MNG_FALSE; + pData->bHasGAMA = MNG_FALSE; + pData->bHasCHRM = MNG_FALSE; + pData->bHasSRGB = MNG_FALSE; + pData->bHasICCP = MNG_FALSE; + pData->bHasBKGD = MNG_FALSE; + pData->bHasIDAT = MNG_FALSE; + } + /* if the image was displayed on the fly, */ + /* we'll have to make the app refresh */ + if ((pData->eImagetype != mng_it_mng) && (pData->fDisplayrow)) + pData->bNeedrefresh = MNG_TRUE; + + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +/* change in the MNG spec with regards to TERM delay & interframe_delay + as proposed by Adam M. Costello (option 4) and finalized by official vote + during december 2002 / check the 'mng-list' archives for more details */ + +mng_retcode mng_process_display_mend (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MEND, MNG_LC_START); +#endif + + pData->bForcedelay = pData->iAccumdelay ? MNG_FALSE : MNG_TRUE; + pData->iAccumdelay = 0; + +#ifdef MNG_SUPPORT_DYNAMICMNG + if (pData->bStopafterseek) /* need to stop after this ? */ + { + pData->bFreezing = MNG_TRUE; /* stop processing on this one */ + pData->bRunningevent = MNG_FALSE; + pData->bStopafterseek = MNG_FALSE; + pData->bNeedrefresh = MNG_TRUE; /* make sure the last bit is displayed ! */ + } +#endif + +#ifndef MNG_SKIPCHUNK_TERM + /* TERM processed ? */ + if ((pData->bDisplaying) && (pData->bRunning) && + (pData->bHasTERM) && (pData->pTermaniobj)) + { + mng_retcode iRetcode; + mng_ani_termp pTERM; + /* get the right animation object ! */ + pTERM = (mng_ani_termp)pData->pTermaniobj; + + pData->iIterations++; /* increase iteration count */ + + switch (pTERM->iTermaction) /* determine what to do! */ + { + case 0 : { /* show last frame indefinitly */ + break; /* piece of cake, that is... */ + } + + case 1 : { /* cease displaying anything */ + /* max(1, TERM delay, interframe_delay) */ +#ifndef MNG_SKIPCHUNK_FRAM + if (pTERM->iDelay > pData->iFramedelay) + pData->iFramedelay = pTERM->iDelay; + if (!pData->iFramedelay) + pData->iFramedelay = 1; +#endif + + iRetcode = interframe_delay (pData); + /* no interframe_delay? then fake it */ + if ((!iRetcode) && (!pData->bTimerset)) + iRetcode = set_delay (pData, 1); + + if (iRetcode) + return iRetcode; + + pData->iBreakpoint = 10; + break; + } + + case 2 : { /* show first image after TERM */ + iRetcode = restore_state (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* notify the app ? */ + if (pData->fProcessmend) + if (!pData->fProcessmend ((mng_handle)pData, pData->iIterations, 0)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + /* show first frame after TERM chunk */ + pData->pCurraniobj = pTERM; + pData->bOnlyfirstframe = MNG_TRUE; + pData->iFramesafterTERM = 0; + + /* max(1, TERM delay, interframe_delay) */ +#ifndef MNG_SKIPCHUNK_FRAM + if (pTERM->iDelay > pData->iFramedelay) + pData->iFramedelay = pTERM->iDelay; + if (!pData->iFramedelay) + pData->iFramedelay = 1; +#endif + + break; + } + + case 3 : { /* repeat */ + if ((pTERM->iItermax) && (pTERM->iItermax < 0x7FFFFFFF)) + pTERM->iItermax--; + + if (pTERM->iItermax) /* go back to TERM ? */ + { /* restore to initial or SAVE state */ + iRetcode = restore_state (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* notify the app ? */ + if (pData->fProcessmend) + if (!pData->fProcessmend ((mng_handle)pData, + pData->iIterations, pTERM->iItermax)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + /* restart from TERM chunk */ + pData->pCurraniobj = pTERM; + + if (pTERM->iDelay) /* set the delay (?) */ + { + /* max(1, TERM delay, interframe_delay) */ +#ifndef MNG_SKIPCHUNK_FRAM + if (pTERM->iDelay > pData->iFramedelay) + pData->iFramedelay = pTERM->iDelay; + if (!pData->iFramedelay) + pData->iFramedelay = 1; +#endif + + pData->bNeedrefresh = MNG_TRUE; + } + } + else + { + switch (pTERM->iIteraction) + { + case 0 : { /* show last frame indefinitly */ + break; /* piece of cake, that is... */ + } + + case 1 : { /* cease displaying anything */ + /* max(1, TERM delay, interframe_delay) */ +#ifndef MNG_SKIPCHUNK_FRAM + if (pTERM->iDelay > pData->iFramedelay) + pData->iFramedelay = pTERM->iDelay; + if (!pData->iFramedelay) + pData->iFramedelay = 1; +#endif + + iRetcode = interframe_delay (pData); + /* no interframe_delay? then fake it */ + if ((!iRetcode) && (!pData->bTimerset)) + iRetcode = set_delay (pData, 1); + + if (iRetcode) + return iRetcode; + + pData->iBreakpoint = 10; + break; + } + + case 2 : { /* show first image after TERM */ + iRetcode = restore_state (pData); + /* on error bail out */ + if (iRetcode) + return iRetcode; + /* notify the app ? */ + if (pData->fProcessmend) + if (!pData->fProcessmend ((mng_handle)pData, + pData->iIterations, 0)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + /* show first frame after TERM chunk */ + pData->pCurraniobj = pTERM; + pData->bOnlyfirstframe = MNG_TRUE; + pData->iFramesafterTERM = 0; + /* max(1, TERM delay, interframe_delay) */ +#ifndef MNG_SKIPCHUNK_FRAM + if (pTERM->iDelay > pData->iFramedelay) + pData->iFramedelay = pTERM->iDelay; + if (!pData->iFramedelay) + pData->iFramedelay = 1; +#endif + + break; + } + } + } + + break; + } + } + } +#endif /* MNG_SKIPCHUNK_TERM */ + /* just reading ? */ + if ((!pData->bDisplaying) && (pData->bReading)) + if (pData->fProcessmend) /* inform the app ? */ + if (!pData->fProcessmend ((mng_handle)pData, 0, 0)) + MNG_ERROR (pData, MNG_APPMISCERROR); + + if (!pData->pCurraniobj) /* always let the app refresh at the end ! */ + pData->bNeedrefresh = MNG_TRUE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_display_mend2 (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MEND, MNG_LC_START); +#endif + +#ifndef MNG_SKIPCHUNK_FRAM + pData->bFrameclipping = MNG_FALSE; /* nothing to do but restore the app background */ +#endif + load_bkgdlayer (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MEND, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DEFI +mng_retcode mng_process_display_defi (mng_datap pData) +{ + mng_imagep pImage; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_DEFI, MNG_LC_START); +#endif + + if (!pData->iDEFIobjectid) /* object id=0 ? */ + { + pImage = (mng_imagep)pData->pObjzero; + + if (pData->bDEFIhasdonotshow) + pImage->bVisible = (mng_bool)(pData->iDEFIdonotshow == 0); + + if (pData->bDEFIhasloca) + { + pImage->iPosx = pData->iDEFIlocax; + pImage->iPosy = pData->iDEFIlocay; + } + + if (pData->bDEFIhasclip) + { + pImage->bClipped = pData->bDEFIhasclip; + pImage->iClipl = pData->iDEFIclipl; + pImage->iClipr = pData->iDEFIclipr; + pImage->iClipt = pData->iDEFIclipt; + pImage->iClipb = pData->iDEFIclipb; + } + + pData->pCurrentobj = 0; /* not a real object ! */ + } + else + { /* already exists ? */ + pImage = (mng_imagep)mng_find_imageobject (pData, pData->iDEFIobjectid); + + if (!pImage) /* if not; create new */ + { + mng_retcode iRetcode = mng_create_imageobject (pData, pData->iDEFIobjectid, + (mng_bool)(pData->iDEFIconcrete == 1), + (mng_bool)(pData->iDEFIdonotshow == 0), + MNG_FALSE, 0, 0, 0, 0, 0, 0, 0, + pData->iDEFIlocax, pData->iDEFIlocay, + pData->bDEFIhasclip, + pData->iDEFIclipl, pData->iDEFIclipr, + pData->iDEFIclipt, pData->iDEFIclipb, + &pImage); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + else + { /* exists; then set new info */ + if (pData->bDEFIhasdonotshow) + pImage->bVisible = (mng_bool)(pData->iDEFIdonotshow == 0); + + pImage->bViewable = MNG_FALSE; + + if (pData->bDEFIhasloca) + { + pImage->iPosx = pData->iDEFIlocax; + pImage->iPosy = pData->iDEFIlocay; + } + + if (pData->bDEFIhasclip) + { + pImage->bClipped = pData->bDEFIhasclip; + pImage->iClipl = pData->iDEFIclipl; + pImage->iClipr = pData->iDEFIclipr; + pImage->iClipt = pData->iDEFIclipt; + pImage->iClipb = pData->iDEFIclipb; + } + + if (pData->bDEFIhasconcrete) + pImage->pImgbuf->bConcrete = (mng_bool)(pData->iDEFIconcrete == 1); + } + + pData->pCurrentobj = pImage; /* others may want to know this */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BASI +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_basi (mng_datap pData, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_bool bHasalpha, + mng_uint16 iAlpha, + mng_uint8 iViewable) +#else +mng_retcode mng_process_display_basi (mng_datap pData) +#endif +{ /* address the current "object" if any */ + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + mng_uint8p pWork; + mng_uint32 iX; + mng_imagedatap pBuf; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_BASI, MNG_LC_START); +#endif + + if (!pImage) /* or is it an "on-the-fly" image ? */ + pImage = (mng_imagep)pData->pObjzero; + /* address the object-buffer */ + pBuf = pImage->pImgbuf; + + pData->fDisplayrow = MNG_NULL; /* do nothing by default */ + pData->fCorrectrow = MNG_NULL; + pData->fStorerow = MNG_NULL; + pData->fProcessrow = MNG_NULL; + /* set parms now that they're known */ + iRetcode = mng_reset_object_details (pData, pImage, pData->iDatawidth, + pData->iDataheight, pData->iBitdepth, + pData->iColortype, pData->iCompression, + pData->iFilter, pData->iInterlace, MNG_FALSE); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* save the viewable flag */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pImage->bViewable = (mng_bool)(iViewable == 1); +#else + pImage->bViewable = (mng_bool)(pData->iBASIviewable == 1); +#endif + pBuf->bViewable = pImage->bViewable; + pData->pStoreobj = pImage; /* let row-routines know which object */ + + pWork = pBuf->pImgdata; /* fill the object-buffer with the specified + "color" sample */ + switch (pData->iColortype) /* depending on color_type & bit_depth */ + { + case 0 : { /* gray */ +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth == 16) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iDatawidth * pData->iDataheight; + iX > 0;iX--) +#else + for (iX = 0; iX < pData->iDatawidth * pData->iDataheight; iX++) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + mng_put_uint16 (pWork, iRed); +#else + mng_put_uint16 (pWork, pData->iBASIred); +#endif + pWork += 2; + } + } + else +#endif + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iDatawidth * pData->iDataheight; + iX > 0;iX--) +#else + for (iX = 0; iX < pData->iDatawidth * pData->iDataheight; iX++) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + *pWork = (mng_uint8)iRed; +#else + *pWork = (mng_uint8)pData->iBASIred; +#endif + pWork++; + } + } + /* force tRNS ? */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if ((bHasalpha) && (!iAlpha)) +#else + if ((pData->bBASIhasalpha) && (!pData->iBASIalpha)) +#endif + { + pBuf->bHasTRNS = MNG_TRUE; +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pBuf->iTRNSgray = iRed; +#else + pBuf->iTRNSgray = pData->iBASIred; +#endif + } + + break; + } + + case 2 : { /* rgb */ +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth == 16) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iDatawidth * pData->iDataheight; + iX > 0;iX--) +#else + for (iX = 0; iX < pData->iDatawidth * pData->iDataheight; iX++) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + mng_put_uint16 (pWork, iRed ); + mng_put_uint16 (pWork+2, iGreen); + mng_put_uint16 (pWork+4, iBlue ); +#else + mng_put_uint16 (pWork, pData->iBASIred ); + mng_put_uint16 (pWork+2, pData->iBASIgreen); + mng_put_uint16 (pWork+4, pData->iBASIblue ); +#endif + pWork += 6; + } + } + else +#endif + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iDatawidth * pData->iDataheight; + iX > 0;iX--) +#else + for (iX = 0; iX < pData->iDatawidth * pData->iDataheight; iX++) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + *pWork = (mng_uint8)iRed; + *(pWork+1) = (mng_uint8)iGreen; + *(pWork+2) = (mng_uint8)iBlue; +#else + *pWork = (mng_uint8)pData->iBASIred; + *(pWork+1) = (mng_uint8)pData->iBASIgreen; + *(pWork+2) = (mng_uint8)pData->iBASIblue; +#endif + pWork += 3; + } + } + /* force tRNS ? */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if ((bHasalpha) && (!iAlpha)) +#else + if ((pData->bBASIhasalpha) && (!pData->iBASIalpha)) +#endif + { + pBuf->bHasTRNS = MNG_TRUE; +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pBuf->iTRNSred = iRed; + pBuf->iTRNSgreen = iGreen; + pBuf->iTRNSblue = iBlue; +#else + pBuf->iTRNSred = pData->iBASIred; + pBuf->iTRNSgreen = pData->iBASIgreen; + pBuf->iTRNSblue = pData->iBASIblue; +#endif + } + + break; + } + + case 3 : { /* indexed */ + pBuf->bHasPLTE = MNG_TRUE; + + switch (pData->iBitdepth) + { + case 1 : { pBuf->iPLTEcount = 2; break; } + case 2 : { pBuf->iPLTEcount = 4; break; } + case 4 : { pBuf->iPLTEcount = 16; break; } + case 8 : { pBuf->iPLTEcount = 256; break; } + default : { pBuf->iPLTEcount = 1; break; } + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pBuf->aPLTEentries [0].iRed = (mng_uint8)iRed; + pBuf->aPLTEentries [0].iGreen = (mng_uint8)iGreen; + pBuf->aPLTEentries [0].iBlue = (mng_uint8)iBlue; +#else + pBuf->aPLTEentries [0].iRed = (mng_uint8)pData->iBASIred; + pBuf->aPLTEentries [0].iGreen = (mng_uint8)pData->iBASIgreen; + pBuf->aPLTEentries [0].iBlue = (mng_uint8)pData->iBASIblue; +#endif + + for (iX = 1; iX < pBuf->iPLTEcount; iX++) + { + pBuf->aPLTEentries [iX].iRed = 0; + pBuf->aPLTEentries [iX].iGreen = 0; + pBuf->aPLTEentries [iX].iBlue = 0; + } + /* force tRNS ? */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if ((bHasalpha) && (iAlpha < 255)) +#else + if ((pData->bBASIhasalpha) && (pData->iBASIalpha < 255)) +#endif + { + pBuf->bHasTRNS = MNG_TRUE; + pBuf->iTRNScount = 1; +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pBuf->aTRNSentries [0] = (mng_uint8)iAlpha; +#else + pBuf->aTRNSentries [0] = (mng_uint8)pData->iBASIalpha; +#endif + } + + break; + } + + case 4 : { /* gray+alpha */ +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth == 16) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iDatawidth * pData->iDataheight; + iX > 0;iX--) +#else + for (iX = 0; iX < pData->iDatawidth * pData->iDataheight; iX++) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + mng_put_uint16 (pWork, iRed); + mng_put_uint16 (pWork+2, iAlpha); +#else + mng_put_uint16 (pWork, pData->iBASIred); + mng_put_uint16 (pWork+2, pData->iBASIalpha); +#endif + pWork += 4; + } + } + else +#endif + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iDatawidth * pData->iDataheight; + iX > 0;iX--) +#else + for (iX = 0; iX < pData->iDatawidth * pData->iDataheight; iX++) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + *pWork = (mng_uint8)iRed; + *(pWork+1) = (mng_uint8)iAlpha; +#else + *pWork = (mng_uint8)pData->iBASIred; + *(pWork+1) = (mng_uint8)pData->iBASIalpha; +#endif + pWork += 2; + } + } + + break; + } + + case 6 : { /* rgb+alpha */ +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth == 16) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iDatawidth * pData->iDataheight; + iX > 0;iX--) +#else + for (iX = 0; iX < pData->iDatawidth * pData->iDataheight; iX++) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + mng_put_uint16 (pWork, iRed); + mng_put_uint16 (pWork+2, iGreen); + mng_put_uint16 (pWork+4, iBlue); + mng_put_uint16 (pWork+6, iAlpha); +#else + mng_put_uint16 (pWork, pData->iBASIred); + mng_put_uint16 (pWork+2, pData->iBASIgreen); + mng_put_uint16 (pWork+4, pData->iBASIblue); + mng_put_uint16 (pWork+6, pData->iBASIalpha); +#endif + pWork += 8; + } + } + else +#endif + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iDatawidth * pData->iDataheight; + iX > 0;iX--) +#else + for (iX = 0; iX < pData->iDatawidth * pData->iDataheight; iX++) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + *pWork = (mng_uint8)iRed; + *(pWork+1) = (mng_uint8)iGreen; + *(pWork+2) = (mng_uint8)iBlue; + *(pWork+3) = (mng_uint8)iAlpha; +#else + *pWork = (mng_uint8)pData->iBASIred; + *(pWork+1) = (mng_uint8)pData->iBASIgreen; + *(pWork+2) = (mng_uint8)pData->iBASIblue; + *(pWork+3) = (mng_uint8)pData->iBASIalpha; +#endif + pWork += 4; + } + } + + break; + } + + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + pData->fInitrowproc = (mng_fptr)mng_init_rowproc; + pData->ePng_imgtype=mng_png_imgtype(pData->iColortype,pData->iBitdepth); +#else + switch (pData->iColortype) /* determine row initialization routine */ + { /* just to accomodate IDAT if it arrives */ + case 0 : { /* gray */ + switch (pData->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g1_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g1_i; + + break; + } + case 2 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g2_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g2_i; + + break; + } + case 4 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g4_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g4_i; + + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g16_i; + + break; + } +#endif + } + + break; + } + case 2 : { /* rgb */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgb8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgb8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgb16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgb16_i; + + break; + } +#endif + } + + break; + } + case 3 : { /* indexed */ + switch (pData->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx1_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx1_i; + + break; + } + case 2 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx2_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx2_i; + + break; + } + case 4 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx4_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx4_i; + + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx8_i; + + break; + } + } + + break; + } + case 4 : { /* gray+alpha */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_ga8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_ga8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_ga16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_ga16_i; + + break; + } +#endif + } + + break; + } + case 6 : { /* rgb+alpha */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgba8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgba8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgba16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgba16_i; + + break; + } +#endif + } + + break; + } + } +#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */ + + pData->iFilterofs = 0; /* determine filter characteristics */ + pData->iLevel0 = 0; /* default levels */ + pData->iLevel1 = 0; + pData->iLevel2 = 0; + pData->iLevel3 = 0; + +#ifdef FILTER192 + if (pData->iFilter == 0xC0) /* leveling & differing ? */ + { + switch (pData->iColortype) + { + case 0 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth <= 8) +#endif + pData->iFilterofs = 1; +#ifndef MNG_NO_16BIT_SUPPORT + else + pData->iFilterofs = 2; +#endif + + break; + } + case 2 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth <= 8) +#endif + pData->iFilterofs = 3; +#ifndef MNG_NO_16BIT_SUPPORT + else + pData->iFilterofs = 6; +#endif + + break; + } + case 3 : { + pData->iFilterofs = 1; + break; + } + case 4 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth <= 8) +#endif + pData->iFilterofs = 2; +#ifndef MNG_NO_16BIT_SUPPORT + else + pData->iFilterofs = 4; +#endif + + break; + } + case 6 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->iBitdepth <= 8) +#endif + pData->iFilterofs = 4; +#ifndef MNG_NO_16BIT_SUPPORT + else + pData->iFilterofs = 8; +#endif + + break; + } + } + } +#endif + +#ifdef FILTER193 + if (pData->iFilter == 0xC1) /* no adaptive filtering ? */ + pData->iPixelofs = pData->iFilterofs; + else +#endif + pData->iPixelofs = pData->iFilterofs + 1; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_BASI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLON +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_clon (mng_datap pData, + mng_uint16 iSourceid, + mng_uint16 iCloneid, + mng_uint8 iClonetype, + mng_bool bHasdonotshow, + mng_uint8 iDonotshow, + mng_uint8 iConcrete, + mng_bool bHasloca, + mng_uint8 iLocationtype, + mng_int32 iLocationx, + mng_int32 iLocationy) +#else +mng_retcode mng_process_display_clon (mng_datap pData) +#endif +{ + mng_imagep pSource, pClone; + mng_bool bVisible, bAbstract; + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_CLON, MNG_LC_START); +#endif +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + /* locate the source object first */ + pSource = mng_find_imageobject (pData, iSourceid); + /* check if the clone exists */ + pClone = mng_find_imageobject (pData, iCloneid); +#else + /* locate the source object first */ + pSource = mng_find_imageobject (pData, pData->iCLONsourceid); + /* check if the clone exists */ + pClone = mng_find_imageobject (pData, pData->iCLONcloneid); +#endif + + if (!pSource) /* source must exist ! */ + MNG_ERROR (pData, MNG_OBJECTUNKNOWN); + + if (pClone) /* clone must not exist ! */ + MNG_ERROR (pData, MNG_OBJECTEXISTS); + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (bHasdonotshow) /* DoNotShow flag filled ? */ + bVisible = (mng_bool)(iDonotshow == 0); + else + bVisible = pSource->bVisible; +#else + if (pData->bCLONhasdonotshow) /* DoNotShow flag filled ? */ + bVisible = (mng_bool)(pData->iCLONdonotshow == 0); + else + bVisible = pSource->bVisible; +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + bAbstract = (mng_bool)(iConcrete == 1); +#else + bAbstract = (mng_bool)(pData->iCLONconcrete == 1); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + switch (iClonetype) /* determine action to take */ + { + case 0 : { /* full clone */ + iRetcode = mng_clone_imageobject (pData, iCloneid, MNG_FALSE, + bVisible, bAbstract, bHasloca, + iLocationtype, iLocationx, iLocationy, + pSource, &pClone); + break; + } + + case 1 : { /* partial clone */ + iRetcode = mng_clone_imageobject (pData, iCloneid, MNG_TRUE, + bVisible, bAbstract, bHasloca, + iLocationtype, iLocationx, iLocationy, + pSource, &pClone); + break; + } + + case 2 : { /* renumber object */ + iRetcode = mng_renum_imageobject (pData, pSource, iCloneid, + bVisible, bAbstract, bHasloca, + iLocationtype, iLocationx, iLocationy); + pClone = pSource; + break; + } + + } +#else + switch (pData->iCLONclonetype) /* determine action to take */ + { + case 0 : { /* full clone */ + iRetcode = mng_clone_imageobject (pData, pData->iCLONcloneid, MNG_FALSE, + bVisible, bAbstract, + pData->bCLONhasloca, pData->iCLONlocationtype, + pData->iCLONlocationx, pData->iCLONlocationy, + pSource, &pClone); + break; + } + + case 1 : { /* partial clone */ + iRetcode = mng_clone_imageobject (pData, pData->iCLONcloneid, MNG_TRUE, + bVisible, bAbstract, + pData->bCLONhasloca, pData->iCLONlocationtype, + pData->iCLONlocationx, pData->iCLONlocationy, + pSource, &pClone); + break; + } + + case 2 : { /* renumber object */ + iRetcode = mng_renum_imageobject (pData, pSource, pData->iCLONcloneid, + bVisible, bAbstract, + pData->bCLONhasloca, pData->iCLONlocationtype, + pData->iCLONlocationx, pData->iCLONlocationy); + pClone = pSource; + break; + } + + } +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + + /* display on the fly ? */ + if ((pClone->bViewable) && (pClone->bVisible)) + { + pData->pLastclone = pClone; /* remember in case of timer break ! */ + /* display it */ + mng_display_image (pData, pClone, MNG_FALSE); + + if (pData->bTimerset) /* timer break ? */ + pData->iBreakpoint = 5; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_display_clon2 (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_CLON, MNG_LC_START); +#endif + /* only called after timer break ! */ + mng_display_image (pData, (mng_imagep)pData->pLastclone, MNG_FALSE); + pData->iBreakpoint = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_disc (mng_datap pData, + mng_uint32 iCount, + mng_uint16p pIds) +#else +mng_retcode mng_process_display_disc (mng_datap pData) +#endif +{ + mng_uint32 iX; + mng_imagep pImage; + mng_uint32 iRetcode; +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_DISC, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (iCount) /* specific list ? */ +#else + if (pData->iDISCcount) /* specific list ? */ +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + mng_uint16p pWork = pIds; +#else + mng_uint16p pWork = pData->pDISCids; +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifdef MNG_DECREMENT_LOOPS /* iterate the list */ + for (iX = iCount; iX > 0; iX--) +#else + for (iX = 0; iX < iCount; iX++) +#endif +#else +#ifdef MNG_DECREMENT_LOOPS /* iterate the list */ + for (iX = pData->iDISCcount; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iDISCcount; iX++) +#endif +#endif + { + pImage = mng_find_imageobject (pData, *pWork++); + + if (pImage) /* found the object ? */ + { /* then drop it */ + iRetcode = mng_free_imageobject (pData, pImage); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + } + else /* empty: drop all un-frozen objects */ + { + mng_imagep pNext = (mng_imagep)pData->pFirstimgobj; + + while (pNext) /* any left ? */ + { + pImage = pNext; + pNext = pImage->sHeader.pNext; + + if (!pImage->bFrozen) /* not frozen ? */ + { /* then drop it */ + iRetcode = mng_free_imageobject (pData, pImage); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_DISC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_fram (mng_datap pData, + mng_uint8 iFramemode, + mng_uint8 iChangedelay, + mng_uint32 iDelay, + mng_uint8 iChangetimeout, + mng_uint32 iTimeout, + mng_uint8 iChangeclipping, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb) +#else +mng_retcode mng_process_display_fram (mng_datap pData) +#endif +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_FRAM, MNG_LC_START); +#endif + /* advance a frame then */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = next_frame (pData, iFramemode, iChangedelay, iDelay, + iChangetimeout, iTimeout, iChangeclipping, + iCliptype, iClipl, iClipr, iClipt, iClipb); +#else + iRetcode = next_frame (pData, pData->iTempFramemode, pData->iTempChangedelay, + pData->iTempDelay, pData->iTempChangetimeout, + pData->iTempTimeout, pData->iTempChangeclipping, + pData->iTempCliptype, pData->iTempClipl, pData->iTempClipr, + pData->iTempClipt, pData->iTempClipb); +#endif + + if (pData->bTimerset) /* timer break ? */ + pData->iBreakpoint = 1; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_FRAM, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_display_fram2 (mng_datap pData) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_FRAM, MNG_LC_START); +#endif + /* again; after the break */ + iRetcode = next_frame (pData, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + pData->iBreakpoint = 0; /* not again! */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_FRAM, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MOVE +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_move (mng_datap pData, + mng_uint16 iFromid, + mng_uint16 iToid, + mng_uint8 iMovetype, + mng_int32 iMovex, + mng_int32 iMovey) +#else +mng_retcode mng_process_display_move (mng_datap pData) +#endif +{ + mng_uint16 iX; + mng_imagep pImage; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MOVE, MNG_LC_START); +#endif + /* iterate the list */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = iFromid; iX <= iToid; iX++) +#else + for (iX = pData->iMOVEfromid; iX <= pData->iMOVEtoid; iX++) +#endif + { + if (!iX) /* object id=0 ? */ + pImage = (mng_imagep)pData->pObjzero; + else + pImage = mng_find_imageobject (pData, iX); + + if (pImage) /* object exists ? */ + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + switch (iMovetype) +#else + switch (pData->iMOVEmovetype) +#endif + { + case 0 : { /* absolute */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pImage->iPosx = iMovex; + pImage->iPosy = iMovey; +#else + pImage->iPosx = pData->iMOVEmovex; + pImage->iPosy = pData->iMOVEmovey; +#endif + break; + } + case 1 : { /* relative */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pImage->iPosx = pImage->iPosx + iMovex; + pImage->iPosy = pImage->iPosy + iMovey; +#else + pImage->iPosx = pImage->iPosx + pData->iMOVEmovex; + pImage->iPosy = pImage->iPosy + pData->iMOVEmovey; +#endif + break; + } + } + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MOVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLIP +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_clip (mng_datap pData, + mng_uint16 iFromid, + mng_uint16 iToid, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb) +#else +mng_retcode mng_process_display_clip (mng_datap pData) +#endif +{ + mng_uint16 iX; + mng_imagep pImage; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_CLIP, MNG_LC_START); +#endif + /* iterate the list */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = iFromid; iX <= iToid; iX++) +#else + for (iX = pData->iCLIPfromid; iX <= pData->iCLIPtoid; iX++) +#endif + { + if (!iX) /* object id=0 ? */ + pImage = (mng_imagep)pData->pObjzero; + else + pImage = mng_find_imageobject (pData, iX); + + if (pImage) /* object exists ? */ + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + switch (iCliptype) +#else + switch (pData->iCLIPcliptype) +#endif + { + case 0 : { /* absolute */ + pImage->bClipped = MNG_TRUE; +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pImage->iClipl = iClipl; + pImage->iClipr = iClipr; + pImage->iClipt = iClipt; + pImage->iClipb = iClipb; +#else + pImage->iClipl = pData->iCLIPclipl; + pImage->iClipr = pData->iCLIPclipr; + pImage->iClipt = pData->iCLIPclipt; + pImage->iClipb = pData->iCLIPclipb; +#endif + break; + } + case 1 : { /* relative */ + pImage->bClipped = MNG_TRUE; +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pImage->iClipl = pImage->iClipl + iClipl; + pImage->iClipr = pImage->iClipr + iClipr; + pImage->iClipt = pImage->iClipt + iClipt; + pImage->iClipb = pImage->iClipb + iClipb; +#else + pImage->iClipl = pImage->iClipl + pData->iCLIPclipl; + pImage->iClipr = pImage->iClipr + pData->iCLIPclipr; + pImage->iClipt = pImage->iClipt + pData->iCLIPclipt; + pImage->iClipb = pImage->iClipb + pData->iCLIPclipb; +#endif + break; + } + } + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_CLIP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SHOW +mng_retcode mng_process_display_show (mng_datap pData) +{ + mng_int16 iX, iS, iFrom, iTo; + mng_imagep pImage; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_SHOW, MNG_LC_START); +#endif + + /* TODO: optimization for the cases where "abs (iTo - iFrom)" is rather high; + especially where ((iFrom==1) && (iTo==65535)); eg. an empty SHOW !!! */ + + if (pData->iBreakpoint == 3) /* previously broken during cycle-mode ? */ + { + pImage = mng_find_imageobject (pData, pData->iSHOWnextid); + + if (pImage) /* still there ? */ + mng_display_image (pData, pImage, MNG_FALSE); + + pData->iBreakpoint = 0; /* let's not go through this again! */ + } + else + { + if (pData->iBreakpoint) /* previously broken at other point ? */ + { /* restore last parms */ + iFrom = (mng_int16)pData->iSHOWfromid; + iTo = (mng_int16)pData->iSHOWtoid; + iX = (mng_int16)pData->iSHOWnextid; + iS = (mng_int16)pData->iSHOWskip; + } + else + { /* regular sequence ? */ + if (pData->iSHOWtoid >= pData->iSHOWfromid) + iS = 1; + else /* reverse sequence ! */ + iS = -1; + + iFrom = (mng_int16)pData->iSHOWfromid; + iTo = (mng_int16)pData->iSHOWtoid; + iX = iFrom; + + pData->iSHOWfromid = (mng_uint16)iFrom; + pData->iSHOWtoid = (mng_uint16)iTo; + pData->iSHOWskip = iS; + } + /* cycle mode ? */ + if ((pData->iSHOWmode == 6) || (pData->iSHOWmode == 7)) + { + mng_uint16 iTrigger = 0; + mng_uint16 iFound = 0; + mng_uint16 iPass = 0; + mng_imagep pFound = 0; + + do + { + iPass++; /* lets prevent endless loops when there + are no potential candidates in the list! */ + + if (iS > 0) /* forward ? */ + { + for (iX = iFrom; iX <= iTo; iX += iS) + { + pImage = mng_find_imageobject (pData, (mng_uint16)iX); + + if (pImage) /* object exists ? */ + { + if (iFound) /* already found a candidate ? */ + pImage->bVisible = MNG_FALSE; + else + if (iTrigger) /* found the trigger ? */ + { + pImage->bVisible = MNG_TRUE; + iFound = iX; + pFound = pImage; + } + else + if (pImage->bVisible) /* ok, this is the trigger */ + { + pImage->bVisible = MNG_FALSE; + iTrigger = iX; + } + } + } + } + else + { + for (iX = iFrom; iX >= iTo; iX += iS) + { + pImage = mng_find_imageobject (pData, (mng_uint16)iX); + + if (pImage) /* object exists ? */ + { + if (iFound) /* already found a candidate ? */ + pImage->bVisible = MNG_FALSE; + else + if (iTrigger) /* found the trigger ? */ + { + pImage->bVisible = MNG_TRUE; + iFound = iX; + pFound = pImage; + } + else + if (pImage->bVisible) /* ok, this is the trigger */ + { + pImage->bVisible = MNG_FALSE; + iTrigger = iX; + } + } + } + } + + if (!iTrigger) /* did not find a trigger ? */ + iTrigger = 1; /* then fake it so the first image + gets nominated */ + } /* cycle back to beginning ? */ + while ((iPass < 2) && (iTrigger) && (!iFound)); + + pData->iBreakpoint = 0; /* just a sanity precaution */ + /* display it ? */ + if ((pData->iSHOWmode == 6) && (pFound)) + { + mng_display_image (pData, pFound, MNG_FALSE); + + if (pData->bTimerset) /* timer set ? */ + { + pData->iBreakpoint = 3; + pData->iSHOWnextid = iFound; /* save it for after the break */ + } + } + } + else + { + do + { + pImage = mng_find_imageobject (pData, iX); + + if (pImage) /* object exists ? */ + { + if (pData->iBreakpoint) /* did we get broken last time ? */ + { /* could only happen in the display routine */ + mng_display_image (pData, pImage, MNG_FALSE); + pData->iBreakpoint = 0; /* only once inside this loop please ! */ + } + else + { + switch (pData->iSHOWmode) /* do what ? */ + { + case 0 : { + pImage->bVisible = MNG_TRUE; + mng_display_image (pData, pImage, MNG_FALSE); + break; + } + case 1 : { + pImage->bVisible = MNG_FALSE; + break; + } + case 2 : { + if (pImage->bVisible) + mng_display_image (pData, pImage, MNG_FALSE); + break; + } + case 3 : { + pImage->bVisible = MNG_TRUE; + break; + } + case 4 : { + pImage->bVisible = (mng_bool)(!pImage->bVisible); + if (pImage->bVisible) + mng_display_image (pData, pImage, MNG_FALSE); + break; + } + case 5 : { + pImage->bVisible = (mng_bool)(!pImage->bVisible); + } + } + } + } + + if (!pData->bTimerset) /* next ? */ + iX += iS; + + } /* continue ? */ + while ((!pData->bTimerset) && (((iS > 0) && (iX <= iTo)) || + ((iS < 0) && (iX >= iTo)) )); + + if (pData->bTimerset) /* timer set ? */ + { + pData->iBreakpoint = 4; + pData->iSHOWnextid = iX; /* save for next time */ + } + else + pData->iBreakpoint = 0; + + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_process_display_save (mng_datap pData) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_SAVE, MNG_LC_START); +#endif + + iRetcode = save_state (pData); /* save the current state */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode mng_process_display_seek (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_SEEK, MNG_LC_START); +#endif + +#ifdef MNG_SUPPORT_DYNAMICMNG + if (pData->bStopafterseek) /* need to stop after this SEEK ? */ + { + pData->bFreezing = MNG_TRUE; /* stop processing on this one */ + pData->bRunningevent = MNG_FALSE; + pData->bStopafterseek = MNG_FALSE; + pData->bNeedrefresh = MNG_TRUE; /* make sure the last bit is displayed ! */ + } + else +#endif + { /* restore the initial or SAVE state */ + mng_retcode iRetcode = restore_state (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_DYNAMICMNG + /* stop after next SEEK ? */ + if ((pData->bDynamic) || (pData->bRunningevent)) + pData->bStopafterseek = MNG_TRUE; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_SEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_process_display_jhdr (mng_datap pData) +{ /* address the current "object" if any */ + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_JHDR, MNG_LC_START); +#endif + + if (!pData->bHasDHDR) + { + pData->fInitrowproc = MNG_NULL; /* do nothing by default */ + pData->fDisplayrow = MNG_NULL; + pData->fCorrectrow = MNG_NULL; + pData->fStorerow = MNG_NULL; + pData->fProcessrow = MNG_NULL; + pData->fDifferrow = MNG_NULL; + pData->fStorerow2 = MNG_NULL; + pData->fStorerow3 = MNG_NULL; + + pData->pStoreobj = MNG_NULL; /* initialize important work-parms */ + + pData->iJPEGrow = 0; + pData->iJPEGalpharow = 0; + pData->iJPEGrgbrow = 0; + pData->iRowmax = 0; /* so init_rowproc does the right thing ! */ + } + + if (!pData->iBreakpoint) /* not previously broken ? */ + { +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* delta-image ? */ + { + if (pData->iDeltatype == MNG_DELTATYPE_REPLACE) + { + iRetcode = mng_reset_object_details (pData, (mng_imagep)pData->pDeltaImage, + pData->iDatawidth, pData->iDataheight, + pData->iJHDRimgbitdepth, pData->iJHDRcolortype, + pData->iJHDRalphacompression, pData->iJHDRalphafilter, + pData->iJHDRalphainterlace, MNG_TRUE); + + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iAlphabitdepth = pData->iJHDRalphabitdepth; + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iJHDRcompression = pData->iJHDRimgcompression; + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iJHDRinterlace = pData->iJHDRimginterlace; + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iAlphasampledepth = pData->iJHDRalphabitdepth; + } + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iPixelsampledepth = pData->iJHDRimgbitdepth; + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iAlphasampledepth = pData->iJHDRalphabitdepth; + } + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) ) + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iAlphasampledepth = pData->iJHDRalphabitdepth; + else + if ((pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) ) + ((mng_imagep)pData->pDeltaImage)->pImgbuf->iPixelsampledepth = pData->iJHDRimgbitdepth; + + } + else +#endif /* MNG_NO_DELTA_PNG */ + { + if (pImage) /* update object buffer ? */ + { + iRetcode = mng_reset_object_details (pData, pImage, + pData->iDatawidth, pData->iDataheight, + pData->iJHDRimgbitdepth, pData->iJHDRcolortype, + pData->iJHDRalphacompression, pData->iJHDRalphafilter, + pData->iJHDRalphainterlace, MNG_TRUE); + + pImage->pImgbuf->iAlphabitdepth = pData->iJHDRalphabitdepth; + pImage->pImgbuf->iJHDRcompression = pData->iJHDRimgcompression; + pImage->pImgbuf->iJHDRinterlace = pData->iJHDRimginterlace; + pImage->pImgbuf->iAlphasampledepth = pData->iJHDRalphabitdepth; + } + else /* update object 0 */ + { + iRetcode = mng_reset_object_details (pData, (mng_imagep)pData->pObjzero, + pData->iDatawidth, pData->iDataheight, + pData->iJHDRimgbitdepth, pData->iJHDRcolortype, + pData->iJHDRalphacompression, pData->iJHDRalphafilter, + pData->iJHDRalphainterlace, MNG_TRUE); + + ((mng_imagep)pData->pObjzero)->pImgbuf->iAlphabitdepth = pData->iJHDRalphabitdepth; + ((mng_imagep)pData->pObjzero)->pImgbuf->iJHDRcompression = pData->iJHDRimgcompression; + ((mng_imagep)pData->pObjzero)->pImgbuf->iJHDRinterlace = pData->iJHDRimginterlace; + ((mng_imagep)pData->pObjzero)->pImgbuf->iAlphasampledepth = pData->iJHDRalphabitdepth; + } + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + + if (!pData->bHasDHDR) + { /* we're always storing a JPEG */ + if (pImage) /* real object ? */ + pData->pStoreobj = pImage; /* tell the row routines */ + else /* otherwise use object 0 */ + pData->pStoreobj = pData->pObjzero; + /* display "on-the-fly" ? */ + if ( +#ifndef MNG_SKIPCHUNK_MAGN + ( ((mng_imagep)pData->pStoreobj)->iMAGN_MethodX == 0) && + ( ((mng_imagep)pData->pStoreobj)->iMAGN_MethodY == 0) && +#endif + ( (pData->eImagetype == mng_it_jng ) || + (((mng_imagep)pData->pStoreobj)->bVisible) ) ) + { + next_layer (pData); /* that's a new layer then ! */ + + pData->iBreakpoint = 0; + + if (pData->bTimerset) /* timer break ? */ + pData->iBreakpoint = 7; + else + if (pData->bRunning) /* still running ? */ + { /* anything to display ? */ + if ((pData->iDestr > pData->iDestl) && (pData->iDestb > pData->iDestt)) + { + set_display_routine (pData); /* then determine display routine */ + /* display from the object we store in */ + pData->pRetrieveobj = pData->pStoreobj; + } + } + } + } + + if (!pData->bTimerset) /* no timer break ? */ + { /* default row initialization ! */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + pData->ePng_imgtype=png_none; +#endif + pData->fInitrowproc = (mng_fptr)mng_init_rowproc; + + if ((!pData->bHasDHDR) || (pData->iDeltatype == MNG_DELTATYPE_REPLACE)) + { /* 8-bit JPEG ? */ + if (pData->iJHDRimgbitdepth == 8) + { /* intermediate row is 8-bit deep */ + pData->bIsRGBA16 = MNG_FALSE; + pData->iRowsamples = pData->iDatawidth; + + switch (pData->iJHDRcolortype) /* determine pixel processing routines */ + { + case MNG_COLORTYPE_JPEGGRAY : + { + pData->fStorerow2 = (mng_fptr)mng_store_jpeg_g8; + pData->fRetrieverow = (mng_fptr)mng_retrieve_g8; + pData->bIsOpaque = MNG_TRUE; + break; + } + case MNG_COLORTYPE_JPEGCOLOR : + { + pData->fStorerow2 = (mng_fptr)mng_store_jpeg_rgb8; + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb8; + pData->bIsOpaque = MNG_TRUE; + break; + } + case MNG_COLORTYPE_JPEGGRAYA : + { + pData->fStorerow2 = (mng_fptr)mng_store_jpeg_ga8; + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga8; + pData->bIsOpaque = MNG_FALSE; + break; + } + case MNG_COLORTYPE_JPEGCOLORA : + { + pData->fStorerow2 = (mng_fptr)mng_store_jpeg_rgba8; + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8; + pData->bIsOpaque = MNG_FALSE; + break; + } + } + } +#ifndef MNG_NO_16BIT_SUPPORT + else + { + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + + /* TODO: 12-bit JPEG */ + /* TODO: 8- + 12-bit JPEG (eg. type=20) */ + + } +#endif + /* possible IDAT alpha-channel ? */ + if (pData->iJHDRalphacompression == MNG_COMPRESSION_DEFLATE) + { + /* determine alpha processing routine */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + pData->fInitrowproc = (mng_fptr)mng_init_rowproc; +#endif + switch (pData->iJHDRalphabitdepth) + { +#ifndef MNG_OPTIMIZE_FOOTPRINT_INIT +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { pData->fInitrowproc = (mng_fptr)mng_init_jpeg_a1_ni; break; } + case 2 : { pData->fInitrowproc = (mng_fptr)mng_init_jpeg_a2_ni; break; } + case 4 : { pData->fInitrowproc = (mng_fptr)mng_init_jpeg_a4_ni; break; } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { pData->fInitrowproc = (mng_fptr)mng_init_jpeg_a8_ni; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fInitrowproc = (mng_fptr)mng_init_jpeg_a16_ni; break; } +#endif +#else +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { pData->ePng_imgtype = png_jpeg_a1; break; } + case 2 : { pData->ePng_imgtype = png_jpeg_a2; break; } + case 4 : { pData->ePng_imgtype = png_jpeg_a4; break; } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { pData->ePng_imgtype = png_jpeg_a8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->ePng_imgtype = png_jpeg_a16; break; } +#endif +#endif + } + } + else /* possible JDAA alpha-channel ? */ + if (pData->iJHDRalphacompression == MNG_COMPRESSION_BASELINEJPEG) + { /* 8-bit JPEG ? */ + if (pData->iJHDRimgbitdepth == 8) + { + if (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA) + pData->fStorerow3 = (mng_fptr)mng_store_jpeg_g8_alpha; + else + if (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) + pData->fStorerow3 = (mng_fptr)mng_store_jpeg_rgb8_alpha; + } + else + { + /* TODO: 12-bit JPEG with 8-bit JDAA */ + } + } + /* initialize JPEG library */ + iRetcode = mngjpeg_initialize (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + else + { /* must be alpha add/replace !! */ + if ((pData->iDeltatype != MNG_DELTATYPE_BLOCKALPHAADD ) && + (pData->iDeltatype != MNG_DELTATYPE_BLOCKALPHAREPLACE) ) + MNG_ERROR (pData, MNG_INVDELTATYPE); + /* determine alpha processing routine */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + pData->fInitrowproc = (mng_fptr)mng_init_rowproc; +#endif + switch (pData->iJHDRalphabitdepth) + { +#ifndef MNG_OPTIMIZE_FOOTPRINT_INIT +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { pData->fInitrowproc = (mng_fptr)mng_init_g1_ni; break; } + case 2 : { pData->fInitrowproc = (mng_fptr)mng_init_g2_ni; break; } + case 4 : { pData->fInitrowproc = (mng_fptr)mng_init_g4_ni; break; } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { pData->fInitrowproc = (mng_fptr)mng_init_g8_ni; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fInitrowproc = (mng_fptr)mng_init_g16_ni; break; } +#endif +#else +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { pData->ePng_imgtype = png_jpeg_a1; break; } + case 2 : { pData->ePng_imgtype = png_jpeg_a2; break; } + case 4 : { pData->ePng_imgtype = png_jpeg_a4; break; } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { pData->ePng_imgtype = png_jpeg_a8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->ePng_imgtype = png_jpeg_a16; break; } +#endif +#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */ + } + } + + pData->iFilterofs = 0; /* determine filter characteristics */ + pData->iLevel0 = 0; /* default levels */ + pData->iLevel1 = 0; + pData->iLevel2 = 0; + pData->iLevel3 = 0; + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iJHDRalphafilter == 0xC0) + { + if (pData->iJHDRalphabitdepth <= 8) + pData->iFilterofs = 1; + else + pData->iFilterofs = 2; + + } +#endif +#ifdef FILTER193 /* no adaptive filtering ? */ + if (pData->iJHDRalphafilter == 0xC1) + pData->iPixelofs = pData->iFilterofs; + else +#endif + pData->iPixelofs = pData->iFilterofs + 1; + + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_JHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_jdaa (mng_datap pData, + mng_uint32 iRawlen, + mng_uint8p pRawdata) +#else +mng_retcode mng_process_display_jdaa (mng_datap pData) +#endif +{ + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_JDAA, MNG_LC_START); +#endif + + if (!pData->bJPEGdecompress2) /* if we're not decompressing already */ + { + if (pData->fInitrowproc) /* initialize row-processing? */ + { + iRetcode = ((mng_initrowproc)pData->fInitrowproc) (pData); + pData->fInitrowproc = MNG_NULL; /* only call this once !!! */ + } + + if (!iRetcode) /* initialize decompress */ + iRetcode = mngjpeg_decompressinit2 (pData); + } + + if (!iRetcode) /* all ok? then decompress, my man */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mngjpeg_decompressdata2 (pData, iRawlen, pRawdata); +#else + iRetcode = mngjpeg_decompressdata2 (pData, pData->iRawlen, pData->pRawdata); +#endif + + if (iRetcode) + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_JDAA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_jdat (mng_datap pData, + mng_uint32 iRawlen, + mng_uint8p pRawdata) +#else +mng_retcode mng_process_display_jdat (mng_datap pData) +#endif +{ + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_JDAT, MNG_LC_START); +#endif + + if (pData->bRestorebkgd) /* need to restore the background ? */ + { + pData->bRestorebkgd = MNG_FALSE; + iRetcode = load_bkgdlayer (pData); + + pData->iLayerseq++; /* and it counts as a layer then ! */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + + if (!pData->bJPEGdecompress) /* if we're not decompressing already */ + { + if (pData->fInitrowproc) /* initialize row-processing? */ + { + iRetcode = ((mng_initrowproc)pData->fInitrowproc) (pData); + pData->fInitrowproc = MNG_NULL; /* only call this once !!! */ + } + + if (!iRetcode) /* initialize decompress */ + iRetcode = mngjpeg_decompressinit (pData); + } + + if (!iRetcode) /* all ok? then decompress, my man */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mngjpeg_decompressdata (pData, iRawlen, pRawdata); +#else + iRetcode = mngjpeg_decompressdata (pData, pData->iRawlen, pData->pRawdata); +#endif + + if (iRetcode) + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_JDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_dhdr (mng_datap pData, + mng_uint16 iObjectid, + mng_uint8 iImagetype, + mng_uint8 iDeltatype, + mng_uint32 iBlockwidth, + mng_uint32 iBlockheight, + mng_uint32 iBlockx, + mng_uint32 iBlocky) +#else +mng_retcode mng_process_display_dhdr (mng_datap pData) +#endif +{ + mng_imagep pImage; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_DHDR, MNG_LC_START); +#endif + + pData->fInitrowproc = MNG_NULL; /* do nothing by default */ + pData->fDisplayrow = MNG_NULL; + pData->fCorrectrow = MNG_NULL; + pData->fStorerow = MNG_NULL; + pData->fProcessrow = MNG_NULL; + pData->pStoreobj = MNG_NULL; + + pData->fDeltagetrow = MNG_NULL; + pData->fDeltaaddrow = MNG_NULL; + pData->fDeltareplacerow = MNG_NULL; + pData->fDeltaputrow = MNG_NULL; + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pImage = mng_find_imageobject (pData, iObjectid); +#else + pImage = mng_find_imageobject (pData, pData->iDHDRobjectid); +#endif + + if (pImage) /* object exists ? */ + { + if (pImage->pImgbuf->bConcrete) /* is it concrete ? */ + { /* previous magnification to be done ? */ +#ifndef MNG_SKIPCHUNK_MAGN + if ((pImage->iMAGN_MethodX) || (pImage->iMAGN_MethodY)) + { + iRetcode = mng_magnify_imageobject (pData, pImage); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif + /* save delta fields */ + pData->pDeltaImage = (mng_ptr)pImage; +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pData->iDeltaImagetype = iImagetype; + pData->iDeltatype = iDeltatype; + pData->iDeltaBlockwidth = iBlockwidth; + pData->iDeltaBlockheight = iBlockheight; + pData->iDeltaBlockx = iBlockx; + pData->iDeltaBlocky = iBlocky; +#else + pData->iDeltaImagetype = pData->iDHDRimagetype; + pData->iDeltatype = pData->iDHDRdeltatype; + pData->iDeltaBlockwidth = pData->iDHDRblockwidth; + pData->iDeltaBlockheight = pData->iDHDRblockheight; + pData->iDeltaBlockx = pData->iDHDRblockx; + pData->iDeltaBlocky = pData->iDHDRblocky; +#endif + /* restore target-object fields */ + pData->iDatawidth = pImage->pImgbuf->iWidth; + pData->iDataheight = pImage->pImgbuf->iHeight; + pData->iBitdepth = pImage->pImgbuf->iBitdepth; + pData->iColortype = pImage->pImgbuf->iColortype; + pData->iCompression = pImage->pImgbuf->iCompression; + pData->iFilter = pImage->pImgbuf->iFilter; + pData->iInterlace = pImage->pImgbuf->iInterlace; + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if ((iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + pData->iBitdepth = pImage->pImgbuf->iPixelsampledepth; + else + if ((iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD ) || + (iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) ) + pData->iBitdepth = pImage->pImgbuf->iAlphasampledepth; + else + if ((iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD ) || + (iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) ) + pData->iBitdepth = pImage->pImgbuf->iPixelsampledepth; +#else + if ((pData->iDHDRdeltatype == MNG_DELTATYPE_BLOCKPIXELADD ) || + (pData->iDHDRdeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + pData->iBitdepth = pImage->pImgbuf->iPixelsampledepth; + else + if ((pData->iDHDRdeltatype == MNG_DELTATYPE_BLOCKALPHAADD ) || + (pData->iDHDRdeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) ) + pData->iBitdepth = pImage->pImgbuf->iAlphasampledepth; + else + if ((pData->iDHDRdeltatype == MNG_DELTATYPE_BLOCKCOLORADD ) || + (pData->iDHDRdeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) ) + pData->iBitdepth = pImage->pImgbuf->iPixelsampledepth; +#endif + +#ifdef MNG_INCLUDE_JNG + pData->iJHDRimgbitdepth = pImage->pImgbuf->iBitdepth; + pData->iJHDRcolortype = pImage->pImgbuf->iColortype; + pData->iJHDRimgcompression = pImage->pImgbuf->iJHDRcompression; + pData->iJHDRimginterlace = pImage->pImgbuf->iJHDRinterlace; + pData->iJHDRalphacompression = pImage->pImgbuf->iCompression; + pData->iJHDRalphafilter = pImage->pImgbuf->iFilter; + pData->iJHDRalphainterlace = pImage->pImgbuf->iInterlace; + pData->iJHDRalphabitdepth = pImage->pImgbuf->iAlphabitdepth; +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + /* block size specified ? */ + if (iDeltatype != MNG_DELTATYPE_NOCHANGE) + { /* block entirely within target ? */ + if (iDeltatype != MNG_DELTATYPE_REPLACE) + { + if (((iBlockx + iBlockwidth ) > pData->iDatawidth ) || + ((iBlocky + iBlockheight) > pData->iDataheight) ) + MNG_ERROR (pData, MNG_INVALIDBLOCK); + } + + pData->iDatawidth = iBlockwidth; + pData->iDataheight = iBlockheight; + } +#else + /* block size specified ? */ + if (pData->iDHDRdeltatype != MNG_DELTATYPE_NOCHANGE) + { /* block entirely within target ? */ + if (pData->iDHDRdeltatype != MNG_DELTATYPE_REPLACE) + { + if (((pData->iDHDRblockx + pData->iDHDRblockwidth ) > pData->iDatawidth ) || + ((pData->iDHDRblocky + pData->iDHDRblockheight) > pData->iDataheight) ) + MNG_ERROR (pData, MNG_INVALIDBLOCK); + } + + pData->iDatawidth = pData->iDHDRblockwidth; + pData->iDataheight = pData->iDHDRblockheight; + } +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + switch (iDeltatype) /* determine nr of delta-channels */ +#else + switch (pData->iDHDRdeltatype) /* determine nr of delta-channels */ +#endif + { + case MNG_DELTATYPE_BLOCKALPHAADD : ; + case MNG_DELTATYPE_BLOCKALPHAREPLACE : + { +#ifdef MNG_INCLUDE_JNG + if ((pData->iColortype == MNG_COLORTYPE_GRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA) ) + { + pData->iColortype = MNG_COLORTYPE_GRAY; + pData->iJHDRcolortype = MNG_COLORTYPE_JPEGGRAY; + } + else + if ((pData->iColortype == MNG_COLORTYPE_RGBA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) + { + pData->iColortype = MNG_COLORTYPE_GRAY; + pData->iJHDRcolortype = MNG_COLORTYPE_JPEGGRAY; + } +#else + if (pData->iColortype == MNG_COLORTYPE_GRAYA) + pData->iColortype = MNG_COLORTYPE_GRAY; + else + if (pData->iColortype == MNG_COLORTYPE_RGBA) + pData->iColortype = MNG_COLORTYPE_GRAY; +#endif + else /* target has no alpha; that sucks! */ + MNG_ERROR (pData, MNG_TARGETNOALPHA); + + break; + } + + case MNG_DELTATYPE_BLOCKCOLORADD : ; + case MNG_DELTATYPE_BLOCKCOLORREPLACE : + { +#ifdef MNG_INCLUDE_JNG + if ((pData->iColortype == MNG_COLORTYPE_GRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA) ) + { + pData->iColortype = MNG_COLORTYPE_GRAY; + pData->iJHDRcolortype = MNG_COLORTYPE_JPEGGRAY; + } + else + if ((pData->iColortype == MNG_COLORTYPE_RGBA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) + { + pData->iColortype = MNG_COLORTYPE_RGB; + pData->iJHDRcolortype = MNG_COLORTYPE_JPEGCOLOR; + } +#else + if (pData->iColortype == MNG_COLORTYPE_GRAYA) + pData->iColortype = MNG_COLORTYPE_GRAY; + else + if (pData->iColortype == MNG_COLORTYPE_RGBA) + pData->iColortype = MNG_COLORTYPE_RGB; +#endif + else /* target has no alpha; that sucks! */ + MNG_ERROR (pData, MNG_TARGETNOALPHA); + + break; + } + + } + /* full image replace ? */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (iDeltatype == MNG_DELTATYPE_REPLACE) +#else + if (pData->iDHDRdeltatype == MNG_DELTATYPE_REPLACE) +#endif + { + iRetcode = mng_reset_object_details (pData, pImage, + pData->iDatawidth, pData->iDataheight, + pData->iBitdepth, pData->iColortype, + pData->iCompression, pData->iFilter, + pData->iInterlace, MNG_FALSE); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pData->pStoreobj = pImage; /* and store straight into this object */ + } + else + { + mng_imagedatap pBufzero, pBuf; + /* we store in object 0 and process it later */ + pData->pStoreobj = pData->pObjzero; + /* make sure to initialize object 0 then */ + iRetcode = mng_reset_object_details (pData, (mng_imagep)pData->pObjzero, + pData->iDatawidth, pData->iDataheight, + pData->iBitdepth, pData->iColortype, + pData->iCompression, pData->iFilter, + pData->iInterlace, MNG_TRUE); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pBuf = pImage->pImgbuf; /* copy possible palette & cheap transparency */ + pBufzero = ((mng_imagep)pData->pObjzero)->pImgbuf; + + pBufzero->bHasPLTE = pBuf->bHasPLTE; + pBufzero->bHasTRNS = pBuf->bHasTRNS; + + if (pBufzero->bHasPLTE) /* copy palette ? */ + { + mng_uint32 iX; + + pBufzero->iPLTEcount = pBuf->iPLTEcount; + + for (iX = 0; iX < pBuf->iPLTEcount; iX++) + { + pBufzero->aPLTEentries [iX].iRed = pBuf->aPLTEentries [iX].iRed; + pBufzero->aPLTEentries [iX].iGreen = pBuf->aPLTEentries [iX].iGreen; + pBufzero->aPLTEentries [iX].iBlue = pBuf->aPLTEentries [iX].iBlue; + } + } + + if (pBufzero->bHasTRNS) /* copy cheap transparency ? */ + { + pBufzero->iTRNSgray = pBuf->iTRNSgray; + pBufzero->iTRNSred = pBuf->iTRNSred; + pBufzero->iTRNSgreen = pBuf->iTRNSgreen; + pBufzero->iTRNSblue = pBuf->iTRNSblue; + pBufzero->iTRNScount = pBuf->iTRNScount; + + MNG_COPY (pBufzero->aTRNSentries, pBuf->aTRNSentries, + sizeof (pBufzero->aTRNSentries)); + } + /* process immediately if bitdepth & colortype are equal */ + pData->bDeltaimmediate = + (mng_bool)((pData->bDisplaying) && (!pData->bSkipping) && + ((pData->bRunning) || (pData->bSearching)) && + (pData->iBitdepth == ((mng_imagep)pData->pDeltaImage)->pImgbuf->iBitdepth ) && + (pData->iColortype == ((mng_imagep)pData->pDeltaImage)->pImgbuf->iColortype) ); + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + pData->fInitrowproc = (mng_fptr)mng_init_rowproc; + pData->ePng_imgtype = mng_png_imgtype (pData->iColortype, pData->iBitdepth); +#else + switch (pData->iColortype) /* determine row initialization routine */ + { + case 0 : { /* gray */ + switch (pData->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g1_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g1_i; + + break; + } + case 2 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g2_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g2_i; + + break; + } + case 4 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g4_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g4_i; + + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_g16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_g16_i; + + break; + } +#endif + } + + break; + } + case 2 : { /* rgb */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgb8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgb8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgb16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgb16_i; + + break; + } +#endif + } + + break; + } + case 3 : { /* indexed */ + switch (pData->iBitdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx1_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx1_i; + + break; + } + case 2 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx2_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx2_i; + + break; + } + case 4 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx4_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx4_i; + + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_idx8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_idx8_i; + + break; + } + } + + break; + } + case 4 : { /* gray+alpha */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_ga8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_ga8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_ga16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_ga16_i; + + break; + } +#endif + } + + break; + } + case 6 : { /* rgb+alpha */ + switch (pData->iBitdepth) + { + case 8 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgba8_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgba8_i; + + break; + } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { + if (!pData->iInterlace) + pData->fInitrowproc = (mng_fptr)mng_init_rgba16_ni; + else + pData->fInitrowproc = (mng_fptr)mng_init_rgba16_i; + + break; + } +#endif + } + + break; + } + } +#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */ + } + else + MNG_ERROR (pData, MNG_OBJNOTCONCRETE); + + } + else + MNG_ERROR (pData, MNG_OBJECTUNKNOWN); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_DHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_prom (mng_datap pData, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iFilltype) +#else +mng_retcode mng_process_display_prom (mng_datap pData) +#endif +{ + mng_imagep pImage; + mng_imagedatap pBuf; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_PROM, MNG_LC_START); +#endif + + if (!pData->pDeltaImage) /* gotta have this now! */ + MNG_ERROR (pData, MNG_INVALIDDELTA); + + pImage = (mng_imagep)pData->pDeltaImage; + pBuf = pImage->pImgbuf; + /* can't demote bitdepth! */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (iBitdepth < pBuf->iBitdepth) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ( ((pBuf->iColortype == MNG_COLORTYPE_GRAY ) && + (iColortype != MNG_COLORTYPE_GRAY ) && + (iColortype != MNG_COLORTYPE_GRAYA ) && + (iColortype != MNG_COLORTYPE_RGB ) && + (iColortype != MNG_COLORTYPE_RGBA ) ) || + ((pBuf->iColortype == MNG_COLORTYPE_GRAYA ) && + (iColortype != MNG_COLORTYPE_GRAYA ) && + (iColortype != MNG_COLORTYPE_RGBA ) ) || + ((pBuf->iColortype == MNG_COLORTYPE_RGB ) && + (iColortype != MNG_COLORTYPE_RGB ) && + (iColortype != MNG_COLORTYPE_RGBA ) ) || + ((pBuf->iColortype == MNG_COLORTYPE_RGBA ) && + (iColortype != MNG_COLORTYPE_RGBA ) ) || +#ifdef MNG_INCLUDE_JNG + ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAY ) && + (iColortype != MNG_COLORTYPE_JPEGGRAY ) && + (iColortype != MNG_COLORTYPE_JPEGCOLOR ) && + (iColortype != MNG_COLORTYPE_JPEGGRAYA ) && + (iColortype != MNG_COLORTYPE_JPEGCOLORA) ) || + ((pBuf->iColortype == MNG_COLORTYPE_JPEGCOLOR ) && + (iColortype != MNG_COLORTYPE_JPEGCOLOR ) && + (iColortype != MNG_COLORTYPE_JPEGCOLORA) ) || + ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAYA ) && + (iColortype != MNG_COLORTYPE_JPEGGRAYA ) && + (iColortype != MNG_COLORTYPE_JPEGCOLORA) ) || + ((pBuf->iColortype == MNG_COLORTYPE_JPEGCOLORA) && + (iColortype != MNG_COLORTYPE_JPEGCOLORA) ) || +#endif + ((pBuf->iColortype == MNG_COLORTYPE_INDEXED ) && + (iColortype != MNG_COLORTYPE_INDEXED ) && + (iColortype != MNG_COLORTYPE_RGB ) && + (iColortype != MNG_COLORTYPE_RGBA ) ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + iRetcode = mng_promote_imageobject (pData, pImage, iBitdepth, iColortype, iFilltype); +#else + if (pData->iPROMbitdepth < pBuf->iBitdepth) + MNG_ERROR (pData, MNG_INVALIDBITDEPTH); + + if ( ((pBuf->iColortype == MNG_COLORTYPE_GRAY ) && + (pData->iPROMcolortype != MNG_COLORTYPE_GRAY ) && + (pData->iPROMcolortype != MNG_COLORTYPE_GRAYA ) && + (pData->iPROMcolortype != MNG_COLORTYPE_RGB ) && + (pData->iPROMcolortype != MNG_COLORTYPE_RGBA ) ) || + ((pBuf->iColortype == MNG_COLORTYPE_GRAYA ) && + (pData->iPROMcolortype != MNG_COLORTYPE_GRAYA ) && + (pData->iPROMcolortype != MNG_COLORTYPE_RGBA ) ) || + ((pBuf->iColortype == MNG_COLORTYPE_RGB ) && + (pData->iPROMcolortype != MNG_COLORTYPE_RGB ) && + (pData->iPROMcolortype != MNG_COLORTYPE_RGBA ) ) || + ((pBuf->iColortype == MNG_COLORTYPE_RGBA ) && + (pData->iPROMcolortype != MNG_COLORTYPE_RGBA ) ) || +#ifdef MNG_INCLUDE_JNG + ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAY ) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGGRAY ) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGCOLOR ) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGGRAYA ) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGCOLORA) ) || + ((pBuf->iColortype == MNG_COLORTYPE_JPEGCOLOR ) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGCOLOR ) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGCOLORA) ) || + ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAYA ) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGGRAYA ) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGCOLORA) ) || + ((pBuf->iColortype == MNG_COLORTYPE_JPEGCOLORA) && + (pData->iPROMcolortype != MNG_COLORTYPE_JPEGCOLORA) ) || +#endif + ((pBuf->iColortype == MNG_COLORTYPE_INDEXED ) && + (pData->iPROMcolortype != MNG_COLORTYPE_INDEXED ) && + (pData->iPROMcolortype != MNG_COLORTYPE_RGB ) && + (pData->iPROMcolortype != MNG_COLORTYPE_RGBA ) ) ) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + + iRetcode = mng_promote_imageobject (pData, pImage, pData->iPROMbitdepth, + pData->iPROMcolortype, pData->iPROMfilltype); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_PROM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_process_display_ipng (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IPNG, MNG_LC_START); +#endif + /* indicate it for what it is now */ + pData->iDeltaImagetype = MNG_IMAGETYPE_PNG; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_process_display_ijng (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IJNG, MNG_LC_START); +#endif + /* indicate it for what it is now */ + pData->iDeltaImagetype = MNG_IMAGETYPE_JNG; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_pplt (mng_datap pData, + mng_uint8 iType, + mng_uint32 iCount, + mng_palette8ep paIndexentries, + mng_uint8p paAlphaentries, + mng_uint8p paUsedentries) +#else +mng_retcode mng_process_display_pplt (mng_datap pData) +#endif +{ + mng_uint32 iX; + mng_imagep pImage = (mng_imagep)pData->pObjzero; + mng_imagedatap pBuf = pImage->pImgbuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_PPLT, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iX = iCount; +#else + iX = pData->iPPLTcount; +#endif +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + switch (iType) +#else + switch (pData->iPPLTtype) +#endif + { + case MNG_DELTATYPE_REPLACERGB : + { +#ifdef MNG_DECREMENT_LOOPS + for (; iX > 0;iX--) +#else +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = 0; iX < iCount; iX++) +#else + for (iX = 0; iX < pData->iPPLTcount; iX++) +#endif +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (paUsedentries [iX]) + { + pBuf->aPLTEentries [iX].iRed = paIndexentries [iX].iRed; + pBuf->aPLTEentries [iX].iGreen = paIndexentries [iX].iGreen; + pBuf->aPLTEentries [iX].iBlue = paIndexentries [iX].iBlue; + } +#else + if (pData->paPPLTusedentries [iX]) + { + pBuf->aPLTEentries [iX].iRed = pData->paPPLTindexentries [iX].iRed; + pBuf->aPLTEentries [iX].iGreen = pData->paPPLTindexentries [iX].iGreen; + pBuf->aPLTEentries [iX].iBlue = pData->paPPLTindexentries [iX].iBlue; + } +#endif + } + + break; + } + case MNG_DELTATYPE_DELTARGB : + { +#ifdef MNG_DECREMENT_LOOPS + for (; iX > 0;iX--) +#else +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = 0; iX < iCount; iX++) +#else + for (iX = 0; iX < pData->iPPLTcount; iX++) +#endif +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (paUsedentries [iX]) + { + pBuf->aPLTEentries [iX].iRed = + (mng_uint8)(pBuf->aPLTEentries [iX].iRed + + paIndexentries [iX].iRed ); + pBuf->aPLTEentries [iX].iGreen = + (mng_uint8)(pBuf->aPLTEentries [iX].iGreen + + paIndexentries [iX].iGreen); + pBuf->aPLTEentries [iX].iBlue = + (mng_uint8)(pBuf->aPLTEentries [iX].iBlue + + paIndexentries [iX].iBlue ); + } +#else + if (pData->paPPLTusedentries [iX]) + { + pBuf->aPLTEentries [iX].iRed = + (mng_uint8)(pBuf->aPLTEentries [iX].iRed + + pData->paPPLTindexentries [iX].iRed ); + pBuf->aPLTEentries [iX].iGreen = + (mng_uint8)(pBuf->aPLTEentries [iX].iGreen + + pData->paPPLTindexentries [iX].iGreen); + pBuf->aPLTEentries [iX].iBlue = + (mng_uint8)(pBuf->aPLTEentries [iX].iBlue + + pData->paPPLTindexentries [iX].iBlue ); + } +#endif + } + + break; + } + case MNG_DELTATYPE_REPLACEALPHA : + { +#ifdef MNG_DECREMENT_LOOPS + for (; iX > 0;iX--) +#else +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = 0; iX < iCount; iX++) +#else + for (iX = 0; iX < pData->iPPLTcount; iX++) +#endif +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (paUsedentries [iX]) + pBuf->aTRNSentries [iX] = paAlphaentries [iX]; + } +#else + if (pData->paPPLTusedentries [iX]) + pBuf->aTRNSentries [iX] = pData->paPPLTalphaentries [iX]; + } +#endif + + break; + } + case MNG_DELTATYPE_DELTAALPHA : + { +#ifdef MNG_DECREMENT_LOOPS + for (; iX > 0;iX--) +#else +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = 0; iX < iCount; iX++) +#else + for (iX = 0; iX < pData->iPPLTcount; iX++) +#endif +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (paUsedentries [iX]) + pBuf->aTRNSentries [iX] = + (mng_uint8)(pBuf->aTRNSentries [iX] + + paAlphaentries [iX]); +#else + if (pData->paPPLTusedentries [iX]) + pBuf->aTRNSentries [iX] = + (mng_uint8)(pBuf->aTRNSentries [iX] + + pData->paPPLTalphaentries [iX]); +#endif + } + + break; + } + case MNG_DELTATYPE_REPLACERGBA : + { +#ifdef MNG_DECREMENT_LOOPS + for (; iX > 0;iX--) +#else +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = 0; iX < iCount; iX++) +#else + for (iX = 0; iX < pData->iPPLTcount; iX++) +#endif +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (paUsedentries [iX]) + { + pBuf->aPLTEentries [iX].iRed = paIndexentries [iX].iRed; + pBuf->aPLTEentries [iX].iGreen = paIndexentries [iX].iGreen; + pBuf->aPLTEentries [iX].iBlue = paIndexentries [iX].iBlue; + pBuf->aTRNSentries [iX] = paAlphaentries [iX]; + } +#else + if (pData->paPPLTusedentries [iX]) + { + pBuf->aPLTEentries [iX].iRed = pData->paPPLTindexentries [iX].iRed; + pBuf->aPLTEentries [iX].iGreen = pData->paPPLTindexentries [iX].iGreen; + pBuf->aPLTEentries [iX].iBlue = pData->paPPLTindexentries [iX].iBlue; + pBuf->aTRNSentries [iX] = pData->paPPLTalphaentries [iX]; + } +#endif + } + + break; + } + case MNG_DELTATYPE_DELTARGBA : + { +#ifdef MNG_DECREMENT_LOOPS + for (; iX > 0;iX--) +#else +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = 0; iX < iCount; iX++) +#else + for (iX = 0; iX < pData->iPPLTcount; iX++) +#endif +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (paUsedentries [iX]) + { + pBuf->aPLTEentries [iX].iRed = + (mng_uint8)(pBuf->aPLTEentries [iX].iRed + + paIndexentries [iX].iRed ); + pBuf->aPLTEentries [iX].iGreen = + (mng_uint8)(pBuf->aPLTEentries [iX].iGreen + + paIndexentries [iX].iGreen); + pBuf->aPLTEentries [iX].iBlue = + (mng_uint8)(pBuf->aPLTEentries [iX].iBlue + + paIndexentries [iX].iBlue ); + pBuf->aTRNSentries [iX] = + (mng_uint8)(pBuf->aTRNSentries [iX] + + paAlphaentries [iX]); + } +#else + if (pData->paPPLTusedentries [iX]) + { + pBuf->aPLTEentries [iX].iRed = + (mng_uint8)(pBuf->aPLTEentries [iX].iRed + + pData->paPPLTindexentries [iX].iRed ); + pBuf->aPLTEentries [iX].iGreen = + (mng_uint8)(pBuf->aPLTEentries [iX].iGreen + + pData->paPPLTindexentries [iX].iGreen); + pBuf->aPLTEentries [iX].iBlue = + (mng_uint8)(pBuf->aPLTEentries [iX].iBlue + + pData->paPPLTindexentries [iX].iBlue ); + pBuf->aTRNSentries [iX] = + (mng_uint8)(pBuf->aTRNSentries [iX] + + pData->paPPLTalphaentries [iX]); + } +#endif + } + + break; + } + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if ((iType != MNG_DELTATYPE_REPLACERGB) && (iType != MNG_DELTATYPE_DELTARGB)) +#else + if ((pData->iPPLTtype != MNG_DELTATYPE_REPLACERGB) && + (pData->iPPLTtype != MNG_DELTATYPE_DELTARGB ) ) +#endif + { + if (pBuf->bHasTRNS) + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (iCount > pBuf->iTRNScount) + pBuf->iTRNScount = iCount; +#else + if (pData->iPPLTcount > pBuf->iTRNScount) + pBuf->iTRNScount = pData->iPPLTcount; +#endif + } + else + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pBuf->iTRNScount = iCount; + pBuf->bHasTRNS = MNG_TRUE; +#else + pBuf->iTRNScount = pData->iPPLTcount; + pBuf->bHasTRNS = MNG_TRUE; +#endif + } + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if ((iType != MNG_DELTATYPE_REPLACEALPHA) && (iType != MNG_DELTATYPE_DELTAALPHA)) +#else + if ((pData->iPPLTtype != MNG_DELTATYPE_REPLACEALPHA) && + (pData->iPPLTtype != MNG_DELTATYPE_DELTAALPHA ) ) +#endif + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (iCount > pBuf->iPLTEcount) + pBuf->iPLTEcount = iCount; +#else + if (pData->iPPLTcount > pBuf->iPLTEcount) + pBuf->iPLTEcount = pData->iPPLTcount; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_PPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_magn (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMethodX, + mng_uint16 iMX, + mng_uint16 iMY, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint16 iMT, + mng_uint16 iMB, + mng_uint8 iMethodY) +#else +mng_retcode mng_process_display_magn (mng_datap pData) +#endif +{ + mng_uint16 iX; + mng_imagep pImage; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MAGN, MNG_LC_START); +#endif + /* iterate the object-ids */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + for (iX = iFirstid; iX <= iLastid; iX++) +#else + for (iX = pData->iMAGNfirstid; iX <= pData->iMAGNlastid; iX++) +#endif + { + if (iX == 0) /* process object 0 ? */ + { + pImage = (mng_imagep)pData->pObjzero; + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pImage->iMAGN_MethodX = iMethodX; + pImage->iMAGN_MethodY = iMethodY; + pImage->iMAGN_MX = iMX; + pImage->iMAGN_MY = iMY; + pImage->iMAGN_ML = iML; + pImage->iMAGN_MR = iMR; + pImage->iMAGN_MT = iMT; + pImage->iMAGN_MB = iMB; +#else + pImage->iMAGN_MethodX = pData->iMAGNmethodX; + pImage->iMAGN_MethodY = pData->iMAGNmethodY; + pImage->iMAGN_MX = pData->iMAGNmX; + pImage->iMAGN_MY = pData->iMAGNmY; + pImage->iMAGN_ML = pData->iMAGNmL; + pImage->iMAGN_MR = pData->iMAGNmR; + pImage->iMAGN_MT = pData->iMAGNmT; + pImage->iMAGN_MB = pData->iMAGNmB; +#endif + } + else + { + pImage = mng_find_imageobject (pData, iX); + /* object exists & is not frozen ? */ + if ((pImage) && (!pImage->bFrozen)) + { /* previous magnification to be done ? */ + if ((pImage->iMAGN_MethodX) || (pImage->iMAGN_MethodY)) + { + mng_retcode iRetcode = mng_magnify_imageobject (pData, pImage); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pImage->iMAGN_MethodX = iMethodX; + pImage->iMAGN_MethodY = iMethodY; + pImage->iMAGN_MX = iMX; + pImage->iMAGN_MY = iMY; + pImage->iMAGN_ML = iML; + pImage->iMAGN_MR = iMR; + pImage->iMAGN_MT = iMT; + pImage->iMAGN_MB = iMB; +#else + pImage->iMAGN_MethodX = pData->iMAGNmethodX; + pImage->iMAGN_MethodY = pData->iMAGNmethodY; + pImage->iMAGN_MX = pData->iMAGNmX; + pImage->iMAGN_MY = pData->iMAGNmY; + pImage->iMAGN_ML = pData->iMAGNmL; + pImage->iMAGN_MR = pData->iMAGNmR; + pImage->iMAGN_MT = pData->iMAGNmT; + pImage->iMAGN_MB = pData->iMAGNmB; +#endif + } + } + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pData->iMAGNfromid = iFirstid; + pData->iMAGNtoid = iLastid; + iX = iFirstid; +#else + pData->iMAGNfromid = pData->iMAGNfirstid; + pData->iMAGNtoid = pData->iMAGNlastid; + iX = pData->iMAGNfirstid; +#endif + /* iterate again for showing */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + while ((iX <= iLastid) && (!pData->bTimerset)) +#else + while ((iX <= pData->iMAGNlastid) && (!pData->bTimerset)) +#endif + { + pData->iMAGNcurrentid = iX; + + if (iX) /* only real objects ! */ + { + pImage = mng_find_imageobject (pData, iX); + /* object exists & is not frozen & + is visible & is viewable ? */ + if ((pImage) && (!pImage->bFrozen) && + (pImage->bVisible) && (pImage->bViewable)) + { + mng_retcode iRetcode = mng_display_image (pData, pImage, MNG_FALSE); + if (iRetcode) + return iRetcode; + } + } + + iX++; + } + + if (pData->bTimerset) /* broken ? */ + pData->iBreakpoint = 9; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_display_magn2 (mng_datap pData) +{ + mng_uint16 iX; + mng_imagep pImage; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MAGN, MNG_LC_START); +#endif + + iX = pData->iMAGNcurrentid; + /* iterate again for showing */ + while ((iX <= pData->iMAGNtoid) && (!pData->bTimerset)) + { + pData->iMAGNcurrentid = iX; + + if (iX) /* only real objects ! */ + { + pImage = mng_find_imageobject (pData, iX); + /* object exists & is not frozen & + is visible & is viewable ? */ + if ((pImage) && (!pImage->bFrozen) && + (pImage->bVisible) && (pImage->bViewable)) + { + mng_retcode iRetcode = mng_display_image (pData, pImage, MNG_FALSE); + if (iRetcode) + return iRetcode; + } + } + + iX++; + } + + if (pData->bTimerset) /* broken ? */ + pData->iBreakpoint = 9; + else + pData->iBreakpoint = 0; /* not again ! */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +mng_retcode mng_process_display_past (mng_datap pData, + mng_uint16 iTargetid, + mng_uint8 iTargettype, + mng_int32 iTargetx, + mng_int32 iTargety, + mng_uint32 iCount, + mng_ptr pSources) +#else +mng_retcode mng_process_display_past (mng_datap pData) +#endif +{ + mng_retcode iRetcode = MNG_NOERROR; + mng_imagep pTargetimg; + mng_imagep pSourceimg; +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + mng_past_sourcep pSource = (mng_past_sourcep)pSources; +#else + mng_past_sourcep pSource = (mng_past_sourcep)pData->pPASTsources; +#endif + mng_uint32 iX = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_PAST, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (iTargetid) /* a real destination object ? */ +#else + if (pData->iPASTtargetid) /* a real destination object ? */ +#endif + { /* let's find it then */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pTargetimg = (mng_imagep)mng_find_imageobject (pData, iTargetid); +#else + pTargetimg = (mng_imagep)mng_find_imageobject (pData, pData->iPASTtargetid); +#endif + + if (!pTargetimg) /* if it doesn't exists; do a barf */ + MNG_ERROR (pData, MNG_OBJECTUNKNOWN); + /* it's gotta be abstract !!! */ + if (pTargetimg->pImgbuf->bConcrete) + MNG_ERROR (pData, MNG_OBJNOTABSTRACT); + /* we want 32-/64-bit RGBA to play with ! */ + if ((pTargetimg->pImgbuf->iBitdepth <= MNG_BITDEPTH_8) || + (pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_GRAY) || + (pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_RGB) || + (pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_INDEXED) || + (pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_GRAYA) ) + iRetcode = mng_promote_imageobject (pData, pTargetimg, MNG_BITDEPTH_8, + MNG_COLORTYPE_RGBA, + MNG_FILLMETHOD_LEFTBITREPLICATE); + else + if ((pTargetimg->pImgbuf->iBitdepth > MNG_BITDEPTH_8) && + ((pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_GRAY) || + (pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_RGB) || + (pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_GRAYA) ) ) + iRetcode = mng_promote_imageobject (pData, pTargetimg, MNG_BITDEPTH_16, + MNG_COLORTYPE_RGBA, + MNG_FILLMETHOD_LEFTBITREPLICATE); +#ifdef MNG_INCLUDE_JNG + else + if ((pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_JPEGGRAY) || + (pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_JPEGCOLOR) || + (pTargetimg->pImgbuf->iColortype == MNG_COLORTYPE_JPEGGRAYA) ) + iRetcode = mng_promote_imageobject (pData, pTargetimg, + pTargetimg->pImgbuf->iBitdepth, + MNG_COLORTYPE_JPEGCOLORA, + MNG_FILLMETHOD_LEFTBITREPLICATE); +#endif + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* make it really abstract ? */ + if (!pTargetimg->pImgbuf->bCorrected) + { + iRetcode = mng_colorcorrect_object (pData, pTargetimg); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + else + { /* pasting into object 0 !!! */ + pTargetimg = (mng_imagep)pData->pObjzero; + /* is it usable ??? */ + if ((pTargetimg->bClipped) && + (pTargetimg->iClipr > pTargetimg->iPosx) && + (pTargetimg->iClipb > pTargetimg->iPosy)) + { + /* make it 32-bit RGBA please !!! */ + iRetcode = mng_reset_object_details (pData, pTargetimg, + pTargetimg->iClipr - pTargetimg->iPosx, + pTargetimg->iClipb - pTargetimg->iPosy, + MNG_BITDEPTH_8, MNG_COLORTYPE_RGBA, + 0, 0, 0, MNG_FALSE); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + else + pTargetimg = MNG_NULL; /* clipped beyond visibility ! */ + } + + if (pTargetimg) /* usable destination ? */ + { + mng_int32 iSourceY; + mng_int32 iSourceYinc; + mng_int32 iSourcerowsize; + mng_int32 iSourcesamples; + mng_bool bSourceRGBA16; + mng_int32 iTargetY; + mng_int32 iTargetrowsize; + mng_int32 iTargetsamples; + mng_bool bTargetRGBA16 = MNG_FALSE; + mng_int32 iTemprowsize; + mng_imagedatap pBuf; +#ifndef MNG_SKIPCHUNK_MAGN + /* needs magnification ? */ + if ((pTargetimg->iMAGN_MethodX) || (pTargetimg->iMAGN_MethodY)) + iRetcode = mng_magnify_imageobject (pData, pTargetimg); +#endif + + if (!iRetcode) /* still ok ? */ + { + bTargetRGBA16 = (mng_bool)(pTargetimg->pImgbuf->iBitdepth > 8); + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + switch (iTargettype) /* determine target x/y */ +#else + switch (pData->iPASTtargettype) /* determine target x/y */ +#endif + { + case 0 : { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pData->iPastx = iTargetx; + pData->iPasty = iTargety; +#else + pData->iPastx = pData->iPASTtargetx; + pData->iPasty = pData->iPASTtargety; +#endif + break; + } + + case 1 : { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pData->iPastx = pTargetimg->iPastx + iTargetx; + pData->iPasty = pTargetimg->iPasty + iTargety; +#else + pData->iPastx = pTargetimg->iPastx + pData->iPASTtargetx; + pData->iPasty = pTargetimg->iPasty + pData->iPASTtargety; +#endif + break; + } + + case 2 : { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pData->iPastx += iTargetx; + pData->iPasty += iTargety; +#else + pData->iPastx += pData->iPASTtargetx; + pData->iPasty += pData->iPASTtargety; +#endif + break; + } + } + /* save for next time ... */ + pTargetimg->iPastx = pData->iPastx; + pTargetimg->iPasty = pData->iPasty; + /* address destination for row-routines */ + pData->pStoreobj = (mng_objectp)pTargetimg; + pData->pStorebuf = (mng_objectp)pTargetimg->pImgbuf; + } + /* process the sources one by one */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + while ((!iRetcode) && (iX < iCount)) +#else + while ((!iRetcode) && (iX < pData->iPASTcount)) +#endif + { /* find the little bastards first */ + pSourceimg = (mng_imagep)mng_find_imageobject (pData, pSource->iSourceid); + /* exists and viewable? */ + if ((pSourceimg) && (pSourceimg->bViewable)) + { /* needs magnification ? */ +#ifndef MNG_SKIPCHUNK_MAGN + if ((pSourceimg->iMAGN_MethodX) || (pSourceimg->iMAGN_MethodY)) + iRetcode = mng_magnify_imageobject (pData, pSourceimg); +#endif + + if (!iRetcode) /* still ok ? */ + { + pBuf = (mng_imagedatap)pSourceimg->pImgbuf; + /* address source for row-routines */ + pData->pRetrieveobj = (mng_objectp)pSourceimg; + + pData->iPass = -1; /* init row-processing variables */ + pData->iRowinc = 1; + pData->iColinc = 1; + pData->iPixelofs = 0; + iSourcesamples = (mng_int32)pBuf->iWidth; + iSourcerowsize = pBuf->iRowsize; + bSourceRGBA16 = (mng_bool)(pBuf->iBitdepth > 8); + /* make sure the delta-routines do the right thing */ + pData->iDeltatype = MNG_DELTATYPE_BLOCKPIXELREPLACE; + + switch (pBuf->iColortype) + { + case 0 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bSourceRGBA16) + pData->fRetrieverow = (mng_fptr)mng_retrieve_g16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_g8; + + pData->bIsOpaque = (mng_bool)(!pBuf->bHasTRNS); + break; + } + + case 2 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bSourceRGBA16) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb8; + + pData->bIsOpaque = (mng_bool)(!pBuf->bHasTRNS); + break; + } + + + case 3 : { pData->fRetrieverow = (mng_fptr)mng_retrieve_idx8; + pData->bIsOpaque = (mng_bool)(!pBuf->bHasTRNS); + break; + } + + + case 4 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bSourceRGBA16) + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + + case 6 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bSourceRGBA16) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + case 8 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bSourceRGBA16) + pData->fRetrieverow = (mng_fptr)mng_retrieve_g16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_g8; + + pData->bIsOpaque = MNG_TRUE; + break; + } + + case 10 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bSourceRGBA16) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb8; + + pData->bIsOpaque = MNG_TRUE; + break; + } + + + case 12 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bSourceRGBA16) + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_ga8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + + + case 14 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bSourceRGBA16) + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba16; + else +#endif + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8; + + pData->bIsOpaque = MNG_FALSE; + break; + } + } + /* determine scaling */ +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_NO_DELTA_PNG + if ((!bSourceRGBA16) && (bTargetRGBA16)) + pData->fScalerow = (mng_fptr)mng_scale_rgba8_rgba16; + else + if ((bSourceRGBA16) && (!bTargetRGBA16)) + pData->fScalerow = (mng_fptr)mng_scale_rgba16_rgba8; + else +#endif +#endif + pData->fScalerow = MNG_NULL; + + /* default no color-correction */ + pData->fCorrectrow = MNG_NULL; + +#if defined(MNG_FULL_CMS) /* determine color-management routine */ + iRetcode = mng_init_full_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#elif defined(MNG_GAMMA_ONLY) + iRetcode = mng_init_gamma_only (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#elif defined(MNG_APP_CMS) + iRetcode = mng_init_app_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#endif + } + + if (!iRetcode) /* still ok ? */ + { + pData->fFliprow = MNG_NULL; /* no flipping or tiling by default */ + pData->fTilerow = MNG_NULL; + /* but perhaps we do have to ... */ + switch (pSource->iOrientation) + { + case 2 : ; + case 4 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bTargetRGBA16) + pData->fFliprow = (mng_fptr)mng_flip_rgba16; + else +#endif + pData->fFliprow = (mng_fptr)mng_flip_rgba8; + break; + } + + case 8 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (bTargetRGBA16) + pData->fTilerow = (mng_fptr)mng_tile_rgba16; + else +#endif + pData->fTilerow = (mng_fptr)mng_tile_rgba8; + break; + } + } + /* determine composition routine */ + /* note that we're abusing the delta-routine setup !!! */ + switch (pSource->iComposition) + { + case 0 : { /* composite over */ +#ifndef MNG_NO_16BIT_SUPPORT + if (bTargetRGBA16) + pData->fDeltarow = (mng_fptr)mng_composeover_rgba16; + else +#endif + pData->fDeltarow = (mng_fptr)mng_composeover_rgba8; + break; + } + + case 1 : { /* replace */ +#ifndef MNG_NO_16BIT_SUPPORT + if (bTargetRGBA16) + pData->fDeltarow = (mng_fptr)mng_delta_rgba16_rgba16; + else +#endif + pData->fDeltarow = (mng_fptr)mng_delta_rgba8_rgba8; + break; + } + + case 2 : { /* composite under */ +#ifndef MNG_NO_16BIT_SUPPORT + if (bTargetRGBA16) + pData->fDeltarow = (mng_fptr)mng_composeunder_rgba16; + else +#endif + pData->fDeltarow = (mng_fptr)mng_composeunder_rgba8; + break; + } + } + /* determine offsets & clipping */ + if (pSource->iOffsettype == 1) + { + pData->iDestl = pData->iPastx + pSource->iOffsetx; + pData->iDestt = pData->iPasty + pSource->iOffsety; + } + else + { + pData->iDestl = pSource->iOffsetx; + pData->iDestt = pSource->iOffsety; + } + + pData->iDestr = (mng_int32)pTargetimg->pImgbuf->iWidth; + pData->iDestb = (mng_int32)pTargetimg->pImgbuf->iHeight; + /* take the source dimension into account ? */ + if (pSource->iOrientation != 8) + { + pData->iDestr = MIN_COORD (pData->iDestr, pData->iDestl + (mng_int32)pBuf->iWidth); + pData->iDestb = MIN_COORD (pData->iDestb, pData->iDestt + (mng_int32)pBuf->iHeight); + } + /* source clipping */ + if (pSource->iBoundarytype == 1) + { + if (pData->iDestl < pData->iPastx + pSource->iBoundaryl) + pData->iSourcel = pData->iPastx + pSource->iBoundaryl - pData->iDestl; + else + pData->iSourcel = 0; + + if (pData->iDestt < pData->iPasty + pSource->iBoundaryt) + pData->iSourcet = pData->iPasty + pSource->iBoundaryt - pData->iDestt; + else + pData->iSourcet = 0; + + pData->iDestl = MAX_COORD (pData->iDestl, pData->iPastx + pSource->iBoundaryl); + pData->iDestt = MAX_COORD (pData->iDestt, pData->iPasty + pSource->iBoundaryt); + pData->iDestr = MIN_COORD (pData->iDestr, pData->iPastx + pSource->iBoundaryr); + pData->iDestb = MIN_COORD (pData->iDestb, pData->iPasty + pSource->iBoundaryb); + } + else + { + if (pData->iDestl < pSource->iBoundaryl) + pData->iSourcel = pSource->iBoundaryl - pData->iDestl; + else + pData->iSourcel = 0; + + if (pData->iDestt < pSource->iBoundaryt) + pData->iSourcet = pSource->iBoundaryt - pData->iDestt; + else + pData->iSourcet = 0; + + pData->iDestl = MAX_COORD (pData->iDestl, pSource->iBoundaryl); + pData->iDestt = MAX_COORD (pData->iDestt, pSource->iBoundaryt); + pData->iDestr = MIN_COORD (pData->iDestr, pSource->iBoundaryr); + pData->iDestb = MIN_COORD (pData->iDestb, pSource->iBoundaryb); + } + + if (pData->iSourcel) /* indent source ? */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (bTargetRGBA16) /* abuse tiling routine to shift source-pixels */ + pData->fTilerow = (mng_fptr)mng_tile_rgba16; + else +#endif + pData->fTilerow = (mng_fptr)mng_tile_rgba8; + } + /* anything to display ? */ + if ((pData->iDestl <= pData->iDestr) && (pData->iDestt <= pData->iDestb)) + { /* init variables for the loop */ + if ((pSource->iOrientation == 2) || (pSource->iOrientation == 6)) + { + iSourceY = (mng_int32)pBuf->iHeight - 1 - pData->iSourcet; + iSourceYinc = -1; + } + else + { + iSourceY = pData->iSourcet; + iSourceYinc = 1; + } + + iTargetY = pData->iDestt; + pData->iCol = pData->iDestl; + + iTargetsamples = pData->iDestr - pData->iDestl; + +#ifndef MNG_NO_16BIT_SUPPORT + if (bTargetRGBA16) + iTargetrowsize = (iTargetsamples << 3); + else +#endif + iTargetrowsize = (iTargetsamples << 2); + + /* get temporary work-buffers */ + if (iSourcerowsize > iTargetrowsize) + iTemprowsize = iSourcerowsize << 1; + else + iTemprowsize = iTargetrowsize << 1; + MNG_ALLOC (pData, pData->pRGBArow, iTemprowsize); + MNG_ALLOC (pData, pData->pWorkrow, iTemprowsize); + + while ((!iRetcode) && (iTargetY < pData->iDestb)) + { /* get a row */ + pData->iRow = iSourceY; + pData->iRowsamples = iSourcesamples; + pData->iRowsize = iSourcerowsize; + pData->bIsRGBA16 = bSourceRGBA16; + iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData); + /* scale it (if necessary) */ + if ((!iRetcode) && (pData->fScalerow)) + iRetcode = ((mng_scalerow)pData->fScalerow) (pData); + + pData->bIsRGBA16 = bTargetRGBA16; + /* color correction (if necessary) */ + if ((!iRetcode) && (pData->fCorrectrow)) + iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData); + /* flipping (if necessary) */ + if ((!iRetcode) && (pData->fFliprow)) + iRetcode = ((mng_fliprow)pData->fFliprow) (pData); + /* tiling (if necessary) */ + if ((!iRetcode) && (pData->fTilerow)) + iRetcode = ((mng_tilerow)pData->fTilerow) (pData); + + if (!iRetcode) /* and paste..... */ + { + pData->iRow = iTargetY; + pData->iRowsamples = iTargetsamples; + pData->iRowsize = iTargetrowsize; + iRetcode = ((mng_deltarow)pData->fDeltarow) (pData); + } + + iSourceY += iSourceYinc; /* and next line */ + + if (iSourceY < 0) + iSourceY = (mng_int32)pBuf->iHeight - 1; + else + if (iSourceY >= (mng_int32)pBuf->iHeight) + iSourceY = 0; + + iTargetY++; + } + /* drop the temporary row-buffer */ + MNG_FREEX (pData, pData->pWorkrow, iTemprowsize); + MNG_FREEX (pData, pData->pRGBArow, iTemprowsize); + } + +#if defined(MNG_FULL_CMS) /* cleanup cms stuff */ + if (!iRetcode) + iRetcode = mng_clear_cms (pData); +#endif + } + + pSource++; /* neeeeext */ + iX++; + } + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + if (!iTargetid) /* did we paste into object 0 ? */ +#else + if (!pData->iPASTtargetid) /* did we paste into object 0 ? */ +#endif + { /* display it then ! */ + iRetcode = mng_display_image (pData, pTargetimg, MNG_FALSE); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + else + { /* target is visible & viewable ? */ + if ((pTargetimg->bVisible) && (pTargetimg->bViewable)) + { + iRetcode = mng_display_image (pData, pTargetimg, MNG_FALSE); + if (iRetcode) + return iRetcode; + } + } + } + + if (pData->bTimerset) /* broken ? */ + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + pData->iPASTid = iTargetid; +#else + pData->iPASTid = pData->iPASTtargetid; +#endif + pData->iBreakpoint = 11; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_PAST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SKIPCHUNK_PAST */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_process_display_past2 (mng_datap pData) +{ + mng_retcode iRetcode; + mng_imagep pTargetimg; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_PAST, MNG_LC_START); +#endif + + if (pData->iPASTid) /* a real destination object ? */ + pTargetimg = (mng_imagep)mng_find_imageobject (pData, pData->iPASTid); + else /* otherwise object 0 */ + pTargetimg = (mng_imagep)pData->pObjzero; + + iRetcode = mng_display_image (pData, pTargetimg, MNG_FALSE); + if (iRetcode) + return iRetcode; + + pData->iBreakpoint = 0; /* only once */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_PAST, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SKIPCHUNK_PAST */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_DISPLAY_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + + diff --git a/src/3rdparty/libmng/libmng_display.h b/src/3rdparty/libmng/libmng_display.h new file mode 100644 index 0000000000..f394dd2f6d --- /dev/null +++ b/src/3rdparty/libmng/libmng_display.h @@ -0,0 +1,343 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_display.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Display management (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the display managament routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.5.2 - 05/20/2000 - G.Juyn * */ +/* * - added JNG support stuff * */ +/* * * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - changed progressive-display processing * */ +/* * 0.5.3 - 06/22/2000 - G.Juyn * */ +/* * - added support for delta-image processing * */ +/* * - added support for PPLT chunk processing * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * 0.9.3 - 08/07/2000 - G.Juyn * */ +/* * - B111300 - fixup for improved portability * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added JDAA chunk * */ +/* * * */ +/* * 0.9.4 - 11/24/2000 - G.Juyn * */ +/* * - moved restore of object 0 to libmng_display * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/13/2002 - G.Juyn * */ +/* * - fixed read/write of MAGN chunk * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - added proposed change in handling of TERM- & if-delay * */ +/* * 1.0.5 - 10/20/2002 - G.Juyn * */ +/* * - fixed display of visible target of PAST operation * */ +/* * * */ +/* * 1.0.7 - 03/24/2004 - G.R-P. * */ +/* * - added some SKIPCHUNK conditionals * */ +/* * * */ +/* * 1.0.9 - 12/11/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_DISPLAYCALLS * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_display_h_ +#define _libmng_display_h_ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_DISPLAY_PROCS + +/* ************************************************************************** */ + +mng_retcode mng_display_progressive_refresh (mng_datap pData, + mng_uint32 iInterval); + +/* ************************************************************************** */ + +mng_retcode mng_reset_objzero (mng_datap pData); + +mng_retcode mng_display_image (mng_datap pData, + mng_imagep pImage, + mng_bool bLayeradvanced); + +mng_retcode mng_execute_delta_image (mng_datap pData, + mng_imagep pTarget, + mng_imagep pDelta); + +/* ************************************************************************** */ + +mng_retcode mng_process_display (mng_datap pData); + +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT +png_imgtype mng_png_imgtype (mng_uint8 colortype, + mng_uint8 bitdepth); +#endif + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + +mng_retcode mng_process_display_ihdr (mng_datap pData); + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +mng_retcode mng_process_display_mpng (mng_datap pData); +#endif + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +mng_retcode mng_process_display_ang (mng_datap pData); +#endif + +mng_retcode mng_process_display_idat (mng_datap pData, + mng_uint32 iRawlen, + mng_uint8p pRawdata); + +mng_retcode mng_process_display_iend (mng_datap pData); +mng_retcode mng_process_display_mend (mng_datap pData); +mng_retcode mng_process_display_mend2 (mng_datap pData); +mng_retcode mng_process_display_defi (mng_datap pData); + +#ifndef MNG_SKIPCHUNK_BASI +mng_retcode mng_process_display_basi (mng_datap pData, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_bool bHasalpha, + mng_uint16 iAlpha, + mng_uint8 iViewable); +#endif + +#ifndef MNG_SKIPCHUNK_CLON +mng_retcode mng_process_display_clon (mng_datap pData, + mng_uint16 iSourceid, + mng_uint16 iCloneid, + mng_uint8 iClonetype, + mng_bool bHasdonotshow, + mng_uint8 iDonotshow, + mng_uint8 iConcrete, + mng_bool bHasloca, + mng_uint8 iLocationtype, + mng_int32 iLocationx, + mng_int32 iLocationy); +mng_retcode mng_process_display_clon2 (mng_datap pData); +#endif + +#ifndef MNG_SKIPCHUNK_DISC +mng_retcode mng_process_display_disc (mng_datap pData, + mng_uint32 iCount, + mng_uint16p pIds); +#endif + +#ifndef MNG_SKIPCHUNK_FRAM +mng_retcode mng_process_display_fram (mng_datap pData, + mng_uint8 iFramemode, + mng_uint8 iChangedelay, + mng_uint32 iDelay, + mng_uint8 iChangetimeout, + mng_uint32 iTimeout, + mng_uint8 iChangeclipping, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb); +mng_retcode mng_process_display_fram2 (mng_datap pData); +#endif + +#ifndef MNG_SKIPCHUNK_MOVE +mng_retcode mng_process_display_move (mng_datap pData, + mng_uint16 iFromid, + mng_uint16 iToid, + mng_uint8 iMovetype, + mng_int32 iMovex, + mng_int32 iMovey); +#endif + +#ifndef MNG_SKIPCHUNK_CLIP +mng_retcode mng_process_display_clip (mng_datap pData, + mng_uint16 iFromid, + mng_uint16 iToid, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb); +#endif + +#ifndef MNG_SKIPCHUNK_SHOW +mng_retcode mng_process_display_show (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_process_display_save (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode mng_process_display_seek (mng_datap pData); +#endif +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_process_display_jhdr (mng_datap pData); + +mng_retcode mng_process_display_jdaa (mng_datap pData, + mng_uint32 iRawlen, + mng_uint8p pRawdata); + +mng_retcode mng_process_display_jdat (mng_datap pData, + mng_uint32 iRawlen, + mng_uint8p pRawdata); + +#endif +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_process_display_dhdr (mng_datap pData, + mng_uint16 iObjectid, + mng_uint8 iImagetype, + mng_uint8 iDeltatype, + mng_uint32 iBlockwidth, + mng_uint32 iBlockheight, + mng_uint32 iBlockx, + mng_uint32 iBlocky); + +mng_retcode mng_process_display_prom (mng_datap pData, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iFilltype); + +mng_retcode mng_process_display_ipng (mng_datap pData); +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_process_display_ijng (mng_datap pData); +#endif + +mng_retcode mng_process_display_pplt (mng_datap pData, + mng_uint8 iType, + mng_uint32 iCount, + mng_palette8ep paIndexentries, + mng_uint8p paAlphaentries, + mng_uint8p paUsedentries); +#endif + +#ifndef MNG_SKIPCHUNK_MAGN +mng_retcode mng_process_display_magn (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMethodX, + mng_uint16 iMX, + mng_uint16 iMY, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint16 iMT, + mng_uint16 iMB, + mng_uint8 iMethodY); +mng_retcode mng_process_display_magn2 (mng_datap pData); +#endif + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_process_display_past (mng_datap pData, + mng_uint16 iTargetid, + mng_uint8 iTargettype, + mng_int32 iTargetx, + mng_int32 iTargety, + mng_uint32 iCount, + mng_ptr pSources); +mng_retcode mng_process_display_past2 (mng_datap pData); +#endif + +#else /* MNG_OPTIMIZE_DISPLAYCALLS */ + +mng_retcode mng_process_display_ihdr (mng_datap pData); +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +mng_retcode mng_process_display_mpng (mng_datap pData); +#endif +mng_retcode mng_process_display_idat (mng_datap pData); +mng_retcode mng_process_display_iend (mng_datap pData); +mng_retcode mng_process_display_mend (mng_datap pData); +mng_retcode mng_process_display_mend2 (mng_datap pData); +mng_retcode mng_process_display_defi (mng_datap pData); +#ifndef MNG_SKIPCHUNK_BASI +mng_retcode mng_process_display_basi (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_CLON +mng_retcode mng_process_display_clon (mng_datap pData); +mng_retcode mng_process_display_clon2 (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_DISC +mng_retcode mng_process_display_disc (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_FRAM +mng_retcode mng_process_display_fram (mng_datap pData); +mng_retcode mng_process_display_fram2 (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_MOVE +mng_retcode mng_process_display_move (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_CLIP +mng_retcode mng_process_display_clip (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_SHOW +mng_retcode mng_process_display_show (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_process_display_save (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode mng_process_display_seek (mng_datap pData); +#endif +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_process_display_jhdr (mng_datap pData); +mng_retcode mng_process_display_jdaa (mng_datap pData); +mng_retcode mng_process_display_jdat (mng_datap pData); +#endif +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_process_display_dhdr (mng_datap pData); +mng_retcode mng_process_display_prom (mng_datap pData); +mng_retcode mng_process_display_ipng (mng_datap pData); +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_process_display_ijng (mng_datap pData); +#endif +mng_retcode mng_process_display_pplt (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_MAGN +mng_retcode mng_process_display_magn (mng_datap pData); +mng_retcode mng_process_display_magn2 (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_process_display_past (mng_datap pData); +mng_retcode mng_process_display_past2 (mng_datap pData); +#endif + +#endif /* MNG_OPTIMIZE_DISPLAYCALLS */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_DISPLAY_PROCS */ + +/* ************************************************************************** */ + +#endif /* _libmng_display_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_dither.c b/src/3rdparty/libmng/libmng_dither.c new file mode 100644 index 0000000000..e23850cef4 --- /dev/null +++ b/src/3rdparty/libmng/libmng_dither.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_dither.c copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : Dithering routines (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the dithering routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_dither.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +mng_retcode mng_dither_a_row (mng_datap pData, + mng_uint8p pRow) +{ + + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + + + diff --git a/src/3rdparty/libmng/libmng_dither.h b/src/3rdparty/libmng/libmng_dither.h new file mode 100644 index 0000000000..d9217c0cac --- /dev/null +++ b/src/3rdparty/libmng/libmng_dither.h @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_dither.h copyright (c) 2000-2002 G.Juyn * */ +/* * version : 1.0.5 * */ +/* * * */ +/* * purpose : Dithering routines (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the dithering routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_dither_h_ +#define _libmng_dither_h_ + +/* ************************************************************************** */ + +mng_retcode mng_dither_a_row (mng_datap pData, + mng_uint8p pRow); + +/* ************************************************************************** */ + +#endif /* _libmng_dither_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_error.c b/src/3rdparty/libmng/libmng_error.c new file mode 100644 index 0000000000..3a4da20638 --- /dev/null +++ b/src/3rdparty/libmng/libmng_error.c @@ -0,0 +1,326 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_error.c copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Error routines (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the general error handling routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.5.2 - 05/23/2000 - G.Juyn * */ +/* * - added error telltaling * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added errorstrings for delta-image processing * */ +/* * 0.5.2 - 05/31/2000 - G.Juyn * */ +/* * - fixed up punctuation (contributed by Tim Rowley) * */ +/* * 0.5.2 - 06/06/2000 - G.Juyn * */ +/* * - added errorstring for delayed buffer-processing * */ +/* * * */ +/* * 0.9.1 - 07/06/2000 - G.Juyn * */ +/* * - added MNG_NEEDTIMERWAIT errorstring * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added NEEDSECTIONWAIT errorstring * */ +/* * - added macro + routine to set returncode without * */ +/* * calling error callback * */ +/* * 0.9.1 - 07/19/2000 - G.Juyn * */ +/* * - added errorstring for updatemngheader if not a MNG * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/09/2000 - G.Juyn * */ +/* * - added check for simplicity-bits in MHDR * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - fixed processing of unknown critical chunks * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/20/2000 - G.Juyn * */ +/* * - added errorcode for delayed delta-processing * */ +/* * * */ +/* * 0.9.4 - 01/18/2001 - G.Juyn * */ +/* * - added errorcode for MAGN methods * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added optimization option for MNG-video playback * */ +/* * * */ +/* * 1.0.5 - 07/04/2002 - G.Juyn * */ +/* * - added errorcode for extreme chunk-sizes * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed delta-image support * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - fixed LOOP iteration=0 special case * */ +/* * 1.0.5 - 09/19/2002 - G.Juyn * */ +/* * - warnings are ignored by default now! * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - added check for TERM placement during create/write * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G. R-P * */ +/* * - added MNG_SKIPCHUNK_CHNK, MNG_NO_DELTA_PNG reductions. * */ +/* * - skipped more code when MNG_INCLUDE_JNG is not enabled. * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditional around evNT chunk support * */ +/* * * */ +/* * 1.0.7 - 03/24/2004 - G.R-P * */ +/* * - fixed typo on SKIPCHUNK_evNT (->PAST) * */ +/* * * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ERROR_STRINGS +MNG_LOCAL mng_error_entry const error_table [] = + { + {MNG_NOERROR, "No error"}, + {MNG_OUTOFMEMORY, "Out of memory"}, + {MNG_INVALIDHANDLE, "The handle is invalid"}, + {MNG_NOCALLBACK, "A required callback is not defined"}, + {MNG_UNEXPECTEDEOF, "Encountered unexpected end-of-file"}, + {MNG_ZLIBERROR, "zlib encountered an error"}, +#ifdef MNG_INCLUDE_JNG + {MNG_JPEGERROR, "ijgsrc6b encountered an error"}, +#endif + {MNG_LCMSERROR, "lcms encountered an error"}, + {MNG_NOOUTPUTPROFILE, "No output-profile defined for CMS"}, + {MNG_NOSRGBPROFILE, "No sRGB-profile defined for CMS"}, + {MNG_BUFOVERFLOW, "Internal buffer-overflow"}, + {MNG_FUNCTIONINVALID, "Function is invalid at this point"}, + {MNG_OUTPUTERROR, "Writing was unsuccessful; disk full?"}, + {MNG_JPEGBUFTOOSMALL, "Internal buffer for JPEG processing too small"}, + {MNG_NEEDMOREDATA, "Reading suspended; waiting for I/O to catch up"}, + {MNG_NEEDTIMERWAIT, "Timer suspension; normal animation delay"}, + {MNG_NEEDSECTIONWAIT, "SEEK suspension; application decides"}, + {MNG_LOOPWITHCACHEOFF, "LOOP encountered when playback cache is turned off"}, + + {MNG_APPIOERROR, "Application signalled I/O error"}, + {MNG_APPTIMERERROR, "Application signalled timing error"}, + {MNG_APPCMSERROR, "Application signalled CMS error"}, + {MNG_APPMISCERROR, "Application signalled an error"}, + {MNG_APPTRACEABORT, "Application signalled error during trace-callback"}, + + {MNG_INTERNALERROR, "Internal error in libmng"}, + + {MNG_INVALIDSIG, "The signature is invalid"}, + {MNG_INVALIDCRC, "The CRC for this chunk is invalid"}, + {MNG_INVALIDLENGTH, "Chunk-length is invalid"}, + {MNG_SEQUENCEERROR, "Chunk out of sequence"}, + {MNG_CHUNKNOTALLOWED, "Chunk not allowed at this point"}, + {MNG_MULTIPLEERROR, "Chunk cannot occur multiple times"}, + {MNG_PLTEMISSING, "Missing PLTE chunk"}, + {MNG_IDATMISSING, "Missing IDAT chunk(s)"}, + {MNG_CANNOTBEEMPTY, "Chunk cannot be empty"}, + {MNG_GLOBALLENGTHERR, "Global data length invalid"}, + {MNG_INVALIDBITDEPTH, "The bit_depth is invalid"}, + {MNG_INVALIDCOLORTYPE, "The color_type is invalid"}, + {MNG_INVALIDCOMPRESS, "The compression_method is invalid"}, + {MNG_INVALIDFILTER, "The filter_method or filter_type is invalid"}, + {MNG_INVALIDINTERLACE, "The interlace_method is invalid"}, + {MNG_NOTENOUGHIDAT, "There is not enough data in the IDAT chunk(s)"}, + {MNG_PLTEINDEXERROR, "Palette-index out of bounds"}, + {MNG_NULLNOTFOUND, "NULL separator not found"}, + {MNG_KEYWORDNULL, "Keyword cannot be zero-length"}, + {MNG_OBJECTUNKNOWN, "Object does not exist"}, + {MNG_OBJECTEXISTS, "Object already exists"}, + {MNG_TOOMUCHIDAT, "Too much data in IDAT chunk(s)"}, + {MNG_INVSAMPLEDEPTH, "The sample_depth is invalid"}, + {MNG_INVOFFSETSIZE, "The offset_type is invalid"}, + {MNG_INVENTRYTYPE, "The entry_type is invalid"}, + {MNG_ENDWITHNULL, "Chunk must not end with NULL byte"}, + {MNG_INVIMAGETYPE, "The image_type is invalid"}, +#ifndef MNG_NO_DELTA_PNG + {MNG_INVDELTATYPE, "The delta_type is invalid"}, +#endif + {MNG_INVALIDINDEX, "Index-value out of bounds"}, +#ifdef MNG_INCLUDE_JNG + {MNG_TOOMUCHJDAT, "Too much data in JDAT chunk(s)"}, + {MNG_JPEGPARMSERR, "JHDR parameters & JFIF-data do not match"}, +#endif + {MNG_INVFILLMETHOD, "The fill_method is invalid"}, +#ifndef MNG_NO_DELTA_PNG + {MNG_OBJNOTCONCRETE, "Target object for DHDR must be concrete"}, +#endif + {MNG_TARGETNOALPHA, "Target object must have alpha-channel"}, + {MNG_MNGTOOCOMPLEX, "MHDR simplicity indicates unsupported feature(s)"}, + {MNG_UNKNOWNCRITICAL, "Unknown critical chunk encountered"}, +#ifndef MNG_SKIPCHUNK_nEED + {MNG_UNSUPPORTEDNEED, "Requested nEED resources are not supported"}, +#endif + {MNG_INVALIDDELTA, "The delta operation is invalid (mismatched color_types?)"}, + {MNG_INVALIDMETHOD, "Method is invalid"}, + {MNG_IMPROBABLELENGTH, "Chunklength is incredibly large"}, + {MNG_INVALIDBLOCK, "Delta block width and or height invalid"}, + {MNG_INVALIDEVENT, "Event type is invalid"}, + {MNG_INVALIDMASK, "Mask type is invalid"}, + {MNG_NOMATCHINGLOOP, "ENDL without matching LOOP"}, +#ifndef MNG_SKIPCHUNK_evNT + {MNG_SEEKNOTFOUND, "evNT points to unknown SEEK"}, +#endif +#ifndef MNG_SKIPCHUNK_PAST + {MNG_OBJNOTABSTRACT, "Destination object for PAST must be abstract"}, +#endif + {MNG_TERMSEQERROR, "TERM misplaced during creation of MNG stream"}, + {MNG_INVALIDFIELDVAL, "invalid fieldvalue (generic)"}, + {MNG_INVALIDWIDTH, "invalid frame/image width"}, + {MNG_INVALIDHEIGHT, "invalid frame/image height"}, + + {MNG_INVALIDCNVSTYLE, "Canvas_style is invalid"}, + {MNG_WRONGCHUNK, "Attempt to access the wrong chunk"}, + {MNG_INVALIDENTRYIX, "Attempt to access an non-existing entry"}, + {MNG_NOHEADER, "No valid header-chunk"}, + {MNG_NOCORRCHUNK, "Parent chunk not found"}, + {MNG_NOMHDR, "No MNG header (MHDR) found"}, + + {MNG_IMAGETOOLARGE, "Image is larger than defined maximum"}, + {MNG_NOTANANIMATION, "Image is not an animation"}, + {MNG_FRAMENRTOOHIGH, "Framenr out of bounds"}, + {MNG_LAYERNRTOOHIGH, "Layernr out of bounds"}, + {MNG_PLAYTIMETOOHIGH, "Playtime out of bounds"}, + {MNG_FNNOTIMPLEMENTED, "Function not yet implemented"}, + {MNG_IMAGEFROZEN, "Image is frozen"}, + + {MNG_LCMS_NOHANDLE, "Handle could not be initialized"}, + {MNG_LCMS_NOMEM, "No memory for gamma-table(s)"}, + {MNG_LCMS_NOTRANS, "Transformation could not be initialized"} + }; +#endif /* MNG_INCLUDE_ERROR_STRINGS */ + +/* ************************************************************************** */ + +mng_bool mng_store_error (mng_datap pData, + mng_retcode iError, + mng_retcode iExtra1, + mng_retcode iExtra2) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (pData, MNG_FN_STORE_ERROR, MNG_LC_START); +#endif + + if (pData != 0) + { + pData->iErrorcode = iError; /* save also for getlasterror */ + pData->iErrorx1 = iExtra1; + pData->iErrorx2 = iExtra2; + +#ifdef MNG_INCLUDE_ERROR_STRINGS + { /* binary search variables */ + mng_int32 iTop, iLower, iUpper, iMiddle; + mng_error_entryp pEntry; /* pointer to found entry */ + /* determine max index of table */ + iTop = (sizeof (error_table) / sizeof (error_table [0])) - 1; + + iLower = 0; /* initialize binary search */ + iMiddle = iTop >> 1; /* start in the middle */ + iUpper = iTop; + pEntry = 0; /* no goods yet! */ + + do /* the binary search itself */ + { + if (error_table [iMiddle].iError < iError) + iLower = iMiddle + 1; + else if (error_table [iMiddle].iError > iError) + iUpper = iMiddle - 1; + else + { + pEntry = &error_table [iMiddle]; + break; + } + + iMiddle = (iLower + iUpper) >> 1; + } + while (iLower <= iUpper); + + if (pEntry) /* found it ? */ + pData->zErrortext = pEntry->zErrortext; + else + pData->zErrortext = "Unknown error"; + } +#else /* MNG_INCLUDE_ERROR_STRINGS */ + pData->zErrortext = 0; +#endif /* MNG_INCLUDE_ERROR_STRINGS */ + + if (iError == 0) /* no error is not severe ! */ + { + pData->iSeverity = 0; + } + else + { + switch (iError&0x3C00) /* determine the severity */ + { + case 0x0800 : { pData->iSeverity = 5; break; } + case 0x1000 : { pData->iSeverity = 2; break; } + case 0x2000 : { pData->iSeverity = 1; break; } + default : { pData->iSeverity = 9; } + } + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (pData, MNG_FN_STORE_ERROR, MNG_LC_END); +#endif + + return MNG_TRUE; +} + +/* ************************************************************************** */ + +mng_bool mng_process_error (mng_datap pData, + mng_retcode iError, + mng_retcode iExtra1, + mng_retcode iExtra2) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (pData, MNG_FN_PROCESS_ERROR, MNG_LC_START); +#endif + + mng_store_error (pData, iError, iExtra1, iExtra2); + + if ((pData != MNG_NULL) && (pData->iMagic == MNG_MAGIC)) + { + if (pData->fErrorproc) /* callback defined ? */ + return pData->fErrorproc (((mng_handle)pData), iError, pData->iSeverity, + pData->iChunkname, pData->iChunkseq, + pData->iErrorx1, pData->iErrorx2, pData->zErrortext); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (pData, MNG_FN_PROCESS_ERROR, MNG_LC_END); +#endif + + return MNG_TRUE; /* warnings are ignored by default ! */ +} + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_error.h b/src/3rdparty/libmng/libmng_error.h new file mode 100644 index 0000000000..b49ff73308 --- /dev/null +++ b/src/3rdparty/libmng/libmng_error.h @@ -0,0 +1,119 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_error.h copyright (c) 2000-2002 G.Juyn * */ +/* * version : 1.0.5 * */ +/* * * */ +/* * purpose : Error functions (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the generic error-codes and functions * */ +/* * * */ +/* * changes : 0.5.1 - 05/06/2000 - G.Juyn * */ +/* * - added some errorcodes * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - added some errorcodes * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added application errorcodes (used with callbacks) * */ +/* * - moved chunk-access errorcodes to severity 5 * */ +/* * * */ +/* * 0.5.2 - 05/20/2000 - G.Juyn * */ +/* * - added JNG errorcodes * */ +/* * 0.5.2 - 05/23/2000 - G.Juyn * */ +/* * - added error tell-tale definition * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added errorcodes for delta-image processing * */ +/* * 0.5.2 - 06/06/2000 - G.Juyn * */ +/* * - added errorcode for delayed buffer-processing * */ +/* * - moved errorcodes to "libmng.h" * */ +/* * * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added macro + routine to set returncode without * */ +/* * calling error callback * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 08/20/2002 - G.Juyn * */ +/* * - added option for soft-handling of errors * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_error_h_ +#define _libmng_error_h_ + +/* ************************************************************************** */ +/* * * */ +/* * Default error routines * */ +/* * * */ +/* ************************************************************************** */ + +mng_bool mng_store_error (mng_datap pData, + mng_retcode iError, + mng_retcode iExtra1, + mng_retcode iExtra2); + +mng_bool mng_process_error (mng_datap pData, + mng_retcode iError, + mng_retcode iExtra1, + mng_retcode iExtra2); + +/* ************************************************************************** */ +/* * * */ +/* * Error handling macros * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_SOFTERRORS +#define MNG_ERROR(D,C) { if (!mng_process_error (D, C, 0, 0)) return C; } +#define MNG_ERRORZ(D,Z) { if (!mng_process_error (D, MNG_ZLIBERROR, Z, 0)) return MNG_ZLIBERROR; } +#define MNG_ERRORJ(D,J) { if (!mng_process_error (D, MNG_JPEGERROR, J, 0)) return MNG_JPEGERROR; } +#define MNG_ERRORL(D,L) { if (!mng_process_error (D, MNG_LCMSERROR, L, 0)) return MNG_LCMSERROR; } +#else +#define MNG_ERROR(D,C) { mng_process_error (D, C, 0, 0); return C; } +#define MNG_ERRORZ(D,Z) { mng_process_error (D, MNG_ZLIBERROR, Z, 0); return MNG_ZLIBERROR; } +#define MNG_ERRORJ(D,J) { mng_process_error (D, MNG_JPEGERROR, J, 0); return MNG_JPEGERROR; } +#define MNG_ERRORL(D,L) { mng_process_error (D, MNG_LCMSERROR, L, 0); return MNG_LCMSERROR; } +#endif + +#define MNG_RETURN(D,C) { mng_store_error (D, C, 0, 0); return C; } + +#define MNG_WARNING(D,C) { if (!mng_process_error (D, C, 0, 0)) return C; } + +#define MNG_VALIDHANDLE(H) { if ((H == 0) || (((mng_datap)H)->iMagic != MNG_MAGIC)) \ + return MNG_INVALIDHANDLE; } +#define MNG_VALIDHANDLEX(H) { if ((H == 0) || (((mng_datap)H)->iMagic != MNG_MAGIC)) \ + return 0; } +#define MNG_VALIDCB(D,C) { if (!((mng_datap)D)->C) \ + MNG_ERROR (((mng_datap)D), MNG_NOCALLBACK) } + +/* ************************************************************************** */ +/* * * */ +/* * Error string-table entry * */ +/* * * */ +/* ************************************************************************** */ + +typedef struct { + mng_retcode iError; + mng_pchar zErrortext; + } mng_error_entry; +typedef mng_error_entry const * mng_error_entryp; + +/* ************************************************************************** */ + +#endif /* _libmng_error_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_filter.c b/src/3rdparty/libmng/libmng_filter.c new file mode 100644 index 0000000000..ed69a75340 --- /dev/null +++ b/src/3rdparty/libmng/libmng_filter.c @@ -0,0 +1,978 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_filter.c copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : Filtering routines (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the filtering routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * * */ +/* * 1.0.5 - 08/07/2002 - G.Juyn * */ +/* * - added test-option for PNG filter method 193 (=no filter) * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - reversed some loops to use decrementing counter * */ +/* * * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_filter.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_FILTERS + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode filter_sub (mng_datap pData) +{ + mng_uint32 iBpp; + mng_uint8p pRawx; + mng_uint8p pRawx_prev; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_SUB, MNG_LC_START); +#endif + + iBpp = pData->iFilterbpp; + pRawx = pData->pWorkrow + pData->iPixelofs + iBpp; + pRawx_prev = pData->pWorkrow + pData->iPixelofs; + + for (iX = iBpp; iX < pData->iRowsize; iX++) + { + *pRawx = (mng_uint8)(*pRawx + *pRawx_prev); + pRawx++; + pRawx_prev++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_SUB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode filter_up (mng_datap pData) +{ + mng_uint8p pRawx; + mng_uint8p pPriorx; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_UP, MNG_LC_START); +#endif + + pRawx = pData->pWorkrow + pData->iPixelofs; + pPriorx = pData->pPrevrow + pData->iPixelofs; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsize - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsize; iX++) +#endif + { + *pRawx = (mng_uint8)(*pRawx + *pPriorx); + pRawx++; + pPriorx++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_UP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode filter_average (mng_datap pData) +{ + mng_int32 iBpp; + mng_uint8p pRawx; + mng_uint8p pRawx_prev; + mng_uint8p pPriorx; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_AVERAGE, MNG_LC_START); +#endif + + iBpp = pData->iFilterbpp; + pRawx = pData->pWorkrow + pData->iPixelofs; + pPriorx = pData->pPrevrow + pData->iPixelofs; + pRawx_prev = pData->pWorkrow + pData->iPixelofs; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = iBpp - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < iBpp; iX++) +#endif + { + *pRawx = (mng_uint8)(*pRawx + ((*pPriorx) >> 1)); + pRawx++; + pPriorx++; + } + + for (iX = iBpp; iX < pData->iRowsize; iX++) + { + *pRawx = (mng_uint8)(*pRawx + ((*pRawx_prev + *pPriorx) >> 1)); + pRawx++; + pPriorx++; + pRawx_prev++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_AVERAGE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode filter_paeth (mng_datap pData) +{ + mng_int32 iBpp; + mng_uint8p pRawx; + mng_uint8p pRawx_prev; + mng_uint8p pPriorx; + mng_uint8p pPriorx_prev; + mng_int32 iX; + mng_uint32 iA, iB, iC; + mng_uint32 iP; + mng_uint32 iPa, iPb, iPc; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_PAETH, MNG_LC_START); +#endif + + iBpp = pData->iFilterbpp; + pRawx = pData->pWorkrow + pData->iPixelofs; + pPriorx = pData->pPrevrow + pData->iPixelofs; + pRawx_prev = pData->pWorkrow + pData->iPixelofs; + pPriorx_prev = pData->pPrevrow + pData->iPixelofs; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = iBpp - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < iBpp; iX++) +#endif + { + *pRawx = (mng_uint8)(*pRawx + *pPriorx); + + pRawx++; + pPriorx++; + } + + for (iX = iBpp; iX < pData->iRowsize; iX++) + { + iA = (mng_uint32)*pRawx_prev; + iB = (mng_uint32)*pPriorx; + iC = (mng_uint32)*pPriorx_prev; + iP = iA + iB - iC; + iPa = abs (iP - iA); + iPb = abs (iP - iB); + iPc = abs (iP - iC); + + if ((iPa <= iPb) && (iPa <= iPc)) + *pRawx = (mng_uint8)(*pRawx + iA); + else + if (iPb <= iPc) + *pRawx = (mng_uint8)(*pRawx + iB); + else + *pRawx = (mng_uint8)(*pRawx + iC); + + pRawx++; + pPriorx++; + pRawx_prev++; + pPriorx_prev++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_PAETH, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_filter_a_row (mng_datap pData) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_A_ROW, MNG_LC_START); +#endif + + switch (*(pData->pWorkrow + pData->iFilterofs)) + { + case 1 : { + iRetcode = filter_sub (pData); + break; + } + case 2 : { + iRetcode = filter_up (pData); + break; + } + case 3 : { + iRetcode = filter_average (pData); + break; + } + case 4 : { + iRetcode = filter_paeth (pData); + break; + } + + default : iRetcode = MNG_INVALIDFILTER; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FILTER_A_ROW, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifdef FILTER192 +mng_retcode mng_init_rowdiffering (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ROWDIFFERING, MNG_LC_START); +#endif + + if (pData->iFilter == 0xC0) /* has leveling parameters ? */ + { + switch (pData->iColortype) /* salvage leveling parameters */ + { + case 0 : { /* gray */ + if (pData->iBitdepth <= 8) + pData->iLevel0 = (mng_uint16)*pData->pWorkrow; + else + pData->iLevel0 = mng_get_uint16 (pData->pWorkrow); + + break; + } + case 2 : { /* rgb */ + if (pData->iBitdepth <= 8) + { + pData->iLevel0 = (mng_uint16)*pData->pWorkrow; + pData->iLevel1 = (mng_uint16)*(pData->pWorkrow+1); + pData->iLevel2 = (mng_uint16)*(pData->pWorkrow+2); + } + else + { + pData->iLevel0 = mng_get_uint16 (pData->pWorkrow); + pData->iLevel1 = mng_get_uint16 (pData->pWorkrow+2); + pData->iLevel2 = mng_get_uint16 (pData->pWorkrow+4); + } + + break; + } + case 3 : { /* indexed */ + pData->iLevel0 = (mng_uint16)*pData->pWorkrow; + break; + } + case 4 : { /* gray+alpha */ + if (pData->iBitdepth <= 8) + { + pData->iLevel0 = (mng_uint16)*pData->pWorkrow; + pData->iLevel1 = (mng_uint16)*(pData->pWorkrow+1); + } + else + { + pData->iLevel0 = mng_get_uint16 (pData->pWorkrow); + pData->iLevel1 = mng_get_uint16 (pData->pWorkrow+2); + } + + break; + } + case 6 : { /* rgb+alpha */ + if (pData->iBitdepth <= 8) + { + pData->iLevel0 = (mng_uint16)*pData->pWorkrow; + pData->iLevel1 = (mng_uint16)*(pData->pWorkrow+1); + pData->iLevel2 = (mng_uint16)*(pData->pWorkrow+2); + pData->iLevel3 = (mng_uint16)*(pData->pWorkrow+3); + } + else + { + pData->iLevel0 = mng_get_uint16 (pData->pWorkrow); + pData->iLevel1 = mng_get_uint16 (pData->pWorkrow+2); + pData->iLevel2 = mng_get_uint16 (pData->pWorkrow+4); + pData->iLevel3 = mng_get_uint16 (pData->pWorkrow+6); + } + + break; + } + } + } + /* shift the entire row back in place */ + pRawi = pData->pWorkrow + pData->iFilterofs; + pRawo = pData->pWorkrow; + + for (iX = 0; iX < pData->iRowsize + pData->iPixelofs - pData->iFilterofs; iX++) + *pRawo++ = *pRawi++; + + pData->iFilterofs = 0; /* indicate so ! */ + +#ifdef FILTER193 + if (pData->iFilter == 0xC1) /* no adaptive filtering ? */ + pData->iPixelofs = pData->iFilterofs; + else +#endif + pData->iPixelofs = pData->iFilterofs + 1; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ROWDIFFERING, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_g1 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G1, MNG_LC_START); +#endif + + if (pData->iLevel0 & 0x01) /* is it uneven level ? */ + { + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + /* just invert every bit */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsize - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsize; iX++) +#endif + *pRawo++ = (mng_uint8)(~(*pRawi++)); + + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_g2 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + mng_int32 iC, iS; + mng_uint8 iB, iN, iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G2, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + iC = 0; + iB = 0; + iN = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iC) + { + iC = 4; + iB = *pRawi++; + iN = 0; + iS = 8; + } + + iS -= 2; + iQ = (mng_uint8)(((iB >> iS) + pData->iLevel0) & 0x03); + iN = (mng_uint8)((iN << 2) + iQ); + iC--; + + if (!iC) + *pRawo++ = iN; + + } + + if (iC) + *pRawo = (mng_uint8)(iN << iS); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_g4 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + mng_int32 iC, iS; + mng_uint8 iB, iN, iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G4, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + iC = 0; + iB = 0; + iN = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iC) + { + iC = 2; + iB = *pRawi++; + iN = 0; + iS = 8; + } + + iS -= 4; + iQ = (mng_uint8)(((iB >> iS) + pData->iLevel0) & 0x0F); + iN = (mng_uint8)((iN << 4) + iQ); + iC--; + + if (!iC) + *pRawo++ = iN; + + } + + if (iC) + *pRawo = (mng_uint8)(iN << iS); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_g8 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G8, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pRawo++ = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0) & 0xFF); + + pRawi++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_g16 (mng_datap pData) +{ + mng_uint16p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G16, MNG_LC_START); +#endif + + pRawi = (mng_uint16p)(pData->pWorkrow + pData->iPixelofs); + pRawo = (mng_uint16p)(pData->pPrevrow + pData->iPixelofs); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pRawo++ = (mng_uint16)(((mng_uint32)*pRawi + (mng_uint32)pData->iLevel0) & 0xFFFF); + + pRawi++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_rgb8 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_RGB8, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pRawo+1) = (mng_uint8)(((mng_uint16)*(pRawi+1) + pData->iLevel1) & 0xFF); + *pRawo = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0 + + (mng_uint16)*(pRawo+1)) & 0xFF); + *(pRawo+2) = (mng_uint8)(((mng_uint16)*(pRawi+2) + pData->iLevel2 + + (mng_uint16)*(pRawo+1)) & 0xFF); + + pRawi += 3; + pRawo += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_rgb16 (mng_datap pData) +{ + mng_uint16p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_RGB16, MNG_LC_START); +#endif + + pRawi = (mng_uint16p)(pData->pWorkrow + pData->iPixelofs); + pRawo = (mng_uint16p)(pData->pPrevrow + pData->iPixelofs); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pRawo+1) = (mng_uint16)(((mng_uint32)*(pRawi+1) + (mng_uint32)pData->iLevel1) & 0xFFFF); + *pRawo = (mng_uint16)(((mng_uint32)*pRawi + (mng_uint32)pData->iLevel0 + + (mng_uint32)*(pRawo+1)) & 0xFFFF); + *(pRawo+2) = (mng_uint16)(((mng_uint32)*(pRawi+2) + (mng_uint32)pData->iLevel2 + + (mng_uint32)*(pRawo+1)) & 0xFFFF); + + pRawi += 3; + pRawo += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_idx1 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_IDX1, MNG_LC_START); +#endif + + if (pData->iLevel0 & 0x01) /* is it uneven level ? */ + { + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + /* just invert every bit */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsize - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsize; iX++) +#endif + *pRawo++ = (mng_uint8)(~(*pRawi++)); + + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_IDX1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_idx2 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + mng_int32 iC, iS; + mng_uint8 iB, iN, iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_IDX2, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + iC = 0; + iB = 0; + iN = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iC) + { + iC = 4; + iB = *pRawi++; + iN = 0; + iS = 8; + } + + iS -= 2; + iQ = (mng_uint8)(((iB >> iS) + pData->iLevel0) & 0x03); + iN = (mng_uint8)((iN << 2) + iQ); + iC--; + + if (!iC) + *pRawo++ = iN; + + } + + if (iC) + *pRawo = (mng_uint8)(iN << iS); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_IDX2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_idx4 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + mng_int32 iC, iS; + mng_uint8 iB, iN, iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_IDX4, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + iC = 0; + iB = 0; + iN = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iC) + { + iC = 2; + iB = *pRawi++; + iN = 0; + iS = 8; + } + + iS -= 4; + iQ = (mng_uint8)(((iB >> iS) + pData->iLevel0) & 0x0F); + iN = (mng_uint8)((iN << 4) + iQ); + iC--; + + if (!iC) + *pRawo++ = iN; + + } + + if (iC) + *pRawo = (mng_uint8)(iN << iS); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_IDX4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_idx8 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_IDX8, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pRawo++ = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0) & 0xFF); + + pRawi++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_IDX8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_ga8 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_GA8, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pRawo = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0) & 0xFF); + *(pRawo+1) = (mng_uint8)(((mng_uint16)*(pRawi+1) + pData->iLevel1) & 0xFF); + + pRawi += 2; + pRawo += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_GA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_ga16 (mng_datap pData) +{ + mng_uint16p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_GA16, MNG_LC_START); +#endif + + pRawi = (mng_uint16p)(pData->pWorkrow + pData->iPixelofs); + pRawo = (mng_uint16p)(pData->pPrevrow + pData->iPixelofs); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pRawo = (mng_uint16)(((mng_uint32)*pRawi + (mng_uint32)pData->iLevel0) & 0xFFFF); + *(pRawo+1) = (mng_uint16)(((mng_uint32)*(pRawi+1) + (mng_uint32)pData->iLevel1) & 0xFFFF); + + pRawi += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_rgba8 (mng_datap pData) +{ + mng_uint8p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_RGBA8, MNG_LC_START); +#endif + + pRawi = pData->pWorkrow + pData->iPixelofs; + pRawo = pData->pPrevrow + pData->iPixelofs; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pRawo+1) = (mng_uint8)(((mng_uint16)*(pRawi+1) + pData->iLevel1) & 0xFF); + *pRawo = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0 + + (mng_uint16)*(pRawo+1)) & 0xFF); + *(pRawo+2) = (mng_uint8)(((mng_uint16)*(pRawi+2) + pData->iLevel2 + + (mng_uint16)*(pRawo+1)) & 0xFF); + *(pRawo+3) = (mng_uint8)(((mng_uint16)*(pRawi+3) + pData->iLevel3) & 0xFF); + + pRawi += 4; + pRawo += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_differ_rgba16 (mng_datap pData) +{ + mng_uint16p pRawi, pRawo; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_RGBA16, MNG_LC_START); +#endif + + pRawi = (mng_uint16p)(pData->pWorkrow + pData->iPixelofs); + pRawo = (mng_uint16p)(pData->pPrevrow + pData->iPixelofs); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples - 1; iX >= 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pRawo+1) = (mng_uint16)(((mng_uint32)*(pRawi+1) + (mng_uint32)pData->iLevel1) & 0xFFFF); + *pRawo = (mng_uint16)(((mng_uint32)*pRawi + (mng_uint32)pData->iLevel0 + + (mng_uint32)*(pRawo+1)) & 0xFFFF); + *(pRawo+2) = (mng_uint16)(((mng_uint32)*(pRawi+2) + (mng_uint32)pData->iLevel2 + + (mng_uint32)*(pRawo+1)) & 0xFFFF); + *(pRawo+3) = (mng_uint16)(((mng_uint32)*(pRawi+3) + (mng_uint32)pData->iLevel3) & 0xFFFF); + + pRawi += 4; + pRawo += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DIFFER_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* FILTER192 */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_FILTERS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_filter.h b/src/3rdparty/libmng/libmng_filter.h new file mode 100644 index 0000000000..9ac9c7f99d --- /dev/null +++ b/src/3rdparty/libmng/libmng_filter.h @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_filter.h copyright (c) 2000-2002 G.Juyn * */ +/* * version : 1.0.5 * */ +/* * * */ +/* * purpose : Filtering routines (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the filtering routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_filter_h_ +#define _libmng_filter_h_ + +/* ************************************************************************** */ + +mng_retcode mng_filter_a_row (mng_datap pData); + +/* ************************************************************************** */ + +#ifdef FILTER192 +mng_retcode mng_init_rowdiffering (mng_datap pData); + +mng_retcode mng_differ_g1 (mng_datap pData); +mng_retcode mng_differ_g2 (mng_datap pData); +mng_retcode mng_differ_g4 (mng_datap pData); +mng_retcode mng_differ_g8 (mng_datap pData); +mng_retcode mng_differ_g16 (mng_datap pData); +mng_retcode mng_differ_rgb8 (mng_datap pData); +mng_retcode mng_differ_rgb16 (mng_datap pData); +mng_retcode mng_differ_idx1 (mng_datap pData); +mng_retcode mng_differ_idx2 (mng_datap pData); +mng_retcode mng_differ_idx4 (mng_datap pData); +mng_retcode mng_differ_idx8 (mng_datap pData); +mng_retcode mng_differ_ga8 (mng_datap pData); +mng_retcode mng_differ_ga16 (mng_datap pData); +mng_retcode mng_differ_rgba8 (mng_datap pData); +mng_retcode mng_differ_rgba16 (mng_datap pData); +#endif + +/* ************************************************************************** */ + +#endif /* _libmng_filter_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_hlapi.c b/src/3rdparty/libmng/libmng_hlapi.c new file mode 100644 index 0000000000..e71034757c --- /dev/null +++ b/src/3rdparty/libmng/libmng_hlapi.c @@ -0,0 +1,3001 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_hlapi.c copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : high-level application API (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the high-level function interface * */ +/* * for applications. * */ +/* * * */ +/* * changes : 0.5.1 - 05/06/2000 - G.Juyn * */ +/* * - added init of iPLTEcount * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed calling-convention definition * */ +/* * - changed status-handling of display-routines * */ +/* * - added versioning-control routines * */ +/* * - filled the write routine * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added callback error-reporting support * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * 0.5.1 - 05/13/2000 - G.Juyn * */ +/* * - added eMNGma hack (will be removed in 1.0.0 !!!) * */ +/* * - added TERM animation object pointer (easier reference) * */ +/* * 0.5.1 - 05/14/2000 - G.Juyn * */ +/* * - added cleanup of saved-data (SAVE/SEEK processing) * */ +/* * 0.5.1 - 05/16/2000 - G.Juyn * */ +/* * - moved the actual write_graphic functionality from here * */ +/* * to its appropriate function in the mng_write module * */ +/* * * */ +/* * 0.5.2 - 05/19/2000 - G.Juyn * */ +/* * - cleaned up some code regarding mixed support * */ +/* * - added JNG support * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - moved init of default zlib parms here from "mng_zlib.c" * */ +/* * - added init of default IJG parms * */ +/* * 0.5.2 - 05/29/2000 - G.Juyn * */ +/* * - fixed inconsistancy with freeing global iCCP profile * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added delta-image field initialization * */ +/* * 0.5.2 - 06/06/2000 - G.Juyn * */ +/* * - added initialization of the buffer-suspend parameter * */ +/* * * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - added initialization of update-region for refresh * */ +/* * - added initialization of Needrefresh parameter * */ +/* * 0.5.3 - 06/17/2000 - G.Juyn * */ +/* * - added initialization of Deltaimmediate * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added initialization of Speed * */ +/* * - added initialization of Imagelevel * */ +/* * 0.5.3 - 06/26/2000 - G.Juyn * */ +/* * - changed userdata variable to mng_ptr * */ +/* * 0.5.3 - 06/29/2000 - G.Juyn * */ +/* * - fixed initialization routine for new mng_handle type * */ +/* * * */ +/* * 0.9.1 - 07/06/2000 - G.Juyn * */ +/* * - changed mng_display_resume to allow to be called after * */ +/* * a suspension return with MNG_NEEDMOREDATA * */ +/* * - added returncode MNG_NEEDTIMERWAIT for timer breaks * */ +/* * 0.9.1 - 07/07/2000 - G.Juyn * */ +/* * - implemented support for freeze/reset/resume & go_xxxx * */ +/* * 0.9.1 - 07/08/2000 - G.Juyn * */ +/* * - added support for improved timing * */ +/* * - added support for improved I/O-suspension * */ +/* * 0.9.1 - 07/14/2000 - G.Juyn * */ +/* * - changed EOF processing behavior * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added callbacks for SAVE/SEEK processing * */ +/* * - added variable for NEEDSECTIONWAIT breaks * */ +/* * - added variable for freeze & reset processing * */ +/* * 0.9.1 - 07/17/2000 - G.Juyn * */ +/* * - added error cleanup processing * */ +/* * - fixed support for mng_display_reset() * */ +/* * - fixed suspension-buffering for 32K+ chunks * */ +/* * * */ +/* * 0.9.2 - 07/29/2000 - G.Juyn * */ +/* * - fixed small bugs in display processing * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - fixed wrapping of suspension parameters * */ +/* * 0.9.2 - 08/04/2000 - G.Juyn * */ +/* * - B111096 - fixed large-buffer read-suspension * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * 0.9.3 - 09/10/2000 - G.Juyn * */ +/* * - fixed DEFI behavior * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added optional support for bKGD for PNG images * */ +/* * - raised initial maximum canvas size * */ +/* * - added support for JDAA * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added callback to process non-critical unknown chunks * */ +/* * - fixed support for delta-images during read() / display() * */ +/* * 0.9.3 - 10/18/2000 - G.Juyn * */ +/* * - added closestream() processing for mng_cleanup() * */ +/* * 0.9.3 - 10/27/2000 - G.Juyn * */ +/* * - fixed separate read() & display() processing * */ +/* * * */ +/* * 0.9.4 - 11/20/2000 - G.Juyn * */ +/* * - fixed unwanted repetition in mng_readdisplay() * */ +/* * 0.9.4 - 11/24/2000 - G.Juyn * */ +/* * - moved restore of object 0 to libmng_display * */ +/* * * */ +/* * 1.0.1 - 02/08/2001 - G.Juyn * */ +/* * - added MEND processing callback * */ +/* * 1.0.1 - 02/13/2001 - G.Juyn * */ +/* * - fixed first FRAM_MODE=4 timing problem * */ +/* * 1.0.1 - 04/21/2001 - G.Juyn * */ +/* * - fixed bug with display_reset/display_resume (Thanks G!) * */ +/* * 1.0.1 - 04/22/2001 - G.Juyn * */ +/* * - fixed memory-leak (Thanks Gregg!) * */ +/* * 1.0.1 - 04/23/2001 - G.Juyn * */ +/* * - fixed reset_rundata to drop all objects * */ +/* * 1.0.1 - 04/25/2001 - G.Juyn * */ +/* * - moved mng_clear_cms to libmng_cms * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added optimization option for MNG-video playback * */ +/* * - added processterm callback * */ +/* * 1.0.2 - 06/25/2001 - G.Juyn * */ +/* * - added option to turn off progressive refresh * */ +/* * * */ +/* * 1.0.5 - 07/08/2002 - G.Juyn * */ +/* * - B578572 - removed eMNGma hack (thanks Dimitri!) * */ +/* * 1.0.5 - 07/16/2002 - G.Juyn * */ +/* * - B581625 - large chunks fail with suspension reads * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - fixed LOOP iteration=0 special case * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - added another fix for misplaced TERM chunk * */ +/* * - completed support for condition=2 in TERM chunk * */ +/* * - added beta version function & constant * */ +/* * 1.0.5 - 10/11/2002 - G.Juyn * */ +/* * - added mng_status_dynamic to supports function * */ +/* * 1.0.5 - 11/04/2002 - G.Juyn * */ +/* * - changed FRAMECOUNT/LAYERCOUNT/PLAYTIME error to warning * */ +/* * 1.0.5 - 11/07/2002 - G.Juyn * */ +/* * - added support to get totals after mng_read() * */ +/* * 1.0.5 - 11/29/2002 - G.Juyn * */ +/* * - fixed goxxxxx() support for zero values * */ +/* * * */ +/* * 1.0.6 - 05/25/2003 - G.R-P * */ +/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */ +/* * 1.0.6 - 07/11/2003 - G.R-P * */ +/* * - added conditionals zlib and jpeg property accessors * */ +/* * 1.0.6 - 07/14/2003 - G.R-P * */ +/* * - added conditionals around "mng_display_go*" and other * */ +/* * unused functions * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * * */ +/* * 1.0.7 - 03/07/2004 - G. Randers-Pehrson * */ +/* * - put gamma, cms-related declarations inside #ifdef * */ +/* * 1.0.7 - 03/10/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * 1.0.7 - 03/24/2004 - G.R-P * */ +/* * - fixed zTXT -> zTXt typo * */ +/* * * */ +/* * 1.0.8 - 04/02/2004 - G.Juyn * */ +/* * - added CRC existence & checking flags * */ +/* * 1.0.8 - 04/10/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * 1.0.8 - 07/06/2004 - G.R-P * */ +/* * - defend against using undefined openstream function * */ +/* * 1.0.8 - 08/02/2004 - G.Juyn * */ +/* * - added conditional to allow easier writing of large MNG's * */ +/* * * */ +/* * 1.0.9 - 08/17/2004 - G.R-P * */ +/* * - added more SKIPCHUNK conditionals * */ +/* * 1.0.9 - 09/25/2004 - G.Juyn * */ +/* * - replaced MNG_TWEAK_LARGE_FILES with permanent solution * */ +/* * 1.0.9 - 10/03/2004 - G.Juyn * */ +/* * - added function to retrieve current FRAM delay * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* * 1.0.10 - 07/06/2005 - G.R-P * */ +/* * - added more SKIPCHUNK conditionals * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * 1.0.10 - 07/06/2007 - G.R-P bugfix by Lucas Quintana * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_objects.h" +#include "libmng_object_prc.h" +#include "libmng_chunks.h" +#include "libmng_memory.h" +#include "libmng_read.h" +#include "libmng_write.h" +#include "libmng_display.h" +#include "libmng_zlib.h" +#include "libmng_jpeg.h" +#include "libmng_cms.h" +#include "libmng_pixels.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ +/* * * */ +/* * local routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +MNG_LOCAL mng_retcode mng_drop_objects (mng_datap pData, + mng_bool bDropaniobj) +{ + mng_objectp pObject; + mng_objectp pNext; + mng_cleanupobject fCleanup; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DROP_OBJECTS, MNG_LC_START); +#endif + + pObject = pData->pFirstimgobj; /* get first stored image-object (if any) */ + + while (pObject) /* more objects to discard ? */ + { + pNext = ((mng_object_headerp)pObject)->pNext; + /* call appropriate cleanup */ + fCleanup = ((mng_object_headerp)pObject)->fCleanup; + fCleanup (pData, pObject); + + pObject = pNext; /* neeeext */ + } + + pData->pFirstimgobj = MNG_NULL; /* clean this up!!! */ + pData->pLastimgobj = MNG_NULL; + + if (bDropaniobj) /* drop animation objects ? */ + { + pObject = pData->pFirstaniobj; /* get first stored animation-object (if any) */ + + while (pObject) /* more objects to discard ? */ + { + pNext = ((mng_object_headerp)pObject)->pNext; + /* call appropriate cleanup */ + fCleanup = ((mng_object_headerp)pObject)->fCleanup; + fCleanup (pData, pObject); + + pObject = pNext; /* neeeext */ + } + + pData->pFirstaniobj = MNG_NULL; /* clean this up!!! */ + pData->pLastaniobj = MNG_NULL; + +#ifdef MNG_SUPPORT_DYNAMICMNG + pObject = pData->pFirstevent; /* get first event-object (if any) */ + + while (pObject) /* more objects to discard ? */ + { + pNext = ((mng_object_headerp)pObject)->pNext; + /* call appropriate cleanup */ + fCleanup = ((mng_object_headerp)pObject)->fCleanup; + fCleanup (pData, pObject); + + pObject = pNext; /* neeeext */ + } + + pData->pFirstevent = MNG_NULL; /* clean this up!!! */ + pData->pLastevent = MNG_NULL; +#endif + } + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + if (pData->pMPNG) /* drop MPNG data (if any) */ + { + fCleanup = ((mng_object_headerp)pData->pMPNG)->fCleanup; + fCleanup (pData, pData->pMPNG); + pData->pMPNG = MNG_NULL; + } +#endif + +#ifdef MNG_INCLUDE_ANG_PROPOSAL + if (pData->pANG) /* drop ANG data (if any) */ + { + fCleanup = ((mng_object_headerp)pData->pANG)->fCleanup; + fCleanup (pData, pData->pANG); + pData->pANG = MNG_NULL; + } +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DROP_OBJECTS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_SKIPCHUNK_SAVE +MNG_LOCAL mng_retcode mng_drop_savedata (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DROP_SAVEDATA, MNG_LC_START); +#endif + + if (pData->pSavedata) /* sanity check */ + { /* address it more directly */ + mng_savedatap pSave = pData->pSavedata; + + if (pSave->iGlobalProfilesize) /* cleanup the profile ? */ + MNG_FREEX (pData, pSave->pGlobalProfile, pSave->iGlobalProfilesize); + /* cleanup the save structure */ + MNG_FREE (pData, pData->pSavedata, sizeof (mng_savedata)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DROP_SAVEDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +MNG_LOCAL mng_retcode mng_reset_rundata (mng_datap pData) +{ + mng_drop_invalid_objects (pData); /* drop invalidly stored objects */ +#ifndef MNG_SKIPCHUNK_SAVE + mng_drop_savedata (pData); /* drop stored savedata */ +#endif + mng_reset_objzero (pData); /* reset object 0 */ + /* drop stored objects (if any) */ + mng_drop_objects (pData, MNG_FALSE); + + pData->bFramedone = MNG_FALSE; + pData->iFrameseq = 0; /* reset counters & stuff */ + pData->iLayerseq = 0; + pData->iFrametime = 0; + + pData->bSkipping = MNG_FALSE; + +#ifdef MNG_SUPPORT_DYNAMICMNG + pData->bRunningevent = MNG_FALSE; + pData->bStopafterseek = MNG_FALSE; + pData->iEventx = 0; + pData->iEventy = 0; + pData->pLastmousemove = MNG_NULL; +#endif + + pData->iRequestframe = 0; + pData->iRequestlayer = 0; + pData->iRequesttime = 0; + pData->bSearching = MNG_FALSE; + + pData->iRuntime = 0; + pData->iSynctime = 0; + pData->iStarttime = 0; + pData->iEndtime = 0; + pData->bRunning = MNG_FALSE; + pData->bTimerset = MNG_FALSE; + pData->iBreakpoint = 0; + pData->bSectionwait = MNG_FALSE; + pData->bFreezing = MNG_FALSE; + pData->bResetting = MNG_FALSE; + pData->bNeedrefresh = MNG_FALSE; + pData->bOnlyfirstframe = MNG_FALSE; + pData->iFramesafterTERM = 0; + + pData->iIterations = 0; + /* start of animation objects! */ + pData->pCurraniobj = MNG_NULL; + + pData->iUpdateleft = 0; /* reset region */ + pData->iUpdateright = 0; + pData->iUpdatetop = 0; + pData->iUpdatebottom = 0; + pData->iPLTEcount = 0; /* reset PLTE data */ + +#ifndef MNG_SKIPCHUNK_DEFI + pData->iDEFIobjectid = 0; /* reset DEFI data */ + pData->bDEFIhasdonotshow = MNG_FALSE; + pData->iDEFIdonotshow = 0; + pData->bDEFIhasconcrete = MNG_FALSE; + pData->iDEFIconcrete = 0; + pData->bDEFIhasloca = MNG_FALSE; + pData->iDEFIlocax = 0; + pData->iDEFIlocay = 0; + pData->bDEFIhasclip = MNG_FALSE; + pData->iDEFIclipl = 0; + pData->iDEFIclipr = 0; + pData->iDEFIclipt = 0; + pData->iDEFIclipb = 0; +#endif + +#ifndef MNG_SKIPCHUNK_BACK + pData->iBACKred = 0; /* reset BACK data */ + pData->iBACKgreen = 0; + pData->iBACKblue = 0; + pData->iBACKmandatory = 0; + pData->iBACKimageid = 0; + pData->iBACKtile = 0; +#endif + +#ifndef MNG_SKIPCHUNK_FRAM + pData->iFRAMmode = 1; /* default global FRAM variables */ + pData->iFRAMdelay = 1; + pData->iFRAMtimeout = 0x7fffffffl; + pData->bFRAMclipping = MNG_FALSE; + pData->iFRAMclipl = 0; + pData->iFRAMclipr = 0; + pData->iFRAMclipt = 0; + pData->iFRAMclipb = 0; + + pData->iFramemode = 1; /* again for the current frame */ + pData->iFramedelay = 1; + pData->iFrametimeout = 0x7fffffffl; + pData->bFrameclipping = MNG_FALSE; + pData->iFrameclipl = 0; + pData->iFrameclipr = 0; + pData->iFrameclipt = 0; + pData->iFrameclipb = 0; + + pData->iNextdelay = 1; + + pData->bForcedelay = MNG_FALSE; + pData->iAccumdelay = 0; +#endif + +#ifndef MNG_SKIPCHUNK_SHOW + pData->iSHOWmode = 0; /* reset SHOW data */ + pData->iSHOWfromid = 0; + pData->iSHOWtoid = 0; + pData->iSHOWnextid = 0; + pData->iSHOWskip = 0; +#endif + + pData->iGlobalPLTEcount = 0; /* reset global PLTE data */ + + pData->iGlobalTRNSrawlen = 0; /* reset global tRNS data */ + + pData->iGlobalGamma = 0; /* reset global gAMA data */ + +#ifndef MNG_SKIPCHUNK_cHRM + pData->iGlobalWhitepointx = 0; /* reset global cHRM data */ + pData->iGlobalWhitepointy = 0; + pData->iGlobalPrimaryredx = 0; + pData->iGlobalPrimaryredy = 0; + pData->iGlobalPrimarygreenx = 0; + pData->iGlobalPrimarygreeny = 0; + pData->iGlobalPrimarybluex = 0; + pData->iGlobalPrimarybluey = 0; +#endif + +#ifndef MNG_SKIPCHUNK_sRGB + pData->iGlobalRendintent = 0; /* reset global sRGB data */ +#endif + +#ifndef MNG_SKIPCHUNK_iCCP + if (pData->iGlobalProfilesize) /* drop global profile (if any) */ + MNG_FREE (pData, pData->pGlobalProfile, pData->iGlobalProfilesize); + + pData->iGlobalProfilesize = 0; +#endif + +#ifndef MNG_SKIPCHUNK_bKGD + pData->iGlobalBKGDred = 0; /* reset global bKGD data */ + pData->iGlobalBKGDgreen = 0; + pData->iGlobalBKGDblue = 0; +#endif +#ifndef MNG_NO_DELTA_PNG + /* reset delta-image */ + pData->pDeltaImage = MNG_NULL; + pData->iDeltaImagetype = 0; + pData->iDeltatype = 0; + pData->iDeltaBlockwidth = 0; + pData->iDeltaBlockheight = 0; + pData->iDeltaBlockx = 0; + pData->iDeltaBlocky = 0; + pData->bDeltaimmediate = MNG_FALSE; + + pData->fDeltagetrow = MNG_NULL; + pData->fDeltaaddrow = MNG_NULL; + pData->fDeltareplacerow = MNG_NULL; + pData->fDeltaputrow = MNG_NULL; + + pData->fPromoterow = MNG_NULL; + pData->fPromBitdepth = MNG_NULL; + pData->pPromBuf = MNG_NULL; + pData->iPromColortype = 0; + pData->iPromBitdepth = 0; + pData->iPromFilltype = 0; + pData->iPromWidth = 0; + pData->pPromSrc = MNG_NULL; + pData->pPromDst = MNG_NULL; +#endif + +#ifndef MNG_SKIPCHUNK_MAGN + pData->iMAGNfromid = 0; + pData->iMAGNtoid = 0; +#endif + +#ifndef MNG_SKIPCHUNK_PAST + pData->iPastx = 0; + pData->iPasty = 0; +#endif + + pData->pLastseek = MNG_NULL; + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +MNG_LOCAL void cleanup_errors (mng_datap pData) +{ + pData->iErrorcode = MNG_NOERROR; + pData->iSeverity = 0; + pData->iErrorx1 = 0; + pData->iErrorx2 = 0; + pData->zErrortext = MNG_NULL; + + return; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +MNG_LOCAL mng_retcode make_pushbuffer (mng_datap pData, + mng_ptr pPushdata, + mng_size_t iLength, + mng_bool bTakeownership, + mng_pushdatap * pPush) +{ + mng_pushdatap pTemp; + + MNG_ALLOC (pData, pTemp, sizeof(mng_pushdata)); + + pTemp->pNext = MNG_NULL; + + if (bTakeownership) /* are we going to own the buffer? */ + { /* then just copy the pointer */ + pTemp->pData = (mng_uint8p)pPushdata; + } + else + { /* otherwise create new buffer */ + MNG_ALLOCX (pData, pTemp->pData, iLength); + if (!pTemp->pData) /* succeeded? */ + { + MNG_FREEX (pData, pTemp, sizeof(mng_pushdata)); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + /* and copy the bytes across */ + MNG_COPY (pTemp->pData, pPushdata, iLength); + } + + pTemp->iLength = iLength; + pTemp->bOwned = bTakeownership; + pTemp->pDatanext = pTemp->pData; + pTemp->iRemaining = iLength; + + *pPush = pTemp; /* return it */ + + return MNG_NOERROR; /* and all's well */ +} +#endif + +#ifdef MNG_VERSION_QUERY_SUPPORT +/* ************************************************************************** */ +/* * * */ +/* * Versioning control * */ +/* * * */ +/* ************************************************************************** */ + +mng_pchar MNG_DECL mng_version_text (void) +{ + return MNG_VERSION_TEXT; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_version_so (void) +{ + return MNG_VERSION_SO; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_version_dll (void) +{ + return MNG_VERSION_DLL; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_version_major (void) +{ + return MNG_VERSION_MAJOR; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_version_minor (void) +{ + return MNG_VERSION_MINOR; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_version_release (void) +{ + return MNG_VERSION_RELEASE; +} + +/* ************************************************************************** */ + +mng_bool MNG_DECL mng_version_beta (void) +{ + return MNG_VERSION_BETA; +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * 'supports' function * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_FUNCQUERY +typedef struct { + mng_pchar zFunction; + mng_uint8 iMajor; /* Major == 0 means not implemented ! */ + mng_uint8 iMinor; + mng_uint8 iRelease; + } mng_func_entry; +typedef mng_func_entry const * mng_func_entryp; + +MNG_LOCAL mng_func_entry const func_table [] = + { /* keep it alphabetically sorted !!!!! */ + {"mng_cleanup", 1, 0, 0}, + {"mng_copy_chunk", 1, 0, 5}, + {"mng_create", 1, 0, 0}, + {"mng_display", 1, 0, 0}, + {"mng_display_freeze", 1, 0, 0}, +#ifndef MNG_NO_DISPLAY_GO_SUPPORTED + {"mng_display_goframe", 1, 0, 0}, + {"mng_display_golayer", 1, 0, 0}, + {"mng_display_gotime", 1, 0, 0}, +#endif + {"mng_display_reset", 1, 0, 0}, + {"mng_display_resume", 1, 0, 0}, + {"mng_get_alphabitdepth", 1, 0, 0}, + {"mng_get_alphacompression", 1, 0, 0}, + {"mng_get_alphadepth", 1, 0, 0}, + {"mng_get_alphafilter", 1, 0, 0}, + {"mng_get_alphainterlace", 1, 0, 0}, + {"mng_get_bgcolor", 1, 0, 0}, + {"mng_get_bitdepth", 1, 0, 0}, + {"mng_get_bkgdstyle", 1, 0, 0}, + {"mng_get_cacheplayback", 1, 0, 2}, + {"mng_get_canvasstyle", 1, 0, 0}, + {"mng_get_colortype", 1, 0, 0}, + {"mng_get_compression", 1, 0, 0}, +#ifndef MNG_NO_CURRENT_INFO + {"mng_get_currentframe", 1, 0, 0}, + {"mng_get_currentlayer", 1, 0, 0}, + {"mng_get_currentplaytime", 1, 0, 0}, +#endif + {"mng_get_currframdelay", 1, 0, 9}, +#ifndef MNG_NO_DFLT_INFO + {"mng_get_dfltimggamma", 1, 0, 0}, + {"mng_get_dfltimggammaint", 1, 0, 0}, +#endif + {"mng_get_displaygamma", 1, 0, 0}, + {"mng_get_displaygammaint", 1, 0, 0}, + {"mng_get_doprogressive", 1, 0, 2}, + {"mng_get_filter", 1, 0, 0}, + {"mng_get_framecount", 1, 0, 0}, + {"mng_get_imageheight", 1, 0, 0}, + {"mng_get_imagelevel", 1, 0, 0}, + {"mng_get_imagetype", 1, 0, 0}, + {"mng_get_imagewidth", 1, 0, 0}, + {"mng_get_interlace", 1, 0, 0}, +#ifdef MNG_ACCESS_JPEG + {"mng_get_jpeg_dctmethod", 1, 0, 0}, + {"mng_get_jpeg_maxjdat", 1, 0, 0}, + {"mng_get_jpeg_optimized", 1, 0, 0}, + {"mng_get_jpeg_progressive", 1, 0, 0}, + {"mng_get_jpeg_quality", 1, 0, 0}, + {"mng_get_jpeg_smoothing", 1, 0, 0}, +#endif + {"mng_get_lastbackchunk", 1, 0, 3}, + {"mng_get_lastseekname", 1, 0, 5}, + {"mng_get_layercount", 1, 0, 0}, +#ifndef MNG_SKIP_MAXCANVAS + {"mng_get_maxcanvasheight", 1, 0, 0}, + {"mng_get_maxcanvaswidth", 1, 0, 0}, +#endif + {"mng_get_playtime", 1, 0, 0}, + {"mng_get_refreshpass", 1, 0, 0}, + {"mng_get_runtime", 1, 0, 0}, + {"mng_get_sectionbreaks", 1, 0, 0}, + {"mng_get_sigtype", 1, 0, 0}, + {"mng_get_simplicity", 1, 0, 0}, + {"mng_get_speed", 1, 0, 0}, + {"mng_get_srgb", 1, 0, 0}, + {"mng_get_starttime", 1, 0, 0}, + {"mng_get_storechunks", 1, 0, 0}, + {"mng_get_suspensionmode", 1, 0, 0}, + {"mng_get_ticks", 1, 0, 0}, +#ifndef MNG_NO_CURRENT_INFO + {"mng_get_totalframes", 1, 0, 5}, + {"mng_get_totallayers", 1, 0, 5}, + {"mng_get_totalplaytime", 1, 0, 5}, +#endif + {"mng_get_usebkgd", 1, 0, 0}, + {"mng_get_userdata", 1, 0, 0}, +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) + {"mng_get_viewgamma", 1, 0, 0}, + {"mng_get_viewgammaint", 1, 0, 0}, +#endif +#ifdef MNG_ACCESS_ZLIB + {"mng_get_zlib_level", 1, 0, 0}, + {"mng_get_zlib_maxidat", 1, 0, 0}, + {"mng_get_zlib_memlevel", 1, 0, 0}, + {"mng_get_zlib_method", 1, 0, 0}, + {"mng_get_zlib_strategy", 1, 0, 0}, + {"mng_get_zlib_windowbits", 1, 0, 0}, +#endif +#ifndef MNG_NO_OPEN_CLOSE_STREAM + {"mng_getcb_closestream", 1, 0, 0}, +#endif + {"mng_getcb_errorproc", 1, 0, 0}, + {"mng_getcb_getalphaline", 1, 0, 0}, + {"mng_getcb_getbkgdline", 1, 0, 0}, + {"mng_getcb_getcanvasline", 1, 0, 0}, + {"mng_getcb_gettickcount", 1, 0, 0}, + {"mng_getcb_memalloc", 1, 0, 0}, + {"mng_getcb_memfree", 1, 0, 0}, +#ifndef MNG_NO_OPEN_CLOSE_STREAM + {"mng_getcb_openstream", 1, 0, 0}, +#endif + {"mng_getcb_processarow", 1, 0, 0}, + {"mng_getcb_processchroma", 1, 0, 0}, + {"mng_getcb_processgamma", 1, 0, 0}, + {"mng_getcb_processheader", 1, 0, 0}, + {"mng_getcb_processiccp", 1, 0, 0}, + {"mng_getcb_processmend", 1, 0, 1}, + {"mng_getcb_processneed", 1, 0, 0}, + {"mng_getcb_processsave", 1, 0, 0}, + {"mng_getcb_processseek", 1, 0, 0}, + {"mng_getcb_processsrgb", 1, 0, 0}, + {"mng_getcb_processterm", 1, 0, 2}, + {"mng_getcb_processtext", 1, 0, 0}, + {"mng_getcb_processunknown", 1, 0, 0}, + {"mng_getcb_readdata", 1, 0, 0}, + {"mng_getcb_refresh", 1, 0, 0}, + {"mng_getcb_releasedata", 1, 0, 8}, + {"mng_getcb_settimer", 1, 0, 0}, + {"mng_getcb_traceproc", 1, 0, 0}, + {"mng_getcb_writedata", 1, 0, 0}, + {"mng_getchunk_back", 1, 0, 0}, + {"mng_getchunk_basi", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_bKGD + {"mng_getchunk_bkgd", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_cHRM + {"mng_getchunk_chrm", 1, 0, 0}, +#endif + {"mng_getchunk_clip", 1, 0, 0}, + {"mng_getchunk_clon", 1, 0, 0}, +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_dBYK + {"mng_getchunk_dbyk", 1, 0, 0}, +#endif +#endif + {"mng_getchunk_defi", 1, 0, 0}, +#ifndef MNG_NO_DELTA_PNG + {"mng_getchunk_dhdr", 1, 0, 0}, +#endif + {"mng_getchunk_disc", 1, 0, 0}, +#ifndef MNG_NO_DELTA_PNG + {"mng_getchunk_drop", 1, 0, 0}, +#endif + {"mng_getchunk_endl", 1, 0, 0}, +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {"mng_getchunk_mpng", 1, 0, 10}, + {"mng_getchunk_mpng_frame", 1, 0, 10}, +#endif +#ifndef MNG_SKIPCHUNK_evNT + {"mng_getchunk_evnt", 1, 0, 5}, + {"mng_getchunk_evnt_entry", 1, 0, 5}, +#endif +#ifndef MNG_SKIPCHUNK_eXPI + {"mng_getchunk_expi", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_fPRI + {"mng_getchunk_fpri", 1, 0, 0}, +#endif + {"mng_getchunk_fram", 1, 0, 0}, + {"mng_getchunk_gama", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_hIST + {"mng_getchunk_hist", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_iCCP + {"mng_getchunk_iccp", 1, 0, 0}, +#endif + {"mng_getchunk_idat", 1, 0, 0}, + {"mng_getchunk_iend", 1, 0, 0}, + {"mng_getchunk_ihdr", 1, 0, 0}, +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG + {"mng_getchunk_ijng", 1, 0, 0}, +#endif + {"mng_getchunk_ipng", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_iTXt + {"mng_getchunk_itxt", 1, 0, 0}, +#endif +#ifdef MNG_INCLUDE_JNG + {"mng_getchunk_jdaa", 1, 0, 0}, + {"mng_getchunk_jdat", 1, 0, 0}, + {"mng_getchunk_jhdr", 1, 0, 0}, + {"mng_getchunk_jsep", 1, 0, 0}, +#endif + {"mng_getchunk_loop", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_MAGN + {"mng_getchunk_magn", 1, 0, 0}, +#endif + {"mng_getchunk_mend", 1, 0, 0}, + {"mng_getchunk_mhdr", 1, 0, 0}, + {"mng_getchunk_move", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_nEED + {"mng_getchunk_need", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_ORDR +#ifndef MNG_NO_DELTA_PNG + {"mng_getchunk_ordr", 1, 0, 0}, + {"mng_getchunk_ordr_entry", 1, 0, 0}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_PAST + {"mng_getchunk_past", 1, 0, 0}, + {"mng_getchunk_past_src", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_pHYg + {"mng_getchunk_phyg", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_pHYs + {"mng_getchunk_phys", 1, 0, 0}, +#endif +#ifndef MNG_NO_DELTA_PNG + {"mng_getchunk_plte", 1, 0, 0}, + {"mng_getchunk_pplt", 1, 0, 0}, + {"mng_getchunk_pplt_entry", 1, 0, 0}, + {"mng_getchunk_prom", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_SAVE + {"mng_getchunk_save", 1, 0, 0}, + {"mng_getchunk_save_entry", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_sBIT + {"mng_getchunk_sbit", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_SEEK + {"mng_getchunk_seek", 1, 0, 0}, +#endif + {"mng_getchunk_show", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_sPLT + {"mng_getchunk_splt", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_sRGB + {"mng_getchunk_srgb", 1, 0, 0}, +#endif + {"mng_getchunk_term", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_tEXt + {"mng_getchunk_text", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_tIME + {"mng_getchunk_time", 1, 0, 0}, +#endif + {"mng_getchunk_trns", 1, 0, 0}, + {"mng_getchunk_unkown", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_zTXt + {"mng_getchunk_ztxt", 1, 0, 0}, +#endif + {"mng_getimgdata_chunk", 0, 0, 0}, + {"mng_getimgdata_chunkseq", 0, 0, 0}, + {"mng_getimgdata_seq", 0, 0, 0}, + {"mng_getlasterror", 1, 0, 0}, + {"mng_initialize", 1, 0, 0}, + {"mng_iterate_chunks", 1, 0, 0}, + {"mng_putchunk_back", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_BASI + {"mng_putchunk_basi", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_bKGD + {"mng_putchunk_bkgd", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_cHRM + {"mng_putchunk_chrm", 1, 0, 0}, +#endif + {"mng_putchunk_clip", 1, 0, 0}, + {"mng_putchunk_clon", 1, 0, 0}, +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK + {"mng_putchunk_dbyk", 1, 0, 0}, +#endif +#endif + {"mng_putchunk_defi", 1, 0, 0}, +#ifndef MNG_NO_DELTA_PNG + {"mng_putchunk_dhdr", 1, 0, 0}, +#endif + {"mng_putchunk_disc", 1, 0, 0}, +#ifndef MNG_NO_DELTA_PNG + {"mng_putchunk_drop", 1, 0, 0}, +#endif + {"mng_putchunk_endl", 1, 0, 0}, +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {"mng_putchunk_mpng", 1, 0, 10}, + {"mng_putchunk_mpng_frame", 1, 0, 10}, +#endif +#ifndef MNG_SKIPCHUNK_evNT + {"mng_putchunk_evnt", 1, 0, 5}, + {"mng_putchunk_evnt_entry", 1, 0, 5}, +#endif +#ifndef MNG_SKIPCHUNK_eXPI + {"mng_putchunk_expi", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_fPRI + {"mng_putchunk_fpri", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_FRAM + {"mng_putchunk_fram", 1, 0, 0}, +#endif + {"mng_putchunk_gama", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_hIST + {"mng_putchunk_hist", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_iCCP + {"mng_putchunk_iccp", 1, 0, 0}, +#endif + {"mng_putchunk_idat", 1, 0, 0}, + {"mng_putchunk_iend", 1, 0, 0}, + {"mng_putchunk_ihdr", 1, 0, 0}, +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG + {"mng_putchunk_ijng", 1, 0, 0}, +#endif + {"mng_putchunk_ipng", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_iTXt + {"mng_putchunk_itxt", 1, 0, 0}, +#endif +#ifdef MNG_INCLUDE_JNG + {"mng_putchunk_jdaa", 1, 0, 0}, + {"mng_putchunk_jdat", 1, 0, 0}, + {"mng_putchunk_jhdr", 1, 0, 0}, + {"mng_putchunk_jsep", 1, 0, 0}, +#endif + {"mng_putchunk_loop", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_MAGN + {"mng_putchunk_magn", 1, 0, 0}, +#endif + {"mng_putchunk_mend", 1, 0, 0}, + {"mng_putchunk_mhdr", 1, 0, 0}, + {"mng_putchunk_move", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_nEED + {"mng_putchunk_need", 1, 0, 0}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR + {"mng_putchunk_ordr", 1, 0, 0}, + {"mng_putchunk_ordr_entry", 1, 0, 0}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_PAST + {"mng_putchunk_past", 1, 0, 0}, + {"mng_putchunk_past_src", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_pHYg + {"mng_putchunk_phyg", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_pHYs + {"mng_putchunk_phys", 1, 0, 0}, +#endif +#ifndef MNG_NO_DELTA_PNG + {"mng_putchunk_plte", 1, 0, 0}, + {"mng_putchunk_pplt", 1, 0, 0}, + {"mng_putchunk_pplt_entry", 1, 0, 0}, + {"mng_putchunk_prom", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_SAVE + {"mng_putchunk_save", 1, 0, 0}, + {"mng_putchunk_save_entry", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_sBIT + {"mng_putchunk_sbit", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_SEEK + {"mng_putchunk_seek", 1, 0, 0}, +#endif + {"mng_putchunk_show", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_sPLT + {"mng_putchunk_splt", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_sRGB + {"mng_putchunk_srgb", 1, 0, 0}, +#endif + {"mng_putchunk_term", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_tEXt + {"mng_putchunk_text", 1, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_tIME + {"mng_putchunk_time", 1, 0, 0}, +#endif + {"mng_putchunk_trns", 1, 0, 0}, + {"mng_putchunk_unkown", 1, 0, 0}, +#ifndef MNG_SKIPCHUNK_zTXt + {"mng_putchunk_ztxt", 1, 0, 0}, +#endif + {"mng_putimgdata_ihdr", 0, 0, 0}, + {"mng_putimgdata_jhdr", 0, 0, 0}, + {"mng_reset", 1, 0, 0}, + {"mng_read", 1, 0, 0}, + {"mng_read_pushchunk", 1, 0, 8}, + {"mng_read_pushdata", 1, 0, 8}, + {"mng_read_pushsig", 1, 0, 8}, + {"mng_read_resume", 1, 0, 0}, + {"mng_readdisplay", 1, 0, 0}, + {"mng_set_bgcolor", 1, 0, 0}, + {"mng_set_bkgdstyle", 1, 0, 0}, + {"mng_set_cacheplayback", 1, 0, 2}, + {"mng_set_canvasstyle", 1, 0, 0}, + {"mng_set_dfltimggamma", 1, 0, 0}, +#ifndef MNG_NO_DFLT_INFO + {"mng_set_dfltimggammaint", 1, 0, 0}, +#endif + {"mng_set_displaygamma", 1, 0, 0}, + {"mng_set_displaygammaint", 1, 0, 0}, + {"mng_set_doprogressive", 1, 0, 2}, +#ifdef MNG_ACCESS_JPEG + {"mng_set_jpeg_dctmethod", 1, 0, 0}, + {"mng_set_jpeg_maxjdat", 1, 0, 0}, + {"mng_set_jpeg_optimized", 1, 0, 0}, + {"mng_set_jpeg_progressive", 1, 0, 0}, + {"mng_set_jpeg_quality", 1, 0, 0}, + {"mng_set_jpeg_smoothing", 1, 0, 0}, +#endif +#ifndef MNG_SKIP_MAXCANVAS + {"mng_set_maxcanvasheight", 1, 0, 0}, + {"mng_set_maxcanvassize", 1, 0, 0}, + {"mng_set_maxcanvaswidth", 1, 0, 0}, +#endif + {"mng_set_outputprofile", 1, 0, 0}, + {"mng_set_outputprofile2", 1, 0, 0}, + {"mng_set_outputsrgb", 1, 0, 1}, + {"mng_set_sectionbreaks", 1, 0, 0}, + {"mng_set_speed", 1, 0, 0}, + {"mng_set_srgb", 1, 0, 0}, + {"mng_set_srgbimplicit", 1, 0, 1}, + {"mng_set_srgbprofile", 1, 0, 0}, + {"mng_set_srgbprofile2", 1, 0, 0}, + {"mng_set_storechunks", 1, 0, 0}, + {"mng_set_suspensionmode", 1, 0, 0}, + {"mng_set_usebkgd", 1, 0, 0}, + {"mng_set_userdata", 1, 0, 0}, +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) + {"mng_set_viewgamma", 1, 0, 0}, + {"mng_set_viewgammaint", 1, 0, 0}, +#endif +#ifdef MNG_ACCESS_ZLIB + {"mng_set_zlib_level", 1, 0, 0}, + {"mng_set_zlib_maxidat", 1, 0, 0}, + {"mng_set_zlib_memlevel", 1, 0, 0}, + {"mng_set_zlib_method", 1, 0, 0}, + {"mng_set_zlib_strategy", 1, 0, 0}, + {"mng_set_zlib_windowbits", 1, 0, 0}, +#endif +#ifndef MNG_NO_OPEN_CLOSE_STREAM + {"mng_setcb_closestream", 1, 0, 0}, +#endif + {"mng_setcb_errorproc", 1, 0, 0}, + {"mng_setcb_getalphaline", 1, 0, 0}, + {"mng_setcb_getbkgdline", 1, 0, 0}, + {"mng_setcb_getcanvasline", 1, 0, 0}, + {"mng_setcb_gettickcount", 1, 0, 0}, + {"mng_setcb_memalloc", 1, 0, 0}, + {"mng_setcb_memfree", 1, 0, 0}, +#ifndef MNG_NO_OPEN_CLOSE_STREAM + {"mng_setcb_openstream", 1, 0, 0}, +#endif + {"mng_setcb_processarow", 1, 0, 0}, + {"mng_setcb_processchroma", 1, 0, 0}, + {"mng_setcb_processgamma", 1, 0, 0}, + {"mng_setcb_processheader", 1, 0, 0}, + {"mng_setcb_processiccp", 1, 0, 0}, + {"mng_setcb_processmend", 1, 0, 1}, + {"mng_setcb_processneed", 1, 0, 0}, + {"mng_setcb_processsave", 1, 0, 0}, + {"mng_setcb_processseek", 1, 0, 0}, + {"mng_setcb_processsrgb", 1, 0, 0}, + {"mng_setcb_processterm", 1, 0, 2}, + {"mng_setcb_processtext", 1, 0, 0}, + {"mng_setcb_processunknown", 1, 0, 0}, + {"mng_setcb_readdata", 1, 0, 0}, + {"mng_setcb_refresh", 1, 0, 0}, + {"mng_setcb_releasedata", 1, 0, 8}, + {"mng_setcb_settimer", 1, 0, 0}, + {"mng_setcb_traceproc", 1, 0, 0}, + {"mng_setcb_writedata", 1, 0, 0}, + {"mng_status_creating", 1, 0, 0}, + {"mng_status_displaying", 1, 0, 0}, + {"mng_status_dynamic", 1, 0, 5}, + {"mng_status_error", 1, 0, 0}, + {"mng_status_reading", 1, 0, 0}, + {"mng_status_running", 1, 0, 0}, + {"mng_status_runningevent", 1, 0, 5}, + {"mng_status_suspendbreak", 1, 0, 0}, + {"mng_status_timerbreak", 1, 0, 0}, + {"mng_status_writing", 1, 0, 0}, + {"mng_supports_func", 1, 0, 5}, + {"mng_trapevent", 1, 0, 5}, + {"mng_updatemngheader", 1, 0, 0}, + {"mng_updatemngsimplicity", 1, 0, 0}, + {"mng_version_beta", 1, 0, 5}, + {"mng_version_dll", 1, 0, 0}, + {"mng_version_major", 1, 0, 0}, + {"mng_version_minor", 1, 0, 0}, + {"mng_version_release", 1, 0, 0}, + {"mng_version_so", 1, 0, 0}, + {"mng_version_text", 1, 0, 0}, + {"mng_write", 1, 0, 0}, + }; + +mng_bool MNG_DECL mng_supports_func (mng_pchar zFunction, + mng_uint8* iMajor, + mng_uint8* iMinor, + mng_uint8* iRelease) +{ + mng_int32 iTop, iLower, iUpper, iMiddle; + mng_func_entryp pEntry; /* pointer to found entry */ + /* determine max index of table */ + iTop = (sizeof (func_table) / sizeof (func_table [0])) - 1; + + iLower = 0; /* initialize binary search */ + iMiddle = iTop >> 1; /* start in the middle */ + iUpper = iTop; + pEntry = 0; /* no goods yet! */ + + do /* the binary search itself */ + { + mng_int32 iRslt = strcmp(func_table [iMiddle].zFunction, zFunction); + if (iRslt < 0) + iLower = iMiddle + 1; + else if (iRslt > 0) + iUpper = iMiddle - 1; + else + { + pEntry = &func_table [iMiddle]; + break; + }; + + iMiddle = (iLower + iUpper) >> 1; + } + while (iLower <= iUpper); + + if (pEntry) /* found it ? */ + { + *iMajor = pEntry->iMajor; + *iMinor = pEntry->iMinor; + *iRelease = pEntry->iRelease; + return MNG_TRUE; + } + else + { + *iMajor = 0; + *iMinor = 0; + *iRelease = 0; + return MNG_FALSE; + } +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * HLAPI routines * */ +/* * * */ +/* ************************************************************************** */ + +mng_handle MNG_DECL mng_initialize (mng_ptr pUserdata, + mng_memalloc fMemalloc, + mng_memfree fMemfree, + mng_traceproc fTraceproc) +{ + mng_datap pData; +#ifdef MNG_SUPPORT_DISPLAY + mng_retcode iRetcode; + mng_imagep pImage; +#endif + +#ifdef MNG_INTERNAL_MEMMNGMT /* allocate the main datastruc */ + pData = (mng_datap)calloc (1, sizeof (mng_data)); +#else + pData = (mng_datap)fMemalloc (sizeof (mng_data)); +#endif + + if (!pData) + return MNG_NULL; /* error: out of memory?? */ + /* validate the structure */ + pData->iMagic = MNG_MAGIC; + /* save userdata field */ + pData->pUserdata = pUserdata; + /* remember trace callback */ + pData->fTraceproc = fTraceproc; + +#ifdef MNG_SUPPORT_TRACE + if (mng_trace (pData, MNG_FN_INITIALIZE, MNG_LC_INITIALIZE)) + { + MNG_FREEX (pData, pData, sizeof (mng_data)); + return MNG_NULL; + } +#endif + /* default canvas styles are 8-bit RGB */ + pData->iCanvasstyle = MNG_CANVAS_RGB8; + pData->iBkgdstyle = MNG_CANVAS_RGB8; + + pData->iBGred = 0; /* black */ + pData->iBGgreen = 0; + pData->iBGblue = 0; + + pData->bUseBKGD = MNG_TRUE; + +#ifdef MNG_FULL_CMS + pData->bIssRGB = MNG_TRUE; + pData->hProf1 = 0; /* no profiles yet */ + pData->hProf2 = 0; + pData->hProf3 = 0; + pData->hTrans = 0; +#endif + + pData->dViewgamma = 1.0; + pData->dDisplaygamma = 2.2; + pData->dDfltimggamma = 0.45455; + /* initially remember chunks */ + pData->bStorechunks = MNG_TRUE; + /* no breaks at section-borders */ + pData->bSectionbreaks = MNG_FALSE; + /* initially cache playback info */ + pData->bCacheplayback = MNG_TRUE; + /* progressive refresh for large images */ + pData->bDoProgressive = MNG_TRUE; + /* crc exists; should check; error for + critical chunks; warning for ancillery; + generate crc for output */ + pData->iCrcmode = MNG_CRC_DEFAULT; + /* normal animation-speed ! */ + pData->iSpeed = mng_st_normal; + /* initial image limits */ + pData->iMaxwidth = 10000; + pData->iMaxheight = 10000; + +#ifdef MNG_INTERNAL_MEMMNGMT /* internal management */ + pData->fMemalloc = MNG_NULL; + pData->fMemfree = MNG_NULL; +#else /* keep callbacks */ + pData->fMemalloc = fMemalloc; + pData->fMemfree = fMemfree; +#endif + /* no value (yet) */ + pData->fReleasedata = MNG_NULL; +#ifndef MNG_NO_OPEN_CLOSE_STREAM + pData->fOpenstream = MNG_NULL; + pData->fClosestream = MNG_NULL; +#endif + pData->fReaddata = MNG_NULL; + pData->fWritedata = MNG_NULL; + pData->fErrorproc = MNG_NULL; + pData->fProcessheader = MNG_NULL; + pData->fProcesstext = MNG_NULL; + pData->fProcesssave = MNG_NULL; + pData->fProcessseek = MNG_NULL; + pData->fProcessneed = MNG_NULL; + pData->fProcessmend = MNG_NULL; + pData->fProcessunknown = MNG_NULL; + pData->fProcessterm = MNG_NULL; + pData->fGetcanvasline = MNG_NULL; + pData->fGetbkgdline = MNG_NULL; + pData->fGetalphaline = MNG_NULL; + pData->fRefresh = MNG_NULL; + pData->fGettickcount = MNG_NULL; + pData->fSettimer = MNG_NULL; + pData->fProcessgamma = MNG_NULL; + pData->fProcesschroma = MNG_NULL; + pData->fProcesssrgb = MNG_NULL; + pData->fProcessiccp = MNG_NULL; + pData->fProcessarow = MNG_NULL; + +#if defined(MNG_SUPPORT_DISPLAY) && (defined(MNG_GAMMA_ONLY) || defined(MNG_FULL_CMS)) + pData->dLastgamma = 0; /* lookup table needs first-time calc */ +#endif + +#ifdef MNG_SUPPORT_DISPLAY /* create object 0 */ + iRetcode = mng_create_imageobject (pData, 0, MNG_TRUE, MNG_TRUE, MNG_TRUE, + 0, 0, 0, 0, 0, 0, 0, 0, 0, MNG_FALSE, + 0, 0, 0, 0, &pImage); + + if (iRetcode) /* on error drop out */ + { + MNG_FREEX (pData, pData, sizeof (mng_data)); + return MNG_NULL; + } + + pData->pObjzero = pImage; +#endif + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_INCLUDE_LCMS) + mnglcms_initlibrary (); /* init lcms particulars */ +#endif + +#ifdef MNG_SUPPORT_READ + pData->bSuspensionmode = MNG_FALSE; + pData->iSuspendbufsize = 0; + pData->pSuspendbuf = MNG_NULL; + pData->pSuspendbufnext = MNG_NULL; + pData->iSuspendbufleft = 0; + pData->iChunklen = 0; + pData->pReadbufnext = MNG_NULL; + pData->pLargebufnext = MNG_NULL; + + pData->pFirstpushchunk = MNG_NULL; + pData->pLastpushchunk = MNG_NULL; + pData->pFirstpushdata = MNG_NULL; + pData->pLastpushdata = MNG_NULL; +#endif + +#ifdef MNG_INCLUDE_ZLIB + mngzlib_initialize (pData); /* initialize zlib structures and such */ + /* default zlib compression parameters */ + pData->iZlevel = MNG_ZLIB_LEVEL; + pData->iZmethod = MNG_ZLIB_METHOD; + pData->iZwindowbits = MNG_ZLIB_WINDOWBITS; + pData->iZmemlevel = MNG_ZLIB_MEMLEVEL; + pData->iZstrategy = MNG_ZLIB_STRATEGY; + /* default maximum IDAT data size */ + pData->iMaxIDAT = MNG_MAX_IDAT_SIZE; +#endif + +#ifdef MNG_INCLUDE_JNG /* default IJG compression parameters */ + pData->eJPEGdctmethod = MNG_JPEG_DCT; + pData->iJPEGquality = MNG_JPEG_QUALITY; + pData->iJPEGsmoothing = MNG_JPEG_SMOOTHING; + pData->bJPEGcompressprogr = MNG_JPEG_PROGRESSIVE; + pData->bJPEGcompressopt = MNG_JPEG_OPTIMIZED; + /* default maximum JDAT data size */ + pData->iMaxJDAT = MNG_MAX_JDAT_SIZE; +#endif + + mng_reset ((mng_handle)pData); + +#ifdef MNG_SUPPORT_TRACE + if (mng_trace (pData, MNG_FN_INITIALIZE, MNG_LC_END)) + { + MNG_FREEX (pData, pData, sizeof (mng_data)); + return MNG_NULL; + } +#endif + + return (mng_handle)pData; /* if we get here, we're in business */ +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_reset (mng_handle hHandle) +{ + mng_datap pData; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_RESET, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)(hHandle)); /* address main structure */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_SKIPCHUNK_SAVE + mng_drop_savedata (pData); /* cleanup saved-data from SAVE/SEEK */ +#endif +#endif + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_FULL_CMS) + mng_clear_cms (pData); /* cleanup left-over cms stuff if any */ +#endif + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_INCLUDE_JNG) + mngjpeg_cleanup (pData); /* cleanup jpeg stuff */ +#endif + +#ifdef MNG_INCLUDE_ZLIB + if (pData->bInflating) /* if we've been inflating */ + { +#ifdef MNG_INCLUDE_DISPLAY_PROCS + mng_cleanup_rowproc (pData); /* cleanup row-processing, */ +#endif + mngzlib_inflatefree (pData); /* cleanup inflate! */ + } +#endif /* MNG_INCLUDE_ZLIB */ + +#ifdef MNG_SUPPORT_READ + if ((pData->bReading) && (!pData->bEOF)) + mng_process_eof (pData); /* cleanup app streaming */ + /* cleanup default read buffers */ + MNG_FREE (pData, pData->pReadbuf, pData->iReadbufsize); + MNG_FREE (pData, pData->pLargebuf, pData->iLargebufsize); + MNG_FREE (pData, pData->pSuspendbuf, pData->iSuspendbufsize); + + while (pData->pFirstpushdata) /* release any pushed data & chunks */ + mng_release_pushdata (pData); + while (pData->pFirstpushchunk) + mng_release_pushchunk (pData); +#endif + +#ifdef MNG_SUPPORT_WRITE /* cleanup default write buffer */ + MNG_FREE (pData, pData->pWritebuf, pData->iWritebufsize); +#endif + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) + mng_drop_chunks (pData); /* drop stored chunks (if any) */ +#endif + +#ifdef MNG_SUPPORT_DISPLAY + mng_drop_objects (pData, MNG_TRUE); /* drop stored objects (if any) */ + +#ifndef MNG_SKIPCHUNK_iCCP + if (pData->iGlobalProfilesize) /* drop global profile (if any) */ + MNG_FREEX (pData, pData->pGlobalProfile, pData->iGlobalProfilesize); +#endif +#endif + + pData->eSigtype = mng_it_unknown; + pData->eImagetype = mng_it_unknown; + pData->iWidth = 0; /* these are unknown yet */ + pData->iHeight = 0; + pData->iTicks = 0; + pData->iLayercount = 0; + pData->iFramecount = 0; + pData->iPlaytime = 0; + pData->iSimplicity = 0; + pData->iAlphadepth = 16; /* assume the worst! */ + + pData->iImagelevel = 0; /* no image encountered */ + + pData->iMagnify = 0; /* 1-to-1 display */ + pData->iOffsetx = 0; /* no offsets */ + pData->iOffsety = 0; + pData->iCanvaswidth = 0; /* let the app decide during processheader */ + pData->iCanvasheight = 0; + /* so far, so good */ + pData->iErrorcode = MNG_NOERROR; + pData->iSeverity = 0; + pData->iErrorx1 = 0; + pData->iErrorx2 = 0; + pData->zErrortext = MNG_NULL; + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) + /* let's assume the best scenario */ +#ifndef MNG_NO_OLD_VERSIONS + pData->bPreDraft48 = MNG_FALSE; +#endif + /* the unknown chunk */ + pData->iChunkname = MNG_UINT_HUH; + pData->iChunkseq = 0; + pData->pFirstchunk = MNG_NULL; + pData->pLastchunk = MNG_NULL; + /* nothing processed yet */ + pData->bHasheader = MNG_FALSE; + pData->bHasMHDR = MNG_FALSE; + pData->bHasIHDR = MNG_FALSE; + pData->bHasBASI = MNG_FALSE; + pData->bHasDHDR = MNG_FALSE; +#ifdef MNG_INCLUDE_JNG + pData->bHasJHDR = MNG_FALSE; + pData->bHasJSEP = MNG_FALSE; + pData->bHasJDAA = MNG_FALSE; + pData->bHasJDAT = MNG_FALSE; +#endif + pData->bHasPLTE = MNG_FALSE; + pData->bHasTRNS = MNG_FALSE; + pData->bHasGAMA = MNG_FALSE; + pData->bHasCHRM = MNG_FALSE; + pData->bHasSRGB = MNG_FALSE; + pData->bHasICCP = MNG_FALSE; + pData->bHasBKGD = MNG_FALSE; + pData->bHasIDAT = MNG_FALSE; + + pData->bHasSAVE = MNG_FALSE; + pData->bHasBACK = MNG_FALSE; + pData->bHasFRAM = MNG_FALSE; + pData->bHasTERM = MNG_FALSE; + pData->bHasLOOP = MNG_FALSE; + /* there's no global stuff yet either */ + pData->bHasglobalPLTE = MNG_FALSE; + pData->bHasglobalTRNS = MNG_FALSE; + pData->bHasglobalGAMA = MNG_FALSE; + pData->bHasglobalCHRM = MNG_FALSE; + pData->bHasglobalSRGB = MNG_FALSE; + pData->bHasglobalICCP = MNG_FALSE; + + pData->iDatawidth = 0; /* no IHDR/BASI/DHDR done yet */ + pData->iDataheight = 0; + pData->iBitdepth = 0; + pData->iColortype = 0; + pData->iCompression = 0; + pData->iFilter = 0; + pData->iInterlace = 0; + +#ifdef MNG_INCLUDE_JNG + pData->iJHDRcolortype = 0; /* no JHDR data */ + pData->iJHDRimgbitdepth = 0; + pData->iJHDRimgcompression = 0; + pData->iJHDRimginterlace = 0; + pData->iJHDRalphabitdepth = 0; + pData->iJHDRalphacompression = 0; + pData->iJHDRalphafilter = 0; + pData->iJHDRalphainterlace = 0; +#endif + +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +#ifdef MNG_SUPPORT_READ /* no reading done */ + pData->bReading = MNG_FALSE; + pData->bHavesig = MNG_FALSE; + pData->bEOF = MNG_FALSE; + pData->iReadbufsize = 0; + pData->pReadbuf = MNG_NULL; + + pData->iLargebufsize = 0; + pData->pLargebuf = MNG_NULL; + + pData->iSuspendtime = 0; + pData->bSuspended = MNG_FALSE; + pData->iSuspendpoint = 0; + + pData->pSuspendbufnext = pData->pSuspendbuf; + pData->iSuspendbufleft = 0; +#endif /* MNG_SUPPORT_READ */ + +#ifdef MNG_SUPPORT_WRITE /* no creating/writing done */ + pData->bCreating = MNG_FALSE; + pData->bWriting = MNG_FALSE; + pData->iFirstchunkadded = 0; + pData->iWritebufsize = 0; + pData->pWritebuf = MNG_NULL; +#endif /* MNG_SUPPORT_WRITE */ + +#ifdef MNG_SUPPORT_DISPLAY /* done nuttin' yet */ + pData->bDisplaying = MNG_FALSE; + pData->iFrameseq = 0; + pData->iLayerseq = 0; + pData->iFrametime = 0; + + pData->iTotallayers = 0; + pData->iTotalframes = 0; + pData->iTotalplaytime = 0; + + pData->bSkipping = MNG_FALSE; + +#ifdef MNG_SUPPORT_DYNAMICMNG + pData->bDynamic = MNG_FALSE; + pData->bRunningevent = MNG_FALSE; + pData->bStopafterseek = MNG_FALSE; + pData->iEventx = 0; + pData->iEventy = 0; + pData->pLastmousemove = MNG_NULL; +#endif + + pData->iRequestframe = 0; + pData->iRequestlayer = 0; + pData->iRequesttime = 0; + pData->bSearching = MNG_FALSE; + + pData->bRestorebkgd = MNG_FALSE; + + pData->iRuntime = 0; + pData->iSynctime = 0; + pData->iStarttime = 0; + pData->iEndtime = 0; + pData->bRunning = MNG_FALSE; + pData->bTimerset = MNG_FALSE; + pData->iBreakpoint = 0; + pData->bSectionwait = MNG_FALSE; + pData->bFreezing = MNG_FALSE; + pData->bResetting = MNG_FALSE; + pData->bNeedrefresh = MNG_FALSE; + pData->bMisplacedTERM = MNG_FALSE; + pData->bOnlyfirstframe = MNG_FALSE; + pData->iFramesafterTERM = 0; + /* these don't exist yet */ + pData->pCurrentobj = MNG_NULL; + pData->pCurraniobj = MNG_NULL; + pData->pTermaniobj = MNG_NULL; + pData->pLastclone = MNG_NULL; + pData->pStoreobj = MNG_NULL; + pData->pStorebuf = MNG_NULL; + pData->pRetrieveobj = MNG_NULL; + /* no saved data ! */ + pData->pSavedata = MNG_NULL; + + pData->iUpdateleft = 0; /* no region updated yet */ + pData->iUpdateright = 0; + pData->iUpdatetop = 0; + pData->iUpdatebottom = 0; + + pData->iPass = -1; /* interlacing stuff and temp buffers */ + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = 0; + pData->iSamplemul = 0; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = 0; + pData->iRowmax = 0; + pData->iFilterofs = 0; + pData->iPixelofs = 1; + pData->iLevel0 = 0; + pData->iLevel1 = 0; + pData->iLevel2 = 0; + pData->iLevel3 = 0; + pData->pWorkrow = MNG_NULL; + pData->pPrevrow = MNG_NULL; + pData->pRGBArow = MNG_NULL; + pData->bIsRGBA16 = MNG_TRUE; + pData->bIsOpaque = MNG_TRUE; + pData->iFilterbpp = 1; + + pData->iSourcel = 0; /* always initialized just before */ + pData->iSourcer = 0; /* compositing the next layer */ + pData->iSourcet = 0; + pData->iSourceb = 0; + pData->iDestl = 0; + pData->iDestr = 0; + pData->iDestt = 0; + pData->iDestb = 0; + /* lists are empty */ + pData->pFirstimgobj = MNG_NULL; + pData->pLastimgobj = MNG_NULL; + pData->pFirstaniobj = MNG_NULL; + pData->pLastaniobj = MNG_NULL; +#ifdef MNG_SUPPORT_DYNAMICMNG + pData->pFirstevent = MNG_NULL; + pData->pLastevent = MNG_NULL; +#endif + /* no processing callbacks */ + pData->fDisplayrow = MNG_NULL; + pData->fRestbkgdrow = MNG_NULL; + pData->fCorrectrow = MNG_NULL; + pData->fRetrieverow = MNG_NULL; + pData->fStorerow = MNG_NULL; + pData->fProcessrow = MNG_NULL; + pData->fDifferrow = MNG_NULL; + pData->fScalerow = MNG_NULL; + pData->fDeltarow = MNG_NULL; +#ifndef MNG_SKIPCHUNK_PAST + pData->fFliprow = MNG_NULL; + pData->fTilerow = MNG_NULL; +#endif + pData->fInitrowproc = MNG_NULL; + + pData->iPLTEcount = 0; /* no PLTE data */ + +#ifndef MNG_SKIPCHUNK_DEFI + pData->iDEFIobjectid = 0; /* no DEFI data */ + pData->bDEFIhasdonotshow = MNG_FALSE; + pData->iDEFIdonotshow = 0; + pData->bDEFIhasconcrete = MNG_FALSE; + pData->iDEFIconcrete = 0; + pData->bDEFIhasloca = MNG_FALSE; + pData->iDEFIlocax = 0; + pData->iDEFIlocay = 0; + pData->bDEFIhasclip = MNG_FALSE; + pData->iDEFIclipl = 0; + pData->iDEFIclipr = 0; + pData->iDEFIclipt = 0; + pData->iDEFIclipb = 0; +#endif + +#ifndef MNG_SKIPCHUNK_BACK + pData->iBACKred = 0; /* no BACK data */ + pData->iBACKgreen = 0; + pData->iBACKblue = 0; + pData->iBACKmandatory = 0; + pData->iBACKimageid = 0; + pData->iBACKtile = 0; +#endif + +#ifndef MNG_SKIPCHUNK_FRAM + pData->iFRAMmode = 1; /* default global FRAM variables */ + pData->iFRAMdelay = 1; + pData->iFRAMtimeout = 0x7fffffffl; + pData->bFRAMclipping = MNG_FALSE; + pData->iFRAMclipl = 0; + pData->iFRAMclipr = 0; + pData->iFRAMclipt = 0; + pData->iFRAMclipb = 0; + + pData->iFramemode = 1; /* again for the current frame */ + pData->iFramedelay = 1; + pData->iFrametimeout = 0x7fffffffl; + pData->bFrameclipping = MNG_FALSE; + pData->iFrameclipl = 0; + pData->iFrameclipr = 0; + pData->iFrameclipt = 0; + pData->iFrameclipb = 0; + + pData->iNextdelay = 1; + + pData->bForcedelay = MNG_FALSE; + pData->iAccumdelay = 0; +#endif + +#ifndef MNG_SKIPCHUNK_SHOW + pData->iSHOWmode = 0; /* no SHOW data */ + pData->iSHOWfromid = 0; + pData->iSHOWtoid = 0; + pData->iSHOWnextid = 0; + pData->iSHOWskip = 0; +#endif + + pData->iGlobalPLTEcount = 0; /* no global PLTE data */ + + pData->iGlobalTRNSrawlen = 0; /* no global tRNS data */ + + pData->iGlobalGamma = 0; /* no global gAMA data */ + +#ifndef MNG_SKIPCHUNK_cHRM + pData->iGlobalWhitepointx = 0; /* no global cHRM data */ + pData->iGlobalWhitepointy = 0; + pData->iGlobalPrimaryredx = 0; + pData->iGlobalPrimaryredy = 0; + pData->iGlobalPrimarygreenx = 0; + pData->iGlobalPrimarygreeny = 0; + pData->iGlobalPrimarybluex = 0; + pData->iGlobalPrimarybluey = 0; +#endif + + pData->iGlobalRendintent = 0; /* no global sRGB data */ + +#ifndef MNG_SKIPCHUNK_iCCP + pData->iGlobalProfilesize = 0; /* no global iCCP data */ + pData->pGlobalProfile = MNG_NULL; +#endif + +#ifndef MNG_SKIPCHUNK_bKGD + pData->iGlobalBKGDred = 0; /* no global bKGD data */ + pData->iGlobalBKGDgreen = 0; + pData->iGlobalBKGDblue = 0; +#endif + /* no delta-image */ +#ifndef MNG_NO_DELTA_PNG + pData->pDeltaImage = MNG_NULL; + pData->iDeltaImagetype = 0; + pData->iDeltatype = 0; + pData->iDeltaBlockwidth = 0; + pData->iDeltaBlockheight = 0; + pData->iDeltaBlockx = 0; + pData->iDeltaBlocky = 0; + pData->bDeltaimmediate = MNG_FALSE; + + pData->fDeltagetrow = MNG_NULL; + pData->fDeltaaddrow = MNG_NULL; + pData->fDeltareplacerow = MNG_NULL; + pData->fDeltaputrow = MNG_NULL; + + pData->fPromoterow = MNG_NULL; + pData->fPromBitdepth = MNG_NULL; + pData->pPromBuf = MNG_NULL; + pData->iPromColortype = 0; + pData->iPromBitdepth = 0; + pData->iPromFilltype = 0; + pData->iPromWidth = 0; + pData->pPromSrc = MNG_NULL; + pData->pPromDst = MNG_NULL; +#endif + +#ifndef MNG_SKIPCHUNK_MAGN + pData->iMAGNfromid = 0; + pData->iMAGNtoid = 0; +#endif + +#ifndef MNG_SKIPCHUNK_PAST + pData->iPastx = 0; + pData->iPasty = 0; +#endif + + pData->pLastseek = MNG_NULL; +#endif + +#ifdef MNG_INCLUDE_ZLIB + pData->bInflating = 0; /* no inflating or deflating */ + pData->bDeflating = 0; /* going on at the moment */ +#endif + +#ifdef MNG_SUPPORT_DISPLAY /* reset object 0 */ + mng_reset_objzero (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_RESET, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_cleanup (mng_handle* hHandle) +{ + mng_datap pData; /* local vars */ +#ifndef MNG_INTERNAL_MEMMNGMT + mng_memfree fFree; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)*hHandle), MNG_FN_CLEANUP, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (*hHandle) /* check validity handle */ + pData = ((mng_datap)(*hHandle)); /* and address main structure */ + + mng_reset (*hHandle); /* do an implicit reset to cleanup most stuff */ + +#ifdef MNG_SUPPORT_DISPLAY /* drop object 0 */ + mng_free_imageobject (pData, (mng_imagep)pData->pObjzero); +#endif + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_FULL_CMS) + if (pData->hProf2) /* output profile defined ? */ + mnglcms_freeprofile (pData->hProf2); + + if (pData->hProf3) /* sRGB profile defined ? */ + mnglcms_freeprofile (pData->hProf3); +#endif + +#ifdef MNG_INCLUDE_ZLIB + mngzlib_cleanup (pData); /* cleanup zlib stuff */ +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)*hHandle), MNG_FN_CLEANUP, MNG_LC_CLEANUP) +#endif + + pData->iMagic = 0; /* invalidate the actual memory */ + +#ifdef MNG_INTERNAL_MEMMNGMT + free ((void *)*hHandle); /* cleanup the data-structure */ +#else + fFree = ((mng_datap)*hHandle)->fMemfree; + fFree ((mng_ptr)*hHandle, sizeof (mng_data)); +#endif + + *hHandle = 0; /* wipe pointer to inhibit future use */ + + return MNG_NOERROR; /* and we're done */ +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_read (mng_handle hHandle) +{ + mng_datap pData; /* local vars */ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle and callbacks */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + +#ifndef MNG_INTERNAL_MEMMNGMT + MNG_VALIDCB (hHandle, fMemalloc) + MNG_VALIDCB (hHandle, fMemfree) +#endif + +#ifndef MNG_NO_OPEN_CLOSE_STREAM + MNG_VALIDCB (hHandle, fOpenstream) + MNG_VALIDCB (hHandle, fClosestream) +#endif + MNG_VALIDCB (hHandle, fReaddata) + +#ifdef MNG_SUPPORT_DISPLAY /* valid at this point ? */ + if ((pData->bReading) || (pData->bDisplaying)) +#else + if (pData->bReading) +#endif + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + +#ifdef MNG_SUPPORT_WRITE + if ((pData->bWriting) || (pData->bCreating)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); +#endif + + if (!pData->bCacheplayback) /* must store playback info to work!! */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + cleanup_errors (pData); /* cleanup previous errors */ + + pData->bReading = MNG_TRUE; /* read only! */ + +#ifndef MNG_NO_OPEN_CLOSE_STREAM + if (pData->fOpenstream && !pData->fOpenstream (hHandle)) + /* open it and start reading */ + iRetcode = MNG_APPIOERROR; + else +#endif + iRetcode = mng_read_graphic (pData); + + if (pData->bEOF) /* already at EOF ? */ + { + pData->bReading = MNG_FALSE; /* then we're no longer reading */ + +#ifdef MNG_SUPPORT_DISPLAY + mng_reset_rundata (pData); /* reset rundata */ +#endif + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (pData->bSuspended) /* read suspension ? */ + { + iRetcode = MNG_NEEDMOREDATA; + pData->iSuspendtime = pData->fGettickcount ((mng_handle)pData); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ, MNG_LC_END); +#endif + + return iRetcode; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_read_pushdata (mng_handle hHandle, + mng_ptr pData, + mng_size_t iLength, + mng_bool bTakeownership) +{ + mng_datap pMyData; /* local vars */ + mng_pushdatap pPush; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ_PUSHDATA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pMyData = ((mng_datap)hHandle); /* and make it addressable */ + /* create a containing buffer */ + iRetcode = make_pushbuffer (pMyData, pData, iLength, bTakeownership, &pPush); + if (iRetcode) + return iRetcode; + + if (pMyData->pLastpushdata) /* and update the buffer chain */ + pMyData->pLastpushdata->pNext = pPush; + else + pMyData->pFirstpushdata = pPush; + + pMyData->pLastpushdata = pPush; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ_PUSHDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_read_pushsig (mng_handle hHandle, + mng_imgtype eSigtype) +{ + mng_datap pData; /* local vars */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ_PUSHSIG, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + + if (pData->bHavesig) /* can we expect this call ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + pData->eSigtype = eSigtype; + pData->bHavesig = MNG_TRUE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ_PUSHSIG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_read_pushchunk (mng_handle hHandle, + mng_ptr pChunk, + mng_size_t iLength, + mng_bool bTakeownership) +{ + mng_datap pMyData; /* local vars */ + mng_pushdatap pPush; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ_PUSHCHUNK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pMyData = ((mng_datap)hHandle); /* and make it addressable */ + /* create a containing buffer */ + iRetcode = make_pushbuffer (pMyData, pChunk, iLength, bTakeownership, &pPush); + if (iRetcode) + return iRetcode; + + if (pMyData->pLastpushchunk) /* and update the buffer chain */ + pMyData->pLastpushchunk->pNext = pPush; + else + pMyData->pFirstpushchunk = pPush; + + pMyData->pLastpushchunk = pPush; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ_PUSHCHUNK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_read_resume (mng_handle hHandle) +{ + mng_datap pData; /* local vars */ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ_RESUME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + /* can we expect this call ? */ + if ((!pData->bReading) || (!pData->bSuspended)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + cleanup_errors (pData); /* cleanup previous errors */ + + pData->bSuspended = MNG_FALSE; /* reset the flag */ + +#ifdef MNG_SUPPORT_DISPLAY /* re-synchronize ? */ + if ((pData->bDisplaying) && (pData->bRunning)) + pData->iSynctime = pData->iSynctime - pData->iSuspendtime + + pData->fGettickcount (hHandle); +#endif + + iRetcode = mng_read_graphic (pData); /* continue reading now */ + + if (pData->bEOF) /* at EOF ? */ + { + pData->bReading = MNG_FALSE; /* then we're no longer reading */ + +#ifdef MNG_SUPPORT_DISPLAY + mng_reset_rundata (pData); /* reset rundata */ +#endif + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (pData->bSuspended) /* read suspension ? */ + { + iRetcode = MNG_NEEDMOREDATA; + pData->iSuspendtime = pData->fGettickcount ((mng_handle)pData); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READ_RESUME, MNG_LC_END); +#endif + + return iRetcode; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_write (mng_handle hHandle) +{ + mng_datap pData; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_WRITE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle and callbacks */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + +#ifndef MNG_INTERNAL_MEMMNGMT + MNG_VALIDCB (hHandle, fMemalloc) + MNG_VALIDCB (hHandle, fMemfree) +#endif + +#ifndef MNG_NO_OPEN_CLOSE_STREAM + MNG_VALIDCB (hHandle, fOpenstream) + MNG_VALIDCB (hHandle, fClosestream) +#endif + MNG_VALIDCB (hHandle, fWritedata) + +#ifdef MNG_SUPPORT_READ + if (pData->bReading) /* valid at this point ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); +#endif + + cleanup_errors (pData); /* cleanup previous errors */ + + iRetcode = mng_write_graphic (pData);/* do the write */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_WRITE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_create (mng_handle hHandle) +{ + mng_datap pData; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_CREATE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle and callbacks */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + +#ifndef MNG_INTERNAL_MEMMNGMT + MNG_VALIDCB (hHandle, fMemalloc) + MNG_VALIDCB (hHandle, fMemfree) +#endif + +#ifdef MNG_SUPPORT_READ + if (pData->bReading) /* valid at this point ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); +#endif + + if ((pData->bWriting) || (pData->bCreating)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + cleanup_errors (pData); /* cleanup previous errors */ + + iRetcode = mng_reset (hHandle); /* clear any previous stuff */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pData->bCreating = MNG_TRUE; /* indicate we're creating a new file */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_CREATE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_READ) +mng_retcode MNG_DECL mng_readdisplay (mng_handle hHandle) +{ + mng_datap pData; /* local vars */ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READDISPLAY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle and callbacks */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + +#ifndef MNG_INTERNAL_MEMMNGMT + MNG_VALIDCB (hHandle, fMemalloc) + MNG_VALIDCB (hHandle, fMemfree) +#endif + + MNG_VALIDCB (hHandle, fReaddata) + MNG_VALIDCB (hHandle, fGetcanvasline) + MNG_VALIDCB (hHandle, fRefresh) + MNG_VALIDCB (hHandle, fGettickcount) + MNG_VALIDCB (hHandle, fSettimer) + /* valid at this point ? */ + if ((pData->bReading) || (pData->bDisplaying)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + +#ifdef MNG_SUPPORT_WRITE + if ((pData->bWriting) || (pData->bCreating)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); +#endif + + cleanup_errors (pData); /* cleanup previous errors */ + + pData->bReading = MNG_TRUE; /* read & display! */ + pData->bDisplaying = MNG_TRUE; + pData->bRunning = MNG_TRUE; + pData->iFrameseq = 0; + pData->iLayerseq = 0; + pData->iFrametime = 0; + pData->iRequestframe = 0; + pData->iRequestlayer = 0; + pData->iRequesttime = 0; + pData->bSearching = MNG_FALSE; + pData->iRuntime = 0; + pData->iSynctime = pData->fGettickcount (hHandle); + pData->iSuspendtime = 0; + pData->iStarttime = pData->iSynctime; + pData->iEndtime = 0; + +#ifndef MNG_NO_OPEN_CLOSE_STREAM + if (pData->fOpenstream && !pData->fOpenstream (hHandle)) + /* open it and start reading */ + iRetcode = MNG_APPIOERROR; + else +#endif + iRetcode = mng_read_graphic (pData); + + if (pData->bEOF) /* already at EOF ? */ + { + pData->bReading = MNG_FALSE; /* then we're no longer reading */ + mng_drop_invalid_objects (pData); /* drop invalidly stored objects */ + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (pData->bSuspended) /* read suspension ? */ + { + iRetcode = MNG_NEEDMOREDATA; + pData->iSuspendtime = pData->fGettickcount ((mng_handle)pData); + } + else + if (pData->bTimerset) /* indicate timer break ? */ + iRetcode = MNG_NEEDTIMERWAIT; + else + if (pData->bSectionwait) /* indicate section break ? */ + iRetcode = MNG_NEEDSECTIONWAIT; + else + { /* no breaks = end of run */ + pData->bRunning = MNG_FALSE; + + if (pData->bFreezing) /* dynamic MNG reached SEEK ? */ + pData->bFreezing = MNG_FALSE; /* reset it ! */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_READDISPLAY, MNG_LC_END); +#endif + + return iRetcode; +} +#endif /* MNG_SUPPORT_DISPLAY && MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_display (mng_handle hHandle) +{ + mng_datap pData; /* local vars */ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle and callbacks */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + +#ifndef MNG_INTERNAL_MEMMNGMT + MNG_VALIDCB (hHandle, fMemalloc) + MNG_VALIDCB (hHandle, fMemfree) +#endif + + MNG_VALIDCB (hHandle, fGetcanvasline) + MNG_VALIDCB (hHandle, fRefresh) + MNG_VALIDCB (hHandle, fGettickcount) + MNG_VALIDCB (hHandle, fSettimer) + + if (pData->bDisplaying) /* valid at this point ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + +#ifdef MNG_SUPPORT_READ + if (pData->bReading) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); +#endif + +#ifdef MNG_SUPPORT_WRITE + if ((pData->bWriting) || (pData->bCreating)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); +#endif + + cleanup_errors (pData); /* cleanup previous errors */ + + pData->bDisplaying = MNG_TRUE; /* display! */ + pData->bRunning = MNG_TRUE; + pData->iFrameseq = 0; + pData->iLayerseq = 0; + pData->iFrametime = 0; + pData->iRequestframe = 0; + pData->iRequestlayer = 0; + pData->iRequesttime = 0; + pData->bSearching = MNG_FALSE; + pData->iRuntime = 0; + pData->iSynctime = pData->fGettickcount (hHandle); +#ifdef MNG_SUPPORT_READ + pData->iSuspendtime = 0; +#endif + pData->iStarttime = pData->iSynctime; + pData->iEndtime = 0; + pData->pCurraniobj = pData->pFirstaniobj; + /* go do it */ + iRetcode = mng_process_display (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (pData->bTimerset) /* indicate timer break ? */ + iRetcode = MNG_NEEDTIMERWAIT; + else + { /* no breaks = end of run */ + pData->bRunning = MNG_FALSE; + + if (pData->bFreezing) /* dynamic MNG reached SEEK ? */ + pData->bFreezing = MNG_FALSE; /* reset it ! */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY, MNG_LC_END); +#endif + + return iRetcode; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_display_resume (mng_handle hHandle) +{ + mng_datap pData; /* local vars */ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_RESUME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + + if (!pData->bDisplaying) /* can we expect this call ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + cleanup_errors (pData); /* cleanup previous errors */ + /* was it running ? */ + if ((pData->bRunning) || (pData->bReading)) + { /* are we expecting this call ? */ + if ((pData->bTimerset) || (pData->bSuspended) || (pData->bSectionwait)) + { + pData->bTimerset = MNG_FALSE; /* reset the flags */ + pData->bSectionwait = MNG_FALSE; + +#ifdef MNG_SUPPORT_READ + if (pData->bReading) /* set during read&display ? */ + { + if (pData->bSuspended) /* calculate proper synchronization */ + pData->iSynctime = pData->iSynctime - pData->iSuspendtime + + pData->fGettickcount (hHandle); + else + pData->iSynctime = pData->fGettickcount (hHandle); + + pData->bSuspended = MNG_FALSE; /* now reset this flag */ + /* and continue reading */ + iRetcode = mng_read_graphic (pData); + + if (pData->bEOF) /* already at EOF ? */ + { + pData->bReading = MNG_FALSE; /* then we're no longer reading */ + /* drop invalidly stored objects */ + mng_drop_invalid_objects (pData); + } + } + else +#endif /* MNG_SUPPORT_READ */ + { /* synchronize timing */ + pData->iSynctime = pData->fGettickcount (hHandle); + /* resume display processing */ + iRetcode = mng_process_display (pData); + } + } + else + { + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + } + } + else + { /* synchronize timing */ + pData->iSynctime = pData->fGettickcount (hHandle); + pData->bRunning = MNG_TRUE; /* it's restarted again ! */ + /* resume display processing */ + iRetcode = mng_process_display (pData); + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (pData->bSuspended) /* read suspension ? */ + { + iRetcode = MNG_NEEDMOREDATA; + pData->iSuspendtime = pData->fGettickcount ((mng_handle)pData); + } + else + if (pData->bTimerset) /* indicate timer break ? */ + iRetcode = MNG_NEEDTIMERWAIT; + else + if (pData->bSectionwait) /* indicate section break ? */ + iRetcode = MNG_NEEDSECTIONWAIT; + else + { /* no breaks = end of run */ + pData->bRunning = MNG_FALSE; + + if (pData->bFreezing) /* trying to freeze ? */ + pData->bFreezing = MNG_FALSE; /* then we're there */ + + if (pData->bResetting) /* trying to reset as well ? */ + { /* full stop!!! */ + pData->bDisplaying = MNG_FALSE; + + iRetcode = mng_reset_rundata (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_RESUME, MNG_LC_END); +#endif + + return iRetcode; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_display_freeze (mng_handle hHandle) +{ + mng_datap pData; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_FREEZE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + /* can we expect this call ? */ + if ((!pData->bDisplaying) || (pData->bReading)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + cleanup_errors (pData); /* cleanup previous errors */ + + if (pData->bRunning) /* is it running ? */ + { + mng_retcode iRetcode; + + pData->bFreezing = MNG_TRUE; /* indicate we need to freeze */ + /* continue "normal" processing */ + iRetcode = mng_display_resume (hHandle); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_FREEZE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_display_reset (mng_handle hHandle) +{ + mng_datap pData; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_RESET, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + /* can we expect this call ? */ + if ((!pData->bDisplaying) || (pData->bReading)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + if (!pData->bCacheplayback) /* must store playback info to work!! */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + cleanup_errors (pData); /* cleanup previous errors */ + + if (pData->bRunning) /* is it running ? */ + { + pData->bFreezing = MNG_TRUE; /* indicate we need to freeze */ + pData->bResetting = MNG_TRUE; /* indicate we're about to reset too */ + /* continue normal processing ? */ + iRetcode = mng_display_resume (hHandle); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + else + { /* full stop!!! */ + pData->bDisplaying = MNG_FALSE; + + iRetcode = mng_reset_rundata (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_RESET, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_DISPLAY_GO_SUPPORTED +mng_retcode MNG_DECL mng_display_goframe (mng_handle hHandle, + mng_uint32 iFramenr) +{ + mng_datap pData; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_GOFRAME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + + if (pData->eImagetype != mng_it_mng) /* is it an animation ? */ + MNG_ERROR (pData, MNG_NOTANANIMATION); + /* can we expect this call ? */ + if ((!pData->bDisplaying) || (pData->bRunning)) + MNG_ERROR ((mng_datap)hHandle, MNG_FUNCTIONINVALID); + + if (!pData->bCacheplayback) /* must store playback info to work!! */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + if (iFramenr > pData->iTotalframes) /* is the parameter within bounds ? */ + MNG_ERROR (pData, MNG_FRAMENRTOOHIGH); + /* within MHDR bounds ? */ + if ((pData->iFramecount) && (iFramenr > pData->iFramecount)) + MNG_WARNING (pData, MNG_FRAMENRTOOHIGH); + + cleanup_errors (pData); /* cleanup previous errors */ + + if (pData->iFrameseq > iFramenr) /* search from current or go back to start ? */ + { + iRetcode = mng_reset_rundata (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + + if (iFramenr) + { + pData->iRequestframe = iFramenr; /* go find the requested frame then */ + iRetcode = mng_process_display (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pData->bTimerset = MNG_FALSE; /* reset just to be safe */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_GOFRAME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_DISPLAY_GO_SUPPORTED +mng_retcode MNG_DECL mng_display_golayer (mng_handle hHandle, + mng_uint32 iLayernr) +{ + mng_datap pData; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_GOLAYER, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + + if (pData->eImagetype != mng_it_mng) /* is it an animation ? */ + MNG_ERROR (pData, MNG_NOTANANIMATION); + /* can we expect this call ? */ + if ((!pData->bDisplaying) || (pData->bRunning)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + if (!pData->bCacheplayback) /* must store playback info to work!! */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + if (iLayernr > pData->iTotallayers) /* is the parameter within bounds ? */ + MNG_ERROR (pData, MNG_LAYERNRTOOHIGH); + /* within MHDR bounds ? */ + if ((pData->iLayercount) && (iLayernr > pData->iLayercount)) + MNG_WARNING (pData, MNG_LAYERNRTOOHIGH); + + cleanup_errors (pData); /* cleanup previous errors */ + + if (pData->iLayerseq > iLayernr) /* search from current or go back to start ? */ + { + iRetcode = mng_reset_rundata (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + + if (iLayernr) + { + pData->iRequestlayer = iLayernr; /* go find the requested layer then */ + iRetcode = mng_process_display (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pData->bTimerset = MNG_FALSE; /* reset just to be safe */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_GOLAYER, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_DISPLAY_GO_SUPPORTED +mng_retcode MNG_DECL mng_display_gotime (mng_handle hHandle, + mng_uint32 iPlaytime) +{ + mng_datap pData; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_GOTIME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + + if (pData->eImagetype != mng_it_mng) /* is it an animation ? */ + MNG_ERROR (pData, MNG_NOTANANIMATION); + /* can we expect this call ? */ + if ((!pData->bDisplaying) || (pData->bRunning)) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + if (!pData->bCacheplayback) /* must store playback info to work!! */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + /* is the parameter within bounds ? */ + if (iPlaytime > pData->iTotalplaytime) + MNG_ERROR (pData, MNG_PLAYTIMETOOHIGH); + /* within MHDR bounds ? */ + if ((pData->iPlaytime) && (iPlaytime > pData->iPlaytime)) + MNG_WARNING (pData, MNG_PLAYTIMETOOHIGH); + + cleanup_errors (pData); /* cleanup previous errors */ + + if (pData->iFrametime > iPlaytime) /* search from current or go back to start ? */ + { + iRetcode = mng_reset_rundata (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + + if (iPlaytime) + { + pData->iRequesttime = iPlaytime; /* go find the requested playtime then */ + iRetcode = mng_process_display (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pData->bTimerset = MNG_FALSE; /* reset just to be safe */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_DISPLAY_GOTIME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG) +mng_retcode MNG_DECL mng_trapevent (mng_handle hHandle, + mng_uint8 iEventtype, + mng_int32 iX, + mng_int32 iY) +{ + mng_datap pData; + mng_eventp pEvent; + mng_bool bFound = MNG_FALSE; + mng_retcode iRetcode; + mng_imagep pImage; + mng_uint8p pPixel; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_TRAPEVENT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + + if (pData->eImagetype != mng_it_mng) /* is it an animation ? */ + MNG_ERROR (pData, MNG_NOTANANIMATION); + + if (!pData->bDisplaying) /* can we expect this call ? */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + if (!pData->bCacheplayback) /* must store playback info to work!! */ + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + /* let's find a matching event object */ + pEvent = (mng_eventp)pData->pFirstevent; + + while ((pEvent) && (!bFound)) + { /* matching eventtype ? */ + if (pEvent->iEventtype == iEventtype) + { + switch (pEvent->iMasktype) /* check X/Y on basis of masktype */ + { + case MNG_MASK_NONE : /* no mask is easy */ + { + bFound = MNG_TRUE; + break; + } + + case MNG_MASK_BOX : /* inside the given box ? */ + { /* right- and bottom-border don't count ! */ + if ((iX >= pEvent->iLeft) && (iX < pEvent->iRight) && + (iY >= pEvent->iTop) && (iY < pEvent->iBottom)) + bFound = MNG_TRUE; + break; + } + + case MNG_MASK_OBJECT : /* non-zero pixel in the image object ? */ + { + pImage = mng_find_imageobject (pData, pEvent->iObjectid); + /* valid image ? */ + if ((pImage) && (pImage->pImgbuf->iBitdepth <= 8) && + ((pImage->pImgbuf->iColortype == 0) || (pImage->pImgbuf->iColortype == 3)) && + ((mng_int32)pImage->pImgbuf->iWidth > iX) && + ((mng_int32)pImage->pImgbuf->iHeight > iY)) + { + pPixel = pImage->pImgbuf->pImgdata + ((pImage->pImgbuf->iWidth * iY) + iX); + + if (*pPixel) /* non-zero ? */ + bFound = MNG_TRUE; + } + + break; + } + + case MNG_MASK_OBJECTIX : /* pixel in the image object matches index ? */ + { + pImage = mng_find_imageobject (pData, pEvent->iObjectid); + /* valid image ? */ + if ((pImage) && (pImage->pImgbuf->iBitdepth <= 8) && + ((pImage->pImgbuf->iColortype == 0) || (pImage->pImgbuf->iColortype == 3)) && + ((mng_int32)pImage->pImgbuf->iWidth > iX) && (iX >= 0) && + ((mng_int32)pImage->pImgbuf->iHeight > iY) && (iY >= 0)) + { + pPixel = pImage->pImgbuf->pImgdata + ((pImage->pImgbuf->iWidth * iY) + iX); + /* matching index ? */ + if (*pPixel == pEvent->iIndex) + bFound = MNG_TRUE; + } + + break; + } + + case MNG_MASK_BOXOBJECT : /* non-zero pixel in the image object ? */ + { + mng_int32 iTempx = iX - pEvent->iLeft; + mng_int32 iTempy = iY - pEvent->iTop; + + pImage = mng_find_imageobject (pData, pEvent->iObjectid); + /* valid image ? */ + if ((pImage) && (pImage->pImgbuf->iBitdepth <= 8) && + ((pImage->pImgbuf->iColortype == 0) || (pImage->pImgbuf->iColortype == 3)) && + (iTempx < (mng_int32)pImage->pImgbuf->iWidth) && + (iTempx >= 0) && (iX < pEvent->iRight) && + (iTempy < (mng_int32)pImage->pImgbuf->iHeight) && + (iTempy >= 0) && (iY < pEvent->iBottom)) + { + pPixel = pImage->pImgbuf->pImgdata + ((pImage->pImgbuf->iWidth * iTempy) + iTempx); + + if (*pPixel) /* non-zero ? */ + bFound = MNG_TRUE; + } + + break; + } + + case MNG_MASK_BOXOBJECTIX : /* pixel in the image object matches index ? */ + { + mng_int32 iTempx = iX - pEvent->iLeft; + mng_int32 iTempy = iY - pEvent->iTop; + + pImage = mng_find_imageobject (pData, pEvent->iObjectid); + /* valid image ? */ + if ((pImage) && (pImage->pImgbuf->iBitdepth <= 8) && + ((pImage->pImgbuf->iColortype == 0) || (pImage->pImgbuf->iColortype == 3)) && + (iTempx < (mng_int32)pImage->pImgbuf->iWidth) && + (iTempx >= 0) && (iX < pEvent->iRight) && + (iTempy < (mng_int32)pImage->pImgbuf->iHeight) && + (iTempy >= 0) && (iY < pEvent->iBottom)) + { + pPixel = pImage->pImgbuf->pImgdata + ((pImage->pImgbuf->iWidth * iTempy) + iTempx); + /* matching index ? */ + if (*pPixel == pEvent->iIndex) + bFound = MNG_TRUE; + } + + break; + } + + } + } + + if (!bFound) /* try the next one */ + pEvent = (mng_eventp)pEvent->sHeader.pNext; + } + /* found one that's not the last mousemove ? */ + if ((pEvent) && ((mng_objectp)pEvent != pData->pLastmousemove)) + { /* can we start an event process now ? */ + if ((!pData->bReading) && (!pData->bRunning)) + { + pData->iEventx = iX; /* save coordinates */ + pData->iEventy = iY; + /* do it then ! */ + iRetcode = pEvent->sHeader.fProcess (pData, pEvent); + + if (iRetcode) /* on error bail out */ + return iRetcode; + /* remember last mousemove event */ + if (pEvent->iEventtype == MNG_EVENT_MOUSEMOVE) + pData->pLastmousemove = (mng_objectp)pEvent; + else + pData->pLastmousemove = MNG_NULL; + } + else + { + + /* TODO: store unprocessed events or not ??? */ + + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_TRAPEVENT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_getlasterror (mng_handle hHandle, + mng_int8* iSeverity, + mng_chunkid* iChunkname, + mng_uint32* iChunkseq, + mng_int32* iExtra1, + mng_int32* iExtra2, + mng_pchar* zErrortext) +{ + mng_datap pData; /* local vars */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETLASTERROR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) /* check validity handle */ + pData = ((mng_datap)hHandle); /* and make it addressable */ + + *iSeverity = pData->iSeverity; /* return the appropriate fields */ + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) + *iChunkname = pData->iChunkname; + *iChunkseq = pData->iChunkseq; +#else + *iChunkname = MNG_UINT_HUH; + *iChunkseq = 0; +#endif + + *iExtra1 = pData->iErrorx1; + *iExtra2 = pData->iErrorx2; + *zErrortext = pData->zErrortext; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETLASTERROR, MNG_LC_END); +#endif + + return pData->iErrorcode; /* and the errorcode */ +} + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + + diff --git a/src/3rdparty/libmng/libmng_jpeg.c b/src/3rdparty/libmng/libmng_jpeg.c new file mode 100644 index 0000000000..5042e1d550 --- /dev/null +++ b/src/3rdparty/libmng/libmng_jpeg.c @@ -0,0 +1,1088 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_jpeg.c copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : JPEG library interface (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the JPEG library interface * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.5.2 - 05/22/2000 - G.Juyn * */ +/* * - implemented all the JNG routines * */ +/* * * */ +/* * 0.5.3 - 06/17/2000 - G.Juyn * */ +/* * - added tracing of JPEG calls * */ +/* * 0.5.3 - 06/24/2000 - G.Juyn * */ +/* * - fixed inclusion of IJG read/write code * */ +/* * 0.5.3 - 06/29/2000 - G.Juyn * */ +/* * - fixed some 64-bit warnings * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added support for JDAA * */ +/* * * */ +/* * 1.0.1 - 04/19/2001 - G.Juyn * */ +/* * - added export of JPEG functions for DLL * */ +/* * 1.0.1 - 04/22/2001 - G.Juyn * */ +/* * - fixed memory-leaks (Thanks Gregg!) * */ +/* * * */ +/* * 1.0.4 - 06/22/2002 - G.Juyn * */ +/* * - B526138 - returned IJGSRC6B calling convention to * */ +/* * default for MSVC * */ +/* * * */ +/* * 1.0.5 - 24/02/2003 - G.Juyn * */ +/* * - B683152 - libjpeg suspension not always honored correctly* */ +/* * * */ +/* * 1.0.6 - 03/04/2003 - G.Juyn * */ +/* * - fixed some compiler-warnings * */ +/* * * */ +/* * 1.0.8 - 08/01/2004 - G.Juyn * */ +/* * - added support for 3+byte pixelsize for JPEG's * */ +/* * * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_memory.h" +#include "libmng_pixels.h" +#include "libmng_jpeg.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#if defined(MNG_INCLUDE_JNG) && defined(MNG_INCLUDE_DISPLAY_PROCS) + +/* ************************************************************************** */ +/* * * */ +/* * Local IJG callback routines (source-manager, error-manager and such) * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_IJG6B + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +#ifdef MNG_DEFINE_JPEG_STDCALL +void MNG_DECL mng_init_source (j_decompress_ptr cinfo) +#else +void mng_init_source (j_decompress_ptr cinfo) +#endif +{ + return; /* nothing needed */ +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +#ifdef MNG_DEFINE_JPEG_STDCALL +boolean MNG_DECL mng_fill_input_buffer (j_decompress_ptr cinfo) +#else +boolean mng_fill_input_buffer (j_decompress_ptr cinfo) +#endif +{ + return FALSE; /* force IJG routine to return to caller */ +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +#ifdef MNG_DEFINE_JPEG_STDCALL +void MNG_DECL mng_skip_input_data (j_decompress_ptr cinfo, long num_bytes) +#else +void mng_skip_input_data (j_decompress_ptr cinfo, long num_bytes) +#endif +{ + if (num_bytes > 0) /* ignore fony calls */ + { /* address my generic structure */ + mng_datap pData = (mng_datap)cinfo->client_data; + /* address source manager */ + mngjpeg_sourcep pSrc = pData->pJPEGdinfo->src; + /* problem scenario ? */ + if (pSrc->bytes_in_buffer < (size_t)num_bytes) + { /* tell the boss we need to skip some data! */ + pData->iJPEGtoskip = (mng_uint32)((size_t)num_bytes - pSrc->bytes_in_buffer); + + pSrc->bytes_in_buffer = 0; /* let the JPEG lib suspend */ + pSrc->next_input_byte = MNG_NULL; + } + else + { /* simply advance in the buffer */ + pSrc->bytes_in_buffer -= num_bytes; + pSrc->next_input_byte += num_bytes; + } + } + + return; +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +#ifdef MNG_DEFINE_JPEG_STDCALL +void MNG_DECL mng_skip_input_data2 (j_decompress_ptr cinfo, long num_bytes) +#else +void mng_skip_input_data2 (j_decompress_ptr cinfo, long num_bytes) +#endif +{ + if (num_bytes > 0) /* ignore fony calls */ + { /* address my generic structure */ + mng_datap pData = (mng_datap)cinfo->client_data; + /* address source manager */ + mngjpeg_sourcep pSrc = pData->pJPEGdinfo2->src; + /* problem scenario ? */ + if (pSrc->bytes_in_buffer < (size_t)num_bytes) + { /* tell the boss we need to skip some data! */ + pData->iJPEGtoskip2 = (mng_uint32)((size_t)num_bytes - pSrc->bytes_in_buffer); + + pSrc->bytes_in_buffer = 0; /* let the JPEG lib suspend */ + pSrc->next_input_byte = MNG_NULL; + } + else + { /* simply advance in the buffer */ + pSrc->bytes_in_buffer -= num_bytes; + pSrc->next_input_byte += num_bytes; + } + } + + return; +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +#ifdef MNG_DEFINE_JPEG_STDCALL +void MNG_DECL mng_term_source (j_decompress_ptr cinfo) +#else +void mng_term_source (j_decompress_ptr cinfo) +#endif +{ + return; /* nothing needed */ +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_USE_SETJMP +#ifdef MNG_DEFINE_JPEG_STDCALL +void MNG_DECL mng_error_exit (j_common_ptr cinfo) +#else +void mng_error_exit (j_common_ptr cinfo) +#endif +{ /* address my generic structure */ + mng_datap pData = (mng_datap)cinfo->client_data; + +#ifdef MNG_ERROR_TELLTALE /* fill the message text ??? */ + (*cinfo->err->output_message) (cinfo); +#endif + /* return to the point of no return... */ + longjmp (pData->sErrorbuf, cinfo->err->msg_code); +} +#endif /* MNG_USE_SETJMP */ + +/* ************************************************************************** */ + +#ifdef MNG_USE_SETJMP +#ifdef MNG_DEFINE_JPEG_STDCALL +void MNG_DECL mng_output_message (j_common_ptr cinfo) +#else +void mng_output_message (j_common_ptr cinfo) +#endif +{ + return; /* just do nothing ! */ +} +#endif /* MNG_USE_SETJMP */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_IJG6B */ + +/* ************************************************************************** */ +/* * * */ +/* * Global JPEG routines * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mngjpeg_initialize (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_INITIALIZE, MNG_LC_START); +#endif + /* allocate space for JPEG structures if necessary */ +#ifdef MNG_INCLUDE_JNG_READ + if (pData->pJPEGderr == MNG_NULL) + MNG_ALLOC (pData, pData->pJPEGderr, sizeof (mngjpeg_error )); + if (pData->pJPEGdsrc == MNG_NULL) + MNG_ALLOC (pData, pData->pJPEGdsrc, sizeof (mngjpeg_source)); + if (pData->pJPEGdinfo == MNG_NULL) + MNG_ALLOC (pData, pData->pJPEGdinfo, sizeof (mngjpeg_decomp)); + /* enable reverse addressing */ + pData->pJPEGdinfo->client_data = pData; + + if (pData->pJPEGderr2 == MNG_NULL) + MNG_ALLOC (pData, pData->pJPEGderr2, sizeof (mngjpeg_error )); + if (pData->pJPEGdsrc2 == MNG_NULL) + MNG_ALLOC (pData, pData->pJPEGdsrc2, sizeof (mngjpeg_source)); + if (pData->pJPEGdinfo2 == MNG_NULL) + MNG_ALLOC (pData, pData->pJPEGdinfo2, sizeof (mngjpeg_decomp)); + /* enable reverse addressing */ + pData->pJPEGdinfo2->client_data = pData; +#endif + +#ifdef MNG_INCLUDE_JNG_WRITE + if (pData->pJPEGcerr == MNG_NULL) + MNG_ALLOC (pData, pData->pJPEGcerr, sizeof (mngjpeg_error )); + if (pData->pJPEGcinfo == MNG_NULL) + MNG_ALLOC (pData, pData->pJPEGcinfo, sizeof (mngjpeg_comp )); + /* enable reverse addressing */ + pData->pJPEGcinfo->client_data = pData; +#endif + + if (pData->pJPEGbuf == MNG_NULL) /* initialize temporary buffers */ + { + pData->iJPEGbufmax = MNG_JPEG_MAXBUF; + MNG_ALLOC (pData, pData->pJPEGbuf, pData->iJPEGbufmax); + } + + if (pData->pJPEGbuf2 == MNG_NULL) + { + pData->iJPEGbufmax2 = MNG_JPEG_MAXBUF; + MNG_ALLOC (pData, pData->pJPEGbuf2, pData->iJPEGbufmax2); + } + + pData->pJPEGcurrent = pData->pJPEGbuf; + pData->iJPEGbufremain = 0; + pData->pJPEGrow = MNG_NULL; + pData->iJPEGrowlen = 0; + pData->iJPEGtoskip = 0; + + pData->pJPEGcurrent2 = pData->pJPEGbuf2; + pData->iJPEGbufremain2 = 0; + pData->pJPEGrow2 = MNG_NULL; + pData->iJPEGrowlen2 = 0; + pData->iJPEGtoskip2 = 0; + /* not doing anything yet ! */ + pData->bJPEGcompress = MNG_FALSE; + + pData->bJPEGdecompress = MNG_FALSE; + pData->bJPEGhasheader = MNG_FALSE; + pData->bJPEGdecostarted = MNG_FALSE; + pData->bJPEGscanstarted = MNG_FALSE; + pData->bJPEGscanending = MNG_FALSE; + + pData->bJPEGdecompress2 = MNG_FALSE; + pData->bJPEGhasheader2 = MNG_FALSE; + pData->bJPEGdecostarted2 = MNG_FALSE; + pData->bJPEGscanstarted2 = MNG_FALSE; + + pData->iJPEGrow = 0; /* zero input/output lines */ + pData->iJPEGalpharow = 0; + pData->iJPEGrgbrow = 0; + pData->iJPEGdisprow = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_INITIALIZE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mngjpeg_cleanup (mng_datap pData) +{ +#if defined(MNG_INCLUDE_IJG6B) && defined(MNG_USE_SETJMP) + mng_retcode iRetcode; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_CLEANUP, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_IJG6B +#ifdef MNG_USE_SETJMP + iRetcode = setjmp (pData->sErrorbuf);/* setup local JPEG error-recovery */ + if (iRetcode != 0) /* got here from longjmp ? */ + MNG_ERRORJ (pData, iRetcode); /* then IJG-lib issued an error */ +#endif + +#ifdef MNG_INCLUDE_JNG_READ /* still decompressing something ? */ + if (pData->bJPEGdecompress) + jpeg_destroy_decompress (pData->pJPEGdinfo); + if (pData->bJPEGdecompress2) + jpeg_destroy_decompress (pData->pJPEGdinfo2); +#endif + +#ifdef MNG_INCLUDE_JNG_WRITE + if (pData->bJPEGcompress) /* still compressing something ? */ + jpeg_destroy_compress (pData->pJPEGcinfo); +#endif + +#endif /* MNG_INCLUDE_IJG6B */ + /* cleanup temporary buffers */ + MNG_FREE (pData, pData->pJPEGbuf2, pData->iJPEGbufmax2); + MNG_FREE (pData, pData->pJPEGbuf, pData->iJPEGbufmax); + /* cleanup space for JPEG structures */ +#ifdef MNG_INCLUDE_JNG_WRITE + MNG_FREE (pData, pData->pJPEGcinfo, sizeof (mngjpeg_comp )); + MNG_FREE (pData, pData->pJPEGcerr, sizeof (mngjpeg_error )); +#endif + +#ifdef MNG_INCLUDE_JNG_READ + MNG_FREE (pData, pData->pJPEGdinfo, sizeof (mngjpeg_decomp)); + MNG_FREE (pData, pData->pJPEGdsrc, sizeof (mngjpeg_source)); + MNG_FREE (pData, pData->pJPEGderr, sizeof (mngjpeg_error )); + MNG_FREE (pData, pData->pJPEGdinfo2, sizeof (mngjpeg_decomp)); + MNG_FREE (pData, pData->pJPEGdsrc2, sizeof (mngjpeg_source)); + MNG_FREE (pData, pData->pJPEGderr2, sizeof (mngjpeg_error )); +#endif + + MNG_FREE (pData, pData->pJPEGrow2, pData->iJPEGrowlen2); + MNG_FREE (pData, pData->pJPEGrow, pData->iJPEGrowlen); + /* whatever we were doing ... */ + /* we don't anymore ... */ + pData->bJPEGcompress = MNG_FALSE; + + pData->bJPEGdecompress = MNG_FALSE; + pData->bJPEGhasheader = MNG_FALSE; + pData->bJPEGdecostarted = MNG_FALSE; + pData->bJPEGscanstarted = MNG_FALSE; + pData->bJPEGscanending = MNG_FALSE; + + pData->bJPEGdecompress2 = MNG_FALSE; + pData->bJPEGhasheader2 = MNG_FALSE; + pData->bJPEGdecostarted2 = MNG_FALSE; + pData->bJPEGscanstarted2 = MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_CLEANUP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* * * */ +/* * JPEG decompression routines (JDAT) * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +mng_retcode mngjpeg_decompressinit (mng_datap pData) +{ +#if defined(MNG_INCLUDE_IJG6B) && defined(MNG_USE_SETJMP) + mng_retcode iRetcode; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSINIT, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_IJG6B + /* allocate and initialize a JPEG decompression object */ + pData->pJPEGdinfo->err = jpeg_std_error (pData->pJPEGderr); + +#ifdef MNG_USE_SETJMP /* setup local JPEG error-routines */ + pData->pJPEGderr->error_exit = mng_error_exit; + pData->pJPEGderr->output_message = mng_output_message; + + iRetcode = setjmp (pData->sErrorbuf);/* setup local JPEG error-recovery */ + if (iRetcode != 0) /* got here from longjmp ? */ + MNG_ERRORJ (pData, iRetcode); /* then IJG-lib issued an error */ +#endif /* MNG_USE_SETJMP */ + + /* allocate and initialize a JPEG decompression object (continued) */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSINIT, MNG_LC_JPEG_CREATE_DECOMPRESS) +#endif + jpeg_create_decompress (pData->pJPEGdinfo); + + pData->bJPEGdecompress = MNG_TRUE; /* indicate it's initialized */ + + /* specify the source of the compressed data (eg, a file) */ + /* no, not a file; we have buffered input */ + pData->pJPEGdinfo->src = pData->pJPEGdsrc; + /* use the default handler */ + pData->pJPEGdinfo->src->resync_to_restart = jpeg_resync_to_restart; + /* setup local source routine & parms */ + pData->pJPEGdinfo->src->init_source = mng_init_source; + pData->pJPEGdinfo->src->fill_input_buffer = mng_fill_input_buffer; + pData->pJPEGdinfo->src->skip_input_data = mng_skip_input_data; + pData->pJPEGdinfo->src->term_source = mng_term_source; + pData->pJPEGdinfo->src->next_input_byte = pData->pJPEGcurrent; + pData->pJPEGdinfo->src->bytes_in_buffer = pData->iJPEGbufremain; + +#endif /* MNG_INCLUDE_IJG6B */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSINIT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +mng_retcode mngjpeg_decompressdata (mng_datap pData, + mng_uint32 iRawsize, + mng_uint8p pRawdata) +{ + mng_retcode iRetcode; + mng_uint32 iRemain; + mng_uint8p pWork; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_START); +#endif + +#if defined (MNG_INCLUDE_IJG6B) && defined(MNG_USE_SETJMP) + iRetcode = setjmp (pData->sErrorbuf);/* initialize local JPEG error-recovery */ + if (iRetcode != 0) /* got here from longjmp ? */ + MNG_ERRORJ (pData, iRetcode); /* then IJG-lib issued an error */ +#endif + + pWork = pRawdata; + iRemain = iRawsize; + + if (pData->iJPEGtoskip) /* JPEG-lib told us to skip some more data ? */ + { + if (iRemain > pData->iJPEGtoskip) /* enough data in this buffer ? */ + { + iRemain -= pData->iJPEGtoskip; /* skip enough to access the next byte */ + pWork += pData->iJPEGtoskip; + + pData->iJPEGtoskip = 0; /* no more to skip then */ + } + else + { + pData->iJPEGtoskip -= iRemain; /* skip all data in the buffer */ + iRemain = 0; /* and indicate this accordingly */ + } + /* the skip set current-pointer to NULL ! */ + pData->pJPEGcurrent = pData->pJPEGbuf; + } + + while (iRemain) /* repeat until no more input-bytes */ + { /* need to shift anything ? */ + if ((pData->pJPEGcurrent > pData->pJPEGbuf) && + (pData->pJPEGcurrent - pData->pJPEGbuf + pData->iJPEGbufremain + iRemain > pData->iJPEGbufmax)) + { + if (pData->iJPEGbufremain > 0) /* then do so */ + MNG_COPY (pData->pJPEGbuf, pData->pJPEGcurrent, pData->iJPEGbufremain); + + pData->pJPEGcurrent = pData->pJPEGbuf; + } + /* does the remaining input fit into the buffer ? */ + if (pData->iJPEGbufremain + iRemain <= pData->iJPEGbufmax) + { /* move the lot */ + MNG_COPY ((pData->pJPEGcurrent + pData->iJPEGbufremain), pWork, iRemain); + + pData->iJPEGbufremain += iRemain;/* adjust remaining_bytes counter */ + iRemain = 0; /* and indicate there's no input left */ + } + else + { /* calculate what does fit */ + mng_uint32 iFits = pData->iJPEGbufmax - pData->iJPEGbufremain; + + if (iFits <= 0) /* no space is just bugger 'm all */ + MNG_ERROR (pData, MNG_JPEGBUFTOOSMALL); + /* move that */ + MNG_COPY ((pData->pJPEGcurrent + pData->iJPEGbufremain), pWork, iFits); + + pData->iJPEGbufremain += iFits; /* adjust remain_bytes counter */ + iRemain -= iFits; /* and the input-parms */ + pWork += iFits; + } + +#ifdef MNG_INCLUDE_IJG6B + pData->pJPEGdinfo->src->next_input_byte = pData->pJPEGcurrent; + pData->pJPEGdinfo->src->bytes_in_buffer = pData->iJPEGbufremain; + + if (!pData->bJPEGhasheader) /* haven't got the header yet ? */ + { + /* call jpeg_read_header() to obtain image info */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_READ_HEADER) +#endif + if (jpeg_read_header (pData->pJPEGdinfo, TRUE) != JPEG_SUSPENDED) + { /* indicate the header's oke */ + pData->bJPEGhasheader = MNG_TRUE; + /* let's do some sanity checks ! */ + if ((pData->pJPEGdinfo->image_width != pData->iDatawidth ) || + (pData->pJPEGdinfo->image_height != pData->iDataheight) ) + MNG_ERROR (pData, MNG_JPEGPARMSERR); + + if ( ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAY ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA) ) && + (pData->pJPEGdinfo->jpeg_color_space != JCS_GRAYSCALE ) ) + MNG_ERROR (pData, MNG_JPEGPARMSERR); + + if ( ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLOR ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) && + (pData->pJPEGdinfo->jpeg_color_space != JCS_YCbCr ) ) + MNG_ERROR (pData, MNG_JPEGPARMSERR); + /* indicate whether or not it's progressive */ + pData->bJPEGprogressive = (mng_bool)jpeg_has_multiple_scans (pData->pJPEGdinfo); + /* progressive+alpha can't display "on-the-fly"!! */ + if ((pData->bJPEGprogressive) && + ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) )) + pData->fDisplayrow = MNG_NULL; + /* allocate a row of JPEG-samples */ + if (pData->pJPEGdinfo->jpeg_color_space == JCS_YCbCr) + pData->iJPEGrowlen = pData->pJPEGdinfo->image_width * RGB_PIXELSIZE; + else + pData->iJPEGrowlen = pData->pJPEGdinfo->image_width; + + MNG_ALLOC (pData, pData->pJPEGrow, pData->iJPEGrowlen); + + pData->iJPEGrgbrow = 0; /* quite empty up to now */ + } + + pData->pJPEGcurrent = (mng_uint8p)pData->pJPEGdinfo->src->next_input_byte; + pData->iJPEGbufremain = (mng_uint32)pData->pJPEGdinfo->src->bytes_in_buffer; + } + /* decompress not started ? */ + if ((pData->bJPEGhasheader) && (!pData->bJPEGdecostarted)) + { + /* set parameters for decompression */ + + if (pData->bJPEGprogressive) /* progressive display ? */ + pData->pJPEGdinfo->buffered_image = TRUE; + + /* jpeg_start_decompress(...); */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_START_DECOMPRESS) +#endif + if (jpeg_start_decompress (pData->pJPEGdinfo) == TRUE) + /* indicate it started */ + pData->bJPEGdecostarted = MNG_TRUE; + + pData->pJPEGcurrent = (mng_uint8p)pData->pJPEGdinfo->src->next_input_byte; + pData->iJPEGbufremain = (mng_uint32)pData->pJPEGdinfo->src->bytes_in_buffer; + } + /* process some scanlines ? */ + if ((pData->bJPEGhasheader) && (pData->bJPEGdecostarted) && + ((!jpeg_input_complete (pData->pJPEGdinfo)) || + (pData->pJPEGdinfo->output_scanline < pData->pJPEGdinfo->output_height) || + ((pData->bJPEGprogressive) && (pData->bJPEGscanending)))) + { + mng_int32 iLines = 0; + + /* for (each output pass) */ + do + { /* address the row output buffer */ + JSAMPROW pRow = (JSAMPROW)pData->pJPEGrow; + + /* init new pass ? */ + if ((pData->bJPEGprogressive) && (!pData->bJPEGscanstarted)) + { + pData->bJPEGscanstarted = MNG_TRUE; + + /* adjust output decompression parameters if required */ + /* nop */ + + /* start a new output pass */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_START_OUTPUT) +#endif + jpeg_start_output (pData->pJPEGdinfo, pData->pJPEGdinfo->input_scan_number); + + pData->iJPEGrow = 0; /* start at row 0 in the image again */ + } + + /* while (scan lines remain to be read) */ + if ((!pData->bJPEGprogressive) || (!pData->bJPEGscanending)) + { + do + { + /* jpeg_read_scanlines(...); */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_READ_SCANLINES) +#endif + iLines = jpeg_read_scanlines (pData->pJPEGdinfo, (JSAMPARRAY)&pRow, 1); + + pData->pJPEGcurrent = (mng_uint8p)pData->pJPEGdinfo->src->next_input_byte; + pData->iJPEGbufremain = (mng_uint32)pData->pJPEGdinfo->src->bytes_in_buffer; + + if (iLines > 0) /* got something ? */ + { + if (pData->fStorerow2) /* store in object ? */ + { + iRetcode = ((mng_storerow)pData->fStorerow2) (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } + } + } + while ((pData->pJPEGdinfo->output_scanline < pData->pJPEGdinfo->output_height) && + (iLines > 0)); /* until end-of-image or not enough input-data */ + } + + /* terminate output pass */ + if ((pData->bJPEGprogressive) && + (pData->pJPEGdinfo->output_scanline >= pData->pJPEGdinfo->output_height)) + { +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_FINISH_OUTPUT) +#endif + if (jpeg_finish_output (pData->pJPEGdinfo) != JPEG_SUSPENDED) + { /* this scan has ended */ + pData->bJPEGscanstarted = MNG_FALSE; + pData->bJPEGscanending = MNG_FALSE; + } + else + { + pData->bJPEGscanending = MNG_TRUE; + } + } + } + while ((!jpeg_input_complete (pData->pJPEGdinfo)) && + (iLines > 0) && (!pData->bJPEGscanending)); + } + /* end of image ? */ + if ((pData->bJPEGhasheader) && (pData->bJPEGdecostarted) && + (!pData->bJPEGscanending) && (jpeg_input_complete (pData->pJPEGdinfo)) && + (pData->pJPEGdinfo->input_scan_number == pData->pJPEGdinfo->output_scan_number)) + { + /* jpeg_finish_decompress(...); */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_FINISH_DECOMPRESS) +#endif + if (jpeg_finish_decompress (pData->pJPEGdinfo) == TRUE) + { /* indicate it's done */ + pData->bJPEGhasheader = MNG_FALSE; + pData->bJPEGdecostarted = MNG_FALSE; + pData->pJPEGcurrent = (mng_uint8p)pData->pJPEGdinfo->src->next_input_byte; + pData->iJPEGbufremain = (mng_uint32)pData->pJPEGdinfo->src->bytes_in_buffer; + /* remaining fluff is an error ! */ + if ((pData->iJPEGbufremain > 0) || (iRemain > 0)) + MNG_ERROR (pData, MNG_TOOMUCHJDAT); + } + } +#endif /* MNG_INCLUDE_IJG6B */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +mng_retcode mngjpeg_decompressfree (mng_datap pData) +{ +#if defined(MNG_INCLUDE_IJG6B) && defined(MNG_USE_SETJMP) + mng_retcode iRetcode; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSFREE, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_IJG6B +#ifdef MNG_USE_SETJMP + iRetcode = setjmp (pData->sErrorbuf);/* setup local JPEG error-recovery */ + if (iRetcode != 0) /* got here from longjmp ? */ + MNG_ERRORJ (pData, iRetcode); /* then IJG-lib issued an error */ +#endif + /* free the row of JPEG-samples*/ + MNG_FREE (pData, pData->pJPEGrow, pData->iJPEGrowlen); + + /* release the JPEG decompression object */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSFREE, MNG_LC_JPEG_DESTROY_DECOMPRESS) +#endif + jpeg_destroy_decompress (pData->pJPEGdinfo); + + pData->bJPEGdecompress = MNG_FALSE; /* indicate it's done */ + +#endif /* MNG_INCLUDE_IJG6B */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSFREE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ +/* * * */ +/* * JPEG decompression routines (JDAA) * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +mng_retcode mngjpeg_decompressinit2 (mng_datap pData) +{ +#if defined(MNG_INCLUDE_IJG6B) && defined(MNG_USE_SETJMP) + mng_retcode iRetcode; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSINIT, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_IJG6B + /* allocate and initialize a JPEG decompression object */ + pData->pJPEGdinfo2->err = jpeg_std_error (pData->pJPEGderr2); + +#ifdef MNG_USE_SETJMP /* setup local JPEG error-routines */ + pData->pJPEGderr2->error_exit = mng_error_exit; + pData->pJPEGderr2->output_message = mng_output_message; + + iRetcode = setjmp (pData->sErrorbuf);/* setup local JPEG error-recovery */ + if (iRetcode != 0) /* got here from longjmp ? */ + MNG_ERRORJ (pData, iRetcode); /* then IJG-lib issued an error */ +#endif /* MNG_USE_SETJMP */ + + /* allocate and initialize a JPEG decompression object (continued) */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSINIT, MNG_LC_JPEG_CREATE_DECOMPRESS) +#endif + jpeg_create_decompress (pData->pJPEGdinfo2); + + pData->bJPEGdecompress2 = MNG_TRUE; /* indicate it's initialized */ + + /* specify the source of the compressed data (eg, a file) */ + /* no, not a file; we have buffered input */ + pData->pJPEGdinfo2->src = pData->pJPEGdsrc2; + /* use the default handler */ + pData->pJPEGdinfo2->src->resync_to_restart = jpeg_resync_to_restart; + /* setup local source routine & parms */ + pData->pJPEGdinfo2->src->init_source = mng_init_source; + pData->pJPEGdinfo2->src->fill_input_buffer = mng_fill_input_buffer; + pData->pJPEGdinfo2->src->skip_input_data = mng_skip_input_data2; + pData->pJPEGdinfo2->src->term_source = mng_term_source; + pData->pJPEGdinfo2->src->next_input_byte = pData->pJPEGcurrent2; + pData->pJPEGdinfo2->src->bytes_in_buffer = pData->iJPEGbufremain2; + +#endif /* MNG_INCLUDE_IJG6B */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSINIT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +mng_retcode mngjpeg_decompressdata2 (mng_datap pData, + mng_uint32 iRawsize, + mng_uint8p pRawdata) +{ + mng_retcode iRetcode; + mng_uint32 iRemain; + mng_uint8p pWork; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_START); +#endif + +#if defined (MNG_INCLUDE_IJG6B) && defined(MNG_USE_SETJMP) + iRetcode = setjmp (pData->sErrorbuf);/* initialize local JPEG error-recovery */ + if (iRetcode != 0) /* got here from longjmp ? */ + MNG_ERRORJ (pData, iRetcode); /* then IJG-lib issued an error */ +#endif + + pWork = pRawdata; + iRemain = iRawsize; + + if (pData->iJPEGtoskip2) /* JPEG-lib told us to skip some more data ? */ + { + if (iRemain > pData->iJPEGtoskip2) /* enough data in this buffer ? */ + { + iRemain -= pData->iJPEGtoskip2; /* skip enough to access the next byte */ + pWork += pData->iJPEGtoskip2; + + pData->iJPEGtoskip2 = 0; /* no more to skip then */ + } + else + { + pData->iJPEGtoskip2 -= iRemain; /* skip all data in the buffer */ + iRemain = 0; /* and indicate this accordingly */ + } + /* the skip set current-pointer to NULL ! */ + pData->pJPEGcurrent2 = pData->pJPEGbuf2; + } + + while (iRemain) /* repeat until no more input-bytes */ + { /* need to shift anything ? */ + if ((pData->pJPEGcurrent2 > pData->pJPEGbuf2) && + (pData->pJPEGcurrent2 - pData->pJPEGbuf2 + pData->iJPEGbufremain2 + iRemain > pData->iJPEGbufmax2)) + { + if (pData->iJPEGbufremain2 > 0) /* then do so */ + MNG_COPY (pData->pJPEGbuf2, pData->pJPEGcurrent2, pData->iJPEGbufremain2); + + pData->pJPEGcurrent2 = pData->pJPEGbuf2; + } + /* does the remaining input fit into the buffer ? */ + if (pData->iJPEGbufremain2 + iRemain <= pData->iJPEGbufmax2) + { /* move the lot */ + MNG_COPY ((pData->pJPEGcurrent2 + pData->iJPEGbufremain2), pWork, iRemain); + /* adjust remaining_bytes counter */ + pData->iJPEGbufremain2 += iRemain; + iRemain = 0; /* and indicate there's no input left */ + } + else + { /* calculate what does fit */ + mng_uint32 iFits = pData->iJPEGbufmax2 - pData->iJPEGbufremain2; + + if (iFits <= 0) /* no space is just bugger 'm all */ + MNG_ERROR (pData, MNG_JPEGBUFTOOSMALL); + /* move that */ + MNG_COPY ((pData->pJPEGcurrent2 + pData->iJPEGbufremain2), pWork, iFits); + + pData->iJPEGbufremain2 += iFits; /* adjust remain_bytes counter */ + iRemain -= iFits; /* and the input-parms */ + pWork += iFits; + } + +#ifdef MNG_INCLUDE_IJG6B + pData->pJPEGdinfo2->src->next_input_byte = pData->pJPEGcurrent2; + pData->pJPEGdinfo2->src->bytes_in_buffer = pData->iJPEGbufremain2; + + if (!pData->bJPEGhasheader2) /* haven't got the header yet ? */ + { + /* call jpeg_read_header() to obtain image info */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_READ_HEADER) +#endif + if (jpeg_read_header (pData->pJPEGdinfo2, TRUE) != JPEG_SUSPENDED) + { /* indicate the header's oke */ + pData->bJPEGhasheader2 = MNG_TRUE; + /* let's do some sanity checks ! */ + if ((pData->pJPEGdinfo2->image_width != pData->iDatawidth ) || + (pData->pJPEGdinfo2->image_height != pData->iDataheight) ) + MNG_ERROR (pData, MNG_JPEGPARMSERR); + + if (pData->pJPEGdinfo2->jpeg_color_space != JCS_GRAYSCALE) + MNG_ERROR (pData, MNG_JPEGPARMSERR); + /* indicate whether or not it's progressive */ + pData->bJPEGprogressive2 = (mng_bool)jpeg_has_multiple_scans (pData->pJPEGdinfo2); + + if (pData->bJPEGprogressive2) /* progressive alphachannel not allowed !!! */ + MNG_ERROR (pData, MNG_JPEGPARMSERR); + /* allocate a row of JPEG-samples */ + if (pData->pJPEGdinfo2->jpeg_color_space == JCS_YCbCr) + pData->iJPEGrowlen2 = pData->pJPEGdinfo2->image_width * RGB_PIXELSIZE; + else + pData->iJPEGrowlen2 = pData->pJPEGdinfo2->image_width; + + MNG_ALLOC (pData, pData->pJPEGrow2, pData->iJPEGrowlen2); + + pData->iJPEGalpharow = 0; /* quite empty up to now */ + } + + pData->pJPEGcurrent2 = (mng_uint8p)pData->pJPEGdinfo2->src->next_input_byte; + pData->iJPEGbufremain2 = (mng_uint32)pData->pJPEGdinfo2->src->bytes_in_buffer; + } + /* decompress not started ? */ + if ((pData->bJPEGhasheader2) && (!pData->bJPEGdecostarted2)) + { + /* set parameters for decompression */ + + if (pData->bJPEGprogressive2) /* progressive display ? */ + pData->pJPEGdinfo2->buffered_image = TRUE; + + /* jpeg_start_decompress(...); */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_START_DECOMPRESS) +#endif + if (jpeg_start_decompress (pData->pJPEGdinfo2) == TRUE) + /* indicate it started */ + pData->bJPEGdecostarted2 = MNG_TRUE; + + pData->pJPEGcurrent2 = (mng_uint8p)pData->pJPEGdinfo2->src->next_input_byte; + pData->iJPEGbufremain2 = (mng_uint32)pData->pJPEGdinfo2->src->bytes_in_buffer; + } + /* process some scanlines ? */ + if ((pData->bJPEGhasheader2) && (pData->bJPEGdecostarted2) && + ((!jpeg_input_complete (pData->pJPEGdinfo2)) || + (pData->pJPEGdinfo2->output_scanline < pData->pJPEGdinfo2->output_height))) + { + mng_int32 iLines; + + /* for (each output pass) */ + do + { /* address the row output buffer */ + JSAMPROW pRow = (JSAMPROW)pData->pJPEGrow2; + + /* init new pass ? */ + if ((pData->bJPEGprogressive2) && + ((!pData->bJPEGscanstarted2) || + (pData->pJPEGdinfo2->output_scanline >= pData->pJPEGdinfo2->output_height))) + { + pData->bJPEGscanstarted2 = MNG_TRUE; + + /* adjust output decompression parameters if required */ + /* nop */ + + /* start a new output pass */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_START_OUTPUT) +#endif + jpeg_start_output (pData->pJPEGdinfo2, pData->pJPEGdinfo2->input_scan_number); + + pData->iJPEGrow = 0; /* start at row 0 in the image again */ + } + + /* while (scan lines remain to be read) */ + do + { + /* jpeg_read_scanlines(...); */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_READ_SCANLINES) +#endif + iLines = jpeg_read_scanlines (pData->pJPEGdinfo2, (JSAMPARRAY)&pRow, 1); + + pData->pJPEGcurrent2 = (mng_uint8p)pData->pJPEGdinfo2->src->next_input_byte; + pData->iJPEGbufremain2 = (mng_uint32)pData->pJPEGdinfo2->src->bytes_in_buffer; + + if (iLines > 0) /* got something ? */ + { + if (pData->fStorerow3) /* store in object ? */ + { + iRetcode = ((mng_storerow)pData->fStorerow3) (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } + } + } + while ((pData->pJPEGdinfo2->output_scanline < pData->pJPEGdinfo2->output_height) && + (iLines > 0)); /* until end-of-image or not enough input-data */ + + /* terminate output pass */ + if ((pData->bJPEGprogressive2) && + (pData->pJPEGdinfo2->output_scanline >= pData->pJPEGdinfo2->output_height)) + { +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_FINISH_OUTPUT) +#endif + if (jpeg_finish_output (pData->pJPEGdinfo2) == JPEG_SUSPENDED) + jpeg_finish_output (pData->pJPEGdinfo2); + /* this scan has ended */ + pData->bJPEGscanstarted2 = MNG_FALSE; + } + } + while ((!jpeg_input_complete (pData->pJPEGdinfo2)) && (iLines > 0)); + } + /* end of image ? */ + if ((pData->bJPEGhasheader2) && (pData->bJPEGdecostarted2) && + (jpeg_input_complete (pData->pJPEGdinfo2)) && + (pData->pJPEGdinfo2->input_scan_number == pData->pJPEGdinfo2->output_scan_number)) + { + /* jpeg_finish_decompress(...); */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_JPEG_FINISH_DECOMPRESS) +#endif + if (jpeg_finish_decompress (pData->pJPEGdinfo2) == TRUE) + { /* indicate it's done */ + pData->bJPEGhasheader2 = MNG_FALSE; + pData->bJPEGdecostarted2 = MNG_FALSE; + pData->pJPEGcurrent2 = (mng_uint8p)pData->pJPEGdinfo2->src->next_input_byte; + pData->iJPEGbufremain2 = (mng_uint32)pData->pJPEGdinfo2->src->bytes_in_buffer; + /* remaining fluff is an error ! */ + if ((pData->iJPEGbufremain2 > 0) || (iRemain > 0)) + MNG_ERROR (pData, MNG_TOOMUCHJDAT); + } + } +#endif /* MNG_INCLUDE_IJG6B */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG_READ +mng_retcode mngjpeg_decompressfree2 (mng_datap pData) +{ +#if defined(MNG_INCLUDE_IJG6B) && defined(MNG_USE_SETJMP) + mng_retcode iRetcode; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSFREE, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_IJG6B +#ifdef MNG_USE_SETJMP + iRetcode = setjmp (pData->sErrorbuf);/* setup local JPEG error-recovery */ + if (iRetcode != 0) /* got here from longjmp ? */ + MNG_ERRORJ (pData, iRetcode); /* then IJG-lib issued an error */ +#endif + /* free the row of JPEG-samples*/ + MNG_FREE (pData, pData->pJPEGrow2, pData->iJPEGrowlen2); + + /* release the JPEG decompression object */ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSFREE, MNG_LC_JPEG_DESTROY_DECOMPRESS) +#endif + jpeg_destroy_decompress (pData->pJPEGdinfo2); + + pData->bJPEGdecompress2 = MNG_FALSE; /* indicate it's done */ + +#endif /* MNG_INCLUDE_IJG6B */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_JPEG_DECOMPRESSFREE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_INCLUDE_JNG_READ */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_JNG && MNG_INCLUDE_DISPLAY_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_jpeg.h b/src/3rdparty/libmng/libmng_jpeg.h new file mode 100644 index 0000000000..a072af9c96 --- /dev/null +++ b/src/3rdparty/libmng/libmng_jpeg.h @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_jpeg.h copyright (c) 2000-2002 G.Juyn * */ +/* * version : 1.0.0 * */ +/* * * */ +/* * purpose : JPEG library interface (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the JPEG library interface * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added support for JDAA * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_jpeg_h_ +#define _libmng_jpeg_h_ + +/* ************************************************************************** */ + +mng_retcode mngjpeg_initialize (mng_datap pData); +mng_retcode mngjpeg_cleanup (mng_datap pData); + +mng_retcode mngjpeg_decompressinit (mng_datap pData); +mng_retcode mngjpeg_decompressdata (mng_datap pData, + mng_uint32 iRawsize, + mng_uint8p pRawdata); +mng_retcode mngjpeg_decompressfree (mng_datap pData); + +mng_retcode mngjpeg_decompressinit2 (mng_datap pData); +mng_retcode mngjpeg_decompressdata2 (mng_datap pData, + mng_uint32 iRawsize, + mng_uint8p pRawdata); +mng_retcode mngjpeg_decompressfree2 (mng_datap pData); + +/* ************************************************************************** */ + +#endif /* _libmng_jpeg_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_memory.h b/src/3rdparty/libmng/libmng_memory.h new file mode 100644 index 0000000000..b92d0c13d9 --- /dev/null +++ b/src/3rdparty/libmng/libmng_memory.h @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_memory.h copyright (c) 2000-2003 G.Juyn * */ +/* * version : 1.0.0 * */ +/* * * */ +/* * purpose : Memory management (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of memory management functions * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.5.3 - 06/12/2000 - G.Juyn * */ +/* * - swapped MNG_COPY parameter-names * */ +/* * 0.5.3 - 06/27/2000 - G.Juyn * */ +/* * - changed size parameter to mng_size_t * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_memory_h_ +#define _libmng_memory_h_ + +/* ************************************************************************** */ +/* * * */ +/* * Generic memory manager macros * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INTERNAL_MEMMNGMT +#define MNG_ALLOC(H,P,L) { P = calloc (1, (mng_size_t)(L)); \ + if (P == 0) { MNG_ERROR (H, MNG_OUTOFMEMORY) } } +#define MNG_ALLOCX(H,P,L) { P = calloc (1, (mng_size_t)(L)); } +#define MNG_FREE(H,P,L) { if (P) { free (P); P = 0; } } +#define MNG_FREEX(H,P,L) { if (P) free (P); } +#else +#define MNG_ALLOC(H,P,L) { P = H->fMemalloc ((mng_size_t)(L)); \ + if (P == 0) { MNG_ERROR (H, MNG_OUTOFMEMORY) } } +#define MNG_ALLOCX(H,P,L) { P = H->fMemalloc ((mng_size_t)(L)); } +#define MNG_FREE(H,P,L) { if (P) { H->fMemfree (P, (mng_size_t)(L)); P = 0; } } +#define MNG_FREEX(H,P,L) { if (P) { H->fMemfree (P, (mng_size_t)(L)); } } +#endif /* mng_internal_memmngmt */ + +#define MNG_COPY(D,S,L) { memcpy (D, S, (mng_size_t)(L)); } + +/* ************************************************************************** */ + +#endif /* _libmng_memory_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_object_prc.c b/src/3rdparty/libmng/libmng_object_prc.c new file mode 100644 index 0000000000..e1724b411f --- /dev/null +++ b/src/3rdparty/libmng/libmng_object_prc.c @@ -0,0 +1,6998 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_object_prc.c copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Object processing routines (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the internal object processing routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.5.2 - 05/20/2000 - G.Juyn * */ +/* * - fixed to support JNG objects * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added support for global color-chunks in animation * */ +/* * - added support for global PLTE,tRNS,bKGD in animation * */ +/* * - added SAVE & SEEK animation objects * */ +/* * 0.5.2 - 05/29/2000 - G.Juyn * */ +/* * - added initialization of framenr/layernr/playtime * */ +/* * - changed ani_object create routines not to return the * */ +/* * created object (wasn't necessary) * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added object promotion routine (PROM handling) * */ +/* * - added ani-object routines for delta-image processing * */ +/* * - added compression/filter/interlace fields to * */ +/* * object-buffer for delta-image processing * */ +/* * * */ +/* * 0.5.3 - 06/17/2000 - G.Juyn * */ +/* * - changed support for delta-image processing * */ +/* * 0.5.3 - 06/20/2000 - G.Juyn * */ +/* * - fixed some small things (as precaution) * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added processing of PLTE/tRNS & color-info for * */ +/* * delta-images in the ani_objects chain * */ +/* * 0.5.3 - 06/22/2000 - G.Juyn * */ +/* * - added support for PPLT chunk * */ +/* * * */ +/* * 0.9.1 - 07/07/2000 - G.Juyn * */ +/* * - added support for freeze/restart/resume & go_xxxx * */ +/* * 0.9.1 - 07/16/2000 - G.Juyn * */ +/* * - fixed support for mng_display() after mng_read() * */ +/* * * */ +/* * 0.9.2 - 07/29/2000 - G.Juyn * */ +/* * - fixed small bugs in display processing * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/07/2000 - G.Juyn * */ +/* * - B111300 - fixup for improved portability * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/10/2000 - G.Juyn * */ +/* * - fixed DEFI behavior * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added valid-flag to stored objects for read() / display()* */ +/* * - added routine to discard "invalid" objects * */ +/* * 0.9.3 - 10/18/2000 - G.Juyn * */ +/* * - fixed delta-processing behavior * */ +/* * 0.9.3 - 10/19/2000 - G.Juyn * */ +/* * - added storage for pixel-/alpha-sampledepth for delta's * */ +/* * * */ +/* * 0.9.4 - 1/18/2001 - G.Juyn * */ +/* * - removed "old" MAGN methods 3 & 4 * */ +/* * - added "new" MAGN methods 3, 4 & 5 * */ +/* * * */ +/* * 0.9.5 - 1/22/2001 - G.Juyn * */ +/* * - B129681 - fixed compiler warnings SGI/Irix * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added optimization option for MNG-video playback * */ +/* * * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * 1.0.5 - 08/16/2002 - G.Juyn * */ +/* * - completed MAGN support (16-bit functions) * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/13/2002 - G.Juyn * */ +/* * - fixed read/write of MAGN chunk * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 09/23/2002 - G.Juyn * */ +/* * - fixed reset_object_detail to clear old buffer * */ +/* * - added in-memory color-correction of abstract images * */ +/* * 1.0.5 - 10/05/2002 - G.Juyn * */ +/* * - fixed problem with cloned objects marked as invalid * */ +/* * - fixed problem cloning frozen object_buffers * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - fixed DISC support * */ +/* * 1.0.5 - 11/04/2002 - G.Juyn * */ +/* * - fixed goframe/golayer/gotime processing * */ +/* * 1.0.5 - 11/07/2002 - G.Juyn * */ +/* * - fixed magnification bug with object 0 * */ +/* * 1.0.5 - 01/19/2003 - G.Juyn * */ +/* * - B664911 - fixed buffer overflow during init * */ +/* * * */ +/* * 1.0.6 - 04/19/2003 - G.Juyn * */ +/* * - fixed problem with infinite loops during readdisplay() * */ +/* * 1.0.6 - 05/25/2003 - G.R-P * */ +/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */ +/* * 1.0.6 - 06/09/2003 - G. R-P * */ +/* * - added conditionals around 8-bit magn routines * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added conditionals around some JNG-supporting code * */ +/* * - removed conditionals around 8-bit magn routines * */ +/* * - added conditionals around delta-png and 16-bit code * */ +/* * 1.0.6 - 07/14/2003 - G.R-P * */ +/* * - added MNG_NO_LOOP_SIGNALS_SUPPORTED conditional * */ +/* * 1.0.6 - 07/29/2003 - G.Juyn * */ +/* * - fixed invalid test in promote_imageobject * */ +/* * 1.0.6 - 07/29/2003 - G.R-P. * */ +/* * - added conditionals around PAST chunk support * */ +/* * 1.0.6 - 08/17/2003 - G.R-P. * */ +/* * - added conditionals around MAGN chunk support * */ +/* * * */ +/* * 1.0.7 - 03/21/2004 - G.Juyn * */ +/* * - fixed some 64-bit platform compiler warnings * */ +/* * * */ +/* * 1.0.9 - 10/10/2004 - G.R-P. * */ +/* * - added MNG_NO_1_2_4BIT_SUPPORT support * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_OBJCLEANUP * */ +/* * 1.0.9 - 12/11/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_DISPLAYCALLS * */ +/* * 1.0.9 - 12/31/2004 - G.R-P. * */ +/* * - fixed warnings about possible uninitialized pointers * */ +/* * 1.0.9 - 01/02/2005 - G.Juyn * */ +/* * - fixing some compiler-warnings * */ +/* * * */ +/* * 1.0.10 - 02/07/2005 - G.Juyn * */ +/* * - fixed some compiler-warnings * */ +/* * 1.0.10 - 07/30/2005 - G.Juyn * */ +/* * - fixed problem with CLON object during readdisplay() * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_memory.h" +#include "libmng_chunks.h" +#include "libmng_objects.h" +#include "libmng_display.h" +#include "libmng_pixels.h" +#include "libmng_object_prc.h" +#include "libmng_cms.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_DISPLAY_PROCS + +/* ************************************************************************** */ +/* * * */ +/* * Generic object routines * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_drop_invalid_objects (mng_datap pData) +{ + mng_objectp pObject; + mng_objectp pNext; + mng_cleanupobject fCleanup; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DROP_INVALID_OBJECTS, MNG_LC_START); +#endif + + pObject = pData->pFirstimgobj; /* get first stored image-object (if any) */ + + while (pObject) /* more objects to check ? */ + { + pNext = ((mng_object_headerp)pObject)->pNext; + /* invalid ? */ + if (!((mng_imagep)pObject)->bValid) + { /* call appropriate cleanup */ + fCleanup = ((mng_object_headerp)pObject)->fCleanup; + fCleanup (pData, pObject); + } + + pObject = pNext; /* neeeext */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DROP_INVALID_OBJECTS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifdef MNG_OPTIMIZE_OBJCLEANUP +MNG_LOCAL mng_retcode create_obj_general (mng_datap pData, + mng_size_t iObjsize, + mng_cleanupobject fCleanup, + mng_processobject fProcess, + mng_ptr *ppObject) +{ + mng_object_headerp pWork; + + MNG_ALLOC (pData, pWork, iObjsize); + + pWork->fCleanup = fCleanup; + pWork->fProcess = fProcess; + pWork->iObjsize = iObjsize; + *ppObject = (mng_ptr)pWork; + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode mng_free_obj_general (mng_datap pData, + mng_objectp pObject) +{ + MNG_FREEX (pData, pObject, ((mng_object_headerp)pObject)->iObjsize); + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Image-data-object routines * */ +/* * * */ +/* * these handle the "object buffer" as defined by the MNG specification * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_create_imagedataobject (mng_datap pData, + mng_bool bConcrete, + mng_bool bViewable, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_imagedatap *ppObject) +{ + mng_imagedatap pImagedata; + mng_uint32 iSamplesize = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_IMGDATAOBJECT, MNG_LC_START); +#endif + /* get a buffer */ +#ifdef MNG_OPTIMIZE_OBJCLEANUP + { + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_imagedata), + (mng_cleanupobject)mng_free_imagedataobject, + MNG_NULL, &pTemp); + if (iRetcode) + return iRetcode; + pImagedata = (mng_imagedatap)pTemp; + } +#else + MNG_ALLOC (pData, pImagedata, sizeof (mng_imagedata)); + /* fill the appropriate fields */ + pImagedata->sHeader.fCleanup = (mng_cleanupobject)mng_free_imagedataobject; + pImagedata->sHeader.fProcess = MNG_NULL; +#endif + pImagedata->iRefcount = 1; + pImagedata->bFrozen = MNG_FALSE; + pImagedata->bConcrete = bConcrete; + pImagedata->bViewable = bViewable; + pImagedata->iWidth = iWidth; + pImagedata->iHeight = iHeight; + pImagedata->iBitdepth = iBitdepth; + pImagedata->iColortype = iColortype; + pImagedata->iCompression = iCompression; + pImagedata->iFilter = iFilter; + pImagedata->iInterlace = iInterlace; + pImagedata->bCorrected = MNG_FALSE; + pImagedata->iAlphabitdepth = 0; + pImagedata->iJHDRcompression = 0; + pImagedata->iJHDRinterlace = 0; + pImagedata->iPixelsampledepth = iBitdepth; + pImagedata->iAlphasampledepth = iBitdepth; + /* determine samplesize from color_type/bit_depth */ + switch (iColortype) /* for < 8-bit samples we just reserve 8 bits */ + { + case 0 : ; /* gray */ + case 8 : { /* JPEG gray */ +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iSamplesize = 2; + else +#endif + iSamplesize = 1; + + break; + } + case 2 : ; /* rgb */ + case 10 : { /* JPEG rgb */ +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iSamplesize = 6; + else +#endif + iSamplesize = 3; + + break; + } + case 3 : { /* indexed */ + iSamplesize = 1; + break; + } + case 4 : ; /* gray+alpha */ + case 12 : { /* JPEG gray+alpha */ +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iSamplesize = 4; + else +#endif + iSamplesize = 2; + + break; + } + case 6 : ; /* rgb+alpha */ + case 14 : { /* JPEG rgb+alpha */ +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iSamplesize = 8; + else +#endif + iSamplesize = 4; + + break; + } + } + /* make sure we remember all this */ + pImagedata->iSamplesize = iSamplesize; + pImagedata->iRowsize = iSamplesize * iWidth; + pImagedata->iImgdatasize = pImagedata->iRowsize * iHeight; + + if (pImagedata->iImgdatasize) /* need a buffer ? */ + { /* so allocate it */ + MNG_ALLOCX (pData, pImagedata->pImgdata, pImagedata->iImgdatasize); + + if (!pImagedata->pImgdata) /* enough memory ? */ + { + MNG_FREEX (pData, pImagedata, sizeof (mng_imagedata)); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + } + /* check global stuff */ + pImagedata->bHasGAMA = pData->bHasglobalGAMA; +#ifndef MNG_SKIPCHUNK_cHRM + pImagedata->bHasCHRM = pData->bHasglobalCHRM; +#endif + pImagedata->bHasSRGB = pData->bHasglobalSRGB; +#ifndef MNG_SKIPCHUNK_iCCP + pImagedata->bHasICCP = pData->bHasglobalICCP; +#endif +#ifndef MNG_SKIPCHUNK_bKGD + pImagedata->bHasBKGD = pData->bHasglobalBKGD; +#endif + + if (pData->bHasglobalGAMA) /* global gAMA present ? */ + pImagedata->iGamma = pData->iGlobalGamma; + +#ifndef MNG_SKIPCHUNK_cHRM + if (pData->bHasglobalCHRM) /* global cHRM present ? */ + { + pImagedata->iWhitepointx = pData->iGlobalWhitepointx; + pImagedata->iWhitepointy = pData->iGlobalWhitepointy; + pImagedata->iPrimaryredx = pData->iGlobalPrimaryredx; + pImagedata->iPrimaryredy = pData->iGlobalPrimaryredy; + pImagedata->iPrimarygreenx = pData->iGlobalPrimarygreenx; + pImagedata->iPrimarygreeny = pData->iGlobalPrimarygreeny; + pImagedata->iPrimarybluex = pData->iGlobalPrimarybluex; + pImagedata->iPrimarybluey = pData->iGlobalPrimarybluey; + } +#endif + + if (pData->bHasglobalSRGB) /* glbal sRGB present ? */ + pImagedata->iRenderingintent = pData->iGlobalRendintent; + +#ifndef MNG_SKIPCHUNK_iCCP + if (pData->bHasglobalICCP) /* glbal iCCP present ? */ + { + pImagedata->iProfilesize = pData->iGlobalProfilesize; + + if (pImagedata->iProfilesize) + { + MNG_ALLOCX (pData, pImagedata->pProfile, pImagedata->iProfilesize); + + if (!pImagedata->pProfile) /* enough memory ? */ + { + MNG_FREEX (pData, pImagedata->pImgdata, pImagedata->iImgdatasize); + MNG_FREEX (pData, pImagedata, sizeof (mng_imagedata)); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + + MNG_COPY (pImagedata->pProfile, pData->pGlobalProfile, pImagedata->iProfilesize); + } + } +#endif + +#ifndef MNG_SKIPCHUNK_bKGD + if (pData->bHasglobalBKGD) /* global bKGD present ? */ + { + pImagedata->iBKGDred = pData->iGlobalBKGDred; + pImagedata->iBKGDgreen = pData->iGlobalBKGDgreen; + pImagedata->iBKGDblue = pData->iGlobalBKGDblue; + } +#endif + + *ppObject = pImagedata; /* return it */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_IMGDATAOBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_free_imagedataobject (mng_datap pData, + mng_imagedatap pImagedata) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IMGDATAOBJECT, MNG_LC_START); +#endif + + if (pImagedata->iRefcount) /* decrease reference count */ + pImagedata->iRefcount--; + + if (!pImagedata->iRefcount) /* reached zero ? */ + { +#ifndef MNG_SKIPCHUNK_iCCP + if (pImagedata->iProfilesize) /* stored an iCCP profile ? */ + MNG_FREEX (pData, pImagedata->pProfile, pImagedata->iProfilesize); +#endif + if (pImagedata->iImgdatasize) /* sample-buffer present ? */ + MNG_FREEX (pData, pImagedata->pImgdata, pImagedata->iImgdatasize); + /* drop the buffer */ + MNG_FREEX (pData, pImagedata, sizeof (mng_imagedata)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IMGDATAOBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_clone_imagedataobject (mng_datap pData, + mng_bool bConcrete, + mng_imagedatap pSource, + mng_imagedatap *ppClone) +{ + mng_imagedatap pNewdata; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLONE_IMGDATAOBJECT, MNG_LC_START); +#endif + /* get a buffer */ + MNG_ALLOC (pData, pNewdata, sizeof (mng_imagedata)); + /* blatently copy the original buffer */ + MNG_COPY (pNewdata, pSource, sizeof (mng_imagedata)); + + pNewdata->iRefcount = 1; /* only the reference count */ + pNewdata->bConcrete = bConcrete; /* and concrete-flag are different */ + pNewdata->bFrozen = MNG_FALSE; + + if (pNewdata->iImgdatasize) /* sample buffer present ? */ + { + MNG_ALLOCX (pData, pNewdata->pImgdata, pNewdata->iImgdatasize); + + if (!pNewdata->pImgdata) /* not enough memory ? */ + { + MNG_FREEX (pData, pNewdata, sizeof (mng_imagedata)); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + /* make a copy */ + MNG_COPY (pNewdata->pImgdata, pSource->pImgdata, pNewdata->iImgdatasize); + } + +#ifndef MNG_SKIPCHUNK_iCCP + if (pNewdata->iProfilesize) /* iCCP profile present ? */ + { + MNG_ALLOCX (pData, pNewdata->pProfile, pNewdata->iProfilesize); + + if (!pNewdata->pProfile) /* enough memory ? */ + { + MNG_FREEX (pData, pNewdata, sizeof (mng_imagedata)); + MNG_ERROR (pData, MNG_OUTOFMEMORY); + } + /* make a copy */ + MNG_COPY (pNewdata->pProfile, pSource->pProfile, pNewdata->iProfilesize); + } +#endif + + *ppClone = pNewdata; /* return the clone */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLONE_IMGDATAOBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* * * */ +/* * Image-object routines * */ +/* * * */ +/* * these handle the "object" as defined by the MNG specification * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_create_imageobject (mng_datap pData, + mng_uint16 iId, + mng_bool bConcrete, + mng_bool bVisible, + mng_bool bViewable, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_int32 iPosx, + mng_int32 iPosy, + mng_bool bClipped, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb, + mng_imagep *ppObject) +{ + mng_imagep pImage; + mng_imagep pPrev, pNext; + mng_retcode iRetcode; + mng_imagedatap pImgbuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_IMGOBJECT, MNG_LC_START); +#endif + /* get a buffer */ + MNG_ALLOC (pData, pImage, sizeof (mng_image)); + /* now get a new "object buffer" */ + iRetcode = mng_create_imagedataobject (pData, bConcrete, bViewable, + iWidth, iHeight, iBitdepth, iColortype, + iCompression, iFilter, iInterlace, + &pImgbuf); + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pImage, sizeof (mng_image)); + return iRetcode; + } + /* fill the appropriate fields */ + pImage->sHeader.fCleanup = (mng_cleanupobject)mng_free_imageobject; + pImage->sHeader.fProcess = MNG_NULL; +#ifdef MNG_OPTIMIZE_OBJCLEANUP + pImage->sHeader.iObjsize = sizeof (mng_image); +#endif + pImage->iId = iId; + pImage->bFrozen = MNG_FALSE; + pImage->bVisible = bVisible; + pImage->bViewable = bViewable; + pImage->bValid = (mng_bool)((pData->bDisplaying) && + ((pData->bRunning) || (pData->bSearching)) && + (!pData->bFreezing)); + pImage->iPosx = iPosx; + pImage->iPosy = iPosy; + pImage->bClipped = bClipped; + pImage->iClipl = iClipl; + pImage->iClipr = iClipr; + pImage->iClipt = iClipt; + pImage->iClipb = iClipb; +#ifndef MNG_SKIPCHUNK_MAGN + pImage->iMAGN_MethodX = 0; + pImage->iMAGN_MethodY = 0; + pImage->iMAGN_MX = 0; + pImage->iMAGN_MY = 0; + pImage->iMAGN_ML = 0; + pImage->iMAGN_MR = 0; + pImage->iMAGN_MT = 0; + pImage->iMAGN_MB = 0; +#endif +#ifndef MNG_SKIPCHUNK_PAST + pImage->iPastx = 0; + pImage->iPasty = 0; +#endif + pImage->pImgbuf = pImgbuf; + + if (iId) /* only if not object 0 ! */ + { /* find previous lower object-id */ + pPrev = (mng_imagep)pData->pLastimgobj; + + while ((pPrev) && (pPrev->iId > iId)) + pPrev = (mng_imagep)pPrev->sHeader.pPrev; + + if (pPrev) /* found it ? */ + { + pImage->sHeader.pPrev = pPrev; /* than link it in place */ + pImage->sHeader.pNext = pPrev->sHeader.pNext; + pPrev->sHeader.pNext = pImage; + } + else /* if not found, it becomes the first ! */ + { + pImage->sHeader.pNext = pData->pFirstimgobj; + pData->pFirstimgobj = pImage; + } + + pNext = (mng_imagep)pImage->sHeader.pNext; + + if (pNext) + pNext->sHeader.pPrev = pImage; + else + pData->pLastimgobj = pImage; + + } + + *ppObject = pImage; /* and return the new buffer */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_IMGOBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* okido */ +} + +/* ************************************************************************** */ + +mng_retcode mng_free_imageobject (mng_datap pData, + mng_imagep pImage) +{ + mng_retcode iRetcode; + mng_imagep pPrev = pImage->sHeader.pPrev; + mng_imagep pNext = pImage->sHeader.pNext; + mng_imagedatap pImgbuf = pImage->pImgbuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IMGOBJECT, MNG_LC_START); +#endif + + if (pImage->iId) /* not for object 0 */ + { + if (pPrev) /* unlink from the list first ! */ + pPrev->sHeader.pNext = pImage->sHeader.pNext; + else + pData->pFirstimgobj = pImage->sHeader.pNext; + + if (pNext) + pNext->sHeader.pPrev = pImage->sHeader.pPrev; + else + pData->pLastimgobj = pImage->sHeader.pPrev; + + } + /* unlink the image-data buffer */ + iRetcode = mng_free_imagedataobject (pData, pImgbuf); + /* drop its own buffer */ + MNG_FREEX (pData, pImage, sizeof (mng_image)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_IMGOBJECT, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +mng_imagep mng_find_imageobject (mng_datap pData, + mng_uint16 iId) +{ + mng_imagep pImage = (mng_imagep)pData->pFirstimgobj; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (pData, MNG_FN_FIND_IMGOBJECT, MNG_LC_START); +#endif + /* look up the right id */ + while ((pImage) && (pImage->iId != iId)) + pImage = (mng_imagep)pImage->sHeader.pNext; + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + if ((!pImage) && (pData->eImagetype == mng_it_mpng)) + pImage = pData->pObjzero; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (pData, MNG_FN_FIND_IMGOBJECT, MNG_LC_END); +#endif + + return pImage; +} + +/* ************************************************************************** */ + +mng_retcode mng_clone_imageobject (mng_datap pData, + mng_uint16 iId, + mng_bool bPartial, + mng_bool bVisible, + mng_bool bAbstract, + mng_bool bHasloca, + mng_uint8 iLocationtype, + mng_int32 iLocationx, + mng_int32 iLocationy, + mng_imagep pSource, + mng_imagep *ppClone) +{ + mng_imagep pNew; + mng_imagep pPrev, pNext; + mng_retcode iRetcode; + mng_imagedatap pImgbuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLONE_IMGOBJECT, MNG_LC_START); +#endif + +#ifndef MNG_SKIPCHUNK_MAGN + if ((pSource->iId) && /* needs magnification ? */ + ((pSource->iMAGN_MethodX) || (pSource->iMAGN_MethodY))) + { + iRetcode = mng_magnify_imageobject (pData, pSource); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif + /* get a buffer */ +#ifdef MNG_OPTIMIZE_OBJCLEANUP + { + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_image), + (mng_cleanupobject)mng_free_imageobject, + MNG_NULL, &pTemp); + if (iRetcode) + return iRetcode; + pNew = (mng_imagep)pTemp; + } +#else + MNG_ALLOC (pData, pNew, sizeof (mng_image)); + /* fill or copy the appropriate fields */ + pNew->sHeader.fCleanup = (mng_cleanupobject)mng_free_imageobject; + pNew->sHeader.fProcess = MNG_NULL; +#endif + pNew->iId = iId; + pNew->bFrozen = MNG_FALSE; + pNew->bVisible = bVisible; + pNew->bViewable = pSource->bViewable; + pNew->bValid = MNG_TRUE; + + if (bHasloca) /* location info available ? */ + { + if (iLocationtype == 0) /* absolute position ? */ + { + pNew->iPosx = iLocationx; + pNew->iPosy = iLocationy; + } + else /* relative */ + { + pNew->iPosx = pSource->iPosx + iLocationx; + pNew->iPosy = pSource->iPosy + iLocationy; + } + } + else /* copy from source */ + { + pNew->iPosx = pSource->iPosx; + pNew->iPosy = pSource->iPosy; + } + /* copy clipping info */ + pNew->bClipped = pSource->bClipped; + pNew->iClipl = pSource->iClipl; + pNew->iClipr = pSource->iClipr; + pNew->iClipt = pSource->iClipt; + pNew->iClipb = pSource->iClipb; +#ifndef MNG_SKIPCHUNK_MAGN + /* copy magnification info */ +/* pNew->iMAGN_MethodX = pSource->iMAGN_MethodX; LET'S NOT !!!!!! + pNew->iMAGN_MethodY = pSource->iMAGN_MethodY; + pNew->iMAGN_MX = pSource->iMAGN_MX; + pNew->iMAGN_MY = pSource->iMAGN_MY; + pNew->iMAGN_ML = pSource->iMAGN_ML; + pNew->iMAGN_MR = pSource->iMAGN_MR; + pNew->iMAGN_MT = pSource->iMAGN_MT; + pNew->iMAGN_MB = pSource->iMAGN_MB; */ +#endif + +#ifndef MNG_SKIPCHUNK_PAST + pNew->iPastx = 0; /* initialize PAST info */ + pNew->iPasty = 0; +#endif + + if (iId) /* not for object 0 */ + { /* find previous lower object-id */ + pPrev = (mng_imagep)pData->pLastimgobj; + while ((pPrev) && (pPrev->iId > iId)) + pPrev = (mng_imagep)pPrev->sHeader.pPrev; + + if (pPrev) /* found it ? */ + { + pNew->sHeader.pPrev = pPrev; /* than link it in place */ + pNew->sHeader.pNext = pPrev->sHeader.pNext; + pPrev->sHeader.pNext = pNew; + } + else /* if not found, it becomes the first ! */ + { + pNew->sHeader.pNext = pData->pFirstimgobj; + pData->pFirstimgobj = pNew; + } + + pNext = (mng_imagep)pNew->sHeader.pNext; + + if (pNext) + pNext->sHeader.pPrev = pNew; + else + pData->pLastimgobj = pNew; + + } + + if (bPartial) /* partial clone ? */ + { + pNew->pImgbuf = pSource->pImgbuf; /* use the same object buffer */ + pNew->pImgbuf->iRefcount++; /* and increase the reference count */ + } + else /* create a full clone ! */ + { + mng_bool bConcrete = MNG_FALSE; /* it's abstract by default (?) */ + + if (!bAbstract) /* determine concreteness from source ? */ + bConcrete = pSource->pImgbuf->bConcrete; + /* create a full clone ! */ + iRetcode = mng_clone_imagedataobject (pData, bConcrete, pSource->pImgbuf, &pImgbuf); + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pNew, sizeof (mng_image)); + return iRetcode; + } + + pNew->pImgbuf = pImgbuf; /* and remember it */ + } + + *ppClone = pNew; /* return it */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLONE_IMGOBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_renum_imageobject (mng_datap pData, + mng_imagep pSource, + mng_uint16 iId, + mng_bool bVisible, + mng_bool bAbstract, + mng_bool bHasloca, + mng_uint8 iLocationtype, + mng_int32 iLocationx, + mng_int32 iLocationy) +{ + mng_imagep pPrev, pNext; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RENUM_IMGOBJECT, MNG_LC_START); +#endif + + pSource->bVisible = bVisible; /* store the new visibility */ + + if (bHasloca) /* location info available ? */ + { + if (iLocationtype == 0) /* absolute position ? */ + { + pSource->iPosx = iLocationx; + pSource->iPosy = iLocationy; + } + else /* relative */ + { + pSource->iPosx = pSource->iPosx + iLocationx; + pSource->iPosy = pSource->iPosy + iLocationy; + } + } + + if (iId) /* not for object 0 */ + { /* find previous lower object-id */ + pPrev = (mng_imagep)pData->pLastimgobj; + while ((pPrev) && (pPrev->iId > iId)) + pPrev = (mng_imagep)pPrev->sHeader.pPrev; + /* different from current ? */ + if (pPrev != (mng_imagep)pSource->sHeader.pPrev) + { + if (pSource->sHeader.pPrev) /* unlink from current position !! */ + ((mng_imagep)pSource->sHeader.pPrev)->sHeader.pNext = pSource->sHeader.pNext; + else + pData->pFirstimgobj = pSource->sHeader.pNext; + + if (pSource->sHeader.pNext) + ((mng_imagep)pSource->sHeader.pNext)->sHeader.pPrev = pSource->sHeader.pPrev; + else + pData->pLastimgobj = pSource->sHeader.pPrev; + + if (pPrev) /* found the previous ? */ + { /* than link it in place */ + pSource->sHeader.pPrev = pPrev; + pSource->sHeader.pNext = pPrev->sHeader.pNext; + pPrev->sHeader.pNext = pSource; + } + else /* if not found, it becomes the first ! */ + { + pSource->sHeader.pNext = pData->pFirstimgobj; + pData->pFirstimgobj = pSource; + } + + pNext = (mng_imagep)pSource->sHeader.pNext; + + if (pNext) + pNext->sHeader.pPrev = pSource; + else + pData->pLastimgobj = pSource; + + } + } + + pSource->iId = iId; /* now set the new id! */ + + if (bAbstract) /* force it to abstract ? */ + pSource->pImgbuf->bConcrete = MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RENUM_IMGOBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_reset_object_details (mng_datap pData, + mng_imagep pImage, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_bool bResetall) +{ + mng_imagedatap pBuf = pImage->pImgbuf; + mng_uint32 iSamplesize = 0; + mng_uint32 iRowsize; + mng_uint32 iImgdatasize; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESET_OBJECTDETAILS, MNG_LC_START); +#endif + + pBuf->iWidth = iWidth; /* set buffer characteristics */ + pBuf->iHeight = iHeight; + pBuf->iBitdepth = iBitdepth; + pBuf->iColortype = iColortype; + pBuf->iCompression = iCompression; + pBuf->iFilter = iFilter; + pBuf->iInterlace = iInterlace; + pBuf->bCorrected = MNG_FALSE; + pBuf->iAlphabitdepth = 0; + /* determine samplesize from color_type/bit_depth */ + switch (iColortype) /* for < 8-bit samples we just reserve 8 bits */ + { + case 0 : ; /* gray */ + case 8 : { /* JPEG gray */ +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iSamplesize = 2; + else +#endif + iSamplesize = 1; + + break; + } + case 2 : ; /* rgb */ + case 10 : { /* JPEG rgb */ +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iSamplesize = 6; + else +#endif + iSamplesize = 3; + + break; + } + case 3 : { /* indexed */ + iSamplesize = 1; + break; + } + case 4 : ; /* gray+alpha */ + case 12 : { /* JPEG gray+alpha */ +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iSamplesize = 4; + else +#endif + iSamplesize = 2; + + break; + } + case 6 : ; /* rgb+alpha */ + case 14 : { /* JPEG rgb+alpha */ +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iSamplesize = 8; + else +#endif + iSamplesize = 4; + + break; + } + } + + iRowsize = iSamplesize * iWidth; + iImgdatasize = iRowsize * iHeight; + /* buffer size changed ? */ + if (iImgdatasize != pBuf->iImgdatasize) + { /* drop the old one */ + MNG_FREE (pData, pBuf->pImgdata, pBuf->iImgdatasize); + + if (iImgdatasize) /* allocate new sample-buffer ? */ + MNG_ALLOC (pData, pBuf->pImgdata, iImgdatasize); + } + else + { + if (iImgdatasize) /* clear old buffer */ + { + mng_uint8p pTemp = pBuf->pImgdata; + mng_uint32 iX; + + for (iX = 0; iX < (iImgdatasize & (mng_uint32)(~3L)); iX += 4) + { + *((mng_uint32p)pTemp) = 0x00000000l; + pTemp += 4; + } + + while (pTemp < (pBuf->pImgdata + iImgdatasize)) + { + *pTemp = 0; + pTemp++; + } + } + } + + pBuf->iSamplesize = iSamplesize; /* remember new sizes */ + pBuf->iRowsize = iRowsize; + pBuf->iImgdatasize = iImgdatasize; + + if (!pBuf->iPixelsampledepth) /* set delta sampledepths if empty */ + pBuf->iPixelsampledepth = iBitdepth; + if (!pBuf->iAlphasampledepth) + pBuf->iAlphasampledepth = iBitdepth; + /* dimension set and clipping not ? */ + if ((iWidth) && (iHeight) && (!pImage->bClipped)) + { + pImage->iClipl = 0; /* set clipping to dimension by default */ + pImage->iClipr = iWidth; + pImage->iClipt = 0; + pImage->iClipb = iHeight; + } + +#ifndef MNG_SKIPCHUNK_MAGN + if (pImage->iId) /* reset magnification info ? */ + { + pImage->iMAGN_MethodX = 0; + pImage->iMAGN_MethodY = 0; + pImage->iMAGN_MX = 0; + pImage->iMAGN_MY = 0; + pImage->iMAGN_ML = 0; + pImage->iMAGN_MR = 0; + pImage->iMAGN_MT = 0; + pImage->iMAGN_MB = 0; + } +#endif + + if (bResetall) /* reset the other characteristics ? */ + { +#ifndef MNG_SKIPCHUNK_PAST + pImage->iPastx = 0; + pImage->iPasty = 0; +#endif + + pBuf->bHasPLTE = MNG_FALSE; + pBuf->bHasTRNS = MNG_FALSE; + pBuf->bHasGAMA = pData->bHasglobalGAMA; +#ifndef MNG_SKIPCHUNK_cHRM + pBuf->bHasCHRM = pData->bHasglobalCHRM; +#endif + pBuf->bHasSRGB = pData->bHasglobalSRGB; +#ifndef MNG_SKIPCHUNK_iCCP + pBuf->bHasICCP = pData->bHasglobalICCP; +#endif +#ifndef MNG_SKIPCHUNK_bKGD + pBuf->bHasBKGD = pData->bHasglobalBKGD; +#endif + +#ifndef MNG_SKIPCHUNK_iCCP + if (pBuf->iProfilesize) /* drop possibly old ICC profile */ + { + MNG_FREE (pData, pBuf->pProfile, pBuf->iProfilesize); + pBuf->iProfilesize = 0; + } +#endif + + if (pData->bHasglobalGAMA) /* global gAMA present ? */ + pBuf->iGamma = pData->iGlobalGamma; + +#ifndef MNG_SKIPCHUNK_cHRM + if (pData->bHasglobalCHRM) /* global cHRM present ? */ + { + pBuf->iWhitepointx = pData->iGlobalWhitepointx; + pBuf->iWhitepointy = pData->iGlobalWhitepointy; + pBuf->iPrimaryredx = pData->iGlobalPrimaryredx; + pBuf->iPrimaryredy = pData->iGlobalPrimaryredy; + pBuf->iPrimarygreenx = pData->iGlobalPrimarygreenx; + pBuf->iPrimarygreeny = pData->iGlobalPrimarygreeny; + pBuf->iPrimarybluex = pData->iGlobalPrimarybluex; + pBuf->iPrimarybluey = pData->iGlobalPrimarybluey; + } +#endif + + if (pData->bHasglobalSRGB) /* global sRGB present ? */ + pBuf->iRenderingintent = pData->iGlobalRendintent; + +#ifndef MNG_SKIPCHUNK_iCCP + if (pData->bHasglobalICCP) /* global iCCP present ? */ + { + if (pData->iGlobalProfilesize) + { + MNG_ALLOC (pData, pBuf->pProfile, pData->iGlobalProfilesize); + MNG_COPY (pBuf->pProfile, pData->pGlobalProfile, pData->iGlobalProfilesize); + } + + pBuf->iProfilesize = pData->iGlobalProfilesize; + } +#endif + +#ifndef MNG_SKIPCHUNK_bKGD + if (pData->bHasglobalBKGD) /* global bKGD present ? */ + { + pBuf->iBKGDred = pData->iGlobalBKGDred; + pBuf->iBKGDgreen = pData->iGlobalBKGDgreen; + pBuf->iBKGDblue = pData->iGlobalBKGDblue; + } +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESET_OBJECTDETAILS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#if !defined(MNG_NO_DELTA_PNG) || !defined(MNG_SKIPCHUNK_PAST) || !defined(MNG_SKIPCHUNK_MAGN) +mng_retcode mng_promote_imageobject (mng_datap pData, + mng_imagep pImage, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iFilltype) +{ + mng_retcode iRetcode = MNG_NOERROR; + mng_imagedatap pBuf = pImage->pImgbuf; + mng_uint32 iW = pBuf->iWidth; + mng_uint32 iH = pBuf->iHeight; + mng_uint8p pNewbuf; + mng_uint32 iNewbufsize; + mng_uint32 iNewrowsize; + mng_uint32 iNewsamplesize = pBuf->iSamplesize; + mng_uint32 iY; + mng_uint8 iTempdepth; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IMGOBJECT, MNG_LC_START); +#endif + +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (iBitdepth < 8) + iBitdepth=8; + if (pBuf->iBitdepth < 8) + pBuf->iBitdepth=8; +#endif +#ifdef MNG_NO_16BIT_SUPPORT + if (iBitdepth > 8) + iBitdepth=8; + if (pBuf->iBitdepth > 8) + pBuf->iBitdepth=8; +#endif + + pData->fPromoterow = MNG_NULL; /* init promotion fields */ + pData->fPromBitdepth = MNG_NULL; + pData->iPromColortype = iColortype; + pData->iPromBitdepth = iBitdepth; + pData->iPromFilltype = iFilltype; + + if (iBitdepth != pBuf->iBitdepth) /* determine bitdepth promotion */ + { + if (pBuf->iColortype == MNG_COLORTYPE_INDEXED) + iTempdepth = 8; + else + iTempdepth = pBuf->iBitdepth; + +#ifndef MNG_NO_DELTA_PNG + if (iFilltype == MNG_FILLMETHOD_ZEROFILL) + { + switch (iTempdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + switch (iBitdepth) + { + case 2 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_1_2; break; } + case 4 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_1_4; break; } + case 8 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_1_8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_1_16; break; } +#endif + } + break; + } + case 2 : { + switch (iBitdepth) + { + case 4 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_2_4; break; } + case 8 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_2_8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_2_16; break; } +#endif + } + break; + } + case 4 : { + switch (iBitdepth) + { + case 8 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_4_8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_4_16; break; } +#endif + } + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromBitdepth = (mng_fptr)mng_promote_zerofill_8_16; +#endif + break; + } + } + } + else +#endif + { + switch (iTempdepth) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case 1 : { + switch (iBitdepth) + { + case 2 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_1_2; break; } + case 4 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_1_4; break; } + case 8 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_1_8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_1_16; break; } +#endif + } + break; + } + case 2 : { + switch (iBitdepth) + { + case 4 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_2_4; break; } + case 8 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_2_8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_2_16; break; } +#endif + } + break; + } + case 4 : { + switch (iBitdepth) + { + case 8 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_4_8; break; } +#ifndef MNG_NO_16BIT_SUPPORT + case 16 : { pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_4_16; break; } +#endif + } + break; + } +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case 8 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromBitdepth = (mng_fptr)mng_promote_replicate_8_16; +#endif + break; + } + } + } + } + /* g -> g */ + if ((pBuf->iColortype == MNG_COLORTYPE_GRAY) && + (iColortype == MNG_COLORTYPE_GRAY)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_g8_g16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_g8_g8; + } + + iNewsamplesize = 1; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 2; +#endif + } + else /* g -> ga */ + if ((pBuf->iColortype == MNG_COLORTYPE_GRAY) && + (iColortype == MNG_COLORTYPE_GRAYA)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_g8_ga16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_g8_ga8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_g16_ga16; +#endif + + iNewsamplesize = 2; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 4; +#endif + } + else /* g -> rgb */ + if ((pBuf->iColortype == MNG_COLORTYPE_GRAY) && + (iColortype == MNG_COLORTYPE_RGB)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_g8_rgb16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_g8_rgb8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_g16_rgb16; +#endif + + iNewsamplesize = 3; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 6; +#endif + } + else /* g -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_GRAY) && + (iColortype == MNG_COLORTYPE_RGBA)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_g8_rgba16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_g8_rgba8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_g16_rgba16; +#endif + + iNewsamplesize = 4; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 8; +#endif + } + else /* ga -> ga */ + if ((pBuf->iColortype == MNG_COLORTYPE_GRAYA) && + (iColortype == MNG_COLORTYPE_GRAYA)) + { + iNewsamplesize = 2; +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_ga8_ga16; + if (iBitdepth == 16) + iNewsamplesize = 4; +#endif + } + else /* ga -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_GRAYA) && + (iColortype == MNG_COLORTYPE_RGBA)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_ga8_rgba16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_ga8_rgba8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_ga16_rgba16; +#endif + + iNewsamplesize = 4; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 8; +#endif + } + else /* rgb -> rgb */ + if ((pBuf->iColortype == MNG_COLORTYPE_RGB) && + (iColortype == MNG_COLORTYPE_RGB)) + { + iNewsamplesize = 3; +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_rgb8_rgb16; + if (iBitdepth == 16) + iNewsamplesize = 6; +#endif + } + else /* rgb -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_RGB) && + (iColortype == MNG_COLORTYPE_RGBA)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_rgb8_rgba16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_rgb8_rgba8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_rgb16_rgba16; +#endif + + iNewsamplesize = 4; +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 8; +#endif + } + else /* indexed -> rgb */ + if ((pBuf->iColortype == MNG_COLORTYPE_INDEXED) && + (iColortype == MNG_COLORTYPE_RGB)) + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_idx8_rgb16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_idx8_rgb8; + + iNewsamplesize = 3; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 6; +#endif + } + else /* indexed -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_INDEXED) && + (iColortype == MNG_COLORTYPE_RGBA)) + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_idx8_rgba16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_idx8_rgba8; + + iNewsamplesize = 4; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 8; +#endif + } + else /* rgba -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_RGBA) && + (iColortype == MNG_COLORTYPE_RGBA)) + { + iNewsamplesize = 4; +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_rgba8_rgba16; + } + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 8; +#endif + } +#ifdef MNG_INCLUDE_JNG + else /* JPEG g -> g */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAY) && + (iColortype == MNG_COLORTYPE_JPEGGRAY)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_g8_g16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_g8_g8; + } + + iNewsamplesize = 1; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 2; +#endif + } + else /* JPEG g -> ga */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAY) && + (iColortype == MNG_COLORTYPE_JPEGGRAYA)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_g8_ga16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_g8_ga8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_g16_ga16; +#endif + + iNewsamplesize = 2; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 4; +#endif + } + else /* JPEG g -> rgb */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAY) && + (iColortype == MNG_COLORTYPE_JPEGCOLOR)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_g8_rgb16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_g8_rgb8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_g16_rgb16; +#endif + + iNewsamplesize = 3; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 6; +#endif + } + else /* JPEG g -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAY) && + (iColortype == MNG_COLORTYPE_JPEGCOLORA)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_g8_rgba16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_g8_rgba8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_g16_rgba16; +#endif + + iNewsamplesize = 4; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 8; +#endif + } + else /* JPEG ga -> ga */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAYA) && + (iColortype == MNG_COLORTYPE_JPEGGRAYA)) + { + iNewsamplesize = 2; +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_ga8_ga16; + if (iBitdepth == 16) + iNewsamplesize = 4; +#endif + + } + else /* JPEG ga -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGGRAYA) && + (iColortype == MNG_COLORTYPE_JPEGCOLORA)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_ga8_rgba16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_ga8_rgba8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_ga16_rgba16; +#endif + + iNewsamplesize = 4; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 8; +#endif + } + else /* JPEG rgb -> rgb */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGCOLOR) && + (iColortype == MNG_COLORTYPE_JPEGCOLOR)) + { + iNewsamplesize = 3; +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_rgb8_rgb16; + if (iBitdepth == 16) + iNewsamplesize = 6; +#endif + + } + else /* JPEG rgb -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGCOLOR) && + (iColortype == MNG_COLORTYPE_JPEGCOLORA)) + { + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + { +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_rgb8_rgba16; + else +#endif + pData->fPromoterow = (mng_fptr)mng_promote_rgb8_rgba8; + } +#ifndef MNG_NO_16BIT_SUPPORT + else /* source = 16 bits */ + pData->fPromoterow = (mng_fptr)mng_promote_rgb16_rgba16; +#endif + + iNewsamplesize = 4; + +#ifndef MNG_NO_16BIT_SUPPORT + if (iBitdepth == 16) /* 16-bit wide ? */ + iNewsamplesize = 8; +#endif + } + else /* JPEG rgba -> rgba */ + if ((pBuf->iColortype == MNG_COLORTYPE_JPEGCOLORA) && + (iColortype == MNG_COLORTYPE_JPEGCOLORA)) + { + iNewsamplesize = 4; +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth <= 8) /* source <= 8 bits */ + if (iBitdepth == 16) + pData->fPromoterow = (mng_fptr)mng_promote_rgba8_rgba16; + if (iBitdepth == 16) + iNewsamplesize = 8; +#endif + } +#endif /* JNG */ + + /* found a proper promotion ? */ + if (pData->fPromoterow) + { + pData->pPromBuf = (mng_ptr)pBuf; + pData->iPromWidth = pBuf->iWidth; + iNewrowsize = iW * iNewsamplesize; + iNewbufsize = iH * iNewrowsize; + + MNG_ALLOC (pData, pNewbuf, iNewbufsize); + + pData->pPromSrc = (mng_ptr)pBuf->pImgdata; + pData->pPromDst = (mng_ptr)pNewbuf; + iY = 0; + + while ((!iRetcode) && (iY < iH)) + { + iRetcode = ((mng_promoterow)pData->fPromoterow) (pData); + pData->pPromSrc = (mng_uint8p)pData->pPromSrc + pBuf->iRowsize; + pData->pPromDst = (mng_uint8p)pData->pPromDst + iNewrowsize; +/* pData->pPromSrc = (mng_ptr)((mng_uint32)pData->pPromSrc + pBuf->iRowsize); */ +/* pData->pPromDst = (mng_ptr)((mng_uint32)pData->pPromDst + iNewrowsize); */ + iY++; + } + + MNG_FREEX (pData, pBuf->pImgdata, pBuf->iImgdatasize); + + pBuf->iBitdepth = iBitdepth; + pBuf->iColortype = iColortype; + pBuf->iSamplesize = iNewsamplesize; + pBuf->iRowsize = iNewrowsize; + pBuf->iImgdatasize = iNewbufsize; + pBuf->pImgdata = pNewbuf; + pBuf->bHasPLTE = MNG_FALSE; + pBuf->iPLTEcount = 0; + pBuf->bHasTRNS = MNG_FALSE; + pBuf->iTRNScount = 0; + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IMGOBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +mng_retcode mng_magnify_imageobject (mng_datap pData, + mng_imagep pImage) +{ + mng_uint8p pNewdata; + mng_uint8p pSrcline1; + mng_uint8p pSrcline2; + mng_uint8p pTempline; + mng_uint8p pDstline; + mng_uint32 iNewrowsize; + mng_uint32 iNewsize; + mng_uint32 iY; + mng_int32 iS, iM; + mng_retcode iRetcode; + + mng_imagedatap pBuf = pImage->pImgbuf; + mng_uint32 iNewW = pBuf->iWidth; + mng_uint32 iNewH = pBuf->iHeight; + mng_magnify_x fMagnifyX = MNG_NULL; + mng_magnify_y fMagnifyY = MNG_NULL; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_IMGOBJECT, MNG_LC_START); +#endif + + if (pBuf->iColortype == MNG_COLORTYPE_INDEXED) /* indexed color ? */ + { /* concrete buffer ? */ + if ((pBuf->bConcrete) && (pImage->iId)) + MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); + +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN + if (pBuf->iTRNScount) /* with transparency ? */ + iRetcode = mng_promote_imageobject (pData, pImage, 8, 6, 0); + else + iRetcode = mng_promote_imageobject (pData, pImage, 8, 2, 0); + + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_MAGN + /* Promote everything to RGBA, using fill method 0 (LBR) */ + iRetcode = mng_promote_imageobject (pData, pImage, 8, 6, 0); + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif + + if (pImage->iMAGN_MethodX) /* determine new width */ + { + if (pImage->iMAGN_MethodX == 1) + { + iNewW = pImage->iMAGN_ML; + if (pBuf->iWidth > 1) + iNewW = iNewW + pImage->iMAGN_MR; + if (pBuf->iWidth > 2) + iNewW = iNewW + (pBuf->iWidth - 2) * (pImage->iMAGN_MX); + } + else + { + iNewW = pBuf->iWidth + pImage->iMAGN_ML - 1; + if (pBuf->iWidth > 2) + iNewW = iNewW + pImage->iMAGN_MR - 1; + if (pBuf->iWidth > 3) + iNewW = iNewW + (pBuf->iWidth - 3) * (pImage->iMAGN_MX - 1); + } + } + + if (pImage->iMAGN_MethodY) /* determine new height */ + { + if (pImage->iMAGN_MethodY == 1) + { + iNewH = pImage->iMAGN_MT; + if (pBuf->iHeight > 1) + iNewH = iNewH + pImage->iMAGN_ML; + if (pBuf->iHeight > 2) + iNewH = iNewH + (pBuf->iHeight - 2) * (pImage->iMAGN_MY); + } + else + { + iNewH = pBuf->iHeight + pImage->iMAGN_MT - 1; + if (pBuf->iHeight > 2) + iNewH = iNewH + pImage->iMAGN_MB - 1; + if (pBuf->iHeight > 3) + iNewH = iNewH + (pBuf->iHeight - 3) * (pImage->iMAGN_MY - 1); + } + } + /* get new buffer */ + iNewrowsize = iNewW * pBuf->iSamplesize; + iNewsize = iNewH * iNewrowsize; + + MNG_ALLOC (pData, pNewdata, iNewsize); + + switch (pBuf->iColortype) /* determine magnification routines */ + { +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN + case 0 : ; + case 8 : { + if (pBuf->iBitdepth <= 8) + { + switch (pImage->iMAGN_MethodX) + { + case 1 : { fMagnifyX = mng_magnify_g8_x1; break; } + case 2 : { fMagnifyX = mng_magnify_g8_x2; break; } + case 3 : { fMagnifyX = mng_magnify_g8_x3; break; } + case 4 : { fMagnifyX = mng_magnify_g8_x2; break; } + case 5 : { fMagnifyX = mng_magnify_g8_x3; break; } + } + + switch (pImage->iMAGN_MethodY) + { + case 1 : { fMagnifyY = mng_magnify_g8_y1; break; } + case 2 : { fMagnifyY = mng_magnify_g8_y2; break; } + case 3 : { fMagnifyY = mng_magnify_g8_y3; break; } + case 4 : { fMagnifyY = mng_magnify_g8_y2; break; } + case 5 : { fMagnifyY = mng_magnify_g8_y3; break; } + } + } +#ifndef MNG_NO_16BIT_SUPPORT + else + { + switch (pImage->iMAGN_MethodX) + { + case 1 : { fMagnifyX = mng_magnify_g16_x1; break; } + case 2 : { fMagnifyX = mng_magnify_g16_x2; break; } + case 3 : { fMagnifyX = mng_magnify_g16_x3; break; } + case 4 : { fMagnifyX = mng_magnify_g16_x2; break; } + case 5 : { fMagnifyX = mng_magnify_g16_x3; break; } + } + + switch (pImage->iMAGN_MethodY) + { + case 1 : { fMagnifyY = mng_magnify_g16_y1; break; } + case 2 : { fMagnifyY = mng_magnify_g16_y2; break; } + case 3 : { fMagnifyY = mng_magnify_g16_y3; break; } + case 4 : { fMagnifyY = mng_magnify_g16_y2; break; } + case 5 : { fMagnifyY = mng_magnify_g16_y3; break; } + } + } +#endif + + break; + } + + case 2 : ; + case 10 : { + if (pBuf->iBitdepth <= 8) + { + switch (pImage->iMAGN_MethodX) + { + case 1 : { fMagnifyX = mng_magnify_rgb8_x1; break; } + case 2 : { fMagnifyX = mng_magnify_rgb8_x2; break; } + case 3 : { fMagnifyX = mng_magnify_rgb8_x3; break; } + case 4 : { fMagnifyX = mng_magnify_rgb8_x2; break; } + case 5 : { fMagnifyX = mng_magnify_rgb8_x3; break; } + } + + switch (pImage->iMAGN_MethodY) + { + case 1 : { fMagnifyY = mng_magnify_rgb8_y1; break; } + case 2 : { fMagnifyY = mng_magnify_rgb8_y2; break; } + case 3 : { fMagnifyY = mng_magnify_rgb8_y3; break; } + case 4 : { fMagnifyY = mng_magnify_rgb8_y2; break; } + case 5 : { fMagnifyY = mng_magnify_rgb8_y3; break; } + } + } +#ifndef MNG_NO_16BIT_SUPPORT + else + { + switch (pImage->iMAGN_MethodX) + { + case 1 : { fMagnifyX = mng_magnify_rgb16_x1; break; } + case 2 : { fMagnifyX = mng_magnify_rgb16_x2; break; } + case 3 : { fMagnifyX = mng_magnify_rgb16_x3; break; } + case 4 : { fMagnifyX = mng_magnify_rgb16_x2; break; } + case 5 : { fMagnifyX = mng_magnify_rgb16_x3; break; } + } + + switch (pImage->iMAGN_MethodY) + { + case 1 : { fMagnifyY = mng_magnify_rgb16_y1; break; } + case 2 : { fMagnifyY = mng_magnify_rgb16_y2; break; } + case 3 : { fMagnifyY = mng_magnify_rgb16_y3; break; } + case 4 : { fMagnifyY = mng_magnify_rgb16_y2; break; } + case 5 : { fMagnifyY = mng_magnify_rgb16_y3; break; } + } + } +#endif + + break; + } + + case 4 : ; + case 12 : { + if (pBuf->iBitdepth <= 8) + { + switch (pImage->iMAGN_MethodX) + { + case 1 : { fMagnifyX = mng_magnify_ga8_x1; break; } + case 2 : { fMagnifyX = mng_magnify_ga8_x2; break; } + case 3 : { fMagnifyX = mng_magnify_ga8_x3; break; } + case 4 : { fMagnifyX = mng_magnify_ga8_x4; break; } + case 5 : { fMagnifyX = mng_magnify_ga8_x5; break; } + } + + switch (pImage->iMAGN_MethodY) + { + case 1 : { fMagnifyY = mng_magnify_ga8_y1; break; } + case 2 : { fMagnifyY = mng_magnify_ga8_y2; break; } + case 3 : { fMagnifyY = mng_magnify_ga8_y3; break; } + case 4 : { fMagnifyY = mng_magnify_ga8_y4; break; } + case 5 : { fMagnifyY = mng_magnify_ga8_y5; break; } + } + } +#ifndef MNG_NO_16BIT_SUPPORT + else + { + switch (pImage->iMAGN_MethodX) + { + case 1 : { fMagnifyX = mng_magnify_ga16_x1; break; } + case 2 : { fMagnifyX = mng_magnify_ga16_x2; break; } + case 3 : { fMagnifyX = mng_magnify_ga16_x3; break; } + case 4 : { fMagnifyX = mng_magnify_ga16_x4; break; } + case 5 : { fMagnifyX = mng_magnify_ga16_x5; break; } + } + + switch (pImage->iMAGN_MethodY) + { + case 1 : { fMagnifyY = mng_magnify_ga16_y1; break; } + case 2 : { fMagnifyY = mng_magnify_ga16_y2; break; } + case 3 : { fMagnifyY = mng_magnify_ga16_y3; break; } + case 4 : { fMagnifyY = mng_magnify_ga16_y4; break; } + case 5 : { fMagnifyY = mng_magnify_ga16_y5; break; } + } + } +#endif + + break; + } +#endif + + case 6 : ; + case 14 : { + if (pBuf->iBitdepth <= 8) + { + switch (pImage->iMAGN_MethodX) + { + case 1 : { fMagnifyX = mng_magnify_rgba8_x1; break; } + case 2 : { fMagnifyX = mng_magnify_rgba8_x2; break; } + case 3 : { fMagnifyX = mng_magnify_rgba8_x3; break; } + case 4 : { fMagnifyX = mng_magnify_rgba8_x4; break; } + case 5 : { fMagnifyX = mng_magnify_rgba8_x5; break; } + } + + switch (pImage->iMAGN_MethodY) + { + case 1 : { fMagnifyY = mng_magnify_rgba8_y1; break; } + case 2 : { fMagnifyY = mng_magnify_rgba8_y2; break; } + case 3 : { fMagnifyY = mng_magnify_rgba8_y3; break; } + case 4 : { fMagnifyY = mng_magnify_rgba8_y4; break; } + case 5 : { fMagnifyY = mng_magnify_rgba8_y5; break; } + } + } +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN + else + { + switch (pImage->iMAGN_MethodX) + { + case 1 : { fMagnifyX = mng_magnify_rgba16_x1; break; } + case 2 : { fMagnifyX = mng_magnify_rgba16_x2; break; } + case 3 : { fMagnifyX = mng_magnify_rgba16_x3; break; } + case 4 : { fMagnifyX = mng_magnify_rgba16_x4; break; } + case 5 : { fMagnifyX = mng_magnify_rgba16_x5; break; } + } + + switch (pImage->iMAGN_MethodY) + { + case 1 : { fMagnifyY = mng_magnify_rgba16_y1; break; } + case 2 : { fMagnifyY = mng_magnify_rgba16_y2; break; } + case 3 : { fMagnifyY = mng_magnify_rgba16_y3; break; } + case 4 : { fMagnifyY = mng_magnify_rgba16_y4; break; } + case 5 : { fMagnifyY = mng_magnify_rgba16_y5; break; } + } + } +#endif +#endif + break; + } + } + + pSrcline1 = pBuf->pImgdata; /* initialize row-loop variables */ + pDstline = pNewdata; + /* allocate temporary row */ + MNG_ALLOC (pData, pTempline, iNewrowsize); + + for (iY = 0; iY < pBuf->iHeight; iY++) + { + pSrcline2 = pSrcline1 + pBuf->iRowsize; + + if (fMagnifyX) /* magnifying in X-direction ? */ + { + iRetcode = fMagnifyX (pData, pImage->iMAGN_MX, + pImage->iMAGN_ML, pImage->iMAGN_MR, + pBuf->iWidth, pSrcline1, pDstline); + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pTempline, iNewrowsize); + MNG_FREEX (pData, pNewdata, iNewsize); + return iRetcode; + } + } + else + { + MNG_COPY (pDstline, pSrcline1, iNewrowsize); + } + + pDstline += iNewrowsize; + /* magnifying in Y-direction ? */ + if ((fMagnifyY) && + ((iY < pBuf->iHeight - 1) || (pBuf->iHeight == 1) || (pImage->iMAGN_MethodY == 1))) + { + if (iY == 0) /* first interval ? */ + { + if (pBuf->iHeight == 1) /* single row ? */ + pSrcline2 = MNG_NULL; + + iM = (mng_int32)pImage->iMAGN_MT; + } + else /* last interval ? */ + if (((pImage->iMAGN_MethodY == 1) && (iY == (pBuf->iHeight - 1))) || + ((pImage->iMAGN_MethodY != 1) && (iY == (pBuf->iHeight - 2))) ) + iM = (mng_int32)pImage->iMAGN_MB; + else /* middle interval */ + iM = (mng_int32)pImage->iMAGN_MY; + + for (iS = 1; iS < iM; iS++) + { + iRetcode = fMagnifyY (pData, iS, iM, pBuf->iWidth, + pSrcline1, pSrcline2, pTempline); + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pTempline, iNewrowsize); + MNG_FREEX (pData, pNewdata, iNewsize); + return iRetcode; + } + + if (fMagnifyX) /* magnifying in X-direction ? */ + { + iRetcode = fMagnifyX (pData, pImage->iMAGN_MX, + pImage->iMAGN_ML, pImage->iMAGN_MR, + pBuf->iWidth, pTempline, pDstline); + + if (iRetcode) /* on error bail out */ + { + MNG_FREEX (pData, pTempline, iNewrowsize); + MNG_FREEX (pData, pNewdata, iNewsize); + return iRetcode; + } + } + else + { + MNG_COPY (pDstline, pTempline, iNewrowsize); + } + + pDstline += iNewrowsize; + } + } + + pSrcline1 += pBuf->iRowsize; + } + /* drop temporary row */ + MNG_FREEX (pData, pTempline, iNewrowsize); + /* drop old pixel-data */ + MNG_FREEX (pData, pBuf->pImgdata, pBuf->iImgdatasize); + + pBuf->pImgdata = pNewdata; /* save new buffer dimensions */ + pBuf->iRowsize = iNewrowsize; + pBuf->iImgdatasize = iNewsize; + pBuf->iWidth = iNewW; + pBuf->iHeight = iNewH; + + if (pImage->iId) /* real object ? */ + { + pImage->iMAGN_MethodX = 0; /* it's done; don't do it again !!! */ + pImage->iMAGN_MethodY = 0; + pImage->iMAGN_MX = 0; + pImage->iMAGN_MY = 0; + pImage->iMAGN_ML = 0; + pImage->iMAGN_MR = 0; + pImage->iMAGN_MT = 0; + pImage->iMAGN_MB = 0; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_IMGOBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_colorcorrect_object (mng_datap pData, + mng_imagep pImage) +{ + mng_imagedatap pBuf = pImage->pImgbuf; + mng_retcode iRetcode; + mng_uint32 iY; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COLORCORRECT_OBJECT, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_JNG + if ((pBuf->iBitdepth < 8) || /* we need 8- or 16-bit RGBA !!! */ + ((pBuf->iColortype != MNG_COLORTYPE_RGBA ) && + (pBuf->iColortype != MNG_COLORTYPE_JPEGCOLORA) )) +#else + if (pBuf->iBitdepth < 8) /* we need 8- or 16-bit RGBA !!! */ +#endif + MNG_ERROR (pData, MNG_OBJNOTABSTRACT); + + if (!pBuf->bCorrected) /* only if not already done ! */ + { /* so the row routines now to find it */ + pData->pRetrieveobj = (mng_objectp)pImage; + pData->pStoreobj = (mng_objectp)pImage; + pData->pStorebuf = (mng_objectp)pImage->pImgbuf; + +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth > 8) + { + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba16; + pData->fStorerow = (mng_fptr)mng_store_rgba16; + } + else +#endif + { + pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8; + pData->fStorerow = (mng_fptr)mng_store_rgba8; + } + + pData->bIsOpaque = MNG_FALSE; + + pData->iPass = -1; /* these are the object's dimensions now */ + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pBuf->iWidth; + pData->iRowsize = pData->iRowsamples << 2; + pData->iPixelofs = 0; + pData->bIsRGBA16 = MNG_FALSE; + /* adjust for 16-bit object ? */ +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth > 8) + { + pData->bIsRGBA16 = MNG_TRUE; + pData->iRowsize = pData->iRowsamples << 3; + } +#endif + + pData->fCorrectrow = MNG_NULL; /* default no color-correction */ + +#ifdef MNG_NO_CMS + iRetcode = MNG_NOERROR; +#else +#if defined(MNG_FULL_CMS) /* determine color-management routine */ + iRetcode = mng_init_full_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#elif defined(MNG_GAMMA_ONLY) + iRetcode = mng_init_gamma_only (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#elif defined(MNG_APP_CMS) + iRetcode = mng_init_app_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE); +#endif + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif /* MNG_NO_CMS */ + + if (pData->fCorrectrow) /* really correct something ? */ + { /* get a temporary row-buffer */ + MNG_ALLOC (pData, pData->pRGBArow, pData->iRowsize); + + pData->pWorkrow = pData->pRGBArow; + iY = 0; /* start from the top */ + + while ((!iRetcode) && (iY < pBuf->iHeight)) + { /* get a row */ + iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData); + + if (!iRetcode) /* color correct it */ + iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData); + + if (!iRetcode) /* store it back ! */ + iRetcode = ((mng_storerow)pData->fStorerow) (pData); + + if (!iRetcode) /* adjust variables for next row */ + iRetcode = mng_next_row (pData); + + iY++; /* and next line */ + } + /* drop the temporary row-buffer */ + MNG_FREEX (pData, pData->pRGBArow, pData->iRowsize); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#if defined(MNG_FULL_CMS) /* cleanup cms stuff */ + iRetcode = mng_clear_cms (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; +#endif + } + + pBuf->bCorrected = MNG_TRUE; /* let's not go through that again ! */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COLORCORRECT_OBJECT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* * * */ +/* * Animation-object routines * */ +/* * * */ +/* * these handle the animation objects used to re-run parts of a MNG. * */ +/* * eg. during LOOP or TERM processing * */ +/* * * */ +/* ************************************************************************** */ + +void mng_add_ani_object (mng_datap pData, + mng_object_headerp pObject) +{ + mng_object_headerp pLast = (mng_object_headerp)pData->pLastaniobj; + + if (pLast) /* link it as last in the chain */ + { + pObject->pPrev = pLast; + pLast->pNext = pObject; + } + else + { + pObject->pPrev = MNG_NULL; /* be on the safe side */ + pData->pFirstaniobj = pObject; + } + + pObject->pNext = MNG_NULL; /* be on the safe side */ + pData->pLastaniobj = pObject; + /* keep track for jumping */ + pObject->iFramenr = pData->iFrameseq; + pObject->iLayernr = pData->iLayerseq; + pObject->iPlaytime = pData->iFrametime; + /* save restart object ? */ + if ((pData->bDisplaying) && (!pData->bRunning) && (!pData->pCurraniobj)) + pData->pCurraniobj = pObject; + + return; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ + +mng_retcode mng_create_ani_image (mng_datap pData) +{ + mng_ani_imagep pImage; + mng_imagep pCurrent; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_IMAGE, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* processing delta-image ? */ + pCurrent = (mng_imagep)pData->pObjzero; + else /* get the current object */ +#endif + pCurrent = (mng_imagep)pData->pCurrentobj; + + if (!pCurrent) /* otherwise object 0 */ + pCurrent = (mng_imagep)pData->pObjzero; + /* now just clone the object !!! */ + iRetcode = mng_clone_imageobject (pData, 0, MNG_FALSE, pCurrent->bVisible, + MNG_FALSE, MNG_FALSE, 0, 0, 0, pCurrent, + &pImage); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + pImage->sHeader.fCleanup = mng_free_ani_image; + pImage->sHeader.fProcess = mng_process_ani_image; + + mng_add_ani_object (pData, (mng_object_headerp)pImage); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_IMAGE, MNG_LC_END); +#endif + + return MNG_NOERROR; /* okido */ +} + +/* ************************************************************************** */ + +mng_retcode mng_free_ani_image (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_imagep pImage = (mng_ani_imagep)pObject; + mng_imagedatap pImgbuf = pImage->pImgbuf; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_IMAGE, MNG_LC_START); +#endif + /* unlink the image-data buffer */ + iRetcode = mng_free_imagedataobject (pData, pImgbuf); + /* drop its own buffer */ + MNG_FREEX (pData, pImage, sizeof (mng_ani_image)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_IMAGE, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_image (mng_datap pData, + mng_objectp pObject) +{ + mng_retcode iRetcode = MNG_NOERROR; + mng_ani_imagep pImage = (mng_imagep)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_IMAGE, MNG_LC_START); +#endif + +#ifndef MNG_NO_DELTA_PNG + if (pData->bHasDHDR) /* processing delta-image ? */ + { + mng_imagep pDelta = (mng_imagep)pData->pDeltaImage; + + if (!pData->iBreakpoint) /* only execute if not broken before */ + { /* make sure to process pixels as well */ + pData->bDeltaimmediate = MNG_FALSE; + /* execute the delta process */ + iRetcode = mng_execute_delta_image (pData, pDelta, (mng_imagep)pObject); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + /* now go and shoot it off (if required) */ + if ((pDelta->bVisible) && (pDelta->bViewable)) + iRetcode = mng_display_image (pData, pDelta, MNG_FALSE); + + if (!pData->bTimerset) + pData->bHasDHDR = MNG_FALSE; /* this image signifies IEND !! */ + + } + else +#endif + if (pData->pCurrentobj) /* active object ? */ + { + mng_imagep pCurrent = (mng_imagep)pData->pCurrentobj; + mng_imagedatap pBuf = pCurrent->pImgbuf; + + if (!pData->iBreakpoint) /* don't copy it again ! */ + { + if (pBuf->iImgdatasize) /* buffer present in active object ? */ + /* then drop it */ + MNG_FREE (pData, pBuf->pImgdata, pBuf->iImgdatasize); + +#ifndef MNG_SKIPCHUNK_iCCP + if (pBuf->iProfilesize) /* iCCP profile present ? */ + /* then drop it */ + MNG_FREE (pData, pBuf->pProfile, pBuf->iProfilesize); +#endif + /* now blatently copy the animation buffer */ + MNG_COPY (pBuf, pImage->pImgbuf, sizeof (mng_imagedata)); + /* copy viewability */ + pCurrent->bViewable = pImage->bViewable; + + if (pBuf->iImgdatasize) /* sample buffer present ? */ + { /* then make a copy */ + MNG_ALLOC (pData, pBuf->pImgdata, pBuf->iImgdatasize); + MNG_COPY (pBuf->pImgdata, pImage->pImgbuf->pImgdata, pBuf->iImgdatasize); + } + +#ifndef MNG_SKIPCHUNK_iCCP + if (pBuf->iProfilesize) /* iCCP profile present ? */ + { /* then make a copy */ + MNG_ALLOC (pData, pBuf->pProfile, pBuf->iProfilesize); + MNG_COPY (pBuf->pProfile, pImage->pImgbuf->pProfile, pBuf->iProfilesize); + } +#endif + } + /* now go and shoot it off (if required) */ + if ((pCurrent->bVisible) && (pCurrent->bViewable)) + iRetcode = mng_display_image (pData, pCurrent, MNG_FALSE); + } + else + { + mng_imagep pObjzero = (mng_imagep)pData->pObjzero; + mng_imagedatap pBuf = pObjzero->pImgbuf; + + if (!pData->iBreakpoint) /* don't copy it again ! */ + { + if (pBuf->iImgdatasize) /* buffer present in active object ? */ + /* then drop it */ + MNG_FREE (pData, pBuf->pImgdata, pBuf->iImgdatasize); + +#ifndef MNG_SKIPCHUNK_iCCP + if (pBuf->iProfilesize) /* iCCP profile present ? */ + /* then drop it */ + MNG_FREE (pData, pBuf->pProfile, pBuf->iProfilesize); +#endif + /* now blatently copy the animation buffer */ + MNG_COPY (pBuf, pImage->pImgbuf, sizeof (mng_imagedata)); + /* copy viewability */ + pObjzero->bViewable = pImage->bViewable; + + if (pBuf->iImgdatasize) /* sample buffer present ? */ + { /* then make a copy */ + MNG_ALLOC (pData, pBuf->pImgdata, pBuf->iImgdatasize); + MNG_COPY (pBuf->pImgdata, pImage->pImgbuf->pImgdata, pBuf->iImgdatasize); + } + +#ifndef MNG_SKIPCHUNK_iCCP + if (pBuf->iProfilesize) /* iCCP profile present ? */ + { /* then make a copy */ + MNG_ALLOC (pData, pBuf->pProfile, pBuf->iProfilesize); + MNG_COPY (pBuf->pProfile, pImage->pImgbuf->pProfile, pBuf->iProfilesize); + } +#endif + } + /* now go and show it */ + iRetcode = mng_display_image (pData, pObjzero, MNG_FALSE); + } + + if (!iRetcode) /* all's well ? */ + { + if (pData->bTimerset) /* timer break ? */ + pData->iBreakpoint = 99; /* fictive number; no more processing needed! */ + else + pData->iBreakpoint = 0; /* else clear it */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_IMAGE, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_plte (mng_datap pData, + mng_uint32 iEntrycount, + mng_palette8ep paEntries) +#else +mng_retcode mng_create_ani_plte (mng_datap pData) +#endif +{ + mng_ani_pltep pPLTE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_PLTE, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_plte), + mng_free_obj_general, + mng_process_ani_plte, + &pTemp); + if (iRetcode) + return iRetcode; + pPLTE = (mng_ani_pltep)pTemp; +#else + MNG_ALLOC (pData, pPLTE, sizeof (mng_ani_plte)); + + pPLTE->sHeader.fCleanup = mng_free_ani_plte; + pPLTE->sHeader.fProcess = mng_process_ani_plte; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pPLTE); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pPLTE->iEntrycount = iEntrycount; + MNG_COPY (pPLTE->aEntries, paEntries, sizeof (pPLTE->aEntries)); +#else + pPLTE->iEntrycount = pData->iGlobalPLTEcount; + MNG_COPY (pPLTE->aEntries, pData->aGlobalPLTEentries, sizeof (pPLTE->aEntries)); +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_plte (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_PLTE, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_plte)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_plte (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_pltep pPLTE = (mng_ani_pltep)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_PLTE, MNG_LC_START); +#endif + + pData->bHasglobalPLTE = MNG_TRUE; + pData->iGlobalPLTEcount = pPLTE->iEntrycount; + + MNG_COPY (pData->aGlobalPLTEentries, pPLTE->aEntries, sizeof (pPLTE->aEntries)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_PLTE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_trns (mng_datap pData, + mng_uint32 iRawlen, + mng_uint8p pRawdata) +#else +mng_retcode mng_create_ani_trns (mng_datap pData) +#endif +{ + mng_ani_trnsp pTRNS; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_TRNS, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_trns), + mng_free_obj_general, + mng_process_ani_trns, + &pTemp); + if (iRetcode) + return iRetcode; + pTRNS = (mng_ani_trnsp)pTemp; +#else + MNG_ALLOC (pData, pTRNS, sizeof (mng_ani_trns)); + + pTRNS->sHeader.fCleanup = mng_free_ani_trns; + pTRNS->sHeader.fProcess = mng_process_ani_trns; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pTRNS); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pTRNS->iRawlen = iRawlen; + MNG_COPY (pTRNS->aRawdata, pRawdata, sizeof (pTRNS->aRawdata)); +#else + pTRNS->iRawlen = pData->iGlobalTRNSrawlen; + MNG_COPY (pTRNS->aRawdata, pData->aGlobalTRNSrawdata, sizeof (pTRNS->aRawdata)); +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_trns (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_TRNS, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_trns)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_trns (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_trnsp pTRNS = (mng_ani_trnsp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_TRNS, MNG_LC_START); +#endif + + pData->bHasglobalTRNS = MNG_TRUE; + pData->iGlobalTRNSrawlen = pTRNS->iRawlen; + + MNG_COPY (pData->aGlobalTRNSrawdata, pTRNS->aRawdata, sizeof (pTRNS->aRawdata)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_TRNS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_gAMA +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_gama (mng_datap pData, + mng_bool bEmpty, + mng_uint32 iGamma) +#else +mng_retcode mng_create_ani_gama (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_gamap pGAMA; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_GAMA, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_gama), + mng_free_obj_general, + mng_process_ani_gama, + &pTemp); + if (iRetcode) + return iRetcode; + pGAMA = (mng_ani_gamap)pTemp; +#else + MNG_ALLOC (pData, pGAMA, sizeof (mng_ani_gama)); + + pGAMA->sHeader.fCleanup = mng_free_ani_gama; + pGAMA->sHeader.fProcess = mng_process_ani_gama; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pGAMA); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pGAMA->bEmpty = bEmpty; + pGAMA->iGamma = iGamma; +#else + pGAMA->bEmpty = ((mng_gamap)pChunk)->bEmpty; + pGAMA->iGamma = ((mng_gamap)pChunk)->iGamma; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_gama (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_GAMA, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_gama)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_gama (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_gamap pGAMA = (mng_ani_gamap)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_GAMA, MNG_LC_START); +#endif + + if (pGAMA->bEmpty) /* empty chunk ? */ + { /* clear global gAMA */ + pData->bHasglobalGAMA = MNG_FALSE; + pData->iGlobalGamma = 0; + } + else + { /* set global gAMA */ + pData->bHasglobalGAMA = MNG_TRUE; + pData->iGlobalGamma = pGAMA->iGamma; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_GAMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_chrm (mng_datap pData, + mng_bool bEmpty, + mng_uint32 iWhitepointx, + mng_uint32 iWhitepointy, + mng_uint32 iRedx, + mng_uint32 iRedy, + mng_uint32 iGreenx, + mng_uint32 iGreeny, + mng_uint32 iBluex, + mng_uint32 iBluey) +#else +mng_retcode mng_create_ani_chrm (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_chrmp pCHRM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_CHRM, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_chrm), + mng_free_obj_general, + mng_process_ani_chrm, + &pTemp); + if (iRetcode) + return iRetcode; + pCHRM = (mng_ani_chrmp)pTemp; +#else + MNG_ALLOC (pData, pCHRM, sizeof (mng_ani_chrm)); + + pCHRM->sHeader.fCleanup = mng_free_ani_chrm; + pCHRM->sHeader.fProcess = mng_process_ani_chrm; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pCHRM); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pCHRM->bEmpty = bEmpty; + pCHRM->iWhitepointx = iWhitepointx; + pCHRM->iWhitepointy = iWhitepointy; + pCHRM->iRedx = iRedx; + pCHRM->iRedy = iRedy; + pCHRM->iGreenx = iGreenx; + pCHRM->iGreeny = iGreeny; + pCHRM->iBluex = iBluex; + pCHRM->iBluey = iBluey; +#else + pCHRM->bEmpty = ((mng_chrmp)pChunk)->bEmpty; + pCHRM->iWhitepointx = ((mng_chrmp)pChunk)->iWhitepointx; + pCHRM->iWhitepointy = ((mng_chrmp)pChunk)->iWhitepointy; + pCHRM->iRedx = ((mng_chrmp)pChunk)->iRedx; + pCHRM->iRedy = ((mng_chrmp)pChunk)->iRedy; + pCHRM->iGreenx = ((mng_chrmp)pChunk)->iGreenx; + pCHRM->iGreeny = ((mng_chrmp)pChunk)->iGreeny; + pCHRM->iBluex = ((mng_chrmp)pChunk)->iBluex; + pCHRM->iBluey = ((mng_chrmp)pChunk)->iBluey; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_chrm (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_CHRM, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_chrm)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_chrm (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_chrmp pCHRM = (mng_ani_chrmp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_CHRM, MNG_LC_START); +#endif + + if (pCHRM->bEmpty) /* empty chunk ? */ + { /* clear global cHRM */ + pData->bHasglobalCHRM = MNG_FALSE; + pData->iGlobalWhitepointx = 0; + pData->iGlobalWhitepointy = 0; + pData->iGlobalPrimaryredx = 0; + pData->iGlobalPrimaryredy = 0; + pData->iGlobalPrimarygreenx = 0; + pData->iGlobalPrimarygreeny = 0; + pData->iGlobalPrimarybluex = 0; + pData->iGlobalPrimarybluey = 0; + } + else + { /* set global cHRM */ + pData->bHasglobalCHRM = MNG_TRUE; + pData->iGlobalWhitepointx = pCHRM->iWhitepointx; + pData->iGlobalWhitepointy = pCHRM->iWhitepointy; + pData->iGlobalPrimaryredx = pCHRM->iRedx; + pData->iGlobalPrimaryredy = pCHRM->iRedy; + pData->iGlobalPrimarygreenx = pCHRM->iGreenx; + pData->iGlobalPrimarygreeny = pCHRM->iGreeny; + pData->iGlobalPrimarybluex = pCHRM->iBluex; + pData->iGlobalPrimarybluey = pCHRM->iBluey; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_CHRM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_sRGB +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_srgb (mng_datap pData, + mng_bool bEmpty, + mng_uint8 iRenderingintent) +#else +mng_retcode mng_create_ani_srgb (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_srgbp pSRGB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_SRGB, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_srgb), + mng_free_obj_general, + mng_process_ani_srgb, + &pTemp); + if (iRetcode) + return iRetcode; + pSRGB = (mng_ani_srgbp)pTemp; +#else + MNG_ALLOC (pData, pSRGB, sizeof (mng_ani_srgb)); + + pSRGB->sHeader.fCleanup = mng_free_ani_srgb; + pSRGB->sHeader.fProcess = mng_process_ani_srgb; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pSRGB); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pSRGB->bEmpty = bEmpty; + pSRGB->iRenderingintent = iRenderingintent; +#else + pSRGB->bEmpty = ((mng_srgbp)pChunk)->bEmpty; + pSRGB->iRenderingintent = ((mng_srgbp)pChunk)->iRenderingintent; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_srgb (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_SRGB, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_srgb)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_srgb (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_srgbp pSRGB = (mng_ani_srgbp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_SRGB, MNG_LC_START); +#endif + + if (pSRGB->bEmpty) /* empty chunk ? */ + { /* clear global sRGB */ + pData->bHasglobalSRGB = MNG_FALSE; + pData->iGlobalRendintent = 0; + } + else + { /* set global sRGB */ + pData->bHasglobalSRGB = MNG_TRUE; + pData->iGlobalRendintent = pSRGB->iRenderingintent; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_iccp (mng_datap pData, + mng_bool bEmpty, + mng_uint32 iProfilesize, + mng_ptr pProfile) +#else +mng_retcode mng_create_ani_iccp (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_iccpp pICCP; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_ICCP, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_iccp), + mng_free_ani_iccp, + mng_process_ani_iccp, + &pTemp); + if (iRetcode) + return iRetcode; + pICCP = (mng_ani_iccpp)pTemp; +#else + MNG_ALLOC (pData, pICCP, sizeof (mng_ani_iccp)); + + pICCP->sHeader.fCleanup = mng_free_ani_iccp; + pICCP->sHeader.fProcess = mng_process_ani_iccp; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pICCP); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pICCP->bEmpty = bEmpty; + pICCP->iProfilesize = iProfilesize; + + if (iProfilesize) + { + MNG_ALLOC (pData, pICCP->pProfile, iProfilesize); + MNG_COPY (pICCP->pProfile, pProfile, iProfilesize); + } +#else + pICCP->bEmpty = ((mng_iccpp)pChunk)->bEmpty; + pICCP->iProfilesize = ((mng_iccpp)pChunk)->iProfilesize; + + if (pICCP->iProfilesize) + { + MNG_ALLOC (pData, pICCP->pProfile, pICCP->iProfilesize); + MNG_COPY (pICCP->pProfile, ((mng_iccpp)pChunk)->pProfile, pICCP->iProfilesize); + } +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_ICCP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_free_ani_iccp (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_iccpp pICCP = (mng_ani_iccpp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_ICCP, MNG_LC_START); +#endif + + if (pICCP->iProfilesize) + MNG_FREEX (pData, pICCP->pProfile, pICCP->iProfilesize); + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + MNG_FREEX (pData, pObject, sizeof (mng_ani_iccp)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_ICCP, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + return MNG_NOERROR; +#else + return mng_free_obj_general(pData, pObject); +#endif +} + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_iccp (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_iccpp pICCP = (mng_ani_iccpp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_ICCP, MNG_LC_START); +#endif + + if (pICCP->bEmpty) /* empty chunk ? */ + { /* clear global iCCP */ + pData->bHasglobalICCP = MNG_FALSE; + + if (pData->iGlobalProfilesize) + MNG_FREEX (pData, pData->pGlobalProfile, pData->iGlobalProfilesize); + + pData->iGlobalProfilesize = 0; + pData->pGlobalProfile = MNG_NULL; + } + else + { /* set global iCCP */ + pData->bHasglobalICCP = MNG_TRUE; + pData->iGlobalProfilesize = pICCP->iProfilesize; + + if (pICCP->iProfilesize) + { + MNG_ALLOC (pData, pData->pGlobalProfile, pICCP->iProfilesize); + MNG_COPY (pData->pGlobalProfile, pICCP->pProfile, pICCP->iProfilesize); + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_ICCP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_bkgd (mng_datap pData, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue) +#else +mng_retcode mng_create_ani_bkgd (mng_datap pData) +#endif +{ + mng_ani_bkgdp pBKGD; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_BKGD, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_bkgd), + mng_free_obj_general, + mng_process_ani_bkgd, + &pTemp); + if (iRetcode) + return iRetcode; + pBKGD = (mng_ani_bkgdp)pTemp; +#else + MNG_ALLOC (pData, pBKGD, sizeof (mng_ani_bkgd)); + + pBKGD->sHeader.fCleanup = mng_free_ani_bkgd; + pBKGD->sHeader.fProcess = mng_process_ani_bkgd; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pBKGD); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pBKGD->iRed = iRed; + pBKGD->iGreen = iGreen; + pBKGD->iBlue = iBlue; +#else + pBKGD->iRed = pData->iGlobalBKGDred; + pBKGD->iGreen = pData->iGlobalBKGDgreen; + pBKGD->iBlue = pData->iGlobalBKGDblue; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_bkgd (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_BKGD, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_bkgd)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_bkgd (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_bkgdp pBKGD = (mng_ani_bkgdp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_BKGD, MNG_LC_START); +#endif + + pData->bHasglobalBKGD = MNG_TRUE; + pData->iGlobalBKGDred = pBKGD->iRed; + pData->iGlobalBKGDgreen = pBKGD->iGreen; + pData->iGlobalBKGDblue = pBKGD->iBlue; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_LOOP +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_loop (mng_datap pData, + mng_uint8 iLevel, + mng_uint32 iRepeatcount, + mng_uint8 iTermcond, + mng_uint32 iItermin, + mng_uint32 iItermax, + mng_uint32 iCount, + mng_uint32p pSignals) +#else +mng_retcode mng_create_ani_loop (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_loopp pLOOP; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_LOOP, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_loop), + mng_free_ani_loop, + mng_process_ani_loop, + &pTemp); + if (iRetcode) + return iRetcode; + pLOOP = (mng_ani_loopp)pTemp; +#else + MNG_ALLOC (pData, pLOOP, sizeof (mng_ani_loop)); + + pLOOP->sHeader.fCleanup = mng_free_ani_loop; + pLOOP->sHeader.fProcess = mng_process_ani_loop; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pLOOP); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pLOOP->iLevel = iLevel; + pLOOP->iRepeatcount = iRepeatcount; + pLOOP->iTermcond = iTermcond; + pLOOP->iItermin = iItermin; + pLOOP->iItermax = iItermax; + pLOOP->iCount = iCount; + +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + if (iCount) + { + MNG_ALLOC (pData, pLOOP->pSignals, (iCount << 1)); + MNG_COPY (pLOOP->pSignals, pSignals, (iCount << 1)); + } +#endif +#else /* MNG_OPTIMIZE_CHUNKREADER */ + pLOOP->iLevel = ((mng_loopp)pChunk)->iLevel; + pLOOP->iRepeatcount = ((mng_loopp)pChunk)->iRepeat; + pLOOP->iTermcond = ((mng_loopp)pChunk)->iTermination; + pLOOP->iItermin = ((mng_loopp)pChunk)->iItermin; + pLOOP->iItermax = ((mng_loopp)pChunk)->iItermax; + pLOOP->iCount = ((mng_loopp)pChunk)->iCount; + +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + if (pLOOP->iCount) + { + MNG_ALLOC (pData, pLOOP->pSignals, (pLOOP->iCount << 1)); + MNG_COPY (pLOOP->pSignals, ((mng_loopp)pChunk)->pSignals, (pLOOP->iCount << 1)); + } +#endif +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + /* running counter starts with repeat_count */ + pLOOP->iRunningcount = pLOOP->iRepeatcount; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_LOOP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_free_ani_loop (mng_datap pData, + mng_objectp pObject) +{ +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + mng_ani_loopp pLOOP = (mng_ani_loopp)pObject; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_LOOP, MNG_LC_START); +#endif + +#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED + if (pLOOP->iCount) /* drop signal buffer ? */ + MNG_FREEX (pData, pLOOP->pSignals, (pLOOP->iCount << 1)); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + MNG_FREEX (pData, pObject, sizeof (mng_ani_loop)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_LOOP, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + return MNG_NOERROR; +#else + return mng_free_obj_general(pData, pObject); +#endif +} + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_loop (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_loopp pLOOP = (mng_ani_loopp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_LOOP, MNG_LC_START); +#endif + /* just reset the running counter */ + pLOOP->iRunningcount = pLOOP->iRepeatcount; + /* iteration=0 means we're skipping ! */ + if ((!pData->bSkipping) && (pLOOP->iRepeatcount == 0)) + pData->bSkipping = MNG_TRUE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_LOOP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* ************************************************************************** */ + +mng_retcode mng_create_ani_endl (mng_datap pData, + mng_uint8 iLevel) +{ + mng_ani_endlp pENDL; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_ENDL, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { + mng_retcode iRetcode; +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_endl), + mng_free_obj_general, + mng_process_ani_endl, + &pTemp); + if (iRetcode) + return iRetcode; + pENDL = (mng_ani_endlp)pTemp; +#else + MNG_ALLOC (pData, pENDL, sizeof (mng_ani_endl)); + + pENDL->sHeader.fCleanup = mng_free_ani_endl; + pENDL->sHeader.fProcess = mng_process_ani_endl; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pENDL); + + pENDL->iLevel = iLevel; + + iRetcode = mng_process_ani_endl (pData, (mng_objectp)pENDL); + if (iRetcode) + return iRetcode; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_endl (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_ENDL, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_endl)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_endl (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_endlp pENDL = (mng_ani_endlp)pObject; + mng_ani_loopp pLOOP; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_ENDL, MNG_LC_START); +#endif + + if (((pData->bDisplaying) && ((pData->bRunning) || (pData->bSearching))) || + (pData->bReading) ) + { + pLOOP = pENDL->pLOOP; /* determine matching LOOP */ + + if (!pLOOP) /* haven't got it yet ? */ + { /* go and look back in the list */ + pLOOP = (mng_ani_loopp)pENDL->sHeader.pPrev; + + while ((pLOOP) && + ((pLOOP->sHeader.fCleanup != mng_free_ani_loop) || + (pLOOP->iLevel != pENDL->iLevel) )) + pLOOP = pLOOP->sHeader.pPrev; + } + /* got it now ? */ + if ((pLOOP) && (pLOOP->iLevel == pENDL->iLevel)) + { + pENDL->pLOOP = pLOOP; /* save for next time ! */ + /* decrease running counter ? */ + if ((pLOOP->iRunningcount) && (pLOOP->iRunningcount < 0x7fffffffL)) + pLOOP->iRunningcount--; + + if ((!pData->bDisplaying) && (pData->bReading) && + (pLOOP->iRunningcount >= 0x7fffffffL)) + { + pData->iTotalframes = 0x7fffffffL; + pData->iTotallayers = 0x7fffffffL; + pData->iTotalplaytime = 0x7fffffffL; + } + else + { + /* TODO: we're cheating out on the termination_condition, + iteration_min, iteration_max and possible signals; + the code is just not ready for that can of worms.... */ + + if (!pLOOP->iRunningcount) /* reached zero ? */ + { /* was this the outer LOOP ? */ + if (pData->pFirstaniobj == (mng_objectp)pLOOP) /* TODO: THIS IS WRONG!! */ + pData->bHasLOOP = MNG_FALSE; + } + else + { + if (pData->pCurraniobj) /* was we processing objects ? */ + pData->pCurraniobj = pLOOP;/* then restart with LOOP */ + else /* else restart behind LOOP !!! */ + pData->pCurraniobj = pLOOP->sHeader.pNext; + } + } + /* does this match a 'skipping' LOOP? */ + if ((pData->bSkipping) && (pLOOP->iRepeatcount == 0)) + pData->bSkipping = MNG_FALSE; + } + else + MNG_ERROR (pData, MNG_NOMATCHINGLOOP); + + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_ENDL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DEFI +mng_retcode mng_create_ani_defi (mng_datap pData) +{ + mng_ani_defip pDEFI; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_DEFI, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_defi), + mng_free_obj_general, + mng_process_ani_defi, + &pTemp); + if (iRetcode) + return iRetcode; + pDEFI = (mng_ani_defip)pTemp; +#else + MNG_ALLOC (pData, pDEFI, sizeof (mng_ani_defi)); + + pDEFI->sHeader.fCleanup = mng_free_ani_defi; + pDEFI->sHeader.fProcess = mng_process_ani_defi; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pDEFI); + + pDEFI->iId = pData->iDEFIobjectid; + pDEFI->bHasdonotshow = pData->bDEFIhasdonotshow; + pDEFI->iDonotshow = pData->iDEFIdonotshow; + pDEFI->bHasconcrete = pData->bDEFIhasconcrete; + pDEFI->iConcrete = pData->iDEFIconcrete; + pDEFI->bHasloca = pData->bDEFIhasloca; + pDEFI->iLocax = pData->iDEFIlocax; + pDEFI->iLocay = pData->iDEFIlocay; + pDEFI->bHasclip = pData->bDEFIhasclip; + pDEFI->iClipl = pData->iDEFIclipl; + pDEFI->iClipr = pData->iDEFIclipr; + pDEFI->iClipt = pData->iDEFIclipt; + pDEFI->iClipb = pData->iDEFIclipb; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_defi (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_DEFI, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_defi)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_defi (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_defip pDEFI = (mng_ani_defip)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_DEFI, MNG_LC_START); +#endif + + pData->iDEFIobjectid = pDEFI->iId; + pData->bDEFIhasdonotshow = pDEFI->bHasdonotshow; + pData->iDEFIdonotshow = pDEFI->iDonotshow; + pData->bDEFIhasconcrete = pDEFI->bHasconcrete; + pData->iDEFIconcrete = pDEFI->iConcrete; + pData->bDEFIhasloca = pDEFI->bHasloca; + pData->iDEFIlocax = pDEFI->iLocax; + pData->iDEFIlocay = pDEFI->iLocay; + pData->bDEFIhasclip = pDEFI->bHasclip; + pData->iDEFIclipl = pDEFI->iClipl; + pData->iDEFIclipr = pDEFI->iClipr; + pData->iDEFIclipt = pDEFI->iClipt; + pData->iDEFIclipb = pDEFI->iClipb; + + iRetcode = mng_process_display_defi (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_DEFI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BASI +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_basi (mng_datap pData, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_bool bHasalpha, + mng_uint16 iAlpha, + mng_uint8 iViewable) +#else +mng_retcode mng_create_ani_basi (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_basip pBASI; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_BASI, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_basi), + mng_free_obj_general, + mng_process_ani_basi, + &pTemp); + if (iRetcode) + return iRetcode; + pBASI = (mng_ani_basip)pTemp; +#else + MNG_ALLOC (pData, pBASI, sizeof (mng_ani_basi)); + + pBASI->sHeader.fCleanup = mng_free_ani_basi; + pBASI->sHeader.fProcess = mng_process_ani_basi; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pBASI); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pBASI->iRed = iRed; + pBASI->iGreen = iGreen; + pBASI->iBlue = iBlue; + pBASI->bHasalpha = bHasalpha; + pBASI->iAlpha = iAlpha; + pBASI->iViewable = iViewable; +#else + pBASI->iRed = ((mng_basip)pChunk)->iRed; + pBASI->iGreen = ((mng_basip)pChunk)->iGreen; + pBASI->iBlue = ((mng_basip)pChunk)->iBlue; + pBASI->bHasalpha = ((mng_basip)pChunk)->bHasalpha; + pBASI->iAlpha = ((mng_basip)pChunk)->iAlpha; + pBASI->iViewable = ((mng_basip)pChunk)->iViewable; +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_basi (pData, iRed, iGreen, iBlue, + bHasalpha, iAlpha, iViewable); +#else + iRetcode = mng_process_display_basi (pData, + ((mng_basip)pChunk)->iRed, + ((mng_basip)pChunk)->iGreen, + ((mng_basip)pChunk)->iBlue, + ((mng_basip)pChunk)->bHasalpha, + ((mng_basip)pChunk)->iAlpha, + ((mng_basip)pChunk)->iViewable); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iBASIred = iRed; + pData->iBASIgreen = iGreen; + pData->iBASIblue = iBlue; + pData->bBASIhasalpha = bHasalpha; + pData->iBASIalpha = iAlpha; + pData->iBASIviewable = iViewable; +#else + pData->iBASIred = ((mng_basip)pChunk)->iRed; + pData->iBASIgreen = ((mng_basip)pChunk)->iGreen; + pData->iBASIblue = ((mng_basip)pChunk)->iBlue; + pData->bBASIhasalpha = ((mng_basip)pChunk)->bHasalpha; + pData->iBASIalpha = ((mng_basip)pChunk)->iAlpha; + pData->iBASIviewable = ((mng_basip)pChunk)->iViewable; +#endif + + iRetcode = mng_process_display_basi (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_BASI, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_basi (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_BASI, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_basi)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_BASI, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_basi (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_basip pBASI = (mng_ani_basip)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_BASI, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_basi (pData, pBASI->iRed, pBASI->iGreen, pBASI->iBlue, + pBASI->bHasalpha, pBASI->iAlpha, pBASI->iViewable); +#else + pData->iBASIred = pBASI->iRed; + pData->iBASIgreen = pBASI->iGreen; + pData->iBASIblue = pBASI->iBlue; + pData->bBASIhasalpha = pBASI->bHasalpha; + pData->iBASIalpha = pBASI->iAlpha; + pData->iBASIviewable = pBASI->iViewable; + + iRetcode = mng_process_display_basi (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_BASI, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLON +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_clon (mng_datap pData, + mng_uint16 iSourceid, + mng_uint16 iCloneid, + mng_uint8 iClonetype, + mng_bool bHasdonotshow, + mng_uint8 iDonotshow, + mng_uint8 iConcrete, + mng_bool bHasloca, + mng_uint8 iLocatype, + mng_int32 iLocax, + mng_int32 iLocay) +#else +mng_retcode mng_create_ani_clon (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_clonp pCLON; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_CLON, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_clon), + mng_free_obj_general, + mng_process_ani_clon, + &pTemp); + if (iRetcode) + return iRetcode; + pCLON = (mng_ani_clonp)pTemp; +#else + MNG_ALLOC (pData, pCLON, sizeof (mng_ani_clon)); + + pCLON->sHeader.fCleanup = mng_free_ani_clon; + pCLON->sHeader.fProcess = mng_process_ani_clon; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pCLON); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pCLON->iSourceid = iSourceid; + pCLON->iCloneid = iCloneid; + pCLON->iClonetype = iClonetype; + pCLON->bHasdonotshow = bHasdonotshow; + pCLON->iDonotshow = iDonotshow; + pCLON->iConcrete = iConcrete; + pCLON->bHasloca = bHasloca; + pCLON->iLocatype = iLocatype; + pCLON->iLocax = iLocax; + pCLON->iLocay = iLocay; +#else + pCLON->iSourceid = ((mng_clonp)pChunk)->iSourceid; + pCLON->iCloneid = ((mng_clonp)pChunk)->iCloneid; + pCLON->iClonetype = ((mng_clonp)pChunk)->iClonetype; + pCLON->bHasdonotshow = ((mng_clonp)pChunk)->bHasdonotshow; + pCLON->iDonotshow = ((mng_clonp)pChunk)->iDonotshow; + pCLON->iConcrete = ((mng_clonp)pChunk)->iConcrete; + pCLON->bHasloca = ((mng_clonp)pChunk)->bHasloca; + pCLON->iLocatype = ((mng_clonp)pChunk)->iLocationtype; + pCLON->iLocax = ((mng_clonp)pChunk)->iLocationx; + pCLON->iLocay = ((mng_clonp)pChunk)->iLocationy; +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_clon (pData, iSourceid, iCloneid, iClonetype, + bHasdonotshow, iDonotshow, iConcrete, + bHasloca, iLocatype, iLocax, iLocay); +#else + iRetcode = mng_process_display_clon (pData, + ((mng_clonp)pChunk)->iSourceid, + ((mng_clonp)pChunk)->iCloneid, + ((mng_clonp)pChunk)->iClonetype, + ((mng_clonp)pChunk)->bHasdonotshow, + ((mng_clonp)pChunk)->iDonotshow, + ((mng_clonp)pChunk)->iConcrete, + ((mng_clonp)pChunk)->bHasloca, + ((mng_clonp)pChunk)->iLocationtype, + ((mng_clonp)pChunk)->iLocationx, + ((mng_clonp)pChunk)->iLocationy); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iCLONsourceid = iSourceid; + pData->iCLONcloneid = iCloneid; + pData->iCLONclonetype = iClonetype; + pData->bCLONhasdonotshow = bHasdonotshow; + pData->iCLONdonotshow = iDonotshow; + pData->iCLONconcrete = iConcrete; + pData->bCLONhasloca = bHasloca; + pData->iCLONlocationtype = iLocatype; + pData->iCLONlocationx = iLocax; + pData->iCLONlocationy = iLocay; +#else + pData->iCLONsourceid = ((mng_clonp)pChunk)->iSourceid; + pData->iCLONcloneid = ((mng_clonp)pChunk)->iCloneid; + pData->iCLONclonetype = ((mng_clonp)pChunk)->iClonetype; + pData->bCLONhasdonotshow = ((mng_clonp)pChunk)->bHasdonotshow; + pData->iCLONdonotshow = ((mng_clonp)pChunk)->iDonotshow; + pData->iCLONconcrete = ((mng_clonp)pChunk)->iConcrete; + pData->bCLONhasloca = ((mng_clonp)pChunk)->bHasloca; + pData->iCLONlocationtype = ((mng_clonp)pChunk)->iLocationtype; + pData->iCLONlocationx = ((mng_clonp)pChunk)->iLocationx; + pData->iCLONlocationy = ((mng_clonp)pChunk)->iLocationy; +#endif + + iRetcode = mng_process_display_clon (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_CLON, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_clon (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_CLON, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_clon)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_CLON, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_clon (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_clonp pCLON = (mng_ani_clonp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_CLON, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_clon (pData, pCLON->iSourceid, pCLON->iCloneid, + pCLON->iClonetype, pCLON->bHasdonotshow, + pCLON->iDonotshow, pCLON->iConcrete, + pCLON->bHasloca, pCLON->iLocatype, + pCLON->iLocax, pCLON->iLocay); +#else + pData->iCLONcloneid = pCLON->iCloneid; + pData->iCLONsourceid = pCLON->iSourceid; + pData->iCLONclonetype = pCLON->iClonetype; + pData->bCLONhasdonotshow = pCLON->bHasdonotshow; + pData->iCLONdonotshow = pCLON->iDonotshow; + pData->iCLONconcrete = pCLON->iConcrete; + pData->bCLONhasloca = pCLON->bHasloca; + pData->iCLONlocationtype = pCLON->iLocatype; + pData->iCLONlocationx = pCLON->iLocax; + pData->iCLONlocationy = pCLON->iLocay; + + iRetcode = mng_process_display_clon (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_CLON, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_BACK +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_back (mng_datap pData, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint8 iMandatory, + mng_uint16 iImageid, + mng_uint8 iTile) +#else +mng_retcode mng_create_ani_back (mng_datap pData) +#endif +{ + mng_ani_backp pBACK; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_BACK, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_back), + mng_free_obj_general, + mng_process_ani_back, + &pTemp); + if (iRetcode) + return iRetcode; + pBACK = (mng_ani_backp)pTemp; +#else + MNG_ALLOC (pData, pBACK, sizeof (mng_ani_back)); + + pBACK->sHeader.fCleanup = mng_free_ani_back; + pBACK->sHeader.fProcess = mng_process_ani_back; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pBACK); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pBACK->iRed = iRed; + pBACK->iGreen = iGreen; + pBACK->iBlue = iBlue; + pBACK->iMandatory = iMandatory; + pBACK->iImageid = iImageid; + pBACK->iTile = iTile; +#else + pBACK->iRed = pData->iBACKred; + pBACK->iGreen = pData->iBACKgreen; + pBACK->iBlue = pData->iBACKblue; + pBACK->iMandatory = pData->iBACKmandatory; + pBACK->iImageid = pData->iBACKimageid; + pBACK->iTile = pData->iBACKtile; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_back (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_BACK, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_back)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_back (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_backp pBACK = (mng_ani_backp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_BACK, MNG_LC_START); +#endif + + pData->iBACKred = pBACK->iRed; + pData->iBACKgreen = pBACK->iGreen; + pData->iBACKblue = pBACK->iBlue; + pData->iBACKmandatory = pBACK->iMandatory; + pData->iBACKimageid = pBACK->iImageid; + pData->iBACKtile = pBACK->iTile; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_BACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_FRAM +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_fram (mng_datap pData, + mng_uint8 iFramemode, + mng_uint8 iChangedelay, + mng_uint32 iDelay, + mng_uint8 iChangetimeout, + mng_uint32 iTimeout, + mng_uint8 iChangeclipping, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb) +#else +mng_retcode mng_create_ani_fram (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_framp pFRAM; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_FRAM, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_fram), + mng_free_obj_general, + mng_process_ani_fram, + &pTemp); + if (iRetcode) + return iRetcode; + pFRAM = (mng_ani_framp)pTemp; +#else + MNG_ALLOC (pData, pFRAM, sizeof (mng_ani_fram)); + + pFRAM->sHeader.fCleanup = mng_free_ani_fram; + pFRAM->sHeader.fProcess = mng_process_ani_fram; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pFRAM); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pFRAM->iFramemode = iFramemode; + pFRAM->iChangedelay = iChangedelay; + pFRAM->iDelay = iDelay; + pFRAM->iChangetimeout = iChangetimeout; + pFRAM->iTimeout = iTimeout; + pFRAM->iChangeclipping = iChangeclipping; + pFRAM->iCliptype = iCliptype; + pFRAM->iClipl = iClipl; + pFRAM->iClipr = iClipr; + pFRAM->iClipt = iClipt; + pFRAM->iClipb = iClipb; +#else + pFRAM->iFramemode = ((mng_framp)pChunk)->iMode; + pFRAM->iChangedelay = ((mng_framp)pChunk)->iChangedelay; + pFRAM->iDelay = ((mng_framp)pChunk)->iDelay; + pFRAM->iChangetimeout = ((mng_framp)pChunk)->iChangetimeout; + pFRAM->iTimeout = ((mng_framp)pChunk)->iTimeout; + pFRAM->iChangeclipping = ((mng_framp)pChunk)->iChangeclipping; + pFRAM->iCliptype = ((mng_framp)pChunk)->iBoundarytype; + pFRAM->iClipl = ((mng_framp)pChunk)->iBoundaryl; + pFRAM->iClipr = ((mng_framp)pChunk)->iBoundaryr; + pFRAM->iClipt = ((mng_framp)pChunk)->iBoundaryt; + pFRAM->iClipb = ((mng_framp)pChunk)->iBoundaryb; +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_fram (pData, iFramemode, + iChangedelay, iDelay, + iChangetimeout, iTimeout, + iChangeclipping, iCliptype, + iClipl, iClipr, + iClipt, iClipb); +#else + iRetcode = mng_process_display_fram (pData, + ((mng_framp)pChunk)->iMode, + ((mng_framp)pChunk)->iChangedelay, + ((mng_framp)pChunk)->iDelay, + ((mng_framp)pChunk)->iChangetimeout, + ((mng_framp)pChunk)->iTimeout, + ((mng_framp)pChunk)->iChangeclipping, + ((mng_framp)pChunk)->iBoundarytype, + ((mng_framp)pChunk)->iBoundaryl, + ((mng_framp)pChunk)->iBoundaryr, + ((mng_framp)pChunk)->iBoundaryt, + ((mng_framp)pChunk)->iBoundaryb); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iTempFramemode = iFramemode; + pData->iTempChangedelay = iChangedelay; + pData->iTempDelay = iDelay; + pData->iTempChangetimeout = iChangetimeout; + pData->iTempTimeout = iTimeout; + pData->iTempChangeclipping = iChangeclipping; + pData->iTempCliptype = iCliptype; + pData->iTempClipl = iClipl; + pData->iTempClipr = iClipr; + pData->iTempClipt = iClipt; + pData->iTempClipb = iClipb; +#else + pData->iTempFramemode = ((mng_framp)pChunk)->iMode; + pData->iTempChangedelay = ((mng_framp)pChunk)->iChangedelay; + pData->iTempDelay = ((mng_framp)pChunk)->iDelay; + pData->iTempChangetimeout = ((mng_framp)pChunk)->iChangetimeout; + pData->iTempTimeout = ((mng_framp)pChunk)->iTimeout; + pData->iTempChangeclipping = ((mng_framp)pChunk)->iChangeclipping; + pData->iTempCliptype = ((mng_framp)pChunk)->iBoundarytype; + pData->iTempClipl = ((mng_framp)pChunk)->iBoundaryl; + pData->iTempClipr = ((mng_framp)pChunk)->iBoundaryr; + pData->iTempClipt = ((mng_framp)pChunk)->iBoundaryt; + pData->iTempClipb = ((mng_framp)pChunk)->iBoundaryb; +#endif + + iRetcode = mng_process_display_fram (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_FRAM, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_fram (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_FRAM, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_fram)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_FRAM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_fram (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_framp pFRAM = (mng_ani_framp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_FRAM, MNG_LC_START); +#endif + + if (pData->iBreakpoint) /* previously broken ? */ + { + iRetcode = mng_process_display_fram2 (pData); + pData->iBreakpoint = 0; /* not again */ + } + else + { +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_fram (pData, pFRAM->iFramemode, + pFRAM->iChangedelay, pFRAM->iDelay, + pFRAM->iChangetimeout, pFRAM->iTimeout, + pFRAM->iChangeclipping, pFRAM->iCliptype, + pFRAM->iClipl, pFRAM->iClipr, + pFRAM->iClipt, pFRAM->iClipb); +#else + pData->iTempFramemode = pFRAM->iFramemode; + pData->iTempChangedelay = pFRAM->iChangedelay; + pData->iTempDelay = pFRAM->iDelay; + pData->iTempChangetimeout = pFRAM->iChangetimeout; + pData->iTempTimeout = pFRAM->iTimeout; + pData->iTempChangeclipping = pFRAM->iChangeclipping; + pData->iTempCliptype = pFRAM->iCliptype; + pData->iTempClipl = pFRAM->iClipl; + pData->iTempClipr = pFRAM->iClipr; + pData->iTempClipt = pFRAM->iClipt; + pData->iTempClipb = pFRAM->iClipb; + + iRetcode = mng_process_display_fram (pData); +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_FRAM, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MOVE +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_move (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iType, + mng_int32 iLocax, + mng_int32 iLocay) +#else +mng_retcode mng_create_ani_move (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_movep pMOVE; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_MOVE, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_move), + mng_free_obj_general, + mng_process_ani_move, + &pTemp); + if (iRetcode) + return iRetcode; + pMOVE = (mng_ani_movep)pTemp; +#else + MNG_ALLOC (pData, pMOVE, sizeof (mng_ani_move)); + + pMOVE->sHeader.fCleanup = mng_free_ani_move; + pMOVE->sHeader.fProcess = mng_process_ani_move; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pMOVE); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pMOVE->iFirstid = iFirstid; + pMOVE->iLastid = iLastid; + pMOVE->iType = iType; + pMOVE->iLocax = iLocax; + pMOVE->iLocay = iLocay; +#else + pMOVE->iFirstid = ((mng_movep)pChunk)->iFirstid; + pMOVE->iLastid = ((mng_movep)pChunk)->iLastid; + pMOVE->iType = ((mng_movep)pChunk)->iMovetype; + pMOVE->iLocax = ((mng_movep)pChunk)->iMovex; + pMOVE->iLocay = ((mng_movep)pChunk)->iMovey; +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_move (pData, iFirstid, iLastid, + iType, iLocax, iLocay); +#else + iRetcode = mng_process_display_move (pData, + ((mng_movep)pChunk)->iFirstid, + ((mng_movep)pChunk)->iLastid, + ((mng_movep)pChunk)->iMovetype, + ((mng_movep)pChunk)->iMovex, + ((mng_movep)pChunk)->iMovey); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iMOVEfromid = iFirstid; + pData->iMOVEtoid = iLastid; + pData->iMOVEmovetype = iType; + pData->iMOVEmovex = iLocax; + pData->iMOVEmovey = iLocay; +#else + pData->iMOVEfromid = ((mng_movep)pChunk)->iFirstid; + pData->iMOVEtoid = ((mng_movep)pChunk)->iLastid; + pData->iMOVEmovetype = ((mng_movep)pChunk)->iMovetype; + pData->iMOVEmovex = ((mng_movep)pChunk)->iMovex; + pData->iMOVEmovey = ((mng_movep)pChunk)->iMovey; +#endif + + iRetcode = mng_process_display_move (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_MOVE, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_move (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_MOVE, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_move)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_MOVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_move (mng_datap pData, + mng_objectp pObject) +{ + mng_retcode iRetcode; + mng_ani_movep pMOVE = (mng_ani_movep)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_MOVE, MNG_LC_START); +#endif + /* re-process the MOVE chunk */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_move (pData, pMOVE->iFirstid, pMOVE->iLastid, + pMOVE->iType, pMOVE->iLocax, pMOVE->iLocay); +#else + pData->iMOVEfromid = pMOVE->iFirstid; + pData->iMOVEtoid = pMOVE->iLastid; + pData->iMOVEmovetype = pMOVE->iType; + pData->iMOVEmovex = pMOVE->iLocax; + pData->iMOVEmovey = pMOVE->iLocay; + + iRetcode = mng_process_display_move (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_MOVE, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_CLIP +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_clip (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iType, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb) +#else +mng_retcode mng_create_ani_clip (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_clipp pCLIP; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_CLIP, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_clip), + mng_free_obj_general, + mng_process_ani_clip, + &pTemp); + if (iRetcode) + return iRetcode; + pCLIP = (mng_ani_clipp)pTemp; +#else + MNG_ALLOC (pData, pCLIP, sizeof (mng_ani_clip)); + + pCLIP->sHeader.fCleanup = mng_free_ani_clip; + pCLIP->sHeader.fProcess = mng_process_ani_clip; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pCLIP); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pCLIP->iFirstid = iFirstid; + pCLIP->iLastid = iLastid; + pCLIP->iType = iType; + pCLIP->iClipl = iClipl; + pCLIP->iClipr = iClipr; + pCLIP->iClipt = iClipt; + pCLIP->iClipb = iClipb; +#else + pCLIP->iFirstid = ((mng_clipp)pChunk)->iFirstid; + pCLIP->iLastid = ((mng_clipp)pChunk)->iLastid; + pCLIP->iType = ((mng_clipp)pChunk)->iCliptype; + pCLIP->iClipl = ((mng_clipp)pChunk)->iClipl; + pCLIP->iClipr = ((mng_clipp)pChunk)->iClipr; + pCLIP->iClipt = ((mng_clipp)pChunk)->iClipt; + pCLIP->iClipb = ((mng_clipp)pChunk)->iClipb; +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_clip (pData, iFirstid, iLastid, + iType, iClipl, iClipr, + iClipt, iClipb); +#else + iRetcode = mng_process_display_clip (pData, + ((mng_clipp)pChunk)->iFirstid, + ((mng_clipp)pChunk)->iLastid, + ((mng_clipp)pChunk)->iCliptype, + ((mng_clipp)pChunk)->iClipl, + ((mng_clipp)pChunk)->iClipr, + ((mng_clipp)pChunk)->iClipt, + ((mng_clipp)pChunk)->iClipb); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iCLIPfromid = iFirstid; + pData->iCLIPtoid = iLastid; + pData->iCLIPcliptype = iType; + pData->iCLIPclipl = iClipl; + pData->iCLIPclipr = iClipr; + pData->iCLIPclipt = iClipt; + pData->iCLIPclipb = iClipb; +#else + pData->iCLIPfromid = ((mng_clipp)pChunk)->iFirstid; + pData->iCLIPtoid = ((mng_clipp)pChunk)->iLastid; + pData->iCLIPcliptype = ((mng_clipp)pChunk)->iCliptype; + pData->iCLIPclipl = ((mng_clipp)pChunk)->iClipl; + pData->iCLIPclipr = ((mng_clipp)pChunk)->iClipr; + pData->iCLIPclipt = ((mng_clipp)pChunk)->iClipt; + pData->iCLIPclipb = ((mng_clipp)pChunk)->iClipb; +#endif + + iRetcode = mng_process_display_clip (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_CLIP, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_clip (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_CLIP, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_clip)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_CLIP, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_clip (mng_datap pData, + mng_objectp pObject) +{ + mng_retcode iRetcode; + mng_ani_clipp pCLIP = (mng_ani_clipp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_CLIP, MNG_LC_START); +#endif + /* re-process the CLIP chunk */ +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_clip (pData, pCLIP->iFirstid, pCLIP->iLastid, + pCLIP->iType, pCLIP->iClipl, pCLIP->iClipr, + pCLIP->iClipt, pCLIP->iClipb); +#else + pData->iCLIPfromid = pCLIP->iFirstid; + pData->iCLIPtoid = pCLIP->iLastid; + pData->iCLIPcliptype = pCLIP->iType; + pData->iCLIPclipl = pCLIP->iClipl; + pData->iCLIPclipr = pCLIP->iClipr; + pData->iCLIPclipt = pCLIP->iClipt; + pData->iCLIPclipb = pCLIP->iClipb; + + iRetcode = mng_process_display_clip (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_CLIP, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SHOW +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_show (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMode) +#else +mng_retcode mng_create_ani_show (mng_datap pData) +#endif +{ + mng_ani_showp pSHOW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_SHOW, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_show), + mng_free_obj_general, + mng_process_ani_show, + &pTemp); + if (iRetcode) + return iRetcode; + pSHOW = (mng_ani_showp)pTemp; +#else + MNG_ALLOC (pData, pSHOW, sizeof (mng_ani_show)); + + pSHOW->sHeader.fCleanup = mng_free_ani_show; + pSHOW->sHeader.fProcess = mng_process_ani_show; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pSHOW); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pSHOW->iFirstid = iFirstid; + pSHOW->iLastid = iLastid; + pSHOW->iMode = iMode; +#else + pSHOW->iFirstid = pData->iSHOWfromid; + pSHOW->iLastid = pData->iSHOWtoid; + pSHOW->iMode = pData->iSHOWmode; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_show (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_SHOW, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_show)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_SHOW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_show (mng_datap pData, + mng_objectp pObject) +{ + mng_retcode iRetcode; + mng_ani_showp pSHOW = (mng_ani_showp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_SHOW, MNG_LC_START); +#endif + + if (pData->iBreakpoint) /* returning from breakpoint ? */ + { + iRetcode = mng_process_display_show (pData); + } + else + { /* "re-run" SHOW chunk */ + pData->iSHOWmode = pSHOW->iMode; + pData->iSHOWfromid = pSHOW->iFirstid; + pData->iSHOWtoid = pSHOW->iLastid; + + iRetcode = mng_process_display_show (pData); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_SHOW, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_TERM +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_term (mng_datap pData, + mng_uint8 iTermaction, + mng_uint8 iIteraction, + mng_uint32 iDelay, + mng_uint32 iItermax) +#else +mng_retcode mng_create_ani_term (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_termp pTERM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_TERM, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_term), + mng_free_obj_general, + mng_process_ani_term, + &pTemp); + if (iRetcode) + return iRetcode; + pTERM = (mng_ani_termp)pTemp; +#else + MNG_ALLOC (pData, pTERM, sizeof (mng_ani_term)); + + pTERM->sHeader.fCleanup = mng_free_ani_term; + pTERM->sHeader.fProcess = mng_process_ani_term; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pTERM); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pTERM->iTermaction = iTermaction; + pTERM->iIteraction = iIteraction; + pTERM->iDelay = iDelay; + pTERM->iItermax = iItermax; +#else + pTERM->iTermaction = ((mng_termp)pChunk)->iTermaction; + pTERM->iIteraction = ((mng_termp)pChunk)->iIteraction; + pTERM->iDelay = ((mng_termp)pChunk)->iDelay; + pTERM->iItermax = ((mng_termp)pChunk)->iItermax; +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_term (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_TERM, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_term)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_term (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_TERM, MNG_LC_START); +#endif + + /* dummy: no action required! */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_TERM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_create_ani_save (mng_datap pData) +{ + mng_ani_savep pSAVE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_SAVE, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_save), + mng_free_obj_general, + mng_process_ani_save, + &pTemp); + if (iRetcode) + return iRetcode; + pSAVE = (mng_ani_savep)pTemp; +#else + MNG_ALLOC (pData, pSAVE, sizeof (mng_ani_save)); + + pSAVE->sHeader.fCleanup = mng_free_ani_save; + pSAVE->sHeader.fProcess = mng_process_ani_save; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pSAVE); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_save (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_SAVE, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_save)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_save (mng_datap pData, + mng_objectp pObject) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_SAVE, MNG_LC_START); +#endif + + iRetcode = mng_process_display_save (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_SAVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_SEEK +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_seek (mng_datap pData, + mng_uint32 iSegmentnamesize, + mng_pchar zSegmentname) +#else +mng_retcode mng_create_ani_seek (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_seekp pSEEK; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_SEEK, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_seek), + mng_free_ani_seek, + mng_process_ani_seek, + &pTemp); + if (iRetcode) + return iRetcode; + pSEEK = (mng_ani_seekp)pTemp; +#else + MNG_ALLOC (pData, pSEEK, sizeof (mng_ani_seek)); + + pSEEK->sHeader.fCleanup = mng_free_ani_seek; + pSEEK->sHeader.fProcess = mng_process_ani_seek; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pSEEK); + + pData->pLastseek = (mng_objectp)pSEEK; + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pSEEK->iSegmentnamesize = iSegmentnamesize; + if (iSegmentnamesize) + { + MNG_ALLOC (pData, pSEEK->zSegmentname, iSegmentnamesize + 1); + MNG_COPY (pSEEK->zSegmentname, zSegmentname, iSegmentnamesize); + } +#else + pSEEK->iSegmentnamesize = ((mng_seekp)pChunk)->iNamesize; + if (pSEEK->iSegmentnamesize) + { + MNG_ALLOC (pData, pSEEK->zSegmentname, pSEEK->iSegmentnamesize + 1); + MNG_COPY (pSEEK->zSegmentname, ((mng_seekp)pChunk)->zName, pSEEK->iSegmentnamesize); + } +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_SEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_free_ani_seek (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_seekp pSEEK = (mng_ani_seekp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_SEEK, MNG_LC_START); +#endif + + if (pSEEK->iSegmentnamesize) + MNG_FREEX (pData, pSEEK->zSegmentname, pSEEK->iSegmentnamesize + 1); + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + MNG_FREEX (pData, pObject, sizeof (mng_ani_seek)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_SEEK, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + return MNG_NOERROR; +#else + return mng_free_obj_general(pData, pObject); +#endif +} + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_seek (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_seekp pSEEK = (mng_ani_seekp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_SEEK, MNG_LC_START); +#endif + +#ifdef MNG_SUPPORT_DYNAMICMNG + if (!pData->bStopafterseek) /* can we really process this one ? */ +#endif + { + pData->pLastseek = pObject; + + if (pData->fProcessseek) /* inform the app ? */ + { + mng_bool bOke; + mng_pchar zName; + + MNG_ALLOC (pData, zName, pSEEK->iSegmentnamesize + 1); + + if (pSEEK->iSegmentnamesize) + MNG_COPY (zName, pSEEK->zSegmentname, pSEEK->iSegmentnamesize); + + bOke = pData->fProcessseek ((mng_handle)pData, zName); + + MNG_FREEX (pData, zName, pSEEK->iSegmentnamesize + 1); + + if (!bOke) + MNG_ERROR (pData, MNG_APPMISCERROR); + } + } + + iRetcode = mng_process_display_seek (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_SEEK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_dhdr (mng_datap pData, + mng_uint16 iObjectid, + mng_uint8 iImagetype, + mng_uint8 iDeltatype, + mng_uint32 iBlockwidth, + mng_uint32 iBlockheight, + mng_uint32 iBlockx, + mng_uint32 iBlocky) +#else +mng_retcode mng_create_ani_dhdr (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_dhdrp pDHDR; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_DHDR, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_dhdr), + mng_free_obj_general, + mng_process_ani_dhdr, + &pTemp); + if (iRetcode) + return iRetcode; + pDHDR = (mng_ani_dhdrp)pTemp; +#else + MNG_ALLOC (pData, pDHDR, sizeof (mng_ani_dhdr)); + + pDHDR->sHeader.fCleanup = mng_free_ani_dhdr; + pDHDR->sHeader.fProcess = mng_process_ani_dhdr; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pDHDR); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pDHDR->iObjectid = iObjectid; + pDHDR->iImagetype = iImagetype; + pDHDR->iDeltatype = iDeltatype; + pDHDR->iBlockwidth = iBlockwidth; + pDHDR->iBlockheight = iBlockheight; + pDHDR->iBlockx = iBlockx; + pDHDR->iBlocky = iBlocky; +#else + pDHDR->iObjectid = ((mng_dhdrp)pChunk)->iObjectid; + pDHDR->iImagetype = ((mng_dhdrp)pChunk)->iImagetype; + pDHDR->iDeltatype = ((mng_dhdrp)pChunk)->iDeltatype; + pDHDR->iBlockwidth = ((mng_dhdrp)pChunk)->iBlockwidth; + pDHDR->iBlockheight = ((mng_dhdrp)pChunk)->iBlockheight; + pDHDR->iBlockx = ((mng_dhdrp)pChunk)->iBlockx; + pDHDR->iBlocky = ((mng_dhdrp)pChunk)->iBlocky; +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_dhdr (pData, iObjectid, + iImagetype, iDeltatype, + iBlockwidth, iBlockheight, + iBlockx, iBlocky); +#else + iRetcode = mng_process_display_dhdr (pData, + ((mng_dhdrp)pChunk)->iObjectid, + ((mng_dhdrp)pChunk)->iImagetype, + ((mng_dhdrp)pChunk)->iDeltatype, + ((mng_dhdrp)pChunk)->iBlockwidth, + ((mng_dhdrp)pChunk)->iBlockheight, + ((mng_dhdrp)pChunk)->iBlockx, + ((mng_dhdrp)pChunk)->iBlocky); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iDHDRobjectid = iObjectid; + pData->iDHDRimagetype = iImagetype; + pData->iDHDRdeltatype = iDeltatype; + pData->iDHDRblockwidth = iBlockwidth; + pData->iDHDRblockheight = iBlockheight; + pData->iDHDRblockx = iBlockx; + pData->iDHDRblocky = iBlocky; +#else + pData->iDHDRobjectid = ((mng_dhdrp)pChunk)->iObjectid; + pData->iDHDRimagetype = ((mng_dhdrp)pChunk)->iImagetype; + pData->iDHDRdeltatype = ((mng_dhdrp)pChunk)->iDeltatype; + pData->iDHDRblockwidth = ((mng_dhdrp)pChunk)->iBlockwidth; + pData->iDHDRblockheight = ((mng_dhdrp)pChunk)->iBlockheight; + pData->iDHDRblockx = ((mng_dhdrp)pChunk)->iBlockx; + pData->iDHDRblocky = ((mng_dhdrp)pChunk)->iBlocky; +#endif + + iRetcode = mng_process_display_dhdr (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_DHDR, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_dhdr (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_DHDR, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_dhdr)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_DHDR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_dhdr (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_dhdrp pDHDR = (mng_ani_dhdrp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_DHDR, MNG_LC_START); +#endif + + pData->bHasDHDR = MNG_TRUE; /* let everyone know we're inside a DHDR */ + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_dhdr (pData, pDHDR->iObjectid, + pDHDR->iImagetype, pDHDR->iDeltatype, + pDHDR->iBlockwidth, pDHDR->iBlockheight, + pDHDR->iBlockx, pDHDR->iBlocky); +#else + pData->iDHDRobjectid = pDHDR->iObjectid; + pData->iDHDRimagetype = pDHDR->iImagetype; + pData->iDHDRdeltatype = pDHDR->iDeltatype; + pData->iDHDRblockwidth = pDHDR->iBlockwidth; + pData->iDHDRblockheight = pDHDR->iBlockheight; + pData->iDHDRblockx = pDHDR->iBlockx; + pData->iDHDRblocky = pDHDR->iBlocky; + + iRetcode = mng_process_display_dhdr (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_DHDR, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_prom (mng_datap pData, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iFilltype) +#else +mng_retcode mng_create_ani_prom (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_promp pPROM=NULL; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_PROM, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_prom), + mng_free_obj_general, + mng_process_ani_prom, + &pTemp); + if (iRetcode) + return iRetcode; + pPROM = (mng_ani_promp)pTemp; +#else + MNG_ALLOC (pData, pPROM, sizeof (mng_ani_prom)); + + pPROM->sHeader.fCleanup = mng_free_ani_prom; + pPROM->sHeader.fProcess = mng_process_ani_prom; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pPROM); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pPROM->iBitdepth = iBitdepth; + pPROM->iColortype = iColortype; + pPROM->iFilltype = iFilltype; +#else + pPROM->iBitdepth = ((mng_promp)pChunk)->iSampledepth; + pPROM->iColortype = ((mng_promp)pChunk)->iColortype; + pPROM->iFilltype = ((mng_promp)pChunk)->iFilltype; +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_prom (pData, iBitdepth, + iColortype, iFilltype); +#else + iRetcode = mng_process_display_prom (pData, + ((mng_promp)pChunk)->iSampledepth, + ((mng_promp)pChunk)->iColortype, + ((mng_promp)pChunk)->iFilltype); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iPROMbitdepth = iBitdepth; + pData->iPROMcolortype = iColortype; + pData->iPROMfilltype = iFilltype; +#else + pData->iPROMbitdepth = ((mng_promp)pChunk)->iSampledepth; + pData->iPROMcolortype = ((mng_promp)pChunk)->iColortype; + pData->iPROMfilltype = ((mng_promp)pChunk)->iFilltype; +#endif + + iRetcode = mng_process_display_prom (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_PROM, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_prom (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_PROM, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_prom)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_PROM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_prom (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_promp pPROM = (mng_ani_promp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_PROM, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_prom (pData, pPROM->iBitdepth, + pPROM->iColortype, pPROM->iFilltype); +#else + pData->iPROMbitdepth = pPROM->iBitdepth; + pData->iPROMcolortype = pPROM->iColortype; + pData->iPROMfilltype = pPROM->iFilltype; + + iRetcode = mng_process_display_prom (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_PROM, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_create_ani_ipng (mng_datap pData) +{ + mng_ani_ipngp pIPNG; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_IPNG, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_ipng), + mng_free_obj_general, + mng_process_ani_ipng, + &pTemp); + if (iRetcode) + return iRetcode; + pIPNG = (mng_ani_ipngp)pTemp; +#else + MNG_ALLOC (pData, pIPNG, sizeof (mng_ani_ipng)); + + pIPNG->sHeader.fCleanup = mng_free_ani_ipng; + pIPNG->sHeader.fProcess = mng_process_ani_ipng; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pIPNG); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_ipng (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_IPNG, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_ipng)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_ipng (mng_datap pData, + mng_objectp pObject) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_IPNG, MNG_LC_START); +#endif + + iRetcode = mng_process_display_ipng (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_IPNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_create_ani_ijng (mng_datap pData) +{ + mng_ani_ijngp pIJNG; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_IJNG, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_ani_ijng), + mng_free_obj_general, + mng_process_ani_ijng, + &pTemp); + if (iRetcode) + return iRetcode; + pIJNG = (mng_ani_ijngp)pTemp; +#else + MNG_ALLOC (pData, pIJNG, sizeof (mng_ani_ijng)); + + pIJNG->sHeader.fCleanup = mng_free_ani_ijng; + pIJNG->sHeader.fProcess = mng_process_ani_ijng; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pIJNG); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_ijng (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_IJNG, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_ijng)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_ijng (mng_datap pData, + mng_objectp pObject) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_IJNG, MNG_LC_START); +#endif + + iRetcode = mng_process_display_ijng (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_IJNG, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_create_ani_pplt (mng_datap pData, + mng_uint8 iType, + mng_uint32 iCount, + mng_palette8ep paIndexentries, + mng_uint8p paAlphaentries, + mng_uint8p paUsedentries) +{ + mng_ani_ppltp pPPLT; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_PPLT, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_pplt), + mng_free_obj_general, + mng_process_ani_pplt, + &pTemp); + if (iRetcode) + return iRetcode; + pPPLT = (mng_ani_ppltp)pTemp; +#else + MNG_ALLOC (pData, pPPLT, sizeof (mng_ani_pplt)); + + pPPLT->sHeader.fCleanup = mng_free_ani_pplt; + pPPLT->sHeader.fProcess = mng_process_ani_pplt; +#endif + + pPPLT->iType = iType; + pPPLT->iCount = iCount; + + MNG_COPY (pPPLT->aIndexentries, paIndexentries, sizeof (pPPLT->aIndexentries)); + MNG_COPY (pPPLT->aAlphaentries, paAlphaentries, sizeof (pPPLT->aAlphaentries)); + MNG_COPY (pPPLT->aUsedentries, paUsedentries, sizeof (pPPLT->aUsedentries )); + + mng_add_ani_object (pData, (mng_object_headerp)pPPLT); + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_pplt (pData, iType, iCount, + paIndexentries, paAlphaentries, paUsedentries); +#else + pData->iPPLTtype = iType; + pData->iPPLTcount = iCount; + pData->paPPLTindexentries = paIndexentries; + pData->paPPLTalphaentries = paAlphaentries; + pData->paPPLTusedentries = paUsedentries; + + iRetcode = mng_process_display_pplt (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_PPLT, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_pplt (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_PPLT, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_pplt)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_PPLT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_pplt (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_ppltp pPPLT = (mng_ani_ppltp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_PPLT, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_pplt (pData, pPPLT->iType, pPPLT->iCount, + pPPLT->aIndexentries, pPPLT->aAlphaentries, + pPPLT->aUsedentries); +#else + pData->iPPLTtype = pPPLT->iType; + pData->iPPLTcount = pPPLT->iCount; + pData->paPPLTindexentries = &pPPLT->aIndexentries; + pData->paPPLTalphaentries = &pPPLT->aAlphaentries; + pData->paPPLTusedentries = &pPPLT->aUsedentries; + + iRetcode = mng_process_display_pplt (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_PPLT, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_magn (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMethodX, + mng_uint16 iMX, + mng_uint16 iMY, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint16 iMT, + mng_uint16 iMB, + mng_uint8 iMethodY) +#else +mng_retcode mng_create_ani_magn (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_magnp pMAGN=NULL; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_MAGN, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_magn), + mng_free_obj_general, + mng_process_ani_magn, + &pTemp); + if (iRetcode) + return iRetcode; + pMAGN = (mng_ani_magnp)pTemp; +#else + MNG_ALLOC (pData, pMAGN, sizeof (mng_ani_magn)); + + pMAGN->sHeader.fCleanup = mng_free_ani_magn; + pMAGN->sHeader.fProcess = mng_process_ani_magn; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pMAGN); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pMAGN->iFirstid = iFirstid; + pMAGN->iLastid = iLastid; + pMAGN->iMethodX = iMethodX; + pMAGN->iMX = iMX; + pMAGN->iMY = iMY; + pMAGN->iML = iML; + pMAGN->iMR = iMR; + pMAGN->iMT = iMT; + pMAGN->iMB = iMB; + pMAGN->iMethodY = iMethodY; +#else + pMAGN->iFirstid = ((mng_magnp)pChunk)->iFirstid; + pMAGN->iLastid = ((mng_magnp)pChunk)->iLastid; + pMAGN->iMethodX = ((mng_magnp)pChunk)->iMethodX; + pMAGN->iMX = ((mng_magnp)pChunk)->iMX; + pMAGN->iMY = ((mng_magnp)pChunk)->iMY; + pMAGN->iML = ((mng_magnp)pChunk)->iML; + pMAGN->iMR = ((mng_magnp)pChunk)->iMR; + pMAGN->iMT = ((mng_magnp)pChunk)->iMT; + pMAGN->iMB = ((mng_magnp)pChunk)->iMB; + pMAGN->iMethodY = ((mng_magnp)pChunk)->iMethodY; +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_magn (pData, pMAGN->iFirstid, pMAGN->iLastid, + pMAGN->iMethodX, pMAGN->iMX, pMAGN->iMY, + pMAGN->iML, pMAGN->iMR, pMAGN->iMT, + pMAGN->iMB, pMAGN->iMethodY); +#else + iRetcode = mng_process_display_magn (pData, + ((mng_magnp)pChunk)->iFirstid, + ((mng_magnp)pChunk)->iLastid, + ((mng_magnp)pChunk)->iMethodX, + ((mng_magnp)pChunk)->iMX, + ((mng_magnp)pChunk)->iMY, + ((mng_magnp)pChunk)->iML, + ((mng_magnp)pChunk)->iMR, + ((mng_magnp)pChunk)->iMT, + ((mng_magnp)pChunk)->iMB, + ((mng_magnp)pChunk)->iMethodY); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iMAGNfirstid = iFirstid; + pData->iMAGNlastid = iLastid; + pData->iMAGNmethodX = iMethodX; + pData->iMAGNmX = iMX; + pData->iMAGNmY = iMY; + pData->iMAGNmL = iML; + pData->iMAGNmR = iMR; + pData->iMAGNmT = iMT; + pData->iMAGNmB = iMB; + pData->iMAGNmethodY = iMethodY; +#else + pData->iMAGNfirstid = ((mng_magnp)pChunk)->iFirstid; + pData->iMAGNlastid = ((mng_magnp)pChunk)->iLastid; + pData->iMAGNmethodX = ((mng_magnp)pChunk)->iMethodX; + pData->iMAGNmX = ((mng_magnp)pChunk)->iMX; + pData->iMAGNmY = ((mng_magnp)pChunk)->iMY; + pData->iMAGNmL = ((mng_magnp)pChunk)->iML; + pData->iMAGNmR = ((mng_magnp)pChunk)->iMR; + pData->iMAGNmT = ((mng_magnp)pChunk)->iMT; + pData->iMAGNmB = ((mng_magnp)pChunk)->iMB; + pData->iMAGNmethodY = ((mng_magnp)pChunk)->iMethodY; +#endif + + iRetcode = mng_process_display_magn (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_MAGN, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_OBJCLEANUP +mng_retcode mng_free_ani_magn (mng_datap pData, + mng_objectp pObject) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_MAGN, MNG_LC_START); +#endif + + MNG_FREEX (pData, pObject, sizeof (mng_ani_magn)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_MAGN, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_magn (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_magnp pMAGN = (mng_ani_magnp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_MAGN, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_magn (pData, pMAGN->iFirstid, pMAGN->iLastid, + pMAGN->iMethodX, pMAGN->iMX, pMAGN->iMY, + pMAGN->iML, pMAGN->iMR, pMAGN->iMT, + pMAGN->iMB, pMAGN->iMethodY); +#else + pData->iMAGNfirstid = pMAGN->iFirstid; + pData->iMAGNlastid = pMAGN->iLastid; + pData->iMAGNmethodX = pMAGN->iMethodX; + pData->iMAGNmX = pMAGN->iMX; + pData->iMAGNmY = pMAGN->iMY; + pData->iMAGNmL = pMAGN->iML; + pData->iMAGNmR = pMAGN->iMR; + pData->iMAGNmT = pMAGN->iMT; + pData->iMAGNmB = pMAGN->iMB; + pData->iMAGNmethodY = pMAGN->iMethodY; + + iRetcode = mng_process_display_magn (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_MAGN, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_past (mng_datap pData, + mng_uint16 iTargetid, + mng_uint8 iTargettype, + mng_int32 iTargetx, + mng_int32 iTargety, + mng_uint32 iCount, + mng_ptr pSources) +#else +mng_retcode mng_create_ani_past (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_pastp pPAST; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_PAST, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_past), + mng_free_ani_past, + mng_process_ani_past, + &pTemp); + if (iRetcode) + return iRetcode; + pPAST = (mng_ani_pastp)pTemp; +#else + MNG_ALLOC (pData, pPAST, sizeof (mng_ani_past)); + + pPAST->sHeader.fCleanup = mng_free_ani_past; + pPAST->sHeader.fProcess = mng_process_ani_past; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pPAST); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pPAST->iTargetid = iTargetid; + pPAST->iTargettype = iTargettype; + pPAST->iTargetx = iTargetx; + pPAST->iTargety = iTargety; + pPAST->iCount = iCount; + + if (iCount) + { + MNG_ALLOC (pData, pPAST->pSources, (iCount * sizeof (mng_past_source))); + MNG_COPY (pPAST->pSources, pSources, (iCount * sizeof (mng_past_source))); + } +#else + pPAST->iTargetid = ((mng_pastp)pChunk)->iDestid; + pPAST->iTargettype = ((mng_pastp)pChunk)->iTargettype; + pPAST->iTargetx = ((mng_pastp)pChunk)->iTargetx; + pPAST->iTargety = ((mng_pastp)pChunk)->iTargety; + pPAST->iCount = ((mng_pastp)pChunk)->iCount; + + if (pPAST->iCount) + { + mng_size_t iSize = (mng_size_t)(pPAST->iCount * sizeof (mng_past_source)); + MNG_ALLOC (pData, pPAST->pSources, iSize); + MNG_COPY (pPAST->pSources, ((mng_pastp)pChunk)->pSources, iSize); + } +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_past (pData, iTargetid, iTargettype, + iTargetx, iTargety, + iCount, pSources); +#else + iRetcode = mng_process_display_past (pData, + ((mng_pastp)pChunk)->iDestid, + ((mng_pastp)pChunk)->iTargettype, + ((mng_pastp)pChunk)->iTargetx, + ((mng_pastp)pChunk)->iTargety, + ((mng_pastp)pChunk)->iCount, + ((mng_pastp)pChunk)->pSources); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iPASTtargetid = iTargetid; + pData->iPASTtargettype = iTargettype; + pData->iPASTtargetx = iTargetx; + pData->iPASTtargety = iTargety; + pData->iPASTcount = iCount; + pData->pPASTsources = pSources; +#else + pData->iPASTtargetid = ((mng_pastp)pChunk)->iDestid; + pData->iPASTtargettype = ((mng_pastp)pChunk)->iTargettype; + pData->iPASTtargetx = ((mng_pastp)pChunk)->iTargetx; + pData->iPASTtargety = ((mng_pastp)pChunk)->iTargety; + pData->iPASTcount = ((mng_pastp)pChunk)->iCount; + pData->pPASTsources = ((mng_pastp)pChunk)->pSources; +#endif + + iRetcode = mng_process_display_past (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_PAST, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_free_ani_past (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_pastp pPAST = (mng_ani_pastp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_PAST, MNG_LC_START); +#endif + + if (pPAST->iCount) + MNG_FREEX (pData, pPAST->pSources, (pPAST->iCount * sizeof (mng_past_source))); + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + MNG_FREEX (pData, pObject, sizeof (mng_ani_past)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_PAST, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + return MNG_NOERROR; +#else + return mng_free_obj_general(pData, pObject); +#endif +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_process_ani_past (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_pastp pPAST = (mng_ani_pastp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_PAST, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_past (pData, pPAST->iTargetid, pPAST->iTargettype, + pPAST->iTargetx, pPAST->iTargety, + pPAST->iCount, pPAST->pSources); +#else + pData->iPASTtargetid = pPAST->iTargetid; + pData->iPASTtargettype = pPAST->iTargettype; + pData->iPASTtargetx = pPAST->iTargetx; + pData->iPASTtargety = pPAST->iTargety; + pData->iPASTcount = pPAST->iCount; + pData->pPASTsources = pPAST->pSources; + + iRetcode = mng_process_display_past (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_PAST, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ani_disc (mng_datap pData, + mng_uint32 iCount, + mng_uint16p pIds) +#else +mng_retcode mng_create_ani_disc (mng_datap pData, + mng_chunkp pChunk) +#endif +{ + mng_ani_discp pDISC; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_DISC, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + iRetcode = create_obj_general (pData, sizeof (mng_ani_disc), + mng_free_ani_disc, + mng_process_ani_disc, + &pTemp); + if (iRetcode) + return iRetcode; + pDISC = (mng_ani_discp)pTemp; +#else + MNG_ALLOC (pData, pDISC, sizeof (mng_ani_disc)); + + pDISC->sHeader.fCleanup = mng_free_ani_disc; + pDISC->sHeader.fProcess = mng_process_ani_disc; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pDISC); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pDISC->iCount = iCount; + + if (iCount) + { + MNG_ALLOC (pData, pDISC->pIds, (iCount << 1)); + MNG_COPY (pDISC->pIds, pIds, (iCount << 1)); + } +#else + pDISC->iCount = ((mng_discp)pChunk)->iCount; + + if (pDISC->iCount) + { + mng_size_t iSize = (mng_size_t)(pDISC->iCount << 1); + MNG_ALLOC (pData, pDISC->pIds, iSize); + MNG_COPY (pDISC->pIds, ((mng_discp)pChunk)->pObjectids, iSize); + } +#endif + } + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS +#ifndef MNG_OPTIMIZE_CHUNKREADER + iRetcode = mng_process_display_disc (pData, iCount, pIds); +#else + iRetcode = mng_process_display_disc (pData, + ((mng_discp)pChunk)->iCount, + ((mng_discp)pChunk)->pObjectids); +#endif +#else +#ifndef MNG_OPTIMIZE_CHUNKREADER + pData->iDISCcount = iCount; + pData->pDISCids = pIds; +#else + pData->iDISCcount = ((mng_discp)pChunk)->iCount; + pData->pDISCids = ((mng_discp)pChunk)->pObjectids; +#endif + + iRetcode = mng_process_display_disc (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANI_DISC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_free_ani_disc (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_discp pDISC = (mng_ani_discp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_DISC, MNG_LC_START); +#endif + + if (pDISC->iCount) + MNG_FREEX (pData, pDISC->pIds, (pDISC->iCount << 1)); + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + MNG_FREEX (pData, pObject, sizeof (mng_ani_disc)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANI_DISC, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + return MNG_NOERROR; +#else + return mng_free_obj_general(pData, pObject); +#endif +} + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_disc (mng_datap pData, + mng_objectp pObject) +{ + mng_ani_discp pDISC = (mng_ani_discp)pObject; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_DISC, MNG_LC_START); +#endif + +#ifndef MNG_OPTIMIZE_DISPLAYCALLS + iRetcode = mng_process_display_disc (pData, pDISC->iCount, pDISC->pIds); +#else + pData->iDISCcount = pDISC->iCount; + pData->pDISCids = pDISC->pIds; + + iRetcode = mng_process_display_disc (pData); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANI_DISC, MNG_LC_END); +#endif + + return iRetcode; +} +#endif + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DYNAMICMNG + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_event (mng_datap pData, + mng_uint8 iEventtype, + mng_uint8 iMasktype, + mng_int32 iLeft, + mng_int32 iRight, + mng_int32 iTop, + mng_int32 iBottom, + mng_uint16 iObjectid, + mng_uint8 iIndex, + mng_uint32 iSegmentnamesize, + mng_pchar zSegmentname) +#else +mng_retcode mng_create_event (mng_datap pData, + mng_ptr pEntry) +#endif +{ + mng_eventp pEvent; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_EVENT, MNG_LC_START); +#endif + + if (pData->bCacheplayback) /* caching playback info ? */ + { + mng_object_headerp pLast; + +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_ptr pTemp; + mng_retcode iRetcode = create_obj_general (pData, sizeof (mng_event), + mng_free_event, + mng_process_event, + &pTemp); + if (iRetcode) + return iRetcode; + pEvent = (mng_eventp)pTemp; +#else + MNG_ALLOC (pData, pEvent, sizeof (mng_event)); + + pEvent->sHeader.fCleanup = mng_free_event; + pEvent->sHeader.fProcess = mng_process_event; +#endif + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pEvent->iEventtype = iEventtype; + pEvent->iMasktype = iMasktype; + pEvent->iLeft = iLeft; + pEvent->iRight = iRight; + pEvent->iTop = iTop; + pEvent->iBottom = iBottom; + pEvent->iObjectid = iObjectid; + pEvent->iIndex = iIndex; + pEvent->iSegmentnamesize = iSegmentnamesize; + + if (iSegmentnamesize) + { + MNG_ALLOC (pData, pEvent->zSegmentname, iSegmentnamesize+1); + MNG_COPY (pEvent->zSegmentname, zSegmentname, iSegmentnamesize); + } +#else + pEvent->iEventtype = ((mng_evnt_entryp)pEntry)->iEventtype; + pEvent->iMasktype = ((mng_evnt_entryp)pEntry)->iMasktype; + pEvent->iLeft = ((mng_evnt_entryp)pEntry)->iLeft; + pEvent->iRight = ((mng_evnt_entryp)pEntry)->iRight; + pEvent->iTop = ((mng_evnt_entryp)pEntry)->iTop; + pEvent->iBottom = ((mng_evnt_entryp)pEntry)->iBottom; + pEvent->iObjectid = ((mng_evnt_entryp)pEntry)->iObjectid; + pEvent->iIndex = ((mng_evnt_entryp)pEntry)->iIndex; + pEvent->iSegmentnamesize = ((mng_evnt_entryp)pEntry)->iSegmentnamesize; + + if (pEvent->iSegmentnamesize) + { + MNG_ALLOC (pData, pEvent->zSegmentname, pEvent->iSegmentnamesize+1); + MNG_COPY (pEvent->zSegmentname, ((mng_evnt_entryp)pEntry)->zSegmentname, pEvent->iSegmentnamesize); + } +#endif + /* fixup the double-linked list */ + pLast = (mng_object_headerp)pData->pLastevent; + + if (pLast) /* link it as last in the chain */ + { + pEvent->sHeader.pPrev = pLast; + pLast->pNext = pEvent; + } + else + { + pData->pFirstevent = pEvent; + } + + pData->pLastevent = pEvent; + pData->bDynamic = MNG_TRUE; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_EVENT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_free_event (mng_datap pData, + mng_objectp pObject) +{ + mng_eventp pEvent = (mng_eventp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_EVENT, MNG_LC_START); +#endif + + if (pEvent->iSegmentnamesize) + MNG_FREEX (pData, pEvent->zSegmentname, pEvent->iSegmentnamesize + 1); + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + MNG_FREEX (pData, pEvent, sizeof (mng_event)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_EVENT, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + return MNG_NOERROR; +#else + return mng_free_obj_general(pData, pObject); +#endif +} + +/* ************************************************************************** */ + +mng_retcode mng_process_event (mng_datap pData, + mng_objectp pObject) +{ +#ifndef MNG_SKIPCHUNK_SEEK + mng_eventp pEvent = (mng_eventp)pObject; + mng_object_headerp pAni; + mng_bool bFound = MNG_FALSE; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_EVENT, MNG_LC_START); +#endif + +#ifndef MNG_SKIPCHUNK_SEEK + if (!pEvent->pSEEK) /* need to find SEEK first ? */ + { + pAni = (mng_object_headerp)pData->pFirstaniobj; + + while ((pAni) && (!bFound)) + { + if ((pAni->fCleanup == mng_free_ani_seek) && + (strcmp(pEvent->zSegmentname, ((mng_ani_seekp)pAni)->zSegmentname) == 0)) + bFound = MNG_TRUE; + else + pAni = (mng_object_headerp)pAni->pNext; + } + + if (pAni) + pEvent->pSEEK = (mng_ani_seekp)pAni; + } + + if (pEvent->pSEEK) /* anything to do ? */ + { + pEvent->iLastx = pData->iEventx; + pEvent->iLasty = pData->iEventy; + /* let's start from this SEEK then */ + pData->pCurraniobj = (mng_objectp)pEvent->pSEEK; + pData->bRunningevent = MNG_TRUE; + /* wake-up the app ! */ + if (!pData->fSettimer ((mng_handle)pData, 5)) + MNG_ERROR (pData, MNG_APPTIMERERROR); + + } + else + MNG_ERROR (pData, MNG_SEEKNOTFOUND); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_EVENT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_SUPPORT_DYNAMICMNG */ + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_mpng_obj (mng_datap pData, + mng_uint32 iFramewidth, + mng_uint32 iFrameheight, + mng_uint16 iNumplays, + mng_uint16 iTickspersec, + mng_uint32 iFramessize, + mng_ptr pFrames) +#else +mng_retcode mng_create_mpng_obj (mng_datap pData, + mng_ptr pEntry) +#endif +{ + mng_mpng_objp pMPNG; + mng_ptr pTemp; + mng_retcode iRetcode; + mng_uint8p pFrame; + mng_int32 iCnt, iMax; + mng_uint32 iX, iY, iWidth, iHeight; + mng_int32 iXoffset, iYoffset; + mng_uint16 iTicks; + mng_uint16 iDelay; + mng_bool bNewframe; + mng_ani_loopp pLOOP; + mng_ani_endlp pENDL; + mng_ani_framp pFRAM; + mng_ani_movep pMOVE; + mng_ani_clipp pCLIP; + mng_ani_showp pSHOW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_MPNG_OBJ, MNG_LC_START); +#endif + +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_mpng_obj), mng_free_mpng_obj, + mng_process_mpng_obj, &pTemp); + if (iRetcode) + return iRetcode; + pMPNG = (mng_mpng_objp)pTemp; +#else + MNG_ALLOC (pData, pMPNG, sizeof (mng_mpng_obj)); + + pMPNG->sHeader.fCleanup = mng_free_mpng_obj; + pMPNG->sHeader.fProcess = mng_process_mpng_obj; +#endif + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pMPNG->iFramewidth = iFramewidth; + pMPNG->iFrameheight = iFrameheight; + pMPNG->iNumplays = iNumplays; + pMPNG->iTickspersec = iTickspersec; + pMPNG->iFramessize = iFramessize; + + if (iFramessize) + { + MNG_ALLOC (pData, pMPNG->pFrames, iFramessize); + MNG_COPY (pMPNG->pFrames, pFrames, iFramessize); + } +#else + pMPNG->iFramewidth = ((mng_mpngp)pEntry)->iFramewidth; + pMPNG->iFrameheight = ((mng_mpngp)pEntry)->iFrameheight; + pMPNG->iNumplays = ((mng_mpngp)pEntry)->iNumplays; + pMPNG->iTickspersec = ((mng_mpngp)pEntry)->iTickspersec; + pMPNG->iFramessize = ((mng_mpngp)pEntry)->iFramessize; + + if (pMPNG->iFramessize) + { + MNG_ALLOC (pData, pMPNG->pFrames, pMPNG->iFramessize); + MNG_COPY (pMPNG->pFrames, ((mng_mpngp)pEntry)->pFrames, pMPNG->iFramessize); + } +#endif + + pData->pMPNG = pMPNG; + pData->eImagetype = mng_it_mpng; + + iRetcode = mng_process_display_mpng (pData); + if (iRetcode) + return iRetcode; + + /* now let's create the MNG animation directives from this */ + + pFrame = (mng_uint8p)pMPNG->pFrames; + iMax = pMPNG->iFramessize / 26; + /* set up MNG impersonation */ + pData->iTicks = pMPNG->iTickspersec; + pData->iLayercount = iMax; + + if (pMPNG->iNumplays != 1) /* create a LOOP/ENDL pair ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_loop), + mng_free_ani_loop, mng_process_ani_loop, + &((mng_ptr)pLOOP)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pLOOP, sizeof (mng_ani_loop)); + + pLOOP->sHeader.fCleanup = mng_free_ani_loop; + pLOOP->sHeader.fProcess = mng_process_ani_loop; +#endif + + pLOOP->iLevel = 1; + if (pMPNG->iNumplays) + pLOOP->iRepeatcount = pMPNG->iNumplays; + else + pLOOP->iRepeatcount = 0xFFFFFFFFl; + + mng_add_ani_object (pData, (mng_object_headerp)pLOOP); + } + + bNewframe = MNG_TRUE; /* create the frame display objects */ + + for (iCnt = 0; iCnt < iMax; iCnt++) + { + iX = mng_get_uint32 (pFrame); + iY = mng_get_uint32 (pFrame+4); + iWidth = mng_get_uint32 (pFrame+8); + iHeight = mng_get_uint32 (pFrame+12); + iXoffset = mng_get_int32 (pFrame+16); + iYoffset = mng_get_int32 (pFrame+20); + iTicks = mng_get_uint16 (pFrame+24); + + iDelay = iTicks; + if (!iDelay) + { + mng_uint8p pTemp = pFrame+26; + mng_int32 iTemp = iCnt+1; + + while ((iTemp < iMax) && (!iDelay)) + { + iDelay = mng_get_uint16 (pTemp+24); + pTemp += 26; + iTemp++; + } + } + + if (bNewframe) + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_fram), + mng_free_obj_general, mng_process_ani_fram, + &((mng_ptr)pFRAM)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pFRAM, sizeof (mng_ani_fram)); + + pFRAM->sHeader.fCleanup = mng_free_ani_fram; + pFRAM->sHeader.fProcess = mng_process_ani_fram; +#endif + + pFRAM->iFramemode = 4; + pFRAM->iChangedelay = 1; + pFRAM->iDelay = iDelay; + + mng_add_ani_object (pData, (mng_object_headerp)pFRAM); + } + +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_move), + mng_free_obj_general, + mng_process_ani_move, + &((mng_ptr)pMOVE)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pMOVE, sizeof (mng_ani_move)); + + pMOVE->sHeader.fCleanup = mng_free_ani_move; + pMOVE->sHeader.fProcess = mng_process_ani_move; +#endif + + pMOVE->iLocax = iXoffset - (mng_int32)iX; + pMOVE->iLocay = iYoffset - (mng_int32)iY; + + mng_add_ani_object (pData, (mng_object_headerp)pMOVE); + +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_clip), + mng_free_obj_general, + mng_process_ani_clip, + &((mng_ptr)pCLIP)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pCLIP, sizeof (mng_ani_clip)); + + pCLIP->sHeader.fCleanup = mng_free_ani_clip; + pCLIP->sHeader.fProcess = mng_process_ani_clip; +#endif + + pCLIP->iClipl = iXoffset; + pCLIP->iClipr = iXoffset + (mng_int32)iWidth; + pCLIP->iClipt = iYoffset; + pCLIP->iClipb = iYoffset + (mng_int32)iHeight; + + mng_add_ani_object (pData, (mng_object_headerp)pCLIP); + +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_show), + mng_free_obj_general, mng_process_ani_show, + &((mng_ptr)pSHOW)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pSHOW, sizeof (mng_ani_show)); + + pSHOW->sHeader.fCleanup = mng_free_ani_show; + pSHOW->sHeader.fProcess = mng_process_ani_show; +#endif + + mng_add_ani_object (pData, (mng_object_headerp)pSHOW); + + bNewframe = (mng_bool)iTicks; + pFrame += 26; + } + + if (pMPNG->iNumplays != 1) /* create a LOOP/ENDL pair ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_endl), + mng_free_obj_general, mng_process_ani_endl, + &((mng_ptr)pENDL)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pENDL, sizeof (mng_ani_endl)); + + pENDL->sHeader.fCleanup = mng_free_ani_endl; + pENDL->sHeader.fProcess = mng_process_ani_endl; +#endif + + pENDL->iLevel = 1; + + mng_add_ani_object (pData, (mng_object_headerp)pENDL); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_MPNG_OBJ, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_free_mpng_obj (mng_datap pData, + mng_objectp pObject) +{ + mng_mpng_objp pMPNG = (mng_mpng_objp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MPNG_OBJ, MNG_LC_START); +#endif + + if (pMPNG->iFramessize) + MNG_FREEX (pData, pMPNG->pFrames, pMPNG->iFramessize); + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + MNG_FREEX (pData, pMPNG, sizeof (mng_mpng_obj)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_MPNG_OBJ, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + return MNG_NOERROR; +#else + return mng_free_obj_general(pData, pObject); +#endif +} + +/* ************************************************************************** */ + +mng_retcode mng_process_mpng_obj (mng_datap pData, + mng_objectp pObject) +{ + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_MPNG_PROPOSAL */ + +/* ************************************************************************** */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ang_obj (mng_datap pData, + mng_uint32 iNumframes, + mng_uint32 iTickspersec, + mng_uint32 iNumplays, + mng_uint32 iTilewidth, + mng_uint32 iTileheight, + mng_uint8 iInterlace, + mng_uint8 iStillused) +#else +mng_retcode mng_create_ang_obj (mng_datap pData, + mng_ptr pEntry) +#endif +{ + mng_ang_objp pANG; + mng_ptr pTemp; + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANG_OBJ, MNG_LC_START); +#endif + +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ang_obj), mng_free_ang_obj, + mng_process_ang_obj, &pTemp); + if (iRetcode) + return iRetcode; + pANG = (mng_ang_objp)pTemp; +#else + MNG_ALLOC (pData, pANG, sizeof (mng_ang_obj)); + + pANG->sHeader.fCleanup = mng_free_ang_obj; + pANG->sHeader.fProcess = mng_process_ang_obj; +#endif + +#ifndef MNG_OPTIMIZE_CHUNKREADER + pANG->iNumframes = iNumframes; + pANG->iTickspersec = iTickspersec; + pANG->iNumplays = iNumplays; + pANG->iTilewidth = iTilewidth; + pANG->iTileheight = iTileheight; + pANG->iInterlace = iInterlace; + pANG->iStillused = iStillused; +#else + pANG->iNumframes = ((mng_ahdrp)pEntry)->iNumframes; + pANG->iTickspersec = ((mng_ahdrp)pEntry)->iTickspersec; + pANG->iNumplays = ((mng_ahdrp)pEntry)->iNumplays; + pANG->iTilewidth = ((mng_ahdrp)pEntry)->iTilewidth; + pANG->iTileheight = ((mng_ahdrp)pEntry)->iTileheight; + pANG->iInterlace = ((mng_ahdrp)pEntry)->iInterlace; + pANG->iStillused = ((mng_ahdrp)pEntry)->iStillused; +#endif + + pData->pANG = pANG; + pData->eImagetype = mng_it_ang; + + iRetcode = mng_process_display_ang (pData); + if (iRetcode) + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CREATE_ANG_OBJ, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_free_ang_obj (mng_datap pData, + mng_objectp pObject) +{ + mng_ang_objp pANG = (mng_ang_objp)pObject; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANG_OBJ, MNG_LC_START); +#endif + + if (pANG->iTilessize) + MNG_FREEX (pData, pANG->pTiles, pANG->iTilessize); + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + MNG_FREEX (pData, pANG, sizeof (mng_ang_obj)); +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FREE_ANG_OBJ, MNG_LC_END); +#endif + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + return MNG_NOERROR; +#else + return mng_free_obj_general(pData, pObject); +#endif +} + +/* ************************************************************************** */ + +mng_retcode mng_process_ang_obj (mng_datap pData, + mng_objectp pObject) +{ + mng_ang_objp pANG = (mng_ang_objp)pObject; + mng_uint8p pTile = (mng_uint8p)pANG->pTiles; + mng_retcode iRetcode; + mng_int32 iCnt, iMax; + mng_uint32 iTicks; + mng_int32 iXoffset, iYoffset; + mng_uint8 iSource; + mng_ani_loopp pLOOP; + mng_ani_endlp pENDL; + mng_ani_framp pFRAM; + mng_ani_movep pMOVE; + mng_ani_showp pSHOW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANG_OBJ, MNG_LC_START); +#endif + + /* let's create the MNG animation directives from this */ + + iMax = pANG->iNumframes; + /* set up MNG impersonation */ + pData->iTicks = pANG->iTickspersec; + pData->iLayercount = iMax; + + if (pANG->iNumplays != 1) /* create a LOOP/ENDL pair ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_loop), + mng_free_ani_loop, mng_process_ani_loop, + &((mng_ptr)pLOOP)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pLOOP, sizeof (mng_ani_loop)); + + pLOOP->sHeader.fCleanup = mng_free_ani_loop; + pLOOP->sHeader.fProcess = mng_process_ani_loop; +#endif + + pLOOP->iLevel = 1; + if (pANG->iNumplays) + pLOOP->iRepeatcount = pANG->iNumplays; + else + pLOOP->iRepeatcount = 0xFFFFFFFFl; + + mng_add_ani_object (pData, (mng_object_headerp)pLOOP); + } + + for (iCnt = 0; iCnt < iMax; iCnt++) + { + iTicks = mng_get_uint32 (pTile); + iXoffset = mng_get_int32 (pTile+4); + iYoffset = mng_get_int32 (pTile+8); + iSource = *(pTile+12); + +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_fram), + mng_free_obj_general, mng_process_ani_fram, + &((mng_ptr)pFRAM)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pFRAM, sizeof (mng_ani_fram)); + + pFRAM->sHeader.fCleanup = mng_free_ani_fram; + pFRAM->sHeader.fProcess = mng_process_ani_fram; +#endif + + pFRAM->iFramemode = 4; + pFRAM->iChangedelay = 1; + pFRAM->iDelay = iTicks; + + mng_add_ani_object (pData, (mng_object_headerp)pFRAM); + + if (!iSource) + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_move), + mng_free_obj_general, + mng_process_ani_move, + &((mng_ptr)pMOVE)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pMOVE, sizeof (mng_ani_move)); + + pMOVE->sHeader.fCleanup = mng_free_ani_move; + pMOVE->sHeader.fProcess = mng_process_ani_move; +#endif + + pMOVE->iFirstid = 1; + pMOVE->iLastid = 1; + pMOVE->iLocax = -iXoffset; + pMOVE->iLocay = -iYoffset; + + mng_add_ani_object (pData, (mng_object_headerp)pMOVE); + } + +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_show), + mng_free_obj_general, mng_process_ani_show, + &((mng_ptr)pSHOW)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pSHOW, sizeof (mng_ani_show)); + + pSHOW->sHeader.fCleanup = mng_free_ani_show; + pSHOW->sHeader.fProcess = mng_process_ani_show; +#endif + + if (iSource) + pSHOW->iFirstid = 0; + else + pSHOW->iFirstid = 1; + pSHOW->iLastid = pSHOW->iFirstid; + + mng_add_ani_object (pData, (mng_object_headerp)pSHOW); + + pTile += sizeof(mng_adat_tile); + } + + if (pANG->iNumplays != 1) /* create a LOOP/ENDL pair ? */ + { +#ifdef MNG_OPTIMIZE_OBJCLEANUP + iRetcode = create_obj_general (pData, sizeof (mng_ani_endl), + mng_free_obj_general, mng_process_ani_endl, + &((mng_ptr)pENDL)); + if (iRetcode) + return iRetcode; +#else + MNG_ALLOC (pData, pENDL, sizeof (mng_ani_endl)); + + pENDL->sHeader.fCleanup = mng_free_ani_endl; + pENDL->sHeader.fProcess = mng_process_ani_endl; +#endif + + pENDL->iLevel = 1; + + mng_add_ani_object (pData, (mng_object_headerp)pENDL); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_ANG_OBJ, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_ANG_PROPOSAL */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_DISPLAY_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_object_prc.h b/src/3rdparty/libmng/libmng_object_prc.h new file mode 100644 index 0000000000..ffd20c8718 --- /dev/null +++ b/src/3rdparty/libmng/libmng_object_prc.h @@ -0,0 +1,690 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_object_prc.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Object processing routines (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the internal object processing routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added support for global color-chunks in animation * */ +/* * - added support for global PLTE,tRNS,bKGD in animation * */ +/* * - added SAVE & SEEK animation objects * */ +/* * 0.5.2 - 05/29/2000 - G.Juyn * */ +/* * - changed ani_object create routines not to return the * */ +/* * created object (wasn't necessary) * */ +/* * - added compression/filter/interlace fields to * */ +/* * object-buffer for delta-image processing * */ +/* * * */ +/* * 0.5.3 - 06/22/2000 - G.Juyn * */ +/* * - added support for PPLT chunk * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added routine to discard "invalid" objects * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/13/2002 - G.Juyn * */ +/* * - fixed read/write of MAGN chunk * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 09/23/2002 - G.Juyn * */ +/* * - added in-memory color-correction of abstract images * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - fixed DISC support * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added conditionals around Delta-PNG code * */ +/* * - added SKIPCHUNK feature * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * * */ +/* * 1.0.7 - 03/24/2004 - G.R-P * */ +/* * - added more SKIPCHUNK conditionals * */ +/* * * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_OBJCLEANUP * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_object_prc_h_ +#define _libmng_object_prc_h_ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_DISPLAY_PROCS + +/* ************************************************************************** */ + +mng_retcode mng_drop_invalid_objects (mng_datap pData); + +/* ************************************************************************** */ + +mng_retcode mng_create_imagedataobject (mng_datap pData, + mng_bool bConcrete, + mng_bool bViewable, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_imagedatap *ppObject); + +mng_retcode mng_free_imagedataobject (mng_datap pData, + mng_imagedatap pImagedata); + +mng_retcode mng_clone_imagedataobject (mng_datap pData, + mng_bool bConcrete, + mng_imagedatap pSource, + mng_imagedatap *ppClone); + +/* ************************************************************************** */ + +mng_retcode mng_create_imageobject (mng_datap pData, + mng_uint16 iId, + mng_bool bConcrete, + mng_bool bVisible, + mng_bool bViewable, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_int32 iPosx, + mng_int32 iPosy, + mng_bool bClipped, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb, + mng_imagep *ppObject); + +mng_retcode mng_free_imageobject (mng_datap pData, + mng_imagep pImage); + +mng_imagep mng_find_imageobject (mng_datap pData, + mng_uint16 iId); + +mng_retcode mng_clone_imageobject (mng_datap pData, + mng_uint16 iId, + mng_bool bPartial, + mng_bool bVisible, + mng_bool bAbstract, + mng_bool bHasloca, + mng_uint8 iLocationtype, + mng_int32 iLocationx, + mng_int32 iLocationy, + mng_imagep pSource, + mng_imagep *ppClone); + +mng_retcode mng_renum_imageobject (mng_datap pData, + mng_imagep pSource, + mng_uint16 iId, + mng_bool bVisible, + mng_bool bAbstract, + mng_bool bHasloca, + mng_uint8 iLocationtype, + mng_int32 iLocationx, + mng_int32 iLocationy); + +mng_retcode mng_reset_object_details (mng_datap pData, + mng_imagep pImage, + mng_uint32 iWidth, + mng_uint32 iHeight, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iCompression, + mng_uint8 iFilter, + mng_uint8 iInterlace, + mng_bool bResetall); + +mng_retcode mng_promote_imageobject (mng_datap pData, + mng_imagep pImage, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iFilltype); + +mng_retcode mng_magnify_imageobject (mng_datap pData, + mng_imagep pImage); + +mng_retcode mng_colorcorrect_object (mng_datap pData, + mng_imagep pImage); + +/* ************************************************************************** */ + +mng_retcode mng_create_ani_image (mng_datap pData); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + +mng_retcode mng_create_ani_plte (mng_datap pData, + mng_uint32 iEntrycount, + mng_palette8ep paEntries); + +mng_retcode mng_create_ani_trns (mng_datap pData, + mng_uint32 iRawlen, + mng_uint8p pRawdata); + +mng_retcode mng_create_ani_gama (mng_datap pData, + mng_bool bEmpty, + mng_uint32 iGamma); + +mng_retcode mng_create_ani_chrm (mng_datap pData, + mng_bool bEmpty, + mng_uint32 iWhitepointx, + mng_uint32 iWhitepointy, + mng_uint32 iRedx, + mng_uint32 iRedy, + mng_uint32 iGreenx, + mng_uint32 iGreeny, + mng_uint32 iBluex, + mng_uint32 iBluey); + +mng_retcode mng_create_ani_srgb (mng_datap pData, + mng_bool bEmpty, + mng_uint8 iRenderinginent); + +mng_retcode mng_create_ani_iccp (mng_datap pData, + mng_bool bEmpty, + mng_uint32 iProfilesize, + mng_ptr pProfile); + +mng_retcode mng_create_ani_bkgd (mng_datap pData, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue); + +mng_retcode mng_create_ani_loop (mng_datap pData, + mng_uint8 iLevel, + mng_uint32 iRepeatcount, + mng_uint8 iTermcond, + mng_uint32 iItermin, + mng_uint32 iItermax, + mng_uint32 iCount, + mng_uint32p pSignals); + +mng_retcode mng_create_ani_endl (mng_datap pData, + mng_uint8 iLevel); + +mng_retcode mng_create_ani_defi (mng_datap pData); + +mng_retcode mng_create_ani_basi (mng_datap pData, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_bool bHasalpha, + mng_uint16 iAlpha, + mng_uint8 iViewable); + +mng_retcode mng_create_ani_clon (mng_datap pData, + mng_uint16 iSourceid, + mng_uint16 iCloneid, + mng_uint8 iClonetype, + mng_bool bHasdonotshow, + mng_uint8 iDonotshow, + mng_uint8 iConcrete, + mng_bool bHasloca, + mng_uint8 iLocatype, + mng_int32 iLocax, + mng_int32 iLocay); + +mng_retcode mng_create_ani_back (mng_datap pData, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue, + mng_uint8 iMandatory, + mng_uint16 iImageid, + mng_uint8 iTile); + +mng_retcode mng_create_ani_fram (mng_datap pData, + mng_uint8 iFramemode, + mng_uint8 iChangedelay, + mng_uint32 iDelay, + mng_uint8 iChangetimeout, + mng_uint32 iTimeout, + mng_uint8 iChangeclipping, + mng_uint8 iCliptype, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb); + +mng_retcode mng_create_ani_move (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iType, + mng_int32 iLocax, + mng_int32 iLocay); + +mng_retcode mng_create_ani_clip (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iType, + mng_int32 iClipl, + mng_int32 iClipr, + mng_int32 iClipt, + mng_int32 iClipb); + +mng_retcode mng_create_ani_show (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMode); + +mng_retcode mng_create_ani_term (mng_datap pData, + mng_uint8 iTermaction, + mng_uint8 iIteraction, + mng_uint32 iDelay, + mng_uint32 iItermax); + +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_create_ani_save (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode mng_create_ani_seek (mng_datap pData, + mng_uint32 iSegmentnamesize, + mng_pchar zSegmentname); +#endif +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_create_ani_dhdr (mng_datap pData, + mng_uint16 iObjectid, + mng_uint8 iImagetype, + mng_uint8 iDeltatype, + mng_uint32 iBlockwidth, + mng_uint32 iBlockheight, + mng_uint32 iBlockx, + mng_uint32 iBlocky); + +mng_retcode mng_create_ani_prom (mng_datap pData, + mng_uint8 iBitdepth, + mng_uint8 iColortype, + mng_uint8 iFilltype); + +mng_retcode mng_create_ani_ipng (mng_datap pData); +mng_retcode mng_create_ani_ijng (mng_datap pData); + +mng_retcode mng_create_ani_pplt (mng_datap pData, + mng_uint8 iType, + mng_uint32 iCount, + mng_palette8ep paIndexentries, + mng_uint8p paAlphaentries, + mng_uint8p paUsedentries); +#endif + +#ifndef MNG_SKIPCHUNK_MAGN +mng_retcode mng_create_ani_magn (mng_datap pData, + mng_uint16 iFirstid, + mng_uint16 iLastid, + mng_uint8 iMethodX, + mng_uint16 iMX, + mng_uint16 iMY, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint16 iMT, + mng_uint16 iMB, + mng_uint8 iMethodY); +#endif + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_create_ani_past (mng_datap pData, + mng_uint16 iTargetid, + mng_uint8 iTargettype, + mng_int32 iTargetx, + mng_int32 iTargety, + mng_uint32 iCount, + mng_ptr pSources); +#endif + +#ifndef MNG_SKIPCHUNK_DISC +mng_retcode mng_create_ani_disc (mng_datap pData, + mng_uint32 iCount, + mng_uint16p pIds); +#endif + +#else /* MNG_OPTIMIZE_CHUNKREADER */ + +mng_retcode mng_create_ani_plte (mng_datap pData); +mng_retcode mng_create_ani_trns (mng_datap pData); +mng_retcode mng_create_ani_gama (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_chrm (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_srgb (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_iccp (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_bkgd (mng_datap pData); +mng_retcode mng_create_ani_loop (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_endl (mng_datap pData, + mng_uint8 iLevel); +mng_retcode mng_create_ani_defi (mng_datap pData); +mng_retcode mng_create_ani_basi (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_clon (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_back (mng_datap pData); +mng_retcode mng_create_ani_fram (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_move (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_clip (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_show (mng_datap pData); +mng_retcode mng_create_ani_term (mng_datap pData, + mng_chunkp pChunk); +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_create_ani_save (mng_datap pData); +#endif +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode mng_create_ani_seek (mng_datap pData, + mng_chunkp pChunk); +#endif +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_create_ani_dhdr (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_prom (mng_datap pData, + mng_chunkp pChunk); +mng_retcode mng_create_ani_ipng (mng_datap pData); +mng_retcode mng_create_ani_ijng (mng_datap pData); + +mng_retcode mng_create_ani_pplt (mng_datap pData, + mng_uint8 iType, + mng_uint32 iCount, + mng_palette8ep paIndexentries, + mng_uint8p paAlphaentries, + mng_uint8p paUsedentries); +#endif + +#ifndef MNG_SKIPCHUNK_MAGN +mng_retcode mng_create_ani_magn (mng_datap pData, + mng_chunkp pChunk); +#endif +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_create_ani_past (mng_datap pData, + mng_chunkp pChunk); +#endif +#ifndef MNG_SKIPCHUNK_DISC +mng_retcode mng_create_ani_disc (mng_datap pData, + mng_chunkp pChunk); +#endif + +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + +/* ************************************************************************** */ + +mng_retcode mng_free_ani_image (mng_datap pData, + mng_objectp pObject); + +#ifndef MNG_OPTIMIZE_OBJCLEANUP + +mng_retcode mng_free_ani_plte (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_trns (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_gama (mng_datap pData, + mng_objectp pObject); +#ifndef MNG_SKIPCHUNK_cHRM +mng_retcode mng_free_ani_chrm (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_sRGB +mng_retcode mng_free_ani_srgb (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_bKGD +mng_retcode mng_free_ani_bkgd (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_LOOP +mng_retcode mng_free_ani_endl (mng_datap pData, + mng_objectp pObject); +#endif +mng_retcode mng_free_ani_defi (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_basi (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_clon (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_back (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_fram (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_move (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_clip (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_show (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_term (mng_datap pData, + mng_objectp pObject); +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_free_ani_save (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_free_ani_dhdr (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_prom (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_ipng (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_ijng (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_free_ani_pplt (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_MAGN +mng_retcode mng_free_ani_magn (mng_datap pData, + mng_objectp pObject); +#endif + +#endif /* MNG_OPTIMIZE_OBJCLEANUP */ + + +#ifndef MNG_SKIPCHUNK_iCCP +mng_retcode mng_free_ani_iccp (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_LOOP +mng_retcode mng_free_ani_loop (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_free_ani_seek (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_free_ani_past (mng_datap pData, + mng_objectp pObject); +#endif +mng_retcode mng_free_ani_disc (mng_datap pData, + mng_objectp pObject); + +/* ************************************************************************** */ + +mng_retcode mng_process_ani_image (mng_datap pData, + mng_objectp pObject); + +mng_retcode mng_process_ani_plte (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_trns (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_gama (mng_datap pData, + mng_objectp pObject); +#ifndef MNG_SKIPCHUNK_cHRM +mng_retcode mng_process_ani_chrm (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_sRGB +mng_retcode mng_process_ani_srgb (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_iCCP +mng_retcode mng_process_ani_iccp (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_bKGD +mng_retcode mng_process_ani_bkgd (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_LOOP +mng_retcode mng_process_ani_loop (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_endl (mng_datap pData, + mng_objectp pObject); +#endif +mng_retcode mng_process_ani_defi (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_basi (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_clon (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_back (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_fram (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_move (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_clip (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_show (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_term (mng_datap pData, + mng_objectp pObject); +#ifndef MNG_SKIPCHUNK_SAVE +mng_retcode mng_process_ani_save (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_SKIPCHUNK_SEEK +mng_retcode mng_process_ani_seek (mng_datap pData, + mng_objectp pObject); +#endif +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_process_ani_dhdr (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_prom (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_ipng (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_ijng (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ani_pplt (mng_datap pData, + mng_objectp pObject); +#endif +mng_retcode mng_process_ani_magn (mng_datap pData, + mng_objectp pObject); +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_process_ani_past (mng_datap pData, + mng_objectp pObject); +#endif +mng_retcode mng_process_ani_disc (mng_datap pData, + mng_objectp pObject); + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DYNAMICMNG +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_event (mng_datap pData, + mng_uint8 iEventtype, + mng_uint8 iMasktype, + mng_int32 iLeft, + mng_int32 iRight, + mng_int32 iTop, + mng_int32 iBottom, + mng_uint16 iObjectid, + mng_uint8 iIndex, + mng_uint32 iSegmentnamesize, + mng_pchar zSegmentname); +#else +mng_retcode mng_create_event (mng_datap pData, + mng_ptr pEntry); +#endif +mng_retcode mng_free_event (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_event (mng_datap pData, + mng_objectp pObject); +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_mpng_obj (mng_datap pData, + mng_uint32 iFramewidth, + mng_uint32 iFrameheight, + mng_uint16 iNumplays, + mng_uint16 iTickspersec, + mng_uint32 iFramessize, + mng_ptr pFrames); +#else +mng_retcode mng_create_mpng_obj (mng_datap pData, + mng_ptr pEntry); +#endif +mng_retcode mng_free_mpng_obj (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_mpng_obj (mng_datap pData, + mng_objectp pObject); +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +#ifndef MNG_OPTIMIZE_CHUNKREADER +mng_retcode mng_create_ang_obj (mng_datap pData, + mng_uint32 iNumframes, + mng_uint32 iTickspersec, + mng_uint32 iNumplays, + mng_uint32 iTilewidth, + mng_uint32 iTileheight, + mng_uint8 iInterlace, + mng_uint8 iStillused); +#else +mng_retcode mng_create_ang_obj (mng_datap pData, + mng_ptr pEntry); +#endif +mng_retcode mng_free_ang_obj (mng_datap pData, + mng_objectp pObject); +mng_retcode mng_process_ang_obj (mng_datap pData, + mng_objectp pObject); +#endif + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_DISPLAY_PROCS */ + +/* ************************************************************************** */ + +#endif /* _libmng_object_prc_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_objects.h b/src/3rdparty/libmng/libmng_objects.h new file mode 100644 index 0000000000..053e6b4b2e --- /dev/null +++ b/src/3rdparty/libmng/libmng_objects.h @@ -0,0 +1,635 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_objects.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Internal object structures (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the internal object structures * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.5.2 - 05/23/2000 - G.Juyn * */ +/* * - changed inclusion to DISPLAY_PROCS * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added global color-chunks for animations * */ +/* * - added global PLTE,tRNS,bKGD chunks for animation * */ +/* * - added SAVE & SEEK animation objects * */ +/* * 0.5.2 - 05/29/2000 - G.Juyn * */ +/* * - added framenr/layernr/playtime to object header * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added ani-objects for delta-image processing * */ +/* * - added compression/filter/interlace fields to * */ +/* * object-buffer for delta-image processing * */ +/* * * */ +/* * 0.5.3 - 06/17/2000 - G.Juyn * */ +/* * - changed definition of aTRNSentries * */ +/* * 0.5.3 - 06/22/2000 - G.Juyn * */ +/* * - added definition for PPLT animation-processing * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/10/2000 - G.Juyn * */ +/* * - fixed DEFI behavior * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added support for delta-JNG * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added valid-flag to stored objects for read() / display()* */ +/* * 0.9.3 - 10/19/2000 - G.Juyn * */ +/* * - added storage for pixel-/alpha-sampledepth for delta's * */ +/* * * */ +/* * 1.0.5 - 09/13/2002 - G.Juyn * */ +/* * - fixed read/write of MAGN chunk * */ +/* * 1.0.5 - 09/15/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 09/23/2002 - G.Juyn * */ +/* * - added in-memory color-correction of abstract images * */ +/* * 1.0.5 - 10/07/2002 - G.Juyn * */ +/* * - fixed DISC support * */ +/* * * */ +/* * 1.0.6 - 10/07/2003 - G.R-P * */ +/* * - added SKIPCHUNK conditionals * */ +/* * * */ +/* * 1.0.7 - 03/24/2004 - G.R-P * */ +/* * - added more SKIPCHUNK conditionals * */ +/* * * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_OBJCLEANUP * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_objects_h_ +#define _libmng_objects_h_ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_DISPLAY_PROCS + +/* ************************************************************************** */ + +typedef mng_retcode (*mng_cleanupobject) (mng_datap pData, + mng_objectp pHeader); + +typedef mng_retcode (*mng_processobject) (mng_datap pData, + mng_objectp pHeader); + +/* ************************************************************************** */ + +typedef struct { + mng_cleanupobject fCleanup; + mng_processobject fProcess; + mng_objectp pNext; /* for double-linked list */ + mng_objectp pPrev; + mng_uint32 iFramenr; + mng_uint32 iLayernr; + mng_uint32 iPlaytime; +#ifdef MNG_OPTIMIZE_OBJCLEANUP + mng_size_t iObjsize; +#endif + } mng_object_header; +typedef mng_object_header * mng_object_headerp; + +/* ************************************************************************** */ + +typedef struct { /* MNG specification "object-buffer" */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint32 iRefcount; /* reference counter */ + mng_bool bFrozen; /* frozen flag */ + mng_bool bConcrete; /* concrete flag */ + mng_bool bViewable; /* viewable flag */ + mng_uint32 iWidth; /* image specifics */ + mng_uint32 iHeight; + mng_uint8 iBitdepth; + mng_uint8 iColortype; + mng_uint8 iCompression; + mng_uint8 iFilter; + mng_uint8 iInterlace; + + mng_bool bCorrected; /* indicates if an abstract image + has already been color-corrected */ + + mng_uint8 iAlphabitdepth; /* used only for JNG images */ + mng_uint8 iJHDRcompression; + mng_uint8 iJHDRinterlace; + + mng_uint8 iPixelsampledepth; /* used with delta-images */ + mng_uint8 iAlphasampledepth; + + mng_bool bHasPLTE; /* PLTE chunk present */ + mng_bool bHasTRNS; /* tRNS chunk present */ + mng_bool bHasGAMA; /* gAMA chunk present */ + mng_bool bHasCHRM; /* cHRM chunk present */ + mng_bool bHasSRGB; /* sRGB chunk present */ + mng_bool bHasICCP; /* iCCP chunk present */ + mng_bool bHasBKGD; /* bKGD chunk present */ + + mng_uint32 iPLTEcount; /* PLTE fields */ + mng_rgbpaltab aPLTEentries; + + mng_uint16 iTRNSgray; /* tRNS fields */ + mng_uint16 iTRNSred; + mng_uint16 iTRNSgreen; + mng_uint16 iTRNSblue; + mng_uint32 iTRNScount; + mng_uint8arr aTRNSentries; + + mng_uint32 iGamma; /* gAMA fields */ + + mng_uint32 iWhitepointx; /* cHRM fields */ + mng_uint32 iWhitepointy; + mng_uint32 iPrimaryredx; + mng_uint32 iPrimaryredy; + mng_uint32 iPrimarygreenx; + mng_uint32 iPrimarygreeny; + mng_uint32 iPrimarybluex; + mng_uint32 iPrimarybluey; + + mng_uint8 iRenderingintent; /* sRGB fields */ + + mng_uint32 iProfilesize; /* iCCP fields */ + mng_ptr pProfile; + + mng_uint8 iBKGDindex; /* bKGD fields */ + mng_uint16 iBKGDgray; + mng_uint16 iBKGDred; + mng_uint16 iBKGDgreen; + mng_uint16 iBKGDblue; + + mng_uint32 iSamplesize; /* size of a sample */ + mng_uint32 iRowsize; /* size of a row of samples */ + mng_uint32 iImgdatasize; /* size of the sample data buffer */ + mng_uint8p pImgdata; /* actual sample data buffer */ + + } mng_imagedata; +typedef mng_imagedata * mng_imagedatap; + +/* ************************************************************************** */ + +typedef struct { /* MNG specification "object" */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iId; /* object-id */ + mng_bool bFrozen; /* frozen flag */ + mng_bool bVisible; /* potential visibility flag */ + mng_bool bViewable; /* viewable flag */ + mng_bool bValid; /* marks invalid when only reading */ + mng_int32 iPosx; /* location fields */ + mng_int32 iPosy; + mng_bool bClipped; /* clipping fields */ + mng_int32 iClipl; + mng_int32 iClipr; + mng_int32 iClipt; + mng_int32 iClipb; +#ifndef MNG_SKIPCHUNK_MAGN + mng_uint8 iMAGN_MethodX; /* magnification (MAGN) */ + mng_uint8 iMAGN_MethodY; + mng_uint16 iMAGN_MX; + mng_uint16 iMAGN_MY; + mng_uint16 iMAGN_ML; + mng_uint16 iMAGN_MR; + mng_uint16 iMAGN_MT; + mng_uint16 iMAGN_MB; +#endif +#ifndef MNG_SKIPCHUNK_PAST + mng_int32 iPastx; /* target x/y from previous PAST */ + mng_int32 iPasty; +#endif + mng_imagedatap pImgbuf; /* the image-data buffer */ + } mng_image; +typedef mng_image * mng_imagep; + +/* ************************************************************************** */ + + /* "on-the-fly" image (= object 0) */ +typedef mng_image mng_ani_image; /* let's (ab)use the general "object" */ +typedef mng_ani_image * mng_ani_imagep; /* that's actualy crucial, so don't change it! */ + +/* ************************************************************************** */ + +typedef struct { /* global PLTE object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint32 iEntrycount; + mng_rgbpaltab aEntries; + } mng_ani_plte; +typedef mng_ani_plte * mng_ani_pltep; + +/* ************************************************************************** */ + +typedef struct { /* global tRNS object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint32 iRawlen; + mng_uint8arr aRawdata; + } mng_ani_trns; +typedef mng_ani_trns * mng_ani_trnsp; + +/* ************************************************************************** */ + +typedef struct { /* global gAMA object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_bool bEmpty; + mng_uint32 iGamma; + } mng_ani_gama; +typedef mng_ani_gama * mng_ani_gamap; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_cHRM +typedef struct { /* global cHRM object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_bool bEmpty; + mng_uint32 iWhitepointx; + mng_uint32 iWhitepointy; + mng_uint32 iRedx; + mng_uint32 iRedy; + mng_uint32 iGreenx; + mng_uint32 iGreeny; + mng_uint32 iBluex; + mng_uint32 iBluey; + } mng_ani_chrm; +typedef mng_ani_chrm * mng_ani_chrmp; +#endif + +/* ************************************************************************** */ + +typedef struct { /* global sRGB object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_bool bEmpty; + mng_uint8 iRenderingintent; + } mng_ani_srgb; +typedef mng_ani_srgb * mng_ani_srgbp; + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_iCCP +typedef struct { /* global iCCP object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_bool bEmpty; + mng_uint32 iProfilesize; + mng_ptr pProfile; + } mng_ani_iccp; +typedef mng_ani_iccp * mng_ani_iccpp; +#endif + +/* ************************************************************************** */ + +typedef struct { /* global bKGD object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iRed; + mng_uint16 iGreen; + mng_uint16 iBlue; + } mng_ani_bkgd; +typedef mng_ani_bkgd * mng_ani_bkgdp; + +/* ************************************************************************** */ + +typedef struct { /* LOOP object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint8 iLevel; + mng_uint32 iRepeatcount; + mng_uint8 iTermcond; + mng_uint32 iItermin; + mng_uint32 iItermax; + mng_uint32 iCount; + mng_uint32p pSignals; + + mng_uint32 iRunningcount; /* running counter */ + } mng_ani_loop; +typedef mng_ani_loop * mng_ani_loopp; + +/* ************************************************************************** */ + +typedef struct { /* ENDL object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint8 iLevel; + + mng_ani_loopp pLOOP; /* matching LOOP */ + } mng_ani_endl; +typedef mng_ani_endl * mng_ani_endlp; + +/* ************************************************************************** */ + +typedef struct { /* DEFI object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iId; + mng_bool bHasdonotshow; + mng_uint8 iDonotshow; + mng_bool bHasconcrete; + mng_uint8 iConcrete; + mng_bool bHasloca; + mng_int32 iLocax; + mng_int32 iLocay; + mng_bool bHasclip; + mng_int32 iClipl; + mng_int32 iClipr; + mng_int32 iClipt; + mng_int32 iClipb; + } mng_ani_defi; +typedef mng_ani_defi * mng_ani_defip; + +/* ************************************************************************** */ + +typedef struct { /* BASI object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iRed; + mng_uint16 iGreen; + mng_uint16 iBlue; + mng_bool bHasalpha; + mng_uint16 iAlpha; + mng_uint8 iViewable; + } mng_ani_basi; +typedef mng_ani_basi * mng_ani_basip; + +/* ************************************************************************** */ + +typedef struct { /* CLON object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iCloneid; + mng_uint16 iSourceid; + mng_uint8 iClonetype; + mng_bool bHasdonotshow; + mng_uint8 iDonotshow; + mng_uint8 iConcrete; + mng_bool bHasloca; + mng_uint8 iLocatype; + mng_int32 iLocax; + mng_int32 iLocay; + } mng_ani_clon; +typedef mng_ani_clon * mng_ani_clonp; + +/* ************************************************************************** */ + +typedef struct { /* BACK object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iRed; + mng_uint16 iGreen; + mng_uint16 iBlue; + mng_uint8 iMandatory; + mng_uint16 iImageid; + mng_uint8 iTile; + } mng_ani_back; +typedef mng_ani_back * mng_ani_backp; + +/* ************************************************************************** */ + +typedef struct { /* FRAM object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint8 iFramemode; + mng_uint8 iChangedelay; + mng_uint32 iDelay; + mng_uint8 iChangetimeout; + mng_uint32 iTimeout; + mng_uint8 iChangeclipping; + mng_uint8 iCliptype; + mng_int32 iClipl; + mng_int32 iClipr; + mng_int32 iClipt; + mng_int32 iClipb; + } mng_ani_fram; +typedef mng_ani_fram * mng_ani_framp; + +/* ************************************************************************** */ + +typedef struct { /* MOVE object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iFirstid; + mng_uint16 iLastid; + mng_uint8 iType; + mng_int32 iLocax; + mng_int32 iLocay; + } mng_ani_move; +typedef mng_ani_move * mng_ani_movep; + +/* ************************************************************************** */ + +typedef struct { /* CLIP object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iFirstid; + mng_uint16 iLastid; + mng_uint8 iType; + mng_int32 iClipl; + mng_int32 iClipr; + mng_int32 iClipt; + mng_int32 iClipb; + } mng_ani_clip; +typedef mng_ani_clip * mng_ani_clipp; + +/* ************************************************************************** */ + +typedef struct { /* SHOW object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iFirstid; + mng_uint16 iLastid; + mng_uint8 iMode; + } mng_ani_show; +typedef mng_ani_show * mng_ani_showp; + +/* ************************************************************************** */ + +typedef struct { /* TERM object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint8 iTermaction; + mng_uint8 iIteraction; + mng_uint32 iDelay; + mng_uint32 iItermax; + } mng_ani_term; +typedef mng_ani_term * mng_ani_termp; + +/* ************************************************************************** */ + +typedef struct { /* SAVE object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + } mng_ani_save; +typedef mng_ani_save * mng_ani_savep; + +/* ************************************************************************** */ + +typedef struct { /* SEEK object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint32 iSegmentnamesize; + mng_pchar zSegmentname; + } mng_ani_seek; +typedef mng_ani_seek * mng_ani_seekp; + +/* ************************************************************************** */ +#ifndef MNG_NO_DELTA_PNG +typedef struct { /* DHDR object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iObjectid; + mng_uint8 iImagetype; + mng_uint8 iDeltatype; + mng_uint32 iBlockwidth; + mng_uint32 iBlockheight; + mng_uint32 iBlockx; + mng_uint32 iBlocky; + } mng_ani_dhdr; +typedef mng_ani_dhdr * mng_ani_dhdrp; + +/* ************************************************************************** */ + +typedef struct { /* PROM object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint8 iBitdepth; + mng_uint8 iColortype; + mng_uint8 iFilltype; + } mng_ani_prom; +typedef mng_ani_prom * mng_ani_promp; + +/* ************************************************************************** */ + +typedef struct { /* IPNG object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + } mng_ani_ipng; +typedef mng_ani_ipng * mng_ani_ipngp; + +/* ************************************************************************** */ + +typedef struct { /* IJNG object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + } mng_ani_ijng; +typedef mng_ani_ijng * mng_ani_ijngp; + +/* ************************************************************************** */ + +typedef struct { /* PPLT object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint8 iType; + mng_uint32 iCount; + mng_rgbpaltab aIndexentries; + mng_uint8arr aAlphaentries; + mng_uint8arr aUsedentries; + } mng_ani_pplt; +typedef mng_ani_pplt * mng_ani_ppltp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +typedef struct { /* MAGN object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iFirstid; + mng_uint16 iLastid; + mng_uint8 iMethodX; + mng_uint16 iMX; + mng_uint16 iMY; + mng_uint16 iML; + mng_uint16 iMR; + mng_uint16 iMT; + mng_uint16 iMB; + mng_uint8 iMethodY; + } mng_ani_magn; +typedef mng_ani_magn * mng_ani_magnp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +typedef struct { /* PAST object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint16 iTargetid; + mng_uint8 iTargettype; + mng_int32 iTargetx; + mng_int32 iTargety; + mng_uint32 iCount; + mng_ptr pSources; + } mng_ani_past; +typedef mng_ani_past * mng_ani_pastp; +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_DISC +typedef struct { /* DISC object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint32 iCount; + mng_uint16p pIds; + } mng_ani_disc; +typedef mng_ani_disc * mng_ani_discp; +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DYNAMICMNG +typedef struct { /* event object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint8 iEventtype; + mng_uint8 iMasktype; + mng_int32 iLeft; + mng_int32 iRight; + mng_int32 iTop; + mng_int32 iBottom; + mng_uint16 iObjectid; + mng_uint8 iIndex; + mng_uint32 iSegmentnamesize; + mng_pchar zSegmentname; + + mng_ani_seekp pSEEK; /* SEEK ani object */ + mng_int32 iLastx; /* last X/Y coordinates */ + mng_int32 iLasty; + } mng_event; +typedef mng_event * mng_eventp; +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_MPNG_PROPOSAL +typedef struct { /* mPNG object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint32 iFramewidth; + mng_uint32 iFrameheight; + mng_uint32 iNumplays; + mng_uint16 iTickspersec; + mng_uint32 iFramessize; + mng_ptr pFrames; + } mng_mpng_obj; +typedef mng_mpng_obj * mng_mpng_objp; +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ANG_PROPOSAL +typedef struct { /* ANG object */ + mng_object_header sHeader; /* default header (DO NOT REMOVE) */ + mng_uint32 iNumframes; + mng_uint32 iTickspersec; + mng_uint32 iNumplays; + mng_uint32 iTilewidth; + mng_uint32 iTileheight; + mng_uint8 iInterlace; + mng_uint8 iStillused; + mng_uint32 iTilessize; + mng_ptr pTiles; + } mng_ang_obj; +typedef mng_ang_obj * mng_ang_objp; +#endif + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_DISPLAY_PROCS */ + +/* ************************************************************************** */ + +#endif /* _libmng_objects_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_pixels.c b/src/3rdparty/libmng/libmng_pixels.c new file mode 100644 index 0000000000..ce5637be95 --- /dev/null +++ b/src/3rdparty/libmng/libmng_pixels.c @@ -0,0 +1,24610 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_pixels.c copyright (c) 2000-2005 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Pixel-row management routines (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the pixel-row management routines * */ +/* * * */ +/* * the dual alpha-composing for RGBA/BGRA/etc output-canvas' * */ +/* * is based on the Note on Compositing chapter of the * */ +/* * DOH-3 draft, noted to me by Adam M. Costello * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added callback error-reporting support * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.5.2 - 05/22/2000 - G.Juyn * */ +/* * - added JNG support * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - fixed minor bugs 16-bit pixel-handling * */ +/* * - added delta-image row-processing routines * */ +/* * 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - fixed endian support (hopefully) * */ +/* * 0.5.2 - 06/03/2000 - G.Juyn * */ +/* * - fixed makeup for Linux gcc compile * */ +/* * 0.5.2 - 06/05/2000 - G.Juyn * */ +/* * - implemented app bkgd restore routines * */ +/* * - implemented RGBA8, ARGB8, BGRA8 & ABGR8 display routines * */ +/* * - added support for RGB8_A8 canvasstyle * */ +/* * 0.5.2 - 06/09/2000 - G.Juyn * */ +/* * - fixed alpha-handling for alpha canvasstyles * */ +/* * * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - changed progressive-display processing * */ +/* * 0.5.3 - 06/17/2000 - G.Juyn * */ +/* * - changed to support delta-images * */ +/* * - optimized some store_xxx routines * */ +/* * 0.5.3 - 06/20/2000 - G.Juyn * */ +/* * - fixed nasty bug with embedded PNG after delta-image * */ +/* * 0.5.3 - 06/24/2000 - G.Juyn * */ +/* * - fixed problem with 16-bit GA format * */ +/* * 0.5.3 - 06/25/2000 - G.Juyn * */ +/* * - fixed problem with cheap transparency for 4-bit gray * */ +/* * - fixed display_xxxx routines for interlaced images * */ +/* * 0.5.3 - 06/28/2000 - G.Juyn * */ +/* * - fixed compiler-warning for non-initialized iB variable * */ +/* * * */ +/* * 0.9.1 - 07/05/2000 - G.Juyn * */ +/* * - fixed mandatory BACK color to be opaque * */ +/* * * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - B110547 - fixed bug in interlace code * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/20/2000 - G.Juyn * */ +/* * - fixed app-supplied background restore * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * 0.9.3 - 09/30/2000 - G.Juyn * */ +/* * - fixed MAGN rounding errors (thanks Matthias!) * */ +/* * 0.9.3 - 10/10/2000 - G.Juyn * */ +/* * - fixed alpha-blending for RGBA canvasstyle * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - fixed alpha-blending for other alpha-canvasstyles * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added optional support for bKGD for PNG images * */ +/* * - added support for JDAA * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - fixed support for bKGD * */ +/* * 0.9.3 - 10/19/2000 - G.Juyn * */ +/* * - implemented delayed delta-processing * */ +/* * 0.9.3 - 10/28/2000 - G.Juyn * */ +/* * - fixed tRNS processing for gray-image < 8-bits * */ +/* * * */ +/* * 0.9.4 - 12/16/2000 - G.Juyn * */ +/* * - fixed mixup of data- & function-pointers (thanks Dimitri)* */ +/* * 0.9.4 - 1/18/2001 - G.Juyn * */ +/* * - removed "old" MAGN methods 3 & 4 * */ +/* * - added "new" MAGN methods 3, 4 & 5 * */ +/* * - removed test filter-methods 1 & 65 * */ +/* * * */ +/* * 1.0.1 - 04/21/2001 - G.Juyn (code by G.Kelly) * */ +/* * - added BGRA8 canvas with premultiplied alpha * */ +/* * 1.0.1 - 04/25/2001 - G.Juyn * */ +/* * - moved mng_clear_cms to libmng_cms * */ +/* * * */ +/* * 1.0.2 - 06/25/2001 - G.Juyn * */ +/* * - added option to turn off progressive refresh * */ +/* * * */ +/* * 1.0.4 - 11/04/2001 - G.Juyn * */ +/* * - fixed possible compile-problem in cleanup_rowproc * */ +/* * 1.0.4 - 06/22/2002 - G.Juyn * */ +/* * - B558212 - off by one error * */ +/* * - MNG subimage alpha composite wrong for rgba8 images * */ +/* * * */ +/* * 1.0.5 - 08/07/2002 - G.Juyn * */ +/* * - added test-option for PNG filter method 193 (=no filter) * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * - completed delta-image support * */ +/* * 1.0.5 - 08/16/2002 - G.Juyn * */ +/* * - completed MAGN support (16-bit functions) * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/19/2002 - G.Juyn * */ +/* * - optimized restore-background for bKGD cases * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - finished support for BACK image & tiling * */ +/* * 1.0.5 - 09/22/2002 - G.Juyn * */ +/* * - added bgrx8 canvas (filler byte) * */ +/* * 1.0.5 - 09/23/2002 - G.Juyn * */ +/* * - added compose over/under routines for PAST processing * */ +/* * - added flip & tile routines for PAST processing * */ +/* * * */ +/* * 1.0.6 - 03/09/2003 - G.Juyn * */ +/* * - hiding 12-bit JPEG stuff * */ +/* * 1.0.6 - 05/11/2003 - Glenn RP * */ +/* * - added size-optimization COMPOSE routine usage * */ +/* * 1.0.6 - 05/11/2003 - G. Juyn * */ +/* * - added conditionals around canvas update routines * */ +/* * 1.0.6 - 05/25/2003 - Glenn RP * */ +/* * - added size-optimization DIV255B8 routine usage * */ +/* * 1.0.6 - 06/09/2003 - G. R-P * */ +/* * - added conditionals around 8-bit magn routines * */ +/* * 1.0.6 - 07/07/2003 - G. R-P * */ +/* * - removed conditionals around 8-bit magn routines * */ +/* * - added MNG_NO_16BIT_SUPPORT and MNG_NO_DELTA_PNG * */ +/* * conditionals * */ +/* * - reversed many loops to use decrementing counter * */ +/* * - combined init functions * */ +/* * - converted some switches to array references * */ +/* * 1.0.6 - 07/29/2003 - G.Juyn * */ +/* * - fixed duplicate for-loop * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added SKIPCHUNK conditionals around PAST chunk support * */ +/* * - fixed "FOOTPRINT_COMPOSEIV" typo (now "FOOTPRINT_DIV") * */ +/* * 1.0.6 - 08/17/2003 - G.R-P * */ +/* * - added more conditionals around "promote" functions * */ +/* * * */ +/* * 1.0.7 - 11/27/2003 - R.A * */ +/* * - added CANVAS_RGB565 and CANVAS_BGR565 * */ +/* * 1.0.7 - 12/06/2003 - R.A * */ +/* * - added CANVAS_RGBA565 and CANVAS_BGRA565 * */ +/* * 1.0.7 - 01/25/2004 - J.S * */ +/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */ +/* * 1.0.7 - 03/08/2004 - G.R-P * */ +/* * - added more conditionals around 16-bit-supporting code * */ +/* * 1.0.7 - 03/09/2004 - G.Juyn * */ +/* * - fixed bug in promote_g8_g8 with 16bit support off * */ +/* * 1.0.7 - 03/09/2004 - G.R-P * */ +/* * - more optimizations with 16bit support off * */ +/* * 1.0.7 - 03/10/2004 - G.Juyn * */ +/* * - fixed some warnings for 16bit optimizations * */ +/* * 1.0.7 - 03/21/2004 - G.Juyn * */ +/* * - fixed some 64-bit platform compiler warnings * */ +/* * * */ +/* * 1.0.8 - 06/20/2004 - G.Juyn * */ +/* * - some speed optimizations (thanks to John Stiles) * */ +/* * 1.0.8 - 08/01/2004 - G.Juyn * */ +/* * - added support for 3+byte pixelsize for JPEG's * */ +/* * * */ +/* * 1.0.9 - 10/10/2004 - G.R-P. * */ +/* * - added MNG_NO_1_2_4BIT_SUPPORT * */ +/* * 1.0.9 - 10/14/2004 - G.Juyn * */ +/* * - added bgr565_a8 canvas-style (thanks to J. Elvander) * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added LITTLEENDIAN/BIGENDIAN fixtures (thanks J.Stiles) * */ +/* * - fixed MNG_NO_1_2_4BIT_SUPPORT for TBBN1G04.PNG * */ +/* * 1.0.9 - 12/31/2004 - G.R-P. * */ +/* * - fixed warnings about C++ style (//) comments * */ +/* * * */ +/* * 1.0.10 - 07/06/2005 - G.R-P. * */ +/* * - added MORE MNG_NO_1_2_4BIT_SUPPORT * */ +/* * 1.0.10 - 10/06/2005 - G.R-P. * */ +/* * - alloc more memory for MNG_NO_1_2_4BIT_SUPPORT * */ +/* * 1.0.10 - 12/07/2005 - G.R-P. * */ +/* * - optimized footprint of 16bit support * */ +/* * 1.0.10 - 03/07/2006 - (thanks to W. Manthey) * */ +/* * - added CANVAS_RGB555 and CANVAS_BGR555 * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_objects.h" +#include "libmng_object_prc.h" +#include "libmng_memory.h" +#include "libmng_cms.h" +#include "libmng_filter.h" +#include "libmng_pixels.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_DISPLAY_PROCS + +/* TODO: magnification & canvas-positioning/-clipping */ + +/* TODO: major optimization of pixel-loops by using assembler (?) */ + +/* ************************************************************************** */ +/* * * */ +/* * Interlace tables * */ +/* * * */ +/* ************************************************************************** */ + +MNG_LOCAL mng_uint32 const interlace_row [7] = { 0, 0, 4, 0, 2, 0, 1 }; +MNG_LOCAL mng_uint32 const interlace_rowskip [7] = { 8, 8, 8, 4, 4, 2, 2 }; +MNG_LOCAL mng_uint32 const interlace_col [7] = { 0, 4, 0, 2, 0, 1, 0 }; +MNG_LOCAL mng_uint32 const interlace_colskip [7] = { 8, 8, 4, 4, 2, 2, 1 }; +MNG_LOCAL mng_uint32 const interlace_roundoff [7] = { 7, 7, 3, 3, 1, 1, 0 }; +MNG_LOCAL mng_uint32 const interlace_divider [7] = { 3, 3, 2, 2, 1, 1, 0 }; + +/* ************************************************************************** */ +/* * * */ +/* * Alpha composing macros * */ +/* * the code below is slightly modified from the libpng package * */ +/* * the original was last optimized by Greg Roelofs & Mark Adler * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_COMPOSE8(RET,FG,ALPHA,BG) { \ + mng_uint16 iH = (mng_uint16)((mng_uint16)(FG) * (mng_uint16)(ALPHA) \ + + (mng_uint16)(BG)*(mng_uint16)(255 - \ + (mng_uint16)(ALPHA)) + (mng_uint16)128); \ + (RET) = (mng_uint8)((iH + (iH >> 8)) >> 8); } + +#define MNG_COMPOSE16(RET,FG,ALPHA,BG) { \ + mng_uint32 iH = (mng_uint32)((mng_uint32)(FG) * (mng_uint32)(ALPHA) \ + + (mng_uint32)(BG)*(mng_uint32)(65535L - \ + (mng_uint32)(ALPHA)) + (mng_uint32)32768L); \ + (RET) = (mng_uint16)((iH + (iH >> 16)) >> 16); } + +/* ************************************************************************** */ +/* * * */ +/* * Alpha blending macros * */ +/* * this code is based on Adam Costello's "Note on Compositing" from the * */ +/* * mng-list which gives the following formula: * */ +/* * * */ +/* * top pixel = (Rt, Gt, Bt, At) * */ +/* * bottom pixel = (Rb, Gb, Bb, Ab) * */ +/* * composite pixel = (Rc, Gc, Bc, Ac) * */ +/* * * */ +/* * all values in the range 0..1 * */ +/* * * */ +/* * Ac = 1 - (1 - At)(1 - Ab) * */ +/* * s = At / Ac * */ +/* * t = (1 - At) Ab / Ac * */ +/* * Rc = s Rt + t Rb * */ +/* * Gc = s Gt + t Gb * */ +/* * Bc = s Bt + t Bb * */ +/* * * */ +/* * (I just hope I coded it correctly in integer arithmetic...) * */ +/* * * */ +/* ************************************************************************** */ + +#define MNG_BLEND8(RT, GT, BT, AT, RB, GB, BB, AB, RC, GC, BC, AC) { \ + mng_uint32 S, T; \ + (AC) = (mng_uint8)((mng_uint32)255 - \ + ((((mng_uint32)255 - (mng_uint32)(AT)) * \ + ((mng_uint32)255 - (mng_uint32)(AB)) ) >> 8)); \ + S = (mng_uint32)(((mng_uint32)(AT) << 8) / \ + (mng_uint32)(AC)); \ + T = (mng_uint32)(((mng_uint32)255 - (mng_uint32)(AT)) * \ + (mng_uint32)(AB) / (mng_uint32)(AC)); \ + (RC) = (mng_uint8)((S * (mng_uint32)(RT) + \ + T * (mng_uint32)(RB) + (mng_uint32)127) >> 8); \ + (GC) = (mng_uint8)((S * (mng_uint32)(GT) + \ + T * (mng_uint32)(GB) + (mng_uint32)127) >> 8); \ + (BC) = (mng_uint8)((S * (mng_uint32)(BT) + \ + T * (mng_uint32)(BB) + (mng_uint32)127) >> 8); } + +#define MNG_BLEND16(RT, GT, BT, AT, RB, GB, BB, AB, RC, GC, BC, AC) { \ + mng_uint32 S, T; \ + (AC) = (mng_uint16)((mng_uint32)65535 - \ + ((((mng_uint32)65535 - (mng_uint32)(AT)) * \ + ((mng_uint32)65535 - (mng_uint32)(AB)) ) >> 16)); \ + S = (mng_uint32)(((mng_uint32)(AT) << 16) / \ + (mng_uint32)(AC)); \ + T = (mng_uint32)(((mng_uint32)65535 - (mng_uint32)(AT)) * \ + (mng_uint32)(AB) / (mng_uint32)(AC)); \ + (RC) = (mng_uint16)((S * (mng_uint32)(RT) + \ + T * (mng_uint32)(RB) + (mng_uint32)32767) >> 16); \ + (GC) = (mng_uint16)((S * (mng_uint32)(GT) + \ + T * (mng_uint32)(GB) + (mng_uint32)32767) >> 16); \ + (BC) = (mng_uint16)((S * (mng_uint32)(BT) + \ + T * (mng_uint32)(BB) + (mng_uint32)32767) >> 16); } + +/* ************************************************************************** */ + +/* note a good optimizing compiler will optimize this */ +#define DIV255B8(x) (mng_uint8)(((x) + 127) / 255) +#define DIV255B16(x) (mng_uint16)(((x) + 32767) / 65535) + +/* ************************************************************************** */ +/* * * */ +/* * Progressive display check - checks to see if progressive display is * */ +/* * in order & indicates so * */ +/* * * */ +/* * The routine is called after a call to one of the display_xxx routines * */ +/* * if appropriate * */ +/* * * */ +/* * The refresh is warrented in the read_chunk routine (mng_read.c) * */ +/* * and only during read&display processing, since there's not much point * */ +/* * doing it from memory! * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_display_progressive_check (mng_datap pData) +{ + if ((pData->bDoProgressive) && /* need progressive display? */ + ((pData->eImagetype != mng_it_mng) || (pData->iDataheight > 300)) && + (pData->iDestb - pData->iDestt > 50) && (!pData->pCurraniobj)) + { + mng_int32 iC = pData->iRow + pData->iDestt - pData->iSourcet; + + if (iC % 20 == 0) /* every 20th line */ + pData->bNeedrefresh = MNG_TRUE; + + } + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +/* * * */ +/* * Display routines - convert rowdata (which is already color-corrected) * */ +/* * to the output canvas, respecting the opacity information * */ +/* * * */ +/* ************************************************************************** */ + +MNG_LOCAL void check_update_region (mng_datap pData) +{ /* determine actual canvas row */ + mng_int32 iRow = pData->iRow + pData->iDestt - pData->iSourcet; + /* check for change in update-region */ + if ((pData->iDestl < (mng_int32)pData->iUpdateleft) || (pData->iUpdateright == 0)) + pData->iUpdateleft = pData->iDestl; + + if (pData->iDestr > (mng_int32)pData->iUpdateright) + pData->iUpdateright = pData->iDestr; + + if ((iRow < (mng_int32)pData->iUpdatetop) || (pData->iUpdatebottom == 0)) + pData->iUpdatetop = iRow; + + if (iRow+1 > (mng_int32)pData->iUpdatebottom) + pData->iUpdatebottom = iRow+1; + + return; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGB8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_rgb8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)(*pScanline ); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*(pScanline+2)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iFGr16 >> 8); + *(pScanline+1) = (mng_uint8)(iFGg16 >> 8); + *(pScanline+2) = (mng_uint8)(iFGb16 >> 8); + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + } + else + { /* do alpha composing */ + MNG_COMPOSE8 (*pScanline, *pDataline, iA8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iA8, *(pScanline+2)); + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_rgb8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGg16; + mng_uint16 iBGg16; + mng_uint8 iA8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+iBps); + *(pScanline+2) = *(pDataline+2*iBps); + + pScanline += (pData->iColinc * 3); + pDataline += 4*iBps; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + } + else + { /* get the proper values */ + int i; + for (i=2; i >= 0; i--) + { + iFGg16 = mng_get_uint16 (pDataline+i+i); + /* scale background up */ + iBGg16 = (mng_uint16)(*(pScanline+i)); + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + /* now compose */ + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + /* and return the composed values */ + *(pScanline+i) = (mng_uint8)(iFGg16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + } + else + { /* do alpha composing */ + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iA8, *(pScanline+i)); + } + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_rgb8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + } + else + { /* do alpha composing */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iA8, *(pScanline+i)); + } +#else + MNG_COMPOSE8 (*pScanline, *pDataline, iA8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iA8, *(pScanline+2)); +#endif + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_RGB8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGBA8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_rgba8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + *(pScanline+3) = *(pDataline+6); + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *(pDataline+3); + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*(pScanline+3)); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + *(pScanline+3) = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)(*pScanline ); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*(pScanline+2)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iFGr16 >> 8); + *(pScanline+1) = (mng_uint8)(iFGg16 >> 8); + *(pScanline+2) = (mng_uint8)(iFGb16 >> 8); + /* alpha remains fully opaque !!! */ + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*pScanline ); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*(pScanline+2)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCr16 >> 8); + *(pScanline+1) = (mng_uint8)(iCg16 >> 8); + *(pScanline+2) = (mng_uint8)(iCb16 >> 8); + *(pScanline+3) = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+3); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (*pScanline, *pDataline, iFGa8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iFGa8, *(pScanline+2)); + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCr8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCb8; + *(pScanline+3) = iCa8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_rgba8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGg16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+iBps); + *(pScanline+2) = *(pDataline+2*iBps); + *(pScanline+3) = *(pDataline+3*iBps); + + pScanline += (pData->iColinc << 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*(pScanline+3)); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + *(pScanline+3) = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + int i; + for (i=2; i >= 0; i--) + { + iFGg16 = mng_get_uint16 (pDataline+i+i); + /* scale background up */ + iBGg16 = (mng_uint16)(*(pScanline+i)); + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + /* now compose */ + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + /* and return the composed values */ + *(pScanline+i) = (mng_uint8)(iFGg16 >> 8); + /* alpha remains fully opaque !!! */ + } + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*pScanline ); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*(pScanline+2)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCr16 >> 8); + *(pScanline+1) = (mng_uint8)(iCg16 >> 8); + *(pScanline+2) = (mng_uint8)(iCb16 >> 8); + *(pScanline+3) = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+3); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iFGa8, *(pScanline+i)); + } + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCr8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCb8; + *(pScanline+3) = iCa8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_rgba8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *(pDataline+3); + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+3); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iFGa8, *(pScanline+i)); + } +#else + MNG_COMPOSE8 (*pScanline, *pDataline, iFGa8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iFGa8, *(pScanline+2)); +#endif + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCr8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCb8; + *(pScanline+3) = iCa8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_RGBA8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGBA8_PM +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_rgba8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + if ((s = pDataline[6]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[4]; + pScanline[3] = 255; + } + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[4-i-i]); + } +#else + pScanline[0] = DIV255B8(s * pDataline[0]); + pScanline[1] = DIV255B8(s * pDataline[2]); + pScanline[2] = DIV255B8(s * pDataline[4]); +#endif + pScanline[3] = (mng_uint8)s; + } + } + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { +#ifdef MNG_BIGENDIAN_SUPPORTED + *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF; +#else + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[2]; + pScanline[3] = 255; +#endif + } + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[2-i]); + } +#else + pScanline[0] = DIV255B8(s * pDataline[0]); + pScanline[1] = DIV255B8(s * pDataline[1]); + pScanline[2] = DIV255B8(s * pDataline[2]); +#endif + pScanline[3] = (mng_uint8)s; + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + if ((s = pDataline[6]) != 0) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if (s == 255) + { /* plain copy it */ + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[4]; + pScanline[3] = 255; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[4-i-i] + t * + pScanline[2-i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[4] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ +#ifdef MNG_BIGENDIAN_SUPPORTED + *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF; +#else + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[2]; + pScanline[3] = 255; +#endif + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[2-i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_rgba8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + if ((s = pDataline[6]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[4]; + pScanline[3] = 255; + } + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[4-i-i]); + } +#else + pScanline[0] = DIV255B8(s * pDataline[0]); + pScanline[1] = DIV255B8(s * pDataline[2]); + pScanline[2] = DIV255B8(s * pDataline[4]); +#endif + pScanline[3] = (mng_uint8)s; + } + } + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { +#ifdef MNG_BIGENDIAN_SUPPORTED + *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF; +#else + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[2]; + pScanline[3] = 255; +#endif + } + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[2-i]); + } +#else + pScanline[0] = DIV255B8(s * pDataline[0]); + pScanline[1] = DIV255B8(s * pDataline[1]); + pScanline[2] = DIV255B8(s * pDataline[2]); +#endif + pScanline[3] = (mng_uint8)s; + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + if ((s = pDataline[6]) != 0) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if (s == 255) + { /* plain copy it */ + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[4]; + pScanline[3] = 255; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[4-i-i] + t * + pScanline[2-i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[4] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ +#ifdef MNG_BIGENDIAN_SUPPORTED + *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF; +#else + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[2]; + pScanline[3] = 255; +#endif + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[2-i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_rgba8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { +#ifdef MNG_BIGENDIAN_SUPPORTED + *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF; +#else + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[2]; + pScanline[3] = 255; +#endif + } + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[2-i]); + } +#else + pScanline[0] = DIV255B8(s * pDataline[0]); + pScanline[1] = DIV255B8(s * pDataline[1]); + pScanline[2] = DIV255B8(s * pDataline[2]); +#endif + pScanline[3] = (mng_uint8)s; + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ +#ifdef MNG_BIGENDIAN_SUPPORTED + *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF; +#else + pScanline[0] = pDataline[0]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[2]; + pScanline[3] = 255; +#endif + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[2-i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[2-i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_RGBA8_PM */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_ARGB8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_argb8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_START); +#endif + + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+6); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *(pDataline+4); + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *(pDataline+2); + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*pScanline); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *(pDataline+6); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *(pDataline+4); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+1)); + iBGg16 = (mng_uint16)(*(pScanline+2)); + iBGb16 = (mng_uint16)(*(pScanline+3)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + /* alpha remains fully opaque !!! */ + *(pScanline+1) = (mng_uint8)(iFGr16 >> 8); + *(pScanline+2) = (mng_uint8)(iFGg16 >> 8); + *(pScanline+3) = (mng_uint8)(iFGb16 >> 8); + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+1)); + iBGg16 = (mng_uint16)(*(pScanline+2)); + iBGb16 = (mng_uint16)(*(pScanline+3)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCa16 >> 8); + *(pScanline+1) = (mng_uint8)(iCr16 >> 8); + *(pScanline+2) = (mng_uint8)(iCg16 >> 8); + *(pScanline+3) = (mng_uint8)(iCb16 >> 8); + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pScanline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *(pDataline+2); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do simple alpha composing */ + /* alpha itself remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+1), *(pScanline+2), *(pScanline+3), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCa8; + *(pScanline+1) = iCr8; + *(pScanline+2) = iCg8; + *(pScanline+3) = iCb8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_argb8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGg16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+3*iBps); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+iBps); + *(pScanline+3) = *(pDataline+2*iBps); + + pScanline += (pData->iColinc << 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*pScanline); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *(pDataline+6); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *(pDataline+4); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + int i; + for (i=2; i >= 0; i--) + { + iFGg16 = mng_get_uint16 (pDataline+i+i); + /* scale background up */ + iBGg16 = (mng_uint16)(*(pScanline+i+1)); + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + /* now compose */ + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + /* and return the composed values */ + /* alpha remains fully opaque !!! */ + *(pScanline+i+1) = (mng_uint8)(iFGg16 >> 8); + } + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+1)); + iBGg16 = (mng_uint16)(*(pScanline+2)); + iBGb16 = (mng_uint16)(*(pScanline+3)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCa16 >> 8); + *(pScanline+1) = (mng_uint8)(iCr16 >> 8); + *(pScanline+2) = (mng_uint8)(iCg16 >> 8); + *(pScanline+3) = (mng_uint8)(iCb16 >> 8); + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pScanline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *(pDataline+2); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do simple alpha composing */ + /* alpha itself remains fully opaque !!! */ + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i+1), *(pDataline+i), iFGa8, *(pScanline+i+1)); + } + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+1), *(pScanline+2), *(pScanline+3), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCa8; + *(pScanline+1) = iCr8; + *(pScanline+2) = iCg8; + *(pScanline+3) = iCb8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_argb8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_START); +#endif + + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *(pDataline+2); + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pScanline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *pDataline; + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *(pDataline+2); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do simple alpha composing */ + /* alpha itself remains fully opaque !!! */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i+1), *(pDataline+i), iFGa8, *(pScanline+i+1)); + } +#else + MNG_COMPOSE8 (*(pScanline+1), *pDataline, iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+1), iFGa8, *(pScanline+2)); + MNG_COMPOSE8 (*(pScanline+3), *(pDataline+2), iFGa8, *(pScanline+3)); +#endif + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+1), *(pScanline+2), *(pScanline+3), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCa8; + *(pScanline+1) = iCr8; + *(pScanline+2) = iCg8; + *(pScanline+3) = iCb8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_ARGB8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_ARGB8_PM +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_argb8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + if ((s = pDataline[6]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[2]; + pScanline[3] = pDataline[4]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[4-i-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0]); + pScanline[2] = DIV255B8(s * pDataline[2]); + pScanline[3] = DIV255B8(s * pDataline[4]); +#endif + } + } + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[2]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[2-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0]); + pScanline[2] = DIV255B8(s * pDataline[1]); + pScanline[3] = DIV255B8(s * pDataline[2]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + if ((s = pDataline[6]) != 0) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if (s == 255) + { /* plain copy it */ + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[2]; + pScanline[3] = pDataline[4]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[4-i-i] + t * + pScanline[3-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[4] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[2]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[3-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[2] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_argb8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + if ((s = pDataline[6]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[2]; + pScanline[3] = pDataline[4]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[4-i-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0]); + pScanline[2] = DIV255B8(s * pDataline[2]); + pScanline[3] = DIV255B8(s * pDataline[4]); +#endif + } + } + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[2]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[2-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0]); + pScanline[2] = DIV255B8(s * pDataline[1]); + pScanline[3] = DIV255B8(s * pDataline[2]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + if ((s = pDataline[6]) != 0) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if (s == 255) + { /* plain copy it */ + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[2]; + pScanline[3] = pDataline[4]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[4-i-i] + t * + pScanline[3-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[4] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[2]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[3-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[2] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_argb8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[2]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[2-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0]); + pScanline[2] = DIV255B8(s * pDataline[1]); + pScanline[3] = DIV255B8(s * pDataline[2]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = 255; + pScanline[1] = pDataline[0]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[2]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[3-i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[3-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[2] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_ARGB8_PM */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGB8_A8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_rgb8_a8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pAlphaline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination rows */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination rows starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pAlphaline = pAlphaline + pData->iCol + pData->iDestl; + + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + *pAlphaline = *(pDataline+6); + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *pAlphaline = *(pDataline+3); + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*pAlphaline); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + *pAlphaline = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)(*pScanline ); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*(pScanline+2)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iFGr16 >> 8); + *(pScanline+1) = (mng_uint8)(iFGg16 >> 8); + *(pScanline+2) = (mng_uint8)(iFGb16 >> 8); + /* alpha remains fully opaque !!! */ + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*pScanline ); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*(pScanline+2)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCr16 >> 8); + *(pScanline+1) = (mng_uint8)(iCg16 >> 8); + *(pScanline+2) = (mng_uint8)(iCb16 >> 8); + *pAlphaline = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pAlphaline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *pAlphaline = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (*pScanline, *pDataline, iFGa8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iFGa8, *(pScanline+2)); + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCr8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCb8; + *pAlphaline = iCa8; + } + } + } + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_rgb8_a8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pAlphaline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGg16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination rows */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination rows starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pAlphaline = pAlphaline + pData->iCol + pData->iDestl; + + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+iBps); + *(pScanline+2) = *(pDataline+2*iBps); + *pAlphaline = *(pDataline+3*iBps); + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*pAlphaline); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+4); + *pAlphaline = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + int i; + for (i=2; i >= 0; i--) + { + iFGg16 = mng_get_uint16 (pDataline+i+i); + /* scale background up */ + iBGg16 = (mng_uint16)(*(pScanline+i)); + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + /* now compose */ + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + /* and return the composed values */ + *(pScanline+i) = (mng_uint8)(iFGg16 >> 8); + /* alpha remains fully opaque !!! */ + } + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*pScanline ); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*(pScanline+2)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCr16 >> 8); + *(pScanline+1) = (mng_uint8)(iCg16 >> 8); + *(pScanline+2) = (mng_uint8)(iCb16 >> 8); + *pAlphaline = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pAlphaline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *pAlphaline = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iFGa8, *(pScanline+i)); + } + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCr8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCb8; + *pAlphaline = iCa8; + } + } + } + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_rgb8_a8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pAlphaline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination rows */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination rows starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pAlphaline = pAlphaline + pData->iCol + pData->iDestl; + + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *pAlphaline = *(pDataline+3); + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pAlphaline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *pDataline; + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *(pDataline+2); + *pAlphaline = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iFGa8, *(pScanline+i)); + } +#else + MNG_COMPOSE8 (*pScanline, *pDataline, iFGa8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iFGa8, *(pScanline+2)); +#endif + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCr8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCb8; + *pAlphaline = iCa8; + } + } + } + + pScanline += (pData->iColinc * 3); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_RGB8_A8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGR8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_bgr8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 8; + else + pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 4; + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha value */ + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+2)); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*pScanline ); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iFGb16 >> 8); + *(pScanline+1) = (mng_uint8)(iFGg16 >> 8); + *(pScanline+2) = (mng_uint8)(iFGr16 >> 8); + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + } + else + { /* do alpha composing */ + MNG_COMPOSE8 (*pScanline, *(pDataline+2), iA8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *pDataline, iA8, *(pScanline+2)); + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_bgr8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGg16; + mng_uint16 iBGg16; + mng_uint8 iA8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+2*iBps); + *(pScanline+1) = *(pDataline+iBps); + *(pScanline+2) = *pDataline; + + pScanline += (pData->iColinc * 3); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha value */ + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + } + else + { /* get the proper values */ + int i; + for (i=2; i >= 0; i--) + { + iFGg16 = mng_get_uint16 (pDataline+i+i); + /* scale background up */ + iBGg16 = (mng_uint16)(*(pScanline+2-i)); + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + /* now compose */ + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + /* and return the composed values */ + *(pScanline+2-i) = (mng_uint8)(iFGg16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + } + else + { /* do alpha composing */ + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iA8, *(pScanline+i)); + } + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_bgr8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 4; + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + } + else + { /* do alpha composing */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iA8, *(pScanline+i)); + } +#else + MNG_COMPOSE8 (*pScanline, *(pDataline+2), iA8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *pDataline, iA8, *(pScanline+2)); +#endif + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_BGR8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGRX8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_bgrx8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 8; + else + pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 4; + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha value */ + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+2)); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*pScanline ); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iFGb16 >> 8); + *(pScanline+1) = (mng_uint8)(iFGg16 >> 8); + *(pScanline+2) = (mng_uint8)(iFGr16 >> 8); + *(pScanline+3) = 0xFF; /* filler byte */ + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + } + else + { /* do alpha composing */ + MNG_COMPOSE8 (*pScanline, *(pDataline+2), iA8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *pDataline, iA8, *(pScanline+2)); + *(pScanline+3) = 0xFF; /* filler byte */ + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_bgrx8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGg16; + mng_uint16 iBGg16; + mng_uint8 iA8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+2*iBps); + *(pScanline+1) = *(pDataline+iBps); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + + pScanline += (pData->iColinc << 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha value */ + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + } + else + { /* get the proper values */ + int i; + for (i=2; i >= 0; i--) + { + iFGg16 = mng_get_uint16 (pDataline+i+i); + /* scale background up */ + iBGg16 = (mng_uint16)(*(pScanline+2-i)); + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + /* now compose */ + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + /* and return the composed values */ + *(pScanline+2-i) = (mng_uint8)(iFGg16 >> 8); + } + *(pScanline+3) = 0xFF; /* filler byte */ + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + } + else + { /* do alpha composing */ + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iA8, *(pScanline+i)); + } + *(pScanline+3) = 0xFF; /* filler byte */ + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_bgrx8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 4; + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = 0xFF; /* filler byte */ + } + else + { /* do alpha composing */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iA8, *(pScanline+i)); + } +#else + MNG_COMPOSE8 (*pScanline, *(pDataline+2), iA8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *pDataline, iA8, *(pScanline+2)); +#endif + *(pScanline+3) = 0xFF; /* filler byte */ + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_BGRX8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGRA8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_bgra8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+6); + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+3); + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*(pScanline+3)); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+2)); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*pScanline ); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iFGb16 >> 8); + *(pScanline+1) = (mng_uint8)(iFGg16 >> 8); + *(pScanline+2) = (mng_uint8)(iFGr16 >> 8); + /* alpha remains fully opaque !!! */ + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+2)); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*pScanline ); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCb16 >> 8); + *(pScanline+1) = (mng_uint8)(iCg16 >> 8); + *(pScanline+2) = (mng_uint8)(iCr16 >> 8); + *(pScanline+3) = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+3); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (*pScanline, *(pDataline+2), iFGa8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *pDataline, iFGa8, *(pScanline+2)); + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+2), *(pScanline+1), *pScanline, iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCb8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCr8; + *(pScanline+3) = iCa8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_bgra8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGg16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+2*iBps); + *(pScanline+1) = *(pDataline+iBps); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+3*iBps); + + pScanline += (pData->iColinc << 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*(pScanline+3)); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *(pDataline+4); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + int i; + for (i=2; i >= 0; i--) + { + iFGg16 = mng_get_uint16 (pDataline+i+i); + /* scale background up */ + iBGg16 = (mng_uint16)(*(pScanline+2-i)); + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + /* now compose */ + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + /* and return the composed values */ + *(pScanline+2-i) = (mng_uint8)(iFGg16 >> 8); + /* alpha remains fully opaque !!! */ + } + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+2)); + iBGg16 = (mng_uint16)(*(pScanline+1)); + iBGb16 = (mng_uint16)(*pScanline ); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCb16 >> 8); + *(pScanline+1) = (mng_uint8)(iCg16 >> 8); + *(pScanline+2) = (mng_uint8)(iCr16 >> 8); + *(pScanline+3) = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+3); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iFGa8, *(pScanline+i)); + } + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+2), *(pScanline+1), *pScanline, iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCb8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCr8; + *(pScanline+3) = iCa8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_bgra8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+3); + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+3); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+2); + *(pScanline+1) = *(pDataline+1); + *(pScanline+2) = *pDataline; + *(pScanline+3) = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iFGa8, *(pScanline+i)); + } +#else + MNG_COMPOSE8 (*pScanline, *(pDataline+2), iFGa8, *pScanline ); + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *pDataline, iFGa8, *(pScanline+2)); +#endif + /* alpha remains fully opaque !!! */ + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+2), *(pScanline+1), *pScanline, iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCb8; + *(pScanline+1) = iCg8; + *(pScanline+2) = iCr8; + *(pScanline+3) = iCa8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_BGRA8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGRA8_PM +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_bgra8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + if ((s = pDataline[6]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = pDataline[4]; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { + pScanline[0] = DIV255B8(s * pDataline[4]); + pScanline[1] = DIV255B8(s * pDataline[2]); + pScanline[2] = DIV255B8(s * pDataline[0]); + pScanline[3] = (mng_uint8)s; + } + } + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = pDataline[2]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { + pScanline[0] = DIV255B8(s * pDataline[2]); + pScanline[1] = DIV255B8(s * pDataline[1]); + pScanline[2] = DIV255B8(s * pDataline[0]); + pScanline[3] = (mng_uint8)s; + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + if ((s = pDataline[6]) != 0) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if (s == 255) + { /* plain copy it */ + pScanline[0] = pDataline[4]; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i] = DIV255B8(s * pDataline[4-i-i] + t * + pScanline[i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[4] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = pDataline[2]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[2] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_bgra8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + if ((s = pDataline[6]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = pDataline[4]; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + int i; + for (i=2; i >= 0; i--) + { + pScanline[i] = DIV255B8(s * pDataline[4-i-i]); + } +#else + pScanline[0] = DIV255B8(s * pDataline[4]); + pScanline[1] = DIV255B8(s * pDataline[2]); + pScanline[2] = DIV255B8(s * pDataline[0]); +#endif + pScanline[3] = (mng_uint8)s; + } + } + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = pDataline[2]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + int i; + for (i=2; i >= 0; i--) + { + pScanline[i] = DIV255B8(s * pDataline[2-i]); + } +#else + pScanline[0] = DIV255B8(s * pDataline[2]); + pScanline[1] = DIV255B8(s * pDataline[1]); + pScanline[2] = DIV255B8(s * pDataline[0]); +#endif + pScanline[3] = (mng_uint8)s; + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + if ((s = pDataline[6]) != 0) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if (s == 255) + { /* plain copy it */ + pScanline[0] = pDataline[4]; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i] = DIV255B8(s * pDataline[4-i-i] + t * + pScanline[i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[4] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = pDataline[2]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[2] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_bgra8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = pDataline[2]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + int i; + for (i=2; i >= 0; i--) + { + pScanline[i] = DIV255B8(s * pDataline[2-i]); + } +#else + pScanline[0] = DIV255B8(s * pDataline[2]); + pScanline[1] = DIV255B8(s * pDataline[1]); + pScanline[2] = DIV255B8(s * pDataline[0]); +#endif + pScanline[3] = (mng_uint8)s; + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = pDataline[2]; + pScanline[1] = pDataline[1]; + pScanline[2] = pDataline[0]; + pScanline[3] = 255; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i] = DIV255B8(s * pDataline[2-i] + t * + pScanline[i]); + } + } +#else + pScanline[0] = DIV255B8(s * pDataline[2] + t * pScanline[0]); + pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]); +#endif + pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3]))); + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_BGRA8_PM */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_ABGR8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_abgr8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+6); + *(pScanline+1) = *(pDataline+4); + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *pDataline; + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *pDataline; + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*pScanline); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *(pDataline+6); + *(pScanline+1) = *(pDataline+4); + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *pDataline; + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+3)); + iBGg16 = (mng_uint16)(*(pScanline+2)); + iBGb16 = (mng_uint16)(*(pScanline+1)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + /* alpha itself remains fully opaque !!! */ + *(pScanline+1) = (mng_uint8)(iFGb16 >> 8); + *(pScanline+2) = (mng_uint8)(iFGg16 >> 8); + *(pScanline+3) = (mng_uint8)(iFGr16 >> 8); + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+3)); + iBGg16 = (mng_uint16)(*(pScanline+2)); + iBGb16 = (mng_uint16)(*(pScanline+1)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCa16 >> 8); + *(pScanline+1) = (mng_uint8)(iCb16 >> 8); + *(pScanline+2) = (mng_uint8)(iCg16 >> 8); + *(pScanline+3) = (mng_uint8)(iCr16 >> 8); + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pScanline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *pDataline; + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do simple alpha composing */ + /* alpha itself remains fully opaque !!! */ + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+2), iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+1), iFGa8, *(pScanline+2)); + MNG_COMPOSE8 (*(pScanline+3), *pDataline, iFGa8, *(pScanline+3)); + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+3), *(pScanline+2), *(pScanline+1), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCa8; + *(pScanline+1) = iCb8; + *(pScanline+2) = iCg8; + *(pScanline+3) = iCr8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_abgr8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGg16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *pScanline = *(pDataline+3*iBps); + *(pScanline+1) = *(pDataline+2*iBps); + *(pScanline+2) = *(pDataline+iBps); + *(pScanline+3) = *pDataline; + + pScanline += (pData->iColinc << 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*pScanline); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *pScanline = *(pDataline+6); + *(pScanline+1) = *(pDataline+4); + *(pScanline+2) = *(pDataline+2); + *(pScanline+3) = *pDataline; + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + int i; + for (i=2; i >= 0; i--) + { + iFGg16 = mng_get_uint16 (pDataline+i+i); + /* scale background up */ + iBGg16 = (mng_uint16)(*(pScanline+3-i)); + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + /* now compose */ + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + /* and return the composed values */ + /* alpha itself remains fully opaque !!! */ + *(pScanline+3-i) = (mng_uint8)(iFGg16 >> 8); + } + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)(*(pScanline+3)); + iBGg16 = (mng_uint16)(*(pScanline+2)); + iBGb16 = (mng_uint16)(*(pScanline+1)); + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *pScanline = (mng_uint8)(iCa16 >> 8); + *(pScanline+1) = (mng_uint8)(iCb16 >> 8); + *(pScanline+2) = (mng_uint8)(iCg16 >> 8); + *(pScanline+3) = (mng_uint8)(iCr16 >> 8); + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pScanline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *pDataline; + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do simple alpha composing */ + /* alpha itself remains fully opaque !!! */ + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i+1), *(pDataline+2-i), iFGa8, *(pScanline+i+1)); + } + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+3), *(pScanline+2), *(pScanline+1), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCa8; + *(pScanline+1) = iCb8; + *(pScanline+2) = iCg8; + *(pScanline+3) = iCr8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_abgr8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *pDataline; + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *pScanline; + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pScanline = *(pDataline+3); + *(pScanline+1) = *(pDataline+2); + *(pScanline+2) = *(pDataline+1); + *(pScanline+3) = *pDataline; + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do simple alpha composing */ + /* alpha itself remains fully opaque !!! */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pScanline+i+1), *(pDataline+2-i), iFGa8, *(pScanline+i+1)); + } +#else + MNG_COMPOSE8 (*(pScanline+1), *(pDataline+2), iFGa8, *(pScanline+1)); + MNG_COMPOSE8 (*(pScanline+2), *(pDataline+1), iFGa8, *(pScanline+2)); + MNG_COMPOSE8 (*(pScanline+3), *pDataline, iFGa8, *(pScanline+3)); +#endif + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + *(pScanline+3), *(pScanline+2), *(pScanline+1), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pScanline = iCa8; + *(pScanline+1) = iCb8; + *(pScanline+2) = iCg8; + *(pScanline+3) = iCr8; + } + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_ABGR8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_ABGR8_PM +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_abgr8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + if ((s = pDataline[6]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[4]; + pScanline[2] = pDataline[2]; + pScanline[3] = pDataline[0]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[4-i-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[4]); + pScanline[2] = DIV255B8(s * pDataline[2]); + pScanline[3] = DIV255B8(s * pDataline[0]); +#endif + } + } + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[0]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[2-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[2]); + pScanline[2] = DIV255B8(s * pDataline[1]); + pScanline[3] = DIV255B8(s * pDataline[0]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + if ((s = pDataline[6]) != 0) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if (s == 255) + { /* plain copy it */ + pScanline[0] = 255; + pScanline[1] = pDataline[4]; + pScanline[2] = pDataline[2]; + pScanline[3] = pDataline[0]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[4-i-i] + t * + pScanline[i+1]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[4] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = 255; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[0]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[2-i] + t * + pScanline[i+1]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_abgr8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + if ((s = pDataline[6]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[4]; + pScanline[2] = pDataline[2]; + pScanline[3] = pDataline[0]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[4-i-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[4]); + pScanline[2] = DIV255B8(s * pDataline[2]); + pScanline[3] = DIV255B8(s * pDataline[0]); +#endif + } + } + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[0]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[2-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[2]); + pScanline[2] = DIV255B8(s * pDataline[1]); + pScanline[3] = DIV255B8(s * pDataline[0]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + if ((s = pDataline[6]) != 0) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if (s == 255) + { /* plain copy it */ + pScanline[0] = 255; + pScanline[1] = pDataline[4]; + pScanline[2] = pDataline[2]; + pScanline[3] = pDataline[0]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[4-i-i] + t * + pScanline[i+1]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[4] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = 255; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[0]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[2-i] + t * + pScanline[i+1]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_abgr8_pm (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint32 s, t; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values and premultiply */ + if ((s = pDataline[3]) == 0) + *(mng_uint32*) pScanline = 0; /* set all components = 0 */ + else + { + if (s == 255) + { + pScanline[0] = 255; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[0]; + } + else + { + pScanline[0] = (mng_uint8)s; +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[2-i]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[2]); + pScanline[2] = DIV255B8(s * pDataline[1]); + pScanline[3] = DIV255B8(s * pDataline[0]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + if ((s = pDataline[3]) != 0) /* any opacity at all ? */ + { /* fully opaque ? */ + if (s == 255) + { /* then simply copy the values */ + pScanline[0] = 255; + pScanline[1] = pDataline[2]; + pScanline[2] = pDataline[1]; + pScanline[3] = pDataline[0]; + } + else + { /* now blend (premultiplied) */ + t = 255 - s; + pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0]))); +#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV + { + int i; + for (i=2; i >= 0; i--) + { + pScanline[i+1] = DIV255B8(s * pDataline[2-i] + t * + pScanline[i+1]); + } + } +#else + pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]); + pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]); + pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]); +#endif + } + } + + pScanline += (pData->iColinc << 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_ABGR8_PM */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGR565 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_bgr565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+2)>>5) ) ); + *pScanline = (mng_uint8)( ( (*(pDataline+4)) >>3) | ( (*(pDataline+2)&0xFC) << 3) ); + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) ); + + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) ); + *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_bgr565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | + ( (*(pDataline+iBps)>>5) ) ); + *pScanline = (mng_uint8)( ( (*(pDataline+2*iBps)) >>3) | + ( (*(pDataline+iBps)&0xFC) << 3) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) ); + *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_bgr565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) ); + + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_BGR565 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGB565 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_rgb565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( ( *(pDataline+4)) & 0xF8) | (*(pDataline+2) >> 5 ) ); + *pScanline = (mng_uint8)( ( ( *(pDataline )) >> 3 ) | ((*(pDataline+2) & 0xFC) << 3) ); + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | (*(pDataline+1) >> 5 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xFC) << 3) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+4)) & 0xF8) | (*(pDataline+2)>>5) ); + *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ((*(pDataline+2)&0xFC) << 3) ); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + + /* scale background up */ + iBGr16 = (mng_uint8)( *(pScanline+1) & 0xF8 ); + iBGg16 = (mng_uint8)( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0) >> 3 ) ); + iBGb16 = (mng_uint8)( *(pScanline ) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8)( (mng_uint8)((iFGb16 >> 8) &0xF8) | ( (mng_uint8)(iFGg16 >> 8) >> 5 ) ); + *pScanline = (mng_uint8)( (mng_uint8) (iFGr16 >>11) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | ( *(pDataline+1) >> 5 ) ); + *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ( (*(pDataline+1) & 0xFC) << 3 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( *(pScanline+1) & 0xF8); + iGreen = (mng_uint8)( ( *(pScanline+1) << 5 ) | ( ( (*pScanline)&0xE0)>>3 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( iRed & 0xF8) | ( iGreen >> 5 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_rgb565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( ( *(pDataline+2*iBps)) & 0xF8) | + (*(pDataline+iBps) >> 5 ) ); + *pScanline = (mng_uint8)( ( ( *(pDataline )) >> 3 ) | + ((*(pDataline+iBps) & 0xFC) << 3) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+4)) & 0xF8) | (*(pDataline+2)>>5) ); + *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ((*(pDataline+2)&0xFC) << 3) ); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + + /* scale background up */ + iBGr16 = (mng_uint8)( *(pScanline+1) & 0xF8 ); + iBGg16 = (mng_uint8)( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0) >> 3 ) ); + iBGb16 = (mng_uint8)( *(pScanline ) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8)( (mng_uint8)((iFGb16 >> 8) &0xF8) | ( (mng_uint8)(iFGg16 >> 8) >> 5 ) ); + *pScanline = (mng_uint8)( (mng_uint8) (iFGr16 >>11) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | ( *(pDataline+1) >> 5 ) ); + *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ( (*(pDataline+1) & 0xFC) << 3 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( *(pScanline+1) & 0xF8); + iGreen = (mng_uint8)( ( *(pScanline+1) << 5 ) | ( ( (*pScanline)&0xE0)>>3 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( iRed & 0xF8) | ( iGreen >> 5 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_rgb565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | (*(pDataline+1) >> 5 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xFC) << 3) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | ( *(pDataline+1) >> 5 ) ); + *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ( (*(pDataline+1) & 0xFC) << 3 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( *(pScanline+1) & 0xF8); + iGreen = (mng_uint8)( ( *(pScanline+1) << 5 ) | ( ( (*pScanline)&0xE0)>>3 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( iRed & 0xF8) | ( iGreen >> 5 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_RGB565 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGRA565 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_bgra565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+2)>>5) ) ); + *pScanline = (mng_uint8)( ( (*(pDataline+4)) >>3) | ( (*(pDataline+2)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+6); + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) ); + *(pScanline+2) = *(pDataline+3); + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*(pScanline+2)); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) ); + *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3); + *(pScanline+2) = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) ); + } + else + { /* scale background up */ + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iCr16 >> 8) & 0xF8 ) | ( (mng_uint8)(iCg16 >> 8) >> 5 ) ); + *pScanline = (mng_uint8) ( ( (iCb16 >> 11) ) | (((mng_uint8)(iCg16 >> 8) & 0xFC) << 3) ); + *(pScanline+2) = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+2); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+3); + } + else + { + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue ); + /* alpha remains fully opaque !!! */ + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + iRed , iGreen , iBlue , iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + + + *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ( (iCg8 & 0xFC) << 3) ); + *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) ); + *(pScanline+2) = (mng_uint8) iCa8; + } + } + } + + pScanline += (pData->iColinc *3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_bgra565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | + ( (*(pDataline+iBps)>>5) ) ); + *pScanline = (mng_uint8)( ( (*(pDataline+2*iBps)) >>3) | + ( (*(pDataline+iBps)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+3*iBps); + + pScanline += (pData->iColinc * 3); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*(pScanline+2)); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) ); + *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3); + *(pScanline+2) = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) ); + } + else + { /* scale background up */ + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iCr16 >> 8) & 0xF8 ) | ( (mng_uint8)(iCg16 >> 8) >> 5 ) ); + *pScanline = (mng_uint8) ( ( (iCb16 >> 11) ) | (((mng_uint8)(iCg16 >> 8) & 0xFC) << 3) ); + *(pScanline+2) = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+2); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+3); + } + else + { + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue ); + /* alpha remains fully opaque !!! */ + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + iRed , iGreen , iBlue , iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + + + *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ( (iCg8 & 0xFC) << 3) ); + *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) ); + *(pScanline+2) = (mng_uint8) iCa8; + } + } + } + + pScanline += (pData->iColinc *3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_bgra565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) ); + *(pScanline+2) = *(pDataline+3); + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+2); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+3); + } + else + { + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue ); + /* alpha remains fully opaque !!! */ + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + iRed , iGreen , iBlue , iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + + + *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ( (iCg8 & 0xFC) << 3) ); + *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) ); + *(pScanline+2) = (mng_uint8) iCa8; + } + } + } + + pScanline += (pData->iColinc *3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_BGRA565 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGBA565 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_rgba565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+4))&0xF8 ) | ( (*(pDataline+2)>>5) ) ); + *pScanline = (mng_uint8)( ( (*(pDataline)) >>3) | ( (*(pDataline+2)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+6); + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) ); + *pScanline = (mng_uint8)( ( *(pDataline) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) ); + *(pScanline+2) = *(pDataline+3); + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*(pScanline+2)); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *(pScanline+1) = (mng_uint8)( (*(pDataline+4))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) ); + *pScanline = (mng_uint8)( (*(pDataline)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3); + *(pScanline+2) = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGb16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iFGb16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iFGr16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) ); + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGb16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iCb16 >> 8) & 0xF8 ) | ( (mng_uint8)(iCg16 >> 8) >> 5 ) ); + *pScanline = (mng_uint8) ( ( (iCr16 >> 11) ) | (((mng_uint8)(iCg16 >> 8) & 0xFC) << 3) ); + *(pScanline+2) = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+2); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+3); + } + else + { + mng_uint8 iRed, iGreen, iBlue; + + iBlue = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iRed = (mng_uint8) ( (*pScanline << 3) ); + + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue ); + /* alpha remains fully opaque !!! */ + *(pScanline+1) = (mng_uint8) ( ( iBlue & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iRed >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + iRed , iGreen , iBlue , iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + + + *pScanline = (mng_uint8) ( ( iCr8 >> 3 ) | ( (iCg8 & 0xFC) << 3) ); + *(pScanline+1) = (mng_uint8) ( ( iCb8 & 0xF8 ) | (iCg8>>5) ); + *(pScanline+2) = (mng_uint8) iCa8; + } + } + } + + pScanline += (pData->iColinc *3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_rgba565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint16 iFGa16, iBGa16, iCa16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16; + mng_uint8 iCr8, iCg8, iCb8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2*iBps))&0xF8 ) | + ( (*(pDataline+iBps)>>5) ) ); + *pScanline = (mng_uint8)( ( (*(pDataline)) >>3) | + ( (*(pDataline+iBps)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+3*iBps); + + pScanline += (pData->iColinc * 3); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* get alpha values */ + iFGa16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*(pScanline+2)); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* plain copy it */ + *(pScanline+1) = (mng_uint8)( (*(pDataline+4))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) ); + *pScanline = (mng_uint8)( (*(pDataline)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3); + *(pScanline+2) = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + iBGr16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGb16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iFGb16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iFGr16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) ); + } + else + { /* scale background up */ + iBGr16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGb16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iCb16 >> 8) & 0xF8 ) | ( (mng_uint8)(iCg16 >> 8) >> 5 ) ); + *pScanline = (mng_uint8) ( ( (iCr16 >> 11) ) | (((mng_uint8)(iCg16 >> 8) & 0xFC) << 3) ); + *(pScanline+2) = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 3); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+2); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+3); + } + else + { + mng_uint8 iRed, iGreen, iBlue; + + iBlue = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iRed = (mng_uint8) ( (*pScanline << 3) ); + + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue ); + /* alpha remains fully opaque !!! */ + *(pScanline+1) = (mng_uint8) ( ( iBlue & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iRed >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + iRed , iGreen , iBlue , iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + + + *pScanline = (mng_uint8) ( ( iCr8 >> 3 ) | ( (iCg8 & 0xFC) << 3) ); + *(pScanline+1) = (mng_uint8) ( ( iCb8 & 0xF8 ) | (iCg8>>5) ); + *(pScanline+2) = (mng_uint8) iCa8; + } + } + } + + pScanline += (pData->iColinc *3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_rgba565 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) ); + *pScanline = (mng_uint8)( ( *(pDataline) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) ); + *(pScanline+2) = *(pDataline+3); + + pScanline += (pData->iColinc * 3); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iFGa8 = *(pDataline+3); /* get alpha values */ + iBGa8 = *(pScanline+2); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *(pScanline+2) = *(pDataline+3); + } + else + { + mng_uint8 iRed, iGreen, iBlue; + + iBlue = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) ); + iRed = (mng_uint8) ( (*pScanline << 3) ); + + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue ); + /* alpha remains fully opaque !!! */ + *(pScanline+1) = (mng_uint8) ( ( iBlue & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iRed >> 3 ) | ( (iGreen & 0xFC) << 3) ); + } + else + { /* now blend */ + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8, + iRed , iGreen , iBlue , iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + + + *pScanline = (mng_uint8) ( ( iCr8 >> 3 ) | ( (iCg8 & 0xFC) << 3) ); + *(pScanline+1) = (mng_uint8) ( ( iCb8 & 0xF8 ) | (iCg8>>5) ); + *(pScanline+2) = (mng_uint8) iCa8; + } + } + } + + pScanline += (pData->iColinc *3); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_RGBA565 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGR565_A8 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_bgr565_a8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pAlphaline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16, iBGa16; + mng_uint16 iCr16, iCg16, iCb16, iCa16; + mng_uint8 iA8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row +starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pAlphaline = pAlphaline + pData->iCol + pData->iDestl; + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ((*(pDataline+2)>>5) ) ); + *pScanline = (mng_uint8)( ( (*(pDataline+4)) >>3) | ((*(pDataline+2)&0xFC) << 3) ); + *pAlphaline = (mng_uint8)(*(pDataline+6)); + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ((*(pDataline+1)>>5 ) ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ((*(pDataline+1)&0xFC ) << 3) ); + *pAlphaline = (mng_uint8)(*(pDataline+3)); + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + else /* Not fully opaque */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*pAlphaline); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iA16) /* any opacity at all ? */ + { + if ((iA16 == 0xFFFF) || (iBGa16 == 0)) /* fully opaque or background fully transparent ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) ); + *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3); + *pAlphaline = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { + /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) ); + *pAlphaline = (mng_uint8)(iA16>>8); + } + else /* background is not fully opaque */ + { /* scale background up */ + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iA16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iCr16 >> 8)&0xF8 ) | ( (mng_uint8)(iCg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iCb16>>11) ) | (((mng_uint8)(iCg16>>8)&0xFC) << 3) ); + *pAlphaline = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; +iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + iBGa8 = *pAlphaline; + + if (iA8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iA8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *pAlphaline = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { + /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | (((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ((iGreen & 0xFC) << 3) ); + *pAlphaline = iA8; + } + else /* background not fully opaque */ + { + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iA8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) ); + *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ((iCg8 & 0xFC) << 3) ); + *pAlphaline = iCa8; + } + } + } + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_bgr565_a8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pAlphaline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16, iBGa16; + mng_uint16 iCr16, iCg16, iCb16, iCa16; + mng_uint8 iA8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + mng_uint8 iBps; + + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row +starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pAlphaline = pAlphaline + pData->iCol + pData->iDestl; + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | + ((*(pDataline+iBps)>>5) ) ); + *pScanline = (mng_uint8)( ( (*(pDataline+2*iBps)) >>3) | + ((*(pDataline+iBps)&0xFC) << 3) ); + *pAlphaline = (mng_uint8)(*(pDataline+6)); + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 8; + } + } + else /* Not fully opaque */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + iBGa16 = (mng_uint16)(*pAlphaline); + iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; + + if (iA16) /* any opacity at all ? */ + { + if ((iA16 == 0xFFFF) || (iBGa16 == 0)) /* fully opaque or background fully transparent ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) ); + *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3); + *pAlphaline = *(pDataline+6); + } + else + { + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { + /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + /* scale background up */ + + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) ); + *pAlphaline = (mng_uint8)(iA16>>8); + } + else /* background is not fully opaque */ + { /* scale background up */ + iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 ); + iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) ); + iBGr16 = (mng_uint16)( (*(pScanline )) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* let's blend */ + MNG_BLEND16 (mng_get_uint16 (pDataline ), + mng_get_uint16 (pDataline+2), + mng_get_uint16 (pDataline+4), iA16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( (iCr16 >> 8)&0xF8 ) | ( (mng_uint8)(iCg16>>8) >> 5) ); + *pScanline = (mng_uint8) ( ( (iCb16>>11) ) | (((mng_uint8)(iCg16>>8)&0xFC) << 3) ); + *pAlphaline = (mng_uint8)(iCa16 >> 8); + } + } + } + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; +iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + iBGa8 = *pAlphaline; + + if (iA8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iA8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *pAlphaline = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { + /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | (((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ((iGreen & 0xFC) << 3) ); + *pAlphaline = iA8; + } + else /* background not fully opaque */ + { + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iA8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) ); + *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ((iCg8 & 0xFC) << 3) ); + *pAlphaline = iCa8; + } + } + } + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_bgr565_a8 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pAlphaline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iA8, iBGa8, iCa8; + mng_uint8 iCr8, iCg8, iCb8; + + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row +starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pAlphaline = pAlphaline + pData->iCol + pData->iDestl; + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ((*(pDataline+1)>>5 ) ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ((*(pDataline+1)&0xFC ) << 3) ); + *pAlphaline = (mng_uint8)(*(pDataline+3)); + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + else /* Not fully opaque */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; +iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + iBGa8 = *pAlphaline; + + if (iA8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iA8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) ); + *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) ); + *pAlphaline = *(pDataline+3); + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { + /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 ); + iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | (((*pScanline) & 0xE0)>>3 ) ); + iBlue = (mng_uint8) ( (*pScanline << 3) ); + + MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) ); + *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ((iGreen & 0xFC) << 3) ); + *pAlphaline = iA8; + } + else /* background not fully opaque */ + { + MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iA8, + *pScanline, *(pScanline+1), *(pScanline+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) ); + *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ((iCg8 & 0xFC) << 3) ); + *pAlphaline = iCa8; + } + } + } + + pScanline += (pData->iColinc * 2); + pAlphaline += pData->iColinc; + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_BGR565_A8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGB555 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_rgb555 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+4) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) ); + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+4) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) ); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + + /* scale background up */ + iBGr16 = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iBGg16 = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBGb16 = (mng_uint8)( *(pScanline ) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8)( (mng_uint8)(((iFGb16 >> 8) & 0xF8) >> 1 ) | ( (mng_uint8)(iFGg16 >> 8) >> 6 ) ); + *pScanline = (mng_uint8)( (mng_uint8) ((iFGr16 >>11) >> 3 ) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_rgb555 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+2*iBps) & 0xF8) >> 1 ) | (*(pDataline+iBps) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+iBps) & 0xF8) << 2 ) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+4) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) ); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + + /* scale background up */ + iBGr16 = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iBGg16 = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBGb16 = (mng_uint8)( *(pScanline ) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8)( (mng_uint8)(((iFGb16 >> 8) & 0xF8) >> 1 ) | ( (mng_uint8)(iFGg16 >> 8) >> 6 ) ); + *pScanline = (mng_uint8)( (mng_uint8) ((iFGr16 >>11) >> 3 ) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_rgb555 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_RGB555 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGR555 +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE +mng_retcode mng_display_bgr555 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + if (pData->bIsRGBA16) /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); + else + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+4) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) ); + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+4) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) ); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + + /* scale background up */ + iBGb16 = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iBGg16 = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBGr16 = (mng_uint8)( *(pScanline ) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8)( (mng_uint8)(((iFGr16 >> 8) & 0xF8) >> 1 ) | ( (mng_uint8)(iFGg16 >> 8) >> 6 ) ); + *pScanline = (mng_uint8)( (mng_uint8) ((iFGb16 >>11) >> 3 ) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+0), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +mng_retcode mng_display_bgr555 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint16 iA16; + mng_uint16 iFGr16, iFGg16, iFGb16; + mng_uint16 iBGr16, iBGg16, iBGb16; + mng_uint8 iA8; + mng_uint8 iBps; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_START); +#endif + + iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1); + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + /* adjust source row starting-point */ + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1)); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+iBps) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2*iBps) >> 3 ) | ((*(pDataline+iBps) & 0xF8) << 2 ) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4*iBps; + } + } + else + { + if (pData->bIsRGBA16) /* 16-bit input row ? */ + { + + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA16 = mng_get_uint16 (pDataline+6); + + if (iA16) /* any opacity at all ? */ + { + if (iA16 == 0xFFFF) /* fully opaque ? */ + { /* scale down by dropping the LSB */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+4) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) ); + } + else + { /* get the proper values */ + iFGr16 = mng_get_uint16 (pDataline ); + iFGg16 = mng_get_uint16 (pDataline+2); + iFGb16 = mng_get_uint16 (pDataline+4); + + /* scale background up */ + iBGb16 = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iBGg16 = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBGr16 = (mng_uint8)( *(pScanline ) << 3 ); + + iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; + iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; + iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; + /* now compose */ + MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); + MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); + MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); + /* and return the composed values */ + *(pScanline+1) = (mng_uint8)( (mng_uint8)(((iFGr16 >> 8) & 0xF8) >> 1 ) | ( (mng_uint8)(iFGg16 >> 8) >> 6 ) ); + *pScanline = (mng_uint8)( (mng_uint8) ((iFGb16 >>11) >> 3 ) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 8; + } + } + else + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+0), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */ +#else /* MNG_NO_16BIT_SUPPORT */ +mng_retcode mng_display_bgr555 (mng_datap pData) +{ + mng_uint8p pScanline; + mng_uint8p pDataline; + mng_int32 iX; + mng_uint8 iA8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_START); +#endif + /* viewable row ? */ + if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb)) + { /* address destination row */ + pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData), + pData->iRow + pData->iDestt - + pData->iSourcet); + /* adjust destination row starting-point */ + pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2); + pDataline = pData->pRGBArow; /* address source row */ + + pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); + + if (pData->bIsOpaque) /* forget about transparency ? */ + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { /* copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + else + { + { + for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; + iX += pData->iColinc) + { + iA8 = *(pDataline+3); /* get alpha value */ + + if (iA8) /* any opacity at all ? */ + { + if (iA8 == 0xFF) /* fully opaque ? */ + { /* then simply copy the values */ + *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) ); + *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) ); + } + else + { /* do alpha composing */ + mng_uint8 iRed, iGreen, iBlue; + + iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 ); + iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) ); + iBlue = (mng_uint8)( *(pScanline ) << 3 ); + + MNG_COMPOSE8 (iRed, *(pDataline+0), iA8, iRed ); + MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen ); + MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue ); + + *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) ); + *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) ); + } + } + + pScanline += (pData->iColinc * 2); + pDataline += 4; + } + } + } + } + + check_update_region (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_SKIPCANVAS_BGR555 */ + + +#ifndef MNG_SKIPCHUNK_BACK +/* ************************************************************************** */ +/* * * */ +/* * Background restore routines - restore the background with info from * */ +/* * the BACK and/or bKGD chunk or the app's background canvas * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_restore_bkgd_backimage (mng_datap pData) +{ + /* save some stuff */ + mng_uint8p pRGBArow = pData->pRGBArow; + mng_int32 iRow = pData->iRow; + mng_int32 iRowsamples = pData->iRowsamples; + + mng_retcode iRetcode; /* work variables */ + mng_uint8p pTemp; + mng_uint8p pWork = pRGBArow; + mng_uint32 iX; + mng_int32 iZ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BACKIMAGE, MNG_LC_START); +#endif + /* determine row to retrieve */ + pData->iRow = pData->iDestt + iRow + pData->iBackimgoffsy; + + while (pData->iRow >= (mng_int32)pData->iBackimgheight) + pData->iRow -= (mng_int32)pData->iBackimgheight; + /* set width to that of background image */ + pData->iRowsamples = pData->iBackimgwidth; + /* retrieve into alternate buffer ! */ + pData->pRGBArow = pData->pPrevrow; + /* get it then */ + iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData); + + if (iRetcode) /* on error; bail out */ + return iRetcode; + /* we got the full row; but now need to + paste it into the proper location */ + iX = pData->iDestl - pData->iBackimgoffsx; + + while (iX >= pData->iBackimgwidth) + iX -= pData->iBackimgwidth; + +#ifndef MNG_NO_16BIT_SUPPORT + if (pData->bIsRGBA16) /* 16-bit buffer ? */ + { + pTemp = pData->pPrevrow + (iX << 3); + + for (iZ = (pData->iDestr - pData->iDestl); iZ > 0; iZ--) + { + MNG_COPY (pWork, pTemp, 8); + + pWork += 8; + pTemp += 8; + iX++; + /* reached end of bkgd-image line ? */ + if (iX >= pData->iBackimgwidth) + { + iX = 0; + pTemp = pData->pPrevrow; + } + } + } + else +#endif + { + pTemp = pData->pPrevrow + (iX << 2); + + for (iZ = (pData->iDestr - pData->iDestl); iZ > 0; iZ--) + { + MNG_COPY (pWork, pTemp, 4); + + pWork += 4; + pTemp += 4; + iX++; + /* reached end of bkgd-image line ? */ + if (iX >= pData->iBackimgwidth) + { + iX = 0; + pTemp = pData->pPrevrow; + } + } + } + + pData->pRGBArow = pRGBArow; /* restore original values */ + pData->iRow = iRow; + pData->iRowsamples = iRowsamples; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BACKIMAGE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_restore_bkgd_backcolor (mng_datap pData) +{ + mng_int32 iX; + mng_uint32p pWork32 = (mng_uint32p)pData->pRGBArow; + mng_uint32 iWrite; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BACKCOLOR, MNG_LC_START); +#endif + +#ifdef MNG_BIGENDIAN_SUPPORTED + /* fast way for big endian */ + iWrite = (((mng_uint8)(pData->iBACKred >> 8)) << 24) | + (((mng_uint8)(pData->iBACKgreen >> 8)) << 16) | + (((mng_uint8)(pData->iBACKblue >> 8)) << 8) | + ( 0xFF ); +#elif defined(MNG_LITTLEENDIAN_SUPPORTED) + /* fast way for little endian */ + iWrite = ( 0xFF << 24) | + (((mng_uint8)(pData->iBACKblue >> 8)) << 16) | + (((mng_uint8)(pData->iBACKgreen >> 8)) << 8) | + (((mng_uint8)(pData->iBACKred >> 8)) ); +#else + /* generic way, works on all platforms */ + /* put the data in memory in the correct order */ + { + mng_uint8 aBytes[4]; + aBytes[0] = (mng_uint8)(pData->iBACKred >> 8); + aBytes[1] = (mng_uint8)(pData->iBACKgreen >> 8); + aBytes[2] = (mng_uint8)(pData->iBACKblue >> 8); + aBytes[3] = 0xFF; + /* load that data into a register */ + iWrite = *(mng_uint32*) aBytes; + } +#endif + /* ok; drop the background-color in there */ + for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--) + *pWork32++ = iWrite; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BACKCOLOR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_bKGD +mng_retcode mng_restore_bkgd_bkgd (mng_datap pData) +{ + mng_int32 iX; + mng_uint8p pWork = pData->pRGBArow; + mng_imagep pImage = (mng_imagep)pData->pCurrentobj; + mng_imagedatap pBuf = pImage->pImgbuf; + mng_uint8 iRed = 0; + mng_uint8 iGreen = 0; + mng_uint8 iBlue = 0; + mng_uint32p pWork32 = (mng_uint32p)pWork; + mng_uint32 iWrite; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BKGD, MNG_LC_START); +#endif + + switch (pBuf->iColortype) + { + case 0 : ; /* gray types */ + case 4 : { + mng_uint8 iGray; + +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth > 8) + iGray = (mng_uint8)(pBuf->iBKGDgray >> 8); + else +#endif + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + /* LBR scaling */ + mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1}; + iGray = (mng_uint8)(multiplier[pBuf->iBitdepth] * pBuf->iBKGDgray); +#else + iGray = (mng_uint8)pBuf->iBKGDgray; +#endif + } + + iRed = iGray; + iGreen = iGray; + iBlue = iGray; + + break; + } + + case 3 : { /* indexed type */ + iRed = pBuf->aPLTEentries [pBuf->iBKGDindex].iRed; + iGreen = pBuf->aPLTEentries [pBuf->iBKGDindex].iGreen; + iBlue = pBuf->aPLTEentries [pBuf->iBKGDindex].iBlue; + + break; + } + + case 2 : ; /* rgb types */ + case 6 : { +#ifndef MNG_NO_16BIT_SUPPORT + if (pBuf->iBitdepth > 8) + { + iRed = (mng_uint8)(pBuf->iBKGDred >> 8); + iGreen = (mng_uint8)(pBuf->iBKGDgreen >> 8); + iBlue = (mng_uint8)(pBuf->iBKGDblue >> 8); + } + else +#endif + { + iRed = (mng_uint8)(pBuf->iBKGDred ); + iGreen = (mng_uint8)(pBuf->iBKGDgreen); + iBlue = (mng_uint8)(pBuf->iBKGDblue ); + } + + break; + } + } + +#ifdef MNG_BIGENDIAN_SUPPORTED + /* fast way for big endian */ + iWrite = (iRed << 24) | + (iGreen << 16) | + (iBlue << 8); +#elif defined(MNG_LITTLEENDIAN_SUPPORTED) + /* fast way for little endian */ + iWrite = (iBlue << 16) | + (iGreen << 8) | + (iRed ); +#else + /* generic way, works on all platforms */ + /* put the data in memory in the correct order */ + { + mng_uint8 aBytes[4]; + aBytes[0] = (mng_uint8)(iRed); + aBytes[1] = (mng_uint8)(iGreen); + aBytes[2] = (mng_uint8)(iBlue); + aBytes[3] = 0x00; + /* load that data into a register */ + iWrite = *(mng_uint32*) aBytes; + } +#endif + /* ok; drop it in there */ + for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--) + *pWork32++ = iWrite; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_restore_bkgd_bgcolor (mng_datap pData) +{ + mng_int32 iX; + mng_uint32p pWork32 = (mng_uint32p)pData->pRGBArow; + mng_uint32 iWrite; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BGCOLOR, MNG_LC_START); +#endif + +#ifdef MNG_BIGENDIAN_SUPPORTED + /* fast way for big endian */ + iWrite = (((mng_uint8)(pData->iBGred >> 8)) << 24) | + (((mng_uint8)(pData->iBGgreen >> 8)) << 16) | + (((mng_uint8)(pData->iBGblue >> 8)) << 8); +#elif defined(MNG_LITTLEENDIAN_SUPPORTED) + /* fast way for little endian */ + iWrite = (((mng_uint8)(pData->iBGblue >> 8)) << 16) | + (((mng_uint8)(pData->iBGgreen >> 8)) << 8) | + (((mng_uint8)(pData->iBGred >> 8)) ); +#else + /* generic way, works on all platforms */ + /* put the data in memory in the correct order */ + { + mng_uint8 aBytes[4]; + aBytes[0] = (mng_uint8)(pData->iBGred >> 8); + aBytes[1] = (mng_uint8)(pData->iBGgreen >> 8); + aBytes[2] = (mng_uint8)(pData->iBGblue >> 8); + aBytes[3] = 0x00; + /* load that data into a register */ + iWrite = *(mng_uint32*) aBytes; + } +#endif + /* ok; drop the background-color in there */ + for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--) + *pWork32++ = iWrite; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BGCOLOR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGB8 +mng_retcode mng_restore_bkgd_rgb8 (mng_datap pData) +{ + mng_int32 iX; + mng_uint8p pBkgd; + mng_uint8p pWork = pData->pRGBArow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_RGB8, MNG_LC_START); +#endif + + if (pData->fGetbkgdline) /* can we access the background ? */ + { /* point to the right pixel then */ + pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData, + pData->iRow + pData->iDestt) + + (3 * pData->iDestl); + + for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--) + { + *pWork = *pBkgd; /* ok; copy the pixel */ + *(pWork+1) = *(pBkgd+1); + *(pWork+2) = *(pBkgd+2); + *(pWork+3) = 0x00; /* transparant for alpha-canvasses */ + + pWork += 4; + pBkgd += 3; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SKIPCANVAS_RGB8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGR8 +mng_retcode mng_restore_bkgd_bgr8 (mng_datap pData) +{ + mng_int32 iX; + mng_uint8p pBkgd; + mng_uint8p pWork = pData->pRGBArow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BGR8, MNG_LC_START); +#endif + + if (pData->fGetbkgdline) /* can we access the background ? */ + { /* point to the right pixel then */ + pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData, + pData->iRow + pData->iDestt) + + (3 * pData->iDestl); + + for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--) + { + *pWork = *(pBkgd+2); /* ok; copy the pixel */ + *(pWork+1) = *(pBkgd+1); + *(pWork+2) = *pBkgd; + *(pWork+3) = 0x00; /* transparant for alpha-canvasses */ + + pWork += 4; + pBkgd += 3; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BGR8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SKIPCANVAS_BGR8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGRX8 +mng_retcode mng_restore_bkgd_bgrx8 (mng_datap pData) +{ + mng_int32 iX; + mng_uint8p pBkgd; + mng_uint8p pWork = pData->pRGBArow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BGRX8, MNG_LC_START); +#endif + + if (pData->fGetbkgdline) /* can we access the background ? */ + { /* point to the right pixel then */ + pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData, + pData->iRow + pData->iDestt) + + (3 * pData->iDestl); + + for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--) + { + *pWork = *(pBkgd+2); /* ok; copy the pixel */ + *(pWork+1) = *(pBkgd+1); + *(pWork+2) = *pBkgd; + *(pWork+3) = 0x00; /* transparant for alpha-canvasses */ + + pWork += 4; + pBkgd += 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BGRX8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SKIPCANVAS_BGRX8 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_BGR565 +mng_retcode mng_restore_bkgd_bgr565 (mng_datap pData) +{ + mng_int32 iX; + mng_uint8p pBkgd; + mng_uint8p pWork = pData->pRGBArow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BGR565, MNG_LC_START); +#endif + + if (pData->fGetbkgdline) /* can we access the background ? */ + { /* point to the right pixel then */ + pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData, + pData->iRow + pData->iDestt) + + (3 * pData->iDestl); + + for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--) + { + *pWork = (mng_uint8)( *(pBkgd+1) & 0xF8); /* ok; copy the pixel */ + *(pWork+1) = (mng_uint8)( (*(pBkgd+1) << 5 ) | ( ((*pBkgd)&0xE0)>>3 ) ); + *(pWork+2) = (mng_uint8)( *(pBkgd) << 3 ); + *(pWork+3) = 0x00; /* transparant for alpha-canvasses */ + + pWork += 4; + pBkgd += 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_BGR565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SKIPCANVAS_BGR565 */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGB565 +mng_retcode mng_restore_bkgd_rgb565 (mng_datap pData) +{ + mng_int32 iX; + mng_uint8p pBkgd; + mng_uint8p pWork = pData->pRGBArow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_RGB565, MNG_LC_START); +#endif + + if (pData->fGetbkgdline) /* can we access the background ? */ + { /* point to the right pixel then */ + pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData, + pData->iRow + pData->iDestt) + + (3 * pData->iDestl); + + for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--) + { + *pWork = (mng_uint8)( *(pBkgd)&0xF8); /* ok; copy the pixel */ + *(pWork+1) = (mng_uint8)( (*(pBkgd+1) << 5) | ( ((*pBkgd)&0xE0)>>3 ) ); + *(pWork+2) = (mng_uint8)( *(pBkgd+1) << 3); + *(pWork+3) = 0x00; /* transparant for alpha-canvasses */ + + pWork += 4; + pBkgd += 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RESTORE_RGB565, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SKIPCANVAS_RBB565 */ + + +/* ************************************************************************** */ +/* * * */ +/* * Row retrieval routines - retrieve processed & uncompressed row-data * */ +/* * from the current "object" * */ +/* * * */ +/* ************************************************************************** */ + +/* TODO: a serious optimization is to retrieve only those pixels that will + actually be displayed; this would require changes in + the "display_image" routine (in mng_display.c) & + all the "retrieve_xxx" routines below & + the "display_xxx" routines above !!!!! + NOTE that "correct_xxx" routines would not require modification */ + +mng_retcode mng_retrieve_g8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iG; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_G8, MNG_LC_START); +#endif + + pRGBArow = pData->pRGBArow; /* temporary work pointers */ + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + + if (pBuf->bHasTRNS) /* tRNS in buffer ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iG = *pWorkrow; /* get the gray-value */ + /* is it transparent ? */ + if ((mng_uint16)iG == pBuf->iTRNSgray) + { + *pRGBArow = 0x00; /* nuttin to display */ + *(pRGBArow+1) = 0x00; + *(pRGBArow+2) = 0x00; + *(pRGBArow+3) = 0x00; + } + else + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1}; + iG = (mng_uint8)(iG * multiplier[pBuf->iBitdepth]); +#endif + + *pRGBArow = iG; /* put in intermediate row */ + *(pRGBArow+1) = iG; + *(pRGBArow+2) = iG; + *(pRGBArow+3) = 0xFF; + } + + pWorkrow++; /* next pixel */ + pRGBArow += 4; + } + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1}; /* LBR scaling */ + iG = (mng_uint8)(multiplier[pBuf->iBitdepth] * *pWorkrow); +#else + iG = *pWorkrow; /* get the gray-value */ +#endif + + *pRGBArow = iG; /* put in intermediate row */ + *(pRGBArow+1) = iG; + *(pRGBArow+2) = iG; + *(pRGBArow+3) = 0xFF; + + pWorkrow++; /* next pixel */ + pRGBArow += 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_retrieve_g16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint16 iG; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_G16, MNG_LC_START); +#endif + /* temporary work pointers */ + pRGBArow = pData->pRGBArow; + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + + if (pBuf->bHasTRNS) /* tRNS in buffer ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iG = mng_get_uint16 (pWorkrow); /* get the gray-value */ + /* is it transparent ? */ + if (iG == pBuf->iTRNSgray) + { /* nuttin to display */ + mng_put_uint16 (pRGBArow, 0x0000); + mng_put_uint16 (pRGBArow+2, 0x0000); + mng_put_uint16 (pRGBArow+4, 0x0000); + mng_put_uint16 (pRGBArow+6, 0x0000); + } + else + { /* put in intermediate row */ + mng_put_uint16 (pRGBArow, iG); + mng_put_uint16 (pRGBArow+2, iG); + mng_put_uint16 (pRGBArow+4, iG); + mng_put_uint16 (pRGBArow+6, 0xFFFF); + } + + pWorkrow += 2; /* next pixel */ + pRGBArow += 8; + } + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iG = mng_get_uint16 (pWorkrow); /* get the gray-value */ + + mng_put_uint16 (pRGBArow, iG); /* and put in intermediate row */ + mng_put_uint16 (pRGBArow+2, iG); + mng_put_uint16 (pRGBArow+4, iG); + mng_put_uint16 (pRGBArow+6, 0xFFFF); + + pWorkrow += 2; /* next pixel */ + pRGBArow += 8; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_retrieve_rgb8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iR, iG, iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_RGB8, MNG_LC_START); +#endif + + pRGBArow = pData->pRGBArow; /* temporary work pointers */ + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + + if (pBuf->bHasTRNS) /* tRNS in buffer ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iR = *pWorkrow; /* get the rgb-values */ + iG = *(pWorkrow+1); + iB = *(pWorkrow+2); + /* is it transparent ? */ + if (((mng_uint16)iR == pBuf->iTRNSred ) && + ((mng_uint16)iG == pBuf->iTRNSgreen) && + ((mng_uint16)iB == pBuf->iTRNSblue ) ) + { + *pRGBArow = 0x00; /* nothing to display */ + *(pRGBArow+1) = 0x00; + *(pRGBArow+2) = 0x00; + *(pRGBArow+3) = 0x00; + } + else + { + *pRGBArow = iR; /* put in intermediate row */ + *(pRGBArow+1) = iG; + *(pRGBArow+2) = iB; + *(pRGBArow+3) = 0xFF; + } + + pWorkrow += 3; /* next pixel */ + pRGBArow += 4; + } + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pRGBArow = *pWorkrow; /* just copy the pixel */ + *(pRGBArow+1) = *(pWorkrow+1); + *(pRGBArow+2) = *(pWorkrow+2); + *(pRGBArow+3) = 0xFF; + + pWorkrow += 3; /* next pixel */ + pRGBArow += 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_retrieve_rgb16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint16 iR, iG, iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_RGB16, MNG_LC_START); +#endif + /* temporary work pointers */ + pRGBArow = pData->pRGBArow; + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + + if (pBuf->bHasTRNS) /* tRNS in buffer ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iR = mng_get_uint16 (pWorkrow); /* get the rgb-values */ + iG = mng_get_uint16 (pWorkrow+2); + iB = mng_get_uint16 (pWorkrow+4); + /* is it transparent ? */ + if ((iR == pBuf->iTRNSred ) && + (iG == pBuf->iTRNSgreen) && + (iB == pBuf->iTRNSblue ) ) + { /* nothing to display */ + mng_put_uint16 (pRGBArow, 0x0000); + mng_put_uint16 (pRGBArow+2, 0x0000); + mng_put_uint16 (pRGBArow+4, 0x0000); + mng_put_uint16 (pRGBArow+6, 0x0000); + } + else + { /* put in intermediate row */ + mng_put_uint16 (pRGBArow, iR); + mng_put_uint16 (pRGBArow+2, iG); + mng_put_uint16 (pRGBArow+4, iB); + mng_put_uint16 (pRGBArow+6, 0xFFFF); + } + + pWorkrow += 6; /* next pixel */ + pRGBArow += 8; + } + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* just copy the pixel */ + mng_put_uint16 (pRGBArow, mng_get_uint16 (pWorkrow )); + mng_put_uint16 (pRGBArow+2, mng_get_uint16 (pWorkrow+2)); + mng_put_uint16 (pRGBArow+4, mng_get_uint16 (pWorkrow+4)); + mng_put_uint16 (pRGBArow+6, 0xFFFF); + + pWorkrow += 6; /* next pixel */ + pRGBArow += 8; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_retrieve_idx8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_IDX8, MNG_LC_START); +#endif + + pRGBArow = pData->pRGBArow; /* temporary work pointers */ + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + + if (pBuf->bHasTRNS) /* tRNS in buffer ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iQ = *pWorkrow; /* get the index */ + /* is it valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + *pRGBArow = pBuf->aPLTEentries [iQ].iRed; + *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen; + *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue; + /* transparency for this index ? */ + if ((mng_uint32)iQ < pBuf->iTRNScount) + *(pRGBArow+3) = pBuf->aTRNSentries [iQ]; + else + *(pRGBArow+3) = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pWorkrow++; /* next pixel */ + pRGBArow += 4; + } + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iQ = *pWorkrow; /* get the index */ + /* is it valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + *pRGBArow = pBuf->aPLTEentries [iQ].iRed; + *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen; + *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue; + *(pRGBArow+3) = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pWorkrow++; /* next pixel */ + pRGBArow += 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_IDX8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_retrieve_ga8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iG; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_GA8, MNG_LC_START); +#endif + + pRGBArow = pData->pRGBArow; /* temporary work pointers */ + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iG = *pWorkrow; /* get the gray-value */ + *pRGBArow = iG; /* put in intermediate row */ + *(pRGBArow+1) = iG; + *(pRGBArow+2) = iG; + *(pRGBArow+3) = *(pWorkrow+1); + + pWorkrow += 2; /* next pixel */ + pRGBArow += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_GA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_retrieve_ga16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint16 iG; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_GA16, MNG_LC_START); +#endif + /* temporary work pointers */ + pRGBArow = pData->pRGBArow; + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iG = mng_get_uint16 (pWorkrow); /* get the gray-value */ + + mng_put_uint16 (pRGBArow, iG); /* and put in intermediate row */ + mng_put_uint16 (pRGBArow+2, iG); + mng_put_uint16 (pRGBArow+4, iG); + mng_put_uint16 (pRGBArow+6, mng_get_uint16 (pWorkrow+2)); + + pWorkrow += 4; /* next pixel */ + pRGBArow += 8; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_retrieve_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_RGBA8, MNG_LC_START); +#endif + + pRGBArow = pData->pRGBArow; /* temporary work pointers */ + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + /* can't be easier than this ! */ + MNG_COPY (pRGBArow, pWorkrow, pBuf->iRowsize); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_retrieve_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_RGBA16, MNG_LC_START); +#endif + /* temporary work pointers */ + pRGBArow = pData->pRGBArow; + pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize); + /* can't be easier than this ! */ + MNG_COPY (pRGBArow, pWorkrow, pBuf->iRowsize); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RETRIEVE_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row storage routines - store processed & uncompressed row-data * */ +/* * into the current "object" * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_g1 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G1, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* is it white ? */ + *pOutrow = 0x01; /* white */ + else + *pOutrow = 0x00; /* black */ + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 1; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_store_g2 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G2, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + + iQ = (mng_uint8)((iB & iM) >> iS); /* get the gray level */ + *pOutrow = iQ; /* put in object buffer */ + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 2; + iS -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_store_g4 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G4, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + + iQ = (mng_uint8)((iB & iM) >> iS); /* get the gray level */ + *pOutrow = iQ; /* put in object buffer */ + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 4; + iS -= 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_store_g8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + + pOutrow += pData->iColinc; /* next pixel */ + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_g16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* copy into object buffer */ + mng_put_uint16 (pOutrow, mng_get_uint16 (pWorkrow)); + + pOutrow += (pData->iColinc << 1); /* next pixel */ + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_store_rgb8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_RGB8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* copy the RGB bytes */ + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + + pWorkrow += 3; /* next pixel */ + pOutrow += (pData->iColinc * 3); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_rgb16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_RGB16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + MNG_COPY (pOutrow, pWorkrow, 6); /* copy the RGB bytes */ + + pWorkrow += 6; /* next pixel */ + pOutrow += (pData->iColinc * 6); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_idx1 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_IDX1, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* store the index */ + *pOutrow = 0x01; + else + *pOutrow = 0x00; + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 1; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_IDX1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_store_idx2 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_IDX2, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + /* store the index */ + *pOutrow = (mng_uint8)((iB & iM) >> iS); + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 2; + iS -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_IDX2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_store_idx4 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_IDX4, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* store the index */ + *pOutrow = (mng_uint8)((iB & iM) >> iS); + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 4; + iS -= 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_IDX4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_store_idx8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_IDX8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + + pOutrow += pData->iColinc; /* next pixel */ + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_IDX8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_store_ga8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_GA8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* copy the GA bytes */ + *(pOutrow+1) = *(pWorkrow+1); + + pWorkrow += 2; /* next pixel */ + pOutrow += (pData->iColinc << 1); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_GA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_ga16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_GA16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + MNG_COPY (pOutrow, pWorkrow, 4); /* copy the GA bytes */ + + pWorkrow += 4; /* next pixel */ + pOutrow += (pData->iColinc << 2); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_store_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_RGBA8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* copy the RGBA bytes */ + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + *(pOutrow+3) = *(pWorkrow+3); + + pWorkrow += 4; /* next pixel */ + pOutrow += (pData->iColinc << 2); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_RGBA16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + MNG_COPY (pOutrow, pWorkrow, 8); /* copy the RGBA bytes */ + + pWorkrow += 8; /* next pixel */ + pOutrow += (pData->iColinc << 3); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row storage routines (JPEG) - store processed & uncompressed row-data * */ +/* * into the current "object" * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_g8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8, MNG_LC_START); +#endif + + pWorkrow = pData->pJPEGrow; /* temporary work pointers */ + pOutrow = pBuf->pImgdata + (pData->iJPEGrow * pBuf->iRowsize); + /* easy as pie ... */ + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8, MNG_LC_END); +#endif + + return mng_next_jpeg_row (pData); /* we've got one more row of gray-samples */ +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_rgb8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; +#if RGB_PIXELSIZE != 3 + mng_int32 iX; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8, MNG_LC_START); +#endif + + pWorkrow = pData->pJPEGrow; /* temporary work pointers */ + pOutrow = pBuf->pImgdata + (pData->iJPEGrow * pBuf->iRowsize); + +#if RGB_PIXELSIZE == 3 + /* easy as pie ... */ + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples * 3); +#else +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* copy pixel into object buffer */ + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + + pOutrow += 3; /* next pixel */ + pWorkrow += RGB_PIXELSIZE; + } +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8, MNG_LC_END); +#endif + + return mng_next_jpeg_row (pData); /* we've got one more row of rgb-samples */ +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_ga8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_GA8, MNG_LC_START); +#endif + + pWorkrow = pData->pJPEGrow; /* temporary work pointers */ + pOutrow = pBuf->pImgdata + (pData->iJPEGrow * pBuf->iRowsize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* copy into object buffer */ + + pOutrow += 2; /* next pixel */ + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_GA8, MNG_LC_END); +#endif + + return mng_next_jpeg_row (pData); /* we've got one more row of gray-samples */ +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGBA8, MNG_LC_START); +#endif + + pWorkrow = pData->pJPEGrow; /* temporary work pointers */ + pOutrow = pBuf->pImgdata + (pData->iJPEGrow * pBuf->iRowsize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* copy pixel into object buffer */ + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + + pOutrow += 4; /* next pixel */ + pWorkrow += RGB_PIXELSIZE; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGBA8, MNG_LC_END); +#endif + + return mng_next_jpeg_row (pData); /* we've got one more row of rgb-samples */ +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_g8_alpha (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_ALPHA, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pJPEGrow2; + pOutrow = pBuf->pImgdata + (pData->iJPEGalpharow * pBuf->iRowsize) + 1; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + + pOutrow += 2; /* next pixel */ + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_ALPHA, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_rgb8_alpha (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_ALPHA, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pJPEGrow2; + pOutrow = pBuf->pImgdata + (pData->iJPEGalpharow * pBuf->iRowsize) + 3; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + + pOutrow += 4; /* next pixel */ + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_ALPHA, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_jpeg_g8_a1 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A1, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 1; + iM = 0; /* start at pixel 0 */ + iB = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* is it opaque ? */ + *pOutrow = 0xFF; /* opaque */ + else + *pOutrow = 0x00; /* transparent */ + + pOutrow += 2; /* next pixel */ + iM >>= 1; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A1, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_g8_a2 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A2, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 1; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + { + const mng_uint8 alpha_level[4] = { 0x00, 0x55, 0xAA, 0xFF}; + *pOutrow = alpha_level[((iB & iM) >> iS)] ; + } +#else + switch ((iB & iM) >> iS) /* determine the alpha level */ + { + case 0x03 : { *pOutrow = 0xFF; break; } + case 0x02 : { *pOutrow = 0xAA; break; } + case 0x01 : { *pOutrow = 0x55; break; } + default : { *pOutrow = 0x00; } + } +#endif + + pOutrow += 2; /* next pixel */ + iM >>= 2; + iS -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A2, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_g8_a4 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A4, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 1; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the alpha level */ + iQ = (mng_uint8)((iB & iM) >> iS); + iQ = (mng_uint8)(iQ + (iQ << 4)); /* expand to 8-bit by replication */ + + *pOutrow = iQ; /* put in object buffer */ + + pOutrow += 2; /* next pixel */ + iM >>= 4; + iS -= 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A4, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_g8_a8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 1; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + + pOutrow += 2; /* next pixel */ + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A8, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_jpeg_g8_a16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 1; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* only high-order byte! */ + + pOutrow += 2; /* next pixel */ + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A16, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_jpeg_rgb8_a1 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A1, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 3; + iM = 0; /* start at pixel 0 */ + iB = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* is it opaque ? */ + *pOutrow = 0xFF; /* opaque */ + else + *pOutrow = 0x00; /* transparent */ + + pOutrow += 4; /* next pixel */ + iM >>= 1; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A1, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_rgb8_a2 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A2, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 3; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + { + const mng_uint8 alpha_level[4] = { 0x00, 0x55, 0xAA, 0xFF}; + *pOutrow = alpha_level[((iB & iM) >> iS)] ; + } +#else + switch ((iB & iM) >> iS) /* determine the alpha level */ + { + case 0x03 : { *pOutrow = 0xFF; break; } + case 0x02 : { *pOutrow = 0xAA; break; } + case 0x01 : { *pOutrow = 0x55; break; } + default : { *pOutrow = 0x00; } + } +#endif + + pOutrow += 4; /* next pixel */ + iM >>= 2; + iS -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A2, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_rgb8_a4 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A4, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 3; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the alpha level */ + iQ = (mng_uint8)((iB & iM) >> iS); + iQ = (mng_uint8)(iQ + (iQ << 4)); /* expand to 8-bit by replication */ + + *pOutrow = iQ; /* put in object buffer */ + + pOutrow += 4; /* next pixel */ + iM >>= 4; + iS -= 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A4, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_store_jpeg_rgb8_a8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 3; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in buffer */ + + pOutrow += 4; /* next pixel */ + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A8, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_jpeg_rgb8_a16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 3; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* only high-order byte */ + + pOutrow += 4; /* next pixel */ + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A16, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_JPEG12 +mng_retcode mng_store_jpeg_g12_a1 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A1, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 2; + iM = 0; /* start at pixel 0 */ + iB = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* opaque ? */ + mng_put_uint16 (pOutrow, 0xFFFF);/* opaque */ + else + mng_put_uint16 (pOutrow, 0x0000);/* transparent */ + + pOutrow += 4; /* next pixel */ + iM >>= 1; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A1, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif /* MNG_SUPPORT_JPEG12 */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_JPEG12 +mng_retcode mng_store_jpeg_g12_a2 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A2, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 2; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + { + const mng_uint16 gray_level[4] = { 0x0000, 0x5555, 0xAAAA, 0xFFFF}; + mng_put_uint16 (pOutrow, gray_level[((iB & iM) >> iS)]) ; + } +#else + switch ((iB & iM) >> iS) /* determine the gray level */ + { + case 0x03 : { mng_put_uint16 (pOutrow, 0xFFFF); break; } + case 0x02 : { mng_put_uint16 (pOutrow, 0xAAAA); break; } + case 0x01 : { mng_put_uint16 (pOutrow, 0x5555); break; } + default : { mng_put_uint16 (pOutrow, 0x0000); } + } +#endif + + pOutrow += 4; /* next pixel */ + iM >>= 2; + iS -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A2, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif /* MNG_SUPPORT_JPEG12 */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_JPEG12 +mng_retcode mng_store_jpeg_g12_a4 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint16 iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A4, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 2; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the gray level */ + iQ = (mng_uint16)((iB & iM) >> iS); + iQ = (mng_uint16)(iQ + (iQ << 4)); /* expand to 16-bit by replication */ + iQ = (mng_uint16)(iQ + (iQ << 8)); + /* put in object buffer */ + mng_put_uint16 (pOutrow, iQ); + + pOutrow += 4; /* next pixel */ + iM >>= 4; + iS -= 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A4, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif /* MNG_SUPPORT_JPEG12 */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_JPEG12 +mng_retcode mng_store_jpeg_g12_a8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 2; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iW = (mng_uint16)(*pWorkrow); /* get input byte */ + iW = (mng_uint16)(iW + (iW << 8)); /* expand to 16-bit by replication */ + + mng_put_uint16 (pOutrow, iW); /* put in object buffer */ + + pOutrow += 4; /* next pixel */ + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A8, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif /* MNG_SUPPORT_JPEG12 */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_JPEG12 +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_jpeg_g12_a16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 2; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* copy it */ + mng_put_uint16 (pOutrow, mng_get_uint16 (pWorkrow)); + + pOutrow += 4; /* next pixel */ + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A16, MNG_LC_END); +#endif + /* we've got one more row of alpha-samples */ + return mng_next_jpeg_alpharow (pData); +} +#endif +#endif /* MNG_SUPPORT_JPEG12 */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_JNG */ + +#ifndef MNG_NO_DELTA_PNG +/* ************************************************************************** */ +/* * * */ +/* * Delta-image row routines - apply the processed & uncompressed row-data * */ +/* * onto the target "object" * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_delta_g1 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G1, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* is it white ? */ + *pOutrow = 0xFF; /* white */ + else + *pOutrow = 0x00; /* black */ + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 1; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* invert if it is white ? */ + *pOutrow = (mng_uint8)(*pOutrow ^ 0xFF); + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 1; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G1, MNG_LC_END); +#endif + + return mng_store_g1 (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_g2 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + const mng_uint8 level[4] = { 0x00, 0x55, 0xAA, 0xFF}; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G2, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + *pOutrow = level[((iB & iM) >> iS)] ; +#else + switch ((iB & iM) >> iS) /* determine the alpha level */ + { + case 0x03 : { *pOutrow = 0xFF; break; } + case 0x02 : { *pOutrow = 0xAA; break; } + case 0x01 : { *pOutrow = 0x55; break; } + default : { *pOutrow = 0x00; } + } +#endif + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 2; + iS -= 2; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + *pOutrow = level[((*pOutrow >> 6) + ((iB & iM) >> iS)) & 0x03] ; +#else + switch (((*pOutrow >> 6) + ((iB & iM) >> iS)) & 0x03) + { + case 0x03 : { *pOutrow = 0xFF; break; } + case 0x02 : { *pOutrow = 0xAA; break; } + case 0x01 : { *pOutrow = 0x55; break; } + default : { *pOutrow = 0x00; } + } +#endif + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 2; + iS -= 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G2, MNG_LC_END); +#endif + + return mng_store_g2 (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_g4 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G4, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the gray level */ + iQ = (mng_uint8)((iB & iM) >> iS); + /* expand to 8-bit by replication */ + iQ = (mng_uint8)(iQ + (iQ << 4)); + + *pOutrow = iQ; /* put in object buffer */ + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 4; + iS -= 4; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the gray level */ + iQ = (mng_uint8)(((*pOutrow >> 4) + ((iB & iM) >> iS)) & 0x0F); + /* expand to 8-bit by replication */ + iQ = (mng_uint8)(iQ + (iQ << 4)); + + *pOutrow = iQ; /* put in object buffer */ + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 4; + iS -= 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G4, MNG_LC_END); +#endif + + return mng_store_g4 (pData); +} +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_delta_g8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + + pOutrow += pData->iColinc; /* next pixel */ + pWorkrow++; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow); + + pOutrow += pData->iColinc; /* next pixel */ + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G8, MNG_LC_END); +#endif + + return mng_store_g8 (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_g16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + *(pOutrow+1) = *(pWorkrow+1); + /* next pixel */ + pOutrow += (pData->iColinc << 1); + pWorkrow += 2; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + mng_put_uint16 (pOutrow, (mng_uint16)(mng_get_uint16 (pOutrow ) + + mng_get_uint16 (pWorkrow) )); + /* next pixel */ + pOutrow += (pData->iColinc << 1); + pWorkrow += 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G16, MNG_LC_END); +#endif + + return mng_store_g16 (pData); +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_delta_rgb8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGB8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + /* next pixel */ + pOutrow += (pData->iColinc * 3); + pWorkrow += 3; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow ); + *(pOutrow+1) = (mng_uint8)(*(pOutrow+1) + *(pWorkrow+1)); + *(pOutrow+2) = (mng_uint8)(*(pOutrow+2) + *(pWorkrow+2)); + /* next pixel */ + pOutrow += (pData->iColinc * 3); + pWorkrow += 3; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGB8, MNG_LC_END); +#endif + + return mng_store_rgb8 (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_rgb16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGB16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + *(pOutrow+3) = *(pWorkrow+3); + *(pOutrow+4) = *(pWorkrow+4); + *(pOutrow+5) = *(pWorkrow+5); + /* next pixel */ + pOutrow += (pData->iColinc * 6); + pWorkrow += 6; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + mng_put_uint16 (pOutrow, (mng_uint16)(mng_get_uint16 (pOutrow ) + + mng_get_uint16 (pWorkrow ) )); + mng_put_uint16 (pOutrow+2, (mng_uint16)(mng_get_uint16 (pOutrow+2 ) + + mng_get_uint16 (pWorkrow+2) )); + mng_put_uint16 (pOutrow+4, (mng_uint16)(mng_get_uint16 (pOutrow+4 ) + + mng_get_uint16 (pWorkrow+4) )); + /* next pixel */ + pOutrow += (pData->iColinc * 6); + pWorkrow += 6; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGB16, MNG_LC_END); +#endif + + return mng_store_rgb16 (pData); +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_delta_idx1 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_IDX1, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* put the right index value */ + *pOutrow = 1; + else + *pOutrow = 0; + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 1; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* invert if it is non-zero index */ + *pOutrow = (mng_uint8)(*pOutrow ^ 0x01); + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 1; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_IDX1, MNG_LC_END); +#endif + + return mng_store_idx1 (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_idx2 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_IDX2, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + /* put the index */ + *pOutrow = (mng_uint8)((iB & iM) >> iS); + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 2; + iS -= 2; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + /* calculate the index */ + *pOutrow = (mng_uint8)((*pOutrow + ((iB & iM) >> iS)) & 0x03); + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 2; + iS -= 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_IDX2, MNG_LC_END); +#endif + + return mng_store_idx2 (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_idx4 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_IDX4, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* put the index */ + *pOutrow = (mng_uint8)((iB & iM) >> iS); + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 4; + iS -= 4; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* calculate the index */ + *pOutrow = (mng_uint8)((*pOutrow + ((iB & iM) >> iS)) & 0x0F); + + pOutrow += pData->iColinc; /* next pixel */ + iM >>= 4; + iS -= 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_IDX4, MNG_LC_END); +#endif + + return mng_store_idx4 (pData); +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_delta_idx8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_IDX8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + + pOutrow += pData->iColinc; /* next pixel */ + pWorkrow++; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow); + + pOutrow += pData->iColinc; /* next pixel */ + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_IDX8, MNG_LC_END); +#endif + + return mng_store_idx8 (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_ga8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + *(pOutrow+1) = *(pWorkrow+1); + /* next pixel */ + pOutrow += (pData->iColinc << 1); + pWorkrow += 2; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow ); + *(pOutrow+1) = (mng_uint8)(*(pOutrow+1) + *(pWorkrow+1)); + /* next pixel */ + pOutrow += (pData->iColinc << 1); + pWorkrow += 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA8, MNG_LC_END); +#endif + + return mng_store_ga8 (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_ga16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + *(pOutrow+3) = *(pWorkrow+3); + /* next pixel */ + pOutrow += (pData->iColinc << 2); + pWorkrow += 4; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + mng_put_uint16 (pOutrow, (mng_uint16)(mng_get_uint16 (pOutrow ) + + mng_get_uint16 (pWorkrow ) )); + mng_put_uint16 (pOutrow+2, (mng_uint16)(mng_get_uint16 (pOutrow+2 ) + + mng_get_uint16 (pWorkrow+2) )); + /* next pixel */ + pOutrow += (pData->iColinc << 2); + pWorkrow += 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA16, MNG_LC_END); +#endif + + return mng_store_ga16 (pData); +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_delta_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; /* put in object buffer */ + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + *(pOutrow+3) = *(pWorkrow+3); + /* next pixel */ + pOutrow += (pData->iColinc << 2); + pWorkrow += 4; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow ); + *(pOutrow+1) = (mng_uint8)(*(pOutrow+1) + *(pWorkrow+1)); + *(pOutrow+2) = (mng_uint8)(*(pOutrow+2) + *(pWorkrow+2)); + *(pOutrow+3) = (mng_uint8)(*(pOutrow+3) + *(pWorkrow+3)); + /* next pixel */ + pOutrow += (pData->iColinc << 2); + pWorkrow += 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA8, MNG_LC_END); +#endif + + return mng_store_rgba8 (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iDeltaBlocky * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + + (pData->iDeltaBlockx * pBuf->iSamplesize); + /* pixel replace ? */ + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + MNG_COPY (pOutrow, pWorkrow, 8); /* put in object buffer */ + /* next pixel */ + pOutrow += (pData->iColinc << 3); + pWorkrow += 8; + } + } + else + { /* pixel add ! */ +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* add to object buffer */ + mng_put_uint16 (pOutrow, (mng_uint16)(mng_get_uint16 (pOutrow ) + + mng_get_uint16 (pWorkrow ) )); + mng_put_uint16 (pOutrow+2, (mng_uint16)(mng_get_uint16 (pOutrow+2 ) + + mng_get_uint16 (pWorkrow+2) )); + mng_put_uint16 (pOutrow+4, (mng_uint16)(mng_get_uint16 (pOutrow+4 ) + + mng_get_uint16 (pWorkrow+4) )); + mng_put_uint16 (pOutrow+6, (mng_uint16)(mng_get_uint16 (pOutrow+6 ) + + mng_get_uint16 (pWorkrow+6) )); + /* next pixel */ + pOutrow += (pData->iColinc << 3); + pWorkrow += 8; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA16, MNG_LC_END); +#endif + + return mng_store_rgba16 (pData); +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Delta-image row routines - apply the source row onto the target * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_delta_g1_g1 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G1_G1, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0x01); + + pOutrow++; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G1_G1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_g2_g2 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G2_G2, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0x03); + + pOutrow++; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G2_G2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_g4_g4 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G4_G4, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0x0F); + + pOutrow++; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G4_G4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_delta_g8_g8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G8_G8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0xFF); + + pOutrow++; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G8_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_g16_g16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G16_G16, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, (pData->iRowsamples << 1)); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow) + + mng_get_uint16 (pWorkrow)) & 0xFFFF)); + + pOutrow += 2; + pWorkrow += 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_G16_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ + +mng_retcode mng_delta_rgb8_rgb8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGB8_RGB8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples * 3); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples*3; iX > 0; iX--) +#else + for (iX = 0; iX < (pData->iRowsamples * 3); iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0xFF); + + pOutrow++; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGB8_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_rgb16_rgb16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGB16_RGB16, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, (pData->iRowsamples * 6)); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow ) + + mng_get_uint16 (pWorkrow )) & 0xFFFF)); + mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) + + mng_get_uint16 (pWorkrow+2)) & 0xFFFF)); + mng_put_uint16 (pOutrow+4, (mng_uint16)((mng_get_uint16 (pOutrow+4) + + mng_get_uint16 (pWorkrow+4)) & 0xFFFF)); + + pOutrow += 6; + pWorkrow += 6; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGB16_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_delta_ga8_ga8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA8_GA8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples << 1); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = (pData->iRowsamples<<1); iX > 0; iX--) +#else + for (iX = 0; iX < (pData->iRowsamples << 1); iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0xFF); + + pOutrow++; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA8_GA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_ga8_g8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA8_G8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; + + pOutrow += 2; + pWorkrow++; + } + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0xFF); + + pOutrow += 2; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA8_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_ga8_a8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA8_A8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 1; + + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; + + pOutrow += 2; + pWorkrow++; + } + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0xFF); + + pOutrow += 2; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA8_A8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_ga16_ga16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA16_GA16, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, (pData->iRowsamples << 2)); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow ) + + mng_get_uint16 (pWorkrow )) & 0xFFFF)); + mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) + + mng_get_uint16 (pWorkrow+2)) & 0xFFFF)); + + pOutrow += 4; + pWorkrow += 4; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA16_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_ga16_g16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA16_G16, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow, mng_get_uint16 (pWorkrow)); + + pOutrow += 4; + pWorkrow += 2; + } + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow) + + mng_get_uint16 (pWorkrow)) & 0xFFFF)); + + pOutrow += 4; + pWorkrow += 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA16_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_ga16_a16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA16_A16, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow+2, mng_get_uint16 (pWorkrow)); + + pOutrow += 4; + pWorkrow += 2; + } + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) + + mng_get_uint16 (pWorkrow)) & 0xFFFF)); + + pOutrow += 4; + pWorkrow += 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_GA16_A16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ + +mng_retcode mng_delta_rgba8_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_RGBA8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples << 2); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = (pData->iRowsamples << 2); iX > 0; iX--) +#else + for (iX = 0; iX < (pData->iRowsamples << 2); iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0xFF); + + pOutrow++; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_retcode mng_delta_rgba8_rgb8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_RGB8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + + pOutrow += 4; + pWorkrow += 3; + } + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow ) & 0xFF); + *(pOutrow+1) = (mng_uint8)(((mng_uint16)*(pOutrow+1) + + (mng_uint16)*(pWorkrow+1)) & 0xFF); + *(pOutrow+2) = (mng_uint8)(((mng_uint16)*(pOutrow+2) + + (mng_uint16)*(pWorkrow+2)) & 0xFF); + + pOutrow += 4; + pWorkrow += 3; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_delta_rgba8_a8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_A8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize) + 3; + + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = *pWorkrow; + + pOutrow += 4; + pWorkrow++; + } + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow + + (mng_uint16)*pWorkrow) & 0xFF); + + pOutrow += 4; + pWorkrow++; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_A8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_rgba16_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_RGBA16, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) || + (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) ) + { + MNG_COPY (pOutrow, pWorkrow, (pData->iRowsamples << 3)); + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow ) + + mng_get_uint16 (pWorkrow )) & 0xFFFF)); + mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) + + mng_get_uint16 (pWorkrow+2)) & 0xFFFF)); + mng_put_uint16 (pOutrow+4, (mng_uint16)((mng_get_uint16 (pOutrow+4) + + mng_get_uint16 (pWorkrow+4)) & 0xFFFF)); + mng_put_uint16 (pOutrow+6, (mng_uint16)((mng_get_uint16 (pOutrow+6) + + mng_get_uint16 (pWorkrow+6)) & 0xFFFF)); + + pOutrow += 8; + pWorkrow += 8; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_rgba16_rgb16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_RGB16, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow, mng_get_uint16 (pWorkrow )); + mng_put_uint16 (pOutrow+2, mng_get_uint16 (pWorkrow+2)); + mng_put_uint16 (pOutrow+4, mng_get_uint16 (pWorkrow+4)); + + pOutrow += 8; + pWorkrow += 6; + } + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow ) + + mng_get_uint16 (pWorkrow )) & 0xFFFF)); + mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) + + mng_get_uint16 (pWorkrow+2)) & 0xFFFF)); + mng_put_uint16 (pOutrow+4, (mng_uint16)((mng_get_uint16 (pOutrow+4) + + mng_get_uint16 (pWorkrow+4)) & 0xFFFF)); + + pOutrow += 8; + pWorkrow += 6; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_rgba16_a16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_A16, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow+6, mng_get_uint16 (pWorkrow)); + + pOutrow += 8; + pWorkrow += 2; + } + } + else + if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD) + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + mng_put_uint16 (pOutrow+6, (mng_uint16)((mng_get_uint16 (pOutrow+6) + + mng_get_uint16 (pWorkrow)) & 0xFFFF)); + + pOutrow += 8; + pWorkrow += 2; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_A16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ +/* * * */ +/* * Delta-image row routines - scale the delta to bitdepth of target * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_scale_g1_g2 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G1_G2, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow << 1); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G1_G2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_g1_g4 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G1_G4, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow << 3); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G1_G4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_g1_g8 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G1_G8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow << 7); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G1_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_g1_g16 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G1_G16, MNG_LC_START); +#endif + + pWorkrow = pWorkrow + (pData->iRowsamples - 1); + pOutrow = pOutrow + ((pData->iRowsamples - 1) << 1); +/* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1); */ +/* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 1)); */ + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pOutrow+1) = 0; + *pOutrow = (mng_uint8)(*pWorkrow << 7); + + pWorkrow--; + pOutrow -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G1_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_scale_g2_g4 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G2_G4, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow << 2); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G2_G4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_g2_g8 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G2_G8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow << 6); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G2_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_g2_g16 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G2_G16, MNG_LC_START); +#endif + + pWorkrow = pWorkrow + (pData->iRowsamples - 1); + pOutrow = pOutrow + ((pData->iRowsamples - 1) << 1); +/* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1); */ +/* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 1)); */ + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pOutrow+1) = 0; + *pOutrow = (mng_uint8)(*pWorkrow << 6); + + pWorkrow--; + pOutrow -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G2_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_scale_g4_g8 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G4_G8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow << 4); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G4_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_g4_g16 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G4_G16, MNG_LC_START); +#endif + + pWorkrow = pWorkrow + (pData->iRowsamples - 1); + pOutrow = pOutrow + ((pData->iRowsamples - 1) << 1); +/* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1); */ +/* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 1)); */ + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pOutrow+1) = 0; + *pOutrow = (mng_uint8)(*pWorkrow << 4); + + pWorkrow--; + pOutrow -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G4_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_g8_g16 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G8_G16, MNG_LC_START); +#endif + + pWorkrow = pWorkrow + (pData->iRowsamples - 1); + pOutrow = pOutrow + ((pData->iRowsamples - 1) << 1); +/* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1); */ +/* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 1)); */ + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pOutrow+1) = 0; + *pOutrow = *pWorkrow; + + pWorkrow--; + pOutrow -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G8_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_ga8_ga16 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_GA8_GA16, MNG_LC_START); +#endif + + pWorkrow = pWorkrow + ((pData->iRowsamples - 1) << 1); + pOutrow = pOutrow + ((pData->iRowsamples - 1) << 2); +/* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + ((pData->iRowsamples - 1) << 1)); */ +/* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 2)); */ + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pOutrow+3) = 0; + *(pOutrow+2) = *(pWorkrow+1); + *(pOutrow+1) = 0; + *pOutrow = *pWorkrow; + + pWorkrow -= 2; + pOutrow -= 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_GA8_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_rgb8_rgb16 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_RGB8_RGB16, MNG_LC_START); +#endif + + pWorkrow = pWorkrow + (3 * (pData->iRowsamples - 1)); + pOutrow = pOutrow + (6 * (pData->iRowsamples - 1)); +/* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + 3 * (pData->iRowsamples - 1)); */ +/* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + 6 * (pData->iRowsamples - 1)); */ + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pOutrow+5) = 0; + *(pOutrow+4) = *(pWorkrow+2); + *(pOutrow+3) = 0; + *(pOutrow+2) = *(pWorkrow+1); + *(pOutrow+1) = 0; + *pOutrow = *pWorkrow; + + pWorkrow -= 3; + pOutrow -= 6; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_RGB8_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_rgba8_rgba16 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_RGBA8_RGBA16, MNG_LC_START); +#endif + + pWorkrow = pWorkrow + ((pData->iRowsamples - 1) << 2); + pOutrow = pOutrow + ((pData->iRowsamples - 1) << 3); +/* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + ((pData->iRowsamples - 1) << 2)); */ +/* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 3)); */ + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *(pOutrow+7) = 0; + *(pOutrow+6) = *(pWorkrow+3); + *(pOutrow+5) = 0; + *(pOutrow+4) = *(pWorkrow+2); + *(pOutrow+3) = 0; + *(pOutrow+2) = *(pWorkrow+1); + *(pOutrow+1) = 0; + *pOutrow = *pWorkrow; + + pWorkrow -= 4; + pOutrow -= 8; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_RGBA8_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_scale_g2_g1 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G2_G1, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow >> 1); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G2_G1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_g4_g1 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G4_G1, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow >> 3); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G4_G1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_g8_g1 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G8_G1, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow >> 7); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G8_G1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_g16_g1 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G16_G1, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 15); + pOutrow++; + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G16_G1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_scale_g4_g2 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G4_G2, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow >> 2); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G4_G2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_g8_g2 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G8_G2, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow >> 6); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G8_G2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_g16_g2 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G16_G2, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 14); + pOutrow++; + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G16_G2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_scale_g8_g4 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G8_G4, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pWorkrow = (mng_uint8)(*pWorkrow >> 4); + pWorkrow++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G8_G4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_scale_g16_g4 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G16_G4, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 12); + pOutrow++; + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G16_G4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_scale_g16_g8 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G16_G8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_G16_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_ga16_ga8 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_GA16_GA8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_GA16_GA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_rgb16_rgb8 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_RGB16_RGB8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_RGB16_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_scale_rgba16_rgba8 (mng_datap pData) +{ + mng_uint8p pWorkrow = pData->pRGBArow; + mng_uint8p pOutrow = pData->pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_RGBA16_RGBA8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8); + pOutrow++; + pWorkrow += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_SCALE_RGBA16_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Delta-image bit routines - promote bit_depth * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_uint8 mng_promote_replicate_1_2 (mng_uint8 iB) +{ + return (mng_uint8)((iB << 1) | iB); +} + +/* ************************************************************************** */ + +mng_uint8 mng_promote_replicate_1_4 (mng_uint8 iB) +{ + iB = (mng_uint8)((iB << 1) + iB); + return (mng_uint8)((iB << 2) + iB); +} + +/* ************************************************************************** */ + +mng_uint8 mng_promote_replicate_1_8 (mng_uint8 iB) +{ + iB = (mng_uint8)((iB << 1) + iB); + iB = (mng_uint8)((iB << 2) + iB); + return (mng_uint8)((iB << 4) + iB); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_replicate_1_16 (mng_uint8 iB) +{ + iB = (mng_uint8)((iB << 1) + iB); + iB = (mng_uint8)((iB << 2) + iB); + iB = (mng_uint8)((iB << 4) + iB); + return (mng_uint16)(((mng_uint16)iB << 8) + (mng_uint16)iB); +} +#endif + +/* ************************************************************************** */ + +mng_uint8 mng_promote_replicate_2_4 (mng_uint8 iB) +{ + return (mng_uint8)((iB << 2) + iB); +} + +/* ************************************************************************** */ + +mng_uint8 mng_promote_replicate_2_8 (mng_uint8 iB) +{ + iB = (mng_uint8)((iB << 2) + iB); + return (mng_uint8)((iB << 4) + iB); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_replicate_2_16 (mng_uint8 iB) +{ + iB = (mng_uint8)((iB << 2) + iB); + iB = (mng_uint8)((iB << 4) + iB); + return (mng_uint16)(((mng_uint16)iB << 8) + (mng_uint16)iB); +} +#endif + +/* ************************************************************************** */ + +mng_uint8 mng_promote_replicate_4_8 (mng_uint8 iB) +{ + return (mng_uint8)((iB << 4) + iB); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_replicate_4_16 (mng_uint8 iB) +{ + iB = (mng_uint8)((iB << 4) + iB); + return (mng_uint16)(((mng_uint16)iB << 8) + (mng_uint16)iB); +} +#endif +#endif /* NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_replicate_8_16 (mng_uint8 iB) +{ + return (mng_uint16)(((mng_uint16)iB << 8) + (mng_uint16)iB); +} +#endif + +/* ************************************************************************** */ + +#if !defined(MNG_NO_DELTA_PNG) +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_uint8 mng_promote_zerofill_1_2 (mng_uint8 iB) +{ + return (mng_uint8)(iB << 1); +} + +/* ************************************************************************** */ + +mng_uint8 mng_promote_zerofill_1_4 (mng_uint8 iB) +{ + return (mng_uint8)(iB << 3); +} + +/* ************************************************************************** */ + +mng_uint8 mng_promote_zerofill_1_8 (mng_uint8 iB) +{ + return (mng_uint8)(iB << 7); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_zerofill_1_16 (mng_uint8 iB) +{ + return (mng_uint16)((mng_uint16)iB << 15); +} +#endif + +/* ************************************************************************** */ + +mng_uint8 mng_promote_zerofill_2_4 (mng_uint8 iB) +{ + return (mng_uint8)(iB << 2); +} + +/* ************************************************************************** */ + +mng_uint8 mng_promote_zerofill_2_8 (mng_uint8 iB) +{ + return (mng_uint8)(iB << 6); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_zerofill_2_16 (mng_uint8 iB) +{ + return (mng_uint16)((mng_uint16)iB << 14); +} +#endif + +/* ************************************************************************** */ + +mng_uint8 mng_promote_zerofill_4_8 (mng_uint8 iB) +{ + return (mng_uint8)(iB << 4); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_zerofill_4_16 (mng_uint8 iB) +{ + return (mng_uint16)((mng_uint16)iB << 12); +} +#endif +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_zerofill_8_16 (mng_uint8 iB) +{ + return (mng_uint16)((mng_uint16)iB << 8); +} +#endif +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ +/* * * */ +/* * Delta-image row routines - promote color_type * */ +/* * * */ +/* ************************************************************************** */ + +#if !defined(MNG_NO_DELTA_PNG) || !defined(MNG_SKIPCHUNK_PAST) || !defined(MNG_SKIPCHUNK_MAGN) +mng_retcode mng_promote_g8_g8 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_G8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + if (pData->fPromBitdepth) /* bitdepth promoted ? */ + iB = ((mng_bitdepth_8)pData->fPromBitdepth) (iB); + *pDstline = iB; + + pSrcline++; + pDstline++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g8_g16 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_G16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iW = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline); + + *pDstline = (mng_uint8)(iW >> 8); + *(pDstline+1) = (mng_uint8)(iW && 0xFF); + + pSrcline++; + pDstline += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_promote_g16_g16 (mng_datap pData) +{ + mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc; + mng_uint16p pDstline = (mng_uint16p)pData->pPromDst; + mng_uint32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G16_G16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + *pDstline = *pSrcline; + pSrcline++; + pDstline++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G16_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_promote_g8_ga8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_GA8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || ((mng_uint16)iB != pBuf->iTRNSgray)) + *(pDstline+1) = 0xFF; + + if (pData->fPromBitdepth) /* bitdepth promoted ? */ + iB = ((mng_bitdepth_8)pData->fPromBitdepth) (iB); + + *pDstline = iB; + + pSrcline++; + pDstline += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_GA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g8_ga16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_GA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || ((mng_uint16)iB != pBuf->iTRNSgray)) + { + *(pDstline+2) = 0xFF; + *(pDstline+3) = 0xFF; + } + + iW = ((mng_bitdepth_16)pData->fPromBitdepth) (iB); + + *pDstline = (mng_uint8)(iW >> 8); + *(pDstline+1) = (mng_uint8)(iW && 0xFF); + + pSrcline++; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g16_ga16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc; + mng_uint16p pDstline = (mng_uint16p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G16_GA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iW = *pSrcline; + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || ((mng_uint16)iW != pBuf->iTRNSgray)) + *(pDstline+1) = 0xFFFF; + + *pDstline = iW; + + pSrcline++; + pDstline += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G16_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_promote_g8_rgb8 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGB8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + + if (pData->fPromBitdepth) /* bitdepth promoted ? */ + iB = ((mng_bitdepth_8)pData->fPromBitdepth) (iB); + + *pDstline = iB; + *(pDstline+1) = iB; + *(pDstline+2) = iB; + + pSrcline++; + pDstline += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g8_rgb16 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGB16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + iW = ((mng_bitdepth_16)pData->fPromBitdepth) (iB); + + iB = (mng_uint8)(iW >> 8); + *pDstline = iB; + *(pDstline+2) = iB; + *(pDstline+4) = iB; + iB = (mng_uint8)(iW && 0xFF); + *(pDstline+1) = iB; + *(pDstline+3) = iB; + *(pDstline+5) = iB; + + pSrcline++; + pDstline += 6; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g16_rgb16 (mng_datap pData) +{ + mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc; + mng_uint16p pDstline = (mng_uint16p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G16_RGB16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iW = *pSrcline; + + *pDstline = iW; + *(pDstline+1) = iW; + *(pDstline+2) = iW; + + pSrcline++; + pDstline += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G16_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_promote_g8_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGBA8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || ((mng_uint16)iB != pBuf->iTRNSgray)) + *(pDstline+3) = 0xFF; + + if (pData->fPromBitdepth) /* bitdepth promoted ? */ + iB = ((mng_bitdepth_8)pData->fPromBitdepth) (iB); + + *pDstline = iB; + *(pDstline+1) = iB; + *(pDstline+2) = iB; + + pSrcline++; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g8_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGBA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || ((mng_uint16)iB != pBuf->iTRNSgray)) + { + *(pDstline+6) = 0xFF; + *(pDstline+7) = 0xFF; + } + + iW = ((mng_bitdepth_16)pData->fPromBitdepth) (iB); + + iB = (mng_uint8)(iW >> 8); + *pDstline = iB; + *(pDstline+2) = iB; + *(pDstline+4) = iB; + iB = (mng_uint8)(iW && 0xFF); + *(pDstline+1) = iB; + *(pDstline+3) = iB; + *(pDstline+5) = iB;; + + pSrcline++; + pDstline += 8; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g16_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc; + mng_uint16p pDstline = (mng_uint16p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G16_RGBA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iW = *pSrcline; + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || (iW != pBuf->iTRNSgray)) + *(pDstline+3) = 0xFFFF; + + *pDstline = iW; + *(pDstline+1) = iW; + *(pDstline+2) = iW; + + pSrcline++; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_G16_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_ga8_ga16 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iW; + mng_uint16 iA; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_GA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iW = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline); + iA = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+1)); + + *pDstline = (mng_uint8)(iW >> 8); + *(pDstline+1) = (mng_uint8)(iW && 0xFF); + *(pDstline+2) = (mng_uint8)(iA >> 8); + *(pDstline+3) = (mng_uint8)(iA && 0xFF); + + pSrcline += 2; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_promote_ga8_rgba8 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + mng_uint8 iA; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_RGBA8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + iA = *(pSrcline+1); + + *pDstline = iB; + *(pDstline+1) = iB; + *(pDstline+2) = iB; + *(pDstline+3) = iA; + + pSrcline += 2; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_ga8_rgba16 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + mng_uint16 iW; + mng_uint16 iA; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_RGBA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iW = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline); + iA = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+1)); + + iB = (mng_uint8)(iW >> 8); + *pDstline = iB; + *(pDstline+2) = iB; + *(pDstline+4) = iB; + iB = (mng_uint8)(iW && 0xFF); + *(pDstline+1) = iB; + *(pDstline+3) = iB; + *(pDstline+5) = iB; + *(pDstline+6) = (mng_uint8)(iA >> 8); + *(pDstline+7) = (mng_uint8)(iA && 0xFF); + + pSrcline += 2; + pDstline += 8; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_ga16_rgba16 (mng_datap pData) +{ + mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc; + mng_uint16p pDstline = (mng_uint16p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iW; + mng_uint16 iA; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_GA16_RGBA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iW = *pSrcline; + iA = *(pSrcline+1); + + *pDstline = iW; + *(pDstline+1) = iW; + *(pDstline+2) = iW; + *(pDstline+3) = iA; + + pSrcline += 2; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_GA16_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_rgb8_rgb16 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iR; + mng_uint16 iG; + mng_uint16 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGB16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iR = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline); + iG = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+1)); + iB = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+2)); + + *pDstline = (mng_uint8)(iR >> 8); + *(pDstline+1) = (mng_uint8)(iR && 0xFF); + *(pDstline+2) = (mng_uint8)(iG >> 8); + *(pDstline+3) = (mng_uint8)(iG && 0xFF); + *(pDstline+4) = (mng_uint8)(iB >> 8); + *(pDstline+5) = (mng_uint8)(iB && 0xFF); + + pSrcline += 3; + pDstline += 6; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_promote_rgb8_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iR; + mng_uint8 iG; + mng_uint8 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGBA8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iR = *pSrcline; + iG = *(pSrcline+1); + iB = *(pSrcline+2); + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || ((mng_uint16)iR != pBuf->iTRNSred) || + ((mng_uint16)iG != pBuf->iTRNSgreen) || ((mng_uint16)iB != pBuf->iTRNSblue)) + *(pDstline+3) = 0xFF; + + *pDstline = iR; + *(pDstline+1) = iG; + *(pDstline+2) = iB; + + pSrcline += 3; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_rgb8_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iR; + mng_uint8 iG; + mng_uint8 iB; + mng_uint16 iRw; + mng_uint16 iGw; + mng_uint16 iBw; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGBA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iR = *pSrcline; + iG = *(pSrcline+1); + iB = *(pSrcline+2); + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || ((mng_uint16)iR != pBuf->iTRNSred) || + ((mng_uint16)iG != pBuf->iTRNSgreen) || ((mng_uint16)iB != pBuf->iTRNSblue)) + { + *(pDstline+6) = 0xFF; + *(pDstline+7) = 0xFF; + } + + iRw = ((mng_bitdepth_16)pData->fPromBitdepth) (iR); + iGw = ((mng_bitdepth_16)pData->fPromBitdepth) (iG); + iBw = ((mng_bitdepth_16)pData->fPromBitdepth) (iB); + + *pDstline = (mng_uint8)(iRw >> 8); + *(pDstline+1) = (mng_uint8)(iRw && 0xFF); + *(pDstline+2) = (mng_uint8)(iGw >> 8); + *(pDstline+3) = (mng_uint8)(iGw && 0xFF); + *(pDstline+4) = (mng_uint8)(iBw >> 8); + *(pDstline+5) = (mng_uint8)(iBw && 0xFF); + + pSrcline += 3; + pDstline += 8; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_rgb16_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc; + mng_uint16p pDstline = (mng_uint16p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iR; + mng_uint16 iG; + mng_uint16 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGB16_RGBA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iR = *pSrcline; + iG = *(pSrcline+1); + iB = *(pSrcline+2); + /* no cheap transparency ? */ + if ((!pBuf->bHasTRNS) || (iR != pBuf->iTRNSred) || + (iG != pBuf->iTRNSgreen) || (iB != pBuf->iTRNSblue)) + *(pDstline+3) = 0xFFFF; + + *pDstline = iR; + *(pDstline+1) = iG; + *(pDstline+2) = iB; + + pSrcline += 3; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGB16_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_promote_idx8_rgb8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGB8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + + if ((mng_uint32)iB < pBuf->iPLTEcount) + { + *pDstline = pBuf->aPLTEentries [iB].iRed; + *(pDstline+1) = pBuf->aPLTEentries [iB].iGreen; + *(pDstline+2) = pBuf->aPLTEentries [iB].iBlue; + } + + pSrcline++; + pDstline += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_idx8_rgb16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iN; + mng_uint16 iR; + mng_uint16 iG; + mng_uint16 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGB16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iN = *pSrcline; + + if ((mng_uint32)iN < pBuf->iPLTEcount) + { + iR = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iRed); + iG = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iGreen); + iB = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iBlue); + *pDstline = (mng_uint8)(iR >> 8); + *(pDstline+1) = (mng_uint8)(iR && 0xFF); + *(pDstline+2) = (mng_uint8)(iG >> 8); + *(pDstline+3) = (mng_uint8)(iG && 0xFF); + *(pDstline+4) = (mng_uint8)(iB >> 8); + *(pDstline+5) = (mng_uint8)(iB && 0xFF); + } + + pSrcline++; + pDstline += 6; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_promote_idx8_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGBA8, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iB = *pSrcline; + + if ((mng_uint32)iB < pBuf->iPLTEcount) + { + *pDstline = pBuf->aPLTEentries [iB].iRed; + *(pDstline+1) = pBuf->aPLTEentries [iB].iGreen; + *(pDstline+2) = pBuf->aPLTEentries [iB].iBlue; + + if ((pBuf->bHasTRNS) && ((mng_uint32)iB < pBuf->iTRNScount)) + *(pDstline+3) = pBuf->aTRNSentries [iB]; + else + *(pDstline+3) = 0xFF; + } + + pSrcline++; + pDstline += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_idx8_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf; + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint8 iN; + mng_uint16 iR; + mng_uint16 iG; + mng_uint16 iB; + mng_uint16 iA; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGBA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iN = *pSrcline; + + if ((mng_uint32)iN < pBuf->iPLTEcount) + { + iR = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iRed); + iG = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iGreen); + iB = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iBlue); + + if ((pBuf->bHasTRNS) && ((mng_uint32)iN < pBuf->iTRNScount)) + iA = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aTRNSentries [iN]); + else + iA = 0xFFFF; + + *pDstline = (mng_uint8)(iR >> 8); + *(pDstline+1) = (mng_uint8)(iR && 0xFF); + *(pDstline+2) = (mng_uint8)(iG >> 8); + *(pDstline+3) = (mng_uint8)(iG && 0xFF); + *(pDstline+4) = (mng_uint8)(iB >> 8); + *(pDstline+5) = (mng_uint8)(iB && 0xFF); + *(pDstline+6) = (mng_uint8)(iA >> 8); + *(pDstline+7) = (mng_uint8)(iA && 0xFF); + } + + pSrcline++; + pDstline += 8; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_promote_rgba8_rgba16 (mng_datap pData) +{ + mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc; + mng_uint8p pDstline = (mng_uint8p)pData->pPromDst; + mng_uint32 iX; + mng_uint16 iR; + mng_uint16 iG; + mng_uint16 iB; + mng_uint16 iA; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGBA8_RGBA16, MNG_LC_START); +#endif + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPromWidth; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPromWidth; iX++) +#endif + { + iR = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline); + iG = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+1)); + iB = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+2)); + iA = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+3)); + + *pDstline = (mng_uint8)(iR >> 8); + *(pDstline+1) = (mng_uint8)(iR && 0xFF); + *(pDstline+2) = (mng_uint8)(iG >> 8); + *(pDstline+3) = (mng_uint8)(iG && 0xFF); + *(pDstline+4) = (mng_uint8)(iB >> 8); + *(pDstline+5) = (mng_uint8)(iB && 0xFF); + *(pDstline+6) = (mng_uint8)(iA >> 8); + *(pDstline+7) = (mng_uint8)(iA && 0xFF); + + pSrcline += 4; + pDstline += 8; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROMOTE_RGBA8_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* !defined(MNG_NO_DELTA_PNG) || !defined(MNG_SKIPCHUNK_PAST) || !defined(MNG_SKIPCHUNK_MAGN) */ + +/* ************************************************************************** */ +/* * * */ +/* * Row processing routines - convert uncompressed data from zlib to * */ +/* * managable row-data which serves as input to the color-management * */ +/* * routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_process_g1 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G1, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + iM = 0; /* start at pixel 0 */ + iB = 0; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { + if (pBuf->iTRNSgray) /* white transparent ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* is it white ? */ + /* transparent ! */ + mng_put_uint32 (pRGBArow, 0x00000000); + else /* opaque black */ + mng_put_uint32 (pRGBArow, 0x000000FF); + + pRGBArow += 4; /* next pixel */ + iM >>= 1; + } + } + else /* black transparent */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* is it white ? */ + /* opaque white */ + mng_put_uint32 (pRGBArow, 0xFFFFFFFF); + else /* transparent */ + mng_put_uint32 (pRGBArow, 0x00000000); + + pRGBArow += 4; /* next pixel */ + iM >>= 1; + } + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else /* no transparency */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + } + + if (iB & iM) /* is it white ? */ + /* opaque white */ + mng_put_uint32 (pRGBArow, 0xFFFFFFFF); + else /* opaque black */ + mng_put_uint32 (pRGBArow, 0x000000FF); + + pRGBArow += 4; /* next pixel */ + iM >>= 1; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_g2 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + const mng_uint32 level[4] = { 0x000000FF, 0x555555FF, + 0xAAAAAAFF, 0xFFFFFFFF}; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G2, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + /* determine gray level */ + iQ = (mng_uint8)((iB & iM) >> iS); + + if (iQ == pBuf->iTRNSgray) /* transparent ? */ + mng_put_uint32 (pRGBArow, 0x00000000); + else + { +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + mng_put_uint32 (pRGBArow, level[iQ]); +#else + switch (iQ) /* determine the gray level */ + { + case 0x03 : { mng_put_uint32 (pRGBArow, 0xFFFFFFFF); break; } + case 0x02 : { mng_put_uint32 (pRGBArow, 0xAAAAAAFF); break; } + case 0x01 : { mng_put_uint32 (pRGBArow, 0x555555FF); break; } + default : { mng_put_uint32 (pRGBArow, 0x000000FF); } + } +#endif + } + + pRGBArow += 4; /* next pixel */ + iM >>= 2; + iS -= 2; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + +#ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH + mng_put_uint32 (pRGBArow, level[((iB & iM) >> iS)] ); +#else + switch ((iB & iM) >> iS) /* determine the gray level */ + { + case 0x03 : { mng_put_uint32 (pRGBArow, 0xFFFFFFFF); break; } + case 0x02 : { mng_put_uint32 (pRGBArow, 0xAAAAAAFF); break; } + case 0x01 : { mng_put_uint32 (pRGBArow, 0x555555FF); break; } + default : { mng_put_uint32 (pRGBArow, 0x000000FF); } + } +#endif + + pRGBArow += 4; /* next pixel */ + iM >>= 2; + iS -= 2; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_g4 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G4, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the gray level */ + iQ = (mng_uint8)((iB & iM) >> iS); + + if (iQ == pBuf->iTRNSgray) /* transparent ? */ + { + *pRGBArow = 0; /* put in intermediate row */ + *(pRGBArow+1) = 0; + *(pRGBArow+2) = 0; + *(pRGBArow+3) = 0; + } + else + { /* expand to 8-bit by replication */ + iQ = (mng_uint8)(iQ + (iQ << 4)); + + *pRGBArow = iQ; /* put in intermediate row */ + *(pRGBArow+1) = iQ; + *(pRGBArow+2) = iQ; + *(pRGBArow+3) = 0xFF; + } + + pRGBArow += 4; /* next pixel */ + iM >>= 4; + iS -= 4; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the gray level */ + iQ = (mng_uint8)((iB & iM) >> iS); + iQ = (mng_uint8)(iQ + (iQ << 4));/* expand to 8-bit by replication */ + + *pRGBArow = iQ; /* put in intermediate row */ + *(pRGBArow+1) = iQ; + *(pRGBArow+2) = iQ; + *(pRGBArow+3) = 0xFF; + + pRGBArow += 4; /* next pixel */ + iM >>= 4; + iS -= 4; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_process_g8 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iB; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G8, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iB = *pWorkrow; /* get next input-byte */ + + if (iB == pBuf->iTRNSgray) /* transparent ? */ + { + *pRGBArow = 0; /* put in intermediate row */ + *(pRGBArow+1) = 0; + *(pRGBArow+2) = 0; + *(pRGBArow+3) = 0; + } + else + { + *pRGBArow = iB; /* put in intermediate row */ + *(pRGBArow+1) = iB; + *(pRGBArow+2) = iB; + *(pRGBArow+3) = 0xFF; + } + + pRGBArow += 4; /* next pixel */ + pWorkrow++; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iB = *pWorkrow; /* get next input-byte */ + + *pRGBArow = iB; /* put in intermediate row */ + *(pRGBArow+1) = iB; + *(pRGBArow+2) = iB; + *(pRGBArow+3) = 0xFF; + + pRGBArow += 4; /* next pixel */ + pWorkrow++; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_process_g16 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint16 iW; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G16, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iW = mng_get_uint16 (pWorkrow); /* get input */ + + if (iW == pBuf->iTRNSgray) /* transparent ? */ + { /* put in intermediate row */ + mng_put_uint16 (pRGBArow, 0); + mng_put_uint16 (pRGBArow+2, 0); + mng_put_uint16 (pRGBArow+4, 0); + mng_put_uint16 (pRGBArow+6, 0); + } + else + { /* put in intermediate row */ + mng_put_uint16 (pRGBArow, iW); + mng_put_uint16 (pRGBArow+2, iW); + mng_put_uint16 (pRGBArow+4, iW); + mng_put_uint16 (pRGBArow+6, 0xFFFF); + } + + pRGBArow += 8; /* next pixel */ + pWorkrow += 2; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iW = mng_get_uint16 (pWorkrow); /* get input */ + + mng_put_uint16 (pRGBArow, iW); /* and put in intermediate row */ + mng_put_uint16 (pRGBArow+2, iW); + mng_put_uint16 (pRGBArow+4, iW); + mng_put_uint16 (pRGBArow+6, 0xFFFF); + + pRGBArow += 8; /* next pixel */ + pWorkrow += 2; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_G16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_rgb8 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iR, iG, iB; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RGB8, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iR = *pWorkrow; /* get the RGB values */ + iG = *(pWorkrow+1); + iB = *(pWorkrow+2); + /* transparent ? */ + if ((iR == pBuf->iTRNSred) && (iG == pBuf->iTRNSgreen) && + (iB == pBuf->iTRNSblue)) + { + *pRGBArow = 0; /* this pixel is transparent ! */ + *(pRGBArow+1) = 0; + *(pRGBArow+2) = 0; + *(pRGBArow+3) = 0; + } + else + { + *pRGBArow = iR; /* copy the RGB values */ + *(pRGBArow+1) = iG; + *(pRGBArow+2) = iB; + *(pRGBArow+3) = 0xFF; /* this one isn't transparent */ + } + + pWorkrow += 3; /* next pixel */ + pRGBArow += 4; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pRGBArow = *pWorkrow; /* copy the RGB bytes */ + *(pRGBArow+1) = *(pWorkrow+1); + *(pRGBArow+2) = *(pWorkrow+2); + *(pRGBArow+3) = 0xFF; /* no alpha; so always fully opaque */ + + pWorkrow += 3; /* next pixel */ + pRGBArow += 4; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RGB8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_process_rgb16 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint16 iR, iG, iB; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RGB16, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iR = mng_get_uint16 (pWorkrow); /* get the RGB values */ + iG = mng_get_uint16 (pWorkrow+2); + iB = mng_get_uint16 (pWorkrow+4); + /* transparent ? */ + if ((iR == pBuf->iTRNSred) && (iG == pBuf->iTRNSgreen) && + (iB == pBuf->iTRNSblue)) + { /* transparent then */ + mng_put_uint16 (pRGBArow, 0); + mng_put_uint16 (pRGBArow+2, 0); + mng_put_uint16 (pRGBArow+4, 0); + mng_put_uint16 (pRGBArow+6, 0); + } + else + { /* put in intermediate row */ + mng_put_uint16 (pRGBArow, iR); + mng_put_uint16 (pRGBArow+2, iG); + mng_put_uint16 (pRGBArow+4, iB); + mng_put_uint16 (pRGBArow+6, 0xFFFF); + } + + pWorkrow += 6; /* next pixel */ + pRGBArow += 8; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* copy the RGB values */ + mng_put_uint16 (pRGBArow, mng_get_uint16 (pWorkrow )); + mng_put_uint16 (pRGBArow+2, mng_get_uint16 (pWorkrow+2)); + mng_put_uint16 (pRGBArow+4, mng_get_uint16 (pWorkrow+4)); + mng_put_uint16 (pRGBArow+6, 0xFFFF); + + pWorkrow += 6; /* next pixel */ + pRGBArow += 8; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RGB16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_process_idx1 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_IDX1, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + iS = 7; + } + /* get the index */ + iQ = (mng_uint8)((iB & iM) >> iS); + /* index valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + *pRGBArow = pBuf->aPLTEentries [iQ].iRed; + *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen; + *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue; + /* transparency for this index ? */ + if ((mng_uint32)iQ < pBuf->iTRNScount) + *(pRGBArow+3) = pBuf->aTRNSentries [iQ]; + else + *(pRGBArow+3) = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pRGBArow += 4; /* next pixel */ + iM >>= 1; + iS -= 1; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0x80; + iS = 7; + } + /* get the index */ + iQ = (mng_uint8)((iB & iM) >> iS); + /* index valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + *pRGBArow = pBuf->aPLTEentries [iQ].iRed; + *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen; + *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue; + *(pRGBArow+3) = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pRGBArow += 4; /* next pixel */ + iM >>= 1; + iS -= 1; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_IDX1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_idx2 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_IDX2, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + /* get the index */ + iQ = (mng_uint8)((iB & iM) >> iS); + /* index valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + *pRGBArow = pBuf->aPLTEentries [iQ].iRed; + *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen; + *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue; + /* transparency for this index ? */ + if ((mng_uint32)iQ < pBuf->iTRNScount) + *(pRGBArow+3) = pBuf->aTRNSentries [iQ]; + else + *(pRGBArow+3) = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pRGBArow += 4; /* next pixel */ + iM >>= 2; + iS -= 2; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = *pWorkrow; /* get next input-byte */ + pWorkrow++; + iM = 0xC0; + iS = 6; + } + /* get the index */ + iQ = (mng_uint8)((iB & iM) >> iS); + /* index valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + *pRGBArow = pBuf->aPLTEentries [iQ].iRed; + *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen; + *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue; + *(pRGBArow+3) = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pRGBArow += 4; /* next pixel */ + iM >>= 2; + iS -= 2; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_IDX2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_idx4 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iB; + mng_uint8 iM; + mng_uint32 iS; + mng_uint8 iQ; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_IDX4, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + iM = 0; /* start at pixel 0 */ + iB = 0; + iS = 0; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = pWorkrow [0]; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the index */ + iQ = (mng_uint8)((iB & iM) >> iS); + /* index valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + pRGBArow [0] = pBuf->aPLTEentries [iQ].iRed; + pRGBArow [1] = pBuf->aPLTEentries [iQ].iGreen; + pRGBArow [2] = pBuf->aPLTEentries [iQ].iBlue; + /* transparency for this index ? */ + if ((mng_uint32)iQ < pBuf->iTRNScount) + pRGBArow [3] = pBuf->aTRNSentries [iQ]; + else + pRGBArow [3] = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pRGBArow += 4; /* next pixel */ + iM >>= 4; + iS -= 4; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + if (!iM) /* mask underflow ? */ + { + iB = pWorkrow [0]; /* get next input-byte */ + pWorkrow++; + iM = 0xF0; + iS = 4; + } + /* get the index */ + iQ = (mng_uint8)((iB & iM) >> iS); + /* index valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + pRGBArow [0] = pBuf->aPLTEentries [iQ].iRed; + pRGBArow [1] = pBuf->aPLTEentries [iQ].iGreen; + pRGBArow [2] = pBuf->aPLTEentries [iQ].iBlue; + pRGBArow [3] = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pRGBArow += 4; /* next pixel */ + iM >>= 4; + iS -= 4; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_IDX4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_process_idx8 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint8 iQ; + mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_IDX8, MNG_LC_START); +#endif + + if (!pBuf) /* no object? then use obj 0 */ + pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + + if (pBuf->bHasTRNS) /* tRNS encountered ? */ + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iQ = *pWorkrow; /* get input byte */ + /* index valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + pRGBArow [0] = pBuf->aPLTEentries [iQ].iRed; + pRGBArow [1] = pBuf->aPLTEentries [iQ].iGreen; + pRGBArow [2] = pBuf->aPLTEentries [iQ].iBlue; + /* transparency for this index ? */ + if ((mng_uint32)iQ < pBuf->iTRNScount) + pRGBArow [3] = pBuf->aTRNSentries [iQ]; + else + pRGBArow [3] = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pRGBArow += 4; /* next pixel */ + pWorkrow++; + } + + pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */ + } + else + { +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iQ = *pWorkrow; /* get input byte */ + /* index valid ? */ + if ((mng_uint32)iQ < pBuf->iPLTEcount) + { /* put in intermediate row */ + pRGBArow [0] = pBuf->aPLTEentries [iQ].iRed; + pRGBArow [1] = pBuf->aPLTEentries [iQ].iGreen; + pRGBArow [2] = pBuf->aPLTEentries [iQ].iBlue; + pRGBArow [3] = 0xFF; + } + else + MNG_ERROR (pData, MNG_PLTEINDEXERROR); + + pRGBArow += 4; /* next pixel */ + pWorkrow++; + } + + pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_IDX8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_process_ga8 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_GA8, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + *pRGBArow = *pWorkrow; /* copy the gray value */ + *(pRGBArow+1) = *pWorkrow; + *(pRGBArow+2) = *pWorkrow; + *(pRGBArow+3) = *(pWorkrow+1); /* copy the alpha value */ + + pWorkrow += 2; /* next pixel */ + pRGBArow += 4; + } + + pData->bIsOpaque = MNG_FALSE; /* it's definitely not fully opaque */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_GA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_process_ga16 (mng_datap pData) +{ + mng_uint8p pWorkrow; + mng_uint8p pRGBArow; + mng_int32 iX; + mng_uint16 iW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_GA16, MNG_LC_START); +#endif + /* temporary work pointers */ + pWorkrow = pData->pWorkrow + pData->iPixelofs; + pRGBArow = pData->pRGBArow; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iW = mng_get_uint16 (pWorkrow); /* copy the gray value */ + mng_put_uint16 (pRGBArow, iW); + mng_put_uint16 (pRGBArow+2, iW); + mng_put_uint16 (pRGBArow+4, iW); + /* copy the alpha value */ + mng_put_uint16 (pRGBArow+6, mng_get_uint16 (pWorkrow+2)); + + pWorkrow += 4; /* next pixel */ + pRGBArow += 8; + } + + pData->bIsOpaque = MNG_FALSE; /* it's definitely not fully opaque */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_GA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_process_rgba8 (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RGBA8, MNG_LC_START); +#endif + /* this is the easiest transform */ + MNG_COPY (pData->pRGBArow, pData->pWorkrow + pData->iPixelofs, pData->iRowsize); + + pData->bIsOpaque = MNG_FALSE; /* it's definitely not fully opaque */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_process_rgba16 (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RGBA16, MNG_LC_START); +#endif + /* this is the easiest transform */ + MNG_COPY (pData->pRGBArow, pData->pWorkrow + pData->iPixelofs, pData->iRowsize); + + pData->bIsOpaque = MNG_FALSE; /* it's definitely not fully opaque */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row processing initialization routines - set up the variables needed * */ +/* * to process uncompressed row-data * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_FOOTPRINT_INIT +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_init_g1_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G1_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g1; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g1; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g1; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g1; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 7; + pData->iSamplediv = 3; + pData->iRowsize = (pData->iRowsamples + 7) >> 3; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G1_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_g1_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G1_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g1; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g1; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g1; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g1; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 1; + pData->iSampleofs = 7; + pData->iSamplediv = 3; + pData->iRowsize = ((pData->iRowsamples + 7) >> 3); + pData->iRowmax = ((pData->iDatawidth + 7) >> 3) + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G1_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_g2_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G2_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g2; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g2; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g2; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g2; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 3; + pData->iSamplediv = 2; + pData->iRowsize = (pData->iRowsamples + 3) >> 2; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G2_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_g2_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G2_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g2; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g2; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g2; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g2; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 1; + pData->iSampleofs = 3; + pData->iSamplediv = 2; + pData->iRowsize = ((pData->iRowsamples + 3) >> 2); + pData->iRowmax = ((pData->iDatawidth + 3) >> 2) + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G2_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_g4_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G4_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g4; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g4; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g4; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g4; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 1; + pData->iSamplediv = 1; + pData->iRowsize = (pData->iRowsamples + 1) >> 1; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G4_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_g4_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G4_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g4; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g4; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g4; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g4; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 1; + pData->iSampleofs = 1; + pData->iSamplediv = 1; + pData->iRowsize = ((pData->iRowsamples + 1) >> 1); + pData->iRowmax = ((pData->iDatawidth + 1) >> 1) + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G4_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_init_g8_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G8_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g8; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G8_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_g8_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G8_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g8; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 1; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples; + pData->iRowmax = pData->iDatawidth + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G8_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_g16_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G16_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g16; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g16; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g16; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g16; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 2; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 1; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 2; + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G16_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_g16_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G16_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_g16; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_g16; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_g16; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g16; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 2; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 1; + pData->iRowmax = (pData->iDatawidth << 1) + pData->iPixelofs; + pData->iFilterbpp = 2; + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_G16_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_init_rgb8_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGB8_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_rgb8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_rgb8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_rgb8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_rgb8; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 3; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples * 3; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 3; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGB8_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_rgb8_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGB8_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_rgb8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_rgb8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_rgb8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_rgb8; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 3; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples * 3; + pData->iRowmax = (pData->iDatawidth * 3) + pData->iPixelofs; + pData->iFilterbpp = 3; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGB8_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_rgb16_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGB16_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_rgb16; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_rgb16; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_rgb16; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_rgb16; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 6; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples * 6; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 6; + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGB16_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_rgb16_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGB16_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_rgb16; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_rgb16; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_rgb16; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_rgb16; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 6; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples * 6; + pData->iRowmax = (pData->iDatawidth * 6) + pData->iPixelofs; + pData->iFilterbpp = 6; + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGB16_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_init_idx1_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX1_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_idx1; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_idx1; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_idx1; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_idx1; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 7; + pData->iSamplediv = 3; + pData->iRowsize = (pData->iRowsamples + 7) >> 3; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX1_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_idx1_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX1_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_idx1; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_idx1; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_idx1; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_idx1; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 1; + pData->iSampleofs = 7; + pData->iSamplediv = 3; + pData->iRowsize = (pData->iRowsamples + 7) >> 3; + pData->iRowmax = ((pData->iDatawidth + 7) >> 3) + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX1_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_idx2_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX2_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_idx2; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_idx2; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_idx2; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_idx2; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 3; + pData->iSamplediv = 2; + pData->iRowsize = (pData->iRowsamples + 3) >> 2; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX2_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_idx2_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX2_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_idx2; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_idx2; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_idx2; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_idx2; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 1; + pData->iSampleofs = 3; + pData->iSamplediv = 2; + pData->iRowsize = (pData->iRowsamples + 3) >> 2; + pData->iRowmax = ((pData->iDatawidth + 3) >> 2) + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX2_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_idx4_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX4_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_idx4; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_idx4; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_idx4; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_idx4; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 1; + pData->iSamplediv = 1; + pData->iRowsize = (pData->iRowsamples + 1) >> 1; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX4_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_idx4_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX4_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_idx4; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_idx4; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_idx4; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_idx4; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 1; + pData->iSampleofs = 1; + pData->iSamplediv = 1; + pData->iRowsize = (pData->iRowsamples + 1) >> 1; + pData->iRowmax = ((pData->iDatawidth + 1) >> 1) + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX4_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_init_idx8_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX8_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_idx8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_idx8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_idx8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_idx8; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX8_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_idx8_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX8_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_idx8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_idx8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_idx8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_idx8; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 1; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples; + pData->iRowmax = pData->iDatawidth + pData->iPixelofs; + pData->iFilterbpp = 1; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_IDX8_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_ga8_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GA8_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_ga8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_ga8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_ga8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_ga8; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 2; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 1; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 2; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GA8_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_ga8_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GA8_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_ga8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_ga8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_ga8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_ga8; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 2; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 1; + pData->iRowmax = (pData->iDatawidth << 1) + pData->iPixelofs; + pData->iFilterbpp = 2; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GA8_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_ga16_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GA16_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_ga16; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_ga16; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_ga16; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_ga16; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 4; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 2; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 4; + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GA16_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_ga16_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GA16_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_ga16; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_ga16; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_ga16; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_ga16; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 4; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 2; + pData->iRowmax = (pData->iDatawidth << 2) + pData->iPixelofs; + pData->iFilterbpp = 4; + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_GA16_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_init_rgba8_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGBA8_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_rgba8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_rgba8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_rgba8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_rgba8; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 4; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 2; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 4; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGBA8_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +/* ************************************************************************** */ + +mng_retcode mng_init_rgba8_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGBA8_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_rgba8; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_rgba8; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_rgba8; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_rgba8; +#endif + + pData->iPass = 0; /* from 0..6; is 1..7 in specifications */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 4; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 2; + pData->iRowmax = (pData->iDatawidth << 2) + pData->iPixelofs; + pData->iFilterbpp = 4; + pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGBA8_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_rgba16_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGBA16_NI, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_rgba16; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_rgba16; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_rgba16; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_rgba16; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 8; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 3; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 8; + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGBA16_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_rgba16_i (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGBA16_I, MNG_LC_START); +#endif + + if (pData->fDisplayrow) + pData->fProcessrow = (mng_fptr)mng_process_rgba16; + + if (pData->pStoreobj) /* store in object too ? */ + { /* immediate delta ? */ +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + pData->fStorerow = (mng_fptr)mng_delta_rgba16; + else +#endif + pData->fStorerow = (mng_fptr)mng_store_rgba16; + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_rgba16; +#endif + + pData->iPass = 0; /* from 0..6; (1..7 in specification) */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0]; + pData->iSamplemul = 8; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 3; + pData->iRowmax = (pData->iDatawidth << 3) + pData->iPixelofs; + pData->iFilterbpp = 8; + pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_RGBA16_I, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row processing initialization routines (JPEG) - set up the variables * */ +/* * needed to process uncompressed row-data * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_init_jpeg_a1_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A1_NI, MNG_LC_START); +#endif + + if (pData->pStoreobj) /* store in object too ? */ + { + if (pData->iJHDRimgbitdepth == 8) + { + switch (pData->iJHDRcolortype) + { + case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a1; break; } + case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a1; break; } + } + } + + /* TODO: bitdepth 12 & 20 */ + + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g1; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 7; + pData->iSamplediv = 3; + pData->iRowsize = (pData->iRowsamples + 7) >> 3; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A1_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_jpeg_a2_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A2_NI, MNG_LC_START); +#endif + + if (pData->pStoreobj) /* store in object too ? */ + { + if (pData->iJHDRimgbitdepth == 8) + { + switch (pData->iJHDRcolortype) + { + case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a2; break; } + case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a2; break; } + } + } + + /* TODO: bitdepth 12 & 20 */ + + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g2; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 3; + pData->iSamplediv = 2; + pData->iRowsize = (pData->iRowsamples + 3) >> 2; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A2_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_init_jpeg_a4_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A4_NI, MNG_LC_START); +#endif + + if (pData->pStoreobj) /* store in object too ? */ + { + if (pData->iJHDRimgbitdepth == 8) + { + switch (pData->iJHDRcolortype) + { + case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a4; break; } + case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a4; break; } + } + } + + /* TODO: bitdepth 12 & 20 */ + + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g4; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 1; + pData->iSamplediv = 1; + pData->iRowsize = (pData->iRowsamples + 1) >> 1; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A4_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_init_jpeg_a8_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A8_NI, MNG_LC_START); +#endif + + if (pData->pStoreobj) /* store in object too ? */ + { + if (pData->iJHDRimgbitdepth == 8) + { + switch (pData->iJHDRcolortype) + { + case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a8; break; } + case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a8; break; } + } + } + + /* TODO: bitdepth 12 & 20 */ + + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g8; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 1; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 1; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A8_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_jpeg_a16_ni (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A16_NI, MNG_LC_START); +#endif + + if (pData->pStoreobj) /* store in object too ? */ + { + if (pData->iJHDRimgbitdepth == 8) + { + switch (pData->iJHDRcolortype) + { + case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a16; break; } + case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a16; break; } + } + } + + /* TODO: bitdepth 12 & 20 */ + + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + pData->fDifferrow = (mng_fptr)mng_differ_g16; +#endif + + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + pData->iSamplemul = 2; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iRowsize = pData->iRowsamples << 1; + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + pData->iFilterbpp = 2; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_JPEG_A16_NI, MNG_LC_END); +#endif + + return mng_init_rowproc (pData); +} +#endif + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_JNG */ +#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */ + + +/* ************************************************************************** */ +/* * * */ +/* * Generic row processing initialization & cleanup routines * */ +/* * - initialize the buffers used by the row processing routines * */ +/* * - cleanup the buffers used by the row processing routines * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_init_rowproc (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ROWPROC, MNG_LC_START); +#endif + +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT + if (pData->ePng_imgtype != png_none) + { + if (pData->fDisplayrow) + switch (pData->ePng_imgtype) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_g1: + pData->fProcessrow = (mng_fptr)mng_process_g1; + break; + case png_g2: + pData->fProcessrow = (mng_fptr)mng_process_g2; + break; + case png_g4: + pData->fProcessrow = (mng_fptr)mng_process_g4; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_g8: + pData->fProcessrow = (mng_fptr)mng_process_g8; + break; +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_idx1: + pData->fProcessrow = (mng_fptr)mng_process_idx1; + break; + case png_idx2: + pData->fProcessrow = (mng_fptr)mng_process_idx2; + break; + case png_idx4: + pData->fProcessrow = (mng_fptr)mng_process_idx4; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_idx8: + pData->fProcessrow = (mng_fptr)mng_process_idx8; + break; + case png_ga8: + pData->fProcessrow = (mng_fptr)mng_process_ga8; + break; + case png_rgb8: + pData->fProcessrow = (mng_fptr)mng_process_rgb8; + break; + case png_rgba8: + pData->fProcessrow = (mng_fptr)mng_process_rgba8; + break; +#ifndef MNG_NO_16BIT_SUPPORT + case png_g16: + pData->fProcessrow = (mng_fptr)mng_process_g16; + break; + case png_ga16: + pData->fProcessrow = (mng_fptr)mng_process_ga16; + break; + case png_rgb16: + pData->fProcessrow = (mng_fptr)mng_process_rgb16; + break; + case png_rgba16: + pData->fProcessrow = (mng_fptr)mng_process_rgba16; + break; +#endif + default: + break; + } + + if (pData->pStoreobj) /* store in object too ? */ + { +#ifndef MNG_NO_DELTA_PNG + if ((pData->bHasDHDR) && (pData->bDeltaimmediate)) + switch (pData->ePng_imgtype) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_g1: + pData->fStorerow = (mng_fptr)mng_delta_g1; + break; + case png_g2: + pData->fStorerow = (mng_fptr)mng_delta_g2; + break; + case png_g4: + pData->fStorerow = (mng_fptr)mng_delta_g4; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_g8: + pData->fStorerow = (mng_fptr)mng_delta_g8; + break; +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_idx1: + pData->fStorerow = (mng_fptr)mng_delta_idx1; + break; + case png_idx2: + pData->fStorerow = (mng_fptr)mng_delta_idx2; + break; + case png_idx4: + pData->fStorerow = (mng_fptr)mng_delta_idx4; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_idx8: + pData->fStorerow = (mng_fptr)mng_delta_idx8; + break; + case png_ga8: + pData->fStorerow = (mng_fptr)mng_delta_ga8; + break; + case png_rgb8: + pData->fStorerow = (mng_fptr)mng_delta_rgb8; + break; + case png_rgba8: + pData->fStorerow = (mng_fptr)mng_delta_rgba8; + break; +#ifndef MNG_NO_16BIT_SUPPORT + case png_g16: + pData->fStorerow = (mng_fptr)mng_delta_g16; + break; + case png_ga16: + pData->fStorerow = (mng_fptr)mng_delta_ga16; + break; + case png_rgb16: + pData->fStorerow = (mng_fptr)mng_delta_rgb16; + break; + case png_rgba16: + pData->fStorerow = (mng_fptr)mng_delta_rgba16; + break; +#endif + default: + break; + } + else +#endif /* MNG_NO_DELTA_PNG */ + switch (pData->ePng_imgtype) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_g1: + pData->fStorerow = (mng_fptr)mng_store_g1; + break; + case png_g2: + pData->fStorerow = (mng_fptr)mng_store_g2; + break; + case png_g4: + pData->fStorerow = (mng_fptr)mng_store_g4; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_g8: + pData->fStorerow = (mng_fptr)mng_store_g8; + break; +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_idx1: + pData->fStorerow = (mng_fptr)mng_store_idx1; + break; + case png_idx2: + pData->fStorerow = (mng_fptr)mng_store_idx2; + break; + case png_idx4: + pData->fStorerow = (mng_fptr)mng_store_idx4; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_idx8: + pData->fStorerow = (mng_fptr)mng_store_idx8; + break; + case png_ga8: + pData->fStorerow = (mng_fptr)mng_store_ga8; + break; + case png_rgb8: + pData->fStorerow = (mng_fptr)mng_store_rgb8; + break; + case png_rgba8: + pData->fStorerow = (mng_fptr)mng_store_rgba8; + break; +#ifndef MNG_NO_16BIT_SUPPORT + case png_g16: + pData->fStorerow = (mng_fptr)mng_store_g16; + break; + case png_ga16: + pData->fStorerow = (mng_fptr)mng_store_ga16; + break; + case png_rgb16: + pData->fStorerow = (mng_fptr)mng_store_rgb16; + break; + case png_rgba16: + pData->fStorerow = (mng_fptr)mng_store_rgba16; + break; +#endif + +#ifdef MNG_INCLUDE_JNG +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_jpeg_a1: +/* if (pData->iJHDRimgbitdepth == 8) */ + { + switch (pData->iJHDRcolortype) + { + case 12 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a1; break; } + case 14 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a1; break; } + } + } + /* TODO: bitdepth 12 & 20 */ + break; + case png_jpeg_a2: +/* if (pData->iJHDRimgbitdepth == 8) */ + { + switch (pData->iJHDRcolortype) + { + case 12 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a2; break; } + case 14 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a2; break; } + } + } + break; + /* TODO: bitdepth 12 & 20 */ + case png_jpeg_a4: +/* if (pData->iJHDRimgbitdepth == 8) */ + { + switch (pData->iJHDRcolortype) + { + case 12 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a4; break; } + case 14 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a4; break; } + } + } + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + /* TODO: bitdepth 12 & 20 */ + case png_jpeg_a8: +/* if (pData->iJHDRimgbitdepth == 8) */ + { + switch (pData->iJHDRcolortype) + { + case 12 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a8; break; } + case 14 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a8; break; } + } + } + break; + /* TODO: bitdepth 12 & 20 */ +#ifndef MNG_NO_16BIT_SUPPORT + case png_jpeg_a16: +/* if (pData->iJHDRimgbitdepth == 8) */ + { + switch (pData->iJHDRcolortype) + { + case 12 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a16; break; } + case 14 : + { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a16; break; } + } + } + break; + /* TODO: bitdepth 12 & 20 */ +#endif +#endif /* MNG_INCLUDE_JNG */ + default: + break; + } + } + +#ifdef FILTER192 /* leveling & differing ? */ + if (pData->iFilter == MNG_FILTER_DIFFERING) + switch (pData->ePng_imgtype) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_g1: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a1: +#endif + pData->fDifferrow = (mng_fptr)mng_differ_g1; + break; + case png_g2: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a2: +#endif + pData->fDifferrow = (mng_fptr)mng_differ_g2; + break; + case png_g4: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a4: +#endif + pData->fDifferrow = (mng_fptr)mng_differ_g4; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_g8: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a8: +#endif + pData->fDifferrow = (mng_fptr)mng_differ_g8; + break; + case png_rgb8: + pData->fDifferrow = (mng_fptr)mng_differ_rgb8; + break; +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_idx1: + pData->fDifferrow = (mng_fptr)mng_differ_idx1; + break; + case png_idx2: + pData->fDifferrow = (mng_fptr)mng_differ_idx2; + break; + case png_idx4: + pData->fDifferrow = (mng_fptr)mng_differ_idx4; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_idx8: + pData->fDifferrow = (mng_fptr)mng_differ_idx8; + break; + case png_ga8: + pData->fDifferrow = (mng_fptr)mng_differ_ga8; + break; + case png_rgb8: + pData->fDifferrow = (mng_fptr)mng_differ_rgb8; + break; + case png_rgba8: + pData->fDifferrow = (mng_fptr)mng_differ_rgba8; + break; +#ifndef MNG_NO_16BIT_SUPPORT + case png_g16: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a16: +#endif + pData->fDifferrow = (mng_fptr)mng_differ_g16; + break; + case png_ga16: + pData->fDifferrow = (mng_fptr)mng_differ_ga16; + break; + case png_rgb16: + pData->fDifferrow = (mng_fptr)mng_differ_rgb16; + break; + case png_rgba16: + pData->fDifferrow = (mng_fptr)mng_differ_rgba16; + break; +#endif + default: + break; + } +#endif + + switch (pData->ePng_imgtype) + { +#ifndef MNG_NO_1_2_4BIT_SUPPORT + case png_g1: + case png_idx1: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a1: +#endif + pData->iSamplemul = 1; + pData->iSampleofs = 7; + pData->iSamplediv = 3; + pData->iFilterbpp = 1; + break; + case png_g2: + case png_idx2: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a2: +#endif + pData->iSamplemul = 1; + pData->iSampleofs = 3; + pData->iSamplediv = 2; + pData->iFilterbpp = 1; + break; + case png_g4: + case png_idx4: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a4: +#endif + pData->iSamplemul = 1; + pData->iSampleofs = 1; + pData->iSamplediv = 1; + pData->iFilterbpp = 1; + break; +#endif /* MNG_NO_1_2_4BIT_SUPPORT */ + case png_g8: + case png_idx8: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a8: +#endif + pData->iSamplemul = 1; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iFilterbpp = 1; + break; + case png_ga8: +#ifndef MNG_NO_16BIT_SUPPORT + case png_g16: +#ifdef MNG_INCLUDE_JNG + case png_jpeg_a16: +#endif +#endif + pData->iSamplemul = 2; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iFilterbpp = 2; + break; + case png_rgb8: + pData->iSamplemul = 3; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iFilterbpp = 3; + break; +#ifndef MNG_NO_16BIT_SUPPORT + case png_ga16: +#endif + case png_rgba8: + pData->iSamplemul = 4; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iFilterbpp = 4; + break; +#ifndef MNG_NO_16BIT_SUPPORT + case png_rgb16: + pData->iSamplemul = 6; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iFilterbpp = 6; + break; + case png_rgba16: + pData->iSamplemul = 8; + pData->iSampleofs = 0; + pData->iSamplediv = 0; + pData->iFilterbpp = 8; + break; +#endif + default: + break; + } + + if (pData->iInterlace) /* noninterlaced */ + { + pData->iPass = 0; /* from 0..6; (1..7 in specification) */ + pData->iRow = interlace_row [0]; + pData->iRowinc = interlace_rowskip [0]; + pData->iCol = interlace_col [0]; + pData->iColinc = interlace_colskip [0]; + pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> + interlace_divider [0]; + pData->iRowmax = ((pData->iDatawidth * pData->iSamplemul + + pData->iSampleofs) >> pData->iSamplediv) + pData->iPixelofs; + } + else /* interlaced */ + { + pData->iPass = -1; + pData->iRow = 0; + pData->iRowinc = 1; + pData->iCol = 0; + pData->iColinc = 1; + pData->iRowsamples = pData->iDatawidth; + } + if (pData->iSamplediv > 0) + pData->iRowsize = (pData->iRowsamples + pData->iSampleofs) >> + pData->iSamplediv; + else + pData->iRowsize = (pData->iRowsamples * pData->iSamplemul); + + if (!pData->iInterlace) /* noninterlaced */ + pData->iRowmax = pData->iRowsize + pData->iPixelofs; + +#ifdef MNG_NO_16BIT_SUPPORT + pData->bIsRGBA16 = MNG_FALSE; +#else + switch (pData->ePng_imgtype) + { + case png_g16: + case png_ga16: + case png_rgb16: + case png_rgba16: + pData->bIsRGBA16 = MNG_TRUE; + break; + default: + pData->bIsRGBA16 = MNG_FALSE; + break; + } +#endif + + } +#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */ + + if (pData->pStoreobj) /* storage object selected ? */ + { + pData->pStorebuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + /* and so it becomes viewable ! */ + ((mng_imagep)pData->pStoreobj)->bViewable = MNG_TRUE; + ((mng_imagedatap)pData->pStorebuf)->bViewable = MNG_TRUE; + } + + /* allocate the buffers; the individual init routines have already + calculated the required maximum size; except in the case of a JNG + without alpha!!! */ + if (pData->iRowmax) + { +#if defined(MNG_NO_16BIT_SUPPORT) || defined (MNG_NO_1_2_4BIT_SUPPORT) + mng_uint8 iRowadd = 0; +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iPNGdepth < 8) + iRowadd=(pData->iPNGdepth*pData->iRowmax+7)/8; +#endif +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iPNGdepth > 8) + iRowadd=pData->iRowmax; +#endif + MNG_ALLOC (pData, pData->pWorkrow, pData->iRowmax+iRowadd); + MNG_ALLOC (pData, pData->pPrevrow, pData->iRowmax+iRowadd); +#else + MNG_ALLOC (pData, pData->pWorkrow, pData->iRowmax); + MNG_ALLOC (pData, pData->pPrevrow, pData->iRowmax); +#endif + } + + /* allocate an RGBA16 row for intermediate processing */ + MNG_ALLOC (pData, pData->pRGBArow, (pData->iDatawidth << 3)); + +#ifndef MNG_NO_CMS + if (pData->fDisplayrow) /* display "on-the-fly" ? */ + { +#if defined(MNG_FULL_CMS) /* determine color-management initialization */ + mng_retcode iRetcode = mng_init_full_cms (pData, MNG_TRUE, MNG_TRUE, MNG_FALSE); +#elif defined(MNG_GAMMA_ONLY) + mng_retcode iRetcode = mng_init_gamma_only (pData, MNG_TRUE, MNG_TRUE, MNG_FALSE); +#elif defined(MNG_APP_CMS) + mng_retcode iRetcode = mng_init_app_cms (pData, MNG_TRUE, MNG_TRUE, MNG_FALSE); +#endif + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* !MNG_NO_CMS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_INIT_ROWPROC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_next_row (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_ROW, MNG_LC_START); +#endif + + pData->iRow += pData->iRowinc; /* increase the row counter */ + + if (pData->iPass >= 0) /* interlaced ? */ + { + while ((pData->iPass < 7) && /* went 'outside' the image ? */ + ((pData->iRow >= (mng_int32)pData->iDataheight) || + (pData->iCol >= (mng_int32)pData->iDatawidth ) )) + { + pData->iPass++; /* next pass ! */ + + if (pData->iPass < 7) /* there's only 7 passes ! */ + { + pData->iRow = interlace_row [pData->iPass]; + pData->iRowinc = interlace_rowskip [pData->iPass]; + pData->iCol = interlace_col [pData->iPass]; + pData->iColinc = interlace_colskip [pData->iPass]; + pData->iRowsamples = (pData->iDatawidth - pData->iCol + interlace_roundoff [pData->iPass]) + >> interlace_divider [pData->iPass]; + + if (pData->iSamplemul > 1) /* recalculate row dimension */ + pData->iRowsize = pData->iRowsamples * pData->iSamplemul; + else + if (pData->iSamplediv > 0) + pData->iRowsize = (pData->iRowsamples + pData->iSampleofs) >> pData->iSamplediv; + else + pData->iRowsize = pData->iRowsamples; + + } + + if ((pData->iPass < 7) && /* reset previous row to zeroes ? */ + (pData->iRow < (mng_int32)pData->iDataheight) && + (pData->iCol < (mng_int32)pData->iDatawidth ) ) + { /* making sure the filters will work properly! */ + mng_int32 iX; + mng_uint8p pTemp = pData->pPrevrow; + +#ifdef MNG_NO_16BIT_SUPPORT +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iPNGmult*pData->iRowsize; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iPNGmult*pData->iRowsize; iX++) +#endif +#else +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsize; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsize; iX++) +#endif +#endif + { + *pTemp = 0; + pTemp++; + } + } + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_ROW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_cleanup_rowproc (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLEANUP_ROWPROC, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_LCMS /* cleanup cms profile/transform */ + { + mng_retcode iRetcode = mng_clear_cms (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif /* MNG_INCLUDE_LCMS */ + + if (pData->pRGBArow) /* cleanup buffer for intermediate row */ + MNG_FREEX (pData, pData->pRGBArow, (pData->iDatawidth << 3)); + if (pData->pPrevrow) /* cleanup buffer for previous row */ + MNG_FREEX (pData, pData->pPrevrow, pData->iRowmax); + if (pData->pWorkrow) /* cleanup buffer for working row */ + MNG_FREEX (pData, pData->pWorkrow, pData->iRowmax); + + pData->pWorkrow = MNG_NULL; /* propogate uninitialized buffers */ + pData->pPrevrow = MNG_NULL; + pData->pRGBArow = MNG_NULL; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_CLEANUP_ROWPROC, MNG_LC_END); +#endif + + return MNG_NOERROR; /* woohiii */ +} + +/* ************************************************************************** */ +/* * * */ +/* * Generic row processing routines for JNG * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +/* ************************************************************************** */ + +mng_retcode mng_display_jpeg_rows (mng_datap pData) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_JPEG_ROWS, MNG_LC_START); +#endif + /* any completed rows ? */ + if ((pData->iJPEGrow > pData->iJPEGdisprow) && + (pData->iJPEGalpharow > pData->iJPEGdisprow) ) + { + mng_uint32 iX, iMax; + mng_uint32 iSaverow = pData->iRow; /* save alpha decompression row-count */ + /* determine the highest complete(!) row */ + if (pData->iJPEGrow > pData->iJPEGalpharow) + iMax = pData->iJPEGalpharow; + else + iMax = pData->iJPEGrow; + /* display the rows */ + for (iX = pData->iJPEGdisprow; iX < iMax; iX++) + { + pData->iRow = iX; /* make sure we all know which row to handle */ + /* makeup an intermediate row from the buffer */ + iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData); + /* color-correct it if necessary */ + if ((!iRetcode) && (pData->fCorrectrow)) + iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData); + + if (!iRetcode) /* and display it */ + { + iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData); + + if (!iRetcode) /* check progressive display refresh */ + iRetcode = mng_display_progressive_check (pData); + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + + pData->iJPEGdisprow = iMax; /* keep track of the last displayed row */ + pData->iRow = iSaverow; /* restore alpha decompression row-count */ + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DISPLAY_JPEG_ROWS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_next_jpeg_alpharow (mng_datap pData) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_JPEG_ALPHAROW, MNG_LC_START); +#endif + + pData->iJPEGalpharow++; /* count the row */ + + if (pData->fDisplayrow) /* display "on-the-fly" ? */ + { /* try to display what you can */ + iRetcode = mng_display_jpeg_rows (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_JPEG_ALPHAROW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_next_jpeg_row (mng_datap pData) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_JPEG_ROW, MNG_LC_START); +#endif + + pData->iJPEGrow++; /* increase the row-counter */ + + if (pData->fDisplayrow) /* display "on-the-fly" ? */ + { /* has alpha channel ? */ + if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) || + (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) ) + { /* try to display what you can */ + iRetcode = mng_display_jpeg_rows (pData); + } + else + { /* make sure we all know which row to handle */ + pData->iRow = pData->iJPEGrow - 1; + /* makeup an intermediate row from the buffer */ + iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData); + /* color-correct it if necessary */ + if ((!iRetcode) && (pData->fCorrectrow)) + iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData); + + if (!iRetcode) /* and display it */ + { + iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData); + + if (!iRetcode) /* check progressive display refresh */ + iRetcode = mng_display_progressive_check (pData); + } + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + } + + /* surpassed last filled row ? */ + if (pData->iJPEGrow > pData->iJPEGrgbrow) + pData->iJPEGrgbrow = pData->iJPEGrow; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_NEXT_JPEG_ROW, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_MAGN +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN +#ifndef MNG_NO_GRAY_SUPPORT +mng_retcode mng_magnify_g8_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX, iS, iM; + mng_uint8p pTempsrc1; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X1, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + + if (iX == 0) /* first interval ? */ + iM = iML; + else + if (iX == (iWidth - 1)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + + for (iS = 1; iS < iM; iS++) /* fill interval */ + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + } + + pTempsrc1++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_g8_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X2, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 1; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { /* is it same as first ? */ + if (*pTempsrc1 == *pTempsrc2) + { + for (iS = 1; iS < iM; iS++) /* then just repeat the first */ + { + *pTempdst = *pTempsrc1; + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) /* calculate the distances */ + { + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2)) + (mng_int32)(*pTempsrc1) ); + pTempdst++; + } + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + } + } + } + + pTempsrc1++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_g8_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X3, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 1; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { /* is it same as first ? */ + if (*pTempsrc1 == *pTempsrc2) + { + for (iS = 1; iS < iM; iS++) /* then just repeat the first */ + { + *pTempdst = *pTempsrc1; + pTempdst++; + } + } + else + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* replicate first half */ + { + *pTempdst = *pTempsrc1; + pTempdst++; + } + + for (iS = iH; iS < iM; iS++) /* replicate second half */ + { + *pTempdst = *pTempsrc2; + pTempdst++; + } + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + } + } + } + + pTempsrc1++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_GRAY_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb8_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX, iS, iM; + mng_uint8p pTempsrc1; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X1, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + + if (iX == 0) /* first interval ? */ + iM = iML; + else + if (iX == (iWidth - 1)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + + for (iS = 1; iS < iM; iS++) /* fill interval */ + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + } + + pTempsrc1 += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb8_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X2, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 3; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + for (iS = 1; iS < iM; iS++) + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2)) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) - + (mng_int32)(*(pTempsrc1+1)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) ); + + pTempdst++; + + if (*(pTempsrc1+2) == *(pTempsrc2+2)) + *pTempdst = *(pTempsrc1+2); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+2)) - + (mng_int32)(*(pTempsrc1+2)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+2)) ); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + } + } + } + + pTempsrc1 += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb8_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X3, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 3; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* replicate first half */ + { + *pTempdst = *pTempsrc1; + *(pTempdst+1) = *(pTempsrc1+1); + *(pTempdst+2) = *(pTempsrc1+2); + + pTempdst += 3; + } + + for (iS = iH; iS < iM; iS++) /* replicate second half */ + { + *pTempdst = *pTempsrc2; + *(pTempdst+1) = *(pTempsrc2+1); + *(pTempdst+2) = *(pTempsrc2+2); + + pTempdst += 3; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + } + } + } + + pTempsrc1 += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_GRAY_SUPPORT +mng_retcode mng_magnify_ga8_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX, iS, iM; + mng_uint8p pTempsrc1; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X1, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + iM = iML; + else + if (iX == (iWidth - 1)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + + for (iS = 1; iS < iM; iS++) /* fill interval */ + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga8_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X2, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 2; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + for (iS = 1; iS < iM; iS++) + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2)) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) - + (mng_int32)(*(pTempsrc1+1)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) ); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + } + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga8_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X3, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 2; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* replicate first half */ + { + *pTempdst = *pTempsrc1; + *(pTempdst+1) = *(pTempsrc1+1); + + pTempdst += 2; + } + + for (iS = iH; iS < iM; iS++) /* replicate second half */ + { + *pTempdst = *pTempsrc2; + *(pTempdst+1) = *(pTempsrc2+1); + + pTempdst += 2; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + } + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga8_x4 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X4, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 2; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* first half */ + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2)) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + + *pTempdst = *(pTempsrc1+1); /* replicate alpha from left */ + + pTempdst++; + } + + for (iS = iH; iS < iM; iS++) /* second half */ + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2)) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + + *pTempdst = *(pTempsrc2+1); /* replicate alpha from right */ + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + } + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga8_x5 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X5, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 2; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* first half */ + { + *pTempdst = *pTempsrc1; /* replicate gray from left */ + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1);/* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) - + (mng_int32)(*(pTempsrc1+1)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) ); + + pTempdst++; + } + + for (iS = iH; iS < iM; iS++) /* second half */ + { + *pTempdst = *pTempsrc2; /* replicate gray from right */ + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1);/* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) - + (mng_int32)(*(pTempsrc1+1)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) ); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + } + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X5, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_GRAY_SUPPORT */ +#endif /* MNG_OPTIMIZE_FOOTPRINT_MAGN */ + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX, iS, iM; + mng_uint8p pTempsrc1; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X1, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + iM = iML; + else + if (iX == (iWidth - 1)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + + for (iS = 1; iS < iM; iS++) /* fill interval */ + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X2, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 4; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + for (iS = 1; iS < iM; iS++) + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2)) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) - + (mng_int32)(*(pTempsrc1+1)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) ); + + pTempdst++; + + if (*(pTempsrc1+2) == *(pTempsrc2+2)) + *pTempdst = *(pTempsrc1+2); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+2)) - + (mng_int32)(*(pTempsrc1+2)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+2)) ); + + pTempdst++; + + if (*(pTempsrc1+3) == *(pTempsrc2+3)) + *pTempdst = *(pTempsrc1+3); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+3)) - + (mng_int32)(*(pTempsrc1+3)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+3)) ); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + } + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X3, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 4; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* replicate first half */ + { + *pTempdst = *pTempsrc1; + *(pTempdst+1) = *(pTempsrc1+1); + *(pTempdst+2) = *(pTempsrc1+2); + *(pTempdst+3) = *(pTempsrc1+3); + + pTempdst += 4; + } + + for (iS = iH; iS < iM; iS++) /* replicate second half */ + { + *pTempdst = *pTempsrc2; + *(pTempdst+1) = *(pTempsrc2+1); + *(pTempdst+2) = *(pTempsrc2+2); + *(pTempdst+3) = *(pTempsrc2+3); + + pTempdst += 4; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + } + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_x4 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X4, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 4; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* first half */ + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2)) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) - + (mng_int32)(*(pTempsrc1+1)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) ); + + pTempdst++; + + if (*(pTempsrc1+2) == *(pTempsrc2+2)) + *pTempdst = *(pTempsrc1+2); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+2)) - + (mng_int32)(*(pTempsrc1+2)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+2)) ); + + pTempdst++; + /* replicate alpha from left */ + *pTempdst = *(pTempsrc1+3); + + pTempdst++; + } + + for (iS = iH; iS < iM; iS++) /* second half */ + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2)) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) - + (mng_int32)(*(pTempsrc1+1)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) ); + + pTempdst++; + + if (*(pTempsrc1+2) == *(pTempsrc2+2)) + *pTempdst = *(pTempsrc1+2); + else + *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+2)) - + (mng_int32)(*(pTempsrc1+2)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+2)) ); + + pTempdst++; + /* replicate alpha from right */ + *pTempdst = *(pTempsrc2+3); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + } + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_x5 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X5, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline; /* initialize pixel-loop */ + pTempdst = pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 4; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* first half */ + { + *pTempdst = *pTempsrc1; /* replicate color from left */ + *(pTempdst+1) = *(pTempsrc1+1); + *(pTempdst+2) = *(pTempsrc1+2); + + if (*(pTempsrc1+3) == *(pTempsrc2+3)) + *(pTempdst+3) = *(pTempsrc1+3); + else + *(pTempdst+3) = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+3)) - + (mng_int32)(*(pTempsrc1+3)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+3)) ); + + pTempdst += 4; + } + + for (iS = iH; iS < iM; iS++) /* second half */ + { + *pTempdst = *pTempsrc2; /* replicate color from right */ + *(pTempdst+1) = *(pTempsrc2+1); + *(pTempdst+2) = *(pTempsrc2+2); + + if (*(pTempsrc1+3) == *(pTempsrc2+3)) + *(pTempdst+3) = *(pTempsrc1+3); + else + *(pTempdst+3) = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+3)) - + (mng_int32)(*(pTempsrc1+3)) ) + iM) / + (iM * 2)) + (mng_int32)(*(pTempsrc1+3)) ); + + pTempdst += 4; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + } + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN +#ifndef MNG_NO_GRAY_SUPPORT +mng_retcode mng_magnify_g8_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y1, MNG_LC_START); +#endif + + MNG_COPY (pDstline, pSrcline1, iWidth); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ +mng_retcode mng_magnify_g8_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y2, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = pSrcline2; + pTempdst = pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_g8_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y3, MNG_LC_START); +#endif + + if (pSrcline2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + MNG_COPY (pDstline, pSrcline1, iWidth) + else + MNG_COPY (pDstline, pSrcline2, iWidth); + } + else + { /* just repeat the entire line */ + MNG_COPY (pDstline, pSrcline1, iWidth); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_GRAY_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb8_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y1, MNG_LC_START); +#endif + + MNG_COPY (pDstline, pSrcline1, iWidth * 3); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb8_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y2, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = pSrcline2; + pTempdst = pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth * 3); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb8_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y3, MNG_LC_START); +#endif + + if (pSrcline2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + MNG_COPY (pDstline, pSrcline1, iWidth * 3) + else + MNG_COPY (pDstline, pSrcline2, iWidth * 3); + } + else + { /* just repeat the entire line */ + MNG_COPY (pDstline, pSrcline1, iWidth * 3); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_GRAY_SUPPORT +mng_retcode mng_magnify_ga8_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y1, MNG_LC_START); +#endif + + MNG_COPY (pDstline, pSrcline1, iWidth << 1); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga8_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y2, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = pSrcline2; + pTempdst = pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth << 1); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga8_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y3, MNG_LC_START); +#endif + + if (pSrcline2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + MNG_COPY (pDstline, pSrcline1, iWidth << 1) + else + MNG_COPY (pDstline, pSrcline2, iWidth << 1); + } + else + { /* just repeat the entire line */ + MNG_COPY (pDstline, pSrcline1, iWidth << 1); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga8_y4 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y4, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = pSrcline2; + pTempdst = pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2 += 2; + + *pTempdst++ = *pTempsrc1++; /* replicate alpha from top */ + } + } + else + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1 += 2; + pTempsrc2++; + + *pTempdst++ = *pTempsrc2++; /* replicate alpha from bottom */ + } + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth << 1); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga8_y5 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y5, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = pSrcline2; + pTempdst = pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + { + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* replicate gray from top */ + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */ + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc2; /* replicate gray from bottom */ + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */ + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth << 1); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y5, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_GRAY_SUPPORT */ +#endif /* MNG_OPTIMIZE_FOOTPRINT_MAGN */ + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y1, MNG_LC_START); +#endif + + MNG_COPY (pDstline, pSrcline1, iWidth << 2); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y2, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = pSrcline2; + pTempdst = pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth << 2); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y3, MNG_LC_START); +#endif + + if (pSrcline2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + MNG_COPY (pDstline, pSrcline1, iWidth << 2) + else + MNG_COPY (pDstline, pSrcline2, iWidth << 2); + } + else + { /* just repeat the entire line */ + MNG_COPY (pDstline, pSrcline1, iWidth << 2); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_y4 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y4, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = pSrcline2; + pTempdst = pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2 += 2; + + *pTempdst++ = *pTempsrc1++; /* replicate alpha from top */ + } + } + else + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1 += 2; + pTempsrc2++; + + *pTempdst++ = *pTempsrc2++; /* replicate alpha from bottom */ + } + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth << 2); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba8_y5 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint8p pTempsrc1; + mng_uint8p pTempsrc2; + mng_uint8p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y5, MNG_LC_START); +#endif + + pTempsrc1 = pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = pSrcline2; + pTempdst = pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + { + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst++ = *pTempsrc1++; /* replicate color from top */ + *pTempdst++ = *pTempsrc1++; + *pTempdst++ = *pTempsrc1++; + + pTempsrc2 += 3; + + if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */ + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst++ = *pTempsrc2++; /* replicate color from bottom */ + *pTempdst++ = *pTempsrc2++; + *pTempdst++ = *pTempsrc2++; + + pTempsrc1 += 3; + + if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */ + *pTempdst = *pTempsrc1; + else + *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) - + (mng_int32)(*pTempsrc1) ) + iM) / + (iM * 2) ) + (mng_int32)(*pTempsrc1) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth << 2); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y5, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_NO_GRAY_SUPPORT +mng_retcode mng_magnify_g16_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX, iS, iM; + mng_uint16p pTempsrc1; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X1, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + + if (iX == 0) /* first interval ? */ + iM = iML; + else + if (iX == (iWidth - 1)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + + for (iS = 1; iS < iM; iS++) /* fill interval */ + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + } + + pTempsrc1++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_g16_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X2, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 1; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { /* is it same as first ? */ + if (*pTempsrc1 == *pTempsrc2) + { + for (iS = 1; iS < iM; iS++) /* then just repeat the first */ + { + *pTempdst = *pTempsrc1; + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) /* calculate the distances */ + { + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) )); + pTempdst++; + } + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + } + } + } + + pTempsrc1++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_g16_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X3, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 1; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { /* is it same as first ? */ + if (*pTempsrc1 == *pTempsrc2) + { + for (iS = 1; iS < iM; iS++) /* then just repeat the first */ + { + *pTempdst = *pTempsrc1; + pTempdst++; + } + } + else + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* replicate first half */ + { + *pTempdst = *pTempsrc1; + pTempdst++; + } + + for (iS = iH; iS < iM; iS++) /* replicate second half */ + { + *pTempdst = *pTempsrc2; + pTempdst++; + } + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + } + } + } + + pTempsrc1++; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_GRAY_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb16_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX, iS, iM; + mng_uint16p pTempsrc1; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X1, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + + if (iX == 0) /* first interval ? */ + iM = iML; + else + if (iX == (iWidth - 1)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + + for (iS = 1; iS < iM; iS++) /* fill interval */ + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + } + + pTempsrc1 += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb16_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X2, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 3; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + for (iS = 1; iS < iM; iS++) + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) ); + + pTempdst++; + + if (*(pTempsrc1+2) == *(pTempsrc2+2)) + *pTempdst = *(pTempsrc1+2); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+2))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) ); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + } + } + } + + pTempsrc1 += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb16_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X3, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 3; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* replicate first half */ + { + *pTempdst = *pTempsrc1; + *(pTempdst+1) = *(pTempsrc1+1); + *(pTempdst+2) = *(pTempsrc1+2); + + pTempdst += 3; + } + + for (iS = iH; iS < iM; iS++) /* replicate second half */ + { + *pTempdst = *pTempsrc2; + *(pTempdst+1) = *(pTempsrc2+1); + *(pTempdst+2) = *(pTempsrc2+2); + + pTempdst += 3; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + } + } + } + + pTempsrc1 += 3; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_GRAY_SUPPORT +mng_retcode mng_magnify_ga16_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX, iS, iM; + mng_uint16p pTempsrc1; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X1, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p) pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + iM = iML; + else + if (iX == (iWidth - 1)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + + for (iS = 1; iS < iM; iS++) /* fill interval */ + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga16_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X2, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 2; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + for (iS = 1; iS < iM; iS++) + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) ); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + } + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga16_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X3, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 2; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* replicate first half */ + { + *pTempdst = *pTempsrc1; + *(pTempdst+1) = *(pTempsrc1+1); + + pTempdst += 2; + } + + for (iS = iH; iS < iM; iS++) /* replicate second half */ + { + *pTempdst = *pTempsrc2; + *(pTempdst+1) = *(pTempsrc2+1); + + pTempdst += 2; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + } + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga16_x4 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X4, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 2; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* first half */ + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + + *pTempdst = *(pTempsrc1+1); /* replicate alpha from left */ + + pTempdst++; + } + + for (iS = iH; iS < iM; iS++) /* second half */ + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + + *pTempdst = *(pTempsrc2+1); /* replicate alpha from right */ + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + } + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga16_x5 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X5, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 2; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* first half */ + { + *pTempdst = *pTempsrc1; /* replicate gray from left */ + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1);/* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) ); + + pTempdst++; + } + + for (iS = iH; iS < iM; iS++) /* second half */ + { + *pTempdst = *pTempsrc2; /* replicate gray from right */ + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1);/* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) ); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + } + } + } + + pTempsrc1 += 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X5, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_GRAY_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX, iS, iM; + mng_uint16p pTempsrc1; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X1, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + iM = iML; + else + if (iX == (iWidth - 1)) /* last interval ? */ + iM = iMR; + else + iM = iMX; + + for (iS = 1; iS < iM; iS++) /* fill interval */ + { + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X2, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 4; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + for (iS = 1; iS < iM; iS++) + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) ); + + pTempdst++; + + if (*(pTempsrc1+2) == *(pTempsrc2+2)) + *pTempdst = *(pTempsrc1+2); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+2))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) ); + + pTempdst++; + + if (*(pTempsrc1+3) == *(pTempsrc2+3)) + *pTempdst = *(pTempsrc1+3); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+3))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) ); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + } + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X3, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 4; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* replicate first half */ + { + *pTempdst = *pTempsrc1; + *(pTempdst+1) = *(pTempsrc1+1); + *(pTempdst+2) = *(pTempsrc1+2); + *(pTempdst+3) = *(pTempsrc1+3); + + pTempdst += 4; + } + + for (iS = iH; iS < iM; iS++) /* replicate second half */ + { + *pTempdst = *pTempsrc2; + *(pTempdst+1) = *(pTempsrc2+1); + *(pTempdst+2) = *(pTempsrc2+2); + *(pTempdst+3) = *(pTempsrc2+3); + + pTempdst += 4; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + } + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_x4 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X4, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 4; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* first half */ + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) ); + + pTempdst++; + + if (*(pTempsrc1+2) == *(pTempsrc2+2)) + *pTempdst = *(pTempsrc1+2); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+2))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) ); + + pTempdst++; + /* replicate alpha from left */ + *pTempdst = *(pTempsrc1+3); + + pTempdst++; + } + + for (iS = iH; iS < iM; iS++) /* second half */ + { + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; /* just repeat the first */ + else /* calculate the distance */ + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + + if (*(pTempsrc1+1) == *(pTempsrc2+1)) + *pTempdst = *(pTempsrc1+1); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) ); + + pTempdst++; + + if (*(pTempsrc1+2) == *(pTempsrc2+2)) + *pTempdst = *(pTempsrc1+2); + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+2))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) ); + + pTempdst++; + /* replicate alpha from right */ + *pTempdst = *(pTempsrc2+3); + + pTempdst++; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + } + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_x5 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_int32 iS, iM, iH; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X5, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */ + pTempdst = (mng_uint16p)pDstline; + + for (iX = 0; iX < iWidth; iX++) + { + pTempsrc2 = pTempsrc1 + 4; + + *pTempdst = *pTempsrc1; /* copy original source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + + if (iX == 0) /* first interval ? */ + { + if (iWidth == 1) /* single pixel ? */ + pTempsrc2 = MNG_NULL; + + iM = (mng_int32)iML; + } + else + if (iX == (iWidth - 2)) /* last interval ? */ + iM = (mng_int32)iMR; + else + iM = (mng_int32)iMX; + /* fill interval ? */ + if ((iX < iWidth - 1) || (iWidth == 1)) + { + if (pTempsrc2) /* do we have the second pixel ? */ + { + iH = (iM+1) / 2; /* calculate halfway point */ + + for (iS = 1; iS < iH; iS++) /* first half */ + { + *pTempdst = *pTempsrc1; /* replicate color from left */ + *(pTempdst+1) = *(pTempsrc1+1); + *(pTempdst+2) = *(pTempsrc1+2); + + if (*(pTempsrc1+3) == *(pTempsrc2+3)) + *(pTempdst+3) = *(pTempsrc1+3); + else + mng_put_uint16 ((mng_uint8p)(pTempdst+3), + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+3))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) ); + + pTempdst += 4; + } + + for (iS = iH; iS < iM; iS++) /* second half */ + { + *pTempdst = *pTempsrc2; /* replicate color from right */ + *(pTempdst+1) = *(pTempsrc2+1); + *(pTempdst+2) = *(pTempsrc2+2); + + if (*(pTempsrc1+3) == *(pTempsrc2+3)) + *(pTempdst+3) = *(pTempsrc1+3); + else + mng_put_uint16 ((mng_uint8p)(pTempdst+3), + (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+3))) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) ); + + pTempdst += 4; + } + } + else + { + for (iS = 1; iS < iM; iS++) + { + *pTempdst = *pTempsrc1; /* repeat first source pixel */ + pTempdst++; + *pTempdst = *(pTempsrc1+1); + pTempdst++; + *pTempdst = *(pTempsrc1+2); + pTempdst++; + *pTempdst = *(pTempsrc1+3); + pTempdst++; + } + } + } + + pTempsrc1 += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_GRAY_SUPPORT +mng_retcode mng_magnify_g16_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y1, MNG_LC_START); +#endif + + MNG_COPY (pDstline, pSrcline1, (iWidth << 1)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_g16_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y2, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = (mng_uint16p)pSrcline2; + pTempdst = (mng_uint16p)pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, (iWidth << 1)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_g16_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y3, MNG_LC_START); +#endif + + if (pSrcline2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + MNG_COPY (pDstline, pSrcline1, (iWidth << 1)) + else + MNG_COPY (pDstline, pSrcline2, (iWidth << 1)); + } + else + { /* just repeat the entire line */ + MNG_COPY (pDstline, pSrcline1, (iWidth << 1)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_GRAY_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb16_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y1, MNG_LC_START); +#endif + + MNG_COPY (pDstline, pSrcline1, iWidth * 6); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb16_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y2, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = (mng_uint16p)pSrcline2; + pTempdst = (mng_uint16p)pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, iWidth * 6); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgb16_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y3, MNG_LC_START); +#endif + + if (pSrcline2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + MNG_COPY (pDstline, pSrcline1, iWidth * 6) + else + MNG_COPY (pDstline, pSrcline2, iWidth * 6); + } + else + { /* just repeat the entire line */ + MNG_COPY (pDstline, pSrcline1, iWidth * 6); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y3, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_GRAY_SUPPORT +mng_retcode mng_magnify_ga16_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y1, MNG_LC_START); +#endif + + MNG_COPY (pDstline, pSrcline1, (iWidth << 2)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga16_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y2, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = (mng_uint16p)pSrcline2; + pTempdst = (mng_uint16p)pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, (iWidth << 2)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga16_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y3, MNG_LC_START); +#endif + + if (pSrcline2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + MNG_COPY (pDstline, pSrcline1, (iWidth << 2)) + else + MNG_COPY (pDstline, pSrcline2, (iWidth << 2)); + } + else + { /* just repeat the entire line */ + MNG_COPY (pDstline, pSrcline1, (iWidth << 2)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga16_y4 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y4, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = (mng_uint16p)pSrcline2; + pTempdst = (mng_uint16p)pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2 += 2; + + *pTempdst++ = *pTempsrc1++; /* replicate alpha from top */ + } + } + else + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1 += 2; + pTempsrc2++; + + *pTempdst++ = *pTempsrc2++; /* replicate alpha from bottom */ + } + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, (iWidth << 2)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_ga16_y5 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y5, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = (mng_uint16p)pSrcline2; + pTempdst = (mng_uint16p)pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + { + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc1; /* replicate gray from top */ + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */ + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst = *pTempsrc2; /* replicate gray from bottom */ + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */ + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, (iWidth << 2)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y5, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_GRAY_SUPPORT */ + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y1, MNG_LC_START); +#endif + + MNG_COPY (pDstline, pSrcline1, (iWidth << 3)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y1, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y2, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = (mng_uint16p)pSrcline2; + pTempdst = (mng_uint16p)pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, (iWidth << 3)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y3, MNG_LC_START); +#endif + + if (pSrcline2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + MNG_COPY (pDstline, pSrcline1, (iWidth << 3)) + else + MNG_COPY (pDstline, pSrcline2, (iWidth << 3)); + } + else + { /* just repeat the entire line */ + MNG_COPY (pDstline, pSrcline1, (iWidth << 3)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_y4 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y4, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = (mng_uint16p)pSrcline2; + pTempdst = (mng_uint16p)pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2 += 2; + + *pTempdst++ = *pTempsrc1++; /* replicate alpha from top */ + } + } + else + { + for (iX = 0; iX < iWidth; iX++) + { /* calculate the distances */ + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + + if (*pTempsrc1 == *pTempsrc2) + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1 += 2; + pTempsrc2++; + + *pTempdst++ = *pTempsrc2++; /* replicate alpha from bottom */ + } + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, (iWidth << 3)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y4, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_magnify_rgba16_y5 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline) +{ + mng_uint32 iX; + mng_uint16p pTempsrc1; + mng_uint16p pTempsrc2; + mng_uint16p pTempdst; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y5, MNG_LC_START); +#endif + + pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */ + pTempsrc2 = (mng_uint16p)pSrcline2; + pTempdst = (mng_uint16p)pDstline; + + if (pTempsrc2) /* do we have a second line ? */ + { + if (iS < (iM+1) / 2) /* top half ? */ + { + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst++ = *pTempsrc1++; /* replicate color from top */ + *pTempdst++ = *pTempsrc1++; + *pTempdst++ = *pTempsrc1++; + + pTempsrc2 += 3; + + if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */ + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + else + { + for (iX = 0; iX < iWidth; iX++) + { + *pTempdst++ = *pTempsrc2++; /* replicate color from bottom */ + *pTempdst++ = *pTempsrc2++; + *pTempdst++ = *pTempsrc2++; + + pTempsrc1 += 3; + + if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */ + *pTempdst = *pTempsrc1; + else + mng_put_uint16 ((mng_uint8p)pTempdst, + (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) - + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) / + (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) ); + + pTempdst++; + pTempsrc1++; + pTempsrc2++; + } + } + } + else + { /* just repeat the entire line */ + MNG_COPY (pTempdst, pTempsrc1, (iWidth << 3)); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y5, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_NO_16BIT_SUPPORT */ +#endif /* MNG_OPTIMIZE_FOOTPRINT_MAGN */ +#endif /* MNG_SKIPCHUNK_MAGN */ + +/* ************************************************************************** */ +/* * * */ +/* * PAST composition routines - compose over/under with a target object * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_composeover_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8; + mng_uint8 iCr8, iCg8, iCb8, iCa8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COMPOSEOVER_RGBA8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iFGa8 = *(pWorkrow+3); /* get alpha values */ + iBGa8 = *(pOutrow+3); + + if (iFGa8) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa8 == 0xFF) || (iBGa8 == 0)) + { /* then simply copy the values */ + *pOutrow = *pWorkrow; + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + *(pOutrow+3) = iFGa8; + } + else + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pOutrow+i), *(pWorkrow+i), iFGa8, *(pOutrow+i)); + } +#else + MNG_COMPOSE8 (*pOutrow, *pWorkrow, iFGa8, *pOutrow ); + MNG_COMPOSE8 (*(pOutrow+1), *(pWorkrow+1), iFGa8, *(pOutrow+1)); + MNG_COMPOSE8 (*(pOutrow+2), *(pWorkrow+2), iFGa8, *(pOutrow+2)); +#endif + /* alpha remains fully opaque !!! */ + } + else + { /* here we'll have to blend */ + MNG_BLEND8 (*pWorkrow, *(pWorkrow+1), *(pWorkrow+2), iFGa8, + *pOutrow, *(pOutrow+1), *(pOutrow+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pOutrow = iCr8; + *(pOutrow+1) = iCg8; + *(pOutrow+2) = iCb8; + *(pOutrow+3) = iCa8; + } + } + } + + pOutrow += 4; + pWorkrow += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COMPOSEOVER_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_composeover_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint16p pWorkrow; + mng_uint16p pOutrow; + mng_int32 iX; + mng_uint16 iFGa16, iFGr16, iFGg16, iFGb16; + mng_uint16 iBGa16, iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16, iCa16; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COMPOSEOVER_RGBA16, MNG_LC_START); +#endif + + pWorkrow = (mng_uint16p)pData->pRGBArow; + pOutrow = (mng_uint16p)(pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize)); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* get alpha values */ + iFGa16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+3)); + iBGa16 = mng_get_uint16 ((mng_uint8p)(pOutrow+3)); + + if (iFGa16) /* any opacity at all ? */ + { /* fully opaque or background fully transparent ? */ + if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) + { /* then simply copy the values */ + *pOutrow = *pWorkrow; + *(pOutrow+1) = *(pWorkrow+1); + *(pOutrow+2) = *(pWorkrow+2); + *(pOutrow+3) = *(pWorkrow+3); + } + else + { /* get color values */ + iFGr16 = mng_get_uint16 ((mng_uint8p)pWorkrow); + iFGg16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+1)); + iFGb16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+2)); + iBGr16 = mng_get_uint16 ((mng_uint8p)pOutrow); + iBGg16 = mng_get_uint16 ((mng_uint8p)(pOutrow+1)); + iBGb16 = mng_get_uint16 ((mng_uint8p)(pOutrow+2)); + + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE16 (iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16 (iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16 (iFGb16, iFGb16, iFGa16, iBGb16); + + mng_put_uint16 ((mng_uint8p)pOutrow, iFGr16); + mng_put_uint16 ((mng_uint8p)(pOutrow+1), iFGg16); + mng_put_uint16 ((mng_uint8p)(pOutrow+2), iFGb16); + /* alpha remains fully opaque !!! */ + } + else + { /* here we'll have to blend */ + MNG_BLEND16 (iFGr16, iFGg16, iFGb16, iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + mng_put_uint16 ((mng_uint8p)pOutrow, iCr16); + mng_put_uint16 ((mng_uint8p)(pOutrow+1), iCg16); + mng_put_uint16 ((mng_uint8p)(pOutrow+2), iCb16); + mng_put_uint16 ((mng_uint8p)(pOutrow+3), iCa16); + } + } + } + + pOutrow += 4; + pWorkrow += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COMPOSEOVER_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_composeunder_rgba8 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint8p pWorkrow; + mng_uint8p pOutrow; + mng_int32 iX; + mng_uint8 iFGa8, iBGa8; + mng_uint8 iCr8, iCg8, iCb8, iCa8; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COMPOSEUNDER_RGBA8, MNG_LC_START); +#endif + + pWorkrow = pData->pRGBArow; + pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { + iFGa8 = *(pOutrow+3); /* get alpha values */ + iBGa8 = *(pWorkrow+3); + /* anything to do at all ? */ + if ((iBGa8) && (iFGa8 != 0xFF)) + { + if (iBGa8 == 0xFF) /* background fully opaque ? */ + { /* do alpha composing */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE + int i; + for (i=2; i >= 0; i--) + { + MNG_COMPOSE8 (*(pOutrow+i), *(pOutrow+i), iFGa8, *(pWorkrow+i)); + } +#else + MNG_COMPOSE8 (*pOutrow, *pOutrow, iFGa8, *pWorkrow ); + MNG_COMPOSE8 (*(pOutrow+1), *(pOutrow+1), iFGa8, *(pWorkrow+1)); + MNG_COMPOSE8 (*(pOutrow+2), *(pOutrow+2), iFGa8, *(pWorkrow+2)); +#endif + *(pOutrow+3) = 0xFF; /* alpha becomes fully opaque !!! */ + } + else + { /* here we'll have to blend */ + MNG_BLEND8 (*pOutrow, *(pOutrow+1), *(pOutrow+2), iFGa8, + *pWorkrow, *(pWorkrow+1), *(pWorkrow+2), iBGa8, + iCr8, iCg8, iCb8, iCa8); + /* and return the composed values */ + *pOutrow = iCr8; + *(pOutrow+1) = iCg8; + *(pOutrow+2) = iCb8; + *(pOutrow+3) = iCa8; + } + } + + pOutrow += 4; + pWorkrow += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COMPOSEUNDER_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_composeunder_rgba16 (mng_datap pData) +{ + mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf; + mng_uint16p pWorkrow; + mng_uint16p pOutrow; + mng_int32 iX; + mng_uint16 iFGa16, iFGr16, iFGg16, iFGb16; + mng_uint16 iBGa16, iBGr16, iBGg16, iBGb16; + mng_uint16 iCr16, iCg16, iCb16, iCa16; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COMPOSEUNDER_RGBA16, MNG_LC_START); +#endif + + pWorkrow = (mng_uint16p)pData->pRGBArow; + pOutrow = (mng_uint16p)(pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) + + (pData->iCol * pBuf->iSamplesize)); + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* get alpha values */ + iFGa16 = mng_get_uint16 ((mng_uint8p)(pOutrow+3)); + iBGa16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+3)); + /* anything to do at all ? */ + if ((iBGa16) && (iFGa16 != 0xFFFF)) + { + iFGr16 = mng_get_uint16 ((mng_uint8p)pOutrow); + iFGg16 = mng_get_uint16 ((mng_uint8p)(pOutrow+1)); + iFGb16 = mng_get_uint16 ((mng_uint8p)(pOutrow+2)); + iBGr16 = mng_get_uint16 ((mng_uint8p)pWorkrow); + iBGg16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+1)); + iBGb16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+2)); + + if (iBGa16 == 0xFFFF) /* background fully opaque ? */ + { /* do alpha composing */ + MNG_COMPOSE16 (iFGr16, iFGr16, iFGa16, iBGr16); + MNG_COMPOSE16 (iFGg16, iFGg16, iFGa16, iBGg16); + MNG_COMPOSE16 (iFGb16, iFGb16, iFGa16, iBGb16); + + mng_put_uint16 ((mng_uint8p)pOutrow, iFGr16); + mng_put_uint16 ((mng_uint8p)(pOutrow+1), iFGg16); + mng_put_uint16 ((mng_uint8p)(pOutrow+2), iFGb16); + *(pOutrow+3) = 0xFFFF; /* alpha becomes fully opaque !!! */ + } + else + { /* here we'll have to blend */ + MNG_BLEND16 (iFGr16, iFGg16, iFGb16, iFGa16, + iBGr16, iBGg16, iBGb16, iBGa16, + iCr16, iCg16, iCb16, iCa16); + /* and return the composed values */ + mng_put_uint16 ((mng_uint8p)pOutrow, iCr16); + mng_put_uint16 ((mng_uint8p)(pOutrow+1), iCg16); + mng_put_uint16 ((mng_uint8p)(pOutrow+2), iCb16); + mng_put_uint16 ((mng_uint8p)(pOutrow+3), iCa16); + } + } + + pOutrow += 4; + pWorkrow += 4; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_COMPOSEUNDER_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif + +/* ************************************************************************** */ +/* * * */ +/* * PAST flip & tile routines - flip or tile a row of pixels * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_flip_rgba8 (mng_datap pData) +{ + mng_uint32p pWorkrow; + mng_uint32p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FLIP_RGBA8, MNG_LC_START); +#endif + /* setup temp pointers */ + pWorkrow = (mng_uint32p)pData->pRGBArow + pData->iRowsamples - 1; + pOutrow = (mng_uint32p)pData->pWorkrow; + /* swap original buffers */ + pData->pWorkrow = pData->pRGBArow; + pData->pRGBArow = (mng_uint8p)pOutrow; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* let's flip */ + *pOutrow = *pWorkrow; + pOutrow++; + pWorkrow--; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FLIP_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_flip_rgba16 (mng_datap pData) +{ + mng_uint32p pWorkrow; + mng_uint32p pOutrow; + mng_int32 iX; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FLIP_RGBA16, MNG_LC_START); +#endif + /* setup temp pointers */ + pWorkrow = (mng_uint32p)pData->pRGBArow + ((pData->iRowsamples - 1) << 1); + pOutrow = (mng_uint32p)pData->pWorkrow; + /* swap original buffers */ + pData->pWorkrow = pData->pRGBArow; + pData->pRGBArow = (mng_uint8p)pOutrow; + +#ifdef MNG_DECREMENT_LOOPS + for (iX = pData->iRowsamples; iX > 0; iX--) +#else + for (iX = 0; iX < pData->iRowsamples; iX++) +#endif + { /* let's flip */ + *pOutrow = *pWorkrow; + *(pOutrow + 1) = *(pWorkrow + 1); + + pOutrow += 2; + pWorkrow -= 2; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_FLIP_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode mng_tile_rgba8 (mng_datap pData) +{ + mng_uint32p pWorkrow; + mng_uint32p pOutrow; + mng_int32 iX; + mng_uint32 iZ, iMax; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_TILE_RGBA8, MNG_LC_START); +#endif + + iZ = pData->iSourcel; /* indent ? */ + /* what's our source-length */ + iMax = ((mng_imagep)pData->pRetrieveobj)->pImgbuf->iWidth; + /* setup temp pointers */ + pWorkrow = (mng_uint32p)pData->pRGBArow + iZ; + pOutrow = (mng_uint32p)pData->pWorkrow; + /* swap original buffers */ + pData->pWorkrow = pData->pRGBArow; + pData->pRGBArow = (mng_uint8p)pOutrow; + + for (iX = pData->iDestl; iX < pData->iDestr; iX++) + { /* tiiiile */ + *pOutrow = *pWorkrow; + + pWorkrow++; + pOutrow++; + iZ++; + + if (iZ >= iMax) /* end of source ? */ + { + iZ = 0; + pWorkrow = (mng_uint32p)pData->pWorkrow; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_TILE_RGBA8, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_tile_rgba16 (mng_datap pData) +{ + mng_uint32p pWorkrow; + mng_uint32p pOutrow; + mng_int32 iX; + mng_uint32 iZ, iMax; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_TILE_RGBA16, MNG_LC_START); +#endif + + iZ = pData->iSourcel; /* indent ? */ + /* what's our source-length */ + iMax = ((mng_imagep)pData->pRetrieveobj)->pImgbuf->iWidth; + /* setup temp pointers */ + pWorkrow = (mng_uint32p)pData->pRGBArow + (iZ << 1); + pOutrow = (mng_uint32p)pData->pWorkrow; + /* swap original buffers */ + pData->pWorkrow = pData->pRGBArow; + pData->pRGBArow = (mng_uint8p)pOutrow; + + for (iX = pData->iDestl; iX < pData->iDestr; iX++) + { /* tiiiile */ + *pOutrow = *pWorkrow; + *(pOutrow + 1) = *(pWorkrow + 1); + + pWorkrow += 2; + pOutrow += 2; + iZ++; + + if (iZ >= iMax) /* end of source ? */ + { + iZ = 0; + pWorkrow = (mng_uint32p)pData->pWorkrow; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_TILE_RGBA16, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SKIPCHUNK_PAST */ + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_DISPLAY_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_pixels.h b/src/3rdparty/libmng/libmng_pixels.h new file mode 100644 index 0000000000..5a0281e89d --- /dev/null +++ b/src/3rdparty/libmng/libmng_pixels.h @@ -0,0 +1,1147 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_pixels.h copyright (c) 2000-2006 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Pixel-row management routines (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the pixel-row management routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.5.2 - 05/22/2000 - G.Juyn * */ +/* * - added some JNG definitions * */ +/* * - added delta-image row-processing routines * */ +/* * 0.5.2 - 06/05/2000 - G.Juyn * */ +/* * - added support for RGB8_A8 canvasstyle * */ +/* * * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - changed progressive-display processing * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN support * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added optional support for bKGD for PNG images * */ +/* * - added support for JDAA * */ +/* * 0.9.3 - 10/19/2000 - G.Juyn * */ +/* * - implemented delayed delta-processing * */ +/* * * */ +/* * 0.9.4 - 1/18/2001 - G.Juyn * */ +/* * - added "new" MAGN methods 3, 4 & 5 * */ +/* * * */ +/* * 1.0.1 - 04/21/2001 - G.Juyn (code by G.Kelly) * */ +/* * - added BGRA8 canvas with premultiplied alpha * */ +/* * * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * - completed delta-image support * */ +/* * 1.0.5 - 08/16/2002 - G.Juyn * */ +/* * - completed MAGN support (16-bit functions) * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/22/2002 - G.Juyn * */ +/* * - added bgrx8 canvas (filler byte) * */ +/* * 1.0.5 - 09/23/2002 - G.Juyn * */ +/* * - added compose over/under routines for PAST processing * */ +/* * - added flip & tile routines for PAST processing * */ +/* * * */ +/* * 1.0.6 - 03/09/2003 - G.Juyn * */ +/* * - hiding 12-bit JPEG stuff * */ +/* * 1.0.6 - 05/11/2003 - G. Juyn * */ +/* * - added conditionals around canvas update routines * */ +/* * 1.0.6 - 06/09/2003 - G. R-P * */ +/* * - added conditionals around 8-bit magn routines * */ +/* * 1.0.6 - 07/07/2003 - G. R-P * */ +/* * - removed conditionals around 8-bit magn routines * */ +/* * - added conditionals around 16-bit and delta-PNG * */ +/* * supporting code * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added SKIPCHUNK conditionals around PAST chunk support * */ +/* * 1.0.6 - 08/18/2003 - G.R-P * */ +/* * - added conditionals around 1, 2, and 4-bit prototypes * */ +/* * * */ +/* * 1.0.7 - 11/27/2003 - R.A * */ +/* * - added CANVAS_RGB565 and CANVAS_BGR565 * */ +/* * 1.0.7 - 12/06/2003 - R.A * */ +/* * - added CANVAS_RGBA565 and CANVAS_BGRA565 * */ +/* * 1.0.7 - 01/25/2004 - J.S * */ +/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */ +/* * * */ +/* * 1.0.9 - 10/10/2004 - G.R-P. * */ +/* * - added MNG_NO_1_2_4BIT_SUPPORT * */ +/* * 1.0.9 - 10/14/2004 - G.Juyn * */ +/* * - added bgr565_a8 canvas-style (thanks to J. Elvander) * */ +/* * * */ +/* * 1.0.10 - 03/07/2006 - (thanks to W. Manthey) * */ +/* * - added CANVAS_RGB555 and CANVAS_BGR555 * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_pixels_h_ +#define _libmng_pixels_h_ + +/* ************************************************************************** */ +/* * * */ +/* * Progressive display check - checks to see if progressive display is * */ +/* * in order & indicates so * */ +/* * * */ +/* * The routine is called after a call to one of the display_xxx routines * */ +/* * if appropriate * */ +/* * * */ +/* * The refresh is warrented in the read_chunk routine (mng_read.c) * */ +/* * and only during read&display processing, since there's not much point * */ +/* * doing it from memory! * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_display_progressive_check (mng_datap pData); + +/* ************************************************************************** */ +/* * * */ +/* * Display routines - convert rowdata (which is already color-corrected) * */ +/* * to the output canvas, respecting any transparency information * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCANVAS_RGB8 +mng_retcode mng_display_rgb8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_RGBA8 +mng_retcode mng_display_rgba8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_RGBA8_PM +mng_retcode mng_display_rgba8_pm (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_ARGB8 +mng_retcode mng_display_argb8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_ARGB8_PM +mng_retcode mng_display_argb8_pm (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_RGB8_A8 +mng_retcode mng_display_rgb8_a8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGR8 +mng_retcode mng_display_bgr8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGRX8 +mng_retcode mng_display_bgrx8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGRA8 +mng_retcode mng_display_bgra8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGRA8_PM +mng_retcode mng_display_bgra8_pm (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_ABGR8 +mng_retcode mng_display_abgr8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_ABGR8_PM +mng_retcode mng_display_abgr8_pm (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_RGB565 +mng_retcode mng_display_rgb565 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_RGBA565 +mng_retcode mng_display_rgba565 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGR565 +mng_retcode mng_display_bgr565 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGRA565 +mng_retcode mng_display_bgra565 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGR565_A8 +mng_retcode mng_display_bgr565_a8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_RGB555 +mng_retcode mng_display_rgb555 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGR555 +mng_retcode mng_display_bgr555 (mng_datap pData); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Background restore routines - restore the background with info from * */ +/* * the BACK and/or bKGD chunk and/or the app's background canvas * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_restore_bkgd_backimage (mng_datap pData); +mng_retcode mng_restore_bkgd_backcolor (mng_datap pData); +mng_retcode mng_restore_bkgd_bkgd (mng_datap pData); +mng_retcode mng_restore_bkgd_bgcolor (mng_datap pData); +#ifndef MNG_SKIPCANVAS_RGB8 +mng_retcode mng_restore_bkgd_rgb8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGR8 +mng_retcode mng_restore_bkgd_bgr8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGRX8 +mng_retcode mng_restore_bkgd_bgrx8 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_RGB565 +mng_retcode mng_restore_bkgd_rgb565 (mng_datap pData); +#endif +#ifndef MNG_SKIPCANVAS_BGR565 +mng_retcode mng_restore_bkgd_bgr565 (mng_datap pData); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row retrieval routines - retrieve processed & uncompressed row-data * */ +/* * from the current "object" * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_retrieve_g8 (mng_datap pData); +mng_retcode mng_retrieve_rgb8 (mng_datap pData); +mng_retcode mng_retrieve_idx8 (mng_datap pData); +mng_retcode mng_retrieve_ga8 (mng_datap pData); +mng_retcode mng_retrieve_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_retrieve_g16 (mng_datap pData); +mng_retcode mng_retrieve_ga16 (mng_datap pData); +mng_retcode mng_retrieve_rgb16 (mng_datap pData); +mng_retcode mng_retrieve_rgba16 (mng_datap pData); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row storage routines - store processed & uncompressed row-data * */ +/* * into the current "object" * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_g1 (mng_datap pData); +mng_retcode mng_store_g2 (mng_datap pData); +mng_retcode mng_store_g4 (mng_datap pData); +mng_retcode mng_store_idx1 (mng_datap pData); +mng_retcode mng_store_idx2 (mng_datap pData); +mng_retcode mng_store_idx4 (mng_datap pData); +#endif +mng_retcode mng_store_idx8 (mng_datap pData); +mng_retcode mng_store_rgb8 (mng_datap pData); +mng_retcode mng_store_g8 (mng_datap pData); +mng_retcode mng_store_ga8 (mng_datap pData); +mng_retcode mng_store_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_g16 (mng_datap pData); +mng_retcode mng_store_ga16 (mng_datap pData); +mng_retcode mng_store_rgb16 (mng_datap pData); +mng_retcode mng_store_rgba16 (mng_datap pData); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row storage routines (JPEG) - store processed & uncompressed row-data * */ +/* * into the current "object" * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_store_jpeg_g8 (mng_datap pData); +mng_retcode mng_store_jpeg_rgb8 (mng_datap pData); +mng_retcode mng_store_jpeg_ga8 (mng_datap pData); +mng_retcode mng_store_jpeg_rgba8 (mng_datap pData); + +#ifdef MNG_SUPPORT_JPEG12 +mng_retcode mng_store_jpeg_g12 (mng_datap pData); +mng_retcode mng_store_jpeg_rgb12 (mng_datap pData); +mng_retcode mng_store_jpeg_ga12 (mng_datap pData); +mng_retcode mng_store_jpeg_rgba12 (mng_datap pData); +#endif + +mng_retcode mng_store_jpeg_g8_alpha (mng_datap pData); +mng_retcode mng_store_jpeg_rgb8_alpha (mng_datap pData); + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_jpeg_g8_a1 (mng_datap pData); +mng_retcode mng_store_jpeg_g8_a2 (mng_datap pData); +mng_retcode mng_store_jpeg_g8_a4 (mng_datap pData); +#endif +mng_retcode mng_store_jpeg_g8_a8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_jpeg_g8_a16 (mng_datap pData); +#endif + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_jpeg_rgb8_a1 (mng_datap pData); +mng_retcode mng_store_jpeg_rgb8_a2 (mng_datap pData); +mng_retcode mng_store_jpeg_rgb8_a4 (mng_datap pData); +#endif +mng_retcode mng_store_jpeg_rgb8_a8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_jpeg_rgb8_a16 (mng_datap pData); +#endif + +#ifdef MNG_SUPPORT_JPEG12 +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_jpeg_g12_a1 (mng_datap pData); +mng_retcode mng_store_jpeg_g12_a2 (mng_datap pData); +mng_retcode mng_store_jpeg_g12_a4 (mng_datap pData); +#endif +mng_retcode mng_store_jpeg_g12_a8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_jpeg_g12_a16 (mng_datap pData); +#endif + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_store_jpeg_rgb12_a1 (mng_datap pData); +mng_retcode mng_store_jpeg_rgb12_a2 (mng_datap pData); +mng_retcode mng_store_jpeg_rgb12_a4 (mng_datap pData); +#endif +mng_retcode mng_store_jpeg_rgb12_a8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_store_jpeg_rgb12_a16 (mng_datap pData); +#endif +#endif +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Delta-image row routines - apply the processed & uncompressed row-data * */ +/* * onto the target "object" * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_delta_g1 (mng_datap pData); +mng_retcode mng_delta_g2 (mng_datap pData); +mng_retcode mng_delta_g4 (mng_datap pData); +#endif +mng_retcode mng_delta_g8 (mng_datap pData); +mng_retcode mng_delta_g16 (mng_datap pData); +mng_retcode mng_delta_rgb8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_rgb16 (mng_datap pData); +#endif +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_delta_idx1 (mng_datap pData); +mng_retcode mng_delta_idx2 (mng_datap pData); +mng_retcode mng_delta_idx4 (mng_datap pData); +#endif +mng_retcode mng_delta_idx8 (mng_datap pData); +mng_retcode mng_delta_ga8 (mng_datap pData); +mng_retcode mng_delta_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_ga16 (mng_datap pData); +mng_retcode mng_delta_rgba16 (mng_datap pData); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Delta-image row routines - apply the source row onto the target * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_delta_g1_g1 (mng_datap pData); +mng_retcode mng_delta_g2_g2 (mng_datap pData); +mng_retcode mng_delta_g4_g4 (mng_datap pData); +#endif +mng_retcode mng_delta_g8_g8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_g16_g16 (mng_datap pData); +#endif +mng_retcode mng_delta_ga8_ga8 (mng_datap pData); +mng_retcode mng_delta_ga8_g8 (mng_datap pData); +mng_retcode mng_delta_ga8_a8 (mng_datap pData); +mng_retcode mng_delta_rgba8_rgb8 (mng_datap pData); +mng_retcode mng_delta_rgba8_a8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_ga16_ga16 (mng_datap pData); +mng_retcode mng_delta_ga16_g16 (mng_datap pData); +mng_retcode mng_delta_ga16_a16 (mng_datap pData); +mng_retcode mng_delta_rgba16_a16 (mng_datap pData); +mng_retcode mng_delta_rgba16_rgb16 (mng_datap pData); +#endif +#endif /* MNG_NO_DELTA_PNG */ +mng_retcode mng_delta_rgb8_rgb8 (mng_datap pData); /* Used for PAST */ +mng_retcode mng_delta_rgba8_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_delta_rgb16_rgb16 (mng_datap pData); +mng_retcode mng_delta_rgba16_rgba16 (mng_datap pData); +#endif + +#ifndef MNG_NO_DELTA_PNG +/* ************************************************************************** */ +/* * * */ +/* * Delta-image row routines - scale the delta to bitdepth of target * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_scale_g1_g2 (mng_datap pData); +mng_retcode mng_scale_g1_g4 (mng_datap pData); +mng_retcode mng_scale_g1_g8 (mng_datap pData); +mng_retcode mng_scale_g2_g4 (mng_datap pData); +mng_retcode mng_scale_g2_g8 (mng_datap pData); +mng_retcode mng_scale_g4_g8 (mng_datap pData); +#endif +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_scale_g1_g16 (mng_datap pData); +mng_retcode mng_scale_g2_g16 (mng_datap pData); +mng_retcode mng_scale_g4_g16 (mng_datap pData); +#endif +mng_retcode mng_scale_g8_g16 (mng_datap pData); +mng_retcode mng_scale_ga8_ga16 (mng_datap pData); +mng_retcode mng_scale_rgb8_rgb16 (mng_datap pData); +mng_retcode mng_scale_rgba8_rgba16 (mng_datap pData); +#endif + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_scale_g2_g1 (mng_datap pData); +mng_retcode mng_scale_g4_g1 (mng_datap pData); +mng_retcode mng_scale_g8_g1 (mng_datap pData); +mng_retcode mng_scale_g4_g2 (mng_datap pData); +mng_retcode mng_scale_g8_g2 (mng_datap pData); +mng_retcode mng_scale_g8_g4 (mng_datap pData); +#endif +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_scale_g16_g1 (mng_datap pData); +mng_retcode mng_scale_g16_g2 (mng_datap pData); +mng_retcode mng_scale_g16_g4 (mng_datap pData); +#endif +mng_retcode mng_scale_g16_g8 (mng_datap pData); +mng_retcode mng_scale_ga16_ga8 (mng_datap pData); +mng_retcode mng_scale_rgb16_rgb8 (mng_datap pData); +mng_retcode mng_scale_rgba16_rgba8 (mng_datap pData); +#endif +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ +/* * * */ +/* * Delta-image bit routines - promote bit_depth * */ +/* * * */ +/* ************************************************************************** */ + +mng_uint8 mng_promote_replicate_1_2 (mng_uint8 iB); +mng_uint8 mng_promote_replicate_1_4 (mng_uint8 iB); +mng_uint8 mng_promote_replicate_1_8 (mng_uint8 iB); +mng_uint8 mng_promote_replicate_2_4 (mng_uint8 iB); +mng_uint8 mng_promote_replicate_2_8 (mng_uint8 iB); +mng_uint8 mng_promote_replicate_4_8 (mng_uint8 iB); +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_replicate_1_16 (mng_uint8 iB); +mng_uint16 mng_promote_replicate_2_16 (mng_uint8 iB); +mng_uint16 mng_promote_replicate_4_16 (mng_uint8 iB); +mng_uint16 mng_promote_replicate_8_16 (mng_uint8 iB); +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DELTA_PNG +mng_uint8 mng_promote_zerofill_1_2 (mng_uint8 iB); +mng_uint8 mng_promote_zerofill_1_4 (mng_uint8 iB); +mng_uint8 mng_promote_zerofill_1_8 (mng_uint8 iB); +mng_uint8 mng_promote_zerofill_2_4 (mng_uint8 iB); +mng_uint8 mng_promote_zerofill_2_8 (mng_uint8 iB); +mng_uint8 mng_promote_zerofill_4_8 (mng_uint8 iB); +#ifndef MNG_NO_16BIT_SUPPORT +mng_uint16 mng_promote_zerofill_1_16 (mng_uint8 iB); +mng_uint16 mng_promote_zerofill_2_16 (mng_uint8 iB); +mng_uint16 mng_promote_zerofill_4_16 (mng_uint8 iB); +mng_uint16 mng_promote_zerofill_8_16 (mng_uint8 iB); +#endif +#endif /* MNG_NO_DELTA_PNG */ + +/* ************************************************************************** */ +/* * * */ +/* * Delta-image row routines - promote color_type * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_promote_g8_g8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g8_g16 (mng_datap pData); +mng_retcode mng_promote_g16_g16 (mng_datap pData); +#endif + +mng_retcode mng_promote_g8_ga8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g8_ga16 (mng_datap pData); +mng_retcode mng_promote_g16_ga16 (mng_datap pData); +#endif + +mng_retcode mng_promote_g8_rgb8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g8_rgb16 (mng_datap pData); +mng_retcode mng_promote_g16_rgb16 (mng_datap pData); +#endif + +mng_retcode mng_promote_g8_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_g8_rgba16 (mng_datap pData); +mng_retcode mng_promote_g16_rgba16 (mng_datap pData); + +mng_retcode mng_promote_ga8_ga16 (mng_datap pData); +#endif + +mng_retcode mng_promote_ga8_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_ga8_rgba16 (mng_datap pData); +mng_retcode mng_promote_ga16_rgba16 (mng_datap pData); +#endif + +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_rgb8_rgb16 (mng_datap pData); +#endif + +mng_retcode mng_promote_rgb8_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_rgb8_rgba16 (mng_datap pData); +mng_retcode mng_promote_rgb16_rgba16 (mng_datap pData); +#endif + +mng_retcode mng_promote_idx8_rgb8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_idx8_rgb16 (mng_datap pData); +#endif + +mng_retcode mng_promote_idx8_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_promote_idx8_rgba16 (mng_datap pData); + +mng_retcode mng_promote_rgba8_rgba16 (mng_datap pData); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row processing routines - convert uncompressed data from zlib to * */ +/* * managable row-data which serves as input to the color-management * */ +/* * routines * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_process_g1 (mng_datap pData); +mng_retcode mng_process_g2 (mng_datap pData); +mng_retcode mng_process_g4 (mng_datap pData); +#endif +mng_retcode mng_process_g8 (mng_datap pData); +mng_retcode mng_process_rgb8 (mng_datap pData); +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_process_idx1 (mng_datap pData); +mng_retcode mng_process_idx2 (mng_datap pData); +mng_retcode mng_process_idx4 (mng_datap pData); +#endif +mng_retcode mng_process_idx8 (mng_datap pData); +mng_retcode mng_process_ga8 (mng_datap pData); +mng_retcode mng_process_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_process_g16 (mng_datap pData); +mng_retcode mng_process_ga16 (mng_datap pData); +mng_retcode mng_process_rgb16 (mng_datap pData); +mng_retcode mng_process_rgba16 (mng_datap pData); +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row processing initialization routines - set up the variables needed * */ +/* * to process uncompressed row-data * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_FOOTPRINT_INIT +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_init_g1_i (mng_datap pData); +mng_retcode mng_init_g2_i (mng_datap pData); +mng_retcode mng_init_g4_i (mng_datap pData); +#endif +mng_retcode mng_init_g8_i (mng_datap pData); +mng_retcode mng_init_rgb8_i (mng_datap pData); +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_init_idx1_i (mng_datap pData); +mng_retcode mng_init_idx2_i (mng_datap pData); +mng_retcode mng_init_idx4_i (mng_datap pData); +#endif +mng_retcode mng_init_idx8_i (mng_datap pData); +mng_retcode mng_init_ga8_i (mng_datap pData); +mng_retcode mng_init_rgba8_i (mng_datap pData); +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_init_g1_ni (mng_datap pData); +mng_retcode mng_init_g2_ni (mng_datap pData); +mng_retcode mng_init_g4_ni (mng_datap pData); +#endif +mng_retcode mng_init_g8_ni (mng_datap pData); +mng_retcode mng_init_rgb8_ni (mng_datap pData); +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_init_idx1_ni (mng_datap pData); +mng_retcode mng_init_idx2_ni (mng_datap pData); +mng_retcode mng_init_idx4_ni (mng_datap pData); +#endif +mng_retcode mng_init_idx8_ni (mng_datap pData); +mng_retcode mng_init_ga8_ni (mng_datap pData); +mng_retcode mng_init_rgba8_ni (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_g16_i (mng_datap pData); +mng_retcode mng_init_rgb16_i (mng_datap pData); +mng_retcode mng_init_ga16_i (mng_datap pData); +mng_retcode mng_init_rgba16_i (mng_datap pData); +mng_retcode mng_init_g16_ni (mng_datap pData); +mng_retcode mng_init_rgb16_ni (mng_datap pData); +mng_retcode mng_init_ga16_ni (mng_datap pData); +mng_retcode mng_init_rgba16_ni (mng_datap pData); +#endif +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Row processing initialization routines (JPEG) - set up the variables * */ +/* * needed to process uncompressed row-data * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_FOOTPRINT_INIT +#ifdef MNG_INCLUDE_JNG +#ifndef MNG_NO_1_2_4BIT_SUPPORT +mng_retcode mng_init_jpeg_a1_ni (mng_datap pData); +mng_retcode mng_init_jpeg_a2_ni (mng_datap pData); +mng_retcode mng_init_jpeg_a4_ni (mng_datap pData); +#endif +mng_retcode mng_init_jpeg_a8_ni (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_init_jpeg_a16_ni (mng_datap pData); +#endif +#endif +#endif + +/* ************************************************************************** */ +/* * * */ +/* * General row processing routines * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_init_rowproc (mng_datap pData); +mng_retcode mng_next_row (mng_datap pData); +#ifdef MNG_INCLUDE_JNG +mng_retcode mng_next_jpeg_alpharow (mng_datap pData); +mng_retcode mng_next_jpeg_row (mng_datap pData); +#endif +mng_retcode mng_cleanup_rowproc (mng_datap pData); + +/* ************************************************************************** */ +/* * * */ +/* * Magnification row routines - apply magnification transforms * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN +mng_retcode mng_magnify_g8_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_g8_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_g8_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb8_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb8_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb8_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_x4 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_x5 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +#endif +mng_retcode mng_magnify_rgba8_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba8_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba8_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba8_x4 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba8_x5 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN +mng_retcode mng_magnify_g8_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_g8_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_g8_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb8_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb8_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb8_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_y4 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga8_y5 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +#endif +mng_retcode mng_magnify_rgba8_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba8_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba8_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba8_y4 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba8_y5 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); + +/* ************************************************************************** */ +#ifndef MNG_NO_16BIT_SUPPORT +#ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN +mng_retcode mng_magnify_g16_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_g16_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_g16_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb16_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb16_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb16_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_x4 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_x5 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_x1 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_x2 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_x3 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_x4 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_x5 (mng_datap pData, + mng_uint16 iMX, + mng_uint16 iML, + mng_uint16 iMR, + mng_uint32 iWidth, + mng_uint8p pSrcline, + mng_uint8p pDstline); + +mng_retcode mng_magnify_g16_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_g16_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_g16_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb16_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb16_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgb16_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_y4 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_ga16_y5 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_y1 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_y2 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_y3 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_y4 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +mng_retcode mng_magnify_rgba16_y5 (mng_datap pData, + mng_int32 iS, + mng_int32 iM, + mng_uint32 iWidth, + mng_uint8p pSrcline1, + mng_uint8p pSrcline2, + mng_uint8p pDstline); +#endif +#endif + +/* ************************************************************************** */ +/* * * */ +/* * PAST composition routines - compose over/under with a target object * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode mng_composeover_rgba8 (mng_datap pData); +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_composeunder_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_composeover_rgba16 (mng_datap pData); +mng_retcode mng_composeunder_rgba16 (mng_datap pData); +#endif +#endif + +/* ************************************************************************** */ +/* * * */ +/* * PAST flip & tile routines - flip or tile a row of pixels * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef MNG_SKIPCHUNK_PAST +mng_retcode mng_flip_rgba8 (mng_datap pData); +mng_retcode mng_tile_rgba8 (mng_datap pData); +#ifndef MNG_NO_16BIT_SUPPORT +mng_retcode mng_flip_rgba16 (mng_datap pData); +mng_retcode mng_tile_rgba16 (mng_datap pData); +#endif +#endif + +/* ************************************************************************** */ + +#endif /* _libmng_pixels_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_prop_xs.c b/src/3rdparty/libmng/libmng_prop_xs.c new file mode 100644 index 0000000000..3849d51cc5 --- /dev/null +++ b/src/3rdparty/libmng/libmng_prop_xs.c @@ -0,0 +1,2799 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_prop_xs.c copyright (c) 2000-2006 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : property get/set interface (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the property get/set functions * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - fixed calling convention * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added set_outputprofile2 & set_srgbprofile2 * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.5.2 - 05/23/2000 - G.Juyn * */ +/* * - changed inclusion of cms-routines * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added support for get/set default zlib/IJG parms * */ +/* * 0.5.2 - 05/31/2000 - G.Juyn * */ +/* * - fixed up punctuation (contribution by Tim Rowley) * */ +/* * 0.5.2 - 06/05/2000 - G.Juyn * */ +/* * - added support for RGB8_A8 canvasstyle * */ +/* * * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added get/set for speedtype to facilitate testing * */ +/* * - added get for imagelevel during processtext callback * */ +/* * 0.5.3 - 06/26/2000 - G.Juyn * */ +/* * - changed userdata variable to mng_ptr * */ +/* * 0.5.3 - 06/29/2000 - G.Juyn * */ +/* * - fixed incompatible return-types * */ +/* * * */ +/* * 0.9.1 - 07/08/2000 - G.Juyn * */ +/* * - added get routines for internal display variables * */ +/* * - added get/set routines for suspensionmode variable * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added get/set routines for sectionbreak variable * */ +/* * * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - added status_xxxx functions * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 10/10/2000 - G.Juyn * */ +/* * - added support for alpha-depth prediction * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added functions to retrieve PNG/JNG specific header-info * */ +/* * 0.9.3 - 10/20/2000 - G.Juyn * */ +/* * - added get/set for bKGD preference setting * */ +/* * 0.9.3 - 10/21/2000 - G.Juyn * */ +/* * - added get function for interlace/progressive display * */ +/* * * */ +/* * 1.0.1 - 04/21/2001 - G.Juyn (code by G.Kelly) * */ +/* * - added BGRA8 canvas with premultiplied alpha * */ +/* * 1.0.1 - 05/02/2001 - G.Juyn * */ +/* * - added "default" sRGB generation (Thanks Marti!) * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added optimization option for MNG-video playback * */ +/* * 1.0.2 - 06/25/2001 - G.Juyn * */ +/* * - added option to turn off progressive refresh * */ +/* * * */ +/* * 1.0.3 - 08/06/2001 - G.Juyn * */ +/* * - added get function for last processed BACK chunk * */ +/* * * */ +/* * 1.0.4 - 06/22/2002 - G.Juyn * */ +/* * - B495442 - invalid returnvalue in mng_get_suspensionmode * */ +/* * * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 09/22/2002 - G.Juyn * */ +/* * - added bgrx8 canvas (filler byte) * */ +/* * 1.0.5 - 11/07/2002 - G.Juyn * */ +/* * - added support to get totals after mng_read() * */ +/* * * */ +/* * 1.0.6 - 05/11/2003 - G. Juyn * */ +/* * - added conditionals around canvas update routines * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added conditionals around some JNG-supporting code * */ +/* * 1.0.6 - 07/11/2003 - G.R-P * */ +/* * - added conditionals zlib and jpeg property accessors * */ +/* * 1.0.6 - 07/14/2003 - G.R-P * */ +/* * - added conditionals around various unused functions * */ +/* * * */ +/* * 1.0.7 - 11/27/2003 - R.A * */ +/* * - added CANVAS_RGB565 and CANVAS_BGR565 * */ +/* * 1.0.7 - 12/06/2003 - R.A * */ +/* * - added CANVAS_RGBA565 and CANVAS_BGRA565 * */ +/* * 1.0.7 - 01/25/2004 - J.S * */ +/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */ +/* * 1.0.7 - 03/07/2004 - G.R-P. * */ +/* * - put gamma, cms-related functions inside #ifdef * */ +/* * * */ +/* * 1.0.8 - 04/02/2004 - G.Juyn * */ +/* * - added CRC existence & checking flags * */ +/* * * */ +/* * 1.0.9 - 09/18/2004 - G.R-P. * */ +/* * - added some MNG_SUPPORT_WRITE conditionals * */ +/* * 1.0.9 - 10/03/2004 - G.Juyn * */ +/* * - added function to retrieve current FRAM delay * */ +/* * 1.0.9 - 10/14/2004 - G.Juyn * */ +/* * - added bgr565_a8 canvas-style (thanks to J. Elvander) * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* * 1.0.10 - 03/07/2006 - (thanks to W. Manthey) * */ +/* * - added CANVAS_RGB555 and CANVAS_BGR555 * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_objects.h" +#include "libmng_memory.h" +#include "libmng_cms.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Property set functions * */ +/* * * */ +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_userdata (mng_handle hHandle, + mng_ptr pUserdata) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_USERDATA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->pUserdata = pUserdata; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_USERDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_canvasstyle (mng_handle hHandle, + mng_uint32 iStyle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_CANVASSTYLE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + switch (iStyle) + { +#ifndef MNG_SKIPCANVAS_RGB8 + case MNG_CANVAS_RGB8 : break; +#endif +#ifndef MNG_SKIPCANVAS_RGBA8 + case MNG_CANVAS_RGBA8 : break; +#endif +#ifndef MNG_SKIPCANVAS_RGBA8_PM + case MNG_CANVAS_RGBA8_PM: break; +#endif +#ifndef MNG_SKIPCANVAS_ARGB8 + case MNG_CANVAS_ARGB8 : break; +#endif +#ifndef MNG_SKIPCANVAS_ARGB8_PM + case MNG_CANVAS_ARGB8_PM: break; +#endif +#ifndef MNG_SKIPCANVAS_RGB8_A8 + case MNG_CANVAS_RGB8_A8 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGR8 + case MNG_CANVAS_BGR8 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGRX8 + case MNG_CANVAS_BGRX8 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGRA8 + case MNG_CANVAS_BGRA8 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGRA8_PM + case MNG_CANVAS_BGRA8_PM: break; +#endif +#ifndef MNG_SKIPCANVAS_ABGR8 + case MNG_CANVAS_ABGR8 : break; +#endif +#ifndef MNG_SKIPCANVAS_ABGR8_PM + case MNG_CANVAS_ABGR8_PM: break; +#endif +#ifndef MNG_SKIPCANVAS_RGB565 + case MNG_CANVAS_RGB565 : break; +#endif +#ifndef MNG_SKIPCANVAS_RGBA565 + case MNG_CANVAS_RGBA565 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGR565 + case MNG_CANVAS_BGR565 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGRA565 + case MNG_CANVAS_BGRA565 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGR565_A8 + case MNG_CANVAS_BGR565_A8 : break; +#endif +#ifndef MNG_SKIPCANVAS_RGB555 + case MNG_CANVAS_RGB555 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGR555 + case MNG_CANVAS_BGR555 : break; +#endif +/* case MNG_CANVAS_RGB16 : break; */ +/* case MNG_CANVAS_RGBA16 : break; */ +/* case MNG_CANVAS_ARGB16 : break; */ +/* case MNG_CANVAS_BGR16 : break; */ +/* case MNG_CANVAS_BGRA16 : break; */ +/* case MNG_CANVAS_ABGR16 : break; */ +/* case MNG_CANVAS_INDEX8 : break; */ +/* case MNG_CANVAS_INDEXA8 : break; */ +/* case MNG_CANVAS_AINDEX8 : break; */ +/* case MNG_CANVAS_GRAY8 : break; */ +/* case MNG_CANVAS_GRAY16 : break; */ +/* case MNG_CANVAS_GRAYA8 : break; */ +/* case MNG_CANVAS_GRAYA16 : break; */ +/* case MNG_CANVAS_AGRAY8 : break; */ +/* case MNG_CANVAS_AGRAY16 : break; */ +/* case MNG_CANVAS_DX15 : break; */ +/* case MNG_CANVAS_DX16 : break; */ + default : { MNG_ERROR (((mng_datap)hHandle), MNG_INVALIDCNVSTYLE) }; + } + + ((mng_datap)hHandle)->iCanvasstyle = iStyle; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_CANVASSTYLE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_bkgdstyle (mng_handle hHandle, + mng_uint32 iStyle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_BKGDSTYLE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + switch (iStyle) /* alpha-modes not supported */ + { +#ifndef MNG_SKIPCANVAS_RGB8 + case MNG_CANVAS_RGB8 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGR8 + case MNG_CANVAS_BGR8 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGRX8 + case MNG_CANVAS_BGRX8 : break; +#endif +#ifndef MNG_SKIPCANVAS_RGB565 + case MNG_CANVAS_RGB565 : break; +#endif +#ifndef MNG_SKIPCANVAS_BGR565 + case MNG_CANVAS_BGR565 : break; +#endif +/* case MNG_CANVAS_RGB16 : break; */ +/* case MNG_CANVAS_BGR16 : break; */ +/* case MNG_CANVAS_INDEX8 : break; */ +/* case MNG_CANVAS_GRAY8 : break; */ +/* case MNG_CANVAS_GRAY16 : break; */ +/* case MNG_CANVAS_DX15 : break; */ +/* case MNG_CANVAS_DX16 : break; */ + default : MNG_ERROR (((mng_datap)hHandle), MNG_INVALIDCNVSTYLE); + } + + ((mng_datap)hHandle)->iBkgdstyle = iStyle; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_BKGDSTYLE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_bgcolor (mng_handle hHandle, + mng_uint16 iRed, + mng_uint16 iGreen, + mng_uint16 iBlue) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_BGCOLOR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iBGred = iRed; + ((mng_datap)hHandle)->iBGgreen = iGreen; + ((mng_datap)hHandle)->iBGblue = iBlue; + ((mng_datap)hHandle)->bUseBKGD = MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_BGCOLOR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_usebkgd (mng_handle hHandle, + mng_bool bUseBKGD) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_USEBKGD, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->bUseBKGD = bUseBKGD; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_USEBKGD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_storechunks (mng_handle hHandle, + mng_bool bStorechunks) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_STORECHUNKS, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->bStorechunks = bStorechunks; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_STORECHUNKS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_sectionbreaks (mng_handle hHandle, + mng_bool bSectionbreaks) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SECTIONBREAKS, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->bSectionbreaks = bSectionbreaks; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SECTIONBREAKS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_cacheplayback (mng_handle hHandle, + mng_bool bCacheplayback) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_CACHEPLAYBACK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + if (((mng_datap)hHandle)->bHasheader) + MNG_ERROR (((mng_datap)hHandle), MNG_FUNCTIONINVALID); + + ((mng_datap)hHandle)->bCacheplayback = bCacheplayback; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_CACHEPLAYBACK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_doprogressive (mng_handle hHandle, + mng_bool bDoProgressive) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DOPROGRESSIVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + ((mng_datap)hHandle)->bDoProgressive = bDoProgressive; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DOPROGRESSIVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_crcmode (mng_handle hHandle, + mng_uint32 iCrcmode) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_CRCMODE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + ((mng_datap)hHandle)->iCrcmode = iCrcmode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_CRCMODE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_set_srgb (mng_handle hHandle, + mng_bool bIssRGB) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SRGB, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->bIssRGB = bIssRGB; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_SKIPCHUNK_iCCP +mng_retcode MNG_DECL mng_set_outputprofile (mng_handle hHandle, + mng_pchar zFilename) +{ +#ifdef MNG_INCLUDE_LCMS + mng_datap pData; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_OUTPUTPROFILE, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_LCMS + MNG_VALIDHANDLE (hHandle) + + pData = (mng_datap)hHandle; /* address the structure */ + + if (pData->hProf2) /* previously defined ? */ + mnglcms_freeprofile (pData->hProf2); + /* allocate new CMS profile handle */ + pData->hProf2 = mnglcms_createfileprofile (zFilename); + + if (!pData->hProf2) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); +#endif /* MNG_INCLUDE_LCMS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_OUTPUTPROFILE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_SKIPCHUNK_iCCP +mng_retcode MNG_DECL mng_set_outputprofile2 (mng_handle hHandle, + mng_uint32 iProfilesize, + mng_ptr pProfile) +{ +#ifdef MNG_INCLUDE_LCMS + mng_datap pData; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_OUTPUTPROFILE2, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_LCMS + MNG_VALIDHANDLE (hHandle) + + pData = (mng_datap)hHandle; /* address the structure */ + + if (pData->hProf2) /* previously defined ? */ + mnglcms_freeprofile (pData->hProf2); + /* allocate new CMS profile handle */ + pData->hProf2 = mnglcms_creatememprofile (iProfilesize, pProfile); + + if (!pData->hProf2) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); +#endif /* MNG_INCLUDE_LCMS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_OUTPUTPROFILE2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_outputsrgb (mng_handle hHandle) +{ +#ifdef MNG_INCLUDE_LCMS + mng_datap pData; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_OUTPUTSRGB, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_LCMS + MNG_VALIDHANDLE (hHandle) + + pData = (mng_datap)hHandle; /* address the structure */ + + if (pData->hProf2) /* previously defined ? */ + mnglcms_freeprofile (pData->hProf2); + /* allocate new CMS profile handle */ + pData->hProf2 = mnglcms_createsrgbprofile (); + + if (!pData->hProf2) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); +#endif /* MNG_INCLUDE_LCMS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_OUTPUTSRGB, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_set_srgbprofile (mng_handle hHandle, + mng_pchar zFilename) +{ +#ifdef MNG_INCLUDE_LCMS + mng_datap pData; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SRGBPROFILE2, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_LCMS + MNG_VALIDHANDLE (hHandle) + + pData = (mng_datap)hHandle; /* address the structure */ + + if (pData->hProf3) /* previously defined ? */ + mnglcms_freeprofile (pData->hProf3); + /* allocate new CMS profile handle */ + pData->hProf3 = mnglcms_createfileprofile (zFilename); + + if (!pData->hProf3) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); +#endif /* MNG_INCLUDE_LCMS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SRGBPROFILE2, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_set_srgbprofile2 (mng_handle hHandle, + mng_uint32 iProfilesize, + mng_ptr pProfile) +{ +#ifdef MNG_INCLUDE_LCMS + mng_datap pData; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SRGBPROFILE, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_LCMS + MNG_VALIDHANDLE (hHandle) + + pData = (mng_datap)hHandle; /* address the structure */ + + if (pData->hProf3) /* previously defined ? */ + mnglcms_freeprofile (pData->hProf3); + /* allocate new CMS profile handle */ + pData->hProf3 = mnglcms_creatememprofile (iProfilesize, pProfile); + + if (!pData->hProf3) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); +#endif /* MNG_INCLUDE_LCMS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SRGBPROFILE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_srgbimplicit (mng_handle hHandle) +{ +#ifdef MNG_INCLUDE_LCMS + mng_datap pData; +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SRGBIMPLICIT, MNG_LC_START); +#endif + +#ifdef MNG_INCLUDE_LCMS + MNG_VALIDHANDLE (hHandle) + + pData = (mng_datap)hHandle; /* address the structure */ + + if (pData->hProf3) /* previously defined ? */ + mnglcms_freeprofile (pData->hProf3); + /* allocate new CMS profile handle */ + pData->hProf3 = mnglcms_createsrgbprofile (); + + if (!pData->hProf3) /* handle error ? */ + MNG_ERRORL (pData, MNG_LCMS_NOHANDLE); +#endif /* MNG_INCLUDE_LCMS */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SRGBIMPLICIT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_retcode MNG_DECL mng_set_viewgamma (mng_handle hHandle, + mng_float dGamma) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_VIEWGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->dViewgamma = dGamma; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_VIEWGAMMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_displaygamma (mng_handle hHandle, + mng_float dGamma) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DISPLAYGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->dDisplaygamma = dGamma; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DISPLAYGAMMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_dfltimggamma (mng_handle hHandle, + mng_float dGamma) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DFLTIMGGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->dDfltimggamma = dGamma; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DFLTIMGGAMMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_retcode MNG_DECL mng_set_viewgammaint (mng_handle hHandle, + mng_uint32 iGamma) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_VIEWGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->dViewgamma = (mng_float)iGamma / 100000; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_VIEWGAMMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_displaygammaint (mng_handle hHandle, + mng_uint32 iGamma) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DISPLAYGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->dDisplaygamma = (mng_float)iGamma / 100000; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DISPLAYGAMMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#ifndef MNG_NO_DFLT_INFO +mng_retcode MNG_DECL mng_set_dfltimggammaint (mng_handle hHandle, + mng_uint32 iGamma) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DFLTIMGGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->dDfltimggamma = (mng_float)iGamma / 100000; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_DFLTIMGGAMMA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIP_MAXCANVAS +mng_retcode MNG_DECL mng_set_maxcanvaswidth (mng_handle hHandle, + mng_uint32 iMaxwidth) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_MAXCANVASWIDTH, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iMaxwidth = iMaxwidth; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_MAXCANVASWIDTH, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_maxcanvasheight (mng_handle hHandle, + mng_uint32 iMaxheight) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_MAXCANVASHEIGHT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iMaxheight = iMaxheight; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_MAXCANVASHEIGHT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_set_maxcanvassize (mng_handle hHandle, + mng_uint32 iMaxwidth, + mng_uint32 iMaxheight) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_MAXCANVASSIZE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iMaxwidth = iMaxwidth; + ((mng_datap)hHandle)->iMaxheight = iMaxheight; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_MAXCANVASSIZE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_zlib_level (mng_handle hHandle, + mng_int32 iZlevel) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_LEVEL, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iZlevel = iZlevel; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_LEVEL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_zlib_method (mng_handle hHandle, + mng_int32 iZmethod) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_METHOD, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iZmethod = iZmethod; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_METHOD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_zlib_windowbits (mng_handle hHandle, + mng_int32 iZwindowbits) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_WINDOWBITS, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iZwindowbits = iZwindowbits; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_WINDOWBITS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_zlib_memlevel (mng_handle hHandle, + mng_int32 iZmemlevel) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_MEMLEVEL, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iZmemlevel = iZmemlevel; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_MEMLEVEL, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_zlib_strategy (mng_handle hHandle, + mng_int32 iZstrategy) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_STRATEGY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iZstrategy = iZstrategy; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_STRATEGY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_zlib_maxidat (mng_handle hHandle, + mng_uint32 iMaxIDAT) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_MAXIDAT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iMaxIDAT = iMaxIDAT; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_ZLIB_MAXIDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_jpeg_dctmethod (mng_handle hHandle, + mngjpeg_dctmethod eJPEGdctmethod) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_DCTMETHOD, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->eJPEGdctmethod = eJPEGdctmethod; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_DCTMETHOD, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_jpeg_quality (mng_handle hHandle, + mng_int32 iJPEGquality) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_QUALITY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iJPEGquality = iJPEGquality; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_QUALITY, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_jpeg_smoothing (mng_handle hHandle, + mng_int32 iJPEGsmoothing) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_SMOOTHING, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iJPEGsmoothing = iJPEGsmoothing; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_SMOOTHING, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_jpeg_progressive (mng_handle hHandle, + mng_bool bJPEGprogressive) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_PROGRESSIVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->bJPEGcompressprogr = bJPEGprogressive; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_PROGRESSIVE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_jpeg_optimized (mng_handle hHandle, + mng_bool bJPEGoptimized) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_OPTIMIZED, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->bJPEGcompressopt = bJPEGoptimized; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_OPTIMIZED, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +#ifdef MNG_SUPPORT_WRITE +mng_retcode MNG_DECL mng_set_jpeg_maxjdat (mng_handle hHandle, + mng_uint32 iMaxJDAT) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_MAXJDAT, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iMaxJDAT = iMaxJDAT; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_JPEG_MAXJDAT, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_WRITE */ +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_retcode MNG_DECL mng_set_suspensionmode (mng_handle hHandle, + mng_bool bSuspensionmode) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SUSPENSIONMODE, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + if (((mng_datap)hHandle)->bReading) /* we must NOT be reading !!! */ + MNG_ERROR ((mng_datap)hHandle, MNG_FUNCTIONINVALID); + + ((mng_datap)hHandle)->bSuspensionmode = bSuspensionmode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SUSPENSIONMODE, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_set_speed (mng_handle hHandle, + mng_speedtype iSpeed) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SPEED, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + ((mng_datap)hHandle)->iSpeed = iSpeed; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_SET_SPEED, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ +/* * * */ +/* * Property get functions * */ +/* * * */ +/* ************************************************************************** */ + +mng_ptr MNG_DECL mng_get_userdata (mng_handle hHandle) +{ /* no tracing in here to prevent recursive calls */ + MNG_VALIDHANDLEX (hHandle) + return ((mng_datap)hHandle)->pUserdata; +} + +/* ************************************************************************** */ + +mng_imgtype MNG_DECL mng_get_sigtype (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_SIGTYPE, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_it_unknown; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_SIGTYPE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->eSigtype; +} + +/* ************************************************************************** */ + +mng_imgtype MNG_DECL mng_get_imagetype (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_IMAGETYPE, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_it_unknown; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_IMAGETYPE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->eImagetype; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_imagewidth (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_IMAGEWIDTH, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_IMAGEWIDTH, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iWidth; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_imageheight (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_IMAGEWIDTH, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_IMAGEHEIGHT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iHeight; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_ticks (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_TICKS, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_TICKS, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iTicks; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_framecount (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_FRAMECOUNT, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_FRAMECOUNT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iFramecount; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_layercount (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_LAYERCOUNT, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_LAYERCOUNT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iLayercount; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_playtime (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_PLAYTIME, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_PLAYTIME, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iPlaytime; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_simplicity (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_SIMPLICITY, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_SIMPLICITY, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iSimplicity; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_bitdepth (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_BITDEPTH, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + + if (((mng_datap)hHandle)->eImagetype == mng_it_png) + iRslt = ((mng_datap)hHandle)->iBitdepth; + else +#ifdef MNG_INCLUDE_JNG + if (((mng_datap)hHandle)->eImagetype == mng_it_jng) + iRslt = ((mng_datap)hHandle)->iJHDRimgbitdepth; + else +#endif + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_BITDEPTH, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_colortype (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_COLORTYPE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + + if (((mng_datap)hHandle)->eImagetype == mng_it_png) + iRslt = ((mng_datap)hHandle)->iColortype; + else +#ifdef MNG_INCLUDE_JNG + if (((mng_datap)hHandle)->eImagetype == mng_it_jng) + iRslt = ((mng_datap)hHandle)->iJHDRcolortype; + else +#endif + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_COLORTYPE, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_compression (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_COMPRESSION, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + + if (((mng_datap)hHandle)->eImagetype == mng_it_png) + iRslt = ((mng_datap)hHandle)->iCompression; + else +#ifdef MNG_INCLUDE_JNG + if (((mng_datap)hHandle)->eImagetype == mng_it_jng) + iRslt = ((mng_datap)hHandle)->iJHDRimgcompression; + else +#endif + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_COMPRESSION, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_filter (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_FILTER, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + + if (((mng_datap)hHandle)->eImagetype == mng_it_png) + iRslt = ((mng_datap)hHandle)->iFilter; + else + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_FILTER, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_interlace (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_INTERLACE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + + if (((mng_datap)hHandle)->eImagetype == mng_it_png) + iRslt = ((mng_datap)hHandle)->iInterlace; + else +#ifdef MNG_INCLUDE_JNG + if (((mng_datap)hHandle)->eImagetype == mng_it_jng) + iRslt = ((mng_datap)hHandle)->iJHDRimginterlace; + else +#endif + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_INTERLACE, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_alphabitdepth (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHABITDEPTH, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_INCLUDE_JNG + if (((mng_datap)hHandle)->eImagetype == mng_it_jng) + iRslt = ((mng_datap)hHandle)->iJHDRalphabitdepth; + else +#endif + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHABITDEPTH, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_uint8 MNG_DECL mng_get_refreshpass (mng_handle hHandle) +{ + mng_uint8 iRslt; + mng_datap pData; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_REFRESHPASS, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + + pData = (mng_datap)hHandle; + /* for PNG we know the exact pass */ + if ((pData->eImagetype == mng_it_png) && (pData->iPass >= 0)) + iRslt = pData->iPass; +#ifdef MNG_INCLUDE_JNG + else /* for JNG we'll fake it... */ + if ((pData->eImagetype == mng_it_jng) && + (pData->bJPEGhasheader) && (pData->bJPEGdecostarted) && + (pData->bJPEGprogressive)) + { + if (pData->pJPEGdinfo->input_scan_number <= 1) + iRslt = 0; /* first pass (I think...) */ + else + if (jpeg_input_complete (pData->pJPEGdinfo)) + iRslt = 7; /* input complete; aka final pass */ + else + iRslt = 3; /* anything between 0 and 7 will do */ + + } +#endif + else + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_REFRESHPASS, MNG_LC_END); +#endif + + return iRslt; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ +mng_uint8 MNG_DECL mng_get_alphacompression (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHACOMPRESSION, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_INCLUDE_JNG + if (((mng_datap)hHandle)->eImagetype == mng_it_jng) + iRslt = ((mng_datap)hHandle)->iJHDRalphacompression; + else +#endif + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHACOMPRESSION, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_alphafilter (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHAFILTER, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_INCLUDE_JNG + if (((mng_datap)hHandle)->eImagetype == mng_it_jng) + iRslt = ((mng_datap)hHandle)->iJHDRalphafilter; + else +#endif + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHAFILTER, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_alphainterlace (mng_handle hHandle) +{ + mng_uint8 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHAINTERLACE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_INCLUDE_JNG + if (((mng_datap)hHandle)->eImagetype == mng_it_jng) + iRslt = ((mng_datap)hHandle)->iJHDRalphainterlace; + else +#endif + iRslt = 0; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHAINTERLACE, MNG_LC_END); +#endif + + return iRslt; +} + +/* ************************************************************************** */ + +mng_uint8 MNG_DECL mng_get_alphadepth (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHADEPTH, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ALPHADEPTH, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iAlphadepth; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_canvasstyle (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CANVASSTYLE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CANVASSTYLE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iCanvasstyle; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_bkgdstyle (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_BKGDSTYLE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_BKGDSTYLE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iBkgdstyle; +} + +/* ************************************************************************** */ + +mng_retcode MNG_DECL mng_get_bgcolor (mng_handle hHandle, + mng_uint16* iRed, + mng_uint16* iGreen, + mng_uint16* iBlue) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GET_BGCOLOR, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + *iRed = ((mng_datap)hHandle)->iBGred; + *iGreen = ((mng_datap)hHandle)->iBGgreen; + *iBlue = ((mng_datap)hHandle)->iBGblue; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (((mng_datap)hHandle), MNG_FN_GET_BGCOLOR, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_bool MNG_DECL mng_get_usebkgd (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_USEBKGD, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_USEBKGD, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bUseBKGD; +} + +/* ************************************************************************** */ + +mng_bool MNG_DECL mng_get_storechunks (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_STORECHUNKS, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_STORECHUNKS, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bStorechunks; +} + +/* ************************************************************************** */ + +mng_bool MNG_DECL mng_get_sectionbreaks (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_SECTIONBREAKS, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_SECTIONBREAKS, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bSectionbreaks; +} + +/* ************************************************************************** */ + +mng_bool MNG_DECL mng_get_cacheplayback (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_CACHEPLAYBACK, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_CACHEPLAYBACK, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bCacheplayback; +} + +/* ************************************************************************** */ + +mng_bool MNG_DECL mng_get_doprogressive (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_DOPROGRESSIVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_DOPROGRESSIVE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bDoProgressive; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_crcmode (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_CRCMODE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_CRCMODE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iCrcmode; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_bool MNG_DECL mng_get_srgb (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_SRGB, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEB (((mng_datap)hHandle), MNG_FN_GET_SRGB, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bIssRGB; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_float MNG_DECL mng_get_viewgamma (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_VIEWGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_VIEWGAMMA, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->dViewgamma; +} +#endif + +/* ************************************************************************** */ + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_float MNG_DECL mng_get_displaygamma (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_DISPLAYGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_DISPLAYGAMMA, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->dDisplaygamma; +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DFLT_INFO +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_float MNG_DECL mng_get_dfltimggamma (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_DFLTIMGGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_DFLTIMGGAMMA, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->dDfltimggamma; +} +#endif +#endif + +/* ************************************************************************** */ + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_uint32 MNG_DECL mng_get_viewgammaint (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_VIEWGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_VIEWGAMMA, MNG_LC_END); +#endif + + return (mng_uint32)(((mng_datap)hHandle)->dViewgamma * 100000); +} +#endif + +/* ************************************************************************** */ + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_uint32 MNG_DECL mng_get_displaygammaint (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_DISPLAYGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_DISPLAYGAMMA, MNG_LC_END); +#endif + + return (mng_uint32)(((mng_datap)hHandle)->dDisplaygamma * 100000); +} +#endif + +/* ************************************************************************** */ + +#ifndef MNG_NO_DFLT_INFO +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +mng_uint32 MNG_DECL mng_get_dfltimggammaint (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_DFLTIMGGAMMA, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_DFLTIMGGAMMA, MNG_LC_END); +#endif + + return (mng_uint32)(((mng_datap)hHandle)->dDfltimggamma * 100000); +} +#endif +#endif + +/* ************************************************************************** */ + +#ifndef MNG_SKIP_MAXCANVAS +mng_uint32 MNG_DECL mng_get_maxcanvaswidth (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_MAXCANVASWIDTH, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_MAXCANVASWIDTH, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iMaxwidth; +} + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_maxcanvasheight (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_MAXCANVASHEIGHT, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_MAXCANVASHEIGHT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iMaxheight; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +mng_int32 MNG_DECL mng_get_zlib_level (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_LEVEL, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_LEVEL, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iZlevel; +} +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +mng_int32 MNG_DECL mng_get_zlib_method (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_METHOD, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_METHOD, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iZmethod; +} + +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +mng_int32 MNG_DECL mng_get_zlib_windowbits (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_WINDOWBITS, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_WINDOWBITS, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iZwindowbits; +} +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +mng_int32 MNG_DECL mng_get_zlib_memlevel (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_MEMLEVEL, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_MEMLEVEL, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iZmemlevel; +} +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +mng_int32 MNG_DECL mng_get_zlib_strategy (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_STRATEGY, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_STRATEGY, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iZstrategy; +} +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB +#ifdef MNG_ACCESS_ZLIB +mng_uint32 MNG_DECL mng_get_zlib_maxidat (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_MAXIDAT, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_ZLIB_MAXIDAT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iMaxIDAT; +} +#endif /* MNG_ACCESS_ZLIB */ +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +mngjpeg_dctmethod MNG_DECL mng_get_jpeg_dctmethod (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_DCTMETHOD, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return JDCT_ISLOW; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_DCTMETHOD, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->eJPEGdctmethod; +} +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +mng_int32 MNG_DECL mng_get_jpeg_quality (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_QUALITY, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_QUALITY, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iJPEGquality; +} +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +mng_int32 MNG_DECL mng_get_jpeg_smoothing (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_SMOOTHING, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_SMOOTHING, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iJPEGsmoothing; +} +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +mng_bool MNG_DECL mng_get_jpeg_progressive (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_PROGRESSIVE, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_PROGRESSIVE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bJPEGcompressprogr; +} +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +mng_bool MNG_DECL mng_get_jpeg_optimized (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_OPTIMIZED, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_OPTIMIZED, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bJPEGcompressopt; +} +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG +#ifdef MNG_ACCESS_JPEG +mng_uint32 MNG_DECL mng_get_jpeg_maxjdat (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_MAXJDAT, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_JPEG_MAXJDAT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iMaxJDAT; +} +#endif /* MNG_ACCESS_JPEG */ +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_bool MNG_DECL mng_get_suspensionmode (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_SUSPENSIONMODE, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_SUSPENSIONMODE, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bSuspensionmode; +} +#endif /* MNG_SUPPORT_READ */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_speedtype MNG_DECL mng_get_speed (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_SPEED, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_SPEED, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iSpeed; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +mng_uint32 MNG_DECL mng_get_imagelevel (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_IMAGELEVEL, MNG_LC_START); +#endif + + MNG_VALIDHANDLEX (hHandle) + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_IMAGELEVEL, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iImagelevel; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_get_lastbackchunk (mng_handle hHandle, + mng_uint16* iRed, + mng_uint16* iGreen, + mng_uint16* iBlue, + mng_uint8* iMandatory) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_LASTBACKCHUNK, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + if (((mng_datap)hHandle)->eImagetype != mng_it_mng) + MNG_ERROR (((mng_datap)hHandle), MNG_FUNCTIONINVALID); + + *iRed = ((mng_datap)hHandle)->iBACKred; + *iGreen = ((mng_datap)hHandle)->iBACKgreen; + *iBlue = ((mng_datap)hHandle)->iBACKblue; + *iMandatory = ((mng_datap)hHandle)->iBACKmandatory; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_LASTBACKCHUNK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode MNG_DECL mng_get_lastseekname (mng_handle hHandle, + mng_pchar zSegmentname) +{ + mng_datap pData; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_LASTSEEKNAME, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + pData = (mng_datap)hHandle; + /* only allowed for MNG ! */ + if (pData->eImagetype != mng_it_mng) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + if (pData->pLastseek) /* is there a last SEEK ? */ + { + mng_ani_seekp pSEEK = (mng_ani_seekp)pData->pLastseek; + + if (pSEEK->iSegmentnamesize) /* copy the name if there is one */ + MNG_COPY (zSegmentname, pSEEK->zSegmentname, pSEEK->iSegmentnamesize); + + *(((mng_uint8p)zSegmentname) + pSEEK->iSegmentnamesize) = 0; + } + else + { /* return an empty string */ + *((mng_uint8p)zSegmentname) = 0; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_LASTSEEKNAME, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_uint32 MNG_DECL mng_get_currframdelay (mng_handle hHandle) +{ + mng_datap pData; + mng_uint32 iRslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CURRFRAMDELAY, MNG_LC_START); +#endif + + MNG_VALIDHANDLE (hHandle) + + pData = (mng_datap)hHandle; + /* only allowed for MNG ! */ + if (pData->eImagetype != mng_it_mng) + MNG_ERROR (pData, MNG_FUNCTIONINVALID); + + iRslt = pData->iFramedelay; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CURRFRAMDELAY, MNG_LC_END); +#endif + + return iRslt; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_uint32 MNG_DECL mng_get_starttime (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_STARTTIME, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_STARTTIME, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iStarttime; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_uint32 MNG_DECL mng_get_runtime (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_RUNTIME, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_RUNTIME, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iRuntime; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_CURRENT_INFO +mng_uint32 MNG_DECL mng_get_currentframe (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CURRENTFRAME, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CURRENTFRAME, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iFrameseq; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_CURRENT_INFO +mng_uint32 MNG_DECL mng_get_currentlayer (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CURRENTLAYER, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CURRENTLAYER, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iLayerseq; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_CURRENT_INFO +mng_uint32 MNG_DECL mng_get_currentplaytime (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CURRENTPLAYTIME, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_CURRENTPLAYTIME, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iFrametime; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_CURRENT_INFO +mng_uint32 MNG_DECL mng_get_totalframes (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_TOTALFRAMES, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_TOTALFRAMES, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iTotalframes; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_CURRENT_INFO +mng_uint32 MNG_DECL mng_get_totallayers (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_TOTALLAYERS, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_TOTALLAYERS, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iTotallayers; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +#ifndef MNG_NO_CURRENT_INFO +mng_uint32 MNG_DECL mng_get_totalplaytime (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_TOTALPLAYTIME, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return mng_st_normal; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_GET_TOTALPLAYTIME, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->iTotalplaytime; +} +#endif +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +mng_bool MNG_DECL mng_status_error (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_ERROR, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_ERROR, MNG_LC_END); +#endif + + return (mng_bool)((mng_datap)hHandle)->iErrorcode; +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_bool MNG_DECL mng_status_reading (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_READING, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_READING, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bReading; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_READ +mng_bool MNG_DECL mng_status_suspendbreak (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_SUSPENDBREAK, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_SUSPENDBREAK, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bSuspended; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_WRITE +mng_bool MNG_DECL mng_status_creating (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_CREATING, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_CREATING, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bCreating; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_WRITE +mng_bool MNG_DECL mng_status_writing (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_WRITING, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_WRITING, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bWriting; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_bool MNG_DECL mng_status_displaying (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_DISPLAYING, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_DISPLAYING, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bDisplaying; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_bool MNG_DECL mng_status_running (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_RUNNING, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_RUNNING, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bRunning; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_bool MNG_DECL mng_status_timerbreak (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_TIMERBREAK, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_TIMERBREAK, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bTimerset; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DYNAMICMNG +mng_bool MNG_DECL mng_status_dynamic (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_DYNAMIC, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_DYNAMIC, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bDynamic; +} +#endif + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DYNAMICMNG +mng_bool MNG_DECL mng_status_runningevent (mng_handle hHandle) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_RUNNINGEVENT, MNG_LC_START); +#endif + + if ((hHandle == 0) || (((mng_datap)hHandle)->iMagic != MNG_MAGIC)) + return MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACEX (((mng_datap)hHandle), MNG_FN_STATUS_RUNNINGEVENT, MNG_LC_END); +#endif + + return ((mng_datap)hHandle)->bRunningevent; +} +#endif + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_read.c b/src/3rdparty/libmng/libmng_read.c new file mode 100644 index 0000000000..c922e19a5e --- /dev/null +++ b/src/3rdparty/libmng/libmng_read.c @@ -0,0 +1,1369 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_read.c copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Read logic (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the high-level read logic * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - added callback error-reporting support * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.5.2 - 05/19/2000 - G.Juyn * */ +/* * - cleaned up some code regarding mixed support * */ +/* * 0.5.2 - 05/20/2000 - G.Juyn * */ +/* * - added support for JNG * */ +/* * 0.5.2 - 05/31/2000 - G.Juyn * */ +/* * - fixed up punctuation (contribution by Tim Rowley) * */ +/* * * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - changed progressive-display processing * */ +/* * * */ +/* * 0.9.1 - 07/08/2000 - G.Juyn * */ +/* * - changed read-processing for improved I/O-suspension * */ +/* * 0.9.1 - 07/14/2000 - G.Juyn * */ +/* * - changed EOF processing behavior * */ +/* * 0.9.1 - 07/14/2000 - G.Juyn * */ +/* * - changed default readbuffer size from 1024 to 4200 * */ +/* * * */ +/* * 0.9.2 - 07/27/2000 - G.Juyn * */ +/* * - B110320 - fixed GCC warning about mix-sized pointer math * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - B110546 - fixed for improperly returning UNEXPECTEDEOF * */ +/* * 0.9.2 - 08/04/2000 - G.Juyn * */ +/* * - B111096 - fixed large-buffer read-suspension * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - removed test-MaGN * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added support for JDAA * */ +/* * * */ +/* * 0.9.5 - 01/23/2001 - G.Juyn * */ +/* * - fixed timing-problem with switching framing_modes * */ +/* * * */ +/* * 1.0.4 - 06/22/2002 - G.Juyn * */ +/* * - B495443 - incorrect suspend check in read_databuffer * */ +/* * * */ +/* * 1.0.5 - 07/04/2002 - G.Juyn * */ +/* * - added errorcode for extreme chunk-sizes * */ +/* * 1.0.5 - 07/08/2002 - G.Juyn * */ +/* * - B578572 - removed eMNGma hack (thanks Dimitri!) * */ +/* * 1.0.5 - 07/16/2002 - G.Juyn * */ +/* * - B581625 - large chunks fail with suspension reads * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * - added HLAPI function to copy chunks * */ +/* * 1.0.5 - 09/16/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * * */ +/* * 1.0.6 - 05/25/2003 - G.R-P * */ +/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added MNG_NO_DELTA_PNG reduction * */ +/* * - skip additional code when MNG_INCLUDE_JNG is not enabled * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * 1.0.6 - 08/17/2003 - G.R-P * */ +/* * - added conditionals around non-VLC chunk support * */ +/* * * */ +/* * 1.0.7 - 03/10/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * * */ +/* * 1.0.8 - 04/08/2004 - G.Juyn * */ +/* * - added CRC existence & checking flags * */ +/* * 1.0.8 - 04/11/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * 1.0.8 - 07/06/2004 - G.R-P * */ +/* * - defend against using undefined closestream function * */ +/* * 1.0.8 - 07/28/2004 - G.R-P * */ +/* * - added check for extreme chunk-lengths * */ +/* * * */ +/* * 1.0.9 - 09/16/2004 - G.Juyn * */ +/* * - fixed chunk pushing mechanism * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKINITFREE * */ +/* * 1.0.9 - 12/06/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKASSIGN * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * 1.0.9 - 12/31/2004 - G.R-P * */ +/* * - removed stray characters from #ifdef directive * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_memory.h" +#include "libmng_objects.h" +#include "libmng_object_prc.h" +#include "libmng_chunks.h" +#ifdef MNG_OPTIMIZE_CHUNKREADER +#include "libmng_chunk_descr.h" +#endif +#include "libmng_chunk_prc.h" +#include "libmng_chunk_io.h" +#include "libmng_display.h" +#include "libmng_read.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_READ_PROCS + +/* ************************************************************************** */ + +mng_retcode mng_process_eof (mng_datap pData) +{ + if (!pData->bEOF) /* haven't closed the stream yet ? */ + { + pData->bEOF = MNG_TRUE; /* now we do! */ + +#ifndef MNG_NO_OPEN_CLOSE_STREAM + if (pData->fClosestream && !pData->fClosestream ((mng_handle)pData)) + { + MNG_ERROR (pData, MNG_APPIOERROR); + } +#endif + } + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_release_pushdata (mng_datap pData) +{ + mng_pushdatap pFirst = pData->pFirstpushdata; + mng_pushdatap pNext = pFirst->pNext; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RELEASE_PUSHDATA, MNG_LC_START); +#endif + + pData->pFirstpushdata = pNext; /* next becomes the first */ + + if (!pNext) /* no next? => no last! */ + pData->pLastpushdata = MNG_NULL; + /* buffer owned and release callback defined? */ + if ((pFirst->bOwned) && (pData->fReleasedata)) + pData->fReleasedata ((mng_handle)pData, pFirst->pData, pFirst->iLength); + else /* otherwise use internal free mechanism */ + MNG_FREEX (pData, pFirst->pData, pFirst->iLength); + /* and free it */ + MNG_FREEX (pData, pFirst, sizeof(mng_pushdata)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RELEASE_PUSHDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mng_release_pushchunk (mng_datap pData) +{ + mng_pushdatap pFirst = pData->pFirstpushchunk; + mng_pushdatap pNext = pFirst->pNext; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RELEASE_PUSHCHUNK, MNG_LC_START); +#endif + + pData->pFirstpushchunk = pNext; /* next becomes the first */ + + if (!pNext) /* no next? => no last! */ + pData->pLastpushchunk = MNG_NULL; + /* buffer owned and release callback defined? */ + if ((pFirst->bOwned) && (pData->fReleasedata)) + pData->fReleasedata ((mng_handle)pData, pFirst->pData, pFirst->iLength); + else /* otherwise use internal free mechanism */ + MNG_FREEX (pData, pFirst->pData, pFirst->iLength); + /* and free it */ + MNG_FREEX (pData, pFirst, sizeof(mng_pushdata)); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_RELEASE_PUSHCHUNK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode read_data (mng_datap pData, + mng_uint8p pBuf, + mng_uint32 iSize, + mng_uint32 * iRead) +{ + mng_retcode iRetcode; + mng_uint32 iTempsize = iSize; + mng_uint8p pTempbuf = pBuf; + mng_pushdatap pPush = pData->pFirstpushdata; + mng_uint32 iPushsize = 0; + *iRead = 0; /* nothing yet */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DATA, MNG_LC_START); +#endif + + while (pPush) /* calculate size of pushed data */ + { + iPushsize += pPush->iRemaining; + pPush = pPush->pNext; + } + + if (iTempsize <= iPushsize) /* got enough push data? */ + { + while (iTempsize) + { + pPush = pData->pFirstpushdata; + /* enough data remaining in this buffer? */ + if (pPush->iRemaining <= iTempsize) + { /* no: then copy what we've got */ + MNG_COPY (pTempbuf, pPush->pDatanext, pPush->iRemaining); + /* move pointers & lengths */ + pTempbuf += pPush->iRemaining; + *iRead += pPush->iRemaining; + iTempsize -= pPush->iRemaining; + /* release the depleted buffer */ + iRetcode = mng_release_pushdata (pData); + if (iRetcode) + return iRetcode; + } + else + { /* copy the needed bytes */ + MNG_COPY (pTempbuf, pPush->pDatanext, iTempsize); + /* move pointers & lengths */ + pPush->iRemaining -= iTempsize; + pPush->pDatanext += iTempsize; + pTempbuf += iTempsize; + *iRead += iTempsize; + iTempsize = 0; /* all done!!! */ + } + } + } + else + { + mng_uint32 iTempread = 0; + /* get it from the app then */ + if (!pData->fReaddata (((mng_handle)pData), pTempbuf, iTempsize, &iTempread)) + MNG_ERROR (pData, MNG_APPIOERROR); + + *iRead += iTempread; + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode read_databuffer (mng_datap pData, + mng_uint8p pBuf, + mng_uint8p * pBufnext, + mng_uint32 iSize, + mng_uint32 * iRead) +{ + mng_retcode iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DATABUFFER, MNG_LC_START); +#endif + + if (pData->bSuspensionmode) + { + mng_uint8p pTemp; + mng_uint32 iTemp; + + *iRead = 0; /* let's be negative about the outcome */ + + if (!pData->pSuspendbuf) /* need to create a suspension buffer ? */ + { + pData->iSuspendbufsize = MNG_SUSPENDBUFFERSIZE; + /* so, create it */ + MNG_ALLOC (pData, pData->pSuspendbuf, pData->iSuspendbufsize); + + pData->iSuspendbufleft = 0; /* make sure to fill it first time */ + pData->pSuspendbufnext = pData->pSuspendbuf; + } + /* more than our buffer can hold ? */ + if (iSize > pData->iSuspendbufsize) + { + mng_uint32 iRemain; + + if (!*pBufnext) /* first time ? */ + { + if (pData->iSuspendbufleft) /* do we have some data left ? */ + { /* then copy it */ + MNG_COPY (pBuf, pData->pSuspendbufnext, pData->iSuspendbufleft); + /* fixup variables */ + *pBufnext = pBuf + pData->iSuspendbufleft; + pData->pSuspendbufnext = pData->pSuspendbuf; + pData->iSuspendbufleft = 0; + } + else + { + *pBufnext = pBuf; + } + } + /* calculate how much to get */ + iRemain = iSize - (mng_uint32)(*pBufnext - pBuf); + /* let's go get it */ + iRetcode = read_data (pData, *pBufnext, iRemain, &iTemp); + if (iRetcode) + return iRetcode; + /* first read after suspension return 0 means EOF */ + if ((pData->iSuspendpoint) && (iTemp == 0)) + { /* that makes it final */ + mng_retcode iRetcode = mng_process_eof (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* indicate the source is depleted */ + *iRead = iSize - iRemain + iTemp; + } + else + { + if (iTemp < iRemain) /* suspension required ? */ + { + *pBufnext = *pBufnext + iTemp; + pData->bSuspended = MNG_TRUE; + } + else + { + *iRead = iSize; /* got it all now ! */ + } + } + } + else + { /* need to read some more ? */ + while ((!pData->bSuspended) && (!pData->bEOF) && (iSize > pData->iSuspendbufleft)) + { /* not enough space left in buffer ? */ + if (pData->iSuspendbufsize - pData->iSuspendbufleft - + (mng_uint32)(pData->pSuspendbufnext - pData->pSuspendbuf) < + MNG_SUSPENDREQUESTSIZE) + { + if (pData->iSuspendbufleft) /* then lets shift (if there's anything left) */ + MNG_COPY (pData->pSuspendbuf, pData->pSuspendbufnext, pData->iSuspendbufleft); + /* adjust running pointer */ + pData->pSuspendbufnext = pData->pSuspendbuf; + } + /* still not enough room ? */ + if (pData->iSuspendbufsize - pData->iSuspendbufleft < MNG_SUSPENDREQUESTSIZE) + MNG_ERROR (pData, MNG_INTERNALERROR); + /* now read some more data */ + pTemp = pData->pSuspendbufnext + pData->iSuspendbufleft; + + iRetcode = read_data (pData, pTemp, MNG_SUSPENDREQUESTSIZE, &iTemp); + if (iRetcode) + return iRetcode; + /* adjust fill-counter */ + pData->iSuspendbufleft += iTemp; + /* first read after suspension returning 0 means EOF */ + if ((pData->iSuspendpoint) && (iTemp == 0)) + { /* that makes it final */ + mng_retcode iRetcode = mng_process_eof (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + + if (pData->iSuspendbufleft) /* return the leftover scraps */ + MNG_COPY (pBuf, pData->pSuspendbufnext, pData->iSuspendbufleft); + /* and indicate so */ + *iRead = pData->iSuspendbufleft; + pData->pSuspendbufnext = pData->pSuspendbuf; + pData->iSuspendbufleft = 0; + } + else + { /* suspension required ? */ + if ((iSize > pData->iSuspendbufleft) && (iTemp < MNG_SUSPENDREQUESTSIZE)) + pData->bSuspended = MNG_TRUE; + + } + + pData->iSuspendpoint = 0; /* reset it here in case we loop back */ + } + + if ((!pData->bSuspended) && (!pData->bEOF)) + { /* return the data ! */ + MNG_COPY (pBuf, pData->pSuspendbufnext, iSize); + + *iRead = iSize; /* returned it all */ + /* adjust suspension-buffer variables */ + pData->pSuspendbufnext += iSize; + pData->iSuspendbufleft -= iSize; + } + } + } + else + { + iRetcode = read_data (pData, (mng_ptr)pBuf, iSize, iRead); + if (iRetcode) + return iRetcode; + if (*iRead == 0) /* suspension required ? */ + pData->bSuspended = MNG_TRUE; + } + + pData->iSuspendpoint = 0; /* safely reset it here ! */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_DATABUFFER, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode process_raw_chunk (mng_datap pData, + mng_uint8p pBuf, + mng_uint32 iBuflen) +{ + +#ifndef MNG_OPTIMIZE_CHUNKREADER + /* the table-idea & binary search code was adapted from + libpng 1.1.0 (pngread.c) */ + /* NOTE1: the table must remain sorted by chunkname, otherwise the binary + search will break !!! (ps. watch upper-/lower-case chunknames !!) */ + /* NOTE2: the layout must remain equal to the header part of all the + chunk-structures (yes, that means even the pNext and pPrev fields; + it's wasting a bit of space, but hey, the code is a lot easier) */ + +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + mng_chunk_header mng_chunk_unknown = {MNG_UINT_HUH, mng_init_general, mng_free_unknown, + mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0, sizeof(mng_unknown_chunk)}; +#else + mng_chunk_header mng_chunk_unknown = {MNG_UINT_HUH, mng_init_unknown, mng_free_unknown, + mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0}; +#endif + +#ifdef MNG_OPTIMIZE_CHUNKINITFREE + + mng_chunk_header mng_chunk_table [] = + { +#ifndef MNG_SKIPCHUNK_BACK + {MNG_UINT_BACK, mng_init_general, mng_free_general, mng_read_back, mng_write_back, mng_assign_general, 0, 0, sizeof(mng_back)}, +#endif +#ifndef MNG_SKIPCHUNK_BASI + {MNG_UINT_BASI, mng_init_general, mng_free_general, mng_read_basi, mng_write_basi, mng_assign_general, 0, 0, sizeof(mng_basi)}, +#endif +#ifndef MNG_SKIPCHUNK_CLIP + {MNG_UINT_CLIP, mng_init_general, mng_free_general, mng_read_clip, mng_write_clip, mng_assign_general, 0, 0, sizeof(mng_clip)}, +#endif +#ifndef MNG_SKIPCHUNK_CLON + {MNG_UINT_CLON, mng_init_general, mng_free_general, mng_read_clon, mng_write_clon, mng_assign_general, 0, 0, sizeof(mng_clon)}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK + {MNG_UINT_DBYK, mng_init_general, mng_free_dbyk, mng_read_dbyk, mng_write_dbyk, mng_assign_dbyk, 0, 0, sizeof(mng_dbyk)}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_DEFI + {MNG_UINT_DEFI, mng_init_general, mng_free_general, mng_read_defi, mng_write_defi, mng_assign_general, 0, 0, sizeof(mng_defi)}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_UINT_DHDR, mng_init_general, mng_free_general, mng_read_dhdr, mng_write_dhdr, mng_assign_general, 0, 0, sizeof(mng_dhdr)}, +#endif +#ifndef MNG_SKIPCHUNK_DISC + {MNG_UINT_DISC, mng_init_general, mng_free_disc, mng_read_disc, mng_write_disc, mng_assign_disc, 0, 0, sizeof(mng_disc)}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DROP + {MNG_UINT_DROP, mng_init_general, mng_free_drop, mng_read_drop, mng_write_drop, mng_assign_drop, 0, 0, sizeof(mng_drop)}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_LOOP + {MNG_UINT_ENDL, mng_init_general, mng_free_general, mng_read_endl, mng_write_endl, mng_assign_general, 0, 0, sizeof(mng_endl)}, +#endif +#ifndef MNG_SKIPCHUNK_FRAM + {MNG_UINT_FRAM, mng_init_general, mng_free_fram, mng_read_fram, mng_write_fram, mng_assign_fram, 0, 0, sizeof(mng_fram)}, +#endif + {MNG_UINT_IDAT, mng_init_general, mng_free_idat, mng_read_idat, mng_write_idat, mng_assign_idat, 0, 0, sizeof(mng_idat)}, /* 12-th element! */ + {MNG_UINT_IEND, mng_init_general, mng_free_general, mng_read_iend, mng_write_iend, mng_assign_general, 0, 0, sizeof(mng_iend)}, + {MNG_UINT_IHDR, mng_init_general, mng_free_general, mng_read_ihdr, mng_write_ihdr, mng_assign_general, 0, 0, sizeof(mng_ihdr)}, +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG + {MNG_UINT_IJNG, mng_init_general, mng_free_general, mng_read_ijng, mng_write_ijng, mng_assign_general, 0, 0, sizeof(mng_ijng)}, +#endif + {MNG_UINT_IPNG, mng_init_general, mng_free_general, mng_read_ipng, mng_write_ipng, mng_assign_general, 0, 0, sizeof(mng_ipng)}, +#endif +#ifdef MNG_INCLUDE_JNG + {MNG_UINT_JDAA, mng_init_general, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa)}, + {MNG_UINT_JDAT, mng_init_general, mng_free_jdat, mng_read_jdat, mng_write_jdat, mng_assign_jdat, 0, 0, sizeof(mng_jdat)}, + {MNG_UINT_JHDR, mng_init_general, mng_free_general, mng_read_jhdr, mng_write_jhdr, mng_assign_general, 0, 0, sizeof(mng_jhdr)}, + {MNG_UINT_JSEP, mng_init_general, mng_free_general, mng_read_jsep, mng_write_jsep, mng_assign_general, 0, 0, sizeof(mng_jsep)}, + {MNG_UINT_JdAA, mng_init_general, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa)}, +#endif +#ifndef MNG_SKIPCHUNK_LOOP + {MNG_UINT_LOOP, mng_init_general, mng_free_loop, mng_read_loop, mng_write_loop, mng_assign_loop, 0, 0, sizeof(mng_loop)}, +#endif +#ifndef MNG_SKIPCHUNK_MAGN + {MNG_UINT_MAGN, mng_init_general, mng_free_general, mng_read_magn, mng_write_magn, mng_assign_general, 0, 0, sizeof(mng_magn)}, +#endif + {MNG_UINT_MEND, mng_init_general, mng_free_general, mng_read_mend, mng_write_mend, mng_assign_general, 0, 0, sizeof(mng_mend)}, + {MNG_UINT_MHDR, mng_init_general, mng_free_general, mng_read_mhdr, mng_write_mhdr, mng_assign_general, 0, 0, sizeof(mng_mhdr)}, +#ifndef MNG_SKIPCHUNK_MOVE + {MNG_UINT_MOVE, mng_init_general, mng_free_general, mng_read_move, mng_write_move, mng_assign_general, 0, 0, sizeof(mng_move)}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR + {MNG_UINT_ORDR, mng_init_general, mng_free_ordr, mng_read_ordr, mng_write_ordr, mng_assign_ordr, 0, 0, sizeof(mng_ordr)}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_PAST + {MNG_UINT_PAST, mng_init_general, mng_free_past, mng_read_past, mng_write_past, mng_assign_past, 0, 0, sizeof(mng_past)}, +#endif + {MNG_UINT_PLTE, mng_init_general, mng_free_general, mng_read_plte, mng_write_plte, mng_assign_general, 0, 0, sizeof(mng_plte)}, +#ifndef MNG_NO_DELTA_PNG + {MNG_UINT_PPLT, mng_init_general, mng_free_general, mng_read_pplt, mng_write_pplt, mng_assign_general, 0, 0, sizeof(mng_pplt)}, + {MNG_UINT_PROM, mng_init_general, mng_free_general, mng_read_prom, mng_write_prom, mng_assign_general, 0, 0, sizeof(mng_prom)}, +#endif +#ifndef MNG_SKIPCHUNK_SAVE + {MNG_UINT_SAVE, mng_init_general, mng_free_save, mng_read_save, mng_write_save, mng_assign_save, 0, 0, sizeof(mng_save)}, +#endif +#ifndef MNG_SKIPCHUNK_SEEK + {MNG_UINT_SEEK, mng_init_general, mng_free_seek, mng_read_seek, mng_write_seek, mng_assign_seek, 0, 0, sizeof(mng_seek)}, +#endif +#ifndef MNG_SKIPCHUNK_SHOW + {MNG_UINT_SHOW, mng_init_general, mng_free_general, mng_read_show, mng_write_show, mng_assign_general, 0, 0, sizeof(mng_show)}, +#endif +#ifndef MNG_SKIPCHUNK_TERM + {MNG_UINT_TERM, mng_init_general, mng_free_general, mng_read_term, mng_write_term, mng_assign_general, 0, 0, sizeof(mng_term)}, +#endif +#ifndef MNG_SKIPCHUNK_bKGD + {MNG_UINT_bKGD, mng_init_general, mng_free_general, mng_read_bkgd, mng_write_bkgd, mng_assign_general, 0, 0, sizeof(mng_bkgd)}, +#endif +#ifndef MNG_SKIPCHUNK_cHRM + {MNG_UINT_cHRM, mng_init_general, mng_free_general, mng_read_chrm, mng_write_chrm, mng_assign_general, 0, 0, sizeof(mng_chrm)}, +#endif +#ifndef MNG_SKIPCHUNK_eXPI + {MNG_UINT_eXPI, mng_init_general, mng_free_expi, mng_read_expi, mng_write_expi, mng_assign_expi, 0, 0, sizeof(mng_expi)}, +#endif +#ifndef MNG_SKIPCHUNK_evNT + {MNG_UINT_evNT, mng_init_general, mng_free_evnt, mng_read_evnt, mng_write_evnt, mng_assign_evnt, 0, 0, sizeof(mng_evnt)}, +#endif +#ifndef MNG_SKIPCHUNK_fPRI + {MNG_UINT_fPRI, mng_init_general, mng_free_general, mng_read_fpri, mng_write_fpri, mng_assign_general, 0, 0, sizeof(mng_fpri)}, +#endif +#ifndef MNG_SKIPCHUNK_gAMA + {MNG_UINT_gAMA, mng_init_general, mng_free_general, mng_read_gama, mng_write_gama, mng_assign_general, 0, 0, sizeof(mng_gama)}, +#endif +#ifndef MNG_SKIPCHUNK_hIST + {MNG_UINT_hIST, mng_init_general, mng_free_general, mng_read_hist, mng_write_hist, mng_assign_general, 0, 0, sizeof(mng_hist)}, +#endif +#ifndef MNG_SKIPCHUNK_iCCP + {MNG_UINT_iCCP, mng_init_general, mng_free_iccp, mng_read_iccp, mng_write_iccp, mng_assign_iccp, 0, 0, sizeof(mng_iccp)}, +#endif +#ifndef MNG_SKIPCHUNK_iTXt + {MNG_UINT_iTXt, mng_init_general, mng_free_itxt, mng_read_itxt, mng_write_itxt, mng_assign_itxt, 0, 0, sizeof(mng_itxt)}, +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_UINT_mpNG, mng_init_general, mng_free_mpng, mng_read_mpng, mng_write_mpng, mng_assign_mpng, 0, 0, sizeof(mng_mpng)}, +#endif +#ifndef MNG_SKIPCHUNK_nEED + {MNG_UINT_nEED, mng_init_general, mng_free_need, mng_read_need, mng_write_need, mng_assign_need, 0, 0, sizeof(mng_need)}, +#endif +/* TODO: {MNG_UINT_oFFs, 0, 0, 0, 0, 0, 0}, */ +/* TODO: {MNG_UINT_pCAL, 0, 0, 0, 0, 0, 0}, */ +#ifndef MNG_SKIPCHUNK_pHYg + {MNG_UINT_pHYg, mng_init_general, mng_free_general, mng_read_phyg, mng_write_phyg, mng_assign_general, 0, 0, sizeof(mng_phyg)}, +#endif +#ifndef MNG_SKIPCHUNK_pHYs + {MNG_UINT_pHYs, mng_init_general, mng_free_general, mng_read_phys, mng_write_phys, mng_assign_general, 0, 0, sizeof(mng_phys)}, +#endif +#ifndef MNG_SKIPCHUNK_sBIT + {MNG_UINT_sBIT, mng_init_general, mng_free_general, mng_read_sbit, mng_write_sbit, mng_assign_general, 0, 0, sizeof(mng_sbit)}, +#endif +/* TODO: {MNG_UINT_sCAL, 0, 0, 0, 0, 0, 0}, */ +#ifndef MNG_SKIPCHUNK_sPLT + {MNG_UINT_sPLT, mng_init_general, mng_free_splt, mng_read_splt, mng_write_splt, mng_assign_splt, 0, 0, sizeof(mng_splt)}, +#endif + {MNG_UINT_sRGB, mng_init_general, mng_free_general, mng_read_srgb, mng_write_srgb, mng_assign_general, 0, 0, sizeof(mng_srgb)}, +#ifndef MNG_SKIPCHUNK_tEXt + {MNG_UINT_tEXt, mng_init_general, mng_free_text, mng_read_text, mng_write_text, mng_assign_text, 0, 0, sizeof(mng_text)}, +#endif +#ifndef MNG_SKIPCHUNK_tIME + {MNG_UINT_tIME, mng_init_general, mng_free_general, mng_read_time, mng_write_time, mng_assign_general, 0, 0, sizeof(mng_time)}, +#endif + {MNG_UINT_tRNS, mng_init_general, mng_free_general, mng_read_trns, mng_write_trns, mng_assign_general, 0, 0, sizeof(mng_trns)}, +#ifndef MNG_SKIPCHUNK_zTXt + {MNG_UINT_zTXt, mng_init_general, mng_free_ztxt, mng_read_ztxt, mng_write_ztxt, mng_assign_ztxt, 0, 0, sizeof(mng_ztxt)}, +#endif + }; + +#else /* MNG_OPTIMIZE_CHUNKINITFREE */ + + mng_chunk_header mng_chunk_table [] = + { +#ifndef MNG_SKIPCHUNK_BACK + {MNG_UINT_BACK, mng_init_back, mng_free_back, mng_read_back, mng_write_back, mng_assign_back, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_BASI + {MNG_UINT_BASI, mng_init_basi, mng_free_basi, mng_read_basi, mng_write_basi, mng_assign_basi, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_CLIP + {MNG_UINT_CLIP, mng_init_clip, mng_free_clip, mng_read_clip, mng_write_clip, mng_assign_clip, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_CLON + {MNG_UINT_CLON, mng_init_clon, mng_free_clon, mng_read_clon, mng_write_clon, mng_assign_clon, 0, 0}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DBYK + {MNG_UINT_DBYK, mng_init_dbyk, mng_free_dbyk, mng_read_dbyk, mng_write_dbyk, mng_assign_dbyk, 0, 0}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_DEFI + {MNG_UINT_DEFI, mng_init_defi, mng_free_defi, mng_read_defi, mng_write_defi, mng_assign_defi, 0, 0}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_UINT_DHDR, mng_init_dhdr, mng_free_dhdr, mng_read_dhdr, mng_write_dhdr, mng_assign_dhdr, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_DISC + {MNG_UINT_DISC, mng_init_disc, mng_free_disc, mng_read_disc, mng_write_disc, mng_assign_disc, 0, 0}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_DROP + {MNG_UINT_DROP, mng_init_drop, mng_free_drop, mng_read_drop, mng_write_drop, mng_assign_drop, 0, 0}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_LOOP + {MNG_UINT_ENDL, mng_init_endl, mng_free_endl, mng_read_endl, mng_write_endl, mng_assign_endl, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_FRAM + {MNG_UINT_FRAM, mng_init_fram, mng_free_fram, mng_read_fram, mng_write_fram, mng_assign_fram, 0, 0}, +#endif + {MNG_UINT_IDAT, mng_init_idat, mng_free_idat, mng_read_idat, mng_write_idat, mng_assign_idat, 0, 0}, /* 12-th element! */ + {MNG_UINT_IEND, mng_init_iend, mng_free_iend, mng_read_iend, mng_write_iend, mng_assign_iend, 0, 0}, + {MNG_UINT_IHDR, mng_init_ihdr, mng_free_ihdr, mng_read_ihdr, mng_write_ihdr, mng_assign_ihdr, 0, 0}, +#ifndef MNG_NO_DELTA_PNG +#ifdef MNG_INCLUDE_JNG + {MNG_UINT_IJNG, mng_init_ijng, mng_free_ijng, mng_read_ijng, mng_write_ijng, mng_assign_ijng, 0, 0}, +#endif + {MNG_UINT_IPNG, mng_init_ipng, mng_free_ipng, mng_read_ipng, mng_write_ipng, mng_assign_ipng, 0, 0}, +#endif +#ifdef MNG_INCLUDE_JNG + {MNG_UINT_JDAA, mng_init_jdaa, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0}, + {MNG_UINT_JDAT, mng_init_jdat, mng_free_jdat, mng_read_jdat, mng_write_jdat, mng_assign_jdat, 0, 0}, + {MNG_UINT_JHDR, mng_init_jhdr, mng_free_jhdr, mng_read_jhdr, mng_write_jhdr, mng_assign_jhdr, 0, 0}, + {MNG_UINT_JSEP, mng_init_jsep, mng_free_jsep, mng_read_jsep, mng_write_jsep, mng_assign_jsep, 0, 0}, + {MNG_UINT_JdAA, mng_init_jdaa, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_LOOP + {MNG_UINT_LOOP, mng_init_loop, mng_free_loop, mng_read_loop, mng_write_loop, mng_assign_loop, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_MAGN + {MNG_UINT_MAGN, mng_init_magn, mng_free_magn, mng_read_magn, mng_write_magn, mng_assign_magn, 0, 0}, +#endif + {MNG_UINT_MEND, mng_init_mend, mng_free_mend, mng_read_mend, mng_write_mend, mng_assign_mend, 0, 0}, + {MNG_UINT_MHDR, mng_init_mhdr, mng_free_mhdr, mng_read_mhdr, mng_write_mhdr, mng_assign_mhdr, 0, 0}, +#ifndef MNG_SKIPCHUNK_MOVE + {MNG_UINT_MOVE, mng_init_move, mng_free_move, mng_read_move, mng_write_move, mng_assign_move, 0, 0}, +#endif +#ifndef MNG_NO_DELTA_PNG +#ifndef MNG_SKIPCHUNK_ORDR + {MNG_UINT_ORDR, mng_init_ordr, mng_free_ordr, mng_read_ordr, mng_write_ordr, mng_assign_ordr, 0, 0}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_PAST + {MNG_UINT_PAST, mng_init_past, mng_free_past, mng_read_past, mng_write_past, mng_assign_past, 0, 0}, +#endif + {MNG_UINT_PLTE, mng_init_plte, mng_free_plte, mng_read_plte, mng_write_plte, mng_assign_plte, 0, 0}, +#ifndef MNG_NO_DELTA_PNG + {MNG_UINT_PPLT, mng_init_pplt, mng_free_pplt, mng_read_pplt, mng_write_pplt, mng_assign_pplt, 0, 0}, + {MNG_UINT_PROM, mng_init_prom, mng_free_prom, mng_read_prom, mng_write_prom, mng_assign_prom, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_SAVE + {MNG_UINT_SAVE, mng_init_save, mng_free_save, mng_read_save, mng_write_save, mng_assign_save, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_SEEK + {MNG_UINT_SEEK, mng_init_seek, mng_free_seek, mng_read_seek, mng_write_seek, mng_assign_seek, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_SHOW + {MNG_UINT_SHOW, mng_init_show, mng_free_show, mng_read_show, mng_write_show, mng_assign_show, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_TERM + {MNG_UINT_TERM, mng_init_term, mng_free_term, mng_read_term, mng_write_term, mng_assign_term, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_bKGD + {MNG_UINT_bKGD, mng_init_bkgd, mng_free_bkgd, mng_read_bkgd, mng_write_bkgd, mng_assign_bkgd, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_cHRM + {MNG_UINT_cHRM, mng_init_chrm, mng_free_chrm, mng_read_chrm, mng_write_chrm, mng_assign_chrm, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_eXPI + {MNG_UINT_eXPI, mng_init_expi, mng_free_expi, mng_read_expi, mng_write_expi, mng_assign_expi, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_evNT + {MNG_UINT_evNT, mng_init_evnt, mng_free_evnt, mng_read_evnt, mng_write_evnt, mng_assign_evnt, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_fPRI + {MNG_UINT_fPRI, mng_init_fpri, mng_free_fpri, mng_read_fpri, mng_write_fpri, mng_assign_fpri, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_gAMA + {MNG_UINT_gAMA, mng_init_gama, mng_free_gama, mng_read_gama, mng_write_gama, mng_assign_gama, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_hIST + {MNG_UINT_hIST, mng_init_hist, mng_free_hist, mng_read_hist, mng_write_hist, mng_assign_hist, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_iCCP + {MNG_UINT_iCCP, mng_init_iccp, mng_free_iccp, mng_read_iccp, mng_write_iccp, mng_assign_iccp, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_iTXt + {MNG_UINT_iTXt, mng_init_itxt, mng_free_itxt, mng_read_itxt, mng_write_itxt, mng_assign_itxt, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_nEED + {MNG_UINT_nEED, mng_init_need, mng_free_need, mng_read_need, mng_write_need, mng_assign_need, 0, 0}, +#endif +/* TODO: {MNG_UINT_oFFs, 0, 0, 0, 0, 0, 0}, */ +/* TODO: {MNG_UINT_pCAL, 0, 0, 0, 0, 0, 0}, */ +#ifndef MNG_SKIPCHUNK_pHYg + {MNG_UINT_pHYg, mng_init_phyg, mng_free_phyg, mng_read_phyg, mng_write_phyg, mng_assign_phyg, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_pHYs + {MNG_UINT_pHYs, mng_init_phys, mng_free_phys, mng_read_phys, mng_write_phys, mng_assign_phys, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_sBIT + {MNG_UINT_sBIT, mng_init_sbit, mng_free_sbit, mng_read_sbit, mng_write_sbit, mng_assign_sbit, 0, 0}, +#endif +/* TODO: {MNG_UINT_sCAL, 0, 0, 0, 0, 0, 0}, */ +#ifndef MNG_SKIPCHUNK_sPLT + {MNG_UINT_sPLT, mng_init_splt, mng_free_splt, mng_read_splt, mng_write_splt, mng_assign_splt, 0, 0}, +#endif + {MNG_UINT_sRGB, mng_init_srgb, mng_free_srgb, mng_read_srgb, mng_write_srgb, mng_assign_srgb, 0, 0}, +#ifndef MNG_SKIPCHUNK_tEXt + {MNG_UINT_tEXt, mng_init_text, mng_free_text, mng_read_text, mng_write_text, mng_assign_text, 0, 0}, +#endif +#ifndef MNG_SKIPCHUNK_tIME + {MNG_UINT_tIME, mng_init_time, mng_free_time, mng_read_time, mng_write_time, mng_assign_time, 0, 0}, +#endif + {MNG_UINT_tRNS, mng_init_trns, mng_free_trns, mng_read_trns, mng_write_trns, mng_assign_trns, 0, 0}, +#ifndef MNG_SKIPCHUNK_zTXt + {MNG_UINT_zTXt, mng_init_ztxt, mng_free_ztxt, mng_read_ztxt, mng_write_ztxt, mng_assign_ztxt, 0, 0}, +#endif + }; + +#endif /* MNG_OPTIMIZE_CHUNKINITFREE */ + + /* binary search variables */ + mng_int32 iTop, iLower, iUpper, iMiddle; + mng_chunk_headerp pEntry; /* pointer to found entry */ +#else + mng_chunk_header sEntry; /* temp chunk-header */ +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + + mng_chunkid iChunkname; /* the chunk's tag */ + mng_chunkp pChunk; /* chunk structure (if #define MNG_STORE_CHUNKS) */ + mng_retcode iRetcode; /* temporary error-code */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RAW_CHUNK, MNG_LC_START); +#endif + /* reset timer indicator on read-cycle */ + if ((pData->bReading) && (!pData->bDisplaying)) + pData->bTimerset = MNG_FALSE; + /* get the chunkname */ + iChunkname = (mng_chunkid)(mng_get_uint32 (pBuf)); + + pBuf += sizeof (mng_chunkid); /* adjust the buffer */ + iBuflen -= sizeof (mng_chunkid); + pChunk = 0; + +#ifndef MNG_OPTIMIZE_CHUNKREADER + /* determine max index of table */ + iTop = (sizeof (mng_chunk_table) / sizeof (mng_chunk_table [0])) - 1; + + /* binary search; with 54 chunks, worst-case is 7 comparisons */ + iLower = 0; +#ifndef MNG_NO_DELTA_PNG + iMiddle = 11; /* start with the IDAT entry */ +#else + iMiddle = 8; +#endif + iUpper = iTop; + pEntry = 0; /* no goods yet! */ + + do /* the binary search itself */ + { + if (mng_chunk_table [iMiddle].iChunkname < iChunkname) + iLower = iMiddle + 1; + else if (mng_chunk_table [iMiddle].iChunkname > iChunkname) + iUpper = iMiddle - 1; + else + { + pEntry = &mng_chunk_table [iMiddle]; + break; + } + + iMiddle = (iLower + iUpper) >> 1; + } + while (iLower <= iUpper); + + if (!pEntry) /* unknown chunk ? */ + pEntry = &mng_chunk_unknown; /* make it so! */ + +#else /* MNG_OPTIMIZE_CHUNKREADER */ + + mng_get_chunkheader (iChunkname, &sEntry); + +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + + pData->iChunkname = iChunkname; /* keep track of where we are */ + pData->iChunkseq++; + +#ifndef MNG_OPTIMIZE_CHUNKREADER + if (pEntry->fRead) /* read-callback available ? */ + { + iRetcode = pEntry->fRead (pData, pEntry, iBuflen, (mng_ptr)pBuf, &pChunk); + + if (!iRetcode) /* everything oke ? */ + { /* remember unknown chunk's id */ + if ((pChunk) && (pEntry->iChunkname == MNG_UINT_HUH)) + ((mng_chunk_headerp)pChunk)->iChunkname = iChunkname; + } + } +#else /* MNG_OPTIMIZE_CHUNKREADER */ + if (sEntry.fRead) /* read-callback available ? */ + { + iRetcode = sEntry.fRead (pData, &sEntry, iBuflen, (mng_ptr)pBuf, &pChunk); + +#ifndef MNG_OPTIMIZE_CHUNKREADER + if (!iRetcode) /* everything oke ? */ + { /* remember unknown chunk's id */ + if ((pChunk) && (sEntry.iChunkname == MNG_UINT_HUH)) + ((mng_chunk_headerp)pChunk)->iChunkname = iChunkname; + } +#endif + } +#endif /* MNG_OPTIMIZE_CHUNKREADER */ + else + iRetcode = MNG_NOERROR; + + if (pChunk) /* store this chunk ? */ + mng_add_chunk (pData, pChunk); /* do it */ + +#ifdef MNG_INCLUDE_JNG /* implicit EOF ? */ + if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && (!pData->bHasJHDR)) +#else + if ((!pData->bHasMHDR) && (!pData->bHasIHDR)) +#endif + iRetcode = mng_process_eof (pData);/* then do some EOF processing */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_PROCESS_RAW_CHUNK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode check_chunk_crc (mng_datap pData, + mng_uint8p pBuf, + mng_uint32 iBuflen) +{ + mng_uint32 iCrc; /* calculated CRC */ + mng_bool bDiscard = MNG_FALSE; + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CHUNK_CRC, MNG_LC_START); +#endif + + if (pData->iCrcmode & MNG_CRC_INPUT) /* crc included ? */ + { + mng_bool bCritical = (mng_bool)((*pBuf & 0x20) == 0); + mng_uint32 iL = iBuflen - (mng_uint32)(sizeof (iCrc)); + + if (((bCritical ) && (pData->iCrcmode & MNG_CRC_CRITICAL )) || + ((!bCritical) && (pData->iCrcmode & MNG_CRC_ANCILLARY))) + { /* calculate the crc */ + iCrc = mng_crc (pData, pBuf, iL); + /* and check it */ + if (!(iCrc == mng_get_uint32 (pBuf + iL))) + { + mng_bool bWarning = MNG_FALSE; + mng_bool bError = MNG_FALSE; + + if (bCritical) + { + switch (pData->iCrcmode & MNG_CRC_CRITICAL) + { + case MNG_CRC_CRITICAL_WARNING : { bWarning = MNG_TRUE; break; } + case MNG_CRC_CRITICAL_ERROR : { bError = MNG_TRUE; break; } + } + } + else + { + switch (pData->iCrcmode & MNG_CRC_ANCILLARY) + { + case MNG_CRC_ANCILLARY_DISCARD : { bDiscard = MNG_TRUE; break; } + case MNG_CRC_ANCILLARY_WARNING : { bWarning = MNG_TRUE; break; } + case MNG_CRC_ANCILLARY_ERROR : { bError = MNG_TRUE; break; } + } + } + + if (bWarning) + MNG_WARNING (pData, MNG_INVALIDCRC); + if (bError) + MNG_ERROR (pData, MNG_INVALIDCRC); + } + } + + if (!bDiscard) /* still processing ? */ + iRetcode = process_raw_chunk (pData, pBuf, iL); + } + else + { /* no crc => straight onto processing */ + iRetcode = process_raw_chunk (pData, pBuf, iBuflen); + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CHUNK_CRC, MNG_LC_END); +#endif + + return iRetcode; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode read_chunk (mng_datap pData) +{ + mng_uint32 iBufmax = pData->iReadbufsize; + mng_uint8p pBuf = pData->pReadbuf; + mng_uint32 iBuflen = 0; /* number of bytes requested */ + mng_uint32 iRead = 0; /* number of bytes read */ + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CHUNK, MNG_LC_START); +#endif + +#ifdef MNG_SUPPORT_DISPLAY + if (pData->pCurraniobj) /* processing an animation object ? */ + { + do /* process it then */ + { + iRetcode = ((mng_object_headerp)pData->pCurraniobj)->fProcess (pData, pData->pCurraniobj); + /* refresh needed ? */ +/* if ((!iRetcode) && (!pData->bTimerset) && (pData->bNeedrefresh)) + iRetcode = display_progressive_refresh (pData, 1); */ + /* can we advance to next object ? */ + if ((!iRetcode) && (pData->pCurraniobj) && + (!pData->bTimerset) && (!pData->bSectionwait)) + { /* reset timer indicator on read-cycle */ + if ((pData->bReading) && (!pData->bDisplaying)) + pData->bTimerset = MNG_FALSE; + + pData->pCurraniobj = ((mng_object_headerp)pData->pCurraniobj)->pNext; + /* TERM processing to be done ? */ + if ((!pData->pCurraniobj) && (pData->bHasTERM) && (!pData->bHasMHDR)) + iRetcode = mng_process_display_mend (pData); + } + } /* until error or a break or no more objects */ + while ((!iRetcode) && (pData->pCurraniobj) && + (!pData->bTimerset) && (!pData->bSectionwait) && (!pData->bFreezing)); + } + else + { + if (pData->iBreakpoint) /* do we need to finish something first ? */ + { + switch (pData->iBreakpoint) /* return to broken display routine */ + { +#ifndef MNG_SKIPCHUNK_FRAM + case 1 : { iRetcode = mng_process_display_fram2 (pData); break; } +#endif + case 2 : { iRetcode = mng_process_display_ihdr (pData); break; } +#ifndef MNG_SKIPCHUNK_SHOW + case 3 : ; /* same as 4 !!! */ + case 4 : { iRetcode = mng_process_display_show (pData); break; } +#endif +#ifndef MNG_SKIPCHUNK_CLON + case 5 : { iRetcode = mng_process_display_clon2 (pData); break; } +#endif +#ifdef MNG_INCLUDE_JNG + case 7 : { iRetcode = mng_process_display_jhdr (pData); break; } +#endif + case 6 : ; /* same as 8 !!! */ + case 8 : { iRetcode = mng_process_display_iend (pData); break; } +#ifndef MNG_SKIPCHUNK_MAGN + case 9 : { iRetcode = mng_process_display_magn2 (pData); break; } +#endif + case 10 : { iRetcode = mng_process_display_mend2 (pData); break; } +#ifndef MNG_SKIPCHUNK_PAST + case 11 : { iRetcode = mng_process_display_past2 (pData); break; } +#endif + } + } + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#endif /* MNG_SUPPORT_DISPLAY */ + /* can we continue processing now, or do we */ + /* need to wait for the timer to finish (again) ? */ +#ifdef MNG_SUPPORT_DISPLAY + if ((!pData->bTimerset) && (!pData->bSectionwait) && (!pData->bEOF)) +#else + if (!pData->bEOF) +#endif + { +#ifdef MNG_SUPPORT_DISPLAY + /* freezing in progress ? */ + if ((pData->bFreezing) && (pData->iSuspendpoint == 0)) + pData->bRunning = MNG_FALSE; /* then this is the right moment to do it */ +#endif + + if (pData->iSuspendpoint <= 2) + { + iBuflen = sizeof (mng_uint32); /* read length */ + iRetcode = read_databuffer (pData, pBuf, &pData->pReadbufnext, iBuflen, &iRead); + + if (iRetcode) /* bail on errors */ + return iRetcode; + + if (pData->bSuspended) /* suspended ? */ + pData->iSuspendpoint = 2; + else /* save the length */ + { + pData->iChunklen = mng_get_uint32 (pBuf); + if (pData->iChunklen > 0x7ffffff) + return MNG_INVALIDLENGTH; + } + + } + + if (!pData->bSuspended) /* still going ? */ + { /* previously suspended or not eof ? */ + if ((pData->iSuspendpoint > 2) || (iRead == iBuflen)) + { /* determine length chunkname + data (+ crc) */ + if (pData->iCrcmode & MNG_CRC_INPUT) + iBuflen = pData->iChunklen + (mng_uint32)(sizeof (mng_chunkid) + sizeof (mng_uint32)); + else + iBuflen = pData->iChunklen + (mng_uint32)(sizeof (mng_chunkid)); + + /* do we have enough data in the current push buffer ? */ + if ((pData->pFirstpushdata) && (iBuflen <= pData->pFirstpushdata->iRemaining)) + { + mng_pushdatap pPush = pData->pFirstpushdata; + pBuf = pPush->pDatanext; + pPush->pDatanext += iBuflen; + pPush->iRemaining -= iBuflen; + pData->iSuspendpoint = 0; /* safely reset this here ! */ + + iRetcode = check_chunk_crc (pData, pBuf, iBuflen); + if (iRetcode) + return iRetcode; + + if (!pPush->iRemaining) /* buffer depleted? then release it */ + iRetcode = mng_release_pushdata (pData); + } + else + { + if (iBuflen < iBufmax) /* does it fit in default buffer ? */ + { /* note that we don't use the full size + so there's always a zero-byte at the + very end !!! */ + iRetcode = read_databuffer (pData, pBuf, &pData->pReadbufnext, iBuflen, &iRead); + if (iRetcode) /* bail on errors */ + return iRetcode; + + if (pData->bSuspended) /* suspended ? */ + pData->iSuspendpoint = 3; + else + { + if (iRead != iBuflen) /* did we get all the data ? */ + MNG_ERROR (pData, MNG_UNEXPECTEDEOF); + iRetcode = check_chunk_crc (pData, pBuf, iBuflen); + } + } + else + { + if (iBuflen > 16777216) /* is the length incredible? */ + MNG_ERROR (pData, MNG_IMPROBABLELENGTH); + + if (!pData->iSuspendpoint) /* create additional large buffer ? */ + { /* again reserve space for the last zero-byte */ + pData->iLargebufsize = iBuflen + 1; + pData->pLargebufnext = MNG_NULL; + MNG_ALLOC (pData, pData->pLargebuf, pData->iLargebufsize); + } + + iRetcode = read_databuffer (pData, pData->pLargebuf, &pData->pLargebufnext, iBuflen, &iRead); + if (iRetcode) + return iRetcode; + + if (pData->bSuspended) /* suspended ? */ + pData->iSuspendpoint = 4; + else + { + if (iRead != iBuflen) /* did we get all the data ? */ + MNG_ERROR (pData, MNG_UNEXPECTEDEOF); + iRetcode = check_chunk_crc (pData, pData->pLargebuf, iBuflen); + /* cleanup additional large buffer */ + MNG_FREE (pData, pData->pLargebuf, pData->iLargebufsize); + } + } + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + + } + else + { /* that's final */ + iRetcode = mng_process_eof (pData); + + if (iRetcode) /* on error bail out */ + return iRetcode; + + if ((iRead != 0) || /* did we get an unexpected eof ? */ +#ifdef MNG_INCLUDE_JNG + (pData->bHasIHDR || pData->bHasMHDR || pData->bHasJHDR)) +#else + (pData->bHasIHDR || pData->bHasMHDR)) +#endif + MNG_ERROR (pData, MNG_UNEXPECTEDEOF); + } + } + } + +#ifdef MNG_SUPPORT_DISPLAY /* refresh needed ? */ + if ((!pData->bTimerset) && (!pData->bSuspended) && (pData->bNeedrefresh)) + { + iRetcode = mng_display_progressive_refresh (pData, 1); + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_CHUNK, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +MNG_LOCAL mng_retcode process_pushedchunk (mng_datap pData) +{ + mng_pushdatap pPush; + mng_retcode iRetcode = MNG_NOERROR; + +#ifdef MNG_SUPPORT_DISPLAY + if (pData->pCurraniobj) /* processing an animation object ? */ + { + do /* process it then */ + { + iRetcode = ((mng_object_headerp)pData->pCurraniobj)->fProcess (pData, pData->pCurraniobj); + /* refresh needed ? */ +/* if ((!iRetcode) && (!pData->bTimerset) && (pData->bNeedrefresh)) + iRetcode = display_progressive_refresh (pData, 1); */ + /* can we advance to next object ? */ + if ((!iRetcode) && (pData->pCurraniobj) && + (!pData->bTimerset) && (!pData->bSectionwait)) + { /* reset timer indicator on read-cycle */ + if ((pData->bReading) && (!pData->bDisplaying)) + pData->bTimerset = MNG_FALSE; + + pData->pCurraniobj = ((mng_object_headerp)pData->pCurraniobj)->pNext; + /* TERM processing to be done ? */ + if ((!pData->pCurraniobj) && (pData->bHasTERM) && (!pData->bHasMHDR)) + iRetcode = mng_process_display_mend (pData); + } + } /* until error or a break or no more objects */ + while ((!iRetcode) && (pData->pCurraniobj) && + (!pData->bTimerset) && (!pData->bSectionwait) && (!pData->bFreezing)); + } + else + { + if (pData->iBreakpoint) /* do we need to finish something first ? */ + { + switch (pData->iBreakpoint) /* return to broken display routine */ + { +#ifndef MNG_SKIPCHUNK_FRAM + case 1 : { iRetcode = mng_process_display_fram2 (pData); break; } +#endif + case 2 : { iRetcode = mng_process_display_ihdr (pData); break; } +#ifndef MNG_SKIPCHUNK_SHOW + case 3 : ; /* same as 4 !!! */ + case 4 : { iRetcode = mng_process_display_show (pData); break; } +#endif +#ifndef MNG_SKIPCHUNK_CLON + case 5 : { iRetcode = mng_process_display_clon2 (pData); break; } +#endif +#ifdef MNG_INCLUDE_JNG + case 7 : { iRetcode = mng_process_display_jhdr (pData); break; } +#endif + case 6 : ; /* same as 8 !!! */ + case 8 : { iRetcode = mng_process_display_iend (pData); break; } +#ifndef MNG_SKIPCHUNK_MAGN + case 9 : { iRetcode = mng_process_display_magn2 (pData); break; } +#endif + case 10 : { iRetcode = mng_process_display_mend2 (pData); break; } +#ifndef MNG_SKIPCHUNK_PAST + case 11 : { iRetcode = mng_process_display_past2 (pData); break; } +#endif + } + } + } + + if (iRetcode) /* on error bail out */ + return iRetcode; + +#endif /* MNG_SUPPORT_DISPLAY */ + /* can we continue processing now, or do we */ + /* need to wait for the timer to finish (again) ? */ +#ifdef MNG_SUPPORT_DISPLAY + if ((!pData->bTimerset) && (!pData->bSectionwait) && (!pData->bEOF)) +#else + if (!pData->bEOF) +#endif + { + pData->iSuspendpoint = 0; /* safely reset it here ! */ + pPush = pData->pFirstpushchunk; + + iRetcode = process_raw_chunk (pData, pPush->pData, pPush->iLength); + if (iRetcode) + return iRetcode; + +#ifdef MNG_SUPPORT_DISPLAY /* refresh needed ? */ + if ((!pData->bTimerset) && (!pData->bSuspended) && (pData->bNeedrefresh)) + { + iRetcode = mng_display_progressive_refresh (pData, 1); + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#endif + } + + return mng_release_pushchunk (pData); +} + +/* ************************************************************************** */ + +mng_retcode mng_read_graphic (mng_datap pData) +{ + mng_uint32 iBuflen; /* number of bytes requested */ + mng_uint32 iRead; /* number of bytes read */ + mng_retcode iRetcode; /* temporary error-code */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_GRAPHIC, MNG_LC_START); +#endif + + if (!pData->pReadbuf) /* buffer allocated ? */ + { + pData->iReadbufsize = 4200; /* allocate a default read buffer */ + MNG_ALLOC (pData, pData->pReadbuf, pData->iReadbufsize); + } + /* haven't processed the signature ? */ + if ((!pData->bHavesig) || (pData->iSuspendpoint == 1)) + { + iBuflen = 2 * sizeof (mng_uint32); /* read signature */ + + iRetcode = read_databuffer (pData, pData->pReadbuf, &pData->pReadbufnext, iBuflen, &iRead); + + if (iRetcode) + return iRetcode; + + if (pData->bSuspended) /* input suspension ? */ + pData->iSuspendpoint = 1; + else + { + if (iRead != iBuflen) /* full signature received ? */ + MNG_ERROR (pData, MNG_UNEXPECTEDEOF); + /* is it a valid signature ? */ + if (mng_get_uint32 (pData->pReadbuf) == PNG_SIG) + pData->eSigtype = mng_it_png; + else +#ifdef MNG_INCLUDE_JNG + if (mng_get_uint32 (pData->pReadbuf) == JNG_SIG) + pData->eSigtype = mng_it_jng; + else +#endif + if (mng_get_uint32 (pData->pReadbuf) == MNG_SIG) + pData->eSigtype = mng_it_mng; + else + MNG_ERROR (pData, MNG_INVALIDSIG); + /* all of it ? */ + if (mng_get_uint32 (pData->pReadbuf+4) != POST_SIG) + MNG_ERROR (pData, MNG_INVALIDSIG); + + pData->bHavesig = MNG_TRUE; + } + } + + if (!pData->bSuspended) /* still going ? */ + { + do + { /* reset timer during mng_read() ? */ + if ((pData->bReading) && (!pData->bDisplaying)) + pData->bTimerset = MNG_FALSE; + + if (pData->pFirstpushchunk) /* chunks pushed ? */ + iRetcode = process_pushedchunk (pData); /* process the pushed chunk */ + else + iRetcode = read_chunk (pData); /* read & process a chunk */ + + if (iRetcode) /* on error bail out */ + return iRetcode; + } +#ifdef MNG_SUPPORT_DISPLAY /* until EOF or a break-request */ + while (((!pData->bEOF) || (pData->pCurraniobj)) && + (!pData->bSuspended) && (!pData->bSectionwait) && + ((!pData->bTimerset) || ((pData->bReading) && (!pData->bDisplaying)))); +#else + while ((!pData->bEOF) && (!pData->bSuspended)); +#endif + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_READ_GRAPHIC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_READ_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_read.h b/src/3rdparty/libmng/libmng_read.h new file mode 100644 index 0000000000..119cc3e60e --- /dev/null +++ b/src/3rdparty/libmng/libmng_read.h @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_read.h copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.8 * */ +/* * * */ +/* * purpose : Read management (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the read management routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 10/18/2000 - G.Juyn * */ +/* * - added closestream() processing for mng_cleanup() * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * * */ +/* * 1.0.8 - 04/12/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_read_h_ +#define _libmng_read_h_ + +/* ************************************************************************** */ + +mng_retcode mng_process_eof (mng_datap pData); + +mng_retcode mng_release_pushdata (mng_datap pData); + +mng_retcode mng_release_pushchunk (mng_datap pData); + +mng_retcode mng_read_graphic (mng_datap pData); + +/* ************************************************************************** */ + +#endif /* _libmng_read_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_trace.c b/src/3rdparty/libmng/libmng_trace.c new file mode 100644 index 0000000000..a6a2cab2b6 --- /dev/null +++ b/src/3rdparty/libmng/libmng_trace.c @@ -0,0 +1,1683 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_trace.c copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Trace functions (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the trace functions * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - added callback error-reporting support * */ +/* * * */ +/* * 0.5.2 - 05/23/2000 - G.Juyn * */ +/* * - added trace telltale reporting * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added tracestrings for global animation color-chunks * */ +/* * - added tracestrings for get/set of default ZLIB/IJG parms * */ +/* * - added tracestrings for global PLTE,tRNS,bKGD * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added tracestrings for image-object promotion * */ +/* * - added tracestrings for delta-image processing * */ +/* * 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - added tracestrings for getalphaline callback * */ +/* * 0.5.2 - 06/05/2000 - G.Juyn * */ +/* * - added tracestring for RGB8_A8 canvasstyle * */ +/* * 0.5.2 - 06/06/2000 - G.Juyn * */ +/* * - added tracestring for mng_read_resume HLAPI function * */ +/* * * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added tracestrings for get/set speedtype * */ +/* * - added tracestring for get imagelevel * */ +/* * 0.5.3 - 06/22/2000 - G.Juyn * */ +/* * - added tracestring for delta-image processing * */ +/* * - added tracestrings for PPLT chunk processing * */ +/* * * */ +/* * 0.9.1 - 07/07/2000 - G.Juyn * */ +/* * - added tracecodes for special display processing * */ +/* * 0.9.1 - 07/08/2000 - G.Juyn * */ +/* * - added tracestring for get/set suspensionmode * */ +/* * - added tracestrings for get/set display variables * */ +/* * - added tracecode for read_databuffer (I/O-suspension) * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added tracestrings for SAVE/SEEK callbacks * */ +/* * - added tracestrings for get/set sectionbreaks * */ +/* * - added tracestring for special error routine * */ +/* * 0.9.1 - 07/19/2000 - G.Juyn * */ +/* * - added tracestring for updatemngheader * */ +/* * * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - added tracestrings for status_xxxxx functions * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * - added tracestring for updatemngsimplicity * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * 0.9.3 - 10/10/2000 - G.Juyn * */ +/* * - added support for alpha-depth prediction * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - added JDAA chunk * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added functions to retrieve PNG/JNG specific header-info * */ +/* * - added optional support for bKGD for PNG images * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added callback to process non-critical unknown chunks * */ +/* * - added routine to discard "invalid" objects * */ +/* * 0.9.3 - 10/19/2000 - G.Juyn * */ +/* * - implemented delayed delta-processing * */ +/* * 0.9.3 - 10/20/2000 - G.Juyn * */ +/* * - added get/set for bKGD preference setting * */ +/* * 0.9.3 - 10/21/2000 - G.Juyn * */ +/* * - added get function for interlace/progressive display * */ +/* * * */ +/* * 0.9.4 - 1/18/2001 - G.Juyn * */ +/* * - added "new" MAGN methods 3, 4 & 5 * */ +/* * * */ +/* * 1.0.1 - 02/08/2001 - G.Juyn * */ +/* * - added MEND processing callback * */ +/* * 1.0.1 - 04/21/2001 - G.Juyn (code by G.Kelly) * */ +/* * - added BGRA8 canvas with premultiplied alpha * */ +/* * 1.0.1 - 05/02/2001 - G.Juyn * */ +/* * - added "default" sRGB generation (Thanks Marti!) * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added optimization option for MNG-video playback * */ +/* * - added processterm callback * */ +/* * 1.0.2 - 06/25/2001 - G.Juyn * */ +/* * - added option to turn off progressive refresh * */ +/* * * */ +/* * 1.0.3 - 08/06/2001 - G.Juyn * */ +/* * - added get function for last processed BACK chunk * */ +/* * * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * - completed delta-image support * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * - added HLAPI function to copy chunks * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 09/22/2002 - G.Juyn * */ +/* * - added bgrx8 canvas (filler byte) * */ +/* * 1.0.5 - 09/23/2002 - G.Juyn * */ +/* * - added in-memory color-correction of abstract images * */ +/* * - added compose over/under routines for PAST processing * */ +/* * - added flip & tile routines for PAST processing * */ +/* * 1.0.5 - 10/09/2002 - G.Juyn * */ +/* * - fixed trace-constants for PAST chunk * */ +/* * 1.0.5 - 11/07/2002 - G.Juyn * */ +/* * - added support to get totals after mng_read() * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added conditionals around JNG and Delta-PNG code * */ +/* * 1.0.6 - 07/14/2003 - G.R-P * */ +/* * - added conditionals around various unused functions * */ +/* * 1.0.6 - 07/29/2003 - G.R-P * */ +/* * - added conditionals around PAST chunk support * */ +/* * * */ +/* * 1.0.7 - 11/27/2003 - R.A * */ +/* * - added CANVAS_RGB565 and CANVAS_BGR565 * */ +/* * 1.0.7 - 01/25/2004 - J.S * */ +/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */ +/* * 1.0.7 - 03/07/2004 - G. Randers-Pehrson * */ +/* * - put gamma, cms-related declarations inside #ifdef * */ +/* * 1.0.7 - 03/10/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * * */ +/* * 1.0.8 - 04/02/2004 - G.Juyn * */ +/* * - added CRC existence & checking flags * */ +/* * 1.0.8 - 04/11/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * * */ +/* * 1.0.9 - 10/03/2004 - G.Juyn * */ +/* * - added function to retrieve current FRAM delay * */ +/* * 1.0.9 - 10/14/2004 - G.Juyn * */ +/* * - added bgr565_a8 canvas-style (thanks to J. Elvander) * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 07/06/2007 - G.R-P bugfix by Lucas Quintana * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_TRACE_PROCS + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_TRACE_STRINGS +MNG_LOCAL mng_trace_entry const trace_table [] = + { + {MNG_FN_INITIALIZE, "initialize"}, + {MNG_FN_RESET, "reset"}, + {MNG_FN_CLEANUP, "cleanup"}, + {MNG_FN_READ, "read"}, + {MNG_FN_WRITE, "write"}, + {MNG_FN_CREATE, "create"}, + {MNG_FN_READDISPLAY, "readdisplay"}, + {MNG_FN_DISPLAY, "display"}, + {MNG_FN_DISPLAY_RESUME, "display_resume"}, + {MNG_FN_DISPLAY_FREEZE, "display_freeze"}, + {MNG_FN_DISPLAY_RESET, "display_reset"}, +#ifndef MNG_NO_DISPLAY_GO_SUPPORTED + {MNG_FN_DISPLAY_GOFRAME, "display_goframe"}, + {MNG_FN_DISPLAY_GOLAYER, "display_golayer"}, + {MNG_FN_DISPLAY_GOTIME, "display_gotime"}, +#endif + {MNG_FN_GETLASTERROR, "getlasterror"}, + {MNG_FN_READ_RESUME, "read_resume"}, + {MNG_FN_TRAPEVENT, "trapevent"}, + {MNG_FN_READ_PUSHDATA, "read_pushdata"}, + {MNG_FN_READ_PUSHSIG, "read_pushsig"}, + {MNG_FN_READ_PUSHCHUNK, "read_pushchunk"}, + + {MNG_FN_SETCB_MEMALLOC, "setcb_memalloc"}, + {MNG_FN_SETCB_MEMFREE, "setcb_memfree"}, + {MNG_FN_SETCB_READDATA, "setcb_readdata"}, + {MNG_FN_SETCB_WRITEDATA, "setcb_writedata"}, + {MNG_FN_SETCB_ERRORPROC, "setcb_errorproc"}, + {MNG_FN_SETCB_TRACEPROC, "setcb_traceproc"}, + {MNG_FN_SETCB_PROCESSHEADER, "setcb_processheader"}, + {MNG_FN_SETCB_PROCESSTEXT, "setcb_processtext"}, + {MNG_FN_SETCB_GETCANVASLINE, "setcb_getcanvasline"}, + {MNG_FN_SETCB_GETBKGDLINE, "setcb_getbkgdline"}, + {MNG_FN_SETCB_REFRESH, "setcb_refresh"}, + {MNG_FN_SETCB_GETTICKCOUNT, "setcb_gettickcount"}, + {MNG_FN_SETCB_SETTIMER, "setcb_settimer"}, + {MNG_FN_SETCB_PROCESSGAMMA, "setcb_processgamma"}, + {MNG_FN_SETCB_PROCESSCHROMA, "setcb_processchroma"}, + {MNG_FN_SETCB_PROCESSSRGB, "setcb_processsrgb"}, + {MNG_FN_SETCB_PROCESSICCP, "setcb_processiccp"}, + {MNG_FN_SETCB_PROCESSAROW, "setcb_processarow"}, +#ifndef MNG_NO_OPEN_CLOSE_STREAM + {MNG_FN_SETCB_OPENSTREAM, "setcb_openstream"}, + {MNG_FN_SETCB_CLOSESTREAM, "setcb_closestream"}, +#endif + {MNG_FN_SETCB_GETALPHALINE, "setcb_getalphaline"}, + {MNG_FN_SETCB_PROCESSSAVE, "setcb_processsave"}, + {MNG_FN_SETCB_PROCESSSEEK, "setcb_processseek"}, + {MNG_FN_SETCB_PROCESSNEED, "setcb_processneed"}, + {MNG_FN_SETCB_PROCESSUNKNOWN, "setcb_processunknown"}, + {MNG_FN_SETCB_PROCESSMEND, "setcb_processmend"}, + {MNG_FN_SETCB_PROCESSTERM, "setcb_processterm"}, + {MNG_FN_SETCB_RELEASEDATA, "setcb_releasedata"}, + + {MNG_FN_GETCB_MEMALLOC, "getcb_memalloc"}, + {MNG_FN_GETCB_MEMFREE, "getcb_memfree"}, + {MNG_FN_GETCB_READDATA, "getcb_readdata,"}, + {MNG_FN_GETCB_WRITEDATA, "getcb_writedata"}, + {MNG_FN_GETCB_ERRORPROC, "getcb_errorproc"}, + {MNG_FN_GETCB_TRACEPROC, "getcb_traceproc"}, + {MNG_FN_GETCB_PROCESSHEADER, "getcb_processheader"}, + {MNG_FN_GETCB_PROCESSTEXT, "getcb_processtext"}, + {MNG_FN_GETCB_GETCANVASLINE, "getcb_getcanvasline"}, + {MNG_FN_GETCB_GETBKGDLINE, "getcb_getbkgdline"}, + {MNG_FN_GETCB_REFRESH, "getcb_refresh"}, + {MNG_FN_GETCB_GETTICKCOUNT, "getcb_gettickcount"}, + {MNG_FN_GETCB_SETTIMER, "getcb_settimer"}, + {MNG_FN_GETCB_PROCESSGAMMA, "getcb_processgamma"}, + {MNG_FN_GETCB_PROCESSCHROMA, "getcb_processchroma"}, + {MNG_FN_GETCB_PROCESSSRGB, "getcb_processsrgb"}, + {MNG_FN_GETCB_PROCESSICCP, "getcb_processiccp"}, + {MNG_FN_GETCB_PROCESSAROW, "getcb_processarow"}, +#ifndef MNG_NO_OPEN_CLOSE_STREAM + {MNG_FN_GETCB_OPENSTREAM, "getcb_openstream"}, + {MNG_FN_GETCB_CLOSESTREAM, "getcb_closestream"}, +#endif + {MNG_FN_GETCB_GETALPHALINE, "getcb_getalphaline"}, + {MNG_FN_GETCB_PROCESSSAVE, "getcb_processsave"}, + {MNG_FN_GETCB_PROCESSSEEK, "getcb_processseek"}, + {MNG_FN_GETCB_PROCESSNEED, "getcb_processneed"}, + {MNG_FN_GETCB_PROCESSUNKNOWN, "getcb_processunknown"}, + {MNG_FN_GETCB_PROCESSMEND, "getcb_processmend"}, + {MNG_FN_GETCB_PROCESSTERM, "getcb_processterm"}, + {MNG_FN_GETCB_RELEASEDATA, "getcb_releasedata"}, + + {MNG_FN_SET_USERDATA, "set_userdata"}, + {MNG_FN_SET_CANVASSTYLE, "set_canvasstyle"}, + {MNG_FN_SET_BKGDSTYLE, "set_bkgdstyle"}, + {MNG_FN_SET_BGCOLOR, "set_bgcolor"}, + {MNG_FN_SET_STORECHUNKS, "set_storechunks"}, +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) + {MNG_FN_SET_VIEWGAMMA, "set_viewgamma"}, +#ifndef MNG_NO_DFLT_INFO + {MNG_FN_SET_DISPLAYGAMMA, "set_displaygamma"}, +#endif + {MNG_FN_SET_DFLTIMGGAMMA, "set_dfltimggamma"}, +#endif + {MNG_FN_SET_SRGB, "set_srgb"}, + {MNG_FN_SET_OUTPUTPROFILE, "set_outputprofile"}, + {MNG_FN_SET_SRGBPROFILE, "set_srgbprofile"}, +#ifndef MNG_SKIP_MAXCANVAS + {MNG_FN_SET_MAXCANVASWIDTH, "set_maxcanvaswidth"}, + {MNG_FN_SET_MAXCANVASHEIGHT, "set_maxcanvasheight"}, + {MNG_FN_SET_MAXCANVASSIZE, "set_maxcanvassize"}, +#endif +#ifndef MNG_NO_ACCESS_ZLIB + {MNG_FN_SET_ZLIB_LEVEL, "set_zlib_level"}, + {MNG_FN_SET_ZLIB_METHOD, "set_zlib_method"}, + {MNG_FN_SET_ZLIB_WINDOWBITS, "set_zlib_windowbits"}, + {MNG_FN_SET_ZLIB_MEMLEVEL, "set_zlib_memlevel"}, + {MNG_FN_SET_ZLIB_STRATEGY, "set_zlib_strategy"}, + {MNG_FN_SET_ZLIB_MAXIDAT, "set_zlib_maxidat"}, +#endif +#ifndef MNG_NO_ACCESS_JPEG + {MNG_FN_SET_JPEG_DCTMETHOD, "set_jpeg_dctmethod"}, + {MNG_FN_SET_JPEG_QUALITY, "set_jpeg_quality"}, + {MNG_FN_SET_JPEG_SMOOTHING, "set_jpeg_smoothing"}, + {MNG_FN_SET_JPEG_PROGRESSIVE, "set_jpeg_progressive"}, + {MNG_FN_SET_JPEG_OPTIMIZED, "set_jpeg_optimized"}, + {MNG_FN_SET_JPEG_MAXJDAT, "set_jpeg_maxjdat"}, +#endif + {MNG_FN_SET_SPEED, "set_speed"}, + {MNG_FN_SET_SUSPENSIONMODE, "set_suspensionmode"}, + {MNG_FN_SET_SECTIONBREAKS, "set_sectionbreaks"}, + {MNG_FN_SET_USEBKGD, "set_usebkgd"}, + {MNG_FN_SET_OUTPUTPROFILE2, "set_outputprofile2"}, + {MNG_FN_SET_SRGBPROFILE2, "set_srgbprofile2"}, + {MNG_FN_SET_OUTPUTSRGB, "set_outputsrgb"}, + {MNG_FN_SET_SRGBIMPLICIT, "set_srgbimplicit"}, + {MNG_FN_SET_CACHEPLAYBACK, "set_cacheplayback"}, + {MNG_FN_SET_DOPROGRESSIVE, "set_doprogressive"}, + {MNG_FN_SET_CRCMODE, "set_crcmode"}, + + {MNG_FN_GET_USERDATA, "get_userdata"}, + {MNG_FN_GET_SIGTYPE, "get_sigtype"}, + {MNG_FN_GET_IMAGETYPE, "get_imagetype"}, + {MNG_FN_GET_IMAGEWIDTH, "get_imagewidth"}, + {MNG_FN_GET_IMAGEHEIGHT, "get_imageheight"}, + {MNG_FN_GET_TICKS, "get_ticks"}, + {MNG_FN_GET_FRAMECOUNT, "get_framecount"}, + {MNG_FN_GET_LAYERCOUNT, "get_layercount"}, + {MNG_FN_GET_PLAYTIME, "get_playtime"}, + {MNG_FN_GET_SIMPLICITY, "get_simplicity"}, + {MNG_FN_GET_CANVASSTYLE, "get_canvasstyle"}, + {MNG_FN_GET_BKGDSTYLE, "get_bkgdstyle"}, + {MNG_FN_GET_BGCOLOR, "get_bgcolor"}, + {MNG_FN_GET_STORECHUNKS, "get_storechunks"}, +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) + {MNG_FN_GET_VIEWGAMMA, "get_viewgamma"}, + {MNG_FN_GET_DISPLAYGAMMA, "get_displaygamma"}, +#ifndef MNG_NO_DFLT_INFO + {MNG_FN_GET_DFLTIMGGAMMA, "get_dfltimggamma"}, +#endif +#endif + {MNG_FN_GET_SRGB, "get_srgb"}, +#ifndef MNG_SKIP_MAXCANVAS + {MNG_FN_GET_MAXCANVASWIDTH, "get_maxcanvaswidth"}, + {MNG_FN_GET_MAXCANVASHEIGHT, "get_maxcanvasheight"}, +#endif +#ifndef MNG_NO_ACCESS_ZLIB + {MNG_FN_GET_ZLIB_LEVEL, "get_zlib_level"}, + {MNG_FN_GET_ZLIB_METHOD, "get_zlib_method"}, + {MNG_FN_GET_ZLIB_WINDOWBITS, "get_zlib_windowbits"}, + {MNG_FN_GET_ZLIB_MEMLEVEL, "get_zlib_memlevel"}, + {MNG_FN_GET_ZLIB_STRATEGY, "get_zlib_strategy"}, + {MNG_FN_GET_ZLIB_MAXIDAT, "get_zlib_maxidat"}, +#endif +#ifndef MNG_NO_ACCESS_JPEG + {MNG_FN_GET_JPEG_DCTMETHOD, "get_jpeg_dctmethod"}, + {MNG_FN_GET_JPEG_QUALITY, "get_jpeg_quality"}, + {MNG_FN_GET_JPEG_SMOOTHING, "get_jpeg_smoothing"}, + {MNG_FN_GET_JPEG_PROGRESSIVE, "get_jpeg_progressive"}, + {MNG_FN_GET_JPEG_OPTIMIZED, "get_jpeg_optimized"}, + {MNG_FN_GET_JPEG_MAXJDAT, "get_jpeg_maxjdat"}, +#endif + {MNG_FN_GET_SPEED, "get_speed"}, + {MNG_FN_GET_IMAGELEVEL, "get_imagelevel"}, + {MNG_FN_GET_SUSPENSIONMODE, "get_speed"}, + {MNG_FN_GET_STARTTIME, "get_starttime"}, + {MNG_FN_GET_RUNTIME, "get_runtime"}, +#ifndef MNG_NO_CURRENT_INFO + {MNG_FN_GET_CURRENTFRAME, "get_currentframe"}, + {MNG_FN_GET_CURRENTLAYER, "get_currentlayer"}, + {MNG_FN_GET_CURRENTPLAYTIME, "get_currentplaytime"}, +#endif + {MNG_FN_GET_SECTIONBREAKS, "get_sectionbreaks"}, + {MNG_FN_GET_ALPHADEPTH, "get_alphadepth"}, + {MNG_FN_GET_BITDEPTH, "get_bitdepth"}, + {MNG_FN_GET_COLORTYPE, "get_colortype"}, + {MNG_FN_GET_COMPRESSION, "get_compression"}, + {MNG_FN_GET_FILTER, "get_filter"}, + {MNG_FN_GET_INTERLACE, "get_interlace"}, + {MNG_FN_GET_ALPHABITDEPTH, "get_alphabitdepth"}, + {MNG_FN_GET_ALPHACOMPRESSION, "get_alphacompression"}, + {MNG_FN_GET_ALPHAFILTER, "get_alphafilter"}, + {MNG_FN_GET_ALPHAINTERLACE, "get_alphainterlace"}, + {MNG_FN_GET_USEBKGD, "get_usebkgd"}, + {MNG_FN_GET_REFRESHPASS, "get_refreshpass"}, + {MNG_FN_GET_CACHEPLAYBACK, "get_cacheplayback"}, + {MNG_FN_GET_DOPROGRESSIVE, "get_doprogressive"}, + {MNG_FN_GET_LASTBACKCHUNK, "get_lastbackchunk"}, + {MNG_FN_GET_LASTSEEKNAME, "get_lastseekname"}, +#ifndef MNG_NO_CURRENT_INFO + {MNG_FN_GET_TOTALFRAMES, "get_totalframes"}, + {MNG_FN_GET_TOTALLAYERS, "get_totallayers"}, + {MNG_FN_GET_TOTALPLAYTIME, "get_totalplaytime"}, +#endif + {MNG_FN_GET_CRCMODE, "get_crcmode"}, + {MNG_FN_GET_CURRFRAMDELAY, "get_currframdelay"}, + + {MNG_FN_STATUS_ERROR, "status_error"}, + {MNG_FN_STATUS_READING, "status_reading"}, + {MNG_FN_STATUS_SUSPENDBREAK, "status_suspendbreak"}, + {MNG_FN_STATUS_CREATING, "status_creating"}, + {MNG_FN_STATUS_WRITING, "status_writing"}, + {MNG_FN_STATUS_DISPLAYING, "status_displaying"}, + {MNG_FN_STATUS_RUNNING, "status_running"}, + {MNG_FN_STATUS_TIMERBREAK, "status_timerbreak"}, + {MNG_FN_STATUS_DYNAMIC, "status_dynamic"}, + {MNG_FN_STATUS_RUNNINGEVENT, "status_runningevent"}, + + {MNG_FN_ITERATE_CHUNKS, "iterate_chunks"}, + {MNG_FN_COPY_CHUNK, "copy_chunk"}, + + {MNG_FN_GETCHUNK_IHDR, "getchunk_ihdr"}, + {MNG_FN_GETCHUNK_PLTE, "getchunk_plte"}, + {MNG_FN_GETCHUNK_IDAT, "getchunk_idat"}, + {MNG_FN_GETCHUNK_IEND, "getchunk_iend"}, + {MNG_FN_GETCHUNK_TRNS, "getchunk_trns"}, +#ifndef MNG_SKIPCHUNK_gAMA + {MNG_FN_GETCHUNK_GAMA, "getchunk_gama"}, +#endif +#ifndef MNG_SKIPCHUNK_cHRM + {MNG_FN_GETCHUNK_CHRM, "getchunk_chrm"}, +#endif +#ifndef MNG_SKIPCHUNK_sRGB + {MNG_FN_GETCHUNK_SRGB, "getchunk_srgb"}, +#endif +#ifndef MNG_SKIPCHUNK_iCCP + {MNG_FN_GETCHUNK_ICCP, "getchunk_iccp"}, +#endif +#ifndef MNG_SKIPCHUNK_tEXt + {MNG_FN_GETCHUNK_TEXT, "getchunk_text"}, +#endif +#ifndef MNG_SKIPCHUNK_zTXt + {MNG_FN_GETCHUNK_ZTXT, "getchunk_ztxt"}, +#endif +#ifndef MNG_SKIPCHUNK_iTXt + {MNG_FN_GETCHUNK_ITXT, "getchunk_itxt"}, +#endif +#ifndef MNG_SKIPCHUNK_bKGD + {MNG_FN_GETCHUNK_BKGD, "getchunk_bkgd"}, +#endif +#ifndef MNG_SKIPCHUNK_pHYs + {MNG_FN_GETCHUNK_PHYS, "getchunk_phys"}, +#endif +#ifndef MNG_SKIPCHUNK_sBIT + {MNG_FN_GETCHUNK_SBIT, "getchunk_sbit"}, +#endif +#ifndef MNG_SKIPCHUNK_sPLT + {MNG_FN_GETCHUNK_SPLT, "getchunk_splt"}, +#endif +#ifndef MNG_SKIPCHUNK_hIST + {MNG_FN_GETCHUNK_HIST, "getchunk_hist"}, +#endif +#ifndef MNG_SKIPCHUNK_tIME + {MNG_FN_GETCHUNK_TIME, "getchunk_time"}, +#endif + {MNG_FN_GETCHUNK_MHDR, "getchunk_mhdr"}, + {MNG_FN_GETCHUNK_MEND, "getchunk_mend"}, +#ifndef MNG_SKIPCHUNK_LOOP + {MNG_FN_GETCHUNK_LOOP, "getchunk_loop"}, + {MNG_FN_GETCHUNK_ENDL, "getchunk_endl"}, +#endif + {MNG_FN_GETCHUNK_DEFI, "getchunk_defi"}, +#ifndef MNG_SKIPCHUNK_BASI + {MNG_FN_GETCHUNK_BASI, "getchunk_basi"}, +#endif + {MNG_FN_GETCHUNK_CLON, "getchunk_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_GETCHUNK_PAST, "getchunk_past"}, +#endif + {MNG_FN_GETCHUNK_DISC, "getchunk_disc"}, + {MNG_FN_GETCHUNK_BACK, "getchunk_back"}, + {MNG_FN_GETCHUNK_FRAM, "getchunk_fram"}, + {MNG_FN_GETCHUNK_MOVE, "getchunk_move"}, + {MNG_FN_GETCHUNK_CLIP, "getchunk_clip"}, + {MNG_FN_GETCHUNK_SHOW, "getchunk_show"}, + {MNG_FN_GETCHUNK_TERM, "getchunk_term"}, +#ifndef MNG_SKIPCHUNK_SAVE + {MNG_FN_GETCHUNK_SAVE, "getchunk_save"}, +#endif +#ifndef MNG_SKIPCHUNK_SEEK + {MNG_FN_GETCHUNK_SEEK, "getchunk_seek"}, +#endif +#ifndef MNG_SKIPCHUNK_eXPI + {MNG_FN_GETCHUNK_EXPI, "getchunk_expi"}, +#endif +#ifndef MNG_SKIPCHUNK_fPRI + {MNG_FN_GETCHUNK_FPRI, "getchunk_fpri"}, +#endif +#ifndef MNG_SKIPCHUNK_nEED + {MNG_FN_GETCHUNK_NEED, "getchunk_need"}, +#endif +#ifndef MNG_SKIPCHUNK_pHYg + {MNG_FN_GETCHUNK_PHYG, "getchunk_phyg"}, +#endif +#ifdef MNG_INCLUDE_JNG + {MNG_FN_GETCHUNK_JHDR, "getchunk_jhdr"}, + {MNG_FN_GETCHUNK_JDAT, "getchunk_jdat"}, + {MNG_FN_GETCHUNK_JSEP, "getchunk_jsep"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_GETCHUNK_DHDR, "getchunk_dhdr"}, + {MNG_FN_GETCHUNK_PROM, "getchunk_prom"}, + {MNG_FN_GETCHUNK_IPNG, "getchunk_ipng"}, + {MNG_FN_GETCHUNK_PPLT, "getchunk_pplt"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_GETCHUNK_IJNG, "getchunk_ijng"}, +#endif +#ifndef MNG_SKIPCHUNK_DROP + {MNG_FN_GETCHUNK_DROP, "getchunk_drop"}, +#endif +#ifndef MNG_SKIPCHUNK_DBYK + {MNG_FN_GETCHUNK_DBYK, "getchunk_dbyk"}, +#endif +#ifndef MNG_SKIPCHUNK_ORDR + {MNG_FN_GETCHUNK_ORDR, "getchunk_ordr"}, +#endif +#endif + {MNG_FN_GETCHUNK_UNKNOWN, "getchunk_unknown"}, + {MNG_FN_GETCHUNK_MAGN, "getchunk_magn"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_GETCHUNK_JDAA, "getchunk_jdaa"}, +#endif +#ifndef MNG_SKIPCHUNK_evNT + {MNG_FN_GETCHUNK_EVNT, "getchunk_evnt"}, +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_GETCHUNK_MPNG, "getchunk_mpng"}, +#endif + +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_GETCHUNK_PAST_SRC, "getchunk_past_src"}, +#endif +#ifndef MNG_SKIPCHUNK_SAVE + {MNG_FN_GETCHUNK_SAVE_ENTRY, "getchunk_save_entry"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_GETCHUNK_PPLT_ENTRY, "getchunk_pplt_entry"}, + {MNG_FN_GETCHUNK_ORDR_ENTRY, "getchunk_ordr_entry"}, +#endif +#ifndef MNG_SKIPCHUNK_evNT + {MNG_FN_GETCHUNK_EVNT_ENTRY, "getchunk_evnt_entry"}, +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_GETCHUNK_MPNG_FRAME, "getchunk_mpng_frame"}, +#endif + + {MNG_FN_PUTCHUNK_IHDR, "putchunk_ihdr"}, + {MNG_FN_PUTCHUNK_PLTE, "putchunk_plte"}, + {MNG_FN_PUTCHUNK_IDAT, "putchunk_idat"}, + {MNG_FN_PUTCHUNK_IEND, "putchunk_iend"}, + {MNG_FN_PUTCHUNK_TRNS, "putchunk_trns"}, +#ifndef MNG_SKIPCHUNK_gAMA + {MNG_FN_PUTCHUNK_GAMA, "putchunk_gama"}, +#endif +#ifndef MNG_SKIPCHUNK_cHRM + {MNG_FN_PUTCHUNK_CHRM, "putchunk_chrm"}, +#endif +#ifndef MNG_SKIPCHUNK_sRGB + {MNG_FN_PUTCHUNK_SRGB, "putchunk_srgb"}, +#endif +#ifndef MNG_SKIPCHUNK_iCCP + {MNG_FN_PUTCHUNK_ICCP, "putchunk_iccp"}, +#endif +#ifndef MNG_SKIPCHUNK_tEXt + {MNG_FN_PUTCHUNK_TEXT, "putchunk_text"}, +#endif +#ifndef MNG_SKIPCHUNK_zTXt + {MNG_FN_PUTCHUNK_ZTXT, "putchunk_ztxt"}, +#endif +#ifndef MNG_SKIPCHUNK_iTXt + {MNG_FN_PUTCHUNK_ITXT, "putchunk_itxt"}, +#endif +#ifndef MNG_SKIPCHUNK_bKGD + {MNG_FN_PUTCHUNK_BKGD, "putchunk_bkgd"}, +#endif +#ifndef MNG_SKIPCHUNK_pHYs + {MNG_FN_PUTCHUNK_PHYS, "putchunk_phys"}, +#endif +#ifndef MNG_SKIPCHUNK_sBIT + {MNG_FN_PUTCHUNK_SBIT, "putchunk_sbit"}, +#endif +#ifndef MNG_SKIPCHUNK_sPLT + {MNG_FN_PUTCHUNK_SPLT, "putchunk_splt"}, +#endif +#ifndef MNG_SKIPCHUNK_hIST + {MNG_FN_PUTCHUNK_HIST, "putchunk_hist"}, +#endif +#ifndef MNG_SKIPCHUNK_tIME + {MNG_FN_PUTCHUNK_TIME, "putchunk_time"}, +#endif + {MNG_FN_PUTCHUNK_MHDR, "putchunk_mhdr"}, + {MNG_FN_PUTCHUNK_MEND, "putchunk_mend"}, + {MNG_FN_PUTCHUNK_LOOP, "putchunk_loop"}, + {MNG_FN_PUTCHUNK_ENDL, "putchunk_endl"}, + {MNG_FN_PUTCHUNK_DEFI, "putchunk_defi"}, + {MNG_FN_PUTCHUNK_BASI, "putchunk_basi"}, + {MNG_FN_PUTCHUNK_CLON, "putchunk_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_PUTCHUNK_PAST, "putchunk_past"}, +#endif + {MNG_FN_PUTCHUNK_DISC, "putchunk_disc"}, + {MNG_FN_PUTCHUNK_BACK, "putchunk_back"}, + {MNG_FN_PUTCHUNK_FRAM, "putchunk_fram"}, + {MNG_FN_PUTCHUNK_MOVE, "putchunk_move"}, + {MNG_FN_PUTCHUNK_CLIP, "putchunk_clip"}, + {MNG_FN_PUTCHUNK_SHOW, "putchunk_show"}, + {MNG_FN_PUTCHUNK_TERM, "putchunk_term"}, +#ifndef MNG_SKIPCHUNK_SAVE + {MNG_FN_PUTCHUNK_SAVE, "putchunk_save"}, +#endif +#ifndef MNG_SKIPCHUNK_SEEK + {MNG_FN_PUTCHUNK_SEEK, "putchunk_seek"}, +#endif +#ifndef MNG_SKIPCHUNK_eXPI + {MNG_FN_PUTCHUNK_EXPI, "putchunk_expi"}, +#endif +#ifndef MNG_SKIPCHUNK_fPRI + {MNG_FN_PUTCHUNK_FPRI, "putchunk_fpri"}, +#endif +#ifndef MNG_SKIPCHUNK_nEED + {MNG_FN_PUTCHUNK_NEED, "putchunk_need"}, +#endif +#ifndef MNG_SKIPCHUNK_pHYg + {MNG_FN_PUTCHUNK_PHYG, "putchunk_phyg"}, +#endif +#ifdef MNG_INCLUDE_JNG + {MNG_FN_PUTCHUNK_JHDR, "putchunk_jhdr"}, + {MNG_FN_PUTCHUNK_JDAT, "putchunk_jdat"}, + {MNG_FN_PUTCHUNK_JSEP, "putchunk_jsep"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_PUTCHUNK_DHDR, "putchunk_dhdr"}, + {MNG_FN_PUTCHUNK_PROM, "putchunk_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_PUTCHUNK_IPNG, "putchunk_ipng"}, +#endif + {MNG_FN_PUTCHUNK_PPLT, "putchunk_pplt"}, + {MNG_FN_PUTCHUNK_IJNG, "putchunk_ijng"}, +#ifndef MNG_SKIPCHUNK_DROP + {MNG_FN_PUTCHUNK_DROP, "putchunk_drop"}, +#endif +#ifndef MNG_SKIPCHUNK_DBYK + {MNG_FN_PUTCHUNK_DBYK, "putchunk_dbyk"}, +#endif +#ifndef MNG_SKIPCHUNK_ORDR + {MNG_FN_PUTCHUNK_ORDR, "putchunk_ordr"}, +#endif +#endif + {MNG_FN_PUTCHUNK_UNKNOWN, "putchunk_unknown"}, + {MNG_FN_PUTCHUNK_MAGN, "putchunk_magn"}, + {MNG_FN_PUTCHUNK_JDAA, "putchunk_jdaa"}, +#ifndef MNG_SKIPCHUNK_evNT + {MNG_FN_PUTCHUNK_EVNT, "putchunk_evnt"}, +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_PUTCHUNK_MPNG, "putchunk_mpng"}, +#endif + +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_PUTCHUNK_PAST_SRC, "putchunk_past_src"}, +#endif +#ifndef MNG_SKIPCHUNK_SAVE + {MNG_FN_PUTCHUNK_SAVE_ENTRY, "putchunk_save_entry"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_PUTCHUNK_PPLT_ENTRY, "putchunk_pplt_entry"}, +#ifndef MNG_SKIPCHUNK_ORDR + {MNG_FN_PUTCHUNK_ORDR_ENTRY, "putchunk_ordr_entry"}, +#endif +#endif +#ifndef MNG_SKIPCHUNK_evNT + {MNG_FN_PUTCHUNK_EVNT_ENTRY, "putchunk_evnt_entry"}, +#endif +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_PUTCHUNK_MPNG_FRAME, "putchunk_mpng_frame"}, +#endif + + {MNG_FN_GETIMGDATA_SEQ, "getimgdata_seq"}, + {MNG_FN_GETIMGDATA_CHUNKSEQ, "getimgdata_chunkseq"}, + {MNG_FN_GETIMGDATA_CHUNK, "getimgdata_chunk"}, + + {MNG_FN_PUTIMGDATA_IHDR, "putimgdata_ihdr"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_PUTIMGDATA_JHDR, "putimgdata_jhdr"}, + {MNG_FN_PUTIMGDATA_BASI, "putimgdata_basi"}, + {MNG_FN_PUTIMGDATA_DHDR, "putimgdata_dhdr"}, +#endif + + {MNG_FN_UPDATEMNGHEADER, "updatemngheader"}, + {MNG_FN_UPDATEMNGSIMPLICITY, "updatemngsimplicity"}, + + {MNG_FN_PROCESS_RAW_CHUNK, "process_raw_chunk"}, + {MNG_FN_READ_GRAPHIC, "read_graphic"}, + {MNG_FN_DROP_CHUNKS, "drop_chunks"}, + {MNG_FN_PROCESS_ERROR, "process_error"}, + {MNG_FN_CLEAR_CMS, "clear_cms"}, + {MNG_FN_DROP_OBJECTS, "drop_objects"}, + {MNG_FN_READ_CHUNK, "read_chunk"}, + {MNG_FN_LOAD_BKGDLAYER, "load_bkgdlayer"}, + {MNG_FN_NEXT_FRAME, "next_frame"}, + {MNG_FN_NEXT_LAYER, "next_layer"}, + {MNG_FN_INTERFRAME_DELAY, "interframe_delay"}, + {MNG_FN_DISPLAY_IMAGE, "display_image"}, + {MNG_FN_DROP_IMGOBJECTS, "drop_imgobjects"}, + {MNG_FN_DROP_ANIOBJECTS, "drop_aniobjects"}, + {MNG_FN_INFLATE_BUFFER, "inflate_buffer"}, + {MNG_FN_DEFLATE_BUFFER, "deflate_buffer"}, + {MNG_FN_WRITE_RAW_CHUNK, "write_raw_chunk"}, + {MNG_FN_WRITE_GRAPHIC, "write_graphic"}, + {MNG_FN_SAVE_STATE, "save_state"}, + {MNG_FN_RESTORE_STATE, "restore_state"}, + {MNG_FN_DROP_SAVEDATA, "drop_savedata"}, +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_EXECUTE_DELTA_IMAGE, "execute_delta_image"}, +#endif + {MNG_FN_PROCESS_DISPLAY, "process_display"}, + {MNG_FN_CLEAR_CANVAS, "clear_canvas"}, + {MNG_FN_READ_DATABUFFER, "read_databuffer"}, + {MNG_FN_STORE_ERROR, "store_error"}, + {MNG_FN_DROP_INVALID_OBJECTS, "drop_invalid_objects"}, + {MNG_FN_RELEASE_PUSHDATA, "release_pushdata"}, + {MNG_FN_READ_DATA, "read_data"}, + {MNG_FN_READ_CHUNK_CRC, "read_chunk_crc"}, + {MNG_FN_RELEASE_PUSHCHUNK, "release_pushchunk"}, + + {MNG_FN_DISPLAY_RGB8, "display_rgb8"}, + {MNG_FN_DISPLAY_RGBA8, "display_rgba8"}, + {MNG_FN_DISPLAY_ARGB8, "display_argb8"}, + {MNG_FN_DISPLAY_BGR8, "display_bgr8"}, + {MNG_FN_DISPLAY_BGRA8, "display_bgra8"}, + {MNG_FN_DISPLAY_ABGR8, "display_abgr8"}, + {MNG_FN_DISPLAY_RGB16, "display_rgb16"}, + {MNG_FN_DISPLAY_RGBA16, "display_rgba16"}, + {MNG_FN_DISPLAY_ARGB16, "display_argb16"}, + {MNG_FN_DISPLAY_BGR16, "display_bgr16"}, + {MNG_FN_DISPLAY_BGRA16, "display_bgra16"}, + {MNG_FN_DISPLAY_ABGR16, "display_abgr16"}, + {MNG_FN_DISPLAY_INDEX8, "display_index8"}, + {MNG_FN_DISPLAY_INDEXA8, "display_indexa8"}, + {MNG_FN_DISPLAY_AINDEX8, "display_aindex8"}, + {MNG_FN_DISPLAY_GRAY8, "display_gray8"}, + {MNG_FN_DISPLAY_GRAY16, "display_gray16"}, + {MNG_FN_DISPLAY_GRAYA8, "display_graya8"}, + {MNG_FN_DISPLAY_GRAYA16, "display_graya16"}, + {MNG_FN_DISPLAY_AGRAY8, "display_agray8"}, + {MNG_FN_DISPLAY_AGRAY16, "display_agray16"}, + {MNG_FN_DISPLAY_DX15, "display_dx15"}, + {MNG_FN_DISPLAY_DX16, "display_dx16"}, + {MNG_FN_DISPLAY_RGB8_A8, "display_rgb8_a8"}, + {MNG_FN_DISPLAY_BGRA8PM, "display_bgra8_pm"}, + {MNG_FN_DISPLAY_BGRX8, "display_bgrx8"}, + {MNG_FN_DISPLAY_RGB565, "display_rgb565"}, + {MNG_FN_DISPLAY_RGBA565, "display_rgba565"}, + {MNG_FN_DISPLAY_BGR565, "display_bgr565"}, + {MNG_FN_DISPLAY_BGRA565, "display_bgra565"}, + {MNG_FN_DISPLAY_RGBA8_PM, "display_rgba8_pm"}, + {MNG_FN_DISPLAY_ARGB8_PM, "display_argb8_pm"}, + {MNG_FN_DISPLAY_ABGR8_PM, "display_abgr8_pm"}, + {MNG_FN_DISPLAY_BGR565_A8, "display_bgr565_a8"}, + + {MNG_FN_INIT_FULL_CMS, "init_full_cms"}, + {MNG_FN_CORRECT_FULL_CMS, "correct_full_cms"}, + {MNG_FN_INIT_GAMMA_ONLY, "init_gamma_only"}, + {MNG_FN_CORRECT_GAMMA_ONLY, "correct_gamma_only"}, + {MNG_FN_CORRECT_APP_CMS, "correct_app_cms"}, + {MNG_FN_INIT_FULL_CMS_OBJ, "init_full_cms_obj"}, + {MNG_FN_INIT_GAMMA_ONLY_OBJ, "init_gamma_only_obj"}, + {MNG_FN_INIT_APP_CMS, "init_app_cms"}, + {MNG_FN_INIT_APP_CMS_OBJ, "init_app_cms_obj"}, + + {MNG_FN_PROCESS_G1, "process_g1"}, + {MNG_FN_PROCESS_G2, "process_g2"}, + {MNG_FN_PROCESS_G4, "process_g4"}, + {MNG_FN_PROCESS_G8, "process_g8"}, + {MNG_FN_PROCESS_G16, "process_g16"}, + {MNG_FN_PROCESS_RGB8, "process_rgb8"}, + {MNG_FN_PROCESS_RGB16, "process_rgb16"}, + {MNG_FN_PROCESS_IDX1, "process_idx1"}, + {MNG_FN_PROCESS_IDX2, "process_idx2"}, + {MNG_FN_PROCESS_IDX4, "process_idx4"}, + {MNG_FN_PROCESS_IDX8, "process_idx8"}, + {MNG_FN_PROCESS_GA8, "process_ga8"}, + {MNG_FN_PROCESS_GA16, "process_ga16"}, + {MNG_FN_PROCESS_RGBA8, "process_rgba8"}, + {MNG_FN_PROCESS_RGBA16, "process_rgba16"}, + + {MNG_FN_INIT_G1_I, "init_g1_i"}, + {MNG_FN_INIT_G2_I, "init_g2_i"}, + {MNG_FN_INIT_G4_I, "init_g4_i"}, + {MNG_FN_INIT_G8_I, "init_g8_i"}, + {MNG_FN_INIT_G16_I, "init_g16_i"}, + {MNG_FN_INIT_RGB8_I, "init_rgb8_i"}, + {MNG_FN_INIT_RGB16_I, "init_rgb16_i"}, + {MNG_FN_INIT_IDX1_I, "init_idx1_i"}, + {MNG_FN_INIT_IDX2_I, "init_idx2_i"}, + {MNG_FN_INIT_IDX4_I, "init_idx4_i"}, + {MNG_FN_INIT_IDX8_I, "init_idx8_i"}, + {MNG_FN_INIT_GA8_I, "init_ga8_i"}, + {MNG_FN_INIT_GA16_I, "init_ga16_i"}, + {MNG_FN_INIT_RGBA8_I, "init_rgba8_i"}, + {MNG_FN_INIT_RGBA16_I, "init_rgba16_i"}, +#ifndef MNG_OPTIMIZE_FOOTPRINT_INIT + {MNG_FN_INIT_G1_NI, "init_g1_ni"}, + {MNG_FN_INIT_G2_NI, "init_g2_ni"}, + {MNG_FN_INIT_G4_NI, "init_g4_ni"}, + {MNG_FN_INIT_G8_NI, "init_g8_ni"}, + {MNG_FN_INIT_G16_NI, "init_g16_ni"}, + {MNG_FN_INIT_RGB8_NI, "init_rgb8_ni"}, + {MNG_FN_INIT_RGB16_NI, "init_rgb16_ni"}, + {MNG_FN_INIT_IDX1_NI, "init_idx1_ni"}, + {MNG_FN_INIT_IDX2_NI, "init_idx2_ni"}, + {MNG_FN_INIT_IDX4_NI, "init_idx4_ni"}, + {MNG_FN_INIT_IDX8_NI, "init_idx8_ni"}, + {MNG_FN_INIT_GA8_NI, "init_ga8_ni"}, + {MNG_FN_INIT_GA16_NI, "init_ga16_ni"}, + {MNG_FN_INIT_RGBA8_NI, "init_rgba8_ni"}, + {MNG_FN_INIT_RGBA16_NI, "init_rgba16_ni"}, +#endif + + {MNG_FN_INIT_ROWPROC, "init_rowproc"}, + {MNG_FN_NEXT_ROW, "next_row"}, + {MNG_FN_CLEANUP_ROWPROC, "cleanup_rowproc"}, + + {MNG_FN_FILTER_A_ROW, "filter_a_row"}, + {MNG_FN_FILTER_SUB, "filter_sub"}, + {MNG_FN_FILTER_UP, "filter_up"}, + {MNG_FN_FILTER_AVERAGE, "filter_average"}, + {MNG_FN_FILTER_PAETH, "filter_paeth"}, + + {MNG_FN_INIT_ROWDIFFERING, "init_rowdiffering"}, + {MNG_FN_DIFFER_G1, "differ_g1"}, + {MNG_FN_DIFFER_G2, "differ_g2"}, + {MNG_FN_DIFFER_G4, "differ_g4"}, + {MNG_FN_DIFFER_G8, "differ_g8"}, + {MNG_FN_DIFFER_G16, "differ_g16"}, + {MNG_FN_DIFFER_RGB8, "differ_rgb8"}, + {MNG_FN_DIFFER_RGB16, "differ_rgb16"}, + {MNG_FN_DIFFER_IDX1, "differ_idx1"}, + {MNG_FN_DIFFER_IDX2, "differ_idx2"}, + {MNG_FN_DIFFER_IDX4, "differ_idx4"}, + {MNG_FN_DIFFER_IDX8, "differ_idx8"}, + {MNG_FN_DIFFER_GA8, "differ_ga8"}, + {MNG_FN_DIFFER_GA16, "differ_ga16"}, + {MNG_FN_DIFFER_RGBA8, "differ_rgba8"}, + {MNG_FN_DIFFER_RGBA16, "differ_rgba16"}, + + {MNG_FN_CREATE_IMGDATAOBJECT, "create_imgdataobject"}, + {MNG_FN_FREE_IMGDATAOBJECT, "free_imgdataobject"}, + {MNG_FN_CLONE_IMGDATAOBJECT, "clone_imgdataobject"}, + {MNG_FN_CREATE_IMGOBJECT, "create_imgobject"}, + {MNG_FN_FREE_IMGOBJECT, "free_imgobject"}, + {MNG_FN_FIND_IMGOBJECT, "find_imgobject"}, + {MNG_FN_CLONE_IMGOBJECT, "clone_imgobject"}, + {MNG_FN_RESET_OBJECTDETAILS, "reset_objectdetails"}, + {MNG_FN_RENUM_IMGOBJECT, "renum_imgobject"}, + {MNG_FN_PROMOTE_IMGOBJECT, "promote_imgobject"}, + {MNG_FN_MAGNIFY_IMGOBJECT, "magnify_imgobject"}, + {MNG_FN_COLORCORRECT_OBJECT, "colorcorrect_object"}, + + {MNG_FN_STORE_G1, "store_g1"}, + {MNG_FN_STORE_G2, "store_g2"}, + {MNG_FN_STORE_G4, "store_g4"}, + {MNG_FN_STORE_G8, "store_g8"}, + {MNG_FN_STORE_G16, "store_g16"}, + {MNG_FN_STORE_RGB8, "store_rgb8"}, + {MNG_FN_STORE_RGB16, "store_rgb16"}, + {MNG_FN_STORE_IDX1, "store_idx1"}, + {MNG_FN_STORE_IDX2, "store_idx2"}, + {MNG_FN_STORE_IDX4, "store_idx4"}, + {MNG_FN_STORE_IDX8, "store_idx8"}, + {MNG_FN_STORE_GA8, "store_ga8"}, + {MNG_FN_STORE_GA16, "store_ga16"}, + {MNG_FN_STORE_RGBA8, "store_rgba8"}, + {MNG_FN_STORE_RGBA16, "store_rgba16"}, + + {MNG_FN_RETRIEVE_G8, "retrieve_g8"}, + {MNG_FN_RETRIEVE_G16, "retrieve_g16"}, + {MNG_FN_RETRIEVE_RGB8, "retrieve_rgb8"}, + {MNG_FN_RETRIEVE_RGB16, "retrieve_rgb16"}, + {MNG_FN_RETRIEVE_IDX8, "retrieve_idx8"}, + {MNG_FN_RETRIEVE_GA8, "retrieve_ga8"}, + {MNG_FN_RETRIEVE_GA16, "retrieve_ga16"}, + {MNG_FN_RETRIEVE_RGBA8, "retrieve_rgba8"}, + {MNG_FN_RETRIEVE_RGBA16, "retrieve_rgba16"}, + +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_DELTA_G1, "delta_g1"}, + {MNG_FN_DELTA_G2, "delta_g2"}, + {MNG_FN_DELTA_G4, "delta_g4"}, + {MNG_FN_DELTA_G8, "delta_g8"}, + {MNG_FN_DELTA_G16, "delta_g16"}, + {MNG_FN_DELTA_RGB8, "delta_rgb8"}, + {MNG_FN_DELTA_RGB16, "delta_rgb16"}, + {MNG_FN_DELTA_IDX1, "delta_idx1"}, + {MNG_FN_DELTA_IDX2, "delta_idx2"}, + {MNG_FN_DELTA_IDX4, "delta_idx4"}, + {MNG_FN_DELTA_IDX8, "delta_idx8"}, + {MNG_FN_DELTA_GA8, "delta_ga8"}, + {MNG_FN_DELTA_GA16, "delta_ga16"}, + {MNG_FN_DELTA_RGBA8, "delta_rgba8"}, + {MNG_FN_DELTA_RGBA16, "delta_rgba16"}, +#endif + + {MNG_FN_CREATE_ANI_LOOP, "create_ani_loop"}, + {MNG_FN_CREATE_ANI_ENDL, "create_ani_endl"}, + {MNG_FN_CREATE_ANI_DEFI, "create_ani_defi"}, + {MNG_FN_CREATE_ANI_BASI, "create_ani_basi"}, + {MNG_FN_CREATE_ANI_CLON, "create_ani_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_CREATE_ANI_PAST, "create_ani_past"}, +#endif + {MNG_FN_CREATE_ANI_DISC, "create_ani_disc"}, + {MNG_FN_CREATE_ANI_BACK, "create_ani_back"}, + {MNG_FN_CREATE_ANI_FRAM, "create_ani_fram"}, + {MNG_FN_CREATE_ANI_MOVE, "create_ani_move"}, + {MNG_FN_CREATE_ANI_CLIP, "create_ani_clip"}, + {MNG_FN_CREATE_ANI_SHOW, "create_ani_show"}, + {MNG_FN_CREATE_ANI_TERM, "create_ani_term"}, + {MNG_FN_CREATE_ANI_SAVE, "create_ani_save"}, + {MNG_FN_CREATE_ANI_SEEK, "create_ani_seek"}, + {MNG_FN_CREATE_ANI_GAMA, "create_ani_gama"}, + {MNG_FN_CREATE_ANI_CHRM, "create_ani_chrm"}, + {MNG_FN_CREATE_ANI_SRGB, "create_ani_srgb"}, + {MNG_FN_CREATE_ANI_ICCP, "create_ani_iccp"}, + {MNG_FN_CREATE_ANI_PLTE, "create_ani_plte"}, + {MNG_FN_CREATE_ANI_TRNS, "create_ani_trns"}, + {MNG_FN_CREATE_ANI_BKGD, "create_ani_bkgd"}, +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_CREATE_ANI_DHDR, "create_ani_dhdr"}, + {MNG_FN_CREATE_ANI_PROM, "create_ani_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_CREATE_ANI_IPNG, "create_ani_ipng"}, +#endif + {MNG_FN_CREATE_ANI_IJNG, "create_ani_ijng"}, + {MNG_FN_CREATE_ANI_PPLT, "create_ani_pplt"}, +#endif + {MNG_FN_CREATE_ANI_MAGN, "create_ani_magn"}, + + {MNG_FN_CREATE_ANI_IMAGE, "create_ani_image"}, + {MNG_FN_CREATE_EVENT, "create_event"}, + + {MNG_FN_FREE_ANI_LOOP, "free_ani_loop"}, + {MNG_FN_FREE_ANI_ENDL, "free_ani_endl"}, + {MNG_FN_FREE_ANI_DEFI, "free_ani_defi"}, + {MNG_FN_FREE_ANI_BASI, "free_ani_basi"}, + {MNG_FN_FREE_ANI_CLON, "free_ani_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_FREE_ANI_PAST, "free_ani_past"}, +#endif + {MNG_FN_FREE_ANI_DISC, "free_ani_disc"}, + {MNG_FN_FREE_ANI_BACK, "free_ani_back"}, + {MNG_FN_FREE_ANI_FRAM, "free_ani_fram"}, + {MNG_FN_FREE_ANI_MOVE, "free_ani_move"}, + {MNG_FN_FREE_ANI_CLIP, "free_ani_clip"}, + {MNG_FN_FREE_ANI_SHOW, "free_ani_show"}, + {MNG_FN_FREE_ANI_TERM, "free_ani_term"}, + {MNG_FN_FREE_ANI_SAVE, "free_ani_save"}, + {MNG_FN_FREE_ANI_SEEK, "free_ani_seek"}, + {MNG_FN_FREE_ANI_GAMA, "free_ani_gama"}, + {MNG_FN_FREE_ANI_CHRM, "free_ani_chrm"}, + {MNG_FN_FREE_ANI_SRGB, "free_ani_srgb"}, + {MNG_FN_FREE_ANI_ICCP, "free_ani_iccp"}, + {MNG_FN_FREE_ANI_PLTE, "free_ani_plte"}, + {MNG_FN_FREE_ANI_TRNS, "free_ani_trns"}, + {MNG_FN_FREE_ANI_BKGD, "free_ani_bkgd"}, +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_FREE_ANI_DHDR, "free_ani_dhdr"}, + {MNG_FN_FREE_ANI_PROM, "free_ani_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_FREE_ANI_IPNG, "free_ani_ipng"}, +#endif + {MNG_FN_FREE_ANI_IJNG, "free_ani_ijng"}, + {MNG_FN_FREE_ANI_PPLT, "free_ani_pplt"}, +#endif + {MNG_FN_FREE_ANI_MAGN, "free_ani_magn"}, + + {MNG_FN_FREE_ANI_IMAGE, "free_ani_image"}, + {MNG_FN_FREE_EVENT, "free_event"}, + + {MNG_FN_PROCESS_ANI_LOOP, "process_ani_loop"}, + {MNG_FN_PROCESS_ANI_ENDL, "process_ani_endl"}, + {MNG_FN_PROCESS_ANI_DEFI, "process_ani_defi"}, + {MNG_FN_PROCESS_ANI_BASI, "process_ani_basi"}, + {MNG_FN_PROCESS_ANI_CLON, "process_ani_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_PROCESS_ANI_PAST, "process_ani_past"}, +#endif + {MNG_FN_PROCESS_ANI_DISC, "process_ani_disc"}, + {MNG_FN_PROCESS_ANI_BACK, "process_ani_back"}, + {MNG_FN_PROCESS_ANI_FRAM, "process_ani_fram"}, + {MNG_FN_PROCESS_ANI_MOVE, "process_ani_move"}, + {MNG_FN_PROCESS_ANI_CLIP, "process_ani_clip"}, + {MNG_FN_PROCESS_ANI_SHOW, "process_ani_show"}, + {MNG_FN_PROCESS_ANI_TERM, "process_ani_term"}, + {MNG_FN_PROCESS_ANI_SAVE, "process_ani_save"}, + {MNG_FN_PROCESS_ANI_SEEK, "process_ani_seek"}, + {MNG_FN_PROCESS_ANI_GAMA, "process_ani_gama"}, + {MNG_FN_PROCESS_ANI_CHRM, "process_ani_chrm"}, + {MNG_FN_PROCESS_ANI_SRGB, "process_ani_srgb"}, + {MNG_FN_PROCESS_ANI_ICCP, "process_ani_iccp"}, + {MNG_FN_PROCESS_ANI_PLTE, "process_ani_plte"}, + {MNG_FN_PROCESS_ANI_TRNS, "process_ani_trns"}, + {MNG_FN_PROCESS_ANI_BKGD, "process_ani_bkgd"}, +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_PROCESS_ANI_DHDR, "process_ani_dhdr"}, + {MNG_FN_PROCESS_ANI_PROM, "process_ani_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_PROCESS_ANI_IPNG, "process_ani_ipng"}, +#endif + {MNG_FN_PROCESS_ANI_IJNG, "process_ani_ijng"}, + {MNG_FN_PROCESS_ANI_PPLT, "process_ani_pplt"}, +#endif + {MNG_FN_PROCESS_ANI_MAGN, "process_ani_magn"}, + + {MNG_FN_PROCESS_ANI_IMAGE, "process_ani_image"}, + {MNG_FN_PROCESS_EVENT, "process_event"}, + + {MNG_FN_RESTORE_BACKIMAGE, "restore_backimage"}, + {MNG_FN_RESTORE_BACKCOLOR, "restore_backcolor"}, + {MNG_FN_RESTORE_BGCOLOR, "restore_bgcolor"}, + {MNG_FN_RESTORE_RGB8, "restore_rgb8"}, + {MNG_FN_RESTORE_BGR8, "restore_bgr8"}, + {MNG_FN_RESTORE_BKGD, "restore_bkgd"}, + {MNG_FN_RESTORE_BGRX8, "restore_bgrx8"}, + {MNG_FN_RESTORE_RGB565, "restore_rgb565"}, + + {MNG_FN_INIT_IHDR, "init_ihdr"}, + {MNG_FN_INIT_PLTE, "init_plte"}, + {MNG_FN_INIT_IDAT, "init_idat"}, + {MNG_FN_INIT_IEND, "init_iend"}, + {MNG_FN_INIT_TRNS, "init_trns"}, + {MNG_FN_INIT_GAMA, "init_gama"}, + {MNG_FN_INIT_CHRM, "init_chrm"}, + {MNG_FN_INIT_SRGB, "init_srgb"}, + {MNG_FN_INIT_ICCP, "init_iccp"}, + {MNG_FN_INIT_TEXT, "init_text"}, + {MNG_FN_INIT_ZTXT, "init_ztxt"}, + {MNG_FN_INIT_ITXT, "init_itxt"}, + {MNG_FN_INIT_BKGD, "init_bkgd"}, + {MNG_FN_INIT_PHYS, "init_phys"}, + {MNG_FN_INIT_SBIT, "init_sbit"}, + {MNG_FN_INIT_SPLT, "init_splt"}, + {MNG_FN_INIT_HIST, "init_hist"}, + {MNG_FN_INIT_TIME, "init_time"}, + {MNG_FN_INIT_MHDR, "init_mhdr"}, + {MNG_FN_INIT_MEND, "init_mend"}, + {MNG_FN_INIT_LOOP, "init_loop"}, + {MNG_FN_INIT_ENDL, "init_endl"}, + {MNG_FN_INIT_DEFI, "init_defi"}, + {MNG_FN_INIT_BASI, "init_basi"}, + {MNG_FN_INIT_CLON, "init_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_INIT_PAST, "init_past"}, +#endif + {MNG_FN_INIT_DISC, "init_disc"}, + {MNG_FN_INIT_BACK, "init_back"}, + {MNG_FN_INIT_FRAM, "init_fram"}, + {MNG_FN_INIT_MOVE, "init_move"}, + {MNG_FN_INIT_CLIP, "init_clip"}, + {MNG_FN_INIT_SHOW, "init_show"}, + {MNG_FN_INIT_TERM, "init_term"}, + {MNG_FN_INIT_SAVE, "init_save"}, + {MNG_FN_INIT_SEEK, "init_seek"}, + {MNG_FN_INIT_EXPI, "init_expi"}, + {MNG_FN_INIT_FPRI, "init_fpri"}, + {MNG_FN_INIT_NEED, "init_need"}, + {MNG_FN_INIT_PHYG, "init_phyg"}, +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_INIT_JHDR, "init_jhdr"}, + {MNG_FN_INIT_JDAT, "init_jdat"}, + {MNG_FN_INIT_JSEP, "init_jsep"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_INIT_DHDR, "init_dhdr"}, + {MNG_FN_INIT_PROM, "init_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_INIT_IPNG, "init_ipng"}, +#endif + {MNG_FN_INIT_PPLT, "init_pplt"}, + {MNG_FN_INIT_IJNG, "init_ijng"}, + {MNG_FN_INIT_DROP, "init_drop"}, + {MNG_FN_INIT_DBYK, "init_dbyk"}, + {MNG_FN_INIT_ORDR, "init_ordr"}, +#endif + {MNG_FN_INIT_UNKNOWN, "init_unknown"}, + {MNG_FN_INIT_MAGN, "init_magn"}, + {MNG_FN_INIT_JDAA, "init_jdaa"}, + {MNG_FN_INIT_EVNT, "init_evnt"}, +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_INIT_MPNG, "init_mpng"}, +#endif + + {MNG_FN_ASSIGN_IHDR, "assign_ihdr"}, + {MNG_FN_ASSIGN_PLTE, "assign_plte"}, + {MNG_FN_ASSIGN_IDAT, "assign_idat"}, + {MNG_FN_ASSIGN_IEND, "assign_iend"}, + {MNG_FN_ASSIGN_TRNS, "assign_trns"}, + {MNG_FN_ASSIGN_GAMA, "assign_gama"}, + {MNG_FN_ASSIGN_CHRM, "assign_chrm"}, + {MNG_FN_ASSIGN_SRGB, "assign_srgb"}, + {MNG_FN_ASSIGN_ICCP, "assign_iccp"}, + {MNG_FN_ASSIGN_TEXT, "assign_text"}, + {MNG_FN_ASSIGN_ZTXT, "assign_ztxt"}, + {MNG_FN_ASSIGN_ITXT, "assign_itxt"}, + {MNG_FN_ASSIGN_BKGD, "assign_bkgd"}, + {MNG_FN_ASSIGN_PHYS, "assign_phys"}, + {MNG_FN_ASSIGN_SBIT, "assign_sbit"}, + {MNG_FN_ASSIGN_SPLT, "assign_splt"}, + {MNG_FN_ASSIGN_HIST, "assign_hist"}, + {MNG_FN_ASSIGN_TIME, "assign_time"}, + {MNG_FN_ASSIGN_MHDR, "assign_mhdr"}, + {MNG_FN_ASSIGN_MEND, "assign_mend"}, + {MNG_FN_ASSIGN_LOOP, "assign_loop"}, + {MNG_FN_ASSIGN_ENDL, "assign_endl"}, + {MNG_FN_ASSIGN_DEFI, "assign_defi"}, + {MNG_FN_ASSIGN_BASI, "assign_basi"}, + {MNG_FN_ASSIGN_CLON, "assign_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_ASSIGN_PAST, "assign_past"}, +#endif + {MNG_FN_ASSIGN_DISC, "assign_disc"}, + {MNG_FN_ASSIGN_BACK, "assign_back"}, + {MNG_FN_ASSIGN_FRAM, "assign_fram"}, + {MNG_FN_ASSIGN_MOVE, "assign_move"}, + {MNG_FN_ASSIGN_CLIP, "assign_clip"}, + {MNG_FN_ASSIGN_SHOW, "assign_show"}, + {MNG_FN_ASSIGN_TERM, "assign_term"}, + {MNG_FN_ASSIGN_SAVE, "assign_save"}, + {MNG_FN_ASSIGN_SEEK, "assign_seek"}, + {MNG_FN_ASSIGN_EXPI, "assign_expi"}, + {MNG_FN_ASSIGN_FPRI, "assign_fpri"}, + {MNG_FN_ASSIGN_NEED, "assign_need"}, + {MNG_FN_ASSIGN_PHYG, "assign_phyg"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_ASSIGN_JHDR, "assign_jhdr"}, + {MNG_FN_ASSIGN_JDAT, "assign_jdat"}, + {MNG_FN_ASSIGN_JSEP, "assign_jsep"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_ASSIGN_DHDR, "assign_dhdr"}, + {MNG_FN_ASSIGN_PROM, "assign_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_ASSIGN_IPNG, "assign_ipng"}, +#endif + {MNG_FN_ASSIGN_PPLT, "assign_pplt"}, + {MNG_FN_ASSIGN_IJNG, "assign_ijng"}, + {MNG_FN_ASSIGN_DROP, "assign_drop"}, + {MNG_FN_ASSIGN_DBYK, "assign_dbyk"}, + {MNG_FN_ASSIGN_ORDR, "assign_ordr"}, +#endif + {MNG_FN_ASSIGN_UNKNOWN, "assign_unknown"}, + {MNG_FN_ASSIGN_MAGN, "assign_magn"}, + {MNG_FN_ASSIGN_JDAA, "assign_jdaa"}, + {MNG_FN_ASSIGN_EVNT, "assign_evnt"}, +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_ASSIGN_MPNG, "assign_mpng"}, +#endif + + {MNG_FN_FREE_IHDR, "free_ihdr"}, + {MNG_FN_FREE_PLTE, "free_plte"}, + {MNG_FN_FREE_IDAT, "free_idat"}, + {MNG_FN_FREE_IEND, "free_iend"}, + {MNG_FN_FREE_TRNS, "free_trns"}, + {MNG_FN_FREE_GAMA, "free_gama"}, + {MNG_FN_FREE_CHRM, "free_chrm"}, + {MNG_FN_FREE_SRGB, "free_srgb"}, + {MNG_FN_FREE_ICCP, "free_iccp"}, + {MNG_FN_FREE_TEXT, "free_text"}, + {MNG_FN_FREE_ZTXT, "free_ztxt"}, + {MNG_FN_FREE_ITXT, "free_itxt"}, + {MNG_FN_FREE_BKGD, "free_bkgd"}, + {MNG_FN_FREE_PHYS, "free_phys"}, + {MNG_FN_FREE_SBIT, "free_sbit"}, + {MNG_FN_FREE_SPLT, "free_splt"}, + {MNG_FN_FREE_HIST, "free_hist"}, + {MNG_FN_FREE_TIME, "free_time"}, + {MNG_FN_FREE_MHDR, "free_mhdr"}, + {MNG_FN_FREE_MEND, "free_mend"}, + {MNG_FN_FREE_LOOP, "free_loop"}, + {MNG_FN_FREE_ENDL, "free_endl"}, + {MNG_FN_FREE_DEFI, "free_defi"}, + {MNG_FN_FREE_BASI, "free_basi"}, + {MNG_FN_FREE_CLON, "free_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_FREE_PAST, "free_past"}, +#endif + {MNG_FN_FREE_DISC, "free_disc"}, + {MNG_FN_FREE_BACK, "free_back"}, + {MNG_FN_FREE_FRAM, "free_fram"}, + {MNG_FN_FREE_MOVE, "free_move"}, + {MNG_FN_FREE_CLIP, "free_clip"}, + {MNG_FN_FREE_SHOW, "free_show"}, + {MNG_FN_FREE_TERM, "free_term"}, + {MNG_FN_FREE_SAVE, "free_save"}, + {MNG_FN_FREE_SEEK, "free_seek"}, + {MNG_FN_FREE_EXPI, "free_expi"}, + {MNG_FN_FREE_FPRI, "free_fpri"}, + {MNG_FN_FREE_NEED, "free_need"}, + {MNG_FN_FREE_PHYG, "free_phyg"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_FREE_JHDR, "free_jhdr"}, + {MNG_FN_FREE_JDAT, "free_jdat"}, + {MNG_FN_FREE_JSEP, "free_jsep"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_FREE_DHDR, "free_dhdr"}, + {MNG_FN_FREE_PROM, "free_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_FREE_IPNG, "free_ipng"}, +#endif + {MNG_FN_FREE_PPLT, "free_pplt"}, + {MNG_FN_FREE_IJNG, "free_ijng"}, + {MNG_FN_FREE_DROP, "free_drop"}, + {MNG_FN_FREE_DBYK, "free_dbyk"}, + {MNG_FN_FREE_ORDR, "free_ordr"}, +#endif + {MNG_FN_FREE_UNKNOWN, "free_unknown"}, + {MNG_FN_FREE_MAGN, "free_magn"}, + {MNG_FN_FREE_JDAA, "free_jdaa"}, + {MNG_FN_FREE_EVNT, "free_evnt"}, +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_FREE_MPNG, "free_mpng"}, +#endif + + {MNG_FN_READ_IHDR, "read_ihdr"}, + {MNG_FN_READ_PLTE, "read_plte"}, + {MNG_FN_READ_IDAT, "read_idat"}, + {MNG_FN_READ_IEND, "read_iend"}, + {MNG_FN_READ_TRNS, "read_trns"}, + {MNG_FN_READ_GAMA, "read_gama"}, + {MNG_FN_READ_CHRM, "read_chrm"}, + {MNG_FN_READ_SRGB, "read_srgb"}, + {MNG_FN_READ_ICCP, "read_iccp"}, + {MNG_FN_READ_TEXT, "read_text"}, + {MNG_FN_READ_ZTXT, "read_ztxt"}, + {MNG_FN_READ_ITXT, "read_itxt"}, + {MNG_FN_READ_BKGD, "read_bkgd"}, + {MNG_FN_READ_PHYS, "read_phys"}, + {MNG_FN_READ_SBIT, "read_sbit"}, + {MNG_FN_READ_SPLT, "read_splt"}, + {MNG_FN_READ_HIST, "read_hist"}, + {MNG_FN_READ_TIME, "read_time"}, + {MNG_FN_READ_MHDR, "read_mhdr"}, + {MNG_FN_READ_MEND, "read_mend"}, + {MNG_FN_READ_LOOP, "read_loop"}, + {MNG_FN_READ_ENDL, "read_endl"}, + {MNG_FN_READ_DEFI, "read_defi"}, + {MNG_FN_READ_BASI, "read_basi"}, + {MNG_FN_READ_CLON, "read_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_READ_PAST, "read_past"}, +#endif + {MNG_FN_READ_DISC, "read_disc"}, + {MNG_FN_READ_BACK, "read_back"}, + {MNG_FN_READ_FRAM, "read_fram"}, + {MNG_FN_READ_MOVE, "read_move"}, + {MNG_FN_READ_CLIP, "read_clip"}, + {MNG_FN_READ_SHOW, "read_show"}, + {MNG_FN_READ_TERM, "read_term"}, + {MNG_FN_READ_SAVE, "read_save"}, + {MNG_FN_READ_SEEK, "read_seek"}, + {MNG_FN_READ_EXPI, "read_expi"}, + {MNG_FN_READ_FPRI, "read_fpri"}, + {MNG_FN_READ_NEED, "read_need"}, + {MNG_FN_READ_PHYG, "read_phyg"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_READ_JHDR, "read_jhdr"}, + {MNG_FN_READ_JDAT, "read_jdat"}, + {MNG_FN_READ_JSEP, "read_jsep"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_READ_DHDR, "read_dhdr"}, + {MNG_FN_READ_PROM, "read_prom"}, + {MNG_FN_READ_IPNG, "read_ipng"}, + {MNG_FN_READ_PPLT, "read_pplt"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_READ_IJNG, "read_ijng"}, +#endif + {MNG_FN_READ_DROP, "read_drop"}, + {MNG_FN_READ_DBYK, "read_dbyk"}, + {MNG_FN_READ_ORDR, "read_ordr"}, +#endif + {MNG_FN_READ_UNKNOWN, "read_unknown"}, + {MNG_FN_READ_MAGN, "read_magn"}, + {MNG_FN_READ_JDAA, "read_jdaa"}, + {MNG_FN_READ_EVNT, "read_evnt"}, +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_READ_MPNG, "read_mpng"}, +#endif + + {MNG_FN_WRITE_IHDR, "write_ihdr"}, + {MNG_FN_WRITE_PLTE, "write_plte"}, + {MNG_FN_WRITE_IDAT, "write_idat"}, + {MNG_FN_WRITE_IEND, "write_iend"}, + {MNG_FN_WRITE_TRNS, "write_trns"}, + {MNG_FN_WRITE_GAMA, "write_gama"}, + {MNG_FN_WRITE_CHRM, "write_chrm"}, + {MNG_FN_WRITE_SRGB, "write_srgb"}, + {MNG_FN_WRITE_ICCP, "write_iccp"}, + {MNG_FN_WRITE_TEXT, "write_text"}, + {MNG_FN_WRITE_ZTXT, "write_ztxt"}, + {MNG_FN_WRITE_ITXT, "write_itxt"}, + {MNG_FN_WRITE_BKGD, "write_bkgd"}, + {MNG_FN_WRITE_PHYS, "write_phys"}, + {MNG_FN_WRITE_SBIT, "write_sbit"}, + {MNG_FN_WRITE_SPLT, "write_splt"}, + {MNG_FN_WRITE_HIST, "write_hist"}, + {MNG_FN_WRITE_TIME, "write_time"}, + {MNG_FN_WRITE_MHDR, "write_mhdr"}, + {MNG_FN_WRITE_MEND, "write_mend"}, + {MNG_FN_WRITE_LOOP, "write_loop"}, + {MNG_FN_WRITE_ENDL, "write_endl"}, + {MNG_FN_WRITE_DEFI, "write_defi"}, + {MNG_FN_WRITE_BASI, "write_basi"}, + {MNG_FN_WRITE_CLON, "write_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_WRITE_PAST, "write_past"}, +#endif + {MNG_FN_WRITE_DISC, "write_disc"}, + {MNG_FN_WRITE_BACK, "write_back"}, + {MNG_FN_WRITE_FRAM, "write_fram"}, + {MNG_FN_WRITE_MOVE, "write_move"}, + {MNG_FN_WRITE_CLIP, "write_clip"}, + {MNG_FN_WRITE_SHOW, "write_show"}, + {MNG_FN_WRITE_TERM, "write_term"}, + {MNG_FN_WRITE_SAVE, "write_save"}, + {MNG_FN_WRITE_SEEK, "write_seek"}, + {MNG_FN_WRITE_EXPI, "write_expi"}, + {MNG_FN_WRITE_FPRI, "write_fpri"}, + {MNG_FN_WRITE_NEED, "write_need"}, + {MNG_FN_WRITE_PHYG, "write_phyg"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_WRITE_JHDR, "write_jhdr"}, + {MNG_FN_WRITE_JDAT, "write_jdat"}, + {MNG_FN_WRITE_JSEP, "write_jsep"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_WRITE_DHDR, "write_dhdr"}, + {MNG_FN_WRITE_PROM, "write_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_WRITE_IPNG, "write_ipng"}, +#endif + {MNG_FN_WRITE_PPLT, "write_pplt"}, + {MNG_FN_WRITE_IJNG, "write_ijng"}, + {MNG_FN_WRITE_DROP, "write_drop"}, + {MNG_FN_WRITE_DBYK, "write_dbyk"}, + {MNG_FN_WRITE_ORDR, "write_ordr"}, +#endif + {MNG_FN_WRITE_UNKNOWN, "write_unknown"}, + {MNG_FN_WRITE_MAGN, "write_magn"}, + {MNG_FN_WRITE_JDAA, "write_jdaa"}, + {MNG_FN_WRITE_EVNT, "write_evnt"}, +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + {MNG_FN_WRITE_MPNG, "write_mpng"}, +#endif + + {MNG_FN_ZLIB_INITIALIZE, "zlib_initialize"}, + {MNG_FN_ZLIB_CLEANUP, "zlib_cleanup"}, + {MNG_FN_ZLIB_INFLATEINIT, "zlib_inflateinit"}, + {MNG_FN_ZLIB_INFLATEROWS, "zlib_inflaterows"}, + {MNG_FN_ZLIB_INFLATEDATA, "zlib_inflatedata"}, + {MNG_FN_ZLIB_INFLATEFREE, "zlib_inflatefree"}, + {MNG_FN_ZLIB_DEFLATEINIT, "zlib_deflateinit"}, + {MNG_FN_ZLIB_DEFLATEROWS, "zlib_deflaterows"}, + {MNG_FN_ZLIB_DEFLATEDATA, "zlib_deflatedata"}, + {MNG_FN_ZLIB_DEFLATEFREE, "zlib_deflatefree"}, + + {MNG_FN_PROCESS_DISPLAY_IHDR, "process_display_ihdr"}, + {MNG_FN_PROCESS_DISPLAY_PLTE, "process_display_plte"}, + {MNG_FN_PROCESS_DISPLAY_IDAT, "process_display_idat"}, + {MNG_FN_PROCESS_DISPLAY_IEND, "process_display_iend"}, + {MNG_FN_PROCESS_DISPLAY_TRNS, "process_display_trns"}, + {MNG_FN_PROCESS_DISPLAY_GAMA, "process_display_gama"}, + {MNG_FN_PROCESS_DISPLAY_CHRM, "process_display_chrm"}, + {MNG_FN_PROCESS_DISPLAY_SRGB, "process_display_srgb"}, + {MNG_FN_PROCESS_DISPLAY_ICCP, "process_display_iccp"}, + {MNG_FN_PROCESS_DISPLAY_BKGD, "process_display_bkgd"}, + {MNG_FN_PROCESS_DISPLAY_PHYS, "process_display_phys"}, + {MNG_FN_PROCESS_DISPLAY_SBIT, "process_display_sbit"}, + {MNG_FN_PROCESS_DISPLAY_SPLT, "process_display_splt"}, + {MNG_FN_PROCESS_DISPLAY_HIST, "process_display_hist"}, + {MNG_FN_PROCESS_DISPLAY_MHDR, "process_display_mhdr"}, + {MNG_FN_PROCESS_DISPLAY_MEND, "process_display_mend"}, + {MNG_FN_PROCESS_DISPLAY_LOOP, "process_display_loop"}, + {MNG_FN_PROCESS_DISPLAY_ENDL, "process_display_endl"}, + {MNG_FN_PROCESS_DISPLAY_DEFI, "process_display_defi"}, + {MNG_FN_PROCESS_DISPLAY_BASI, "process_display_basi"}, + {MNG_FN_PROCESS_DISPLAY_CLON, "process_display_clon"}, +#ifndef MNG_SKIPCHUNK_PAST + {MNG_FN_PROCESS_DISPLAY_PAST, "process_display_past"}, +#endif + {MNG_FN_PROCESS_DISPLAY_DISC, "process_display_disc"}, + {MNG_FN_PROCESS_DISPLAY_BACK, "process_display_back"}, + {MNG_FN_PROCESS_DISPLAY_FRAM, "process_display_fram"}, + {MNG_FN_PROCESS_DISPLAY_MOVE, "process_display_move"}, + {MNG_FN_PROCESS_DISPLAY_CLIP, "process_display_clip"}, + {MNG_FN_PROCESS_DISPLAY_SHOW, "process_display_show"}, + {MNG_FN_PROCESS_DISPLAY_TERM, "process_display_term"}, + {MNG_FN_PROCESS_DISPLAY_SAVE, "process_display_save"}, + {MNG_FN_PROCESS_DISPLAY_SEEK, "process_display_seek"}, + {MNG_FN_PROCESS_DISPLAY_EXPI, "process_display_expi"}, + {MNG_FN_PROCESS_DISPLAY_FPRI, "process_display_fpri"}, + {MNG_FN_PROCESS_DISPLAY_NEED, "process_display_need"}, + {MNG_FN_PROCESS_DISPLAY_PHYG, "process_display_phyg"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_PROCESS_DISPLAY_JHDR, "process_display_jhdr"}, + {MNG_FN_PROCESS_DISPLAY_JDAT, "process_display_jdat"}, + {MNG_FN_PROCESS_DISPLAY_JSEP, "process_display_jsep"}, +#endif +#ifndef MNG_NO_DELTA_PNG + {MNG_FN_PROCESS_DISPLAY_DHDR, "process_display_dhdr"}, + {MNG_FN_PROCESS_DISPLAY_PROM, "process_display_prom"}, +#ifdef MNG_INCLUDE_JNG + {MNG_FN_PROCESS_DISPLAY_IPNG, "process_display_ipng"}, +#endif + {MNG_FN_PROCESS_DISPLAY_PPLT, "process_display_pplt"}, + {MNG_FN_PROCESS_DISPLAY_IJNG, "process_display_ijng"}, + {MNG_FN_PROCESS_DISPLAY_DROP, "process_display_drop"}, + {MNG_FN_PROCESS_DISPLAY_DBYK, "process_display_dbyk"}, + {MNG_FN_PROCESS_DISPLAY_ORDR, "process_display_ordr"}, +#endif + {MNG_FN_PROCESS_DISPLAY_MAGN, "process_display_magn"}, + {MNG_FN_PROCESS_DISPLAY_JDAA, "process_display_jdaa"}, + + {MNG_FN_JPEG_INITIALIZE, "jpeg_initialize"}, + {MNG_FN_JPEG_CLEANUP, "jpeg_cleanup"}, + {MNG_FN_JPEG_DECOMPRESSINIT, "jpeg_decompressinit"}, + {MNG_FN_JPEG_DECOMPRESSDATA, "jpeg_decompressdata"}, + {MNG_FN_JPEG_DECOMPRESSFREE, "jpeg_decompressfree"}, + + {MNG_FN_STORE_JPEG_G8, "store_jpeg_g8"}, + {MNG_FN_STORE_JPEG_RGB8, "store_jpeg_rgb8"}, + {MNG_FN_STORE_JPEG_G12, "store_jpeg_g12"}, + {MNG_FN_STORE_JPEG_RGB12, "store_jpeg_rgb12"}, + {MNG_FN_STORE_JPEG_GA8, "store_jpeg_ga8"}, + {MNG_FN_STORE_JPEG_RGBA8, "store_jpeg_rgba8"}, + {MNG_FN_STORE_JPEG_GA12, "store_jpeg_ga12"}, + {MNG_FN_STORE_JPEG_RGBA12, "store_jpeg_rgba12"}, + {MNG_FN_STORE_JPEG_G8_ALPHA, "store_jpeg_g8_alpha"}, + {MNG_FN_STORE_JPEG_RGB8_ALPHA, "store_jpeg_rgb8_alpha"}, + + {MNG_FN_INIT_JPEG_A1_NI, "init_jpeg_a1_ni"}, + {MNG_FN_INIT_JPEG_A2_NI, "init_jpeg_a2_ni"}, + {MNG_FN_INIT_JPEG_A4_NI, "init_jpeg_a4_ni"}, + {MNG_FN_INIT_JPEG_A8_NI, "init_jpeg_a8_ni"}, + {MNG_FN_INIT_JPEG_A16_NI, "init_jpeg_a16_ni"}, + + {MNG_FN_STORE_JPEG_G8_A1, "store_jpeg_g8_a1"}, + {MNG_FN_STORE_JPEG_G8_A2, "store_jpeg_g8_a2"}, + {MNG_FN_STORE_JPEG_G8_A4, "store_jpeg_g8_a4"}, + {MNG_FN_STORE_JPEG_G8_A8, "store_jpeg_g8_a8"}, + {MNG_FN_STORE_JPEG_G8_A16, "store_jpeg_g8_a16"}, + + {MNG_FN_STORE_JPEG_RGB8_A1, "store_jpeg_rgb8_a1"}, + {MNG_FN_STORE_JPEG_RGB8_A2, "store_jpeg_rgb8_a2"}, + {MNG_FN_STORE_JPEG_RGB8_A4, "store_jpeg_rgb8_a4"}, + {MNG_FN_STORE_JPEG_RGB8_A8, "store_jpeg_rgb8_a8"}, + {MNG_FN_STORE_JPEG_RGB8_A16, "store_jpeg_rgb8_a16"}, + + {MNG_FN_STORE_JPEG_G12_A1, "store_jpeg_g12_a1"}, + {MNG_FN_STORE_JPEG_G12_A2, "store_jpeg_g12_a2"}, + {MNG_FN_STORE_JPEG_G12_A4, "store_jpeg_g12_a4"}, + {MNG_FN_STORE_JPEG_G12_A8, "store_jpeg_g12_a8"}, + {MNG_FN_STORE_JPEG_G12_A16, "store_jpeg_g12_a16"}, + + {MNG_FN_STORE_JPEG_RGB12_A1, "store_jpeg_rgb12_a1"}, + {MNG_FN_STORE_JPEG_RGB12_A2, "store_jpeg_rgb12_a2"}, + {MNG_FN_STORE_JPEG_RGB12_A4, "store_jpeg_rgb12_a4"}, + {MNG_FN_STORE_JPEG_RGB12_A8, "store_jpeg_rgb12_a8"}, + {MNG_FN_STORE_JPEG_RGB12_A16, "store_jpeg_rgb12_a16"}, + + {MNG_FN_NEXT_JPEG_ALPHAROW, "next_jpeg_alpharow"}, + {MNG_FN_NEXT_JPEG_ROW, "next_jpeg_row"}, + {MNG_FN_DISPLAY_JPEG_ROWS, "display_jpeg_rows"}, + + {MNG_FN_MAGNIFY_G8_X1, "magnify_g8_x1"}, + {MNG_FN_MAGNIFY_G8_X2, "magnify_g8_x2"}, + {MNG_FN_MAGNIFY_RGB8_X1, "magnify_rgb8_x1"}, + {MNG_FN_MAGNIFY_RGB8_X2, "magnify_rgb8_x2"}, + {MNG_FN_MAGNIFY_GA8_X1, "magnify_ga8_x1"}, + {MNG_FN_MAGNIFY_GA8_X2, "magnify_ga8_x2"}, + {MNG_FN_MAGNIFY_GA8_X3, "magnify_ga8_x3"}, + {MNG_FN_MAGNIFY_GA8_X4, "magnify_ga8_x4"}, + {MNG_FN_MAGNIFY_RGBA8_X1, "magnify_rgba8_x1"}, + {MNG_FN_MAGNIFY_RGBA8_X2, "magnify_rgba8_x2"}, + {MNG_FN_MAGNIFY_RGBA8_X3, "magnify_rgba8_x3"}, + {MNG_FN_MAGNIFY_RGBA8_X4, "magnify_rgba8_x4"}, + {MNG_FN_MAGNIFY_G8_X3, "magnify_g8_x3"}, + {MNG_FN_MAGNIFY_RGB8_X3, "magnify_rgb8_x3"}, + {MNG_FN_MAGNIFY_GA8_X5, "magnify_ga8_x5"}, + {MNG_FN_MAGNIFY_RGBA8_X5, "magnify_rgba8_x5"}, + + {MNG_FN_MAGNIFY_G8_Y1, "magnify_g8_y1"}, + {MNG_FN_MAGNIFY_G8_Y2, "magnify_g8_y2"}, + {MNG_FN_MAGNIFY_RGB8_Y1, "magnify_rgb8_y1"}, + {MNG_FN_MAGNIFY_RGB8_Y2, "magnify_rgb8_y2"}, + {MNG_FN_MAGNIFY_GA8_Y1, "magnify_ga8_y1"}, + {MNG_FN_MAGNIFY_GA8_Y2, "magnify_ga8_y2"}, + {MNG_FN_MAGNIFY_GA8_Y3, "magnify_ga8_y3"}, + {MNG_FN_MAGNIFY_GA8_Y4, "magnify_ga8_y4"}, + {MNG_FN_MAGNIFY_RGBA8_Y1, "magnify_rgba8_y1"}, + {MNG_FN_MAGNIFY_RGBA8_Y2, "magnify_rgba8_y2"}, + {MNG_FN_MAGNIFY_RGBA8_Y3, "magnify_rgba8_y3"}, + {MNG_FN_MAGNIFY_RGBA8_Y4, "magnify_rgba8_y4"}, + {MNG_FN_MAGNIFY_G8_Y3, "magnify_g8_y3"}, + {MNG_FN_MAGNIFY_RGB8_Y3, "magnify_rgb8_y3"}, + {MNG_FN_MAGNIFY_GA8_Y5, "magnify_ga8_y5"}, + {MNG_FN_MAGNIFY_RGBA8_Y5, "magnify_rgba8_y5"}, + + {MNG_FN_MAGNIFY_G8_X1, "magnify_g8_x1"}, + {MNG_FN_MAGNIFY_G8_X2, "magnify_g8_x2"}, + {MNG_FN_MAGNIFY_RGB8_X1, "magnify_rgb8_x1"}, + {MNG_FN_MAGNIFY_RGB8_X2, "magnify_rgb8_x2"}, + {MNG_FN_MAGNIFY_GA8_X1, "magnify_ga8_x1"}, + {MNG_FN_MAGNIFY_GA8_X2, "magnify_ga8_x2"}, + {MNG_FN_MAGNIFY_GA8_X3, "magnify_ga8_x3"}, + {MNG_FN_MAGNIFY_GA8_X4, "magnify_ga8_x4"}, + {MNG_FN_MAGNIFY_RGBA8_X1, "magnify_rgba8_x1"}, + {MNG_FN_MAGNIFY_RGBA8_X2, "magnify_rgba8_x2"}, + {MNG_FN_MAGNIFY_RGBA8_X3, "magnify_rgba8_x3"}, + {MNG_FN_MAGNIFY_RGBA8_X4, "magnify_rgba8_x4"}, + {MNG_FN_MAGNIFY_G8_X3, "magnify_g8_x3"}, + {MNG_FN_MAGNIFY_RGB8_X3, "magnify_rgb8_x3"}, + {MNG_FN_MAGNIFY_GA8_X5, "magnify_ga8_x5"}, + {MNG_FN_MAGNIFY_RGBA8_X5, "magnify_rgba8_x5"}, + + {MNG_FN_MAGNIFY_G8_Y1, "magnify_g8_y1"}, + {MNG_FN_MAGNIFY_G8_Y2, "magnify_g8_y2"}, + {MNG_FN_MAGNIFY_RGB8_Y1, "magnify_rgb8_y1"}, + {MNG_FN_MAGNIFY_RGB8_Y2, "magnify_rgb8_y2"}, + {MNG_FN_MAGNIFY_GA8_Y1, "magnify_ga8_y1"}, + {MNG_FN_MAGNIFY_GA8_Y2, "magnify_ga8_y2"}, + {MNG_FN_MAGNIFY_GA8_Y3, "magnify_ga8_y3"}, + {MNG_FN_MAGNIFY_GA8_Y4, "magnify_ga8_y4"}, + {MNG_FN_MAGNIFY_RGBA8_Y1, "magnify_rgba8_y1"}, + {MNG_FN_MAGNIFY_RGBA8_Y2, "magnify_rgba8_y2"}, + {MNG_FN_MAGNIFY_RGBA8_Y3, "magnify_rgba8_y3"}, + {MNG_FN_MAGNIFY_RGBA8_Y4, "magnify_rgba8_y4"}, + {MNG_FN_MAGNIFY_G8_Y3, "magnify_g8_y3"}, + {MNG_FN_MAGNIFY_RGB8_Y3, "magnify_rgb8_y3"}, + {MNG_FN_MAGNIFY_GA8_Y5, "magnify_ga8_y5"}, + {MNG_FN_MAGNIFY_RGBA8_Y5, "magnify_rgba8_y5"}, + + {MNG_FN_DELTA_G1_G1, "delta_g1_g1"}, + {MNG_FN_DELTA_G2_G2, "delta_g2_g2"}, + {MNG_FN_DELTA_G4_G4, "delta_g4_g4"}, + {MNG_FN_DELTA_G8_G8, "delta_g8_g8"}, + {MNG_FN_DELTA_G16_G16, "delta_g16_g16"}, + {MNG_FN_DELTA_RGB8_RGB8, "delta_rgb8_rgb8"}, + {MNG_FN_DELTA_RGB16_RGB16, "delta_rgb16_rgb16"}, + {MNG_FN_DELTA_GA8_GA8, "delta_ga8_ga8"}, + {MNG_FN_DELTA_GA8_G8, "delta_ga8_g8"}, + {MNG_FN_DELTA_GA8_A8, "delta_ga8_a8"}, + {MNG_FN_DELTA_GA16_GA16, "delta_ga16_ga16"}, + {MNG_FN_DELTA_GA16_G16, "delta_ga16_g16"}, + {MNG_FN_DELTA_GA16_A16, "delta_ga16_a16"}, + {MNG_FN_DELTA_RGBA8_RGBA8, "delta_rgba8_rgba8"}, + {MNG_FN_DELTA_RGBA8_RGB8, "delta_rgba8_rgb8"}, + {MNG_FN_DELTA_RGBA8_A8, "delta_rgba8_a8"}, + {MNG_FN_DELTA_RGBA16_RGBA16, "delta_rgba16_rgba16"}, + {MNG_FN_DELTA_RGBA16_RGB16, "delta_rgba16_rgb16"}, + {MNG_FN_DELTA_RGBA16_A16, "delta_rgba16_a16"}, + + {MNG_FN_PROMOTE_G8_G8, "promote_g8_g8"}, + {MNG_FN_PROMOTE_G8_G16, "promote_g8_g16"}, + {MNG_FN_PROMOTE_G16_G16, "promote_g8_g16"}, + {MNG_FN_PROMOTE_G8_GA8, "promote_g8_ga8"}, + {MNG_FN_PROMOTE_G8_GA16, "promote_g8_ga16"}, + {MNG_FN_PROMOTE_G16_GA16, "promote_g16_ga16"}, + {MNG_FN_PROMOTE_G8_RGB8, "promote_g8_rgb8"}, + {MNG_FN_PROMOTE_G8_RGB16, "promote_g8_rgb16"}, + {MNG_FN_PROMOTE_G16_RGB16, "promote_g16_rgb16"}, + {MNG_FN_PROMOTE_G8_RGBA8, "promote_g8_rgba8"}, + {MNG_FN_PROMOTE_G8_RGBA16, "promote_g8_rgba16"}, + {MNG_FN_PROMOTE_G16_RGBA16, "promote_g16_rgba16"}, + {MNG_FN_PROMOTE_GA8_GA16, "promote_ga8_ga16"}, + {MNG_FN_PROMOTE_GA8_RGBA8, "promote_ga8_rgba8"}, + {MNG_FN_PROMOTE_GA8_RGBA16, "promote_ga8_rgba16"}, + {MNG_FN_PROMOTE_GA16_RGBA16, "promote_ga16_rgba16"}, + {MNG_FN_PROMOTE_RGB8_RGB16, "promote_rgb8_rgb16"}, + {MNG_FN_PROMOTE_RGB8_RGBA8, "promote_rgb8_rgba8"}, + {MNG_FN_PROMOTE_RGB8_RGBA16, "promote_rgb8_rgba16"}, + {MNG_FN_PROMOTE_RGB16_RGBA16, "promote_rgb16_rgba16"}, + {MNG_FN_PROMOTE_RGBA8_RGBA16, "promote_rgba8_rgba16"}, + {MNG_FN_PROMOTE_IDX8_RGB8, "promote_idx8_rgb8"}, + {MNG_FN_PROMOTE_IDX8_RGB16, "promote_idx8_rgb16"}, + {MNG_FN_PROMOTE_IDX8_RGBA8, "promote_idx8_rgba8"}, + {MNG_FN_PROMOTE_IDX8_RGBA16, "promote_idx8_rgba16"}, + + {MNG_FN_SCALE_G1_G2, "scale_g1_g2"}, + {MNG_FN_SCALE_G1_G4, "scale_g1_g4"}, + {MNG_FN_SCALE_G1_G8, "scale_g1_g8"}, + {MNG_FN_SCALE_G1_G16, "scale_g1_g16"}, + {MNG_FN_SCALE_G2_G4, "scale_g2_g4"}, + {MNG_FN_SCALE_G2_G8, "scale_g2_g8"}, + {MNG_FN_SCALE_G2_G16, "scale_g2_g16"}, + {MNG_FN_SCALE_G4_G8, "scale_g4_g8"}, + {MNG_FN_SCALE_G4_G16, "scale_g4_g16"}, + {MNG_FN_SCALE_G8_G16, "scale_g8_g16"}, + {MNG_FN_SCALE_GA8_GA16, "scale_ga8_ga16"}, + {MNG_FN_SCALE_RGB8_RGB16, "scale_rgb8_rgb16"}, + {MNG_FN_SCALE_RGBA8_RGBA16, "scale_rgba8_rgba16"}, + + {MNG_FN_SCALE_G2_G1, "scale_g2_g1"}, + {MNG_FN_SCALE_G4_G1, "scale_g4_g1"}, + {MNG_FN_SCALE_G8_G1, "scale_g8_g1"}, + {MNG_FN_SCALE_G16_G1, "scale_g16_g1"}, + {MNG_FN_SCALE_G4_G2, "scale_g4_g2"}, + {MNG_FN_SCALE_G8_G2, "scale_g8_g2"}, + {MNG_FN_SCALE_G16_G2, "scale_g16_g2"}, + {MNG_FN_SCALE_G8_G4, "scale_g8_g4"}, + {MNG_FN_SCALE_G16_G4, "scale_g16_g4"}, + {MNG_FN_SCALE_G16_G8, "scale_g16_g8"}, + {MNG_FN_SCALE_GA16_GA8, "scale_ga16_ga8"}, + {MNG_FN_SCALE_RGB16_RGB8, "scale_rgb16_rgb8"}, + {MNG_FN_SCALE_RGBA16_RGBA8, "scale_rgba16_rgba8"}, + + {MNG_FN_COMPOSEOVER_RGBA8, "composeover_rgba8"}, + {MNG_FN_COMPOSEOVER_RGBA16, "composeover_rgba16"}, + {MNG_FN_COMPOSEUNDER_RGBA8, "composeunder_rgba8"}, + {MNG_FN_COMPOSEUNDER_RGBA16, "composeunder_rgba16"}, + + {MNG_FN_FLIP_RGBA8, "flip_rgba8"}, + {MNG_FN_FLIP_RGBA16, "flip_rgba16"}, + {MNG_FN_TILE_RGBA8, "tile_rgba8"}, + {MNG_FN_TILE_RGBA16, "tile_rgba16"} + + }; +#endif /* MNG_INCLUDE_TRACE_STINGS */ + +/* ************************************************************************** */ + +mng_retcode mng_trace (mng_datap pData, + mng_uint32 iFunction, + mng_uint32 iLocation) +{ + mng_pchar zName = 0; /* bufferptr for tracestring */ + + if ((pData == 0) || (pData->iMagic != MNG_MAGIC)) + return MNG_INVALIDHANDLE; /* no good if the handle is corrupt */ + + if (pData->fTraceproc) /* report back to user ? */ + { +#ifdef MNG_INCLUDE_TRACE_STRINGS + { /* binary search variables */ + mng_int32 iTop, iLower, iUpper, iMiddle; + mng_trace_entryp pEntry; /* pointer to found entry */ + /* determine max index of table */ + iTop = (sizeof (trace_table) / sizeof (trace_table [0])) - 1; + + iLower = 0; /* initialize binary search */ + iMiddle = iTop >> 1; /* start in the middle */ + iUpper = iTop; + pEntry = 0; /* no goods yet! */ + + do /* the binary search itself */ + { + if (trace_table [iMiddle].iFunction < iFunction) + iLower = iMiddle + 1; + else if (trace_table [iMiddle].iFunction > iFunction) + iUpper = iMiddle - 1; + else + { + pEntry = &trace_table [iMiddle]; + break; + }; + + iMiddle = (iLower + iUpper) >> 1; + } + while (iLower <= iUpper); + + if (pEntry) /* found it ? */ + zName = pEntry->zTracetext; + + } +#endif + /* oke, now tell */ + if (!pData->fTraceproc (((mng_handle)pData), iFunction, iLocation, zName)) + return MNG_APPTRACEABORT; + + } + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_TRACE_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_trace.h b/src/3rdparty/libmng/libmng_trace.h new file mode 100644 index 0000000000..0c749d978f --- /dev/null +++ b/src/3rdparty/libmng/libmng_trace.h @@ -0,0 +1,1474 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_trace.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : Trace functions (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the trace functions * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - added chunk-access function trace-codes * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * 0.5.1 - 05/13/2000 - G.Juyn * */ +/* * - added save_state & restore_state trace-codes * */ +/* * 0.5.1 - 05/15/2000 - G.Juyn * */ +/* * - added getimgdata & putimgdata trace-codes * */ +/* * * */ +/* * 0.5.2 - 05/20/2000 - G.Juyn * */ +/* * - added JNG tracecodes * */ +/* * 0.5.2 - 05/23/2000 - G.Juyn * */ +/* * - added trace-table entry definition * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added tracecodes for global animation color-chunks * */ +/* * - added tracecodes for get/set of default ZLIB/IJG parms * */ +/* * - added tracecodes for global PLTE,tRNS,bKGD * */ +/* * 0.5.2 - 05/30/2000 - G.Juyn * */ +/* * - added tracecodes for image-object promotion * */ +/* * - added tracecodes for delta-image processing * */ +/* * 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - added tracecodes for getalphaline callback * */ +/* * 0.5.2 - 06/05/2000 - G.Juyn * */ +/* * - added tracecode for RGB8_A8 canvasstyle * */ +/* * 0.5.2 - 06/06/2000 - G.Juyn * */ +/* * - added tracecode for mng_read_resume HLAPI function * */ +/* * * */ +/* * 0.5.3 - 06/06/2000 - G.Juyn * */ +/* * - added tracecodes for tracing JPEG progression * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added tracecodes for get/set speedtype * */ +/* * - added tracecodes for get imagelevel * */ +/* * 0.5.3 - 06/22/2000 - G.Juyn * */ +/* * - added tracecode for delta-image processing * */ +/* * - added tracecodes for PPLT chunk processing * */ +/* * * */ +/* * 0.9.1 - 07/07/2000 - G.Juyn * */ +/* * - added tracecodes for special display processing * */ +/* * 0.9.1 - 07/08/2000 - G.Juyn * */ +/* * - added tracecode for get/set suspensionmode * */ +/* * - added tracecodes for get/set display variables * */ +/* * - added tracecode for read_databuffer (I/O-suspension) * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added tracecodes for SAVE/SEEK callbacks * */ +/* * - added tracecodes for get/set sectionbreaks * */ +/* * - added tracecode for special error routine * */ +/* * 0.9.1 - 07/19/2000 - G.Juyn * */ +/* * - added tracecode for updatemngheader * */ +/* * * */ +/* * 0.9.2 - 07/31/2000 - G.Juyn * */ +/* * - added tracecodes for status_xxxxx functions * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * - added tracecode for updatemngsimplicity * */ +/* * * */ +/* * 0.9.3 - 08/26/2000 - G.Juyn * */ +/* * - added MAGN chunk * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * 0.9.3 - 10/10/2000 - G.Juyn * */ +/* * - added support for alpha-depth prediction * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - added JDAA chunk * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/16/2000 - G.Juyn * */ +/* * - added functions to retrieve PNG/JNG specific header-info * */ +/* * - added optional support for bKGD for PNG images * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added callback to process non-critical unknown chunks * */ +/* * - added routine to discard "invalid" objects * */ +/* * 0.9.3 - 10/19/2000 - G.Juyn * */ +/* * - implemented delayed delta-processing * */ +/* * 0.9.3 - 10/20/2000 - G.Juyn * */ +/* * - added get/set for bKGD preference setting * */ +/* * 0.9.3 - 10/21/2000 - G.Juyn * */ +/* * - added get function for interlace/progressive display * */ +/* * * */ +/* * 0.9.4 - 1/18/2001 - G.Juyn * */ +/* * - added "new" MAGN methods 3, 4 & 5 * */ +/* * * */ +/* * 1.0.1 - 02/08/2001 - G.Juyn * */ +/* * - added MEND processing callback * */ +/* * 1.0.1 - 04/21/2001 - G.Juyn (code by G.Kelly) * */ +/* * - added BGRA8 canvas with premultiplied alpha * */ +/* * 1.0.1 - 05/02/2001 - G.Juyn * */ +/* * - added "default" sRGB generation (Thanks Marti!) * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added optimization option for MNG-video playback * */ +/* * - added processterm callback * */ +/* * 1.0.2 - 06/25/2001 - G.Juyn * */ +/* * - added option to turn off progressive refresh * */ +/* * * */ +/* * 1.0.3 - 08/06/2001 - G.Juyn * */ +/* * - added get function for last processed BACK chunk * */ +/* * * */ +/* * 1.0.5 - 08/15/2002 - G.Juyn * */ +/* * - completed PROM support * */ +/* * - completed delta-image support * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * - added HLAPI function to copy chunks * */ +/* * 1.0.5 - 09/14/2002 - G.Juyn * */ +/* * - added event handling for dynamic MNG * */ +/* * 1.0.5 - 09/20/2002 - G.Juyn * */ +/* * - added support for PAST * */ +/* * 1.0.5 - 09/22/2002 - G.Juyn * */ +/* * - added bgrx8 canvas (filler byte) * */ +/* * 1.0.5 - 09/23/2002 - G.Juyn * */ +/* * - added in-memory color-correction of abstract images * */ +/* * - added compose over/under routines for PAST processing * */ +/* * - added flip & tile routines for PAST processing * */ +/* * 1.0.5 - 10/09/2002 - G.Juyn * */ +/* * - fixed trace-constants for PAST chunk * */ +/* * 1.0.5 - 11/07/2002 - G.Juyn * */ +/* * - added support to get totals after mng_read() * */ +/* * * */ +/* * 1.0.6 - 07/14/2003 - G.Randers-Pehrson * */ +/* * - added conditionals around rarely used features * */ +/* * * */ +/* * 1.0.7 - 11/27/2003 - R.A * */ +/* * - added CANVAS_RGB565 and CANVAS_BGR565 * */ +/* * 1.0.7 - 01/25/2004 - J.S * */ +/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */ +/* * 1.0.7 - 03/10/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * * */ +/* * 1.0.8 - 04/02/2004 - G.Juyn * */ +/* * - added CRC existence & checking flags * */ +/* * 1.0.8 - 04/11/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * * */ +/* * 1.0.9 - 10/03/2004 - G.Juyn * */ +/* * - added function to retrieve current FRAM delay * */ +/* * 1.0.9 - 10/14/2004 - G.Juyn * */ +/* * - added bgr565_a8 canvas-style (thanks to J. Elvander) * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 07/06/2007 - G.R-P bugfix by Lucas Quintana * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_trace_h_ +#define _libmng_trace_h_ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_TRACE_PROCS + +/* ************************************************************************** */ + +/* TODO: add a trace-mask so certain functions can be excluded */ + +mng_retcode mng_trace (mng_datap pData, + mng_uint32 iFunction, + mng_uint32 iLocation); + +/* ************************************************************************** */ + +#define MNG_TRACE(D,F,L) { mng_retcode iR = mng_trace (D,F,L); \ + if (iR) return iR; } + +#define MNG_TRACEB(D,F,L) { if (mng_trace (D,F,L)) return MNG_FALSE; } + +#define MNG_TRACEX(D,F,L) { if (mng_trace (D,F,L)) return 0; } + +/* ************************************************************************** */ + +#define MNG_LC_START 1 +#define MNG_LC_END 2 +#define MNG_LC_INITIALIZE 3 +#define MNG_LC_CLEANUP 4 + +/* ************************************************************************** */ + +#define MNG_LC_JPEG_CREATE_DECOMPRESS 101 +#define MNG_LC_JPEG_READ_HEADER 102 +#define MNG_LC_JPEG_START_DECOMPRESS 103 +#define MNG_LC_JPEG_START_OUTPUT 104 +#define MNG_LC_JPEG_READ_SCANLINES 105 +#define MNG_LC_JPEG_FINISH_OUTPUT 106 +#define MNG_LC_JPEG_FINISH_DECOMPRESS 107 +#define MNG_LC_JPEG_DESTROY_DECOMPRESS 108 + +/* ************************************************************************** */ + +#define MNG_FN_INITIALIZE 1 +#define MNG_FN_RESET 2 +#define MNG_FN_CLEANUP 3 +#define MNG_FN_READ 4 +#define MNG_FN_WRITE 5 +#define MNG_FN_CREATE 6 +#define MNG_FN_READDISPLAY 7 +#define MNG_FN_DISPLAY 8 +#define MNG_FN_DISPLAY_RESUME 9 +#define MNG_FN_DISPLAY_FREEZE 10 +#define MNG_FN_DISPLAY_RESET 11 +#ifndef MNG_NO_DISPLAY_GO_SUPPORTED +#define MNG_FN_DISPLAY_GOFRAME 12 +#define MNG_FN_DISPLAY_GOLAYER 13 +#define MNG_FN_DISPLAY_GOTIME 14 +#endif +#define MNG_FN_GETLASTERROR 15 +#define MNG_FN_READ_RESUME 16 +#define MNG_FN_TRAPEVENT 17 +#define MNG_FN_READ_PUSHDATA 18 +#define MNG_FN_READ_PUSHSIG 19 +#define MNG_FN_READ_PUSHCHUNK 20 + +#define MNG_FN_SETCB_MEMALLOC 101 +#define MNG_FN_SETCB_MEMFREE 102 +#define MNG_FN_SETCB_READDATA 103 +#define MNG_FN_SETCB_WRITEDATA 104 +#define MNG_FN_SETCB_ERRORPROC 105 +#define MNG_FN_SETCB_TRACEPROC 106 +#define MNG_FN_SETCB_PROCESSHEADER 107 +#define MNG_FN_SETCB_PROCESSTEXT 108 +#define MNG_FN_SETCB_GETCANVASLINE 109 +#define MNG_FN_SETCB_GETBKGDLINE 110 +#define MNG_FN_SETCB_REFRESH 111 +#define MNG_FN_SETCB_GETTICKCOUNT 112 +#define MNG_FN_SETCB_SETTIMER 113 +#define MNG_FN_SETCB_PROCESSGAMMA 114 +#define MNG_FN_SETCB_PROCESSCHROMA 115 +#define MNG_FN_SETCB_PROCESSSRGB 116 +#define MNG_FN_SETCB_PROCESSICCP 117 +#define MNG_FN_SETCB_PROCESSAROW 118 +#ifndef MNG_NO_OPEN_CLOSE_STREAM +#define MNG_FN_SETCB_OPENSTREAM 119 +#define MNG_FN_SETCB_CLOSESTREAM 120 +#endif +#define MNG_FN_SETCB_GETALPHALINE 121 +#define MNG_FN_SETCB_PROCESSSAVE 122 +#define MNG_FN_SETCB_PROCESSSEEK 123 +#define MNG_FN_SETCB_PROCESSNEED 124 +#define MNG_FN_SETCB_PROCESSUNKNOWN 125 +#define MNG_FN_SETCB_PROCESSMEND 126 +#define MNG_FN_SETCB_PROCESSTERM 127 +#define MNG_FN_SETCB_RELEASEDATA 128 + +#define MNG_FN_GETCB_MEMALLOC 201 +#define MNG_FN_GETCB_MEMFREE 202 +#define MNG_FN_GETCB_READDATA 203 +#define MNG_FN_GETCB_WRITEDATA 204 +#define MNG_FN_GETCB_ERRORPROC 205 +#define MNG_FN_GETCB_TRACEPROC 206 +#define MNG_FN_GETCB_PROCESSHEADER 207 +#define MNG_FN_GETCB_PROCESSTEXT 208 +#define MNG_FN_GETCB_GETCANVASLINE 209 +#define MNG_FN_GETCB_GETBKGDLINE 210 +#define MNG_FN_GETCB_REFRESH 211 +#define MNG_FN_GETCB_GETTICKCOUNT 212 +#define MNG_FN_GETCB_SETTIMER 213 +#define MNG_FN_GETCB_PROCESSGAMMA 214 +#define MNG_FN_GETCB_PROCESSCHROMA 215 +#define MNG_FN_GETCB_PROCESSSRGB 216 +#define MNG_FN_GETCB_PROCESSICCP 217 +#define MNG_FN_GETCB_PROCESSAROW 218 +#ifndef MNG_NO_OPEN_CLOSE_STREAM +#define MNG_FN_GETCB_OPENSTREAM 219 +#define MNG_FN_GETCB_CLOSESTREAM 220 +#endif +#define MNG_FN_GETCB_GETALPHALINE 221 +#define MNG_FN_GETCB_PROCESSSAVE 222 +#define MNG_FN_GETCB_PROCESSSEEK 223 +#define MNG_FN_GETCB_PROCESSNEED 224 +#define MNG_FN_GETCB_PROCESSUNKNOWN 225 +#define MNG_FN_GETCB_PROCESSMEND 226 +#define MNG_FN_GETCB_PROCESSTERM 227 +#define MNG_FN_GETCB_RELEASEDATA 228 + +#define MNG_FN_SET_USERDATA 301 +#define MNG_FN_SET_CANVASSTYLE 302 +#define MNG_FN_SET_BKGDSTYLE 303 +#define MNG_FN_SET_BGCOLOR 304 +#define MNG_FN_SET_STORECHUNKS 305 +#define MNG_FN_SET_VIEWGAMMA 306 +#define MNG_FN_SET_DISPLAYGAMMA 307 +#define MNG_FN_SET_DFLTIMGGAMMA 308 +#define MNG_FN_SET_SRGB 309 +#define MNG_FN_SET_OUTPUTPROFILE 310 +#define MNG_FN_SET_SRGBPROFILE 311 +#define MNG_FN_SET_MAXCANVASWIDTH 312 +#define MNG_FN_SET_MAXCANVASHEIGHT 313 +#define MNG_FN_SET_MAXCANVASSIZE 314 +#define MNG_FN_SET_ZLIB_LEVEL 315 +#define MNG_FN_SET_ZLIB_METHOD 316 +#define MNG_FN_SET_ZLIB_WINDOWBITS 317 +#define MNG_FN_SET_ZLIB_MEMLEVEL 318 +#define MNG_FN_SET_ZLIB_STRATEGY 319 +#define MNG_FN_SET_ZLIB_MAXIDAT 320 +#define MNG_FN_SET_JPEG_DCTMETHOD 321 +#define MNG_FN_SET_JPEG_QUALITY 322 +#define MNG_FN_SET_JPEG_SMOOTHING 323 +#define MNG_FN_SET_JPEG_PROGRESSIVE 324 +#define MNG_FN_SET_JPEG_OPTIMIZED 325 +#define MNG_FN_SET_JPEG_MAXJDAT 326 +#define MNG_FN_SET_SPEED 327 +#define MNG_FN_SET_SUSPENSIONMODE 328 +#define MNG_FN_SET_SECTIONBREAKS 329 +#define MNG_FN_SET_USEBKGD 330 +#define MNG_FN_SET_OUTPUTPROFILE2 331 +#define MNG_FN_SET_SRGBPROFILE2 332 +#define MNG_FN_SET_OUTPUTSRGB 333 +#define MNG_FN_SET_SRGBIMPLICIT 334 +#define MNG_FN_SET_CACHEPLAYBACK 335 +#define MNG_FN_SET_DOPROGRESSIVE 336 +#define MNG_FN_SET_CRCMODE 337 + +#define MNG_FN_GET_USERDATA 401 +#define MNG_FN_GET_SIGTYPE 402 +#define MNG_FN_GET_IMAGETYPE 403 +#define MNG_FN_GET_IMAGEWIDTH 404 +#define MNG_FN_GET_IMAGEHEIGHT 405 +#define MNG_FN_GET_TICKS 406 +#define MNG_FN_GET_FRAMECOUNT 407 +#define MNG_FN_GET_LAYERCOUNT 408 +#define MNG_FN_GET_PLAYTIME 409 +#define MNG_FN_GET_SIMPLICITY 410 +#define MNG_FN_GET_CANVASSTYLE 411 +#define MNG_FN_GET_BKGDSTYLE 412 +#define MNG_FN_GET_BGCOLOR 413 +#define MNG_FN_GET_STORECHUNKS 414 +#define MNG_FN_GET_VIEWGAMMA 415 +#define MNG_FN_GET_DISPLAYGAMMA 416 +#define MNG_FN_GET_DFLTIMGGAMMA 417 +#define MNG_FN_GET_SRGB 418 +#define MNG_FN_GET_MAXCANVASWIDTH 419 +#define MNG_FN_GET_MAXCANVASHEIGHT 420 +#define MNG_FN_GET_ZLIB_LEVEL 421 +#define MNG_FN_GET_ZLIB_METHOD 422 +#define MNG_FN_GET_ZLIB_WINDOWBITS 423 +#define MNG_FN_GET_ZLIB_MEMLEVEL 424 +#define MNG_FN_GET_ZLIB_STRATEGY 425 +#define MNG_FN_GET_ZLIB_MAXIDAT 426 +#define MNG_FN_GET_JPEG_DCTMETHOD 427 +#define MNG_FN_GET_JPEG_QUALITY 428 +#define MNG_FN_GET_JPEG_SMOOTHING 429 +#define MNG_FN_GET_JPEG_PROGRESSIVE 430 +#define MNG_FN_GET_JPEG_OPTIMIZED 431 +#define MNG_FN_GET_JPEG_MAXJDAT 432 +#define MNG_FN_GET_SPEED 433 +#define MNG_FN_GET_IMAGELEVEL 434 +#define MNG_FN_GET_SUSPENSIONMODE 435 +#define MNG_FN_GET_STARTTIME 436 +#define MNG_FN_GET_RUNTIME 437 +#define MNG_FN_GET_CURRENTFRAME 438 +#define MNG_FN_GET_CURRENTLAYER 439 +#define MNG_FN_GET_CURRENTPLAYTIME 440 +#define MNG_FN_GET_SECTIONBREAKS 441 +#define MNG_FN_GET_ALPHADEPTH 442 +#define MNG_FN_GET_BITDEPTH 443 +#define MNG_FN_GET_COLORTYPE 444 +#define MNG_FN_GET_COMPRESSION 445 +#define MNG_FN_GET_FILTER 446 +#define MNG_FN_GET_INTERLACE 447 +#define MNG_FN_GET_ALPHABITDEPTH 448 +#define MNG_FN_GET_ALPHACOMPRESSION 449 +#define MNG_FN_GET_ALPHAFILTER 450 +#define MNG_FN_GET_ALPHAINTERLACE 451 +#define MNG_FN_GET_USEBKGD 452 +#define MNG_FN_GET_REFRESHPASS 453 +#define MNG_FN_GET_CACHEPLAYBACK 454 +#define MNG_FN_GET_DOPROGRESSIVE 455 +#define MNG_FN_GET_LASTBACKCHUNK 456 +#define MNG_FN_GET_LASTSEEKNAME 457 +#define MNG_FN_GET_TOTALFRAMES 458 +#define MNG_FN_GET_TOTALLAYERS 459 +#define MNG_FN_GET_TOTALPLAYTIME 460 +#define MNG_FN_GET_CRCMODE 461 +#define MNG_FN_GET_CURRFRAMDELAY 462 + +#define MNG_FN_STATUS_ERROR 481 +#define MNG_FN_STATUS_READING 482 +#define MNG_FN_STATUS_SUSPENDBREAK 483 +#define MNG_FN_STATUS_CREATING 484 +#define MNG_FN_STATUS_WRITING 485 +#define MNG_FN_STATUS_DISPLAYING 486 +#define MNG_FN_STATUS_RUNNING 487 +#define MNG_FN_STATUS_TIMERBREAK 488 +#define MNG_FN_STATUS_DYNAMIC 489 +#define MNG_FN_STATUS_RUNNINGEVENT 490 + +/* ************************************************************************** */ + +#define MNG_FN_ITERATE_CHUNKS 601 +#define MNG_FN_COPY_CHUNK 602 + +#define MNG_FN_GETCHUNK_IHDR 701 +#define MNG_FN_GETCHUNK_PLTE 702 +#define MNG_FN_GETCHUNK_IDAT 703 +#define MNG_FN_GETCHUNK_IEND 704 +#define MNG_FN_GETCHUNK_TRNS 705 +#define MNG_FN_GETCHUNK_GAMA 706 +#define MNG_FN_GETCHUNK_CHRM 707 +#define MNG_FN_GETCHUNK_SRGB 708 +#define MNG_FN_GETCHUNK_ICCP 709 +#define MNG_FN_GETCHUNK_TEXT 710 +#define MNG_FN_GETCHUNK_ZTXT 711 +#define MNG_FN_GETCHUNK_ITXT 712 +#define MNG_FN_GETCHUNK_BKGD 713 +#define MNG_FN_GETCHUNK_PHYS 714 +#define MNG_FN_GETCHUNK_SBIT 715 +#define MNG_FN_GETCHUNK_SPLT 716 +#define MNG_FN_GETCHUNK_HIST 717 +#define MNG_FN_GETCHUNK_TIME 718 +#define MNG_FN_GETCHUNK_MHDR 719 +#define MNG_FN_GETCHUNK_MEND 720 +#define MNG_FN_GETCHUNK_LOOP 721 +#define MNG_FN_GETCHUNK_ENDL 722 +#define MNG_FN_GETCHUNK_DEFI 723 +#define MNG_FN_GETCHUNK_BASI 724 +#define MNG_FN_GETCHUNK_CLON 725 +#define MNG_FN_GETCHUNK_PAST 726 +#define MNG_FN_GETCHUNK_DISC 727 +#define MNG_FN_GETCHUNK_BACK 728 +#define MNG_FN_GETCHUNK_FRAM 729 +#define MNG_FN_GETCHUNK_MOVE 730 +#define MNG_FN_GETCHUNK_CLIP 731 +#define MNG_FN_GETCHUNK_SHOW 732 +#define MNG_FN_GETCHUNK_TERM 733 +#define MNG_FN_GETCHUNK_SAVE 734 +#define MNG_FN_GETCHUNK_SEEK 735 +#define MNG_FN_GETCHUNK_EXPI 736 +#define MNG_FN_GETCHUNK_FPRI 737 +#define MNG_FN_GETCHUNK_NEED 738 +#define MNG_FN_GETCHUNK_PHYG 739 +#define MNG_FN_GETCHUNK_JHDR 740 +#define MNG_FN_GETCHUNK_JDAT 741 +#define MNG_FN_GETCHUNK_JSEP 742 +#define MNG_FN_GETCHUNK_DHDR 743 +#define MNG_FN_GETCHUNK_PROM 744 +#define MNG_FN_GETCHUNK_IPNG 745 +#define MNG_FN_GETCHUNK_PPLT 746 +#define MNG_FN_GETCHUNK_IJNG 747 +#define MNG_FN_GETCHUNK_DROP 748 +#define MNG_FN_GETCHUNK_DBYK 749 +#define MNG_FN_GETCHUNK_ORDR 750 +#define MNG_FN_GETCHUNK_UNKNOWN 751 +#define MNG_FN_GETCHUNK_MAGN 752 +#define MNG_FN_GETCHUNK_JDAA 753 +#define MNG_FN_GETCHUNK_EVNT 754 +#define MNG_FN_GETCHUNK_MPNG 755 + +#define MNG_FN_GETCHUNK_PAST_SRC 781 +#define MNG_FN_GETCHUNK_SAVE_ENTRY 782 +#define MNG_FN_GETCHUNK_PPLT_ENTRY 783 +#define MNG_FN_GETCHUNK_ORDR_ENTRY 784 +#define MNG_FN_GETCHUNK_EVNT_ENTRY 785 +#define MNG_FN_GETCHUNK_MPNG_FRAME 786 + +#define MNG_FN_PUTCHUNK_IHDR 801 +#define MNG_FN_PUTCHUNK_PLTE 802 +#define MNG_FN_PUTCHUNK_IDAT 803 +#define MNG_FN_PUTCHUNK_IEND 804 +#define MNG_FN_PUTCHUNK_TRNS 805 +#define MNG_FN_PUTCHUNK_GAMA 806 +#define MNG_FN_PUTCHUNK_CHRM 807 +#define MNG_FN_PUTCHUNK_SRGB 808 +#define MNG_FN_PUTCHUNK_ICCP 809 +#define MNG_FN_PUTCHUNK_TEXT 810 +#define MNG_FN_PUTCHUNK_ZTXT 811 +#define MNG_FN_PUTCHUNK_ITXT 812 +#define MNG_FN_PUTCHUNK_BKGD 813 +#define MNG_FN_PUTCHUNK_PHYS 814 +#define MNG_FN_PUTCHUNK_SBIT 815 +#define MNG_FN_PUTCHUNK_SPLT 816 +#define MNG_FN_PUTCHUNK_HIST 817 +#define MNG_FN_PUTCHUNK_TIME 818 +#define MNG_FN_PUTCHUNK_MHDR 819 +#define MNG_FN_PUTCHUNK_MEND 820 +#define MNG_FN_PUTCHUNK_LOOP 821 +#define MNG_FN_PUTCHUNK_ENDL 822 +#define MNG_FN_PUTCHUNK_DEFI 823 +#define MNG_FN_PUTCHUNK_BASI 824 +#define MNG_FN_PUTCHUNK_CLON 825 +#define MNG_FN_PUTCHUNK_PAST 826 +#define MNG_FN_PUTCHUNK_DISC 827 +#define MNG_FN_PUTCHUNK_BACK 828 +#define MNG_FN_PUTCHUNK_FRAM 829 +#define MNG_FN_PUTCHUNK_MOVE 830 +#define MNG_FN_PUTCHUNK_CLIP 831 +#define MNG_FN_PUTCHUNK_SHOW 832 +#define MNG_FN_PUTCHUNK_TERM 833 +#define MNG_FN_PUTCHUNK_SAVE 834 +#define MNG_FN_PUTCHUNK_SEEK 835 +#define MNG_FN_PUTCHUNK_EXPI 836 +#define MNG_FN_PUTCHUNK_FPRI 837 +#define MNG_FN_PUTCHUNK_NEED 838 +#define MNG_FN_PUTCHUNK_PHYG 839 +#define MNG_FN_PUTCHUNK_JHDR 840 +#define MNG_FN_PUTCHUNK_JDAT 841 +#define MNG_FN_PUTCHUNK_JSEP 842 +#define MNG_FN_PUTCHUNK_DHDR 843 +#define MNG_FN_PUTCHUNK_PROM 844 +#define MNG_FN_PUTCHUNK_IPNG 845 +#define MNG_FN_PUTCHUNK_PPLT 846 +#define MNG_FN_PUTCHUNK_IJNG 847 +#define MNG_FN_PUTCHUNK_DROP 848 +#define MNG_FN_PUTCHUNK_DBYK 849 +#define MNG_FN_PUTCHUNK_ORDR 850 +#define MNG_FN_PUTCHUNK_UNKNOWN 851 +#define MNG_FN_PUTCHUNK_MAGN 852 +#define MNG_FN_PUTCHUNK_JDAA 853 +#define MNG_FN_PUTCHUNK_EVNT 854 +#define MNG_FN_PUTCHUNK_MPNG 855 + +#define MNG_FN_PUTCHUNK_PAST_SRC 881 +#define MNG_FN_PUTCHUNK_SAVE_ENTRY 882 +#define MNG_FN_PUTCHUNK_PPLT_ENTRY 883 +#define MNG_FN_PUTCHUNK_ORDR_ENTRY 884 +#define MNG_FN_PUTCHUNK_EVNT_ENTRY 885 +#define MNG_FN_PUTCHUNK_MPNG_FRAME 886 + +/* ************************************************************************** */ + +#define MNG_FN_GETIMGDATA_SEQ 901 +#define MNG_FN_GETIMGDATA_CHUNKSEQ 902 +#define MNG_FN_GETIMGDATA_CHUNK 903 + +#define MNG_FN_PUTIMGDATA_IHDR 951 +#define MNG_FN_PUTIMGDATA_JHDR 952 +#define MNG_FN_PUTIMGDATA_BASI 953 +#define MNG_FN_PUTIMGDATA_DHDR 954 + +#define MNG_FN_UPDATEMNGHEADER 981 +#define MNG_FN_UPDATEMNGSIMPLICITY 982 + +/* ************************************************************************** */ + +#define MNG_FN_PROCESS_RAW_CHUNK 1001 +#define MNG_FN_READ_GRAPHIC 1002 +#define MNG_FN_DROP_CHUNKS 1003 +#define MNG_FN_PROCESS_ERROR 1004 +#define MNG_FN_CLEAR_CMS 1005 +#define MNG_FN_DROP_OBJECTS 1006 +#define MNG_FN_READ_CHUNK 1007 +#define MNG_FN_LOAD_BKGDLAYER 1008 +#define MNG_FN_NEXT_FRAME 1009 +#define MNG_FN_NEXT_LAYER 1010 +#define MNG_FN_INTERFRAME_DELAY 1011 +#define MNG_FN_DISPLAY_IMAGE 1012 +#define MNG_FN_DROP_IMGOBJECTS 1013 +#define MNG_FN_DROP_ANIOBJECTS 1014 +#define MNG_FN_INFLATE_BUFFER 1015 +#define MNG_FN_DEFLATE_BUFFER 1016 +#define MNG_FN_WRITE_RAW_CHUNK 1017 +#define MNG_FN_WRITE_GRAPHIC 1018 +#define MNG_FN_SAVE_STATE 1019 +#define MNG_FN_RESTORE_STATE 1020 +#define MNG_FN_DROP_SAVEDATA 1021 +#define MNG_FN_EXECUTE_DELTA_IMAGE 1022 +#define MNG_FN_PROCESS_DISPLAY 1023 +#define MNG_FN_CLEAR_CANVAS 1024 +#define MNG_FN_READ_DATABUFFER 1025 +#define MNG_FN_STORE_ERROR 1026 +#define MNG_FN_DROP_INVALID_OBJECTS 1027 +#define MNG_FN_RELEASE_PUSHDATA 1028 +#define MNG_FN_READ_DATA 1029 +#define MNG_FN_READ_CHUNK_CRC 1030 +#define MNG_FN_RELEASE_PUSHCHUNK 1031 + +/* ************************************************************************** */ + +#define MNG_FN_DISPLAY_RGB8 1101 +#define MNG_FN_DISPLAY_RGBA8 1102 +#define MNG_FN_DISPLAY_ARGB8 1103 +#define MNG_FN_DISPLAY_BGR8 1104 +#define MNG_FN_DISPLAY_BGRA8 1105 +#define MNG_FN_DISPLAY_ABGR8 1106 +#define MNG_FN_DISPLAY_RGB16 1107 +#define MNG_FN_DISPLAY_RGBA16 1108 +#define MNG_FN_DISPLAY_ARGB16 1109 +#define MNG_FN_DISPLAY_BGR16 1110 +#define MNG_FN_DISPLAY_BGRA16 1111 +#define MNG_FN_DISPLAY_ABGR16 1112 +#define MNG_FN_DISPLAY_INDEX8 1113 +#define MNG_FN_DISPLAY_INDEXA8 1114 +#define MNG_FN_DISPLAY_AINDEX8 1115 +#define MNG_FN_DISPLAY_GRAY8 1116 +#define MNG_FN_DISPLAY_GRAY16 1117 +#define MNG_FN_DISPLAY_GRAYA8 1118 +#define MNG_FN_DISPLAY_GRAYA16 1119 +#define MNG_FN_DISPLAY_AGRAY8 1120 +#define MNG_FN_DISPLAY_AGRAY16 1121 +#define MNG_FN_DISPLAY_DX15 1122 +#define MNG_FN_DISPLAY_DX16 1123 +#define MNG_FN_DISPLAY_RGB8_A8 1124 +#define MNG_FN_DISPLAY_BGRA8PM 1125 +#define MNG_FN_DISPLAY_BGRX8 1126 +#define MNG_FN_DISPLAY_RGB565 1127 +#define MNG_FN_DISPLAY_RGBA565 1128 +#define MNG_FN_DISPLAY_BGR565 1129 +#define MNG_FN_DISPLAY_BGRA565 1130 +#define MNG_FN_DISPLAY_RGBA8_PM 1131 +#define MNG_FN_DISPLAY_ARGB8_PM 1132 +#define MNG_FN_DISPLAY_ABGR8_PM 1133 +#define MNG_FN_DISPLAY_BGR565_A8 1134 +#define MNG_FN_DISPLAY_RGB555 1135 +#define MNG_FN_DISPLAY_BGR555 1136 + +/* ************************************************************************** */ + +#define MNG_FN_INIT_FULL_CMS 1201 +#define MNG_FN_CORRECT_FULL_CMS 1202 +#define MNG_FN_INIT_GAMMA_ONLY 1204 +#define MNG_FN_CORRECT_GAMMA_ONLY 1205 +#define MNG_FN_CORRECT_APP_CMS 1206 +#define MNG_FN_INIT_FULL_CMS_OBJ 1207 +#define MNG_FN_INIT_GAMMA_ONLY_OBJ 1208 +#define MNG_FN_INIT_APP_CMS 1209 +#define MNG_FN_INIT_APP_CMS_OBJ 1210 + +/* ************************************************************************** */ + +#define MNG_FN_PROCESS_G1 1301 +#define MNG_FN_PROCESS_G2 1302 +#define MNG_FN_PROCESS_G4 1303 +#define MNG_FN_PROCESS_G8 1304 +#define MNG_FN_PROCESS_G16 1305 +#define MNG_FN_PROCESS_RGB8 1306 +#define MNG_FN_PROCESS_RGB16 1307 +#define MNG_FN_PROCESS_IDX1 1308 +#define MNG_FN_PROCESS_IDX2 1309 +#define MNG_FN_PROCESS_IDX4 1310 +#define MNG_FN_PROCESS_IDX8 1311 +#define MNG_FN_PROCESS_GA8 1312 +#define MNG_FN_PROCESS_GA16 1313 +#define MNG_FN_PROCESS_RGBA8 1314 +#define MNG_FN_PROCESS_RGBA16 1315 + +/* ************************************************************************** */ + +#define MNG_FN_INIT_G1_NI 1401 +#define MNG_FN_INIT_G1_I 1402 +#define MNG_FN_INIT_G2_NI 1403 +#define MNG_FN_INIT_G2_I 1404 +#define MNG_FN_INIT_G4_NI 1405 +#define MNG_FN_INIT_G4_I 1406 +#define MNG_FN_INIT_G8_NI 1407 +#define MNG_FN_INIT_G8_I 1408 +#define MNG_FN_INIT_G16_NI 1409 +#define MNG_FN_INIT_G16_I 1410 +#define MNG_FN_INIT_RGB8_NI 1411 +#define MNG_FN_INIT_RGB8_I 1412 +#define MNG_FN_INIT_RGB16_NI 1413 +#define MNG_FN_INIT_RGB16_I 1414 +#define MNG_FN_INIT_IDX1_NI 1415 +#define MNG_FN_INIT_IDX1_I 1416 +#define MNG_FN_INIT_IDX2_NI 1417 +#define MNG_FN_INIT_IDX2_I 1418 +#define MNG_FN_INIT_IDX4_NI 1419 +#define MNG_FN_INIT_IDX4_I 1420 +#define MNG_FN_INIT_IDX8_NI 1421 +#define MNG_FN_INIT_IDX8_I 1422 +#define MNG_FN_INIT_GA8_NI 1423 +#define MNG_FN_INIT_GA8_I 1424 +#define MNG_FN_INIT_GA16_NI 1425 +#define MNG_FN_INIT_GA16_I 1426 +#define MNG_FN_INIT_RGBA8_NI 1427 +#define MNG_FN_INIT_RGBA8_I 1428 +#define MNG_FN_INIT_RGBA16_NI 1429 +#define MNG_FN_INIT_RGBA16_I 1430 + +#define MNG_FN_INIT_ROWPROC 1497 +#define MNG_FN_NEXT_ROW 1498 +#define MNG_FN_CLEANUP_ROWPROC 1499 + +/* ************************************************************************** */ + +#define MNG_FN_FILTER_A_ROW 1501 +#define MNG_FN_FILTER_SUB 1502 +#define MNG_FN_FILTER_UP 1503 +#define MNG_FN_FILTER_AVERAGE 1504 +#define MNG_FN_FILTER_PAETH 1505 + +#define MNG_FN_INIT_ROWDIFFERING 1551 +#define MNG_FN_DIFFER_G1 1552 +#define MNG_FN_DIFFER_G2 1553 +#define MNG_FN_DIFFER_G4 1554 +#define MNG_FN_DIFFER_G8 1555 +#define MNG_FN_DIFFER_G16 1556 +#define MNG_FN_DIFFER_RGB8 1557 +#define MNG_FN_DIFFER_RGB16 1558 +#define MNG_FN_DIFFER_IDX1 1559 +#define MNG_FN_DIFFER_IDX2 1560 +#define MNG_FN_DIFFER_IDX4 1561 +#define MNG_FN_DIFFER_IDX8 1562 +#define MNG_FN_DIFFER_GA8 1563 +#define MNG_FN_DIFFER_GA16 1564 +#define MNG_FN_DIFFER_RGBA8 1565 +#define MNG_FN_DIFFER_RGBA16 1566 + +/* ************************************************************************** */ + +#define MNG_FN_CREATE_IMGDATAOBJECT 1601 +#define MNG_FN_FREE_IMGDATAOBJECT 1602 +#define MNG_FN_CLONE_IMGDATAOBJECT 1603 +#define MNG_FN_CREATE_IMGOBJECT 1604 +#define MNG_FN_FREE_IMGOBJECT 1605 +#define MNG_FN_FIND_IMGOBJECT 1606 +#define MNG_FN_CLONE_IMGOBJECT 1607 +#define MNG_FN_RESET_OBJECTDETAILS 1608 +#define MNG_FN_RENUM_IMGOBJECT 1609 +#define MNG_FN_PROMOTE_IMGOBJECT 1610 +#define MNG_FN_MAGNIFY_IMGOBJECT 1611 +#define MNG_FN_COLORCORRECT_OBJECT 1612 + +/* ************************************************************************** */ + +#define MNG_FN_STORE_G1 1701 +#define MNG_FN_STORE_G2 1702 +#define MNG_FN_STORE_G4 1703 +#define MNG_FN_STORE_G8 1704 +#define MNG_FN_STORE_G16 1705 +#define MNG_FN_STORE_RGB8 1706 +#define MNG_FN_STORE_RGB16 1707 +#define MNG_FN_STORE_IDX1 1708 +#define MNG_FN_STORE_IDX2 1709 +#define MNG_FN_STORE_IDX4 1710 +#define MNG_FN_STORE_IDX8 1711 +#define MNG_FN_STORE_GA8 1712 +#define MNG_FN_STORE_GA16 1713 +#define MNG_FN_STORE_RGBA8 1714 +#define MNG_FN_STORE_RGBA16 1715 + +#define MNG_FN_RETRIEVE_G8 1751 +#define MNG_FN_RETRIEVE_G16 1752 +#define MNG_FN_RETRIEVE_RGB8 1753 +#define MNG_FN_RETRIEVE_RGB16 1754 +#define MNG_FN_RETRIEVE_IDX8 1755 +#define MNG_FN_RETRIEVE_GA8 1756 +#define MNG_FN_RETRIEVE_GA16 1757 +#define MNG_FN_RETRIEVE_RGBA8 1758 +#define MNG_FN_RETRIEVE_RGBA16 1759 + +#define MNG_FN_DELTA_G1 1771 +#define MNG_FN_DELTA_G2 1772 +#define MNG_FN_DELTA_G4 1773 +#define MNG_FN_DELTA_G8 1774 +#define MNG_FN_DELTA_G16 1775 +#define MNG_FN_DELTA_RGB8 1776 +#define MNG_FN_DELTA_RGB16 1777 +#define MNG_FN_DELTA_IDX1 1778 +#define MNG_FN_DELTA_IDX2 1779 +#define MNG_FN_DELTA_IDX4 1780 +#define MNG_FN_DELTA_IDX8 1781 +#define MNG_FN_DELTA_GA8 1782 +#define MNG_FN_DELTA_GA16 1783 +#define MNG_FN_DELTA_RGBA8 1784 +#define MNG_FN_DELTA_RGBA16 1785 + +/* ************************************************************************** */ + +#define MNG_FN_CREATE_ANI_LOOP 1801 +#define MNG_FN_CREATE_ANI_ENDL 1802 +#define MNG_FN_CREATE_ANI_DEFI 1803 +#define MNG_FN_CREATE_ANI_BASI 1804 +#define MNG_FN_CREATE_ANI_CLON 1805 +#define MNG_FN_CREATE_ANI_PAST 1806 +#define MNG_FN_CREATE_ANI_DISC 1807 +#define MNG_FN_CREATE_ANI_BACK 1808 +#define MNG_FN_CREATE_ANI_FRAM 1809 +#define MNG_FN_CREATE_ANI_MOVE 1810 +#define MNG_FN_CREATE_ANI_CLIP 1811 +#define MNG_FN_CREATE_ANI_SHOW 1812 +#define MNG_FN_CREATE_ANI_TERM 1813 +#define MNG_FN_CREATE_ANI_SAVE 1814 +#define MNG_FN_CREATE_ANI_SEEK 1815 +#define MNG_FN_CREATE_ANI_GAMA 1816 +#define MNG_FN_CREATE_ANI_CHRM 1817 +#define MNG_FN_CREATE_ANI_SRGB 1818 +#define MNG_FN_CREATE_ANI_ICCP 1819 +#define MNG_FN_CREATE_ANI_PLTE 1820 +#define MNG_FN_CREATE_ANI_TRNS 1821 +#define MNG_FN_CREATE_ANI_BKGD 1822 +#define MNG_FN_CREATE_ANI_DHDR 1823 +#define MNG_FN_CREATE_ANI_PROM 1824 +#define MNG_FN_CREATE_ANI_IPNG 1825 +#define MNG_FN_CREATE_ANI_IJNG 1826 +#define MNG_FN_CREATE_ANI_PPLT 1827 +#define MNG_FN_CREATE_ANI_MAGN 1828 + +#define MNG_FN_CREATE_ANI_IMAGE 1891 +#define MNG_FN_CREATE_EVENT 1892 + +/* ************************************************************************** */ + +#define MNG_FN_FREE_ANI_LOOP 1901 +#define MNG_FN_FREE_ANI_ENDL 1902 +#define MNG_FN_FREE_ANI_DEFI 1903 +#define MNG_FN_FREE_ANI_BASI 1904 +#define MNG_FN_FREE_ANI_CLON 1905 +#define MNG_FN_FREE_ANI_PAST 1906 +#define MNG_FN_FREE_ANI_DISC 1907 +#define MNG_FN_FREE_ANI_BACK 1908 +#define MNG_FN_FREE_ANI_FRAM 1909 +#define MNG_FN_FREE_ANI_MOVE 1910 +#define MNG_FN_FREE_ANI_CLIP 1911 +#define MNG_FN_FREE_ANI_SHOW 1912 +#define MNG_FN_FREE_ANI_TERM 1913 +#define MNG_FN_FREE_ANI_SAVE 1914 +#define MNG_FN_FREE_ANI_SEEK 1915 +#define MNG_FN_FREE_ANI_GAMA 1916 +#define MNG_FN_FREE_ANI_CHRM 1917 +#define MNG_FN_FREE_ANI_SRGB 1918 +#define MNG_FN_FREE_ANI_ICCP 1919 +#define MNG_FN_FREE_ANI_PLTE 1920 +#define MNG_FN_FREE_ANI_TRNS 1921 +#define MNG_FN_FREE_ANI_BKGD 1922 +#define MNG_FN_FREE_ANI_DHDR 1923 +#define MNG_FN_FREE_ANI_PROM 1924 +#define MNG_FN_FREE_ANI_IPNG 1925 +#define MNG_FN_FREE_ANI_IJNG 1926 +#define MNG_FN_FREE_ANI_PPLT 1927 +#define MNG_FN_FREE_ANI_MAGN 1928 + +#define MNG_FN_FREE_ANI_IMAGE 1991 +#define MNG_FN_FREE_EVENT 1992 + +/* ************************************************************************** */ + +#define MNG_FN_PROCESS_ANI_LOOP 2001 +#define MNG_FN_PROCESS_ANI_ENDL 2002 +#define MNG_FN_PROCESS_ANI_DEFI 2003 +#define MNG_FN_PROCESS_ANI_BASI 2004 +#define MNG_FN_PROCESS_ANI_CLON 2005 +#define MNG_FN_PROCESS_ANI_PAST 2006 +#define MNG_FN_PROCESS_ANI_DISC 2007 +#define MNG_FN_PROCESS_ANI_BACK 2008 +#define MNG_FN_PROCESS_ANI_FRAM 2009 +#define MNG_FN_PROCESS_ANI_MOVE 2010 +#define MNG_FN_PROCESS_ANI_CLIP 2011 +#define MNG_FN_PROCESS_ANI_SHOW 2012 +#define MNG_FN_PROCESS_ANI_TERM 2013 +#define MNG_FN_PROCESS_ANI_SAVE 2014 +#define MNG_FN_PROCESS_ANI_SEEK 2015 +#define MNG_FN_PROCESS_ANI_GAMA 2016 +#define MNG_FN_PROCESS_ANI_CHRM 2017 +#define MNG_FN_PROCESS_ANI_SRGB 2018 +#define MNG_FN_PROCESS_ANI_ICCP 2019 +#define MNG_FN_PROCESS_ANI_PLTE 2020 +#define MNG_FN_PROCESS_ANI_TRNS 2021 +#define MNG_FN_PROCESS_ANI_BKGD 2022 +#define MNG_FN_PROCESS_ANI_DHDR 2023 +#define MNG_FN_PROCESS_ANI_PROM 2024 +#define MNG_FN_PROCESS_ANI_IPNG 2025 +#define MNG_FN_PROCESS_ANI_IJNG 2026 +#define MNG_FN_PROCESS_ANI_PPLT 2027 +#define MNG_FN_PROCESS_ANI_MAGN 2028 + +#define MNG_FN_PROCESS_ANI_IMAGE 2091 +#define MNG_FN_PROCESS_EVENT 2092 + +/* ************************************************************************** */ + +#define MNG_FN_RESTORE_BACKIMAGE 2101 +#define MNG_FN_RESTORE_BACKCOLOR 2102 +#define MNG_FN_RESTORE_BGCOLOR 2103 +#define MNG_FN_RESTORE_RGB8 2104 +#define MNG_FN_RESTORE_BGR8 2105 +#define MNG_FN_RESTORE_BKGD 2106 +#define MNG_FN_RESTORE_BGRX8 2107 +#define MNG_FN_RESTORE_RGB565 2108 +#define MNG_FN_RESTORE_BGR565 2109 + +/* ************************************************************************** */ + +#define MNG_FN_INIT_IHDR 2201 +#define MNG_FN_INIT_PLTE 2202 +#define MNG_FN_INIT_IDAT 2203 +#define MNG_FN_INIT_IEND 2204 +#define MNG_FN_INIT_TRNS 2205 +#define MNG_FN_INIT_GAMA 2206 +#define MNG_FN_INIT_CHRM 2207 +#define MNG_FN_INIT_SRGB 2208 +#define MNG_FN_INIT_ICCP 2209 +#define MNG_FN_INIT_TEXT 2210 +#define MNG_FN_INIT_ZTXT 2211 +#define MNG_FN_INIT_ITXT 2212 +#define MNG_FN_INIT_BKGD 2213 +#define MNG_FN_INIT_PHYS 2214 +#define MNG_FN_INIT_SBIT 2215 +#define MNG_FN_INIT_SPLT 2216 +#define MNG_FN_INIT_HIST 2217 +#define MNG_FN_INIT_TIME 2218 +#define MNG_FN_INIT_MHDR 2219 +#define MNG_FN_INIT_MEND 2220 +#define MNG_FN_INIT_LOOP 2221 +#define MNG_FN_INIT_ENDL 2222 +#define MNG_FN_INIT_DEFI 2223 +#define MNG_FN_INIT_BASI 2224 +#define MNG_FN_INIT_CLON 2225 +#define MNG_FN_INIT_PAST 2226 +#define MNG_FN_INIT_DISC 2227 +#define MNG_FN_INIT_BACK 2228 +#define MNG_FN_INIT_FRAM 2229 +#define MNG_FN_INIT_MOVE 2230 +#define MNG_FN_INIT_CLIP 2231 +#define MNG_FN_INIT_SHOW 2232 +#define MNG_FN_INIT_TERM 2233 +#define MNG_FN_INIT_SAVE 2234 +#define MNG_FN_INIT_SEEK 2235 +#define MNG_FN_INIT_EXPI 2236 +#define MNG_FN_INIT_FPRI 2237 +#define MNG_FN_INIT_NEED 2238 +#define MNG_FN_INIT_PHYG 2239 +#define MNG_FN_INIT_JHDR 2240 +#define MNG_FN_INIT_JDAT 2241 +#define MNG_FN_INIT_JSEP 2242 +#define MNG_FN_INIT_DHDR 2243 +#define MNG_FN_INIT_PROM 2244 +#define MNG_FN_INIT_IPNG 2245 +#define MNG_FN_INIT_PPLT 2246 +#define MNG_FN_INIT_IJNG 2247 +#define MNG_FN_INIT_DROP 2248 +#define MNG_FN_INIT_DBYK 2249 +#define MNG_FN_INIT_ORDR 2250 +#define MNG_FN_INIT_UNKNOWN 2251 +#define MNG_FN_INIT_MAGN 2252 +#define MNG_FN_INIT_JDAA 2253 +#define MNG_FN_INIT_EVNT 2254 +#define MNG_FN_INIT_MPNG 2255 + +/* ************************************************************************** */ + +#define MNG_FN_ASSIGN_IHDR 2301 +#define MNG_FN_ASSIGN_PLTE 2302 +#define MNG_FN_ASSIGN_IDAT 2303 +#define MNG_FN_ASSIGN_IEND 2304 +#define MNG_FN_ASSIGN_TRNS 2305 +#define MNG_FN_ASSIGN_GAMA 2306 +#define MNG_FN_ASSIGN_CHRM 2307 +#define MNG_FN_ASSIGN_SRGB 2308 +#define MNG_FN_ASSIGN_ICCP 2309 +#define MNG_FN_ASSIGN_TEXT 2310 +#define MNG_FN_ASSIGN_ZTXT 2311 +#define MNG_FN_ASSIGN_ITXT 2312 +#define MNG_FN_ASSIGN_BKGD 2313 +#define MNG_FN_ASSIGN_PHYS 2314 +#define MNG_FN_ASSIGN_SBIT 2315 +#define MNG_FN_ASSIGN_SPLT 2316 +#define MNG_FN_ASSIGN_HIST 2317 +#define MNG_FN_ASSIGN_TIME 2318 +#define MNG_FN_ASSIGN_MHDR 2319 +#define MNG_FN_ASSIGN_MEND 2320 +#define MNG_FN_ASSIGN_LOOP 2321 +#define MNG_FN_ASSIGN_ENDL 2322 +#define MNG_FN_ASSIGN_DEFI 2323 +#define MNG_FN_ASSIGN_BASI 2324 +#define MNG_FN_ASSIGN_CLON 2325 +#define MNG_FN_ASSIGN_PAST 2326 +#define MNG_FN_ASSIGN_DISC 2327 +#define MNG_FN_ASSIGN_BACK 2328 +#define MNG_FN_ASSIGN_FRAM 2329 +#define MNG_FN_ASSIGN_MOVE 2330 +#define MNG_FN_ASSIGN_CLIP 2331 +#define MNG_FN_ASSIGN_SHOW 2332 +#define MNG_FN_ASSIGN_TERM 2333 +#define MNG_FN_ASSIGN_SAVE 2334 +#define MNG_FN_ASSIGN_SEEK 2335 +#define MNG_FN_ASSIGN_EXPI 2336 +#define MNG_FN_ASSIGN_FPRI 2337 +#define MNG_FN_ASSIGN_NEED 2338 +#define MNG_FN_ASSIGN_PHYG 2339 +#define MNG_FN_ASSIGN_JHDR 2340 +#define MNG_FN_ASSIGN_JDAT 2341 +#define MNG_FN_ASSIGN_JSEP 2342 +#define MNG_FN_ASSIGN_DHDR 2343 +#define MNG_FN_ASSIGN_PROM 2344 +#define MNG_FN_ASSIGN_IPNG 2345 +#define MNG_FN_ASSIGN_PPLT 2346 +#define MNG_FN_ASSIGN_IJNG 2347 +#define MNG_FN_ASSIGN_DROP 2348 +#define MNG_FN_ASSIGN_DBYK 2349 +#define MNG_FN_ASSIGN_ORDR 2350 +#define MNG_FN_ASSIGN_UNKNOWN 2351 +#define MNG_FN_ASSIGN_MAGN 2352 +#define MNG_FN_ASSIGN_JDAA 2353 +#define MNG_FN_ASSIGN_EVNT 2354 +#define MNG_FN_ASSIGN_MPNG 2355 + +/* ************************************************************************** */ + +#define MNG_FN_FREE_IHDR 2401 +#define MNG_FN_FREE_PLTE 2402 +#define MNG_FN_FREE_IDAT 2403 +#define MNG_FN_FREE_IEND 2404 +#define MNG_FN_FREE_TRNS 2405 +#define MNG_FN_FREE_GAMA 2406 +#define MNG_FN_FREE_CHRM 2407 +#define MNG_FN_FREE_SRGB 2408 +#define MNG_FN_FREE_ICCP 2409 +#define MNG_FN_FREE_TEXT 2410 +#define MNG_FN_FREE_ZTXT 2411 +#define MNG_FN_FREE_ITXT 2412 +#define MNG_FN_FREE_BKGD 2413 +#define MNG_FN_FREE_PHYS 2414 +#define MNG_FN_FREE_SBIT 2415 +#define MNG_FN_FREE_SPLT 2416 +#define MNG_FN_FREE_HIST 2417 +#define MNG_FN_FREE_TIME 2418 +#define MNG_FN_FREE_MHDR 2419 +#define MNG_FN_FREE_MEND 2420 +#define MNG_FN_FREE_LOOP 2421 +#define MNG_FN_FREE_ENDL 2422 +#define MNG_FN_FREE_DEFI 2423 +#define MNG_FN_FREE_BASI 2424 +#define MNG_FN_FREE_CLON 2425 +#define MNG_FN_FREE_PAST 2426 +#define MNG_FN_FREE_DISC 2427 +#define MNG_FN_FREE_BACK 2428 +#define MNG_FN_FREE_FRAM 2429 +#define MNG_FN_FREE_MOVE 2430 +#define MNG_FN_FREE_CLIP 2431 +#define MNG_FN_FREE_SHOW 2432 +#define MNG_FN_FREE_TERM 2433 +#define MNG_FN_FREE_SAVE 2434 +#define MNG_FN_FREE_SEEK 2435 +#define MNG_FN_FREE_EXPI 2436 +#define MNG_FN_FREE_FPRI 2437 +#define MNG_FN_FREE_NEED 2438 +#define MNG_FN_FREE_PHYG 2439 +#define MNG_FN_FREE_JHDR 2440 +#define MNG_FN_FREE_JDAT 2441 +#define MNG_FN_FREE_JSEP 2442 +#define MNG_FN_FREE_DHDR 2443 +#define MNG_FN_FREE_PROM 2444 +#define MNG_FN_FREE_IPNG 2445 +#define MNG_FN_FREE_PPLT 2446 +#define MNG_FN_FREE_IJNG 2447 +#define MNG_FN_FREE_DROP 2448 +#define MNG_FN_FREE_DBYK 2449 +#define MNG_FN_FREE_ORDR 2450 +#define MNG_FN_FREE_UNKNOWN 2451 +#define MNG_FN_FREE_MAGN 2452 +#define MNG_FN_FREE_JDAA 2453 +#define MNG_FN_FREE_EVNT 2454 +#define MNG_FN_FREE_MPNG 2455 + +/* ************************************************************************** */ + +#define MNG_FN_READ_IHDR 2601 +#define MNG_FN_READ_PLTE 2602 +#define MNG_FN_READ_IDAT 2603 +#define MNG_FN_READ_IEND 2604 +#define MNG_FN_READ_TRNS 2605 +#define MNG_FN_READ_GAMA 2606 +#define MNG_FN_READ_CHRM 2607 +#define MNG_FN_READ_SRGB 2608 +#define MNG_FN_READ_ICCP 2609 +#define MNG_FN_READ_TEXT 2610 +#define MNG_FN_READ_ZTXT 2611 +#define MNG_FN_READ_ITXT 2612 +#define MNG_FN_READ_BKGD 2613 +#define MNG_FN_READ_PHYS 2614 +#define MNG_FN_READ_SBIT 2615 +#define MNG_FN_READ_SPLT 2616 +#define MNG_FN_READ_HIST 2617 +#define MNG_FN_READ_TIME 2618 +#define MNG_FN_READ_MHDR 2619 +#define MNG_FN_READ_MEND 2620 +#define MNG_FN_READ_LOOP 2621 +#define MNG_FN_READ_ENDL 2622 +#define MNG_FN_READ_DEFI 2623 +#define MNG_FN_READ_BASI 2624 +#define MNG_FN_READ_CLON 2625 +#define MNG_FN_READ_PAST 2626 +#define MNG_FN_READ_DISC 2627 +#define MNG_FN_READ_BACK 2628 +#define MNG_FN_READ_FRAM 2629 +#define MNG_FN_READ_MOVE 2630 +#define MNG_FN_READ_CLIP 2631 +#define MNG_FN_READ_SHOW 2632 +#define MNG_FN_READ_TERM 2633 +#define MNG_FN_READ_SAVE 2634 +#define MNG_FN_READ_SEEK 2635 +#define MNG_FN_READ_EXPI 2636 +#define MNG_FN_READ_FPRI 2637 +#define MNG_FN_READ_NEED 2638 +#define MNG_FN_READ_PHYG 2639 +#define MNG_FN_READ_JHDR 2640 +#define MNG_FN_READ_JDAT 2641 +#define MNG_FN_READ_JSEP 2642 +#define MNG_FN_READ_DHDR 2643 +#define MNG_FN_READ_PROM 2644 +#define MNG_FN_READ_IPNG 2645 +#define MNG_FN_READ_PPLT 2646 +#define MNG_FN_READ_IJNG 2647 +#define MNG_FN_READ_DROP 2648 +#define MNG_FN_READ_DBYK 2649 +#define MNG_FN_READ_ORDR 2650 +#define MNG_FN_READ_UNKNOWN 2651 +#define MNG_FN_READ_MAGN 2652 +#define MNG_FN_READ_JDAA 2653 +#define MNG_FN_READ_EVNT 2654 +#define MNG_FN_READ_MPNG 2655 + +/* ************************************************************************** */ + +#define MNG_FN_WRITE_IHDR 2801 +#define MNG_FN_WRITE_PLTE 2802 +#define MNG_FN_WRITE_IDAT 2803 +#define MNG_FN_WRITE_IEND 2804 +#define MNG_FN_WRITE_TRNS 2805 +#define MNG_FN_WRITE_GAMA 2806 +#define MNG_FN_WRITE_CHRM 2807 +#define MNG_FN_WRITE_SRGB 2808 +#define MNG_FN_WRITE_ICCP 2809 +#define MNG_FN_WRITE_TEXT 2810 +#define MNG_FN_WRITE_ZTXT 2811 +#define MNG_FN_WRITE_ITXT 2812 +#define MNG_FN_WRITE_BKGD 2813 +#define MNG_FN_WRITE_PHYS 2814 +#define MNG_FN_WRITE_SBIT 2815 +#define MNG_FN_WRITE_SPLT 2816 +#define MNG_FN_WRITE_HIST 2817 +#define MNG_FN_WRITE_TIME 2818 +#define MNG_FN_WRITE_MHDR 2819 +#define MNG_FN_WRITE_MEND 2820 +#define MNG_FN_WRITE_LOOP 2821 +#define MNG_FN_WRITE_ENDL 2822 +#define MNG_FN_WRITE_DEFI 2823 +#define MNG_FN_WRITE_BASI 2824 +#define MNG_FN_WRITE_CLON 2825 +#define MNG_FN_WRITE_PAST 2826 +#define MNG_FN_WRITE_DISC 2827 +#define MNG_FN_WRITE_BACK 2828 +#define MNG_FN_WRITE_FRAM 2829 +#define MNG_FN_WRITE_MOVE 2830 +#define MNG_FN_WRITE_CLIP 2831 +#define MNG_FN_WRITE_SHOW 2832 +#define MNG_FN_WRITE_TERM 2833 +#define MNG_FN_WRITE_SAVE 2834 +#define MNG_FN_WRITE_SEEK 2835 +#define MNG_FN_WRITE_EXPI 2836 +#define MNG_FN_WRITE_FPRI 2837 +#define MNG_FN_WRITE_NEED 2838 +#define MNG_FN_WRITE_PHYG 2839 +#define MNG_FN_WRITE_JHDR 2840 +#define MNG_FN_WRITE_JDAT 2841 +#define MNG_FN_WRITE_JSEP 2842 +#define MNG_FN_WRITE_DHDR 2843 +#define MNG_FN_WRITE_PROM 2844 +#define MNG_FN_WRITE_IPNG 2845 +#define MNG_FN_WRITE_PPLT 2846 +#define MNG_FN_WRITE_IJNG 2847 +#define MNG_FN_WRITE_DROP 2848 +#define MNG_FN_WRITE_DBYK 2849 +#define MNG_FN_WRITE_ORDR 2850 +#define MNG_FN_WRITE_UNKNOWN 2851 +#define MNG_FN_WRITE_MAGN 2852 +#define MNG_FN_WRITE_JDAA 2853 +#define MNG_FN_WRITE_EVNT 2854 +#define MNG_FN_WRITE_MPNG 2855 + +/* ************************************************************************** */ + +#define MNG_FN_ZLIB_INITIALIZE 3001 +#define MNG_FN_ZLIB_CLEANUP 3002 +#define MNG_FN_ZLIB_INFLATEINIT 3003 +#define MNG_FN_ZLIB_INFLATEROWS 3004 +#define MNG_FN_ZLIB_INFLATEDATA 3005 +#define MNG_FN_ZLIB_INFLATEFREE 3006 +#define MNG_FN_ZLIB_DEFLATEINIT 3007 +#define MNG_FN_ZLIB_DEFLATEROWS 3008 +#define MNG_FN_ZLIB_DEFLATEDATA 3009 +#define MNG_FN_ZLIB_DEFLATEFREE 3010 + +/* ************************************************************************** */ + +#define MNG_FN_PROCESS_DISPLAY_IHDR 3201 +#define MNG_FN_PROCESS_DISPLAY_PLTE 3202 +#define MNG_FN_PROCESS_DISPLAY_IDAT 3203 +#define MNG_FN_PROCESS_DISPLAY_IEND 3204 +#define MNG_FN_PROCESS_DISPLAY_TRNS 3205 +#define MNG_FN_PROCESS_DISPLAY_GAMA 3206 +#define MNG_FN_PROCESS_DISPLAY_CHRM 3207 +#define MNG_FN_PROCESS_DISPLAY_SRGB 3208 +#define MNG_FN_PROCESS_DISPLAY_ICCP 3209 +#define MNG_FN_PROCESS_DISPLAY_BKGD 3210 +#define MNG_FN_PROCESS_DISPLAY_PHYS 3211 +#define MNG_FN_PROCESS_DISPLAY_SBIT 3212 +#define MNG_FN_PROCESS_DISPLAY_SPLT 3213 +#define MNG_FN_PROCESS_DISPLAY_HIST 3214 +#define MNG_FN_PROCESS_DISPLAY_MHDR 3215 +#define MNG_FN_PROCESS_DISPLAY_MEND 3216 +#define MNG_FN_PROCESS_DISPLAY_LOOP 3217 +#define MNG_FN_PROCESS_DISPLAY_ENDL 3218 +#define MNG_FN_PROCESS_DISPLAY_DEFI 3219 +#define MNG_FN_PROCESS_DISPLAY_BASI 3220 +#define MNG_FN_PROCESS_DISPLAY_CLON 3221 +#define MNG_FN_PROCESS_DISPLAY_PAST 3222 +#define MNG_FN_PROCESS_DISPLAY_DISC 3223 +#define MNG_FN_PROCESS_DISPLAY_BACK 3224 +#define MNG_FN_PROCESS_DISPLAY_FRAM 3225 +#define MNG_FN_PROCESS_DISPLAY_MOVE 3226 +#define MNG_FN_PROCESS_DISPLAY_CLIP 3227 +#define MNG_FN_PROCESS_DISPLAY_SHOW 3228 +#define MNG_FN_PROCESS_DISPLAY_TERM 3229 +#define MNG_FN_PROCESS_DISPLAY_SAVE 3230 +#define MNG_FN_PROCESS_DISPLAY_SEEK 3231 +#define MNG_FN_PROCESS_DISPLAY_EXPI 3232 +#define MNG_FN_PROCESS_DISPLAY_FPRI 3233 +#define MNG_FN_PROCESS_DISPLAY_NEED 3234 +#define MNG_FN_PROCESS_DISPLAY_PHYG 3235 +#define MNG_FN_PROCESS_DISPLAY_JHDR 3236 +#define MNG_FN_PROCESS_DISPLAY_JDAT 3237 +#define MNG_FN_PROCESS_DISPLAY_JSEP 3238 +#define MNG_FN_PROCESS_DISPLAY_DHDR 3239 +#define MNG_FN_PROCESS_DISPLAY_PROM 3240 +#define MNG_FN_PROCESS_DISPLAY_IPNG 3241 +#define MNG_FN_PROCESS_DISPLAY_PPLT 3242 +#define MNG_FN_PROCESS_DISPLAY_IJNG 3243 +#define MNG_FN_PROCESS_DISPLAY_DROP 3244 +#define MNG_FN_PROCESS_DISPLAY_DBYK 3245 +#define MNG_FN_PROCESS_DISPLAY_ORDR 3246 +#define MNG_FN_PROCESS_DISPLAY_MAGN 3247 +#define MNG_FN_PROCESS_DISPLAY_JDAA 3248 + +/* ************************************************************************** */ + +#define MNG_FN_JPEG_INITIALIZE 3401 +#define MNG_FN_JPEG_CLEANUP 3402 +#define MNG_FN_JPEG_DECOMPRESSINIT 3403 +#define MNG_FN_JPEG_DECOMPRESSDATA 3404 +#define MNG_FN_JPEG_DECOMPRESSFREE 3405 + +#define MNG_FN_STORE_JPEG_G8 3501 +#define MNG_FN_STORE_JPEG_RGB8 3502 +#define MNG_FN_STORE_JPEG_G12 3503 +#define MNG_FN_STORE_JPEG_RGB12 3504 +#define MNG_FN_STORE_JPEG_GA8 3505 +#define MNG_FN_STORE_JPEG_RGBA8 3506 +#define MNG_FN_STORE_JPEG_GA12 3507 +#define MNG_FN_STORE_JPEG_RGBA12 3508 +#define MNG_FN_STORE_JPEG_G8_ALPHA 3509 +#define MNG_FN_STORE_JPEG_RGB8_ALPHA 3510 + +#define MNG_FN_INIT_JPEG_A1_NI 3511 +#define MNG_FN_INIT_JPEG_A2_NI 3512 +#define MNG_FN_INIT_JPEG_A4_NI 3513 +#define MNG_FN_INIT_JPEG_A8_NI 3514 +#define MNG_FN_INIT_JPEG_A16_NI 3515 + +#define MNG_FN_STORE_JPEG_G8_A1 3521 +#define MNG_FN_STORE_JPEG_G8_A2 3522 +#define MNG_FN_STORE_JPEG_G8_A4 3523 +#define MNG_FN_STORE_JPEG_G8_A8 3524 +#define MNG_FN_STORE_JPEG_G8_A16 3525 + +#define MNG_FN_STORE_JPEG_RGB8_A1 3531 +#define MNG_FN_STORE_JPEG_RGB8_A2 3532 +#define MNG_FN_STORE_JPEG_RGB8_A4 3533 +#define MNG_FN_STORE_JPEG_RGB8_A8 3534 +#define MNG_FN_STORE_JPEG_RGB8_A16 3535 + +#define MNG_FN_STORE_JPEG_G12_A1 3541 +#define MNG_FN_STORE_JPEG_G12_A2 3542 +#define MNG_FN_STORE_JPEG_G12_A4 3543 +#define MNG_FN_STORE_JPEG_G12_A8 3544 +#define MNG_FN_STORE_JPEG_G12_A16 3545 + +#define MNG_FN_STORE_JPEG_RGB12_A1 3551 +#define MNG_FN_STORE_JPEG_RGB12_A2 3552 +#define MNG_FN_STORE_JPEG_RGB12_A4 3553 +#define MNG_FN_STORE_JPEG_RGB12_A8 3554 +#define MNG_FN_STORE_JPEG_RGB12_A16 3555 + +#define MNG_FN_NEXT_JPEG_ALPHAROW 3591 +#define MNG_FN_NEXT_JPEG_ROW 3592 +#define MNG_FN_DISPLAY_JPEG_ROWS 3593 + +/* ************************************************************************** */ + +#define MNG_FN_MAGNIFY_G8_X1 3701 +#define MNG_FN_MAGNIFY_G8_X2 3702 +#define MNG_FN_MAGNIFY_RGB8_X1 3703 +#define MNG_FN_MAGNIFY_RGB8_X2 3704 +#define MNG_FN_MAGNIFY_GA8_X1 3705 +#define MNG_FN_MAGNIFY_GA8_X2 3706 +#define MNG_FN_MAGNIFY_GA8_X3 3707 +#define MNG_FN_MAGNIFY_GA8_X4 3708 +#define MNG_FN_MAGNIFY_RGBA8_X1 3709 +#define MNG_FN_MAGNIFY_RGBA8_X2 3710 +#define MNG_FN_MAGNIFY_RGBA8_X3 3711 +#define MNG_FN_MAGNIFY_RGBA8_X4 3712 +#define MNG_FN_MAGNIFY_G8_X3 3713 +#define MNG_FN_MAGNIFY_RGB8_X3 3714 +#define MNG_FN_MAGNIFY_GA8_X5 3715 +#define MNG_FN_MAGNIFY_RGBA8_X5 3716 + +#define MNG_FN_MAGNIFY_G16_X1 3725 +#define MNG_FN_MAGNIFY_G16_X2 3726 +#define MNG_FN_MAGNIFY_RGB16_X1 3727 +#define MNG_FN_MAGNIFY_RGB16_X2 3728 +#define MNG_FN_MAGNIFY_GA16_X1 3729 +#define MNG_FN_MAGNIFY_GA16_X2 3730 +#define MNG_FN_MAGNIFY_GA16_X3 3731 +#define MNG_FN_MAGNIFY_GA16_X4 3732 +#define MNG_FN_MAGNIFY_RGBA16_X1 3733 +#define MNG_FN_MAGNIFY_RGBA16_X2 3734 +#define MNG_FN_MAGNIFY_RGBA16_X3 3735 +#define MNG_FN_MAGNIFY_RGBA16_X4 3736 +#define MNG_FN_MAGNIFY_G16_X3 3737 +#define MNG_FN_MAGNIFY_RGB16_X3 3738 +#define MNG_FN_MAGNIFY_GA16_X5 3739 +#define MNG_FN_MAGNIFY_RGBA16_X5 3740 + +#define MNG_FN_MAGNIFY_G8_Y1 3751 +#define MNG_FN_MAGNIFY_G8_Y2 3752 +#define MNG_FN_MAGNIFY_RGB8_Y1 3753 +#define MNG_FN_MAGNIFY_RGB8_Y2 3754 +#define MNG_FN_MAGNIFY_GA8_Y1 3755 +#define MNG_FN_MAGNIFY_GA8_Y2 3756 +#define MNG_FN_MAGNIFY_GA8_Y3 3757 +#define MNG_FN_MAGNIFY_GA8_Y4 3758 +#define MNG_FN_MAGNIFY_RGBA8_Y1 3759 +#define MNG_FN_MAGNIFY_RGBA8_Y2 3760 +#define MNG_FN_MAGNIFY_RGBA8_Y3 3761 +#define MNG_FN_MAGNIFY_RGBA8_Y4 3762 +#define MNG_FN_MAGNIFY_G8_Y3 3763 +#define MNG_FN_MAGNIFY_RGB8_Y3 3764 +#define MNG_FN_MAGNIFY_GA8_Y5 3765 +#define MNG_FN_MAGNIFY_RGBA8_Y5 3766 + +#define MNG_FN_MAGNIFY_G16_Y1 3775 +#define MNG_FN_MAGNIFY_G16_Y2 3776 +#define MNG_FN_MAGNIFY_RGB16_Y1 3777 +#define MNG_FN_MAGNIFY_RGB16_Y2 3778 +#define MNG_FN_MAGNIFY_GA16_Y1 3779 +#define MNG_FN_MAGNIFY_GA16_Y2 3780 +#define MNG_FN_MAGNIFY_GA16_Y3 3781 +#define MNG_FN_MAGNIFY_GA16_Y4 3782 +#define MNG_FN_MAGNIFY_RGBA16_Y1 3783 +#define MNG_FN_MAGNIFY_RGBA16_Y2 3784 +#define MNG_FN_MAGNIFY_RGBA16_Y3 3785 +#define MNG_FN_MAGNIFY_RGBA16_Y4 3786 +#define MNG_FN_MAGNIFY_G16_Y3 3787 +#define MNG_FN_MAGNIFY_RGB16_Y3 3788 +#define MNG_FN_MAGNIFY_GA16_Y5 3789 +#define MNG_FN_MAGNIFY_RGBA16_Y5 3790 + +/* ************************************************************************** */ + +#define MNG_FN_DELTA_G1_G1 3801 +#define MNG_FN_DELTA_G2_G2 3802 +#define MNG_FN_DELTA_G4_G4 3803 +#define MNG_FN_DELTA_G8_G8 3804 +#define MNG_FN_DELTA_G16_G16 3805 +#define MNG_FN_DELTA_RGB8_RGB8 3806 +#define MNG_FN_DELTA_RGB16_RGB16 3807 +#define MNG_FN_DELTA_GA8_GA8 3808 +#define MNG_FN_DELTA_GA8_G8 3809 +#define MNG_FN_DELTA_GA8_A8 3810 +#define MNG_FN_DELTA_GA16_GA16 3811 +#define MNG_FN_DELTA_GA16_G16 3812 +#define MNG_FN_DELTA_GA16_A16 3813 +#define MNG_FN_DELTA_RGBA8_RGBA8 3814 +#define MNG_FN_DELTA_RGBA8_RGB8 3815 +#define MNG_FN_DELTA_RGBA8_A8 3816 +#define MNG_FN_DELTA_RGBA16_RGBA16 3817 +#define MNG_FN_DELTA_RGBA16_RGB16 3818 +#define MNG_FN_DELTA_RGBA16_A16 3819 + +#define MNG_FN_PROMOTE_G8_G8 3901 +#define MNG_FN_PROMOTE_G8_G16 3902 +#define MNG_FN_PROMOTE_G16_G16 3903 +#define MNG_FN_PROMOTE_G8_GA8 3904 +#define MNG_FN_PROMOTE_G8_GA16 3905 +#define MNG_FN_PROMOTE_G16_GA16 3906 +#define MNG_FN_PROMOTE_G8_RGB8 3907 +#define MNG_FN_PROMOTE_G8_RGB16 3908 +#define MNG_FN_PROMOTE_G16_RGB16 3909 +#define MNG_FN_PROMOTE_G8_RGBA8 3910 +#define MNG_FN_PROMOTE_G8_RGBA16 3911 +#define MNG_FN_PROMOTE_G16_RGBA16 3912 +#define MNG_FN_PROMOTE_GA8_GA16 3913 +#define MNG_FN_PROMOTE_GA8_RGBA8 3914 +#define MNG_FN_PROMOTE_GA8_RGBA16 3915 +#define MNG_FN_PROMOTE_GA16_RGBA16 3916 +#define MNG_FN_PROMOTE_RGB8_RGB16 3917 +#define MNG_FN_PROMOTE_RGB8_RGBA8 3918 +#define MNG_FN_PROMOTE_RGB8_RGBA16 3919 +#define MNG_FN_PROMOTE_RGB16_RGBA16 3920 +#define MNG_FN_PROMOTE_RGBA8_RGBA16 3921 +#define MNG_FN_PROMOTE_IDX8_RGB8 3922 +#define MNG_FN_PROMOTE_IDX8_RGB16 3923 +#define MNG_FN_PROMOTE_IDX8_RGBA8 3924 +#define MNG_FN_PROMOTE_IDX8_RGBA16 3925 + +#define MNG_FN_SCALE_G1_G2 4001 +#define MNG_FN_SCALE_G1_G4 4002 +#define MNG_FN_SCALE_G1_G8 4003 +#define MNG_FN_SCALE_G1_G16 4004 +#define MNG_FN_SCALE_G2_G4 4005 +#define MNG_FN_SCALE_G2_G8 4006 +#define MNG_FN_SCALE_G2_G16 4007 +#define MNG_FN_SCALE_G4_G8 4008 +#define MNG_FN_SCALE_G4_G16 4009 +#define MNG_FN_SCALE_G8_G16 4010 +#define MNG_FN_SCALE_GA8_GA16 4011 +#define MNG_FN_SCALE_RGB8_RGB16 4012 +#define MNG_FN_SCALE_RGBA8_RGBA16 4013 + +#define MNG_FN_SCALE_G2_G1 4021 +#define MNG_FN_SCALE_G4_G1 4022 +#define MNG_FN_SCALE_G8_G1 4023 +#define MNG_FN_SCALE_G16_G1 4024 +#define MNG_FN_SCALE_G4_G2 4025 +#define MNG_FN_SCALE_G8_G2 4026 +#define MNG_FN_SCALE_G16_G2 4027 +#define MNG_FN_SCALE_G8_G4 4028 +#define MNG_FN_SCALE_G16_G4 4029 +#define MNG_FN_SCALE_G16_G8 4030 +#define MNG_FN_SCALE_GA16_GA8 4031 +#define MNG_FN_SCALE_RGB16_RGB8 4032 +#define MNG_FN_SCALE_RGBA16_RGBA8 4033 + +#define MNG_FN_COMPOSEOVER_RGBA8 4501 +#define MNG_FN_COMPOSEOVER_RGBA16 4502 +#define MNG_FN_COMPOSEUNDER_RGBA8 4503 +#define MNG_FN_COMPOSEUNDER_RGBA16 4504 + +#define MNG_FN_FLIP_RGBA8 4521 +#define MNG_FN_FLIP_RGBA16 4522 +#define MNG_FN_TILE_RGBA8 4523 +#define MNG_FN_TILE_RGBA16 4524 + +/* ************************************************************************** */ +/* * * */ +/* * Trace string-table entry * */ +/* * * */ +/* ************************************************************************** */ + +typedef struct { + mng_uint32 iFunction; + mng_pchar zTracetext; + } mng_trace_entry; +typedef mng_trace_entry const * mng_trace_entryp; + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_TRACE_PROCS */ + +/* ************************************************************************** */ + +#endif /* _libmng_trace_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_types.h b/src/3rdparty/libmng/libmng_types.h new file mode 100644 index 0000000000..81fb29f528 --- /dev/null +++ b/src/3rdparty/libmng/libmng_types.h @@ -0,0 +1,574 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_types.h copyright (c) 2000-2007 G.Juyn * */ +/* * version : 1.0.10 * */ +/* * * */ +/* * purpose : type specifications * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Specification of the types used by the library * */ +/* * Creates platform-independant structure * */ +/* * * */ +/* * changes : 0.5.1 - 05/06/2000 - G.Juyn * */ +/* * - added iteratechunk callback definition * */ +/* * 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - improved definitions for DLL support * */ +/* * - added 8-bit palette definition * */ +/* * - added general array definitions * */ +/* * - added MNG_NULL definition * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - changed most callback prototypes to allow the app * */ +/* * to report errors during callback processing * */ +/* * 0.5.1 - 05/16/2000 - G.Juyn * */ +/* * - moved standard header includes into this file * */ +/* * (stdlib/mem for mem-mngmt & math for fp gamma-calc) * */ +/* * * */ +/* * 0.5.2 - 05/18/2000 - G.Juyn * */ +/* * - B003 - fixed problem with being proprietary * */ +/* * to Borland platform * */ +/* * - added helper definitions for JNG (IJG-based) * */ +/* * - fixed support for IJGSRC6B * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - added default IJG compression parameters and such * */ +/* * 0.5.2 - 05/31/2000 - G.Juyn * */ +/* * - fixed inclusion for memcpy (contributed by Tim Rowley) * */ +/* * - added mng_int32p (contributed by Tim Rowley) * */ +/* * 0.5.2 - 06/02/2000 - G.Juyn * */ +/* * - removed SWAP_ENDIAN reference (contributed by Tim Rowley)* */ +/* * - added getalphaline callback for RGB8_A8 canvasstyle * */ +/* * * */ +/* * 0.5.3 - 06/21/2000 - G.Juyn * */ +/* * - added speedtype to facilitate testing * */ +/* * 0.5.3 - 06/27/2000 - G.Juyn * */ +/* * - added typedef for mng_size_t * */ +/* * - changed size parameter for memory callbacks to * */ +/* * mng_size_t * */ +/* * 0.5.3 - 06/28/2000 - G.Juyn * */ +/* * - changed definition of 32-bit ints (64-bit platforms) * */ +/* * - changed definition of mng_handle (64-bit platforms) * */ +/* * 0.5.3 - 06/29/2000 - G.Juyn * */ +/* * - changed definition of mng_handle (again) * */ +/* * - swapped refresh parameters * */ +/* * - added inclusion of stdlib.h for abs() * */ +/* * * */ +/* * 0.9.0 - 06/30/2000 - G.Juyn * */ +/* * - changed refresh parameters to 'x,y,width,height' * */ +/* * 0.9.1 - 07/10/2000 - G.Juyn * */ +/* * - added suspendbuffer constants * */ +/* * 0.9.1 - 07/15/2000 - G.Juyn * */ +/* * - added callbacks for SAVE/SEEK processing * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/07/2000 - G.Juyn * */ +/* * - B111300 - fixup for improved portability * */ +/* * 0.9.3 - 08/12/2000 - G.Juyn * */ +/* * - added workaround for faulty PhotoShop iCCP chunk * */ +/* * 0.9.3 - 09/11/2000 - G.Juyn * */ +/* * - added export of zlib functions from windows dll * */ +/* * - fixed inclusion parameters once again to make those * */ +/* * external libs work together * */ +/* * - re-fixed fixed inclusion parameters * */ +/* * (these freeking libraries make me mad) * */ +/* * 0.9.3 - 10/11/2000 - G.Juyn * */ +/* * - added support for nEED * */ +/* * 0.9.3 - 10/17/2000 - G.Juyn * */ +/* * - added callback to process non-critical unknown chunks * */ +/* * * */ +/* * 0.9.4 - 11/20/2000 - R.Giles * */ +/* * - fixed inclusion of lcms header for non-windows platforms * */ +/* * 0.9.4 - 12/12/2000 - G.Juyn * */ +/* * - changed callback convention for MSVC (Thanks Chad) * */ +/* * 0.9.4 - 12/16/2000 - G.Juyn * */ +/* * - fixed mixup of data- & function-pointers (thanks Dimitri)* */ +/* * * */ +/* * 1.0.1 - 02/08/2001 - G.Juyn * */ +/* * - added MEND processing callback * */ +/* * * */ +/* * 1.0.2 - 06/23/2001 - G.Juyn * */ +/* * - added processterm callback * */ +/* * * */ +/* * 1.0.3 - 08/06/2001 - G.Juyn * */ +/* * - changed inclusion of lcms.h for Linux platforms * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * * */ +/* * 1.0.6 - 04/11/2003 - G.Juyn * */ +/* * - B719420 - fixed several MNG_APP_CMS problems * */ +/* * 1.0.6 - 06/15/2003 - R.Giles * */ +/* * - lcms.h inclusion is generally no longer prefixed * */ +/* * 1.0.6 - 07/07/2003 - G. R-P. * */ +/* * - added png_imgtypes enumeration * */ +/* * * */ +/* * 1.0.7 - 03/10/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * * */ +/* * 1.0.8 - 04/11/2004 - G.Juyn * */ +/* * - added data-push mechanisms for specialized decoders * */ +/* * 1.0.8 - 08/01/2004 - G.Juyn * */ +/* * - added support for 3+byte pixelsize for JPEG's * */ +/* * * */ +/* * 1.0.9 - 12/05/2004 - G.Juyn * */ +/* * - inclusion of zlib/lcms/ijgsrc6b with <> instead of "" * */ +/* * 1.0.9 - 12/06/2004 - G.Juyn * */ +/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */ +/* * * */ +/* * 1.0.10 - 04/08/2007 - G.Juyn * */ +/* * - added support for mPNG proposal * */ +/* * 1.0.10 - 04/12/2007 - G.Juyn * */ +/* * - added support for ANG proposal * */ +/* * * */ +/* ************************************************************************** */ + +#ifndef _libmng_types_h_ +#define _libmng_types_h_ + +/* ************************************************************************** */ + +#ifdef __BORLANDC__ +#pragma option -AT /* turn off strict ANSI-C for the moment */ +#endif + +#ifndef WIN32 +#if defined(_WIN32) || defined(__WIN32__) || defined(_Windows) || defined(_WINDOWS) +#define WIN32 /* gather them into a single define */ +#endif +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Here's where the external & standard libs are embedded * */ +/* * * */ +/* * (it can be a bit of a pain in the lower-back to get them to work * */ +/* * together) * */ +/* * * */ +/* ************************************************************************** */ + +#ifdef WIN32 /* only include needed stuff */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#endif + +#ifdef MNG_USE_DLL +#ifdef MNG_SKIP_ZLIB +#undef MNG_INCLUDE_ZLIB +#endif +#ifdef MNG_SKIP_LCMS +#undef MNG_INCLUDE_LCMS +#endif +#ifdef MNG_SKIP_IJG6B +#undef MNG_INCLUDE_IJG6B +#endif +#endif + +#ifdef MNG_INCLUDE_ZLIB /* zlib by Mark Adler & Jean-loup Gailly */ +#include +#endif + +#ifdef MNG_INCLUDE_LCMS /* little cms by Marti Maria Saguer */ +#ifndef ZLIB_DLL +#undef FAR +#endif +#include +#endif /* MNG_INCLUDE_LCMS */ + +#ifdef MNG_INCLUDE_IJG6B /* IJG's jpgsrc6b */ +#include +#ifdef MNG_USE_SETJMP +#include /* needed for error-recovery (blergh) */ +#else +#ifdef WIN32 +#define USE_WINDOWS_MESSAGEBOX /* display a messagebox under Windoze */ +#endif +#endif /* MNG_USE_SETJMP */ +#ifdef FAR +#undef FAR /* possibly defined by zlib or lcms */ +#endif +#define JPEG_INTERNAL_OPTIONS /* for RGB_PIXELSIZE */ +#include /* all that for JPEG support :-) */ +#endif /* MNG_INCLUDE_IJG6B */ + +#if defined(MNG_INTERNAL_MEMMNGMT) || defined(MNG_INCLUDE_FILTERS) +#include /* "calloc" & "free" & "abs" */ +#endif + +#include /* get proper integer widths */ + +#ifdef WIN32 +#if defined __BORLANDC__ +#include /* defines "memcpy" for BCB */ +#else +#include /* defines "memcpy" for other win32 platforms */ +#endif +#include /* "strncmp" + "strcmp" */ +#else /* WIN32 */ +#ifdef BSD +#include /* defines "memcpy", etc for BSD (?) */ +#else +#include /* defines "memcpy", etc for all others (???) */ +#endif +#endif /* WIN32 */ + +#if defined(MNG_FULL_CMS) || defined(MNG_GAMMA_ONLY) || defined(MNG_APP_CMS) +#include /* fp gamma-calculation */ +#endif + +/* ************************************************************************** */ +/* * * */ +/* * Platform-dependant stuff * */ +/* * * */ +/* ************************************************************************** */ + +/* TODO: this may require some elaboration for other platforms; + only works with BCB for now */ + +#ifndef MNG_DLL +#if defined(MNG_BUILD_DLL) || defined(MNG_USE_DLL) +#define MNG_DLL +#endif +#endif + +#define MNG_LOCAL static + +#if defined(MNG_DLL) && defined(WIN32) /* setup DLL calling conventions */ +#define MNG_DECL __stdcall +#if defined(MNG_BUILD_DLL) +#define MNG_EXT __declspec(dllexport) +#elif defined(MNG_USE_DLL) +#define MNG_EXT __declspec(dllimport) +#else +#define MNG_EXT +#endif +#ifdef MNG_STRICT_ANSI +#undef MNG_STRICT_ANSI /* can't do strict-ANSI with this DLL-stuff */ +#endif +#else +#define MNG_DECL /* dummies for non-DLL */ +#define MNG_EXT +#endif /* MNG_DLL && WIN32 */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* now force ANSI-C from here on */ +#endif + +/* ************************************************************************** */ + +#if USHRT_MAX == 0xffffffffU /* get the proper 32-bit width !!! */ +typedef unsigned short mng_uint32; +typedef signed short mng_int32; +#elif UINT_MAX == 0xffffffffU +typedef unsigned int mng_uint32; +typedef signed int mng_int32; +#elif ULONG_MAX == 0xffffffffU +typedef unsigned long mng_uint32; +typedef signed long mng_int32; +#else +#error "Sorry, I can't find any 32-bit integers on this platform." +#endif + +typedef signed short mng_int16; /* other basic integers */ +typedef unsigned short mng_uint16; +typedef signed char mng_int8; +typedef unsigned char mng_uint8; + +typedef double mng_float; /* basic float */ + +typedef size_t mng_size_t; /* size field for memory allocation */ + +typedef char * mng_pchar; /* string */ +typedef void * mng_ptr; /* generic pointer */ +typedef void (*mng_fptr) (void); /* generic function pointer */ + +/* ************************************************************************** */ +/* * * */ +/* * Platform-independant from here * */ +/* * * */ +/* ************************************************************************** */ + +typedef mng_uint32 * mng_uint32p; /* pointer to unsigned longs */ +typedef mng_int32 * mng_int32p; /* pointer to longs */ +typedef mng_uint16 * mng_uint16p; /* pointer to unsigned words */ +typedef mng_uint8 * mng_uint8p; /* pointer to unsigned bytes */ + +typedef mng_int8 mng_bool; /* booleans */ + +struct mng_data_struct; +typedef struct mng_data_struct * mng_handle; /* generic handle */ + +typedef mng_int32 mng_retcode; /* generic return code */ +typedef mng_int32 mng_chunkid; /* 4-byte chunkname identifier */ +typedef mng_ptr mng_chunkp; /* pointer to a chunk-structure */ +typedef mng_ptr mng_objectp; /* pointer to an object-structure */ + +typedef mng_chunkid * mng_chunkidp; /* pointer to chunkid */ + +typedef struct { /* 8-bit palette element */ + mng_uint8 iRed; + mng_uint8 iGreen; + mng_uint8 iBlue; + } mng_palette8e; +typedef mng_palette8e mng_palette8[256]; /* 8-bit palette */ +typedef mng_palette8e * mng_palette8ep; + +typedef mng_uint8 mng_uint8arr[256]; /* generic arrays */ +typedef mng_uint8 mng_uint8arr4[4]; +typedef mng_uint16 mng_uint16arr[256]; +typedef mng_uint32 mng_uint32arr2[2]; + +/* ************************************************************************** */ + +#define MNG_FALSE 0 +#define MNG_TRUE 1 +#define MNG_NULL 0 + +#define MNG_SUSPENDBUFFERSIZE 32768 +#define MNG_SUSPENDREQUESTSIZE 1024 + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB + +/* size of temporary zlib buffer for deflate processing */ +#define MNG_ZLIB_MAXBUF 8192 + +/* default zlib compression parameters for deflateinit2 */ +#define MNG_ZLIB_LEVEL 9 /* level */ +#define MNG_ZLIB_METHOD Z_DEFLATED /* method */ +#define MNG_ZLIB_WINDOWBITS 15 /* window size */ +#define MNG_ZLIB_MEMLEVEL 9 /* memory level */ +#define MNG_ZLIB_STRATEGY Z_DEFAULT_STRATEGY /* strategy */ + +#define MNG_MAX_IDAT_SIZE 4096 /* maximum size of IDAT data */ + +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_JNG + +#ifdef MNG_INCLUDE_IJG6B /* IJG helper defs */ +typedef struct jpeg_compress_struct mngjpeg_comp; +typedef struct jpeg_decompress_struct mngjpeg_decomp; +typedef struct jpeg_error_mgr mngjpeg_error; +typedef struct jpeg_source_mgr mngjpeg_source; + +typedef mngjpeg_comp * mngjpeg_compp; +typedef mngjpeg_decomp * mngjpeg_decompp; +typedef mngjpeg_error * mngjpeg_errorp; +typedef mngjpeg_source * mngjpeg_sourcep; + +typedef J_DCT_METHOD mngjpeg_dctmethod; + +/* default IJG parameters for compression */ +#define MNG_JPEG_DCT JDCT_DEFAULT /* DCT algorithm (JDCT_ISLOW) */ +#define MNG_JPEG_QUALITY 100 /* quality 0..100; 100=best */ +#define MNG_JPEG_SMOOTHING 0 /* default no smoothing */ +#define MNG_JPEG_PROGRESSIVE MNG_FALSE /* default is just baseline */ +#define MNG_JPEG_OPTIMIZED MNG_FALSE /* default is not optimized */ +#endif /* MNG_INCLUDE_IJG6B */ + +#define MNG_JPEG_MAXBUF 65500 /* max size of temp JPEG buffer */ +#define MNG_MAX_JDAT_SIZE 4096 /* maximum size of JDAT data */ + +#endif /* MNG_INCLUDE_JNG */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_LCMS +typedef cmsHPROFILE mng_cmsprof; /* little CMS helper defs */ +typedef cmsHTRANSFORM mng_cmstrans; +typedef cmsCIExyY mng_CIExyY; +typedef cmsCIExyYTRIPLE mng_CIExyYTRIPLE; +typedef LPGAMMATABLE mng_gammatabp; +#endif /* MNG_INCLUDE_LCMS */ + +/* ************************************************************************** */ + + /* enumeration of known graphics types */ +enum mng_imgtypes {mng_it_unknown, mng_it_png, mng_it_mng, mng_it_jng +#ifdef MNG_INCLUDE_MPNG_PROPOSAL + ,mng_it_mpng +#endif +#ifdef MNG_INCLUDE_ANG_PROPOSAL + ,mng_it_ang +#endif + }; +typedef enum mng_imgtypes mng_imgtype; + + /* enumeration of animation speed-types */ +enum mng_speedtypes {mng_st_normal, mng_st_fast, mng_st_slow, mng_st_slowest}; +typedef enum mng_speedtypes mng_speedtype; + +#ifdef MNG_OPTIMIZE_CHUNKREADER + /* enumeration object-creation indicators */ +enum mng_createobjtypes {mng_create_none, mng_create_always, mng_create_ifglobal}; +typedef enum mng_createobjtypes mng_createobjtype; +#endif + +/* ************************************************************************** */ + +/* enumeration of PNG image types */ +#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT +enum png_imgtypes + { + png_g1, + png_g2, + png_g4, + png_g8, + png_rgb8, + png_idx1, + png_idx2, + png_idx4, + png_idx8, + png_ga8, + png_rgba8, +#ifdef MNG_INCLUDE_JNG + png_jpeg_a1, + png_jpeg_a2, + png_jpeg_a4, + png_jpeg_a8, +#endif +#ifndef MNG_NO_16BIT_SUPPORT + png_g16, + png_ga16, + png_rgb16, + png_rgba16, +#ifdef MNG_INCLUDE_JNG + png_jpeg_a16, +#endif +#endif + png_none + }; + +typedef enum png_imgtypes png_imgtype; +#endif +/* ************************************************************************** */ + + /* memory management callbacks */ +typedef mng_ptr (MNG_DECL *mng_memalloc) (mng_size_t iLen); +typedef void (MNG_DECL *mng_memfree) (mng_ptr iPtr, + mng_size_t iLen); + +typedef void (MNG_DECL *mng_releasedata) (mng_ptr pUserdata, + mng_ptr pData, + mng_size_t iLength); + + /* I/O management callbacks */ +#ifndef MNG_NO_OPEN_CLOSE_STREAM +typedef mng_bool (MNG_DECL *mng_openstream) (mng_handle hHandle); +typedef mng_bool (MNG_DECL *mng_closestream) (mng_handle hHandle); +#endif +typedef mng_bool (MNG_DECL *mng_readdata) (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pRead); +typedef mng_bool (MNG_DECL *mng_writedata) (mng_handle hHandle, + mng_ptr pBuf, + mng_uint32 iBuflen, + mng_uint32p pWritten); + + /* error & trace processing callbacks */ +typedef mng_bool (MNG_DECL *mng_errorproc) (mng_handle hHandle, + mng_int32 iErrorcode, + mng_int8 iSeverity, + mng_chunkid iChunkname, + mng_uint32 iChunkseq, + mng_int32 iExtra1, + mng_int32 iExtra2, + mng_pchar zErrortext); +typedef mng_bool (MNG_DECL *mng_traceproc) (mng_handle hHandle, + mng_int32 iFuncnr, + mng_int32 iFuncseq, + mng_pchar zFuncname); + + /* read processing callbacks */ +typedef mng_bool (MNG_DECL *mng_processheader) (mng_handle hHandle, + mng_uint32 iWidth, + mng_uint32 iHeight); +typedef mng_bool (MNG_DECL *mng_processtext) (mng_handle hHandle, + mng_uint8 iType, + mng_pchar zKeyword, + mng_pchar zText, + mng_pchar zLanguage, + mng_pchar zTranslation); +typedef mng_bool (MNG_DECL *mng_processsave) (mng_handle hHandle); +typedef mng_bool (MNG_DECL *mng_processseek) (mng_handle hHandle, + mng_pchar zName); +typedef mng_bool (MNG_DECL *mng_processneed) (mng_handle hHandle, + mng_pchar zKeyword); +typedef mng_bool (MNG_DECL *mng_processmend) (mng_handle hHandle, + mng_uint32 iIterationsdone, + mng_uint32 iIterationsleft); +typedef mng_bool (MNG_DECL *mng_processunknown) (mng_handle hHandle, + mng_chunkid iChunkid, + mng_uint32 iRawlen, + mng_ptr pRawdata); +typedef mng_bool (MNG_DECL *mng_processterm) (mng_handle hHandle, + mng_uint8 iTermaction, + mng_uint8 iIteraction, + mng_uint32 iDelay, + mng_uint32 iItermax); + + /* display processing callbacks */ +typedef mng_ptr (MNG_DECL *mng_getcanvasline) (mng_handle hHandle, + mng_uint32 iLinenr); +typedef mng_ptr (MNG_DECL *mng_getbkgdline) (mng_handle hHandle, + mng_uint32 iLinenr); +typedef mng_ptr (MNG_DECL *mng_getalphaline) (mng_handle hHandle, + mng_uint32 iLinenr); +typedef mng_bool (MNG_DECL *mng_refresh) (mng_handle hHandle, + mng_uint32 iX, + mng_uint32 iY, + mng_uint32 iWidth, + mng_uint32 iHeight); + + /* timer management callbacks */ +typedef mng_uint32 (MNG_DECL *mng_gettickcount) (mng_handle hHandle); +typedef mng_bool (MNG_DECL *mng_settimer) (mng_handle hHandle, + mng_uint32 iMsecs); + + /* color management callbacks */ +typedef mng_bool (MNG_DECL *mng_processgamma) (mng_handle hHandle, + mng_uint32 iGamma); +typedef mng_bool (MNG_DECL *mng_processchroma) (mng_handle hHandle, + mng_uint32 iWhitepointx, + mng_uint32 iWhitepointy, + mng_uint32 iRedx, + mng_uint32 iRedy, + mng_uint32 iGreenx, + mng_uint32 iGreeny, + mng_uint32 iBluex, + mng_uint32 iBluey); +typedef mng_bool (MNG_DECL *mng_processsrgb) (mng_handle hHandle, + mng_uint8 iRenderingintent); +typedef mng_bool (MNG_DECL *mng_processiccp) (mng_handle hHandle, + mng_uint32 iProfilesize, + mng_ptr pProfile); +typedef mng_bool (MNG_DECL *mng_processarow) (mng_handle hHandle, + mng_uint32 iRowsamples, + mng_bool bIsRGBA16, + mng_ptr pRow); + + /* chunk access callback(s) */ +typedef mng_bool (MNG_DECL *mng_iteratechunk) (mng_handle hHandle, + mng_handle hChunk, + mng_chunkid iChunkid, + mng_uint32 iChunkseq); + +/* ************************************************************************** */ + +#endif /* _libmng_types_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_write.c b/src/3rdparty/libmng/libmng_write.c new file mode 100644 index 0000000000..79ff544384 --- /dev/null +++ b/src/3rdparty/libmng/libmng_write.c @@ -0,0 +1,198 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_write.c copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : Write management (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the write management routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * 0.5.1 - 05/16/2000 - G.Juyn * */ +/* * - moved the actual write_graphic functionality from * */ +/* * mng_hlapi to its appropriate function here * */ +/* * * */ +/* * 0.9.1 - 07/19/2000 - G.Juyn * */ +/* * - fixed writing of signature * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * * */ +/* * 1.0.8 - 07/06/2004 - G.R-P * */ +/* * - added conditionals around openstream/closestream * */ +/* * - defend against using undefined Open/Closestream function * */ +/* * 1.0.8 - 08/02/2004 - G.Juyn * */ +/* * - added conditional to allow easier writing of large MNG's * */ +/* * * */ +/* * 1.0.9 - 09/25/2004 - G.Juyn * */ +/* * - replaced MNG_TWEAK_LARGE_FILES with permanent solution * */ +/* * 1.0.9 - 12/20/2004 - G.Juyn * */ +/* * - cleaned up macro-invocations (thanks to D. Airlie) * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_memory.h" +#include "libmng_chunks.h" +#include "libmng_chunk_io.h" +#include "libmng_write.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE) +mng_retcode mng_drop_chunks (mng_datap pData) +{ + mng_chunkp pChunk; + mng_chunkp pNext; + mng_cleanupchunk fCleanup; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DROP_CHUNKS, MNG_LC_START); +#endif + + pChunk = pData->pFirstchunk; /* and get first stored chunk (if any) */ + + while (pChunk) /* more chunks to discard ? */ + { + pNext = ((mng_chunk_headerp)pChunk)->pNext; + /* call appropriate cleanup */ + fCleanup = ((mng_chunk_headerp)pChunk)->fCleanup; + fCleanup (pData, pChunk); + + pChunk = pNext; /* neeeext */ + } + + pData->pFirstchunk = MNG_NULL; + pData->pLastchunk = MNG_NULL; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_DROP_CHUNKS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */ + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_WRITE_PROCS + +/* ************************************************************************** */ + +mng_retcode mng_write_graphic (mng_datap pData) +{ + mng_chunkp pChunk; + mng_retcode iRetcode; + mng_uint32 iWritten; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_GRAPHIC, MNG_LC_START); +#endif + + pChunk = pData->pFirstchunk; /* we'll start with the first, thank you */ + + if (pChunk) /* is there anything to write ? */ + { /* open the file */ + if (!pData->bWriting) + { +#ifndef MNG_NO_OPEN_CLOSE_STREAM + if (pData->fOpenstream && !pData->fOpenstream ((mng_handle)pData)) + MNG_ERROR (pData, MNG_APPIOERROR); +#endif + { + pData->bWriting = MNG_TRUE; /* indicate writing */ + pData->iWritebufsize = 32768; /* get a temporary write buffer */ + /* reserve 12 bytes for length, chunkname & crc */ + MNG_ALLOC (pData, pData->pWritebuf, pData->iWritebufsize+12); + + /* write the signature */ + if (((mng_chunk_headerp)pChunk)->iChunkname == MNG_UINT_IHDR) + mng_put_uint32 (pData->pWritebuf, PNG_SIG); + else + if (((mng_chunk_headerp)pChunk)->iChunkname == MNG_UINT_JHDR) + mng_put_uint32 (pData->pWritebuf, JNG_SIG); + else + mng_put_uint32 (pData->pWritebuf, MNG_SIG); + + mng_put_uint32 (pData->pWritebuf+4, POST_SIG); + + if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, 8, &iWritten)) + { + MNG_FREE (pData, pData->pWritebuf, pData->iWritebufsize+12); + MNG_ERROR (pData, MNG_APPIOERROR); + } + + if (iWritten != 8) /* disk full ? */ + { + MNG_FREE (pData, pData->pWritebuf, pData->iWritebufsize+12); + MNG_ERROR (pData, MNG_OUTPUTERROR); + } + } + } + + while (pChunk) /* so long as there's something to write */ + { /* let's call its output routine */ + iRetcode = ((mng_chunk_headerp)pChunk)->fWrite (pData, pChunk); + if (iRetcode) /* on error bail out */ + return iRetcode; + /* neeeext */ + pChunk = ((mng_chunk_headerp)pChunk)->pNext; + } + + if (!pData->bCreating) + { /* free the temporary buffer */ + MNG_FREE (pData, pData->pWritebuf, pData->iWritebufsize+12); + + pData->bWriting = MNG_FALSE; /* done writing */ + /* close the stream now */ +#ifndef MNG_NO_OPEN_CLOSE_STREAM + if (pData->fClosestream && !pData->fClosestream ((mng_handle)pData)) + MNG_ERROR (pData, MNG_APPIOERROR); +#endif + + } else { + /* cleanup the written chunks */ + iRetcode = mng_drop_chunks (pData); + if (iRetcode) /* on error bail out */ + return iRetcode; + } + } + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_WRITE_GRAPHIC, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_WRITE_PROCS */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + + diff --git a/src/3rdparty/libmng/libmng_write.h b/src/3rdparty/libmng/libmng_write.h new file mode 100644 index 0000000000..df058fb774 --- /dev/null +++ b/src/3rdparty/libmng/libmng_write.h @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_write.h copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : Write management (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the write management routines * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * * */ +/* * 1.0.9 - 09/25/2004 - G.Juyn * */ +/* * - replaced MNG_TWEAK_LARGE_FILES with permanent solution * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_write_h_ +#define _libmng_write_h_ + +/* ************************************************************************** */ + +mng_retcode mng_drop_chunks (mng_datap pData); + +mng_retcode mng_write_graphic (mng_datap pData); + +/* ************************************************************************** */ + +#endif /* _libmng_write_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/libmng_zlib.c b/src/3rdparty/libmng/libmng_zlib.c new file mode 100644 index 0000000000..7d102e160d --- /dev/null +++ b/src/3rdparty/libmng/libmng_zlib.c @@ -0,0 +1,607 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_zlib.c copyright (c) 2000-2004 G.Juyn * */ +/* * version : 1.0.9 * */ +/* * * */ +/* * purpose : ZLIB library interface (implementation) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : implementation of the ZLIB library interface * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * 0.5.1 - 05/11/2000 - G.Juyn * */ +/* * - filled the deflatedata routine * */ +/* * 0.5.1 - 05/12/2000 - G.Juyn * */ +/* * - changed trace to macro for callback error-reporting * */ +/* * * */ +/* * 0.5.2 - 05/20/2000 - G.Juyn * */ +/* * - fixed for JNG alpha handling * */ +/* * 0.5.2 - 05/24/2000 - G.Juyn * */ +/* * - moved init of default zlib parms from here to * */ +/* * "mng_hlapi.c" * */ +/* * * */ +/* * 0.5.3 - 06/16/2000 - G.Juyn * */ +/* * - changed progressive-display processing * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* * 0.9.3 - 08/08/2000 - G.Juyn * */ +/* * - fixed compiler-warnings from Mozilla * */ +/* * 0.9.3 - 09/07/2000 - G.Juyn * */ +/* * - added support for new filter_types * */ +/* * * */ +/* * 1.0.5 - 08/07/2002 - G.Juyn * */ +/* * - added test-option for PNG filter method 193 (=no filter) * */ +/* * 1.0.5 - 08/19/2002 - G.Juyn * */ +/* * - B597134 - libmng pollutes the linker namespace * */ +/* * 1.0.5 - 09/19/2002 - G.Juyn * */ +/* * - added warning for too much IDAT data * */ +/* * * */ +/* * 1.0.6 - 07/07/2003 - G.R-P * */ +/* * - added MNG_NO_16BIT_SUPPORT support * */ +/* * * */ +/* * 1.0.9 - 10/09/2004 - G.R-P * */ +/* * - added MNG_NO_1_2_4BIT_SUPPORT support * */ +/* * * */ +/* ************************************************************************** */ + +#include "libmng.h" +#include "libmng_data.h" +#include "libmng_error.h" +#include "libmng_trace.h" +#ifdef __BORLANDC__ +#pragma hdrstop +#endif +#include "libmng_memory.h" +#include "libmng_pixels.h" +#include "libmng_filter.h" +#include "libmng_zlib.h" + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +/* ************************************************************************** */ + +#ifdef MNG_INCLUDE_ZLIB + +/* ************************************************************************** */ + +voidpf mngzlib_alloc (voidpf pData, + uInt iCount, + uInt iSize) +{ + voidpf pPtr; /* temporary space */ + +#ifdef MNG_INTERNAL_MEMMNGMT + pPtr = calloc (iCount, iSize); /* local allocation */ +#else + if (((mng_datap)pData)->fMemalloc) /* callback function set ? */ + pPtr = ((mng_datap)pData)->fMemalloc (iCount * iSize); + else + pPtr = Z_NULL; /* can't allocate! */ +#endif + + return pPtr; /* return the result */ +} + +/* ************************************************************************** */ + +void mngzlib_free (voidpf pData, + voidpf pAddress) +{ +#ifdef MNG_INTERNAL_MEMMNGMT + free (pAddress); /* free locally */ +#else + if (((mng_datap)pData)->fMemfree) /* callback set? */ + ((mng_datap)pData)->fMemfree (pAddress, 1); +#endif +} + +/* ************************************************************************** */ + +mng_retcode mngzlib_initialize (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INITIALIZE, MNG_LC_START); +#endif + +#ifdef MNG_INTERNAL_MEMMNGMT + pData->sZlib.zalloc = Z_NULL; /* let zlib figure out memory management */ + pData->sZlib.zfree = Z_NULL; + pData->sZlib.opaque = Z_NULL; +#else /* use user-provided callbacks */ + pData->sZlib.zalloc = mngzlib_alloc; + pData->sZlib.zfree = mngzlib_free; + pData->sZlib.opaque = (voidpf)pData; +#endif + + pData->bInflating = MNG_FALSE; /* not performing any action yet */ + pData->bDeflating = MNG_FALSE; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INITIALIZE, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +mng_retcode mngzlib_cleanup (mng_datap pData) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_CLEANUP, MNG_LC_START); +#endif + + if (pData->bInflating) /* force zlib cleanup */ + mngzlib_inflatefree (pData); + if (pData->bDeflating) + mngzlib_deflatefree (pData); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_CLEANUP, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +mng_retcode mngzlib_inflateinit (mng_datap pData) +{ + int iZrslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INFLATEINIT, MNG_LC_START); +#endif + /* initialize zlib structures and such */ + iZrslt = inflateInit (&pData->sZlib); + + if (iZrslt != Z_OK) /* on error bail out */ + MNG_ERRORZ (pData, (mng_uint32)iZrslt); + + pData->bInflating = MNG_TRUE; /* really inflating something now */ + pData->sZlib.next_out = 0; /* force JIT initialization */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INFLATEINIT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +#ifdef MNG_SUPPORT_DISPLAY +mng_retcode mngzlib_inflaterows (mng_datap pData, + mng_uint32 iInlen, + mng_uint8p pIndata) +{ + int iZrslt; + mng_retcode iRslt; + mng_ptr pSwap; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INFLATEROWS, MNG_LC_START); +#endif + + pData->sZlib.next_in = pIndata; /* let zlib know where to get stuff */ + pData->sZlib.avail_in = (uInt)iInlen; + + if (pData->sZlib.next_out == 0) /* initialize output variables ? */ + { /* let zlib know where to store stuff */ + pData->sZlib.next_out = pData->pWorkrow; + pData->sZlib.avail_out = (uInt)(pData->iRowsize + pData->iPixelofs); +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iPNGdepth < 8) + pData->sZlib.avail_out = (uInt)((pData->iPNGdepth*pData->iRowsize + 7)/8 + + pData->iPixelofs); +#endif +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iPNGdepth > 8) + pData->sZlib.avail_out = (uInt)(2*pData->iRowsize + pData->iPixelofs); +#endif + } + + do + { /* now inflate a row */ + iZrslt = inflate (&pData->sZlib, Z_SYNC_FLUSH); + /* produced a full row ? */ + if (((iZrslt == Z_OK) || (iZrslt == Z_STREAM_END)) && + (pData->sZlib.avail_out == 0)) + { /* image not completed yet ? */ + if (pData->iRow < (mng_int32)pData->iDataheight) + { +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iPNGdepth == 1) + { + /* Inflate Workrow to 8-bit */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8p pDest = pSrc + pData->iRowsize - (pData->iRowsize+7)/8; + + for (iX = ((pData->iRowsize+7)/8) ; iX > 0 ; iX--) + *pDest++ = *pSrc++; + + pDest = pData->pWorkrow+1; + pSrc = pDest + pData->iRowsize - (pData->iRowsize+7)/8; + for (iX = pData->iRowsize; ;) + { + *pDest++ = (((*pSrc)>>7)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>6)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>5)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>4)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>3)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>2)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>1)&1); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc) )&1); + if (iX-- <= 0) + break; + pSrc++; + } + } + else if (pData->iPNGdepth == 2) + { + /* Inflate Workrow to 8-bit */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8p pDest = pSrc + pData->iRowsize - (2*pData->iRowsize+7)/8; + + for (iX = ((2*pData->iRowsize+7)/8) ; iX > 0 ; iX--) + *pDest++ = *pSrc++; + + pDest = pData->pWorkrow+1; + pSrc = pDest + pData->iRowsize - (2*pData->iRowsize+7)/8; + for (iX = pData->iRowsize; ;) + { + *pDest++ = (((*pSrc)>>6)&3); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>4)&3); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc)>>2)&3); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc) )&3); + if (iX-- <= 0) + break; + pSrc++; + } + } + else if (pData->iPNGdepth == 4) + { + /* Inflate Workrow to 8-bit */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8p pDest = pSrc + pData->iRowsize - (4*pData->iRowsize+7)/8; + + for (iX = ((4*pData->iRowsize+7)/8) ; iX > 0 ; iX--) + *pDest++ = *pSrc++; + + pDest = pData->pWorkrow+1; + pSrc = pDest + pData->iRowsize - (4*pData->iRowsize+7)/8; + for (iX = pData->iRowsize; ;) + { + *pDest++ = (((*pSrc)>>4)&0x0f); + if (iX-- <= 0) + break; + *pDest++ = (((*pSrc) )&0x0f); + if (iX-- <= 0) + break; + pSrc++; + } + } + if (pData->iPNGdepth < 8 && pData->iColortype == 0) + { + /* Expand samples to 8-bit by LBR */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1}; + + for (iX = pData->iRowsize; iX > 0; iX--) + *pSrc++ *= multiplier[pData->iPNGdepth]; + } +#endif +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iPNGdepth > 8) + { + /* Reduce Workrow to 8-bit */ + mng_int32 iX; + mng_uint8p pSrc = pData->pWorkrow+1; + mng_uint8p pDest = pSrc; + + for (iX = pData->iRowsize; iX > 0; iX--) + { + *pDest = *pSrc; + pDest++; + pSrc+=2; + } + } +#endif + +#ifdef FILTER192 /* has leveling info ? */ + if (pData->iFilterofs == MNG_FILTER_DIFFERING) + iRslt = init_rowdiffering (pData); + else +#endif + iRslt = MNG_NOERROR; + /* filter the row if necessary */ + if ((!iRslt) && (pData->iFilterofs < pData->iPixelofs ) && + (*(pData->pWorkrow + pData->iFilterofs)) ) + iRslt = mng_filter_a_row (pData); + else + iRslt = MNG_NOERROR; + /* additional leveling/differing ? */ + if ((!iRslt) && (pData->fDifferrow)) + { + iRslt = ((mng_differrow)pData->fDifferrow) (pData); + + pSwap = pData->pWorkrow; + pData->pWorkrow = pData->pPrevrow; + pData->pPrevrow = pSwap; /* make sure we're processing the right data */ + } + + if (!iRslt) + { +#ifdef MNG_INCLUDE_JNG + if (pData->bHasJHDR) /* is JNG alpha-channel ? */ + { /* just store in object ? */ + if ((!iRslt) && (pData->fStorerow)) + iRslt = ((mng_storerow)pData->fStorerow) (pData); + } + else +#endif /* MNG_INCLUDE_JNG */ + { /* process this row */ + if ((!iRslt) && (pData->fProcessrow)) + iRslt = ((mng_processrow)pData->fProcessrow) (pData); + /* store in object ? */ + if ((!iRslt) && (pData->fStorerow)) + iRslt = ((mng_storerow)pData->fStorerow) (pData); + /* color correction ? */ + if ((!iRslt) && (pData->fCorrectrow)) + iRslt = ((mng_correctrow)pData->fCorrectrow) (pData); + /* slap onto canvas ? */ + if ((!iRslt) && (pData->fDisplayrow)) + { + iRslt = ((mng_displayrow)pData->fDisplayrow) (pData); + + if (!iRslt) /* check progressive display refresh */ + iRslt = mng_display_progressive_check (pData); + + } + } + } + + if (iRslt) /* on error bail out */ + MNG_ERROR (pData, iRslt); + + if (!pData->fDifferrow) /* swap row-pointers */ + { + pSwap = pData->pWorkrow; + pData->pWorkrow = pData->pPrevrow; + pData->pPrevrow = pSwap; /* so prev points to the processed row! */ + } + + iRslt = mng_next_row (pData); /* adjust variables for next row */ + + if (iRslt) /* on error bail out */ + MNG_ERROR (pData, iRslt); + } + /* let zlib know where to store next output */ + pData->sZlib.next_out = pData->pWorkrow; + pData->sZlib.avail_out = (uInt)(pData->iRowsize + pData->iPixelofs); +#ifdef MNG_NO_1_2_4BIT_SUPPORT + if (pData->iPNGdepth < 8) + pData->sZlib.avail_out = (uInt)((pData->iPNGdepth*pData->iRowsize + 7)/8 + + pData->iPixelofs); +#endif +#ifdef MNG_NO_16BIT_SUPPORT + if (pData->iPNGdepth > 8) + pData->sZlib.avail_out = (uInt)(2*pData->iRowsize + pData->iPixelofs); +#endif + } + } /* until some error or EOI + or all pixels received */ + while ( (iZrslt == Z_OK) && (pData->sZlib.avail_in > 0) && + ( (pData->iRow < (mng_int32)pData->iDataheight) || + ( (pData->iPass >= 0) && (pData->iPass < 7) ) ) ); + /* on error bail out */ + if ((iZrslt != Z_OK) && (iZrslt != Z_STREAM_END)) + MNG_ERRORZ (pData, (mng_uint32)iZrslt); + /* too much data ? */ + if ((iZrslt == Z_OK) && (pData->sZlib.avail_in > 0)) + MNG_WARNING (pData, MNG_TOOMUCHIDAT); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INFLATEROWS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} +#endif /* MNG_SUPPORT_DISPLAY */ + +/* ************************************************************************** */ + +mng_retcode mngzlib_inflatedata (mng_datap pData, + mng_uint32 iInlen, + mng_uint8p pIndata) +{ + int iZrslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INFLATEDATA, MNG_LC_START); +#endif + /* let zlib know where to get stuff */ + pData->sZlib.next_in = pIndata; + pData->sZlib.avail_in = (uInt)iInlen; + /* now inflate the data in one go! */ + iZrslt = inflate (&pData->sZlib, Z_FINISH); + /* not enough room in output-buffer ? */ + if ((iZrslt == Z_BUF_ERROR) || (pData->sZlib.avail_in > 0)) + return MNG_BUFOVERFLOW; + /* on error bail out */ + if ((iZrslt != Z_OK) && (iZrslt != Z_STREAM_END)) + MNG_ERRORZ (pData, (mng_uint32)iZrslt); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INFLATEDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mngzlib_inflatefree (mng_datap pData) +{ + int iZrslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INFLATEFREE, MNG_LC_START); +#endif + + pData->bInflating = MNG_FALSE; /* stopped it */ + + iZrslt = inflateEnd (&pData->sZlib); /* let zlib cleanup its own stuff */ + + if (iZrslt != Z_OK) /* on error bail out */ + MNG_ERRORZ (pData, (mng_uint32)iZrslt); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_INFLATEFREE, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +mng_retcode mngzlib_deflateinit (mng_datap pData) +{ + int iZrslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_DEFLATEINIT, MNG_LC_START); +#endif + /* initialize zlib structures and such */ + iZrslt = deflateInit2 (&pData->sZlib, pData->iZlevel, pData->iZmethod, + pData->iZwindowbits, pData->iZmemlevel, + pData->iZstrategy); + + if (iZrslt != Z_OK) /* on error bail out */ + MNG_ERRORZ (pData, (mng_uint32)iZrslt); + + pData->bDeflating = MNG_TRUE; /* really deflating something now */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_DEFLATEINIT, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +mng_retcode mngzlib_deflaterows (mng_datap pData, + mng_uint32 iInlen, + mng_uint8p pIndata) +{ +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_DEFLATEROWS, MNG_LC_START); +#endif + + + + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_DEFLATEROWS, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mngzlib_deflatedata (mng_datap pData, + mng_uint32 iInlen, + mng_uint8p pIndata) +{ + int iZrslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_DEFLATEDATA, MNG_LC_START); +#endif + + pData->sZlib.next_in = pIndata; /* let zlib know where to get stuff */ + pData->sZlib.avail_in = (uInt)iInlen; + /* now deflate the data in one go! */ + iZrslt = deflate (&pData->sZlib, Z_FINISH); + /* not enough room in output-buffer ? */ + if ((iZrslt == Z_BUF_ERROR) || (pData->sZlib.avail_in > 0)) + return MNG_BUFOVERFLOW; + /* on error bail out */ + if ((iZrslt != Z_OK) && (iZrslt != Z_STREAM_END)) + MNG_ERRORZ (pData, (mng_uint32)iZrslt); + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_DEFLATEDATA, MNG_LC_END); +#endif + + return MNG_NOERROR; +} + +/* ************************************************************************** */ + +mng_retcode mngzlib_deflatefree (mng_datap pData) +{ + int iZrslt; + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_DEFLATEFREE, MNG_LC_START); +#endif + + iZrslt = deflateEnd (&pData->sZlib); /* let zlib cleanup its own stuff */ + + if (iZrslt != Z_OK) /* on error bail out */ + MNG_ERRORZ (pData, (mng_uint32)iZrslt); + + pData->bDeflating = MNG_FALSE; /* stopped it */ + +#ifdef MNG_SUPPORT_TRACE + MNG_TRACE (pData, MNG_FN_ZLIB_DEFLATEFREE, MNG_LC_END); +#endif + + return MNG_NOERROR; /* done */ +} + +/* ************************************************************************** */ + +#endif /* MNG_INCLUDE_ZLIB */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ + diff --git a/src/3rdparty/libmng/libmng_zlib.h b/src/3rdparty/libmng/libmng_zlib.h new file mode 100644 index 0000000000..cfc3918234 --- /dev/null +++ b/src/3rdparty/libmng/libmng_zlib.h @@ -0,0 +1,60 @@ +/* ************************************************************************** */ +/* * For conditions of distribution and use, * */ +/* * see copyright notice in libmng.h * */ +/* ************************************************************************** */ +/* * * */ +/* * project : libmng * */ +/* * file : libmng_zlib.h copyright (c) 2000-2002 G.Juyn * */ +/* * version : 1.0.0 * */ +/* * * */ +/* * purpose : ZLIB package interface (definition) * */ +/* * * */ +/* * author : G.Juyn * */ +/* * * */ +/* * comment : Definition of the ZLIB package interface * */ +/* * * */ +/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ +/* * - changed strict-ANSI stuff * */ +/* * * */ +/* * 0.9.2 - 08/05/2000 - G.Juyn * */ +/* * - changed file-prefixes * */ +/* * * */ +/* ************************************************************************** */ + +#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) +#pragma option -A /* force ANSI-C */ +#endif + +#ifndef _libmng_zlib_h_ +#define _libmng_zlib_h_ + +/* ************************************************************************** */ + +mng_retcode mngzlib_initialize (mng_datap pData); +mng_retcode mngzlib_cleanup (mng_datap pData); + +mng_retcode mngzlib_inflateinit (mng_datap pData); +mng_retcode mngzlib_inflaterows (mng_datap pData, + mng_uint32 iInlen, + mng_uint8p pIndata); +mng_retcode mngzlib_inflatedata (mng_datap pData, + mng_uint32 iInlen, + mng_uint8p pIndata); +mng_retcode mngzlib_inflatefree (mng_datap pData); + +mng_retcode mngzlib_deflateinit (mng_datap pData); +mng_retcode mngzlib_deflaterows (mng_datap pData, + mng_uint32 iInlen, + mng_uint8p pIndata); +mng_retcode mngzlib_deflatedata (mng_datap pData, + mng_uint32 iInlen, + mng_uint8p pIndata); +mng_retcode mngzlib_deflatefree (mng_datap pData); + +/* ************************************************************************** */ + +#endif /* _libmng_zlib_h_ */ + +/* ************************************************************************** */ +/* * end of file * */ +/* ************************************************************************** */ diff --git a/src/3rdparty/libmng/makefiles/Makefile.am b/src/3rdparty/libmng/makefiles/Makefile.am new file mode 100644 index 0000000000..b53523e9aa --- /dev/null +++ b/src/3rdparty/libmng/makefiles/Makefile.am @@ -0,0 +1,29 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = 1.3 foreign no-dependencies + +# include the app subdirectories in the distribution +EXTRA_DIST = makefiles doc contrib + + +# libmng release @VERSION@ +libmng_la_LDFLAGS = -version-info 1:0:0 + +lib_LTLIBRARIES = libmng.la + +include_HEADERS = libmng.h libmng_conf.h libmng_types.h +noinst_HEADERS = libmng_chunk_io.h libmng_chunk_prc.h libmng_chunks.h \ + libmng_cms.h libmng_data.h libmng_display.h libmng_dither.h \ + libmng_error.h libmng_filter.h libmng_jpeg.h libmng_memory.h \ + libmng_object_prc.h libmng_objects.h libmng_pixels.h \ + libmng_read.h libmng_trace.h libmng_write.h libmng_zlib.h + +libmng_la_SOURCES = libmng_callback_xs.c libmng_chunk_io.c \ + libmng_chunk_prc.c libmng_chunk_xs.c libmng_cms.c \ + libmng_display.c libmng_dither.c libmng_error.c \ + libmng_filter.c libmng_hlapi.c libmng_jpeg.c \ + libmng_object_prc.c libmng_pixels.c libmng_prop_xs.c \ + libmng_read.c libmng_trace.c libmng_write.c libmng_zlib.c + +man_MANS = doc/man/libmng.3 doc/man/jng.5 doc/man/mng.5 + diff --git a/src/3rdparty/libmng/makefiles/README b/src/3rdparty/libmng/makefiles/README new file mode 100644 index 0000000000..63faaafb0c --- /dev/null +++ b/src/3rdparty/libmng/makefiles/README @@ -0,0 +1,27 @@ +For conditions of distribution and use, see copyright notice in libmng.h +or the file LICENSE in the top-level directory of the source distribution. + +This directory hosts the makefiles for a number of supported platforms. + +If you're using a system with POSIX shell capabilities, you can use the +'configure' script in the top-level directory, or generate it by running +'autogen.sh' if you have the necessary tools installed. + +Otherwise, copy the module for your environment (or the closest thing) +into the libmng source-directory and change it to your needs. If you +create a new file for a platform not on the list send it to me (gerard @ +libmng.com) and I'll be happy to include it in the next release! + + +Current files: + +makefile.bcb3 - Borland C++ Builder +makefile.vcwin32 - Microsoft Visual C++ +makefile.unix - generic Unix +makefile.linux - Linux ELF (builds shared library) +makefile.dj - DJGPP +makefile.mingw - builds a static library for mingw32 +makefile.mingwdll - builds a dynamic library for mingw32 +makefile.irix - builds a static library for SGI/IRIX (6.5.21) + +Makefile.am, configure.in and acinclude.m4 (if present) - automake/autoconf source diff --git a/src/3rdparty/libmng/makefiles/configure.in b/src/3rdparty/libmng/makefiles/configure.in new file mode 100644 index 0000000000..e7cb75c006 --- /dev/null +++ b/src/3rdparty/libmng/makefiles/configure.in @@ -0,0 +1,193 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT +AC_CONFIG_SRCDIR([libmng.h]) +AC_PREREQ(2.52) + +dnl this call will define PACKAGE and VERSION +dnl please use this as the primary reference for the version number +AM_INIT_AUTOMAKE(libmng, 1.0.9) + +dnl pass the version string on the the makefiles +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +dnl Checks for programs. +AC_PROG_CC +AC_ISC_POSIX +AM_C_PROTOTYPES +if test "x$U" != "x"; then + AC_MSG_ERROR(Compiler not ANSI compliant) +fi +AM_PROG_LIBTOOL +AC_PROG_INSTALL + +dnl support for files >2GB +AC_SYS_LARGEFILE + +dnl Check for required header files +AC_HEADER_STDC + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST + +dnl need pow and fabs +AC_CHECK_FUNC(pow, , AC_CHECK_LIB(m, pow, LIBS="$LIBS -lm")) + + +dnl what functionality we want to add (read, write, display). +dnl all on by default. see libmng_conf.h for full descriptions + +dnl not building a standard shared object? +AC_ARG_ENABLE(buildso, +[ --disable-buildso disable building standard shared object]) +if test "x$enable_buildso" != "xno"; then + AC_DEFINE(MNG_BUILD_SO) +fi + +dnl we only support the full mng spec for now (no LC or VLC) +AC_DEFINE(MNG_SUPPORT_FULL) + +dnl remove support in library to read images? +AC_ARG_ENABLE(read, +[ --disable-read remove read support from library]) +if test "x$enable_read" != "xno"; then + AC_DEFINE(MNG_SUPPORT_READ) +fi + +dnl remove support in library to write images? +AC_ARG_ENABLE(write, +[ --disable-write remove write support from library]) +if test "x$enable_write" != "xno"; then + AC_DEFINE(MNG_SUPPORT_WRITE) +fi + +dnl remove support in library to display images? +AC_ARG_ENABLE(display, +[ --disable-display remove display support from library]) +if test "x$enable_display" != "xno"; then + AC_DEFINE(MNG_SUPPORT_DISPLAY) +fi + +dnl remove support for 'dynamic' MNG? +AC_ARG_ENABLE(dynamic, +[ --disable-dynamic remove dynamic MNG support from library]) +if test "x$enable_dynamic" != "xno"; then + AC_DEFINE(MNG_SUPPORT_DYNAMICMNG) +fi + +dnl remove support in library to access chunks? +AC_ARG_ENABLE(chunks, +[ --disable-chunks remove support for chunk access]) +if test "x$enable_chunks" != "xno"; then + AC_DEFINE(MNG_ACCESS_CHUNKS) +fi + +dnl disable support for accessing chunks that have been previously read? +AC_ARG_ENABLE(storechunks, +[ --disable-storechunks remove support for access of previous chunks]) +if test "x$enable_storechunks" != "xno"; then + AC_DEFINE(MNG_STORE_CHUNKS) +fi + +dnl enable support for debug tracing callbacks and messages? +AC_ARG_ENABLE(trace, +[ --enable-trace include support for debug tracing callbacks],[ +if test "x$enable_trace" = "xyes"; then + AC_DEFINE(MNG_SUPPORT_TRACE) + AC_DEFINE(MNG_TRACE_TELLTALE) +fi +]) + +dnl verbose error text +dnl this should always be on +AC_DEFINE(MNG_ERROR_TELLTALE) + + +dnl libz is required. +AC_ARG_WITH(zlib, +[ --with-zlib[=DIR] use zlib include/library files in DIR],[ + if test -d "$withval"; then + CPPFLAGS="$CPPFLAGS -I$withval/include" + LDFLAGS="$LDFLAGS -L$withval/lib" + fi +]) +AC_CHECK_HEADER(zlib.h, + AC_CHECK_LIB(z, gzread, , AC_MSG_ERROR(zlib library not found)), + AC_MSG_ERROR(zlib header not found) +) + +dnl check for jpeg library +AC_ARG_WITH(jpeg, +[ --with-jpeg[=DIR] use jpeg include/library files in DIR], +[with_jpeg=$withval],[with_jpeg=_auto]) + + if test "x$with_jpeg" != "xno" -a "x$with_jpeg" != "xyes" -a \ + "x$with_jpeg" != "x_auto"; then + # Save in case test with directory specified fails + _cppflags=${CPPFLAGS} + _ldflags=${LDFLAGS} + _restore=1 + + CPPFLAGS="${CPPFLAGS} -I$withval/include" + LDFLAGS="${LDFLAGS} -L$withval/lib" + else + _restore=0 + fi + + if test "x$with_jpeg" != "xno"; then + AC_CHECK_HEADER(jpeglib.h, + AC_CHECK_LIB(jpeg, jpeg_read_header, [ + LIBS="$LIBS -ljpeg" + AC_DEFINE(HAVE_LIBJPEG) + _restore=0 + ], + AC_MSG_WARN(jpeg library not found)), + AC_MSG_WARN(jpeg header not found) + ) + fi + + test $_restore -eq 1 && CPPFLAGS=$_cppflags LDFLAGS=$_ldflags + +dnl check for lcms library +AC_ARG_WITH(lcms, +[ --with-lcms[=DIR] use lcms include/library files in DIR], +[with_lcms=$withval],[with_lcms=_auto]) + + if test "x$with_lcms" != "xno" -a "x$with_lcms" != "xyes" -a \ + "x$with_lcms" != "x_auto"; then + # Save in case test with directory specified fails + _cppflags=$CPPFLAGS + _ldflags=$LDFLAGS + _restore=1 + + CPPFLAGS="$CPPFLAGS -I$withval/include" + LDFLAGS="$LDFLAGS -L$withval/lib" + else + _restore=0 + fi + + if test "x$with_lcms" != "xno"; then + AC_CHECK_HEADER(lcms.h, [ + have_lcms=yes + AC_CHECK_LIB(lcms, cmsCreateRGBProfile, [ + LIBS="$LIBS -llcms" + AC_DEFINE(HAVE_LIBLCMS) + dnl for now this implies MNG_INCLUDE_LCMS in the headers: + AC_DEFINE(MNG_FULL_CMS) + _restore=0 + have_lcms=yes + ],[ + have_lcms=no + ]) + ]) + dnl give feedback only if the user asked specifically for lcms + if test "x$with_lcms" != "x_auto" -a "x$have_lcms" != "xyes"; then + AC_MSG_WARN([lcms not found... disabling CMS support]) + fi + fi + + test $_restore -eq 1 && CPPFLAGS=$_cppflags LDFLAGS=$_ldflags + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/src/3rdparty/libmng/makefiles/makefile.bcb3 b/src/3rdparty/libmng/makefiles/makefile.bcb3 new file mode 100644 index 0000000000..3ddcb2d139 --- /dev/null +++ b/src/3rdparty/libmng/makefiles/makefile.bcb3 @@ -0,0 +1,108 @@ +# +# For conditions of distribution and use, see copyright notice in libmng.h +# +# makefile for libmng - THE MNG library +# this makefile is suitable for Borland C++ Builder. +# it works (at least) with Borland C++ Builder v3 + +# Configuration options are now in mng_conf.h +# this option forces dll compatibility +MNGOPT = -DMNG_BUILD_DLL + +# The name of your C compiler: +CC= bcc32 + +# compiler options: +CFLAGS= -WD -O2 -Hc -w-par -k -y -v -vi -c -tWD \ + -wuse -wucp -wstv -wstu -wsig -wpin -wnod -wnak -wdef -wcln -wbbf -wasm -wamp \ + -wamb -Tkh30000 -ff -5 -I.;..\zlib;..\jpgsrc6b;..\lcms\include $(MNGOPT) + +# source files +SOURCES= libmng_hlapi.c libmng_callback_xs.c libmng_prop_xs.c libmng_chunk_xs.c \ + libmng_chunk_descr.c libmng_read.c libmng_write.c libmng_display.c \ + libmng_object_prc.c libmng_chunk_prc.c libmng_chunk_io.c libmng_error.c \ + libmng_trace.c libmng_pixels.c libmng_filter.c libmng_dither.c \ + libmng_zlib.c libmng_jpeg.c libmng_cms.c + +# object files +OBJECTS= libmng_hlapi.obj libmng_callback_xs.obj libmng_prop_xs.obj libmng_chunk_xs.obj \ + libmng_chunk_descr.obj libmng_read.obj libmng_write.obj libmng_display.obj \ + libmng_object_prc.obj libmng_chunk_prc.obj libmng_chunk_io.obj libmng_error.obj \ + libmng_trace.obj libmng_pixels.obj libmng_filter.obj libmng_dither.obj \ + libmng_zlib.obj libmng_jpeg.obj libmng_cms.obj + +# type dependancies +.c.obj: + $(CC) $(CFLAGS) -c{ $<} + +# make options +all: libmng.lib + +clean: + - del *.obj + - del libmng.lib + +# file dependancies +libmng.lib: $(OBJECTS) + - del libmng.lib + tlib libmng.lib /E /C @&&| ++libmng_hlapi.obj +libmng_callback_xs.obj +libmng_prop_xs.obj +libmng_chunk_xs.obj & ++libmng_read.obj +libmng_write.obj +libmng_display.obj & ++libmng_object_prc.obj +libmng_chunk_prc.obj +libmng_chunk_io.obj +libmng_error.obj & ++libmng_trace.obj +libmng_pixels.obj +libmng_filter.obj +libmng_dither.obj & ++libmng_zlib.obj +libmng_jpeg.obj +libmng_cms.obj +| + +libmng_hlapi.obj: libmng_hlapi.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_memory.h libmng_error.h libmng_trace.h libmng_read.h \ + libmng_write.h libmng_display.h libmng_zlib.h libmng_cms.h libmng_zlib.h +libmng_callback_xs.obj: libmng_callback_xs.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_prop_xs.obj: libmng_prop_xs.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_cms.h +libmng_chunk_xs.obj: libmng_chunk_xs.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_chunks.h libmng_chunk_prc.h libmng_error.h libmng_trace.h +libmng_read.obj: libmng_read.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_prc.h libmng_chunk_io.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_read.h libmng_display.h +libmng_write.obj: libmng_write.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_write.h +libmng_display.obj: libmng_display.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_zlib.h libmng_cms.h \ + libmng_pixels.h libmng_display.h +libmng_object_prc.obj: libmng_object_prc.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_display.h libmng_pixels.h +libmng_chunk_descr.obj: libmng_chunk_descr.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_chunks.h libmng_chunk_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h +libmng_chunk_prc.obj: libmng_chunk_prc.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_chunks.h libmng_chunk_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h +libmng_chunk_io.obj: libmng_chunk_io.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h libmng_chunks.h \ + libmng_chunk_io.h libmng_chunk_prc libmng_memory.h libmng_error.h \ + libmng_trace.h libmng_display.h libmng_zlib.h libmng_pixels.h +libmng_error.obj: libmng_error.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_trace.obj: libmng_trace.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_pixels.obj: libmng_pixels.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_memory.h libmng_error.h libmng_trace.h \ + libmng_cms.h libmng_filter.h libmng_pixels.h +libmng_filter.obj: libmng_filter.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_filter.h +libmng_dither.obj: libmng_dither.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_dither.h +libmng_zlib.obj: libmng_zlib.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h \ + libmng_filter.h libmng_zlib.h +libmng_jpeg.obj: libmng_jpeg.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h \ + libmng_pixels.h libmng_jpeg.h +libmng_cms.obj: libmng_cms.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_error.h libmng_trace.h libmng_cms.h + diff --git a/src/3rdparty/libmng/makefiles/makefile.dj b/src/3rdparty/libmng/makefiles/makefile.dj new file mode 100644 index 0000000000..2cef088817 --- /dev/null +++ b/src/3rdparty/libmng/makefiles/makefile.dj @@ -0,0 +1,155 @@ +# +# For conditions of distribution and use, see copyright notice in libmng.h +# +# makefile for libmng - THE MNG library +# This makefile have been tested on DJGPP v2 +# (Based on makefile.linux since both are GNU compilers) +# +# By Silvio Fonseca - gissi@sti.com.br + +#compiler +CC=gcc + +#default build options +OPTIONS= + +#DJGPP directory +prefix=C:/DJGPP +installprefix=C:\DJGPP + +#ZLIB Library and includes +ZLIBLIB=$(prefix)/lib +#ZLIBLIB=../zlib +ZLIBINC=$(prefix)/include +#ZLIBINC=../zlib + +#Jpeg library and includes +JPEGLIB=$(prefix)/lib +#JPEGLIB=../jpgsrc +JPEGINC=$(prefix)/include +#JPEGINC=../jpgsrc + +#Lcms library and includes +LCMSLIB=$(prefix)/lib +#LCMSLIB=../lcms +LCMSINC=$(prefix)/include +#LCMSINC=../lcms + +ALIGN= +# for i386: +#ALIGN=-malign-loops=2 -malign-functions=2 + +WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \ + -Wmissing-declarations -Wtraditional -Wcast-align \ + -Wstrict-prototypes -Wmissing-prototypes #-Wconversion + +CFLAGS=-I$(ZLIBINC) -I$(JPEGINC) -I$(LCMSINC) -Wall -O3 -funroll-loops \ + $(OPTIONS) $(ALIGN) # $(WARNMORE) -g +LDFLAGS=-L. -Wl,-rpath,. \ + -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) \ + -L$(JPEGLIB) -Wl,-rpath,$(JPEGLIB) \ + -L$(LCMSLIB) -Wl,-rpath,$(LCMSLIB) \ + -lmng -lz -ljpeg -llcms -lm +INCPATH=$(prefix)/include +LIBPATH=$(prefix)/lib + +OBJS = \ + libmng_callback_xs.o \ + libmng_chunk_io.o \ + libmng_chunk_descr.o \ + libmng_chunk_prc.o \ + libmng_chunk_xs.o \ + libmng_cms.o \ + libmng_display.o \ + libmng_dither.o \ + libmng_error.o \ + libmng_filter.o \ + libmng_hlapi.o \ + libmng_jpeg.o \ + libmng_object_prc.o \ + libmng_pixels.o \ + libmng_prop_xs.o \ + libmng_read.o \ + libmng_trace.o \ + libmng_write.o \ + libmng_zlib.o + +OBJSDLL = $(OBJS:.0=.pic.o) + +.SUFFIXES: .c .o .pic.o + +.c.pic.o: + $(CC) -c $(CFLAGS) -fPIC -o $@ $*.c + +all: libmng.a + +libmng.a: $(OBJS) + ar rc $@ $(OBJS) + ranlib $@ + +install: libmng.a + -@md $(installprefix)\include $(installprefix)\lib + copy libmng.h $(installprefix)\include + copy libmng_conf.h $(installprefix)\include + copy libmng_types.h $(installprefix)\include + copy libmng.a $(installprefix)\lib + +clean: + del *.o + del libmng.a + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +libmng_hlapi.o libmng_hlapi.pic.o: libmng_hlapi.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_memory.h libmng_error.h libmng_trace.h libmng_read.h \ + libmng_write.h libmng_display.h libmng_zlib.h libmng_cms.h libmng_zlib.h +libmng_callback_xs.o libmng_callback_xs.pic.o: libmng_callback_xs.c libmng.h \ + libmng_conf.h libmng_types.h libmng_data.h libmng_error.h libmng_trace.h +libmng_prop_xs.o libmng_prop_xs.pic.o: libmng_prop_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_error.h libmng_trace.h libmng_cms.h +libmng_chunk_xs.o libmng_chunk_xs.pic.o: libmng_chunk_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h \ + libmng_error.h libmng_trace.h +libmng_read.o libmng_read.pic.o: libmng_read.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_prc.h libmng_chunk_io.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_read.h libmng_display.h +libmng_write.o libmng_write.pic.o: libmng_write.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_write.h +libmng_display.o libmng_display.pic.o: libmng_display.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_zlib.h libmng_cms.h libmng_pixels.h \ + libmng_display.h +libmng_object_prc.o libmng_object_prc.pic.o: libmng_object_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_display.h libmng_pixels.h +libmng_chunk_descr.o libmng_chunk_descr.pic.o: libmng_chunk_descr.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_descr.h \ + libmng_chunk_prc.h libmng_memory.h libmng_error.h libmng_trace.h +libmng_chunk_prc.o libmng_chunk_prc.pic.o: libmng_chunk_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h +libmng_chunk_io.o libmng_chunk_io.pic.o: libmng_chunk_io.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_io.h libmng_chunk_prc.h libmng_memory.h libmng_error.h \ + libmng_trace.h libmng_display.h libmng_zlib.h libmng_pixels.h +libmng_error.o libmng_error.pic.o: libmng_error.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_trace.o libmng_trace.pic.o: libmng_trace.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_pixels.o libmng_pixels.pic.o: libmng_pixels.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_memory.h libmng_error.h libmng_trace.h \ + libmng_cms.h libmng_filter.h libmng_pixels.h +libmng_filter.o libmng_filter.pic.o: libmng_filter.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_filter.h +libmng_dither.o libmng_dither.pic.o: libmng_dither.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_dither.h +libmng_zlib.o libmng_zlib.pic.o: libmng_zlib.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h \ + libmng_filter.h libmng_zlib.h +libmng_jpeg.o libmng_jpeg.pic.o: libmng_jpeg.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h libmng_jpeg.h +libmng_cms.o libmng_cms.pic.o: libmng_cms.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_error.h libmng_trace.h libmng_cms.h + diff --git a/src/3rdparty/libmng/makefiles/makefile.linux b/src/3rdparty/libmng/makefiles/makefile.linux new file mode 100644 index 0000000000..e06a8294c6 --- /dev/null +++ b/src/3rdparty/libmng/makefiles/makefile.linux @@ -0,0 +1,180 @@ +# +# For conditions of distribution and use, see copyright notice in libmng.h +# +# makefile for libmng - THE MNG library +# this makefile is suitable for Linux ELF with gcc +# +# (this file is heavily copied from makefile.linux in the libpng package) + +# compiler +CC=gcc + +# default build options (this forces shared library compatibility!!) +#OPTIONS = -DMNG_BUILD_SO +OPTIONS = -DMNG_BUILD_SO -DMNG_FULL_CMS + +# where "make install" puts libmng.a,libmng.so*,libmng.h,libmng_conf.h,libmng_types.h +prefix=/usr/local + +# Where the zlib library and include files are located +#ZLIBLIB=../zlib +#ZLIBINC=../zlib +ZLIBLIB=/usr/local/lib +ZLIBINC=/usr/local/include + +# Where the jpeg library and include files are located +#JPEGLIB=../jpgsrc +#JPEGINC=../jpgsrc +JPEGLIB=/usr/local/lib +JPEGINC=/usr/local/include + +# Where the lcms library and include files are located +#LCMSLIB=../lcms/lib +#LCMSINC=../lcms/source +LCMSLIB=/usr/local/lib +LCMSINC=/usr/local/include + +ALIGN= +# for i386: +#ALIGN=-malign-loops=2 -malign-functions=2 + +WARNMORE=-Wwrite-strings -Wpointer-arith -Wshadow \ + -Wmissing-declarations -Wtraditional -Wcast-align \ + -Wstrict-prototypes -Wmissing-prototypes #-Wconversion + +# for pgcc version 2.95.1, -O3 is buggy; don't use it. + +CFLAGS=-I$(ZLIBINC) -I$(JPEGINC) -I$(LCMSINC) -Wall -O3 -funroll-loops \ + $(OPTIONS) $(ALIGN) # $(WARNMORE) -g +LDFLAGS=-L. -Wl,-rpath,. \ + -L$(ZLIBLIB) -Wl,-rpath,$(ZLIBLIB) \ + -L$(JPEGLIB) -Wl,-rpath,$(JPEGLIB) \ + -L$(LCMSLIB) -Wl,-rpath,$(LCMSLIB) \ + -lmng -lz -ljpeg -llcms -lm + +RANLIB=ranlib +#RANLIB=echo + +# current version numbers +MNGMAJ = 1 +MNGMIN = 1.0.9 +MNGVER = $(MNGMAJ).$(MNGMIN) + +INCPATH=$(prefix)/include +LIBPATH=$(prefix)/lib + +OBJS = \ + libmng_callback_xs.o \ + libmng_chunk_io.o \ + libmng_chunk_descr.o \ + libmng_chunk_prc.o \ + libmng_chunk_xs.o \ + libmng_cms.o \ + libmng_display.o \ + libmng_dither.o \ + libmng_error.o \ + libmng_filter.o \ + libmng_hlapi.o \ + libmng_jpeg.o \ + libmng_object_prc.o \ + libmng_pixels.o \ + libmng_prop_xs.o \ + libmng_read.o \ + libmng_trace.o \ + libmng_write.o \ + libmng_zlib.o + +OBJSDLL = $(OBJS:.0=.pic.o) + +.SUFFIXES: .c .o .pic.o + +.c.pic.o: + $(CC) -c $(CFLAGS) -fPIC -o $@ $*.c + +all: libmng.a libmng.so + +libmng.a: $(OBJS) + ar rc $@ $(OBJS) + $(RANLIB) $@ + +libmng.so: libmng.so.$(MNGMAJ) + ln -sf libmng.so.$(MNGMAJ) libmng.so + +libmng.so.$(MNGMAJ): libmng.so.$(MNGVER) + ln -sf libmng.so.$(MNGVER) libmng.so.$(MNGMAJ) + +libmng.so.$(MNGVER): $(OBJSDLL) +# $(CC) -shared -Wl,-soname,libmng.so.$(MNGMAJ) -o libmng.so.$(MNGVER) \ +# $(OBJSDLL) -L$(ZLIBLIB) -L$(JPEGLIB) -L$(LCMSLIB) -lz -lm -lc + $(CC) -shared -Wl,-soname,libmng.so.$(MNGMAJ) -o libmng.so.$(MNGVER) \ + $(OBJSDLL) -L$(ZLIBLIB) -L$(JPEGLIB) -ljpeg -L$(LCMSLIB) -llcms \ + -lz -lm -lc + +install: libmng.a libmng.so.$(MNGVER) + -@mkdir $(INCPATH) $(LIBPATH) + cp libmng.h libmng_conf.h libmng_types.h $(INCPATH) + chmod 644 $(INCPATH)/libmng.h $(INCPATH)/libmng_conf.h $(INCPATH)/libmng_types.h + cp libmng.a libmng.so.$(MNGVER) $(LIBPATH) + chmod 755 $(LIBPATH)/libmng.so.$(MNGVER) + -@/bin/rm -f $(LIBPATH)/libmng.so.$(MNGMAJ) $(LIBPATH)/libmng.so + (cd $(LIBPATH); ln -sf libmng.so.$(MNGVER) libmng.so.$(MNGMAJ); \ + ln -sf libmng.so.$(MNGMAJ) libmng.so) + +clean: + /bin/rm -f *.o libmng.a libmng.so* + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +libmng_hlapi.o libmng_hlapi.pic.o: libmng_hlapi.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_memory.h libmng_error.h libmng_trace.h libmng_read.h \ + libmng_write.h libmng_display.h libmng_zlib.h libmng_cms.h libmng_zlib.h +libmng_callback_xs.o libmng_callback_xs.pic.o: libmng_callback_xs.c libmng.h \ + libmng_conf.h libmng_types.h libmng_data.h libmng_error.h libmng_trace.h +libmng_prop_xs.o libmng_prop_xs.pic.o: libmng_prop_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_error.h libmng_trace.h libmng_cms.h +libmng_chunk_xs.o libmng_chunk_xs.pic.o: libmng_chunk_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h \ + libmng_error.h libmng_trace.h +libmng_read.o libmng_read.pic.o: libmng_read.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_prc.h libmng_chunk_io.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_read.h libmng_display.h +libmng_write.o libmng_write.pic.o: libmng_write.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_write.h +libmng_display.o libmng_display.pic.o: libmng_display.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_zlib.h libmng_cms.h libmng_pixels.h \ + libmng_display.h +libmng_object_prc.o libmng_object_prc.pic.o: libmng_object_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_display.h libmng_pixels.h +libmng_chunk_descr.o libmng_chunk_descr.pic.o: libmng_chunk_descr.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_descr.h libmng_memory.h \ + libmng_chunk_prc.h libmng_error.h libmng_trace.h +libmng_chunk_prc.o libmng_chunk_prc.pic.o: libmng_chunk_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h +libmng_chunk_io.o libmng_chunk_io.pic.o: libmng_chunk_io.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_io.h libmng_chunk_prc.h libmng_memory.h libmng_error.h \ + libmng_trace.h libmng_display.h libmng_zlib.h libmng_pixels.h +libmng_error.o libmng_error.pic.o: libmng_error.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_trace.o libmng_trace.pic.o: libmng_trace.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_pixels.o libmng_pixels.pic.o: libmng_pixels.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_memory.h libmng_error.h libmng_trace.h \ + libmng_cms.h libmng_filter.h libmng_pixels.h +libmng_filter.o libmng_filter.pic.o: libmng_filter.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_filter.h +libmng_dither.o libmng_dither.pic.o: libmng_dither.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_dither.h +libmng_zlib.o libmng_zlib.pic.o: libmng_zlib.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h \ + libmng_filter.h libmng_zlib.h +libmng_jpeg.o libmng_jpeg.pic.o: libmng_jpeg.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h libmng_jpeg.h +libmng_cms.o libmng_cms.pic.o: libmng_cms.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_error.h libmng_trace.h libmng_cms.h + diff --git a/src/3rdparty/libmng/makefiles/makefile.mingw b/src/3rdparty/libmng/makefiles/makefile.mingw new file mode 100644 index 0000000000..703ae30590 --- /dev/null +++ b/src/3rdparty/libmng/makefiles/makefile.mingw @@ -0,0 +1,164 @@ +# +# For conditions of distribution and use, see copyright notice in libmng.h +# +# makefile for libmng - THE MNG library +# this makefile is for MinGW32, it have been tested with gcc 2.95.3, +# binutils 2.11.90 and mingw-runtime 1.0 +# +# By Benoit Blanchon - benoit.blanchon@laposte.net +# +# Note : this makefile builds a static library; although it's seems to be +# possible to build working DLL and import lib, I didn't manage do to it. +# If you do, please let me know. + +# outputs +LIBMNG_A = libmng.a +INSTALL_PREFIX = C:/MinGW/ +# maybe you sould replace with anti-slashes + +# default build options +OPTIONS = -DMNG_NO_CMS -DMNG_ACCESS_CHUNKS -DMNG_STORE_CHUNKS + +# Where the zlib library and include files are located +ZLIBLIB=-lz +#ZLIBLIB=-L../zlib -lz +#ZLIBINC=-I../zlib + +# Where the jpeg library and include files are located +JPEGLIB=-ljpeg +#JPEGLIB=-L../jpgsrc -ljpeg +#JPEGINC=-I../jpgsrc + +# Where the lcms library and include files are located +#LCMSLIB=-llcms +#LCMSLIB=-L../lcms/lib -llcms +#LCMSINC=-I../lcms/source + +# file deletion command +RM=rm -f +#RM=del + +# directory creation command +MKDIR=mkdir -p + +# file copy command +COPY=cp +#COPY=copy + +# compiler +CC=gcc + +ALIGN= +# for i386: +#ALIGN=-malign-loops=2 -malign-functions=2 + +CFLAGS=$(ZLIBINC) $(JPEGINC) $(LCMSINC) -Wall -O3 -funroll-loops $(OPTIONS) $(ALIGN) +LDFLAGS=-L. -lmng $(ZLIBLIB) $(JPEGLIB) $(LCMSLIB) -lm + +# library (.a) file creation command +AR= ar rc +# second step in .a creation (use "touch" if not needed) +AR2= ranlib + +INCPATH=$(prefix)/include +LIBPATH=$(prefix)/lib + +OBJS = \ + libmng_callback_xs.o \ + libmng_chunk_io.o \ + libmng_chunk_descr.o \ + libmng_chunk_prc.o \ + libmng_chunk_xs.o \ + libmng_cms.o \ + libmng_display.o \ + libmng_dither.o \ + libmng_error.o \ + libmng_filter.o \ + libmng_hlapi.o \ + libmng_jpeg.o \ + libmng_object_prc.o \ + libmng_pixels.o \ + libmng_prop_xs.o \ + libmng_read.o \ + libmng_trace.o \ + libmng_write.o \ + libmng_zlib.o + +.SUFFIXES: .c .o + +.c.o: + $(CC) -c $(CFLAGS) -o $@ $*.c + +all: $(LIBMNG_A) + +$(LIBMNG_A) : $(OBJS) + $(RM) $@ + $(AR) $@ $(OBJS) + $(AR2) $@ + +install : $(LIBMNG_A) + $(MKDIR) $(INSTALL_PREFIX)include + $(COPY) libmng.h $(INSTALL_PREFIX)include + $(COPY) libmng_conf.h $(INSTALL_PREFIX)include + $(COPY) libmng_types.h $(INSTALL_PREFIX)include + $(MKDIR) $(INSTALL_PREFIX)lib + $(COPY) $(LIBMNG_A) $(INSTALL_PREFIX)lib + +clean: + $(RM) *.o + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +libmng_hlapi.o : libmng_hlapi.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_memory.h libmng_error.h libmng_trace.h libmng_read.h \ + libmng_write.h libmng_display.h libmng_zlib.h libmng_cms.h libmng_zlib.h +libmng_callback_xs.o : libmng_callback_xs.c libmng.h \ + libmng_conf.h libmng_types.h libmng_data.h libmng_error.h libmng_trace.h +libmng_prop_xs.o : libmng_prop_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_error.h libmng_trace.h libmng_cms.h +libmng_chunk_xs.o : libmng_chunk_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h \ + libmng_error.h libmng_trace.h +libmng_read.o : libmng_read.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_prc.h libmng_chunk_io.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_read.h libmng_display.h +libmng_write.o : libmng_write.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_write.h +libmng_display.o : libmng_display.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_zlib.h libmng_cms.h libmng_pixels.h \ + libmng_display.h +libmng_object_prc.o : libmng_object_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_display.h libmng_pixels.h +libmng_chunk_descr.o : libmng_chunk_descr.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_descr.h \ + libmng_chunk_prc.h libmng_memory.h libmng_error.h libmng_trace.h +libmng_chunk_prc.o : libmng_chunk_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h +libmng_chunk_io.o : libmng_chunk_io.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_io.h libmng_chunk_prc.h libmng_memory.h libmng_error.h \ + libmng_trace.h libmng_display.h libmng_zlib.h libmng_pixels.h +libmng_error.o : libmng_error.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_trace.o : libmng_trace.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_pixels.o : libmng_pixels.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_memory.h libmng_error.h libmng_trace.h \ + libmng_cms.h libmng_filter.h libmng_pixels.h +libmng_filter.o : libmng_filter.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_filter.h +libmng_dither.o : libmng_dither.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_dither.h +libmng_zlib.o : libmng_zlib.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h \ + libmng_filter.h libmng_zlib.h +libmng_jpeg.o : libmng_jpeg.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h libmng_jpeg.h +libmng_cms.o : libmng_cms.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_error.h libmng_trace.h libmng_cms.h + diff --git a/src/3rdparty/libmng/makefiles/makefile.mingwdll b/src/3rdparty/libmng/makefiles/makefile.mingwdll new file mode 100644 index 0000000000..2837218281 --- /dev/null +++ b/src/3rdparty/libmng/makefiles/makefile.mingwdll @@ -0,0 +1,158 @@ +# +# For conditions of distribution and use, see copyright notice in libmng.h +# +# makefile for libmng - THE MNG library +# this makefile is for MinGW32, it has been tested with gcc 3.1, +# binutils 2.12.90 and mingw-runtime 2.0 +# +# By Benoit Blanchon - benoit.blanchon@laposte.net +# DLL mods by F. Richter +# + +# outputs +LIBMNG_A = libmng.a +LIBMNG_DLL = libmng.1.dll +INSTALL_PREFIX = C:/MinGW/ +# maybe you sould replace with anti-slashes + +# default build options +OPTIONS = -DMNG_BUILD_DLL -DMNG_ACCESS_CHUNKS -DMNG_STORE_CHUNKS + +# Where the zlib library and include files are located +ZLIBLIB=-lz +#ZLIBLIB=-L../zlib -lz +#ZLIBINC=-I../zlib + +# Where the jpeg library and include files are located +JPEGLIB=-ljpeg +#JPEGLIB=-L../jpgsrc -ljpeg +#JPEGINC=-I../jpgsrc + +# Where the lcms library and include files are located +#LCMSLIB=-llcms +LCMSLIB=-L../lcms/lib -llcms +LCMSINC=-I../lcms/source + +# file deletion command +RM=rm -f +#RM=del + +# directory creation command +MKDIR=mkdir -p + +# file copy command +COPY=cp +#COPY=copy + +# compiler +CC=gcc + +ALIGN= +# for i386: +#ALIGN=-malign-loops=2 -malign-functions=2 + +CFLAGS=$(ZLIBINC) $(JPEGINC) $(LCMSINC) -Wall -O3 -funroll-loops $(OPTIONS) $(ALIGN) -s +LDFLAGS=-L. -lmng $(ZLIBLIB) $(JPEGLIB) $(LCMSLIB) -lm -s + +INCPATH=$(prefix)/include +LIBPATH=$(prefix)/lib + +OBJS = \ + libmng_callback_xs.o \ + libmng_chunk_io.o \ + libmng_chunk_descr.o \ + libmng_chunk_prc.o \ + libmng_chunk_xs.o \ + libmng_cms.o \ + libmng_display.o \ + libmng_dither.o \ + libmng_error.o \ + libmng_filter.o \ + libmng_hlapi.o \ + libmng_jpeg.o \ + libmng_object_prc.o \ + libmng_pixels.o \ + libmng_prop_xs.o \ + libmng_read.o \ + libmng_trace.o \ + libmng_write.o \ + libmng_zlib.o + +.SUFFIXES: .c .o + +.c.o: + $(CC) -c $(CFLAGS) -o $@ $*.c + +all: $(LIBMNG_A) + +$(LIBMNG_A): $(LIBMNG_DLL) + +$(LIBMNG_DLL) : $(OBJS) + dllwrap --implib=$(LIBMNG_A) --dllname=$(LIBMNG_DLL) $(OBJS) $(LDFLAGS) + +install : $(LIBMNG_A) + $(MKDIR) $(INSTALL_PREFIX)include + $(COPY) libmng.h $(INSTALL_PREFIX)include + $(COPY) libmng_conf.h $(INSTALL_PREFIX)include + $(COPY) libmng_types.h $(INSTALL_PREFIX)include + $(MKDIR) $(INSTALL_PREFIX)lib + $(COPY) $(LIBMNG_A) $(INSTALL_PREFIX)lib + +clean: + $(RM) *.o + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +libmng_hlapi.o : libmng_hlapi.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_memory.h libmng_error.h libmng_trace.h libmng_read.h \ + libmng_write.h libmng_display.h libmng_zlib.h libmng_cms.h libmng_zlib.h +libmng_callback_xs.o : libmng_callback_xs.c libmng.h \ + libmng_conf.h libmng_types.h libmng_data.h libmng_error.h libmng_trace.h +libmng_prop_xs.o : libmng_prop_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_error.h libmng_trace.h libmng_cms.h +libmng_chunk_xs.o : libmng_chunk_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h \ + libmng_error.h libmng_trace.h +libmng_read.o : libmng_read.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_prc.h libmng_chunk_io.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_read.h libmng_display.h +libmng_write.o : libmng_write.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_write.h +libmng_display.o : libmng_display.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_zlib.h libmng_cms.h libmng_pixels.h \ + libmng_display.h +libmng_object_prc.o : libmng_object_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_display.h libmng_pixels.h +libmng_chunk_descr.o : libmng_chunk_descr.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_descr.h \ + libmng_chunk_prc.h libmng_memory.h libmng_error.h libmng_trace.h +libmng_chunk_prc.o : libmng_chunk_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h +libmng_chunk_io.o : libmng_chunk_io.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_io.h libmng_chunk_prc.h libmng_memory.h libmng_error.h \ + libmng_trace.h libmng_display.h libmng_zlib.h libmng_pixels.h +libmng_error.o : libmng_error.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_trace.o : libmng_trace.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_pixels.o : libmng_pixels.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_memory.h libmng_error.h libmng_trace.h \ + libmng_cms.h libmng_filter.h libmng_pixels.h +libmng_filter.o : libmng_filter.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_filter.h +libmng_dither.o : libmng_dither.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_dither.h +libmng_zlib.o : libmng_zlib.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h \ + libmng_filter.h libmng_zlib.h +libmng_jpeg.o : libmng_jpeg.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h libmng_jpeg.h +libmng_cms.o : libmng_cms.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_error.h libmng_trace.h libmng_cms.h + diff --git a/src/3rdparty/libmng/makefiles/makefile.qnx b/src/3rdparty/libmng/makefiles/makefile.qnx new file mode 100644 index 0000000000..28f18d7634 --- /dev/null +++ b/src/3rdparty/libmng/makefiles/makefile.qnx @@ -0,0 +1,160 @@ +# +# For conditions of distribution and use, see copyright notice in libmng.h +# +# makefile for libmng - THE MNG library +# this makefile is suitable for QNX Neutrino + +# Configuration options are now in libmng_conf.h + +# The architecture of your target +# one of arm, mips, ppc, sh, x86 +ARCH = mips + +# The name of the library +LIBNAME = libmng +ARNAME = $(LIBNAME).a +SONAME = $(LIBNAME).so + +# current version numbers +MNGMAJ = 1 +MNGMIN = 0.9 +MNGVER = $(MNGMAJ).$(MNGMIN) + +# The artefact output folder +OBJDIR = bin + +# Location of jpeg header files +JPEG_INC = $(QNX_TARGET)/usr/include/jpeg + +# Location of zlib header files +ZLIB_INC = $(QNX_TARGET)/usr/include + +# Location of lcms header files +# (switch on MNG_FULL_CMS in libmng_conf.h if you want to use this) +LCMS_INC = $(QNX_TARGET)/usr/include/lcms + +# default build defines +DEF = +DEF_SO = -DMNG_BUILD_SO + +# compiler options: +CFLAGS = -O2 -funroll-loops + +# include paths +INC = -I$(ZLIB_INC) -I$(JPEG_INC) + +# The name of your C compiler: +CC = nto$(ARCH)-gcc + +# source files +SRC= \ + libmng_callback_xs.c \ + libmng_chunk_io.c \ + libmng_chunk_descr.c \ + libmng_chunk_prc.c \ + libmng_chunk_xs.c \ + libmng_cms.c \ + libmng_display.c \ + libmng_dither.c \ + libmng_error.c \ + libmng_filter.c \ + libmng_hlapi.c \ + libmng_jpeg.c \ + libmng_object_prc.c \ + libmng_pixels.c \ + libmng_prop_xs.c \ + libmng_read.c \ + libmng_trace.c \ + libmng_write.c \ + libmng_zlib.c + +# object files +OBJ=$(addprefix $(OBJDIR)/$(ARCH)/, $(SRC:%.c=%.o)) + +# object files for shared object +OBJ_SO=$(addprefix $(OBJDIR)/$(ARCH)/, $(SRC:%.c=%.pic.o)) + +# type dependancies +$(OBJDIR)/$(ARCH)/%.o: %.c + $(CC) $(CFLAGS) $(INC) $(DEF) -o $@ -c $< + +$(OBJDIR)/$(ARCH)/%.pic.o: %.c + $(CC) $(CFLAGS) $(INC) $(DEF_SO) -fPIC -o $@ -c $< + +all: init $(ARNAME) $(SONAME) + +init: + if [ ! -d $(OBJDIR)/$(ARCH) ]; then mkdir -p $(OBJDIR)/$(ARCH); fi + +$(ARNAME): $(OBJ) + ar r $(OBJDIR)/$(ARCH)/$(ARNAME) $(OBJ) + +$(SONAME): $(SONAME).$(MNGMAJ) + ln -sf $(OBJDIR)/$(ARCH)/$(SONAME).$(MNGMAJ) $(OBJDIR)/$(ARCH)/$(SONAME) + +$(SONAME).$(MNGMAJ): $(SONAME).$(MNGVER) + ln -sf $(OBJDIR)/$(ARCH)/$(SONAME).$(MNGVER) $(OBJDIR)/$(ARCH)/$(SONAME).$(MNGMAJ) + +$(SONAME).$(MNGVER): $(OBJ_SO) + $(CC) -shared -Wl,-soname,$(SONAME).$(MNGMAJ) -o $(OBJDIR)/$(ARCH)/$(SONAME).$(MNGVER) $(OBJ_SO) \ + -lz -lm -ljpeg +# -lz -lm -ljpeg -llcms + +clean: + rm -f $(OBJ) $(OBJ_SO) + rm -f $(OBJDIR)/$(ARCH)/$(ARNAME) $(OBJDIR)/$(ARCH)/$(SONAME)* + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +libmng_hlapi.o libmng_hlapi.pic.o: libmng_hlapi.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_memory.h libmng_error.h libmng_trace.h libmng_read.h \ + libmng_write.h libmng_display.h libmng_zlib.h libmng_cms.h libmng_zlib.h +libmng_callback_xs.o libmng_callback_xs.pic.o: libmng_callback_xs.c libmng.h \ + libmng_conf.h libmng_types.h libmng_data.h libmng_error.h libmng_trace.h +libmng_prop_xs.o libmng_prop_xs.pic.o: libmng_prop_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_error.h libmng_trace.h libmng_cms.h +libmng_chunk_xs.o libmng_chunk_xs.pic.o: libmng_chunk_xs.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h \ + libmng_error.h libmng_trace.h +libmng_read.o libmng_read.pic.o: libmng_read.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_prc.h libmng_chunk_io.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_read.h libmng_display.h +libmng_write.o libmng_write.pic.o: libmng_write.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_write.h +libmng_display.o libmng_display.pic.o: libmng_display.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_zlib.h libmng_cms.h libmng_pixels.h \ + libmng_display.h +libmng_object_prc.o libmng_object_prc.pic.o: libmng_object_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h libmng_display.h libmng_pixels.h +libmng_chunk_descr.o libmng_chunk_descr.pic.o: libmng_chunk_descr.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_descr.h libmng_memory.h \ + libmng_chunk_prc.h libmng_error.h libmng_trace.h +libmng_chunk_prc.o libmng_chunk_prc.pic.o: libmng_chunk_prc.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_chunks.h libmng_chunk_prc.h libmng_memory.h \ + libmng_error.h libmng_trace.h +libmng_chunk_io.o libmng_chunk_io.pic.o: libmng_chunk_io.c libmng.h libmng_conf.h \ + libmng_types.h libmng_data.h libmng_objects.h libmng_object_prc.h \ + libmng_chunks.h libmng_chunk_io.h libmng_chunk_prc.h libmng_memory.h libmng_error.h \ + libmng_trace.h libmng_display.h libmng_zlib.h libmng_pixels.h +libmng_error.o libmng_error.pic.o: libmng_error.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_trace.o libmng_trace.pic.o: libmng_trace.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h +libmng_pixels.o libmng_pixels.pic.o: libmng_pixels.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_memory.h libmng_error.h libmng_trace.h \ + libmng_cms.h libmng_filter.h libmng_pixels.h +libmng_filter.o libmng_filter.pic.o: libmng_filter.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_filter.h +libmng_dither.o libmng_dither.pic.o: libmng_dither.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_error.h libmng_trace.h libmng_dither.h +libmng_zlib.o libmng_zlib.pic.o: libmng_zlib.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h \ + libmng_filter.h libmng_zlib.h +libmng_jpeg.o libmng_jpeg.pic.o: libmng_jpeg.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_memory.h libmng_error.h libmng_trace.h libmng_pixels.h libmng_jpeg.h +libmng_cms.o libmng_cms.pic.o: libmng_cms.c libmng.h libmng_conf.h libmng_types.h \ + libmng_data.h libmng_objects.h libmng_error.h libmng_trace.h libmng_cms.h diff --git a/src/3rdparty/libmng/makefiles/makefile.unix b/src/3rdparty/libmng/makefiles/makefile.unix new file mode 100644 index 0000000000..4d3fd97f4e --- /dev/null +++ b/src/3rdparty/libmng/makefiles/makefile.unix @@ -0,0 +1,67 @@ +# +# For conditions of distribution and use, see copyright notice in libmng.h +# +# makefile for libmng - THE MNG library +# this makefile is suitable for generic unix + +# Configuration options are now in libmng_conf.h + +# The name of your C compiler: +CC= cc + +# Location of jpeg header files +JPEG_INC= /cs/include/jpeg + +# Location of zlib header files +ZLIB_INC= /cs/include + +# Location of lcms header files +# (switch on MNG_FULL_CMS in libmng_conf.h if you want to use this) +LCMS_INC= /ltmp/lcms-1.06/source + +# compiler options: +CFLAGS= -O -I. -I$(ZLIB_INC) -I$(JPEG_INC) -I$(LCMS_INC) + +# source files +SOURCES= \ + libmng_callback_xs.c \ + libmng_chunk_io.c \ + libmng_chunk_descr.c \ + libmng_chunk_prc.c \ + libmng_chunk_xs.c \ + libmng_cms.c \ + libmng_display.c \ + libmng_dither.c \ + libmng_error.c \ + libmng_filter.c \ + libmng_hlapi.c \ + libmng_jpeg.c \ + libmng_object_prc.c \ + libmng_pixels.c \ + libmng_prop_xs.c \ + libmng_read.c \ + libmng_trace.c \ + libmng_write.c \ + libmng_zlib.c + +# object files +OBJECTS= $(SOURCES:%.c=%.o) + +# type dependancies +.c.o: + $(CC) $(CFLAGS) -c $< + +all: libmng.a + +clean: + /bin/rm -f $(OBJECTS) + /bin/rm -f libmng.a + /bin/rm -f *~ core + +libmng.a: $(OBJECTS) + ar r libmng.a $(OBJECTS) + +depend: + makedepend -- $(CFLAGS) $(IFLAGS) -- *.c + +# DO NOT DELETE diff --git a/src/3rdparty/libmng/makefiles/makefile.vcwin32 b/src/3rdparty/libmng/makefiles/makefile.vcwin32 new file mode 100644 index 0000000000..6f9c2c0470 --- /dev/null +++ b/src/3rdparty/libmng/makefiles/makefile.vcwin32 @@ -0,0 +1,99 @@ +# makefile for libmng +# Copyright (C) 2000 AM(s98t269@stmail.eng.kagawa-u.ac.jp) +# For conditions of distribution and use, see copyright notice in libmng.h +# Assumes that zlib.lib, zconf.h, and zlib.h have been copied to ..\zlib +# Assumes that libjpeg.lib, *.h have been copied to ..\jpgsrc6b +# Assumes that lcmsdll.lib and lcmsstat.lib have been copied to ..\lcms\lib\msvc +# To use, do "nmake /f makefiles\makefile.vcwin32" + +# -------- Microsoft Visual C++ 4.0 and later, no assembler code -------- + +CFLAGS= -Ox -GA3s -nologo -W3 -I..\zlib -I..\jpgsrc6b -I..\lcms\include + +CC=cl +LD=link +LDFLAGS= +O=.obj + +#uncomment next to put error messages in a file +#ERRFILE= >> mngerrs + +# variables +OBJS1 = libmng_callback_xs$(O) libmng_chunk_io$(O) libmng_chunk_prc$(O) libmng_chunk_descr$(0) +OBJS2 = libmng_chunk_xs$(O) libmng_cms$(O) libmng_display$(O) libmng_dither$(O) +OBJS3 = libmng_error$(O) libmng_filter$(O) libmng_hlapi$(O) libmng_jpeg$(O) +OBJS4 = libmng_object_prc$(O) libmng_pixels$(O) libmng_prop_xs$(O) +OBJS5 = libmng_read$(O) libmng_trace$(O) libmng_write$(O) libmng_zlib$(O) + +all: libmng.lib + +libmng_callback_xs$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_chunk_io$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_chunk_descr$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_chunk_prc$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_chunk_xs$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_cms$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_display$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_dither$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_error$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_filter$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_hlapi$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_jpeg$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_object_prc$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_pixels$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_prop_xs$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_read$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_trace$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_write$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng_zlib$(O): libmng.h libmng_data.h libmng_error.h libmng_trace.h + $(CC) -c $(CFLAGS) $*.c $(ERRFILE) + +libmng.lib: $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) + echo something to del > libmng.lib + del libmng.lib + lib /OUT:libmng.lib $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(OBJS5) + +mngtest.exe: mngtest.obj libmng.lib + $(LD) $(LDFLAGS) mngtest.obj libmng.lib ..\zlib\zlib.lib /OUT:mngtest.exe /SUBSYSTEM:CONSOLE + +test: mngtest.exe + mngtest + +# End of makefile for libmng + diff --git a/src/3rdparty/libmng/unmaintained/autogen.sh b/src/3rdparty/libmng/unmaintained/autogen.sh new file mode 100755 index 0000000000..308ae37393 --- /dev/null +++ b/src/3rdparty/libmng/unmaintained/autogen.sh @@ -0,0 +1,50 @@ +# autogen.sh +# +# invoke the auto* tools to create the configureation system + +# move out configure.in +if ! test -f configure.in; then + echo "copying configure.in" + ln -s makefiles/configure.in . +fi + +# move out the macros and run aclocal +if test ! -f acinclude.m4 -a -r makefiles/acinclude.m4; then + echo "copying configure macros" + ln -s makefiles/acinclude.m4 . +fi + +# copy up our Makefile template +if ! test -f Makefile.am; then + echo "copying automake template" + ln -s makefiles/Makefile.am . +fi + +echo "running aclocal" +aclocal + +# libtool is named glibtool on MacOS X +for LIBTOOLIZE in libtoolize glibtoolize nope; do + ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 && break +done +if test x$LIBTOOLIZE = xnope; then + echo "error: Could not find libtoolize in the path!" + echo " You'll need to install a copy of libtool before continuing" + echo " with the generation of the build system." + echo + exit 1 +fi + +echo "running $LIBTOOLIZE" +$LIBTOOLIZE --automake + +echo "running automake" +automake --foreign --add-missing + +echo "building configure script" +autoconf + +# and finally invoke our new configure +./configure $* + +# end diff --git a/src/3rdparty/libpng.pri b/src/3rdparty/libpng.pri new file mode 100644 index 0000000000..7ac1910151 --- /dev/null +++ b/src/3rdparty/libpng.pri @@ -0,0 +1,20 @@ +DEFINES *= QT_USE_BUNDLED_LIBPNG +!isEqual(QT_ARCH, i386):!isEqual(QT_ARCH, x86_64):DEFINES += PNG_NO_ASSEMBLER_CODE +INCLUDEPATH += $$PWD/libpng +SOURCES += $$PWD/libpng/png.c \ + $$PWD/libpng/pngerror.c \ + $$PWD/libpng/pngget.c \ + $$PWD/libpng/pngmem.c \ + $$PWD/libpng/pngpread.c \ + $$PWD/libpng/pngread.c \ + $$PWD/libpng/pngrio.c \ + $$PWD/libpng/pngrtran.c \ + $$PWD/libpng/pngrutil.c \ + $$PWD/libpng/pngset.c \ + $$PWD/libpng/pngtrans.c \ + $$PWD/libpng/pngwio.c \ + $$PWD/libpng/pngwrite.c \ + $$PWD/libpng/pngwtran.c \ + $$PWD/libpng/pngwutil.c + +include($$PWD/zlib_dependency.pri) diff --git a/src/3rdparty/libpng/ANNOUNCE b/src/3rdparty/libpng/ANNOUNCE new file mode 100644 index 0000000000..4a3b01888c --- /dev/null +++ b/src/3rdparty/libpng/ANNOUNCE @@ -0,0 +1,96 @@ + +Libpng 1.5.1 - February 3, 2011 + +This is a public release of libpng, intended for use in production codes. + +Files available for download: + +Source files with LF line endings (for Unix/Linux) and with a +"configure" script + + libpng-1.5.1.tar.xz (LZMA-compressed, recommended) + libpng-1.5.1.tar.gz + libpng-1.5.1.tar.bz2 + +Source files with CRLF line endings (for Windows), without the +"configure" script + + lpng151.7z (LZMA-compressed, recommended) + lpng151.zip + +Other information: + + libpng-1.5.1-README.txt + libpng-1.5.1-LICENSE.txt + +Changes since the last public release (1.5.0): + + Added description of png_set_crc_action() to the manual. + Added a note in the manual that the type of the iCCP profile was changed + from png_charpp to png_bytepp in png_get_iCCP(). Similarly, + it was changed from png_charpp to png_const_bytepp in png_set_iCCP(). + Ensure that png_rgb_to_gray ignores palette mapped images, if libpng + internally happens to call it with one. + Fixed the failure to handle palette mapped images correctly. + Fixed a bug in handling of interlaced images (bero at arklinux.org). + Updated CMakeLists.txt (Clifford Yapp) + Fixed typecasting of some png_debug() statements (Cosmin) + Updated documentation of png_set|get_tRNS() (Thomas Klausner). + Mentioned in the documentation that applications must #include "zlib.h" + if they need access to anything in zlib.h, and that a number of + macros such as png_memset() are no longer accessible by applications. + Corrected pngvalid gamma test "sample" function to access all of the color + samples of each pixel, instead of sampling the red channel three times. + Changed variable names index, div, exp, and gamma to char_index, divisor, + exp_b10, and gamma_val, respectively, to avoid "shadow" warnings. + Prevent png_push_crc_skip() from hanging while reading an unknown chunk + or an over-large compressed zTXt chunk with the progressive reader. + Eliminated more GCC "shadow" warnings. + Revised png_fixed() in png.c to avoid compiler warning about reaching the + end without returning anything. + In the manual, describe the png_get_IHDR() arguments in the correct order. + Added const_png_structp and const_png_infop types, and used them in + prototypes for most png_get_*() functions. + Added png_get_io_chunk_type() and deprecated png_get_io_chunk_name() + Added synopses for the IO_STATE functions and other missing synopses + to the manual. Removed the synopses from libpngpf.3 because they + were out of date and no longer useful. Better information can be + obtained by reading the prototypes and comments in pngpriv.h + Attempted to fix cpp on Solaris with S. Studio 12 cc, fix build + Added a make macro DFNCPP that is a CPP that will accept the tokens in + a .dfn file and adds configure stuff to test for such a CPP. ./configure + should fail if one is not available. + Corrected const_png_ in png.h to png_const_ to avoid polluting the namespace. + Added png_get_current_row_number and png_get_current_pass_number for the + benefit of the user transform callback. + Added png_process_data_pause and png_process_data_skip for the benefit of + progressive readers that need to stop data processing or want to optimize + skipping of unread data (e.g. if the reader marks a chunk to be skipped.) + Enhanced pngvalid, corrected an error in gray_to_rgb, corrected doc error. + pngvalid contains tests of transforms, which tests are currently disabled + because they are incompletely tested. gray_to_rgb was failing to expand + the bit depth for smaller bit depth images; this seems to be a long + standing error and resulted, apparently, in invalid output. The + documentation did not accurately describe what libpng really does when + converting RGB to gray. + Fixed incorrect examples of callback prototypes in the manual, that were + introduced in libpng-1.0.0. + In addition the order of the png_get_uint macros with respect to the + relevant function definitions has been reversed. This helps the + preprocessing of the symbol files be more robust. Furthermore, the + symbol file preprocessing now uses -DPNG_NO_USE_READ_MACROS even when + the library may actually be built with PNG_USE_READ_MACROS; this stops + the read macros interfering with the symbol file format. + Made the manual, synopses, and function prototypes use the function + argument names file_gamma, int_file_gamma, and srgb_intent consistently. + Changed PNG_UNUSED from "param=param;" to "(void)param;". + Added transform tests to pngvalid and simplified the arguments. + Added a request in the manual that applications do not use "png_" or + "PNG_" to begin any of their own symbols. + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net +(subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) or to glennrp at users.sourceforge.net + +Glenn R-P diff --git a/src/3rdparty/libpng/CHANGES b/src/3rdparty/libpng/CHANGES new file mode 100644 index 0000000000..fa5f2aae79 --- /dev/null +++ b/src/3rdparty/libpng/CHANGES @@ -0,0 +1,3253 @@ +#if 0 +libpng_changes(){ /* +CHANGES - changes for libpng + +Version 0.2 + added reader into png.h + fixed small problems in stub file + +Version 0.3 + added pull reader + split up pngwrite.c to several files + added pnglib.txt + added example.c + cleaned up writer, adding a few new transformations + fixed some bugs in writer + interfaced with zlib 0.5 + added K&R support + added check for 64 KB blocks for 16 bit machines + +Version 0.4 + cleaned up code and commented code + simplified time handling into png_time + created png_color_16 and png_color_8 to handle color needs + cleaned up color type defines + fixed various bugs + made various names more consistent + interfaced with zlib 0.71 + cleaned up zTXt reader and writer (using zlib's Reset functions) + split transformations into pngrtran.c and pngwtran.c + +Version 0.5 + interfaced with zlib 0.8 + fixed many reading and writing bugs + saved using 3 spaces instead of tabs + +Version 0.6 + added png_large_malloc() and png_large_free() + added png_size_t + cleaned up some compiler warnings + added png_start_read_image() + +Version 0.7 + cleaned up lots of bugs + finished dithering and other stuff + added test program + changed name from pnglib to libpng + +Version 0.71 [June, 1995] + changed pngtest.png for zlib 0.93 + fixed error in libpng.txt and example.c + +Version 0.8 + cleaned up some bugs + added png_set_filler() + split up pngstub.c into pngmem.c, pngio.c, and pngerror.c + added #define's to remove unwanted code + moved png_info_init() to png.c + added old_size into png_realloc() + added functions to manually set filtering and compression info + changed compression parameters based on image type + optimized filter selection code + added version info + changed external functions passing floats to doubles (k&r problems?) + put all the configurable stuff in pngconf.h + enabled png_set_shift to work with paletted images on read + added png_read_update_info() - updates info structure with transformations + +Version 0.81 [August, 1995] + incorporated Tim Wegner's medium model code (thanks, Tim) + +Version 0.82 [September, 1995] + [unspecified changes] + +Version 0.85 [December, 1995] + added more medium model code (almost everything's a far) + added i/o, error, and memory callback functions + fixed some bugs (16 bit, 4 bit interlaced, etc.) + added first run progressive reader (barely tested) + +Version 0.86 [January, 1996] + fixed bugs + improved documentation + +Version 0.87 [January, 1996] + fixed medium model bugs + fixed other bugs introduced in 0.85 and 0.86 + added some minor documentation + +Version 0.88 [January, 1996] + fixed progressive bugs + replaced tabs with spaces + cleaned up documentation + added callbacks for read/write and warning/error functions + +Version 0.89 [July, 1996] + Added new initialization API to make libpng work better with shared libs + we now have png_create_read_struct(), png_create_write_struct(), + png_create_info_struct(), png_destroy_read_struct(), and + png_destroy_write_struct() instead of the separate calls to + malloc and png_read_init(), png_info_init(), and png_write_init() + Changed warning/error callback functions to fix bug - this means you + should use the new initialization API if you were using the old + png_set_message_fn() calls, and that the old API no longer exists + so that people are aware that they need to change their code + Changed filter selection API to allow selection of multiple filters + since it didn't work in previous versions of libpng anyways + Optimized filter selection code + Fixed png_set_background() to allow using an arbitrary RGB color for + paletted images + Fixed gamma and background correction for paletted images, so + png_correct_palette is not needed unless you are correcting an + external palette (you will need to #define PNG_CORRECT_PALETTE_SUPPORTED + in pngconf.h) - if nobody uses this, it may disappear in the future. + Fixed bug with Borland 64K memory allocation (Alexander Lehmann) + Fixed bug in interlace handling (Smarasderagd, I think) + Added more error checking for writing and image to reduce invalid files + Separated read and write functions so that they won't both be linked + into a binary when only reading or writing functionality is used + New pngtest image also has interlacing and zTXt + Updated documentation to reflect new API + +Version 0.90 [January, 1997] + Made CRC errors/warnings on critical and ancillary chunks configurable + libpng will use the zlib CRC routines by (compile-time) default + Changed DOS small/medium model memory support - needs zlib 1.04 (Tim Wegner) + Added external C++ wrapper statements to png.h (Gilles Dauphin) + Allow PNG file to be read when some or all of file signature has already + been read from the beginning of the stream. ****This affects the size + of info_struct and invalidates all programs that use a shared libpng**** + Fixed png_filler() declarations + Fixed? background color conversions + Fixed order of error function pointers to match documentation + Current chunk name is now available in png_struct to reduce the number + of nearly identical error messages (will simplify multi-lingual + support when available) + Try to get ready for unknown-chunk callback functions: + - previously read critical chunks are flagged, so the chunk handling + routines can determine if the chunk is in the right place + - all chunk handling routines have the same prototypes, so we will + be able to handle all chunks via a callback mechanism + Try to fix Linux "setjmp" buffer size problems + Removed png_large_malloc, png_large_free, and png_realloc functions. + +Version 0.95 [March, 1997] + Fixed bug in pngwutil.c allocating "up_row" twice and "avg_row" never + Fixed bug in PNG file signature compares when start != 0 + Changed parameter type of png_set_filler(...filler...) from png_byte + to png_uint_32 + Added test for MACOS to ensure that both math.h and fp.h are not #included + Added macros for libpng to be compiled as a Windows DLL (Andreas Kupries) + Added "packswap" transformation, which changes the endianness of + packed-pixel bytes (Kevin Bracey) + Added "strip_alpha" transformation, which removes the alpha channel of + input images without using it (not necessarily a good idea) + Added "swap_alpha" transformation, which puts the alpha channel in front + of the color bytes instead of after + Removed all implicit variable tests which assume NULL == 0 (I think) + Changed several variables to "png_size_t" to show 16/32-bit limitations + Added new pCAL chunk read/write support + Added experimental filter selection weighting (Greg Roelofs) + Removed old png_set_rgbx() and png_set_xrgb() functions that have been + obsolete for about 2 years now (use png_set_filler() instead) + Added macros to read 16- and 32-bit ints directly from buffer, to be + used only on those systems that support it (namely PowerPC and 680x0) + With some testing, this may become the default for MACOS/PPC systems. + Only calculate CRC on data if we are going to use it + Added macros for zTXt compression type PNG_zTXt_COMPRESSION_??? + Added macros for simple libpng debugging output selectable at compile time + Removed PNG_READ_END_MODE in progressive reader (Smarasderagd) + More description of info_struct in libpng.txt and png.h + More instructions in example.c + More chunk types tested in pngtest.c + Renamed pngrcb.c to pngset.c, and all png_read_ functions to be + png_set_. We now have corresponding png_get_ + functions in pngget.c to get information in info_ptr. This isolates + the application from the internal organization of png_info_struct + (good for shared library implementations). + +Version 0.96 [May, 1997] + Fixed serious bug with < 8bpp images introduced in 0.95 + Fixed 256-color transparency bug (Greg Roelofs) + Fixed up documentation (Greg Roelofs, Laszlo Nyul) + Fixed "error" in pngconf.h for Linux setjmp() behaviour + Fixed DOS medium model support (Tim Wegner) + Fixed png_check_keyword() for case with error in static string text + Added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul) + Added typecasts to quiet compiler errors + Added more debugging info + +Version 0.97 [January, 1998] + Removed PNG_USE_OWN_CRC capability + Relocated png_set_crc_action from pngrutil.c to pngrtran.c + Fixed typecasts of "new_key", etc. (Andreas Dilger) + Added RFC 1152 [sic] date support + Fixed bug in gamma handling of 4-bit grayscale + Added 2-bit grayscale gamma handling (Glenn R-P) + Added more typecasts. 65536L becomes (png_uint_32)65536L, etc. (Glenn R-P) + Minor corrections in libpng.txt + Added simple sRGB support (Glenn R-P) + Easier conditional compiling, e.g. define PNG_READ/WRITE_NOT_FULLY_SUPPORTED; + all configurable options can be selected from command-line instead + of having to edit pngconf.h (Glenn R-P) + Fixed memory leak in pngwrite.c (free info_ptr->text) (Glenn R-P) + Added more conditions for png_do_background, to avoid changing + black pixels to background when a background is supplied and + no pixels are transparent + Repaired PNG_NO_STDIO behaviour + Tested NODIV support and made it default behaviour (Greg Roelofs) + Added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler) + Regularized version numbering scheme and bumped shared-library major + version number to 2 to avoid problems with libpng 0.89 apps (Greg Roelofs) + +Version 0.98 [January, 1998] + Cleaned up some typos in libpng.txt and in code documentation + Fixed memory leaks in pCAL chunk processing (Glenn R-P and John Bowler) + Cosmetic change "display_gamma" to "screen_gamma" in pngrtran.c + Changed recommendation about file_gamma for PC images to .51 from .45, + in example.c and libpng.txt, added comments to distinguish between + screen_gamma, viewing_gamma, and display_gamma. + Changed all references to RFC1152 to read RFC1123 and changed the + PNG_TIME_RFC1152_SUPPORTED macro to PNG_TIME_RFC1123_SUPPORTED + Added png_invert_alpha capability (Glenn R-P -- suggestion by Jon Vincent) + Changed srgb_intent from png_byte to int to avoid compiler bugs + +Version 0.99 [January 30, 1998] + Free info_ptr->text instead of end_info_ptr->text in pngread.c (John Bowler) + Fixed a longstanding "packswap" bug in pngtrans.c + Fixed some inconsistencies in pngconf.h that prevented compiling with + PNG_READ_GAMMA_SUPPORTED and PNG_READ_hIST_SUPPORTED undefined + Fixed some typos and made other minor rearrangement of libpng.txt (Andreas) + Changed recommendation about file_gamma for PC images to .50 from .51 in + example.c and libpng.txt, and changed file_gamma for sRGB images to .45 + Added a number of functions to access information from the png structure + png_get_image_height(), etc. (Glenn R-P, suggestion by Brad Pettit) + Added TARGET_MACOS similar to zlib-1.0.8 + Define PNG_ALWAYS_EXTERN when __MWERKS__ && WIN32 are defined + Added type casting to all png_malloc() function calls + +Version 0.99a [January 31, 1998] + Added type casts and parentheses to all returns that return a value.(Tim W.) + +Version 0.99b [February 4, 1998] + Added type cast png_uint_32 on malloc function calls where needed. + Changed type of num_hist from png_uint_32 to int (same as num_palette). + Added checks for rowbytes overflow, in case png_size_t is less than 32 bits. + Renamed makefile.elf to makefile.lnx. + +Version 0.99c [February 7, 1998] + More type casting. Removed erroneous overflow test in pngmem.c. + Added png_buffered_memcpy() and png_buffered_memset(), apply them to rowbytes. + Added UNIX manual pages libpng.3 (incorporating libpng.txt) and png.5. + +Version 0.99d [February 11, 1998] + Renamed "far_to_near()" "png_far_to_near()" + Revised libpng.3 + Version 99c "buffered" operations didn't work as intended. Replaced them + with png_memcpy_check() and png_memset_check(). + Added many "if (png_ptr == NULL) return" to quell compiler warnings about + unused png_ptr, mostly in pngget.c and pngset.c. + Check for overlength tRNS chunk present when indexed-color PLTE is read. + Cleaned up spelling errors in libpng.3/libpng.txt + Corrected a problem with png_get_tRNS() which returned undefined trans array + +Version 0.99e [February 28, 1998] + Corrected png_get_tRNS() again. + Add parentheses for easier reading of pngget.c, fixed "||" should be "&&". + Touched up example.c to make more of it compileable, although the entire + file still can't be compiled (Willem van Schaik) + Fixed a bug in png_do_shift() (Bryan Tsai) + Added a space in png.h prototype for png_write_chunk_start() + Replaced pngtest.png with one created with zlib 1.1.1 + Changed pngtest to report PASS even when file size is different (Jean-loup G.) + Corrected some logic errors in png_do_invert_alpha() (Chris Patterson) + +Version 0.99f [March 5, 1998] + Corrected a bug in pngpread() introduced in version 99c (Kevin Bracey) + Moved makefiles into a "scripts" directory, and added INSTALL instruction file + Added makefile.os2 and pngos2.def (A. Zabolotny) and makefile.s2x (W. Sebok) + Added pointers to "note on libpng versions" in makefile.lnx and README + Added row callback feature when reading and writing nonprogressive rows + and added a test of this feature in pngtest.c + Added user transform callbacks, with test of the feature in pngtest.c + +Version 0.99g [March 6, 1998, morning] + Minor changes to pngtest.c to suppress compiler warnings. + Removed "beta" language from documentation. + +Version 0.99h [March 6, 1998, evening] + Minor changes to previous minor changes to pngtest.c + Changed PNG_READ_NOT_FULLY_SUPPORTED to PNG_READ_TRANSFORMS_NOT_SUPPORTED + and added PNG_PROGRESSIVE_READ_NOT_SUPPORTED macro + Added user transform capability + +Version 1.00 [March 7, 1998] + Changed several typedefs in pngrutil.c + Added makefile.wat (Pawel Mrochen), updated makefile.tc3 (Willem van Schaik) + Replaced "while(1)" with "for(;;)" + Added PNGARG() to prototypes in pngtest.c and removed some prototypes + Updated some of the makefiles (Tom Lane) + Changed some typedefs (s_start, etc.) in pngrutil.c + Fixed dimensions of "short_months" array in pngwrite.c + Replaced ansi2knr.c with the one from jpeg-v6 + +Version 1.0.0 [March 8, 1998] + Changed name from 1.00 to 1.0.0 (Adam Costello) + Added smakefile.ppc (with SCOPTIONS.ppc) for Amiga PPC (Andreas Kleinert) + +Version 1.0.0a [March 9, 1998] + Fixed three bugs in pngrtran.c to make gamma+background handling consistent + (Greg Roelofs) + Changed format of the PNG_LIBPNG_VER integer to xyyzz instead of xyz + for major, minor, and bugfix releases. This is 10001. (Adam Costello, + Tom Lane) + Make months range from 1-12 in png_convert_to_rfc1123 + +Version 1.0.0b [March 13, 1998] + Quieted compiler complaints about two empty "for" loops in pngrutil.c + Minor changes to makefile.s2x + Removed #ifdef/#endif around a png_free() in pngread.c + +Version 1.0.1 [March 14, 1998] + Changed makefile.s2x to reduce security risk of using a relative pathname + Fixed some typos in the documentation (Greg). + Fixed a problem with value of "channels" returned by png_read_update_info() + +Version 1.0.1a [April 21, 1998] + Optimized Paeth calculations by replacing abs() function calls with intrinsics + plus other loop optimizations. Improves avg decoding speed by about 20%. + Commented out i386istic "align" compiler flags in makefile.lnx. + Reduced the default warning level in some makefiles, to make them consistent. + Removed references to IJG and JPEG in the ansi2knr.c copyright statement. + Fixed a bug in png_do_strip_filler with XXRRGGBB => RRGGBB transformation. + Added grayscale and 16-bit capability to png_do_read_filler(). + Fixed a bug in pngset.c, introduced in version 0.99c, that sets rowbytes + too large when writing an image with bit_depth < 8 (Bob Dellaca). + Corrected some bugs in the experimental weighted filtering heuristics. + Moved a misplaced pngrutil code block that truncates tRNS if it has more + than num_palette entries -- test was done before num_palette was defined. + Fixed a png_convert_to_rfc1123() bug that converts day 31 to 0 (Steve Eddins). + Changed compiler flags in makefile.wat for better optimization + (Pawel Mrochen). + +Version 1.0.1b [May 2, 1998] + Relocated png_do_gray_to_rgb() within png_do_read_transformations() (Greg). + Relocated the png_composite macros from pngrtran.c to png.h (Greg). + Added makefile.sco (contributed by Mike Hopkirk). + Fixed two bugs (missing definitions of "istop") introduced in libpng-1.0.1a. + Fixed a bug in pngrtran.c that would set channels=5 under some circumstances. + More work on the Paeth-filtering, achieving imperceptible speedup + (A Kleinert). + More work on loop optimization which may help when compiled with C++ + compilers. + Added warnings when people try to use transforms they've defined out. + Collapsed 4 "i" and "c" loops into single "i" loops in pngrtran and pngwtran. + Revised paragraph about png_set_expand() in libpng.txt and libpng.3 (Greg) + +Version 1.0.1c [May 11, 1998] + Fixed a bug in pngrtran.c (introduced in libpng-1.0.1a) where the masks for + filler bytes should have been 0xff instead of 0xf. + Added max_pixel_depth=32 in pngrutil.c when using FILLER with palette images. + Moved PNG_WRITE_WEIGHTED_FILTER_SUPPORTED and PNG_WRITE_FLUSH_SUPPORTED + out of the PNG_WRITE_TRANSFORMS_NOT_SUPPORTED block of pngconf.h + Added "PNG_NO_WRITE_TRANSFORMS" etc., as alternatives for *_NOT_SUPPORTED, + for consistency, in pngconf.h + Added individual "ifndef PNG_NO_[CAPABILITY]" in pngconf.h to make it easier + to remove unwanted capabilities via the compile line + Made some corrections to grammar (which, it's) in documentation (Greg). + Corrected example.c, use of row_pointers in png_write_image(). + +Version 1.0.1d [May 24, 1998] + Corrected several statements that used side effects illegally in pngrutil.c + and pngtrans.c, that were introduced in version 1.0.1b + Revised png_read_rows() to avoid repeated if-testing for NULL (A Kleinert) + More corrections to example.c, use of row_pointers in png_write_image() + and png_read_rows(). + Added pngdll.mak and pngdef.pas to scripts directory, contributed by + Bob Dellaca, to make a png32bd.dll with Borland C++ 4.5 + Fixed error in example.c with png_set_text: num_text is 3, not 2 (Guido V.) + Changed several loops from count-down to count-up, for consistency. + +Version 1.0.1e [June 6, 1998] + Revised libpng.txt and libpng.3 description of png_set_read|write_fn(), and + added warnings when people try to set png_read_fn and png_write_fn in + the same structure. + Added a test such that png_do_gamma will be done when num_trans==0 + for truecolor images that have defined a background. This corrects an + error that was introduced in libpng-0.90 that can cause gamma processing + to be skipped. + Added tests in png.h to include "trans" and "trans_values" in structures + when PNG_READ_BACKGROUND_SUPPORTED or PNG_READ_EXPAND_SUPPORTED is defined. + Add png_free(png_ptr->time_buffer) in png_destroy_read_struct() + Moved png_convert_to_rfc_1123() from pngwrite.c to png.c + Added capability for user-provided malloc_fn() and free_fn() functions, + and revised pngtest.c to demonstrate their use, replacing the + PNGTEST_DEBUG_MEM feature. + Added makefile.w32, for Microsoft C++ 4.0 and later (Tim Wegner). + +Version 1.0.2 [June 14, 1998] + Fixed two bugs in makefile.bor . + +Version 1.0.2a [December 30, 1998] + Replaced and extended code that was removed from png_set_filler() in 1.0.1a. + Fixed a bug in png_do_filler() that made it fail to write filler bytes in + the left-most pixel of each row (Kevin Bracey). + Changed "static pngcharp tIME_string" to "static char tIME_string[30]" + in pngtest.c (Duncan Simpson). + Fixed a bug in pngtest.c that caused pngtest to try to write a tIME chunk + even when no tIME chunk was present in the source file. + Fixed a problem in pngrutil.c: gray_to_rgb didn't always work with 16-bit. + Fixed a problem in png_read_push_finish_row(), which would not skip some + passes that it should skip, for images that are less than 3 pixels high. + Interchanged the order of calls to png_do_swap() and png_do_shift() + in pngwtran.c (John Cromer). + Added #ifdef PNG_DEBUG/#endif surrounding use of PNG_DEBUG in png.h . + Changed "bad adaptive filter type" from error to warning in pngrutil.c . + Fixed a documentation error about default filtering with 8-bit indexed-color. + Separated the PNG_NO_STDIO macro into PNG_NO_STDIO and PNG_NO_CONSOLE_IO + (L. Peter Deutsch). + Added png_set_rgb_to_gray() and png_get_rgb_to_gray_status() functions. + Added png_get_copyright() and png_get_header_version() functions. + Revised comments on png_set_progressive_read_fn() in libpng.txt and example.c + Added information about debugging in libpng.txt and libpng.3 . + Changed "ln -sf" to "ln -s -f" in makefile.s2x, makefile.lnx, and + makefile.sco. + Removed lines after Dynamic Dependencies" in makefile.aco . + Revised makefile.dec to make a shared library (Jeremie Petit). + Removed trailing blanks from all files. + +Version 1.0.2a [January 6, 1999] + Removed misplaced #endif and #ifdef PNG_NO_EXTERN near the end of png.h + Added "if" tests to silence complaints about unused png_ptr in png.h and png.c + Changed "check_if_png" function in example.c to return true (nonzero) if PNG. + Changed libpng.txt to demonstrate png_sig_cmp() instead of png_check_sig() + which is obsolete. + +Version 1.0.3 [January 14, 1999] + Added makefile.hux, for Hewlett Packard HPUX 10.20 and 11.00 (Jim Rice) + Added a statement of Y2K compliance in png.h, libpng.3, and Y2KINFO. + +Version 1.0.3a [August 12, 1999] + Added check for PNG_READ_INTERLACE_SUPPORTED in pngread.c; issue a warning + if an attempt is made to read an interlaced image when it's not supported. + Added check if png_ptr->trans is defined before freeing it in pngread.c + Modified the Y2K statement to include versions back to version 0.71 + Fixed a bug in the check for valid IHDR bit_depth/color_types in pngrutil.c + Modified makefile.wat (added -zp8 flag, ".symbolic", changed some comments) + Replaced leading blanks with tab characters in makefile.hux + Changed "dworkin.wustl.edu" to "ccrc.wustl.edu" in various documents. + Changed (float)red and (float)green to (double)red, (double)green + in png_set_rgb_to_gray() to avoid "promotion" problems in AIX. + Fixed a bug in pngconf.h that omitted when PNG_DEBUG==0 (K Bracey). + Reformatted libpng.3 and libpngpf.3 with proper fonts (script by J. vanZandt). + Updated documentation to refer to the PNG-1.2 specification. + Removed ansi2knr.c and left pointers to the latest source for ansi2knr.c + in makefile.knr, INSTALL, and README (L. Peter Deutsch) + Fixed bugs in calculation of the length of rowbytes when adding alpha + channels to 16-bit images, in pngrtran.c (Chris Nokleberg) + Added function png_set_user_transform_info() to store user_transform_ptr, + user_depth, and user_channels into the png_struct, and a function + png_get_user_transform_ptr() to retrieve the pointer (Chris Nokleberg) + Added function png_set_empty_plte_permitted() to make libpng useable + in MNG applications. + Corrected the typedef for png_free_ptr in png.h (Jesse Jones). + Correct gamma with srgb is 45455 instead of 45000 in pngrutil.c, to be + consistent with PNG-1.2, and allow variance of 500 before complaining. + Added assembler code contributed by Intel in file pngvcrd.c and modified + makefile.w32 to use it (Nirav Chhatrapati, INTEL Corporation, + Gilles Vollant) + Changed "ln -s -f" to "ln -f -s" in the makefiles to make Solaris happy. + Added some aliases for png_set_expand() in pngrtran.c, namely + png_set_expand_PLTE(), png_set_expand_depth(), and png_set_expand_tRNS() + (Greg Roelofs, in "PNG: The Definitive Guide"). + Added makefile.beo for BEOS on X86, contributed by Sander Stok. + +Version 1.0.3b [August 26, 1999] + Replaced 2147483647L several places with PNG_MAX_UINT macro, defined in png.h + Changed leading blanks to tabs in all makefiles. + Define PNG_USE_PNGVCRD in makefile.w32, to get MMX assembler code. + Made alternate versions of png_set_expand() in pngrtran.c, namely + png_set_gray_1_2_4_to_8, png_set_palette_to_rgb, and png_set_tRNS_to_alpha + (Greg Roelofs, in "PNG: The Definitive Guide"). Deleted the 1.0.3a aliases. + Relocated start of 'extern "C"' block in png.h so it doesn't include pngconf.h + Revised calculation of num_blocks in pngmem.c to avoid a potentially + negative shift distance, whose results are undefined in the C language. + Added a check in pngset.c to prevent writing multiple tIME chunks. + Added a check in pngwrite.c to detect invalid small window_bits sizes. + +Version 1.0.3d [September 4, 1999] + Fixed type casting of igamma in pngrutil.c + Added new png_expand functions to scripts/pngdef.pas and pngos2.def + Added a demo read_user_transform_fn that examines the row filters in pngtest.c + +Version 1.0.4 [September 24, 1999] + Define PNG_ALWAYS_EXTERN in pngconf.h if __STDC__ is defined + Delete #define PNG_INTERNAL and include "png.h" from pngasmrd.h + Made several minor corrections to pngtest.c + Renamed the makefiles with longer but more user friendly extensions. + Copied the PNG copyright and license to a separate LICENSE file. + Revised documentation, png.h, and example.c to remove reference to + "viewing_gamma" which no longer appears in the PNG specification. + Revised pngvcrd.c to use MMX code for interlacing only on the final pass. + Updated pngvcrd.c to use the faster C filter algorithms from libpng-1.0.1a + Split makefile.win32vc into two versions, makefile.vcawin32 (uses MMX + assembler code) and makefile.vcwin32 (doesn't). + Added a CPU timing report to pngtest.c (enabled by defining PNGTEST_TIMING) + Added a copy of pngnow.png to the distribution. + +Version 1.0.4a [September 25, 1999] + Increase max_pixel_depth in pngrutil.c if a user transform needs it. + Changed several division operations to right-shifts in pngvcrd.c + +Version 1.0.4b [September 30, 1999] + Added parentheses in line 3732 of pngvcrd.c + Added a comment in makefile.linux warning about buggy -O3 in pgcc 2.95.1 + +Version 1.0.4c [October 1, 1999] + Added a "png_check_version" function in png.c and pngtest.c that will generate + a helpful compiler error if an old png.h is found in the search path. + Changed type of png_user_transform_depth|channels from int to png_byte. + +Version 1.0.4d [October 6, 1999] + Changed 0.45 to 0.45455 in png_set_sRGB() + Removed unused PLTE entries from pngnow.png + Re-enabled some parts of pngvcrd.c (png_combine_row) that work properly. + +Version 1.0.4e [October 10, 1999] + Fixed sign error in pngvcrd.c (Greg Roelofs) + Replaced some instances of memcpy with simple assignments in pngvcrd (GR-P) + +Version 1.0.4f [October 15, 1999] + Surrounded example.c code with #if 0 .. #endif to prevent people from + inadvertently trying to compile it. + Changed png_get_header_version() from a function to a macro in png.h + Added type casting mostly in pngrtran.c and pngwtran.c + Removed some pointless "ptr = NULL" in pngmem.c + Added a "contrib" directory containing the source code from Greg's book. + +Version 1.0.5 [October 15, 1999] + Minor editing of the INSTALL and README files. + +Version 1.0.5a [October 23, 1999] + Added contrib/pngsuite and contrib/pngminus (Willem van Schaik) + Fixed a typo in the png_set_sRGB() function call in example.c (Jan Nijtmans) + Further optimization and bugfix of pngvcrd.c + Revised pngset.c so that it does not allocate or free memory in the user's + text_ptr structure. Instead, it makes its own copy. + Created separate write_end_info_struct in pngtest.c for a more severe test. + Added code in pngwrite.c to free info_ptr->text[i].key to stop a memory leak. + +Version 1.0.5b [November 23, 1999] + Moved PNG_FLAG_HAVE_CHUNK_HEADER, PNG_FLAG_BACKGROUND_IS_GRAY and + PNG_FLAG_WROTE_tIME from flags to mode. + Added png_write_info_before_PLTE() function. + Fixed some typecasting in contrib/gregbook/*.c + Updated scripts/makevms.com and added makevms.com to contrib/gregbook + and contrib/pngminus (Martin Zinser) + +Version 1.0.5c [November 26, 1999] + Moved png_get_header_version from png.h to png.c, to accommodate ansi2knr. + Removed all global arrays (according to PNG_NO_GLOBAL_ARRAYS macro), to + accommodate making DLL's: Moved usr_png_ver from global variable to function + png_get_header_ver() in png.c. Moved png_sig to png_sig_bytes in png.c and + eliminated use of png_sig in pngwutil.c. Moved the various png_CHNK arrays + into pngtypes.h. Eliminated use of global png_pass arrays. Declared the + png_CHNK and png_pass arrays to be "const". Made the global arrays + available to applications (although none are used in libpng itself) when + PNG_NO_GLOBAL_ARRAYS is not defined or when PNG_GLOBAL_ARRAYS is defined. + Removed some extraneous "-I" from contrib/pngminus/makefile.std + Changed the PNG_sRGB_INTENT macros in png.h to be consistent with PNG-1.2. + Change PNG_SRGB_INTENT to PNG_sRGB_INTENT in libpng.txt and libpng.3 + +Version 1.0.5d [November 29, 1999] + Add type cast (png_const_charp) two places in png.c + Eliminated pngtypes.h; use macros instead to declare PNG_CHNK arrays. + Renamed "PNG_GLOBAL_ARRAYS" to "PNG_USE_GLOBAL_ARRAYS" and made available + to applications a macro "PNG_USE_LOCAL_ARRAYS". + comment out (with #ifdef) all the new declarations when + PNG_USE_GLOBAL_ARRAYS is defined. + Added PNG_EXPORT_VAR macro to accommodate making DLL's. + +Version 1.0.5e [November 30, 1999] + Added iCCP, iTXt, and sPLT support; added "lang" member to the png_text + structure; refactored the inflate/deflate support to make adding new chunks + with trailing compressed parts easier in the future, and added new functions + png_free_iCCP, png_free_pCAL, png_free_sPLT, png_free_text, png_get_iCCP, + png_get_spalettes, png_set_iCCP, png_set_spalettes (Eric S. Raymond). + NOTE: Applications that write text chunks MUST define png_text->lang + before calling png_set_text(). It must be set to NULL if you want to + write tEXt or zTXt chunks. If you want your application to be able to + run with older versions of libpng, use + + #ifdef PNG_iTXt_SUPPORTED + png_text[i].lang = NULL; + #endif + + Changed png_get_oFFs() and png_set_oFFs() to use signed rather than unsigned + offsets (Eric S. Raymond). + Combined PNG_READ_cHNK_SUPPORTED and PNG_WRITE_cHNK_SUPPORTED macros into + PNG_cHNK_SUPPORTED and combined the three types of PNG_text_SUPPORTED + macros, leaving the separate macros also available. + Removed comments on #endifs at the end of many short, non-nested #if-blocks. + +Version 1.0.5f [December 6, 1999] + Changed makefile.solaris to issue a warning about potential problems when + the ucb "ld" is in the path ahead of the ccs "ld". + Removed "- [date]" from the "synopsis" line in libpng.3 and libpngpf.3. + Added sCAL chunk support (Eric S. Raymond). + +Version 1.0.5g [December 7, 1999] + Fixed "png_free_spallettes" typo in png.h + Added code to handle new chunks in pngpread.c + Moved PNG_CHNK string macro definitions outside of PNG_NO_EXTERN block + Added "translated_key" to png_text structure and png_write_iTXt(). + Added code in pngwrite.c to work around a newly discovered zlib bug. + +Version 1.0.5h [December 10, 1999] + NOTE: regarding the note for version 1.0.5e, the following must also + be included in your code: + png_text[i].translated_key = NULL; + Unknown chunk handling is now supported. + Option to eliminate all floating point support was added. Some new + fixed-point functions such as png_set_gAMA_fixed() were added. + Expanded tabs and removed trailing blanks in source files. + +Version 1.0.5i [December 13, 1999] + Added some type casts to silence compiler warnings. + Renamed "png_free_spalette" to "png_free_spalettes" for consistency. + Removed leading blanks from a #define in pngvcrd.c + Added some parameters to the new png_set_keep_unknown_chunks() function. + Added a test for up->location != 0 in the first instance of writing + unknown chunks in pngwrite.c + Changed "num" to "i" in png_free_spalettes() and png_free_unknowns() to + prevent recursion. + Added png_free_hIST() function. + Various patches to fix bugs in the sCAL and integer cHRM processing, + and to add some convenience macros for use with sCAL. + +Version 1.0.5j [December 21, 1999] + Changed "unit" parameter of png_write_sCAL from png_byte to int, to work + around buggy compilers. + Added new type "png_fixed_point" for integers that hold float*100000 values + Restored backward compatibility of tEXt/zTXt chunk processing: + Restored the first four members of png_text to the same order as v.1.0.5d. + Added members "lang_key" and "itxt_length" to png_text struct. Set + text_length=0 when "text" contains iTXt data. Use the "compression" + member to distinguish among tEXt/zTXt/iTXt types. Added + PNG_ITXT_COMPRESSION_NONE (1) and PNG_ITXT_COMPRESSION_zTXt(2) macros. + The "Note" above, about backward incompatibility of libpng-1.0.5e, no + longer applies. + Fixed png_read|write_iTXt() to read|write parameters in the right order, + and to write the iTXt chunk after IDAT if it appears in the end_ptr. + Added pnggccrd.c, version of pngvcrd.c Intel assembler for gcc (Greg Roelofs) + Reversed the order of trying to write floating-point and fixed-point gAMA. + +Version 1.0.5k [December 27, 1999] + Added many parentheses, e.g., "if (a && b & c)" becomes "if (a && (b & c))" + Added png_handle_as_unknown() function (Glenn) + Added png_free_chunk_list() function and chunk_list and num_chunk_list members + of png_ptr. + Eliminated erroneous warnings about multiple sPLT chunks and sPLT-after-PLTE. + Fixed a libpng-1.0.5h bug in pngrutil.c that was issuing erroneous warnings + about ignoring incorrect gAMA with sRGB (gAMA was in fact not ignored) + Added png_free_tRNS(); png_set_tRNS() now malloc's its own trans array (ESR). + Define png_get_int_32 when oFFs chunk is supported as well as when pCAL is. + Changed type of proflen from png_int_32 to png_uint_32 in png_get_iCCP(). + +Version 1.0.5l [January 1, 2000] + Added functions png_set_read_user_chunk_fn() and png_get_user_chunk_ptr() + for setting a callback function to handle unknown chunks and for + retrieving the associated user pointer (Glenn). + +Version 1.0.5m [January 7, 2000] + Added high-level functions png_read_png(), png_write_png(), png_free_pixels(). + +Version 1.0.5n [January 9, 2000] + Added png_free_PLTE() function, and modified png_set_PLTE() to malloc its + own memory for info_ptr->palette. This makes it safe for the calling + application to free its copy of the palette any time after it calls + png_set_PLTE(). + +Version 1.0.5o [January 20, 2000] + Cosmetic changes only (removed some trailing blanks and TABs) + +Version 1.0.5p [January 31, 2000] + Renamed pngdll.mak to makefile.bd32 + Cosmetic changes in pngtest.c + +Version 1.0.5q [February 5, 2000] + Relocated the makefile.solaris warning about PATH problems. + Fixed pngvcrd.c bug by pushing/popping registers in mmxsupport (Bruce Oberg) + Revised makefile.gcmmx + Added PNG_SETJMP_SUPPORTED, PNG_SETJMP_NOT_SUPPORTED, and PNG_ABORT() macros + +Version 1.0.5r [February 7, 2000] + Removed superfluous prototype for png_get_itxt from png.h + Fixed a bug in pngrtran.c that improperly expanded the background color. + Return *num_text=0 from png_get_text() when appropriate, and fix documentation + of png_get_text() in libpng.txt/libpng.3. + +Version 1.0.5s [February 18, 2000] + Added "png_jmp_env()" macro to pngconf.h, to help people migrate to the + new error handler that's planned for the next libpng release, and changed + example.c, pngtest.c, and contrib programs to use this macro. + Revised some of the DLL-export macros in pngconf.h (Greg Roelofs) + Fixed a bug in png_read_png() that caused it to fail to expand some images + that it should have expanded. + Fixed some mistakes in the unused and undocumented INCH_CONVERSIONS functions + in pngget.c + Changed the allocation of palette, history, and trans arrays back to + the version 1.0.5 method (linking instead of copying) which restores + backward compatibility with version 1.0.5. Added some remarks about + that in example.c. Added "free_me" member to info_ptr and png_ptr + and added png_free_data() function. + Updated makefile.linux and makefile.gccmmx to make directories conditionally. + Made cosmetic changes to pngasmrd.h + Added png_set_rows() and png_get_rows(), for use with png_read|write_png(). + Modified png_read_png() to allocate info_ptr->row_pointers only if it + hasn't already been allocated. + +Version 1.0.5t [March 4, 2000] + Changed png_jmp_env() migration aiding macro to png_jmpbuf(). + Fixed "interlace" typo (should be "interlaced") in contrib/gregbook/read2-x.c + Fixed bug with use of PNG_BEFORE_IHDR bit in png_ptr->mode, introduced when + PNG_FLAG_HAVE_CHUNK_HEADER was moved into png_ptr->mode in version 1.0.5b + Files in contrib/gregbook were revised to use png_jmpbuf() and to select + a 24-bit visual if one is available, and to allow abbreviated options. + Files in contrib/pngminus were revised to use the png_jmpbuf() macro. + Removed spaces in makefile.linux and makefile.gcmmx, introduced in 1.0.5s + +Version 1.0.5u [March 5, 2000] + Simplified the code that detects old png.h in png.c and pngtest.c + Renamed png_spalette (_p, _pp) to png_sPLT_t (_tp, _tpp) + Increased precision of rgb_to_gray calculations from 8 to 15 bits and + added png_set_rgb_to_gray_fixed() function. + Added makefile.bc32 (32-bit Borland C++, C mode) + +Version 1.0.5v [March 11, 2000] + Added some parentheses to the png_jmpbuf macro definition. + Updated references to the zlib home page, which has moved to freesoftware.com. + Corrected bugs in documentation regarding png_read_row() and png_write_row(). + Updated documentation of png_rgb_to_gray calculations in libpng.3/libpng.txt. + Renamed makefile.borland,turboc3 back to makefile.bor,tc3 as in version 1.0.3, + revised borland makefiles; added makefile.ibmvac3 and makefile.gcc (Cosmin) + +Version 1.0.6 [March 20, 2000] + Minor revisions of makefile.bor, libpng.txt, and gregbook/rpng2-win.c + Added makefile.sggcc (SGI IRIX with gcc) + +Version 1.0.6d [April 7, 2000] + Changed sprintf() to strcpy() in png_write_sCAL_s() to work without STDIO + Added data_length parameter to png_decompress_chunk() function + Revised documentation to remove reference to abandoned png_free_chnk functions + Fixed an error in png_rgb_to_gray_fixed() + Revised example.c, usage of png_destroy_write_struct(). + Renamed makefile.ibmvac3 to makefile.ibmc, added libpng.icc IBM project file + Added a check for info_ptr->free_me&PNG_FREE_TEXT when freeing text in png.c + Simplify png_sig_bytes() function to remove use of non-ISO-C strdup(). + +Version 1.0.6e [April 9, 2000] + Added png_data_freer() function. + In the code that checks for over-length tRNS chunks, added check of + info_ptr->num_trans as well as png_ptr->num_trans (Matthias Benckmann) + Minor revisions of libpng.txt/libpng.3. + Check for existing data and free it if the free_me flag is set, in png_set_*() + and png_handle_*(). + Only define PNG_WEIGHTED_FILTERS_SUPPORTED when PNG_FLOATING_POINT_SUPPORTED + is defined. + Changed several instances of PNG_NO_CONSOLE_ID to PNG_NO_STDIO in pngrutil.c + and mentioned the purposes of the two macros in libpng.txt/libpng.3. + +Version 1.0.6f [April 14, 2000] + Revised png_set_iCCP() and png_set_rows() to avoid prematurely freeing data. + Add checks in png_set_text() for NULL members of the input text structure. + Revised libpng.txt/libpng.3. + Removed superfluous prototype for png_set_iTXt from png.h + Removed "else" from pngread.c, after png_error(), and changed "0" to "length". + Changed several png_errors about malformed ancillary chunks to png_warnings. + +Version 1.0.6g [April 24, 2000] + Added png_pass-* arrays to pnggccrd.c when PNG_USE_LOCAL_ARRAYS is defined. + Relocated paragraph about png_set_background() in libpng.3/libpng.txt + and other revisions (Matthias Benckmann) + Relocated info_ptr->free_me, png_ptr->free_me, and other info_ptr and + png_ptr members to restore binary compatibility with libpng-1.0.5 + (breaks compatibility with libpng-1.0.6). + +Version 1.0.6h [April 24, 2000] + Changed shared library so-number pattern from 2.x.y.z to xy.z (this builds + libpng.so.10 & libpng.so.10.6h instead of libpng.so.2 & libpng.so.2.1.0.6h) + This is a temporary change for test purposes. + +Version 1.0.6i [May 2, 2000] + Rearranged some members at the end of png_info and png_struct, to put + unknown_chunks_num and free_me within the original size of the png_structs + and free_me, png_read_user_fn, and png_free_fn within the original png_info, + because some old applications allocate the structs directly instead of + using png_create_*(). + Added documentation of user memory functions in libpng.txt/libpng.3 + Modified png_read_png so that it will use user_allocated row_pointers + if present, unless free_me directs that it be freed, and added description + of the use of png_set_rows() and png_get_rows() in libpng.txt/libpng.3. + Added PNG_LEGACY_SUPPORTED macro, and #ifdef out all new (since version + 1.00) members of png_struct and png_info, to regain binary compatibility + when you define this macro. Capabilities lost in this event + are user transforms (new in version 1.0.0),the user transform pointer + (new in version 1.0.2), rgb_to_gray (new in 1.0.5), iCCP, sCAL, sPLT, + the high-level interface, and unknown chunks support (all new in 1.0.6). + This was necessary because of old applications that allocate the structs + directly as authors were instructed to do in libpng-0.88 and earlier, + instead of using png_create_*(). + Added modes PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT which + can be used to detect codes that directly allocate the structs, and + code to check these modes in png_read_init() and png_write_init() and + generate a libpng error if the modes aren't set and PNG_LEGACY_SUPPORTED + was not defined. + Added makefile.intel and updated makefile.watcom (Pawel Mrochen) + +Version 1.0.6j [May 3, 2000] + Overloaded png_read_init() and png_write_init() with macros that convert + calls to png_read_init_2() or png_write_init_2() that check the version + and structure sizes. + +Version 1.0.7beta11 [May 7, 2000] + Removed the new PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT modes + which are no longer used. + Eliminated the three new members of png_text when PNG_LEGACY_SUPPORTED is + defined or when neither PNG_READ_iTXt_SUPPORTED nor PNG_WRITE_iTXT_SUPPORTED + is defined. + Made PNG_NO_READ|WRITE_iTXt the default setting, to avoid memory + overrun when old applications fill the info_ptr->text structure directly. + Added PNGAPI macro, and added it to the definitions of all exported functions. + Relocated version macro definitions ahead of the includes of zlib.h and + pngconf.h in png.h. + +Version 1.0.7beta12 [May 12, 2000] + Revised pngset.c to avoid a problem with expanding the png_debug macro. + Deleted some extraneous defines from pngconf.h + Made PNG_NO_CONSOLE_IO the default condition when PNG_BUILD_DLL is defined. + Use MSC _RPTn debugging instead of fprintf if _MSC_VER is defined. + Added png_access_version_number() function. + Check for mask&PNG_FREE_CHNK (for TEXT, SCAL, PCAL) in png_free_data(). + Expanded libpng.3/libpng.txt information about png_data_freer(). + +Version 1.0.7beta14 [May 17, 2000] (beta13 was not published) + Changed pnggccrd.c and pngvcrd.c to handle bad adaptive filter types as + warnings instead of errors, as pngrutil.c does. + Set the PNG_INFO_IDAT valid flag in png_set_rows() so png_write_png() + will actually write IDATs. + Made the default PNG_USE_LOCAL_ARRAYS depend on PNG_DLL instead of WIN32. + Make png_free_data() ignore its final parameter except when freeing data + that can have multiple instances (text, sPLT, unknowns). + Fixed a new bug in png_set_rows(). + Removed info_ptr->valid tests from png_free_data(), as in version 1.0.5. + Added png_set_invalid() function. + Fixed incorrect illustrations of png_destroy_write_struct() in example.c. + +Version 1.0.7beta15 [May 30, 2000] + Revised the deliberately erroneous Linux setjmp code in pngconf.h to produce + fewer error messages. + Rearranged checks for Z_OK to check the most likely path first in pngpread.c + and pngwutil.c. + Added checks in pngtest.c for png_create_*() returning NULL, and mentioned + in libpng.txt/libpng.3 the need for applications to check this. + Changed names of png_default_*() functions in pngtest to pngtest_*(). + Changed return type of png_get_x|y_offset_*() from png_uint_32 to png_int_32. + Fixed some bugs in the unused PNG_INCH_CONVERSIONS functions in pngget.c + Set each pointer to NULL after freeing it in png_free_data(). + Worked around a problem in pngconf.h; AIX's strings.h defines an "index" + macro that conflicts with libpng's png_color_16.index. (Dimitri + Papadapoulos) + Added "msvc" directory with MSVC++ project files (Simon-Pierre Cadieux). + +Version 1.0.7beta16 [June 4, 2000] + Revised the workaround of AIX string.h "index" bug. + Added a check for overlength PLTE chunk in pngrutil.c. + Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer + indexing in pngrutil.c and pngwutil.c to accommodate a buggy compiler. + Added a warning in png_decompress_chunk() when it runs out of data, e.g. + when it tries to read an erroneous PhotoShop iCCP chunk. + Added PNG_USE_DLL macro. + Revised the copyright/disclaimer/license notice. + Added contrib/msvctest directory + +Version 1.0.7rc1 [June 9, 2000] + Corrected the definition of PNG_TRANSFORM_INVERT_ALPHA (0x0400 not 0x0200) + Added contrib/visupng directory (Willem van Schaik) + +Version 1.0.7beta18 [June 23, 2000] + Revised PNGAPI definition, and pngvcrd.c to work with __GCC__ + and do not redefine PNGAPI if it is passed in via a compiler directive. + Revised visupng/PngFile.c to remove returns from within the Try block. + Removed leading underscores from "_PNG_H" and "_PNG_SAVE_BSD_SOURCE" macros. + Updated contrib/visupng/cexcept.h to version 1.0.0. + Fixed bugs in pngwrite.c and pngwutil.c that prevented writing iCCP chunks. + +Version 1.0.7rc2 [June 28, 2000] + Updated license to include disclaimers required by UCITA. + Fixed "DJBPP" typo in pnggccrd.c introduced in beta18. + +Version 1.0.7 [July 1, 2000] + Revised the definition of "trans_values" in libpng.3/libpng.txt + +Version 1.0.8beta1 [July 8, 2000] + Added png_free(png_ptr, key) two places in pngpread.c to stop memory leaks. + Changed PNG_NO_STDIO to PNG_NO_CONSOLE_IO, several places in pngrutil.c and + pngwutil.c. + Changed PNG_EXPORT_VAR to use PNG_IMPEXP, in pngconf.h. + Removed unused "#include " from png.c + Added WindowsCE support. + Revised pnggccrd.c to work with gcc-2.95.2 and in the Cygwin environment. + +Version 1.0.8beta2 [July 10, 2000] + Added project files to the wince directory and made further revisions + of pngtest.c, pngrio.c, and pngwio.c in support of WindowsCE. + +Version 1.0.8beta3 [July 11, 2000] + Only set the PNG_FLAG_FREE_TRNS or PNG_FREE_TRNS flag in png_handle_tRNS() + for indexed-color input files to avoid potential double-freeing trans array + under some unusual conditions; problem was introduced in version 1.0.6f. + Further revisions to pngtest.c and files in the wince subdirectory. + +Version 1.0.8beta4 [July 14, 2000] + Added the files pngbar.png and pngbar.jpg to the distribution. + Added makefile.cygwin, and cygwin support in pngconf.h + Added PNG_NO_ZALLOC_ZERO macro (makes png_zalloc skip zeroing memory) + +Version 1.0.8rc1 [July 16, 2000] + Revised png_debug() macros and statements to eliminate compiler warnings. + +Version 1.0.8 [July 24, 2000] + Added png_flush() in pngwrite.c, after png_write_IEND(). + Updated makefile.hpux to build a shared library. + +Version 1.0.9beta1 [November 10, 2000] + Fixed typo in scripts/makefile.hpux + Updated makevms.com in scripts and contrib/* and contrib/* (Martin Zinser) + Fixed seqence-point bug in contrib/pngminus/png2pnm (Martin Zinser) + Changed "cdrom.com" in documentation to "libpng.org" + Revised pnggccrd.c to get it all working, and updated makefile.gcmmx (Greg). + Changed type of "params" from voidp to png_voidp in png_read|write_png(). + Make sure PNGAPI and PNG_IMPEXP are defined in pngconf.h. + Revised the 3 instances of WRITEFILE in pngtest.c. + Relocated "msvc" and "wince" project subdirectories into "dll" subdirectory. + Updated png.rc in dll/msvc project + Revised makefile.dec to define and use LIBPATH and INCPATH + Increased size of global png_libpng_ver[] array from 12 to 18 chars. + Made global png_libpng_ver[], png_sig[] and png_pass_*[] arrays const. + Removed duplicate png_crc_finish() from png_handle_bKGD() function. + Added a warning when application calls png_read_update_info() multiple times. + Revised makefile.cygwin + Fixed bugs in iCCP support in pngrutil.c and pngwutil.c. + Replaced png_set_empty_plte_permitted() with png_permit_mng_features(). + +Version 1.0.9beta2 [November 19, 2000] + Renamed the "dll" subdirectory "projects". + Added borland project files to "projects" subdirectory. + Set VS_FF_PRERELEASE and VS_FF_PATCHED flags in msvc/png.rc when appropriate. + Add error message in png_set_compression_buffer_size() when malloc fails. + +Version 1.0.9beta3 [November 23, 2000] + Revised PNG_LIBPNG_BUILD_TYPE macro in png.h, used in the msvc project. + Removed the png_flush() in pngwrite.c that crashes some applications + that don't set png_output_flush_fn. + Added makefile.macosx and makefile.aix to scripts directory. + +Version 1.0.9beta4 [December 1, 2000] + Change png_chunk_warning to png_warning in png_check_keyword(). + Increased the first part of msg buffer from 16 to 18 in png_chunk_error(). + +Version 1.0.9beta5 [December 15, 2000] + Added support for filter method 64 (for PNG datastreams embedded in MNG). + +Version 1.0.9beta6 [December 18, 2000] + Revised png_set_filter() to accept filter method 64 when appropriate. + Added new PNG_HAVE_PNG_SIGNATURE bit to png_ptr->mode and use it to + help prevent applications from using MNG features in PNG datastreams. + Added png_permit_mng_features() function. + Revised libpng.3/libpng.txt. Changed "filter type" to "filter method". + +Version 1.0.9rc1 [December 23, 2000] + Revised test for PNG_HAVE_PNG_SIGNATURE in pngrutil.c + Fixed error handling of unknown compression type in png_decompress_chunk(). + In pngconf.h, define __cdecl when _MSC_VER is defined. + +Version 1.0.9beta7 [December 28, 2000] + Changed PNG_TEXT_COMPRESSION_zTXt to PNG_COMPRESSION_TYPE_BASE several places. + Revised memory management in png_set_hIST and png_handle_hIST in a backward + compatible manner. PLTE and tRNS were revised similarly. + Revised the iCCP chunk reader to ignore trailing garbage. + +Version 1.0.9beta8 [January 12, 2001] + Moved pngasmrd.h into pngconf.h. + Improved handling of out-of-spec garbage iCCP chunks generated by PhotoShop. + +Version 1.0.9beta9 [January 15, 2001] + Added png_set_invalid, png_permit_mng_features, and png_mmx_supported to + wince and msvc project module definition files. + Minor revision of makefile.cygwin. + Fixed bug with progressive reading of narrow interlaced images in pngpread.c + +Version 1.0.9beta10 [January 16, 2001] + Do not typedef png_FILE_p in pngconf.h when PNG_NO_STDIO is defined. + Fixed "png_mmx_supported" typo in project definition files. + +Version 1.0.9beta11 [January 19, 2001] + Updated makefile.sgi to make shared library. + Removed png_mmx_support() function and disabled PNG_MNG_FEATURES_SUPPORTED + by default, for the benefit of DLL forward compatibility. These will + be re-enabled in version 1.2.0. + +Version 1.0.9rc2 [January 22, 2001] + Revised cygwin support. + +Version 1.0.9 [January 31, 2001] + Added check of cygwin's ALL_STATIC in pngconf.h + Added "-nommx" parameter to contrib/gregbook/rpng2-win and rpng2-x demos. + +Version 1.0.10beta1 [March 14, 2001] + Revised makefile.dec, makefile.sgi, and makefile.sggcc; added makefile.hpgcc. + Reformatted libpng.3 to eliminate bad line breaks. + Added checks for _mmx_supported in the read_filter_row function of pnggccrd.c + Added prototype for png_mmx_support() near the top of pnggccrd.c + Moved some error checking from png_handle_IHDR to png_set_IHDR. + Added PNG_NO_READ_SUPPORTED and PNG_NO_WRITE_SUPPORTED macros. + Revised png_mmx_support() function in pnggccrd.c + Restored version 1.0.8 PNG_WRITE_EMPTY_PLTE_SUPPORTED behavior in pngwutil.c + Fixed memory leak in contrib/visupng/PngFile.c + Fixed bugs in png_combine_row() in pnggccrd.c and pngvcrd.c (C version) + Added warnings when retrieving or setting gamma=0. + Increased the first part of msg buffer from 16 to 18 in png_chunk_warning(). + +Version 1.0.10rc1 [March 23, 2001] + Changed all instances of memcpy, strcpy, and strlen to png_memcpy, png_strcpy, + and png_strlen. + Revised png_mmx_supported() function in pnggccrd.c to return proper value. + Fixed bug in progressive reading (pngpread.c) with small images (height < 8). + +Version 1.0.10 [March 30, 2001] + Deleted extraneous space (introduced in 1.0.9) from line 42 of makefile.cygwin + Added beos project files (Chris Herborth) + +Version 1.0.11beta1 [April 3, 2001] + Added type casts on several png_malloc() calls (Dimitri Papadapoulos). + Removed a no-longer needed AIX work-around from pngconf.h + Changed several "//" single-line comments to C-style in pnggccrd.c + +Version 1.0.11beta2 [April 11, 2001] + Removed PNGAPI from several functions whose prototypes did not have PNGAPI. + Updated scripts/pngos2.def + +Version 1.0.11beta3 [April 14, 2001] + Added checking the results of many instances of png_malloc() for NULL + +Version 1.0.11beta4 [April 20, 2001] + Undid the changes from version 1.0.11beta3. Added a check for NULL return + from user's malloc_fn(). + Removed some useless type casts of the NULL pointer. + Added makefile.netbsd + +Version 1.0.11 [April 27, 2001] + Revised makefile.netbsd + +Version 1.0.12beta1 [May 14, 2001] + Test for Windows platform in pngconf.h when including malloc.h (Emmanuel Blot) + Updated makefile.cygwin and handling of Cygwin's ALL_STATIC in pngconf.h + Added some never-to-be-executed code in pnggccrd.c to quiet compiler warnings. + Eliminated the png_error about apps using png_read|write_init(). Instead, + libpng will reallocate the png_struct and info_struct if they are too small. + This retains future binary compatibility for old applications written for + libpng-0.88 and earlier. + +Version 1.2.0beta1 [May 6, 2001] + Bumped DLLNUM to 2. + Re-enabled PNG_MNG_FEATURES_SUPPORTED and enabled PNG_ASSEMBLER_CODE_SUPPORTED + by default. + Added runtime selection of MMX features. + Added png_set_strip_error_numbers function and related macros. + +Version 1.2.0beta2 [May 7, 2001] + Finished merging 1.2.0beta1 with version 1.0.11 + Added a check for attempts to read or write PLTE in grayscale PNG datastreams. + +Version 1.2.0beta3 [May 17, 2001] + Enabled user memory function by default. + Modified png_create_struct so it passes user mem_ptr to user memory allocator. + Increased png_mng_features flag from png_byte to png_uint_32. + Bumped shared-library (so-number) and dll-number to 3. + +Version 1.2.0beta4 [June 23, 2001] + Check for missing profile length field in iCCP chunk and free chunk_data + in case of truncated iCCP chunk. + Bumped shared-library number to 3 in makefile.sgi and makefile.sggcc + Bumped dll-number from 2 to 3 in makefile.cygwin + Revised contrib/gregbook/rpng*-x.c to avoid a memory leak and to exit cleanly + if user attempts to run it on an 8-bit display. + Updated contrib/gregbook + Use png_malloc instead of png_zalloc to allocate palette in pngset.c + Updated makefile.ibmc + Added some typecasts to eliminate gcc 3.0 warnings. Changed prototypes + of png_write_oFFS width and height from png_uint_32 to png_int_32. + Updated example.c + Revised prototypes for png_debug_malloc and png_debug_free in pngtest.c + +Version 1.2.0beta5 [August 8, 2001] + Revised contrib/gregbook + Revised makefile.gcmmx + Revised pnggccrd.c to conditionally compile some thread-unsafe code only + when PNG_THREAD_UNSAFE_OK is defined. + Added tests to prevent pngwutil.c from writing a bKGD or tRNS chunk with + value exceeding 2^bit_depth-1 + Revised makefile.sgi and makefile.sggcc + Replaced calls to fprintf(stderr,...) with png_warning() in pnggccrd.c + Removed restriction that do_invert_mono only operate on 1-bit opaque files + +Version 1.2.0 [September 1, 2001] + Changed a png_warning() to png_debug() in pnggccrd.c + Fixed contrib/gregbook/rpng-x.c, rpng2-x.c to avoid crash with XFreeGC(). + +Version 1.2.1beta1 [October 19, 2001] + Revised makefile.std in contrib/pngminus + Include background_1 in png_struct regardless of gamma support. + Revised makefile.netbsd and makefile.macosx, added makefile.darwin. + Revised example.c to provide more details about using row_callback(). + +Version 1.2.1beta2 [October 25, 2001] + Added type cast to each NULL appearing in a function call, except for + WINCE functions. + Added makefile.so9. + +Version 1.2.1beta3 [October 27, 2001] + Removed type casts from all NULLs. + Simplified png_create_struct_2(). + +Version 1.2.1beta4 [November 7, 2001] + Revised png_create_info_struct() and png_creat_struct_2(). + Added error message if png_write_info() was omitted. + Type cast NULLs appearing in function calls when _NO_PROTO or + PNG_TYPECAST_NULL is defined. + +Version 1.2.1rc1 [November 24, 2001] + Type cast NULLs appearing in function calls except when PNG_NO_TYPECAST_NULL + is defined. + Changed typecast of "size" argument to png_size_t in pngmem.c calls to + the user malloc_fn, to agree with the prototype in png.h + Added a pop/push operation to pnggccrd.c, to preserve Eflag (Maxim Sobolev) + Updated makefile.sgi to recognize LIBPATH and INCPATH. + Updated various makefiles so "make clean" does not remove previous major + version of the shared library. + +Version 1.2.1rc2 [December 4, 2001] + Always allocate 256-entry internal palette, hist, and trans arrays, to + avoid out-of-bounds memory reference caused by invalid PNG datastreams. + Added a check for prefix_length > data_length in iCCP chunk handler. + +Version 1.2.1 [December 7, 2001] + None. + +Version 1.2.2beta1 [February 22, 2002] + Fixed a bug with reading the length of iCCP profiles (Larry Reeves). + Revised makefile.linux, makefile.gcmmx, and makefile.sgi to generate + libpng.a, libpng12.so (not libpng.so.3), and libpng12/png.h + Revised makefile.darwin to remove "-undefined suppress" option. + Added checks for gamma and chromaticity values over 21474.83, which exceed + the limit for PNG unsigned 32-bit integers when encoded. + Revised calls to png_create_read_struct() and png_create_write_struct() + for simpler debugging. + Revised png_zalloc() so zlib handles errors (uses PNG_FLAG_MALLOC_NULL_MEM_OK) + +Version 1.2.2beta2 [February 23, 2002] + Check chunk_length and idat_size for invalid (over PNG_MAX_UINT) lengths. + Check for invalid image dimensions in png_get_IHDR. + Added missing "fi;" in the install target of the SGI makefiles. + Added install-static to all makefiles that make shared libraries. + Always do gamma compensation when image is partially transparent. + +Version 1.2.2beta3 [March 7, 2002] + Compute background.gray and background_1.gray even when color_type is RGB + in case image gets reduced to gray later. + Modified shared-library makefiles to install pkgconfig/libpngNN.pc. + Export (with PNGAPI) png_zalloc, png_zfree, and png_handle_as_unknown + Removed unused png_write_destroy_info prototype from png.h + Eliminated incorrect use of width_mmx from pnggccrd.c in pixel_bytes == 8 case + Added install-shared target to all makefiles that make shared libraries. + Stopped a double free of palette, hist, and trans when not using free_me. + Added makefile.32sunu for Sun Ultra 32 and makefile.64sunu for Sun Ultra 64. + +Version 1.2.2beta4 [March 8, 2002] + Compute background.gray and background_1.gray even when color_type is RGB + in case image gets reduced to gray later (Jason Summers). + Relocated a misplaced /bin/rm in the "install-shared" makefile targets + Added PNG_1_0_X macro which can be used to build a 1.0.x-compatible library. + +Version 1.2.2beta5 [March 26, 2002] + Added missing PNGAPI to several function definitions. + Check for invalid bit_depth or color_type in png_get_IHDR(), and + check for missing PLTE or IHDR in png_push_read_chunk() (Matthias Clasen). + Revised iTXt support to accept NULL for lang and lang_key. + Compute gamma for color components of background even when color_type is gray. + Changed "()" to "{}" in scripts/libpng.pc.in. + Revised makefiles to put png.h and pngconf.h only in $prefix/include/libpngNN + Revised makefiles to make symlink to libpng.so.NN in addition to libpngNN.so + +Version 1.2.2beta6 [March 31, 2002] + +Version 1.0.13beta1 [March 31, 2002] + Prevent png_zalloc() from trying to memset memory that it failed to acquire. + Add typecasts of PNG_MAX_UINT in pngset_cHRM_fixed() (Matt Holgate). + Ensure that the right function (user or default) is used to free the + png_struct after an error in png_create_read_struct_2(). + +Version 1.2.2rc1 [April 7, 2002] + +Version 1.0.13rc1 [April 7, 2002] + Save the ebx register in pnggccrd.c (Sami Farin) + Add "mem_ptr = png_ptr->mem_ptr" in png_destroy_write_struct() (Paul Gardner). + Updated makefiles to put headers in include/libpng and remove old include/*.h. + +Version 1.2.2 [April 15, 2002] + +Version 1.0.13 [April 15, 2002] + Revised description of png_set_filter() in libpng.3/libpng.txt. + Revised makefile.netbsd and added makefile.neNNbsd and makefile.freebsd + +Version 1.0.13patch01 [April 17, 2002] + +Version 1.2.2patch01 [April 17, 2002] + Changed ${PNGMAJ}.${PNGVER} bug to ${PNGVER} in makefile.sgi and + makefile.sggcc + Fixed VER -> PNGVER typo in makefile.macosx and added install-static to + install + Added install: target to makefile.32sunu and makefile.64sunu + +Version 1.0.13patch03 [April 18, 2002] + +Version 1.2.2patch03 [April 18, 2002] + Revised 15 makefiles to link libpng.a to libpngNN.a and the include libpng + subdirectory to libpngNN subdirectory without the full pathname. + Moved generation of libpng.pc from "install" to "all" in 15 makefiles. + +Version 1.2.3rc1 [April 28, 2002] + Added install-man target to 15 makefiles (Dimitri Papadopolous-Orfanos). + Added $(DESTDIR) feature to 24 makefiles (Tim Mooney) + Fixed bug with $prefix, should be $(prefix) in makefile.hpux. + Updated cygwin-specific portion of pngconf.h and revised makefile.cygwin + Added a link from libpngNN.pc to libpng.pc in 15 makefiles. + Added links from include/libpngNN/*.h to include/*.h in 24 makefiles. + Revised makefile.darwin to make relative links without full pathname. + Added setjmp() at the end of png_create_*_struct_2() in case user forgets + to put one in their application. + Restored png_zalloc() and png_zfree() prototypes to version 1.2.1 and + removed them from module definition files. + +Version 1.2.3rc2 [May 1, 2002] + Fixed bug in reporting number of channels in pngget.c and pngset.c, + that was introduced in version 1.2.2beta5. + Exported png_zalloc(), png_zfree(), png_default_read(), png_default_write(), + png_default_flush(), and png_push_fill_buffer() and included them in + module definition files. + Added "libpng.pc" dependency to the "install-shared" target in 15 makefiles. + +Version 1.2.3rc3 [May 1, 2002] + Revised prototype for png_default_flush() + Remove old libpng.pc and libpngNN.pc before installing new ones. + +Version 1.2.3rc4 [May 2, 2002] + Typos in *.def files (png_default_read|write -> png_default_read|write_data) + In makefiles, changed rm libpng.NN.pc to rm libpngNN.pc + Added libpng-config and libpngNN-config and modified makefiles to install + them. + Changed $(MANPATH) to $(DESTDIR)$(MANPATH) in makefiles + Added "Win32 DLL VB" configuration to projects/msvc/libpng.dsp + +Version 1.2.3rc5 [May 11, 2002] + Changed "error" and "message" in prototypes to "error_message" and + "warning_message" to avoid namespace conflict. + Revised 15 makefiles to build libpng-config from libpng-config-*.in + Once more restored png_zalloc and png_zfree to regular nonexported form. + Restored png_default_read|write_data, png_default_flush, png_read_fill_buffer + to nonexported form, but with PNGAPI, and removed them from module def + files. + +Version 1.2.3rc6 [May 14, 2002] + Removed "PNGAPI" from png_zalloc() and png_zfree() in png.c + Changed "Gz" to "Gd" in projects/msvc/libpng.dsp and zlib.dsp. + Removed leftover libpng-config "sed" script from four makefiles. + Revised libpng-config creating script in 16 makefiles. + +Version 1.2.3 [May 22, 2002] + Revised libpng-config target in makefile.cygwin. + Removed description of png_set_mem_fn() from documentation. + Revised makefile.freebsd. + Minor cosmetic changes to 15 makefiles, e.g., $(DI) = $(DESTDIR)/$(INCDIR). + Revised projects/msvc/README.txt + Changed -lpng to -lpngNN in LDFLAGS in several makefiles. + +Version 1.2.4beta1 [May 24, 2002] + Added libpng.pc and libpng-config to "all:" target in 16 makefiles. + Fixed bug in 16 makefiles: $(DESTDIR)/$(LIBPATH) to $(DESTDIR)$(LIBPATH) + Added missing "\" before closing double quote in makefile.gcmmx. + Plugged various memory leaks; added png_malloc_warn() and png_set_text_2() + functions. + +Version 1.2.4beta2 [June 25, 2002] + Plugged memory leak of png_ptr->current_text (Matt Holgate). + Check for buffer overflow before reading CRC in pngpread.c (Warwick Allison) + Added -soname to the loader flags in makefile.dec, makefile.sgi, and + makefile.sggcc. + Added "test-installed" target to makefile.linux, makefile.gcmmx, + makefile.sgi, and makefile.sggcc. + +Version 1.2.4beta3 [June 28, 2002] + Plugged memory leak of row_buf in pngtest.c when there is a png_error(). + Detect buffer overflow in pngpread.c when IDAT is corrupted with extra data. + Added "test-installed" target to makefile.32sunu, makefile.64sunu, + makefile.beos, makefile.darwin, makefile.dec, makefile.macosx, + makefile.solaris, makefile.hpux, makefile.hpgcc, and makefile.so9. + +Version 1.2.4rc1 and 1.0.14rc1 [July 2, 2002] + Added "test-installed" target to makefile.cygwin and makefile.sco. + Revised pnggccrd.c to be able to back out version 1.0.x via PNG_1_0_X macro. + +Version 1.2.4 and 1.0.14 [July 8, 2002] + Changed png_warning() to png_error() when width is too large to process. + +Version 1.2.4patch01 [July 20, 2002] + Revised makefile.cygwin to use DLL number 12 instead of 13. + +Version 1.2.5beta1 [August 6, 2002] + Added code to contrib/gregbook/readpng2.c to ignore unused chunks. + Replaced toucan.png in contrib/gregbook (it has been corrupt since 1.0.11) + Removed some stray *.o files from contrib/gregbook. + Changed png_error() to png_warning() about "Too much data" in pngpread.c + and about "Extra compressed data" in pngrutil.c. + Prevent png_ptr->pass from exceeding 7 in png_push_finish_row(). + Updated makefile.hpgcc + Updated png.c and pnggccrd.c handling of return from png_mmx_support() + +Version 1.2.5beta2 [August 15, 2002] + Only issue png_warning() about "Too much data" in pngpread.c when avail_in + is nonzero. + Updated makefiles to install a separate libpng.so.3 with its own rpath. + +Version 1.2.5rc1 and 1.0.15rc1 [August 24, 2002] + Revised makefiles to not remove previous minor versions of shared libraries. + +Version 1.2.5rc2 and 1.0.15rc2 [September 16, 2002] + Revised 13 makefiles to remove "-lz" and "-L$(ZLIBLIB)", etc., from shared + library loader directive. + Added missing "$OBJSDLL" line to makefile.gcmmx. + Added missing "; fi" to makefile.32sunu. + +Version 1.2.5rc3 and 1.0.15rc3 [September 18, 2002] + Revised libpng-config script. + +Version 1.2.5 and 1.0.15 [October 3, 2002] + Revised makefile.macosx, makefile.darwin, makefile.hpgcc, and makefile.hpux, + and makefile.aix. + Relocated two misplaced PNGAPI lines in pngtest.c + +Version 1.2.6beta1 [October 22, 2002] + Commented out warning about uninitialized mmx_support in pnggccrd.c. + Changed "IBMCPP__" flag to "__IBMCPP__" in pngconf.h. + Relocated two more misplaced PNGAPI lines in pngtest.c + Fixed memory overrun bug in png_do_read_filler() with 16-bit datastreams, + introduced in version 1.0.2. + Revised makefile.macosx, makefile.dec, makefile.aix, and makefile.32sunu. + +Version 1.2.6beta2 [November 1, 2002] + Added libpng-config "--ldopts" output. + Added "AR=ar" and "ARFLAGS=rc" and changed "ar rc" to "$(AR) $(ARFLAGS)" + in makefiles. + +Version 1.2.6beta3 [July 18, 2004] + Reverted makefile changes from version 1.2.6beta2 and some of the changes + from version 1.2.6beta1; these will be postponed until version 1.2.7. + Version 1.2.6 is going to be a simple bugfix release. + Changed the one instance of "ln -sf" to "ln -f -s" in each Sun makefile. + Fixed potential overrun in pngerror.c by using strncpy instead of memcpy. + Added "#!/bin/sh" at the top of configure, for recognition of the + 'x' flag under Cygwin (Cosmin). + Optimized vacuous tests that silence compiler warnings, in png.c (Cosmin). + Added support for PNG_USER_CONFIG, in pngconf.h (Cosmin). + Fixed the special memory handler for Borland C under DOS, in pngmem.c + (Cosmin). + Removed some spurious assignments in pngrutil.c (Cosmin). + Replaced 65536 with 65536L, and 0xffff with 0xffffL, to silence warnings + on 16-bit platforms (Cosmin). + Enclosed shift op expressions in parentheses, to silence warnings (Cosmin). + Used proper type png_fixed_point, to avoid problems on 16-bit platforms, + in png_handle_sRGB() (Cosmin). + Added compression_type to png_struct, and optimized the window size + inside the deflate stream (Cosmin). + Fixed definition of isnonalpha(), in pngerror.c and pngrutil.c (Cosmin). + Fixed handling of unknown chunks that come after IDAT (Cosmin). + Allowed png_error() and png_warning() to work even if png_ptr == NULL + (Cosmin). + Replaced row_info->rowbytes with row_bytes in png_write_find_filter() + (Cosmin). + Fixed definition of PNG_LIBPNG_VER_DLLNUM (Simon-Pierre). + Used PNG_LIBPNG_VER and PNG_LIBPNG_VER_STRING instead of the hardcoded + values in png.c (Simon-Pierre, Cosmin). + Initialized png_libpng_ver[] with PNG_LIBPNG_VER_STRING (Simon-Pierre). + Replaced PNG_LIBPNG_VER_MAJOR with PNG_LIBPNG_VER_DLLNUM in png.rc + (Simon-Pierre). + Moved the definition of PNG_HEADER_VERSION_STRING near the definitions + of the other PNG_LIBPNG_VER_... symbols in png.h (Cosmin). + Relocated #ifndef PNGAPI guards in pngconf.h (Simon-Pierre, Cosmin). + Updated scripts/makefile.vc(a)win32 (Cosmin). + Updated the MSVC project (Simon-Pierre, Cosmin). + Updated the Borland C++ Builder project (Cosmin). + Avoided access to asm_flags in pngvcrd.c, if PNG_1_0_X is defined (Cosmin). + Commented out warning about uninitialized mmx_support in pngvcrd.c (Cosmin). + Removed scripts/makefile.bd32 and scripts/pngdef.pas (Cosmin). + Added extra guard around inclusion of Turbo C memory headers, in pngconf.h + (Cosmin). + Renamed projects/msvc/ to projects/visualc6/, and projects/borland/ to + projects/cbuilder5/ (Cosmin). + Moved projects/visualc6/png32ms.def to scripts/pngw32.def, + and projects/visualc6/png.rc to scripts/pngw32.rc (Cosmin). + Added projects/visualc6/pngtest.dsp; removed contrib/msvctest/ (Cosmin). + Changed line endings to DOS style in cbuilder5 and visualc6 files, even + in the tar.* distributions (Cosmin). + Updated contrib/visupng/VisualPng.dsp (Cosmin). + Updated contrib/visupng/cexcept.h to version 2.0.0 (Cosmin). + Added a separate distribution with "configure" and supporting files (Junichi). + +Version 1.2.6beta4 [July 28, 2004] + Added user ability to change png_size_t via a PNG_SIZE_T macro. + Added png_sizeof() and png_convert_size() functions. + Added PNG_SIZE_MAX (maximum value of a png_size_t variable. + Added check in png_malloc_default() for (size_t)size != (png_uint_32)size + which would indicate an overflow. + Changed sPLT failure action from png_error to png_warning and abandon chunk. + Changed sCAL and iCCP failures from png_error to png_warning and abandon. + Added png_get_uint_31(png_ptr, buf) function. + Added PNG_UINT_32_MAX macro. + Renamed PNG_MAX_UINT to PNG_UINT_31_MAX. + Made png_zalloc() issue a png_warning and return NULL on potential + overflow. + Turn on PNG_NO_ZALLOC_ZERO by default in version 1.2.x + Revised "clobber list" in pnggccrd.c so it will compile under gcc-3.4. + Revised Borland portion of png_malloc() to return NULL or issue + png_error() according to setting of PNG_FLAG_MALLOC_NULL_MEM_OK. + Added PNG_NO_SEQUENTIAL_READ_SUPPORTED macro to conditionally remove + sequential read support. + Added some "#if PNG_WRITE_SUPPORTED" blocks. + Added #ifdef to remove some redundancy in png_malloc_default(). + Use png_malloc instead of png_zalloc to allocate the pallete. + +Version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004] + Fixed buffer overflow vulnerability in png_handle_tRNS() + Fixed integer arithmetic overflow vulnerability in png_read_png(). + Fixed some harmless bugs in png_handle_sBIT, etc, that would cause + duplicate chunk types to go undetected. + Fixed some timestamps in the -config version + Rearranged order of processing of color types in png_handle_tRNS(). + Added ROWBYTES macro to calculate rowbytes without integer overflow. + Updated makefile.darwin and removed makefile.macosx from scripts directory. + Imposed default one million column, one-million row limits on the image + dimensions, and added png_set_user_limits() function to override them. + Revised use of PNG_SET_USER_LIMITS_SUPPORTED macro. + Fixed wrong cast of returns from png_get_user_width|height_max(). + Changed some "keep the compiler happy" from empty statements to returns, + Revised libpng.txt to remove 1.2.x stuff from the 1.0.x distribution + +Version 1.0.16rc2 and 1.2.6rc2 [August 7, 2004] + Revised makefile.darwin and makefile.solaris. Removed makefile.macosx. + Revised pngtest's png_debug_malloc() to use png_malloc() instead of + png_malloc_default() which is not supposed to be exported. + Fixed off-by-one error in one of the conversions to PNG_ROWBYTES() in + pngpread.c. Bug was introduced in 1.2.6rc1. + Fixed bug in RGB to RGBX transformation introduced in 1.2.6rc1. + Fixed old bug in RGB to Gray transformation. + Fixed problem with 64-bit compilers by casting arguments to abs() + to png_int_32. + Changed "ln -sf" to "ln -f -s" in three makefiles (solaris, sco, so9). + Changed "HANDLE_CHUNK_*" to "PNG_HANDLE_CHUNK_*" (Cosmin) + Added "-@/bin/rm -f $(DL)/$(LIBNAME).so.$(PNGMAJ)" to 15 *NIX makefiles. + Added code to update the row_info->colortype in png_do_read_filler() (MSB). + +Version 1.0.16rc3 and 1.2.6rc3 [August 9, 2004] + Eliminated use of "abs()" in testing cHRM and gAMA values, to avoid + trouble with some 64-bit compilers. Created PNG_OUT_OF_RANGE() macro. + Revised documentation of png_set_keep_unknown_chunks(). + Check handle_as_unknown status in pngpread.c, as in pngread.c previously. + Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_INTERNAL section of png.h + Added "rim" definitions for CONST4 and CONST6 in pnggccrd.c + +Version 1.0.16rc4 and 1.2.6rc4 [August 10, 2004] + Fixed mistake in pngtest.c introduced in 1.2.6rc2 (declaration of + "pinfo" was out of place). + +Version 1.0.16rc5 and 1.2.6rc5 [August 10, 2004] + Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_ASSEMBLER_CODE_SUPPORTED + section of png.h where they were inadvertently placed in version rc3. + +Version 1.2.6 and 1.0.16 [August 15, 2004] + Revised pngtest so memory allocation testing is only done when PNG_DEBUG==1. + +Version 1.2.7beta1 [August 26, 2004] + Removed unused pngasmrd.h file. + Removed references to uu.net for archived files. Added references to + PNG Spec (second edition) and the PNG ISO/IEC Standard. + Added "test-dd" target in 15 makefiles, to run pngtest in DESTDIR. + Fixed bug with "optimized window size" in the IDAT datastream, that + causes libpng to write PNG files with incorrect zlib header bytes. + +Version 1.2.7beta2 [August 28, 2004] + Fixed bug with sCAL chunk and big-endian machines (David Munro). + Undid new code added in 1.2.6rc2 to update the color_type in + png_set_filler(). + Added png_set_add_alpha() that updates color type. + +Version 1.0.17rc1 and 1.2.7rc1 [September 4, 2004] + Revised png_set_strip_filler() to not remove alpha if color_type has alpha. + +Version 1.2.7 and 1.0.17 [September 12, 2004] + Added makefile.hp64 + Changed projects/msvc/png32ms.def to scripts/png32ms.def in makefile.cygwin + +Version 1.2.8beta1 [November 1, 2004] + Fixed bug in png_text_compress() that would fail to complete a large block. + Fixed bug, introduced in libpng-1.2.7, that overruns a buffer during + strip alpha operation in png_do_strip_filler(). + Added PNG_1_2_X definition in pngconf.h + Use #ifdef to comment out png_info_init in png.c and png_read_init in + pngread.c (as of 1.3.0) + +Version 1.2.8beta2 [November 2, 2004] + Reduce color_type to a nonalpha type after strip alpha operation in + png_do_strip_filler(). + +Version 1.2.8beta3 [November 3, 2004] + Revised definitions of PNG_MAX_UINT_32, PNG_MAX_SIZE, and PNG_MAXSUM + +Version 1.2.8beta4 [November 12, 2004] + Fixed (again) definition of PNG_LIBPNG_VER_DLLNUM in png.h (Cosmin). + Added PNG_LIBPNG_BUILD_PRIVATE in png.h (Cosmin). + Set png_ptr->zstream.data_type to Z_BINARY, to avoid unnecessary detection + of data type in deflate (Cosmin). + Deprecated but continue to support SPECIALBUILD and PRIVATEBUILD in favor of + PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING. + +Version 1.2.8beta5 [November 20, 2004] + Use png_ptr->flags instead of png_ptr->transformations to pass + PNG_STRIP_ALPHA info to png_do_strip_filler(), to preserve ABI + compatibility. + Revised handling of SPECIALBUILD, PRIVATEBUILD, + PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING. + +Version 1.2.8rc1 [November 24, 2004] + Moved handling of BUILD macros from pngconf.h to png.h + Added definition of PNG_LIBPNG_BASE_TYPE in png.h, inadvertently + omitted from beta5. + Revised scripts/pngw32.rc + Despammed mailing addresses by masking "@" with "at". + Inadvertently installed a supposedly faster test version of pngrutil.c + +Version 1.2.8rc2 [November 26, 2004] + Added two missing "\" in png.h + Change tests in pngread.c and pngpread.c to + if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + png_do_read_transformations(png_ptr); + +Version 1.2.8rc3 [November 28, 2004] + Reverted pngrutil.c to version libpng-1.2.8beta5. + Added scripts/makefile.elf with supporting code in pngconf.h for symbol + versioning (John Bowler). + +Version 1.2.8rc4 [November 29, 2004] + Added projects/visualc7 (Simon-pierre). + +Version 1.2.8rc5 [November 29, 2004] + Fixed new typo in scripts/pngw32.rc + +Version 1.2.8 [December 3, 2004] + Removed projects/visualc7, added projects/visualc71. + +Version 1.2.9beta1 [February 21, 2006] + Initialized some structure members in pngwutil.c to avoid gcc-4.0.0 complaints + Revised man page and libpng.txt to make it clear that one should not call + png_read_end or png_write_end after png_read_png or png_write_png. + Updated references to png-mng-implement mailing list. + Fixed an incorrect typecast in pngrutil.c + Added PNG_NO_READ_SUPPORTED conditional for making a write-only library. + Added PNG_NO_WRITE_INTERLACING_SUPPORTED conditional. + Optimized alpha-inversion loops in pngwtran.c + Moved test for nonzero gamma outside of png_build_gamma_table() in pngrtran.c + Make sure num_trans is <= 256 before copying data in png_set_tRNS(). + Make sure num_palette is <= 256 before copying data in png_set_PLTE(). + Interchanged order of write_swap_alpha and write_invert_alpha transforms. + Added parentheses in the definition of PNG_LIBPNG_BUILD_TYPE (Cosmin). + Optimized zlib window flag (CINFO) in contrib/pngsuite/*.png (Cosmin). + Updated scripts/makefile.bc32 for Borland C++ 5.6 (Cosmin). + Exported png_get_uint_32, png_save_uint_32, png_get_uint_16, png_save_uint_16, + png_get_int_32, png_save_int_32, png_get_uint_31 (Cosmin). + Added type cast (png_byte) in png_write_sCAL() (Cosmin). + Fixed scripts/makefile.cygwin (Christian Biesinger, Cosmin). + Default iTXt support was inadvertently enabled. + +Version 1.2.9beta2 [February 21, 2006] + Check for png_rgb_to_gray and png_gray_to_rgb read transformations before + checking for png_read_dither in pngrtran.c + Revised checking of chromaticity limits to accommodate extended RGB + colorspace (John Denker). + Changed line endings in some of the project files to CRLF, even in the + "Unix" tar distributions (Cosmin). + Made png_get_int_32 and png_save_int_32 always available (Cosmin). + Updated scripts/pngos2.def, scripts/pngw32.def and projects/wince/png32ce.def + with the newly exported functions. + Eliminated distributions without the "configure" script. + Updated INSTALL instructions. + +Version 1.2.9beta3 [February 24, 2006] + Fixed CRCRLF line endings in contrib/visupng/VisualPng.dsp + Made libpng.pc respect EXEC_PREFIX (D. P. Kreil, J. Bowler) + Removed reference to pngasmrd.h from Makefile.am + Renamed CHANGES to ChangeLog. + Renamed LICENSE to COPYING. + Renamed ANNOUNCE to NEWS. + Created AUTHORS file. + +Version 1.2.9beta4 [March 3, 2006] + Changed definition of PKGCONFIG from $prefix/lib to $libdir in configure.ac + Reverted to filenames LICENSE and ANNOUNCE; removed AUTHORS and COPYING. + Removed newline from the end of some error and warning messages. + Removed test for sqrt() from configure.ac and configure. + Made swap tables in pngtrans.c PNG_CONST (Carlo Bramix). + Disabled default iTXt support that was inadvertently enabled in + libpng-1.2.9beta1. + Added "OS2" to list of systems that don't need underscores, in pnggccrd.c + Removed libpng version and date from *.c files. + +Version 1.2.9beta5 [March 4, 2006] + Removed trailing blanks from source files. + Put version and date of latest change in each source file, and changed + copyright year accordingly. + More cleanup of configure.ac, Makefile.am, and associated scripts. + Restored scripts/makefile.elf which was inadvertently deleted. + +Version 1.2.9beta6 [March 6, 2006] + Fixed typo (RELEASE) in configuration files. + +Version 1.2.9beta7 [March 7, 2006] + Removed libpng.vers and libpng.sym from libpng12_la_SOURCES in Makefile.am + Fixed inconsistent #ifdef's around png_sig_bytes() and png_set_sCAL_s() + in png.h. + Updated makefile.elf as suggested by debian. + Made cosmetic changes to some makefiles, adding LN_SF and other macros. + Made some makefiles accept "exec_prefix". + +Version 1.2.9beta8 [March 9, 2006] + Fixed some "#if defined (..." which should be "#if defined(..." + Bug introduced in libpng-1.2.8. + Fixed inconsistency in definition of png_default_read_data() + Restored blank that was lost from makefile.sggcc "clean" target in beta7. + Revised calculation of "current" and "major" for irix in ltmain.sh + Changed "mkdir" to "MKDIR_P" in some makefiles. + Separated PNG_EXPAND and PNG_EXPAND_tRNS. + Added png_set_expand_gray_1_2_4_to_8() and deprecated + png_set_gray_1_2_4_to_8() which also expands tRNS to alpha. + +Version 1.2.9beta9 [March 10, 2006] + Include "config.h" in pngconf.h when available. + Added some checks for NULL png_ptr or NULL info_ptr (timeless) + +Version 1.2.9beta10 [March 20, 2006] + Removed extra CR from contrib/visualpng/VisualPng.dsw (Cosmin) + Made pnggccrd.c PIC-compliant (Christian Aichinger). + Added makefile.mingw (Wolfgang Glas). + Revised pngconf.h MMX checking. + +Version 1.2.9beta11 [March 22, 2006] + Fixed out-of-order declaration in pngwrite.c that was introduced in beta9 + Simplified some makefiles by using LIBSO, LIBSOMAJ, and LIBSOVER macros. + +Version 1.2.9rc1 [March 31, 2006] + Defined PNG_USER_PRIVATEBUILD when including "pngusr.h" (Cosmin). + Removed nonsensical assertion check from pngtest.c (Cosmin). + +Version 1.2.9 [April 14, 2006] + Revised makefile.beos and added "none" selector in ltmain.sh + +Version 1.2.10beta1 [April 15, 2006] + Renamed "config.h" to "png_conf.h" and revised Makefile.am to add + -DPNG_BUILDING_LIBPNG to compile directive, and modified pngconf.h + to include png_conf.h only when PNG_BUILDING_LIBPNG is defined. + +Version 1.2.10beta2 [April 15, 2006] + Manually updated Makefile.in and configure. Changed png_conf.h.in + back to config.h. + +Version 1.2.10beta3 [April 15, 2006] + Change png_conf.h back to config.h in pngconf.h. + +Version 1.2.10beta4 [April 16, 2006] + Change PNG_BUILDING_LIBPNG to PNG_CONFIGURE_LIBPNG in config/Makefile*. + +Version 1.2.10beta5 [April 16, 2006] + Added a configure check for compiling assembler code in pnggccrd.c + +Version 1.2.10beta6 [April 17, 2006] + Revised the configure check for pnggccrd.c + Moved -DPNG_CONFIGURE_LIBPNG into @LIBPNG_DEFINES@ + Added @LIBPNG_DEFINES@ to arguments when building libpng.sym + +Version 1.2.10beta7 [April 18, 2006] + Change "exec_prefix=$prefix" to "exec_prefix=$(prefix)" in makefiles. + +Version 1.2.10rc1 [April 19, 2006] + Ensure pngconf.h doesn't define both PNG_USE_PNGGCCRD and PNG_USE_PNGVCRD + Fixed "LN_FS" typo in makefile.sco and makefile.solaris. + +Version 1.2.10rc2 [April 20, 2006] + Added a backslash between -DPNG_CONFIGURE_LIBPNG and -DPNG_NO_ASSEMBLER_CODE + in configure.ac and configure + Made the configure warning about versioned symbols less arrogant. + +Version 1.2.10rc3 [April 21, 2006] + Added a note in libpng.txt that png_set_sig_bytes(8) can be used when + writing an embedded PNG without the 8-byte signature. + Revised makefiles and configure to avoid making links to libpng.so.* + +Version 1.2.10 [April 23, 2006] + Reverted configure to "rc2" state. + +Version 1.2.11beta1 [May 31, 2006] + scripts/libpng.pc.in contained "configure" style version info and would + not work with makefiles. + The shared-library makefiles were linking to libpng.so.0 instead of + libpng.so.3 compatibility as the library. + +Version 1.2.11beta2 [June 2, 2006] + Increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid + buffer overflow. + Fixed bug in example.c (png_set_palette_rgb -> png_set_palette_to_rgb) + +Version 1.2.11beta3 [June 5, 2006] + Prepended "#! /bin/sh" to ltmail.sh and contrib/pngminus/*.sh (Cosmin). + Removed the accidental leftover Makefile.in~ (Cosmin). + Avoided potential buffer overflow and optimized buffer in + png_write_sCAL(), png_write_sCAL_s() (Cosmin). + Removed the include directories and libraries from CFLAGS and LDFLAGS + in scripts/makefile.gcc (Nelson A. de Oliveira, Cosmin). + +Version 1.2.11beta4 [June 6, 2006] + Allow zero-length IDAT chunks after the entire zlib datastream, but not + after another intervening chunk type. + +Version 1.0.19rc1, 1.2.11rc1 [June 13, 2006] + Deleted extraneous square brackets from [config.h] in configure.ac + +Version 1.0.19rc2, 1.2.11rc2 [June 14, 2006] + Added prototypes for PNG_INCH_CONVERSIONS functions to png.h + Revised INSTALL and autogen.sh + Fixed typo in several makefiles (-W1 should be -Wl) + Added typedef for png_int_32 and png_uint_32 on 64-bit systems. + +Version 1.0.19rc3, 1.2.11rc3 [June 15, 2006] + Removed the new typedefs for 64-bit systems (delay until version 1.4.0) + Added one zero element to png_gamma_shift[] array in pngrtran.c to avoid + reading out of bounds. + +Version 1.0.19rc4, 1.2.11rc4 [June 15, 2006] + Really removed the new typedefs for 64-bit systems. + +Version 1.0.19rc5, 1.2.11rc5 [June 22, 2006] + Removed png_sig_bytes entry from scripts/pngw32.def + +Version 1.0.19, 1.2.11 [June 26, 2006] + None. + +Version 1.0.20, 1.2.12 [June 27, 2006] + Really increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid + buffer overflow. + +Version 1.2.13beta1 [October 2, 2006] + Removed AC_FUNC_MALLOC from configure.ac + Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h + Change "logical" to "bitwise" throughout documentation. + Detect and fix attempt to write wrong iCCP profile length. + +Version 1.0.21, 1.2.13 [November 14, 2006] + Fix potential buffer overflow in sPLT chunk handler. + Fix Makefile.am to not try to link to noexistent files. + Check all exported functions for NULL png_ptr. + +Version 1.2.14beta1 [November 17, 2006] + Relocated three misplaced tests for NULL png_ptr. + Built Makefile.in with automake-1.9.6 instead of 1.9.2. + Build configure with autoconf-2.60 instead of 2.59 + +Version 1.2.14beta2 [November 17, 2006] + Added some typecasts in png_zalloc(). + +Version 1.2.14rc1 [November 20, 2006] + Changed "strtod" to "png_strtod" in pngrutil.c + +Version 1.0.22, 1.2.14 [November 27, 2006] + Added missing "$(srcdir)" in Makefile.am and Makefile.in + +Version 1.2.15beta1 [December 3, 2006] + Generated configure with autoconf-2.61 instead of 2.60 + Revised configure.ac to update libpng.pc and libpng-config. + +Version 1.2.15beta2 [December 3, 2006] + Always export MMX asm functions, just stubs if not building pnggccrd.c + +Version 1.2.15beta3 [December 4, 2006] + Add "png_bytep" typecast to profile while calculating length in pngwutil.c + +Version 1.2.15beta4 [December 7, 2006] + Added scripts/CMakeLists.txt + Changed PNG_NO_ASSEMBLER_CODE to PNG_NO_MMX_CODE in scripts, like 1.4.0beta + +Version 1.2.15beta5 [December 7, 2006] + Changed some instances of PNG_ASSEMBLER_* to PNG_MMX_* in pnggccrd.c + Revised scripts/CMakeLists.txt + +Version 1.2.15beta6 [December 13, 2006] + Revised scripts/CMakeLists.txt and configure.ac + +Version 1.2.15rc1 [December 18, 2006] + Revised scripts/CMakeLists.txt + +Version 1.2.15rc2 [December 21, 2006] + Added conditional #undef jmpbuf in pngtest.c to undo #define in AIX headers. + Added scripts/makefile.nommx + +Version 1.2.15rc3 [December 25, 2006] + Fixed shared library numbering error that was introduced in 1.2.15beta6. + +Version 1.2.15rc4 [December 27, 2006] + Fixed handling of rgb_to_gray when png_ptr->color.gray isn't set. + +Version 1.2.15rc5 [December 31, 2006] + Revised handling of rgb_to_gray. + +Version 1.2.15 [January 5, 2007] + Added some (unsigned long) typecasts in pngtest.c to avoid printing errors. + +Version 1.2.16beta1 [January 6, 2007] + Fix bugs in makefile.nommx + +Version 1.2.16beta2 [January 16, 2007] + Revised scripts/CMakeLists.txt + +Version 1.2.16 [January 31, 2007] + No changes. + +Version 1.2.17beta1 [March 6, 2007] + Revised scripts/CMakeLists.txt to install both shared and static libraries. + Deleted a redundant line from pngset.c. + +Version 1.2.17beta2 [April 26, 2007] + Relocated misplaced test for png_ptr == NULL in pngpread.c + Change "==" to "&" for testing PNG_RGB_TO_GRAY_ERR & PNG_RGB_TO_GRAY_WARN + flags. + Changed remaining instances of PNG_ASSEMBLER_* to PNG_MMX_* + Added pngerror() when write_IHDR fails in deflateInit2(). + Added "const" to some array declarations. + Mention examples of libpng usage in the libpng*.txt and libpng.3 documents. + +Version 1.2.17rc1 [May 4, 2007] + No changes. + +Version 1.2.17rc2 [May 8, 2007] + Moved several PNG_HAVE_* macros out of PNG_INTERNAL because applications + calling set_unknown_chunk_location() need them. + Changed transformation flag from PNG_EXPAND_tRNS to PNG_EXPAND in + png_set_expand_gray_1_2_4_to_8(). + Added png_ptr->unknown_chunk to hold working unknown chunk data, so it + can be free'ed in case of error. Revised unknown chunk handling in + pngrutil.c and pngpread.c to use this structure. + +Version 1.2.17rc3 [May 8, 2007] + Revised symbol-handling in configure script. + +Version 1.2.17rc4 [May 10, 2007] + Revised unknown chunk handling to avoid storing unknown critical chunks. + +Version 1.0.25 [May 15, 2007] +Version 1.2.17 [May 15, 2007] + Added "png_ptr->num_trans=0" before error return in png_handle_tRNS, + to eliminate a vulnerability (CVE-2007-2445, CERT VU#684664) + +Version 1.0.26 [May 15, 2007] +Version 1.2.18 [May 15, 2007] + Reverted the libpng-1.2.17rc3 change to symbol-handling in configure script + +Version 1.2.19beta1 [May 18, 2007] + Changed "const static" to "static PNG_CONST" everywhere, mostly undoing + change of libpng-1.2.17beta2. Changed other "const" to "PNG_CONST" + Changed some handling of unused parameters, to avoid compiler warnings. + "if (unused == NULL) return;" becomes "unused = unused". + +Version 1.2.19beta2 [May 18, 2007] + Only use the valid bits of tRNS value in png_do_expand() (Brian Cartier) + +Version 1.2.19beta3 [May 19, 2007] + Add some "png_byte" typecasts in png_check_keyword() and write new_key + instead of key in zTXt chunk (Kevin Ryde). + +Version 1.2.19beta4 [May 21, 2007] + Add png_snprintf() function and use it in place of sprint() for improved + defense against buffer overflows. + +Version 1.2.19beta5 [May 21, 2007] + Fixed png_handle_tRNS() to only use the valid bits of tRNS value. + Changed handling of more unused parameters, to avoid compiler warnings. + Removed some PNG_CONST in pngwutil.c to avoid compiler warnings. + +Version 1.2.19beta6 [May 22, 2007] + Added some #ifdef PNG_MMX_CODE_SUPPORTED where needed in pngvcrd.c + Added a special "_MSC_VER" case that defines png_snprintf to _snprintf + +Version 1.2.19beta7 [May 22, 2007] + Squelched png_squelch_warnings() in pnggccrd.c and added + an #ifdef PNG_MMX_CODE_SUPPORTED block around the declarations that caused + the warnings that png_squelch_warnings was squelching. + +Version 1.2.19beta8 [May 22, 2007] + Removed __MMX__ from test in pngconf.h. + +Version 1.2.19beta9 [May 23, 2007] + Made png_squelch_warnings() available via PNG_SQUELCH_WARNINGS macro. + Revised png_squelch_warnings() so it might work. + Updated makefile.sgcc and makefile.solaris; added makefile.solaris-x86. + +Version 1.2.19beta10 [May 24, 2007] + Resquelched png_squelch_warnings(), use "__attribute__((used))" instead. + +Version 1.4.0beta1 [April 20, 2006] + Enabled iTXt support (changes png_struct, thus requires so-number change). + Cleaned up PNG_ASSEMBLER_CODE_SUPPORTED vs PNG_MMX_CODE_SUPPORTED + Eliminated PNG_1_0_X and PNG_1_2_X macros. + Removed deprecated functions png_read_init, png_write_init, png_info_init, + png_permit_empty_plte, png_set_gray_1_2_4_to_8, png_check_sig, and + removed the deprecated macro PNG_MAX_UINT. + Moved "PNG_INTERNAL" parts of png.h and pngconf.h into pngintrn.h + Removed many WIN32_WCE #ifdefs (Cosmin). + Reduced dependency on C-runtime library when on Windows (Simon-Pierre) + Replaced sprintf() with png_sprintf() (Simon-Pierre) + +Version 1.4.0beta2 [April 20, 2006] + Revised makefiles and configure to avoid making links to libpng.so.* + Moved some leftover MMX-related defines from pngconf.h to pngintrn.h + Updated scripts/pngos2.def, pngw32.def, and projects/wince/png32ce.def + +Version 1.4.0beta3 [May 10, 2006] + Updated scripts/pngw32.def to comment out MMX functions. + Added PNG_NO_GET_INT_32 and PNG_NO_SAVE_INT_32 macros. + Scripts/libpng.pc.in contained "configure" style version info and would + not work with makefiles. + Revised pngconf.h and added pngconf.h.in, so makefiles and configure can + pass defines to libpng and applications. + +Version 1.4.0beta4 [May 11, 2006] + Revised configure.ac, Makefile.am, and many of the makefiles to write + their defines in pngconf.h. + +Version 1.4.0beta5 [May 15, 2006] + Added a missing semicolon in Makefile.am and Makefile.in + Deleted extraneous square brackets from configure.ac + +Version 1.4.0beta6 [June 2, 2006] + Increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid + buffer overflow. + Changed sonum from 0 to 1. + Removed unused prototype for png_check_sig() from png.h + +Version 1.4.0beta7 [June 16, 2006] + Exported png_write_sig (Cosmin). + Optimized buffer in png_handle_cHRM() (Cosmin). + Set pHYs = 2835 x 2835 pixels per meter, and added + sCAL = 0.352778e-3 x 0.352778e-3 meters, in pngtest.png (Cosmin). + Added png_set_benign_errors(), png_benign_error(), png_chunk_benign_error(). + Added typedef for png_int_32 and png_uint_32 on 64-bit systems. + Added "(unsigned long)" typecast on png_uint_32 variables in printf lists. + +Version 1.4.0beta8 [June 22, 2006] + Added demonstration of user chunk support in pngtest.c, to support the + public sTER chunk and a private vpAg chunk. + +Version 1.4.0beta9 [July 3, 2006] + Removed ordinals from scripts/pngw32.def and removed png_info_int and + png_set_gray_1_2_4_to_8 entries. + Inline call of png_get_uint_32() in png_get_uint_31(). + Use png_get_uint_31() to get vpAg width and height in pngtest.c + Removed WINCE and Netware projects. + Removed standalone Y2KINFO file. + +Version 1.4.0beta10 [July 12, 2006] + Eliminated automatic copy of pngconf.h to pngconf.h.in from configure and + some makefiles, because it was not working reliably. Instead, distribute + pngconf.h.in along with pngconf.h and cause configure and some of the + makefiles to update pngconf.h from pngconf.h.in. + Added pngconf.h to DEPENDENCIES in Makefile.am + +Version 1.4.0beta11 [August 19, 2006] + Removed AC_FUNC_MALLOC from configure.ac. + Added a warning when writing iCCP profile with mismatched profile length. + Patched pnggccrd.c to assemble on x86_64 platforms. + Moved chunk header reading into a separate function png_read_chunk_header() + in pngrutil.c. The chunk header (len+sig) is now serialized in a single + operation (Cosmin). + Implemented support for I/O states. Added png_ptr member io_state, and + functions png_get_io_chunk_name() and png_get_io_state() in pngget.c + (Cosmin). + Added png_get_io_chunk_name and png_get_io_state to scripts/*.def (Cosmin). + Renamed scripts/pngw32.* to scripts/pngwin.* (Cosmin). + Removed the include directories and libraries from CFLAGS and LDFLAGS + in scripts/makefile.gcc (Cosmin). + Used png_save_uint_32() to set vpAg width and height in pngtest.c (Cosmin). + Cast to proper type when getting/setting vpAg units in pngtest.c (Cosmin). + Added pngintrn.h to the Visual C++ projects (Cosmin). + Removed scripts/list (Cosmin). + Updated copyright year in scripts/pngwin.def (Cosmin). + Removed PNG_TYPECAST_NULL and used standard NULL consistently (Cosmin). + Disallowed the user to redefine png_size_t, and enforced a consistent use + of png_size_t across libpng (Cosmin). + Changed the type of png_ptr->rowbytes, PNG_ROWBYTES() and friends + to png_size_t (Cosmin). + Removed png_convert_size() and replaced png_sizeof with sizeof (Cosmin). + Removed some unnecessary type casts (Cosmin). + Changed prototype of png_get_compression_buffer_size() and + png_set_compression_buffer_size() to work with png_size_t instead of + png_uint_32 (Cosmin). + Removed png_memcpy_check() and png_memset_check() (Cosmin). + Fixed a typo (png_byte --> png_bytep) in libpng.3 and libpng.txt (Cosmin). + Clarified that png_zalloc() does not clear the allocated memory, + and png_zalloc() and png_zfree() cannot be PNGAPI (Cosmin). + Renamed png_mem_size_t to png_alloc_size_t, fixed its definition in + pngconf.h, and used it in all memory allocation functions (Cosmin). + Renamed pngintrn.h to pngpriv.h, added a comment at the top of the file + mentioning that the symbols declared in that file are private, and + updated the scripts and the Visual C++ projects accordingly (Cosmin). + Removed circular references between pngconf.h and pngconf.h.in in + scripts/makefile.vc*win32 (Cosmin). + Removing trailing '.' from the warning and error messages (Cosmin). + Added pngdefs.h that is built by makefile or configure, instead of + pngconf.h.in (Glenn). + Detect and fix attempt to write wrong iCCP profile length. + +Version 1.4.0beta12 [October 19, 2006] + Changed "logical" to "bitwise" in the documentation. + Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h + Add a typecast to stifle compiler warning in pngrutil.c + +Version 1.4.0beta13 [November 10, 2006] + Fix potential buffer overflow in sPLT chunk handler. + Fix Makefile.am to not try to link to noexistent files. + +Version 1.4.0beta14 [November 15, 2006] + Check all exported functions for NULL png_ptr. + +Version 1.4.0beta15 [November 17, 2006] + Relocated two misplaced tests for NULL png_ptr. + Built Makefile.in with automake-1.9.6 instead of 1.9.2. + Build configure with autoconf-2.60 instead of 2.59 + Add "install: all" in Makefile.am so "configure; make install" will work. + +Version 1.4.0beta16 [November 17, 2006] + Added a typecast in png_zalloc(). + +Version 1.4.0beta17 [December 4, 2006] + Changed "new_key[79] = '\0';" to "(*new_key)[79] = '\0';" in pngwutil.c + Add "png_bytep" typecast to profile while calculating length in pngwutil.c + +Version 1.4.0beta18 [December 7, 2006] + Added scripts/CMakeLists.txt + +Version 1.4.0beta19 [May 16, 2007] + Revised scripts/CMakeLists.txt + Rebuilt configure and Makefile.in with newer tools. + Added conditional #undef jmpbuf in pngtest.c to undo #define in AIX headers. + Added scripts/makefile.nommx + +Version 1.4.0beta20 [July 9, 2008] + Moved several PNG_HAVE_* macros from pngpriv.h to png.h because applications + calling set_unknown_chunk_location() need them. + Moved several macro definitions from pngpriv.h to pngconf.h + Merge with changes to the 1.2.X branch, as of 1.2.30beta04. + Deleted all use of the MMX assembler code and Intel-licensed optimizations. + Revised makefile.mingw + +Version 1.4.0beta21 [July 21, 2008] + Moved local array "chunkdata" from pngrutil.c to the png_struct, so + it will be freed by png_read_destroy() in case of a read error (Kurt + Christensen). + +Version 1.4.0beta22 [July 21, 2008] + Change "purpose" and "buffer" to png_ptr->chunkdata to avoid memory leaking. + +Version 1.4.0beta23 [July 22, 2008] + Change "chunkdata = NULL" to "png_ptr->chunkdata = NULL" several places in + png_decompress_chunk(). + +Version 1.4.0beta24 [July 25, 2008] + Change all remaining "chunkdata" to "png_ptr->chunkdata" in + png_decompress_chunk(), and remove "chunkdata" from parameter list. + Put a call to png_check_chunk_name() in png_read_chunk_header(). + Revised png_check_chunk_name() to reject a name with a lowercase 3rd byte. + Removed two calls to png_check_chunk_name() occuring later in the process. + Define PNG_NO_ERROR_NUMBERS by default in pngconf.h + +Version 1.4.0beta25 [July 30, 2008] + Added a call to png_check_chunk_name() in pngpread.c + Reverted png_check_chunk_name() to accept a name with a lowercase 3rd byte. + Added png_push_have_buffer() function to pngpread.c + Eliminated PNG_BIG_ENDIAN_SUPPORTED and associated png_get_* macros. + Made inline expansion of png_get_*() optional with PNG_USE_READ_MACROS. + Eliminated all PNG_USELESS_TESTS and PNG_CORRECT_PALETTE_SUPPORTED code. + Synced contrib directory and configure files with libpng-1.2.30beta06. + Eliminated no-longer-used pngdefs.h (but it's still built in the makefiles) + Relocated a misplaced "#endif /* PNG_NO_WRITE_FILTER */" in pngwutil.c + +Version 1.4.0beta26 [August 4, 2008] + Removed png_push_have_buffer() function in pngpread.c. It increased the + compiled library size slightly. + Changed "-Wall" to "-W -Wall" in the CFLAGS in all makefiles (Cosmin Truta) + Declared png_ptr "volatile" in pngread.c and pngwrite.c to avoid warnings. + Updated contrib/visupng/cexcept.h to version 2.0.1 + Added PNG_LITERAL_CHARACTER macros for #, [, and ]. + +Version 1.4.0beta27 [August 5, 2008] + Revised usage of PNG_LITERAL_SHARP in pngerror.c. + Moved newline character from individual png_debug messages into the + png_debug macros. + Allow user to #define their own png_debug, png_debug1, and png_debug2. + +Version 1.4.0beta28 [August 5, 2008] + Revised usage of PNG_LITERAL_SHARP in pngerror.c. + Added PNG_STRING_NEWLINE macro + +Version 1.4.0beta29 [August 9, 2008] + Revised usage of PNG_STRING_NEWLINE to work on non-ISO compilers. + Added PNG_STRING_COPYRIGHT macro. + Added non-ISO versions of png_debug macros. + +Version 1.4.0beta30 [August 14, 2008] + Added premultiplied alpha feature (Volker Wiendl). + +Version 1.4.0beta31 [August 18, 2008] + Moved png_set_premultiply_alpha from pngtrans.c to pngrtran.c + Removed extra crc check at the end of png_handle_cHRM(). Bug introduced + in libpng-1.4.0beta20. + +Version 1.4.0beta32 [August 19, 2008] + Added PNG_WRITE_FLUSH_SUPPORTED block around new png_flush() call. + Revised PNG_NO_STDIO version of png_write_flush() + +Version 1.4.0beta33 [August 20, 2008] + Added png_get|set_chunk_cache_max() to limit the total number of sPLT, + text, and unknown chunks that can be stored. + +Version 1.4.0beta34 [September 6, 2008] + Shortened tIME_string to 29 bytes in pngtest.c + Fixed off-by-one error introduced in png_push_read_zTXt() function in + libpng-1.2.30beta04/pngpread.c (Harald van Dijk) + +Version 1.4.0beta35 [October 6, 2008] + Changed "trans_values" to "trans_color". + Changed so-number from 0 to 14. Some OS do not like 0. + Revised makefile.darwin to fix shared library numbering. + Change png_set_gray_1_2_4_to_8() to png_set_expand_gray_1_2_4_to_8() + in example.c (debian bug report) + +Version 1.4.0beta36 [October 25, 2008] + Sync with tEXt vulnerability fix in libpng-1.2.33rc02. + +Version 1.4.0beta37 [November 13, 2008] + Added png_check_cHRM in png.c and moved checking from pngget.c, pngrutil.c, + and pngwrite.c + +Version 1.4.0beta38 [November 22, 2008] + Added check for zero-area RGB cHRM triangle in png_check_cHRM() and + png_check_cHRM_fixed(). + +Version 1.4.0beta39 [November 23, 2008] + Revised png_warning() to write its message on standard output by default + when warning_fn is NULL. + +Version 1.4.0beta40 [November 24, 2008] + Eliminated png_check_cHRM(). Instead, always use png_check_cHRM_fixed(). + In png_check_cHRM_fixed(), ensure white_y is > 0, and removed redundant + check for all-zero coordinates that is detected by the triangle check. + +Version 1.4.0beta41 [November 26, 2008] + Fixed string vs pointer-to-string error in png_check_keyword(). + Rearranged test expressions in png_check_cHRM_fixed() to avoid internal + overflows. + Added PNG_NO_CHECK_cHRM conditional. + +Version 1.4.0beta42, 43 [December 1, 2008] + Merge png_debug with version 1.2.34beta04. + +Version 1.4.0beta44 [December 6, 2008] + Removed redundant check for key==NULL before calling png_check_keyword() + to ensure that new_key gets initialized and removed extra warning + (Merge with version 1.2.34beta05 -- Arvan Pritchard). + +Version 1.4.0beta45 [December 9, 2008] + In png_write_png(), respect the placement of the filler bytes in an earlier + call to png_set_filler() (Jim Barry). + +Version 1.4.0beta46 [December 10, 2008] + Undid previous change and added PNG_TRANSFORM_STRIP_FILLER_BEFORE and + PNG_TRANSFORM_STRIP_FILLER_AFTER conditionals and deprecated + PNG_TRANSFORM_STRIP_FILLER (Jim Barry). + +Version 1.4.0beta47 [December 15, 2008] + Support for dithering was disabled by default, because it has never + been well tested and doesn't work very well. The code has not + been removed, however, and can be enabled by building libpng with + PNG_READ_DITHER_SUPPORTED defined. + +Version 1.4.0beta48 [February 14, 2009] + Added new exported function png_calloc(). + Combined several instances of png_malloc(); png_memset() into png_calloc(). + Removed prototype for png_freeptr() that was added in libpng-1.4.0beta24 + but was never defined. + +Version 1.4.0beta49 [February 28, 2009] + Added png_fileno() macro to pngconf.h, used in pngwio.c + Corrected order of #ifdef's in png_debug definition in png.h + Fixed bug introduced in libpng-1.4.0beta48 with the memset arguments + for pcal_params. + Fixed order of #ifdef directives in the png_debug defines in png.h + (bug introduced in libpng-1.2.34/1.4.0beta29). + Revised comments in png_set_read_fn() and png_set_write_fn(). + +Version 1.4.0beta50 [March 18, 2009] + Use png_calloc() instead of png_malloc() to allocate big_row_buf when + reading an interlaced file, to avoid a possible UMR. + Undid revision of PNG_NO_STDIO version of png_write_flush(). Users + having trouble with fflush() can build with PNG_NO_WRITE_FLUSH defined + or supply their own flush_fn() replacement. + Revised libpng*.txt and png.h documentation about use of png_write_flush() + and png_set_write_fn(). + Removed fflush() from pngtest.c. + Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h + +Version 1.4.0beta51 [March 21, 2009] + Removed new png_fileno() macro from pngconf.h . + +Version 1.4.0beta52 [March 27, 2009] + Relocated png_do_chop() ahead of building gamma tables in pngrtran.c + This avoids building 16-bit gamma tables unnecessarily. + Removed fflush() from pngtest.c. + Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h + Added a section on differences between 1.0.x and 1.2.x to libpng.3/libpng.txt + +Version 1.4.0beta53 [April 1, 2009] + Removed some remaining MMX macros from pngpriv.h + Fixed potential memory leak of "new_name" in png_write_iCCP() (Ralph Giles) + +Version 1.4.0beta54 [April 13, 2009] + Added "ifndef PNG_SKIP_SETJMP_CHECK" block in pngconf.h to allow + application code writers to bypass the check for multiple inclusion + of setjmp.h when they know that it is safe to ignore the situation. + Eliminated internal use of setjmp() in pngread.c and pngwrite.c + Reordered ancillary chunks in pngtest.png to be the same as what + pngtest now produces, and made some cosmetic changes to pngtest output. + Eliminated deprecated png_read_init_3() and png_write_init_3() functions. + +Version 1.4.0beta55 [April 15, 2009] + Simplified error handling in pngread.c and pngwrite.c by putting + the new png_read_cleanup() and png_write_cleanup() functions inline. + +Version 1.4.0beta56 [April 25, 2009] + Renamed "user_chunk_data" to "my_user_chunk_data" in pngtest.c to suppress + "shadowed declaration" warning from gcc-4.3.3. + Renamed "gamma" to "png_gamma" in pngset.c to avoid "shadowed declaration" + warning about a global "gamma" variable in math.h on some platforms. + +Version 1.4.0beta57 [May 2, 2009] + Removed prototype for png_freeptr() that was added in libpng-1.4.0beta24 + but was never defined (again). + Rebuilt configure scripts with autoconf-2.63 instead of 2.62 + Removed pngprefs.h and MMX from makefiles + +Version 1.4.0beta58 [May 14, 2009] + Changed pngw32.def to pngwin.def in makefile.mingw (typo was introduced + in beta57). + Clarified usage of sig_bit versus sig_bit_p in example.c (Vincent Torri) + +Version 1.4.0beta59 [May 15, 2009] + Reformated sources in libpng style (3-space intentation, comment format) + Fixed typo in libpng docs (PNG_FILTER_AVE should be PNG_FILTER_AVG) + Added sections about the git repository and our coding style to the + documentation + Relocated misplaced #endif in pngwrite.c, sCAL chunk handler. + +Version 1.4.0beta60 [May 19, 2009] + Conditionally compile png_read_finish_row() which is not used by + progressive readers. + Added contrib/pngminim/preader to demonstrate building minimal progressive + decoder, based on contrib/gregbook with embedded libpng and zlib. + +Version 1.4.0beta61 [May 20, 2009] + In contrib/pngminim/*, renamed "makefile.std" to "makefile", since there + is only one makefile in those directories, and revised the README files + accordingly. + More reformatting of comments, mostly to capitalize sentences. + +Version 1.4.0beta62 [June 2, 2009] + Added "#define PNG_NO_WRITE_SWAP" to contrib/pngminim/encoder/pngusr.h + and "define PNG_NO_READ_SWAP" to decoder/pngusr.h and preader/pngusr.h + Reformatted several remaining "else statement" into two lines. + Added a section to the libpng documentation about using png_get_io_ptr() + in configure scripts to detect the presence of libpng. + +Version 1.4.0beta63 [June 15, 2009] + Revised libpng*.txt and libpng.3 to mention calling png_set_IHDR() + multiple times and to specify the sample order in the tRNS chunk, + because the ISO PNG specification has a typo in the tRNS table. + Changed several PNG_UNKNOWN_CHUNK_SUPPORTED to + PNG_HANDLE_AS_UNKNOWN_SUPPORTED, to make the png_set_keep mechanism + available for ignoring known chunks even when not saving unknown chunks. + Adopted preference for consistent use of "#ifdef" and "#ifndef" versus + "#if defined()" and "if !defined()" where possible. + +Version 1.4.0beta64 [June 24, 2009] + Eliminated PNG_LEGACY_SUPPORTED code. + Moved the various unknown chunk macro definitions outside of the + PNG_READ|WRITE_ANCILLARY_CHUNK_SUPPORTED blocks. + +Version 1.4.0beta65 [June 26, 2009] + Added a reference to the libpng license in each file. + +Version 1.4.0beta66 [June 27, 2009] + Refer to the libpng license instead of the libpng license in each file. + +Version 1.4.0beta67 [July 6, 2009] + Relocated INVERT_ALPHA within png_read_png() and png_write_png(). + Added high-level API transform PNG_TRANSFORM_GRAY_TO_RGB. + Added an "xcode" project to the projects directory (Alam Arias). + +Version 1.4.0beta68 [July 19, 2009] + Avoid some tests in filter selection in pngwutil.c + +Version 1.4.0beta69 [July 25, 2009] + Simplified the new filter-selection test. This runs faster in the + common "PNG_ALL_FILTERS" and PNG_FILTER_NONE cases. + Removed extraneous declaration from the new call to png_read_gray_to_rgb() + (bug introduced in libpng-1.4.0beta67). + Fixed up xcode project (Alam Arias) + Added a prototype for png_64bit_product() in png.c + +Version 1.4.0beta70 [July 27, 2009] + Avoid a possible NULL dereference in debug build, in png_set_text_2(). + (bug introduced in libpng-0.95, discovered by Evan Rouault) + +Version 1.4.0beta71 [July 29, 2009] + Rebuilt configure scripts with autoconf-2.64. + +Version 1.4.0beta72 [August 1, 2009] + Replaced *.tar.lzma with *.tar.xz in distribution. Get the xz codec + from . + +Version 1.4.0beta73 [August 1, 2009] + Reject attempt to write iCCP chunk with negative embedded profile length + (JD Chen) + +Version 1.4.0beta74 [August 8, 2009] + Changed png_ptr and info_ptr member "trans" to "trans_alpha". + +Version 1.4.0beta75 [August 21, 2009] + Removed an extra png_debug() recently added to png_write_find_filter(). + Fixed incorrect #ifdef in pngset.c regarding unknown chunk support. + +Version 1.4.0beta76 [August 22, 2009] + Moved an incorrectly located test in png_read_row() in pngread.c + +Version 1.4.0beta77 [August 27, 2009] + Removed lpXYZ.tar.bz2 (with CRLF), KNOWNBUG, libpng-x.y.z-KNOWNBUG.txt, + and the "noconfig" files from the distribution. + Moved CMakeLists.txt from scripts into the main libpng directory. + Various bugfixes and improvements to CMakeLists.txt (Philip Lowman) + +Version 1.4.0beta78 [August 31, 2009] + Converted all PNG_NO_* tests to PNG_*_SUPPORTED everywhere except pngconf.h + Eliminated PNG_NO_FREE_ME and PNG_FREE_ME_SUPPORTED macros. + Use png_malloc plus a loop instead of png_calloc() to initialize + row_pointers in png_read_png(). + +Version 1.4.0beta79 [September 1, 2009] + Eliminated PNG_GLOBAL_ARRAYS and PNG_LOCAL_ARRAYS; always use local arrays. + Eliminated PNG_CALLOC_SUPPORTED macro and always provide png_calloc(). + +Version 1.4.0beta80 [September 17, 2009] + Removed scripts/libpng.icc + Changed typecast of filler from png_byte to png_uint_16 in png_set_filler(). + (Dennis Gustafsson) + Fixed typo introduced in beta78 in pngtest.c ("#if def " should be "#ifdef ") + +Version 1.4.0beta81 [September 23, 2009] + Eliminated unused PNG_FLAG_FREE_* defines from pngpriv.h + Expanded TAB characters in pngrtran.c + Removed PNG_CONST from all "PNG_CONST PNG_CHNK" declarations to avoid + compiler complaints about doubly declaring things "const". + Changed all "#if [!]defined(X)" to "if[n]def X" where possible. + Eliminated unused png_ptr->row_buf_size + +Version 1.4.0beta82 [September 25, 2009] + Moved redundant IHDR checking into new png_check_IHDR() in png.c + and report all errors found in the IHDR data. + Eliminated useless call to png_check_cHRM() from pngset.c + +Version 1.4.0beta83 [September 25, 2009] + Revised png_check_IHDR() to eliminate bogus complaint about filter_type. + +Version 1.4.0beta84 [September 30, 2009] + Fixed some inconsistent indentation in pngconf.h + Revised png_check_IHDR() to add a test for width variable less than 32-bit. + +Version 1.4.0beta85 [October 1, 2009] + Revised png_check_IHDR() again, to check info_ptr members instead of + the contents of the returned parameters. + +Version 1.4.0beta86 [October 9, 2009] + Updated the "xcode" project (Alam Arias). + Eliminated a shadowed declaration of "pp" in png_handle_sPLT(). + +Version 1.4.0rc01 [October 19, 2009] + Trivial cosmetic changes. + +Version 1.4.0beta87 [October 30, 2009] + Moved version 1.4.0 back into beta. + +Version 1.4.0beta88 [October 30, 2009] + Revised libpng*.txt section about differences between 1.2.x and 1.4.0 + because most of the new features have now been ported back to 1.2.41 + +Version 1.4.0beta89 [November 1, 2009] + More bugfixes and improvements to CMakeLists.txt (Philip Lowman) + Removed a harmless extra png_set_invert_alpha() from pngwrite.c + Apply png_user_chunk_cache_max within png_decompress_chunk(). + Merged libpng-1.2.41.txt with libpng-1.4.0.txt where appropriate. + +Version 1.4.0beta90 [November 2, 2009] + Removed all remaining WIN32_WCE #ifdefs except those involving the + time.h "tm" structure + +Version 1.4.0beta91 [November 3, 2009] + Updated scripts/pngw32.def and projects/wince/png32ce.def + Copied projects/wince/png32ce.def to the scripts directory. + Added scripts/makefile.wce + Patched ltmain.sh for wince support. + Added PNG_CONVERT_tIME_SUPPORTED macro. + +Version 1.4.0beta92 [November 4, 2009] + Make inclusion of time.h in pngconf.h depend on PNG_CONVERT_tIME_SUPPORTED + Make #define PNG_CONVERT_tIME_SUPPORTED depend on PNG_WRITE_tIME_SUPPORTED + Revised libpng*.txt to describe differences from 1.2.40 to 1.4.0 (instead + of differences from 1.2.41 to 1.4.0) + +Version 1.4.0beta93 [November 7, 2009] + Added PNG_DEPSTRUCT, PNG_DEPRECATED, PNG_USE_RESULT, PNG_NORETURN, and + PNG_ALLOCATED macros to detect deprecated direct access to the + png_struct or info_struct members and other deprecated usage in + applications (John Bowler). + Updated scripts/makefile* to add "-DPNG_CONFIGURE_LIBPNG" to CFLAGS, + to prevent warnings about direct access to png structs by libpng + functions while building libpng. They need to be tested, especially + those using compilers other than gcc. + Updated projects/visualc6 and visualc71 with "/d PNG_CONFIGURE_LIBPNG". + They should work but still need to be updated to remove + references to pnggccrd.c or pngvcrd.c and ASM building. + Added README.txt to the beos, cbuilder5, netware, and xcode projects warning + that they need to be updated, to remove references to pnggccrd.c and + pngvcrd.c and to depend on pngpriv.h + Removed three direct references to read_info_ptr members in pngtest.c + that were detected by the new PNG_DEPSTRUCT macro. + Moved the png_debug macro definitions and the png_read_destroy(), + png_write_destroy() and png_far_to_near() prototypes from png.h + to pngpriv.h (John Bowler) + Moved the synopsis lines for png_read_destroy(), png_write_destroy() + png_debug(), png_debug1(), and png_debug2() from libpng.3 to libpngpf.3. + +Version 1.4.0beta94 [November 9, 2009] + Removed the obsolete, unused pnggccrd.c and pngvcrd.c files. + Updated CMakeLists.txt to add "-DPNG_CONFIGURE_LIBPNG" to the definitions. + Removed dependency of pngtest.o on pngpriv.h in the makefiles. + Only #define PNG_DEPSTRUCT, etc. in pngconf.h if not already defined. + +Version 1.4.0beta95 [November 10, 2009] + Changed png_check_sig() to !png_sig_cmp() in contrib programs. + Added -DPNG_CONFIGURE_LIBPNG to contrib/pngminm/*/makefile + Changed png_check_sig() to !png_sig_cmp() in contrib programs. + Corrected the png_get_IHDR() call in contrib/gregbook/readpng2.c + Changed pngminim/*/gather.sh to stop trying to remove pnggccrd.c and pngvcrd.c + Added dependency on pngpriv.h in contrib/pngminim/*/makefile + +Version 1.4.0beta96 [November 12, 2009] + Renamed scripts/makefile.wce to scripts/makefile.cegcc + Revised Makefile.am to use libpng.sys while building libpng.so + so that only PNG_EXPORT functions are exported. + Removed the deprecated png_check_sig() function/macro. + Removed recently removed function names from scripts/*.def + Revised pngtest.png to put chunks in the same order written by pngtest + (evidently the same change made in libpng-1.0beta54 was lost). + Added PNG_PRIVATE macro definition in pngconf.h for possible future use. + +Version 1.4.0beta97 [November 13, 2009] + Restored pngtest.png to the libpng-1.4.0beta7 version. + Removed projects/beos and netware.txt; no one seems to be supporting them. + Revised Makefile.in + +Version 1.4.0beta98 [November 13, 2009] + Added the "xcode" project to zip distributions, + Fixed a typo in scripts/pngwin.def introduced in beta97. + +Version 1.4.0beta99 [November 14, 2009] + Moved libpng-config.in and libpng.pc-configure.in out of the scripts + directory, to libpng-config.in and libpng-pc.in, respectively, and + modified Makefile.am and configure.ac accordingly. Now "configure" + needs nothing from the "scripts" directory. + Avoid redefining PNG_CONST in pngconf.h + +Version 1.4.0beta100 [November 14, 2009] + Removed ASM builds from projects/visualc6 and projects/visualc71 + Removed scripts/makefile.nommx and makefile.vcawin32 + Revised CMakeLists.txt to account for new location of libpng-config.in + and libpng-pc.in + Updated INSTALL to reflect removal and relocation of files. + +Version 1.4.0beta101 [November 14, 2009] + Restored the binary files (*.jpg, *.png, some project files) that were + accidentally deleted from the zip and 7z distributions when the xcode + project was added. + +Version 1.4.0beta102 [November 18, 2009] + Added libpng-config.in and libpng-pc.in to the zip and 7z distributions. + Fixed a typo in projects/visualc6/pngtest.dsp, introduced in beta100. + Moved descriptions of makefiles and other scripts out of INSTALL into + scripts/README.txt + Updated the copyright year in scripts/pngwin.rc from 2006 to 2009. + +Version 1.4.0beta103 [November 21, 2009] + Removed obsolete comments about ASM from projects/visualc71/README_zlib.txt + Align row_buf on 16-byte boundary in memory. + Restored the PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED guard around the call + to png_flush() after png_write_IEND(). See 1.4.0beta32, 1.4.0beta50 + changes above and 1.2.30, 1.2.30rc01 and rc03 in 1.2.41 CHANGES. Someone + needs this feature. + Make the 'png_jmpbuf' macro expand to a call that records the correct + longjmp function as well as returning a pointer to the setjmp + jmp_buf buffer, and marked direct access to jmpbuf 'deprecated'. + (John Bowler) + +Version 1.4.0beta104 [November 22, 2009] + Removed png_longjmp_ptr from scripts/*.def and libpng.3 + Rebuilt configure scripts with autoconf-2.65 + +Version 1.4.0beta105 [November 25, 2009] + Use fast integer PNG_DIVIDE_BY_255() or PNG_DIVIDE_BY_65535() + to accomplish alpha premultiplication when + PNG_READ_COMPOSITE_NODIV_SUPPORTED is defined. + Changed "/255" to "/255.0" in background calculations to make it clear + that the 255 is used as a double. + +Version 1.4.0beta106 [November 27, 2009] + Removed premultiplied alpha feature. + +Version 1.4.0beta107 [December 4, 2009] + Updated README + Added "#define PNG_NO_PEDANTIC_WARNINGS" in the libpng source files. + Removed "-DPNG_CONFIGURE_LIBPNG" from the makefiles and projects. + Revised scripts/makefile.netbsd, makefile.openbsd, and makefile.sco + to put png.h and pngconf.h in $prefix/include, like the other scripts, + instead of in $prefix/include/libpng. Also revised makefile.sco + to put them in $prefix/include/libpng15 instead of in + $prefix/include/libpng/libpng15. + +Version 1.4.0beta108 [December 11, 2009] + Removed leftover "-DPNG_CONFIGURE_LIBPNG" from contrib/pngminim/*/makefile + Relocated png_do_chop() to its original position in pngrtran.c; the + change in version 1.2.41beta08 caused transparency to be handled wrong + in some 16-bit datastreams (Yusaku Sugai). + +Version 1.4.0beta109 [December 13, 2009] + Added "bit_depth" parameter to the private png_build_gamma_table() function. + Pass bit_depth=8 to png_build_gamma_table() when bit_depth is 16 but the + PNG_16_TO_8 transform has been set, to avoid unnecessary build of 16-bit + tables. + +Version 1.4.0rc02 [December 20, 2009] + Declared png_cleanup_needed "volatile" in pngread.c and pngwrite.c + +Version 1.4.0rc03 [December 22, 2009] + Renamed libpng-pc.in back to libpng.pc.in and revised CMakeLists.txt + (revising the change in 1.4.0beta99) + +Version 1.4.0rc04 [December 25, 2009] + Swapped PNG_UNKNOWN_CHUNKS_SUPPORTED and PNG_HANDLE_AS_UNKNOWN_SUPPORTED + in pngset.c to be consistent with other changes in version 1.2.38. + +Version 1.4.0rc05 [December 25, 2009] + Changed "libpng-pc.in" to "libpng.pc.in" in configure.ac, configure, and + Makefile.in to be consistent with changes in libpng-1.4.0rc03 + +Version 1.4.0rc06 [December 29, 2009] + Reverted the gamma_table changes from libpng-1.4.0beta109. + Fixed some indentation errors. + +Version 1.4.0rc07 [January 1, 2010] + Revised libpng*.txt and libpng.3 about 1.2.x->1.4.x differences. + Use png_calloc() instead of png_malloc(); png_memset() in pngrutil.c + Update copyright year to 2010. + +Version 1.4.0rc08 [January 2, 2010] + Avoid deprecated references to png_ptr-io_ptr and png_ptr->error_ptr + in pngtest.c + +Version 1.4.0 [January 3, 2010] + No changes. + +Version 1.4.1beta01 [January 8, 2010] + Updated CMakeLists.txt for consistent indentation and to avoid an + unclosed if-statement warning (Philip Lowman). + Revised Makefile.am and Makefile.in to remove references to Y2KINFO, + KNOWNBUG, and libpng.la (Robert Schwebel). + Revised the makefiles to install the same files and symbolic + links as configure, except for libpng.la and libpng14.la. + Make png_set|get_compression_buffer_size() available even when + PNG_WRITE_SUPPORTED is not enabled. + Revised Makefile.am and Makefile.in to simplify their maintenance. + Revised scripts/makefile.linux to install a link to libpng14.so.14.1 + +Version 1.4.1beta02 [January 9, 2010] + Revised the rest of the makefiles to install a link to libpng14.so.14.1 + +Version 1.4.1beta03 [January 10, 2010] + Removed png_set_premultiply_alpha() from scripts/*.def + +Version 1.4.1rc01 [January 16, 2010] + No changes. + +Version 1.4.1beta04 [January 23, 2010] + Revised png_decompress_chunk() to improve speed and memory usage when + decoding large chunks. + Added png_set|get_chunk_malloc_max() functions. + +Version 1.4.1beta05 [January 26, 2010] + Relocated "int k" declaration in pngtest.c to minimize its scope. + +Version 1.4.1beta06 [January 28, 2010] + Revised png_decompress_chunk() to use a two-pass method suggested by + John Bowler. + +Version 1.4.1beta07 [February 6, 2010] + Folded some long lines in the source files. + Added defineable PNG_USER_CHUNK_CACHE_MAX, PNG_USER_CHUNK_MALLOC_MAX, + and a PNG_USER_LIMITS_SUPPORTED flag. + Eliminated use of png_ptr->irowbytes and reused the slot in png_ptr as + png_ptr->png_user_chunk_malloc_max. + Revised png_push_save_buffer() to do fewer but larger png_malloc() calls. + +Version 1.4.1beta08 [February 6, 2010] + Minor cleanup and updating of dates and copyright year. + +Version 1.5.0beta01 [February 7, 2010] + Moved declaration of png_struct into private pngstruct.h and png_info + into pnginfo.h + +Version 1.4.1beta09 and 1.5.0beta02 [February 7, 2010] + Reverted to original png_push_save_buffer() code. + +Version 1.4.1beta10 and 1.5.0beta03 [February 8, 2010] + Return allocated "old_buffer" in png_push_save_buffer() before + calling png_error(), to avoid a potential memory leak. + Updated configure script to use SO number 15. + +Version 1.5.0beta04 [February 9, 2010] + Removed malformed "incomplete struct declaration" of png_info from png.h + +Version 1.5.0beta05 [February 12, 2010] + Removed PNG_DEPSTRUCT markup in pngstruct.h and pnginfo.h, and undid the + linewrapping that it entailed. + Revised comments in pngstruct.h and pnginfo.h and added pointers to + the libpng license. + Changed PNG_INTERNAL to PNG_EXPOSE_INTERNAL_STRUCTURES + Removed the cbuilder5 project, which has not been updated to 1.4.0. + +Version 1.4.1beta12 and 1.5.0beta06 [February 14, 2010] + Fixed type declaration of png_get_chunk_malloc_max() in pngget.c (Daisuke + Nishikawa) + +Version 1.5.0beta07 [omitted] + +Version 1.5.0beta08 [February 19, 2010] + Changed #ifdef PNG_NO_STDIO_SUPPORTED to #ifdef PNG_NO_CONSOLE_IO_SUPPORTED + wherever png_snprintf() is used to construct error and warning messages. + Noted in scripts/makefile.mingw that it expects to be run under MSYS. + Removed obsolete unused MMX-querying support from contrib/gregbook + Added exported png_longjmp() function. + Removed the AIX redefinition of jmpbuf in png.h + Added -D_ALLSOURCE in configure.ac, makefile.aix, and CMakeLists.txt + when building on AIX. + +Version 1.5.0beta09 [February 19, 2010] + Removed -D_ALLSOURCE from configure.ac, makefile.aix, and CMakeLists.txt. + Changed the name of png_ptr->jmpbuf to png_ptr->png_jmpbuf in pngstruct.h + +Version 1.5.0beta10 [February 25, 2010] + Removed unused gzio.c from contrib/pngminim gather and makefile scripts + Removed replacement error handlers from contrib/gregbook. Because of + the new png_longjmp() function they are no longer needed. + +Version 1.5.0beta11 [March 6, 2010] + Removed checking for already-included setjmp.h from pngconf.h + Fixed inconsistent indentations and made numerous cosmetic changes. + Revised the "SEE ALSO" style of libpng.3, libpngpf.3, and png.5 + +Version 1.5.0beta12 [March 9, 2010] + Moved "#include png.h" inside pngpriv.h and removed "#include png.h" from + the source files, along with "#define PNG_EXPOSE_INTERNAL_STRUCTURES" + and "#define PNG_NO_PEDANTIC_WARNINGS" (John Bowler). + Created new pngdebug.h and moved debug definitions there. + +Version 1.5.0beta13 [March 10, 2010] + Protect pngstruct.h, pnginfo.h, and pngdebug.h from being included twice. + Revise the "#ifdef" blocks in png_inflate() so it will compile when neither + PNG_USER_CHUNK_MALLOC_MAX nor PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED + is defined. + Removed unused png_measure_compressed_chunk() from pngpriv.h and libpngpf.3 + Moved the 'config.h' support from pngconf.h to pngpriv.h + Removed PNGAPI from the png_longjmp_ptr typedef. + Eliminated dependence of pngtest.c on the private pngdebug.h file. + Make all png_debug macros into *unterminated* statements or + expressions (i.e. a trailing ';' must always be added) and correct + the format statements in various png_debug messages. + +Version 1.5.0beta14 [March 14, 2010] + Removed direct access to png_ptr->io_ptr from the Windows code in pngtest.c + Revised Makefile.am to account for recent additions and replacements. + Corrected CE and OS/2 DEF files (scripts/png*def) for symbols removed and + added ordinal numbers to the Windows DEF file and corrected the duplicated + ordinal numbers on CE symbols that are commented out. + Added back in export symbols that can be present in the Windows build but + are disabled by default. + PNG_EXPORT changed to include an 'ordinal' field for DEF file generation. + PNG_CALLBACK added to make callback definitions uniform. PNGAPI split + into PNGCAPI (base C form), PNGAPI (exports) and PNGCBAPI (callbacks), + and appropriate changes made to all files. Cygwin builds re-hinged to + allow procedure call standard changes and to remove the need for the DEF + file (fixes build on Cygwin). + Enabled 'attribute' warnings that are relevant to library APIs and callbacks. + Changed rules for generation of the various symbol files and added a new + rule for a DEF file (which is also added to the distribution). + Updated the symbol file generation to stop it adding spurious spaces + to EOL (coming from preprocessor macro expansion). Added a facility + to join tokens in the output and rewrite *.dfn to use this. + Eliminated scripts/*.def in favor of libpng.def; updated projects/visualc71 + and removed scripts/makefile.cygwin. + Made PNG_BUILD_DLL safe: it can be set whenever a DLL is being built. + Removed the include of sys/types.h - apparently unnecessary now on the + platforms on which it happened (all but Mac OS and RISC OS). + Moved the Mac OS test into pngpriv.h (the only place it is used.) + +Version 1.5.0beta15 [March 17, 2010] + Added symbols.chk target to Makefile.am to validate the symbols in png.h + against the new DEF file scripts/symbols.def. + Changed the default DEF file back to pngwin.def. + Removed makefile.mingw. + Eliminated PNG_NO_EXTERN and PNG_ALL_EXTERN + +Version 1.5.0beta16 [April 1, 2010] + Make png_text_struct independent of PNG_iTXt_SUPPORTED, so that + fields are initialized in all configurations. The READ/WRITE + macros (PNG_(READ|WRITE)_iTXt_SUPPORTED) still function as + before to disable code to actually read or write iTXt chunks + and iTXt_SUPPORTED can be used to detect presence of either + read or write support (but it is probably better to check for + the one actually required - read or write.) + Combined multiple png_warning() calls for a single error. + Restored the macro definition of png_check_sig(). + +Version 1.5.0beta17 [April 17, 2010] + Added some "(long)" typecasts to printf calls in png_handle_cHRM(). + Documented the fact that png_set_dither() was disabled since libpng-1.4.0. + Reenabled png_set_dither() but renamed it to png_set_quantize() to reflect + more accurately what it actually does. At the same time, renamed + the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros to + PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS. + Added some "(long)" typecasts to printf calls in png_handle_cHRM(). + Freeze build-time only configuration in the build. + In all prior versions of libpng most configuration options + controlled by compiler #defines had to be repeated by the + application code that used libpng. This patch changes this + so that compilation options that can only be changed at build + time are frozen in the build. Options that are compiler + dependent (and those that are system dependent) are evaluated + each time - pngconf.h holds these. Options that can be changed + per-file in the application are in png.h. Frozen options are + in the new installed header file pnglibconf.h (John Bowler) + Removed the xcode project because it has not been updated to work + with libpng-1.5.0. + Removed the ability to include optional pngusr.h + +Version 1.5.0beta18 [April 17, 2010] + Restored the ability to include optional pngusr.h + Moved replacements for png_error() and png_warning() from the + contrib/pngminim project to pngerror.c, for use when warnings or + errors are disabled via PNG_NO_WARN or PNG_NO_ERROR_TEXT, to avoid + storing unneeded error/warning text. + Updated contrib/pngminim project to work with the new pnglibconf.h + Added some PNG_NO_* defines to contrib/pngminim/*/pngusr.h to save space. + +Version 1.5.0beta19 [April 24, 2010] + Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the functions + to read and write ints to be disabled independently of PNG_USE_READ_MACROS, + which allows libpng to be built with the functions even though the default + is to use the macros - this allows applications to choose at app build + time whether or not to use macros (previously impossible because the + functions weren't in the default build.) + Changed Windows calling convention back to __cdecl for API functions. + For Windows/x86 platforms only: + __stdcall is no longer needed for Visual Basic, so libpng-1.5.0 uses + __cdecl throughout (both API functions and callbacks) on Windows/x86 + platforms. + Replaced visualc6 and visualc71 projects with new vstudio project + Relaxed the overly-restrictive permissions of some files. + +Version 1.5.0beta20 [April 24, 2010] + Relaxed more overly-restrictive permissions of some files. + +Version 1.5.0beta21 [April 27, 2010] + Removed some unwanted binary bytes and changed CRLF to NEWLINE in the new + vstudio project files, and some trivial editing of some files in the + scripts directory. + Set PNG_NO_READ_BGR, PNG_NO_IO_STATE, and PNG_NO_TIME_RFC1123 in + contrib/pngminim/decoder/pngusr.h to make a smaller decoder application. + +Version 1.5.0beta22 [April 28, 2010] + Fixed dependencies of GET_INT_32 - it does not require READ_INT_FUNCTIONS + because it has a macro equivalent. + Improved the options.awk script; added an "everything off" option. + Revised contrib/pngminim to use the "everything off" option in pngusr.dfa. + +Version 1.5.0beta23 [April 29, 2010] + Corrected PNG_REMOVED macro to take five arguments. + The macro was documented with two arguments (name,ordinal), however + the symbol checking .dfn files assumed five arguments. The five + argument form seems more useful so it is changed to that. + Corrected PNG_UNKNOWN_CHUNKS_SUPPORTED to PNG_HANDLE_AS_UNKNOWN_SUPPORTED + in gregbook/readpng2.c + Corrected protection of png_get_user_transform_ptr. The API declaration in + png.h is removed if both READ and WRITE USER_TRANSFORM are turned off + but was left defined in pngtrans.c + Added logunsupported=1 to cause pnglibconf.h to document disabled options. + This makes the installed pnglibconf.h more readable but causes no + other change. The intention is that users of libpng will find it + easier to understand if an API they need is missing. + Include png_reset_zstream() in png.c only when PNG_READ_SUPPORTED is defined. + Removed dummy_inflate.c from contrib/pngminim/encoder + Removed contrib/pngminim/*/gather.sh; gathering is now done in the makefile. + +Version 1.5.0beta24 [May 7, 2010] + Use bitwise "&" instead of arithmetic mod in pngrutil.c calculation of the + offset of the png_ptr->rowbuf pointer into png_ptr->big_row_buf. + Added more blank lines for readability. + +Version 1.5.0beta25 [June 18, 2010] + In pngpread.c: png_push_have_row() add check for new_row > height + Removed the now-redundant check for out-of-bounds new_row from example.c + +Version 1.5.0beta26 [June 18, 2010] + In pngpread.c: png_push_process_row() add check for too many rows. + +Version 1.5.0beta27 [June 18, 2010] + Removed the check added in beta25 as it is now redundant. + +Version 1.5.0beta28 [June 20, 2010] + Rewrote png_process_IDAT_data to consistently treat extra data as warnings + and handle end conditions more cleanly. + Removed the new (beta26) check in png_push_process_row(). + +Version 1.5.0beta29 [June 21, 2010] + Revised scripts/options.awk to work on Sunos (but still doesn't work) + Added comment to options.awk and contrib/pngminim/*/makefile to try nawk. + +Version 1.5.0beta30 [June 22, 2010] + Stop memory leak when reading a malformed sCAL chunk. + +Version 1.5.0beta31 [June 26, 2010] + Revised pngpread.c patch of beta28 to avoid an endless loop. + Removed some trailing blanks. + +Version 1.5.0beta32 [June 26, 2010] + Removed leftover scripts/options.patch and scripts/options.rej + +Version 1.5.0beta33 [July 6, 3010] + Made FIXED and FLOATING options consistent in the APIs they enable and + disable. Corrected scripts/options.awk to handle both command line + options and options specified in the .dfa files. + Changed char *msg to PNG_CONST char *msg in pngrutil.c + Make png_set_sRGB_gAMA_and_cHRM set values using either the fixed or + floating point APIs, but not both. + Reversed patch to remove error handler when the jmp_buf is stored in the + main program structure, not the png_struct. + The error handler is needed because the default handler in libpng will + always use the jmp_buf in the library control structure; this is never + set. The gregbook code is a useful example because, even though it + uses setjmp/longjmp, it shows how error handling can be implemented + using control mechanisms not directly supported by libpng. The + technique will work correctly with mechanisms such as Microsoft + Structure Exceptions or C++ exceptions (compiler willing - note that gcc + does not by default support interworking of C and C++ error handling.) + Reverted changes to call png_longjmp in contrib/gregbook where it is not + appropriate. If mainprog->jmpbuf is used by setjmp, then png_longjmp + cannot be used. + Changed "extern PNG_EXPORT" to "PNG_EXPORT" in png.h (Jan Nijtmans) + Changed "extern" to "PNG_EXTERN" in pngpriv.h (except for the 'extern "C" {') + +Version 1.5.0beta34 [July 12, 2010] + Put #ifndef PNG_EXTERN, #endif around the define PNG_EXTERN in pngpriv.h + +Version 1.5.0beta35 [July 24, 2010] + Removed some newly-added TAB characters. + Added -DNO_PNG_SNPRINTF to CFLAGS in scripts/makefile.dj2 + Moved the definition of png_snprintf() outside of the enclosing + #ifdef blocks in pngconf.h + +Version 1.5.0beta36 [July 29, 2010] + Patches by John Bowler: + Fixed point APIs are now supported throughout (no missing APIs). + Internal fixed point arithmetic support exists for all internal floating + point operations. + sCAL validates the floating point strings it is passed. + Safe, albeit rudimentary, Watcom support is provided by PNG_API_RULE==2 + Two new APIs exist to get the number of passes without turning on the + PNG_INTERLACE transform and to get the number of rows in the current + pass. + A new test program, pngvalid.c, validates the gamma code. + Errors in the 16 bit gamma correction (overflows) have been corrected. + cHRM chunk testing is done consistently (previously the floating point + API bypassed it, because the test really didn't work on FP, now the test + is performed on the actual values to be stored in the PNG file so it + works in the FP case too.) + Most floating point APIs now simply call the fixed point APIs after + converting the values to the fixed point form used in the PNG file. + The standard headers no longer include zlib.h, which is currently only + required for pngstruct.h and can therefore be internal. + Revised png_get_int_32 to undo the PNG two's complement representation of + negative numbers. + +Version 1.5.0beta37 [July 30, 2010] + Added a typecast in png_get_int_32() in png.h and pngrutil.h to avoid + a compiler warning. + Replaced oFFs 0,0 with oFFs -10,20 in pngtest.png + +Version 1.5.0beta38 [July 31, 2010] + Implemented remaining "_fixed" functions. + Corrected a number of recently introduced warnings mostly resulting from + safe but uncast assignments to shorter integers. Also added a zlib + VStudio release library project because the latest zlib Official Windows + build does not include such a thing. + Revised png_get_int_16() to be similar to png_get_int_32(). + Restored projects/visualc71. + +Version 1.5.0beta39 [August 2, 2010] + VisualC/GCC warning fixes, VisualC build fixes + The changes include support for function attributes in VC in addition to + those already present in GCC - necessary because without these some + warnings are unavoidable. Fixes include signed/unsigned fixes in + pngvalid and checks with gcc -Wall -Wextra -Wunused. + VC requires function attributes on function definitions as well as + declarations, PNG_FUNCTION has been added to enable this and the + relevant function definitions changed. + +Version 1.5.0beta40 [August 6, 2010] + Correct use of _WINDOWS_ in pngconf.h + Removed png_mem_ #defines; they are no longer used. + Added the sRGB chunk to pngtest.png + +Version 1.5.0beta41 [August 11, 2010] + Added the cHRM chunk to pngtest.png + Don't try to use version-script with cygwin/mingw. + Revised contrib/gregbook to work under cygwin/mingw. + +Version 1.5.0beta42 [August 18, 2010] + Add .dll.a to the list of extensions to be symlinked by Makefile.am (Yaakov) + Made all API functions that have const arguments and constant string + literal pointers declare them (John Bowler). + +Version 1.5.0beta43 [August 20, 2010] + Removed spurious tabs, shorten long lines (no source change) + Also added scripts/chkfmt to validate the format of all the files that can + reasonably be validated (it is suggested to run "make distclean" before + checking, because some machine generated files have long lines.) + Reformatted the CHANGES file to be more consistent throughout. + Made changes to address various issues identified by GCC, mostly + signed/unsigned and shortening problems on assignment but also a few + difficult to optimize (for GCC) loops. + Fixed non-GCC fixed point builds. In png.c a declaration was misplaced + in an earlier update. Fixed to declare the auto variables at the head. + Use cexcept.h in pngvalid.c. + +Version 1.5.0beta44 [August 24, 2010] + Updated CMakeLists.txt to use CMAKE_INSTALL_LIBDIR variable; useful for + installing libpng in /usr/lib64 (Funda Wang). + Revised CMakeLists.txt to put the man pages in share/man/man* not man/man* + Revised CMakeLists.txt to make symlinks instead of copies when installing. + Changed PNG_LIB_NAME from pngNN to libpngNN in CMakeLists.txt (Philip Lowman) + Implemented memory checks within pngvalid + Reformatted/rearranged pngvalid.c to assist use of progressive reader. + Check interlaced images in pngvalid + Clarified pngusr.h comments in pnglibconf.dfa + Simplified the pngvalid error-handling code now that cexcept.h is in place. + Implemented progressive reader in pngvalid.c for standard tests + Implemented progressive read in pngvalid.c gamma tests + Turn on progressive reader in pngvalid.c by default and tidy code. + +Version 1.5.0beta45 [August 26, 2010] + Added an explicit make step to projects/vstudio for pnglibconf.h + Also corrected zlib.vcxproj into which Visual Studio had introduced + what it calls an "authoring error". The change to make pnglibconf.h + simply copies the file; in the future it may actually generate the + file from scripts/pnglibconf.dfa as the other build systems do. + Changed pngvalid to work when floating point APIs are disabled + Renamed the prebuilt scripts/pnglibconf.h to scripts/pnglibconf.h.prebuilt + Supply default values for PNG_USER_PRIVATEBUILD and PNG_USER_DLLFNAME_POSTFIX + in pngpriv.h in case the user neglected to define them in their pngusr.h + +Version 1.5.0beta46 [August 28, 2010] + Added new private header files to libpng_sources in CMakeLists.txt + Added PNG_READ_16BIT, PNG_WRITE_16BIT, and PNG_16BIT options. + Added reference to scripts/pnglibconf.h.prebuilt in the visualc71 project. + +Version 1.5.0beta47 [September 11, 2010] + Fixed a number of problems with 64-bit compilation reported by Visual + Studio 2010 (John Bowler). + +Version 1.5.0beta48 [October 4, 2010] + Updated CMakeLists.txt (Philip Lowman). + Revised autogen.sh to recognize and use $AUTOCONF, $AUTOMAKE, $AUTOHEADER, + $AUTOPOINT, $ACLOCAL and $LIBTOOLIZE + Fixed problem with symbols creation in Makefile.am which was assuming that + all versions of ccp write to standard output by default (Martin Banky). The + bug was introduced in libpng-1.2.9beta5. + Removed unused mkinstalldirs. + +Version 1.5.0beta49 [October 8, 2010] + Undid Makefile.am revision of 1.5.0beta48. + +Version 1.5.0beta50 [October 14, 2010] + Revised Makefile.in to account for mkinstalldirs being removed. + Added some "(unsigned long)" typecasts in printf statements in pngvalid.c. + Suppressed a compiler warning in png_handle_sPLT(). + Check for out-of-range text compression mode in png_set_text(). + +Version 1.5.0beta51 [October 15, 2010] + Changed embedded dates to "(PENDING RELEASE) in beta releases (and future + rc releases) to minimize the difference between releases. + +Version 1.5.0beta52 [October 16, 2010] + Restored some of the embedded dates (in png.h, png.c, documentation, etc.) + +Version 1.5.0beta53 [October 18, 2010] + Updated INSTALL to mention using "make maintainer-clean" and to remove + obsolete statement about a custom ltmain.sh + Disabled "color-tests" by default in Makefile.am so it will work with + automake versions earlier than 1.11.1 + Use document name "libpng-manual.txt" instead of "libpng-.txt" + to simplify version differences. + Removed obsolete remarks about setjmp handling from INSTALL. + Revised and renamed the typedef in png.h and png.c that was designed + to catch library and header mismatch. + +Version 1.5.0beta54 [November 10, 2010] + Require 48 bytes, not 64 bytes, for big_row_buf in overflow checks. + Used a consistent structure for the pngget.c functions. + +Version 1.5.0beta55 [November 21, 2010] + Revised png_get_uint_32, png_get_int_32, png_get_uint_16 (Cosmin) + Moved reading of file signature into png_read_sig (Cosmin) + Fixed atomicity of chunk header serialization (Cosmin) + Added test for io_state in pngtest.c (Cosmin) + Added "#!/bin/sh" at the top of contrib/pngminim/*/gather.sh scripts. + Changes to remove gcc warnings (John Bowler) + Certain optional gcc warning flags resulted in warnings in libpng code. + With these changes only -Wconversion and -Wcast-qual cannot be turned on. + Changes are trivial rearrangements of code. -Wconversion is not possible + for pngrutil.c (because of the widespread use of += et al on variables + smaller than (int) or (unsigned int)) and -Wcast-qual is not possible + with pngwio.c and pngwutil.c because the 'write' callback and zlib + compression both fail to declare their input buffers with 'const'. + +Version 1.5.0beta56 [December 7, 2010] + Added the private PNG_UNUSED() macro definition in pngpriv.h. + Added some commentary about PNG_EXPORT in png.h and pngconf.h + Revised PNG_EXPORT() macro and added PNG_EXPORTA() macro, with the + objective of simplifying and improving the cosmetic appearance of png.h. + Fixed some incorrect "=" macro names in pnglibconf.dfa + Included documentation of changes in 1.5.0 from 1.4.x in libpng-manual.txt + +Version 1.5.0beta57 [December 9, 2010] + Documented the pngvalid gamma error summary with additional comments and + print statements. + Improved missing symbol handling in checksym.awk; symbols missing in both + the old and new files can now be optionally ignored, treated as errors + or warnings. + Removed references to pngvcrd.c and pnggccrd.c from the vstudio project. + Updated "libpng14" to "libpng15" in the visualc71 project. + Enabled the strip16 tests in pngvalid.` + Don't display test results (except PASS/FAIL) when running "make test". + Instead put them in pngtest-log.txt + Added "--with-zprefix=" to configure.ac + Updated the prebuilt configuration files to autoconf version 2.68 + +Version 1.5.0beta58 [December 19, 2010] + Fixed interlace image handling and add test cases (John Bowler) + Fixed the clean rule in Makefile.am to remove pngtest-log.txt + Made minor changes to work around warnings in gcc 3.4 + +Version 1.5.0rc01 [December 27, 2010] + No changes. + +Version 1.5.0rc02 [December 27, 2010] + Eliminated references to the scripts/*.def files in project/visualc71. + +Version 1.5.0rc03 [December 28, 2010] + Eliminated scripts/*.def and revised Makefile.am accordingly + +Version 1.5.0rc04 [December 29, 2010] + Fixed bug in background transformation handling in pngrtran.c (it was + looking for the flag in png_ptr->transformations instead of in + png_ptr->flags) (David Raymond). + +Version 1.5.0rc05 [December 31, 2010] + Fixed typo in a comment in CMakeLists.txt (libpng14 => libpng15) (Cosmin) + +Version 1.5.0rc06 [January 4, 2011] + Changed the new configure option "zprefix=string" to "zlib-prefix=string" + +Version 1.5.0rc07 [January 4, 2011] + Updated copyright year. + +Version 1.5.0 [January 6, 2011] + No changes. + +version 1.5.1beta01 [January 8, 2011] + Added description of png_set_crc_action() to the manual. + Added a note in the manual that the type of the iCCP profile was changed + from png_charpp to png_bytepp in png_get_iCCP(). This change happened + in version 1.5.0beta36 but is not noted in the CHANGES. Similarly, + it was changed from png_charpp to png_const_bytepp in png_set_iCCP(). + Ensure that png_rgb_to_gray ignores palette mapped images, if libpng + internally happens to call it with one. + Fixed a failure to handle palette mapped images correctly. + +Version 1.5.1beta02 [January 14, 2011] + Fixed a bug in handling of interlaced images (bero at arklinux.org). + Updated CMakeLists.txt (Clifford Yapp) + +Version 1.5.1beta03 [January 14, 2011] + Fixed typecasting of some png_debug() statements (Cosmin) + +Version 1.5.1beta04 [January 16, 2011] + Updated documentation of png_set|get_tRNS() (Thomas Klausner). + Mentioned in the documentation that applications must #include "zlib.h" + if they need access to anything in zlib.h, and that a number of + macros such as png_memset() are no longer accessible by applications. + Corrected pngvalid gamma test "sample" function to access all of the color + samples of each pixel, instead of sampling the red channel three times. + Prefixed variable names index, div, exp, gamma with "png_" to avoid "shadow" + warnings, and (mistakenly) changed png_exp() to exp(). + +Version 1.5.1beta05 [January 16, 2011] + Changed variable names png_index, png_div, png_exp, and png_gamma to + char_index, divisor, exp_b10, and gamma_val, respectively, and + changed exp() back to png_exp(). + +Version 1.5.1beta06 [January 20, 2011] + Prevent png_push_crc_skip() from hanging while reading an unknown chunk + or an over-large compressed zTXt chunk with the progressive reader. + Eliminated more GCC "shadow" warnings. + Revised png_fixed() in png.c to avoid compiler warning about reaching the + end without returning anything. + +Version 1.5.1beta07 [January 22, 2011] + In the manual, describe the png_get_IHDR() arguments in the correct order. + Added const_png_structp and const_png_infop types, and used them in + prototypes for most png_get_*() functions. + +Version 1.5.1beta08 [January 23, 2011] + Added png_get_io_chunk_type() and deprecated png_get_io_chunk_name() + Added synopses for the IO_STATE functions and other missing synopses + to the manual. Removed the synopses from libpngpf.3 because they + were out of date and no longer useful. Better information can be + obtained by reading the prototypes and comments in pngpriv.h + Attempted to fix cpp on Solaris with S. Studio 12 cc, fix build + Added a make macro DFNCPP that is a CPP that will accept the tokens in + a .dfn file and adds configure stuff to test for such a CPP. ./configure + should fail if one is not available. + Corrected const_png_ in png.h to png_const_ to avoid polluting the namespace. + Added png_get_current_row_number and png_get_current_pass_number for the + benefit of the user transform callback. + Added png_process_data_pause and png_process_data_skip for the benefit of + progressive readers that need to stop data processing or want to optimize + skipping of unread data (e.g., if the reader marks a chunk to be skipped.) + +Version 1.5.1beta09 [January 24, 2011] + Enhanced pngvalid, corrected an error in gray_to_rgb, corrected doc error. + pngvalid contains tests of transforms, which tests are currently disabled + because they are incompletely tested. gray_to_rgb was failing to expand + the bit depth for smaller bit depth images; this seems to be a long + standing error and resulted, apparently, in invalid output. The + documentation did not accurately describe what libpng really does when + converting RGB to gray. + +Version 1.5.1beta10 [January 27, 2010] + Fixed incorrect examples of callback prototypes in the manual, that were + introduced in libpng-1.0.0. + In addition the order of the png_get_uint macros with respect to the + relevant function definitions has been reversed. This helps the + preprocessing of the symbol files be more robust. Furthermore, the + symbol file preprocessing now uses -DPNG_NO_USE_READ_MACROS even when + the library may actually be built with PNG_USE_READ_MACROS; this stops + the read macros interfering with the symbol file format. + Made the manual, synopses, and function prototypes use the function + argument names file_gamma, int_file_gamma, and srgb_intent consistently. + +Version 1.5.1beta11 [January 28, 2011] + Changed PNG_UNUSED from "param=param;" to "{if(param){}}". + Corrected local variable type in new API png_process_data_skip() + The type was self-evidently incorrect but only causes problems on 64 bit + architectures. + Added transform tests to pngvalid and simplified the arguments. + +Version 1.5.1rc01 [January 29, 2011] + No changes. + +Version 1.5.1rc02 [January 31, 2011] + Added a request in the manual that applications do not use "png_" or + "PNG_" to begin any of their own symbols. + Changed PNG_UNUSED to "(void)param;" and updated the commentary in pngpriv.h + +Version 1.5.1 [February 3, 2011] + No changes. + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net +(subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) +or to glennrp at users.sourceforge.net + +Glenn R-P +*/ } +#endif diff --git a/src/3rdparty/libpng/CMakeLists.txt b/src/3rdparty/libpng/CMakeLists.txt new file mode 100644 index 0000000000..2ee5bf3384 --- /dev/null +++ b/src/3rdparty/libpng/CMakeLists.txt @@ -0,0 +1,406 @@ +cmake_minimum_required(VERSION 2.4.4) +set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) + +if(UNIX AND NOT DEFINED CMAKE_BUILD_TYPE) + if(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION EQUAL 4) + # workaround CMake 2.4.x bug + set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING + "Choose the type of build, options are: + None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) + Debug + Release + RelWithDebInfo + MinSizeRel.") + else() + set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING + "Choose the type of build, options are: + None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) + Debug + Release + RelWithDebInfo + MinSizeRel.") + endif() +endif() + +project(libpng C) +enable_testing() + +# Copyright (C) 2007-2011 Glenn Randers-Pehrson + +# This code is released under the libpng license. +# For conditions of distribution and use, see the disclaimer +# and license in png.h + +set(PNGLIB_MAJOR 1) +set(PNGLIB_MINOR 5) +set(PNGLIB_RELEASE 1) +set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR}) +set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE}) + +# needed packages +find_package(ZLIB REQUIRED) +include_directories(${ZLIB_INCLUDE_DIR}) + +if(NOT WIN32) + find_library(M_LIBRARY + NAMES m + PATHS /usr/lib /usr/local/lib + ) + if(NOT M_LIBRARY) + message(STATUS + "math library 'libm' not found - floating point support disabled") + endif() +else() + # not needed on windows + set(M_LIBRARY "") +endif() + +# COMMAND LINE OPTIONS +if(DEFINED PNG_SHARED) + option(PNG_SHARED "Build shared lib" ${PNG_SHARED}) +else() + option(PNG_SHARED "Build shared lib" ON) +endif() +if(DEFINED PNG_STATIC) + option(PNG_STATIC "Build static lib" ${PNG_STATIC}) +else() + option(PNG_STATIC "Build static lib" ON) +endif() + +if(MINGW) + option(PNG_TESTS "Build pngtest" NO) +else() + option(PNG_TESTS "Build pngtest" YES) +endif() + +option(PNG_NO_CONSOLE_IO "FIXME" YES) +option(PNG_NO_STDIO "FIXME" YES) +option(PNG_DEBUG "Build with debug output" NO) +option(PNGARG "FIXME" YES) +#TODO: +# PNG_CONSOLE_IO_SUPPORTED + +# maybe needs improving, but currently I don't know when we can enable what :) +set(png_asm_tmp "OFF") +if(NOT WIN32) + find_program(uname_executable NAMES uname PATHS /bin /usr/bin /usr/local/bin) + if(uname_executable) + exec_program(${uname_executable} + ARGS --machine OUTPUT_VARIABLE uname_output) + if("uname_output" MATCHES "^.*i[1-9]86.*$") + set(png_asm_tmp "ON") + else("uname_output" MATCHES "^.*i[1-9]86.*$") + set(png_asm_tmp "OFF") + endif("uname_output" MATCHES "^.*i[1-9]86.*$") + endif(uname_executable) +else() + # this env var is normally only set on win64 + set(TEXT "ProgramFiles(x86)") + if("$ENV{${TEXT}}" STREQUAL "") + set(png_asm_tmp "ON") + endif("$ENV{${TEXT}}" STREQUAL "") +endif() + +# SET LIBNAME +set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR}) + +# to distinguish between debug and release lib +set(CMAKE_DEBUG_POSTFIX "d") + +# Use the prebuilt pnglibconf.h file from the scripts folder +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt + ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +# OUR SOURCES +set(libpng_public_hdrs + png.h + pngconf.h + ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h +) +set(libpng_sources + ${libpng_public_hdrs} + pngdebug.h + pnginfo.h + pngpriv.h + pngstruct.h + png.c + pngerror.c + pngget.c + pngmem.c + pngpread.c + pngread.c + pngrio.c + pngrtran.c + pngrutil.c + pngset.c + pngtrans.c + pngwio.c + pngwrite.c + pngwtran.c + pngwutil.c +) +set(pngtest_sources + pngtest.c +) +# SOME NEEDED DEFINITIONS + +add_definitions(-DPNG_CONFIGURE_LIBPNG) + +if(_AIX) + add_definitions(-D_ALL_SOURCE) +endif(_AIX) + +if(MSVC) + add_definitions(-DPNG_NO_MODULEDEF -D_CRT_SECURE_NO_DEPRECATE) +endif(MSVC) + +if(PNG_SHARED OR NOT MSVC) + #if building msvc static this has NOT to be defined + add_definitions(-DZLIB_DLL) +endif() + + +if(PNG_CONSOLE_IO_SUPPORTED) + add_definitions(-DPNG_CONSOLE_IO_SUPPORTED) +endif() + +if(PNG_NO_CONSOLE_IO) + add_definitions(-DPNG_NO_CONSOLE_IO) +endif() + +if(PNG_NO_STDIO) + add_definitions(-DPNG_NO_STDIO) +endif() + +if(PNG_DEBUG) + add_definitions(-DPNG_DEBUG) +endif() + +if(NOT M_LIBRARY AND NOT WIN32) + add_definitions(-DPNG_NO_FLOATING_POINT_SUPPORTED) +endif() + +# NOW BUILD OUR TARGET +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR}) + +if(PNG_SHARED) + add_library(${PNG_LIB_NAME} SHARED ${libpng_sources}) + if(MSVC) + # msvc does not append 'lib' - do it here to have consistent name + set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib") + set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib") + endif() + target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY}) +endif() + +if(PNG_STATIC) +# does not work without changing name + set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static) + add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources}) + if(MSVC) + # msvc does not append 'lib' - do it here to have consistent name + set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib") + endif() + target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY}) +endif() + + +if(PNG_SHARED AND WIN32) + set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL) +endif() + +if(PNG_TESTS AND PNG_SHARED) + # does not work with msvc due to png_lib_ver issue + add_executable(pngtest ${pngtest_sources}) + target_link_libraries(pngtest ${PNG_LIB_NAME}) + add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png) +endif() + +# +# Set a variable with CMake code which: +# Creates a symlink from src to dest (if possible) or alternatively +# copies if different. +macro(_png_generate_symlink_code CODE SRC DEST) + if(WIN32 AND NOT CYGWIN) + set(_png_gsc_message "Copying ${SRC} to ${DEST} if needed") + set(_png_gsc_operation "copy_if_different") + else() + set(_png_gsc_message "Symlinking ${SRC} to ${DEST}") + set(_png_gsc_operation "create_symlink") + endif() + + set(${CODE} " + message(STATUS \"${_png_gsc_message}\") + execute_process(COMMAND \${CMAKE_COMMAND} -E ${_png_gsc_operation} + \"${SRC}\" \"${DEST}\") + ") +endmacro() + +# CREATE PKGCONFIG FILES +# we use the same files like ./configure, so we have to set its vars +if(NOT DEFINED CMAKE_INSTALL_LIBDIR) + set(CMAKE_INSTALL_LIBDIR lib) +endif(NOT DEFINED CMAKE_INSTALL_LIBDIR) +set(prefix ${CMAKE_INSTALL_PREFIX}) +set(exec_prefix ${CMAKE_INSTALL_PREFIX}) +set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) +set(includedir ${CMAKE_INSTALL_PREFIX}/include) +set(LIBS "-lz -lm") +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY) +_png_generate_symlink_code(PNG_PC_INSTALL_CODE + ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc + ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc) +install(CODE ${PNG_PC_INSTALL_CODE}) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in + ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY) +_png_generate_symlink_code(PNG_CONFIG_INSTALL_CODE + ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config + ${CMAKE_CURRENT_BINARY_DIR}/libpng-config) +install(CODE ${PNG_CONFIG_INSTALL_CODE}) + +# SET UP LINKS +if(PNG_SHARED) + set_target_properties(${PNG_LIB_NAME} PROPERTIES +# VERSION 15.${PNGLIB_RELEASE}.1.5.1 + VERSION 15.${PNGLIB_RELEASE}.0 + SOVERSION 15 + CLEAN_DIRECT_OUTPUT 1) +endif() +if(PNG_STATIC) + # MSVC doesn't use a different file extension for shared vs. static + # libs. We are able to change OUTPUT_NAME to remove the _static + # for all other platforms. + if(NOT MSVC) + set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES + OUTPUT_NAME ${PNG_LIB_NAME} + CLEAN_DIRECT_OUTPUT 1) + endif() +endif() + +# If CMake > 2.4.x, we set a variable used below to export +# targets to an export file. +# TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2 +if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4) + set(PNG_EXPORT_RULE EXPORT libpng) +elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof + set(PNG_EXPORT_RULE EXPORT libpng) +endif() + +# INSTALL +if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) + if(PNG_SHARED) + install(TARGETS ${PNG_LIB_NAME} + ${PNG_EXPORT_RULE} + RUNTIME DESTINATION bin + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + + # Create a symlink for libpng.dll.a => libpng15.dll.a on Cygwin + if(CYGWIN) + _png_generate_symlink_code(PNG_SHARED_IMPLIB_INSTALL_CODE + ${PNGLIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX} + libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}) + install(CODE ${PNG_SHARED_IMPLIB_INSTALL_CODE}) + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX} + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + endif() + + if(NOT WIN32) + IF(CMAKE_LIBRARY_OUTPUT_DIRECTORY) + _png_generate_symlink_code(PNG_SHARED_INSTALL_CODE + ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${PNGLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} + ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}) + install(CODE ${PNG_SHARED_INSTALL_CODE}) + install(FILES + ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX} + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + ELSE(CMAKE_LIBRARY_OUTPUT_DIRECTORY) + _png_generate_symlink_code(PNG_SHARED_INSTALL_CODE + ${PNGLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} + libpng${CMAKE_SHARED_LIBRARY_SUFFIX}) + install(CODE ${PNG_SHARED_INSTALL_CODE}) + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX} + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + ENDIF(CMAKE_LIBRARY_OUTPUT_DIRECTORY) + endif() + endif() + + if(PNG_STATIC) + install(TARGETS ${PNG_LIB_NAME_STATIC} + ${PNG_EXPORT_RULE} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + if(NOT WIN32 OR CYGWIN) + IF(CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + _png_generate_symlink_code(PNG_STATIC_INSTALL_CODE +${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${PNGLIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX} + ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}) + install(CODE ${PNG_STATIC_INSTALL_CODE}) + install(FILES + ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX} + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + ELSE(CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + _png_generate_symlink_code(PNG_STATIC_INSTALL_CODE + ${PNGLIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX} + libpng${CMAKE_STATIC_LIBRARY_SUFFIX}) + install(CODE ${PNG_STATIC_INSTALL_CODE}) + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX} + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + ENDIF(CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + endif() + endif() +endif() + +if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL ) + install(FILES ${libpng_public_hdrs} DESTINATION include) + install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME}) +endif() +if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL ) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config + DESTINATION bin) +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + # Install man pages + if(NOT PNG_MAN_DIR) + set(PNG_MAN_DIR "share/man") + endif() + install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3) + install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5) + # Install pkg-config files + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config + DESTINATION bin) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config + DESTINATION bin) +endif() + +# On versions of CMake that support it, create an export file CMake +# users can include() to import our targets +if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL ) + install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake) +endif() + +# what's with libpng-$VER%.txt and all the extra files? + + +# UNINSTALL +# do we need this? + + +# DIST +# do we need this? + +# to create msvc import lib for mingw compiled shared lib +# pexports libpng.dll > libpng.def +# lib /def:libpng.def /machine:x86 + diff --git a/src/3rdparty/libpng/INSTALL b/src/3rdparty/libpng/INSTALL new file mode 100644 index 0000000000..353bfff326 --- /dev/null +++ b/src/3rdparty/libpng/INSTALL @@ -0,0 +1,135 @@ + +Installing libpng + +On Unix/Linux and similar systems, you can simply type + + ./configure [--prefix=/path] + make check + make install + +and ignore the rest of this document. + +If configure does not work on your system and you have a reasonably +up-to-date set of tools, running ./autogen.sh before running ./configure +may fix the problem. You can also run the individual commands in +autogen.sh with the --force option, if supported by your version of +the tools. To be really sure that you aren't using any of the included +pre-built scripts, you can do this: + + ./configure --enable-maintainer-mode + make maintainer-clean + ./autogen.sh + ./configure [--prefix=/path] [other options] + make + make install + make check + +Instead, you can use one of the custom-built makefiles in the +"scripts" directory + + cp scripts/makefile.system makefile + make test + make install + +The files that are presently available in the scripts directory +are listed and described in scripts/README.txt. + +Or you can use one of the "projects" in the "projects" directory. + +Before installing libpng, you must first install zlib, if it +is not already on your system. zlib can usually be found +wherever you got libpng. zlib can be placed in another directory, +at the same level as libpng. + +If you want to use "cmake" (see www.cmake.org), type + + cmake . -DCMAKE_INSTALL_PREFIX=/path + make + make install + +If your system already has a preinstalled zlib you will still need +to have access to the zlib.h and zconf.h include files that +correspond to the version of zlib that's installed. + +You can rename the directories that you downloaded (they +might be called "libpng-x.y.z" or "libpngNN" and "zlib-1.2.5" +or "zlib125") so that you have directories called "zlib" and "libpng". + +Your directory structure should look like this: + + .. (the parent directory) + libpng (this directory) + INSTALL (this file) + README + *.h + *.c + CMakeLists.txt => "cmake" script + configuration files: + configure.ac, configure, Makefile.am, Makefile.in, + autogen.sh, config.guess, ltmain.sh, missing, libpng.pc.in, + libpng-config.in, aclocal.m4, config.h.in, config.sub, + depcomp, install-sh, mkinstalldirs, test-pngtest.sh + contrib + gregbook + pngminim + pngminus + pngsuite + visupng + projects + visualc71 + vstudio + scripts + makefile.* + *.def (module definition files) + etc. + pngtest.png + etc. + zlib + README + *.h + *.c + contrib + etc. + +If the line endings in the files look funny, you may wish to get the other +distribution of libpng. It is available in both tar.gz (UNIX style line +endings) and zip (DOS style line endings) formats. + +If you are building libpng with MSVC, you can enter the +libpng projects\visualc6 or visualc71 directory and follow the instructions +in README.txt. + +Otherwise enter the zlib directory and follow the instructions in zlib/README, +then come back here and run "configure" or choose the appropriate +makefile.sys in the scripts directory. + +Copy the file (or files) that you need from the +scripts directory into this directory, for example + + MSDOS example: copy scripts\makefile.msc makefile + UNIX example: cp scripts/makefile.std makefile + +Read the makefile to see if you need to change any source or +target directories to match your preferences. + +Then read pnglibconf.dfa to see if you want to make any configuration +changes. + +Then just run "make" which will create the libpng library in +this directory and "make test" which will run a quick test that reads +the "pngtest.png" file and writes a "pngout.png" file that should be +identical to it. Look for "9782 zero samples" in the output of the +test. For more confidence, you can run another test by typing +"pngtest pngnow.png" and looking for "289 zero samples" in the output. +Also, you can run "pngtest -m contrib/pngsuite/*.png" and compare +your output with the result shown in contrib/pngsuite/README. + +Most of the makefiles will allow you to run "make install" to +put the library in its final resting place (if you want to +do that, run "make install" in the zlib directory first if necessary). +Some also allow you to run "make test-installed" after you have +run "make install". + +Further information can be found in the README and libpng-manual.txt +files, in the individual makefiles, in png.h, and the manual pages +libpng.3 and png.5. diff --git a/src/3rdparty/libpng/LICENSE b/src/3rdparty/libpng/LICENSE new file mode 100644 index 0000000000..b28f15c74f --- /dev/null +++ b/src/3rdparty/libpng/LICENSE @@ -0,0 +1,111 @@ + +This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.5.1, February 3, 2011, are +Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the + library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is with + the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +February 3, 2011 diff --git a/src/3rdparty/libpng/README b/src/3rdparty/libpng/README new file mode 100644 index 0000000000..9dd6745f0a --- /dev/null +++ b/src/3rdparty/libpng/README @@ -0,0 +1,205 @@ +README for libpng version 1.5.1 - February 3, 2011 (shared library 15.0) +See the note about version numbers near the top of png.h + +See INSTALL for instructions on how to install libpng. + +Libpng comes in several distribution formats. Get libpng-*.tar.gz, +libpng-*.tar.xz or libpng-*.tar.bz2 if you want UNIX-style line endings +in the text files, or lpng*.zip if you want DOS-style line endings. + +Version 0.89 was the first official release of libpng. Don't let the +fact that it's the first release fool you. The libpng library has been in +extensive use and testing since mid-1995. By late 1997 it had +finally gotten to the stage where there hadn't been significant +changes to the API in some time, and people have a bad feeling about +libraries with versions < 1.0. Version 1.0.0 was released in +March 1998. + +**** +Note that some of the changes to the png_info structure render this +version of the library binary incompatible with libpng-0.89 or +earlier versions if you are using a shared library. The type of the +"filler" parameter for png_set_filler() has changed from png_byte to +png_uint_32, which will affect shared-library applications that use +this function. + +To avoid problems with changes to the internals of png_info_struct, +new APIs have been made available in 0.95 to avoid direct application +access to info_ptr. These functions are the png_set_ and +png_get_ functions. These functions should be used when +accessing/storing the info_struct data, rather than manipulating it +directly, to avoid such problems in the future. + +It is important to note that the APIs do not make current programs +that access the info struct directly incompatible with the new +library. However, it is strongly suggested that new programs use +the new APIs (as shown in example.c and pngtest.c), and older programs +be converted to the new format, to facilitate upgrades in the future. +**** + +Additions since 0.90 include the ability to compile libpng as a +Windows DLL, and new APIs for accessing data in the info struct. +Experimental functions include the ability to set weighting and cost +factors for row filter selection, direct reads of integers from buffers +on big-endian processors that support misaligned data access, faster +methods of doing alpha composition, and more accurate 16->8 bit color +conversion. + +The additions since 0.89 include the ability to read from a PNG stream +which has had some (or all) of the signature bytes read by the calling +application. This also allows the reading of embedded PNG streams that +do not have the PNG file signature. As well, it is now possible to set +the library action on the detection of chunk CRC errors. It is possible +to set different actions based on whether the CRC error occurred in a +critical or an ancillary chunk. + +The changes made to the library, and bugs fixed are based on discussions +on the PNG-implement mailing list and not on material submitted +privately to Guy, Andreas, or Glenn. They will forward any good +suggestions to the list. + +For a detailed description on using libpng, read libpng-manual.txt. For +examples of libpng in a program, see example.c and pngtest.c. For usage +information and restrictions (what little they are) on libpng, see +png.h. For a description on using zlib (the compression library used by +libpng) and zlib's restrictions, see zlib.h + +I have included a general makefile, as well as several machine and +compiler specific ones, but you may have to modify one for your own needs. + +You should use zlib 1.0.4 or later to run this, but it MAY work with +versions as old as zlib 0.95. Even so, there are bugs in older zlib +versions which can cause the output of invalid compression streams for +some images. You will definitely need zlib 1.0.4 or later if you are +taking advantage of the MS-DOS "far" structure allocation for the small +and medium memory models. You should also note that zlib is a +compression library that is useful for more things than just PNG files. +You can use zlib as a drop-in replacement for fread() and fwrite() if +you are so inclined. + +zlib should be available at the same place that libpng is, or at. +ftp://ftp.info-zip.org/pub/infozip/zlib + +You may also want a copy of the PNG specification. It is available +as an RFC, a W3C Recommendation, and an ISO/IEC Standard. You can find +these at http://www.libpng.org/pub/png/documents/ + +This code is currently being archived at libpng.sf.net in the +[DOWNLOAD] area, and on CompuServe, Lib 20 (PNG SUPPORT) +at GO GRAPHSUP. If you can't find it in any of those places, +e-mail me, and I'll help you find it. + +If you have any code changes, requests, problems, etc., please e-mail +them to me. Also, I'd appreciate any make files or project files, +and any modifications you needed to make to get libpng to compile, +along with a #define variable to tell what compiler/system you are on. +If you needed to add transformations to libpng, or wish libpng would +provide the image in a different way, drop me a note (and code, if +possible), so I can consider supporting the transformation. +Finally, if you get any warning messages when compiling libpng +(note: not zlib), and they are easy to fix, I'd appreciate the +fix. Please mention "libpng" somewhere in the subject line. Thanks. + +This release was created and will be supported by myself (of course +based in a large way on Guy's and Andreas' earlier work), and the PNG +development group. + +Send comments/corrections/commendations to png-mng-implement at +lists.sourceforge.net (subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) or to glennrp at users.sourceforge.net + +You can't reach Guy, the original libpng author, at the addresses +given in previous versions of this document. He and Andreas will +read mail addressed to the png-implement list, however. + +Please do not send general questions about PNG. Send them to +the (png-list at ccrc.wustl.edu, subscription required, write to +majordomo at ccrc.wustl.edu with "subscribe png-list" in your message). +On the other hand, +please do not send libpng questions to that address, send them to me +or to the png-implement list. I'll +get them in the end anyway. If you have a question about something +in the PNG specification that is related to using libpng, send it +to me. Send me any questions that start with "I was using libpng, +and ...". If in doubt, send questions to me. I'll bounce them +to others, if necessary. + +Please do not send suggestions on how to change PNG. We have +been discussing PNG for nine years now, and it is official and +finished. If you have suggestions for libpng, however, I'll +gladly listen. Even if your suggestion is not used immediately, +it may be used later. + +Files in this distribution: + + ANNOUNCE => Announcement of this version, with recent changes + CHANGES => Description of changes between libpng versions + KNOWNBUG => List of known bugs and deficiencies + LICENSE => License to use and redistribute libpng + README => This file + TODO => Things not implemented in the current library + Y2KINFO => Statement of Y2K compliance + example.c => Example code for using libpng functions + libpng.3 => manual page for libpng (includes libpng-manual.txt) + libpng-manual.txt => Description of libpng and its functions + libpngpf.3 => manual page for libpng's private functions + png.5 => manual page for the PNG format + png.c => Basic interface functions common to library + png.h => Library function and interface declarations (public) + pngpriv.h => Library function and interface declarations (private) + pngconf.h => System specific library configuration (public) + pngstruct.h => png_struct declaration (private) + pnginfo.h => png_info struct declaration (private) + pngdebug.h => debugging macros (private) + pngerror.c => Error/warning message I/O functions + pngget.c => Functions for retrieving info from struct + pngmem.c => Memory handling functions + pngbar.png => PNG logo, 88x31 + pngnow.png => PNG logo, 98x31 + pngpread.c => Progressive reading functions + pngread.c => Read data/helper high-level functions + pngrio.c => Lowest-level data read I/O functions + pngrtran.c => Read data transformation functions + pngrutil.c => Read data utility functions + pngset.c => Functions for storing data into the info_struct + pngtest.c => Library test program + pngtest.png => Library test sample image + pngtrans.c => Common data transformation functions + pngwio.c => Lowest-level write I/O functions + pngwrite.c => High-level write functions + pngwtran.c => Write data transformations + pngwutil.c => Write utility functions + contrib => Contributions + gregbook => source code for PNG reading and writing, from + Greg Roelofs' "PNG: The Definitive Guide", + O'Reilly, 1999 + msvctest => Builds and runs pngtest using a MSVC workspace + pngminus => Simple pnm2png and png2pnm programs + pngsuite => Test images + visupng => Contains a MSVC workspace for VisualPng + projects => Contains project files and workspaces for + building a DLL + cbuilder5 => Contains a Borland workspace for building + libpng and zlib + visualc6 => Contains a Microsoft Visual C++ (MSVC) + workspace for building libpng and zlib + visualc71 => Contains a Microsoft Visual C++ (MSVC) + workspace for building libpng and zlib + xcode => Contains an Apple xcode + workspace for building libpng and zlib + scripts => Directory containing scripts for building libpng: + (see scripts/README.txt for the list of scripts) + +Good luck, and happy coding. + +-Glenn Randers-Pehrson (current maintainer, since 1998) + Internet: glennrp at users.sourceforge.net + +-Andreas Eric Dilger (former maintainer, 1996-1997) + Internet: adilger at enel.ucalgary.ca + Web: http://www-mddsp.enel.ucalgary.ca/People/adilger/ + +-Guy Eric Schalnat (original author and former maintainer, 1995-1996) + (formerly of Group 42, Inc) + Internet: gschal at infinet.com diff --git a/src/3rdparty/libpng/TODO b/src/3rdparty/libpng/TODO new file mode 100644 index 0000000000..6e1f028bd7 --- /dev/null +++ b/src/3rdparty/libpng/TODO @@ -0,0 +1,27 @@ +/* +TODO - list of things to do for libpng: + +Final bug fixes. +Better C++ wrapper/full C++ implementation? +Fix problem with C++ and EXTERN "C". +cHRM transformation. +Remove setjmp/longjmp usage in favor of returning error codes. +Add "grayscale->palette" transformation and "palette->grayscale" detection. +Improved dithering. +Multi-lingual error and warning message support. +Complete sRGB transformation (presently it simply uses gamma=0.45455). +Man pages for function calls. +Better documentation. +Better filter selection + (counting huffman bits/precompression? filter inertia? filter costs?). +Histogram creation. +Text conversion between different code pages (Latin-1 -> Mac and DOS). +Avoid building gamma tables whenever possible. +Use greater precision when changing to linear gamma for compositing against + background and doing rgb-to-gray transformation. +Investigate pre-incremented loop counters and other loop constructions. +Add interpolated method of handling interlacing. +Switch to the simpler zlib (zlib/libpng) license if legally possible. +Extend pngvalid.c to validate more of the libpng transformations. + +*/ diff --git a/src/3rdparty/libpng/config.guess b/src/3rdparty/libpng/config.guess new file mode 100644 index 0000000000..dc84c68ef7 --- /dev/null +++ b/src/3rdparty/libpng/config.guess @@ -0,0 +1,1501 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/3rdparty/libpng/config.h.in b/src/3rdparty/libpng/config.h.in new file mode 100644 index 0000000000..fb2349568c --- /dev/null +++ b/src/3rdparty/libpng/config.h.in @@ -0,0 +1,86 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + +/* Define to 1 if you have the `z' library (-lz). */ +#undef HAVE_LIBZ + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the `pow' function. */ +#undef HAVE_POW + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if your declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/src/3rdparty/libpng/config.sub b/src/3rdparty/libpng/config.sub new file mode 100644 index 0000000000..2a55a50751 --- /dev/null +++ b/src/3rdparty/libpng/config.sub @@ -0,0 +1,1705 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/3rdparty/libpng/configure.ac b/src/3rdparty/libpng/configure.ac new file mode 100644 index 0000000000..ff277a4d66 --- /dev/null +++ b/src/3rdparty/libpng/configure.ac @@ -0,0 +1,167 @@ +# configure.ac + +dnl Process this file with autoconf to produce a configure script. +dnl +dnl Minor upgrades (compatible ABI): increment the package version +dnl (third field in two places below) and set the PNGLIB_RELEASE +dnl variable. +dnl +dnl Major upgrades (incompatible ABI): increment the package major +dnl version (second field, or first if desired), set the minor +dnl to 0, set PNGLIB_MAJOR below *and* follow the instructions in +dnl Makefile.am to upgrade the package name. + +dnl This is here to prevent earlier autoconf from being used, it +dnl should not be necessary to regenerate configure if the time +dnl stamps are correct +AC_PREREQ(2.59) + +dnl Version number stuff here: + +AC_INIT([libpng], [1.5.1], [png-mng-implement@lists.sourceforge.net]) +AM_INIT_AUTOMAKE +dnl stop configure from automagically running automake +AM_MAINTAINER_MODE + +PNGLIB_VERSION=1.5.1 +PNGLIB_MAJOR=1 +PNGLIB_MINOR=5 +PNGLIB_RELEASE=1 + +dnl End of version number stuff + +AC_CONFIG_SRCDIR([pngget.c]) +AM_CONFIG_HEADER(config.h) + +# Checks for programs. +AC_LANG([C]) +AC_PROG_CC +AC_PROG_LD +AC_PROG_CPP +AC_CHECK_TOOL(SED, sed, :) +AC_CHECK_TOOL(AWK, awk, :) +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +LT_INIT([win32-dll]) + +# On Solaris 10 and 12 CPP gets set to cc -E, however this still +# does some input parsing. We need strict ANSI-C style tokenization, +# check this: +AC_REQUIRE_CPP +AC_MSG_CHECKING([for a C preprocessor that does not parse its input]) +AC_TRY_CPP([1.5.0 16BIT], + [DFNCPP="$CPP"], + [DFNCPP="" + sav_CPP="$CPP" + for CPP in "${CC-cc} -E" "${CC-cc} -E -traditional-cpp" "/lib/cpp" "cpp"; do + AC_TRY_CPP([1.5.0 16BIT], + [DFNCPP="$CPP"] + [break],,) + done + CPP="$sav_CPP"]) +if test -n "$DFNCPP"; then + AC_MSG_RESULT([$DFNCPP]) + AC_SUBST(DFNCPP) +else + AC_MSG_FAILURE([not found], 1) +fi + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([malloc.h stdlib.h string.h strings.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T +AC_STRUCT_TM + +# Checks for library functions. +AC_FUNC_STRTOD +AC_CHECK_FUNCS([memset], , AC_ERROR([memset not found in libc])) +AC_CHECK_FUNCS([pow], , AC_CHECK_LIB(m, pow, , AC_ERROR([cannot find pow])) ) +AC_ARG_WITH(zlib-prefix, + AC_HELP_STRING([--with-zlib-prefix], + [prefix that may have been used in installed zlib]), + [ZPREFIX=${withval}], + [ZPREFIX='z_']) +AC_CHECK_LIB(z, zlibVersion, , + AC_CHECK_LIB(z, ${ZPREFIX}zlibVersion, , + AC_ERROR([zlib not installed]))) + + +LIBPNG_DEFINES=-DPNG_CONFIGURE_LIBPNG +LIBPNG_DEFINES=$LIBPNG_DEFINES +AC_SUBST(LIBPNG_DEFINES) + +AC_MSG_CHECKING([if libraries can be versioned]) +# Special case for PE/COFF platforms: ld reports +# support for version-script, but doesn't actually +# DO anything with it. +case $host in +*cygwin* | *mingw32* | *interix* ) + have_ld_version_script=no + AC_MSG_RESULT(no) +;; +* ) +GLD=`$LD --help < /dev/null 2>/dev/null | grep version-script` +if test "$GLD"; then + have_ld_version_script=yes + AC_MSG_RESULT(yes) +else + have_ld_version_script=no + AC_MSG_RESULT(no) + AC_MSG_WARN(*** You have not enabled versioned symbols.) +fi +;; +esac + +AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes") + +if test "$have_ld_version_script" = "yes"; then + AC_MSG_CHECKING([for symbol prefix]) + SYMBOL_PREFIX=`echo "PREFIX=__USER_LABEL_PREFIX__" \ + | ${CPP-${CC-gcc} -E} - 2>&1 \ + | ${EGREP-grep} "^PREFIX=" \ + | ${SED-sed} "s:^PREFIX=::"` + AC_SUBST(SYMBOL_PREFIX) + AC_MSG_RESULT($SYMBOL_PREFIX) +fi + +# Substitutions for .in files +AC_SUBST(PNGLIB_VERSION) +AC_SUBST(PNGLIB_MAJOR) +AC_SUBST(PNGLIB_MINOR) +AC_SUBST(PNGLIB_RELEASE) + +# Additional arguments (and substitutions) +# Allow the pkg-config directory to be set +AC_ARG_WITH(pkgconfigdir, + AC_HELP_STRING([--with-pkgconfigdir], + [Use the specified pkgconfig dir (default is libdir/pkgconfig)]), + [pkgconfigdir=${withval}], + [pkgconfigdir='${libdir}/pkgconfig']) + +AC_SUBST([pkgconfigdir]) +AC_MSG_NOTICE([pkgconfig directory is ${pkgconfigdir}]) + +# Make the *-config binary config scripts optional +AC_ARG_WITH(binconfigs, + AC_HELP_STRING([--with-binconfigs], + [Generate shell libpng-config scripts as well as pkg-config data] + [@<:@default=yes@:>@]), + [if test "${withval}" = no; then + binconfigs= + AC_MSG_NOTICE([libpng-config scripts will not be built]) + else + binconfigs='${binconfigs}' + fi], + [binconfigs='${binconfigs}']) +AC_SUBST([binconfigs]) + +# Config files, substituting as above +AC_CONFIG_FILES([Makefile libpng.pc:libpng.pc.in]) +AC_CONFIG_FILES([libpng-config:libpng-config.in], + [chmod +x libpng-config]) + +AC_OUTPUT diff --git a/src/3rdparty/libpng/example.c b/src/3rdparty/libpng/example.c new file mode 100644 index 0000000000..cd3682f014 --- /dev/null +++ b/src/3rdparty/libpng/example.c @@ -0,0 +1,843 @@ + +#if 0 /* in case someone actually tries to compile this */ + +/* example.c - an example of using libpng + * Last changed in libpng 1.5.0 [January 6, 2011] + * This file has been placed in the public domain by the authors. + * Maintained 1998-2011 Glenn Randers-Pehrson + * Maintained 1996, 1997 Andreas Dilger) + * Written 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + */ + +/* This is an example of how to use libpng to read and write PNG files. + * The file libpng-manual.txt is much more verbose then this. If you have not + * read it, do so first. This was designed to be a starting point of an + * implementation. This is not officially part of libpng, is hereby placed + * in the public domain, and therefore does not require a copyright notice. + * + * This file does not currently compile, because it is missing certain + * parts, like allocating memory to hold an image. You will have to + * supply these parts to get it to compile. For an example of a minimal + * working PNG reader/writer, see pngtest.c, included in this distribution; + * see also the programs in the contrib directory. + */ + +#include "png.h" + + /* The png_jmpbuf() macro, used in error handling, became available in + * libpng version 1.0.6. If you want to be able to run your code with older + * versions of libpng, you must define the macro yourself (but only if it + * is not already defined by libpng!). + */ + +#ifndef png_jmpbuf +# define png_jmpbuf(png_ptr) ((png_ptr)->png_jmpbuf) +#endif + +/* Check to see if a file is a PNG file using png_sig_cmp(). png_sig_cmp() + * returns zero if the image is a PNG and nonzero if it isn't a PNG. + * + * The function check_if_png() shown here, but not used, returns nonzero (true) + * if the file can be opened and is a PNG, 0 (false) otherwise. + * + * If this call is successful, and you are going to keep the file open, + * you should call png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK); once + * you have created the png_ptr, so that libpng knows your application + * has read that many bytes from the start of the file. Make sure you + * don't call png_set_sig_bytes() with more than 8 bytes read or give it + * an incorrect number of bytes read, or you will either have read too + * many bytes (your fault), or you are telling libpng to read the wrong + * number of magic bytes (also your fault). + * + * Many applications already read the first 2 or 4 bytes from the start + * of the image to determine the file type, so it would be easiest just + * to pass the bytes to png_sig_cmp() or even skip that if you know + * you have a PNG file, and call png_set_sig_bytes(). + */ +#define PNG_BYTES_TO_CHECK 4 +int check_if_png(char *file_name, FILE **fp) +{ + char buf[PNG_BYTES_TO_CHECK]; + + /* Open the prospective PNG file. */ + if ((*fp = fopen(file_name, "rb")) == NULL) + return 0; + + /* Read in some of the signature bytes */ + if (fread(buf, 1, PNG_BYTES_TO_CHECK, *fp) != PNG_BYTES_TO_CHECK) + return 0; + + /* Compare the first PNG_BYTES_TO_CHECK bytes of the signature. + Return nonzero (true) if they match */ + + return(!png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK)); +} + +/* Read a PNG file. You may want to return an error code if the read + * fails (depending upon the failure). There are two "prototypes" given + * here - one where we are given the filename, and we need to open the + * file, and the other where we are given an open file (possibly with + * some or all of the magic bytes read - see comments above). + */ +#ifdef open_file /* prototype 1 */ +void read_png(char *file_name) /* We need to open the file */ +{ + png_structp png_ptr; + png_infop info_ptr; + unsigned int sig_read = 0; + png_uint_32 width, height; + int bit_depth, color_type, interlace_type; + FILE *fp; + + if ((fp = fopen(file_name, "rb")) == NULL) + return (ERROR); + +#else no_open_file /* prototype 2 */ +void read_png(FILE *fp, unsigned int sig_read) /* File is already open */ +{ + png_structp png_ptr; + png_infop info_ptr; + png_uint_32 width, height; + int bit_depth, color_type, interlace_type; +#endif no_open_file /* Only use one prototype! */ + + /* Create and initialize the png_struct with the desired error handler + * functions. If you want to use the default stderr and longjump method, + * you can supply NULL for the last three parameters. We also supply the + * the compiler header file version, so that we know if the application + * was compiled with a compatible version of the library. REQUIRED + */ + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, + png_voidp user_error_ptr, user_error_fn, user_warning_fn); + + if (png_ptr == NULL) + { + fclose(fp); + return (ERROR); + } + + /* Allocate/initialize the memory for image information. REQUIRED. */ + info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == NULL) + { + fclose(fp); + png_destroy_read_struct(&png_ptr, NULL, NULL); + return (ERROR); + } + + /* Set error handling if you are using the setjmp/longjmp method (this is + * the normal method of doing things with libpng). REQUIRED unless you + * set up your own error handlers in the png_create_read_struct() earlier. + */ + + if (setjmp(png_jmpbuf(png_ptr))) + { + /* Free all of the memory associated with the png_ptr and info_ptr */ + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + fclose(fp); + /* If we get here, we had a problem reading the file */ + return (ERROR); + } + + /* One of the following I/O initialization methods is REQUIRED */ +#ifdef streams /* PNG file I/O method 1 */ + /* Set up the input control if you are using standard C streams */ + png_init_io(png_ptr, fp); + +#else no_streams /* PNG file I/O method 2 */ + /* If you are using replacement read functions, instead of calling + * png_init_io() here you would call: + */ + png_set_read_fn(png_ptr, (void *)user_io_ptr, user_read_fn); + /* where user_io_ptr is a structure you want available to the callbacks */ +#endif no_streams /* Use only one I/O method! */ + + /* If we have already read some of the signature */ + png_set_sig_bytes(png_ptr, sig_read); + +#ifdef hilevel + /* + * If you have enough memory to read in the entire image at once, + * and you need to specify only transforms that can be controlled + * with one of the PNG_TRANSFORM_* bits (this presently excludes + * quantizing, filling, setting background, and doing gamma + * adjustment), then you can read the entire image (including + * pixels) into the info structure with this call: + */ + png_read_png(png_ptr, info_ptr, png_transforms, NULL); + +#else + /* OK, you're doing it the hard way, with the lower-level functions */ + + /* The call to png_read_info() gives us all of the information from the + * PNG file before the first IDAT (image data chunk). REQUIRED + */ + png_read_info(png_ptr, info_ptr); + + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, + &interlace_type, NULL, NULL); + + /* Set up the data transformations you want. Note that these are all + * optional. Only call them if you want/need them. Many of the + * transformations only work on specific types of images, and many + * are mutually exclusive. + */ + + /* Tell libpng to strip 16 bit/color files down to 8 bits/color */ + png_set_strip_16(png_ptr); + + /* Strip alpha bytes from the input data without combining with the + * background (not recommended). + */ + png_set_strip_alpha(png_ptr); + + /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single + * byte into separate bytes (useful for paletted and grayscale images). + */ + png_set_packing(png_ptr); + + /* Change the order of packed pixels to least significant bit first + * (not useful if you are using png_set_packing). */ + png_set_packswap(png_ptr); + + /* Expand paletted colors into true RGB triplets */ + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + + /* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */ + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand_gray_1_2_4_to_8(png_ptr); + + /* Expand paletted or RGB images with transparency to full alpha channels + * so the data will be available as RGBA quartets. + */ + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(png_ptr); + + /* Set the background color to draw transparent and alpha images over. + * It is possible to set the red, green, and blue components directly + * for paletted images instead of supplying a palette index. Note that + * even if the PNG file supplies a background, you are not required to + * use it - you should use the (solid) application background if it has one. + */ + + png_color_16 my_background, *image_background; + + if (png_get_bKGD(png_ptr, info_ptr, &image_background)) + png_set_background(png_ptr, image_background, + PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + else + png_set_background(png_ptr, &my_background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + + /* Some suggestions as to how to get a screen gamma value + * + * Note that screen gamma is the display_exponent, which includes + * the CRT_exponent and any correction for viewing conditions + */ + if (/* We have a user-defined screen gamma value */) + { + screen_gamma = user-defined screen_gamma; + } + /* This is one way that applications share the same screen gamma value */ + else if ((gamma_str = getenv("SCREEN_GAMMA")) != NULL) + { + screen_gamma = atof(gamma_str); + } + /* If we don't have another value */ + else + { + screen_gamma = 2.2; /* A good guess for a PC monitor in a dimly + lit room */ + screen_gamma = 1.7 or 1.0; /* A good guess for Mac systems */ + } + + /* Tell libpng to handle the gamma conversion for you. The final call + * is a good guess for PC generated images, but it should be configurable + * by the user at run time by the user. It is strongly suggested that + * your application support gamma correction. + */ + + int intent; + + if (png_get_sRGB(png_ptr, info_ptr, &intent)) + png_set_gamma(png_ptr, screen_gamma, 0.45455); + else + { + double image_gamma; + if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) + png_set_gamma(png_ptr, screen_gamma, image_gamma); + else + png_set_gamma(png_ptr, screen_gamma, 0.45455); + } + +#ifdef PNG_READ_QUANTIZE_SUPPORTED + /* Quantize RGB files down to 8 bit palette or reduce palettes + * to the number of colors available on your screen. + */ + if (color_type & PNG_COLOR_MASK_COLOR) + { + int num_palette; + png_colorp palette; + + /* This reduces the image to the application supplied palette */ + if (/* We have our own palette */) + { + /* An array of colors to which the image should be quantized */ + png_color std_color_cube[MAX_SCREEN_COLORS]; + + png_set_quantize(png_ptr, std_color_cube, MAX_SCREEN_COLORS, + MAX_SCREEN_COLORS, NULL, 0); + } + /* This reduces the image to the palette supplied in the file */ + else if (png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette)) + { + png_uint_16p histogram = NULL; + + png_get_hIST(png_ptr, info_ptr, &histogram); + + png_set_quantize(png_ptr, palette, num_palette, + max_screen_colors, histogram, 0); + } + } +#endif /* PNG_READ_QUANTIZE_SUPPORTED */ + + /* Invert monochrome files to have 0 as white and 1 as black */ + png_set_invert_mono(png_ptr); + + /* If you want to shift the pixel values from the range [0,255] or + * [0,65535] to the original [0,7] or [0,31], or whatever range the + * colors were originally in: + */ + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) + { + png_color_8p sig_bit_p; + + png_get_sBIT(png_ptr, info_ptr, &sig_bit_p); + png_set_shift(png_ptr, sig_bit_p); + } + + /* Flip the RGB pixels to BGR (or RGBA to BGRA) */ + if (color_type & PNG_COLOR_MASK_COLOR) + png_set_bgr(png_ptr); + + /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */ + png_set_swap_alpha(png_ptr); + + /* Swap bytes of 16 bit files to least significant byte first */ + png_set_swap(png_ptr); + + /* Add filler (or alpha) byte (before/after each RGB triplet) */ + png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); + + /* Turn on interlace handling. REQUIRED if you are not using + * png_read_image(). To see how to handle interlacing passes, + * see the png_read_row() method below: + */ + number_passes = png_set_interlace_handling(png_ptr); + + /* Optional call to gamma correct and add the background to the palette + * and update info structure. REQUIRED if you are expecting libpng to + * update the palette for you (ie you selected such a transform above). + */ + png_read_update_info(png_ptr, info_ptr); + + /* Allocate the memory to hold the image using the fields of info_ptr. */ + + /* The easiest way to read the image: */ + png_bytep row_pointers[height]; + + /* Clear the pointer array */ + for (row = 0; row < height; row++) + row_pointers[row] = NULL; + + for (row = 0; row < height; row++) + row_pointers[row] = png_malloc(png_ptr, png_get_rowbytes(png_ptr, + info_ptr)); + + /* Now it's time to read the image. One of these methods is REQUIRED */ +#ifdef entire /* Read the entire image in one go */ + png_read_image(png_ptr, row_pointers); + +#else no_entire /* Read the image one or more scanlines at a time */ + /* The other way to read images - deal with interlacing: */ + + for (pass = 0; pass < number_passes; pass++) + { +#ifdef single /* Read the image a single row at a time */ + for (y = 0; y < height; y++) + { + png_read_rows(png_ptr, &row_pointers[y], NULL, 1); + } + +#else no_single /* Read the image several rows at a time */ + for (y = 0; y < height; y += number_of_rows) + { +#ifdef sparkle /* Read the image using the "sparkle" effect. */ + png_read_rows(png_ptr, &row_pointers[y], NULL, + number_of_rows); +#else no_sparkle /* Read the image using the "rectangle" effect */ + png_read_rows(png_ptr, NULL, &row_pointers[y], + number_of_rows); +#endif no_sparkle /* Use only one of these two methods */ + } + + /* If you want to display the image after every pass, do so here */ +#endif no_single /* Use only one of these two methods */ + } +#endif no_entire /* Use only one of these two methods */ + + /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */ + png_read_end(png_ptr, info_ptr); +#endif hilevel + + /* At this point you have read the entire image */ + + /* Clean up after the read, and free any memory allocated - REQUIRED */ + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + + /* Close the file */ + fclose(fp); + + /* That's it */ + return (OK); +} + +/* Progressively read a file */ + +int +initialize_png_reader(png_structp *png_ptr, png_infop *info_ptr) +{ + /* Create and initialize the png_struct with the desired error handler + * functions. If you want to use the default stderr and longjump method, + * you can supply NULL for the last three parameters. We also check that + * the library version is compatible in case we are using dynamically + * linked libraries. + */ + *png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, + png_voidp user_error_ptr, user_error_fn, user_warning_fn); + + if (*png_ptr == NULL) + { + *info_ptr = NULL; + return (ERROR); + } + + *info_ptr = png_create_info_struct(png_ptr); + + if (*info_ptr == NULL) + { + png_destroy_read_struct(png_ptr, info_ptr, NULL); + return (ERROR); + } + + if (setjmp(png_jmpbuf((*png_ptr)))) + { + png_destroy_read_struct(png_ptr, info_ptr, NULL); + return (ERROR); + } + + /* This one's new. You will need to provide all three + * function callbacks, even if you aren't using them all. + * If you aren't using all functions, you can specify NULL + * parameters. Even when all three functions are NULL, + * you need to call png_set_progressive_read_fn(). + * These functions shouldn't be dependent on global or + * static variables if you are decoding several images + * simultaneously. You should store stream specific data + * in a separate struct, given as the second parameter, + * and retrieve the pointer from inside the callbacks using + * the function png_get_progressive_ptr(png_ptr). + */ + png_set_progressive_read_fn(*png_ptr, (void *)stream_data, + info_callback, row_callback, end_callback); + + return (OK); +} + +int +process_data(png_structp *png_ptr, png_infop *info_ptr, + png_bytep buffer, png_uint_32 length) +{ + if (setjmp(png_jmpbuf((*png_ptr)))) + { + /* Free the png_ptr and info_ptr memory on error */ + png_destroy_read_struct(png_ptr, info_ptr, NULL); + return (ERROR); + } + + /* This one's new also. Simply give it chunks of data as + * they arrive from the data stream (in order, of course). + * On segmented machines, don't give it any more than 64K. + * The library seems to run fine with sizes of 4K, although + * you can give it much less if necessary (I assume you can + * give it chunks of 1 byte, but I haven't tried with less + * than 256 bytes yet). When this function returns, you may + * want to display any rows that were generated in the row + * callback, if you aren't already displaying them there. + */ + png_process_data(*png_ptr, *info_ptr, buffer, length); + return (OK); +} + +info_callback(png_structp png_ptr, png_infop info) +{ + /* Do any setup here, including setting any of the transformations + * mentioned in the Reading PNG files section. For now, you _must_ + * call either png_start_read_image() or png_read_update_info() + * after all the transformations are set (even if you don't set + * any). You may start getting rows before png_process_data() + * returns, so this is your last chance to prepare for that. + */ +} + +row_callback(png_structp png_ptr, png_bytep new_row, + png_uint_32 row_num, int pass) +{ + /* + * This function is called for every row in the image. If the + * image is interlaced, and you turned on the interlace handler, + * this function will be called for every row in every pass. + * + * In this function you will receive a pointer to new row data from + * libpng called new_row that is to replace a corresponding row (of + * the same data format) in a buffer allocated by your application. + * + * The new row data pointer "new_row" may be NULL, indicating there is + * no new data to be replaced (in cases of interlace loading). + * + * If new_row is not NULL then you need to call + * png_progressive_combine_row() to replace the corresponding row as + * shown below: + */ + + /* Get pointer to corresponding row in our + * PNG read buffer. + */ + png_bytep old_row = ((png_bytep *)our_data)[row_num]; + + /* If both rows are allocated then copy the new row + * data to the corresponding row data. + */ + if ((old_row != NULL) && (new_row != NULL)) + png_progressive_combine_row(png_ptr, old_row, new_row); + + /* + * The rows and passes are called in order, so you don't really + * need the row_num and pass, but I'm supplying them because it + * may make your life easier. + * + * For the non-NULL rows of interlaced images, you must call + * png_progressive_combine_row() passing in the new row and the + * old row, as demonstrated above. You can call this function for + * NULL rows (it will just return) and for non-interlaced images + * (it just does the png_memcpy for you) if it will make the code + * easier. Thus, you can just do this for all cases: + */ + + png_progressive_combine_row(png_ptr, old_row, new_row); + + /* where old_row is what was displayed for previous rows. Note + * that the first pass (pass == 0 really) will completely cover + * the old row, so the rows do not have to be initialized. After + * the first pass (and only for interlaced images), you will have + * to pass the current row as new_row, and the function will combine + * the old row and the new row. + */ +} + +end_callback(png_structp png_ptr, png_infop info) +{ + /* This function is called when the whole image has been read, + * including any chunks after the image (up to and including + * the IEND). You will usually have the same info chunk as you + * had in the header, although some data may have been added + * to the comments and time fields. + * + * Most people won't do much here, perhaps setting a flag that + * marks the image as finished. + */ +} + +/* Write a png file */ +void write_png(char *file_name /* , ... other image information ... */) +{ + FILE *fp; + png_structp png_ptr; + png_infop info_ptr; + png_colorp palette; + + /* Open the file */ + fp = fopen(file_name, "wb"); + if (fp == NULL) + return (ERROR); + + /* Create and initialize the png_struct with the desired error handler + * functions. If you want to use the default stderr and longjump method, + * you can supply NULL for the last three parameters. We also check that + * the library version is compatible with the one used at compile time, + * in case we are using dynamically linked libraries. REQUIRED. + */ + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, + png_voidp user_error_ptr, user_error_fn, user_warning_fn); + + if (png_ptr == NULL) + { + fclose(fp); + return (ERROR); + } + + /* Allocate/initialize the image information data. REQUIRED */ + info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == NULL) + { + fclose(fp); + png_destroy_write_struct(&png_ptr, NULL); + return (ERROR); + } + + /* Set error handling. REQUIRED if you aren't supplying your own + * error handling functions in the png_create_write_struct() call. + */ + if (setjmp(png_jmpbuf(png_ptr))) + { + /* If we get here, we had a problem writing the file */ + fclose(fp); + png_destroy_write_struct(&png_ptr, &info_ptr); + return (ERROR); + } + + /* One of the following I/O initialization functions is REQUIRED */ + +#ifdef streams /* I/O initialization method 1 */ + /* Set up the output control if you are using standard C streams */ + png_init_io(png_ptr, fp); + +#else no_streams /* I/O initialization method 2 */ + /* If you are using replacement write functions, instead of calling + * png_init_io() here you would call + */ + png_set_write_fn(png_ptr, (void *)user_io_ptr, user_write_fn, + user_IO_flush_function); + /* where user_io_ptr is a structure you want available to the callbacks */ +#endif no_streams /* Only use one initialization method */ + +#ifdef hilevel + /* This is the easy way. Use it if you already have all the + * image info living in the structure. You could "|" many + * PNG_TRANSFORM flags into the png_transforms integer here. + */ + png_write_png(png_ptr, info_ptr, png_transforms, NULL); + +#else + /* This is the hard way */ + + /* Set the image information here. Width and height are up to 2^31, + * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on + * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY, + * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, + * or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or + * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST + * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. REQUIRED + */ + png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, PNG_COLOR_TYPE_???, + PNG_INTERLACE_????, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + /* Set the palette if there is one. REQUIRED for indexed-color images */ + palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH + * png_sizeof(png_color)); + /* ... Set palette colors ... */ + png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH); + /* You must not free palette here, because png_set_PLTE only makes a link to + * the palette that you malloced. Wait until you are about to destroy + * the png structure. + */ + + /* Optional significant bit (sBIT) chunk */ + png_color_8 sig_bit; + + /* If we are dealing with a grayscale image then */ + sig_bit.gray = true_bit_depth; + + /* Otherwise, if we are dealing with a color image then */ + sig_bit.red = true_red_bit_depth; + sig_bit.green = true_green_bit_depth; + sig_bit.blue = true_blue_bit_depth; + + /* If the image has an alpha channel then */ + sig_bit.alpha = true_alpha_bit_depth; + + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + + + /* Optional gamma chunk is strongly suggested if you have any guess + * as to the correct gamma of the image. + */ + png_set_gAMA(png_ptr, info_ptr, gamma); + + /* Optionally write comments into the image */ + text_ptr[0].key = "Title"; + text_ptr[0].text = "Mona Lisa"; + text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr[0].itxt_length = 0; + text_ptr[0].lang = NULL; + text_ptr[0].lang_key = NULL; + text_ptr[1].key = "Author"; + text_ptr[1].text = "Leonardo DaVinci"; + text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr[1].itxt_length = 0; + text_ptr[1].lang = NULL; + text_ptr[1].lang_key = NULL; + text_ptr[2].key = "Description"; + text_ptr[2].text = ""; + text_ptr[2].compression = PNG_TEXT_COMPRESSION_zTXt; + text_ptr[2].itxt_length = 0; + text_ptr[2].lang = NULL; + text_ptr[2].lang_key = NULL; + png_set_text(png_ptr, info_ptr, text_ptr, 3); + + /* Other optional chunks like cHRM, bKGD, tRNS, tIME, oFFs, pHYs */ + + /* Note that if sRGB is present the gAMA and cHRM chunks must be ignored + * on read and, if your application chooses to write them, they must + * be written in accordance with the sRGB profile + */ + + /* Write the file header information. REQUIRED */ + png_write_info(png_ptr, info_ptr); + + /* If you want, you can write the info in two steps, in case you need to + * write your private chunk ahead of PLTE: + * + * png_write_info_before_PLTE(write_ptr, write_info_ptr); + * write_my_chunk(); + * png_write_info(png_ptr, info_ptr); + * + * However, given the level of known- and unknown-chunk support in 1.2.0 + * and up, this should no longer be necessary. + */ + + /* Once we write out the header, the compression type on the text + * chunks gets changed to PNG_TEXT_COMPRESSION_NONE_WR or + * PNG_TEXT_COMPRESSION_zTXt_WR, so it doesn't get written out again + * at the end. + */ + + /* Set up the transformations you want. Note that these are + * all optional. Only call them if you want them. + */ + + /* Invert monochrome pixels */ + png_set_invert_mono(png_ptr); + + /* Shift the pixels up to a legal bit depth and fill in + * as appropriate to correctly scale the image. + */ + png_set_shift(png_ptr, &sig_bit); + + /* Pack pixels into bytes */ + png_set_packing(png_ptr); + + /* Swap location of alpha bytes from ARGB to RGBA */ + png_set_swap_alpha(png_ptr); + + /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into + * RGB (4 channels -> 3 channels). The second parameter is not used. + */ + png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); + + /* Flip BGR pixels to RGB */ + png_set_bgr(png_ptr); + + /* Swap bytes of 16-bit files to most significant byte first */ + png_set_swap(png_ptr); + + /* Swap bits of 1, 2, 4 bit packed pixel formats */ + png_set_packswap(png_ptr); + + /* Turn on interlace handling if you are not using png_write_image() */ + if (interlacing) + number_passes = png_set_interlace_handling(png_ptr); + + else + number_passes = 1; + + /* The easiest way to write the image (you may have a different memory + * layout, however, so choose what fits your needs best). You need to + * use the first method if you aren't handling interlacing yourself. + */ + png_uint_32 k, height, width; + png_byte image[height][width*bytes_per_pixel]; + png_bytep row_pointers[height]; + + if (height > PNG_UINT_32_MAX/png_sizeof(png_bytep)) + png_error (png_ptr, "Image is too tall to process in memory"); + + for (k = 0; k < height; k++) + row_pointers[k] = image + k*width*bytes_per_pixel; + + /* One of the following output methods is REQUIRED */ + +#ifdef entire /* Write out the entire image data in one call */ + png_write_image(png_ptr, row_pointers); + + /* The other way to write the image - deal with interlacing */ + +#else no_entire /* Write out the image data by one or more scanlines */ + + /* The number of passes is either 1 for non-interlaced images, + * or 7 for interlaced images. + */ + for (pass = 0; pass < number_passes; pass++) + { + /* Write a few rows at a time. */ + png_write_rows(png_ptr, &row_pointers[first_row], number_of_rows); + + /* If you are only writing one row at a time, this works */ + for (y = 0; y < height; y++) + png_write_rows(png_ptr, &row_pointers[y], 1); + } +#endif no_entire /* Use only one output method */ + + /* You can write optional chunks like tEXt, zTXt, and tIME at the end + * as well. Shouldn't be necessary in 1.2.0 and up as all the public + * chunks are supported and you can use png_set_unknown_chunks() to + * register unknown chunks into the info structure to be written out. + */ + + /* It is REQUIRED to call this to finish writing the rest of the file */ + png_write_end(png_ptr, info_ptr); +#endif hilevel + + /* If you png_malloced a palette, free it here (don't free info_ptr->palette, + * as recommended in versions 1.0.5m and earlier of this example; if + * libpng mallocs info_ptr->palette, libpng will free it). If you + * allocated it with malloc() instead of png_malloc(), use free() instead + * of png_free(). + */ + png_free(png_ptr, palette); + palette = NULL; + + /* Similarly, if you png_malloced any data that you passed in with + * png_set_something(), such as a hist or trans array, free it here, + * when you can be sure that libpng is through with it. + */ + png_free(png_ptr, trans); + trans = NULL; + /* Whenever you use png_free() it is a good idea to set the pointer to + * NULL in case your application inadvertently tries to png_free() it + * again. When png_free() sees a NULL it returns without action, thus + * avoiding the double-free security problem. + */ + + /* Clean up after the write, and free any memory allocated */ + png_destroy_write_struct(&png_ptr, &info_ptr); + + /* Close the file */ + fclose(fp); + + /* That's it */ + return (OK); +} + +#endif /* if 0 */ diff --git a/src/3rdparty/libpng/libpng-manual.txt b/src/3rdparty/libpng/libpng-manual.txt new file mode 100644 index 0000000000..77adf7aec8 --- /dev/null +++ b/src/3rdparty/libpng/libpng-manual.txt @@ -0,0 +1,4136 @@ +libpng-manual.txt - A description on how to use and modify libpng + + libpng version 1.5.1 - February 3, 2011 + Updated and distributed by Glenn Randers-Pehrson + + Copyright (c) 1998-2011 Glenn Randers-Pehrson + + This document is released under the libpng license. + For conditions of distribution and use, see the disclaimer + and license in png.h + + Based on: + + libpng versions 0.97, January 1998, through 1.5.1 - February 3, 2011 + Updated and distributed by Glenn Randers-Pehrson + Copyright (c) 1998-2011 Glenn Randers-Pehrson + + libpng 1.0 beta 6 version 0.96 May 28, 1997 + Updated and distributed by Andreas Dilger + Copyright (c) 1996, 1997 Andreas Dilger + + libpng 1.0 beta 2 - version 0.88 January 26, 1996 + For conditions of distribution and use, see copyright + notice in png.h. Copyright (c) 1995, 1996 Guy Eric + Schalnat, Group 42, Inc. + + Updated/rewritten per request in the libpng FAQ + Copyright (c) 1995, 1996 Frank J. T. Wojcik + December 18, 1995 & January 20, 1996 + +I. Introduction + +This file describes how to use and modify the PNG reference library +(known as libpng) for your own use. There are five sections to this +file: introduction, structures, reading, writing, and modification and +configuration notes for various special platforms. In addition to this +file, example.c is a good starting point for using the library, as +it is heavily commented and should include everything most people +will need. We assume that libpng is already installed; see the +INSTALL file for instructions on how to install libpng. + +For examples of libpng usage, see the files "example.c", "pngtest.c", +and the files in the "contrib" directory, all of which are included in +the libpng distribution. + +Libpng was written as a companion to the PNG specification, as a way +of reducing the amount of time and effort it takes to support the PNG +file format in application programs. + +The PNG specification (second edition), November 2003, is available as +a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at +. It is technically equivalent +to the PNG specification (second edition) but has some additional material. + +The PNG-1.0 specification is available +as RFC 2083 and as a +W3C Recommendation . + +Some additional chunks are described in the special-purpose public chunks +documents at . + +Other information +about PNG, and the latest version of libpng, can be found at the PNG home +page, . + +Most users will not have to modify the library significantly; advanced +users may want to modify it more. All attempts were made to make it as +complete as possible, while keeping the code easy to understand. +Currently, this library only supports C. Support for other languages +is being considered. + +Libpng has been designed to handle multiple sessions at one time, +to be easily modifiable, to be portable to the vast majority of +machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy +to use. The ultimate goal of libpng is to promote the acceptance of +the PNG file format in whatever way possible. While there is still +work to be done (see the TODO file), libpng should cover the +majority of the needs of its users. + +Libpng uses zlib for its compression and decompression of PNG files. +Further information about zlib, and the latest version of zlib, can +be found at the zlib home page, . +The zlib compression utility is a general purpose utility that is +useful for more than PNG files, and can be used without libpng. +See the documentation delivered with zlib for more details. +You can usually find the source files for the zlib utility wherever you +find the libpng source files. + +Libpng is thread safe, provided the threads are using different +instances of the structures. Each thread should have its own +png_struct and png_info instances, and thus its own image. +Libpng does not protect itself against two threads using the +same instance of a structure. + +II. Structures + +There are two main structures that are important to libpng, png_struct +and png_info. Both are internal structures that are no longer exposed +in the libpng interface (as of libpng 1.5.0). + +The png_info structure is designed to provide information about the +PNG file. At one time, the fields of png_info were intended to be +directly accessible to the user. However, this tended to cause problems +with applications using dynamically loaded libraries, and as a result +a set of interface functions for png_info (the png_get_*() and png_set_*() +functions) was developed. + +The png_struct structure is the object used by the library to decode a +single image. As of 1.5.0 this structure is also not exposed. + +Almost all libpng APIs require a pointer to a png_struct as the first argument. +Many (in particular the png_set and png_get APIs) also require a pointer +to png_info as the second argument. Some application visible macros +defined in png.h designed for basic data access (reading and writing +integers in the PNG format) break this rule, but it's almost always safe +to assume that a (png_struct*) has to be passed to call an API function. + +The png.h header file is an invaluable reference for programming with libpng. +And while I'm on the topic, make sure you include the libpng header file: + +#include + +Types + +The png.h header file defines a number of integral types used by the +APIs. Most of these are fairly obvious; for example types corresponding +to integers of particular sizes and types for passing color values. + +One exception is how non-integral numbers are handled. For application +convenience most APIs that take such numbers have C (double) arguments, +however internally PNG, and libpng, use 32 bit signed integers and encode +the value by multiplying by 100,000. As of libpng 1.5.0 a convenience +macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point) +which is simply (png_int_32). + +All APIs that take (double) arguments also have an matching API that +takes the corresponding fixed point integer arguments. The fixed point +API has the same name as the floating point one with _fixed appended. +The actual range of values permitted in the APIs is frequently less than +the full range of (png_fixed_point) (-21474 to +21474). When APIs require +a non-negative argument the type is recorded as png_uint_32 above. Consult +the header file and the text below for more information. + +Special care must be take with sCAL chunk handling because the chunk itself +uses non-integral values encoded as strings containing decimal floating point +numbers. See the comments in the header file. + +Configuration + +The main header file function declarations are frequently protected by C +preprocessing directives of the form: + + #ifdef PNG_feature_SUPPORTED + declare-function + #endif + +The library can be built without support for these APIs, although a +standard build will have all implemented APIs. Application programs +should check the feature macros before using an API for maximum +portability. From libpng 1.5.0 the feature macros set during the build +of libpng are recorded in the header file "pnglibconf.h" and this file +is always included by png.h. + +If you don't need to change the library configuration from the default skip to +the next section ("Reading"). + +Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all +of the build project files in the 'projects' directory simply copy +scripts/pnglibconf.h.prebuilt to pnglibconf.h. This means that these build +systems do not permit easy auto-configuration of the library - they only +support the default configuration. + +The easiest way to make minor changes to the libpng configuration when +auto-configuration is supported is to add definitions to the command line +using (typically) CPPFLAGS. For example: + +CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC + +will change the internal libpng math implementation for gamma correction and +other arithmetic calculations to fixed point, avoiding the need for fast +floating point support. The result can be seen in the generated pnglibconf.h - +make sure it contains the changed feature macro setting. + +If you need to make more extensive configuration changes - more than one or two +feature macro settings - you can either add -DPNG_USER_CONFIG to the build +command line and put a list of feature macro settings in pngusr.h or you can set +DFA_XTRA (a makefile variable) to a file containing the same information in the +form of 'option' settings. + +A. Changing pnglibconf.h + +A variety of methods exist to build libpng. Not all of these support +reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be +rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand. + +Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt and changing +the lines defining the supported features, paying very close attention to the +'option' information in scripts/pnglibconf.dfa that describes those features and +their requirements. This is easy to get wrong. + +B. Configuration using DFA_XTRA + +Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later +variant such as 'nawk' or 'gawk', is available. The configure build will +automatically find an appropriate awk and build pnglibconf.h. +scripts/pnglibconf.mak contains a set of make rules for doing the same thing if +configure is not used, and many of the makefiles in the scripts directory use +this approach. + +When rebuilding simply write new file containing changed options and set +DFA_XTRA to the name of this file. This causes the build to append the new file +to the end of scripts/pnglibconf.dfa. pngusr.dfa should contain lines of the +following forms: + +everything = off + +This turns all optional features off. Include it at the start of pngusr.dfa to +make it easier to build a minimal configuration. You will need to turn at least +some features on afterward to enable either reading or writing code, or both. + +option feature on +option feature off + +Enable or disable a single feature. This will automatically enable other +features required by a feature that is turned on or disable other features that +require a feature which is turned off. Conflicting settings will cause an error +message to be emitted by awk. + +setting feature default value + +Changes the default value of setting 'feature' to 'value'. There are a small +number of settings listed at the top of pnglibconf.h, they are documented in the +source code. Most of these values have performance implications for the library +but most of them have no visible effect on the API. Some can also be overridden +from the API. + +C. Configuration using PNG_USR_CONFIG + +If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file +pngusr.h will automatically be included before the options in +scripts/pnglibconf.dfa are processed. pngusr.h should contain only macro +definitions turning features on or off or setting settings. + +Apart from the global setting "everything = off" all the options listed above +can be set using macros in pngusr.h: + +#define PNG_feature_SUPPORTED + +is equivalent to: + +option feature on + +#define PNG_NO_feature + +is equivalent to: + +option feature off + +#define PNG_feature value + +is equivalent to: + +setting feature default value + +Notice that in both cases, pngusr.dfa and pngusr.h, the contents of the +pngusr file you supply override the contents of scripts/pnglibconf.dfa + +If confusing or incomprehensible behavior results it is possible to +examine the intermediate file pnglibconf.dfn to find the full set of +dependency information for each setting and option. Simply locate the +feature in the file and read the C comments that precede it. + +III. Reading + +We'll now walk you through the possible functions to call when reading +in a PNG file sequentially, briefly explaining the syntax and purpose +of each one. See example.c and png.h for more detail. While +progressive reading is covered in the next section, you will still +need some of the functions discussed in this section to read a PNG +file. + +Setup + +You will want to do the I/O initialization(*) before you get into libpng, +so if it doesn't work, you don't have much to undo. Of course, you +will also want to insure that you are, in fact, dealing with a PNG +file. Libpng provides a simple check to see if a file is a PNG file. +To use it, pass in the first 1 to 8 bytes of the file to the function +png_sig_cmp(), and it will return 0 (false) if the bytes match the +corresponding bytes of the PNG signature, or nonzero (true) otherwise. +Of course, the more bytes you pass in, the greater the accuracy of the +prediction. + +If you are intending to keep the file pointer open for use in libpng, +you must ensure you don't read more than 8 bytes from the beginning +of the file, and you also have to make a call to png_set_sig_bytes_read() +with the number of bytes you read from the beginning. Libpng will +then only check the bytes (if any) that your program didn't read. + +(*): If you are not using the standard I/O functions, you will need +to replace them with custom functions. See the discussion under +Customizing libpng. + + + FILE *fp = fopen(file_name, "rb"); + if (!fp) + { + return (ERROR); + } + + fread(header, 1, number, fp); + is_png = !png_sig_cmp(header, 0, number); + + if (!is_png) + { + return (NOT_PNG); + } + + +Next, png_struct and png_info need to be allocated and initialized. In +order to ensure that the size of these structures is correct even with a +dynamically linked libpng, there are functions to initialize and +allocate the structures. We also pass the library version, optional +pointers to error handling functions, and a pointer to a data struct for +use by the error functions, if necessary (the pointer and functions can +be NULL if the default error handlers are to be used). See the section +on Changes to Libpng below regarding the old initialization functions. +The structure allocation functions quietly return NULL if they fail to +create the structure, so your application should check for that. + + png_structp png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, + (png_infopp)NULL, (png_infopp)NULL); + return (ERROR); + } + + png_infop end_info = png_create_info_struct(png_ptr); + + if (!end_info) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use +png_create_read_struct_2() instead of png_create_read_struct(): + + png_structp png_ptr = png_create_read_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +The error handling routines passed to png_create_read_struct() +and the memory alloc/free routines passed to png_create_struct_2() +are only necessary if you are not using the libpng supplied error +handling and memory alloc/free functions. + +When libpng encounters an error, it expects to longjmp back +to your routine. Therefore, you will need to call setjmp and pass +your png_jmpbuf(png_ptr). If you read the file from different +routines, you will need to update the jmpbuf field every time you enter +a new routine that will call a png_*() function. + +See your documentation of setjmp/longjmp for your compiler for more +information on setjmp/longjmp. See the discussion on libpng error +handling in the Customizing Libpng section below for more information +on the libpng error handling. If an error occurs, and libpng longjmp's +back to your setjmp, you will want to call png_destroy_read_struct() to +free any memory. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + fclose(fp); + return (ERROR); + } + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_NO_SETJMP, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +You can #define PNG_ABORT() to a function that does something +more useful than abort(), as long as your function does not +return. + +Now you need to set up the input code. The default for libpng is to +use the C function fread(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. If you wish to handle reading data in another +way, you need not call the png_init_io() function, but you must then +implement the libpng I/O methods discussed in the Customizing Libpng +section below. + + png_init_io(png_ptr, fp); + +If you had previously opened the file and read any of the signature from +the beginning in order to see if this was a PNG file, you need to let +libpng know that there are some bytes missing from the start of the file. + + png_set_sig_bytes(png_ptr, number); + +You can change the zlib compression buffer size to be used while +reading compressed data with + + png_set_compression_buffer_size(png_ptr, buffer_size); + +where the default size is 8192 bytes. Note that the buffer size +is changed immediately and the buffer is reallocated immediately, +instead of setting a flag to be acted upon later. + +If you want CRC errors to be handled in a different manner than +the default, use + + png_set_crc_action(png_ptr, crit_action, ancil_action); + +The values for png_set_crc_action() say how libpng is to handle CRC errors in +ancillary and critical chunks, and whether to use the data contained +therein. Note that it is impossible to "discard" data in a critical +chunk. + +Choices for (int) crit_action are + PNG_CRC_DEFAULT 0 error/quit + PNG_CRC_ERROR_QUIT 1 error/quit + PNG_CRC_WARN_USE 3 warn/use data + PNG_CRC_QUIET_USE 4 quiet/use data + PNG_CRC_NO_CHANGE 5 use the current value + +Choices for (int) ancil_action are + PNG_CRC_DEFAULT 0 error/quit + PNG_CRC_ERROR_QUIT 1 error/quit + PNG_CRC_WARN_DISCARD 2 warn/discard data + PNG_CRC_WARN_USE 3 warn/use data + PNG_CRC_QUIET_USE 4 quiet/use data + PNG_CRC_NO_CHANGE 5 use the current value + +Setting up callback code + +You can set up a callback function to handle any unknown chunks in the +input stream. You must supply the function + + read_chunk_callback(png_structp png_ptr, + png_unknown_chunkp chunk); + { + /* The unknown chunk structure contains your + chunk data, along with similar data for any other + unknown chunks: */ + + png_byte name[5]; + png_byte *data; + png_size_t size; + + /* Note that libpng has already taken care of + the CRC handling */ + + /* put your code here. Search for your chunk in the + unknown chunk structure, process it, and return one + of the following: */ + + return (-n); /* chunk had an error */ + return (0); /* did not recognize */ + return (n); /* success */ + } + +(You can give your function another name that you like instead of +"read_chunk_callback") + +To inform libpng about your function, use + + png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr, + read_chunk_callback); + +This names not only the callback function, but also a user pointer that +you can retrieve with + + png_get_user_chunk_ptr(png_ptr); + +If you call the png_set_read_user_chunk_fn() function, then all unknown +chunks will be saved when read, in case your callback function will need +one or more of them. This behavior can be changed with the +png_set_keep_unknown_chunks() function, described below. + +At this point, you can set up a callback function that will be +called after each row has been read, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void read_row_callback(png_structp png_ptr, + png_uint_32 row, int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "read_row_callback") + +To inform libpng about your function, use + + png_set_read_status_fn(png_ptr, read_row_callback); + +Unknown-chunk handling + +Now you get to set the way the library processes unknown chunks in the +input PNG stream. Both known and unknown chunks will be read. Normal +behavior is that known chunks will be parsed into information in +various info_ptr members while unknown chunks will be discarded. This +behavior can be wasteful if your application will never use some known +chunk types. To change this, you can call: + + png_set_keep_unknown_chunks(png_ptr, keep, + chunk_list, num_chunks); + keep - 0: default unknown chunk handling + 1: ignore; do not keep + 2: keep only if safe-to-copy + 3: keep even if unsafe-to-copy + + You can use these definitions: + PNG_HANDLE_CHUNK_AS_DEFAULT 0 + PNG_HANDLE_CHUNK_NEVER 1 + PNG_HANDLE_CHUNK_IF_SAFE 2 + PNG_HANDLE_CHUNK_ALWAYS 3 + + chunk_list - list of chunks affected (a byte string, + five bytes per chunk, NULL or '\0' if + num_chunks is 0) + + num_chunks - number of chunks affected; if 0, all + unknown chunks are affected. If nonzero, + only the chunks in the list are affected + +Unknown chunks declared in this way will be saved as raw data onto a +list of png_unknown_chunk structures. If a chunk that is normally +known to libpng is named in the list, it will be handled as unknown, +according to the "keep" directive. If a chunk is named in successive +instances of png_set_keep_unknown_chunks(), the final instance will +take precedence. The IHDR and IEND chunks should not be named in +chunk_list; if they are, libpng will process them normally anyway. + +Here is an example of the usage of png_set_keep_unknown_chunks(), +where the private "vpAg" chunk will later be processed by a user chunk +callback function: + + png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + png_byte unused_chunks[]= + { + 104, 73, 83, 84, (png_byte) '\0', /* hIST */ + 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ + 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ + 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ + 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ + 116, 73, 77, 69, (png_byte) '\0', /* tIME */ + }; + #endif + + ... + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* ignore all unknown chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0); + + /* except for vpAg: */ + png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1); + + /* also ignore unused known chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks, + (int)sizeof(unused_chunks)/5); + #endif + +User limits + +The PNG specification allows the width and height of an image to be as +large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns. +Since very few applications really need to process such large images, +we have imposed an arbitrary 1-million limit on rows and columns. +Larger images will be rejected immediately with a png_error() call. If +you wish to override this limit, you can use + + png_set_user_limits(png_ptr, width_max, height_max); + +to set your own limits, or use width_max = height_max = 0x7fffffffL +to allow all valid dimensions (libpng may reject some very large images +anyway because of potential buffer overflow conditions). + +You should put this statement after you create the PNG structure and +before calling png_read_info(), png_read_png(), or png_process_data(). +If you need to retrieve the limits that are being applied, use + + width_max = png_get_user_width_max(png_ptr); + height_max = png_get_user_height_max(png_ptr); + +The PNG specification sets no limit on the number of ancillary chunks +allowed in a PNG datastream. You can impose a limit on the total number +of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with + + png_set_chunk_cache_max(png_ptr, user_chunk_cache_max); + +where 0x7fffffffL means unlimited. You can retrieve this limit with + + chunk_cache_max = png_get_chunk_cache_max(png_ptr); + +This limit also applies to the number of buffers that can be allocated +by png_decompress_chunk() while decompressing iTXt, zTXt, and iCCP chunks. + +You can also set a limit on the amount of memory that a compressed chunk +other than IDAT can occupy, with + + png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max); + +and you can retrieve the limit with + + chunk_malloc_max = png_get_chunk_malloc_max(png_ptr); + +Any chunks that would cause either of these limits to be exceeded will +be ignored. + +The high-level read interface + +At this point there are two ways to proceed; through the high-level +read interface, or through a sequence of low-level read operations. +You can use the high-level interface if (a) you are willing to read +the entire image into memory, and (b) the input transformations +you want to do are limited to the following set: + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to + 8 bits + PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel + PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit + samples to bytes + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_EXPAND Perform set_expand() + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples + to RGB (or GA to RGBA) + +(This excludes setting a background color, doing gamma transformation, +quantizing, and setting filler.) If this is the case, simply do this: + + png_read_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of some +set of transformation flags. This call is equivalent to png_read_info(), +followed the set of transformations indicated by the transform mask, +then png_read_image(), and finally png_read_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future input transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_read_png(). + +After you have called png_read_png(), you can retrieve the image data +with + + row_pointers = png_get_rows(png_ptr, info_ptr); + +where row_pointers is an array of pointers to the pixel data for each row: + + png_bytep row_pointers[height]; + +If you know your image size and pixel size ahead of time, you can allocate +row_pointers prior to calling png_read_png() with + + if (height > PNG_UINT_32_MAX/png_sizeof(png_byte)) + png_error (png_ptr, + "Image is too tall to process in memory"); + + if (width > PNG_UINT_32_MAX/pixel_size) + png_error (png_ptr, + "Image is too wide to process in memory"); + + row_pointers = png_malloc(png_ptr, + height*png_sizeof(png_bytep)); + + for (int i=0; i) and +png_get_(png_ptr, info_ptr, ...) functions return non-zero if the +data has been read, or zero if it is missing. The parameters to the +png_get_ are set directly if they are simple data types, or a +pointer into the info_ptr is returned for any complex types. + + png_get_PLTE(png_ptr, info_ptr, &palette, + &num_palette); + + palette - the palette for the file + (array of png_color) + + num_palette - number of entries in the palette + + png_get_gAMA(png_ptr, info_ptr, &file_gamma); + png_get_gAMA_fixed(png_ptr, info_ptr, &int_file_gamma); + + file_gamma - the gamma at which the file is + written (PNG_INFO_gAMA) + + int_file_gamma - 100,000 times the gamma at which the + file is written + + png_get_sRGB(png_ptr, info_ptr, &srgb_intent); + + file_srgb_intent - the rendering intent (PNG_INFO_sRGB) + The presence of the sRGB chunk + means that the pixel data is in the + sRGB color space. This chunk also + implies specific values of gAMA and + cHRM. + + png_get_iCCP(png_ptr, info_ptr, &name, + &compression_type, &profile, &proflen); + + name - The profile name. + + compression_type - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + + profile - International Color Consortium color + profile data. May contain NULs. + + proflen - length of profile data in bytes. + + png_get_sBIT(png_ptr, info_ptr, &sig_bit); + + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, + red, green, and blue channels, + whichever are appropriate for the + given color type (png_color_16) + + png_get_tRNS(png_ptr, info_ptr, &trans_alpha, + &num_trans, &trans_color); + + trans_alpha - array of alpha (transparency) + entries for palette (PNG_INFO_tRNS) + + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + trans_color - graylevel or color sample values of + the single transparent color for + non-paletted images (PNG_INFO_tRNS) + + png_get_hIST(png_ptr, info_ptr, &hist); + (PNG_INFO_hIST) + + hist - histogram of palette (array of + png_uint_16) + + png_get_tIME(png_ptr, info_ptr, &mod_time); + + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_get_bKGD(png_ptr, info_ptr, &background); + + background - background color (PNG_VALID_bKGD) + valid 16-bit red, green and blue + values, regardless of color_type + + num_comments = png_get_text(png_ptr, info_ptr, + &text_ptr, &num_text); + + num_comments - number of comments + + text_ptr - array of png_text holding image + comments + + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + + text_ptr[i].text - text comments for current + keyword. Can be empty. + + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + + text_ptr[i].lang - language of comment (empty + string for unknown). + + text_ptr[i].lang_key - keyword in UTF-8 + (empty string for unknown). + + Note that the itxt_length, lang, and lang_key + members of the text_ptr structure only exist + when the library is built with iTXt chunk support. + + num_text - number of comments (same as + num_comments; you can put NULL here + to avoid the duplication) + + Note while png_set_text() will accept text, language, + and translated keywords that can be NULL pointers, the + structure returned by png_get_text will always contain + regular zero-terminated C strings. They might be + empty strings but they will never be NULL pointers. + + num_spalettes = png_get_sPLT(png_ptr, info_ptr, + &palette_ptr); + + num_spalettes - number of sPLT chunks read. + + palette_ptr - array of palette structures holding + contents of one or more sPLT chunks + read. + + png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, + &unit_type); + + offset_x - positive offset from the left edge + of the screen + + offset_y - positive offset from the top edge + of the screen + + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, + &unit_type); + + res_x - pixels/unit physical resolution in + x direction + + res_y - pixels/unit physical resolution in + x direction + + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_get_sCAL(png_ptr, info_ptr, &unit, &width, + &height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are doubles) + + png_get_sCAL_s(png_ptr, info_ptr, &unit, &width, + &height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + num_unknown_chunks = png_get_unknown_chunks(png_ptr, + info_ptr, &unknowns) + + unknowns - array of png_unknown_chunk + structures holding unknown chunks + + unknowns[i].name - name of unknown chunk + + unknowns[i].data - data of unknown chunk + + unknowns[i].size - size of unknown chunk's data + + unknowns[i].location - position of chunk in file + + The value of "i" corresponds to the order in which the + chunks were read from the PNG file or inserted with the + png_set_unknown_chunks() function. + +The data from the pHYs chunk can be retrieved in several convenient +forms: + + res_x = png_get_x_pixels_per_meter(png_ptr, + info_ptr) + + res_y = png_get_y_pixels_per_meter(png_ptr, + info_ptr) + + res_x_and_y = png_get_pixels_per_meter(png_ptr, + info_ptr) + + res_x = png_get_x_pixels_per_inch(png_ptr, + info_ptr) + + res_y = png_get_y_pixels_per_inch(png_ptr, + info_ptr) + + res_x_and_y = png_get_pixels_per_inch(png_ptr, + info_ptr) + + aspect_ratio = png_get_pixel_aspect_ratio(png_ptr, + info_ptr) + + Each of these returns 0 [signifying "unknown"] if + the data is not present or if res_x is 0; + res_x_and_y is 0 if res_x != res_y + + Note that because of the way the resolutions are + stored internally, the inch conversions won't + come out to exactly even number. For example, + 72 dpi is stored as 0.28346 pixels/meter, and + when this is retrieved it is 71.9988 dpi, so + be sure to round the returned value appropriately + if you want to display a reasonable-looking result. + +The data from the oFFs chunk can be retrieved in several convenient +forms: + + x_offset = png_get_x_offset_microns(png_ptr, info_ptr); + + y_offset = png_get_y_offset_microns(png_ptr, info_ptr); + + x_offset = png_get_x_offset_inches(png_ptr, info_ptr); + + y_offset = png_get_y_offset_inches(png_ptr, info_ptr); + + Each of these returns 0 [signifying "unknown" if both + x and y are 0] if the data is not present or if the + chunk is present but the unit is the pixel. The + remark about inexact inch conversions applies here + as well, because a value in inches can't always be + converted to microns and back without some loss + of precision. + +For more information, see the png_info definition in png.h and the +PNG specification for chunk contents. Be careful with trusting +rowbytes, as some of the transformations could increase the space +needed to hold a row (expand, filler, gray_to_rgb, etc.). +See png_read_update_info(), below. + +A quick word about text_ptr and num_text. PNG stores comments in +keyword/text pairs, one pair per chunk, with no limit on the number +of text chunks, and a 2^31 byte limit on their size. While there are +suggested keywords, there is no requirement to restrict the use to these +strings. It is strongly suggested that keywords and text be sensible +to humans (that's the point), so don't use abbreviations. Non-printing +symbols are not allowed. See the PNG specification for more details. +There is also no requirement to have text after the keyword. + +Keywords should be limited to 79 Latin-1 characters without leading or +trailing spaces, but non-consecutive spaces are allowed within the +keyword. It is possible to have the same keyword any number of times. +The text_ptr is an array of png_text structures, each holding a +pointer to a language string, a pointer to a keyword and a pointer to +a text string. The text string, language code, and translated +keyword may be empty or NULL pointers. The keyword/text +pairs are put into the array in the order that they are received. +However, some or all of the text chunks may be after the image, so, to +make sure you have read all the text chunks, don't mess with these +until after you read the stuff after the image. This will be +mentioned again below in the discussion that goes with png_read_end(). + +Input transformations + +After you've read the header information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +The colors used for the background and transparency values should be +supplied in the same format/depth as the current image data. They +are stored in the same format/depth as the image data in a bKGD or tRNS +chunk, so this is what libpng expects for this data. The colors are +transformed to keep in sync with the image data when an application +calls the png_read_update_info() routine (see below). + +Data will be decoded into the supplied row buffers packed into bytes +unless the library has been told to transform it into another format. +For example, 4 bit/pixel paletted or grayscale data will be returned +2 pixels/byte with the leftmost pixel in the high-order bits of the +byte, unless png_set_packing() is called. 8-bit RGB data will be stored +in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha() +is called to insert filler bytes, either before or after each RGB triplet. +16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant +byte of the color value first, unless png_set_strip_16() is called to +transform it to regular RGB RGB triplets, or png_set_filler() or +png_set_add alpha() is called to insert filler bytes, either before or +after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can +be modified with +png_set_filler(), png_set_add_alpha(), or png_set_strip_16(). + +The following code transforms grayscale images of less than 8 to 8 bits, +changes paletted images to RGB, and adds a full alpha channel if there is +transparency information in a tRNS chunk. This is most useful on +grayscale images with bit depths of 2 or 4 or if there is a multiple-image +viewing application that wishes to treat all images in the same way. + + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && + bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr); + + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); + +These three functions are actually aliases for png_set_expand(), added +in libpng version 1.0.4, with the function names expanded to improve code +readability. In some future version they may actually do different +things. + +As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was +added. It expands the sample depth without changing tRNS to alpha. + +As of libpng version 1.5.1, not all possible expansions are supported. + +In the following table, the 01 means grayscale with depth<8, 31 means +indexed with depth<8, other numerals represent the color type, "T" means +the tRNS chunk is present, A means an alpha channel is present, and O +means tRNS or alpha is present but all pixels in the image are opaque. + + FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O + TO + 01 - + 31 - + 0 1 - + 0T - + 0O - + 2 GX - + 2T - + 2O - + 3 1 - + 3T - + 3O - + 4A T - + 4O - + 6A GX TX TX - + 6O GX TX - + +Within the matrix, + "-" means the transformation is not supported. + "X" means the transformation is obtained by png_set_expand(). + "1" means the transformation is obtained by + png_set_expand_gray_1_2_4_to_8 + "G" means the transformation is obtained by + png_set_gray_to_rgb(). + "P" means the transformation is obtained by + png_set_expand_palette_to_rgb(). + "T" means the transformation is obtained by + png_set_tRNS_to_alpha(). + +PNG can have files with 16 bits per channel. If you only can handle +8 bits per channel, this will strip the pixels down to 8 bit. + + if (bit_depth == 16) + png_set_strip_16(png_ptr); + +If, for some reason, you don't need the alpha channel on an image, +and you want to remove it rather than combining it with the background +(but the image author certainly had in mind that you *would* combine +it with the background, so that's what you should probably do): + + if (color_type & PNG_COLOR_MASK_ALPHA) + png_set_strip_alpha(png_ptr); + +In PNG files, the alpha channel in an image +is the level of opacity. If you need the alpha channel in an image to +be the level of transparency instead of opacity, you can invert the +alpha channel (or the tRNS chunk data) after it's read, so that 0 is +fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit +images) is fully transparent, with + + png_set_invert_alpha(png_ptr); + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit +files. This code expands to 1 pixel per byte without changing the +values of the pixels: + + if (bit_depth < 8) + png_set_packing(png_ptr); + +PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels +stored in a PNG image have been "scaled" or "shifted" up to the next +higher possible bit depth (e.g. from 5 bits/sample in the range [0,31] +to 8 bits/sample in the range [0, 255]). However, it is also possible +to convert the PNG pixel data back to the original bit depth of the +image. This call reduces the pixels back down to the original bit depth: + + png_color_8p sig_bit; + + if (png_get_sBIT(png_ptr, info_ptr, &sig_bit)) + png_set_shift(png_ptr, sig_bit); + +PNG files store 3-color pixels in red, green, blue order. This code +changes the storage of the pixels to blue, green, red: + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_bgr(png_ptr); + +PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them +into 4 or 8 bytes for windowing systems that need them in this format: + + if (color_type == PNG_COLOR_TYPE_RGB) + png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE); + +where "filler" is the 8 or 16-bit number to fill with, and the location is +either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether +you want the filler before the RGB or after. This transformation +does not affect images that already have full alpha channels. To add an +opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which +will generate RGBA pixels. + +Note that png_set_filler() does not change the color type. If you want +to do that, you can add a true alpha channel with + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY) + png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER); + +where "filler" contains the alpha value to assign to each pixel. +This function was added in libpng-1.2.7. + +If you are reading an image with an alpha channel, and you need the +data as ARGB instead of the normal PNG format RGBA: + + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_swap_alpha(png_ptr); + +For some uses, you may want a grayscale image to be represented as +RGB. This code will do that conversion: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png_ptr); + +Conversely, you can convert an RGB or RGBA image to grayscale or grayscale +with alpha. + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_rgb_to_gray_fixed(png_ptr, error_action, + int red_weight, int green_weight); + + error_action = 1: silently do the conversion + + error_action = 2: issue a warning if the original + image has any pixel where + red != green or red != blue + + error_action = 3: issue an error and abort the + conversion if the original + image has any pixel where + red != green or red != blue + + red_weight: weight of red component times 100000 + + green_weight: weight of green component times 100000 + If either weight is negative, default + weights (21268, 71514) are used. + +If you have set error_action = 1 or 2, you can +later check whether the image really was gray, after processing +the image rows, with the png_get_rgb_to_gray_status(png_ptr) function. +It will return a png_byte that is zero if the image was gray or +1 if there were any non-gray pixels. bKGD and sBIT data +will be silently converted to grayscale, using the green channel +data, regardless of the error_action setting. + +With red_weight+green_weight<=100000, +the normalized graylevel is computed: + + int rw = red_weight * 65536; + int gw = green_weight * 65536; + int bw = 65536 - (rw + gw); + gray = (rw*red + gw*green + bw*blue)/65536; + +The default values approximate those recommended in the Charles +Poynton's Color FAQ, +Copyright (c) 1998-01-04 Charles Poynton + + Y = 0.212671 * R + 0.715160 * G + 0.072169 * B + +Libpng approximates this with integers scaled by 32768: + + Y = (6968 * R + 23434 * G + 2366 * B)/32768 + +The calculation is done in a linear colorspace, if the image gamma +can be determined. + +If you have a grayscale and you are using png_set_expand_depth(), +png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to +a higher bit-depth, you must either supply the background color as a gray +value at the original file bit-depth (need_expand = 1) or else supply the +background color as an RGB triplet at the final, expanded bit depth +(need_expand = 0). Similarly, if you are reading a paletted image, you +must either supply the background color as a palette index (need_expand = 1) +or as an RGB triplet that may or may not be in the palette (need_expand = 0). + + png_color_16 my_background; + png_color_16p image_background; + + if (png_get_bKGD(png_ptr, info_ptr, &image_background)) + png_set_background(png_ptr, image_background, + PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + else + png_set_background(png_ptr, &my_background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + +The png_set_background() function tells libpng to composite images +with alpha or simple transparency against the supplied background +color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid), +you may use this color, or supply another color more suitable for +the current display (e.g., the background color from a web page). You +need to tell libpng whether the color is in the gamma space of the +display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file +(PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one +that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't +know why anyone would use this, but it's here). + +To properly display PNG images on any kind of system, the application needs +to know what the display gamma is. Ideally, the user will know this, and +the application will allow them to set it. One method of allowing the user +to set the display gamma separately for each system is to check for a +SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be +correctly set. + +Note that display_gamma is the overall gamma correction required to produce +pleasing results, which depends on the lighting conditions in the surrounding +environment. In a dim or brightly lit room, no compensation other than +the physical gamma exponent of the monitor is needed, while in a dark room +a slightly smaller exponent is better. + + double gamma, screen_gamma; + + if (/* We have a user-defined screen + gamma value */) + { + screen_gamma = user_defined_screen_gamma; + } + + /* One way that applications can share the same + screen gamma value */ + else if ((gamma_str = getenv("SCREEN_GAMMA")) + != NULL) + { + screen_gamma = (double)atof(gamma_str); + } + + /* If we don't have another value */ + else + { + screen_gamma = 2.2; /* A good guess for a + PC monitor in a bright office or a dim room */ + + screen_gamma = 2.0; /* A good guess for a + PC monitor in a dark room */ + + screen_gamma = 1.7 or 1.0; /* A good + guess for Mac systems */ + } + +The functions png_set_gamma() and its fixed point equivalent +png_set_gamma_fixed() handle gamma transformations of the data. +Pass both the file gamma and the current screen_gamma. If the file does +not have a gamma value, you can pass one anyway if you have an idea what +it is (usually 0.45455 is a good guess for GIF images on PCs). Note +that file gammas are inverted from screen gammas. See the discussions +on gamma in the PNG specification for an excellent description of what +gamma is, and why all applications should support it. It is strongly +recommended that PNG viewers support gamma correction. + + if (png_get_gAMA(png_ptr, info_ptr, &file_gamma)) + png_set_gamma(png_ptr, screen_gamma, file_gamma); + + else + png_set_gamma(png_ptr, screen_gamma, 0.45455); + +If you need to reduce an RGB file to a paletted file, or if a paletted +file has more entries then will fit on your screen, png_set_quantize() +will do that. Note that this is a simple match quantization that merely +finds the closest color available. This should work fairly well with +optimized palettes, but fairly badly with linear color cubes. If you +pass a palette that is larger then maximum_colors, the file will +reduce the number of colors in the palette so it will fit into +maximum_colors. If there is a histogram, it will use it to make +more intelligent choices when reducing the palette. If there is no +histogram, it may not do as good a job. + + if (color_type & PNG_COLOR_MASK_COLOR) + { + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_PLTE)) + { + png_uint_16p histogram = NULL; + + png_get_hIST(png_ptr, info_ptr, + &histogram); + png_set_quantize(png_ptr, palette, num_palette, + max_screen_colors, histogram, 1); + } + + else + { + png_color std_color_cube[MAX_SCREEN_COLORS] = + { ... colors ... }; + + png_set_quantize(png_ptr, std_color_cube, + MAX_SCREEN_COLORS, MAX_SCREEN_COLORS, + NULL,0); + } + } + +PNG files describe monochrome as black being zero and white being one. +The following code will reverse this (make black be one and white be +zero): + + if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) + png_set_invert_mono(png_ptr); + +This function can also be used to invert grayscale and gray-alpha images: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_invert_mono(png_ptr); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code changes the storage to the +other way (little-endian, i.e. least significant bits first, the +way PCs store them): + + if (bit_depth == 16) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_read_user_transform_fn(png_ptr, + read_transform_fn); + +You must supply the function + + void read_transform_fn(png_structp png_ptr, row_info_ptr + row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +after all of the other transformations have been processed. Take care with +interlaced images if you do the interlace yourself - the width of the row is the +width in 'row_info', not the overall image width. + +If supported libpng provides two information routines that you can use to find +where you are in processing the image: + + png_get_current_pass_number(png_structp png_ptr); + png_get_current_row_number(png_structp png_ptr); + +Don't try using these outside a transform callback - firstly they are only +supported if user transforms are supported, secondly they may well return +unexpected results unless the row is actually being processed at the moment they +are called. + +You can also set up a pointer to a user structure for use by your +callback function, and you can inform libpng that your transform +function will change the number of channels or bit depth with the +function + + png_set_user_transform_info(png_ptr, user_ptr, + user_depth, user_channels); + +The user's application, not libpng, is responsible for allocating and +freeing any memory required for the user structure. + +You can retrieve the pointer via the function +png_get_user_transform_ptr(). For example: + + voidp read_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +The last thing to handle is interlacing; this is covered in detail below, +but you must call the function here if you want libpng to handle expansion +of the interlaced image. + + number_of_passes = png_set_interlace_handling(png_ptr); + +After setting the transformations, libpng can update your png_info +structure to reflect any transformations you've requested with this +call. This is most useful to update the info structure's rowbytes +field so you can use it to allocate your image memory. This function +will also update your palette with the correct screen_gamma and +background if these have been given with the calls above. + + png_read_update_info(png_ptr, info_ptr); + +After you call png_read_update_info(), you can allocate any +memory you need to hold the image. The row data is simply +raw byte data for all forms of images. As the actual allocation +varies among applications, no example will be given. If you +are allocating one large chunk, you will need to build an +array of pointers to each row, as it will be needed for some +of the functions below. + +Remember: Before you call png_read_update_info(), the png_get_ +functions return the values corresponding to the original PNG image. +After you call png_read_update_info the values refer to the image +that libpng will output. Consequently you must call all the png_set_ +functions before you call png_read_update_info(). This is particularly +important for png_set_interlace_handling() - if you are going to call +png_read_update_info() you must call png_set_interlace_handling() before +it unless you want to receive interlaced output. + +Reading image data + +After you've allocated memory, you can read the image data. +The simplest way to do this is in one function call. If you are +allocating enough memory to hold the whole image, you can just +call png_read_image() and libpng will read in all the image data +and put it in the memory area supplied. You will need to pass in +an array of pointers to each row. + +This function automatically handles interlacing, so you don't +need to call png_set_interlace_handling() (unless you call +png_read_update_info()) or call this function multiple times, or any +of that other stuff necessary with png_read_rows(). + + png_read_image(png_ptr, row_pointers); + +where row_pointers is: + + png_bytep row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to read in the whole image at once, you can +use png_read_rows() instead. If there is no interlacing (check +interlace_type == PNG_INTERLACE_NONE), this is simple: + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +where row_pointers is the same as in the png_read_image() call. + +If you are doing this just one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + png_read_row(png_ptr, row_pointer, NULL); + +If the file is interlaced (interlace_type != 0 in the IHDR chunk), things +get somewhat harder. The only current (PNG Specification version 1.2) +interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7); +a somewhat complicated 2D interlace scheme, known as Adam7, that +breaks down an image into seven smaller images of varying size, based +on an 8x8 grid. This number is defined (from libpng 1.5) as +PNG_INTERLACE_ADAM7_PASSES in png.h + +libpng can fill out those images or it can give them to you "as is". +It is almost always better to have libpng handle the interlacing for you. +If you want the images filled out, there are two ways to do that. The one +mentioned in the PNG specification is to expand each pixel to cover +those pixels that have not been read yet (the "rectangle" method). +This results in a blocky image for the first pass, which gradually +smooths out as more pixels are read. The other method is the "sparkle" +method, where pixels are drawn only in their final locations, with the +rest of the image remaining whatever colors they were initialized to +before the start of the read. The first method usually looks better, +but tends to be slower, as there are more pixels to put in the rows. + +If, as is likely, you want libpng to expand the images, call this before +calling png_start_read_image() or png_read_update_info(): + + if (interlace_type == PNG_INTERLACE_ADAM7) + number_of_passes + = png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this is seven, +but may change if another interlace type is added. This function can be +called even if the file is not interlaced, where it will return one pass. +You then need to read the whole image 'number_of_passes' times. Each time +will distribute the pixels from the current pass to the correct place in +the output image, so you need to supply the same rows to png_read_rows in +each pass. + +If you are not going to display the image after each pass, but are +going to wait until the entire image is read in, use the sparkle +effect. This effect is faster and the end result of either method +is exactly the same. If you are planning on displaying the image +after each pass, the "rectangle" effect is generally considered the +better looking one. + +If you only want the "sparkle" effect, just call png_read_rows() as +normal, with the third parameter NULL. Make sure you make pass over +the image number_of_passes times, and you don't change the data in the +rows between calls. You can change the locations of the data, just +not the data. Each pass only writes the pixels appropriate for that +pass, and assumes the data from previous passes is still valid. + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +If you only want the first effect (the rectangles), do the same as +before except pass the row buffer in the third parameter, and leave +the second parameter NULL. + + png_read_rows(png_ptr, NULL, row_pointers, + number_of_rows); + +If you don't want libpng to handle the interlacing details, just call +png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images. +Each of the images is a valid image by itself, however you will almost +certainly need to distribute the pixels from each sub-image to the +correct place. This is where everything gets very tricky. + +If you want to retrieve the separate images you must pass the correct +number of rows to each successive call of png_read_rows(). The calculation +gets pretty complicated for small images, where some sub-images may +not even exist because either their width or height ends up zero. +libpng provides two macros to help you in 1.5 and later versions: + + png_uint_32 width = PNG_PASS_COLS(image_width, pass_number); + png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number); + +Respectively these tell you the width and height of the sub-image +corresponding to the numbered pass. 'pass' is in in the range 0 to 6 - +this can be confusing because the specification refers to the same passes +as 1 to 7! Be careful, you must check both the width and height before +calling png_read_rows() and not call it for that pass if either is zero. + +You can, of course, read each sub-image row by row. If you want to +produce optimal code to make a pixel-by-pixel transformation of an +interlaced image this is the best approach; read each row of each pass, +transform it, and write it out to a new interlaced image. + +If you want to de-interlace the image yourself libpng provides further +macros to help that tell you where to place the pixels in the output image. +Because the interlacing scheme is rectangular - sub-image pixels are always +arranged on a rectangular grid - all you need to know for each pass is the +starting column and row in the output image of the first pixel plus the +spacing between each pixel. As of libpng 1.5 there are four macros to +retrieve this information: + + png_uint_32 x = PNG_PASS_START_COL(pass); + png_uint_32 y = PNG_PASS_START_ROW(pass); + png_uint_32 xStep = 1U << PNG_PASS_COL_SHIFT(pass); + png_uint_32 yStep = 1U << PNG_PASS_ROW_SHIFT(pass); + +These allow you to write the obvious loop: + + png_uint_32 input_y = 0; + png_uint_32 output_y = PNG_PASS_START_ROW(pass); + + while (output_y < output_image_height) + { + png_uint_32 input_x = 0; + png_uint_32 output_x = PNG_PASS_START_COL(pass); + + while (output_x < output_image_width) + { + image[output_y][output_x] = + subimage[pass][input_y][input_x++]; + + output_x += xStep; + } + + ++input_y; + output_y += yStep; + } + +Notice that the steps between successive output rows and columns are +returned as shifts. This is possible because the pixels in the subimages +are always a power of 2 apart - 1, 2, 4 or 8 pixels - in the original +image. In practice you may need to directly calculate the output coordinate +given an input coordinate. libpng provides two further macros for this +purpose: + + png_uint_32 output_x = PNG_COL_FROM_PASS_COL(input_x, pass); + png_uint_32 output_y = PNG_ROW_FROM_PASS_ROW(input_y, pass); + +Finally a pair of macros are provided to tell you if a particular image +row or column appears in a given pass: + + int col_in_pass = PNG_COL_IN_INTERLACE_PASS(output_x, pass); + int row_in_pass = PNG_ROW_IN_INTERLACE_PASS(output_y, pass); + +Bear in mind that you will probably also need to check the width and height +of the pass in addition to the above to be sure the pass even exists! + +With any luck you are convinced by now that you don't want to do your own +interlace handling. In reality normally the only good reason for doing this +is if you are processing PNG files on a pixel-by-pixel basis and don't want +to load the whole file into memory when it is interlaced. + +libpng includes a test program, pngvalid, that illustrates reading and +writing of interlaced images. If you can't get interlacing to work in your +code and don't want to leave it to libpng (the recommended approach) see +how pngvalid.c does it. + +Finishing a sequential read + +After you are finished reading the image through the +low-level interface, you can finish reading the file. If you are +interested in comments or time, which may be stored either before or +after the image data, you should pass the separate png_info struct if +you want to keep the comments from before and after the image +separate. If you are not interested, you can pass NULL. + + png_read_end(png_ptr, end_info); + +When you are done, you can free all memory allocated by libpng like this: + + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those cases do nothing. +The "seq" parameter is ignored if only one item of the selected data +type, such as PLTE, is allowed. If "seq" is not -1, and multiple items +are allowed for the data type identified in the mask, such as text or +sPLT, only the n'th item in the structure is freed, where n is "seq". + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + + mask - which data elements are affected + same choices as in png_free_data() + +This function only affects data that has already been allocated. +You can call this function after reading the PNG data but before calling +any png_set_*() functions, to control whether the user or the png_set_*() +function is responsible for freeing any existing data that might be present, +and again after the png_set_*() functions to control whether the user +or png_destroy_*() is supposed to free the data. When the user assumes +responsibility for libpng-allocated data, the application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated your row_pointers in a single block, as suggested above in +the description of the high level read interface, you must not transfer +responsibility for freeing it to the png_set_rows or png_read_destroy function, +because they would also try to free the individual row_pointers[i]. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. + +The png_free_data() function will turn off the "valid" flag for anything +it frees. If you need to turn the flag off for a chunk that was freed by +your application instead of by libpng, you can use + + png_set_invalid(png_ptr, info_ptr, mask); + + mask - identifies the chunks to be made invalid, + containing the bitwise OR of one or + more of + PNG_INFO_gAMA, PNG_INFO_sBIT, + PNG_INFO_cHRM, PNG_INFO_PLTE, + PNG_INFO_tRNS, PNG_INFO_bKGD, + PNG_INFO_hIST, PNG_INFO_pHYs, + PNG_INFO_oFFs, PNG_INFO_tIME, + PNG_INFO_pCAL, PNG_INFO_sRGB, + PNG_INFO_iCCP, PNG_INFO_sPLT, + PNG_INFO_sCAL, PNG_INFO_IDAT + +For a more compact example of reading a PNG image, see the file example.c. + +Reading PNG files progressively + +The progressive reader is slightly different then the non-progressive +reader. Instead of calling png_read_info(), png_read_rows(), and +png_read_end(), you make one call to png_process_data(), which calls +callbacks when it has the info, a row, or the end of the image. You +set up these callbacks with png_set_progressive_read_fn(). You don't +have to worry about the input/output functions of libpng, as you are +giving the library the data directly in png_process_data(). I will +assume that you have read the section on reading PNG files above, +so I will only highlight the differences (although I will show +all of the code). + +png_structp png_ptr; +png_infop info_ptr; + + /* An example code fragment of how you would + initialize the progressive reader in your + application. */ + int + initialize_png_reader() + { + png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + info_ptr = png_create_info_struct(png_ptr); + + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, + (png_infopp)NULL, (png_infopp)NULL); + return (ERROR); + } + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new. You can provide functions + to be called when the header info is valid, + when each row is completed, and when the image + is finished. If you aren't using all functions, + you can specify NULL parameters. Even when all + three functions are NULL, you need to call + png_set_progressive_read_fn(). You can use + any struct as the user_ptr (cast to a void pointer + for the function call), and retrieve the pointer + from inside the callbacks using the function + + png_get_progressive_ptr(png_ptr); + + which will return a void pointer, which you have + to cast appropriately. + */ + png_set_progressive_read_fn(png_ptr, (void *)user_ptr, + info_callback, row_callback, end_callback); + + return 0; + } + + /* A code fragment that you call as you receive blocks + of data */ + int + process_data(png_bytep buffer, png_uint_32 length) + { + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new also. Simply give it a chunk + of data from the file stream (in order, of + course). On machines with segmented memory + models machines, don't give it any more than + 64K. The library seems to run fine with sizes + of 4K. Although you can give it much less if + necessary (I assume you can give it chunks of + 1 byte, I haven't tried less then 256 bytes + yet). When this function returns, you may + want to display any rows that were generated + in the row callback if you don't already do + so there. + */ + png_process_data(png_ptr, info_ptr, buffer, length); + + /* At this point you can call png_process_data_skip if + you want to handle data the library will skip yourself; + it simply returns the number of bytes to skip (and stops + libpng skipping that number of bytes on the next + png_process_data call). + return 0; + } + + /* This function is called (as set by + png_set_progressive_read_fn() above) when enough data + has been supplied so all of the header has been + read. + */ + void + info_callback(png_structp png_ptr, png_infop info) + { + /* Do any setup here, including setting any of + the transformations mentioned in the Reading + PNG files section. For now, you _must_ call + either png_start_read_image() or + png_read_update_info() after all the + transformations are set (even if you don't set + any). You may start getting rows before + png_process_data() returns, so this is your + last chance to prepare for that. + + This is where you turn on interlace handling, + assuming you don't want to do it yourself. + + If you need to you can stop the processing of + your original input data at this point by calling + png_process_data_pause. This returns the number + of unprocessed bytes from the last png_process_data + call - it is up to you to ensure that the next call + sees these bytes again. If you don't want to bother + with this you can get libpng to cache the unread + bytes by setting the 'save' parameter (see png.h) but + then libpng will have to copy the data internally. + */ + } + + /* This function is called when each row of image + data is complete */ + void + row_callback(png_structp png_ptr, png_bytep new_row, + png_uint_32 row_num, int pass) + { + /* If the image is interlaced, and you turned + on the interlace handler, this function will + be called for every row in every pass. Some + of these rows will not be changed from the + previous pass. When the row is not changed, + the new_row variable will be NULL. The rows + and passes are called in order, so you don't + really need the row_num and pass, but I'm + supplying them because it may make your life + easier. + + If you did not turn on interlace handling then + the callback is called for each row of each + sub-image when the image is interlaced. In this + case 'row_num' is the row in the sub-image, not + the row in the output image as it is in all other + cases. + + For the non-NULL rows of interlaced images when + you have switched on libpng interlace handling, + you must call png_progressive_combine_row() + passing in the row and the old row. You can + call this function for NULL rows (it will just + return) and for non-interlaced images (it just + does the memcpy for you) if it will make the + code easier. Thus, you can just do this for + all cases if you switch on interlace handling; + */ + + png_progressive_combine_row(png_ptr, old_row, + new_row); + + /* where old_row is what was displayed for + previously for the row. Note that the first + pass (pass == 0, really) will completely cover + the old row, so the rows do not have to be + initialized. After the first pass (and only + for interlaced images), you will have to pass + the current row, and the function will combine + the old row and the new row. + + You can also call png_process_data_pause in this + callback - see above. + */ + } + + void + end_callback(png_structp png_ptr, png_infop info) + { + /* This function is called after the whole image + has been read, including any chunks after the + image (up to and including the IEND). You + will usually have the same info chunk as you + had in the header, although some data may have + been added to the comments and time fields. + + Most people won't do much here, perhaps setting + a flag that marks the image as finished. + */ + } + + + +IV. Writing + +Much of this is very similar to reading. However, everything of +importance is repeated here, so you won't have to constantly look +back up in the reading section to understand writing. + +Setup + +You will want to do the I/O initialization before you get into libpng, +so if it doesn't work, you don't have anything to undo. If you are not +using the standard I/O functions, you will need to replace them with +custom writing functions. See the discussion under Customizing libpng. + + FILE *fp = fopen(file_name, "wb"); + + if (!fp) + return (ERROR); + +Next, png_struct and png_info need to be allocated and initialized. +As these can be both relatively large, you may not want to store these +on the stack, unless you have stack space to spare. Of course, you +will want to check if they return NULL. If you are also reading, +you won't want to name your read structure and your write structure +both "png_ptr"; you can call them anything you like, such as +"read_ptr" and "write_ptr". Look at pngtest.c, for example. + + png_structp png_ptr = png_create_write_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_write_struct(&png_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +define PNG_USER_MEM_SUPPORTED and use +png_create_write_struct_2() instead of png_create_write_struct(): + + png_structp png_ptr = png_create_write_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +After you have these structures, you will need to set up the +error handling. When libpng encounters an error, it expects to +longjmp() back to your routine. Therefore, you will need to call +setjmp() and pass the png_jmpbuf(png_ptr). If you +write the file from different routines, you will need to update +the png_jmpbuf(png_ptr) every time you enter a new routine that will +call a png_*() function. See your documentation of setjmp/longjmp +for your compiler for more information on setjmp/longjmp. See +the discussion on libpng error handling in the Customizing Libpng +section below for more information on the libpng error handling. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(fp); + return (ERROR); + } + ... + return; + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_NO_SETJMP, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +You can #define PNG_ABORT() to a function that does something +more useful than abort(), as long as your function does not +return. + +Now you need to set up the output code. The default for libpng is to +use the C function fwrite(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. Again, if you wish to handle writing data in +another way, see the discussion on libpng I/O handling in the Customizing +Libpng section below. + + png_init_io(png_ptr, fp); + +If you are embedding your PNG into a datastream such as MNG, and don't +want libpng to write the 8-byte signature, or if you have already +written the signature in your application, use + + png_set_sig_bytes(png_ptr, 8); + +to inform libpng that it should not write a signature. + +Write callbacks + +At this point, you can set up a callback function that will be +called after each row has been written, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void write_row_callback(png_structp png_ptr, png_uint_32 row, + int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "write_row_callback") + +To inform libpng about your function, use + + png_set_write_status_fn(png_ptr, write_row_callback); + +You now have the option of modifying how the compression library will +run. The following functions are mainly for testing, but may be useful +in some cases, like if you need to write PNG files extremely fast and +are willing to give up some compression, or if you want to get the +maximum possible compression at the expense of slower writing. If you +have no special needs in this area, let the library do what it wants by +not calling this function at all, as it has been tuned to deliver a good +speed/compression ratio. The second parameter to png_set_filter() is +the filter method, for which the only valid values are 0 (as of the +July 1999 PNG specification, version 1.2) or 64 (if you are writing +a PNG datastream that is to be embedded in a MNG datastream). The third +parameter is a flag that indicates which filter type(s) are to be tested +for each scanline. See the PNG specification for details on the specific +filter types. + + + /* turn on or off filtering, and/or choose + specific filters. You can use either a single + PNG_FILTER_VALUE_NAME or the bitwise OR of one + or more PNG_FILTER_NAME masks. + */ + png_set_filter(png_ptr, 0, + PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE | + PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB | + PNG_FILTER_UP | PNG_FILTER_VALUE_UP | + PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG | + PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH| + PNG_ALL_FILTERS); + +If an application wants to start and stop using particular filters during +compression, it should start out with all of the filters (to ensure that +the previous row of pixels will be stored in case it's needed later), +and then add and remove them after the start of compression. + +If you are writing a PNG datastream that is to be embedded in a MNG +datastream, the second parameter can be either 0 or 64. + +The png_set_compression_*() functions interface to the zlib compression +library, and should mostly be ignored unless you really know what you are +doing. The only generally useful call is png_set_compression_level() +which changes how much time zlib spends on trying to compress the image +data. See the Compression Library (zlib.h and algorithm.txt, distributed +with zlib) for details on the compression levels. + + /* set the zlib compression level */ + png_set_compression_level(png_ptr, + Z_BEST_COMPRESSION); + + /* set other zlib parameters */ + png_set_compression_mem_level(png_ptr, 8); + png_set_compression_strategy(png_ptr, + Z_DEFAULT_STRATEGY); + png_set_compression_window_bits(png_ptr, 15); + png_set_compression_method(png_ptr, 8); + png_set_compression_buffer_size(png_ptr, 8192) + +extern PNG_EXPORT(void,png_set_zbuf_size) + +Setting the contents of info for output + +You now need to fill in the png_info structure with all the data you +wish to write before the actual image. Note that the only thing you +are allowed to write after the image is the text chunks and the time +chunk (as of PNG Specification 1.2, anyway). See png_write_end() and +the latest PNG specification for more information on that. If you +wish to write them before the image, fill them in now, and flag that +data as being valid. If you want to wait until after the data, don't +fill them until png_write_end(). For all the fields in png_info and +their data types, see png.h. For explanations of what the fields +contain, see the PNG specification. + +Some of the more important parts of the png_info are: + + png_set_IHDR(png_ptr, info_ptr, width, height, + bit_depth, color_type, interlace_type, + compression_type, filter_method) + + width - holds the width of the image + in pixels (up to 2^31). + + height - holds the height of the image + in pixels (up to 2^31). + + bit_depth - holds the bit depth of one of the + image channels. + (valid values are 1, 2, 4, 8, 16 + and depend also on the + color_type. See also significant + bits (sBIT) below). + + color_type - describes which color/alpha + channels are present. + PNG_COLOR_TYPE_GRAY + (bit depths 1, 2, 4, 8, 16) + PNG_COLOR_TYPE_GRAY_ALPHA + (bit depths 8, 16) + PNG_COLOR_TYPE_PALETTE + (bit depths 1, 2, 4, 8) + PNG_COLOR_TYPE_RGB + (bit_depths 8, 16) + PNG_COLOR_TYPE_RGB_ALPHA + (bit_depths 8, 16) + + PNG_COLOR_MASK_PALETTE + PNG_COLOR_MASK_COLOR + PNG_COLOR_MASK_ALPHA + + interlace_type - PNG_INTERLACE_NONE or + PNG_INTERLACE_ADAM7 + + compression_type - (must be + PNG_COMPRESSION_TYPE_DEFAULT) + + filter_method - (must be PNG_FILTER_TYPE_DEFAULT + or, if you are writing a PNG to + be embedded in a MNG datastream, + can also be + PNG_INTRAPIXEL_DIFFERENCING) + +If you call png_set_IHDR(), the call must appear before any of the +other png_set_*() functions, because they might require access to some of +the IHDR settings. The remaining png_set_*() functions can be called +in any order. + +If you wish, you can reset the compression_type, interlace_type, or +filter_method later by calling png_set_IHDR() again; if you do this, the +width, height, bit_depth, and color_type must be the same in each call. + + png_set_PLTE(png_ptr, info_ptr, palette, + num_palette); + + palette - the palette for the file + (array of png_color) + num_palette - number of entries in the palette + + png_set_gAMA(png_ptr, info_ptr, file_gamma); + png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); + + file_gamma - the gamma at which the image was + created (PNG_INFO_gAMA) + + int_file_gamma - 100,000 times the gamma at which + the image was created + + png_set_sRGB(png_ptr, info_ptr, srgb_intent); + + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of + the sRGB chunk means that the pixel + data is in the sRGB color space. + This chunk also implies specific + values of gAMA and cHRM. Rendering + intent is the CSS-1 property that + has been defined by the International + Color Consortium + (http://www.color.org). + It can be one of + PNG_sRGB_INTENT_SATURATION, + PNG_sRGB_INTENT_PERCEPTUAL, + PNG_sRGB_INTENT_ABSOLUTE, or + PNG_sRGB_INTENT_RELATIVE. + + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, + srgb_intent); + + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of the + sRGB chunk means that the pixel + data is in the sRGB color space. + This function also causes gAMA and + cHRM chunks with the specific values + that are consistent with sRGB to be + written. + + png_set_iCCP(png_ptr, info_ptr, name, compression_type, + profile, proflen); + + name - The profile name. + + compression_type - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + + profile - International Color Consortium color + profile data. May contain NULs. + + proflen - length of profile data in bytes. + + png_set_sBIT(png_ptr, info_ptr, sig_bit); + + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, red, + green, and blue channels, whichever are + appropriate for the given color type + (png_color_16) + + png_set_tRNS(png_ptr, info_ptr, trans_alpha, + num_trans, trans_color); + + trans_alpha - array of alpha (transparency) + entries for palette (PNG_INFO_tRNS) + + trans_color - graylevel or color sample values + (in order red, green, blue) of the + single transparent color for + non-paletted images (PNG_INFO_tRNS) + + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + png_set_hIST(png_ptr, info_ptr, hist); + + hist - histogram of palette (array of + png_uint_16) (PNG_INFO_hIST) + + png_set_tIME(png_ptr, info_ptr, mod_time); + + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_set_bKGD(png_ptr, info_ptr, background); + + background - background color (PNG_VALID_bKGD) + + png_set_text(png_ptr, info_ptr, text_ptr, num_text); + + text_ptr - array of png_text holding image + comments + + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + text_ptr[i].text - text comments for current + keyword. Can be NULL or empty. + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + text_ptr[i].lang - language of comment (NULL or + empty for unknown). + text_ptr[i].translated_keyword - keyword in UTF-8 (NULL + or empty for unknown). + Note that the itxt_length, lang, and lang_key + members of the text_ptr structure only exist + when the library is built with iTXt chunk support. + + num_text - number of comments + + png_set_sPLT(png_ptr, info_ptr, &palette_ptr, + num_spalettes); + + palette_ptr - array of png_sPLT_struct structures + to be added to the list of palettes + in the info structure. + num_spalettes - number of palette structures to be + added. + + png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, + unit_type); + + offset_x - positive offset from the left + edge of the screen + + offset_y - positive offset from the top + edge of the screen + + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_set_pHYs(png_ptr, info_ptr, res_x, res_y, + unit_type); + + res_x - pixels/unit physical resolution + in x direction + + res_y - pixels/unit physical resolution + in y direction + + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_set_sCAL(png_ptr, info_ptr, unit, width, height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are doubles) + + png_set_sCAL_s(png_ptr, info_ptr, unit, width, height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + png_set_unknown_chunks(png_ptr, info_ptr, &unknowns, + num_unknowns) + + unknowns - array of png_unknown_chunk + structures holding unknown chunks + unknowns[i].name - name of unknown chunk + unknowns[i].data - data of unknown chunk + unknowns[i].size - size of unknown chunk's data + unknowns[i].location - position to write chunk in file + 0: do not write chunk + PNG_HAVE_IHDR: before PLTE + PNG_HAVE_PLTE: before IDAT + PNG_AFTER_IDAT: after IDAT + +The "location" member is set automatically according to +what part of the output file has already been written. +You can change its value after calling png_set_unknown_chunks() +as demonstrated in pngtest.c. Within each of the "locations", +the chunks are sequenced according to their position in the +structure (that is, the value of "i", which is the order in which +the chunk was either read from the input file or defined with +png_set_unknown_chunks). + +A quick word about text and num_text. text is an array of png_text +structures. num_text is the number of valid structures in the array. +Each png_text structure holds a language code, a keyword, a text value, +and a compression type. + +The compression types have the same valid numbers as the compression +types of the image data. Currently, the only valid number is zero. +However, you can store text either compressed or uncompressed, unlike +images, which always have to be compressed. So if you don't want the +text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE. +Because tEXt and zTXt chunks don't have a language field, if you +specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt +any language code or translated keyword will not be written out. + +Until text gets around 1000 bytes, it is not worth compressing it. +After the text has been written out to the file, the compression type +is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR, +so that it isn't written out again at the end (in case you are calling +png_write_end() with the same struct). + +The keywords that are given in the PNG Specification are: + + Title Short (one line) title or + caption for image + + Author Name of image's creator + + Description Description of image (possibly long) + + Copyright Copyright notice + + Creation Time Time of original image creation + (usually RFC 1123 format, see below) + + Software Software used to create the image + + Disclaimer Legal disclaimer + + Warning Warning of nature of content + + Source Device used to create the image + + Comment Miscellaneous comment; conversion + from other image format + +The keyword-text pairs work like this. Keywords should be short +simple descriptions of what the comment is about. Some typical +keywords are found in the PNG specification, as is some recommendations +on keywords. You can repeat keywords in a file. You can even write +some text before the image and some after. For example, you may want +to put a description of the image before the image, but leave the +disclaimer until after, so viewers working over modem connections +don't have to wait for the disclaimer to go over the modem before +they start seeing the image. Finally, keywords should be full +words, not abbreviations. Keywords and text are in the ISO 8859-1 +(Latin-1) character set (a superset of regular ASCII) and can not +contain NUL characters, and should not contain control or other +unprintable characters. To make the comments widely readable, stick +with basic ASCII, and avoid machine specific character set extensions +like the IBM-PC character set. The keyword must be present, but +you can leave off the text string on non-compressed pairs. +Compressed pairs must have a text string, as only the text string +is compressed anyway, so the compression would be meaningless. + +PNG supports modification time via the png_time structure. Two +conversion routines are provided, png_convert_from_time_t() for +time_t and png_convert_from_struct_tm() for struct tm. The +time_t routine uses gmtime(). You don't have to use either of +these, but if you wish to fill in the png_time structure directly, +you should provide the time in universal time (GMT) if possible +instead of your local time. Note that the year number is the full +year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and +that months start with 1. + +If you want to store the time of the original image creation, you should +use a plain tEXt chunk with the "Creation Time" keyword. This is +necessary because the "creation time" of a PNG image is somewhat vague, +depending on whether you mean the PNG file, the time the image was +created in a non-PNG format, a still photo from which the image was +scanned, or possibly the subject matter itself. In order to facilitate +machine-readable dates, it is recommended that the "Creation Time" +tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"), +although this isn't a requirement. Unlike the tIME chunk, the +"Creation Time" tEXt chunk is not expected to be automatically changed +by the software. To facilitate the use of RFC 1123 dates, a function +png_convert_to_rfc1123(png_timep) is provided to convert from PNG +time to an RFC 1123 format string. + +Writing unknown chunks + +You can use the png_set_unknown_chunks function to queue up chunks +for writing. You give it a chunk name, raw data, and a size; that's +all there is to it. The chunks will be written by the next following +png_write_info_before_PLTE, png_write_info, or png_write_end function. +Any chunks previously read into the info structure's unknown-chunk +list will also be written out in a sequence that satisfies the PNG +specification's ordering rules. + +The high-level write interface + +At this point there are two ways to proceed; through the high-level +write interface, or through a sequence of low-level write operations. +You can use the high-level interface if your image data is present +in the info structure. All defined output +transformations are permitted, enabled by the following masks. + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + PNG_TRANSFORM_STRIP_FILLER Strip out filler + bytes (deprecated). + PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading + filler bytes + PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing + filler bytes + +If you have valid image data in the info structure (you can use +png_set_rows() to put image data in the info structure), simply do this: + + png_write_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of some set of +transformation flags. This call is equivalent to png_write_info(), +followed the set of transformations indicated by the transform mask, +then png_write_image(), and finally png_write_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future output transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_write_png(). + +The low-level write interface + +If you are going the low-level route instead, you are now ready to +write all the file information up to the actual image data. You do +this with a call to png_write_info(). + + png_write_info(png_ptr, info_ptr); + +Note that there is one transformation you may need to do before +png_write_info(). In PNG files, the alpha channel in an image is the +level of opacity. If your data is supplied as a level of transparency, +you can invert the alpha channel before you write it, so that 0 is +fully transparent and 255 (in 8-bit or paletted images) or 65535 +(in 16-bit images) is fully opaque, with + + png_set_invert_alpha(png_ptr); + +This must appear before png_write_info() instead of later with the +other transformations because in the case of paletted images the tRNS +chunk data has to be inverted before the tRNS chunk is written. If +your image is not a paletted image, the tRNS data (which in such cases +represents a single color to be rendered as transparent) won't need to +be changed, and you can safely do this transformation after your +png_write_info() call. + +If you need to write a private chunk that you want to appear before +the PLTE chunk when PLTE is present, you can write the PNG info in +two steps, and insert code to write your own chunk between them: + + png_write_info_before_PLTE(png_ptr, info_ptr); + png_set_unknown_chunks(png_ptr, info_ptr, ...); + png_write_info(png_ptr, info_ptr); + +After you've written the file information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +PNG files store RGB pixels packed into 3 or 6 bytes. This code tells +the library to strip input data that has 4 or 8 bytes per pixel down +to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2 +bytes per pixel). + + png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); + +where the 0 is unused, and the location is either PNG_FILLER_BEFORE or +PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel +is stored XRGB or RGBX. + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit files. +If the data is supplied at 1 pixel per byte, use this code, which will +correctly pack the pixels into a single byte: + + png_set_packing(png_ptr); + +PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your +data is of another bit depth, you can write an sBIT chunk into the +file so that decoders can recover the original data if desired. + + /* Set the true bit depth of the image data */ + if (color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit.red = true_bit_depth; + sig_bit.green = true_bit_depth; + sig_bit.blue = true_bit_depth; + } + + else + { + sig_bit.gray = true_bit_depth; + } + + if (color_type & PNG_COLOR_MASK_ALPHA) + { + sig_bit.alpha = true_bit_depth; + } + + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + +If the data is stored in the row buffer in a bit depth other than +one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG), +this will scale the values to appear to be the correct bit depth as +is required by PNG. + + png_set_shift(png_ptr, &sig_bit); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code would be used if they are +supplied the other way (little-endian, i.e. least significant bits +first, the way PCs store them): + + if (bit_depth > 8) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +PNG files store 3 color pixels in red, green, blue order. This code +would be used if they are supplied as blue, green, red: + + png_set_bgr(png_ptr); + +PNG files describe monochrome as black being zero and white being +one. This code would be used if the pixels are supplied with this reversed +(black being one and white being zero): + + png_set_invert_mono(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_write_user_transform_fn(png_ptr, + write_transform_fn); + +You must supply the function + + void write_transform_fn(png_structp png_ptr ptr, + row_info_ptr row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +before any of the other transformations are processed. If supported +libpng also supplies an information routine that may be called from +your callback: + + png_get_current_row_number(png_ptr); + +This returns the current row passed to the transform. Even with interlaced +images the value returned is the row in the final output image. + +You can also set up a pointer to a user structure for use by your +callback function. + + png_set_user_transform_info(png_ptr, user_ptr, 0, 0); + +The user_channels and user_depth parameters of this function are ignored +when writing; you can set them to zero as shown. + +You can retrieve the pointer via the function png_get_user_transform_ptr(). +For example: + + voidp write_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +It is possible to have libpng flush any pending output, either manually, +or automatically after a certain number of lines have been written. To +flush the output stream a single time call: + + png_write_flush(png_ptr); + +and to have libpng flush the output stream periodically after a certain +number of scanlines have been written, call: + + png_set_flush(png_ptr, nrows); + +Note that the distance between rows is from the last time png_write_flush() +was called, or the first row of the image if it has never been called. +So if you write 50 lines, and then png_set_flush 25, it will flush the +output on the next scanline, and every 25 lines thereafter, unless +png_write_flush() is called before 25 more lines have been written. +If nrows is too small (less than about 10 lines for a 640 pixel wide +RGB image) the image compression may decrease noticeably (although this +may be acceptable for real-time applications). Infrequent flushing will +only degrade the compression performance by a few percent over images +that do not use flushing. + +Writing the image data + +That's it for the transformations. Now you can write the image data. +The simplest way to do this is in one function call. If you have the +whole image in memory, you can just call png_write_image() and libpng +will write the image. You will need to pass in an array of pointers to +each row. This function automatically handles interlacing, so you don't +need to call png_set_interlace_handling() or call this function multiple +times, or any of that other stuff necessary with png_write_rows(). + + png_write_image(png_ptr, row_pointers); + +where row_pointers is: + + png_byte *row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to write the whole image at once, you can +use png_write_rows() instead. If the file is not interlaced, +this is simple: + + png_write_rows(png_ptr, row_pointers, + number_of_rows); + +row_pointers is the same as in the png_write_image() call. + +If you are just writing one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + + png_write_row(png_ptr, row_pointer); + +When the file is interlaced, things can get a good deal more complicated. +The only currently (as of the PNG Specification version 1.2, dated July +1999) defined interlacing scheme for PNG files is the "Adam7" interlace +scheme, that breaks down an image into seven smaller images of varying +size. libpng will build these images for you, or you can do them +yourself. If you want to build them yourself, see the PNG specification +for details of which pixels to write when. + +If you don't want libpng to handle the interlacing details, just +use png_set_interlace_handling() and call png_write_rows() the +correct number of times to write all the sub-images +(png_set_interlace_handling() returns the number of sub-images.) + +If you want libpng to build the sub-images, call this before you start +writing any rows: + + number_of_passes = png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this is seven, +but may change if another interlace type is added. + +Then write the complete image number_of_passes times. + + png_write_rows(png_ptr, row_pointers, number_of_rows); + +Think carefully before you write an interlaced image. Typically code that +reads such images reads all the image data into memory, uncompressed, before +doing any processing. Only code that can display an image on the fly can +take advantage of the interlacing and even then the image has to be exactly +the correct size for the output device, because scaling an image requires +adjacent pixels and these are not available until all the passes have been +read. + +If you do write an interlaced image you will hardly ever need to handle +the interlacing yourself. Call png_set_interlace_handling() and use the +approach described above. + +The only time it is conceivable that you will really need to write an +interlaced image pass-by-pass is when you have read one pass by pass and +made some pixel-by-pixel transformation to it, as described in the read +code above. In this case use the PNG_PASS_ROWS and PNG_PASS_COLS macros +to determine the size of each sub-image in turn and simply write the rows +you obtained from the read code. + +Finishing a sequential write + +After you are finished writing the image, you should finish writing +the file. If you are interested in writing comments or time, you should +pass an appropriately filled png_info pointer. If you are not interested, +you can pass NULL. + + png_write_end(png_ptr, info_ptr); + +When you are done, you can free all memory used by libpng like this: + + png_destroy_write_struct(&png_ptr, &info_ptr); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those cases do nothing. +The "seq" parameter is ignored if only one item of the selected data +type, such as PLTE, is allowed. If "seq" is not -1, and multiple items +are allowed for the data type identified in the mask, such as text or +sPLT, only the n'th item in the structure is freed, where n is "seq". + +If you allocated data such as a palette that you passed in to libpng +with png_set_*, you must not free it until just before the call to +png_destroy_write_struct(). + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + + mask - which data elements are affected + same choices as in png_free_data() + +For example, to transfer responsibility for some data from a read structure +to a write structure, you could use + + png_data_freer(read_ptr, read_info_ptr, + PNG_USER_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + + png_data_freer(write_ptr, write_info_ptr, + PNG_DESTROY_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + +thereby briefly reassigning responsibility for freeing to the user but +immediately afterwards reassigning it once more to the write_destroy +function. Having done this, it would then be safe to destroy the read +structure and continue to use the PLTE, tRNS, and hIST data in the write +structure. + +This function only affects data that has already been allocated. +You can call this function before calling after the png_set_*() functions +to control whether the user or png_destroy_*() is supposed to free the data. +When the user assumes responsibility for libpng-allocated data, the +application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. +For a more compact example of writing a PNG image, see the file example.c. + +V. Modifying/Customizing libpng: + +There are two issues here. The first is changing how libpng does +standard things like memory allocation, input/output, and error handling. +The second deals with more complicated things like adding new chunks, +adding new transformations, and generally changing how libpng works. +Both of those are compile-time issues; that is, they are generally +determined at the time the code is written, and there is rarely a need +to provide the user with a means of changing them. + +Memory allocation, input/output, and error handling + +All of the memory allocation, input/output, and error handling in libpng +goes through callbacks that are user-settable. The default routines are +in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change +these functions, call the appropriate png_set_*_fn() function. + +Memory allocation is done through the functions png_malloc(), png_calloc(), +and png_free(). These currently just call the standard C functions. +png_calloc() calls png_malloc() and then clears the newly +allocated memory to zero. There is limited support for certain systems +with segmented memory architectures and the types of pointers declared by +png.h match this; you will have to use appropriate pointers in your +application. Since it is +unlikely that the method of handling memory allocation on a platform +will change between applications, these functions must be modified in +the library at compile time. If you prefer to use a different method +of allocating and freeing data, you can use png_create_read_struct_2() or +png_create_write_struct_2() to register your own functions as described +above. These functions also provide a void pointer that can be retrieved +via + + mem_ptr=png_get_mem_ptr(png_ptr); + +Your replacement memory functions must have prototypes as follows: + + png_voidp malloc_fn(png_structp png_ptr, + png_alloc_size_t size); + + void free_fn(png_structp png_ptr, png_voidp ptr); + +Your malloc_fn() must return NULL in case of failure. The png_malloc() +function will normally call png_error() if it receives a NULL from the +system memory allocator or from your replacement malloc_fn(). + +Your free_fn() will never be called with a NULL ptr, since libpng's +png_free() checks for NULL before calling free_fn(). + +Input/Output in libpng is done through png_read() and png_write(), +which currently just call fread() and fwrite(). The FILE * is stored in +png_struct and is initialized via png_init_io(). If you wish to change +the method of I/O, the library supplies callbacks that you can set +through the function png_set_read_fn() and png_set_write_fn() at run +time, instead of calling the png_init_io() function. These functions +also provide a void pointer that can be retrieved via the function +png_get_io_ptr(). For example: + + png_set_read_fn(png_structp read_ptr, + voidp read_io_ptr, png_rw_ptr read_data_fn) + + png_set_write_fn(png_structp write_ptr, + voidp write_io_ptr, png_rw_ptr write_data_fn, + png_flush_ptr output_flush_fn); + + voidp read_io_ptr = png_get_io_ptr(read_ptr); + voidp write_io_ptr = png_get_io_ptr(write_ptr); + +The replacement I/O functions must have prototypes as follows: + + void user_read_data(png_structp png_ptr, + png_bytep data, png_size_t length); + + void user_write_data(png_structp png_ptr, + png_bytep data, png_size_t length); + + void user_flush_data(png_structp png_ptr); + +The user_read_data() function is responsible for detecting and +handling end-of-data errors. + +Supplying NULL for the read, write, or flush functions sets them back +to using the default C stream functions, which expect the io_ptr to +point to a standard *FILE structure. It is probably a mistake +to use NULL for one of write_data_fn and output_flush_fn but not both +of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined. +It is an error to read from a write stream, and vice versa. + +Error handling in libpng is done through png_error() and png_warning(). +Errors handled through png_error() are fatal, meaning that png_error() +should never return to its caller. Currently, this is handled via +setjmp() and longjmp() (unless you have compiled libpng with +PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()), +but you could change this to do things like exit() if you should wish, +as long as your function does not return. + +On non-fatal errors, png_warning() is called +to print a warning message, and then control returns to the calling code. +By default png_error() and png_warning() print a message on stderr via +fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined +(because you don't want the messages) or PNG_NO_STDIO defined (because +fprintf() isn't available). If you wish to change the behavior of the error +functions, you will need to set up your own message callbacks. These +functions are normally supplied at the time that the png_struct is created. +It is also possible to redirect errors and warnings to your own replacement +functions after png_create_*_struct() has been called by calling: + + png_set_error_fn(png_structp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warning_fn); + + png_voidp error_ptr = png_get_error_ptr(png_ptr); + +If NULL is supplied for either error_fn or warning_fn, then the libpng +default function will be used, calling fprintf() and/or longjmp() if a +problem is encountered. The replacement error functions should have +parameters as follows: + + void user_error_fn(png_structp png_ptr, + png_const_charp error_msg); + + void user_warning_fn(png_structp png_ptr, + png_const_charp warning_msg); + +The motivation behind using setjmp() and longjmp() is the C++ throw and +catch exception handling methods. This makes the code much easier to write, +as there is no need to check every return code of every function call. +However, there are some uncertainties about the status of local variables +after a longjmp, so the user may want to be careful about doing anything +after setjmp returns non-zero besides returning itself. Consult your +compiler documentation for more details. For an alternative approach, you +may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net). + +Custom chunks + +If you need to read or write custom chunks, you may need to get deeper +into the libpng code. The library now has mechanisms for storing +and writing chunks of unknown type; you can even declare callbacks +for custom chunks. However, this may not be good enough if the +library code itself needs to know about interactions between your +chunk and existing `intrinsic' chunks. + +If you need to write a new intrinsic chunk, first read the PNG +specification. Acquire a first level of understanding of how it works. +Pay particular attention to the sections that describe chunk names, +and look at how other chunks were designed, so you can do things +similarly. Second, check out the sections of libpng that read and +write chunks. Try to find a chunk that is similar to yours and use +it as a template. More details can be found in the comments inside +the code. It is best to handle unknown chunks in a generic method, +via callback functions, instead of by modifying libpng functions. + +If you wish to write your own transformation for the data, look through +the part of the code that does the transformations, and check out some of +the simpler ones to get an idea of how they work. Try to find a similar +transformation to the one you want to add and copy off of it. More details +can be found in the comments inside the code itself. + +Configuring for 16 bit platforms + +You will want to look into zconf.h to tell zlib (and thus libpng) that +it cannot allocate more then 64K at a time. Even if you can, the memory +won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K. + +Configuring for DOS + +For DOS users who only have access to the lower 640K, you will +have to limit zlib's memory usage via a png_set_compression_mem_level() +call. See zlib.h or zconf.h in the zlib library for more information. + +Configuring for Medium Model + +Libpng's support for medium model has been tested on most of the popular +compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets +defined, and FAR gets defined to far in pngconf.h, and you should be +all set. Everything in the library (except for zlib's structure) is +expecting far data. You must use the typedefs with the p or pp on +the end for pointers (or at least look at them and be careful). Make +note that the rows of data are defined as png_bytepp, which is an +unsigned char far * far *. + +Configuring for gui/windowing platforms: + +You will need to write new error and warning functions that use the GUI +interface, as described previously, and set them to be the error and +warning functions at the time that png_create_*_struct() is called, +in order to have them available during the structure initialization. +They can be changed later via png_set_error_fn(). On some compilers, +you may also have to change the memory allocators (png_malloc, etc.). + +Configuring for compiler xxx: + +All includes for libpng are in pngconf.h. If you need to add, change +or delete an include, this is the place to do it. +The includes that are not needed outside libpng are placed in pngpriv.h, +which is only used by the routines inside libpng itself. +The files in libpng proper only include pngpriv.h and png.h, which +in turn includes pngconf.h. + +Configuring zlib: + +There are special functions to configure the compression. Perhaps the +most useful one changes the compression level, which currently uses +input compression values in the range 0 - 9. The library normally +uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests +have shown that for a large majority of images, compression values in +the range 3-6 compress nearly as well as higher levels, and do so much +faster. For online applications it may be desirable to have maximum speed +(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also +specify no compression (Z_NO_COMPRESSION = 0), but this would create +files larger than just storing the raw bitmap. You can specify the +compression level by calling: + + png_set_compression_level(png_ptr, level); + +Another useful one is to reduce the memory level used by the library. +The memory level defaults to 8, but it can be lowered if you are +short on memory (running DOS, for example, where you only have 640K). +Note that the memory level does have an effect on compression; among +other things, lower levels will result in sections of incompressible +data being emitted in smaller stored blocks, with a correspondingly +larger relative overhead of up to 15% in the worst case. + + png_set_compression_mem_level(png_ptr, level); + +The other functions are for configuring zlib. They are not recommended +for normal use and may result in writing an invalid PNG file. See +zlib.h for more information on what these mean. + + png_set_compression_strategy(png_ptr, + strategy); + + png_set_compression_window_bits(png_ptr, + window_bits); + + png_set_compression_method(png_ptr, method); + png_set_compression_buffer_size(png_ptr, size); + +Controlling row filtering + +If you want to control whether libpng uses filtering or not, which +filters are used, and how it goes about picking row filters, you +can call one of these functions. The selection and configuration +of row filters can have a significant impact on the size and +encoding speed and a somewhat lesser impact on the decoding speed +of an image. Filtering is enabled by default for RGB and grayscale +images (with and without alpha), but not for paletted images nor +for any images with bit depths less than 8 bits/pixel. + +The 'method' parameter sets the main filtering method, which is +currently only '0' in the PNG 1.2 specification. The 'filters' +parameter sets which filter(s), if any, should be used for each +scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS +to turn filtering on and off, respectively. + +Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB, +PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise +ORed together with '|' to specify one or more filters to use. +These filters are described in more detail in the PNG specification. +If you intend to change the filter type during the course of writing +the image, you should start with flags set for all of the filters +you intend to use so that libpng can initialize its internal +structures appropriately for all of the filter types. (Note that this +means the first row must always be adaptively filtered, because libpng +currently does not allocate the filter buffers until png_write_row() +is called for the first time.) + + filters = PNG_FILTER_NONE | PNG_FILTER_SUB + PNG_FILTER_UP | PNG_FILTER_AVG | + PNG_FILTER_PAETH | PNG_ALL_FILTERS; + + png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, + filters); + The second parameter can also be + PNG_INTRAPIXEL_DIFFERENCING if you are + writing a PNG to be embedded in a MNG + datastream. This parameter must be the + same as the value of filter_method used + in png_set_IHDR(). + +It is also possible to influence how libpng chooses from among the +available filters. This is done in one or both of two ways - by +telling it how important it is to keep the same filter for successive +rows, and by telling it the relative computational costs of the filters. + + double weights[3] = {1.5, 1.3, 1.1}, + costs[PNG_FILTER_VALUE_LAST] = + {1.0, 1.3, 1.3, 1.5, 1.7}; + + png_set_filter_heuristics(png_ptr, + PNG_FILTER_HEURISTIC_WEIGHTED, 3, + weights, costs); + +The weights are multiplying factors that indicate to libpng that the +row filter should be the same for successive rows unless another row filter +is that many times better than the previous filter. In the above example, +if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a +"sum of absolute differences" 1.5 x 1.3 times higher than other filters +and still be chosen, while the NONE filter could have a sum 1.1 times +higher than other filters and still be chosen. Unspecified weights are +taken to be 1.0, and the specified weights should probably be declining +like those above in order to emphasize recent filters over older filters. + +The filter costs specify for each filter type a relative decoding cost +to be considered when selecting row filters. This means that filters +with higher costs are less likely to be chosen over filters with lower +costs, unless their "sum of absolute differences" is that much smaller. +The costs do not necessarily reflect the exact computational speeds of +the various filters, since this would unduly influence the final image +size. + +Note that the numbers above were invented purely for this example and +are given only to help explain the function usage. Little testing has +been done to find optimum values for either the costs or the weights. + +Removing unwanted object code + +There are a bunch of #define's in pngconf.h that control what parts of +libpng are compiled. All the defines end in _SUPPORTED. If you are +never going to use a capability, you can change the #define to #undef +before recompiling libpng and save yourself code and data space, or +you can turn off individual capabilities with defines that begin with +PNG_NO_. + +In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead. + +You can also turn all of the transforms and ancillary chunk capabilities +off en masse with compiler directives that define +PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS, +or all four, +along with directives to turn on any of the capabilities that you do +want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra +transformations but still leave the library fully capable of reading +and writing PNG files with all known public chunks. Use of the +PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library +that is incapable of reading or writing ancillary chunks. If you are +not using the progressive reading capability, you can turn that off +with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING +capability, which you'll still have). + +All the reading and writing specific code are in separate files, so the +linker should only grab the files it needs. However, if you want to +make sure, or if you are building a stand alone library, all the +reading files start with pngr and all the writing files start with +pngw. The files that don't match either (like png.c, pngtrans.c, etc.) +are used for both reading and writing, and always need to be included. +The progressive reader is in pngpread.c + +If you are creating or distributing a dynamically linked library (a .so +or DLL file), you should not remove or disable any parts of the library, +as this will cause applications linked with different versions of the +library to fail if they call functions not available in your library. +The size of the library itself should not be an issue, because only +those sections that are actually used will be loaded into memory. + +Requesting debug printout + +The macro definition PNG_DEBUG can be used to request debugging +printout. Set it to an integer value in the range 0 to 3. Higher +numbers result in increasing amounts of debugging information. The +information is printed to the "stderr" file, unless another file +name is specified in the PNG_DEBUG_FILE macro definition. + +When PNG_DEBUG > 0, the following functions (macros) become available: + + png_debug(level, message) + png_debug1(level, message, p1) + png_debug2(level, message, p1, p2) + +in which "level" is compared to PNG_DEBUG to decide whether to print +the message, "message" is the formatted string to be printed, +and p1 and p2 are parameters that are to be embedded in the string +according to printf-style formatting directives. For example, + + png_debug1(2, "foo=%d\n", foo); + +is expanded to + + if (PNG_DEBUG > 2) + fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo); + +When PNG_DEBUG is defined but is zero, the macros aren't defined, but you +can still use PNG_DEBUG to control your own debugging: + + #ifdef PNG_DEBUG + fprintf(stderr, ... + #endif + +When PNG_DEBUG = 1, the macros are defined, but only png_debug statements +having level = 0 will be printed. There aren't any such statements in +this version of libpng, but if you insert some they will be printed. + +VI. MNG support + +The MNG specification (available at http://www.libpng.org/pub/mng) allows +certain extensions to PNG for PNG images that are embedded in MNG datastreams. +Libpng can support some of these extensions. To enable them, use the +png_permit_mng_features() function: + + feature_set = png_permit_mng_features(png_ptr, mask) + + mask is a png_uint_32 containing the bitwise OR of the + features you want to enable. These include + PNG_FLAG_MNG_EMPTY_PLTE + PNG_FLAG_MNG_FILTER_64 + PNG_ALL_MNG_FEATURES + + feature_set is a png_uint_32 that is the bitwise AND of + your mask with the set of MNG features that is + supported by the version of libpng that you are using. + +It is an error to use this function when reading or writing a standalone +PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped +in a MNG datastream. As a minimum, it must have the MNG 8-byte signature +and the MHDR and MEND chunks. Libpng does not provide support for these +or any other MNG chunks; your application must provide its own support for +them. You may wish to consider using libmng (available at +http://www.libmng.com) instead. + +VII. Changes to Libpng from version 0.88 + +It should be noted that versions of libpng later than 0.96 are not +distributed by the original libpng author, Guy Schalnat, nor by +Andreas Dilger, who had taken over from Guy during 1996 and 1997, and +distributed versions 0.89 through 0.96, but rather by another member +of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are +still alive and well, but they have moved on to other things. + +The old libpng functions png_read_init(), png_write_init(), +png_info_init(), png_read_destroy(), and png_write_destroy() have been +moved to PNG_INTERNAL in version 0.95 to discourage their use. These +functions will be removed from libpng version 1.4.0. + +The preferred method of creating and initializing the libpng structures is +via the png_create_read_struct(), png_create_write_struct(), and +png_create_info_struct() because they isolate the size of the structures +from the application, allow version error checking, and also allow the +use of custom error handling routines during the initialization, which +the old functions do not. The functions png_read_destroy() and +png_write_destroy() do not actually free the memory that libpng +allocated for these structs, but just reset the data structures, so they +can be used instead of png_destroy_read_struct() and +png_destroy_write_struct() if you feel there is too much system overhead +allocating and freeing the png_struct for each image read. + +Setting the error callbacks via png_set_message_fn() before +png_read_init() as was suggested in libpng-0.88 is no longer supported +because this caused applications that do not use custom error functions +to fail if the png_ptr was not initialized to zero. It is still possible +to set the error callbacks AFTER png_read_init(), or to change them with +png_set_error_fn(), which is essentially the same function, but with a new +name to force compilation errors with applications that try to use the old +method. + +Starting with version 1.0.7, you can find out which version of the library +you are using at run-time: + + png_uint_32 libpng_vn = png_access_version_number(); + +The number libpng_vn is constructed from the major version, minor +version with leading zero, and release number with leading zero, +(e.g., libpng_vn for version 1.0.7 is 10007). + +You can also check which version of png.h you used when compiling your +application: + + png_uint_32 application_vn = PNG_LIBPNG_VER; + +VIII. Changes to Libpng from version 1.0.x to 1.2.x + +Support for user memory management was enabled by default. To +accomplish this, the functions png_create_read_struct_2(), +png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(), +png_malloc_default(), and png_free_default() were added. + +Support for the iTXt chunk has been enabled by default as of +version 1.2.41. + +Support for certain MNG features was enabled. + +Support for numbered error messages was added. However, we never got +around to actually numbering the error messages. The function +png_set_strip_error_numbers() was added (Note: the prototype for this +function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE +builds of libpng-1.2.15. It was restored in libpng-1.2.36). + +The png_malloc_warn() function was added at libpng-1.2.3. This issues +a png_warning and returns NULL instead of aborting when it fails to +acquire the requested memory allocation. + +Support for setting user limits on image width and height was enabled +by default. The functions png_set_user_limits(), png_get_user_width_max(), +and png_get_user_height_max() were added at libpng-1.2.6. + +The png_set_add_alpha() function was added at libpng-1.2.7. + +The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9. +Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the +tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is +deprecated. + +A number of macro definitions in support of runtime selection of +assembler code features (especially Intel MMX code support) were +added at libpng-1.2.0: + + PNG_ASM_FLAG_MMX_SUPPORT_COMPILED + PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU + PNG_ASM_FLAG_MMX_READ_COMBINE_ROW + PNG_ASM_FLAG_MMX_READ_INTERLACE + PNG_ASM_FLAG_MMX_READ_FILTER_SUB + PNG_ASM_FLAG_MMX_READ_FILTER_UP + PNG_ASM_FLAG_MMX_READ_FILTER_AVG + PNG_ASM_FLAG_MMX_READ_FILTER_PAETH + PNG_ASM_FLAGS_INITIALIZED + PNG_MMX_READ_FLAGS + PNG_MMX_FLAGS + PNG_MMX_WRITE_FLAGS + PNG_MMX_FLAGS + +We added the following functions in support of runtime +selection of assembler code features: + + png_get_mmx_flagmask() + png_set_mmx_thresholds() + png_get_asm_flags() + png_get_mmx_bitdepth_threshold() + png_get_mmx_rowbytes_threshold() + png_set_asm_flags() + +We replaced all of these functions with simple stubs in libpng-1.2.20, +when the Intel assembler code was removed due to a licensing issue. + +These macros are deprecated: + + PNG_READ_TRANSFORMS_NOT_SUPPORTED + PNG_PROGRESSIVE_READ_NOT_SUPPORTED + PNG_NO_SEQUENTIAL_READ_SUPPORTED + PNG_WRITE_TRANSFORMS_NOT_SUPPORTED + PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED + PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED + +They have been replaced, respectively, by: + + PNG_NO_READ_TRANSFORMS + PNG_NO_PROGRESSIVE_READ + PNG_NO_SEQUENTIAL_READ + PNG_NO_WRITE_TRANSFORMS + PNG_NO_READ_ANCILLARY_CHUNKS + PNG_NO_WRITE_ANCILLARY_CHUNKS + +PNG_MAX_UINT was replaced with PNG_UINT_31_MAX. It has been +deprecated since libpng-1.0.16 and libpng-1.2.6. + +The function + png_check_sig(sig, num) +was replaced with + !png_sig_cmp(sig, 0, num) +It has been deprecated since libpng-0.90. + +The function + png_set_gray_1_2_4_to_8() +which also expands tRNS to alpha was replaced with + png_set_expand_gray_1_2_4_to_8() +which does not. It has been deprecated since libpng-1.0.18 and 1.2.9. + +IX. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x + +Private libpng prototypes and macro definitions were moved from +png.h and pngconf.h into a new pngpriv.h header file. + +Functions png_set_benign_errors(), png_benign_error(), and +png_chunk_benign_error() were added. + +Support for setting the maximum amount of memory that the application +will allocate for reading chunks was added, as a security measure. +The functions png_set_chunk_cache_max() and png_get_chunk_cache_max() +were added to the library. + +We implemented support for I/O states by adding png_ptr member io_state +and functions png_get_io_chunk_name() and png_get_io_state() in pngget.c + +We added PNG_TRANSFORM_GRAY_TO_RGB to the available high-level +input transforms. + +Checking for and reporting of errors in the IHDR chunk is more thorough. + +Support for global arrays was removed, to improve thread safety. + +Some obsolete/deprecated macros and functions have been removed. + +Typecasted NULL definitions such as + #define png_voidp_NULL (png_voidp)NULL +were eliminated. If you used these in your application, just use +NULL instead. + +The png_struct and info_struct members "trans" and "trans_values" were +changed to "trans_alpha" and "trans_color", respectively. + +The obsolete, unused pnggccrd.c and pngvcrd.c files and related makefiles +were removed. + +The PNG_1_0_X and PNG_1_2_X macros were eliminated. + +The PNG_LEGACY_SUPPORTED macro was eliminated. + +Many WIN32_WCE #ifdefs were removed. + +The functions png_read_init(info_ptr), png_write_init(info_ptr), +png_info_init(info_ptr), png_read_destroy(), and png_write_destroy() +have been removed. They have been deprecated since libpng-0.95. + +The png_permit_empty_plte() was removed. It has been deprecated +since libpng-1.0.9. Use png_permit_mng_features() instead. + +We removed the obsolete stub functions png_get_mmx_flagmask(), +png_set_mmx_thresholds(), png_get_asm_flags(), +png_get_mmx_bitdepth_threshold(), png_get_mmx_rowbytes_threshold(), +png_set_asm_flags(), and png_mmx_supported() + +We removed the obsolete png_check_sig(), png_memcpy_check(), and +png_memset_check() functions. Instead use !png_sig_cmp(), memcpy(), +and memset(), respectively. + +The function png_set_gray_1_2_4_to_8() was removed. It has been +deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with +png_set_expand_gray_1_2_4_to_8() because the former function also +expanded palette images. + +Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32 +were added and are used by default instead of the corresponding +functions. Unfortunately, +from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. + +We changed the prototype for png_malloc() from + png_malloc(png_structp png_ptr, png_uint_32 size) +to + png_malloc(png_structp png_ptr, png_alloc_size_t size) + +This also applies to the prototype for the user replacement malloc_fn(). + +The png_calloc() function was added and is used in place of +of "png_malloc(); memset();" except in the case in png_read_png() +where the array consists of pointers; in this case a "for" loop is used +after the png_malloc() to set the pointers to NULL, to give robust. +behavior in case the application runs out of memory part-way through +the process. + +We changed the prototypes of png_get_compression_buffer_size() and +png_set_compression_buffer_size() to work with png_size_t instead of +png_uint_32. + +Support for numbered error messages was removed by default, since we +never got around to actually numbering the error messages. The function +png_set_strip_error_numbers() was removed from the library by default. + +The png_zalloc() and png_zfree() functions are no longer exported. +The png_zalloc() function no longer zeroes out the memory that it +allocates. + +Support for dithering was disabled by default in libpng-1.4.0, because +been well tested and doesn't actually "dither". The code was not +removed, however, and could be enabled by building libpng with +PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support +was reenabled, but the function was renamed png_set_quantize() to +reflect more accurately what it actually does. At the same time, +the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to +PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED +was renamed to PNG_READ_QUANTIZE_SUPPORTED. + +We removed the trailing '.' from the warning and error messages. + +X. Changes to Libpng from version 1.4.x to 1.5.x + +From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. + +A. Changes that affect users of libpng + +There are no substantial API changes between the non-deprecated parts of +the 1.4.5 API and the 1.5.0 API, however the ability to directly access +the main libpng control structures, png_struct and png_info, deprecated +in earlier versions of libpng, has been completely removed from +libpng 1.5. + +We no longer include zlib.h in png.h. Applications that need access +to information in zlib.h will need to add the '#include "zlib.h"' +directive. It does not matter whether it is placed prior to or after +the '"#include png.h"' directive. + +We moved the png_strcpy(), png_strncpy(), png_strlen(), png_memcpy(), +png_memcmp(), png_sprintf, and png_memcpy() macros into a private +header file (pngpriv.h) that is not accessible to applications. + +In png_get_iCCP, the type of "profile" was changed from png_charpp +to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep. + +There are changes of form in png.h, including new and changed macros to +declare +parts of the API. Some API functions with arguments that are pointers to +data not modified within the function have been corrected to declare +these arguments with PNG_CONST. + +Much of the internal use of C macros to control the library build has also +changed and some of this is visible in the exported header files, in +particular the use of macros to control data and API elements visible +during application compilation may require significant revision to +application code. (It is extremely rare for an application to do this.) + +Any program that compiled against libpng 1.4 and did not use deprecated +features or access internal library structures should compile and work +against libpng 1.5. + +libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of +interlaced images. The macros return the number of rows and columns in +each pass and information that can be used to de-interlace and (if +absolutely necessary) interlace an image. + +libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls +the application provided png_longjmp_ptr on the internal, but application +initialized, jmpbuf. It is provided as a convenience to avoid the need +to use the png_jmpbuf macro, which had the unnecessary side effect of +resetting the internal png_longjmp_ptr value. + +libpng 1.5.0 includes a complete fixed point API. By default this is +present along with the corresponding floating point API. In general the +fixed point API is faster and smaller than the floating point one because +the PNG file format used fixed point, not floating point. This applies +even if the library uses floating point in internal calculations. A new +macro, PNG_FLOATING_ARITHMETIC_SUPPORTED, reveals whether the library +uses floating point arithmetic (the default) or fixed point arithmetic +internally for performance critical calculations such as gamma correction. +In some cases, the gamma calculations may produce slightly different +results. This has changed the results in png_rgb_to_gray and in alpha +composition (png_set_background for example). This applies even if the +original image was already linear (gamma == 1.0) and, therefore, it is +not necessary to linearize the image. This is because libpng has *not* +been changed to optimize that case correctly, yet. + +Fixed point support for the sCAL chunk comes with an important caveat; +the sCAL specification uses a decimal encoding of floating point values +and the accuracy of PNG fixed point values is insufficient for +representation of these values. Consequently a "string" API +(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading +arbitrary sCAL chunks in the absence of either the floating point API or +internal floating point calculations. + +Applications no longer need to include the optional distribution header +file pngusr.h or define the corresponding macros during application +build in order to see the correct variant of the libpng API. From 1.5.0 +application code can check for the corresponding _SUPPORTED macro: + +#ifdef PNG_INCH_CONVERSIONS_SUPPORTED + /* code that uses the inch conversion APIs. */ +#endif + +This macro will only be defined if the inch conversion functions have been +compiled into libpng. The full set of macros, and whether or not support +has been compiled in, are available in the header file pnglibconf.h. +This header file is specific to the libpng build. Notice that prior to +1.5.0 the _SUPPORTED macros would always have the default definition unless +reset by pngusr.h or by explicit settings on the compiler command line. +These settings may produce compiler warnings or errors in 1.5.0 because +of macro redefinition. + +From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. libpng 1.5.0 +is consistent with the implementation in 1.4.5 and 1.2.x (where the macro +did not exist.) + +Applications can now choose whether to use these macros or to call the +corresponding function by defining PNG_USE_READ_MACROS or +PNG_NO_USE_READ_MACROS before including png.h. Notice that this is +only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0 + will lead to a link failure. + +B. Changes to the build and configuration of libpng + +Details of internal changes to the library code can be found in the CHANGES +file. These will be of no concern to the vast majority of library users or +builders, however the few who configure libpng to a non-default feature +set may need to change how this is done. + +There should be no need for library builders to alter build scripts if +these use the distributed build support - configure or the makefiles - +however users of the makefiles may care to update their build scripts +to build pnglibconf.h where the corresponding makefile does not do so. + +Building libpng with a non-default configuration has changed completely. +The old method using pngusr.h should still work correctly even though the +way pngusr.h is used in the build has been changed, however library +builders will probably want to examine the changes to take advantage of +new capabilities and to simplify their build system. + +B.1 Specific changes to library configuration capabilities + +The library now supports a complete fixed point implementation and can +thus be used on systems which have no floating point support or very +limited or slow support. Previously gamma correction, an essential part +of complete PNG support, required reasonably fast floating point. + +As part of this the choice of internal implementation has been made +independent of the choice of fixed versus floating point APIs and all the +missing fixed point APIs have been implemented. + +The exact mechanism used to control attributes of API functions has +changed. A single set of operating system independent macro definitions +is used and operating system specific directives are defined in +pnglibconf.h + +As part of this the mechanism used to choose procedure call standards on +those systems that allow a choice has been changed. At present this only +affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems +running on Intel processors. As before PNGAPI is defined where required +to control the exported API functions; however, two new macros, PNGCBAPI +and PNGCAPI, are used instead for callback functions (PNGCBAPI) and +(PNGCAPI) for functions that must match a C library prototype (currently +only png_longjmp_ptr, which must match the C longjmp function.) The new +approach is documented in pngconf.h + +Despite these changes libpng 1.5.0 only supports the native C function +calling standard on those platforms tested so far (__cdecl on Microsoft +Windows). This is because the support requirements for alternative +calling conventions seem to no longer exist. Developers who find it +necessary to set PNG_API_RULE to 1 should advise the mailing list +(png-mng-implement) of this and library builders who use Openwatcom and +therefore set PNG_API_RULE to 2 should also contact the mailing list. + +A new test program, pngvalid, is provided in addition to pngtest. +pngvalid validates the arithmetic accuracy of the gamma correction +calculations and includes a number of validations of the file format. +A subset of the full range of tests is run when "make check" is done +(in the 'configure' build.) pngvalid also allows total allocated memory +usage to be evaluated and performs additional memory overwrite validation. + +Many changes to individual feature macros have been made. The following +are the changes most likely to be noticed by library builders who +configure libpng: + +1) All feature macros now have consistent naming: + +#define PNG_NO_feature turns the feature off +#define PNG_feature_SUPPORTED turns the feature on + +pnglibconf.h contains one line for each feature macro which is either: + +#define PNG_feature_SUPPORTED + +if the feature is supported or: + +/*#undef PNG_feature_SUPPORTED*/ + +if it is not. Library code consistently checks for the 'SUPPORTED' macro. +It does not, and should not, check for the 'NO' macro which will not +normally be defined even if the feature is not supported. + +Compatibility with the old names is provided as follows: + +PNG_INCH_CONVERSIONS turns on PNG_INCH_CONVERSIONS_SUPPORTED + +And the following definitions disable the corresponding feature: + +PNG_SETJMP_NOT_SUPPORTED disables SETJMP +PNG_READ_TRANSFORMS_NOT_SUPPORTED disables READ_TRANSFORMS +PNG_NO_READ_COMPOSITED_NODIV disables READ_COMPOSITE_NODIV +PNG_WRITE_TRANSFORMS_NOT_SUPPORTED disables WRITE_TRANSFORMS +PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED disables READ_ANCILLARY_CHUNKS +PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED disables WRITE_ANCILLARY_CHUNKS + +Library builders should remove use of the above, inconsistent, names. + +2) Warning and error message formatting was previously conditional on +the STDIO feature. The library has been changed to use the +CONSOLE_IO feature instead. This means that if CONSOLE_IO is disabled +the library no longer uses the printf(3) functions, even though the +default read/write implementations use (FILE) style stdio.h functions. + +3) Three feature macros now control the fixed/floating point decisions: + +PNG_FLOATING_POINT_SUPPORTED enables the floating point APIs + +PNG_FIXED_POINT_SUPPORTED enables the fixed point APIs; however, in +practice these are normally required internally anyway (because the PNG +file format is fixed point), therefore in most cases PNG_NO_FIXED_POINT +merely stops the function from being exported. + +PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating +point implementation or the fixed point one. Typically the fixed point +implementation is larger and slower than the floating point implementation +on a system that supports floating point, however it may be faster on a +system which lacks floating point hardware and therefore uses a software +emulation. + +4) Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the +functions to read and write ints to be disabled independently of +PNG_USE_READ_MACROS, which allows libpng to be built with the functions +even though the default is to use the macros - this allows applications +to choose at app buildtime whether or not to use macros (previously +impossible because the functions weren't in the default build.) + +B.2 Changes to the configuration mechanism + +Prior to libpng-1.5.0 library builders who needed to configure libpng +had either to modify the exported pngconf.h header file to add system +specific configuration or had to write feature selection macros into +pngusr.h and cause this to be included into pngconf.h by defining +PNG_USER_CONFIG. The latter mechanism had the disadvantage that an +application built without PNG_USER_CONFIG defined would see the +unmodified, default, libpng API and thus would probably fail to link. + +These mechanisms still work in the configure build and in any makefile +build that builds pnglibconf.h although the feature selection macros +have changed somewhat as described above. In 1.5.0, however, pngusr.h is +processed only once, when the exported header file pnglibconf.h is built. +pngconf.h no longer includes pngusr.h, therefore it is ignored after the +build of pnglibconf.h and it is never included in an application build. + +The rarely used alternative of adding a list of feature macros to the +CFLAGS setting in the build also still works, however the macros will be +copied to pnglibconf.h and this may produce macro redefinition warnings +when the individual C files are compiled. + +All configuration now only works if pnglibconf.h is built from +scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan +(the original author of awk) maintains C source code of that awk and this +and all known later implementations (often called by subtly different +names - nawk and gawk for example) are adequate to build pnglibconf.h. +The Sun Microsystems (now Oracle) program 'awk' is an earlier version +and does not work, this may also apply to other systems that have a +functioning awk called 'nawk'. + +Configuration options are now documented in scripts/pnglibconf.dfa. This +file also includes dependency information that ensures a configuration is +consistent; that is, if a feature is switched off dependent features are +also removed. As a recommended alternative to using feature macros in +pngusr.h a system builder may also define equivalent options in pngusr.dfa +(or, indeed, any file) and add that to the configuration by setting +DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate +how to do this, and a case where pngusr.h is still required. + +XI. Detecting libpng + +The png_get_io_ptr() function has been present since libpng-0.88, has never +changed, and is unaffected by conditional compilation macros. It is the +best choice for use in configure scripts for detecting the presence of any +libpng version since 0.88. In an autoconf "configure.in" you could use + + AC_CHECK_LIB(png, png_get_io_ptr, ... + +XII. Source code repository + +Since about February 2009, version 1.2.34, libpng has been under "git" source +control. The git repository was built from old libpng-x.y.z.tar.gz files +going back to version 0.70. You can access the git repository (read only) +at + + git://libpng.git.sourceforge.net/gitroot/libpng + +or you can browse it via "gitweb" at + + http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng + +Patches can be sent to glennrp at users.sourceforge.net or to +png-mng-implement at lists.sourceforge.net or you can upload them to +the libpng bug tracker at + + http://libpng.sourceforge.net + +We also accept patches built from the tar or zip distributions, and +simple verbal discriptions of bug fixes, reported either to the +SourceForge bug tracker or to the png-mng-implement at lists.sf.net +mailing list. + +XIII. Coding style + +Our coding style is similar to the "Allman" style, with curly +braces on separate lines: + + if (condition) + { + action; + } + + else if (another condition) + { + another action; + } + +The braces can be omitted from simple one-line actions: + + if (condition) + return (0); + +We use 3-space indentation, except for continued statements which +are usually indented the same as the first line of the statement +plus four more spaces. + +For macro definitions we use 2-space indentation, always leaving the "#" +in the first column. + + #ifndef PNG_NO_FEATURE + # ifndef PNG_FEATURE_SUPPORTED + # define PNG_FEATURE_SUPPORTED + # endif + #endif + +Comments appear with the leading "/*" at the same indentation as +the statement that follows the comment: + + /* Single-line comment */ + statement; + + /* This is a multiple-line + * comment. + */ + statement; + +Very short comments can be placed after the end of the statement +to which they pertain: + + statement; /* comment */ + +We don't use C++ style ("//") comments. We have, however, +used them in the past in some now-abandoned MMX assembler +code. + +Functions and their curly braces are not indented, and +exported functions are marked with PNGAPI: + + /* This is a public function that is visible to + * application programmers. It does thus-and-so. + */ + void PNGAPI + png_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for all exported functions appear in png.h, +above the comment that says + + /* Maintainer: Put new public prototypes here ... */ + +We mark all non-exported functions with "/* PRIVATE */"": + + void /* PRIVATE */ + png_non_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for non-exported functions (except for those in +pngtest) appear in +pngpriv.h +above the comment that says + + /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +To avoid polluting the global namespace, the names of all exported +functions and variables begin with "png_", and all publicly visible C +preprocessor macros begin with "PNG_". We request that applications that +use libpng *not* begin any of their own symbols with either of these strings. + +We put a space after each comma and after each semicolon +in "for" statements, and we put spaces before and after each +C binary operator and after "for" or "while", and before +"?". We don't put a space between a typecast and the expression +being cast, nor do we put one between a function name and the +left parenthesis that follows it: + + for (i = 2; i > 0; --i) + y[i] = a(x) + (int)b; + +We prefer #ifdef and #ifndef to #if defined() and if !defined() +when there is only one macro being tested. + +We do not use the TAB character for indentation in the C sources. + +Lines do not exceed 80 characters. + +Other rules can be inferred by inspecting the libpng source. + +XIV. Y2K Compliance in libpng + +February 3, 2011 + +Since the PNG Development group is an ad-hoc body, we can't make +an official declaration. + +This is your unofficial assurance that libpng from version 0.71 and +upward through 1.5.1 are Y2K compliant. It is my belief that earlier +versions were also Y2K compliant. + +Libpng only has three year fields. One is a 2-byte unsigned integer that +will hold years up to 65535. The other two hold the date in text +format, and will hold years up to 9999. + +The integer is + "png_uint_16 year" in png_time_struct. + +The strings are + "png_charp time_buffer" in png_struct and + "near_time_buffer", which is a local character string in png.c. + +There are seven time-related functions: + + png_convert_to_rfc_1123() in png.c + (formerly png_convert_to_rfc_1152() in error) + png_convert_from_struct_tm() in pngwrite.c, called + in pngwrite.c + png_convert_from_time_t() in pngwrite.c + png_get_tIME() in pngget.c + png_handle_tIME() in pngrutil.c, called in pngread.c + png_set_tIME() in pngset.c + png_write_tIME() in pngwutil.c, called in pngwrite.c + +All appear to handle dates properly in a Y2K environment. The +png_convert_from_time_t() function calls gmtime() to convert from system +clock time, which returns (year - 1900), which we properly convert to +the full 4-digit year. There is a possibility that applications using +libpng are not passing 4-digit years into the png_convert_to_rfc_1123() +function, or that they are incorrectly passing only a 2-digit year +instead of "year - 1900" into the png_convert_from_struct_tm() function, +but this is not under our control. The libpng documentation has always +stated that it works with 4-digit years, and the APIs have been +documented as such. + +The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned +integer to hold the year, and can hold years as large as 65535. + +zlib, upon which libpng depends, is also Y2K compliant. It contains +no date-related code. + + + Glenn Randers-Pehrson + libpng maintainer + PNG Development Group diff --git a/src/3rdparty/libpng/libpng.3 b/src/3rdparty/libpng/libpng.3 new file mode 100644 index 0000000000..ecc42777bf --- /dev/null +++ b/src/3rdparty/libpng/libpng.3 @@ -0,0 +1,5376 @@ +.TH LIBPNG 3 "February 3, 2011" +.SH NAME +libpng \- Portable Network Graphics (PNG) Reference Library 1.5.1 +.SH SYNOPSIS +\fI\fB + +\fB#include \fP + +\fI\fB + +\fBpng_uint_32 png_access_version_number \fI(void\fP\fB);\fP + +\fI\fB + +\fBvoid png_benign_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP + +\fI\fB + +\fBvoid png_build_grayscale_palette (int \fP\fIbit_depth\fP\fB, png_colorp \fIpalette\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_calloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP + +\fI\fB + +\fBvoid png_chunk_benign_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP + +\fI\fB + +\fBvoid png_chunk_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP + +\fI\fB + +\fBvoid png_chunk_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP + +\fI\fB + +\fBvoid png_convert_from_struct_tm (png_timep \fP\fIptime\fP\fB, struct tm FAR * \fIttime\fP\fB);\fP + +\fI\fB + +\fBvoid png_convert_from_time_t (png_timep \fP\fIptime\fP\fB, time_t \fIttime\fP\fB);\fP + +\fI\fB + +\fBpng_charp png_convert_to_rfc1123 (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fIptime\fP\fB);\fP + +\fI\fB + +\fBpng_infop png_create_info_struct (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_structp png_create_read_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP + +\fI\fB + +\fBpng_structp png_create_read_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP + +\fI\fB + +\fBpng_structp png_create_write_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP + +\fI\fB + +\fBpng_structp png_create_write_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_data_freer (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIfreer\fP\fB, png_uint_32 \fImask)\fP\fB);\fP + +\fI\fB + +\fBvoid png_destroy_info_struct (png_structp \fP\fIpng_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_destroy_read_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fP\fIinfo_ptr_ptr\fP\fB, png_infopp \fIend_info_ptr_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_destroy_write_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_err (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP + +\fI\fB + +\fBvoid png_free (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_free_chunk_list (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_free_default (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_free_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fInum\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_bit_depth (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_bKGD (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fI*background\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_channels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_cHRM (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*white_x\fP\fB, double \fP\fI*white_y\fP\fB, double \fP\fI*red_x\fP\fB, double \fP\fI*red_y\fP\fB, double \fP\fI*green_x\fP\fB, double \fP\fI*green_y\fP\fB, double \fP\fI*blue_x\fP\fB, double \fI*blue_y\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_cHRM_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*white_x\fP\fB, png_uint_32 \fP\fI*white_y\fP\fB, png_uint_32 \fP\fI*red_x\fP\fB, png_uint_32 \fP\fI*red_y\fP\fB, png_uint_32 \fP\fI*green_x\fP\fB, png_uint_32 \fP\fI*green_y\fP\fB, png_uint_32 \fP\fI*blue_x\fP\fB, png_uint_32 \fI*blue_y\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_chunk_cache_max (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBpng_alloc_size_t png_get_chunk_malloc_max (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_color_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_compression_buffer_size (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_compression_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_copyright (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_current_row_number \fI(png_const_structp\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_current_pass_number \fI(png_const_structp\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_error_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_filter_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_gAMA (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fI*file_gamma\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_gAMA_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fI*int_file_gamma\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_header_ver (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_header_version (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_hIST (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fI*hist\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_iCCP (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_charpp \fP\fIname\fP\fB, int \fP\fI*compression_type\fP\fB, png_bytepp \fP\fIprofile\fP\fB, png_uint_32 \fI*proflen\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*width\fP\fB, png_uint_32 \fP\fI*height\fP\fB, int \fP\fI*bit_depth\fP\fB, int \fP\fI*color_type\fP\fB, int \fP\fI*interlace_type\fP\fB, int \fP\fI*compression_type\fP\fB, int \fI*filter_type\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_image_height (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_image_width (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_int_32 (png_bytep \fIbuf\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_interlace_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_const_bytep png_get_io_chunk_name (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_io_chunk_type (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_io_ptr (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_io_state (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_libpng_ver (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_mem_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_oFFs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*offset_x\fP\fB, png_uint_32 \fP\fI*offset_y\fP\fB, int \fI*unit_type\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_pCAL (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fI*purpose\fP\fB, png_int_32 \fP\fI*X0\fP\fB, png_int_32 \fP\fI*X1\fP\fB, int \fP\fI*type\fP\fB, int \fP\fI*nparams\fP\fB, png_charp \fP\fI*units\fP\fB, png_charpp \fI*params\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_pHYs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP + +\fI\fB + +\fBfloat png_get_pixel_aspect_ratio (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_pHYs_dpi (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP + +\fI\fB + +\fBpng_fixed_point png_get_pixel_aspect_ratio_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_progressive_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_PLTE (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fI*palette\fP\fB, int \fI*num_palette\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_rgb_to_gray_status (png_const_structp \fIpng_ptr) + +\fBpng_uint_32 png_get_rowbytes (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_bytepp png_get_rows (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_sBIT (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fI*sig_bit\fP\fB);\fP + +\fI\fB + +\fBvoid png_get_sCAL (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, double* \fP\fIwidth\fP\fB, double* \fIheight\fP\fB);\fP + +\fI\fB + +\fBvoid png_get_sCAL_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, png_fixed_pointp \fP\fIwidth\fP\fB, png_fixed_pointp \fIheight\fP\fB);\fP + +\fI\fB + +\fBvoid png_get_sCAL_s (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, png_charpp \fP\fIwidth\fP\fB, png_charpp \fIheight\fP\fB);\fP + +\fI\fB + +\fBpng_bytep png_get_signature (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_sPLT (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fI*splt_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_sRGB (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int \fI*file_srgb_intent\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_text (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fI*text_ptr\fP\fB, int \fI*num_text\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_tIME (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fI*mod_time\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_tRNS (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fI*trans_alpha\fP\fB, int \fP\fI*num_trans\fP\fB, png_color_16p \fI*trans_color\fP\fB);\fP + +\fI\fB + +\fB/* This function is really an inline macro. \fI*/ + +\fBpng_uint_16 png_get_uint_16 (png_bytep \fIbuf\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_uint_31 (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIbuf\fP\fB);\fP + +\fI\fB + +\fB/* This function is really an inline macro. \fI*/ + +\fBpng_uint_32 png_get_uint_32 (png_bytep \fIbuf\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_unknown_chunks (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkpp \fIunknowns\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_user_chunk_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_user_height_max (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_user_transform_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_user_width_max (png_const_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_valid (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIflag\fP\fB);\fP + +\fI\fB + +\fBfloat png_get_x_offset_inches (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_fixed_point png_get_x_offset_inches_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_x_offset_microns (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_x_offset_pixels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_x_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_x_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBfloat png_get_y_offset_inches (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_fixed_point png_get_y_offset_inches_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_y_offset_microns (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_y_offset_pixels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_y_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_y_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBint png_handle_as_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP + +\fI\fB + +\fBvoid png_info_init_3 (png_infopp \fP\fIinfo_ptr\fP\fB, png_size_t \fIpng_info_struct_size\fP\fB);\fP + +\fI\fB + +\fBvoid png_init_io (png_structp \fP\fIpng_ptr\fP\fB, FILE \fI*fp\fP\fB);\fP + +\fI\fB + +\fBvoid png_longjmp (png_structp \fP\fIpng_ptr\fP\fB, int \fIval\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_malloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_malloc_default (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_malloc_warn (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_permit_mng_features (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fImng_features_permitted\fP\fB);\fP + +\fI\fB + +\fBvoid png_process_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_size\fP\fB);\fP + +\fI\fB + +\fBpng_size_t png_process_data_pause \fP\fI(png_structp\fP\fB, int \fIsave\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_process_data_skip \fI(png_structp\fP\fB);\fP + +\fI\fB + +\fBvoid png_progressive_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIold_row\fP\fB, png_bytep \fInew_row\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fIdisplay_row\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_bytepp \fP\fIdisplay_row\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_update_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBint png_reset_zstream (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP + +\fI\fB + +\fBvoid png_save_uint_16 (png_bytep \fP\fIbuf\fP\fB, unsigned int \fIi\fP\fB);\fP + +\fI\fB + +\fBvoid png_save_uint_32 (png_bytep \fP\fIbuf\fP\fB, png_uint_32 \fIi\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_add_alpha (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_background (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, double \fIbackground_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_background_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, png_uint_32 \fIbackground_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_benign_errors (png_structp \fP\fIpng_ptr\fP\fB, int \fIallowed\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_bgr (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fIbackground\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_chunk_cache_max (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIuser_chunk_cache_max\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_level (png_structp \fP\fIpng_ptr\fP\fB, int \fIlevel\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_mem_level (png_structp \fP\fIpng_ptr\fP\fB, int \fImem_level\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_method (png_structp \fP\fIpng_ptr\fP\fB, int \fImethod\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_strategy (png_structp \fP\fIpng_ptr\fP\fB, int \fIstrategy\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_window_bits (png_structp \fP\fIpng_ptr\fP\fB, int \fIwindow_bits\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_crc_action (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcrit_action\fP\fB, int \fIancil_action\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_error_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarning_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_expand (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_expand_gray_1_2_4_to_8 (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_filler (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_filter (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImethod\fP\fB, int \fIfilters\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_filter_heuristics (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_doublep \fP\fIfilter_weights\fP\fB, png_doublep \fIfilter_costs\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_filter_heuristics_fixed (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_fixed_point_p \fP\fIfilter_weights\fP\fB, png_fixed_point_p \fIfilter_costs\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_flush (png_structp \fP\fIpng_ptr\fP\fB, int \fInrows\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gamma (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIscreen_gamma\fP\fB, double \fIdefault_file_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gamma_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIscreen_gamma\fP\fB, png_uint_32 \fIdefault_file_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIfile_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gray_1_2_4_to_8 (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gray_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fIhist\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_const_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_const_bytep \fP\fIprofile\fP\fB, png_uint_32 \fIproflen\fP\fB);\fP + +\fI\fB + +\fBint png_set_interlace_handling (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_invalid (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fImask\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_invert_alpha (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_invert_mono (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIinterlace_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fIfilter_type\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_keep_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIkeep\fP\fB, png_bytep \fP\fIchunk_list\fP\fB, int \fInum_chunks\fP\fB);\fP + +\fI\fB + +\fBjmp_buf* png_set_longjmp_fn (png_structp \fP\fIpng_ptr\fP\fB, png_longjmp_ptr \fP\fIlongjmp_fn\fP\fB, size_t \fIjmp_buf_size\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_chunk_malloc_max (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIuser_chunk_cache_max\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_buffer_size (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_mem_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIoffset_x\fP\fB, png_uint_32 \fP\fIoffset_y\fP\fB, int \fIunit_type\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_packing (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_packswap (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_palette_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIres_x\fP\fB, png_uint_32 \fP\fIres_y\fP\fB, int \fIunit_type\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_progressive_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIprogressive_ptr\fP\fB, png_progressive_info_ptr \fP\fIinfo_fn\fP\fB, png_progressive_row_ptr \fP\fIrow_fn\fP\fB, png_progressive_end_ptr \fIend_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_quantize (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fP\fInum_palette\fP\fB, int \fP\fImaximum_colors\fP\fB, png_uint_16p \fP\fIhistogram\fP\fB, int \fIfull_quantize\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fIread_data_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_read_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_read_status_ptr \fIread_row_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_read_user_chunk_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_chunk_ptr\fP\fB, png_user_chunk_ptr \fIread_user_chunk_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_read_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIread_user_transform_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_rgb_to_gray (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIerror_action\fP\fB, double \fP\fIred\fP\fB, double \fIgreen\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_rgb_to_gray_fixed (png_structp \fP\fIpng_ptr\fP\fB, int error_action png_uint_32 \fP\fIred\fP\fB, png_uint_32 \fIgreen\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_rows (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytepp \fIrow_pointers\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fIsig_bit\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sCAL_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, png_fixed_point \fP\fIwidth\fP\fB, png_fixed_point \fIheight\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sCAL_s (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, png_charp \fP\fIwidth\fP\fB, png_charp \fIheight\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_shift (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fItrue_bits\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sig_bytes (png_structp \fP\fIpng_ptr\fP\fB, int \fInum_bytes\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fP\fIsplt_ptr\fP\fB, int \fInum_spalettes\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIsrgb_intent\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sRGB_gAMA_and_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIsrgb_intent\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_strip_16 (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_strip_alpha (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_strip_error_numbers (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIstrip_mode\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_swap (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_swap_alpha (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_text (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fItrans_alpha\fP\fB, int \fP\fInum_trans\fP\fB, png_color_16p \fItrans_color\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_tRNS_to_alpha (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_set_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkp \fP\fIunknowns\fP\fB, int \fP\fInum\fP\fB, int \fIlocation\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_unknown_chunk_location (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIchunk\fP\fB, int \fIlocation\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_user_limits (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIuser_width_max\fP\fB, png_uint_32 \fIuser_height_max\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_user_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_transform_ptr\fP\fB, int \fP\fIuser_transform_depth\fP\fB, int \fIuser_transform_channels\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_write_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fP\fIwrite_data_fn\fP\fB, png_flush_ptr \fIoutput_flush_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_write_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_write_status_ptr \fIwrite_row_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_write_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIwrite_user_transform_fn\fP\fB);\fP + +\fI\fB + +\fBint png_sig_cmp (png_bytep \fP\fIsig\fP\fB, png_size_t \fP\fIstart\fP\fB, png_size_t \fInum_to_check\fP\fB);\fP + +\fI\fB + +\fBvoid png_start_read_image (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_chunk_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_chunk_end (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_chunk_start (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_flush (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_info_before_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_sig (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP + +\fI\fB + +\fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP + +\fI\fB + +.SH DESCRIPTION +The +.I libpng +library supports encoding, decoding, and various manipulations of +the Portable Network Graphics (PNG) format image files. It uses the +.IR zlib(3) +compression library. +Following is a copy of the libpng-manual.txt file that accompanies libpng. +.SH LIBPNG.TXT +libpng-manual.txt - A description on how to use and modify libpng + + libpng version 1.5.1 - February 3, 2011 + Updated and distributed by Glenn Randers-Pehrson + + Copyright (c) 1998-2011 Glenn Randers-Pehrson + + This document is released under the libpng license. + For conditions of distribution and use, see the disclaimer + and license in png.h + + Based on: + + libpng versions 0.97, January 1998, through 1.5.1 - February 3, 2011 + Updated and distributed by Glenn Randers-Pehrson + Copyright (c) 1998-2011 Glenn Randers-Pehrson + + libpng 1.0 beta 6 version 0.96 May 28, 1997 + Updated and distributed by Andreas Dilger + Copyright (c) 1996, 1997 Andreas Dilger + + libpng 1.0 beta 2 - version 0.88 January 26, 1996 + For conditions of distribution and use, see copyright + notice in png.h. Copyright (c) 1995, 1996 Guy Eric + Schalnat, Group 42, Inc. + + Updated/rewritten per request in the libpng FAQ + Copyright (c) 1995, 1996 Frank J. T. Wojcik + December 18, 1995 & January 20, 1996 + +.SH I. Introduction + +This file describes how to use and modify the PNG reference library +(known as libpng) for your own use. There are five sections to this +file: introduction, structures, reading, writing, and modification and +configuration notes for various special platforms. In addition to this +file, example.c is a good starting point for using the library, as +it is heavily commented and should include everything most people +will need. We assume that libpng is already installed; see the +INSTALL file for instructions on how to install libpng. + +For examples of libpng usage, see the files "example.c", "pngtest.c", +and the files in the "contrib" directory, all of which are included in +the libpng distribution. + +Libpng was written as a companion to the PNG specification, as a way +of reducing the amount of time and effort it takes to support the PNG +file format in application programs. + +The PNG specification (second edition), November 2003, is available as +a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at +. It is technically equivalent +to the PNG specification (second edition) but has some additional material. + +The PNG-1.0 specification is available +as RFC 2083 and as a +W3C Recommendation . + +Some additional chunks are described in the special-purpose public chunks +documents at . + +Other information +about PNG, and the latest version of libpng, can be found at the PNG home +page, . + +Most users will not have to modify the library significantly; advanced +users may want to modify it more. All attempts were made to make it as +complete as possible, while keeping the code easy to understand. +Currently, this library only supports C. Support for other languages +is being considered. + +Libpng has been designed to handle multiple sessions at one time, +to be easily modifiable, to be portable to the vast majority of +machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy +to use. The ultimate goal of libpng is to promote the acceptance of +the PNG file format in whatever way possible. While there is still +work to be done (see the TODO file), libpng should cover the +majority of the needs of its users. + +Libpng uses zlib for its compression and decompression of PNG files. +Further information about zlib, and the latest version of zlib, can +be found at the zlib home page, . +The zlib compression utility is a general purpose utility that is +useful for more than PNG files, and can be used without libpng. +See the documentation delivered with zlib for more details. +You can usually find the source files for the zlib utility wherever you +find the libpng source files. + +Libpng is thread safe, provided the threads are using different +instances of the structures. Each thread should have its own +png_struct and png_info instances, and thus its own image. +Libpng does not protect itself against two threads using the +same instance of a structure. + +.SH II. Structures + +There are two main structures that are important to libpng, png_struct +and png_info. Both are internal structures that are no longer exposed +in the libpng interface (as of libpng 1.5.0). + +The png_info structure is designed to provide information about the +PNG file. At one time, the fields of png_info were intended to be +directly accessible to the user. However, this tended to cause problems +with applications using dynamically loaded libraries, and as a result +a set of interface functions for png_info (the png_get_*() and png_set_*() +functions) was developed. + +The png_struct structure is the object used by the library to decode a +single image. As of 1.5.0 this structure is also not exposed. + +Almost all libpng APIs require a pointer to a png_struct as the first argument. +Many (in particular the png_set and png_get APIs) also require a pointer +to png_info as the second argument. Some application visible macros +defined in png.h designed for basic data access (reading and writing +integers in the PNG format) break this rule, but it's almost always safe +to assume that a (png_struct*) has to be passed to call an API function. + +The png.h header file is an invaluable reference for programming with libpng. +And while I'm on the topic, make sure you include the libpng header file: + +#include + +.SS Types + +The png.h header file defines a number of integral types used by the +APIs. Most of these are fairly obvious; for example types corresponding +to integers of particular sizes and types for passing color values. + +One exception is how non-integral numbers are handled. For application +convenience most APIs that take such numbers have C (double) arguments, +however internally PNG, and libpng, use 32 bit signed integers and encode +the value by multiplying by 100,000. As of libpng 1.5.0 a convenience +macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point) +which is simply (png_int_32). + +All APIs that take (double) arguments also have an matching API that +takes the corresponding fixed point integer arguments. The fixed point +API has the same name as the floating point one with _fixed appended. +The actual range of values permitted in the APIs is frequently less than +the full range of (png_fixed_point) (-21474 to +21474). When APIs require +a non-negative argument the type is recorded as png_uint_32 above. Consult +the header file and the text below for more information. + +Special care must be take with sCAL chunk handling because the chunk itself +uses non-integral values encoded as strings containing decimal floating point +numbers. See the comments in the header file. + +.SS Configuration + +The main header file function declarations are frequently protected by C +preprocessing directives of the form: + + #ifdef PNG_feature_SUPPORTED + declare-function + #endif + +The library can be built without support for these APIs, although a +standard build will have all implemented APIs. Application programs +should check the feature macros before using an API for maximum +portability. From libpng 1.5.0 the feature macros set during the build +of libpng are recorded in the header file "pnglibconf.h" and this file +is always included by png.h. + +If you don't need to change the library configuration from the default skip to +the next section ("Reading"). + +Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all +of the build project files in the 'projects' directory simply copy +scripts/pnglibconf.h.prebuilt to pnglibconf.h. This means that these build +systems do not permit easy auto-configuration of the library - they only +support the default configuration. + +The easiest way to make minor changes to the libpng configuration when +auto-configuration is supported is to add definitions to the command line +using (typically) CPPFLAGS. For example: + +CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC + +will change the internal libpng math implementation for gamma correction and +other arithmetic calculations to fixed point, avoiding the need for fast +floating point support. The result can be seen in the generated pnglibconf.h - +make sure it contains the changed feature macro setting. + +If you need to make more extensive configuration changes - more than one or two +feature macro settings - you can either add -DPNG_USER_CONFIG to the build +command line and put a list of feature macro settings in pngusr.h or you can set +DFA_XTRA (a makefile variable) to a file containing the same information in the +form of 'option' settings. + +A. Changing pnglibconf.h + +A variety of methods exist to build libpng. Not all of these support +reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be +rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand. + +Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt and changing +the lines defining the supported features, paying very close attention to the +'option' information in scripts/pnglibconf.dfa that describes those features and +their requirements. This is easy to get wrong. + +B. Configuration using DFA_XTRA + +Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later +variant such as 'nawk' or 'gawk', is available. The configure build will +automatically find an appropriate awk and build pnglibconf.h. +scripts/pnglibconf.mak contains a set of make rules for doing the same thing if +configure is not used, and many of the makefiles in the scripts directory use +this approach. + +When rebuilding simply write new file containing changed options and set +DFA_XTRA to the name of this file. This causes the build to append the new file +to the end of scripts/pnglibconf.dfa. pngusr.dfa should contain lines of the +following forms: + +everything = off + +This turns all optional features off. Include it at the start of pngusr.dfa to +make it easier to build a minimal configuration. You will need to turn at least +some features on afterward to enable either reading or writing code, or both. + +option feature on +option feature off + +Enable or disable a single feature. This will automatically enable other +features required by a feature that is turned on or disable other features that +require a feature which is turned off. Conflicting settings will cause an error +message to be emitted by awk. + +setting feature default value + +Changes the default value of setting 'feature' to 'value'. There are a small +number of settings listed at the top of pnglibconf.h, they are documented in the +source code. Most of these values have performance implications for the library +but most of them have no visible effect on the API. Some can also be overridden +from the API. + +C. Configuration using PNG_USR_CONFIG + +If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file +pngusr.h will automatically be included before the options in +scripts/pnglibconf.dfa are processed. pngusr.h should contain only macro +definitions turning features on or off or setting settings. + +Apart from the global setting "everything = off" all the options listed above +can be set using macros in pngusr.h: + +#define PNG_feature_SUPPORTED + +is equivalent to: + +option feature on + +#define PNG_NO_feature + +is equivalent to: + +option feature off + +#define PNG_feature value + +is equivalent to: + +setting feature default value + +Notice that in both cases, pngusr.dfa and pngusr.h, the contents of the +pngusr file you supply override the contents of scripts/pnglibconf.dfa + +If confusing or incomprehensible behavior results it is possible to +examine the intermediate file pnglibconf.dfn to find the full set of +dependency information for each setting and option. Simply locate the +feature in the file and read the C comments that precede it. + +.SH III. Reading + +We'll now walk you through the possible functions to call when reading +in a PNG file sequentially, briefly explaining the syntax and purpose +of each one. See example.c and png.h for more detail. While +progressive reading is covered in the next section, you will still +need some of the functions discussed in this section to read a PNG +file. + +.SS Setup + +You will want to do the I/O initialization(*) before you get into libpng, +so if it doesn't work, you don't have much to undo. Of course, you +will also want to insure that you are, in fact, dealing with a PNG +file. Libpng provides a simple check to see if a file is a PNG file. +To use it, pass in the first 1 to 8 bytes of the file to the function +png_sig_cmp(), and it will return 0 (false) if the bytes match the +corresponding bytes of the PNG signature, or nonzero (true) otherwise. +Of course, the more bytes you pass in, the greater the accuracy of the +prediction. + +If you are intending to keep the file pointer open for use in libpng, +you must ensure you don't read more than 8 bytes from the beginning +of the file, and you also have to make a call to png_set_sig_bytes_read() +with the number of bytes you read from the beginning. Libpng will +then only check the bytes (if any) that your program didn't read. + +(*): If you are not using the standard I/O functions, you will need +to replace them with custom functions. See the discussion under +Customizing libpng. + + + FILE *fp = fopen(file_name, "rb"); + if (!fp) + { + return (ERROR); + } + + fread(header, 1, number, fp); + is_png = !png_sig_cmp(header, 0, number); + + if (!is_png) + { + return (NOT_PNG); + } + + +Next, png_struct and png_info need to be allocated and initialized. In +order to ensure that the size of these structures is correct even with a +dynamically linked libpng, there are functions to initialize and +allocate the structures. We also pass the library version, optional +pointers to error handling functions, and a pointer to a data struct for +use by the error functions, if necessary (the pointer and functions can +be NULL if the default error handlers are to be used). See the section +on Changes to Libpng below regarding the old initialization functions. +The structure allocation functions quietly return NULL if they fail to +create the structure, so your application should check for that. + + png_structp png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, + (png_infopp)NULL, (png_infopp)NULL); + return (ERROR); + } + + png_infop end_info = png_create_info_struct(png_ptr); + + if (!end_info) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use +png_create_read_struct_2() instead of png_create_read_struct(): + + png_structp png_ptr = png_create_read_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +The error handling routines passed to png_create_read_struct() +and the memory alloc/free routines passed to png_create_struct_2() +are only necessary if you are not using the libpng supplied error +handling and memory alloc/free functions. + +When libpng encounters an error, it expects to longjmp back +to your routine. Therefore, you will need to call setjmp and pass +your png_jmpbuf(png_ptr). If you read the file from different +routines, you will need to update the jmpbuf field every time you enter +a new routine that will call a png_*() function. + +See your documentation of setjmp/longjmp for your compiler for more +information on setjmp/longjmp. See the discussion on libpng error +handling in the Customizing Libpng section below for more information +on the libpng error handling. If an error occurs, and libpng longjmp's +back to your setjmp, you will want to call png_destroy_read_struct() to +free any memory. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + fclose(fp); + return (ERROR); + } + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_NO_SETJMP, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +You can #define PNG_ABORT() to a function that does something +more useful than abort(), as long as your function does not +return. + +Now you need to set up the input code. The default for libpng is to +use the C function fread(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. If you wish to handle reading data in another +way, you need not call the png_init_io() function, but you must then +implement the libpng I/O methods discussed in the Customizing Libpng +section below. + + png_init_io(png_ptr, fp); + +If you had previously opened the file and read any of the signature from +the beginning in order to see if this was a PNG file, you need to let +libpng know that there are some bytes missing from the start of the file. + + png_set_sig_bytes(png_ptr, number); + +You can change the zlib compression buffer size to be used while +reading compressed data with + + png_set_compression_buffer_size(png_ptr, buffer_size); + +where the default size is 8192 bytes. Note that the buffer size +is changed immediately and the buffer is reallocated immediately, +instead of setting a flag to be acted upon later. + +If you want CRC errors to be handled in a different manner than +the default, use + + png_set_crc_action(png_ptr, crit_action, ancil_action); + +The values for png_set_crc_action() say how libpng is to handle CRC errors in +ancillary and critical chunks, and whether to use the data contained +therein. Note that it is impossible to "discard" data in a critical +chunk. + +Choices for (int) crit_action are + PNG_CRC_DEFAULT 0 error/quit + PNG_CRC_ERROR_QUIT 1 error/quit + PNG_CRC_WARN_USE 3 warn/use data + PNG_CRC_QUIET_USE 4 quiet/use data + PNG_CRC_NO_CHANGE 5 use the current value + +Choices for (int) ancil_action are + PNG_CRC_DEFAULT 0 error/quit + PNG_CRC_ERROR_QUIT 1 error/quit + PNG_CRC_WARN_DISCARD 2 warn/discard data + PNG_CRC_WARN_USE 3 warn/use data + PNG_CRC_QUIET_USE 4 quiet/use data + PNG_CRC_NO_CHANGE 5 use the current value + +.SS Setting up callback code + +You can set up a callback function to handle any unknown chunks in the +input stream. You must supply the function + + read_chunk_callback(png_structp png_ptr, + png_unknown_chunkp chunk); + { + /* The unknown chunk structure contains your + chunk data, along with similar data for any other + unknown chunks: */ + + png_byte name[5]; + png_byte *data; + png_size_t size; + + /* Note that libpng has already taken care of + the CRC handling */ + + /* put your code here. Search for your chunk in the + unknown chunk structure, process it, and return one + of the following: */ + + return (-n); /* chunk had an error */ + return (0); /* did not recognize */ + return (n); /* success */ + } + +(You can give your function another name that you like instead of +"read_chunk_callback") + +To inform libpng about your function, use + + png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr, + read_chunk_callback); + +This names not only the callback function, but also a user pointer that +you can retrieve with + + png_get_user_chunk_ptr(png_ptr); + +If you call the png_set_read_user_chunk_fn() function, then all unknown +chunks will be saved when read, in case your callback function will need +one or more of them. This behavior can be changed with the +png_set_keep_unknown_chunks() function, described below. + +At this point, you can set up a callback function that will be +called after each row has been read, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void read_row_callback(png_structp png_ptr, + png_uint_32 row, int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "read_row_callback") + +To inform libpng about your function, use + + png_set_read_status_fn(png_ptr, read_row_callback); + +.SS Unknown-chunk handling + +Now you get to set the way the library processes unknown chunks in the +input PNG stream. Both known and unknown chunks will be read. Normal +behavior is that known chunks will be parsed into information in +various info_ptr members while unknown chunks will be discarded. This +behavior can be wasteful if your application will never use some known +chunk types. To change this, you can call: + + png_set_keep_unknown_chunks(png_ptr, keep, + chunk_list, num_chunks); + keep - 0: default unknown chunk handling + 1: ignore; do not keep + 2: keep only if safe-to-copy + 3: keep even if unsafe-to-copy + + You can use these definitions: + PNG_HANDLE_CHUNK_AS_DEFAULT 0 + PNG_HANDLE_CHUNK_NEVER 1 + PNG_HANDLE_CHUNK_IF_SAFE 2 + PNG_HANDLE_CHUNK_ALWAYS 3 + + chunk_list - list of chunks affected (a byte string, + five bytes per chunk, NULL or '\0' if + num_chunks is 0) + + num_chunks - number of chunks affected; if 0, all + unknown chunks are affected. If nonzero, + only the chunks in the list are affected + +Unknown chunks declared in this way will be saved as raw data onto a +list of png_unknown_chunk structures. If a chunk that is normally +known to libpng is named in the list, it will be handled as unknown, +according to the "keep" directive. If a chunk is named in successive +instances of png_set_keep_unknown_chunks(), the final instance will +take precedence. The IHDR and IEND chunks should not be named in +chunk_list; if they are, libpng will process them normally anyway. + +Here is an example of the usage of png_set_keep_unknown_chunks(), +where the private "vpAg" chunk will later be processed by a user chunk +callback function: + + png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + png_byte unused_chunks[]= + { + 104, 73, 83, 84, (png_byte) '\0', /* hIST */ + 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ + 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ + 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ + 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ + 116, 73, 77, 69, (png_byte) '\0', /* tIME */ + }; + #endif + + ... + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* ignore all unknown chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0); + + /* except for vpAg: */ + png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1); + + /* also ignore unused known chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks, + (int)sizeof(unused_chunks)/5); + #endif + +.SS User limits + +The PNG specification allows the width and height of an image to be as +large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns. +Since very few applications really need to process such large images, +we have imposed an arbitrary 1-million limit on rows and columns. +Larger images will be rejected immediately with a png_error() call. If +you wish to override this limit, you can use + + png_set_user_limits(png_ptr, width_max, height_max); + +to set your own limits, or use width_max = height_max = 0x7fffffffL +to allow all valid dimensions (libpng may reject some very large images +anyway because of potential buffer overflow conditions). + +You should put this statement after you create the PNG structure and +before calling png_read_info(), png_read_png(), or png_process_data(). +If you need to retrieve the limits that are being applied, use + + width_max = png_get_user_width_max(png_ptr); + height_max = png_get_user_height_max(png_ptr); + +The PNG specification sets no limit on the number of ancillary chunks +allowed in a PNG datastream. You can impose a limit on the total number +of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with + + png_set_chunk_cache_max(png_ptr, user_chunk_cache_max); + +where 0x7fffffffL means unlimited. You can retrieve this limit with + + chunk_cache_max = png_get_chunk_cache_max(png_ptr); + +This limit also applies to the number of buffers that can be allocated +by png_decompress_chunk() while decompressing iTXt, zTXt, and iCCP chunks. + +You can also set a limit on the amount of memory that a compressed chunk +other than IDAT can occupy, with + + png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max); + +and you can retrieve the limit with + + chunk_malloc_max = png_get_chunk_malloc_max(png_ptr); + +Any chunks that would cause either of these limits to be exceeded will +be ignored. + +.SS The high-level read interface + +At this point there are two ways to proceed; through the high-level +read interface, or through a sequence of low-level read operations. +You can use the high-level interface if (a) you are willing to read +the entire image into memory, and (b) the input transformations +you want to do are limited to the following set: + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to + 8 bits + PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel + PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit + samples to bytes + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_EXPAND Perform set_expand() + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples + to RGB (or GA to RGBA) + +(This excludes setting a background color, doing gamma transformation, +quantizing, and setting filler.) If this is the case, simply do this: + + png_read_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of some +set of transformation flags. This call is equivalent to png_read_info(), +followed the set of transformations indicated by the transform mask, +then png_read_image(), and finally png_read_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future input transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_read_png(). + +After you have called png_read_png(), you can retrieve the image data +with + + row_pointers = png_get_rows(png_ptr, info_ptr); + +where row_pointers is an array of pointers to the pixel data for each row: + + png_bytep row_pointers[height]; + +If you know your image size and pixel size ahead of time, you can allocate +row_pointers prior to calling png_read_png() with + + if (height > PNG_UINT_32_MAX/png_sizeof(png_byte)) + png_error (png_ptr, + "Image is too tall to process in memory"); + + if (width > PNG_UINT_32_MAX/pixel_size) + png_error (png_ptr, + "Image is too wide to process in memory"); + + row_pointers = png_malloc(png_ptr, + height*png_sizeof(png_bytep)); + + for (int i=0; i) and +png_get_(png_ptr, info_ptr, ...) functions return non-zero if the +data has been read, or zero if it is missing. The parameters to the +png_get_ are set directly if they are simple data types, or a +pointer into the info_ptr is returned for any complex types. + + png_get_PLTE(png_ptr, info_ptr, &palette, + &num_palette); + + palette - the palette for the file + (array of png_color) + + num_palette - number of entries in the palette + + png_get_gAMA(png_ptr, info_ptr, &file_gamma); + png_get_gAMA_fixed(png_ptr, info_ptr, &int_file_gamma); + + file_gamma - the gamma at which the file is + written (PNG_INFO_gAMA) + + int_file_gamma - 100,000 times the gamma at which the + file is written + + png_get_sRGB(png_ptr, info_ptr, &srgb_intent); + + file_srgb_intent - the rendering intent (PNG_INFO_sRGB) + The presence of the sRGB chunk + means that the pixel data is in the + sRGB color space. This chunk also + implies specific values of gAMA and + cHRM. + + png_get_iCCP(png_ptr, info_ptr, &name, + &compression_type, &profile, &proflen); + + name - The profile name. + + compression_type - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + + profile - International Color Consortium color + profile data. May contain NULs. + + proflen - length of profile data in bytes. + + png_get_sBIT(png_ptr, info_ptr, &sig_bit); + + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, + red, green, and blue channels, + whichever are appropriate for the + given color type (png_color_16) + + png_get_tRNS(png_ptr, info_ptr, &trans_alpha, + &num_trans, &trans_color); + + trans_alpha - array of alpha (transparency) + entries for palette (PNG_INFO_tRNS) + + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + trans_color - graylevel or color sample values of + the single transparent color for + non-paletted images (PNG_INFO_tRNS) + + png_get_hIST(png_ptr, info_ptr, &hist); + (PNG_INFO_hIST) + + hist - histogram of palette (array of + png_uint_16) + + png_get_tIME(png_ptr, info_ptr, &mod_time); + + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_get_bKGD(png_ptr, info_ptr, &background); + + background - background color (PNG_VALID_bKGD) + valid 16-bit red, green and blue + values, regardless of color_type + + num_comments = png_get_text(png_ptr, info_ptr, + &text_ptr, &num_text); + + num_comments - number of comments + + text_ptr - array of png_text holding image + comments + + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + + text_ptr[i].text - text comments for current + keyword. Can be empty. + + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + + text_ptr[i].lang - language of comment (empty + string for unknown). + + text_ptr[i].lang_key - keyword in UTF-8 + (empty string for unknown). + + Note that the itxt_length, lang, and lang_key + members of the text_ptr structure only exist + when the library is built with iTXt chunk support. + + num_text - number of comments (same as + num_comments; you can put NULL here + to avoid the duplication) + + Note while png_set_text() will accept text, language, + and translated keywords that can be NULL pointers, the + structure returned by png_get_text will always contain + regular zero-terminated C strings. They might be + empty strings but they will never be NULL pointers. + + num_spalettes = png_get_sPLT(png_ptr, info_ptr, + &palette_ptr); + + num_spalettes - number of sPLT chunks read. + + palette_ptr - array of palette structures holding + contents of one or more sPLT chunks + read. + + png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, + &unit_type); + + offset_x - positive offset from the left edge + of the screen + + offset_y - positive offset from the top edge + of the screen + + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, + &unit_type); + + res_x - pixels/unit physical resolution in + x direction + + res_y - pixels/unit physical resolution in + x direction + + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_get_sCAL(png_ptr, info_ptr, &unit, &width, + &height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are doubles) + + png_get_sCAL_s(png_ptr, info_ptr, &unit, &width, + &height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + num_unknown_chunks = png_get_unknown_chunks(png_ptr, + info_ptr, &unknowns) + + unknowns - array of png_unknown_chunk + structures holding unknown chunks + + unknowns[i].name - name of unknown chunk + + unknowns[i].data - data of unknown chunk + + unknowns[i].size - size of unknown chunk's data + + unknowns[i].location - position of chunk in file + + The value of "i" corresponds to the order in which the + chunks were read from the PNG file or inserted with the + png_set_unknown_chunks() function. + +The data from the pHYs chunk can be retrieved in several convenient +forms: + + res_x = png_get_x_pixels_per_meter(png_ptr, + info_ptr) + + res_y = png_get_y_pixels_per_meter(png_ptr, + info_ptr) + + res_x_and_y = png_get_pixels_per_meter(png_ptr, + info_ptr) + + res_x = png_get_x_pixels_per_inch(png_ptr, + info_ptr) + + res_y = png_get_y_pixels_per_inch(png_ptr, + info_ptr) + + res_x_and_y = png_get_pixels_per_inch(png_ptr, + info_ptr) + + aspect_ratio = png_get_pixel_aspect_ratio(png_ptr, + info_ptr) + + Each of these returns 0 [signifying "unknown"] if + the data is not present or if res_x is 0; + res_x_and_y is 0 if res_x != res_y + + Note that because of the way the resolutions are + stored internally, the inch conversions won't + come out to exactly even number. For example, + 72 dpi is stored as 0.28346 pixels/meter, and + when this is retrieved it is 71.9988 dpi, so + be sure to round the returned value appropriately + if you want to display a reasonable-looking result. + +The data from the oFFs chunk can be retrieved in several convenient +forms: + + x_offset = png_get_x_offset_microns(png_ptr, info_ptr); + + y_offset = png_get_y_offset_microns(png_ptr, info_ptr); + + x_offset = png_get_x_offset_inches(png_ptr, info_ptr); + + y_offset = png_get_y_offset_inches(png_ptr, info_ptr); + + Each of these returns 0 [signifying "unknown" if both + x and y are 0] if the data is not present or if the + chunk is present but the unit is the pixel. The + remark about inexact inch conversions applies here + as well, because a value in inches can't always be + converted to microns and back without some loss + of precision. + +For more information, see the png_info definition in png.h and the +PNG specification for chunk contents. Be careful with trusting +rowbytes, as some of the transformations could increase the space +needed to hold a row (expand, filler, gray_to_rgb, etc.). +See png_read_update_info(), below. + +A quick word about text_ptr and num_text. PNG stores comments in +keyword/text pairs, one pair per chunk, with no limit on the number +of text chunks, and a 2^31 byte limit on their size. While there are +suggested keywords, there is no requirement to restrict the use to these +strings. It is strongly suggested that keywords and text be sensible +to humans (that's the point), so don't use abbreviations. Non-printing +symbols are not allowed. See the PNG specification for more details. +There is also no requirement to have text after the keyword. + +Keywords should be limited to 79 Latin-1 characters without leading or +trailing spaces, but non-consecutive spaces are allowed within the +keyword. It is possible to have the same keyword any number of times. +The text_ptr is an array of png_text structures, each holding a +pointer to a language string, a pointer to a keyword and a pointer to +a text string. The text string, language code, and translated +keyword may be empty or NULL pointers. The keyword/text +pairs are put into the array in the order that they are received. +However, some or all of the text chunks may be after the image, so, to +make sure you have read all the text chunks, don't mess with these +until after you read the stuff after the image. This will be +mentioned again below in the discussion that goes with png_read_end(). + +.SS Input transformations + +After you've read the header information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +The colors used for the background and transparency values should be +supplied in the same format/depth as the current image data. They +are stored in the same format/depth as the image data in a bKGD or tRNS +chunk, so this is what libpng expects for this data. The colors are +transformed to keep in sync with the image data when an application +calls the png_read_update_info() routine (see below). + +Data will be decoded into the supplied row buffers packed into bytes +unless the library has been told to transform it into another format. +For example, 4 bit/pixel paletted or grayscale data will be returned +2 pixels/byte with the leftmost pixel in the high-order bits of the +byte, unless png_set_packing() is called. 8-bit RGB data will be stored +in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha() +is called to insert filler bytes, either before or after each RGB triplet. +16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant +byte of the color value first, unless png_set_strip_16() is called to +transform it to regular RGB RGB triplets, or png_set_filler() or +png_set_add alpha() is called to insert filler bytes, either before or +after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can +be modified with +png_set_filler(), png_set_add_alpha(), or png_set_strip_16(). + +The following code transforms grayscale images of less than 8 to 8 bits, +changes paletted images to RGB, and adds a full alpha channel if there is +transparency information in a tRNS chunk. This is most useful on +grayscale images with bit depths of 2 or 4 or if there is a multiple-image +viewing application that wishes to treat all images in the same way. + + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && + bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr); + + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); + +These three functions are actually aliases for png_set_expand(), added +in libpng version 1.0.4, with the function names expanded to improve code +readability. In some future version they may actually do different +things. + +As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was +added. It expands the sample depth without changing tRNS to alpha. + +As of libpng version 1.5.1, not all possible expansions are supported. + +In the following table, the 01 means grayscale with depth<8, 31 means +indexed with depth<8, other numerals represent the color type, "T" means +the tRNS chunk is present, A means an alpha channel is present, and O +means tRNS or alpha is present but all pixels in the image are opaque. + + FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O + TO + 01 - + 31 - + 0 1 - + 0T - + 0O - + 2 GX - + 2T - + 2O - + 3 1 - + 3T - + 3O - + 4A T - + 4O - + 6A GX TX TX - + 6O GX TX - + +Within the matrix, + "-" means the transformation is not supported. + "X" means the transformation is obtained by png_set_expand(). + "1" means the transformation is obtained by + png_set_expand_gray_1_2_4_to_8 + "G" means the transformation is obtained by + png_set_gray_to_rgb(). + "P" means the transformation is obtained by + png_set_expand_palette_to_rgb(). + "T" means the transformation is obtained by + png_set_tRNS_to_alpha(). + +PNG can have files with 16 bits per channel. If you only can handle +8 bits per channel, this will strip the pixels down to 8 bit. + + if (bit_depth == 16) + png_set_strip_16(png_ptr); + +If, for some reason, you don't need the alpha channel on an image, +and you want to remove it rather than combining it with the background +(but the image author certainly had in mind that you *would* combine +it with the background, so that's what you should probably do): + + if (color_type & PNG_COLOR_MASK_ALPHA) + png_set_strip_alpha(png_ptr); + +In PNG files, the alpha channel in an image +is the level of opacity. If you need the alpha channel in an image to +be the level of transparency instead of opacity, you can invert the +alpha channel (or the tRNS chunk data) after it's read, so that 0 is +fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit +images) is fully transparent, with + + png_set_invert_alpha(png_ptr); + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit +files. This code expands to 1 pixel per byte without changing the +values of the pixels: + + if (bit_depth < 8) + png_set_packing(png_ptr); + +PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels +stored in a PNG image have been "scaled" or "shifted" up to the next +higher possible bit depth (e.g. from 5 bits/sample in the range [0,31] +to 8 bits/sample in the range [0, 255]). However, it is also possible +to convert the PNG pixel data back to the original bit depth of the +image. This call reduces the pixels back down to the original bit depth: + + png_color_8p sig_bit; + + if (png_get_sBIT(png_ptr, info_ptr, &sig_bit)) + png_set_shift(png_ptr, sig_bit); + +PNG files store 3-color pixels in red, green, blue order. This code +changes the storage of the pixels to blue, green, red: + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_bgr(png_ptr); + +PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them +into 4 or 8 bytes for windowing systems that need them in this format: + + if (color_type == PNG_COLOR_TYPE_RGB) + png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE); + +where "filler" is the 8 or 16-bit number to fill with, and the location is +either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether +you want the filler before the RGB or after. This transformation +does not affect images that already have full alpha channels. To add an +opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which +will generate RGBA pixels. + +Note that png_set_filler() does not change the color type. If you want +to do that, you can add a true alpha channel with + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY) + png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER); + +where "filler" contains the alpha value to assign to each pixel. +This function was added in libpng-1.2.7. + +If you are reading an image with an alpha channel, and you need the +data as ARGB instead of the normal PNG format RGBA: + + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_swap_alpha(png_ptr); + +For some uses, you may want a grayscale image to be represented as +RGB. This code will do that conversion: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png_ptr); + +Conversely, you can convert an RGB or RGBA image to grayscale or grayscale +with alpha. + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_rgb_to_gray_fixed(png_ptr, error_action, + int red_weight, int green_weight); + + error_action = 1: silently do the conversion + + error_action = 2: issue a warning if the original + image has any pixel where + red != green or red != blue + + error_action = 3: issue an error and abort the + conversion if the original + image has any pixel where + red != green or red != blue + + red_weight: weight of red component times 100000 + + green_weight: weight of green component times 100000 + If either weight is negative, default + weights (21268, 71514) are used. + +If you have set error_action = 1 or 2, you can +later check whether the image really was gray, after processing +the image rows, with the png_get_rgb_to_gray_status(png_ptr) function. +It will return a png_byte that is zero if the image was gray or +1 if there were any non-gray pixels. bKGD and sBIT data +will be silently converted to grayscale, using the green channel +data, regardless of the error_action setting. + +With red_weight+green_weight<=100000, +the normalized graylevel is computed: + + int rw = red_weight * 65536; + int gw = green_weight * 65536; + int bw = 65536 - (rw + gw); + gray = (rw*red + gw*green + bw*blue)/65536; + +The default values approximate those recommended in the Charles +Poynton's Color FAQ, +Copyright (c) 1998-01-04 Charles Poynton + + Y = 0.212671 * R + 0.715160 * G + 0.072169 * B + +Libpng approximates this with integers scaled by 32768: + + Y = (6968 * R + 23434 * G + 2366 * B)/32768 + +The calculation is done in a linear colorspace, if the image gamma +can be determined. + +If you have a grayscale and you are using png_set_expand_depth(), +png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to +a higher bit-depth, you must either supply the background color as a gray +value at the original file bit-depth (need_expand = 1) or else supply the +background color as an RGB triplet at the final, expanded bit depth +(need_expand = 0). Similarly, if you are reading a paletted image, you +must either supply the background color as a palette index (need_expand = 1) +or as an RGB triplet that may or may not be in the palette (need_expand = 0). + + png_color_16 my_background; + png_color_16p image_background; + + if (png_get_bKGD(png_ptr, info_ptr, &image_background)) + png_set_background(png_ptr, image_background, + PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + else + png_set_background(png_ptr, &my_background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + +The png_set_background() function tells libpng to composite images +with alpha or simple transparency against the supplied background +color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid), +you may use this color, or supply another color more suitable for +the current display (e.g., the background color from a web page). You +need to tell libpng whether the color is in the gamma space of the +display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file +(PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one +that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't +know why anyone would use this, but it's here). + +To properly display PNG images on any kind of system, the application needs +to know what the display gamma is. Ideally, the user will know this, and +the application will allow them to set it. One method of allowing the user +to set the display gamma separately for each system is to check for a +SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be +correctly set. + +Note that display_gamma is the overall gamma correction required to produce +pleasing results, which depends on the lighting conditions in the surrounding +environment. In a dim or brightly lit room, no compensation other than +the physical gamma exponent of the monitor is needed, while in a dark room +a slightly smaller exponent is better. + + double gamma, screen_gamma; + + if (/* We have a user-defined screen + gamma value */) + { + screen_gamma = user_defined_screen_gamma; + } + + /* One way that applications can share the same + screen gamma value */ + else if ((gamma_str = getenv("SCREEN_GAMMA")) + != NULL) + { + screen_gamma = (double)atof(gamma_str); + } + + /* If we don't have another value */ + else + { + screen_gamma = 2.2; /* A good guess for a + PC monitor in a bright office or a dim room */ + + screen_gamma = 2.0; /* A good guess for a + PC monitor in a dark room */ + + screen_gamma = 1.7 or 1.0; /* A good + guess for Mac systems */ + } + +The functions png_set_gamma() and its fixed point equivalent +png_set_gamma_fixed() handle gamma transformations of the data. +Pass both the file gamma and the current screen_gamma. If the file does +not have a gamma value, you can pass one anyway if you have an idea what +it is (usually 0.45455 is a good guess for GIF images on PCs). Note +that file gammas are inverted from screen gammas. See the discussions +on gamma in the PNG specification for an excellent description of what +gamma is, and why all applications should support it. It is strongly +recommended that PNG viewers support gamma correction. + + if (png_get_gAMA(png_ptr, info_ptr, &file_gamma)) + png_set_gamma(png_ptr, screen_gamma, file_gamma); + + else + png_set_gamma(png_ptr, screen_gamma, 0.45455); + +If you need to reduce an RGB file to a paletted file, or if a paletted +file has more entries then will fit on your screen, png_set_quantize() +will do that. Note that this is a simple match quantization that merely +finds the closest color available. This should work fairly well with +optimized palettes, but fairly badly with linear color cubes. If you +pass a palette that is larger then maximum_colors, the file will +reduce the number of colors in the palette so it will fit into +maximum_colors. If there is a histogram, it will use it to make +more intelligent choices when reducing the palette. If there is no +histogram, it may not do as good a job. + + if (color_type & PNG_COLOR_MASK_COLOR) + { + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_PLTE)) + { + png_uint_16p histogram = NULL; + + png_get_hIST(png_ptr, info_ptr, + &histogram); + png_set_quantize(png_ptr, palette, num_palette, + max_screen_colors, histogram, 1); + } + + else + { + png_color std_color_cube[MAX_SCREEN_COLORS] = + { ... colors ... }; + + png_set_quantize(png_ptr, std_color_cube, + MAX_SCREEN_COLORS, MAX_SCREEN_COLORS, + NULL,0); + } + } + +PNG files describe monochrome as black being zero and white being one. +The following code will reverse this (make black be one and white be +zero): + + if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) + png_set_invert_mono(png_ptr); + +This function can also be used to invert grayscale and gray-alpha images: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_invert_mono(png_ptr); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code changes the storage to the +other way (little-endian, i.e. least significant bits first, the +way PCs store them): + + if (bit_depth == 16) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_read_user_transform_fn(png_ptr, + read_transform_fn); + +You must supply the function + + void read_transform_fn(png_structp png_ptr, row_info_ptr + row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +after all of the other transformations have been processed. Take care with +interlaced images if you do the interlace yourself - the width of the row is the +width in 'row_info', not the overall image width. + +If supported libpng provides two information routines that you can use to find +where you are in processing the image: + + png_get_current_pass_number(png_structp png_ptr); + png_get_current_row_number(png_structp png_ptr); + +Don't try using these outside a transform callback - firstly they are only +supported if user transforms are supported, secondly they may well return +unexpected results unless the row is actually being processed at the moment they +are called. + +You can also set up a pointer to a user structure for use by your +callback function, and you can inform libpng that your transform +function will change the number of channels or bit depth with the +function + + png_set_user_transform_info(png_ptr, user_ptr, + user_depth, user_channels); + +The user's application, not libpng, is responsible for allocating and +freeing any memory required for the user structure. + +You can retrieve the pointer via the function +png_get_user_transform_ptr(). For example: + + voidp read_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +The last thing to handle is interlacing; this is covered in detail below, +but you must call the function here if you want libpng to handle expansion +of the interlaced image. + + number_of_passes = png_set_interlace_handling(png_ptr); + +After setting the transformations, libpng can update your png_info +structure to reflect any transformations you've requested with this +call. This is most useful to update the info structure's rowbytes +field so you can use it to allocate your image memory. This function +will also update your palette with the correct screen_gamma and +background if these have been given with the calls above. + + png_read_update_info(png_ptr, info_ptr); + +After you call png_read_update_info(), you can allocate any +memory you need to hold the image. The row data is simply +raw byte data for all forms of images. As the actual allocation +varies among applications, no example will be given. If you +are allocating one large chunk, you will need to build an +array of pointers to each row, as it will be needed for some +of the functions below. + +Remember: Before you call png_read_update_info(), the png_get_ +functions return the values corresponding to the original PNG image. +After you call png_read_update_info the values refer to the image +that libpng will output. Consequently you must call all the png_set_ +functions before you call png_read_update_info(). This is particularly +important for png_set_interlace_handling() - if you are going to call +png_read_update_info() you must call png_set_interlace_handling() before +it unless you want to receive interlaced output. + +.SS Reading image data + +After you've allocated memory, you can read the image data. +The simplest way to do this is in one function call. If you are +allocating enough memory to hold the whole image, you can just +call png_read_image() and libpng will read in all the image data +and put it in the memory area supplied. You will need to pass in +an array of pointers to each row. + +This function automatically handles interlacing, so you don't +need to call png_set_interlace_handling() (unless you call +png_read_update_info()) or call this function multiple times, or any +of that other stuff necessary with png_read_rows(). + + png_read_image(png_ptr, row_pointers); + +where row_pointers is: + + png_bytep row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to read in the whole image at once, you can +use png_read_rows() instead. If there is no interlacing (check +interlace_type == PNG_INTERLACE_NONE), this is simple: + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +where row_pointers is the same as in the png_read_image() call. + +If you are doing this just one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + png_read_row(png_ptr, row_pointer, NULL); + +If the file is interlaced (interlace_type != 0 in the IHDR chunk), things +get somewhat harder. The only current (PNG Specification version 1.2) +interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7); +a somewhat complicated 2D interlace scheme, known as Adam7, that +breaks down an image into seven smaller images of varying size, based +on an 8x8 grid. This number is defined (from libpng 1.5) as +PNG_INTERLACE_ADAM7_PASSES in png.h + +libpng can fill out those images or it can give them to you "as is". +It is almost always better to have libpng handle the interlacing for you. +If you want the images filled out, there are two ways to do that. The one +mentioned in the PNG specification is to expand each pixel to cover +those pixels that have not been read yet (the "rectangle" method). +This results in a blocky image for the first pass, which gradually +smooths out as more pixels are read. The other method is the "sparkle" +method, where pixels are drawn only in their final locations, with the +rest of the image remaining whatever colors they were initialized to +before the start of the read. The first method usually looks better, +but tends to be slower, as there are more pixels to put in the rows. + +If, as is likely, you want libpng to expand the images, call this before +calling png_start_read_image() or png_read_update_info(): + + if (interlace_type == PNG_INTERLACE_ADAM7) + number_of_passes + = png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this is seven, +but may change if another interlace type is added. This function can be +called even if the file is not interlaced, where it will return one pass. +You then need to read the whole image 'number_of_passes' times. Each time +will distribute the pixels from the current pass to the correct place in +the output image, so you need to supply the same rows to png_read_rows in +each pass. + +If you are not going to display the image after each pass, but are +going to wait until the entire image is read in, use the sparkle +effect. This effect is faster and the end result of either method +is exactly the same. If you are planning on displaying the image +after each pass, the "rectangle" effect is generally considered the +better looking one. + +If you only want the "sparkle" effect, just call png_read_rows() as +normal, with the third parameter NULL. Make sure you make pass over +the image number_of_passes times, and you don't change the data in the +rows between calls. You can change the locations of the data, just +not the data. Each pass only writes the pixels appropriate for that +pass, and assumes the data from previous passes is still valid. + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +If you only want the first effect (the rectangles), do the same as +before except pass the row buffer in the third parameter, and leave +the second parameter NULL. + + png_read_rows(png_ptr, NULL, row_pointers, + number_of_rows); + +If you don't want libpng to handle the interlacing details, just call +png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images. +Each of the images is a valid image by itself, however you will almost +certainly need to distribute the pixels from each sub-image to the +correct place. This is where everything gets very tricky. + +If you want to retrieve the separate images you must pass the correct +number of rows to each successive call of png_read_rows(). The calculation +gets pretty complicated for small images, where some sub-images may +not even exist because either their width or height ends up zero. +libpng provides two macros to help you in 1.5 and later versions: + + png_uint_32 width = PNG_PASS_COLS(image_width, pass_number); + png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number); + +Respectively these tell you the width and height of the sub-image +corresponding to the numbered pass. 'pass' is in in the range 0 to 6 - +this can be confusing because the specification refers to the same passes +as 1 to 7! Be careful, you must check both the width and height before +calling png_read_rows() and not call it for that pass if either is zero. + +You can, of course, read each sub-image row by row. If you want to +produce optimal code to make a pixel-by-pixel transformation of an +interlaced image this is the best approach; read each row of each pass, +transform it, and write it out to a new interlaced image. + +If you want to de-interlace the image yourself libpng provides further +macros to help that tell you where to place the pixels in the output image. +Because the interlacing scheme is rectangular - sub-image pixels are always +arranged on a rectangular grid - all you need to know for each pass is the +starting column and row in the output image of the first pixel plus the +spacing between each pixel. As of libpng 1.5 there are four macros to +retrieve this information: + + png_uint_32 x = PNG_PASS_START_COL(pass); + png_uint_32 y = PNG_PASS_START_ROW(pass); + png_uint_32 xStep = 1U << PNG_PASS_COL_SHIFT(pass); + png_uint_32 yStep = 1U << PNG_PASS_ROW_SHIFT(pass); + +These allow you to write the obvious loop: + + png_uint_32 input_y = 0; + png_uint_32 output_y = PNG_PASS_START_ROW(pass); + + while (output_y < output_image_height) + { + png_uint_32 input_x = 0; + png_uint_32 output_x = PNG_PASS_START_COL(pass); + + while (output_x < output_image_width) + { + image[output_y][output_x] = + subimage[pass][input_y][input_x++]; + + output_x += xStep; + } + + ++input_y; + output_y += yStep; + } + +Notice that the steps between successive output rows and columns are +returned as shifts. This is possible because the pixels in the subimages +are always a power of 2 apart - 1, 2, 4 or 8 pixels - in the original +image. In practice you may need to directly calculate the output coordinate +given an input coordinate. libpng provides two further macros for this +purpose: + + png_uint_32 output_x = PNG_COL_FROM_PASS_COL(input_x, pass); + png_uint_32 output_y = PNG_ROW_FROM_PASS_ROW(input_y, pass); + +Finally a pair of macros are provided to tell you if a particular image +row or column appears in a given pass: + + int col_in_pass = PNG_COL_IN_INTERLACE_PASS(output_x, pass); + int row_in_pass = PNG_ROW_IN_INTERLACE_PASS(output_y, pass); + +Bear in mind that you will probably also need to check the width and height +of the pass in addition to the above to be sure the pass even exists! + +With any luck you are convinced by now that you don't want to do your own +interlace handling. In reality normally the only good reason for doing this +is if you are processing PNG files on a pixel-by-pixel basis and don't want +to load the whole file into memory when it is interlaced. + +libpng includes a test program, pngvalid, that illustrates reading and +writing of interlaced images. If you can't get interlacing to work in your +code and don't want to leave it to libpng (the recommended approach) see +how pngvalid.c does it. + +.SS Finishing a sequential read + +After you are finished reading the image through the +low-level interface, you can finish reading the file. If you are +interested in comments or time, which may be stored either before or +after the image data, you should pass the separate png_info struct if +you want to keep the comments from before and after the image +separate. If you are not interested, you can pass NULL. + + png_read_end(png_ptr, end_info); + +When you are done, you can free all memory allocated by libpng like this: + + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those cases do nothing. +The "seq" parameter is ignored if only one item of the selected data +type, such as PLTE, is allowed. If "seq" is not -1, and multiple items +are allowed for the data type identified in the mask, such as text or +sPLT, only the n'th item in the structure is freed, where n is "seq". + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + + mask - which data elements are affected + same choices as in png_free_data() + +This function only affects data that has already been allocated. +You can call this function after reading the PNG data but before calling +any png_set_*() functions, to control whether the user or the png_set_*() +function is responsible for freeing any existing data that might be present, +and again after the png_set_*() functions to control whether the user +or png_destroy_*() is supposed to free the data. When the user assumes +responsibility for libpng-allocated data, the application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated your row_pointers in a single block, as suggested above in +the description of the high level read interface, you must not transfer +responsibility for freeing it to the png_set_rows or png_read_destroy function, +because they would also try to free the individual row_pointers[i]. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. + +The png_free_data() function will turn off the "valid" flag for anything +it frees. If you need to turn the flag off for a chunk that was freed by +your application instead of by libpng, you can use + + png_set_invalid(png_ptr, info_ptr, mask); + + mask - identifies the chunks to be made invalid, + containing the bitwise OR of one or + more of + PNG_INFO_gAMA, PNG_INFO_sBIT, + PNG_INFO_cHRM, PNG_INFO_PLTE, + PNG_INFO_tRNS, PNG_INFO_bKGD, + PNG_INFO_hIST, PNG_INFO_pHYs, + PNG_INFO_oFFs, PNG_INFO_tIME, + PNG_INFO_pCAL, PNG_INFO_sRGB, + PNG_INFO_iCCP, PNG_INFO_sPLT, + PNG_INFO_sCAL, PNG_INFO_IDAT + +For a more compact example of reading a PNG image, see the file example.c. + +.SS Reading PNG files progressively + +The progressive reader is slightly different then the non-progressive +reader. Instead of calling png_read_info(), png_read_rows(), and +png_read_end(), you make one call to png_process_data(), which calls +callbacks when it has the info, a row, or the end of the image. You +set up these callbacks with png_set_progressive_read_fn(). You don't +have to worry about the input/output functions of libpng, as you are +giving the library the data directly in png_process_data(). I will +assume that you have read the section on reading PNG files above, +so I will only highlight the differences (although I will show +all of the code). + +png_structp png_ptr; +png_infop info_ptr; + + /* An example code fragment of how you would + initialize the progressive reader in your + application. */ + int + initialize_png_reader() + { + png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + info_ptr = png_create_info_struct(png_ptr); + + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, + (png_infopp)NULL, (png_infopp)NULL); + return (ERROR); + } + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new. You can provide functions + to be called when the header info is valid, + when each row is completed, and when the image + is finished. If you aren't using all functions, + you can specify NULL parameters. Even when all + three functions are NULL, you need to call + png_set_progressive_read_fn(). You can use + any struct as the user_ptr (cast to a void pointer + for the function call), and retrieve the pointer + from inside the callbacks using the function + + png_get_progressive_ptr(png_ptr); + + which will return a void pointer, which you have + to cast appropriately. + */ + png_set_progressive_read_fn(png_ptr, (void *)user_ptr, + info_callback, row_callback, end_callback); + + return 0; + } + + /* A code fragment that you call as you receive blocks + of data */ + int + process_data(png_bytep buffer, png_uint_32 length) + { + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new also. Simply give it a chunk + of data from the file stream (in order, of + course). On machines with segmented memory + models machines, don't give it any more than + 64K. The library seems to run fine with sizes + of 4K. Although you can give it much less if + necessary (I assume you can give it chunks of + 1 byte, I haven't tried less then 256 bytes + yet). When this function returns, you may + want to display any rows that were generated + in the row callback if you don't already do + so there. + */ + png_process_data(png_ptr, info_ptr, buffer, length); + + /* At this point you can call png_process_data_skip if + you want to handle data the library will skip yourself; + it simply returns the number of bytes to skip (and stops + libpng skipping that number of bytes on the next + png_process_data call). + return 0; + } + + /* This function is called (as set by + png_set_progressive_read_fn() above) when enough data + has been supplied so all of the header has been + read. + */ + void + info_callback(png_structp png_ptr, png_infop info) + { + /* Do any setup here, including setting any of + the transformations mentioned in the Reading + PNG files section. For now, you _must_ call + either png_start_read_image() or + png_read_update_info() after all the + transformations are set (even if you don't set + any). You may start getting rows before + png_process_data() returns, so this is your + last chance to prepare for that. + + This is where you turn on interlace handling, + assuming you don't want to do it yourself. + + If you need to you can stop the processing of + your original input data at this point by calling + png_process_data_pause. This returns the number + of unprocessed bytes from the last png_process_data + call - it is up to you to ensure that the next call + sees these bytes again. If you don't want to bother + with this you can get libpng to cache the unread + bytes by setting the 'save' parameter (see png.h) but + then libpng will have to copy the data internally. + */ + } + + /* This function is called when each row of image + data is complete */ + void + row_callback(png_structp png_ptr, png_bytep new_row, + png_uint_32 row_num, int pass) + { + /* If the image is interlaced, and you turned + on the interlace handler, this function will + be called for every row in every pass. Some + of these rows will not be changed from the + previous pass. When the row is not changed, + the new_row variable will be NULL. The rows + and passes are called in order, so you don't + really need the row_num and pass, but I'm + supplying them because it may make your life + easier. + + If you did not turn on interlace handling then + the callback is called for each row of each + sub-image when the image is interlaced. In this + case 'row_num' is the row in the sub-image, not + the row in the output image as it is in all other + cases. + + For the non-NULL rows of interlaced images when + you have switched on libpng interlace handling, + you must call png_progressive_combine_row() + passing in the row and the old row. You can + call this function for NULL rows (it will just + return) and for non-interlaced images (it just + does the memcpy for you) if it will make the + code easier. Thus, you can just do this for + all cases if you switch on interlace handling; + */ + + png_progressive_combine_row(png_ptr, old_row, + new_row); + + /* where old_row is what was displayed for + previously for the row. Note that the first + pass (pass == 0, really) will completely cover + the old row, so the rows do not have to be + initialized. After the first pass (and only + for interlaced images), you will have to pass + the current row, and the function will combine + the old row and the new row. + + You can also call png_process_data_pause in this + callback - see above. + */ + } + + void + end_callback(png_structp png_ptr, png_infop info) + { + /* This function is called after the whole image + has been read, including any chunks after the + image (up to and including the IEND). You + will usually have the same info chunk as you + had in the header, although some data may have + been added to the comments and time fields. + + Most people won't do much here, perhaps setting + a flag that marks the image as finished. + */ + } + + + +.SH IV. Writing + +Much of this is very similar to reading. However, everything of +importance is repeated here, so you won't have to constantly look +back up in the reading section to understand writing. + +.SS Setup + +You will want to do the I/O initialization before you get into libpng, +so if it doesn't work, you don't have anything to undo. If you are not +using the standard I/O functions, you will need to replace them with +custom writing functions. See the discussion under Customizing libpng. + + FILE *fp = fopen(file_name, "wb"); + + if (!fp) + return (ERROR); + +Next, png_struct and png_info need to be allocated and initialized. +As these can be both relatively large, you may not want to store these +on the stack, unless you have stack space to spare. Of course, you +will want to check if they return NULL. If you are also reading, +you won't want to name your read structure and your write structure +both "png_ptr"; you can call them anything you like, such as +"read_ptr" and "write_ptr". Look at pngtest.c, for example. + + png_structp png_ptr = png_create_write_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_write_struct(&png_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +define PNG_USER_MEM_SUPPORTED and use +png_create_write_struct_2() instead of png_create_write_struct(): + + png_structp png_ptr = png_create_write_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +After you have these structures, you will need to set up the +error handling. When libpng encounters an error, it expects to +longjmp() back to your routine. Therefore, you will need to call +setjmp() and pass the png_jmpbuf(png_ptr). If you +write the file from different routines, you will need to update +the png_jmpbuf(png_ptr) every time you enter a new routine that will +call a png_*() function. See your documentation of setjmp/longjmp +for your compiler for more information on setjmp/longjmp. See +the discussion on libpng error handling in the Customizing Libpng +section below for more information on the libpng error handling. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(fp); + return (ERROR); + } + ... + return; + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_NO_SETJMP, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +You can #define PNG_ABORT() to a function that does something +more useful than abort(), as long as your function does not +return. + +Now you need to set up the output code. The default for libpng is to +use the C function fwrite(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. Again, if you wish to handle writing data in +another way, see the discussion on libpng I/O handling in the Customizing +Libpng section below. + + png_init_io(png_ptr, fp); + +If you are embedding your PNG into a datastream such as MNG, and don't +want libpng to write the 8-byte signature, or if you have already +written the signature in your application, use + + png_set_sig_bytes(png_ptr, 8); + +to inform libpng that it should not write a signature. + +.SS Write callbacks + +At this point, you can set up a callback function that will be +called after each row has been written, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void write_row_callback(png_structp png_ptr, png_uint_32 row, + int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "write_row_callback") + +To inform libpng about your function, use + + png_set_write_status_fn(png_ptr, write_row_callback); + +You now have the option of modifying how the compression library will +run. The following functions are mainly for testing, but may be useful +in some cases, like if you need to write PNG files extremely fast and +are willing to give up some compression, or if you want to get the +maximum possible compression at the expense of slower writing. If you +have no special needs in this area, let the library do what it wants by +not calling this function at all, as it has been tuned to deliver a good +speed/compression ratio. The second parameter to png_set_filter() is +the filter method, for which the only valid values are 0 (as of the +July 1999 PNG specification, version 1.2) or 64 (if you are writing +a PNG datastream that is to be embedded in a MNG datastream). The third +parameter is a flag that indicates which filter type(s) are to be tested +for each scanline. See the PNG specification for details on the specific +filter types. + + + /* turn on or off filtering, and/or choose + specific filters. You can use either a single + PNG_FILTER_VALUE_NAME or the bitwise OR of one + or more PNG_FILTER_NAME masks. + */ + png_set_filter(png_ptr, 0, + PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE | + PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB | + PNG_FILTER_UP | PNG_FILTER_VALUE_UP | + PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG | + PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH| + PNG_ALL_FILTERS); + +If an application wants to start and stop using particular filters during +compression, it should start out with all of the filters (to ensure that +the previous row of pixels will be stored in case it's needed later), +and then add and remove them after the start of compression. + +If you are writing a PNG datastream that is to be embedded in a MNG +datastream, the second parameter can be either 0 or 64. + +The png_set_compression_*() functions interface to the zlib compression +library, and should mostly be ignored unless you really know what you are +doing. The only generally useful call is png_set_compression_level() +which changes how much time zlib spends on trying to compress the image +data. See the Compression Library (zlib.h and algorithm.txt, distributed +with zlib) for details on the compression levels. + + /* set the zlib compression level */ + png_set_compression_level(png_ptr, + Z_BEST_COMPRESSION); + + /* set other zlib parameters */ + png_set_compression_mem_level(png_ptr, 8); + png_set_compression_strategy(png_ptr, + Z_DEFAULT_STRATEGY); + png_set_compression_window_bits(png_ptr, 15); + png_set_compression_method(png_ptr, 8); + png_set_compression_buffer_size(png_ptr, 8192) + +extern PNG_EXPORT(void,png_set_zbuf_size) + +.SS Setting the contents of info for output + +You now need to fill in the png_info structure with all the data you +wish to write before the actual image. Note that the only thing you +are allowed to write after the image is the text chunks and the time +chunk (as of PNG Specification 1.2, anyway). See png_write_end() and +the latest PNG specification for more information on that. If you +wish to write them before the image, fill them in now, and flag that +data as being valid. If you want to wait until after the data, don't +fill them until png_write_end(). For all the fields in png_info and +their data types, see png.h. For explanations of what the fields +contain, see the PNG specification. + +Some of the more important parts of the png_info are: + + png_set_IHDR(png_ptr, info_ptr, width, height, + bit_depth, color_type, interlace_type, + compression_type, filter_method) + + width - holds the width of the image + in pixels (up to 2^31). + + height - holds the height of the image + in pixels (up to 2^31). + + bit_depth - holds the bit depth of one of the + image channels. + (valid values are 1, 2, 4, 8, 16 + and depend also on the + color_type. See also significant + bits (sBIT) below). + + color_type - describes which color/alpha + channels are present. + PNG_COLOR_TYPE_GRAY + (bit depths 1, 2, 4, 8, 16) + PNG_COLOR_TYPE_GRAY_ALPHA + (bit depths 8, 16) + PNG_COLOR_TYPE_PALETTE + (bit depths 1, 2, 4, 8) + PNG_COLOR_TYPE_RGB + (bit_depths 8, 16) + PNG_COLOR_TYPE_RGB_ALPHA + (bit_depths 8, 16) + + PNG_COLOR_MASK_PALETTE + PNG_COLOR_MASK_COLOR + PNG_COLOR_MASK_ALPHA + + interlace_type - PNG_INTERLACE_NONE or + PNG_INTERLACE_ADAM7 + + compression_type - (must be + PNG_COMPRESSION_TYPE_DEFAULT) + + filter_method - (must be PNG_FILTER_TYPE_DEFAULT + or, if you are writing a PNG to + be embedded in a MNG datastream, + can also be + PNG_INTRAPIXEL_DIFFERENCING) + +If you call png_set_IHDR(), the call must appear before any of the +other png_set_*() functions, because they might require access to some of +the IHDR settings. The remaining png_set_*() functions can be called +in any order. + +If you wish, you can reset the compression_type, interlace_type, or +filter_method later by calling png_set_IHDR() again; if you do this, the +width, height, bit_depth, and color_type must be the same in each call. + + png_set_PLTE(png_ptr, info_ptr, palette, + num_palette); + + palette - the palette for the file + (array of png_color) + num_palette - number of entries in the palette + + png_set_gAMA(png_ptr, info_ptr, file_gamma); + png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); + + file_gamma - the gamma at which the image was + created (PNG_INFO_gAMA) + + int_file_gamma - 100,000 times the gamma at which + the image was created + + png_set_sRGB(png_ptr, info_ptr, srgb_intent); + + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of + the sRGB chunk means that the pixel + data is in the sRGB color space. + This chunk also implies specific + values of gAMA and cHRM. Rendering + intent is the CSS-1 property that + has been defined by the International + Color Consortium + (http://www.color.org). + It can be one of + PNG_sRGB_INTENT_SATURATION, + PNG_sRGB_INTENT_PERCEPTUAL, + PNG_sRGB_INTENT_ABSOLUTE, or + PNG_sRGB_INTENT_RELATIVE. + + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, + srgb_intent); + + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of the + sRGB chunk means that the pixel + data is in the sRGB color space. + This function also causes gAMA and + cHRM chunks with the specific values + that are consistent with sRGB to be + written. + + png_set_iCCP(png_ptr, info_ptr, name, compression_type, + profile, proflen); + + name - The profile name. + + compression_type - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + + profile - International Color Consortium color + profile data. May contain NULs. + + proflen - length of profile data in bytes. + + png_set_sBIT(png_ptr, info_ptr, sig_bit); + + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, red, + green, and blue channels, whichever are + appropriate for the given color type + (png_color_16) + + png_set_tRNS(png_ptr, info_ptr, trans_alpha, + num_trans, trans_color); + + trans_alpha - array of alpha (transparency) + entries for palette (PNG_INFO_tRNS) + + trans_color - graylevel or color sample values + (in order red, green, blue) of the + single transparent color for + non-paletted images (PNG_INFO_tRNS) + + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + png_set_hIST(png_ptr, info_ptr, hist); + + hist - histogram of palette (array of + png_uint_16) (PNG_INFO_hIST) + + png_set_tIME(png_ptr, info_ptr, mod_time); + + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_set_bKGD(png_ptr, info_ptr, background); + + background - background color (PNG_VALID_bKGD) + + png_set_text(png_ptr, info_ptr, text_ptr, num_text); + + text_ptr - array of png_text holding image + comments + + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + text_ptr[i].text - text comments for current + keyword. Can be NULL or empty. + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + text_ptr[i].lang - language of comment (NULL or + empty for unknown). + text_ptr[i].translated_keyword - keyword in UTF-8 (NULL + or empty for unknown). + Note that the itxt_length, lang, and lang_key + members of the text_ptr structure only exist + when the library is built with iTXt chunk support. + + num_text - number of comments + + png_set_sPLT(png_ptr, info_ptr, &palette_ptr, + num_spalettes); + + palette_ptr - array of png_sPLT_struct structures + to be added to the list of palettes + in the info structure. + num_spalettes - number of palette structures to be + added. + + png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, + unit_type); + + offset_x - positive offset from the left + edge of the screen + + offset_y - positive offset from the top + edge of the screen + + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_set_pHYs(png_ptr, info_ptr, res_x, res_y, + unit_type); + + res_x - pixels/unit physical resolution + in x direction + + res_y - pixels/unit physical resolution + in y direction + + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_set_sCAL(png_ptr, info_ptr, unit, width, height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are doubles) + + png_set_sCAL_s(png_ptr, info_ptr, unit, width, height) + + unit - physical scale units (an integer) + + width - width of a pixel in physical scale units + + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + png_set_unknown_chunks(png_ptr, info_ptr, &unknowns, + num_unknowns) + + unknowns - array of png_unknown_chunk + structures holding unknown chunks + unknowns[i].name - name of unknown chunk + unknowns[i].data - data of unknown chunk + unknowns[i].size - size of unknown chunk's data + unknowns[i].location - position to write chunk in file + 0: do not write chunk + PNG_HAVE_IHDR: before PLTE + PNG_HAVE_PLTE: before IDAT + PNG_AFTER_IDAT: after IDAT + +The "location" member is set automatically according to +what part of the output file has already been written. +You can change its value after calling png_set_unknown_chunks() +as demonstrated in pngtest.c. Within each of the "locations", +the chunks are sequenced according to their position in the +structure (that is, the value of "i", which is the order in which +the chunk was either read from the input file or defined with +png_set_unknown_chunks). + +A quick word about text and num_text. text is an array of png_text +structures. num_text is the number of valid structures in the array. +Each png_text structure holds a language code, a keyword, a text value, +and a compression type. + +The compression types have the same valid numbers as the compression +types of the image data. Currently, the only valid number is zero. +However, you can store text either compressed or uncompressed, unlike +images, which always have to be compressed. So if you don't want the +text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE. +Because tEXt and zTXt chunks don't have a language field, if you +specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt +any language code or translated keyword will not be written out. + +Until text gets around 1000 bytes, it is not worth compressing it. +After the text has been written out to the file, the compression type +is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR, +so that it isn't written out again at the end (in case you are calling +png_write_end() with the same struct). + +The keywords that are given in the PNG Specification are: + + Title Short (one line) title or + caption for image + + Author Name of image's creator + + Description Description of image (possibly long) + + Copyright Copyright notice + + Creation Time Time of original image creation + (usually RFC 1123 format, see below) + + Software Software used to create the image + + Disclaimer Legal disclaimer + + Warning Warning of nature of content + + Source Device used to create the image + + Comment Miscellaneous comment; conversion + from other image format + +The keyword-text pairs work like this. Keywords should be short +simple descriptions of what the comment is about. Some typical +keywords are found in the PNG specification, as is some recommendations +on keywords. You can repeat keywords in a file. You can even write +some text before the image and some after. For example, you may want +to put a description of the image before the image, but leave the +disclaimer until after, so viewers working over modem connections +don't have to wait for the disclaimer to go over the modem before +they start seeing the image. Finally, keywords should be full +words, not abbreviations. Keywords and text are in the ISO 8859-1 +(Latin-1) character set (a superset of regular ASCII) and can not +contain NUL characters, and should not contain control or other +unprintable characters. To make the comments widely readable, stick +with basic ASCII, and avoid machine specific character set extensions +like the IBM-PC character set. The keyword must be present, but +you can leave off the text string on non-compressed pairs. +Compressed pairs must have a text string, as only the text string +is compressed anyway, so the compression would be meaningless. + +PNG supports modification time via the png_time structure. Two +conversion routines are provided, png_convert_from_time_t() for +time_t and png_convert_from_struct_tm() for struct tm. The +time_t routine uses gmtime(). You don't have to use either of +these, but if you wish to fill in the png_time structure directly, +you should provide the time in universal time (GMT) if possible +instead of your local time. Note that the year number is the full +year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and +that months start with 1. + +If you want to store the time of the original image creation, you should +use a plain tEXt chunk with the "Creation Time" keyword. This is +necessary because the "creation time" of a PNG image is somewhat vague, +depending on whether you mean the PNG file, the time the image was +created in a non-PNG format, a still photo from which the image was +scanned, or possibly the subject matter itself. In order to facilitate +machine-readable dates, it is recommended that the "Creation Time" +tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"), +although this isn't a requirement. Unlike the tIME chunk, the +"Creation Time" tEXt chunk is not expected to be automatically changed +by the software. To facilitate the use of RFC 1123 dates, a function +png_convert_to_rfc1123(png_timep) is provided to convert from PNG +time to an RFC 1123 format string. + +.SS Writing unknown chunks + +You can use the png_set_unknown_chunks function to queue up chunks +for writing. You give it a chunk name, raw data, and a size; that's +all there is to it. The chunks will be written by the next following +png_write_info_before_PLTE, png_write_info, or png_write_end function. +Any chunks previously read into the info structure's unknown-chunk +list will also be written out in a sequence that satisfies the PNG +specification's ordering rules. + +.SS The high-level write interface + +At this point there are two ways to proceed; through the high-level +write interface, or through a sequence of low-level write operations. +You can use the high-level interface if your image data is present +in the info structure. All defined output +transformations are permitted, enabled by the following masks. + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + PNG_TRANSFORM_STRIP_FILLER Strip out filler + bytes (deprecated). + PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading + filler bytes + PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing + filler bytes + +If you have valid image data in the info structure (you can use +png_set_rows() to put image data in the info structure), simply do this: + + png_write_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of some set of +transformation flags. This call is equivalent to png_write_info(), +followed the set of transformations indicated by the transform mask, +then png_write_image(), and finally png_write_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future output transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_write_png(). + +.SS The low-level write interface + +If you are going the low-level route instead, you are now ready to +write all the file information up to the actual image data. You do +this with a call to png_write_info(). + + png_write_info(png_ptr, info_ptr); + +Note that there is one transformation you may need to do before +png_write_info(). In PNG files, the alpha channel in an image is the +level of opacity. If your data is supplied as a level of transparency, +you can invert the alpha channel before you write it, so that 0 is +fully transparent and 255 (in 8-bit or paletted images) or 65535 +(in 16-bit images) is fully opaque, with + + png_set_invert_alpha(png_ptr); + +This must appear before png_write_info() instead of later with the +other transformations because in the case of paletted images the tRNS +chunk data has to be inverted before the tRNS chunk is written. If +your image is not a paletted image, the tRNS data (which in such cases +represents a single color to be rendered as transparent) won't need to +be changed, and you can safely do this transformation after your +png_write_info() call. + +If you need to write a private chunk that you want to appear before +the PLTE chunk when PLTE is present, you can write the PNG info in +two steps, and insert code to write your own chunk between them: + + png_write_info_before_PLTE(png_ptr, info_ptr); + png_set_unknown_chunks(png_ptr, info_ptr, ...); + png_write_info(png_ptr, info_ptr); + +After you've written the file information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +PNG files store RGB pixels packed into 3 or 6 bytes. This code tells +the library to strip input data that has 4 or 8 bytes per pixel down +to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2 +bytes per pixel). + + png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); + +where the 0 is unused, and the location is either PNG_FILLER_BEFORE or +PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel +is stored XRGB or RGBX. + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit files. +If the data is supplied at 1 pixel per byte, use this code, which will +correctly pack the pixels into a single byte: + + png_set_packing(png_ptr); + +PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your +data is of another bit depth, you can write an sBIT chunk into the +file so that decoders can recover the original data if desired. + + /* Set the true bit depth of the image data */ + if (color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit.red = true_bit_depth; + sig_bit.green = true_bit_depth; + sig_bit.blue = true_bit_depth; + } + + else + { + sig_bit.gray = true_bit_depth; + } + + if (color_type & PNG_COLOR_MASK_ALPHA) + { + sig_bit.alpha = true_bit_depth; + } + + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + +If the data is stored in the row buffer in a bit depth other than +one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG), +this will scale the values to appear to be the correct bit depth as +is required by PNG. + + png_set_shift(png_ptr, &sig_bit); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code would be used if they are +supplied the other way (little-endian, i.e. least significant bits +first, the way PCs store them): + + if (bit_depth > 8) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +PNG files store 3 color pixels in red, green, blue order. This code +would be used if they are supplied as blue, green, red: + + png_set_bgr(png_ptr); + +PNG files describe monochrome as black being zero and white being +one. This code would be used if the pixels are supplied with this reversed +(black being one and white being zero): + + png_set_invert_mono(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_write_user_transform_fn(png_ptr, + write_transform_fn); + +You must supply the function + + void write_transform_fn(png_structp png_ptr ptr, + row_info_ptr row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +before any of the other transformations are processed. If supported +libpng also supplies an information routine that may be called from +your callback: + + png_get_current_row_number(png_ptr); + +This returns the current row passed to the transform. Even with interlaced +images the value returned is the row in the final output image. + +You can also set up a pointer to a user structure for use by your +callback function. + + png_set_user_transform_info(png_ptr, user_ptr, 0, 0); + +The user_channels and user_depth parameters of this function are ignored +when writing; you can set them to zero as shown. + +You can retrieve the pointer via the function png_get_user_transform_ptr(). +For example: + + voidp write_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +It is possible to have libpng flush any pending output, either manually, +or automatically after a certain number of lines have been written. To +flush the output stream a single time call: + + png_write_flush(png_ptr); + +and to have libpng flush the output stream periodically after a certain +number of scanlines have been written, call: + + png_set_flush(png_ptr, nrows); + +Note that the distance between rows is from the last time png_write_flush() +was called, or the first row of the image if it has never been called. +So if you write 50 lines, and then png_set_flush 25, it will flush the +output on the next scanline, and every 25 lines thereafter, unless +png_write_flush() is called before 25 more lines have been written. +If nrows is too small (less than about 10 lines for a 640 pixel wide +RGB image) the image compression may decrease noticeably (although this +may be acceptable for real-time applications). Infrequent flushing will +only degrade the compression performance by a few percent over images +that do not use flushing. + +.SS Writing the image data + +That's it for the transformations. Now you can write the image data. +The simplest way to do this is in one function call. If you have the +whole image in memory, you can just call png_write_image() and libpng +will write the image. You will need to pass in an array of pointers to +each row. This function automatically handles interlacing, so you don't +need to call png_set_interlace_handling() or call this function multiple +times, or any of that other stuff necessary with png_write_rows(). + + png_write_image(png_ptr, row_pointers); + +where row_pointers is: + + png_byte *row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to write the whole image at once, you can +use png_write_rows() instead. If the file is not interlaced, +this is simple: + + png_write_rows(png_ptr, row_pointers, + number_of_rows); + +row_pointers is the same as in the png_write_image() call. + +If you are just writing one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + + png_write_row(png_ptr, row_pointer); + +When the file is interlaced, things can get a good deal more complicated. +The only currently (as of the PNG Specification version 1.2, dated July +1999) defined interlacing scheme for PNG files is the "Adam7" interlace +scheme, that breaks down an image into seven smaller images of varying +size. libpng will build these images for you, or you can do them +yourself. If you want to build them yourself, see the PNG specification +for details of which pixels to write when. + +If you don't want libpng to handle the interlacing details, just +use png_set_interlace_handling() and call png_write_rows() the +correct number of times to write all the sub-images +(png_set_interlace_handling() returns the number of sub-images.) + +If you want libpng to build the sub-images, call this before you start +writing any rows: + + number_of_passes = png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this is seven, +but may change if another interlace type is added. + +Then write the complete image number_of_passes times. + + png_write_rows(png_ptr, row_pointers, number_of_rows); + +Think carefully before you write an interlaced image. Typically code that +reads such images reads all the image data into memory, uncompressed, before +doing any processing. Only code that can display an image on the fly can +take advantage of the interlacing and even then the image has to be exactly +the correct size for the output device, because scaling an image requires +adjacent pixels and these are not available until all the passes have been +read. + +If you do write an interlaced image you will hardly ever need to handle +the interlacing yourself. Call png_set_interlace_handling() and use the +approach described above. + +The only time it is conceivable that you will really need to write an +interlaced image pass-by-pass is when you have read one pass by pass and +made some pixel-by-pixel transformation to it, as described in the read +code above. In this case use the PNG_PASS_ROWS and PNG_PASS_COLS macros +to determine the size of each sub-image in turn and simply write the rows +you obtained from the read code. + +.SS Finishing a sequential write + +After you are finished writing the image, you should finish writing +the file. If you are interested in writing comments or time, you should +pass an appropriately filled png_info pointer. If you are not interested, +you can pass NULL. + + png_write_end(png_ptr, info_ptr); + +When you are done, you can free all memory used by libpng like this: + + png_destroy_write_struct(&png_ptr, &info_ptr); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those cases do nothing. +The "seq" parameter is ignored if only one item of the selected data +type, such as PLTE, is allowed. If "seq" is not -1, and multiple items +are allowed for the data type identified in the mask, such as text or +sPLT, only the n'th item in the structure is freed, where n is "seq". + +If you allocated data such as a palette that you passed in to libpng +with png_set_*, you must not free it until just before the call to +png_destroy_write_struct(). + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + + mask - which data elements are affected + same choices as in png_free_data() + +For example, to transfer responsibility for some data from a read structure +to a write structure, you could use + + png_data_freer(read_ptr, read_info_ptr, + PNG_USER_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + + png_data_freer(write_ptr, write_info_ptr, + PNG_DESTROY_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + +thereby briefly reassigning responsibility for freeing to the user but +immediately afterwards reassigning it once more to the write_destroy +function. Having done this, it would then be safe to destroy the read +structure and continue to use the PLTE, tRNS, and hIST data in the write +structure. + +This function only affects data that has already been allocated. +You can call this function before calling after the png_set_*() functions +to control whether the user or png_destroy_*() is supposed to free the data. +When the user assumes responsibility for libpng-allocated data, the +application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. +For a more compact example of writing a PNG image, see the file example.c. + +.SH V. Modifying/Customizing libpng: + +There are two issues here. The first is changing how libpng does +standard things like memory allocation, input/output, and error handling. +The second deals with more complicated things like adding new chunks, +adding new transformations, and generally changing how libpng works. +Both of those are compile-time issues; that is, they are generally +determined at the time the code is written, and there is rarely a need +to provide the user with a means of changing them. + +Memory allocation, input/output, and error handling + +All of the memory allocation, input/output, and error handling in libpng +goes through callbacks that are user-settable. The default routines are +in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change +these functions, call the appropriate png_set_*_fn() function. + +Memory allocation is done through the functions png_malloc(), png_calloc(), +and png_free(). These currently just call the standard C functions. +png_calloc() calls png_malloc() and then clears the newly +allocated memory to zero. There is limited support for certain systems +with segmented memory architectures and the types of pointers declared by +png.h match this; you will have to use appropriate pointers in your +application. Since it is +unlikely that the method of handling memory allocation on a platform +will change between applications, these functions must be modified in +the library at compile time. If you prefer to use a different method +of allocating and freeing data, you can use png_create_read_struct_2() or +png_create_write_struct_2() to register your own functions as described +above. These functions also provide a void pointer that can be retrieved +via + + mem_ptr=png_get_mem_ptr(png_ptr); + +Your replacement memory functions must have prototypes as follows: + + png_voidp malloc_fn(png_structp png_ptr, + png_alloc_size_t size); + + void free_fn(png_structp png_ptr, png_voidp ptr); + +Your malloc_fn() must return NULL in case of failure. The png_malloc() +function will normally call png_error() if it receives a NULL from the +system memory allocator or from your replacement malloc_fn(). + +Your free_fn() will never be called with a NULL ptr, since libpng's +png_free() checks for NULL before calling free_fn(). + +Input/Output in libpng is done through png_read() and png_write(), +which currently just call fread() and fwrite(). The FILE * is stored in +png_struct and is initialized via png_init_io(). If you wish to change +the method of I/O, the library supplies callbacks that you can set +through the function png_set_read_fn() and png_set_write_fn() at run +time, instead of calling the png_init_io() function. These functions +also provide a void pointer that can be retrieved via the function +png_get_io_ptr(). For example: + + png_set_read_fn(png_structp read_ptr, + voidp read_io_ptr, png_rw_ptr read_data_fn) + + png_set_write_fn(png_structp write_ptr, + voidp write_io_ptr, png_rw_ptr write_data_fn, + png_flush_ptr output_flush_fn); + + voidp read_io_ptr = png_get_io_ptr(read_ptr); + voidp write_io_ptr = png_get_io_ptr(write_ptr); + +The replacement I/O functions must have prototypes as follows: + + void user_read_data(png_structp png_ptr, + png_bytep data, png_size_t length); + + void user_write_data(png_structp png_ptr, + png_bytep data, png_size_t length); + + void user_flush_data(png_structp png_ptr); + +The user_read_data() function is responsible for detecting and +handling end-of-data errors. + +Supplying NULL for the read, write, or flush functions sets them back +to using the default C stream functions, which expect the io_ptr to +point to a standard *FILE structure. It is probably a mistake +to use NULL for one of write_data_fn and output_flush_fn but not both +of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined. +It is an error to read from a write stream, and vice versa. + +Error handling in libpng is done through png_error() and png_warning(). +Errors handled through png_error() are fatal, meaning that png_error() +should never return to its caller. Currently, this is handled via +setjmp() and longjmp() (unless you have compiled libpng with +PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()), +but you could change this to do things like exit() if you should wish, +as long as your function does not return. + +On non-fatal errors, png_warning() is called +to print a warning message, and then control returns to the calling code. +By default png_error() and png_warning() print a message on stderr via +fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined +(because you don't want the messages) or PNG_NO_STDIO defined (because +fprintf() isn't available). If you wish to change the behavior of the error +functions, you will need to set up your own message callbacks. These +functions are normally supplied at the time that the png_struct is created. +It is also possible to redirect errors and warnings to your own replacement +functions after png_create_*_struct() has been called by calling: + + png_set_error_fn(png_structp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warning_fn); + + png_voidp error_ptr = png_get_error_ptr(png_ptr); + +If NULL is supplied for either error_fn or warning_fn, then the libpng +default function will be used, calling fprintf() and/or longjmp() if a +problem is encountered. The replacement error functions should have +parameters as follows: + + void user_error_fn(png_structp png_ptr, + png_const_charp error_msg); + + void user_warning_fn(png_structp png_ptr, + png_const_charp warning_msg); + +The motivation behind using setjmp() and longjmp() is the C++ throw and +catch exception handling methods. This makes the code much easier to write, +as there is no need to check every return code of every function call. +However, there are some uncertainties about the status of local variables +after a longjmp, so the user may want to be careful about doing anything +after setjmp returns non-zero besides returning itself. Consult your +compiler documentation for more details. For an alternative approach, you +may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net). + +.SS Custom chunks + +If you need to read or write custom chunks, you may need to get deeper +into the libpng code. The library now has mechanisms for storing +and writing chunks of unknown type; you can even declare callbacks +for custom chunks. However, this may not be good enough if the +library code itself needs to know about interactions between your +chunk and existing `intrinsic' chunks. + +If you need to write a new intrinsic chunk, first read the PNG +specification. Acquire a first level of understanding of how it works. +Pay particular attention to the sections that describe chunk names, +and look at how other chunks were designed, so you can do things +similarly. Second, check out the sections of libpng that read and +write chunks. Try to find a chunk that is similar to yours and use +it as a template. More details can be found in the comments inside +the code. It is best to handle unknown chunks in a generic method, +via callback functions, instead of by modifying libpng functions. + +If you wish to write your own transformation for the data, look through +the part of the code that does the transformations, and check out some of +the simpler ones to get an idea of how they work. Try to find a similar +transformation to the one you want to add and copy off of it. More details +can be found in the comments inside the code itself. + +.SS Configuring for 16 bit platforms + +You will want to look into zconf.h to tell zlib (and thus libpng) that +it cannot allocate more then 64K at a time. Even if you can, the memory +won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K. + +.SS Configuring for DOS + +For DOS users who only have access to the lower 640K, you will +have to limit zlib's memory usage via a png_set_compression_mem_level() +call. See zlib.h or zconf.h in the zlib library for more information. + +.SS Configuring for Medium Model + +Libpng's support for medium model has been tested on most of the popular +compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets +defined, and FAR gets defined to far in pngconf.h, and you should be +all set. Everything in the library (except for zlib's structure) is +expecting far data. You must use the typedefs with the p or pp on +the end for pointers (or at least look at them and be careful). Make +note that the rows of data are defined as png_bytepp, which is an +unsigned char far * far *. + +.SS Configuring for gui/windowing platforms: + +You will need to write new error and warning functions that use the GUI +interface, as described previously, and set them to be the error and +warning functions at the time that png_create_*_struct() is called, +in order to have them available during the structure initialization. +They can be changed later via png_set_error_fn(). On some compilers, +you may also have to change the memory allocators (png_malloc, etc.). + +.SS Configuring for compiler xxx: + +All includes for libpng are in pngconf.h. If you need to add, change +or delete an include, this is the place to do it. +The includes that are not needed outside libpng are placed in pngpriv.h, +which is only used by the routines inside libpng itself. +The files in libpng proper only include pngpriv.h and png.h, which +in turn includes pngconf.h. + +.SS Configuring zlib: + +There are special functions to configure the compression. Perhaps the +most useful one changes the compression level, which currently uses +input compression values in the range 0 - 9. The library normally +uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests +have shown that for a large majority of images, compression values in +the range 3-6 compress nearly as well as higher levels, and do so much +faster. For online applications it may be desirable to have maximum speed +(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also +specify no compression (Z_NO_COMPRESSION = 0), but this would create +files larger than just storing the raw bitmap. You can specify the +compression level by calling: + + png_set_compression_level(png_ptr, level); + +Another useful one is to reduce the memory level used by the library. +The memory level defaults to 8, but it can be lowered if you are +short on memory (running DOS, for example, where you only have 640K). +Note that the memory level does have an effect on compression; among +other things, lower levels will result in sections of incompressible +data being emitted in smaller stored blocks, with a correspondingly +larger relative overhead of up to 15% in the worst case. + + png_set_compression_mem_level(png_ptr, level); + +The other functions are for configuring zlib. They are not recommended +for normal use and may result in writing an invalid PNG file. See +zlib.h for more information on what these mean. + + png_set_compression_strategy(png_ptr, + strategy); + + png_set_compression_window_bits(png_ptr, + window_bits); + + png_set_compression_method(png_ptr, method); + png_set_compression_buffer_size(png_ptr, size); + +.SS Controlling row filtering + +If you want to control whether libpng uses filtering or not, which +filters are used, and how it goes about picking row filters, you +can call one of these functions. The selection and configuration +of row filters can have a significant impact on the size and +encoding speed and a somewhat lesser impact on the decoding speed +of an image. Filtering is enabled by default for RGB and grayscale +images (with and without alpha), but not for paletted images nor +for any images with bit depths less than 8 bits/pixel. + +The 'method' parameter sets the main filtering method, which is +currently only '0' in the PNG 1.2 specification. The 'filters' +parameter sets which filter(s), if any, should be used for each +scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS +to turn filtering on and off, respectively. + +Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB, +PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise +ORed together with '|' to specify one or more filters to use. +These filters are described in more detail in the PNG specification. +If you intend to change the filter type during the course of writing +the image, you should start with flags set for all of the filters +you intend to use so that libpng can initialize its internal +structures appropriately for all of the filter types. (Note that this +means the first row must always be adaptively filtered, because libpng +currently does not allocate the filter buffers until png_write_row() +is called for the first time.) + + filters = PNG_FILTER_NONE | PNG_FILTER_SUB + PNG_FILTER_UP | PNG_FILTER_AVG | + PNG_FILTER_PAETH | PNG_ALL_FILTERS; + + png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, + filters); + The second parameter can also be + PNG_INTRAPIXEL_DIFFERENCING if you are + writing a PNG to be embedded in a MNG + datastream. This parameter must be the + same as the value of filter_method used + in png_set_IHDR(). + +It is also possible to influence how libpng chooses from among the +available filters. This is done in one or both of two ways - by +telling it how important it is to keep the same filter for successive +rows, and by telling it the relative computational costs of the filters. + + double weights[3] = {1.5, 1.3, 1.1}, + costs[PNG_FILTER_VALUE_LAST] = + {1.0, 1.3, 1.3, 1.5, 1.7}; + + png_set_filter_heuristics(png_ptr, + PNG_FILTER_HEURISTIC_WEIGHTED, 3, + weights, costs); + +The weights are multiplying factors that indicate to libpng that the +row filter should be the same for successive rows unless another row filter +is that many times better than the previous filter. In the above example, +if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a +"sum of absolute differences" 1.5 x 1.3 times higher than other filters +and still be chosen, while the NONE filter could have a sum 1.1 times +higher than other filters and still be chosen. Unspecified weights are +taken to be 1.0, and the specified weights should probably be declining +like those above in order to emphasize recent filters over older filters. + +The filter costs specify for each filter type a relative decoding cost +to be considered when selecting row filters. This means that filters +with higher costs are less likely to be chosen over filters with lower +costs, unless their "sum of absolute differences" is that much smaller. +The costs do not necessarily reflect the exact computational speeds of +the various filters, since this would unduly influence the final image +size. + +Note that the numbers above were invented purely for this example and +are given only to help explain the function usage. Little testing has +been done to find optimum values for either the costs or the weights. + +.SS Removing unwanted object code + +There are a bunch of #define's in pngconf.h that control what parts of +libpng are compiled. All the defines end in _SUPPORTED. If you are +never going to use a capability, you can change the #define to #undef +before recompiling libpng and save yourself code and data space, or +you can turn off individual capabilities with defines that begin with +PNG_NO_. + +In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead. + +You can also turn all of the transforms and ancillary chunk capabilities +off en masse with compiler directives that define +PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS, +or all four, +along with directives to turn on any of the capabilities that you do +want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra +transformations but still leave the library fully capable of reading +and writing PNG files with all known public chunks. Use of the +PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library +that is incapable of reading or writing ancillary chunks. If you are +not using the progressive reading capability, you can turn that off +with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING +capability, which you'll still have). + +All the reading and writing specific code are in separate files, so the +linker should only grab the files it needs. However, if you want to +make sure, or if you are building a stand alone library, all the +reading files start with pngr and all the writing files start with +pngw. The files that don't match either (like png.c, pngtrans.c, etc.) +are used for both reading and writing, and always need to be included. +The progressive reader is in pngpread.c + +If you are creating or distributing a dynamically linked library (a .so +or DLL file), you should not remove or disable any parts of the library, +as this will cause applications linked with different versions of the +library to fail if they call functions not available in your library. +The size of the library itself should not be an issue, because only +those sections that are actually used will be loaded into memory. + +.SS Requesting debug printout + +The macro definition PNG_DEBUG can be used to request debugging +printout. Set it to an integer value in the range 0 to 3. Higher +numbers result in increasing amounts of debugging information. The +information is printed to the "stderr" file, unless another file +name is specified in the PNG_DEBUG_FILE macro definition. + +When PNG_DEBUG > 0, the following functions (macros) become available: + + png_debug(level, message) + png_debug1(level, message, p1) + png_debug2(level, message, p1, p2) + +in which "level" is compared to PNG_DEBUG to decide whether to print +the message, "message" is the formatted string to be printed, +and p1 and p2 are parameters that are to be embedded in the string +according to printf-style formatting directives. For example, + + png_debug1(2, "foo=%d\n", foo); + +is expanded to + + if (PNG_DEBUG > 2) + fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo); + +When PNG_DEBUG is defined but is zero, the macros aren't defined, but you +can still use PNG_DEBUG to control your own debugging: + + #ifdef PNG_DEBUG + fprintf(stderr, ... + #endif + +When PNG_DEBUG = 1, the macros are defined, but only png_debug statements +having level = 0 will be printed. There aren't any such statements in +this version of libpng, but if you insert some they will be printed. + +.SH VI. MNG support + +The MNG specification (available at http://www.libpng.org/pub/mng) allows +certain extensions to PNG for PNG images that are embedded in MNG datastreams. +Libpng can support some of these extensions. To enable them, use the +png_permit_mng_features() function: + + feature_set = png_permit_mng_features(png_ptr, mask) + + mask is a png_uint_32 containing the bitwise OR of the + features you want to enable. These include + PNG_FLAG_MNG_EMPTY_PLTE + PNG_FLAG_MNG_FILTER_64 + PNG_ALL_MNG_FEATURES + + feature_set is a png_uint_32 that is the bitwise AND of + your mask with the set of MNG features that is + supported by the version of libpng that you are using. + +It is an error to use this function when reading or writing a standalone +PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped +in a MNG datastream. As a minimum, it must have the MNG 8-byte signature +and the MHDR and MEND chunks. Libpng does not provide support for these +or any other MNG chunks; your application must provide its own support for +them. You may wish to consider using libmng (available at +http://www.libmng.com) instead. + +.SH VII. Changes to Libpng from version 0.88 + +It should be noted that versions of libpng later than 0.96 are not +distributed by the original libpng author, Guy Schalnat, nor by +Andreas Dilger, who had taken over from Guy during 1996 and 1997, and +distributed versions 0.89 through 0.96, but rather by another member +of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are +still alive and well, but they have moved on to other things. + +The old libpng functions png_read_init(), png_write_init(), +png_info_init(), png_read_destroy(), and png_write_destroy() have been +moved to PNG_INTERNAL in version 0.95 to discourage their use. These +functions will be removed from libpng version 1.4.0. + +The preferred method of creating and initializing the libpng structures is +via the png_create_read_struct(), png_create_write_struct(), and +png_create_info_struct() because they isolate the size of the structures +from the application, allow version error checking, and also allow the +use of custom error handling routines during the initialization, which +the old functions do not. The functions png_read_destroy() and +png_write_destroy() do not actually free the memory that libpng +allocated for these structs, but just reset the data structures, so they +can be used instead of png_destroy_read_struct() and +png_destroy_write_struct() if you feel there is too much system overhead +allocating and freeing the png_struct for each image read. + +Setting the error callbacks via png_set_message_fn() before +png_read_init() as was suggested in libpng-0.88 is no longer supported +because this caused applications that do not use custom error functions +to fail if the png_ptr was not initialized to zero. It is still possible +to set the error callbacks AFTER png_read_init(), or to change them with +png_set_error_fn(), which is essentially the same function, but with a new +name to force compilation errors with applications that try to use the old +method. + +Starting with version 1.0.7, you can find out which version of the library +you are using at run-time: + + png_uint_32 libpng_vn = png_access_version_number(); + +The number libpng_vn is constructed from the major version, minor +version with leading zero, and release number with leading zero, +(e.g., libpng_vn for version 1.0.7 is 10007). + +You can also check which version of png.h you used when compiling your +application: + + png_uint_32 application_vn = PNG_LIBPNG_VER; + +.SH VIII. Changes to Libpng from version 1.0.x to 1.2.x + +Support for user memory management was enabled by default. To +accomplish this, the functions png_create_read_struct_2(), +png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(), +png_malloc_default(), and png_free_default() were added. + +Support for the iTXt chunk has been enabled by default as of +version 1.2.41. + +Support for certain MNG features was enabled. + +Support for numbered error messages was added. However, we never got +around to actually numbering the error messages. The function +png_set_strip_error_numbers() was added (Note: the prototype for this +function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE +builds of libpng-1.2.15. It was restored in libpng-1.2.36). + +The png_malloc_warn() function was added at libpng-1.2.3. This issues +a png_warning and returns NULL instead of aborting when it fails to +acquire the requested memory allocation. + +Support for setting user limits on image width and height was enabled +by default. The functions png_set_user_limits(), png_get_user_width_max(), +and png_get_user_height_max() were added at libpng-1.2.6. + +The png_set_add_alpha() function was added at libpng-1.2.7. + +The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9. +Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the +tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is +deprecated. + +A number of macro definitions in support of runtime selection of +assembler code features (especially Intel MMX code support) were +added at libpng-1.2.0: + + PNG_ASM_FLAG_MMX_SUPPORT_COMPILED + PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU + PNG_ASM_FLAG_MMX_READ_COMBINE_ROW + PNG_ASM_FLAG_MMX_READ_INTERLACE + PNG_ASM_FLAG_MMX_READ_FILTER_SUB + PNG_ASM_FLAG_MMX_READ_FILTER_UP + PNG_ASM_FLAG_MMX_READ_FILTER_AVG + PNG_ASM_FLAG_MMX_READ_FILTER_PAETH + PNG_ASM_FLAGS_INITIALIZED + PNG_MMX_READ_FLAGS + PNG_MMX_FLAGS + PNG_MMX_WRITE_FLAGS + PNG_MMX_FLAGS + +We added the following functions in support of runtime +selection of assembler code features: + + png_get_mmx_flagmask() + png_set_mmx_thresholds() + png_get_asm_flags() + png_get_mmx_bitdepth_threshold() + png_get_mmx_rowbytes_threshold() + png_set_asm_flags() + +We replaced all of these functions with simple stubs in libpng-1.2.20, +when the Intel assembler code was removed due to a licensing issue. + +These macros are deprecated: + + PNG_READ_TRANSFORMS_NOT_SUPPORTED + PNG_PROGRESSIVE_READ_NOT_SUPPORTED + PNG_NO_SEQUENTIAL_READ_SUPPORTED + PNG_WRITE_TRANSFORMS_NOT_SUPPORTED + PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED + PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED + +They have been replaced, respectively, by: + + PNG_NO_READ_TRANSFORMS + PNG_NO_PROGRESSIVE_READ + PNG_NO_SEQUENTIAL_READ + PNG_NO_WRITE_TRANSFORMS + PNG_NO_READ_ANCILLARY_CHUNKS + PNG_NO_WRITE_ANCILLARY_CHUNKS + +PNG_MAX_UINT was replaced with PNG_UINT_31_MAX. It has been +deprecated since libpng-1.0.16 and libpng-1.2.6. + +The function + png_check_sig(sig, num) +was replaced with + !png_sig_cmp(sig, 0, num) +It has been deprecated since libpng-0.90. + +The function + png_set_gray_1_2_4_to_8() +which also expands tRNS to alpha was replaced with + png_set_expand_gray_1_2_4_to_8() +which does not. It has been deprecated since libpng-1.0.18 and 1.2.9. + +.SH IX. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x + +Private libpng prototypes and macro definitions were moved from +png.h and pngconf.h into a new pngpriv.h header file. + +Functions png_set_benign_errors(), png_benign_error(), and +png_chunk_benign_error() were added. + +Support for setting the maximum amount of memory that the application +will allocate for reading chunks was added, as a security measure. +The functions png_set_chunk_cache_max() and png_get_chunk_cache_max() +were added to the library. + +We implemented support for I/O states by adding png_ptr member io_state +and functions png_get_io_chunk_name() and png_get_io_state() in pngget.c + +We added PNG_TRANSFORM_GRAY_TO_RGB to the available high-level +input transforms. + +Checking for and reporting of errors in the IHDR chunk is more thorough. + +Support for global arrays was removed, to improve thread safety. + +Some obsolete/deprecated macros and functions have been removed. + +Typecasted NULL definitions such as + #define png_voidp_NULL (png_voidp)NULL +were eliminated. If you used these in your application, just use +NULL instead. + +The png_struct and info_struct members "trans" and "trans_values" were +changed to "trans_alpha" and "trans_color", respectively. + +The obsolete, unused pnggccrd.c and pngvcrd.c files and related makefiles +were removed. + +The PNG_1_0_X and PNG_1_2_X macros were eliminated. + +The PNG_LEGACY_SUPPORTED macro was eliminated. + +Many WIN32_WCE #ifdefs were removed. + +The functions png_read_init(info_ptr), png_write_init(info_ptr), +png_info_init(info_ptr), png_read_destroy(), and png_write_destroy() +have been removed. They have been deprecated since libpng-0.95. + +The png_permit_empty_plte() was removed. It has been deprecated +since libpng-1.0.9. Use png_permit_mng_features() instead. + +We removed the obsolete stub functions png_get_mmx_flagmask(), +png_set_mmx_thresholds(), png_get_asm_flags(), +png_get_mmx_bitdepth_threshold(), png_get_mmx_rowbytes_threshold(), +png_set_asm_flags(), and png_mmx_supported() + +We removed the obsolete png_check_sig(), png_memcpy_check(), and +png_memset_check() functions. Instead use !png_sig_cmp(), memcpy(), +and memset(), respectively. + +The function png_set_gray_1_2_4_to_8() was removed. It has been +deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with +png_set_expand_gray_1_2_4_to_8() because the former function also +expanded palette images. + +Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32 +were added and are used by default instead of the corresponding +functions. Unfortunately, +from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. + +We changed the prototype for png_malloc() from + png_malloc(png_structp png_ptr, png_uint_32 size) +to + png_malloc(png_structp png_ptr, png_alloc_size_t size) + +This also applies to the prototype for the user replacement malloc_fn(). + +The png_calloc() function was added and is used in place of +of "png_malloc(); memset();" except in the case in png_read_png() +where the array consists of pointers; in this case a "for" loop is used +after the png_malloc() to set the pointers to NULL, to give robust. +behavior in case the application runs out of memory part-way through +the process. + +We changed the prototypes of png_get_compression_buffer_size() and +png_set_compression_buffer_size() to work with png_size_t instead of +png_uint_32. + +Support for numbered error messages was removed by default, since we +never got around to actually numbering the error messages. The function +png_set_strip_error_numbers() was removed from the library by default. + +The png_zalloc() and png_zfree() functions are no longer exported. +The png_zalloc() function no longer zeroes out the memory that it +allocates. + +Support for dithering was disabled by default in libpng-1.4.0, because +been well tested and doesn't actually "dither". The code was not +removed, however, and could be enabled by building libpng with +PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support +was reenabled, but the function was renamed png_set_quantize() to +reflect more accurately what it actually does. At the same time, +the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to +PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED +was renamed to PNG_READ_QUANTIZE_SUPPORTED. + +We removed the trailing '.' from the warning and error messages. + +.SH X. Changes to Libpng from version 1.4.x to 1.5.x + +From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. + +A. Changes that affect users of libpng + +There are no substantial API changes between the non-deprecated parts of +the 1.4.5 API and the 1.5.0 API, however the ability to directly access +the main libpng control structures, png_struct and png_info, deprecated +in earlier versions of libpng, has been completely removed from +libpng 1.5. + +We no longer include zlib.h in png.h. Applications that need access +to information in zlib.h will need to add the '#include "zlib.h"' +directive. It does not matter whether it is placed prior to or after +the '"#include png.h"' directive. + +We moved the png_strcpy(), png_strncpy(), png_strlen(), png_memcpy(), +png_memcmp(), png_sprintf, and png_memcpy() macros into a private +header file (pngpriv.h) that is not accessible to applications. + +In png_get_iCCP, the type of "profile" was changed from png_charpp +to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep. + +There are changes of form in png.h, including new and changed macros to +declare +parts of the API. Some API functions with arguments that are pointers to +data not modified within the function have been corrected to declare +these arguments with PNG_CONST. + +Much of the internal use of C macros to control the library build has also +changed and some of this is visible in the exported header files, in +particular the use of macros to control data and API elements visible +during application compilation may require significant revision to +application code. (It is extremely rare for an application to do this.) + +Any program that compiled against libpng 1.4 and did not use deprecated +features or access internal library structures should compile and work +against libpng 1.5. + +libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of +interlaced images. The macros return the number of rows and columns in +each pass and information that can be used to de-interlace and (if +absolutely necessary) interlace an image. + +libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls +the application provided png_longjmp_ptr on the internal, but application +initialized, jmpbuf. It is provided as a convenience to avoid the need +to use the png_jmpbuf macro, which had the unnecessary side effect of +resetting the internal png_longjmp_ptr value. + +libpng 1.5.0 includes a complete fixed point API. By default this is +present along with the corresponding floating point API. In general the +fixed point API is faster and smaller than the floating point one because +the PNG file format used fixed point, not floating point. This applies +even if the library uses floating point in internal calculations. A new +macro, PNG_FLOATING_ARITHMETIC_SUPPORTED, reveals whether the library +uses floating point arithmetic (the default) or fixed point arithmetic +internally for performance critical calculations such as gamma correction. +In some cases, the gamma calculations may produce slightly different +results. This has changed the results in png_rgb_to_gray and in alpha +composition (png_set_background for example). This applies even if the +original image was already linear (gamma == 1.0) and, therefore, it is +not necessary to linearize the image. This is because libpng has *not* +been changed to optimize that case correctly, yet. + +Fixed point support for the sCAL chunk comes with an important caveat; +the sCAL specification uses a decimal encoding of floating point values +and the accuracy of PNG fixed point values is insufficient for +representation of these values. Consequently a "string" API +(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading +arbitrary sCAL chunks in the absence of either the floating point API or +internal floating point calculations. + +Applications no longer need to include the optional distribution header +file pngusr.h or define the corresponding macros during application +build in order to see the correct variant of the libpng API. From 1.5.0 +application code can check for the corresponding _SUPPORTED macro: + +#ifdef PNG_INCH_CONVERSIONS_SUPPORTED + /* code that uses the inch conversion APIs. */ +#endif + +This macro will only be defined if the inch conversion functions have been +compiled into libpng. The full set of macros, and whether or not support +has been compiled in, are available in the header file pnglibconf.h. +This header file is specific to the libpng build. Notice that prior to +1.5.0 the _SUPPORTED macros would always have the default definition unless +reset by pngusr.h or by explicit settings on the compiler command line. +These settings may produce compiler warnings or errors in 1.5.0 because +of macro redefinition. + +From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the +function) incorrectly returned a value of type png_uint_32. libpng 1.5.0 +is consistent with the implementation in 1.4.5 and 1.2.x (where the macro +did not exist.) + +Applications can now choose whether to use these macros or to call the +corresponding function by defining PNG_USE_READ_MACROS or +PNG_NO_USE_READ_MACROS before including png.h. Notice that this is +only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0 + will lead to a link failure. + +B. Changes to the build and configuration of libpng + +Details of internal changes to the library code can be found in the CHANGES +file. These will be of no concern to the vast majority of library users or +builders, however the few who configure libpng to a non-default feature +set may need to change how this is done. + +There should be no need for library builders to alter build scripts if +these use the distributed build support - configure or the makefiles - +however users of the makefiles may care to update their build scripts +to build pnglibconf.h where the corresponding makefile does not do so. + +Building libpng with a non-default configuration has changed completely. +The old method using pngusr.h should still work correctly even though the +way pngusr.h is used in the build has been changed, however library +builders will probably want to examine the changes to take advantage of +new capabilities and to simplify their build system. + +B.1 Specific changes to library configuration capabilities + +The library now supports a complete fixed point implementation and can +thus be used on systems which have no floating point support or very +limited or slow support. Previously gamma correction, an essential part +of complete PNG support, required reasonably fast floating point. + +As part of this the choice of internal implementation has been made +independent of the choice of fixed versus floating point APIs and all the +missing fixed point APIs have been implemented. + +The exact mechanism used to control attributes of API functions has +changed. A single set of operating system independent macro definitions +is used and operating system specific directives are defined in +pnglibconf.h + +As part of this the mechanism used to choose procedure call standards on +those systems that allow a choice has been changed. At present this only +affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems +running on Intel processors. As before PNGAPI is defined where required +to control the exported API functions; however, two new macros, PNGCBAPI +and PNGCAPI, are used instead for callback functions (PNGCBAPI) and +(PNGCAPI) for functions that must match a C library prototype (currently +only png_longjmp_ptr, which must match the C longjmp function.) The new +approach is documented in pngconf.h + +Despite these changes libpng 1.5.0 only supports the native C function +calling standard on those platforms tested so far (__cdecl on Microsoft +Windows). This is because the support requirements for alternative +calling conventions seem to no longer exist. Developers who find it +necessary to set PNG_API_RULE to 1 should advise the mailing list +(png-mng-implement) of this and library builders who use Openwatcom and +therefore set PNG_API_RULE to 2 should also contact the mailing list. + +A new test program, pngvalid, is provided in addition to pngtest. +pngvalid validates the arithmetic accuracy of the gamma correction +calculations and includes a number of validations of the file format. +A subset of the full range of tests is run when "make check" is done +(in the 'configure' build.) pngvalid also allows total allocated memory +usage to be evaluated and performs additional memory overwrite validation. + +Many changes to individual feature macros have been made. The following +are the changes most likely to be noticed by library builders who +configure libpng: + +1) All feature macros now have consistent naming: + +#define PNG_NO_feature turns the feature off +#define PNG_feature_SUPPORTED turns the feature on + +pnglibconf.h contains one line for each feature macro which is either: + +#define PNG_feature_SUPPORTED + +if the feature is supported or: + +/*#undef PNG_feature_SUPPORTED*/ + +if it is not. Library code consistently checks for the 'SUPPORTED' macro. +It does not, and should not, check for the 'NO' macro which will not +normally be defined even if the feature is not supported. + +Compatibility with the old names is provided as follows: + +PNG_INCH_CONVERSIONS turns on PNG_INCH_CONVERSIONS_SUPPORTED + +And the following definitions disable the corresponding feature: + +PNG_SETJMP_NOT_SUPPORTED disables SETJMP +PNG_READ_TRANSFORMS_NOT_SUPPORTED disables READ_TRANSFORMS +PNG_NO_READ_COMPOSITED_NODIV disables READ_COMPOSITE_NODIV +PNG_WRITE_TRANSFORMS_NOT_SUPPORTED disables WRITE_TRANSFORMS +PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED disables READ_ANCILLARY_CHUNKS +PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED disables WRITE_ANCILLARY_CHUNKS + +Library builders should remove use of the above, inconsistent, names. + +2) Warning and error message formatting was previously conditional on +the STDIO feature. The library has been changed to use the +CONSOLE_IO feature instead. This means that if CONSOLE_IO is disabled +the library no longer uses the printf(3) functions, even though the +default read/write implementations use (FILE) style stdio.h functions. + +3) Three feature macros now control the fixed/floating point decisions: + +PNG_FLOATING_POINT_SUPPORTED enables the floating point APIs + +PNG_FIXED_POINT_SUPPORTED enables the fixed point APIs; however, in +practice these are normally required internally anyway (because the PNG +file format is fixed point), therefore in most cases PNG_NO_FIXED_POINT +merely stops the function from being exported. + +PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating +point implementation or the fixed point one. Typically the fixed point +implementation is larger and slower than the floating point implementation +on a system that supports floating point, however it may be faster on a +system which lacks floating point hardware and therefore uses a software +emulation. + +4) Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the +functions to read and write ints to be disabled independently of +PNG_USE_READ_MACROS, which allows libpng to be built with the functions +even though the default is to use the macros - this allows applications +to choose at app buildtime whether or not to use macros (previously +impossible because the functions weren't in the default build.) + +B.2 Changes to the configuration mechanism + +Prior to libpng-1.5.0 library builders who needed to configure libpng +had either to modify the exported pngconf.h header file to add system +specific configuration or had to write feature selection macros into +pngusr.h and cause this to be included into pngconf.h by defining +PNG_USER_CONFIG. The latter mechanism had the disadvantage that an +application built without PNG_USER_CONFIG defined would see the +unmodified, default, libpng API and thus would probably fail to link. + +These mechanisms still work in the configure build and in any makefile +build that builds pnglibconf.h although the feature selection macros +have changed somewhat as described above. In 1.5.0, however, pngusr.h is +processed only once, when the exported header file pnglibconf.h is built. +pngconf.h no longer includes pngusr.h, therefore it is ignored after the +build of pnglibconf.h and it is never included in an application build. + +The rarely used alternative of adding a list of feature macros to the +CFLAGS setting in the build also still works, however the macros will be +copied to pnglibconf.h and this may produce macro redefinition warnings +when the individual C files are compiled. + +All configuration now only works if pnglibconf.h is built from +scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan +(the original author of awk) maintains C source code of that awk and this +and all known later implementations (often called by subtly different +names - nawk and gawk for example) are adequate to build pnglibconf.h. +The Sun Microsystems (now Oracle) program 'awk' is an earlier version +and does not work, this may also apply to other systems that have a +functioning awk called 'nawk'. + +Configuration options are now documented in scripts/pnglibconf.dfa. This +file also includes dependency information that ensures a configuration is +consistent; that is, if a feature is switched off dependent features are +also removed. As a recommended alternative to using feature macros in +pngusr.h a system builder may also define equivalent options in pngusr.dfa +(or, indeed, any file) and add that to the configuration by setting +DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate +how to do this, and a case where pngusr.h is still required. + +.SH XI. Detecting libpng + +The png_get_io_ptr() function has been present since libpng-0.88, has never +changed, and is unaffected by conditional compilation macros. It is the +best choice for use in configure scripts for detecting the presence of any +libpng version since 0.88. In an autoconf "configure.in" you could use + + AC_CHECK_LIB(png, png_get_io_ptr, ... + +.SH XII. Source code repository + +Since about February 2009, version 1.2.34, libpng has been under "git" source +control. The git repository was built from old libpng-x.y.z.tar.gz files +going back to version 0.70. You can access the git repository (read only) +at + + git://libpng.git.sourceforge.net/gitroot/libpng + +or you can browse it via "gitweb" at + + http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng + +Patches can be sent to glennrp at users.sourceforge.net or to +png-mng-implement at lists.sourceforge.net or you can upload them to +the libpng bug tracker at + + http://libpng.sourceforge.net + +We also accept patches built from the tar or zip distributions, and +simple verbal discriptions of bug fixes, reported either to the +SourceForge bug tracker or to the png-mng-implement at lists.sf.net +mailing list. + +.SH XIII. Coding style + +Our coding style is similar to the "Allman" style, with curly +braces on separate lines: + + if (condition) + { + action; + } + + else if (another condition) + { + another action; + } + +The braces can be omitted from simple one-line actions: + + if (condition) + return (0); + +We use 3-space indentation, except for continued statements which +are usually indented the same as the first line of the statement +plus four more spaces. + +For macro definitions we use 2-space indentation, always leaving the "#" +in the first column. + + #ifndef PNG_NO_FEATURE + # ifndef PNG_FEATURE_SUPPORTED + # define PNG_FEATURE_SUPPORTED + # endif + #endif + +Comments appear with the leading "/*" at the same indentation as +the statement that follows the comment: + + /* Single-line comment */ + statement; + + /* This is a multiple-line + * comment. + */ + statement; + +Very short comments can be placed after the end of the statement +to which they pertain: + + statement; /* comment */ + +We don't use C++ style ("//") comments. We have, however, +used them in the past in some now-abandoned MMX assembler +code. + +Functions and their curly braces are not indented, and +exported functions are marked with PNGAPI: + + /* This is a public function that is visible to + * application programmers. It does thus-and-so. + */ + void PNGAPI + png_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for all exported functions appear in png.h, +above the comment that says + + /* Maintainer: Put new public prototypes here ... */ + +We mark all non-exported functions with "/* PRIVATE */"": + + void /* PRIVATE */ + png_non_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for non-exported functions (except for those in +pngtest) appear in +pngpriv.h +above the comment that says + + /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +To avoid polluting the global namespace, the names of all exported +functions and variables begin with "png_", and all publicly visible C +preprocessor macros begin with "PNG_". We request that applications that +use libpng *not* begin any of their own symbols with either of these strings. + +We put a space after each comma and after each semicolon +in "for" statements, and we put spaces before and after each +C binary operator and after "for" or "while", and before +"?". We don't put a space between a typecast and the expression +being cast, nor do we put one between a function name and the +left parenthesis that follows it: + + for (i = 2; i > 0; --i) + y[i] = a(x) + (int)b; + +We prefer #ifdef and #ifndef to #if defined() and if !defined() +when there is only one macro being tested. + +We do not use the TAB character for indentation in the C sources. + +Lines do not exceed 80 characters. + +Other rules can be inferred by inspecting the libpng source. + +.SH XIV. Y2K Compliance in libpng + +February 3, 2011 + +Since the PNG Development group is an ad-hoc body, we can't make +an official declaration. + +This is your unofficial assurance that libpng from version 0.71 and +upward through 1.5.1 are Y2K compliant. It is my belief that earlier +versions were also Y2K compliant. + +Libpng only has three year fields. One is a 2-byte unsigned integer that +will hold years up to 65535. The other two hold the date in text +format, and will hold years up to 9999. + +The integer is + "png_uint_16 year" in png_time_struct. + +The strings are + "png_charp time_buffer" in png_struct and + "near_time_buffer", which is a local character string in png.c. + +There are seven time-related functions: + + png_convert_to_rfc_1123() in png.c + (formerly png_convert_to_rfc_1152() in error) + png_convert_from_struct_tm() in pngwrite.c, called + in pngwrite.c + png_convert_from_time_t() in pngwrite.c + png_get_tIME() in pngget.c + png_handle_tIME() in pngrutil.c, called in pngread.c + png_set_tIME() in pngset.c + png_write_tIME() in pngwutil.c, called in pngwrite.c + +All appear to handle dates properly in a Y2K environment. The +png_convert_from_time_t() function calls gmtime() to convert from system +clock time, which returns (year - 1900), which we properly convert to +the full 4-digit year. There is a possibility that applications using +libpng are not passing 4-digit years into the png_convert_to_rfc_1123() +function, or that they are incorrectly passing only a 2-digit year +instead of "year - 1900" into the png_convert_from_struct_tm() function, +but this is not under our control. The libpng documentation has always +stated that it works with 4-digit years, and the APIs have been +documented as such. + +The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned +integer to hold the year, and can hold years as large as 65535. + +zlib, upon which libpng depends, is also Y2K compliant. It contains +no date-related code. + + + Glenn Randers-Pehrson + libpng maintainer + PNG Development Group + +.SH NOTE + +Note about libpng version numbers: + +Due to various miscommunications, unforeseen code incompatibilities +and occasional factors outside the authors' control, version numbering +on the library has not always been consistent and straightforward. +The following table summarizes matters since version 0.89c, which was +the first widely used release: + + source png.h png.h shared-lib + version string int version + ------- ------ ----- ---------- + 0.89c ("beta 3") 0.89 89 1.0.89 + 0.90 ("beta 4") 0.90 90 0.90 + 0.95 ("beta 5") 0.95 95 0.95 + 0.96 ("beta 6") 0.96 96 0.96 + 0.97b ("beta 7") 1.00.97 97 1.0.1 + 0.97c 0.97 97 2.0.97 + 0.98 0.98 98 2.0.98 + 0.99 0.99 98 2.0.99 + 0.99a-m 0.99 99 2.0.99 + 1.00 1.00 100 2.1.0 + 1.0.0 1.0.0 100 2.1.0 + 1.0.0 (from here on, the 100 2.1.0 + 1.0.1 png.h string is 10001 2.1.0 + 1.0.1a-e identical to the 10002 from here on, the + 1.0.2 source version) 10002 shared library is 2.V + 1.0.2a-b 10003 where V is the source + 1.0.1 10001 code version except as + 1.0.1a-e 10002 2.1.0.1a-e noted. + 1.0.2 10002 2.1.0.2 + 1.0.2a-b 10003 2.1.0.2a-b + 1.0.3 10003 2.1.0.3 + 1.0.3a-d 10004 2.1.0.3a-d + 1.0.4 10004 2.1.0.4 + 1.0.4a-f 10005 2.1.0.4a-f + 1.0.5 (+ 2 patches) 10005 2.1.0.5 + 1.0.5a-d 10006 2.1.0.5a-d + 1.0.5e-r 10100 2.1.0.5e-r + 1.0.5s-v 10006 2.1.0.5s-v + 1.0.6 (+ 3 patches) 10006 2.1.0.6 + 1.0.6d-g 10007 2.1.0.6d-g + 1.0.6h 10007 10.6h + 1.0.6i 10007 10.6i + 1.0.6j 10007 2.1.0.6j + 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 + 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 + 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 + 1.0.7 1 10007 2.1.0.7 + 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + 1.0.8rc1 1 10008 2.1.0.8rc1 + 1.0.8 1 10008 2.1.0.8 + 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + 1.0.9rc1 1 10009 2.1.0.9rc1 + 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + 1.0.9rc2 1 10009 2.1.0.9rc2 + 1.0.9 1 10009 2.1.0.9 + 1.0.10beta1 1 10010 2.1.0.10beta1 + 1.0.10rc1 1 10010 2.1.0.10rc1 + 1.0.10 1 10010 2.1.0.10 + 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + 1.0.11rc1 1 10011 2.1.0.11rc1 + 1.0.11 1 10011 2.1.0.11 + 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + 1.0.12rc1 2 10012 2.1.0.12rc1 + 1.0.12 2 10012 2.1.0.12 + 1.1.0a-f - 10100 2.1.1.0a-f abandoned + 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + 1.2.0rc1 3 10200 3.1.2.0rc1 + 1.2.0 3 10200 3.1.2.0 + 1.2.1beta-4 3 10201 3.1.2.1beta1-4 + 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + 1.2.1 3 10201 3.1.2.1 + 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + 1.0.13 10 10013 10.so.0.1.0.13 + 1.2.2 12 10202 12.so.0.1.2.2 + 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + 1.2.3 12 10203 12.so.0.1.2.3 + 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + 1.0.14 10 10014 10.so.0.1.0.14 + 1.2.4 13 10204 12.so.0.1.2.4 + 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + 1.0.15rc1 10 10015 10.so.0.1.0.15rc1 + 1.0.15 10 10015 10.so.0.1.0.15 + 1.2.5 13 10205 12.so.0.1.2.5 + 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + 1.2.6rc1-5 13 10206 12.so.0.1.2.6rc1-5 + 1.0.16 10 10016 10.so.0.1.0.16 + 1.2.6 13 10206 12.so.0.1.2.6 + 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 + 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + 1.0.17 10 10017 12.so.0.1.0.17 + 1.2.7 13 10207 12.so.0.1.2.7 + 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 + 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + 1.0.18 10 10018 12.so.0.1.0.18 + 1.2.8 13 10208 12.so.0.1.2.8 + 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + 1.2.9beta4-11 13 10209 12.so.0.9[.0] + 1.2.9rc1 13 10209 12.so.0.9[.0] + 1.2.9 13 10209 12.so.0.9[.0] + 1.2.10beta1-7 13 10210 12.so.0.10[.0] + 1.2.10rc1-2 13 10210 12.so.0.10[.0] + 1.2.10 13 10210 12.so.0.10[.0] + 1.4.0beta1-6 14 10400 14.so.0.0[.0] + 1.2.11beta1-4 13 10210 12.so.0.11[.0] + 1.4.0beta7-8 14 10400 14.so.0.0[.0] + 1.2.11 13 10211 12.so.0.11[.0] + 1.2.12 13 10212 12.so.0.12[.0] + 1.4.0beta9-14 14 10400 14.so.0.0[.0] + 1.2.13 13 10213 12.so.0.13[.0] + 1.4.0beta15-36 14 10400 14.so.0.0[.0] + 1.4.0beta37-87 14 10400 14.so.14.0[.0] + 1.4.0rc01 14 10400 14.so.14.0[.0] + 1.4.0beta88-109 14 10400 14.so.14.0[.0] + 1.4.0rc02-08 14 10400 14.so.14.0[.0] + 1.4.0 14 10400 14.so.14.0[.0] + 1.4.1beta01-03 14 10401 14.so.14.1[.0] + 1.4.1rc01 14 10401 14.so.14.1[.0] + 1.4.1beta04-12 14 10401 14.so.14.1[.0] + 1.4.1 14 10401 14.so.14.1[.0] + 1.4.2 14 10402 14.so.14.2[.0] + 1.4.3 14 10403 14.so.14.3[.0] + 1.4.4 14 10404 14.so.14.4[.0] + 1.5.0beta01-58 15 10500 15.so.15.0[.0] + 1.5.0rc01-07 15 10500 15.so.15.0[.0] + 1.5.0 15 10500 15.so.15.0[.0] + 1.5.1beta01-11 15 10501 15.so.15.1[.0] + 1.5.1rc01-02 15 10501 15.so.15.1[.0] + 1.5.1 15 10501 15.so.15.1[.0] + +Henceforth the source version will match the shared-library minor +and patch numbers; the shared-library major version number will be +used for changes in backward compatibility, as it is intended. The +PNG_PNGLIB_VER macro, which is not used within libpng but is available +for applications, is an unsigned integer of the form xyyzz corresponding +to the source version x.y.z (leading zeros in y and z). Beta versions +were given the previous public release number plus a letter, until +version 1.0.6j; from then on they were given the upcoming public +release number plus "betaNN" or "rcN". + +.SH "SEE ALSO" +.BR "png"(5), " libpngpf"(3), " zlib"(3), " deflate"(5), " " and " zlib"(5) + +.LP +.IR libpng : +.IP +http://libpng.sourceforge.net (follow the [DOWNLOAD] link) +http://www.libpng.org/pub/png + +.LP +.IR zlib : +.IP +(generally) at the same location as +.I libpng +or at +.br +ftp://ftp.info-zip.org/pub/infozip/zlib + +.LP +.IR PNG specification: RFC 2083 +.IP +(generally) at the same location as +.I libpng +or at +.br +ftp://ds.internic.net/rfc/rfc2083.txt +.br +or (as a W3C Recommendation) at +.br +http://www.w3.org/TR/REC-png.html + +.LP +In the case of any inconsistency between the PNG specification +and this library, the specification takes precedence. + +.SH AUTHORS +This man page: Glenn Randers-Pehrson + + +The contributing authors would like to thank all those who helped +with testing, bug fixes, and patience. This wouldn't have been +possible without all of you. + +Thanks to Frank J. T. Wojcik for helping with the documentation. + +Libpng version 1.5.1 - February 3, 2011: +Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc. +Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net). + +Supported by the PNG development group +.br +png-mng-implement at lists.sf.net +(subscription required; visit +png-mng-implement at lists.sourceforge.net (subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe). + +.SH COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +(This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail.) + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.5.1, February 3, 2011, are +Copyright (c) 2004,2006-2007 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your + enjoyment of the library or against infringement. + There is no warranty that our efforts or the library + will fulfill any of your particular purposes or needs. + This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and + effort is with the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson +Distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and + must not be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from + any source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +February 3, 2011 + +.\" end of man page + diff --git a/src/3rdparty/libpng/libpng.pc.in b/src/3rdparty/libpng/libpng.pc.in new file mode 100644 index 0000000000..3e7e2c58a7 --- /dev/null +++ b/src/3rdparty/libpng/libpng.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@ + +Name: libpng +Description: Loads and saves PNG files +Version: @PNGLIB_VERSION@ +Libs: -L${libdir} -lpng@PNGLIB_MAJOR@@PNGLIB_MINOR@ +Libs.private: @LIBS@ +Cflags: -I${includedir} diff --git a/src/3rdparty/libpng/libpngpf.3 b/src/3rdparty/libpng/libpngpf.3 new file mode 100644 index 0000000000..ff6e1641ea --- /dev/null +++ b/src/3rdparty/libpng/libpngpf.3 @@ -0,0 +1,30 @@ +.TH LIBPNGPF 3 "February 3, 2011" +.SH NAME +libpng \- Portable Network Graphics (PNG) Reference Library 1.5.1 +(private functions) +.SH SYNOPSIS +\fB#include \fI"pngpriv.h" + +\fI\fB + +\fBAs of libpng version \fP\fI1.5.1\fP\fB, this section is no longer \fP\fImaintained\fP\fB, now \fIthat + +\fBthe private function prototypes are hidden in pngpriv.h and not \fIaccessible + +\fBto applications. Look in pngpriv.h for the prototypes and a short \fIdescription + +\fBof each \fIfunction. + +\fI\fB + +.SH DESCRIPTION +The functions previously listed here are used privately by libpng +and are not recommended for use by applications. They are +not "exported" to applications using shared libraries. They +are listed alphabetically here as an aid to libpng maintainers. +See pngpriv.h for more information on these functions. + +.SH SEE ALSO +.BR "png"(5), " libpng"(3), " zlib"(3), " deflate"(5), " " and " zlib"(5) +.SH AUTHOR +Glenn Randers-Pehrson diff --git a/src/3rdparty/libpng/png.5 b/src/3rdparty/libpng/png.5 new file mode 100644 index 0000000000..9c5f8d3366 --- /dev/null +++ b/src/3rdparty/libpng/png.5 @@ -0,0 +1,74 @@ +.TH PNG 5 "February 3, 2011" +.SH NAME +png \- Portable Network Graphics (PNG) format +.SH DESCRIPTION +PNG (Portable Network Graphics) is an extensible file format for the +lossless, portable, well-compressed storage of raster images. PNG provides +a patent-free replacement for GIF and can also replace many +common uses of TIFF. Indexed-color, grayscale, and truecolor images are +supported, plus an optional alpha channel. Sample depths range from +1 to 16 bits. +.br + +PNG is designed to work well in online viewing applications, such as the +World Wide Web, so it is fully streamable with a progressive display +option. PNG is robust, providing both full file integrity checking and +fast, simple detection of common transmission errors. Also, PNG can store +gamma and chromaticity data for improved color matching on heterogeneous +platforms. + +.SH "SEE ALSO" +.BR "libpng"(3), " libpngpf"(3), " zlib"(3), " deflate"(5), " " and " zlib"(5) +.LP +PNG specification (second edition), November 2003: +.IP +.br + 8) + png_error(png_ptr, "Too many bytes for PNG signature"); + + png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes); +} + +/* Checks whether the supplied bytes match the PNG signature. We allow + * checking less than the full 8-byte signature so that those apps that + * already read the first few bytes of a file to determine the file type + * can simply check the remaining bytes for extra assurance. Returns + * an integer less than, equal to, or greater than zero if sig is found, + * respectively, to be less than, to match, or be greater than the correct + * PNG signature (this is the same behaviour as strcmp, memcmp, etc). + */ +int PNGAPI +png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check) +{ + png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + + if (num_to_check > 8) + num_to_check = 8; + + else if (num_to_check < 1) + return (-1); + + if (start > 7) + return (-1); + + if (start + num_to_check > 8) + num_to_check = 8 - start; + + return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check))); +} + +#endif /* PNG_READ_SUPPORTED */ + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +/* Function to allocate memory for zlib */ +PNG_FUNCTION(voidpf /* PRIVATE */, +png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED) +{ + png_voidp ptr; + png_structp p=(png_structp)png_ptr; + png_uint_32 save_flags=p->flags; + png_alloc_size_t num_bytes; + + if (png_ptr == NULL) + return (NULL); + + if (items > PNG_UINT_32_MAX/size) + { + png_warning (p, "Potential overflow in png_zalloc()"); + return (NULL); + } + num_bytes = (png_alloc_size_t)items * size; + + p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; + ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes); + p->flags=save_flags; + + return ((voidpf)ptr); +} + +/* Function to free memory for zlib */ +void /* PRIVATE */ +png_zfree(voidpf png_ptr, voidpf ptr) +{ + png_free((png_structp)png_ptr, (png_voidp)ptr); +} + +/* Reset the CRC variable to 32 bits of 1's. Care must be taken + * in case CRC is > 32 bits to leave the top bits 0. + */ +void /* PRIVATE */ +png_reset_crc(png_structp png_ptr) +{ + png_ptr->crc = crc32(0, Z_NULL, 0); +} + +/* Calculate the CRC over a section of data. We can only pass as + * much data to this routine as the largest single buffer size. We + * also check that this data will actually be used before going to the + * trouble of calculating it. + */ +void /* PRIVATE */ +png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length) +{ + int need_crc = 1; + + if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ + { + if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == + (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) + need_crc = 0; + } + + else /* critical */ + { + if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) + need_crc = 0; + } + + if (need_crc) + png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length); +} + +/* Allocate the memory for an info_struct for the application. We don't + * really need the png_ptr, but it could potentially be useful in the + * future. This should be used in favour of malloc(png_sizeof(png_info)) + * and png_info_init() so that applications that want to use a shared + * libpng don't have to be recompiled if png_info changes size. + */ +PNG_FUNCTION(png_infop,PNGAPI +png_create_info_struct,(png_structp png_ptr),PNG_ALLOCATED) +{ + png_infop info_ptr; + + png_debug(1, "in png_create_info_struct"); + + if (png_ptr == NULL) + return (NULL); + +#ifdef PNG_USER_MEM_SUPPORTED + info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO, + png_ptr->malloc_fn, png_ptr->mem_ptr); +#else + info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); +#endif + if (info_ptr != NULL) + png_info_init_3(&info_ptr, png_sizeof(png_info)); + + return (info_ptr); +} + +/* This function frees the memory associated with a single info struct. + * Normally, one would use either png_destroy_read_struct() or + * png_destroy_write_struct() to free an info struct, but this may be + * useful for some applications. + */ +void PNGAPI +png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr) +{ + png_infop info_ptr = NULL; + + png_debug(1, "in png_destroy_info_struct"); + + if (png_ptr == NULL) + return; + + if (info_ptr_ptr != NULL) + info_ptr = *info_ptr_ptr; + + if (info_ptr != NULL) + { + png_info_destroy(png_ptr, info_ptr); + +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn, + png_ptr->mem_ptr); +#else + png_destroy_struct((png_voidp)info_ptr); +#endif + *info_ptr_ptr = NULL; + } +} + +/* Initialize the info structure. This is now an internal function (0.89) + * and applications using it are urged to use png_create_info_struct() + * instead. + */ + +void PNGAPI +png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size) +{ + png_infop info_ptr = *ptr_ptr; + + png_debug(1, "in png_info_init_3"); + + if (info_ptr == NULL) + return; + + if (png_sizeof(png_info) > png_info_struct_size) + { + png_destroy_struct(info_ptr); + info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); + *ptr_ptr = info_ptr; + } + + /* Set everything to 0 */ + png_memset(info_ptr, 0, png_sizeof(png_info)); +} + +void PNGAPI +png_data_freer(png_structp png_ptr, png_infop info_ptr, + int freer, png_uint_32 mask) +{ + png_debug(1, "in png_data_freer"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (freer == PNG_DESTROY_WILL_FREE_DATA) + info_ptr->free_me |= mask; + + else if (freer == PNG_USER_WILL_FREE_DATA) + info_ptr->free_me &= ~mask; + + else + png_warning(png_ptr, + "Unknown freer parameter in png_data_freer"); +} + +void PNGAPI +png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, + int num) +{ + png_debug(1, "in png_free_data"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + +#ifdef PNG_TEXT_SUPPORTED + /* Free text item num or (if num == -1) all text items */ + if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) + { + if (num != -1) + { + if (info_ptr->text && info_ptr->text[num].key) + { + png_free(png_ptr, info_ptr->text[num].key); + info_ptr->text[num].key = NULL; + } + } + + else + { + int i; + for (i = 0; i < info_ptr->num_text; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); + png_free(png_ptr, info_ptr->text); + info_ptr->text = NULL; + info_ptr->num_text=0; + } + } +#endif + +#ifdef PNG_tRNS_SUPPORTED + /* Free any tRNS entry */ + if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) + { + png_free(png_ptr, info_ptr->trans_alpha); + info_ptr->trans_alpha = NULL; + info_ptr->valid &= ~PNG_INFO_tRNS; + } +#endif + +#ifdef PNG_sCAL_SUPPORTED + /* Free any sCAL entry */ + if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) + { +#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, info_ptr->scal_s_width); + png_free(png_ptr, info_ptr->scal_s_height); + info_ptr->scal_s_width = NULL; + info_ptr->scal_s_height = NULL; +#endif + info_ptr->valid &= ~PNG_INFO_sCAL; + } +#endif + +#ifdef PNG_pCAL_SUPPORTED + /* Free any pCAL entry */ + if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) + { + png_free(png_ptr, info_ptr->pcal_purpose); + png_free(png_ptr, info_ptr->pcal_units); + info_ptr->pcal_purpose = NULL; + info_ptr->pcal_units = NULL; + if (info_ptr->pcal_params != NULL) + { + int i; + for (i = 0; i < (int)info_ptr->pcal_nparams; i++) + { + png_free(png_ptr, info_ptr->pcal_params[i]); + info_ptr->pcal_params[i] = NULL; + } + png_free(png_ptr, info_ptr->pcal_params); + info_ptr->pcal_params = NULL; + } + info_ptr->valid &= ~PNG_INFO_pCAL; + } +#endif + +#ifdef PNG_iCCP_SUPPORTED + /* Free any iCCP entry */ + if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) + { + png_free(png_ptr, info_ptr->iccp_name); + png_free(png_ptr, info_ptr->iccp_profile); + info_ptr->iccp_name = NULL; + info_ptr->iccp_profile = NULL; + info_ptr->valid &= ~PNG_INFO_iCCP; + } +#endif + +#ifdef PNG_sPLT_SUPPORTED + /* Free a given sPLT entry, or (if num == -1) all sPLT entries */ + if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) + { + if (num != -1) + { + if (info_ptr->splt_palettes) + { + png_free(png_ptr, info_ptr->splt_palettes[num].name); + png_free(png_ptr, info_ptr->splt_palettes[num].entries); + info_ptr->splt_palettes[num].name = NULL; + info_ptr->splt_palettes[num].entries = NULL; + } + } + + else + { + if (info_ptr->splt_palettes_num) + { + int i; + for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); + + png_free(png_ptr, info_ptr->splt_palettes); + info_ptr->splt_palettes = NULL; + info_ptr->splt_palettes_num = 0; + } + info_ptr->valid &= ~PNG_INFO_sPLT; + } + } +#endif + +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + if (png_ptr->unknown_chunk.data) + { + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; + } + + if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) + { + if (num != -1) + { + if (info_ptr->unknown_chunks) + { + png_free(png_ptr, info_ptr->unknown_chunks[num].data); + info_ptr->unknown_chunks[num].data = NULL; + } + } + + else + { + int i; + + if (info_ptr->unknown_chunks_num) + { + for (i = 0; i < info_ptr->unknown_chunks_num; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); + + png_free(png_ptr, info_ptr->unknown_chunks); + info_ptr->unknown_chunks = NULL; + info_ptr->unknown_chunks_num = 0; + } + } + } +#endif + +#ifdef PNG_hIST_SUPPORTED + /* Free any hIST entry */ + if ((mask & PNG_FREE_HIST) & info_ptr->free_me) + { + png_free(png_ptr, info_ptr->hist); + info_ptr->hist = NULL; + info_ptr->valid &= ~PNG_INFO_hIST; + } +#endif + + /* Free any PLTE entry that was internally allocated */ + if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) + { + png_zfree(png_ptr, info_ptr->palette); + info_ptr->palette = NULL; + info_ptr->valid &= ~PNG_INFO_PLTE; + info_ptr->num_palette = 0; + } + +#ifdef PNG_INFO_IMAGE_SUPPORTED + /* Free any image bits attached to the info structure */ + if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) + { + if (info_ptr->row_pointers) + { + int row; + for (row = 0; row < (int)info_ptr->height; row++) + { + png_free(png_ptr, info_ptr->row_pointers[row]); + info_ptr->row_pointers[row] = NULL; + } + png_free(png_ptr, info_ptr->row_pointers); + info_ptr->row_pointers = NULL; + } + info_ptr->valid &= ~PNG_INFO_IDAT; + } +#endif + + if (num != -1) + mask &= ~PNG_FREE_MUL; + + info_ptr->free_me &= ~mask; +} + +/* This is an internal routine to free any memory that the info struct is + * pointing to before re-using it or freeing the struct itself. Recall + * that png_free() checks for NULL pointers for us. + */ +void /* PRIVATE */ +png_info_destroy(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_info_destroy"); + + png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + if (png_ptr->num_chunk_list) + { + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list = NULL; + png_ptr->num_chunk_list = 0; + } +#endif + + png_info_init_3(&info_ptr, png_sizeof(png_info)); +} +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +/* This function returns a pointer to the io_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy() or png_read_destroy() are called. + */ +png_voidp PNGAPI +png_get_io_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) + return (NULL); + + return (png_ptr->io_ptr); +} + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +# ifdef PNG_STDIO_SUPPORTED +/* Initialize the default input/output functions for the PNG file. If you + * use your own read or write routines, you can call either png_set_read_fn() + * or png_set_write_fn() instead of png_init_io(). If you have defined + * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't + * necessarily available. + */ +void PNGAPI +png_init_io(png_structp png_ptr, png_FILE_p fp) +{ + png_debug(1, "in png_init_io"); + + if (png_ptr == NULL) + return; + + png_ptr->io_ptr = (png_voidp)fp; +} +# endif + +# ifdef PNG_TIME_RFC1123_SUPPORTED +/* Convert the supplied time into an RFC 1123 string suitable for use in + * a "Creation Time" or other text-based time string. + */ +png_const_charp PNGAPI +png_convert_to_rfc1123(png_structp png_ptr, png_const_timep ptime) +{ + static PNG_CONST char short_months[12][4] = + {"Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + + if (png_ptr == NULL) + return (NULL); + + if (png_ptr->time_buffer == NULL) + { + png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* + png_sizeof(char))); + } + +# ifdef USE_FAR_KEYWORD + { + char near_time_buf[29]; + png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000", + ptime->day % 32, short_months[(ptime->month - 1) % 12], + ptime->year, ptime->hour % 24, ptime->minute % 60, + ptime->second % 61); + png_memcpy(png_ptr->time_buffer, near_time_buf, + 29*png_sizeof(char)); + } +# else + png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000", + ptime->day % 32, short_months[(ptime->month - 1) % 12], + ptime->year, ptime->hour % 24, ptime->minute % 60, + ptime->second % 61); +# endif + return png_ptr->time_buffer; +} +# endif /* PNG_TIME_RFC1123_SUPPORTED */ + +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +png_const_charp PNGAPI +png_get_copyright(png_const_structp png_ptr) +{ + PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ +#ifdef PNG_STRING_COPYRIGHT + return PNG_STRING_COPYRIGHT +#else +# ifdef __STDC__ + return PNG_STRING_NEWLINE \ + "libpng version 1.5.1 - February 3, 2011" PNG_STRING_NEWLINE \ + "Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ + "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ + "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ + PNG_STRING_NEWLINE; +# else + return "libpng version 1.5.1 - February 3, 2011\ + Copyright (c) 1998-2011 Glenn Randers-Pehrson\ + Copyright (c) 1996-1997 Andreas Dilger\ + Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; +# endif +#endif +} + +/* The following return the library version as a short string in the + * format 1.0.0 through 99.99.99zz. To get the version of *.h files + * used with your application, print out PNG_LIBPNG_VER_STRING, which + * is defined in png.h. + * Note: now there is no difference between png_get_libpng_ver() and + * png_get_header_ver(). Due to the version_nn_nn_nn typedef guard, + * it is guaranteed that png.c uses the correct version of png.h. + */ +png_const_charp PNGAPI +png_get_libpng_ver(png_const_structp png_ptr) +{ + /* Version of *.c files used when building libpng */ + return png_get_header_ver(png_ptr); +} + +png_const_charp PNGAPI +png_get_header_ver(png_const_structp png_ptr) +{ + /* Version of *.h files used when building libpng */ + PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ + return PNG_LIBPNG_VER_STRING; +} + +png_const_charp PNGAPI +png_get_header_version(png_const_structp png_ptr) +{ + /* Returns longer string containing both version and date */ + PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ +#ifdef __STDC__ + return PNG_HEADER_VERSION_STRING +# ifndef PNG_READ_SUPPORTED + " (NO READ SUPPORT)" +# endif + PNG_STRING_NEWLINE; +#else + return PNG_HEADER_VERSION_STRING; +#endif +} + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +# ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +int PNGAPI +png_handle_as_unknown(png_structp png_ptr, png_const_bytep chunk_name) +{ + /* Check chunk_name and return "keep" value if it's on the list, else 0 */ + int i; + png_bytep p; + if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0) + return 0; + + p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5; + for (i = png_ptr->num_chunk_list; i; i--, p -= 5) + if (!png_memcmp(chunk_name, p, 4)) + return ((int)*(p + 4)); + return 0; +} +# endif +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +#ifdef PNG_READ_SUPPORTED +/* This function, added to libpng-1.0.6g, is untested. */ +int PNGAPI +png_reset_zstream(png_structp png_ptr) +{ + if (png_ptr == NULL) + return Z_STREAM_ERROR; + + return (inflateReset(&png_ptr->zstream)); +} +#endif /* PNG_READ_SUPPORTED */ + +/* This function was added to libpng-1.0.7 */ +png_uint_32 PNGAPI +png_access_version_number(void) +{ + /* Version of *.c files used when building libpng */ + return((png_uint_32)PNG_LIBPNG_VER); +} + + + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +# ifdef PNG_SIZE_T +/* Added at libpng version 1.2.6 */ + PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); +png_size_t PNGAPI +png_convert_size(size_t size) +{ + if (size > (png_size_t)-1) + PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */ + + return ((png_size_t)size); +} +# endif /* PNG_SIZE_T */ + +/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */ +# ifdef PNG_CHECK_cHRM_SUPPORTED + +int /* PRIVATE */ +png_check_cHRM_fixed(png_structp png_ptr, + png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, + png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, + png_fixed_point blue_x, png_fixed_point blue_y) +{ + int ret = 1; + unsigned long xy_hi,xy_lo,yx_hi,yx_lo; + + png_debug(1, "in function png_check_cHRM_fixed"); + + if (png_ptr == NULL) + return 0; + + if (white_x < 0 || white_y <= 0 || + red_x < 0 || red_y < 0 || + green_x < 0 || green_y < 0 || + blue_x < 0 || blue_y < 0) + { + png_warning(png_ptr, + "Ignoring attempt to set negative chromaticity value"); + ret = 0; + } + if (white_x > (png_fixed_point)PNG_UINT_31_MAX || + white_y > (png_fixed_point)PNG_UINT_31_MAX || + red_x > (png_fixed_point)PNG_UINT_31_MAX || + red_y > (png_fixed_point)PNG_UINT_31_MAX || + green_x > (png_fixed_point)PNG_UINT_31_MAX || + green_y > (png_fixed_point)PNG_UINT_31_MAX || + blue_x > (png_fixed_point)PNG_UINT_31_MAX || + blue_y > (png_fixed_point)PNG_UINT_31_MAX ) + { + png_warning(png_ptr, + "Ignoring attempt to set chromaticity value exceeding 21474.83"); + ret = 0; + } + if (white_x > 100000L - white_y) + { + png_warning(png_ptr, "Invalid cHRM white point"); + ret = 0; + } + + if (red_x > 100000L - red_y) + { + png_warning(png_ptr, "Invalid cHRM red point"); + ret = 0; + } + + if (green_x > 100000L - green_y) + { + png_warning(png_ptr, "Invalid cHRM green point"); + ret = 0; + } + + if (blue_x > 100000L - blue_y) + { + png_warning(png_ptr, "Invalid cHRM blue point"); + ret = 0; + } + + png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo); + png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo); + + if (xy_hi == yx_hi && xy_lo == yx_lo) + { + png_warning(png_ptr, + "Ignoring attempt to set cHRM RGB triangle with zero area"); + ret = 0; + } + + return ret; +} +# endif /* PNG_CHECK_cHRM_SUPPORTED */ + +void /* PRIVATE */ +png_check_IHDR(png_structp png_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_type, int compression_type, + int filter_type) +{ + int error = 0; + + /* Check for width and height valid values */ + if (width == 0) + { + png_warning(png_ptr, "Image width is zero in IHDR"); + error = 1; + } + + if (height == 0) + { + png_warning(png_ptr, "Image height is zero in IHDR"); + error = 1; + } + +# ifdef PNG_SET_USER_LIMITS_SUPPORTED + if (width > png_ptr->user_width_max || width > PNG_USER_WIDTH_MAX) + +# else + if (width > PNG_USER_WIDTH_MAX) +# endif + { + png_warning(png_ptr, "Image width exceeds user limit in IHDR"); + error = 1; + } + +# ifdef PNG_SET_USER_LIMITS_SUPPORTED + if (height > png_ptr->user_height_max || height > PNG_USER_HEIGHT_MAX) +# else + if (height > PNG_USER_HEIGHT_MAX) +# endif + { + png_warning(png_ptr, "Image height exceeds user limit in IHDR"); + error = 1; + } + + if (width > PNG_UINT_31_MAX) + { + png_warning(png_ptr, "Invalid image width in IHDR"); + error = 1; + } + + if (height > PNG_UINT_31_MAX) + { + png_warning(png_ptr, "Invalid image height in IHDR"); + error = 1; + } + + if (width > (PNG_UINT_32_MAX + >> 3) /* 8-byte RGBA pixels */ + - 48 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ + png_warning(png_ptr, "Width is too large for libpng to process pixels"); + + /* Check other values */ + if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && + bit_depth != 8 && bit_depth != 16) + { + png_warning(png_ptr, "Invalid bit depth in IHDR"); + error = 1; + } + + if (color_type < 0 || color_type == 1 || + color_type == 5 || color_type > 6) + { + png_warning(png_ptr, "Invalid color type in IHDR"); + error = 1; + } + + if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) || + ((color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8)) + { + png_warning(png_ptr, "Invalid color type/bit depth combination in IHDR"); + error = 1; + } + + if (interlace_type >= PNG_INTERLACE_LAST) + { + png_warning(png_ptr, "Unknown interlace method in IHDR"); + error = 1; + } + + if (compression_type != PNG_COMPRESSION_TYPE_BASE) + { + png_warning(png_ptr, "Unknown compression method in IHDR"); + error = 1; + } + +# ifdef PNG_MNG_FEATURES_SUPPORTED + /* Accept filter_method 64 (intrapixel differencing) only if + * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and + * 2. Libpng did not read a PNG signature (this filter_method is only + * used in PNG datastreams that are embedded in MNG datastreams) and + * 3. The application called png_permit_mng_features with a mask that + * included PNG_FLAG_MNG_FILTER_64 and + * 4. The filter_method is 64 and + * 5. The color_type is RGB or RGBA + */ + if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) && + png_ptr->mng_features_permitted) + png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); + + if (filter_type != PNG_FILTER_TYPE_BASE) + { + if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && + ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) && + (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA))) + { + png_warning(png_ptr, "Unknown filter method in IHDR"); + error = 1; + } + + if (png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) + { + png_warning(png_ptr, "Invalid filter method in IHDR"); + error = 1; + } + } + +# else + if (filter_type != PNG_FILTER_TYPE_BASE) + { + png_warning(png_ptr, "Unknown filter method in IHDR"); + error = 1; + } +# endif + + if (error == 1) + png_error(png_ptr, "Invalid IHDR data"); +} + +#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) +/* ASCII to fp functions */ +/* Check an ASCII formated floating point value, see the more detailed + * comments in pngpriv.h + */ +/* The following is used internally to preserve the 'valid' flag */ +#define png_fp_add(state, flags) ((state) |= (flags)) +#define png_fp_set(state, value)\ + ((state) = (value) | ((state) & PNG_FP_WAS_VALID)) + +/* Internal type codes: bits above the base state! */ +#define PNG_FP_SIGN 0 /* [+-] */ +#define PNG_FP_DOT 4 /* . */ +#define PNG_FP_DIGIT 8 /* [0123456789] */ +#define PNG_FP_E 12 /* [Ee] */ + +int /* PRIVATE */ +png_check_fp_number(png_const_charp string, png_size_t size, int *statep, + png_size_tp whereami) +{ + int state = *statep; + png_size_t i = *whereami; + + while (i < size) + { + int type; + /* First find the type of the next character */ + { + char ch = string[i]; + + if (ch >= 48 && ch <= 57) + type = PNG_FP_DIGIT; + + else switch (ch) + { + case 43: case 45: type = PNG_FP_SIGN; break; + case 46: type = PNG_FP_DOT; break; + case 69: case 101: type = PNG_FP_E; break; + default: goto PNG_FP_End; + } + } + + /* Now deal with this type according to the current + * state, the type is arranged to not overlap the + * bits of the PNG_FP_STATE. + */ + switch ((state & PNG_FP_STATE) + type) + { + case PNG_FP_INTEGER + PNG_FP_SIGN: + if (state & PNG_FP_SAW_ANY) + goto PNG_FP_End; /* not a part of the number */ + + png_fp_add(state, PNG_FP_SAW_SIGN); + break; + + case PNG_FP_INTEGER + PNG_FP_DOT: + /* Ok as trailer, ok as lead of fraction. */ + if (state & PNG_FP_SAW_DOT) /* two dots */ + goto PNG_FP_End; + + else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */ + png_fp_add(state, PNG_FP_SAW_DOT); + + else + png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT); + + break; + + case PNG_FP_INTEGER + PNG_FP_DIGIT: + if (state & PNG_FP_SAW_DOT) /* delayed fraction */ + png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT); + + png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID); + + break; + case PNG_FP_INTEGER + PNG_FP_E: + if ((state & PNG_FP_SAW_DIGIT) == 0) + goto PNG_FP_End; + + png_fp_set(state, PNG_FP_EXPONENT); + + break; + + /* case PNG_FP_FRACTION + PNG_FP_SIGN: + goto PNG_FP_End; ** no sign in exponent */ + + /* case PNG_FP_FRACTION + PNG_FP_DOT: + goto PNG_FP_End; ** Because SAW_DOT is always set */ + + case PNG_FP_FRACTION + PNG_FP_DIGIT: + png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID); + break; + + case PNG_FP_FRACTION + PNG_FP_E: + /* This is correct because the trailing '.' on an + * integer is handled above - so we can only get here + * with the sequence ".E" (with no preceding digits). + */ + if ((state & PNG_FP_SAW_DIGIT) == 0) + goto PNG_FP_End; + + png_fp_set(state, PNG_FP_EXPONENT); + + break; + + case PNG_FP_EXPONENT + PNG_FP_SIGN: + if (state & PNG_FP_SAW_ANY) + goto PNG_FP_End; /* not a part of the number */ + + png_fp_add(state, PNG_FP_SAW_SIGN); + + break; + + /* case PNG_FP_EXPONENT + PNG_FP_DOT: + goto PNG_FP_End; */ + + case PNG_FP_EXPONENT + PNG_FP_DIGIT: + png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID); + + break; + + /* case PNG_FP_EXPONEXT + PNG_FP_E: + goto PNG_FP_End; */ + + default: goto PNG_FP_End; /* I.e. break 2 */ + } + + /* The character seems ok, continue. */ + ++i; + } + +PNG_FP_End: + /* Here at the end, update the state and return the correct + * return code. + */ + *statep = state; + *whereami = i; + + return (state & PNG_FP_SAW_DIGIT) != 0; +} + + +/* The same but for a complete string. */ +int +png_check_fp_string(png_const_charp string, png_size_t size) +{ + int state=0; + png_size_t char_index=0; + + return png_check_fp_number(string, size, &state, &char_index) && + (char_index == size || string[char_index] == 0); +} +#endif /* pCAL or sCAL */ + +#ifdef PNG_READ_sCAL_SUPPORTED +# ifdef PNG_FLOATING_POINT_SUPPORTED +/* Utility used below - a simple accurate power of ten from an integral + * exponent. + */ +static double +png_pow10(int power) +{ + int recip = 0; + double d = 1; + + /* Handle negative exponent with a reciprocal at the end because + * 10 is exact whereas .1 is inexact in base 2 + */ + if (power < 0) + { + if (power < DBL_MIN_10_EXP) return 0; + recip = 1, power = -power; + } + + if (power > 0) + { + /* Decompose power bitwise. */ + double mult = 10; + do + { + if (power & 1) d *= mult; + mult *= mult; + power >>= 1; + } + while (power > 0); + + if (recip) d = 1/d; + } + /* else power is 0 and d is 1 */ + + return d; +} + +/* Function to format a floating point value in ASCII with a given + * precision. + */ +void /* PRIVATE */ +png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, + double fp, unsigned int precision) +{ + /* We use standard functions from math.h, but not printf because + * that would require stdio. The caller must supply a buffer of + * sufficient size or we will png_error. The tests on size and + * the space in ascii[] consumed are indicated below. + */ + if (precision < 1) + precision = DBL_DIG; + + /* Enforce the limit of the implementation precision too. */ + if (precision > DBL_DIG+1) + precision = DBL_DIG+1; + + /* Basic sanity checks */ + if (size >= precision+5) /* See the requirements below. */ + { + if (fp < 0) + { + fp = -fp; + *ascii++ = 45; /* '-' PLUS 1 TOTAL 1*/ + --size; + } + + if (fp >= DBL_MIN && fp <= DBL_MAX) + { + int exp_b10; /* A base 10 exponent */ + double base; /* 10^exp_b10 */ + + /* First extract a base 10 exponent of the number, + * the calculation below rounds down when converting + * from base 2 to base 10 (multiply by log10(2) - + * 0.3010, but 77/256 is 0.3008, so exp_b10 needs to + * be increased. Note that the arithmetic shift + * performs a floor() unlike C arithmetic - using a + * C multiply would break the following for negative + * exponents. + */ + (void)frexp(fp, &exp_b10); /* exponent to base 2 */ + + exp_b10 = (exp_b10 * 77) >> 8; /* <= exponent to base 10 */ + + /* Avoid underflow here. */ + base = png_pow10(exp_b10); /* May underflow */ + + while (base < DBL_MIN || base < fp) + { + /* And this may overflow. */ + double test = png_pow10(exp_b10+1); + + if (test <= DBL_MAX) + ++exp_b10, base = test; + + else + break; + } + + /* Normalize fp and correct exp_b10, after this fp is in the + * range [.1,1) and exp_b10 is both the exponent and the digit + * *before* which the decimal point should be inserted + * (starting with 0 for the first digit). Note that this + * works even if 10^exp_b10 is out of range because of the + * test on DBL_MAX above. + */ + fp /= base; + while (fp >= 1) fp /= 10, ++exp_b10; + + /* Because of the code above fp may, at this point, be + * less than .1, this is ok because the code below can + * handle the leading zeros this generates, so no attempt + * is made to correct that here. + */ + + { + int czero, clead, cdigits; + char exponent[10]; + + /* Allow up to two leading zeros - this will not lengthen + * the number compared to using E-n. + */ + if (exp_b10 < 0 && exp_b10 > -3) /* PLUS 3 TOTAL 4 */ + { + czero = -exp_b10; /* PLUS 2 digits: TOTAL 3 */ + exp_b10 = 0; /* Dot added below before first output. */ + } + else + czero = 0; /* No zeros to add */ + + /* Generate the digit list, stripping trailing zeros and + * inserting a '.' before a digit if the exponent is 0. + */ + clead = czero; /* Count of leading zeros */ + cdigits = 0; /* Count of digits in list. */ + + do + { + double d; + + fp *= 10; + /* Use modf here, not floor and subtract, so that + * the separation is done in one step. At the end + * of the loop don't break the number into parts so + * that the final digit is rounded. + */ + if (cdigits+czero-clead+1 < (int)precision) + fp = modf(fp, &d); + + else + { + d = floor(fp + .5); + + if (d > 9) + { + /* Rounding up to 10, handle that here. */ + if (czero > 0) + { + --czero, d = 1; + if (cdigits == 0) --clead; + } + else + { + while (cdigits > 0 && d > 9) + { + int ch = *--ascii; + + if (exp_b10 != (-1)) + ++exp_b10; + + else if (ch == 46) + { + ch = *--ascii, ++size; + /* Advance exp_b10 to '1', so that the + * decimal point happens after the + * previous digit. + */ + exp_b10 = 1; + } + + --cdigits; + d = ch - 47; /* I.e. 1+(ch-48) */ + } + + /* Did we reach the beginning? If so adjust the + * exponent but take into account the leading + * decimal point. + */ + if (d > 9) /* cdigits == 0 */ + { + if (exp_b10 == (-1)) + { + /* Leading decimal point (plus zeros?), if + * we lose the decimal point here it must + * be reentered below. + */ + int ch = *--ascii; + + if (ch == 46) + ++size, exp_b10 = 1; + + /* Else lost a leading zero, so 'exp_b10' is + * still ok at (-1) + */ + } + else + ++exp_b10; + + /* In all cases we output a '1' */ + d = 1; + } + } + } + fp = 0; /* Guarantees termination below. */ + } + + if (d == 0) + { + ++czero; + if (cdigits == 0) ++clead; + } + else + { + /* Included embedded zeros in the digit count. */ + cdigits += czero - clead; + clead = 0; + + while (czero > 0) + { + /* exp_b10 == (-1) means we just output the decimal + * place - after the DP don't adjust 'exp_b10' any + * more! + */ + if (exp_b10 != (-1)) + { + if (exp_b10 == 0) *ascii++ = 46, --size; + /* PLUS 1: TOTAL 4 */ + --exp_b10; + } + *ascii++ = 48, --czero; + } + + if (exp_b10 != (-1)) + { + if (exp_b10 == 0) *ascii++ = 46, --size; /* counted + above */ + --exp_b10; + } + *ascii++ = (char)(48 + (int)d), ++cdigits; + } + } + while (cdigits+czero-clead < (int)precision && fp > DBL_MIN); + + /* The total output count (max) is now 4+precision */ + + /* Check for an exponent, if we don't need one we are + * done and just need to terminate the string. At + * this point exp_b10==(-1) is effectively if flag - it got + * to '-1' because of the decrement after outputing + * the decimal point above (the exponent required is + * *not* -1!) + */ + if (exp_b10 >= (-1) && exp_b10 <= 2) + { + /* The following only happens if we didn't output the + * leading zeros above for negative exponent, so this + * doest add to the digit requirement. Note that the + * two zeros here can only be output if the two leading + * zeros were *not* output, so this doesn't increase + * the output count. + */ + while (--exp_b10 >= 0) *ascii++ = 48; + + *ascii = 0; + + /* Total buffer requirement (including the '\0') is + * 5+precision - see check at the start. + */ + return; + } + + /* Here if an exponent is required, adjust size for + * the digits we output but did not count. The total + * digit output here so far is at most 1+precision - no + * decimal point and no leading or trailing zeros have + * been output. + */ + size -= cdigits; + + *ascii++ = 69, --size; /* 'E': PLUS 1 TOTAL 2+precision*/ + if (exp_b10 < 0) + { + *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */ + exp_b10 = -exp_b10; + } + + cdigits = 0; + + while (exp_b10 > 0) + { + exponent[cdigits++] = (char)(48 + exp_b10 % 10); + exp_b10 /= 10; + } + + /* Need another size check here for the exponent digits, so + * this need not be considered above. + */ + if ((int)size > cdigits) + { + while (cdigits > 0) *ascii++ = exponent[--cdigits]; + + *ascii = 0; + + return; + } + } + } + else if (!(fp >= DBL_MIN)) + { + *ascii++ = 48; /* '0' */ + *ascii = 0; + return; + } + else + { + *ascii++ = 105; /* 'i' */ + *ascii++ = 110; /* 'n' */ + *ascii++ = 102; /* 'f' */ + *ascii = 0; + return; + } + } + + /* Here on buffer too small. */ + png_error(png_ptr, "ASCII conversion buffer too small"); +} + +# endif /* FLOATING_POINT */ + +# ifdef PNG_FIXED_POINT_SUPPORTED +/* Function to format a fixed point value in ASCII. + */ +void /* PRIVATE */ +png_ascii_from_fixed(png_structp png_ptr, png_charp ascii, png_size_t size, + png_fixed_point fp) +{ + /* Require space for 10 decimal digits, a decimal point, a minus sign and a + * trailing \0, 13 characters: + */ + if (size > 12) + { + png_uint_32 num; + + /* Avoid overflow here on the minimum integer. */ + if (fp < 0) + *ascii++ = 45, --size, num = -fp; + else + num = fp; + + if (num <= 0x80000000U) /* else overflowed */ + { + unsigned int ndigits = 0, first = 16/*flag value*/; + char digits[10]; + + while (num) + { + /* Split the low digit off num: */ + unsigned int tmp = num/10; + num -= tmp*10; + digits[ndigits++] = (char)(48 + num); + /* Record the first non-zero digit, note that this is a number + * starting at 1, it's not actually the array index. + */ + if (first == 16 && num > 0) + first = ndigits; + num = tmp; + } + + if (ndigits > 0) + { + while (ndigits > 5) *ascii++ = digits[--ndigits]; + /* The remaining digits are fractional digits, ndigits is '5' or + * smaller at this point. It is certainly not zero. Check for a + * non-zero fractional digit: + */ + if (first <= 5) + { + unsigned int i; + *ascii++ = 46; /* decimal point */ + /* ndigits may be <5 for small numbers, output leading zeros + * then ndigits digits to first: + */ + i = 5; + while (ndigits < i) *ascii++ = 48, --i; + while (ndigits >= first) *ascii++ = digits[--ndigits]; + /* Don't output the trailing zeros! */ + } + } + else + *ascii++ = 48; + + /* And null terminate the string: */ + *ascii = 0; + return; + } + } + + /* Here on buffer too small. */ + png_error(png_ptr, "ASCII conversion buffer too small"); +} +# endif /* FIXED_POINT */ +#endif /* READ_SCAL */ + +#if defined(PNG_FLOATING_POINT_SUPPORTED) && \ + !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) +png_fixed_point +png_fixed(png_structp png_ptr, double fp, png_const_charp text) +{ + double r = floor(100000 * fp + .5); + + if (r > 2147483647. || r < -2147483648.) + png_fixed_error(png_ptr, text); + + return (png_fixed_point)r; +} +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || \ + defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG__READ_pHYs_SUPPORTED) +/* muldiv functions */ +/* This API takes signed arguments and rounds the result to the nearest + * integer (or, for a fixed point number - the standard argument - to + * the nearest .00001). Overflow and divide by zero are signalled in + * the result, a boolean - true on success, false on overflow. + */ +int +png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times, + png_int_32 divisor) +{ + /* Return a * times / divisor, rounded. */ + if (divisor != 0) + { + if (a == 0 || times == 0) + { + *res = 0; + return 1; + } + else + { +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = a; + r *= times; + r /= divisor; + r = floor(r+.5); + + /* A png_fixed_point is a 32 bit integer. */ + if (r <= 2147483647. && r >= -2147483648.) + { + *res = (png_fixed_point)r; + return 1; + } +#else + int negative = 0; + png_uint_32 A, T, D; + png_uint_32 s16, s32, s00; + + if (a < 0) + negative = 1, A = -a; + else + A = a; + + if (times < 0) + negative = !negative, T = -times; + else + T = times; + + if (divisor < 0) + negative = !negative, D = -divisor; + else + D = divisor; + + /* Following can't overflow because the arguments only + * have 31 bits each, however the result may be 32 bits. + */ + s16 = (A >> 16) * (T & 0xffff) + + (A & 0xffff) * (T >> 16); + /* Can't overflow because the a*times bit is only 30 + * bits at most. + */ + s32 = (A >> 16) * (T >> 16) + (s16 >> 16); + s00 = (A & 0xffff) * (T & 0xffff); + + s16 = (s16 & 0xffff) << 16; + s00 += s16; + + if (s00 < s16) + ++s32; /* carry */ + + if (s32 < D) /* else overflow */ + { + /* s32.s00 is now the 64 bit product, do a standard + * division, we know that s32 < D, so the maximum + * required shift is 31. + */ + int bitshift = 32; + png_fixed_point result = 0; /* NOTE: signed */ + + while (--bitshift >= 0) + { + png_uint_32 d32, d00; + + if (bitshift > 0) + d32 = D >> (32-bitshift), d00 = D << bitshift; + + else + d32 = 0, d00 = D; + + if (s32 > d32) + { + if (s00 < d00) --s32; /* carry */ + s32 -= d32, s00 -= d00, result += 1<= d00) + s32 = 0, s00 -= d00, result += 1<= (D >> 1)) + ++result; + + if (negative) + result = -result; + + /* Check for overflow. */ + if ((negative && result <= 0) || (!negative && result >= 0)) + { + *res = result; + return 1; + } + } +#endif + } + } + + return 0; +} +#endif /* READ_GAMMA || INCH_CONVERSIONS */ + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED) +/* The following is for when the caller doesn't much care about the + * result. + */ +png_fixed_point +png_muldiv_warn(png_structp png_ptr, png_fixed_point a, png_int_32 times, + png_int_32 divisor) +{ + png_fixed_point result; + + if (png_muldiv(&result, a, times, divisor)) + return result; + + png_warning(png_ptr, "fixed point overflow ignored"); + return 0; +} +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gammma */ +/* Calculate a reciprocal, return 0 on div-by-zero or overflow. */ +png_fixed_point +png_reciprocal(png_fixed_point a) +{ +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = floor(1E10/a+.5); + + if (r <= 2147483647. && r >= -2147483648.) + return (png_fixed_point)r; +#else + png_fixed_point res; + + if (png_muldiv(&res, 100000, 100000, a)) + return res; +#endif + + return 0; /* error/overflow */ +} + +/* A local convenience routine. */ +static png_fixed_point +png_product2(png_fixed_point a, png_fixed_point b) +{ + /* The required result is 1/a * 1/b; the following preserves accuracy. */ +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = a * 1E-5; + r *= b; + r = floor(r+.5); + + if (r <= 2147483647. && r >= -2147483648.) + return (png_fixed_point)r; +#else + png_fixed_point res; + + if (png_muldiv(&res, a, b, 100000)) + return res; +#endif + + return 0; /* overflow */ +} + +/* The inverse of the above. */ +png_fixed_point +png_reciprocal2(png_fixed_point a, png_fixed_point b) +{ + /* The required result is 1/a * 1/b; the following preserves accuracy. */ +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = 1E15/a; + r /= b; + r = floor(r+.5); + + if (r <= 2147483647. && r >= -2147483648.) + return (png_fixed_point)r; +#else + /* This may overflow because the range of png_fixed_point isn't symmetric, + * but this API is only used for the product of file and screen gamma so it + * doesn't matter that the smallest number it can produce is 1/21474, not + * 1/100000 + */ + png_fixed_point res = png_product2(a, b); + + if (res != 0) + return png_reciprocal(res); +#endif + + return 0; /* overflow */ +} +#endif /* READ_GAMMA */ + +#ifdef PNG_CHECK_cHRM_SUPPORTED +/* Added at libpng version 1.2.34 (Dec 8, 2008) and 1.4.0 (Jan 2, + * 2010: moved from pngset.c) */ +/* + * Multiply two 32-bit numbers, V1 and V2, using 32-bit + * arithmetic, to produce a 64 bit result in the HI/LO words. + * + * A B + * x C D + * ------ + * AD || BD + * AC || CB || 0 + * + * where A and B are the high and low 16-bit words of V1, + * C and D are the 16-bit words of V2, AD is the product of + * A and D, and X || Y is (X << 16) + Y. +*/ + +void /* PRIVATE */ +png_64bit_product (long v1, long v2, unsigned long *hi_product, + unsigned long *lo_product) +{ + int a, b, c, d; + long lo, hi, x, y; + + a = (v1 >> 16) & 0xffff; + b = v1 & 0xffff; + c = (v2 >> 16) & 0xffff; + d = v2 & 0xffff; + + lo = b * d; /* BD */ + x = a * d + c * b; /* AD + CB */ + y = ((lo >> 16) & 0xffff) + x; + + lo = (lo & 0xffff) | ((y & 0xffff) << 16); + hi = (y >> 16) & 0xffff; + + hi += a * c; /* AC */ + + *hi_product = (unsigned long)hi; + *lo_product = (unsigned long)lo; +} +#endif /* CHECK_cHRM */ + +#ifdef PNG_READ_GAMMA_SUPPORTED /* gamma table code */ +#ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED +/* Fixed point gamma. + * + * To calculate gamma this code implements fast log() and exp() calls using only + * fixed point arithmetic. This code has sufficient precision for either 8 or + * 16 bit sample values. + * + * The tables used here were calculated using simple 'bc' programs, but C double + * precision floating point arithmetic would work fine. The programs are given + * at the head of each table. + * + * 8 bit log table + * This is a table of -log(value/255)/log(2) for 'value' in the range 128 to + * 255, so it's the base 2 logarithm of a normalized 8 bit floating point + * mantissa. The numbers are 32 bit fractions. + */ +static png_uint_32 +png_8bit_l2[128] = +{ +# if PNG_DO_BC + for (i=128;i<256;++i) { .5 - l(i/255)/l(2)*65536*65536; } +# endif + 4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U, + 3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U, + 3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U, + 3455425220U, 3413129301U, 3371120137U, 3329393864U, 3287946700U, 3246774933U, + 3205874930U, 3165243125U, 3124876025U, 3084770202U, 3044922296U, 3005329011U, + 2965987113U, 2926893432U, 2888044853U, 2849438323U, 2811070844U, 2772939474U, + 2735041326U, 2697373562U, 2659933400U, 2622718104U, 2585724991U, 2548951424U, + 2512394810U, 2476052606U, 2439922311U, 2404001468U, 2368287663U, 2332778523U, + 2297471715U, 2262364947U, 2227455964U, 2192742551U, 2158222529U, 2123893754U, + 2089754119U, 2055801552U, 2022034013U, 1988449497U, 1955046031U, 1921821672U, + 1888774511U, 1855902668U, 1823204291U, 1790677560U, 1758320682U, 1726131893U, + 1694109454U, 1662251657U, 1630556815U, 1599023271U, 1567649391U, 1536433567U, + 1505374214U, 1474469770U, 1443718700U, 1413119487U, 1382670639U, 1352370686U, + 1322218179U, 1292211689U, 1262349810U, 1232631153U, 1203054352U, 1173618059U, + 1144320946U, 1115161701U, 1086139034U, 1057251672U, 1028498358U, 999877854U, + 971388940U, 943030410U, 914801076U, 886699767U, 858725327U, 830876614U, + 803152505U, 775551890U, 748073672U, 720716771U, 693480120U, 666362667U, + 639363374U, 612481215U, 585715177U, 559064263U, 532527486U, 506103872U, + 479792461U, 453592303U, 427502463U, 401522014U, 375650043U, 349885648U, + 324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U, + 172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U, + 24347096U, 0U +#if 0 + /* The following are the values for 16 bit tables - these work fine for the 8 + * bit conversions but produce very slightly larger errors in the 16 bit log + * (about 1.2 as opposed to 0.7 absolute error in the final value). To use + * these all the shifts below must be adjusted appropriately. + */ + 65166, 64430, 63700, 62976, 62257, 61543, 60835, 60132, 59434, 58741, 58054, + 57371, 56693, 56020, 55352, 54689, 54030, 53375, 52726, 52080, 51439, 50803, + 50170, 49542, 48918, 48298, 47682, 47070, 46462, 45858, 45257, 44661, 44068, + 43479, 42894, 42312, 41733, 41159, 40587, 40020, 39455, 38894, 38336, 37782, + 37230, 36682, 36137, 35595, 35057, 34521, 33988, 33459, 32932, 32408, 31887, + 31369, 30854, 30341, 29832, 29325, 28820, 28319, 27820, 27324, 26830, 26339, + 25850, 25364, 24880, 24399, 23920, 23444, 22970, 22499, 22029, 21562, 21098, + 20636, 20175, 19718, 19262, 18808, 18357, 17908, 17461, 17016, 16573, 16132, + 15694, 15257, 14822, 14390, 13959, 13530, 13103, 12678, 12255, 11834, 11415, + 10997, 10582, 10168, 9756, 9346, 8937, 8531, 8126, 7723, 7321, 6921, 6523, + 6127, 5732, 5339, 4947, 4557, 4169, 3782, 3397, 3014, 2632, 2251, 1872, 1495, + 1119, 744, 372 +#endif +}; + +static png_int_32 +png_log8bit(unsigned int x) +{ + unsigned int lg2 = 0; + /* Each time 'x' is multiplied by 2, 1 must be subtracted off the final log, + * because the log is actually negate that means adding 1. The final + * returned value thus has the range 0 (for 255 input) to 7.994 (for 1 + * input), return 7.99998 for the overflow (log 0) case - so the result is + * always at most 19 bits. + */ + if ((x &= 0xff) == 0) + return 0xffffffff; + + if ((x & 0xf0) == 0) + lg2 = 4, x <<= 4; + + if ((x & 0xc0) == 0) + lg2 += 2, x <<= 2; + + if ((x & 0x80) == 0) + lg2 += 1, x <<= 1; + + /* result is at most 19 bits, so this cast is safe: */ + return (png_int_32)((lg2 << 16) + ((png_8bit_l2[x-128]+32768)>>16)); +} + +/* The above gives exact (to 16 binary places) log2 values for 8 bit images, + * for 16 bit images we use the most significant 8 bits of the 16 bit value to + * get an approximation then multiply the approximation by a correction factor + * determined by the remaining up to 8 bits. This requires an additional step + * in the 16 bit case. + * + * We want log2(value/65535), we have log2(v'/255), where: + * + * value = v' * 256 + v'' + * = v' * f + * + * So f is value/v', which is equal to (256+v''/v') since v' is in the range 128 + * to 255 and v'' is in the range 0 to 255 f will be in the range 256 to less + * than 258. The final factor also needs to correct for the fact that our 8 bit + * value is scaled by 255, whereas the 16 bit values must be scaled by 65535. + * + * This gives a final formula using a calculated value 'x' which is value/v' and + * scaling by 65536 to match the above table: + * + * log2(x/257) * 65536 + * + * Since these numbers are so close to '1' we can use simple linear + * interpolation between the two end values 256/257 (result -368.61) and 258/257 + * (result 367.179). The values used below are scaled by a further 64 to give + * 16 bit precision in the interpolation: + * + * Start (256): -23591 + * Zero (257): 0 + * End (258): 23499 + */ +static png_int_32 +png_log16bit(png_uint_32 x) +{ + unsigned int lg2 = 0; + + /* As above, but now the input has 16 bits. */ + if ((x &= 0xffff) == 0) + return 0xffffffff; + + if ((x & 0xff00) == 0) + lg2 = 8, x <<= 8; + + if ((x & 0xf000) == 0) + lg2 += 4, x <<= 4; + + if ((x & 0xc000) == 0) + lg2 += 2, x <<= 2; + + if ((x & 0x8000) == 0) + lg2 += 1, x <<= 1; + + /* Calculate the base logarithm from the top 8 bits as a 28 bit fractional + * value. + */ + lg2 <<= 28; + lg2 += (png_8bit_l2[(x>>8)-128]+8) >> 4; + + /* Now we need to interpolate the factor, this requires a division by the top + * 8 bits. Do this with maximum precision. + */ + x = ((x << 16) + (x >> 9)) / (x >> 8); + + /* Since we divided by the top 8 bits of 'x' there will be a '1' at 1<<24, + * the value at 1<<16 (ignoring this) will be 0 or 1; this gives us exactly + * 16 bits to interpolate to get the low bits of the result. Round the + * answer. Note that the end point values are scaled by 64 to retain overall + * precision and that 'lg2' is current scaled by an extra 12 bits, so adjust + * the overall scaling by 6-12. Round at every step. + */ + x -= 1U << 24; + + if (x <= 65536U) /* <= '257' */ + lg2 += ((23591U * (65536U-x)) + (1U << (16+6-12-1))) >> (16+6-12); + + else + lg2 -= ((23499U * (x-65536U)) + (1U << (16+6-12-1))) >> (16+6-12); + + /* Safe, because the result can't have more than 20 bits: */ + return (png_int_32)((lg2 + 2048) >> 12); +} + +/* The 'exp()' case must invert the above, taking a 20 bit fixed point + * logarithmic value and returning a 16 or 8 bit number as appropriate. In + * each case only the low 16 bits are relevant - the fraction - since the + * integer bits (the top 4) simply determine a shift. + * + * The worst case is the 16 bit distinction between 65535 and 65534, this + * requires perhaps spurious accuracty in the decoding of the logarithm to + * distinguish log2(65535/65534.5) - 10^-5 or 17 bits. There is little chance + * of getting this accuracy in practice. + * + * To deal with this the following exp() function works out the exponent of the + * frational part of the logarithm by using an accurate 32 bit value from the + * top four fractional bits then multiplying in the remaining bits. + */ +static png_uint_32 +png_32bit_exp[16] = +{ +# if PNG_DO_BC + for (i=0;i<16;++i) { .5 + e(-i/16*l(2))*2^32; } +# endif + /* NOTE: the first entry is deliberately set to the maximum 32 bit value. */ + 4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U, + 3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U, + 2553802834U, 2445529972U, 2341847524U, 2242560872U +}; + +/* Adjustment table; provided to explain the numbers in the code below. */ +#if PNG_DO_BC +for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"} + 11 44937.64284865548751208448 + 10 45180.98734845585101160448 + 9 45303.31936980687359311872 + 8 45364.65110595323018870784 + 7 45395.35850361789624614912 + 6 45410.72259715102037508096 + 5 45418.40724413220722311168 + 4 45422.25021786898173001728 + 3 45424.17186732298419044352 + 2 45425.13273269940811464704 + 1 45425.61317555035558641664 + 0 45425.85339951654943850496 +#endif + +static png_uint_32 +png_exp(png_fixed_point x) +{ + if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */ + { + /* Obtain a 4 bit approximation */ + png_uint_32 e = png_32bit_exp[(x >> 12) & 0xf]; + + /* Incorporate the low 12 bits - these decrease the returned value by + * multiplying by a number less than 1 if the bit is set. The multiplier + * is determined by the above table and the shift. Notice that the values + * converge on 45426 and this is used to allow linear interpolation of the + * low bits. + */ + if (x & 0x800) + e -= (((e >> 16) * 44938U) + 16U) >> 5; + + if (x & 0x400) + e -= (((e >> 16) * 45181U) + 32U) >> 6; + + if (x & 0x200) + e -= (((e >> 16) * 45303U) + 64U) >> 7; + + if (x & 0x100) + e -= (((e >> 16) * 45365U) + 128U) >> 8; + + if (x & 0x080) + e -= (((e >> 16) * 45395U) + 256U) >> 9; + + if (x & 0x040) + e -= (((e >> 16) * 45410U) + 512U) >> 10; + + /* And handle the low 6 bits in a single block. */ + e -= (((e >> 16) * 355U * (x & 0x3fU)) + 256U) >> 9; + + /* Handle the upper bits of x. */ + e >>= x >> 16; + return e; + } + + /* Check for overflow */ + if (x <= 0) + return png_32bit_exp[0]; + + /* Else underflow */ + return 0; +} + +static png_byte +png_exp8bit(png_fixed_point lg2) +{ + /* Get a 32 bit value: */ + png_uint_32 x = png_exp(lg2); + + /* Convert the 32 bit value to 0..255 by multiplying by 256-1, note that the + * second, rounding, step can't overflow because of the first, subtraction, + * step. + */ + x -= x >> 8; + return (png_byte)((x + 0x7fffffU) >> 24); +} + +static png_uint_16 +png_exp16bit(png_fixed_point lg2) +{ + /* Get a 32 bit value: */ + png_uint_32 x = png_exp(lg2); + + /* Convert the 32 bit value to 0..65535 by multiplying by 65536-1: */ + x -= x >> 16; + return (png_uint_16)((x + 32767U) >> 16); +} +#endif /* FLOATING_ARITHMETIC */ + +png_byte +png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val) +{ + if (value > 0 && value < 255) + { +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = floor(255*pow(value/255.,gamma_val*.00001)+.5); + return (png_byte)r; +# else + png_int_32 lg2 = png_log8bit(value); + png_fixed_point res; + + if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1)) + return png_exp8bit(res); + + /* Overflow. */ + value = 0; +# endif + } + + return (png_byte)value; +} + +png_uint_16 +png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val) +{ + if (value > 0 && value < 65535) + { +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + double r = floor(65535*pow(value/65535.,gamma_val*.00001)+.5); + return (png_uint_16)r; +# else + png_int_32 lg2 = png_log16bit(value); + png_fixed_point res; + + if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1)) + return png_exp16bit(res); + + /* Overflow. */ + value = 0; +# endif + } + + return (png_uint_16)value; +} + +/* This does the right thing based on the bit_depth field of the + * png_struct, interpreting values as 8 or 16 bit. While the result + * is nominally a 16 bit value if bit depth is 8 then the result is + * 8 bit (as are the arguments.) + */ +png_uint_16 /* PRIVATE */ +png_gamma_correct(png_structp png_ptr, unsigned int value, + png_fixed_point gamma_val) +{ + if (png_ptr->bit_depth == 8) + return png_gamma_8bit_correct(value, gamma_val); + + else + return png_gamma_16bit_correct(value, gamma_val); +} + +/* This is the shared test on whether a gamma value is 'significant' - whether + * it is worth doing gamma correction. + */ +int /* PRIVATE */ +png_gamma_significant(png_fixed_point gamma_val) +{ + return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED || + gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED; +} + +/* Internal function to build a single 16 bit table - the table consists of + * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount + * to shift the input values right (or 16-number_of_signifiant_bits). + * + * The caller is responsible for ensuring that the table gets cleaned up on + * png_error (i.e. if one of the mallocs below fails) - i.e. the *table argument + * should be somewhere that will be cleaned. + */ +static void +png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable, + PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val) +{ + /* Various values derived from 'shift': */ + PNG_CONST unsigned int num = 1U << (8U - shift); + PNG_CONST unsigned int max = (1U << (16U - shift))-1U; + PNG_CONST unsigned int max_by_2 = 1U << (15U-shift); + unsigned int i; + + png_uint_16pp table = *ptable = + (png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p)); + + for (i = 0; i < num; i++) + { + png_uint_16p sub_table = table[i] = + (png_uint_16p)png_malloc(png_ptr, 256 * png_sizeof(png_uint_16)); + + /* The 'threshold' test is repeated here because it can arise for one of + * the 16 bit tables even if the others don't hit it. + */ + if (png_gamma_significant(gamma_val)) + { + /* The old code would overflow at the end and this would cause the + * 'pow' function to return a result >1, resulting in an + * arithmetic error. This code follows the spec exactly; ig is + * the recovered input sample, it always has 8-16 bits. + * + * We want input * 65535/max, rounded, the arithmetic fits in 32 + * bits (unsigned) so long as max <= 32767. + */ + unsigned int j; + for (j = 0; j < 256; j++) + { + png_uint_32 ig = (j << (8-shift)) + i; +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED + /* Inline the 'max' scaling operation: */ + double d = floor(65535*pow(ig/(double)max, gamma_val*.00001)+.5); + sub_table[j] = (png_uint_16)d; +# else + if (shift) + ig = (ig * 65535U + max_by_2)/max; + + sub_table[j] = png_gamma_16bit_correct(ig, gamma_val); +# endif + } + } + else + { + /* We must still build a table, but do it the fast way. */ + unsigned int j; + + for (j = 0; j < 256; j++) + { + png_uint_32 ig = (j << (8-shift)) + i; + + if (shift) + ig = (ig * 65535U + max_by_2)/max; + + sub_table[j] = (png_uint_16)ig; + } + } + } +} + +/* NOTE: this function expects the *inverse* of the overall gamma transformation + * required. + */ +static void +png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable, + PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val) +{ + PNG_CONST unsigned int num = 1U << (8U - shift); + PNG_CONST unsigned int max = (1U << (16U - shift))-1U; + unsigned int i; + png_uint_32 last; + + png_uint_16pp table = *ptable = + (png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p)); + + /* 'num' is the number of tables and also the number of low bits of low + * bits of the input 16 bit value used to select a table. Each table is + * itself index by the high 8 bits of the value. + */ + for (i = 0; i < num; i++) + table[i] = (png_uint_16p)png_malloc(png_ptr, + 256 * png_sizeof(png_uint_16)); + + /* 'gamma_val' is set to the reciprocal of the value calculated above, so + * pow(out,g) is an *input* value. 'last' is the last input value set. + * + * In the loop 'i' is used to find output values. Since the output is 8 + * bit there are only 256 possible values. The tables are set up to + * select the closest possible output value for each input by finding + * the input value at the boundary between each pair of output values + * and filling the table up to that boundary with the lower output + * value. + * + * The boundary values are 0.5,1.5..253.5,254.5. Since these are 9 bit + * values the code below uses a 16 bit value in i; the values start at + * 128.5 (for 0.5) and step by 257, for a total of 254 values (the last + * entries are filled with 255). Start i at 128 and fill all 'last' + * table entries <= 'max' + */ + last = 0; + for (i = 0; i < 255; ++i) /* 8 bit output value */ + { + /* Find the corresponding maximum input value */ + png_uint_16 out = (png_uint_16)(i * 257U); /* 16 bit output value */ + + /* Find the boundary value in 16 bits: */ + png_uint_32 bound = png_gamma_16bit_correct(out+128U, gamma_val); + + /* Adjust (round) to (16-shift) bits: */ + bound = (bound * max + 32768U)/65535U + 1U; + + while (last < bound) + { + table[last & (0xffU >> shift)][last >> (8U - shift)] = out; + last++; + } + } + + /* And fill in the final entries. */ + while (last < (num << 8)) + { + table[last & (0xff >> shift)][last >> (8U - shift)] = 65535U; + last++; + } +} + +/* Build a single 8 bit table: same as the 16 bit case but much simpler (and + * typically much faster). Note that libpng currently does no sBIT processing + * (apparently contrary to the spec) so a 256 entry table is always generated. + */ +static void +png_build_8bit_table(png_structp png_ptr, png_bytepp ptable, + PNG_CONST png_fixed_point gamma_val) +{ + unsigned int i; + png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256); + + if (png_gamma_significant(gamma_val)) for (i=0; i<256; i++) + table[i] = png_gamma_8bit_correct(i, gamma_val); + + else for (i=0; i<256; ++i) + table[i] = (png_byte)i; +} + +/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit + * tables, we don't make a full table if we are reducing to 8-bit in + * the future. Note also how the gamma_16 tables are segmented so that + * we don't need to allocate > 64K chunks for a full 16-bit table. + */ +void /* PRIVATE */ +png_build_gamma_table(png_structp png_ptr, int bit_depth) +{ + png_debug(1, "in png_build_gamma_table"); + + if (bit_depth <= 8) + { + png_build_8bit_table(png_ptr, &png_ptr->gamma_table, + png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->gamma, + png_ptr->screen_gamma) : PNG_FP_1); + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY)) + { + png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1, + png_reciprocal(png_ptr->gamma)); + + png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1, + png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) : + png_ptr->gamma/* Probably doing rgb_to_gray */); + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ + } + else + { + png_byte shift, sig_bit; + + if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit = png_ptr->sig_bit.red; + + if (png_ptr->sig_bit.green > sig_bit) + sig_bit = png_ptr->sig_bit.green; + + if (png_ptr->sig_bit.blue > sig_bit) + sig_bit = png_ptr->sig_bit.blue; + } + else + sig_bit = png_ptr->sig_bit.gray; + + /* 16 bit gamma code uses this equation: + * + * ov = table[(iv & 0xff) >> gamma_shift][iv >> 8] + * + * Where 'iv' is the input color value and 'ov' is the output value - + * pow(iv, gamma). + * + * Thus the gamma table consists of up to 256 256 entry tables. The table + * is selected by the (8-gamma_shift) most significant of the low 8 bits of + * the color value then indexed by the upper 8 bits: + * + * table[low bits][high 8 bits] + * + * So the table 'n' corresponds to all those 'iv' of: + * + * ..<(n+1 << gamma_shift)-1> + * + */ + if (sig_bit > 0 && sig_bit < 16U) + shift = (png_byte)(16U - sig_bit); /* shift == insignificant bits */ + + else + shift = 0; /* keep all 16 bits */ + + if (png_ptr->transformations & PNG_16_TO_8) + { + /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively + * the significant bits in the *input* when the output will + * eventually be 8 bits. By default it is 11. + */ + if (shift < (16U - PNG_MAX_GAMMA_8)) + shift = (16U - PNG_MAX_GAMMA_8); + } + + if (shift > 8U) + shift = 8U; /* Guarantees at least one table! */ + + png_ptr->gamma_shift = shift; + +#ifdef PNG_16BIT_SUPPORTED + if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND)) +#endif + png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift, + png_ptr->screen_gamma > 0 ? png_product2(png_ptr->gamma, + png_ptr->screen_gamma) : PNG_FP_1); + +#ifdef PNG_16BIT_SUPPORTED + else + png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift, + png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->gamma, + png_ptr->screen_gamma) : PNG_FP_1); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY)) + { + png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift, + png_reciprocal(png_ptr->gamma)); + + /* Notice that the '16 from 1' table should be full precision, however + * the lookup on this table still uses gamma_shift, so it can't be. + * TODO: fix this. + */ + png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift, + png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) : + png_ptr->gamma/* Probably doing rgb_to_gray */); + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ + } +} +#endif /* READ_GAMMA */ +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ diff --git a/src/3rdparty/libpng/png.h b/src/3rdparty/libpng/png.h new file mode 100644 index 0000000000..100f56dba2 --- /dev/null +++ b/src/3rdparty/libpng/png.h @@ -0,0 +1,2280 @@ + +/* png.h - header file for PNG reference library + * + * libpng version 1.5.1 - February 3, 2011 + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license (See LICENSE, below) + * + * Authors and maintainers: + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.5.1 - February 3, 2011: Glenn + * See also "Contributing Authors", below. + * + * Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: + * + * source png.h png.h shared-lib + * version string int version + * ------- ------ ----- ---------- + * 0.89c "1.0 beta 3" 0.89 89 1.0.89 + * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] + * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] + * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] + * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] + * 0.97c 0.97 97 2.0.97 + * 0.98 0.98 98 2.0.98 + * 0.99 0.99 98 2.0.99 + * 0.99a-m 0.99 99 2.0.99 + * 1.00 1.00 100 2.1.0 [100 should be 10000] + * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] + * 1.0.1 png.h string is 10001 2.1.0 + * 1.0.1a-e identical to the 10002 from here on, the shared library + * 1.0.2 source version) 10002 is 2.V where V is the source code + * 1.0.2a-b 10003 version, except as noted. + * 1.0.3 10003 + * 1.0.3a-d 10004 + * 1.0.4 10004 + * 1.0.4a-f 10005 + * 1.0.5 (+ 2 patches) 10005 + * 1.0.5a-d 10006 + * 1.0.5e-r 10100 (not source compatible) + * 1.0.5s-v 10006 (not binary compatible) + * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) + * 1.0.6d-f 10007 (still binary incompatible) + * 1.0.6g 10007 + * 1.0.6h 10007 10.6h (testing xy.z so-numbering) + * 1.0.6i 10007 10.6i + * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) + * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) + * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) + * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) + * 1.0.7 1 10007 (still compatible) + * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + * 1.0.8rc1 1 10008 2.1.0.8rc1 + * 1.0.8 1 10008 2.1.0.8 + * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + * 1.0.9rc1 1 10009 2.1.0.9rc1 + * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + * 1.0.9rc2 1 10009 2.1.0.9rc2 + * 1.0.9 1 10009 2.1.0.9 + * 1.0.10beta1 1 10010 2.1.0.10beta1 + * 1.0.10rc1 1 10010 2.1.0.10rc1 + * 1.0.10 1 10010 2.1.0.10 + * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + * 1.0.11rc1 1 10011 2.1.0.11rc1 + * 1.0.11 1 10011 2.1.0.11 + * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + * 1.0.12rc1 2 10012 2.1.0.12rc1 + * 1.0.12 2 10012 2.1.0.12 + * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) + * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + * 1.2.0rc1 3 10200 3.1.2.0rc1 + * 1.2.0 3 10200 3.1.2.0 + * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 + * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + * 1.2.1 3 10201 3.1.2.1 + * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + * 1.0.13 10 10013 10.so.0.1.0.13 + * 1.2.2 12 10202 12.so.0.1.2.2 + * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + * 1.2.3 12 10203 12.so.0.1.2.3 + * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 + * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + * 1.0.14 10 10014 10.so.0.1.0.14 + * 1.2.4 13 10204 12.so.0.1.2.4 + * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 + * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 + * 1.0.15 10 10015 10.so.0.1.0.15 + * 1.2.5 13 10205 12.so.0.1.2.5 + * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + * 1.0.16 10 10016 10.so.0.1.0.16 + * 1.2.6 13 10206 12.so.0.1.2.6 + * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 + * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + * 1.0.17 10 10017 12.so.0.1.0.17 + * 1.2.7 13 10207 12.so.0.1.2.7 + * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + * 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 + * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + * 1.0.18 10 10018 12.so.0.1.0.18 + * 1.2.8 13 10208 12.so.0.1.2.8 + * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + * 1.2.9beta4-11 13 10209 12.so.0.9[.0] + * 1.2.9rc1 13 10209 12.so.0.9[.0] + * 1.2.9 13 10209 12.so.0.9[.0] + * 1.2.10beta1-7 13 10210 12.so.0.10[.0] + * 1.2.10rc1-2 13 10210 12.so.0.10[.0] + * 1.2.10 13 10210 12.so.0.10[.0] + * 1.4.0beta1-5 14 10400 14.so.0.0[.0] + * 1.2.11beta1-4 13 10211 12.so.0.11[.0] + * 1.4.0beta7-8 14 10400 14.so.0.0[.0] + * 1.2.11 13 10211 12.so.0.11[.0] + * 1.2.12 13 10212 12.so.0.12[.0] + * 1.4.0beta9-14 14 10400 14.so.0.0[.0] + * 1.2.13 13 10213 12.so.0.13[.0] + * 1.4.0beta15-36 14 10400 14.so.0.0[.0] + * 1.4.0beta37-87 14 10400 14.so.14.0[.0] + * 1.4.0rc01 14 10400 14.so.14.0[.0] + * 1.4.0beta88-109 14 10400 14.so.14.0[.0] + * 1.4.0rc02-08 14 10400 14.so.14.0[.0] + * 1.4.0 14 10400 14.so.14.0[.0] + * 1.4.1beta01-03 14 10401 14.so.14.1[.0] + * 1.4.1rc01 14 10401 14.so.14.1[.0] + * 1.4.1beta04-12 14 10401 14.so.14.1[.0] + * 1.4.1 14 10401 14.so.14.1[.0] + * 1.4.2 14 10402 14.so.14.2[.0] + * 1.4.3 14 10403 14.so.14.3[.0] + * 1.4.4 14 10404 14.so.14.4[.0] + * 1.5.0beta01-58 15 10500 15.so.15.0[.0] + * 1.5.0rc01-07 15 10500 15.so.15.0[.0] + * 1.5.0 15 10500 15.so.15.0[.0] + * 1.5.1beta01-11 15 10501 15.so.15.1[.0] + * 1.5.1rc01-02 15 10501 15.so.15.1[.0] + * 1.5.1 15 10501 15.so.15.1[.0] + * + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcN". + * + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. + * + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). + * + * See libpng-manual.txt or libpng.3 for more information. The PNG + * specification is available as a W3C Recommendation and as an ISO + * Specification, +# endif + +/* Need the time information for converting tIME chunks, it + * defines struct tm: + */ +#ifdef PNG_CONVERT_tIME_SUPPORTED + /* "time.h" functions are not supported on all operating systems */ +# include +#endif + +/* Machine specific configuration. */ +# include "pngconf.h" +#endif + +/* + * Added at libpng-1.2.8 + * + * Ref MSDN: Private as priority over Special + * VS_FF_PRIVATEBUILD File *was not* built using standard release + * procedures. If this value is given, the StringFileInfo block must + * contain a PrivateBuild string. + * + * VS_FF_SPECIALBUILD File *was* built by the original company using + * standard release procedures but is a variation of the standard + * file of the same version number. If this value is given, the + * StringFileInfo block must contain a SpecialBuild string. + */ + +#ifdef PNG_USER_PRIVATEBUILD /* From pnglibconf.h */ +# define PNG_LIBPNG_BUILD_TYPE \ + (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE) +#else +# ifdef PNG_LIBPNG_SPECIALBUILD +# define PNG_LIBPNG_BUILD_TYPE \ + (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL) +# else +# define PNG_LIBPNG_BUILD_TYPE (PNG_LIBPNG_BUILD_BASE_TYPE) +# endif +#endif + +#ifndef PNG_VERSION_INFO_ONLY + +/* Inhibit C++ name-mangling for libpng functions but not for system calls. */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Version information for C files, stored in png.c. This had better match + * the version above. + */ +#define png_libpng_ver png_get_header_ver(NULL) + +/* This file is arranged in several sections: + * + * 1. Any configuration options that can be specified by for the application + * code when it is built. (Build time configuration is in pnglibconf.h) + * 2. Type definitions (base types are defined in pngconf.h), structure + * definitions. + * 3. Exported library functions. + * + * The library source code has additional files (principally pngpriv.h) that + * allow configuration of the library. + */ +/* Section 1: run time configuration + * See pnglibconf.h for build time configuration + * + * Run time configuration allows the application to choose between + * implementations of certain arithmetic APIs. The default is set + * at build time and recorded in pnglibconf.h, but it is safe to + * override these (and only these) settings. Note that this won't + * change what the library does, only application code, and the + * settings can (and probably should) be made on a per-file basis + * by setting the #defines before including png.h + * + * Use macros to read integers from PNG data or use the exported + * functions? + * PNG_USE_READ_MACROS: use the macros (see below) Note that + * the macros evaluate their argument multiple times. + * PNG_NO_USE_READ_MACROS: call the relevant library function. + * + * Use the alternative algorithm for compositing alpha samples that + * does not use division? + * PNG_READ_COMPOSITE_NODIV_SUPPORTED: use the 'no division' + * algorithm. + * PNG_NO_READ_COMPOSITE_NODIV: use the 'division' algorithm. + * + * How to handle benign errors if PNG_ALLOW_BENIGN_ERRORS is + * false? + * PNG_ALLOW_BENIGN_ERRORS: map calls to the benign error + * APIs to png_warning. + * Otherwise the calls are mapped to png_error. + */ + +/* Section 2: type definitions, including structures and compile time + * constants. + * See pngconf.h for base types that vary by machine/system + */ + +/* This triggers a compiler error in png.c, if png.c and png.h + * do not agree upon the version number. + */ +typedef char* png_libpng_version_1_5_1; + +/* Three color definitions. The order of the red, green, and blue, (and the + * exact size) is not important, although the size of the fields need to + * be png_byte or png_uint_16 (as defined below). + */ +typedef struct png_color_struct +{ + png_byte red; + png_byte green; + png_byte blue; +} png_color; +typedef png_color FAR * png_colorp; +typedef PNG_CONST png_color FAR * png_const_colorp; +typedef png_color FAR * FAR * png_colorpp; + +typedef struct png_color_16_struct +{ + png_byte index; /* used for palette files */ + png_uint_16 red; /* for use in red green blue files */ + png_uint_16 green; + png_uint_16 blue; + png_uint_16 gray; /* for use in grayscale files */ +} png_color_16; +typedef png_color_16 FAR * png_color_16p; +typedef PNG_CONST png_color_16 FAR * png_const_color_16p; +typedef png_color_16 FAR * FAR * png_color_16pp; + +typedef struct png_color_8_struct +{ + png_byte red; /* for use in red green blue files */ + png_byte green; + png_byte blue; + png_byte gray; /* for use in grayscale files */ + png_byte alpha; /* for alpha channel files */ +} png_color_8; +typedef png_color_8 FAR * png_color_8p; +typedef PNG_CONST png_color_8 FAR * png_const_color_8p; +typedef png_color_8 FAR * FAR * png_color_8pp; + +/* + * The following two structures are used for the in-core representation + * of sPLT chunks. + */ +typedef struct png_sPLT_entry_struct +{ + png_uint_16 red; + png_uint_16 green; + png_uint_16 blue; + png_uint_16 alpha; + png_uint_16 frequency; +} png_sPLT_entry; +typedef png_sPLT_entry FAR * png_sPLT_entryp; +typedef PNG_CONST png_sPLT_entry FAR * png_const_sPLT_entryp; +typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp; + +/* When the depth of the sPLT palette is 8 bits, the color and alpha samples + * occupy the LSB of their respective members, and the MSB of each member + * is zero-filled. The frequency member always occupies the full 16 bits. + */ + +typedef struct png_sPLT_struct +{ + png_charp name; /* palette name */ + png_byte depth; /* depth of palette samples */ + png_sPLT_entryp entries; /* palette entries */ + png_int_32 nentries; /* number of palette entries */ +} png_sPLT_t; +typedef png_sPLT_t FAR * png_sPLT_tp; +typedef PNG_CONST png_sPLT_t FAR * png_const_sPLT_tp; +typedef png_sPLT_t FAR * FAR * png_sPLT_tpp; + +#ifdef PNG_TEXT_SUPPORTED +/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file, + * and whether that contents is compressed or not. The "key" field + * points to a regular zero-terminated C string. The "text", "lang", and + * "lang_key" fields can be regular C strings, empty strings, or NULL pointers. + * However, the * structure returned by png_get_text() will always contain + * regular zero-terminated C strings (possibly empty), never NULL pointers, + * so they can be safely used in printf() and other string-handling functions. + */ +typedef struct png_text_struct +{ + int compression; /* compression value: + -1: tEXt, none + 0: zTXt, deflate + 1: iTXt, none + 2: iTXt, deflate */ + png_charp key; /* keyword, 1-79 character description of "text" */ + png_charp text; /* comment, may be an empty string (ie "") + or a NULL pointer */ + png_size_t text_length; /* length of the text string */ + png_size_t itxt_length; /* length of the itxt string */ + png_charp lang; /* language code, 0-79 characters + or a NULL pointer */ + png_charp lang_key; /* keyword translated UTF-8 string, 0 or more + chars or a NULL pointer */ +} png_text; +typedef png_text FAR * png_textp; +typedef PNG_CONST png_text FAR * png_const_textp; +typedef png_text FAR * FAR * png_textpp; +#endif + +/* Supported compression types for text in PNG files (tEXt, and zTXt). + * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */ +#define PNG_TEXT_COMPRESSION_NONE_WR -3 +#define PNG_TEXT_COMPRESSION_zTXt_WR -2 +#define PNG_TEXT_COMPRESSION_NONE -1 +#define PNG_TEXT_COMPRESSION_zTXt 0 +#define PNG_ITXT_COMPRESSION_NONE 1 +#define PNG_ITXT_COMPRESSION_zTXt 2 +#define PNG_TEXT_COMPRESSION_LAST 3 /* Not a valid value */ + +/* png_time is a way to hold the time in an machine independent way. + * Two conversions are provided, both from time_t and struct tm. There + * is no portable way to convert to either of these structures, as far + * as I know. If you know of a portable way, send it to me. As a side + * note - PNG has always been Year 2000 compliant! + */ +typedef struct png_time_struct +{ + png_uint_16 year; /* full year, as in, 1995 */ + png_byte month; /* month of year, 1 - 12 */ + png_byte day; /* day of month, 1 - 31 */ + png_byte hour; /* hour of day, 0 - 23 */ + png_byte minute; /* minute of hour, 0 - 59 */ + png_byte second; /* second of minute, 0 - 60 (for leap seconds) */ +} png_time; +typedef png_time FAR * png_timep; +typedef PNG_CONST png_time FAR * png_const_timep; +typedef png_time FAR * FAR * png_timepp; + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) +/* png_unknown_chunk is a structure to hold queued chunks for which there is + * no specific support. The idea is that we can use this to queue + * up private chunks for output even though the library doesn't actually + * know about their semantics. + */ +typedef struct png_unknown_chunk_t +{ + png_byte name[5]; + png_byte *data; + png_size_t size; + + /* libpng-using applications should NOT directly modify this byte. */ + png_byte location; /* mode of operation at read time */ +} +png_unknown_chunk; +typedef png_unknown_chunk FAR * png_unknown_chunkp; +typedef PNG_CONST png_unknown_chunk FAR * png_const_unknown_chunkp; +typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp; +#endif + +typedef struct png_info_def png_info; +typedef png_info FAR * png_infop; +typedef PNG_CONST png_info FAR * png_const_infop; +typedef png_info FAR * FAR * png_infopp; + +/* Maximum positive integer used in PNG is (2^31)-1 */ +#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL) +#define PNG_UINT_32_MAX ((png_uint_32)(-1)) +#define PNG_SIZE_MAX ((png_size_t)(-1)) + +/* These are constants for fixed point values encoded in the + * PNG specification manner (x100000) + */ +#define PNG_FP_1 100000 +#define PNG_FP_HALF 50000 + +/* These describe the color_type field in png_info. */ +/* color type masks */ +#define PNG_COLOR_MASK_PALETTE 1 +#define PNG_COLOR_MASK_COLOR 2 +#define PNG_COLOR_MASK_ALPHA 4 + +/* color types. Note that not all combinations are legal */ +#define PNG_COLOR_TYPE_GRAY 0 +#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE) +#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR) +#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA) +#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA) +/* aliases */ +#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA +#define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA + +/* This is for compression type. PNG 1.0-1.2 only define the single type. */ +#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */ +#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE + +/* This is for filter type. PNG 1.0-1.2 only define the single type. */ +#define PNG_FILTER_TYPE_BASE 0 /* Single row per-byte filtering */ +#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */ +#define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE + +/* These are for the interlacing type. These values should NOT be changed. */ +#define PNG_INTERLACE_NONE 0 /* Non-interlaced image */ +#define PNG_INTERLACE_ADAM7 1 /* Adam7 interlacing */ +#define PNG_INTERLACE_LAST 2 /* Not a valid value */ + +/* These are for the oFFs chunk. These values should NOT be changed. */ +#define PNG_OFFSET_PIXEL 0 /* Offset in pixels */ +#define PNG_OFFSET_MICROMETER 1 /* Offset in micrometers (1/10^6 meter) */ +#define PNG_OFFSET_LAST 2 /* Not a valid value */ + +/* These are for the pCAL chunk. These values should NOT be changed. */ +#define PNG_EQUATION_LINEAR 0 /* Linear transformation */ +#define PNG_EQUATION_BASE_E 1 /* Exponential base e transform */ +#define PNG_EQUATION_ARBITRARY 2 /* Arbitrary base exponential transform */ +#define PNG_EQUATION_HYPERBOLIC 3 /* Hyperbolic sine transformation */ +#define PNG_EQUATION_LAST 4 /* Not a valid value */ + +/* These are for the sCAL chunk. These values should NOT be changed. */ +#define PNG_SCALE_UNKNOWN 0 /* unknown unit (image scale) */ +#define PNG_SCALE_METER 1 /* meters per pixel */ +#define PNG_SCALE_RADIAN 2 /* radians per pixel */ +#define PNG_SCALE_LAST 3 /* Not a valid value */ + +/* These are for the pHYs chunk. These values should NOT be changed. */ +#define PNG_RESOLUTION_UNKNOWN 0 /* pixels/unknown unit (aspect ratio) */ +#define PNG_RESOLUTION_METER 1 /* pixels/meter */ +#define PNG_RESOLUTION_LAST 2 /* Not a valid value */ + +/* These are for the sRGB chunk. These values should NOT be changed. */ +#define PNG_sRGB_INTENT_PERCEPTUAL 0 +#define PNG_sRGB_INTENT_RELATIVE 1 +#define PNG_sRGB_INTENT_SATURATION 2 +#define PNG_sRGB_INTENT_ABSOLUTE 3 +#define PNG_sRGB_INTENT_LAST 4 /* Not a valid value */ + +/* This is for text chunks */ +#define PNG_KEYWORD_MAX_LENGTH 79 + +/* Maximum number of entries in PLTE/sPLT/tRNS arrays */ +#define PNG_MAX_PALETTE_LENGTH 256 + +/* These determine if an ancillary chunk's data has been successfully read + * from the PNG header, or if the application has filled in the corresponding + * data in the info_struct to be written into the output file. The values + * of the PNG_INFO_ defines should NOT be changed. + */ +#define PNG_INFO_gAMA 0x0001 +#define PNG_INFO_sBIT 0x0002 +#define PNG_INFO_cHRM 0x0004 +#define PNG_INFO_PLTE 0x0008 +#define PNG_INFO_tRNS 0x0010 +#define PNG_INFO_bKGD 0x0020 +#define PNG_INFO_hIST 0x0040 +#define PNG_INFO_pHYs 0x0080 +#define PNG_INFO_oFFs 0x0100 +#define PNG_INFO_tIME 0x0200 +#define PNG_INFO_pCAL 0x0400 +#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ + +/* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using + * the routines for other purposes. + */ +typedef struct png_row_info_struct +{ + png_uint_32 width; /* width of row */ + png_size_t rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_byte pixel_depth; /* bits per pixel (depth * channels) */ +} png_row_info; + +typedef png_row_info FAR * png_row_infop; +typedef png_row_info FAR * FAR * png_row_infopp; + +/* These are the function types for the I/O functions and for the functions + * that allow the user to override the default I/O functions with his or her + * own. The png_error_ptr type should match that of user-supplied warning + * and error functions, while the png_rw_ptr type should match that of the + * user read/write data functions. Note that the 'write' function must not + * modify the buffer it is passed. The 'read' function, on the other hand, is + * expected to return the read data in the buffer. + */ +typedef struct png_struct_def png_struct; +typedef PNG_CONST png_struct FAR * png_const_structp; +typedef png_struct FAR * png_structp; + +typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp), ); +typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t), ); +typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp), ); +typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32, + int), ); +typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, + int), ); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +typedef PNG_CALLBACK(void, *png_progressive_info_ptr, + (png_structp, png_infop), ); +typedef PNG_CALLBACK(void, *png_progressive_end_ptr, + (png_structp, png_infop), ); +typedef PNG_CALLBACK(void, *png_progressive_row_ptr, + (png_structp, png_bytep, png_uint_32, int), ); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +typedef PNG_CALLBACK(void, *png_user_transform_ptr, + (png_structp, png_row_infop, png_bytep), ); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp, + png_unknown_chunkp), ); +#endif +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp), ); +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This must match the function definition in , and the + * application must include this before png.h to obtain the definition + * of jmp_buf. The function is required to be PNG_NORETURN. (Note that + * PNG_PTR_NORETURN is used here because current versions of the Microsoft + * C compiler do not support the PNG_NORETURN attribute on a pointer.) + * + * If you get a type warning from the compiler when linking against this line + * then your compiler has 'longjmp' that does not match the requirements of the + * compiler that built libpng. You will have to write a wrapper function for + * your compiler's longjmp and call png_set_longjmp_fn directly (not via the + * png_jmpbuf macro.) + * + * If you get a warning here while building the library you will need to make + * changes to ensure that pnglibconf.h records the calling convention used by + * your compiler. This may be very difficult - try using a different compiler + * to build the library! + */ +typedef PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), + PNG_PTR_NORETURN); +#endif + +/* Transform masks for the high-level interface */ +#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ +#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ +#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ +#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ +#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ +#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ +#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ +#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ +#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ +#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ +#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ +#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ +#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only */ +/* Added to libpng-1.2.34 */ +#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER +#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */ +/* Added to libpng-1.4.0 */ +#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */ + +/* Flags for MNG supported features */ +#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 +#define PNG_FLAG_MNG_FILTER_64 0x04 +#define PNG_ALL_MNG_FEATURES 0x05 + +/* NOTE: prior to 1.5 these functions had no 'API' style declaration, + * this allowed the zlib default functions to be used on Windows + * platforms. In 1.5 the zlib default malloc (which just calls malloc and + * ignores the first argument) should be completely compatible with the + * following. + */ +typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp, + png_alloc_size_t), ); +typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp), ); + +typedef png_struct FAR * FAR * png_structpp; + +/* Section 3: exported functions + * Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng-manual.txt for the + * full explanation, see example.c for the summary. This just provides + * a simple one line description of the use of each function. + * + * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in + * pngconf.h and in the *.dfn files in the scripts directory. + * + * PNG_EXPORT(ordinal, type, name, (args)); + * + * ordinal: ordinal that is used while building + * *.def files. The ordinal value is only + * relevant when preprocessing png.h with + * the *.dfn files for building symbol table + * entries, and are removed by pngconf.h. + * type: return type of the function + * name: function name + * args: function arguments, with types + * + * When we wish to append attributes to a function prototype we use + * the PNG_EXPORTA() macro instead. + * + * PNG_EXPORTA(ordinal, type, name, (args), attributes); + * + * ordinal, type, name, and args: same as in PNG_EXPORT(). + * attributes: function attributes + */ + +/* Returns the version number of the library */ +PNG_EXPORT(1, png_uint_32, png_access_version_number, (void)); + +/* Tell lib we have already handled the first magic bytes. + * Handling more than 8 bytes from the beginning of the file is an error. + */ +PNG_EXPORT(2, void, png_set_sig_bytes, (png_structp png_ptr, int num_bytes)); + +/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a + * PNG file. Returns zero if the supplied bytes match the 8-byte PNG + * signature, and non-zero otherwise. Having num_to_check == 0 or + * start > 7 will always fail (ie return non-zero). + */ +PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start, + png_size_t num_to_check)); + +/* Simple signature checking function. This is the same as calling + * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). + */ +#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n)) + +/* Allocate and initialize png_ptr struct for reading, and any other memory. */ +PNG_EXPORTA(4, png_structp, png_create_read_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn), + PNG_ALLOCATED); + +/* Allocate and initialize png_ptr struct for writing, and any other memory */ +PNG_EXPORTA(5, png_structp, png_create_write_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn), + PNG_ALLOCATED); + +PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, + (png_const_structp png_ptr)); + +PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr, + png_size_t size)); + +/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp + * match up. + */ +#ifdef PNG_SETJMP_SUPPORTED +/* This function returns the jmp_buf built in to *png_ptr. It must be + * supplied with an appropriate 'longjmp' function to use on that jmp_buf + * unless the default error function is overridden in which case NULL is + * acceptable. The size of the jmp_buf is checked against the actual size + * allocated by the library - the call will return NULL on a mismatch + * indicating an ABI mismatch. + */ +PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structp png_ptr, + png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)); +# define png_jmpbuf(png_ptr) \ + (*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf))) +#else +# define png_jmpbuf(png_ptr) \ + (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) +#endif +/* This function should be used by libpng applications in place of + * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it + * will use it; otherwise it will call PNG_ABORT(). This function was + * added in libpng-1.5.0. + */ +PNG_EXPORTA(9, void, png_longjmp, (png_structp png_ptr, int val), + PNG_NORETURN); + +#ifdef PNG_READ_SUPPORTED +/* Reset the compression stream */ +PNG_EXPORT(10, int, png_reset_zstream, (png_structp png_ptr)); +#endif + +/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(11, png_structp, png_create_read_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +PNG_EXPORTA(12, png_structp, png_create_write_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +#endif + +/* Write the PNG file signature. */ +PNG_EXPORT(13, void, png_write_sig, (png_structp png_ptr)); + +/* Write a PNG chunk - size, type, (optional) data, CRC. */ +PNG_EXPORT(14, void, png_write_chunk, (png_structp png_ptr, png_const_bytep + chunk_name, png_const_bytep data, png_size_t length)); + +/* Write the start of a PNG chunk - length and chunk name. */ +PNG_EXPORT(15, void, png_write_chunk_start, (png_structp png_ptr, + png_const_bytep chunk_name, png_uint_32 length)); + +/* Write the data of a PNG chunk started with png_write_chunk_start(). */ +PNG_EXPORT(16, void, png_write_chunk_data, (png_structp png_ptr, + png_const_bytep data, png_size_t length)); + +/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ +PNG_EXPORT(17, void, png_write_chunk_end, (png_structp png_ptr)); + +/* Allocate and initialize the info structure */ +PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_structp png_ptr), + PNG_ALLOCATED); + +PNG_EXPORT(19, void, png_info_init_3, (png_infopp info_ptr, + png_size_t png_info_struct_size)); + +/* Writes all the PNG information before the image. */ +PNG_EXPORT(20, void, png_write_info_before_PLTE, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(21, void, png_write_info, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. */ +PNG_EXPORT(22, void, png_read_info, + (png_structp png_ptr, png_infop info_ptr)); +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED +PNG_EXPORT(23, png_const_charp, png_convert_to_rfc1123, + (png_structp png_ptr, + png_const_timep ptime)); +#endif + +#ifdef PNG_CONVERT_tIME_SUPPORTED +/* Convert from a struct tm to png_time */ +PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, + PNG_CONST struct tm FAR * ttime)); + +/* Convert from time_t to png_time. Uses gmtime() */ +PNG_EXPORT(25, void, png_convert_from_time_t, + (png_timep ptime, time_t ttime)); +#endif /* PNG_CONVERT_tIME_SUPPORTED */ + +#ifdef PNG_READ_EXPAND_SUPPORTED +/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ +PNG_EXPORT(26, void, png_set_expand, (png_structp png_ptr)); +PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structp png_ptr)); +PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structp png_ptr)); +PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Use blue, green, red order for pixels. */ +PNG_EXPORT(30, void, png_set_bgr, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED +/* Expand the grayscale to 24-bit RGB if necessary. */ +PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +/* Reduce RGB to grayscale. */ +PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structp png_ptr, + int error_action, double red, double green)); +PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green)); + +PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structp + png_ptr)); +#endif + +PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, + png_colorp palette)); + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED +PNG_EXPORT(36, void, png_set_strip_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +PNG_EXPORT(37, void, png_set_swap_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +PNG_EXPORT(38, void, png_set_invert_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(39, void, png_set_filler, (png_structp png_ptr, png_uint_32 filler, + int flags)); +/* The values of the PNG_FILLER_ defines should NOT be changed */ +# define PNG_FILLER_BEFORE 0 +# define PNG_FILLER_AFTER 1 +/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(40, void, png_set_add_alpha, + (png_structp png_ptr, png_uint_32 filler, + int flags)); +#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swap bytes in 16-bit depth files. */ +PNG_EXPORT(41, void, png_set_swap, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ +PNG_EXPORT(42, void, png_set_packing, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ + defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Swap packing order of pixels in bytes. */ +PNG_EXPORT(43, void, png_set_packswap, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Converts files to legal bit depths. */ +PNG_EXPORT(44, void, png_set_shift, (png_structp png_ptr, png_const_color_8p + true_bits)); +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Have the code handle the interlacing. Returns the number of passes. + * MUST be called before png_read_update_info or png_start_read_image, + * otherwise it will not have the desired effect. Note that it is still + * necessary to call png_read_row or png_read_rows png_get_image_height + * times for each pass. +*/ +PNG_EXPORT(45, int, png_set_interlace_handling, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +/* Invert monochrome files */ +PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +/* Handle alpha and tRNS by replacing with a background color. */ +PNG_FP_EXPORT(47, void, png_set_background, (png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)); +PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma)); +#endif +#ifdef PNG_READ_BACKGROUND_SUPPORTED +# define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +# define PNG_BACKGROUND_GAMMA_SCREEN 1 +# define PNG_BACKGROUND_GAMMA_FILE 2 +# define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#endif + +#ifdef PNG_READ_16_TO_8_SUPPORTED +/* Strip the second byte of information from a 16-bit depth file. */ +PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* Turn on quantizing, and reduce the palette to the number of colors + * available. + */ +PNG_EXPORT(49, void, png_set_quantize, + (png_structp png_ptr, png_colorp palette, + int num_palette, int maximum_colors, png_const_uint_16p histogram, + int full_quantize)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* The threshold on gamma processing is configurable but hard-wired into the + * library. The following is the floating point variant. + */ +#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001) + +/* Handle gamma correction. Screen_gamma=(display_exponent) */ +PNG_FP_EXPORT(50, void, png_set_gamma, + (png_structp png_ptr, double screen_gamma, + double default_file_gamma)); +PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structp png_ptr, + png_fixed_point screen_gamma, png_fixed_point default_file_gamma)); +#endif + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +/* Set how many lines between output flushes - 0 for no flushing */ +PNG_EXPORT(51, void, png_set_flush, (png_structp png_ptr, int nrows)); +/* Flush the current PNG output buffer */ +PNG_EXPORT(52, void, png_write_flush, (png_structp png_ptr)); +#endif + +/* Optional update palette with requested transformations */ +PNG_EXPORT(53, void, png_start_read_image, (png_structp png_ptr)); + +/* Optional call to update the users info structure */ +PNG_EXPORT(54, void, png_read_update_info, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. */ +PNG_EXPORT(55, void, png_read_rows, (png_structp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read a row of data. */ +PNG_EXPORT(56, void, png_read_row, (png_structp png_ptr, png_bytep row, + png_bytep display_row)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the whole image into memory at once. */ +PNG_EXPORT(57, void, png_read_image, (png_structp png_ptr, png_bytepp image)); +#endif + +/* Write a row of image data */ +PNG_EXPORT(58, void, png_write_row, + (png_structp png_ptr, png_const_bytep row)); + +/* Write a few rows of image data: (*row) is not written; however, the type + * is declared as writeable to maintain compatibility with previous versions + * of libpng and to allow the 'display_row' array from read_rows to be passed + * unchanged to write_rows. + */ +PNG_EXPORT(59, void, png_write_rows, (png_structp png_ptr, png_bytepp row, + png_uint_32 num_rows)); + +/* Write the image data */ +PNG_EXPORT(60, void, png_write_image, + (png_structp png_ptr, png_bytepp image)); + +/* Write the end of the PNG file. */ +PNG_EXPORT(61, void, png_write_end, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. */ +PNG_EXPORT(62, void, png_read_end, (png_structp png_ptr, png_infop info_ptr)); +#endif + +/* Free any memory associated with the png_info_struct */ +PNG_EXPORT(63, void, png_destroy_info_struct, (png_structp png_ptr, + png_infopp info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr)); + +/* Set the libpng method of handling chunk CRC errors */ +PNG_EXPORT(66, void, png_set_crc_action, + (png_structp png_ptr, int crit_action, int ancil_action)); + +/* Values for png_set_crc_action() say how to handle CRC errors in + * ancillary and critical chunks, and whether to use the data contained + * therein. Note that it is impossible to "discard" data in a critical + * chunk. For versions prior to 0.90, the action was always error/quit, + * whereas in version 0.90 and later, the action for CRC errors in ancillary + * chunks is warn/discard. These values should NOT be changed. + * + * value action:critical action:ancillary + */ +#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ +#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ +#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ +#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ +#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ +#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ + +/* These functions give the user control over the scan-line filtering in + * libpng and the compression methods used by zlib. These functions are + * mainly useful for testing, as the defaults should work with most users. + * Those users who are tight on memory or want faster performance at the + * expense of compression can modify them. See the compression library + * header file (zlib.h) for an explination of the compression functions. + */ + +/* Set the filtering method(s) used by libpng. Currently, the only valid + * value for "method" is 0. + */ +PNG_EXPORT(67, void, png_set_filter, + (png_structp png_ptr, int method, int filters)); + +/* Flags for png_set_filter() to say which filters to use. The flags + * are chosen so that they don't conflict with real filter types + * below, in case they are supplied instead of the #defined constants. + * These values should NOT be changed. + */ +#define PNG_NO_FILTERS 0x00 +#define PNG_FILTER_NONE 0x08 +#define PNG_FILTER_SUB 0x10 +#define PNG_FILTER_UP 0x20 +#define PNG_FILTER_AVG 0x40 +#define PNG_FILTER_PAETH 0x80 +#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ + PNG_FILTER_AVG | PNG_FILTER_PAETH) + +/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. + * These defines should NOT be changed. + */ +#define PNG_FILTER_VALUE_NONE 0 +#define PNG_FILTER_VALUE_SUB 1 +#define PNG_FILTER_VALUE_UP 2 +#define PNG_FILTER_VALUE_AVG 3 +#define PNG_FILTER_VALUE_PAETH 4 +#define PNG_FILTER_VALUE_LAST 5 + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */ +/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ + * defines, either the default (minimum-sum-of-absolute-differences), or + * the experimental method (weighted-minimum-sum-of-absolute-differences). + * + * Weights are factors >= 1.0, indicating how important it is to keep the + * filter type consistent between rows. Larger numbers mean the current + * filter is that many times as likely to be the same as the "num_weights" + * previous filters. This is cumulative for each previous row with a weight. + * There needs to be "num_weights" values in "filter_weights", or it can be + * NULL if the weights aren't being specified. Weights have no influence on + * the selection of the first row filter. Well chosen weights can (in theory) + * improve the compression for a given image. + * + * Costs are factors >= 1.0 indicating the relative decoding costs of a + * filter type. Higher costs indicate more decoding expense, and are + * therefore less likely to be selected over a filter with lower computational + * costs. There needs to be a value in "filter_costs" for each valid filter + * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't + * setting the costs. Costs try to improve the speed of decompression without + * unduly increasing the compressed image size. + * + * A negative weight or cost indicates the default value is to be used, and + * values in the range [0.0, 1.0) indicate the value is to remain unchanged. + * The default values for both weights and costs are currently 1.0, but may + * change if good general weighting/cost heuristics can be found. If both + * the weights and costs are set to 1.0, this degenerates the WEIGHTED method + * to the UNWEIGHTED method, but with added encoding time/computation. + */ +PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structp png_ptr, + int heuristic_method, int num_weights, png_const_doublep filter_weights, + png_const_doublep filter_costs)); +PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, + (png_structp png_ptr, + int heuristic_method, int num_weights, png_const_fixed_point_p + filter_weights, png_const_fixed_point_p filter_costs)); +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +/* Heuristic used for row filter selection. These defines should NOT be + * changed. + */ +#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ +#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ +#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ +#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ + +/* Set the library compression level. Currently, valid values range from + * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 + * (0 - no compression, 9 - "maximal" compression). Note that tests have + * shown that zlib compression levels 3-6 usually perform as well as level 9 + * for PNG images, and do considerably fewer caclulations. In the future, + * these values may not correspond directly to the zlib compression levels. + */ +PNG_EXPORT(69, void, png_set_compression_level, + (png_structp png_ptr, int level)); + +PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structp png_ptr, + int mem_level)); + +PNG_EXPORT(71, void, png_set_compression_strategy, (png_structp png_ptr, + int strategy)); + +PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structp png_ptr, + int window_bits)); + +PNG_EXPORT(73, void, png_set_compression_method, (png_structp png_ptr, + int method)); + +/* These next functions are called for input/output, memory, and error + * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, + * and call standard C I/O routines such as fread(), fwrite(), and + * fprintf(). These functions can be made to use other I/O routines + * at run time for those applications that need to handle I/O in a + * different manner by calling png_set_???_fn(). See libpng-manual.txt for + * more information. + */ + +#ifdef PNG_STDIO_SUPPORTED +/* Initialize the input/output for the PNG file to the default functions. */ +PNG_EXPORT(74, void, png_init_io, (png_structp png_ptr, png_FILE_p fp)); +#endif + +/* Replace the (error and abort), and warning functions with user + * supplied functions. If no messages are to be printed you must still + * write and use replacement functions. The replacement error_fn should + * still do a longjmp to the last setjmp location if you are using this + * method of error handling. If error_fn or warning_fn is NULL, the + * default function will be used. + */ + +PNG_EXPORT(75, void, png_set_error_fn, + (png_structp png_ptr, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warning_fn)); + +/* Return the user pointer associated with the error functions */ +PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structp png_ptr)); + +/* Replace the default data output functions with a user supplied one(s). + * If buffered output is not used, then output_flush_fn can be set to NULL. + * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time + * output_flush_fn will be ignored (and thus can be NULL). + * It is probably a mistake to use NULL for output_flush_fn if + * write_data_fn is not also NULL unless you have built libpng with + * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's + * default flush function, which uses the standard *FILE structure, will + * be used. + */ +PNG_EXPORT(77, void, png_set_write_fn, (png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); + +/* Replace the default data input function with a user supplied one. */ +PNG_EXPORT(78, void, png_set_read_fn, (png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn)); + +/* Return the user pointer associated with the I/O functions */ +PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_structp png_ptr)); + +PNG_EXPORT(80, void, png_set_read_status_fn, (png_structp png_ptr, + png_read_status_ptr read_row_fn)); + +PNG_EXPORT(81, void, png_set_write_status_fn, (png_structp png_ptr, + png_write_status_ptr write_row_fn)); + +#ifdef PNG_USER_MEM_SUPPORTED +/* Replace the default memory allocation functions with user supplied one(s). */ +PNG_EXPORT(82, void, png_set_mem_fn, (png_structp png_ptr, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +/* Return the user pointer associated with the memory functions */ +PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structp png_ptr)); +#endif + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structp png_ptr, + png_user_transform_ptr read_user_transform_fn)); +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structp png_ptr, + png_user_transform_ptr write_user_transform_fn)); +#endif + +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +PNG_EXPORT(86, void, png_set_user_transform_info, (png_structp png_ptr, + png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); +/* Return the user pointer associated with the user transform functions */ +PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr, + (png_const_structp png_ptr)); +#endif + +#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED +/* Return information about the row currently being processed. Note that these + * APIs do not fail but will return unexpected results if called outside a user + * transform callback. Also note that when transforming an interlaced image the + * row number is still the row in the final, de-interlaced, image but the row + * only contains the data of the current pass - consult png_row_info for the + * actual width of the row! + */ +PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structp)); +PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structp)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structp png_ptr)); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* Sets the function callbacks for the push reader, and a pointer to a + * user-defined structure available to the callback functions. + */ +PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structp png_ptr, + png_voidp progressive_ptr, png_progressive_info_ptr info_fn, + png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); + +/* Returns the user pointer associated with the push read functions */ +PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, (png_const_structp png_ptr)); + +/* Function to be called when data becomes available */ +PNG_EXPORT(92, void, png_process_data, + (png_structp png_ptr, png_infop info_ptr, + png_bytep buffer, png_size_t buffer_size)); + +/* A function which may be called *only* within png_process_data to stop the + * processing of any more data. The function returns the number of bytes + * remaining, excluding any that libpng has cached internally. A subsequent + * call to png_process_data must supply these bytes again. If the argument + * 'save' is set to true the routine will first save all the pending data and + * will always return 0. + */ +PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structp, int save)); + +/* A function which may be called *only* outside (after) a call to + * png_process_data. It returns the number of bytes of data to skip in the + * input. Normally it will return 0, but if it returns a non-zero value the + * application must skip than number of bytes of input data and pass the + * following data to the next call to png_process_data. + */ +PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structp)); + +/* Function that combines rows. 'new_row' is a flag that should come from + * the callback and be non-NULL if anything needs to be done; the library + * stores its own version of the new data internally and ignores the passed + * in value. + */ +PNG_EXPORT(93, void, png_progressive_combine_row, (png_structp png_ptr, + png_bytep old_row, png_const_bytep new_row)); +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +PNG_EXPORTA(94, png_voidp, png_malloc, + (png_structp png_ptr, png_alloc_size_t size), + PNG_ALLOCATED); +/* Added at libpng version 1.4.0 */ +PNG_EXPORTA(95, png_voidp, png_calloc, + (png_structp png_ptr, png_alloc_size_t size), + PNG_ALLOCATED); + +/* Added at libpng version 1.2.4 */ +PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_structp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); + +/* Frees a pointer allocated by png_malloc() */ +PNG_EXPORT(97, void, png_free, (png_structp png_ptr, png_voidp ptr)); + +/* Free data that was allocated internally */ +PNG_EXPORT(98, void, png_free_data, + (png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); + +/* Reassign responsibility for freeing existing data, whether allocated + * by libpng or by the application */ +PNG_EXPORT(99, void, png_data_freer, + (png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); + +/* Assignments for png_data_freer */ +#define PNG_DESTROY_WILL_FREE_DATA 1 +#define PNG_SET_WILL_FREE_DATA 1 +#define PNG_USER_WILL_FREE_DATA 2 +/* Flags for png_ptr->free_me and info_ptr->free_me */ +#define PNG_FREE_HIST 0x0008 +#define PNG_FREE_ICCP 0x0010 +#define PNG_FREE_SPLT 0x0020 +#define PNG_FREE_ROWS 0x0040 +#define PNG_FREE_PCAL 0x0080 +#define PNG_FREE_SCAL 0x0100 +#define PNG_FREE_UNKN 0x0200 +#define PNG_FREE_LIST 0x0400 +#define PNG_FREE_PLTE 0x1000 +#define PNG_FREE_TRNS 0x2000 +#define PNG_FREE_TEXT 0x4000 +#define PNG_FREE_ALL 0x7fff +#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ + +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_structp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); +PNG_EXPORT(101, void, png_free_default, (png_structp png_ptr, png_voidp ptr)); +#endif + +#ifdef PNG_ERROR_TEXT_SUPPORTED +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(102, void, png_error, + (png_structp png_ptr, png_const_charp error_message), + PNG_NORETURN); + +/* The same, but the chunk name is prepended to the error string. */ +PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr, + png_const_charp error_message), PNG_NORETURN); + +#else +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(104, void, png_err, (png_structp png_ptr), PNG_NORETURN); +#endif + +/* Non-fatal error in libpng. Can continue, but may have a problem. */ +PNG_EXPORT(105, void, png_warning, (png_structp png_ptr, + png_const_charp warning_message)); + +/* Non-fatal error in libpng, chunk name is prepended to message. */ +PNG_EXPORT(106, void, png_chunk_warning, (png_structp png_ptr, + png_const_charp warning_message)); + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED +/* Benign error in libpng. Can continue, but may have a problem. + * User can choose whether to handle as a fatal error or as a warning. */ +# undef png_benign_error +PNG_EXPORT(107, void, png_benign_error, (png_structp png_ptr, + png_const_charp warning_message)); + +/* Same, chunk name is prepended to message. */ +# undef png_chunk_benign_error +PNG_EXPORT(108, void, png_chunk_benign_error, (png_structp png_ptr, + png_const_charp warning_message)); + +PNG_EXPORT(109, void, png_set_benign_errors, + (png_structp png_ptr, int allowed)); +#else +# ifdef PNG_ALLOW_BENIGN_ERRORS +# define png_benign_error png_warning +# define png_chunk_benign_error png_chunk_warning +# else +# define png_benign_error png_error +# define png_chunk_benign_error png_chunk_error +# endif +#endif + +/* The png_set_ functions are for storing values in the png_info_struct. + * Similarly, the png_get_ calls are used to read values from the + * png_info_struct, either storing the parameters in the passed variables, or + * setting pointers into the png_info_struct where the data is stored. The + * png_get_ functions return a non-zero value if the data was available + * in info_ptr, or return zero and do not change any of the parameters if the + * data was not available. + * + * These functions should be used instead of directly accessing png_info + * to avoid problems with future changes in the size and internal layout of + * png_info_struct. + */ +/* Returns "flag" if chunk data is valid in info_ptr. */ +PNG_EXPORT(110, png_uint_32, png_get_valid, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 flag)); + +/* Returns number of bytes needed to hold a transformed row. */ +PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* Returns row_pointers, which is an array of pointers to scanlines that was + * returned from png_read_png(). + */ +PNG_EXPORT(112, png_bytepp, png_get_rows, + (png_const_structp png_ptr, png_const_infop info_ptr)); +/* Set row_pointers, which is an array of pointers to scanlines for use + * by png_write_png(). + */ +PNG_EXPORT(113, void, png_set_rows, (png_structp png_ptr, + png_infop info_ptr, png_bytepp row_pointers)); +#endif + +/* Returns number of color channels in image. */ +PNG_EXPORT(114, png_byte, png_get_channels, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Returns image width in pixels. */ +PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image height in pixels. */ +PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image bit_depth. */ +PNG_EXPORT(117, png_byte, png_get_bit_depth, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +/* Returns image color_type. */ +PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image filter_type. */ +PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image interlace_type. */ +PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image compression_type. */ +PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image resolution in pixels per meter, from pHYs chunk data. */ +PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +/* Returns pixel aspect ratio, computed from pHYs chunk data. */ +PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ +PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +/* Returns pointer to signature string read from PNG header */ +PNG_EXPORT(130, png_const_bytep, png_get_signature, + (png_const_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(131, png_uint_32, png_get_bKGD, + (png_const_structp png_ptr, png_infop info_ptr, + png_color_16p *background)); +#endif + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(132, void, png_set_bKGD, (png_structp png_ptr, png_infop info_ptr, + png_const_color_16p background)); +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr, + png_const_infop info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */ +PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, + (png_const_structp png_ptr, + png_const_infop info_ptr, png_fixed_point *int_white_x, + png_fixed_point *int_white_y, png_fixed_point *int_red_x, + png_fixed_point *int_red_y, png_fixed_point *int_green_x, + png_fixed_point *int_green_y, png_fixed_point *int_blue_x, + png_fixed_point *int_blue_y)); +#endif +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(135, void, png_set_cHRM, + (png_structp png_ptr, png_infop info_ptr, + double white_x, double white_y, double red_x, double red_y, double green_x, + double green_y, double blue_x, double blue_y)); +PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_white_x, + png_fixed_point int_white_y, png_fixed_point int_red_x, + png_fixed_point int_red_y, png_fixed_point int_green_x, + png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, + (png_const_structp png_ptr, png_const_infop info_ptr, + double *file_gamma)); +PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *int_file_gamma)); +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(139, void, png_set_gAMA, (png_structp png_ptr, + png_infop info_ptr, double file_gamma)); +PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_file_gamma)); +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(141, png_uint_32, png_get_hIST, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_16p *hist)); +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(142, void, png_set_hIST, (png_structp png_ptr, + png_infop info_ptr, png_const_uint_16p hist)); +#endif + +PNG_EXPORT(143, png_uint_32, png_get_IHDR, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, + int *interlace_method, int *compression_method, int *filter_method)); + +PNG_EXPORT(144, void, png_set_IHDR, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, + int interlace_method, int compression_method, int filter_method)); + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(145, png_uint_32, png_get_oFFs, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); +#endif + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(146, void, png_set_oFFs, + (png_structp png_ptr, png_infop info_ptr, + png_int_32 offset_x, png_int_32 offset_y, int unit_type)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(147, png_uint_32, png_get_pCAL, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, + int *nparams, + png_charp *units, png_charpp *params)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(148, void, png_set_pCAL, (png_structp png_ptr, + png_infop info_ptr, + png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, + int nparams, png_const_charp units, png_charpp params)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(149, png_uint_32, png_get_pHYs, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(150, void, png_set_pHYs, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +#endif + +PNG_EXPORT(151, png_uint_32, png_get_PLTE, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_colorp *palette, int *num_palette)); + +PNG_EXPORT(152, void, png_set_PLTE, + (png_structp png_ptr, png_infop info_ptr, + png_const_colorp palette, int num_palette)); + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(153, png_uint_32, png_get_sBIT, + (png_const_structp png_ptr, png_infop info_ptr, + png_color_8p *sig_bit)); +#endif + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(154, void, png_set_sBIT, + (png_structp png_ptr, png_infop info_ptr, png_const_color_8p sig_bit)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structp png_ptr, + png_const_infop info_ptr, int *file_srgb_intent)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(156, void, png_set_sRGB, + (png_structp png_ptr, png_infop info_ptr, int srgb_intent)); +PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_structp png_ptr, + png_infop info_ptr, int srgb_intent)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(158, png_uint_32, png_get_iCCP, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_charpp name, int *compression_type, png_bytepp profile, + png_uint_32 *proflen)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(159, void, png_set_iCCP, + (png_structp png_ptr, png_infop info_ptr, + png_const_charp name, int compression_type, png_const_bytep profile, + png_uint_32 proflen)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(160, png_uint_32, png_get_sPLT, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_sPLT_tpp entries)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(161, void, png_set_sPLT, + (png_structp png_ptr, png_infop info_ptr, + png_const_sPLT_tp entries, int nentries)); +#endif + +#ifdef PNG_TEXT_SUPPORTED +/* png_get_text also returns the number of text chunks in *num_text */ +PNG_EXPORT(162, png_uint_32, png_get_text, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_textp *text_ptr, int *num_text)); +#endif + +/* Note while png_set_text() will accept a structure whose text, + * language, and translated keywords are NULL pointers, the structure + * returned by png_get_text will always contain regular + * zero-terminated C strings. They might be empty strings but + * they will never be NULL pointers. + */ + +#ifdef PNG_TEXT_SUPPORTED +PNG_EXPORT(163, void, png_set_text, + (png_structp png_ptr, png_infop info_ptr, + png_const_textp text_ptr, int num_text)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(164, png_uint_32, png_get_tIME, + (png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(165, void, png_set_tIME, + (png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(166, png_uint_32, png_get_tRNS, + (png_const_structp png_ptr, png_infop info_ptr, + png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(167, void, png_set_tRNS, + (png_structp png_ptr, png_infop info_ptr, + png_const_bytep trans_alpha, int num_trans, + png_const_color_16p trans_color)); +#endif + +#ifdef PNG_sCAL_SUPPORTED +PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, + (png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, double *width, double *height)); +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED +/* NOTE: this API is currently implemented using floating point arithmetic, + * consequently it can only be used on systems with floating point support. + * In any case the range of values supported by png_fixed_point is small and it + * is highly recommended that png_get_sCAL_s be used instead. + */ +PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, + (png_structp png_ptr, png_const_infop info_ptr, int *unit, + png_fixed_point *width, + png_fixed_point *height)); +#endif +PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, + (png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, png_charpp swidth, png_charpp sheight)); + +PNG_FP_EXPORT(170, void, png_set_sCAL, + (png_structp png_ptr, png_infop info_ptr, + int unit, double width, double height)); +PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_structp png_ptr, + png_infop info_ptr, int unit, png_fixed_point width, + png_fixed_point height)); +PNG_EXPORT(171, void, png_set_sCAL_s, + (png_structp png_ptr, png_infop info_ptr, + int unit, png_const_charp swidth, png_const_charp sheight)); +#endif /* PNG_sCAL_SUPPORTED */ + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +/* Provide a list of chunks and how they are to be handled, if the built-in + handling or default unknown chunk handling is not desired. Any chunks not + listed will be handled in the default manner. The IHDR and IEND chunks + must not be listed. + keep = 0: follow default behaviour + = 1: do not keep + = 2: keep only if safe-to-copy + = 3: keep even if unsafe-to-copy +*/ +PNG_EXPORT(172, void, png_set_keep_unknown_chunks, + (png_structp png_ptr, int keep, + png_const_bytep chunk_list, int num_chunks)); +PNG_EXPORT(173, int, png_handle_as_unknown, (png_structp png_ptr, + png_const_bytep chunk_name)); +#endif +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +PNG_EXPORT(174, void, png_set_unknown_chunks, (png_structp png_ptr, + png_infop info_ptr, png_const_unknown_chunkp unknowns, + int num_unknowns)); +PNG_EXPORT(175, void, png_set_unknown_chunk_location, + (png_structp png_ptr, png_infop info_ptr, int chunk, int location)); +PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structp png_ptr, + png_const_infop info_ptr, png_unknown_chunkpp entries)); +#endif + +/* Png_free_data() will turn off the "valid" flag for anything it frees. + * If you need to turn it off for a chunk that your application has freed, + * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); + */ +PNG_EXPORT(177, void, png_set_invalid, + (png_structp png_ptr, png_infop info_ptr, int mask)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* The "params" pointer is currently not used and is for future expansion. */ +PNG_EXPORT(178, void, png_read_png, (png_structp png_ptr, png_infop info_ptr, + int transforms, png_voidp params)); +PNG_EXPORT(179, void, png_write_png, (png_structp png_ptr, png_infop info_ptr, + int transforms, png_voidp params)); +#endif + +PNG_EXPORT(180, png_const_charp, png_get_copyright, + (png_const_structp png_ptr)); +PNG_EXPORT(181, png_const_charp, png_get_header_ver, + (png_const_structp png_ptr)); +PNG_EXPORT(182, png_const_charp, png_get_header_version, + (png_const_structp png_ptr)); +PNG_EXPORT(183, png_const_charp, png_get_libpng_ver, + (png_const_structp png_ptr)); + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr, + png_uint_32 mng_features_permitted)); +#endif + +/* For use in png_set_keep_unknown, added to version 1.2.6 */ +#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 +#define PNG_HANDLE_CHUNK_NEVER 1 +#define PNG_HANDLE_CHUNK_IF_SAFE 2 +#define PNG_HANDLE_CHUNK_ALWAYS 3 + +/* Strip the prepended error numbers ("#nnn ") from error and warning + * messages before passing them to the error or warning handler. + */ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +PNG_EXPORT(185, void, png_set_strip_error_numbers, + (png_structp png_ptr, + png_uint_32 strip_mode)); +#endif + +/* Added in libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +PNG_EXPORT(186, void, png_set_user_limits, (png_structp png_ptr, + png_uint_32 user_width_max, png_uint_32 user_height_max)); +PNG_EXPORT(187, png_uint_32, png_get_user_width_max, + (png_const_structp png_ptr)); +PNG_EXPORT(188, png_uint_32, png_get_user_height_max, + (png_const_structp png_ptr)); +/* Added in libpng-1.4.0 */ +PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structp png_ptr, + png_uint_32 user_chunk_cache_max)); +PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max, + (png_const_structp png_ptr)); +/* Added in libpng-1.4.1 */ +PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structp png_ptr, + png_alloc_size_t user_chunk_cache_max)); +PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max, + (png_const_structp png_ptr)); +#endif + +#if defined(PNG_INCH_CONVERSIONS_SUPPORTED) +PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_FP_EXPORT(196, float, png_get_x_offset_inches, + (png_const_structp png_ptr, png_const_infop info_ptr)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, + (png_structp png_ptr, png_const_infop info_ptr)); +#endif + +PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structp png_ptr, + png_const_infop info_ptr)); +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, + (png_structp png_ptr, png_const_infop info_ptr)); +#endif + +# ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structp png_ptr, + png_const_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, + int *unit_type)); +# endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ + +/* Added in libpng-1.4.0 */ +#ifdef PNG_IO_STATE_SUPPORTED +PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_structp png_ptr)); + +PNG_EXPORTA(200, png_const_bytep, png_get_io_chunk_name, + (png_structp png_ptr), PNG_DEPRECATED); +PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, + (png_const_structp png_ptr)); + +/* The flags returned by png_get_io_state() are the following: */ +# define PNG_IO_NONE 0x0000 /* no I/O at this moment */ +# define PNG_IO_READING 0x0001 /* currently reading */ +# define PNG_IO_WRITING 0x0002 /* currently writing */ +# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ +# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ +# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ +# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ +# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ +# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ +#endif /* ?PNG_IO_STATE_SUPPORTED */ + +/* Interlace support. The following macros are always defined so that if + * libpng interlace handling is turned off the macros may be used to handle + * interlaced images within the application. + */ +#define PNG_INTERLACE_ADAM7_PASSES 7 + +/* Two macros to return the first row and first column of the original, + * full, image which appears in a given pass. 'pass' is in the range 0 + * to 6 and the result is in the range 0 to 7. + */ +#define PNG_PASS_START_ROW(pass) (((1U&~(pass))<<(3-((pass)>>1)))&7) +#define PNG_PASS_START_COL(pass) (((1U& (pass))<<(3-(((pass)+1)>>1)))&7) + +/* Two macros to help evaluate the number of rows or columns in each + * pass. This is expressed as a shift - effectively log2 of the number or + * rows or columns in each 8x8 tile of the original image. + */ +#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) +#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) + +/* Hence two macros to determine the number of rows or columns in a given + * pass of an image given its height or width. In fact these macros may + * return non-zero even though the sub-image is empty, because the other + * dimension may be empty for a small image. + */ +#define PNG_PASS_ROWS(height, pass) (((height)+(((1<>PNG_PASS_ROW_SHIFT(pass)) +#define PNG_PASS_COLS(width, pass) (((width)+(((1<>PNG_PASS_COL_SHIFT(pass)) + +/* For the progressive reader it is necessary to find the row in the output + * image given a row in an interlaced image, so two more macros: + */ +#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \ + (((yIn)<>(((7-(off))-(pass))<<2)) & 0xFU) | \ + ((0x01145AF0U>>(((7-(off))-(pass))<<2)) & 0xF0U)) + +#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ + ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) +#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ + ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) + +#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED +/* With these routines we avoid an integer divide, which will be slower on + * most machines. However, it does take more operations than the corresponding + * divide method, so it may be slower on a few RISC systems. There are two + * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. + * + * Note that the rounding factors are NOT supposed to be the same! 128 and + * 32768 are correct for the NODIV code; 127 and 32767 are correct for the + * standard method. + * + * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] + */ + + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + +# define png_composite(composite, fg, alpha, bg) \ + { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \ + * (png_uint_16)(alpha) \ + + (png_uint_16)(bg)*(png_uint_16)(255 \ + - (png_uint_16)(alpha)) + (png_uint_16)128); \ + (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } + +# define png_composite_16(composite, fg, alpha, bg) \ + { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \ + * (png_uint_32)(alpha) \ + + (png_uint_32)(bg)*(png_uint_32)(65535L \ + - (png_uint_32)(alpha)) + (png_uint_32)32768L); \ + (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } + +#else /* Standard method using integer division */ + +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + (png_uint_16)127) / 255) + +# define png_composite_16(composite, fg, alpha, bg) \ + (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ + (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ + (png_uint_32)32767) / (png_uint_32)65535L) +#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ + +#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); +PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf)); +PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf)); +#endif + +PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_structp png_ptr, + png_const_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i)); +#endif +#ifdef PNG_SAVE_INT_32_SUPPORTED +PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i)); +#endif + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ +#endif + +#ifdef PNG_USE_READ_MACROS +/* Inline macros to do direct reads of bytes from the input buffer. + * The png_get_int_32() routine assumes we are using two's complement + * format for negative values, which is almost certainly true. + */ +# define png_get_uint_32(buf) \ + (((png_uint_32)(*(buf)) << 24) + \ + ((png_uint_32)(*((buf) + 1)) << 16) + \ + ((png_uint_32)(*((buf) + 2)) << 8) + \ + ((png_uint_32)(*((buf) + 3)))) + + /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the + * function) incorrectly returned a value of type png_uint_32. + */ +# define png_get_uint_16(buf) \ + ((png_uint_16) \ + (((unsigned int)(*(buf)) << 8) + \ + ((unsigned int)(*((buf) + 1))))) + +# define png_get_int_32(buf) \ + ((png_int_32)((*(buf) & 0x80) \ + ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ + : (png_int_32)png_get_uint_32(buf))) +#endif + +/* Maintainer: Put new public prototypes here ^, in libpng.3, and project + * defs + */ + +/* The last ordinal number (this is the *last* one already used; the next + * one to use is one more than this.) Maintainer, remember to add an entry to + * scripts/symbols.def as well. + */ +#ifdef PNG_EXPORT_LAST_ORDINAL + PNG_EXPORT_LAST_ORDINAL(220); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PNG_VERSION_INFO_ONLY */ +/* Do not put anything past this line */ +#endif /* PNG_H */ diff --git a/src/3rdparty/libpng/pngconf.h b/src/3rdparty/libpng/pngconf.h new file mode 100644 index 0000000000..d0b34549cb --- /dev/null +++ b/src/3rdparty/libpng/pngconf.h @@ -0,0 +1,639 @@ + +/* pngconf.h - machine configurable file for libpng + * + * libpng version 1.5.1 - February 3, 2011 + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + */ + +/* Any machine specific code is near the front of this file, so if you + * are configuring libpng for a machine, you may want to read the section + * starting here down to where it starts to typedef png_color, png_text, + * and png_info. + */ + +#ifndef PNGCONF_H +#define PNGCONF_H + +/* PNG_NO_LIMITS_H may be used to turn off the use of the standard C + * definition file for machine specific limits, this may impact the + * correctness of the definitons below (see uses of INT_MAX). + */ +#ifndef PNG_NO_LIMITS_H +# include +#endif + +/* For the memory copy APIs (i.e. the standard definitions of these), + * because this file defines png_memcpy and so on the base APIs must + * be defined here. + */ +#if defined(BSD) && !defined(VXWORKS) +# include +#else +# include +#endif + +/* For png_FILE_p - this provides the standard definition of a + * FILE + */ +#ifdef PNG_STDIO_SUPPORTED +# include +#endif + +/* This controls optimization of the reading of 16 and 32 bit values + * from PNG files. It can be set on a per-app-file basis - it + * just changes whether a macro is used to the function is called. + * The library builder sets the default, if read functions are not + * built into the library the macro implementation is forced on. + */ +#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED +# define PNG_USE_READ_MACROS +#endif +#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) +# if PNG_DEFAULT_READ_MACROS +# define PNG_USE_READ_MACROS +# endif +#endif + +/* COMPILER SPECIFIC OPTIONS. + * + * These options are provided so that a variety of difficult compilers + * can be used. Some are fixed at build time (e.g. PNG_API_RULE + * below) but still have compiler specific implementations, others + * may be changed on a per-file basis when compiling against libpng. + */ + +/* The PNGARG macro protects us against machines that don't have function + * prototypes (ie K&R style headers). If your compiler does not handle + * function prototypes, define this macro and use the included ansi2knr. + * I've always been able to use _NO_PROTO as the indicator, but you may + * need to drag the empty declaration out in front of here, or change the + * ifdef to suit your own needs. + */ +#ifndef PNGARG + +# ifdef OF /* zlib prototype munger */ +# define PNGARG(arglist) OF(arglist) +# else + +# ifdef _NO_PROTO +# define PNGARG(arglist) () +# else +# define PNGARG(arglist) arglist +# endif /* _NO_PROTO */ + +# endif /* OF */ + +#endif /* PNGARG */ + +/* Function calling conventions. + * ============================= + * Normally it is not necessary to specify to the compiler how to call + * a function - it just does it - however on x86 systems derived from + * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems + * and some others) there are multiple ways to call a function and the + * default can be changed on the compiler command line. For this reason + * libpng specifies the calling convention of every exported function and + * every function called via a user supplied function pointer. This is + * done in this file by defining the following macros: + * + * PNGAPI Calling convention for exported functions. + * PNGCBAPI Calling convention for user provided (callback) functions. + * PNGCAPI Calling convention used by the ANSI-C library (required + * for longjmp callbacks and sometimes used internally to + * specify the calling convention for zlib). + * + * These macros should never be overridden. If it is necessary to + * change calling convention in a private build this can be done + * by setting PNG_API_RULE (which defaults to 0) to one of the values + * below to select the correct 'API' variants. + * + * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. + * This is correct in every known environment. + * PNG_API_RULE=1 Use the operating system convention for PNGAPI and + * the 'C' calling convention (from PNGCAPI) for + * callbacks (PNGCBAPI). This is no longer required + * in any known environment - if it has to be used + * please post an explanation of the problem to the + * libpng mailing list. + * + * These cases only differ if the operating system does not use the C + * calling convention, at present this just means the above cases + * (x86 DOS/Windows sytems) and, even then, this does not apply to + * Cygwin running on those systems. + * + * Note that the value must be defined in pnglibconf.h so that what + * the application uses to call the library matches the conventions + * set when building the library. + */ + +/* Symbol export + * ============= + * When building a shared library it is almost always necessary to tell + * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' + * is used to mark the symbols. On some systems these symbols can be + * extracted at link time and need no special processing by the compiler, + * on other systems the symbols are flagged by the compiler and just + * the declaration requires a special tag applied (unfortunately) in a + * compiler dependent way. Some systems can do either. + * + * A small number of older systems also require a symbol from a DLL to + * be flagged to the program that calls it. This is a problem because + * we do not know in the header file included by application code that + * the symbol will come from a shared library, as opposed to a statically + * linked one. For this reason the application must tell us by setting + * the magic flag PNG_USE_DLL to turn on the special processing before + * it includes png.h. + * + * Four additional macros are used to make this happen: + * + * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from + * the build or imported if PNG_USE_DLL is set - compiler + * and system specific. + * + * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to + * 'type', compiler specific. + * + * PNG_DLL_EXPORT Set to the magic to use during a libpng build to + * make a symbol exported from the DLL. + * + * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come + * from a DLL - used to define PNG_IMPEXP when + * PNG_USE_DLL is set. + */ + +/* System specific discovery. + * ========================== + * This code is used at build time to find PNG_IMPEXP, the API settings + * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL + * import processing is possible. On Windows/x86 systems it also sets + * compiler-specific macros to the values required to change the calling + * conventions of the various functions. + */ +#if ( defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ + defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) ) &&\ + ( defined(_X86_) || defined(_X64_) || defined(_M_IX86) ||\ + defined(_M_X64) || defined(_M_IA64) ) + /* Windows system (DOS doesn't support DLLs) running on x86/x64. Includes + * builds under Cygwin or MinGW. Also includes Watcom builds but these need + * special treatment because they are not compatible with GCC or Visual C + * because of different calling conventions. + */ +# if PNG_API_RULE == 2 + /* If this line results in an error, either because __watcall is not + * understood or because of a redefine just below you cannot use *this* + * build of the library with the compiler you are using. *This* build was + * build using Watcom and applications must also be built using Watcom! + */ +# define PNGCAPI __watcall +# endif + +# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) || defined(__WINSCW__) +# define PNGCAPI __cdecl +# if PNG_API_RULE == 1 +# define PNGAPI __stdcall +# endif +# else + /* An older compiler, or one not detected (erroneously) above, + * if necessary override on the command line to get the correct + * variants for the compiler. + */ +# ifndef PNGCAPI +# define PNGCAPI _cdecl +# endif +# if PNG_API_RULE == 1 && !defined(PNGAPI) +# define PNGAPI _stdcall +# endif +# endif /* compiler/api */ + /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ + +# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) + ERROR: PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed +# endif + +# if (defined(_MSC_VER) && _MSC_VER < 800) ||\ + (defined(__BORLANDC__) && __BORLANDC__ < 0x500) + /* older Borland and MSC + * compilers used '__export' and required this to be after + * the type. + */ +# ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP +# endif +# define PNG_DLL_EXPORT __export +# else /* newer compiler */ +# define PNG_DLL_EXPORT __declspec(dllexport) +# ifndef PNG_DLL_IMPORT +# define PNG_DLL_IMPORT __declspec(dllimport) +# endif +# endif /* compiler */ + +#else /* !Windows/x86 */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# define PNGAPI _System +# else /* !Windows/x86 && !OS/2 */ + /* Use the defaults, or define PNG*API on the command line (but + * this will have to be done for every compile!) + */ +# endif /* other system, !OS/2 */ +#endif /* !Windows/x86 */ + +/* Now do all the defaulting . */ +#ifndef PNGCAPI +# define PNGCAPI +#endif +#ifndef PNGCBAPI +# define PNGCBAPI PNGCAPI +#endif +#ifndef PNGAPI +# define PNGAPI PNGCAPI +#endif + +/* The default for PNG_IMPEXP depends on whether the library is + * being built or used. + */ +#ifndef PNG_IMPEXP +# ifdef PNGLIB_BUILD + /* Building the library */ +# if (defined(DLL_EXPORT)/*from libtool*/ ||\ + defined(_WINDLL) || defined(_DLL) || defined(__DLL__) ||\ + defined(_USRDLL) ||\ + defined(PNG_BUILD_DLL)) && defined(PNG_DLL_EXPORT) + /* Building a DLL. */ +# define PNG_IMPEXP PNG_DLL_EXPORT +# endif /* DLL */ +# else + /* Using the library */ +# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) + /* This forces use of a DLL, disallowing static linking */ +# define PNG_IMPEXP PNG_DLL_IMPORT +# endif +# endif + +# if !defined(PNG_IMPEXP) +# include +# if defined(QT_VISIBILITY_AVAILABLE) +# define PNG_IMPEXP __attribute__((visibility("default"))) +# endif +# endif + +# ifndef PNG_IMPEXP +# define PNG_IMPEXP +# endif +#endif + +/* THe following complexity is concerned with getting the 'attributes' of the + * declared function in the correct place. This potentially requires a separate + * PNG_EXPORT function for every compiler. + */ +#ifndef PNG_FUNCTION +# ifdef __GNUC__ +# define PNG_FUNCTION(type, name, args, attributes)\ + attributes type name args +# else /* !GNUC */ +# ifdef _MSC_VER +# define PNG_FUNCTION(type, name, args, attributes)\ + attributes type name args +# else /* !MSC */ +# define PNG_FUNCTION(type, name, args, attributes)\ + type name args +# endif +# endif +#endif + +#ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type +#endif + + /* The ordinal value is only relevant when preprocessing png.h for symbol + * table entries, so we discard it here. See the .dfn files in the + * scripts directory. + */ +#ifndef PNG_EXPORTA +# define PNG_EXPORTA(ordinal, type, name, args, attributes)\ + extern PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args),\ + attributes) +#endif + +#define PNG_EXPORT(ordinal, type, name, args)\ + PNG_EXPORTA(ordinal, type, name, args, ) + +/* Use PNG_REMOVED to comment out a removed interface. */ +#ifndef PNG_REMOVED +# define PNG_REMOVED(ordinal, type, name, args, attributes) +#endif + +#ifndef PNG_CALLBACK +# define PNG_CALLBACK(type, name, args, attributes)\ + type (PNGCBAPI name) PNGARG(args) attributes +#endif + +/* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. + * + * Added at libpng-1.2.41. + */ + +#ifndef PNG_NO_PEDANTIC_WARNINGS +# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED +# define PNG_PEDANTIC_WARNINGS_SUPPORTED +# endif +#endif + +#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED + /* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. Added at libpng + * version 1.2.41. + */ +# ifdef __GNUC__ +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __attribute__((__noreturn__)) +# endif +# ifndef PNG_PTR_NORETURN +# define PNG_PTR_NORETURN __attribute__((__noreturn__)) +# endif +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __attribute__((__malloc__)) +# endif + + /* This specifically protects structure members that should only be + * accessed from within the library, therefore should be empty during + * a library build. + */ +# ifndef PNGLIB_BUILD +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __attribute__((__deprecated__)) +# endif +# ifndef PNG_DEPSTRUCT +# define PNG_DEPSTRUCT __attribute__((__deprecated__)) +# endif +# ifndef PNG_PRIVATE +# if 0 /* Doesn't work so we use deprecated instead*/ +# define PNG_PRIVATE \ + __attribute__((warning("This function is not exported by libpng."))) +# else +# define PNG_PRIVATE \ + __attribute__((__deprecated__)) +# endif +# endif /* PNG_PRIVATE */ +# endif /* PNGLIB_BUILD */ +# endif /* __GNUC__ */ +# ifdef _MSC_VER /* may need to check value */ +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /*not supported*/ +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __declspec(noreturn) +# endif +# ifndef PNG_PTR_NORETURN +# define PNG_PTR_NORETURN /*not supported*/ +# endif +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __declspec(restrict) +# endif + + /* This specifically protects structure members that should only be + * accessed from within the library, therefore should be empty during + * a library build. + */ +# ifndef PNGLIB_BUILD +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __declspec(deprecated) +# endif +# ifndef PNG_DEPSTRUCT +# define PNG_DEPSTRUCT __declspec(deprecated) +# endif +# ifndef PNG_PRIVATE +# define PNG_PRIVATE __declspec(deprecated) +# endif /* PNG_PRIVATE */ +# endif /* PNGLIB_BUILD */ +# endif /* __GNUC__ */ +#endif /* PNG_PEDANTIC_WARNINGS */ + +#ifndef PNG_DEPRECATED +# define PNG_DEPRECATED /* Use of this function is deprecated */ +#endif +#ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* The result of this function must be checked */ +#endif +#ifndef PNG_NORETURN +# define PNG_NORETURN /* This function does not return */ +#endif +#ifndef PNG_ALLOCATED +# define PNG_ALLOCATED /* The result of the function is new memory */ +#endif +#ifndef PNG_DEPSTRUCT +# define PNG_DEPSTRUCT /* Access to this struct member is deprecated */ +#endif +#ifndef PNG_PRIVATE +# define PNG_PRIVATE /* This is a private libpng function */ +#endif +#ifndef PNG_FP_EXPORT /* A floating point API. */ +# ifdef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FP_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args) +# else /* No floating point APIs */ +# define PNG_FP_EXPORT(ordinal, type, name, args) +# endif +#endif +#ifndef PNG_FIXED_EXPORT /* A fixed point API. */ +# ifdef PNG_FIXED_POINT_SUPPORTED +# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args) +# else /* No fixed point APIs */ +# define PNG_FIXED_EXPORT(ordinal, type, name, args) +# endif +#endif + +/* The following uses const char * instead of char * for error + * and warning message functions, so some compilers won't complain. + * If you do not want to use const, define PNG_NO_CONST here. + * + * This should not change how the APIs are called, so it can be done + * on a per-file basis in the application. + */ +#ifndef PNG_CONST +# ifndef PNG_NO_CONST +# define PNG_CONST const +# else +# define PNG_CONST +# endif +#endif + +/* Some typedefs to get us started. These should be safe on most of the + * common platforms. The typedefs should be at least as large as the + * numbers suggest (a png_uint_32 must be at least 32 bits long), but they + * don't have to be exactly that size. Some compilers dislike passing + * unsigned shorts as function parameters, so you may be better off using + * unsigned int for png_uint_16. + */ + +#if defined(INT_MAX) && (INT_MAX > 0x7ffffffeL) +typedef unsigned int png_uint_32; +typedef int png_int_32; +#else +typedef unsigned long png_uint_32; +typedef long png_int_32; +#endif +typedef unsigned short png_uint_16; +typedef short png_int_16; +typedef unsigned char png_byte; + +#ifdef PNG_NO_SIZE_T +typedef unsigned int png_size_t; +#else +typedef size_t png_size_t; +#endif +#define png_sizeof(x) (sizeof (x)) + +/* The following is needed for medium model support. It cannot be in the + * pngpriv.h header. Needs modification for other compilers besides + * MSC. Model independent support declares all arrays and pointers to be + * large using the far keyword. The zlib version used must also support + * model independent data. As of version zlib 1.0.4, the necessary changes + * have been made in zlib. The USE_FAR_KEYWORD define triggers other + * changes that are needed. (Tim Wegner) + */ + +/* Separate compiler dependencies (problem here is that zlib.h always + * defines FAR. (SJT) + */ +#ifdef __BORLANDC__ +# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) +# define LDATA 1 +# else +# define LDATA 0 +# endif + /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ +# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) +# define PNG_MAX_MALLOC_64K /* only used in build */ +# if (LDATA != 1) +# ifndef FAR +# define FAR __far +# endif +# define USE_FAR_KEYWORD +# endif /* LDATA != 1 */ + /* Possibly useful for moving data out of default segment. + * Uncomment it if you want. Could also define FARDATA as + * const if your compiler supports it. (SJT) +# define FARDATA FAR + */ +# endif /* __WIN32__, __FLAT__, __CYGWIN__ */ +#endif /* __BORLANDC__ */ + + +/* Suggest testing for specific compiler first before testing for + * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, + * making reliance oncertain keywords suspect. (SJT) + */ + +/* MSC Medium model */ +#ifdef FAR +# ifdef M_I86MM +# define USE_FAR_KEYWORD +# define FARDATA FAR +# include +# endif +#endif + +/* SJT: default case */ +#ifndef FAR +# define FAR +#endif + +/* At this point FAR is always defined */ +#ifndef FARDATA +# define FARDATA +#endif + +/* Typedef for floating-point numbers that are converted + * to fixed-point with a multiple of 100,000, e.g., gamma + */ +typedef png_int_32 png_fixed_point; + +/* Add typedefs for pointers */ +typedef void FAR * png_voidp; +typedef PNG_CONST void FAR * png_const_voidp; +typedef png_byte FAR * png_bytep; +typedef PNG_CONST png_byte FAR * png_const_bytep; +typedef png_uint_32 FAR * png_uint_32p; +typedef PNG_CONST png_uint_32 FAR * png_const_uint_32p; +typedef png_int_32 FAR * png_int_32p; +typedef PNG_CONST png_int_32 FAR * png_const_int_32p; +typedef png_uint_16 FAR * png_uint_16p; +typedef PNG_CONST png_uint_16 FAR * png_const_uint_16p; +typedef png_int_16 FAR * png_int_16p; +typedef PNG_CONST png_int_16 FAR * png_const_int_16p; +typedef char FAR * png_charp; +typedef PNG_CONST char FAR * png_const_charp; +typedef png_fixed_point FAR * png_fixed_point_p; +typedef PNG_CONST png_fixed_point FAR * png_const_fixed_point_p; +typedef png_size_t FAR * png_size_tp; +typedef PNG_CONST png_size_t FAR * png_const_size_tp; + +#ifdef PNG_STDIO_SUPPORTED +typedef FILE * png_FILE_p; +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * png_doublep; +typedef PNG_CONST double FAR * png_const_doublep; +#endif + +/* Pointers to pointers; i.e. arrays */ +typedef png_byte FAR * FAR * png_bytepp; +typedef png_uint_32 FAR * FAR * png_uint_32pp; +typedef png_int_32 FAR * FAR * png_int_32pp; +typedef png_uint_16 FAR * FAR * png_uint_16pp; +typedef png_int_16 FAR * FAR * png_int_16pp; +typedef PNG_CONST char FAR * FAR * png_const_charpp; +typedef char FAR * FAR * png_charpp; +typedef png_fixed_point FAR * FAR * png_fixed_point_pp; +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * FAR * png_doublepp; +#endif + +/* Pointers to pointers to pointers; i.e., pointer to array */ +typedef char FAR * FAR * FAR * png_charppp; + +/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, + * and no smaller than png_uint_32. Casts from png_size_t or png_uint_32 + * to png_alloc_size_t are not necessary; in fact, it is recommended + * not to use them at all so that the compiler can complain when something + * turns out to be problematic. + * Casts in the other direction (from png_alloc_size_t to png_size_t or + * png_uint_32) should be explicitly applied; however, we do not expect + * to encounter practical situations that require such conversions. + */ +#if defined(__TURBOC__) && !defined(__FLAT__) + typedef unsigned long png_alloc_size_t; +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + typedef unsigned long png_alloc_size_t; +# else + /* This is an attempt to detect an old Windows system where (int) is + * actually 16 bits, in that case png_malloc must have an argument with a + * bigger size to accomodate the requirements of the library. + */ +# if (defined(_Windows) || defined(_WINDOWS) || defined(_WINDOWS_)) && \ + (!defined(INT_MAX) || INT_MAX <= 0x7ffffffeL) + typedef DWORD png_alloc_size_t; +# else + typedef png_size_t png_alloc_size_t; +# endif +# endif +#endif + +#endif /* PNGCONF_H */ diff --git a/src/3rdparty/libpng/pngdebug.h b/src/3rdparty/libpng/pngdebug.h new file mode 100644 index 0000000000..16f81fdd14 --- /dev/null +++ b/src/3rdparty/libpng/pngdebug.h @@ -0,0 +1,157 @@ + +/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* Define PNG_DEBUG at compile time for debugging information. Higher + * numbers for PNG_DEBUG mean more debugging information. This has + * only been added since version 0.95 so it is not implemented throughout + * libpng yet, but more support will be added as needed. + * + * png_debug[1-2]?(level, message ,arg{0-2}) + * Expands to a statement (either a simple expression or a compound + * do..while(0) statement) that outputs a message with parameter + * substitution if PNG_DEBUG is defined to 2 or more. If PNG_DEBUG + * is undefined, 0 or 1 every png_debug expands to a simple expression + * (actually ((void)0)). + * + * level: level of detail of message, starting at 0. A level 'n' + * message is preceded by 'n' tab characters (not implemented + * on Microsoft compilers unless PNG_DEBUG_FILE is also + * defined, to allow debug DLL compilation with no standard IO). + * message: a printf(3) style text string. A trailing '\n' is added + * to the message. + * arg: 0 to 2 arguments for printf(3) style substitution in message. + */ +#ifndef PNGDEBUG_H +#define PNGDEBUG_H +/* These settings control the formatting of messages in png.c and pngerror.c */ +/* Moved to pngdebug.h at 1.5.0 */ +# ifndef PNG_LITERAL_SHARP +# define PNG_LITERAL_SHARP 0x23 +# endif +# ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET +# define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b +# endif +# ifndef PNG_LITERAL_RIGHT_SQUARE_BRACKET +# define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d +# endif +# ifndef PNG_STRING_NEWLINE +# define PNG_STRING_NEWLINE "\n" +# endif + +#ifdef PNG_DEBUG +# if (PNG_DEBUG > 0) +# if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) +# include +# if (PNG_DEBUG > 1) +# ifndef _DEBUG +# define _DEBUG +# endif +# ifndef png_debug +# define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) +# endif +# endif +# else /* PNG_DEBUG_FILE || !_MSC_VER */ +# ifndef PNG_STDIO_SUPPORTED +# include /* not included yet */ +# endif +# ifndef PNG_DEBUG_FILE +# define PNG_DEBUG_FILE stderr +# endif /* PNG_DEBUG_FILE */ + +# if (PNG_DEBUG > 1) +/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on + * non-ISO compilers + */ +# ifdef __STDC__ +# ifndef png_debug +# define png_debug(l,m) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ + } while (0) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ + } while (0) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + do { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ + } while (0) +# endif +# else /* __STDC __ */ +# ifndef png_debug +# define png_debug(l,m) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format); \ + } while (0) +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1); \ + } while (0) +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + do { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1,p2); \ + } while (0) +# endif +# endif /* __STDC __ */ +# endif /* (PNG_DEBUG > 1) */ + +# endif /* _MSC_VER */ +# endif /* (PNG_DEBUG > 0) */ +#endif /* PNG_DEBUG */ +#ifndef png_debug +# define png_debug(l, m) ((void)0) +#endif +#ifndef png_debug1 +# define png_debug1(l, m, p1) ((void)0) +#endif +#ifndef png_debug2 +# define png_debug2(l, m, p1, p2) ((void)0) +#endif +#endif /* PNGDEBUG_H */ diff --git a/src/3rdparty/libpng/pngerror.c b/src/3rdparty/libpng/pngerror.c new file mode 100644 index 0000000000..8290bb4106 --- /dev/null +++ b/src/3rdparty/libpng/pngerror.c @@ -0,0 +1,447 @@ + +/* pngerror.c - stub functions for i/o and memory allocation + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file provides a location for all error handling. Users who + * need special error handling are expected to write replacement functions + * and use png_set_error_fn() to use those functions. See the instructions + * at each function. + */ + +#include "pngpriv.h" + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +static PNG_FUNCTION(void, png_default_error,PNGARG((png_structp png_ptr, + png_const_charp error_message)),PNG_NORETURN); + +#ifdef PNG_WARNINGS_SUPPORTED +static void /* PRIVATE */ +png_default_warning PNGARG((png_structp png_ptr, + png_const_charp warning_message)); +#endif /* PNG_WARNINGS_SUPPORTED */ + +/* This function is called whenever there is a fatal error. This function + * should not be changed. If there is a need to handle errors differently, + * you should supply a replacement error function and use png_set_error_fn() + * to replace the error function at run-time. + */ +#ifdef PNG_ERROR_TEXT_SUPPORTED +PNG_FUNCTION(void,PNGAPI +png_error,(png_structp png_ptr, png_const_charp error_message),PNG_NORETURN) +{ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + char msg[16]; + if (png_ptr != NULL) + { + if (png_ptr->flags& + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) + { + if (*error_message == PNG_LITERAL_SHARP) + { + /* Strip "#nnnn " from beginning of error message. */ + int offset; + for (offset = 1; offset<15; offset++) + if (error_message[offset] == ' ') + break; + + if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + { + int i; + for (i = 0; i < offset - 1; i++) + msg[i] = error_message[i + 1]; + msg[i - 1] = '\0'; + error_message = msg; + } + + else + error_message += offset; + } + + else + { + if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + { + msg[0] = '0'; + msg[1] = '\0'; + error_message = msg; + } + } + } + } +#endif + if (png_ptr != NULL && png_ptr->error_fn != NULL) + (*(png_ptr->error_fn))(png_ptr, error_message); + + /* If the custom handler doesn't exist, or if it returns, + use the default handler, which will not return. */ + png_default_error(png_ptr, error_message); +} +#else +PNG_FUNCTION(void,PNGAPI +png_err,(png_structp png_ptr),PNG_NORETURN) +{ + if (png_ptr != NULL && png_ptr->error_fn != NULL) + (*(png_ptr->error_fn))(png_ptr, '\0'); + + /* If the custom handler doesn't exist, or if it returns, + use the default handler, which will not return. */ + png_default_error(png_ptr, '\0'); +} +#endif /* PNG_ERROR_TEXT_SUPPORTED */ + +#ifdef PNG_WARNINGS_SUPPORTED +/* This function is called whenever there is a non-fatal error. This function + * should not be changed. If there is a need to handle warnings differently, + * you should supply a replacement warning function and use + * png_set_error_fn() to replace the warning function at run-time. + */ +void PNGAPI +png_warning(png_structp png_ptr, png_const_charp warning_message) +{ + int offset = 0; + if (png_ptr != NULL) + { +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (png_ptr->flags& + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) +#endif + { + if (*warning_message == PNG_LITERAL_SHARP) + { + for (offset = 1; offset < 15; offset++) + if (warning_message[offset] == ' ') + break; + } + } + } + if (png_ptr != NULL && png_ptr->warning_fn != NULL) + (*(png_ptr->warning_fn))(png_ptr, warning_message + offset); + else + png_default_warning(png_ptr, warning_message + offset); +} +#endif /* PNG_WARNINGS_SUPPORTED */ + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED +void PNGAPI +png_benign_error(png_structp png_ptr, png_const_charp error_message) +{ + if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) + png_warning(png_ptr, error_message); + else + png_error(png_ptr, error_message); +} +#endif + +/* These utilities are used internally to build an error message that relates + * to the current chunk. The chunk name comes from png_ptr->chunk_name, + * this is used to prefix the message. The message is limited in length + * to 63 bytes, the name characters are output as hex digits wrapped in [] + * if the character is invalid. + */ +#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) +static PNG_CONST char png_digit[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F' +}; + +#define PNG_MAX_ERROR_TEXT 64 +#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED) +static void /* PRIVATE */ +png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp + error_message) +{ + int iout = 0, iin = 0; + + while (iin < 4) + { + int c = png_ptr->chunk_name[iin++]; + if (isnonalpha(c)) + { + buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET; + buffer[iout++] = png_digit[(c & 0xf0) >> 4]; + buffer[iout++] = png_digit[c & 0x0f]; + buffer[iout++] = PNG_LITERAL_RIGHT_SQUARE_BRACKET; + } + + else + { + buffer[iout++] = (png_byte)c; + } + } + + if (error_message == NULL) + buffer[iout] = '\0'; + + else + { + buffer[iout++] = ':'; + buffer[iout++] = ' '; + png_memcpy(buffer + iout, error_message, PNG_MAX_ERROR_TEXT); + buffer[iout + PNG_MAX_ERROR_TEXT - 1] = '\0'; + } +} +#endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */ + +#if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) +PNG_FUNCTION(void,PNGAPI +png_chunk_error,(png_structp png_ptr, png_const_charp error_message), + PNG_NORETURN) +{ + char msg[18+PNG_MAX_ERROR_TEXT]; + if (png_ptr == NULL) + png_error(png_ptr, error_message); + + else + { + png_format_buffer(png_ptr, msg, error_message); + png_error(png_ptr, msg); + } +} +#endif /* PNG_READ_SUPPORTED && PNG_ERROR_TEXT_SUPPORTED */ + +#ifdef PNG_WARNINGS_SUPPORTED +void PNGAPI +png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) +{ + char msg[18+PNG_MAX_ERROR_TEXT]; + if (png_ptr == NULL) + png_warning(png_ptr, warning_message); + + else + { + png_format_buffer(png_ptr, msg, warning_message); + png_warning(png_ptr, msg); + } +} +#endif /* PNG_WARNINGS_SUPPORTED */ + +#ifdef PNG_READ_SUPPORTED +#ifdef PNG_BENIGN_ERRORS_SUPPORTED +void PNGAPI +png_chunk_benign_error(png_structp png_ptr, png_const_charp error_message) +{ + if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) + png_chunk_warning(png_ptr, error_message); + + else + png_chunk_error(png_ptr, error_message); +} +#endif +#endif /* PNG_READ_SUPPORTED */ + +#ifdef PNG_ERROR_TEXT_SUPPORTED +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_FUNCTION(void, +png_fixed_error,(png_structp png_ptr, png_const_charp name),PNG_NORETURN) +{ +# define fixed_message "fixed point overflow in " +# define fixed_message_ln ((sizeof fixed_message)-1) + int iin; + char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT]; + png_memcpy(msg, fixed_message, fixed_message_ln); + iin = 0; + if (name != NULL) while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0) + { + msg[fixed_message_ln + iin] = name[iin]; + ++iin; + } + msg[fixed_message_ln + iin] = 0; + png_error(png_ptr, msg); +} +#endif +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This API only exists if ANSI-C style error handling is used, + * otherwise it is necessary for png_default_error to be overridden. + */ +jmp_buf* PNGAPI +png_set_longjmp_fn(png_structp png_ptr, png_longjmp_ptr longjmp_fn, + size_t jmp_buf_size) +{ + if (png_ptr == NULL || jmp_buf_size != png_sizeof(jmp_buf)) + return NULL; + + png_ptr->longjmp_fn = longjmp_fn; + return &png_ptr->png_jmpbuf; +} +#endif + +/* This is the default error handling function. Note that replacements for + * this function MUST NOT RETURN, or the program will likely crash. This + * function is used by default, or if the program supplies NULL for the + * error function pointer in png_set_error_fn(). + */ +static PNG_FUNCTION(void /* PRIVATE */, +png_default_error,(png_structp png_ptr, png_const_charp error_message), + PNG_NORETURN) +{ +#ifdef PNG_CONSOLE_IO_SUPPORTED +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (*error_message == PNG_LITERAL_SHARP) + { + /* Strip "#nnnn " from beginning of error message. */ + int offset; + char error_number[16]; + for (offset = 0; offset<15; offset++) + { + error_number[offset] = error_message[offset + 1]; + if (error_message[offset] == ' ') + break; + } + + if ((offset > 1) && (offset < 15)) + { + error_number[offset - 1] = '\0'; + fprintf(stderr, "libpng error no. %s: %s", + error_number, error_message + offset + 1); + fprintf(stderr, PNG_STRING_NEWLINE); + } + + else + { + fprintf(stderr, "libpng error: %s, offset=%d", + error_message, offset); + fprintf(stderr, PNG_STRING_NEWLINE); + } + } + else +#endif + { + fprintf(stderr, "libpng error: %s", error_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } +#endif +#ifndef PNG_CONSOLE_IO_SUPPORTED + PNG_UNUSED(error_message) /* Make compiler happy */ +#endif + png_longjmp(png_ptr, 1); +} + +PNG_FUNCTION(void,PNGAPI +png_longjmp,(png_structp png_ptr, int val),PNG_NORETURN) +{ +#ifdef PNG_SETJMP_SUPPORTED + if (png_ptr && png_ptr->longjmp_fn) + { +# ifdef USE_FAR_KEYWORD + { + jmp_buf png_jmpbuf; + png_memcpy(png_jmpbuf, png_ptr->png_jmpbuf, png_sizeof(jmp_buf)); + png_ptr->longjmp_fn(png_jmpbuf, val); + } + +# else + png_ptr->longjmp_fn(png_ptr->png_jmpbuf, val); +# endif + } +#endif + /* Here if not setjmp support or if png_ptr is null. */ + PNG_ABORT(); +} + +#ifdef PNG_WARNINGS_SUPPORTED +/* This function is called when there is a warning, but the library thinks + * it can continue anyway. Replacement functions don't have to do anything + * here if you don't want them to. In the default configuration, png_ptr is + * not used, but it is passed in case it may be useful. + */ +static void /* PRIVATE */ +png_default_warning(png_structp png_ptr, png_const_charp warning_message) +{ +#ifdef PNG_CONSOLE_IO_SUPPORTED +# ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (*warning_message == PNG_LITERAL_SHARP) + { + int offset; + char warning_number[16]; + for (offset = 0; offset < 15; offset++) + { + warning_number[offset] = warning_message[offset + 1]; + if (warning_message[offset] == ' ') + break; + } + + if ((offset > 1) && (offset < 15)) + { + warning_number[offset + 1] = '\0'; + fprintf(stderr, "libpng warning no. %s: %s", + warning_number, warning_message + offset); + fprintf(stderr, PNG_STRING_NEWLINE); + } + + else + { + fprintf(stderr, "libpng warning: %s", + warning_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } + } + else +# endif + + { + fprintf(stderr, "libpng warning: %s", warning_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } +#else + PNG_UNUSED(warning_message) /* Make compiler happy */ +#endif + PNG_UNUSED(png_ptr) /* Make compiler happy */ +} +#endif /* PNG_WARNINGS_SUPPORTED */ + +/* This function is called when the application wants to use another method + * of handling errors and warnings. Note that the error function MUST NOT + * return to the calling routine or serious problems will occur. The return + * method used in the default routine calls longjmp(png_ptr->png_jmpbuf, 1) + */ +void PNGAPI +png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warning_fn) +{ + if (png_ptr == NULL) + return; + + png_ptr->error_ptr = error_ptr; + png_ptr->error_fn = error_fn; + png_ptr->warning_fn = warning_fn; +} + + +/* This function returns a pointer to the error_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy and png_read_destroy are called. + */ +png_voidp PNGAPI +png_get_error_ptr(png_const_structp png_ptr) +{ + if (png_ptr == NULL) + return NULL; + + return ((png_voidp)png_ptr->error_ptr); +} + + +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +void PNGAPI +png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) +{ + if (png_ptr != NULL) + { + png_ptr->flags &= + ((~(PNG_FLAG_STRIP_ERROR_NUMBERS | + PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); + } +} +#endif +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngget.c b/src/3rdparty/libpng/pngget.c new file mode 100644 index 0000000000..b5e5798c02 --- /dev/null +++ b/src/3rdparty/libpng/pngget.c @@ -0,0 +1,1032 @@ + +/* pngget.c - retrieval of values from info struct + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + */ + +#include "pngpriv.h" + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +png_uint_32 PNGAPI +png_get_valid(png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 flag) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->valid & flag); + + return(0); +} + +png_size_t PNGAPI +png_get_rowbytes(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->rowbytes); + + return(0); +} + +#ifdef PNG_INFO_IMAGE_SUPPORTED +png_bytepp PNGAPI +png_get_rows(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->row_pointers); + + return(0); +} +#endif + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Easy access to info, added in libpng-0.99 */ +png_uint_32 PNGAPI +png_get_image_width(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->width; + + return (0); +} + +png_uint_32 PNGAPI +png_get_image_height(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->height; + + return (0); +} + +png_byte PNGAPI +png_get_bit_depth(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->bit_depth; + + return (0); +} + +png_byte PNGAPI +png_get_color_type(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->color_type; + + return (0); +} + +png_byte PNGAPI +png_get_filter_type(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->filter_type; + + return (0); +} + +png_byte PNGAPI +png_get_interlace_type(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->interlace_type; + + return (0); +} + +png_byte PNGAPI +png_get_compression_type(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->compression_type; + + return (0); +} + +png_uint_32 PNGAPI +png_get_x_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_pHYs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", + "png_get_x_pixels_per_meter"); + + if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) + return (info_ptr->x_pixels_per_unit); + } +#endif + + return (0); +} + +png_uint_32 PNGAPI +png_get_y_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_pHYs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", + "png_get_y_pixels_per_meter"); + + if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) + return (info_ptr->y_pixels_per_unit); + } +#endif + + return (0); +} + +png_uint_32 PNGAPI +png_get_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_pHYs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter"); + + if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER && + info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit) + return (info_ptr->x_pixels_per_unit); + } +#endif + + return (0); +} + +#ifdef PNG_FLOATING_POINT_SUPPORTED +float PNGAPI +png_get_pixel_aspect_ratio(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_READ_pHYs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio"); + + if (info_ptr->x_pixels_per_unit != 0) + return ((float)((float)info_ptr->y_pixels_per_unit + /(float)info_ptr->x_pixels_per_unit)); + } +#endif + + return ((float)0.0); +} +#endif + +#ifdef PNG_FIXED_POINT_SUPPORTED +png_fixed_point PNGAPI +png_get_pixel_aspect_ratio_fixed(png_const_structp png_ptr, + png_const_infop info_ptr) +{ +#ifdef PNG_READ_pHYs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs) + && info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 + && info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX + && info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX) + { + png_fixed_point res; + + png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio_fixed"); + + /* The following casts work because a PNG 4 byte integer only has a valid + * range of 0..2^31-1; otherwise the cast might overflow. + */ + if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1, + (png_int_32)info_ptr->x_pixels_per_unit)) + return res; + } +#endif + + return 0; +} +#endif + +png_int_32 PNGAPI +png_get_x_offset_microns(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_oFFs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + { + png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); + + if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) + return (info_ptr->x_offset); + } +#endif + + return (0); +} + +png_int_32 PNGAPI +png_get_y_offset_microns(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_oFFs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + { + png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); + + if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) + return (info_ptr->y_offset); + } +#endif + + return (0); +} + +png_int_32 PNGAPI +png_get_x_offset_pixels(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_oFFs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + { + png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels"); + + if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) + return (info_ptr->x_offset); + } +#endif + + return (0); +} + +png_int_32 PNGAPI +png_get_y_offset_pixels(png_const_structp png_ptr, png_const_infop info_ptr) +{ +#ifdef PNG_oFFs_SUPPORTED + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + { + png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels"); + + if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) + return (info_ptr->y_offset); + } +#endif + + return (0); +} + +#ifdef PNG_INCH_CONVERSIONS_SUPPORTED +static png_uint_32 +ppi_from_ppm(png_uint_32 ppm) +{ +#if 0 + /* The conversion is *(2.54/100), in binary (32 digits): + * .00000110100000001001110101001001 + */ + png_uint_32 t1001, t1101; + ppm >>= 1; /* .1 */ + t1001 = ppm + (ppm >> 3); /* .1001 */ + t1101 = t1001 + (ppm >> 1); /* .1101 */ + ppm >>= 20; /* .000000000000000000001 */ + t1101 += t1101 >> 15; /* .1101000000000001101 */ + t1001 >>= 11; /* .000000000001001 */ + t1001 += t1001 >> 12; /* .000000000001001000000001001 */ + ppm += t1001; /* .000000000001001000001001001 */ + ppm += t1101; /* .110100000001001110101001001 */ + return (ppm + 16) >> 5;/* .00000110100000001001110101001001 */ +#else + /* The argument is a PNG unsigned integer, so it is not permitted + * to be bigger than 2^31. + */ + png_fixed_point result; + if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127, + 5000)) + return result; + + /* Overflow. */ + return 0; +#endif +} + +png_uint_32 PNGAPI +png_get_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr) +{ + return ppi_from_ppm(png_get_pixels_per_meter(png_ptr, info_ptr)); +} + +png_uint_32 PNGAPI +png_get_x_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr) +{ + return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr, info_ptr)); +} + +png_uint_32 PNGAPI +png_get_y_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr) +{ + return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr, info_ptr)); +} + +#ifdef PNG_FIXED_POINT_SUPPORTED +static png_fixed_point +png_fixed_inches_from_microns(png_structp png_ptr, png_int_32 microns) +{ + /* Convert from metres * 1,000,000 to inches * 100,000, meters to + * inches is simply *(100/2.54), so we want *(10/2.54) == 500/127. + * Notice that this can overflow - a warning is output and 0 is + * returned. + */ + return png_muldiv_warn(png_ptr, microns, 500, 127); +} + +png_fixed_point PNGAPI +png_get_x_offset_inches_fixed(png_structp png_ptr, + png_const_infop info_ptr) +{ + return png_fixed_inches_from_microns(png_ptr, + png_get_x_offset_microns(png_ptr, info_ptr)); +} +#endif + +#ifdef PNG_FIXED_POINT_SUPPORTED +png_fixed_point PNGAPI +png_get_y_offset_inches_fixed(png_structp png_ptr, + png_const_infop info_ptr) +{ + return png_fixed_inches_from_microns(png_ptr, + png_get_y_offset_microns(png_ptr, info_ptr)); +} +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +float PNGAPI +png_get_x_offset_inches(png_const_structp png_ptr, png_const_infop info_ptr) +{ + /* To avoid the overflow do the conversion directly in floating + * point. + */ + return (float)(png_get_x_offset_microns(png_ptr, info_ptr) * .00003937); +} +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +float PNGAPI +png_get_y_offset_inches(png_const_structp png_ptr, png_const_infop info_ptr) +{ + /* To avoid the overflow do the conversion directly in floating + * point. + */ + return (float)(png_get_y_offset_microns(png_ptr, info_ptr) * .00003937); +} +#endif + +#ifdef PNG_pHYs_SUPPORTED +png_uint_32 PNGAPI +png_get_pHYs_dpi(png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) +{ + png_uint_32 retval = 0; + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", "pHYs"); + + if (res_x != NULL) + { + *res_x = info_ptr->x_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + + if (res_y != NULL) + { + *res_y = info_ptr->y_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + + if (unit_type != NULL) + { + *unit_type = (int)info_ptr->phys_unit_type; + retval |= PNG_INFO_pHYs; + + if (*unit_type == 1) + { + if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); + if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); + } + } + } + + return (retval); +} +#endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ + +/* png_get_channels really belongs in here, too, but it's been around longer */ + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +png_byte PNGAPI +png_get_channels(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->channels); + + return (0); +} + +png_const_bytep PNGAPI +png_get_signature(png_const_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->signature); + + return (NULL); +} + +#ifdef PNG_bKGD_SUPPORTED +png_uint_32 PNGAPI +png_get_bKGD(png_const_structp png_ptr, png_infop info_ptr, + png_color_16p *background) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) + && background != NULL) + { + png_debug1(1, "in %s retrieval function", "bKGD"); + + *background = &(info_ptr->background); + return (PNG_INFO_bKGD); + } + + return (0); +} +#endif + +#ifdef PNG_cHRM_SUPPORTED +# ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_cHRM(png_const_structp png_ptr, png_const_infop info_ptr, + double *white_x, double *white_y, double *red_x, double *red_y, + double *green_x, double *green_y, double *blue_x, double *blue_y) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + { + png_debug1(1, "in %s retrieval function", "cHRM"); + + if (white_x != NULL) + *white_x = png_float(png_ptr, info_ptr->x_white, "cHRM white X"); + if (white_y != NULL) + *white_y = png_float(png_ptr, info_ptr->y_white, "cHRM white Y"); + if (red_x != NULL) + *red_x = png_float(png_ptr, info_ptr->x_red, "cHRM red X"); + if (red_y != NULL) + *red_y = png_float(png_ptr, info_ptr->y_red, "cHRM red Y"); + if (green_x != NULL) + *green_x = png_float(png_ptr, info_ptr->x_green, "cHRM green X"); + if (green_y != NULL) + *green_y = png_float(png_ptr, info_ptr->y_green, "cHRM green Y"); + if (blue_x != NULL) + *blue_x = png_float(png_ptr, info_ptr->x_blue, "cHRM blue X"); + if (blue_y != NULL) + *blue_y = png_float(png_ptr, info_ptr->y_blue, "cHRM blue Y"); + return (PNG_INFO_cHRM); + } + + return (0); +} +# endif + +# ifdef PNG_FIXED_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_cHRM_fixed(png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, + png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, + png_fixed_point *blue_x, png_fixed_point *blue_y) +{ + png_debug1(1, "in %s retrieval function", "cHRM"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + { + if (white_x != NULL) + *white_x = info_ptr->x_white; + if (white_y != NULL) + *white_y = info_ptr->y_white; + if (red_x != NULL) + *red_x = info_ptr->x_red; + if (red_y != NULL) + *red_y = info_ptr->y_red; + if (green_x != NULL) + *green_x = info_ptr->x_green; + if (green_y != NULL) + *green_y = info_ptr->y_green; + if (blue_x != NULL) + *blue_x = info_ptr->x_blue; + if (blue_y != NULL) + *blue_y = info_ptr->y_blue; + return (PNG_INFO_cHRM); + } + + return (0); +} +# endif +#endif + +#ifdef PNG_gAMA_SUPPORTED +png_uint_32 PNGFAPI +png_get_gAMA_fixed(png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *file_gamma) +{ + png_debug1(1, "in %s retrieval function", "gAMA"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) + && file_gamma != NULL) + { + *file_gamma = info_ptr->gamma; + return (PNG_INFO_gAMA); + } + + return (0); +} +# ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_gAMA(png_const_structp png_ptr, png_const_infop info_ptr, + double *file_gamma) +{ + png_fixed_point igamma; + png_uint_32 ok = png_get_gAMA_fixed(png_ptr, info_ptr, &igamma); + + if (ok) + *file_gamma = png_float(png_ptr, igamma, "png_get_gAMA"); + + return ok; +} + +# endif +#endif + +#ifdef PNG_sRGB_SUPPORTED +png_uint_32 PNGAPI +png_get_sRGB(png_const_structp png_ptr, png_const_infop info_ptr, + int *file_srgb_intent) +{ + png_debug1(1, "in %s retrieval function", "sRGB"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) + && file_srgb_intent != NULL) + { + *file_srgb_intent = (int)info_ptr->srgb_intent; + return (PNG_INFO_sRGB); + } + + return (0); +} +#endif + +#ifdef PNG_iCCP_SUPPORTED +png_uint_32 PNGAPI +png_get_iCCP(png_const_structp png_ptr, png_const_infop info_ptr, + png_charpp name, int *compression_type, + png_bytepp profile, png_uint_32 *proflen) +{ + png_debug1(1, "in %s retrieval function", "iCCP"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) + && name != NULL && profile != NULL && proflen != NULL) + { + *name = info_ptr->iccp_name; + *profile = info_ptr->iccp_profile; + /* Compression_type is a dummy so the API won't have to change + * if we introduce multiple compression types later. + */ + *proflen = (int)info_ptr->iccp_proflen; + *compression_type = (int)info_ptr->iccp_compression; + return (PNG_INFO_iCCP); + } + + return (0); +} +#endif + +#ifdef PNG_sPLT_SUPPORTED +png_uint_32 PNGAPI +png_get_sPLT(png_const_structp png_ptr, png_const_infop info_ptr, + png_sPLT_tpp spalettes) +{ + if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) + { + *spalettes = info_ptr->splt_palettes; + return ((png_uint_32)info_ptr->splt_palettes_num); + } + + return (0); +} +#endif + +#ifdef PNG_hIST_SUPPORTED +png_uint_32 PNGAPI +png_get_hIST(png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_16p *hist) +{ + png_debug1(1, "in %s retrieval function", "hIST"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) + && hist != NULL) + { + *hist = info_ptr->hist; + return (PNG_INFO_hIST); + } + + return (0); +} +#endif + +png_uint_32 PNGAPI +png_get_IHDR(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *width, png_uint_32 *height, int *bit_depth, + int *color_type, int *interlace_type, int *compression_type, + int *filter_type) + +{ + png_debug1(1, "in %s retrieval function", "IHDR"); + + if (png_ptr == NULL || info_ptr == NULL || width == NULL || + height == NULL || bit_depth == NULL || color_type == NULL) + return (0); + + *width = info_ptr->width; + *height = info_ptr->height; + *bit_depth = info_ptr->bit_depth; + *color_type = info_ptr->color_type; + + if (compression_type != NULL) + *compression_type = info_ptr->compression_type; + + if (filter_type != NULL) + *filter_type = info_ptr->filter_type; + + if (interlace_type != NULL) + *interlace_type = info_ptr->interlace_type; + + /* This is redundant if we can be sure that the info_ptr values were all + * assigned in png_set_IHDR(). We do the check anyhow in case an + * application has ignored our advice not to mess with the members + * of info_ptr directly. + */ + png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height, + info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type, + info_ptr->compression_type, info_ptr->filter_type); + + return (1); +} + +#ifdef PNG_oFFs_SUPPORTED +png_uint_32 PNGAPI +png_get_oFFs(png_const_structp png_ptr, png_const_infop info_ptr, + png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) +{ + png_debug1(1, "in %s retrieval function", "oFFs"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) + && offset_x != NULL && offset_y != NULL && unit_type != NULL) + { + *offset_x = info_ptr->x_offset; + *offset_y = info_ptr->y_offset; + *unit_type = (int)info_ptr->offset_unit_type; + return (PNG_INFO_oFFs); + } + + return (0); +} +#endif + +#ifdef PNG_pCAL_SUPPORTED +png_uint_32 PNGAPI +png_get_pCAL(png_const_structp png_ptr, png_const_infop info_ptr, + png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, + png_charp *units, png_charpp *params) +{ + png_debug1(1, "in %s retrieval function", "pCAL"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) + && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && + nparams != NULL && units != NULL && params != NULL) + { + *purpose = info_ptr->pcal_purpose; + *X0 = info_ptr->pcal_X0; + *X1 = info_ptr->pcal_X1; + *type = (int)info_ptr->pcal_type; + *nparams = (int)info_ptr->pcal_nparams; + *units = info_ptr->pcal_units; + *params = info_ptr->pcal_params; + return (PNG_INFO_pCAL); + } + + return (0); +} +#endif + +#ifdef PNG_sCAL_SUPPORTED +# ifdef PNG_FIXED_POINT_SUPPORTED +# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED +png_uint_32 PNGAPI +png_get_sCAL_fixed(png_structp png_ptr, png_const_infop info_ptr, + int *unit, png_fixed_point *width, png_fixed_point *height) +{ + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + /*TODO: make this work without FP support */ + *width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width"); + *height = png_fixed(png_ptr, atof(info_ptr->scal_s_height), + "sCAL height"); + return (PNG_INFO_sCAL); + } + + return(0); +} +# endif /* FLOATING_ARITHMETIC */ +# endif /* FIXED_POINT */ +# ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_sCAL(png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, double *width, double *height) +{ + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + *width = atof(info_ptr->scal_s_width); + *height = atof(info_ptr->scal_s_height); + return (PNG_INFO_sCAL); + } + + return(0); +} +# endif /* FLOATING POINT */ +png_uint_32 PNGAPI +png_get_sCAL_s(png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, png_charpp width, png_charpp height) +{ + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + *width = info_ptr->scal_s_width; + *height = info_ptr->scal_s_height; + return (PNG_INFO_sCAL); + } + + return(0); +} +#endif /* sCAL */ + +#ifdef PNG_pHYs_SUPPORTED +png_uint_32 PNGAPI +png_get_pHYs(png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) +{ + png_uint_32 retval = 0; + + png_debug1(1, "in %s retrieval function", "pHYs"); + + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs)) + { + if (res_x != NULL) + { + *res_x = info_ptr->x_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + + if (res_y != NULL) + { + *res_y = info_ptr->y_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + + if (unit_type != NULL) + { + *unit_type = (int)info_ptr->phys_unit_type; + retval |= PNG_INFO_pHYs; + } + } + + return (retval); +} +#endif /* pHYs */ + +png_uint_32 PNGAPI +png_get_PLTE(png_const_structp png_ptr, png_const_infop info_ptr, + png_colorp *palette, int *num_palette) +{ + png_debug1(1, "in %s retrieval function", "PLTE"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) + && palette != NULL) + { + *palette = info_ptr->palette; + *num_palette = info_ptr->num_palette; + png_debug1(3, "num_palette = %d", *num_palette); + return (PNG_INFO_PLTE); + } + + return (0); +} + +#ifdef PNG_sBIT_SUPPORTED +png_uint_32 PNGAPI +png_get_sBIT(png_const_structp png_ptr, png_infop info_ptr, + png_color_8p *sig_bit) +{ + png_debug1(1, "in %s retrieval function", "sBIT"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) + && sig_bit != NULL) + { + *sig_bit = &(info_ptr->sig_bit); + return (PNG_INFO_sBIT); + } + + return (0); +} +#endif + +#ifdef PNG_TEXT_SUPPORTED +png_uint_32 PNGAPI +png_get_text(png_const_structp png_ptr, png_const_infop info_ptr, + png_textp *text_ptr, int *num_text) +{ + if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) + { + png_debug1(1, "in %s retrieval function", + (png_ptr->chunk_name[0] == '\0' ? "text" : + (png_const_charp)png_ptr->chunk_name)); + + if (text_ptr != NULL) + *text_ptr = info_ptr->text; + + if (num_text != NULL) + *num_text = info_ptr->num_text; + + return ((png_uint_32)info_ptr->num_text); + } + + if (num_text != NULL) + *num_text = 0; + + return(0); +} +#endif + +#ifdef PNG_tIME_SUPPORTED +png_uint_32 PNGAPI +png_get_tIME(png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time) +{ + png_debug1(1, "in %s retrieval function", "tIME"); + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) + && mod_time != NULL) + { + *mod_time = &(info_ptr->mod_time); + return (PNG_INFO_tIME); + } + + return (0); +} +#endif + +#ifdef PNG_tRNS_SUPPORTED +png_uint_32 PNGAPI +png_get_tRNS(png_const_structp png_ptr, png_infop info_ptr, + png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color) +{ + png_uint_32 retval = 0; + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + png_debug1(1, "in %s retrieval function", "tRNS"); + + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (trans_alpha != NULL) + { + *trans_alpha = info_ptr->trans_alpha; + retval |= PNG_INFO_tRNS; + } + + if (trans_color != NULL) + *trans_color = &(info_ptr->trans_color); + } + + else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ + { + if (trans_color != NULL) + { + *trans_color = &(info_ptr->trans_color); + retval |= PNG_INFO_tRNS; + } + + if (trans_alpha != NULL) + *trans_alpha = NULL; + } + + if (num_trans != NULL) + { + *num_trans = info_ptr->num_trans; + retval |= PNG_INFO_tRNS; + } + } + + return (retval); +} +#endif + +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +int PNGAPI +png_get_unknown_chunks(png_const_structp png_ptr, png_const_infop info_ptr, + png_unknown_chunkpp unknowns) +{ + if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) + { + *unknowns = info_ptr->unknown_chunks; + return info_ptr->unknown_chunks_num; + } + + return (0); +} +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +png_byte PNGAPI +png_get_rgb_to_gray_status (png_const_structp png_ptr) +{ + return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0); +} +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +png_voidp PNGAPI +png_get_user_chunk_ptr(png_const_structp png_ptr) +{ + return (png_ptr ? png_ptr->user_chunk_ptr : NULL); +} +#endif + +png_size_t PNGAPI +png_get_compression_buffer_size(png_const_structp png_ptr) +{ + return (png_ptr ? png_ptr->zbuf_size : 0L); +} + + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +/* These functions were added to libpng 1.2.6 and were enabled + * by default in libpng-1.4.0 */ +png_uint_32 PNGAPI +png_get_user_width_max (png_const_structp png_ptr) +{ + return (png_ptr ? png_ptr->user_width_max : 0); +} + +png_uint_32 PNGAPI +png_get_user_height_max (png_const_structp png_ptr) +{ + return (png_ptr ? png_ptr->user_height_max : 0); +} + +/* This function was added to libpng 1.4.0 */ +png_uint_32 PNGAPI +png_get_chunk_cache_max (png_const_structp png_ptr) +{ + return (png_ptr ? png_ptr->user_chunk_cache_max : 0); +} + +/* This function was added to libpng 1.4.1 */ +png_alloc_size_t PNGAPI +png_get_chunk_malloc_max (png_const_structp png_ptr) +{ + return (png_ptr ? png_ptr->user_chunk_malloc_max : 0); +} +#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ + +/* These functions were added to libpng 1.4.0 */ +#ifdef PNG_IO_STATE_SUPPORTED +png_uint_32 PNGAPI +png_get_io_state (png_structp png_ptr) +{ + return png_ptr->io_state; +} + +png_uint_32 PNGAPI +png_get_io_chunk_type (png_const_structp png_ptr) +{ + return ((png_ptr->chunk_name[0] << 24) + + (png_ptr->chunk_name[1] << 16) + + (png_ptr->chunk_name[2] << 8) + + (png_ptr->chunk_name[3])); +} + +png_const_bytep PNGAPI +png_get_io_chunk_name (png_structp png_ptr) +{ + return png_ptr->chunk_name; +} +#endif /* ?PNG_IO_STATE_SUPPORTED */ + +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libpng/pnginfo.h b/src/3rdparty/libpng/pnginfo.h new file mode 100644 index 0000000000..fa19f85e72 --- /dev/null +++ b/src/3rdparty/libpng/pnginfo.h @@ -0,0 +1,270 @@ + +/* pnginfo.h - header file for PNG reference library + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + + /* png_info is a structure that holds the information in a PNG file so + * that the application can find out the characteristics of the image. + * If you are reading the file, this structure will tell you what is + * in the PNG file. If you are writing the file, fill in the information + * you want to put into the PNG file, using png_set_*() functions, then + * call png_write_info(). + * + * The names chosen should be very close to the PNG specification, so + * consult that document for information about the meaning of each field. + * + * With libpng < 0.95, it was only possible to directly set and read the + * the values in the png_info_struct, which meant that the contents and + * order of the values had to remain fixed. With libpng 0.95 and later, + * however, there are now functions that abstract the contents of + * png_info_struct from the application, so this makes it easier to use + * libpng with dynamic libraries, and even makes it possible to use + * libraries that don't have all of the libpng ancillary chunk-handing + * functionality. In libpng-1.5.0 this was moved into a separate private + * file that is not visible to applications. + * + * The following members may have allocated storage attached that should be + * cleaned up before the structure is discarded: palette, trans, text, + * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, + * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these + * are automatically freed when the info structure is deallocated, if they were + * allocated internally by libpng. This behavior can be changed by means + * of the png_data_freer() function. + * + * More allocation details: all the chunk-reading functions that + * change these members go through the corresponding png_set_* + * functions. A function to clear these members is available: see + * png_free_data(). The png_set_* functions do not depend on being + * able to point info structure members to any of the storage they are + * passed (they make their own copies), EXCEPT that the png_set_text + * functions use the same storage passed to them in the text_ptr or + * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns + * functions do not make their own copies. + */ +#ifndef PNGINFO_H +#define PNGINFO_H + +struct png_info_def +{ + /* the following are necessary for every PNG file */ + png_uint_32 width; /* width of image in pixels (from IHDR) */ + png_uint_32 height; /* height of image in pixels (from IHDR) */ + png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */ + png_size_t rowbytes; /* bytes needed to hold an untransformed row */ + png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */ + png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */ + png_uint_16 num_trans; /* number of transparent palette color (tRNS) */ + png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */ + png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */ + /* The following three should have been named *_method not *_type */ + png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */ + png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */ + png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + + /* The following is informational only on read, and not used on writes. */ + png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte spare_byte; /* to align the data, and for future use */ + png_byte signature[8]; /* magic bytes read by libpng from start of file */ + + /* The rest of the data is optional. If you are reading, check the + * valid field to see if the information in these are valid. If you + * are writing, set the valid field to those chunks you want written, + * and initialize the appropriate fields below. + */ + +#if defined(PNG_gAMA_SUPPORTED) + /* The gAMA chunk describes the gamma characteristics of the system + * on which the image was created, normally in the range [1.0, 2.5]. + * Data is valid if (valid & PNG_INFO_gAMA) is non-zero. + */ + png_fixed_point gamma; +#endif + +#ifdef PNG_sRGB_SUPPORTED + /* GR-P, 0.96a */ + /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */ + png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */ +#endif + +#ifdef PNG_TEXT_SUPPORTED + /* The tEXt, and zTXt chunks contain human-readable textual data in + * uncompressed, compressed, and optionally compressed forms, respectively. + * The data in "text" is an array of pointers to uncompressed, + * null-terminated C strings. Each chunk has a keyword that describes the + * textual data contained in that chunk. Keywords are not required to be + * unique, and the text string may be empty. Any number of text chunks may + * be in an image. + */ + int num_text; /* number of comments read or comments to write */ + int max_text; /* current size of text array */ + png_textp text; /* array of comments read or comments to write */ +#endif /* PNG_TEXT_SUPPORTED */ + +#ifdef PNG_tIME_SUPPORTED + /* The tIME chunk holds the last time the displayed image data was + * modified. See the png_time struct for the contents of this struct. + */ + png_time mod_time; +#endif + +#ifdef PNG_sBIT_SUPPORTED + /* The sBIT chunk specifies the number of significant high-order bits + * in the pixel data. Values are in the range [1, bit_depth], and are + * only specified for the channels in the pixel data. The contents of + * the low-order bits is not specified. Data is valid if + * (valid & PNG_INFO_sBIT) is non-zero. + */ + png_color_8 sig_bit; /* significant bits in color channels */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ +defined(PNG_READ_BACKGROUND_SUPPORTED) + /* The tRNS chunk supplies transparency data for paletted images and + * other image types that don't need a full alpha channel. There are + * "num_trans" transparency values for a paletted image, stored in the + * same order as the palette colors, starting from index 0. Values + * for the data are in the range [0, 255], ranging from fully transparent + * to fully opaque, respectively. For non-paletted images, there is a + * single color specified that should be treated as fully transparent. + * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. + */ + png_bytep trans; /* alpha values for paletted image */ + png_bytep trans_alpha; /* alpha values for paletted image */ + png_color_16 trans_color; /* transparent color for non-palette image */ +#endif + +#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + /* The bKGD chunk gives the suggested image background color if the + * display program does not have its own background color and the image + * is needs to composited onto a background before display. The colors + * in "background" are normally in the same color space/depth as the + * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero. + */ + png_color_16 background; +#endif + +#ifdef PNG_oFFs_SUPPORTED + /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards + * and downwards from the top-left corner of the display, page, or other + * application-specific co-ordinate space. See the PNG_OFFSET_ defines + * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero. + */ + png_int_32 x_offset; /* x offset on page */ + png_int_32 y_offset; /* y offset on page */ + png_byte offset_unit_type; /* offset units type */ +#endif + +#ifdef PNG_pHYs_SUPPORTED + /* The pHYs chunk gives the physical pixel density of the image for + * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ + * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero. + */ + png_uint_32 x_pixels_per_unit; /* horizontal pixel density */ + png_uint_32 y_pixels_per_unit; /* vertical pixel density */ + png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */ +#endif + +#ifdef PNG_hIST_SUPPORTED + /* The hIST chunk contains the relative frequency or importance of the + * various palette entries, so that a viewer can intelligently select a + * reduced-color palette, if required. Data is an array of "num_palette" + * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) + * is non-zero. + */ + png_uint_16p hist; +#endif + +#ifdef PNG_cHRM_SUPPORTED + /* The cHRM chunk describes the CIE color characteristics of the monitor + * on which the PNG was created. This data allows the viewer to do gamut + * mapping of the input image to ensure that the viewer sees the same + * colors in the image as the creator. Values are in the range + * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero. + */ + png_fixed_point x_white; + png_fixed_point y_white; + png_fixed_point x_red; + png_fixed_point y_red; + png_fixed_point x_green; + png_fixed_point y_green; + png_fixed_point x_blue; + png_fixed_point y_blue; +#endif + +#ifdef PNG_pCAL_SUPPORTED + /* The pCAL chunk describes a transformation between the stored pixel + * values and original physical data values used to create the image. + * The integer range [0, 2^bit_depth - 1] maps to the floating-point + * range given by [pcal_X0, pcal_X1], and are further transformed by a + * (possibly non-linear) transformation function given by "pcal_type" + * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ + * defines below, and the PNG-Group's PNG extensions document for a + * complete description of the transformations and how they should be + * implemented, and for a description of the ASCII parameter strings. + * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. + */ + png_charp pcal_purpose; /* pCAL chunk description string */ + png_int_32 pcal_X0; /* minimum value */ + png_int_32 pcal_X1; /* maximum value */ + png_charp pcal_units; /* Latin-1 string giving physical units */ + png_charpp pcal_params; /* ASCII strings containing parameter values */ + png_byte pcal_type; /* equation type (see PNG_EQUATION_ below) */ + png_byte pcal_nparams; /* number of parameters given in pcal_params */ +#endif + +/* New members added in libpng-1.0.6 */ + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + /* Storage for unknown chunks that the library doesn't recognize. */ + png_unknown_chunkp unknown_chunks; + int unknown_chunks_num; +#endif + +#ifdef PNG_iCCP_SUPPORTED + /* iCCP chunk data. */ + png_charp iccp_name; /* profile name */ + png_bytep iccp_profile; /* International Color Consortium profile data */ + png_uint_32 iccp_proflen; /* ICC profile data length */ + png_byte iccp_compression; /* Always zero */ +#endif + +#ifdef PNG_sPLT_SUPPORTED + /* Data on sPLT chunks (there may be more than one). */ + png_sPLT_tp splt_palettes; + png_uint_32 splt_palettes_num; +#endif + +#ifdef PNG_sCAL_SUPPORTED + /* The sCAL chunk describes the actual physical dimensions of the + * subject matter of the graphic. The chunk contains a unit specification + * a byte value, and two ASCII strings representing floating-point + * values. The values are width and height corresponsing to one pixel + * in the image. Data values are valid if (valid & PNG_INFO_sCAL) is + * non-zero. + */ + png_byte scal_unit; /* unit of physical scale */ + png_charp scal_s_width; /* string containing height */ + png_charp scal_s_height; /* string containing width */ +#endif + +#ifdef PNG_INFO_IMAGE_SUPPORTED + /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) + non-zero */ + /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ + png_bytepp row_pointers; /* the image bits */ +#endif + +}; +#endif /* PNGINFO_H */ diff --git a/src/3rdparty/libpng/pnglibconf.h b/src/3rdparty/libpng/pnglibconf.h new file mode 100644 index 0000000000..b1d2169105 --- /dev/null +++ b/src/3rdparty/libpng/pnglibconf.h @@ -0,0 +1,176 @@ + +/* libpng STANDARD API DEFINITION */ + +/* pnglibconf.h - library build configuration */ + +/* libpng version 1.5.0 - last changed on January 6, 2011 */ + +/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ + +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ + +/* pnglibconf.h */ +/* Machine generated file: DO NOT EDIT */ +/* Derived from: scripts/pnglibconf.dfa */ +#ifndef PNGLCONF_H +#define PNGLCONF_H +/* settings */ +#define PNG_MAX_GAMMA_8 11 +#define PNG_CALLOC_SUPPORTED +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_USER_WIDTH_MAX 1000000L +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_API_RULE 0 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_USER_CHUNK_CACHE_MAX 0 +#define PNG_USER_HEIGHT_MAX 1000000L +#define PNG_sCAL_PRECISION 5 +#define PNG_COST_SHIFT 3 +#define PNG_WEIGHT_SHIFT 8 +#define PNG_USER_CHUNK_MALLOC_MAX 0 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_ZBUF_SIZE 8192 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +/* end of settings */ +/* options */ +#define PNG_INFO_IMAGE_SUPPORTED +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#define PNG_POINTER_INDEXING_SUPPORTED +#define PNG_WARNINGS_SUPPORTED +#define PNG_FLOATING_ARITHMETIC_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_INTERLACING_SUPPORTED +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_EASY_ACCESS_SUPPORTED +#define PNG_ALIGN_MEMORY_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_LIMITS_SUPPORTED +#define PNG_FIXED_POINT_SUPPORTED +/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ +#define PNG_ERROR_TEXT_SUPPORTED +#define PNG_READ_SUPPORTED +/*#undef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED*/ +#define PNG_BENIGN_ERRORS_SUPPORTED +#define PNG_SETJMP_SUPPORTED +#define PNG_WRITE_FLUSH_SUPPORTED +#define PNG_MNG_FEATURES_SUPPORTED +#define PNG_FLOATING_POINT_SUPPORTED +#define PNG_INCH_CONVERSIONS_SUPPORTED +#define PNG_STDIO_SUPPORTED +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_MEM_SUPPORTED +#define PNG_IO_STATE_SUPPORTED +#define PNG_SET_USER_LIMITS_SUPPORTED +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_FILTER_SUPPORTED +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_READ_TRANSFORMS_SUPPORTED +#define PNG_READ_GAMMA_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_READ_OPT_PLTE_SUPPORTED +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_READ_GRAY_TO_RGB_SUPPORTED +#define PNG_WRITE_pCAL_SUPPORTED +#define PNG_READ_INVERT_ALPHA_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_READ_PACK_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_WRITE_tIME_SUPPORTED +#define PNG_READ_INTERLACING_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED +#define PNG_WRITE_pHYs_SUPPORTED +#define PNG_WRITE_INVERT_SUPPORTED +#define PNG_READ_RGB_TO_GRAY_SUPPORTED +#define PNG_WRITE_sRGB_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_WRITE_FILLER_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_PROGRESSIVE_READ_SUPPORTED +#define PNG_READ_SHIFT_SUPPORTED +#define PNG_CONVERT_tIME_SUPPORTED +#define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_INT_FUNCTIONS_SUPPORTED +#define PNG_READ_USER_CHUNKS_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#define PNG_READ_SWAP_ALPHA_SUPPORTED +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED +#define PNG_SEQUENTIAL_READ_SUPPORTED +#define PNG_READ_BACKGROUND_SUPPORTED +#define PNG_READ_QUANTIZE_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_STRIP_ALPHA_SUPPORTED +#define PNG_READ_PACKSWAP_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_WRITE_tEXt_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_READ_EXPAND_SUPPORTED +#define PNG_WRITE_sPLT_SUPPORTED +#define PNG_READ_SWAP_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_TIME_RFC1123_SUPPORTED +#define PNG_READ_TEXT_SUPPORTED +#define PNG_WRITE_BGR_SUPPORTED +#define PNG_USER_CHUNKS_SUPPORTED +#define PNG_CONSOLE_IO_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_READ_FILLER_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_tRNS_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_WRITE_sCAL_SUPPORTED +#define PNG_WRITE_oFFs_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_WRITE_sBIT_SUPPORTED +#define PNG_READ_INVERT_SUPPORTED +#define PNG_READ_16_TO_8_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_16BIT_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_READ_BGR_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_WRITE_zTXt_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_tRNS_SUPPORTED +#define PNG_WRITE_iTXt_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_USER_TRANSFORM_PTR_SUPPORTED +#define PNG_USER_TRANSFORM_INFO_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_READ_zTXt_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_CHECK_cHRM_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_TEXT_SUPPORTED +#define PNG_SAVE_INT_32_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_tEXt_SUPPORTED +#define PNG_zTXt_SUPPORTED +#define PNG_iTXt_SUPPORTED +/* end of options */ +#endif /* PNGLCONF_H */ diff --git a/src/3rdparty/libpng/pngmem.c b/src/3rdparty/libpng/pngmem.c new file mode 100644 index 0000000000..a15d8b0859 --- /dev/null +++ b/src/3rdparty/libpng/pngmem.c @@ -0,0 +1,658 @@ + +/* pngmem.c - stub functions for memory allocation + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file provides a location for all memory allocation. Users who + * need special memory handling are expected to supply replacement + * functions for png_malloc() and png_free(), and to use + * png_create_read_struct_2() and png_create_write_struct_2() to + * identify the replacement functions. + */ + +#include "pngpriv.h" + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +/* Borland DOS special memory handler */ +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* If you change this, be sure to change the one in png.h also */ + +/* Allocate memory for a png_struct. The malloc and memset can be replaced + by a single call to calloc() if this is thought to improve performance. */ +PNG_FUNCTION(png_voidp /* PRIVATE */, +png_create_struct,(int type),PNG_ALLOCATED) +{ +# ifdef PNG_USER_MEM_SUPPORTED + return (png_create_struct_2(type, NULL, NULL)); +} + +/* Alternate version of png_create_struct, for use with user-defined malloc. */ +PNG_FUNCTION(png_voidp /* PRIVATE */, +png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr), + PNG_ALLOCATED) +{ +# endif /* PNG_USER_MEM_SUPPORTED */ + png_size_t size; + png_voidp struct_ptr; + + if (type == PNG_STRUCT_INFO) + size = png_sizeof(png_info); + + else if (type == PNG_STRUCT_PNG) + size = png_sizeof(png_struct); + + else + return (png_get_copyright(NULL)); + +# ifdef PNG_USER_MEM_SUPPORTED + if (malloc_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); + } + + else +# endif /* PNG_USER_MEM_SUPPORTED */ + struct_ptr = (png_voidp)farmalloc(size); + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + + return (struct_ptr); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct(png_voidp struct_ptr) +{ +# ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2(struct_ptr, NULL, NULL); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, + png_voidp mem_ptr) +{ +# endif + if (struct_ptr != NULL) + { +# ifdef PNG_USER_MEM_SUPPORTED + if (free_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + (*(free_fn))(png_ptr, struct_ptr); + return; + } + +# endif /* PNG_USER_MEM_SUPPORTED */ + farfree (struct_ptr); + } +} + +/* Allocate memory. For reasonable files, size should never exceed + * 64K. However, zlib may allocate more then 64K if you don't tell + * it not to. See zconf.h and png.h for more information. zlib does + * need to allocate exactly 64K, so whatever you call here must + * have the ability to do that. + * + * Borland seems to have a problem in DOS mode for exactly 64K. + * It gives you a segment with an offset of 8 (perhaps to store its + * memory stuff). zlib doesn't like this at all, so we have to + * detect and deal with it. This code should not be needed in + * Windows or OS/2 modes, and only in 16 bit mode. This code has + * been updated by Alexander Lehmann for version 0.89 to waste less + * memory. + * + * Note that we can't use png_size_t for the "size" declaration, + * since on some systems a png_size_t is a 16-bit quantity, and as a + * result, we would be truncating potentially larger memory requests + * (which should cause a fatal error) and introducing major problems. + */ +PNG_FUNCTION(png_voidp,PNGAPI +png_calloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) +{ + png_voidp ret; + + ret = (png_malloc(png_ptr, size)); + + if (ret != NULL) + png_memset(ret,0,(png_size_t)size); + + return (ret); +} + +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) +{ + png_voidp ret; + + if (png_ptr == NULL || size == 0) + return (NULL); + +# ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->malloc_fn != NULL) + ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); + + else + ret = (png_malloc_default(png_ptr, size)); + + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of memory"); + + return (ret); +} + +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) +{ + png_voidp ret; +# endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || size == 0) + return (NULL); + +# ifdef PNG_MAX_MALLOC_64K + if (size > (png_uint_32)65536L) + { + png_warning(png_ptr, "Cannot Allocate > 64K"); + ret = NULL; + } + + else +# endif + + if (size != (size_t)size) + ret = NULL; + + else if (size == (png_uint_32)65536L) + { + if (png_ptr->offset_table == NULL) + { + /* Try to see if we need to do any of this fancy stuff */ + ret = farmalloc(size); + if (ret == NULL || ((png_size_t)ret & 0xffff)) + { + int num_blocks; + png_uint_32 total_size; + png_bytep table; + int i; + png_byte huge * hptr; + + if (ret != NULL) + { + farfree(ret); + ret = NULL; + } + + if (png_ptr->zlib_window_bits > 14) + num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); + + else + num_blocks = 1; + + if (png_ptr->zlib_mem_level >= 7) + num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); + + else + num_blocks++; + + total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; + + table = farmalloc(total_size); + + if (table == NULL) + { +# ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out Of Memory"); /* Note "O", "M" */ + + else + png_warning(png_ptr, "Out Of Memory"); +# endif + return (NULL); + } + + if ((png_size_t)table & 0xfff0) + { +# ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, + "Farmalloc didn't return normalized pointer"); + + else + png_warning(png_ptr, + "Farmalloc didn't return normalized pointer"); +# endif + return (NULL); + } + + png_ptr->offset_table = table; + png_ptr->offset_table_ptr = farmalloc(num_blocks * + png_sizeof(png_bytep)); + + if (png_ptr->offset_table_ptr == NULL) + { +# ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out Of memory"); /* Note "O", "m" */ + + else + png_warning(png_ptr, "Out Of memory"); +# endif + return (NULL); + } + + hptr = (png_byte huge *)table; + if ((png_size_t)hptr & 0xf) + { + hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); + hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ + } + + for (i = 0; i < num_blocks; i++) + { + png_ptr->offset_table_ptr[i] = (png_bytep)hptr; + hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ + } + + png_ptr->offset_table_number = num_blocks; + png_ptr->offset_table_count = 0; + png_ptr->offset_table_count_free = 0; + } + } + + if (png_ptr->offset_table_count >= png_ptr->offset_table_number) + { +# ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory"); /* Note "o" and "M" */ + + else + png_warning(png_ptr, "Out of Memory"); +# endif + return (NULL); + } + + ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; + } + + else + ret = farmalloc(size); + +# ifndef PNG_USER_MEM_SUPPORTED + if (ret == NULL) + { + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of memory"); /* Note "o" and "m" */ + + else + png_warning(png_ptr, "Out of memory"); /* Note "o" and "m" */ + } +# endif + + return (ret); +} + +/* Free a pointer allocated by png_malloc(). In the default + * configuration, png_ptr is not used, but is passed in case it + * is needed. If ptr is NULL, return without taking any action. + */ +void PNGAPI +png_free(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +# ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->free_fn != NULL) + { + (*(png_ptr->free_fn))(png_ptr, ptr); + return; + } + + else + png_free_default(png_ptr, ptr); +} + +void PNGAPI +png_free_default(png_structp png_ptr, png_voidp ptr) +{ +# endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || ptr == NULL) + return; + + if (png_ptr->offset_table != NULL) + { + int i; + + for (i = 0; i < png_ptr->offset_table_count; i++) + { + if (ptr == png_ptr->offset_table_ptr[i]) + { + ptr = NULL; + png_ptr->offset_table_count_free++; + break; + } + } + if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) + { + farfree(png_ptr->offset_table); + farfree(png_ptr->offset_table_ptr); + png_ptr->offset_table = NULL; + png_ptr->offset_table_ptr = NULL; + } + } + + if (ptr != NULL) + farfree(ptr); +} + +#else /* Not the Borland DOS special memory handler */ + +/* Allocate memory for a png_struct or a png_info. The malloc and + memset can be replaced by a single call to calloc() if this is thought + to improve performance noticably. */ +PNG_FUNCTION(png_voidp /* PRIVATE */, +png_create_struct,(int type),PNG_ALLOCATED) +{ +# ifdef PNG_USER_MEM_SUPPORTED + return (png_create_struct_2(type, NULL, NULL)); +} + +/* Allocate memory for a png_struct or a png_info. The malloc and + memset can be replaced by a single call to calloc() if this is thought + to improve performance noticably. */ +PNG_FUNCTION(png_voidp /* PRIVATE */, +png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr), + PNG_ALLOCATED) +{ +# endif /* PNG_USER_MEM_SUPPORTED */ + png_size_t size; + png_voidp struct_ptr; + + if (type == PNG_STRUCT_INFO) + size = png_sizeof(png_info); + + else if (type == PNG_STRUCT_PNG) + size = png_sizeof(png_struct); + + else + return (NULL); + +# ifdef PNG_USER_MEM_SUPPORTED + if (malloc_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + struct_ptr = (*(malloc_fn))(png_ptr, size); + + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + + return (struct_ptr); + } +# endif /* PNG_USER_MEM_SUPPORTED */ + +# if defined(__TURBOC__) && !defined(__FLAT__) + struct_ptr = (png_voidp)farmalloc(size); +# else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + struct_ptr = (png_voidp)halloc(size, 1); +# else + struct_ptr = (png_voidp)malloc(size); +# endif +# endif + + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + + return (struct_ptr); +} + + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct(png_voidp struct_ptr) +{ +# ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2(struct_ptr, NULL, NULL); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, + png_voidp mem_ptr) +{ +# endif /* PNG_USER_MEM_SUPPORTED */ + if (struct_ptr != NULL) + { +# ifdef PNG_USER_MEM_SUPPORTED + if (free_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + (*(free_fn))(png_ptr, struct_ptr); + return; + } +# endif /* PNG_USER_MEM_SUPPORTED */ +# if defined(__TURBOC__) && !defined(__FLAT__) + farfree(struct_ptr); + +# else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + hfree(struct_ptr); + +# else + free(struct_ptr); + +# endif +# endif + } +} + +/* Allocate memory. For reasonable files, size should never exceed + * 64K. However, zlib may allocate more then 64K if you don't tell + * it not to. See zconf.h and png.h for more information. zlib does + * need to allocate exactly 64K, so whatever you call here must + * have the ability to do that. + */ + +PNG_FUNCTION(png_voidp,PNGAPI +png_calloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) +{ + png_voidp ret; + + ret = (png_malloc(png_ptr, size)); + + if (ret != NULL) + png_memset(ret,0,(png_size_t)size); + + return (ret); +} + +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) +{ + png_voidp ret; + +# ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr == NULL || size == 0) + return (NULL); + + if (png_ptr->malloc_fn != NULL) + ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); + + else + ret = (png_malloc_default(png_ptr, size)); + + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory"); + + return (ret); +} + +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) +{ + png_voidp ret; +# endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || size == 0) + return (NULL); + +# ifdef PNG_MAX_MALLOC_64K + if (size > (png_uint_32)65536L) + { +# ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Cannot Allocate > 64K"); + + else +# endif + return NULL; + } +# endif + + /* Check for overflow */ +# if defined(__TURBOC__) && !defined(__FLAT__) + + if (size != (unsigned long)size) + ret = NULL; + + else + ret = farmalloc(size); + +# else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + if (size != (unsigned long)size) + ret = NULL; + + else + ret = halloc(size, 1); + +# else + if (size != (size_t)size) + ret = NULL; + + else + ret = malloc((size_t)size); +# endif +# endif + +# ifndef PNG_USER_MEM_SUPPORTED + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory"); +# endif + + return (ret); +} + +/* Free a pointer allocated by png_malloc(). If ptr is NULL, return + * without taking any action. + */ +void PNGAPI +png_free(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +# ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->free_fn != NULL) + { + (*(png_ptr->free_fn))(png_ptr, ptr); + return; + } + + else + png_free_default(png_ptr, ptr); +} + +void PNGAPI +png_free_default(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +# endif /* PNG_USER_MEM_SUPPORTED */ + +# if defined(__TURBOC__) && !defined(__FLAT__) + farfree(ptr); + +# else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + hfree(ptr); + +# else + free(ptr); + +# endif +# endif +} +#endif /* Not Borland DOS special memory handler */ + +/* This function was added at libpng version 1.2.3. The png_malloc_warn() + * function will set up png_malloc() to issue a png_warning and return NULL + * instead of issuing a png_error, if it fails to allocate the requested + * memory. + */ +PNG_FUNCTION(png_voidp,PNGAPI +png_malloc_warn,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) +{ + png_voidp ptr; + png_uint_32 save_flags; + if (png_ptr == NULL) + return (NULL); + + save_flags = png_ptr->flags; + png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; + ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); + png_ptr->flags=save_flags; + return(ptr); +} + + +#ifdef PNG_USER_MEM_SUPPORTED +/* This function is called when the application wants to use another method + * of allocating and freeing memory. + */ +void PNGAPI +png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr + malloc_fn, png_free_ptr free_fn) +{ + if (png_ptr != NULL) + { + png_ptr->mem_ptr = mem_ptr; + png_ptr->malloc_fn = malloc_fn; + png_ptr->free_fn = free_fn; + } +} + +/* This function returns a pointer to the mem_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy and png_read_destroy are called. + */ +png_voidp PNGAPI +png_get_mem_ptr(png_const_structp png_ptr) +{ + if (png_ptr == NULL) + return (NULL); + + return ((png_voidp)png_ptr->mem_ptr); +} +#endif /* PNG_USER_MEM_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngpread.c b/src/3rdparty/libpng/pngpread.c new file mode 100644 index 0000000000..7b1149bab1 --- /dev/null +++ b/src/3rdparty/libpng/pngpread.c @@ -0,0 +1,1854 @@ + +/* pngpread.c - read a png file in push mode + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#include "pngpriv.h" + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + +/* Push model modes */ +#define PNG_READ_SIG_MODE 0 +#define PNG_READ_CHUNK_MODE 1 +#define PNG_READ_IDAT_MODE 2 +#define PNG_SKIP_MODE 3 +#define PNG_READ_tEXt_MODE 4 +#define PNG_READ_zTXt_MODE 5 +#define PNG_READ_DONE_MODE 6 +#define PNG_READ_iTXt_MODE 7 +#define PNG_ERROR_MODE 8 + +void PNGAPI +png_process_data(png_structp png_ptr, png_infop info_ptr, + png_bytep buffer, png_size_t buffer_size) +{ + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_push_restore_buffer(png_ptr, buffer, buffer_size); + + while (png_ptr->buffer_size) + { + png_process_some_data(png_ptr, info_ptr); + } +} + +png_size_t PNGAPI +png_process_data_pause(png_structp png_ptr, int save) +{ + if (png_ptr != NULL) + { + /* It's easiest for the caller if we do the save, then the caller doesn't + * have to supply the same data again: + */ + if (save) + png_push_save_buffer(png_ptr); + else + { + /* This includes any pending saved bytes: */ + png_size_t remaining = png_ptr->buffer_size; + png_ptr->buffer_size = 0; + + /* So subtract the saved buffer size, unless all the data + * is actually 'saved', in which case we just return 0 + */ + if (png_ptr->save_buffer_size < remaining) + return remaining - png_ptr->save_buffer_size; + } + } + + return 0; +} + +png_uint_32 PNGAPI +png_process_data_skip(png_structp png_ptr) +{ + png_uint_32 remaining = 0; + + if (png_ptr != NULL && png_ptr->process_mode == PNG_SKIP_MODE && + png_ptr->skip_length > 0) + { + /* At the end of png_process_data the buffer size must be 0 (see the loop + * above) so we can detect a broken call here: + */ + if (png_ptr->buffer_size != 0) + png_error(png_ptr, + "png_process_data_skip called inside png_process_data"); + + /* If is impossible for there to be a saved buffer at this point - + * otherwise we could not be in SKIP mode. This will also happen if + * png_process_skip is called inside png_process_data (but only very + * rarely.) + */ + if (png_ptr->save_buffer_size != 0) + png_error(png_ptr, "png_process_data_skip called with saved data"); + + remaining = png_ptr->skip_length; + png_ptr->skip_length = 0; + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + } + + return remaining; +} + +/* What we do with the incoming data depends on what we were previously + * doing before we ran out of data... + */ +void /* PRIVATE */ +png_process_some_data(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr == NULL) + return; + + switch (png_ptr->process_mode) + { + case PNG_READ_SIG_MODE: + { + png_push_read_sig(png_ptr, info_ptr); + break; + } + + case PNG_READ_CHUNK_MODE: + { + png_push_read_chunk(png_ptr, info_ptr); + break; + } + + case PNG_READ_IDAT_MODE: + { + png_push_read_IDAT(png_ptr); + break; + } + +#ifdef PNG_READ_tEXt_SUPPORTED + case PNG_READ_tEXt_MODE: + { + png_push_read_tEXt(png_ptr, info_ptr); + break; + } + +#endif +#ifdef PNG_READ_zTXt_SUPPORTED + case PNG_READ_zTXt_MODE: + { + png_push_read_zTXt(png_ptr, info_ptr); + break; + } + +#endif +#ifdef PNG_READ_iTXt_SUPPORTED + case PNG_READ_iTXt_MODE: + { + png_push_read_iTXt(png_ptr, info_ptr); + break; + } + +#endif + case PNG_SKIP_MODE: + { + png_push_crc_finish(png_ptr); + break; + } + + default: + { + png_ptr->buffer_size = 0; + break; + } + } +} + +/* Read any remaining signature bytes from the stream and compare them with + * the correct PNG signature. It is possible that this routine is called + * with bytes already read from the signature, either because they have been + * checked by the calling application, or because of multiple calls to this + * routine. + */ +void /* PRIVATE */ +png_push_read_sig(png_structp png_ptr, png_infop info_ptr) +{ + png_size_t num_checked = png_ptr->sig_bytes, + num_to_check = 8 - num_checked; + + if (png_ptr->buffer_size < num_to_check) + { + num_to_check = png_ptr->buffer_size; + } + + png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), + num_to_check); + png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); + + if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) + { + if (num_checked < 4 && + png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) + png_error(png_ptr, "Not a PNG file"); + + else + png_error(png_ptr, "PNG file corrupted by ASCII conversion"); + } + else + { + if (png_ptr->sig_bytes >= 8) + { + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + } + } +} + +void /* PRIVATE */ +png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) +{ + PNG_IHDR; + PNG_IDAT; + PNG_IEND; + PNG_PLTE; +#ifdef PNG_READ_bKGD_SUPPORTED + PNG_bKGD; +#endif +#ifdef PNG_READ_cHRM_SUPPORTED + PNG_cHRM; +#endif +#ifdef PNG_READ_gAMA_SUPPORTED + PNG_gAMA; +#endif +#ifdef PNG_READ_hIST_SUPPORTED + PNG_hIST; +#endif +#ifdef PNG_READ_iCCP_SUPPORTED + PNG_iCCP; +#endif +#ifdef PNG_READ_iTXt_SUPPORTED + PNG_iTXt; +#endif +#ifdef PNG_READ_oFFs_SUPPORTED + PNG_oFFs; +#endif +#ifdef PNG_READ_pCAL_SUPPORTED + PNG_pCAL; +#endif +#ifdef PNG_READ_pHYs_SUPPORTED + PNG_pHYs; +#endif +#ifdef PNG_READ_sBIT_SUPPORTED + PNG_sBIT; +#endif +#ifdef PNG_READ_sCAL_SUPPORTED + PNG_sCAL; +#endif +#ifdef PNG_READ_sRGB_SUPPORTED + PNG_sRGB; +#endif +#ifdef PNG_READ_sPLT_SUPPORTED + PNG_sPLT; +#endif +#ifdef PNG_READ_tEXt_SUPPORTED + PNG_tEXt; +#endif +#ifdef PNG_READ_tIME_SUPPORTED + PNG_tIME; +#endif +#ifdef PNG_READ_tRNS_SUPPORTED + PNG_tRNS; +#endif +#ifdef PNG_READ_zTXt_SUPPORTED + PNG_zTXt; +#endif + + /* First we make sure we have enough data for the 4 byte chunk name + * and the 4 byte chunk length before proceeding with decoding the + * chunk data. To fully decode each of these chunks, we also make + * sure we have enough data in the buffer for the 4 byte CRC at the + * end of every chunk (except IDAT, which is handled separately). + */ + if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) + { + png_byte chunk_length[4]; + + if (png_ptr->buffer_size < 8) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_fill_buffer(png_ptr, chunk_length, 4); + png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); + png_reset_crc(png_ptr); + png_crc_read(png_ptr, png_ptr->chunk_name, 4); + png_check_chunk_name(png_ptr, png_ptr->chunk_name); + png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; + } + + if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + if (png_ptr->mode & PNG_AFTER_IDAT) + png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; + + if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) + { + if (png_ptr->push_length != 13) + png_error(png_ptr, "Invalid IHDR length"); + + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); + } + + else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); + + png_ptr->process_mode = PNG_READ_DONE_MODE; + png_push_have_end(png_ptr, info_ptr); + } + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + png_ptr->mode |= PNG_HAVE_IDAT; + + png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); + + if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) + png_ptr->mode |= PNG_HAVE_PLTE; + + else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + { + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + } + } + +#endif + else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); + } + + else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + { + /* If we reach an IDAT chunk, this means we have read all of the + * header chunks, and we can start reading the image (or if this + * is called after the image has been read - we have an error). + */ + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + { + if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + if (png_ptr->push_length == 0) + return; + + if (png_ptr->mode & PNG_AFTER_IDAT) + png_benign_error(png_ptr, "Too many IDATs found"); + } + + png_ptr->idat_size = png_ptr->push_length; + png_ptr->mode |= PNG_HAVE_IDAT; + png_ptr->process_mode = PNG_READ_IDAT_MODE; + png_push_have_info(png_ptr, info_ptr); + png_ptr->zstream.avail_out = + (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, + png_ptr->iwidth) + 1; + png_ptr->zstream.next_out = png_ptr->row_buf; + return; + } + +#ifdef PNG_READ_gAMA_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_sBIT_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_cHRM_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_sRGB_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_iCCP_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_sPLT_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_tRNS_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_bKGD_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_hIST_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_pHYs_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_oFFs_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); + } +#endif + +#ifdef PNG_READ_pCAL_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_sCAL_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_tIME_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_tEXt_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_zTXt_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#ifdef PNG_READ_iTXt_SUPPORTED + else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif + else + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); + } + + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; +} + +void /* PRIVATE */ +png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) +{ + png_ptr->process_mode = PNG_SKIP_MODE; + png_ptr->skip_length = skip; +} + +void /* PRIVATE */ +png_push_crc_finish(png_structp png_ptr) +{ + if (png_ptr->skip_length && png_ptr->save_buffer_size) + { + png_size_t save_size = png_ptr->save_buffer_size; + png_uint_32 skip_length = png_ptr->skip_length; + + /* We want the smaller of 'skip_length' and 'save_buffer_size', but + * they are of different types and we don't know which variable has the + * fewest bits. Carefully select the smaller and cast it to the type of + * the larger - this cannot overflow. Do not cast in the following test + * - it will break on either 16 or 64 bit platforms. + */ + if (skip_length < save_size) + save_size = (png_size_t)skip_length; + + else + skip_length = (png_uint_32)save_size; + + png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); + + png_ptr->skip_length -= skip_length; + png_ptr->buffer_size -= save_size; + png_ptr->save_buffer_size -= save_size; + png_ptr->save_buffer_ptr += save_size; + } + if (png_ptr->skip_length && png_ptr->current_buffer_size) + { + png_size_t save_size = png_ptr->current_buffer_size; + png_uint_32 skip_length = png_ptr->skip_length; + + /* We want the smaller of 'skip_length' and 'current_buffer_size', here, + * the same problem exists as above and the same solution. + */ + if (skip_length < save_size) + save_size = (png_size_t)skip_length; + + else + skip_length = (png_uint_32)save_size; + + png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); + + png_ptr->skip_length -= skip_length; + png_ptr->buffer_size -= save_size; + png_ptr->current_buffer_size -= save_size; + png_ptr->current_buffer_ptr += save_size; + } + if (!png_ptr->skip_length) + { + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_crc_finish(png_ptr, 0); + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + } +} + +void PNGCBAPI +png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) +{ + png_bytep ptr; + + if (png_ptr == NULL) + return; + + ptr = buffer; + if (png_ptr->save_buffer_size) + { + png_size_t save_size; + + if (length < png_ptr->save_buffer_size) + save_size = length; + + else + save_size = png_ptr->save_buffer_size; + + png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); + length -= save_size; + ptr += save_size; + png_ptr->buffer_size -= save_size; + png_ptr->save_buffer_size -= save_size; + png_ptr->save_buffer_ptr += save_size; + } + if (length && png_ptr->current_buffer_size) + { + png_size_t save_size; + + if (length < png_ptr->current_buffer_size) + save_size = length; + + else + save_size = png_ptr->current_buffer_size; + + png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); + png_ptr->buffer_size -= save_size; + png_ptr->current_buffer_size -= save_size; + png_ptr->current_buffer_ptr += save_size; + } +} + +void /* PRIVATE */ +png_push_save_buffer(png_structp png_ptr) +{ + if (png_ptr->save_buffer_size) + { + if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) + { + png_size_t i, istop; + png_bytep sp; + png_bytep dp; + + istop = png_ptr->save_buffer_size; + for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; + i < istop; i++, sp++, dp++) + { + *dp = *sp; + } + } + } + if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > + png_ptr->save_buffer_max) + { + png_size_t new_max; + png_bytep old_buffer; + + if (png_ptr->save_buffer_size > PNG_SIZE_MAX - + (png_ptr->current_buffer_size + 256)) + { + png_error(png_ptr, "Potential overflow of save_buffer"); + } + + new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; + old_buffer = png_ptr->save_buffer; + png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, + (png_size_t)new_max); + + if (png_ptr->save_buffer == NULL) + { + png_free(png_ptr, old_buffer); + png_error(png_ptr, "Insufficient memory for save_buffer"); + } + + png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); + png_free(png_ptr, old_buffer); + png_ptr->save_buffer_max = new_max; + } + if (png_ptr->current_buffer_size) + { + png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, + png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); + png_ptr->save_buffer_size += png_ptr->current_buffer_size; + png_ptr->current_buffer_size = 0; + } + png_ptr->save_buffer_ptr = png_ptr->save_buffer; + png_ptr->buffer_size = 0; +} + +void /* PRIVATE */ +png_push_restore_buffer(png_structp png_ptr, png_bytep buffer, + png_size_t buffer_length) +{ + png_ptr->current_buffer = buffer; + png_ptr->current_buffer_size = buffer_length; + png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; + png_ptr->current_buffer_ptr = png_ptr->current_buffer; +} + +void /* PRIVATE */ +png_push_read_IDAT(png_structp png_ptr) +{ + PNG_IDAT; + if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) + { + png_byte chunk_length[4]; + + if (png_ptr->buffer_size < 8) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_fill_buffer(png_ptr, chunk_length, 4); + png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); + png_reset_crc(png_ptr); + png_crc_read(png_ptr, png_ptr->chunk_name, 4); + png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; + + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + { + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + png_error(png_ptr, "Not enough compressed data"); + + return; + } + + png_ptr->idat_size = png_ptr->push_length; + } + if (png_ptr->idat_size && png_ptr->save_buffer_size) + { + png_size_t save_size = png_ptr->save_buffer_size; + png_uint_32 idat_size = png_ptr->idat_size; + + /* We want the smaller of 'idat_size' and 'current_buffer_size', but they + * are of different types and we don't know which variable has the fewest + * bits. Carefully select the smaller and cast it to the type of the + * larger - this cannot overflow. Do not cast in the following test - it + * will break on either 16 or 64 bit platforms. + */ + if (idat_size < save_size) + save_size = (png_size_t)idat_size; + + else + idat_size = (png_uint_32)save_size; + + png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); + + png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); + + png_ptr->idat_size -= idat_size; + png_ptr->buffer_size -= save_size; + png_ptr->save_buffer_size -= save_size; + png_ptr->save_buffer_ptr += save_size; + } + + if (png_ptr->idat_size && png_ptr->current_buffer_size) + { + png_size_t save_size = png_ptr->current_buffer_size; + png_uint_32 idat_size = png_ptr->idat_size; + + /* We want the smaller of 'idat_size' and 'current_buffer_size', but they + * are of different types and we don't know which variable has the fewest + * bits. Carefully select the smaller and cast it to the type of the + * larger - this cannot overflow. + */ + if (idat_size < save_size) + save_size = (png_size_t)idat_size; + + else + idat_size = (png_uint_32)save_size; + + png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); + + png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); + + png_ptr->idat_size -= idat_size; + png_ptr->buffer_size -= save_size; + png_ptr->current_buffer_size -= save_size; + png_ptr->current_buffer_ptr += save_size; + } + if (!png_ptr->idat_size) + { + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_crc_finish(png_ptr, 0); + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; + png_ptr->mode |= PNG_AFTER_IDAT; + } +} + +void /* PRIVATE */ +png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, + png_size_t buffer_length) +{ + /* The caller checks for a non-zero buffer length. */ + if (!(buffer_length > 0) || buffer == NULL) + png_error(png_ptr, "No IDAT data (internal error)"); + + /* This routine must process all the data it has been given + * before returning, calling the row callback as required to + * handle the uncompressed results. + */ + png_ptr->zstream.next_in = buffer; + png_ptr->zstream.avail_in = (uInt)buffer_length; + + /* Keep going until the decompressed data is all processed + * or the stream marked as finished. + */ + while (png_ptr->zstream.avail_in > 0 && + !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + { + int ret; + + /* We have data for zlib, but we must check that zlib + * has someplace to put the results. It doesn't matter + * if we don't expect any results -- it may be the input + * data is just the LZ end code. + */ + if (!(png_ptr->zstream.avail_out > 0)) + { + png_ptr->zstream.avail_out = + (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, + png_ptr->iwidth) + 1; + + png_ptr->zstream.next_out = png_ptr->row_buf; + } + + /* Using Z_SYNC_FLUSH here means that an unterminated + * LZ stream (a stream with a missing end code) can still + * be handled, otherwise (Z_NO_FLUSH) a future zlib + * implementation might defer output and therefore + * change the current behavior (see comments in inflate.c + * for why this doesn't happen at present with zlib 1.2.5). + */ + ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH); + + /* Check for any failure before proceeding. */ + if (ret != Z_OK && ret != Z_STREAM_END) + { + /* Terminate the decompression. */ + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + + /* This may be a truncated stream (missing or + * damaged end code). Treat that as a warning. + */ + if (png_ptr->row_number >= png_ptr->num_rows || + png_ptr->pass > 6) + png_warning(png_ptr, "Truncated compressed data in IDAT"); + + else + png_error(png_ptr, "Decompression error in IDAT"); + + /* Skip the check on unprocessed input */ + return; + } + + /* Did inflate output any data? */ + if (png_ptr->zstream.next_out != png_ptr->row_buf) + { + /* Is this unexpected data after the last row? + * If it is, artificially terminate the LZ output + * here. + */ + if (png_ptr->row_number >= png_ptr->num_rows || + png_ptr->pass > 6) + { + /* Extra data. */ + png_warning(png_ptr, "Extra compressed data in IDAT"); + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + + /* Do no more processing; skip the unprocessed + * input check below. + */ + return; + } + + /* Do we have a complete row? */ + if (png_ptr->zstream.avail_out == 0) + png_push_process_row(png_ptr); + } + + /* And check for the end of the stream. */ + if (ret == Z_STREAM_END) + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + } + + /* All the data should have been processed, if anything + * is left at this point we have bytes of IDAT data + * after the zlib end code. + */ + if (png_ptr->zstream.avail_in > 0) + png_warning(png_ptr, "Extra compression data in IDAT"); +} + +void /* PRIVATE */ +png_push_process_row(png_structp png_ptr) +{ + png_ptr->row_info.color_type = png_ptr->color_type; + png_ptr->row_info.width = png_ptr->iwidth; + png_ptr->row_info.channels = png_ptr->channels; + png_ptr->row_info.bit_depth = png_ptr->bit_depth; + png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; + + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + + png_read_filter_row(png_ptr, &(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->prev_row + 1, + (int)(png_ptr->row_buf[0])); + + png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1); + + if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + png_do_read_transformations(png_ptr); + +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* Blow up interlaced rows to full size */ + if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + { + if (png_ptr->pass < 6) +/* old interface (pre-1.0.9): + png_do_read_interlace(&(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); + */ + png_do_read_interlace(png_ptr); + + switch (png_ptr->pass) + { + case 0: + { + int i; + for (i = 0; i < 8 && png_ptr->pass == 0; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */ + } + + if (png_ptr->pass == 2) /* Pass 1 might be empty */ + { + for (i = 0; i < 4 && png_ptr->pass == 2; i++) + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + } + + if (png_ptr->pass == 4 && png_ptr->height <= 4) + { + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + } + + if (png_ptr->pass == 6 && png_ptr->height <= 4) + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + + break; + } + + case 1: + { + int i; + for (i = 0; i < 8 && png_ptr->pass == 1; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 2) /* Skip top 4 generated rows */ + { + for (i = 0; i < 4 && png_ptr->pass == 2; i++) + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + } + + break; + } + + case 2: + { + int i; + + for (i = 0; i < 4 && png_ptr->pass == 2; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + for (i = 0; i < 4 && png_ptr->pass == 2; i++) + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 4) /* Pass 3 might be empty */ + { + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + } + + break; + } + + case 3: + { + int i; + + for (i = 0; i < 4 && png_ptr->pass == 3; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 4) /* Skip top two generated rows */ + { + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + } + + break; + } + + case 4: + { + int i; + + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 6) /* Pass 5 might be empty */ + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + + break; + } + + case 5: + { + int i; + + for (i = 0; i < 2 && png_ptr->pass == 5; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 6) /* Skip top generated row */ + { + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + + break; + } + + default: + case 6: + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + + if (png_ptr->pass != 6) + break; + + png_push_have_row(png_ptr, NULL); + png_read_push_finish_row(png_ptr); + } + } + } + else +#endif + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } +} + +void /* PRIVATE */ +png_read_push_finish_row(png_structp png_ptr) +{ + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; + + /* Height of interlace block. This is not currently used - if you need + * it, uncomment it here and in png.h + PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; + */ + + png_ptr->row_number++; + if (png_ptr->row_number < png_ptr->num_rows) + return; + +#ifdef PNG_READ_INTERLACING_SUPPORTED + if (png_ptr->interlaced) + { + png_ptr->row_number = 0; + png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); + + do + { + png_ptr->pass++; + if ((png_ptr->pass == 1 && png_ptr->width < 5) || + (png_ptr->pass == 3 && png_ptr->width < 3) || + (png_ptr->pass == 5 && png_ptr->width < 2)) + png_ptr->pass++; + + if (png_ptr->pass > 7) + png_ptr->pass--; + + if (png_ptr->pass >= 7) + break; + + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + + if (png_ptr->transformations & PNG_INTERLACE) + break; + + png_ptr->num_rows = (png_ptr->height + + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; + + } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); + } +#endif /* PNG_READ_INTERLACING_SUPPORTED */ +} + +#ifdef PNG_READ_tEXt_SUPPORTED +void /* PRIVATE */ +png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 + length) +{ + if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) + { + PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ + png_error(png_ptr, "Out of place tEXt"); + /*NOT REACHED*/ + } + +#ifdef PNG_MAX_MALLOC_64K + png_ptr->skip_length = 0; /* This may not be necessary */ + + if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ + { + png_warning(png_ptr, "tEXt chunk too large to fit in memory"); + png_ptr->skip_length = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_ptr->current_text = (png_charp)png_malloc(png_ptr, + (png_size_t)(length + 1)); + png_ptr->current_text[length] = '\0'; + png_ptr->current_text_ptr = png_ptr->current_text; + png_ptr->current_text_size = (png_size_t)length; + png_ptr->current_text_left = (png_size_t)length; + png_ptr->process_mode = PNG_READ_tEXt_MODE; +} + +void /* PRIVATE */ +png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr->buffer_size && png_ptr->current_text_left) + { + png_size_t text_size; + + if (png_ptr->buffer_size < png_ptr->current_text_left) + text_size = png_ptr->buffer_size; + + else + text_size = png_ptr->current_text_left; + + png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); + png_ptr->current_text_left -= text_size; + png_ptr->current_text_ptr += text_size; + } + if (!(png_ptr->current_text_left)) + { + png_textp text_ptr; + png_charp text; + png_charp key; + int ret; + + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_crc_finish(png_ptr); + +#ifdef PNG_MAX_MALLOC_64K + if (png_ptr->skip_length) + return; +#endif + + key = png_ptr->current_text; + + for (text = key; *text; text++) + /* Empty loop */ ; + + if (text < key + png_ptr->current_text_size) + text++; + + text_ptr = (png_textp)png_malloc(png_ptr, png_sizeof(png_text)); + text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr->key = key; + text_ptr->itxt_length = 0; + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; + text_ptr->text = text; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, key); + png_free(png_ptr, text_ptr); + png_ptr->current_text = NULL; + + if (ret) + png_warning(png_ptr, "Insufficient memory to store text chunk"); + } +} +#endif + +#ifdef PNG_READ_zTXt_SUPPORTED +void /* PRIVATE */ +png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 + length) +{ + if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) + { + PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ + png_error(png_ptr, "Out of place zTXt"); + /*NOT REACHED*/ + } + +#ifdef PNG_MAX_MALLOC_64K + /* We can't handle zTXt chunks > 64K, since we don't have enough space + * to be able to store the uncompressed data. Actually, the threshold + * is probably around 32K, but it isn't as definite as 64K is. + */ + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "zTXt chunk too large to fit in memory"); + png_push_crc_skip(png_ptr, length); + return; + } +#endif + + png_ptr->current_text = (png_charp)png_malloc(png_ptr, + (png_size_t)(length + 1)); + png_ptr->current_text[length] = '\0'; + png_ptr->current_text_ptr = png_ptr->current_text; + png_ptr->current_text_size = (png_size_t)length; + png_ptr->current_text_left = (png_size_t)length; + png_ptr->process_mode = PNG_READ_zTXt_MODE; +} + +void /* PRIVATE */ +png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr->buffer_size && png_ptr->current_text_left) + { + png_size_t text_size; + + if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) + text_size = png_ptr->buffer_size; + + else + text_size = png_ptr->current_text_left; + + png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); + png_ptr->current_text_left -= text_size; + png_ptr->current_text_ptr += text_size; + } + if (!(png_ptr->current_text_left)) + { + png_textp text_ptr; + png_charp text; + png_charp key; + int ret; + png_size_t text_size, key_size; + + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_crc_finish(png_ptr); + + key = png_ptr->current_text; + + for (text = key; *text; text++) + /* Empty loop */ ; + + /* zTXt can't have zero text */ + if (text >= key + png_ptr->current_text_size) + { + png_ptr->current_text = NULL; + png_free(png_ptr, key); + return; + } + + text++; + + if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ + { + png_ptr->current_text = NULL; + png_free(png_ptr, key); + return; + } + + text++; + + png_ptr->zstream.next_in = (png_bytep)text; + png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - + (text - key)); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + key_size = text - key; + text_size = 0; + text = NULL; + ret = Z_STREAM_END; + + while (png_ptr->zstream.avail_in) + { + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret != Z_OK && ret != Z_STREAM_END) + { + inflateReset(&png_ptr->zstream); + png_ptr->zstream.avail_in = 0; + png_ptr->current_text = NULL; + png_free(png_ptr, key); + png_free(png_ptr, text); + return; + } + + if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) + { + if (text == NULL) + { + text = (png_charp)png_malloc(png_ptr, + (png_ptr->zbuf_size + - png_ptr->zstream.avail_out + key_size + 1)); + + png_memcpy(text + key_size, png_ptr->zbuf, + png_ptr->zbuf_size - png_ptr->zstream.avail_out); + + png_memcpy(text, key, key_size); + + text_size = key_size + png_ptr->zbuf_size - + png_ptr->zstream.avail_out; + + *(text + text_size) = '\0'; + } + + else + { + png_charp tmp; + + tmp = text; + text = (png_charp)png_malloc(png_ptr, text_size + + (png_ptr->zbuf_size + - png_ptr->zstream.avail_out + 1)); + + png_memcpy(text, tmp, text_size); + png_free(png_ptr, tmp); + + png_memcpy(text + text_size, png_ptr->zbuf, + png_ptr->zbuf_size - png_ptr->zstream.avail_out); + + text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; + *(text + text_size) = '\0'; + } + + if (ret != Z_STREAM_END) + { + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + } + else + { + break; + } + + if (ret == Z_STREAM_END) + break; + } + + inflateReset(&png_ptr->zstream); + png_ptr->zstream.avail_in = 0; + + if (ret != Z_STREAM_END) + { + png_ptr->current_text = NULL; + png_free(png_ptr, key); + png_free(png_ptr, text); + return; + } + + png_ptr->current_text = NULL; + png_free(png_ptr, key); + key = text; + text += key_size; + + text_ptr = (png_textp)png_malloc(png_ptr, + png_sizeof(png_text)); + text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; + text_ptr->key = key; + text_ptr->itxt_length = 0; + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; + text_ptr->text = text; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, key); + png_free(png_ptr, text_ptr); + + if (ret) + png_warning(png_ptr, "Insufficient memory to store text chunk"); + } +} +#endif + +#ifdef PNG_READ_iTXt_SUPPORTED +void /* PRIVATE */ +png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 + length) +{ + if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) + { + PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ + png_error(png_ptr, "Out of place iTXt"); + /*NOT REACHED*/ + } + +#ifdef PNG_MAX_MALLOC_64K + png_ptr->skip_length = 0; /* This may not be necessary */ + + if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ + { + png_warning(png_ptr, "iTXt chunk too large to fit in memory"); + png_ptr->skip_length = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_ptr->current_text = (png_charp)png_malloc(png_ptr, + (png_size_t)(length + 1)); + png_ptr->current_text[length] = '\0'; + png_ptr->current_text_ptr = png_ptr->current_text; + png_ptr->current_text_size = (png_size_t)length; + png_ptr->current_text_left = (png_size_t)length; + png_ptr->process_mode = PNG_READ_iTXt_MODE; +} + +void /* PRIVATE */ +png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) +{ + + if (png_ptr->buffer_size && png_ptr->current_text_left) + { + png_size_t text_size; + + if (png_ptr->buffer_size < png_ptr->current_text_left) + text_size = png_ptr->buffer_size; + + else + text_size = png_ptr->current_text_left; + + png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); + png_ptr->current_text_left -= text_size; + png_ptr->current_text_ptr += text_size; + } + + if (!(png_ptr->current_text_left)) + { + png_textp text_ptr; + png_charp key; + int comp_flag; + png_charp lang; + png_charp lang_key; + png_charp text; + int ret; + + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_crc_finish(png_ptr); + +#ifdef PNG_MAX_MALLOC_64K + if (png_ptr->skip_length) + return; +#endif + + key = png_ptr->current_text; + + for (lang = key; *lang; lang++) + /* Empty loop */ ; + + if (lang < key + png_ptr->current_text_size - 3) + lang++; + + comp_flag = *lang++; + lang++; /* Skip comp_type, always zero */ + + for (lang_key = lang; *lang_key; lang_key++) + /* Empty loop */ ; + + lang_key++; /* Skip NUL separator */ + + text=lang_key; + + if (lang_key < key + png_ptr->current_text_size - 1) + { + for (; *text; text++) + /* Empty loop */ ; + } + + if (text < key + png_ptr->current_text_size) + text++; + + text_ptr = (png_textp)png_malloc(png_ptr, + png_sizeof(png_text)); + + text_ptr->compression = comp_flag + 2; + text_ptr->key = key; + text_ptr->lang = lang; + text_ptr->lang_key = lang_key; + text_ptr->text = text; + text_ptr->text_length = 0; + text_ptr->itxt_length = png_strlen(text); + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_ptr->current_text = NULL; + + png_free(png_ptr, text_ptr); + if (ret) + png_warning(png_ptr, "Insufficient memory to store iTXt chunk"); + } +} +#endif + +/* This function is called when we haven't found a handler for this + * chunk. If there isn't a problem with the chunk itself (ie a bad chunk + * name or a critical chunk), the chunk is (currently) silently ignored. + */ +void /* PRIVATE */ +png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 + length) +{ + png_uint_32 skip = 0; + + if (!(png_ptr->chunk_name[0] & 0x20)) + { +#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS +#ifdef PNG_READ_USER_CHUNKS_SUPPORTED + && png_ptr->read_user_chunk_fn == NULL +#endif + ) +#endif + png_chunk_error(png_ptr, "unknown critical chunk"); + + PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ + } + +#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED + if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) + { +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "unknown chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + png_memcpy((png_charp)png_ptr->unknown_chunk.name, + (png_charp)png_ptr->chunk_name, + png_sizeof(png_ptr->unknown_chunk.name)); + png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] + = '\0'; + + png_ptr->unknown_chunk.size = (png_size_t)length; + + if (length == 0) + png_ptr->unknown_chunk.data = NULL; + + else + { + png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, + (png_size_t)length); + png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); + } + +#ifdef PNG_READ_USER_CHUNKS_SUPPORTED + if (png_ptr->read_user_chunk_fn != NULL) + { + /* Callback to user unknown chunk handler */ + int ret; + ret = (*(png_ptr->read_user_chunk_fn)) + (png_ptr, &png_ptr->unknown_chunk); + + if (ret < 0) + png_chunk_error(png_ptr, "error in user chunk"); + + if (ret == 0) + { + if (!(png_ptr->chunk_name[0] & 0x20)) + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS) + png_chunk_error(png_ptr, "unknown critical chunk"); + png_set_unknown_chunks(png_ptr, info_ptr, + &png_ptr->unknown_chunk, 1); + } + } + + else +#endif + png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; + } + + else +#endif + skip=length; + png_push_crc_skip(png_ptr, skip); +} + +void /* PRIVATE */ +png_push_have_info(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr->info_fn != NULL) + (*(png_ptr->info_fn))(png_ptr, info_ptr); +} + +void /* PRIVATE */ +png_push_have_end(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr->end_fn != NULL) + (*(png_ptr->end_fn))(png_ptr, info_ptr); +} + +void /* PRIVATE */ +png_push_have_row(png_structp png_ptr, png_bytep row) +{ + if (png_ptr->row_fn != NULL) + (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, + (int)png_ptr->pass); +} + +void PNGAPI +png_progressive_combine_row (png_structp png_ptr, png_bytep old_row, + png_const_bytep new_row) +{ + PNG_CONST int FARDATA png_pass_dsp_mask[7] = + {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; + + if (png_ptr == NULL) + return; + + if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ + png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); +} + +void PNGAPI +png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, + png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, + png_progressive_end_ptr end_fn) +{ + if (png_ptr == NULL) + return; + + png_ptr->info_fn = info_fn; + png_ptr->row_fn = row_fn; + png_ptr->end_fn = end_fn; + + png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); +} + +png_voidp PNGAPI +png_get_progressive_ptr(png_const_structp png_ptr) +{ + if (png_ptr == NULL) + return (NULL); + + return png_ptr->io_ptr; +} +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngpriv.h b/src/3rdparty/libpng/pngpriv.h new file mode 100644 index 0000000000..9b90f26801 --- /dev/null +++ b/src/3rdparty/libpng/pngpriv.h @@ -0,0 +1,1245 @@ + +/* pngpriv.h - private declarations for use inside libpng + * + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* The symbols declared in this file (including the functions declared + * as PNG_EXTERN) are PRIVATE. They are not part of the libpng public + * interface, and are not recommended for use by regular applications. + * Some of them may become public in the future; others may stay private, + * change in an incompatible way, or even disappear. + * Although the libpng users are not forbidden to include this header, + * they should be well aware of the issues that may arise from doing so. + */ + +#ifndef PNGPRIV_H +#define PNGPRIV_H + +#ifdef _MSC_VER +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* This is required for the definition of abort(), used as a last ditch + * error handler when all else fails. + */ +#include + +#define PNGLIB_BUILD +#ifdef PNG_USER_CONFIG +# include "pngusr.h" + /* These should have been defined in pngusr.h */ +# ifndef PNG_USER_PRIVATEBUILD +# define PNG_USER_PRIVATEBUILD "Custom libpng build" +# endif +# ifndef PNG_USER_DLLFNAME_POSTFIX +# define PNG_USER_DLLFNAME_POSTFIX "Cb" +# endif +#endif +#include "png.h" +#include "pnginfo.h" +#include "pngstruct.h" + +/* This is used for 16 bit gamma tables - only the top level pointers are const, + * this could be changed: + */ +typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; + +/* Added at libpng-1.2.9 */ +/* Moved to pngpriv.h at libpng-1.5.0 */ + +/* config.h is created by and PNG_CONFIGURE_LIBPNG is set by the "configure" + * script. We may need it here to get the correct configuration on things + * like limits. + */ +#ifdef PNG_CONFIGURE_LIBPNG +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif +#endif + +/* Moved to pngpriv.h at libpng-1.5.0 */ +/* NOTE: some of these may have been used in external applications as + * these definitions were exposed in pngconf.h prior to 1.5. + */ + +/* If you are running on a machine where you cannot allocate more + * than 64K of memory at once, uncomment this. While libpng will not + * normally need that much memory in a chunk (unless you load up a very + * large file), zlib needs to know how big of a chunk it can use, and + * libpng thus makes sure to check any memory allocation to verify it + * will fit into memory. + * + * zlib provides 'MAXSEG_64K' which, if defined, indicates the + * same limit and pngconf.h (already included) sets the limit + * if certain operating systems are detected. + */ +#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) +# define PNG_MAX_MALLOC_64K +#endif + +/* Unused formal parameter warnings are silenced using the following macro + * which is expected to have no bad effects on performance (optimizing + * compilers will probably remove it entirely). Note that if you replace + * it with something other than whitespace, you must include the terminating + * semicolon. + */ +#define PNG_UNUSED(param) (void)param; + +/* Just a little check that someone hasn't tried to define something + * contradictory. + */ +#if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) +# undef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 65536L +#endif + +/* If warnings or errors are turned off the code is disabled + * or redirected here. + */ +#ifndef PNG_WARNINGS_SUPPORTED +# define png_warning(s1,s2) ((void)0) +# define png_chunk_warning(s1,s2) ((void)0) +#endif +#ifndef PNG_ERROR_TEXT_SUPPORTED +# define png_error(s1,s2) png_err(s1) +# define png_chunk_error(s1,s2) png_err(s1) +# define png_fixed_error(s1,s2) png_err(s1) +#endif + +#ifndef PNG_EXTERN +/* The functions exported by PNG_EXTERN are internal functions, which + * aren't usually used outside the library (as far as I know), so it is + * debatable if they should be exported at all. In the future, when it + * is possible to have run-time registry of chunk-handling functions, + * some of these might be made available again. +# define PNG_EXTERN extern + */ +# define PNG_EXTERN +#endif + +/* Some fixed point APIs are still required even if not exported because + * they get used by the corresponding floating point APIs. This magic + * deals with this: + */ +#ifdef PNG_FIXED_POINT_SUPPORTED +# define PNGFAPI PNGAPI +#else +# define PNGFAPI /* PRIVATE */ +#endif + +/* Other defines specific to compilers can go here. Try to keep + * them inside an appropriate ifdef/endif pair for portability. + */ +#if defined(PNG_FLOATING_POINT_SUPPORTED) ||\ + defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) + /* png.c requires the following ANSI-C constants if the conversion of + * floating point to ASCII is implemented therein: + * + * DBL_DIG Maximum number of decimal digits (can be set to any constant) + * DBL_MIN Smallest normalized fp number (can be set to an arbitrary value) + * DBL_MAX Maximum floating point number (can be set to an arbitrary value) + */ +# include + +# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ + defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) + /* We need to check that hasn't already been included earlier + * as it seems it doesn't agree with , yet we should really use + * if possible. + */ +# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) +# include +# endif +# else +# include +# endif +# if defined(_AMIGA) && defined(__SASC) && defined(_M68881) + /* Amiga SAS/C: We must include builtin FPU functions when compiling using + * MATH=68881 + */ +# include +# endif +#endif + +/* This provides the non-ANSI (far) memory allocation routines. */ +#if defined(__TURBOC__) && defined(__MSDOS__) +# include +# include +#endif + +#if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \ + defined(_WIN32) || defined(__WIN32__) +# if !defined(__SYMBIAN32__) +# include /* defines _WINDOWS_ macro */ +# endif +#endif + +/* Moved here around 1.5.0beta36 from pngconf.h */ +/* Users may want to use these so they are not private. Any library + * functions that are passed far data must be model-independent. + */ + +/* Memory model/platform independent fns */ +#ifndef PNG_ABORT +# if defined(_WINDOWS_) || defined(_WIN32_WCE) +# define PNG_ABORT() ExitProcess(0) +# else +# define PNG_ABORT() abort() +# endif +#endif + +#ifdef USE_FAR_KEYWORD +/* Use this to make far-to-near assignments */ +# define CHECK 1 +# define NOCHECK 0 +# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) +# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) +# define png_strcpy _fstrcpy +# define png_strncpy _fstrncpy /* Added to v 1.2.6 */ +# define png_strlen _fstrlen +# define png_memcmp _fmemcmp /* SJT: added */ +# define png_memcpy _fmemcpy +# define png_memset _fmemset +# define png_sprintf sprintf +#else +# ifdef _WINDOWS_ /* Favor Windows over C runtime fns */ +# define CVT_PTR(ptr) (ptr) +# define CVT_PTR_NOCHECK(ptr) (ptr) +# define png_strcpy lstrcpyA +# define png_strncpy lstrcpynA +# define png_strlen lstrlenA +# define png_memcmp memcmp +# define png_memcpy CopyMemory +# define png_memset memset +# define png_sprintf wsprintfA +# else +# define CVT_PTR(ptr) (ptr) +# define CVT_PTR_NOCHECK(ptr) (ptr) +# define png_strcpy strcpy +# define png_strncpy strncpy /* Added to v 1.2.6 */ +# define png_strlen strlen +# define png_memcmp memcmp /* SJT: added */ +# define png_memcpy memcpy +# define png_memset memset +# define png_sprintf sprintf +# endif +#endif +/* End of memory model/platform independent support */ + +#ifndef PNG_NO_SNPRINTF +# ifdef _MSC_VER +# define png_snprintf _snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 _snprintf +# define png_snprintf6 _snprintf +# else +# define png_snprintf snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 snprintf +# define png_snprintf6 snprintf +# endif +#else + /* You don't have or don't want to use snprintf(). Caution: Using + * sprintf instead of snprintf exposes your application to accidental + * or malevolent buffer overflows. If you don't have snprintf() + * as a general rule you should provide one (you can get one from + * Portable OpenSSH). + */ +# define png_snprintf(s1,n,fmt,x1) png_sprintf(s1,fmt,x1) +# define png_snprintf2(s1,n,fmt,x1,x2) png_sprintf(s1,fmt,x1,x2) +# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ + png_sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) +#endif +/* End of 1.5.0beta36 move from pngconf.h */ + +/* CONSTANTS and UTILITY MACROS + * These are used internally by libpng and not exposed in the API + */ + +/* Various modes of operation. Note that after an init, mode is set to + * zero automatically when the structure is created. + */ +#define PNG_HAVE_IHDR 0x01 +#define PNG_HAVE_PLTE 0x02 +#define PNG_HAVE_IDAT 0x04 +#define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ +#define PNG_HAVE_IEND 0x10 +#define PNG_HAVE_gAMA 0x20 +#define PNG_HAVE_cHRM 0x40 +#define PNG_HAVE_sRGB 0x80 +#define PNG_HAVE_CHUNK_HEADER 0x100 +#define PNG_WROTE_tIME 0x200 +#define PNG_WROTE_INFO_BEFORE_PLTE 0x400 +#define PNG_BACKGROUND_IS_GRAY 0x800 +#define PNG_HAVE_PNG_SIGNATURE 0x1000 +#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ + +/* Flags for the transformations the PNG library does on the image data */ +#define PNG_BGR 0x0001 +#define PNG_INTERLACE 0x0002 +#define PNG_PACK 0x0004 +#define PNG_SHIFT 0x0008 +#define PNG_SWAP_BYTES 0x0010 +#define PNG_INVERT_MONO 0x0020 +#define PNG_QUANTIZE 0x0040 +#define PNG_BACKGROUND 0x0080 +#define PNG_BACKGROUND_EXPAND 0x0100 + /* 0x0200 unused */ +#define PNG_16_TO_8 0x0400 +#define PNG_RGBA 0x0800 +#define PNG_EXPAND 0x1000 +#define PNG_GAMMA 0x2000 +#define PNG_GRAY_TO_RGB 0x4000 +#define PNG_FILLER 0x8000L +#define PNG_PACKSWAP 0x10000L +#define PNG_SWAP_ALPHA 0x20000L +#define PNG_STRIP_ALPHA 0x40000L +#define PNG_INVERT_ALPHA 0x80000L +#define PNG_USER_TRANSFORM 0x100000L +#define PNG_RGB_TO_GRAY_ERR 0x200000L +#define PNG_RGB_TO_GRAY_WARN 0x400000L +#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ + /* 0x800000L Unused */ +#define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ +#define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ + /* 0x4000000L unused */ + /* 0x8000000L unused */ + /* 0x10000000L unused */ + /* 0x20000000L unused */ + /* 0x40000000L unused */ + +/* Flags for png_create_struct */ +#define PNG_STRUCT_PNG 0x0001 +#define PNG_STRUCT_INFO 0x0002 + +/* Scaling factor for filter heuristic weighting calculations */ +#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) +#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) + +/* Flags for the png_ptr->flags rather than declaring a byte for each one */ +#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 +#define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 +#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 +#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 +#define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 +#define PNG_FLAG_ZLIB_FINISHED 0x0020 +#define PNG_FLAG_ROW_INIT 0x0040 +#define PNG_FLAG_FILLER_AFTER 0x0080 +#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 +#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 +#define PNG_FLAG_CRC_CRITICAL_USE 0x0400 +#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 + /* 0x1000 unused */ + /* 0x2000 unused */ + /* 0x4000 unused */ +#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L +#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L +#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L +#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L +#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L +#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L +#define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ +#define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ +#define PNG_FLAG_BENIGN_ERRORS_WARN 0x800000L /* Added to libpng-1.4.0 */ + /* 0x1000000L unused */ + /* 0x2000000L unused */ + /* 0x4000000L unused */ + /* 0x8000000L unused */ + /* 0x10000000L unused */ + /* 0x20000000L unused */ + /* 0x40000000L unused */ + +#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ + PNG_FLAG_CRC_ANCILLARY_NOWARN) + +#define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ + PNG_FLAG_CRC_CRITICAL_IGNORE) + +#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ + PNG_FLAG_CRC_CRITICAL_MASK) + +/* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib + * can handle at once. This type need be no larger than 16 bits (so maximum of + * 65535), this define allows us to discover how big it is, but limited by the + * maximuum for png_size_t. The value can be overriden in a library build + * (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably + * lower value (e.g. 255 works). A lower value may help memory usage (slightly) + * and may even improve performance on some systems (and degrade it on others.) + */ +#ifndef ZLIB_IO_MAX +# define ZLIB_IO_MAX ((uInt)-1) +#endif + +/* Save typing and make code easier to understand */ + +#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ + abs((int)((c1).green) - (int)((c2).green)) + \ + abs((int)((c1).blue) - (int)((c2).blue))) + +/* Added to libpng-1.2.6 JB */ +#define PNG_ROWBYTES(pixel_bits, width) \ + ((pixel_bits) >= 8 ? \ + ((png_size_t)(width) * (((png_size_t)(pixel_bits)) >> 3)) : \ + (( ((png_size_t)(width) * ((png_size_t)(pixel_bits))) + 7) >> 3) ) + +/* PNG_OUT_OF_RANGE returns true if value is outside the range + * ideal-delta..ideal+delta. Each argument is evaluated twice. + * "ideal" and "delta" should be constants, normally simple + * integers, "value" a variable. Added to libpng-1.2.6 JB + */ +#define PNG_OUT_OF_RANGE(value, ideal, delta) \ + ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) + +/* Conversions between fixed and floating point, only defined if + * required (to make sure the code doesn't accidentally use float + * when it is supposedly disabled.) + */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +/* The floating point conversion can't overflow, though it can and + * does lose accuracy relative to the original fixed point value. + * In practice this doesn't matter because png_fixed_point only + * stores numbers with very low precision. The png_ptr and s + * arguments are unused by default but are there in case error + * checking becomes a requirement. + */ +#define png_float(png_ptr, fixed, s) (.00001 * (fixed)) + +/* The fixed point conversion performs range checking and evaluates + * its argument multiple times, so must be used with care. The + * range checking uses the PNG specification values for a signed + * 32 bit fixed point value except that the values are deliberately + * rounded-to-zero to an integral value - 21474 (21474.83 is roughly + * (2^31-1) * 100000). 's' is a string that describes the value being + * converted. + * + * NOTE: this macro will raise a png_error if the range check fails, + * therefore it is normally only appropriate to use this on values + * that come from API calls or other sources where an out of range + * error indicates a programming error, not a data error! + * + * NOTE: by default this is off - the macro is not used - because the + * function call saves a lot of code. + */ +#ifdef PNG_FIXED_POINT_MACRO_SUPPORTED +#define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\ + ((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0)) +#else +PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp, + png_const_charp text)); +#endif +#endif + +/* Constant strings for known chunk types. If you need to add a chunk, + * define the name here, and add an invocation of the macro wherever it's + * needed. + */ +#define PNG_IHDR PNG_CONST png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} +#define PNG_IDAT PNG_CONST png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} +#define PNG_IEND PNG_CONST png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} +#define PNG_PLTE PNG_CONST png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} +#define PNG_bKGD PNG_CONST png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} +#define PNG_cHRM PNG_CONST png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} +#define PNG_gAMA PNG_CONST png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} +#define PNG_hIST PNG_CONST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} +#define PNG_iCCP PNG_CONST png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} +#define PNG_iTXt PNG_CONST png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} +#define PNG_oFFs PNG_CONST png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} +#define PNG_pCAL PNG_CONST png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} +#define PNG_sCAL PNG_CONST png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} +#define PNG_pHYs PNG_CONST png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} +#define PNG_sBIT PNG_CONST png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} +#define PNG_sPLT PNG_CONST png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} +#define PNG_sRGB PNG_CONST png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} +#define PNG_sTER PNG_CONST png_byte png_sTER[5] = {115, 84, 69, 82, '\0'} +#define PNG_tEXt PNG_CONST png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} +#define PNG_tIME PNG_CONST png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} +#define PNG_tRNS PNG_CONST png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} +#define PNG_zTXt PNG_CONST png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} + + +/* Inhibit C++ name-mangling for libpng functions but not for system calls. */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* These functions are used internally in the code. They generally + * shouldn't be used unless you are writing code to add or replace some + * functionality in libpng. More information about most functions can + * be found in the files where the functions are located. + */ + +/* Allocate memory for an internal libpng struct */ +PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct,PNGARG((int type)), + PNG_ALLOCATED); + +/* Free memory from internal libpng struct */ +PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); + +PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct_2, + PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)), + PNG_ALLOCATED); +PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, + png_free_ptr free_fn, png_voidp mem_ptr)); + +/* Free any memory that info_ptr points to and reset struct. */ +PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +/* Function to allocate memory for zlib. PNGAPI is disallowed. */ +PNG_EXTERN PNG_FUNCTION(voidpf,png_zalloc,PNGARG((voidpf png_ptr, uInt items, + uInt size)),PNG_ALLOCATED); + +/* Function to free memory for zlib. PNGAPI is disallowed. */ +PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); + +/* Next four functions are used internally as callbacks. PNGCBAPI is required + * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3, changed to + * PNGCBAPI at 1.5.0 + */ + +PNG_EXTERN void PNGCBAPI png_default_read_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void PNGCBAPI png_push_fill_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t length)); +#endif + +PNG_EXTERN void PNGCBAPI png_default_write_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +# ifdef PNG_STDIO_SUPPORTED +PNG_EXTERN void PNGCBAPI png_default_flush PNGARG((png_structp png_ptr)); +# endif +#endif + +/* Reset the CRC variable */ +PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); + +/* Write the "data" buffer to whatever output you are using */ +PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, + png_const_bytep data, png_size_t length)); + +/* Read and check the PNG file signature */ +PNG_EXTERN void png_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr)); + +/* Read the chunk header (length + type name) */ +PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); + +/* Read data from whatever input you are using into the "data" buffer */ +PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +/* Read bytes into buf, and update png_ptr->crc */ +PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, + png_size_t length)); + +/* Decompress data in a chunk that uses compression */ +#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ + defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) +PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, + int comp_type, png_size_t chunklength, png_size_t prefix_length, + png_size_t *data_length)); +#endif + +/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ +PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); + +/* Read the CRC from the file and compare it to the libpng calculated CRC */ +PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); + +/* Calculate the CRC over a section of data. Note that we are only + * passing a maximum of 64K on systems that have this as a memory limit, + * since this is the maximum buffer size we can specify. + */ +PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, + png_const_bytep ptr, png_size_t length)); + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); +#endif + +/* Write various chunks */ + +/* Write the IHDR chunk, and update the png_struct with the necessary + * information. + */ +PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, + png_uint_32 height, + int bit_depth, int color_type, int compression_method, int filter_method, + int interlace_method)); + +PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, + png_const_colorp palette, png_uint_32 num_pal)); + +PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); + +#ifdef PNG_WRITE_gAMA_SUPPORTED +# ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); +# endif +# ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, + png_fixed_point file_gamma)); +# endif +#endif + +#ifdef PNG_WRITE_sBIT_SUPPORTED +PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, + png_const_color_8p sbit, int color_type)); +#endif + +#ifdef PNG_WRITE_cHRM_SUPPORTED +# ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, + double white_x, double white_y, + double red_x, double red_y, double green_x, double green_y, + double blue_x, double blue_y)); +# endif +PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif + +#ifdef PNG_WRITE_sRGB_SUPPORTED +PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, + int intent)); +#endif + +#ifdef PNG_WRITE_iCCP_SUPPORTED +PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, + png_const_charp name, int compression_type, + png_const_charp profile, int proflen)); + /* Note to maintainer: profile should be png_bytep */ +#endif + +#ifdef PNG_WRITE_sPLT_SUPPORTED +PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, + png_const_sPLT_tp palette)); +#endif + +#ifdef PNG_WRITE_tRNS_SUPPORTED +PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, + png_const_bytep trans, png_const_color_16p values, int number, + int color_type)); +#endif + +#ifdef PNG_WRITE_bKGD_SUPPORTED +PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, + png_const_color_16p values, int color_type)); +#endif + +#ifdef PNG_WRITE_hIST_SUPPORTED +PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, + png_const_uint_16p hist, int num_hist)); +#endif + +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ + defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) +PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, + png_const_charp key, png_charpp new_key)); +#endif + +#ifdef PNG_WRITE_tEXt_SUPPORTED +PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_const_charp key, + png_const_charp text, png_size_t text_len)); +#endif + +#ifdef PNG_WRITE_zTXt_SUPPORTED +PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_const_charp key, + png_const_charp text, png_size_t text_len, int compression)); +#endif + +#ifdef PNG_WRITE_iTXt_SUPPORTED +PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, + int compression, png_const_charp key, png_const_charp lang, + png_const_charp lang_key, png_const_charp text)); +#endif + +#ifdef PNG_TEXT_SUPPORTED /* Added at version 1.0.14 and 1.2.4 */ +PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, + png_infop info_ptr, png_const_textp text_ptr, int num_text)); +#endif + +#ifdef PNG_WRITE_oFFs_SUPPORTED +PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, + png_int_32 x_offset, png_int_32 y_offset, int unit_type)); +#endif + +#ifdef PNG_WRITE_pCAL_SUPPORTED +PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, + png_int_32 X0, png_int_32 X1, int type, int nparams, + png_const_charp units, png_charpp params)); +#endif + +#ifdef PNG_WRITE_pHYs_SUPPORTED +PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, + png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, + int unit_type)); +#endif + +#ifdef PNG_WRITE_tIME_SUPPORTED +PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, + png_const_timep mod_time)); +#endif + +#ifdef PNG_WRITE_sCAL_SUPPORTED +PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, + int unit, png_const_charp width, png_const_charp height)); +#endif + +/* Called when finished processing a row of data */ +PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); + +/* Internal use only. Called before first row of data */ +PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); + +/* Combine a row of data, dealing with alpha, etc. if requested */ +PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, + int mask)); + +#ifdef PNG_READ_INTERLACING_SUPPORTED +/* Expand an interlaced row */ +/* OLD pre-1.0.9 interface: +PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, + png_bytep row, int pass, png_uint_32 transformations)); + */ +PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); +#endif + +/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED +/* Grab pixels out of a row for an interlaced pass */ +PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, + png_bytep row, int pass)); +#endif + +/* Unfilter a row */ +PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, + png_row_infop row_info, png_bytep row, png_const_bytep prev_row, + int filter)); + +/* Choose the best filter to use and filter the row data */ +PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, + png_row_infop row_info)); + +/* Write out the filtered row. */ +PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, + png_bytep filtered_row)); +/* Finish a row while reading, dealing with interlacing passes, etc. */ +PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); + +/* Initialize the row buffers, etc. */ +PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); +/* Optional call to update the users info structure */ +PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +/* These are the functions that do the transformations */ +#ifdef PNG_READ_FILLER_SUPPORTED +PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 filler, png_uint_32 flags)); +#endif + +#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED +PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED +PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED +PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED +PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ + defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 flags)); +#endif + +#ifdef PNG_16BIT_SUPPORTED +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, + png_bytep row)); +#endif +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ + defined(PNG_WRITE_PACKSWAP_SUPPORTED) +PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, + png_row_infop row_info, png_bytep row)); +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED +PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_READ_PACK_SUPPORTED +PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_READ_SHIFT_SUPPORTED +PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_8p sig_bits)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_READ_16_TO_8_SUPPORTED +PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +PNG_EXTERN void png_do_quantize PNGARG((png_row_infop row_info, + png_bytep row, png_const_bytep palette_lookup, + png_const_bytep quantize_lookup)); + +# ifdef PNG_CORRECT_PALETTE_SUPPORTED +PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, + png_colorp palette, int num_palette)); +# endif +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#ifdef PNG_WRITE_PACK_SUPPORTED +PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 bit_depth)); +#endif + +#ifdef PNG_WRITE_SHIFT_SUPPORTED +PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_8p bit_depth)); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +# ifdef PNG_READ_GAMMA_SUPPORTED +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_16p trans_color, + png_const_color_16p background, png_const_color_16p background_1, + png_const_bytep gamma_table, png_const_bytep gamma_from_1, + png_const_bytep gamma_to_1, png_const_uint_16pp gamma_16, + png_const_uint_16pp gamma_16_from_1, png_const_uint_16pp gamma_16_to_1, + int gamma_shift)); +# else +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_16p trans_color, + png_const_color_16p background)); +# endif +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, + png_bytep row, png_const_bytep gamma_table, + png_const_uint_16pp gamma_16_table, int gamma_shift)); +#endif + +#ifdef PNG_READ_EXPAND_SUPPORTED +PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, + png_bytep row, png_const_colorp palette, png_const_bytep trans, + int num_trans)); +PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, + png_bytep row, png_const_color_16p trans_color)); +#endif + +/* The following decodes the appropriate chunks, and does error correction, + * then calls the appropriate callback for the chunk if it is valid. + */ + +/* Decode the IHDR chunk */ +PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); + +#ifdef PNG_READ_bKGD_SUPPORTED +PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_cHRM_SUPPORTED +PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_gAMA_SUPPORTED +PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_hIST_SUPPORTED +PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_iCCP_SUPPORTED +PNG_EXTERN void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif /* PNG_READ_iCCP_SUPPORTED */ + +#ifdef PNG_READ_iTXt_SUPPORTED +PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_oFFs_SUPPORTED +PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_pCAL_SUPPORTED +PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_pHYs_SUPPORTED +PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_sBIT_SUPPORTED +PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_sCAL_SUPPORTED +PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_sPLT_SUPPORTED +PNG_EXTERN void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif /* PNG_READ_sPLT_SUPPORTED */ + +#ifdef PNG_READ_sRGB_SUPPORTED +PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_tEXt_SUPPORTED +PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_tIME_SUPPORTED +PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_tRNS_SUPPORTED +PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#ifdef PNG_READ_zTXt_SUPPORTED +PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); + +PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, + png_const_bytep chunk_name)); + +/* Handle the transformations for reading and writing */ +PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); + +PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, + png_uint_32 length)); +PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t buffer_length)); +PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t buffer_length)); +PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); +PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); +# ifdef PNG_READ_tEXt_SUPPORTED +PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +# endif +# ifdef PNG_READ_zTXt_SUPPORTED +PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +# endif +# ifdef PNG_READ_iTXt_SUPPORTED +PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +# endif + +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, + png_bytep row)); +PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +/* Added at libpng version 1.4.0 */ +#ifdef PNG_CHECK_cHRM_SUPPORTED +PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr, + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif + +#ifdef PNG_CHECK_cHRM_SUPPORTED +/* Added at libpng version 1.2.34 and 1.4.0 */ +/* Currently only used by png_check_cHRM_fixed */ +PNG_EXTERN void png_64bit_product PNGARG((long v1, long v2, + unsigned long *hi_product, unsigned long *lo_product)); +#endif + +/* Added at libpng version 1.4.0 */ +PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_type, int compression_type, + int filter_type)); + +/* Free all memory used by the read (old method - NOT DLL EXPORTED) */ +PNG_EXTERN void png_read_destroy PNGARG((png_structp png_ptr, + png_infop info_ptr, png_infop end_info_ptr)); + +/* Free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ +PNG_EXTERN void png_write_destroy PNGARG((png_structp png_ptr)); + +#ifdef USE_FAR_KEYWORD /* memory model conversion function */ +PNG_EXTERN void *png_far_to_near PNGARG((png_structp png_ptr, png_voidp ptr, + int check)); +#endif /* USE_FAR_KEYWORD */ + +#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) +PNG_EXTERN PNG_FUNCTION(void, png_fixed_error, (png_structp png_ptr, + png_const_charp name),PNG_NORETURN); +#endif + +/* ASCII to FP interfaces, currently only implemented if sCAL + * support is required. + */ +#if defined(PNG_READ_sCAL_SUPPORTED) +/* MAX_DIGITS is actually the maximum number of characters in an sCAL + * width or height, derived from the precision (number of significant + * digits - a build time settable option) and assumpitions about the + * maximum ridiculous exponent. + */ +#define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/) + +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_ascii_from_fp PNGARG((png_structp png_ptr, png_charp ascii, + png_size_t size, double fp, unsigned int precision)); +#endif /* FLOATING_POINT */ + +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr, + png_charp ascii, png_size_t size, png_fixed_point fp)); +#endif /* FIXED_POINT */ +#endif /* READ_sCAL */ + +#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) +/* An internal API to validate the format of a floating point number. + * The result is the index of the next character. If the number is + * not valid it will be the index of a character in the supposed number. + * + * The format of a number is defined in the PNG extensions specification + * and this API is strictly conformant to that spec, not anyone elses! + * + * The format as a regular expression is: + * + * [+-]?[0-9]+.?([Ee][+-]?[0-9]+)? + * + * or: + * + * [+-]?.[0-9]+(.[0-9]+)?([Ee][+-]?[0-9]+)? + * + * The complexity is that either integer or fraction must be present and the + * fraction is permitted to have no digits only if the integer is present. + * + * NOTE: The dangling E problem. + * There is a PNG valid floating point number in the following: + * + * PNG floating point numb1.ers are not greedy. + * + * Working this out requires *TWO* character lookahead (because of the + * sign), the parser does not do this - it will fail at the 'r' - this + * doesn't matter for PNG sCAL chunk values, but it requires more care + * if the value were ever to be embedded in something more complex. Use + * ANSI-C strtod if you need the lookahead. + */ +/* State table for the parser. */ +#define PNG_FP_INTEGER 0 /* before or in integer */ +#define PNG_FP_FRACTION 1 /* before or in fraction */ +#define PNG_FP_EXPONENT 2 /* before or in exponent */ +#define PNG_FP_STATE 3 /* mask for the above */ +#define PNG_FP_SAW_SIGN 4 /* Saw +/- in current state */ +#define PNG_FP_SAW_DIGIT 8 /* Saw a digit in current state */ +#define PNG_FP_SAW_DOT 16 /* Saw a dot in current state */ +#define PNG_FP_SAW_E 32 /* Saw an E (or e) in current state */ +#define PNG_FP_SAW_ANY 60 /* Saw any of the above 4 */ +#define PNG_FP_WAS_VALID 64 /* Preceding substring is a valid fp number */ +#define PNG_FP_INVALID 128 /* Available for callers as a distinct value */ + +/* Result codes for the parser (boolean - true meants ok, false means + * not ok yet.) + */ +#define PNG_FP_MAYBE 0 /* The number may be valid in the future */ +#define PNG_FP_OK 1 /* The number is valid */ + +/* The actual parser. This can be called repeatedly, it updates + * the index into the string and the state variable (which must + * be initialzed to 0). It returns a result code, as above. There + * is no point calling the parser any more if it fails to advance to + * the end of the string - it is stuck on an invalid character (or + * terminated by '\0'). + * + * Note that the pointer will consume an E or even an E+ then leave + * a 'maybe' state even though a preceding integer.fraction is valid. + * The PNG_FP_WAS_VALID flag indicates that a preceding substring was + * a valid number. It's possible to recover from this by calling + * the parser again (from the start, with state 0) but with a string + * that omits the last character (i.e. set the size to the index of + * the problem character.) This has not been tested within libpng. + */ +PNG_EXTERN int png_check_fp_number PNGARG((png_const_charp string, + png_size_t size, int *statep, png_size_tp whereami)); + +/* This is the same but it checks a complete string and returns true + * only if it just contains a floating point number. + */ +PNG_EXTERN int png_check_fp_string PNGARG((png_const_charp string, + png_size_t size)); +#endif /* pCAL || sCAL */ + +#if defined(PNG_READ_GAMMA_SUPPORTED) ||\ + defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED) +/* Added at libpng version 1.5.0 */ +/* This is a utility to provide a*times/div (rounded) and indicate + * if there is an overflow. The result is a boolean - false (0) + * for overflow, true (1) if no overflow, in which case *res + * holds the result. + */ +PNG_EXTERN int png_muldiv PNGARG((png_fixed_point_p res, png_fixed_point a, + png_int_32 times, png_int_32 div)); +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED) +/* Same deal, but issue a warning on overflow and return 0. */ +PNG_EXTERN png_fixed_point png_muldiv_warn PNGARG((png_structp png_ptr, + png_fixed_point a, png_int_32 times, png_int_32 div)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* Calculate a reciprocal - used for gamma values. This returns + * 0 if the argument is 0 in order to maintain an undefined value, + * there are no warnings. + */ +PNG_EXTERN png_fixed_point png_reciprocal PNGARG((png_fixed_point a)); + +/* The same but gives a reciprocal of the product of two fixed point + * values. Accuracy is suitable for gamma calculations but this is + * not exact - use png_muldiv for that. + */ +PNG_EXTERN png_fixed_point png_reciprocal2 PNGARG((png_fixed_point a, + png_fixed_point b)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* Internal fixed point gamma correction. These APIs are called as + * required to convert single values - they don't need to be fast, + * they are not used when processing image pixel values. + * + * While the input is an 'unsigned' value it must actually be the + * correct bit value - 0..255 or 0..65535 as required. + */ +PNG_EXTERN png_uint_16 png_gamma_correct PNGARG((png_structp png_ptr, + unsigned int value, png_fixed_point gamma)); +PNG_EXTERN int png_gamma_significant PNGARG((png_fixed_point gamma)); +PNG_EXTERN png_uint_16 png_gamma_16bit_correct PNGARG((unsigned int value, + png_fixed_point gamma)); +PNG_EXTERN png_byte png_gamma_8bit_correct PNGARG((unsigned int value, + png_fixed_point gamma)); +PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr, + int bit_depth)); +#endif + +/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + + +#include "pngdebug.h" + +#ifdef __cplusplus +} +#endif + +#endif /* PNGPRIV_H */ diff --git a/src/3rdparty/libpng/pngread.c b/src/3rdparty/libpng/pngread.c new file mode 100644 index 0000000000..2c8f2cd687 --- /dev/null +++ b/src/3rdparty/libpng/pngread.c @@ -0,0 +1,1466 @@ + +/* pngread.c - read a PNG file + * + * Last changed in libpng 1.5.1 [$RDATE%] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file contains routines that an application calls directly to + * read a PNG file or stream. + */ + +#include "pngpriv.h" + +#ifdef PNG_READ_SUPPORTED + +/* Create a PNG structure for reading, and allocate any memory needed. */ +PNG_FUNCTION(png_structp,PNGAPI +png_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED) +{ + +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, + warn_fn, NULL, NULL, NULL)); +} + +/* Alternate create PNG structure for reading, and allocate any memory + * needed. + */ +PNG_FUNCTION(png_structp,PNGAPI +png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + +#ifdef PNG_SETJMP_SUPPORTED + volatile +#endif + png_structp png_ptr; + volatile int png_cleanup_needed = 0; + +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + jmp_buf png_jmpbuf; +#endif +#endif + + int i; + + png_debug(1, "in png_create_read_struct"); + +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, + malloc_fn, mem_ptr); +#else + png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); +#endif + if (png_ptr == NULL) + return (NULL); + + /* Added at libpng-1.2.6 */ +#ifdef PNG_USER_LIMITS_SUPPORTED + png_ptr->user_width_max = PNG_USER_WIDTH_MAX; + png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; + +# ifdef PNG_USER_CHUNK_CACHE_MAX + /* Added at libpng-1.2.43 and 1.4.0 */ + png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX; +# endif + +# ifdef PNG_SET_USER_CHUNK_MALLOC_MAX + /* Added at libpng-1.2.43 and 1.4.1 */ + png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX; +# endif +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* Applications that neglect to set up their own setjmp() and then + encounter a png_error() will longjmp here. Since the jmpbuf is + then meaningless we abort instead of returning. */ +#ifdef USE_FAR_KEYWORD + if (setjmp(png_jmpbuf)) +#else + if (setjmp(png_jmpbuf(png_ptr))) /* Sets longjmp to match setjmp */ +#endif + PNG_ABORT(); +#ifdef USE_FAR_KEYWORD + png_memcpy(png_jmpbuf(png_ptr), png_jmpbuf, png_sizeof(jmp_buf)); +#endif +#endif /* PNG_SETJMP_SUPPORTED */ + +#ifdef PNG_USER_MEM_SUPPORTED + png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); +#endif + + png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); + + if (user_png_ver) + { + i = 0; + + do + { + if (user_png_ver[i] != png_libpng_ver[i]) + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + } while (png_libpng_ver[i++]); + } + + else + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + + + if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) + { + /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so + * we must recompile any applications that use any older library version. + * For versions after libpng 1.0, we will be compatible, so we need + * only check the first digit. + */ + if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || + (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || + (user_png_ver[0] == '0' && user_png_ver[2] < '9')) + { +#ifdef PNG_CONSOLE_IO_SUPPORTED + char msg[80]; + if (user_png_ver) + { + png_snprintf2(msg, 80, + "Application built with libpng-%.20s" + " but running with %.20s", + user_png_ver, + png_libpng_ver); + png_warning(png_ptr, msg); + } +#else + png_warning(png_ptr, + "Incompatible libpng version in application and library"); +#endif +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags = 0; +#endif + + png_cleanup_needed = 1; + } + } + + if (!png_cleanup_needed) + { + /* Initialize zbuf - compression buffer */ + png_ptr->zbuf_size = PNG_ZBUF_SIZE; + png_ptr->zbuf = (png_bytep)png_malloc_warn(png_ptr, png_ptr->zbuf_size); + + if (png_ptr->zbuf == NULL) + png_cleanup_needed = 1; + } + + png_ptr->zstream.zalloc = png_zalloc; + png_ptr->zstream.zfree = png_zfree; + png_ptr->zstream.opaque = (voidpf)png_ptr; + + if (!png_cleanup_needed) + { + switch (inflateInit(&png_ptr->zstream)) + { + case Z_OK: + break; /* Do nothing */ + + case Z_MEM_ERROR: + png_warning(png_ptr, "zlib memory error"); + png_cleanup_needed = 1; + break; + + case Z_STREAM_ERROR: + png_warning(png_ptr, "zlib stream error"); + png_cleanup_needed = 1; + break; + + case Z_VERSION_ERROR: + png_warning(png_ptr, "zlib version error"); + png_cleanup_needed = 1; + break; + + default: png_warning(png_ptr, "Unknown zlib error"); + png_cleanup_needed = 1; + } + } + + if (png_cleanup_needed) + { + /* Clean up PNG structure and deallocate any memory. */ + png_free(png_ptr, png_ptr->zbuf); + png_ptr->zbuf = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, + (png_free_ptr)free_fn, (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + return (NULL); + } + + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + png_set_read_fn(png_ptr, NULL, NULL); + + + return (png_ptr); +} + + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. This has been + * changed in v0.90 to allow reading a file that already has the magic + * bytes read from the stream. You can tell libpng how many bytes have + * been read from the beginning of the stream (up to the maximum of 8) + * via png_set_sig_bytes(), and we will only check the remaining bytes + * here. The application can then have access to the signature bytes we + * read if it is determined that this isn't a valid PNG file. + */ +void PNGAPI +png_read_info(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_info"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* Read and check the PNG file signature. */ + png_read_sig(png_ptr, info_ptr); + + for (;;) + { + PNG_IHDR; + PNG_IDAT; + PNG_IEND; + PNG_PLTE; +#ifdef PNG_READ_bKGD_SUPPORTED + PNG_bKGD; +#endif +#ifdef PNG_READ_cHRM_SUPPORTED + PNG_cHRM; +#endif +#ifdef PNG_READ_gAMA_SUPPORTED + PNG_gAMA; +#endif +#ifdef PNG_READ_hIST_SUPPORTED + PNG_hIST; +#endif +#ifdef PNG_READ_iCCP_SUPPORTED + PNG_iCCP; +#endif +#ifdef PNG_READ_iTXt_SUPPORTED + PNG_iTXt; +#endif +#ifdef PNG_READ_oFFs_SUPPORTED + PNG_oFFs; +#endif +#ifdef PNG_READ_pCAL_SUPPORTED + PNG_pCAL; +#endif +#ifdef PNG_READ_pHYs_SUPPORTED + PNG_pHYs; +#endif +#ifdef PNG_READ_sBIT_SUPPORTED + PNG_sBIT; +#endif +#ifdef PNG_READ_sCAL_SUPPORTED + PNG_sCAL; +#endif +#ifdef PNG_READ_sPLT_SUPPORTED + PNG_sPLT; +#endif +#ifdef PNG_READ_sRGB_SUPPORTED + PNG_sRGB; +#endif +#ifdef PNG_READ_tEXt_SUPPORTED + PNG_tEXt; +#endif +#ifdef PNG_READ_tIME_SUPPORTED + PNG_tIME; +#endif +#ifdef PNG_READ_tRNS_SUPPORTED + PNG_tRNS; +#endif +#ifdef PNG_READ_zTXt_SUPPORTED + PNG_zTXt; +#endif + png_uint_32 length = png_read_chunk_header(png_ptr); + PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; + + /* This should be a binary subdivision search or a hash for + * matching the chunk name rather than a linear search. + */ + if (!png_memcmp(chunk_name, png_IDAT, 4)) + if (png_ptr->mode & PNG_AFTER_IDAT) + png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; + + if (!png_memcmp(chunk_name, png_IHDR, 4)) + png_handle_IHDR(png_ptr, info_ptr, length); + + else if (!png_memcmp(chunk_name, png_IEND, 4)) + png_handle_IEND(png_ptr, info_ptr, length); + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + else if (png_handle_as_unknown(png_ptr, chunk_name)) + { + if (!png_memcmp(chunk_name, png_IDAT, 4)) + png_ptr->mode |= PNG_HAVE_IDAT; + + png_handle_unknown(png_ptr, info_ptr, length); + + if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_ptr->mode |= PNG_HAVE_PLTE; + + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + + break; + } + } +#endif + else if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_handle_PLTE(png_ptr, info_ptr, length); + + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + + png_ptr->idat_size = length; + png_ptr->mode |= PNG_HAVE_IDAT; + break; + } + +#ifdef PNG_READ_bKGD_SUPPORTED + else if (!png_memcmp(chunk_name, png_bKGD, 4)) + png_handle_bKGD(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_cHRM_SUPPORTED + else if (!png_memcmp(chunk_name, png_cHRM, 4)) + png_handle_cHRM(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_gAMA_SUPPORTED + else if (!png_memcmp(chunk_name, png_gAMA, 4)) + png_handle_gAMA(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_hIST_SUPPORTED + else if (!png_memcmp(chunk_name, png_hIST, 4)) + png_handle_hIST(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_oFFs_SUPPORTED + else if (!png_memcmp(chunk_name, png_oFFs, 4)) + png_handle_oFFs(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_pCAL_SUPPORTED + else if (!png_memcmp(chunk_name, png_pCAL, 4)) + png_handle_pCAL(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_sCAL_SUPPORTED + else if (!png_memcmp(chunk_name, png_sCAL, 4)) + png_handle_sCAL(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_pHYs_SUPPORTED + else if (!png_memcmp(chunk_name, png_pHYs, 4)) + png_handle_pHYs(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_sBIT_SUPPORTED + else if (!png_memcmp(chunk_name, png_sBIT, 4)) + png_handle_sBIT(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_sRGB_SUPPORTED + else if (!png_memcmp(chunk_name, png_sRGB, 4)) + png_handle_sRGB(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_iCCP_SUPPORTED + else if (!png_memcmp(chunk_name, png_iCCP, 4)) + png_handle_iCCP(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_sPLT_SUPPORTED + else if (!png_memcmp(chunk_name, png_sPLT, 4)) + png_handle_sPLT(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_tEXt_SUPPORTED + else if (!png_memcmp(chunk_name, png_tEXt, 4)) + png_handle_tEXt(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_tIME_SUPPORTED + else if (!png_memcmp(chunk_name, png_tIME, 4)) + png_handle_tIME(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_tRNS_SUPPORTED + else if (!png_memcmp(chunk_name, png_tRNS, 4)) + png_handle_tRNS(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_zTXt_SUPPORTED + else if (!png_memcmp(chunk_name, png_zTXt, 4)) + png_handle_zTXt(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_iTXt_SUPPORTED + else if (!png_memcmp(chunk_name, png_iTXt, 4)) + png_handle_iTXt(png_ptr, info_ptr, length); +#endif + + else + png_handle_unknown(png_ptr, info_ptr, length); + } +} +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ + +/* Optional call to update the users info_ptr structure */ +void PNGAPI +png_read_update_info(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_update_info"); + + if (png_ptr == NULL) + return; + + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); + + else + png_warning(png_ptr, + "Ignoring extra png_read_update_info() call;" + " row buffer not reallocated"); + + png_read_transform_info(png_ptr, info_ptr); +} + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Initialize palette, background, etc, after transformations + * are set, but before any reading takes place. This allows + * the user to obtain a gamma-corrected palette, for example. + * If the user doesn't call this, we will do it ourselves. + */ +void PNGAPI +png_start_read_image(png_structp png_ptr) +{ + png_debug(1, "in png_start_read_image"); + + if (png_ptr == NULL) + return; + + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); + else + png_warning(png_ptr, + "Ignoring extra png_start_read_image() call;" + " row buffer not reallocated"); +} +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +void PNGAPI +png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) +{ + PNG_IDAT; + PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, + 0xff}; + PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; + int ret; + + if (png_ptr == NULL) + return; + + png_debug2(1, "in png_read_row (row %lu, pass %d)", + (unsigned long)png_ptr->row_number, png_ptr->pass); + + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); + + if (png_ptr->row_number == 0 && png_ptr->pass == 0) + { + /* Check for transforms that have been set but were defined out */ +#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_MONO) + png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined"); +#endif + +#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & PNG_FILLER) + png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined"); +#endif + +#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ + !defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined"); +#endif + +#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) + if (png_ptr->transformations & PNG_PACK) + png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined"); +#endif + +#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) + if (png_ptr->transformations & PNG_SHIFT) + png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined"); +#endif + +#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) + if (png_ptr->transformations & PNG_BGR) + png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined"); +#endif + +#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined"); +#endif + } + +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* If interlaced and we do not need a new row, combine row and return */ + if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + { + switch (png_ptr->pass) + { + case 0: + if (png_ptr->row_number & 0x07) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + + case 1: + if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + + png_read_finish_row(png_ptr); + return; + } + break; + + case 2: + if ((png_ptr->row_number & 0x07) != 4) + { + if (dsp_row != NULL && (png_ptr->row_number & 4)) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + + png_read_finish_row(png_ptr); + return; + } + break; + + case 3: + if ((png_ptr->row_number & 3) || png_ptr->width < 3) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + + png_read_finish_row(png_ptr); + return; + } + break; + + case 4: + if ((png_ptr->row_number & 3) != 2) + { + if (dsp_row != NULL && (png_ptr->row_number & 2)) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + + png_read_finish_row(png_ptr); + return; + } + break; + case 5: + if ((png_ptr->row_number & 1) || png_ptr->width < 2) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + + png_read_finish_row(png_ptr); + return; + } + break; + + default: + case 6: + if (!(png_ptr->row_number & 1)) + { + png_read_finish_row(png_ptr); + return; + } + break; + } + } +#endif + + if (!(png_ptr->mode & PNG_HAVE_IDAT)) + png_error(png_ptr, "Invalid attempt to read row data"); + + png_ptr->zstream.next_out = png_ptr->row_buf; + png_ptr->zstream.avail_out = + (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth, + png_ptr->iwidth) + 1); + + do + { + if (!(png_ptr->zstream.avail_in)) + { + while (!png_ptr->idat_size) + { + png_crc_finish(png_ptr, 0); + + png_ptr->idat_size = png_read_chunk_header(png_ptr); + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + png_error(png_ptr, "Not enough image data"); + } + png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_in = png_ptr->zbuf; + if (png_ptr->zbuf_size > png_ptr->idat_size) + png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; + png_crc_read(png_ptr, png_ptr->zbuf, + (png_size_t)png_ptr->zstream.avail_in); + png_ptr->idat_size -= png_ptr->zstream.avail_in; + } + + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + + if (ret == Z_STREAM_END) + { + if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || + png_ptr->idat_size) + png_benign_error(png_ptr, "Extra compressed data"); + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + + if (ret != Z_OK) + png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : + "Decompression error"); + + } while (png_ptr->zstream.avail_out); + + png_ptr->row_info.color_type = png_ptr->color_type; + png_ptr->row_info.width = png_ptr->iwidth; + png_ptr->row_info.channels = png_ptr->channels; + png_ptr->row_info.bit_depth = png_ptr->bit_depth; + png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + + if (png_ptr->row_buf[0]) + png_read_filter_row(png_ptr, &(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->prev_row + 1, + (int)(png_ptr->row_buf[0])); + + png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1); + +#ifdef PNG_MNG_FEATURES_SUPPORTED + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) + { + /* Intrapixel differencing */ + png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); + } +#endif + + + if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + png_do_read_transformations(png_ptr); + +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* Blow up interlaced rows to full size */ + if (png_ptr->interlaced && + (png_ptr->transformations & PNG_INTERLACE)) + { + if (png_ptr->pass < 6) + /* Old interface (pre-1.0.9): + * png_do_read_interlace(&(png_ptr->row_info), + * png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); + */ + png_do_read_interlace(png_ptr); + + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); + + if (row != NULL) + png_combine_row(png_ptr, row, png_pass_mask[png_ptr->pass]); + } + + else +#endif + { + if (row != NULL) + png_combine_row(png_ptr, row, 0xff); + + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, 0xff); + } + png_read_finish_row(png_ptr); + + if (png_ptr->read_row_fn != NULL) + (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); +} +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. If the image is interlaced, + * and png_set_interlace_handling() has been called, the rows need to + * contain the contents of the rows from the previous pass. If the + * image has alpha or transparency, and png_handle_alpha()[*] has been + * called, the rows contents must be initialized to the contents of the + * screen. + * + * "row" holds the actual image, and pixels are placed in it + * as they arrive. If the image is displayed after each pass, it will + * appear to "sparkle" in. "display_row" can be used to display a + * "chunky" progressive image, with finer detail added as it becomes + * available. If you do not want this "chunky" display, you may pass + * NULL for display_row. If you do not want the sparkle display, and + * you have not called png_handle_alpha(), you may pass NULL for rows. + * If you have called png_handle_alpha(), and the image has either an + * alpha channel or a transparency chunk, you must provide a buffer for + * rows. In this case, you do not have to provide a display_row buffer + * also, but you may. If the image is not interlaced, or if you have + * not called png_set_interlace_handling(), the display_row buffer will + * be ignored, so pass NULL to it. + * + * [*] png_handle_alpha() does not exist yet, as of this version of libpng + */ + +void PNGAPI +png_read_rows(png_structp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows) +{ + png_uint_32 i; + png_bytepp rp; + png_bytepp dp; + + png_debug(1, "in png_read_rows"); + + if (png_ptr == NULL) + return; + + rp = row; + dp = display_row; + if (rp != NULL && dp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep rptr = *rp++; + png_bytep dptr = *dp++; + + png_read_row(png_ptr, rptr, dptr); + } + + else if (rp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep rptr = *rp; + png_read_row(png_ptr, rptr, NULL); + rp++; + } + + else if (dp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep dptr = *dp; + png_read_row(png_ptr, NULL, dptr); + dp++; + } +} +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the entire image. If the image has an alpha channel or a tRNS + * chunk, and you have called png_handle_alpha()[*], you will need to + * initialize the image to the current image that PNG will be overlaying. + * We set the num_rows again here, in case it was incorrectly set in + * png_read_start_row() by a call to png_read_update_info() or + * png_start_read_image() if png_set_interlace_handling() wasn't called + * prior to either of these functions like it should have been. You can + * only call this function once. If you desire to have an image for + * each pass of a interlaced image, use png_read_rows() instead. + * + * [*] png_handle_alpha() does not exist yet, as of this version of libpng + */ +void PNGAPI +png_read_image(png_structp png_ptr, png_bytepp image) +{ + png_uint_32 i, image_height; + int pass, j; + png_bytepp rp; + + png_debug(1, "in png_read_image"); + + if (png_ptr == NULL) + return; + +#ifdef PNG_READ_INTERLACING_SUPPORTED + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + { + pass = png_set_interlace_handling(png_ptr); + /* And make sure transforms are initialized. */ + png_start_read_image(png_ptr); + } + else + { + if (png_ptr->interlaced && !(png_ptr->transformations & PNG_INTERLACE)) + { + /* Caller called png_start_read_image or png_read_update_info without + * first turning on the PNG_INTERLACE transform. We can fix this here, + * but the caller should do it! + */ + png_warning(png_ptr, "Interlace handling should be turned on when " + "using png_read_image"); + /* Make sure this is set correctly */ + png_ptr->num_rows = png_ptr->height; + } + + /* Obtain the pass number, which also turns on the PNG_INTERLACE flag in + * the above error case. + */ + pass = png_set_interlace_handling(png_ptr); + } +#else + if (png_ptr->interlaced) + png_error(png_ptr, + "Cannot read interlaced image -- interlace handler disabled"); + + pass = 1; +#endif + + image_height=png_ptr->height; + + for (j = 0; j < pass; j++) + { + rp = image; + for (i = 0; i < image_height; i++) + { + png_read_row(png_ptr, *rp, NULL); + rp++; + } + } +} +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. Will not read past the end of the + * file, will verify the end is accurate, and will read any comments + * or time information at the end of the file, if info is not NULL. + */ +void PNGAPI +png_read_end(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_end"); + + if (png_ptr == NULL) + return; + + png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ + + do + { + PNG_IHDR; + PNG_IDAT; + PNG_IEND; + PNG_PLTE; +#ifdef PNG_READ_bKGD_SUPPORTED + PNG_bKGD; +#endif +#ifdef PNG_READ_cHRM_SUPPORTED + PNG_cHRM; +#endif +#ifdef PNG_READ_gAMA_SUPPORTED + PNG_gAMA; +#endif +#ifdef PNG_READ_hIST_SUPPORTED + PNG_hIST; +#endif +#ifdef PNG_READ_iCCP_SUPPORTED + PNG_iCCP; +#endif +#ifdef PNG_READ_iTXt_SUPPORTED + PNG_iTXt; +#endif +#ifdef PNG_READ_oFFs_SUPPORTED + PNG_oFFs; +#endif +#ifdef PNG_READ_pCAL_SUPPORTED + PNG_pCAL; +#endif +#ifdef PNG_READ_pHYs_SUPPORTED + PNG_pHYs; +#endif +#ifdef PNG_READ_sBIT_SUPPORTED + PNG_sBIT; +#endif +#ifdef PNG_READ_sCAL_SUPPORTED + PNG_sCAL; +#endif +#ifdef PNG_READ_sPLT_SUPPORTED + PNG_sPLT; +#endif +#ifdef PNG_READ_sRGB_SUPPORTED + PNG_sRGB; +#endif +#ifdef PNG_READ_tEXt_SUPPORTED + PNG_tEXt; +#endif +#ifdef PNG_READ_tIME_SUPPORTED + PNG_tIME; +#endif +#ifdef PNG_READ_tRNS_SUPPORTED + PNG_tRNS; +#endif +#ifdef PNG_READ_zTXt_SUPPORTED + PNG_zTXt; +#endif + png_uint_32 length = png_read_chunk_header(png_ptr); + PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; + + if (!png_memcmp(chunk_name, png_IHDR, 4)) + png_handle_IHDR(png_ptr, info_ptr, length); + + else if (!png_memcmp(chunk_name, png_IEND, 4)) + png_handle_IEND(png_ptr, info_ptr, length); + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + else if (png_handle_as_unknown(png_ptr, chunk_name)) + { + if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + png_benign_error(png_ptr, "Too many IDATs found"); + } + png_handle_unknown(png_ptr, info_ptr, length); + if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_ptr->mode |= PNG_HAVE_PLTE; + } +#endif + + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + /* Zero length IDATs are legal after the last IDAT has been + * read, but not after other chunks have been read. + */ + if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + png_benign_error(png_ptr, "Too many IDATs found"); + + png_crc_finish(png_ptr, length); + } + else if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_handle_PLTE(png_ptr, info_ptr, length); + +#ifdef PNG_READ_bKGD_SUPPORTED + else if (!png_memcmp(chunk_name, png_bKGD, 4)) + png_handle_bKGD(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_cHRM_SUPPORTED + else if (!png_memcmp(chunk_name, png_cHRM, 4)) + png_handle_cHRM(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_gAMA_SUPPORTED + else if (!png_memcmp(chunk_name, png_gAMA, 4)) + png_handle_gAMA(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_hIST_SUPPORTED + else if (!png_memcmp(chunk_name, png_hIST, 4)) + png_handle_hIST(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_oFFs_SUPPORTED + else if (!png_memcmp(chunk_name, png_oFFs, 4)) + png_handle_oFFs(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_pCAL_SUPPORTED + else if (!png_memcmp(chunk_name, png_pCAL, 4)) + png_handle_pCAL(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_sCAL_SUPPORTED + else if (!png_memcmp(chunk_name, png_sCAL, 4)) + png_handle_sCAL(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_pHYs_SUPPORTED + else if (!png_memcmp(chunk_name, png_pHYs, 4)) + png_handle_pHYs(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_sBIT_SUPPORTED + else if (!png_memcmp(chunk_name, png_sBIT, 4)) + png_handle_sBIT(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_sRGB_SUPPORTED + else if (!png_memcmp(chunk_name, png_sRGB, 4)) + png_handle_sRGB(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_iCCP_SUPPORTED + else if (!png_memcmp(chunk_name, png_iCCP, 4)) + png_handle_iCCP(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_sPLT_SUPPORTED + else if (!png_memcmp(chunk_name, png_sPLT, 4)) + png_handle_sPLT(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_tEXt_SUPPORTED + else if (!png_memcmp(chunk_name, png_tEXt, 4)) + png_handle_tEXt(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_tIME_SUPPORTED + else if (!png_memcmp(chunk_name, png_tIME, 4)) + png_handle_tIME(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_tRNS_SUPPORTED + else if (!png_memcmp(chunk_name, png_tRNS, 4)) + png_handle_tRNS(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_zTXt_SUPPORTED + else if (!png_memcmp(chunk_name, png_zTXt, 4)) + png_handle_zTXt(png_ptr, info_ptr, length); +#endif + +#ifdef PNG_READ_iTXt_SUPPORTED + else if (!png_memcmp(chunk_name, png_iTXt, 4)) + png_handle_iTXt(png_ptr, info_ptr, length); +#endif + + else + png_handle_unknown(png_ptr, info_ptr, length); + } while (!(png_ptr->mode & PNG_HAVE_IEND)); +} +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ + +/* Free all memory used by the read */ +void PNGAPI +png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, + png_infopp end_info_ptr_ptr) +{ + png_structp png_ptr = NULL; + png_infop info_ptr = NULL, end_info_ptr = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn = NULL; + png_voidp mem_ptr = NULL; +#endif + + png_debug(1, "in png_destroy_read_struct"); + + if (png_ptr_ptr != NULL) + png_ptr = *png_ptr_ptr; + if (png_ptr == NULL) + return; + +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; + mem_ptr = png_ptr->mem_ptr; +#endif + + if (info_ptr_ptr != NULL) + info_ptr = *info_ptr_ptr; + + if (end_info_ptr_ptr != NULL) + end_info_ptr = *end_info_ptr_ptr; + + png_read_destroy(png_ptr, info_ptr, end_info_ptr); + + if (info_ptr != NULL) + { +#ifdef PNG_TEXT_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1); +#endif + +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)info_ptr); +#endif + *info_ptr_ptr = NULL; + } + + if (end_info_ptr != NULL) + { +#ifdef PNG_READ_TEXT_SUPPORTED + png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1); +#endif +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)end_info_ptr); +#endif + *end_info_ptr_ptr = NULL; + } + + if (png_ptr != NULL) + { +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + *png_ptr_ptr = NULL; + } +} + +/* Free all memory used by the read (old method) */ +void /* PRIVATE */ +png_read_destroy(png_structp png_ptr, png_infop info_ptr, + png_infop end_info_ptr) +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf tmp_jmp; +#endif + png_error_ptr error_fn; + png_error_ptr warning_fn; + png_voidp error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn; +#endif + + png_debug(1, "in png_read_destroy"); + + if (info_ptr != NULL) + png_info_destroy(png_ptr, info_ptr); + + if (end_info_ptr != NULL) + png_info_destroy(png_ptr, end_info_ptr); + + png_free(png_ptr, png_ptr->zbuf); + png_free(png_ptr, png_ptr->big_row_buf); + png_free(png_ptr, png_ptr->prev_row); + png_free(png_ptr, png_ptr->chunkdata); + +#ifdef PNG_READ_QUANTIZE_SUPPORTED + png_free(png_ptr, png_ptr->palette_lookup); + png_free(png_ptr, png_ptr->quantize_index); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED + png_free(png_ptr, png_ptr->gamma_table); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED + png_free(png_ptr, png_ptr->gamma_from_1); + png_free(png_ptr, png_ptr->gamma_to_1); +#endif + + if (png_ptr->free_me & PNG_FREE_PLTE) + png_zfree(png_ptr, png_ptr->palette); + png_ptr->free_me &= ~PNG_FREE_PLTE; + +#if defined(PNG_tRNS_SUPPORTED) || \ + defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->free_me & PNG_FREE_TRNS) + png_free(png_ptr, png_ptr->trans_alpha); + png_ptr->free_me &= ~PNG_FREE_TRNS; +#endif + +#ifdef PNG_READ_hIST_SUPPORTED + if (png_ptr->free_me & PNG_FREE_HIST) + png_free(png_ptr, png_ptr->hist); + png_ptr->free_me &= ~PNG_FREE_HIST; +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED + if (png_ptr->gamma_16_table != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_table[i]); + } + png_free(png_ptr, png_ptr->gamma_16_table); + } + +#ifdef PNG_READ_BACKGROUND_SUPPORTED + if (png_ptr->gamma_16_from_1 != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_from_1[i]); + } + png_free(png_ptr, png_ptr->gamma_16_from_1); + } + if (png_ptr->gamma_16_to_1 != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_to_1[i]); + } + png_free(png_ptr, png_ptr->gamma_16_to_1); + } +#endif +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED + png_free(png_ptr, png_ptr->time_buffer); +#endif + + inflateEnd(&png_ptr->zstream); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_free(png_ptr, png_ptr->save_buffer); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +#ifdef PNG_TEXT_SUPPORTED + png_free(png_ptr, png_ptr->current_text); +#endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + + /* Save the important info out of the png_struct, in case it is + * being used again. + */ +#ifdef PNG_SETJMP_SUPPORTED + png_memcpy(tmp_jmp, png_ptr->png_jmpbuf, png_sizeof(jmp_buf)); +#endif + + error_fn = png_ptr->error_fn; + warning_fn = png_ptr->warning_fn; + error_ptr = png_ptr->error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; +#endif + + png_memset(png_ptr, 0, png_sizeof(png_struct)); + + png_ptr->error_fn = error_fn; + png_ptr->warning_fn = warning_fn; + png_ptr->error_ptr = error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr->free_fn = free_fn; +#endif + +#ifdef PNG_SETJMP_SUPPORTED + png_memcpy(png_ptr->png_jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); +#endif + +} + +void PNGAPI +png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) +{ + if (png_ptr == NULL) + return; + + png_ptr->read_row_fn = read_row_fn; +} + + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +#ifdef PNG_INFO_IMAGE_SUPPORTED +void PNGAPI +png_read_png(png_structp png_ptr, png_infop info_ptr, + int transforms, + voidp params) +{ + int row; + + if (png_ptr == NULL) + return; + + /* png_read_info() gives us all of the information from the + * PNG file before the first IDAT (image data chunk). + */ + png_read_info(png_ptr, info_ptr); + if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep)) + png_error(png_ptr, "Image is too high to process with png_read_png()"); + + /* -------------- image transformations start here ------------------- */ + +#ifdef PNG_READ_16_TO_8_SUPPORTED + /* Tell libpng to strip 16 bit/color files down to 8 bits per color. + */ + if (transforms & PNG_TRANSFORM_STRIP_16) + png_set_strip_16(png_ptr); +#endif + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED + /* Strip alpha bytes from the input data without combining with + * the background (not recommended). + */ + if (transforms & PNG_TRANSFORM_STRIP_ALPHA) + png_set_strip_alpha(png_ptr); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) + /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single + * byte into separate bytes (useful for paletted and grayscale images). + */ + if (transforms & PNG_TRANSFORM_PACKING) + png_set_packing(png_ptr); +#endif + +#ifdef PNG_READ_PACKSWAP_SUPPORTED + /* Change the order of packed pixels to least significant bit first + * (not useful if you are using png_set_packing). + */ + if (transforms & PNG_TRANSFORM_PACKSWAP) + png_set_packswap(png_ptr); +#endif + +#ifdef PNG_READ_EXPAND_SUPPORTED + /* Expand paletted colors into true RGB triplets + * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel + * Expand paletted or RGB images with transparency to full alpha + * channels so the data will be available as RGBA quartets. + */ + if (transforms & PNG_TRANSFORM_EXPAND) + if ((png_ptr->bit_depth < 8) || + (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || + (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) + png_set_expand(png_ptr); +#endif + + /* We don't handle background color or gamma transformation or quantizing. + */ + +#ifdef PNG_READ_INVERT_SUPPORTED + /* Invert monochrome files to have 0 as white and 1 as black + */ + if (transforms & PNG_TRANSFORM_INVERT_MONO) + png_set_invert_mono(png_ptr); +#endif + +#ifdef PNG_READ_SHIFT_SUPPORTED + /* If you want to shift the pixel values from the range [0,255] or + * [0,65535] to the original [0,7] or [0,31], or whatever range the + * colors were originally in: + */ + if ((transforms & PNG_TRANSFORM_SHIFT) + && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) + { + png_color_8p sig_bit; + + png_get_sBIT(png_ptr, info_ptr, &sig_bit); + png_set_shift(png_ptr, sig_bit); + } +#endif + +#ifdef PNG_READ_BGR_SUPPORTED + /* Flip the RGB pixels to BGR (or RGBA to BGRA) */ + if (transforms & PNG_TRANSFORM_BGR) + png_set_bgr(png_ptr); +#endif + +#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED + /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */ + if (transforms & PNG_TRANSFORM_SWAP_ALPHA) + png_set_swap_alpha(png_ptr); +#endif + +#ifdef PNG_READ_SWAP_SUPPORTED + /* Swap bytes of 16 bit files to least significant byte first */ + if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) + png_set_swap(png_ptr); +#endif + +/* Added at libpng-1.2.41 */ +#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED + /* Invert the alpha channel from opacity to transparency */ + if (transforms & PNG_TRANSFORM_INVERT_ALPHA) + png_set_invert_alpha(png_ptr); +#endif + +/* Added at libpng-1.2.41 */ +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED + /* Expand grayscale image to RGB */ + if (transforms & PNG_TRANSFORM_GRAY_TO_RGB) + png_set_gray_to_rgb(png_ptr); +#endif + + /* We don't handle adding filler bytes */ + + /* Optional call to gamma correct and add the background to the palette + * and update info structure. REQUIRED if you are expecting libpng to + * update the palette for you (i.e., you selected such a transform above). + */ + png_read_update_info(png_ptr, info_ptr); + + /* -------------- image transformations end here ------------------- */ + + png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); + if (info_ptr->row_pointers == NULL) + { + png_uint_32 iptr; + + info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, + info_ptr->height * png_sizeof(png_bytep)); + for (iptr=0; iptrheight; iptr++) + info_ptr->row_pointers[iptr] = NULL; + + info_ptr->free_me |= PNG_FREE_ROWS; + + for (row = 0; row < (int)info_ptr->height; row++) + info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, + png_get_rowbytes(png_ptr, info_ptr)); + } + + png_read_image(png_ptr, info_ptr->row_pointers); + info_ptr->valid |= PNG_INFO_IDAT; + + /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */ + png_read_end(png_ptr, info_ptr); + + PNG_UNUSED(transforms) /* Quiet compiler warnings */ + PNG_UNUSED(params) + +} +#endif /* PNG_INFO_IMAGE_SUPPORTED */ +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngrio.c b/src/3rdparty/libpng/pngrio.c new file mode 100644 index 0000000000..e9c381c5ba --- /dev/null +++ b/src/3rdparty/libpng/pngrio.c @@ -0,0 +1,176 @@ + +/* pngrio.c - functions for data input + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file provides a location for all input. Users who need + * special handling are expected to write a function that has the same + * arguments as this and performs a similar function, but that possibly + * has a different input method. Note that you shouldn't change this + * function, but rather write a replacement function and then make + * libpng use it at run time with png_set_read_fn(...). + */ + +#include "pngpriv.h" + +#ifdef PNG_READ_SUPPORTED + +/* Read the data from whatever input you are using. The default routine + * reads from a file pointer. Note that this routine sometimes gets called + * with very small lengths, so you should implement some kind of simple + * buffering if you are using unbuffered reads. This should never be asked + * to read more then 64K on a 16 bit machine. + */ +void /* PRIVATE */ +png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_debug1(4, "reading %d bytes", (int)length); + + if (png_ptr->read_data_fn != NULL) + (*(png_ptr->read_data_fn))(png_ptr, data, length); + + else + png_error(png_ptr, "Call to NULL read function"); +} + +#ifdef PNG_STDIO_SUPPORTED +/* This is the function that does the actual reading of data. If you are + * not reading from a standard C stream, you should create a replacement + * read_data function and use it at run time with png_set_read_fn(), rather + * than changing the library. + */ +# ifndef USE_FAR_KEYWORD +void PNGCBAPI +png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + + if (png_ptr == NULL) + return; + + /* fread() returns 0 on error, so it is OK to store this in a png_size_t + * instead of an int, which is what fread() actually returns. + */ + check = fread(data, 1, length, (png_FILE_p)png_ptr->io_ptr); + + if (check != length) + png_error(png_ptr, "Read Error"); +} +# else +/* This is the model-independent version. Since the standard I/O library + can't handle far buffers in the medium and small models, we have to copy + the data. +*/ + +#define NEAR_BUF_SIZE 1024 +#define MIN(a,b) (a <= b ? a : b) + +static void PNGCBAPI +png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + png_byte *n_data; + png_FILE_p io_ptr; + + if (png_ptr == NULL) + return; + + /* Check if data really is near. If so, use usual code. */ + n_data = (png_byte *)CVT_PTR_NOCHECK(data); + io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + + if ((png_bytep)n_data == data) + { + check = fread(n_data, 1, length, io_ptr); + } + + else + { + png_byte buf[NEAR_BUF_SIZE]; + png_size_t read, remaining, err; + check = 0; + remaining = length; + + do + { + read = MIN(NEAR_BUF_SIZE, remaining); + err = fread(buf, 1, read, io_ptr); + png_memcpy(data, buf, read); /* copy far buffer to near buffer */ + + if (err != read) + break; + + else + check += err; + + data += read; + remaining -= read; + } + while (remaining != 0); + } + + if ((png_uint_32)check != (png_uint_32)length) + png_error(png_ptr, "read Error"); +} +# endif +#endif + +/* This function allows the application to supply a new input function + * for libpng if standard C streams aren't being used. + * + * This function takes as its arguments: + * + * png_ptr - pointer to a png input data structure + * + * io_ptr - pointer to user supplied structure containing info about + * the input functions. May be NULL. + * + * read_data_fn - pointer to a new input function that takes as its + * arguments a pointer to a png_struct, a pointer to + * a location where input data can be stored, and a 32-bit + * unsigned int that is the number of bytes to be read. + * To exit and output any fatal error messages the new write + * function should call png_error(png_ptr, "Error msg"). + * May be NULL, in which case libpng's default function will + * be used. + */ +void PNGAPI +png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn) +{ + if (png_ptr == NULL) + return; + + png_ptr->io_ptr = io_ptr; + +#ifdef PNG_STDIO_SUPPORTED + if (read_data_fn != NULL) + png_ptr->read_data_fn = read_data_fn; + + else + png_ptr->read_data_fn = png_default_read_data; +#else + png_ptr->read_data_fn = read_data_fn; +#endif + + /* It is an error to write to a read device */ + if (png_ptr->write_data_fn != NULL) + { + png_ptr->write_data_fn = NULL; + png_warning(png_ptr, + "Can't set both read_data_fn and write_data_fn in the" + " same structure"); + } + +#ifdef PNG_WRITE_FLUSH_SUPPORTED + png_ptr->output_flush_fn = NULL; +#endif +} +#endif /* PNG_READ_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngrtran.c b/src/3rdparty/libpng/pngrtran.c new file mode 100644 index 0000000000..e6e0c46b4d --- /dev/null +++ b/src/3rdparty/libpng/pngrtran.c @@ -0,0 +1,4224 @@ + +/* pngrtran.c - transforms the data in a row for PNG readers + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file contains functions optionally called by an application + * in order to tell libpng how to handle data when reading a PNG. + * Transformations that are used in both reading and writing are + * in pngtrans.c. + */ + +#include "pngpriv.h" + +#ifdef PNG_READ_SUPPORTED + +/* Set the action on getting a CRC error for an ancillary or critical chunk. */ +void PNGAPI +png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action) +{ + png_debug(1, "in png_set_crc_action"); + + if (png_ptr == NULL) + return; + + /* Tell libpng how we react to CRC errors in critical chunks */ + switch (crit_action) + { + case PNG_CRC_NO_CHANGE: /* Leave setting as is */ + break; + + case PNG_CRC_WARN_USE: /* Warn/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE; + break; + + case PNG_CRC_QUIET_USE: /* Quiet/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE | + PNG_FLAG_CRC_CRITICAL_IGNORE; + break; + + case PNG_CRC_WARN_DISCARD: /* Not a valid action for critical data */ + png_warning(png_ptr, + "Can't discard critical data on CRC error"); + case PNG_CRC_ERROR_QUIT: /* Error/quit */ + + case PNG_CRC_DEFAULT: + default: + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + break; + } + + /* Tell libpng how we react to CRC errors in ancillary chunks */ + switch (ancil_action) + { + case PNG_CRC_NO_CHANGE: /* Leave setting as is */ + break; + + case PNG_CRC_WARN_USE: /* Warn/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE; + break; + + case PNG_CRC_QUIET_USE: /* Quiet/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE | + PNG_FLAG_CRC_ANCILLARY_NOWARN; + break; + + case PNG_CRC_ERROR_QUIT: /* Error/quit */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN; + break; + + case PNG_CRC_WARN_DISCARD: /* Warn/discard data */ + + case PNG_CRC_DEFAULT: + default: + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + break; + } +} + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +/* Handle alpha and tRNS via a background color */ +void PNGFAPI +png_set_background_fixed(png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma) +{ + png_debug(1, "in png_set_background_fixed"); + + if (png_ptr == NULL) + return; + + if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN) + { + png_warning(png_ptr, "Application must supply a known background gamma"); + return; + } + + png_ptr->transformations |= PNG_BACKGROUND; + png_memcpy(&(png_ptr->background), background_color, + png_sizeof(png_color_16)); + png_ptr->background_gamma = background_gamma; + png_ptr->background_gamma_type = (png_byte)(background_gamma_code); + png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0); +} + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_background(png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma) +{ + png_set_background_fixed(png_ptr, background_color, background_gamma_code, + need_expand, png_fixed(png_ptr, background_gamma, "png_set_background")); +} +# endif /* FLOATING_POINT */ +#endif /* READ_BACKGROUND */ + +#ifdef PNG_READ_16_TO_8_SUPPORTED +/* Strip 16 bit depth files to 8 bit depth */ +void PNGAPI +png_set_strip_16(png_structp png_ptr) +{ + png_debug(1, "in png_set_strip_16"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_16_TO_8; +} +#endif + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED +void PNGAPI +png_set_strip_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_strip_alpha"); + + if (png_ptr == NULL) + return; + + png_ptr->flags |= PNG_FLAG_STRIP_ALPHA; +} +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* Dither file to 8 bit. Supply a palette, the current number + * of elements in the palette, the maximum number of elements + * allowed, and a histogram if possible. If the current number + * of colors is greater then the maximum number, the palette will be + * modified to fit in the maximum number. "full_quantize" indicates + * whether we need a quantizing cube set up for RGB images, or if we + * simply are reducing the number of colors in a paletted image. + */ + +typedef struct png_dsort_struct +{ + struct png_dsort_struct FAR * next; + png_byte left; + png_byte right; +} png_dsort; +typedef png_dsort FAR * png_dsortp; +typedef png_dsort FAR * FAR * png_dsortpp; + +void PNGAPI +png_set_quantize(png_structp png_ptr, png_colorp palette, + int num_palette, int maximum_colors, png_const_uint_16p histogram, + int full_quantize) +{ + png_debug(1, "in png_set_quantize"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_QUANTIZE; + + if (!full_quantize) + { + int i; + + png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + for (i = 0; i < num_palette; i++) + png_ptr->quantize_index[i] = (png_byte)i; + } + + if (num_palette > maximum_colors) + { + if (histogram != NULL) + { + /* This is easy enough, just throw out the least used colors. + * Perhaps not the best solution, but good enough. + */ + + int i; + + /* Initialize an array to sort colors */ + png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + + /* Initialize the quantize_sort array */ + for (i = 0; i < num_palette; i++) + png_ptr->quantize_sort[i] = (png_byte)i; + + /* Find the least used palette entries by starting a + * bubble sort, and running it until we have sorted + * out enough colors. Note that we don't care about + * sorting all the colors, just finding which are + * least used. + */ + + for (i = num_palette - 1; i >= maximum_colors; i--) + { + int done; /* To stop early if the list is pre-sorted */ + int j; + + done = 1; + for (j = 0; j < i; j++) + { + if (histogram[png_ptr->quantize_sort[j]] + < histogram[png_ptr->quantize_sort[j + 1]]) + { + png_byte t; + + t = png_ptr->quantize_sort[j]; + png_ptr->quantize_sort[j] = png_ptr->quantize_sort[j + 1]; + png_ptr->quantize_sort[j + 1] = t; + done = 0; + } + } + + if (done) + break; + } + + /* Swap the palette around, and set up a table, if necessary */ + if (full_quantize) + { + int j = num_palette; + + /* Put all the useful colors within the max, but don't + * move the others. + */ + for (i = 0; i < maximum_colors; i++) + { + if ((int)png_ptr->quantize_sort[i] >= maximum_colors) + { + do + j--; + while ((int)png_ptr->quantize_sort[j] >= maximum_colors); + + palette[i] = palette[j]; + } + } + } + else + { + int j = num_palette; + + /* Move all the used colors inside the max limit, and + * develop a translation table. + */ + for (i = 0; i < maximum_colors; i++) + { + /* Only move the colors we need to */ + if ((int)png_ptr->quantize_sort[i] >= maximum_colors) + { + png_color tmp_color; + + do + j--; + while ((int)png_ptr->quantize_sort[j] >= maximum_colors); + + tmp_color = palette[j]; + palette[j] = palette[i]; + palette[i] = tmp_color; + /* Indicate where the color went */ + png_ptr->quantize_index[j] = (png_byte)i; + png_ptr->quantize_index[i] = (png_byte)j; + } + } + + /* Find closest color for those colors we are not using */ + for (i = 0; i < num_palette; i++) + { + if ((int)png_ptr->quantize_index[i] >= maximum_colors) + { + int min_d, k, min_k, d_index; + + /* Find the closest color to one we threw out */ + d_index = png_ptr->quantize_index[i]; + min_d = PNG_COLOR_DIST(palette[d_index], palette[0]); + for (k = 1, min_k = 0; k < maximum_colors; k++) + { + int d; + + d = PNG_COLOR_DIST(palette[d_index], palette[k]); + + if (d < min_d) + { + min_d = d; + min_k = k; + } + } + /* Point to closest color */ + png_ptr->quantize_index[i] = (png_byte)min_k; + } + } + } + png_free(png_ptr, png_ptr->quantize_sort); + png_ptr->quantize_sort = NULL; + } + else + { + /* This is much harder to do simply (and quickly). Perhaps + * we need to go through a median cut routine, but those + * don't always behave themselves with only a few colors + * as input. So we will just find the closest two colors, + * and throw out one of them (chosen somewhat randomly). + * [We don't understand this at all, so if someone wants to + * work on improving it, be our guest - AED, GRP] + */ + int i; + int max_d; + int num_new_palette; + png_dsortp t; + png_dsortpp hash; + + t = NULL; + + /* Initialize palette index arrays */ + png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + + /* Initialize the sort array */ + for (i = 0; i < num_palette; i++) + { + png_ptr->index_to_palette[i] = (png_byte)i; + png_ptr->palette_to_index[i] = (png_byte)i; + } + + hash = (png_dsortpp)png_calloc(png_ptr, (png_uint_32)(769 * + png_sizeof(png_dsortp))); + + num_new_palette = num_palette; + + /* Initial wild guess at how far apart the farthest pixel + * pair we will be eliminating will be. Larger + * numbers mean more areas will be allocated, Smaller + * numbers run the risk of not saving enough data, and + * having to do this all over again. + * + * I have not done extensive checking on this number. + */ + max_d = 96; + + while (num_new_palette > maximum_colors) + { + for (i = 0; i < num_new_palette - 1; i++) + { + int j; + + for (j = i + 1; j < num_new_palette; j++) + { + int d; + + d = PNG_COLOR_DIST(palette[i], palette[j]); + + if (d <= max_d) + { + + t = (png_dsortp)png_malloc_warn(png_ptr, + (png_uint_32)(png_sizeof(png_dsort))); + + if (t == NULL) + break; + + t->next = hash[d]; + t->left = (png_byte)i; + t->right = (png_byte)j; + hash[d] = t; + } + } + if (t == NULL) + break; + } + + if (t != NULL) + for (i = 0; i <= max_d; i++) + { + if (hash[i] != NULL) + { + png_dsortp p; + + for (p = hash[i]; p; p = p->next) + { + if ((int)png_ptr->index_to_palette[p->left] + < num_new_palette && + (int)png_ptr->index_to_palette[p->right] + < num_new_palette) + { + int j, next_j; + + if (num_new_palette & 0x01) + { + j = p->left; + next_j = p->right; + } + else + { + j = p->right; + next_j = p->left; + } + + num_new_palette--; + palette[png_ptr->index_to_palette[j]] + = palette[num_new_palette]; + if (!full_quantize) + { + int k; + + for (k = 0; k < num_palette; k++) + { + if (png_ptr->quantize_index[k] == + png_ptr->index_to_palette[j]) + png_ptr->quantize_index[k] = + png_ptr->index_to_palette[next_j]; + + if ((int)png_ptr->quantize_index[k] == + num_new_palette) + png_ptr->quantize_index[k] = + png_ptr->index_to_palette[j]; + } + } + + png_ptr->index_to_palette[png_ptr->palette_to_index + [num_new_palette]] = png_ptr->index_to_palette[j]; + + png_ptr->palette_to_index[png_ptr->index_to_palette[j]] + = png_ptr->palette_to_index[num_new_palette]; + + png_ptr->index_to_palette[j] = + (png_byte)num_new_palette; + + png_ptr->palette_to_index[num_new_palette] = + (png_byte)j; + } + if (num_new_palette <= maximum_colors) + break; + } + if (num_new_palette <= maximum_colors) + break; + } + } + + for (i = 0; i < 769; i++) + { + if (hash[i] != NULL) + { + png_dsortp p = hash[i]; + while (p) + { + t = p->next; + png_free(png_ptr, p); + p = t; + } + } + hash[i] = 0; + } + max_d += 96; + } + png_free(png_ptr, hash); + png_free(png_ptr, png_ptr->palette_to_index); + png_free(png_ptr, png_ptr->index_to_palette); + png_ptr->palette_to_index = NULL; + png_ptr->index_to_palette = NULL; + } + num_palette = maximum_colors; + } + if (png_ptr->palette == NULL) + { + png_ptr->palette = palette; + } + png_ptr->num_palette = (png_uint_16)num_palette; + + if (full_quantize) + { + int i; + png_bytep distance; + int total_bits = PNG_QUANTIZE_RED_BITS + PNG_QUANTIZE_GREEN_BITS + + PNG_QUANTIZE_BLUE_BITS; + int num_red = (1 << PNG_QUANTIZE_RED_BITS); + int num_green = (1 << PNG_QUANTIZE_GREEN_BITS); + int num_blue = (1 << PNG_QUANTIZE_BLUE_BITS); + png_size_t num_entries = ((png_size_t)1 << total_bits); + + png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr, + (png_uint_32)(num_entries * png_sizeof(png_byte))); + + distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries * + png_sizeof(png_byte))); + + png_memset(distance, 0xff, num_entries * png_sizeof(png_byte)); + + for (i = 0; i < num_palette; i++) + { + int ir, ig, ib; + int r = (palette[i].red >> (8 - PNG_QUANTIZE_RED_BITS)); + int g = (palette[i].green >> (8 - PNG_QUANTIZE_GREEN_BITS)); + int b = (palette[i].blue >> (8 - PNG_QUANTIZE_BLUE_BITS)); + + for (ir = 0; ir < num_red; ir++) + { + /* int dr = abs(ir - r); */ + int dr = ((ir > r) ? ir - r : r - ir); + int index_r = (ir << (PNG_QUANTIZE_BLUE_BITS + + PNG_QUANTIZE_GREEN_BITS)); + + for (ig = 0; ig < num_green; ig++) + { + /* int dg = abs(ig - g); */ + int dg = ((ig > g) ? ig - g : g - ig); + int dt = dr + dg; + int dm = ((dr > dg) ? dr : dg); + int index_g = index_r | (ig << PNG_QUANTIZE_BLUE_BITS); + + for (ib = 0; ib < num_blue; ib++) + { + int d_index = index_g | ib; + /* int db = abs(ib - b); */ + int db = ((ib > b) ? ib - b : b - ib); + int dmax = ((dm > db) ? dm : db); + int d = dmax + dt + db; + + if (d < (int)distance[d_index]) + { + distance[d_index] = (png_byte)d; + png_ptr->palette_lookup[d_index] = (png_byte)i; + } + } + } + } + } + + png_free(png_ptr, distance); + } +} +#endif /* PNG_READ_QUANTIZE_SUPPORTED */ + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* Transform the image from the file_gamma to the screen_gamma. We + * only do transformations on images where the file_gamma and screen_gamma + * are not close reciprocals, otherwise it slows things down slightly, and + * also needlessly introduces small errors. + * + * We will turn off gamma transformation later if no semitransparent entries + * are present in the tRNS array for palette images. We can't do it here + * because we don't necessarily have the tRNS chunk yet. + */ +static int /* PRIVATE */ +png_gamma_threshold(png_fixed_point scrn_gamma, png_fixed_point file_gamma) +{ + /* PNG_GAMMA_THRESHOLD is the threshold for performing gamma + * correction as a difference of the overall transform from 1.0 + * + * We want to compare the threshold with s*f - 1, if we get + * overflow here it is because of wacky gamma values so we + * turn on processing anyway. + */ + png_fixed_point gtest; + return !png_muldiv(>est, scrn_gamma, file_gamma, PNG_FP_1) || + png_gamma_significant(gtest); +} + +void PNGFAPI +png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma, + png_fixed_point file_gamma) +{ + png_debug(1, "in png_set_gamma_fixed"); + + if (png_ptr == NULL) + return; + + if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) || + (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || + png_gamma_threshold(scrn_gamma, file_gamma)) + png_ptr->transformations |= PNG_GAMMA; + png_ptr->gamma = file_gamma; + png_ptr->screen_gamma = scrn_gamma; +} + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma) +{ + png_set_gamma_fixed(png_ptr, + png_fixed(png_ptr, scrn_gamma, "png_set_gamma screen gamma"), + png_fixed(png_ptr, file_gamma, "png_set_gamma file gamma")); +} +# endif /* FLOATING_POINT_SUPPORTED */ +#endif /* READ_GAMMA */ + +#ifdef PNG_READ_EXPAND_SUPPORTED +/* Expand paletted images to RGB, expand grayscale images of + * less than 8-bit depth to 8-bit depth, and expand tRNS chunks + * to alpha channels. + */ +void PNGAPI +png_set_expand(png_structp png_ptr) +{ + png_debug(1, "in png_set_expand"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} + +/* GRR 19990627: the following three functions currently are identical + * to png_set_expand(). However, it is entirely reasonable that someone + * might wish to expand an indexed image to RGB but *not* expand a single, + * fully transparent palette entry to a full alpha channel--perhaps instead + * convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace + * the transparent color with a particular RGB value, or drop tRNS entirely. + * IOW, a future version of the library may make the transformations flag + * a bit more fine-grained, with separate bits for each of these three + * functions. + * + * More to the point, these functions make it obvious what libpng will be + * doing, whereas "expand" can (and does) mean any number of things. + * + * GRP 20060307: In libpng-1.2.9, png_set_gray_1_2_4_to_8() was modified + * to expand only the sample depth but not to expand the tRNS to alpha + * and its name was changed to png_set_expand_gray_1_2_4_to_8(). + */ + +/* Expand paletted images to RGB. */ +void PNGAPI +png_set_palette_to_rgb(png_structp png_ptr) +{ + png_debug(1, "in png_set_palette_to_rgb"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} + +/* Expand grayscale images of less than 8-bit depth to 8 bits. */ +void PNGAPI +png_set_expand_gray_1_2_4_to_8(png_structp png_ptr) +{ + png_debug(1, "in png_set_expand_gray_1_2_4_to_8"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_EXPAND; + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} + + + +/* Expand tRNS chunks to alpha channels. */ +void PNGAPI +png_set_tRNS_to_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_tRNS_to_alpha"); + + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} +#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED +void PNGAPI +png_set_gray_to_rgb(png_structp png_ptr) +{ + png_debug(1, "in png_set_gray_to_rgb"); + + if (png_ptr != NULL) + { + /* Because rgb must be 8 bits or more: */ + png_set_expand_gray_1_2_4_to_8(png_ptr); + png_ptr->transformations |= PNG_GRAY_TO_RGB; + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; + } +} +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +void PNGFAPI +png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, + png_fixed_point red, png_fixed_point green) +{ + png_debug(1, "in png_set_rgb_to_gray"); + + if (png_ptr == NULL) + return; + + switch(error_action) + { + case 1: + png_ptr->transformations |= PNG_RGB_TO_GRAY; + break; + + case 2: + png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; + break; + + case 3: + png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; + break; + + default: + png_error(png_ptr, "invalid error action to rgb_to_gray"); + break; + } + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) +#ifdef PNG_READ_EXPAND_SUPPORTED + png_ptr->transformations |= PNG_EXPAND; +#else + { + png_warning(png_ptr, + "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED"); + + png_ptr->transformations &= ~PNG_RGB_TO_GRAY; + } +#endif + { + png_uint_16 red_int, green_int; + if (red < 0 || green < 0) + { + red_int = 6968; /* .212671 * 32768 + .5 */ + green_int = 23434; /* .715160 * 32768 + .5 */ + } + + else if (red + green < 100000L) + { + red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); + green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L); + } + + else + { + png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients"); + red_int = 6968; + green_int = 23434; + } + + png_ptr->rgb_to_gray_red_coeff = red_int; + png_ptr->rgb_to_gray_green_coeff = green_int; + png_ptr->rgb_to_gray_blue_coeff = + (png_uint_16)(32768 - red_int - green_int); + } +} + +#ifdef PNG_FLOATING_POINT_SUPPORTED +/* Convert a RGB image to a grayscale of the same width. This allows us, + * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image. + */ + +void PNGAPI +png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red, + double green) +{ + if (png_ptr == NULL) + return; + + png_set_rgb_to_gray_fixed(png_ptr, error_action, + png_fixed(png_ptr, red, "rgb to gray red coefficient"), + png_fixed(png_ptr, green, "rgb to gray green coefficient")); +} +#endif /* FLOATING POINT */ + +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +void PNGAPI +png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr + read_user_transform_fn) +{ + png_debug(1, "in png_set_read_user_transform_fn"); + + if (png_ptr == NULL) + return; + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + png_ptr->transformations |= PNG_USER_TRANSFORM; + png_ptr->read_user_transform_fn = read_user_transform_fn; +#endif +} +#endif + +/* Initialize everything needed for the read. This includes modifying + * the palette. + */ +void /* PRIVATE */ +png_init_read_transformations(png_structp png_ptr) +{ + png_debug(1, "in png_init_read_transformations"); + + { +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_SHIFT_SUPPORTED) || \ + defined(PNG_READ_GAMMA_SUPPORTED) + int color_type = png_ptr->color_type; +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED + /* Detect gray background and attempt to enable optimization + * for gray --> RGB case + * + * Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or + * RGB_ALPHA (in which case need_expand is superfluous anyway), the + * background color might actually be gray yet not be flagged as such. + * This is not a problem for the current code, which uses + * PNG_BACKGROUND_IS_GRAY only to decide when to do the + * png_do_gray_to_rgb() transformation. + */ + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + !(color_type & PNG_COLOR_MASK_COLOR)) + { + png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; + } + + else if ((png_ptr->transformations & PNG_BACKGROUND) && + !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + (png_ptr->transformations & PNG_GRAY_TO_RGB) && + png_ptr->background.red == png_ptr->background.green && + png_ptr->background.red == png_ptr->background.blue) + { + png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; + png_ptr->background.gray = png_ptr->background.red; + } +#endif + + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + (png_ptr->transformations & PNG_EXPAND)) + { + if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */ + { + /* Expand background and tRNS chunks */ + switch (png_ptr->bit_depth) + { + case 1: + png_ptr->background.gray *= (png_uint_16)0xff; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_color.gray *= (png_uint_16)0xff; + png_ptr->trans_color.red = png_ptr->trans_color.green + = png_ptr->trans_color.blue = png_ptr->trans_color.gray; + } + break; + + case 2: + png_ptr->background.gray *= (png_uint_16)0x55; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_color.gray *= (png_uint_16)0x55; + png_ptr->trans_color.red = png_ptr->trans_color.green + = png_ptr->trans_color.blue = png_ptr->trans_color.gray; + } + break; + + case 4: + png_ptr->background.gray *= (png_uint_16)0x11; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_color.gray *= (png_uint_16)0x11; + png_ptr->trans_color.red = png_ptr->trans_color.green + = png_ptr->trans_color.blue = png_ptr->trans_color.gray; + } + break; + + default: + + case 8: + + case 16: + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + break; + } + } + else if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_ptr->background.red = + png_ptr->palette[png_ptr->background.index].red; + png_ptr->background.green = + png_ptr->palette[png_ptr->background.index].green; + png_ptr->background.blue = + png_ptr->palette[png_ptr->background.index].blue; + +#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED + if (png_ptr->transformations & PNG_INVERT_ALPHA) + { +#ifdef PNG_READ_EXPAND_SUPPORTED + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) +#endif + { + /* Invert the alpha channel (in tRNS) unless the pixels are + * going to be expanded, in which case leave it for later + */ + int i, istop; + istop=(int)png_ptr->num_trans; + for (i=0; itrans_alpha[i] = (png_byte)(255 - + png_ptr->trans_alpha[i]); + } + } +#endif + + } + } +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) + png_ptr->background_1 = png_ptr->background; +#endif +#ifdef PNG_READ_GAMMA_SUPPORTED + + if ((color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_trans != 0) + && png_gamma_threshold(png_ptr->screen_gamma, png_ptr->gamma)) + { + int i, k; + k=0; + for (i=0; inum_trans; i++) + { + if (png_ptr->trans_alpha[i] != 0 && png_ptr->trans_alpha[i] != 0xff) + k=1; /* Partial transparency is present */ + } + if (k == 0) + png_ptr->transformations &= ~PNG_GAMMA; + } + + if ((png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY)) && + png_ptr->gamma != 0) + { + png_build_gamma_table(png_ptr, png_ptr->bit_depth); + +#ifdef PNG_READ_BACKGROUND_SUPPORTED + if (png_ptr->transformations & PNG_BACKGROUND) + { + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + /* Could skip if no transparency */ + png_color back, back_1; + png_colorp palette = png_ptr->palette; + int num_palette = png_ptr->num_palette; + int i; + if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) + { + + back.red = png_ptr->gamma_table[png_ptr->background.red]; + back.green = png_ptr->gamma_table[png_ptr->background.green]; + back.blue = png_ptr->gamma_table[png_ptr->background.blue]; + + back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; + back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; + back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; + } + else + { + png_fixed_point g, gs; + + switch (png_ptr->background_gamma_type) + { + case PNG_BACKGROUND_GAMMA_SCREEN: + g = (png_ptr->screen_gamma); + gs = PNG_FP_1; + break; + + case PNG_BACKGROUND_GAMMA_FILE: + g = png_reciprocal(png_ptr->gamma); + gs = png_reciprocal2(png_ptr->gamma, + png_ptr->screen_gamma); + break; + + case PNG_BACKGROUND_GAMMA_UNIQUE: + g = png_reciprocal(png_ptr->background_gamma); + gs = png_reciprocal2(png_ptr->background_gamma, + png_ptr->screen_gamma); + break; + default: + g = PNG_FP_1; /* back_1 */ + gs = PNG_FP_1; /* back */ + break; + } + + if (png_gamma_significant(gs)) + { + back.red = (png_byte)png_ptr->background.red; + back.green = (png_byte)png_ptr->background.green; + back.blue = (png_byte)png_ptr->background.blue; + } + + else + { + back.red = png_gamma_8bit_correct(png_ptr->background.red, + gs); + back.green = png_gamma_8bit_correct(png_ptr->background.green, + gs); + back.blue = png_gamma_8bit_correct(png_ptr->background.blue, + gs); + } + back_1.red = png_gamma_8bit_correct(png_ptr->background.red, g); + back_1.green = png_gamma_8bit_correct(png_ptr->background.green, + g); + back_1.blue = png_gamma_8bit_correct(png_ptr->background.blue, + g); + } + for (i = 0; i < num_palette; i++) + { + if (i < (int)png_ptr->num_trans && + png_ptr->trans_alpha[i] != 0xff) + { + if (png_ptr->trans_alpha[i] == 0) + { + palette[i] = back; + } + else /* if (png_ptr->trans_alpha[i] != 0xff) */ + { + png_byte v, w; + + v = png_ptr->gamma_to_1[palette[i].red]; + png_composite(w, v, png_ptr->trans_alpha[i], back_1.red); + palette[i].red = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[palette[i].green]; + png_composite(w, v, png_ptr->trans_alpha[i], back_1.green); + palette[i].green = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[palette[i].blue]; + png_composite(w, v, png_ptr->trans_alpha[i], back_1.blue); + palette[i].blue = png_ptr->gamma_from_1[w]; + } + } + else + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } + /* Prevent the transformations being done again, and make sure + * that the now spurious alpha channel is stripped - the code + * has just reduced background composition and gamma correction + * to a simple alpha channel strip. + */ + png_ptr->transformations &= ~PNG_BACKGROUND; + png_ptr->transformations &= ~PNG_GAMMA; + png_ptr->flags |= PNG_FLAG_STRIP_ALPHA; + } + + /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */ + else + /* color_type != PNG_COLOR_TYPE_PALETTE */ + { + png_fixed_point g = PNG_FP_1; + png_fixed_point gs = PNG_FP_1; + + switch (png_ptr->background_gamma_type) + { + case PNG_BACKGROUND_GAMMA_SCREEN: + g = png_ptr->screen_gamma; + /* gs = PNG_FP_1; */ + break; + + case PNG_BACKGROUND_GAMMA_FILE: + g = png_reciprocal(png_ptr->gamma); + gs = png_reciprocal2(png_ptr->gamma, png_ptr->screen_gamma); + break; + + case PNG_BACKGROUND_GAMMA_UNIQUE: + g = png_reciprocal(png_ptr->background_gamma); + gs = png_reciprocal2(png_ptr->background_gamma, + png_ptr->screen_gamma); + break; + + default: + png_error(png_ptr, "invalid background gamma type"); + } + + png_ptr->background_1.gray = png_gamma_correct(png_ptr, + png_ptr->background.gray, g); + + png_ptr->background.gray = png_gamma_correct(png_ptr, + png_ptr->background.gray, gs); + + if ((png_ptr->background.red != png_ptr->background.green) || + (png_ptr->background.red != png_ptr->background.blue) || + (png_ptr->background.red != png_ptr->background.gray)) + { + /* RGB or RGBA with color background */ + png_ptr->background_1.red = png_gamma_correct(png_ptr, + png_ptr->background.red, g); + + png_ptr->background_1.green = png_gamma_correct(png_ptr, + png_ptr->background.green, g); + + png_ptr->background_1.blue = png_gamma_correct(png_ptr, + png_ptr->background.blue, g); + + png_ptr->background.red = png_gamma_correct(png_ptr, + png_ptr->background.red, gs); + + png_ptr->background.green = png_gamma_correct(png_ptr, + png_ptr->background.green, gs); + + png_ptr->background.blue = png_gamma_correct(png_ptr, + png_ptr->background.blue, gs); + } + + else + { + /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */ + png_ptr->background_1.red = png_ptr->background_1.green + = png_ptr->background_1.blue = png_ptr->background_1.gray; + + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + } + } + } + else + /* Transformation does not include PNG_BACKGROUND */ +#endif /* PNG_READ_BACKGROUND_SUPPORTED */ + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_colorp palette = png_ptr->palette; + int num_palette = png_ptr->num_palette; + int i; + + for (i = 0; i < num_palette; i++) + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + + /* Done the gamma correction. */ + png_ptr->transformations &= ~PNG_GAMMA; + } + } +#ifdef PNG_READ_BACKGROUND_SUPPORTED + else +#endif +#endif /* PNG_READ_GAMMA_SUPPORTED */ +#ifdef PNG_READ_BACKGROUND_SUPPORTED + /* No GAMMA transformation */ + if ((png_ptr->transformations & PNG_BACKGROUND) && + (color_type == PNG_COLOR_TYPE_PALETTE)) + { + int i; + int istop = (int)png_ptr->num_trans; + png_color back; + png_colorp palette = png_ptr->palette; + + back.red = (png_byte)png_ptr->background.red; + back.green = (png_byte)png_ptr->background.green; + back.blue = (png_byte)png_ptr->background.blue; + + for (i = 0; i < istop; i++) + { + if (png_ptr->trans_alpha[i] == 0) + { + palette[i] = back; + } + + else if (png_ptr->trans_alpha[i] != 0xff) + { + /* The png_composite() macro is defined in png.h */ + png_composite(palette[i].red, palette[i].red, + png_ptr->trans_alpha[i], back.red); + + png_composite(palette[i].green, palette[i].green, + png_ptr->trans_alpha[i], back.green); + + png_composite(palette[i].blue, palette[i].blue, + png_ptr->trans_alpha[i], back.blue); + } + } + + /* Handled alpha, still need to strip the channel. */ + png_ptr->transformations &= ~PNG_BACKGROUND; + png_ptr->flags |= PNG_FLAG_STRIP_ALPHA; + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED */ + +#ifdef PNG_READ_SHIFT_SUPPORTED + if ((png_ptr->transformations & PNG_SHIFT) && + (color_type == PNG_COLOR_TYPE_PALETTE)) + { + png_uint_16 i; + png_uint_16 istop = png_ptr->num_palette; + int sr = 8 - png_ptr->sig_bit.red; + int sg = 8 - png_ptr->sig_bit.green; + int sb = 8 - png_ptr->sig_bit.blue; + + if (sr < 0 || sr > 8) + sr = 0; + + if (sg < 0 || sg > 8) + sg = 0; + + if (sb < 0 || sb > 8) + sb = 0; + + for (i = 0; i < istop; i++) + { + png_ptr->palette[i].red >>= sr; + png_ptr->palette[i].green >>= sg; + png_ptr->palette[i].blue >>= sb; + } + } +#endif /* PNG_READ_SHIFT_SUPPORTED */ + } +#if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \ + && !defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr) + return; +#endif +} + +/* Modify the info structure to reflect the transformations. The + * info should be updated so a PNG file could be written with it, + * assuming the transformations result in valid PNG data. + */ +void /* PRIVATE */ +png_read_transform_info(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_transform_info"); + +#ifdef PNG_READ_EXPAND_SUPPORTED + if (png_ptr->transformations & PNG_EXPAND) + { + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (png_ptr->num_trans && + (png_ptr->transformations & PNG_EXPAND_tRNS)) + info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + + else + info_ptr->color_type = PNG_COLOR_TYPE_RGB; + + info_ptr->bit_depth = 8; + info_ptr->num_trans = 0; + } + else + { + if (png_ptr->num_trans) + { + if (png_ptr->transformations & PNG_EXPAND_tRNS) + info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; + } + if (info_ptr->bit_depth < 8) + info_ptr->bit_depth = 8; + + info_ptr->num_trans = 0; + } + } +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED + if (png_ptr->transformations & PNG_BACKGROUND) + { + info_ptr->color_type = (png_byte)(info_ptr->color_type & + ~PNG_COLOR_MASK_ALPHA); + info_ptr->num_trans = 0; + info_ptr->background = png_ptr->background; + } +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED + if (png_ptr->transformations & PNG_GAMMA) + { + info_ptr->gamma = png_ptr->gamma; + } +#endif + +#ifdef PNG_READ_16_TO_8_SUPPORTED +#ifdef PNG_READ_16BIT_SUPPORTED + if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16)) + info_ptr->bit_depth = 8; +#else + /* Force chopping 16-bit input down to 8 */ + if (info_ptr->bit_depth == 16) + { + png_ptr->transformations |=PNG_16_TO_8; + info_ptr->bit_depth = 8; + } +#endif +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED + if (png_ptr->transformations & PNG_GRAY_TO_RGB) + info_ptr->color_type |= PNG_COLOR_MASK_COLOR; +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED + if (png_ptr->transformations & PNG_RGB_TO_GRAY) + info_ptr->color_type &= ~PNG_COLOR_MASK_COLOR; +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED + if (png_ptr->transformations & PNG_QUANTIZE) + { + if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || + (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && + png_ptr->palette_lookup && info_ptr->bit_depth == 8) + { + info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; + } + } +#endif + +#ifdef PNG_READ_PACK_SUPPORTED + if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8)) + info_ptr->bit_depth = 8; +#endif + + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + info_ptr->channels = 1; + + else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + info_ptr->channels = 3; + + else + info_ptr->channels = 1; + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED + if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) + info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; +#endif + + if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + info_ptr->channels++; + +#ifdef PNG_READ_FILLER_SUPPORTED + /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */ + if ((png_ptr->transformations & PNG_FILLER) && + ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || + (info_ptr->color_type == PNG_COLOR_TYPE_GRAY))) + { + info_ptr->channels++; + /* If adding a true alpha channel not just filler */ + if (png_ptr->transformations & PNG_ADD_ALPHA) + info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; + } +#endif + +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \ +defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + if (info_ptr->bit_depth < png_ptr->user_transform_depth) + info_ptr->bit_depth = png_ptr->user_transform_depth; + + if (info_ptr->channels < png_ptr->user_transform_channels) + info_ptr->channels = png_ptr->user_transform_channels; + } +#endif + + info_ptr->pixel_depth = (png_byte)(info_ptr->channels * + info_ptr->bit_depth); + + info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width); + +#ifndef PNG_READ_EXPAND_SUPPORTED + if (png_ptr) + return; +#endif +} + +/* Transform the row. The order of transformations is significant, + * and is very touchy. If you add a transformation, take care to + * decide how it fits in with the other transformations here. + */ +void /* PRIVATE */ +png_do_read_transformations(png_structp png_ptr) +{ + png_debug(1, "in png_do_read_transformations"); + + if (png_ptr->row_buf == NULL) + { +#ifdef PNG_CONSOLE_IO_SUPPORTED + char msg[50]; + + png_snprintf2(msg, 50, + "NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number, + png_ptr->pass); + png_error(png_ptr, msg); +#else + png_error(png_ptr, "NULL row buffer"); +#endif + } +#ifdef PNG_WARN_UNINITIALIZED_ROW + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + /* Application has failed to call either png_read_start_image() + * or png_read_update_info() after setting transforms that expand + * pixels. This check added to libpng-1.2.19 + */ +#if (PNG_WARN_UNINITIALIZED_ROW==1) + png_error(png_ptr, "Uninitialized row"); +#else + png_warning(png_ptr, "Uninitialized row"); +#endif +#endif + +#ifdef PNG_READ_EXPAND_SUPPORTED + if (png_ptr->transformations & PNG_EXPAND) + { + if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE) + { + png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans); + } + else + { + if (png_ptr->num_trans && + (png_ptr->transformations & PNG_EXPAND_tRNS)) + png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->trans_color)); + else + + png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, + NULL); + } + } +#endif + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED + if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) + png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, + PNG_FLAG_FILLER_AFTER | (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)); +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED + if (png_ptr->transformations & PNG_RGB_TO_GRAY) + { + int rgb_error = + png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), + png_ptr->row_buf + 1); + + if (rgb_error) + { + png_ptr->rgb_to_gray_status=1; + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == + PNG_RGB_TO_GRAY_WARN) + png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); + + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == + PNG_RGB_TO_GRAY_ERR) + png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel"); + } + } +#endif + +/* From Andreas Dilger e-mail to png-implement, 26 March 1998: + * + * In most cases, the "simple transparency" should be done prior to doing + * gray-to-RGB, or you will have to test 3x as many bytes to check if a + * pixel is transparent. You would also need to make sure that the + * transparency information is upgraded to RGB. + * + * To summarize, the current flow is: + * - Gray + simple transparency -> compare 1 or 2 gray bytes and composite + * with background "in place" if transparent, + * convert to RGB if necessary + * - Gray + alpha -> composite with gray background and remove alpha bytes, + * convert to RGB if necessary + * + * To support RGB backgrounds for gray images we need: + * - Gray + simple transparency -> convert to RGB + simple transparency, + * compare 3 or 6 bytes and composite with + * background "in place" if transparent + * (3x compare/pixel compared to doing + * composite with gray bkgrnd) + * - Gray + alpha -> convert to RGB + alpha, composite with background and + * remove alpha bytes (3x float + * operations/pixel compared with composite + * on gray background) + * + * Greg's change will do this. The reason it wasn't done before is for + * performance, as this increases the per-pixel operations. If we would check + * in advance if the background was gray or RGB, and position the gray-to-RGB + * transform appropriately, then it would save a lot of work/time. + */ + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED + /* If gray -> RGB, do so now only if background is non-gray; else do later + * for performance reasons + */ + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && + !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) + png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED + if ((png_ptr->transformations & PNG_BACKGROUND) && + ((png_ptr->num_trans != 0) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) + png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->trans_color), &(png_ptr->background) +#ifdef PNG_READ_GAMMA_SUPPORTED + , &(png_ptr->background_1), + png_ptr->gamma_table, png_ptr->gamma_from_1, + png_ptr->gamma_to_1, png_ptr->gamma_16_table, + png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1, + png_ptr->gamma_shift +#endif + ); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED + if ((png_ptr->transformations & PNG_GAMMA) && +#ifdef PNG_READ_BACKGROUND_SUPPORTED + !((png_ptr->transformations & PNG_BACKGROUND) && + ((png_ptr->num_trans != 0) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && +#endif + (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)) + png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->gamma_table, png_ptr->gamma_16_table, + png_ptr->gamma_shift); +#endif + +#ifdef PNG_READ_16_TO_8_SUPPORTED + if (png_ptr->transformations & PNG_16_TO_8) + png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED + if (png_ptr->transformations & PNG_QUANTIZE) + { + png_do_quantize(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->palette_lookup, png_ptr->quantize_index); + + if (png_ptr->row_info.rowbytes == 0) + png_error(png_ptr, "png_do_quantize returned rowbytes=0"); + } +#endif /* PNG_READ_QUANTIZE_SUPPORTED */ + +#ifdef PNG_READ_INVERT_SUPPORTED + if (png_ptr->transformations & PNG_INVERT_MONO) + png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_SHIFT_SUPPORTED + if (png_ptr->transformations & PNG_SHIFT) + png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->shift)); +#endif + +#ifdef PNG_READ_PACK_SUPPORTED + if (png_ptr->transformations & PNG_PACK) + png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_BGR_SUPPORTED + if (png_ptr->transformations & PNG_BGR) + png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_PACKSWAP_SUPPORTED + if (png_ptr->transformations & PNG_PACKSWAP) + png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED + /* If gray -> RGB, do so now only if we did not do so above */ + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && + (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) + png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_FILLER_SUPPORTED + if (png_ptr->transformations & PNG_FILLER) + png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, + (png_uint_32)png_ptr->filler, png_ptr->flags); +#endif + +#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED + if (png_ptr->transformations & PNG_INVERT_ALPHA) + png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED + if (png_ptr->transformations & PNG_SWAP_ALPHA) + png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_READ_16BIT_SUPPORTED +#ifdef PNG_READ_SWAP_SUPPORTED + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif +#endif + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + if (png_ptr->read_user_transform_fn != NULL) + (*(png_ptr->read_user_transform_fn)) /* User read transform function */ + (png_ptr, /* png_ptr */ + &(png_ptr->row_info), /* row_info: */ + /* png_uint_32 width; width of row */ + /* png_size_t rowbytes; number of bytes in row */ + /* png_byte color_type; color type of pixels */ + /* png_byte bit_depth; bit depth of samples */ + /* png_byte channels; number of channels (1-4) */ + /* png_byte pixel_depth; bits per pixel (depth*channels) */ + png_ptr->row_buf + 1); /* start of pixel data for row */ +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED + if (png_ptr->user_transform_depth) + png_ptr->row_info.bit_depth = png_ptr->user_transform_depth; + + if (png_ptr->user_transform_channels) + png_ptr->row_info.channels = png_ptr->user_transform_channels; +#endif + png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * + png_ptr->row_info.channels); + + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + } +#endif + +} + +#ifdef PNG_READ_PACK_SUPPORTED +/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel, + * without changing the actual values. Thus, if you had a row with + * a bit depth of 1, you would end up with bytes that only contained + * the numbers 0 or 1. If you would rather they contain 0 and 255, use + * png_do_shift() after this. + */ +void /* PRIVATE */ +png_do_unpack(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_unpack"); + + if (row_info->bit_depth < 8) + { + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + switch (row_info->bit_depth) + { + case 1: + { + png_bytep sp = row + (png_size_t)((row_width - 1) >> 3); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x01); + + if (shift == 7) + { + shift = 0; + sp--; + } + + else + shift++; + + dp--; + } + break; + } + + case 2: + { + + png_bytep sp = row + (png_size_t)((row_width - 1) >> 2); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x03); + + if (shift == 6) + { + shift = 0; + sp--; + } + + else + shift += 2; + + dp--; + } + break; + } + + case 4: + { + png_bytep sp = row + (png_size_t)((row_width - 1) >> 1); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x0f); + + if (shift == 4) + { + shift = 0; + sp--; + } + + else + shift = 4; + + dp--; + } + break; + } + + default: + break; + } + row_info->bit_depth = 8; + row_info->pixel_depth = (png_byte)(8 * row_info->channels); + row_info->rowbytes = row_width * row_info->channels; + } +} +#endif + +#ifdef PNG_READ_SHIFT_SUPPORTED +/* Reverse the effects of png_do_shift. This routine merely shifts the + * pixels back to their significant bits values. Thus, if you have + * a row of bit depth 8, but only 5 are significant, this will shift + * the values back to 0 through 31. + */ +void /* PRIVATE */ +png_do_unshift(png_row_infop row_info, png_bytep row, + png_const_color_8p sig_bits) +{ + png_debug(1, "in png_do_unshift"); + + if ( + row_info->color_type != PNG_COLOR_TYPE_PALETTE) + { + int shift[4]; + int channels = 0; + int c; + png_uint_16 value = 0; + png_uint_32 row_width = row_info->width; + + if (row_info->color_type & PNG_COLOR_MASK_COLOR) + { + shift[channels++] = row_info->bit_depth - sig_bits->red; + shift[channels++] = row_info->bit_depth - sig_bits->green; + shift[channels++] = row_info->bit_depth - sig_bits->blue; + } + + else + { + shift[channels++] = row_info->bit_depth - sig_bits->gray; + } + + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + { + shift[channels++] = row_info->bit_depth - sig_bits->alpha; + } + + for (c = 0; c < channels; c++) + { + if (shift[c] <= 0) + shift[c] = 0; + + else + value = 1; + } + + if (!value) + return; + + switch (row_info->bit_depth) + { + default: + break; + + case 2: + { + png_bytep bp; + png_size_t i; + png_size_t istop = row_info->rowbytes; + + for (bp = row, i = 0; i < istop; i++) + { + *bp >>= 1; + *bp++ &= 0x55; + } + break; + } + + case 4: + { + png_bytep bp = row; + png_size_t i; + png_size_t istop = row_info->rowbytes; + png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) | + (png_byte)((int)0xf >> shift[0])); + + for (i = 0; i < istop; i++) + { + *bp >>= shift[0]; + *bp++ &= mask; + } + break; + } + + case 8: + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = row_width * channels; + + for (i = 0; i < istop; i++) + { + *bp++ >>= shift[i%channels]; + } + break; + } + +#ifdef PNG_READ_16BIT_SUPPORTED + case 16: + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = channels * row_width; + + for (i = 0; i < istop; i++) + { + value = (png_uint_16)((*bp << 8) + *(bp + 1)); + value >>= shift[i%channels]; + *bp++ = (png_byte)(value >> 8); + *bp++ = (png_byte)(value & 0xff); + } + break; + } +#endif + } + } +} +#endif + +#ifdef PNG_READ_16_TO_8_SUPPORTED +/* Chop rows of bit depth 16 down to 8 */ +void /* PRIVATE */ +png_do_chop(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_chop"); + + if (row_info->bit_depth == 16) + { + png_bytep sp = row; + png_bytep dp = row; + png_uint_32 i; + png_uint_32 istop = row_info->width * row_info->channels; + + for (i = 0; i> 8)) >> 8; + * + * Approximate calculation with shift/add instead of multiply/divide: + * *dp = ((((png_uint_32)(*sp) << 8) | + * (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8; + * + * What we actually do to avoid extra shifting and conversion: + */ + + *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0); +#else + /* Simply discard the low order byte */ + *dp = *sp; +#endif + } + row_info->bit_depth = 8; + row_info->pixel_depth = (png_byte)(8 * row_info->channels); + row_info->rowbytes = row_info->width * row_info->channels; + } +} +#endif + +#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED +void /* PRIVATE */ +png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_read_swap_alpha"); + + { + png_uint_32 row_width = row_info->width; + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + /* This converts from RGBA to ARGB */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save; + } + } + +#ifdef PNG_READ_16BIT_SUPPORTED + /* This converts from RRGGBBAA to AARRGGBB */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save[2]; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save[0] = *(--sp); + save[1] = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save[0]; + *(--dp) = save[1]; + } + } +#endif + } + + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + /* This converts from GA to AG */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save; + } + } + +#ifdef PNG_READ_16BIT_SUPPORTED + /* This converts from GGAA to AAGG */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save[2]; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save[0] = *(--sp); + save[1] = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save[0]; + *(--dp) = save[1]; + } + } +#endif + } + } +} +#endif + +#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED +void /* PRIVATE */ +png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) +{ + png_uint_32 row_width; + png_debug(1, "in png_do_read_invert_alpha"); + + row_width = row_info->width; + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + if (row_info->bit_depth == 8) + { + /* This inverts the alpha channel in RGBA */ + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + +/* This does nothing: + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + We can replace it with: +*/ + sp-=3; + dp=sp; + } + } + +#ifdef PNG_READ_16BIT_SUPPORTED + /* This inverts the alpha channel in RRGGBBAA */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = (png_byte)(255 - *(--sp)); + +/* This does nothing: + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + We can replace it with: +*/ + sp-=6; + dp=sp; + } + } +#endif + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (row_info->bit_depth == 8) + { + /* This inverts the alpha channel in GA */ + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = *(--sp); + } + } + +#ifdef PNG_READ_16BIT_SUPPORTED + else + { + /* This inverts the alpha channel in GGAA */ + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = (png_byte)(255 - *(--sp)); +/* + *(--dp) = *(--sp); + *(--dp) = *(--sp); +*/ + sp-=2; + dp=sp; + } + } +#endif + } +} +#endif + +#ifdef PNG_READ_FILLER_SUPPORTED +/* Add filler channel if we have RGB color */ +void /* PRIVATE */ +png_do_read_filler(png_row_infop row_info, png_bytep row, + png_uint_32 filler, png_uint_32 flags) +{ + png_uint_32 i; + png_uint_32 row_width = row_info->width; + +#ifdef PNG_READ_16BIT_SUPPORTED + png_byte hi_filler = (png_byte)((filler>>8) & 0xff); +#endif + png_byte lo_filler = (png_byte)(filler & 0xff); + + png_debug(1, "in png_do_read_filler"); + + if ( + row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + if (row_info->bit_depth == 8) + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This changes the data from G to GX */ + png_bytep sp = row + (png_size_t)row_width; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 1; i < row_width; i++) + { + *(--dp) = lo_filler; + *(--dp) = *(--sp); + } + *(--dp) = lo_filler; + row_info->channels = 2; + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + + else + { + /* This changes the data from G to XG */ + png_bytep sp = row + (png_size_t)row_width; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = lo_filler; + } + row_info->channels = 2; + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + } + +#ifdef PNG_READ_16BIT_SUPPORTED + else if (row_info->bit_depth == 16) + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This changes the data from GG to GGXX */ + png_bytep sp = row + (png_size_t)row_width * 2; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 1; i < row_width; i++) + { + *(--dp) = hi_filler; + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = hi_filler; + *(--dp) = lo_filler; + row_info->channels = 2; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + + else + { + /* This changes the data from GG to XXGG */ + png_bytep sp = row + (png_size_t)row_width * 2; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = hi_filler; + *(--dp) = lo_filler; + } + row_info->channels = 2; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + } +#endif + } /* COLOR_TYPE == GRAY */ + else if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + if (row_info->bit_depth == 8) + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This changes the data from RGB to RGBX */ + png_bytep sp = row + (png_size_t)row_width * 3; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 1; i < row_width; i++) + { + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = lo_filler; + row_info->channels = 4; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + + else + { + /* This changes the data from RGB to XRGB */ + png_bytep sp = row + (png_size_t)row_width * 3; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = lo_filler; + } + row_info->channels = 4; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + } + +#ifdef PNG_READ_16BIT_SUPPORTED + else if (row_info->bit_depth == 16) + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This changes the data from RRGGBB to RRGGBBXX */ + png_bytep sp = row + (png_size_t)row_width * 6; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 1; i < row_width; i++) + { + *(--dp) = hi_filler; + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = hi_filler; + *(--dp) = lo_filler; + row_info->channels = 4; + row_info->pixel_depth = 64; + row_info->rowbytes = row_width * 8; + } + + else + { + /* This changes the data from RRGGBB to XXRRGGBB */ + png_bytep sp = row + (png_size_t)row_width * 6; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = hi_filler; + *(--dp) = lo_filler; + } + + row_info->channels = 4; + row_info->pixel_depth = 64; + row_info->rowbytes = row_width * 8; + } + } +#endif + } /* COLOR_TYPE == RGB */ +} +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED +/* Expand grayscale files to RGB, with or without alpha */ +void /* PRIVATE */ +png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) +{ + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + png_debug(1, "in png_do_gray_to_rgb"); + + if (row_info->bit_depth >= 8 && + !(row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + if (row_info->bit_depth == 8) + { + /* This changes G to RGB */ + png_bytep sp = row + (png_size_t)row_width - 1; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(dp--) = *sp; + *(dp--) = *sp; + *(dp--) = *(sp--); + } + } + + else + { + /* This changes GG to RRGGBB */ + png_bytep sp = row + (png_size_t)row_width * 2 - 1; + png_bytep dp = sp + (png_size_t)row_width * 4; + for (i = 0; i < row_width; i++) + { + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *(sp--); + *(dp--) = *(sp--); + } + } + } + + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (row_info->bit_depth == 8) + { + /* This changes GA to RGBA */ + png_bytep sp = row + (png_size_t)row_width * 2 - 1; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(dp--) = *(sp--); + *(dp--) = *sp; + *(dp--) = *sp; + *(dp--) = *(sp--); + } + } + + else + { + /* This changes GGAA to RRGGBBAA */ + png_bytep sp = row + (png_size_t)row_width * 4 - 1; + png_bytep dp = sp + (png_size_t)row_width * 4; + for (i = 0; i < row_width; i++) + { + *(dp--) = *(sp--); + *(dp--) = *(sp--); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *(sp--); + *(dp--) = *(sp--); + } + } + } + row_info->channels += (png_byte)2; + row_info->color_type |= PNG_COLOR_MASK_COLOR; + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } +} +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +/* Reduce RGB files to grayscale, with or without alpha + * using the equation given in Poynton's ColorFAQ at + * (THIS LINK IS DEAD June 2008) + * New link: + * + * Charles Poynton poynton at poynton.com + * + * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B + * + * We approximate this with + * + * Y = 0.21268 * R + 0.7151 * G + 0.07217 * B + * + * which can be expressed with integers as + * + * Y = (6969 * R + 23434 * G + 2365 * B)/32768 + * + * The calculation is to be done in a linear colorspace. + * + * Other integer coefficents can be used via png_set_rgb_to_gray(). + */ +int /* PRIVATE */ +png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) + +{ + png_uint_32 i; + + png_uint_32 row_width = row_info->width; + int rgb_error = 0; + + png_debug(1, "in png_do_rgb_to_gray"); + + if (!(row_info->color_type & PNG_COLOR_MASK_PALETTE) && + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; + png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; + png_uint_32 bc = png_ptr->rgb_to_gray_blue_coeff; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + + for (i = 0; i < row_width; i++) + { + png_byte red = png_ptr->gamma_to_1[*(sp++)]; + png_byte green = png_ptr->gamma_to_1[*(sp++)]; + png_byte blue = png_ptr->gamma_to_1[*(sp++)]; + + if (red != green || red != blue) + { + rgb_error |= 1; + *(dp++) = png_ptr->gamma_from_1[ + (rc*red + gc*green + bc*blue)>>15]; + } + + else + *(dp++) = *(sp - 1); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = *(sp++); + png_byte green = *(sp++); + png_byte blue = *(sp++); + + if (red != green || red != blue) + { + rgb_error |= 1; + *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); + } + + else + *(dp++) = *(sp - 1); + } + } + } + + else /* RGB bit_depth == 16 */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_16_to_1 != NULL && + png_ptr->gamma_16_from_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, w; + + red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + + if (red == green && red == blue) + w = red; + + else + { + png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) + >> png_ptr->gamma_shift][red>>8]; + png_uint_16 green_1 = + png_ptr->gamma_16_to_1[(green&0xff) >> + png_ptr->gamma_shift][green>>8]; + png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) + >> png_ptr->gamma_shift][blue>>8]; + png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1 + + bc*blue_1)>>15); + w = png_ptr->gamma_16_from_1[(gray16&0xff) >> + png_ptr->gamma_shift][gray16 >> 8]; + rgb_error |= 1; + } + + *(dp++) = (png_byte)((w>>8) & 0xff); + *(dp++) = (png_byte)(w & 0xff); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, gray16; + + red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + + if (red != green || red != blue) + rgb_error |= 1; + + gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = (png_byte)((gray16>>8) & 0xff); + *(dp++) = (png_byte)(gray16 & 0xff); + } + } + } + } + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = png_ptr->gamma_to_1[*(sp++)]; + png_byte green = png_ptr->gamma_to_1[*(sp++)]; + png_byte blue = png_ptr->gamma_to_1[*(sp++)]; + + if (red != green || red != blue) + rgb_error |= 1; + + *(dp++) = png_ptr->gamma_from_1 + [(rc*red + gc*green + bc*blue)>>15]; + + *(dp++) = *(sp++); /* alpha */ + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = *(sp++); + png_byte green = *(sp++); + png_byte blue = *(sp++); + if (red != green || red != blue) + rgb_error |= 1; + + *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = *(sp++); /* alpha */ + } + } + } + else /* RGBA bit_depth == 16 */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_16_to_1 != NULL && + png_ptr->gamma_16_from_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, w; + + red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; + + if (red == green && red == blue) + w = red; + + else + { + png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> + png_ptr->gamma_shift][red>>8]; + + png_uint_16 green_1 = + png_ptr->gamma_16_to_1[(green&0xff) >> + png_ptr->gamma_shift][green>>8]; + + png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> + png_ptr->gamma_shift][blue>>8]; + + png_uint_16 gray16 = (png_uint_16)((rc * red_1 + + gc * green_1 + bc * blue_1)>>15); + + w = png_ptr->gamma_16_from_1[(gray16&0xff) >> + png_ptr->gamma_shift][gray16 >> 8]; + + rgb_error |= 1; + } + + *(dp++) = (png_byte)((w>>8) & 0xff); + *(dp++) = (png_byte)(w & 0xff); + *(dp++) = *(sp++); /* alpha */ + *(dp++) = *(sp++); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, gray16; + red = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2; + green = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2; + blue = (png_uint_16)((*(sp)<<8) | *(sp + 1)); sp += 2; + + if (red != green || red != blue) + rgb_error |= 1; + + gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = (png_byte)((gray16>>8) & 0xff); + *(dp++) = (png_byte)(gray16 & 0xff); + *(dp++) = *(sp++); /* alpha */ + *(dp++) = *(sp++); + } + } + } + } + row_info->channels -= 2; + row_info->color_type = (png_byte)(row_info->color_type & + ~PNG_COLOR_MASK_COLOR); + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + return rgb_error; +} +#endif + +/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth + * large of png_color. This lets grayscale images be treated as + * paletted. Most useful for gamma correction and simplification + * of code. + */ +void PNGAPI +png_build_grayscale_palette(int bit_depth, png_colorp palette) +{ + int num_palette; + int color_inc; + int i; + int v; + + png_debug(1, "in png_do_build_grayscale_palette"); + + if (palette == NULL) + return; + + switch (bit_depth) + { + case 1: + num_palette = 2; + color_inc = 0xff; + break; + + case 2: + num_palette = 4; + color_inc = 0x55; + break; + + case 4: + num_palette = 16; + color_inc = 0x11; + break; + + case 8: + num_palette = 256; + color_inc = 1; + break; + + default: + num_palette = 0; + color_inc = 0; + break; + } + + for (i = 0, v = 0; i < num_palette; i++, v += color_inc) + { + palette[i].red = (png_byte)v; + palette[i].green = (png_byte)v; + palette[i].blue = (png_byte)v; + } +} + + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +/* Replace any alpha or transparency with the supplied background color. + * "background" is already in the screen gamma, while "background_1" is + * at a gamma of 1.0. Paletted files have already been taken care of. + */ +void /* PRIVATE */ +png_do_background(png_row_infop row_info, png_bytep row, + png_const_color_16p trans_color, png_const_color_16p background +#ifdef PNG_READ_GAMMA_SUPPORTED + , png_const_color_16p background_1, png_const_bytep gamma_table, + png_const_bytep gamma_from_1, png_const_bytep gamma_to_1, + png_const_uint_16pp gamma_16, png_const_uint_16pp gamma_16_from_1, + png_const_uint_16pp gamma_16_to_1, int gamma_shift +#endif + ) +{ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + int shift; + + png_debug(1, "in png_do_background"); + + if (background != NULL && + (!(row_info->color_type & PNG_COLOR_MASK_ALPHA) || + (row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_color))) + { + switch (row_info->color_type) + { + case PNG_COLOR_TYPE_GRAY: + { + switch (row_info->bit_depth) + { + case 1: + { + sp = row; + shift = 7; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x01) + == trans_color->gray) + { + *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + + if (!shift) + { + shift = 7; + sp++; + } + + else + shift--; + } + break; + } + + case 2: + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_table != NULL) + { + sp = row; + shift = 6; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x03) + == trans_color->gray) + { + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + + else + { + png_byte p = (png_byte)((*sp >> shift) & 0x03); + png_byte g = (png_byte)((gamma_table [p | (p << 2) | + (p << 4) | (p << 6)] >> 6) & 0x03); + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(g << shift); + } + + if (!shift) + { + shift = 6; + sp++; + } + + else + shift -= 2; + } + } + + else +#endif + { + sp = row; + shift = 6; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x03) + == trans_color->gray) + { + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + + if (!shift) + { + shift = 6; + sp++; + } + + else + shift -= 2; + } + } + break; + } + + case 4: + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_table != NULL) + { + sp = row; + shift = 4; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x0f) + == trans_color->gray) + { + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + + else + { + png_byte p = (png_byte)((*sp >> shift) & 0x0f); + png_byte g = (png_byte)((gamma_table[p | + (p << 4)] >> 4) & 0x0f); + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(g << shift); + } + + if (!shift) + { + shift = 4; + sp++; + } + + else + shift -= 4; + } + } + + else +#endif + { + sp = row; + shift = 4; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x0f) + == trans_color->gray) + { + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + + if (!shift) + { + shift = 4; + sp++; + } + + else + shift -= 4; + } + } + break; + } + + case 8: + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_table != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp++) + { + if (*sp == trans_color->gray) + *sp = (png_byte)background->gray; + + else + *sp = gamma_table[*sp]; + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp++) + { + if (*sp == trans_color->gray) + *sp = (png_byte)background->gray; + } + } + break; + } + + case 16: + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_16 != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 2) + { + png_uint_16 v; + + v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + + if (v == trans_color->gray) + { + /* Background is already in screen gamma */ + *sp = (png_byte)((background->gray >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->gray & 0xff); + } + + else + { + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 2) + { + png_uint_16 v; + + v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + + if (v == trans_color->gray) + { + *sp = (png_byte)((background->gray >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->gray & 0xff); + } + } + } + break; + } + + default: + break; + } + break; + } + + case PNG_COLOR_TYPE_RGB: + { + if (row_info->bit_depth == 8) + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_table != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 3) + { + if (*sp == trans_color->red && + *(sp + 1) == trans_color->green && + *(sp + 2) == trans_color->blue) + { + *sp = (png_byte)background->red; + *(sp + 1) = (png_byte)background->green; + *(sp + 2) = (png_byte)background->blue; + } + + else + { + *sp = gamma_table[*sp]; + *(sp + 1) = gamma_table[*(sp + 1)]; + *(sp + 2) = gamma_table[*(sp + 2)]; + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 3) + { + if (*sp == trans_color->red && + *(sp + 1) == trans_color->green && + *(sp + 2) == trans_color->blue) + { + *sp = (png_byte)background->red; + *(sp + 1) = (png_byte)background->green; + *(sp + 2) = (png_byte)background->blue; + } + } + } + } + else /* if (row_info->bit_depth == 16) */ + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_16 != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 6) + { + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + + png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + + png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) + + *(sp + 5)); + + if (r == trans_color->red && g == trans_color->green && + b == trans_color->blue) + { + /* Background is already in screen gamma */ + *sp = (png_byte)((background->red >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->red & 0xff); + *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(sp + 3) = (png_byte)(background->green & 0xff); + *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(sp + 5) = (png_byte)(background->blue & 0xff); + } + + else + { + png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + + v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; + *(sp + 2) = (png_byte)((v >> 8) & 0xff); + *(sp + 3) = (png_byte)(v & 0xff); + + v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; + *(sp + 4) = (png_byte)((v >> 8) & 0xff); + *(sp + 5) = (png_byte)(v & 0xff); + } + } + } + + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 6) + { + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + + png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + + png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) + + *(sp + 5)); + + if (r == trans_color->red && g == trans_color->green && + b == trans_color->blue) + { + *sp = (png_byte)((background->red >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->red & 0xff); + *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(sp + 3) = (png_byte)(background->green & 0xff); + *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(sp + 5) = (png_byte)(background->blue & 0xff); + } + } + } + } + break; + } + + case PNG_COLOR_TYPE_GRAY_ALPHA: + { + if (row_info->bit_depth == 8) + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_to_1 != NULL && gamma_from_1 != NULL && + gamma_table != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 2, dp++) + { + png_uint_16 a = *(sp + 1); + + if (a == 0xff) + *dp = gamma_table[*sp]; + + else if (a == 0) + { + /* Background is already in screen gamma */ + *dp = (png_byte)background->gray; + } + + else + { + png_byte v, w; + + v = gamma_to_1[*sp]; + png_composite(w, v, a, background_1->gray); + *dp = gamma_from_1[w]; + } + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 2, dp++) + { + png_byte a = *(sp + 1); + + if (a == 0xff) + *dp = *sp; + +#ifdef PNG_READ_GAMMA_SUPPORTED + else if (a == 0) + *dp = (png_byte)background->gray; + + else + png_composite(*dp, *sp, a, background_1->gray); + +#else + *dp = (png_byte)background->gray; +#endif + } + } + } + else /* if (png_ptr->bit_depth == 16) */ + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_16 != NULL && gamma_16_from_1 != NULL && + gamma_16_to_1 != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 2) + { + png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + + if (a == (png_uint_16)0xffff) + { + png_uint_16 v; + + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + } + +#ifdef PNG_READ_GAMMA_SUPPORTED + else if (a == 0) +#else + else +#endif + { + /* Background is already in screen gamma */ + *dp = (png_byte)((background->gray >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->gray & 0xff); + } + +#ifdef PNG_READ_GAMMA_SUPPORTED + else + { + png_uint_16 g, v, w; + + g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; + png_composite_16(v, g, a, background_1->gray); + w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; + *dp = (png_byte)((w >> 8) & 0xff); + *(dp + 1) = (png_byte)(w & 0xff); + } +#endif + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 2) + { + png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + + if (a == (png_uint_16)0xffff) + png_memcpy(dp, sp, 2); + +#ifdef PNG_READ_GAMMA_SUPPORTED + else if (a == 0) +#else + else +#endif + { + *dp = (png_byte)((background->gray >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->gray & 0xff); + } + +#ifdef PNG_READ_GAMMA_SUPPORTED + else + { + png_uint_16 g, v; + + g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + png_composite_16(v, g, a, background_1->gray); + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + } +#endif + } + } + } + break; + } + + case PNG_COLOR_TYPE_RGB_ALPHA: + { + if (row_info->bit_depth == 8) + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_to_1 != NULL && gamma_from_1 != NULL && + gamma_table != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 3) + { + png_byte a = *(sp + 3); + + if (a == 0xff) + { + *dp = gamma_table[*sp]; + *(dp + 1) = gamma_table[*(sp + 1)]; + *(dp + 2) = gamma_table[*(sp + 2)]; + } + + else if (a == 0) + { + /* Background is already in screen gamma */ + *dp = (png_byte)background->red; + *(dp + 1) = (png_byte)background->green; + *(dp + 2) = (png_byte)background->blue; + } + + else + { + png_byte v, w; + + v = gamma_to_1[*sp]; + png_composite(w, v, a, background_1->red); + *dp = gamma_from_1[w]; + + v = gamma_to_1[*(sp + 1)]; + png_composite(w, v, a, background_1->green); + *(dp + 1) = gamma_from_1[w]; + + v = gamma_to_1[*(sp + 2)]; + png_composite(w, v, a, background_1->blue); + *(dp + 2) = gamma_from_1[w]; + } + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 3) + { + png_byte a = *(sp + 3); + + if (a == 0xff) + { + *dp = *sp; + *(dp + 1) = *(sp + 1); + *(dp + 2) = *(sp + 2); + } + + else if (a == 0) + { + *dp = (png_byte)background->red; + *(dp + 1) = (png_byte)background->green; + *(dp + 2) = (png_byte)background->blue; + } + + else + { + png_composite(*dp, *sp, a, background->red); + + png_composite(*(dp + 1), *(sp + 1), a, + background->green); + + png_composite(*(dp + 2), *(sp + 2), a, + background->blue); + } + } + } + } + else /* if (row_info->bit_depth == 16) */ + { +#ifdef PNG_READ_GAMMA_SUPPORTED + if (gamma_16 != NULL && gamma_16_from_1 != NULL && + gamma_16_to_1 != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 8, dp += 6) + { + png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) + << 8) + (png_uint_16)(*(sp + 7))); + + if (a == (png_uint_16)0xffff) + { + png_uint_16 v; + + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + + v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; + *(dp + 2) = (png_byte)((v >> 8) & 0xff); + *(dp + 3) = (png_byte)(v & 0xff); + + v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; + *(dp + 4) = (png_byte)((v >> 8) & 0xff); + *(dp + 5) = (png_byte)(v & 0xff); + } + + else if (a == 0) + { + /* Background is already in screen gamma */ + *dp = (png_byte)((background->red >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->red & 0xff); + *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(dp + 3) = (png_byte)(background->green & 0xff); + *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(dp + 5) = (png_byte)(background->blue & 0xff); + } + + else + { + png_uint_16 v, w, x; + + v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; + png_composite_16(w, v, a, background_1->red); + + x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + *dp = (png_byte)((x >> 8) & 0xff); + *(dp + 1) = (png_byte)(x & 0xff); + + v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; + png_composite_16(w, v, a, background_1->green); + + x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + *(dp + 2) = (png_byte)((x >> 8) & 0xff); + *(dp + 3) = (png_byte)(x & 0xff); + + v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; + png_composite_16(w, v, a, background_1->blue); + + x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8]; + *(dp + 4) = (png_byte)((x >> 8) & 0xff); + *(dp + 5) = (png_byte)(x & 0xff); + } + } + } + + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 8, dp += 6) + { + png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) + << 8) + (png_uint_16)(*(sp + 7))); + + if (a == (png_uint_16)0xffff) + { + png_memcpy(dp, sp, 6); + } + + else if (a == 0) + { + *dp = (png_byte)((background->red >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->red & 0xff); + *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(dp + 3) = (png_byte)(background->green & 0xff); + *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(dp + 5) = (png_byte)(background->blue & 0xff); + } + + else + { + png_uint_16 v; + + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) + + *(sp + 5)); + + png_composite_16(v, r, a, background->red); + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + + png_composite_16(v, g, a, background->green); + *(dp + 2) = (png_byte)((v >> 8) & 0xff); + *(dp + 3) = (png_byte)(v & 0xff); + + png_composite_16(v, b, a, background->blue); + *(dp + 4) = (png_byte)((v >> 8) & 0xff); + *(dp + 5) = (png_byte)(v & 0xff); + } + } + } + } + break; + } + + default: + break; + } + + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + { + row_info->color_type = (png_byte)(row_info->color_type & + ~PNG_COLOR_MASK_ALPHA); + row_info->channels--; + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + } +} +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* Gamma correct the image, avoiding the alpha channel. Make sure + * you do this after you deal with the transparency issue on grayscale + * or RGB images. If your bit depth is 8, use gamma_table, if it + * is 16, use gamma_16_table and gamma_shift. Build these with + * build_gamma_table(). + */ +void /* PRIVATE */ +png_do_gamma(png_row_infop row_info, png_bytep row, + png_const_bytep gamma_table, png_const_uint_16pp gamma_16_table, + int gamma_shift) +{ + png_bytep sp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_gamma"); + + if (((row_info->bit_depth <= 8 && gamma_table != NULL) || + (row_info->bit_depth == 16 && gamma_16_table != NULL))) + { + switch (row_info->color_type) + { + case PNG_COLOR_TYPE_RGB: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + } + } + + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v; + + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + } + } + break; + } + + case PNG_COLOR_TYPE_RGB_ALPHA: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + + *sp = gamma_table[*sp]; + sp++; + + *sp = gamma_table[*sp]; + sp++; + + sp++; + } + } + + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 4; + } + } + break; + } + + case PNG_COLOR_TYPE_GRAY_ALPHA: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp += 2; + } + } + + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 4; + } + } + break; + } + + case PNG_COLOR_TYPE_GRAY: + { + if (row_info->bit_depth == 2) + { + sp = row; + for (i = 0; i < row_width; i += 4) + { + int a = *sp & 0xc0; + int b = *sp & 0x30; + int c = *sp & 0x0c; + int d = *sp & 0x03; + + *sp = (png_byte)( + ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)]) ) & 0xc0)| + ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)| + ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)| + ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) )); + sp++; + } + } + + if (row_info->bit_depth == 4) + { + sp = row; + for (i = 0; i < row_width; i += 2) + { + int msb = *sp & 0xf0; + int lsb = *sp & 0x0f; + + *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0) + | (((int)gamma_table[(lsb << 4) | lsb]) >> 4)); + sp++; + } + } + + else if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + } + } + + else if (row_info->bit_depth == 16) + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + } + } + break; + } + + default: + break; + } + } +} +#endif + +#ifdef PNG_READ_EXPAND_SUPPORTED +/* Expands a palette row to an RGB or RGBA row depending + * upon whether you supply trans and num_trans. + */ +void /* PRIVATE */ +png_do_expand_palette(png_row_infop row_info, png_bytep row, + png_const_colorp palette, png_const_bytep trans_alpha, int num_trans) +{ + int shift, value; + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_expand_palette"); + + if (row_info->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (row_info->bit_depth < 8) + { + switch (row_info->bit_depth) + { + case 1: + { + sp = row + (png_size_t)((row_width - 1) >> 3); + dp = row + (png_size_t)row_width - 1; + shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + if ((*sp >> shift) & 0x01) + *dp = 1; + + else + *dp = 0; + + if (shift == 7) + { + shift = 0; + sp--; + } + + else + shift++; + + dp--; + } + break; + } + + case 2: + { + sp = row + (png_size_t)((row_width - 1) >> 2); + dp = row + (png_size_t)row_width - 1; + shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x03; + *dp = (png_byte)value; + if (shift == 6) + { + shift = 0; + sp--; + } + + else + shift += 2; + + dp--; + } + break; + } + + case 4: + { + sp = row + (png_size_t)((row_width - 1) >> 1); + dp = row + (png_size_t)row_width - 1; + shift = (int)((row_width & 0x01) << 2); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x0f; + *dp = (png_byte)value; + if (shift == 4) + { + shift = 0; + sp--; + } + + else + shift += 4; + + dp--; + } + break; + } + + default: + break; + } + row_info->bit_depth = 8; + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + + if (row_info->bit_depth == 8) + { + { + if (trans_alpha != NULL) + { + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width << 2) - 1; + + for (i = 0; i < row_width; i++) + { + if ((int)(*sp) >= num_trans) + *dp-- = 0xff; + + else + *dp-- = trans_alpha[*sp]; + + *dp-- = palette[*sp].blue; + *dp-- = palette[*sp].green; + *dp-- = palette[*sp].red; + sp--; + } + row_info->bit_depth = 8; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + row_info->color_type = 6; + row_info->channels = 4; + } + + else + { + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width * 3) - 1; + + for (i = 0; i < row_width; i++) + { + *dp-- = palette[*sp].blue; + *dp-- = palette[*sp].green; + *dp-- = palette[*sp].red; + sp--; + } + + row_info->bit_depth = 8; + row_info->pixel_depth = 24; + row_info->rowbytes = row_width * 3; + row_info->color_type = 2; + row_info->channels = 3; + } + } + } + } +} + +/* If the bit depth < 8, it is expanded to 8. Also, if the already + * expanded transparency value is supplied, an alpha channel is built. + */ +void /* PRIVATE */ +png_do_expand(png_row_infop row_info, png_bytep row, + png_const_color_16p trans_value) +{ + int shift, value; + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_expand"); + + { + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0); + + if (row_info->bit_depth < 8) + { + switch (row_info->bit_depth) + { + case 1: + { + gray = (png_uint_16)((gray & 0x01) * 0xff); + sp = row + (png_size_t)((row_width - 1) >> 3); + dp = row + (png_size_t)row_width - 1; + shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + if ((*sp >> shift) & 0x01) + *dp = 0xff; + + else + *dp = 0; + + if (shift == 7) + { + shift = 0; + sp--; + } + + else + shift++; + + dp--; + } + break; + } + + case 2: + { + gray = (png_uint_16)((gray & 0x03) * 0x55); + sp = row + (png_size_t)((row_width - 1) >> 2); + dp = row + (png_size_t)row_width - 1; + shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x03; + *dp = (png_byte)(value | (value << 2) | (value << 4) | + (value << 6)); + if (shift == 6) + { + shift = 0; + sp--; + } + + else + shift += 2; + + dp--; + } + break; + } + + case 4: + { + gray = (png_uint_16)((gray & 0x0f) * 0x11); + sp = row + (png_size_t)((row_width - 1) >> 1); + dp = row + (png_size_t)row_width - 1; + shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x0f; + *dp = (png_byte)(value | (value << 4)); + if (shift == 4) + { + shift = 0; + sp--; + } + + else + shift = 4; + + dp--; + } + break; + } + + default: + break; + } + + row_info->bit_depth = 8; + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + + if (trans_value != NULL) + { + if (row_info->bit_depth == 8) + { + gray = gray & 0xff; + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width << 1) - 1; + + for (i = 0; i < row_width; i++) + { + if (*sp == gray) + *dp-- = 0; + + else + *dp-- = 0xff; + + *dp-- = *sp--; + } + } + + else if (row_info->bit_depth == 16) + { + png_byte gray_high = (png_byte)((gray >> 8) & 0xff); + png_byte gray_low = (png_byte)(gray & 0xff); + sp = row + row_info->rowbytes - 1; + dp = row + (row_info->rowbytes << 1) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 1) == gray_high && *(sp) == gray_low) + { + *dp-- = 0; + *dp-- = 0; + } + + else + { + *dp-- = 0xff; + *dp-- = 0xff; + } + + *dp-- = *sp--; + *dp-- = *sp--; + } + } + + row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; + row_info->channels = 2; + row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, + row_width); + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_value) + { + if (row_info->bit_depth == 8) + { + png_byte red = (png_byte)(trans_value->red & 0xff); + png_byte green = (png_byte)(trans_value->green & 0xff); + png_byte blue = (png_byte)(trans_value->blue & 0xff); + sp = row + (png_size_t)row_info->rowbytes - 1; + dp = row + (png_size_t)(row_width << 2) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue) + *dp-- = 0; + + else + *dp-- = 0xff; + + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + } + } + else if (row_info->bit_depth == 16) + { + png_byte red_high = (png_byte)((trans_value->red >> 8) & 0xff); + png_byte green_high = (png_byte)((trans_value->green >> 8) & 0xff); + png_byte blue_high = (png_byte)((trans_value->blue >> 8) & 0xff); + png_byte red_low = (png_byte)(trans_value->red & 0xff); + png_byte green_low = (png_byte)(trans_value->green & 0xff); + png_byte blue_low = (png_byte)(trans_value->blue & 0xff); + sp = row + row_info->rowbytes - 1; + dp = row + (png_size_t)(row_width << 3) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 5) == red_high && + *(sp - 4) == red_low && + *(sp - 3) == green_high && + *(sp - 2) == green_low && + *(sp - 1) == blue_high && + *(sp ) == blue_low) + { + *dp-- = 0; + *dp-- = 0; + } + + else + { + *dp-- = 0xff; + *dp-- = 0xff; + } + + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + } + } + row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + row_info->channels = 4; + row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + } +} +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +void /* PRIVATE */ +png_do_quantize(png_row_infop row_info, png_bytep row, + png_const_bytep palette_lookup, png_const_bytep quantize_lookup) +{ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_quantize"); + + if (row_info->bit_depth == 8) + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB && palette_lookup) + { + int r, g, b, p; + sp = row; + dp = row; + for (i = 0; i < row_width; i++) + { + r = *sp++; + g = *sp++; + b = *sp++; + + /* This looks real messy, but the compiler will reduce + * it down to a reasonable formula. For example, with + * 5 bits per color, we get: + * p = (((r >> 3) & 0x1f) << 10) | + * (((g >> 3) & 0x1f) << 5) | + * ((b >> 3) & 0x1f); + */ + p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) & + ((1 << PNG_QUANTIZE_RED_BITS) - 1)) << + (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) | + (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) & + ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) << + (PNG_QUANTIZE_BLUE_BITS)) | + ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) & + ((1 << PNG_QUANTIZE_BLUE_BITS) - 1)); + + *dp++ = palette_lookup[p]; + } + + row_info->color_type = PNG_COLOR_TYPE_PALETTE; + row_info->channels = 1; + row_info->pixel_depth = row_info->bit_depth; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && + palette_lookup != NULL) + { + int r, g, b, p; + sp = row; + dp = row; + for (i = 0; i < row_width; i++) + { + r = *sp++; + g = *sp++; + b = *sp++; + sp++; + + p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) & + ((1 << PNG_QUANTIZE_RED_BITS) - 1)) << + (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) | + (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) & + ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) << + (PNG_QUANTIZE_BLUE_BITS)) | + ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) & + ((1 << PNG_QUANTIZE_BLUE_BITS) - 1)); + + *dp++ = palette_lookup[p]; + } + + row_info->color_type = PNG_COLOR_TYPE_PALETTE; + row_info->channels = 1; + row_info->pixel_depth = row_info->bit_depth; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + + else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && + quantize_lookup) + { + sp = row; + + for (i = 0; i < row_width; i++, sp++) + { + *sp = quantize_lookup[*sp]; + } + } + } +} +#endif /* PNG_READ_QUANTIZE_SUPPORTED */ + +#ifdef PNG_MNG_FEATURES_SUPPORTED +/* Undoes intrapixel differencing */ +void /* PRIVATE */ +png_do_read_intrapixel(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_read_intrapixel"); + + if ( + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + int bytes_per_pixel; + png_uint_32 row_width = row_info->width; + + if (row_info->bit_depth == 8) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 3; + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 4; + + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + *(rp) = (png_byte)((256 + *rp + *(rp + 1)) & 0xff); + *(rp+2) = (png_byte)((256 + *(rp + 2) + *(rp + 1)) & 0xff); + } + } + else if (row_info->bit_depth == 16) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 6; + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 8; + + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1); + png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3); + png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5); + png_uint_32 red = (png_uint_32)((s0 + s1 + 65536L) & 0xffffL); + png_uint_32 blue = (png_uint_32)((s2 + s1 + 65536L) & 0xffffL); + *(rp ) = (png_byte)((red >> 8) & 0xff); + *(rp + 1) = (png_byte)(red & 0xff); + *(rp + 4) = (png_byte)((blue >> 8) & 0xff); + *(rp + 5) = (png_byte)(blue & 0xff); + } + } + } +} +#endif /* PNG_MNG_FEATURES_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngrutil.c b/src/3rdparty/libpng/pngrutil.c new file mode 100644 index 0000000000..4c3cd53813 --- /dev/null +++ b/src/3rdparty/libpng/pngrutil.c @@ -0,0 +1,3616 @@ + +/* pngrutil.c - utilities to read a PNG file + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file contains routines that are only called from within + * libpng itself during the course of reading an image. + */ + +#include "pngpriv.h" + +#ifdef PNG_READ_SUPPORTED + +#define png_strtod(p,a,b) strtod(a,b) + +png_uint_32 PNGAPI +png_get_uint_31(png_structp png_ptr, png_const_bytep buf) +{ + png_uint_32 uval = png_get_uint_32(buf); + + if (uval > PNG_UINT_31_MAX) + png_error(png_ptr, "PNG unsigned integer out of range"); + + return (uval); +} + +#if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_READ_cHRM_SUPPORTED) +/* The following is a variation on the above for use with the fixed + * point values used for gAMA and cHRM. Instead of png_error it + * issues a warning and returns (-1) - an invalid value because both + * gAMA and cHRM use *unsigned* integers for fixed point values. + */ +#define PNG_FIXED_ERROR (-1) + +static png_fixed_point /* PRIVATE */ +png_get_fixed_point(png_structp png_ptr, png_const_bytep buf) +{ + png_uint_32 uval = png_get_uint_32(buf); + + if (uval <= PNG_UINT_31_MAX) + return (png_fixed_point)uval; /* known to be in range */ + + /* The caller can turn off the warning by passing NULL. */ + if (png_ptr != NULL) + png_warning(png_ptr, "PNG fixed point integer out of range"); + + return PNG_FIXED_ERROR; +} +#endif + +#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED +/* NOTE: the read macros will obscure these definitions, so that if + * PNG_USE_READ_MACROS is set the library will not use them internally, + * but the APIs will still be available externally. + * + * The parentheses around "PNGAPI function_name" in the following three + * functions are necessary because they allow the macros to co-exist with + * these (unused but exported) functions. + */ + +/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ +png_uint_32 (PNGAPI +png_get_uint_32)(png_const_bytep buf) +{ + png_uint_32 uval = + ((png_uint_32)(*(buf )) << 24) + + ((png_uint_32)(*(buf + 1)) << 16) + + ((png_uint_32)(*(buf + 2)) << 8) + + ((png_uint_32)(*(buf + 3)) ) ; + + return uval; +} + +/* Grab a signed 32-bit integer from a buffer in big-endian format. The + * data is stored in the PNG file in two's complement format and there + * is no guarantee that a 'png_int_32' is exactly 32 bits, therefore + * the following code does a two's complement to native conversion. + */ +png_int_32 (PNGAPI +png_get_int_32)(png_const_bytep buf) +{ + png_uint_32 uval = png_get_uint_32(buf); + if ((uval & 0x80000000L) == 0) /* non-negative */ + return uval; + + uval = (uval ^ 0xffffffffL) + 1; /* 2's complement: -x = ~x+1 */ + return -(png_int_32)uval; +} + +/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ +png_uint_16 (PNGAPI +png_get_uint_16)(png_const_bytep buf) +{ + /* ANSI-C requires an int value to accomodate at least 16 bits so this + * works and allows the compiler not to worry about possible narrowing + * on 32 bit systems. (Pre-ANSI systems did not make integers smaller + * than 16 bits either.) + */ + unsigned int val = + ((unsigned int)(*buf) << 8) + + ((unsigned int)(*(buf + 1))); + + return (png_uint_16)val; +} + +#endif /* PNG_READ_INT_FUNCTIONS_SUPPORTED */ + +/* Read and check the PNG file signature */ +void /* PRIVATE */ +png_read_sig(png_structp png_ptr, png_infop info_ptr) +{ + png_size_t num_checked, num_to_check; + + /* Exit if the user application does not expect a signature. */ + if (png_ptr->sig_bytes >= 8) + return; + + num_checked = png_ptr->sig_bytes; + num_to_check = 8 - num_checked; + +#ifdef PNG_IO_STATE_SUPPORTED + png_ptr->io_state = PNG_IO_READING | PNG_IO_SIGNATURE; +#endif + + /* The signature must be serialized in a single I/O call. */ + png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); + png_ptr->sig_bytes = 8; + + if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) + { + if (num_checked < 4 && + png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) + png_error(png_ptr, "Not a PNG file"); + else + png_error(png_ptr, "PNG file corrupted by ASCII conversion"); + } + if (num_checked < 3) + png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; +} + +/* Read the chunk header (length + type name). + * Put the type name into png_ptr->chunk_name, and return the length. + */ +png_uint_32 /* PRIVATE */ +png_read_chunk_header(png_structp png_ptr) +{ + png_byte buf[8]; + png_uint_32 length; + +#ifdef PNG_IO_STATE_SUPPORTED + png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_HDR; +#endif + + /* Read the length and the chunk name. + * This must be performed in a single I/O call. + */ + png_read_data(png_ptr, buf, 8); + length = png_get_uint_31(png_ptr, buf); + + /* Put the chunk name into png_ptr->chunk_name. */ + png_memcpy(png_ptr->chunk_name, buf + 4, 4); + + png_debug2(0, "Reading %s chunk, length = %u", + png_ptr->chunk_name, length); + + /* Reset the crc and run it over the chunk name. */ + png_reset_crc(png_ptr); + png_calculate_crc(png_ptr, png_ptr->chunk_name, 4); + + /* Check to see if chunk name is valid. */ + png_check_chunk_name(png_ptr, png_ptr->chunk_name); + +#ifdef PNG_IO_STATE_SUPPORTED + png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_DATA; +#endif + + return length; +} + +/* Read data, and (optionally) run it through the CRC. */ +void /* PRIVATE */ +png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length) +{ + if (png_ptr == NULL) + return; + + png_read_data(png_ptr, buf, length); + png_calculate_crc(png_ptr, buf, length); +} + +/* Optionally skip data and then check the CRC. Depending on whether we + * are reading a ancillary or critical chunk, and how the program has set + * things up, we may calculate the CRC on the data and print a message. + * Returns '1' if there was a CRC error, '0' otherwise. + */ +int /* PRIVATE */ +png_crc_finish(png_structp png_ptr, png_uint_32 skip) +{ + png_size_t i; + png_size_t istop = png_ptr->zbuf_size; + + for (i = (png_size_t)skip; i > istop; i -= istop) + { + png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); + } + + if (i) + { + png_crc_read(png_ptr, png_ptr->zbuf, i); + } + + if (png_crc_error(png_ptr)) + { + if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */ + !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) || + (!(png_ptr->chunk_name[0] & 0x20) && /* Critical */ + (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE))) + { + png_chunk_warning(png_ptr, "CRC error"); + } + + else + { + png_chunk_benign_error(png_ptr, "CRC error"); + return (0); + } + + return (1); + } + + return (0); +} + +/* Compare the CRC stored in the PNG file with that calculated by libpng from + * the data it has read thus far. + */ +int /* PRIVATE */ +png_crc_error(png_structp png_ptr) +{ + png_byte crc_bytes[4]; + png_uint_32 crc; + int need_crc = 1; + + if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ + { + if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == + (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) + need_crc = 0; + } + + else /* critical */ + { + if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) + need_crc = 0; + } + +#ifdef PNG_IO_STATE_SUPPORTED + png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_CRC; +#endif + + /* The chunk CRC must be serialized in a single I/O call. */ + png_read_data(png_ptr, crc_bytes, 4); + + if (need_crc) + { + crc = png_get_uint_32(crc_bytes); + return ((int)(crc != png_ptr->crc)); + } + + else + return (0); +} + +#if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \ + defined(PNG_READ_iCCP_SUPPORTED) +static png_size_t +png_inflate(png_structp png_ptr, png_bytep data, png_size_t size, + png_bytep output, png_size_t output_size) +{ + png_size_t count = 0; + + /* zlib can't necessarily handle more than 65535 bytes at once (i.e. it can't + * even necessarily handle 65536 bytes) because the type uInt is "16 bits or + * more". Consequently it is necessary to chunk the input to zlib. This + * code uses ZLIB_IO_MAX, from pngpriv.h, as the maximum (the maximum value + * that can be stored in a uInt.) It is possible to set ZLIB_IO_MAX to a + * lower value in pngpriv.h and this may sometimes have a performance + * advantage, because it forces access of the input data to be separated from + * at least some of the use by some period of time. + */ + png_ptr->zstream.next_in = data; + /* avail_in is set below from 'size' */ + png_ptr->zstream.avail_in = 0; + + while (1) + { + int ret, avail; + + /* The setting of 'avail_in' used to be outside the loop, by setting it + * inside it is possible to chunk the input to zlib and simply rely on + * zlib to advance the 'next_in' pointer. This allows arbitrary amounts o + * data to be passed through zlib at the unavoidable cost of requiring a + * window save (memcpy of up to 32768 output bytes) every ZLIB_IO_MAX + * input bytes. + */ + if (png_ptr->zstream.avail_in == 0 && size > 0) + { + if (size <= ZLIB_IO_MAX) + { + /* The value is less than ZLIB_IO_MAX so the cast is safe: */ + png_ptr->zstream.avail_in = (uInt)size; + size = 0; + } + + else + { + png_ptr->zstream.avail_in = ZLIB_IO_MAX; + size -= ZLIB_IO_MAX; + } + } + + /* Reset the output buffer each time round - we empty it + * after every inflate call. + */ + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = png_ptr->zbuf_size; + + ret = inflate(&png_ptr->zstream, Z_NO_FLUSH); + avail = png_ptr->zbuf_size - png_ptr->zstream.avail_out; + + /* First copy/count any new output - but only if we didn't + * get an error code. + */ + if ((ret == Z_OK || ret == Z_STREAM_END) && avail > 0) + { + png_size_t space = avail; /* > 0, see above */ + + if (output != 0 && output_size > count) + { + png_size_t copy = output_size - count; + + if (space < copy) + copy = space; + + png_memcpy(output + count, png_ptr->zbuf, copy); + } + count += space; + } + + if (ret == Z_OK) + continue; + + /* Termination conditions - always reset the zstream, it + * must be left in inflateInit state. + */ + png_ptr->zstream.avail_in = 0; + inflateReset(&png_ptr->zstream); + + if (ret == Z_STREAM_END) + return count; /* NOTE: may be zero. */ + + /* Now handle the error codes - the API always returns 0 + * and the error message is dumped into the uncompressed + * buffer if available. + */ + { + PNG_CONST char *msg; +#ifdef PNG_CONSOLE_IO_SUPPORTED + char umsg[52]; +#endif + if (png_ptr->zstream.msg != 0) + msg = png_ptr->zstream.msg; + + else + { +#ifdef PNG_CONSOLE_IO_SUPPORTED + switch (ret) + { + case Z_BUF_ERROR: + msg = "Buffer error in compressed datastream in %s chunk"; + break; + + case Z_DATA_ERROR: + msg = "Data error in compressed datastream in %s chunk"; + break; + + default: + msg = "Incomplete compressed datastream in %s chunk"; + break; + } + + png_snprintf(umsg, sizeof umsg, msg, png_ptr->chunk_name); + msg = umsg; +#else + msg = "Damaged compressed datastream in chunk other than IDAT"; +#endif + } + + png_warning(png_ptr, msg); + } + + /* 0 means an error - notice that this code simply ignores + * zero length compressed chunks as a result. + */ + return 0; + } +} + +/* + * Decompress trailing data in a chunk. The assumption is that chunkdata + * points at an allocated area holding the contents of a chunk with a + * trailing compressed part. What we get back is an allocated area + * holding the original prefix part and an uncompressed version of the + * trailing part (the malloc area passed in is freed). + */ +void /* PRIVATE */ +png_decompress_chunk(png_structp png_ptr, int comp_type, + png_size_t chunklength, + png_size_t prefix_size, png_size_t *newlength) +{ + /* The caller should guarantee this */ + if (prefix_size > chunklength) + { + /* The recovery is to delete the chunk. */ + png_warning(png_ptr, "invalid chunklength"); + prefix_size = 0; /* To delete everything */ + } + + else if (comp_type == PNG_COMPRESSION_TYPE_BASE) + { + png_size_t expanded_size = png_inflate(png_ptr, + (png_bytep)(png_ptr->chunkdata + prefix_size), + chunklength - prefix_size, + 0, /*output*/ + 0); /*output size*/ + + /* Now check the limits on this chunk - if the limit fails the + * compressed data will be removed, the prefix will remain. + */ +#ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED + if (png_ptr->user_chunk_malloc_max && + (prefix_size + expanded_size >= png_ptr->user_chunk_malloc_max - 1)) +#else +# ifdef PNG_USER_CHUNK_MALLOC_MAX + if ((PNG_USER_CHUNK_MALLOC_MAX > 0) && + prefix_size + expanded_size >= PNG_USER_CHUNK_MALLOC_MAX - 1) +# endif +#endif + png_warning(png_ptr, "Exceeded size limit while expanding chunk"); + + /* If the size is zero either there was an error and a message + * has already been output (warning) or the size really is zero + * and we have nothing to do - the code will exit through the + * error case below. + */ +#if defined(PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED) || \ + defined(PNG_USER_CHUNK_MALLOC_MAX) + else if (expanded_size > 0) +#else + if (expanded_size > 0) +#endif + { + /* Success (maybe) - really uncompress the chunk. */ + png_size_t new_size = 0; + png_charp text = png_malloc_warn(png_ptr, + prefix_size + expanded_size + 1); + + if (text != NULL) + { + png_memcpy(text, png_ptr->chunkdata, prefix_size); + new_size = png_inflate(png_ptr, + (png_bytep)(png_ptr->chunkdata + prefix_size), + chunklength - prefix_size, + (png_bytep)(text + prefix_size), expanded_size); + text[prefix_size + expanded_size] = 0; /* just in case */ + + if (new_size == expanded_size) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = text; + *newlength = prefix_size + expanded_size; + return; /* The success return! */ + } + + png_warning(png_ptr, "png_inflate logic error"); + png_free(png_ptr, text); + } + + else + png_warning(png_ptr, "Not enough memory to decompress chunk"); + } + } + + else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */ + { +#ifdef PNG_STDIO_SUPPORTED + char umsg[50]; + + png_snprintf(umsg, sizeof umsg, + "Unknown zTXt compression type %d", comp_type); + png_warning(png_ptr, umsg); +#else + png_warning(png_ptr, "Unknown zTXt compression type"); +#endif + + /* The recovery is to simply drop the data. */ + } + + /* Generic error return - leave the prefix, delete the compressed + * data, reallocate the chunkdata to remove the potentially large + * amount of compressed data. + */ + { + png_charp text = png_malloc_warn(png_ptr, prefix_size + 1); + + if (text != NULL) + { + if (prefix_size > 0) + png_memcpy(text, png_ptr->chunkdata, prefix_size); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = text; + + /* This is an extra zero in the 'uncompressed' part. */ + *(png_ptr->chunkdata + prefix_size) = 0x00; + } + /* Ignore a malloc error here - it is safe. */ + } + + *newlength = prefix_size; +} +#endif + +/* Read and check the IDHR chunk */ +void /* PRIVATE */ +png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[13]; + png_uint_32 width, height; + int bit_depth, color_type, compression_type, filter_type; + int interlace_type; + + png_debug(1, "in png_handle_IHDR"); + + if (png_ptr->mode & PNG_HAVE_IHDR) + png_error(png_ptr, "Out of place IHDR"); + + /* Check the length */ + if (length != 13) + png_error(png_ptr, "Invalid IHDR chunk"); + + png_ptr->mode |= PNG_HAVE_IHDR; + + png_crc_read(png_ptr, buf, 13); + png_crc_finish(png_ptr, 0); + + width = png_get_uint_31(png_ptr, buf); + height = png_get_uint_31(png_ptr, buf + 4); + bit_depth = buf[8]; + color_type = buf[9]; + compression_type = buf[10]; + filter_type = buf[11]; + interlace_type = buf[12]; + + /* Set internal variables */ + png_ptr->width = width; + png_ptr->height = height; + png_ptr->bit_depth = (png_byte)bit_depth; + png_ptr->interlaced = (png_byte)interlace_type; + png_ptr->color_type = (png_byte)color_type; +#ifdef PNG_MNG_FEATURES_SUPPORTED + png_ptr->filter_type = (png_byte)filter_type; +#endif + png_ptr->compression_type = (png_byte)compression_type; + + /* Find number of channels */ + switch (png_ptr->color_type) + { + default: /* invalid, png_set_IHDR calls png_error */ + case PNG_COLOR_TYPE_GRAY: + case PNG_COLOR_TYPE_PALETTE: + png_ptr->channels = 1; + break; + + case PNG_COLOR_TYPE_RGB: + png_ptr->channels = 3; + break; + + case PNG_COLOR_TYPE_GRAY_ALPHA: + png_ptr->channels = 2; + break; + + case PNG_COLOR_TYPE_RGB_ALPHA: + png_ptr->channels = 4; + break; + } + + /* Set up other useful info */ + png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * + png_ptr->channels); + png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width); + png_debug1(3, "bit_depth = %d", png_ptr->bit_depth); + png_debug1(3, "channels = %d", png_ptr->channels); + png_debug1(3, "rowbytes = %lu", (unsigned long)png_ptr->rowbytes); + png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, + color_type, interlace_type, compression_type, filter_type); +} + +/* Read and check the palette */ +void /* PRIVATE */ +png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_color palette[PNG_MAX_PALETTE_LENGTH]; + int num, i; +#ifdef PNG_POINTER_INDEXING_SUPPORTED + png_colorp pal_ptr; +#endif + + png_debug(1, "in png_handle_PLTE"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before PLTE"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid PLTE after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (png_ptr->mode & PNG_HAVE_PLTE) + png_error(png_ptr, "Duplicate PLTE chunk"); + + png_ptr->mode |= PNG_HAVE_PLTE; + + if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) + { + png_warning(png_ptr, + "Ignoring PLTE chunk in grayscale PNG"); + png_crc_finish(png_ptr, length); + return; + } + +#ifndef PNG_READ_OPT_PLTE_SUPPORTED + if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) + { + png_crc_finish(png_ptr, length); + return; + } +#endif + + if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3) + { + if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) + { + png_warning(png_ptr, "Invalid palette chunk"); + png_crc_finish(png_ptr, length); + return; + } + + else + { + png_error(png_ptr, "Invalid palette chunk"); + } + } + + num = (int)length / 3; + +#ifdef PNG_POINTER_INDEXING_SUPPORTED + for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++) + { + png_byte buf[3]; + + png_crc_read(png_ptr, buf, 3); + pal_ptr->red = buf[0]; + pal_ptr->green = buf[1]; + pal_ptr->blue = buf[2]; + } +#else + for (i = 0; i < num; i++) + { + png_byte buf[3]; + + png_crc_read(png_ptr, buf, 3); + /* Don't depend upon png_color being any order */ + palette[i].red = buf[0]; + palette[i].green = buf[1]; + palette[i].blue = buf[2]; + } +#endif + + /* If we actually need the PLTE chunk (ie for a paletted image), we do + * whatever the normal CRC configuration tells us. However, if we + * have an RGB image, the PLTE can be considered ancillary, so + * we will act as though it is. + */ +#ifndef PNG_READ_OPT_PLTE_SUPPORTED + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) +#endif + { + png_crc_finish(png_ptr, 0); + } + +#ifndef PNG_READ_OPT_PLTE_SUPPORTED + else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */ + { + /* If we don't want to use the data from an ancillary chunk, + * we have two options: an error abort, or a warning and we + * ignore the data in this chunk (which should be OK, since + * it's considered ancillary for a RGB or RGBA image). + */ + if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) + { + if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) + { + png_chunk_benign_error(png_ptr, "CRC error"); + } + + else + { + png_chunk_warning(png_ptr, "CRC error"); + return; + } + } + + /* Otherwise, we (optionally) emit a warning and use the chunk. */ + else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) + { + png_chunk_warning(png_ptr, "CRC error"); + } + } +#endif + + png_set_PLTE(png_ptr, info_ptr, palette, num); + +#ifdef PNG_READ_tRNS_SUPPORTED + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + if (png_ptr->num_trans > (png_uint_16)num) + { + png_warning(png_ptr, "Truncating incorrect tRNS chunk length"); + png_ptr->num_trans = (png_uint_16)num; + } + + if (info_ptr->num_trans > (png_uint_16)num) + { + png_warning(png_ptr, "Truncating incorrect info tRNS chunk length"); + info_ptr->num_trans = (png_uint_16)num; + } + } + } +#endif + +} + +void /* PRIVATE */ +png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_debug(1, "in png_handle_IEND"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT)) + { + png_error(png_ptr, "No image in file"); + } + + png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND); + + if (length != 0) + { + png_warning(png_ptr, "Incorrect IEND chunk length"); + } + + png_crc_finish(png_ptr, length); + + PNG_UNUSED(info_ptr) /* Quiet compiler warnings about unused info_ptr */ +} + +#ifdef PNG_READ_gAMA_SUPPORTED +void /* PRIVATE */ +png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_fixed_point igamma; + png_byte buf[4]; + + png_debug(1, "in png_handle_gAMA"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before gAMA"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid gAMA after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place gAMA chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) +#ifdef PNG_READ_sRGB_SUPPORTED + && !(info_ptr->valid & PNG_INFO_sRGB) +#endif + ) + { + png_warning(png_ptr, "Duplicate gAMA chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 4) + { + png_warning(png_ptr, "Incorrect gAMA chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 4); + + if (png_crc_finish(png_ptr, 0)) + return; + + igamma = png_get_fixed_point(NULL, buf); + + /* Check for zero gamma or an error. */ + if (igamma <= 0) + { + png_warning(png_ptr, + "Ignoring gAMA chunk with out of range gamma"); + + return; + } + +# ifdef PNG_READ_sRGB_SUPPORTED + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) + { + if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) + { + png_warning(png_ptr, + "Ignoring incorrect gAMA value when sRGB is also present"); + +# ifdef PNG_CONSOLE_IO_SUPPORTED + fprintf(stderr, "gamma = (%d/100000)", (int)igamma); +# endif + return; + } + } +# endif /* PNG_READ_sRGB_SUPPORTED */ + +# ifdef PNG_READ_GAMMA_SUPPORTED + /* Gamma correction on read is supported. */ + png_ptr->gamma = igamma; +# endif + /* And set the 'info' structure members. */ + png_set_gAMA_fixed(png_ptr, info_ptr, igamma); +} +#endif + +#ifdef PNG_READ_sBIT_SUPPORTED +void /* PRIVATE */ +png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_size_t truelen; + png_byte buf[4]; + + png_debug(1, "in png_handle_sBIT"); + + buf[0] = buf[1] = buf[2] = buf[3] = 0; + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sBIT"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sBIT after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (png_ptr->mode & PNG_HAVE_PLTE) + { + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place sBIT chunk"); + } + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) + { + png_warning(png_ptr, "Duplicate sBIT chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + truelen = 3; + + else + truelen = (png_size_t)png_ptr->channels; + + if (length != truelen || length > 4) + { + png_warning(png_ptr, "Incorrect sBIT chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, truelen); + + if (png_crc_finish(png_ptr, 0)) + return; + + if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + { + png_ptr->sig_bit.red = buf[0]; + png_ptr->sig_bit.green = buf[1]; + png_ptr->sig_bit.blue = buf[2]; + png_ptr->sig_bit.alpha = buf[3]; + } + + else + { + png_ptr->sig_bit.gray = buf[0]; + png_ptr->sig_bit.red = buf[0]; + png_ptr->sig_bit.green = buf[0]; + png_ptr->sig_bit.blue = buf[0]; + png_ptr->sig_bit.alpha = buf[1]; + } + + png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit)); +} +#endif + +#ifdef PNG_READ_cHRM_SUPPORTED +void /* PRIVATE */ +png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[32]; + png_fixed_point x_white, y_white, x_red, y_red, x_green, y_green, x_blue, + y_blue; + + png_debug(1, "in png_handle_cHRM"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before cHRM"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid cHRM after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Missing PLTE before cHRM"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM) +# ifdef PNG_READ_sRGB_SUPPORTED + && !(info_ptr->valid & PNG_INFO_sRGB) +# endif + ) + { + png_warning(png_ptr, "Duplicate cHRM chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 32) + { + png_warning(png_ptr, "Incorrect cHRM chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 32); + + if (png_crc_finish(png_ptr, 0)) + return; + + x_white = png_get_fixed_point(NULL, buf); + y_white = png_get_fixed_point(NULL, buf + 4); + x_red = png_get_fixed_point(NULL, buf + 8); + y_red = png_get_fixed_point(NULL, buf + 12); + x_green = png_get_fixed_point(NULL, buf + 16); + y_green = png_get_fixed_point(NULL, buf + 20); + x_blue = png_get_fixed_point(NULL, buf + 24); + y_blue = png_get_fixed_point(NULL, buf + 28); + + if (x_white == PNG_FIXED_ERROR || + y_white == PNG_FIXED_ERROR || + x_red == PNG_FIXED_ERROR || + y_red == PNG_FIXED_ERROR || + x_green == PNG_FIXED_ERROR || + y_green == PNG_FIXED_ERROR || + x_blue == PNG_FIXED_ERROR || + y_blue == PNG_FIXED_ERROR) + { + png_warning(png_ptr, "Ignoring cHRM chunk with negative chromaticities"); + return; + } + +#ifdef PNG_READ_sRGB_SUPPORTED + if ((info_ptr != NULL) && (info_ptr->valid & PNG_INFO_sRGB)) + { + if (PNG_OUT_OF_RANGE(x_white, 31270, 1000) || + PNG_OUT_OF_RANGE(y_white, 32900, 1000) || + PNG_OUT_OF_RANGE(x_red, 64000L, 1000) || + PNG_OUT_OF_RANGE(y_red, 33000, 1000) || + PNG_OUT_OF_RANGE(x_green, 30000, 1000) || + PNG_OUT_OF_RANGE(y_green, 60000L, 1000) || + PNG_OUT_OF_RANGE(x_blue, 15000, 1000) || + PNG_OUT_OF_RANGE(y_blue, 6000, 1000)) + { + png_warning(png_ptr, + "Ignoring incorrect cHRM value when sRGB is also present"); + +#ifdef PNG_CONSOLE_IO_SUPPORTED + fprintf(stderr, "wx=%d, wy=%d, rx=%d, ry=%d\n", + x_white, y_white, x_red, y_red); + + fprintf(stderr, "gx=%d, gy=%d, bx=%d, by=%d\n", + x_green, y_green, x_blue, y_blue); +#endif /* PNG_CONSOLE_IO_SUPPORTED */ + } + return; + } +#endif /* PNG_READ_sRGB_SUPPORTED */ + + png_set_cHRM_fixed(png_ptr, info_ptr, x_white, y_white, x_red, y_red, + x_green, y_green, x_blue, y_blue); +} +#endif + +#ifdef PNG_READ_sRGB_SUPPORTED +void /* PRIVATE */ +png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + int intent; + png_byte buf[1]; + + png_debug(1, "in png_handle_sRGB"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sRGB"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sRGB after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place sRGB chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) + { + png_warning(png_ptr, "Duplicate sRGB chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 1) + { + png_warning(png_ptr, "Incorrect sRGB chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 1); + + if (png_crc_finish(png_ptr, 0)) + return; + + intent = buf[0]; + + /* Check for bad intent */ + if (intent >= PNG_sRGB_INTENT_LAST) + { + png_warning(png_ptr, "Unknown sRGB intent"); + return; + } + +#if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)) + { + if (PNG_OUT_OF_RANGE(info_ptr->gamma, 45500L, 500)) + { + png_warning(png_ptr, + "Ignoring incorrect gAMA value when sRGB is also present"); +#ifdef PNG_CONSOLE_IO_SUPPORTED + fprintf(stderr, "incorrect gamma=(%d/100000)\n", info_ptr->gamma); +#endif + } + } +#endif /* PNG_READ_gAMA_SUPPORTED */ + +#ifdef PNG_READ_cHRM_SUPPORTED + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + if (PNG_OUT_OF_RANGE(info_ptr->x_white, 31270, 1000) || + PNG_OUT_OF_RANGE(info_ptr->y_white, 32900, 1000) || + PNG_OUT_OF_RANGE(info_ptr->x_red, 64000L, 1000) || + PNG_OUT_OF_RANGE(info_ptr->y_red, 33000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->x_green, 30000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->y_green, 60000L, 1000) || + PNG_OUT_OF_RANGE(info_ptr->x_blue, 15000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->y_blue, 6000, 1000)) + { + png_warning(png_ptr, + "Ignoring incorrect cHRM value when sRGB is also present"); + } +#endif /* PNG_READ_cHRM_SUPPORTED */ + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent); +} +#endif /* PNG_READ_sRGB_SUPPORTED */ + +#ifdef PNG_READ_iCCP_SUPPORTED +void /* PRIVATE */ +png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +/* Note: this does not properly handle chunks that are > 64K under DOS */ +{ + png_byte compression_type; + png_bytep pC; + png_charp profile; + png_uint_32 skip = 0; + png_uint_32 profile_size; + png_alloc_size_t profile_length; + png_size_t slength, prefix_length, data_length; + + png_debug(1, "in png_handle_iCCP"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before iCCP"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid iCCP after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place iCCP chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) + { + png_warning(png_ptr, "Duplicate iCCP chunk"); + png_crc_finish(png_ptr, length); + return; + } + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "iCCP chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1); + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (profile = png_ptr->chunkdata; *profile; profile++) + /* Empty loop to find end of name */ ; + + ++profile; + + /* There should be at least one zero (the compression type byte) + * following the separator, and we should be on it + */ + if (profile >= png_ptr->chunkdata + slength - 1) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "Malformed iCCP chunk"); + return; + } + + /* Compression_type should always be zero */ + compression_type = *profile++; + + if (compression_type) + { + png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); + compression_type = 0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8 + wrote nonzero) */ + } + + prefix_length = profile - png_ptr->chunkdata; + png_decompress_chunk(png_ptr, compression_type, + slength, prefix_length, &data_length); + + profile_length = data_length - prefix_length; + + if (prefix_length > data_length || profile_length < 4) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "Profile size field missing from iCCP chunk"); + return; + } + + /* Check the profile_size recorded in the first 32 bits of the ICC profile */ + pC = (png_bytep)(png_ptr->chunkdata + prefix_length); + profile_size = ((*(pC )) << 24) | + ((*(pC + 1)) << 16) | + ((*(pC + 2)) << 8) | + ((*(pC + 3)) ); + + /* NOTE: the following guarantees that 'profile_length' fits into 32 bits, + * because profile_size is a 32 bit value. + */ + if (profile_size < profile_length) + profile_length = profile_size; + + /* And the following guarantees that profile_size == profile_length. */ + if (profile_size > profile_length) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +#ifdef PNG_STDIO_SUPPORTED + { + char umsg[80]; + + png_snprintf2(umsg, 80, + "Ignoring iCCP chunk with declared size = %u " + "and actual length = %u", + (unsigned int) profile_size, + (unsigned int) profile_length); + png_warning(png_ptr, umsg); + } +#else + png_warning(png_ptr, + "Ignoring iCCP chunk with uncompressed size mismatch"); +#endif + return; + } + + png_set_iCCP(png_ptr, info_ptr, png_ptr->chunkdata, + compression_type, (png_bytep)png_ptr->chunkdata + prefix_length, + profile_size); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +} +#endif /* PNG_READ_iCCP_SUPPORTED */ + +#ifdef PNG_READ_sPLT_SUPPORTED +void /* PRIVATE */ +png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +/* Note: this does not properly handle chunks that are > 64K under DOS */ +{ + png_bytep entry_start; + png_sPLT_t new_palette; +#ifdef PNG_POINTER_INDEXING_SUPPORTED + png_sPLT_entryp pp; +#endif + png_uint_32 data_length; + int entry_size, i; + png_uint_32 skip = 0; + png_size_t slength; + png_uint_32 dl; + png_size_t max_dl; + + png_debug(1, "in png_handle_sPLT"); + +#ifdef PNG_USER_LIMITS_SUPPORTED + + if (png_ptr->user_chunk_cache_max != 0) + { + if (png_ptr->user_chunk_cache_max == 1) + { + png_crc_finish(png_ptr, length); + return; + } + + if (--png_ptr->user_chunk_cache_max == 1) + { + png_warning(png_ptr, "No space in chunk cache for sPLT"); + png_crc_finish(png_ptr, length); + return; + } + } +#endif + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sPLT"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sPLT after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "sPLT chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1); + + /* WARNING: this may break if size_t is less than 32 bits; it is assumed + * that the PNG_MAX_MALLOC_64K test is enabled in this case, but this is a + * potential breakage point if the types in pngconf.h aren't exactly right. + */ + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (entry_start = (png_bytep)png_ptr->chunkdata; *entry_start; + entry_start++) + /* Empty loop to find end of name */ ; + + ++entry_start; + + /* A sample depth should follow the separator, and we should be on it */ + if (entry_start > (png_bytep)png_ptr->chunkdata + slength - 2) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "malformed sPLT chunk"); + return; + } + + new_palette.depth = *entry_start++; + entry_size = (new_palette.depth == 8 ? 6 : 10); + /* This must fit in a png_uint_32 because it is derived from the original + * chunk data length (and use 'length', not 'slength' here for clarity - + * they are guaranteed to be the same, see the tests above.) + */ + data_length = length - (png_uint_32)(entry_start - + (png_bytep)png_ptr->chunkdata); + + /* Integrity-check the data length */ + if (data_length % entry_size) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "sPLT chunk has bad length"); + return; + } + + dl = (png_int_32)(data_length / entry_size); + max_dl = PNG_SIZE_MAX / png_sizeof(png_sPLT_entry); + + if (dl > max_dl) + { + png_warning(png_ptr, "sPLT chunk too long"); + return; + } + + new_palette.nentries = (png_int_32)(data_length / entry_size); + + new_palette.entries = (png_sPLT_entryp)png_malloc_warn( + png_ptr, new_palette.nentries * png_sizeof(png_sPLT_entry)); + + if (new_palette.entries == NULL) + { + png_warning(png_ptr, "sPLT chunk requires too much memory"); + return; + } + +#ifdef PNG_POINTER_INDEXING_SUPPORTED + for (i = 0; i < new_palette.nentries; i++) + { + pp = new_palette.entries + i; + + if (new_palette.depth == 8) + { + pp->red = *entry_start++; + pp->green = *entry_start++; + pp->blue = *entry_start++; + pp->alpha = *entry_start++; + } + + else + { + pp->red = png_get_uint_16(entry_start); entry_start += 2; + pp->green = png_get_uint_16(entry_start); entry_start += 2; + pp->blue = png_get_uint_16(entry_start); entry_start += 2; + pp->alpha = png_get_uint_16(entry_start); entry_start += 2; + } + + pp->frequency = png_get_uint_16(entry_start); entry_start += 2; + } +#else + pp = new_palette.entries; + + for (i = 0; i < new_palette.nentries; i++) + { + + if (new_palette.depth == 8) + { + pp[i].red = *entry_start++; + pp[i].green = *entry_start++; + pp[i].blue = *entry_start++; + pp[i].alpha = *entry_start++; + } + + else + { + pp[i].red = png_get_uint_16(entry_start); entry_start += 2; + pp[i].green = png_get_uint_16(entry_start); entry_start += 2; + pp[i].blue = png_get_uint_16(entry_start); entry_start += 2; + pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2; + } + + pp->frequency = png_get_uint_16(entry_start); entry_start += 2; + } +#endif + + /* Discard all chunk data except the name and stash that */ + new_palette.name = png_ptr->chunkdata; + + png_set_sPLT(png_ptr, info_ptr, &new_palette, 1); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, new_palette.entries); +} +#endif /* PNG_READ_sPLT_SUPPORTED */ + +#ifdef PNG_READ_tRNS_SUPPORTED +void /* PRIVATE */ +png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; + + png_debug(1, "in png_handle_tRNS"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before tRNS"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid tRNS after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + png_warning(png_ptr, "Duplicate tRNS chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + png_byte buf[2]; + + if (length != 2) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 2); + png_ptr->num_trans = 1; + png_ptr->trans_color.gray = png_get_uint_16(buf); + } + + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + png_byte buf[6]; + + if (length != 6) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, (png_size_t)length); + png_ptr->num_trans = 1; + png_ptr->trans_color.red = png_get_uint_16(buf); + png_ptr->trans_color.green = png_get_uint_16(buf + 2); + png_ptr->trans_color.blue = png_get_uint_16(buf + 4); + } + + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (!(png_ptr->mode & PNG_HAVE_PLTE)) + { + /* Should be an error, but we can cope with it. */ + png_warning(png_ptr, "Missing PLTE before tRNS"); + } + + if (length > (png_uint_32)png_ptr->num_palette || + length > PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + if (length == 0) + { + png_warning(png_ptr, "Zero length tRNS chunk"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, readbuf, (png_size_t)length); + png_ptr->num_trans = (png_uint_16)length; + } + + else + { + png_warning(png_ptr, "tRNS chunk not allowed with alpha channel"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_crc_finish(png_ptr, 0)) + { + png_ptr->num_trans = 0; + return; + } + + png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, + &(png_ptr->trans_color)); +} +#endif + +#ifdef PNG_READ_bKGD_SUPPORTED +void /* PRIVATE */ +png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_size_t truelen; + png_byte buf[6]; + + png_debug(1, "in png_handle_bKGD"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before bKGD"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid bKGD after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + { + png_warning(png_ptr, "Missing PLTE before bKGD"); + png_crc_finish(png_ptr, length); + return; + } + + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) + { + png_warning(png_ptr, "Duplicate bKGD chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + truelen = 1; + + else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + truelen = 6; + + else + truelen = 2; + + if (length != truelen) + { + png_warning(png_ptr, "Incorrect bKGD chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, truelen); + + if (png_crc_finish(png_ptr, 0)) + return; + + /* We convert the index value into RGB components so that we can allow + * arbitrary RGB values for background when we have transparency, and + * so it is easy to determine the RGB values of the background color + * from the info_ptr struct. + */ + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_ptr->background.index = buf[0]; + + if (info_ptr && info_ptr->num_palette) + { + if (buf[0] >= info_ptr->num_palette) + { + png_warning(png_ptr, "Incorrect bKGD chunk index value"); + return; + } + + png_ptr->background.red = + (png_uint_16)png_ptr->palette[buf[0]].red; + + png_ptr->background.green = + (png_uint_16)png_ptr->palette[buf[0]].green; + + png_ptr->background.blue = + (png_uint_16)png_ptr->palette[buf[0]].blue; + } + } + + else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ + { + png_ptr->background.red = + png_ptr->background.green = + png_ptr->background.blue = + png_ptr->background.gray = png_get_uint_16(buf); + } + + else + { + png_ptr->background.red = png_get_uint_16(buf); + png_ptr->background.green = png_get_uint_16(buf + 2); + png_ptr->background.blue = png_get_uint_16(buf + 4); + } + + png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background)); +} +#endif + +#ifdef PNG_READ_hIST_SUPPORTED +void /* PRIVATE */ +png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + unsigned int num, i; + png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH]; + + png_debug(1, "in png_handle_hIST"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before hIST"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid hIST after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (!(png_ptr->mode & PNG_HAVE_PLTE)) + { + png_warning(png_ptr, "Missing PLTE before hIST"); + png_crc_finish(png_ptr, length); + return; + } + + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) + { + png_warning(png_ptr, "Duplicate hIST chunk"); + png_crc_finish(png_ptr, length); + return; + } + + num = length / 2 ; + + if (num != (unsigned int)png_ptr->num_palette || num > + (unsigned int)PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, "Incorrect hIST chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + for (i = 0; i < num; i++) + { + png_byte buf[2]; + + png_crc_read(png_ptr, buf, 2); + readbuf[i] = png_get_uint_16(buf); + } + + if (png_crc_finish(png_ptr, 0)) + return; + + png_set_hIST(png_ptr, info_ptr, readbuf); +} +#endif + +#ifdef PNG_READ_pHYs_SUPPORTED +void /* PRIVATE */ +png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[9]; + png_uint_32 res_x, res_y; + int unit_type; + + png_debug(1, "in png_handle_pHYs"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before pHYs"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid pHYs after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_warning(png_ptr, "Duplicate pHYs chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 9) + { + png_warning(png_ptr, "Incorrect pHYs chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 9); + + if (png_crc_finish(png_ptr, 0)) + return; + + res_x = png_get_uint_32(buf); + res_y = png_get_uint_32(buf + 4); + unit_type = buf[8]; + png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type); +} +#endif + +#ifdef PNG_READ_oFFs_SUPPORTED +void /* PRIVATE */ +png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[9]; + png_int_32 offset_x, offset_y; + int unit_type; + + png_debug(1, "in png_handle_oFFs"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before oFFs"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid oFFs after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + { + png_warning(png_ptr, "Duplicate oFFs chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 9) + { + png_warning(png_ptr, "Incorrect oFFs chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 9); + + if (png_crc_finish(png_ptr, 0)) + return; + + offset_x = png_get_int_32(buf); + offset_y = png_get_int_32(buf + 4); + unit_type = buf[8]; + png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type); +} +#endif + +#ifdef PNG_READ_pCAL_SUPPORTED +/* Read the pCAL chunk (described in the PNG Extensions document) */ +void /* PRIVATE */ +png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_int_32 X0, X1; + png_byte type, nparams; + png_charp buf, units, endptr; + png_charpp params; + png_size_t slength; + int i; + + png_debug(1, "in png_handle_pCAL"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before pCAL"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid pCAL after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) + { + png_warning(png_ptr, "Duplicate pCAL chunk"); + png_crc_finish(png_ptr, length); + return; + } + + png_debug1(2, "Allocating and reading pCAL chunk data (%u bytes)", + length + 1); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory for pCAL purpose"); + return; + } + + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ + + png_debug(3, "Finding end of pCAL purpose string"); + for (buf = png_ptr->chunkdata; *buf; buf++) + /* Empty loop */ ; + + endptr = png_ptr->chunkdata + slength; + + /* We need to have at least 12 bytes after the purpose string + * in order to get the parameter information. + */ + if (endptr <= buf + 12) + { + png_warning(png_ptr, "Invalid pCAL data"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_debug(3, "Reading pCAL X0, X1, type, nparams, and units"); + X0 = png_get_int_32((png_bytep)buf+1); + X1 = png_get_int_32((png_bytep)buf+5); + type = buf[9]; + nparams = buf[10]; + units = buf + 11; + + png_debug(3, "Checking pCAL equation type and number of parameters"); + /* Check that we have the right number of parameters for known + * equation types. + */ + if ((type == PNG_EQUATION_LINEAR && nparams != 2) || + (type == PNG_EQUATION_BASE_E && nparams != 3) || + (type == PNG_EQUATION_ARBITRARY && nparams != 3) || + (type == PNG_EQUATION_HYPERBOLIC && nparams != 4)) + { + png_warning(png_ptr, "Invalid pCAL parameters for equation type"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + else if (type >= PNG_EQUATION_LAST) + { + png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); + } + + for (buf = units; *buf; buf++) + /* Empty loop to move past the units string. */ ; + + png_debug(3, "Allocating pCAL parameters array"); + + params = (png_charpp)png_malloc_warn(png_ptr, + (png_size_t)(nparams * png_sizeof(png_charp))); + + if (params == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "No memory for pCAL params"); + return; + } + + /* Get pointers to the start of each parameter string. */ + for (i = 0; i < (int)nparams; i++) + { + buf++; /* Skip the null string terminator from previous parameter. */ + + png_debug1(3, "Reading pCAL parameter %d", i); + + for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++) + /* Empty loop to move past each parameter string */ ; + + /* Make sure we haven't run out of data yet */ + if (buf > endptr) + { + png_warning(png_ptr, "Invalid pCAL data"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, params); + return; + } + } + + png_set_pCAL(png_ptr, info_ptr, png_ptr->chunkdata, X0, X1, type, nparams, + units, params); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, params); +} +#endif + +#ifdef PNG_READ_sCAL_SUPPORTED +/* Read the sCAL chunk */ +void /* PRIVATE */ +png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_size_t slength, i; + int state; + + png_debug(1, "in png_handle_sCAL"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sCAL"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sCAL after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) + { + png_warning(png_ptr, "Duplicate sCAL chunk"); + png_crc_finish(png_ptr, length); + return; + } + + png_debug1(2, "Allocating and reading sCAL chunk data (%u bytes)", + length + 1); + + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "Out of memory while processing sCAL chunk"); + png_crc_finish(png_ptr, length); + return; + } + + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ + + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + /* Validate the unit. */ + if (png_ptr->chunkdata[0] != 1 && png_ptr->chunkdata[0] != 2) + { + png_warning(png_ptr, "Invalid sCAL ignored: invalid unit"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + /* Validate the ASCII numbers, need two ASCII numbers separated by + * a '\0' and they need to fit exactly in the chunk data. + */ + i = 0; + state = 0; + + if (png_ptr->chunkdata[1] == 45 /* negative width */ || + !png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) || + i >= slength || png_ptr->chunkdata[i++] != 0) + png_warning(png_ptr, "Invalid sCAL chunk ignored: bad width format"); + + else + { + png_size_t heighti = i; + + if (png_ptr->chunkdata[i] == 45 /* negative height */ || + !png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) || + i != slength) + png_warning(png_ptr, "Invalid sCAL chunk ignored: bad height format"); + + else + /* This is the (only) success case. */ + png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0], + png_ptr->chunkdata+1, png_ptr->chunkdata+heighti); + } + + /* Clean up - just free the temporarily allocated buffer. */ + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +} +#endif + +#ifdef PNG_READ_tIME_SUPPORTED +void /* PRIVATE */ +png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[7]; + png_time mod_time; + + png_debug(1, "in png_handle_tIME"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Out of place tIME chunk"); + + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) + { + png_warning(png_ptr, "Duplicate tIME chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + + if (length != 7) + { + png_warning(png_ptr, "Incorrect tIME chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 7); + + if (png_crc_finish(png_ptr, 0)) + return; + + mod_time.second = buf[6]; + mod_time.minute = buf[5]; + mod_time.hour = buf[4]; + mod_time.day = buf[3]; + mod_time.month = buf[2]; + mod_time.year = png_get_uint_16(buf); + + png_set_tIME(png_ptr, info_ptr, &mod_time); +} +#endif + +#ifdef PNG_READ_tEXt_SUPPORTED +/* Note: this does not properly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp key; + png_charp text; + png_uint_32 skip = 0; + png_size_t slength; + int ret; + + png_debug(1, "in png_handle_tEXt"); + +#ifdef PNG_USER_LIMITS_SUPPORTED + if (png_ptr->user_chunk_cache_max != 0) + { + if (png_ptr->user_chunk_cache_max == 1) + { + png_crc_finish(png_ptr, length); + return; + } + + if (--png_ptr->user_chunk_cache_max == 1) + { + png_warning(png_ptr, "No space in chunk cache for tEXt"); + png_crc_finish(png_ptr, length); + return; + } + } +#endif + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before tEXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "tEXt chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory to process text chunk"); + return; + } + + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + key = png_ptr->chunkdata; + + key[slength] = 0x00; + + for (text = key; *text; text++) + /* Empty loop to find end of key */ ; + + if (text != key + slength) + text++; + + text_ptr = (png_textp)png_malloc_warn(png_ptr, + png_sizeof(png_text)); + + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process text chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr->key = key; + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; + text_ptr->itxt_length = 0; + text_ptr->text = text; + text_ptr->text_length = png_strlen(text); + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, text_ptr); + + if (ret) + png_warning(png_ptr, "Insufficient memory to process text chunk"); +} +#endif + +#ifdef PNG_READ_zTXt_SUPPORTED +/* Note: this does not correctly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp text; + int comp_type; + int ret; + png_size_t slength, prefix_len, data_len; + + png_debug(1, "in png_handle_zTXt"); + +#ifdef PNG_USER_LIMITS_SUPPORTED + if (png_ptr->user_chunk_cache_max != 0) + { + if (png_ptr->user_chunk_cache_max == 1) + { + png_crc_finish(png_ptr, length); + return; + } + + if (--png_ptr->user_chunk_cache_max == 1) + { + png_warning(png_ptr, "No space in chunk cache for zTXt"); + png_crc_finish(png_ptr, length); + return; + } + } +#endif + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before zTXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + /* We will no doubt have problems with chunks even half this size, but + * there is no hard and fast rule to tell us where to stop. + */ + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "zTXt chunk too large to fit in memory"); + png_crc_finish(png_ptr, length); + return; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "Out of memory processing zTXt chunk"); + return; + } + + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (text = png_ptr->chunkdata; *text; text++) + /* Empty loop */ ; + + /* zTXt must have some text after the chunkdataword */ + if (text >= png_ptr->chunkdata + slength - 2) + { + png_warning(png_ptr, "Truncated zTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + else + { + comp_type = *(++text); + + if (comp_type != PNG_TEXT_COMPRESSION_zTXt) + { + png_warning(png_ptr, "Unknown compression type in zTXt chunk"); + comp_type = PNG_TEXT_COMPRESSION_zTXt; + } + + text++; /* Skip the compression_method byte */ + } + + prefix_len = text - png_ptr->chunkdata; + + png_decompress_chunk(png_ptr, comp_type, + (png_size_t)length, prefix_len, &data_len); + + text_ptr = (png_textp)png_malloc_warn(png_ptr, + png_sizeof(png_text)); + + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process zTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + text_ptr->compression = comp_type; + text_ptr->key = png_ptr->chunkdata; + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; + text_ptr->itxt_length = 0; + text_ptr->text = png_ptr->chunkdata + prefix_len; + text_ptr->text_length = data_len; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, text_ptr); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + + if (ret) + png_error(png_ptr, "Insufficient memory to store zTXt chunk"); +} +#endif + +#ifdef PNG_READ_iTXt_SUPPORTED +/* Note: this does not correctly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp key, lang, text, lang_key; + int comp_flag; + int comp_type = 0; + int ret; + png_size_t slength, prefix_len, data_len; + + png_debug(1, "in png_handle_iTXt"); + +#ifdef PNG_USER_LIMITS_SUPPORTED + if (png_ptr->user_chunk_cache_max != 0) + { + if (png_ptr->user_chunk_cache_max == 1) + { + png_crc_finish(png_ptr, length); + return; + } + + if (--png_ptr->user_chunk_cache_max == 1) + { + png_warning(png_ptr, "No space in chunk cache for iTXt"); + png_crc_finish(png_ptr, length); + return; + } + } +#endif + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before iTXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + /* We will no doubt have problems with chunks even half this size, but + * there is no hard and fast rule to tell us where to stop. + */ + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "iTXt chunk too large to fit in memory"); + png_crc_finish(png_ptr, length); + return; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory to process iTXt chunk"); + return; + } + + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (lang = png_ptr->chunkdata; *lang; lang++) + /* Empty loop */ ; + + lang++; /* Skip NUL separator */ + + /* iTXt must have a language tag (possibly empty), two compression bytes, + * translated keyword (possibly empty), and possibly some text after the + * keyword + */ + + if (lang >= png_ptr->chunkdata + slength - 3) + { + png_warning(png_ptr, "Truncated iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + else + { + comp_flag = *lang++; + comp_type = *lang++; + } + + for (lang_key = lang; *lang_key; lang_key++) + /* Empty loop */ ; + + lang_key++; /* Skip NUL separator */ + + if (lang_key >= png_ptr->chunkdata + slength) + { + png_warning(png_ptr, "Truncated iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + for (text = lang_key; *text; text++) + /* Empty loop */ ; + + text++; /* Skip NUL separator */ + + if (text >= png_ptr->chunkdata + slength) + { + png_warning(png_ptr, "Malformed iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + prefix_len = text - png_ptr->chunkdata; + + key=png_ptr->chunkdata; + + if (comp_flag) + png_decompress_chunk(png_ptr, comp_type, + (size_t)length, prefix_len, &data_len); + + else + data_len = png_strlen(png_ptr->chunkdata + prefix_len); + + text_ptr = (png_textp)png_malloc_warn(png_ptr, + png_sizeof(png_text)); + + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + text_ptr->compression = (int)comp_flag + 1; + text_ptr->lang_key = png_ptr->chunkdata + (lang_key - key); + text_ptr->lang = png_ptr->chunkdata + (lang - key); + text_ptr->itxt_length = data_len; + text_ptr->text_length = 0; + text_ptr->key = png_ptr->chunkdata; + text_ptr->text = png_ptr->chunkdata + prefix_len; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, text_ptr); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + + if (ret) + png_error(png_ptr, "Insufficient memory to store iTXt chunk"); +} +#endif + +/* This function is called when we haven't found a handler for a + * chunk. If there isn't a problem with the chunk itself (ie bad + * chunk name, CRC, or a critical chunk), the chunk is silently ignored + * -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which + * case it will be saved away to be written out later. + */ +void /* PRIVATE */ +png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_uint_32 skip = 0; + + png_debug(1, "in png_handle_unknown"); + +#ifdef PNG_USER_LIMITS_SUPPORTED + if (png_ptr->user_chunk_cache_max != 0) + { + if (png_ptr->user_chunk_cache_max == 1) + { + png_crc_finish(png_ptr, length); + return; + } + + if (--png_ptr->user_chunk_cache_max == 1) + { + png_warning(png_ptr, "No space in chunk cache for unknown chunk"); + png_crc_finish(png_ptr, length); + return; + } + } +#endif + + if (png_ptr->mode & PNG_HAVE_IDAT) + { + PNG_IDAT; + + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* Not an IDAT */ + png_ptr->mode |= PNG_AFTER_IDAT; + } + + if (!(png_ptr->chunk_name[0] & 0x20)) + { +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS +#ifdef PNG_READ_USER_CHUNKS_SUPPORTED + && png_ptr->read_user_chunk_fn == NULL +#endif + ) +#endif + png_chunk_error(png_ptr, "unknown critical chunk"); + } + +#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED + if ((png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) +#ifdef PNG_READ_USER_CHUNKS_SUPPORTED + || (png_ptr->read_user_chunk_fn != NULL) +#endif + ) + { +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "unknown chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_memcpy((png_charp)png_ptr->unknown_chunk.name, + (png_charp)png_ptr->chunk_name, + png_sizeof(png_ptr->unknown_chunk.name)); + + png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1] + = '\0'; + + png_ptr->unknown_chunk.size = (png_size_t)length; + + if (length == 0) + png_ptr->unknown_chunk.data = NULL; + + else + { + png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); + png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); + } + +#ifdef PNG_READ_USER_CHUNKS_SUPPORTED + if (png_ptr->read_user_chunk_fn != NULL) + { + /* Callback to user unknown chunk handler */ + int ret; + + ret = (*(png_ptr->read_user_chunk_fn)) + (png_ptr, &png_ptr->unknown_chunk); + + if (ret < 0) + png_chunk_error(png_ptr, "error in user chunk"); + + if (ret == 0) + { + if (!(png_ptr->chunk_name[0] & 0x20)) + { +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS) +#endif + png_chunk_error(png_ptr, "unknown critical chunk"); + } + + png_set_unknown_chunks(png_ptr, info_ptr, + &png_ptr->unknown_chunk, 1); + } + } + + else +#endif + png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); + + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; + } + + else +#endif + skip = length; + + png_crc_finish(png_ptr, skip); + +#ifndef PNG_READ_USER_CHUNKS_SUPPORTED + PNG_UNUSED(info_ptr) /* Quiet compiler warnings about unused info_ptr */ +#endif +} + +/* This function is called to verify that a chunk name is valid. + * This function can't have the "critical chunk check" incorporated + * into it, since in the future we will need to be able to call user + * functions to handle unknown critical chunks after we check that + * the chunk name itself is valid. + */ + +#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) + +void /* PRIVATE */ +png_check_chunk_name(png_structp png_ptr, png_const_bytep chunk_name) +{ + png_debug(1, "in png_check_chunk_name"); + if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) || + isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3])) + { + png_chunk_error(png_ptr, "invalid chunk type"); + } +} + +/* Combines the row recently read in with the existing pixels in the + * row. This routine takes care of alpha and transparency if requested. + * This routine also handles the two methods of progressive display + * of interlaced images, depending on the mask value. + * The mask value describes which pixels are to be combined with + * the row. The pattern always repeats every 8 pixels, so just 8 + * bits are needed. A one indicates the pixel is to be combined, + * a zero indicates the pixel is to be skipped. This is in addition + * to any alpha or transparency value associated with the pixel. If + * you want all pixels to be combined, pass 0xff (255) in mask. + */ + +void /* PRIVATE */ +png_combine_row(png_structp png_ptr, png_bytep row, int mask) +{ + png_debug(1, "in png_combine_row"); + + if (mask == 0xff) + { + png_memcpy(row, png_ptr->row_buf + 1, + PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width)); + } + + else + { + switch (png_ptr->row_info.pixel_depth) + { + case 1: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_inc, s_start, s_end; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + +#ifdef PNG_READ_PACKSWAP_SUPPORTED + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 7; + s_inc = 1; + } + + else +#endif + { + s_start = 7; + s_end = 0; + s_inc = -1; + } + + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + int value; + + value = (*sp >> shift) & 0x01; + *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + + else + shift += s_inc; + + if (m == 1) + m = 0x80; + + else + m >>= 1; + } + break; + } + + case 2: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_start, s_end, s_inc; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + int value; + +#ifdef PNG_READ_PACKSWAP_SUPPORTED + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 6; + s_inc = 2; + } + + else +#endif + { + s_start = 6; + s_end = 0; + s_inc = -2; + } + + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + value = (*sp >> shift) & 0x03; + *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + + else + shift += s_inc; + + if (m == 1) + m = 0x80; + + else + m >>= 1; + } + break; + } + + case 4: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_start, s_end, s_inc; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + int value; + +#ifdef PNG_READ_PACKSWAP_SUPPORTED + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 4; + s_inc = 4; + } + + else +#endif + { + s_start = 4; + s_end = 0; + s_inc = -4; + } + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + value = (*sp >> shift) & 0xf; + *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + + else + shift += s_inc; + + if (m == 1) + m = 0x80; + + else + m >>= 1; + } + break; + } + + default: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + png_size_t pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + png_byte m = 0x80; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + png_memcpy(dp, sp, pixel_bytes); + } + + sp += pixel_bytes; + dp += pixel_bytes; + + if (m == 1) + m = 0x80; + + else + m >>= 1; + } + break; + } + } + } +} + +#ifdef PNG_READ_INTERLACING_SUPPORTED +void /* PRIVATE */ +png_do_read_interlace(png_structp png_ptr) +{ + png_row_infop row_info = &(png_ptr->row_info); + png_bytep row = png_ptr->row_buf + 1; + int pass = png_ptr->pass; + png_uint_32 transformations = png_ptr->transformations; + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + /* Offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + png_debug(1, "in png_do_read_interlace"); + if (row != NULL && row_info != NULL) + { + png_uint_32 final_width; + + final_width = row_info->width * png_pass_inc[pass]; + + switch (row_info->pixel_depth) + { + case 1: + { + png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3); + png_bytep dp = row + (png_size_t)((final_width - 1) >> 3); + int sshift, dshift; + int s_start, s_end, s_inc; + int jstop = png_pass_inc[pass]; + png_byte v; + png_uint_32 i; + int j; + +#ifdef PNG_READ_PACKSWAP_SUPPORTED + if (transformations & PNG_PACKSWAP) + { + sshift = (int)((row_info->width + 7) & 0x07); + dshift = (int)((final_width + 7) & 0x07); + s_start = 7; + s_end = 0; + s_inc = -1; + } + + else +#endif + { + sshift = 7 - (int)((row_info->width + 7) & 0x07); + dshift = 7 - (int)((final_width + 7) & 0x07); + s_start = 0; + s_end = 7; + s_inc = 1; + } + + for (i = 0; i < row_info->width; i++) + { + v = (png_byte)((*sp >> sshift) & 0x01); + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + + else + dshift += s_inc; + } + + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + + else + sshift += s_inc; + } + break; + } + + case 2: + { + png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2); + png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2); + int sshift, dshift; + int s_start, s_end, s_inc; + int jstop = png_pass_inc[pass]; + png_uint_32 i; + +#ifdef PNG_READ_PACKSWAP_SUPPORTED + if (transformations & PNG_PACKSWAP) + { + sshift = (int)(((row_info->width + 3) & 0x03) << 1); + dshift = (int)(((final_width + 3) & 0x03) << 1); + s_start = 6; + s_end = 0; + s_inc = -2; + } + + else +#endif + { + sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1); + dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1); + s_start = 0; + s_end = 6; + s_inc = 2; + } + + for (i = 0; i < row_info->width; i++) + { + png_byte v; + int j; + + v = (png_byte)((*sp >> sshift) & 0x03); + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + + else + dshift += s_inc; + } + + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + + else + sshift += s_inc; + } + break; + } + + case 4: + { + png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1); + png_bytep dp = row + (png_size_t)((final_width - 1) >> 1); + int sshift, dshift; + int s_start, s_end, s_inc; + png_uint_32 i; + int jstop = png_pass_inc[pass]; + +#ifdef PNG_READ_PACKSWAP_SUPPORTED + if (transformations & PNG_PACKSWAP) + { + sshift = (int)(((row_info->width + 1) & 0x01) << 2); + dshift = (int)(((final_width + 1) & 0x01) << 2); + s_start = 4; + s_end = 0; + s_inc = -4; + } + + else +#endif + { + sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2); + dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2); + s_start = 0; + s_end = 4; + s_inc = 4; + } + + for (i = 0; i < row_info->width; i++) + { + png_byte v = (png_byte)((*sp >> sshift) & 0xf); + int j; + + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + + else + dshift += s_inc; + } + + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + + else + sshift += s_inc; + } + break; + } + default: + { + png_size_t pixel_bytes = (row_info->pixel_depth >> 3); + + png_bytep sp = row + (png_size_t)(row_info->width - 1) + * pixel_bytes; + + png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes; + + int jstop = png_pass_inc[pass]; + png_uint_32 i; + + for (i = 0; i < row_info->width; i++) + { + png_byte v[8]; + int j; + + png_memcpy(v, sp, pixel_bytes); + + for (j = 0; j < jstop; j++) + { + png_memcpy(dp, v, pixel_bytes); + dp -= pixel_bytes; + } + + sp -= pixel_bytes; + } + break; + } + } + row_info->width = final_width; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width); + } +#ifndef PNG_READ_PACKSWAP_SUPPORTED + PNG_UNUSED(transformations) /* Silence compiler warning */ +#endif +} +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + +void /* PRIVATE */ +png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, + png_const_bytep prev_row, int filter) +{ + png_debug(1, "in png_read_filter_row"); + png_debug2(2, "row = %u, filter = %d", png_ptr->row_number, filter); + switch (filter) + { + case PNG_FILTER_VALUE_NONE: + break; + + case PNG_FILTER_VALUE_SUB: + { + png_size_t i; + png_size_t istop = row_info->rowbytes; + unsigned int bpp = (row_info->pixel_depth + 7) >> 3; + png_bytep rp = row + bpp; + png_bytep lp = row; + + for (i = bpp; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); + rp++; + } + break; + } + case PNG_FILTER_VALUE_UP: + { + png_size_t i; + png_size_t istop = row_info->rowbytes; + png_bytep rp = row; + png_const_bytep pp = prev_row; + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); + rp++; + } + break; + } + case PNG_FILTER_VALUE_AVG: + { + png_size_t i; + png_bytep rp = row; + png_const_bytep pp = prev_row; + png_bytep lp = row; + unsigned int bpp = (row_info->pixel_depth + 7) >> 3; + png_size_t istop = row_info->rowbytes - bpp; + + for (i = 0; i < bpp; i++) + { + *rp = (png_byte)(((int)(*rp) + + ((int)(*pp++) / 2 )) & 0xff); + + rp++; + } + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + + (int)(*pp++ + *lp++) / 2 ) & 0xff); + + rp++; + } + break; + } + case PNG_FILTER_VALUE_PAETH: + { + png_size_t i; + png_bytep rp = row; + png_const_bytep pp = prev_row; + png_bytep lp = row; + png_const_bytep cp = prev_row; + unsigned int bpp = (row_info->pixel_depth + 7) >> 3; + png_size_t istop=row_info->rowbytes - bpp; + + for (i = 0; i < bpp; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); + rp++; + } + + for (i = 0; i < istop; i++) /* Use leftover rp,pp */ + { + int a, b, c, pa, pb, pc, p; + + a = *lp++; + b = *pp++; + c = *cp++; + + p = b - c; + pc = a - c; + +#ifdef PNG_USE_ABS + pa = abs(p); + pb = abs(pc); + pc = abs(p + pc); +#else + pa = p < 0 ? -p : p; + pb = pc < 0 ? -pc : pc; + pc = (p + pc) < 0 ? -(p + pc) : p + pc; +#endif + + /* + if (pa <= pb && pa <= pc) + p = a; + + else if (pb <= pc) + p = b; + + else + p = c; + */ + + p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; + + *rp = (png_byte)(((int)(*rp) + p) & 0xff); + rp++; + } + break; + } + default: + png_error(png_ptr, "Ignoring bad adaptive filter type"); + /*NOT REACHED */ + break; + } +} + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +void /* PRIVATE */ +png_read_finish_row(png_structp png_ptr) +{ +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + + png_debug(1, "in png_read_finish_row"); + png_ptr->row_number++; + if (png_ptr->row_number < png_ptr->num_rows) + return; + +#ifdef PNG_READ_INTERLACING_SUPPORTED + if (png_ptr->interlaced) + { + png_ptr->row_number = 0; + + png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); + + do + { + png_ptr->pass++; + + if (png_ptr->pass >= 7) + break; + + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + + if (!(png_ptr->transformations & PNG_INTERLACE)) + { + png_ptr->num_rows = (png_ptr->height + + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; + } + + else /* if (png_ptr->transformations & PNG_INTERLACE) */ + break; /* libpng deinterlacing sees every row */ + + } while (png_ptr->num_rows == 0 || png_ptr->iwidth == 0); + + if (png_ptr->pass < 7) + return; + } +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + { + PNG_IDAT; + char extra; + int ret; + + png_ptr->zstream.next_out = (Byte *)&extra; + png_ptr->zstream.avail_out = (uInt)1; + + for (;;) + { + if (!(png_ptr->zstream.avail_in)) + { + while (!png_ptr->idat_size) + { + png_crc_finish(png_ptr, 0); + png_ptr->idat_size = png_read_chunk_header(png_ptr); + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + png_error(png_ptr, "Not enough image data"); + } + + png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_in = png_ptr->zbuf; + + if (png_ptr->zbuf_size > png_ptr->idat_size) + png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; + + png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in); + png_ptr->idat_size -= png_ptr->zstream.avail_in; + } + + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + + if (ret == Z_STREAM_END) + { + if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in || + png_ptr->idat_size) + png_warning(png_ptr, "Extra compressed data"); + + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + + if (ret != Z_OK) + png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : + "Decompression Error"); + + if (!(png_ptr->zstream.avail_out)) + { + png_warning(png_ptr, "Extra compressed data"); + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + + } + png_ptr->zstream.avail_out = 0; + } + + if (png_ptr->idat_size || png_ptr->zstream.avail_in) + png_warning(png_ptr, "Extra compression data"); + + inflateReset(&png_ptr->zstream); + + png_ptr->mode |= PNG_AFTER_IDAT; +} +#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ + +void /* PRIVATE */ +png_read_start_row(png_structp png_ptr) +{ +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif + + int max_pixel_depth; + png_size_t row_bytes; + + png_debug(1, "in png_read_start_row"); + png_ptr->zstream.avail_in = 0; + png_init_read_transformations(png_ptr); +#ifdef PNG_READ_INTERLACING_SUPPORTED + if (png_ptr->interlaced) + { + if (!(png_ptr->transformations & PNG_INTERLACE)) + png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - + png_pass_ystart[0]) / png_pass_yinc[0]; + + else + png_ptr->num_rows = png_ptr->height; + + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + } + + else +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + { + png_ptr->num_rows = png_ptr->height; + png_ptr->iwidth = png_ptr->width; + } + + max_pixel_depth = png_ptr->pixel_depth; + +#ifdef PNG_READ_PACK_SUPPORTED + if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8) + max_pixel_depth = 8; +#endif + +#ifdef PNG_READ_EXPAND_SUPPORTED + if (png_ptr->transformations & PNG_EXPAND) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (png_ptr->num_trans) + max_pixel_depth = 32; + + else + max_pixel_depth = 24; + } + + else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + if (max_pixel_depth < 8) + max_pixel_depth = 8; + + if (png_ptr->num_trans) + max_pixel_depth *= 2; + } + + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + if (png_ptr->num_trans) + { + max_pixel_depth *= 4; + max_pixel_depth /= 3; + } + } + } +#endif + +#ifdef PNG_READ_FILLER_SUPPORTED + if (png_ptr->transformations & (PNG_FILLER)) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + max_pixel_depth = 32; + + else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + if (max_pixel_depth <= 8) + max_pixel_depth = 16; + + else + max_pixel_depth = 32; + } + + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + if (max_pixel_depth <= 32) + max_pixel_depth = 32; + + else + max_pixel_depth = 64; + } + } +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED + if (png_ptr->transformations & PNG_GRAY_TO_RGB) + { + if ( +#ifdef PNG_READ_EXPAND_SUPPORTED + (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || +#endif +#ifdef PNG_READ_FILLER_SUPPORTED + (png_ptr->transformations & (PNG_FILLER)) || +#endif + png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (max_pixel_depth <= 16) + max_pixel_depth = 32; + + else + max_pixel_depth = 64; + } + + else + { + if (max_pixel_depth <= 8) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + max_pixel_depth = 32; + + else + max_pixel_depth = 24; + } + + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + max_pixel_depth = 64; + + else + max_pixel_depth = 48; + } + } +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \ +defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + int user_pixel_depth = png_ptr->user_transform_depth* + png_ptr->user_transform_channels; + + if (user_pixel_depth > max_pixel_depth) + max_pixel_depth=user_pixel_depth; + } +#endif + + /* Align the width on the next larger 8 pixels. Mainly used + * for interlacing + */ + row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7)); + /* Calculate the maximum bytes needed, adding a byte and a pixel + * for safety's sake + */ + row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) + + 1 + ((max_pixel_depth + 7) >> 3); + +#ifdef PNG_MAX_MALLOC_64K + if (row_bytes > (png_uint_32)65536L) + png_error(png_ptr, "This image requires a row greater than 64KB"); +#endif + + if (row_bytes + 48 > png_ptr->old_big_row_buf_size) + { + png_free(png_ptr, png_ptr->big_row_buf); + + if (png_ptr->interlaced) + png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr, + row_bytes + 48); + + else + png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, + row_bytes + 48); + + png_ptr->old_big_row_buf_size = row_bytes + 48; + +#ifdef PNG_ALIGNED_MEMORY_SUPPORTED + /* Use 16-byte aligned memory for row_buf with at least 16 bytes + * of padding before and after row_buf. + */ + png_ptr->row_buf = png_ptr->big_row_buf + 32 - + (((png_alloc_size_t)png_ptr->big_row_buf + 15) & 0x0F); + + png_ptr->old_big_row_buf_size = row_bytes + 48; +#else + /* Use 32 bytes of padding before and 16 bytes after row_buf. */ + png_ptr->row_buf = png_ptr->big_row_buf + 32; +#endif + png_ptr->old_big_row_buf_size = row_bytes + 48; + } + +#ifdef PNG_MAX_MALLOC_64K + if (png_ptr->rowbytes > 65535) + png_error(png_ptr, "This image requires a row greater than 64KB"); + +#endif + if (png_ptr->rowbytes > (PNG_SIZE_MAX - 1)) + png_error(png_ptr, "Row has too many bytes to allocate in memory"); + + if (png_ptr->rowbytes + 1 > png_ptr->old_prev_row_size) + { + png_free(png_ptr, png_ptr->prev_row); + + png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1); + + png_ptr->old_prev_row_size = png_ptr->rowbytes + 1; + } + + png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); + + png_debug1(3, "width = %u,", png_ptr->width); + png_debug1(3, "height = %u,", png_ptr->height); + png_debug1(3, "iwidth = %u,", png_ptr->iwidth); + png_debug1(3, "num_rows = %u,", png_ptr->num_rows); + png_debug1(3, "rowbytes = %lu,", (unsigned long)png_ptr->rowbytes); + png_debug1(3, "irowbytes = %lu", + (unsigned long)PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1); + + png_ptr->flags |= PNG_FLAG_ROW_INIT; +} +#endif /* PNG_READ_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngset.c b/src/3rdparty/libpng/pngset.c new file mode 100644 index 0000000000..2cfcf33bdf --- /dev/null +++ b/src/3rdparty/libpng/pngset.c @@ -0,0 +1,1225 @@ + +/* pngset.c - storage of image information into info struct + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * The functions here are used during reads to store data from the file + * into the info struct, and during writes to store application data + * into the info struct for writing into the file. This abstracts the + * info struct and allows us to change the structure in the future. + */ + +#include "pngpriv.h" + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +#ifdef PNG_bKGD_SUPPORTED +void PNGAPI +png_set_bKGD(png_structp png_ptr, png_infop info_ptr, + png_const_color_16p background) +{ + png_debug1(1, "in %s storage function", "bKGD"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16)); + info_ptr->valid |= PNG_INFO_bKGD; +} +#endif + +#ifdef PNG_cHRM_SUPPORTED +void PNGFAPI +png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, + png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, + png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, + png_fixed_point blue_x, png_fixed_point blue_y) +{ + png_debug1(1, "in %s storage function", "cHRM fixed"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + +# ifdef PNG_CHECK_cHRM_SUPPORTED + if (png_check_cHRM_fixed(png_ptr, + white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y)) +# endif + { + info_ptr->x_white = white_x; + info_ptr->y_white = white_y; + info_ptr->x_red = red_x; + info_ptr->y_red = red_y; + info_ptr->x_green = green_x; + info_ptr->y_green = green_y; + info_ptr->x_blue = blue_x; + info_ptr->y_blue = blue_y; + info_ptr->valid |= PNG_INFO_cHRM; + } +} + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_cHRM(png_structp png_ptr, png_infop info_ptr, + double white_x, double white_y, double red_x, double red_y, + double green_x, double green_y, double blue_x, double blue_y) +{ + png_set_cHRM_fixed(png_ptr, info_ptr, + png_fixed(png_ptr, white_x, "cHRM White X"), + png_fixed(png_ptr, white_y, "cHRM White Y"), + png_fixed(png_ptr, red_x, "cHRM Red X"), + png_fixed(png_ptr, red_y, "cHRM Red Y"), + png_fixed(png_ptr, green_x, "cHRM Green X"), + png_fixed(png_ptr, green_y, "cHRM Green Y"), + png_fixed(png_ptr, blue_x, "cHRM Blue X"), + png_fixed(png_ptr, blue_y, "cHRM Blue Y")); +} +# endif /* PNG_FLOATING_POINT_SUPPORTED */ + +#endif /* PNG_cHRM_SUPPORTED */ + +#ifdef PNG_gAMA_SUPPORTED +void PNGFAPI +png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point + file_gamma) +{ + png_debug1(1, "in %s storage function", "gAMA"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* Previously these values were limited, however they must be + * wrong, therefore storing them (and setting PNG_INFO_gAMA) + * must be wrong too. + */ + if (file_gamma > (png_fixed_point)PNG_UINT_31_MAX) + png_warning(png_ptr, "Gamma too large, ignored"); + + else if (file_gamma <= 0) + png_warning(png_ptr, "Negative or zero gamma ignored"); + + else + { + info_ptr->gamma = file_gamma; + info_ptr->valid |= PNG_INFO_gAMA; + } +} + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma) +{ + png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma, + "png_set_gAMA")); +} +# endif +#endif + +#ifdef PNG_hIST_SUPPORTED +void PNGAPI +png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_const_uint_16p hist) +{ + int i; + + png_debug1(1, "in %s storage function", "hIST"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (info_ptr->num_palette == 0 || info_ptr->num_palette + > PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, + "Invalid palette size, hIST allocation skipped"); + + return; + } + + png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); + + /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in + * version 1.2.1 + */ + png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, + PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16)); + + if (png_ptr->hist == NULL) + { + png_warning(png_ptr, "Insufficient memory for hIST chunk data"); + return; + } + + for (i = 0; i < info_ptr->num_palette; i++) + png_ptr->hist[i] = hist[i]; + + info_ptr->hist = png_ptr->hist; + info_ptr->valid |= PNG_INFO_hIST; + info_ptr->free_me |= PNG_FREE_HIST; +} +#endif + +void PNGAPI +png_set_IHDR(png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_type, int compression_type, + int filter_type) +{ + png_debug1(1, "in %s storage function", "IHDR"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->width = width; + info_ptr->height = height; + info_ptr->bit_depth = (png_byte)bit_depth; + info_ptr->color_type = (png_byte)color_type; + info_ptr->compression_type = (png_byte)compression_type; + info_ptr->filter_type = (png_byte)filter_type; + info_ptr->interlace_type = (png_byte)interlace_type; + + png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height, + info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type, + info_ptr->compression_type, info_ptr->filter_type); + + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + info_ptr->channels = 1; + + else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + info_ptr->channels = 3; + + else + info_ptr->channels = 1; + + if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + info_ptr->channels++; + + info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); + + /* Check for potential overflow */ + if (width > + (PNG_UINT_32_MAX >> 3) /* 8-byte RRGGBBAA pixels */ + - 48 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ + info_ptr->rowbytes = 0; + else + info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); +} + +#ifdef PNG_oFFs_SUPPORTED +void PNGAPI +png_set_oFFs(png_structp png_ptr, png_infop info_ptr, + png_int_32 offset_x, png_int_32 offset_y, int unit_type) +{ + png_debug1(1, "in %s storage function", "oFFs"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->x_offset = offset_x; + info_ptr->y_offset = offset_y; + info_ptr->offset_unit_type = (png_byte)unit_type; + info_ptr->valid |= PNG_INFO_oFFs; +} +#endif + +#ifdef PNG_pCAL_SUPPORTED +void PNGAPI +png_set_pCAL(png_structp png_ptr, png_infop info_ptr, + png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, + int nparams, png_const_charp units, png_charpp params) +{ + png_size_t length; + int i; + + png_debug1(1, "in %s storage function", "pCAL"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + length = png_strlen(purpose) + 1; + png_debug1(3, "allocating purpose for info (%lu bytes)", + (unsigned long)length); + + /* TODO: validate format of calibration name and unit name */ + + /* Check that the type matches the specification. */ + if (type < 0 || type > 3) + png_error(png_ptr, "Invalid pCAL equation type"); + + /* Validate params[nparams] */ + for (i=0; ipcal_purpose = (png_charp)png_malloc_warn(png_ptr, length); + + if (info_ptr->pcal_purpose == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL purpose"); + return; + } + + png_memcpy(info_ptr->pcal_purpose, purpose, length); + + png_debug(3, "storing X0, X1, type, and nparams in info"); + info_ptr->pcal_X0 = X0; + info_ptr->pcal_X1 = X1; + info_ptr->pcal_type = (png_byte)type; + info_ptr->pcal_nparams = (png_byte)nparams; + + length = png_strlen(units) + 1; + png_debug1(3, "allocating units for info (%lu bytes)", + (unsigned long)length); + + info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length); + + if (info_ptr->pcal_units == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL units"); + return; + } + + png_memcpy(info_ptr->pcal_units, units, length); + + info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr, + (png_size_t)((nparams + 1) * png_sizeof(png_charp))); + + if (info_ptr->pcal_params == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL params"); + return; + } + + png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp)); + + for (i = 0; i < nparams; i++) + { + length = png_strlen(params[i]) + 1; + png_debug2(3, "allocating parameter %d for info (%lu bytes)", i, + (unsigned long)length); + + info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length); + + if (info_ptr->pcal_params[i] == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL parameter"); + return; + } + + png_memcpy(info_ptr->pcal_params[i], params[i], length); + } + + info_ptr->valid |= PNG_INFO_pCAL; + info_ptr->free_me |= PNG_FREE_PCAL; +} +#endif + +#ifdef PNG_sCAL_SUPPORTED +void PNGAPI +png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr, + int unit, png_const_charp swidth, png_const_charp sheight) +{ + png_size_t lengthw = 0, lengthh = 0; + + png_debug1(1, "in %s storage function", "sCAL"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* Double check the unit (should never get here with an invalid + * unit unless this is an API call.) + */ + if (unit != 1 && unit != 2) + png_error(png_ptr, "Invalid sCAL unit"); + + if (swidth == NULL || (lengthw = png_strlen(swidth)) <= 0 || + swidth[0] == 45 /*'-'*/ || !png_check_fp_string(swidth, lengthw)) + png_error(png_ptr, "Invalid sCAL width"); + + if (sheight == NULL || (lengthh = png_strlen(sheight)) <= 0 || + sheight[0] == 45 /*'-'*/ || !png_check_fp_string(sheight, lengthh)) + png_error(png_ptr, "Invalid sCAL height"); + + info_ptr->scal_unit = (png_byte)unit; + + ++lengthw; + + png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthw); + + info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, lengthw); + + if (info_ptr->scal_s_width == NULL) + { + png_warning(png_ptr, "Memory allocation failed while processing sCAL"); + return; + } + + png_memcpy(info_ptr->scal_s_width, swidth, lengthw); + + ++lengthh; + + png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthh); + + info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, lengthh); + + if (info_ptr->scal_s_height == NULL) + { + png_free (png_ptr, info_ptr->scal_s_width); + info_ptr->scal_s_width = NULL; + + png_warning(png_ptr, "Memory allocation failed while processing sCAL"); + return; + } + + png_memcpy(info_ptr->scal_s_height, sheight, lengthh); + + info_ptr->valid |= PNG_INFO_sCAL; + info_ptr->free_me |= PNG_FREE_SCAL; +} + +# ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width, + double height) +{ + png_debug1(1, "in %s storage function", "sCAL"); + + /* Check the arguments. */ + if (width <= 0) + png_warning(png_ptr, "Invalid sCAL width ignored"); + + else if (height <= 0) + png_warning(png_ptr, "Invalid sCAL height ignored"); + + else + { + /* Convert 'width' and 'height' to ASCII. */ + char swidth[PNG_sCAL_MAX_DIGITS+1]; + char sheight[PNG_sCAL_MAX_DIGITS+1]; + + png_ascii_from_fp(png_ptr, swidth, sizeof swidth, width, + PNG_sCAL_PRECISION); + png_ascii_from_fp(png_ptr, sheight, sizeof sheight, height, + PNG_sCAL_PRECISION); + + png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight); + } +} +# endif + +# ifdef PNG_FIXED_POINT_SUPPORTED +void PNGAPI +png_set_sCAL_fixed(png_structp png_ptr, png_infop info_ptr, int unit, + png_fixed_point width, png_fixed_point height) +{ + png_debug1(1, "in %s storage function", "sCAL"); + + /* Check the arguments. */ + if (width <= 0) + png_warning(png_ptr, "Invalid sCAL width ignored"); + + else if (height <= 0) + png_warning(png_ptr, "Invalid sCAL height ignored"); + + else + { + /* Convert 'width' and 'height' to ASCII. */ + char swidth[PNG_sCAL_MAX_DIGITS+1]; + char sheight[PNG_sCAL_MAX_DIGITS+1]; + + png_ascii_from_fixed(png_ptr, swidth, sizeof swidth, width); + png_ascii_from_fixed(png_ptr, sheight, sizeof sheight, height); + + png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight); + } +} +# endif +#endif + +#ifdef PNG_pHYs_SUPPORTED +void PNGAPI +png_set_pHYs(png_structp png_ptr, png_infop info_ptr, + png_uint_32 res_x, png_uint_32 res_y, int unit_type) +{ + png_debug1(1, "in %s storage function", "pHYs"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->x_pixels_per_unit = res_x; + info_ptr->y_pixels_per_unit = res_y; + info_ptr->phys_unit_type = (png_byte)unit_type; + info_ptr->valid |= PNG_INFO_pHYs; +} +#endif + +void PNGAPI +png_set_PLTE(png_structp png_ptr, png_infop info_ptr, + png_const_colorp palette, int num_palette) +{ + + png_debug1(1, "in %s storage function", "PLTE"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH) + { + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + png_error(png_ptr, "Invalid palette length"); + + else + { + png_warning(png_ptr, "Invalid palette length"); + return; + } + } + + /* It may not actually be necessary to set png_ptr->palette here; + * we do it for backward compatibility with the way the png_handle_tRNS + * function used to do the allocation. + */ + png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); + + /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead + * of num_palette entries, in case of an invalid PNG file that has + * too-large sample values. + */ + png_ptr->palette = (png_colorp)png_calloc(png_ptr, + PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color)); + + png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color)); + info_ptr->palette = png_ptr->palette; + info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; + + info_ptr->free_me |= PNG_FREE_PLTE; + + info_ptr->valid |= PNG_INFO_PLTE; +} + +#ifdef PNG_sBIT_SUPPORTED +void PNGAPI +png_set_sBIT(png_structp png_ptr, png_infop info_ptr, + png_const_color_8p sig_bit) +{ + png_debug1(1, "in %s storage function", "sBIT"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8)); + info_ptr->valid |= PNG_INFO_sBIT; +} +#endif + +#ifdef PNG_sRGB_SUPPORTED +void PNGAPI +png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int srgb_intent) +{ + png_debug1(1, "in %s storage function", "sRGB"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->srgb_intent = (png_byte)srgb_intent; + info_ptr->valid |= PNG_INFO_sRGB; +} + +void PNGAPI +png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, + int srgb_intent) +{ + png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_set_sRGB(png_ptr, info_ptr, srgb_intent); + +# ifdef PNG_gAMA_SUPPORTED + png_set_gAMA_fixed(png_ptr, info_ptr, 45455L); +# endif + +# ifdef PNG_cHRM_SUPPORTED + png_set_cHRM_fixed(png_ptr, info_ptr, + /* color x y */ + /* white */ 31270L, 32900L, + /* red */ 64000L, 33000L, + /* green */ 30000L, 60000L, + /* blue */ 15000L, 6000L + ); +# endif /* cHRM */ +} +#endif /* sRGB */ + + +#ifdef PNG_iCCP_SUPPORTED +void PNGAPI +png_set_iCCP(png_structp png_ptr, png_infop info_ptr, + png_const_charp name, int compression_type, + png_const_bytep profile, png_uint_32 proflen) +{ + png_charp new_iccp_name; + png_bytep new_iccp_profile; + png_uint_32 length; + + png_debug1(1, "in %s storage function", "iCCP"); + + if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) + return; + + length = png_strlen(name)+1; + new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length); + + if (new_iccp_name == NULL) + { + png_warning(png_ptr, "Insufficient memory to process iCCP chunk"); + return; + } + + png_memcpy(new_iccp_name, name, length); + new_iccp_profile = (png_bytep)png_malloc_warn(png_ptr, proflen); + + if (new_iccp_profile == NULL) + { + png_free (png_ptr, new_iccp_name); + png_warning(png_ptr, + "Insufficient memory to process iCCP profile"); + return; + } + + png_memcpy(new_iccp_profile, profile, (png_size_t)proflen); + + png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0); + + info_ptr->iccp_proflen = proflen; + info_ptr->iccp_name = new_iccp_name; + info_ptr->iccp_profile = new_iccp_profile; + /* Compression is always zero but is here so the API and info structure + * does not have to change if we introduce multiple compression types + */ + info_ptr->iccp_compression = (png_byte)compression_type; + info_ptr->free_me |= PNG_FREE_ICCP; + info_ptr->valid |= PNG_INFO_iCCP; +} +#endif + +#ifdef PNG_TEXT_SUPPORTED +void PNGAPI +png_set_text(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr, + int num_text) +{ + int ret; + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); + + if (ret) + png_error(png_ptr, "Insufficient memory to store text"); +} + +int /* PRIVATE */ +png_set_text_2(png_structp png_ptr, png_infop info_ptr, + png_const_textp text_ptr, int num_text) +{ + int i; + + png_debug1(1, "in %s storage function", ((png_ptr == NULL || + png_ptr->chunk_name[0] == '\0') ? + "text" : (png_const_charp)png_ptr->chunk_name)); + + if (png_ptr == NULL || info_ptr == NULL || num_text == 0) + return(0); + + /* Make sure we have enough space in the "text" array in info_struct + * to hold all of the incoming text_ptr objects. + */ + if (info_ptr->num_text + num_text > info_ptr->max_text) + { + if (info_ptr->text != NULL) + { + png_textp old_text; + int old_max; + + old_max = info_ptr->max_text; + info_ptr->max_text = info_ptr->num_text + num_text + 8; + old_text = info_ptr->text; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, + (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); + + if (info_ptr->text == NULL) + { + png_free(png_ptr, old_text); + return(1); + } + + png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * + png_sizeof(png_text))); + png_free(png_ptr, old_text); + } + + else + { + info_ptr->max_text = num_text + 8; + info_ptr->num_text = 0; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, + (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); + if (info_ptr->text == NULL) + return(1); + info_ptr->free_me |= PNG_FREE_TEXT; + } + + png_debug1(3, "allocated %d entries for info_ptr->text", + info_ptr->max_text); + } + for (i = 0; i < num_text; i++) + { + png_size_t text_length, key_len; + png_size_t lang_len, lang_key_len; + png_textp textp = &(info_ptr->text[info_ptr->num_text]); + + if (text_ptr[i].key == NULL) + continue; + + if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE || + text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST) + { + png_warning(png_ptr, "text compression mode is out of range"); + continue; + } + + key_len = png_strlen(text_ptr[i].key); + + if (text_ptr[i].compression <= 0) + { + lang_len = 0; + lang_key_len = 0; + } + + else +# ifdef PNG_iTXt_SUPPORTED + { + /* Set iTXt data */ + + if (text_ptr[i].lang != NULL) + lang_len = png_strlen(text_ptr[i].lang); + + else + lang_len = 0; + + if (text_ptr[i].lang_key != NULL) + lang_key_len = png_strlen(text_ptr[i].lang_key); + + else + lang_key_len = 0; + } +# else /* PNG_iTXt_SUPPORTED */ + { + png_warning(png_ptr, "iTXt chunk not supported"); + continue; + } +# endif + + if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0') + { + text_length = 0; +# ifdef PNG_iTXt_SUPPORTED + if (text_ptr[i].compression > 0) + textp->compression = PNG_ITXT_COMPRESSION_NONE; + + else +# endif + textp->compression = PNG_TEXT_COMPRESSION_NONE; + } + + else + { + text_length = png_strlen(text_ptr[i].text); + textp->compression = text_ptr[i].compression; + } + + textp->key = (png_charp)png_malloc_warn(png_ptr, + (png_size_t) + (key_len + text_length + lang_len + lang_key_len + 4)); + + if (textp->key == NULL) + return(1); + + png_debug2(2, "Allocated %lu bytes at %p in png_set_text", + (unsigned long)(png_uint_32) + (key_len + lang_len + lang_key_len + text_length + 4), + textp->key); + + png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len)); + *(textp->key + key_len) = '\0'; + + if (text_ptr[i].compression > 0) + { + textp->lang = textp->key + key_len + 1; + png_memcpy(textp->lang, text_ptr[i].lang, lang_len); + *(textp->lang + lang_len) = '\0'; + textp->lang_key = textp->lang + lang_len + 1; + png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len); + *(textp->lang_key + lang_key_len) = '\0'; + textp->text = textp->lang_key + lang_key_len + 1; + } + + else + { + textp->lang=NULL; + textp->lang_key=NULL; + textp->text = textp->key + key_len + 1; + } + + if (text_length) + png_memcpy(textp->text, text_ptr[i].text, + (png_size_t)(text_length)); + + *(textp->text + text_length) = '\0'; + +# ifdef PNG_iTXt_SUPPORTED + if (textp->compression > 0) + { + textp->text_length = 0; + textp->itxt_length = text_length; + } + + else +# endif + { + textp->text_length = text_length; + textp->itxt_length = 0; + } + + info_ptr->num_text++; + png_debug1(3, "transferred text chunk %d", info_ptr->num_text); + } + return(0); +} +#endif + +#ifdef PNG_tIME_SUPPORTED +void PNGAPI +png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time) +{ + png_debug1(1, "in %s storage function", "tIME"); + + if (png_ptr == NULL || info_ptr == NULL || + (png_ptr->mode & PNG_WROTE_tIME)) + return; + + png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time)); + info_ptr->valid |= PNG_INFO_tIME; +} +#endif + +#ifdef PNG_tRNS_SUPPORTED +void PNGAPI +png_set_tRNS(png_structp png_ptr, png_infop info_ptr, + png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color) +{ + png_debug1(1, "in %s storage function", "tRNS"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (trans_alpha != NULL) + { + /* It may not actually be necessary to set png_ptr->trans_alpha here; + * we do it for backward compatibility with the way the png_handle_tRNS + * function used to do the allocation. + */ + + png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); + + /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */ + png_ptr->trans_alpha = info_ptr->trans_alpha = + (png_bytep)png_malloc(png_ptr, (png_size_t)PNG_MAX_PALETTE_LENGTH); + + if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) + png_memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans); + } + + if (trans_color != NULL) + { + int sample_max = (1 << info_ptr->bit_depth); + + if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && + (int)trans_color->gray > sample_max) || + (info_ptr->color_type == PNG_COLOR_TYPE_RGB && + ((int)trans_color->red > sample_max || + (int)trans_color->green > sample_max || + (int)trans_color->blue > sample_max))) + png_warning(png_ptr, + "tRNS chunk has out-of-range samples for bit_depth"); + + png_memcpy(&(info_ptr->trans_color), trans_color, + png_sizeof(png_color_16)); + + if (num_trans == 0) + num_trans = 1; + } + + info_ptr->num_trans = (png_uint_16)num_trans; + + if (num_trans != 0) + { + info_ptr->valid |= PNG_INFO_tRNS; + info_ptr->free_me |= PNG_FREE_TRNS; + } +} +#endif + +#ifdef PNG_sPLT_SUPPORTED +void PNGAPI +png_set_sPLT(png_structp png_ptr, + png_infop info_ptr, png_const_sPLT_tp entries, int nentries) +/* + * entries - array of png_sPLT_t structures + * to be added to the list of palettes + * in the info structure. + * + * nentries - number of palette structures to be + * added. + */ +{ + png_sPLT_tp np; + int i; + + if (png_ptr == NULL || info_ptr == NULL) + return; + + np = (png_sPLT_tp)png_malloc_warn(png_ptr, + (info_ptr->splt_palettes_num + nentries) * + (png_size_t)png_sizeof(png_sPLT_t)); + + if (np == NULL) + { + png_warning(png_ptr, "No memory for sPLT palettes"); + return; + } + + png_memcpy(np, info_ptr->splt_palettes, + info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); + + png_free(png_ptr, info_ptr->splt_palettes); + info_ptr->splt_palettes=NULL; + + for (i = 0; i < nentries; i++) + { + png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; + png_const_sPLT_tp from = entries + i; + png_uint_32 length; + + length = png_strlen(from->name) + 1; + to->name = (png_charp)png_malloc_warn(png_ptr, (png_size_t)length); + + if (to->name == NULL) + { + png_warning(png_ptr, + "Out of memory while processing sPLT chunk"); + continue; + } + + png_memcpy(to->name, from->name, length); + to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, + (png_size_t)(from->nentries * png_sizeof(png_sPLT_entry))); + + if (to->entries == NULL) + { + png_warning(png_ptr, + "Out of memory while processing sPLT chunk"); + png_free(png_ptr, to->name); + to->name = NULL; + continue; + } + + png_memcpy(to->entries, from->entries, + from->nentries * png_sizeof(png_sPLT_entry)); + + to->nentries = from->nentries; + to->depth = from->depth; + } + + info_ptr->splt_palettes = np; + info_ptr->splt_palettes_num += nentries; + info_ptr->valid |= PNG_INFO_sPLT; + info_ptr->free_me |= PNG_FREE_SPLT; +} +#endif /* PNG_sPLT_SUPPORTED */ + +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +void PNGAPI +png_set_unknown_chunks(png_structp png_ptr, + png_infop info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns) +{ + png_unknown_chunkp np; + int i; + + if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) + return; + + np = (png_unknown_chunkp)png_malloc_warn(png_ptr, + (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) * + png_sizeof(png_unknown_chunk)); + + if (np == NULL) + { + png_warning(png_ptr, + "Out of memory while processing unknown chunk"); + return; + } + + png_memcpy(np, info_ptr->unknown_chunks, + (png_size_t)info_ptr->unknown_chunks_num * + png_sizeof(png_unknown_chunk)); + + png_free(png_ptr, info_ptr->unknown_chunks); + info_ptr->unknown_chunks = NULL; + + for (i = 0; i < num_unknowns; i++) + { + png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; + png_const_unknown_chunkp from = unknowns + i; + + png_memcpy(to->name, from->name, png_sizeof(from->name)); + to->name[png_sizeof(to->name)-1] = '\0'; + to->size = from->size; + + /* Note our location in the read or write sequence */ + to->location = (png_byte)(png_ptr->mode & 0xff); + + if (from->size == 0) + to->data=NULL; + + else + { + to->data = (png_bytep)png_malloc_warn(png_ptr, + (png_size_t)from->size); + + if (to->data == NULL) + { + png_warning(png_ptr, + "Out of memory while processing unknown chunk"); + to->size = 0; + } + + else + png_memcpy(to->data, from->data, from->size); + } + } + + info_ptr->unknown_chunks = np; + info_ptr->unknown_chunks_num += num_unknowns; + info_ptr->free_me |= PNG_FREE_UNKN; +} + +void PNGAPI +png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr, + int chunk, int location) +{ + if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < + info_ptr->unknown_chunks_num) + info_ptr->unknown_chunks[chunk].location = (png_byte)location; +} +#endif + + +#ifdef PNG_MNG_FEATURES_SUPPORTED +png_uint_32 PNGAPI +png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features) +{ + png_debug(1, "in png_permit_mng_features"); + + if (png_ptr == NULL) + return (png_uint_32)0; + + png_ptr->mng_features_permitted = + (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); + + return (png_uint_32)png_ptr->mng_features_permitted; +} +#endif + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +void PNGAPI +png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_const_bytep + chunk_list, int num_chunks) +{ + png_bytep new_list, p; + int i, old_num_chunks; + if (png_ptr == NULL) + return; + + if (num_chunks == 0) + { + if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) + png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; + + else + png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; + + if (keep == PNG_HANDLE_CHUNK_ALWAYS) + png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; + + else + png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; + + return; + } + + if (chunk_list == NULL) + return; + + old_num_chunks = png_ptr->num_chunk_list; + new_list=(png_bytep)png_malloc(png_ptr, + (png_size_t)(5*(num_chunks + old_num_chunks))); + + if (png_ptr->chunk_list != NULL) + { + png_memcpy(new_list, png_ptr->chunk_list, + (png_size_t)(5*old_num_chunks)); + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list=NULL; + } + + png_memcpy(new_list + 5*old_num_chunks, chunk_list, + (png_size_t)(5*num_chunks)); + + for (p = new_list + 5*old_num_chunks + 4, i = 0; inum_chunk_list = old_num_chunks + num_chunks; + png_ptr->chunk_list = new_list; + png_ptr->free_me |= PNG_FREE_LIST; +} +#endif + +#ifdef PNG_READ_USER_CHUNKS_SUPPORTED +void PNGAPI +png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr, + png_user_chunk_ptr read_user_chunk_fn) +{ + png_debug(1, "in png_set_read_user_chunk_fn"); + + if (png_ptr == NULL) + return; + + png_ptr->read_user_chunk_fn = read_user_chunk_fn; + png_ptr->user_chunk_ptr = user_chunk_ptr; +} +#endif + +#ifdef PNG_INFO_IMAGE_SUPPORTED +void PNGAPI +png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) +{ + png_debug1(1, "in %s storage function", "rows"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) + png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); + + info_ptr->row_pointers = row_pointers; + + if (row_pointers) + info_ptr->valid |= PNG_INFO_IDAT; +} +#endif + +void PNGAPI +png_set_compression_buffer_size(png_structp png_ptr, png_size_t size) +{ + if (png_ptr == NULL) + return; + + png_free(png_ptr, png_ptr->zbuf); + + if (size > ZLIB_IO_MAX) + { + png_warning(png_ptr, "Attempt to set buffer size beyond max ignored"); + png_ptr->zbuf_size = ZLIB_IO_MAX; + size = ZLIB_IO_MAX; /* must fit */ + } + + else + png_ptr->zbuf_size = (uInt)size; + + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size); + + /* The following ensures a relatively safe failure if this gets called while + * the buffer is actually in use. + */ + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = 0; + png_ptr->zstream.avail_in = 0; +} + +void PNGAPI +png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask) +{ + if (png_ptr && info_ptr) + info_ptr->valid &= ~mask; +} + + + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +/* This function was added to libpng 1.2.6 */ +void PNGAPI +png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max, + png_uint_32 user_height_max) +{ + /* Images with dimensions larger than these limits will be + * rejected by png_set_IHDR(). To accept any PNG datastream + * regardless of dimensions, set both limits to 0x7ffffffL. + */ + if (png_ptr == NULL) + return; + + png_ptr->user_width_max = user_width_max; + png_ptr->user_height_max = user_height_max; +} + +/* This function was added to libpng 1.4.0 */ +void PNGAPI +png_set_chunk_cache_max (png_structp png_ptr, + png_uint_32 user_chunk_cache_max) +{ + if (png_ptr) + png_ptr->user_chunk_cache_max = user_chunk_cache_max; +} + +/* This function was added to libpng 1.4.1 */ +void PNGAPI +png_set_chunk_malloc_max (png_structp png_ptr, + png_alloc_size_t user_chunk_malloc_max) +{ + if (png_ptr) + png_ptr->user_chunk_malloc_max = user_chunk_malloc_max; +} +#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ + + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED +void PNGAPI +png_set_benign_errors(png_structp png_ptr, int allowed) +{ + png_debug(1, "in png_set_benign_errors"); + + if (allowed) + png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN; + + else + png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN; +} +#endif /* PNG_BENIGN_ERRORS_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngstruct.h b/src/3rdparty/libpng/pngstruct.h new file mode 100644 index 0000000000..8d781faefe --- /dev/null +++ b/src/3rdparty/libpng/pngstruct.h @@ -0,0 +1,308 @@ + +/* pngstruct.h - header file for PNG reference library + * + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* The structure that holds the information to read and write PNG files. + * The only people who need to care about what is inside of this are the + * people who will be modifying the library for their own special needs. + * It should NOT be accessed directly by an application. + */ + +#ifndef PNGSTRUCT_H +#define PNGSTRUCT_H +/* zlib.h defines the structure z_stream, an instance of which is included + * in this structure and is required for decompressing the LZ compressed + * data in PNG files. + */ +#include "zlib.h" + +struct png_struct_def +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf png_jmpbuf; /* used in png_error */ + png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */ +#endif + png_error_ptr error_fn; /* function for printing errors and aborting */ + png_error_ptr warning_fn; /* function for printing warnings */ + png_voidp error_ptr; /* user supplied struct for error functions */ + png_rw_ptr write_data_fn; /* function for writing output data */ + png_rw_ptr read_data_fn; /* function for reading input data */ + png_voidp io_ptr; /* ptr to application struct for I/O functions */ + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + png_user_transform_ptr read_user_transform_fn; /* user read transform */ +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED + png_user_transform_ptr write_user_transform_fn; /* user write transform */ +#endif + +/* These were added in libpng-1.0.2 */ +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_voidp user_transform_ptr; /* user supplied struct for user transform */ + png_byte user_transform_depth; /* bit depth of user transformed pixels */ + png_byte user_transform_channels; /* channels in user transformed pixels */ +#endif +#endif + + png_uint_32 mode; /* tells us where we are in the PNG file */ + png_uint_32 flags; /* flags indicating various things to libpng */ + png_uint_32 transformations; /* which transformations to perform */ + + z_stream zstream; /* pointer to decompression structure (below) */ + png_bytep zbuf; /* buffer for zlib */ + uInt zbuf_size; /* size of zbuf (typically 65536) */ + int zlib_level; /* holds zlib compression level */ + int zlib_method; /* holds zlib compression method */ + int zlib_window_bits; /* holds zlib compression window bits */ + int zlib_mem_level; /* holds zlib compression memory level */ + int zlib_strategy; /* holds zlib compression strategy */ + + png_uint_32 width; /* width of image in pixels */ + png_uint_32 height; /* height of image in pixels */ + png_uint_32 num_rows; /* number of rows in current pass */ + png_uint_32 usr_width; /* width of row at start of write */ + png_size_t rowbytes; /* size of row in bytes */ + png_uint_32 iwidth; /* width of current interlaced row in pixels */ + png_uint_32 row_number; /* current row in interlace pass */ + png_bytep prev_row; /* buffer to save previous (unfiltered) row */ + png_bytep row_buf; /* buffer to save current (unfiltered) row */ + png_bytep sub_row; /* buffer to save "sub" row when filtering */ + png_bytep up_row; /* buffer to save "up" row when filtering */ + png_bytep avg_row; /* buffer to save "avg" row when filtering */ + png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ + png_row_info row_info; /* used for transformation routines */ + + png_uint_32 idat_size; /* current IDAT size for read */ + png_uint_32 crc; /* current chunk CRC value */ + png_colorp palette; /* palette from the input file */ + png_uint_16 num_palette; /* number of color entries in palette */ + png_uint_16 num_trans; /* number of transparency values */ + png_byte chunk_name[5]; /* null-terminated name of current chunk */ + png_byte compression; /* file compression type (always 0) */ + png_byte filter; /* file filter type (always 0) */ + png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + png_byte pass; /* current interlace pass (0 - 6) */ + png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ + png_byte color_type; /* color type of file */ + png_byte bit_depth; /* bit depth of file */ + png_byte usr_bit_depth; /* bit depth of users row */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte channels; /* number of channels in file */ + png_byte usr_channels; /* channels at start of write */ + png_byte sig_bytes; /* magic bytes read/written from start of file */ + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) + png_uint_16 filler; /* filler bytes for pixel expansion */ +#endif + +#ifdef PNG_bKGD_SUPPORTED + png_byte background_gamma_type; + png_fixed_point background_gamma; + png_color_16 background; /* background color in screen gamma space */ +#ifdef PNG_READ_GAMMA_SUPPORTED + png_color_16 background_1; /* background normalized to gamma 1.0 */ +#endif +#endif /* PNG_bKGD_SUPPORTED */ + +#ifdef PNG_WRITE_FLUSH_SUPPORTED + png_flush_ptr output_flush_fn; /* Function for flushing output */ + png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ + png_uint_32 flush_rows; /* number of rows written since last flush */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + int gamma_shift; /* number of "insignificant" bits in 16-bit gamma */ + png_fixed_point gamma; /* file gamma value */ + png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep gamma_table; /* gamma table for 8-bit depth files */ + png_bytep gamma_from_1; /* converts from 1.0 to screen */ + png_bytep gamma_to_1; /* converts from file to 1.0 */ + png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ + png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ + png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) + png_color_8 sig_bit; /* significant bits in each available channel */ +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) + png_color_8 shift; /* shift for significant bit tranformation */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ + || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep trans_alpha; /* alpha values for paletted files */ + png_color_16 trans_color; /* transparent color for non-paletted files */ +#endif + + png_read_status_ptr read_row_fn; /* called after each row is decoded */ + png_write_status_ptr write_row_fn; /* called after each row is encoded */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_progressive_info_ptr info_fn; /* called after header data fully read */ + png_progressive_row_ptr row_fn; /* called after a prog. row is decoded */ + png_progressive_end_ptr end_fn; /* called after image is complete */ + png_bytep save_buffer_ptr; /* current location in save_buffer */ + png_bytep save_buffer; /* buffer for previously read data */ + png_bytep current_buffer_ptr; /* current location in current_buffer */ + png_bytep current_buffer; /* buffer for recently used data */ + png_uint_32 push_length; /* size of current input chunk */ + png_uint_32 skip_length; /* bytes to skip in input data */ + png_size_t save_buffer_size; /* amount of data now in save_buffer */ + png_size_t save_buffer_max; /* total size of save_buffer */ + png_size_t buffer_size; /* total amount of available input data */ + png_size_t current_buffer_size; /* amount of data now in current_buffer */ + int process_mode; /* what push library is currently doing */ + int cur_palette; /* current push library palette index */ + +# ifdef PNG_TEXT_SUPPORTED + png_size_t current_text_size; /* current size of text input data */ + png_size_t current_text_left; /* how much text left to read in input */ + png_charp current_text; /* current text chunk buffer */ + png_charp current_text_ptr; /* current location in current_text */ +# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ + +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* For the Borland special 64K segment handler */ + png_bytepp offset_table_ptr; + png_bytep offset_table; + png_uint_16 offset_table_number; + png_uint_16 offset_table_count; + png_uint_16 offset_table_count_free; +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED + png_bytep palette_lookup; /* lookup table for quantizing */ + png_bytep quantize_index; /* index translation for palette files */ +#endif + +#if defined(PNG_READ_QUANTIZE_SUPPORTED) || defined(PNG_hIST_SUPPORTED) + png_uint_16p hist; /* histogram */ +#endif + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + png_byte heuristic_method; /* heuristic for row filter selection */ + png_byte num_prev_filters; /* number of weights for previous rows */ + png_bytep prev_filters; /* filter type(s) of previous row(s) */ + png_uint_16p filter_weights; /* weight(s) for previous line(s) */ + png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ + png_uint_16p filter_costs; /* relative filter calculation cost */ + png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED + png_charp time_buffer; /* String to hold RFC 1123 time text */ +#endif + +/* New members added in libpng-1.0.6 */ + + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ + +#ifdef PNG_USER_CHUNKS_SUPPORTED + png_voidp user_chunk_ptr; + png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ +#endif + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + int num_chunk_list; + png_bytep chunk_list; +#endif + +/* New members added in libpng-1.0.3 */ +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED + png_byte rgb_to_gray_status; + /* These were changed from png_byte in libpng-1.0.6 */ + png_uint_16 rgb_to_gray_red_coeff; + png_uint_16 rgb_to_gray_green_coeff; + png_uint_16 rgb_to_gray_blue_coeff; +#endif + +/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ + defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* Changed from png_byte to png_uint_32 at version 1.2.0 */ + png_uint_32 mng_features_permitted; +#endif + +/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ +#ifdef PNG_MNG_FEATURES_SUPPORTED + png_byte filter_type; +#endif + +/* New members added in libpng-1.2.0 */ + +/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ +#ifdef PNG_USER_MEM_SUPPORTED + png_voidp mem_ptr; /* user supplied struct for mem functions */ + png_malloc_ptr malloc_fn; /* function for allocating memory */ + png_free_ptr free_fn; /* function for freeing memory */ +#endif + +/* New member added in libpng-1.0.13 and 1.2.0 */ + png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* The following three members were added at version 1.0.14 and 1.2.4 */ + png_bytep quantize_sort; /* working sort array */ + png_bytep index_to_palette; /* where the original index currently is + in the palette */ + png_bytep palette_to_index; /* which original index points to this + palette color */ +#endif + +/* New members added in libpng-1.0.16 and 1.2.6 */ + png_byte compression_type; + +#ifdef PNG_USER_LIMITS_SUPPORTED + png_uint_32 user_width_max; + png_uint_32 user_height_max; + + /* Added in libpng-1.4.0: Total number of sPLT, text, and unknown + * chunks that can be stored (0 means unlimited). + */ + png_uint_32 user_chunk_cache_max; + + /* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk + * can occupy when decompressed. 0 means unlimited. + */ + png_alloc_size_t user_chunk_malloc_max; +#endif + +/* New member added in libpng-1.0.25 and 1.2.17 */ +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + /* Storage for unknown chunk that the library doesn't recognize. */ + png_unknown_chunk unknown_chunk; +#endif + +/* New members added in libpng-1.2.26 */ + png_size_t old_big_row_buf_size; + png_size_t old_prev_row_size; + +/* New member added in libpng-1.2.30 */ + png_charp chunkdata; /* buffer for reading chunk data */ + +#ifdef PNG_IO_STATE_SUPPORTED +/* New member added in libpng-1.4.0 */ + png_uint_32 io_state; +#endif +}; +#endif /* PNGSTRUCT_H */ diff --git a/src/3rdparty/libpng/pngtest.c b/src/3rdparty/libpng/pngtest.c new file mode 100644 index 0000000000..cbb7eb276f --- /dev/null +++ b/src/3rdparty/libpng/pngtest.c @@ -0,0 +1,1787 @@ + +/* pngtest.c - a simple test program to test libpng + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This program reads in a PNG image, writes it out again, and then + * compares the two files. If the files are identical, this shows that + * the basic chunk handling, filtering, and (de)compression code is working + * properly. It does not currently test all of the transforms, although + * it probably should. + * + * The program will report "FAIL" in certain legitimate cases: + * 1) when the compression level or filter selection method is changed. + * 2) when the maximum IDAT size (PNG_ZBUF_SIZE in pngconf.h) is not 8192. + * 3) unknown unsafe-to-copy ancillary chunks or unknown critical chunks + * exist in the input file. + * 4) others not listed here... + * In these cases, it is best to check with another tool such as "pngcheck" + * to see what the differences between the two files are. + * + * If a filename is given on the command-line, then this file is used + * for the input, rather than the default "pngtest.png". This allows + * testing a wide variety of files easily. You can also test a number + * of files at once by typing "pngtest -m file1.png file2.png ..." + */ + +#include "zlib.h" +#include "png.h" +/* Copied from pngpriv.h but only used in error messages below. */ +#ifndef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 8192 +#endif +# include +# include +# include +# define FCLOSE(file) fclose(file) + +#ifndef PNG_STDIO_SUPPORTED +typedef FILE * png_FILE_p; +#endif + +/* Makes pngtest verbose so we can find problems. */ +#ifndef PNG_DEBUG +# define PNG_DEBUG 0 +#endif + +#if PNG_DEBUG > 1 +# define pngtest_debug(m) ((void)fprintf(stderr, m "\n")) +# define pngtest_debug1(m,p1) ((void)fprintf(stderr, m "\n", p1)) +# define pngtest_debug2(m,p1,p2) ((void)fprintf(stderr, m "\n", p1, p2)) +#else +# define pngtest_debug(m) ((void)0) +# define pngtest_debug1(m,p1) ((void)0) +# define pngtest_debug2(m,p1,p2) ((void)0) +#endif + +#if !PNG_DEBUG +# define SINGLE_ROWBUF_ALLOC /* Makes buffer overruns easier to nail */ +#endif + +/* The code uses memcmp and memcpy on large objects (typically row pointers) so + * it is necessary to do soemthing special on certain architectures, note that + * the actual support for this was effectively removed in 1.4, so only the + * memory remains in this program: + */ +#define CVT_PTR(ptr) (ptr) +#define CVT_PTR_NOCHECK(ptr) (ptr) +#define png_memcmp memcmp +#define png_memcpy memcpy +#define png_memset memset + +/* Turn on CPU timing +#define PNGTEST_TIMING +*/ + +#ifndef PNG_FLOATING_POINT_SUPPORTED +#undef PNGTEST_TIMING +#endif + +#ifdef PNGTEST_TIMING +static float t_start, t_stop, t_decode, t_encode, t_misc; +#include +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED +#define PNG_tIME_STRING_LENGTH 29 +static int tIME_chunk_present = 0; +static char tIME_string[PNG_tIME_STRING_LENGTH] = "tIME chunk is not present"; +#endif + +static int verbose = 0; + +int test_one_file PNGARG((PNG_CONST char *inname, PNG_CONST char *outname)); + +#ifdef __TURBOC__ +#include +#endif + +/* Defined so I can write to a file on gui/windowing platforms */ +/* #define STDERR stderr */ +#define STDERR stdout /* For DOS */ + +/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */ +#ifndef png_jmpbuf +# define png_jmpbuf(png_ptr) png_ptr->jmpbuf +#endif + +/* Example of using row callbacks to make a simple progress meter */ +static int status_pass = 1; +static int status_dots_requested = 0; +static int status_dots = 1; + +void PNGCBAPI +read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass); +void PNGCBAPI +read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass) +{ + if (png_ptr == NULL || row_number > PNG_UINT_31_MAX) + return; + + if (status_pass != pass) + { + fprintf(stdout, "\n Pass %d: ", pass); + status_pass = pass; + status_dots = 31; + } + + status_dots--; + + if (status_dots == 0) + { + fprintf(stdout, "\n "); + status_dots=30; + } + + fprintf(stdout, "r"); +} + +void PNGCBAPI +write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass); +void PNGCBAPI +write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass) +{ + if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7) + return; + + fprintf(stdout, "w"); +} + + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED +/* Example of using user transform callback (we don't transform anything, + * but merely examine the row filters. We set this to 256 rather than + * 5 in case illegal filter values are present.) + */ +static png_uint_32 filters_used[256]; +void PNGCBAPI +count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data); +void PNGCBAPI +count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data) +{ + if (png_ptr != NULL && row_info != NULL) + ++filters_used[*(data - 1)]; +} +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED +/* Example of using user transform callback (we don't transform anything, + * but merely count the zero samples) + */ + +static png_uint_32 zero_samples; + +void PNGCBAPI +count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data); +void PNGCBAPI +count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data) +{ + png_bytep dp = data; + if (png_ptr == NULL) + return; + + /* Contents of row_info: + * png_uint_32 width width of row + * png_uint_32 rowbytes number of bytes in row + * png_byte color_type color type of pixels + * png_byte bit_depth bit depth of samples + * png_byte channels number of channels (1-4) + * png_byte pixel_depth bits per pixel (depth*channels) + */ + + /* Counts the number of zero samples (or zero pixels if color_type is 3 */ + + if (row_info->color_type == 0 || row_info->color_type == 3) + { + int pos = 0; + png_uint_32 n, nstop; + + for (n = 0, nstop=row_info->width; nbit_depth == 1) + { + if (((*dp << pos++ ) & 0x80) == 0) + zero_samples++; + + if (pos == 8) + { + pos = 0; + dp++; + } + } + + if (row_info->bit_depth == 2) + { + if (((*dp << (pos+=2)) & 0xc0) == 0) + zero_samples++; + + if (pos == 8) + { + pos = 0; + dp++; + } + } + + if (row_info->bit_depth == 4) + { + if (((*dp << (pos+=4)) & 0xf0) == 0) + zero_samples++; + + if (pos == 8) + { + pos = 0; + dp++; + } + } + + if (row_info->bit_depth == 8) + if (*dp++ == 0) + zero_samples++; + + if (row_info->bit_depth == 16) + { + if ((*dp | *(dp+1)) == 0) + zero_samples++; + dp+=2; + } + } + } + else /* Other color types */ + { + png_uint_32 n, nstop; + int channel; + int color_channels = row_info->channels; + if (row_info->color_type > 3)color_channels--; + + for (n = 0, nstop=row_info->width; nbit_depth == 8) + if (*dp++ == 0) + zero_samples++; + + if (row_info->bit_depth == 16) + { + if ((*dp | *(dp+1)) == 0) + zero_samples++; + + dp+=2; + } + } + if (row_info->color_type > 3) + { + dp++; + if (row_info->bit_depth == 16) + dp++; + } + } + } +} +#endif /* PNG_WRITE_USER_TRANSFORM_SUPPORTED */ + +static int wrote_question = 0; + +#ifndef PNG_STDIO_SUPPORTED +/* START of code to validate stdio-free compilation */ +/* These copies of the default read/write functions come from pngrio.c and + * pngwio.c. They allow "don't include stdio" testing of the library. + * This is the function that does the actual reading of data. If you are + * not reading from a standard C stream, you should create a replacement + * read_data function and use it at run time with png_set_read_fn(), rather + * than changing the library. + */ + +#ifdef PNG_IO_STATE_SUPPORTED +void +pngtest_check_io_state(png_structp png_ptr, png_size_t data_length, + png_uint_32 io_op); +void +pngtest_check_io_state(png_structp png_ptr, png_size_t data_length, + png_uint_32 io_op) +{ + png_uint_32 io_state = png_get_io_state(png_ptr); + int err = 0; + + /* Check if the current operation (reading / writing) is as expected. */ + if ((io_state & PNG_IO_MASK_OP) != io_op) + png_error(png_ptr, "Incorrect operation in I/O state"); + + /* Check if the buffer size specific to the current location + * (file signature / header / data / crc) is as expected. + */ + switch (io_state & PNG_IO_MASK_LOC) + { + case PNG_IO_SIGNATURE: + if (data_length > 8) + err = 1; + break; + case PNG_IO_CHUNK_HDR: + if (data_length != 8) + err = 1; + break; + case PNG_IO_CHUNK_DATA: + break; /* no restrictions here */ + case PNG_IO_CHUNK_CRC: + if (data_length != 4) + err = 1; + break; + default: + err = 1; /* uninitialized */ + } + if (err) + png_error(png_ptr, "Bad I/O state or buffer size"); +} +#endif + +#ifndef USE_FAR_KEYWORD +static void PNGCBAPI +pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check = 0; + png_voidp io_ptr; + + /* fread() returns 0 on error, so it is OK to store this in a png_size_t + * instead of an int, which is what fread() actually returns. + */ + io_ptr = png_get_io_ptr(png_ptr); + if (io_ptr != NULL) + { + check = fread(data, 1, length, (png_FILE_p)io_ptr); + } + + if (check != length) + { + png_error(png_ptr, "Read Error"); + } + +#ifdef PNG_IO_STATE_SUPPORTED + pngtest_check_io_state(png_ptr, length, PNG_IO_READING); +#endif +} +#else +/* This is the model-independent version. Since the standard I/O library + can't handle far buffers in the medium and small models, we have to copy + the data. +*/ + +#define NEAR_BUF_SIZE 1024 +#define MIN(a,b) (a <= b ? a : b) + +static void PNGCBAPI +pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + png_byte *n_data; + png_FILE_p io_ptr; + + /* Check if data really is near. If so, use usual code. */ + n_data = (png_byte *)CVT_PTR_NOCHECK(data); + io_ptr = (png_FILE_p)CVT_PTR(png_get_io_ptr(png_ptr)); + if ((png_bytep)n_data == data) + { + check = fread(n_data, 1, length, io_ptr); + } + else + { + png_byte buf[NEAR_BUF_SIZE]; + png_size_t read, remaining, err; + check = 0; + remaining = length; + + do + { + read = MIN(NEAR_BUF_SIZE, remaining); + err = fread(buf, 1, 1, io_ptr); + png_memcpy(data, buf, read); /* Copy far buffer to near buffer */ + if (err != read) + break; + else + check += err; + data += read; + remaining -= read; + } + while (remaining != 0); + } + + if (check != length) + png_error(png_ptr, "Read Error"); + +#ifdef PNG_IO_STATE_SUPPORTED + pngtest_check_io_state(png_ptr, length, PNG_IO_READING); +#endif +} +#endif /* USE_FAR_KEYWORD */ + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +static void PNGCBAPI +pngtest_flush(png_structp png_ptr) +{ + /* Do nothing; fflush() is said to be just a waste of energy. */ + PNG_UNUSED(png_ptr) /* Stifle compiler warning */ +} +#endif + +/* This is the function that does the actual writing of data. If you are + * not writing to a standard C stream, you should create a replacement + * write_data function and use it at run time with png_set_write_fn(), rather + * than changing the library. + */ +#ifndef USE_FAR_KEYWORD +static void PNGCBAPI +pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + + check = fwrite(data, 1, length, (png_FILE_p)png_get_io_ptr(png_ptr)); + + if (check != length) + { + png_error(png_ptr, "Write Error"); + } + +#ifdef PNG_IO_STATE_SUPPORTED + pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING); +#endif +} +#else +/* This is the model-independent version. Since the standard I/O library + can't handle far buffers in the medium and small models, we have to copy + the data. +*/ + +#define NEAR_BUF_SIZE 1024 +#define MIN(a,b) (a <= b ? a : b) + +static void PNGCBAPI +pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */ + png_FILE_p io_ptr; + + /* Check if data really is near. If so, use usual code. */ + near_data = (png_byte *)CVT_PTR_NOCHECK(data); + io_ptr = (png_FILE_p)CVT_PTR(png_get_io_ptr(png_ptr)); + + if ((png_bytep)near_data == data) + { + check = fwrite(near_data, 1, length, io_ptr); + } + + else + { + png_byte buf[NEAR_BUF_SIZE]; + png_size_t written, remaining, err; + check = 0; + remaining = length; + + do + { + written = MIN(NEAR_BUF_SIZE, remaining); + png_memcpy(buf, data, written); /* Copy far buffer to near buffer */ + err = fwrite(buf, 1, written, io_ptr); + if (err != written) + break; + else + check += err; + data += written; + remaining -= written; + } + while (remaining != 0); + } + + if (check != length) + { + png_error(png_ptr, "Write Error"); + } + +#ifdef PNG_IO_STATE_SUPPORTED + pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING); +#endif +} +#endif /* USE_FAR_KEYWORD */ + +/* This function is called when there is a warning, but the library thinks + * it can continue anyway. Replacement functions don't have to do anything + * here if you don't want to. In the default configuration, png_ptr is + * not used, but it is passed in case it may be useful. + */ +static void PNGCBAPI +pngtest_warning(png_structp png_ptr, png_const_charp message) +{ + PNG_CONST char *name = "UNKNOWN (ERROR!)"; + char *test; + test = png_get_error_ptr(png_ptr); + + if (test == NULL) + fprintf(STDERR, "%s: libpng warning: %s\n", name, message); + + else + fprintf(STDERR, "%s: libpng warning: %s\n", test, message); +} + +/* This is the default error handling function. Note that replacements for + * this function MUST NOT RETURN, or the program will likely crash. This + * function is used by default, or if the program supplies NULL for the + * error function pointer in png_set_error_fn(). + */ +static void PNGCBAPI +pngtest_error(png_structp png_ptr, png_const_charp message) +{ + pngtest_warning(png_ptr, message); + /* We can return because png_error calls the default handler, which is + * actually OK in this case. + */ +} +#endif /* !PNG_STDIO_SUPPORTED */ +/* END of code to validate stdio-free compilation */ + +/* START of code to validate memory allocation and deallocation */ +#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG + +/* Allocate memory. For reasonable files, size should never exceed + * 64K. However, zlib may allocate more then 64K if you don't tell + * it not to. See zconf.h and png.h for more information. zlib does + * need to allocate exactly 64K, so whatever you call here must + * have the ability to do that. + * + * This piece of code can be compiled to validate max 64K allocations + * by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K. + */ +typedef struct memory_information +{ + png_alloc_size_t size; + png_voidp pointer; + struct memory_information FAR *next; +} memory_information; +typedef memory_information FAR *memory_infop; + +static memory_infop pinformation = NULL; +static int current_allocation = 0; +static int maximum_allocation = 0; +static int total_allocation = 0; +static int num_allocations = 0; + +png_voidp PNGCBAPI png_debug_malloc PNGARG((png_structp png_ptr, + png_alloc_size_t size)); +void PNGCBAPI png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr)); + +png_voidp +PNGCBAPI png_debug_malloc(png_structp png_ptr, png_alloc_size_t size) +{ + + /* png_malloc has already tested for NULL; png_create_struct calls + * png_debug_malloc directly, with png_ptr == NULL which is OK + */ + + if (size == 0) + return (NULL); + + /* This calls the library allocator twice, once to get the requested + buffer and once to get a new free list entry. */ + { + /* Disable malloc_fn and free_fn */ + memory_infop pinfo; + png_set_mem_fn(png_ptr, NULL, NULL, NULL); + pinfo = (memory_infop)png_malloc(png_ptr, + png_sizeof(*pinfo)); + pinfo->size = size; + current_allocation += size; + total_allocation += size; + num_allocations ++; + + if (current_allocation > maximum_allocation) + maximum_allocation = current_allocation; + + pinfo->pointer = png_malloc(png_ptr, size); + /* Restore malloc_fn and free_fn */ + + png_set_mem_fn(png_ptr, + NULL, png_debug_malloc, png_debug_free); + + if (size != 0 && pinfo->pointer == NULL) + { + current_allocation -= size; + total_allocation -= size; + png_error(png_ptr, + "out of memory in pngtest->png_debug_malloc"); + } + + pinfo->next = pinformation; + pinformation = pinfo; + /* Make sure the caller isn't assuming zeroed memory. */ + png_memset(pinfo->pointer, 0xdd, pinfo->size); + + if (verbose) + printf("png_malloc %lu bytes at %p\n", (unsigned long)size, + pinfo->pointer); + + return (png_voidp)(pinfo->pointer); + } +} + +/* Free a pointer. It is removed from the list at the same time. */ +void PNGCBAPI +png_debug_free(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL) + fprintf(STDERR, "NULL pointer to png_debug_free.\n"); + + if (ptr == 0) + { +#if 0 /* This happens all the time. */ + fprintf(STDERR, "WARNING: freeing NULL pointer\n"); +#endif + return; + } + + /* Unlink the element from the list. */ + { + memory_infop FAR *ppinfo = &pinformation; + + for (;;) + { + memory_infop pinfo = *ppinfo; + + if (pinfo->pointer == ptr) + { + *ppinfo = pinfo->next; + current_allocation -= pinfo->size; + if (current_allocation < 0) + fprintf(STDERR, "Duplicate free of memory\n"); + /* We must free the list element too, but first kill + the memory that is to be freed. */ + png_memset(ptr, 0x55, pinfo->size); + png_free_default(png_ptr, pinfo); + pinfo = NULL; + break; + } + + if (pinfo->next == NULL) + { + fprintf(STDERR, "Pointer %x not found\n", (unsigned int)ptr); + break; + } + + ppinfo = &pinfo->next; + } + } + + /* Finally free the data. */ + if (verbose) + printf("Freeing %p\n", ptr); + + png_free_default(png_ptr, ptr); + ptr = NULL; +} +#endif /* PNG_USER_MEM_SUPPORTED && PNG_DEBUG */ +/* END of code to test memory allocation/deallocation */ + + +/* Demonstration of user chunk support of the sTER and vpAg chunks */ +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + +/* (sTER is a public chunk not yet known by libpng. vpAg is a private +chunk used in ImageMagick to store "virtual page" size). */ + +static png_uint_32 user_chunk_data[4]; + + /* 0: sTER mode + 1 + * 1: vpAg width + * 2: vpAg height + * 3: vpAg units + */ + +static int PNGCBAPI read_user_chunk_callback(png_struct *png_ptr, + png_unknown_chunkp chunk) +{ + png_uint_32 + *my_user_chunk_data; + + /* Return one of the following: + * return (-n); chunk had an error + * return (0); did not recognize + * return (n); success + * + * The unknown chunk structure contains the chunk data: + * png_byte name[5]; + * png_byte *data; + * png_size_t size; + * + * Note that libpng has already taken care of the CRC handling. + */ + + if (chunk->name[0] == 115 && chunk->name[1] == 84 && /* s T */ + chunk->name[2] == 69 && chunk->name[3] == 82) /* E R */ + { + /* Found sTER chunk */ + if (chunk->size != 1) + return (-1); /* Error return */ + + if (chunk->data[0] != 0 && chunk->data[0] != 1) + return (-1); /* Invalid mode */ + + my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr); + my_user_chunk_data[0]=chunk->data[0]+1; + return (1); + } + + if (chunk->name[0] != 118 || chunk->name[1] != 112 || /* v p */ + chunk->name[2] != 65 || chunk->name[3] != 103) /* A g */ + return (0); /* Did not recognize */ + + /* Found ImageMagick vpAg chunk */ + + if (chunk->size != 9) + return (-1); /* Error return */ + + my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr); + + my_user_chunk_data[1]=png_get_uint_31(png_ptr, chunk->data); + my_user_chunk_data[2]=png_get_uint_31(png_ptr, chunk->data + 4); + my_user_chunk_data[3]=(png_uint_32)chunk->data[8]; + + return (1); + +} +#endif +/* END of code to demonstrate user chunk support */ + +/* Test one file */ +int +test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) +{ + static png_FILE_p fpin; + static png_FILE_p fpout; /* "static" prevents setjmp corruption */ + png_structp read_ptr; + png_infop read_info_ptr, end_info_ptr; +#ifdef PNG_WRITE_SUPPORTED + png_structp write_ptr; + png_infop write_info_ptr; + png_infop write_end_info_ptr; +#else + png_structp write_ptr = NULL; + png_infop write_info_ptr = NULL; + png_infop write_end_info_ptr = NULL; +#endif + png_bytep row_buf; + png_uint_32 y; + png_uint_32 width, height; + int num_pass, pass; + int bit_depth, color_type; +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + jmp_buf png_jmpbuf; +#endif +#endif + + char inbuf[256], outbuf[256]; + + row_buf = NULL; + + if ((fpin = fopen(inname, "rb")) == NULL) + { + fprintf(STDERR, "Could not find input file %s\n", inname); + return (1); + } + + if ((fpout = fopen(outname, "wb")) == NULL) + { + fprintf(STDERR, "Could not open output file %s\n", outname); + FCLOSE(fpin); + return (1); + } + + pngtest_debug("Allocating read and write structures"); +#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG + read_ptr = + png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL, + NULL, NULL, NULL, png_debug_malloc, png_debug_free); +#else + read_ptr = + png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); +#endif +#ifndef PNG_STDIO_SUPPORTED + png_set_error_fn(read_ptr, (png_voidp)inname, pngtest_error, + pngtest_warning); +#endif + +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + user_chunk_data[0] = 0; + user_chunk_data[1] = 0; + user_chunk_data[2] = 0; + user_chunk_data[3] = 0; + png_set_read_user_chunk_fn(read_ptr, user_chunk_data, + read_user_chunk_callback); + +#endif +#ifdef PNG_WRITE_SUPPORTED +#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG + write_ptr = + png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL, + NULL, NULL, NULL, png_debug_malloc, png_debug_free); +#else + write_ptr = + png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); +#endif +#ifndef PNG_STDIO_SUPPORTED + png_set_error_fn(write_ptr, (png_voidp)inname, pngtest_error, + pngtest_warning); +#endif +#endif + pngtest_debug("Allocating read_info, write_info and end_info structures"); + read_info_ptr = png_create_info_struct(read_ptr); + end_info_ptr = png_create_info_struct(read_ptr); +#ifdef PNG_WRITE_SUPPORTED + write_info_ptr = png_create_info_struct(write_ptr); + write_end_info_ptr = png_create_info_struct(write_ptr); +#endif + +#ifdef PNG_SETJMP_SUPPORTED + pngtest_debug("Setting jmpbuf for read struct"); +#ifdef USE_FAR_KEYWORD + if (setjmp(png_jmpbuf)) +#else + if (setjmp(png_jmpbuf(read_ptr))) +#endif + { + fprintf(STDERR, "%s -> %s: libpng read error\n", inname, outname); + png_free(read_ptr, row_buf); + row_buf = NULL; + png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr); +#ifdef PNG_WRITE_SUPPORTED + png_destroy_info_struct(write_ptr, &write_end_info_ptr); + png_destroy_write_struct(&write_ptr, &write_info_ptr); +#endif + FCLOSE(fpin); + FCLOSE(fpout); + return (1); + } +#ifdef USE_FAR_KEYWORD + png_memcpy(png_jmpbuf(read_ptr), png_jmpbuf, png_sizeof(jmp_buf)); +#endif + +#ifdef PNG_WRITE_SUPPORTED + pngtest_debug("Setting jmpbuf for write struct"); +#ifdef USE_FAR_KEYWORD + + if (setjmp(png_jmpbuf)) +#else + if (setjmp(png_jmpbuf(write_ptr))) +#endif + { + fprintf(STDERR, "%s -> %s: libpng write error\n", inname, outname); + png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr); + png_destroy_info_struct(write_ptr, &write_end_info_ptr); +#ifdef PNG_WRITE_SUPPORTED + png_destroy_write_struct(&write_ptr, &write_info_ptr); +#endif + FCLOSE(fpin); + FCLOSE(fpout); + return (1); + } + +#ifdef USE_FAR_KEYWORD + png_memcpy(png_jmpbuf(write_ptr), png_jmpbuf, png_sizeof(jmp_buf)); +#endif +#endif +#endif + + pngtest_debug("Initializing input and output streams"); +#ifdef PNG_STDIO_SUPPORTED + png_init_io(read_ptr, fpin); +# ifdef PNG_WRITE_SUPPORTED + png_init_io(write_ptr, fpout); +# endif +#else + png_set_read_fn(read_ptr, (png_voidp)fpin, pngtest_read_data); +# ifdef PNG_WRITE_SUPPORTED + png_set_write_fn(write_ptr, (png_voidp)fpout, pngtest_write_data, +# ifdef PNG_WRITE_FLUSH_SUPPORTED + pngtest_flush); +# else + NULL); +# endif +# endif +#endif + + if (status_dots_requested == 1) + { +#ifdef PNG_WRITE_SUPPORTED + png_set_write_status_fn(write_ptr, write_row_callback); +#endif + png_set_read_status_fn(read_ptr, read_row_callback); + } + + else + { +#ifdef PNG_WRITE_SUPPORTED + png_set_write_status_fn(write_ptr, NULL); +#endif + png_set_read_status_fn(read_ptr, NULL); + } + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + { + int i; + + for (i = 0; i<256; i++) + filters_used[i] = 0; + + png_set_read_user_transform_fn(read_ptr, count_filters); + } +#endif +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED + zero_samples = 0; + png_set_write_user_transform_fn(write_ptr, count_zero_samples); +#endif + +#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +# ifndef PNG_HANDLE_CHUNK_ALWAYS +# define PNG_HANDLE_CHUNK_ALWAYS 3 +# endif + png_set_keep_unknown_chunks(read_ptr, PNG_HANDLE_CHUNK_ALWAYS, + NULL, 0); +#endif +#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +# ifndef PNG_HANDLE_CHUNK_IF_SAFE +# define PNG_HANDLE_CHUNK_IF_SAFE 2 +# endif + png_set_keep_unknown_chunks(write_ptr, PNG_HANDLE_CHUNK_IF_SAFE, + NULL, 0); +#endif + + pngtest_debug("Reading info struct"); + png_read_info(read_ptr, read_info_ptr); + + pngtest_debug("Transferring info struct"); + { + int interlace_type, compression_type, filter_type; + + if (png_get_IHDR(read_ptr, read_info_ptr, &width, &height, &bit_depth, + &color_type, &interlace_type, &compression_type, &filter_type)) + { + png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth, +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + color_type, interlace_type, compression_type, filter_type); +#else + color_type, PNG_INTERLACE_NONE, compression_type, filter_type); +#endif + } + } +#ifdef PNG_FIXED_POINT_SUPPORTED +#ifdef PNG_cHRM_SUPPORTED + { + png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x, + blue_y; + + if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y, + &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y)) + { + png_set_cHRM_fixed(write_ptr, write_info_ptr, white_x, white_y, red_x, + red_y, green_x, green_y, blue_x, blue_y); + } + } +#endif +#ifdef PNG_gAMA_SUPPORTED + { + png_fixed_point gamma; + + if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma)) + png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma); + } +#endif +#else /* Use floating point versions */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +#ifdef PNG_cHRM_SUPPORTED + { + double white_x, white_y, red_x, red_y, green_x, green_y, blue_x, + blue_y; + + if (png_get_cHRM(read_ptr, read_info_ptr, &white_x, &white_y, &red_x, + &red_y, &green_x, &green_y, &blue_x, &blue_y)) + { + png_set_cHRM(write_ptr, write_info_ptr, white_x, white_y, red_x, + red_y, green_x, green_y, blue_x, blue_y); + } + } +#endif +#ifdef PNG_gAMA_SUPPORTED + { + double gamma; + + if (png_get_gAMA(read_ptr, read_info_ptr, &gamma)) + png_set_gAMA(write_ptr, write_info_ptr, gamma); + } +#endif +#endif /* Floating point */ +#endif /* Fixed point */ +#ifdef PNG_iCCP_SUPPORTED + { + png_charp name; + png_bytep profile; + png_uint_32 proflen; + int compression_type; + + if (png_get_iCCP(read_ptr, read_info_ptr, &name, &compression_type, + &profile, &proflen)) + { + png_set_iCCP(write_ptr, write_info_ptr, name, compression_type, + profile, proflen); + } + } +#endif +#ifdef PNG_sRGB_SUPPORTED + { + int intent; + + if (png_get_sRGB(read_ptr, read_info_ptr, &intent)) + png_set_sRGB(write_ptr, write_info_ptr, intent); + } +#endif + { + png_colorp palette; + int num_palette; + + if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette)) + png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette); + } +#ifdef PNG_bKGD_SUPPORTED + { + png_color_16p background; + + if (png_get_bKGD(read_ptr, read_info_ptr, &background)) + { + png_set_bKGD(write_ptr, write_info_ptr, background); + } + } +#endif +#ifdef PNG_hIST_SUPPORTED + { + png_uint_16p hist; + + if (png_get_hIST(read_ptr, read_info_ptr, &hist)) + png_set_hIST(write_ptr, write_info_ptr, hist); + } +#endif +#ifdef PNG_oFFs_SUPPORTED + { + png_int_32 offset_x, offset_y; + int unit_type; + + if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y, + &unit_type)) + { + png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type); + } + } +#endif +#ifdef PNG_pCAL_SUPPORTED + { + png_charp purpose, units; + png_charpp params; + png_int_32 X0, X1; + int type, nparams; + + if (png_get_pCAL(read_ptr, read_info_ptr, &purpose, &X0, &X1, &type, + &nparams, &units, ¶ms)) + { + png_set_pCAL(write_ptr, write_info_ptr, purpose, X0, X1, type, + nparams, units, params); + } + } +#endif +#ifdef PNG_pHYs_SUPPORTED + { + png_uint_32 res_x, res_y; + int unit_type; + + if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y, &unit_type)) + png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type); + } +#endif +#ifdef PNG_sBIT_SUPPORTED + { + png_color_8p sig_bit; + + if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit)) + png_set_sBIT(write_ptr, write_info_ptr, sig_bit); + } +#endif +#ifdef PNG_sCAL_SUPPORTED +#ifdef PNG_FLOATING_POINT_SUPPORTED + { + int unit; + double scal_width, scal_height; + + if (png_get_sCAL(read_ptr, read_info_ptr, &unit, &scal_width, + &scal_height)) + { + png_set_sCAL(write_ptr, write_info_ptr, unit, scal_width, scal_height); + } + } +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + { + int unit; + png_charp scal_width, scal_height; + + if (png_get_sCAL_s(read_ptr, read_info_ptr, &unit, &scal_width, + &scal_height)) + { + png_set_sCAL_s(write_ptr, write_info_ptr, unit, scal_width, + scal_height); + } + } +#endif +#endif +#endif +#ifdef PNG_TEXT_SUPPORTED + { + png_textp text_ptr; + int num_text; + + if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0) + { + pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text); + png_set_text(write_ptr, write_info_ptr, text_ptr, num_text); + } + } +#endif +#ifdef PNG_tIME_SUPPORTED + { + png_timep mod_time; + + if (png_get_tIME(read_ptr, read_info_ptr, &mod_time)) + { + png_set_tIME(write_ptr, write_info_ptr, mod_time); +#ifdef PNG_TIME_RFC1123_SUPPORTED + /* We have to use png_memcpy instead of "=" because the string + * pointed to by png_convert_to_rfc1123() gets free'ed before + * we use it. + */ + png_memcpy(tIME_string, + png_convert_to_rfc1123(read_ptr, mod_time), + png_sizeof(tIME_string)); + + tIME_string[png_sizeof(tIME_string) - 1] = '\0'; + tIME_chunk_present++; +#endif /* PNG_TIME_RFC1123_SUPPORTED */ + } + } +#endif +#ifdef PNG_tRNS_SUPPORTED + { + png_bytep trans_alpha; + int num_trans; + png_color_16p trans_color; + + if (png_get_tRNS(read_ptr, read_info_ptr, &trans_alpha, &num_trans, + &trans_color)) + { + int sample_max = (1 << bit_depth); + /* libpng doesn't reject a tRNS chunk with out-of-range samples */ + if (!((color_type == PNG_COLOR_TYPE_GRAY && + (int)trans_color->gray > sample_max) || + (color_type == PNG_COLOR_TYPE_RGB && + ((int)trans_color->red > sample_max || + (int)trans_color->green > sample_max || + (int)trans_color->blue > sample_max)))) + png_set_tRNS(write_ptr, write_info_ptr, trans_alpha, num_trans, + trans_color); + } + } +#endif +#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED + { + png_unknown_chunkp unknowns; + int num_unknowns = png_get_unknown_chunks(read_ptr, read_info_ptr, + &unknowns); + + if (num_unknowns) + { + int i; + png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns, + num_unknowns); + /* Copy the locations from the read_info_ptr. The automatically + * generated locations in write_info_ptr are wrong because we + * haven't written anything yet. + */ + for (i = 0; i < num_unknowns; i++) + png_set_unknown_chunk_location(write_ptr, write_info_ptr, i, + unknowns[i].location); + } + } +#endif + +#ifdef PNG_WRITE_SUPPORTED + pngtest_debug("Writing info struct"); + +/* If we wanted, we could write info in two steps: + * png_write_info_before_PLTE(write_ptr, write_info_ptr); + */ + png_write_info(write_ptr, write_info_ptr); + +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + if (user_chunk_data[0] != 0) + { + png_byte png_sTER[5] = {115, 84, 69, 82, '\0'}; + + unsigned char + ster_chunk_data[1]; + + if (verbose) + fprintf(STDERR, "\n stereo mode = %lu\n", + (unsigned long)(user_chunk_data[0] - 1)); + + ster_chunk_data[0]=(unsigned char)(user_chunk_data[0] - 1); + png_write_chunk(write_ptr, png_sTER, ster_chunk_data, 1); + } + + if (user_chunk_data[1] != 0 || user_chunk_data[2] != 0) + { + png_byte png_vpAg[5] = {118, 112, 65, 103, '\0'}; + + unsigned char + vpag_chunk_data[9]; + + if (verbose) + fprintf(STDERR, " vpAg = %lu x %lu, units = %lu\n", + (unsigned long)user_chunk_data[1], + (unsigned long)user_chunk_data[2], + (unsigned long)user_chunk_data[3]); + + png_save_uint_32(vpag_chunk_data, user_chunk_data[1]); + png_save_uint_32(vpag_chunk_data + 4, user_chunk_data[2]); + vpag_chunk_data[8] = (unsigned char)(user_chunk_data[3] & 0xff); + png_write_chunk(write_ptr, png_vpAg, vpag_chunk_data, 9); + } + +#endif +#endif + +#ifdef SINGLE_ROWBUF_ALLOC + pngtest_debug("Allocating row buffer..."); + row_buf = (png_bytep)png_malloc(read_ptr, + png_get_rowbytes(read_ptr, read_info_ptr)); + + pngtest_debug1("\t0x%08lx", (unsigned long)row_buf); +#endif /* SINGLE_ROWBUF_ALLOC */ + pngtest_debug("Writing row data"); + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) + num_pass = png_set_interlace_handling(read_ptr); +# ifdef PNG_WRITE_SUPPORTED + png_set_interlace_handling(write_ptr); +# endif +#else + num_pass = 1; +#endif + +#ifdef PNGTEST_TIMING + t_stop = (float)clock(); + t_misc += (t_stop - t_start); + t_start = t_stop; +#endif + for (pass = 0; pass < num_pass; pass++) + { + pngtest_debug1("Writing row data for pass %d", pass); + for (y = 0; y < height; y++) + { +#ifndef SINGLE_ROWBUF_ALLOC + pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y); + row_buf = (png_bytep)png_malloc(read_ptr, + png_get_rowbytes(read_ptr, read_info_ptr)); + + pngtest_debug2("\t0x%08lx (%u bytes)", (unsigned long)row_buf, + png_get_rowbytes(read_ptr, read_info_ptr)); + +#endif /* !SINGLE_ROWBUF_ALLOC */ + png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1); + +#ifdef PNG_WRITE_SUPPORTED +#ifdef PNGTEST_TIMING + t_stop = (float)clock(); + t_decode += (t_stop - t_start); + t_start = t_stop; +#endif + png_write_rows(write_ptr, (png_bytepp)&row_buf, 1); +#ifdef PNGTEST_TIMING + t_stop = (float)clock(); + t_encode += (t_stop - t_start); + t_start = t_stop; +#endif +#endif /* PNG_WRITE_SUPPORTED */ + +#ifndef SINGLE_ROWBUF_ALLOC + pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y); + png_free(read_ptr, row_buf); + row_buf = NULL; +#endif /* !SINGLE_ROWBUF_ALLOC */ + } + } + +#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED + png_free_data(read_ptr, read_info_ptr, PNG_FREE_UNKN, -1); +#endif +#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED + png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1); +#endif + + pngtest_debug("Reading and writing end_info data"); + + png_read_end(read_ptr, end_info_ptr); +#ifdef PNG_TEXT_SUPPORTED + { + png_textp text_ptr; + int num_text; + + if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0) + { + pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text); + png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text); + } + } +#endif +#ifdef PNG_tIME_SUPPORTED + { + png_timep mod_time; + + if (png_get_tIME(read_ptr, end_info_ptr, &mod_time)) + { + png_set_tIME(write_ptr, write_end_info_ptr, mod_time); +#ifdef PNG_TIME_RFC1123_SUPPORTED + /* We have to use png_memcpy instead of "=" because the string + pointed to by png_convert_to_rfc1123() gets free'ed before + we use it */ + png_memcpy(tIME_string, + png_convert_to_rfc1123(read_ptr, mod_time), + png_sizeof(tIME_string)); + + tIME_string[png_sizeof(tIME_string) - 1] = '\0'; + tIME_chunk_present++; +#endif /* PNG_TIME_RFC1123_SUPPORTED */ + } + } +#endif +#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED + { + png_unknown_chunkp unknowns; + int num_unknowns = png_get_unknown_chunks(read_ptr, end_info_ptr, + &unknowns); + + if (num_unknowns) + { + int i; + png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns, + num_unknowns); + /* Copy the locations from the read_info_ptr. The automatically + * generated locations in write_end_info_ptr are wrong because we + * haven't written the end_info yet. + */ + for (i = 0; i < num_unknowns; i++) + png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i, + unknowns[i].location); + } + } +#endif +#ifdef PNG_WRITE_SUPPORTED + png_write_end(write_ptr, write_end_info_ptr); +#endif + +#ifdef PNG_EASY_ACCESS_SUPPORTED + if (verbose) + { + png_uint_32 iwidth, iheight; + iwidth = png_get_image_width(write_ptr, write_info_ptr); + iheight = png_get_image_height(write_ptr, write_info_ptr); + fprintf(STDERR, "\n Image width = %lu, height = %lu\n", + (unsigned long)iwidth, (unsigned long)iheight); + } +#endif + + pngtest_debug("Destroying data structs"); +#ifdef SINGLE_ROWBUF_ALLOC + pngtest_debug("destroying row_buf for read_ptr"); + png_free(read_ptr, row_buf); + row_buf = NULL; +#endif /* SINGLE_ROWBUF_ALLOC */ + pngtest_debug("destroying read_ptr, read_info_ptr, end_info_ptr"); + png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr); +#ifdef PNG_WRITE_SUPPORTED + pngtest_debug("destroying write_end_info_ptr"); + png_destroy_info_struct(write_ptr, &write_end_info_ptr); + pngtest_debug("destroying write_ptr, write_info_ptr"); + png_destroy_write_struct(&write_ptr, &write_info_ptr); +#endif + pngtest_debug("Destruction complete."); + + FCLOSE(fpin); + FCLOSE(fpout); + + pngtest_debug("Opening files for comparison"); + if ((fpin = fopen(inname, "rb")) == NULL) + { + fprintf(STDERR, "Could not find file %s\n", inname); + return (1); + } + + if ((fpout = fopen(outname, "rb")) == NULL) + { + fprintf(STDERR, "Could not find file %s\n", outname); + FCLOSE(fpin); + return (1); + } + + for (;;) + { + png_size_t num_in, num_out; + + num_in = fread(inbuf, 1, 1, fpin); + num_out = fread(outbuf, 1, 1, fpout); + + if (num_in != num_out) + { + fprintf(STDERR, "\nFiles %s and %s are of a different size\n", + inname, outname); + + if (wrote_question == 0) + { + fprintf(STDERR, + " Was %s written with the same maximum IDAT chunk size (%d bytes),", + inname, PNG_ZBUF_SIZE); + fprintf(STDERR, + "\n filtering heuristic (libpng default), compression"); + fprintf(STDERR, + " level (zlib default),\n and zlib version (%s)?\n\n", + ZLIB_VERSION); + wrote_question = 1; + } + + FCLOSE(fpin); + FCLOSE(fpout); + return (0); + } + + if (!num_in) + break; + + if (png_memcmp(inbuf, outbuf, num_in)) + { + fprintf(STDERR, "\nFiles %s and %s are different\n", inname, outname); + + if (wrote_question == 0) + { + fprintf(STDERR, + " Was %s written with the same maximum IDAT chunk size (%d bytes),", + inname, PNG_ZBUF_SIZE); + fprintf(STDERR, + "\n filtering heuristic (libpng default), compression"); + fprintf(STDERR, + " level (zlib default),\n and zlib version (%s)?\n\n", + ZLIB_VERSION); + wrote_question = 1; + } + + FCLOSE(fpin); + FCLOSE(fpout); + return (0); + } + } + + FCLOSE(fpin); + FCLOSE(fpout); + + return (0); +} + +/* Input and output filenames */ +#ifdef RISCOS +static PNG_CONST char *inname = "pngtest/png"; +static PNG_CONST char *outname = "pngout/png"; +#else +static PNG_CONST char *inname = "pngtest.png"; +static PNG_CONST char *outname = "pngout.png"; +#endif + +int +main(int argc, char *argv[]) +{ + int multiple = 0; + int ierror = 0; + + fprintf(STDERR, "\n Testing libpng version %s\n", PNG_LIBPNG_VER_STRING); + fprintf(STDERR, " with zlib version %s\n", ZLIB_VERSION); + fprintf(STDERR, "%s", png_get_copyright(NULL)); + /* Show the version of libpng used in building the library */ + fprintf(STDERR, " library (%lu):%s", + (unsigned long)png_access_version_number(), + png_get_header_version(NULL)); + + /* Show the version of libpng used in building the application */ + fprintf(STDERR, " pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER, + PNG_HEADER_VERSION_STRING); + + /* Do some consistency checking on the memory allocation settings, I'm + * not sure this matters, but it is nice to know, the first of these + * tests should be impossible because of the way the macros are set + * in pngconf.h + */ +#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) + fprintf(STDERR, " NOTE: Zlib compiled for max 64k, libpng not\n"); +#endif + /* I think the following can happen. */ +#if !defined(MAXSEG_64K) && defined(PNG_MAX_MALLOC_64K) + fprintf(STDERR, " NOTE: libpng compiled for max 64k, zlib not\n"); +#endif + + if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING)) + { + fprintf(STDERR, + "Warning: versions are different between png.h and png.c\n"); + fprintf(STDERR, " png.h version: %s\n", PNG_LIBPNG_VER_STRING); + fprintf(STDERR, " png.c version: %s\n\n", png_libpng_ver); + ++ierror; + } + + if (argc > 1) + { + if (strcmp(argv[1], "-m") == 0) + { + multiple = 1; + status_dots_requested = 0; + } + + else if (strcmp(argv[1], "-mv") == 0 || + strcmp(argv[1], "-vm") == 0 ) + { + multiple = 1; + verbose = 1; + status_dots_requested = 1; + } + + else if (strcmp(argv[1], "-v") == 0) + { + verbose = 1; + status_dots_requested = 1; + inname = argv[2]; + } + + else + { + inname = argv[1]; + status_dots_requested = 0; + } + } + + if (!multiple && argc == 3 + verbose) + outname = argv[2 + verbose]; + + if ((!multiple && argc > 3 + verbose) || (multiple && argc < 2)) + { + fprintf(STDERR, + "usage: %s [infile.png] [outfile.png]\n\t%s -m {infile.png}\n", + argv[0], argv[0]); + fprintf(STDERR, + " reads/writes one PNG file (without -m) or multiple files (-m)\n"); + fprintf(STDERR, + " with -m %s is used as a temporary file\n", outname); + exit(1); + } + + if (multiple) + { + int i; +#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG + int allocation_now = current_allocation; +#endif + for (i=2; isize, + (unsigned int)pinfo->pointer); + pinfo = pinfo->next; + } + } +#endif + } +#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG + fprintf(STDERR, " Current memory allocation: %10d bytes\n", + current_allocation); + fprintf(STDERR, " Maximum memory allocation: %10d bytes\n", + maximum_allocation); + fprintf(STDERR, " Total memory allocation: %10d bytes\n", + total_allocation); + fprintf(STDERR, " Number of allocations: %10d\n", + num_allocations); +#endif + } + + else + { + int i; + for (i = 0; i<3; ++i) + { + int kerror; +#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG + int allocation_now = current_allocation; +#endif + if (i == 1) + status_dots_requested = 1; + + else if (verbose == 0) + status_dots_requested = 0; + + if (i == 0 || verbose == 1 || ierror != 0) + fprintf(STDERR, "\n Testing %s:", inname); + + kerror = test_one_file(inname, outname); + + if (kerror == 0) + { + if (verbose == 1 || i == 2) + { +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + int k; +#endif +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED + fprintf(STDERR, "\n PASS (%lu zero samples)\n", + (unsigned long)zero_samples); +#else + fprintf(STDERR, " PASS\n"); +#endif +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED + for (k = 0; k<256; k++) + if (filters_used[k]) + fprintf(STDERR, " Filter %d was used %lu times\n", + k, (unsigned long)filters_used[k]); +#endif +#ifdef PNG_TIME_RFC1123_SUPPORTED + if (tIME_chunk_present != 0) + fprintf(STDERR, " tIME = %s\n", tIME_string); +#endif /* PNG_TIME_RFC1123_SUPPORTED */ + } + } + + else + { + if (verbose == 0 && i != 2) + fprintf(STDERR, "\n Testing %s:", inname); + + fprintf(STDERR, " FAIL\n"); + ierror += kerror; + } +#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG + if (allocation_now != current_allocation) + fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n", + current_allocation - allocation_now); + + if (current_allocation != 0) + { + memory_infop pinfo = pinformation; + + fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n", + current_allocation); + + while (pinfo != NULL) + { + fprintf(STDERR, " %lu bytes at %x\n", + (unsigned long)pinfo->size, (unsigned int)pinfo->pointer); + pinfo = pinfo->next; + } + } +#endif + } +#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG + fprintf(STDERR, " Current memory allocation: %10d bytes\n", + current_allocation); + fprintf(STDERR, " Maximum memory allocation: %10d bytes\n", + maximum_allocation); + fprintf(STDERR, " Total memory allocation: %10d bytes\n", + total_allocation); + fprintf(STDERR, " Number of allocations: %10d\n", + num_allocations); +#endif + } + +#ifdef PNGTEST_TIMING + t_stop = (float)clock(); + t_misc += (t_stop - t_start); + t_start = t_stop; + fprintf(STDERR, " CPU time used = %.3f seconds", + (t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC); + fprintf(STDERR, " (decoding %.3f,\n", + t_decode/(float)CLOCKS_PER_SEC); + fprintf(STDERR, " encoding %.3f ,", + t_encode/(float)CLOCKS_PER_SEC); + fprintf(STDERR, " other %.3f seconds)\n\n", + t_misc/(float)CLOCKS_PER_SEC); +#endif + + if (ierror == 0) + fprintf(STDERR, " libpng passes test\n"); + + else + fprintf(STDERR, " libpng FAILS test\n"); + + return (int)(ierror != 0); +} + +/* Generate a compiler error if there is an old png.h in the search path. */ +typedef png_libpng_version_1_5_1 Your_png_h_is_not_version_1_5_1; diff --git a/src/3rdparty/libpng/pngtrans.c b/src/3rdparty/libpng/pngtrans.c new file mode 100644 index 0000000000..137f555a62 --- /dev/null +++ b/src/3rdparty/libpng/pngtrans.c @@ -0,0 +1,723 @@ + +/* pngtrans.c - transforms the data in a row (used by both readers and writers) + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#include "pngpriv.h" + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Turn on BGR-to-RGB mapping */ +void PNGAPI +png_set_bgr(png_structp png_ptr) +{ + png_debug(1, "in png_set_bgr"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_BGR; +} +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Turn on 16 bit byte swapping */ +void PNGAPI +png_set_swap(png_structp png_ptr) +{ + png_debug(1, "in png_set_swap"); + + if (png_ptr == NULL) + return; + + if (png_ptr->bit_depth == 16) + png_ptr->transformations |= PNG_SWAP_BYTES; +} +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Turn on pixel packing */ +void PNGAPI +png_set_packing(png_structp png_ptr) +{ + png_debug(1, "in png_set_packing"); + + if (png_ptr == NULL) + return; + + if (png_ptr->bit_depth < 8) + { + png_ptr->transformations |= PNG_PACK; + png_ptr->usr_bit_depth = 8; + } +} +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Turn on packed pixel swapping */ +void PNGAPI +png_set_packswap(png_structp png_ptr) +{ + png_debug(1, "in png_set_packswap"); + + if (png_ptr == NULL) + return; + + if (png_ptr->bit_depth < 8) + png_ptr->transformations |= PNG_PACKSWAP; +} +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +void PNGAPI +png_set_shift(png_structp png_ptr, png_const_color_8p true_bits) +{ + png_debug(1, "in png_set_shift"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_SHIFT; + png_ptr->shift = *true_bits; +} +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +int PNGAPI +png_set_interlace_handling(png_structp png_ptr) +{ + png_debug(1, "in png_set_interlace handling"); + + if (png_ptr && png_ptr->interlaced) + { + png_ptr->transformations |= PNG_INTERLACE; + return (7); + } + + return (1); +} +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte on read, or remove a filler or alpha byte on write. + * The filler type has changed in v0.95 to allow future 2-byte fillers + * for 48-bit input data, as well as to avoid problems with some compilers + * that don't like bytes as parameters. + */ +void PNGAPI +png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) +{ + png_debug(1, "in png_set_filler"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_FILLER; + png_ptr->filler = (png_uint_16)filler; + + if (filler_loc == PNG_FILLER_AFTER) + png_ptr->flags |= PNG_FLAG_FILLER_AFTER; + + else + png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; + + /* This should probably go in the "do_read_filler" routine. + * I attempted to do that in libpng-1.0.1a but that caused problems + * so I restored it in libpng-1.0.2a + */ + + if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + png_ptr->usr_channels = 4; + } + + /* Also I added this in libpng-1.0.2a (what happens when we expand + * a less-than-8-bit grayscale to GA?) */ + + if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) + { + png_ptr->usr_channels = 2; + } +} + +/* Added to libpng-1.2.7 */ +void PNGAPI +png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) +{ + png_debug(1, "in png_set_add_alpha"); + + if (png_ptr == NULL) + return; + + png_set_filler(png_ptr, filler, filler_loc); + png_ptr->transformations |= PNG_ADD_ALPHA; +} + +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +void PNGAPI +png_set_swap_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_swap_alpha"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_SWAP_ALPHA; +} +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +void PNGAPI +png_set_invert_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_invert_alpha"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_INVERT_ALPHA; +} +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +void PNGAPI +png_set_invert_mono(png_structp png_ptr) +{ + png_debug(1, "in png_set_invert_mono"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_INVERT_MONO; +} + +/* Invert monochrome grayscale data */ +void /* PRIVATE */ +png_do_invert(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_invert"); + + /* This test removed from libpng version 1.0.13 and 1.2.0: + * if (row_info->bit_depth == 1 && + */ + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + png_bytep rp = row; + png_size_t i; + png_size_t istop = row_info->rowbytes; + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(~(*rp)); + rp++; + } + } + + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + row_info->bit_depth == 8) + { + png_bytep rp = row; + png_size_t i; + png_size_t istop = row_info->rowbytes; + + for (i = 0; i < istop; i += 2) + { + *rp = (png_byte)(~(*rp)); + rp += 2; + } + } + +#ifdef PNG_16BIT_SUPPORTED + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + row_info->bit_depth == 16) + { + png_bytep rp = row; + png_size_t i; + png_size_t istop = row_info->rowbytes; + + for (i = 0; i < istop; i += 4) + { + *rp = (png_byte)(~(*rp)); + *(rp + 1) = (png_byte)(~(*(rp + 1))); + rp += 4; + } + } +#endif +} +#endif + +#ifdef PNG_16BIT_SUPPORTED +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swaps byte order on 16 bit depth images */ +void /* PRIVATE */ +png_do_swap(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_swap"); + + if (row_info->bit_depth == 16) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop= row_info->width * row_info->channels; + + for (i = 0; i < istop; i++, rp += 2) + { + png_byte t = *rp; + *rp = *(rp + 1); + *(rp + 1) = t; + } + } +} +#endif +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) +static PNG_CONST png_byte onebppswaptable[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 PNG_CONST png_byte twobppswaptable[256] = { + 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, + 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, + 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, + 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, + 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, + 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, + 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, + 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, + 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, + 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, + 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, + 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, + 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, + 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, + 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, + 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, + 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, + 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, + 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, + 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, + 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, + 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, + 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, + 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, + 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, + 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, + 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, + 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, + 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, + 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, + 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, + 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF +}; + +static PNG_CONST png_byte fourbppswaptable[256] = { + 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, + 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, + 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, + 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, + 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, + 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, + 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, + 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, + 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, + 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, + 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, + 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, + 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, + 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, + 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, + 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, + 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, + 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, + 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, + 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, + 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, + 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, + 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, + 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, + 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, + 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, + 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, + 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, + 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, + 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, + 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, + 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF +}; + +/* Swaps pixel packing order within bytes */ +void /* PRIVATE */ +png_do_packswap(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_packswap"); + + if (row_info->bit_depth < 8) + { + png_bytep rp; + png_const_bytep end, table; + + end = row + row_info->rowbytes; + + if (row_info->bit_depth == 1) + table = onebppswaptable; + + else if (row_info->bit_depth == 2) + table = twobppswaptable; + + else if (row_info->bit_depth == 4) + table = fourbppswaptable; + + else + return; + + for (rp = row; rp < end; rp++) + *rp = table[*rp]; + } +} +#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ + +#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ + defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +/* Remove filler or alpha byte(s) */ +void /* PRIVATE */ +png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) +{ + png_debug(1, "in png_do_strip_filler"); + + { + png_bytep sp = row; + png_bytep dp = row; + png_uint_32 row_width = row_info->width; + png_uint_32 i; + + if ((row_info->color_type == PNG_COLOR_TYPE_RGB || + (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && + (flags & PNG_FLAG_STRIP_ALPHA))) && + row_info->channels == 4) + { + if (row_info->bit_depth == 8) + { + /* This converts from RGBX or RGBA to RGB */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + dp += 3; sp += 4; + for (i = 1; i < row_width; i++) + { + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + sp++; + } + } + + /* This converts from XRGB or ARGB to RGB */ + else + { + for (i = 0; i < row_width; i++) + { + sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 24; + row_info->rowbytes = row_width * 3; + } + + else /* if (row_info->bit_depth == 16) */ + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ + sp += 8; dp += 6; + for (i = 1; i < row_width; i++) + { + /* This could be (although png_memcpy is probably slower): + png_memcpy(dp, sp, 6); + sp += 8; + dp += 6; + */ + + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + sp += 2; + } + } + + else + { + /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ + for (i = 0; i < row_width; i++) + { + /* This could be (although png_memcpy is probably slower): + png_memcpy(dp, sp, 6); + sp += 8; + dp += 6; + */ + + sp += 2; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + + row_info->pixel_depth = 48; + row_info->rowbytes = row_width * 6; + } + row_info->channels = 3; + } + + else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || + (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + (flags & PNG_FLAG_STRIP_ALPHA))) && + row_info->channels == 2) + { + if (row_info->bit_depth == 8) + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This converts from GX or GA to G */ + for (i = 0; i < row_width; i++) + { + *dp++ = *sp++; + sp++; + } + } + + else + { + /* This converts from XG or AG to G */ + for (i = 0; i < row_width; i++) + { + sp++; + *dp++ = *sp++; + } + } + + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + + else /* if (row_info->bit_depth == 16) */ + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This converts from GGXX or GGAA to GG */ + sp += 4; dp += 2; + for (i = 1; i < row_width; i++) + { + *dp++ = *sp++; + *dp++ = *sp++; + sp += 2; + } + } + + else + { + /* This converts from XXGG or AAGG to GG */ + for (i = 0; i < row_width; i++) + { + sp += 2; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + row_info->channels = 1; + } + + if (flags & PNG_FLAG_STRIP_ALPHA) + row_info->color_type = (png_byte)(row_info->color_type & + ~PNG_COLOR_MASK_ALPHA); + } +} +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Swaps red and blue bytes within a pixel */ +void /* PRIVATE */ +png_do_bgr(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_bgr"); + + if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + png_uint_32 row_width = row_info->width; + if (row_info->bit_depth == 8) + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 3) + { + png_byte save = *rp; + *rp = *(rp + 2); + *(rp + 2) = save; + } + } + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 4) + { + png_byte save = *rp; + *rp = *(rp + 2); + *(rp + 2) = save; + } + } + } + +#ifdef PNG_16BIT_SUPPORTED + else if (row_info->bit_depth == 16) + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 6) + { + png_byte save = *rp; + *rp = *(rp + 4); + *(rp + 4) = save; + save = *(rp + 1); + *(rp + 1) = *(rp + 5); + *(rp + 5) = save; + } + } + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 8) + { + png_byte save = *rp; + *rp = *(rp + 4); + *(rp + 4) = save; + save = *(rp + 1); + *(rp + 1) = *(rp + 5); + *(rp + 5) = save; + } + } + } +#endif + } +} +#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +void PNGAPI +png_set_user_transform_info(png_structp png_ptr, png_voidp + user_transform_ptr, int user_transform_depth, int user_transform_channels) +{ + png_debug(1, "in png_set_user_transform_info"); + + if (png_ptr == NULL) + return; + png_ptr->user_transform_ptr = user_transform_ptr; + png_ptr->user_transform_depth = (png_byte)user_transform_depth; + png_ptr->user_transform_channels = (png_byte)user_transform_channels; +} +#endif + +/* This function returns a pointer to the user_transform_ptr associated with + * the user transform functions. The application should free any memory + * associated with this pointer before png_write_destroy and png_read_destroy + * are called. + */ +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +png_voidp PNGAPI +png_get_user_transform_ptr(png_const_structp png_ptr) +{ + if (png_ptr == NULL) + return (NULL); + + return ((png_voidp)png_ptr->user_transform_ptr); +} +#endif + +png_uint_32 PNGAPI +png_get_current_row_number(png_const_structp png_ptr) +{ + if (png_ptr != NULL) + return png_ptr->row_number; + return PNG_UINT_32_MAX; /* help the app not to fail silently */ +} + +png_byte PNGAPI +png_get_current_pass_number(png_const_structp png_ptr) +{ + if (png_ptr != NULL) + return png_ptr->pass; + return 8; /* invalid */ +} +#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED || + PNG_WRITE_USER_TRANSFORM_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngvalid.c b/src/3rdparty/libpng/pngvalid.c new file mode 100644 index 0000000000..faebe4b8b7 --- /dev/null +++ b/src/3rdparty/libpng/pngvalid.c @@ -0,0 +1,6658 @@ + +/* pngvalid.c - validate libpng by constructing then reading png files. + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 2011 Glenn Randers-Pehrson + * Written by John Cunningham Bowler + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * NOTES: + * This is a C program that is intended to be linked against libpng. It + * generates bitmaps internally, stores them as PNG files (using the + * sequential write code) then reads them back (using the sequential + * read code) and validates that the result has the correct data. + * + * The program can be modified and extended to test the correctness of + * transformations performed by libpng. + */ + +#include "png.h" +#if PNG_LIBPNG_VER < 10500 +/* This delibarately lacks the PNG_CONST. */ +typedef png_byte *png_const_bytep; + +/* This is copied from 1.5.1 png.h: */ +#define PNG_INTERLACE_ADAM7_PASSES 7 +#define PNG_PASS_START_ROW(pass) (((1U&~(pass))<<(3-((pass)>>1)))&7) +#define PNG_PASS_START_COL(pass) (((1U& (pass))<<(3-(((pass)+1)>>1)))&7) +#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) +#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) +#define PNG_PASS_ROWS(height, pass) (((height)+(((1<>PNG_PASS_ROW_SHIFT(pass)) +#define PNG_PASS_COLS(width, pass) (((width)+(((1<>PNG_PASS_COL_SHIFT(pass)) +#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \ + (((yIn)<>(((7-(off))-(pass))<<2)) & 0xFU) | \ + ((0x01145AF0U>>(((7-(off))-(pass))<<2)) & 0xF0U)) +#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ + ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) +#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ + ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) + +/* These are needed too for the defualt build: */ +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#endif + +#include "zlib.h" /* For crc32 */ + +#include /* For floating point constants */ +#include /* For malloc */ +#include /* For memcpy, memset */ +#include /* For floor */ + +/* Unused formal parameter errors are removed using the following macro which is + * expected to have no bad effects on performance. + */ +#ifndef UNUSED +# if defined(__GNUC__) || defined(_MSC_VER) +# define UNUSED(param) (void)param; +# else +# define UNUSED(param) +# endif +#endif + +/***************************** EXCEPTION HANDLING *****************************/ +#include "contrib/visupng/cexcept.h" +struct png_store; +define_exception_type(struct png_store*); + +/* The following are macros to reduce typing everywhere where the well known + * name 'the_exception_context' must be defined. + */ +#define anon_context(ps) struct exception_context *the_exception_context = \ + &(ps)->exception_context +#define context(ps,fault) anon_context(ps); png_store *fault + +/******************************* UTILITIES ************************************/ +/* Error handling is particularly problematic in production code - error + * handlers often themselves have bugs which lead to programs that detect + * minor errors crashing. The following functions deal with one very + * common class of errors in error handlers - attempting to format error or + * warning messages into buffers that are too small. + */ +static size_t safecat(char *buffer, size_t bufsize, size_t pos, + PNG_CONST char *cat) +{ + while (pos < bufsize && cat != NULL && *cat != 0) + buffer[pos++] = *cat++; + + if (pos >= bufsize) + pos = bufsize-1; + + buffer[pos] = 0; + return pos; +} + +static size_t safecatn(char *buffer, size_t bufsize, size_t pos, int n) +{ + char number[64]; + sprintf(number, "%d", n); + return safecat(buffer, bufsize, pos, number); +} + +static size_t safecatd(char *buffer, size_t bufsize, size_t pos, double d, + int precision) +{ + char number[64]; + sprintf(number, "%.*f", precision, d); + return safecat(buffer, bufsize, pos, number); +} + +static PNG_CONST char invalid[] = "invalid"; +static PNG_CONST char sep[] = ": "; + +/* NOTE: this is indexed by ln2(bit_depth)! */ +static PNG_CONST char *bit_depths[8] = +{ + "1", "2", "4", "8", "16", invalid, invalid, invalid +}; + +static PNG_CONST char *colour_types[8] = +{ + "greyscale", invalid, "truecolour", "indexed-colour", + "greyscale with alpha", invalid, "truecolour with alpha", invalid +}; + +/* To get log-bit-depth from bit depth, returns 0 to 7 (7 on error). */ +static unsigned int +log2depth(png_byte bit_depth) +{ + switch (bit_depth) + { + case 1: + return 0; + + case 2: + return 1; + + case 4: + return 2; + + case 8: + return 3; + + case 16: + return 4; + + default: + return 7; + } +} + +/* A numeric ID based on PNG file characteristics. The 'do_interlace' field + * simply records whether pngvalid did the interlace itself or whether it + * was done by libpng. Width and height must be less than 256. + */ +#define FILEID(col, depth, interlace, width, height, do_interlace) \ + ((png_uint_32)((col) + ((depth)<<3) + ((interlace)<<8) + \ + (((do_interlace)!=0)<<15) + ((width)<<16) + ((height)<<24))) + +#define COL_FROM_ID(id) ((png_byte)((id)& 0x7U)) +#define DEPTH_FROM_ID(id) ((png_byte)(((id) >> 3) & 0x1fU)) +#define INTERLACE_FROM_ID(id) ((int)(((id) >> 8) & 0x3)) +#define DO_INTERLACE_FROM_ID(id) ((int)(((id)>>15) & 1)) +#define WIDTH_FROM_ID(id) (((id)>>16) & 0xff) +#define HEIGHT_FROM_ID(id) (((id)>>24) & 0xff) + +/* Utility to construct a standard name for a standard image. */ +static size_t +standard_name(char *buffer, size_t bufsize, size_t pos, png_byte colour_type, + int log_bit_depth, int interlace_type, png_uint_32 w, png_uint_32 h, + int do_interlace) +{ + pos = safecat(buffer, bufsize, pos, colour_types[colour_type]); + pos = safecat(buffer, bufsize, pos, " "); + pos = safecat(buffer, bufsize, pos, bit_depths[log_bit_depth]); + pos = safecat(buffer, bufsize, pos, " bit "); + + if (interlace_type != PNG_INTERLACE_NONE) + pos = safecat(buffer, bufsize, pos, "interlaced"); + if (do_interlace) + pos = safecat(buffer, bufsize, pos, "(pngvalid)"); + else + pos = safecat(buffer, bufsize, pos, "(libpng)"); + if (w > 0 || h > 0) + { + pos = safecat(buffer, bufsize, pos, " "); + pos = safecatn(buffer, bufsize, pos, w); + pos = safecat(buffer, bufsize, pos, "x"); + pos = safecatn(buffer, bufsize, pos, h); + } + + return pos; +} + +static size_t +standard_name_from_id(char *buffer, size_t bufsize, size_t pos, png_uint_32 id) +{ + return standard_name(buffer, bufsize, pos, COL_FROM_ID(id), + log2depth(DEPTH_FROM_ID(id)), INTERLACE_FROM_ID(id), + WIDTH_FROM_ID(id), HEIGHT_FROM_ID(id), DO_INTERLACE_FROM_ID(id)); +} + +/* Convenience API and defines to list valid formats. Note that 16 bit read and + * write support is required to do 16 bit read tests (we must be able to make a + * 16 bit image to test!) + */ +#ifdef PNG_WRITE_16BIT_SUPPORTED +# define WRITE_BDHI 4 +# ifdef PNG_READ_16BIT_SUPPORTED +# define READ_BDHI 4 +# define DO_16BIT +# endif +#else +# define WRITE_BDHI 3 +#endif +#ifndef DO_16BIT +# define READ_BDHI 3 +#endif + +static int +next_format(png_bytep colour_type, png_bytep bit_depth) +{ + if (*bit_depth == 0) + { + *colour_type = 0, *bit_depth = 1; + return 1; + } + + *bit_depth = (png_byte)(*bit_depth << 1); + + /* Palette images are restricted to 8 bit depth */ + if (*bit_depth <= 8 +# ifdef DO_16BIT + || (*colour_type != 3 && *bit_depth <= 16) +# endif + ) + return 1; + + /* Move to the next color type, or return 0 at the end. */ + switch (*colour_type) + { + case 0: + *colour_type = 2; + *bit_depth = 8; + return 1; + + case 2: + *colour_type = 3; + *bit_depth = 1; + return 1; + + case 3: + *colour_type = 4; + *bit_depth = 8; + return 1; + + case 4: + *colour_type = 6; + *bit_depth = 8; + return 1; + + default: + return 0; + } +} + +static unsigned int +sample(png_const_bytep row, png_byte colour_type, png_byte bit_depth, + png_uint_32 x, unsigned int sample_index) +{ + png_uint_32 bit_index, result; + + /* Find a sample index for the desired sample: */ + x *= bit_depth; + bit_index = x; + + if ((colour_type & 1) == 0) /* !palette */ + { + if (colour_type & 2) + bit_index *= 3; + + if (colour_type & 4) + bit_index += x; /* Alpha channel */ + + if (colour_type & (2+4)) + bit_index += sample_index * bit_depth; /* Multiple channels: select one */ + } + + /* Return the sample from the row as an integer. */ + row += bit_index >> 3; + result = *row; + + if (bit_depth == 8) + return result; + + else if (bit_depth > 8) + return (result << 8) + *++row; + + /* Less than 8 bits per sample. */ + bit_index &= 7; + return (result >> (8-bit_index-bit_depth)) & ((1U<> 3] & ~destMask; + unsigned int sourceByte = fromBuffer[fromIndex >> 3]; + + /* Don't rely on << or >> supporting '0' here, just in case: */ + fromIndex &= 7; + if (fromIndex > 0) sourceByte <<= fromIndex; + if ((toIndex & 7) > 0) sourceByte >>= toIndex & 7; + + toBuffer[toIndex >> 3] = (png_byte)(destByte | (sourceByte & destMask)); + } + else /* One or more bytes */ + memmove(toBuffer+(toIndex>>3), fromBuffer+(fromIndex>>3), pixelSize>>3); +} + +/* Compare pixels - they are assumed to start at the first byte in the + * given buffers. + */ +static int +pixel_cmp(png_const_bytep pa, png_const_bytep pb, png_uint_32 bit_width) +{ + if (memcmp(pa, pb, bit_width>>3) == 0) + { + png_uint_32 p; + + if ((bit_width & 7) == 0) return 0; + + /* Ok, any differences? */ + p = pa[bit_width >> 3]; + p ^= pb[bit_width >> 3]; + + if (p == 0) return 0; + + /* There are, but they may not be significant, remove the bits + * after the end (the low order bits in PNG.) + */ + bit_width &= 7; + p >>= 8-bit_width; + + if (p == 0) return 0; + } + + return 1; /* Different */ +} + +/*************************** BASIC PNG FILE WRITING ***************************/ +/* A png_store takes data from the sequential writer or provides data + * to the sequential reader. It can also store the result of a PNG + * write for later retrieval. + */ +#define STORE_BUFFER_SIZE 500 /* arbitrary */ +typedef struct png_store_buffer +{ + struct png_store_buffer* prev; /* NOTE: stored in reverse order */ + png_byte buffer[STORE_BUFFER_SIZE]; +} png_store_buffer; + +#define FILE_NAME_SIZE 64 + +typedef struct png_store_file +{ + struct png_store_file* next; /* as many as you like... */ + char name[FILE_NAME_SIZE]; + png_uint_32 id; /* must be correct (see FILEID) */ + png_size_t datacount; /* In this (the last) buffer */ + png_store_buffer data; /* Last buffer in file */ +} png_store_file; + +/* The following is a pool of memory allocated by a single libpng read or write + * operation. + */ +typedef struct store_pool +{ + struct png_store *store; /* Back pointer */ + struct store_memory *list; /* List of allocated memory */ + png_byte mark[4]; /* Before and after data */ + + /* Statistics for this run. */ + png_alloc_size_t max; /* Maximum single allocation */ + png_alloc_size_t current; /* Current allocation */ + png_alloc_size_t limit; /* Highest current allocation */ + png_alloc_size_t total; /* Total allocation */ + + /* Overall statistics (retained across successive runs). */ + png_alloc_size_t max_max; + png_alloc_size_t max_limit; + png_alloc_size_t max_total; +} store_pool; + +typedef struct png_store +{ + /* For cexcept.h exception handling - simply store one of these; + * the context is a self pointer but it may point to a different + * png_store (in fact it never does in this program.) + */ + struct exception_context + exception_context; + + unsigned int verbose :1; + unsigned int treat_warnings_as_errors :1; + unsigned int expect_error :1; + unsigned int expect_warning :1; + unsigned int saw_warning :1; + unsigned int speed :1; + unsigned int progressive :1; /* use progressive read */ + unsigned int validated :1; /* used as a temporary flag */ + int nerrors; + int nwarnings; + char test[128]; /* Name of test */ + char error[256]; + + /* Read fields */ + png_structp pread; /* Used to read a saved file */ + png_infop piread; + png_store_file* current; /* Set when reading */ + png_store_buffer* next; /* Set when reading */ + png_size_t readpos; /* Position in *next */ + png_byte* image; /* Buffer for reading interlaced images */ + size_t cb_image; /* Size of this buffer */ + store_pool read_memory_pool; + + /* Write fields */ + png_store_file* saved; + png_structp pwrite; /* Used when writing a new file */ + png_infop piwrite; + png_size_t writepos; /* Position in .new */ + char wname[FILE_NAME_SIZE]; + png_store_buffer new; /* The end of the new PNG file being written. */ + store_pool write_memory_pool; +} png_store; + +/* Initialization and cleanup */ +static void +store_pool_mark(png_byte *mark) +{ + /* Generate a new mark. This uses a boring repeatable algorithm and it is + * implemented here so that it gives the same set of numbers on every + * architecture. It's a linear congruential generator (Knuth or Sedgewick + * "Algorithms") but it comes from the 'feedback taps' table in Horowitz and + * Hill, "The Art of Electronics". + */ + static png_uint_32 u0 = 0x12345678, u1 = 1; + + /* There are thirty three bits, the next bit in the sequence is bit-33 XOR + * bit-20. The top 1 bit is in u1, the bottom 32 are in u0. + */ + int i; + for (i=0; i<4; ++i) + { + /* First generate 8 new bits then shift them in at the end. */ + png_uint_32 u = ((u0 >> (20-8)) ^ ((u1 << 7) | (u0 >> (32-7)))) & 0xff; + u1 <<= 8; + u1 |= u0 >> 24; + u0 <<= 8; + u0 |= u; + *mark++ = (png_byte)u; + } +} + +/* Use this for random 32 bit values, this function makes sure the result is + * non-zero. + */ +static png_uint_32 +random_32(void) +{ + + for(;;) + { + png_byte mark[4]; + png_uint_32 result; + + store_pool_mark(mark); + result = png_get_uint_32(mark); + + if (result != 0) + return result; + } +} + +static void +store_pool_init(png_store *ps, store_pool *pool) +{ + memset(pool, 0, sizeof *pool); + + pool->store = ps; + pool->list = NULL; + pool->max = pool->current = pool->limit = pool->total = 0; + pool->max_max = pool->max_limit = pool->max_total = 0; + store_pool_mark(pool->mark); +} + +static void +store_init(png_store* ps) +{ + memset(ps, 0, sizeof *ps); + init_exception_context(&ps->exception_context); + store_pool_init(ps, &ps->read_memory_pool); + store_pool_init(ps, &ps->write_memory_pool); + ps->verbose = 0; + ps->treat_warnings_as_errors = 0; + ps->expect_error = 0; + ps->expect_warning = 0; + ps->saw_warning = 0; + ps->speed = 0; + ps->progressive = 0; + ps->validated = 0; + ps->nerrors = ps->nwarnings = 0; + ps->pread = NULL; + ps->piread = NULL; + ps->saved = ps->current = NULL; + ps->next = NULL; + ps->readpos = 0; + ps->image = NULL; + ps->cb_image = 0; + ps->pwrite = NULL; + ps->piwrite = NULL; + ps->writepos = 0; + ps->new.prev = NULL; +} + +/* This somewhat odd function is used when reading an image to ensure that the + * buffer is big enough - this is why a png_structp is available. + */ +static void +store_ensure_image(png_store *ps, png_structp pp, size_t cb) +{ + if (ps->cb_image < cb) + { + if (ps->image != NULL) + { + free(ps->image-1); + ps->cb_image = 0; + } + + /* The buffer is deliberately mis-aligned. */ + ps->image = malloc(cb+1); + if (ps->image == NULL) + png_error(pp, "OOM allocating image buffer"); + + ++(ps->image); + ps->cb_image = cb; + } + + /* And, for error checking, the whole buffer is set to '1' - this + * matches what happens with the 'size' test images on write and also + * matches the unused bits in the test rows. + */ + memset(ps->image, 0xff, cb); +} + +static void +store_freebuffer(png_store_buffer* psb) +{ + if (psb->prev) + { + store_freebuffer(psb->prev); + free(psb->prev); + psb->prev = NULL; + } +} + +static void +store_freenew(png_store *ps) +{ + store_freebuffer(&ps->new); + ps->writepos = 0; +} + +static void +store_storenew(png_store *ps) +{ + png_store_buffer *pb; + + if (ps->writepos != STORE_BUFFER_SIZE) + png_error(ps->pwrite, "invalid store call"); + + pb = malloc(sizeof *pb); + + if (pb == NULL) + png_error(ps->pwrite, "store new: OOM"); + + *pb = ps->new; + ps->new.prev = pb; + ps->writepos = 0; +} + +static void +store_freefile(png_store_file **ppf) +{ + if (*ppf != NULL) + { + store_freefile(&(*ppf)->next); + + store_freebuffer(&(*ppf)->data); + (*ppf)->datacount = 0; + free(*ppf); + *ppf = NULL; + } +} + +/* Main interface to file storeage, after writing a new PNG file (see the API + * below) call store_storefile to store the result with the given name and id. + */ +static void +store_storefile(png_store *ps, png_uint_32 id) +{ + png_store_file *pf = malloc(sizeof *pf); + if (pf == NULL) + png_error(ps->pwrite, "storefile: OOM"); + safecat(pf->name, sizeof pf->name, 0, ps->wname); + pf->id = id; + pf->data = ps->new; + pf->datacount = ps->writepos; + ps->new.prev = NULL; + ps->writepos = 0; + + /* And save it. */ + pf->next = ps->saved; + ps->saved = pf; +} + +/* Generate an error message (in the given buffer) */ +static size_t +store_message(png_store *ps, png_structp pp, char *buffer, size_t bufsize, + size_t pos, PNG_CONST char *msg) +{ + if (pp != NULL && pp == ps->pread) + { + /* Reading a file */ + pos = safecat(buffer, bufsize, pos, "read: "); + + if (ps->current != NULL) + { + pos = safecat(buffer, bufsize, pos, ps->current->name); + pos = safecat(buffer, bufsize, pos, sep); + } + } + + else if (pp != NULL && pp == ps->pwrite) + { + /* Writing a file */ + pos = safecat(buffer, bufsize, pos, "write: "); + pos = safecat(buffer, bufsize, pos, ps->wname); + pos = safecat(buffer, bufsize, pos, sep); + } + + else + { + /* Neither reading nor writing (or a memory error in struct delete) */ + pos = safecat(buffer, bufsize, pos, "pngvalid: "); + } + + if (ps->test[0] != 0) + { + pos = safecat(buffer, bufsize, pos, ps->test); + pos = safecat(buffer, bufsize, pos, sep); + } + pos = safecat(buffer, bufsize, pos, msg); + return pos; +} + +/* Log an error or warning - the relevant count is always incremented. */ +static void +store_log(png_store* ps, png_structp pp, png_const_charp message, int is_error) +{ + /* The warning is copied to the error buffer if there are no errors and it is + * the first warning. The error is copied to the error buffer if it is the + * first error (overwriting any prior warnings). + */ + if (is_error ? (ps->nerrors)++ == 0 : + (ps->nwarnings)++ == 0 && ps->nerrors == 0) + store_message(ps, pp, ps->error, sizeof ps->error, 0, message); + + if (ps->verbose) + { + char buffer[256]; + size_t pos; + + if (is_error) + pos = safecat(buffer, sizeof buffer, 0, "error: "); + else + pos = safecat(buffer, sizeof buffer, 0, "warning: "); + + store_message(ps, pp, buffer, sizeof buffer, pos, message); + fputs(buffer, stderr); + fputc('\n', stderr); + } +} + +/* Functions to use as PNG callbacks. */ +static void +store_error(png_structp pp, png_const_charp message) /* PNG_NORETURN */ +{ + png_store *ps = png_get_error_ptr(pp); + + if (!ps->expect_error) + store_log(ps, pp, message, 1 /* error */); + + /* And finally throw an exception. */ + { + struct exception_context *the_exception_context = &ps->exception_context; + Throw ps; + } +} + +static void +store_warning(png_structp pp, png_const_charp message) +{ + png_store *ps = png_get_error_ptr(pp); + + if (!ps->expect_warning) + store_log(ps, pp, message, 0 /* warning */); + else + ps->saw_warning = 1; +} + +static void +store_write(png_structp pp, png_bytep pb, png_size_t st) +{ + png_store *ps = png_get_io_ptr(pp); + + if (ps->pwrite != pp) + png_error(pp, "store state damaged"); + + while (st > 0) + { + size_t cb; + + if (ps->writepos >= STORE_BUFFER_SIZE) + store_storenew(ps); + + cb = st; + + if (cb > STORE_BUFFER_SIZE - ps->writepos) + cb = STORE_BUFFER_SIZE - ps->writepos; + + memcpy(ps->new.buffer + ps->writepos, pb, cb); + pb += cb; + st -= cb; + ps->writepos += cb; + } +} + +static void +store_flush(png_structp pp) +{ + UNUSED(pp) /*DOES NOTHING*/ +} + +static size_t +store_read_buffer_size(png_store *ps) +{ + /* Return the bytes available for read in the current buffer. */ + if (ps->next != &ps->current->data) + return STORE_BUFFER_SIZE; + + return ps->current->datacount; +} + +/* Return total bytes available for read. */ +static size_t +store_read_buffer_avail(png_store *ps) +{ + if (ps->current != NULL && ps->next != NULL) + { + png_store_buffer *next = &ps->current->data; + size_t cbAvail = ps->current->datacount; + + while (next != ps->next && next != NULL) + { + next = next->prev; + cbAvail += STORE_BUFFER_SIZE; + } + + if (next != ps->next) + png_error(ps->pread, "buffer read error"); + + if (cbAvail > ps->readpos) + return cbAvail - ps->readpos; + } + + return 0; +} + +static int +store_read_buffer_next(png_store *ps) +{ + png_store_buffer *pbOld = ps->next; + png_store_buffer *pbNew = &ps->current->data; + if (pbOld != pbNew) + { + while (pbNew != NULL && pbNew->prev != pbOld) + pbNew = pbNew->prev; + + if (pbNew != NULL) + { + ps->next = pbNew; + ps->readpos = 0; + return 1; + } + + png_error(ps->pread, "buffer lost"); + } + + return 0; /* EOF or error */ +} + +/* Need separate implementation and callback to allow use of the same code + * during progressive read, where the io_ptr is set internally by libpng. + */ +static void +store_read_imp(png_store *ps, png_bytep pb, png_size_t st) +{ + if (ps->current == NULL || ps->next == NULL) + png_error(ps->pread, "store state damaged"); + + while (st > 0) + { + size_t cbAvail = store_read_buffer_size(ps) - ps->readpos; + + if (cbAvail > 0) + { + if (cbAvail > st) cbAvail = st; + memcpy(pb, ps->next->buffer + ps->readpos, cbAvail); + st -= cbAvail; + pb += cbAvail; + ps->readpos += cbAvail; + } + + else if (!store_read_buffer_next(ps)) + png_error(ps->pread, "read beyond end of file"); + } +} + +static void +store_read(png_structp pp, png_bytep pb, png_size_t st) +{ + png_store *ps = png_get_io_ptr(pp); + + if (ps == NULL || ps->pread != pp) + png_error(pp, "bad store read call"); + + store_read_imp(ps, pb, st); +} + +static void +store_progressive_read(png_store *ps, png_structp pp, png_infop pi) +{ + /* Notice that a call to store_read will cause this function to fail because + * readpos will be set. + */ + if (ps->pread != pp || ps->current == NULL || ps->next == NULL) + png_error(pp, "store state damaged (progressive)"); + + do + { + if (ps->readpos != 0) + png_error(pp, "store_read called during progressive read"); + + png_process_data(pp, pi, ps->next->buffer, store_read_buffer_size(ps)); + } + while (store_read_buffer_next(ps)); +} + +/***************************** MEMORY MANAGEMENT*** ***************************/ +/* A store_memory is simply the header for an allocated block of memory. The + * pointer returned to libpng is just after the end of the header block, the + * allocated memory is followed by a second copy of the 'mark'. + */ +typedef struct store_memory +{ + store_pool *pool; /* Originating pool */ + struct store_memory *next; /* Singly linked list */ + png_alloc_size_t size; /* Size of memory allocated */ + png_byte mark[4]; /* ID marker */ +} store_memory; + +/* Handle a fatal error in memory allocation. This calls png_error if the + * libpng struct is non-NULL, else it outputs a message and returns. This means + * that a memory problem while libpng is running will abort (png_error) the + * handling of particular file while one in cleanup (after the destroy of the + * struct has returned) will simply keep going and free (or attempt to free) + * all the memory. + */ +static void +store_pool_error(png_store *ps, png_structp pp, PNG_CONST char *msg) +{ + if (pp != NULL) + png_error(pp, msg); + + /* Else we have to do it ourselves. png_error eventually calls store_log, + * above. store_log accepts a NULL png_structp - it just changes what gets + * output by store_message. + */ + store_log(ps, pp, msg, 1 /* error */); +} + +static void +store_memory_free(png_structp pp, store_pool *pool, store_memory *memory) +{ + /* Note that pp may be NULL (see store_pool_delete below), the caller has + * found 'memory' in pool->list *and* unlinked this entry, so this is a valid + * pointer (for sure), but the contents may have been trashed. + */ + if (memory->pool != pool) + store_pool_error(pool->store, pp, "memory corrupted (pool)"); + + else if (memcmp(memory->mark, pool->mark, sizeof memory->mark) != 0) + store_pool_error(pool->store, pp, "memory corrupted (start)"); + + /* It should be safe to read the size field now. */ + else + { + png_alloc_size_t cb = memory->size; + + if (cb > pool->max) + store_pool_error(pool->store, pp, "memory corrupted (size)"); + + else if (memcmp((png_bytep)(memory+1)+cb, pool->mark, sizeof pool->mark) + != 0) + store_pool_error(pool->store, pp, "memory corrupted (end)"); + + /* Finally give the library a chance to find problems too: */ + else + { + pool->current -= cb; + free(memory); + } + } +} + +static void +store_pool_delete(png_store *ps, store_pool *pool) +{ + if (pool->list != NULL) + { + fprintf(stderr, "%s: %s %s: memory lost (list follows):\n", ps->test, + pool == &ps->read_memory_pool ? "read" : "write", + pool == &ps->read_memory_pool ? (ps->current != NULL ? + ps->current->name : "unknown file") : ps->wname); + ++ps->nerrors; + + do + { + store_memory *next = pool->list; + pool->list = next->next; + next->next = NULL; + + fprintf(stderr, "\t%lu bytes @ %p\n", + (unsigned long)next->size, next+1); + /* The NULL means this will always return, even if the memory is + * corrupted. + */ + store_memory_free(NULL, pool, next); + } + while (pool->list != NULL); + } + + /* And reset the other fields too for the next time. */ + if (pool->max > pool->max_max) pool->max_max = pool->max; + pool->max = 0; + if (pool->current != 0) /* unexpected internal error */ + fprintf(stderr, "%s: %s %s: memory counter mismatch (internal error)\n", + ps->test, pool == &ps->read_memory_pool ? "read" : "write", + pool == &ps->read_memory_pool ? (ps->current != NULL ? + ps->current->name : "unknown file") : ps->wname); + pool->current = 0; + + if (pool->limit > pool->max_limit) + pool->max_limit = pool->limit; + + pool->limit = 0; + + if (pool->total > pool->max_total) + pool->max_total = pool->total; + + pool->total = 0; + + /* Get a new mark too. */ + store_pool_mark(pool->mark); +} + +/* The memory callbacks: */ +static png_voidp +store_malloc(png_structp pp, png_alloc_size_t cb) +{ + store_pool *pool = png_get_mem_ptr(pp); + store_memory *new = malloc(cb + (sizeof *new) + (sizeof pool->mark)); + + if (new != NULL) + { + if (cb > pool->max) + pool->max = cb; + + pool->current += cb; + + if (pool->current > pool->limit) + pool->limit = pool->current; + + pool->total += cb; + + new->size = cb; + memcpy(new->mark, pool->mark, sizeof new->mark); + memcpy((png_byte*)(new+1) + cb, pool->mark, sizeof pool->mark); + new->pool = pool; + new->next = pool->list; + pool->list = new; + ++new; + } + + else + store_pool_error(pool->store, pp, "out of memory"); + + return new; +} + +static void +store_free(png_structp pp, png_voidp memory) +{ + store_pool *pool = png_get_mem_ptr(pp); + store_memory *this = memory, **test; + + /* First check that this 'memory' really is valid memory - it must be in the + * pool list. If it is, use the shared memory_free function to free it. + */ + --this; + for (test = &pool->list; *test != this; test = &(*test)->next) + { + if (*test == NULL) + { + store_pool_error(pool->store, pp, "bad pointer to free"); + return; + } + } + + /* Unlink this entry, *test == this. */ + *test = this->next; + this->next = NULL; + store_memory_free(pp, pool, this); +} + +/* Setup functions. */ +/* Cleanup when aborting a write or after storing the new file. */ +static void +store_write_reset(png_store *ps) +{ + if (ps->pwrite != NULL) + { + anon_context(ps); + + Try + png_destroy_write_struct(&ps->pwrite, &ps->piwrite); + + Catch_anonymous + { + /* memory corruption: continue. */ + } + + ps->pwrite = NULL; + ps->piwrite = NULL; + } + + /* And make sure that all the memory has been freed - this will output + * spurious errors in the case of memory corruption above, but this is safe. + */ + store_pool_delete(ps, &ps->write_memory_pool); + + store_freenew(ps); +} + +/* The following is the main write function, it returns a png_struct and, + * optionally, a png_info suitable for writiing a new PNG file. Use + * store_storefile above to record this file after it has been written. The + * returned libpng structures as destroyed by store_write_reset above. + */ +static png_structp +set_store_for_write(png_store *ps, png_infopp ppi, + PNG_CONST char * volatile name) +{ + anon_context(ps); + + Try + { + if (ps->pwrite != NULL) + png_error(ps->pwrite, "write store already in use"); + + store_write_reset(ps); + safecat(ps->wname, sizeof ps->wname, 0, name); + + /* Don't do the slow memory checks if doing a speed test. */ + if (ps->speed) + ps->pwrite = png_create_write_struct(PNG_LIBPNG_VER_STRING, + ps, store_error, store_warning); + + else + ps->pwrite = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, + ps, store_error, store_warning, &ps->write_memory_pool, + store_malloc, store_free); + + png_set_write_fn(ps->pwrite, ps, store_write, store_flush); + + if (ppi != NULL) + *ppi = ps->piwrite = png_create_info_struct(ps->pwrite); + } + + Catch_anonymous + return NULL; + + return ps->pwrite; +} + +/* Cleanup when finished reading (either due to error or in the success case). + */ +static void +store_read_reset(png_store *ps) +{ + if (ps->pread != NULL) + { + anon_context(ps); + + Try + png_destroy_read_struct(&ps->pread, &ps->piread, NULL); + + Catch_anonymous + { + /* error already output: continue */ + } + + ps->pread = NULL; + ps->piread = NULL; + } + + /* Always do this to be safe. */ + store_pool_delete(ps, &ps->read_memory_pool); + + ps->current = NULL; + ps->next = NULL; + ps->readpos = 0; + ps->validated = 0; +} + +static void +store_read_set(png_store *ps, png_uint_32 id) +{ + png_store_file *pf = ps->saved; + + while (pf != NULL) + { + if (pf->id == id) + { + ps->current = pf; + ps->next = NULL; + store_read_buffer_next(ps); + return; + } + + pf = pf->next; + } + + { + size_t pos; + char msg[FILE_NAME_SIZE+64]; + + pos = standard_name_from_id(msg, sizeof msg, 0, id); + pos = safecat(msg, sizeof msg, pos, ": file not found"); + png_error(ps->pread, msg); + } +} + +/* The main interface for reading a saved file - pass the id number of the file + * to retrieve. Ids must be unique or the earlier file will be hidden. The API + * returns a png_struct and, optionally, a png_info. Both of these will be + * destroyed by store_read_reset above. + */ +static png_structp +set_store_for_read(png_store *ps, png_infopp ppi, png_uint_32 id, + PNG_CONST char *name) +{ + /* Set the name for png_error */ + safecat(ps->test, sizeof ps->test, 0, name); + + if (ps->pread != NULL) + png_error(ps->pread, "read store already in use"); + + store_read_reset(ps); + + /* Both the create APIs can return NULL if used in their default mode + * (because there is no other way of handling an error because the jmp_buf + * by default is stored in png_struct and that has not been allocated!) + * However, given that store_error works correctly in these circumstances + * we don't ever expect NULL in this program. + */ + if (ps->speed) + ps->pread = png_create_read_struct(PNG_LIBPNG_VER_STRING, ps, + store_error, store_warning); + + else + ps->pread = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, ps, + store_error, store_warning, &ps->read_memory_pool, store_malloc, + store_free); + + if (ps->pread == NULL) + { + struct exception_context *the_exception_context = &ps->exception_context; + + store_log(ps, NULL, "png_create_read_struct returned NULL (unexpected)", + 1 /*error*/); + + Throw ps; + } + + store_read_set(ps, id); + + if (ppi != NULL) + *ppi = ps->piread = png_create_info_struct(ps->pread); + + return ps->pread; +} + +/* The overall cleanup of a store simply calls the above then removes all the + * saved files. This does not delete the store itself. + */ +static void +store_delete(png_store *ps) +{ + store_write_reset(ps); + store_read_reset(ps); + store_freefile(&ps->saved); + + if (ps->image != NULL) + { + free(ps->image-1); + ps->image = NULL; + ps->cb_image = 0; + } +} + +/*********************** PNG FILE MODIFICATION ON READ ************************/ +/* Files may be modified on read. The following structure contains a complete + * png_store together with extra members to handle modification and a special + * read callback for libpng. To use this the 'modifications' field must be set + * to a list of png_modification structures that actually perform the + * modification, otherwise a png_modifier is functionally equivalent to a + * png_store. There is a special read function, set_modifier_for_read, which + * replaces set_store_for_read. + */ +typedef struct png_modifier +{ + png_store this; /* I am a png_store */ + struct png_modification *modifications; /* Changes to make */ + + enum modifier_state + { + modifier_start, /* Initial value */ + modifier_signature, /* Have a signature */ + modifier_IHDR /* Have an IHDR */ + } state; /* My state */ + + /* Information from IHDR: */ + png_byte bit_depth; /* From IHDR */ + png_byte colour_type; /* From IHDR */ + + /* While handling PLTE, IDAT and IEND these chunks may be pended to allow + * other chunks to be inserted. + */ + png_uint_32 pending_len; + png_uint_32 pending_chunk; + + /* Test values */ + double *gammas; + unsigned int ngammas; + + /* Lowest sbit to test (libpng fails for sbit < 8) */ + png_byte sbitlow; + + /* Error control - these are the limits on errors accepted by the gamma tests + * below. + */ + double maxout8; /* Maximum output value error */ + double maxabs8; /* Absolute sample error 0..1 */ + double maxpc8; /* Percentage sample error 0..100% */ + double maxout16; /* Maximum output value error */ + double maxabs16; /* Absolute sample error 0..1 */ + double maxpc16; /* Percentage sample error 0..100% */ + + /* Logged 8 and 16 bit errors ('output' values): */ + double error_gray_2; + double error_gray_4; + double error_gray_8; + double error_gray_16; + double error_color_8; + double error_color_16; + + /* Flags: */ + /* Whether or not to interlace. */ + int interlace_type :9; /* int, but must store '1' */ + + /* Run the standard tests? */ + unsigned int test_standard :1; + + /* Run the odd-sized image and interlace read/write tests? */ + unsigned int test_size :1; + + /* Run tests on reading with a combiniation of transforms, */ + unsigned int test_transform :1; + + /* When to use the use_input_precision option: */ + unsigned int use_input_precision :1; + unsigned int use_input_precision_sbit :1; + unsigned int use_input_precision_16to8 :1; + + /* Which gamma tests to run: */ + unsigned int test_gamma_threshold :1; + unsigned int test_gamma_transform :1; /* main tests */ + unsigned int test_gamma_sbit :1; + unsigned int test_gamma_strip16 :1; + + unsigned int log :1; /* Log max error */ + + /* Buffer information, the buffer size limits the size of the chunks that can + * be modified - they must fit (including header and CRC) into the buffer! + */ + size_t flush; /* Count of bytes to flush */ + size_t buffer_count; /* Bytes in buffer */ + size_t buffer_position; /* Position in buffer */ + png_byte buffer[1024]; +} png_modifier; + +static double abserr(png_modifier *pm, png_byte bit_depth) +{ + return bit_depth == 16 ? pm->maxabs16 : pm->maxabs8; +} + +static double pcerr(png_modifier *pm, png_byte bit_depth) +{ + return (bit_depth == 16 ? pm->maxpc16 : pm->maxpc8) * .01; +} + +static double outerr(png_modifier *pm, png_byte bit_depth) +{ + /* There is a serious error in the 2 and 4 bit grayscale transform because + * the gamma table value (8 bits) is simply shifted, not rounded, so the + * error in 4 bit greyscale gamma is up to the value below. This is a hack + * to allow pngvalid to succeed: + */ + if (bit_depth == 2) + return .73182-.5; + + if (bit_depth == 4) + return .90644-.5; + + if (bit_depth == 16) + return pm->maxout16; + + return pm->maxout8; +} + +/* This returns true if the test should be stopped now because it has already + * failed and it is running silently. + */ +static int fail(png_modifier *pm) +{ + return !pm->log && !pm->this.verbose && (pm->this.nerrors > 0 || + (pm->this.treat_warnings_as_errors && pm->this.nwarnings > 0)); +} + +static void +modifier_init(png_modifier *pm) +{ + memset(pm, 0, sizeof *pm); + store_init(&pm->this); + pm->modifications = NULL; + pm->state = modifier_start; + pm->sbitlow = 1U; + pm->maxout8 = pm->maxpc8 = pm->maxabs8 = 0; + pm->maxout16 = pm->maxpc16 = pm->maxabs16 = 0; + pm->error_gray_2 = pm->error_gray_4 = pm->error_gray_8 = 0; + pm->error_gray_16 = pm->error_color_8 = pm->error_color_16 = 0; + pm->interlace_type = PNG_INTERLACE_NONE; + pm->test_standard = 0; + pm->test_size = 0; + pm->test_transform = 0; + pm->use_input_precision = 0; + pm->use_input_precision_sbit = 0; + pm->use_input_precision_16to8 = 0; + pm->test_gamma_threshold = 0; + pm->test_gamma_transform = 0; + pm->test_gamma_sbit = 0; + pm->test_gamma_strip16 = 0; + pm->log = 0; + + /* Rely on the memset for all the other fields - there are no pointers */ +} + +/* One modification structure must be provided for each chunk to be modified (in + * fact more than one can be provided if multiple separate changes are desired + * for a single chunk.) Modifications include adding a new chunk when a + * suitable chunk does not exist. + * + * The caller of modify_fn will reset the CRC of the chunk and record 'modified' + * or 'added' as appropriate if the modify_fn returns 1 (true). If the + * modify_fn is NULL the chunk is simply removed. + */ +typedef struct png_modification +{ + struct png_modification *next; + png_uint_32 chunk; + + /* If the following is NULL all matching chunks will be removed: */ + int (*modify_fn)(struct png_modifier *pm, + struct png_modification *me, int add); + + /* If the following is set to PLTE, IDAT or IEND and the chunk has not been + * found and modified (and there is a modify_fn) the modify_fn will be called + * to add the chunk before the relevant chunk. + */ + png_uint_32 add; + unsigned int modified :1; /* Chunk was modified */ + unsigned int added :1; /* Chunk was added */ + unsigned int removed :1; /* Chunk was removed */ +} png_modification; + +static void modification_reset(png_modification *pmm) +{ + if (pmm != NULL) + { + pmm->modified = 0; + pmm->added = 0; + pmm->removed = 0; + modification_reset(pmm->next); + } +} + +static void +modification_init(png_modification *pmm) +{ + memset(pmm, 0, sizeof *pmm); + pmm->next = NULL; + pmm->chunk = 0; + pmm->modify_fn = NULL; + pmm->add = 0; + modification_reset(pmm); +} + +static void +modifier_reset(png_modifier *pm) +{ + store_read_reset(&pm->this); + pm->modifications = NULL; + pm->state = modifier_start; + pm->bit_depth = pm->colour_type = 0; + pm->pending_len = pm->pending_chunk = 0; + pm->flush = pm->buffer_count = pm->buffer_position = 0; +} + +/* Convenience macros. */ +#define CHUNK(a,b,c,d) (((a)<<24)+((b)<<16)+((c)<<8)+(d)) +#define CHUNK_IHDR CHUNK(73,72,68,82) +#define CHUNK_PLTE CHUNK(80,76,84,69) +#define CHUNK_IDAT CHUNK(73,68,65,84) +#define CHUNK_IEND CHUNK(73,69,78,68) +#define CHUNK_cHRM CHUNK(99,72,82,77) +#define CHUNK_gAMA CHUNK(103,65,77,65) +#define CHUNK_sBIT CHUNK(115,66,73,84) +#define CHUNK_sRGB CHUNK(115,82,71,66) + +/* The guts of modification are performed during a read. */ +static void +modifier_crc(png_bytep buffer) +{ + /* Recalculate the chunk CRC - a complete chunk must be in + * the buffer, at the start. + */ + uInt datalen = png_get_uint_32(buffer); + png_save_uint_32(buffer+datalen+8, crc32(0L, buffer+4, datalen+4)); +} + +static void +modifier_setbuffer(png_modifier *pm) +{ + modifier_crc(pm->buffer); + pm->buffer_count = png_get_uint_32(pm->buffer)+12; + pm->buffer_position = 0; +} + +/* Separate the callback into the actual implementation (which is passed the + * png_modifier explicitly) and the callback, which gets the modifier from the + * png_struct. + */ +static void +modifier_read_imp(png_modifier *pm, png_bytep pb, png_size_t st) +{ + while (st > 0) + { + size_t cb; + png_uint_32 len, chunk; + png_modification *mod; + + if (pm->buffer_position >= pm->buffer_count) switch (pm->state) + { + static png_byte sign[8] = { 137, 80, 78, 71, 13, 10, 26, 10 }; + case modifier_start: + store_read_imp(&pm->this, pm->buffer, 8); /* size of signature. */ + pm->buffer_count = 8; + pm->buffer_position = 0; + + if (memcmp(pm->buffer, sign, 8) != 0) + png_error(pm->this.pread, "invalid PNG file signature"); + pm->state = modifier_signature; + break; + + case modifier_signature: + store_read_imp(&pm->this, pm->buffer, 13+12); /* size of IHDR */ + pm->buffer_count = 13+12; + pm->buffer_position = 0; + + if (png_get_uint_32(pm->buffer) != 13 || + png_get_uint_32(pm->buffer+4) != CHUNK_IHDR) + png_error(pm->this.pread, "invalid IHDR"); + + /* Check the list of modifiers for modifications to the IHDR. */ + mod = pm->modifications; + while (mod != NULL) + { + if (mod->chunk == CHUNK_IHDR && mod->modify_fn && + (*mod->modify_fn)(pm, mod, 0)) + { + mod->modified = 1; + modifier_setbuffer(pm); + } + + /* Ignore removal or add if IHDR! */ + mod = mod->next; + } + + /* Cache information from the IHDR (the modified one.) */ + pm->bit_depth = pm->buffer[8+8]; + pm->colour_type = pm->buffer[8+8+1]; + + pm->state = modifier_IHDR; + pm->flush = 0; + break; + + case modifier_IHDR: + default: + /* Read a new chunk and process it until we see PLTE, IDAT or + * IEND. 'flush' indicates that there is still some data to + * output from the preceding chunk. + */ + if ((cb = pm->flush) > 0) + { + if (cb > st) cb = st; + pm->flush -= cb; + store_read_imp(&pm->this, pb, cb); + pb += cb; + st -= cb; + if (st <= 0) return; + } + + /* No more bytes to flush, read a header, or handle a pending + * chunk. + */ + if (pm->pending_chunk != 0) + { + png_save_uint_32(pm->buffer, pm->pending_len); + png_save_uint_32(pm->buffer+4, pm->pending_chunk); + pm->pending_len = 0; + pm->pending_chunk = 0; + } + else + store_read_imp(&pm->this, pm->buffer, 8); + + pm->buffer_count = 8; + pm->buffer_position = 0; + + /* Check for something to modify or a terminator chunk. */ + len = png_get_uint_32(pm->buffer); + chunk = png_get_uint_32(pm->buffer+4); + + /* Terminators first, they may have to be delayed for added + * chunks + */ + if (chunk == CHUNK_PLTE || chunk == CHUNK_IDAT || + chunk == CHUNK_IEND) + { + mod = pm->modifications; + + while (mod != NULL) + { + if ((mod->add == chunk || + (mod->add == CHUNK_PLTE && chunk == CHUNK_IDAT)) && + mod->modify_fn != NULL && !mod->modified && !mod->added) + { + /* Regardless of what the modify function does do not run + * this again. + */ + mod->added = 1; + + if ((*mod->modify_fn)(pm, mod, 1 /*add*/)) + { + /* Reset the CRC on a new chunk */ + if (pm->buffer_count > 0) + modifier_setbuffer(pm); + + else + { + pm->buffer_position = 0; + mod->removed = 1; + } + + /* The buffer has been filled with something (we assume) + * so output this. Pend the current chunk. + */ + pm->pending_len = len; + pm->pending_chunk = chunk; + break; /* out of while */ + } + } + + mod = mod->next; + } + + /* Don't do any further processing if the buffer was modified - + * otherwise the code will end up modifying a chunk that was + * just added. + */ + if (mod != NULL) + break; /* out of switch */ + } + + /* If we get to here then this chunk may need to be modified. To + * do this it must be less than 1024 bytes in total size, otherwise + * it just gets flushed. + */ + if (len+12 <= sizeof pm->buffer) + { + store_read_imp(&pm->this, pm->buffer+pm->buffer_count, + len+12-pm->buffer_count); + pm->buffer_count = len+12; + + /* Check for a modification, else leave it be. */ + mod = pm->modifications; + while (mod != NULL) + { + if (mod->chunk == chunk) + { + if (mod->modify_fn == NULL) + { + /* Remove this chunk */ + pm->buffer_count = pm->buffer_position = 0; + mod->removed = 1; + break; /* Terminate the while loop */ + } + + else if ((*mod->modify_fn)(pm, mod, 0)) + { + mod->modified = 1; + /* The chunk may have been removed: */ + if (pm->buffer_count == 0) + { + pm->buffer_position = 0; + break; + } + modifier_setbuffer(pm); + } + } + + mod = mod->next; + } + } + + else + pm->flush = len+12 - pm->buffer_count; /* data + crc */ + + /* Take the data from the buffer (if there is any). */ + break; + } + + /* Here to read from the modifier buffer (not directly from + * the store, as in the flush case above.) + */ + cb = pm->buffer_count - pm->buffer_position; + + if (cb > st) + cb = st; + + memcpy(pb, pm->buffer + pm->buffer_position, cb); + st -= cb; + pb += cb; + pm->buffer_position += cb; + } +} + +/* The callback: */ +static void +modifier_read(png_structp pp, png_bytep pb, png_size_t st) +{ + png_modifier *pm = png_get_io_ptr(pp); + + if (pm == NULL || pm->this.pread != pp) + png_error(pp, "bad modifier_read call"); + + modifier_read_imp(pm, pb, st); +} + +/* Like store_progressive_read but the data is getting changed as we go so we + * need a local buffer. + */ +static void +modifier_progressive_read(png_modifier *pm, png_structp pp, png_infop pi) +{ + if (pm->this.pread != pp || pm->this.current == NULL || + pm->this.next == NULL) + png_error(pp, "store state damaged (progressive)"); + + /* This is another Horowitz and Hill random noise generator. In this case + * the aim is to stress the progressive reader with truely horrible variable + * buffer sizes in the range 1..500, so a sequence of 9 bit random numbers + * is generated. We could probably just count from 1 to 32767 and get as + * good a result. + */ + for (;;) + { + static png_uint_32 noise = 1; + png_size_t cb, cbAvail; + png_byte buffer[512]; + + /* Generate 15 more bits of stuff: */ + noise = (noise << 9) | ((noise ^ (noise >> (9-5))) & 0x1ff); + cb = noise & 0x1ff; + + /* Check that this number of bytes are available (in the current buffer.) + * (This doesn't quite work - the modifier might delete a chunk; unlikely + * but possible, it doesn't happen at present because the modifier only + * adds chunks to standard images.) + */ + cbAvail = store_read_buffer_avail(&pm->this); + if (pm->buffer_count > pm->buffer_position) + cbAvail += pm->buffer_count - pm->buffer_position; + + if (cb > cbAvail) + { + /* Check for EOF: */ + if (cbAvail == 0) + break; + + cb = cbAvail; + } + + modifier_read_imp(pm, buffer, cb); + png_process_data(pp, pi, buffer, cb); + } + + /* Check the invariants at the end (if this fails it's a problem in this + * file!) + */ + if (pm->buffer_count > pm->buffer_position || + pm->this.next != &pm->this.current->data || + pm->this.readpos < pm->this.current->datacount) + png_error(pp, "progressive read implementation error"); +} + +/* Set up a modifier. */ +static png_structp +set_modifier_for_read(png_modifier *pm, png_infopp ppi, png_uint_32 id, + PNG_CONST char *name) +{ + /* Do this first so that the modifier fields are cleared even if an error + * happens allocating the png_struct. No allocation is done here so no + * cleanup is required. + */ + pm->state = modifier_start; + pm->bit_depth = 0; + pm->colour_type = 255; + + pm->pending_len = 0; + pm->pending_chunk = 0; + pm->flush = 0; + pm->buffer_count = 0; + pm->buffer_position = 0; + + return set_store_for_read(&pm->this, ppi, id, name); +} + +/***************************** STANDARD PNG FILES *****************************/ +/* Standard files - write and save standard files. */ +/* There are two basic forms of standard images. Those which attempt to have + * all the possible pixel values (not possible for 16bpp images, but a range of + * values are produced) and those which have a range of image sizes. The former + * are used for testing transforms, in particular gamma correction and bit + * reduction and increase. The latter are reserved for testing the behavior of + * libpng with respect to 'odd' image sizes - particularly small images where + * rows become 1 byte and interlace passes disappear. + * + * The first, most useful, set are the 'transform' images, the second set of + * small images are the 'size' images. + * + * The transform files are constructed with rows which fit into a 1024 byte row + * buffer. This makes allocation easier below. Further regardless of the file + * format every row has 128 pixels (giving 1024 bytes for 64bpp formats). + * + * Files are stored with no gAMA or sBIT chunks, with a PLTE only when needed + * and with an ID derived from the colour type, bit depth and interlace type + * as above (FILEID). The width (128) and height (variable) are not stored in + * the FILEID - instead the fields are set to 0, indicating a transform file. + * + * The size files ar constructed with rows a maximum of 128 bytes wide, allowing + * a maximum width of 16 pixels (for the 64bpp case.) They also have a maximum + * height of 16 rows. The width and height are stored in the FILEID and, being + * non-zero, indicate a size file. + */ + +/* The number of passes is related to the interlace type. There wass no libpng + * API to determine this prior to 1.5, so we need an inquiry function: + */ +static int +npasses_from_interlace_type(png_structp pp, int interlace_type) +{ + switch (interlace_type) + { + default: + png_error(pp, "invalid interlace type"); + + case PNG_INTERLACE_NONE: + return 1; + + case PNG_INTERLACE_ADAM7: + return PNG_INTERLACE_ADAM7_PASSES; + } +} + +static unsigned int +bit_size(png_structp pp, png_byte colour_type, png_byte bit_depth) +{ + switch (colour_type) + { + case 0: return bit_depth; + + case 2: return 3*bit_depth; + + case 3: return bit_depth; + + case 4: return 2*bit_depth; + + case 6: return 4*bit_depth; + + default: png_error(pp, "invalid color type"); + } +} + +#define TRANSFORM_WIDTH 128U +#define TRANSFORM_ROWMAX (TRANSFORM_WIDTH*8U) +#define SIZE_ROWMAX (16*8U) /* 16 pixels, max 8 bytes each - 128 bytes */ +#define STANDARD_ROWMAX TRANSFORM_ROWMAX /* The larger of the two */ + +/* So the maximum image sizes are as follows. A 'transform' image may require + * more than 65535 bytes. The size images are a maximum of 2046 bytes. + */ +#define TRANSFORM_IMAGEMAX (TRANSFORM_ROWMAX * (png_uint_32)2048) +#define SIZE_IMAGEMAX (SIZE_ROWMAX * 16U) + +static size_t +transform_rowsize(png_structp pp, png_byte colour_type, png_byte bit_depth) +{ + return (TRANSFORM_WIDTH * bit_size(pp, colour_type, bit_depth)) / 8; +} + +/* transform_width(pp, colour_type, bit_depth) current returns the same number + * every time, so just use a macro: + */ +#define transform_width(pp, colour_type, bit_depth) TRANSFORM_WIDTH + +static png_uint_32 +transform_height(png_structp pp, png_byte colour_type, png_byte bit_depth) +{ + switch (bit_size(pp, colour_type, bit_depth)) + { + case 1: + case 2: + case 4: + return 1; /* Total of 128 pixels */ + + case 8: + return 2; /* Total of 256 pixels/bytes */ + + case 16: + return 512; /* Total of 65536 pixels */ + + case 24: + case 32: + return 512; /* 65536 pixels */ + + case 48: + case 64: + return 2048;/* 4 x 65536 pixels. */ + + default: + return 0; /* Error, will be caught later */ + } +} + +/* The following can only be defined here, now we have the definitions + * of the transform image sizes. + */ +static png_uint_32 +standard_width(png_structp pp, png_uint_32 id) +{ + png_uint_32 width = WIDTH_FROM_ID(id); + UNUSED(pp) + + if (width == 0) + width = transform_width(pp, COL_FROM_ID(id), DEPTH_FROM_ID(id)); + + return width; +} + +static png_uint_32 +standard_height(png_structp pp, png_uint_32 id) +{ + png_uint_32 height = HEIGHT_FROM_ID(id); + + if (height == 0) + height = transform_height(pp, COL_FROM_ID(id), DEPTH_FROM_ID(id)); + + return height; +} + +static png_uint_32 +standard_rowsize(png_structp pp, png_uint_32 id) +{ + png_uint_32 width = standard_width(pp, id); + + /* This won't overflow: */ + width *= bit_size(pp, COL_FROM_ID(id), DEPTH_FROM_ID(id)); + return (width + 7) / 8; +} + +static void +transform_row(png_structp pp, png_byte buffer[TRANSFORM_ROWMAX], + png_byte colour_type, png_byte bit_depth, png_uint_32 y) +{ + png_uint_32 v = y << 7; + png_uint_32 i = 0; + + switch (bit_size(pp, colour_type, bit_depth)) + { + case 1: + while (i<128/8) buffer[i] = v & 0xff, v += 17, ++i; + return; + + case 2: + while (i<128/4) buffer[i] = v & 0xff, v += 33, ++i; + return; + + case 4: + while (i<128/2) buffer[i] = v & 0xff, v += 65, ++i; + return; + + case 8: + /* 256 bytes total, 128 bytes in each row set as follows: */ + while (i<128) buffer[i] = v & 0xff, ++v, ++i; + return; + + case 16: + /* Generate all 65536 pixel values in order, which includes the 8 bit + * GA case as well as the 16 bit G case. + */ + while (i<128) + buffer[2*i] = (v>>8) & 0xff, buffer[2*i+1] = v & 0xff, ++v, ++i; + + return; + + case 24: + /* 65535 pixels, but rotate the values. */ + while (i<128) + { + /* Three bytes per pixel, r, g, b, make b by r^g */ + buffer[3*i+0] = (v >> 8) & 0xff; + buffer[3*i+1] = v & 0xff; + buffer[3*i+2] = ((v >> 8) ^ v) & 0xff; + ++v; + ++i; + } + + return; + + case 32: + /* 65535 pixels, r, g, b, a; just replicate */ + while (i<128) + { + buffer[4*i+0] = (v >> 8) & 0xff; + buffer[4*i+1] = v & 0xff; + buffer[4*i+2] = (v >> 8) & 0xff; + buffer[4*i+3] = v & 0xff; + ++v; + ++i; + } + + return; + + case 48: + /* y is maximum 2047, giving 4x65536 pixels, make 'r' increase by 1 at + * each pixel, g increase by 257 (0x101) and 'b' by 0x1111: + */ + while (i<128) + { + png_uint_32 t = v++; + buffer[6*i+0] = (t >> 8) & 0xff; + buffer[6*i+1] = t & 0xff; + t *= 257; + buffer[6*i+2] = (t >> 8) & 0xff; + buffer[6*i+3] = t & 0xff; + t *= 17; + buffer[6*i+4] = (t >> 8) & 0xff; + buffer[6*i+5] = t & 0xff; + ++i; + } + + return; + + case 64: + /* As above in the 32 bit case. */ + while (i<128) + { + png_uint_32 t = v++; + buffer[8*i+0] = (t >> 8) & 0xff; + buffer[8*i+1] = t & 0xff; + buffer[8*i+4] = (t >> 8) & 0xff; + buffer[8*i+5] = t & 0xff; + t *= 257; + buffer[8*i+2] = (t >> 8) & 0xff; + buffer[8*i+3] = t & 0xff; + buffer[8*i+6] = (t >> 8) & 0xff; + buffer[8*i+7] = t & 0xff; + ++i; + } + return; + + default: + break; + } + + png_error(pp, "internal error"); +} + +/* This is just to do the right cast - could be changed to a function to check + * 'bd' but there isn't much point. + */ +#define DEPTH(bd) ((png_byte)(1U << (bd))) + +/* Make a standardized image given a an image colour type, bit depth and + * interlace type. The standard images have a very restricted range of + * rows and heights and are used for testing transforms rather than image + * layout details. See make_size_images below for a way to make images + * that test odd sizes along with the libpng interlace handling. + */ +static void +make_transform_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, + png_byte PNG_CONST bit_depth, int interlace_type, png_const_charp name) +{ + context(ps, fault); + + Try + { + png_infop pi; + png_structp pp = set_store_for_write(ps, &pi, name); + png_uint_32 h; + + /* In the event of a problem return control to the Catch statement below + * to do the clean up - it is not possible to 'return' directly from a Try + * block. + */ + if (pp == NULL) + Throw ps; + + h = transform_height(pp, colour_type, bit_depth); + + png_set_IHDR(pp, pi, transform_width(pp, colour_type, bit_depth), h, + bit_depth, colour_type, interlace_type, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + if (colour_type == 3) /* palette */ + { + unsigned int i = 0; + png_color pal[256]; + + do + pal[i].red = pal[i].green = pal[i].blue = (png_byte)i; + while(++i < 256U); + + png_set_PLTE(pp, pi, pal, 256); + } + + png_write_info(pp, pi); + + if (png_get_rowbytes(pp, pi) != + transform_rowsize(pp, colour_type, bit_depth)) + png_error(pp, "row size incorrect"); + + else + { + /* Somewhat confusingly this must be called *after* png_write_info + * because if it is called before, the information in *pp has not been + * updated to reflect the interlaced image. + */ + int npasses = png_set_interlace_handling(pp); + int pass; + + if (npasses != npasses_from_interlace_type(pp, interlace_type)) + png_error(pp, "write: png_set_interlace_handling failed"); + + for (pass=0; passtest, sizeof ps->test, 0, "make standard images"); + + /* Arguments are colour_type, low bit depth, high bit depth + */ + make_standard(ps, 0, 0, WRITE_BDHI); + make_standard(ps, 2, 3, WRITE_BDHI); + make_standard(ps, 3, 0, 3 /*palette: max 8 bits*/); + make_standard(ps, 4, 3, WRITE_BDHI); + make_standard(ps, 6, 3, WRITE_BDHI); +} + +/* The following two routines use the PNG interlace support macros from + * png.h to interlace or deinterlace rows. + */ +static void +interlace_row(png_bytep buffer, png_const_bytep imageRow, + unsigned int pixel_size, png_uint_32 w, int pass) +{ + png_uint_32 xin, xout, xstep; + + /* Note that this can, trivially, be optimized to a memcpy on pass 7, the + * code is presented this way to make it easier to understand. In practice + * consult the code in the libpng source to see other ways of doing this. + */ + xin = PNG_PASS_START_COL(pass); + xstep = 1U<= 8) + *buffer++ = (png_byte)y++, bit_width -= 8; + + /* There may be up to 7 remaining bits, these go in the most significant + * bits of the byte. + */ + if (bit_width > 0) + { + png_uint_32 mask = (1U<<(8-bit_width))-1; + *buffer = (png_byte)((*buffer & mask) | (y & ~mask)); + } +} + +static void +make_size_image(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, + png_byte PNG_CONST bit_depth, int PNG_CONST interlace_type, + png_uint_32 PNG_CONST w, png_uint_32 PNG_CONST h, + int PNG_CONST do_interlace) +{ + context(ps, fault); + + Try + { + png_infop pi; + png_structp pp; + unsigned int pixel_size; + + /* Make a name and get an appropriate id for the store: */ + char name[FILE_NAME_SIZE]; + PNG_CONST png_uint_32 id = FILEID(colour_type, bit_depth, interlace_type, + w, h, do_interlace); + + standard_name_from_id(name, sizeof name, 0, id); + pp = set_store_for_write(ps, &pi, name); + + /* In the event of a problem return control to the Catch statement below + * to do the clean up - it is not possible to 'return' directly from a Try + * block. + */ + if (pp == NULL) + Throw ps; + + png_set_IHDR(pp, pi, w, h, bit_depth, colour_type, interlace_type, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + /* Same palette as make_transform_image - I don' think there is any + * benefit from using a different one (JB 20101211) + */ + if (colour_type == 3) /* palette */ + { + unsigned int i = 0; + png_color pal[256]; + + do + pal[i].red = pal[i].green = pal[i].blue = (png_byte)i; + while(++i < 256U); + + png_set_PLTE(pp, pi, pal, 256); + } + + png_write_info(pp, pi); + + /* Calculate the bit size, divide by 8 to get the byte size - this won't + * overflow because we know the w values are all small enough even for + * a system where 'unsigned int' is only 16 bits. + */ + pixel_size = bit_size(pp, colour_type, bit_depth); + if (png_get_rowbytes(pp, pi) != ((w * pixel_size) + 7) / 8) + png_error(pp, "row size incorrect"); + + else + { + int npasses = npasses_from_interlace_type(pp, interlace_type); + png_uint_32 y; + int pass; + png_byte image[16][SIZE_ROWMAX]; + + /* To help consistent error detection make the parts of this buffer + * that aren't set below all '1': + */ + memset(image, 0xff, sizeof image); + + if (!do_interlace && npasses != png_set_interlace_handling(pp)) + png_error(pp, "write: png_set_interlace_handling failed"); + + /* Prepare the whole image first to avoid making it 7 times: */ + for (y=0; y 0) + { + /* Set to all 1's for error detection (libpng tends to + * set unset things to 0). + */ + memset(tempRow, 0xff, sizeof tempRow); + interlace_row(tempRow, row, pixel_size, w, pass); + row = tempRow; + } + else + continue; + } + + /* Only get to here if the row has some pixels in it. */ + png_write_row(pp, row); + } + } + } + + png_write_end(pp, pi); + + /* And store this under the appropriate id, then clean up. */ + store_storefile(ps, id); + + store_write_reset(ps); + } + + Catch(fault) + { + /* Use the png_store returned by the exception. This may help the compiler + * because 'ps' is not used in this branch of the setjmp. Note that fault + * and ps will always be the same value. + */ + store_write_reset(fault); + } +} + +static void +make_size(png_store* PNG_CONST ps, png_byte PNG_CONST colour_type, int bdlo, + int PNG_CONST bdhi) +{ + for (; bdlo <= bdhi; ++bdlo) + { + png_uint_32 width; + + for (width = 1; width <= 16; ++width) + { + png_uint_32 height; + + for (height = 1; height <= 16; ++height) + { + /* The four combinations of DIY interlace and interlace or not - + * no interlace + DIY should be identical to no interlace with + * libpng doing it. + */ + make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_NONE, + width, height, 0); + make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_NONE, + width, height, 1); + make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_ADAM7, + width, height, 0); + make_size_image(ps, colour_type, DEPTH(bdlo), PNG_INTERLACE_ADAM7, + width, height, 1); + } + } + } +} + +static void +make_size_images(png_store *ps) +{ + /* This is in case of errors. */ + safecat(ps->test, sizeof ps->test, 0, "make size images"); + + /* Arguments are colour_type, low bit depth, high bit depth + */ + make_size(ps, 0, 0, WRITE_BDHI); + make_size(ps, 2, 3, WRITE_BDHI); + make_size(ps, 3, 0, 3 /*palette: max 8 bits*/); + make_size(ps, 4, 3, WRITE_BDHI); + make_size(ps, 6, 3, WRITE_BDHI); +} + +/* Return a row based on image id and 'y' for checking: */ +static void +standard_row(png_structp pp, png_byte std[STANDARD_ROWMAX], png_uint_32 id, + png_uint_32 y) +{ + if (WIDTH_FROM_ID(id) == 0) + transform_row(pp, std, COL_FROM_ID(id), DEPTH_FROM_ID(id), y); + else + size_row(std, WIDTH_FROM_ID(id) * bit_size(pp, COL_FROM_ID(id), + DEPTH_FROM_ID(id)), y); +} + +/* Tests - individual test cases */ +/* Like 'make_standard' but errors are deliberately introduced into the calls + * to ensure that they get detected - it should not be possible to write an + * invalid image with libpng! + */ +static void +sBIT0_error_fn(png_structp pp, png_infop pi) +{ + /* 0 is invalid... */ + png_color_8 bad; + bad.red = bad.green = bad.blue = bad.gray = bad.alpha = 0; + png_set_sBIT(pp, pi, &bad); +} + +static void +sBIT_error_fn(png_structp pp, png_infop pi) +{ + png_byte bit_depth; + png_color_8 bad; + + if (png_get_color_type(pp, pi) == PNG_COLOR_TYPE_PALETTE) + bit_depth = 8; + + else + bit_depth = png_get_bit_depth(pp, pi); + + /* Now we know the bit depth we can easily generate an invalid sBIT entry */ + bad.red = bad.green = bad.blue = bad.gray = bad.alpha = + (png_byte)(bit_depth+1); + png_set_sBIT(pp, pi, &bad); +} + +static PNG_CONST struct +{ + void (*fn)(png_structp, png_infop); + PNG_CONST char *msg; + unsigned int warning :1; /* the error is a warning... */ +} error_test[] = + { + { sBIT0_error_fn, "sBIT(0): failed to detect error", 1 }, + { sBIT_error_fn, "sBIT(too big): failed to detect error", 1 }, + }; + +static void +make_error(png_store* volatile ps, png_byte PNG_CONST colour_type, + png_byte bit_depth, int interlace_type, int test, png_const_charp name) +{ + context(ps, fault); + + Try + { + png_structp pp; + png_infop pi; + + pp = set_store_for_write(ps, &pi, name); + + if (pp == NULL) + Throw ps; + + png_set_IHDR(pp, pi, transform_width(pp, colour_type, bit_depth), + transform_height(pp, colour_type, bit_depth), bit_depth, colour_type, + interlace_type, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + if (colour_type == 3) /* palette */ + { + unsigned int i = 0; + png_color pal[256]; + + do + pal[i].red = pal[i].green = pal[i].blue = (png_byte)i; + while(++i < 256U); + + png_set_PLTE(pp, pi, pal, 256); + } + + /* Time for a few errors, these are in various optional chunks, the + * standard tests test the standard chunks pretty well. + */ +# define exception__prev exception_prev_1 +# define exception__env exception_env_1 + Try + { + /* Expect this to throw: */ + ps->expect_error = !error_test[test].warning; + ps->expect_warning = error_test[test].warning; + ps->saw_warning = 0; + error_test[test].fn(pp, pi); + + /* Normally the error is only detected here: */ + png_write_info(pp, pi); + + /* And handle the case where it was only a warning: */ + if (ps->expect_warning && ps->saw_warning) + Throw ps; + + /* If we get here there is a problem, we have success - no error or + * no warning - when we shouldn't have success. Log an error. + */ + store_log(ps, pp, error_test[test].msg, 1 /*error*/); + } + + Catch (fault) + ps = fault; /* expected exit, make sure ps is not clobbered */ +#undef exception__prev +#undef exception__env + + /* And clear these flags */ + ps->expect_error = 0; + ps->expect_warning = 0; + + /* Now write the whole image, just to make sure that the detected, or + * undetected, errro has not created problems inside libpng. + */ + if (png_get_rowbytes(pp, pi) != + transform_rowsize(pp, colour_type, bit_depth)) + png_error(pp, "row size incorrect"); + + else + { + png_uint_32 h = transform_height(pp, colour_type, bit_depth); + int npasses = png_set_interlace_handling(pp); + int pass; + + if (npasses != npasses_from_interlace_type(pp, interlace_type)) + png_error(pp, "write: png_set_interlace_handling failed"); + + for (pass=0; passthis, colour_type, DEPTH(bdlo), interlace_type, + test, name); + + if (fail(pm)) + return 0; + } + } + } + + return 1; /* keep going */ +} + +static void +perform_error_test(png_modifier *pm) +{ + /* Need to do this here because we just write in this test. */ + safecat(pm->this.test, sizeof pm->this.test, 0, "error test"); + + if (!make_errors(pm, 0, 0, WRITE_BDHI)) + return; + + if (!make_errors(pm, 2, 3, WRITE_BDHI)) + return; + + if (!make_errors(pm, 3, 0, 3)) + return; + + if (!make_errors(pm, 4, 3, WRITE_BDHI)) + return; + + if (!make_errors(pm, 6, 3, WRITE_BDHI)) + return; +} + +/* Because we want to use the same code in both the progressive reader and the + * sequential reader it is necessary to deal with the fact that the progressive + * reader callbacks only have one parameter (png_get_progressive_ptr()), so this + * must contain all the test parameters and all the local variables directly + * accessible to the sequential reader implementation. + * + * The technique adopted is to reinvent part of what Dijkstra termed a + * 'display'; an array of pointers to the stack frames of enclosing functions so + * that a nested function definition can access the local (C auto) variables of + * the functions that contain its definition. In fact C provides the first + * pointer (the local variables - the stack frame pointer) and the last (the + * global variables - the BCPL global vector typically implemented as global + * addresses), this code requires one more pointer to make the display - the + * local variables (and function call parameters) of the function that actually + * invokes either the progressive or sequential reader. + * + * Perhaps confusingly this technique is confounded with classes - the + * 'standard_display' defined here is sub-classed as the 'gamma_display' below. + * A gamma_display is a standard_display, taking advantage of the ANSI-C + * requirement that the pointer to the first member of a structure must be the + * same as the pointer to the structure. This allows us to reuse standard_ + * functions in the gamma test code; something that could not be done with + * nested funtions! + */ +typedef struct standard_palette_entry /* pngvalid format palette! */ +{ + png_byte red; + png_byte green; + png_byte blue; + png_byte alpha; +} standard_palette[256]; + +typedef struct standard_display +{ + png_store* ps; /* Test parameters (passed to the function) */ + png_byte colour_type; + png_byte bit_depth; + png_byte red_sBIT; /* Input data sBIT values. */ + png_byte green_sBIT; + png_byte blue_sBIT; + png_byte alpha_sBIT; + int interlace_type; + png_uint_32 id; /* Calculated file ID */ + png_uint_32 w; /* Width of image */ + png_uint_32 h; /* Height of image */ + int npasses; /* Number of interlaced passes */ + png_uint_32 pixel_size; /* Width of one pixel in bits */ + png_uint_32 bit_width; /* Width of output row in bits */ + size_t cbRow; /* Bytes in a row of the output image */ + int do_interlace; /* Do interlacing internally */ + int is_transparent; /* Transparecy information was present. */ + struct + { + png_uint_16 red; + png_uint_16 green; + png_uint_16 blue; + } transparent; /* The transparent color, if set. */ + standard_palette + palette; +} standard_display; + +static void +standard_display_init(standard_display *dp, png_store* ps, png_uint_32 id, + int do_interlace) +{ + dp->ps = ps; + dp->colour_type = COL_FROM_ID(id); + dp->bit_depth = DEPTH_FROM_ID(id); + dp->alpha_sBIT = dp->blue_sBIT = dp->green_sBIT = dp->alpha_sBIT = + dp->bit_depth; + dp->interlace_type = INTERLACE_FROM_ID(id); + dp->id = id; + /* All the rest are filled in after the read_info: */ + dp->w = 0; + dp->h = 0; + dp->npasses = 0; + dp->pixel_size = 0; + dp->bit_width = 0; + dp->cbRow = 0; + dp->do_interlace = do_interlace; + dp->is_transparent = 0; + /* Preset the transparent color to black: */ + memset(&dp->transparent, 0, sizeof dp->transparent); + /* Preset the palette to full intensity/opaque througout: */ + memset(dp->palette, 0xff, sizeof dp->palette); + +} + +/* Call this only if the colour type is 3 - PNG_COLOR_TYPE_PALETTE - otherwise + * it will png_error out. The API returns true if tRNS information was + * present. + */ +static int +standard_palette_init(standard_palette palette, png_structp pp, png_infop pi) +{ + png_colorp pal; + png_bytep trans_alpha; + int num; + + pal = 0; + num = -1; + if (png_get_PLTE(pp, pi, &pal, &num) & PNG_INFO_PLTE) + { + int i; + + for (i=0; i 256) + png_error(pp, "validate: unexpected png_get_tRNS (palette) result"); + + for (i=0; ibit_depth) + png_error(pp, "validate: bit depth changed"); + + if (png_get_color_type(pp, pi) != dp->colour_type) + png_error(pp, "validate: color type changed"); + + if (png_get_filter_type(pp, pi) != PNG_FILTER_TYPE_BASE) + png_error(pp, "validate: filter type changed"); + + if (png_get_interlace_type(pp, pi) != dp->interlace_type) + png_error(pp, "validate: interlacing changed"); + + if (png_get_compression_type(pp, pi) != PNG_COMPRESSION_TYPE_BASE) + png_error(pp, "validate: compression type changed"); + + dp->w = png_get_image_width(pp, pi); + + if (dp->w != standard_width(pp, dp->id)) + png_error(pp, "validate: image width changed"); + + dp->h = png_get_image_height(pp, pi); + + if (dp->h != standard_height(pp, dp->id)) + png_error(pp, "validate: image height changed"); + + /* Record (but don't check at present) the input sBIT according to the colour + * type information. + */ + { + png_color_8p sBIT = 0; + + if (png_get_sBIT(pp, pi, &sBIT) & PNG_INFO_sBIT) + { + int sBIT_invalid = 0; + + if (sBIT == 0) + png_error(pp, "validate: unexpected png_get_sBIT result"); + + if (dp->colour_type & PNG_COLOR_MASK_COLOR) + { + if (sBIT->red == 0 || sBIT->red > dp->bit_depth) + sBIT_invalid = 1; + else + dp->red_sBIT = sBIT->red; + + if (sBIT->green == 0 || sBIT->green > dp->bit_depth) + sBIT_invalid = 1; + else + dp->green_sBIT = sBIT->green; + + if (sBIT->blue == 0 || sBIT->blue > dp->bit_depth) + sBIT_invalid = 1; + else + dp->blue_sBIT = sBIT->blue; + } + + else /* !COLOR */ + { + if (sBIT->gray == 0 || sBIT->gray > dp->bit_depth) + sBIT_invalid = 1; + else + dp->blue_sBIT = dp->green_sBIT = dp->red_sBIT = sBIT->gray; + } + + /* All 8 bits in tRNS for a palette image are significant - see the + * spec. + */ + if (dp->colour_type & PNG_COLOR_MASK_ALPHA) + { + if (sBIT->alpha == 0 || sBIT->alpha > dp->bit_depth) + sBIT_invalid = 1; + else + dp->alpha_sBIT = sBIT->alpha; + } + + if (sBIT_invalid) + png_error(pp, "validate: sBIT value out of range"); + } + } + + /* Important: this is validating the value *before* any transforms have been + * put in place. It doesn't matter for the standard tests, where there are + * no transforms, but it does for other tests where rowbytes may change after + * png_read_update_info. + */ + if (png_get_rowbytes(pp, pi) != standard_rowsize(pp, dp->id)) + png_error(pp, "validate: row size changed"); + + /* The palette is never read for non-palette images, even though it is valid + * - this could be changed. + */ + if (dp->colour_type == 3) /* palette */ + { + int i; + + dp->is_transparent = standard_palette_init(dp->palette, pp, pi); + + /* And validate the result. */ + for (i=0; i<256; ++i) + if (dp->palette[i].red != i || dp->palette[i].green != i || + dp->palette[i].blue != i) + png_error(pp, "validate: color type 3 PLTE chunk changed"); + } + + /* In any case always check for a tranparent color: */ + { + png_color_16p trans_color = 0; + + if (png_get_tRNS(pp, pi, 0, 0, &trans_color) & PNG_INFO_tRNS) + { + if (trans_color == 0) + png_error(pp, "validate: unexpected png_get_tRNS (color) result"); + + switch (dp->colour_type) + { + case 0: + dp->transparent.red = dp->transparent.green = dp->transparent.blue = + trans_color->gray; + dp->is_transparent = 1; + break; + + case 2: + dp->transparent.red = trans_color->red; + dp->transparent.green = trans_color->green; + dp->transparent.blue = trans_color->blue; + dp->is_transparent = 1; + break; + + case 3: + /* Not expected because it should result in the array case + * above. + */ + png_error(pp, "validate: unexpected png_get_tRNS result"); + break; + + default: + png_error(pp, "validate: invalid tRNS chunk with alpha image"); + } + } + } + + /* Read the number of passes - expected to match the value used when + * creating the image (interlaced or not). This has the side effect of + * turning on interlace handling (if do_interlace is not set.) + */ + dp->npasses = npasses_from_interlace_type(pp, dp->interlace_type); + if (!dp->do_interlace && dp->npasses != png_set_interlace_handling(pp)) + png_error(pp, "validate: file changed interlace type"); + + /* Caller calls png_read_update_info or png_start_read_image now, then calls + * part2. + */ +} + +/* This must be called *after* the png_read_update_info call to get the correct + * 'rowbytes' value, otherwise png_get_rowbytes will refer to the untransformed + * image. + */ +static void +standard_info_part2(standard_display *dp, png_structp pp, png_infop pi, + int nImages) +{ + /* Record cbRow now that it can be found. */ + dp->pixel_size = bit_size(pp, png_get_color_type(pp, pi), + png_get_bit_depth(pp, pi)); + dp->bit_width = png_get_image_width(pp, pi) * dp->pixel_size; + dp->cbRow = png_get_rowbytes(pp, pi); + + /* Validate the rowbytes here again. */ + if (dp->cbRow != (dp->bit_width+7)/8) + png_error(pp, "bad png_get_rowbytes calculation"); + + /* Then ensure there is enough space for the output image(s). */ + store_ensure_image(dp->ps, pp, nImages * dp->cbRow * dp->h); +} + +static void +standard_info_imp(standard_display *dp, png_structp pp, png_infop pi, + int nImages) +{ + /* Note that the validation routine has the side effect of turning on + * interlace handling in the subsequent code. + */ + standard_info_part1(dp, pp, pi); + + /* And the info callback has to call this (or png_read_update_info - see + * below in the png_modifier code for that variant. + */ + png_start_read_image(pp); + + /* Validate the height, width and rowbytes plus ensure that sufficient buffer + * exists for decoding the image. + */ + standard_info_part2(dp, pp, pi, nImages); +} + +static void +standard_info(png_structp pp, png_infop pi) +{ + standard_display *dp = png_get_progressive_ptr(pp); + + /* Call with nImages==1 because the progressive reader can only produce one + * image. + */ + standard_info_imp(dp, pp, pi, 1 /*only one image*/); +} + +static void +progressive_row(png_structp pp, png_bytep new_row, png_uint_32 y, int pass) +{ + PNG_CONST standard_display *dp = png_get_progressive_ptr(pp); + + /* When handling interlacing some rows will be absent in each pass, the + * callback still gets called, but with a NULL pointer. This is checked + * in the 'else' clause below. We need our own 'cbRow', but we can't call + * png_get_rowbytes because we got no info structure. + */ + if (new_row != NULL) + { + png_bytep row; + + /* In the case where the reader doesn't do the interlace it gives + * us the y in the sub-image: + */ + if (dp->do_interlace && dp->interlace_type == PNG_INTERLACE_ADAM7) + y = PNG_ROW_FROM_PASS_ROW(y, pass); + + /* Validate this just in case. */ + if (y >= dp->h) + png_error(pp, "invalid y to progressive row callback"); + + row = dp->ps->image + y * dp->cbRow; + + /* Combine the new row into the old: */ + if (dp->do_interlace) + { + if (dp->interlace_type == PNG_INTERLACE_ADAM7) + deinterlace_row(row, new_row, dp->pixel_size, dp->w, pass); + else + memcpy(row, new_row, dp->cbRow); + } + else + png_progressive_combine_row(pp, row, new_row); + } else if (dp->interlace_type == PNG_INTERLACE_ADAM7 && + PNG_ROW_IN_INTERLACE_PASS(y, pass) && + PNG_PASS_COLS(dp->w, pass) > 0) + png_error(pp, "missing row in progressive de-interlacing"); +} + +static void +sequential_row(standard_display *dp, png_structp pp, png_infop pi, + PNG_CONST png_bytep pImage, PNG_CONST png_bytep pDisplay) +{ + PNG_CONST int npasses = dp->npasses; + PNG_CONST int do_interlace = dp->do_interlace && + dp->interlace_type == PNG_INTERLACE_ADAM7; + PNG_CONST png_uint_32 height = standard_height(pp, dp->id); + PNG_CONST png_uint_32 width = standard_width(pp, dp->id); + PNG_CONST size_t cbRow = dp->cbRow; + int pass; + + for (pass=0; pass 0 && PNG_ROW_IN_INTERLACE_PASS(y, pass)) + { + /* Read the row into a pair of temporary buffers, then do the + * merge here into the output rows. + */ + png_byte row[STANDARD_ROWMAX], display[STANDARD_ROWMAX]; + + /* The following aids (to some extent) error detection - we can + * see where png_read_row wrote. Use opposite values in row and + * display to make this easier. + */ + memset(row, 0xff, sizeof row); + memset(display, 0, sizeof display); + + png_read_row(pp, row, display); + + if (pRow1 != NULL) + deinterlace_row(pRow1, row, dp->pixel_size, dp->w, pass); + + if (pRow2 != NULL) + deinterlace_row(pRow2, display, dp->pixel_size, dp->w, pass); + } + } + else + png_read_row(pp, pRow1, pRow2); + + if (pRow1 != NULL) + pRow1 += cbRow; + + if (pRow2 != NULL) + pRow2 += cbRow; + } + } + + /* And finish the read operation (only really necessary if the caller wants + * to find additional data in png_info from chunks after the last IDAT.) + */ + png_read_end(pp, pi); +} + +static void +standard_row_validate(standard_display *dp, png_structp pp, png_const_bytep row, + png_const_bytep display, png_uint_32 y) +{ + png_byte std[STANDARD_ROWMAX]; + + memset(std, 0xff, sizeof std); + standard_row(pp, std, dp->id, y); + + /* At the end both the 'row' and 'display' arrays should end up identical. + * In earlier passes 'row' will be partially filled in, with only the pixels + * that have been read so far, but 'display' will have those pixels + * replicated to fill the unread pixels while reading an interlaced image. + * The side effect inside the libpng sequential reader is that the 'row' + * array retains the correct values for unwritten pixels within the row + * bytes, while the 'display' array gets bits off the end of the image (in + * the last byte) trashed. Unfortunately in the progressive reader the + * row bytes are always trashed, so we always do a pixel_cmp here even though + * a memcmp of all cbRow bytes will succeed for the sequential reader. + */ + if (row != NULL && pixel_cmp(std, row, dp->bit_width) != 0) + { + char msg[64]; + sprintf(msg, "PNG image row %d changed", y); + png_error(pp, msg); + } + + /* In this case use pixel_cmp because we need to compare a partial + * byte at the end of the row if the row is not an exact multiple + * of 8 bits wide. + */ + if (display != NULL && pixel_cmp(std, display, dp->bit_width) != 0) + { + char msg[64]; + sprintf(msg, "display row %d changed", y); + png_error(pp, msg); + } +} + +static void +standard_image_validate(standard_display *dp, png_structp pp, + png_const_bytep pImage, png_const_bytep pDisplay) +{ + png_uint_32 y; + + for (y=0; yh; ++y) + { + standard_row_validate(dp, pp, pImage, pDisplay, y); + + if (pImage != NULL) + pImage += dp->cbRow; + + if (pDisplay != NULL) + pDisplay += dp->cbRow; + } + + /* This avoids false positives if the validation code is never called! */ + dp->ps->validated = 1; +} + +static void +standard_end(png_structp pp, png_infop pi) +{ + standard_display *dp = png_get_progressive_ptr(pp); + + UNUSED(pi) + + /* Validate the image - progressive reading only produces one variant for + * interlaced images. + */ + standard_image_validate(dp, pp, dp->ps->image, NULL); +} + +/* A single test run checking the standard image to ensure it is not damaged. */ +static void +standard_test(png_store* PNG_CONST psIn, png_uint_32 PNG_CONST id, + int do_interlace) +{ + standard_display d; + context(psIn, fault); + + /* Set up the display (stack frame) variables from the arguments to the + * function and initialize the locals that are filled in later. + */ + standard_display_init(&d, psIn, id, do_interlace); + + /* Everything is protected by a Try/Catch. The functions called also + * typically have local Try/Catch blocks. + */ + Try + { + png_structp pp; + png_infop pi; + + /* Get a png_struct for reading the image. This will throw an error if it + * fails, so we don't need to check the result. + */ + pp = set_store_for_read(d.ps, &pi, d.id, + d.do_interlace ? (d.ps->progressive ? + "pngvalid progressive deinterlacer" : + "pngvalid sequential deinterlacer") : (d.ps->progressive ? + "progressive reader" : "sequential reader")); + + /* Introduce the correct read function. */ + if (d.ps->progressive) + { + png_set_progressive_read_fn(pp, &d, standard_info, progressive_row, + standard_end); + + /* Now feed data into the reader until we reach the end: */ + store_progressive_read(d.ps, pp, pi); + } + else + { + /* Note that this takes the store, not the display. */ + png_set_read_fn(pp, d.ps, store_read); + + /* Check the header values: */ + png_read_info(pp, pi); + + /* The code tests both versions of the images that the sequential + * reader can produce. + */ + standard_info_imp(&d, pp, pi, 2 /*images*/); + + /* Need the total bytes in the image below; we can't get to this point + * unless the PNG file values have been checked against the expected + * values. + */ + { + PNG_CONST png_bytep pImage = d.ps->image; + PNG_CONST png_bytep pDisplay = pImage + d.cbRow * d.h; + + sequential_row(&d, pp, pi, pImage, pDisplay); + + /* After the last pass loop over the rows again to check that the + * image is correct. + */ + standard_image_validate(&d, pp, pImage, pDisplay); + } + } + + /* Check for validation. */ + if (!d.ps->validated) + png_error(pp, "image read failed silently"); + + /* Successful completion. */ + } + + Catch(fault) + d.ps = fault; /* make sure this hasn't been clobbered. */ + + /* In either case clean up the store. */ + store_read_reset(d.ps); +} + +static int +test_standard(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type, + int bdlo, int PNG_CONST bdhi) +{ + for (; bdlo <= bdhi; ++bdlo) + { + int interlace_type; + + for (interlace_type = PNG_INTERLACE_NONE; + interlace_type < PNG_INTERLACE_LAST; ++interlace_type) + { + standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), + interlace_type, 0, 0, 0), 0/*do_interlace*/); + + if (fail(pm)) + return 0; + } + } + + return 1; /* keep going */ +} + +static void +perform_standard_test(png_modifier *pm) +{ + /* Test each colour type over the valid range of bit depths (expressed as + * log2(bit_depth) in turn, stop as soon as any error is detected. + */ + if (!test_standard(pm, 0, 0, READ_BDHI)) + return; + + if (!test_standard(pm, 2, 3, READ_BDHI)) + return; + + if (!test_standard(pm, 3, 0, 3)) + return; + + if (!test_standard(pm, 4, 3, READ_BDHI)) + return; + + if (!test_standard(pm, 6, 3, READ_BDHI)) + return; +} + + +/********************************** SIZE TESTS ********************************/ +static int +test_size(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type, + int bdlo, int PNG_CONST bdhi) +{ + /* Run the tests on each combination. + * + * NOTE: on my 32 bit x86 each of the following blocks takes + * a total of 3.5 seconds if done across every combo of bit depth + * width and height. This is a waste of time in practice, hence the + * hinc and winc stuff: + */ + static PNG_CONST png_byte hinc[] = {1, 3, 11, 1, 5}; + static PNG_CONST png_byte winc[] = {1, 9, 5, 7, 1}; + for (; bdlo <= bdhi; ++bdlo) + { + png_uint_32 h, w; + + for (h=1; h<=16; h+=hinc[bdlo]) for (w=1; w<=16; w+=winc[bdlo]) + { + /* First test all the 'size' images against the sequential + * reader using libpng to deinterlace (where required.) This + * validates the write side of libpng. There are four possibilities + * to validate. + */ + standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), + PNG_INTERLACE_NONE, w, h, 0), 0/*do_interlace*/); + + if (fail(pm)) + return 0; + + standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), + PNG_INTERLACE_NONE, w, h, 1), 0/*do_interlace*/); + + if (fail(pm)) + return 0; + + standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), + PNG_INTERLACE_ADAM7, w, h, 0), 0/*do_interlace*/); + + if (fail(pm)) + return 0; + + standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), + PNG_INTERLACE_ADAM7, w, h, 1), 0/*do_interlace*/); + + if (fail(pm)) + return 0; + + /* Now validate the interlaced read side - do_interlace true, + * in the progressive case this does actually make a difference + * to the code used in the non-interlaced case too. + */ + standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), + PNG_INTERLACE_NONE, w, h, 0), 1/*do_interlace*/); + + if (fail(pm)) + return 0; + + standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), + PNG_INTERLACE_ADAM7, w, h, 0), 1/*do_interlace*/); + + if (fail(pm)) + return 0; + } + } + + return 1; /* keep going */ +} + +static void +perform_size_test(png_modifier *pm) +{ + /* Test each colour type over the valid range of bit depths (expressed as + * log2(bit_depth) in turn, stop as soon as any error is detected. + */ + if (!test_size(pm, 0, 0, READ_BDHI)) + return; + + if (!test_size(pm, 2, 3, READ_BDHI)) + return; + + /* For the moment don't do the palette test - it's a waste of time when + * compared to the greyscale test. + */ +#if 0 + if (!test_size(pm, 3, 0, 3)) + return; +#endif + + if (!test_size(pm, 4, 3, READ_BDHI)) + return; + + if (!test_size(pm, 6, 3, READ_BDHI)) + return; +} + + +/******************************* TRANSFORM TESTS ******************************/ +/* A set of tests to validate libpng image transforms. The possibilities here + * are legion because the transforms can be combined in a combinatorial + * fashion. To deal with this some measure of restraint is required, otherwise + * the tests would take forever. + */ +typedef struct image_pixel +{ + /* A local (pngvalid) representation of a PNG pixel, in all its + * various forms. + */ + unsigned int red, green, blue, alpha; /* For non-palette images. */ + unsigned int palette_index; /* For a palette image. */ + png_byte colour_type; /* As in the spec. */ + png_byte bit_depth; /* Defines bit size in row */ + png_byte sample_depth; /* Scale of samples */ + int have_tRNS; /* tRNS chunk may need processing */ + + /* For checking the code calculates double precision floating point values + * along with an error value, accumulated from the transforms. Because an + * sBIT setting allows larger error bounds (indeed, by the spec, apparently + * up to just less than +/-1 in the scaled value) the *lowest* sBIT for each + * channel is stored. This sBIT value is folded in to the stored error value + * at the end of the application of the transforms to the pixel. + */ + double redf, greenf, bluef, alphaf; + double rede, greene, bluee, alphae; + png_byte red_sBIT, green_sBIT, blue_sBIT, alpha_sBIT; +} image_pixel; + +/* Shared utility function, see below. */ +static void +image_pixel_setf(image_pixel *this, unsigned int max) +{ + this->redf = this->red / (double)max; + this->greenf = this->green / (double)max; + this->bluef = this->blue / (double)max; + this->alphaf = this->alpha / (double)max; + + if (this->red < max) + this->rede = this->redf * DBL_EPSILON; + else + this->rede = 0; + if (this->green < max) + this->greene = this->greenf * DBL_EPSILON; + else + this->greene = 0; + if (this->blue < max) + this->bluee = this->bluef * DBL_EPSILON; + else + this->bluee = 0; + if (this->alpha < max) + this->alphae = this->alphaf * DBL_EPSILON; + else + this->alphae = 0; +} + +/* Initialize the structure for the next pixel - call this before doing any + * transforms and call it for each pixel since all the fields may need to be + * reset. + */ +static void +image_pixel_init(image_pixel *this, png_const_bytep row, png_byte colour_type, + png_byte bit_depth, png_uint_32 x, standard_palette palette) +{ + PNG_CONST png_byte sample_depth = (png_byte)(colour_type == + PNG_COLOR_TYPE_PALETTE ? 8 : bit_depth); + PNG_CONST unsigned int max = (1U<palette_index = this->red = this->green = this->blue = + sample(row, colour_type, bit_depth, x, 0); + this->alpha = max; + this->red_sBIT = this->green_sBIT = this->blue_sBIT = this->alpha_sBIT = + sample_depth; + + /* Then override as appropriate: */ + if (colour_type == 3) /* palette */ + { + /* This permits the caller to default to the sample value. */ + if (palette != 0) + { + PNG_CONST unsigned int i = this->palette_index; + + this->red = palette[i].red; + this->green = palette[i].green; + this->blue = palette[i].blue; + this->alpha = palette[i].alpha; + } + } + + else /* not palette */ + { + unsigned int i = 0; + + if (colour_type & 2) + { + this->green = sample(row, colour_type, bit_depth, x, 1); + this->blue = sample(row, colour_type, bit_depth, x, 2); + i = 2; + } + if (colour_type & 4) + this->alpha = sample(row, colour_type, bit_depth, x, ++i); + } + + /* Calculate the scaled values, these are simply the values divided by + * 'max' and the error is initialized to the double precision epsilon value + * from the header file. + */ + image_pixel_setf(this, max); + + /* Store the input information for use in the transforms - these will + * modify the information. + */ + this->colour_type = colour_type; + this->bit_depth = bit_depth; + this->sample_depth = sample_depth; + this->have_tRNS = 0; +} + +/* Convert a palette image to an rgb image. This necessarily converts the tRNS + * chunk at the same time, because the tRNS will be in palette form. + */ +static void +image_pixel_convert_PLTE(image_pixel *this, const standard_display *display) +{ + if (this->colour_type == PNG_COLOR_TYPE_PALETTE) + { + PNG_CONST unsigned int i = this->palette_index; + + this->bit_depth = this->sample_depth; + this->red = display->palette[i].red; + this->green = display->palette[i].green; + this->blue = display->palette[i].blue; + this->red_sBIT = display->red_sBIT; + this->green_sBIT = display->green_sBIT; + this->blue_sBIT = display->blue_sBIT; + + if (this->have_tRNS) + { + this->alpha = display->palette[i].alpha; + this->colour_type = PNG_COLOR_TYPE_RGB_ALPHA; + this->have_tRNS = 0; + } + else + { + this->alpha = 255; + this->colour_type = PNG_COLOR_TYPE_RGB; + } + this->alpha_sBIT = 8; + + /* And regenerate the scaled values and all the errors, which are now set + * back to the initial values. + */ + image_pixel_setf(this, 255); + } +} + +/* Add an alpha channel, this will glom in the tRNS information because tRNS is + * not valid in an alpha image. The bit depth will invariably be set to at + * least 8. Palette images will be converted to alpha (using the above API). + */ +static void +image_pixel_add_alpha(image_pixel *this, const standard_display *display) +{ + if (this->colour_type == PNG_COLOR_TYPE_PALETTE) + image_pixel_convert_PLTE(this, display); + + if ((this->colour_type & PNG_COLOR_MASK_ALPHA) == 0) + { + if (this->colour_type == PNG_COLOR_TYPE_GRAY) + { + if (this->bit_depth < 8) + this->bit_depth = 8; + + if (this->have_tRNS) + { + this->have_tRNS = 0; + + /* Check the input, original, channel value here against the + * original tRNS gray chunk valie. + */ + if (this->red == display->transparent.red) + this->alphaf = 0; + else + this->alphaf = 1; + } + else + this->alphaf = 1; + + this->colour_type = PNG_COLOR_TYPE_GRAY_ALPHA; + } + + else if (this->colour_type == PNG_COLOR_TYPE_RGB) + { + if (this->have_tRNS) + { + this->have_tRNS = 0; + + /* Again, check the exact input values, not the current transformed + * value! + */ + if (this->red == display->transparent.red && + this->green == display->transparent.green && + this->blue == display->transparent.blue) + this->alphaf = 0; + else + this->alphaf = 1; + + this->colour_type = PNG_COLOR_TYPE_RGB_ALPHA; + } + } + + /* The error in the alpha is zero and the sBIT value comes from the + * original sBIT data (actually it will always be the original bit depth). + */ + this->alphae = 0; + this->alpha_sBIT = display->alpha_sBIT; + } +} + +struct transform_display; +typedef struct image_transform +{ + /* The name of this transform: a string. */ + PNG_CONST char *name; + + /* Each transform can be disabled from the command line: */ + int enable; + + /* The global list of transforms; read only. */ + struct image_transform *PNG_CONST list; + + /* The global count of the number of times this transform has been set on an + * image. + */ + unsigned int global_use; + + /* The local count of the number of times this transform has been set. */ + unsigned int local_use; + + /* The next transform in the list, each transform must call its own next + * transform after it has processed the pixel successfully. + */ + PNG_CONST struct image_transform *next; + + /* A single transform for the image, expressed as a series of function + * callbacks and some space for values. + * + * First a callback to set the transform on the current png_read_struct: + */ + void (*set)(PNG_CONST struct image_transform *this, + struct transform_display *that, png_structp pp, png_infop pi); + + /* Then a transform that takes an input pixel in one PNG format or another + * and modifies it by a pngvalid implementation of the transform (thus + * duplicating the libpng intent without, we hope, duplicating the bugs + * in the libpng implementation!) The png_structp is solely to allow error + * reporting via png_error and png_warning. + */ + void (*mod)(PNG_CONST struct image_transform *this, image_pixel *that, + png_structp pp, PNG_CONST struct transform_display *display); + + /* Add this transform to the list and return true if the transform is + * meaningful for this colour type and bit depth - if false then the + * transform should have no effect on the image so there's not a lot of + * point running it. + */ + int (*add)(struct image_transform *this, + PNG_CONST struct image_transform **that, png_byte colour_type, + png_byte bit_depth); +} image_transform; + +typedef struct transform_display +{ + standard_display this; + + /* Parameters */ + png_modifier* pm; + PNG_CONST image_transform* transform_list; + + /* Local variables */ + png_byte output_colour_type; + png_byte output_bit_depth; +} transform_display; + +/* Two functions to end the list: */ +static void +image_transform_set_end(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + UNUSED(this) + UNUSED(that) + UNUSED(pp) + UNUSED(pi) +} + +/* At the end of the list recalculate the output image pixel value from the + * double precision values set up by the preceding 'mod' calls: + */ +static unsigned int +sample_scale(double sample_value, unsigned int scale) +{ + sample_value = floor(sample_value * scale + .5); + + /* Return NaN as 0: */ + if (!(sample_value > 0)) + sample_value = 0; + else if (sample_value > scale) + sample_value = scale; + + return (unsigned int)sample_value; +} + +static void +image_transform_mod_end(PNG_CONST image_transform *this, image_pixel *that, + png_structp pp, PNG_CONST transform_display *display) +{ + PNG_CONST unsigned int scale = (1U<sample_depth)-1; + + UNUSED(this) + UNUSED(pp) + UNUSED(display) + + /* At the end recalculate the digitized red green and blue values according + * to the current sample_depth of the pixel. + * + * The sample value is simply scaled to the maximum, checking for over + * and underflow (which can both happen for some image transforms, + * including simple size scaling, though libpng doesn't do that at present. + */ + that->red = sample_scale(that->redf, scale); + + /* The error value is increased, at the end, according to the lowest sBIT + * value seen. Common sense tells us that the intermediate integer + * representations are no more accurate than +/- 0.5 in the integral values, + * the sBIT allows the implementation to be worse than this. In addition the + * PNG specification actually permits any error within the range (-1..+1), + * but that is ignored here. Instead the final digitized value is compared, + * below to the digitized value of the error limits - this has the net effect + * of allowing (almost) +/-1 in the output value. It's difficult to see how + * any algorithm that digitizes intermediate results can be more accurate. + */ + that->rede += 1./(2*((1U<red_sBIT)-1)); + + if (that->colour_type & PNG_COLOR_MASK_COLOR) + { + that->green = sample_scale(that->greenf, scale); + that->blue = sample_scale(that->bluef, scale); + that->greene += 1./(2*((1U<green_sBIT)-1)); + that->bluee += 1./(2*((1U<blue_sBIT)-1)); + } + else + { + that->blue = that->green = that->red; + that->bluef = that->greenf = that->redf; + that->bluee = that->greene = that->rede; + } + + if ((that->colour_type & PNG_COLOR_MASK_ALPHA) || + that->colour_type == PNG_COLOR_TYPE_PALETTE) + { + that->alpha = sample_scale(that->alphaf, scale); + that->alphae += 1./(2*((1U<alpha_sBIT)-1)); + } + else + { + that->alpha = scale; /* opaque */ + that->alpha = 1; /* Override this. */ + that->alphae = 0; /* It's exact ;-) */ + } +} + +/* Static 'end' structure: */ +static image_transform image_transform_end = +{ + "(end)", /* name */ + 1, /* enable */ + 0, /* list */ + 0, /* global_use */ + 0, /* local_use */ + 0, /* next */ + image_transform_set_end, + image_transform_mod_end, + 0 /* never called, I want it to crash if it is! */ +}; + +/* Reader callbacks and implementations, where they differ from the standard + * ones. + */ +static void +transform_display_init(transform_display *dp, png_modifier *pm, png_uint_32 id, + PNG_CONST image_transform *transform_list) +{ + /* Standard fields */ + standard_display_init(&dp->this, &pm->this, id, 0/*do_interlace*/); + + /* Parameter fields */ + dp->pm = pm; + dp->transform_list = transform_list; + + /* Local variable fields */ + dp->output_colour_type = 255; /* invalid */ + dp->output_bit_depth = 255; /* invalid */ +} + +static void +transform_info_imp(transform_display *dp, png_structp pp, png_infop pi) +{ + /* Reuse the standard stuff as appropriate. */ + standard_info_part1(&dp->this, pp, pi); + + /* Now set the list of transforms. */ + dp->transform_list->set(dp->transform_list, dp, pp, pi); + + /* Update the info structure for these transforms: */ + png_read_update_info(pp, pi); + + /* And get the output information into the standard_display */ + standard_info_part2(&dp->this, pp, pi, 1/*images*/); + + /* Plus the extra stuff we need for the transform tests: */ + dp->output_colour_type = png_get_color_type(pp, pi); + dp->output_bit_depth = png_get_bit_depth(pp, pi); + + /* Validate the combination of colour type and bit depth that we are getting + * out of libpng; the semantics of something not in the PNG spec are, at + * best, unclear. + */ + switch (dp->output_colour_type) + { + case PNG_COLOR_TYPE_PALETTE: + if (dp->output_bit_depth > 8) goto error; + /*FALL THROUGH*/ + case PNG_COLOR_TYPE_GRAY: + if (dp->output_bit_depth == 1 || dp->output_bit_depth == 2 || + dp->output_bit_depth == 4) + break; + /*FALL THROUGH*/ + default: + if (dp->output_bit_depth == 8 || dp->output_bit_depth == 16) + break; + /*FALL THROUGH*/ + error: + { + char message[128]; + size_t pos; + + pos = safecat(message, sizeof message, 0, + "invalid final bit depth: colour type("); + pos = safecatn(message, sizeof message, pos, dp->output_colour_type); + pos = safecat(message, sizeof message, pos, ") with bit depth: "); + pos = safecatn(message, sizeof message, pos, dp->output_bit_depth); + + png_error(pp, message); + } + } + + /* Use a test pixel to check that the output agrees with what we expect - + * this avoids running the whole test if the output is unexpected. + */ + { + image_pixel test_pixel; + + memset(&test_pixel, 0, sizeof test_pixel); + test_pixel.colour_type = dp->this.colour_type; /* input */ + test_pixel.bit_depth = dp->this.bit_depth; + if (test_pixel.colour_type == PNG_COLOR_TYPE_PALETTE) + test_pixel.sample_depth = 8; + else + test_pixel.sample_depth = test_pixel.bit_depth; + /* Don't need sBIT here */ + test_pixel.have_tRNS = dp->this.is_transparent; + + dp->transform_list->mod(dp->transform_list, &test_pixel, pp, dp); + + if (test_pixel.colour_type != dp->output_colour_type) + { + char message[128]; + size_t pos = safecat(message, sizeof message, 0, "colour type "); + + pos = safecatn(message, sizeof message, pos, dp->output_colour_type); + pos = safecat(message, sizeof message, pos, " expected "); + pos = safecatn(message, sizeof message, pos, test_pixel.colour_type); + + png_error(pp, message); + } + + if (test_pixel.bit_depth != dp->output_bit_depth) + { + char message[128]; + size_t pos = safecat(message, sizeof message, 0, "bit depth "); + + pos = safecatn(message, sizeof message, pos, dp->output_bit_depth); + pos = safecat(message, sizeof message, pos, " expected "); + pos = safecatn(message, sizeof message, pos, test_pixel.bit_depth); + + png_error(pp, message); + } + + /* If both bit depth and colour type are correct check the sample depth. + * I believe these are both internal errors. + */ + if (test_pixel.colour_type == PNG_COLOR_TYPE_PALETTE) + { + if (test_pixel.sample_depth != 8) /* oops - internal error! */ + png_error(pp, "pngvalid: internal: palette sample depth not 8"); + } + else if (test_pixel.sample_depth != dp->output_bit_depth) + { + char message[128]; + size_t pos = safecat(message, sizeof message, 0, + "internal: sample depth "); + + pos = safecatn(message, sizeof message, pos, dp->output_bit_depth); + pos = safecat(message, sizeof message, pos, " expected "); + pos = safecatn(message, sizeof message, pos, test_pixel.sample_depth); + + png_error(pp, message); + } + } +} + +static void +transform_info(png_structp pp, png_infop pi) +{ + transform_info_imp(png_get_progressive_ptr(pp), pp, pi); +} + +static void +transform_range_check(png_structp pp, unsigned int r, unsigned int g, + unsigned int b, unsigned int a, unsigned int in_digitized, double in, + unsigned int out, png_byte sample_depth, double err, PNG_CONST char *name) +{ + /* Compare the scaled, digitzed, values of our local calculation (in+-err) + * with the digitized values libpng produced; 'sample_depth' is the actual + * digitization depth of the libpng output colors (the bit depth except for + * palette images where it is always 8.) + */ + unsigned int max = (1U<= in_min && out <= in_max)) + { + char message[256]; + size_t pos; + + pos = safecat(message, sizeof message, 0, name); + pos = safecat(message, sizeof message, pos, " output value error: rgba("); + pos = safecatn(message, sizeof message, pos, r); + pos = safecat(message, sizeof message, pos, ","); + pos = safecatn(message, sizeof message, pos, g); + pos = safecat(message, sizeof message, pos, ","); + pos = safecatn(message, sizeof message, pos, b); + pos = safecat(message, sizeof message, pos, ","); + pos = safecatn(message, sizeof message, pos, a); + pos = safecat(message, sizeof message, pos, "): "); + pos = safecatn(message, sizeof message, pos, out); + pos = safecat(message, sizeof message, pos, " expected: "); + pos = safecatn(message, sizeof message, pos, in_digitized); + pos = safecat(message, sizeof message, pos, " ("); + pos = safecatd(message, sizeof message, pos, (in-err)*max, 3); + pos = safecat(message, sizeof message, pos, ".."); + pos = safecatd(message, sizeof message, pos, (in+err)*max, 3); + pos = safecat(message, sizeof message, pos, ")"); + + png_error(pp, message); + } +} + +static void +transform_image_validate(transform_display *dp, png_structp pp, png_infop pi, + png_const_bytep pRow) +{ + /* Constants for the loop below: */ + PNG_CONST png_byte in_ct = dp->this.colour_type; + PNG_CONST png_byte in_bd = dp->this.bit_depth; + PNG_CONST png_uint_32 w = dp->this.w; + PNG_CONST png_uint_32 h = dp->this.h; + PNG_CONST size_t cbRow = dp->this.cbRow; + PNG_CONST png_byte out_ct = dp->output_colour_type; + PNG_CONST png_byte out_bd = dp->output_bit_depth; + PNG_CONST png_byte sample_depth = (png_byte)(out_ct == + PNG_COLOR_TYPE_PALETTE ? 8 : out_bd); + PNG_CONST png_byte red_sBIT = dp->this.red_sBIT; + PNG_CONST png_byte green_sBIT = dp->this.green_sBIT; + PNG_CONST png_byte blue_sBIT = dp->this.blue_sBIT; + PNG_CONST png_byte alpha_sBIT = dp->this.alpha_sBIT; + PNG_CONST int have_tRNS = dp->this.is_transparent; + + standard_palette out_palette; + png_uint_32 y; + + UNUSED(pi) + + /* Read the palette corresponding to the output if the output colour type + * indicates a palette, othewise set out_palette to garbage. + */ + if (out_ct == PNG_COLOR_TYPE_PALETTE) + (void)standard_palette_init(out_palette, pp, pi); + else + memset(out_palette, 0x5e, sizeof out_palette); + + for (y=0; ythis.palette); + + in_pixel.red_sBIT = red_sBIT; + in_pixel.green_sBIT = green_sBIT; + in_pixel.blue_sBIT = blue_sBIT; + in_pixel.alpha_sBIT = alpha_sBIT; + in_pixel.have_tRNS = have_tRNS; + + /* For error detection, below. */ + r = in_pixel.red; + g = in_pixel.green; + b = in_pixel.blue; + a = in_pixel.alpha; + + dp->transform_list->mod(dp->transform_list, &in_pixel, pp, dp); + + /* Read the output pixel and compare it to what we got, we don't + * use the error field here, so no need to update sBIT. + */ + image_pixel_init(&out_pixel, pRow, out_ct, out_bd, x, out_palette); + + /* We don't expect changes to the index here even if the bit depth is + * changed. + */ + if (in_ct == PNG_COLOR_TYPE_PALETTE && + out_ct == PNG_COLOR_TYPE_PALETTE) + { + if (in_pixel.palette_index != out_pixel.palette_index) + png_error(pp, "unexpected transformed palette index"); + } + + /* Check the colours for palette images too - in fact the palette could + * be separately verified itself in most cases. + */ + if (in_pixel.red != out_pixel.red) + transform_range_check(pp, r, g, b, a, in_pixel.red, in_pixel.redf, + out_pixel.red, sample_depth, in_pixel.rede, "red/gray"); + + if ((out_ct & PNG_COLOR_MASK_COLOR) != 0 && + in_pixel.green != out_pixel.green) + transform_range_check(pp, r, g, b, a, in_pixel.green, + in_pixel.greenf, out_pixel.green, sample_depth, in_pixel.greene, + "green"); + + if ((out_ct & PNG_COLOR_MASK_COLOR) != 0 && + in_pixel.blue != out_pixel.blue) + transform_range_check(pp, r, g, b, a, in_pixel.blue, in_pixel.bluef, + out_pixel.blue, sample_depth, in_pixel.bluee, "blue"); + + if ((out_ct & PNG_COLOR_MASK_ALPHA) != 0 && + in_pixel.alpha != out_pixel.alpha) + transform_range_check(pp, r, g, b, a, in_pixel.alpha, + in_pixel.alphaf, out_pixel.alpha, sample_depth, in_pixel.alphae, + "alpha"); + } /* pixel (x) loop */ + } /* row (y) loop */ + + /* Record that something was actually checked to avoid a false positive. */ + dp->this.ps->validated = 1; +} + +static void +transform_end(png_structp pp, png_infop pi) +{ + transform_display *dp = png_get_progressive_ptr(pp); + + transform_image_validate(dp, pp, pi, dp->this.ps->image); +} + +/* A single test run. */ +static void +transform_test(png_modifier *pmIn, PNG_CONST png_uint_32 idIn, + PNG_CONST image_transform* transform_listIn, PNG_CONST char *name) +{ + transform_display d; + context(&pmIn->this, fault); + + transform_display_init(&d, pmIn, idIn, transform_listIn); + + Try + { + png_structp pp; + png_infop pi; + + /* Get a png_struct for writing the image. */ + pp = set_modifier_for_read(d.pm, &pi, d.this.id, name); + +# if 0 + /* Logging (debugging only) */ + { + char buffer[256]; + + (void)store_message(&d.pm->this, pp, buffer, sizeof buffer, 0, + "running test"); + + fprintf(stderr, "%s\n", buffer); + } +# endif + + /* Introduce the correct read function. */ + if (d.pm->this.progressive) + { + /* Share the row function with the standard implementation. */ + png_set_progressive_read_fn(pp, &d, transform_info, progressive_row, + transform_end); + + /* Now feed data into the reader until we reach the end: */ + modifier_progressive_read(d.pm, pp, pi); + } + else + { + /* modifier_read expects a png_modifier* */ + png_set_read_fn(pp, d.pm, modifier_read); + + /* Check the header values: */ + png_read_info(pp, pi); + + /* Process the 'info' requirements. Only one image is generated */ + transform_info_imp(&d, pp, pi); + + sequential_row(&d.this, pp, pi, NULL, d.this.ps->image); + + transform_image_validate(&d, pp, pi, d.this.ps->image); + } + + modifier_reset(d.pm); + } + + Catch(fault) + modifier_reset((png_modifier*)fault); +} + +/* The transforms: */ +#define ITSTRUCT(name) image_transform_##name +#define IT(name,prev)\ +static image_transform ITSTRUCT(name) =\ +{\ + #name,\ + 1, /*enable*/\ + &ITSTRUCT(prev), /*list*/\ + 0, /*global_use*/\ + 0, /*local_use*/\ + 0, /*next*/\ + image_transform_png_set_##name##_set,\ + image_transform_png_set_##name##_mod,\ + image_transform_png_set_##name##_add\ +} + +/* To save code: */ +static int +image_transform_default_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + UNUSED(colour_type) + UNUSED(bit_depth) + + this->next = *that; + *that = this; + + return 1; +} + +/* png_set_palette_to_rgb */ +static void +image_transform_png_set_palette_to_rgb_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + png_set_palette_to_rgb(pp); + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_palette_to_rgb_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + if (that->colour_type == PNG_COLOR_TYPE_PALETTE) + image_pixel_convert_PLTE(that, &display->this); + + this->next->mod(this->next, that, pp, display); +} + +static int +image_transform_png_set_palette_to_rgb_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + UNUSED(bit_depth) + + this->next = *that; + *that = this; + + return colour_type == PNG_COLOR_TYPE_PALETTE; +} + +IT(palette_to_rgb, end); + + +/* png_set_tRNS_to_alpha */ +static void +image_transform_png_set_tRNS_to_alpha_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + png_set_tRNS_to_alpha(pp); + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_tRNS_to_alpha_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + /* LIBPNG BUG: this always forces palette images to RGB. */ + if (that->colour_type == PNG_COLOR_TYPE_PALETTE) + image_pixel_convert_PLTE(that, &display->this); + + /* This effectively does an 'expand' only if there is some transparency to + * covert to an alpha channel. + */ + if (that->have_tRNS) + image_pixel_add_alpha(that, &display->this); + + /* LIBPNG BUG: otherwise libpng still expands to 8 bits! */ + else + { + if (that->bit_depth < 8) + that->bit_depth =8; + if (that->sample_depth < 8) + that->sample_depth = 8; + } + + this->next->mod(this->next, that, pp, display); +} + +static int +image_transform_png_set_tRNS_to_alpha_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + UNUSED(bit_depth) + + this->next = *that; + *that = this; + + /* We don't know yet whether there will be a tRNS chunk, but we know that + * this transformation should do nothing if there already is an alpha + * channel. + */ + return (colour_type & PNG_COLOR_MASK_ALPHA) == 0; +} + +IT(tRNS_to_alpha,palette_to_rgb); + +/* png_set_gray_to_rgb */ +static void +image_transform_png_set_gray_to_rgb_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + png_set_gray_to_rgb(pp); + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_gray_to_rgb_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + /* NOTE: we can actually pend the tRNS processing at this point because we + * can correctly recognize the original pixel value even though we have + * mapped the one gray channel to the three RGB ones, but in fact libpng + * doesn't do this, so we don't either. + */ + if ((that->colour_type & PNG_COLOR_MASK_COLOR) == 0 && that->have_tRNS) + image_pixel_add_alpha(that, &display->this); + + /* Simply expand the bit depth and alter the colour type as required. */ + if (that->colour_type == PNG_COLOR_TYPE_GRAY) + { + /* RGB images have a bit depth at least equal to '8' */ + if (that->bit_depth < 8) + that->sample_depth = that->bit_depth = 8; + + /* And just changing the colour type works here because the green and blue + * channels are being maintained in lock-step with the red/gray: + */ + that->colour_type = PNG_COLOR_TYPE_RGB; + } + + else if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA) + that->colour_type = PNG_COLOR_TYPE_RGB_ALPHA; + + this->next->mod(this->next, that, pp, display); +} + +static int +image_transform_png_set_gray_to_rgb_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + UNUSED(bit_depth) + + this->next = *that; + *that = this; + + return (colour_type & PNG_COLOR_MASK_COLOR) == 0; +} + +IT(gray_to_rgb,tRNS_to_alpha); + +/* png_set_expand */ +static void +image_transform_png_set_expand_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + png_set_expand(pp); + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_expand_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + /* The general expand case depends on what the colour type is: */ + if (that->colour_type == PNG_COLOR_TYPE_PALETTE) + image_pixel_convert_PLTE(that, &display->this); + else if (that->bit_depth < 8) /* grayscale */ + that->sample_depth = that->bit_depth = 8; + + if (that->have_tRNS) + image_pixel_add_alpha(that, &display->this); + + this->next->mod(this->next, that, pp, display); +} + +static int +image_transform_png_set_expand_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + UNUSED(bit_depth) + + this->next = *that; + *that = this; + + /* 'expand' should do nothing for RGBA or GA input - no tRNS and the bit + * depth is at least 8 already. + */ + return (colour_type & PNG_COLOR_MASK_ALPHA) == 0; +} + +IT(expand,gray_to_rgb); + +/* png_set_expand_gray_1_2_4_to_8 + * LIBPNG BUG: this just does an 'expand' + */ +static void +image_transform_png_set_expand_gray_1_2_4_to_8_set( + PNG_CONST image_transform *this, transform_display *that, png_structp pp, + png_infop pi) +{ + png_set_expand_gray_1_2_4_to_8(pp); + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_expand_gray_1_2_4_to_8_mod( + PNG_CONST image_transform *this, image_pixel *that, png_structp pp, + PNG_CONST transform_display *display) +{ + image_transform_png_set_expand_mod(this, that, pp, display); +} + +static int +image_transform_png_set_expand_gray_1_2_4_to_8_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + return image_transform_png_set_expand_add(this, that, colour_type, + bit_depth); +} + +IT(expand_gray_1_2_4_to_8, expand); + +/* png_set_strip_16 */ +static void +image_transform_png_set_strip_16_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + png_set_strip_16(pp); + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_strip_16_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + if (that->bit_depth == 16) + { + that->sample_depth = that->bit_depth = 8; + if (that->red_sBIT > 8) that->red_sBIT = 8; + if (that->green_sBIT > 8) that->green_sBIT = 8; + if (that->blue_sBIT > 8) that->blue_sBIT = 8; + if (that->alpha_sBIT > 8) that->alpha_sBIT = 8; + +# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED + /* The strip 16 algoirithm drops the low 8 bits rather than calculating + * 1/257, so we need to adjust the permitted errors appropriately: + */ + { + PNG_CONST double d = (255-128.5)/65535; + that->rede += d; + that->greene += d; + that->bluee += d; + that->alphae += d; + } +# endif + } + + this->next->mod(this->next, that, pp, display); +} + +static int +image_transform_png_set_strip_16_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + UNUSED(colour_type) + + this->next = *that; + *that = this; + + return bit_depth > 8; +} + +IT(strip_16, expand_gray_1_2_4_to_8); + +/* png_set_strip_alpha */ +static void +image_transform_png_set_strip_alpha_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + png_set_strip_alpha(pp); + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_strip_alpha_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA) + that->colour_type = PNG_COLOR_TYPE_GRAY; + else if (that->colour_type == PNG_COLOR_TYPE_RGB_ALPHA) + that->colour_type = PNG_COLOR_TYPE_RGB; + + that->have_tRNS = 0; + that->alphaf = 1; + that->alphae = 0; + + this->next->mod(this->next, that, pp, display); +} + +static int +image_transform_png_set_strip_alpha_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + UNUSED(bit_depth) + + this->next = *that; + *that = this; + + return (colour_type & PNG_COLOR_MASK_ALPHA) != 0; +} + +IT(strip_alpha,strip_16); + +/* png_set_rgb_to_gray(png_structp, int err_action, double red, double green) + * png_set_rgb_to_gray_fixed(png_structp, int err_action, png_fixed_point red, + * png_fixed_point green) + * png_get_rgb_to_gray_status + * + * At present the APIs are simply tested using the 16.16 fixed point conversion + * values known to be used inside libpng: + * + * red: 6968 + * green: 23434 + * blue: 2366 + * + * NOTE: this currently ignores the gamma because no gamma is being set, the + * tests on gamma need to happen in the gamma test set. + */ +static void +image_transform_png_set_rgb_to_gray_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + PNG_CONST int error_action = 1; /* no error, no defines in png.h */ + +# ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_rgb_to_gray(pp, error_action, -1, -1); +# else + png_set_rgb_to_gray_fixed(pp, error_action, -1, -1); +# endif + + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_rgb_to_gray_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + if ((that->colour_type & PNG_COLOR_MASK_COLOR) != 0) + { + if (that->colour_type == PNG_COLOR_TYPE_PALETTE) + image_pixel_convert_PLTE(that, &display->this); + + /* Image now has RGB channels... */ + that->bluef = that->greenf = that->redf = (that->redf * 6968 + + that->greenf * 23434 + that->bluef * 2366) / 32768; + that->bluee = that->greene = that->rede = (that->rede * 6968 + + that->greene * 23434 + that->bluee * 2366) / 32768 * + (1 + DBL_EPSILON * 6); + + /* The sBIT is the minium of the three colour channel sBITs. */ + if (that->red_sBIT > that->green_sBIT) + that->red_sBIT = that->green_sBIT; + if (that->red_sBIT > that->blue_sBIT) + that->red_sBIT = that->blue_sBIT; + that->blue_sBIT = that->green_sBIT = that->red_sBIT; + + /* And zap the colour bit in the type: */ + if (that->colour_type == PNG_COLOR_TYPE_RGB) + that->colour_type = PNG_COLOR_TYPE_GRAY; + else if (that->colour_type == PNG_COLOR_TYPE_RGB_ALPHA) + that->colour_type = PNG_COLOR_TYPE_GRAY_ALPHA; + } + + this->next->mod(this->next, that, pp, display); +} + +static int +image_transform_png_set_rgb_to_gray_add(image_transform *this, + PNG_CONST image_transform **that, png_byte colour_type, png_byte bit_depth) +{ + UNUSED(bit_depth) + + this->next = *that; + *that = this; + + return (colour_type & PNG_COLOR_MASK_COLOR) != 0; +} + +IT(rgb_to_gray,strip_alpha); + +/* png_set_background(png_structp, png_const_color_16p background_color, + * int background_gamma_code, int need_expand, double background_gamma) + * png_set_background_fixed(png_structp, png_const_color_16p background_color, + * int background_gamma_code, int need_expand, + * png_fixed_point background_gamma) + * + * As with rgb_to_gray this ignores the gamma. +*/ +static void +image_transform_png_set_background_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + png_color_16 back; + + /* Since we don't know the output bit depth at this point we must use the + * input values and ask libpng to expand the chunk as required. + */ + back.index = 255; /* Should not be used */ + back.gray = back.blue = back.green = back.red = + (png_uint_16)((1U << that->this.bit_depth) >> 1); + +# ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_background(pp, &back, PNG_BACKGROUND_GAMMA_FILE, 1, 0); +# else + png_set_background_fixed(pp, &back, PNG_BACKGROUND_GAMMA_FILE, 1, 0); +# endif + + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_background_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + /* Check for tRNS first: */ + if (that->have_tRNS && that->colour_type != PNG_COLOR_TYPE_PALETTE) + image_pixel_add_alpha(that, &display->this); + + /* This is only necessary if the alpha value is less than 1. */ + if (that->alphaf < 1) + { + /* Repeat the calculation above and scale the result: */ + unsigned int tmp = (1U << display->this.bit_depth); + double component = (tmp >> 1)/(double)(tmp-1); + + /* Now we do the background calculation without any gamma correction. */ + if (that->alphaf <= 0) + { + that->bluef = that->greenf = that->redf = component; + that->bluee = that->greene = that->rede = component * DBL_EPSILON; + that->blue_sBIT = that->green_sBIT = that->red_sBIT = that->bit_depth; + } + + else + { + component *= 1-that->alphaf; + that->redf = that->redf * that->alphaf + component; + that->rede = that->rede * that->alphaf + that->redf * 3 * DBL_EPSILON; + that->greenf = that->greenf * that->alphaf + component; + that->greene = that->greene * that->alphaf + that->greenf * 3 * + DBL_EPSILON; + that->bluef = that->bluef * that->alphaf + component; + that->bluee = that->bluee * that->alphaf + that->bluef * 3 * + DBL_EPSILON; + } + + /* Remove the alpha type and set the alpha. */ + that->alphaf = 1; + that->alphae = 0; + + if (that->colour_type == PNG_COLOR_TYPE_RGB_ALPHA) + that->colour_type = PNG_COLOR_TYPE_RGB; + else if (that->colour_type == PNG_COLOR_TYPE_GRAY_ALPHA) + that->colour_type = PNG_COLOR_TYPE_GRAY; + } + + this->next->mod(this->next, that, pp, display); +} + +#define image_transform_png_set_background_add image_transform_default_add + +IT(background,rgb_to_gray); + +static image_transform *PNG_CONST image_transform_first = &ITSTRUCT(background); + +static void +transform_enable(PNG_CONST char *name) +{ + /* Everything starts out enabled, so if we see an 'enable' disabled + * everything else the first time round. + */ + static int all_disabled = 0; + int found_it = 0; + image_transform *list = image_transform_first; + + while (list != &image_transform_end) + { + if (strcmp(list->name, name) == 0) + { + list->enable = 1; + found_it = 1; + } + else if (!all_disabled) + list->enable = 0; + + list = list->list; + } + + all_disabled = 1; + + if (!found_it) + { + fprintf(stderr, "pngvalid: --transform-enable=%s: unknown transform\n", + name); + exit(1); + } +} + +static void +transform_disable(PNG_CONST char *name) +{ + image_transform *list = image_transform_first; + + while (list != &image_transform_end) + { + if (strcmp(list->name, name) == 0) + { + list->enable = 0; + return; + } + + list = list->list; + } + + fprintf(stderr, "pngvalid: --transform-disable=%s: unknown transform\n", + name); + exit(1); +} + +static void +image_transform_reset_count(void) +{ + image_transform *next = image_transform_first; + int count = 0; + + while (next != &image_transform_end) + { + next->local_use = 0; + next->next = 0; + next = next->list; + ++count; + } + + /* This can only happen if we every have more than 32 transforms (excluding + * the end) in the list. + */ + if (count > 32) abort(); +} + +static int +image_transform_test_counter(png_uint_32 counter, unsigned int max) +{ + /* Test the list to see if there is any point contining, given a current + * counter and a 'max' value. + */ + image_transform *next = image_transform_first; + + while (next != &image_transform_end) + { + /* For max 0 or 1 continue until the counter overflows: */ + counter >>= 1; + + /* Continue if any entry hasn't reacked the max. */ + if (max > 1 && next->local_use < max) + return 1; + next = next->list; + } + + return max <= 1 && counter == 0; +} + +static png_uint_32 +image_transform_add(PNG_CONST image_transform **this, unsigned int max, + png_uint_32 counter, char *name, size_t sizeof_name, size_t *pos, + png_byte colour_type, png_byte bit_depth) +{ + for (;;) /* until we manage to add something */ + { + png_uint_32 mask; + image_transform *list; + + /* Find the next counter value, if the counter is zero this is the start + * of the list. This routine always returns the current counter (not the + * next) so it returns 0 at the end and expects 0 at the beginning. + */ + if (counter == 0) /* first time */ + { + image_transform_reset_count(); + if (max <= 1) + counter = 1; + else + counter = random_32(); + } + else /* advance the counter */ + { + switch (max) + { + case 0: ++counter; break; + case 1: counter <<= 1; break; + default: counter = random_32(); break; + } + } + + /* Now add all these items, if possible */ + *this = &image_transform_end; + list = image_transform_first; + mask = 1; + + /* Go through the whole list adding anything that the counter selects: */ + while (list != &image_transform_end) + { + if ((counter & mask) != 0 && list->enable && + (max == 0 || list->local_use < max)) + { + /* Candidate to add: */ + if (list->add(list, this, colour_type, bit_depth) || max == 0) + { + /* Added, so add to the name too. */ + *pos = safecat(name, sizeof_name, *pos, " +"); + *pos = safecat(name, sizeof_name, *pos, list->name); + } + + else + { + /* Not useful and max>0, so remvoe it from *this: */ + *this = list->next; + list->next = 0; + + /* And, since we know it isn't useful, stop it being added again + * in this run: + */ + list->local_use = max; + } + } + + mask <<= 1; + list = list->list; + } + + /* Now if anything was added we have something to do. */ + if (*this != &image_transform_end) + return counter; + + /* Nothing added, but was there anything in there to add? */ + if (!image_transform_test_counter(counter, max)) + return 0; + } +} + +#ifdef THIS_IS_THE_PROFORMA +static void +image_transform_png_set_@_set(PNG_CONST image_transform *this, + transform_display *that, png_structp pp, png_infop pi) +{ + png_set_@(pp); + this->next->set(this->next, that, pp, pi); +} + +static void +image_transform_png_set_@_mod(PNG_CONST image_transform *this, + image_pixel *that, png_structp pp, PNG_CONST transform_display *display) +{ + this->next->mod(this->next, that, pp, display); +} + +static int +image_transform_png_set_@_add(image_transform *this, + PNG_CONST image_transform **that, char *name, size_t sizeof_name, + size_t *pos, png_byte colour_type, png_byte bit_depth) +{ + this->next = *that; + *that = this; + + *pos = safecat(name, sizeof_name, *pos, " +@"); + + return 1; +} + +IT(@); +#endif + +/* png_set_quantize(png_structp, png_colorp palette, int num_palette, + * int maximum_colors, png_const_uint_16p histogram, int full_quantize) + * + * Very difficult to validate this! + */ +/*NOTE: TBD NYI */ + +/* The data layout transforms are handled by swapping our own channel data, + * necessarily these need to happen at the end of the transform list because the + * semantic of the channels changes after these are executed. Some of these, + * like set_shift and set_packing, can't be done at present because they change + * the layout of the data at the sub-sample level so sample() won't get the + * right answer. + */ +/* png_set_invert_alpha */ +/*NOTE: TBD NYI */ + +/* png_set_bgr */ +/*NOTE: TBD NYI */ + +/* png_set_swap_alpha */ +/*NOTE: TBD NYI */ + +/* png_set_swap */ +/*NOTE: TBD NYI */ + +/* png_set_filler, (png_structp png_ptr, png_uint_32 filler, int flags)); */ +/*NOTE: TBD NYI */ + +/* png_set_add_alpha, (png_structp png_ptr, png_uint_32 filler, int flags)); */ +/*NOTE: TBD NYI */ + +/* png_set_packing */ +/*NOTE: TBD NYI */ + +/* png_set_packswap */ +/*NOTE: TBD NYI */ + +/* png_set_invert_mono */ +/*NOTE: TBD NYI */ + +/* png_set_shift(png_structp, png_const_color_8p true_bits) */ +/*NOTE: TBD NYI */ + +static int +test_transform(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type, + int bdlo, int PNG_CONST bdhi, png_uint_32 max) +{ + for (; bdlo <= bdhi; ++bdlo) + { + PNG_CONST png_byte bit_depth = DEPTH(bdlo); + png_uint_32 counter = 0; + size_t base_pos; + char name[64]; + + base_pos = safecat(name, sizeof name, 0, "transform:"); + + for (;;) + { + size_t pos = base_pos; + PNG_CONST image_transform *list = 0; + + counter = image_transform_add(&list, max, counter, name, sizeof name, + &pos, colour_type, bit_depth); + + if (counter == 0) + break; + + /* The command line can change this to checking interlaced images. */ + transform_test(pm, FILEID(colour_type, bit_depth, pm->interlace_type, + 0, 0, 0), list, name); + + if (fail(pm)) + return 0; + } + } + + return 1; /* keep going */ +} + +static void +perform_transform_test(png_modifier *pm) +{ + /* Test each colour type over the valid range of bit depths (expressed as + * log2(bit_depth) in turn, stop as soon as any error is detected. + */ + if (!test_transform(pm, 0, 0, READ_BDHI, 1)) + return; + + if (!test_transform(pm, 2, 3, READ_BDHI, 1)) + return; + + if (!test_transform(pm, 3, 0, 3, 1)) + return; + + if (!test_transform(pm, 4, 3, READ_BDHI, 1)) + return; + + if (!test_transform(pm, 6, 3, READ_BDHI, 1)) + return; +} + + +/********************************* GAMMA TESTS ********************************/ +/* Gamma test images. */ +typedef struct gamma_modification +{ + png_modification this; + png_fixed_point gamma; +} gamma_modification; + +static int +gamma_modify(png_modifier *pm, png_modification *me, int add) +{ + UNUSED(add) + /* This simply dumps the given gamma value into the buffer. */ + png_save_uint_32(pm->buffer, 4); + png_save_uint_32(pm->buffer+4, CHUNK_gAMA); + png_save_uint_32(pm->buffer+8, ((gamma_modification*)me)->gamma); + return 1; +} + +static void +gamma_modification_init(gamma_modification *me, png_modifier *pm, double gammad) +{ + double g; + + modification_init(&me->this); + me->this.chunk = CHUNK_gAMA; + me->this.modify_fn = gamma_modify; + me->this.add = CHUNK_PLTE; + g = floor(gammad * 100000 + .5); + me->gamma = (png_fixed_point)g; + me->this.next = pm->modifications; + pm->modifications = &me->this; +} + +typedef struct srgb_modification +{ + png_modification this; + png_byte intent; +} srgb_modification; + +static int +srgb_modify(png_modifier *pm, png_modification *me, int add) +{ + UNUSED(add) + /* As above, ignore add and just make a new chunk */ + png_save_uint_32(pm->buffer, 1); + png_save_uint_32(pm->buffer+4, CHUNK_sRGB); + pm->buffer[8] = ((srgb_modification*)me)->intent; + return 1; +} + +static void +srgb_modification_init(srgb_modification *me, png_modifier *pm, png_byte intent) +{ + modification_init(&me->this); + me->this.chunk = CHUNK_sBIT; + + if (intent <= 3) /* if valid, else *delete* sRGB chunks */ + { + me->this.modify_fn = srgb_modify; + me->this.add = CHUNK_PLTE; + me->intent = intent; + } + + else + { + me->this.modify_fn = 0; + me->this.add = 0; + me->intent = 0; + } + + me->this.next = pm->modifications; + pm->modifications = &me->this; +} + +typedef struct sbit_modification +{ + png_modification this; + png_byte sbit; +} sbit_modification; + +static int +sbit_modify(png_modifier *pm, png_modification *me, int add) +{ + png_byte sbit = ((sbit_modification*)me)->sbit; + if (pm->bit_depth > sbit) + { + int cb = 0; + switch (pm->colour_type) + { + case 0: + cb = 1; + break; + + case 2: + case 3: + cb = 3; + break; + + case 4: + cb = 2; + break; + + case 6: + cb = 4; + break; + + default: + png_error(pm->this.pread, + "unexpected colour type in sBIT modification"); + } + + png_save_uint_32(pm->buffer, cb); + png_save_uint_32(pm->buffer+4, CHUNK_sBIT); + + while (cb > 0) + (pm->buffer+8)[--cb] = sbit; + + return 1; + } + else if (!add) + { + /* Remove the sBIT chunk */ + pm->buffer_count = pm->buffer_position = 0; + return 1; + } + else + return 0; /* do nothing */ +} + +static void +sbit_modification_init(sbit_modification *me, png_modifier *pm, png_byte sbit) +{ + modification_init(&me->this); + me->this.chunk = CHUNK_sBIT; + me->this.modify_fn = sbit_modify; + me->this.add = CHUNK_PLTE; + me->sbit = sbit; + me->this.next = pm->modifications; + pm->modifications = &me->this; +} + +/* Reader callbacks and implementations, where they differ from the standard + * ones. + */ +typedef struct gamma_display +{ + standard_display this; + + /* Parameters */ + png_modifier* pm; + double file_gamma; + double screen_gamma; + png_byte sbit; + int threshold_test; + PNG_CONST char* name; + int speed; + int use_input_precision; + int strip16; + + /* Local variables */ + double maxerrout; + double maxerrpc; + double maxerrabs; +} gamma_display; + +static void +gamma_display_init(gamma_display *dp, png_modifier *pm, png_uint_32 id, + double file_gamma, double screen_gamma, png_byte sbit, int threshold_test, + int speed, int use_input_precision, int strip16) +{ + /* Standard fields */ + standard_display_init(&dp->this, &pm->this, id, 0/*do_interlace*/); + + /* Parameter fields */ + dp->pm = pm; + dp->file_gamma = file_gamma; + dp->screen_gamma = screen_gamma; + dp->sbit = sbit; + dp->threshold_test = threshold_test; + dp->speed = speed; + dp->use_input_precision = use_input_precision; + dp->strip16 = strip16; + + /* Local variable fields */ + dp->maxerrout = dp->maxerrpc = dp->maxerrabs = 0; +} + +static void +gamma_info_imp(gamma_display *dp, png_structp pp, png_infop pi) +{ + /* Reuse the standard stuff as appropriate. */ + standard_info_part1(&dp->this, pp, pi); + + /* If requested strip 16 to 8 bits - this is handled automagically below + * because the output bit depth is read from the library. Note that there + * are interactions with sBIT but, internally, libpng makes sbit at most + * PNG_MAX_GAMMA_8 when doing the following. + */ + if (dp->strip16) +# ifdef PNG_READ_16_TO_8_SUPPORTED + png_set_strip_16(pp); +# else + png_error(pp, "strip16 (16 to 8 bit conversion) not supported"); +# endif + + png_read_update_info(pp, pi); + + /* Now we may get a different cbRow: */ + standard_info_part2(&dp->this, pp, pi, 1 /*images*/); +} + +static void +gamma_info(png_structp pp, png_infop pi) +{ + gamma_info_imp(png_get_progressive_ptr(pp), pp, pi); +} + +static void +gamma_image_validate(gamma_display *dp, png_structp pp, png_infop pi, + png_const_bytep pRow) +{ + /* Get some constants derived from the input and output file formats: */ + PNG_CONST png_byte sbit = dp->sbit; + PNG_CONST double file_gamma = dp->file_gamma; + PNG_CONST double screen_gamma = dp->screen_gamma; + PNG_CONST int use_input_precision = dp->use_input_precision; + PNG_CONST int speed = dp->speed; + PNG_CONST png_byte in_ct = dp->this.colour_type; + PNG_CONST png_byte in_bd = dp->this.bit_depth; + PNG_CONST png_uint_32 w = dp->this.w; + PNG_CONST png_uint_32 h = dp->this.h; + PNG_CONST size_t cbRow = dp->this.cbRow; + PNG_CONST png_byte out_ct = png_get_color_type(pp, pi); + PNG_CONST png_byte out_bd = png_get_bit_depth(pp, pi); + PNG_CONST unsigned int outmax = (1U<pm, out_bd); + PNG_CONST double maxout = outerr(dp->pm, out_bd); + PNG_CONST double maxpc = pcerr(dp->pm, out_bd); + + /* There are three sources of error, firstly the quantization in the + * file encoding, determined by sbit and/or the file depth, secondly + * the output (screen) gamma and thirdly the output file encoding. + * + * Since this API receives the screen and file gamma in double + * precision it is possible to calculate an exact answer given an input + * pixel value. Therefore we assume that the *input* value is exact - + * sample/maxsample - calculate the corresponding gamma corrected + * output to the limits of double precision arithmetic and compare with + * what libpng returns. + * + * Since the library must quantize the output to 8 or 16 bits there is + * a fundamental limit on the accuracy of the output of +/-.5 - this + * quantization limit is included in addition to the other limits + * specified by the paramaters to the API. (Effectively, add .5 + * everywhere.) + * + * The behavior of the 'sbit' paramter is defined by section 12.5 + * (sample depth scaling) of the PNG spec. That section forces the + * decoder to assume that the PNG values have been scaled if sBIT is + * present: + * + * png-sample = floor( input-sample * (max-out/max-in) + .5); + * + * This means that only a subset of the possible PNG values should + * appear in the input. However, the spec allows the encoder to use a + * variety of approximations to the above and doesn't require any + * restriction of the values produced. + * + * Nevertheless the spec requires that the upper 'sBIT' bits of the + * value stored in a PNG file be the original sample bits. + * Consequently the code below simply scales the top sbit bits by + * (1<= + PNG_GAMMA_THRESHOLD && !dp->threshold_test && !speed && in_ct != 3) || + in_bd != out_bd; + + PNG_CONST unsigned int samples_per_pixel = (out_ct & 2U) ? 3U : 1U; + + PNG_CONST double gamma_correction = 1/(file_gamma*screen_gamma);/* Overall */ + + double maxerrout = 0, maxerrabs = 0, maxerrpc = 0; + png_uint_32 y; + + for (y=0; y> (in_bd-sbit); + + double i, input_sample, encoded_sample, output; + double encoded_error, error; + double es_lo, es_hi; + + /* First check on the 'perfect' result obtained from the + * digitized input value, id, and compare this against the + * actual digitized result, 'od'. 'i' is the input result + * in the range 0..1: + * + * NOTE: sBIT should be taken into account here but isn't, + * as described above. + */ + i = isbit; i /= (1U< maxerrout) + maxerrout = encoded_error; + + if (encoded_error < .5+maxout) + continue; + + /* There may be an error, so calculate the actual sample + * values - unencoded light intensity values. Note that + * in practice these are not unencoded because they + * include a 'viewing correction' to decrease or + * (normally) increase the perceptual contrast of the + * image. There's nothing we can do about this - we don't + * know what it is - so assume the unencoded value is + * perceptually linear. + */ + input_sample = pow(i, 1/file_gamma); /* In range 0..1 */ + output = od; + output /= outmax; + output = pow(output, screen_gamma); + + /* Now we have the numbers for real errors, both absolute + * values as as a percentage of the correct value (output): + */ + error = fabs(input_sample-output); + + if (error > maxerrabs) + maxerrabs = error; + + /* The following is an attempt to ignore the tendency of + * quantization to dominate the percentage errors for low + * output sample values: + */ + if (input_sample*maxpc > .5+maxabs) + { + double percentage_error = error/input_sample; + if (percentage_error > maxerrpc) maxerrpc = percentage_error; + } + + /* Now calculate the digitization limits for + * 'encoded_sample' using the 'max' values. Note that + * maxout is in the encoded space but maxpc and maxabs are + * in linear light space. + * + * First find the maximum error in linear light space, + * range 0..1: + */ + { + double tmp = input_sample * maxpc; + if (tmp < maxabs) tmp = maxabs; + + /* Low bound - the minimum of the three: */ + es_lo = encoded_sample - maxout; + + if (es_lo > 0 && input_sample-tmp > 0) + { + double low_value = outmax * pow(input_sample-tmp, + 1/screen_gamma); + if (low_value < es_lo) es_lo = low_value; + } + + else + es_lo = 0; + + es_hi = encoded_sample + maxout; + + if (es_hi < outmax && input_sample+tmp < 1) + { + double high_value = outmax * pow(input_sample+tmp, + 1/screen_gamma); + if (high_value > es_hi) es_hi = high_value; + } + + else + es_hi = outmax; + } + + /* The primary test is that the final encoded value + * returned by the library should be between the two limits + * (inclusive) that were calculated above. At this point + * quantization of the output must be taken into account. + */ + if (od+.5 < es_lo || od-.5 > es_hi) + { + /* There has been an error in processing. */ + double is_lo, is_hi; + + if (use_input_precision) + { + /* Ok, something is wrong - this actually happens in + * current libpng sbit processing. Assume that the + * input value (id, adjusted for sbit) can be + * anywhere between value-.5 and value+.5 - quite a + * large range if sbit is low. + */ + double tmp = (isbit - .5)/((1U< 0) + { + is_lo = outmax * pow(tmp, gamma_correction) - maxout; + if (is_lo < 0) is_lo = 0; + } + + else + is_lo = 0; + + tmp = (isbit + .5)/((1U< outmax) is_hi = outmax; + } + + else + is_hi = outmax; + + if (!(od+.5 < is_lo || od-.5 > is_hi)) + continue; + } + else + is_lo = es_lo, is_hi = es_hi; + + { + char msg[256]; + + sprintf(msg, + "error: %.3f; %u{%u;%u} -> %u not %.2f (%.1f-%.1f)", + od-encoded_sample, id, sbit, isbit, od, + encoded_sample, is_lo, is_hi); + + png_warning(pp, msg); + } + } + } + } + + else if (!speed && memcmp(std, pRow, cbRow) != 0) + { + char msg[64]; + + /* No transform is expected on the threshold tests. */ + sprintf(msg, "gamma: below threshold row %d changed", y); + + png_error(pp, msg); + } + } /* row (y) loop */ + + dp->maxerrout = maxerrout; + dp->maxerrabs = maxerrabs; + dp->maxerrpc = maxerrpc; + dp->this.ps->validated = 1; +} + +static void +gamma_end(png_structp pp, png_infop pi) +{ + gamma_display *dp = png_get_progressive_ptr(pp); + + gamma_image_validate(dp, pp, pi, dp->this.ps->image); +} + +/* A single test run checking a gamma transformation. + * + * maxabs: maximum absolute error as a fraction + * maxout: maximum output error in the output units + * maxpc: maximum percentage error (as a percentage) + */ +static void +gamma_test(png_modifier *pmIn, PNG_CONST png_byte colour_typeIn, + PNG_CONST png_byte bit_depthIn, PNG_CONST int interlace_typeIn, + PNG_CONST double file_gammaIn, PNG_CONST double screen_gammaIn, + PNG_CONST png_byte sbitIn, PNG_CONST int threshold_testIn, + PNG_CONST char *name, PNG_CONST int speedIn, + PNG_CONST int use_input_precisionIn, PNG_CONST int strip16In) +{ + gamma_display d; + context(&pmIn->this, fault); + + gamma_display_init(&d, pmIn, FILEID(colour_typeIn, bit_depthIn, + interlace_typeIn, 0, 0, 0), file_gammaIn, screen_gammaIn, sbitIn, + threshold_testIn, speedIn, use_input_precisionIn, strip16In); + + Try + { + png_structp pp; + png_infop pi; + gamma_modification gamma_mod; + srgb_modification srgb_mod; + sbit_modification sbit_mod; + + /* Make an appropriate modifier to set the PNG file gamma to the + * given gamma value and the sBIT chunk to the given precision. + */ + d.pm->modifications = NULL; + gamma_modification_init(&gamma_mod, d.pm, d.file_gamma); + srgb_modification_init(&srgb_mod, d.pm, 127 /*delete*/); + sbit_modification_init(&sbit_mod, d.pm, d.sbit); + + modification_reset(d.pm->modifications); + + /* Get a png_struct for writing the image. */ + pp = set_modifier_for_read(d.pm, &pi, d.this.id, name); + + /* Set up gamma processing. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_gamma(pp, d.screen_gamma, d.file_gamma); +#else + { + png_fixed_point s = floor(d.screen_gamma*100000+.5); + png_fixed_point f = floor(d.file_gamma*100000+.5); + png_set_gamma_fixed(pp, s, f); + } +#endif + + /* Introduce the correct read function. */ + if (d.pm->this.progressive) + { + /* Share the row function with the standard implementation. */ + png_set_progressive_read_fn(pp, &d, gamma_info, progressive_row, + gamma_end); + + /* Now feed data into the reader until we reach the end: */ + modifier_progressive_read(d.pm, pp, pi); + } + else + { + /* modifier_read expects a png_modifier* */ + png_set_read_fn(pp, d.pm, modifier_read); + + /* Check the header values: */ + png_read_info(pp, pi); + + /* Process the 'info' requirements. Only one image is generated */ + gamma_info_imp(&d, pp, pi); + + sequential_row(&d.this, pp, pi, NULL, d.this.ps->image); + + gamma_image_validate(&d, pp, pi, d.this.ps->image); + } + + modifier_reset(d.pm); + + if (d.pm->log && !d.threshold_test && !d.speed) + fprintf(stderr, "%d bit %s %s: max error %f (%.2g, %2g%%)\n", + d.this.bit_depth, colour_types[d.this.colour_type], d.name, + d.maxerrout, d.maxerrabs, 100*d.maxerrpc); + + /* Log the summary values too. */ + if (d.this.colour_type == 0 || d.this.colour_type == 4) + { + switch (d.this.bit_depth) + { + case 1: + break; + + case 2: + if (d.maxerrout > d.pm->error_gray_2) + d.pm->error_gray_2 = d.maxerrout; + + break; + + case 4: + if (d.maxerrout > d.pm->error_gray_4) + d.pm->error_gray_4 = d.maxerrout; + + break; + + case 8: + if (d.maxerrout > d.pm->error_gray_8) + d.pm->error_gray_8 = d.maxerrout; + + break; + + case 16: + if (d.maxerrout > d.pm->error_gray_16) + d.pm->error_gray_16 = d.maxerrout; + + break; + + default: + png_error(pp, "bad bit depth (internal: 1)"); + } + } + + else if (d.this.colour_type == 2 || d.this.colour_type == 6) + { + switch (d.this.bit_depth) + { + case 8: + + if (d.maxerrout > d.pm->error_color_8) + d.pm->error_color_8 = d.maxerrout; + + break; + + case 16: + + if (d.maxerrout > d.pm->error_color_16) + d.pm->error_color_16 = d.maxerrout; + + break; + + default: + png_error(pp, "bad bit depth (internal: 2)"); + } + } + } + + Catch(fault) + modifier_reset((png_modifier*)fault); +} + +static void gamma_threshold_test(png_modifier *pm, png_byte colour_type, + png_byte bit_depth, int interlace_type, double file_gamma, + double screen_gamma) +{ + size_t pos = 0; + char name[64]; + pos = safecat(name, sizeof name, pos, "threshold "); + pos = safecatd(name, sizeof name, pos, file_gamma, 3); + pos = safecat(name, sizeof name, pos, "/"); + pos = safecatd(name, sizeof name, pos, screen_gamma, 3); + + (void)gamma_test(pm, colour_type, bit_depth, interlace_type, file_gamma, + screen_gamma, bit_depth, 1, name, 0 /*speed*/, 0 /*no input precision*/, + 0 /*no strip16*/); +} + +static void +perform_gamma_threshold_tests(png_modifier *pm) +{ + png_byte colour_type = 0; + png_byte bit_depth = 0; + + while (next_format(&colour_type, &bit_depth)) + { + double test_gamma = 1.0; + while (test_gamma >= .4) + { + /* There's little point testing the interlacing vs non-interlacing, + * but this can be set from the command line. + */ + gamma_threshold_test(pm, colour_type, bit_depth, pm->interlace_type, + test_gamma, 1/test_gamma); + test_gamma *= .95; + } + + /* And a special test for sRGB */ + gamma_threshold_test(pm, colour_type, bit_depth, pm->interlace_type, + .45455, 2.2); + + if (fail(pm)) + return; + } +} + +static void gamma_transform_test(png_modifier *pm, + PNG_CONST png_byte colour_type, PNG_CONST png_byte bit_depth, + PNG_CONST int interlace_type, PNG_CONST double file_gamma, + PNG_CONST double screen_gamma, PNG_CONST png_byte sbit, PNG_CONST int speed, + PNG_CONST int use_input_precision, PNG_CONST int strip16) +{ + size_t pos = 0; + char name[64]; + + if (sbit != bit_depth) + { + pos = safecat(name, sizeof name, pos, "sbit("); + pos = safecatn(name, sizeof name, pos, sbit); + pos = safecat(name, sizeof name, pos, ") "); + } + + else + pos = safecat(name, sizeof name, pos, "gamma "); + + if (strip16) + pos = safecat(name, sizeof name, pos, "16to8 "); + + pos = safecatd(name, sizeof name, pos, file_gamma, 3); + pos = safecat(name, sizeof name, pos, "->"); + pos = safecatd(name, sizeof name, pos, screen_gamma, 3); + + gamma_test(pm, colour_type, bit_depth, interlace_type, file_gamma, + screen_gamma, sbit, 0, name, speed, use_input_precision, strip16); +} + +static void perform_gamma_transform_tests(png_modifier *pm, int speed) +{ + png_byte colour_type = 0; + png_byte bit_depth = 0; + + /* Ignore palette images - the gamma correction happens on the palette entry, + * haven't got the tests for this yet. + */ + while (next_format(&colour_type, &bit_depth)) if (colour_type != 3) + { + unsigned int i, j; + + for (i=0; ingammas; ++i) for (j=0; jngammas; ++j) if (i != j) + { + gamma_transform_test(pm, colour_type, bit_depth, pm->interlace_type, + 1/pm->gammas[i], pm->gammas[j], bit_depth, speed, + pm->use_input_precision, 0 /*do not strip16*/); + + if (fail(pm)) + return; + } + } +} + +static void perform_gamma_sbit_tests(png_modifier *pm, int speed) +{ + png_byte sbit; + + /* The only interesting cases are colour and grayscale, alpha is ignored here + * for overall speed. Only bit depths 8 and 16 are tested. + */ + for (sbit=pm->sbitlow; sbit<(1<ngammas; ++i) + { + for (j=0; jngammas; ++j) + { + if (i != j) + { + if (sbit < 8) + { + gamma_transform_test(pm, 0, 8, pm->interlace_type, + 1/pm->gammas[i], pm->gammas[j], sbit, speed, + pm->use_input_precision_sbit, 0 /*strip16*/); + + if (fail(pm)) + return; + + gamma_transform_test(pm, 2, 8, pm->interlace_type, + 1/pm->gammas[i], pm->gammas[j], sbit, speed, + pm->use_input_precision_sbit, 0 /*strip16*/); + + if (fail(pm)) + return; + } + +#ifdef DO_16BIT + gamma_transform_test(pm, 0, 16, pm->interlace_type, + 1/pm->gammas[i], pm->gammas[j], sbit, speed, + pm->use_input_precision_sbit, 0 /*strip16*/); + + if (fail(pm)) + return; + + gamma_transform_test(pm, 2, 16, pm->interlace_type, + 1/pm->gammas[i], pm->gammas[j], sbit, speed, + pm->use_input_precision_sbit, 0 /*strip16*/); + + if (fail(pm)) + return; +#endif + } + } + } + } +} + +/* Note that this requires a 16 bit source image but produces 8 bit output, so + * we only need the 16bit write support. + */ +#ifdef PNG_READ_16_TO_8_SUPPORTED +static void perform_gamma_strip16_tests(png_modifier *pm, int speed) +{ +# ifndef PNG_MAX_GAMMA_8 +# define PNG_MAX_GAMMA_8 11 +# endif + /* Include the alpha cases here. Note that sbit matches the internal value + * used by the library - otherwise we will get spurious errors from the + * internal sbit style approximation. + * + * The threshold test is here because otherwise the 16 to 8 conversion will + * proceed *without* gamma correction, and the tests above will fail (but not + * by much) - this could be fixed, it only appears with the -g option. + */ + unsigned int i, j; + for (i=0; ingammas; ++i) + { + for (j=0; jngammas; ++j) + { + if (i != j && + fabs(pm->gammas[j]/pm->gammas[i]-1) >= PNG_GAMMA_THRESHOLD) + { + gamma_transform_test(pm, 0, 16, pm->interlace_type, 1/pm->gammas[i], + pm->gammas[j], PNG_MAX_GAMMA_8, speed, + pm->use_input_precision_16to8, 1 /*strip16*/); + + if (fail(pm)) + return; + + gamma_transform_test(pm, 2, 16, pm->interlace_type, 1/pm->gammas[i], + pm->gammas[j], PNG_MAX_GAMMA_8, speed, + pm->use_input_precision_16to8, 1 /*strip16*/); + + if (fail(pm)) + return; + + gamma_transform_test(pm, 4, 16, pm->interlace_type, 1/pm->gammas[i], + pm->gammas[j], PNG_MAX_GAMMA_8, speed, + pm->use_input_precision_16to8, 1 /*strip16*/); + + if (fail(pm)) + return; + + gamma_transform_test(pm, 6, 16, pm->interlace_type, 1/pm->gammas[i], + pm->gammas[j], PNG_MAX_GAMMA_8, speed, + pm->use_input_precision_16to8, 1 /*strip16*/); + + if (fail(pm)) + return; + } + } + } +} +#endif /* 16 to 8 bit conversion */ + +static void +perform_gamma_test(png_modifier *pm, int speed, int summary) +{ + /* First some arbitrary no-transform tests: */ + if (!speed && pm->test_gamma_threshold) + { + perform_gamma_threshold_tests(pm); + + if (fail(pm)) + return; + } + + /* Now some real transforms. */ + if (pm->test_gamma_transform) + { + perform_gamma_transform_tests(pm, speed); + + if (summary) + { + printf("Gamma correction error summary\n\n"); + printf("The printed value is the maximum error in the pixel values\n"); + printf("calculated by the libpng gamma correction code. The error\n"); + printf("is calculated as the difference between the output pixel\n"); + printf("value (always an integer) and the ideal value from the\n"); + printf("libpng specification (typically not an integer).\n\n"); + + printf("Expect this value to be less than .5 for 8 bit formats,\n"); + printf("less than 1 for formats with fewer than 8 bits and a small\n"); + printf("number (typically less than 5) for the 16 bit formats.\n"); + printf("For performance reasons the value for 16 bit formats\n"); + printf("increases when the image file includes an sBIT chunk.\n\n"); + + printf(" 2 bit gray: %.5f\n", pm->error_gray_2); + printf(" 4 bit gray: %.5f\n", pm->error_gray_4); + printf(" 8 bit gray: %.5f\n", pm->error_gray_8); + printf(" 8 bit color: %.5f\n", pm->error_color_8); +#ifdef DO_16BIT + printf(" 16 bit gray: %.5f\n", pm->error_gray_16); + printf(" 16 bit color: %.5f\n", pm->error_color_16); +#endif + } + } + + /* The sbit tests produce much larger errors: */ + if (pm->test_gamma_sbit) + { + pm->error_gray_2 = pm->error_gray_4 = pm->error_gray_8 = + pm->error_gray_16 = pm->error_color_8 = pm->error_color_16 = 0; + perform_gamma_sbit_tests(pm, speed); + + if (summary) + { + printf("Gamma correction with sBIT:\n"); + + if (pm->sbitlow < 8U) + { + printf(" 2 bit gray: %.5f\n", pm->error_gray_2); + printf(" 4 bit gray: %.5f\n", pm->error_gray_4); + printf(" 8 bit gray: %.5f\n", pm->error_gray_8); + printf(" 8 bit color: %.5f\n", pm->error_color_8); + } + + #ifdef DO_16BIT + printf(" 16 bit gray: %.5f\n", pm->error_gray_16); + printf(" 16 bit color: %.5f\n", pm->error_color_16); + #endif + } + } + +#ifdef PNG_READ_16_TO_8_SUPPORTED + if (pm->test_gamma_strip16) + { + /* The 16 to 8 bit strip operations: */ + pm->error_gray_2 = pm->error_gray_4 = pm->error_gray_8 = + pm->error_gray_16 = pm->error_color_8 = pm->error_color_16 = 0; + perform_gamma_strip16_tests(pm, speed); + + if (summary) + { + printf("Gamma correction with 16 to 8 bit reduction:\n"); + printf(" 16 bit gray: %.5f\n", pm->error_gray_16); + printf(" 16 bit color: %.5f\n", pm->error_color_16); + } + } +#endif +} + +/* INTERLACE MACRO VALIDATION */ +/* This is copied verbatim from the specification, it is simply the pass + * number in which each pixel in each 8x8 tile appears. The array must + * be indexed adam7[y][x] and notice that the pass numbers are based at + * 1, not 0 - the base libpng uses. + */ +static PNG_CONST +png_byte adam7[8][8] = +{ + { 1,6,4,6,2,6,4,6 }, + { 7,7,7,7,7,7,7,7 }, + { 5,6,5,6,5,6,5,6 }, + { 7,7,7,7,7,7,7,7 }, + { 3,6,4,6,3,6,4,6 }, + { 7,7,7,7,7,7,7,7 }, + { 5,6,5,6,5,6,5,6 }, + { 7,7,7,7,7,7,7,7 } +}; + +/* This routine validates all the interlace support macros in png.h for + * a variety of valid PNG widths and heights. It uses a number of similarly + * named internal routines that feed off the above array. + */ +static png_uint_32 +png_pass_start_row(int pass) +{ + int x, y; + ++pass; + for (y=0; y<8; ++y) for (x=0; x<8; ++x) if (adam7[y][x] == pass) + return y; + return 0xf; +} + +static png_uint_32 +png_pass_start_col(int pass) +{ + int x, y; + ++pass; + for (x=0; x<8; ++x) for (y=0; y<8; ++y) if (adam7[y][x] == pass) + return x; + return 0xf; +} + +static int +png_pass_row_shift(int pass) +{ + int x, y, base=(-1), inc=8; + ++pass; + for (y=0; y<8; ++y) for (x=0; x<8; ++x) if (adam7[y][x] == pass) + { + if (base == (-1)) + base = y; + else if (base == y) + {} + else if (inc == y-base) + base=y; + else if (inc == 8) + inc = y-base, base=y; + else if (inc != y-base) + return 0xff; /* error - more than one 'inc' value! */ + } + + if (base == (-1)) return 0xfe; /* error - no row in pass! */ + + /* The shift is always 1, 2 or 3 - no pass has all the rows! */ + switch (inc) + { +case 2: return 1; +case 4: return 2; +case 8: return 3; +default: break; + } + + /* error - unrecognized 'inc' */ + return (inc << 8) + 0xfd; +} + +static int +png_pass_col_shift(int pass) +{ + int x, y, base=(-1), inc=8; + ++pass; + for (x=0; x<8; ++x) for (y=0; y<8; ++y) if (adam7[y][x] == pass) + { + if (base == (-1)) + base = x; + else if (base == x) + {} + else if (inc == x-base) + base=x; + else if (inc == 8) + inc = x-base, base=x; + else if (inc != x-base) + return 0xff; /* error - more than one 'inc' value! */ + } + + if (base == (-1)) return 0xfe; /* error - no row in pass! */ + + /* The shift is always 1, 2 or 3 - no pass has all the rows! */ + switch (inc) + { +case 1: return 0; /* pass 7 has all the columns */ +case 2: return 1; +case 4: return 2; +case 8: return 3; +default: break; + } + + /* error - unrecognized 'inc' */ + return (inc << 8) + 0xfd; +} + +static png_uint_32 +png_row_from_pass_row(png_uint_32 yIn, int pass) +{ + /* By examination of the array: */ + switch (pass) + { +case 0: return yIn * 8; +case 1: return yIn * 8; +case 2: return yIn * 8 + 4; +case 3: return yIn * 4; +case 4: return yIn * 4 + 2; +case 5: return yIn * 2; +case 6: return yIn * 2 + 1; +default: break; + } + + return 0xff; /* bad pass number */ +} + +static png_uint_32 +png_col_from_pass_col(png_uint_32 xIn, int pass) +{ + /* By examination of the array: */ + switch (pass) + { +case 0: return xIn * 8; +case 1: return xIn * 8 + 4; +case 2: return xIn * 4; +case 3: return xIn * 4 + 2; +case 4: return xIn * 2; +case 5: return xIn * 2 + 1; +case 6: return xIn; +default: break; + } + + return 0xff; /* bad pass number */ +} + +static int +png_row_in_interlace_pass(png_uint_32 y, int pass) +{ + /* Is row 'y' in pass 'pass'? */ + int x; + y &= 7; + ++pass; + for (x=0; x<8; ++x) if (adam7[y][x] == pass) + return 1; + + return 0; +} + +static int +png_col_in_interlace_pass(png_uint_32 x, int pass) +{ + /* Is column 'x' in pass 'pass'? */ + int y; + x &= 7; + ++pass; + for (y=0; y<8; ++y) if (adam7[y][x] == pass) + return 1; + + return 0; +} + +static png_uint_32 +png_pass_rows(png_uint_32 height, int pass) +{ + png_uint_32 tiles = height>>3; + png_uint_32 rows = 0; + unsigned int x, y; + + height &= 7; + ++pass; + for (y=0; y<8; ++y) for (x=0; x<8; ++x) if (adam7[y][x] == pass) + { + rows += tiles; + if (y < height) ++rows; + break; /* i.e. break the 'x', column, loop. */ + } + + return rows; +} + +static png_uint_32 +png_pass_cols(png_uint_32 width, int pass) +{ + png_uint_32 tiles = width>>3; + png_uint_32 cols = 0; + unsigned int x, y; + + width &= 7; + ++pass; + for (x=0; x<8; ++x) for (y=0; y<8; ++y) if (adam7[y][x] == pass) + { + cols += tiles; + if (x < width) ++cols; + break; /* i.e. break the 'y', row, loop. */ + } + + return cols; +} + +static void +perform_interlace_macro_validation(void) +{ + /* The macros to validate, first those that depend only on pass: + * + * PNG_PASS_START_ROW(pass) + * PNG_PASS_START_COL(pass) + * PNG_PASS_ROW_SHIFT(pass) + * PNG_PASS_COL_SHIFT(pass) + */ + int pass; + + for (pass=0; pass<7; ++pass) + { + png_uint_32 m, f, v; + + m = PNG_PASS_START_ROW(pass); + f = png_pass_start_row(pass); + if (m != f) + { + fprintf(stderr, "PNG_PASS_START_ROW(%d) = %u != %x\n", pass, m, f); + exit(1); + } + + m = PNG_PASS_START_COL(pass); + f = png_pass_start_col(pass); + if (m != f) + { + fprintf(stderr, "PNG_PASS_START_COL(%d) = %u != %x\n", pass, m, f); + exit(1); + } + + m = PNG_PASS_ROW_SHIFT(pass); + f = png_pass_row_shift(pass); + if (m != f) + { + fprintf(stderr, "PNG_PASS_ROW_SHIFT(%d) = %u != %x\n", pass, m, f); + exit(1); + } + + m = PNG_PASS_COL_SHIFT(pass); + f = png_pass_col_shift(pass); + if (m != f) + { + fprintf(stderr, "PNG_PASS_COL_SHIFT(%d) = %u != %x\n", pass, m, f); + exit(1); + } + + /* Macros that depend on the image or sub-image height too: + * + * PNG_PASS_ROWS(height, pass) + * PNG_PASS_COLS(width, pass) + * PNG_ROW_FROM_PASS_ROW(yIn, pass) + * PNG_COL_FROM_PASS_COL(xIn, pass) + * PNG_ROW_IN_INTERLACE_PASS(y, pass) + * PNG_COL_IN_INTERLACE_PASS(x, pass) + */ + for (v=0;;) + { + /* First the base 0 stuff: */ + m = PNG_ROW_FROM_PASS_ROW(v, pass); + f = png_row_from_pass_row(v, pass); + if (m != f) + { + fprintf(stderr, "PNG_ROW_FROM_PASS_ROW(%u, %d) = %u != %x\n", + v, pass, m, f); + exit(1); + } + + m = PNG_COL_FROM_PASS_COL(v, pass); + f = png_col_from_pass_col(v, pass); + if (m != f) + { + fprintf(stderr, "PNG_COL_FROM_PASS_COL(%u, %d) = %u != %x\n", + v, pass, m, f); + exit(1); + } + + m = PNG_ROW_IN_INTERLACE_PASS(v, pass); + f = png_row_in_interlace_pass(v, pass); + if (m != f) + { + fprintf(stderr, "PNG_ROW_IN_INTERLACE_PASS(%u, %d) = %u != %x\n", + v, pass, m, f); + exit(1); + } + + m = PNG_COL_IN_INTERLACE_PASS(v, pass); + f = png_col_in_interlace_pass(v, pass); + if (m != f) + { + fprintf(stderr, "PNG_COL_IN_INTERLACE_PASS(%u, %d) = %u != %x\n", + v, pass, m, f); + exit(1); + } + + /* Then the base 1 stuff: */ + ++v; + m = PNG_PASS_ROWS(v, pass); + f = png_pass_rows(v, pass); + if (m != f) + { + fprintf(stderr, "PNG_PASS_ROWS(%u, %d) = %u != %x\n", + v, pass, m, f); + exit(1); + } + + m = PNG_PASS_COLS(v, pass); + f = png_pass_cols(v, pass); + if (m != f) + { + fprintf(stderr, "PNG_PASS_COLS(%u, %d) = %u != %x\n", + v, pass, m, f); + exit(1); + } + + /* Move to the next v - the stepping algorithm starts skipping + * values above 1024. + */ + if (v > 1024) + { + if (v == PNG_UINT_31_MAX) + break; + + v = (v << 1) ^ v; + if (v >= PNG_UINT_31_MAX) + v = PNG_UINT_31_MAX-1; + } + } + } +} + +/* main program */ +int main(int argc, PNG_CONST char **argv) +{ + volatile int summary = 1; /* Print the error summary at the end */ + + /* Create the given output file on success: */ + PNG_CONST char *volatile touch = NULL; + + /* This is an array of standard gamma values (believe it or not I've seen + * every one of these mentioned somewhere.) + * + * In the following list the most useful values are first! + */ + static double + gammas[]={2.2, 1.0, 2.2/1.45, 1.8, 1.5, 2.4, 2.5, 2.62, 2.9}; + + png_modifier pm; + context(&pm.this, fault); + + modifier_init(&pm); + + /* Preallocate the image buffer, because we know how big it needs to be, + * note that, for testing purposes, it is deliberately mis-aligned. + */ + pm.this.image = malloc(2*TRANSFORM_IMAGEMAX+1); + + if (pm.this.image != NULL) + { + /* Ignore OOM at this point - the 'ensure' routine above will allocate + * the array appropriately. + */ + ++(pm.this.image); + pm.this.cb_image = 2*TRANSFORM_IMAGEMAX; + } + + /* Default to error on warning: */ + pm.this.treat_warnings_as_errors = 1; + + /* Store the test gammas */ + pm.gammas = gammas; + pm.ngammas = 0; /* default to off */ + pm.sbitlow = 8U; /* because libpng doesn't do sBIT below 8! */ + pm.use_input_precision_16to8 = 1U; /* Because of the way libpng does it */ + + /* Some default values (set the behavior for 'make check' here). + * These values simply control the maximum error permitted in the gamma + * transformations. The practial limits for human perception are described + * below (the setting for maxpc16), however for 8 bit encodings it isn't + * possible to meet the accepted capabilities of human vision - i.e. 8 bit + * images can never be good enough, regardless of encoding. + */ + pm.maxout8 = .1; /* Arithmetic error in *encoded* value */ + pm.maxabs8 = .00005; /* 1/20000 */ + pm.maxpc8 = .499; /* I.e., .499% fractional error */ + pm.maxout16 = .499; /* Error in *encoded* value */ + pm.maxabs16 = .00005;/* 1/20000 */ + + /* NOTE: this is a reasonable perceptual limit. We assume that humans can + * perceive light level differences of 1% over a 100:1 range, so we need to + * maintain 1 in 10000 accuracy (in linear light space), which is what the + * following guarantees. It also allows significantly higher errors at + * higher 16 bit values, which is important for performance. The actual + * maximum 16 bit error is about +/-1.9 in the fixed point implementation but + * this is only allowed for values >38149 by the following: + */ + pm.maxpc16 = .005; /* I.e., 1/200% - 1/20000 */ + + /* Now parse the command line options. */ + while (--argc >= 1) + { + if (strcmp(*++argv, "-v") == 0) + pm.this.verbose = 1; + + else if (strcmp(*argv, "-l") == 0) + pm.log = 1; + + else if (strcmp(*argv, "-q") == 0) + summary = pm.this.verbose = pm.log = 0; + + else if (strcmp(*argv, "-w") == 0) + pm.this.treat_warnings_as_errors = 0; + + else if (strcmp(*argv, "--speed") == 0) + pm.this.speed = 1, pm.ngammas = (sizeof gammas)/(sizeof gammas[0]), + pm.test_standard = 0; + + else if (strcmp(*argv, "--size") == 0) + pm.test_size = 1; + + else if (strcmp(*argv, "--nosize") == 0) + pm.test_size = 0; + + else if (strcmp(*argv, "--standard") == 0) + pm.test_standard = 1; + + else if (strcmp(*argv, "--nostandard") == 0) + pm.test_standard = 0; + + else if (strcmp(*argv, "--transform") == 0) + pm.test_transform = 1; + + else if (strcmp(*argv, "--notransform") == 0) + pm.test_transform = 0; + + else if (strncmp(*argv, "--transform-disable=", + sizeof "--transform-disable") == 0) + { + pm.test_transform = 1; + transform_disable(*argv + sizeof "--transform-disable"); + } + + else if (strncmp(*argv, "--transform-enable=", + sizeof "--transform-enable") == 0) + { + pm.test_transform = 1; + transform_enable(*argv + sizeof "--transform-enable"); + } + + else if (strcmp(*argv, "--gamma") == 0) + { + /* Just do two gamma tests here (2.2 and linear) for speed: */ + pm.ngammas = 2U; + pm.test_gamma_threshold = 1; + pm.test_gamma_transform = 1; + pm.test_gamma_sbit = 1; + pm.test_gamma_strip16 = 1; + } + + else if (strcmp(*argv, "--nogamma") == 0) + pm.ngammas = 0; + + else if (strcmp(*argv, "--gamma-threshold") == 0) + pm.ngammas = 2U, pm.test_gamma_threshold = 1; + + else if (strcmp(*argv, "--nogamma-threshold") == 0) + pm.test_gamma_threshold = 0; + + else if (strcmp(*argv, "--gamma-transform") == 0) + pm.ngammas = 2U, pm.test_gamma_transform = 1; + + else if (strcmp(*argv, "--nogamma-transform") == 0) + pm.test_gamma_transform = 0; + + else if (strcmp(*argv, "--gamma-sbit") == 0) + pm.ngammas = 2U, pm.test_gamma_sbit = 1; + + else if (strcmp(*argv, "--nogamma-sbit") == 0) + pm.test_gamma_sbit = 0; + + else if (strcmp(*argv, "--gamma-16-to-8") == 0) + pm.ngammas = 2U, pm.test_gamma_strip16 = 1; + + else if (strcmp(*argv, "--nogamma-16-to-8") == 0) + pm.test_gamma_strip16 = 0; + + else if (strcmp(*argv, "--all-gammas") == 0) + pm.ngammas = (sizeof gammas)/(sizeof gammas[0]); + + else if (strcmp(*argv, "--progressive-read") == 0) + pm.this.progressive = 1; + + else if (strcmp(*argv, "--interlace") == 0) + pm.interlace_type = PNG_INTERLACE_ADAM7; + + else if (argc >= 1 && strcmp(*argv, "--sbitlow") == 0) + --argc, pm.sbitlow = (png_byte)atoi(*++argv); + + else if (argc >= 1 && strcmp(*argv, "--touch") == 0) + --argc, touch = *++argv; + + else if (argc >= 1 && strncmp(*argv, "--max", 4) == 0) + { + --argc; + + if (strcmp(4+*argv, "abs8") == 0) + pm.maxabs8 = atof(*++argv); + + else if (strcmp(4+*argv, "abs16") == 0) + pm.maxabs16 = atof(*++argv); + + else if (strcmp(4+*argv, "out8") == 0) + pm.maxout8 = atof(*++argv); + + else if (strcmp(4+*argv, "out16") == 0) + pm.maxout16 = atof(*++argv); + + else if (strcmp(4+*argv, "pc8") == 0) + pm.maxpc8 = atof(*++argv); + + else if (strcmp(4+*argv, "pc16") == 0) + pm.maxpc16 = atof(*++argv); + + else + { + fprintf(stderr, "pngvalid: %s: unknown 'max' option\n", *argv); + exit(1); + } + } + + else + { + fprintf(stderr, "pngvalid: %s: unknown argument\n", *argv); + exit(1); + } + } + + /* If pngvalid is run with no arguments default to a reasonable set of the + * tests. + */ + if (pm.test_standard == 0 && pm.test_size == 0 && pm.test_transform == 0 && + pm.ngammas == 0) + { + pm.test_standard = 1; + pm.test_size = 1; + pm.test_transform = 1; + pm.ngammas = 3U; + } + + if (pm.ngammas > 0 && + pm.test_gamma_threshold == 0 && pm.test_gamma_transform == 0 && + pm.test_gamma_sbit == 0 && pm.test_gamma_strip16 == 0) + { + pm.test_gamma_threshold = 1; + pm.test_gamma_transform = 1; + pm.test_gamma_sbit = 1; + pm.test_gamma_strip16 = 1; + } + + else if (pm.ngammas == 0) + { + /* Nothing to test so turn everything off: */ + pm.test_gamma_threshold = 0; + pm.test_gamma_transform = 0; + pm.test_gamma_sbit = 0; + pm.test_gamma_strip16 = 0; + } + + Try + { + /* Make useful base images */ + make_transform_images(&pm.this); + + /* Perform the standard and gamma tests. */ + if (pm.test_standard) + { + perform_interlace_macro_validation(); + perform_standard_test(&pm); + perform_error_test(&pm); + } + + /* Various oddly sized images: */ + if (pm.test_size) + { + make_size_images(&pm.this); + perform_size_test(&pm); + } + + /* Combinatorial transforms: */ + if (pm.test_transform) + perform_transform_test(&pm); + + if (pm.ngammas > 0) + perform_gamma_test(&pm, pm.this.speed != 0, + summary && !pm.this.speed); + } + + Catch(fault) + { + fprintf(stderr, "pngvalid: test aborted (probably failed in cleanup)\n"); + if (!pm.this.verbose) + { + if (pm.this.error[0] != 0) + fprintf(stderr, "pngvalid: first error: %s\n", pm.this.error); + + fprintf(stderr, "pngvalid: run with -v to see what happened\n"); + } + exit(1); + } + + if (summary && !pm.this.speed) + { + printf("Results using %s point arithmetic %s\n", +#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || PNG_LIBPNG_VER < 10500 + "floating", +#else + "fixed", +#endif + (pm.this.nerrors || (pm.this.treat_warnings_as_errors && + pm.this.nwarnings)) ? "(errors)" : (pm.this.nwarnings ? + "(warnings)" : "(no errors or warnings)") + ); + printf("Allocated memory statistics (in bytes):\n" + "\tread %lu maximum single, %lu peak, %lu total\n" + "\twrite %lu maximum single, %lu peak, %lu total\n", + (unsigned long)pm.this.read_memory_pool.max_max, + (unsigned long)pm.this.read_memory_pool.max_limit, + (unsigned long)pm.this.read_memory_pool.max_total, + (unsigned long)pm.this.write_memory_pool.max_max, + (unsigned long)pm.this.write_memory_pool.max_limit, + (unsigned long)pm.this.write_memory_pool.max_total); + } + + /* Do this here to provoke memory corruption errors in memory not directly + * allocated by libpng - not a complete test, but better than nothing. + */ + store_delete(&pm.this); + + /* Error exit if there are any errors, and maybe if there are any + * warnings. + */ + if (pm.this.nerrors || (pm.this.treat_warnings_as_errors && + pm.this.nwarnings)) + { + if (!pm.this.verbose) + fprintf(stderr, "pngvalid: %s\n", pm.this.error); + + fprintf(stderr, "pngvalid: %d errors, %d warnings\n", pm.this.nerrors, + pm.this.nwarnings); + + exit(1); + } + + /* Success case. */ + if (touch != NULL) + { + FILE *fsuccess = fopen(touch, "wt"); + + if (fsuccess != NULL) + { + int error = 0; + fprintf(fsuccess, "PNG validation succeeded\n"); + fflush(fsuccess); + error = ferror(fsuccess); + + if (fclose(fsuccess) || error) + { + fprintf(stderr, "%s: write failed\n", touch); + exit(1); + } + } + } + + return 0; +} diff --git a/src/3rdparty/libpng/pngwio.c b/src/3rdparty/libpng/pngwio.c new file mode 100644 index 0000000000..95ffb3429f --- /dev/null +++ b/src/3rdparty/libpng/pngwio.c @@ -0,0 +1,254 @@ + +/* pngwio.c - functions for data output + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file provides a location for all output. Users who need + * special handling are expected to write functions that have the same + * arguments as these and perform similar functions, but that possibly + * use different output methods. Note that you shouldn't change these + * functions, but rather write replacement functions and then change + * them at run time with png_set_write_fn(...). + */ + +#include "pngpriv.h" + +#ifdef PNG_WRITE_SUPPORTED + +/* Write the data to whatever output you are using. The default routine + * writes to a file pointer. Note that this routine sometimes gets called + * with very small lengths, so you should implement some kind of simple + * buffering if you are using unbuffered writes. This should never be asked + * to write more than 64K on a 16 bit machine. + */ + +void /* PRIVATE */ +png_write_data(png_structp png_ptr, png_const_bytep data, png_size_t length) +{ + /* NOTE: write_data_fn must not change the buffer! */ + if (png_ptr->write_data_fn != NULL ) + (*(png_ptr->write_data_fn))(png_ptr, (png_bytep)data, length); + + else + png_error(png_ptr, "Call to NULL write function"); +} + +#ifdef PNG_STDIO_SUPPORTED +/* This is the function that does the actual writing of data. If you are + * not writing to a standard C stream, you should create a replacement + * write_data function and use it at run time with png_set_write_fn(), rather + * than changing the library. + */ +#ifndef USE_FAR_KEYWORD +void PNGCBAPI +png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + + if (png_ptr == NULL) + return; + + check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); + + if (check != length) + png_error(png_ptr, "Write Error"); +} +#else +/* This is the model-independent version. Since the standard I/O library + * can't handle far buffers in the medium and small models, we have to copy + * the data. + */ + +#define NEAR_BUF_SIZE 1024 +#define MIN(a,b) (a <= b ? a : b) + +void PNGCBAPI +png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_uint_32 check; + png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */ + png_FILE_p io_ptr; + + if (png_ptr == NULL) + return; + + /* Check if data really is near. If so, use usual code. */ + near_data = (png_byte *)CVT_PTR_NOCHECK(data); + io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + + if ((png_bytep)near_data == data) + { + check = fwrite(near_data, 1, length, io_ptr); + } + + else + { + png_byte buf[NEAR_BUF_SIZE]; + png_size_t written, remaining, err; + check = 0; + remaining = length; + + do + { + written = MIN(NEAR_BUF_SIZE, remaining); + png_memcpy(buf, data, written); /* Copy far buffer to near buffer */ + err = fwrite(buf, 1, written, io_ptr); + + if (err != written) + break; + + else + check += err; + + data += written; + remaining -= written; + } + while (remaining != 0); + } + + if (check != length) + png_error(png_ptr, "Write Error"); +} + +#endif +#endif + +/* This function is called to output any data pending writing (normally + * to disk). After png_flush is called, there should be no data pending + * writing in any buffers. + */ +#ifdef PNG_WRITE_FLUSH_SUPPORTED +void /* PRIVATE */ +png_flush(png_structp png_ptr) +{ + if (png_ptr->output_flush_fn != NULL) + (*(png_ptr->output_flush_fn))(png_ptr); +} + +# ifdef PNG_STDIO_SUPPORTED +void PNGCBAPI +png_default_flush(png_structp png_ptr) +{ + png_FILE_p io_ptr; + + if (png_ptr == NULL) + return; + + io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); + fflush(io_ptr); +} +# endif +#endif + +/* This function allows the application to supply new output functions for + * libpng if standard C streams aren't being used. + * + * This function takes as its arguments: + * png_ptr - pointer to a png output data structure + * io_ptr - pointer to user supplied structure containing info about + * the output functions. May be NULL. + * write_data_fn - pointer to a new output function that takes as its + * arguments a pointer to a png_struct, a pointer to + * data to be written, and a 32-bit unsigned int that is + * the number of bytes to be written. The new write + * function should call png_error(png_ptr, "Error msg") + * to exit and output any fatal error messages. May be + * NULL, in which case libpng's default function will + * be used. + * flush_data_fn - pointer to a new flush function that takes as its + * arguments a pointer to a png_struct. After a call to + * the flush function, there should be no data in any buffers + * or pending transmission. If the output method doesn't do + * any buffering of output, a function prototype must still be + * supplied although it doesn't have to do anything. If + * PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile + * time, output_flush_fn will be ignored, although it must be + * supplied for compatibility. May be NULL, in which case + * libpng's default function will be used, if + * PNG_WRITE_FLUSH_SUPPORTED is defined. This is not + * a good idea if io_ptr does not point to a standard + * *FILE structure. + */ +void PNGAPI +png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) +{ + if (png_ptr == NULL) + return; + + png_ptr->io_ptr = io_ptr; + +#ifdef PNG_STDIO_SUPPORTED + if (write_data_fn != NULL) + png_ptr->write_data_fn = write_data_fn; + + else + png_ptr->write_data_fn = png_default_write_data; +#else + png_ptr->write_data_fn = write_data_fn; +#endif + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +# ifdef PNG_STDIO_SUPPORTED + + if (output_flush_fn != NULL) + png_ptr->output_flush_fn = output_flush_fn; + + else + png_ptr->output_flush_fn = png_default_flush; + +# else + png_ptr->output_flush_fn = output_flush_fn; +# endif +#endif /* PNG_WRITE_FLUSH_SUPPORTED */ + + /* It is an error to read while writing a png file */ + if (png_ptr->read_data_fn != NULL) + { + png_ptr->read_data_fn = NULL; + + png_warning(png_ptr, + "Can't set both read_data_fn and write_data_fn in the" + " same structure"); + } +} + +#ifdef USE_FAR_KEYWORD +# ifdef _MSC_VER +void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check) +{ + void *near_ptr; + void FAR *far_ptr; + FP_OFF(near_ptr) = FP_OFF(ptr); + far_ptr = (void FAR *)near_ptr; + + if (check != 0) + if (FP_SEG(ptr) != FP_SEG(far_ptr)) + png_error(png_ptr, "segment lost in conversion"); + + return(near_ptr); +} +# else +void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check) +{ + void *near_ptr; + void FAR *far_ptr; + near_ptr = (void FAR *)ptr; + far_ptr = (void FAR *)near_ptr; + + if (check != 0) + if (far_ptr != ptr) + png_error(png_ptr, "segment lost in conversion"); + + return(near_ptr); +} +# endif +#endif +#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngwrite.c b/src/3rdparty/libpng/pngwrite.c new file mode 100644 index 0000000000..d90f449e30 --- /dev/null +++ b/src/3rdparty/libpng/pngwrite.c @@ -0,0 +1,1605 @@ + +/* pngwrite.c - general routines to write a PNG file + * + * Last changed in libpng 1.5.1 [February 3, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#include "pngpriv.h" + +#ifdef PNG_WRITE_SUPPORTED + +/* Writes all the PNG information. This is the suggested way to use the + * library. If you have a new chunk to add, make a function to write it, + * and put it in the correct location here. If you want the chunk written + * after the image data, put it in png_write_end(). I strongly encourage + * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing + * the chunk, as that will keep the code from breaking if you want to just + * write a plain PNG file. If you have long comments, I suggest writing + * them in png_write_end(), and compressing them. + */ +void PNGAPI +png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_write_info_before_PLTE"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) + { + /* Write PNG signature */ + png_write_sig(png_ptr); + +#ifdef PNG_MNG_FEATURES_SUPPORTED + if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) && \ + (png_ptr->mng_features_permitted)) + { + png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); + png_ptr->mng_features_permitted = 0; + } +#endif + + /* Write IHDR information. */ + png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, + info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, + info_ptr->filter_type, +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + info_ptr->interlace_type); +#else + 0); +#endif + /* The rest of these check to see if the valid field has the appropriate + * flag set, and if it does, writes the chunk. + */ +#ifdef PNG_WRITE_gAMA_SUPPORTED + if (info_ptr->valid & PNG_INFO_gAMA) + png_write_gAMA_fixed(png_ptr, info_ptr->gamma); +#endif +#ifdef PNG_WRITE_sRGB_SUPPORTED + if (info_ptr->valid & PNG_INFO_sRGB) + png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); +#endif + +#ifdef PNG_WRITE_iCCP_SUPPORTED + if (info_ptr->valid & PNG_INFO_iCCP) + png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, + (png_charp)info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); +#endif +#ifdef PNG_WRITE_sBIT_SUPPORTED + if (info_ptr->valid & PNG_INFO_sBIT) + png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); +#endif +#ifdef PNG_WRITE_cHRM_SUPPORTED + if (info_ptr->valid & PNG_INFO_cHRM) + png_write_cHRM_fixed(png_ptr, + info_ptr->x_white, info_ptr->y_white, + info_ptr->x_red, info_ptr->y_red, + info_ptr->x_green, info_ptr->y_green, + info_ptr->x_blue, info_ptr->y_blue); +#endif + +#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED + if (info_ptr->unknown_chunks_num) + { + png_unknown_chunk *up; + + png_debug(5, "writing extra chunks"); + + for (up = info_ptr->unknown_chunks; + up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; + up++) + { + int keep = png_handle_as_unknown(png_ptr, up->name); + + if (keep != PNG_HANDLE_CHUNK_NEVER && + up->location && !(up->location & PNG_HAVE_PLTE) && + !(up->location & PNG_HAVE_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + { + if (up->size == 0) + png_warning(png_ptr, "Writing zero-length unknown chunk"); + + png_write_chunk(png_ptr, up->name, up->data, up->size); + } + } + } +#endif + png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; + } +} + +void PNGAPI +png_write_info(png_structp png_ptr, png_infop info_ptr) +{ +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) + int i; +#endif + + png_debug(1, "in png_write_info"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_write_info_before_PLTE(png_ptr, info_ptr); + + if (info_ptr->valid & PNG_INFO_PLTE) + png_write_PLTE(png_ptr, info_ptr->palette, + (png_uint_32)info_ptr->num_palette); + + else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + png_error(png_ptr, "Valid palette required for paletted images"); + +#ifdef PNG_WRITE_tRNS_SUPPORTED + if (info_ptr->valid & PNG_INFO_tRNS) + { +#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED + /* Invert the alpha channel (in tRNS) */ + if ((png_ptr->transformations & PNG_INVERT_ALPHA) && + info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + int j; + for (j = 0; j<(int)info_ptr->num_trans; j++) + info_ptr->trans_alpha[j] = + (png_byte)(255 - info_ptr->trans_alpha[j]); + } +#endif + png_write_tRNS(png_ptr, info_ptr->trans_alpha, &(info_ptr->trans_color), + info_ptr->num_trans, info_ptr->color_type); + } +#endif +#ifdef PNG_WRITE_bKGD_SUPPORTED + if (info_ptr->valid & PNG_INFO_bKGD) + png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); +#endif + +#ifdef PNG_WRITE_hIST_SUPPORTED + if (info_ptr->valid & PNG_INFO_hIST) + png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); +#endif + +#ifdef PNG_WRITE_oFFs_SUPPORTED + if (info_ptr->valid & PNG_INFO_oFFs) + png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, + info_ptr->offset_unit_type); +#endif + +#ifdef PNG_WRITE_pCAL_SUPPORTED + if (info_ptr->valid & PNG_INFO_pCAL) + png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, + info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, + info_ptr->pcal_units, info_ptr->pcal_params); +#endif + +#ifdef PNG_WRITE_sCAL_SUPPORTED + if (info_ptr->valid & PNG_INFO_sCAL) + png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, + info_ptr->scal_s_width, info_ptr->scal_s_height); +#endif /* sCAL */ + +#ifdef PNG_WRITE_pHYs_SUPPORTED + if (info_ptr->valid & PNG_INFO_pHYs) + png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, + info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); +#endif /* pHYs */ + +#ifdef PNG_WRITE_tIME_SUPPORTED + if (info_ptr->valid & PNG_INFO_tIME) + { + png_write_tIME(png_ptr, &(info_ptr->mod_time)); + png_ptr->mode |= PNG_WROTE_tIME; + } +#endif /* tIME */ + +#ifdef PNG_WRITE_sPLT_SUPPORTED + if (info_ptr->valid & PNG_INFO_sPLT) + for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) + png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); +#endif /* sPLT */ + +#ifdef PNG_WRITE_TEXT_SUPPORTED + /* Check to see if we need to write text chunks */ + for (i = 0; i < info_ptr->num_text; i++) + { + png_debug2(2, "Writing header text chunk %d, type %d", i, + info_ptr->text[i].compression); + /* An internationalized chunk? */ + if (info_ptr->text[i].compression > 0) + { +#ifdef PNG_WRITE_iTXt_SUPPORTED + /* Write international chunk */ + png_write_iTXt(png_ptr, + info_ptr->text[i].compression, + info_ptr->text[i].key, + info_ptr->text[i].lang, + info_ptr->text[i].lang_key, + info_ptr->text[i].text); +#else + png_warning(png_ptr, "Unable to write international text"); +#endif + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + } + + /* If we want a compressed text chunk */ + else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) + { +#ifdef PNG_WRITE_zTXt_SUPPORTED + /* Write compressed chunk */ + png_write_zTXt(png_ptr, info_ptr->text[i].key, + info_ptr->text[i].text, 0, + info_ptr->text[i].compression); +#else + png_warning(png_ptr, "Unable to write compressed text"); +#endif + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; + } + + else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) + { +#ifdef PNG_WRITE_tEXt_SUPPORTED + /* Write uncompressed chunk */ + png_write_tEXt(png_ptr, info_ptr->text[i].key, + info_ptr->text[i].text, + 0); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; +#else + /* Can't get here */ + png_warning(png_ptr, "Unable to write uncompressed text"); +#endif + } + } +#endif /* tEXt */ + +#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED + if (info_ptr->unknown_chunks_num) + { + png_unknown_chunk *up; + + png_debug(5, "writing extra chunks"); + + for (up = info_ptr->unknown_chunks; + up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; + up++) + { + int keep = png_handle_as_unknown(png_ptr, up->name); + if (keep != PNG_HANDLE_CHUNK_NEVER && + up->location && (up->location & PNG_HAVE_PLTE) && + !(up->location & PNG_HAVE_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + { + png_write_chunk(png_ptr, up->name, up->data, up->size); + } + } + } +#endif +} + +/* Writes the end of the PNG file. If you don't want to write comments or + * time information, you can pass NULL for info. If you already wrote these + * in png_write_info(), do not write them again here. If you have long + * comments, I suggest writing them here, and compressing them. + */ +void PNGAPI +png_write_end(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_write_end"); + + if (png_ptr == NULL) + return; + + if (!(png_ptr->mode & PNG_HAVE_IDAT)) + png_error(png_ptr, "No IDATs written into file"); + + /* See if user wants us to write information chunks */ + if (info_ptr != NULL) + { +#ifdef PNG_WRITE_TEXT_SUPPORTED + int i; /* local index variable */ +#endif +#ifdef PNG_WRITE_tIME_SUPPORTED + /* Check to see if user has supplied a time chunk */ + if ((info_ptr->valid & PNG_INFO_tIME) && + !(png_ptr->mode & PNG_WROTE_tIME)) + png_write_tIME(png_ptr, &(info_ptr->mod_time)); + +#endif +#ifdef PNG_WRITE_TEXT_SUPPORTED + /* Loop through comment chunks */ + for (i = 0; i < info_ptr->num_text; i++) + { + png_debug2(2, "Writing trailer text chunk %d, type %d", i, + info_ptr->text[i].compression); + /* An internationalized chunk? */ + if (info_ptr->text[i].compression > 0) + { +#ifdef PNG_WRITE_iTXt_SUPPORTED + /* Write international chunk */ + png_write_iTXt(png_ptr, + info_ptr->text[i].compression, + info_ptr->text[i].key, + info_ptr->text[i].lang, + info_ptr->text[i].lang_key, + info_ptr->text[i].text); +#else + png_warning(png_ptr, "Unable to write international text"); +#endif + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + } + + else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) + { +#ifdef PNG_WRITE_zTXt_SUPPORTED + /* Write compressed chunk */ + png_write_zTXt(png_ptr, info_ptr->text[i].key, + info_ptr->text[i].text, 0, + info_ptr->text[i].compression); +#else + png_warning(png_ptr, "Unable to write compressed text"); +#endif + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; + } + + else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) + { +#ifdef PNG_WRITE_tEXt_SUPPORTED + /* Write uncompressed chunk */ + png_write_tEXt(png_ptr, info_ptr->text[i].key, + info_ptr->text[i].text, 0); +#else + png_warning(png_ptr, "Unable to write uncompressed text"); +#endif + + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + } + } +#endif +#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED + if (info_ptr->unknown_chunks_num) + { + png_unknown_chunk *up; + + png_debug(5, "writing extra chunks"); + + for (up = info_ptr->unknown_chunks; + up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; + up++) + { + int keep = png_handle_as_unknown(png_ptr, up->name); + if (keep != PNG_HANDLE_CHUNK_NEVER && + up->location && (up->location & PNG_AFTER_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + { + png_write_chunk(png_ptr, up->name, up->data, up->size); + } + } + } +#endif + } + + png_ptr->mode |= PNG_AFTER_IDAT; + + /* Write end of PNG file */ + png_write_IEND(png_ptr); + /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, + * and restored again in libpng-1.2.30, may cause some applications that + * do not set png_ptr->output_flush_fn to crash. If your application + * experiences a problem, please try building libpng with + * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to + * png-mng-implement at lists.sf.net . + */ +#ifdef PNG_WRITE_FLUSH_SUPPORTED +# ifdef PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED + png_flush(png_ptr); +# endif +#endif +} + +#ifdef PNG_CONVERT_tIME_SUPPORTED +/* "tm" structure is not supported on WindowsCE */ +void PNGAPI +png_convert_from_struct_tm(png_timep ptime, PNG_CONST struct tm FAR * ttime) +{ + png_debug(1, "in png_convert_from_struct_tm"); + + ptime->year = (png_uint_16)(1900 + ttime->tm_year); + ptime->month = (png_byte)(ttime->tm_mon + 1); + ptime->day = (png_byte)ttime->tm_mday; + ptime->hour = (png_byte)ttime->tm_hour; + ptime->minute = (png_byte)ttime->tm_min; + ptime->second = (png_byte)ttime->tm_sec; +} + +void PNGAPI +png_convert_from_time_t(png_timep ptime, time_t ttime) +{ + struct tm *tbuf; + + png_debug(1, "in png_convert_from_time_t"); + + tbuf = gmtime(&ttime); + png_convert_from_struct_tm(ptime, tbuf); +} +#endif + +/* Initialize png_ptr structure, and allocate any memory needed */ +PNG_FUNCTION(png_structp,PNGAPI +png_create_write_struct,(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED) +{ +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, + warn_fn, NULL, NULL, NULL)); +} + +/* Alternate initialize png_ptr structure, and allocate any memory needed */ +static void png_reset_filter_heuristics(png_structp png_ptr); /* forward decl */ + +PNG_FUNCTION(png_structp,PNGAPI +png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + volatile int png_cleanup_needed = 0; +#ifdef PNG_SETJMP_SUPPORTED + volatile +#endif + png_structp png_ptr; +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + jmp_buf png_jmpbuf; +#endif +#endif + int i; + + png_debug(1, "in png_create_write_struct"); + +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, + (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); +#else + png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); +#endif /* PNG_USER_MEM_SUPPORTED */ + if (png_ptr == NULL) + return (NULL); + + /* Added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_ptr->user_width_max = PNG_USER_WIDTH_MAX; + png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* Applications that neglect to set up their own setjmp() and then + encounter a png_error() will longjmp here. Since the jmpbuf is + then meaningless we abort instead of returning. */ +#ifdef USE_FAR_KEYWORD + if (setjmp(png_jmpbuf)) +#else + if (setjmp(png_jmpbuf(png_ptr))) /* sets longjmp to match setjmp */ +#endif +#ifdef USE_FAR_KEYWORD + png_memcpy(png_jmpbuf(png_ptr), png_jmpbuf, png_sizeof(jmp_buf)); +#endif + PNG_ABORT(); +#endif + +#ifdef PNG_USER_MEM_SUPPORTED + png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); +#endif /* PNG_USER_MEM_SUPPORTED */ + png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); + + if (user_png_ver) + { + i = 0; + do + { + if (user_png_ver[i] != png_libpng_ver[i]) + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + } while (png_libpng_ver[i++]); + } + + if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) + { + /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so + * we must recompile any applications that use any older library version. + * For versions after libpng 1.0, we will be compatible, so we need + * only check the first digit. + */ + if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || + (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || + (user_png_ver[0] == '0' && user_png_ver[2] < '9')) + { +#ifdef PNG_CONSOLE_IO_SUPPORTED + char msg[80]; + + if (user_png_ver) + { + png_snprintf2(msg, 80, + "Application built with libpng-%.20s" + " but running with %.20s", + user_png_ver, + png_libpng_ver); + png_warning(png_ptr, msg); + } +#else + png_warning(png_ptr, + "Incompatible libpng version in application and library"); +#endif +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags = 0; +#endif + png_cleanup_needed = 1; + } + } + + /* Initialize zbuf - compression buffer */ + png_ptr->zbuf_size = PNG_ZBUF_SIZE; + + if (!png_cleanup_needed) + { + png_ptr->zbuf = (png_bytep)png_malloc_warn(png_ptr, + png_ptr->zbuf_size); + if (png_ptr->zbuf == NULL) + png_cleanup_needed = 1; + } + + if (png_cleanup_needed) + { + /* Clean up PNG structure and deallocate any memory. */ + png_free(png_ptr, png_ptr->zbuf); + png_ptr->zbuf = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, + (png_free_ptr)free_fn, (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + return (NULL); + } + + png_set_write_fn(png_ptr, NULL, NULL, NULL); + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + png_reset_filter_heuristics(png_ptr); +#endif + + return (png_ptr); +} + + +/* Write a few rows of image data. If the image is interlaced, + * either you will have to write the 7 sub images, or, if you + * have called png_set_interlace_handling(), you will have to + * "write" the image seven times. + */ +void PNGAPI +png_write_rows(png_structp png_ptr, png_bytepp row, + png_uint_32 num_rows) +{ + png_uint_32 i; /* row counter */ + png_bytepp rp; /* row pointer */ + + png_debug(1, "in png_write_rows"); + + if (png_ptr == NULL) + return; + + /* Loop through the rows */ + for (i = 0, rp = row; i < num_rows; i++, rp++) + { + png_write_row(png_ptr, *rp); + } +} + +/* Write the image. You only need to call this function once, even + * if you are writing an interlaced image. + */ +void PNGAPI +png_write_image(png_structp png_ptr, png_bytepp image) +{ + png_uint_32 i; /* row index */ + int pass, num_pass; /* pass variables */ + png_bytepp rp; /* points to current row */ + + if (png_ptr == NULL) + return; + + png_debug(1, "in png_write_image"); + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* Initialize interlace handling. If image is not interlaced, + * this will set pass to 1 + */ + num_pass = png_set_interlace_handling(png_ptr); +#else + num_pass = 1; +#endif + /* Loop through passes */ + for (pass = 0; pass < num_pass; pass++) + { + /* Loop through image */ + for (i = 0, rp = image; i < png_ptr->height; i++, rp++) + { + png_write_row(png_ptr, *rp); + } + } +} + +/* Called by user to write a row of image data */ +void PNGAPI +png_write_row(png_structp png_ptr, png_const_bytep row) +{ + if (png_ptr == NULL) + return; + + png_debug2(1, "in png_write_row (row %u, pass %d)", + png_ptr->row_number, png_ptr->pass); + + /* Initialize transformations and other stuff if first time */ + if (png_ptr->row_number == 0 && png_ptr->pass == 0) + { + /* Make sure we wrote the header info */ + if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) + png_error(png_ptr, + "png_write_info was never called before png_write_row"); + + /* Check for transforms that have been set but were defined out */ +#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_MONO) + png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined"); +#endif + +#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & PNG_FILLER) + png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined"); +#endif +#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ + defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + png_warning(png_ptr, + "PNG_WRITE_PACKSWAP_SUPPORTED is not defined"); +#endif + +#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) + if (png_ptr->transformations & PNG_PACK) + png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined"); +#endif + +#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) + if (png_ptr->transformations & PNG_SHIFT) + png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined"); +#endif + +#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) + if (png_ptr->transformations & PNG_BGR) + png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined"); +#endif + +#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined"); +#endif + + png_write_start_row(png_ptr); + } + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* If interlaced and not interested in row, return */ + if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + { + switch (png_ptr->pass) + { + case 0: + if (png_ptr->row_number & 0x07) + { + png_write_finish_row(png_ptr); + return; + } + break; + + case 1: + if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) + { + png_write_finish_row(png_ptr); + return; + } + break; + + case 2: + if ((png_ptr->row_number & 0x07) != 4) + { + png_write_finish_row(png_ptr); + return; + } + break; + + case 3: + if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) + { + png_write_finish_row(png_ptr); + return; + } + break; + + case 4: + if ((png_ptr->row_number & 0x03) != 2) + { + png_write_finish_row(png_ptr); + return; + } + break; + + case 5: + if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) + { + png_write_finish_row(png_ptr); + return; + } + break; + + case 6: + if (!(png_ptr->row_number & 0x01)) + { + png_write_finish_row(png_ptr); + return; + } + break; + + default: /* error: ignore it */ + break; + } + } +#endif + + /* Set up row info for transformations */ + png_ptr->row_info.color_type = png_ptr->color_type; + png_ptr->row_info.width = png_ptr->usr_width; + png_ptr->row_info.channels = png_ptr->usr_channels; + png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; + png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * + png_ptr->row_info.channels); + + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + + png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type); + png_debug1(3, "row_info->width = %u", png_ptr->row_info.width); + png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels); + png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth); + png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth); + png_debug1(3, "row_info->rowbytes = %lu", + (unsigned long)png_ptr->row_info.rowbytes); + + /* Copy user's row into buffer, leaving room for filter byte. */ + png_memcpy(png_ptr->row_buf + 1, row, png_ptr->row_info.rowbytes); + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* Handle interlacing */ + if (png_ptr->interlaced && png_ptr->pass < 6 && + (png_ptr->transformations & PNG_INTERLACE)) + { + png_do_write_interlace(&(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->pass); + /* This should always get caught above, but still ... */ + if (!(png_ptr->row_info.width)) + { + png_write_finish_row(png_ptr); + return; + } + } +#endif + + /* Handle other transformations */ + if (png_ptr->transformations) + png_do_write_transformations(png_ptr); + +#ifdef PNG_MNG_FEATURES_SUPPORTED + /* Write filter_method 64 (intrapixel differencing) only if + * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and + * 2. Libpng did not write a PNG signature (this filter_method is only + * used in PNG datastreams that are embedded in MNG datastreams) and + * 3. The application called png_permit_mng_features with a mask that + * included PNG_FLAG_MNG_FILTER_64 and + * 4. The filter_method is 64 and + * 5. The color_type is RGB or RGBA + */ + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) + { + /* Intrapixel differencing */ + png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); + } +#endif + + /* Find a filter if necessary, filter the row and write it out. */ + png_write_find_filter(png_ptr, &(png_ptr->row_info)); + + if (png_ptr->write_row_fn != NULL) + (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); +} + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +/* Set the automatic flush interval or 0 to turn flushing off */ +void PNGAPI +png_set_flush(png_structp png_ptr, int nrows) +{ + png_debug(1, "in png_set_flush"); + + if (png_ptr == NULL) + return; + + png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); +} + +/* Flush the current output buffers now */ +void PNGAPI +png_write_flush(png_structp png_ptr) +{ + int wrote_IDAT; + + png_debug(1, "in png_write_flush"); + + if (png_ptr == NULL) + return; + + /* We have already written out all of the data */ + if (png_ptr->row_number >= png_ptr->num_rows) + return; + + do + { + int ret; + + /* Compress the data */ + ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); + wrote_IDAT = 0; + + /* Check for compression errors */ + if (ret != Z_OK) + { + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + + else + png_error(png_ptr, "zlib error"); + } + + if (!(png_ptr->zstream.avail_out)) + { + /* Write the IDAT and reset the zlib output buffer */ + png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + wrote_IDAT = 1; + } + } while (wrote_IDAT == 1); + + /* If there is any data left to be output, write it into a new IDAT */ + if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) + { + /* Write the IDAT and reset the zlib output buffer */ + png_write_IDAT(png_ptr, png_ptr->zbuf, + png_ptr->zbuf_size - png_ptr->zstream.avail_out); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + png_ptr->flush_rows = 0; + png_flush(png_ptr); +} +#endif /* PNG_WRITE_FLUSH_SUPPORTED */ + +/* Free all memory used by the write */ +void PNGAPI +png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) +{ + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn = NULL; + png_voidp mem_ptr = NULL; +#endif + + png_debug(1, "in png_destroy_write_struct"); + + if (png_ptr_ptr != NULL) + { + png_ptr = *png_ptr_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; + mem_ptr = png_ptr->mem_ptr; +#endif + } + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr != NULL) + { + free_fn = png_ptr->free_fn; + mem_ptr = png_ptr->mem_ptr; + } +#endif + + if (info_ptr_ptr != NULL) + info_ptr = *info_ptr_ptr; + + if (info_ptr != NULL) + { + if (png_ptr != NULL) + { + png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + if (png_ptr->num_chunk_list) + { + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->num_chunk_list = 0; + } +#endif + } + +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)info_ptr); +#endif + *info_ptr_ptr = NULL; + } + + if (png_ptr != NULL) + { + png_write_destroy(png_ptr); +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + *png_ptr_ptr = NULL; + } +} + + +/* Free any memory used in png_ptr struct (old method) */ +void /* PRIVATE */ +png_write_destroy(png_structp png_ptr) +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf tmp_jmp; /* Save jump buffer */ +#endif + png_error_ptr error_fn; + png_error_ptr warning_fn; + png_voidp error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn; +#endif + + png_debug(1, "in png_write_destroy"); + + /* Free any memory zlib uses */ + deflateEnd(&png_ptr->zstream); + + /* Free our memory. png_free checks NULL for us. */ + png_free(png_ptr, png_ptr->zbuf); + png_free(png_ptr, png_ptr->row_buf); +#ifdef PNG_WRITE_FILTER_SUPPORTED + png_free(png_ptr, png_ptr->prev_row); + png_free(png_ptr, png_ptr->sub_row); + png_free(png_ptr, png_ptr->up_row); + png_free(png_ptr, png_ptr->avg_row); + png_free(png_ptr, png_ptr->paeth_row); +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED + png_free(png_ptr, png_ptr->time_buffer); +#endif + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + /* Use this to save a little code space, it doesn't free the filter_costs */ + png_reset_filter_heuristics(png_ptr); + png_free(png_ptr, png_ptr->filter_costs); + png_free(png_ptr, png_ptr->inv_filter_costs); +#endif + +#ifdef PNG_SETJMP_SUPPORTED + /* Reset structure */ + png_memcpy(tmp_jmp, png_ptr->png_jmpbuf, png_sizeof(jmp_buf)); +#endif + + error_fn = png_ptr->error_fn; + warning_fn = png_ptr->warning_fn; + error_ptr = png_ptr->error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; +#endif + + png_memset(png_ptr, 0, png_sizeof(png_struct)); + + png_ptr->error_fn = error_fn; + png_ptr->warning_fn = warning_fn; + png_ptr->error_ptr = error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr->free_fn = free_fn; +#endif + +#ifdef PNG_SETJMP_SUPPORTED + png_memcpy(png_ptr->png_jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); +#endif +} + +/* Allow the application to select one or more row filters to use. */ +void PNGAPI +png_set_filter(png_structp png_ptr, int method, int filters) +{ + png_debug(1, "in png_set_filter"); + + if (png_ptr == NULL) + return; + +#ifdef PNG_MNG_FEATURES_SUPPORTED + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (method == PNG_INTRAPIXEL_DIFFERENCING)) + method = PNG_FILTER_TYPE_BASE; + +#endif + if (method == PNG_FILTER_TYPE_BASE) + { + switch (filters & (PNG_ALL_FILTERS | 0x07)) + { +#ifdef PNG_WRITE_FILTER_SUPPORTED + case 5: + case 6: + case 7: png_warning(png_ptr, "Unknown row filter for method 0"); +#endif /* PNG_WRITE_FILTER_SUPPORTED */ + case PNG_FILTER_VALUE_NONE: + png_ptr->do_filter = PNG_FILTER_NONE; break; + +#ifdef PNG_WRITE_FILTER_SUPPORTED + case PNG_FILTER_VALUE_SUB: + png_ptr->do_filter = PNG_FILTER_SUB; break; + + case PNG_FILTER_VALUE_UP: + png_ptr->do_filter = PNG_FILTER_UP; break; + + case PNG_FILTER_VALUE_AVG: + png_ptr->do_filter = PNG_FILTER_AVG; break; + + case PNG_FILTER_VALUE_PAETH: + png_ptr->do_filter = PNG_FILTER_PAETH; break; + + default: + png_ptr->do_filter = (png_byte)filters; break; +#else + default: + png_warning(png_ptr, "Unknown row filter for method 0"); +#endif /* PNG_WRITE_FILTER_SUPPORTED */ + } + + /* If we have allocated the row_buf, this means we have already started + * with the image and we should have allocated all of the filter buffers + * that have been selected. If prev_row isn't already allocated, then + * it is too late to start using the filters that need it, since we + * will be missing the data in the previous row. If an application + * wants to start and stop using particular filters during compression, + * it should start out with all of the filters, and then add and + * remove them after the start of compression. + */ + if (png_ptr->row_buf != NULL) + { +#ifdef PNG_WRITE_FILTER_SUPPORTED + if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) + { + png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, + (png_ptr->rowbytes + 1)); + png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; + } + + if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) + { + if (png_ptr->prev_row == NULL) + { + png_warning(png_ptr, "Can't add Up filter after starting"); + png_ptr->do_filter = (png_byte)(png_ptr->do_filter & + ~PNG_FILTER_UP); + } + + else + { + png_ptr->up_row = (png_bytep)png_malloc(png_ptr, + (png_ptr->rowbytes + 1)); + png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; + } + } + + if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) + { + if (png_ptr->prev_row == NULL) + { + png_warning(png_ptr, "Can't add Average filter after starting"); + png_ptr->do_filter = (png_byte)(png_ptr->do_filter & + ~PNG_FILTER_AVG); + } + + else + { + png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, + (png_ptr->rowbytes + 1)); + png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; + } + } + + if ((png_ptr->do_filter & PNG_FILTER_PAETH) && + png_ptr->paeth_row == NULL) + { + if (png_ptr->prev_row == NULL) + { + png_warning(png_ptr, "Can't add Paeth filter after starting"); + png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); + } + + else + { + png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, + (png_ptr->rowbytes + 1)); + png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; + } + } + + if (png_ptr->do_filter == PNG_NO_FILTERS) +#endif /* PNG_WRITE_FILTER_SUPPORTED */ + png_ptr->do_filter = PNG_FILTER_NONE; + } + } + else + png_error(png_ptr, "Unknown custom filter method"); +} + +/* This allows us to influence the way in which libpng chooses the "best" + * filter for the current scanline. While the "minimum-sum-of-absolute- + * differences metric is relatively fast and effective, there is some + * question as to whether it can be improved upon by trying to keep the + * filtered data going to zlib more consistent, hopefully resulting in + * better compression. + */ +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */ +/* Conveneince reset API. */ +static void +png_reset_filter_heuristics(png_structp png_ptr) +{ + /* Clear out any old values in the 'weights' - this must be done because if + * the app calls set_filter_heuristics multiple times with different + * 'num_weights' values we would otherwise potentially have wrong sized + * arrays. + */ + png_ptr->num_prev_filters = 0; + png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; + if (png_ptr->prev_filters != NULL) + { + png_bytep old = png_ptr->prev_filters; + png_ptr->prev_filters = NULL; + png_free(png_ptr, old); + } + if (png_ptr->filter_weights != NULL) + { + png_uint_16p old = png_ptr->filter_weights; + png_ptr->filter_weights = NULL; + png_free(png_ptr, old); + } + + if (png_ptr->inv_filter_weights != NULL) + { + png_uint_16p old = png_ptr->inv_filter_weights; + png_ptr->inv_filter_weights = NULL; + png_free(png_ptr, old); + } + + /* Leave the filter_costs - this array is fixed size. */ +} + +static int +png_init_filter_heuristics(png_structp png_ptr, int heuristic_method, + int num_weights) +{ + if (png_ptr == NULL) + return 0; + + /* Clear out the arrays */ + png_reset_filter_heuristics(png_ptr); + + /* Check arguments; the 'reset' function makes the correct settings for the + * unweighted case, but we must handle the weight case by initializing the + * arrays for the caller. + */ + if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int i; + + if (num_weights > 0) + { + png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_byte) * num_weights)); + + /* To make sure that the weighting starts out fairly */ + for (i = 0; i < num_weights; i++) + { + png_ptr->prev_filters[i] = 255; + } + + png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); + + png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); + + for (i = 0; i < num_weights; i++) + { + png_ptr->inv_filter_weights[i] = + png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; + } + + /* Safe to set this now */ + png_ptr->num_prev_filters = (png_byte)num_weights; + } + + /* If, in the future, there are other filter methods, this would + * need to be based on png_ptr->filter. + */ + if (png_ptr->filter_costs == NULL) + { + png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); + + png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); + } + + for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) + { + png_ptr->inv_filter_costs[i] = + png_ptr->filter_costs[i] = PNG_COST_FACTOR; + } + + /* All the arrays are inited, safe to set this: */ + png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_WEIGHTED; + + /* Return the 'ok' code. */ + return 1; + } + else if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT || + heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) + { + return 1; + } + else + { + png_warning(png_ptr, "Unknown filter heuristic method"); + return 0; + } +} + +/* Provide floating and fixed point APIs */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, + int num_weights, png_const_doublep filter_weights, + png_const_doublep filter_costs) +{ + png_debug(1, "in png_set_filter_heuristics"); + + /* The internal API allocates all the arrays and ensures that the elements of + * those arrays are set to the default value. + */ + if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) + return; + + /* If using the weighted method copy in the weights. */ + if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int i; + for (i = 0; i < num_weights; i++) + { + if (filter_weights[i] <= 0.0) + { + png_ptr->inv_filter_weights[i] = + png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; + } + + else + { + png_ptr->inv_filter_weights[i] = + (png_uint_16)(PNG_WEIGHT_FACTOR*filter_weights[i]+.5); + + png_ptr->filter_weights[i] = + (png_uint_16)(PNG_WEIGHT_FACTOR/filter_weights[i]+.5); + } + } + + /* Here is where we set the relative costs of the different filters. We + * should take the desired compression level into account when setting + * the costs, so that Paeth, for instance, has a high relative cost at low + * compression levels, while it has a lower relative cost at higher + * compression settings. The filter types are in order of increasing + * relative cost, so it would be possible to do this with an algorithm. + */ + for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) if (filter_costs[i] >= 1.0) + { + png_ptr->inv_filter_costs[i] = + (png_uint_16)(PNG_COST_FACTOR / filter_costs[i] + .5); + + png_ptr->filter_costs[i] = + (png_uint_16)(PNG_COST_FACTOR * filter_costs[i] + .5); + } + } +} +#endif /* FLOATING_POINT */ + +#ifdef PNG_FIXED_POINT_SUPPORTED +void PNGAPI +png_set_filter_heuristics_fixed(png_structp png_ptr, int heuristic_method, + int num_weights, png_const_fixed_point_p filter_weights, + png_const_fixed_point_p filter_costs) +{ + png_debug(1, "in png_set_filter_heuristics_fixed"); + + /* The internal API allocates all the arrays and ensures that the elements of + * those arrays are set to the default value. + */ + if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) + return; + + /* If using the weighted method copy in the weights. */ + if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int i; + for (i = 0; i < num_weights; i++) + { + if (filter_weights[i] <= 0) + { + png_ptr->inv_filter_weights[i] = + png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; + } + + else + { + png_ptr->inv_filter_weights[i] = (png_uint_16) + ((PNG_WEIGHT_FACTOR*filter_weights[i]+PNG_FP_HALF)/PNG_FP_1); + + png_ptr->filter_weights[i] = (png_uint_16)((PNG_WEIGHT_FACTOR* + PNG_FP_1+(filter_weights[i]/2))/filter_weights[i]); + } + } + + /* Here is where we set the relative costs of the different filters. We + * should take the desired compression level into account when setting + * the costs, so that Paeth, for instance, has a high relative cost at low + * compression levels, while it has a lower relative cost at higher + * compression settings. The filter types are in order of increasing + * relative cost, so it would be possible to do this with an algorithm. + */ + for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) + if (filter_costs[i] >= PNG_FP_1) + { + png_uint_32 tmp; + + /* Use a 32 bit unsigned temporary here because otherwise the + * intermediate value will be a 32 bit *signed* integer (ANSI rules) + * and this will get the wrong answer on division. + */ + tmp = PNG_COST_FACTOR*PNG_FP_1 + (filter_costs[i]/2); + tmp /= filter_costs[i]; + + png_ptr->inv_filter_costs[i] = (png_uint_16)tmp; + + tmp = PNG_COST_FACTOR * filter_costs[i] + PNG_FP_HALF; + tmp /= PNG_FP_1; + + png_ptr->filter_costs[i] = (png_uint_16)tmp; + } + } +} +#endif /* FIXED_POINT */ +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +void PNGAPI +png_set_compression_level(png_structp png_ptr, int level) +{ + png_debug(1, "in png_set_compression_level"); + + if (png_ptr == NULL) + return; + + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; + png_ptr->zlib_level = level; +} + +void PNGAPI +png_set_compression_mem_level(png_structp png_ptr, int mem_level) +{ + png_debug(1, "in png_set_compression_mem_level"); + + if (png_ptr == NULL) + return; + + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; + png_ptr->zlib_mem_level = mem_level; +} + +void PNGAPI +png_set_compression_strategy(png_structp png_ptr, int strategy) +{ + png_debug(1, "in png_set_compression_strategy"); + + if (png_ptr == NULL) + return; + + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; + png_ptr->zlib_strategy = strategy; +} + +void PNGAPI +png_set_compression_window_bits(png_structp png_ptr, int window_bits) +{ + if (png_ptr == NULL) + return; + + if (window_bits > 15) + png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); + + else if (window_bits < 8) + png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); + +#ifndef WBITS_8_OK + /* Avoid libpng bug with 256-byte windows */ + if (window_bits == 8) + { + png_warning(png_ptr, "Compression window is being reset to 512"); + window_bits = 9; + } + +#endif + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; + png_ptr->zlib_window_bits = window_bits; +} + +void PNGAPI +png_set_compression_method(png_structp png_ptr, int method) +{ + png_debug(1, "in png_set_compression_method"); + + if (png_ptr == NULL) + return; + + if (method != 8) + png_warning(png_ptr, "Only compression method 8 is supported by PNG"); + + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; + png_ptr->zlib_method = method; +} + +void PNGAPI +png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) +{ + if (png_ptr == NULL) + return; + + png_ptr->write_row_fn = write_row_fn; +} + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED +void PNGAPI +png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr + write_user_transform_fn) +{ + png_debug(1, "in png_set_write_user_transform_fn"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_USER_TRANSFORM; + png_ptr->write_user_transform_fn = write_user_transform_fn; +} +#endif + + +#ifdef PNG_INFO_IMAGE_SUPPORTED +void PNGAPI +png_write_png(png_structp png_ptr, png_infop info_ptr, + int transforms, voidp params) +{ + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* Write the file header information. */ + png_write_info(png_ptr, info_ptr); + + /* ------ these transformations don't touch the info structure ------- */ + +#ifdef PNG_WRITE_INVERT_SUPPORTED + /* Invert monochrome pixels */ + if (transforms & PNG_TRANSFORM_INVERT_MONO) + png_set_invert_mono(png_ptr); +#endif + +#ifdef PNG_WRITE_SHIFT_SUPPORTED + /* Shift the pixels up to a legal bit depth and fill in + * as appropriate to correctly scale the image. + */ + if ((transforms & PNG_TRANSFORM_SHIFT) + && (info_ptr->valid & PNG_INFO_sBIT)) + png_set_shift(png_ptr, &info_ptr->sig_bit); +#endif + +#ifdef PNG_WRITE_PACK_SUPPORTED + /* Pack pixels into bytes */ + if (transforms & PNG_TRANSFORM_PACKING) + png_set_packing(png_ptr); +#endif + +#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED + /* Swap location of alpha bytes from ARGB to RGBA */ + if (transforms & PNG_TRANSFORM_SWAP_ALPHA) + png_set_swap_alpha(png_ptr); +#endif + +#ifdef PNG_WRITE_FILLER_SUPPORTED + /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */ + if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) + png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); + + else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) + png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); +#endif + +#ifdef PNG_WRITE_BGR_SUPPORTED + /* Flip BGR pixels to RGB */ + if (transforms & PNG_TRANSFORM_BGR) + png_set_bgr(png_ptr); +#endif + +#ifdef PNG_WRITE_SWAP_SUPPORTED + /* Swap bytes of 16-bit files to most significant byte first */ + if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) + png_set_swap(png_ptr); +#endif + +#ifdef PNG_WRITE_PACKSWAP_SUPPORTED + /* Swap bits of 1, 2, 4 bit packed pixel formats */ + if (transforms & PNG_TRANSFORM_PACKSWAP) + png_set_packswap(png_ptr); +#endif + +#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED + /* Invert the alpha channel from opacity to transparency */ + if (transforms & PNG_TRANSFORM_INVERT_ALPHA) + png_set_invert_alpha(png_ptr); +#endif + + /* ----------------------- end of transformations ------------------- */ + + /* Write the bits */ + if (info_ptr->valid & PNG_INFO_IDAT) + png_write_image(png_ptr, info_ptr->row_pointers); + + /* It is REQUIRED to call this to finish writing the rest of the file */ + png_write_end(png_ptr, info_ptr); + + PNG_UNUSED(transforms) /* Quiet compiler warnings */ + PNG_UNUSED(params) +} +#endif +#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngwtran.c b/src/3rdparty/libpng/pngwtran.c new file mode 100644 index 0000000000..115ca37212 --- /dev/null +++ b/src/3rdparty/libpng/pngwtran.c @@ -0,0 +1,631 @@ + +/* pngwtran.c - transforms the data in a row for PNG writers + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#include "pngpriv.h" + +#ifdef PNG_WRITE_SUPPORTED + +/* Transform the data according to the user's wishes. The order of + * transformations is significant. + */ +void /* PRIVATE */ +png_do_write_transformations(png_structp png_ptr) +{ + png_debug(1, "in png_do_write_transformations"); + + if (png_ptr == NULL) + return; + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED + if (png_ptr->transformations & PNG_USER_TRANSFORM) + if (png_ptr->write_user_transform_fn != NULL) + (*(png_ptr->write_user_transform_fn)) /* User write transform + function */ + (png_ptr, /* png_ptr */ + &(png_ptr->row_info), /* row_info: */ + /* png_uint_32 width; width of row */ + /* png_size_t rowbytes; number of bytes in row */ + /* png_byte color_type; color type of pixels */ + /* png_byte bit_depth; bit depth of samples */ + /* png_byte channels; number of channels (1-4) */ + /* png_byte pixel_depth; bits per pixel (depth*channels) */ + png_ptr->row_buf + 1); /* start of pixel data for row */ +#endif + +#ifdef PNG_WRITE_FILLER_SUPPORTED + if (png_ptr->transformations & PNG_FILLER) + png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->flags); +#endif + +#ifdef PNG_WRITE_PACKSWAP_SUPPORTED + if (png_ptr->transformations & PNG_PACKSWAP) + png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_WRITE_PACK_SUPPORTED + if (png_ptr->transformations & PNG_PACK) + png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1, + (png_uint_32)png_ptr->bit_depth); +#endif + +#ifdef PNG_WRITE_SWAP_SUPPORTED + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_WRITE_SHIFT_SUPPORTED + if (png_ptr->transformations & PNG_SHIFT) + png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->shift)); +#endif + +#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED + if (png_ptr->transformations & PNG_SWAP_ALPHA) + png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED + if (png_ptr->transformations & PNG_INVERT_ALPHA) + png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_WRITE_BGR_SUPPORTED + if (png_ptr->transformations & PNG_BGR) + png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#ifdef PNG_WRITE_INVERT_SUPPORTED + if (png_ptr->transformations & PNG_INVERT_MONO) + png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif +} + +#ifdef PNG_WRITE_PACK_SUPPORTED +/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The + * row_info bit depth should be 8 (one pixel per byte). The channels + * should be 1 (this only happens on grayscale and paletted images). + */ +void /* PRIVATE */ +png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) +{ + png_debug(1, "in png_do_pack"); + + if (row_info->bit_depth == 8 && + row_info->channels == 1) + { + switch ((int)bit_depth) + { + case 1: + { + png_bytep sp, dp; + int mask, v; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + sp = row; + dp = row; + mask = 0x80; + v = 0; + + for (i = 0; i < row_width; i++) + { + if (*sp != 0) + v |= mask; + + sp++; + + if (mask > 1) + mask >>= 1; + + else + { + mask = 0x80; + *dp = (png_byte)v; + dp++; + v = 0; + } + } + + if (mask != 0x80) + *dp = (png_byte)v; + + break; + } + + case 2: + { + png_bytep sp, dp; + int shift, v; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + sp = row; + dp = row; + shift = 6; + v = 0; + + for (i = 0; i < row_width; i++) + { + png_byte value; + + value = (png_byte)(*sp & 0x03); + v |= (value << shift); + + if (shift == 0) + { + shift = 6; + *dp = (png_byte)v; + dp++; + v = 0; + } + + else + shift -= 2; + + sp++; + } + + if (shift != 6) + *dp = (png_byte)v; + + break; + } + + case 4: + { + png_bytep sp, dp; + int shift, v; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + sp = row; + dp = row; + shift = 4; + v = 0; + + for (i = 0; i < row_width; i++) + { + png_byte value; + + value = (png_byte)(*sp & 0x0f); + v |= (value << shift); + + if (shift == 0) + { + shift = 4; + *dp = (png_byte)v; + dp++; + v = 0; + } + + else + shift -= 4; + + sp++; + } + + if (shift != 4) + *dp = (png_byte)v; + + break; + } + + default: + break; + } + + row_info->bit_depth = (png_byte)bit_depth; + row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, + row_info->width); + } +} +#endif + +#ifdef PNG_WRITE_SHIFT_SUPPORTED +/* Shift pixel values to take advantage of whole range. Pass the + * true number of bits in bit_depth. The row should be packed + * according to row_info->bit_depth. Thus, if you had a row of + * bit depth 4, but the pixels only had values from 0 to 7, you + * would pass 3 as bit_depth, and this routine would translate the + * data to 0 to 15. + */ +void /* PRIVATE */ +png_do_shift(png_row_infop row_info, png_bytep row, + png_const_color_8p bit_depth) +{ + png_debug(1, "in png_do_shift"); + + if (row_info->color_type != PNG_COLOR_TYPE_PALETTE) + { + int shift_start[4], shift_dec[4]; + int channels = 0; + + if (row_info->color_type & PNG_COLOR_MASK_COLOR) + { + shift_start[channels] = row_info->bit_depth - bit_depth->red; + shift_dec[channels] = bit_depth->red; + channels++; + + shift_start[channels] = row_info->bit_depth - bit_depth->green; + shift_dec[channels] = bit_depth->green; + channels++; + + shift_start[channels] = row_info->bit_depth - bit_depth->blue; + shift_dec[channels] = bit_depth->blue; + channels++; + } + + else + { + shift_start[channels] = row_info->bit_depth - bit_depth->gray; + shift_dec[channels] = bit_depth->gray; + channels++; + } + + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + { + shift_start[channels] = row_info->bit_depth - bit_depth->alpha; + shift_dec[channels] = bit_depth->alpha; + channels++; + } + + /* With low row depths, could only be grayscale, so one channel */ + if (row_info->bit_depth < 8) + { + png_bytep bp = row; + png_size_t i; + png_byte mask; + png_size_t row_bytes = row_info->rowbytes; + + if (bit_depth->gray == 1 && row_info->bit_depth == 2) + mask = 0x55; + + else if (row_info->bit_depth == 4 && bit_depth->gray == 3) + mask = 0x11; + + else + mask = 0xff; + + for (i = 0; i < row_bytes; i++, bp++) + { + png_uint_16 v; + int j; + + v = *bp; + *bp = 0; + + for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) + { + if (j > 0) + *bp |= (png_byte)((v << j) & 0xff); + + else + *bp |= (png_byte)((v >> (-j)) & mask); + } + } + } + + else if (row_info->bit_depth == 8) + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = channels * row_info->width; + + for (i = 0; i < istop; i++, bp++) + { + + png_uint_16 v; + int j; + int c = (int)(i%channels); + + v = *bp; + *bp = 0; + + for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) + { + if (j > 0) + *bp |= (png_byte)((v << j) & 0xff); + + else + *bp |= (png_byte)((v >> (-j)) & 0xff); + } + } + } + + else + { + png_bytep bp; + png_uint_32 i; + png_uint_32 istop = channels * row_info->width; + + for (bp = row, i = 0; i < istop; i++) + { + int c = (int)(i%channels); + png_uint_16 value, v; + int j; + + v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1)); + value = 0; + + for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) + { + if (j > 0) + value |= (png_uint_16)((v << j) & (png_uint_16)0xffff); + + else + value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff); + } + *bp++ = (png_byte)(value >> 8); + *bp++ = (png_byte)(value & 0xff); + } + } + } +} +#endif + +#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED +void /* PRIVATE */ +png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_write_swap_alpha"); + + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + if (row_info->bit_depth == 8) + { + /* This converts from ARGB to RGBA */ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + png_byte save = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = save; + } + } + +#ifdef PNG_WRITE_16BIT_SUPPORTED + else + { + /* This converts from AARRGGBB to RRGGBBAA */ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + png_byte save[2]; + save[0] = *(sp++); + save[1] = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = save[0]; + *(dp++) = save[1]; + } + } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ + } + + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (row_info->bit_depth == 8) + { + /* This converts from AG to GA */ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + png_byte save = *(sp++); + *(dp++) = *(sp++); + *(dp++) = save; + } + } + +#ifdef PNG_WRITE_16BIT_SUPPORTED + else + { + /* This converts from AAGG to GGAA */ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + png_byte save[2]; + save[0] = *(sp++); + save[1] = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = save[0]; + *(dp++) = save[1]; + } + } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ + } + } +} +#endif + +#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED +void /* PRIVATE */ +png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_write_invert_alpha"); + + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + if (row_info->bit_depth == 8) + { + /* This inverts the alpha channel in RGBA */ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + /* Does nothing + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + */ + sp+=3; dp = sp; + *(dp++) = (png_byte)(255 - *(sp++)); + } + } + +#ifdef PNG_WRITE_16BIT_SUPPORTED + else + { + /* This inverts the alpha channel in RRGGBBAA */ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + /* Does nothing + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + */ + sp+=6; dp = sp; + *(dp++) = (png_byte)(255 - *(sp++)); + *(dp++) = (png_byte)(255 - *(sp++)); + } + } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ + } + + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (row_info->bit_depth == 8) + { + /* This inverts the alpha channel in GA */ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + *(dp++) = *(sp++); + *(dp++) = (png_byte)(255 - *(sp++)); + } + } + +#ifdef PNG_WRITE_16BIT_SUPPORTED + else + { + /* This inverts the alpha channel in GGAA */ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + /* Does nothing + *(dp++) = *(sp++); + *(dp++) = *(sp++); + */ + sp+=2; dp = sp; + *(dp++) = (png_byte)(255 - *(sp++)); + *(dp++) = (png_byte)(255 - *(sp++)); + } + } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ + } + } +} +#endif + +#ifdef PNG_MNG_FEATURES_SUPPORTED +/* Undoes intrapixel differencing */ +void /* PRIVATE */ +png_do_write_intrapixel(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_write_intrapixel"); + + if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + int bytes_per_pixel; + png_uint_32 row_width = row_info->width; + if (row_info->bit_depth == 8) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 3; + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 4; + + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + *(rp) = (png_byte)((*rp - *(rp + 1)) & 0xff); + *(rp + 2) = (png_byte)((*(rp + 2) - *(rp + 1)) & 0xff); + } + } + +#ifdef PNG_WRITE_16BIT_SUPPORTED + else if (row_info->bit_depth == 16) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 6; + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 8; + + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1); + png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3); + png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5); + png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL); + png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL); + *(rp ) = (png_byte)((red >> 8) & 0xff); + *(rp + 1) = (png_byte)(red & 0xff); + *(rp + 4) = (png_byte)((blue >> 8) & 0xff); + *(rp + 5) = (png_byte)(blue & 0xff); + } + } +#endif /* PNG_WRITE_16BIT_SUPPORTED */ + } +} +#endif /* PNG_MNG_FEATURES_SUPPORTED */ +#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libpng/pngwutil.c b/src/3rdparty/libpng/pngwutil.c new file mode 100644 index 0000000000..2c35785aa1 --- /dev/null +++ b/src/3rdparty/libpng/pngwutil.c @@ -0,0 +1,2948 @@ + +/* pngwutil.c - utilities to write a PNG file + * + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#include "pngpriv.h" + +#ifdef PNG_WRITE_SUPPORTED + +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +/* Place a 32-bit number into a buffer in PNG byte order. We work + * with unsigned numbers for convenience, although one supported + * ancillary chunk uses signed (two's complement) numbers. + */ +void PNGAPI +png_save_uint_32(png_bytep buf, png_uint_32 i) +{ + buf[0] = (png_byte)((i >> 24) & 0xff); + buf[1] = (png_byte)((i >> 16) & 0xff); + buf[2] = (png_byte)((i >> 8) & 0xff); + buf[3] = (png_byte)(i & 0xff); +} + +#ifdef PNG_SAVE_INT_32_SUPPORTED +/* The png_save_int_32 function assumes integers are stored in two's + * complement format. If this isn't the case, then this routine needs to + * be modified to write data in two's complement format. Note that, + * the following works correctly even if png_int_32 has more than 32 bits + * (compare the more complex code required on read for sign extention.) + */ +void PNGAPI +png_save_int_32(png_bytep buf, png_int_32 i) +{ + buf[0] = (png_byte)((i >> 24) & 0xff); + buf[1] = (png_byte)((i >> 16) & 0xff); + buf[2] = (png_byte)((i >> 8) & 0xff); + buf[3] = (png_byte)(i & 0xff); +} +#endif + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +void PNGAPI +png_save_uint_16(png_bytep buf, unsigned int i) +{ + buf[0] = (png_byte)((i >> 8) & 0xff); + buf[1] = (png_byte)(i & 0xff); +} +#endif + +/* Simple function to write the signature. If we have already written + * the magic bytes of the signature, or more likely, the PNG stream is + * being embedded into another stream and doesn't need its own signature, + * we should call png_set_sig_bytes() to tell libpng how many of the + * bytes have already been written. + */ +void PNGAPI +png_write_sig(png_structp png_ptr) +{ + png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + +#ifdef PNG_IO_STATE_SUPPORTED + /* Inform the I/O callback that the signature is being written */ + png_ptr->io_state = PNG_IO_WRITING | PNG_IO_SIGNATURE; +#endif + + /* Write the rest of the 8 byte signature */ + png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], + (png_size_t)(8 - png_ptr->sig_bytes)); + + if (png_ptr->sig_bytes < 3) + png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; +} + +/* Write a PNG chunk all at once. The type is an array of ASCII characters + * representing the chunk name. The array must be at least 4 bytes in + * length, and does not need to be null terminated. To be safe, pass the + * pre-defined chunk names here, and if you need a new one, define it + * where the others are defined. The length is the length of the data. + * All the data must be present. If that is not possible, use the + * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end() + * functions instead. + */ +void PNGAPI +png_write_chunk(png_structp png_ptr, png_const_bytep chunk_name, + png_const_bytep data, png_size_t length) +{ + if (png_ptr == NULL) + return; + + png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length); + png_write_chunk_data(png_ptr, data, (png_size_t)length); + png_write_chunk_end(png_ptr); +} + +/* Write the start of a PNG chunk. The type is the chunk type. + * The total_length is the sum of the lengths of all the data you will be + * passing in png_write_chunk_data(). + */ +void PNGAPI +png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_name, + png_uint_32 length) +{ + png_byte buf[8]; + + png_debug2(0, "Writing %s chunk, length = %lu", chunk_name, + (unsigned long)length); + + if (png_ptr == NULL) + return; + +#ifdef PNG_IO_STATE_SUPPORTED + /* Inform the I/O callback that the chunk header is being written. + * PNG_IO_CHUNK_HDR requires a single I/O call. + */ + png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_HDR; +#endif + + /* Write the length and the chunk name */ + png_save_uint_32(buf, length); + png_memcpy(buf + 4, chunk_name, 4); + png_write_data(png_ptr, buf, (png_size_t)8); + + /* Put the chunk name into png_ptr->chunk_name */ + png_memcpy(png_ptr->chunk_name, chunk_name, 4); + + /* Reset the crc and run it over the chunk name */ + png_reset_crc(png_ptr); + + png_calculate_crc(png_ptr, chunk_name, 4); + +#ifdef PNG_IO_STATE_SUPPORTED + /* Inform the I/O callback that chunk data will (possibly) be written. + * PNG_IO_CHUNK_DATA does NOT require a specific number of I/O calls. + */ + png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_DATA; +#endif +} + +/* Write the data of a PNG chunk started with png_write_chunk_start(). + * Note that multiple calls to this function are allowed, and that the + * sum of the lengths from these calls *must* add up to the total_length + * given to png_write_chunk_start(). + */ +void PNGAPI +png_write_chunk_data(png_structp png_ptr, png_const_bytep data, + png_size_t length) +{ + /* Write the data, and run the CRC over it */ + if (png_ptr == NULL) + return; + + if (data != NULL && length > 0) + { + png_write_data(png_ptr, data, length); + + /* Update the CRC after writing the data, + * in case that the user I/O routine alters it. + */ + png_calculate_crc(png_ptr, data, length); + } +} + +/* Finish a chunk started with png_write_chunk_start(). */ +void PNGAPI +png_write_chunk_end(png_structp png_ptr) +{ + png_byte buf[4]; + + if (png_ptr == NULL) return; + +#ifdef PNG_IO_STATE_SUPPORTED + /* Inform the I/O callback that the chunk CRC is being written. + * PNG_IO_CHUNK_CRC requires a single I/O function call. + */ + png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_CRC; +#endif + + /* Write the crc in a single operation */ + png_save_uint_32(buf, png_ptr->crc); + + png_write_data(png_ptr, buf, (png_size_t)4); +} + +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_SUPPORTED) +/* This pair of functions encapsulates the operation of (a) compressing a + * text string, and (b) issuing it later as a series of chunk data writes. + * The compression_state structure is shared context for these functions + * set up by the caller in order to make the whole mess thread-safe. + */ + +typedef struct +{ + png_const_bytep input; /* The uncompressed input data */ + png_size_t input_len; /* Its length */ + int num_output_ptr; /* Number of output pointers used */ + int max_output_ptr; /* Size of output_ptr */ + png_bytep *output_ptr; /* Array of pointers to output */ +} compression_state; + +/* Compress given text into storage in the png_ptr structure */ +static int /* PRIVATE */ +png_text_compress(png_structp png_ptr, + png_const_charp text, png_size_t text_len, int compression, + compression_state *comp) +{ + int ret; + + comp->num_output_ptr = 0; + comp->max_output_ptr = 0; + comp->output_ptr = NULL; + comp->input = NULL; + comp->input_len = 0; + + /* We may just want to pass the text right through */ + if (compression == PNG_TEXT_COMPRESSION_NONE) + { + comp->input = (png_const_bytep)text; + comp->input_len = text_len; + return((int)text_len); + } + + if (compression >= PNG_TEXT_COMPRESSION_LAST) + { +#ifdef PNG_CONSOLE_IO_SUPPORTED + char msg[50]; + png_snprintf(msg, 50, "Unknown compression type %d", compression); + png_warning(png_ptr, msg); +#else + png_warning(png_ptr, "Unknown compression type"); +#endif + } + + /* We can't write the chunk until we find out how much data we have, + * which means we need to run the compressor first and save the + * output. This shouldn't be a problem, as the vast majority of + * comments should be reasonable, but we will set up an array of + * malloc'd pointers to be sure. + * + * If we knew the application was well behaved, we could simplify this + * greatly by assuming we can always malloc an output buffer large + * enough to hold the compressed text ((1001 * text_len / 1000) + 12) + * and malloc this directly. The only time this would be a bad idea is + * if we can't malloc more than 64K and we have 64K of random input + * data, or if the input string is incredibly large (although this + * wouldn't cause a failure, just a slowdown due to swapping). + */ + + /* Set up the compression buffers */ + /* TODO: the following cast hides a potential overflow problem. */ + png_ptr->zstream.avail_in = (uInt)text_len; + /* NOTE: assume zlib doesn't overwrite the input */ + png_ptr->zstream.next_in = (Bytef *)text; + png_ptr->zstream.avail_out = png_ptr->zbuf_size; + png_ptr->zstream.next_out = png_ptr->zbuf; + + /* This is the same compression loop as in png_write_row() */ + do + { + /* Compress the data */ + ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); + + if (ret != Z_OK) + { + /* Error */ + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + + else + png_error(png_ptr, "zlib error"); + } + + /* Check to see if we need more room */ + if (!(png_ptr->zstream.avail_out)) + { + /* Make sure the output array has room */ + if (comp->num_output_ptr >= comp->max_output_ptr) + { + int old_max; + + old_max = comp->max_output_ptr; + comp->max_output_ptr = comp->num_output_ptr + 4; + if (comp->output_ptr != NULL) + { + png_bytepp old_ptr; + + old_ptr = comp->output_ptr; + + comp->output_ptr = (png_bytepp)png_malloc(png_ptr, + (png_alloc_size_t) + (comp->max_output_ptr * png_sizeof(png_charpp))); + + png_memcpy(comp->output_ptr, old_ptr, old_max + * png_sizeof(png_charp)); + + png_free(png_ptr, old_ptr); + } + else + comp->output_ptr = (png_bytepp)png_malloc(png_ptr, + (png_alloc_size_t) + (comp->max_output_ptr * png_sizeof(png_charp))); + } + + /* Save the data */ + comp->output_ptr[comp->num_output_ptr] = + (png_bytep)png_malloc(png_ptr, + (png_alloc_size_t)png_ptr->zbuf_size); + + png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, + png_ptr->zbuf_size); + + comp->num_output_ptr++; + + /* and reset the buffer */ + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_out = png_ptr->zbuf; + } + /* Continue until we don't have any more to compress */ + } while (png_ptr->zstream.avail_in); + + /* Finish the compression */ + do + { + /* Tell zlib we are finished */ + ret = deflate(&png_ptr->zstream, Z_FINISH); + + if (ret == Z_OK) + { + /* Check to see if we need more room */ + if (!(png_ptr->zstream.avail_out)) + { + /* Check to make sure our output array has room */ + if (comp->num_output_ptr >= comp->max_output_ptr) + { + int old_max; + + old_max = comp->max_output_ptr; + comp->max_output_ptr = comp->num_output_ptr + 4; + if (comp->output_ptr != NULL) + { + png_bytepp old_ptr; + + old_ptr = comp->output_ptr; + + /* This could be optimized to realloc() */ + comp->output_ptr = (png_bytepp)png_malloc(png_ptr, + (png_alloc_size_t)(comp->max_output_ptr * + png_sizeof(png_charp))); + + png_memcpy(comp->output_ptr, old_ptr, + old_max * png_sizeof(png_charp)); + + png_free(png_ptr, old_ptr); + } + + else + comp->output_ptr = (png_bytepp)png_malloc(png_ptr, + (png_alloc_size_t)(comp->max_output_ptr * + png_sizeof(png_charp))); + } + + /* Save the data */ + comp->output_ptr[comp->num_output_ptr] = + (png_bytep)png_malloc(png_ptr, + (png_alloc_size_t)png_ptr->zbuf_size); + + png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, + png_ptr->zbuf_size); + + comp->num_output_ptr++; + + /* and reset the buffer pointers */ + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_out = png_ptr->zbuf; + } + } + else if (ret != Z_STREAM_END) + { + /* We got an error */ + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + + else + png_error(png_ptr, "zlib error"); + } + } while (ret != Z_STREAM_END); + + /* Text length is number of buffers plus last buffer */ + text_len = png_ptr->zbuf_size * comp->num_output_ptr; + + if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) + text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out; + + return((int)text_len); +} + +/* Ship the compressed text out via chunk writes */ +static void /* PRIVATE */ +png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) +{ + int i; + + /* Handle the no-compression case */ + if (comp->input) + { + png_write_chunk_data(png_ptr, comp->input, comp->input_len); + + return; + } + + /* Write saved output buffers, if any */ + for (i = 0; i < comp->num_output_ptr; i++) + { + png_write_chunk_data(png_ptr, comp->output_ptr[i], + (png_size_t)png_ptr->zbuf_size); + + png_free(png_ptr, comp->output_ptr[i]); + } + + if (comp->max_output_ptr != 0) + png_free(png_ptr, comp->output_ptr); + + /* Write anything left in zbuf */ + if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size) + png_write_chunk_data(png_ptr, png_ptr->zbuf, + (png_size_t)(png_ptr->zbuf_size - png_ptr->zstream.avail_out)); + + /* Reset zlib for another zTXt/iTXt or image data */ + deflateReset(&png_ptr->zstream); + png_ptr->zstream.data_type = Z_BINARY; +} +#endif + +/* Write the IHDR chunk, and update the png_struct with the necessary + * information. Note that the rest of this code depends upon this + * information being correct. + */ +void /* PRIVATE */ +png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, + int bit_depth, int color_type, int compression_type, int filter_type, + int interlace_type) +{ + PNG_IHDR; + int ret; + + png_byte buf[13]; /* Buffer to store the IHDR info */ + + png_debug(1, "in png_write_IHDR"); + + /* Check that we have valid input data from the application info */ + switch (color_type) + { + case PNG_COLOR_TYPE_GRAY: + switch (bit_depth) + { + case 1: + case 2: + case 4: + case 8: +#ifdef PNG_WRITE_16BIT_SUPPORTED + case 16: +#endif + png_ptr->channels = 1; break; + + default: + png_error(png_ptr, + "Invalid bit depth for grayscale image"); + } + break; + + case PNG_COLOR_TYPE_RGB: +#ifdef PNG_WRITE_16BIT_SUPPORTED + if (bit_depth != 8 && bit_depth != 16) +#else + if (bit_depth != 8) +#endif + png_error(png_ptr, "Invalid bit depth for RGB image"); + + png_ptr->channels = 3; + break; + + case PNG_COLOR_TYPE_PALETTE: + switch (bit_depth) + { + case 1: + case 2: + case 4: + case 8: + png_ptr->channels = 1; + break; + + default: + png_error(png_ptr, "Invalid bit depth for paletted image"); + } + break; + + case PNG_COLOR_TYPE_GRAY_ALPHA: + if (bit_depth != 8 && bit_depth != 16) + png_error(png_ptr, "Invalid bit depth for grayscale+alpha image"); + + png_ptr->channels = 2; + break; + + case PNG_COLOR_TYPE_RGB_ALPHA: +#ifdef PNG_WRITE_16BIT_SUPPORTED + if (bit_depth != 8 && bit_depth != 16) +#else + if (bit_depth != 8) +#endif + png_error(png_ptr, "Invalid bit depth for RGBA image"); + + png_ptr->channels = 4; + break; + + default: + png_error(png_ptr, "Invalid image color type specified"); + } + + if (compression_type != PNG_COMPRESSION_TYPE_BASE) + { + png_warning(png_ptr, "Invalid compression type specified"); + compression_type = PNG_COMPRESSION_TYPE_BASE; + } + + /* Write filter_method 64 (intrapixel differencing) only if + * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and + * 2. Libpng did not write a PNG signature (this filter_method is only + * used in PNG datastreams that are embedded in MNG datastreams) and + * 3. The application called png_permit_mng_features with a mask that + * included PNG_FLAG_MNG_FILTER_64 and + * 4. The filter_method is 64 and + * 5. The color_type is RGB or RGBA + */ + if ( +#ifdef PNG_MNG_FEATURES_SUPPORTED + !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && + (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) && + (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) && +#endif + filter_type != PNG_FILTER_TYPE_BASE) + { + png_warning(png_ptr, "Invalid filter type specified"); + filter_type = PNG_FILTER_TYPE_BASE; + } + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + if (interlace_type != PNG_INTERLACE_NONE && + interlace_type != PNG_INTERLACE_ADAM7) + { + png_warning(png_ptr, "Invalid interlace type specified"); + interlace_type = PNG_INTERLACE_ADAM7; + } +#else + interlace_type=PNG_INTERLACE_NONE; +#endif + + /* Save the relevent information */ + png_ptr->bit_depth = (png_byte)bit_depth; + png_ptr->color_type = (png_byte)color_type; + png_ptr->interlaced = (png_byte)interlace_type; +#ifdef PNG_MNG_FEATURES_SUPPORTED + png_ptr->filter_type = (png_byte)filter_type; +#endif + png_ptr->compression_type = (png_byte)compression_type; + png_ptr->width = width; + png_ptr->height = height; + + png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels); + png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); + /* Set the usr info, so any transformations can modify it */ + png_ptr->usr_width = png_ptr->width; + png_ptr->usr_bit_depth = png_ptr->bit_depth; + png_ptr->usr_channels = png_ptr->channels; + + /* Pack the header information into the buffer */ + png_save_uint_32(buf, width); + png_save_uint_32(buf + 4, height); + buf[8] = (png_byte)bit_depth; + buf[9] = (png_byte)color_type; + buf[10] = (png_byte)compression_type; + buf[11] = (png_byte)filter_type; + buf[12] = (png_byte)interlace_type; + + /* Write the chunk */ + png_write_chunk(png_ptr, png_IHDR, buf, (png_size_t)13); + + /* Initialize zlib with PNG info */ + png_ptr->zstream.zalloc = png_zalloc; + png_ptr->zstream.zfree = png_zfree; + png_ptr->zstream.opaque = (voidpf)png_ptr; + + if (!(png_ptr->do_filter)) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || + png_ptr->bit_depth < 8) + png_ptr->do_filter = PNG_FILTER_NONE; + + else + png_ptr->do_filter = PNG_ALL_FILTERS; + } + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY)) + { + if (png_ptr->do_filter != PNG_FILTER_NONE) + png_ptr->zlib_strategy = Z_FILTERED; + + else + png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY; + } + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL)) + png_ptr->zlib_level = Z_DEFAULT_COMPRESSION; + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL)) + png_ptr->zlib_mem_level = 8; + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS)) + png_ptr->zlib_window_bits = 15; + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD)) + png_ptr->zlib_method = 8; + + ret = deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, + png_ptr->zlib_method, png_ptr->zlib_window_bits, + png_ptr->zlib_mem_level, png_ptr->zlib_strategy); + + if (ret != Z_OK) + { + if (ret == Z_VERSION_ERROR) + png_error(png_ptr, + "zlib failed to initialize compressor -- version error"); + + if (ret == Z_STREAM_ERROR) + png_error(png_ptr, + "zlib failed to initialize compressor -- stream error"); + + if (ret == Z_MEM_ERROR) + png_error(png_ptr, + "zlib failed to initialize compressor -- mem error"); + + png_error(png_ptr, "zlib failed to initialize compressor"); + } + + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + /* libpng is not interested in zstream.data_type, so set it + * to a predefined value, to avoid its evaluation inside zlib + */ + png_ptr->zstream.data_type = Z_BINARY; + + png_ptr->mode = PNG_HAVE_IHDR; +} + +/* Write the palette. We are careful not to trust png_color to be in the + * correct order for PNG, so people can redefine it to any convenient + * structure. + */ +void /* PRIVATE */ +png_write_PLTE(png_structp png_ptr, png_const_colorp palette, + png_uint_32 num_pal) +{ + PNG_PLTE; + png_uint_32 i; + png_const_colorp pal_ptr; + png_byte buf[3]; + + png_debug(1, "in png_write_PLTE"); + + if (( +#ifdef PNG_MNG_FEATURES_SUPPORTED + !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && +#endif + num_pal == 0) || num_pal > 256) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_error(png_ptr, "Invalid number of colors in palette"); + } + + else + { + png_warning(png_ptr, "Invalid number of colors in palette"); + return; + } + } + + if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) + { + png_warning(png_ptr, + "Ignoring request to write a PLTE chunk in grayscale PNG"); + + return; + } + + png_ptr->num_palette = (png_uint_16)num_pal; + png_debug1(3, "num_palette = %d", png_ptr->num_palette); + + png_write_chunk_start(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3)); +#ifdef PNG_POINTER_INDEXING_SUPPORTED + + for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++) + { + buf[0] = pal_ptr->red; + buf[1] = pal_ptr->green; + buf[2] = pal_ptr->blue; + png_write_chunk_data(png_ptr, buf, (png_size_t)3); + } + +#else + /* This is a little slower but some buggy compilers need to do this + * instead + */ + pal_ptr=palette; + + for (i = 0; i < num_pal; i++) + { + buf[0] = pal_ptr[i].red; + buf[1] = pal_ptr[i].green; + buf[2] = pal_ptr[i].blue; + png_write_chunk_data(png_ptr, buf, (png_size_t)3); + } + +#endif + png_write_chunk_end(png_ptr); + png_ptr->mode |= PNG_HAVE_PLTE; +} + +/* Write an IDAT chunk */ +void /* PRIVATE */ +png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length) +{ + PNG_IDAT; + + png_debug(1, "in png_write_IDAT"); + + /* Optimize the CMF field in the zlib stream. */ + /* This hack of the zlib stream is compliant to the stream specification. */ + if (!(png_ptr->mode & PNG_HAVE_IDAT) && + png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) + { + unsigned int z_cmf = data[0]; /* zlib compression method and flags */ + if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70) + { + /* Avoid memory underflows and multiplication overflows. + * + * The conditions below are practically always satisfied; + * however, they still must be checked. + */ + if (length >= 2 && + png_ptr->height < 16384 && png_ptr->width < 16384) + { + png_uint_32 uncompressed_idat_size = png_ptr->height * + ((png_ptr->width * + png_ptr->channels * png_ptr->bit_depth + 15) >> 3); + unsigned int z_cinfo = z_cmf >> 4; + unsigned int half_z_window_size = 1 << (z_cinfo + 7); + while (uncompressed_idat_size <= half_z_window_size && + half_z_window_size >= 256) + { + z_cinfo--; + half_z_window_size >>= 1; + } + + z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4); + + if (data[0] != z_cmf) + { + int tmp; + data[0] = (png_byte)z_cmf; + tmp = data[1] & 0xe0; + tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f; + data[1] = (png_byte)tmp; + } + } + } + + else + png_error(png_ptr, + "Invalid zlib compression method or flags in IDAT"); + } + + png_write_chunk(png_ptr, png_IDAT, data, length); + png_ptr->mode |= PNG_HAVE_IDAT; +} + +/* Write an IEND chunk */ +void /* PRIVATE */ +png_write_IEND(png_structp png_ptr) +{ + PNG_IEND; + + png_debug(1, "in png_write_IEND"); + + png_write_chunk(png_ptr, png_IEND, NULL, (png_size_t)0); + png_ptr->mode |= PNG_HAVE_IEND; +} + +#ifdef PNG_WRITE_gAMA_SUPPORTED +/* Write a gAMA chunk */ +void /* PRIVATE */ +png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma) +{ + PNG_gAMA; + png_byte buf[4]; + + png_debug(1, "in png_write_gAMA"); + + /* file_gamma is saved in 1/100,000ths */ + png_save_uint_32(buf, (png_uint_32)file_gamma); + png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4); +} +#endif + +#ifdef PNG_WRITE_sRGB_SUPPORTED +/* Write a sRGB chunk */ +void /* PRIVATE */ +png_write_sRGB(png_structp png_ptr, int srgb_intent) +{ + PNG_sRGB; + png_byte buf[1]; + + png_debug(1, "in png_write_sRGB"); + + if (srgb_intent >= PNG_sRGB_INTENT_LAST) + png_warning(png_ptr, + "Invalid sRGB rendering intent specified"); + + buf[0]=(png_byte)srgb_intent; + png_write_chunk(png_ptr, png_sRGB, buf, (png_size_t)1); +} +#endif + +#ifdef PNG_WRITE_iCCP_SUPPORTED +/* Write an iCCP chunk */ +void /* PRIVATE */ +png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, + png_const_charp profile, int profile_len) +{ + PNG_iCCP; + png_size_t name_len; + png_charp new_name; + compression_state comp; + int embedded_profile_len = 0; + + png_debug(1, "in png_write_iCCP"); + + comp.num_output_ptr = 0; + comp.max_output_ptr = 0; + comp.output_ptr = NULL; + comp.input = NULL; + comp.input_len = 0; + + if ((name_len = png_check_keyword(png_ptr, name, &new_name)) == 0) + return; + + if (compression_type != PNG_COMPRESSION_TYPE_BASE) + png_warning(png_ptr, "Unknown compression type in iCCP chunk"); + + if (profile == NULL) + profile_len = 0; + + if (profile_len > 3) + embedded_profile_len = + ((*( (png_const_bytep)profile ))<<24) | + ((*( (png_const_bytep)profile + 1))<<16) | + ((*( (png_const_bytep)profile + 2))<< 8) | + ((*( (png_const_bytep)profile + 3)) ); + + if (embedded_profile_len < 0) + { + png_warning(png_ptr, + "Embedded profile length in iCCP chunk is negative"); + + png_free(png_ptr, new_name); + return; + } + + if (profile_len < embedded_profile_len) + { + png_warning(png_ptr, + "Embedded profile length too large in iCCP chunk"); + + png_free(png_ptr, new_name); + return; + } + + if (profile_len > embedded_profile_len) + { + png_warning(png_ptr, + "Truncating profile to actual length in iCCP chunk"); + + profile_len = embedded_profile_len; + } + + if (profile_len) + profile_len = png_text_compress(png_ptr, profile, + (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp); + + /* Make sure we include the NULL after the name and the compression type */ + png_write_chunk_start(png_ptr, png_iCCP, + (png_uint_32)(name_len + profile_len + 2)); + + new_name[name_len + 1] = 0x00; + + png_write_chunk_data(png_ptr, (png_bytep)new_name, + (png_size_t)(name_len + 2)); + + if (profile_len) + png_write_compressed_data_out(png_ptr, &comp); + + png_write_chunk_end(png_ptr); + png_free(png_ptr, new_name); +} +#endif + +#ifdef PNG_WRITE_sPLT_SUPPORTED +/* Write a sPLT chunk */ +void /* PRIVATE */ +png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette) +{ + PNG_sPLT; + png_size_t name_len; + png_charp new_name; + png_byte entrybuf[10]; + png_size_t entry_size = (spalette->depth == 8 ? 6 : 10); + png_size_t palette_size = entry_size * spalette->nentries; + png_sPLT_entryp ep; +#ifndef PNG_POINTER_INDEXING_SUPPORTED + int i; +#endif + + png_debug(1, "in png_write_sPLT"); + + if ((name_len = png_check_keyword(png_ptr,spalette->name, &new_name))==0) + return; + + /* Make sure we include the NULL after the name */ + png_write_chunk_start(png_ptr, png_sPLT, + (png_uint_32)(name_len + 2 + palette_size)); + + png_write_chunk_data(png_ptr, (png_bytep)new_name, + (png_size_t)(name_len + 1)); + + png_write_chunk_data(png_ptr, &spalette->depth, (png_size_t)1); + + /* Loop through each palette entry, writing appropriately */ +#ifdef PNG_POINTER_INDEXING_SUPPORTED + for (ep = spalette->entries; epentries + spalette->nentries; ep++) + { + if (spalette->depth == 8) + { + entrybuf[0] = (png_byte)ep->red; + entrybuf[1] = (png_byte)ep->green; + entrybuf[2] = (png_byte)ep->blue; + entrybuf[3] = (png_byte)ep->alpha; + png_save_uint_16(entrybuf + 4, ep->frequency); + } + + else + { + png_save_uint_16(entrybuf + 0, ep->red); + png_save_uint_16(entrybuf + 2, ep->green); + png_save_uint_16(entrybuf + 4, ep->blue); + png_save_uint_16(entrybuf + 6, ep->alpha); + png_save_uint_16(entrybuf + 8, ep->frequency); + } + + png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); + } +#else + ep=spalette->entries; + for (i = 0; i>spalette->nentries; i++) + { + if (spalette->depth == 8) + { + entrybuf[0] = (png_byte)ep[i].red; + entrybuf[1] = (png_byte)ep[i].green; + entrybuf[2] = (png_byte)ep[i].blue; + entrybuf[3] = (png_byte)ep[i].alpha; + png_save_uint_16(entrybuf + 4, ep[i].frequency); + } + + else + { + png_save_uint_16(entrybuf + 0, ep[i].red); + png_save_uint_16(entrybuf + 2, ep[i].green); + png_save_uint_16(entrybuf + 4, ep[i].blue); + png_save_uint_16(entrybuf + 6, ep[i].alpha); + png_save_uint_16(entrybuf + 8, ep[i].frequency); + } + + png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); + } +#endif + + png_write_chunk_end(png_ptr); + png_free(png_ptr, new_name); +} +#endif + +#ifdef PNG_WRITE_sBIT_SUPPORTED +/* Write the sBIT chunk */ +void /* PRIVATE */ +png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type) +{ + PNG_sBIT; + png_byte buf[4]; + png_size_t size; + + png_debug(1, "in png_write_sBIT"); + + /* Make sure we don't depend upon the order of PNG_COLOR_8 */ + if (color_type & PNG_COLOR_MASK_COLOR) + { + png_byte maxbits; + + maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 : + png_ptr->usr_bit_depth); + + if (sbit->red == 0 || sbit->red > maxbits || + sbit->green == 0 || sbit->green > maxbits || + sbit->blue == 0 || sbit->blue > maxbits) + { + png_warning(png_ptr, "Invalid sBIT depth specified"); + return; + } + + buf[0] = sbit->red; + buf[1] = sbit->green; + buf[2] = sbit->blue; + size = 3; + } + + else + { + if (sbit->gray == 0 || sbit->gray > png_ptr->usr_bit_depth) + { + png_warning(png_ptr, "Invalid sBIT depth specified"); + return; + } + + buf[0] = sbit->gray; + size = 1; + } + + if (color_type & PNG_COLOR_MASK_ALPHA) + { + if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth) + { + png_warning(png_ptr, "Invalid sBIT depth specified"); + return; + } + + buf[size++] = sbit->alpha; + } + + png_write_chunk(png_ptr, png_sBIT, buf, size); +} +#endif + +#ifdef PNG_WRITE_cHRM_SUPPORTED +/* Write the cHRM chunk */ +void /* PRIVATE */ +png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x, + png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y, + png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x, + png_fixed_point blue_y) +{ + PNG_cHRM; + png_byte buf[32]; + + png_debug(1, "in png_write_cHRM"); + + /* Each value is saved in 1/100,000ths */ +#ifdef PNG_CHECK_cHRM_SUPPORTED + if (png_check_cHRM_fixed(png_ptr, white_x, white_y, red_x, red_y, + green_x, green_y, blue_x, blue_y)) +#endif + { + png_save_uint_32(buf, (png_uint_32)white_x); + png_save_uint_32(buf + 4, (png_uint_32)white_y); + + png_save_uint_32(buf + 8, (png_uint_32)red_x); + png_save_uint_32(buf + 12, (png_uint_32)red_y); + + png_save_uint_32(buf + 16, (png_uint_32)green_x); + png_save_uint_32(buf + 20, (png_uint_32)green_y); + + png_save_uint_32(buf + 24, (png_uint_32)blue_x); + png_save_uint_32(buf + 28, (png_uint_32)blue_y); + + png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32); + } +} +#endif + +#ifdef PNG_WRITE_tRNS_SUPPORTED +/* Write the tRNS chunk */ +void /* PRIVATE */ +png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha, + png_const_color_16p tran, int num_trans, int color_type) +{ + PNG_tRNS; + png_byte buf[6]; + + png_debug(1, "in png_write_tRNS"); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette) + { + png_warning(png_ptr, "Invalid number of transparent colors specified"); + return; + } + + /* Write the chunk out as it is */ + png_write_chunk(png_ptr, png_tRNS, trans_alpha, (png_size_t)num_trans); + } + + else if (color_type == PNG_COLOR_TYPE_GRAY) + { + /* One 16 bit value */ + if (tran->gray >= (1 << png_ptr->bit_depth)) + { + png_warning(png_ptr, + "Ignoring attempt to write tRNS chunk out-of-range for bit_depth"); + + return; + } + + png_save_uint_16(buf, tran->gray); + png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)2); + } + + else if (color_type == PNG_COLOR_TYPE_RGB) + { + /* Three 16 bit values */ + png_save_uint_16(buf, tran->red); + png_save_uint_16(buf + 2, tran->green); + png_save_uint_16(buf + 4, tran->blue); +#ifdef PNG_WRITE_16BIT_SUPPORTED + if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) +#else + if (buf[0] | buf[2] | buf[4]) +#endif + { + png_warning(png_ptr, + "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); + return; + } + + png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)6); + } + + else + { + png_warning(png_ptr, "Can't write tRNS with an alpha channel"); + } +} +#endif + +#ifdef PNG_WRITE_bKGD_SUPPORTED +/* Write the background chunk */ +void /* PRIVATE */ +png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type) +{ + PNG_bKGD; + png_byte buf[6]; + + png_debug(1, "in png_write_bKGD"); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + if ( +#ifdef PNG_MNG_FEATURES_SUPPORTED + (png_ptr->num_palette || + (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) && +#endif + back->index >= png_ptr->num_palette) + { + png_warning(png_ptr, "Invalid background palette index"); + return; + } + + buf[0] = back->index; + png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)1); + } + + else if (color_type & PNG_COLOR_MASK_COLOR) + { + png_save_uint_16(buf, back->red); + png_save_uint_16(buf + 2, back->green); + png_save_uint_16(buf + 4, back->blue); +#ifdef PNG_WRITE_16BIT_SUPPORTED + if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) +#else + if (buf[0] | buf[2] | buf[4]) +#endif + { + png_warning(png_ptr, + "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); + + return; + } + + png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)6); + } + + else + { + if (back->gray >= (1 << png_ptr->bit_depth)) + { + png_warning(png_ptr, + "Ignoring attempt to write bKGD chunk out-of-range for bit_depth"); + + return; + } + + png_save_uint_16(buf, back->gray); + png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)2); + } +} +#endif + +#ifdef PNG_WRITE_hIST_SUPPORTED +/* Write the histogram */ +void /* PRIVATE */ +png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist) +{ + PNG_hIST; + int i; + png_byte buf[3]; + + png_debug(1, "in png_write_hIST"); + + if (num_hist > (int)png_ptr->num_palette) + { + png_debug2(3, "num_hist = %d, num_palette = %d", num_hist, + png_ptr->num_palette); + + png_warning(png_ptr, "Invalid number of histogram entries specified"); + return; + } + + png_write_chunk_start(png_ptr, png_hIST, (png_uint_32)(num_hist * 2)); + + for (i = 0; i < num_hist; i++) + { + png_save_uint_16(buf, hist[i]); + png_write_chunk_data(png_ptr, buf, (png_size_t)2); + } + + png_write_chunk_end(png_ptr); +} +#endif + +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ + defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) +/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification, + * and if invalid, correct the keyword rather than discarding the entire + * chunk. The PNG 1.0 specification requires keywords 1-79 characters in + * length, forbids leading or trailing whitespace, multiple internal spaces, + * and the non-break space (0x80) from ISO 8859-1. Returns keyword length. + * + * The new_key is allocated to hold the corrected keyword and must be freed + * by the calling routine. This avoids problems with trying to write to + * static keywords without having to have duplicate copies of the strings. + */ +png_size_t /* PRIVATE */ +png_check_keyword(png_structp png_ptr, png_const_charp key, png_charpp new_key) +{ + png_size_t key_len; + png_const_charp ikp; + png_charp kp, dp; + int kflag; + int kwarn=0; + + png_debug(1, "in png_check_keyword"); + + *new_key = NULL; + + if (key == NULL || (key_len = png_strlen(key)) == 0) + { + png_warning(png_ptr, "zero length keyword"); + return ((png_size_t)0); + } + + png_debug1(2, "Keyword to be checked is '%s'", key); + + *new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2)); + + if (*new_key == NULL) + { + png_warning(png_ptr, "Out of memory while procesing keyword"); + return ((png_size_t)0); + } + + /* Replace non-printing characters with a blank and print a warning */ + for (ikp = key, dp = *new_key; *ikp != '\0'; ikp++, dp++) + { + if ((png_byte)*ikp < 0x20 || + ((png_byte)*ikp > 0x7E && (png_byte)*ikp < 0xA1)) + { +#ifdef PNG_CONSOLE_IO_SUPPORTED + char msg[40]; + + png_snprintf(msg, 40, + "invalid keyword character 0x%02X", (png_byte)*ikp); + png_warning(png_ptr, msg); +#else + png_warning(png_ptr, "invalid character in keyword"); +#endif + *dp = ' '; + } + + else + { + *dp = *ikp; + } + } + *dp = '\0'; + + /* Remove any trailing white space. */ + kp = *new_key + key_len - 1; + if (*kp == ' ') + { + png_warning(png_ptr, "trailing spaces removed from keyword"); + + while (*kp == ' ') + { + *(kp--) = '\0'; + key_len--; + } + } + + /* Remove any leading white space. */ + kp = *new_key; + if (*kp == ' ') + { + png_warning(png_ptr, "leading spaces removed from keyword"); + + while (*kp == ' ') + { + kp++; + key_len--; + } + } + + png_debug1(2, "Checking for multiple internal spaces in '%s'", kp); + + /* Remove multiple internal spaces. */ + for (kflag = 0, dp = *new_key; *kp != '\0'; kp++) + { + if (*kp == ' ' && kflag == 0) + { + *(dp++) = *kp; + kflag = 1; + } + + else if (*kp == ' ') + { + key_len--; + kwarn = 1; + } + + else + { + *(dp++) = *kp; + kflag = 0; + } + } + *dp = '\0'; + if (kwarn) + png_warning(png_ptr, "extra interior spaces removed from keyword"); + + if (key_len == 0) + { + png_free(png_ptr, *new_key); + png_warning(png_ptr, "Zero length keyword"); + } + + if (key_len > 79) + { + png_warning(png_ptr, "keyword length must be 1 - 79 characters"); + (*new_key)[79] = '\0'; + key_len = 79; + } + + return (key_len); +} +#endif + +#ifdef PNG_WRITE_tEXt_SUPPORTED +/* Write a tEXt chunk */ +void /* PRIVATE */ +png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text, + png_size_t text_len) +{ + PNG_tEXt; + png_size_t key_len; + png_charp new_key; + + png_debug(1, "in png_write_tEXt"); + + if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0) + return; + + if (text == NULL || *text == '\0') + text_len = 0; + + else + text_len = png_strlen(text); + + /* Make sure we include the 0 after the key */ + png_write_chunk_start(png_ptr, png_tEXt, + (png_uint_32)(key_len + text_len + 1)); + /* + * We leave it to the application to meet PNG-1.0 requirements on the + * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of + * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. + * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. + */ + png_write_chunk_data(png_ptr, (png_bytep)new_key, + (png_size_t)(key_len + 1)); + + if (text_len) + png_write_chunk_data(png_ptr, (png_const_bytep)text, + (png_size_t)text_len); + + png_write_chunk_end(png_ptr); + png_free(png_ptr, new_key); +} +#endif + +#ifdef PNG_WRITE_zTXt_SUPPORTED +/* Write a compressed text chunk */ +void /* PRIVATE */ +png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text, + png_size_t text_len, int compression) +{ + PNG_zTXt; + png_size_t key_len; + png_byte buf; + png_charp new_key; + compression_state comp; + + png_debug(1, "in png_write_zTXt"); + + comp.num_output_ptr = 0; + comp.max_output_ptr = 0; + comp.output_ptr = NULL; + comp.input = NULL; + comp.input_len = 0; + + if ((key_len = png_check_keyword(png_ptr, key, &new_key)) == 0) + { + png_free(png_ptr, new_key); + return; + } + + if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE) + { + png_write_tEXt(png_ptr, new_key, text, (png_size_t)0); + png_free(png_ptr, new_key); + return; + } + + text_len = png_strlen(text); + + /* Compute the compressed data; do it now for the length */ + text_len = png_text_compress(png_ptr, text, text_len, compression, + &comp); + + /* Write start of chunk */ + png_write_chunk_start(png_ptr, png_zTXt, + (png_uint_32)(key_len+text_len + 2)); + + /* Write key */ + png_write_chunk_data(png_ptr, (png_bytep)new_key, + (png_size_t)(key_len + 1)); + + png_free(png_ptr, new_key); + + buf = (png_byte)compression; + + /* Write compression */ + png_write_chunk_data(png_ptr, &buf, (png_size_t)1); + + /* Write the compressed data */ + png_write_compressed_data_out(png_ptr, &comp); + + /* Close the chunk */ + png_write_chunk_end(png_ptr); +} +#endif + +#ifdef PNG_WRITE_iTXt_SUPPORTED +/* Write an iTXt chunk */ +void /* PRIVATE */ +png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, + png_const_charp lang, png_const_charp lang_key, png_const_charp text) +{ + PNG_iTXt; + png_size_t lang_len, key_len, lang_key_len, text_len; + png_charp new_lang; + png_charp new_key = NULL; + png_byte cbuf[2]; + compression_state comp; + + png_debug(1, "in png_write_iTXt"); + + comp.num_output_ptr = 0; + comp.max_output_ptr = 0; + comp.output_ptr = NULL; + comp.input = NULL; + + if ((key_len = png_check_keyword(png_ptr, key, &new_key)) == 0) + return; + + if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang)) == 0) + { + png_warning(png_ptr, "Empty language field in iTXt chunk"); + new_lang = NULL; + lang_len = 0; + } + + if (lang_key == NULL) + lang_key_len = 0; + + else + lang_key_len = png_strlen(lang_key); + + if (text == NULL) + text_len = 0; + + else + text_len = png_strlen(text); + + /* Compute the compressed data; do it now for the length */ + text_len = png_text_compress(png_ptr, text, text_len, compression - 2, + &comp); + + + /* Make sure we include the compression flag, the compression byte, + * and the NULs after the key, lang, and lang_key parts + */ + + png_write_chunk_start(png_ptr, png_iTXt, (png_uint_32)( + 5 /* comp byte, comp flag, terminators for key, lang and lang_key */ + + key_len + + lang_len + + lang_key_len + + text_len)); + + /* We leave it to the application to meet PNG-1.0 requirements on the + * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of + * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. + * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. + */ + png_write_chunk_data(png_ptr, (png_bytep)new_key, (png_size_t)(key_len + 1)); + + /* Set the compression flag */ + if (compression == PNG_ITXT_COMPRESSION_NONE || + compression == PNG_TEXT_COMPRESSION_NONE) + cbuf[0] = 0; + + else /* compression == PNG_ITXT_COMPRESSION_zTXt */ + cbuf[0] = 1; + + /* Set the compression method */ + cbuf[1] = 0; + + png_write_chunk_data(png_ptr, cbuf, (png_size_t)2); + + cbuf[0] = 0; + png_write_chunk_data(png_ptr, (new_lang ? (png_const_bytep)new_lang : cbuf), + (png_size_t)(lang_len + 1)); + + png_write_chunk_data(png_ptr, (lang_key ? (png_const_bytep)lang_key : cbuf), + (png_size_t)(lang_key_len + 1)); + + png_write_compressed_data_out(png_ptr, &comp); + + png_write_chunk_end(png_ptr); + + png_free(png_ptr, new_key); + png_free(png_ptr, new_lang); +} +#endif + +#ifdef PNG_WRITE_oFFs_SUPPORTED +/* Write the oFFs chunk */ +void /* PRIVATE */ +png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, + int unit_type) +{ + PNG_oFFs; + png_byte buf[9]; + + png_debug(1, "in png_write_oFFs"); + + if (unit_type >= PNG_OFFSET_LAST) + png_warning(png_ptr, "Unrecognized unit type for oFFs chunk"); + + png_save_int_32(buf, x_offset); + png_save_int_32(buf + 4, y_offset); + buf[8] = (png_byte)unit_type; + + png_write_chunk(png_ptr, png_oFFs, buf, (png_size_t)9); +} +#endif +#ifdef PNG_WRITE_pCAL_SUPPORTED +/* Write the pCAL chunk (described in the PNG extensions document) */ +void /* PRIVATE */ +png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, + png_int_32 X1, int type, int nparams, png_const_charp units, + png_charpp params) +{ + PNG_pCAL; + png_size_t purpose_len, units_len, total_len; + png_uint_32p params_len; + png_byte buf[10]; + png_charp new_purpose; + int i; + + png_debug1(1, "in png_write_pCAL (%d parameters)", nparams); + + if (type >= PNG_EQUATION_LAST) + png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); + + purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1; + png_debug1(3, "pCAL purpose length = %d", (int)purpose_len); + units_len = png_strlen(units) + (nparams == 0 ? 0 : 1); + png_debug1(3, "pCAL units length = %d", (int)units_len); + total_len = purpose_len + units_len + 10; + + params_len = (png_uint_32p)png_malloc(png_ptr, + (png_alloc_size_t)(nparams * png_sizeof(png_uint_32))); + + /* Find the length of each parameter, making sure we don't count the + * null terminator for the last parameter. + */ + for (i = 0; i < nparams; i++) + { + params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1); + png_debug2(3, "pCAL parameter %d length = %lu", i, + (unsigned long)params_len[i]); + total_len += (png_size_t)params_len[i]; + } + + png_debug1(3, "pCAL total length = %d", (int)total_len); + png_write_chunk_start(png_ptr, png_pCAL, (png_uint_32)total_len); + png_write_chunk_data(png_ptr, (png_const_bytep)new_purpose, + (png_size_t)purpose_len); + png_save_int_32(buf, X0); + png_save_int_32(buf + 4, X1); + buf[8] = (png_byte)type; + buf[9] = (png_byte)nparams; + png_write_chunk_data(png_ptr, buf, (png_size_t)10); + png_write_chunk_data(png_ptr, (png_const_bytep)units, (png_size_t)units_len); + + png_free(png_ptr, new_purpose); + + for (i = 0; i < nparams; i++) + { + png_write_chunk_data(png_ptr, (png_const_bytep)params[i], + (png_size_t)params_len[i]); + } + + png_free(png_ptr, params_len); + png_write_chunk_end(png_ptr); +} +#endif + +#ifdef PNG_WRITE_sCAL_SUPPORTED +/* Write the sCAL chunk */ +void /* PRIVATE */ +png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width, + png_const_charp height) +{ + PNG_sCAL; + png_byte buf[64]; + png_size_t wlen, hlen, total_len; + + png_debug(1, "in png_write_sCAL_s"); + + wlen = png_strlen(width); + hlen = png_strlen(height); + total_len = wlen + hlen + 2; + + if (total_len > 64) + { + png_warning(png_ptr, "Can't write sCAL (buffer too small)"); + return; + } + + buf[0] = (png_byte)unit; + png_memcpy(buf + 1, width, wlen + 1); /* Append the '\0' here */ + png_memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */ + + png_debug1(3, "sCAL total length = %u", (unsigned int)total_len); + png_write_chunk(png_ptr, png_sCAL, buf, total_len); +} +#endif + +#ifdef PNG_WRITE_pHYs_SUPPORTED +/* Write the pHYs chunk */ +void /* PRIVATE */ +png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit, + png_uint_32 y_pixels_per_unit, + int unit_type) +{ + PNG_pHYs; + png_byte buf[9]; + + png_debug(1, "in png_write_pHYs"); + + if (unit_type >= PNG_RESOLUTION_LAST) + png_warning(png_ptr, "Unrecognized unit type for pHYs chunk"); + + png_save_uint_32(buf, x_pixels_per_unit); + png_save_uint_32(buf + 4, y_pixels_per_unit); + buf[8] = (png_byte)unit_type; + + png_write_chunk(png_ptr, png_pHYs, buf, (png_size_t)9); +} +#endif + +#ifdef PNG_WRITE_tIME_SUPPORTED +/* Write the tIME chunk. Use either png_convert_from_struct_tm() + * or png_convert_from_time_t(), or fill in the structure yourself. + */ +void /* PRIVATE */ +png_write_tIME(png_structp png_ptr, png_const_timep mod_time) +{ + PNG_tIME; + png_byte buf[7]; + + png_debug(1, "in png_write_tIME"); + + if (mod_time->month > 12 || mod_time->month < 1 || + mod_time->day > 31 || mod_time->day < 1 || + mod_time->hour > 23 || mod_time->second > 60) + { + png_warning(png_ptr, "Invalid time specified for tIME chunk"); + return; + } + + png_save_uint_16(buf, mod_time->year); + buf[2] = mod_time->month; + buf[3] = mod_time->day; + buf[4] = mod_time->hour; + buf[5] = mod_time->minute; + buf[6] = mod_time->second; + + png_write_chunk(png_ptr, png_tIME, buf, (png_size_t)7); +} +#endif + +/* Initializes the row writing capability of libpng */ +void /* PRIVATE */ +png_write_start_row(png_structp png_ptr) +{ +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif + + png_size_t buf_size; + + png_debug(1, "in png_write_start_row"); + + buf_size = (png_size_t)(PNG_ROWBYTES( + png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1); + + /* Set up row buffer */ + png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, + (png_alloc_size_t)buf_size); + + png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; + +#ifdef PNG_WRITE_FILTER_SUPPORTED + /* Set up filtering buffer, if using this filter */ + if (png_ptr->do_filter & PNG_FILTER_SUB) + { + png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1); + + png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; + } + + /* We only need to keep the previous row if we are using one of these. */ + if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) + { + /* Set up previous row buffer */ + png_ptr->prev_row = (png_bytep)png_calloc(png_ptr, + (png_alloc_size_t)buf_size); + + if (png_ptr->do_filter & PNG_FILTER_UP) + { + png_ptr->up_row = (png_bytep)png_malloc(png_ptr, + png_ptr->rowbytes + 1); + + png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; + } + + if (png_ptr->do_filter & PNG_FILTER_AVG) + { + png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, + png_ptr->rowbytes + 1); + + png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; + } + + if (png_ptr->do_filter & PNG_FILTER_PAETH) + { + png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, + png_ptr->rowbytes + 1); + + png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; + } + } +#endif /* PNG_WRITE_FILTER_SUPPORTED */ + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* If interlaced, we need to set up width and height of pass */ + if (png_ptr->interlaced) + { + if (!(png_ptr->transformations & PNG_INTERLACE)) + { + png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - + png_pass_ystart[0]) / png_pass_yinc[0]; + + png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 - + png_pass_start[0]) / png_pass_inc[0]; + } + + else + { + png_ptr->num_rows = png_ptr->height; + png_ptr->usr_width = png_ptr->width; + } + } + + else +#endif + { + png_ptr->num_rows = png_ptr->height; + png_ptr->usr_width = png_ptr->width; + } + + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_out = png_ptr->zbuf; +} + +/* Internal use only. Called when finished processing a row of data. */ +void /* PRIVATE */ +png_write_finish_row(png_structp png_ptr) +{ +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif + + int ret; + + png_debug(1, "in png_write_finish_row"); + + /* Next row */ + png_ptr->row_number++; + + /* See if we are done */ + if (png_ptr->row_number < png_ptr->num_rows) + return; + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* If interlaced, go to next pass */ + if (png_ptr->interlaced) + { + png_ptr->row_number = 0; + if (png_ptr->transformations & PNG_INTERLACE) + { + png_ptr->pass++; + } + + else + { + /* Loop until we find a non-zero width or height pass */ + do + { + png_ptr->pass++; + + if (png_ptr->pass >= 7) + break; + + png_ptr->usr_width = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + + png_ptr->num_rows = (png_ptr->height + + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; + + if (png_ptr->transformations & PNG_INTERLACE) + break; + + } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0); + + } + + /* Reset the row above the image for the next pass */ + if (png_ptr->pass < 7) + { + if (png_ptr->prev_row != NULL) + png_memset(png_ptr->prev_row, 0, + (png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels* + png_ptr->usr_bit_depth, png_ptr->width)) + 1); + + return; + } + } +#endif + + /* If we get here, we've just written the last row, so we need + to flush the compressor */ + do + { + /* Tell the compressor we are done */ + ret = deflate(&png_ptr->zstream, Z_FINISH); + + /* Check for an error */ + if (ret == Z_OK) + { + /* Check to see if we need more room */ + if (!(png_ptr->zstream.avail_out)) + { + png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + } + + else if (ret != Z_STREAM_END) + { + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + + else + png_error(png_ptr, "zlib error"); + } + } while (ret != Z_STREAM_END); + + /* Write any extra space */ + if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) + { + png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - + png_ptr->zstream.avail_out); + } + + deflateReset(&png_ptr->zstream); + png_ptr->zstream.data_type = Z_BINARY; +} + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED +/* Pick out the correct pixels for the interlace pass. + * The basic idea here is to go through the row with a source + * pointer and a destination pointer (sp and dp), and copy the + * correct pixels for the pass. As the row gets compacted, + * sp will always be >= dp, so we should never overwrite anything. + * See the default: case for the easiest code to understand. + */ +void /* PRIVATE */ +png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) +{ + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + png_debug(1, "in png_do_write_interlace"); + + /* We don't have to do anything on the last pass (6) */ + if (pass < 6) + { + /* Each pixel depth is handled separately */ + switch (row_info->pixel_depth) + { + case 1: + { + png_bytep sp; + png_bytep dp; + int shift; + int d; + int value; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + dp = row; + d = 0; + shift = 7; + + for (i = png_pass_start[pass]; i < row_width; + i += png_pass_inc[pass]) + { + sp = row + (png_size_t)(i >> 3); + value = (int)(*sp >> (7 - (int)(i & 0x07))) & 0x01; + d |= (value << shift); + + if (shift == 0) + { + shift = 7; + *dp++ = (png_byte)d; + d = 0; + } + + else + shift--; + + } + if (shift != 7) + *dp = (png_byte)d; + + break; + } + + case 2: + { + png_bytep sp; + png_bytep dp; + int shift; + int d; + int value; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + dp = row; + shift = 6; + d = 0; + + for (i = png_pass_start[pass]; i < row_width; + i += png_pass_inc[pass]) + { + sp = row + (png_size_t)(i >> 2); + value = (*sp >> ((3 - (int)(i & 0x03)) << 1)) & 0x03; + d |= (value << shift); + + if (shift == 0) + { + shift = 6; + *dp++ = (png_byte)d; + d = 0; + } + + else + shift -= 2; + } + if (shift != 6) + *dp = (png_byte)d; + + break; + } + + case 4: + { + png_bytep sp; + png_bytep dp; + int shift; + int d; + int value; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + dp = row; + shift = 4; + d = 0; + for (i = png_pass_start[pass]; i < row_width; + i += png_pass_inc[pass]) + { + sp = row + (png_size_t)(i >> 1); + value = (*sp >> ((1 - (int)(i & 0x01)) << 2)) & 0x0f; + d |= (value << shift); + + if (shift == 0) + { + shift = 4; + *dp++ = (png_byte)d; + d = 0; + } + + else + shift -= 4; + } + if (shift != 4) + *dp = (png_byte)d; + + break; + } + + default: + { + png_bytep sp; + png_bytep dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + png_size_t pixel_bytes; + + /* Start at the beginning */ + dp = row; + + /* Find out how many bytes each pixel takes up */ + pixel_bytes = (row_info->pixel_depth >> 3); + + /* Loop through the row, only looking at the pixels that matter */ + for (i = png_pass_start[pass]; i < row_width; + i += png_pass_inc[pass]) + { + /* Find out where the original pixel is */ + sp = row + (png_size_t)i * pixel_bytes; + + /* Move the pixel */ + if (dp != sp) + png_memcpy(dp, sp, pixel_bytes); + + /* Next pixel */ + dp += pixel_bytes; + } + break; + } + } + /* Set new row width */ + row_info->width = (row_info->width + + png_pass_inc[pass] - 1 - + png_pass_start[pass]) / + png_pass_inc[pass]; + + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, + row_info->width); + } +} +#endif + +/* This filters the row, chooses which filter to use, if it has not already + * been specified by the application, and then writes the row out with the + * chosen filter. + */ +#define PNG_MAXSUM (((png_uint_32)(-1)) >> 1) +#define PNG_HISHIFT 10 +#define PNG_LOMASK ((png_uint_32)0xffffL) +#define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT)) +void /* PRIVATE */ +png_write_find_filter(png_structp png_ptr, png_row_infop row_info) +{ + png_bytep best_row; +#ifdef PNG_WRITE_FILTER_SUPPORTED + png_bytep prev_row, row_buf; + png_uint_32 mins, bpp; + png_byte filter_to_do = png_ptr->do_filter; + png_size_t row_bytes = row_info->rowbytes; +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + int num_p_filters = (int)png_ptr->num_prev_filters; +#endif + + png_debug(1, "in png_write_find_filter"); + +#ifndef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->row_number == 0 && filter_to_do == PNG_ALL_FILTERS) + { + /* These will never be selected so we need not test them. */ + filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH); + } +#endif + + /* Find out how many bytes offset each pixel is */ + bpp = (row_info->pixel_depth + 7) >> 3; + + prev_row = png_ptr->prev_row; +#endif + best_row = png_ptr->row_buf; +#ifdef PNG_WRITE_FILTER_SUPPORTED + row_buf = best_row; + mins = PNG_MAXSUM; + + /* The prediction method we use is to find which method provides the + * smallest value when summing the absolute values of the distances + * from zero, using anything >= 128 as negative numbers. This is known + * as the "minimum sum of absolute differences" heuristic. Other + * heuristics are the "weighted minimum sum of absolute differences" + * (experimental and can in theory improve compression), and the "zlib + * predictive" method (not implemented yet), which does test compressions + * of lines using different filter methods, and then chooses the + * (series of) filter(s) that give minimum compressed data size (VERY + * computationally expensive). + * + * GRR 980525: consider also + * + * (1) minimum sum of absolute differences from running average (i.e., + * keep running sum of non-absolute differences & count of bytes) + * [track dispersion, too? restart average if dispersion too large?] + * + * (1b) minimum sum of absolute differences from sliding average, probably + * with window size <= deflate window (usually 32K) + * + * (2) minimum sum of squared differences from zero or running average + * (i.e., ~ root-mean-square approach) + */ + + + /* We don't need to test the 'no filter' case if this is the only filter + * that has been chosen, as it doesn't actually do anything to the data. + */ + if ((filter_to_do & PNG_FILTER_NONE) && filter_to_do != PNG_FILTER_NONE) + { + png_bytep rp; + png_uint_32 sum = 0; + png_size_t i; + int v; + + for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) + { + v = *rp; + sum += (v < 128) ? v : 256 - v; + } + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + png_uint_32 sumhi, sumlo; + int j; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */ + + /* Reduce the sum if we match any of the previous rows */ + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) + { + sumlo = (sumlo * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + sumhi = (sumhi * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + /* Factor in the cost of this filter (this is here for completeness, + * but it makes no sense to have a "cost" for the NONE filter, as + * it has the minimum possible computational cost - none). + */ + sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> + PNG_COST_SHIFT; + + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + mins = sum; + } + + /* Sub filter */ + if (filter_to_do == PNG_FILTER_SUB) + /* It's the only filter so no testing is needed */ + { + png_bytep rp, lp, dp; + png_size_t i; + + for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; + i++, rp++, dp++) + { + *dp = *rp; + } + + for (lp = row_buf + 1; i < row_bytes; + i++, rp++, lp++, dp++) + { + *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); + } + + best_row = png_ptr->sub_row; + } + + else if (filter_to_do & PNG_FILTER_SUB) + { + png_bytep rp, dp, lp; + png_uint_32 sum = 0, lmins = mins; + png_size_t i; + int v; + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + /* We temporarily increase the "minimum sum" by the factor we + * would reduce the sum of this filter, so that we can do the + * early exit comparison without scaling the sum each time. + */ + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 lmhi, lmlo; + lmlo = lmins & PNG_LOMASK; + lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) + { + lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> + PNG_COST_SHIFT; + + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> + PNG_COST_SHIFT; + + if (lmhi > PNG_HIMASK) + lmins = PNG_MAXSUM; + + else + lmins = (lmhi << PNG_HISHIFT) + lmlo; + } +#endif + + for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; + i++, rp++, dp++) + { + v = *dp = *rp; + + sum += (v < 128) ? v : 256 - v; + } + + for (lp = row_buf + 1; i < row_bytes; + i++, rp++, lp++, dp++) + { + v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); + + sum += (v < 128) ? v : 256 - v; + + if (sum > lmins) /* We are already worse, don't continue. */ + break; + } + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 sumhi, sumlo; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) + { + sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> + PNG_COST_SHIFT; + + sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + + if (sum < mins) + { + mins = sum; + best_row = png_ptr->sub_row; + } + } + + /* Up filter */ + if (filter_to_do == PNG_FILTER_UP) + { + png_bytep rp, dp, pp; + png_size_t i; + + for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, + pp = prev_row + 1; i < row_bytes; + i++, rp++, pp++, dp++) + { + *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); + } + + best_row = png_ptr->up_row; + } + + else if (filter_to_do & PNG_FILTER_UP) + { + png_bytep rp, dp, pp; + png_uint_32 sum = 0, lmins = mins; + png_size_t i; + int v; + + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 lmhi, lmlo; + lmlo = lmins & PNG_LOMASK; + lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) + { + lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> + PNG_COST_SHIFT; + + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> + PNG_COST_SHIFT; + + if (lmhi > PNG_HIMASK) + lmins = PNG_MAXSUM; + + else + lmins = (lmhi << PNG_HISHIFT) + lmlo; + } +#endif + + for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, + pp = prev_row + 1; i < row_bytes; i++) + { + v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); + + sum += (v < 128) ? v : 256 - v; + + if (sum > lmins) /* We are already worse, don't continue. */ + break; + } + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 sumhi, sumlo; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) + { + sumlo = (sumlo * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + sumhi = (sumhi * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> + PNG_COST_SHIFT; + + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + + if (sum < mins) + { + mins = sum; + best_row = png_ptr->up_row; + } + } + + /* Avg filter */ + if (filter_to_do == PNG_FILTER_AVG) + { + png_bytep rp, dp, pp, lp; + png_uint_32 i; + + for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, + pp = prev_row + 1; i < bpp; i++) + { + *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); + } + + for (lp = row_buf + 1; i < row_bytes; i++) + { + *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) + & 0xff); + } + best_row = png_ptr->avg_row; + } + + else if (filter_to_do & PNG_FILTER_AVG) + { + png_bytep rp, dp, pp, lp; + png_uint_32 sum = 0, lmins = mins; + png_size_t i; + int v; + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 lmhi, lmlo; + lmlo = lmins & PNG_LOMASK; + lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG) + { + lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> + PNG_COST_SHIFT; + + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> + PNG_COST_SHIFT; + + if (lmhi > PNG_HIMASK) + lmins = PNG_MAXSUM; + + else + lmins = (lmhi << PNG_HISHIFT) + lmlo; + } +#endif + + for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, + pp = prev_row + 1; i < bpp; i++) + { + v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); + + sum += (v < 128) ? v : 256 - v; + } + + for (lp = row_buf + 1; i < row_bytes; i++) + { + v = *dp++ = + (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); + + sum += (v < 128) ? v : 256 - v; + + if (sum > lmins) /* We are already worse, don't continue. */ + break; + } + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 sumhi, sumlo; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) + { + sumlo = (sumlo * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + sumhi = (sumhi * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> + PNG_COST_SHIFT; + + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + + if (sum < mins) + { + mins = sum; + best_row = png_ptr->avg_row; + } + } + + /* Paeth filter */ + if (filter_to_do == PNG_FILTER_PAETH) + { + png_bytep rp, dp, pp, cp, lp; + png_size_t i; + + for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, + pp = prev_row + 1; i < bpp; i++) + { + *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); + } + + for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) + { + int a, b, c, pa, pb, pc, p; + + b = *pp++; + c = *cp++; + a = *lp++; + + p = b - c; + pc = a - c; + +#ifdef PNG_USE_ABS + pa = abs(p); + pb = abs(pc); + pc = abs(p + pc); +#else + pa = p < 0 ? -p : p; + pb = pc < 0 ? -pc : pc; + pc = (p + pc) < 0 ? -(p + pc) : p + pc; +#endif + + p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; + + *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); + } + best_row = png_ptr->paeth_row; + } + + else if (filter_to_do & PNG_FILTER_PAETH) + { + png_bytep rp, dp, pp, cp, lp; + png_uint_32 sum = 0, lmins = mins; + png_size_t i; + int v; + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 lmhi, lmlo; + lmlo = lmins & PNG_LOMASK; + lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) + { + lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> + PNG_COST_SHIFT; + + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> + PNG_COST_SHIFT; + + if (lmhi > PNG_HIMASK) + lmins = PNG_MAXSUM; + + else + lmins = (lmhi << PNG_HISHIFT) + lmlo; + } +#endif + + for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, + pp = prev_row + 1; i < bpp; i++) + { + v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); + + sum += (v < 128) ? v : 256 - v; + } + + for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) + { + int a, b, c, pa, pb, pc, p; + + b = *pp++; + c = *cp++; + a = *lp++; + +#ifndef PNG_SLOW_PAETH + p = b - c; + pc = a - c; +#ifdef PNG_USE_ABS + pa = abs(p); + pb = abs(pc); + pc = abs(p + pc); +#else + pa = p < 0 ? -p : p; + pb = pc < 0 ? -pc : pc; + pc = (p + pc) < 0 ? -(p + pc) : p + pc; +#endif + p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; +#else /* PNG_SLOW_PAETH */ + p = a + b - c; + pa = abs(p - a); + pb = abs(p - b); + pc = abs(p - c); + + if (pa <= pb && pa <= pc) + p = a; + + else if (pb <= pc) + p = b; + + else + p = c; +#endif /* PNG_SLOW_PAETH */ + + v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); + + sum += (v < 128) ? v : 256 - v; + + if (sum > lmins) /* We are already worse, don't continue. */ + break; + } + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 sumhi, sumlo; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) + { + sumlo = (sumlo * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + + sumhi = (sumhi * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> + PNG_COST_SHIFT; + + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + + if (sum < mins) + { + best_row = png_ptr->paeth_row; + } + } +#endif /* PNG_WRITE_FILTER_SUPPORTED */ + /* Do the actual writing of the filtered row data from the chosen filter. */ + + png_write_filtered_row(png_ptr, best_row); + +#ifdef PNG_WRITE_FILTER_SUPPORTED +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + /* Save the type of filter we picked this time for future calculations */ + if (png_ptr->num_prev_filters > 0) + { + int j; + + for (j = 1; j < num_p_filters; j++) + { + png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1]; + } + + png_ptr->prev_filters[j] = best_row[0]; + } +#endif +#endif /* PNG_WRITE_FILTER_SUPPORTED */ +} + + +/* Do the actual writing of a previously filtered row. */ +void /* PRIVATE */ +png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) +{ + png_size_t avail; + + png_debug(1, "in png_write_filtered_row"); + + png_debug1(2, "filter = %d", filtered_row[0]); + /* Set up the zlib input buffer */ + + png_ptr->zstream.next_in = filtered_row; + png_ptr->zstream.avail_in = 0; + avail = png_ptr->row_info.rowbytes + 1; + /* Repeat until we have compressed all the data */ + do + { + int ret; /* Return of zlib */ + + /* Record the number of bytes available - zlib supports at least 65535 + * bytes at one step, depending on the size of the zlib type 'uInt', the + * maximum size zlib can write at once is ZLIB_IO_MAX (from pngpriv.h). + * Use this because on 16 bit systems 'rowbytes' can be up to 65536 (i.e. + * one more than 16 bits) and, in this case 'rowbytes+1' can overflow a + * uInt. ZLIB_IO_MAX can be safely reduced to cause zlib to be called + * with smaller chunks of data. + */ + if (png_ptr->zstream.avail_in == 0) + { + if (avail > ZLIB_IO_MAX) + { + png_ptr->zstream.avail_in = ZLIB_IO_MAX; + avail -= ZLIB_IO_MAX; + } + + else + { + /* So this will fit in the available uInt space: */ + png_ptr->zstream.avail_in = (uInt)avail; + avail = 0; + } + } + + /* Compress the data */ + ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); + + /* Check for compression errors */ + if (ret != Z_OK) + { + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + + else + png_error(png_ptr, "zlib error"); + } + + /* See if it is time to write another IDAT */ + if (!(png_ptr->zstream.avail_out)) + { + /* Write the IDAT and reset the zlib output buffer */ + png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + /* Repeat until all data has been compressed */ + } while (avail > 0 || png_ptr->zstream.avail_in > 0); + + /* Swap the current and previous rows */ + if (png_ptr->prev_row != NULL) + { + png_bytep tptr; + + tptr = png_ptr->prev_row; + png_ptr->prev_row = png_ptr->row_buf; + png_ptr->row_buf = tptr; + } + + /* Finish row - updates counters and flushes zlib if last row */ + png_write_finish_row(png_ptr); + +#ifdef PNG_WRITE_FLUSH_SUPPORTED + png_ptr->flush_rows++; + + if (png_ptr->flush_dist > 0 && + png_ptr->flush_rows >= png_ptr->flush_dist) + { + png_write_flush(png_ptr); + } +#endif +} +#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/3rdparty/libtiff.pri b/src/3rdparty/libtiff.pri new file mode 100644 index 0000000000..e43e1feca2 --- /dev/null +++ b/src/3rdparty/libtiff.pri @@ -0,0 +1,43 @@ +INCLUDEPATH += $$PWD/libtiff/libtiff +SOURCES += \ + $$PWD/libtiff/libtiff/tif_aux.c \ + $$PWD/libtiff/libtiff/tif_close.c \ + $$PWD/libtiff/libtiff/tif_codec.c \ + $$PWD/libtiff/libtiff/tif_color.c \ + $$PWD/libtiff/libtiff/tif_compress.c \ + $$PWD/libtiff/libtiff/tif_dir.c \ + $$PWD/libtiff/libtiff/tif_dirinfo.c \ + $$PWD/libtiff/libtiff/tif_dirread.c \ + $$PWD/libtiff/libtiff/tif_dirwrite.c \ + $$PWD/libtiff/libtiff/tif_dumpmode.c \ + $$PWD/libtiff/libtiff/tif_error.c \ + $$PWD/libtiff/libtiff/tif_extension.c \ + $$PWD/libtiff/libtiff/tif_fax3.c \ + $$PWD/libtiff/libtiff/tif_fax3sm.c \ + $$PWD/libtiff/libtiff/tif_flush.c \ + $$PWD/libtiff/libtiff/tif_getimage.c \ + $$PWD/libtiff/libtiff/tif_luv.c \ + $$PWD/libtiff/libtiff/tif_lzw.c \ + $$PWD/libtiff/libtiff/tif_next.c \ + $$PWD/libtiff/libtiff/tif_open.c \ + $$PWD/libtiff/libtiff/tif_packbits.c \ + $$PWD/libtiff/libtiff/tif_pixarlog.c \ + $$PWD/libtiff/libtiff/tif_predict.c \ + $$PWD/libtiff/libtiff/tif_print.c \ + $$PWD/libtiff/libtiff/tif_read.c \ + $$PWD/libtiff/libtiff/tif_strip.c \ + $$PWD/libtiff/libtiff/tif_swab.c \ + $$PWD/libtiff/libtiff/tif_thunder.c \ + $$PWD/libtiff/libtiff/tif_tile.c \ + $$PWD/libtiff/libtiff/tif_version.c \ + $$PWD/libtiff/libtiff/tif_warning.c \ + $$PWD/libtiff/libtiff/tif_write.c \ + $$PWD/libtiff/libtiff/tif_zip.c + +wince*: SOURCES += $$PWD/../corelib/kernel/qfunctions_wince.cpp \ + $$PWD/libtiff/libtiff/tif_wince.c +win32: SOURCES += $$PWD/libtiff/libtiff/tif_win32.c +else: SOURCES += $$PWD/libtiff/libtiff/tif_unix.c +symbian: SOURCES += $$PWD/libtiff/port/lfind.c + +include($$PWD/zlib_dependency.pri) diff --git a/src/3rdparty/libtiff/COPYRIGHT b/src/3rdparty/libtiff/COPYRIGHT new file mode 100644 index 0000000000..8282186151 --- /dev/null +++ b/src/3rdparty/libtiff/COPYRIGHT @@ -0,0 +1,21 @@ +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. diff --git a/src/3rdparty/libtiff/ChangeLog b/src/3rdparty/libtiff/ChangeLog new file mode 100644 index 0000000000..20cb7538fd --- /dev/null +++ b/src/3rdparty/libtiff/ChangeLog @@ -0,0 +1,4426 @@ +2009-11-04 Bob Friesenhahn + + * libtiff 3.9.2 released. + +2009-11-03 Bob Friesenhahn + + * tools/tiffcrop.c: Updated tiffcrop from Richard Nolde. This + version has undergone substantial testing with arbitrary sample + bit depths. Also eliminates GCC compilation warnings. + +2009-11-02 Bob Friesenhahn + + * port/libport.h: Added header file for porting prototypes and + extern declarations. + +2009-10-31 Bob Friesenhahn + + * libtiff/tif_dirwrite.c (TIFFWriteAnyArray): Add missing break + statement so writing an array of TIFF_DOUBLE works. + +2009-10-29 Bob Friesenhahn + + * libtiff/tif_dirread.c: Eliminate GCC "dereferencing type-punned + pointer" warnings. + +2009-10-28 Bob Friesenhahn + + * html/tools.html: Add manual page links, and a summary + description of tiffcrop. + +2009-10-07 Bob Friesenhahn + + * configure.ac: x86_64 should use the same fill order as i386. + +2009-09-24 Bob Friesenhahn + + * tools/tiffcrop.c, man/tiffcrop.1: New tiffcrop from Richard + Nolde. Major updates to add significant functionality for reading + and writing tile based images with bit depths not a multiple of 8 + which cannot be handled by tiffcp. + +2009-09-03 Bob Friesenhahn + + * libtiff/tif_ojpeg.c (OJPEGWriteHeaderInfo): IJG JPEG 7 needs + do_fancy_upsampling=FALSE in order to read raw data. Resolves + "Bug 2090 - OJPEG crash with libjpeg v7". + http://bugzilla.maptools.org/show_bug.cgi?id=2090 + +2009-08-30 Bob Friesenhahn + + * contrib/iptcutil/iptcutil.c, + libtiff/tif_getimage.c,libtiff/tif_jpeg.c,libtiff/tif_ojpeg.c,tools/tiffcrop.c,tools/tiffgt.c: + Applied patch from Oden Eriksson to allow building with GCC using + the "-Wformat -Werror=format-security" flags. + +2009-08-28 Bob Friesenhahn + + * libtiff 3.9.1 released. + +2009-08-28 Frank Warmerdam + + * libtiff/tif_dirwrite.c: Back out changes from 2007-11-22 that + resulted in the final strip not being written in some circumstances. + http://bugzilla.maptools.org/show_bug.cgi?id=2088 + +2009-08-27 Bob Friesenhahn + + * libtiff/tif_write.c (TIFFAppendToStrip): Remove cast which + caused libtiff to output a wrong last strip with byte-count and + strip-offset of zero. This cast was added on the day of the 3.9.0 + release. + + * libtiff/tif_config.vc.h: tiffiop.h needs the TIFF_INT64_T and + TIFF_UINT64_T defines in order to compile. Copy existing + definitions from tiffconf.vc.h. + +2009-08-21 Bob Friesenhahn + + * test/Makefile.am (AUTOMAKE_OPTIONS): Colorized tests was not + actually activated since it needed to be enabled in this + Makefile.am. Also activated parallel-tests mode since it offers + useful features such as per-test .log files and a summary test + report .log file. + +2009-08-20 Bob Friesenhahn + + * libtiff 3.9.0 released. + + * libtiff/tif_print.c (TIFFPrintDirectory): Applied patch for "tag + error may cause segfault in tif_print.c." + http://bugzilla.maptools.org/show_bug.cgi?id=1896 + + * tools/{rgb2ycbcr.c, tiff2rgba.c}: Applied patch for + CVE-2009-2347 libtiff: integer overflows in various inter-color + space conversion tools. + http://bugzilla.maptools.org/show_bug.cgi?id=2079 + + * configure.ac: Updated autotools. Autoconf 2.64, Automake 1.11, + libtool 2.2.6. Enabled support for silent build rules + (--enable-silent-rules or 'make V=0') and colorized tests. + +2009-06-30 Frank Warmerdam + + * libtiff/tif_luv.c: correct return codes from encoderow to be + 1 on success instead of zero. + http://bugzilla.maptools.org/show_bug.cgi?id=2069 + +2009-06-22 Frank Warmerdam + + * libtiff/tif_lzw.c: Fix buffer underflow bug. + http://bugzilla.maptools.org/show_bug.cgi?id=2065 + +2009-06-03 Frank Warmerdam + + * libtiff/tif_write.c: do not override the planar configuration to be + contig for one sample files if planar configuration is already set. + http://bugzilla.maptools.org/show_bug.cgi?id=2057 + +2009-02-12 Frank Warmerdam + + * libtiff/tif_luv.c: Fix handling of tiled logluv images. + http://bugzilla.maptools.org/show_bug.cgi?id=2005 + +2009-01-23 Frank Warmerdam + + * libtiff/tif_predict.c: Add support for 32bit integer horz. predictors. + http://bugzilla.maptools.org/show_bug.cgi?id=1911 + +2009-01-20 Frank Warmerdam + + * tools/tiffsplit.c: fix sampleformat to be shortv instead of longv. + +2009-01-12 Bob Friesenhahn + + * tools/tiff2ps.c: Remove spurious message printed to stderr. + +2009-01-11 Bob Friesenhahn + + * tools/tiff2ps.c: Incorporated significant functionality update + from Richard Nolde. In particular, support for rotating the image + by 90, 180, 270, and 'auto' has been added. + + * tools/tiffcrop.c: Incorporated significant functionality update + from Richard Nolde. + +2009-01-06 Bob Friesenhahn + + * libtiff/tiffiop.h: Add private type declarations for int64, and + uint64 so that bundled utilities (like tiffcrop) can use it when + necessary. + +2009-01-01 Bob Friesenhahn + + * configure.ac: Updated to test for 64-bit types. This version of + the library does not require a 64-bit type, but tiffcrop needs it. + +2008-12-31 Bob Friesenhahn + + * Update to use current FSF autotools versions. + * libtiff/tiffio.h: GCC will now validate format specifications + for TIFFError(), TIFFErrorExt(), TIFFWarning(), and + TIFFWarningExt() in order to reveal bugs. Cleaned up resulting + warnings throughout for 32 bit build only. + +2008-12-31 Frank Warmerdam + + * tools/tiffcrop.c, man/tiffcrop.1: A major update from Richard + Nolde. + +2008-12-21 Frank Warmerdam + + * libtiff/tif_jpeg.c: Avoid errors if the application writes a full + strip for the last partial strip in a jpeg compressed file. + http://bugzilla.maptools.org/show_bug.cgi?id=1981 + +2008-12-21 Frank Warmerdam + + * libtiff/tif_getimage.c, tiffio.h: More ABI corrections. + Removed SubsamplingHor/Ver from TIFFRGBAImage structure. + http://bugzilla.maptools.org/show_bug.cgi?id=1980 + +2008-12-18 Frank Warmerdam + + * libtiff/tif_getimage.c,tiffio.h: removed all use of UaToAa and + Bitmap16to8 arrays in TIFFRGBAImage structure to restore ABI + compatability. These were just an attempt to speed up processing + with precalculated tables. + http://bugzilla.maptools.org/show_bug.cgi?id=1979 + + * libtiff/tif_codec.c: Avoid printing c->name if it does not exist. + +2008-10-21 Andrey Kiselev + + * libtiff/tif_jbig.c: Support the JBIG-KIT 2.0 (compatibility with + the older versions retained). + +2008-09-05 Andrey Kiselev + + * tools/tiffsplit.c: Use dynamically allocated array instead of static + when constructing output file names. + +2008-09-03 Andrey Kiselev + + * tools/tiffsplit.c: Get rid of unsafe strcpy()/strcat() calls when + doing the filename/path construction. + + * tools/tiff2pdf.c: More appropriate format string in + t2p_write_pdf_string(); avoid signed/unsigned mismatch. + + * libtiff/tif_lzw.c: Properly zero out the codetable. As per bug + + http://bugzilla.maptools.org/show_bug.cgi?id=1929 + + * libtiff/tif_lzw.c: Properly zero out the string table. Fixes + CVE-2008-2327 security issue. + +2008-05-24 Frank Warmerdam + + * tif_codec.c: Avoid NULL pointer dereferencing for exotic + compression codec codes. + + * tif_dirread.c: zero tif->tif_dir after freeing the directory + in TIFFReadCustomDirectory(). I don't exactly remember why this + was important. + + * tif_dirwrite.c: Fix potential memory leak writing large double + tags. + + * tif_dirread.c: Fix unchecked malloc result. + +2008-01-30 Andrey Kiselev + + * tif_fax3.c: Make find0span() and find1span() non-inline to + make MSVC 6.0 compiler happy. + +2007-11-26 Frank Warmerdam + + * tif_fax3.c: fix leak of FAXCS state (per bug 1603). + +2007-11-23 Andrey Kiselev + + * configure.com, libtiff/tif_vms.c: Better OpenVMS support. Patches + from Alexey Chupahin. + +2007-11-22 Frank Warmerdam + + * tif_write.c: Rip out the fancy logic in TIFFAppendToStrip() for + establishing if an existing tile can be rewritten to the same location + by comparing the current size to all the other blocks in the same + directory. This is dangerous in many situations and can easily + corrupt a file. (observed in esoteric GDAL situation that's hard to + document). This change involves leaving the stripbytecount[] values + unaltered till TIFFAppendToStrip(). Now we only write a block back + to the same location it used to be at if the new data is the same + size or smaller - otherwise we move it to the end of file. + + * tif_dirwrite.c: Try to avoid writing out a full readbuffer of tile + data when writing the directory just because we have BEENWRITING at + some point in the past. This was causing odd junk to be written out + in a tile of data when a single tile had an interleaving of reading + and writing with reading last. (highlighted by gdal + autotest/gcore/tif_write.py test 7. + + * tif_predict.c: use working buffer in PredictorEncodeTile to avoid + modifying callers buffer. + http://trac.osgeo.org/gdal/ticket/1965 + + * tif_predict.c/h, tif_lzw.c, tif_zip.c: Improvements so that + predictor based encoding and decoding works in read-write update + mode properly. + http://trac.osgeo.org/gdal/ticket/1948 + +2007-10-05 Frank Warmerdam + + * tools/tiff2pdf.c: Fixed setting of alpha value per report on list. + +2007-09-13 Frank Warmerdam + + * tif_dirinfo.c: _TIFFMergeFields() now only merges in field + definitions that are missing. Existing definitions are silently + ignored. (Bug #1585) + +2007-07-18 Andrey Kiselev + + * libtiff/{Makefile.am, Makefile.v}: Do not distribute tiffconf.h, + remove tif_config.h/tiffconf.h during cleaning. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1573 + +2007-07-13 Andrey Kiselev + + * libtiff 3.9.0beta released. + +2007-07-12 Andrey Kiselev + + * tools/tiff2pdf.c: Added missed extern optind as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1567 + +2007-07-03 Andrey Kiselev + + * tools/tiff2ps.c: Added support 16-bit images as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1566 + + Patch from William Bader. + + * tools/tiff2pdf.c: Fix for TIFFTAG_JPEGTABLES tag fetching and + significant upgrade of the whole utility as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1560 + + Now we don't need tiffiop.h in tiff2pdf anymore and will open output + PDF file using TIFFClientOpen() machinery as it is implemented + by Leon Bottou. + +2007-06-29 Bob Friesenhahn + + * libtiff/tif_dirinfo.c (_TIFFFindFieldInfo): Don't attempt to + bsearch() on a NULL fieldinfo list. + (_TIFFFindFieldInfoByName): Don't attempt to + lfind() on a NULL fieldinfo list. + +2007-05-01 Andrey Kiselev + + * libtiff/tif_dirwrite.c: Fixed problem introduced with a fix for a + byte swapping issue + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1363 + + As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1550 + +2007-04-27 Andrey Kiselev + + * tools/tiff2pdf.c: Check the tmpfile() return status as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=154 + +2007-04-07 Andrey Kiselev + + * libtiff/{tif_dir.h, tif_dirread.c, tif_dirinfo.c, tif_jpeg.c, + tif_fax3.c, tif_jbig.c, tif_luv.c, tif_ojpeg.c, tif_pixarlog.c, + tif_predict.c, tif_zip.c}: Finally fix bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1274 + + by introducing _TIFFMergeFieldInfo() returning integer error status + instead of void in case of problems with field merging (e.g., if the + field with such a tag already registered). TIFFMergeFieldInfo() in + public API remains void. Use _TIFFMergeFieldInfo() everywhere and + check returned value. + +2007-04-07 Frank Warmerdam + + * contrib/addtiffo/tif_overview.c: Fix problems with odd sized output + blocks in TIFF_DownSample_Subsampled() (bug 1542). + +2007-04-06 Frank Warmerdam + + * libtiff/tif_jpeg.c: Changed JPEGInitializeLibJPEG() so that it + will convert from decompressor to compressor or compress to decompress + if required by the force arguments. This works around a problem in + where the JPEGFixupTestSubsampling() may cause a decompressor to + be setup on a directory when later a compressor is required with the + force flag set. Occurs with the addtiffo program for instance. + +2007-04-06 Andrey Kiselev + + * libtiff/tif_dirwrite.c: Fixed swapping of byte arrays stored + in-place in tag offsets as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1363 + + * tools/tiffcrop.c, man/tiffcrop.1: Significant update in + functionality from Richard Nolde. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1525 + +2007-03-28 Frank Warmerdam + + * libtiff/tif_fax3.c: "inline static" -> "static inline" for IRIC CC. + +2007-03-07 Joris Van Damme + + * libtiff/tif_getimage.c: workaround for 'Fractional scanline' error reading + OJPEG images with rowsperstrip that is not a multiple of vertical subsampling + factor. This bug is mentioned in: + http://bugzilla.remotesensing.org/show_bug.cgi?id=1390 + http://www.asmail.be/msg0054766825.html + +2007-03-07 Joris Van Damme + + * libtiff/tif_win32.c: made inclusion of windows.h unconditional + + * libtiff/tif_win32.c: replaced preprocessor indication for consiously + unused arguments by standard C indication for the same + +2007-02-27 Andrey Kiselev + + * libtiff/tif_dirread.c: Use uint32 type instead of tsize_t in byte + counters in TIFFFetchData(). Should finally fix the issue + + http://bugzilla.remotesensing.org/show_bug.cgi?id=890 + +2007-02-24 Andrey Kiselev + + * tools/tiffset.c: Properly handle tags with TIFF_VARIABLE writecount. + As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1350 + + * libtiff/tif_dirread.c: Added special function to handle + SubjectDistance EXIF tag as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1362 + + * tools/tiff2pdf.c: Do not assume inches when the resolution units + do not specified. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1366 + + * tools/{tiffcp.c, tiffcrop.c}: Do not change RowsPerStrip value if + it was set as infinite. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1368 + + * tools/tiffcrop.c, man/tiffcrop.1: New tiffcrop utility contributed + by Richard Nolde. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1383 + +2007-02-22 Andrey Kiselev + + * libtiff/tif_dir.c: Workaround for incorrect TIFFs with + ExtraSamples == 999 produced by Corel Draw. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1490 + + * libtiff/{tif_dirread.c, tif_read.c}: Type of the byte counters + changed from tsize_t to uint32 to be able to work with data arrays + larger than 2GB. Fixes bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=890 + + Idea submitted by Matt Hancher. + +2007-01-31 Andrey Kiselev + + * tools/tif2rgba.c: This utility does not work properly on big-endian + architectures. It was fixed including the bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1149 + +2007-01-15 Mateusz Loskot + + * Submitted libtiff port for Windows CE platform + * libtiff/tif_config.wince.h: Added configuration header for WinCE. + * libtiff/tiffconf.wince.h: Ported old configuration header for WinCE. + * libtiff/tif_wince.c: Added WinCE-specific implementation of some + functons from tif_win32.c. + * libtiff/tif_win32.c: Disabled some functions already reimplemented in tif_wince.c. + * libtiff/tiffiop.h, port/lfind.c: Added conditional include of some + standard header files for Windows CE build. + * tools/tiffinfoce.c: Ported tiffinfo utility for Windows CE. + +2006-11-19 Frank Warmerdam + + * libtiff/tif_write.c: TIFFAppendToStrip() - clear sorted flag if + we move a strip. + http://bugzilla.remotesensing.org/show_bug.cgi?id=1359 + +2006-10-13 Andrey Kiselev + + * libtiff/tif_dir.c: More fixes for vulnerabilities, reported + in Gentoo bug (): + + http://bugs.gentoo.org/show_bug.cgi?id=142383 + + * libtiff/contrib/dbs/xtiff/xtiff.c: Make xtiff utility compilable. + Though it is still far from the state of being working and useful. + +2006-10-12 Andrey Kiselev + + * libtiff/tif_fax3.c: Save the state of printdir codec dependent + method. + + * libtiff/tif_jpeg.c: Save the state of printdir codec dependent method + as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1273 + + * libtiff/tif_win32.c: Fixed problem with offset value manipulation + as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1322 + + * libtiff/{tif_read.c, tif_jpeg.c, tif_dir.c}: More fixes for + vulnerabilities, reported in Gentoo bug (): + + http://bugs.gentoo.org/show_bug.cgi?id=142383 + +2006-09-28 Andrey Kiselev + + * libtiff/{tif_fax3.c, tif_next.c, tif_pixarlog.c}: Fixed multiple + vulnerabilities, as per Gentoo bug (): + + http://bugs.gentoo.org/show_bug.cgi?id=142383 + +2006-09-27 Frank Warmerdam + + * libtiff/tif_lzw.c, libtiff/tif_zip.c: Fixed problems with mixing + encoding and decoding on the same read-write TIFF handle. The LZW + code can now maintain encode and decode state at the same time. The + ZIP code will switch back and forth as needed. + http://bugzilla.remotesensing.org/show_bug.cgi?id=757 + +2006-09-20 Frank Warmerdam + + * libtiff: Rename config.h.vc and tif_config.h.vc to config.vc.h and + tif_config.vc.h for easier identification by folks using an IDE. + +2006-07-25 Frank Warmerdam + + * tif_msdos.c: Avoid handle leak for failed opens. c/o Thierry Pierron + +2006-07-19 Frank Warmerdam + + * tif_dirwrite.c: take care not to flush out buffer of strip/tile + data in _TIFFWriteDirectory if TIFF_BEENWRITING not set. Relates + to bug report by Peng Gao with black strip at bottom of images. + +2006-07-12 Frank Warmerdam + + * tif_dirwrite.c: make sure to use uint32 for wordcount in + TIFFWriteNormanTag if writecount is VARIABLE2 for ASCII fields. + It already seems to have been done for other field types. Needed + for "tiffset" on files with geotiff ascii text. + +2006-07-04 Bob Friesenhahn + + * {configure.ac, libtiff/tif_config.h.vc, libtiff/tif_jbig.c} + (JBIGDecode): jbg_newlen is not available in older JBIG-KIT and + its use does not appear to be required, so use it only when it is + available. + +2006-06-24 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Added missed EXIF tag ColorSpace (40961). + + * libtiff/tif_dirread.c: Move IFD fetching code in the separate + function TIFFFetchDirectory() avoiding code duplication in + TIFFReadDirectory() and TIFFReadCustomDirectory(). + +2006-06-19 Frank Warmerdam + + * tools/tiff2pdf.c: Fix handling of -q values. + http://bugzilla.remotesensing.org/show_bug.cgi?id=587 + +2006-06-17 Frank Warmerdam + + * tif_readdir.c: Added case in EstimateStripByteCounts() for tiled + files. Modified TIFFReadDirectory() to not invoke + EstimateStripByteCounts() for case where entry 0 and 1 are unequal + but one of them is zero. + http://bugzilla.remotesensing.org/show_bug.cgi?id=1204 + +2006-06-08 Andrey Kiselev + + * libtiff/{tif_open.c, tif_dirread.c, tiffiop.h}: Move IFD looping + checking code in the separate function TIFFCheckDirOffset(). + + * libtiff/tif_aux.c: Added _TIFFCheckRealloc() function. + + * tools/tiffcmp.c: Fixed floating point comparison logic as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1191 + + * libtiff/tif_fax3.c: Fixed problems in fax decoder as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1194 + + * tools/tiff2pdf.c: Fixed buffer overflow condition in + t2p_write_pdf_string() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1196 + +2006-06-07 Andrey Kiselev + + * {configure, configure.ac, libtiff/tif_jbig.c, tools/tiffcp.c}: Added + support for JBIG compression scheme (34661 code) contributed by Lee + Howard. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=896 + + * configure, configure.ac: OJPEG support enabled by default. + + * contrib/ojpeg/: Removed. New OJPEG support does not need this patch. + +2006-06-03 Bob Friesenhahn + + * libtiff/{tif_dirinfo.c, tif_print.c} : Fix crash in + TIFFPrintDirectory(). Joris Van Damme authored the fix. + +2006-04-21 Andrey Kiselev + + * tools/tiff2pdf.c: Unified line ending characters (always use '\n') + as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1163 + + * README.vms, Makefile.am, configure.com, libtiff/{Makefile.am, + tif_config.h-vms, tif_stream.cxx, tif_vms.c, tiffconf.h-vms}: + Added support for OpenVMS by Alexey Chupahin, elvis_75@mail.ru. + +2006-04-20 Andrey Kiselev + + * tools/{fax2ps.c, fax2tiff.c, ppm2tiff.c, ras2tiff.c, tiff2pdf.c}: + Properly set the binary mode for stdin stream as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1141 + + * man/{bmp2tiff.1, fax2ps.1, fax2tiff.1, gif2tiff.1, ras2tiff.1, + raw2tiff.1, rgb2ycbcr.1, sgi2tiff.1, tiff2bw.1, tiff2pdf.1, tiff2ps.1, + tiff2rgba.1, tiffcmp.1, tiffcp.1, tiffdither.1, tiffdump.1, tiffgt.1, + tiffset.1}: Improvements in page formatting as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1140 + + * html/tools.html, html/man/Makefile.am, tools/tiff2pdf.c: Fixed + typos as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1139 + +2006-04-18 Frank Warmerdam + + * nmake.opt: use /EHsc for VS2005 compatibility. Also define + _CRT_SECURE_NO_DEPRECATE to avoid noise on VS2005. + +2006-04-12 Joris Van Damme + + * libtiff/tif_getimage.c: Added support for planarconfig separate + non-subsampled YCbCr (i.e. separate YCbCr with subsampling [1,1]) + +2006-04-11 Joris Van Damme + + * libtiff/tif_getimage.c: Revision of all RGB(A) put routines + - Conversion of unassociated alpha to associated alpha now done with + more performant LUT, and calculation more correct + - Conversion of 16bit data to 8bit data now done with + more performant LUT, and calculation more correct + - Bugfix of handling of 16bit RGB with unassociated alpha + +2006-04-11 Joris Van Damme + + * libtiff/tif_getimage.c: + - When there is no alpha, gtTileSeparate and gtStripSeparate allocated + buffer for alpha strile and filled it, only to never read it back. + Removed allocation and fill. + - Minor rename of vars in gtTileSeparate and gtStripSeparate + anticipating planned functionality extension + +2006-04-08 Joris Van Damme + + * libtiff/tif_getimage.c: renamed pickTileContigCase to PickContigCase + and pickTileSeparateCase to PickSeparateCase as both work on strips as + well + + * libtiff/tif_getimage.c: moved img->get selection from + TIFFRGBAImageBegin into PickContigCase and PickSeparateCase to create + logical hook for planned functionality extension + +2006-04-08 Joris Van Damme + + * libtiff/tif_ojpeg.c: resolved memory leak that was a consequence + of inappropriate use of jpeg_abort instead of jpeg_destroy + +2006-04-07 Joris Van Damme + + * libtiff/tif_getimage.c: replaced usage of TIFFScanlineSize in + gtStripContig with TIFFNewScanlineSize so as to fix buggy behaviour + on subsampled images - this ought to get sorted when we feel brave + enough to replace TIFFScanlineSize alltogether + + * libtiff/tif_ojpeg.c: fixed bug in OJPEGReadSkip + +2006-04-04 Joris Van Damme + + * libtiff/tiffio.h: added new type tstrile_t + + * libtiff/tif_dir.h: changed types of td_stripsperimage and td_nstrips + to new tstrile_t, types of td_stripoffset and td_stripbytecount to + toff_t* + + * libtiff/tif_ojpeg.c: totally new implementation + + * libtiff/tif_dirread.c: added several hacks to suit new support of + OJPEG + + * libtiff/tif_getimage.c: removed TIFFTAG_JPEGCOLORMODE handling + of OJPEG images in favor of tif_getimage.c native handling of + YCbCr and desubsampling + +2006-03-29 Frank Warmerdam + + * libtiff/tif_jpeg.c: JPEGVSetField() so that altering the photometric + interpretation causes the "upsampled" flag to be recomputed. Fixes + peculiar bug where photometric flag had to be set before jpegcolormode + flag. + +2006-03-25 Joris Van Damme + + * libtiff/tif_jpeg.c: strip size related bugfix in encode raw + + * libtiff/tif_strip.c: temporarilly added two new versions of + TIFFScanlineSize + - TIFFNewScanlineSize: proposed new version, after all related + issues and side-effects are sorted out + - TIFFOldScanlineSize: old version, from prior to 2006-03-21 change + This needs further sorting out. + +2006-03-25 Joris Van Damme + + * contrib/addtiffo/tif_ovrcache.c: bugfix to correctly pass size + of last truncated strip data to TIFFWriteEncodedStrip + +2006-03-25 Joris Van Damme + + * libtiff/{tif_jpeg.c, tif_strip.c}: bugfix of tif_jpeg decode raw + +2006-03-25 Joris Van Damme + + * libtiff/tif_getimage.c: bugfix/rewrite of putcontig8bitYCbCr22tile + + * libtiff/tif_getimage.c: added putcontig8bitYCbCr12tile + + * libtiff/tif_read.c: added support for new TIFF_NOREADRAW flag to + prepare the path for new tif_ojpeg.c + +2006-03-23 Andrey Kiselev + + * libtiff 3.8.2 released. + + * tools/Makefile.am: Use runtime paths linker flags when rpath + option enabled. + +2006-03-21 Andrey Kiselev + + * libtiff/libtiff.def: Added missed exports as per bug + http://bugzilla.remotesensing.org/attachment.cgi?id=337 + + * contrib/addtiffo/Makefile.vc, libtiff/Makefile.vc, port/Makefile.vc, + tools/Makefile.vc: Makefiles improvements as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1128 + + * nmake.opt libtiff/{tif_config.h.vc, tif_unix.c, tiffio.h}, + tools/{fax2ps.c, fax2tiff.c, tiff2pdf.c}: Fixed win32 I/O functions + usage as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1127 + + * libtiff/tif_strip.c: Take subsampling in account when calculating + TIFFScanlineSize(). + + * tools/tiffcp.c: Do not set RowsPerStrip bigger than image length. + +2006-03-17 Andrey Kiselev + + * tools/fax2tiff.c: Fixed wrong TIFFerror() invocations as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1125 + + * tools/fax2ps.c: Fixed reading the input stream from stdin as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1124 + +2006-03-16 Andrey Kiselev + + * libtiff/tiffiop.h: Added decalration for + _TIFFSetDefaultCompressionState(). + + * libtiff/{tif_jpeg.c, tif_fax3.c, tif_zip.c, tif_pixarlog.c, + tif_lzw.c, tif_luv.c}: Use _TIFFSetDefaultCompressionState() in all + codec cleanup methods. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1120 + +2006-03-15 Andrey Kiselev + + * libtiff/tif_jpeg.c: Do not cleanup codec state in TIFFInitJPEG(). As + per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1119 + + * tools/raw2tiff.c: Do not set RowsPerStrip larger than ImageLength. + As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1110 + + * libtiff/tiffiop.h: dblparam_t typedef removed; GLOBALDATA macro + removed; move here the STRIP_SIZE_DEFAULT macro definition. + + * libtiff/{tif_dirread.c, tif_strip.c}: Removed STRIP_SIZE_DEFAULT + macro definition. + + * libtiff/tif_dir.c: Use double type instead of dblparam_t. + +2006-03-14 Andrey Kiselev + + * libtiff/tif_dirread.c: Do not check the PlanarConfig tag presence + in TIFFReadDirectory, because it is always set at the start of + function and we allow TIFFs without that tag set. + +2005-03-13 Andrey Kiselev + + * libtiff 3.8.1 released. + +2006-03-07 Andrey Kiselev + + * libtiff/tif_dirread.c: Fixed error reporting in TIFFFetchAnyArray() + function as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + + * libtiff/tif_dirread.c: More wise check for integer overflow + condition as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + + * libtiff/{tif_jpeg.c, tif_pixarlog.c, tif_fax3.c, tif_zip.c}: + Properly restore setfield/getfield methods in cleanup functions. As + per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + +2006-03-03 Andrey Kiselev + + * libtiff/{tif_predict.c, tif_predict.h}: Added new function + TIFFPredictorCleanup() to restore parent decode/encode/field methods. + + * libtiff/{tif_lzw.c, tif_pixarlog.c, tif_zip.c}: Use + TIFFPredictorCleanup() in codec cleanup methods. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + + * libtiff/tif_dirread.c: Fixed integer overflow condition in + TIFFFetchData() function. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + +2006-03-01 Andrey Kiselev + + * libtiff/tif_ojpeg.c: Set the ReferenceBlackWhite with the + TIFFSetField() method, not directly. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1043 + + * tools/ppm2tiff.c: Added support for PBM files as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1044 + +2006-02-27 Andrey Kiselev + + * libtiff/tif_write.c: Small code rearrangement in TIFFWriteScanline() + to avoid crash as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1081. + +2006-02-26 Andrey Kiselev + + * tools/tiff2pdf.c: Functions t2p_sample_rgbaa_to_rgb() and + t2p_sample_rgba_to_rgb() was used in place of each other, that was + resulted in problems with RGBA images with associated alpha. + As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1097 + +2006-02-23 Andrey Kiselev + + * libtiff/tif_dirwrite.c: Properly write TIFFTAG_DOTRANGE tag as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1088. + + * libtiff/tif_print.c: Properly read TIFFTAG_PAGENUMBER, + TIFFTAG_HALFTONEHINTS, TIFFTAG_YCBCRSUBSAMPLING and TIFFTAG_DOTRANGE + tags as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1088. + + * tools/tiff2ps.c: Properly scale all the pages when converting + multipage TIFF with /width/height/center options set. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1080 + +2006-02-15 Andrey Kiselev + + * tools/tiff2pdf.c: Do not create output file until all option checks + will be done. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1072 + + * tools/bmp2tiff.c: Added ability to create multipage TIFFs from the + list of input files as per bug: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1077 + +2006-02-09 Andrey Kiselev + + * libtiff/tif_tile.c: Fix error reporting in TIFFCheckTile() as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1063. + + * tools/tiffgt.c: Avoid crashing in case of image unsupported by + TIFFRGBAImage interface. + + * libtiff/tif_color.c: Avoid overflow in case of wrong input as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1065. + +2006-02-07 Frank Warmerdam + + * tools/tiff2pdf.c: Fixed support for non-YCbCr encoded JPEG + compressed TIFF files, per submission from Dan Cobra. + +2006-02-07 Andrey Kiselev + + * libtiff/{tif_dirread.c, tif_packbits.c, tif_win32.c}: Properly + cast values to avoid warnings. As per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. + + * libtiff/tif_dirinfo.c: Use TIFF_NOTYPE instead of 0 when + appropriate. As per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. + + * libtiff/tif_aux.c: Fixed type of temporary variable in + _TIFFCheckMalloc() as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. + +2006-02-06 Andrey Kiselev + + * libtiff/tif_aux.c: Return static array when fetching default + YCbCrCoefficients (another problem, reported a the + http://bugzilla.remotesensing.org/show_bug.cgi?id=1029 entry). + +2006-02-03 Andrey Kiselev + + * libtiff/tif_dir.c: Special handling for PageNumber, HalftoneHints, + YCbCrSubsampling and DotRange tags as per bugs + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1029 + http://bugzilla.remotesensing.org/show_bug.cgi?id=1034 + + * libtiff/tif_dirread.c: Use _TIFFGetExifFieldInfo() instead of + _TIFFGetFieldInfo() in TIFFReadEXIFDirectory() call as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1026. + +2006-01-23 Andrey Kiselev + + * libtool related stuff updated from the 2.1a branch. + +2006-01-11 Frank Warmerdam + + * tools/bmp2tiff,pal2rgb,ppm2tiff,ras2tiff,raw2tiff,sgi2tiff, + tiff2bw,tiffcp: Fixed jpeg option processing so -c jpeg:r:50 works + properly as per bug: + http://bugzilla.remotesensing.org/show_bug.cgi?id=1025 + +2006-01-09 Bob Friesenhahn + + * configure.ac: Fix with_default_strip_size comparison as reported + by Norihiko Murase. + +2006-01-08 Bob Friesenhahn + + * test/Makefile.am (LIBTIFF): Due to linking against libtiff + incorrectly, tests were not actually testing the uninstalled + libtiff. Now they are. + +2006-01-04 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Change definitions for TIFFTAG_ICCPROFILE, + TIFFTAG_PHOTOSHOP, TIFFTAG_RICHTIFFIPTC, TIFFTAG_XMLPACKET: readcount + should be uint32 value. + +2006-01-02 Bob Friesenhahn + + * html/man/Makefile.am (htmldoc): Fix htmldoc rule so that it can + be used if build directory is not the same as source directory. + * man/{TIFFGetField.3tiff, TIFFSetField.3tiff}: Documented + TIFFTAG_PHOTOSHOP, TIFFTAG_RICHTIFFIPTC, and TIFFTAG_XMLPACKET, + and re-sorted tag names in alphabetical order. + +2005-12-29 Andrey Kiselev + + * libtiff 3.8.0 released. + +2005-12-28 Bob Friesenhahn + + * tools/bmp2tiff.c (main): Fixed warning regarding returning + inconsistent types from a condition. + * tools/tiffcmp.c (CheckLongTag): Eliminate warning due to printf + format. + * tools/bmp2tiff.c: Reduce compilation warnings on big-endian CPUs. + +2005-12-28 Joris Van Damme + + * html/{index.html, support.hml, libtiff.html}: Cleaned up HTML + +2005-12-27 Andrey Kiselev + + * libtiff/tiffio.h: Added VC_EXTRALEAN definition before including + windows.h, to reduce the compile time. + +2005-12-26 Bob Friesenhahn + + * libtiff/tif_jpeg.c: Improve compilation under MinGW. + +2005-12-26 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_dir.h, tif_dirread.c, tif_dirinfo.c}: + tiffFieldInfo and exifFieldInfo arrays definitions moved back to + tif_dirinfo.c; added _TIFFGetFieldInfo() and _TIFFGetExifFieldInfo() + private functions to retrieve FieldInfo arrays. + +2005-12-24 Bob Friesenhahn + + * html/build.html: Added some additional instructions for when + building using MSVC under Windows. Also fixed two HTML syntax + errors and used HTML Tidy to tidy up the HTML syntax and + formatting. + +2005-12-24 Andrey Kiselev + + * libtiff/{tif_aux.c, tif_dir.c, tif_dir.h, tif_dirwrite.c, + tif_print.c, tif_getimage.c}: Make InkSet, NumberOfInks, DotRange and + StoNits tags custom. + +2005-12-23 Andrey Kiselev + + * libtiff/{tif_aux.c, tif_dir.c, tif_dir.h, tif_print.c}: Make + WhitePoint tag custom. + + * libtiff/{tif_dir.h, tiff.h}: More EXIF tags added. + +2005-12-23 Joris Van Damme + + * libtiff/tiffio.h: fixed typo that potentially resulted in + redefininition of USE_WIN32_FILEIO + + * libtiff/*: Added more 'dual-mode' error handling: Done TIFFWarning + calls in core LibTiff. + +2005-12-21 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_dir.h, tif_print.c}: Make RichTIFFIPTC, + Photoshop and ICCProfile tags custom. + +2005-12-21 Joris Van Damme + + * libtiff/*, contrib/*: Added 'dual-mode' error handling, enabling + newer code to get context indicator in error handler and still + remain compatible with older code: Done TIFFError calls everywhere + except in tools + +2005-12-20 Andrey Kiselev + + * tools/tiffcp.c: Added many error reporting messages; fixed integer + overflow as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=789 + +2005-12-16 Frank Warmerdam + + * contrib/addtiffo/*: Major upgrade by Joris to support subsampled + YCbCr images in jpeg compressed TIFF files. + +2005-12-14 Andrey Kiselev + + * tools/tiffcp.c: Return non-zero status when reading fails (again). + +2005-12-13 Andrey Kiselev + + * tools/tiffcp.c: Return non-zero status when reading fails. + +2005-12-12 Andrey Kiselev + + * libtiff/{tif_dir.h, tiff.h}: Added more EXIF tags. + +2005-12-09 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_dir.h, tif_print.c}: Make XMLPacket tag + custom. + + * tools/tiffinfo.c: Print EXIF directory contents if exist. + + * libtiff/tiff.h: Few EXIF tag numbers added. + + * libtiff/{tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c, + tiffio.h}: Preliminary support to read custom directories. New + functions: TIFFReadCustomDirectory() and TIFFReadEXIFDirectory(). + +2005-12-07 Andrey Kiselev + + * libtiff/{tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c}: + More work to implement custom directory read support. + + * libtiff/{tif_aux.c, tif_dirinfo.c, tif_dirread.c, tif_dir.h, + tif_dir.c, tif_print.c}: Make YCbCrCoefficients and ReferenceBlackWhite + tags custom. + +2005-12-05 Andrey Kiselev + + * libtiff/tif_dirread.c: One more workaround for broken + StripByteCounts tag. Handle the case when StripByteCounts array filled + with completely wrong values. + +2005-11-30 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Release file descriptor in case of failure + in the TIFFOpenW() function as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1003 + + * libtiff/tif_dirinfo.c: Correctly yse bsearch() and lfind() + functions as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1008 + +2005-11-20 Frank Warmerdam + + * tif_open.c, tiff.h, tiffdump.c: Incorporate preliminary support + for MS MDI format. + http://bugzilla.remotesensing.org/show_bug.cgi?id=1002 + + * .cvsignore: many files added, and a few update according + to suggestion of Brad HArds on tiff mailing list. + +2005-11-03 Frank Warmerdam + + * libtiff/libtiff.def, tiffiop.h, tiffio.h: Made TIFFFreeDirectory + public. + +2005-10-31 Andrey Kiselev + + * tools/fax2tiff.c: Properly calculate sizes of temporary arrays + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=943 + + * tools/fax2tiff.c: Added option '-r' to set RowsPerStrip parameter + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=944 + + * tools/tiffdump.c: Fixed typeshift and typemask arrays initialization + problem as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=946 + + * tools/bmp2tiff.c: Fixed possible integer overflow error as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=965 + + * libtiff/tif_dirinfo.c: Make XResolution, YResolution and + ResolutionUnit tags modifiable during write process. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=977 + + * tools/tiffsplit.c: Copy fax related fields over splitted parts + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=983 + +2005-10-21 Frank Warmerdam + + * tif_dirread.c: Don't try and split single strips into "0" strips + in ChopUpSingleUncompressedStrip. This happens in some degenerate + cases (like 1x1 files with stripbytecounts==0 (gtsmall.jp2 embed tiff) + +2005-10-20 Joris Van Damme + + * tif_fax3.c: changed 'at scanline ...' style warning/errors + with incorrect use of tif_row, to 'at line ... of + strip/tile ...' style + +2005-10-15 Frank Warmerdam + + * tif_write.c: fixed setting of planarconfig as per bug report + on the mailing list from Joris. + +2005-10-07 Andrey Kiselev + + * configure.ac, configure, nmake.opt, libtiff/{tif_config.h, + tif_dirread.c}: Make the default strip size configurable via the + --with-default-strip-size and STRIP_SIZE_DEFAULT options. + +2005-09-30 Bob Friesenhahn + + * html/support.html: Fixed link to documentation on Greg Ward's + LogLuv TIFF format. + +2005-09-28 Andrey Kiselev + + * tools/tiffdump.c: Fixed crash when reading malformed tags. + +2005-09-20 Andrey Kiselev + + * tools/tiff2pdf.c: Added missed 'break' statement as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=932 + +2005-09-12 Andrey Kiselev + + * libtiff 3.7.4 released. + + * {configure, configure.ac, Makefile.am, autogen.sh}: Applied patch + from Patrick Welche (all scripts moved in the 'config' and 'm4' + directories). + +2005-09-12 Frank Warmerdam + + * libtiff/tif_open.c: reintroduce seek to avoid problem on solaris. + +2005-09-05 Frank Warmerdam + + * libtiff/tif_dir.c: When prefreeing tv->value in TIFFSetFieldV + also set it to NULL to avoid double free when re-setting custom + string fields as per: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=922 + +2005-08-12 Frank Warmerdam + + * libtiff/tif_print.c: avoid signed/unsigned warning. + + * libtiff/tif_dirread.c: removed unused variable. + +2005-07-30 Frank Warmerdam + + * libtiff/tif_dir.c: Fixed up support for swapping "double complex" + values (128 bits as 2 64 bits doubles). GDAL gcore tests now + pass on bigendian (macosx) system. + +2005-07-28 Andrey Kiselev + + * libtiff/{tif_aux.c, tif_dirread.c, tif_fax3.c, tiffiop.h}: Rename + CheckMalloc() function to _TIFFCheckMalloc() and make it available + globally as an internal helper routine. + +2005-07-27 Andrey Kiselev + + * libtiff/tif_dir.c: More improvements in the "pass by value" part of + the custom tags handling code. + +2005-07-26 Andrey Kiselev + + * libtiff/{tif_dirread.c, tif_dirinfo.c}: Do not upcast BYTEs to + SHORTs in the TIFFFetchByteArray(). Remove TIFFFetchExtraSamples() + function, use TIFFFetchNormalTag() instead as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=831 + + Remove TIFFFetchExtraSamples() function, use TIFFFetchNormalTag() + instead. + + * libtiff/tiffconf.h.in: One more attempt to fix the AIX bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + +2005-07-25 Andrey Kiselev + + * libtiff/tif_print.c: Fixed printing of the BYTE and SBYTE arrays. + + * tools/tiffdump.c: Added support for TIFF_IFD datatype. + +2005-07-21 Andrey Kiselev + + * libtiff/tif_write.c: Do not check the PlanarConfiguration field in + the TIFFWriteCheck() function in case of single band images (as per + TIFF spec). + +2005-07-12 Andrey Kiselev + + * SConstruct, libtiff/SConstruct: Added the first very preliminary + support for SCons software building tool (http://www.scons.org/). + This is experimental infrastructure and it will exist along with the + autotools mechanics. + +2005-07-07 Andrey Kiselev + + * port/{getopt.c, strcasecmp.c, strtoul.c}: Update modules from + the NetBSD source tree (the old 4-clause BSD license changed to + the new 3-clause one). + + * configure.ac, port/lfind.c, libtiff/tiffiop.h: Added lfind() + replacement module. + + * port/dummy.c: Make the dummy function static. + +2005-07-06 Andrey Kiselev + + * tools/tiffcp.c: Fixed WhitePoint tag copying. + + * libtiff/{tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_print.c}: + Make FieldOfViewCotangent, MatrixWorldToScreen, MatrixWorldToCamera, + ImageFullWidth, ImageFullLength and PrimaryChromaticities tags custom. + +2005-07-04 Andrey Kiselev + + * libtiff 3.7.3 released. + + * configure, configure.ac: Do not use empty -R option when linking + with --enable-rpath. + +2005-07-01 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_open.c}: Added open option 'h' to avoid + reading the first IFD when needed. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=875 + + * libtiff/tif_color.c: Better use of TIFFmin() macro to avoid side + effects. + +2005-06-23 Andrey Kiselev + + * tools/tiff2pdf.c: Print two characters per loop in the + t2p_write_pdf_trailer(). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=594 + + * tools/tiffgt.c: Use MacOS X OpenGL framework when appropriate. As + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=844 + + * acinclude.m4: Updated to latest OpenGL test macros versions. + + * libtiff/tiff.h: Use correct int size on Sparc 64bit/Sun compiler + platform. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=855 + +2005-06-14 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Added support for ClipPath, XClipPathUnits + and YClipPathUnits tags. + +2005-06-07 Andrey Kiselev + + * contrib/addtiffo/tif_ovrcache.c: Properly extract tile/strip size; + use pixel sized shift in contigous case. + +2005-06-06 Andrey Kiselev + + * contrib/addtiffo/{tif_overview.c, tif_ovrcache.c, tif_ovrcache.h}: + Make overviews working for contiguos images. + +2005-06-03 Andrey Kiselev + + * libtiff/tif_open.c: Replace runtime endianess check with the compile + time one. + + * libtiff/tif_predict.c: Floating point predictor now works on + big-endian hosts. + +2005-06-01 Andrey Kiselev + + * libtiff/tif_dir.c: Use _TIFFsetString() function when read custom + ASCII values. + + * libtiff/{tif_dirinfo.c, tif_dir.h, tif_dir.c, tif_print.c}: Make + DocumentName, Artist, HostComputer, ImageDescription, Make, Model, + Copyright, DateTime, PageName, TextureFormat, TextureWrapModes and + TargetPrinter tags custom. + + * libtiff/tif_jpeg.c: Cleanup the codec state depending on + TIFF_CODERSETUP flag (to fix memry leaks). + + * libtiff/tif_jpeg.c: Initialize JPEGTables array with zero after + allocating. + +2005-05-26 Andrey Kiselev + + * configure.ac, libtiff/Makefile.am: Added workaround for + OpenBSD/MirOS soname problem as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=838 + + * libtiff/tif_dirwrite.c: Use tdir_count when calling + TIFFCvtNativeToIEEEDouble() in the TIFFWriteDoubleArray() function as + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=845 + +2005-05-25 Andrey Kiselev + + * tools/ppm2tiff.c: Fixed format string when read PPM file header with + the fscanf() function. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=861 + + * libtiff/{tif_dirinfo.c, tif_print.c}: TIFFFetchByteArray() returns + uint16 array when fetching the BYTE and SBYTE filds, so we should + consider result as pointer to uint16 array and not as array of chars. + As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=831 + + * libtiff/tif_dir.c: More efficient custom tags retrieval as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=830 + + * libtiff/tif_win32.c: Use FILE_SHARE_READ | FILE_SHARE_WRITE share + mode in CreateFile() call as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=829 + + * libtiff/Makefile.am: Fixed parallel compilation of the libtiff and + libtiffxx libraries as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=826 + + * contrib/addtiffo/{tif_overview.c, tif_ovrcache.h}: Sinchronized with + GDAL. + +2005-05-23 Frank Warmerdam + + * libtiff/tif_jpeg.c: Substantial fix for addtiffo problems with + JPEG encoded TIFF files. Pre-allocate lots of space for jpegtables + in directory. + +2005-05-22 Frank Warmerdam + + * libtiff/tif_dirread.c: Changed the code that computes + stripbytecount[0] if it appears bogus to ignore if stripoffset[0] is + zero. This is a common case with GDAL indicating a "null" tile/strip. + +2005-05-17 Andrey Kiselev + + * tools/tiffsplit.c: Check for JPEGTables tag presence before copying. + +2005-05-06 Frank Warmerdam + + * libtiff/tif_dirread.c: Applied similar change to + TIFFFetchPerSampleLongs and TIFFFetchPerSampleAnys. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=843 + + * libtiff/tif_jpeg.c: added LIB_JPEG_MK1 support in JPEGDecodeRaw(). + +2005-05-06 Andrey Kiselev + * tools/tiff2pdfr.c, man/tiff2pdf.1: Calculate the tile width properly; + added new option '-b' to use interpolation in output PDF files (Bruno + Ledoux). + +2005-05-05 Frank Warmerdam + + * libtiff/tif_dirread.c: Ensure that broken files with too many + values in PerSampleShorts work ok instead of crashing. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=843 + +2005-04-27 Andrey Kiselev + + * tools/tiffdither.c: Copy the PhotometricInterpretation tag from the + input file. + +2005-04-15 Andrey Kiselev + + * libtiff/tif_predict.c: Added ability to encode floating point + predictor, as per TIFF Technical Note 3. + +2005-04-14 Andrey Kiselev + + * libtiff/{tif_predict.h, tif_predict.c}: Added ability to decode + floating point predictor, as per TIFF Technical Note 3. + +2005-04-13 Andrey Kiselev + + * libtiff/{tiffio.h, tiffiop.h, tif_dir.c, tif_read.c, tif_swab.c}: + Added _TIFFSwab24BitData() and TIFFSwabArrayOfLong() functions used to + swap 24-bit floating point values. + + * libtiff/tiff.h: Added predictor constants. + +2005-04-08 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_dir.c}: Use uint32 type for appropriate + values in _TIFFVSetField() function. Inspired by the bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=816 + + * man/TIFFSetField.3tiff: Fixed definition of the TIFFTAG_INKNAMES tag + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=816 + +2005-03-30 Andrey Kiselev + + * libtiff/tif_open.c: Do not read header in case the output file + should be truncated (Ron). + + * libtiff/{tif_dirinfo.c, tif_config.h.vc}: Use lfind() instead + of bsearch() in _TIFFFindFieldInfoByName() function (Ron). + + * libtiff/{tiff.h, tif_dirinfo.c}: Fixes in EXIF tag ordering (Ron). + +2005-03-22 Andrey Kiselev + + * configure.ac, libtiff/Makefile.am: Use libtool machinery to pass + rpath option. + +2005-03-21 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_print.c}: Handle all data types in custom + tags. + +2005-03-18 Andrey Kiselev + + * libtiff/dirinfo.c: Added DNG tags. + + * libtiff/{tif_dir.c, tif_print.c}: More improvements in custom tag + handling code. + + * libtiff/tiff.h: More comments; added missed DNG tag (LensInfo); + added DNG 1.1.0.0 tags. + + * tools/tif2pdf.c: Fixed problem with alpha channel handling as per + bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=794 + + * man/TIFFGetField.3tiff: Add a note about autoregistered tags. + +2005-03-17 Andrey Kiselev + + * nmake.opt: Build with Win32 CRT library by default. + + * tools/tiff2ps.c: Fixed typo in page size handling code. + + * libtiff/{tif_dir.c, tif_print.c}: Support for custom tags, passed + by value. + + * libtiff/{tiff.h, tif_dirinfo.c, tiffiop.h}: Added EXIF related tags. + +2005-03-15 Andrey Kiselev + + * libtiff 3.7.2 released. + +2005-03-09 Andrey Kiselev + + * tools/tiffcmp.c: Added ability to compare the 32-bit integer and + floating point data; complain on unsupported bit depths. + +2005-03-05 Andrey Kiselev + + * tif_stream.cxx: Use ios namespace instead of ios_base to support + GCC 2.95. + + * libtiff/{tiff.h, tif_fax3.tif, tif_jpeg.c}: Applied correct patch from + Lee Howard for HylaFax DCS tag + (see http://bugzilla.remotesensing.org/show_bug.cgi?id=771) + +2005-03-04 Andrey Kiselev + + * configure, configure.ac: Use -rpath option instead of -R as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=732 + + * libtiff/{tiff.h, tif_fax3.tif, tif_jpeg.c}: Applied patch from Lee + Howard to support a new tag TIFFTAG_FAXDCS (34911) used in HylaFax + software. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=771 + + * nmake.opt, html/build.html: Add more comments, change the config + file organization a bit as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=764 + + * tools/tiffcmp.c: Use properly sized buffer in short arrays comparison + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=785 + +2005-03-03 Andrey Kiselev + + * libtiff/tif_dirread.c: More logic to guess missed strip size as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=705 + + * tools/fax2ps.c: Replace insecure mktemp() function with the + tmpfile() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=786 + +2005-02-04 Andrey Kiselev + + * libtiff/tiff.h: Changed the int8 definition to be always signed char + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=727 + + * libtiff/tiffio.h: Move TIFFOpenW() function into the extern "C"{} + block as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=763 + +2005-02-03 Bob Friesenhahn + + * tools/tiffgt.c: Fix problem on big-endian CPUs so that images + display more correctly. Images display brighter than they should + on a Sun workstation. + +2005-02-03 Andrey Kiselev + + * libtiff/tif_dirread.c: Estimate strip size in case of wrong or + suspicious values in the tags. As per bugs + + http://bugzilla.remotesensing.org/show_bug.cgi?id=705 + + and + + http://bugzilla.remotesensing.org/show_bug.cgi?id=320 + + * tools/tiff2ps.c: Fixed problem with page sizes as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=742 + +2005-01-31 Bob Friesenhahn + + * libtiff/tiff.h (TIFFTAG_TILEWIDTH): Corrected description. + (TIFFTAG_TILELENGTH): Corrected description. + +2005-01-30 Andrey Kiselev + + * configure.ac: Fixes for --with-docdir option as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=759 + + * libtiff/tif_open.c: Remove unnesessary TIFFSeekFile() call as per + bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=756 + + * libtiff/tif_stream.cxx: Fixes for C++ stream interface from + Michael Rinne and Edward Lam. + +2005-01-15 Andrey Kiselev + + * configure.ac: Make the documentation directory location configurable + via the --with-docdir option (as suggested by Jeremy C. Reed). + + * libtiff/tif_color.c: Use double as the second argument of pow() + function in TIFFCIELabToRGBInit(). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=741 + + * libtiff/tif_pixarlog.c: Avoid warnings when converting float to + integer as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=740 + + * libtiff/tif_getimage.c: Always fill the error message buffer in + TIFFRGBAImageBegin() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=739 + +2005-01-12 Andrey Kiselev + + * libtiff/tif_jpeg.c: Added ability to read/write the fax specific + TIFFTAG_FAXRECVPARAMS, TIFFTAG_FAXSUBADDRESS and TIFFTAG_FAXRECVTIME + tags as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=736 + + * libtiff/tif_win32.c: Fixed message formatting in functions + Win32WarningHandler() and Win32ErrorHandler() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=735 + + * tools/tiff2ps.c: Interpret the -w and -h options independently. As + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=689 + +2005-01-11 Andrey Kiselev + + * libtiff/tiffio.h: Move the color conversion routines in the 'extern + "C"' section as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=727 + + * libtiff/tiff.h: Restore back the workaround for AIX Visual Age C + compiler to avoid double definition of BSD types as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + + * libtiff/Makefile.am: Place the C++ stream API in the separate + library called libtiffxx to avoid unneeded dependencies. Probably + there will be more C++ API in the future. As per bugs + + http://bugzilla.remotesensing.org/show_bug.cgi?id=733 + + and + + http://bugzilla.remotesensing.org/show_bug.cgi?id=730 + +2005-01-05 Andrey Kiselev + + * tools/tiffdump.c: Fixed problem when read broken TIFFs with the + wrong tag counts (Dmitry V. Levin, Martin Pitt). + + * configure.ac: Replace --disable-c++ with the --disable-cxx option as + per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=730 + +2004-12-25 Andrey Kiselev + + * libtiff/tif_getimage.c: More fixes for multiple-alpha-channelled + RGB-images as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=713 + + + * tools/tiffset.c: Convert character option to integer value as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=725 + +2004-12-20 Andrey Kiselev + + * libtiff 3.7.1 released. + + * html/tiffset.1.html: Add missed manual page as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=678 + + * libtiff/tiff.h: Revert back libtiff data type definitions as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=687 + +2004-12-19 Andrey Kiselev + + * libtiff/tif_dirread.c: Do not forget about TIFF_VARIABLE2 when + checking for tag count in TIFFReadDirectory() function. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=713 + + * libtiff/{tif_dirread.c, tif_fax3.c}: More argument checking in + CheckMallock() function. + + * libtiff/tif_getimage.c: Support for multiple-alpha-channelled + RGB-images as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=718 + +2004-12-15 Frank Warmerdam + + * libtiff/tif_getimage.c: #define A1 bracketing for clean build on + SunPro compiler. + +2004-12-11 Bob Friesenhahn + + * autogen.sh: aclocal and autoheader should be executed after + libtoolize. Also add '-I .' to aclocal invocation to check + current directory for macros. + +2004-12-10 Andrey Kiselev + + * libtiff/tif_dirwrite.c: Always write TIFFTAG_SUBIFD using LONG type + as per bugs + + http://bugzilla.remotesensing.org/show_bug.cgi?id=703 + + and + + http://bugzilla.remotesensing.org/show_bug.cgi?id=704 + +2004-12-04 Andrey Kiselev + + * nmake.opt: Link with the user32.lib in windowed mode. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=697 + + * libtiff/tif_win32.c: Use char* strings instead of TCHAR in windowed + mode as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=697 + + * libtiff/tif_config.in.vc: Removed unneded definitions for + read/open/close/lseek functions to fix the + + http://bugzilla.remotesensing.org/show_bug.cgi?id=680 + +2004-12-03 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_dirread.c}: Remove TIFFReassignTagToIgnore() + call from the TIFFReadDirectory() function. TIFFReassignTagToIgnore + must be removed in the future, as it was never used properly. As per + bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=692 + +2004-11-30 Bob Friesenhahn + + * libtiff/tif_jpeg.c: Added a work-around in order to allow + compilation with the heavily modified version of libjpeg delivered + with Cygwin. + +2004-11-29 Andrey Kiselev + + * libtiff/tif_dir.c: Properly handle tags, which have the uint32 + counts. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=693 + + * tools/fax2ps.c: Be able to extract the first page (#0). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=690 + +2004-11-28 Andrey Kiselev + + * libtiff/tif_unix.c: Make UNIX module compilable (and usable) + on Windows. + + * nmake.opt: Add missed DLLNAME variable. + +2004-11-26 Frank Warmerdam + + * libtiff/makefile.vc: make it easier to rename the libtiff DLL. + +2004-11-24 Andrey Kiselev + + * man/libtiff.3tiff: Improvements in the "LIST OF ROUTINES" table as + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=545 + + * man/tiffset.1: Added manual page for tiffset tool written by Jay + Berkenbilt. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=678 + +2004-11-23 Frank Warmerdam + + * libtiff/tif_error.c: fixed TIFFerror call to be TIFFError. + +2004-11-21 Frank Warmerdam + + * html/document.html: Updated Adobe web links as per email from Joris. + +2004-11-21 Andrey Kiselev + + * libtiff/{tiffio.hxx, tiffio.h}: C++ stream interface moved to new + file tiffio.hxx. We don't have any C++ in tiffio.h, those who want to + use C++ streams should #include . + +2004-11-13 Andrey Kiselev + + * libtiff/tiff.h: Added Adobe DNG tags. + + * libtiff/tif_win32.c: Typo fixed. + + * libtiff/{tif_stream.cxx, tiffio.h}: C++ stream interface updated to + be compliant with the latest standard. Appropriate additions in + makefiles now completed. + +2004-11-11 Andrey Kiselev + + * tools/tiffset.c, libtiff/tif_dirinfo.c: Properly handle the + different tag types. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=600 + +2004-11-10 Andrey Kiselev + + * libtiff/tif_aux.c: Set the appropriate ReferenceBlackWhite array for + YCbCr image which lacks that tag (noted by Hans Petter Selasky). + +2004-11-09 Andrey Kiselev + + * libtiff/tif_color.c: Division by zero fixed (Hans Petter Selasky). + +2004-11-07 Andrey Kiselev + + * libtiff/{tif_stream.cxx, tiffio.h}: Added C++ stream interface + contributed by Edward Lam (see + http://bugzilla.remotesensing.org/show_bug.cgi?id=654 for details). + Though no changes in any makefiles yet. + +2004-11-05 Frank Warmerdam + + * libtiff/tif_open.c: Removed close() in TIFFClientOpen() if file + is bad. This is the callers responsibility. + http://bugzilla.remotesensing.org/show_bug.cgi?id=651 + +2004-11-05 Andrey Kiselev + + * libtiff/{tiffio.h, tif_win32.c, libtiff.def}: Added TIFFOpenW() + function to work with the double byte strings (used to represent + filenames in some locales). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=625 + + * libtiff/tif_dirread.c: Fixed problem when fetching BitsPerSample and + Compression tags of type LONG from broken TIFFS as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=662 + + * libtiff/tif_dirinfo.c: Fixed definition for TIFFTAG_RICHTIFFIPTC, + the writecount should have uint32 type. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=662 + + * libtiff/tif_write.c: Fixed wrong if() statement in + TIFFAppendToStrip() function as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=660 + +2004-11-04 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Change definition for TIFFTAG_EXTRASAMPLES + field. The caller should supply a count when setting this field. As + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=648 + + * libtiff/{tif_jpeg.c, tif_ojpeg.c}: TIFFTAG_JPEGTABLES should have + uint32 count. Use this type everywhere. + +2004-11-03 Frank Warmerdam + + * libtiff/tif_next.c: avoid use of u_long and u_char types. Bug 653. + +2004-11-02 Frank Warmerdam + + * tools/tiff2rgba.c: removed extra newlines in usage message. + +2004-10-30 Andrey Kiselev + + * libtiff/tif_dirwrite.c: Improvements in tag writing code. + + * tools/tiff2ps.c: Fixed wrong variable data type when read Position + tags (Tristan Hill). + +2004-10-30 Frank Warmerdam + + * libtiff/tiffiop.h: added fallback definition of assert() if we + don't have assert.h. + +2004-10-29 Andrey Kiselev + + * libtiff/tif_fax3.c: Fixed case with the wrong decode routines + choosing when the incorrect Group4Options tag set. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=323 + + * libtiff/tif_dirwrite.c: Fixed problem with passing count variable of + wrong type when writing the TIFF_BYTE/TIFF_SBYTE tags in + TIFFWriteNormalTag(). + +2004-10-28 Andrey Kiselev + + * tools/tiff2ps.c: Fixed wrong variable data type when read Resolution + tags (Peter Fales). + + * tools/{bmp2tiff.c, raw2tiff.c}: Get rid of stream I/O functions. + +2004-10-28 Frank Warmerdam + + * tools/tiff2pdf.c: added casts to avoid warnings. + + * libtiff/libtiff.def: Added several more entry points required + to link fax2tiff.c against the DLL on windows. + +2004-10-27 Andrey Kiselev + + * configure, configure.ac: Added --enable-rpath option to embed linker + paths into library binary. + +2004-10-26 Andrey Kiselev + + * tools/tiffset.c: Check the malloc return value (Dmitry V. Levin). + + * libtiff/{tif_strip.c, tif_tile.c}: Zero division problem fixed + (Vladimir Nadvornik, Dmitry V. Levin). + +2004-10-16 Andrey Kiselev + + * libtiff 3.7.0 released. + +2004-10-15 Bob Friesenhahn + + * libtiff/tif_jpeg.c: There seems to be no need to include stdio.h + in this file so its inclusion is removed. Including stdio.h + sometimes incurs an INT32 typedef conflict between MinGW's + basetsd.h and libjpeg's jmorecfg.h. + +2004-10-15 Andrey Kiselev + + * man/bmp2tiff.1: Added manual page for bmp2tiff utility. + +2004-10-13 Bob Friesenhahn + + * tools/tiffcmp.c (leof): Renamed from 'eof' in order to avoid + conflict noticed under MinGW. + * ltmain.sh: Fix for MinGW compilation. + +2004-10-13 Frank Warmerdam + + * man/tiffsplit.1: Fixed to indicate using aaa-zzz, not aa-zz. + http://bugzilla.remotesensing.org/show_bug.cgi?id=635 + +2004-10-12 Andrey Kiselev + + * libtiff/{tif_dirread.c, tif_jpeg.c, tif_luv.c, tif_ojpeg.c, + tif_pixarlog.c, tif_write.c}: Handle the zero strip/tile sizes + properly (Dmitry V. Levin, Marcus Meissner). + +2004-10-11 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Type of the TIFFTAG_SUBIFD field changed + to TIFF_IFD. + +2004-10-10 Andrey Kiselev + + * tools/bmp2tif.c: Check the space allocation results. + +2004-10-09 Andrey Kiselev + + * libtiff/tif_dir.c: Initialize td_tilewidth and td_tilelength fields + of the TIFFDirectory structure with the 0 instead of -1 to avoid + confusing integer overflows in TIFFTileRowSize() for striped images. + + * tools/tiff2pdf.c: Fixed TransferFunction tag handling reported + by Ross A. Finlayson. + + * libtiff/tif_dir.c: Fixed custom tags handling as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=629 + +2004-10-08 Frank Warmerdam + + * libtiff/tif_dirinfo.c: Fix bug with tif_foundfield and reallocation + of tif_fieldinfo. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=630 + +2004-10-04 Bob Friesenhahn + + * contrib/iptcutil/README: Added the missing README which goes + along with iptcutil. + +2004-10-03 Andrey Kiselev + + * libtiff/tif_compress.c: Improved error reporting in + TIFFGetConfiguredCODECs() (Dmitry V. Levin). + +2004-10-02 Andrey Kiselev + + * libtiff 3.7.0beta2 released. + + * libtiff/{tif_aux.c, tif_compress.c, tif_dirinfo.c, tif_dirwrite.c, + tif_extension.c, tif_fax3.c, tif_luv.c, tif_packbits.c, + tif_pixarlog.c, tif_write.c}: Added checks for failed memory + allocations and integer overflows (Dmitry V. Levin). + + * libtiff/tiff.h: Missed TIFF_BIGTIFF_VERSION constant added. + +2004-10-01 Frank Warmerdam + + * libtiff/tif_open.c: added a more informative message if a BigTIFF + file is opened. + +2004-09-30 Frank Warmerdam + + * libtiff/tif_dirinfo.c: changed type of XMLPacket (tag 700) to + TIFFTAG_BYTE instead of TIFFTAG_UNDEFINED to comply with the info + in the Adobe XMP Specification. + +2004-09-29 Andrey Kiselev + + * libtiff/{tif_jpeg.c, tif_pixarlog.c}: Use _TIFFmemset() instead of + memset(). + + * libtiff/{tif_dirread.c, tif_strip.c, tif_tile.c}: Applied patches + from Dmitry V. Levin to fix possible integer overflow problems. + +2004-09-28 Andrey Kiselev + + * libtiff/tif_getimage.c: Check for allocated buffers before clearing + (Dmitry V. Levin). + +2004-09-26 Andrey Kiselev + + * libtiff/{tif_dir.h, tif_dir.c, tif_dirread.c, tif_write.c}: + Optimize checking for the strip bounds. + + * libtiff/{tif_dirread.c, tif_strip.c}: TIFFScanlineSize() and + TIFFRasterScanlineSize() functions report zero in the case of integer + overflow now. Properly handle this case in TIFFReadDirectory() + (patches from Dmitry V. Levin). + +2004-09-25 Andrey Kiselev + + * libtiff/{tif_dirinfo.c, tif_strip.c, tif_tile.c}: Use TIFFhowmany8() + macro where appropriate. + + * tools/tiff2bw.c: Write ImageWidth/Height tags to output file, as + noted by Gennady Khokhorin. + + * libtiff/tif_dirread.c: Always check the return values, returned + by the _TIFFmalloc() (Dmitry V. Levin). + + * libtiff/tif_dir.c: Fixed possible integer overflow _TIFFset*Array() + functions (Dmitry V. Levin). + + * libtiff/{tif_dirread.c, tif_dir.c, tif_write.c}: + Potential memory leak fixed in TIFFReadDirectory(), _TIFFVSetField(), + TIFFGrowStrips() (found by Dmitry V. Levin). + +2004-09-24 Andrey Kiselev + + * libtiff/{tiffio.h, tif_compress.c}: Added TIFFGetConfiguredCODECs() + to get the list of configured codecs. + + * libtiff/{tiffiop.h, tif_dirread.c}: More overflow fixes from + Dmitry V. Levin. + +2004-09-23 Andrey Kiselev + + * libtiff/tif_dirread.c: Applied patch from Dmitry V. Levin to fix + possible integer overflow in CheckMalloc() function. + +2004-09-22 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_strip.c}: Use TIFFhowmany8() macro instead + of plain TIFFhowmany() where appropriate. + +2004-09-21 Andrey Kiselev + + * libtiff/tif_getimage.c: Initialize arrays after space allocation. + +2004-09-19 Andrey Kiselev + + * libtiff 3.7.0beta released. + + * libtiff/{tif_luv.c, tif_next.c, tif_thunder.c}: Several buffer + overruns fixed, as noted by Chris Evans. + +2004-09-14 Bob Friesenhahn + + * commit: Added a script to make it more convenient to commit + updates. The CVS commit message is extracted from this ChangeLog + file. + +2004-09-14 Andrey Kiselev + + * configure.ac, configure, aclocal.m4, libtiff/{mkspans.c, tif_fax3.c, + tif_getimage.c, tif_luv.c, tif_lzw.c, tif_ojpeg.c, tif_packbits.c, + tif_predict.c, tif_read.c, tif_swab.c, tif_thunder.c, tif_write.c, + tif_dir.c, tif_dirread.c, tif_dirwrite.c, tif_jpeg.c, tif_dirinfo.c, + tif_vms.c, tif_print.c, tif_strip.c, tif_tile.c, tif_dir.h, + tif_config.h.in, tiffiop.h}: + Get rid of BSD data types (u_char, u_short, u_int, u_long). + +2004-09-13 Bob Friesenhahn + + * libtiff/tiff.h: Fix column tagging. Reference current Adobe XMP + specification. Reference libtiff bug tracking system to submit + private tag additions. + +2004-09-12 Bob Friesenhahn + + * tools/tiffgt.c: Include "tif_config.h". + + * configure.ac: Use AM_PROG_CC_C_O since it is now needed to build + tiffgt. This results in the 'compile' script being added to the + project. + + * tools/Makefile.am (tiffgt_CFLAGS): Add extra build options + required to find OpenGL headers necessary to build tiffgt. Also + ensure that the libtiff that we built is used rather than some other + libtiff installed on the system. + +2004-09-12 Andrey Kiselev + + * configure.ac, acinclude.m4, aclocal.m4: New macros to detect GLUT + libraries. + +2004-09-11 Bob Friesenhahn + + * configure.ac: Pass library configuration defines via + tif_config.h rather than extending CPPFLAGS. Configure a + libtiff/tiffconf.h in order to satisfy application requirements + (not used by library build). Do not define _POSIX_C_SOURCE=2 since + this causes failure to build on systems which properly respect + this request. + + * libtiff/tiffconf.h.in: New file to act as the template for the + configured tiffconf.h + + * libtiff/files.lst (HDRS): Install the configured tiffconf.h. + +2004-09-10 Frank Warmerdam + + * html/internals.html: Split off a discussion of adding new tags + into addingtags.html. + +2004-09-10 Andrey Kiselev + + * test/{ascii_tag.c, long_tag.c}: Preliminary test suite added. + + * tools/tiff2pdf.c: Fixed reading TransferFunction tag as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=590 + + * libtiff/tif_print.c: Fixes in InkNames and NumberOfInks reporting. + + * libtiff/tif_dirread.c: Don't reject to read tags of the + SamplesPerPixel size when the tag count is greater than number of + samples as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=576 + + * libtiff/tiff.h: Use _TIFF_DATA_TYPEDEFS_ guardian to switch off + defining int8/uint8/... etc. types. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=607 + +2004-09-09 Frank Warmerdam + + * tools/tiff2ps.c, tools/tiffmedian.c: fiddle with include files + to avoid compile warnings about getopt() and a few other things. + +2004-09-02 Andrey Kiselev + + * libtiff/tif_dirread.c: Use memcpy() function instead of pointer + assigning magic in TIFFFetchFloat(). + +2004-09-01 Andrey Kiselev + + * libtiff/{tiffio.h, tif_open.c}: Applied patches from Joris Van Damme + to avoid requirement for tiffiop.h inclusion in some applications. See + here + + http://www.asmail.be/msg0054799560.html + + for details. + + * tools/fax2tiff.c: Use the new functions in the code. + +2004-08-25 Andrey Kiselev + + * tools/tiff2pdf.c: Initialize arrays properly. + + * tools/tiff2ps.c: Avoid zero division in setupPageState() function; + properly initialize array in PSDataBW(). + +2004-08-24 Andrey Kiselev + + * tools/tiff2pdf.c: More fixes for bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=590 + + from Ross Finlayson. + +2004-08-23 Andrey Kiselev + + * tools/tiff2ps.c: Fixed problem with uninitialized values. + + * libtiff/tif_dir.c: Initialize tif_foundfield data member in the + TIFFDefaultDirectory() (in addition to 2004-08-19 fix). + + * tools/tiff2pdf.c: Fixed a bunch of problems as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=590 + +2004-08-20 Andrey Kiselev + + * tools/tiff2pdf.c: Applied patch from Ross Finlayson that checks + that the input file has compression, photometric interpretation, + etcetra, tags or if not than a more descriptive error is returned. + + * libtiff/tif_dirread.c: Fixed problem in TIFFReadDirectory() in the + code, responsible for tag data type checking. + +2004-08-19 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_dirinfo.c}: Fixed problem with the static + variable as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=593 + +2004-08-16 Andrey Kiselev + + * tools/ras2tiff.c: Fixed issue with missed big-endian checks as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=586 + +2004-08-01 Andrey Kiselev + + * libtiff/{tif_config.h.in, tif_config.h.vc}: config.h.in and + config.h.vc files renamed in the tif_config.h.in and tif_config.h.vc. + +2004-07-24 Andrey Kiselev + + * libtiff/tif_lzw.c: LZW compression code is merged back from the + separate package. All libtiff tools are updated to not advertise an + abcence of LZW support. + +2004-07-12 Andrey Kiselev + + * libtiff/tiffio.h: Revert thandle_t back to void* type. + +2004-07-11 Andrey Kiselev + + * libtiff/{tif_read.c, tif_tile.c, tif_strip.c}: Fixes in error + messages, as suggested by Bernd Herd. + +2004-07-03 Andrey Kiselev + + * libtiff/tif_dir.c: Call TIFFError() instead of producing warnings + when setting custom tags by value. Reported by Eric Fieleke. + +2004-06-14 Andrey Kiselev + + * tools/bmp2tiff.c: Add missed RawsPerStrip setting. + +2004-06-08 Andrey Kiselev + + * tools/bmp2tiff.c: Added new utility to convert Windows BMP files + into TIFFs. + +2004-06-07 Andrey Kiselev + + * libtiff 3.7.0alpha released. + +2004-06-06 Andrey Kiselev + + * libtiff/{tiff.h, tif_dirwrite.c, tif_fax3.c, tif_packbits.c,}: Get rid + of ugly 64-bit hacks, replace them with the clever (autoconf based ) + ones :-). + + * libtiff/tiffio.h: Define thandle_t as int, not void* (may cause + problems in 64-bit environment). + +2004-06-05 Andrey Kiselev + + * tools/tiffset.c: tiffset now can set any libtiff supported tags. + Tags can be supplied by the mnemonic name or number. + + * libtiff/{tiffio.h, tif_dir.h, tif_dirinfo.c,}: Added two new + functions TIFFFindFieldInfoByName() and TIFFFieldWithName(). + +2004-05-27 Andrey Kiselev + + * libtiff/tif_ojpeg.c: Fixed problem with duplicated SOI and SOF + markers as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=581 + +2004-05-24 Andrey Kiselev + + * tools/tiffsplit.c: Don't forget to copy Photometric + Interpretation tag. + +2004-05-20 Andrey Kiselev + + * libtiff/{tif_open.c, tiffio.h}: New function added: + TIFFIsBigEndian(). Function returns nonzero if given was file written + in big-endian order. + + * tools/tiffsplit.c: Fixed problem with unproperly written multibyte + files. Now output files will be written using the same byte order + flag as in the input image. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=574 + + for details. + +2004-05-19 Frank Warmerdam + + * libtiff/tif_print.c: added (untested) support for printing + SSHORT, SLONG and SRATIONAL fields. + + * tools/tiffcp.c: close output file on normal exit. + +2004-05-17 Andrey Kiselev + + * libtiff/tif_fax3.c: Avoid reading CCITT compression options + if compression type mismatches. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=565 + +2004-04-30 Andrey Kiselev + + * libtiff/tif_strip.c: Never return 0 from the + TIFFNumberOfStrips(). + +2004-04-29 Andrey Kiselev + + * libtiff/tif_dirread.c: Workaround for broken TIFF writers which + store single SampleFormat value for multisampled images. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=562 + +2004-04-25 Andrey Kiselev + + * configure.ac, libtiff/{tiff.h, config.h.in}: Added tests for int8, + int16 and int32 types to avoid complains on some compilers. Details at + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + +2004-04-20 Andrey Kiselev + + * tools/tiff2pdf.c: Fixed problem with unaligned access as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=555 + +2004-04-14 Andrey Kiselev + + * libtiff/tif_write.c: Allow in-place updating of the compressed + images (don't work properly with all codecs). For details see GDAL bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=534 + +2004-04-06 Andrey Kiselev + + * libtiff/tif_jpeg.c: Workaround for wrong sampling factors used + in the Intergarph JPEG compressed TIFF images as per bug: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=532 + +2004-04-04 Frank Warmerdam + + * libtiff/tif_open.c: close clientdata if TIFFClientOpen() fails + via bad2. + +2004-03-26 Andrey Kiselev + + * tools/tiffcp.c: Properly set Photometric Interpretation in case of + JPEG compression of grayscale images. + + * tools/tiffcp.c: Don't emit warnings when Orientation tag does not + present in the input image. + +2004-03-19 Andrey Kiselev + + * {many}: The first attempt to switch to autotools. + +2004-03-03 Andrey Kiselev + + * libtiff/tif_open.c: Use dummy mmap/munmap functions in + TIFFClientOpen() when the appropriate client functions was not + supplied by user. + +2004-03-02 Frank Warmerdam + + * tools/ycbcr.c: fixed main() declaration as per: + http://bugzilla.remotesensing.org/show_bug.cgi?id=513 + +2004-02-26 Andrey Kiselev + + * tools/tiffsplit.c: Copy JPEGTables tag contents for JPEG compressed + images. Reported by Artem Mirolubov. + + * libtiff/tif_dirread.c: Fixed problem with handling TIFF_UNDEFINED + tag type in TIFFFetchNormalTag() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=508 + +2004-02-17 Frank Warmerdam + + * libtiff/tif_codec.c: Fixed typo in TIFFInitPackBits name as per: + http://bugzilla.remotesensing.org/show_bug.cgi?id=494 + +2004-02-05 Andrey Kiselev + + * libtiff/tif_fax3.c: Fixed problem with CCITT encoding modes as per + bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=483 + + But we need more work on fax codec to support update mode. + +2004-01-30 Frank Warmerdam + + * libtiff/libtiff.def: Added TIFFCurrentDirOffset, TIFFWriteCheck, + TIFFRGBAImageOK, and TIFFNumberOfDirectories as suggested by + Scott Reynolds. + +2004-01-29 Andrey Kiselev + + * libtiff/tiff.h: Fixed tag definitions for TIFFTAG_YCLIPPATHUNITS + and TIFFTAG_INDEXED as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=475 + + * libtiff/{tif_win32.c, tif_unix.c}: Check whether the pointer is + NULL before proceeding further as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=474 + + Check results, returned by the TIFFFdOpen() before returning and close + file if TIFFFdOpen() failed as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=468 + + * libtiff/tif_open.c: More fixes for + + http://bugzilla.remotesensing.org/show_bug.cgi?id=468 + +2004-01-28 Andrey Kiselev + + * libtiff/{libtiff.def, tif_close.c, tiffio.h, tif_open.c}: Separate + TIFFCleanup() from the TIFFClose() in order to fix the bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=468 + + * tools/tiffcp.c: Fixed problem with wrong interpretation of the + InkNames tag as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=466 + + Memory leak fixed. + +2004-01-21 Frank Warmerdam + + * libtiff/tif_dirwrite.c: Fixed handling of writable ASCII tags that + are field_passcount=TRUE properly. Arguably anonymous custom tags + should be declared as passcount=FALSE, but I don't want to change + that without a careful review. + +2004-01-20 Andrey Kiselev + + * libtiff/tif_write.c: Fixed reporting size of the buffer in case of + stripped image in TIFFWriteBufferSetup(). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=460 + +2004-01-11 Andrey Kiselev + + * libtiff/tif_dir.c: Incomplete cleanup in TIFFFreeDirectory(), + patch from Gerben Koopmans. + + * libtiff/tif_dirread.c: Check field_passcount value before setting + the value of undefined type, patch from Gerben Koopmans. + +2004-01-02 Andrey Kiselev + + * tools/tiffcp.c: Fixed problem with wrong Photometric setting for + non-RGB images. + +2003-12-31 Andrey Kiselev + + * libtiff/tif_win32.c: Fixed problem with _TIFFrealloc() when the NULL + pointer passed. Patch supplied by Larry Grill. + + * libtiff/{tiff.h, tif_fax3.c}:Fixes for AMD 64 platform as + suggested by Jeremy C. Reed. + +2003-12-26 Andrey Kiselev + + * libtiff 3.6.1 released. + +2003-12-24 Andrey Kiselev + + * config.guess, config.sub: Updated from the recent upstream. + +2003-12-22 Andrey Kiselev + + * libtiff/{tif_color, tif_getimage.c, tiffio.h}, man/TIFFcolor.3t: + More cleanups in color conversion interface, added appropriate manual + page. + +2003-12-19 Andrey Kiselev + + * libtiff/{tif_extension.c, tif_dirinfo.c, tiff.h}: Warnings fixed as + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=357 + + * tools/tiff2ps.c: Added support for alpha channel. Fixes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=428 + + * libtiff/{libtiff.def, tif_color.c, tif_getimage.c, tiffio.h}: + Interface for Lab->RGB color conversion is finally cleaned up. + Added support for ReferenceBlackWhite tag handling when converted from + YCbCr color space. The latter closes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=120 + +2003-12-07 Andrey Kiselev + + * libtiff/{tif_getimage.c, tiffio.h}: Avoid warnings. + + * libtiff/makefile.vc, tools/makefile.vc: Support for IJG JPEG + library. + +2003-12-06 Andrey Kiselev + + * libtiff/{tif_getimage.c, tif_aux.c}: Read WhitePoint tag from the + file and properly use it for CIE Lab->RGB transform. + +2003-12-04 Andrey Kiselev + + * libtiff/{tif_getimage.c, tif_color.c, tiffio.h}: YCbCr->RGB + conversion routines now in the tif_color.c module. New function + TIFFYCbCrtoRGB() available in TIFF API. + + * libtiff/tif_dirwrite.c: Handle TIFF_IFD tag type correctly. + +2003-12-03 Andrey Kiselev + + * libtiff/{tif_getimage.c, tif_color.c, tiffio.h}: Improvements in + CIE Lab conversion code. Start moving YCbCr stuff to the tif_color.c + module. + + * libtiff/{tif_getimage.c, tiffio.h}, man{TIFFReadRGBAImage.3t, + TIFFReadRGBAStrip.3t, TIFFReadRGBATile.3t, TIFFRGBAImage.3t}: + Finally resolved problems with orientation handling. TIFFRGBAImage + interface now properly supports all possible orientations, i.e. images + will be flipped both in horizontal and vertical directions if + required. 'Known bugs' section now removed from the appropriate manual + pages. Closed bug entry: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=322 + +2003-12-02 Andrey Kiselev + + * libtiff/tif_dir.c: Fixed order of the parameters in TIFFError() + function calls as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=440 + +2003-11-28 Ross Finlayson + + * tools/tiff2pdf.c: Some bugs fixed. + +2003-11-27 Andrey Kiselev + + * libtiff/tif_luv.c: Fixed bug in 48-bit to 24-bit conversion routine, + reported by Antonio Scuri. + + * man/tiff2pdf.1: Few improvements in page layout. + + * Makefile.in, /man/Makefile.in, /html/man/tiff2pdf.1.html: + Added support fpr tiff2pdf manual page. + +2003-11-26 Ross Finlayson + + * /man/tiff2pdf.1: File added to repository. + +2003-11-26 Andrey Kiselev + + * Makefile.in, /tools/{Makefile.in, makefile.vc}: + Added support fpr tiff2pdf utility. + +2003-11-25 Ross Finlayson + + * /tools/tiff2pdf.c: File added to repository. + +2003-11-22 Andrey Kiselev + + * /tools/raw2tiff.c: sqrtf() replaced with sqrt(). + +2003-11-21 Andrey Kiselev + + * /tools/raw2tiff.c: #include removed. + + * tools/{Makefile.in, tiffgt.c}: Unmaintained and platform dependent + sgigt utility removed and replaced with the completely rewritten + portable tiffgt tool (depend on OpenGL and GLUT). Initial revision, + there is a lot of things to improve. + + * libtiff/tif_ojpeg.c: TIFFVGetField() function now can properly + extract the fields from the OJPEG files. Patch supplied by Ross + Finlayson. + + * libtiff/{tiffio.h, tif_codec.c}, man/{libtiff.3t, TIFFcodec.3t}: + Added new function TIFFIsCODECConfigured(), suggested by Ross + Finlayson. + +2003-11-18 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Implemented binary search in + _TIFFMergeFieldInfo(). Patch supplied by Ross Finlayson. + + * libtiff/tif_dir.h: _TIFFFindOrRegisterdInfo declaration replaced + with _TIFFFindOrRegisterFieldInfo as reported by Ross Finlayson. + +2003-11-17 Frank Warmerdam + + * tif_dirread.c: do not mark all anonymously defined tags to be + IGNOREd. + +2003-11-17 Andrey Kiselev + + * contrib/pds/{tif_pdsdirread.c, tif_pdsdirwrite.c}: Use + TIFFDataWidth() function insted of tiffDataWidth array. + +2003-11-16 Andrey Kiselev + + * libtiff/{tiff.h, tif_dirinfo.c}: Added support for IFD (13) + datatype, intruduced in "Adobe PageMaker TIFF Tech. Notes". + +2003-11-15 Frank Warmerdam + + * Makefile.in: fixed missing backslash for tif_color.c in list. + +2003-11-13 Andrey Kiselev + + * libtiff/{tif_color.c, tif_getimage.c, tiffio.h, Makefile.in}: + New color space conversion code: CIE L*a*b* 1976 images now supported + by the TIFFRGBAImage interface. All introduced routines go to new + module tif_color.c. Eventually all color conversion functions should + be moved there. + +2003-11-12 Andrey Kiselev + + * tools/{ras2tiff.c, rasterfile.h}: Properly determine SUN Rasterfiles + with the reverse byte order (it is reported by the magic header + field). Problem reported by Andreas Wiesmann. + + * tools/raw2tiff.c, man/raw2tiff.1: Few improvements in correlation + calculation function. Guessing mechanics now documented in manual page. + +2003-11-11 Andrey Kiselev + + * tools/raw2tiff.c: Implemented image size guessing using + correlation coefficient calculation between two neighbour lines. + +2003-11-09 Frank Warmerdam + + * libtiff/tif_tile.c: remove spurious use of "s" (sample) in the + planarconfig_contig case in TIFFComputeTile(). + + http://bugzilla.remotesensing.org/show_bug.cgi?id=387 + +2003-11-09 Andrey Kiselev + + * libtiff/tiffiop.h: New macros: TIFFmax, TIFFmin and TIFFrint. + +2003-11-07 Andrey Kiselev + + * libtiff/{tiffio.h, tif_strip.c}, man/{TIFFstrip.3t, libtiff.3t}: + Added TIFFRawStripSize() function as suggested by Chris Hanson. + +2003-11-03 Andrey Kiselev + + * libtiff/{tif_lzw.c, tif_fax3.c}: Proper support for update mode as + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=424 + +2003-10-29 Andrey Kiselev + + * libtiff/libtiff.def: Added TIFFReadRGBAImageOriented. + + * html/build.html: Added note about GNU make requirement. + +2003-10-25 Andrey Kiselev + + * Makefile.in: Fixes in using MAKEFLAGS as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=418 + + * port/install.sh.in: Option -p added to the mkdir command to create + all directory tree structure before installing. + +2003-10-18 Andrey Kiselev + + * /tools/tiff2ps.c: #include replaced with the + #include . + +2003-10-16 Andrey Kiselev + + * Makefile.in: Add an absolute path to the test_pics.sh call. + +2003-10-12 Andrey Kiselev + + * libtiff/tiffcomp.h: #define _BSDTYPES_DEFINED when defining BSD + typedefs. + +2003-10-09 Andrey Kiselev + + * configure, libtiff/{Makefile.in, mkversion.c}: + Relative buildings fixed. + + * tools/Makefile.in: Added "-I../libtiff" to the tiffset building + rule. + +2003-10-07 Andrey Kiselev + + * Makefile.in: Added missed v3.6.0.html. + + * libtiff/tiffio.h: Typo fixed: ORIENTATION_BOTTOMLEFT replaced with + ORIENTATION_BOTLEFT. + +2003-10-04 Andrey Kiselev + + * 3.6.0 final release. + +2003-10-03 Andrey Kiselev + + * libtiff/{tif_getimage.c, tiffio.h}, man/TIFFReadRGBAImage.3t: New + function TIFFReadRGBAImageOriented() implemented to retrieve raster + array with user-specified origin position as suggested by Jason Frank. + See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=322 + + for details. + + * tools/tiff2rgba.c: Switched to use TIFFReadRGBAImageOriented() + instead of TIFFReadRGBAImage(). + + * tools/tiff2ps.c: Fixed possible endless loop as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=404 + +2003-09-30 Andrey Kiselev + + * libtiff/tif_dirread.c: Check field counter against number of fields + in order to fix + + http://bugzilla.remotesensing.org/show_bug.cgi?id=366 + + * libtiff/tif_fax3.c: Fix wrong line numbering as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=342 + +2003-09-25 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_dirread.c, tif_dir.c, tif_open.c, + tif_close.c}: Store a list of opened IFD to prevent looping as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=383 + +2003-09-23 Andrey Kiselev + + * libtiff/tif_dirread.c: More fixes for EstimateStripByteCounts(). See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=358 + +2003-08-21 Andrey Kiselev + + * tools/tiffmedian.c: int declaration replaced with the uint32 to + support large images as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=382 + +2003-08-12 Andrey Kiselev + + * libtiff/Makefile.in: Fixed problem with building in different + directory. + + * tools/tiff2ps.c: Added missing #include . + + * libtiff/tif_dirwrite.c: More fixes for custom tags code + from Ashley Dreier. + +2003-08-07 Andrey Kiselev + + * tools/tiff2ps.c: Added page size setting when creating PS Level 2. + Patch submitted by Balatoni Denes (with corrections from Tom + Kacvinsky). + + * tools/tiff2ps.c: Fixed PS comment emitted when FlateDecode is + being used. Reported by Tom Kacvinsky. + + * libtiff/tif_dirwrite.c: Fixed problem with custom tags writing, + reported by Ashley Dreier. + + * libtiff/tif_print.c: Fixed problem with float tags reading, support + for printing RATIONAL and BYTE tags added. + +2003-08-05 Andrey Kiselev + + * libtiff/tif_lzw.c: Move LZW codec state block allocation back to + TIFFInitLZW(), because its initialization in LZWSetupDecode() cause + problems with predictor initialization. Remove O_RDONLY check during + state block allocation to be able open LZW compressed files in update + mode. + + Problem exist for libtiff version of the tif_lzw.c module. One from + lzw-compression-kit hasn't such troubles. + +2003-08-04 Frank Warmerdam + + * libtiff/tif_write.c: modified tif_write.c so that the various + encoded write functions use tif_postdecode() to apply byte order + swapping (swab) to the application passed data buffer if the same + would be done when reading. This allows us to write pixel data with + more than 8 bits per sample to existing files of a non-native byte + order. One side effect of this change is the applications buffer + itself is altered in this case by the act of writing. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=171 + +2003-07-25 Frank Warmerdam + + * libtiff/tif_open.c: avoid signed/unsigned casting warning + initializing typemask as per patch from J.A. Strother. + + * tools/tiffcp.c: fixed signed/unsigned casting warning. + + * libtiff/tif_print.c: dos2unix conversion. + + * tools/tiffsplit.c: increased the maximum number of pages that + can be split. Patch provided by Andrew J. Montalenti. + +2003-07-11 Andrey Kiselev + + * tools/raw2tiff.c: Added option `-p' to explicitly select color + space of input image data. Closes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=364 + +2003-07-08 Frank Warmerdam + + * tif_aux.c, tif_codec.c, tif_dir.c, tif_dirread.c, tif_extension.c, + tif_fax3.c, tif_getimage.c, tif_luv.c, tif_lzw.c, tif_next.c, + tif_packbits.c, tif_predict.c, tif_print.c, tif_swab.c, tif_thunder.c: + avoid casting warning at /W4. + +2003-07-03 Andrey Kiselev + + * tools/thumbnail.c: Memory leak fixed as reported by Robert S. Kissel. + +2003-06-30 Andrey Kiselev + + * libtiff/tif_pixarlog.c: Unused variables removed. + + * libtiff/{tif_dirread.c, tif_dir.c}: Fixed problem with + EstimateStripByteCounts() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=358 + + * libtiff/{tif_dirwrite.c, tif_packbits.c}: Fixed compilation on + 64-bit architectures as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=357 + + * libtiff/tif_dirinfo.c: TIFFDataWidth() returns 0 in case of + unknown data type. + +2003-06-19 Frank Warmerdam + + * libtiff/tif_print.c: fixed some serious bugs when printing + custom tags ... almost certain to crash. + + * libtiff/tif_dirread.c: Don't ignore custom fields that are + autodefined. Not sure how this got to be like this. + +2003-06-18 Andrey Kiselev + + * 3.6.0 Beta2 released. + + * tools/tiffcmp.c, man/tiffcmp.1: Fixed problem with unused data + comparing as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=349 + + `-z' option now can be used to set the number of reported different + bytes. + +2003-06-09 Andrey Kiselev + + * tools/tiffcp.c, man/tiffcp.1: Added possibility to specify value -1 + to -r option to get the entire image as one strip. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=343 + + for details. + +2003-06-04 Andrey Kiselev + + * tools/tiffcp.c: Set the correct RowsPerStrip and PageNumber + values as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=343 + +2003-05-27 Frank Warmerdam + + * libtiff/tif_jpeg.c: modified segment_height calculation to always + be a full height tile for tiled images. Also changed error to just + be a warning. + +2003-05-25 Andrey Kiselev + + * tools/fax2tiff.c: Page numbering fixed, as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=341 + +2003-05-20 Andrey Kiselev + + * contrib/ojpeg/{Makefile.in, jdhuff.h, jinclude.h, ojpeg.c, README}, + configure, Makefile.in: Switched back to the old behaviour. Likely + better solution should be found for OJPEG support. + +2003-05-11 Andrey Kiselev + + * libtiff/mkversion.c: Fixed problem with wrong string size when + reading RELEASE-DATE file. + +2003-05-07 Andrey Kiselev + + * tools/tiff2ps.c: Fixed bug in Ascii85EncodeBlock() function: array + index was out of range. + +2003-05-06 Andrey Kiselev + + * contrib/ojpeg/{Makefile.in, jdhuff.h, jinclude.h, ojpeg.c, README}, + configure, Makefile.in: Improved libtiff compilation with OJPEG + support. Now no need for patching IJG JPEG library, hack requred by + libtiff will be compiled and used in-place. Implemented with + suggestion and help from Bill Allombert, Debian's libjpeg maintainer. + + * libtiff/tif_aux.c: Properly handle TIFFTAG_PREDICTOR in + TIFFVGetFieldDefaulted() function. + +2003-05-05 Andrey Kiselev + + * tools/ppm2tiff.c: PPM header parser improved: now able to skip + comments. + + * tools/tiffdither.c: Fixed problem with bit fill order tag setting: + was not copied from source image. + + * libtiff/getimage.c: Workaround for some images without correct + info about alpha channel as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=331 + +2003-04-29 Andrey Kiselev + + * tools/tiff2ps.c, man/tiff2ps.1: Add ability to generate PS Level 3. + It basically allows one to use the /flateDecode filter for ZIP + compressed TIFF images. Patch supplied by Tom Kacvinsky. Fixes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=328 + + * tools/tiff2ps.c: Force deadzone printing when EPS output specified + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=325 + +2003-04-17 Andrey Kiselev + + * libtiff/tif_dirread.c: Removed additional check for StripByteCounts + due to problems with multidirectory images. Quality of error messages + improved. + +2003-04-16 Andrey Kiselev + + * tools/tiffcp.c: Fixed problem with colorspace conversion for JPEG + encoded images. See bug entries + + http://bugzilla.remotesensing.org/show_bug.cgi?id=275 + + and + + http://bugzilla.remotesensing.org/show_bug.cgi?id=23 + + * libtiff/tif_dirread.c: Additional check for StripByteCounts + correctness. Fixes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=320 + +2003-03-12 Andrey Kiselev + + * tools/{fax2ps.c, fax2tiff.c, gif2tiff.c, pal2rgb.c, ppm2tiff.c, + ras2tiff.c, raw2tiff.c, rgb2ycbcr.c, thumbnail.c, tiff2bw.c, + tiff2ps.c, tiff2rgba.c, tiffcp.c, tiffdither.c, tiffinfo.c, + tiffmedian.c}: Added library version reporting facility to all tools. + +2003-03-06 Frank Warmerdam + + * port/install.sh.in: Fixed problems with install producing paths + like ///usr/local/lib on cygwin. + +2003-02-27 Andrey Kiselev + + * tools/fax2tiff.c, man/fax2tiff.1: New switch (-X) to set width of + raw input page. Patch supplied by Julien Gaulmin. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=293 + + for details. + +2003-02-26 Frank Warmerdam + + * libtiff/tif_dir.c: fixed up the tif_postdecode settings + responsible for byte swapping complex image data. + + * libtiff/tif_lzw.c: fixed so that decoder state isn't allocated till + LZWSetupDecode(). Needed to read LZW files in "r+" mode. + +2003-02-07 Andrey Kiselev + + * tools/ppm2tiff.c: Fixed problem with too many arguments. + +2003-02-04 Andrey Kiselev + + * tools/raw2tiff.c: Memory leak fixed. + +2003-02-03 Andrey Kiselev + + * tools/fax2tiff.c, man/fax2tiff.1: Applied patch from Julien Gaulmin + (thanks, Julien!). More switches for fax2tiff tool for better control + of input and output. Details at + + http://bugzilla.remotesensing.org/show_bug.cgi?id=272 + +2003-02-03 Frank Warmerdam + + * libtiff/tif_jpeg.c: Modified to defer initialization of jpeg + library so that we can check if there is already any tile/strip data + before deciding between creating a compressor or a decompressor. + +2003-01-31 Frank Warmerdam + + * libtiff/tif_write.c: TIFFWriteCheck() now fails if the image is + a pre-existing compressed image. That is, image writing to + pre-existing compressed images is not allowed. + + * libtiff/tif_open.c: Removed error if opening a compressed file + in update mode. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=198 + +2003-01-31 Andrey Kiselev + + * config.guess, config.sub: Updated to recent upstream versions. + +2003-01-15 Frank Warmerdam + + * cut 3.6.0 Beta release. + +2002-12-20 Andrey Kiselev + + * tools/fax2ps.c, man/fax2ps.1: Page size was determined + in wrong way as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=239 + +2002-12-17 Frank Warmerdam + + * libtiff/tif_dirread.c: Allow wrong sized arrays in + TIFFFetchStripThing(). + + http://bugzilla.remotesensing.org/show_bug.cgi?id=49 + +2002-12-02 Frank Warmerdam + + * libtiff/tif_dir.c: fix problem with test on td_customValueCount. + Was using realloc even first time. Fix by Igor Venevtsev. + +2002-11-30 Frank Warmerdam + + * libtiff/tif_dir.c: fixed bug with resetting an existing custom + field value. + + * libtiff/tif_dir.c: Fixed potential problem with ascii "custom" + tags in TIFFVGetField() ... added missing break. + +2002-10-14 Frank Warmerdam + + * tools/tiff2ps.c: fixes a problem where "tiff2ps -1e" did not make + the scanline buffer long enough when writing rgb triplets. + The scanline needs to be 3 X the number of dots or else it will + contain an incomplete triplet and programs that try to separate + the eps by redefining the colorimage operator will get messed up. + Patch supplied by William Bader. + + * Makefile.in: added tif_extension.c to file list as per + http://bugzilla.remotesensing.org/show_bug.cgi?id=218. + +2002-10-11 Andrey Kiselev + + * configure, config.site, libtiff/{tif_unix.c, Makefile.in}: Fix for + large files (>2GiB) supporting. New option in the config.site: + LARGEFILE="yes". Should be enough for I/O of the large files. + +2002-10-10 Frank Warmerdam + + * libtiff/html/v3.6.0.html: new release notes. + + * libtiff/index.html: removed faq, cvs snapshot cruft. Added email + link for Andrey. Pointer to v3.6.0.html. + + * libtiff/Makefile.in: added direct rule for tiffvers.h for release. + +2002-10-07 Andrey Kiselev + * tools/tiff2ps.c, man/tiff2ps.1: Applied patch form Sebastian Eken + (thanks, Sebastian!). New switches: + -b # for a bottom margin of # inches + -c center image + -l # for a left margin of # inches + -r rotate the image by 180 degrees + New features merged with code for shrinking/overlapping. + Previously added -c and -n switches (for overriding PS units) renamed + in -x and -y respectively. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=200 + + * html/man/*.html: Updated from actual manual pages. + +2002-10-06 Frank Warmerdam + + * libtiff/tif_jpeg.c: fixed problem with boolean defined with wrong + size on windows. Use #define boolean hack. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=188 + + * libtiff/tiff.h: Don't do special type handling in tiff.h unless + USING_VISUALAGE is defined. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + +2002-10-03 Frank Warmerdam + + * libtiff/tiff.h: added COMPRESSION_JP2000. + +2002-10-02 Andrey Kiselev + + * libtiff/tif_dirread.c: Another fix for the fetching SBYTE arrays + by the TIFFFetchByteArray() function. Should finally resolve + + http://bugzilla.remotesensing.org/show_bug.cgi?id=52 + + * configure: Set -DPIXARLOG_SUPPORT option along with -DZIP_SUPPORT + + * html/Makefile.in: New targets added: html and groffhtml for + producing HTML representations of the manual pages automatically. + html target uses man2html tool, groffhtml uses groff tool. + +2002-09-29 Frank Warmerdam + + * configure, libtiff/Makefile.in: Added SCO OpenServer 5.0.6 support + from John H. DuBois III. + +2002-09-15 Andrey Kiselev + + * Makefile.in, /man/{raw2tiff.1, Makefile.in, libtiff.3}: Added + manual page for raw2tiff(1) tool. + +2002-09-12 Andrey Kiselev + + * /libtiff/{tiffio.h, tif_dir.h}: TIFFDataWidth() declaration moved to + the tiffio.h header file. + + * Makefile.in, /man/{TIFFDataWidth.3t, Makefile.in, libtiff.3}: Added + manual page for TIFFDataWidth() function + +2002-09-08 Frank Warmerdam + + * libtiff/tif_dirread.c: Expand v[2] to v[4] in TIFFFetchShortPair() + as per http://bugzilla.remotesensing.org/show_bug.cgi?id=196. + + * tools/tiff2ps.c: Don't emit BeginData/EndData DSC comments + since we are unable to properly include the amount to skip. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=80 + +2002-09-02 Andrey Kiselev + + * /libtiff/tif_dirread.c: Fixed problem with SBYTE type data fetching + in TIFFFetchByteArray(). Problem described at + http://bugzilla.remotesensing.org/show_bug.cgi?id=52 + +2002-08-22 Andrey Kiselev + + * /libtiff/tif_dirinfo.c: Further additions to free custom fields + in _TIFFSetupFieldInfo() function. + See http://bugzilla.remotesensing.org/show_bug.cgi?id=169 for details. + + * /libtiff/tif_lzw.c: Additional consistency checking added in + LZWDecode() and LZWDecodeCompat(). + Fixes http://bugzilla.remotesensing.org/show_bug.cgi?id=190 + and http://bugzilla.remotesensing.org/show_bug.cgi?id=100 + + * /libtiff/tif_lzw.c: + Added check for valid code lengths in LZWDecode() and + LZWDecodeCompat(). Fixes + http://bugzilla.remotesensing.org/show_bug.cgi?id=115 + +2002-08-16 Andrey Kiselev + + * /libtiff/{Makefile.vc, libtiff.def}: + Missed declarations added. + +2002-08-15 Frank Warmerdam + + * tif_getimage.c: Ensure that TIFFRGBAImageBegin() returns the + return code from the underlying pick function. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=177 + + * tif_dir.h: changed FIELD_CODEC to 66 from 64 to avoid overlap + with FIELD_CUSTOM as mentioned in bug 169. + + * tif_close.c: added logic to free dynamically created anonymous + field definitions to correct a small memory leak. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=169 + +2002-08-10 Andrey Kiselev + + * /tools/{raw2tiff.c, Makefile.in, Makefile.lcc, Makefile.vc}: + New tool: raw2tiff --- raw images to TIFF converter. No manual page yet. + +2002-07-31 Frank Warmerdam + + * libtiff/tif_jpeg.c: Fixed problem with setting of nrows in + JPEGDecode() as per bugzilla bug (issue 1): + + http://bugzilla.remotesensing.org/show_bug.cgi?id=129 + + * libtiff/{tif_jpeg.c,tif_strip.c,tif_print.c}: Hacked tif_jpeg.c to + fetch TIFFTAG_YCBCRSUBSAMPLING from the jpeg data stream if it isn't + present in the tiff tags. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=168 + + * libtiff/tif_read.c, libtiff/tif_write.c: TIFFReadScanline() and + TIFFWriteScanline() now set tif_row explicitly in case the codec has + fooled with the value. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=129 + +2002-06-22 Andrey Kiselev + + * /tools/tiff2ps.c: Added workaround for some software that may crash + when last strip of image contains fewer number of scanlines than + specified by the `/Height' variable. See + http://bugzilla.remotesensing.org/show_bug.cgi?id=164 + for explanation. + +2002-06-21 Andrey Kiselev + + * tools/tiff2ps, man/tiff2ps.1: New functionality for tiff2ps utility: + splitting long images in several pages. See + http://bugzilla.remotesensing.org/show_bug.cgi?id=142 for explanation. + Patch granted by John Williams . + +2002-06-11 Frank Warmerdam + + * libtiff/contrib/win95: renamed to contrib/win_dib. Added new + Tiffile.cpp example of converting TIFF files into a DIB on Win32. + This one is described in: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=143 + + * libtiff/tif_ojpeg.c: Major upgrade from Scott. See details at: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=156 + +2002-05-10 Andrey Kiselev + + * tools/tiff2ps: New commandline switches to override resolution + units obtained from the input file. Closes + http://bugzilla.remotesensing.org/show_bug.cgi?id=131 + +2002-04-26 Andrey Kiselev + + * libtiff/libtiff.def: Added missed declaration. + +2002-04-22 Andrey Kiselev + + * tools/fax2tiff.c: Updated to reflect latest changes in libtiff. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=125 + +2002-04-20 Andrey Kiselev + + * libtiff/tif_open.c: Pointers to custom procedures + in TIFFClientOpen() are checked to be not NULL-pointers. + +2002-04-18 Andrey Kiselev + + * libtiff/libtiff.def: Added missed declarations. + + * libtiff/tif_pixarlog.c: Updated for using tif_tagmethods structure. + +2002-04-16 Andrey Kiselev + + * libtiff/tif_lzw.c: Additional checks for data integrity introduced. + Should finally close + http://bugzilla.remotesensing.org/show_bug.cgi?id=100 + +2002-04-10 Andrey Kiselev + + * tools/tiff2ps: Division by zero fixed. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=88 + +2002-04-09 Andrey Kiselev + + * libtiff/: tif_dirwrite.c, tif_write.c, tiffio.h: + TIFFCheckpointDirectory() routine added. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=124 + + * man/: TIFFWriteDirectory.3t, Makefile.in: Added description + for the new function. + +2002-04-08 Andrey Kiselev + + * libtiff/: tif_codec.c, tif_compress.c, tiffiop.h: Introduced + additional members tif->tif_decodestatus and tif->tif_encodestatus + for correct handling of unconfigured codecs (we should not try to read + data or to define data size without correct codecs). + + * libtiff/tif_getimage.c: The way of codecs checking in TIFFRGBAImageOK + changed. Now it has used tif->tif_decodestatus and + tif->tif_encodestatus. + Should fix http://bugzilla.remotesensing.org/show_bug.cgi?id=119 (in + case of __cvs_8.tif test image). + + * libtiff/: tif_dirinfo.c, tif_dirread.c: Somebody makes a bug in + tif_dirread.c when TIFFCreateAnonFieldInfo was introduced. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=119 in case + of _cvs_00000-00.tif, _cvs_00000-01.tif and _cvs_00000-02.tif. + +2002-04-04 Andrey Kiselev + + * libtiff/: tif_lzw.c: Assertions in LZWDecode and LZWDecodeCompat + replaced by warnings. Now libtiff should read corrupted LZW-compressed + files by skipping bad strips. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=100 + +2002-04-03 Frank Warmerdam + + * libtiff/tif_dirwrite.c: Removed some dead code. + + * libtiff/*: Cleanup some warnings. + + * libtiff/tif_dir.c: Fixed bug with count returned by TIFFGetField() + for variable length FIELD_CUSTOM values. Was int * but should be + u_short *. + +2002-04-01 Andrey Kiselev + + * tools/: tifcp.c: Added support for 'Orientation' tag in tiffcp + utility (at cpStripToTile routine). + +2002-03-27 Frank Warmerdam + + * tif_dirread.c: avoid div-by-zero if rowbytes is zero in chop func. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=111 + + * tif_print.c: Fixed so that ASCII FIELD_CUSTOM values with + passcount set FALSE can be printed (such as TIFFTAG_SOFTWARE). + + * libtiff/tif_dir.c,tif_dirinfo.c,tif_dir.h,tif_ojpeg.c: modified so + that TIFFTAG_SOFTWARE uses FIELD_CUSTOM as an example. + +2002-03-26 Dwight Kelly + + * libtiff/: tiff.h, tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, + tif_dirwrite.c: Added get/put code for new tag XMLPACKET as defined + in Adobe XMP Technote. Added missing INKSET tag value from TIFF 6.0 spec + INKSET_MULTIINK (=2). Added missing tags from Adobe TIFF technotes: + CLIPPATH, XCLIPPATHUNITS, YCLIPPATHUNITS, OPIIMAGEID, OPIPROXY and + INDEXED. Added PHOTOMETRIC tag value from TIFF technote 4 ICCLAB (=9). + +2002-03-26 Andrey Kiselev + + * libtiff/: tif_getimage.c: TIFFReadRGBAStrip and TIFFReadRGBATile + now also uses TIFFRGBAImageOK before reading. This is additional fix + for http://bugzilla.remotesensing.org/show_bug.cgi?id=110 + +2002-03-25 Andrey Kiselev + + * libtiff/: tif_getimage.c: Additional check for supported + codecs added in TIFFRGBAImageOK and TIFFReadRGBAImage now uses + TIFFRGBAImageOK before reading. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=110 + +2002-03-15 Andrey Kiselev + + * libtiff/: tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, + tif_dirwrite.c: Added routine TIFFDataWidth for detrmining + TIFFDataType sizes instead of working with tiffDataWidth array + directly. Should prevent out-of-borders bugs in case of unknown or + broken data types. EstimateStripByteCounts routine modified, so it + won't work when tags with uknown sizes founded. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=109 + +2002-03-13 Andrey Kiselev + + * libtiff/tif_getimage.c: Added support for correct handling + `Orientation' tag in gtTileContig. Should be added in other gt* + functions as well, but I have not images for testing yet. Partially + resolves http://bugzilla.remotesensing.org/show_bug.cgi?id=23 + +2002-03-10 Andrey Kiselev + + * libtiff/: tif_dirinfo.c, tif_dirwrite.c: Added possibility to + read broken TIFFs with LONG type used for TIFFTAG_COMPRESSION, + TIFFTAG_BITSPERSAMPLE, TIFFTAG_PHOTOMETRIC. Closes + http://bugzilla.remotesensing.org/show_bug.cgi?id=99 + +2002-03-08 Andrey Kiselev + + * libtiff/Makefile.in, tools/Makefile.in: Shared library will not + be stripped when installing, utility binaries will do. Closes + http://bugzilla.remotesensing.org/show_bug.cgi?id=93 + +2002-02-28 Frank Warmerdam + + * man/TIFFGetField: fixed type of TIFFTAG_COPYRIGHT. + + * man/libtiff.3t: added copyright tag info. + +2002-02-11 Frank Warmerdam + + * libtiff/{tiff.h,tif_fax3.c}: Add support for __arch64__. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=94 + + * man/Makefile.in: Patch DESTDIR handling + + http://bugzilla.remotesensing.org/show_bug.cgi?id=95 + + * configure: OpenBSD changes for Sparc64 and DSO version. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=96 + +2002-02-05 Frank Warmerdam + + * config.site/configure: added support for OJPEG=yes option to enable + OJPEG support from config.site. + +2002-01-27 Frank Warmerdam + + * html/document.html: fixed links for TIFf 6 docs. + +2002-01-18 Frank Warmerdam + + * config.guess, config.sub: Updated from ftp.gnu.org/pub/config. + + * libtiff/tif_read.c: Fixed TIFFReadEncodedStrip() to fail if the + decodestrip function returns anything not greater than zero as per + http://bugzilla.remotesensing.org/show_bug.cgi?id=97 + + * configure: Modify CheckForBigEndian so it can work in a cross + compiled situation. + +2002-01-16 Frank Warmerdam + + * tools/tiffdump.c: include TIFFTAG_JPEGTABLES in tag list. + + * tools/tiffset.c: fix bug in error reporting. + + * tools/tiffcp.c: fix several warnings that show up with -Wall. + +2002-01-04 Frank Warmerdam + + * libtiff/tif_jpeg.c: fixed computation of segment_width for + tiles files to avoid error about it not matching the + cinfo.d.image_width values ("JPEGPreDecode: Improper JPEG strip/tile + size.") for ITIFF files. Apparently the problem was incorporated since + 3.5.5, presumably during the OJPEG/JPEG work recently. + +2001-12-15 Frank Warmerdam + + * configure, libtiff/Makefile.in: Changes for building on MacOS 10.1. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=94 + + * libtiff/tif_getimage.c: If DEFAULT_EXTRASAMPLE_AS_ALPHA is 1 + (defined in tiffconf.h - 1 by default) then the RGBA interface + will assume that a fourth extra sample is ASSOCALPHA if the + EXTRASAMPLE value isn't set for it. This changes the behaviour of + the library, but makes it work better with RGBA files produced by + lots of applications that don't mark the alpha values properly. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=93 + http://bugzilla.remotesensing.org/show_bug.cgi?id=65 + +2001-12-12 Frank Warmerdam + + * libtiff/tif_jpeg.c: allow jpeg data stream sampling values to + override those from tiff directory. This makes this work with + ImageGear generated files. + +2001-12-07 Frank Warmerdam + + * html/Makefile.in: added missing images per bug 92. + + * port/Makefile.in: fixed clean target per bug 92. + +2001-11-28 Frank Warmerdam + + * Reissue 3.5.7 release. + + * libtiff/mkversion.c: Fix output of TIFF_VERSION to be + YYYYMMDD so that it is increasing over time. + + * Makefile.in: Ensure that tiffvers.h is regenerated in the + make release target. + + * Makefile.in: added libtiff/tiffvers.h to the release file list. + +2001-11-23 Frank Warmerdam + + * added html/v3.5.7.html, updated html/index.html. + + * Makefile.in: added contrib/addtiffo/tif_ovrcache.{c,h}. + +2001-11-15 Frank Warmerdam + + * configure: fixed test for -lm. + +2001-11-02 Frank Warmerdam + + * Added PHOTOMETRIC_ITULAB as per bug 90. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=90 + +2001-10-10 Frank Warmerdam + + * libtiff/tiff.h: I have created COMPRESSION_CCITT_T4, + COMPRESSION_CCITT_T6, TIFFTAG_T4OPTIONS and TIFFTAG_T6OPTIONS aliases + in keeping with TIFF 6.0 standard in tiff.h + + http://bugzilla.remotesensing.org/show_bug.cgi?id=83 + +2001-09-26 Frank Warmerdam + + * libtiff/tif_dirwrite.c: added TIFFRewriteDirectory() function. + Updated TIFFWriteDirectory man page to include TIFFRewriteDirectory. + +2001-09-24 Frank Warmerdam + + * libtiff/tif_lzw.c: Avoid MS VC++ 5.0 optimization bug. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=78 + + * libtiff/tif_lzw.c: added dummy LZWSetupEncode() to report an + error about LZW not being available. + + * libtiff/tif_dir.c: propagate failure to initialize compression + back from TIFFSetField() as an error status, so applications can + detect failure. + + * libtiff/tif_dir.c: removed the auto replacement of + COMPRESSION_LZW with COMPRESSION_NONE in _TIFFVSetField(). + + * Removed Makefile, tools/Makefile, port/install.sh, man/Makefile + from CVS as they are all supposed to be auto-generated by configure. + +2001-09-22 Frank Warmerdam + + * libtiff/tif_ojpeg.c: new update from Scott. + +2001-09-09 Frank Warmerdam + + * libtif/tif_fax3.c: Removed #ifdef PURIFY logic, and modified to + always use the "safe" version, even if there is a very slight + cost in performance. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=54 + + * libtiff/Makefile.in: Fixed @DSOSUB_VERSION to be @DSOSUF_VERSION@ + in two places. + + * libtiff/tif_getimage.c: Fixed problem with reading strips or + tiles that don't start on a tile boundary. Fix contributed by + Josep Vallverdu (from HP), and further described in bug 47. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=47 + + * tools/tiff2ps.c: added OJPEG YCbCr to RGB support. + + * libtiff/tif_ojpeg.c: Applied substantial patch from Scott. + +2001-09-06 Frank Warmerdam + + * libtiff/tif_packbits.c: fixed memory overrun error. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=77 + +2001-08-31 Frank Warmerdam + + * libtiff/tif_getimage.c: relax handling of contig case where + there are extra samples that are supposed to be ignored. This + should now work for 8bit greyscale or palletted images. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=75 + +2001-08-28 Frank Warmerdam + + * libtiff/tif_getimage.c: Don't complain for CMYK (separated) + images with more than four samples per pixel. See: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=73 + +2001-08-10 Frank Warmerdam + + * libtiff/tif_getimage.c: Use memmove() instead of TIFFmemcpy() + in TIFFReadRGBATile() to avoid issues in cases of overlapping + buffers. See Bug 69 in Bugzilla. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=69 + + * tools/tiff2rgba.c: fixed getopt() call so that -b works again. + +2001-08-09 Frank Warmerdam + + * libtiff/tiff.h, libtiff/tif_fax3.c: added check for __LP64__ + when checking for 64 bit architectures as per bugzilla bug 67. + +2001-07-27 Frank Warmerdam + + * man/Makefile.in: add TIFFClientOpen link as per debian submitted + bug 66. + +2001-07-20 Frank Warmerdam + + * libtiff/tif_jpeg.c: Define HAVE_BOOLEAN on windows if RPCNDR.H + has been included. + +2001-07-19 Frank Warmerdam + + * libtiff/tif_open.c: Seek back to zero after failed read, + before writing header. + +2001-07-18 Frank Warmerdam + + * libtiff/tif_ojpeg.c: updates from Scott. Handles colors + much better. Now depends on having patched libjpeg as per + patch in contrib/ojpeg/*. + +2001-07-17 Frank Warmerdam + + * */Makefile.in: added DESTDIR support. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=60 + +2001-07-16 Frank Warmerdam + + * configure, libtiff/Makefile.in: applied OpenBSD patches + as per: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=61 + +2001-06-28 Frank Warmerdam + + * libtiff/tif_getimage.c: Fixed so that failure is properly + reported by gtTileContig, gtStripContig, gtTileSeparate and + gtStripSeparate. + + See http://bugzilla.remotesensing.org/show_bug.cgi?id=51 + + * tiffcmp.c: Fixed multi samples per pixel support for ContigCompare. + Updated bug section of tiffcmp.1 to note tiled file issues. + + See http://bugzilla.remotesensing.org/show_bug.cgi?id=53 + +2001-06-22 Frank Warmerdam + + * configure: Changes for DSO generation on AIX provided by + John Marquart . + + * configure, libtiff/Makeifle.in: Modified to build DSOs properly + on Darwin thanks to Robert Krajewski (rpk@alum.mit.edu) and + Keisuke Fujii (fujiik@jlcuxf.kek.jp). + +2001-06-13 Frank Warmerdam + + * tools/tiff2rgba.c: added -n flag to avoid emitting alpha component. + + * man/tiff2rgba.1: new + +2001-05-22 Frank Warmerdam + + * Added tiffset and tif_ojpeg to the dist lists in Makefile.in. + +2001-05-13 Frank Warmerdam + + * libtiff/tools/thumbnail.c: changed default output compression + to packbits from LZW since LZW isn't generally available. + +2001-05-12 Frank Warmerdam + + * libtiff/tif_ojpeg.c: New. + libtiff/tif_jpeg.c, tiffconf.h, tif_getimage.c: changes related + to OJPEG support. + + Scott Marovich supplied OJPEG support. + +2001-05-11 Frank Warmerdam + + * tiff.h: removed, it duplicates libtiff/tiff.h. + +2001-05-08 Frank Warmerdam + + * libtiff/tif_dirinfo.c: moved pixar and copyright flags to + ensure everything is in order. + + * libtiff/libtiff.def: added TIFFCreateDirectory and + TIFFDefaultStripSize as per: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=46 + +2001-05-02 Frank Warmerdam + + * libtiff/tif_dirinfo.c: Modified the TIFF_BYTE definition for + TIFFTAG_PHOTOSHOP to use a writecount of TIFF_VARIABLE2 (-3) to + force use of uint32 counts instead of short counts. + + * libtiff/tif_dirwrite.c: Added support for TIFF_VARIABLE2 in the + case of writing TIFF_BYTE/TIFF_SBYTE fields. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=43 + +2001-05-01 Frank Warmerdam + + * libtiff/tif_dirinfo.c: removed duplicate TIFFTAG_PHOTOSHOP as per + bug report http://bugzilla.remotesensing.org/show_bug.cgi?id=44 + +2001-04-05 Frank Warmerdam + + * tiffio.h: removed C++ style comment. + + * configure: fixed up SCRIPT_SH/SHELL handling. + + * Makefile.in: Fixed SCRIPT_SH/SHELL handling. + + * config.guess: documented more variables as per bug 40. + +2001-04-03 Frank Warmerdam + + * configure, *Makefile.in: Various changes to improve configuration + for HP/UX specifically, and also in general. They include: + - Try to handle /usr/bin/sh instead of /bin/sh where necessary. + - Upgrade to HP/UX 10.x+ compiler, linker and dso options. + - Fixed mmap() test to avoid MMAP_FIXED ... it isn't available on HP + - Use -${MAKEFLAGS} in sub makes from makefiles. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=40 + +2001-04-02 Frank Warmerdam + + * libtiff/tiff.h: Applied hac to try and resolve the problem + with the inttypes.h include file on AIX. + + See http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + + * VERSION: update to 3.5.7 beta in preparation for release. + + * configure/config.site: modified to check if -lm is needed for + MACHDEPLIBS if not supplied by config.site. Needed for Darwin. + + * config.guess: updated wholesale to an FSF version apparently + from 1998 (as opposed to 1994). This is mainly inspired by + providing for MacOS X support. + +2001-03-29 Frank Warmerdam + + * configure, Makefile.in, etc: added support for OPTIMIZER being + set from config.site. + +2001-03-28 Frank Warmerdam + + * fax2ps.c: Helge (libtiff at oldach.net) submitted fix: + + Here's a fix for fax2ps that corrects behaviour for non-Letter paper + sizes. It fixes two problems: + + Without scaling (-S) the fax is now centered on the page size specified + with -H and/or -W. Before, fax2ps was using an obscure and practially + useless algorithm to allocate the image relative to Letter sized paper + which sometime sled to useless whitespace on the paper, while at the + same time cutting of the faxes printable area at the opposite border. + + Second, scaling now preserves aspect ratio, which makes unusual faxes + (in particular short ones) print properly. + + See http://bugzilla.remotesensing.org/show_bug.cgi?id=35 + + * tiff2ps.c/tiff2ps.1: Substantial changes to tiff2ps by + Bruce A. Mallett. See check message for detailed information + on all the changes, including a faster encoder, fixes for level + 2 PostScript, and support for the imagemask operator. + +2001-03-27 Frank Warmerdam + + * libtiff/tiffio.h: Changed "#if LOGLUV_PUBLIC" to + "#ifdef LOGLUV_PUBLIC" so it will work with VisualAge on AIX. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + +2001-03-16 Frank Warmerdam + + * tif_dirinfo.c: moved definition of copyright tag in field list. + Apparently they have to be in sorted order by tag id. + +2001-03-13 Frank Warmerdam + + * tif_getimage.c: Added support for 16bit minisblack/miniswhite + images in RGBA interface. + +2001-03-02 Frank Warmerdam + + * Added TIFFTAG_COPYRIGHT support. + +2001-02-19 Frank Warmerdam + + * Brent Roman contributed updated tiffcp utility (and tiffcp.1) + with support for extracting subimages with the ,n syntax, and also + adding the -b bias removal flag. + +2001-02-16 Frank Warmerdam + + * libtiff/libtiff.def: Brent Roman submitted new version adding + serveral missing entry points. + + * libtiff/tif_dirinfo.c: don't declare tiffFieldInfo static on VMS. + Some sort of weird VMS thing. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=31 + + * tif_luv.c/tiff.h/tiffio.h: + New version of TIFF LogLuv (SGILOG) modules contributed by Greg Ward + (greg@shutterfly.com). He writes: + + 1) I improved the gamut-mapping function in tif_luv.c for imaginary + colors, because some images were being super-saturated on the input + side and this resulted in some strange color shifts in the output. + + 2) I added a psuedotag in tiff.h to control random dithering during + LogLuv encoding. This is turned off by default for 32-bit LogLuv and + on for 24-bit LogLuv output. Dithering improves the average color + accuracy over the image. + + 3) I added a #define for LOG_LUV_PUBLIC, which is enabled by default in + tiffio.h, to expose internal routines for converting between LogLuv and + XYZ coordinates. This is helpful for writing more efficient, + specialized conversion routines, especially for reading LogLuv files. + + Changes applied with minor edits. + +2001-01-23 Frank Warmerdam + + * tif_fax3.c: keep rw_mode flag internal to fax3 state to remember + whether we are encoding or decoding. This is to ensure graceful + recovery if TIFFClientOpen() discovers an attempt to open a compressed + file for "r+" access, and subsequently close it, as it resets the + tif_mode flag to O_RDONLY in this case to avoid writes, confusing the + compressor's concept of whether it is in encode or decode mode. + +2001-01-08 Mike Welles + + * Makefile.in: Now cleaning up after itself after creating the .tar.gz and .zip + +2001-01-07 Frank Warmerdam + + * html/libtiff.html: Fixed arguments in example for TIFFRGBAImageGet() + as per bug report by Patrick Connor. + +2000-12-28 Frank Warmerdam + + * Added RELEASE-DATE file to release file list. + + * Fixed libtiff/makefile.vc to make tiffvers.h not version.h. + +2000-12-22 Mike Welles + * added link to CVS mirror from index.html + + * updated html/internals.html to note that LZW compression is + not supported by default. + +2000-12-22 Frank Warmerdam + + * updated html/libtiff.html to not point at Niles' old JPL web site + for the man pages, point at www.libtiff.org. + +2000-12-21 Frank Warmerdam + + * libtiff/tif_apple.c: Applied "Carbon" support patches supplied by + Leonard Rosenthol . May interfere + with correct building on older systems. If so, please let me know. + +2000-12-19 Mike Welles + + * Took out LZW Encoding from tif_lzw.c + + * Created HOWTO-RELEASE + + * Created html/v3.5.6.html + + * updated index.html + +2000-12-01 Frank Warmerdam + + * Added patches for EOFB support in tif_fax3.c and tif_fax3.h. + Patches supplied by Frank Cringle + Example file at: ftp://ftp.remotesensing.org/pub/libtiff/eofb_396.tif + +2000-11-24 Frank Warmerdam + + * libtiff/Makefile.in: Added an installPrivateHdrs and install-private + target so that the private headers required by libgeotiff can be + installed with the others. They are not installed by default. + + * libtiff/Makefile.in: Added @MACHLIBDEPS@ to LINUXdso and GNULDdso + targets so libtiff.so will be built with an explicit dependency + on libm.so. + + * libtiff/Makefile.in: Use softlinks to link libtiff.so.3 to + libtiff.so.3.5.5. + + * libtiff/Makefile.in & configure: Remove all references to the ALPHA + file, or ALPHA version logic. Added stuff about DIST_POINT in + place of DIST_TYPE and the alpha release number stuff. + +2000-11-22 Frank Warmerdam + + * I have applied a patch from Steffen Moeller to + the configure script so that it now accepts the --prefix, and + --exec-prefix directives. + +2000-11-13 Frank Warmerdam + + * I have made a variety of modifications in an effort to ensure the + TIFFLIB_VERSION macro is automatically generated from the RELEASE-DATE + file which seems to be updated regularly. + + o mkversion.c now reads RELEASE-DATE and emits TIFFLIB_VERSION in + version include file. + o renamed version.h to tiffvers.h because we now have to install it + with the public libtiff include files. + o include tiffvers.h in tiffio.h. + o updated tif_version.c to use tiffvers.h. + o Updated Makefile.in accordingly. + + * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=25 + I have updated the win32 detection rules in tiffcomp.h. + +2000-10-20 Frank Warmerdam + + * tif_getimage.c: Fixed RGBA translation for YCbCr images for which + the strip/tile width and height aren't multiples of the sampling size. + See http://bugzilla.remotesensing.org/show_bug.cgi?id=20 + Some patches from Rick LaMont of Dot C Software. + + * Modified tif_packbits.c encoder to avoid compressing more + data than provided if rowsize doesn't factor into provided data + (such as occurs for YCbCr). + +2000-10-19 Frank Warmerdam + + * tools/rgb2ycbcr.c: fixed output strip size to account for vertical + roundup if rows_per_strip not a multiple of vertical sample size. + +2000-10-16 Frank Warmerdam + + * tif_dir.c: Clear TIFF_ISTILED flag in TIFFDefaultDirectory + as per http://bugzilla.remotesensing.org/show_bug.cgi?id=18 + from vandrove@vc.cvut.cz. + + * Modified tif_packbits.c decoding to avoid overrunning the + output buffer, and to issue a warning if data needs to be + discarded. See http://bugzilla.remotesensing.org/show_bug.cgi?id=18 + +2000-10-12 Frank Warmerdam + + * Modified tiff2bw to ensure portions add to 100%, and that + white is properly recovered. + + See bug http://bugzilla.remotesensing.org/show_bug.cgi?id=15 + Patch c/o Stanislav Brabec + +2000-09-30 Frank Warmerdam + + * Modified TIFFClientOpen() to emit an error on an attempt to + open a comperessed file for update (O_RDWR/r+) access. This is + because the compressor/decompressor code gets very confused when + the mode is O_RDWR, assuming this means writing only. See + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=13 + +2000-09-27 Frank Warmerdam + + * Added GNULDdso target an`d switched linux and freebsd to use it. + +2000-09-26 Frank Warmerdam + + * Applied patch for 0x0000 sequences in tif_fax3.h's definition + of EXPAND1D() as per bug 11 (from Roman). + +2000-09-25 Frank Warmerdam + * Fixed tiffcomp.h to avoid win32 stuff if unix #defined, to improve + cygwin compatibility. + + * Applied patch from Roman Shpount to tif_fax3.c. This seems to + be a proper fix to the buffer sizing problem. See + http://bugzilla.remotesensing.org/show_bug.cgi?id=11 + + * Fixed tif_getimage.c to fix overrun bug with YCbCr images without + downsampling. http://bugzilla.remotesensing.org/show_bug.cgi?id=10 + Thanks to Nick Lamb for reporting the + bug and proving the patch. + +2000-09-18 Frank Warmerdam + + * Fixed tif_jpeg.c so avoid destroying the decompressor before + we are done access data thanks to bug report from: + Michael Eckstein . + + * Reverted tif_flush change. + +2000-09-14 Frank Warmerdam + + * tif_flush.c: Changed so that TIFFFlushData() doesn't return an + error when TIFF_BEENWRITING is not set. This ensures that the + directory contents can still be flushed by TIFFFlush(). + +2000-08-14 Frank Warmerdam + + * tif_open.c: Don't set MMAP for O_RDWR files. + + * tif_open.c: Set STRIPCHOP_DEFAULT for O_RDWR as well as O_RDONLY + so that files opened for update can be strip chopped too. + + * tif_read.c: fixed up bug with files missing rowsperstrip and + the strips per separation fix done a few weeks ago. + +2000-07-17 Frank Warmerdam + + * Tentatively added support for SAMPLEFORMAT_COMPLEXIEEEFP, and + SAMPLEFORMAT_COMPLEXINT. + +2000-07-13 Mike Welles + + * index.html, bugs.html: added bugzilla info. + +2000-07-12 Frank Warmerdam + + * tif_read.c: fix subtle bug with determining the number of + rows for strips that are the last strip in a separation but + not the last strip of all in TIFFReadEncodedStrip(). + + * Applied 16/32 bit fix to tif_fax3.c. Fix supplied by + Peter Skarpetis + +2000-06-15 Frank Warmerdam + + * Modified tiffio.h logic with regard to including windows.h. It + won't include it when building with __CYGWIN__. + +2000-05-11 Frank Warmerdam + + * README: update to mention www.libtiff.org, don't list Sam's old + email address. + + * configure: Fixed DSO test for Linux as per patch from + Jan Van Buggenhout . + +2000-04-21 Frank Warmerdam + + * libtiff/tif_dirread.c: Don't use estimate strip byte count for + one tile/strip images with an offset, and byte count of zero. These + could be "unpopulated" images. + +2000-04-18 Frank Warmerdam + + * contrib/addtiffo: Added "averaging" resampling option. + + * tools/tiffsplit.c: Copy TIFFTAG_SAMPLEFORMAT. + +Tue Apr 18 16:18:08 2000 Frank Warmerdam + + * tools/Makefile.in: Modified to install properly on SGI. + +2000-04-12 Mike Welles + * configure: Fixed stupid mistake in libc6 test on Linux + +2000-04-04 Mike Welles + * tif_win32.c: Applied patch to fix overreads and ovverwrites + caught by BoundsChecker. From Arvan Pritchard + (untested). + + * tif_getimage.c: Applied patch to silence VC6 warnings. From + Arvan Pritchard + + * tif_lzw.c: Applied patch to silence VC6 warnings. From + Arvan Pritchard + +2000-03-28 Frank Warmerdam + + * Added contrib/stream (stream io) code submitted by Avi Bleiweiss. + +2000-03-28 Frank Warmerdam *** 3.5.5 release *** + + * fax2ps: Fixed mixup of width and height in bounding box statement + as per submission by Nalin Dahyabhai . + +2000-03-27 Mike Welles + + * fax2ps: Modified printruns to take uint32 instead of uint16. + Patch courtesy of Bernt Herd + +2000-03-20 Mike Welles + + * configure: added test for libc6 for linux targets. Bug reported by + Stanislav Brabec + + * Added 3.5 docs to html/Makefile.in. + Thanks to Stanislav Brabec + + * configure: fixed bugs in sed scripts + (applied sed script s:/@:s;@:;s:/s;;:;: to configure). + fix submitted to Stanislav Brabec + + * tools/iptcutil was not in files list, and wasn't being + added to tar archive. Updated Makefile.in. + +2000-03-17 Frank Warmerdam + + * tif_fax3.c: Fixed serious bug introduced during the uint16->uint32 + conversion for the run arrays. + +2000-03-03 Frank Warmerdam + + * Set td_sampleformat default to SAMPLEFORMAT_UINT instead of + SAMPLEFORMAT_VOID in TIFFDefaultDirectory() in tif_dir.c. + +2000-03-02 Frank Warmerdam + + * Added "GetDefaulted" support for TIFFTAG_SAMPLEFORMAT in tif_aux.c. + + * Patched tif_fax3.c so that dsp->runs is allocated a bit bigger + to avoid overruns encountered with frle_bug.tif. + +Tue Feb 15 22:01:05 2000 Frank Warmerdam + + * Fixed tools/tiffcmp so that stopondiff testing works. + Patch care of Joseph Orost . + +2000-01-28 + + * Modified tif_unix.c to support 2-4GB seeks if USE_64BIT_API is + set to 1, and added default (off) setting in tiffconf.h. This + should eventually be set by the configure script somehow. + + The original work on all these 2-4GB changes was done by + Peter Smith (psmith@creo.com). + + * Modified tif_win32.c to support 2-4GB seeks. + + * tentatively changed toff_t to be unsigned instead of signed to + facilitate support for 2-4GB files. + + * Updated a variety of files to use toff_t. Fixed some mixups + between toff_t and tsize_t. + +Fri Jan 28 10:13:49 2000 Frank Warmerdam + + * Largely reimplemented contrib/addtiffo to avoid temp files, + updating the TIFF file in place. Fixed a few other bugs to. + + * Set tif_rawdatasize to zero when freeing raw data buffer in + TIFFWriteDirectory(). + + * Enabled "REWRITE_HACK" in tif_write.c by default. + + * Fix bug in tif_write.c when switching between reading one directory + and writing to another. + + * Made TIFFWriteCheck() public, and added TIFFCreateDirectory() + +Wed Jan 5 12:37:48 2000 Frank Warmerdam + + * Added TIFFmemory(3t) functions to libtiff.def. + +Tue Jan 4 13:39:00 2000 Frank Warmerdam + + * Added libtiff/libtiff.def to TIFFILES distribution list. + +Mon Dec 27 12:13:39 EST 1999 Mike Welles + + * Created lzw compression kit, as a new module (libtiff-lzw-compression-kit). + + * Altered descriptions in tools to reflect "by default" lzw not supported + + * Updated index.html to note lzw compression kit. + +Tue Dec 21 14:01:51 1999 Frank Warmerdam + + * Added fax3sm_winnt.c to distribution list in Makefile.in. + +Tue Dec 21 11:04:45 EST 1999 Mike Welles *** 3.5.4 release *** + + * Aadded Pixar tag support. Contributed by Phil Beffery + + * Made one more change to tif_dir.c for removal of LZW compression. Also added notice + when LZW compression invoked. + + * Changed default compression in tools to TIFF_PACKBITS, and changed usage descriptions + in tools to reflect removal of LZW compression + +Mon Dec 20 18:39:02 EST 1999 Mike Welles + + * Fixed bug that caused LZW (non) compression to segfault. Added + warning about LZW compression removed being removed, and why. + + * Added nostrip to install in tools/Makefile.in so that debugging + symbols are kept. + +Tue Dec 7 12:04:47 EST 1999 Mike Welles + + * Added patch from Ivo Penzar , + supporting Adobe ZIP deflate. Untested. + +Sat Dec 4 15:47:11 1999 Frank Warmerdam + + * Made Packbits the default compression in tools/tiff2rgba.c instead + of LZW. + +Tue Nov 30 14:41:43 1999 Frank Warmerdam *** 3.5.3. release *** + + * Added tif_luv to contrib/djgpp/Makefile.lib. + +Tue Nov 30 14:15:32 EST 1999 Mike Welles + + * Added zip creation to relase makefile target + + * Added html for TIFFWriteTile.3t man page. + +Tue Nov 30 09:20:16 1999 Frank Warmerdam + + * Added some changes to tif_write.c to support rewriting existing + fixed sized tiles and strips. Code mods disabled by default, only + enabled if REWRITE_HACK is defined for now. + +Mon Nov 29 11:43:42 1999 Frank Warmerdam + + * Added TIFFWriteTile.3t man page. + +Sun Nov 28 20:36:18 1999 Frank Warmerdam + + * Added notes on use of makefile.vc in build.html, and fixed + email subscription address. + +199-11-28 Mike Welles + + * Fixed apocalypse-inducing y2k bug in contrib/ras/ras2tiff.c + + * Did some casts cleaning up to reduce compiler warnings in tif_fax3.c, + from Bruce Carmeron -- modifications of + changes made by Frank (sun cc still complained on cast). + + * Added tiffconf.h to install target per request from Bill + Radcliffe : "We need a way for ImageMagick to + know features have been compiled into the TIFF library in order to + handle things properly". + +Sat Nov 27 16:49:21 1999 Frank Warmerdam + + * fixed various VC++ warnings as suggested by Gilles Vollant + . + +Wed Nov 24 12:08:16 1999 Frank Warmerdam + + * Modified TIFFquery.3t man pages info on TIFFIsByteSwapped() to + not imply applications are responsible for image data swapping. + +1999-11-22 Mike Welles + * HTML-ized the man pages, added to html/man + + * Removed LZW Compression to comply with Unisys patent extortion. + +1999-09-29 Mike Welles + * Corrected one remaining 16 -> 32 bit value in tif_fax3.c, + From Ivo Penzar + +1999-09-26 Mike Welles *** 3.5.2 release *** + * Corrected alpha versioning. + + * Removed distinction between alpha and release targets in Makefile.in. + + * added release.stamp target, which tags cvs tree, and updates + "RELEASE-DATE" + + * added releasediff target, which diffs tree with source as of + date in "RELEASE-DATE" + + * Ticked up version to 3.5.2 (alpha 01 -- but I think we'll moving + away from alpha/non-alpha distinctions). + + * updated html to reflect release + +1999-09-23 + + * Set O_BINARY for tif_unix.c open() ... used on cygwin for instance. + + * Added CYGWIN case in configure. + +Fri Sep 17 00:13:51 CEST 1999 Mike Welles + + * Applied Francois Dagand's patch to handle fax decompression bug. + (sizes >= 65536 were failing) + +Tue Sep 14 21:31:43 1999 Frank Warmerdam + + * Applied "a" mode fix to tif_win32.c/TIFFOpen() as suggested + by Christopher Lawton + +Wed Sep 8 08:19:18 1999 Frank Warmerdam + + * Added IRIX/gcc, and OSF/1 4.x support on behalf of + Albert Chin-A-Young + + * Added TIFFReassignTagToIgnore() API on behalf of + Bruce Cameron . Man page still pending. + +Wed Aug 25 11:39:07 1999 Frank Warmerdam + + * Added test target in Makefile, test_pics.sh script and pics/*.rpt + files to provide for a rudimentary testsuite. + + * Added contrib/tags back from old distribution ... fixed up a bit. + +1999-08-16 + + * Added simple makefile.vc makefiles for building with MS VC++ + on Windows NT/98/95 in console mode. Stuff in contrib/win* make give + better solutions for some users. + +Mon Aug 16 21:52:11 1999 Frank Warmerdam + + * Added addtiffo (add overviews to a TIFF file) in contrib. Didn't + put it in tools since part of it is in C++. + +1999-08-16 Michael L. Welles + + * Updated html/index.html with anon CVS instructions. + +Mon Aug 16 13:18:41 1999 Frank Warmerdam + + * pre-remove so link before softlink in LINUXdso action in + libtiff/Makefile.in to avoid failure on LINUXdso builds other than + the first. + + * Fixed problem with cvtcmap() in tif_getimage.c modifying the + colormaps owned by the TIFF handle itself when trying to fixup wrong + (eight bit) colormaps. Corrected by maintaining a private copy of + the colormap. + + * Added TIFFReadRGBATile()/TIFFReadRGBAStrip() support in + tif_getimage.c. + + * CVS Repository placed at remotesensing.org. ChangeLog added. diff --git a/src/3rdparty/libtiff/HOWTO-RELEASE b/src/3rdparty/libtiff/HOWTO-RELEASE new file mode 100644 index 0000000000..d6035a5c85 --- /dev/null +++ b/src/3rdparty/libtiff/HOWTO-RELEASE @@ -0,0 +1,105 @@ +HOWTO-RELEASE: + +Notes on releasing. + +0. Make sure that you have current FSF releases of autoconf, automake, + and libtool packages installed under a common installation prefix + and that these tools are in your executable search path prior to + any other installed versions. Versions delivered with Linux may be + altered so it is best to install official FSF releases. GNU 'm4' + 1.4.6 or later is needed in order to avoid bugs in m4. These + packages may be downloaded from the following ftp locations: + + autoconf - ftp://ftp.gnu.org/pub/gnu/autoconf + automake - ftp://ftp.gnu.org/pub/gnu/automake + libtool - ftp://ftp.gnu.org/pub/gnu/libtool + + Release builds should only be done on a system with a functioning + and correctly set system clock and on a filesystem which accurately + records file update times. Use of GNU make is recommended. + +1. Commit any unsaved changes. + +2. Create html/vX.X.html. Take ChangeLog entries and html-ify in there. + Easist thing to do is take html/vX.(X-1).html and use it as a template. + Add that file to the list of EXTRA_DIST files in the html/Makefile.am. + +3. Update html/index.html to refer to this new page as the current release. + +4. Increment the release version in configure.ac. Put 'alpha' or + 'beta' after the version, if applicable. For example: + + 3.9.1 + or + 3.9.1beta + + Version should be updated in two places: in the second argument of the + AC_INIT macro and in LIBTIFF_xxx_VERSION variables. + +5. Add an entry to Changelog similar to: + + * libtiff 3.9.1 released. + +6. In the source tree do + + ./autogen.sh + + This step may be skipped if you have already been using a + maintainer build with current autoconf, automake, and libtool + packages. It is only needed when updating tool versions. + +7. It is recommended (but not required) to build outside of the source + tree so that the source tree is kept in a pristine state. This + also allows sharing the source directory on several networked + systems. For example: + + mkdir libtiff-build + cd libtiff-build + /path/to/libtiff/configure --enable-maintainer-mode + + otherwise do + + ./configure --enable-maintainer-mode + +8. In the build tree do + + make release + + This will update "RELEASE-DATE", "VERSION", and libtiff/tiffvers.h + in the source tree. + +9. In the source tree, verify that the version info in RELEASE-DATE, + VERSION and libtiff/tiffvers.h is right. + +10. In the build tree do + + make + make distcheck + + If 'make distcheck' fails, then correct any issues until it + succeeds. + + Two files with names tiff-version.tar.gz and tiff-version.zip will + be created in the top level build directory. + +11. In the source tree do + + 'cvs commit'. + +12. In the source tree do + + cvs tag Release-v3-9-1 + + (or the appropriate name for the release) + +13. Copy release packages from the build tree to the + ftp.remotesensing.org ftp site. + + scp tiff-*.tar.gz tiff-*.zip \ + frankw@upload.osgeo.org:/osgeo/download/libtiff + +14. Announce to list, tiff@lists.maptools.org + +15. Update libtiff page on freshmeat with new version announcement. + + diff --git a/src/3rdparty/libtiff/README b/src/3rdparty/libtiff/README new file mode 100644 index 0000000000..c0e5521d8a --- /dev/null +++ b/src/3rdparty/libtiff/README @@ -0,0 +1,59 @@ +$Header: /cvs/maptools/cvsroot/libtiff/README,v 1.5 2004/10/30 13:44:45 dron Exp $ + + +TIFF Software Distribution +-------------------------- +This file is just a placeholder; all the documentation is now in +HTML in the html directory. To view the documentation point your +favorite WWW viewer at html/index.html; e.g. + + netscape html/index.html + +If you don't have an HTML viewer then you can read the HTML source +or fetch a PostScript version of this documentation from the directory + + ftp://ftp.remotesensing.org/pub/libtiff/ + +If you can't hack either of these options then basically what you +want to do is: + + % ./configure + % make + % su + # make install + +More information, email contacts, and mailing list information can be +found online at http://www.remotesensing.org/libtiff/. + + +Use and Copyright +----------------- +Silicon Graphics has seen fit to allow us to give this work away. It +is free. There is no support or guarantee of any sort as to its +operations, correctness, or whatever. If you do anything useful with +all or parts of it you need to honor the copyright notices. I would +also be interested in knowing about it and, hopefully, be acknowledged. + +The legal way of saying that is: + +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. diff --git a/src/3rdparty/libtiff/README.vms b/src/3rdparty/libtiff/README.vms new file mode 100644 index 0000000000..44d9663927 --- /dev/null +++ b/src/3rdparty/libtiff/README.vms @@ -0,0 +1,12 @@ +Dear OpenVMS user +to make this library, execute +$@CONFIGURE +$@BUILD + +Build process should be error and warning free. When process will be finished, +LIBTIFF$STRATUP.COM file containing all required definitions, will be created. +Please call it from system startup procedure or individual user procedure LOGIN.COM +To link software with libtiff, use TIFF:LIBTIFF.OPT + +best regards, +Alexey Chupahin, elvis_75@mail.ru diff --git a/src/3rdparty/libtiff/RELEASE-DATE b/src/3rdparty/libtiff/RELEASE-DATE new file mode 100644 index 0000000000..1f15bfe5c4 --- /dev/null +++ b/src/3rdparty/libtiff/RELEASE-DATE @@ -0,0 +1 @@ +20091104 diff --git a/src/3rdparty/libtiff/SConstruct b/src/3rdparty/libtiff/SConstruct new file mode 100644 index 0000000000..682246ea06 --- /dev/null +++ b/src/3rdparty/libtiff/SConstruct @@ -0,0 +1,171 @@ +# $Id: SConstruct,v 1.4 2007/02/24 15:03:47 dron Exp $ + +# Tag Image File Format (TIFF) Software +# +# Copyright (C) 2005, Andrey Kiselev +# +# Permission to use, copy, modify, distribute, and sell this software and +# its documentation for any purpose is hereby granted without fee, provided +# that (i) the above copyright notices and this permission notice appear in +# all copies of the software and related documentation, and (ii) the names of +# Sam Leffler and Silicon Graphics may not be used in any advertising or +# publicity relating to the software without the specific, prior written +# permission of Sam Leffler and Silicon Graphics. +# +# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +# +# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +# OF THIS SOFTWARE. + +# This file contains rules to build software with the SCons tool +# (see the http://www.scons.org/ for details on SCons). + +import os + +env = Environment() + +# Read the user supplied options +opts = Options('libtiff.conf') +opts.Add(PathOption('PREFIX', \ + 'install architecture-independent files in this directory', \ + '/usr/local', PathOption.PathIsDirCreate)) +opts.Add(BoolOption('ccitt', \ + 'enable support for CCITT Group 3 & 4 algorithms', \ + 'yes')) +opts.Add(BoolOption('packbits', \ + 'enable support for Macintosh PackBits algorithm', \ + 'yes')) +opts.Add(BoolOption('lzw', \ + 'enable support for LZW algorithm', \ + 'yes')) +opts.Add(BoolOption('thunder', \ + 'enable support for ThunderScan 4-bit RLE algorithm', \ + 'yes')) +opts.Add(BoolOption('next', \ + 'enable support for NeXT 2-bit RLE algorithm', \ + 'yes')) +opts.Add(BoolOption('logluv', \ + 'enable support for LogLuv high dynamic range encoding', \ + 'yes')) +opts.Add(BoolOption('strip_chopping', \ + 'support for strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of ~8Kb to reduce memory usage)', \ + 'yes')) +opts.Add(BoolOption('extrasample_as_alpha', \ + 'the RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don\'t mark the alpha properly', \ + 'yes')) +opts.Add(BoolOption('check_ycbcr_subsampling', \ + 'disable picking up YCbCr subsampling info from the JPEG data stream to support files lacking the tag', \ + 'yes')) +opts.Update(env) +opts.Save('libtiff.conf', env) +Help(opts.GenerateHelpText(env)) + +# Here are our installation paths: +idir_prefix = '$PREFIX' +idir_lib = '$PREFIX/lib' +idir_bin = '$PREFIX/bin' +idir_inc = '$PREFIX/include' +idir_doc = '$PREFIX/doc' +Export([ 'env', 'idir_prefix', 'idir_lib', 'idir_bin', 'idir_inc', 'idir_doc' ]) + +# Now proceed to system feature checks +target_cpu, target_vendor, target_kernel, target_os = \ + os.popen("./config/config.guess").readlines()[0].split("-") + +def Define(context, key, have): + import SCons.Conftest + SCons.Conftest._Have(context, key, have) + +def CheckCustomOption(context, name): + context.Message('Checking is the ' + name + ' option set... ') + ret = env[name] + Define(context, name + '_SUPPORT', ret) + context.Result(ret) + return ret + +def CheckFillorderOption(context): + context.Message('Checking for the native cpu bit order... ') + if target_cpu[0] == 'i' and target_cpu[2:] == '86': + Define(context, 'HOST_FILLORDER', 'FILLORDER_LSB2MSB') + context.Result('lsb2msb') + else: + Define(context, 'HOST_FILLORDER', 'FILLORDER_MSB2LSB') + context.Result('msb2lsb') + return 1 + +def CheckIEEEFPOption(context): + context.Message('Checking for the IEEE floating point format... ') + Define(context, 'HAVE_IEEEFP', 1) + context.Result(1) + return 1 + +def CheckOtherOption(context, name): + context.Message('Checking is the ' + name + ' option set... ') + ret = env[name] + Define(context, 'HAVE_' + name, ret) + context.Result(ret) + return ret + +custom_tests = { \ + 'CheckCustomOption' : CheckCustomOption, \ + 'CheckFillorderOption' : CheckFillorderOption, \ + 'CheckIEEEFPOption' : CheckIEEEFPOption, \ + 'CheckOtherOption' : CheckOtherOption \ + } +conf = Configure(env, custom_tests = custom_tests, \ + config_h = 'libtiff/tif_config.h') + +# Check for standard library +conf.CheckLib('c') +if target_os != 'cygwin' \ + and target_os != 'mingw32' \ + and target_os != 'beos' \ + and target_os != 'darwin': + conf.CheckLib('m') + +# Check for system headers +conf.CheckCHeader('assert.h') +conf.CheckCHeader('fcntl.h') +conf.CheckCHeader('io.h') +conf.CheckCHeader('limits.h') +conf.CheckCHeader('malloc.h') +conf.CheckCHeader('search.h') +conf.CheckCHeader('sys/time.h') +conf.CheckCHeader('unistd.h') + +# Check for standard library functions +conf.CheckFunc('floor') +conf.CheckFunc('isascii') +conf.CheckFunc('memmove') +conf.CheckFunc('memset') +conf.CheckFunc('mmap') +conf.CheckFunc('pow') +conf.CheckFunc('setmode') +conf.CheckFunc('sqrt') +conf.CheckFunc('strchr') +conf.CheckFunc('strrchr') +conf.CheckFunc('strstr') +conf.CheckFunc('strtol') + +conf.CheckFillorderOption() +conf.CheckIEEEFPOption() +conf.CheckCustomOption('ccitt') +conf.CheckCustomOption('packbits') +conf.CheckCustomOption('lzw') +conf.CheckCustomOption('thunder') +conf.CheckCustomOption('next') +conf.CheckCustomOption('logluv') +conf.CheckOtherOption('strip_chopping') +conf.CheckOtherOption('extrasample_as_alpha') +conf.CheckOtherOption('check_ycbcr_subsampling') + +env = conf.Finish() + +# Ok, now go to build files in the subdirectories +SConscript(dirs = [ 'libtiff' ], name = 'SConstruct') diff --git a/src/3rdparty/libtiff/TODO b/src/3rdparty/libtiff/TODO new file mode 100644 index 0000000000..6c58eb045d --- /dev/null +++ b/src/3rdparty/libtiff/TODO @@ -0,0 +1,12 @@ +# $Header: /cvs/maptools/cvsroot/libtiff/TODO,v 1.6 2002/10/10 05:28:43 warmerda Exp $ + +o gif2tiff segaulting on selected images +o tiffcmp read data by strip/tile instead of scanline +o YCbCr sampling support +o extracate colorspace conversion support +o look at isolating all codecs from TIFF library +o JPEG colormode order dependency problem +o Write documentation on how do extend tags, and how the custom field + stuff all works. + + diff --git a/src/3rdparty/libtiff/VERSION b/src/3rdparty/libtiff/VERSION new file mode 100644 index 0000000000..2009c7dfad --- /dev/null +++ b/src/3rdparty/libtiff/VERSION @@ -0,0 +1 @@ +3.9.2 diff --git a/src/3rdparty/libtiff/html/TIFFTechNote2.html b/src/3rdparty/libtiff/html/TIFFTechNote2.html new file mode 100644 index 0000000000..92bace4660 --- /dev/null +++ b/src/3rdparty/libtiff/html/TIFFTechNote2.html @@ -0,0 +1,707 @@ +
      +DRAFT TIFF Technical Note #2				17-Mar-95
      +============================
      +
      +This Technical Note describes serious problems that have been found in
      +TIFF 6.0's design for embedding JPEG-compressed data in TIFF (Section 22
      +of the TIFF 6.0 spec of 3 June 1992).  A replacement TIFF/JPEG
      +specification is given.  Some corrections to Section 21 are also given.
      +
      +To permit TIFF implementations to continue to read existing files, the 6.0
      +JPEG fields and tag values will remain reserved indefinitely.  However,
      +TIFF writers are strongly discouraged from using the 6.0 JPEG design.  It
      +is expected that the next full release of the TIFF specification will not
      +describe the old design at all, except to note that certain tag numbers
      +are reserved.  The existing Section 22 will be replaced by the
      +specification text given in the second part of this Tech Note.
      +
      +
      +Problems in TIFF 6.0 JPEG
      +=========================
      +
      +Abandoning a published spec is not a step to be taken lightly.  This
      +section summarizes the reasons that have forced this decision.
      +TIFF 6.0's JPEG design suffers from design errors and limitations,
      +ambiguities, and unnecessary complexity.
      +
      +
      +Design errors and limitations
      +-----------------------------
      +
      +The fundamental design error in the existing Section 22 is that JPEG's
      +various tables and parameters are broken out as separate fields which the
      +TIFF control logic must manage.  This is bad software engineering: that
      +information should be treated as private to the JPEG codec
      +(compressor/decompressor).  Worse, the fields themselves are specified
      +without sufficient thought for future extension and without regard to
      +well-established TIFF conventions.  Here are some of the significant
      +problems:
      +
      +* The JPEGxxTable fields do not store the table data directly in the
      +IFD/field structure; rather, the fields hold pointers to information
      +elsewhere in the file.  This requires special-purpose code to be added to
      +*every* TIFF-manipulating application, whether it needs to decode JPEG
      +image data or not.  Even a trivial TIFF editor, for example a program to
      +add an ImageDescription field to a TIFF file, must be explicitly aware of
      +the internal structure of the JPEG-related tables, or else it will probably
      +break the file.  Every other auxiliary field in the TIFF spec contains
      +data, not pointers, and can be copied or relocated by standard code that
      +doesn't know anything about the particular field.  This is a crucial
      +property of the TIFF format that must not be given up.
      +
      +* To manipulate these fields, the TIFF control logic is required to know a
      +great deal about JPEG details, for example such arcana as how to compute
      +the length of a Huffman code table --- the length is not supplied in the
      +field structure and can only be found by inspecting the table contents.
      +This is again a violation of good software practice.  Moreover, it will
      +prevent easy adoption of future JPEG extensions that might change these
      +low-level details.
      +
      +* The design neglects the fact that baseline JPEG codecs support only two
      +sets of Huffman tables: it specifies a separate table for each color
      +component.  This implies that encoders must waste space (by storing
      +duplicate Huffman tables) or else violate the well-founded TIFF convention
      +that prohibits duplicate pointers.  Furthermore, baseline decoders must
      +test to find out which tables are identical, a waste of time and code
      +space.
      +
      +* The JPEGInterchangeFormat field also violates TIFF's proscription against
      +duplicate pointers: the normal strip/tile pointers are expected to point
      +into the larger data area pointed to by JPEGInterchangeFormat.  All TIFF
      +editing applications must be specifically aware of this relationship, since
      +they must maintain it or else delete the JPEGInterchangeFormat field.  The
      +JPEGxxTables fields are also likely to point into the JPEGInterchangeFormat
      +area, creating additional pointer relationships that must be maintained.
      +
      +* The JPEGQTables field is fixed at a byte per table entry; there is no
      +way to support 16-bit quantization values.  This is a serious impediment
      +to extending TIFF to use 12-bit JPEG.
      +
      +* The 6.0 design cannot support using different quantization tables in
      +different strips/tiles of an image (so as to encode some areas at higher
      +quality than others).  Furthermore, since quantization tables are tied
      +one-for-one to color components, the design cannot support table switching
      +options that are likely to be added in future JPEG revisions.
      +
      +
      +Ambiguities
      +-----------
      +
      +Several incompatible interpretations are possible for 6.0's treatment of
      +JPEG restart markers:
      +
      +  * It is unclear whether restart markers must be omitted at TIFF segment
      +    (strip/tile) boundaries, or whether they are optional.
      +
      +  * It is unclear whether the segment size is required to be chosen as
      +    a multiple of the specified restart interval (if any); perhaps the
      +    JPEG codec is supposed to be reset at each segment boundary as if
      +    there were a restart marker there, even if the boundary does not fall
      +    at a multiple of the nominal restart interval.
      +
      +  * The spec fails to address the question of restart marker numbering:
      +    do the numbers begin again within each segment, or not?
      +
      +That last point is particularly nasty.  If we make numbering begin again
      +within each segment, we give up the ability to impose a TIFF strip/tile
      +structure on an existing JPEG datastream with restarts (which was clearly a
      +goal of Section 22's authors).  But the other choice interferes with random
      +access to the image segments: a reader must compute the first restart
      +number to be expected within a segment, and must have a way to reset its
      +JPEG decoder to expect a nonzero restart number first.  This may not even
      +be possible with some JPEG chips.
      +
      +The tile height restriction found on page 104 contradicts Section 15's
      +general description of tiles.  For an image that is not vertically
      +downsampled, page 104 specifies a tile height of one MCU or 8 pixels; but
      +Section 15 requires tiles to be a multiple of 16 pixels high.
      +
      +This Tech Note does not attempt to resolve these ambiguities, so
      +implementations that follow the 6.0 design should be aware that
      +inter-application compatibility problems are likely to arise.
      +
      +
      +Unnecessary complexity
      +----------------------
      +
      +The 6.0 design creates problems for implementations that need to keep the
      +JPEG codec separate from the TIFF control logic --- for example, consider
      +using a JPEG chip that was not designed specifically for TIFF.  JPEG codecs
      +generally want to produce or consume a standard ISO JPEG datastream, not
      +just raw compressed data.  (If they were to handle raw data, a separate
      +out-of-band mechanism would be needed to load tables into the codec.)
      +With such a codec, the TIFF control logic must parse JPEG markers emitted
      +by the codec to create the TIFF table fields (when writing) or synthesize
      +JPEG markers from the TIFF fields to feed the codec (when reading).  This
      +means that the control logic must know a great deal more about JPEG details
      +than we would like.  The parsing and reconstruction of the markers also
      +represents a fair amount of unnecessary work.
      +
      +Quite a few implementors have proposed writing "TIFF/JPEG" files in which
      +a standard JPEG datastream is simply dumped into the file and pointed to
      +by JPEGInterchangeFormat.  To avoid parsing the JPEG datastream, they
      +suggest not writing the JPEG auxiliary fields (JPEGxxTables etc) nor even
      +the basic TIFF strip/tile data pointers.  This approach is incompatible
      +with implementations that handle the full TIFF 6.0 JPEG design, since they
      +will expect to find strip/tile pointers and auxiliary fields.  Indeed this
      +is arguably not TIFF at all, since *all* TIFF-reading applications expect
      +to find strip or tile pointers.  A subset implementation that is not
      +upward-compatible with the full spec is clearly unacceptable.  However,
      +the frequency with which this idea has come up makes it clear that
      +implementors find the existing Section 22 too complex.
      +
      +
      +Overview of the solution
      +========================
      +
      +To solve these problems, we adopt a new design for embedding
      +JPEG-compressed data in TIFF files.  The new design uses only complete,
      +uninterpreted ISO JPEG datastreams, so it should be much more forgiving of
      +extensions to the ISO standard.  It should also be far easier to implement
      +using unmodified JPEG codecs.
      +
      +To reduce overhead in multi-segment TIFF files, we allow JPEG overhead
      +tables to be stored just once in a JPEGTables auxiliary field.  This
      +feature does not violate the integrity of the JPEG datastreams, because it
      +uses the notions of "tables-only datastreams" and "abbreviated image
      +datastreams" as defined by the ISO standard.
      +
      +To prevent confusion with the old design, the new design is given a new
      +Compression tag value, Compression=7.  Readers that need to handle
      +existing 6.0 JPEG files may read both old and new files, using whatever
      +interpretation of the 6.0 spec they did before.  Compression tag value 6
      +and the field tag numbers defined by 6.0 section 22 will remain reserved
      +indefinitely, even though detailed descriptions of them will be dropped
      +from future editions of the TIFF specification.
      +
      +
      +Replacement TIFF/JPEG specification
      +===================================
      +
      +[This section of the Tech Note is expected to replace Section 22 in the
      +next release of the TIFF specification.]
      +
      +This section describes TIFF compression scheme 7, a high-performance
      +compression method for continuous-tone images.
      +
      +Introduction
      +------------
      +
      +This TIFF compression method uses the international standard for image
      +compression ISO/IEC 10918-1, usually known as "JPEG" (after the original
      +name of the standards committee, Joint Photographic Experts Group).  JPEG
      +is a joint ISO/CCITT standard for compression of continuous-tone images.
      +
      +The JPEG committee decided that because of the broad scope of the standard,
      +no one algorithmic procedure was able to satisfy the requirements of all
      +applications.  Instead, the JPEG standard became a "toolkit" of multiple
      +algorithms and optional capabilities.  Individual applications may select
      +a subset of the JPEG standard that meets their requirements.
      +
      +The most important distinction among the JPEG processes is between lossy
      +and lossless compression.  Lossy compression methods provide high
      +compression but allow only approximate reconstruction of the original
      +image.  JPEG's lossy processes allow the encoder to trade off compressed
      +file size against reconstruction fidelity over a wide range.  Typically,
      +10:1 or more compression of full-color data can be obtained while keeping
      +the reconstructed image visually indistinguishable from the original.  Much
      +higher compression ratios are possible if a low-quality reconstructed image
      +is acceptable.  Lossless compression provides exact reconstruction of the
      +source data, but the achievable compression ratio is much lower than for
      +the lossy processes; JPEG's rather simple lossless process typically
      +achieves around 2:1 compression of full-color data.
      +
      +The most widely implemented JPEG subset is the "baseline" JPEG process.
      +This provides lossy compression of 8-bit-per-channel data.  Optional
      +extensions include 12-bit-per-channel data, arithmetic entropy coding for
      +better compression, and progressive/hierarchical representations.  The
      +lossless process is an independent algorithm that has little in
      +common with the lossy processes.
      +
      +It should be noted that the optional arithmetic-coding extension is subject
      +to several US and Japanese patents.  To avoid patent problems, use of
      +arithmetic coding processes in TIFF files intended for inter-application
      +interchange is discouraged.
      +
      +All of the JPEG processes are useful only for "continuous tone" data,
      +in which the difference between adjacent pixel values is usually small.
      +Low-bit-depth source data is not appropriate for JPEG compression, nor
      +are palette-color images good candidates.  The JPEG processes work well
      +on grayscale and full-color data.
      +
      +Describing the JPEG compression algorithms in sufficient detail to permit
      +implementation would require more space than we have here.  Instead, we
      +refer the reader to the References section.
      +
      +
      +What data is being compressed?
      +------------------------------
      +
      +In lossy JPEG compression, it is customary to convert color source data
      +to YCbCr and then downsample it before JPEG compression.  This gives
      +2:1 data compression with hardly any visible image degradation, and it
      +permits additional space savings within the JPEG compression step proper.
      +However, these steps are not considered part of the ISO JPEG standard.
      +The ISO standard is "color blind": it accepts data in any color space.
      +
      +For TIFF purposes, the JPEG compression tag is considered to represent the
      +ISO JPEG compression standard only.  The ISO standard is applied to the
      +same data that would be stored in the TIFF file if no compression were
      +used.  Therefore, if color conversion or downsampling are used, they must
      +be reflected in the regular TIFF fields; these steps are not considered to
      +be implicit in the JPEG compression tag value.  PhotometricInterpretation
      +and related fields shall describe the color space actually stored in the
      +file.  With the TIFF 6.0 field definitions, downsampling is permissible
      +only for YCbCr data, and it must correspond to the YCbCrSubSampling field.
      +(Note that the default value for this field is not 1,1; so the default for
      +YCbCr is to apply downsampling!)  It is likely that future versions of TIFF
      +will provide additional PhotometricInterpretation values and a more general
      +way of defining subsampling, so as to allow more flexibility in
      +JPEG-compressed files.  But that issue is not addressed in this Tech Note.
      +
      +Implementors should note that many popular JPEG codecs
      +(compressor/decompressors) provide automatic color conversion and
      +downsampling, so that the application may supply full-size RGB data which
      +is nonetheless converted to downsampled YCbCr.  This is an implementation
      +convenience which does not excuse the TIFF control layer from its
      +responsibility to know what is really going on.  The
      +PhotometricInterpretation and subsampling fields written to the file must
      +describe what is actually in the file.
      +
      +A JPEG-compressed TIFF file will typically have PhotometricInterpretation =
      +YCbCr and YCbCrSubSampling = [2,1] or [2,2], unless the source data was
      +grayscale or CMYK.
      +
      +
      +Basic representation of JPEG-compressed images
      +----------------------------------------------
      +
      +JPEG compression works in either strip-based or tile-based TIFF files.
      +Rather than repeating "strip or tile" constantly, we will use the term
      +"segment" to mean either a strip or a tile.
      +
      +When the Compression field has the value 7, each image segment contains
      +a complete JPEG datastream which is valid according to the ISO JPEG
      +standard (ISO/IEC 10918-1).  Any sequential JPEG process can be used,
      +including lossless JPEG, but progressive and hierarchical processes are not
      +supported.  Since JPEG is useful only for continuous-tone images, the
      +PhotometricInterpretation of the image shall not be 3 (palette color) nor
      +4 (transparency mask).  The bit depth of the data is also restricted as
      +specified below.
      +
      +Each image segment in a JPEG-compressed TIFF file shall contain a valid
      +JPEG datastream according to the ISO JPEG standard's rules for
      +interchange-format or abbreviated-image-format data.  The datastream shall
      +contain a single JPEG frame storing that segment of the image.  The
      +required JPEG markers within a segment are:
      +	SOI	(must appear at very beginning of segment)
      +	SOFn
      +	SOS	(one for each scan, if there is more than one scan)
      +	EOI	(must appear at very end of segment)
      +The actual compressed data follows SOS; it may contain RSTn markers if DRI
      +is used.
      +
      +Additional JPEG "tables and miscellaneous" markers may appear between SOI
      +and SOFn, between SOFn and SOS, and before each subsequent SOS if there is
      +more than one scan.  These markers include:
      +	DQT
      +	DHT
      +	DAC	(not to appear unless arithmetic coding is used)
      +	DRI
      +	APPn	(shall be ignored by TIFF readers)
      +	COM	(shall be ignored by TIFF readers)
      +DNL markers shall not be used in TIFF files.  Readers should abort if any
      +other marker type is found, especially the JPEG reserved markers;
      +occurrence of such a marker is likely to indicate a JPEG extension.
      +
      +The tables/miscellaneous markers may appear in any order.  Readers are
      +cautioned that although the SOFn marker refers to DQT tables, JPEG does not
      +require those tables to precede the SOFn, only the SOS.  Missing-table
      +checks should be made when SOS is reached.
      +
      +If no JPEGTables field is used, then each image segment shall be a complete
      +JPEG interchange datastream.  Each segment must define all the tables it
      +references.  To allow readers to decode segments in any order, no segment
      +may rely on tables being carried over from a previous segment.
      +
      +When a JPEGTables field is used, image segments may omit tables that have
      +been specified in the JPEGTables field.  Further details appear below.
      +
      +The SOFn marker shall be of type SOF0 for strict baseline JPEG data, of
      +type SOF1 for non-baseline lossy JPEG data, or of type SOF3 for lossless
      +JPEG data.  (SOF9 or SOF11 would be used for arithmetic coding.)  All
      +segments of a JPEG-compressed TIFF image shall use the same JPEG
      +compression process, in particular the same SOFn type.
      +
      +The data precision field of the SOFn marker shall agree with the TIFF
      +BitsPerSample field.  (Note that when PlanarConfiguration=1, this implies
      +that all components must have the same BitsPerSample value; when
      +PlanarConfiguration=2, different components could have different bit
      +depths.)  For SOF0 only precision 8 is permitted; for SOF1, precision 8 or
      +12 is permitted; for SOF3, precisions 2 to 16 are permitted.
      +
      +The image dimensions given in the SOFn marker shall agree with the logical
      +dimensions of that particular strip or tile.  For strip images, the SOFn
      +image width shall equal ImageWidth and the height shall equal RowsPerStrip,
      +except in the last strip; its SOFn height shall equal the number of rows
      +remaining in the ImageLength.  (In other words, no padding data is counted
      +in the SOFn dimensions.)  For tile images, each SOFn shall have width
      +TileWidth and height TileHeight; adding and removing any padding needed in
      +the edge tiles is the concern of some higher level of the TIFF software.
      +(The dimensional rules are slightly different when PlanarConfiguration=2,
      +as described below.)
      +
      +The ISO JPEG standard only permits images up to 65535 pixels in width or
      +height, due to 2-byte fields in the SOFn markers.  In TIFF, this limits
      +the size of an individual JPEG-compressed strip or tile, but the total
      +image size can be greater.
      +
      +The number of components in the JPEG datastream shall equal SamplesPerPixel
      +for PlanarConfiguration=1, and shall be 1 for PlanarConfiguration=2.  The
      +components shall be stored in the same order as they are described at the
      +TIFF field level.  (This applies both to their order in the SOFn marker,
      +and to the order in which they are scanned if multiple JPEG scans are
      +used.)  The component ID bytes are arbitrary so long as each component
      +within an image segment is given a distinct ID.  To avoid any possible
      +confusion, we require that all segments of a TIFF image use the same ID
      +code for a given component.
      +
      +In PlanarConfiguration 1, the sampling factors given in SOFn markers shall
      +agree with the sampling factors defined by the related TIFF fields (or with
      +the default values that are specified in the absence of those fields).
      +
      +When DCT-based JPEG is used in a strip TIFF file, RowsPerStrip is required
      +to be a multiple of 8 times the largest vertical sampling factor, i.e., a
      +multiple of the height of an interleaved MCU.  (For simplicity of
      +specification, we require this even if the data is not actually
      +interleaved.)  For example, if YCbCrSubSampling = [2,2] then RowsPerStrip
      +must be a multiple of 16.  An exception to this rule is made for
      +single-strip images (RowsPerStrip >= ImageLength): the exact value of
      +RowsPerStrip is unimportant in that case.  This rule ensures that no data
      +padding is needed at the bottom of a strip, except perhaps the last strip.
      +Any padding required at the right edge of the image, or at the bottom of
      +the last strip, is expected to occur internally to the JPEG codec.
      +
      +When DCT-based JPEG is used in a tiled TIFF file, TileLength is required
      +to be a multiple of 8 times the largest vertical sampling factor, i.e.,
      +a multiple of the height of an interleaved MCU; and TileWidth is required
      +to be a multiple of 8 times the largest horizontal sampling factor, i.e.,
      +a multiple of the width of an interleaved MCU.  (For simplicity of
      +specification, we require this even if the data is not actually
      +interleaved.)  All edge padding required will therefore occur in the course
      +of normal TIFF tile padding; it is not special to JPEG.
      +
      +Lossless JPEG does not impose these constraints on strip and tile sizes,
      +since it is not DCT-based.
      +
      +Note that within JPEG datastreams, multibyte values appear in the MSB-first
      +order specified by the JPEG standard, regardless of the byte ordering of
      +the surrounding TIFF file.
      +
      +
      +JPEGTables field
      +----------------
      +
      +The only auxiliary TIFF field added for Compression=7 is the optional
      +JPEGTables field.  The purpose of JPEGTables is to predefine JPEG
      +quantization and/or Huffman tables for subsequent use by JPEG image
      +segments.  When this is done, these rather bulky tables need not be
      +duplicated in each segment, thus saving space and processing time.
      +JPEGTables may be used even in a single-segment file, although there is no
      +space savings in that case.
      +
      +JPEGTables:
      +	Tag = 347 (15B.H)
      +	Type = UNDEFINED
      +	N = number of bytes in tables datastream, typically a few hundred
      +JPEGTables provides default JPEG quantization and/or Huffman tables which
      +are used whenever a segment datastream does not contain its own tables, as
      +specified below.
      +
      +Notice that the JPEGTables field is required to have type code UNDEFINED,
      +not type code BYTE.  This is to cue readers that expanding individual bytes
      +to short or long integers is not appropriate.  A TIFF reader will generally
      +need to store the field value as an uninterpreted byte sequence until it is
      +fed to the JPEG decoder.
      +
      +Multibyte quantities within the tables follow the ISO JPEG convention of
      +MSB-first storage, regardless of the byte ordering of the surrounding TIFF
      +file.
      +
      +When the JPEGTables field is present, it shall contain a valid JPEG
      +"abbreviated table specification" datastream.  This datastream shall begin
      +with SOI and end with EOI.  It may contain zero or more JPEG "tables and
      +miscellaneous" markers, namely:
      +	DQT
      +	DHT
      +	DAC	(not to appear unless arithmetic coding is used)
      +	DRI
      +	APPn	(shall be ignored by TIFF readers)
      +	COM	(shall be ignored by TIFF readers)
      +Since JPEG defines the SOI marker to reset the DAC and DRI state, these two
      +markers' values cannot be carried over into any image datastream, and thus
      +they are effectively no-ops in the JPEGTables field.  To avoid confusion,
      +it is recommended that writers not place DAC or DRI markers in JPEGTables.
      +However readers must properly skip over them if they appear.
      +
      +When JPEGTables is present, readers shall load the table specifications
      +contained in JPEGTables before processing image segment datastreams.
      +Image segments may simply refer to these preloaded tables without defining
      +them.  An image segment can still define and use its own tables, subject to
      +the restrictions below.
      +
      +An image segment may not redefine any table defined in JPEGTables.  (This
      +restriction is imposed to allow readers to process image segments in random
      +order without having to reload JPEGTables between segments.)  Therefore, use
      +of JPEGTables divides the available table slots into two groups: "global"
      +slots are defined in JPEGTables and may be used but not redefined by
      +segments; "local" slots are available for local definition and use in each
      +segment.  To permit random access, a segment may not reference any local
      +tables that it does not itself define.
      +
      +
      +Special considerations for PlanarConfiguration 2
      +------------------------------------------------
      +
      +In PlanarConfiguration 2, each image segment contains data for only one
      +color component.  To avoid confusing the JPEG codec, we wish the segments
      +to look like valid single-channel (i.e., grayscale) JPEG datastreams.  This
      +means that different rules must be used for the SOFn parameters.
      +
      +In PlanarConfiguration 2, the dimensions given in the SOFn of a subsampled
      +component shall be scaled down by the sampling factors compared to the SOFn
      +dimensions that would be used in PlanarConfiguration 1.  This is necessary
      +to match the actual number of samples stored in that segment, so that the
      +JPEG codec doesn't complain about too much or too little data.  In strip
      +TIFF files the computed dimensions may need to be rounded up to the next
      +integer; in tiled files, the restrictions on tile size make this case
      +impossible.
      +
      +Furthermore, all SOFn sampling factors shall be given as 1.  (This is
      +merely to avoid confusion, since the sampling factors in a single-channel
      +JPEG datastream have no real effect.)
      +
      +Any downsampling will need to happen externally to the JPEG codec, since
      +JPEG sampling factors are defined with reference to the full-precision
      +component.  In PlanarConfiguration 2, the JPEG codec will be working on
      +only one component at a time and thus will have no reference component to
      +downsample against.
      +
      +
      +Minimum requirements for TIFF/JPEG
      +----------------------------------
      +
      +ISO JPEG is a large and complex standard; most implementations support only
      +a subset of it.  Here we define a "core" subset of TIFF/JPEG which readers
      +must support to claim TIFF/JPEG compatibility.  For maximum
      +cross-application compatibility, we recommend that writers confine
      +themselves to this subset unless there is very good reason to do otherwise.
      +
      +Use the ISO baseline JPEG process: 8-bit data precision, Huffman coding,
      +with no more than 2 DC and 2 AC Huffman tables.  Note that this implies
      +BitsPerSample = 8 for each component.  We recommend deviating from baseline
      +JPEG only if 12-bit data precision or lossless coding is required.
      +
      +Use no subsampling (all JPEG sampling factors = 1) for color spaces other
      +than YCbCr.  (This is, in fact, required with the TIFF 6.0 field
      +definitions, but may not be so in future revisions.)  For YCbCr, use one of
      +the following choices:
      +	YCbCrSubSampling field		JPEG sampling factors
      +	1,1				1h1v, 1h1v, 1h1v
      +	2,1				2h1v, 1h1v, 1h1v
      +	2,2  (default value)		2h2v, 1h1v, 1h1v
      +We recommend that RGB source data be converted to YCbCr for best compression
      +results.  Other source data colorspaces should probably be left alone.
      +Minimal readers need not support JPEG images with colorspaces other than
      +YCbCr and grayscale (PhotometricInterpretation = 6 or 1).
      +
      +A minimal reader also need not support JPEG YCbCr images with nondefault
      +values of YCbCrCoefficients or YCbCrPositioning, nor with values of
      +ReferenceBlackWhite other than [0,255,128,255,128,255].  (These values
      +correspond to the RGB<=>YCbCr conversion specified by JFIF, which is widely
      +implemented in JPEG codecs.)
      +
      +Writers are reminded that a ReferenceBlackWhite field *must* be included
      +when PhotometricInterpretation is YCbCr, because the default
      +ReferenceBlackWhite values are inappropriate for YCbCr.
      +
      +If any subsampling is used, PlanarConfiguration=1 is preferred to avoid the
      +possibly-confusing requirements of PlanarConfiguration=2.  In any case,
      +readers are not required to support PlanarConfiguration=2.
      +
      +If possible, use a single interleaved scan in each image segment.  This is
      +not legal JPEG if there are more than 4 SamplesPerPixel or if the sampling
      +factors are such that more than 10 blocks would be needed per MCU; in that
      +case, use a separate scan for each component.  (The recommended color
      +spaces and sampling factors will not run into that restriction, so a
      +minimal reader need not support more than one scan per segment.)
      +
      +To claim TIFF/JPEG compatibility, readers shall support multiple-strip TIFF
      +files and the optional JPEGTables field; it is not acceptable to read only
      +single-datastream files.  Support for tiled TIFF files is strongly
      +recommended but not required.
      +
      +
      +Other recommendations for implementors
      +--------------------------------------
      +
      +The TIFF tag Compression=7 guarantees only that the compressed data is
      +represented as ISO JPEG datastreams.  Since JPEG is a large and evolving
      +standard, readers should apply careful error checking to the JPEG markers
      +to ensure that the compression process is within their capabilities.  In
      +particular, to avoid being confused by future extensions to the JPEG
      +standard, it is important to abort if unknown marker codes are seen.
      +
      +The point of requiring that all image segments use the same JPEG process is
      +to ensure that a reader need check only one segment to determine whether it
      +can handle the image.  For example, consider a TIFF reader that has access
      +to fast but restricted JPEG hardware, as well as a slower, more general
      +software implementation.  It is desirable to check only one image segment
      +to find out whether the fast hardware can be used.  Thus, writers should
      +try to ensure that all segments of an image look as much "alike" as
      +possible: there should be no variation in scan layout, use of options such
      +as DRI, etc.  Ideally, segments will be processed identically except
      +perhaps for using different local quantization or entropy-coding tables.
      +
      +Writers should avoid including "noise" JPEG markers (COM and APPn markers).
      +Standard TIFF fields provide a better way to transport any non-image data.
      +Some JPEG codecs may change behavior if they see an APPn marker they
      +think they understand; since the TIFF spec requires these markers to be
      +ignored, this behavior is undesirable.
      +
      +It is possible to convert an interchange-JPEG file (e.g., a JFIF file) to
      +TIFF simply by dropping the interchange datastream into a single strip.
      +(However, designers are reminded that the TIFF spec discourages huge
      +strips; splitting the image is somewhat more work but may give better
      +results.)  Conversion from TIFF to interchange JPEG is more complex.  A
      +strip-based TIFF/JPEG file can be converted fairly easily if all strips use
      +identical JPEG tables and no RSTn markers: just delete the overhead markers
      +and insert RSTn markers between strips.  Converting tiled images is harder,
      +since the data will usually not be in the right order (unless the tiles are
      +only one MCU high).  This can still be done losslessly, but it will require
      +undoing and redoing the entropy coding so that the DC coefficient
      +differences can be updated.
      +
      +There is no default value for JPEGTables: standard TIFF files must define all
      +tables that they reference.  For some closed systems in which many files will
      +have identical tables, it might make sense to define a default JPEGTables
      +value to avoid actually storing the tables.  Or even better, invent a
      +private field selecting one of N default JPEGTables settings, so as to allow
      +for future expansion.  Either of these must be regarded as a private
      +extension that will render the files unreadable by other applications.
      +
      +
      +References
      +----------
      +
      +[1] Wallace, Gregory K.  "The JPEG Still Picture Compression Standard",
      +Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
      +
      +This is the best short technical introduction to the JPEG algorithms.
      +It is a good overview but does not provide sufficiently detailed
      +information to write an implementation.
      +
      +[2] Pennebaker, William B. and Mitchell, Joan L.  "JPEG Still Image Data
      +Compression Standard", Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
      +638pp.
      +
      +This textbook is by far the most complete exposition of JPEG in existence.
      +It includes the full text of the ISO JPEG standards (DIS 10918-1 and draft
      +DIS 10918-2).  No would-be JPEG implementor should be without it.
      +
      +[3] ISO/IEC IS 10918-1, "Digital Compression and Coding of Continuous-tone
      +Still Images, Part 1: Requirements and guidelines", February 1994.
      +ISO/IEC DIS 10918-2, "Digital Compression and Coding of Continuous-tone
      +Still Images, Part 2: Compliance testing", final approval expected 1994.
      +
      +These are the official standards documents.  Note that the Pennebaker and
      +Mitchell textbook is likely to be cheaper and more useful than the official
      +standards.
      +
      +
      +Changes to Section 21: YCbCr Images
      +===================================
      +
      +[This section of the Tech Note clarifies section 21 to make clear the
      +interpretation of image dimensions in a subsampled image.  Furthermore,
      +the section is changed to allow the original image dimensions not to be
      +multiples of the sampling factors.  This change is necessary to support use
      +of JPEG compression on odd-size images.]
      +
      +Add the following paragraphs to the Section 21 introduction (p. 89),
      +just after the paragraph beginning "When a Class Y image is subsampled":
      +
      +	In a subsampled image, it is understood that all TIFF image
      +	dimensions are measured in terms of the highest-resolution
      +	(luminance) component.  In particular, ImageWidth, ImageLength,
      +	RowsPerStrip, TileWidth, TileLength, XResolution, and YResolution
      +	are measured in luminance samples.
      +
      +	RowsPerStrip, TileWidth, and TileLength are constrained so that
      +	there are an integral number of samples of each component in a
      +	complete strip or tile.  However, ImageWidth/ImageLength are not
      +	constrained.  If an odd-size image is to be converted to subsampled
      +	format, the writer should pad the source data to a multiple of the
      +	sampling factors by replication of the last column and/or row, then
      +	downsample.  The number of luminance samples actually stored in the
      +	file will be a multiple of the sampling factors.  Conversely,
      +	readers must ignore any extra data (outside the specified image
      +	dimensions) after upsampling.
      +
      +	When PlanarConfiguration=2, each strip or tile covers the same
      +	image area despite subsampling; that is, the total number of strips
      +	or tiles in the image is the same for each component.  Therefore
      +	strips or tiles of the subsampled components contain fewer samples
      +	than strips or tiles of the luminance component.
      +
      +	If there are extra samples per pixel (see field ExtraSamples),
      +	these data channels have the same number of samples as the
      +	luminance component.
      +
      +Rewrite the YCbCrSubSampling field description (pp 91-92) as follows
      +(largely to eliminate possibly-misleading references to
      +ImageWidth/ImageLength of the subsampled components):
      +
      +	(first paragraph unchanged)
      +
      +	The two elements of this field are defined as follows:
      +
      +	Short 0: ChromaSubsampleHoriz:
      +
      +	1 = there are equal numbers of luma and chroma samples horizontally.
      +
      +	2 = there are twice as many luma samples as chroma samples
      +	horizontally.
      +
      +	4 = there are four times as many luma samples as chroma samples
      +	horizontally.
      +
      +	Short 1: ChromaSubsampleVert:
      +
      +	1 = there are equal numbers of luma and chroma samples vertically.
      +
      +	2 = there are twice as many luma samples as chroma samples
      +	vertically.
      +
      +	4 = there are four times as many luma samples as chroma samples
      +	vertically.
      +
      +	ChromaSubsampleVert shall always be less than or equal to
      +	ChromaSubsampleHoriz.  Note that Cb and Cr have the same sampling
      +	ratios.
      +
      +	In a strip TIFF file, RowsPerStrip is required to be an integer
      +	multiple of ChromaSubSampleVert (unless RowsPerStrip >=
      +	ImageLength, in which case its exact value is unimportant).
      +	If ImageWidth and ImageLength are not multiples of
      +	ChromaSubsampleHoriz and ChromaSubsampleVert respectively, then the
      +	source data shall be padded to the next integer multiple of these
      +	values before downsampling.
      +
      +	In a tiled TIFF file, TileWidth must be an integer multiple of
      +	ChromaSubsampleHoriz and TileLength must be an integer multiple of
      +	ChromaSubsampleVert.  Padding will occur to tile boundaries.
      +
      +	The default values of this field are [ 2,2 ].  Thus, YCbCr data is
      +	downsampled by default!
      +
      diff --git a/src/3rdparty/libtiff/html/addingtags.html b/src/3rdparty/libtiff/html/addingtags.html new file mode 100644 index 0000000000..452821c2d0 --- /dev/null +++ b/src/3rdparty/libtiff/html/addingtags.html @@ -0,0 +1,292 @@ + + + +Modifying The TIFF Library + + + + + +

      +Defining New TIFF Tags +

      + +Libtiff has built-in knowledge of all the standard TIFF tags, as +well as extentions. The following describes how to add knowledge of +new tags as builtins to libtiff, or how to application specific tags can +be used by applications without modifying libtiff. +

      + +

      TIFFFieldInfo

      + +How libtiff manages specific tags is primarily controlled by the +definition for that tag value stored internally as a TIFFFieldInfo structure. +This structure looks like this: +

      + +

      +typedef	struct {
      +  ttag_t    field_tag;          /* field's tag */
      +  short	    field_readcount;    /* read count/TIFF_VARIABLE/TIFF_SPP */
      +  short	    field_writecount;   /* write count/TIFF_VARIABLE */
      +  TIFFDataType field_type;      /* type of associated data */
      +  unsigned short field_bit;     /* bit in fieldsset bit vector */
      +  unsigned char field_oktochange;/* if true, can change while writing */
      +  unsigned char field_passcount;/* if true, pass dir count on set */
      +  char	*field_name;		/* ASCII name */
      +} TIFFFieldInfo;
      +
      + +
        +
      • field_tag: the tag number. For instance 277 for the +SamplesPerPixel tag. Builtin tags will generally have a #define in +tiff.h for each known tag.

        + +

      • field_readcount: The number of values which should be read. +The special value TIFF_VARIABLE (-1) indicates that a variable number of +values may be read. The special value TIFFTAG_SPP (-2) indicates that there +should be one value for each sample as defined by TIFFTAG_SAMPLESPERPIXEL. +The special value TIFF_VARIABLE2 (-3) is presumably similar to TIFF_VARIABLE +though I am not sure what the distinction in behaviour is. This field +is TIFF_VARIABLE for variable length ascii fields.

        + +

      • field_writecount: The number of values which should be written. +Generally the same as field_readcount. A few built-in exceptions exist, but +I haven't analysed why they differ.

        + +

      • field_type: Type of the field. One of TIFF_BYTE, TIFF_ASCII, +TIFF_SHORT, TIFF_LONG, TIFF_RATIONAL, TIFF_SBYTE, TIFF_UNDEFINED, +TIFF_SSHORT, TIFF_SLONG, TIFF_SRATIONAL, TIFF_FLOAT, TIFF_DOUBLE or +TIFF_IFD. Note that some fields can support more than one type (for +instance short and long). These fields should have multiple TIFFFieldInfos. +

        + +

      • field_bit: Built-in tags stored in special fields in the +TIFF structure have assigned field numbers to distinguish them (ie. +FIELD_SAMPLESPERPIXEL). New tags should generally just use +FIELD_CUSTOM indicating they are stored in the generic tag list.

        + +

      • field_oktochange: TRUE if it is OK to change this tag value +while an image is being written. FALSE for stuff that must be set once +and then left unchanged (like ImageWidth, or PhotometricInterpretation for +instance).

        + +

      • field_passcount: If TRUE, then the count value must be passed +in TIFFSetField(), and TIFFGetField(), otherwise the count is not required. +This should generally be TRUE for non-ascii variable count tags unless +the count is implicit (such as with the colormap).

        + +

      • field_name: A name for the tag. Normally mixed case (studly caps) +like "StripByteCounts" and relatively short.

        + +

      + +A TIFFFieldInfo definition exists for each built-in tag in the tif_dirinfo.c +file. Some tags which support multiple data types have more than one +definition, one per data type supported.

      + +Various functions exist for getting the internal TIFFFieldInfo definitions, +including _TIFFFindFieldInfo(), and _TIFFFindFieldInfoByName(). See +tif_dirinfo.c for details. There must be some mechanism to get the whole +list, though I don't see it off hand.

      + +

      Default Tag Auto-registration

      + +In libtiff 3.6.0 a new mechanism was introduced allowing libtiff to +read unrecognised tags automatically. When an unknown tags is encountered, +it is automatically internally defined with a default name and a type +derived from the tag value in the file. Applications only need to predefine +application specific tags if they need to be able to set them in a file, or +if particular calling conventions are desired for TIFFSetField() and +TIFFGetField().

      + +When tags are autodefined like this the field_readcount and +field_writecount values are always TIFF_VARIABLE. The +field_passcount is always TRUE, and the field_bit is +FIELD_CUSTOM. The field name will be "Tag %d" where the %d is the tag +number.

      + +

      Defining Application Tags

      + +For various reasons, it is common for applications to want to define +their own tags to store information outside the core TIFF specification. +This is done by calling TIFFMergeFieldInfo() with one or more TIFFFieldInfos. +

      + +The libgeotiff library provides geospatial information extentions within +a TIFF file. First, a set of TIFFFieldInfo's is prepared with information +on the new tags:

      + +

      +static const TIFFFieldInfo xtiffFieldInfo[] = {
      +  
      +  /* XXX Insert Your tags here */
      +    { TIFFTAG_GEOPIXELSCALE,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
      +      TRUE,	TRUE,	"GeoPixelScale" },
      +    { TIFFTAG_GEOTRANSMATRIX,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
      +      TRUE,	TRUE,	"GeoTransformationMatrix" },
      +    { TIFFTAG_GEOTIEPOINTS,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
      +      TRUE,	TRUE,	"GeoTiePoints" },
      +    { TIFFTAG_GEOKEYDIRECTORY, -1,-1, TIFF_SHORT,	FIELD_CUSTOM,
      +      TRUE,	TRUE,	"GeoKeyDirectory" },
      +    { TIFFTAG_GEODOUBLEPARAMS,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
      +      TRUE,	TRUE,	"GeoDoubleParams" },
      +    { TIFFTAG_GEOASCIIPARAMS,	-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
      +      TRUE,	FALSE,	"GeoASCIIParams" }
      +};
      +
      + +In order to define the tags, we call TIFFMergeFieldInfo() on the +desired TIFF handle with the list of TIFFFieldInfos.

      + +

      +#define	N(a)	(sizeof (a) / sizeof (a[0]))
      +
      +    /* Install the extended Tag field info */
      +    TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
      +
      + +The tags need to be defined for each TIFF file opened - and when reading +they should be defined before the tags of the file are read, yet a valid +TIFF * is needed to merge the tags against. In order to get them +registered at the appropriate part of the setup process, it is necessary +to register our merge function as an extender callback with libtiff. +This is done with TIFFSetTagExtender(). We also keep track of the +previous tag extender (if any) so that we can call it from our extender +allowing a chain of customizations to take effect.

      + +

      +static TIFFExtendProc _ParentExtender = NULL;
      +
      +static
      +void _XTIFFInitialize(void)
      +{
      +    static int first_time=1;
      +	
      +    if (! first_time) return; /* Been there. Done that. */
      +    first_time = 0;
      +	
      +    /* Grab the inherited method and install */
      +    _ParentExtender = TIFFSetTagExtender(_XTIFFDefaultDirectory);
      +}
      +
      + +The extender callback is looks like this. It merges in our new fields +and then calls the next extender if there is one in effect.

      + +

      +static void
      +_XTIFFDefaultDirectory(TIFF *tif)
      +{
      +    /* Install the extended Tag field info */
      +    TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
      +
      +    /* Since an XTIFF client module may have overridden
      +     * the default directory method, we call it now to
      +     * allow it to set up the rest of its own methods.
      +     */
      +
      +    if (_ParentExtender) 
      +        (*_ParentExtender)(tif);
      +}
      +
      + +The above approach ensures that our new definitions are used when reading +or writing any TIFF file. However, since on reading we already have +default definitions for tags, it is usually not critical to pre-define them. +If tag definitions are only required for writing custom tags, you can just +call TIFFMergeFieldInfo() before setting new tags. The whole extender +architecture can then be avoided.

      + +

      Adding New Builtin Tags

      + +A similar approach is taken to the above. However, the TIFFFieldInfo +should be added to the tiffFieldInfo[] list in tif_dirinfo.c. Ensure that +new tags are added in sorted order by the tag number.

      + +Normally new built-in tags should be defined with FIELD_CUSTOM; however, if +it is desirable for the tag value to have it's own field in the TIFFDirectory +structure, then you will need to #define a new FIELD_ value for it, and +add appropriate handling as follows: + + +

        +
      1. Define the tag in tiff.h. +
      2. Add a field to the directory structure in tif_dir.h + and define a FIELD_* bit (also update the definition of + FIELD_CODEC to reflect your addition). +
      3. Add an entry in the TIFFFieldInfo array defined at the top of + tif_dirinfo.c. + Note that you must keep this array sorted by tag + number and that the widest variant entry for a tag should come + first (e.g. LONG before SHORT). +
      4. Add entries in _TIFFVSetField() and _TIFFVGetField() + for the new tag. +
      5. (optional) If the value associated with the tag is not a scalar value + (e.g. the array for TransferFunction) and requires + special processing, + then add the appropriate code to TIFFReadDirectory() and + TIFFWriteDirectory(). You're best off finding a similar tag and + cribbing code. +
      6. Add support to TIFFPrintDirectory() in tif_print.c + to print the tag's value. +
      + +

      +If you want to maintain portability, beware of making assumptions +about data types. Use the typedefs (uint16, etc. when dealing with +data on disk and t*_t when stuff is in memory) and be careful about +passing items through printf or similar vararg interfaces. + +

      Adding New Codec-private Tags

      + +To add tags that are meaningful only when a particular compression +algorithm is used follow these steps: + +
        +
      1. Define the tag in tiff.h. +
      2. Allocate storage for the tag values in the private state block of + the codec. +
      3. Insure the state block is created when the codec is initialized. +
      4. At TIFFInitfoo time override the method pointers in the + TIFF structure + for getting, setting and printing tag values. For example, +
        +    sp->vgetparent = tif->tif_vgetfield;
        +    tif->tif_vgetfield = fooVGetField;	/* hook for codec tags */
        +    sp->vsetparent = tif->tif_vsetfield;
        +    tif->tif_vsetfield = fooVSetField;	/* hook for codec tags */
        +    tif->tif_printdir = fooPrintDir;	/* hook for codec tags */
        +
        + (Actually you may decide not to override the + tif_printdir method, but rather just specify it). +
      5. Create a private TIFFFieldInfo array for your tags and + merge them into the core tags at initialization time using + _TIFFMergeFieldInfo; e.g. +
        +    _TIFFMergeFieldInfo(tif, fooFieldInfo, N(fooFieldInfo));
        +
        + (where N is a macro used liberaly throughout the distributed code). +
      6. Fill in the get and set routines. Be sure to call the parent method + for tags that you are not handled directly. Also be sure to set the + FIELD_* bits for tags that are to be written to the file. Note that + you can create ``pseudo-tags'' by defining tags that are processed + exclusively in the get/set routines and never written to file (see + the handling of TIFFTAG_FAXMODE in tif_fax3.c + for an example of this). +
      7. Fill in the print routine, if appropriate. +
      + +Note that space has been allocated in the FIELD_* bit space for +codec-private tags. Define your bits as FIELD_CODEC+<offset> to +keep them away from the core tags. If you need more tags than there +is room for, just increase FIELD_SETLONGS at the top of +tiffiop.h. + +
      + +Last updated: $Date: 2004/09/10 14:43:18 $ + + + + diff --git a/src/3rdparty/libtiff/html/bugs.html b/src/3rdparty/libtiff/html/bugs.html new file mode 100644 index 0000000000..dd17c73ebf --- /dev/null +++ b/src/3rdparty/libtiff/html/bugs.html @@ -0,0 +1,63 @@ + + +Bugs and the TIFF Mailing List + + + +

      + +Bugs, Bugzilla, and the TIFF Mailing List +

      + +

      +This software is free. Please let us know when you find a problem or +fix a bug. + +

      +Thanks to MapTools.org, libtiff now uses +bugzilla to track bugs. All bugs filed in the older bugzilla at +bugzilla.remotesensing.org (pre April 2008) have unfortunately been lost. +

      +If you think you've discovered a bug, please first check to see if it is +already known by looking at the list of already reported bugs. You can do so +by visiting the buglist at +http://bugzilla.maptools.org/buglist.cgi?product=libtiff. Also verify that +the problem is still reproducable with the current development software +from CVS. +

      +If you'd like to enter a new bug, you can do so at +http://bugzilla.maptools.org/enter_bug.cgi?product=libtiff. +

      +If you'd like to inform us about some kind of security issue that should not +be disclosed for a period of time, then you can contact maintainers directly. +Send a copies of your report to the following people: Frank Warmerdam +<warmerdam@pobox.com>, +Andrey Kiselev +<dron@ak4719.spb.edu>. +

      + +Of course, reporting bugs is no substitute for discussion. The +tiff@lists.maptools.org mailing +list is for users of this software, and discussion TIFF issues in general. +It is managed with the Mailman software, and the web interface for subscribing +and managing your access to the list is at:

      + + http://lists.maptools.org/mailman/listinfo/tiff

      + +Posts to the list are only accepted from members of the list in order +to limit the amount of spam propagated. Also, to be approved as a member +you will need to email the list administrator with a brief description of +why you are interested in TIFF so we can weed out spammers.

      + +A Long Term +Archive including recent messages, and most messages back to 1993, +with search capabilities is available, and +has been prepared and hosted by AWare +Systems.

      + + +


      + +Last updated: $Date: 2008/09/03 08:04:26 $ + + diff --git a/src/3rdparty/libtiff/html/build.html b/src/3rdparty/libtiff/html/build.html new file mode 100644 index 0000000000..e0b21575c0 --- /dev/null +++ b/src/3rdparty/libtiff/html/build.html @@ -0,0 +1,880 @@ + + + + +Building the TIFF Software Distribution + + +

      Building the Software Distribution

      + +
      +This chapter contains step-by-step instructions on how to configure +and build the TIFF software distribution. The software is most +easily built on a UNIX system, but with a little bit of work it can +easily be built and used on other non-UNIX platforms. +
      +

      Building on a UNIX System

      +To build the software on a UNIX system you need to first run the +configure shell script that is located in the top level of the +source directory. This script probes the target system for +necessary tools and functions and constructs a build environment in +which the software may be compiled. Once configuration is done, you +simply run make (or gmake) to build the software +and then make install to do the installation; for example: +
      +
      +hyla% cd tiff-v3.4beta099
      +hyla% ./configure
      +    ...lots of messages...
      +hyla% make
      +    ...lots of messages...
      +hyla# make install
      +
      +Supplied makefiles are depend on GNU make utility, so you +will need the one. Depending on your installation make +command may invoke standard system make and gmake +invoke GNU make. In this case you should use former. If you don't +have make at all, but only gmake, you should +export environment variable MAKE=gmake before +./configure. +

      In general, the software is designed such that the following +should be ``make-able'' in each directory:

      +
      +
      +make [all]      build stuff
      +make install    build&install stuff
      +make clean      remove .o files, executables and cruft
      +make distclean  remove everything, that can be recreated
      +
      +Note that after running "make distclean" the +configure script must be run again to create the Makefiles +and other make-related files. +
      +

      Build Trees

      +There are two schemes for configuring and building the software. If +you intend to build the software for only one target system, you +can configure the software so that it is built in the same +directories as the source code. +
      +
      +hyla% cd tiff-v3.4beta099
      +hyla% ls
      +COPYRIGHT       VERSION         config.sub      dist            man
      +Makefile.in     config.guess    configure       html            port
      +README          config.site     contrib         libtiff         tools
      +hyla% ./configure
      +
      +

      Otherwise, you can configure a build tree that is parallel to +the source tree hierarchy but which contains only configured files +and files created during the build procedure.

      +
      +
      +hyla% cd tiff-v3.4beta099
      +hyla% mkdir obj obj/mycpu
      +hyla% cd obj/mycpu
      +hyla% ../../configure
      +
      +This second scheme is useful for: +
        +
      • building multiple targets from a single source tree
      • +
      • building from a read-only source tree (e.g. if you receive the +distribution on CD-ROM)
      • +
      + +
      +

      Configuration Options

      +The configuration process is critical to the proper compilation, +installation, and operation of the software. The configure script +runs a series of tests to decide whether or not the target system +supports required functionality and, if it does not, whether it can +emulate or workaround the missing functions. This procedure is +fairly complicated and, due to the nonstandard nature of most UNIX +systems, prone to error. The first time that you configure the +software for use you should check the output from the configure +script and look for anything that does not make sense for your +system. +

      A second function of the configure script is to set the default +configuration parameters for the software. Of particular note are +the directories where the software is to be installed. By default +the software is installed in the /usr/local hierarchy. To +change this behaviour the appropriate parameters can be specified +on the command line to configure. Run ./configure --help to +get a list of possible options. Installation related options are +shown below.

      +
      +
      +Installation directories:
      +  --prefix=PREFIX         install architecture-independent files in PREFIX
      +                          [/usr/local]
      +  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
      +                          [PREFIX]
      +
      +By default, `make install' will install all the files in
      +`/usr/local/bin', `/usr/local/lib' etc.  You can specify
      +an installation prefix other than `/usr/local' using `--prefix',
      +for instance `--prefix=$HOME'.
      +
      +For better control, use the options below.
      +
      +Fine tuning of the installation directories:
      +  --bindir=DIR           user executables [EPREFIX/bin]
      +  --sbindir=DIR          system admin executables [EPREFIX/sbin]
      +  --libexecdir=DIR       program executables [EPREFIX/libexec]
      +  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
      +  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
      +  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
      +  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
      +  --libdir=DIR           object code libraries [EPREFIX/lib]
      +  --includedir=DIR       C header files [PREFIX/include]
      +  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
      +  --infodir=DIR          info documentation [PREFIX/info]
      +  --mandir=DIR           man documentation [PREFIX/man]
      +
      +Program names:
      +  --program-prefix=PREFIX            prepend PREFIX to installed program names
      +  --program-suffix=SUFFIX            append SUFFIX to installed program names
      +  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
      +
      +
      + +
      +

      Configuring Optional Packages/Support

      +The TIFF software comes with several packages that are installed +only as needed, or only if specifically configured at the time the +configure script is run. Packages can be configured via the +configure script commandline parameters. +
      +
      Static/Shared Objects Support
      +
      --enable-shared[=PKGS]    build shared +libraries [default=yes]
      +--enable-static[=PKGS]    build static +libraries [default=yes]
      +

      These options control whether or not to configure the software +to build a shared and static binaries for the TIFF library. Use of +shared libraries can significantly reduce the disk space needed for +users of the TIFF software. If shared libarries are not used then +the code is statically linked into each application that uses it. +By default both types of binaries is configured.

      +

      --enable-rpath    Enable runtime linker +paths (-R libtool option)

      +

      Add library directories (see other options below) to the TIFF +library run-time linker path.

      +
      +
      JPEG Support
      +
      --disable-jpeg    disable IJG JPEG +library usage (required for JPEG compression, enabled by default) +--with-jpeg-include-dir=DIR    location of IJG +JPEG library headers +--with-jpeg-lib-dir=DIR    location of IJG JPEG +library binary)
      +
      The JPEG package enables support for the handling of +TIFF images with JPEG-encoded data. Support for JPEG-encoded data +requires the Independent JPEG Group (IJG) libjpeg +distribution; this software is available at ftp.uu.net:/graphics/jpeg/. +configure script automatically tries to search the working +IJG JPEG installation. If it fails to find library, JPEG support +will be automatically disabled.If you want specify the exact paths +to library binary and headers, use above switches for that.
      +
      ZIP Support
      +
      The ZIP support enables support for the handling of +TIFF images with deflate-encoded data. Support for deflate-encoded +data requires the freely available zlib distribution +written by Jean-loup Gailly and Mark Adler; this software is +available at ftp.uu.net:/pub/archiving/zip/zlib/ +(or try quest.jpl.nasa.gov:/beta/zlib/). +If ZIP support is enabled the DIRS_LIBINC and +DIR_GZLIB parameters should also be set (see below). By +default this package is not configured.
      +
      + +
      +

      A Sample Configuration Session

      +This section shows a sample configuration session and describes the +work done. The session is shown indented in a fixed width +font with user-supplied input in a bold font. +Comments are shown in a normal or italic font. This session +was collected on a 486 machine running BSDI 1.1. +
      +
      +
      +wullbrandt% mkdir tiff
      +wullbrandt% cd tiff
      +wullbrandt% ln -s /hosts/oxford/usr/people/sam/tiff src
      +
      +
      +A build tree separate from the source tree is used here. In fact, +in this case the distribution is accessed from a read-only +NFS-mounted filesystem. +
      +
      +
      +wullbrandt% src/configure
      +Configuring TIFF Software v3.4beta015.
      +
      +Reading site-wide parameters from ../tiff-v3.4beta015/config.site.
      +Reading local parameters from config.local.
      +Gosh, aren't you lucky to have a i386-unknown-bsdi1.1 system!
      +
      +
      +Note that configure announces the distribution version and the +deduced target configuration (i386-unknown-bsdi1.1 here). +
      +
      +
      +Using /usr/local/bin/gcc for a C compiler (set CC to override).
      +Looks like /usr/local/bin/gcc supports the -g option.
      +Using " -g" for C compiler options.
      +
      +
      +configure checked the normal shell search path for potential ANSI C +compilers. The compiler is selected according to it properly +compiling a small ANSI C test program. A specific compiler may be +requested by setting the CC environment variable to the +appropriate pathname, by supplying the parameter on the command +line, e.g. -with-CC=gcc, or by setting CC in a +configuration file. +

      Note +that an ANSI C compiler is required to build the software. If a C +compiler requires options to enable ANSI C compilation, they can be +specified with the ENVOPTS parameter.

      +

      Once a compiler is selected configure checks to see if the +compiler accepts a -g option to enable the generation of debugging +symbols, and if the compiler includes an ANSI C preprocessor.

      +
      +
      +
      +Using /usr/ucb/make to configure the software.
      +
      +
      +Next various system-specific libraries that may or may not be +needed are checked for (none are needed in this case). If your +system requires a library that is not automatically included it can +be specified by setting the MACHDEPLIBS parameter. +

      Creating port.h. The port.h file is included by +all the C code in the library (but not the tools). It includes +definitions for functions and type definitions that are missing +from system include files, #defines to enable or disable +system-specific functionality, and other odds and ends.

      +
      +
      +
      +Creating libtiff/port.h with necessary definitions.
      +... using LSB2MSB bit order for your i386 cpu
      +... using big-endian byte order for your i386 cpu
      +... configure use of mmap for memory-mapped files
      +... O_RDONLY is in <fcntl.h>
      +... using double for promoted floating point parameters
      +... enabling use of inline functions
      +Done creating libtiff/port.h.
      +
      +
      +This file can take a long time to create so configure generates the +file only when it is needed, either because the file does not exist +or because a different target or compiler is to be used. Note that +running "make distclean" in the top-level directory of the +build tree will remove the port.h file (along with all the +other files generated by configure). +

      Selecting emulated library functions. Certain library +functions used by the tools are not present on all systems and can +be emulated using other system functionality. configure checks for +the presence of such functions and if they are missing, will +configure emulation code from the port directory to use +instead. Building the TIFF software on unsupported systems may +require adding to the code to the port directory.

      +
      +
      +
      +Checking system libraries for functionality to emulate.
      +Done checking system libraries.
      +
      +
      +If a routine must be emulated and configure does not automatically +check for it, the routine name can be specified using the +PORTFUNCS parameter. To add emulation support for a new +function foo, create a file port/foo.c that +contains the emulation code and then set PORTFUNCS=foo in +a configuration file or modify the configure script to +automatically check for the missing function. +
      +
      +
      +Checking for Dynamic Shared Object (DSO) support.
      +Done checking for DSO support.
      +
      +
      +If the DSO package is enabled (DSO=auto or +DSO=yes), then configure will verify the system and +compiler are capable of constructing SVR4-style DSO's in the +expected way. Note that while a system may support DSO's the +compiler may not be capable of generating the required +position-independent code and/or the compiler may not pass the +needed options through to the loader. +

      Selecting utility programs. configure locates various +system utility programs that are used during installation of the +software.

      +
      +
      +
      +Selecting programs used during installation.
      +Looks like mv supports the -f option to force a move.
      +Looks like /bin/ln supports the -s option to create a symbolic link.
      +Done selecting programs.
      +
      +
      +

      Selecting default configuration parameters. The remainder +of the work done by configure involves setting up configuration +parameters that control the placement and setup of files during the +installation procedure.

      +
      +
      +
      +Selecting default TIFF configuration parameters.
      +
      +Looks like manual pages go in /usr/contrib/man.
      +Looks like manual pages should be installed with bsd-nroff-gzip-0.gz.
      +
      +TIFF configuration parameters are:
      +
      +[ 1] Directory for tools:               /usr/contrib/bin
      +[ 2] Directory for libraries:           /usr/contrib/lib
      +[ 3] Directory for include files:       /usr/contrib/include
      +[ 4] Directory for manual pages:        /usr/contrib/man
      +[ 5] Manual page installation scheme:   bsd-nroff-gzip-0.gz
      +
      +Are these ok [yes]? 
      +
      +
      +At this point you can interactively modify any of the displayed +parameters. Hitting a carriage return or typing yes will +accept the current parameters. Typing one of the number displayed +along the left hand side causes configure to prompt for a new value +of the specified parameter. Typing anything else causes configure +to prompt for a new value for each parameter. In general +hitting carriage return will accept the current value and typing +anything that is unacceptable will cause a help message to be +displayed. A description of each of the configuration parameters is +given below. +

      Once acceptable parameters are setup configure will generate all +the files that depend on these parameters. Note that certain files +may or may not be created based on the configuration of optional +packages and/or the functions supported by target system.

      +
      +
      +
      +Creating Makefile from ../tiff-v3.4beta015/Makefile.in
      +Creating libtiff/Makefile from ../tiff-v3.4beta015/libtiff/Makefile.in
      +Creating man/Makefile from ../tiff-v3.4beta015/man/Makefile.in
      +Creating tools/Makefile from ../tiff-v3.4beta015/tools/Makefile.in
      +Creating port/install.sh from ../tiff-v3.4beta015/port/install.sh.in
      +Done.
      +
      +
      + +
      +

      Shared Library Support

      +It is desirable to make the TIFF library be a shared object on +systems that have support for shared libraries. Unfortunately the +rules to use to build a shared library vary between operating +systems and even compilers. The distributed software includes +support for building a shared version of the library on a number of +different systems. This support is split between rules in the file +libtiff/Makefile.in that construct the shared library and +checks done by the configure script to verify that the +expected rules are supported by compilation tools for the target +system. +

      To add new support for building a shared library both these +files must be updated. In the configure script search for the +section where the autoconfiguration setting of the DSO +parameter is handled and add a new case for the target system that +sets the DSOSUF, DSOLD, DSOOPTS, and +LIBCOPTS options as appropriate for the system. +DSOSUF specifies the filename suffix used for the shared +library (e.g. ``.so'' for Dynamic Shared Objects on most SVR4-based +systems). DSOLD specifies the program to use to build the +shared library from a compiled object file; typically ``${LD}'' +though on some systems it is better to use the C compiler directly +so system-dependent options and libraries are automatically +supplied. DSOOPTS are options that must be specified to +DSOLD when building the shared library. LIBCOPTS +are options to pass to the C compiler when constructing a +relocatable object file to include in a shared library; e.g. ``-K +PIC'' on a Sun system. The DSO parameter must also be set +to a unique label that identifies the target system and compilation +tools. This label is used to select a target in +libtiff/Makefile.in to do the actual work in building the +shared library. Finally, to complete support for the shared library +added the appropriate rules to libtiff/Makefile.in under the +target specified in the configure script.

      +
      +

      Building the Software under Windows 95/98/NT/2000 with MS +VC++

      +With Microsoft Visual C++ installed, and properly configured for +commandline use (you will likely need to source VCVARS32.BAT in +AUTOEXEC.bAT or somewhere similar) you should be able to use the +provided makefile.vc. +

      The source package is delivered using Unix line termination +conventions, which work with MSVC but do not work with Windows +'notepad'. If you use unzip from the Info-Zip package, you +can extract the files using Windows normal line termination +conventions with a command similar to:

      +
      +  unzip -aa -a tiff-3.7.4.zip
      +
      +

      By default libtiff expects that a pre-built zlib and jpeg +library are provided by the user. If this is not the case, then you +may edit libtiff\tiffconf.h using a text editor (e.g. notepad) and +comment out the entries for JPEG_SUPPORT, PIXARLOG_SUPPORT, and +ZIP_SUPPORT. Ignore the comment at the top of the file which says +that it has no influence on the build, because the statement is not +true for Windows. However, by taking this approach, libtiff will +not be able to open some TIFF files.

      +

      To build using the provided makefile.vc you may use:

      +
      +  C:\tiff-3.7.4> nmake /f makefile.vc clean
      +  C:\tiff-3.7.4> nmake /f makefile.vc
      +
      +    or (the hard way)
      +
      +  C:\tiff-3.7.4> cd port
      +  C:\tiff-3.7.4\port> nmake /f makefile.vc clean
      +  C:\tiff-3.7.4\port> nmake /f makefile.vc
      +  C:\tiff-3.7.4> cd ../libtiff
      +  C:\tiff-3.7.4\libtiff> nmake /f makefile.vc clean
      +  C:\tiff-3.7.4\libtiff> nmake /f makefile.vc
      +  C:\tiff-3.7.4\libtiff> cd ..\tools
      +  C:\tiff-3.7.4\tools> nmake /f makefile.vc clean
      +  C:\tiff-3.7.4\tools> nmake /f makefile.vc
      +
      +

      This will build the library file +libtiff\libtiff\libtiff.lib. This can be used in Win32 +programs. You may want to adjust the build options before start +compiling. All parameters contained in the nmake.opt +file.This is a plain text file you can open with your favorite text +editor.

      +

      The makefile also builds a DLL (libtiff.dll) with an associated +import library (libtiff_i.lib). Any builds using libtiff will need +to include the LIBTIFF\LIBTIFF directory in the include path.

      +

      The libtiff\tools\makefile.vc should build .exe's for +all the standard TIFF tool programs.

      +

      +
      +

      Building the Software under MS/DOS with the DJGPP v2 +compiler

      +[From the file contrib/dosdjgpp/README.] +

      The directory contrib/dosdjgpp contains the files +necessary to build the library and tools with the DJGPP v2 compiler +under MSDOS.

      +

      All you have to do is copy the files in the directory into the +respective directories and run make. If you want, you can use the +conf.bat script to do that for you, make sure that the file +is stored with MSDOS text EOL-convention (CR/LF), otherwise the +command.com will not do anything.

      +

      Note that you probably will not be able to build the library +with the v1.x versions of djgpp, due to two problems. First, the +top makefile calls a sub-make for each directory and you are likely +to run out of memory, since each recursive invocation of a djgpp +v1.x program requires about 130k, to avoid that, you can enter the +directories manually and call make (well, there are only two dirs). +The 2nd problem is that djgpp 1.x doesn't call the coff2exe +(stubify) program when creating an executable. This means that all +programs compiled are not converted to exe and consequently are not +available for calling directly. For the tools directory, you can +just call coff2exe for each program after make finishes, but in the +libtiff directory, a few programs are created during the make +process that have to be called for make to continue (e.g. +mkg3states). Make will probably report an error at each such stage. +To fix that, either add a coff2exe call before each program is +called or call coff2exe manually and rerun make (there 2-3 such +programs).

      +
      +

      Building the Software on a Macintosh with MPW

      +The directory contrib/mac-mpw contains support for compiling +the library and tools under the MPW Shell on a Macintosh system. +This support was contributed by Niles Ritter (ndr@tazboy.jpl.nasa.gov). +

      [From the file contrib/mac-mpw/README.]

      +

      This directory contains all of the utilities and makefile source +to build the LIBTIFF library and tools from the MPW Shell. The file +BUILD.mpw in this directory is an executable script which uses all +of these files to create the MPW makefiles and run them.

      +

      The <file>.make files are not MPW makefiles as such, but +are when run through the "mactrans" program, which turns the ascii +"%nn" metacharacters into the standard weird MPW make +characters.

      +

      This translation trick is necessary to protect the files when +they are put into unix tarfiles, which tend to mangle the special +characters.

      +
      +

      Building the Software on a Macintosh with CodeWarrior

      +The directory contrib/mac-cw contains support for compiling +the library and tools with MetroWerks CodeWarrior 6.1 on a +Macintosh system. This support was contributed by Niles Ritter +(ndr@tazboy.jpl.nasa.gov). +

      [From the file contrib/mac-cw/README.] In this +directory you will find a Makefile.script Applescript file, which +should be run in order to build the libtiff code using MetroWerks +CodeWarrior. Refer to the "metrowerks.note" instructions on +building the library for 68k and PowerPC native code, as well as +building some of the libtiff tools, which are rather unix-like, but +at least give an example of how to link everything together. +

      +
      +

      Building the Software on a VMS System

      +The VMS port was done by Karsten Spang (krs@kampsax.dk), who also "sort of" +maintains it. The VMS specific files are not in the main +directories. Instead they are placed under +[.CONTRIB.VMS...] in the distribution tree. Installation: +It is assumed that you have unpacked the tar file into a VMS +directory tree, in this text called DISK:[TIFF]. +
        +
      1. Move the VMS specific files to their proper directories. +
        +$ SET DEFAULT DISK:[TIFF.CONTRIB.VMS]
        +$ RENAME [.LIBTIFF]*.* [-.-.LIBTIFF]
        +$ RENAME [.TOOLS]*.* [-.-.TOOLS]
        +
      2. +
      3. Compile the library. +
        +$ SET DEFAULT DISK:[TIFF.LIBTIFF]
        +$ @MAKEVMS
        +
      4. +
      5. Compile the tools. +
        +$ SET DEFAULT DISK:[TIFF.TOOLS]
        +$ @MAKEVMS
        +
      6. +
      7. Define the programs. +
        +$ DEFINE TIFFSHR DISK:[TIFF.LIBTIFF]TIFFSHR
        +$ FAX2PS    :==$DISK:[TIFF.TOOLS]FAX2PS
        +$ FAX2TIFF  :==$DISK:[TIFF.TOOLS]FAX2TIFF
        +$ GIF2TIFF  :==$DISK:[TIFF.TOOLS]GIF2TIFF
        +$ PAL2RGB   :==$DISK:[TIFF.TOOLS]PAL2RGB
        +$ PPM2TIFF  :==$DISK:[TIFF.TOOLS]PPM2TIFF
        +$ RAS2TIFF  :==$DISK:[TIFF.TOOLS]RAS2TIFF
        +$ RGB2YCBCR :==$DISK:[TIFF.TOOLS]RGB2YCBCR
        +$ THUMBNAIL :==$DISK:[TIFF.TOOLS]THUMBNAIL
        +$ TIFF2BW   :==$DISK:[TIFF.TOOLS]TIFF2BW
        +$ TIFF2PS   :==$DISK:[TIFF.TOOLS]TIFF2PS
        +$ TIFFCMP   :==$DISK:[TIFF.TOOLS]TIFFCMP
        +$ TIFFCP    :==$DISK:[TIFF.TOOLS]TIFFCP
        +$ TIFFDITHER:==$DISK:[TIFF.TOOLS]TIFFDITHER
        +$ TIFFDUMP  :==$DISK:[TIFF.TOOLS]TIFFDUMP
        +$ TIFFINFO  :==$DISK:[TIFF.TOOLS]TIFFINFO
        +$ TIFFMEDIAN:==$DISK:[TIFF.TOOLS]TIFFMEDIAN
        +$ TIFFSPLIT :==$DISK:[TIFF.TOOLS]TIFFSPLIT
        +$ YCBCR     :==$DISK:[TIFF.TOOLS]YCBCR
        +
      8. +
      +You will want to add these lines to your LOGIN.COM file, +after changing the name of the directory that you have used on your +machine. +

      This release has been tested on OpenVMS/VAX 5.5-2, using VAX C +3.2. A previous release was tested under OpenVMS/AXP ?.? using DEC +C ?.?, it is believed that this release as well works on AXP. The +code contains some GNU C specific things. This does *not* imply, +however, that the VAX/GCC configuration has been tested, *it has +not*.

      +

      The command procedures (MAKEVMS.COM) for building the +library and tools, is believed to choose the correct options for +the VAX and AXP cases automatically.

      +

      On the AXP, IEEE floating point is used by default. If you want +VAX floating point, remove the /FLOAT=IEEE_FLOAT +qualifier, and change HAVE_IEEEFP=1 to +HAVE_IEEEFP=0 in the MAKEVMS.COM files in both +the libtiff and tools directories.

      +

      Compiling your own program on a VMS system:

      +When compiling a source file in which you "#include +<tiffio.h>", use the following command +
      +    $ CC/INCLUDE=DISK:[TIFF.LIBTIFF]
      +
      +This ensures that the header file is found. On the AXP, also add +/FLOAT=IEEE_FLOAT (if used when building the library). +

      Linking your own program to the TIFF library on a VMS +system:

      +You can link to the library in two ways: Either using the shareable +library, or using the object library. On the VAX these +possibilities are: +
        +
      1. Using the shareable TIFF library. +
        +$ LINK MY_PROGRAM,DISK:[TIFF.LIBTIFF]TIFF/OPTIONS,SYS$INPUT:/OPTIONS
        +    SYS$SHARE:VAXCRTL/SHAREABLE
        +
      2. +
      3. Using the TIFF object library. +
        +$ LINK MY_PROGRAM, -
        +    DISK:[TIFF.LIBTIFF]TIFF/LIBRARY/INCLUDE=(TIF_FAX3SM,TIF_CODEC), -
        +    SYS$INPUT:/OPTIONS
        +    SYS$SHARE:VAXCRTL/SHAREABLE
        +
      4. +
      +On AXP (and possibly also using DEC C on VAX) the corresponding +commands are +
        +
      1. Using the shareable TIFF library. +
        +$ LINK MY_PROGRAM,DISK:[TIFF.LIBTIFF]TIFF/OPTIONS
        +
      2. +
      3. Using the TIFF object library. +
        +$ LINK MY_PROGRAM,DISK:[TIFF.LIBTIFF]TIFF/LIBRARY
        +
      4. +
      +Method 1 uses the shortest link time and smallest .EXE +files, but it requires that TIFFSHR is defined as above at +link time and at run time. Using the compilation +procedure above, the tools are linked in this way. +

      Method 2 gives somewhat longer link time and larger +.EXE files, but does not require TIFFSHR to be +defined. This method is recommended if you want to run your program +on another machine, and for some reason don't want to have the +library on that machine. If you plan to have more than one program +(including the tools) on the machine, it is recommended that you +copy the library to the other machine and use method 1.

      +
      +

      Building the Software on an Acorn RISC OS system

      +The directory contrib/acorn contains support for compiling +the library under Acorn C/C++ under Acorn's RISC OS 3.10 or above. +Subsequent pathnames will use the Acorn format: The full-stop or +period character is a pathname delimeter, and the slash character +is not interpreted; the reverse position from Unix. Thus +"libtiff/tif_acorn.c" becomes "libtiff.tif_acorn/c". +

      This support was contributed by Peter Greenham. (peter@enlarion.demon.co.uk).

      +

      Installing LibTIFF:

      +

      LIBTIFF uses several files which have names longer than the +normal RISC OS maximum of ten characters. This complicates matters. +Maybe one day Acorn will address the problem and implement long +filenames properly. Until then this gets messy, especially as I'm +trying to do this with obeyfiles and not have to include binaries +in this distribution.

      +

      First of all, ensure you have Truncate configured on (type +*Configure Truncate On)

      +

      Although it is, of course, preferable to have long filenames, +LIBTIFF can be installed with short filenames, and it will compile +and link without problems. However, getting it there is more +problematic. contrib.acorn.install is an installation +obeyfile which will create a normal Acorn-style library from the +source (ie: with c, h and o folders etc.), but needs the +distribution library to have been unpacked into a location which is +capable of supporting long filenames, even if only temporarily.

      +

      My recommendation, until Acorn address this problem properly, is +to use Jason Tribbeck's +LongFilenames, or any other working system that gives you long +filenames, like a nearby NFS server for instance.

      +

      If you are using Longfilenames, even if only temporarily to +install LIBTIFF, unpack the TAR into a RAMDisc which has been +longfilenamed (ie: *addlongfs ram) and then install from +there to the hard disk. Unfortunately Longfilenames seems a bit +unhappy about copying a bunch of long-named files across the same +filing system, but is happy going between systems. You'll need to +create a ramdisk of about 2Mb.

      +

      Now you can run the installation script I've supplied (in +contrib.acorn), which will automate the process of installing +LIBTIFF as an Acorn-style library. The syntax is as follows:

      +

      install <source_dir> <dest_dir>

      +

      Install will then create <dest_dir> and put the library in +there. For example, having used LongFilenames on the RAMDisk and +unpacked the library into there, you can then type:

      +

      Obey RAM::RamDisc0.$.contrib.acorn.install RAM::RamDisc0.$ +ADFS::4.$.LIBTIFF

      +

      It doesn't matter if the destination location can cope with long +filenames or not. The filenames will be truncated if necessary +(*Configure Truncate On if you get errors) and all will be +well.

      +

      Compiling LibTIFF:

      +

      Once the LibTIFF folder has been created and the files put +inside, making the library should be just a matter of running +'SetVars' to set the appropriate system variables, then +running 'Makefile'.

      +

      OSLib

      +

      OSLib +is a comprehensive API for RISC OS machines, written by Jonathan +Coxhead of Acorn Computers (although OSLib is not an official Acorn +product). Using the OSLib SWI veneers produces code which is more +compact and more efficient than code written using _kernel_swi or +_swi. The Acorn port of LibTIFF can take advantage of this if +present. Edit the Makefile and go to the Static dependencies +section. The first entry is:

      +
      +# Static dependencies:
      +@.o.tif_acorn:   @.c.tif_acorn
      +        cc $(ccflags) -o @.o.tif_acorn @.c.tif_acorn 
      +
      +

      Change the cc line to:

      +
      +        cc $(ccflags) -DINCLUDE_OSLIB -o @.o.tif_acorn @.c.tif_acorn 
      +
      +

      Remember, however, that OSLib is only recommended for +efficiency's sake. It is not required.

      +
      +

      Building the Software on Other Systems

      +This section contains information that might be useful if you are +working on a non-UNIX system that is not directly supported. All +library-related files described below are located in the +libtiff directory. +

      The library requires two files that are generated +on-the-fly. The file tif_fax3sm.c has the state +tables for the Group 3 and Group 4 decoders. This file is generated +by the mkg3states program on a UNIX system; for +example,

      +
      +
      +
      +cd libtiff
      +cc -o mkg3states mkg3states.c
      +rm -f tif_fax3sm.c
      +./mkg3states -c const tif_fax3sm.c
      +
      +
      +The -c option can be used to control whether or not the +resutling tables are generated with a const declaration. +The -s option can be used to specify a C storage class for +the table declarations. The -b option can be used to force +data values to be explicitly bracketed with ``{}'' (apparently +needed for some MS-Windows compilers); otherwise the structures are +emitted in as compact a format as possible. Consult the source code +for this program if you have questions. +

      The second file required to build the library, version.h, +contains the version information returned by the +TIFFGetVersion routine. This file is built on most systems +using the mkversion program and the contents of the +VERSION and tiff.alpha files; for example,

      +
      +
      +cd libtiff
      +cc -o mkversion mkversion.c
      +rm -f version.h
      +./mkversion -v ../VERSION -a ../dist/tiff.alpha version.h
      +
      +

      Otherwise, when building the library on a non-UNIX system be +sure to consult the files tiffcomp.h and tiffconf.h. +The former contains system compatibility definitions while the +latter is provided so that the software configuration can be +controlled on systems that do not support the make facility for +building the software.

      +

      Systems without a 32-bit compiler may not be able to handle some +of the codecs in the library; especially the Group 3 and 4 decoder. +If you encounter problems try disabling support for a particular +codec; consult the documentation.

      +

      Programs in the tools directory are written to assume an ANSI C +compilation environment. There may be a few POSIX'isms as well. The +code in the port directory is provided to emulate routines +that may be missing on some systems. On UNIX systems the +configure script automatically figures out which routines +are not present on a system and enables the use of the equivalent +emulation routines from the port directory. It may be +necessary to manually do this work on a non-UNIX system.

      +
      +

      Checking out the Software

      +

      Assuming you have working versions of tiffgt and +tiffsv, you can just use them to view any of the sample +images available for testing (see the section +on obtaining the test images). Otherwise, you can do a cursory +check of the library with the tiffcp and tiffcmp +programs. For example,

      +
      +
      +tiffcp -lzw cramps.tif x.tif
      +tiffcmp cramps.tif x.tif
      +
      +

      (tiffcmp should be silent if the files compare +correctly).

      +
      +

      Table of Contents

      +The following files makup the core library: +
      +libtiff/tiff.h                  TIFF spec definitions
      +libtiff/tiffcomp.h              non-UNIX OS-compatibility definitions
      +libtiff/tiffconf.h              non-UNIX configuration definitions
      +libtiff/tiffio.h                public TIFF library definitions
      +libtiff/tiffiop.h               private TIFF library definitions
      +libtiff/t4.h                    CCITT Group 3/4 code tables+definitions
      +libtiff/tif_dir.h               private defs for TIFF directory handling
      +libtiff/tif_fax3.h              CCITT Group 3/4-related definitions
      +libtiff/tif_predict.h           private defs for Predictor tag support
      +libtiff/uvcode.h                LogL/LogLuv codec-specific definitions
      +libtiff/version.h               version string (generated by Makefile)
      +
      +libtiff/tif_acorn.c             Acorn-related OS support
      +libtiff/tif_apple.c             Apple-related OS support
      +libtiff/tif_atari.c             Atari-related OS support
      +libtiff/tif_aux.c               auxilary directory-related functions
      +libtiff/tif_close.c             close an open TIFF file
      +libtiff/tif_codec.c             configuration table of builtin codecs
      +libtiff/tif_compress.c          compression scheme support
      +libtiff/tif_dir.c               directory tag interface code
      +libtiff/tif_dirinfo.c           directory known tag support code
      +libtiff/tif_dirread.c           directory reading code
      +libtiff/tif_dirwrite.c          directory writing code
      +libtiff/tif_dumpmode.c          "no" compression codec
      +libtiff/tif_error.c             library error handler
      +libtiff/tif_fax3.c              CCITT Group 3 and 4 codec
      +libtiff/tif_fax3sm.c            G3/G4 state tables (generated by mkg3states)
      +libtiff/tif_flush.c             i/o and directory state flushing
      +libtiff/tif_getimage.c          TIFFRGBAImage support
      +libtiff/tif_jpeg.c              JPEG codec (interface to the IJG distribution)
      +libtiff/tif_luv.c               SGI LogL/LogLuv codec
      +libtiff/tif_lzw.c               LZW codec
      +libtiff/tif_msdos.c             MSDOS-related OS support
      +libtiff/tif_next.c              NeXT 2-bit scheme codec (decoding only)
      +libtiff/tif_open.c              open and simply query code
      +libtiff/tif_packbits.c          Packbits codec
      +libtiff/tif_pixarlog.c          Pixar codec
      +libtiff/tif_predict.c           Predictor tag support
      +libtiff/tif_print.c             directory printing support
      +libtiff/tif_read.c              image data reading support
      +libtiff/tif_strip.c             some strip-related code
      +libtiff/tif_swab.c              byte and bit swapping support
      +libtiff/tif_thunder.c           Thunderscan codec (decoding only)
      +libtiff/tif_tile.c              some tile-related code
      +libtiff/tif_unix.c              UNIX-related OS support
      +libtiff/tif_version.c           library version support
      +libtiff/tif_vms.c               VMS-related OS support
      +libtiff/tif_warning.c           library warning handler
      +libtiff/tif_win3.c              Windows-3.1-related OS support
      +libtiff/tif_win32.c             Win32 (95/98/NT) related OS support
      +libtiff/tif_write.c             image data writing support
      +libtiff/tif_zip.c               Deflate codec
      +
      +libtiff/mkg3states.c            program to generate G3/G4 decoder state tables
      +libtiff/mkspans.c               program to generate black-white span tables
      +libtiff/mkversion.c             program to generate libtiff/version.h.
      +
      +
      +Last updated: $Date: 2005/12/24 22:25:05 $ + + diff --git a/src/3rdparty/libtiff/html/contrib.html b/src/3rdparty/libtiff/html/contrib.html new file mode 100644 index 0000000000..d138900a8b --- /dev/null +++ b/src/3rdparty/libtiff/html/contrib.html @@ -0,0 +1,209 @@ + + + +Contributed TIFF Software + + + + + +

      + +Contributed TIFF Software +

      + + +

      +The contrib directory has contributed software that +uses the TIFF library or which is associated with the library +(typically glue and guidance for ports to non-UNIX platforms, or tools that +aren't directly TIFF related). + +
      + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +contrib/vms + +scripts and files from Karsten Spang for building + the library and tools under VMS +
      +contrib/dbs + +various tools from Dan & Chris Sears, including a simple X-based viewer +
      +contrib/ras + +two programs by Patrick Naughton for converting + between Sun rasterfile format and TIFF (these + require libpixrect.a, as opposed to the one in + tools that doesn't) +
      +contrib/mac-mpw
      +contrib/mac-cw +
      +scripts and files from Niles Ritter for building +the library and tools under Macintosh/MPW C and +code warrior. +
      +contrib/acorn + +scripts and files from Peter Greenham for building + the library and tools on an Acorn RISC OS system. +
      +contrib/win32 + +scripts and files from Scott Wagner for building +the library under Windows NT and Windows 95. (The makefile.vc in the +libtiff/libtiff directory may be sufficient for most users.) +
      +contrib/win_dib + +two separate implementations of TIFF to DIB code suitable for any Win32 +platform. Contributed by Mark James, and Philippe Tenenhaus. +
      +contrib/ojpeg + +Patch for IJG JPEG library related to support for some Old JPEG in TIFF files. +Contributed by Scott Marovich. +
      +contrib/dosdjgpp + +scripts and files from Alexander Lehmann for building + the library under MSDOS with the DJGPP v2 compiler. +
      +contrib/tags + +scripts and files from Niles Ritter for adding private + tag support at runtime, without changing libtiff. +
      +contrib/mfs + +code from Mike Johnson to read+write images in memory +without modifying the library +
      +contrib/pds + +various routines from Conrad Poelman; a TIFF image iterator and + code to support ``private sub-directories'' +
      +contrib/iptcutil + + +A utility by Bill Radcliffe to +convert an extracted IPTC Newsphoto caption from a binary blob to +ASCII text, and vice versa. IPTC binary blobs can be extracted from +images via the ImageMagick convert(1) +utility. + + +
      +contrib/addtiffo + + +A utility (and supporting subroutine) for building +one or more reduce resolution +overviews to an existing TIFF file. Supplied by +Frank Warmerdam. + +
      +contrib/stream + + +A class (TiffStream) for accessing TIFF files through a C++ stream +interface. Supplied by Avi Bleiweiss. + +
      + +

      +Questions regarding these packages are usually best directed toward +their authors. + +

      +


      + +Last updated: $Date: 2006/01/03 01:42:30 $ + + + diff --git a/src/3rdparty/libtiff/html/document.html b/src/3rdparty/libtiff/html/document.html new file mode 100644 index 0000000000..12f138f5aa --- /dev/null +++ b/src/3rdparty/libtiff/html/document.html @@ -0,0 +1,48 @@ + + + +TIFF Documentation + + + + +

      + +TIFF Documentation +

      + +

      +A copy of the 6.0 specification is available from Adobe at +http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf, or from the libtiff +ftp site at +ftp://ftp.remotesensing.org/pub/libtiff/doc/TIFF6.pdf.

      + +

      +Draft TIFF Technical Note #2 covers problems +with the TIFF 6.0 design for embedding JPEG-compressed data in TIFF, and +describes an alternative.

      + +Other Adobe information on TIFF can be retrieved from: + + +http://partners.adobe.com/public/developer/tiff/index.html + +

      +Joris Van Damme maintains a list of known tags and their descriptions and +definitions. It is available online at + +http://www.awaresystems.be/imaging/tiff/tifftags.html + +

      +There is a FAQ, related both to TIFF format and libtiff library: + +http://www.awaresystems.be/imaging/tiff/faq.html + +


      + +
      + Last updated: $Date: 2009-08-20 22:31:00 $ +
      + + + diff --git a/src/3rdparty/libtiff/html/images.html b/src/3rdparty/libtiff/html/images.html new file mode 100644 index 0000000000..150ed0c42a --- /dev/null +++ b/src/3rdparty/libtiff/html/images.html @@ -0,0 +1,41 @@ + + + +TIFF Test Images + + + + +

      + +TIFF Test Images +

      + +

      +Test images are available for most formats supported by the library. +Most of the images included in the test kit are also part of this +documentation (albeit in TIFF rather than GIF or JFIF). +The images are kept in a separate archive that should be located in +the same directory as this software. + +
      + +

      +The latest archive of test images is located at + +ftp://ftp.remotesensing.org/pub/libtiff/pics-3.8.0.tar.gz + +

      +There are two other good sources for TIFF test images: +the contributed software contrib/dbs includes several +programs that generate test images suitable for debugging, and +the tiffcp program can be used to generate a variety +of images with different storage characteristics. + +

      +


      + +Last updated: $Date: 2006/01/02 23:50:44 $ + + + diff --git a/src/3rdparty/libtiff/html/images/back.gif b/src/3rdparty/libtiff/html/images/back.gif new file mode 100644 index 0000000000..11d0c35f46 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/back.gif differ diff --git a/src/3rdparty/libtiff/html/images/bali.jpg b/src/3rdparty/libtiff/html/images/bali.jpg new file mode 100644 index 0000000000..1f5c146dd5 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/bali.jpg differ diff --git a/src/3rdparty/libtiff/html/images/cat.gif b/src/3rdparty/libtiff/html/images/cat.gif new file mode 100644 index 0000000000..5bd3fac1e2 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/cat.gif differ diff --git a/src/3rdparty/libtiff/html/images/cover.jpg b/src/3rdparty/libtiff/html/images/cover.jpg new file mode 100644 index 0000000000..8698cfb064 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/cover.jpg differ diff --git a/src/3rdparty/libtiff/html/images/cramps.gif b/src/3rdparty/libtiff/html/images/cramps.gif new file mode 100644 index 0000000000..9153f9ae28 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/cramps.gif differ diff --git a/src/3rdparty/libtiff/html/images/dave.gif b/src/3rdparty/libtiff/html/images/dave.gif new file mode 100644 index 0000000000..c36d447772 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/dave.gif differ diff --git a/src/3rdparty/libtiff/html/images/info.gif b/src/3rdparty/libtiff/html/images/info.gif new file mode 100644 index 0000000000..783d63153e Binary files /dev/null and b/src/3rdparty/libtiff/html/images/info.gif differ diff --git a/src/3rdparty/libtiff/html/images/jello.jpg b/src/3rdparty/libtiff/html/images/jello.jpg new file mode 100644 index 0000000000..df99e663ef Binary files /dev/null and b/src/3rdparty/libtiff/html/images/jello.jpg differ diff --git a/src/3rdparty/libtiff/html/images/jim.gif b/src/3rdparty/libtiff/html/images/jim.gif new file mode 100644 index 0000000000..9a18a031fa Binary files /dev/null and b/src/3rdparty/libtiff/html/images/jim.gif differ diff --git a/src/3rdparty/libtiff/html/images/note.gif b/src/3rdparty/libtiff/html/images/note.gif new file mode 100644 index 0000000000..7177d68a19 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/note.gif differ diff --git a/src/3rdparty/libtiff/html/images/oxford.gif b/src/3rdparty/libtiff/html/images/oxford.gif new file mode 100644 index 0000000000..dd4b86e186 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/oxford.gif differ diff --git a/src/3rdparty/libtiff/html/images/quad.jpg b/src/3rdparty/libtiff/html/images/quad.jpg new file mode 100644 index 0000000000..4b7df170be Binary files /dev/null and b/src/3rdparty/libtiff/html/images/quad.jpg differ diff --git a/src/3rdparty/libtiff/html/images/ring.gif b/src/3rdparty/libtiff/html/images/ring.gif new file mode 100644 index 0000000000..2a614f4929 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/ring.gif differ diff --git a/src/3rdparty/libtiff/html/images/smallliz.jpg b/src/3rdparty/libtiff/html/images/smallliz.jpg new file mode 100644 index 0000000000..8eb827f8ad Binary files /dev/null and b/src/3rdparty/libtiff/html/images/smallliz.jpg differ diff --git a/src/3rdparty/libtiff/html/images/strike.gif b/src/3rdparty/libtiff/html/images/strike.gif new file mode 100644 index 0000000000..0709d19867 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/strike.gif differ diff --git a/src/3rdparty/libtiff/html/images/warning.gif b/src/3rdparty/libtiff/html/images/warning.gif new file mode 100644 index 0000000000..f51eb4b1a7 Binary files /dev/null and b/src/3rdparty/libtiff/html/images/warning.gif differ diff --git a/src/3rdparty/libtiff/html/index.html b/src/3rdparty/libtiff/html/index.html new file mode 100644 index 0000000000..e43a708640 --- /dev/null +++ b/src/3rdparty/libtiff/html/index.html @@ -0,0 +1,123 @@ + + + + LibTIFF - TIFF Library and Utilities + + + + + +

      LibTIFF - TIFF Library and Utilities

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Home Pagehttp://www.remotesensing.org/libtiff/
      Home Page Mirrorhttp://libtiff.maptools.org/
      Latest Stable Releasev3.9.2
      Master Download Siteftp.remotesensing.org, directory pub/libtiff
      Mirror Download Sitehttp://libtiff.maptools.org/dl/
      Windows BinariesGnuWin32 Project
      Mailing Listtiff@lists.maptools.org, + Subscription, + Archive. + Please, read the TIFF FAQ + before asking questions.
      Anonymous CVSexport CVSROOT=:pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot
      + cvs login

      + (use empty password)
      + cvs checkout -r branch-3-9 libtiff
      + to get stable libtiff branch, or
      + cvs checkout libtiff
      + to get bleeding edge development version of libtiff from CVS HEAD.
      +
      +

      + This software provides support for the Tag Image File Format (TIFF), + a widely used format for storing image data. The latest version of + the TIFF specification is available on-line + in several different formats. +

      +

      + Included in this software distribution is a library, libtiff, for reading + and writing TIFF, a small collection of tools for doing simple + manipulations of TIFF images, and documentation on the + library and tools. Libtiff is a portable software, it was built and + tested on various systems: UNIX flavors (Linux, BSD, Solaris, MacOS X), + Windows, OpenVMS. It should be possible to port libtiff and additional + tools on other OSes. +

      +

      + The library, along with associated tool programs, should handle most of + your needs for reading and writing TIFF images on 32- and 64-bit + machines. This software can also be used on older 16-bit systems + though it may require some effort and you may need to leave out some of + the compression support. +

      +

      + The software was originally authored and maintained by Sam Leffler. + While he keeps a fatherly eye on the mailing list, he is no longer + responsible for day to day maintenance. +

      +

      + Questions should be sent to the TIFF mailing list: + tiff@lists.maptools.org, with + a subscription interface at + http://lists.maptools.org/mailman/listinfo/tiff. +

      +

      + The persons responsible for putting up this site and putting together + versions >= 3.5.1 are + Frank Warmerdam, + Andrey Kiselev, Bob Friesenhahn, +Joris Van Damme and Lee Howard. +

      +

      + The following sections are included in this documentation: +

      + +
      +

      + Last updated $Date: 2009-08-28 16:24:13 $. +

      + + diff --git a/src/3rdparty/libtiff/html/internals.html b/src/3rdparty/libtiff/html/internals.html new file mode 100644 index 0000000000..3cc9673125 --- /dev/null +++ b/src/3rdparty/libtiff/html/internals.html @@ -0,0 +1,572 @@ + + + +Modifying The TIFF Library + + + + +

      + +Modifying The TIFF Library +

      + + +

      +This chapter provides information about the internal structure of +the library, how to control the configuration when building it, and +how to add new support to the library. +The following sections are found in this chapter: + +

      + + +


      Library Configuration

      + +Information on compiling the library is given +elsewhere in this documentation. +This section describes the low-level mechanisms used to control +the optional parts of the library that are configured at build +time. Control is based on +a collection of C defines that are specified either on the compiler +command line or in a configuration file such as port.h +(as generated by the configure script for UNIX systems) +or tiffconf.h. + +

      +Configuration defines are split into three areas: +

        +
      • those that control which compression schemes are + configured as part of the builtin codecs, +
      • those that control support for groups of tags that + are considered optional, and +
      • those that control operating system or machine-specific support. +
      + +

      +If the define COMPRESSION_SUPPORT is not defined +then a default set of compression schemes is automatically +configured: +

        +
      • CCITT Group 3 and 4 algorithms (compression codes 2, 3, 4, and 32771), +
      • the Macintosh PackBits algorithm (compression 32773), +
      • a 4-bit run-length encoding scheme from ThunderScan (compression 32809), +
      • a 2-bit encoding scheme used by NeXT (compression 32766), and +
      • two experimental schemes intended for images with high dynamic range +(compression 34676 and 34677). +
      + +

      + +To override the default compression behaviour define +COMPRESSION_SUPPORT and then one or more additional defines +to enable configuration of the appropriate codecs (see the table +below); e.g. + +

        +#define	COMPRESSION_SUPPORT
        +#define	CCITT_SUPPORT
        +#define	PACKBITS_SUPPORT
        +
      + +Several other compression schemes are configured separately from +the default set because they depend on ancillary software +packages that are not distributed with libtiff. + +

      +Support for JPEG compression is controlled by JPEG_SUPPORT. +The JPEG codec that comes with libtiff is designed for +use with release 5 or later of the Independent JPEG Group's freely +available software distribution. +This software can be retrieved from the directory +ftp.uu.net:/graphics/jpeg/. + + +

      +NOTE: +Enabling JPEG support automatically enables support for +the TIFF 6.0 colorimetry and YCbCr-related tags. + +

      +Experimental support for the deflate algorithm is controlled by +DEFLATE_SUPPORT. +The deflate codec that comes with libtiff is designed +for use with version 0.99 or later of the freely available +libz library written by Jean-loup Gailly and Mark Adler. +The data format used by this library is described +in the files +zlib-3.1.doc, +and +deflate-1.1.doc, +available in the directory +ftp.uu.net:/pub/archiving/zip/doc. +The library can be retried from the directory +ftp.uu.net:/pub/archiving/zip/zlib/ +(or try quest.jpl.nasa.gov:/beta/zlib/). + +

      +NOTE: +The deflate algorithm is experimental. Do not expect +to exchange files using this compression scheme; +it is included only because the similar, and more common, +LZW algorithm is claimed to be governed by licensing restrictions. + + +

      +By default tiffconf.h defines +COLORIMETRY_SUPPORT, +YCBCR_SUPPORT, +and +CMYK_SUPPORT. + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      DefineDescription
      CCITT_SUPPORTCCITT Group 3 and 4 algorithms (compression codes 2, 3, 4, + and 32771)
      PACKBITS_SUPPORTMacintosh PackBits algorithm (compression 32773)
      LZW_SUPPORTLempel-Ziv & Welch (LZW) algorithm (compression 5)
      THUNDER_SUPPORT4-bit +run-length encoding scheme from ThunderScan (compression 32809)
      NEXT_SUPPORT2-bit encoding scheme used by NeXT (compression 32766)
      OJPEG_SUPPORTobsolete JPEG scheme defined in the 6.0 spec (compression 6)
      JPEG_SUPPORTcurrent JPEG scheme defined in TTN2 (compression 7)
      ZIP_SUPPORTexperimental Deflate scheme (compression 32946)
      PIXARLOG_SUPPORTPixar's compression scheme for high-resolution color images (compression 32909)
      SGILOG_SUPPORTSGI's compression scheme for high-resolution color images (compression 34676 and 34677)
      COLORIMETRY_SUPPORTsupport for the TIFF 6.0 colorimetry tags
      YCBCR_SUPPORTsupport for the TIFF 6.0 YCbCr-related tags
      CMYK_SUPPORTsupport for the TIFF 6.0 CMYK-related tags
      ICC_SUPPORTsupport for the ICC Profile tag; see +The ICC Profile Format Specification, +Annex B.3 "Embedding ICC Profiles in TIFF Files"; +available at +http://www.color.org +
      + + +


      General Portability Comments

      + +This software is developed on Silicon Graphics UNIX +systems (big-endian, MIPS CPU, 32-bit ints, +IEEE floating point). +The configure shell script generates the appropriate +include files and make files for UNIX systems. +Makefiles exist for non-UNIX platforms that the +code runs on -- this work has mostly been done by other people. + +

      +In general, the code is guaranteed to work only on SGI machines. +In practice it is highly portable to any 32-bit or 64-bit system and much +work has been done to insure portability to 16-bit systems. +If you encounter portability problems please return fixes so +that future distributions can be improved. + +

      +The software is written to assume an ANSI C compilation environment. +If your compiler does not support ANSI function prototypes, const, +and <stdarg.h> then you will have to make modifications to the +software. In the past I have tried to support compilers without const +and systems without <stdarg.h>, but I am +no longer interested in these +antiquated environments. With the general availability of +the freely available GCC compiler, I +see no reason to incorporate modifications to the software for these +purposes. + +

      +An effort has been made to isolate as many of the +operating system-dependencies +as possible in two files: tiffcomp.h and +libtiff/tif_<os>.c. The latter file contains +operating system-specific routines to do I/O and I/O-related operations. +The UNIX (tif_unix.c), +Macintosh (tif_apple.c), +and VMS (tif_vms.c) +code has had the most use; +the MS/DOS support (tif_msdos.c) assumes +some level of UNIX system call emulation (i.e. +open, +read, +write, +fstat, +malloc, +free). + +

      +Native CPU byte order is determined on the fly by +the library and does not need to be specified. +The HOST_FILLORDER and HOST_BIGENDIAN +definitions are not currently used, but may be employed by +codecs for optimization purposes. + +

      +The following defines control general portability: + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      BSDTYPESDefine this if your system does NOT define the + usual BSD typedefs: u_char, + u_short, u_int, u_long.
      HAVE_IEEEFPDefine this as 0 or 1 according to the floating point + format suported by the machine. If your machine does + not support IEEE floating point then you will need to + add support to tif_machdep.c to convert between the + native format and IEEE format.
      HAVE_MMAPDefine this if there is mmap-style support for +mapping files into memory (used only to read data).
      HOST_FILLORDERDefine the native CPU bit order: one of FILLORDER_MSB2LSB + or FILLORDER_LSB2MSB
      HOST_BIGENDIANDefine the native CPU byte order: 1 if big-endian (Motorola) + or 0 if little-endian (Intel); this may be used + in codecs to optimize code
      + +

      +On UNIX systems HAVE_MMAP is defined through the running of +the configure script; otherwise support for memory-mapped +files is disabled. +Note that tiffcomp.h defines HAVE_IEEEFP to be +1 (BSDTYPES is not defined). + + +


      Types and Portability

      + +The software makes extensive use of C typedefs to promote portability. +Two sets of typedefs are used, one for communication with clients +of the library and one for internal data structures and parsing of the +TIFF format. There are interactions between these two to be careful +of, but for the most part you should be able to deal with portability +purely by fiddling with the following machine-dependent typedefs: + + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      uint88-bit unsigned integertiff.h
      int88-bit signed integertiff.h
      uint1616-bit unsigned integertiff.h
      int1616-bit signed integertiff.h
      uint3232-bit unsigned integertiff.h
      int3232-bit signed integertiff.h
      dblparam_tpromoted type for floatstiffcomp.h
      + +

      +(to clarify dblparam_t, it is the type that float parameters are +promoted to when passed by value in a function call.) + +

      +The following typedefs are used throughout the library and interfaces +to refer to certain objects whose size is dependent on the TIFF image +structure: + + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      typedef unsigned int ttag_t; directory tag
      typedef uint16 tdir_t; directory index
      typedef uint16 tsample_t; sample number
      typedef uint32 tstrip_t; strip number
      typedef uint32 ttile_t; tile number
      typedef int32 tsize_t; i/o size in bytes
      typedef void* tdata_t; image data ref
      typedef void* thandle_t; client data handle
      typedef int32 toff_t; file offset (should be off_t)
      typedef unsigned char* tidata_t; internal image data
      + +

      +Note that tstrip_t, ttile_t, and tsize_t +are constrained to be +no more than 32-bit quantities by 32-bit fields they are stored +in in the TIFF image. Likewise tsample_t is limited by the 16-bit +field used to store the SamplesPerPixel tag. tdir_t +constrains +the maximum number of IFDs that may appear in an image and may +be an arbitrary size (without penalty). ttag_t must be either +int, unsigned int, pointer, or double +because the library uses a varargs +interface and ANSI C restricts the type of the parameter before an +ellipsis to be a promoted type. toff_t is defined as +int32 because +TIFF file offsets are (unsigned) 32-bit quantities. A signed +value is used because some interfaces return -1 on error (sigh). +Finally, note that tidata_t is used internally to the library to +manipulate internal data. User-specified data references are +passed as opaque handles and only cast at the lowest layers where +their type is presumed. + + +


      General Comments

      + +The library is designed to hide as much of the details of TIFF from +applications as +possible. In particular, TIFF directories are read in their entirety +into an internal format. Only the tags known by the library are +available to a user and certain tag data may be maintained that a user +does not care about (e.g. transfer function tables). + +


      Adding New Builtin Codecs

      + +To add builtin support for a new compression algorithm, you can either +use the "tag-extension" trick to override the handling of the +TIFF Compression tag (see Adding New Tags), +or do the following to add support directly to the core library: + +
        +
      1. Define the tag value in tiff.h. +
      2. Edit the file tif_codec.c to add an entry to the + _TIFFBuiltinCODECS array (see how other algorithms are handled). +
      3. Add the appropriate function prototype declaration to + tiffiop.h (close to the bottom). +
      4. Create a file with the compression scheme code, by convention files + are named tif_*.c (except perhaps on some systems where the + tif_ prefix pushes some filenames over 14 chars. +
      5. Edit Makefile.in (and any other Makefiles) + to include the new source file. +
      + +

      +A codec, say foo, can have many different entry points: + +

      +TIFFInitfoo(tif, scheme)/* initialize scheme and setup entry points in tif */
      +fooSetupDecode(tif)	/* called once per IFD after tags has been frozen */
      +fooPreDecode(tif, sample)/* called once per strip/tile, after data is read,
      +			    but before the first row is decoded */
      +fooDecode*(tif, bp, cc, sample)/* decode cc bytes of data into the buffer */
      +    fooDecodeRow(...)	/* called to decode a single scanline */
      +    fooDecodeStrip(...)	/* called to decode an entire strip */
      +    fooDecodeTile(...)	/* called to decode an entire tile */
      +fooSetupEncode(tif)	/* called once per IFD after tags has been frozen */
      +fooPreEncode(tif, sample)/* called once per strip/tile, before the first row in
      +			    a strip/tile is encoded */
      +fooEncode*(tif, bp, cc, sample)/* encode cc bytes of user data (bp) */
      +    fooEncodeRow(...)	/* called to decode a single scanline */
      +    fooEncodeStrip(...)	/* called to decode an entire strip */
      +    fooEncodeTile(...)	/* called to decode an entire tile */
      +fooPostEncode(tif)	/* called once per strip/tile, just before data is written */
      +fooSeek(tif, row)	/* seek forwards row scanlines from the beginning
      +			   of a strip (row will always be >0 and <rows/strip */
      +fooCleanup(tif)		/* called when compression scheme is replaced by user */
      +
      + +

      +Note that the encoding and decoding variants are only needed when +a compression algorithm is dependent on the structure of the data. +For example, Group 3 2D encoding and decoding maintains a reference +scanline. The sample parameter identifies which sample is to be +encoded or decoded if the image is organized with PlanarConfig=2 +(separate planes). This is important for algorithms such as JPEG. +If PlanarConfig=1 (interleaved), then sample will always be 0. + +


      Other Comments

      + +The library handles most I/O buffering. There are two data buffers +when decoding data: a raw data buffer that holds all the data in a +strip, and a user-supplied scanline buffer that compression schemes +place decoded data into. When encoding data the data in the +user-supplied scanline buffer is encoded into the raw data buffer (from +where it is written). Decoding routines should never have to explicitly +read data -- a full strip/tile's worth of raw data is read and scanlines +never cross strip boundaries. Encoding routines must be cognizant of +the raw data buffer size and call TIFFFlushData1() when necessary. +Note that any pending data is automatically flushed when a new strip/tile is +started, so there's no need do that in the tif_postencode routine (if +one exists). Bit order is automatically handled by the library when +a raw strip or tile is filled. If the decoded samples are interpreted +by the decoding routine before they are passed back to the user, then +the decoding logic must handle byte-swapping by overriding the +tif_postdecode +routine (set it to TIFFNoPostDecode) and doing the required work +internally. For an example of doing this look at the horizontal +differencing code in the routines in tif_predict.c. + +

      +The variables tif_rawcc, tif_rawdata, and +tif_rawcp in a TIFF structure +are associated with the raw data buffer. tif_rawcc must be non-zero +for the library to automatically flush data. The variable +tif_scanlinesize is the size a user's scanline buffer should be. The +variable tif_tilesize is the size of a tile for tiled images. This +should not normally be used by compression routines, except where it +relates to the compression algorithm. That is, the cc parameter to the +tif_decode* and tif_encode* +routines should be used in terminating +decompression/compression. This ensures these routines can be used, +for example, to decode/encode entire strips of data. + +

      +In general, if you have a new compression algorithm to add, work from +the code for an existing routine. In particular, +tif_dumpmode.c +has the trivial code for the "nil" compression scheme, +tif_packbits.c is a +simple byte-oriented scheme that has to watch out for buffer +boundaries, and tif_lzw.c has the LZW scheme that has the most +complexity -- it tracks the buffer boundary at a bit level. +Of course, using a private compression scheme (or private tags) limits +the portability of your TIFF files. + +

      +


      + +Last updated: $Date: 2004/09/10 14:47:31 $ + + + + diff --git a/src/3rdparty/libtiff/html/intro.html b/src/3rdparty/libtiff/html/intro.html new file mode 100644 index 0000000000..61c01d4a2d --- /dev/null +++ b/src/3rdparty/libtiff/html/intro.html @@ -0,0 +1,68 @@ + + + +Introduction to the TIFF Documentation + + + + +

      + +Introduction to the TIFF Documentation +

      + + +

      +The following definitions are used throughout this documentation. +They are consistent with the terminology used in the TIFF 6.0 specification. + +

      +
      Sample +
      The unit of information stored in an image; often called a + channel elsewhere. Sample values are numbers, usually unsigned + integers, but possibly in some other format if the SampleFormat + tag is specified in a TIFF +
      Pixel +
      A collection of one or more samples that go together. +
      Row +
      An Nx1 rectangular collection of pixels. +
      Tile +
      An NxM rectangular organization of data (or pixels). +
      Strip +
      A tile whose width is the full image width. +
      Compression +
      A scheme by which pixel or sample data are stored in + an encoded form, specifically with the intent of reducing the + storage cost. +
      Codec +
      Software that implements the decoding and encoding algorithms + of a compression scheme. + + +

      +In order to better understand how TIFF works (and consequently this +software) it is important to recognize the distinction between the +physical organization of image data as it is stored in a TIFF and how +the data is interpreted and manipulated as pixels in an image. TIFF +supports a wide variety of storage and data compression schemes that +can be used to optimize retrieval time and/or minimize storage space. +These on-disk formats are independent of the image characteristics; it +is the responsibility of the TIFF reader to process the on-disk storage +into an in-memory format suitable for an application. Furthermore, it +is the responsibility of the application to properly interpret the +visual characteristics of the image data. TIFF defines a framework for +specifying the on-disk storage format and image characteristics with +few restrictions. This permits significant complexity that can be +daunting. Good applications that handle TIFF work by handling as wide +a range of storage formats as possible, while constraining the +acceptable image characteristics to those that make sense for the +application. + + +

      +


      + +Last updated: $Date: 1999/08/09 20:21:21 $ + + + diff --git a/src/3rdparty/libtiff/html/libtiff.html b/src/3rdparty/libtiff/html/libtiff.html new file mode 100644 index 0000000000..6a2c42e607 --- /dev/null +++ b/src/3rdparty/libtiff/html/libtiff.html @@ -0,0 +1,747 @@ + + + + Using The TIFF Library + + + + + + + + + + +
      +

      Using The TIFF Library

      +

      + libtiff is a set of C functions (a library) that support + the manipulation of TIFF image files. + The library requires an ANSI C compilation environment for building + and presumes an ANSI C environment for use. +

      +
      +
      +

      + libtiff + provides interfaces to image data at several layers of abstraction (and cost). + At the highest level image data can be read into an 8-bit/sample, + ABGR pixel raster format without regard for the underlying data organization, + colorspace, or compression scheme. Below this high-level interface + the library provides scanline-, strip-, and tile-oriented interfaces that + return data decompressed but otherwise untransformed. These interfaces + require that the application first identify the organization of stored + data and select either a strip-based or tile-based API for manipulating + data. At the lowest level the library + provides access to the raw uncompressed strips or tiles, + returning the data exactly as it appears in the file. +

      +

      + The material presented in this chapter is a basic introduction + to the capabilities of the library; it is not an attempt to describe + everything a developer needs to know about the library or about TIFF. + Detailed information on the interfaces to the library are given in + the UNIX + manual pages that accompany this software. +

      +

      + Michael Still has also written a useful introduction to libtiff for the + IBM DeveloperWorks site available at + http://www.ibm.com/developerworks/linux/library/l-libtiff. +

      +

      + The following sections are found in this chapter: +

      + +
      +

      How to tell which version you have

      +

      + The software version can be found by looking at the file named + VERSION + that is located at the top of the source tree; the precise alpha number + is given in the file dist/tiff.alpha. + If you have need to refer to this + specific software, you should identify it as: +

      +

      + TIFF <version> <alpha> +

      +

      + where <version> is whatever you get from + "cat VERSION" and <alpha> is + what you get from "cat dist/tiff.alpha". +

      +

      + Within an application that uses libtiff the TIFFGetVersion + routine will return a pointer to a string that contains software version + information. + The library include file <tiffio.h> contains a C pre-processor + define TIFFLIB_VERSION that can be used to check library + version compatiblity at compile time. +

      +
      +

      Library Datatypes

      +

      + libtiff defines a portable programming interface through the + use of a set of C type definitions. + These definitions, defined in in the files tiff.h and + tiffio.h, + isolate the libtiff API from the characteristics + of the underlying machine. + To insure portable code and correct operation, applications that use + libtiff should use the typedefs and follow the function + prototypes for the library API. +

      +
      +

      Memory Management

      +

      + libtiff uses a machine-specific set of routines for managing + dynamically allocated memory. + _TIFFmalloc, _TIFFrealloc, and _TIFFfree + mimic the normal ANSI C routines. + Any dynamically allocated memory that is to be passed into the library + should be allocated using these interfaces in order to insure pointer + compatibility on machines with a segmented architecture. + (On 32-bit UNIX systems these routines just call the normal malloc, + realloc, and free routines in the C library.) +

      +

      + To deal with segmented pointer issues libtiff also provides + _TIFFmemcpy, _TIFFmemset, and _TIFFmemmove + routines that mimic the equivalent ANSI C routines, but that are + intended for use with memory allocated through _TIFFmalloc + and _TIFFrealloc. +

      +
      +

      Error Handling

      +

      + libtiff handles most errors by returning an invalid/erroneous + value when returning from a function call. + Various diagnostic messages may also be generated by the library. + All error messages are directed to a single global error handler + routine that can be specified with a call to TIFFSetErrorHandler. + Likewise warning messages are directed to a single handler routine + that can be specified with a call to TIFFSetWarningHandler +

      +
      +

      Basic File Handling

      +

      + The library is modeled after the normal UNIX stdio library. + For example, to read from an existing TIFF image the + file must first be opened: +

      +

      + #include "tiffio.h"
      + main()
      + {
      +     TIFF* tif = TIFFOpen("foo.tif", "r");
      +     ... do stuff ...
      +     TIFFClose(tif);
      + }
      +

      +

      + The handle returned by TIFFOpen is opaque, that is + the application is not permitted to know about its contents. + All subsequent library calls for this file must pass the handle + as an argument. +

      +

      + To create or overwrite a TIFF image the file is also opened, but with + a "w" argument: +

      +

      + #include "tiffio.h"
      + main()
      + {
      +     TIFF* tif = TIFFOpen("foo.tif", "w");
      +     ... do stuff ...
      +     TIFFClose(tif);
      + }
      +

      +

      + If the file already exists it is first truncated to zero length. +

      + + + + + +
      Note that unlike the stdio library TIFF image files may not be + opened for both reading and writing; + there is no support for altering the contents of a TIFF file.
      +

      + libtiff buffers much information associated with writing a + valid TIFF image. Consequently, when writing a TIFF image it is necessary + to always call TIFFClose or TIFFFlush to flush any + buffered information to a file. Note that if you call TIFFClose + you do not need to call TIFFFlush. +

      +
      +

      TIFF Directories

      +

      + TIFF supports the storage of multiple images in a single file. + Each image has an associated data structure termed a directory + that houses all the information about the format and content of the + image data. + Images in a file are usually related but they do not need to be; it + is perfectly alright to store a color image together with a black and + white image. + Note however that while images may be related their directories are + not. + That is, each directory stands on its own; their is no need to read + an unrelated directory in order to properly interpret the contents + of an image. +

      +

      + libtiff provides several routines for reading and writing + directories. In normal use there is no need to explicitly + read or write a directory: the library automatically reads the first + directory in a file when opened for reading, and directory information + to be written is automatically accumulated and written when writing + (assuming TIFFClose or TIFFFlush are called). +

      +

      + For a file open for reading the TIFFSetDirectory routine can + be used to select an arbitrary directory; directories are referenced by + number with the numbering starting at 0. Otherwise the + TIFFReadDirectory and TIFFWriteDirectory routines can + be used for sequential access to directories. + For example, to count the number of directories in a file the following + code might be used: +

      +

      + #include "tiffio.h"
      + main(int argc, char* argv[])
      + {
      +     TIFF* tif = TIFFOpen(argv[1], "r");
      +     if (tif) {
      +         int dircount = 0;
      +         do {
      +             dircount++;
      +         } while (TIFFReadDirectory(tif));
      +         printf("%d directories in %s\n", dircount, argv[1]);
      +         TIFFClose(tif);
      +     }
      +     exit(0);
      + }
      +

      +

      + Finally, note that there are several routines for querying the + directory status of an open file: + TIFFCurrentDirectory returns the index of the current + directory and + TIFFLastDirectory returns an indication of whether the + current directory is the last directory in a file. + There is also a routine, TIFFPrintDirectory, that can + be called to print a formatted description of the contents of + the current directory; consult the manual page for complete details. +

      +
      +

      TIFF Tags

      +

      + Image-related information such as the image width and height, number + of samples, orientation, colorimetric information, etc. + are stored in each image + directory in fields or tags. + Tags are identified by a number that is usually a value registered + with the Aldus (now Adobe) Corporation. + Beware however that some vendors write + TIFF images with tags that are unregistered; in this case interpreting + their contents is usually a waste of time. +

      +

      + libtiff reads the contents of a directory all at once + and converts the on-disk information to an appropriate in-memory + form. While the TIFF specification permits an arbitrary set of + tags to be defined and used in a file, the library only understands + a limited set of tags. + Any unknown tags that are encountered in a file are ignored. + There is a mechanism to extend the set of tags the library handles + without modifying the library itself; + this is described elsewhere. +

      +

      + libtiff provides two interfaces for getting and setting tag + values: TIFFGetField and TIFFSetField. + These routines use a variable argument list-style interface to pass + parameters of different type through a single function interface. + The get interface takes one or more pointers to memory locations + where the tag values are to be returned and also returns one or + zero according to whether the requested tag is defined in the directory. + The set interface takes the tag values either by-reference or + by-value. + The TIFF specification defines + default values for some tags. + To get the value of a tag, or its default value if it is undefined, + the TIFFGetFieldDefaulted interface may be used. +

      +

      + The manual pages for the tag get and set routines specifiy the exact data types + and calling conventions required for each tag supported by the library. +

      +
      +

      TIFF Compression Schemes

      +

      + libtiff includes support for a wide variety of + data compression schemes. + In normal operation a compression scheme is automatically used when + the TIFF Compression tag is set, either by opening a file + for reading, or by setting the tag when writing. +

      +

      + Compression schemes are implemented by software modules termed codecs + that implement decoder and encoder routines that hook into the + core library i/o support. + Codecs other than those bundled with the library can be registered + for use with the TIFFRegisterCODEC routine. + This interface can also be used to override the core-library + implementation for a compression scheme. +

      +
      +

      Byte Order

      +

      + The TIFF specification says, and has always said, that + a correct TIFF + reader must handle images in big-endian and little-endian byte order. + libtiff conforms in this respect. + Consequently there is no means to force a specific + byte order for the data written to a TIFF image file (data is + written in the native order of the host CPU unless appending to + an existing file, in which case it is written in the byte order + specified in the file). +

      +
      +

      Data Placement

      +

      + The TIFF specification requires that all information except an + 8-byte header can be placed anywhere in a file. + In particular, it is perfectly legitimate for directory information + to be written after the image data itself. + Consequently TIFF is inherently not suitable for passing through a + stream-oriented mechanism such as UNIX pipes. + Software that require that data be organized in a file in a particular + order (e.g. directory information before image data) does not + correctly support TIFF. + libtiff provides no mechanism for controlling the placement + of data in a file; image data is typically written before directory + information. +

      +
      +

      TIFFRGBAImage Support

      +

      + libtiff provides a high-level interface for reading image + data from a TIFF file. This interface handles the details of + data organization and format for a wide variety of TIFF files; + at least the large majority of those files that one would normally + encounter. Image data is, by default, returned as ABGR + pixels packed into 32-bit words (8 bits per sample). Rectangular + rasters can be read or data can be intercepted at an intermediate + level and packed into memory in a format more suitable to the + application. + The library handles all the details of the format of data stored on + disk and, in most cases, if any colorspace conversions are required: + bilevel to RGB, greyscale to RGB, CMYK to RGB, YCbCr to RGB, 16-bit + samples to 8-bit samples, associated/unassociated alpha, etc. +

      +

      + There are two ways to read image data using this interface. If + all the data is to be stored in memory and manipulated at once, + then the routine TIFFReadRGBAImage can be used: +

      +

      +

      + #include "tiffio.h"
      + main(int argc, char* argv[])
      + {
      +     TIFF* tif = TIFFOpen(argv[1], "r");
      +     if (tif) {
      +         uint32 w, h;
      +         size_t npixels;
      +         uint32* raster;
      +         
      +         TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
      +         TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
      +         npixels = w * h;
      +         raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
      +         if (raster != NULL) {
      +             if (TIFFReadRGBAImage(tif, w, h, raster, 0)) {
      +                 ...process raster data...
      +             }
      +             _TIFFfree(raster);
      +         }
      +         TIFFClose(tif);
      +     }
      +     exit(0);
      + }
      +

      +

      + Note above that _TIFFmalloc is used to allocate memory for + the raster passed to TIFFReadRGBAImage; this is important + to insure the ``appropriate type of memory'' is passed on machines + with segmented architectures. +

      +

      + Alternatively, TIFFReadRGBAImage can be replaced with a + more low-level interface that permits an application to have more + control over this reading procedure. The equivalent to the above + is: +

      +

      + #include "tiffio.h"
      + main(int argc, char* argv[])
      + {
      +     TIFF* tif = TIFFOpen(argv[1], "r");
      +     if (tif) {
      +         TIFFRGBAImage img;
      +         char emsg[1024];
      +         
      +         if (TIFFRGBAImageBegin(&img, tif, 0, emsg)) {
      +             size_t npixels;
      +             uint32* raster;
      +             
      +             npixels = img.width * img.height;
      +             raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
      +             if (raster != NULL) {
      +                 if (TIFFRGBAImageGet(&img, raster, img.width, img.height)) {
      +                     ...process raster data...
      +                 }
      +                 _TIFFfree(raster);
      +             }
      +             TIFFRGBAImageEnd(&img);
      +         } else
      +             TIFFError(argv[1], emsg);
      +         TIFFClose(tif);
      +     }
      +     exit(0);
      + }
      +

      +

      + However this usage does not take advantage of the more fine-grained + control that's possible. That is, by using this interface it is + possible to: +

      +
        +
      • repeatedly fetch (and manipulate) an image without opening + and closing the file
      • +
      • interpose a method for packing raster pixel data according to + application-specific needs (or write the data at all)
      • +
      • interpose methods that handle TIFF formats that are not already + handled by the core library
      • +
      +

      + The first item means that, for example, image viewers that want to + handle multiple files can cache decoding information in order to + speedup the work required to display a TIFF image. +

      +

      + The second item is the main reason for this interface. By interposing + a "put method" (the routine that is called to pack pixel data in + the raster) it is possible share the core logic that understands how + to deal with TIFF while packing the resultant pixels in a format that + is optimized for the application. This alternate format might be very + different than the 8-bit per sample ABGR format the library writes by + default. For example, if the application is going to display the image + on an 8-bit colormap display the put routine might take the data and + convert it on-the-fly to the best colormap indices for display. +

      +

      + The last item permits an application to extend the library + without modifying the core code. + By overriding the code provided an application might add support + for some esoteric flavor of TIFF that it needs, or it might + substitute a packing routine that is able to do optimizations + using application/environment-specific information. +

      +

      + The TIFF image viewer found in tools/sgigt.c is an example + of an application that makes use of the TIFFRGBAImage + support. +

      +
      +

      Scanline-based Image I/O

      +

      + The simplest interface provided by libtiff is a + scanline-oriented interface that can be used to read TIFF + images that have their image data organized in strips + (trying to use this interface to read data written in tiles + will produce errors.) + A scanline is a one pixel high row of image data whose width + is the width of the image. + Data is returned packed if the image data is stored with samples + packed together, or as arrays of separate samples if the data + is stored with samples separated. + The major limitation of the scanline-oriented interface, other + than the need to first identify an existing file as having a + suitable organization, is that random access to individual + scanlines can only be provided when data is not stored in a + compressed format, or when the number of rows in a strip + of image data is set to one (RowsPerStrip is one). +

      +

      + Two routines are provided for scanline-based i/o: + TIFFReadScanline + and + TIFFWriteScanline. + For example, to read the contents of a file that + is assumed to be organized in strips, the following might be used: +

      +

      + #include "tiffio.h"
      + main()
      + {
      +     TIFF* tif = TIFFOpen("myfile.tif", "r");
      +     if (tif) {
      +         uint32 imagelength;
      +         tdata_t buf;
      +         uint32 row;
      +         
      +         TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
      +         buf = _TIFFmalloc(TIFFScanlineSize(tif));
      +         for (row = 0; row < imagelength; row++)
      +             tiffreadscanline(tif, buf, row);
      +         _tifffree(buf);
      +         tiffclose(tif);
      +     }
      + }
      +

      +

      + TIFFScanlineSize returns the number of bytes in + a decoded scanline, as returned by TIFFReadScanline. + Note however that if the file had been create with samples + written in separate planes, then the above code would only + read data that contained the first sample of each pixel; + to handle either case one might use the following instead: +

      +

      + #include "tiffio.h"
      + main()
      + {
      +     TIFF* tif = TIFFOpen("myfile.tif", "r");
      +     if (tif) {
      +         uint32 imagelength;
      +         tdata_t buf;
      +         uint32 row;
      +         
      +         TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
      +         TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &config);
      +         buf = _TIFFmalloc(TIFFScanlineSize(tif));
      +         if (config == PLANARCONFIG_CONTIG) {
      +             for (row = 0; row < imagelength; row++)
      +                 tiffreadscanline(tif, buf, row);
      +         } else if (config == planarconfig_separate) {
      +             uint16 s, nsamples;
      +             
      +             tiffgetfield(tif, tifftag_samplesperpixel, &nsamples);
      +             for (s = 0; s < nsamples; s++)
      +                 for (row = 0; row < imagelength; row++)
      +                     tiffreadscanline(tif, buf, row, s);
      +         }
      +         _tifffree(buf);
      +         tiffclose(tif);
      +     }
      + }
      +

      +

      + Beware however that if the following code were used instead to + read data in the case PLANARCONFIG_SEPARATE,... +

      +

      +             for (row = 0; row < imagelength; row++)
      +                 for (s = 0; s < nsamples; s++)
      +                     tiffreadscanline(tif, buf, row, s);
      +

      +

      + ...then problems would arise if RowsPerStrip was not one + because the order in which scanlines are requested would require + random access to data within strips (something that is not supported + by the library when strips are compressed). +

      +
      +

      Strip-oriented Image I/O

      +

      + The strip-oriented interfaces provided by the library provide + access to entire strips of data. Unlike the scanline-oriented + calls, data can be read or written compressed or uncompressed. + Accessing data at a strip (or tile) level is often desirable + because there are no complications with regard to random access + to data within strips. +

      +

      + A simple example of reading an image by strips is: +

      +

      + #include "tiffio.h"
      + main()
      + {
      +     TIFF* tif = TIFFOpen("myfile.tif", "r");
      +     if (tif) {
      +         tdata_t buf;
      +         tstrip_t strip;
      +         
      +         buf = _TIFFmalloc(TIFFStripSize(tif));
      +         for (strip = 0; strip < tiffnumberofstrips(tif); strip++)
      +             tiffreadencodedstrip(tif, strip, buf, (tsize_t) -1);
      +         _tifffree(buf);
      +         tiffclose(tif);
      +     }
      + }
      +

      +

      + Notice how a strip size of -1 is used; TIFFReadEncodedStrip + will calculate the appropriate size in this case. +

      +

      + The above code reads strips in the order in which the + data is physically stored in the file. If multiple samples + are present and data is stored with PLANARCONFIG_SEPARATE + then all the strips of data holding the first sample will be + read, followed by strips for the second sample, etc. +

      +

      + Finally, note that the last strip of data in an image may have fewer + rows in it than specified by the RowsPerStrip tag. A + reader should not assume that each decoded strip contains a full + set of rows in it. +

      +

      + The following is an example of how to read raw strips of data from + a file: +

      +

      + #include "tiffio.h"
      + main()
      + {
      +     TIFF* tif = TIFFOpen("myfile.tif", "r");
      +     if (tif) {
      +         tdata_t buf;
      +         tstrip_t strip;
      +         uint32* bc;
      +         uint32 stripsize;
      +         
      +         TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &bc);
      +         stripsize = bc[0];
      +         buf = _TIFFmalloc(stripsize);
      +         for (strip = 0; strip < tiffnumberofstrips(tif); strip++) {
      +             if (bc[strip] > stripsize) {
      +                 buf = _TIFFrealloc(buf, bc[strip]);
      +                 stripsize = bc[strip];
      +             }
      +             TIFFReadRawStrip(tif, strip, buf, bc[strip]);
      +         }
      +         _TIFFfree(buf);
      +         TIFFClose(tif);
      +     }
      + }
      +

      +

      + As above the strips are read in the order in which they are + physically stored in the file; this may be different from the + logical ordering expected by an application. +

      +
      +

      Tile-oriented Image I/O

      +

      + Tiles of data may be read and written in a manner similar to strips. + With this interface, an image is + broken up into a set of rectangular areas that may have dimensions + less than the image width and height. All the tiles + in an image have the same size, and the tile width and length must each + be a multiple of 16 pixels. Tiles are ordered left-to-right and + top-to-bottom in an image. As for scanlines, samples can be packed + contiguously or separately. When separated, all the tiles for a sample + are colocated in the file. That is, all the tiles for sample 0 appear + before the tiles for sample 1, etc. +

      +

      + Tiles and strips may also be extended in a z dimension to form + volumes. Data volumes are organized as "slices". That is, all the + data for a slice is colocated. Volumes whose data is organized in + tiles can also have a tile depth so that data can be organized in + cubes. +

      +

      + There are actually two interfaces for tiles. + One interface is similar to scanlines, to read a tiled image, + code of the following sort might be used: +

      +

      + main()
      + {
      +     TIFF* tif = TIFFOpen("myfile.tif", "r");
      +     if (tif) {
      +         uint32 imageWidth, imageLength;
      +         uint32 tileWidth, tileLength;
      +         uint32 x, y;
      +         tdata_t buf;
      +         
      +         TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &imageWidth);
      +         TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imageLength);
      +         TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tileWidth);
      +         TIFFGetField(tif, TIFFTAG_TILELENGTH, &tileLength);
      +         buf = _TIFFmalloc(TIFFTileSize(tif));
      +         for (y = 0; y < imagelength; y += tilelength)
      +             for (x = 0; x < imagewidth; x += tilewidth)
      +                 tiffreadtile(tif, buf, x, y, 0);
      +         _tifffree(buf);
      +         tiffclose(tif);
      +     }
      + }
      +

      +

      + (once again, we assume samples are packed contiguously.) +

      +

      + Alternatively a direct interface to the low-level data is provided + a la strips. Tiles can be read with + TIFFReadEncodedTile or TIFFReadRawTile, + and written with TIFFWriteEncodedTile or + TIFFWriteRawTile. For example, to read all the tiles in an image: +

      +

      + #include "tiffio.h"
      + main()
      + {
      +     TIFF* tif = TIFFOpen("myfile.tif", "r");
      +     if (tif) {
      +         tdata_t buf;
      +         ttile_t tile;
      +         
      +         buf = _TIFFmalloc(TIFFTileSize(tif));
      +         for (tile = 0; tile < tiffnumberoftiles(tif); tile++)
      +             tiffreadencodedtile(tif, tile, buf, (tsize_t) -1);
      +         _tifffree(buf);
      +         tiffclose(tif);
      +     }
      + }
      +

      +
      +

      Other Stuff

      +

      + Some other stuff will almost certainly go here... +

      +
      +

      + Last updated: $Date: 2005/12/28 06:53:18 $ +

      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFClose.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFClose.3tiff.html new file mode 100644 index 0000000000..42e3ba8970 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFClose.3tiff.html @@ -0,0 +1,87 @@ + + + + + + +TIFFClose + + + +

      TIFFClose

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFClose − close a previously opened +TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      void TIFFClose(TIFF *tif)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFClose closes a file that was previously opened +with TIFFOpen(3TIFF). Any buffered data are flushed +to the file, including the contents of the current directory +(if modified); and all resources are reclaimed.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the routine. Likewise, +warning messages are directed to the +TIFFWarning(3TIFF) routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3TIFF), TIFFOpen(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFDataWidth.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFDataWidth.3tiff.html new file mode 100644 index 0000000000..237296e18d --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFDataWidth.3tiff.html @@ -0,0 +1,98 @@ + + + + + + +TIFFDataWidth + + + +

      TIFFDataWidth

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFDataWidth − Get the size of TIFF data types

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFDataWidth(TIFFDataType +type)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFDataWidth returns a size of type in +bytes. Currently following data types are supported:
      +TIFF_BYTE
      +TIFF_ASCII
      +TIFF_SBYTE
      +TIFF_UNDEFINED
      +TIFF_SHORT
      +TIFF_SSHORT
      +TIFF_LONG
      +TIFF_SLONG
      +TIFF_FLOAT
      +TIFF_IFD
      +TIFF_RATIONAL
      +TIFF_SRATIONAL
      +TIFF_DOUBLE

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      TIFFDataWidth returns a number of bytes occupied +by the item of given type. 0 returned when uknown data type +supplied.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3TIFF),

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFError.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFError.3tiff.html new file mode 100644 index 0000000000..5d39a139ec --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFError.3tiff.html @@ -0,0 +1,106 @@ + + + + + + +TIFFError + + + +

      TIFFError

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFError, TIFFSetErrorHandler − library error +handling interface

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      void TIFFError(const char *module, const +char *fmt, ...)

      + +

      #include <stdarg.h>

      + +

      typedef void (*TIFFErrorHandler)(const char +*module, const char *fmt, +va_list ap);
      +TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler +handler);

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFError invokes the library-wide error handling +function to (normally) write an error message to the +stderr. The fmt parameter is a +printf(3S) format string, and any number arguments +can be supplied. The module parameter, if non-zero, +is printed before the message; it typically is used to +identify the software module in which an error is +detected.

      + +

      Applications that desire to capture control in the event +of an error should use TIFFSetErrorHandler to +override the default error handler. A NULL +(0) error handling function may be installed to suppress +error messages.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      TIFFSetErrorHandler returns a reference to the +previous error handling function.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFWarning(3TIFF), libtiff(3TIFF), +printf(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFFlush.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFFlush.3tiff.html new file mode 100644 index 0000000000..f32ccd3da7 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFFlush.3tiff.html @@ -0,0 +1,113 @@ + + + + + + +TIFFFlush + + + +

      TIFFFlush

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFFlush, TIFFFlushData − flush pending writes to +an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFFlush(TIFF *tif)
      +int TIFFFlushData(TIFF *
      tif)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFFlush causes any pending writes for the +specified file (including writes for the current directory) +to be done. In normal operation this call is never needed +− the library automatically does any flushing +required.

      + +

      TIFFFlushData flushes any pending image data for +the specified file to be written out; directory-related data +are not flushed. In normal operation this call is never +needed − the library automatically does any flushing +required.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      0 is returned if an error is encountered, otherwise 1 is +returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFWriteEncodedStrip(3TIFF), +TIFFWriteEncodedTile(3TIFF), +TIFFWriteRawStrip(3TIFF), +TIFFWriteRawTile(3TIFF), +TIFFWriteScanline(3TIFF), TIFFWriteTile(3TIFF) +libtiff(3TIFF),

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFGetField.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFGetField.3tiff.html new file mode 100644 index 0000000000..e644b1d412 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFGetField.3tiff.html @@ -0,0 +1,1446 @@ + + + + + + +TIFFGetField + + + +

      TIFFGetField

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +AUTOREGISTERED TAGS
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFGetField, TIFFVGetField − get the value(s) of a +tag in an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFGetField(TIFF *tif, ttag_t +tag, ...)

      + +

      #include <stdarg.h>

      + +

      int TIFFVGetField(TIFF *tif, ttag_t +tag, va_list ap)
      +int TIFFGetFieldDefaulted(TIFF *
      tif, +ttag_t tag, ...)
      +int TIFFVGetFieldDefaulted(TIFF *
      tif, +ttag_t tag, va_list ap)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFGetField returns the value of a tag or +pseudo-tag associated with the the current directory of the +opened TIFF file tif. (A +pseudo-tag is a parameter that is used to control the +operation of the TIFF library but whose value +is not read or written to the underlying file.) The file +must have been previously opened with +TIFFOpen(3TIFF). The tag is identified by tag, +one of the values defined in the include file tiff.h +(see also the table below). The type and number of values +returned is dependent on the tag being requested. The +programming interface uses a variable argument list as +prescribed by the stdarg(3) interface. The returned +values should only be interpreted if TIFFGetField +returns 1.

      + +

      TIFFVGetField is functionally equivalent to +TIFFGetField except that it takes a pointer to a +variable argument list. TIFFVGetField is useful for +layering interfaces on top of the functionality provided by +TIFFGetField.

      + +

      TIFFGetFieldDefaulted and +TIFFVGetFieldDefaulted are identical to +TIFFGetField and TIFFVGetField, except that if +a tag is not defined in the current directory and it has a +default value, then the default value is returned.

      + +

      The tags understood by libtiff(3TIFF), the number +of parameter values, and the types for the returned values +are shown below. The data types are specified as in C and +correspond to the types used to specify tag values to +TIFFSetField(3TIFF). Remember that +TIFFGetField returns parameter values, so all the +listed data types are pointers to storage where values +should be returned. Consult the TIFF +specification (or relevant industry specification) for +information on the meaning of each tag and their possible +values.

      + + +

      Tag Name Count Types Notes

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      TIFFTAG_ARTIST

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_BADFAXLINES

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_BITSPERSAMPLE

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_CLEANFAXDATA

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_COLORMAP

      +
      + +

      3

      +
      + +

      uint16**

      +
      + +

      1<<BitsPerSample arrays

      +
      + +

      TIFFTAG_COMPRESSION

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_CONSECUTIVEBADFAXLINES

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_COPYRIGHT

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_DATATYPE

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_DATETIME

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_DOCUMENTNAME

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_DOTRANGE

      +
      + +

      2

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_EXTRASAMPLES

      +
      + +

      2

      +
      + +

      uint16*,uint16**

      +
      + +

      count & types array

      +
      + +

      TIFFTAG_FAXFILLFUNC

      +
      + +

      1

      +
      + +

      TIFFFaxFillFunc*

      +
      + +

      G3/G4 compression pseudo-tag

      +
      + +

      TIFFTAG_FAXMODE

      +
      + +

      1

      +
      + +

      int*

      +
      + +

      G3/G4 compression pseudo-tag

      +
      + +

      TIFFTAG_FILLORDER

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_GROUP3OPTIONS

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_GROUP4OPTIONS

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_HALFTONEHINTS

      +
      + +

      2

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_HOSTCOMPUTER

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_ICCPROFILE

      +
      + +

      2

      +
      + +

      uint32*,void**

      +
      + +

      count, profile data

      +
      + +

      TIFFTAG_IMAGEDEPTH

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_IMAGEDESCRIPTION

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_IMAGELENGTH

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_IMAGEWIDTH

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_INKNAMES

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_INKSET

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_JPEGCOLORMODE

      +
      + +

      1

      +
      + +

      int*

      +
      + +

      JPEG pseudo-tag

      +
      + +

      TIFFTAG_JPEGQUALITY

      +
      + +

      1

      +
      + +

      int*

      +
      + +

      JPEG pseudo-tag

      +
      + +

      TIFFTAG_JPEGTABLES

      +
      + +

      2

      +
      + +

      uint32*,void**

      +
      + +

      count & tables

      +
      + +

      TIFFTAG_JPEGTABLESMODE

      +
      + +

      1

      +
      + +

      int*

      +
      + +

      JPEG pseudo-tag

      +
      + +

      TIFFTAG_MAKE

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_MATTEING

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_MAXSAMPLEVALUE

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_MINSAMPLEVALUE

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_MODEL

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_ORIENTATION

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_PAGENAME

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_PAGENUMBER

      +
      + +

      2

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_PHOTOMETRIC

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_PHOTOSHOP

      +
      + +

      2

      +
      + +

      uint32*,void**

      +
      + +

      count, data

      +
      + +

      TIFFTAG_PLANARCONFIG

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_PREDICTOR

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_PRIMARYCHROMATICITIES

      +
      + +

      1

      +
      + +

      float**

      +
      + +

      6-entry array

      +
      + +

      TIFFTAG_REFERENCEBLACKWHITE

      +
      + +

      1

      +
      + +

      float**

      +
      + +

      2*SamplesPerPixel array

      +
      + +

      TIFFTAG_RESOLUTIONUNIT

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_RICHTIFFIPTC

      +
      + +

      2

      +
      + +

      uint32*,void**

      +
      + +

      count, data

      +
      + +

      TIFFTAG_ROWSPERSTRIP

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_SAMPLEFORMAT

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_SAMPLESPERPIXEL

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_SMAXSAMPLEVALUE

      +
      + +

      1

      +
      + +

      double*

      +
      +
      + +

      TIFFTAG_SMINSAMPLEVALUE

      +
      + +

      1

      +
      + +

      double*

      +
      +
      + +

      TIFFTAG_SOFTWARE

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_STONITS

      +
      + +

      1

      +
      + +

      double**

      +
      +
      + +

      TIFFTAG_STRIPBYTECOUNTS

      +
      + +

      1

      +
      + +

      uint32**

      +
      +
      + +

      TIFFTAG_STRIPOFFSETS

      +
      + +

      1

      +
      + +

      uint32**

      +
      +
      + +

      TIFFTAG_SUBFILETYPE

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_SUBIFD

      +
      + +

      2

      +
      + +

      uint16*,uint32**

      +
      + +

      count & offsets array

      +
      + +

      TIFFTAG_TARGETPRINTER

      +
      + +

      1

      +
      + +

      char**

      +
      +
      + +

      TIFFTAG_THRESHHOLDING

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_TILEBYTECOUNTS

      +
      + +

      1

      +
      + +

      uint32**

      +
      +
      + +

      TIFFTAG_TILEDEPTH

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_TILELENGTH

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_TILEOFFSETS

      +
      + +

      1

      +
      + +

      uint32**

      +
      +
      + +

      TIFFTAG_TILEWIDTH

      +
      + +

      1

      +
      + +

      uint32*

      +
      +
      + +

      TIFFTAG_TRANSFERFUNCTION

      +
      + +

      1 or 3†

      +
      + +

      uint16**1<<BitsPerSample entry arrays

      +
      + +

      TIFFTAG_WHITEPOINT

      +
      + +

      1

      +
      + +

      float**

      +
      + +

      2-entry array

      +
      + +

      TIFFTAG_XMLPACKET

      +
      + +

      2

      +
      + +

      uint32*,void**

      +
      + +

      count, data

      +
      + +

      TIFFTAG_XPOSITION

      +
      + +

      1

      +
      + +

      float*

      +
      +
      + +

      TIFFTAG_XRESOLUTION

      +
      + +

      1

      +
      + +

      float*

      +
      +
      + +

      TIFFTAG_YCBCRCOEFFICIENTS

      +
      + +

      1

      +
      + +

      float**

      +
      + +

      3-entry array

      +
      + +

      TIFFTAG_YCBCRPOSITIONING

      +
      + +

      1

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_YCBCRSUBSAMPLING

      +
      + +

      2

      +
      + +

      uint16*

      +
      +
      + +

      TIFFTAG_YPOSITION

      +
      + +

      1

      +
      + +

      float*

      +
      +
      + +

      TIFFTAG_YRESOLUTION

      +
      + +

      1

      +
      + +

      float*‡

      +
      +
      + + + + + +
      +

      † If SamplesPerPixel is one, then a single +array is returned; otherwise three arrays are returned.
      +‡ The contents of this field are quite complex. See +The ICC Profile Format Specification, Annex B.3 +"Embedding ICC Profiles in TIFF Files" (available +at http://www.color.org) for an explanation.

      +
      + +

      AUTOREGISTERED TAGS

      + + + + + +
      +

      If you can’t find the tag in the table above that +means this is unsupported tag. But you still be able to read +it’s value if you know the data type of that tag. For +example, if you want to read the LONG value from the tag +33424 and ASCII string from the tag 36867 you can use the +following code:

      +
      + + + + + +
      +
      uint16  count;
      +void    *data;
      +
      +TIFFGetField(tiff, 33424, &count, &data);
      +printf("Tag %d: %d, count %d0, 33424, *(uint32 *)data, count);
      +TIFFGetField(tiff, 36867, &count, &data);
      +printf("Tag %d: %s, count %d0, 36867, (char *)data, count);
      +
      +
      + + + + + + +
      +

      is not supported by libtiff(3TIFF), library

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      1 is returned if the tag is defined in the current +directory; otherwise a 0 is returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      Unknown field, tag 0x%x. An unknown tag was +supplied.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFSetField(3TIFF), +TIFFSetDirectory(3TIFF), +TIFFReadDirectory(3TIFF), +TIFFWriteDirectory(3TIFF) libtiff(3TIFF),

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFOpen.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFOpen.3tiff.html new file mode 100644 index 0000000000..6bc85d84e0 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFOpen.3tiff.html @@ -0,0 +1,421 @@ + + + + + + +TIFFOpen + + + +

      TIFFOpen

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +BYTE ORDER
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFOpen, TIFFFdOpen, TIFFClientOpen − open a +TIFF file for reading or writing

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      TIFF* TIFFOpen(const char *filename, +const char *mode)
      +TIFF* TIFFFdOpen(const int
      fd, const char +*filename, const char +*mode)

      + +

      typedef tsize_t (*TIFFReadWriteProc)(thandle_t, +tdata_t, tsize_t);
      +typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
      +typedef int (*TIFFCloseProc)(thandle_t);
      +typedef toff_t (*TIFFSizeProc)(thandle_t);
      +typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, +toff_t*);
      +typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, +toff_t);

      + +

      TIFF* TIFFClientOpen(const char +*filename, const char *mode, +thandle_t clientdata, TIFFReadWriteProc +readproc, TIFFReadWriteProc +writeproc, TIFFSeekProc seekproc, +TIFFCloseProc closeproc, TIFFSizeProc +sizeproc, TIFFMapFileProc mapproc, +TIFFUnmapFileProc unmapproc)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFOpen opens a TIFF file whose +name is filename and returns a handle to be used in +subsequent calls to routines in libtiff. If the open +operation fails, then zero is returned. The mode +parameter specifies if the file is to be opened for reading +(‘‘r’’), writing +(‘‘w’’), or appending +(‘‘a’’) and, optionally, whether to +override certain default aspects of library operation (see +below). When a file is opened for appending, existing data +will not be touched; instead new data will be written as +additional subfiles. If an existing file is opened for +writing, all previous data is overwritten.

      + +

      If a file is opened for reading, the first +TIFF directory in the file is automatically +read (also see TIFFSetDirectory(3TIFF) for reading +directories other than the first). If a file is opened for +writing or appending, a default directory is automatically +created for writing subsequent data. This directory has all +the default values specified in TIFF Revision +6.0: BitsPerSample=1, ThreshHolding=bilevel +art scan, FillOrder=1 (most significant bit of each +data byte is filled first), Orientation=1 (the 0th +row represents the visual top of the image, and the 0th +column represents the visual left hand side), +SamplesPerPixel=1, RowsPerStrip=infinity, +ResolutionUnit=2 (inches), and Compression=1 +(no compression). To alter these values, or to define values +for additional fields, TIFFSetField(3TIFF) must be +used.

      + +

      TIFFFdOpen is like TIFFOpen except that it +opens a TIFF file given an open file +descriptor fd. The file’s name and mode must +reflect that of the open descriptor. The object associated +with the file descriptor must support random +access.

      + +

      TIFFClientOpen is like TIFFOpen except that +the caller supplies a collection of functions that the +library will use to do UNIX -like I/O +operations. The readproc and writeproc are +called to read and write data at the current file position. +seekproc is called to change the current file +position a la lseek(2). closeproc is invoked +to release any resources associated with an open file. +sizeproc is invoked to obtain the size in bytes of a +file. mapproc and unmapproc are called to map +and unmap a file’s contents in memory; c.f. +mmap(2) and munmap(2). The clientdata +parameter is an opaque ‘‘handle’’ +passed to the client-specified routines passed as parameters +to TIFFClientOpen.

      +
      + +

      OPTIONS

      + + + + + +
      +

      The open mode parameter can include the following flags +in addition to the ‘‘r’’, +‘‘w’’, and +‘‘a’’ flags. Note however that +option flags must follow the read-write-append +specification.

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      l

      +
      + +

      When creating a new file force information be written +with Little-Endian byte order (but see below). By default +the library will create new files using the native +CPU byte order.

      +
      +
      + +

      b

      +
      + +

      When creating a new file force information be written +with Big-Endian byte order (but see below). By default the +library will create new files using the native +CPU byte order.

      +
      +
      + +

      L

      +
      + +

      Force image data that is read or written to be treated +with bits filled from Least Significant Bit ( +LSB ) to Most Significant Bit ( +MSB ). Note that this is the opposite to the +way the library has worked from its inception.

      +
      +
      + +

      B

      +
      + +

      Force image data that is read or written to be treated +with bits filled from Most Significant Bit ( +MSB ) to Least Significant Bit ( +LSB ); this is the default.

      +
      +
      + +

      H

      +
      + +

      Force image data that is read or written to be treated +with bits filled in the same order as the native +CPU.

      +
      +
      + +

      M

      +
      + +

      Enable the use of memory-mapped files for images opened +read-only. If the underlying system does not support +memory-mapped files or if the specific image being opened +cannot be memory-mapped then the library will fallback to +using the normal system interface for reading information. +By default the library will attempt to use memory-mapped +files.

      +
      +
      + +

      m

      +
      + +

      Disable the use of memory-mapped files.

      +
      +
      + +

      C

      +
      + +

      Enable the use of ‘‘strip +chopping’’ when reading images that are +comprised of a single strip or tile of uncompressed data. +Strip chopping is a mechanism by which the library will +automatically convert the single-strip image to multiple +strips, each of which has about 8 Kilobytes of data. This +facility can be useful in reducing the amount of memory used +to read an image because the library normally reads each +strip in its entirety. Strip chopping does however alter the +apparent contents of the image because when an image is +divided into multiple strips it looks as though the +underlying file contains multiple separate strips. Finally, +note that default handling of strip chopping is a +compile-time configuration parameter. The default behaviour, +for backwards compatibility, is to enable strip +chopping.

      +
      +
      + +

      c

      +
      + +

      Disable the use of strip chopping when reading +images.

      +
      +
      + +

      h

      +
      + +

      Read TIFF header only, do not load the first image +directory. That could be useful in case of the broken first +directory. We can open the file and proceed to the other +directories.

      +
      +
      + +

      BYTE ORDER

      + + + + + +
      +

      The TIFF specification (all +versions) states that compliant readers must be +capable of reading images written in either byte order. +Nonetheless some software that claims to support the reading +of TIFF images is incapable of reading images +in anything but the native CPU byte order on +which the software was written. (Especially notorious are +applications written to run on Intel-based machines.) By +default the library will create new files with the native +byte-order of the CPU on which the +application is run. This ensures optimal performance and is +portable to any application that conforms to the TIFF +specification. To force the library to use a specific +byte-order when creating a new file the +‘‘b’’ and +‘‘l’’ option flags may be included +in the call to open a file; for example, +‘‘wb’’ or +‘‘wl’’.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      Upon successful completion TIFFOpen, +TIFFFdOpen, and TIFFClientOpen return a +TIFF pointer. Otherwise, NULL is +returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine. Likewise, warning messages +are directed to the TIFFWarning(3TIFF) routine.

      + +

      "%s": Bad mode. The specified +mode parameter was not one of +‘‘r’’ (read), +‘‘w’’ (write), or +‘‘a’’ (append).

      + +

      %s: Cannot open. TIFFOpen() was unable to +open the specified filename for read/writing.

      + +

      Cannot read TIFF header. An error occurred while +attempting to read the header information.

      + +

      Error writing TIFF header. An error occurred while +writing the default header information for a new file.

      + +

      Not a TIFF file, bad magic number %d (0x%x). The +magic number in the header was not (hex) 0x4d4d or (hex) +0x4949.

      + +

      Not a TIFF file, bad version number %d (0x%x). The +version field in the header was not 42 (decimal).

      + +

      Cannot append to file that has opposite byte +ordering. A file with a byte ordering opposite to the +native byte ordering of the current machine was opened for +appending (‘‘a’’). This is a +limitation of the library.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3TIFF), TIFFClose(3TIFF)

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFPrintDirectory.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFPrintDirectory.3tiff.html new file mode 100644 index 0000000000..a5f418a115 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFPrintDirectory.3tiff.html @@ -0,0 +1,225 @@ + + + + + + +TIFFPrintDirectory + + + +

      TIFFPrintDirectory

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFPrintDirectory − print a description of a +TIFF directory

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      void TIFFPrintDirectory(TIFF *tif, FILE +*fd, long flags)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFPrintDirectory prints a description of the +current directory in the specified TIFF file +to the standard I/O output stream fd. The +flags parameter is used to control the level of +detail of the printed information; it is a bit-or of the +flags defined in tiffio.h:

      + + +

      #define TIFFPRINT_NONE 0x0 /* no extra info */

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      #define

      +
      + +

      TIFFPRINT_STRIPS

      +
      + +

      0x1

      +
      + +

      /* strips/tiles info */

      +
      + +

      #define

      +
      + +

      TIFFPRINT_CURVES

      +
      + +

      0x2

      +
      + +

      /* color/gray response curves */

      +
      + +

      #define

      +
      + +

      TIFFPRINT_COLORMAP

      +
      + +

      0x4

      +
      + +

      /* colormap */

      +
      + +

      #define

      +
      + +

      TIFFPRINT_JPEGQTABLES

      +
      + +

      0x100

      +
      + +

      /* JPEG Q matrices */

      +
      + +

      #define

      +
      + +

      TIFFPRINT_JPEGACTABLES

      +
      + +

      0x200

      +
      + +

      /* JPEG AC tables */

      +
      + +

      #define

      +
      + +

      TIFFPRINT_JPEGDCTABLES

      +
      + +

      0x200

      +
      + +

      /* JPEG DC tables */

      +
      + +

      NOTES

      + + + + + +
      +

      In C++ the flags parameter defaults to 0.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      None.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      None.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3TIFF), TIFFOpen(3TIFF), +TIFFReadDirectory(3TIFF), +TIFFSetDirectory(3TIFF)

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFRGBAImage.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFRGBAImage.3tiff.html new file mode 100644 index 0000000000..7bbee0f25e --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFRGBAImage.3tiff.html @@ -0,0 +1,319 @@ + + + + + + +TIFFRGBAImage + + + +

      TIFFRGBAImage

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +ALTERNATE RASTER FORMATS
      +SIMULTANEOUS RASTER STORE AND DISPLAY
      +SUPPORTING ADDITIONAL TIFF FORMATS
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFRGBAImageOK, TIFFRGBAImageBegin, TIFFRGBAImageGet, +TIFFRGBAImageEnd − read and decode an image into a +raster

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      typedef unsigned char TIFFRGBValue; typedef struct +_TIFFRGBAImage TIFFRGBAImage;

      + +

      int TIFFRGBAImageOK(TIFF *tif, char +emsg[1024])
      +int TIFFRGBAImageBegin(TIFFRGBAImage *
      img, +TIFF* tif, int stopOnError, +char emsg[1024])
      +int TIFFRGBAImageGet(TIFFRGBAImage *
      img, +uint32* raster, uint32 width , +uint32 height)
      +void TIFFRGBAImageEnd(TIFFRGBAImage +*
      img)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      The routines described here provide a high-level +interface through which TIFF images may be +read into memory. Images may be strip- or tile-based and +have a variety of different characteristics: bits/sample, +samples/pixel, photometric, etc. Decoding state is +encapsulated in a TIFFRGBAImage structure making it +possible to capture state for multiple images and quickly +switch between them. The target raster format can be +customized to a particular application’s needs by +installing custom routines that manipulate image data +according to application requirements.

      + +

      The default usage for these routines is: check if an +image can be processed using TIFFRGBAImageOK, +construct a decoder state block using +TIFFRGBAImageBegin, read and decode an image into a +target raster using TIFFRGBAImageGet, and then +release resources using TIFFRGBAImageEnd. +TIFFRGBAImageGet can be called multiple times to +decode an image using different state parameters. If +multiple images are to be displayed and there is not enough +space for each of the decoded rasters, multiple state blocks +can be managed and then calls can be made to +TIFFRGBAImageGet as needed to display an image.

      + +

      The generated raster is assumed to be an array of +width times height 32-bit entries, where +width must be less than or equal to the width of the +image (height may be any non-zero size). If the +raster dimensions are smaller than the image, the image data +is cropped to the raster bounds. If the raster height is +greater than that of the image, then the image data are +placed in the lower part of the raster. (Note that the +raster is assume to be organized such that the pixel at +location (x,y) is +raster[y*width+x]; with the +raster origin in the lower-left hand corner.)

      + +

      Raster pixels are 8-bit packed red, green, blue, alpha +samples. The macros TIFFGetR, TIFFGetG, +TIFFGetB, and TIFFGetA should be used to +access individual samples. Images without Associated Alpha +matting information have a constant Alpha of 1.0 (255).

      + +

      TIFFRGBAImageGet converts non-8-bit images by +scaling sample values. Palette, grayscale, bilevel, +CMYK , and YCbCr images are converted to +RGB transparently. Raster pixels are returned +uncorrected by any colorimetry information present in the +directory.

      + +

      The parameter stopOnError specifies how to act if +an error is encountered while reading the image. If +stopOnError is non-zero, then an error will terminate +the operation; otherwise TIFFRGBAImageGet will +continue processing data until all the possible data in the +image have been requested.

      +
      + +

      ALTERNATE RASTER FORMATS

      + + + + + +
      +

      To use the core support for reading and processing +TIFF images, but write the resulting raster +data in a different format one need only override the +‘‘put methods’’ used to store +raster data. These methods are are defined in the +TIFFRGBAImage structure and initially setup by +TIFFRGBAImageBegin to point to routines that pack +raster data in the default ABGR pixel format. +Two different routines are used according to the physical +organization of the image data in the file: +PlanarConfiguration=1 (packed samples), and +PlanarConfiguration=2 (separated samples). Note that +this mechanism can be used to transform the data before +storing it in the raster. For example one can convert data +to colormap indices for display on a colormap display.

      +
      + +

      SIMULTANEOUS RASTER STORE AND DISPLAY

      + + + + + +
      +

      It is simple to display an image as it is being read into +memory by overriding the put methods as described above for +supporting alternate raster formats. Simply keep a reference +to the default put methods setup by +TIFFRGBAImageBegin and then invoke them before or +after each display operation. For example, the +tiffgt(1) utility uses the following put method to +update the display as the raster is being filled:

      + +
      static void
      +putContigAndDraw(TIFFRGBAImage* img, uint32* raster,
      +    uint32 x, uint32 y, uint32 w, uint32 h,
      +    int32 fromskew, int32 toskew,
      +    unsigned char* cp)
      +{
      +    (*putContig)(img, raster, x, y, w, h, fromskew, toskew, cp);
      +    if (x+w == width) {
      +     w = width;
      +     if (img->orientation == ORIENTATION_TOPLEFT)
      +         lrectwrite(0, y-(h-1), w-1, y, raster-x-(h-1)*w);
      +     else
      +         lrectwrite(0, y, w-1, y+h-1, raster);
      +    }
      +}
      +
      + +

      (the original routine provided by the library is saved in +the variable putContig.)

      +
      + +

      SUPPORTING ADDITIONAL TIFF FORMATS

      + + + + + +
      +

      The TIFFRGBAImage routines support the most +commonly encountered flavors of TIFF. It is +possible to extend this support by overriding the +‘‘get method’’ invoked by +TIFFRGBAImageGet to read TIFF image +data. Details of doing this are a bit involved, it is best +to make a copy of an existing get method and modify it to +suit the needs of an application.

      +
      + +

      NOTES

      + + + + + +
      +

      Samples must be either 1, 2, 4, 8, or 16 bits. +Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. +SamplesPerPixel minus ExtraSamples).

      + +

      Palette image colormaps that appear to be incorrectly +written as 8-bit values are automatically scaled to +16-bits.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      All routines return 1 if the operation was successful. +Otherwise, 0 is returned if an error was encountered and +stopOnError is zero.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      Sorry, can not handle %d-bit pictures. The image +had BitsPerSample other than 1, 2, 4, 8, or 16.

      + +

      Sorry, can not handle %d-channel images. The image +had SamplesPerPixel other than 1, 3, or 4.

      + +

      Missing needed "PhotometricInterpretation" +tag. The image did not have a tag that describes how to +display the data.

      + +

      No "PhotometricInterpretation" tag, assuming +RGB. The image was missing a tag that describes how to +display it, but because it has 3 or 4 samples/pixel, it is +assumed to be RGB.

      + +

      No "PhotometricInterpretation" tag, assuming +min-is-black. The image was missing a tag that describes +how to display it, but because it has 1 sample/pixel, it is +assumed to be a grayscale or bilevel image.

      + +

      No space for photometric conversion table. There +was insufficient memory for a table used to convert image +samples to 8-bit RGB.

      + +

      Missing required "Colormap" tag. A +Palette image did not have a required Colormap +tag.

      + +

      No space for tile buffer. There was insufficient +memory to allocate an i/o buffer.

      + +

      No space for strip buffer. There was insufficient +memory to allocate an i/o buffer.

      + +

      Can not handle format. The image has a format +(combination of BitsPerSample, +SamplesPerPixel, and +PhotometricInterpretation) that can not be +handled.

      + +

      No space for B&W mapping table. There was +insufficient memory to allocate a table used to map +grayscale data to RGB.

      + +

      No space for Palette mapping table. There was +insufficient memory to allocate a table used to map data to +8-bit RGB.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFReadRGBAImage(3TIFF), +TIFFReadRGBAImageOriented(3TIFF), +TIFFReadRGBAStrip(3TIFF), +TIFFReadRGBATile(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadDirectory.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadDirectory.3tiff.html new file mode 100644 index 0000000000..5bb828efa7 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadDirectory.3tiff.html @@ -0,0 +1,218 @@ + + + + + + +TIFFReadDirectory + + + +

      TIFFReadDirectory

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadDirectory − get the contents of the +next directory in an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFReadDirectory(TIFF +*tif)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Read the next directory in the specified file and +make it the current directory. Applications only need to +call TIFFReadDirectory to read multiple subfiles in a +single TIFF file— the first directory in a +file is automatically read when TIFFOpen is +called.

      +
      + +

      NOTES

      + + + + + +
      +

      If the library is compiled with +STRIPCHOP_SUPPORT enabled, then images that have a +single uncompressed strip or tile of data are automatically +treated as if they were made up of multiple strips or tiles +of approximately 8 kilobytes each. This operation is done +only in-memory; it does not alter the contents of the file. +However, the construction of the ‘‘chopped +strips’’ is visible to the application through +the number of strips [tiles] returned by +TIFFNumberOfStrips +[TIFFNumberOfTiles].

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      If the next directory was successfully read, 1 is +returned. Otherwise, 0 is returned if an error was +encountered, or if there are no more directories to be +read.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine. All warning messages are +directed to the TIFFWarning(3TIFF) routine.

      + +

      Seek error accessing TIFF directory. An error +occurred while positioning to the location of the +directory.

      + +

      Wrong data type %d for field "%s". +The tag entry in the directory had an incorrect data type. +For example, an ImageDescription tag with a +SHORT data type.

      + +

      TIFF directory is missing required "%s" +field. The specified tag is required to be present by +the TIFF 5.0 specification, but is missing. The +directory is (usually) unusable.

      + +

      %s: Rational with zero denominator. A +directory tag has a RATIONAL value whose +denominator is zero.

      + +

      Incorrect count %d for field "%s" (%lu, +expecting %lu); tag ignored. The specified tag’s +count field is bad. For example, a count other than 1 for a +SubFileType tag.

      + +

      Cannot handle different per-sample values for +field "%s". The tag has SamplesPerPixel +values and they are not all the same; e.g. +BitsPerSample. The library is unable to handle images +of this sort.

      + +

      Count mismatch for field "%s"; +expecting %d, got %d. The count field in a tag does not +agree with the number expected by the library. This should +never happen, so if it does, the library refuses to read the +directory.

      + +

      Invalid TIFF directory; tags are not sorted in +ascending order. The directory tags are not properly +sorted as specified in the TIFF 5.0 +specification. This error is not fatal.

      + +

      Ignoring unknown field with tag %d (0x%x). An +unknown tag was encountered in the directory; the library +ignores all such tags.

      + +

      TIFF directory is missing requred +"ImageLength" field. The image violates the +specification by not having a necessary field. There is no +way for the library to recover from this error.

      + +

      TIFF directory is missing requred +"PlanarConfig" field. The image violates the +specification by not having a necessary field. There is no +way for the library to recover from this error.

      + +

      TIFF directory is missing requred +"StripOffsets" field. The image has multiple +strips, but is missing the tag that specifies the file +offset to each strip of data. There is no way for the +library to recover from this error.

      + +

      TIFF directory is missing requred +"TileOffsets" field. The image has multiple +tiles, but is missing the tag that specifies the file offset +to each tile of data. There is no way for the library to +recover from this error.

      + +

      TIFF directory is missing required +"StripByteCounts" field. The image has +multiple strips, but is missing the tag that specifies the +size of each strip of data. There is no way for the library +to recover from this error.

      + +

      TIFF directory is missing required +"StripByteCounts" field, calculating from +imagelength. The image violates the specification by not +having a necessary field. However, when the image is +comprised of only one strip or tile, the library will +estimate the missing value based on the file size.

      + +

      Bogus "StripByteCounts" field, ignoring +and calculating from imagelength. Certain vendors +violate the specification by writing zero for the +StripByteCounts tag when they want to leave the value +unspecified. If the image has a single strip, the library +will estimate the missing value based on the file +size.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFWriteDirectory(3TIFF), +TIFFSetDirectory(3TIFF), +TIFFSetSubDirectory(3TIFF), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadEncodedStrip.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadEncodedStrip.3tiff.html new file mode 100644 index 0000000000..39d411d765 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadEncodedStrip.3tiff.html @@ -0,0 +1,133 @@ + + + + + + +TIFFReadEncodedStrip + + + +

      TIFFReadEncodedStrip

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadEncodedStrip − read and decode a strip +of data from an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFReadEncodedStrip(TIFF +*tif, tstrip_t strip, +tdata_t buf, tsize_t +size)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Read the specified strip of data and place up to +size bytes of decompressed information in the (user +supplied) data buffer.

      +
      + +

      NOTES

      + + + + + +
      +

      The value of strip is a ‘‘raw +strip number.’’ That is, the caller must take +into account whether or not the data are organized in +separate planes (PlanarConfiguration=2). To read a +full strip of data the data buffer should typically be at +least as large as the number returned by +TIFFStripSize(3TIFF). If the -1 passed in size +parameter, the whole strip will be read. You should be sure +you have enough space allocated for the buffer.

      + +

      The library attempts to hide bit- and byte-ordering +differences between the image and the native machine by +converting data to the native machine order. Bit reversal is +done if the FillOrder tag is opposite to the native +machine bit order. 16- and 32-bit samples are automatically +byte-swapped if the file was written with a byte order +opposite to the native machine byte order,

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      The actual number of bytes of data that were placed +in buf is returned; TIFFReadEncodedStrip +returns −1 if an error was encountered.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFReadRawStrip(3TIFF), +TIFFReadScanline(3TIFF), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadEncodedTile.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadEncodedTile.3tiff.html new file mode 100644 index 0000000000..752b1ea3e6 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadEncodedTile.3tiff.html @@ -0,0 +1,130 @@ + + + + + + +TIFFReadEncodedTile + + + +

      TIFFReadEncodedTile

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadEncodedTile − read and decode a tile of +data from an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFReadEncodedTile(TIFF *tif, +ttile_t tile, tdata_t buf, +tsize_t size)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Read the specified tile of data and place up to +size bytes of decompressed information in the (user +supplied) data buffer.

      +
      + +

      NOTES

      + + + + + +
      +

      The value of tile is a ‘‘raw tile +number.’’ That is, the caller must take into +account whether or not the data are organized in separate +planes (PlanarConfiguration=2). +TIFFComputeTile automatically does this when +converting an (x,y,z,sample) coordinate quadruple to a tile +number. To read a full tile of data the data buffer should +be at least as large as the value returned by +TIFFTileSize.

      + +

      The library attempts to hide bit- and byte-ordering +differences between the image and the native machine by +converting data to the native machine order. Bit reversal is +done if the FillOrder tag is opposite to the native +machine bit order. 16- and 32-bit samples are automatically +byte-swapped if the file was written with a byte order +opposite to the native machine byte order,

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      The actual number of bytes of data that were placed in +buf is returned; TIFFReadEncodedTile returns +−1 if an error was encountered.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFReadRawTile(3TIFF), +TIFFReadTile(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadRGBAImage.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadRGBAImage.3tiff.html new file mode 100644 index 0000000000..165284e50c --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadRGBAImage.3tiff.html @@ -0,0 +1,301 @@ + + + + + + +TIFFReadRGBAImage + + + +

      TIFFReadRGBAImage

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadRGBAImage, TIFFReadRGBAImageOriented − read +and decode an image into a fixed-format raster

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      #define TIFFGetR(abgr) ((abgr) & 0xff)
      +#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
      +#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
      +#define TIFFGetA(abgr) (((abgr) >> 24) & +0xff)

      + +

      int TIFFReadRGBAImage(TIFF *tif, +uint32 width, uint32 height, +uint32 *raster, int +stopOnError)
      +int TIFFReadRGBAImageOriented(TIFF *
      tif, +uint32 width, uint32 height, +uint32 *raster, int orientation, +int stopOnError)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFReadRGBAImage reads a strip- or tile-based +image into memory, storing the result in the user supplied +raster. The raster is assumed to be an array of +width times height 32-bit entries, where +width must be less than or equal to the width of the +image (height may be any non-zero size). If the +raster dimensions are smaller than the image, the image data +is cropped to the raster bounds. If the raster height is +greater than that of the image, then the image data are +placed in the lower part of the raster. (Note that the +raster is assume to be organized such that the pixel at +location (x,y) is +raster[y*width+x]; with the +raster origin in the lower-left hand corner.)

      + +

      TIFFReadRGBAImageOriented works like +TIFFReadRGBAImage with except of that user can +specify the raster origin position with the +orientation parameter. Four orientations +supported:

      +
      + + + + + +
      +

      ORIENTATION_TOPLEFT

      + + + + + +
      +

      origin in top-left corner,

      +
      + + + + + +
      +

      ORIENTATION_TOPRIGHT

      + + + + + +
      +

      origin in top-right corner,

      +
      + + + + + +
      +

      ORIENTATION_BOTLEFT

      + + + + + +
      +

      origin in bottom-left corner and

      +
      + + + + + +
      +

      ORIENTATION_BOTRIGHT

      + + + + + +
      +

      origin in bottom-right corner.

      +
      + + + + + +
      +

      If you choose ORIENTATION_BOTLEFT result will be +the same as returned by the TIFFReadRGBAImage.

      + +

      Raster pixels are 8-bit packed red, green, blue, alpha +samples. The macros TIFFGetR, TIFFGetG, +TIFFGetB, and TIFFGetA should be used to +access individual samples. Images without Associated Alpha +matting information have a constant Alpha of 1.0 (255).

      + +

      TIFFReadRGBAImage converts non-8-bit images by +scaling sample values. Palette, grayscale, bilevel, +CMYK , and YCbCr images are converted to +RGB transparently. Raster pixels are returned +uncorrected by any colorimetry information present in the +directory.

      + +

      The paramater stopOnError specifies how to act if +an error is encountered while reading the image. If +stopOnError is non-zero, then an error will terminate +the operation; otherwise TIFFReadRGBAImage will +continue processing data until all the possible data in the +image have been requested.

      +
      + +

      NOTES

      + + + + + +
      +

      In C++ the stopOnError parameter defaults to +0.

      + +

      Samples must be either 1, 2, 4, 8, or 16 bits. +Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. +SamplesPerPixel minus ExtraSamples).

      + +

      Palettte image colormaps that appear to be incorrectly +written as 8-bit values are automatically scaled to +16-bits.

      + +

      TIFFReadRGBAImage is just a wrapper around the +more general TIFFRGBAImage(3TIFF) facilities.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      1 is returned if the image was successfully read and +converted. Otherwise, 0 is returned if an error was +encountered and stopOnError is zero.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      Sorry, can not handle %d-bit pictures. The image +had BitsPerSample other than 1, 2, 4, 8, or 16.

      + +

      Sorry, can not handle %d-channel images. The image +had SamplesPerPixel other than 1, 3, or 4.

      + +

      Missing needed "PhotometricInterpretation" +tag. The image did not have a tag that describes how to +display the data.

      + +

      No "PhotometricInterpretation" tag, assuming +RGB. The image was missing a tag that describes how to +display it, but because it has 3 or 4 samples/pixel, it is +assumed to be RGB.

      + +

      No "PhotometricInterpretation" tag, assuming +min-is-black. The image was missing a tag that describes +how to display it, but because it has 1 sample/pixel, it is +assumed to be a grayscale or bilevel image.

      + +

      No space for photometric conversion table. There +was insufficient memory for a table used to convert image +samples to 8-bit RGB.

      + +

      Missing required "Colormap" tag. A +Palette image did not have a required Colormap +tag.

      + +

      No space for tile buffer. There was insufficient +memory to allocate an i/o buffer.

      + +

      No space for strip buffer. There was insufficient +memory to allocate an i/o buffer.

      + +

      Can not handle format. The image has a format +(combination of BitsPerSample, +SamplesPerPixel, and +PhotometricInterpretation) that +TIFFReadRGBAImage can not handle.

      + +

      No space for B&W mapping table. There was +insufficient memory to allocate a table used to map +grayscale data to RGB.

      + +

      No space for Palette mapping table. There was +insufficient memory to allocate a table used to map data to +8-bit RGB.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFRGBAImage(3TIFF), +TIFFReadRGBAStrip(3TIFF), +TIFFReadRGBATile(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadRGBAStrip.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadRGBAStrip.3tiff.html new file mode 100644 index 0000000000..df09f649fa --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadRGBAStrip.3tiff.html @@ -0,0 +1,208 @@ + + + + + + +TIFFReadRGBAStrip + + + +

      TIFFReadRGBAStrip

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadRGBAStrip − read and decode an image strip +into a fixed-format raster

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      #define TIFFGetR(abgr) ((abgr) & 0xff)
      +#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
      +#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
      +#define TIFFGetA(abgr) (((abgr) >> 24) & +0xff)

      + +

      int TIFFReadRGBAStrip(TIFF *tif, +uint32 row, uint32 +*raster)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFReadRGBAStrip reads a single strip of a +strip-based image into memory, storing the result in the +user supplied RGBA raster. The raster is assumed to +be an array of width times rowsperstrip 32-bit entries, +where width is the width of the image (TIFFTAG_IMAGEWIDTH) +and rowsperstrip is the maximum lines in a strip +(TIFFTAG_ROWSPERSTRIP).

      + +

      The row value should be the row of the first row +in the strip (strip * rowsperstrip, zero based).

      + +

      Note that the raster is assume to be organized such that +the pixel at location (x,y) is +raster[y*width+x]; with the +raster origin in the lower-left hand corner of the +strip. That is bottom to top organization. When reading a +partial last strip in the file the last line of the image +will begin at the beginning of the buffer.

      + +

      Raster pixels are 8-bit packed red, green, blue, alpha +samples. The macros TIFFGetR, TIFFGetG, +TIFFGetB, and TIFFGetA should be used to +access individual samples. Images without Associated Alpha +matting information have a constant Alpha of 1.0 (255).

      + +

      See the TIFFRGBAImage(3TIFF) page for more details +on how various image types are converted to RGBA values.

      +
      + +

      NOTES

      + + + + + +
      +

      Samples must be either 1, 2, 4, 8, or 16 bits. +Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. +SamplesPerPixel minus ExtraSamples).

      + +

      Palette image colormaps that appear to be incorrectly +written as 8-bit values are automatically scaled to +16-bits.

      + +

      TIFFReadRGBAStrip is just a wrapper around the +more general TIFFRGBAImage(3TIFF) facilities. +It’s main advantage over the similar +TIFFReadRGBAImage() function is that for large images +a single buffer capable of holding the whole image +doesn’t need to be allocated, only enough for one +strip. The TIFFReadRGBATile() function does a similar +operation for tiled images.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      1 is returned if the image was successfully read and +converted. Otherwise, 0 is returned if an error was +encountered.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      Sorry, can not handle %d-bit pictures. The image +had BitsPerSample other than 1, 2, 4, 8, or 16.

      + +

      Sorry, can not handle %d-channel images. The image +had SamplesPerPixel other than 1, 3, or 4.

      + +

      Missing needed "PhotometricInterpretation" +tag. The image did not have a tag that describes how to +display the data.

      + +

      No "PhotometricInterpretation" tag, assuming +RGB. The image was missing a tag that describes how to +display it, but because it has 3 or 4 samples/pixel, it is +assumed to be RGB.

      + +

      No "PhotometricInterpretation" tag, assuming +min-is-black. The image was missing a tag that describes +how to display it, but because it has 1 sample/pixel, it is +assumed to be a grayscale or bilevel image.

      + +

      No space for photometric conversion table. There +was insufficient memory for a table used to convert image +samples to 8-bit RGB.

      + +

      Missing required "Colormap" tag. A +Palette image did not have a required Colormap +tag.

      + +

      No space for tile buffer. There was insufficient +memory to allocate an i/o buffer.

      + +

      No space for strip buffer. There was insufficient +memory to allocate an i/o buffer.

      + +

      Can not handle format. The image has a format +(combination of BitsPerSample, +SamplesPerPixel, and +PhotometricInterpretation) that +TIFFReadRGBAImage can not handle.

      + +

      No space for B&W mapping table. There was +insufficient memory to allocate a table used to map +grayscale data to RGB.

      + +

      No space for Palette mapping table. There was +insufficient memory to allocate a table used to map data to +8-bit RGB.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFRGBAImage(3TIFF), +TIFFReadRGBAImage(3TIFF), +TIFFReadRGBATile(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadRGBATile.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadRGBATile.3tiff.html new file mode 100644 index 0000000000..ed67b83278 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadRGBATile.3tiff.html @@ -0,0 +1,261 @@ + + + + + + +TIFFReadRGBATile + + + +

      TIFFReadRGBATile

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadRGBATile − read and decode an image tile +into a fixed-format raster

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      #define TIFFGetR(abgr)

      +
      + +

      ((abgr) & 0xff)

      +
      + +

      #define TIFFGetG(abgr)

      +
      + +

      (((abgr) >> 8) & 0xff)

      +
      + +

      #define TIFFGetB(abgr)

      +
      + +

      (((abgr) >> 16) & 0xff)

      +
      + +

      #define TIFFGetA(abgr)

      +
      + +

      (((abgr) >> 24) & 0xff)

      +
      + + + + + +
      +

      int TIFFReadRGBATile(TIFF *tif, +uint32 x, uint32 y, uint32 +*raster)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFReadRGBATile reads a single tile of a +tile-based image into memory, storing the result in the user +supplied RGBA raster. The raster is assumed to be an +array of width times length 32-bit entries, where width is +the width of a tile (TIFFTAG_TILEWIDTH) and length is the +height of a tile (TIFFTAG_TILELENGTH).

      + +

      The x and y values are the offsets from the +top left corner to the top left corner of the tile to be +read. They must be an exact multiple of the tile width and +length.

      + +

      Note that the raster is assume to be organized such that +the pixel at location (x,y) is +raster[y*width+x]; with the +raster origin in the lower-left hand corner of the +tile. That is bottom to top organization. Edge tiles which +partly fall off the image will be filled out with +appropriate zeroed areas.

      + +

      Raster pixels are 8-bit packed red, green, blue, alpha +samples. The macros TIFFGetR, TIFFGetG, +TIFFGetB, and TIFFGetA should be used to +access individual samples. Images without Associated Alpha +matting information have a constant Alpha of 1.0 (255).

      + +

      See the TIFFRGBAImage(3TIFF) page for more details +on how various image types are converted to RGBA values.

      +
      + +

      NOTES

      + + + + + +
      +

      Samples must be either 1, 2, 4, 8, or 16 bits. +Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. +SamplesPerPixel minus ExtraSamples).

      + +

      Palette image colormaps that appear to be incorrectly +written as 8-bit values are automatically scaled to +16-bits.

      + +

      TIFFReadRGBATile is just a wrapper around the more +general TIFFRGBAImage(3TIFF) facilities. It’s +main advantage over the similar TIFFReadRGBAImage() +function is that for large images a single buffer capable of +holding the whole image doesn’t need to be allocated, +only enough for one tile. The TIFFReadRGBAStrip() +function does a similar operation for stripped images.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      1 is returned if the image was successfully read and +converted. Otherwise, 0 is returned if an error was +encountered.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      Sorry, can not handle %d-bit pictures. The image +had BitsPerSample other than 1, 2, 4, 8, or 16.

      + +

      Sorry, can not handle %d-channel images. The image +had SamplesPerPixel other than 1, 3, or 4.

      + +

      Missing needed "PhotometricInterpretation" +tag. The image did not have a tag that describes how to +display the data.

      + +

      No "PhotometricInterpretation" tag, assuming +RGB. The image was missing a tag that describes how to +display it, but because it has 3 or 4 samples/pixel, it is +assumed to be RGB.

      + +

      No "PhotometricInterpretation" tag, assuming +min-is-black. The image was missing a tag that describes +how to display it, but because it has 1 sample/pixel, it is +assumed to be a grayscale or bilevel image.

      + +

      No space for photometric conversion table. There +was insufficient memory for a table used to convert image +samples to 8-bit RGB.

      + +

      Missing required "Colormap" tag. A +Palette image did not have a required Colormap +tag.

      + +

      No space for tile buffer. There was insufficient +memory to allocate an i/o buffer.

      + +

      No space for strip buffer. There was insufficient +memory to allocate an i/o buffer.

      + +

      Can not handle format. The image has a format +(combination of BitsPerSample, +SamplesPerPixel, and +PhotometricInterpretation) that +TIFFReadRGBAImage can not handle.

      + +

      No space for B&W mapping table. There was +insufficient memory to allocate a table used to map +grayscale data to RGB.

      + +

      No space for Palette mapping table. There was +insufficient memory to allocate a table used to map data to +8-bit RGB.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFRGBAImage(3TIFF), +TIFFReadRGBAImage(3TIFF), +TIFFReadRGBAStrip(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadRawStrip.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadRawStrip.3tiff.html new file mode 100644 index 0000000000..bd14f723bc --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadRawStrip.3tiff.html @@ -0,0 +1,109 @@ + + + + + + +TIFFReadRawStrip + + + +

      TIFFReadRawStrip

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadRawStrip − return the undecoded contents of +a strip of data from an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFReadRawStrip(TIFF *tif, +tstrip_t strip, tdata_t buf, +tsize_t size)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Read the contents of the specified strip into the (user +supplied) data buffer. Note that the value of strip +is a ‘‘raw strip number.’’ That is, +the caller must take into account whether or not the data is +organized in separate planes (PlanarConfiguration=2). +To read a full strip of data the data buffer should +typically be at least as large as the number returned by +TIFFStripSize.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      The actual number of bytes of data that were placed in +buf is returned; TIFFReadEncodedStrip returns +−1 if an error was encountered.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFReadEncodedStrip(3TIFF), +TIFFReadScanline(3TIFF), TIFFStripSize(3TIFF), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadRawTile.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadRawTile.3tiff.html new file mode 100644 index 0000000000..bae2b46cd6 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadRawTile.3tiff.html @@ -0,0 +1,111 @@ + + + + + + +TIFFReadRawTile + + + +

      TIFFReadRawTile

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadRawTile − return an undecoded tile of data +from an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFReadRawTile(TIFF *tif, +ttile_t tile, tdata_t buf, +tsize_t size)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Read the contents of the specified tile into the (user +supplied) data buffer. Note that the value of tile is +a ‘‘raw tile number.’’ That is, the +caller must take into account whether or not the data is +organized in separate planes (PlanarConfiguration=2). +TIFFComputeTile automatically does this when +converting an (x,y,z,sample) coordinate quadruple to a tile +number. To read a full tile of data the data buffer should +typically be at least as large as the value returned by +TIFFTileSize.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      The actual number of bytes of data that were placed in +buf is returned; TIFFReadEncodedTile returns +−1 if an error was encountered.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFReadEncodedTile(3TIFF), +TIFFReadTile(3TIFF), TIFFTileSize(3TIFF), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadScanline.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadScanline.3tiff.html new file mode 100644 index 0000000000..423645cc96 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadScanline.3tiff.html @@ -0,0 +1,157 @@ + + + + + + +TIFFReadScanline + + + +

      TIFFReadScanline

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadScanline − read and decode a scanline of +data from an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFReadScanline(TIFF *tif, +tdata_t buf, uint32 row, +tsample_t sample)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Read the data for the specified row into the (user +supplied) data buffer buf. The data are returned +decompressed and, in the native byte- and bit-ordering, but +are otherwise packed (see further below). The buffer must be +large enough to hold an entire scanline of data. +Applications should call the routine TIFFScanlineSize +to find out the size (in bytes) of a scanline buffer. The +row parameter is always used by +TIFFReadScanline; the sample parameter is used +only if data are organized in separate planes +(PlanarConfiguration=2).

      +
      + +

      NOTES

      + + + + + +
      +

      The library attempts to hide bit- and byte-ordering +differences between the image and the native machine by +converting data to the native machine order. Bit reversal is +done if the FillOrder tag is opposite to the native +machine bit order. 16- and 32-bit samples are automatically +byte-swapped if the file was written with a byte order +opposite to the native machine byte order,

      + +

      In C++ the sample parameter defaults to 0.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      TIFFReadScanline returns −1 if it detects an +error; otherwise 1 is returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      Compression algorithm does not support random +access. Data was requested in a non-sequential order +from a file that uses a compression algorithm and that has +RowsPerStrip greater than one. That is, data in the +image is stored in a compressed form, and with multiple rows +packed into a strip. In this case, the library does not +support random access to the data. The data should either be +accessed sequentially, or the file should be converted so +that each strip is made up of one row of data.

      +
      + +

      BUGS

      + + + + + +
      +

      Reading subsampled YCbCR data does not work correctly +because, for PlanarConfiguration=2 the size of a +scanline is not calculated on a per-sample basis, and for +PlanarConfiguration=1 the library does not unpack the +block-interleaved samples; use the strip- and tile-based +interfaces to read these formats.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFReadEncodedStrip(3TIFF), +TIFFReadRawStrip(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFReadTile.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFReadTile.3tiff.html new file mode 100644 index 0000000000..ff726b49d2 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFReadTile.3tiff.html @@ -0,0 +1,133 @@ + + + + + + +TIFFReadTile + + + +

      TIFFReadTile

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadTile − read and decode a tile of data from +an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFReadTile(TIFF *tif, +tdata_t buf, uint32 x, +uint32 y, uint32 z, +tsample_t sample)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Return the data for the tile containing the +specified coordinates. The data placed in buf are +returned decompressed and, typically, in the native byte- +and bit-ordering, but are otherwise packed (see further +below). The buffer must be large enough to hold an entire +tile of data. Applications should call the routine +TIFFTileSize to find out the size (in bytes) of a +tile buffer. The x and y parameters are always +used by TIFFReadTile. The z parameter is used +if the image is deeper than 1 slice +(ImageDepth>1). The sample parameter is +used only if data are organized in separate planes +(PlanarConfiguration=2).

      +
      + +

      NOTES

      + + + + + +
      +

      The library attempts to hide bit- and byte-ordering +differences between the image and the native machine by +converting data to the native machine order. Bit reversal is +done if the FillOrder tag is opposite to the native +machine bit order. 16- and 32-bit samples are automatically +byte-swapped if the file was written with a byte order +opposite to the native machine byte order,

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      TIFFReadTile returns −1 if it detects an +error; otherwise the number of bytes in the decoded tile is +returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFCheckTile(3TIFF), +TIFFComputeTile(3TIFF), TIFFOpen(3TIFF), +TIFFReadEncodedTile(3TIFF), +TIFFReadRawTile(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFSetDirectory.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFSetDirectory.3tiff.html new file mode 100644 index 0000000000..a0e5cfc0a1 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFSetDirectory.3tiff.html @@ -0,0 +1,122 @@ + + + + + + +TIFFSetDirectory + + + +

      TIFFSetDirectory

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFSetDirectory, TIFFSetSubDirectory − set the +current directory for an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFSetDirectory(TIFF *tif, +tdir_t dirnum)
      +int TIFFSetSubDirectory(TIFF *
      tif, uint32 +diroff)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFSetDirectory changes the current directory and +reads its contents with TIFFReadDirectory. The +parameter dirnum specifies the subfile/directory as +an integer number, with the first directory numbered +zero.

      + +

      TIFFSetSubDirectory acts like +TIFFSetDirectory, except the directory is specified +as a file offset instead of an index; this is required for +accessing subdirectories linked through a SubIFD +tag.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      On successful return 1 is returned. Otherwise, 0 is +returned if dirnum or diroff specifies a +non-existent directory, or if an error was encountered while +reading the directory’s contents.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      %s: Error fetching directory count. An error was +encountered while reading the ‘‘directory +count’’ field.

      + +

      %s: Error fetching directory link. An error was +encountered while reading the ‘‘link +value’’ that points to the next directory in a +file.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFCurrentDirectory(3TIFF), +TIFFOpen(3TIFF), TIFFReadDirectory(3TIFF), +TIFFWriteDirectory(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFSetField.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFSetField.3tiff.html new file mode 100644 index 0000000000..2e70225b33 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFSetField.3tiff.html @@ -0,0 +1,1362 @@ + + + + + + +TIFFSetField + + + +

      TIFFSetField

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFSetField, TIFFVSetField − set the value(s) of a +tag in a TIFF file open for writing

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFSetField(TIFF *tif, ttag_t +tag, ...)

      + +

      #include <stdarg.h>

      + +

      int TIFFVSetField(TIFF *tif, ttag_t +tag, va_list ap)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFSetField sets the value of a field or +pseudo-tag in the current directory associated with the open +TIFF file tif. (A pseudo-tag is +a parameter that is used to control the operation of the +TIFF library but whose value is not read or +written to the underlying file.) To set the value of a field +the file must have been previously opened for writing with +TIFFOpen(3TIFF); pseudo-tags can be set whether the +file was opened for reading or writing. The field is +identified by tag, one of the values defined in the +include file tiff.h (see also the table below). The +actual value is specified using a variable argument list, as +prescribed by the stdarg(3) interface (or, on some +machines, the varargs(3) interface.)

      + +

      TIFFVSetField is functionally equivalent to +TIFFSetField except that it takes a pointer to a +variable argument list. TIFFVSetField is useful for +writing routines that are layered on top of the +functionality provided by TIFFSetField.

      + +

      The tags understood by libtiff, the number of +parameter values, and the expected types for the parameter +values are shown below. The data types are: char* is +null-terminated string and corresponds to the +ASCII data type; uint16 is an unsigned +16-bit value; uint32 is an unsigned 32-bit value; +uint16* is an array of unsigned 16-bit values. +void* is an array of data values of unspecified +type.

      + +

      Consult the TIFF specification for +information on the meaning of each tag.

      + + +

      Tag Name Count Types Notes

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      TIFFTAG_ARTIST

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_BADFAXLINES

      +
      + +

      1

      +
      + +

      uint32

      +
      +
      + +

      TIFFTAG_BITSPERSAMPLE

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_CLEANFAXDATA

      +
      + +

      1

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_COLORMAP

      +
      + +

      3

      +
      + +

      uint16*

      +
      + +

      1<<BitsPerSample arrays

      +
      + +

      TIFFTAG_COMPRESSION

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_CONSECUTIVEBADFAXLINES

      +
      + +

      1

      +
      + +

      uint32

      +
      +
      + +

      TIFFTAG_COPYRIGHT

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_DATETIME

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_DOCUMENTNAME

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_DOTRANGE

      +
      + +

      2

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_EXTRASAMPLES

      +
      + +

      2

      +
      + +

      uint16,uint16*

      +
      + +

      † count & types array

      +
      + +

      TIFFTAG_FAXFILLFUNC

      +
      + +

      1

      +
      + +

      TIFFFaxFillFunc

      +
      + +

      G3/G4 compression pseudo-tag

      +
      + +

      TIFFTAG_FAXMODE

      +
      + +

      1

      +
      + +

      int

      +
      + +

      † G3/G4 compression pseudo-tag

      +
      + +

      TIFFTAG_FILLORDER

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_GROUP3OPTIONS

      +
      + +

      1

      +
      + +

      uint32

      +
      + +

      +
      + +

      TIFFTAG_GROUP4OPTIONS

      +
      + +

      1

      +
      + +

      uint32

      +
      + +

      +
      + +

      TIFFTAG_HALFTONEHINTS

      +
      + +

      2

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_HOSTCOMPUTER

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_ICCPROFILE

      +
      + +

      2

      +
      + +

      uint32,void*

      +
      + +

      count, profile data

      +
      + +

      TIFFTAG_IMAGEDEPTH

      +
      + +

      1

      +
      + +

      uint32

      +
      + +

      +
      + +

      TIFFTAG_IMAGEDESCRIPTION

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_IMAGELENGTH

      +
      + +

      1

      +
      + +

      uint32

      +
      +
      + +

      TIFFTAG_IMAGEWIDTH

      +
      + +

      1

      +
      + +

      uint32

      +
      + +

      +
      + +

      TIFFTAG_INKNAMES

      +
      + +

      2

      +
      + +

      uint16, char*

      +
      +
      + +

      TIFFTAG_INKSET

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_JPEGCOLORMODE

      +
      + +

      1

      +
      + +

      int

      +
      + +

      † JPEG pseudo-tag

      +
      + +

      TIFFTAG_JPEGQUALITY

      +
      + +

      1

      +
      + +

      int

      +
      + +

      JPEG pseudo-tag

      +
      + +

      TIFFTAG_JPEGTABLES

      +
      + +

      2

      +
      + +

      uint32*,void*

      +
      + +

      † count & tables

      +
      + +

      TIFFTAG_JPEGTABLESMODE

      +
      + +

      1

      +
      + +

      int

      +
      + +

      † JPEG pseudo-tag

      +
      + +

      TIFFTAG_MAKE

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_MATTEING

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_MAXSAMPLEVALUE

      +
      + +

      1

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_MINSAMPLEVALUE

      +
      + +

      1

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_MODEL

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_ORIENTATION

      +
      + +

      1

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_PAGENAME

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_PAGENUMBER

      +
      + +

      2

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_PHOTOMETRIC

      +
      + +

      1

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_PHOTOSHOP

      +
      + +

      ?

      +
      + +

      uint32,void*

      +
      + +

      count, data

      +
      + +

      TIFFTAG_PLANARCONFIG

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_PREDICTOR

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_PRIMARYCHROMATICITIES

      +
      + +

      1

      +
      + +

      float*

      +
      + +

      6-entry array

      +
      + +

      TIFFTAG_REFERENCEBLACKWHITE

      +
      + +

      1

      +
      + +

      float*

      +
      + +

      † 2*SamplesPerPixel array

      +
      + +

      TIFFTAG_RESOLUTIONUNIT

      +
      + +

      1

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_RICHTIFFIPTC

      +
      + +

      2

      +
      + +

      uint32,void*

      +
      + +

      count, data

      +
      + +

      TIFFTAG_ROWSPERSTRIP

      +
      + +

      1

      +
      + +

      uint32

      +
      + +

      † must be > 0

      +
      + +

      TIFFTAG_SAMPLEFORMAT

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_SAMPLESPERPIXEL

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      † value must be <= 4

      +
      + +

      TIFFTAG_SMAXSAMPLEVALUE

      +
      + +

      1

      +
      + +

      double

      +
      +
      + +

      TIFFTAG_SMINSAMPLEVALUE

      +
      + +

      1

      +
      + +

      double

      +
      +
      + +

      TIFFTAG_SOFTWARE

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_STONITS

      +
      + +

      1

      +
      + +

      double

      +
      + +

      +
      + +

      TIFFTAG_SUBFILETYPE

      +
      + +

      1

      +
      + +

      uint32

      +
      +
      + +

      TIFFTAG_SUBIFD

      +
      + +

      2

      +
      + +

      uint16,uint32*

      +
      + +

      count & offsets array

      +
      + +

      TIFFTAG_TARGETPRINTER

      +
      + +

      1

      +
      + +

      char*

      +
      +
      + +

      TIFFTAG_THRESHHOLDING

      +
      + +

      1

      +
      + +

      uint16

      +
      +
      + +

      TIFFTAG_TILEDEPTH

      +
      + +

      1

      +
      + +

      uint32

      +
      + +

      +
      + +

      TIFFTAG_TILELENGTH

      +
      + +

      1

      +
      + +

      uint32

      +
      + +

      † must be a multiple of 8

      +
      + +

      TIFFTAG_TILEWIDTH

      +
      + +

      1

      +
      + +

      uint32

      +
      + +

      † must be a multiple of 8

      +
      + +

      TIFFTAG_TRANSFERFUNCTION

      +
      + +

      1 or 3‡ uint16*

      +
      + +

      1<<BitsPerSample entry arrays

      +
      + +

      TIFFTAG_WHITEPOINT

      +
      + +

      1

      +
      + +

      float*

      +
      + +

      2-entry array

      +
      + +

      TIFFTAG_XMLPACKET

      +
      + +

      2

      +
      + +

      uint32,void*

      +
      + +

      count, data

      +
      + +

      TIFFTAG_XPOSITION

      +
      + +

      1

      +
      + +

      float

      +
      +
      + +

      TIFFTAG_XRESOLUTION

      +
      + +

      1

      +
      + +

      float

      +
      +
      + +

      TIFFTAG_YCBCRCOEFFICIENTS

      +
      + +

      1

      +
      + +

      float*

      +
      + +

      † 3-entry array

      +
      + +

      TIFFTAG_YCBCRPOSITIONING

      +
      + +

      1

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_YCBCRSAMPLING

      +
      + +

      2

      +
      + +

      uint16

      +
      + +

      +
      + +

      TIFFTAG_YPOSITION

      +
      + +

      1

      +
      + +

      float

      +
      +
      + +

      TIFFTAG_YRESOLUTION

      +
      + +

      1

      +
      + +

      float

      +
      +
      + + + + + +
      +

      † Tag may not have its values changed once data is +written.
      +‡ If SamplesPerPixel is one, then a single +array is passed; otherwise three arrays should be +passed.
      +* The contents of this field are quite complex. See The +ICC Profile Format Specification, Annex B.3 +"Embedding ICC Profiles in TIFF Files" (available +at http://www.color.org) for an explanation.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      1 is returned if the operation was successful. Otherwise, +0 is returned if an error was detected.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      %s: Cannot modify tag "%s" while +writing. Data has already been written to the file, so +the specified tag’s value can not be changed. This +restriction is applied to all tags that affect the format of +written data.

      + +

      %d: Bad value for "%s". An invalid value +was supplied for the named tag.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFGetField(3TIFF), +TIFFSetDirectory(3TIFF), +TIFFWriteDirectory(3TIFF), +TIFFReadDirectory(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFWarning.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFWarning.3tiff.html new file mode 100644 index 0000000000..df17073b57 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFWarning.3tiff.html @@ -0,0 +1,108 @@ + + + + + + +TIFFWarning + + + +

      TIFFWarning

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFWarning, TIFFSetWarningHandler − library +warning interface

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      void TIFFWarning(const char *module, +const char *fmt, ...)

      + +

      #include <stdargh.h>

      + +

      typedef void (*TIFFWarningHandler)(const char +*module, const char *fmt, +va_list ap);

      + +

      TIFFWarningHandler +TIFFSetWarningHandler(TIFFWarningHandler +handler);

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFWarning invokes the library-wide warning +handler function to (normally) write a warning message to +the stderr. The fmt parameter is a +printf(3S) format string, and any number arguments +can be supplied. The module parameter is interpreted +as a string that, if non-zero, should be printed before the +message; it typically is used to identify the software +module in which a warning is detected.

      + +

      Applications that desire to capture control in the event +of a warning should use TIFFSetWarningHandler to +override the default warning handler. A NULL +(0) warning handler function may be installed to suppress +error messages.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      TIFFSetWarningHandler returns a reference to the +previous error handling function.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFError(3TIFF), libtiff(3TIFF), +printf(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFWriteDirectory.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFWriteDirectory.3tiff.html new file mode 100644 index 0000000000..07a443e145 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFWriteDirectory.3tiff.html @@ -0,0 +1,176 @@ + + + + + + +TIFFWriteDirectory + + + +

      TIFFWriteDirectory

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFWriteDirectory, TIFFRewriteDirectory, +TIFFCheckpointDirectory − write the current directory +in an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFWriteDirectory(TIFF *tif)
      +int TIFFRewriteDirectory(TIFF *
      tif)
      +int TIFFCheckpointDirectory(TIFF *
      tif)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFWriteDirectory will write the contents of the +current directory to the file and setup to create a new +subfile in the same file. Applications only need to call +TIFFWriteDirectory when writing multiple subfiles to +a single TIFF file. TIFFWriteDirectory +is automatically called by TIFFClose and +TIFFFlush to write a modified directory if the file +is open for writing.

      + +

      The TIFFRewriteDirectory function operates +similarly to TIFFWriteDirectory, but can be called +with directories previously read or written that already +have an established location in the file. It will rewrite +the directory, but instead of place it at it’s old +location (as TIFFWriteDirectory would) it will place +them at the end of the file, correcting the pointer from the +preceeding directory or file header to point to it’s +new location. This is particularly important in cases where +the size of the directory and pointed to data has grown, so +it won’t fit in the space available at the old +location.

      + +

      The TIFFCheckpointDirectory writes the current +state of the tiff directory into the file to make what is +currently in the file readable. Unlike +TIFFWriteDirectory, TIFFCheckpointDirectory does not +free up the directory data structures in memory, so they can +be updated (as strips/tiles are written) and written again. +Reading such a partial file you will at worst get a tiff +read error for the first strip/tile encountered that is +incomplete, but you will at least get all the valid data in +the file before that. When the file is complete, just use +TIFFWriteDirectory as usual to finish it off +cleanly.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      1 is returned when the contents are successfully written +to the file. Otherwise, 0 is returned if an error was +encountered when writing the directory contents.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      Error post-encoding before directory write. Before +writing the contents of the current directory, any pending +data are flushed. This message indicates that an error +occurred while doing this.

      + +

      Error flushing data before directory write. Before +writing the contents of the current directory, any pending +data are flushed. This message indicates that an error +occurred while doing this.

      + +

      Cannot write directory, out of space. There was +not enough space to allocate a temporary area for the +directory that was to be written.

      + +

      Error writing directory count. A write error +occurred when writing the count of fields in the +directory.

      + +

      Error writing directory contents. A write error +occurred when writing the directory fields.

      + +

      Error writing directory link. A write error +occurred when writing the link to the next directory.

      + +

      Error writing data for field "%s". A +write error occurred when writing indirect data for the +specified field.

      + +

      Error writing TIFF header. A write error occurred +when re-writing header at the front of the file.

      + +

      Error fetching directory count. A read error +occurred when fetching the directory count field for a +previous directory. This can occur when setting up a link to +the directory that is being written.

      + +

      Error fetching directory link. A read error +occurred when fetching the directory link field for a +previous directory. This can occur when setting up a link to +the directory that is being written.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFError(3TIFF), +TIFFReadDirectory(3TIFF), +TIFFSetDirectory(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFWriteEncodedStrip.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFWriteEncodedStrip.3tiff.html new file mode 100644 index 0000000000..5a45f593a2 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFWriteEncodedStrip.3tiff.html @@ -0,0 +1,153 @@ + + + + + + +TIFFWriteEncodedStrip + + + +

      TIFFWriteEncodedStrip

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFWritedEncodedStrip − compress and write a +strip of data to an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFWriteEncodedStrip(TIFF +*tif, tstrip_t strip, +tdata_t buf, tsize_t +size)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Compress size bytes of raw data from +buf and write the result to the specified strip; +replacing any previously written data. Note that the value +of strip is a ‘‘raw strip +number.’’ That is, the caller must take into +account whether or not the data are organized in separate +planes (PlanarConfiguration=2).

      +
      + +

      NOTES

      + + + + + +
      +

      The library writes encoded data using the native +machine byte order. Correctly implemented TIFF +readers are expected to do any necessary byte-swapping +to correctly process image data with BitsPerSample greater +than 8.

      + +

      The strip number must be valid according to the +current settings of the ImageLength and +RowsPerStrip tags. An image may be dynamically grown +by increasing the value of ImageLength prior to each +call to TIFFWriteEncodedStrip.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      −1 is returned if an error was encountered. +Otherwise, the value of size is returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      %s: File not open for writing. The file was +opened for reading, not writing.

      + +

      Can not write scanlines to a tiled image. The +image is assumed to be organized in tiles because the +TileWidth and TileLength tags have been set +with TIFFSetField(3TIFF).

      + +

      %s: Must set "ImageWidth" before +writing data. The image’s width has not be set +before the first write. See TIFFSetField(3TIFF) for +information on how to do this.

      + +

      %s: Must set "PlanarConfiguration" +before writing data. The organization of data has not be +defined before the first write. See +TIFFSetField(3TIFF) for information on how to do +this.

      + +

      %s: No space for strip arrays". There +was not enough space for the arrays that hold strip offsets +and byte counts.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFWriteScanline(3TIFF), +TIFFWriteRawStrip(3TIFF), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFWriteEncodedTile.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFWriteEncodedTile.3tiff.html new file mode 100644 index 0000000000..0e6e1bac88 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFWriteEncodedTile.3tiff.html @@ -0,0 +1,147 @@ + + + + + + +TIFFWriteEncodedTile + + + +

      TIFFWriteEncodedTile

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFWritedEncodedTile − compress and write a +tile of data to an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFWriteEncodedTile(TIFF +*tif, ttile_t tile, tdata_t +buf, tsize_t size)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Compress size bytes of raw data from +buf and append the result to the end of the +specified tile. Note that the value of tile is a +‘‘raw tile number.’’ That is, the +caller must take into account whether or not the data are +organized in separate places (PlanarConfiguration=2). +TIFFComputeTile automatically does this when +converting an (x,y,z,sample) coordinate quadruple to a tile +number.

      +
      + +

      NOTES

      + + + + + +
      +

      The library writes encoded data using the native +machine byte order. Correctly implemented TIFF +readers are expected to do any necessary byte-swapping +to correctly process image data with BitsPerSample greater +than 8.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      −1 is returned if an error was encountered. +Otherwise, the value of size is returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      %s: File not open for writing. The file was +opened for reading, not writing.

      + +

      Can not write tiles to a stripped image. The +image is assumed to be organized in strips because neither +of the TileWidth or TileLength tags have been +set with TIFFSetField(3TIFF).

      + +

      %s: Must set "ImageWidth" before +writing data. The image’s width has not be set +before the first write. See TIFFSetField(3TIFF) for +information on how to do this.

      + +

      %s: Must set "PlanarConfiguration" +before writing data. The organization of data has not be +defined before the first write. See +TIFFSetField(3TIFF) for information on how to do +this.

      + +

      %s: No space for tile arrays". There was +not enough space for the arrays that hold tile offsets and +byte counts.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFWriteTile(3TIFF), +TIFFWriteRawTile(3TIFF), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFWriteRawStrip.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFWriteRawStrip.3tiff.html new file mode 100644 index 0000000000..95b48570ed --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFWriteRawStrip.3tiff.html @@ -0,0 +1,144 @@ + + + + + + +TIFFWriteRawstrip + + + +

      TIFFWriteRawstrip

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFWriteRawStrip − write a strip of raw data to an +open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFWriteRawStrip(TIFF *tif, +tstrip_t strip, tdata_t buf, +tsize_t size)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Append size bytes of raw data to the specified +strip.

      +
      + +

      NOTES

      + + + + + +
      +

      The strip number must be valid according to the current +settings of the ImageLength and RowsPerStrip +tags. An image may be dynamically grown by increasing the +value of ImageLength prior to each call to +TIFFWriteRawStrip.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      −1 is returned if an error occurred. Otherwise, the +value of size is returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      %s: File not open for writing. The file was opened +for reading, not writing.

      + +

      Can not write scanlines to a tiled image. The +image is assumed to be organized in tiles because the +TileWidth and TileLength tags have been set +with TIFFSetField(3TIFF).

      + +

      %s: Must set "ImageWidth" before writing +data. The image’s width has not be set before the +first write. See TIFFSetField(3TIFF) for information +on how to do this.

      + +

      %s: Must set "PlanarConfiguration" before +writing data. The organization of data has not be +defined before the first write. See +TIFFSetField(3TIFF) for information on how to do +this.

      + +

      %s: No space for strip arrays". There was not +enough space for the arrays that hold strip offsets and byte +counts.

      + +

      %s: Strip %d out of range, max %d. The specified +strip is not a valid strip according to the currently +specified image dimensions.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFWriteEncodedStrip(3TIFF), +TIFFWriteScanline(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFWriteRawTile.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFWriteRawTile.3tiff.html new file mode 100644 index 0000000000..3d18ed18c3 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFWriteRawTile.3tiff.html @@ -0,0 +1,128 @@ + + + + + + +TIFFWriteRawtile + + + +

      TIFFWriteRawtile

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFWriteRawTile − write a tile of raw data to an +open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFWriteRawTile(TIFF *tif, +ttile_t tile, tdata_t buf, +tsize_t size)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Append size bytes of raw data to the specified +tile.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      −1 is returned if an error occurred. Otherwise, the +value of size is returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      %s: File not open for writing. The file was opened +for reading, not writing.

      + +

      Can not write tiles to a stripped image. The image +is assumed to be organized in strips because neither of the +TileWidth or TileLength tags have been set +with TIFFSetField(3TIFF).

      + +

      %s: Must set "ImageWidth" before writing +data. The image’s width has not be set before the +first write. See TIFFSetField(3TIFF) for information +on how to do this.

      + +

      %s: Must set "PlanarConfiguration" before +writing data. The organization of data has not be +defined before the first write. See +TIFFSetField(3TIFF) for information on how to do +this.

      + +

      %s: No space for tile arrays". There was not +enough space for the arrays that hold tile offsets and byte +counts.

      + +

      %s: Specified tile %d out of range, max %d. The +specified tile is not valid according to the currently +specified image dimensions.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFWriteEncodedTile(3TIFF), +TIFFWriteScanline(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFWriteScanline.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFWriteScanline.3tiff.html new file mode 100644 index 0000000000..bb9323d2e3 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFWriteScanline.3tiff.html @@ -0,0 +1,206 @@ + + + + + + +TIFFWriteScanline + + + +

      TIFFWriteScanline

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +NOTES
      +RETURN VALUES
      +DIAGNOSTICS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFWriteScanline − write a scanline to an open +TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFWriteScanline(TIFF *tif, +tdata_t buf, uint32 row, +tsample_t sample)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Write data to a file at the specified row. The +sample parameter is used only if data are organized +in separate planes (PlanarConfiguration=2). The data +are assumed to be uncompressed and in the native bit- and +byte-order of the host machine. The data written to the file +is compressed according to the compression scheme of the +current TIFF directory (see further below). +If the current scanline is past the end of the current +subfile, the ImageLength field is automatically +increased to include the scanline (except for +PlanarConfiguration=2, where the ImageLength +cannot be changed once the first data are written). If the +ImageLength is increased, the StripOffsets and +StripByteCounts fields are similarly enlarged to +reflect data written past the previous end of image.

      +
      + +

      NOTES

      + + + + + +
      +

      The library writes encoded data using the native machine +byte order. Correctly implemented TIFF +readers are expected to do any necessary byte-swapping to +correctly process image data with BitsPerSample greater than +8. The library attempts to hide bit-ordering differences +between the image and the native machine by converting data +from the native machine order.

      + +

      In C++ the sample parameter defaults to 0.

      + +

      Once data are written to a file for the current +directory, the values of certain tags may not be altered; +see TIFFSetField(3TIFF) for more information.

      + +

      It is not possible to write scanlines to a file that uses +a tiled organization. The routine TIFFIsTiled can be +used to determine if the file is organized as tiles or +strips.

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      TIFFWriteScanline returns −1 if it +immediately detects an error and 1 for a successful +write.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      + +

      %s: File not open for writing . The file was +opened for reading, not writing.

      + +

      Can not write scanlines to a tiled image. An +attempt was made to write a scanline to a tiled image. The +image is assumed to be organized in tiles because the +TileWidth and TileLength tags have been set +with TIFFSetField(3TIFF).

      + +

      Compression algorithm does not support random +access. Data was written in a non-sequential order to a +file that uses a compression algorithm and that has +RowsPerStrip greater than one. That is, data in the +image is to be stored in a compressed form, and with +multiple rows packed into a strip. In this case, the library +does not support random access to the data. The data should +either be written as entire strips, sequentially by rows, or +the value of RowsPerStrip should be set to one.

      + +

      %s: Must set "ImageWidth" before writing +data. The image’s width has not be set before the +first write. See TIFFSetField(3TIFF) for information +on how to do this.

      + +

      %s: Must set "PlanarConfiguration" before +writing data. The organization of data has not be +defined before the first write. See +TIFFSetField(3TIFF) for information on how to do +this.

      + +

      Can not change "ImageLength" when using +separate planes. Separate image planes are being used +(PlanarConfiguration=2), but the number of rows has +not been specified before the first write. The library +supports the dynamic growth of an image only when data are +organized in a contiguous manner +(PlanarConfiguration=1).

      + +

      %d: Sample out of range, max %d. The sample +parameter was greater than the value of the SamplesPerPixel +tag.

      + +

      %s: No space for strip arrays . There was not +enough space for the arrays that hold strip offsets and byte +counts.

      +
      + +

      BUGS

      + + + + + +
      +

      Writing subsampled YCbCR data does not work correctly +because, for PlanarConfiguration=2 the size of a +scanline is not calculated on a per-sample basis, and for +PlanarConfiguration=1 the library does not pack the +block-interleaved samples.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), +TIFFWriteEncodedStrip(3TIFF), +TIFFWriteRawStrip(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFWriteTile.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFWriteTile.3tiff.html new file mode 100644 index 0000000000..d6bc5d8aed --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFWriteTile.3tiff.html @@ -0,0 +1,115 @@ + + + + + + +TIFFWriteTile + + + +

      TIFFWriteTile

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +RETURN VALUES
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFWriteTile − encode and write a tile of data to +an open TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFWriteTile(TIFF *tif, +tdata_t buf, uint32 x, +uint32 y, uint32 z, +tsample_t sample)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Write the data for the tile containing the +specified coordinates. The data in buf are is +(potentially) compressed, and written to the indicated file, +normally being appended to the end of the file. The buffer +must be contain an entire tile of data. Applications should +call the routine TIFFTileSize to find out the size +(in bytes) of a tile buffer. The x and y +parameters are always used by TIFFWriteTile. The +z parameter is used if the image is deeper than 1 +slice (ImageDepth>1). The sample parameter +is used only if data are organized in separate planes +(PlanarConfiguration=2).

      +
      + +

      RETURN VALUES

      + + + + + +
      +

      TIFFWriteTile returns −1 if it detects an +error; otherwise the number of bytes in the tile is +returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed to the +TIFFError(3TIFF) routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFCheckTile(3TIFF), +TIFFComputeTile(3TIFF), TIFFOpen(3TIFF), +TIFFReadTile(3TIFF), TIFFWriteScanline(3TIFF), +TIFFWriteEncodedTile(3TIFF), +TIFFWriteRawTile(3TIFF), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFbuffer.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFbuffer.3tiff.html new file mode 100644 index 0000000000..3d610ca539 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFbuffer.3tiff.html @@ -0,0 +1,116 @@ + + + + + + +TIFFBUFFER + + + +

      TIFFBUFFER

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFReadBufferSetup, TIFFWriteBufferSetup − I/O +buffering control routines

      +
      + +

      SYNOPSIS

      + + + + + +
      +
      #include <tiffio.h>
      +
      +int TIFFReadBufferSetup(TIFF *tif, tdata_t buffer, tsize_t size);
      +int TIFFWriteBufferSetup(TIFF *tif, tdata_t buffer, tsize_t size);
      +
      +
      + +

      DESCRIPTION

      + + + + + + +
      +

      The following routines are provided for client-control of +the I/O buffers used by the library. Applications need never +use these routines; they are provided only for +‘‘intelligent clients’’ that wish to +optimize memory usage and/or eliminate potential copy +operations that can occur when working with images that have +data stored without compression.

      + +

      TIFFReadBufferSetup sets up the data buffer used +to read raw (encoded) data from a file. If the specified +pointer is NULL (zero), then a buffer of the +appropriate size is allocated. Otherwise the caller must +guarantee that the buffer is large enough to hold any +individual strip of raw data. TIFFReadBufferSetup +returns a non-zero value if the setup was successful and +zero otherwise.

      + +

      TIFFWriteBufferSetup sets up the data buffer used +to write raw (encoded) data to a file. If the specified +size is −1 then the buffer size is selected to +hold a complete tile or strip, or at least 8 kilobytes, +whichever is greater. If the specified buffer is +NULL (zero), then a buffer of the appropriate +size is dynamically allocated. TIFFWriteBufferSetup +returns a non-zero value if the setup was successful and +zero otherwise.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      %s: No space for data buffer at scanline %ld. +TIFFReadBufferSetup was unable to dynamically +allocate space for a data buffer.

      + +

      %s: No space for output buffer. +TIFFWriteBufferSetup was unable to dynamically +allocate space for a data buffer.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFcodec.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFcodec.3tiff.html new file mode 100644 index 0000000000..8567b30b4b --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFcodec.3tiff.html @@ -0,0 +1,116 @@ + + + + + + +CODEC + + + +

      CODEC

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFFindCODEC, TIFFRegisterCODEC, TIFFUnRegisterCODEC, +TIFFIsCODECConfigured − codec-related utility +routines

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      const TIFFCodec* TIFFFindCODEC(uint16 +scheme);
      +TIFFCodec* TIFFRegisterCODEC(uint16
      scheme, +const char *method, TIFFInitMethod +init);
      +void TIFFUnRegisterCODEC(TIFFCodec +*
      codec);
      +int TIFFIsCODECConfigured(uint16
      +scheme);

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      libtiff supports a variety of compression schemes +implemented by software codecs. Each codec adheres to +a modular interface that provides for the decoding and +encoding of image data; as well as some other methods for +initialization, setup, cleanup, and the control of default +strip and tile sizes. Codecs are identified by the +associated value of the TIFF +Compression tag; e.g. 5 for LZW +compression.

      + +

      The TIFFRegisterCODEC routine can be used to +augment or override the set of codecs available to an +application. If the specified scheme already has a +registered codec then it is overridden and any images +with data encoded with this compression scheme will be +decoded using the supplied coded.

      + +

      TIFFIsCODECConfigured returns 1 if the codec is +configured and working. Otherwise 0 will be returned.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      No space to register compression scheme %s. +TIFFRegisterCODEC was unable to allocate memory for +the data structures needed to register a codec.

      + +

      Cannot remove compression scheme %s; not +registered. TIFFUnRegisterCODEC did not locate +the specified codec in the table of registered compression +schemes.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFcolor.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFcolor.3tiff.html new file mode 100644 index 0000000000..7e4eea51c7 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFcolor.3tiff.html @@ -0,0 +1,975 @@ + + + + + + +COLOR + + + +

      COLOR

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFYCbCrToRGBInit, TIFFYCbCrtoRGB, TIFFCIELabToRGBInit, +TIFFCIELabToXYZ, TIFFXYZToRGB − color conversion +routines.

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB +*ycbcr, float *luma, float +*refBlackWhite");"
      +void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *
      ycbcr, +uint32 Y, int32 Cb, int32 +Cr, uint32 *R, uint32 +*G, uint32 *B );

      + +

      int TIFFCIELabToRGBInit(TIFFCIELabToRGB +*cielab, TIFFDisplay *display, +float *refWhite);
      +void TIFFCIELabToXYZ(TIFFCIELabToRGB *
      cielab, +uint32 L, int32 a, int32 +b, float *X, float *Y, +float *Z);
      +void TIFFXYZToRGB(TIFFCIELabToRGB *
      cielab, +float X, float Y, float +Z",uint32*"R, +uint32 *G, uint32 *B);

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFF supports several color spaces for images stored in +that format. There is usually a problem of application to +handle the data properly and convert between different +colorspaces for displaying and printing purposes. To +simplify this task libtiff implements several color +conversion routines itself. In particular, these routines +used in TIFFRGBAImage(3TIFF) interface.

      + +

      TIFFYCbCrToRGBInit() used to initialize +YCbCr to RGB conversion state. Allocating and +freeing of the ycbcr structure belongs to programmer. +TIFFYCbCrToRGB defined in tiffio.h as

      +
      + + + + + +
      +
      typedef struct {                /* YCbCr->RGB support */
      +        TIFFRGBValue* clamptab; /* range clamping table */
      +
      +
      + + + + + +

      int*

      + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      Cr_r_tab;
      +int*

      +
      +
      + +

      Cb_b_tab;
      +int32*

      +
      +
      + +

      Cr_g_tab;
      +int32*

      +
      +
      + +

      Cb_g_tab;

      +
      +
      + + + + + +
      +

      int32* Y_tab;
      +} TIFFYCbCrToRGB;

      + + + + + +
      +

      luma is a float array of three values representing +proportions of the red, green and blue in luminance, Y (see +section 21 of the TIFF 6.0 specification, where the YCbCr +images discussed). TIFFTAG_YCBCRCOEFFICIENTS holds +that values in TIFF file. refBlackWhite is a float +array of 6 values which specifies a pair of headroom and +footroom image data values (codes) for each image component +(see section 20 of the TIFF 6.0 specification where the +colorinmetry fields discussed). +TIFFTAG_REFERENCEBLACKWHITE is responsible for +storing these values in TIFF file. Following code snippet +should helps to understand the the technique:

      +
      + + + + + +
      +
      float *luma, *refBlackWhite;
      +uint16 hs, vs;
      +
      +/* Initialize structures */
      +ycbcr = (TIFFYCbCrToRGB*)
      +
      +
      + + + + + + + + + + + + + + + +
      + +

      _TIFFmalloc(TIFFroundup(sizeof(TIFFYCbCrToRGB), +sizeof(long))

      +
      + +

      + 4*256*sizeof(TIFFRGBValue)

      +
      + +

      + 2*256*sizeof(int)

      +
      + +

      + 3*256*sizeof(int32));

      +
      + + + + + +
      +

      if (ycbcr == NULL) {
      +TIFFError("YCbCr->RGB",

      + + + + + + + +
      + + +

      "No space for YCbCr->RGB conversion +state");

      +
      +
      + + + + + +
      +

      exit(0);
      +}

      + +

      TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRCOEFFICIENTS, +&luma);
      +TIFFGetFieldDefaulted(tif, TIFFTAG_REFERENCEBLACKWHITE, +&refBlackWhite);
      +if (TIFFYCbCrToRGBInit(ycbcr, luma, refBlackWhite) < +0)

      + + + + + +
      + +

      exit(0);

      +
      + + + + + +
      +

      /* Start conversion */
      +uint32 r, g, b;
      +uint32 Y;
      +int32 Cb, Cr;

      + +

      for each pixel in image

      + + + + + +
      + +

      TIFFYCbCrtoRGB(img->ycbcr, Y, Cb, Cr, &r, &g, +&b);

      +
      + + + + + +
      +

      /* Free state structure */
      +_TIFFfree(ycbcr);

      + + + + + +
      +

      TIFFCIELabToRGBInit() initializes the CIE +L*a*b* 1976 to RGB conversion state. +TIFFCIELabToRGB defined as

      +
      + + + + + +
      +
      #define CIELABTORGB_TABLE_RANGE 1500
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      typedef struct {

      +
      + + +

      /* CIE Lab 1976->RGB support */

      +
      +
      + + +

      int

      +
      + +

      range;

      +
      + + +

      /* Size of conversion table */

      +
      +
      + + +

      float

      +
      + +

      rstep, gstep, bstep;

      +
      +
      + + +

      float

      +
      + +

      X0, Y0, Z0;

      +
      + +

      /* Reference white point */

      +
      +
      + +

      TIFFDisplay display;

      +
      +
      + + +

      float

      +
      + +

      Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr +to r */

      +
      +
      + + +

      float

      +
      + +

      Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg +to g */

      +
      +
      + + +

      float

      +
      + +

      Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb +to b */

      +
      +
      + + + + + +
      +

      } TIFFCIELabToRGB;

      + + + + + +
      +

      display is a display device description, declared +as

      +
      + + + + + +
      +
      typedef struct {
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      float d_mat[3][3]; /* XYZ -> luminance matrix */

      +
      + +

      float d_YCR; /* Light o/p for reference white */

      +
      + +

      float d_YCG;

      +
      + +

      float d_YCB;

      +
      + +

      uint32 d_Vrwr; /* Pixel values for ref. white */

      +
      + +

      uint32 d_Vrwg;

      +
      + +

      uint32 d_Vrwb;

      +
      + +

      float d_Y0R; /* Residual light for black pixel */

      +
      + +

      float d_Y0G;

      +
      + +

      float d_Y0B;

      +
      + +

      float d_gammaR; /* Gamma values for the three guns +*/

      +
      + +

      float d_gammaG;

      +
      + +

      float d_gammaB;

      +
      + + + + + +
      +

      } TIFFDisplay;

      + + + + + +
      +

      For example, the one can use sRGB device, which has the +following parameters:

      +
      + + + + + +
      +
      TIFFDisplay display_sRGB = {
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      { /* XYZ -> luminance matrix */

      +
      +
      + + +

      { 3.2410F, -1.5374F, -0.4986F },

      +
      +
      + + +

      { -0.9692F, 1.8760F, 0.0416F },

      +
      +
      + + +

      { 0.0556F, -0.2040F, 1.0570F }

      +
      +
      + +

      },

      +
      + +
      + +

      100.0F, 100.0F, 100.0F, /* Light o/p for reference white +*/

      +
      +
      + +

      255, 255, 255, /* Pixel values for ref. white */

      +
      +
      + +

      1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel +*/

      +
      +
      + +

      2.4F, 2.4F, 2.4F, /* Gamma values for the three guns +*/

      +
      +
      + + + + + +
      +

      };

      + + + + + +
      +

      refWhite is a color temperature of the reference +white. The TIFFTAG_WHITEPOINT contains the +chromaticity of the white point of the image from where the +reference white can be calculated using following +formulae:

      +
      + + + + + +
      +

      refWhite_Y = 100.0
      +refWhite_X = whitePoint_x / whitePoint_y * refWhite_Y
      +refWhite_Z = (1.0 - whitePoint_x - whitePoint_y) / +whitePoint_y * refWhite_X

      + + + + + +
      +

      The conversion itself performed in two steps: at the +first one we will convert CIE L*a*b* 1976 to CIE +XYZ using TIFFCIELabToXYZ() routine, and at the +second step we will convert CIE XYZ to RGB +using TIFFXYZToRGB(). Look at the code sample +below:

      +
      + + + + + +
      +
      float   *whitePoint;
      +float   refWhite[3];
      +
      +/* Initialize structures */
      +img->cielab = (TIFFCIELabToRGB *)
      +
      +
      + + + + + + +
      + +

      _TIFFmalloc(sizeof(TIFFCIELabToRGB));

      +
      + + + + + +
      +

      if (!cielab) {

      + + + + + + + + + + + + + + + + + + + + +
      + +

      TIFFError("CIE L*a*b*->RGB",

      +
      +
      + + +

      "No space for CIE L*a*b*->RGB conversion +state.");

      +
      +
      + +

      exit(0);

      +
      +
      + + + + + +
      +

      }

      + +

      TIFFGetFieldDefaulted(tif, TIFFTAG_WHITEPOINT, +&whitePoint);
      +refWhite[1] = 100.0F;
      +refWhite[0] = whitePoint[0] / whitePoint[1] * +refWhite[1];
      +refWhite[2] = (1.0F - whitePoint[0] - +whitePoint[1])

      + + + + + +
      + +

      / whitePoint[1] * refWhite[1];

      +
      + + + + + +
      +

      if (TIFFCIELabToRGBInit(cielab, &display_sRGB, +refWhite) < 0) {

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      TIFFError("CIE L*a*b*->RGB",

      +
      +
      + + +

      "Failed to initialize CIE L*a*b*->RGB conversion +state.");

      +
      +
      + +

      _TIFFfree(cielab);

      +
      +
      + +

      exit(0);

      +
      +
      + + + + + +
      +

      }

      + +

      /* Now we can start to convert */
      +uint32 r, g, b;
      +uint32 L;
      +int32 a, b;
      +float X, Y, Z;

      + +

      for each pixel in image

      + + + + + + + + +
      + +

      TIFFCIELabToXYZ(cielab, L, a, b, &X, &Y, +&Z);

      +
      + +

      TIFFXYZToRGB(cielab, X, Y, Z, &r, &g, +&b);

      +
      + + + + + +
      +

      /* Don’t forget to free the state structure */
      +_TIFFfree(cielab);

      + +

      SEE ALSO

      + + + + + +
      +

      TIFFRGBAImage(3TIFF) libtiff(3TIFF),

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFmemory.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFmemory.3tiff.html new file mode 100644 index 0000000000..746b5ec269 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFmemory.3tiff.html @@ -0,0 +1,110 @@ + + + + + + +MEMORY + + + +

      MEMORY

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      _TIFFmalloc, _TIFFrealloc, _TIFFfree, _TIFFmemset, +_TIFFmemcpy, _TIFFmemcmp, − memory management-related +functions for use with TIFF files

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tdata_t _TIFFmalloc(tsize_t size);
      +tdata_t _TIFFrealloc(tdata_t
      buffer, +tsize_t size);
      +void _TIFFfree(tdata_t
      buffer);
      +void _TIFFmemset(tdata_t
      s, int +c, tsize_t n);
      +void _TIFFmemcpy(tdata_t
      dest, const +tdata_t src, tsize_t n);
      +int _TIFFmemcmp(const tdata_t
      s1, const +tdata_t s2, tsize_t n);

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      These routines are provided for writing portable software +that uses libtiff; they hide any memory-management +related issues, such as dealing with segmented architectures +found on 16-bit machines.

      + +

      _TIFFmalloc and _TIFFrealloc are used to +dynamically allocate and reallocate memory used by +libtiff; such as memory passed into the I/O routines. +Memory allocated through these interfaces is released back +to the system using the _TIFFfree routine.

      + +

      Memory allocated through one of the above interfaces can +be set to a known value using _TIFFmemset, copied to +another memory location using _TIFFmemcpy, or +compared for equality using _TIFFmemcmp. These +routines conform to the equivalent ANSI C +routines: memset, memcpy, and memcmp, +repsectively.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      None.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      malloc(3), memory(3), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFquery.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFquery.3tiff.html new file mode 100644 index 0000000000..e27354af84 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFquery.3tiff.html @@ -0,0 +1,148 @@ + + + + + + +QUERY + + + +

      QUERY

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFCurrentRow, TIFFCurrentStrip, TIFFCurrentTile, +TIFFCurrentDirectory, TIFFLastDirectory, TIFFFileno, +TIFFFileName, TIFFGetMode, TIFFIsTiled, TIFFIsByteSwapped, +TIFFIsUpSampled, TIFFIsMSB2LSB, TIFFGetVersion − query +routines

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      uint32 TIFFCurrentRow(TIFF* tif)
      +tstrip_t TIFFCurrentStrip(TIFF*
      tif)
      +ttile_t TIFFCurrentTile(TIFF*
      tif)
      +tdir_t TIFFCurrentDirectory(TIFF*
      tif)
      +int TIFFLastDirectory(TIFF*
      tif)
      +int TIFFFileno(TIFF*
      tif)
      +char* TIFFFileName(TIFF*
      tif)
      +int TIFFGetMode(TIFF*
      tif)
      +int TIFFIsTiled(TIFF*
      tif)
      +int TIFFIsByteSwapped(TIFF*
      tif)
      +int TIFFIsUpSampled(TIFF*
      tif)
      +int TIFFIsMSB2LSB(TIFF*
      tif)
      +const char* TIFFGetVersion(void)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      The following routines return status information about an +open TIFF file.

      + +

      TIFFCurrentDirectory returns the index of the +current directory (directories are numbered starting at 0). +This number is suitable for use with the +TIFFSetDirectory routine.

      + +

      TIFFLastDirectory returns a non-zero value if the +current directory is the last directory in the file; +otherwise zero is returned.

      + +

      TIFFCurrentRow, TIFFCurrentStrip, and +TIFFCurrentTile, return the current row, strip, and +tile, respectively, that is being read or written. These +values are updated each time a read or write is done.

      + +

      TIFFFileno returns the underlying file descriptor +used to access the TIFF image in the +filesystem.

      + +

      TIFFFileName returns the pathname argument passed +to TIFFOpen or TIFFFdOpen.

      + +

      TIFFGetMode returns the mode with which the +underlying file was opened. On UNIX systems, +this is the value passed to the open(2) system +call.

      + +

      TIFFIsTiled returns a non-zero value if the image +data has a tiled organization. Zero is returned if the image +data is organized in strips.

      + +

      TIFFIsByteSwapped returns a non-zero value if the +image data was in a different byte-order than the host +machine. Zero is returned if the TIFF file and local host +byte-orders are the same. Note that TIFFReadTile(), +TIFFReadStrip() and TIFFReadScanline() functions already +normally perform byte swapping to local host order if +needed.

      + +

      TIFFIsUpSampled returns a non-zero value if image +data returned through the read interface routines is being +up-sampled. This can be useful to applications that want to +calculate I/O buffer sizes to reflect this usage (though the +usual strip and tile size routines already do this).

      + +

      TIFFIsMSB2LSB returns a non-zero value if the +image data is being returned with bit 0 as the most +significant bit.

      + +

      TIFFGetVersion returns an ASCII +string that has a version stamp for the TIFF +library software.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      None.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3TIFF), TIFFOpen(3TIFF), +TIFFFdOpen(3TIFF)

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFsize.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFsize.3tiff.html new file mode 100644 index 0000000000..54fb71b8c3 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFsize.3tiff.html @@ -0,0 +1,95 @@ + + + + + + +TIFFSIZE + + + +

      TIFFSIZE

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFScanlineSize, TIFFRasterScanlineSize, − return +the size of various items associated with an open +TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      tsize_t TIFFRasterScanlineSize(TIFF +*tif)
      +tsize_t TIFFScanlineSize(TIFF *
      tif)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFScanlineSize returns the size in bytes of a +row of data as it would be returned in a call to +TIFFReadScanline, or as it would be expected in a +call to TIFFWriteScanline.

      + +

      TIFFRasterScanlineSize returns the size in bytes +of a complete decoded and packed raster scanline. Note that +this value may be different from the value returned by +TIFFScanlineSize if data is stored as separate +planes.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      None.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFOpen(3TIFF), TIFFReadScanline(3TIFF), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFstrip.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFstrip.3tiff.html new file mode 100644 index 0000000000..a0fc358bff --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFstrip.3tiff.html @@ -0,0 +1,129 @@ + + + + + + +TIFFSTRIP + + + +

      TIFFSTRIP

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFDefaultStripSize, TIFFStripSize, TIFFVStripSize, +TIFFRawStripSize, TIFFComputeStrip, TIFFNumberOfStrips +− strip-related utility routines

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      uint32 TIFFDefaultStripSize(TIFF *tif, +uint32 estimate)
      +tsize_t TIFFStripSize(TIFF *
      tif)
      +tsize_t TIFFVStripSize(TIFF *
      tif, uint32 +nrows)
      +tsize_t TIFFRawStripSize(TIFF *
      tif, +tstrip_t strip)
      +tstrip_t TIFFComputeStrip(TIFF *
      tif, +uint32 row, tsample_t +sample)
      +tstrip_t TIFFNumberOfStrips(TIFF *
      tif)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFDefaultStripSize returns the number of rows +for a reasonable-sized strip according to the current +settings of the ImageWidth, BitsPerSample, +SamplesPerPixel, tags and any compression-specific +requirements. If the estimate parameter, if non-zero, +then it is taken as an estimate of the desired strip size +and adjusted according to any compression-specific +requirements. The value returned by this function is +typically used to define the RowsPerStrip tag. In +lieu of any unusual requirements TIFFDefaultStripSize +tries to create strips that have approximately 8 kilobytes +of uncompressed data.

      + +

      TIFFStripSize returns the equivalent size for a +strip of data as it would be returned in a call to +TIFFReadEncodedStrip or as it would be expected in a +call to TIFFWriteEncodedStrip.

      + +

      TIFFVStripSize returns the number of bytes in a +strip with nrows rows of data.

      + +

      TIFFRawStripSize returns the number of bytes in a +raw strip (i.e. not decoded).

      + +

      TIFFComputeStrip returns the strip that contains +the specified coordinates. A valid strip is always returned; +out-of-range coordinate values are clamped to the bounds of +the image. The row parameter is always used in +calculating a strip. The sample parameter is used +only if data are organized in separate planes +(PlanarConfiguration=2).

      + +

      TIFFNumberOfStrips returns the number of strips in +the image.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      None.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFReadEncodedStrip(3TIFF), +TIFFReadRawStrip(3TIFF), +TIFFWriteEncodedStrip(3TIFF), +TIFFWriteRawStrip(3TIFF), libtiff(3TIFF),

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFswab.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFswab.3tiff.html new file mode 100644 index 0000000000..2924a38bd9 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFswab.3tiff.html @@ -0,0 +1,110 @@ + + + + + + +SWAB + + + +

      SWAB

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFGetBitRevTable, TIFFReverseBits, TIFFSwabShort, +TIFFSwabLong, TIFFSwabArrayOfShort, TIFFSwabArrayOfLong +− byte- and bit-swapping routines

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      const unsigned char* TIFFGetBitRevTable(int +reversed)
      +void TIFFReverseBits(u_char *
      data, unsigned +long nbytes)
      +void TIFFSwabShort(uint16 *
      data)
      +void TIFFSwabLong(uint32 *
      data)
      +void TIFFSwabArrayOfShort(uint16 *
      data, +unsigned long nshorts)
      +void TIFFSwabArrayOfLong(uint32 *
      data, +unsigned long nlongs)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      The following routines are used by the library to swap +16- and 32-bit data and to reverse the order of bits in +bytes.

      + +

      TIFFSwabShort and TIFFSwabLong swap the +bytes in a single 16-bit and 32-bit item, respectively. +TIFFSwabArrayOfShort and TIFFSwabArrayOfLong +swap the bytes in an array of 16-bit and 32-bit items, +respectively.

      + +

      TIFFReverseBits replaces each byte in data +with the equivalent bit-reversed value. This operation is +performed with a lookup table, which is returned using the +TIFFGetBitRevTable function. reversed +parameter specifies which table should be returned. Supply +1 if you want bit reversal table. Supply 0 to +get the table that do not reverse bit values. It is a lookup +table that can be used as an identity function; i.e. +TIFFNoBitRevTable[n] == n.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      None.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/TIFFtile.3tiff.html b/src/3rdparty/libtiff/html/man/TIFFtile.3tiff.html new file mode 100644 index 0000000000..e8e0008a06 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/TIFFtile.3tiff.html @@ -0,0 +1,141 @@ + + + + + + +TIFFTILE + + + +

      TIFFTILE

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DIAGNOSTICS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      TIFFTileSize, TIFFTileRowSize, TIFFVTileSize, +TIFFDefaultTileSize, TIFFComputeTile, TIFFCheckTile, +TIFFNumberOfTiles − tile-related utility routines

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      void TIFFDefaultTileSize(TIFF *tif, +uint32 *tw, uint32 *th)
      +tsize_t TIFFTileSize(TIFF *
      tif)
      +tsize_t TIFFTileRowSize(TIFF *
      tif)
      +tsize_t TIFFVTileSize(TIFF *
      tif, uint32 +nrows)
      +ttile_t TIFFComputeTile(TIFF *
      tif, uint32 +x, uint32 y, uint32 z, +tsample_t sample)
      +int TIFFCheckTile(TIFF *
      tif, uint32 +x, uint32 y, uint32 z, +tsample_t sample)
      +ttile_t TIFFNumberOfTiles(TIFF *
      tif)

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      TIFFDefaultTileSize returns the pixel width and +height of a reasonable-sized tile; suitable for setting up +the TileWidth and TileLength tags. If the +tw and th values passed in are non-zero, then +they are adjusted to reflect any compression-specific +requirements. The returned width and height are constrained +to be a multiple of 16 pixels to conform with the +TIFF specification.

      + +

      TIFFTileSize returns the equivalent size for a +tile of data as it would be returned in a call to +TIFFReadTile or as it would be expected in a call to +TIFFWriteTile.

      + +

      TIFFVTileSize returns the number of bytes in a +row-aligned tile with nrows of data.

      + +

      TIFFTileRowSize returns the number of bytes of a +row of data in a tile.

      + +

      TIFFComputeTile returns the tile that contains the +specified coordinates. A valid tile is always returned; +out-of-range coordinate values are clamped to the bounds of +the image. The x and y parameters are always +used in calculating a tile. The z parameter is used +if the image is deeper than 1 slice +(ImageDepth>1). The sample parameter is +used only if data are organized in separate planes +(PlanarConfiguration=2).

      + +

      TIFFCheckTile returns a non-zero value if the +supplied coordinates are within the bounds of the image and +zero otherwise. The x parameter is checked against +the value of the ImageWidth tag. The y +parameter is checked against the value of the +ImageLength tag. The z parameter is checked +against the value of the ImageDepth tag (if defined). +The sample parameter is checked against the value of +the SamplesPerPixel parameter if the data are +organized in separate planes.

      + +

      TIFFNumberOfTiles returns the number of tiles in +the image.

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      None.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      TIFFReadEncodedTile(3TIFF), +TIFFReadRawTile(3TIFF), TIFFReadTile(3TIFF), +TIFFWriteEncodedTile(3TIFF), +TIFFWriteRawTile(3TIFF), TIFFWriteTile(3TIFF), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/fax2ps.1.html b/src/3rdparty/libtiff/html/man/fax2ps.1.html new file mode 100644 index 0000000000..c5396143ab --- /dev/null +++ b/src/3rdparty/libtiff/html/man/fax2ps.1.html @@ -0,0 +1,252 @@ + + + + + + +FAX2PS + + + +

      FAX2PS

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +DIAGNOSTICS
      +NOTES
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      fax2ps − convert a TIFF facsimile to +compressed PostScript™

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      fax2ps [ options ] [ file ... ]

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      fax2ps reads one or more TIFF +facsimile image files and prints a compressed form of +PostScript on the standard output that is suitable for +printing.

      + +

      By default, each page is scaled to reflect the image +dimensions and resolutions stored in the file. The +−x and −y options can be used to +specify the horizontal and vertical image resolutions +(lines/inch), respectively. If the −S option is +specified, each page is scaled to fill an output page. The +default output page is 8.5 by 11 inches. Alternate page +dimensions can be specified in inches with the +−W and −H options.

      + +

      By default fax2ps generates PostScript for all +pages in the file. The −p option can be used to +select one or more pages from a multi-page document.

      + +

      fax2ps generates a compressed form of PostScript +that is optimized for sending pages of text to a PostScript +printer attached to a host through a low-speed link (such as +a serial line). Each output page is filled with white and +then only the black areas are drawn. The PostScript +specification of the black drawing operations is optimized +by using a special font that encodes the move-draw +operations required to fill the black regions on the page. +This compression scheme typically results in a substantially +reduced PostScript description, relative to the +straightforward imaging of the page with a PostScript +image operator. This algorithm can, however, be +ineffective for continuous-tone and white-on-black images. +For these images, it sometimes is more efficient to send the +raster bitmap image directly; see tiff2ps(1).

      +
      + +

      OPTIONS

      + + + + + + + +
      + +

      −p number

      +
      + +

      Print only the indicated page. Multiple pages may be +printed by specifying this option more than once.

      +
      +
      + + + + + +
      +

      −x resolution

      + + + + + +
      +

      Use resolution as the horizontal resolution, in +dots/inch, of the image data. By default this value is taken +from the file.

      +
      + + + + + +
      +

      −y resolution

      + + + + + +
      +

      Use resolution as the vertical resolution, in +lines/inch, of the image data. By default this value is +taken from the file.

      +
      + + + + + + + + + + + + + + + + + +
      + +

      −S

      +
      + +

      Scale each page of image data to fill the output page +dimensions. By default images are presented according to the +dimension information recorded in the TIFF +file.

      +
      +
      + +

      −W width

      +
      + +

      Use width as the width, in inches, of the output +page.

      +
      +
      + +

      −H height

      +
      + +

      Use height as the height, in inches, of the +output page.

      +
      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      Some messages about malformed TIFF images +come from the TIFF library.

      + +

      Various messages about badly formatted facsimile images +may be generated due to transmission errors in received +facsimile. fax2ps attempts to recover from such data +errors by resynchronizing decoding at the end of the current +scanline. This can result in long horizontal black lines in +the resultant PostScript image.

      +
      + +

      NOTES

      + + + + + +
      +

      If the destination printer supports PostScript Level II +then it is always faster to just send the encoded bitmap +generated by the tiff2ps(1) program.

      +
      + +

      BUGS

      + + + + + +
      +

      fax2ps should probably figure out when it is doing +a poor job of compressing the output and just generate +PostScript to image the bitmap raster instead.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiff2ps(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/fax2tiff.1.html b/src/3rdparty/libtiff/html/man/fax2tiff.1.html new file mode 100644 index 0000000000..38b54c013c --- /dev/null +++ b/src/3rdparty/libtiff/html/man/fax2tiff.1.html @@ -0,0 +1,607 @@ + + + + + + +FAX2TIFF + + + +

      FAX2TIFF

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +DIAGNOSTICS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      fax2tiff − create a TIFF Class F fax +file from raw fax data

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      fax2tiff [ options ] [ −o +output.tif ] input.raw

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Fax2tiff creates a TIFF file +containing CCITT Group 3 or Group 4 encoded +data from one or more files containing +‘‘raw’’ Group 3 or Group 4 encoded +data (typically obtained directly from a fax modem). By +default, each row of data in the resultant +TIFF file is 1-dimensionally encoded and +padded or truncated to 1728 pixels, as needed. The resultant +image is a set of low resolution (98 lines/inch) or medium +resolution (196 lines/inch) pages, each of which is a single +strip of data. The generated file conforms to the +TIFF Class F ( FAX ) +specification for storing facsimile data. This means, in +particular, that each page of the data does not +include the trailing return to control ( +RTC ) code; as required for transmission by +the CCITT Group 3 specifications. The old, +‘‘classic’’, format is created if +the −c option is used. (The Class F format can +also be requested with the −f option.)

      + +

      The default name of the output image is fax.tif; +this can be changed with the −o option. Each +input file is assumed to be a separate page of facsimile +data from the same document. The order in which input files +are specified on the command line is the order in which the +resultant pages appear in the output file.

      +
      + +

      OPTIONS

      + + + + + +
      +

      Options that affect the interpretation of input data +are:

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −3

      +
      + +

      Assume input data is CCITT Group 3 +encoded (default).

      +
      +
      + +

      −4

      +
      + +

      Assume input data is CCITT Group 4 +encoded.

      +
      +
      + +

      −U

      +
      + +

      Assume input data is uncompressed (Group 3 or Group +4).

      +
      +
      + +

      −1

      +
      + +

      Assume input data is encoded with the 1-dimensional +version of the CCITT Group 3 Huffman encoding +algorithm (default).

      +
      +
      + +

      −2

      +
      + +

      Assume input data is 2-dimensional version of the +CCITT Group 3 Huffman encoding algorithm.

      +
      +
      + +

      −P

      +
      + +

      Assume input data is not EOL-aligned (default). +This option has effect with Group 3 encoded input only.

      +
      +
      + +

      −A

      +
      + +

      Assume input data is EOL-aligned. This option has effect +with Group 3 encoded input only.

      +
      +
      + +

      −M

      +
      + +

      Treat input data as having bits filled from most +significant bit ( MSB ) to most least bit ( +LSB ).

      +
      +
      + +

      −L

      +
      + +

      Treat input data as having bits filled from least +significant bit ( LSB ) to most significant +bit ( MSB ) (default).

      +
      +
      + +

      −B

      +
      + +

      Assume input data was encoded with black as 0 and white +as 1.

      +
      +
      + +

      −W

      +
      + +

      Assume input data was encoded with black as 1 and white +as 0 (default).

      +
      +
      + +

      −R

      +
      + +

      Specify the vertical resolution, in lines/inch, of the +input images. By default input are assumed to have a +vertical resolution of 196 lines/inch. If images are low +resolution facsimile, a value of 98 lines/inch should be +specified.

      +
      +
      + +

      −X

      +
      + +

      Specify the width, in pixels, of the input images. By +default input are assumed to have a width of 1728 +pixels.

      +
      +
      + + + + + +
      +

      Options that affect the output file format are:

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −o

      +
      + +

      Specify the name of the output file.

      +
      +
      + +

      −7

      +
      + +

      Force output to be compressed with the +CCITT Group 3 Huffman encoding algorithm +(default).

      +
      +
      + +

      −8

      +
      + +

      Force output to be compressed with the +CCITT Group 4 Huffman encoding.

      +
      +
      + +

      −u

      +
      + +

      Force output to be uncompressed (Group 3 or Group +4).

      +
      +
      + +

      −5

      +
      + +

      Force output to be encoded with the 1-dimensional +version of the CCITT Group 3 Huffman encoding +algorithm.

      +
      +
      + +

      −6

      +
      + +

      Force output to be encoded with the 2-dimensional +version of the CCITT Group 3 Huffman encoding +algorithm (default).

      +
      +
      + +

      −a

      +
      + +

      Force the last bit of each End Of Line ( +EOL ) code to land on a byte boundary +(default). This ‘‘zero padding’’ +will be reflected in the contents of the +Group3Options tag of the resultant +TIFF file. This option has effect with Group +3 encoded output only.

      +
      +
      + +

      −p

      +
      + +

      Do not EOL-align output. This option has effect with +Group 3 encoded output only.

      +
      +
      + +

      −c

      +
      + +

      Generate "classic" Group 3 TIFF format.

      +
      +
      + +

      −f

      +
      + +

      Generate TIFF Class F (TIFF/F) format (default).

      +
      +
      + +

      −m

      +
      + +

      Force output data to have bits filled from most +significant bit ( MSB ) to most least bit ( +LSB ).

      +
      +
      + +

      −l

      +
      + +

      Force output data to have bits filled from least +significant bit ( LSB ) to most significant +bit ( MSB ) (default).

      +
      +
      + +

      −r

      +
      + +

      Specify the number of rows (scanlines) in each strip of +data written to the output file. By default (or when value +0 is specified), tiffcp attempts to set the +rows/strip that no more than 8 kilobytes of data appear in a +strip (with except of G3/G4 compression schemes). If you +specify special value −1 it will results in +infinite number of the rows per strip. The entire image will +be the one strip in that case. This is default in case of +G3/G4 output compression schemes.

      +
      +
      + +

      −s

      +
      + +

      Stretch the input image vertically by writing each input +row of data twice to the output file.

      +
      +
      + +

      −v

      +
      + +

      Force fax2tiff to print the number of rows of +data it retrieved from the input file.

      +
      +
      + +

      −z

      +
      + +

      Force output to be compressed with the LZW encoding.

      +
      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      The following warnings and errors come from the decoding +routines in the library.

      + +

      Warning, %s: Premature EOL at scanline %d (x +%d).\n. The input data had a row that was shorter than +the expected width. The row is padded with white.

      + +

      %s: Premature EOF at scanline %d (x %d).\n. The +decoder ran out of data in the middle of a scanline. The +resultant row is padded with white.

      + +

      %s: Bad code word at row %d, x %d\n. An invalid +Group 3 code was encountered while decoding the input +file. The row number and horizontal position is given. The +remainder of the input row is discarded, while the +corresponding output row is padded with white.

      + +

      %s: Bad 2D code word at scanline %d.\n. An invalid +Group 4 or 2D Group 3 code was encountered while +decoding the input file. The row number and horizontal +position is given. The remainder of the input row is +discarded, while the corresponding output row is padded with +white.

      +
      + +

      BUGS

      + + + + + +
      +

      Input data are assumed to have a a ‘‘top +left’’ orientation; it should be possible to +override this assumption from the command line.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      CCITT Recommendation T.4 +(Standardization of Group 3 Facsimile Apparatus for Document +Transmission).

      + +

      The Spirit of TIFF Class F, an appendix to the +TIFF 5.0 specification prepared by Cygnet Technologies.

      + +

      tiffinfo(1), tiffdither(1), +tiffgt(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/gif2tiff.1.html b/src/3rdparty/libtiff/html/man/gif2tiff.1.html new file mode 100644 index 0000000000..6114bd317a --- /dev/null +++ b/src/3rdparty/libtiff/html/man/gif2tiff.1.html @@ -0,0 +1,141 @@ + + + + + + +GIF2TIFF + + + +

      GIF2TIFF

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +NOTES
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      gif2tiff − create a TIFF file from a +GIF87 format image file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      gif2tiff [ options ] input.gif +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Gif2tiff converts a file in the GIF87 format to +TIFF. The TIFF image is +created as a palette image, with samples compressed with the +Lempel-Ziv & Welch algorithm (Compression=5). +These characteristics can overridden, or explicitly +specified with the options described below.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Specify a compression scheme to use when writing image +data: −c none for no compression, −c +packbits for the PackBits compression algorithm, +−c zip for the Deflate compression algorithm, +and −c lzw for Lempel-Ziv & Welch (the +default).

      +
      +
      + +

      −r

      +
      + +

      Write data with a specified number of rows per strip; by +default the number of rows/strip is selected so that each +strip is approximately 8 kilobytes.

      +
      +
      + +

      NOTES

      + + + + + +
      +

      The program is based on Paul Haeberli’s +fromgif program which, in turn, is based on Marcel +J.E. Mol’s GIF reader.

      +
      + +

      BUGS

      + + + + + +
      +

      Should have more options to control output format.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffinfo(1), tiffcp(1), +tiffmedian(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/index.html b/src/3rdparty/libtiff/html/man/index.html new file mode 100644 index 0000000000..7e9e8d2c7f --- /dev/null +++ b/src/3rdparty/libtiff/html/man/index.html @@ -0,0 +1,64 @@ +Libtiff HTML manpage index diff --git a/src/3rdparty/libtiff/html/man/libtiff.3tiff.html b/src/3rdparty/libtiff/html/man/libtiff.3tiff.html new file mode 100644 index 0000000000..bea73f761f --- /dev/null +++ b/src/3rdparty/libtiff/html/man/libtiff.3tiff.html @@ -0,0 +1,3137 @@ + + + + + + +INTRO + + + +

      INTRO

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +DATA TYPES
      +LIST OF ROUTINES
      +TAG USAGE
      +PSEUDO TAGS
      +DIAGNOSTICS
      +SEE ALSO
      +BUGS
      + +
      + +

      NAME

      + + + + + +
      +

      libtiff − introduction to libtiff, a +library for reading and writing TIFF +files

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      #include <tiffio.h>

      + +

      cc file.c -ltiff

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      libtiff is a library for reading and writing +data files encoded with the Tag Image File format, +Revision 6.0 (or revision 5.0 or revision 4.0). This file +format is suitable for archiving multi-color and +monochromatic image data.

      + +

      The library supports several compression algorithms, +as indicated by the Compression field, including: no +compression (1), CCITT 1D Huffman compression +(2), CCITT Group 3 Facsimile compression +(3), CCITT Group 4 Facsimile compression (4), +Lempel-Ziv & Welch compression (5), baseline JPEG +compression (7), word-aligned 1D Huffman compression +(32771), and PackBits compression (32773). In addition, +several nonstandard compression algorithms are supported: +the 4-bit compression algorithm used by the +ThunderScan program (32809) (decompression only), +NeXT’s 2-bit compression algorithm (32766) +(decompression only), an experimental LZ-style algorithm +known as Deflate (32946), and an experimental CIE LogLuv +compression scheme designed for images with high dynamic +range (32845 for LogL and 32845 for LogLuv). Directory +information may be in either little- or big-endian byte +order−byte swapping is automatically done by the +library. Data bit ordering may be either Most Significant +Bit ( MSB ) to Least Significant Bit ( LSB +) or LSB to MSB. Finally, the +library does not support files in which the +BitsPerSample, Compression, +MinSampleValue, or MaxSampleValue fields are +defined differently on a per-sample basis (in Rev. 6.0 the +Compression tag is not defined on a per-sample basis, +so this is immaterial).

      +
      + +

      DATA TYPES

      + + + + + +
      +

      The library makes extensive use of C typedefs to +promote portability. Two sets of typedefs are used, one for +communication with clients of the library and one for +internal data structures and parsing of the TIFF +format. The following typedefs are exposed to users +either through function definitions or through parameters +passed through the varargs interfaces.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      typedef unsigned short uint16;

      +
      + +

      16-bit unsigned integer

      +
      + +

      typedef unsigned <thing> +uint32;

      +
      + +

      32-bit unsigned integer

      +
      + +

      typedef unsigned int ttag_t;

      +
      + +

      directory tag

      +
      + +

      typedef uint16 tdir_t;

      +
      + +

      directory index

      +
      + +

      typedef uint16 tsample_t;

      +
      + +

      sample number

      +
      + +

      typedef uint32 tstrip_t;

      +
      + +

      strip number

      +
      + +

      typedef uint32 ttile_t;

      +
      + +

      tile number

      +
      + +

      typedef int32 tsize_t;

      +
      + +

      i/o size in bytes

      +
      + +

      typedef void* tdata_t;

      +
      + +

      image data ref

      +
      + +

      typedef void* thandle_t;

      +
      + +

      client data handle

      +
      + +

      typedef int32 toff_t;

      +
      + +

      file offset

      +
      + + + + + +
      +

      Note that tstrip_t, ttile_t, and +tsize_t are constrained to be no more than 32-bit +quantities by 32-bit fields they are stored in in the +TIFF image. Likewise tsample_t is limited by the +16-bit field used to store the SamplesPerPixel tag. +tdir_t constrains the maximum number of IFDs +that may appear in an image and may be an arbitrary +size (w/o penalty). ttag_t must be either int, +unsigned int, pointer, or double because the library uses a +varargs interface and ANSI C restricts the type +of the parameter before an ellipsis to be a promoted type. +toff_t is defined as int32 because TIFF file offsets +are (unsigned) 32-bit quantities. A signed value is used +because some interfaces return −1 on error. Finally, +note that user-specified data references are passed as +opaque handles and only cast at the lowest layers where +their type is presumed.

      +
      + +

      LIST OF ROUTINES

      + + + + + +
      +

      The following routines are part of the library. +Consult specific manual pages for details on their +operation; on most systems doing ‘‘man +function-name’’ will work.

      + + +

      Name Description

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      TIFFCheckpointDirectory

      +
      + +

      writes the current state of the directory

      +
      + +

      TIFFCheckTile

      +
      + +

      very x,y,z,sample is within image

      +
      + +

      TIFFCIELabToRGBInit

      +
      + +

      initialize CIE L*a*b* 1976 to RGB conversion +state

      +
      + +

      TIFFCIELabToXYZ

      +
      + +

      perform CIE L*a*b* 1976 to CIE XYZ +conversion

      +
      + +

      TIFFClientOpen

      +
      + +

      open a file for reading or writing

      +
      + +

      TIFFClose

      +
      + +

      close an open file

      +
      + +

      TIFFComputeStrip

      +
      + +

      return strip containing y,sample

      +
      + +

      TIFFComputeTile

      +
      + +

      return tile containing x,y,z,sample

      +
      + +

      TIFFCurrentDirectory

      +
      + +

      return index of current directory

      +
      + +

      TIFFCurrentRow

      +
      + +

      return index of current scanline

      +
      + +

      TIFFCurrentStrip

      +
      + +

      return index of current strip

      +
      + +

      TIFFCurrentTile

      +
      + +

      return index of current tile

      +
      + +

      TIFFDataWidth

      +
      + +

      return the size of TIFF data types

      +
      + +

      TIFFError

      +
      + +

      library error handler

      +
      + +

      TIFFFdOpen

      +
      + +

      open a file for reading or writing

      +
      + +

      TIFFFileName

      +
      + +

      return name of open file

      +
      + +

      TIFFFileno

      +
      + +

      return open file descriptor

      +
      + +

      TIFFFindCODEC

      +
      + +

      find standard codec for the specific +scheme

      +
      + +

      TIFFFlush

      +
      + +

      flush all pending writes

      +
      + +

      TIFFFlushData

      +
      + +

      flush pending data writes

      +
      + +

      TIFFGetBitRevTable

      +
      + +

      return bit reversal table

      +
      + +

      TIFFGetField

      +
      + +

      return tag value in current directory

      +
      + +

      TIFFGetFieldDefaulted

      +
      + +

      return tag value in current directory

      +
      + +

      TIFFGetMode

      +
      + +

      return open file mode

      +
      + +

      TIFFGetVersion

      +
      + +

      return library version string

      +
      + +

      TIFFIsCODECConfigured

      +
      + +

      check, whether we have working codec

      +
      + +

      TIFFIsMSB2LSB

      +
      + +

      return true if image data is being +returned

      +
      + +

      with bit 0 as the most significant bit

      +
      + +

      TIFFIsTiled

      +
      + +

      return true if image data is tiled

      +
      + +

      TIFFIsByteSwapped

      +
      + +

      return true if image data is byte-swapped

      +
      + +

      TIFFNumberOfStrips

      +
      + +

      return number of strips in an image

      +
      + +

      TIFFNumberOfTiles

      +
      + +

      return number of tiles in an image

      +
      + +

      TIFFOpen

      +
      + +

      open a file for reading or writing

      +
      + +

      TIFFPrintDirectory

      +
      + +

      print description of the current +directory

      +
      + +

      TIFFReadBufferSetup

      +
      + +

      specify i/o buffer for reading

      +
      + +

      TIFFReadDirectory

      +
      + +

      read the next directory

      +
      + +

      TIFFReadEncodedStrip

      +
      + +

      read and decode a strip of data

      +
      + +

      TIFFReadEncodedTile

      +
      + +

      read and decode a tile of data

      +
      + +

      TIFFReadRawStrip

      +
      + +

      read a raw strip of data

      +
      + +

      TIFFReadRawTile

      +
      + +

      read a raw tile of data

      +
      + +

      TIFFReadRGBAImage

      +
      + +

      read an image into a fixed format raster

      +
      + +

      TIFFReadScanline

      +
      + +

      read and decode a row of data

      +
      + +

      TIFFReadTile

      +
      + +

      read and decode a tile of data

      +
      + +

      TIFFRegisterCODEC

      +
      + +

      override standard codec for the specific +scheme

      +
      + +

      TIFFReverseBits

      +
      + +

      reverse bits in an array of bytes

      +
      + +

      TIFFRGBAImageBegin

      +
      + +

      setup decoder state for TIFFRGBAImageGet

      +
      + +

      TIFFRGBAImageEnd

      +
      + +

      release TIFFRGBAImage decoder state

      +
      + +

      TIFFRGBAImageGet

      +
      + +

      read and decode an image

      +
      + +

      TIFFRGBAImageOK

      +
      + +

      is image readable by TIFFRGBAImageGet

      +
      + +

      TIFFScanlineSize

      +
      + +

      return size of a scanline

      +
      + +

      TIFFSetDirectory

      +
      + +

      set the current directory

      +
      + +

      TIFFSetSubDirectory

      +
      + +

      set the current directory

      +
      + +

      TIFFSetErrorHandler

      +
      + +

      set error handler function

      +
      + +

      TIFFSetField

      +
      + +

      set a tag’s value in the current +directory

      +
      + +

      TIFFSetWarningHandler

      +
      + +

      set warning handler function

      +
      + +

      TIFFStripSize

      +
      + +

      returns size of a strip

      +
      + +

      TIFFRawStripSize

      +
      + +

      returns the number of bytes in a raw +strip

      +
      + +

      TIFFSwabShort

      +
      + +

      swap bytes of short

      +
      + +

      TIFFSwabLong

      +
      + +

      swap bytes of long

      +
      + +

      TIFFSwabArrayOfShort

      +
      + +

      swap bytes of an array of shorts

      +
      + +

      TIFFSwabArrayOfLong

      +
      + +

      swap bytes of an array of longs

      +
      + +

      TIFFTileRowSize

      +
      + +

      return size of a row in a tile

      +
      + +

      TIFFTileSize

      +
      + +

      return size of a tile

      +
      + +

      TIFFUnRegisterCODEC

      +
      + +

      unregisters the codec

      +
      + +

      TIFFVGetField

      +
      + +

      return tag value in current directory

      +
      + +

      TIFFVGetFieldDefaulted

      +
      + +

      return tag value in current directory

      +
      + +

      TIFFVSetField

      +
      + +

      set a tag’s value in the current +directory

      +
      + +

      TIFFVStripSize

      +
      + +

      returns the number of bytes in a strip

      +
      + +

      TIFFWarning

      +
      + +

      library warning handler

      +
      + +

      TIFFWriteDirectory

      +
      + +

      write the current directory

      +
      + +

      TIFFWriteEncodedStrip

      +
      + +

      compress and write a strip of data

      +
      + +

      TIFFWriteEncodedTile

      +
      + +

      compress and write a tile of data

      +
      + +

      TIFFWriteRawStrip

      +
      + +

      write a raw strip of data

      +
      + +

      TIFFWriteRawTile

      +
      + +

      write a raw tile of data

      +
      + +

      TIFFWriteScanline

      +
      + +

      write a scanline of data

      +
      + +

      TIFFWriteTile

      +
      + +

      compress and write a tile of data

      +
      + +

      TIFFXYZToRGB

      +
      + +

      perform CIE XYZ to RGB conversion

      +
      + +

      TIFFYCbCrToRGBInit

      +
      + +

      initialize YCbCr to RGB conversion state

      +
      + +

      TIFFYCbCrtoRGB

      +
      + +

      perform YCbCr to RGB conversion

      +
      + + + + + +
      +

      Auxiliary functions:

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      _TIFFfree

      +
      + +

      free memory buffer

      +
      + +

      _TIFFmalloc

      +
      + +

      dynamically allocate memory buffer

      +
      + +

      _TIFFmemcmp

      +
      + +

      compare contents of the memory buffers

      +
      + +

      _TIFFmemcpy

      +
      + +

      copy contents of the one buffer to +another

      +
      + +

      _TIFFmemset

      +
      + +

      fill memory buffer with a constant byte

      +
      + +

      _TIFFrealloc

      +
      + +

      dynamically reallocate memory buffer

      +
      + +

      TAG USAGE

      + + + + + +
      +

      The table below lists the TIFF tags that +are recognized and handled by the library. If no use is +indicated in the table, then the library reads and writes +the tag, but does not use it internally. Note that some tags +are meaningful only when a particular compression scheme is +being used; e.g. Group3Options is only useful if +Compression is set to CCITT Group 3 +encoding. Tags of this sort are considered +codec-specific tags and the library does not +recognize them except when the Compression tag has +been previously set to the relevant compression +scheme.

      + +
      Tag Name                Value  R/W  Library Use/Notes
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      Artist

      +
      + +

      315

      +
      + +

      R/W

      +
      + +

      BadFaxLines

      +
      + +

      326

      +
      + +

      R/W

      +
      + +

      BitsPerSample

      +
      + +

      258

      +
      + +

      R/W

      +
      + +

      lots

      +
      + +

      CellLength

      +
      + +

      265

      +
      +
      + +

      parsed but ignored

      +
      + +

      CellWidth

      +
      + +

      264

      +
      +
      + +

      parsed but ignored

      +
      + +

      CleanFaxData

      +
      + +

      327

      +
      + +

      R/W

      +
      + +

      ColorMap

      +
      + +

      320

      +
      + +

      R/W

      +
      + +

      ColorResponseUnit

      +
      + +

      300

      +
      +
      + +

      parsed but ignored

      +
      + +

      Compression

      +
      + +

      259

      +
      + +

      R/W

      +
      + +

      choosing codec

      +
      + +

      ConsecutiveBadFaxLines

      +
      + +

      328

      +
      + +

      R/W

      +
      + + + + + +
      +

      Copyright 33432 R/W

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      DataType

      +
      + +

      32996

      +
      + +

      R

      +
      + +

      obsoleted by SampleFormat tag

      +
      + +

      DateTime

      +
      + +

      306

      +
      + +

      R/W

      +
      + +

      DocumentName

      +
      + +

      269

      +
      + +

      R/W

      +
      + +

      DotRange

      +
      + +

      336

      +
      + +

      R/W

      +
      + +

      ExtraSamples

      +
      + +

      338

      +
      + +

      R/W

      +
      + +

      lots

      +
      + +

      FaxRecvParams

      +
      + +

      34908

      +
      + +

      R/W

      +
      + +

      FaxSubAddress

      +
      + +

      34909

      +
      + +

      R/W

      +
      + +

      FaxRecvTime

      +
      + +

      34910

      +
      + +

      R/W

      +
      + +

      FillOrder

      +
      + +

      266

      +
      + +

      R/W

      +
      + +

      control bit order

      +
      + +

      FreeByteCounts

      +
      + +

      289

      +
      +
      + +

      parsed but ignored

      +
      + +

      FreeOffsets

      +
      + +

      288

      +
      +
      + +

      parsed but ignored

      +
      + +

      GrayResponseCurve

      +
      + +

      291

      +
      +
      + +

      parsed but ignored

      +
      + +

      GrayResponseUnit

      +
      + +

      290

      +
      +
      + +

      parsed but ignored

      +
      + +

      Group3Options

      +
      + +

      292

      +
      + +

      R/W

      +
      + +

      used by Group 3 codec

      +
      + +

      Group4Options

      +
      + +

      293

      +
      + +

      R/W

      +
      + +

      HostComputer

      +
      + +

      316

      +
      + +

      R/W

      +
      + +

      ImageDepth

      +
      + +

      32997

      +
      + +

      R/W

      +
      + +

      tile/strip calculations

      +
      + +

      ImageDescription

      +
      + +

      270

      +
      + +

      R/W

      +
      + +

      ImageLength

      +
      + +

      257

      +
      + +

      R/W

      +
      + +

      lots

      +
      + +

      ImageWidth

      +
      + +

      256

      +
      + +

      R/W

      +
      + +

      lots

      +
      + +

      InkNames

      +
      + +

      333

      +
      + +

      R/W

      +
      + +

      InkSet

      +
      + +

      332

      +
      + +

      R/W

      +
      + +

      JPEGTables

      +
      + +

      347

      +
      + +

      R/W

      +
      + +

      used by JPEG codec

      +
      + +

      Make

      +
      + +

      271

      +
      + +

      R/W

      +
      + +

      Matteing

      +
      + +

      32995

      +
      + +

      R

      +
      + +

      obsoleted by ExtraSamples tag

      +
      + +

      MaxSampleValue

      +
      + +

      281

      +
      + +

      R/W

      +
      + +

      MinSampleValue

      +
      + +

      280

      +
      + +

      R/W

      +
      + +

      Model

      +
      + +

      272

      +
      + +

      R/W

      +
      + +

      NewSubFileType

      +
      + +

      254

      +
      + +

      R/W

      +
      + +

      called SubFileType in spec

      +
      + +

      NumberOfInks

      +
      + +

      334

      +
      + +

      R/W

      +
      + +

      Orientation

      +
      + +

      274

      +
      + +

      R/W

      +
      + +

      PageName

      +
      + +

      285

      +
      + +

      R/W

      +
      + +

      PageNumber

      +
      + +

      297

      +
      + +

      R/W

      +
      + +

      PhotometricInterpretation

      +
      + +

      262

      +
      + +

      R/Wused by Group 3 and JPEG codecs

      +
      + +

      PlanarConfiguration

      +
      + +

      284

      +
      + +

      R/W

      +
      + +

      data i/o

      +
      + +

      Predictor

      +
      + +

      317

      +
      + +

      R/W

      +
      + +

      used by LZW and Deflate codecs

      +
      + +

      PrimaryChromacities

      +
      + +

      319

      +
      + +

      R/W

      +
      + +

      ReferenceBlackWhite

      +
      + +

      532

      +
      + +

      R/W

      +
      + +

      ResolutionUnit

      +
      + +

      296

      +
      + +

      R/W

      +
      + +

      used by Group 3 codec

      +
      + +

      RowsPerStrip

      +
      + +

      278

      +
      + +

      R/W

      +
      + +

      data i/o

      +
      + +

      SampleFormat

      +
      + +

      339

      +
      + +

      R/W

      +
      + +

      SamplesPerPixel

      +
      + +

      277

      +
      + +

      R/W

      +
      + +

      lots

      +
      + +

      SMinSampleValue

      +
      + +

      340

      +
      + +

      R/W

      +
      + +

      SMaxSampleValue

      +
      + +

      341

      +
      + +

      R/W

      +
      + +

      Software

      +
      + +

      305

      +
      + +

      R/W

      +
      + +

      StoNits

      +
      + +

      37439

      +
      + +

      R/W

      +
      + +

      StripByteCounts

      +
      + +

      279

      +
      + +

      R/W

      +
      + +

      data i/o

      +
      + +

      StripOffsets

      +
      + +

      273

      +
      + +

      R/W

      +
      + +

      data i/o

      +
      + +

      SubFileType

      +
      + +

      255

      +
      + +

      R/W

      +
      + +

      called OSubFileType in spec

      +
      + +

      TargetPrinter

      +
      + +

      337

      +
      + +

      R/W

      +
      + +

      Thresholding

      +
      + +

      263

      +
      + +

      R/W

      +
      +
      + +

      TileByteCounts

      +
      + +

      324

      +
      + +

      R/W

      +
      + +

      data i/o

      +
      + +

      TileDepth

      +
      + +

      32998

      +
      + +

      R/W

      +
      + +

      tile/strip calculations

      +
      + +

      TileLength

      +
      + +

      323

      +
      + +

      R/W

      +
      + +

      data i/o

      +
      + +

      TileOffsets

      +
      + +

      324

      +
      + +

      R/W

      +
      + +

      data i/o

      +
      + +

      TileWidth

      +
      + +

      322

      +
      + +

      R/W

      +
      + +

      data i/o

      +
      + +

      TransferFunction

      +
      + +

      301

      +
      + +

      R/W

      +
      + +

      WhitePoint

      +
      + +

      318

      +
      + +

      R/W

      +
      + +

      XPosition

      +
      + +

      286

      +
      + +

      R/W

      +
      + +

      XResolution

      +
      + +

      282

      +
      + +

      R/W

      +
      + +

      YCbCrCoefficients

      +
      + +

      529

      +
      + +

      R/W

      +
      + +

      used by TIFFRGBAImage support

      +
      + +

      YCbCrPositioning

      +
      + +

      531

      +
      + +

      R/W

      +
      + +

      tile/strip size calulcations

      +
      + +

      YCbCrSubsampling

      +
      + +

      530

      +
      + +

      R/W

      +
      + +

      YPosition

      +
      + +

      286

      +
      + +

      R/W

      +
      + +

      YResolution

      +
      + +

      283

      +
      + +

      R/W

      +
      + +

      used by Group 3 codec

      +
      + +

      PSEUDO TAGS

      + + + + + +
      +

      In addition to the normal TIFF tags the +library supports a collection of tags whose values lie in a +range outside the valid range of TIFF tags. These +tags are termed pseud-tags and are used to control +various codec-specific functions within the library. The +table below summarizes the defined pseudo-tags.

      + +
      Tag Name                Codec  R/W  Library Use/Notes
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      TIFFTAG_FAXMODE

      +
      + +

      G3

      +
      + +

      R/W

      +
      + +

      general codec operation

      +
      + +

      TIFFTAG_FAXFILLFUNC

      +
      + +

      G3/G4

      +
      + +

      R/W

      +
      + +

      bitmap fill function

      +
      + +

      TIFFTAG_JPEGQUALITY

      +
      + +

      JPEG

      +
      + +

      R/W

      +
      + +

      compression quality control

      +
      + +

      TIFFTAG_JPEGCOLORMODE

      +
      + +

      JPEG

      +
      + +

      R/W

      +
      + +

      control colorspace conversions

      +
      + +

      TIFFTAG_JPEGTABLESMODE

      +
      + +

      JPEG

      +
      + +

      R/W

      +
      + +

      control contents of JPEGTables tag

      +
      + +

      TIFFTAG_ZIPQUALITY

      +
      + +

      Deflate

      +
      + +

      R/Wcompression quality level

      +
      + +

      TIFFTAG_PIXARLOGDATAFMT

      +
      + +

      PixarLog

      +
      + +

      R/Wuser data format

      +
      + +

      TIFFTAG_PIXARLOGQUALITY

      +
      + +

      PixarLog

      +
      + +

      R/Wcompression quality level

      +
      + +

      TIFFTAG_SGILOGDATAFMT

      +
      + +

      SGILog

      +
      + +

      R/W

      +
      + +

      user data format

      +
      + + + + + +
      +

      TIFFTAG_FAXMODE

      + + + + + +
      +

      Control the operation of the Group 3 codec. Possible +values (independent bits that can be combined by +or’ing them together) are: FAXMODE_CLASSIC (enable +old-style format in which the RTC is written at +the end of the last strip), FAXMODE_NORTC (opposite of +FAXMODE_CLASSIC; also called FAXMODE_CLASSF), FAXMODE_NOEOL +(do not write EOL codes at the start of each row +of data), FAXMODE_BYTEALIGN (align each encoded row to an +8-bit boundary), FAXMODE_WORDALIGN (align each encoded row +to an 16-bit boundary), The default value is dependent on +the compression scheme; this pseudo-tag is used by the +various G3 and G4 codecs to share code.

      +
      + + + + + +
      +

      TIFFTAG_FAXFILLFUNC

      + + + + + +
      +

      Control the function used to convert arrays of black +and white runs to packed bit arrays. This hook can be used +to image decoded scanlines in multi-bit depth rasters (e.g. +for display in colormap mode) or for other purposes. The +default value is a pointer to a builtin function that images +packed bilevel data.

      +
      + + + + + +
      +

      TIFFTAG_IPTCNEWSPHOTO

      + + + + + +
      +

      Tag contaings image metadata per the IPTC newsphoto +spec: Headline, captioning, credit, etc... Used by most wire +services.

      +
      + + + + + +
      +

      TIFFTAG_PHOTOSHOP

      + + + + + +
      +

      Tag contains Photoshop captioning information and +metadata. Photoshop uses in parallel and redundantly +alongside IPTCNEWSPHOTO information.

      +
      + + + + + +
      +

      TIFFTAG_JPEGQUALITY

      + + + + + +
      +

      Control the compression quality level used in the +baseline algorithm. Note that quality levels are in the +range 0-100 with a default value of 75.

      +
      + + + + + +
      +

      TIFFTAG_JPEGCOLORMODE

      + + + + + +
      +

      Control whether or not conversion is done between +RGB and YCbCr colorspaces. Possible values are: +JPEGCOLORMODE_RAW (do not convert), and JPEGCOLORMODE_RGB +(convert to/from RGB) The default value is +JPEGCOLORMODE_RAW.

      +
      + + + + + +
      +

      TIFFTAG_JPEGTABLESMODE

      + + + + + +
      +

      Control the information written in the +JPEGTables tag. Possible values (independent bits +that can be combined by or’ing them together) are: +JPEGTABLESMODE_QUANT (include quantization tables), and +JPEGTABLESMODE_HUFF (include Huffman encoding tables). The +default value is +JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF.

      +
      + + + + + +
      +

      TIFFTAG_ZIPQUALITY

      + + + + + +
      +

      Control the compression technique used by the +Deflate codec. Quality levels are in the range 1-9 with +larger numbers yielding better compression at the cost of +more computation. The default quality level is 6 which +yields a good time-space tradeoff.

      +
      + + + + + +
      +

      TIFFTAG_PIXARLOGDATAFMT

      + + + + + +
      +

      Control the format of user data passed in to +the PixarLog codec when encoding and passed out from +when decoding. Possible values are: PIXARLOGDATAFMT_8BIT for +8-bit unsigned pixels, PIXARLOGDATAFMT_8BITABGR for 8-bit +unsigned ABGR-ordered pixels, PIXARLOGDATAFMT_11BITLOG for +11-bit log-encoded raw data, PIXARLOGDATAFMT_12BITPICIO for +12-bit PICIO-compatible data, PIXARLOGDATAFMT_16BIT for +16-bit signed samples, and PIXARLOGDATAFMT_FLOAT for 32-bit +IEEE floating point samples.

      +
      + + + + + +
      +

      TIFFTAG_PIXARLOGQUALITY

      + + + + + +
      +

      Control the compression technique used by the +PixarLog codec. This value is treated identically to +TIFFTAG_ZIPQUALITY; see the above description.

      +
      + + + + + +
      +

      TIFFTAG_SGILOGDATAFMT

      + + + + + +
      +

      Control the format of client data passed in +to the SGILog codec when encoding and passed out from +when decoding. Possible values are: SGILOGDATAFMT_FLTXYZ for +converting between LogLuv and 32-bit IEEE floating valued +XYZ pixels, SGILOGDATAFMT_16BITLUV for 16-bit encoded Luv +pixels, SGILOGDATAFMT_32BITRAW and SGILOGDATAFMT_24BITRAW +for no conversion of data, SGILOGDATAFMT_8BITRGB for +returning 8-bit RGB data (valid only when decoding +LogLuv-encoded data), SGILOGDATAFMT_FLTY for converting +between LogL and 32-bit IEEE floating valued Y pixels, +SGILOGDATAFMT_16BITL for 16-bit encoded L pixels, and +SGILOGDATAFMT_8BITGRY for returning 8-bit greyscale data +(valid only when decoding LogL-encoded data).

      +
      + +

      DIAGNOSTICS

      + + + + + +
      +

      All error messages are directed through the +TIFFError routine. By default messages are directed +to stderr in the form: module: message\n. +Warning messages are likewise directed through the +TIFFWarning routine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      fax2tiff(1), gif2tiff(1), +pal2rgb(1), ppm2tiff(1), rgb2ycbcr(1), +ras2tiff(1), raw2tiff(1), sgi2tiff(1), +tiff2bw(1), tiffdither(1), tiffdump(1), +tiffcp(1), tiffcmp(1), tiffgt(1), +tiffinfo(1), tiffmedian(1), +tiffsplit(1), tiffsv(1).

      + +

      Tag Image File Format Specification — +Revision 6.0, an Aldus Technical Memorandum.

      + +

      The Spirit of TIFF Class F, an appendix to +the TIFF 5.0 specification prepared by Cygnet +Technologies.

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      + +

      BUGS

      + + + + + +
      +

      The library does not support multi-sample images +where some samples have different bits/sample.

      + +

      The library does not support random access to +compressed data that is organized with more than one row per +tile or strip.

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/pal2rgb.1.html b/src/3rdparty/libtiff/html/man/pal2rgb.1.html new file mode 100644 index 0000000000..5c3a679a95 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/pal2rgb.1.html @@ -0,0 +1,189 @@ + + + + + + +PAL2RGB + + + +

      PAL2RGB

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      pal2rgb − convert a palette color +TIFF image to a full color image

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      pal2rgb [ options ] input.tif +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Pal2rgb converts a palette color +TIFF image to a full color image by applying +the colormap of the palette image to each sample to generate +a full color RGB image.

      +
      + +

      OPTIONS

      + + + + + +
      +

      Options that affect the interpretation of input data +are:

      +
      + + + + + + + + +
      + +

      −C

      +
      + +

      This option overrides the default behavior of +pal2rgb in determining whether or not colormap +entries contain 16-bit or 8-bit values. By default the +colormap is inspected and if no colormap entry greater than +255 is found, the colormap is assumed to have only 8-bit +values; otherwise 16-bit values (as required by the +TIFF specification) are assumed. The +−C option can be used to explicitly specify the +number of bits for colormap entries: −C 8 for +8-bit values, −C 16 for 16-bit values.

      +
      +
      + + + + + +
      +

      Options that affect the output file format are:

      +
      + + + + + + + + + + + + + + + + + + + + +
      + +

      −p

      +
      + +

      Explicitly select the planar configuration used in +organizing data samples in the output image: −p +contig for samples packed contiguously, and −p +separate for samples stored separately. By default +samples are packed.

      +
      +
      + +

      −c

      +
      + +

      Use the specific compression algorithm to encoded image +data in the output file: −c packbits for +Macintosh Packbits, −c lzw for Lempel-Ziv & +Welch, −c zip for Deflate, −c none +for no compression. If no compression-related option is +specified, the input file’s compression algorithm is +used.

      +
      +
      + +

      −r

      +
      + +

      Explicitly specify the number of rows in each strip of +the output file. If the −r option is not +specified, a number is selected such that each output strip +has approximately 8 kilobytes of data in it.

      +
      +
      + +

      BUGS

      + + + + + +
      +

      Only 8-bit images are handled.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiffinfo(1), tiffcp(1), +tiffmedian(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/ppm2tiff.1.html b/src/3rdparty/libtiff/html/man/ppm2tiff.1.html new file mode 100644 index 0000000000..60e56e1ff5 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/ppm2tiff.1.html @@ -0,0 +1,141 @@ + + + + + + +PPM2TIFF + + + +

      PPM2TIFF

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      ppm2tiff − create a TIFF file from +PPM, PGM and PBM image +files

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      ppm2tiff [ options ] [ input.ppm ] +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      ppm2tiff converts a file in the PPM, +PGM and PBM image formats to +TIFF. By default, the TIFF +image is created with data samples packed +(PlanarConfiguration=1), compressed with the Packbits +algorithm (Compression=32773), and with each strip no +more than 8 kilobytes. These characteristics can be +overridden, or explicitly specified with the options +described below

      + +

      If the PPM file contains greyscale data, +then the PhotometricInterpretation tag is set to 1 +(min-is-black), otherwise it is set to 2 (RGB).

      + +

      If no PPM file is specified on the command +line, ppm2tiff will read from the standard input.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Specify a compression scheme to use when writing image +data: none for no compression, packbits for +PackBits compression (will be used by default), lzw +for Lempel-Ziv & Welch compression, jpeg for +baseline JPEG compression, zip for Deflate +compression, g3 for CCITT Group 3 (T.4) compression, +and g4 for CCITT Group 4 (T.6) compression.

      +
      +
      + +

      −r

      +
      + +

      Write data with a specified number of rows per strip; by +default the number of rows/strip is selected so that each +strip is approximately 8 kilobytes.

      +
      +
      + +

      −R

      +
      + +

      Mark the resultant image to have the specified X and Y +resolution (in dots/inch).

      +
      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiffinfo(1), tiffcp(1), +tiffmedian(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/ras2tiff.1.html b/src/3rdparty/libtiff/html/man/ras2tiff.1.html new file mode 100644 index 0000000000..b0b8993288 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/ras2tiff.1.html @@ -0,0 +1,139 @@ + + + + + + +RAS2TIFF + + + +

      RAS2TIFF

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      ras2tiff − create a TIFF file from a +Sun rasterfile

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      ras2tiff [ options ] input.ras +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      ras2tiff converts a file in the Sun rasterfile +format to TIFF. By default, the +TIFF image is created with data samples +packed (PlanarConfiguration=1), compressed with the +Lempel-Ziv & Welch algorithm (Compression=5), and +with each strip no more than 8 kilobytes. These +characteristics can overridden, or explicitly specified with +the options described below.

      + +

      Any colormap information in the rasterfile is carried +over to the TIFF file by including a +Colormap tag in the output file. If the rasterfile +has a colormap, the PhotometricInterpretation tag is +set to 3 (palette); otherwise it is set to 2 (RGB) if the +depth is 24 or 1 (min-is-black) if the depth is not 24.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Specify a compression scheme to use when writing image +data: −c none for no compression, −c +packbits for the PackBits compression algorithm, +−c jpeg for the baseline JPEG compression +algorithm, −c zip for the Deflate compression +algorithm, and −c lzw for Lempel-Ziv & +Welch (the default).

      +
      +
      + +

      −r

      +
      + +

      Write data with a specified number of rows per strip; by +default the number of rows/strip is selected so that each +strip is approximately 8 kilobytes.

      +
      +
      + +

      BUGS

      + + + + + +
      +

      Does not handle all possible rasterfiles. In particular, +ras2tiff does not handle run-length encoded +images.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffinfo(1), tiffcp(1), +tiffmedian(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/raw2tiff.1.html b/src/3rdparty/libtiff/html/man/raw2tiff.1.html new file mode 100644 index 0000000000..360eb27718 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/raw2tiff.1.html @@ -0,0 +1,510 @@ + + + + + + +RAW2TIFF + + + +

      RAW2TIFF

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +GUESSING THE IMAGE GEOMETRY
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      raw2tiff − create a TIFF file from a +raw data

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      raw2tiff [ options ] input.raw +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      raw2tiff converts a raw byte sequence into +TIFF. By default, the TIFF +image is created with data samples packed +(PlanarConfiguration=1), compressed with the PackBits +algorithm (Compression=32773), and with each strip no +more than 8 kilobytes. These characteristics can overridden, +or explicitly specified with the options described +below.

      +
      + +

      OPTIONS

      + + + + + +
      +

      −H number

      + + + + + +
      +

      size of input image file header in bytes (0 by default). +This amount of data just will be skipped from the start of +file while reading.

      +
      + + + + + +
      +

      −w number

      + + + + + +
      +

      width of input image in pixels (can be guessed, see +GUESSING THE IMAGE GEOMETRY +below).

      +
      + + + + + +
      +

      −l number

      + + + + + +
      +

      length of input image in lines (can be guessed, see +GUESSING THE IMAGE GEOMETRY +below).

      +
      + + + + + +
      +

      −b number

      + + + + + +
      +

      number of bands in input image (1 by default).

      +
      + + + + + +
      +

      −d data_type

      + + + + + +
      +

      type of samples in input image, where data_type +may be:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      byte

      +
      + +

      8-bit unsigned integer (default),

      +
      + +

      short

      +
      + +

      16-bit unsigned integer,

      +
      + +

      long

      +
      + +

      32-bit unsigned integer,

      +
      + +

      sbyte

      +
      + +

      8-bit signed integer,

      +
      + +

      sshort

      +
      + +

      16-bit signed integer,

      +
      + +

      slong

      +
      + +

      32-bit signed integer,

      +
      + +

      float

      +
      + +

      32-bit IEEE floating point,

      +
      + +

      double

      +
      + +

      64-bit IEEE floating point.

      +
      + + + + + +
      +

      −i config

      + + + + + +
      +

      type of samples interleaving in input image, where +config may be:

      + + + + + + + + + + +
      + +

      pixel

      +
      + +

      pixel interleaved data (default),

      +
      + +

      band

      +
      + +

      band interleaved data.

      +
      + + + + + +
      +

      −p photo

      + + + + + +
      +

      photometric interpretation (color space) of the input +image, where photo may be:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      miniswhite

      +
      + +

      white color represented with 0 value,

      +
      + +

      minisblack

      +
      + +

      black color represented with 0 value (default),

      +
      + +

      rgb

      +
      + +

      image has RGB color model,

      +
      + +

      cmyk

      +
      + +

      image has CMYK (separated) color model,

      +
      + +

      ycbcr

      +
      + +

      image has YCbCr color model,

      +
      + +

      cielab

      +
      + +

      image has CIE L*a*b color model,

      +
      + +

      icclab

      +
      + +

      image has ICC L*a*b color model,

      +
      + +

      itulab

      +
      + +

      image has ITU L*a*b color model.

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −s

      +
      + +

      swap bytes fetched from the input file.

      +
      +
      + +

      −L

      +
      + +

      input data has LSB2MSB bit order (default).

      +
      +
      + +

      −M

      +
      + +

      input data has MSB2LSB bit order.

      +
      +
      + +

      −c

      +
      + +

      Specify a compression scheme to use when writing image +data: −c none for no compression, −c +packbits for the PackBits compression algorithm (the +default), −c jpeg for the baseline JPEG +compression algorithm, −c zip for the Deflate +compression algorithm, and −c lzw for +Lempel-Ziv & Welch.

      +
      +
      + + + + + +
      +

      −r number

      + + + + + +
      +

      Write data with a specified number of rows per strip; by +default the number of rows/strip is selected so that each +strip is approximately 8 kilobytes.

      +
      + +

      GUESSING THE IMAGE GEOMETRY

      + + + + + +
      +

      raw2tiff can guess image width and height in case +one or both of these parameters are not specified. If you +omit one of those parameters, the complementary one will be +calculated based on the file size (taking into account +header size, number of bands and data type). If you omit +both parameters, the statistical approach will be used. +Utility will compute correlation coefficient between two +lines at the image center using several appropriate line +sizes and the highest absolute value of the coefficient will +indicate the right line size. That is why you should be +cautious with the very large images, because guessing +process may take a while (depending on your system +performance). Of course, the utility can’t guess the +header size, number of bands and data type, so it should be +specified manually. If you don’t know anything about +your image, just try with the several combinations of those +options.

      + +

      There is no magic, it is just a mathematical statistics, +so it can be wrong in some cases. But for most ordinary +images guessing method will work fine.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffcp(1), +tiffmedian(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/rgb2ycbcr.1.html b/src/3rdparty/libtiff/html/man/rgb2ycbcr.1.html new file mode 100644 index 0000000000..5cff15fb53 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/rgb2ycbcr.1.html @@ -0,0 +1,155 @@ + + + + + + +RGB2YCBCR + + + +

      RGB2YCBCR

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      rgb2ycbcr − convert non-YCbCr TIFF +images to a YCbCr TIFF image

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      rgb2ycbcr [ options ] src1.tif src2.tif +... dst.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      rgb2ycbcr converts RGB color, +greyscale, or bi-level TIFF images to YCbCr +images by transforming and sampling pixel data. If multiple +files are specified on the command line each source file is +converted to a separate directory in the destination +file.

      + +

      By default, chrominance samples are created by sampling 2 +by 2 blocks of luminance values; this can be changed with +the −h and −v options. Output data +are compressed with the PackBits compression +scheme, by default; an alternate scheme can be selected with +the −c option. By default, output data are +compressed in strips with the number of rows in each strip +selected so that the size of a strip is never more than 8 +kilobytes; the −r option can be used to +explicitly set the number of rows per strip.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Specify a compression scheme to use when writing image +data: −c none for no compression, −c +packbits for the PackBits compression algorithm (the +default), −c jpeg for the JPEG compression +algorithm, −c zip for the deflate compression +algorithm, and −c lzw for Lempel-Ziv & +Welch.

      +
      +
      + +

      −h

      +
      + +

      Set the horizontal sampling dimension to one of: 1, 2 +(default), or 4.

      +
      +
      + +

      −r

      +
      + +

      Write data with a specified number of rows per strip; by +default the number of rows/strip is selected so that each +strip is approximately 8 kilobytes.

      +
      +
      + +

      −v

      +
      + +

      Set the vertical sampling dimension to one of: 1, 2 +(default), or 4.

      +
      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiffinfo(1), tiffcp(1), +libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/sgi2tiff.1.html b/src/3rdparty/libtiff/html/man/sgi2tiff.1.html new file mode 100644 index 0000000000..fe90d6477f --- /dev/null +++ b/src/3rdparty/libtiff/html/man/sgi2tiff.1.html @@ -0,0 +1,147 @@ + + + + + + +SGI2TIFF + + + +

      SGI2TIFF

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      sgi2tiff − create a TIFF file from +an SGI image file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      sgi2tiff [ options ] input.rgb +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      sgi2tiff converts a file in the SGI +image format to TIFF. By default, the +TIFF image is created with data samples +packed (PlanarConfiguration=1), compressed with the +Lempel-Ziv & Welch algorithm (Compression=5), and +with each strip no more than 8 kilobytes. These +characteristics can overridden, or explicitly specified with +the options described below.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Specify a compression scheme to use when writing image +data: −c none for no compression, −c +packbits for the PackBits compression algorithm), +−c jpeg for the baseline JPEG compression +algorithm, −c zip for the Deflate compression +algorithm, and −c lzw for Lempel-Ziv & +Welch (the default).

      +
      +
      + +

      −p

      +
      + +

      Explicitly select the planar configuration used in +organizing data samples in the output image: −p +contig for samples packed contiguously, and −p +separate for samples stored separately. By default +samples are packed.

      +
      +
      + +

      −r

      +
      + +

      Write data with a specified number of rows per strip; by +default the number of rows/strip is selected so that each +strip is approximately 8 kilobytes.

      +
      +
      + +

      BUGS

      + + + + + +
      +

      Does not record colormap information.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiffinfo(1), tiffcp(1), +tiffmedian(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/thumbnail.1.html b/src/3rdparty/libtiff/html/man/thumbnail.1.html new file mode 100644 index 0000000000..fabc60116e --- /dev/null +++ b/src/3rdparty/libtiff/html/man/thumbnail.1.html @@ -0,0 +1,148 @@ + + + + + + +THUMBNAIL + + + +

      THUMBNAIL

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      thumbnail − create a TIFF file with +thumbnail images

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      thumbnail [ options ] input.tif +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      thumbnail is a program written to show how one +might use the SubIFD tag (#330) to store thumbnail images. +thumbnail copies a TIFF Class F +facsimile file to the output file and for each image an +8-bit greyscale thumbnail sketch. The output file +contains the thumbnail image with the associated +full-resolution page linked below with the SubIFD tag.

      + +

      By default, thumbnail images are 216 pixels wide by 274 +pixels high. Pixels are calculated by sampling and filtering +the input image with each pixel value passed through a +contrast curve.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + +
      + +

      −w

      +
      + +

      Specify the width of thumbnail images in pixels.

      +
      +
      + +

      −h

      +
      + +

      Specify the height of thumbnail images in pixels.

      +
      +
      + +

      −c

      +
      + +

      Specify a contrast curve to apply in generating the +thumbnail images. By default pixels values are passed +through a linear contrast curve that simply maps the pixel +value ranges. Alternative curves are: exp50 for a 50% +exponential curve, exp60 for a 60% exponential curve, +exp70 for a 70% exponential curve, exp80 for a +80% exponential curve, exp90 for a 90% exponential +curve, exp for a pure exponential curve, +linear for a linear curve.

      +
      +
      + +

      BUGS

      + + + + + +
      +

      There are no options to control the format of the saved +thumbnail images.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiffdump(1), tiffgt(1), tiffinfo(1), +libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiff2bw.1.html b/src/3rdparty/libtiff/html/man/tiff2bw.1.html new file mode 100644 index 0000000000..6b6accfc1d --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiff2bw.1.html @@ -0,0 +1,161 @@ + + + + + + +TIFF2BW + + + +

      TIFF2BW

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiff2bw − convert a color TIFF image +to greyscale

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiff2bw [ options ] input.tif +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Tiff2bw converts an RGB or Palette +color TIFF image to a greyscale image by +combining percentages of the red, green, and blue channels. +By default, output samples are created by taking 28% of the +red channel, 59% of the green channel, and 11% of the blue +channel. To alter these percentages, the −R, +−G, and −B options may be +used.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Specify a compression scheme to use when writing image +data: −c none for no compression, −c +packbits for the PackBits compression algorithm, +−c zip for the Deflate compression algorithm, +−c g3 for the CCITT Group 3 compression +algorithm, −c g4 for the CCITT Group 4 +compression algorithm, and −c lzw for +Lempel-Ziv & Welch (the default).

      +
      +
      + +

      −r

      +
      + +

      Write data with a specified number of rows per strip; by +default the number of rows/strip is selected so that each +strip is approximately 8 kilobytes.

      +
      +
      + +

      −R

      +
      + +

      Specify the percentage of the red channel to use +(default 28).

      +
      +
      + +

      −G

      +
      + +

      Specify the percentage of the green channel to use +(default 59).

      +
      +
      + +

      −B

      +
      + +

      Specify the percentage of the blue channel to use +(default 11).

      +
      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffinfo(1), tiffcp(1), +tiffmedian(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiff2pdf.1.html b/src/3rdparty/libtiff/html/man/tiff2pdf.1.html new file mode 100644 index 0000000000..80e0d557ae --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiff2pdf.1.html @@ -0,0 +1,609 @@ + + + + + + +TIFF2PDF + + + +

      TIFF2PDF

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +EXAMPLES
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiff2pdf − convert a TIFF image to a PDF +document

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiff2pdf [ options ] input.tiff

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiff2pdf opens a TIFF image and writes a PDF +document to standard output.

      + +

      The program converts one TIFF file to one PDF file, +including multiple page TIFF files, tiled TIFF files, black +and white. grayscale, and color TIFF files that contain data +of TIFF photometric interpretations of bilevel, grayscale, +RGB, YCbCr, CMYK separation, and ICC L*a*b* as supported by +libtiff and PDF.

      + +

      If you have multiple TIFF files to convert into one PDF +file then use tiffcp or other program to concatenate +the files into a multiple page TIFF file. If the input TIFF +file is of huge dimensions (greater than 10000 pixels height +or width) convert the input image to a tiled TIFF if it is +not already.

      + +

      The standard output is standard output. Set the output +file name with the −o output.pdf +option.

      + +

      All black and white files are compressed into a single +strip CCITT G4 Fax compressed PDF, unless tiled, where tiled +black and white images are compressed into tiled CCITT G4 +Fax compressed PDF, libtiff CCITT support is +assumed.

      + +

      Color and grayscale data can be compressed using either +JPEG compression, ITU-T T.81, or Zip/Deflate LZ77 +compression. Set the compression type using the +−j or −z options. JPEG compression +support requires that libtiff be configured with JPEG +support, and Zip/Deflate compression support requires that +libtiff be configured with Zip support, in +tiffconf.h. Use only one or the other of −j and +−z.

      + +

      If the input TIFF contains single strip CCITT G4 Fax +compressed information, then that is written to the PDF file +without transcoding, unless the options of no compression +and no passthrough are set, −d and +−n.

      + +

      If the input TIFF contains JPEG or single strip +Zip/Deflate compressed information, and they are configured, +then that is written to the PDF file without transcoding, +unless the options of no compression and no passthrough are +set.

      + +

      The default page size upon which the TIFF image is placed +is determined by the resolution and extent of the image +data. Default values for the TIFF image resolution can be +set using the −x and −y options. +The page size can be set using the −p option +for paper size, or −w and −l for +paper width and length, then each page of the TIFF image is +centered on its page. The distance unit for default +resolution and page width and length can be set by the +−u option, the default unit is inch.

      + +

      Various items of the output document information can be +set with the −e, −c, +−a, −t, −s, and +−k options. Setting the argument of the option +to "" for these tags causes the relevant document +information field to be not written. Some of the document +information values otherwise get their information from the +input TIFF image, the software, author, document name, and +image description.

      + +

      The Portable Document Format (PDF) specification is +copyrighted by Adobe Systems, Incorporated.

      +
      + +

      OPTIONS

      + + + + + +
      +

      −o output-file

      + + + + + +
      +

      Set the output to go to file. output-file

      +
      + + + + + + + + + + + + +
      + +

      −j

      +
      + +

      Compress with JPEG (requires libjpeg configured +with libtiff).

      +
      + +

      −z

      +
      + +

      Compress with Zip/Deflate (requires zlib +configured with libtiff).

      +
      + + + + + +
      +

      −q quality

      + + + + + +
      +

      Set the compression quality, 1-100 for JPEG.

      +
      + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −n

      +
      + +

      Do not allow data to be converted without uncompressing, +no compressed data passthrough.

      +
      + +

      −b

      +
      + +

      Set PDF ‘‘Interpolate’’ user +preference.

      +
      + +

      −d

      +
      + +

      Do not compress (decompress).

      +
      + +

      −i

      +
      + +

      Invert colors.

      +
      + + + + + +
      +

      −p paper-size

      + + + + + +
      +

      Set paper size, e.g., letter, legal, +A4.

      +
      + + + + + +
      +

      −u [i|m]

      + + + + + +
      +

      Set distance unit, i for inch, m for +centimeter.

      +
      + + + + + +
      +

      −w width

      + + + + + +
      +

      Set width in units.

      +
      + + + + + +
      +

      −l length

      + + + + + +
      +

      Set length in units.

      +
      + + + + + +
      +

      −x xres

      + + + + + +
      +

      Set x/width resolution default.

      +
      + + + + + +
      +

      −y yres

      + + + + + +
      +

      Set y/length resolution default.

      +
      + + + + + +
      +

      −r [d|o]

      + + + + + +
      +

      Set d for resolution default for images without +resolution, o for resolution override for all +images.

      +
      + + + + + + + + +
      + +

      −f

      +
      + +

      Set PDF ‘‘Fit Window’’ user +preference.

      +
      +
      + + + + + +
      +

      −e YYYYMMDDHHMMSS

      + + + + + +
      +

      Set document information date, overrides image or current +date/time default, YYYYMMDDHHMMSS.

      +
      + + + + + +
      +

      −c creator

      + + + + + +
      +

      Set document information creator, overrides image +software default.

      +
      + + + + + +
      +

      −a author

      + + + + + +
      +

      Set document information author, overrides image artist +default.

      +
      + + + + + +
      +

      −t title

      + + + + + +
      +

      Set document information title, overrides image document +name default.

      +
      + + + + + +
      +

      −s subject

      + + + + + +
      +

      Set document information subject, overrides image image +description default.

      +
      + + + + + +
      +

      −k keywords

      + + + + + +
      +

      Set document information keywords.

      +
      + + + + + + + + +
      + +

      −h

      +
      + +

      List usage reminder to stderr and exit.

      +
      +
      + +

      EXAMPLES

      + + + + + +
      +

      The following example would generate the file output.pdf +from input.tiff.

      + + + + + +
      +
      tiff2pdf −o output.pdf input.tiff
      +
      +
      + + + + + + +
      +

      The following example would generate PDF output from +input.tiff and write it to standard output.

      + + + + + +
      +
      tiff2pdf input.tiff
      +
      +
      + + + + + + +
      +

      The following example would generate the file output.pdf +from input.tiff, putting the image pages on a letter sized +page, compressing the output with JPEG, with JPEG quality +75, setting the title to +‘‘Document’’, and setting the +‘‘Fit Window’’ option.

      + + + + + +
      +
      tiff2pdf −p letter −j −q 75 −t "Document" −f −o output.pdf input.tiff
      +
      +
      + +

      BUGS

      + + + + + + +
      +

      Please report bugs via the web interface at

      +
      + + + + + +
      + +

      http://bugzilla.remotesensing.org/enter_bug.cgi?product=libtiff

      +
      + +

      SEE ALSO

      + + + + + +
      +

      libtiff(3), tiffcp(1), +tiff2ps(1)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiff2ps.1.html b/src/3rdparty/libtiff/html/man/tiff2ps.1.html new file mode 100644 index 0000000000..e13bb8f893 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiff2ps.1.html @@ -0,0 +1,532 @@ + + + + + + +TIFF2PS + + + +

      TIFF2PS

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +EXAMPLES
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiff2ps − convert a TIFF image to +PostScript™

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiff2ps [ options ] input.tif +...

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiff2ps reads TIFF images and +writes PostScript or Encapsulated PostScript (EPS) on the +standard output. By default, tiff2ps writes +Encapsulated PostScript for the first image in the specified +TIFF image file.

      + +

      By default, tiff2ps will generate PostScript that +fills a printed area specified by the TIFF +tags in the input file. If the file does not contain +XResolution or YResolution tags, then the +printed area is set according to the image dimensions. The +−w and −h options (see below) can +be used to set the dimensions of the printed area in inches; +overriding any relevant TIFF tags.

      + +

      The PostScript generated for RGB, palette, +and CMYK images uses the colorimage +operator. The PostScript generated for greyscale and bilevel +images uses the image operator. When the +colorimage operator is used, PostScript code to +emulate this operator on older PostScript printers is also +generated. Note that this emulation code can be very +slow.

      + +

      Color images with associated alpha data are composited +over a white background.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −1

      +
      + +

      Generate PostScript Level 1 (the default).

      +
      +
      + +

      −2

      +
      + +

      Generate PostScript Level 2.

      +
      +
      + +

      −3

      +
      + +

      Generate PostScript Level 3. It basically allows one to +use the /flateDecode filter for ZIP compressed TIFF +images.

      +
      +
      + +

      −a

      +
      + +

      Generate output for all IFDs (pages) in the input +file.

      +
      +
      + +

      −b

      +
      + +

      Specify the bottom margin for the output (in inches). +This does not affect the height of the printed image.

      +
      +
      + +

      −c

      +
      + +

      Center the image in the output. This option only shows +an effect if both the −w and the +−h option are given.

      +
      +
      + +

      −d

      +
      + +

      Set the initial TIFF directory to the +specified directory number. (NB: Directories are numbered +starting at zero.) This option is useful for selecting +individual pages in a multi-page (e.g. facsimile) file.

      +
      +
      + +

      −e

      +
      + +

      Force the generation of Encapsulated PostScript (implies +−z).

      +
      +
      + +

      −h

      +
      + +

      Specify the vertical size of the printed area (in +inches).

      +
      +
      + +

      −H

      +
      + +

      Specify the maximum height of image (in inches). Images +with larger sizes will be split in several pages. Option +−L may be used for specifying size of split +images overlapping.

      +
      +
      + +

      −i

      +
      + +

      Enable/disable pixel interpolation. This option requires +a single numeric value: zero to disable pixel interpolation +and non-zero to enable. The default is enabled.

      +
      +
      + +

      −L

      +
      + +

      Specify the size of overlapping for split images (in +inches). Used in conjunction with −H +option.

      +
      +
      + +

      −l

      +
      + +

      Specify the left margin for the output (in inches). This +does not affect the width of the printed image.

      +
      +
      + +

      −m

      +
      + +

      Where possible render using the imagemask +PostScript operator instead of the image operator. +When this option is specified tiff2ps will use +imagemask for rendering 1 bit deep images. If this +option is not specified or if the image depth is greater +than 1 then the image operator is used.

      +
      +
      + +

      −o

      +
      + +

      Set the initial TIFF directory to the +IFD at the specified file offset. This option +is useful for selecting thumbnail images and the like which +are hidden using the SubIFD tag.

      +
      +
      + +

      −p

      +
      + +

      Force the generation of (non-Encapsulated) +PostScript.

      +
      +
      + +

      −r

      +
      + +

      Rotate image by 180 degrees.

      +
      +
      + +

      −s

      +
      + +

      Generate output for a single IFD (page) in the input +file.

      +
      +
      + +

      −w

      +
      + +

      Specify the horizontal size of the printed area (in +inches).

      +
      +
      + +

      −x

      +
      + +

      Override resolution units specified in the TIFF as +centimeters.

      +
      +
      + +

      −y

      +
      + +

      Override resolution units specified in the TIFF as +inches.

      +
      +
      + +

      −z

      +
      + +

      When generating PostScript Level 2, data is scaled so +that it does not image into the deadzone on a page +(the outer margin that the printing device is unable to +mark). This option suppresses this behavior. When PostScript +Level 1 is generated, data is imaged to the entire printed +page and this option has no affect.

      +
      +
      + +

      EXAMPLES

      + + + + + +
      +

      The following generates PostScript Level 2 for all pages +of a facsimile:

      + + + + + +
      +
      tiff2ps −a2 fax.tif | lpr
      +
      +
      + + + + + + +
      +

      Note also that if you have version 2.6.1 or newer of +Ghostscript then you can efficiently preview facsimile +generated with the above command.

      + +

      To generate Encapsulated PostScript for a the image at +directory 2 of an image use:

      + + + + + +
      +
      tiff2ps −d 1 foo.tif
      +
      +
      + + + + + + +
      +

      (Notice that directories are numbered starting at +zero.)

      + +

      If you have a long image, it may be split in several +pages:

      + + + + + +
      +
      tiff2ps −h11 −w8.5 −H14 −L.5 foo.tif > foo.ps
      +
      +
      + + + + + + +
      +

      The page size is set to 8.5x11 by −w and +−h options. We will accept a small amount of +vertical compression, so −H set to 14. Any +pages between 11 and 14 inches will be fit onto one page. +Pages longer than 14 inches are cut off at 11 and continued +on the next page. The −L.5 option says to +repeat a half inch on the next page (to improve +readability).

      +
      + +

      BUGS

      + + + + + +
      +

      Because PostScript does not support the notion of a +colormap, 8-bit palette images produce 24-bit PostScript +images. This conversion results in output that is six times +bigger than the original image and which takes a long time +to send to a printer over a serial line. Matters are even +worse for 4-, 2-, and 1-bit palette images.

      + +

      Does not handle tiled images when generating PostScript +Level I output.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffinfo(1), tiffcp(1), +tiffgt(1), tiffmedian(1), tiff2bw(1), +tiffsv(1), libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiff2rgba.1.html b/src/3rdparty/libtiff/html/man/tiff2rgba.1.html new file mode 100644 index 0000000000..eec3968317 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiff2rgba.1.html @@ -0,0 +1,162 @@ + + + + + + +TIFF2RGBA + + + +

      TIFF2RGBA

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiff2rgba − convert a TIFF image to +RGBA color space

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiff2rgba [ options ] input.tif +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Tiff2rgba converts a wide variety of TIFF images +into an RGBA TIFF image. This includes the ability to +translate different color spaces and photometric +interpretation into RGBA, support for alpha blending, and +translation of many different bit depths into a 32bit RGBA +image.

      + +

      Internally this program is implemented using the +TIFFReadRGBAImage() function, and it suffers any +limitations of that image. This includes limited support for +> 8 BitsPerSample images, and flaws with some esoteric +combinations of BitsPerSample, photometric interpretation, +block organization and planar configuration.

      + +

      The generated images are stripped images with four +samples per pixel (red, green, blue and alpha) or if the +−n flag is used, three samples per pixel (red, +green, and blue). The resulting images are always planar +configuration contiguous. For this reason, this program is a +useful utility for transform exotic TIFF files into a form +ingestible by almost any TIFF supporting software.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Specify a compression scheme to use when writing image +data: −c none for no compression (the default), +−c packbits for the PackBits compression +algorithm, −c zip for the Deflate compression +algorithm, −c jpeg for the JPEG compression +algorithm, and −c lzw for Lempel-Ziv & +Welch.

      +
      +
      + +

      −r

      +
      + +

      Write data with a specified number of rows per strip; by +default the number of rows/strip is selected so that each +strip is approximately 8 kilobytes.

      +
      +
      + +

      −b

      +
      + +

      Process the image one block (strip/tile) at a time +instead of by reading the whole image into memory at once. +This may be necessary for very large images on systems with +limited RAM.

      +
      +
      + +

      −n

      +
      + +

      Drop the alpha component from the output file, producing +a pure RGB file. Currently this does not work if the +−b flag is also in effect.

      +
      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiff2bw(1), TIFFReadRGBAImage(3t), +libtiff(3)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffcmp.1.html b/src/3rdparty/libtiff/html/man/tiffcmp.1.html new file mode 100644 index 0000000000..a9fca2f15a --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffcmp.1.html @@ -0,0 +1,156 @@ + + + + + + +TIFFCMP + + + +

      TIFFCMP

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffcmp − compare two TIFF files

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffcmp [ options ] file1.tif +file2.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Tiffcmp compares the tags and data in two files +created according to the Tagged Image File Format, Revision +6.0. The schemes used for compressing data in each file are +immaterial when data are compared−data are compared on +a scanline-by-scanline basis after decompression. Most +directory tags are checked; notable exceptions are: +GrayResponseCurve, ColorResponseCurve, and +ColorMap tags. Data will not be compared if any of +the BitsPerSample, SamplesPerPixel, or +ImageWidth values are not equal. By default, +tiffcmp will terminate if it encounters any +difference.

      +
      + +

      OPTIONS

      + + + + + + + + +
      + +

      −l

      +
      + +

      List each byte of image data that differs between the +files.

      +
      +
      + + + + + +
      +

      −z number

      + + + + + +
      +

      List specified number of image data bytes that differs +between the files.

      +
      + + + + + + + + +
      + +

      −t

      +
      + +

      Ignore any differences in directory tags.

      +
      +
      + +

      BUGS

      + + + + + +
      +

      Tags that are not recognized by the library are not +compared; they may also generate spurious diagnostics.

      + +

      The image data of tiled files is not compared, since the +TIFFReadScanline() function is used. An error will be +reported for tiled files.

      + +

      The pixel and/or sample number reported in differences +may be off in some exotic cases.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffcp(1), +tiffmedian(1), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffcp.1.html b/src/3rdparty/libtiff/html/man/tiffcp.1.html new file mode 100644 index 0000000000..2b30d5f19a --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffcp.1.html @@ -0,0 +1,522 @@ + + + + + + +TIFFCP + + + +

      TIFFCP

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +EXAMPLES
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffcp − copy (and possibly convert) a +TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffcp [ options ] src1.tif ... srcN.tif +dst.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiffcp combines one or more files created +according to the Tag Image File Format, Revision 6.0 into a +single TIFF file. Because the output file may +be compressed using a different algorithm than the input +files, tiffcp is most often used to convert between +different compression schemes.

      + +

      By default, tiffcp will copy all the understood +tags in a TIFF directory of an input file to +the associated directory in the output file.

      + +

      tiffcp can be used to reorganize the storage +characteristics of data in a file, but it is explicitly +intended to not alter or convert the image data content in +any way.

      +
      + +

      OPTIONS

      + + + + + +
      +

      −b image

      + + + + + +
      +

      subtract the following monochrome image from all others +processed. This can be used to remove a noise bias from a +set of images. This bias image is typically an image of +noise the camera saw with its shutter closed.

      +
      + + + + + + + + + + + + + + + + + + + + +
      + +

      −B

      +
      + +

      Force output to be written with Big-Endian byte order. +This option only has an effect when the output file is +created or overwritten and not when it is appended to.

      +
      +
      + +

      −C

      +
      + +

      Suppress the use of ‘‘strip +chopping’’ when reading images that have a +single strip/tile of uncompressed data.

      +
      +
      + +

      −c

      +
      + +

      Specify the compression to use for data written to the +output file: none for no compression, packbits +for PackBits compression, lzw for Lempel-Ziv & +Welch compression, jpeg for baseline JPEG +compression, zip for Deflate compression, g3 +for CCITT Group 3 (T.4) compression, and g4 for CCITT +Group 4 (T.6) compression. By default tiffcp will +compress data according to the value of the +Compression tag found in the source file.

      +
      +
      + + + + + +
      +

      The CCITT Group 3 and Group 4 compression +algorithms can only be used with bilevel data.

      + +

      Group 3 compression can be specified together with +several T.4-specific options: 1d for 1-dimensional +encoding, 2d for 2-dimensional encoding, and +fill to force each encoded scanline to be zero-filled +so that the terminating EOL code lies on a byte boundary. +Group 3-specific options are specified by appending a +‘‘:’’-separated list to the +‘‘g3’’ option; e.g. −c +g3:2d:fill to get 2D-encoded data with byte-aligned EOL +codes.

      + +

      LZW compression can be specified together +with a predictor value. A predictor value of 2 causes +each scanline of the output image to undergo horizontal +differencing before it is encoded; a value of 1 forces each +scanline to be encoded without differencing. LZW-specific +options are specified by appending a +‘‘:’’-separated list to the +‘‘lzw’’ option; e.g. −c +lzw:2 for LZW compression with horizontal +differencing.

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −f

      +
      + +

      Specify the bit fill order to use in writing output +data. By default, tiffcp will create a new file with +the same fill order as the original. Specifying −f +lsb2msb will force data to be written with the FillOrder +tag set to LSB2MSB, while −f +msb2lsb will force data to be written with the FillOrder +tag set to MSB2LSB.

      +
      +
      + +

      −i

      +
      + +

      Ignore non-fatal read errors and continue processing of +the input file.

      +
      +
      + +

      −l

      +
      + +

      Specify the length of a tile (in pixels). tiffcp +attempts to set the tile dimensions so that no more than 8 +kilobytes of data appear in a tile.

      +
      +
      + +

      −L

      +
      + +

      Force output to be written with Little-Endian byte +order. This option only has an effect when the output file +is created or overwritten and not when it is appended +to.

      +
      +
      + +

      −M

      +
      + +

      Suppress the use of memory-mapped files when reading +images.

      +
      +
      + +

      −p

      +
      + +

      Specify the planar configuration to use in writing image +data that has one 8-bit sample per pixel. By default, +tiffcp will create a new file with the same planar +configuration as the original. Specifying −p +contig will force data to be written with multi-sample +data packed together, while −p separate will +force samples to be written in separate planes.

      +
      +
      + +

      −r

      +
      + +

      Specify the number of rows (scanlines) in each strip of +data written to the output file. By default (or when value +0 is specified), tiffcp attempts to set the +rows/strip that no more than 8 kilobytes of data appear in a +strip. If you specify special value −1 it will +results in infinite number of the rows per strip. The entire +image will be the one strip in that case.

      +
      +
      + +

      −s

      +
      + +

      Force the output file to be written with data organized +in strips (rather than tiles).

      +
      +
      + +

      −t

      +
      + +

      Force the output file to be written with data organized +in tiles (rather than strips). options can be used to force +the resultant image to be written as strips or tiles of +data, respectively.

      +
      +
      + +

      −w

      +
      + +

      Specify the width of a tile (in pixels). tiffcp +attempts to set the tile dimensions so that no more than 8 +kilobytes of data appear in a tile. tiffcp attempts +to set the tile dimensions so that no more than 8 kilobytes +of data appear in a tile.

      +
      +
      + + + + + +
      +

      −,=character

      + + + + + +
      +

      substitute character for ‘,’ in +parsing image directory indices in files. This is necessary +if filenames contain commas. Note that −,= with +whitespace immediately following will disable the special +meaning of the ‘,’ entirely. See examples.

      +
      + +

      EXAMPLES

      + + + + + +
      +

      The following concatenates two files and writes the +result using LZW encoding:

      + + + + + +
      +
      tiffcp −c lzw a.tif b.tif result.tif
      +
      +
      + + + + + + +
      +

      To convert a G3 1d-encoded TIFF to a +single strip of G4-encoded data the following might be +used:

      + + + + + +
      +
      tiffcp −c g4 −r 10000 g3.tif g4.tif
      +
      +
      + + + + + + +
      +

      (1000 is just a number that is larger than the number of +rows in the source file.)

      + +

      To extract a selected set of images from a multi-image +TIFF file, the file name may be immediately followed by a +‘,’ separated list of image directory indices. +The first image is always in directory 0. Thus, to copy the +1st and 3rd images of image file +‘‘album.tif’’ to +‘‘result.tif’’:

      + + + + + +
      +
      tiffcp album.tif,0,2 result.tif
      +
      +
      + + + + + + +
      +

      A trailing comma denotes remaining images in sequence. +The following command will copy all image with except the +first one:

      + + + + + +
      +
      tiffcp album.tif,1, result.tif
      +
      +
      + + + + + + +
      +

      Given file ‘‘CCD.tif’’ whose +first image is a noise bias followed by images which include +that bias, subtract the noise from all those images +following it (while decompressing) with the +command:

      + + + + + +
      +
      tiffcp −c none −b CCD.tif CCD.tif,1, result.tif
      +
      +
      + + + + + + +
      +

      If the file above were named +‘‘CCD,X.tif’’, the −,= +option would be required to correctly parse this filename +with image numbers, as follows:

      + + + + + +
      +
      tiffcp −c none −,=% −b CCD,X.tif CCD,X%1%.tif result.tif
      +
      +
      +
      + +

      SEE ALSO

      + + + + + + +
      +

      pal2rgb(1), tiffinfo(1), tiffcmp(1), +tiffmedian(1), tiffsplit(1), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffcrop.1.html b/src/3rdparty/libtiff/html/man/tiffcrop.1.html new file mode 100644 index 0000000000..4c25c2921b --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffcrop.1.html @@ -0,0 +1,851 @@ + + + + + + +TIFFCROP + + + +

      TIFFCROP

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +EXAMPLES
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffcrop − copy, convert, crop, extract, or process +a TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffcrop [ options ] src1.tif ... +srcN.tif dst.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiffcrop combines one or more files created +according to the Tag Image File Format, Revision 6.0 into a +single TIFF file. The output file may be +compressed using a different algorithm than the input files. +tiffcrop is most often used to extract portions of an +image for processing with bar code recognizer or OCR +software when that software cannot restrict the region of +interest to a specific portion of the image or to improve +efficiency when the regions of interest must be rotated. It +can also be used to subdivide all or part of a processed +image into smaller sections.

      + +

      Functions are applied to the input image in the following +order:

      + + + + + +
      +
      cropping, fixed area extraction, zones, inversion, mirroring, rotation.
      +
      +
      + + + + + + +
      +

      Functions are applied to the output image in the +following order:

      + + + + + +
      +

      output resolution, output margins, rows and columns +or page size divisions, orientation options, strip, +tile, byte order, and compression options.

      + + + + + +
      +

      By default, tiffcrop will copy all the understood +tags in a TIFF directory of an input file to +the associated directory in the output file. Options can be +used to force the resultant image to be written as strips or +tiles of data, respectively.

      + +

      tiffcrop can be used to reorganize the storage +characteristics of data in a file, and to reorganize, +extract, rotate, and otherwise process the image data as +specified at the same time whereas tiffcp does not alter the +image data itself.

      +
      + +

      OPTIONS

      + + + + + +
      +

      −N odd|even|#,#-#,#|last

      + + + + + +
      +

      Specify one or more series or range(s) of images within +file to process. The words odd or even may be +used to specify all odd or even numbered images. The word +last may be used in place of a number in the sequence +to indicate the final image in the file without knowing how +many images there are. Ranges of images may be specified +with a dash and multiple sets can be indicated by joining +them in a comma-separated list. eg. use −N +1,5-7,last to process the 1st, 5th through 7th, and +final image in the file.

      +
      + + + + + +
      +

      −E top|bottom|left|right

      + + + + + +
      +

      Specify the top, bottom, left, or right edge as the +reference from which to calcuate the width and length of +crop regions or sequence of postions for zones. May be +abbreviated to first letter.

      +
      + + + + + +
      +

      −U in|cm|px

      + + + + + +
      +

      Specify the type of units to apply to dimensions for +margins and crop regions for input and output images. Inches +or centimeters are converted to pixels using the resolution +unit specified in the TIFF file (which defaults to inches if +not specified in the IFD).

      +
      + + + + + +
      +

      −m #,#,#,#

      + + + + + +
      +

      Specify margins to be removed from the input image. The +order must be top, left, bottom, right with only commas +separating the elements of the list. Margins are scaled +according to the current units and removed before any other +extractions are computed. Captial M was in use.

      +
      + + + + + + + + + + + + + + +
      + +

      −X #

      +
      + +

      Set the horizontal (X-axis) dimension of a region to +extract relative to the specified origin reference. If the +origin is the top or bottom edge, the X axis value will be +assumed to start at the left edge.

      +
      +
      + +

      −Y #

      +
      + +

      Set the vertical (Y-axis) dimension of a region to +extract relative to the specified origin reference. If the +origin is the left or right edge, the Y axis value will be +assumed to start at the top.

      +
      +
      + + + + + +
      +

      −Z #:#,#:#

      + + + + + +
      +

      Specify zones of the image designated as position X of Y +equal sized portions measured from the reference edge, eg +1:3 would be first third of the image starting from the +reference edge minus any margins specified for the confining +edges. Multiple zones can be specified as a comma separated +list but they must reference the same edge. To extract the +top quarter and the bottom third of an image you would use +−Z 1:4,3:3.

      +
      + + + + + +
      +

      −F horiz|vert

      + + + + + +
      +

      Flip, ie mirror, the image or extracted region +horizontally or vertically.

      +
      + + + + + +
      +

      −R 90|180|270

      + + + + + +
      +

      Rotate the image or extracted region 90, 180, or 270 +degrees clockwise.

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −I

      +
      + +

      Invert the colorspace values for grayscale and bilevel +images. This would be used to correct negative images that +have incorrect PHOTMETRIC INTERPRETATION tags. No support +for color images.

      +
      +
      + +

      −H #

      +
      + +

      Set the horizontal resolution of output images to # +expressed in the current units.

      +
      +
      + +

      −V #

      +
      + +

      Set the vertical resolution of the output images to # +expressed in the current units.

      +
      +
      + +

      −J #

      +
      + +

      Set the horizontal margin of an output page size to # +expressed in the current units.

      +
      +
      + +

      −K #

      +
      + +

      Set the vertical margin of an output page size to # +expressed in the current units.

      +
      +
      + + + + + +
      +

      −O portrait|landscape|auto

      + + + + + +
      +

      Set the output orientation of the pages or sections. Auto +will use the arrangement that requires the fewest pages.

      +
      + + + + + +
      +

      −S cols:rows

      + + + + + +
      +

      Divide each image into cols across and rows down equal +sections.

      +
      + + + + + +
      +

      −P page

      + + + + + +
      +

      Format the output images to fit on page size paper. Use +-P list to show the supported page sizes and dimensions.

      +
      + + + + + + + + + + + + + + + + + + + + +
      + +

      −B

      +
      + +

      Force output to be written with Big-Endian byte order. +This option only has an effect when the output file is +created or overwritten and not when it is appended to.

      +
      +
      + +

      −C

      +
      + +

      Suppress the use of ‘‘strip +chopping’’ when reading images that have a +single strip/tile of uncompressed data.

      +
      +
      + +

      −c

      +
      + +

      Specify the compression to use for data written to the +output file: none for no compression, packbits +for PackBits compression, lzw for Lempel-Ziv & +Welch compression, jpeg for baseline JPEG +compression, zip for Deflate compression, g3 +for CCITT Group 3 (T.4) compression, and g4 for CCITT +Group 4 (T.6) compression. By default tiffcrop will +compress data according to the value of the +Compression tag found in the source file.

      +
      +
      + + + + + +
      +

      The CCITT Group 3 and Group 4 compression +algorithms can only be used with bilevel data.

      + +

      Group 3 compression can be specified together with +several T.4-specific options: 1d for 1-dimensional +encoding, 2d for 2-dimensional encoding, and +fill to force each encoded scanline to be zero-filled +so that the terminating EOL code lies on a byte boundary. +Group 3-specific options are specified by appending a +‘‘:’’-separated list to the +‘‘g3’’ option; e.g. −c +g3:2d:fill to get 2D-encoded data with byte-aligned EOL +codes.

      + +

      LZW compression can be specified together +with a predictor value. A predictor value of 2 causes +each scanline of the output image to undergo horizontal +differencing before it is encoded; a value of 1 forces each +scanline to be encoded without differencing. LZW-specific +options are specified by appending a +‘‘:’’-separated list to the +‘‘lzw’’ option; e.g. −c +lzw:2 for LZW compression with horizontal +differencing.

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −f

      +
      + +

      Specify the bit fill order to use in writing output +data. By default, tiffcrop will create a new file +with the same fill order as the original. Specifying +−f lsb2msb will force data to be written with +the FillOrder tag set to LSB2MSB, while +−f msb2lsb will force data to be written with +the FillOrder tag set to MSB2LSB.

      +
      +
      + +

      −i

      +
      + +

      Ignore non-fatal read errors and continue processing of +the input file.

      +
      +
      + +

      −l

      +
      + +

      Specify the length of a tile (in pixels). +tiffcrop attempts to set the tile dimensions so that +no more than 8 kilobytes of data appear in a tile.

      +
      +
      + +

      −L

      +
      + +

      Force output to be written with Little-Endian byte +order. This option only has an effect when the output file +is created or overwritten and not when it is appended +to.

      +
      +
      + +

      −M

      +
      + +

      Suppress the use of memory-mapped files when reading +images.

      +
      +
      + +

      −p

      +
      + +

      Specify the planar configuration to use in writing image +data that has more than one 8-bit sample per pixel. By +default, tiffcrop will create a new file with the +same planar configuration as the original. Specifying +−p contig will force data to be written with +multi-sample data packed together, while −p +separate will force samples to be written in separate +planes.

      +
      +
      + +

      −r

      +
      + +

      Specify the number of rows (scanlines) in each strip of +data written to the output file. By default (or when value +0 is specified), tiffcrop attempts to set the +rows/strip that no more than 8 kilobytes of data appear in a +strip. If you specify the special value -1 it will +results in infinite number of the rows per strip. The entire +image will be the one strip in that case.

      +
      +
      + +

      −s

      +
      + +

      Force the output file to be written with data organized +in strips (rather than tiles).

      +
      +
      + +

      −t

      +
      + +

      Force the output file to be written with data organized +in tiles (rather than strips).

      +
      +
      + +

      −w

      +
      + +

      Specify the width of a tile (in pixels). tiffcrop +attempts to set the tile dimensions so that no more than 8 +kilobytes of data appear in a tile. tiffcrop attempts +to set the tile dimensions so that no more than 8 kilobytes +of data appear in a tile.

      +
      +
      + + + + + +
      +

      −,={character}

      + + + + + +
      +

      substitute {character} for ’,’ in parsing +image directory indices in files. This is necessary if +filenames contain commas. Note that ’,=’ with +whitespace immediately following will disable the special +meaning of the ’,’ entirely. See examples.

      +
      + +

      EXAMPLES

      + + + + + +
      +

      The following concatenates two files and writes the +result using LZW encoding:

      + + + + + +
      +
      tiffcrop -c lzw a.tif b.tif result.tif
      +
      +
      + + + + + + +
      +

      To convert a G3 1d-encoded TIFF to a +single strip of G4-encoded data the following might be +used:

      + + + + + +
      +
      tiffcrop -c g4 -r 10000 g3.tif g4.tif
      +
      +
      + + + + + + +
      +

      (1000 is just a number that is larger than the number of +rows in the source file.)

      + +

      To extract a selected set of images from a multi-image +TIFF file use the -N option described above. Thus, to copy +the 1st and 3rd images of image file "album.tif" +to "result.tif":

      + + + + + +
      +
      tiffcrop -N 1,3 album.tif result.tif
      +
      +
      + + + + + + +
      +

      Invert a bilevel image scan of a microfilmed document and +crop off margins of 0.25 inches on the left and right, 0.5 +inch on the top, nad 0.75 inch on the bottom. From the +remaining portion of the image, select the second and third +quarters, ie, one half of the area left from the center to +each margin.

      + + + + + +
      +
      tiffcrop -U in -m 0.5,0.25,0.75,0.25 -E left -Z 2:4,3:4 -I MicrofilmNegative.tif MicrofilmPostiveCenter.tif
      +
      +
      + + + + + + +
      +

      Extract only the final image of a large Architectural E +sized multipage TIFF file and rotate it 90 degrees clockwise +while reformatting the output to fit on tabloid sized sheets +with one quarter of an inch on each side:

      + + + + + +
      +
      tiffcrop -N last -R 90 -O auto -P tabloid -U in -J 0.25 -K 0.25 -H 300 -V 300 Big-PlatMap.tif BigPlatMap-Tabloid.tif
      +
      +
      + + + + + + +
      +

      The output images will have a specified resolution of 300 +dpi in both directions. The orientation of each page will be +determined by whichever choice requires the fewest pages. To +specify a specific orientation, use the portrait or +landscape option.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffinfo(1), tiffcmp(1), +tiffcp(1), tiffmedian(1), tiffsplit(1), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffdither.1.html b/src/3rdparty/libtiff/html/man/tiffdither.1.html new file mode 100644 index 0000000000..2427a90125 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffdither.1.html @@ -0,0 +1,183 @@ + + + + + + +TIFFDITHER + + + +

      TIFFDITHER

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +NOTES
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffdither − convert a greyscale image to bilevel +using dithering

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffdither [ options ] input.tif +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiffdither converts a single channel 8-bit +greyscale image to a bilevel image using Floyd-Steinberg +error propagation with thresholding.

      +
      + +

      OPTIONS

      + + + + + + + + +
      + +

      −c

      +
      + +

      Specify the compression to use for data written to the +output file: none for no compression, packbits +for PackBits compression, lzw for Lempel-Ziv & +Welch compression, zip for Deflate compression, +g3 for CCITT Group 3 (T.4) compression, and g4 +for CCITT Group 4 (T.6) compression. By default +tiffdither will compress data according to the value +of the Compression tag found in the source file.

      +
      +
      + + + + + +
      +

      The CCITT Group 3 and Group 4 compression +algorithms can only be used with bilevel data.

      + +

      Group 3 compression can be specified together with +several T.4-specific options: 1d for 1-dimensional +encoding, 2d for 2-dimensional encoding, and +fill to force each encoded scanline to be zero-filled +so that the terminating EOL code lies on a byte boundary. +Group 3-specific options are specified by appending a +‘‘:’’-separated list to the +‘‘g3’’ option; e.g. −c +g3:2d:fill to get 2D-encoded data with byte-aligned EOL +codes.

      + +

      LZW compression can be specified together +with a predictor value. A predictor value of 2 causes +each scanline of the output image to undergo horizontal +differencing before it is encoded; a value of 1 forces each +scanline to be encoded without differencing. LZW-specific +options are specified by appending a +‘‘:’’-separated list to the +‘‘lzw’’ option; e.g. −c +lzw:2 for LZW compression with horizontal +differencing.

      +
      + + + + + + + + + + + + + + +
      + +

      −f

      +
      + +

      Specify the bit fill order to use in writing output +data. By default, tiffdither will create a new file +with the same fill order as the original. Specifying +−f lsb2msb will force data to be written with +the FillOrder tag set to LSB2MSB , +while −f msb2lsb will force data to be written +with the Fill- Order tag set to MSB2LSB +.

      +
      +
      + +

      −t

      +
      + +

      Set the threshold value for dithering. By default the +threshold value is 128.

      +
      +
      + +

      NOTES

      + + + + + +
      +

      The dither algorithm is taken from the +tiffmedian(1) program (written by Paul Heckbert).

      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), fax2tiff(1), +tiffinfo(1), tiffcp(1), tiff2bw(1), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffdump.1.html b/src/3rdparty/libtiff/html/man/tiffdump.1.html new file mode 100644 index 0000000000..abf0662c66 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffdump.1.html @@ -0,0 +1,145 @@ + + + + + + +TIFFDUMP + + + +

      TIFFDUMP

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffdump − print verbatim information about +TIFF files

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffdump [ options ] name ...

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiffdump displays directory information from files +created according to the Tag Image File Format, Revision +6.0. The header of each TIFF file (magic +number, version, and first directory offset) is displayed, +followed by the tag contents of each directory in the file. +For each tag, the name, data type, count, and value(s) is +displayed. When the symbolic name for a tag or data type is +known, the symbolic name is displayed followed by it’s +numeric (decimal) value. Tag values are displayed enclosed +in ‘‘<>’’ characters +immediately preceded by the value of the count field. For +example, an ImageWidth tag might be displayed as +‘‘ImageWidth (256) SHORT (3) +1<800>’’.

      + +

      tiffdump is particularly useful for investigating +the contents of TIFF files that +libtiff does not understand.

      +
      + +

      OPTIONS

      + + + + + + + + +
      + +

      −h

      +
      + +

      Force numeric data to be printed in hexadecimal rather +than the default decimal.

      +
      +
      + + + + + +
      +

      −m items

      + + + + + +
      +

      Change the number of indirect data items that are +printed. By default, this will be 24.

      +
      + + + + + +
      +

      −o offset

      + + + + + +
      +

      Dump the contents of the IFD at the a +particular file offset. The file offset may be specified +using the usual C-style syntax; i.e. a leading +‘‘0x’’ for hexadecimal and a leading +‘‘0’’ for octal.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiffinfo(1), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffgt.1.html b/src/3rdparty/libtiff/html/man/tiffgt.1.html new file mode 100644 index 0000000000..e8bd4b2312 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffgt.1.html @@ -0,0 +1,551 @@ + + + + + + +TIFFGT + + + +

      TIFFGT

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffgt − display an image stored in a +TIFF file (Silicon Graphics version)

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffgt [ options ] input.tif ...

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiffgt displays one or more images stored using +the Tag Image File Format, Revision 6.0. Each image is +placed in a fixed size window that the user must position on +the display (unless configured otherwise through X +defaults). If the display has fewer than 24 bitplanes, or if +the image does not warrant full color, then +RGB color values are mapped to the closest +values that exist in the colormap (this is done using the +rgbi routine found in the graphics utility library +−lgutil.)

      + +

      tiffgt correctly handles files with any of the +following characteristics:

      + + + + + + + + + + + + + + + + + + + + + + +
      + +

      BitsPerSample

      +
      + +

      1, 2, 4, 8, 16

      +
      + +

      SamplesPerPixel

      +
      + +

      1, 3, 4 (the 4th sample is ignored)

      +
      + +

      PhotometricInterpretation

      +
      + +

      0 (min-is-white), 1 (min-is-black), 2 (RGB), 3 +(palette), 6 (YCbCr)

      +
      + +

      PlanarConfiguration

      +
      + +

      1 (contiguous), 2 (separate)

      +
      + +

      Orientation

      +
      + +

      1 (top-left), 4 (bottom-left)

      +
      + + + + + +
      +

      Data may be organized as strips or tiles and may be +compressed with any of the compression algorithms supported +by the libtiff(3) library.

      + +

      For palette images (PhotometricInterpretation=3), +tiffgt inspects the colormap values and assumes +either 16-bit or 8-bit values according to the maximum +value. That is, if no colormap entry greater than 255 is +found, tiffgt assumes the colormap has only 8-bit +values; otherwise it assumes 16-bit values. This inspection +is done to handle old images written by previous (incorrect) +versions of libtiff.

      + +

      tiffgt can be used to display multiple images +one-at-a-time. The left mouse button switches the display to +the first image in the next file in the list of files +specified on the command line. The right mouse button +switches to the first image in the previous file in +the list. The middle mouse button causes the first image in +the first file specified on the command line to be +displayed. In addition the following keyboard commands are +recognized:

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      b

      +
      + +

      Use a PhotometricInterpretation of MinIsBlack in +displaying the current image.

      +
      +
      + +

      l

      +
      + +

      Use a FillOrder of lsb-to-msb in decoding the +current image.

      +
      +
      + +

      m

      +
      + +

      Use a FillOrder of msb-to-lsb in decoding the +current image.

      +
      +
      + +

      c

      +
      + +

      Use a colormap visual to display the current image.

      +
      +
      + +

      r

      +
      + +

      Use a true color (24-bit RGB) visual to display the +current image.

      +
      +
      + +

      w

      +
      + +

      Use a PhotometricInterpretation of MinIsWhite in +displaying the current image.

      +
      +
      + +

      W

      +
      + +

      Toggle (enable/disable) display of warning messages from +the TIFF library when decoding images.

      +
      +
      + +

      E

      +
      + +

      Toggle (enable/disable) display of error messages from +the TIFF library when decoding images.

      +
      +
      + +

      z

      +
      + +

      Reset all parameters to their default settings +(FillOrder, PhotometricInterpretation, +handling of warnings and errors).

      +
      +
      + +

      PageUp

      +
      + +

      Display the previous image in the current file or the +last image in the previous file.

      +
      +
      + + + + + +
      +

      PageDown

      + + + + + +
      +

      Display the next image in the current file or the first +image in the next file.

      +
      + + + + + + + + + + + + + + +
      + +

      Home

      +
      + +

      Display the first image in the current file.

      +
      +
      + +

      End

      +
      + +

      Display the last image in the current file +(unimplemented).

      +
      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Force image display in a colormap window.

      +
      +
      + +

      −d

      +
      + +

      Specify an image to display by directory number. By +default the first image in the file is displayed. +Directories are numbered starting at zero.

      +
      +
      + +

      −e

      +
      + +

      Enable reporting of error messages from the +TIFF library. By default tiffgt +silently ignores images that cannot be read.

      +
      +
      + +

      −f

      +
      + +

      Force tiffgt to run as a foreground process. By +default tiffgt will place itself in the background +once it has opened the requested image file.

      +
      +
      + +

      −l

      +
      + +

      Force the presumed bit ordering to be LSB +to MSB.

      +
      +
      + +

      −m

      +
      + +

      Force the presumed bit ordering to be MSB +to LSB.

      +
      +
      + +

      −o

      +
      + +

      Specify an image to display by directory offset. By +default the first image in the file is displayed. +Directories offsets may be specified using C-style syntax; +i.e. a leading ‘‘0x’’ for +hexadecimal and a leading ‘‘0’’ for +octal.

      +
      +
      + +

      −p

      +
      + +

      Override the value of the +PhotometricInterpretation tag; the parameter may be +one of: miniswhite, minisblack, rgb, +palette, mask, separated, ycbcr, +and cielab.

      +
      +
      + +

      −r

      +
      + +

      Force image display in a full color window.

      +
      +
      + +

      −s

      +
      + +

      Stop on the first read error. By default all errors in +the input data are ignored and tiffgt does it’s +best to display as much of an image as possible.

      +
      +
      + +

      −w

      +
      + +

      Enable reporting of warning messages from the +TIFF library. By default tiffgt +ignores warning messages generated when reading an +image.

      +
      +
      + +

      −v

      +
      + +

      Place information in the title bar describing what type +of window (full color or colormap) is being used, the name +of the input file, and the directory index of the image (if +non-zero). By default, the window type is not shown in the +title bar.

      +
      +
      + +

      BUGS

      + + + + + +
      +

      Images wider and taller than the display are silently +truncated to avoid crashing old versions of the window +manager.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiffdump(1), tiffinfo(1), tiffcp(1), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffinfo.1.html b/src/3rdparty/libtiff/html/man/tiffinfo.1.html new file mode 100644 index 0000000000..4863ed3762 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffinfo.1.html @@ -0,0 +1,196 @@ + + + + + + +TIFFINFO + + + +

      TIFFINFO

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffinfo − print information about +TIFF files

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffinfo [ options ] input.tif +...

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Tiffinfo displays information about files created +according to the Tag Image File Format, Revision 6.0. By +default, the contents of each TIFF directory +in each file is displayed, with the value of each tag shown +symbolically (where sensible).

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +

      −c

      +
      + +

      Display the colormap and color/gray response curves, if +present.

      +
      +
      + +

      −D

      +
      + +

      In addition to displaying the directory tags, read and +decompress all the data in each image (but not display +it).

      +
      +
      + +

      −d

      +
      + +

      In addition to displaying the directory tags, print each +byte of decompressed data in hexadecimal.

      +
      +
      + +

      −j

      +
      + +

      Display any JPEG -related tags that are +present.

      +
      +
      + +

      −o

      +
      + +

      Set the initial TIFF directory according +to the specified file offset. The file offset may be +specified using the usual C-style syntax; i.e. a leading +‘‘0x’’ for hexadecimal and a leading +‘‘0’’ for octal.

      +
      +
      + +

      −s

      +
      + +

      Display the offsets and byte counts for each data strip +in a directory.

      +
      +
      + +

      −z

      +
      + +

      Enable strip chopping when reading image data.

      +
      +
      + +

      −#

      +
      + +

      Set the initial TIFF directory to +#.

      +
      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffcp(1), tiffcmp(1), +tiffmedian(1), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffmedian.1.html b/src/3rdparty/libtiff/html/man/tiffmedian.1.html new file mode 100644 index 0000000000..59613177c9 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffmedian.1.html @@ -0,0 +1,183 @@ + + + + + + +TIFFMEDIAN + + + +

      TIFFMEDIAN

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +NOTES
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffmedian − apply the median cut algorithm to data +in a TIFF file

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffmedian [ options ] input.tif +output.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiffmedian applies the median cut algorithm to an +RGB image in input.tif to generate a +palette image that is written to output.tif. The +generated colormap has, by default, 256 entries. The image +data is quantized by mapping each pixel to the closest color +values in the colormap.

      +
      + +

      OPTIONS

      + + + + + + + + +
      + +

      −c

      +
      + +

      Specify the compression to use for data written to the +output file: none for no compression, packbits +for PackBits compression, lzw for Lempel-Ziv & +Welch compression, and zip for Deflate compression. +By default tiffmedian will compress data according to +the value of the Compression tag found in the source +file.

      +
      +
      + + + + + +
      +

      LZW compression can be specified together +with a predictor value. A predictor value of 2 causes +each scanline of the output image to undergo horizontal +differencing before it is encoded; a value of 1 forces each +scanline to be encoded without differencing. LZW-specific +options are specified by appending a +‘‘:’’-separated list to the +‘‘lzw’’ option; e.g. −c +lzw:2 for LZW compression with horizontal +differencing.

      +
      + + + + + + + + + + + + + + + + + + + + +
      + +

      −C

      +
      + +

      Specify the number of entries to use in the generated +colormap. By default all 256 entries/colors are used.

      +
      +
      + +

      −f

      +
      + +

      Apply Floyd-Steinberg dithering before selecting a +colormap entry.

      +
      +
      + +

      −r

      +
      + +

      Specify the number of rows (scanlines) in each strip of +data written to the output file. By default, +tiffmedian attempts to set the rows/strip that no +more than 8 kilobytes of data appear in a strip.

      +
      +
      + +

      NOTES

      + + + + + +
      +

      This program is derived from Paul Heckbert’s +median program.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      pal2rgb(1), tiffinfo(1), tiffcp(1), +tiffcmp(1), libtiff(3TIFF)

      + +

      Color Image Quantization for Frame Buffer Display, +Paul Heckbert, SIGGRAPH proceedings, 1982, pp. 297-307.

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffset.1.html b/src/3rdparty/libtiff/html/man/tiffset.1.html new file mode 100644 index 0000000000..fb4d0ed580 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffset.1.html @@ -0,0 +1,176 @@ + + + + + + +TIFFSET + + + +

      TIFFSET

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +EXAMPLES
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffset − set a field in a TIFF +header

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffset [ options ] filename.tif

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      Tiffset sets the value of a TIFF +header to a specified value.

      +
      + +

      OPTIONS

      + + + + + +
      +

      −s tagnumber [ count ] +value ...

      + + + + + +
      +

      Set the value of the named tag to the value or values +specified.

      +
      + + + + + +
      +

      −sf tagnumber filename

      + + + + + +
      +

      Set the value of the tag to the contents of filename. +This option is supported for ASCII tags only.

      +
      + +

      EXAMPLES

      + + + + + +
      +

      The following example sets the image description tag +(270) of a.tif to the contents of the file descrip:

      + + + + + +
      +
      tiffset −sf 270 descrip a.tif
      +
      +
      + + + + + + +
      +

      The following example sets the artist tag (315) of a.tif +to the string +‘‘Anonymous’’:

      + + + + + +
      +
      tiffset −s 305 Anonymous a.tif
      +
      +
      + + + + + + +
      +

      This example sets the resolution of the file a.tif to 300 +dpi:

      + + + + + +
      +
      tiffset −s 296 2 a.tif
      +tiffset −s 282 300.0 a.tif
      +tiffset −s 283 300.0 a.tif
      +
      +
      + +

      SEE ALSO

      + + + + + + +
      +

      tiffdump(1), tiffinfo(1), tiffcp(1), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffsplit.1.html b/src/3rdparty/libtiff/html/man/tiffsplit.1.html new file mode 100644 index 0000000000..adbc2f8899 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffsplit.1.html @@ -0,0 +1,102 @@ + + + + + + +TIFFSPLIT + + + +

      TIFFSPLIT

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffsplit − split a multi-image TIFF +into single-image TIFF files

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffsplit src.tif [ prefix ]

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiffsplit takes a multi-directory (page) +TIFF file and creates one or more +single-directory (page) TIFF files from it. +The output files are given names created by concatenating a +prefix, a lexically ordered suffix in the range +[aaa-zzz], the suffix .tif (e.g. +xaaa.tif, xaab.tif, xzzz.tif). If a +prefix is not specified on the command line, the default +prefix of x is used.

      +
      + +

      OPTIONS

      + + + + + +
      +

      None.

      +
      + +

      BUGS

      + + + + + +
      +

      Only a select set of ‘‘known +tags’’ is copied when splitting.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      tiffcp(1), tiffinfo(1), +libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/man/tiffsv.1.html b/src/3rdparty/libtiff/html/man/tiffsv.1.html new file mode 100644 index 0000000000..fb484b01f8 --- /dev/null +++ b/src/3rdparty/libtiff/html/man/tiffsv.1.html @@ -0,0 +1,207 @@ + + + + + + +TIFFSV + + + +

      TIFFSV

      +NAME
      +SYNOPSIS
      +DESCRIPTION
      +OPTIONS
      +NOTE
      +BUGS
      +SEE ALSO
      + +
      + +

      NAME

      + + + + + +
      +

      tiffsv − save an image from the framebuffer in a +TIFF file (Silicon Graphics version)

      +
      + +

      SYNOPSIS

      + + + + + +
      +

      tiffsv [ options ] output.tif [ +x1 x2 y1 y2 ]

      +
      + +

      DESCRIPTION

      + + + + + +
      +

      tiffsv saves all or part of the framebuffer in a +file using the Tag Image File Format, Revision 6.0. By +default, the image is saved with data samples packed +(PlanarConfiguration=1), compressed with the +Lempel-Ziv & Welch algorithm (Compression=5), and +with each strip no more than 8 kilobytes. These +characteristics can be overridden, or explicitly specified +with the options described below.

      +
      + +

      OPTIONS

      + + + + + + + + + + + + + + +
      + +

      −b

      +
      + +

      Save the image as a greyscale image as if it were +processed by tiff2bw(1). This option is included for +compatibility with the standard scrsave(6D) +program.

      +
      +
      + +

      −c

      +
      + +

      Specify the compression to use for data written to the +output file: none for no compression, packbits +for PackBits compression, jpeg for baseline JPEG +compression, zip for Deflate compression, and +lzw for Lempel-Ziv & Welch compression +(default).

      +
      +
      + + + + + +
      +

      LZW compression can be specified together +with a predictor value. A predictor value of 2 causes +each scanline of the output image to undergo horizontal +differencing before it is encoded; a value of 1 forces each +scanline to be encoded without differencing. LZW-specific +options are specified by appending a +‘‘:’’-separated list to the +‘‘lzw’’ option; e.g. −c +lzw:2 for LZW compression with horizontal +differencing.

      +
      + + + + + + + + + + + + + + +
      + +

      −p

      +
      + +

      Specify the planar configuration to use in writing image +data. By default, tiffsv will create a new file with +the data samples packed contiguously. Specifying −p +contig will force data to be written with multi-sample +data packed together, while −p separate will +force samples to be written in separate planes.

      +
      +
      + +

      −r

      +
      + +

      Specify the number of rows (scanlines) in each strip of +data written to the output file. By default, tiffsv +attempts to set the rows/strip that no more than 8 kilobytes +of data appear in a strip.

      +
      +
      + +

      NOTE

      + + + + + +
      +

      Except for the use of TIFF, this program +is equivalent to the standard scrsave program. This +means, for example, that you can use it in conjunction with +the standard icut program simply by creating a link +called scrsave, or by creating a shell script called +scrsave that invokes tiffgt with the +appropriate options.

      +
      + +

      BUGS

      + + + + + +
      +

      If data are saved compressed and in separate planes, then +the rows in each strip is silently set to one to avoid +limitations in the libtiff(3TIFF) library.

      +
      + +

      SEE ALSO

      + + + + + +
      +

      scrsave(6D) pal2rgb(1), tiffdump(1), +tiffgt(1), tiffinfo(1), tiffcp(1), +tiffmedian(1), libtiff(3TIFF)

      + +

      Libtiff library home page: +http://www.remotesensing.org/libtiff/

      +
      +
      + + diff --git a/src/3rdparty/libtiff/html/misc.html b/src/3rdparty/libtiff/html/misc.html new file mode 100644 index 0000000000..aed91a9213 --- /dev/null +++ b/src/3rdparty/libtiff/html/misc.html @@ -0,0 +1,116 @@ + + + +Acknowledgments and Other Issues + + + + +

      + +Acknowledgments and Other Issues +

      + +

      +Silicon Graphics has seen fit to allow us to give this work away. It +is free. There is no support or guarantee of any sort as to its +operations, correctness, or whatever. If you do anything useful with +all or parts of it you need to honor the copyright notices. It would +also be nice to be acknowledged.

      + +
      + +

      Acknowledgements

      + +The libtiff software was written by Sam Leffler while working for +Silicon Graphics.

      + +The LZW algorithm is derived from the compress program (the proper attribution +is included in the source code). The Group 3 fax stuff originated as code +from Jef Poskanzer, but has since been rewritten several times. The latest +version uses an algorithm from Frank Cringle -- consult +libtiff/mkg3states.c and libtiff/tif_fax3.h for further +information. The JPEG support was written by Tom Lane and is dependent on the +excellent work of Tom Lane and the Independent JPEG Group (IJG) who distribute +their work under friendly licensing similar to this software. Joris Van Damme +implemented the robust Old JPEG decoder (as included in libtiff since version +3.9.0, there was another Old JPEG module in older releases, which was +incomplete and unsuitable for many existing images of that format). JBIG +module was written by Lee Howard and depends on JBIG library from the Markus +Kuhn. Many other people have by now helped with bug fixes and code; a few of +the more persistent contributors have been: + +

      +    Bjorn P. Brox
      +    Dan McCoy
      +    J.T. Conklin                
      +    Richard Minner
      +    Frank D. Cringle        
      +    Richard Mlynarik
      +    Soren Pingel Dalsgaard  
      +    Niles Ritter
      +    Steve Johnson           
      +    Karsten Spang
      +    Tom Lane               
      +    Peter Smith
      +    Brent Roman            
      +    Mike Welles
      +    Frank Warmerdam
      +    Greg Ward
      +    Stanislav Brabec        
      +    Roman Shpount
      +    Peter Skarpetis        
      +    Arvan Pritchard
      +    Bernt Herd             
      +    Joseph Orost
      +    Phil Beffery           
      +    Ivo Penzar
      +    Francois Dagand        
      +    Albert Chin-A-Young
      +    Bruce A. Mallett
      +    Dwight Kelly
      +    Andrey Kiselev
      +    Ross Finlayson
      +    Dmitry V. Levin
      +    Bob Friesenhahn
      +    Lee Howard
      +    Joris Van Damme
      +    Tavis Ormandy
      +    Richard Nolde
      +
      + +(my apology to anyone that was inadvertently not listed.) + +

      Use and Copyright

      + +

      +Copyright (c) 1988-1997 Sam Leffler
      +Copyright (c) 1991-1997 Silicon Graphics, Inc.
      +
      +Permission to use, copy, modify, distribute, and sell this software and 
      +its documentation for any purpose is hereby granted without fee, provided
      +that (i) the above copyright notices and this permission notice appear in
      +all copies of the software and related documentation, and (ii) the names of
      +Sam Leffler and Silicon Graphics may not be used in any advertising or
      +publicity relating to the software without the specific, prior written
      +permission of Sam Leffler and Silicon Graphics.
      +
      +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
      +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
      +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
      +
      +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
      +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
      +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
      +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
      +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
      +OF THIS SOFTWARE.
      +
      + +

      +


      + + +Last updated: $Date: 2007/02/24 15:47:04 $ + + diff --git a/src/3rdparty/libtiff/html/support.html b/src/3rdparty/libtiff/html/support.html new file mode 100644 index 0000000000..f6f5d60877 --- /dev/null +++ b/src/3rdparty/libtiff/html/support.html @@ -0,0 +1,655 @@ + + + + TIFF 6.0 Specification Coverage + + + + + + + + + + +
      +

      TIFF 6.0 Specification Coverage

      +

      + The library is capable of dealing with images that are written to + follow the 5.0 or 6.0 TIFF spec. There is also considerable support + for some of the more esoteric portions of the 6.0 TIFF spec. +

      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Core requirements +

      + Both "MM" and "II" byte orders are handled. + Both packed and separated planar configuration of samples. + Any number of samples per pixel (memory permitting). + Any image width and height (memory permitting). + Multiple subfiles can be read and written. + Editing is not supported in that related subfiles (e.g. + a reduced resolution version of an image) are not automatically + updated. +

      +

      + Tags handled: ExtraSamples, ImageWidth, + ImageLength, NewSubfileType, ResolutionUnit. + Rowsperstrip, StripOffsets, StripByteCounts, + XResolution, YResolution +

      +
      Tiled ImagesTileWidth, TileLength, TileOffsets, + TileByteCounts
      Image Colorimetry InformationWhitePoint, PrimaryChromaticities, TransferFunction, + ReferenceBlackWhite
      Class B for bilevel imagesSamplesPerPixel = 1
      + BitsPerSample = 1
      + Compression = 1 (none), 2 (CCITT 1D), or 32773 (PackBits)
      + PhotometricInterpretation = 0 (Min-is-White), 1 (Min-is-Black)
      Class G for grayscale imagesSamplesPerPixel = 1
      + BitsPerSample = 4, 8
      + Compression = 1 (none) 5 (LZW)
      + PhotometricInterpretation = 0 (Min-is-White), 1 (Min-is-Black)
      Class P for palette color imagesSamplesPerPixel = 1
      + BitsPerSample = 1-8
      + Compression = 1 (none) 5 (LZW)
      + PhotometricInterpretation = 3 (Palette RGB)
      + ColorMap
      Class R for RGB full color imagesSamplesPerPixel = 3
      + BitsPerSample = <8,8,8>
      + PlanarConfiguration = 1, 2
      + Compression = 1 (none) 5 (LZW)
      + PhotometricInterpretation = 2 (RGB)
      Class F for facsimile(Class B tags plus...)
      + Compression = 3 (CCITT Group 3), 4 (CCITT Group 4)
      + FillOrder = 1 (MSB), 2 (LSB)
      + Group3Options = 1 (2d encoding), 4 (zero fill), 5 (2d+fill)
      + ImageWidth = 1728, 2048, 2482
      + NewSubFileType = 2
      + ResolutionUnit = 2 (Inch), 3 (Centimeter)
      + PageNumber, + XResolution, + YResolution, + Software, + BadFaxLines, + CleanFaxData, + ConsecutiveBadFaxLines, + DateTime, + DocumentName, + ImageDescription, + Orientation
      Class S for separated imagesSamplesPerPixel = 4
      + PlanarConfiguration = 1, 2
      + Compression = 1 (none), 5 (LZW)
      + PhotometricInterpretation = 5 (Separated)
      + InkSet = 1 (CMYK)
      + DotRange, + InkNames, + DotRange, + TargetPrinter
      Class Y for YCbCr imagesSamplesPerPixel = 3
      + BitsPerSample = <8,8,8>
      + PlanarConfiguration = 1, 2
      + Compression = 1 (none), 5 (LZW), 7 (JPEG)
      + PhotometricInterpretation = 6 (YCbCr)
      + YCbCrCoefficients, + YCbCrSubsampling, + YCbCrPositioning
      + (colorimetry info from Appendix H; see above)
      Class "JPEG" for JPEG images (per TTN2)PhotometricInterpretation = 1 (grayscale), 2 (RGB), 5 (CMYK), 6 (YCbCr)
      + (Class Y tags if YCbCr)
      + (Class S tags if CMYK)
      + Compression = 7 (JPEG)
      +

      + In addition, the library supports some optional compression algorithms + that are, in some cases, of dubious value. +

      + + + + + + + + +
      Compression tag valueCompression algorithm
      32766NeXT 2-bit encoding
      32809ThunderScan 4-bit encoding
      32909Pixar companded 11-bit ZIP encoding
      32946PKZIP-style Deflate encoding (experimental)
      34676SGI 32-bit Log Luminance encoding (experimental)
      34677SGI 24-bit Log Luminance encoding (experimental)
      +
      +

      + Note that there is no support for the JPEG-related tags defined + in the 6.0 specification; the JPEG support is based on the post-6.0 + proposal given in TIFF Technical Note #2. +

      + + + + + +
      For more information on the experimental Log Luminance encoding + consult the materials available at + http://www.anyhere.com/gward/pixformat/tiffluv.html.
      +
      +

      + The following table shows the tags that are recognized + and how they are used by the library. If no use is indicated, + then the library reads and writes the tag, but does not use it internally. +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Tag NameValueR/WLibrary's Use (Comments)
      NewSubFileType254R/Wnone (called SubFileType in <tiff.h>)
      SubFileType255R/Wnone (called OSubFileType in <tiff.h>)
      ImageWidth256R/Wlots
      ImageLength257R/Wlots
      BitsPerSample258R/Wlots
      Compression259R/Wto select appropriate codec
      PhotometricInterpretation262R/Wlots
      Thresholding263R/W 
      CellWidth264 parsed but ignored
      CellLength265 parsed but ignored
      FillOrder266R/Wcontrol bit order
      DocumentName269R/W 
      ImageDescription270R/W 
      Make271R/W 
      Model272R/W 
      StripOffsets273R/Wdata i/o
      Orientation274R/W 
      SamplesPerPixel277R/Wlots
      RowsPerStrip278R/Wdata i/o
      StripByteCounts279R/Wdata i/o
      MinSampleValue280R/W 
      MaxSampleValue281R/W 
      XResolution282R/W 
      YResolution283R/Wused by Group 3 2d encoder
      PlanarConfiguration284R/Wdata i/o
      PageName285R/W 
      XPosition286R/W 
      YPosition286R/W 
      FreeOffsets288 parsed but ignored
      FreeByteCounts289 parsed but ignored
      GrayResponseUnit290 parsed but ignored
      GrayResponseCurve291 parsed but ignored
      Group3Options292R/Wused by Group 3 codec
      Group4Options293R/W 
      ResolutionUnit296R/Wused by Group 3 2d encoder
      PageNumber297R/W 
      ColorResponseUnit300 parsed but ignored
      TransferFunction301R/W 
      Software305R/W 
      DateTime306R/W 
      Artist315R/W 
      HostComputer316R/W 
      Predictor317R/Wused by LZW codec
      WhitePoint318R/W 
      PrimaryChromacities319R/W 
      ColorMap320R/W 
      TileWidth322R/Wdata i/o
      TileLength323R/Wdata i/o
      TileOffsets324R/Wdata i/o
      TileByteCounts324R/Wdata i/o
      BadFaxLines326R/W 
      CleanFaxData327R/W 
      ConsecutiveBadFaxLines328R/W 
      SubIFD330R/Wsubimage descriptor support
      InkSet332R/W 
      InkNames333R/W 
      DotRange336R/W 
      TargetPrinter337R/W 
      ExtraSamples338R/Wlots
      SampleFormat339R/W 
      SMinSampleValue340R/W 
      SMaxSampleValue341R/W 
      JPEGTables347R/Wused by JPEG codec
      YCbCrCoefficients529R/Wused by TIFFReadRGBAImage support
      YCbCrSubsampling530R/Wtile/strip size calculations
      YCbCrPositioning531R/W 
      ReferenceBlackWhite532R/W 
      Matteing32995Rnone (obsoleted by ExtraSamples tag)
      DataType32996Rnone (obsoleted by SampleFormat tag)
      ImageDepth32997R/Wtile/strip calculations
      TileDepth32998R/Wtile/strip calculations
      StoNits37439R/W 
      +

      + The Matteing and DataType + tags have been obsoleted by the 6.0 + ExtraSamples and SampleFormat tags. + Consult the documentation on the + ExtraSamples tag and Associated Alpha for elaboration. Note however + that if you use Associated Alpha, you are expected to save data that is + pre-multipled by Alpha. If this means nothing to you, check out + Porter & Duff's paper in the '84 SIGGRAPH proceedings: "Compositing Digital + Images". +

      +

      + The ImageDepth + tag is a non-standard, but registered tag that specifies + the Z-dimension of volumetric data. The combination of ImageWidth, + ImageLength, and ImageDepth, + defines a 3D volume of pixels that are + further specified by BitsPerSample and + SamplesPerPixel. The TileDepth + tag (also non-standard, but registered) can be used to specified a + subvolume "tiling" of a volume of data. +

      +

      + The Colorimetry, and CMYK tags are additions that appear in TIFF 6.0. + Consult the TIFF 6.0 specification included in the doc directory + and online. +

      +

      + The JPEG-related tag is specified in + TIFF Technical Note #2 which defines + a revised JPEG-in-TIFF scheme (revised over that appendix that was + part of the TIFF 6.0 specification). +

      +
      +

      + Last updated: $Date: 2005/12/28 06:53:18 $ +

      + + + diff --git a/src/3rdparty/libtiff/html/tools.html b/src/3rdparty/libtiff/html/tools.html new file mode 100644 index 0000000000..b1a757e7ef --- /dev/null +++ b/src/3rdparty/libtiff/html/tools.html @@ -0,0 +1,164 @@ + + + + +TIFF Tools Overview + + +

      TIFF +Tools Overview

      +

      This software distribution comes with a small collection of +programs for converting non-TIFF format images to TIFF and for +manipulating and interrogating the contents of TIFF images. Several +of these tools are useful in their own right. Many of them however +are more intended to serve as programming examples for using the +TIFF library.

      +

      Device-dependent Programs

      +There are two device-dependent programs that serve as simple +examples for writing programs to display and save TIFF images. + + + + + + + + + +
      +tiffgt    Display the contents of one or more TIFF images using OpenGL. +The software makes extensive use of the TIFFRGBAImage +facilities described elsewhere.
      tiffsvA program to save all or part of a screen dump on a Silicon +Graphics system. As for tiffgt this code, while written to +use the IRIS GL, can be easily tailored to other devices.
      +

      Device-independent Programs

      +The remaining programs should be device-independent: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      bmp2tiffConvert BMP images to TIFF
      fax2psConvert a Group 3- or Group 4- compressed TIFF to PostScript +that is significantly more compressed than is generated by +tiff2ps (unless tiff2ps writes PS Level II)
      fax2tiffConvert raw Group 3 or Group 4 facsimile data to TIFF
      gif2tiffA quick hack that converts GIF 87a (old) format images to TIFF
      pal2rgbConvert a Palette-style image to a full color RGB image by +applying the colormap
      ppm2tiffA quick hack that converts 8-bit PPM format images to TIFF
      ras2tiffA quick hack that converts Sun rasterfile format images to TIFF +-- it's less than complete
      raw2tiffCreate a TIFF file from raw data
      rgb2ycbcrConvert an RGB, grayscale, or bilevel TIFF image to a YCbCr +TIFF image; it's mainly provided for testing
      sgi2tiffA program to convert SGI image files to TIFF. This program is +only useful on SGI machines as it uses -limage.
      thumbnailCopy a bilevel TIFF to one that includes 8-bit greyscale +"thumbnail images" for each page; it is provided as an example of +how one might use the SubIFD tag (and the library support +for it)
      tiff2bwA simple program to convert a color image to grayscale
      tiff2pdfConvert TIFF images to PDF
      tiff2psConvert TIFF images to PostScript
      tiff2rgbaConvert a TIFF image to RGBA color space
      tiffcmpCompare the contents of two TIFF files (it does not check all +the directory information, but does check all the data)
      tiffcpCopy, concatenate, and convert TIFF images (e.g. switching from +Compression=5 to Compression=1)
      tiffcropProvides selection of images from within one or more multi-image +TIFF files, with orthogonal rotation, mirroring, cropping, and +extraction of multiple sections and exporting to one or more files. +It extends the functionality of tiffcp to support additional bit +depths in strips and tiles and enhances the selection capabilities of +tiffsplit. Bilevel images can be inverted and images may be split into +segments to fit on multiple /pages/ (standard paper sizes), plus other +functions described in the tiffcrop man page
      tiffditherDither a b&w image into a bilevel image (suitable for use +in creating fax files)
      tiffdumpDisplay the verbatim contents of the TIFF directory in a file +(it's very useful for debugging bogus files that you may get from +someone that claims they support TIFF)
      tiffinfoDisplay information about one or more TIFF files.
      tiffmedianA version of Paul Heckbert's median cut program that reads an +RGB TIFF image, and creates a TIFF palette file as a result
      tiffsetSet a field in a TIFF header
      tiffsplitCreate one or more single-image files from a (possibly) +multi-image file
      +

      Check out the manual pages for details about the above +programs.

      +
      +Last updated: $Date: 2009-10-28 22:13:58 $ + + diff --git a/src/3rdparty/libtiff/html/v3.4beta007.html b/src/3rdparty/libtiff/html/v3.4beta007.html new file mode 100644 index 0000000000..c535d2708d --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta007.html @@ -0,0 +1,112 @@ + + + +Changes in TIFF v3.4beta007 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • bit order was corrected for Pentium systems +
      • a new define, HOST_BIGENDIAN, was added for code that + wants to statically use information about native cpu byte order +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • the G3/G4 decoder was replaced by a new one that is faster and + has smaller state tables +
      • Niles Ritter's client tag extension hooks were added +
      • a new routine TIFFCurrentDirOffset was added for + applications that want to find out the file offset of a TIFF directory +
      • the calculation of the number of strips in an image was corected + for images with certain esoteric configurations +
      • a potential memory leak (very unlikely) was plugged +
      • the TIFFReadRGBAImage support was completely rewritten + and new, more flexible support was added for reading images into + a fixed-format raster +
      • YCbCr to RGB conversion done in the TIFFReadRGBAImage support + was optimized +
      • a bug in JPEG support calculation of strip size was corrected +
      • the LZW decoder was changed to initialize the code table to zero + to lessen potential problems that arise when invalid data is decoded +
      • tiffcomp.h is now aware of OS/2 +
      • some function prototypes in tiffio.h and tiffiop.h + that contained parameter + names have been changed to avoid complaints from certain compilers +
      + +


      + +CHANGES IN THE PORTABILITY SUPPORT: + +
        +
      • Makefile.in has been corrected to use the parameters + chosen by the configure script +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • fax2ps has been rewritten and moved over from the user + contributed software +
      • an uninitialized variable in pal2rgb has been fixed +
      • ras2tiff now converts 24-bit RGB raster data so that + samples are written in the proper order +
      • tiff2ps has been updated to include fixes + and enhancements from Alberto Accomazzi +
      • tiffcp now has a -o option to select a directory + by file offset +
      • tiffinfo is now capable of displaying the raw undecoded + image data in a file +
      • tiffgt has been rewritten to use the new TIFFRGBAImage + support and to handle multiple files +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta016.html b/src/3rdparty/libtiff/html/v3.4beta016.html new file mode 100644 index 0000000000..22f185f54b --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta016.html @@ -0,0 +1,122 @@ + + + +Changes in TIFF v3.4beta016 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • support was added for configuring the Deflate codec +
      • support was added for the HTML documentation +
      • codecs that are not configured for inclusion in the library + are no longer compiled +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • support was added for registering new codecs external to the library + and for overriding the codecs that are builtin to the library +
      • emulation support for the old DataType tag was improved +
      • suppport was added for the SMinSampleValue + and SMaxSampleValue tags +
      • the library no longer ignores TileWidth and TileLength + tags whose values are not a multiple of 16 (per the spec); this + permits old, improperly written, images to be read +
      • the support for the Predictor tag was placed in a reusable + module so that it can be shared by multiple codecs +
      • experimental compression support was added for the Deflate algorithm + (using the freely available zlib package) +
      • a new routine, TIFFWriteBufferSetup was added a la the + routine TIFFReadBufferSetup +
      • the DSO version of the library is now statically linked with the + JPEG and Deflate libraries; this means applications that link against + the DSO do not also need to link against these ancillary libraries +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • all the tools now use common code to process compress-oriented arguments +
      • tiffdump should now compile on a Macintosh with MPW +
      + +


      + +CHANGES IN THE MANUAL PAGES: + +
        +
      • everything was updated +
      + +


      + +CHANGES IN THE DOCUMENTATION: + +
        +
      • everything was updated +
      + +


      + +CHANGES IN CONTRIBUTED SOFTWARE: + +
        +
      • contrib/dbs/xtiff was made to compile +
      • contrib/mac-mpw is new support for compiling the software on + a Macintosh under MPW; consult the documentation + for details +
      • contrib/tags is information on how to use the tag extenion + facilities; consult + contrib/tags/README for details +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta018.html b/src/3rdparty/libtiff/html/v3.4beta018.html new file mode 100644 index 0000000000..ac1877fae4 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta018.html @@ -0,0 +1,84 @@ + + + +Changes in TIFF v3.4beta018 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • configure now recognizes IRIX 6.x systems +
      • configure now uses ENVOPTS when searching for an ANSI + C compiler; this fixes a problem configuring the software under + HP/UX with the native C compiler +
      • configure now correctly recognizes memory-mapped files are supported + under AIX +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • make install now properly installs the include files +
      • some portability fixes from Bjorn Brox +
      • the G3/G4 codec now warns about decoded rows that are longer than + the image/tile width +
      • changes from Frank Cringle to make the library work with the + gcc-specific bounds checking software +
      • miscellaneous fixes to TIFFPrintDirectory +
      • bug fix to correct a problem where TIFFWriteRawStrip + could not be used to automatically grow an image's length +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • fixes from Frank Cringle to update fax2tiff +
      • portability fixes to tiff2bw and tiffcmp +
      • tiffdump now uses the byte swapping routines in the library +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta024.html b/src/3rdparty/libtiff/html/v3.4beta024.html new file mode 100644 index 0000000000..25a33478fa --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta024.html @@ -0,0 +1,139 @@ + + + +Changes in TIFF v3.4beta024 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • It is now possible to setup the software to build only the + library; configure reconizes this is the intent when the + VERSION, tiff.alpha, and tif_version.c + files are in the local directory (i.e. ``.'') +
      • configure no longer tries to setup HTML materials +
      • include file directories needed in building the library are now + specified with a DIRS_LIBINC config parameter +
      • configure no longer checks for alternate compilers if CC + is set; if the specified compiler is not found or is not appropriate + the configuration procedure aborts +
      • the port.h file generated by configure is now used only by + the library and as such as have been moved to the libtiff + directory +
      • there is beginning support for building DSO's on systems other than IRIX +
      • configure now verifies the JPEG and zlib directory pathnames by + checking for well-known include files in these directories +
      • configure no longer creates the dist directory needed only + on SGI machines (for building SGI binary distributions) +
      • a bug was fixed whereby configure would incorrectly set + ENVOPTS when building the software with gcc under AIX +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • two new typedefs were added to tiff.h: int8 + and uint8 for signed and unsigned 8-bit quantities, + respectively; these are currently used only by + programs in the tools directory +
      • the BadFaxLines, CleanFaxData, and + ConsecutiveBadFaxLines tags are now supported with + Group 4 compression +
      • byte order is now correctly identified on 64-bit machines +
      • a bug was fixed in the PackBits decoder where input data would + appear short when a no-op run was present +
      • a bug was fixed in calculations with very wide strips +
      • TIFFWriteEncodedStrip and TIFFWriteRawStrip + were extended to support dynamically growing the number of + strips in an image (must set ImageLength prior to + making calls though) +
      • TIFFDefaultTileSize now rounds tile width and height + up to a multiple of 16 pixels, as required by the TIFF 6.0 specification +
      • the file version.h is now built by a new mkversion + program; this was done for portability to non-UNIX systems +
      • support was added for the Acorn RISC OS (from Peter Greenham) +
      • the builtin codec table is now made const when compiling + under VMS so that libtiff can be built as a shared library +
      • support for the PowerPC Mac (from Ruedi Boesch) +
      • support for Window NT/Window 95 (from Scott Wagner) +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • the tools no longer include port.h +
      • various portability fixes; mostly to eliminate implicit assumptions + about how long int32 data types are +
      • PostScript Level II additions to tiff2ps from Bjorn Brox +
      • sgi2tiff now handles RGBA images +
      + +


      + +CHANGES IN THE MANUAL PAGES: + +
        +
      • the documentation has been updated to reflect the current state of + the software +
      • some routines have been moved to different manual pages + to group like-routines together +
      + +


      + +CHANGES IN THE CONTRIBUTED SOFTWARE: + +
        +
      • support was added for the Acorn RISC OS (from Peter Greenham) +
      • support for Windows NT/Windows 95 contributed for a previous + version of this software was sort of incorporated (it's broken + right now) (from Scott Wagner) +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta028.html b/src/3rdparty/libtiff/html/v3.4beta028.html new file mode 100644 index 0000000000..ff7ef69a23 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta028.html @@ -0,0 +1,146 @@ + + + +Changes in TIFF v3.4beta028 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • a -noninteractive flag was added to configure to + control whether or not it prints and prompts for configuration information +
      • various typos and fixes were made in configure for the the + library-only build support (this and other configure fixes from + Richard Mlynarik <mly@adoc.xerox.com>) +
      • bugs were fixed in the handling of pathnames supplied for external + packages; e.g. DIR_JPEG +
      • the handling of SETMAKE is now done properly +
      • the default prototype function declaration for pow was corrected +
      • a bug was fixed in libtiff/Makefile.in that caused installation + to fail on systems without DSO support +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • Acorn RISC O/S support that was accidentally left out of the + left out of the previous distribution is present (from Peter Greenham) +
      • complaints about unknown and/or unsupported codecs have been + delayed until they are invoked; this permits applications to open + images and look at tags even if the image data is compressed with + an unknown/unsupported compression scheme +
      • bugs in handling unknown tags have been corrected; applications + that use multiple codecs, each with codec-specific tags, no longer + generate confusing error messages +
      • a missing pseudo-tag definition in the CCITT G3 codec was fixed + (this problem caused core dumps in the tiffcp program) +
      • pseudo-tags are now treated specially; they are always considered + to be set (i.e. they do not use bits in the FIELD_* bit-vectors). +
      • the use of strip chopping can now be controlled on a per-file basis + through a mode parameter supplied when opening a file (``C'' to + enable strip chopping and ``c'' to disable) +
      • two bugs were fixed in the writing of opposite-endian byte-order + files +
      • support was added for three new fax-related tags registered to + SGI: FaxRecvParams, FaxRecvTime, and FaxSubAddress +
      • the bit order of image data read and written can now be controlled + on a per-file basis through a mode parameter supplied when opening + a file (``B'' to force MSB2LSB bit order, ``L'' for LSB2MSB bit + order, and ``H'' for the bit order of the native CPU) +
      • the byte order of image and tag data written to newly-created files + can now be controlled on a per-file basis through a mode parameter + supplied when openening a file (``b'' to force Big-Endian byte order + and ``l'' to force Little-Endian byte order) +
      • the use memory-mapped files for images opened read-only can now + be controlled on a per-file basis through a mode parameter supplied + when opening a file (``M'' to enable use of memory-mapped files + and ``m'' to disable use) +
      • the use of the WIN32 define in tiffiop.h has + been replaced by __WIN32__ +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • fax2ps now does a save and restore + around each page of PostScript; this fixes a problem with VM + overflow when printing a many-page document on some printers +
      • a bug in the handling of 3-channel images by ras2tiff + was fixed +
      • tiffcp has new options to control the byte order of + newly created files: -B for Big-Endian byte order, -L + for Little-Endian byte order; a -M option to disable the + use of memory-mapped files, and a -C option to disable the + use of strip chopping +
      • bugs were fixed in tiffcp's handling of codec-specific tags +
      + +


      + +CHANGES IN THE MANUAL PAGES: + +
        +
      • the TIFFOpen page has been updated to reflect the new + optional open mode parameters +
      + +


      + +CHANGES IN THE CONTRIBUTED SOFTWARE: + +
        +
      • contrib/win95 contains information and code from Philippe Tenenhaus + <100423.3705@compuserve.com> + about using the software under Windows 95 +
      • contrib/winnt contains information and code from Dave Dyer + <ddyer@triple-i.com> + about using the software under Windows NT +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta029.html b/src/3rdparty/libtiff/html/v3.4beta029.html new file mode 100644 index 0000000000..f2a3d3f6aa --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta029.html @@ -0,0 +1,86 @@ + + + +Changes in TIFF v3.4beta029 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • configure now relativizes pathname references given in + -L options (as frequently specified when configuring + ancillary packages) +
      • problems related to configuring the software on Ultrix 4.4 have + been corrected +
      • the shell to use in Makefiles and scripts can now be set with the + SCRIPT_SH configuration parameter +
      • comments in config.site now correctly indicate how to setup the + use of ancillary packages +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • mods for building the software on a Mac using the + MetroWerks CodeWarrior compilers +
      • a bug in the CCITT T.4/T.6 decoder was fixed where the last codeword in + a strip/tile might not be decoded; this was seen only when decoding + multi-strip images +
      • a bug in the CCITT RLE codecs was fixed whereby the pseudo tags were not + being properly registered +
      + +


      + +CHANGES IN THE CONTRIBUTED SOFTWARE: + +
        +
      • contrib/mac-cw contains information and code from Niles Ritter + <ndr@tazboy.jpl.nasa.gov> + about building the software with the MetroWerks CodeWarrior compilers + on Macintosh systems +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta031.html b/src/3rdparty/libtiff/html/v3.4beta031.html new file mode 100644 index 0000000000..d5b7eac4f4 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta031.html @@ -0,0 +1,94 @@ + + + +Changes in TIFF v3.4beta031 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • configure now captures significantly more information + in the config.log file and provides more information when + it is unable to setup a configuration +
      • support was added for building shared libraries on more systems: + AIX, HPUX, Solaris, and Linux. +
      • a new configuration parameter LIBCOPTS was added for + passing arguments to the C compiler to use when building only + the library; this is part of the enhanced support for building + shared libraries +
      • include files for optional packages that reside in /usr/include + are now handled correctly +
      • build trees may now be configured using either relative or absolute + pathnames to the source distribution +
      • several new configuration parameters were added, mainly for building + shared libraries: DIST_MAJOR, DIST_MINOR, + DIST_ALPHA, and DSOSUF_VERSION +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • the Deflate support has been revised: it requires version 0.99 of + the zlib software distribution, the output format has changed and + is incompatible with previous versions of this library (each + strip now includes a header read and written by the zlib library) +
      • the codec name printed by the TIFFPrintDirectory routine is now + taken from the codec table instead of from a builtin table; this means + that application-defined codecs are handled correctly +
      • a new symbol was added that contains the library version number; + this can be used to do a compile-time compatibility check of the + library version +
      + +


      + +CHANGES IN THE MANUAL PAGES: + +
        +
      • the creation and installation of manual pages was redone; it now + implements the documented ``configuration scheme'' +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta032.html b/src/3rdparty/libtiff/html/v3.4beta032.html new file mode 100644 index 0000000000..bc14ef3368 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta032.html @@ -0,0 +1,90 @@ + + + +Changes in TIFF v3.4beta032 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • various fixups and subtle improvements to configure + from Richard Mlynarik +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • a new codec from Pixar designed for high-resolution color images; + note that this codec is not configured by default +
      • a bug fix for reading tags with a single FLOAT value +
      • change to the TIFFGetField calling convention: + a tag that has a single value of + type DOUBLE is now retrieved by passing a + ``double*'' instead of a + ``double**'' (this change makes the handling of tags with + DOUBLE values identical to the handling of tags with + FLOAT values) +
      • fix to VMS support for the handling of floating point values +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • tiffdump now handles tags with FLOAT and DOUBLE + values +
      + +


      + +CHANGES IN THE CONTRIBUTED SOFTWARE: + +
        +
      • updates to the Acorn OS support from Peter Greenham +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta033.html b/src/3rdparty/libtiff/html/v3.4beta033.html new file mode 100644 index 0000000000..8d8345a871 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta033.html @@ -0,0 +1,82 @@ + + + +Changes in TIFF v3.4beta033 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • support was added for building the library as a DSO under OSF/1 +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • fixes to the Pixar codec +
      • portability mods for VMS +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • fixes to gif2tiff and ppm2tiff for building under MS/DOS +
      • portability mods to fax2ps and ycbcr for VMS +
      + +


      + +CHANGES IN THE CONTRIBUTED SOFTWARE: + +
        +
      • a new package from Alexander Lehmann + for building the library and tools under MS/DOS with DJGPP v2 +
      • updated VMS support from Karsten Spang +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta034.html b/src/3rdparty/libtiff/html/v3.4beta034.html new file mode 100644 index 0000000000..77d9863b4b --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta034.html @@ -0,0 +1,68 @@ + + + +Changes in TIFF v3.4beta034 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • support was added for building the library as a DSO under NetBSD +
      • a bug was fixed in the DSO support for Linux +
      • the handling of version strings has changed slightly to simplify parsing +
      • a new parameter, TIFFLIBREF, was added to control how the + library is referenced when linking programs in the tools directory +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • DSO creation under Solaris now forces the DSO name with a -h option +
      • the interface to the mkversion program was changed + to eliminate the need to parse files +
      • a bug was fixed in the EOL-detection logic of the T.4/T.6 decoder +
      • ANSI IT8 TIFF/IT tag definitions were added to tiff.h +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta035.html b/src/3rdparty/libtiff/html/v3.4beta035.html new file mode 100644 index 0000000000..22fb2b8d0e --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta035.html @@ -0,0 +1,63 @@ + + + +Changes in TIFF v3.4beta035 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • support was added installing the HTML documentation +
      • support was added for building the library as a DSO under FreeBSD +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • the interface to the mkversion program was restored to + the form used prior to v3.4beta034 +
      • several portability problems for 16-bit systems were fixed +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.4beta036.html b/src/3rdparty/libtiff/html/v3.4beta036.html new file mode 100644 index 0000000000..e36754d364 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.4beta036.html @@ -0,0 +1,117 @@ + + + +Changes in TIFF v3.4beta036 + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • support was added for building the library as a DSO under HP-UX with + the native C compiler +
      • tools are now built with explicit pathnames for the DSO under IRIX, + Solaris, and Linux +
      • DSO configuration support for Linux was changed to require that + libc.so only be readable (not executable) +
      + +


      + +CHANGES IN LIBTIFF: + +
        +
      • support was add for ICC: NumberOfInks, and ICCProfile +
      • a memory leak caused by doing TIFFSetDirectory(0) was fixed +
      • a bug was fixed whereby certain multi-directory files were not + properly handled when accessed by mapping the data into memory +
      • the strip chopping support is now always compiled + into the library with the default usage controlled by a + STRIPCHOP_DEFAULT configuration parameter +
      • the strip chopping support no longer chops tiled images +
      • all static strings are now const--for shared libraries +
      • the logic for estimating the strip size of images without + a StripByteCounts tag was improved by handling + PlanarContig images differently from PlanarSeparate +
      • a bug was fixed in the G3 codec when converting the Y resolution + of data specified in metric units +
      • a bug was fixed in the G3/G4 decoder for data where lines terminate + with a v0 code +
      • the TIFFRGBAImage support was changed to scale 16-bit colormap + entries more conservatively to avoid problems with applications + that do not generate fully saturated pixel values +
      • the LZW decoder was changed to use a more conservative scheme when + bounds checking the hash table array; this avoids pitfalls with + systems that load objects into memory in unusual locations +
      • a bug was fixed in TIFFPrintDirectory's handling of the + InkNames tag +
      • TIFFPrintDirectory now understands NumberOfInks + and ICC-related tags +
      • the routines for reading image data now provide more useful information + when a read error is encountered +
      • support was added for compiling with Microsoft Visual C++ 4.0 +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • a bug was fixed in pal2rgb's colormap handling +
      • tiff2ps now includes John Wehle's changes for maintaining + the aspect ratio + of images when scaling and for honoring the deadzone on a page when + generating PostScript Level II +
      • tiff2ps does a better job guarding against the mishandling + of greyscale images +
      • tiff2ps now correctly converts X- and Y-resolution values + specified in metric units +
      • tiffdump has a new -m option to control the maximum + number of indirect + data values printed for a tag (by default 24) +
      • tiffdump understands several new tags +
      • tiffdump now shows any terminating null in ASCII strings +
      • tiffinfo now suppresses strip chopping when interpreting an image; + a new -z option has been added to enable strip chopping +
      + + TIFF home page.
      + +
      + +
      +Sam Leffler / sam@engr.sgi.com +Last updated $Date: 1999/08/09 20:21:21 $. +
      + + + diff --git a/src/3rdparty/libtiff/html/v3.5.1.html b/src/3rdparty/libtiff/html/v3.5.1.html new file mode 100644 index 0000000000..0c88de9547 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.5.1.html @@ -0,0 +1,75 @@ + + + +Changes in TIFF v3.5.1 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • None of consequence +
      + +


      + +CHANGES IN LIBTIFF: + + +
        +
      • Support was added for IPTC Newsphoto metadata (TIFFTAGE_IPTCNEWSPHOTO) +
      • Support was added for photoshop caption handling (TIFFTAG_PHOTOSHOP) +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • Bill Radcliffe's iptcutil was +added to the "contrib" subdirectory . It can convert an IPTC binary +blob to ASCII text and vice-versa. The blob itself can be extracted +from or added to an image with the ImageMagick convert(1) +utility. +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2006/01/03 01:42:30 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.5.2.html b/src/3rdparty/libtiff/html/v3.5.2.html new file mode 100644 index 0000000000..71b486a6f4 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.5.2.html @@ -0,0 +1,108 @@ + + + +Changes in TIFF v3.5.2 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      + +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • Corrected alpha versioning. + +
      • Removed distinction between alpha and release targets in Makefile.in. + +
      • Added release.stamp target, which tags cvs tree, and updates + "RELEASE-DATE" + +
      • Added releasediff target, which diffs tree with source as of + date in "RELEASE-DATE" + +
      • Ticked up version to 3.5.2 (alpha 01 -- but I think we'll moving + away from alpha/non-alpha distinctions). + +
      + +


      + +CHANGES IN LIBTIFF: + + +
        +
      • Added IRIX/gcc, and OSF/1 4.x support on behalf of + Albert Chin-A-Young + +
      • Added TIFFReassignTagToIgnore() API on behalf of + Bruce Cameron . Man page still pending. + +
      • pre-remove so link before softlink in LINUXdso action in + libtiff/Makefile.in to avoid failure on LINUXdso builds other than + the first. + +
      • Fixed problem with cvtcmap() in tif_getimage.c modifying the + colormaps owned by the TIFF handle itself when trying to fixup wrong + (eight bit) colormaps. Corrected by maintaining a private copy of + the colormap. + +
      • Added TIFFReadRGBATile()/TIFFReadRGBAStrip() support in + tif_getimage.c. + +
      • Applied "a" mode fix to tif_win32.c/TIFFOpen() as suggested + by Christopher Lawton + +
      • Set O_BINARY for tif_unix.c open() ... used on cygwin for instance. + +
      • Added CYGWIN case in configure. + +
      • Applied Francois Dagand's patch to handle fax decompression bug. + (sizes >= 65536 were failing) +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • Added addtiffo (add overviews to a TIFF file) in contrib. Didn't + put it in tools since part of it is in C++. +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2004/11/26 14:37:20 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.5.3.html b/src/3rdparty/libtiff/html/v3.5.3.html new file mode 100644 index 0000000000..e7910d9b7a --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.5.3.html @@ -0,0 +1,132 @@ + + + +Changes in TIFF v3.5.3 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +The ChangeLog will follow, but please note the most important change: +LZW compression has been removed. +

      +Unisys has the patent on LZW compression and have been very active in +their enforcement of late, demanding payments of $5000 or more from +websites using unlicensed software to create GIF's. They could well +do the same do persons using libtiff to create LZW compressed TIFF +images. +

      +From Burn All GIF's Day: +
      +The catch is that it appears to be difficult or impossible to get a +Unisys license to use LZW in free software that complies with the Open +Source Definition +

      +Unfortunatly, the removal of LZW compression means that saved image size has +grown dramatically. Without a change in the TIFF spec to support +another lossless compression format, this is unavoidable. +

      +The library can use zip for lossless compression, but as this is not +part of the spec, TIFFs using zip compression may not work with other +software +

      +We will be making a patch available that will contain the LZW +compression code for users who have either obtained a license from +Unisys or are willing to risk it. +

      +LZW decompression is unchanged. +

      +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • Added zip creation to release makefile target + + +
      + +


      + +CHANGES IN LIBTIFF: + + +
        + +
      • Added html for TIFFWriteTile.3t man page. + +
      • Added some changes to tif_write.c to support rewriting existing + fixed sized tiles and strips. Code mods disabled by default, only + enabled if REWRITE_HACK is defined for now. + +
      • Added TIFFWriteTile.3t man page. + +
      • Added notes on use of makefile.vc in build.html, and fixed + email subscription address. + +
      • Fixed apocalypse-inducing y2k bug in contrib/ras/ras2tiff.c + +
      • Did some casts cleaning up to reduce compiler warnings in tif_fax3.c, + from Bruce Carmeron -- modifications of + changes made by Frank (sun cc still complained on cast). + +
      • fixed various VC++ warnings as suggested by Gilles Vollant + . + +
      • Modified TIFFquery.3t man pages info on TIFFIsByteSwapped() to + not imply applications are responsible for image data swapping. + +
      • HTML-ized the man pages, added to html/man + +
      • Removed LZW Compression to comply with Unisys patent extortion. + +
      • Corrected one remaining 16 -> 32 bit value in tif_fax3.c, + From Ivo Penzar Added patch from Ivo Penzar to have TiffAdvanceDirectory handle + memory mapped files. +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • Fixed apocalypse-inducing y2k bug in contrib/ras/ras2tiff.c +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2004/11/26 14:37:20 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.5.4.html b/src/3rdparty/libtiff/html/v3.5.4.html new file mode 100644 index 0000000000..714621e0c8 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.5.4.html @@ -0,0 +1,88 @@ + + + +Changes in TIFF v3.5.4 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • None + + +
      + +


      + +CHANGES IN LIBTIFF: + + +
        + +
      • Added Pixar tag support. Contributed by Phil Beffery + +
      • Made one more change to tif_dir.c for removal of LZW compression. Also added notice + when LZW compression invoked. + +
      • Fixed bug that caused LZW (non) compression to segfault. Added + warning about LZW compression removed being removed, and why. + +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • Changed default compression in tools to TIFF_PACKBITS, and changed usage descriptions + in tools to reflect removal of LZW compression + +
      • Added nostrip to install in tools/Makefile.in so that debugging + symbols are kept. + +
      • Made Packbits the default compression in tools/tiff2rgba.c instead + of LZW. + + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2006/01/03 01:45:41 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.5.5.html b/src/3rdparty/libtiff/html/v3.5.5.html new file mode 100644 index 0000000000..20be92f8ec --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.5.5.html @@ -0,0 +1,155 @@ + + + +Changes in TIFF v3.5.5 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        + +
      • configure: added test for libc6 for linux targets. Bug reported by + Stanislav Brabec + +
      • configure: fixed bugs in sed scripts + (applied sed script s:/@:s;@:;s:/s;;:;: to configure). + fix submitted by Stanislav Brabec + +
      • tools/iptcutil was not in files list, and wasn't being + added to tar archive. Updated Makefile.in. + +
      • Added 3.5 docs to html/Makefile.in. + Thanks to Stanislav Brabec + +
      • Fixed tools/tiffcmp so that stopondiff testing works. + Patch care of Joseph Orost . + +
      • Added fax3sm_winnt.c to distribution list in Makefile.in. + +
      • Added libtiff/libtiff.def to TIFFILES distribution list. +
      + +


      + +CHANGES IN LIBTIFF: + + +
        +
      • tif_fax3.c: Fixed serious bug introduced during the uint16->uint32 + conversion for the run arrays. + +
      • Set td_sampleformat default to SAMPLEFORMAT_UINT instead of + SAMPLEFORMAT_VOID in TIFFDefaultDirectory() in tif_dir.c. + +
      • Added "GetDefaulted" support for TIFFTAG_SAMPLEFORMAT in tif_aux.c. + +
      • Patched tif_fax3.c so that dsp->runs is allocated a bit bigger + to avoid overruns encountered with frle_bug.tif. + + +
      • Modified tif_unix.c to support 2-4GB seeks if USE_64BIT_API is + set to 1, and added default (off) setting in tiffconf.h. This + should eventually be set by the configure script somehow. + + The original work on all these 2-4GB changes was done by + Peter Smith (psmith@creo.com). + +
      • Modified tif_win32.c to support 2-4GB seeks. + +
      • tentatively changed toff_t to be unsigned instead of signed to + facilitate support for 2-4GB files. + +
      • Updated a variety of files to use toff_t. Fixed some mixups + between toff_t and tsize_t. + +
      • Set tif_rawdatasize to zero when freeing raw data buffer in + TIFFWriteDirectory(). + +
      • Enabled "REWRITE_HACK" in tif_write.c by default. + +
      • Fix bug in tif_write.c when switching between reading one directory + and writing to another. + +
      • Made TIFFWriteCheck() public, and added TIFFCreateDirectory() + +
      • Added TIFFmemory(3t) functions to libtiff.def. + +
      • Added libtiff/libtiff.def to TIFFILES distribution list. +
      + +


      + +CHANGES IN THE TOOLS: + +
        +
      • fax2ps: Fixed mixup of width and height in bounding box statement + as per submission by Nalin Dahyabhai . + +
      • fax2ps: Modified printruns to take uint32 instead of uint16. + Patch courtesy of Bernt Herd + + +
      • Largely reimplemented contrib/addtiffo to avoid temp files, + updating the TIFF file in place. Fixed a few other bugs to. + +
      • Altered descriptions in tools to reflect "by default" lzw not supported +
      + +


      + +CHANGES IN THE LZW COMPRESSION KIT +
        +
      • created mangle-src.sh -- sed scripts to munge src into LZW enabled format. Thanks to Stanislav Brabec + +
      • created Makefile + +
      • merged tif_dir.c with current source. + + +
      • Created lzw compression kit, as a new CVS module (libtiff-lzw-compression-kit). + +
      • Updated index.html to note lzw compression kit. + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2004/11/26 14:37:20 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.5.6-beta.html b/src/3rdparty/libtiff/html/v3.5.6-beta.html new file mode 100644 index 0000000000..682f845baa --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.5.6-beta.html @@ -0,0 +1,185 @@ + + + +Changes in TIFF v3.5.6 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        + +
      • Added GNULDdso target and switched linux and freebsd to use it. +
      • tools/Makefile.in: Modified to install properly on SGI. +
      • configure: Fixed DSO test for Linux as per patch from + Jan Van Buggenhout . + +
      + +


      + +CHANGES IN LIBTIFF: + + +
        + +
      • tif_dir.c: Clear TIFF_ISTILED flag in TIFFDefaultDirectory + as per http://bugzilla.remotesensing.org/show_bug.cgi?id=18 + from vandrove@vc.cvut.cz. + +
      • Modified tif_packbits.c decoding to avoid overrunning the + output buffer, and to issue a warning if data needs to be + discarded. See http://bugzilla.remotesensing.org/show_bug.cgi?id=18 + +
      • Modified TIFFClientOpen() to emit an error on an attempt to + open a comperessed file for update (O_RDWR/r+) access. This is + because the compressor/decompressor code gets very confused when + the mode is O_RDWR, assuming this means writing only. See + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=13 + +
      • Applied patch for 0x0000 sequences in tif_fax3.h's definition + of EXPAND1D() as per bug 11 (from Roman). + +
      • Fixed tiffcomp.h to avoid win32 stuff if unix #defined, to improve + cygwin compatibility. + +
      • Applied patch from Roman Shpount to tif_fax3.c. This seems to + be a proper fix to the buffer sizing problem. See + http://bugzilla.remotesensing.org/show_bug.cgi?id=11 + +
      • Fixed tif_getimage.c to fix overrun bug with YCbCr images without + downsampling. http://bugzilla.remotesensing.org/show_bug.cgi?id=10 + Thanks to Nick Lamb for reporting the + bug and proving the patch. + +
      • Fixed tif_jpeg.c so avoid destroying the decompressor before + we are done access data thanks to bug report from: + Michael Eckstein . + +
      • tif_open.c: Don't set MMAP for O_RDWR files. + +
      • tif_open.c: Set STRIPCHOP_DEFAULT for O_RDWR as well as O_RDONLY + so that files opened for update can be strip chopped too. + +
      • tif_read.c: fixed up bug with files missing rowsperstrip and + the strips per separation fix done a few weeks ago. + +
      • Tentatively added support for SAMPLEFORMAT_COMPLEXIEEEFP, and + SAMPLEFORMAT_COMPLEXINT. + +
      • index.html, bugs.html: added bugzilla info. + +
      • tif_read.c: fix subtle bug with determining the number of + rows for strips that are the last strip in a separation but + not the last strip of all in TIFFReadEncodedStrip(). + +
      • Applied 16/32 bit fix to tif_fax3.c. Fix supplied by + Peter Skarpetis + +
      • Modified tiffio.h logic with regard to including windows.h. It + won't include it when building with __CYGWIN__. + +
      • README: update to mention www.libtiff.org, don't list Sam's old + email address. + +
      • libtiff/tif_dirread.c: Don't use estimate strip byte count for + one tile/strip images with an offset, and byte count of zero. These + could be "unpopulated" images. + +
      • tif_win32.c: Applied patch to fix overreads and ovverwrites + caught by BoundsChecker. From Arvan Pritchard + (untested). + +
      • tif_getimage.c: Applied patch to silence VC6 warnings. From + Arvan Pritchard + +
      • tif_lzw.c: Applied patch to silence VC6 warnings. From + Arvan Pritchard + +
      • libtiff/tif_apple.c: Applied "Carbon" support patches supplied by + Leonard Rosenthol . May interfere + with correct building on older systems. If so, please let me know. + + +
      + +


      + +CHANGES IN THE TOOLS: + +
        + +
      • tools/rgb2ycbcr.c: fixed output strip size to account for vertical + roundup if rows_per_strip not a multiple of vertical sample size. + +
      • tools/tiffsplit.c: Copy TIFFTAG_SAMPLEFORMAT. + +
      • Modified tiff2bw to ensure portions add to 100%, and that + white is properly recovered. See bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=15 Patch + c/o Stanislav Brabec + +
      + +


      + +CHANGES IN CONTRIB: + +
        + +
      • contrib/addtiffo: Added "averaging" resampling option. + +
      • Added contrib/stream (stream io) code submitted by Avi Bleiweiss. + +
      + +


      + +CHANGES IN THE LZW COMPRESSION KIT +
        + +
      • updated tif_dir.c to reflect changes to no-lzw tif_dir.c + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2006/03/18 17:12:47 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.5.7.html b/src/3rdparty/libtiff/html/v3.5.7.html new file mode 100644 index 0000000000..528df74e6e --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.5.7.html @@ -0,0 +1,259 @@ + + + +Changes in TIFF v3.5.7 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • libtiff/libtiff.def: Brent Roman submitted new version adding +serveral missing entry points. Also add a few other entry points +later. + +
      • configure, Makefile.in, etc: added support for OPTIMIZER being + set from config.site. +
      • config.guess: updated wholesale to an FSF version apparently + from 1998 (as opposed to 1994). This is mainly inspired by + providing for MacOS X support. + +
      • configure/config.site: modified to check if -lm is needed for + MACHDEPLIBS if not supplied by config.site. Needed for Darwin. +
      • libtiff/tiff.h: Applied hac to try and resolve the problem + with the inttypes.h include file on AIX. (Bug 39) + +
      • configure, *Makefile.in: Various changes to improve configuration + for HP/UX specifically, and also in general. (Bug 40) They include: +
          +
        • Try to handle /usr/bin/sh instead of /bin/sh where necessary. +
        • Upgrade to HP/UX 10.x+ compiler, linker and dso options. +
        • Fixed mmap() test to avoid MMAP_FIXED ... it isn't available on HP +
        • Use -${MAKEFLAGS} in sub makes from makefiles. +
        • Fixed SCRIPT_SH/SHELL handling. +
        +
      • configure: Changes for DSO generation on AIX provided by + John Marquart . + +
      • configure, libtiff/Makefile.in: Modified to build DSOs properly + on Darwin thanks to Robert Krajewski (rpk@alum.mit.edu) and + Keisuke Fujii (fujiik@jlcuxf.kek.jp). + +
      • configure, libtiff/Makefile.in: applied OpenBSD patches as per bug 61. + +
      • Makefile.in: added DESTDIR support as per bug 60. + +
      • libtiff/tif_jpeg.c: Define HAVE_BOOLEAN on windows if RPCNDR.H + has been included. +
      • man/Makefile.in: add TIFFClientOpen link as per debian submitted + bug 66. +
      • libtiff/Makefile.in: Fixed @DSOSUB_VERSION to be @DSOSUF_VERSION@ + in two places. +
      + +


      + + + +CHANGES IN LIBTIFF: + + +
        +
      • tif_fax3.c: keep rw_mode flag internal to fax3 state to remember + whether we are encoding or decoding. This is to ensure graceful + recovery if TIFFClientOpen() discovers an attempt to open a compressed + file for "r+" access, and subsequently close it, as it resets the + tif_mode flag to O_RDONLY in this case to avoid writes, confusing the + compressor's concept of whether it is in encode or decode mode. +
      • tif_luv.c/tiff.h/tiffio.h: + New version of TIFF LogLuv (SGILOG) modules contributed by Greg Ward + (greg@shutterfly.com). He writes: + +
          +
        1. I improved the gamut-mapping function in tif_luv.c for imaginary + colors, because some images were being super-saturated on the input + side and this resulted in some strange color shifts in the output. + +
        2. I added a psuedotag in tiff.h to control random dithering during + LogLuv encoding. This is turned off by default for 32-bit LogLuv and + on for 24-bit LogLuv output. Dithering improves the average color + accuracy over the image. + +
        3. I added a #define for LOG_LUV_PUBLIC, which is enabled by default in + tiffio.h, to expose internal routines for converting between LogLuv and + XYZ coordinates. This is helpful for writing more efficient, + specialized conversion routines, especially for reading LogLuv files. +
        + +
      • libtiff/tif_dirinfo.c: don't declare tiffFieldInfo static on VMS. + +
      • Added TIFFTAG_COPYRIGHT support. +
      • tif_getimage.c: Added support for 16bit minisblack/miniswhite + images in RGBA interface. +
      • libtiff/tif_dirinfo.c: removed duplicate TIFFTAG_PHOTOSHOP as per + bug 44. +
      • libtiff/tif_dirwrite.c: Added support for TIFF_VARIABLE2 in the + case of writing TIFF_BYTE/TIFF_SBYTE fields as per bug 43. + +
      • libtiff/tif_dirinfo.c: Modified the TIFF_BYTE definition for + TIFFTAG_PHOTOSHOP to use a writecount of TIFF_VARIABLE2 (-3) to + force use of uint32 counts instead of short counts. + +
      • libtiff/tif_dirinfo.c: moved pixar and copyright flags to + ensure everything is in order. + +
      • Integrated experimental OJPEG support from Scott Marovich of HP. + +
      • libtiff/tif_open.c: Seek back to zero after failed read, + before writing header. + +
      • libtiff/tiff.h, libtiff/tif_fax3.c: added check for __LP64__ + when checking for 64 bit architectures as per bugzilla bug 67. +
      • libtiff/tif_getimage.c: Use memmove() instead of TIFFmemcpy() + in TIFFReadRGBATile() to avoid issues in cases of overlapping + buffers. See Bug 69 in Bugzilla. +
      • libtiff/tif_getimage.c: Don't complain for CMYK (separated) + images with more than four samples per pixel as per bug 73. + +
      • libtiff/tif_getimage.c: relax handling of contig case where +there are extra samples that are supposed to be ignored as per bug 75. This +should now work for 8bit greyscale or palletted images. + +
      • libtiff/tif_packbits.c: fixed memory overrun error as per bug 77. + +
      • libtiff/tif_getimage.c: Fixed problem with reading strips or +tiles that don't start on a tile boundary. Fix contributed by +Josep Vallverdu (from HP), and further described in bug 47. + +
      • libtif/tif_fax3.c: Removed #ifdef PURIFY logic, and modified to + always use the "safe" version, even if there is a very slight + cost in performance as per bug 54. +
      • libtiff/tif_lzw.c: added dummy LZWSetupEncode() to report an + error about LZW not being available. + +
      • libtiff/tif_dir.c: propagate failure to initialize compression + back from TIFFSetField() as an error status, so applications can + detect failure. + +
      • libtiff/tif_lzw.c: Avoid MS VC++ 5.0 optimization bug as per bug 78. + +
      • libtiff/tif_dirwrite.c: added TIFFRewriteDirectory() function. +Updated TIFFWriteDirectory man page to include TIFFRewriteDirectory. + +
      • libtiff/tiff.h: I have created COMPRESSION_CCITT_T4, + COMPRESSION_CCITT_T6, TIFFTAG_T4OPTIONS and TIFFTAG_T6OPTIONS aliases + in keeping with TIFF 6.0 standard in tiff.h as per bug 83. + +
      • Added PHOTOMETRIC_ITULAB as per bug 90. + +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        +
      • Brent Roman contributed updated tiffcp utility (and tiffcp.1) + with support for extracting subimages with the ,n syntax, and also + adding the -b bias removal flag. +
      • tiff2ps.c/tiff2ps.1: Substantial changes to tiff2ps by + Bruce A. Mallett, including a faster encoder, fixes for level + 2 PostScript, and support for the imagemask operator. +
      • fax2ps.c: Helge (libtiff at oldach.net) submitted fix +that corrects behaviour for non-Letter paper +sizes. (Bug 35) It fixes two problems: +
        + Without scaling (-S) the fax is now centered on the page size specified + with -H and/or -W. Before, fax2ps was using an obscure and practially + useless algorithm to allocate the image relative to Letter sized paper + which sometime sled to useless whitespace on the paper, while at the + same time cutting of the faxes printable area at the opposite border. +
        + + Second, scaling now preserves aspect ratio, which makes unusual faxes + (in particular short ones) print properly. + +
      • thumbnail.c: changed default output compression + to packbits from LZW since LZW isn't generally available. +
      • tiff2rgba.c: added -n flag to avoid emitting alpha component. Also added +a man page for tiff2rgba. + +
      • tiffcmp.c: Fixed multi samples per pixel support for ContigCompare +as per bug 53. +Updated bug section of tiffcmp.1 to note tiled file issues. + +
      • libtiff/tif_getimage.c: Fixed so that failure is properly + reported by gtTileContig, gtStripContig, gtTileSeparate and + gtStripSeparate as per bug 51. + + +
      + +


      + + + +CHANGES IN THE LZW COMPRESSION KIT: +
        +
      • Rewrote lzw patching process so that is required to enable full + LZW support is to drop the tif_lzw.c from the + libtiff-lzw-compression-kit over the one in the libtiff directory. + +
      • Some changes were made to make recovery from failure to + initialize the LZW compressor more graceful. + +
      • Note that as distributed libtiff support LZW decompression, but + not LZW compression. +
      + + + +CHANGES IN THE CONTRIB AREA: +
        +
      • Fixed distribution to include contrib/addtiffo/tif_ovrcache.{c,h}. +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2004/11/26 14:37:20 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.6.0.html b/src/3rdparty/libtiff/html/v3.6.0.html new file mode 100644 index 0000000000..888e5472e7 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.6.0.html @@ -0,0 +1,434 @@ + + + +Changes in TIFF v3.6.0 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • New utility raw2tiff +for converting raw rasters into TIFF files. +
      • Lots of new tiff2ps options. +
      • Lots of new fax2tiff options. +
      • Lots of bug fixes for LZW, JPEG and OJPEG compression. +
      + +

      Custom Tag Support

      + +The approach to extending libtiff with custom tags has changed radically. +Previously, all internally supported TIFF tags had a place in the +private TIFFDirectory structure within libtiff to hold the values (if read), +and a "field number" (ie. FIELD_SUBFILETYPE) used to identify that tag. +However, every time a new tag was added to the core, the size of the +TIFFDirectory structure would changing, breaking any dynamically linked +software that used the private data structures.

      + +Also, any tag not recognised +by libtiff would not be read and accessable to applications without some +fairly complicated work on the applications part to pre-register the tags +as exemplified by the support for "Geo"TIFF tags by libgeotiff layered on +libtiff.

      + +Amoung other things this approach required the extension code +to access the private libtiff structures ... which made the higher level +non-libtiff code be locked into a specific version of libtiff at compile time. +This caused no end of bug reports!

      + +The new approach is for libtiff to read all tags from TIFF files. Those that +aren't recognised as "core tags" (those having an associated FIELD_ value, +and place for storage in the TIFFDirectory structure) are now read into a +dynamic list of extra tags (td_customValues in TIFFDirectory). When a new +tag code is encountered for the first time in a given TIFF file, a new +anonymous tag definition is created for the tag in the tag definition list. +The type, and some other metadata is worked out from the instance encountered. +These fields are known as "custom tags".

      + +Custom tags can be set and fetched normally using TIFFSetField() and +TIFFGetField(), and appear pretty much like normal tags to application code. +However, they have no impact on internal libtiff processing (such as +compression). Some utilities, such as tiffcp will now copy these custom +tags to the new output files.

      + +As well as the internal work with custom tags, new C API entry points +were added so that extension libraries, such as libgeotiff, could +define new tags more easily without accessing internal data structures. +Because tag handling of extension tags is done via the "custom fields" +mechanism as well, the definition provided externally mostly serves to provide +a meaningful name for the tag. + +The addition of "custom tags" and the altered approach to extending libtiff +with externally defined tags is the primary reason for the shift to the +3.6.x version number from 3.5.x.

      + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • configure, config.site: Fix for large files (>2GiB) support. New +option in the config.site: LARGEFILE="yes". Should be enougth for the large +files I/O. + +
      • configure: Set -DPIXARLOG_SUPPORT option along with -DZIP_SUPPORT. + +
      • html/Makefile.in: Updated to use groffhtml for generating html pages +from man pages. + +
      • configure, libtiff/Makefile.in: Added SCO OpenServer 5.0.6 support +from John H. DuBois III. + +
      • libtiff/{Makefile.vc, libtiff.def}: Missed declarations added. + +
      • libtiff/Makefile.in, tools/Makefile.in: Shared library will not be +stripped when installing, utility binaries will do be stripped. As per bug 93. + +
      • man/Makefile.in: Patch DESTDIR handling as per bug 95. + +
      • configure: OpenBSD changes for Sparc64 and DSO version as per bug 96. + +
      • config.site/configure: added support for OJPEG=yes option to enable +OJPEG support from config.site. + +
      • config.guess, config.sub: Updated from ftp.gnu.org/pub/config. + +
      • configure: Modify CheckForBigEndian so it can work in a cross +compiled situation. + +
      • configure, libtiff/Makefile.in: Changes for building on MacOS 10.1 +as per bug 94. + +
      • html/Makefile.in: added missing images per bug 92. + +
      • port/Makefile.in: fixed clean target per bug 92. +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        + +
      • libtiff/tif_getimage.c: New function TIFFReadRGBAImageOriented() +implemented to retrieve raster array with user-specified origin position. + +
      • libtiff/tif_fax3.c: Fix wrong line numbering. + +
      • libtiff/tif_dirread.c: Check field counter against number of fields. + +
      • Store a list of opened IFD to prevent directory looping. + +
      • libtiff/tif_jpeg.c: modified segment_height calculation to always +be a full height tile for tiled images. Also changed error to just +be a warning. + +
      • libtiff/tif_lzw.c: fixed so that decoder state isn't allocated till +LZWSetupDecode(). Needed to read LZW files in "r+" mode. + +
      • libtiff/tif_dir.c: fixed up the tif_postdecode settings responsible +for byte swapping complex image data. + +
      • libtiff/tif_open.c: Removed error if opening a compressed file +in update mode bug (198). + +
      • libtiff/tif_write.c: TIFFWriteCheck() now fails if the image is +a pre-existing compressed image. That is, image writing to pre-existing +compressed images is not allowed. + +
      • html/man/*.html: Web pages regenerated from man pages. + +
      • libtiff/tif_jpeg.c: Hack to ensure that "boolean" is defined properly +on Windows so as to avoid the structure size mismatch error from libjpeg +(bug 188). + +
      • libtiff/tiff.h: #ifdef USING_VISUALAGE around previous Visual Age +AIX porting hack as it screwed up gcc. (bug 39) + +
      • libtiff/tiff.h: added COMPRESSION_JP2000 (34712) for LEAD tools +custom compression. + +
      • libtiff/tif_dirread.c: Another fix for the fetching SBYTE arrays +by the TIFFFetchByteArray() function. (bug 52) + +
      • libtiff/tif_dirread.c: Expand v[2] to v[4] in TIFFFetchShortPair() +as per bug 196. + +
      • libtiff/tif_lzw.c: Additional consistency checking added in +LZWDecode() and LZWDecodeCompat() fixing bugs 190 and 100. + +
      • libtiff/tif_lzw.c: Added check for valid code lengths in LZWDecode() +and LZWDecodeCompat(). Fixes bug 115. + +
      • tif_getimage.c: Ensure that TIFFRGBAImageBegin() returns the +return code from the underlying pick function as per bug 177. + +
      • libtiff/{tif_jpeg.c,tif_strip.c,tif_print.c}: Hacked tif_jpeg.c to +fetch TIFFTAG_YCBCRSUBSAMPLING from the jpeg data stream if it isn't +present in the tiff tags as per bug 168. + +
      • libtiff/tif_jpeg.c: Fixed problem with setting of nrows in +JPEGDecode() as per bug 129. + +
      • libtiff/tif_read.c, libtiff/tif_write.c: TIFFReadScanline() and +TIFFWriteScanline() now set tif_row explicitly in case the codec has +fooled with the value as per bug 129. + +
      • libtiff/tif_ojpeg.c: Major upgrade from Scott. Details in bug 156. + +
      • libtiff/tif_open.c: Pointers to custom procedures +in TIFFClientOpen() are checked to be not NULL-pointers. + +
      • libtiff/tif_lzw.c: Assertions in LZWDecode and LZWDecodeCompat +replaced by warnings. Now libtiff should read corrupted LZW-compressed +files by skipping bad strips as per bug 100. + +
      • libtiff/: tif_dirwrite.c, tif_write.c, tiffio.h: +TIFFCheckpointDirectory() +routine added as per bug 124. The +TIFFWriteDirectory +man page discusses this new function as well as the related +TIFFRewriteDirectory(). + +
      • libtiff/: tif_codec.c, tif_compress.c, tiffiop.h, tif_getimage.c: +Introduced +additional members tif->tif_decodestatus and tif->tif_encodestatus +for correct handling of unconfigured codecs (we should not try to read +data or to define data size without correct codecs). See bug 119. + +
      • tif_dirread.c: avoid div-by-zero if rowbytes is zero in chop func as +per bug 111. + +
      • libtiff/: tiff.h, tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, +tif_dirwrite.c: Dwight Kelly added get/put code for new tag XMLPACKET as +defined in Adobe XMP Technote. Added missing INKSET tag value from TIFF 6.0 +spec INKSET_MULTIINK (=2). Added missing tags from Adobe TIFF technotes: +CLIPPATH, XCLIPPATHUNITS, YCLIPPATHUNITS, OPIIMAGEID, OPIPROXY and +INDEXED. Added PHOTOMETRIC tag value from TIFF technote 4 ICCLAB (=9). + +
      • libtiff/tif_getimage.c: Additional check for supported codecs added in +TIFFRGBAImageOK, TIFFReadRGBAImage, TIFFReadRGBAStrip and TIFFReadRGBATile now +use TIFFRGBAImageOK before reading a per bug 110. + +
      • libtiff/: tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, +tif_dirwrite.c: Added routine +TIFFDataWidth for determining +TIFFDataType sizes instead of working with tiffDataWidth array +directly as per bug 109. + +
      • libtiff/: tif_dirinfo.c, tif_dirwrite.c: Added possibility to +read broken TIFFs with LONG type used for TIFFTAG_COMPRESSION, +TIFFTAG_BITSPERSAMPLE, TIFFTAG_PHOTOMETRIC as per bug 99. + +
      • libtiff/{tiff.h,tif_fax3.c}: Add support for __arch64__ as per bug 94. + +
      • libtiff/tif_read.c: Fixed TIFFReadEncodedStrip() to fail if the +decodestrip function returns anything not greater than zero as per bug 97. + +
      • libtiff/tif_jpeg.c: fixed computation of segment_width for +tiles files to avoid error about it not matching the +cinfo.d.image_width values ("JPEGPreDecode: Improper JPEG strip/tile +size.") for ITIFF files. Apparently the problem was incorporated since +3.5.5, presumably during the OJPEG/JPEG work recently. + +
      • libtiff/tif_getimage.c: If DEFAULT_EXTRASAMPLE_AS_ALPHA is 1 +(defined in tiffconf.h - 1 by default) then the RGBA interface +will assume that a fourth extra sample is ASSOCALPHA if the +EXTRASAMPLE value isn't set for it. This changes the behaviour of +the library, but makes it work better with RGBA files produced by +lots of applications that don't mark the alpha values properly. +As per bugs 93 and 65. + +
      • libtiff/tif_jpeg.c: allow jpeg data stream sampling values to +override those from tiff directory. This makes this work with +ImageGear generated files. + +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        + +
      • tiff2ps: Added page size setting +when creating PS Level 2. + +
      • tiff2ps: Fixed PS comment emitted when +FlateDecode is being used. + +
      • tiffsplit: increased the maximum +number of pages that can be split. + +
      • raw2tiff: Added option `-p' to +explicitly select color space of input image data. + +
      • tiffmedian: Suppiort for large +(> 2GB) images. + +
      • ppm2tiff: Fixed possible endless loop. + +
      • tiff2rgba: Switched to use +TIFFReadRGBAImageOriented() +instead of TIFFReadRGBAImage(). + +
      • tiffcmp: Fixed problem with unused data +comparing (bug 349). `-z' option now can be used to set the number of reported +different bytes. + +
      • tiffcp: Added possibility to specify +value -1 to -r option to get the entire image as one strip (bug 343). + +
      • tiffcp: Set the correct RowsPerStrip +and PageNumber values (bug 343). + +
      • fax2tiff: Page numbering fixed (bug +341). + +
      • ppm2tiff: PPM header parser improved: +now able to skip comments. + +
      • tiff2ps: Force deadzone printing when +EPS output specified (bug 325). + +
      • tiff2ps: Add ability to generate +PS Level 3. It basically allows one to use the /flateDecode filter for ZIP +compressed TIFF images. Patch supplied by Tom Kacvinsky (bug 328). + +
      • tiffcp: Fixed problem with colorspace +conversion for JPEG encoded images (bugs 23 and 275) + +
      • fax2tiff: Applied patch from +Julien Gaulmin. More switches for fax2tiff tool for better control +of input and output (bugs 272 and 293). + +
      • raw2tiff: +New utility for turning raw raster images into TIFF files +written by Andrey Kiselev. + +
      • tiff2ps: +Sebastian Eken provided patches (bug 200) to add new these new +switches: +
          +
        • -b #: for a bottom margin of # inches +
        • -c: center image +
        • -l #: for a left margin of # inches +
        • -r: rotate the image by 180 degrees +
        + +Also, new features merged with code for shrinking/overlapping. + +
      • tiff2ps: Don't emit BeginData/EndData +DSC comments since we are unable to properly include the amount to skip +as per bug 80. + +
      • tiff2ps: Added workaround for some +software that may crash when last strip of image contains fewer number +of scanlines than specified by the `/Height' variable as per bug 164. + +
      • tiff2ps: Patch from John Williams to add new +functionality for tiff2ps utility splitting long images in several pages as +per bug 142. New switches: +
          +
        • -H #: split image if height is more than # inches +
        • -L #: overLap split images by # inches +
        + +
      • tiff2ps: New commandline +switches to override resolution units obtained from the input file per bug 131: +
          +
        • -x: override resolution units as centimeters +
        • -y: override resolution units as inches +
        + +
      • fax2tiff: Updated to reflect +latest changes in libtiff per bug 125. + +
      • tiff2ps: Division by zero fixed as per bug 88. + +
      • tiffcp: +Added support for 'Orientation' tag. + +
      • tiffdump: +include TIFFTAG_JPEGTABLES in tag list. + +
      • tiffset: fix bug in error reporting. + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: +
        + +
      • Fixed distribution to include contrib/addtiffo/tif_ovrcache.{c,h}. +
      • libtiff/contrib/win95: renamed to contrib/win_dib. Added new +Tiffile.cpp example of converting TIFF files into a DIB on Win32 as per +bug 143. + +
      + + + +CHANGES IN THE LZW COMPRESSION +KIT: +
        + +
      • LZW compression kit synchronized with actual libtiff version. + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2003/10/04 11:38:17 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.6.1.html b/src/3rdparty/libtiff/html/v3.6.1.html new file mode 100644 index 0000000000..d10606225b --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.6.1.html @@ -0,0 +1,199 @@ + + + +Changes in TIFF v3.6.1 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + + + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        + +
      • libtiff/makefile.vc, tools/makefile.vc: Support for IJG JPEG library. + +
      • Makefile.in: Add an absolute path to the test_pics.sh call. + +
      • Makefile.in: Add an absolute path to the test_pics.sh call. + +
      • libtiff/tiffcomp.h: #define _BSDTYPES_DEFINED when defining BSD typedefs. + +
      • configure, libtiff/{Makefile.in, mkversion.c}: Relative buildings fixed. + +
      • Makefile.in: Add an absolute path to the test_pics.sh call. + +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        + +
      • libtiff/{tif_color.c, tif_getimage.c, tiffio.h}: Added support +for ReferenceBlackWhite tag handling when converted from YCbCr color space as +per bug 120. + +
      • libtiff/{tif_getimage.c, tif_aux.c}: Read WhitePoint tag from the +file and properly use it for CIE Lab 1976 to RGB transform. + +
      • libtiff/{tif_getimage.c, tiffio.h}: Finally resolved problems with +orientation handling. TIFFRGBAImage interface now properly supports all +possible orientations, i.e. images will be flipped both in horizontal and +vertical directions if required. 'Known bugs' section now removed from the +appropriate manual pages. + +
      • libtiff/tif_luv.c: Fixed bug in 48-bit to 24-bit conversion routine, +reported by Antonio Scuri. + +
      • libtiff/{tiffio.h, tif_codec.c}: Added new function +TIFFIsCODECConfigured(), suggested by Ross Finlayson. + +
      • libtiff/tif_ojpeg.c: TIFFVGetField() function now can properly extract +the fields from the OJPEG files. Patch supplied by Ross Finlayson. + +
      • libtiff/tif_dir.h: _TIFFFindOrRegisterdInfo declaration replaced +with _TIFFFindOrRegisterFieldInfo as reported by Ross Finlayson. + +
      • libtiff/tif_dirinfo.c: Implemented binary search in _TIFFMergeFieldInfo(). +Patch supplied by Ross Finlayson. + +
      • tif_dirread.c: do not mark all anonymously defined tags to be IGNOREd (as +it was done in 3.6.0). + +
      • libtiff/{tiff.h, tif_dirinfo.c}: Added support for IFD (13) datatype, +intruduced in "Adobe PageMaker TIFF Technical Notes". + +
      • libtiff/{tif_color.c, tif_getimage.c, tiffio.h}: New color space +conversion code: CIE L*a*b* 1976 images now supported by the TIFFRGBAImage +interface. YCbCr to RGB conversion code also moved there and now has +publicly available interface. These +routines currently used in TIFFRGBAImage interface only and not supported in +other libtiff tools yet. So if you want, for example, to convert CIE Lab image +into PostScript file you should do it in two steps: chnge colorspace to RGB +using tiff2rgba utility abd then process +it with the tiff2ps. + +
      • libtiff/tif_tile.c: Remove spurious use of "s" (sample) in the +planarconfig_contig case in TIFFComputeTile() as per bug 387 + +
      • libtiff/tiffiop.h: New macros: TIFFmax and TIFFmin. + +
      • libtiff/{tiffio.h, tif_strip.c}: Added TIFFRawStripSize() function +as suggested by Chris Hanson. + +
      • libtiff/{tif_lzw.c, tif_fax3.c}: Proper support for update mode +as per bug 424. + +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        + +
      • tiff2pdf: New tool, written by +Ross Finlayson, to directly convert TIFF files to PDF. + +
      • tiffgt: Unmaintained and platform +dependent sgigt utility removed and replaced with the completely rewritten +portable tiffgt tool (depend on OpenGL and +GLUT). This tool will not build by default. + +
      • ras2tiff: Properly determine +SUN Rasterfiles with the reverse byte order (it is reported by the magic +header field). Problem reported by Andreas Wiesmann. + +
      • raw2tiff: Implemented image size +guessing using correlation coefficient calculation between two neighbour +lines. + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: +
        + +
      • contrib/pds/{tif_pdsdirread.c, tif_pdsdirwrite.c}: Use TIFFDataWidth() +function insted of tiffDataWidth array. + +
      + + + +CHANGES IN THE LZW COMPRESSION +KIT: +
        + +
      • Proper support for update mode as per bug 424. + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2003/12/24 22:14:15 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.7.0.html b/src/3rdparty/libtiff/html/v3.7.0.html new file mode 100644 index 0000000000..413f2c6053 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.7.0.html @@ -0,0 +1,144 @@ + + + + Changes in TIFF v3.7.0 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        + +
      • Several bugs found after 3.7.0beta2 release were fixed. + +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • ltmain.sh: Fix for MinGW compilation. +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        + +
      • libtiff/{tif_dirread.c, tif_jpeg.c, tif_luv.c, tif_ojpeg.c, + tif_pixarlog.c, tif_write.c}: Handle the zero strip/tile sizes + properly (Dmitry V. Levin, Marcus Meissner). + +
      • libtiff/tif_dirinfo.c: Type of the TIFFTAG_SUBIFD field changed + to TIFF_IFD. + +
      • Preliminary support for BigTIFF files: now libtiff can + recognize and reject to open such images. ;-) + +
      • libtiff/tif_dir.c: Initialize td_tilewidth and td_tilelength fields + of the TIFFDirectory structure with the 0 instead of -1 to avoid + confusing integer overflows in TIFFTileRowSize() for striped images. + +
      • libtiff/tif_dir.c: Initialize td_tilewidth and td_tilelength fields + of the TIFFDirectory structure with the 0 instead of -1 to avoid + confusing integer overflows in TIFFTileRowSize() for striped images. + +
      • libtiff/tif_dirinfo.c: Fix bug with tif_foundfield and reallocation + of tif_fieldinfo as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=630 + +
      • libtiff/tif_compress.c: Improved error reporting in + TIFFGetConfiguredCODECs() (Dmitry V. Levin). + +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        +
      • tiffcmp.c (leof): Renamed from 'eof' in order to avoid + conflict noticed under MinGW. + +
      • tiff2pdf.c: Fixed TransferFunction tag handling reported + by Ross A. Finlayson. + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • No changes. + +
      + + + +CHANGES IN THE LZW COMPRESSION +KIT: +
        + +
      • This one is not longer needed. + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2004/12/20 19:31:44 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.7.0alpha.html b/src/3rdparty/libtiff/html/v3.7.0alpha.html new file mode 100644 index 0000000000..95c633ca5d --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.7.0alpha.html @@ -0,0 +1,249 @@ + + + + Changes in TIFF v3.7.0alpha + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • Significant changes in software configuration: we are switched + to GNU autotools now. + +
      • tiffset: tiffset now can set any libtiff supported tags. Tags + can be supplied by the mnemonic name or number. +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • Get rid of the old configuration system and switch to + GNU autotools. +
      + +


      + + + +CHANGES IN LIBTIFF: + + + +


      + + + +CHANGES IN THE TOOLS: + +
        +
      • tiffset: tiffset now can set any libtiff supported tags. Tags + can be supplied by the mnemonic name or number. + +
      • ycbcr.c: fixed main() declaration as per: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=513. + +
      • tiffsplit: Don't forget + to copy Photometric Interpretation tag. + +
      • tiffsplit: Fixed problem with + unproperly written multibyte files. Now output files will be written + using the same byte order flag as in the input image. See + . + +
      • tiffsplit: Copy JPEGTables + tag contents for JPEG compressed images. Reported by Artem Mirolubov. + +
      • tiffcp: Close output file + on normal exit. + +
      • tiffcp: Don't emit warnings + when Orientation tag does not present in the input image. + +
      • tiffcp: Properly set + Photometric Interpretation in case of JPEG compression of grayscale + images. + +
      • tiffcp: Fixed problem with wrong + interpretation of the InkNames tag as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=466. + Memory leak fixed. + +
      • tiffcp: Fixed problem with + wrong Photometric setting for non-RGB images. + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • Outdated stuff removed. + +
      • Almost all programs are sinchronized with the current libtiff + and should compile without problems. + +
      + + + +CHANGES IN THE LZW COMPRESSION +KIT: +
        + +
      • No changes. + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2006/03/18 17:12:47 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.7.0beta.html b/src/3rdparty/libtiff/html/v3.7.0beta.html new file mode 100644 index 0000000000..7d7c868b08 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.7.0beta.html @@ -0,0 +1,162 @@ + + + + Changes in TIFF v3.7.0beta + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • LZW compression enabled by default. You don't need the separate + compression kit anymore. + +
      • bmp2tiff: Added new utility to convert Windows BMP files + into TIFFs. + +
      • The first attempt to implement a test suite. +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • Many portability fixes in the new autotooled build suite. +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        +
      • libtiff/{tif_luv.c, tif_next.c, tif_thunder.c}: Several buffer + overruns fixed, as noted by Chris Evans. + +
      • BSD data types (u_char, u_short, u_int, u_long) is no longer + used internally in the libtiff. Should result in simpler configuration + and better portability. + +
      • libtiff/tiff.h: Fix column tagging. Reference current Adobe XMP + specification. Reference libtiff bug tracking system to submit + private tag additions. + +
      • libtiff/tif_dirread.c: Don't reject to read tags of the + SamplesPerPixel size when the tag count is greater than number of + samples as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=576. + +
      • libtiff/{tiffio.h, tif_open.c}: Applied patches from + Joris Van Damme to avoid requirement for tiffiop.h inclusion in + some applications. Look for details here: + + http://www.asmail.be/msg0054799560.html. + +
      • libtiff/{tiffiop.h, tif_dirinfo.c}: Fixed problem with the static + variable as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=593. + +
      • libtiff/tif_lzw.c: LZW compression code is merged back from the + separate package. All libtiff tools are updated to not advertise an + abcence of LZW support. + +
      • libtiff/tif_dir.c: Call TIFFError() instead of producing warnings + when setting custom tags by value. Reported by Eric Fieleke. + +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        +
      • tiff2ps: Avoid zero division in setupPageState() function; + properly initialize array in PSDataBW(). + +
      • tiff2pdf: Multiple bugfixes. + +
      • ras2tiff: Fixed issue with missed big-endian checks as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=586. + +
      • bmp2tiff: Added new utility to convert Windows BMP files + into TIFFs. + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • No changes. + +
      + + + +CHANGES IN THE LZW COMPRESSION +KIT: +
        + +
      • This one is not longer needed. + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2006/03/18 17:12:47 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.7.0beta2.html b/src/3rdparty/libtiff/html/v3.7.0beta2.html new file mode 100644 index 0000000000..67dd8dad3f --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.7.0beta2.html @@ -0,0 +1,131 @@ + + + + Changes in TIFF v3.7.0beta2 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        + +
      • The code has been reviewed by Dmitry Levin: added checks + for values, returned by the space allocation functions, fixed + problems with the possible integer overflows. + +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • Several fixes in the test suite. +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        + +
      • Preliminary support for BigTIFF files: now libtiff can + recognize and reject to open such images. ;-) + +
      • libtiff/tif_dirinfo.c: changed type of XMLPacket (tag 700) to + TIFFTAG_BYTE instead of TIFFTAG_UNDEFINED to comply with the info + in the Adobe XMP Specification. + +
      • Added many checks for integer overflow and for successful space + allocations in the different parts of library. Code review + completed by Dmitry V. Levin. + +
      • libtiff/{tiffio.h, tif_compress.c}: Added + TIFFGetConfiguredCODECs()function to get the list of configured codecs. + +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        +
      • tiff2bw: Write ImageWidth/Height tags to output file, as + noted by Gennady Khokhorin. + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • No changes. + +
      + + + +CHANGES IN THE LZW COMPRESSION +KIT: +
        + +
      • This one is not longer needed. + +
      + + TIFF home page.
      + +
      + +Last updated $Date: 2006/03/18 17:12:47 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.7.1.html b/src/3rdparty/libtiff/html/v3.7.1.html new file mode 100644 index 0000000000..b888792f21 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.7.1.html @@ -0,0 +1,233 @@ + + + + Changes in TIFF v3.7.1 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        + +
      • This is mostly bugfix release. Most important fix is the one + related to wrong custom tag read/write code. + +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        + +
      • autogen.sh: aclocal and autoheader should be executed after + libtoolize. Also add '-I .' to aclocal invocation to check + current directory for macros. + +
      • nmake.opt: Link with the user32.lib in windowed mode. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=697 + +
      • nmake.opt, makefile.vc: make it easier to rename the libtiff DLL. + +
      • configure, configure.ac: Added --enable-rpath option to embed + linker paths into library binary. + +
      + +


      + + + +CHANGES IN LIBTIFF: + + + +


      + + + +CHANGES IN THE TOOLS: + +
        + +
      • fax2ps.c: Be able to extract the first page (#0). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=690 + +
      • tiff2ps.c: Fixed wrong variable data type when read Position + tags (Tristan Hill). + +
      • tiff2ps.c: Fixed wrong variable data type when read Resolution + tags (Peter Fales). + +
      • tiffset.c: Check the malloc return value (Dmitry V. Levin). + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • No changes. + +
      + +Last updated $Date: 2004/12/20 19:31:44 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.7.2.html b/src/3rdparty/libtiff/html/v3.7.2.html new file mode 100644 index 0000000000..6cb6f7cd3a --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.7.2.html @@ -0,0 +1,222 @@ + + + + Changes in TIFF v3.7.2 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        + +
      • Maintainance release. Many bugfixes in the build environment + and compatibility improvements. + +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + + + +


      + + + +CHANGES IN LIBTIFF: + + + +


      + + + +CHANGES IN THE TOOLS: + + + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • No changes. + +
      + +Last updated $Date: 2005/03/15 15:17:44 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.7.3.html b/src/3rdparty/libtiff/html/v3.7.3.html new file mode 100644 index 0000000000..d69845176c --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.7.3.html @@ -0,0 +1,230 @@ + + + + Changes in TIFF v3.7.3 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • Replace runtime endianess check with the compile time one. + +
      • Added support for the new predictor type (floating point + predictor), defined at the TIFF Technical Note 3. + +
      • Added Support for custom tags, passed by value. + Added support for all DNG tags. +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + + + +


      + + + +CHANGES IN LIBTIFF: + +
        +
      • tiffiop.h, tif_open.c: Added open option 'h' to avoid reading + the first IFD when needed. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=875 + +
      • tiff.h: Use correct int size on Sparc 64bit/Sun compiler + platform. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=855 + +
      • tif_dirinfo.c: Added support for ClipPath, XClipPathUnits + and YClipPathUnits tags. + +
      • tif_dirinfo.c, tif_dir.h, tif_dir.c, tif_print.c: Make + DocumentName, Artist, HostComputer, ImageDescription, Make, Model, + Copyright, DateTime, PageName, TextureFormat, TextureWrapModes and + TargetPrinter tags custom. + +
      • tif_jpeg.c: Cleanup the codec state depending on TIFF_CODERSETUP + flag (to fix memory leaks). + +
      • tif_dirwrite.c: Use tdir_count when calling + TIFFCvtNativeToIEEEDouble() in the TIFFWriteDoubleArray() function as + per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=845 + +
      • tif_dirinfo.c, tif_print.c: TIFFFetchByteArray() returns + uint16 array when fetching the BYTE and SBYTE fields, so we should + consider result as pointer to uint16 array and not as array of chars. + As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=831 + +
      • tif_dir.c: More efficient custom tags retrieval as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=830 + +
      • tif_win32.c: Use FILE_SHARE_READ | FILE_SHARE_WRITE share + mode in CreateFile() call as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=829 + +
      • tif_jpeg.c: Substantial fix for addtiffo problems with + JPEG encoded TIFF files. Pre-allocate lots of space for jpegtables + in directory. + +
      • tif_dirread.c: Changed the code that computes + stripbytecount[0] if it appears bogus to ignore if stripoffset[0] is + zero. This is a common case with GDAL indicating a "null" tile/strip. + +
      • tif_jpeg.c: added LIB_JPEG_MK1 support in JPEGDecodeRaw(). + +
      • tif_dirread.c: Ensure that broken files with too many + values in PerSampleShorts, TIFFFetchPerSampleLongs and + TIFFFetchPerSampleAnys work ok instead of crashing. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=843 + +
      • tif_predict.h, tif_predict.c: Added ability to decode and encode + floating point predictor, as per TIFF Technical Note 3. + See http://chriscox.org/TIFF_TN3_Draft2.pdf for details. + +
      • tiffio.h, tiffiop.h, tif_dir.c, tif_read.c, tif_swab.c: + Added _TIFFSwab24BitData() and TIFFSwabArrayOfLong() functions used to + swap 24-bit floating point values. + +
      • tiff.h: Added predictor constants. + +
      • tiffiop.h, tif_dir.c: Use uint32 type for appropriate values + in _TIFFVSetField() function. Inspired by the bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=816 + +
      • tif_open.c: Do not read header in case the output file should + be truncated (Ron). + +
      • tif_dirinfo.c, tif_config.h.vc: Use lfind() instead of bsearch() + in _TIFFFindFieldInfoByName() function (Ron). + +
      • tif_dir.c, tif_print.c: Properly handle all data types in custom + tags. + +
      • dirinfo.c: Added DNG tags. + +
      • tiff.h: Added missed DNG tag (LensInfo); added DNG 1.1.0.0 tags. + +
      • tif_dir.c, tif_print.c: Added Support for custom tags, passed + by value. + +
      • tiff.h, tif_dirinfo.c, tiffiop.h: Added EXIF related tags. +
      + +


      + + + +CHANGES IN THE TOOLS: + + + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • addtiffo/{tif_overview.c, tif_ovrcache.c, tif_ovrcache.h}: + Make overviews working for contiguous images. + +
      + +Last updated $Date: 2006/01/04 22:04:46 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.7.4.html b/src/3rdparty/libtiff/html/v3.7.4.html new file mode 100644 index 0000000000..943732019e --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.7.4.html @@ -0,0 +1,133 @@ + + + + Changes in TIFF v3.7.4 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • Fixed important bug in custom tags handling code.. +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • Applied patch from Patrick Welche (all scripts moved in the + 'config' and 'm4' directories). + +
      • SConstruct, libtiff/SConstruct: Added the first very preliminary + support for SCons software building tool (http://www.scons.org/). + This is experimental infrastructure and it will exist along with the + autotools stuff. + +
      • port/lfind.c: Added lfind() replacement module. +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        +
      • tif_dir.c: When prefreeing tv->value in TIFFSetFieldV + also set it to NULL to avoid double free when re-setting custom + string fields as per: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=922 + +
      • tif_dir.c: Fixed up support for swapping "double complex" + values (128 bits as 2 64 bits doubles). GDAL gcore tests now + pass on bigendian (macosx) system. + +
      • libtiff/{tif_dirread.c, tif_dirinfo.c}: Do not upcast BYTEs to + SHORTs in the TIFFFetchByteArray(). Remove TIFFFetchExtraSamples() + function, use TIFFFetchNormalTag() instead as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=831 + + Remove TIFFFetchExtraSamples() function, use TIFFFetchNormalTag() + instead. + +
      • tif_print.c: Fixed printing of the BYTE and SBYTE arrays. + +
      • tif_write.c: Do not check the PlanarConfiguration field in + the TIFFWriteCheck() function in case of single band images (as per + TIFF spec). + +
      • libtiff/{tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_print.c}: + Make FieldOfViewCotangent, MatrixWorldToScreen, MatrixWorldToCamera, + ImageFullWidth, ImageFullLength and PrimaryChromaticities tags custom. +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        +
      • tiffcp.c: Fixed WhitePoint tag copying. +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        +
      • tiffdump.c: Added support for TIFF_IFD datatype. + +
      • addtiffo/{tif_overview.c, tif_ovrcache.c, tif_ovrcache.h}: + Make overviews working for contiguous images. + +
      + +Last updated $Date: 2005/11/03 14:18:43 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.8.0.html b/src/3rdparty/libtiff/html/v3.8.0.html new file mode 100644 index 0000000000..914dcb0c55 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.8.0.html @@ -0,0 +1,199 @@ + + + + Changes in TIFF v3.8.0 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • Read-only support for custom directories (e.g. EXIF directory). + +
      • Preliminary support for MS MDI format. +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • Make the default strip size configurable via the + --with-default-strip-size and STRIP_SIZE_DEFAULT options. +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        +
      • tiffio.h: Added VC_EXTRALEAN definition before including + windows.h, to reduce the compile time. + +
      • tif_jpeg.c: Improve compilation under MinGW. + +
      • {tif_aux.c, tif_dir.c, tif_dir.h, tif_dirwrite.c, + tif_print.c, tif_getimage.c}: Make InkSet, NumberOfInks, DotRange and + StoNits tags custom. + +
      • {tif_aux.c, tif_dir.c, tif_dir.h, tif_print.c}: Make + WhitePoint tag custom. + +
      • tiffio.h: fixed typo that potentially resulted in + redefininition of USE_WIN32_FILEIO + +
      • {tif_dir.c, tif_dir.h, tif_print.c}: Make RichTIFFIPTC, + Photoshop and ICCProfile tags custom. + +
      • libtiff/*, contrib/*: Added 'dual-mode' error handling, enabling + newer code to get context indicator in error handler and still + remain compatible with older code: Done TIFFError calls everywhere + except in tools. + +
      • tiffinfo.c: Print EXIF directory contents if exist. + +
      • {tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c}: + Custom directory read-only support. + +
      • {tif_aux.c, tif_dirinfo.c, tif_dirread.c, tif_dir.h, + tif_dir.c, tif_print.c}: Make YCbCrCoefficients and ReferenceBlackWhite + tags custom. + +
      • tif_dirread.c: One more workaround for broken StripByteCounts + tag. Handle the case when StripByteCounts array filled with + completely wrong values. + +
      • tif_dirinfo.c: Release file descriptor in case of failure + in the TIFFOpenW() function as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1003 + +
      • tif_dirinfo.c: Correctly yse bsearch() and lfind() + functions as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1008 + +
      • tif_open.c, tiff.h, tiffdump.c: Incorporate preliminary support + for MS MDI format. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1002 + +
      • libtiff.def, tiffiop.h, tiffio.h: Made TIFFFreeDirectory + public. + +
      • /tif_dirinfo.c: Make XResolution, YResolution and + ResolutionUnit tags modifiable during write process. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=977 + +
      • if_dirread.c: Don't try and split single strips into "0" strips + in ChopUpSingleUncompressedStrip. This happens in some degenerate + cases (like 1x1 files with stripbytecounts==0 (gtsmall.jp2 embed tiff) + +
      • tif_fax3.c: changed 'at scanline ...' style warning/errors + with incorrect use of tif_row, to 'at line ... of + strip/tile ...' style. +
      + +


      + + + +CHANGES IN THE TOOLS: + + + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        +
      • contrib/addtiffo/*: Major upgrade by Joris to support subsampled + YCbCr images in jpeg compressed TIFF files. + +
      + +Last updated $Date: 2006/01/04 23:38:38 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.8.1.html b/src/3rdparty/libtiff/html/v3.8.1.html new file mode 100644 index 0000000000..9fea1407e6 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.8.1.html @@ -0,0 +1,217 @@ + + + + Changes in TIFF v3.8.1 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • Bug-fix release. +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        +
      • libtool related stuff updated from the 2.1a branch. + +
      • Fix with_default_strip_size comparison as reported by + Norihiko Murase. +
      + +


      + + + +CHANGES IN LIBTIFF: + + + +


      + + + +CHANGES IN THE TOOLS: + + + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        +
      + +Last updated $Date: 2006/03/13 14:52:12 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.8.2.html b/src/3rdparty/libtiff/html/v3.8.2.html new file mode 100644 index 0000000000..e648127586 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.8.2.html @@ -0,0 +1,137 @@ + + + + Changes in TIFF v3.8.2 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • Bug-fix release. +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + + + +


      + + + +CHANGES IN LIBTIFF: + +
        +
      • tif_strip.c: Take subsampling in account when calculating + TIFFScanlineSize(). + +
      • tif_jpeg.c, tif_fax3.c, tif_zip.c, tif_pixarlog.c, + tif_lzw.c, tif_luv.c: Use _TIFFSetDefaultCompressionState() in all + codec cleanup methods. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1120 + +
      • tif_jpeg.c: Do not cleanup codec state in TIFFInitJPEG(). As + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1119 + +
      • tif_dir.c: Use double type instead of dblparam_t. + +
      • tif_dirread.c: Do not check the PlanarConfig tag presence + in TIFFReadDirectory, because it is always set at the start of + function and we allow TIFFs without that tag set. + +
      + +


      + + + +CHANGES IN THE TOOLS: + + + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        +
      + +Last updated $Date: 2006/03/23 14:54:01 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.9.0beta.html b/src/3rdparty/libtiff/html/v3.9.0beta.html new file mode 100644 index 0000000000..053b34ab52 --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.9.0beta.html @@ -0,0 +1,304 @@ + + + + Changes in TIFF v3.9.0beta + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • New tiffcrop utility contributed by Richard Nolde. + tiffcrop does the same as tiffcp, but also can crop, + extract, rotate and mirror images. + +
      • tif_jbig.c: Added support for JBIG compression scheme + (34661 code), contributed by Lee Howard. + +
      • Totally new implementation of OJPEG module from + Joris Van Damme. No need to patch libjpeg anymore. Many OJPEG files + should be supported now that was not supported previously. + +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        + +
      • tif_config.wince.h, tiffconf.wince.h, tif_wince.c: WinCE-specific + compatibility stuff from Mateusz Loskot. + +
      • Rename config.h.vc and tif_config.h.vc to config.vc.h and + tif_config.vc.h for easier identification by folks using an IDE. + +
      • configure, configure.ac: OJPEG support enabled by default (i.e., + whe the conformant JPEG support enabled). + +
      • README.vms, Makefile.am, configure.com, libtiff/{Makefile.am, + tif_config.h-vms, tif_stream.cxx, tif_vms.c, tiffconf.h-vms}: + Added support for OpenVMS by Alexey Chupahin. + +
      • nmake.opt: use /EHsc for VS2005 compatibility. Also define + _CRT_SECURE_NO_DEPRECATE to avoid noise on VS2005. + +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        +
      • tif_dirinfo.c (_TIFFFindFieldInfo): Don't attempt to + bsearch() on a NULL fieldinfo list. + (_TIFFFindFieldInfoByName): Don't attempt to lfind() on a NULL + fieldinfo list. + +
      • tif_jpeg.c: Changed JPEGInitializeLibJPEG() so that it + will convert from decompressor to compressor or compress to decompress + if required by the force arguments. This works around a problem in + where the JPEGFixupTestSubsampling() may cause a decompressor to + be setup on a directory when later a compressor is required with the + force flag set. Occurs with the addtiffo program for instance. + +
      • tif_dirwrite.c: Fixed swapping of byte arrays stored + in-place in tag offsets as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1363 + +
      • tif_getimage.c: workaround for 'Fractional scanline' error + reading OJPEG images with rowsperstrip that is not a multiple of + vertical subsampling factor. This bug is mentioned in + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1390 and + + http://www.asmail.be/msg0054766825.html + +
      • tif_dirread.c: Added special function to handle + SubjectDistance EXIF tag as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1362 + +
      • tif_dirread.c, tif_read.c: Type of the byte counters + changed from tsize_t to uint32 to be able to work with data arrays + larger than 2GB. Fixes bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=89 + Idea submitted by Matt Hancher. + +
      • tif_dir.c: Workaround for incorrect TIFFs with + ExtraSamples == 999 produced by Corel Draw. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1490 + +
      • tif_write.c: TIFFAppendToStrip() - clear sorted flag if + we move a strip. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1359 + +
      • tif_fax3.c: Save the state of printdir codec dependent method. + +
      • tif_jpeg.c: Save the state of printdir codec dependent method + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1273 + +
      • tif_win32.c: Fixed problem with offset value manipulation + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1322 + +
      • tif_fax3.c, tif_next.c, tif_pixarlog.c: Fixed multiple + vulnerabilities, as per Gentoo bug (): + + http://bugs.gentoo.org/show_bug.cgi?id=142383 + +
      • tif_lzw.c, tif_zip.c: Fixed problems with mixing + encoding and decoding on the same read-write TIFF handle. The LZW + code can now maintain encode and decode state at the same time. The + ZIP code will switch back and forth as needed. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=757 + +
      • tif_msdos.c: Avoid handle leak for failed opens. + c/o Thierry Pierron + +
      • tif_dirwrite.c: take care not to flush out buffer of strip/tile + data in _TIFFWriteDirectory if TIFF_BEENWRITING not set. Relates + to bug report by Peng Gao with black strip at bottom of images. + +
      • tif_dirwrite.c: make sure to use uint32 for wordcount in + TIFFWriteNormanTag if writecount is VARIABLE2 for ASCII fields. + It already seems to have been done for other field types. Needed + for "tiffset" on files with geotiff ascii text. + +
      • tif_dirinfo.c: Added missed EXIF tag ColorSpace (40961). + +
      • tif_dirread.c: Move IFD fetching code in the separate + function TIFFFetchDirectory() avoiding code duplication in + TIFFReadDirectory() and TIFFReadCustomDirectory(). + +
      • tif_readdir.c: Added case in EstimateStripByteCounts() for tiled + files. Modified TIFFReadDirectory() to not invoke + EstimateStripByteCounts() for case where entry 0 and 1 are unequal but + one of them is zero. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1204 + +
      • tif_open.c, tif_dirread.c, tiffiop.h: Move IFD looping + checking code in the separate function TIFFCheckDirOffset(). + +
      • tif_aux.c: Added _TIFFCheckRealloc() function. + +
      • tif_fax3.c: Fixed problems in fax decoder as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1194 + +
      • tif_jbig.c: Added support for JBIG compression scheme + (34661 code) contributed by Lee Howard. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=896 + +
      • tif_getimage.c: Added support for planarconfig separate + non-subsampled YCbCr (i.e. separate YCbCr with subsampling [1,1]). + +
      • tif_getimage.c: Revision of all RGB(A) put routines: +
          +
        • Conversion of unassociated alpha to associated alpha + now done with more performant LUT, and calculation more + correct. +
        • Conversion of 16bit data to 8bit data now done with + more performant LUT, and calculation more correct +
        • Bugfix of handling of 16bit RGB with unassociated alpha +
        + +
      • tif_ojpeg.c: totally new implementation + +
      • tif_getimage.c: removed TIFFTAG_JPEGCOLORMODE handling + of OJPEG images in favor of tif_getimage.c native handling of + YCbCr and desubsampling. + +
      • tif_jpeg.c: JPEGVSetField() so that altering the photometric + interpretation causes the "upsampled" flag to be recomputed. Fixes + peculiar bug where photometric flag had to be set before jpegcolormode + flag. + +
      + +


      + + + +CHANGES IN THE TOOLS: + + + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • contrib/addtiffo/tif_overview.c: Fix problems with odd sized + output blocks in TIFF_DownSample_Subsampled() (bug 1542). + +
      • contrib/dbs/xtiff/xtiff.c: Make xtiff utility compilable. + Though it is still far from the state of being working and useful. + +
      + +Last updated $Date: 2007/07/13 13:40:12 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.9.1.html b/src/3rdparty/libtiff/html/v3.9.1.html new file mode 100644 index 0000000000..93228483bd --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.9.1.html @@ -0,0 +1,115 @@ + + + + Changes in TIFF v3.9.1 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). If you don't +find something listed here, then it was not done in this timeframe, or +it was not considered important enough to be mentioned. The following +information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        +
      • This is a bug-fix release for several bugs (two of which + are dire) which were discovered in the 3.9.0 release. + +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        + +
      • Several defines were missing from tif_config.vc.h which + are necessary to compile the library using MSVC. + +
      • Colorized tests were actually not enabled as expected. + Parallel tests mode is now also enabled so that tests can be + run in parallel, and test output is sent to .log files. + +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        +
      • libtiff/tif_write.c (TIFFAppendToStrip): Remove cast + which caused libtiff to output a wrong last strip with + byte-count and strip-offset of zero. This cast was added on + the day of the 3.9.0 release. + +
      • libtiff/tif_dirwrite.c: Back out changes from 2007-11-22 + that resulted in the final strip not being written in some + circumstances. + http://bugzilla.maptools.org/show_bug.cgi?id=2088 + +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        +
      • None + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • None + +
      + +Last updated $Date: 2009-08-28 18:49:02 $. + + + diff --git a/src/3rdparty/libtiff/html/v3.9.2.html b/src/3rdparty/libtiff/html/v3.9.2.html new file mode 100644 index 0000000000..2f390c838d --- /dev/null +++ b/src/3rdparty/libtiff/html/v3.9.2.html @@ -0,0 +1,122 @@ + + + + Changes in TIFF v3.9.2 + + + + + + + + +TIFF CHANGE INFORMATION + + + + +

      +This document describes the changes made to the software between the +previous and current versions (see above). If you don't +find something listed here, then it was not done in this timeframe, or +it was not considered important enough to be mentioned. The following +information is located here: +

      +

      +


      + + + +MAJOR CHANGES: + +
        + +
      • Fixes a number of bugs present in the 3.9.1 release. + +
      • OJPEG support updated to work with IJG JPEG 7 release. + +
      • Tiffcrop validated for most TIFF storage subformats and sample depths. + +
      + + +


      + + +CHANGES IN THE SOFTWARE CONFIGURATION: + +
        + +
      • x86_64 now uses the same default fill order as i386. + +
      + +


      + + + +CHANGES IN LIBTIFF: + +
        +
      • Writing tags with an array value of type TIFF_DOUBLE now + returns correct error status. The TIFFTAG_SMINSAMPLEVALUE and + TIFFTAG_SMAXSAMPLEVALUE tags failed to write without this fix. + +
      • OJPEG decoder now works with IJG JPEG 7. Resolves "Bug + 2090 - OJPEG crash with libjpeg v7". + http://bugzilla.maptools.org/show_bug.cgi?id=2090 + +
      • Eliminate most GCC "dereferencing type-punned pointer" + warnings. + +
      + +


      + + + +CHANGES IN THE TOOLS: + +
        + +
      • New tiffcrop from Richard Nolde. Major updates to add + significant functionality for reading and writing tile based + images with bit depths not a multiple of 8 which cannot be + handled by tiffcp. + +
      • Allow building tools with GCC using the "-Wformat + -Werror=format-security" flags. + +
      + +


      + + + +CHANGES IN THE CONTRIB AREA: + +
        + +
      • None + +
      + +Last updated $Date: 2009-08-28 18:49:02 $. + + + diff --git a/src/3rdparty/libtiff/libtiff/SConstruct b/src/3rdparty/libtiff/libtiff/SConstruct new file mode 100644 index 0000000000..cb6a7cc957 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/SConstruct @@ -0,0 +1,73 @@ +# $Id: SConstruct,v 1.4 2007/02/24 15:03:50 dron Exp $ + +# Tag Image File Format (TIFF) Software +# +# Copyright (C) 2005, Andrey Kiselev +# +# Permission to use, copy, modify, distribute, and sell this software and +# its documentation for any purpose is hereby granted without fee, provided +# that (i) the above copyright notices and this permission notice appear in +# all copies of the software and related documentation, and (ii) the names of +# Sam Leffler and Silicon Graphics may not be used in any advertising or +# publicity relating to the software without the specific, prior written +# permission of Sam Leffler and Silicon Graphics. +# +# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +# +# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +# OF THIS SOFTWARE. + +# This file contains rules to build software with the SCons tool +# (see the http://www.scons.org/ for details on SCons). + +# Import globally defined options +Import([ 'env', 'idir_lib' ]) + +SRCS = [ \ + 'tif_aux.c', \ + 'tif_close.c', \ + 'tif_codec.c', \ + 'tif_color.c', \ + 'tif_compress.c', \ + 'tif_dir.c', \ + 'tif_dirinfo.c', \ + 'tif_dirread.c', \ + 'tif_dirwrite.c', \ + 'tif_dumpmode.c', \ + 'tif_error.c', \ + 'tif_extension.c', \ + 'tif_fax3.c', \ + 'tif_fax3sm.c', \ + 'tif_flush.c', \ + 'tif_getimage.c', \ + 'tif_jbig.c', \ + 'tif_jpeg.c', \ + 'tif_luv.c', \ + 'tif_lzw.c', \ + 'tif_next.c', \ + 'tif_ojpeg.c', \ + 'tif_open.c', \ + 'tif_packbits.c', \ + 'tif_pixarlog.c', \ + 'tif_predict.c', \ + 'tif_print.c', \ + 'tif_read.c', \ + 'tif_strip.c', \ + 'tif_swab.c', \ + 'tif_thunder.c', \ + 'tif_tile.c', \ + 'tif_unix.c', \ + 'tif_version.c', \ + 'tif_warning.c', \ + 'tif_write.c', \ + 'tif_zip.c' ] + +StaticLibrary('tiff', SRCS) +SharedLibrary('tiff', SRCS) + diff --git a/src/3rdparty/libtiff/libtiff/libtiff.def b/src/3rdparty/libtiff/libtiff/libtiff.def new file mode 100644 index 0000000000..3caefd8365 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/libtiff.def @@ -0,0 +1,140 @@ +EXPORTS TIFFOpen + TIFFOpenW + TIFFGetVersion + TIFFCleanup + TIFFClose + TIFFFlush + TIFFFlushData + TIFFGetField + TIFFVGetField + TIFFGetFieldDefaulted + TIFFVGetFieldDefaulted + TIFFGetTagListEntry + TIFFGetTagListCount + TIFFReadDirectory + TIFFScanlineSize + TIFFStripSize + TIFFVStripSize + TIFFRawStripSize + TIFFTileRowSize + TIFFTileSize + TIFFVTileSize + TIFFFileno + TIFFSetFileno + TIFFGetMode + TIFFIsTiled + TIFFIsByteSwapped + TIFFIsBigEndian + TIFFIsMSB2LSB + TIFFIsUpSampled + TIFFCIELabToRGBInit + TIFFCIELabToXYZ + TIFFXYZToRGB + TIFFYCbCrToRGBInit + TIFFYCbCrtoRGB + TIFFCurrentRow + TIFFCurrentDirectory + TIFFCurrentStrip + TIFFCurrentTile + TIFFDataWidth + TIFFReadBufferSetup + TIFFWriteBufferSetup + TIFFSetupStrips + TIFFLastDirectory + TIFFSetDirectory + TIFFSetSubDirectory + TIFFUnlinkDirectory + TIFFSetField + TIFFVSetField + TIFFCheckpointDirectory + TIFFWriteDirectory + TIFFRewriteDirectory + TIFFPrintDirectory + TIFFReadScanline + TIFFWriteScanline + TIFFReadRGBAImage + TIFFReadRGBAImageOriented + TIFFFdOpen + TIFFClientOpen + TIFFFileName + TIFFError + TIFFErrorExt + TIFFWarning + TIFFWarningExt + TIFFSetErrorHandler + TIFFSetErrorHandlerExt + TIFFSetWarningHandler + TIFFSetWarningHandlerExt + TIFFComputeTile + TIFFCheckTile + TIFFNumberOfTiles + TIFFReadTile + TIFFWriteTile + TIFFComputeStrip + TIFFNumberOfStrips + TIFFRGBAImageBegin + TIFFRGBAImageGet + TIFFRGBAImageEnd + TIFFReadEncodedStrip + TIFFReadRawStrip + TIFFReadEncodedTile + TIFFReadRawTile + TIFFReadRGBATile + TIFFReadRGBAStrip + TIFFWriteEncodedStrip + TIFFWriteRawStrip + TIFFWriteEncodedTile + TIFFWriteRawTile + TIFFSetWriteOffset + TIFFSwabDouble + TIFFSwabShort + TIFFSwabLong + TIFFSwabArrayOfShort + TIFFSwabArrayOfLong + TIFFSwabArrayOfDouble + TIFFSwabArrayOfTriples + TIFFReverseBits + TIFFGetBitRevTable + TIFFDefaultStripSize + TIFFDefaultTileSize + TIFFRasterScanlineSize + _TIFFmalloc + _TIFFrealloc + _TIFFfree + _TIFFmemset + _TIFFmemcpy + _TIFFmemcmp + TIFFCreateDirectory + TIFFSetTagExtender + TIFFMergeFieldInfo + TIFFFindFieldInfo + TIFFFindFieldInfoByName + TIFFFieldWithName + TIFFFieldWithTag + TIFFCurrentDirOffset + TIFFWriteCheck + TIFFRGBAImageOK + TIFFNumberOfDirectories + TIFFSetFileName + TIFFSetClientdata + TIFFSetMode + TIFFClientdata + TIFFGetReadProc + TIFFGetWriteProc + TIFFGetSeekProc + TIFFGetCloseProc + TIFFGetSizeProc + TIFFGetMapFileProc + TIFFGetUnmapFileProc + TIFFIsCODECConfigured + TIFFGetConfiguredCODECs + TIFFFindCODEC + TIFFRegisterCODEC + TIFFUnRegisterCODEC + TIFFFreeDirectory + TIFFReadCustomDirectory + TIFFReadEXIFDirectory + TIFFAccessTagMethods + TIFFGetClientInfo + TIFFSetClientInfo + TIFFReassignTagToIgnore diff --git a/src/3rdparty/libtiff/libtiff/mkg3states.c b/src/3rdparty/libtiff/libtiff/mkg3states.c new file mode 100644 index 0000000000..dd29ec82b7 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/mkg3states.c @@ -0,0 +1,444 @@ +/* "$Id: mkg3states.c,v 1.10 2007/02/22 11:27:17 dron Exp $ */ + +/* + * Copyright (c) 1991-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* Initialise fax decoder tables + * Decoder support is derived, with permission, from the code + * in Frank Cringle's viewfax program; + * Copyright (C) 1990, 1995 Frank D. Cringle. + */ +#include "tif_config.h" + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include "tif_fax3.h" + +#ifndef HAVE_GETOPT +extern int getopt(int, char**, char*); +#endif + +#define streq(a,b) (strcmp(a,b) == 0) + +/* NB: can't use names in tif_fax3.h 'cuz they are declared const */ +TIFFFaxTabEnt MainTable[128]; +TIFFFaxTabEnt WhiteTable[4096]; +TIFFFaxTabEnt BlackTable[8192]; + +struct proto { + uint16 code; /* right justified, lsb-first, zero filled */ + uint16 val; /* (pixel count)<<4 + code width */ +}; + +static struct proto Pass[] = { +{ 0x0008, 4 }, +{ 0, 0 } +}; + +static struct proto Horiz[] = { +{ 0x0004, 3 }, +{ 0, 0 } +}; + +static struct proto V0[] = { +{ 0x0001, 1 }, +{ 0, 0 } +}; + +static struct proto VR[] = { +{ 0x0006, (1<<4)+3 }, +{ 0x0030, (2<<4)+6 }, +{ 0x0060, (3<<4)+7 }, +{ 0, 0 } +}; + +static struct proto VL[] = { +{ 0x0002, (1<<4)+3 }, +{ 0x0010, (2<<4)+6 }, +{ 0x0020, (3<<4)+7 }, +{ 0, 0 } +}; + +static struct proto Ext[] = { +{ 0x0040, 7 }, +{ 0, 0 } +}; + +static struct proto EOLV[] = { +{ 0x0000, 7 }, +{ 0, 0 } +}; + +static struct proto MakeUpW[] = { +{ 0x001b, 1029 }, +{ 0x0009, 2053 }, +{ 0x003a, 3078 }, +{ 0x0076, 4103 }, +{ 0x006c, 5128 }, +{ 0x00ec, 6152 }, +{ 0x0026, 7176 }, +{ 0x00a6, 8200 }, +{ 0x0016, 9224 }, +{ 0x00e6, 10248 }, +{ 0x0066, 11273 }, +{ 0x0166, 12297 }, +{ 0x0096, 13321 }, +{ 0x0196, 14345 }, +{ 0x0056, 15369 }, +{ 0x0156, 16393 }, +{ 0x00d6, 17417 }, +{ 0x01d6, 18441 }, +{ 0x0036, 19465 }, +{ 0x0136, 20489 }, +{ 0x00b6, 21513 }, +{ 0x01b6, 22537 }, +{ 0x0032, 23561 }, +{ 0x0132, 24585 }, +{ 0x00b2, 25609 }, +{ 0x0006, 26630 }, +{ 0x01b2, 27657 }, +{ 0, 0 } +}; + +static struct proto MakeUpB[] = { +{ 0x03c0, 1034 }, +{ 0x0130, 2060 }, +{ 0x0930, 3084 }, +{ 0x0da0, 4108 }, +{ 0x0cc0, 5132 }, +{ 0x02c0, 6156 }, +{ 0x0ac0, 7180 }, +{ 0x06c0, 8205 }, +{ 0x16c0, 9229 }, +{ 0x0a40, 10253 }, +{ 0x1a40, 11277 }, +{ 0x0640, 12301 }, +{ 0x1640, 13325 }, +{ 0x09c0, 14349 }, +{ 0x19c0, 15373 }, +{ 0x05c0, 16397 }, +{ 0x15c0, 17421 }, +{ 0x0dc0, 18445 }, +{ 0x1dc0, 19469 }, +{ 0x0940, 20493 }, +{ 0x1940, 21517 }, +{ 0x0540, 22541 }, +{ 0x1540, 23565 }, +{ 0x0b40, 24589 }, +{ 0x1b40, 25613 }, +{ 0x04c0, 26637 }, +{ 0x14c0, 27661 }, +{ 0, 0 } +}; + +static struct proto MakeUp[] = { +{ 0x0080, 28683 }, +{ 0x0180, 29707 }, +{ 0x0580, 30731 }, +{ 0x0480, 31756 }, +{ 0x0c80, 32780 }, +{ 0x0280, 33804 }, +{ 0x0a80, 34828 }, +{ 0x0680, 35852 }, +{ 0x0e80, 36876 }, +{ 0x0380, 37900 }, +{ 0x0b80, 38924 }, +{ 0x0780, 39948 }, +{ 0x0f80, 40972 }, +{ 0, 0 } +}; + +static struct proto TermW[] = { +{ 0x00ac, 8 }, +{ 0x0038, 22 }, +{ 0x000e, 36 }, +{ 0x0001, 52 }, +{ 0x000d, 68 }, +{ 0x0003, 84 }, +{ 0x0007, 100 }, +{ 0x000f, 116 }, +{ 0x0019, 133 }, +{ 0x0005, 149 }, +{ 0x001c, 165 }, +{ 0x0002, 181 }, +{ 0x0004, 198 }, +{ 0x0030, 214 }, +{ 0x000b, 230 }, +{ 0x002b, 246 }, +{ 0x0015, 262 }, +{ 0x0035, 278 }, +{ 0x0072, 295 }, +{ 0x0018, 311 }, +{ 0x0008, 327 }, +{ 0x0074, 343 }, +{ 0x0060, 359 }, +{ 0x0010, 375 }, +{ 0x000a, 391 }, +{ 0x006a, 407 }, +{ 0x0064, 423 }, +{ 0x0012, 439 }, +{ 0x000c, 455 }, +{ 0x0040, 472 }, +{ 0x00c0, 488 }, +{ 0x0058, 504 }, +{ 0x00d8, 520 }, +{ 0x0048, 536 }, +{ 0x00c8, 552 }, +{ 0x0028, 568 }, +{ 0x00a8, 584 }, +{ 0x0068, 600 }, +{ 0x00e8, 616 }, +{ 0x0014, 632 }, +{ 0x0094, 648 }, +{ 0x0054, 664 }, +{ 0x00d4, 680 }, +{ 0x0034, 696 }, +{ 0x00b4, 712 }, +{ 0x0020, 728 }, +{ 0x00a0, 744 }, +{ 0x0050, 760 }, +{ 0x00d0, 776 }, +{ 0x004a, 792 }, +{ 0x00ca, 808 }, +{ 0x002a, 824 }, +{ 0x00aa, 840 }, +{ 0x0024, 856 }, +{ 0x00a4, 872 }, +{ 0x001a, 888 }, +{ 0x009a, 904 }, +{ 0x005a, 920 }, +{ 0x00da, 936 }, +{ 0x0052, 952 }, +{ 0x00d2, 968 }, +{ 0x004c, 984 }, +{ 0x00cc, 1000 }, +{ 0x002c, 1016 }, +{ 0, 0 } +}; + +static struct proto TermB[] = { +{ 0x03b0, 10 }, +{ 0x0002, 19 }, +{ 0x0003, 34 }, +{ 0x0001, 50 }, +{ 0x0006, 67 }, +{ 0x000c, 84 }, +{ 0x0004, 100 }, +{ 0x0018, 117 }, +{ 0x0028, 134 }, +{ 0x0008, 150 }, +{ 0x0010, 167 }, +{ 0x0050, 183 }, +{ 0x0070, 199 }, +{ 0x0020, 216 }, +{ 0x00e0, 232 }, +{ 0x0030, 249 }, +{ 0x03a0, 266 }, +{ 0x0060, 282 }, +{ 0x0040, 298 }, +{ 0x0730, 315 }, +{ 0x00b0, 331 }, +{ 0x01b0, 347 }, +{ 0x0760, 363 }, +{ 0x00a0, 379 }, +{ 0x0740, 395 }, +{ 0x00c0, 411 }, +{ 0x0530, 428 }, +{ 0x0d30, 444 }, +{ 0x0330, 460 }, +{ 0x0b30, 476 }, +{ 0x0160, 492 }, +{ 0x0960, 508 }, +{ 0x0560, 524 }, +{ 0x0d60, 540 }, +{ 0x04b0, 556 }, +{ 0x0cb0, 572 }, +{ 0x02b0, 588 }, +{ 0x0ab0, 604 }, +{ 0x06b0, 620 }, +{ 0x0eb0, 636 }, +{ 0x0360, 652 }, +{ 0x0b60, 668 }, +{ 0x05b0, 684 }, +{ 0x0db0, 700 }, +{ 0x02a0, 716 }, +{ 0x0aa0, 732 }, +{ 0x06a0, 748 }, +{ 0x0ea0, 764 }, +{ 0x0260, 780 }, +{ 0x0a60, 796 }, +{ 0x04a0, 812 }, +{ 0x0ca0, 828 }, +{ 0x0240, 844 }, +{ 0x0ec0, 860 }, +{ 0x01c0, 876 }, +{ 0x0e40, 892 }, +{ 0x0140, 908 }, +{ 0x01a0, 924 }, +{ 0x09a0, 940 }, +{ 0x0d40, 956 }, +{ 0x0340, 972 }, +{ 0x05a0, 988 }, +{ 0x0660, 1004 }, +{ 0x0e60, 1020 }, +{ 0, 0 } +}; + +static struct proto EOLH[] = { +{ 0x0000, 11 }, +{ 0, 0 } +}; + +static void +FillTable(TIFFFaxTabEnt *T, int Size, struct proto *P, int State) +{ + int limit = 1 << Size; + + while (P->val) { + int width = P->val & 15; + int param = P->val >> 4; + int incr = 1 << width; + int code; + for (code = P->code; code < limit; code += incr) { + TIFFFaxTabEnt *E = T+code; + E->State = State; + E->Width = width; + E->Param = param; + } + P++; + } +} + +static char* storage_class = ""; +static char* const_class = ""; +static int packoutput = 1; +static char* prebrace = ""; +static char* postbrace = ""; + +void +WriteTable(FILE* fd, const TIFFFaxTabEnt* T, int Size, const char* name) +{ + int i; + char* sep; + + fprintf(fd, "%s %s TIFFFaxTabEnt %s[%d] = {", + storage_class, const_class, name, Size); + if (packoutput) { + sep = "\n"; + for (i = 0; i < Size; i++) { + fprintf(fd, "%s%s%d,%d,%d%s", + sep, prebrace, T->State, T->Width, (int) T->Param, postbrace); + if (((i+1) % 10) == 0) + sep = ",\n"; + else + sep = ","; + T++; + } + } else { + sep = "\n "; + for (i = 0; i < Size; i++) { + fprintf(fd, "%s%s%3d,%3d,%4d%s", + sep, prebrace, T->State, T->Width, (int) T->Param, postbrace); + if (((i+1) % 6) == 0) + sep = ",\n "; + else + sep = ","; + T++; + } + } + fprintf(fd, "\n};\n"); +} + +/* initialise the huffman code tables */ +int +main(int argc, char* argv[]) +{ + FILE* fd; + char* outputfile; + int c; + extern int optind; + extern char* optarg; + + while ((c = getopt(argc, argv, "c:s:bp")) != -1) + switch (c) { + case 'c': + const_class = optarg; + break; + case 's': + storage_class = optarg; + break; + case 'p': + packoutput = 0; + break; + case 'b': + prebrace = "{"; + postbrace = "}"; + break; + case '?': + fprintf(stderr, + "usage: %s [-c const] [-s storage] [-p] [-b] file\n", + argv[0]); + return (-1); + } + outputfile = optind < argc ? argv[optind] : "g3states.h"; + fd = fopen(outputfile, "w"); + if (fd == NULL) { + fprintf(stderr, "%s: %s: Cannot create output file.\n", + argv[0], outputfile); + return (-2); + } + FillTable(MainTable, 7, Pass, S_Pass); + FillTable(MainTable, 7, Horiz, S_Horiz); + FillTable(MainTable, 7, V0, S_V0); + FillTable(MainTable, 7, VR, S_VR); + FillTable(MainTable, 7, VL, S_VL); + FillTable(MainTable, 7, Ext, S_Ext); + FillTable(MainTable, 7, EOLV, S_EOL); + FillTable(WhiteTable, 12, MakeUpW, S_MakeUpW); + FillTable(WhiteTable, 12, MakeUp, S_MakeUp); + FillTable(WhiteTable, 12, TermW, S_TermW); + FillTable(WhiteTable, 12, EOLH, S_EOL); + FillTable(BlackTable, 13, MakeUpB, S_MakeUpB); + FillTable(BlackTable, 13, MakeUp, S_MakeUp); + FillTable(BlackTable, 13, TermB, S_TermB); + FillTable(BlackTable, 13, EOLH, S_EOL); + + fprintf(fd, "/* WARNING, this file was automatically generated by the\n"); + fprintf(fd, " mkg3states program */\n"); + fprintf(fd, "#include \"tiff.h\"\n"); + fprintf(fd, "#include \"tif_fax3.h\"\n"); + WriteTable(fd, MainTable, 128, "TIFFFaxMainTable"); + WriteTable(fd, WhiteTable, 4096, "TIFFFaxWhiteTable"); + WriteTable(fd, BlackTable, 8192, "TIFFFaxBlackTable"); + fclose(fd); + return (0); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/t4.h b/src/3rdparty/libtiff/libtiff/t4.h new file mode 100644 index 0000000000..10bb17a5cb --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/t4.h @@ -0,0 +1,285 @@ +/* $Id: t4.h,v 1.1.1.1 1999/07/27 21:50:27 mike Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _T4_ +#define _T4_ +/* + * CCITT T.4 1D Huffman runlength codes and + * related definitions. Given the small sizes + * of these tables it does not seem + * worthwhile to make code & length 8 bits. + */ +typedef struct tableentry { + unsigned short length; /* bit length of g3 code */ + unsigned short code; /* g3 code */ + short runlen; /* run length in bits */ +} tableentry; + +#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */ + +/* status values returned instead of a run length */ +#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */ +#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */ +#define G3CODE_EOF -3 /* end of input data */ +#define G3CODE_INCOMP -4 /* incomplete run code */ + +/* + * Note that these tables are ordered such that the + * index into the table is known to be either the + * run length, or (run length / 64) + a fixed offset. + * + * NB: The G3CODE_INVALID entries are only used + * during state generation (see mkg3states.c). + */ +#ifdef G3CODES +const tableentry TIFFFaxWhiteCodes[] = { + { 8, 0x35, 0 }, /* 0011 0101 */ + { 6, 0x7, 1 }, /* 0001 11 */ + { 4, 0x7, 2 }, /* 0111 */ + { 4, 0x8, 3 }, /* 1000 */ + { 4, 0xB, 4 }, /* 1011 */ + { 4, 0xC, 5 }, /* 1100 */ + { 4, 0xE, 6 }, /* 1110 */ + { 4, 0xF, 7 }, /* 1111 */ + { 5, 0x13, 8 }, /* 1001 1 */ + { 5, 0x14, 9 }, /* 1010 0 */ + { 5, 0x7, 10 }, /* 0011 1 */ + { 5, 0x8, 11 }, /* 0100 0 */ + { 6, 0x8, 12 }, /* 0010 00 */ + { 6, 0x3, 13 }, /* 0000 11 */ + { 6, 0x34, 14 }, /* 1101 00 */ + { 6, 0x35, 15 }, /* 1101 01 */ + { 6, 0x2A, 16 }, /* 1010 10 */ + { 6, 0x2B, 17 }, /* 1010 11 */ + { 7, 0x27, 18 }, /* 0100 111 */ + { 7, 0xC, 19 }, /* 0001 100 */ + { 7, 0x8, 20 }, /* 0001 000 */ + { 7, 0x17, 21 }, /* 0010 111 */ + { 7, 0x3, 22 }, /* 0000 011 */ + { 7, 0x4, 23 }, /* 0000 100 */ + { 7, 0x28, 24 }, /* 0101 000 */ + { 7, 0x2B, 25 }, /* 0101 011 */ + { 7, 0x13, 26 }, /* 0010 011 */ + { 7, 0x24, 27 }, /* 0100 100 */ + { 7, 0x18, 28 }, /* 0011 000 */ + { 8, 0x2, 29 }, /* 0000 0010 */ + { 8, 0x3, 30 }, /* 0000 0011 */ + { 8, 0x1A, 31 }, /* 0001 1010 */ + { 8, 0x1B, 32 }, /* 0001 1011 */ + { 8, 0x12, 33 }, /* 0001 0010 */ + { 8, 0x13, 34 }, /* 0001 0011 */ + { 8, 0x14, 35 }, /* 0001 0100 */ + { 8, 0x15, 36 }, /* 0001 0101 */ + { 8, 0x16, 37 }, /* 0001 0110 */ + { 8, 0x17, 38 }, /* 0001 0111 */ + { 8, 0x28, 39 }, /* 0010 1000 */ + { 8, 0x29, 40 }, /* 0010 1001 */ + { 8, 0x2A, 41 }, /* 0010 1010 */ + { 8, 0x2B, 42 }, /* 0010 1011 */ + { 8, 0x2C, 43 }, /* 0010 1100 */ + { 8, 0x2D, 44 }, /* 0010 1101 */ + { 8, 0x4, 45 }, /* 0000 0100 */ + { 8, 0x5, 46 }, /* 0000 0101 */ + { 8, 0xA, 47 }, /* 0000 1010 */ + { 8, 0xB, 48 }, /* 0000 1011 */ + { 8, 0x52, 49 }, /* 0101 0010 */ + { 8, 0x53, 50 }, /* 0101 0011 */ + { 8, 0x54, 51 }, /* 0101 0100 */ + { 8, 0x55, 52 }, /* 0101 0101 */ + { 8, 0x24, 53 }, /* 0010 0100 */ + { 8, 0x25, 54 }, /* 0010 0101 */ + { 8, 0x58, 55 }, /* 0101 1000 */ + { 8, 0x59, 56 }, /* 0101 1001 */ + { 8, 0x5A, 57 }, /* 0101 1010 */ + { 8, 0x5B, 58 }, /* 0101 1011 */ + { 8, 0x4A, 59 }, /* 0100 1010 */ + { 8, 0x4B, 60 }, /* 0100 1011 */ + { 8, 0x32, 61 }, /* 0011 0010 */ + { 8, 0x33, 62 }, /* 0011 0011 */ + { 8, 0x34, 63 }, /* 0011 0100 */ + { 5, 0x1B, 64 }, /* 1101 1 */ + { 5, 0x12, 128 }, /* 1001 0 */ + { 6, 0x17, 192 }, /* 0101 11 */ + { 7, 0x37, 256 }, /* 0110 111 */ + { 8, 0x36, 320 }, /* 0011 0110 */ + { 8, 0x37, 384 }, /* 0011 0111 */ + { 8, 0x64, 448 }, /* 0110 0100 */ + { 8, 0x65, 512 }, /* 0110 0101 */ + { 8, 0x68, 576 }, /* 0110 1000 */ + { 8, 0x67, 640 }, /* 0110 0111 */ + { 9, 0xCC, 704 }, /* 0110 0110 0 */ + { 9, 0xCD, 768 }, /* 0110 0110 1 */ + { 9, 0xD2, 832 }, /* 0110 1001 0 */ + { 9, 0xD3, 896 }, /* 0110 1001 1 */ + { 9, 0xD4, 960 }, /* 0110 1010 0 */ + { 9, 0xD5, 1024 }, /* 0110 1010 1 */ + { 9, 0xD6, 1088 }, /* 0110 1011 0 */ + { 9, 0xD7, 1152 }, /* 0110 1011 1 */ + { 9, 0xD8, 1216 }, /* 0110 1100 0 */ + { 9, 0xD9, 1280 }, /* 0110 1100 1 */ + { 9, 0xDA, 1344 }, /* 0110 1101 0 */ + { 9, 0xDB, 1408 }, /* 0110 1101 1 */ + { 9, 0x98, 1472 }, /* 0100 1100 0 */ + { 9, 0x99, 1536 }, /* 0100 1100 1 */ + { 9, 0x9A, 1600 }, /* 0100 1101 0 */ + { 6, 0x18, 1664 }, /* 0110 00 */ + { 9, 0x9B, 1728 }, /* 0100 1101 1 */ + { 11, 0x8, 1792 }, /* 0000 0001 000 */ + { 11, 0xC, 1856 }, /* 0000 0001 100 */ + { 11, 0xD, 1920 }, /* 0000 0001 101 */ + { 12, 0x12, 1984 }, /* 0000 0001 0010 */ + { 12, 0x13, 2048 }, /* 0000 0001 0011 */ + { 12, 0x14, 2112 }, /* 0000 0001 0100 */ + { 12, 0x15, 2176 }, /* 0000 0001 0101 */ + { 12, 0x16, 2240 }, /* 0000 0001 0110 */ + { 12, 0x17, 2304 }, /* 0000 0001 0111 */ + { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ + { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ + { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ + { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ + { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ + { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ + { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ + { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ + { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ +}; + +const tableentry TIFFFaxBlackCodes[] = { + { 10, 0x37, 0 }, /* 0000 1101 11 */ + { 3, 0x2, 1 }, /* 010 */ + { 2, 0x3, 2 }, /* 11 */ + { 2, 0x2, 3 }, /* 10 */ + { 3, 0x3, 4 }, /* 011 */ + { 4, 0x3, 5 }, /* 0011 */ + { 4, 0x2, 6 }, /* 0010 */ + { 5, 0x3, 7 }, /* 0001 1 */ + { 6, 0x5, 8 }, /* 0001 01 */ + { 6, 0x4, 9 }, /* 0001 00 */ + { 7, 0x4, 10 }, /* 0000 100 */ + { 7, 0x5, 11 }, /* 0000 101 */ + { 7, 0x7, 12 }, /* 0000 111 */ + { 8, 0x4, 13 }, /* 0000 0100 */ + { 8, 0x7, 14 }, /* 0000 0111 */ + { 9, 0x18, 15 }, /* 0000 1100 0 */ + { 10, 0x17, 16 }, /* 0000 0101 11 */ + { 10, 0x18, 17 }, /* 0000 0110 00 */ + { 10, 0x8, 18 }, /* 0000 0010 00 */ + { 11, 0x67, 19 }, /* 0000 1100 111 */ + { 11, 0x68, 20 }, /* 0000 1101 000 */ + { 11, 0x6C, 21 }, /* 0000 1101 100 */ + { 11, 0x37, 22 }, /* 0000 0110 111 */ + { 11, 0x28, 23 }, /* 0000 0101 000 */ + { 11, 0x17, 24 }, /* 0000 0010 111 */ + { 11, 0x18, 25 }, /* 0000 0011 000 */ + { 12, 0xCA, 26 }, /* 0000 1100 1010 */ + { 12, 0xCB, 27 }, /* 0000 1100 1011 */ + { 12, 0xCC, 28 }, /* 0000 1100 1100 */ + { 12, 0xCD, 29 }, /* 0000 1100 1101 */ + { 12, 0x68, 30 }, /* 0000 0110 1000 */ + { 12, 0x69, 31 }, /* 0000 0110 1001 */ + { 12, 0x6A, 32 }, /* 0000 0110 1010 */ + { 12, 0x6B, 33 }, /* 0000 0110 1011 */ + { 12, 0xD2, 34 }, /* 0000 1101 0010 */ + { 12, 0xD3, 35 }, /* 0000 1101 0011 */ + { 12, 0xD4, 36 }, /* 0000 1101 0100 */ + { 12, 0xD5, 37 }, /* 0000 1101 0101 */ + { 12, 0xD6, 38 }, /* 0000 1101 0110 */ + { 12, 0xD7, 39 }, /* 0000 1101 0111 */ + { 12, 0x6C, 40 }, /* 0000 0110 1100 */ + { 12, 0x6D, 41 }, /* 0000 0110 1101 */ + { 12, 0xDA, 42 }, /* 0000 1101 1010 */ + { 12, 0xDB, 43 }, /* 0000 1101 1011 */ + { 12, 0x54, 44 }, /* 0000 0101 0100 */ + { 12, 0x55, 45 }, /* 0000 0101 0101 */ + { 12, 0x56, 46 }, /* 0000 0101 0110 */ + { 12, 0x57, 47 }, /* 0000 0101 0111 */ + { 12, 0x64, 48 }, /* 0000 0110 0100 */ + { 12, 0x65, 49 }, /* 0000 0110 0101 */ + { 12, 0x52, 50 }, /* 0000 0101 0010 */ + { 12, 0x53, 51 }, /* 0000 0101 0011 */ + { 12, 0x24, 52 }, /* 0000 0010 0100 */ + { 12, 0x37, 53 }, /* 0000 0011 0111 */ + { 12, 0x38, 54 }, /* 0000 0011 1000 */ + { 12, 0x27, 55 }, /* 0000 0010 0111 */ + { 12, 0x28, 56 }, /* 0000 0010 1000 */ + { 12, 0x58, 57 }, /* 0000 0101 1000 */ + { 12, 0x59, 58 }, /* 0000 0101 1001 */ + { 12, 0x2B, 59 }, /* 0000 0010 1011 */ + { 12, 0x2C, 60 }, /* 0000 0010 1100 */ + { 12, 0x5A, 61 }, /* 0000 0101 1010 */ + { 12, 0x66, 62 }, /* 0000 0110 0110 */ + { 12, 0x67, 63 }, /* 0000 0110 0111 */ + { 10, 0xF, 64 }, /* 0000 0011 11 */ + { 12, 0xC8, 128 }, /* 0000 1100 1000 */ + { 12, 0xC9, 192 }, /* 0000 1100 1001 */ + { 12, 0x5B, 256 }, /* 0000 0101 1011 */ + { 12, 0x33, 320 }, /* 0000 0011 0011 */ + { 12, 0x34, 384 }, /* 0000 0011 0100 */ + { 12, 0x35, 448 }, /* 0000 0011 0101 */ + { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */ + { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */ + { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */ + { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */ + { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */ + { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */ + { 13, 0x72, 896 }, /* 0000 0011 1001 0 */ + { 13, 0x73, 960 }, /* 0000 0011 1001 1 */ + { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */ + { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */ + { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */ + { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */ + { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */ + { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */ + { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */ + { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */ + { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */ + { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */ + { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */ + { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */ + { 11, 0x8, 1792 }, /* 0000 0001 000 */ + { 11, 0xC, 1856 }, /* 0000 0001 100 */ + { 11, 0xD, 1920 }, /* 0000 0001 101 */ + { 12, 0x12, 1984 }, /* 0000 0001 0010 */ + { 12, 0x13, 2048 }, /* 0000 0001 0011 */ + { 12, 0x14, 2112 }, /* 0000 0001 0100 */ + { 12, 0x15, 2176 }, /* 0000 0001 0101 */ + { 12, 0x16, 2240 }, /* 0000 0001 0110 */ + { 12, 0x17, 2304 }, /* 0000 0001 0111 */ + { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ + { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ + { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ + { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ + { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ + { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ + { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ + { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ + { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ +}; +#else +extern const tableentry TIFFFaxWhiteCodes[]; +extern const tableentry TIFFFaxBlackCodes[]; +#endif +#endif /* _T4_ */ diff --git a/src/3rdparty/libtiff/libtiff/tif_acorn.c b/src/3rdparty/libtiff/libtiff/tif_acorn.c new file mode 100644 index 0000000000..478390fc59 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_acorn.c @@ -0,0 +1,519 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_acorn.c,v 1.2 2005/12/21 12:23:13 joris Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library RISC OS specific Routines. + * Developed out of the Unix version. + * Peter Greenham, May 1995 + */ +#include "tiffiop.h" +#include +#include + +/* +Low-level file handling +~~~~~~~~~~~~~~~~~~~~~~~ +The functions in osfcn.h are unavailable when compiling under C, as it's a +C++ header. Therefore they have been implemented here. + +Now, why have I done it this way? + +The definitive API library for RISC OS is Jonathan Coxhead's OSLib, which +uses heavily optimised ARM assembler or even plain inline SWI calls for +maximum performance and minimum runtime size. However, I don't want to make +LIBTIFF need that to survive. Therefore I have also emulated the functions +using macros to _swi() and _swix() defined in the swis.h header, and +borrowing types from kernel.h, which is less efficient but doesn't need any +third-party libraries. + */ + +#ifdef INCLUDE_OSLIB + +#include "osfile.h" +#include "osgbpb.h" +#include "osargs.h" +#include "osfind.h" + +#else + +/* OSLIB EMULATION STARTS */ + +#include "kernel.h" +#include "swis.h" + +/* From oslib:types.h */ +typedef unsigned int bits; +typedef unsigned char byte; +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef NULL +#define NULL 0 +#endif +#ifndef SKIP +#define SKIP 0 +#endif + +/* From oslib:os.h */ +typedef _kernel_oserror os_error; +typedef byte os_f; + +/* From oslib:osfile.h */ +#undef OS_File +#define OS_File 0x8 + +/* From oslib:osgbpb.h */ +#undef OS_GBPB +#define OS_GBPB 0xC +#undef OSGBPB_Write +#define OSGBPB_Write 0x2 +#undef OSGBPB_Read +#define OSGBPB_Read 0x4 + +extern os_error *xosgbpb_write (os_f file, + byte *data, + int size, + int *unwritten); +extern int osgbpb_write (os_f file, + byte *data, + int size); + +#define xosgbpb_write(file, data, size, unwritten) \ + (os_error*) _swix(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_IN(4)|_OUT(3), \ + OSGBPB_WriteAt, \ + file, \ + data, \ + size, \ + unwritten) + +#define osgbpb_write(file, data, size) \ + _swi(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_RETURN(3), \ + OSGBPB_Write, \ + file, \ + data, \ + size) + +extern os_error *xosgbpb_read (os_f file, + byte *buffer, + int size, + int *unread); +extern int osgbpb_read (os_f file, + byte *buffer, + int size); + +#define xosgbpb_read(file, buffer, size, unread) \ + (os_error*) _swix(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_OUT(3), \ + OSGBPB_Read, \ + file, \ + buffer, \ + size, \ + unread) + +#define osgbpb_read(file, buffer, size) \ + _swi(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_RETURN(3), \ + OSGBPB_Read, \ + file, \ + buffer, \ + size) + +/* From oslib:osfind.h */ +#undef OS_Find +#define OS_Find 0xD +#undef OSFind_Openin +#define OSFind_Openin 0x40 +#undef OSFind_Openout +#define OSFind_Openout 0x80 +#undef OSFind_Openup +#define OSFind_Openup 0xC0 +#undef OSFind_Close +#define OSFind_Close 0x0 + +#define xosfind_open(reason, file_name, path, file) \ + (os_error*) _swix(OS_Find, _IN(0)|_IN(1)|_IN(2)|_OUT(0), \ + reason, file_name, path, file) + +#define osfind_open(reason, file_name, path) \ + (os_f) _swi(OS_Find, _IN(0)|_IN(1)|_IN(2)|_RETURN(0), \ + reason, file_name, path) + +extern os_error *xosfind_openin (bits flags, + char *file_name, + char *path, + os_f *file); +extern os_f osfind_openin (bits flags, + char *file_name, + char *path); + +#define xosfind_openin(flags, file_name, path, file) \ + xosfind_open(flags | OSFind_Openin, file_name, path, file) + +#define osfind_openin(flags, file_name, path) \ + osfind_open(flags | OSFind_Openin, file_name, path) + +extern os_error *xosfind_openout (bits flags, + char *file_name, + char *path, + os_f *file); +extern os_f osfind_openout (bits flags, + char *file_name, + char *path); + +#define xosfind_openout(flags, file_name, path, file) \ + xosfind_open(flags | OSFind_Openout, file_name, path, file) + +#define osfind_openout(flags, file_name, path) \ + osfind_open(flags | OSFind_Openout, file_name, path) + +extern os_error *xosfind_openup (bits flags, + char *file_name, + char *path, + os_f *file); +extern os_f osfind_openup (bits flags, + char *file_name, + char *path); + +#define xosfind_openup(flags, file_name, path, file) \ + xosfind_open(flags | OSFind_Openup, file_name, path, file) + +#define osfind_openup(flags, file_name, path) \ + osfind_open(flags | OSFind_Openup, file_name, path) + +extern os_error *xosfind_close (os_f file); +extern void osfind_close (os_f file); + +#define xosfind_close(file) \ + (os_error*) _swix(OS_Find, _IN(0)|_IN(1), \ + OSFind_Close, \ + file) + +#define osfind_close(file) \ + (void) _swi(OS_Find, _IN(0)|_IN(1), \ + OSFind_Close, \ + file) + +/* From oslib:osargs.h */ +#undef OS_Args +#define OS_Args 0x9 +#undef OSArgs_ReadPtr +#define OSArgs_ReadPtr 0x0 +#undef OSArgs_SetPtr +#define OSArgs_SetPtr 0x1 +#undef OSArgs_ReadExt +#define OSArgs_ReadExt 0x2 + +extern os_error *xosargs_read_ptr (os_f file, + int *ptr); +extern int osargs_read_ptr (os_f file); + +#define xosargs_read_ptr(file, ptr) \ + (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_OUT(2), \ + OSArgs_ReadPtr, \ + file, \ + ptr) + +#define osargs_read_ptr(file) \ + _swi(OS_Args, _IN(0)|_IN(1)|_RETURN(2), \ + OSArgs_ReadPtr, \ + file) + +extern os_error *xosargs_set_ptr (os_f file, + int ptr); +extern void osargs_set_ptr (os_f file, + int ptr); + +#define xosargs_set_ptr(file, ptr) \ + (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_IN(2), \ + OSArgs_SetPtr, \ + file, \ + ptr) + +#define osargs_set_ptr(file, ptr) \ + (void) _swi(OS_Args, _IN(0)|_IN(1)|_IN(2), \ + OSArgs_SetPtr, \ + file, \ + ptr) + +extern os_error *xosargs_read_ext (os_f file, + int *ext); +extern int osargs_read_ext (os_f file); + +#define xosargs_read_ext(file, ext) \ + (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_OUT(2), \ + OSArgs_ReadExt, \ + file, \ + ext) + +#define osargs_read_ext(file) \ + _swi(OS_Args, _IN(0)|_IN(1)|_RETURN(2), \ + OSArgs_ReadExt, \ + file) + +/* OSLIB EMULATION ENDS */ + +#endif + +#ifndef __osfcn_h +/* Will be set or not during tiffcomp.h */ +/* You get this to compile under C++? Please say how! */ + +extern int open(const char* name, int flags, int mode) +{ + /* From what I can tell, should return <0 for failure */ + os_error* e = (os_error*) 1; /* Cheeky way to use a pointer eh? :-) */ + os_f file = (os_f) -1; + + flags = flags; + + switch(mode) + { + case O_RDONLY: + { + e = xosfind_openin(SKIP, name, SKIP, &file); + break; + } + case O_WRONLY: + case O_RDWR|O_CREAT: + case O_RDWR|O_CREAT|O_TRUNC: + { + e = xosfind_openout(SKIP, name, SKIP, &file); + break; + } + case O_RDWR: + { + e = xosfind_openup(SKIP, name, SKIP, &file); + break; + } + } + if (e) + { + file = (os_f) -1; + } + return (file); +} + +extern int close(int fd) +{ + return ((int) xosfind_close((os_f) fd)); +} + +extern int write(int fd, const char *buf, int nbytes) +{ + /* Returns number of bytes written */ + return (nbytes - osgbpb_write((os_f) fd, (const byte*) buf, nbytes)); +} + +extern int read(int fd, char *buf, int nbytes) +{ + /* Returns number of bytes read */ + return (nbytes - osgbpb_read((os_f) fd, (byte*) buf, nbytes)); +} + +extern off_t lseek(int fd, off_t offset, int whence) +{ + int absolute = 0; + + switch (whence) + { + case SEEK_SET: + { + absolute = (int) offset; + break; + } + case SEEK_CUR: + { + absolute = osargs_read_ptr((os_f) fd) + (int) offset; + break; + } + case SEEK_END: + { + absolute = osargs_read_ext((os_f) fd) + (int) offset; + break; + } + } + + osargs_set_ptr((os_f) fd, absolute); + + return ((off_t) osargs_read_ptr((os_f) fd)); +} +#endif + +static tsize_t +_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return ((tsize_t) read((int) fd, buf, (size_t) size)); +} + +static tsize_t +_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return ((tsize_t) write((int) fd, buf, (size_t) size)); +} + +static toff_t +_tiffSeekProc(thandle_t fd, toff_t off, int whence) +{ + return ((toff_t) lseek((int) fd, (off_t) off, whence)); +} + +static int +_tiffCloseProc(thandle_t fd) +{ + return (close((int) fd)); +} + +static toff_t +_tiffSizeProc(thandle_t fd) +{ + return (lseek((int) fd, SEEK_END, SEEK_SET)); +} + +#ifdef HAVE_MMAP +#error "I didn't know Acorn had that!" +#endif + +/* !HAVE_MMAP */ +static int +_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + (void) fd; (void) pbase; (void) psize; + return (0); +} + +static void +_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ + (void) fd; (void) base; (void) size; +} + +/* + * Open a TIFF file descriptor for read/writing. + */ +TIFF* +TIFFFdOpen(int fd, const char* name, const char* mode) +{ + TIFF* tif; + + tif = TIFFClientOpen(name, mode, + (thandle_t) fd, + _tiffReadProc, _tiffWriteProc, + _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, + _tiffMapProc, _tiffUnmapProc); + if (tif) + { + tif->tif_fd = fd; + } + return (tif); +} + +/* + * Open a TIFF file for read/writing. + */ +TIFF* +TIFFOpen(const char* name, const char* mode) +{ + static const char module[] = "TIFFOpen"; + int m, fd; + + m = _TIFFgetMode(mode, module); + + if (m == -1) + { + return ((TIFF*) 0); + } + + fd = open(name, 0, m); + + if (fd < 0) + { + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF *)0); + } + return (TIFFFdOpen(fd, name, mode)); +} + +void* +_TIFFmalloc(tsize_t s) +{ + return (malloc((size_t) s)); +} + +void +_TIFFfree(tdata_t p) +{ + free(p); +} + +void* +_TIFFrealloc(tdata_t p, tsize_t s) +{ + return (realloc(p, (size_t) s)); +} + +void +_TIFFmemset(tdata_t p, int v, tsize_t c) +{ + memset(p, v, (size_t) c); +} + +void +_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c) +{ + memcpy(d, s, (size_t) c); +} + +int +_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) +{ + return (memcmp(p1, p2, (size_t) c)); +} + +static void +acornWarningHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + { + fprintf(stderr, "%s: ", module); + } + fprintf(stderr, "Warning, "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFwarningHandler = acornWarningHandler; + +static void +acornErrorHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + { + fprintf(stderr, "%s: ", module); + } + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFerrorHandler = acornErrorHandler; diff --git a/src/3rdparty/libtiff/libtiff/tif_apple.c b/src/3rdparty/libtiff/libtiff/tif_apple.c new file mode 100644 index 0000000000..47e0e0767f --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_apple.c @@ -0,0 +1,274 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_apple.c,v 1.3 2005/12/21 12:23:13 joris Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library Macintosh-specific routines. + * + * These routines use only Toolbox and high-level File Manager traps. + * They make no calls to the THINK C "unix" compatibility library. Also, + * malloc is not used directly but it is still referenced internally by + * the ANSI library in rare cases. Heap fragmentation by the malloc ring + * buffer is therefore minimized. + * + * O_RDONLY and O_RDWR are treated identically here. The tif_mode flag is + * checked in TIFFWriteCheck(). + * + * Create below fills in a blank creator signature and sets the file type + * to 'TIFF'. It is much better for the application to do this by Create'ing + * the file first and TIFFOpen'ing it later. + * --------- + * This code has been "Carbonized", and may not work with older MacOS versions. + * If so, grab the tif_apple.c out of an older libtiff distribution, like + * 3.5.5 from www.libtiff.org. + */ + +#include "tiffiop.h" +#include +#include +#include +#include + +#if defined(__PPCC__) || defined(__SC__) || defined(__MRC__) || defined(applec) +#define CtoPstr c2pstr +#endif + +static tsize_t +_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return (FSRead((short) fd, (long*) &size, (char*) buf) == noErr ? + size : (tsize_t) -1); +} + +static tsize_t +_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return (FSWrite((short) fd, (long*) &size, (char*) buf) == noErr ? + size : (tsize_t) -1); +} + +static toff_t +_tiffSeekProc(thandle_t fd, toff_t off, int whence) +{ + long fpos, size; + + if (GetEOF((short) fd, &size) != noErr) + return EOF; + (void) GetFPos((short) fd, &fpos); + + switch (whence) { + case SEEK_CUR: + if (off + fpos > size) + SetEOF((short) fd, off + fpos); + if (SetFPos((short) fd, fsFromMark, off) != noErr) + return EOF; + break; + case SEEK_END: + if (off > 0) + SetEOF((short) fd, off + size); + if (SetFPos((short) fd, fsFromStart, off + size) != noErr) + return EOF; + break; + case SEEK_SET: + if (off > size) + SetEOF((short) fd, off); + if (SetFPos((short) fd, fsFromStart, off) != noErr) + return EOF; + break; + } + + return (toff_t)(GetFPos((short) fd, &fpos) == noErr ? fpos : EOF); +} + +static int +_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + return (0); +} + +static void +_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ +} + +static int +_tiffCloseProc(thandle_t fd) +{ + return (FSClose((short) fd)); +} + +static toff_t +_tiffSizeProc(thandle_t fd) +{ + long size; + + if (GetEOF((short) fd, &size) != noErr) { + TIFFErrorExt(fd, "_tiffSizeProc", "%s: Cannot get file size"); + return (-1L); + } + return ((toff_t) size); +} + +/* + * Open a TIFF file descriptor for read/writing. + */ +TIFF* +TIFFFdOpen(int fd, const char* name, const char* mode) +{ + TIFF* tif; + + tif = TIFFClientOpen(name, mode, (thandle_t) fd, + _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, + _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); + if (tif) + tif->tif_fd = fd; + return (tif); +} + +static void ourc2pstr( char* inString ) +{ + int sLen = strlen( inString ); + BlockMoveData( inString, &inString[1], sLen ); + inString[0] = sLen; +} + +/* + * Open a TIFF file for read/writing. + */ +TIFF* +TIFFOpen(const char* name, const char* mode) +{ + static const char module[] = "TIFFOpen"; + Str255 pname; + FInfo finfo; + short fref; + OSErr err; + FSSpec fSpec; + + strcpy((char*) pname, name); + ourc2pstr((char*) pname); + + err = FSMakeFSSpec( 0, 0, pname, &fSpec ); + + switch (_TIFFgetMode(mode, module)) { + default: + return ((TIFF*) 0); + case O_RDWR | O_CREAT | O_TRUNC: + if (FSpGetFInfo(&fSpec, &finfo) == noErr) + FSpDelete(&fSpec); + /* fall through */ + case O_RDWR | O_CREAT: + if ((err = FSpGetFInfo(&fSpec, &finfo)) == fnfErr) { + if (FSpCreate(&fSpec, ' ', 'TIFF', smSystemScript) != noErr) + goto badCreate; + if (FSpOpenDF(&fSpec, fsRdWrPerm, &fref) != noErr) + goto badOpen; + } else if (err == noErr) { + if (FSpOpenDF(&fSpec, fsRdWrPerm, &fref) != noErr) + goto badOpen; + } else + goto badOpen; + break; + case O_RDONLY: + if (FSpOpenDF(&fSpec, fsRdPerm, &fref) != noErr) + goto badOpen; + break; + case O_RDWR: + if (FSpOpenDF(&fSpec, fsRdWrPerm, &fref) != noErr) + goto badOpen; + break; + } + return (TIFFFdOpen((int) fref, name, mode)); +badCreate: + TIFFErrorExt(0, module, "%s: Cannot create", name); + return ((TIFF*) 0); +badOpen: + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF*) 0); +} + +void +_TIFFmemset(tdata_t p, int v, tsize_t c) +{ + memset(p, v, (size_t) c); +} + +void +_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c) +{ + memcpy(d, s, (size_t) c); +} + +int +_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) +{ + return (memcmp(p1, p2, (size_t) c)); +} + +tdata_t +_TIFFmalloc(tsize_t s) +{ + return (NewPtr((size_t) s)); +} + +void +_TIFFfree(tdata_t p) +{ + DisposePtr(p); +} + +tdata_t +_TIFFrealloc(tdata_t p, tsize_t s) +{ + Ptr n = p; + + SetPtrSize(p, (size_t) s); + if (MemError() && (n = NewPtr((size_t) s)) != NULL) { + BlockMove(p, n, GetPtrSize(p)); + DisposePtr(p); + } + return ((tdata_t) n); +} + +static void +appleWarningHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + fprintf(stderr, "%s: ", module); + fprintf(stderr, "Warning, "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFwarningHandler = appleWarningHandler; + +static void +appleErrorHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + fprintf(stderr, "%s: ", module); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFerrorHandler = appleErrorHandler; diff --git a/src/3rdparty/libtiff/libtiff/tif_atari.c b/src/3rdparty/libtiff/libtiff/tif_atari.c new file mode 100644 index 0000000000..a519fa4426 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_atari.c @@ -0,0 +1,243 @@ +/* "$Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_atari.c,v 1.2 2005/12/21 12:23:13 joris Exp $" */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library ATARI-specific Routines. + */ +#include "tiffiop.h" +#if defined(__TURBOC__) +#include +#include +#else +#include +#include +#endif + +#ifndef O_ACCMODE +#define O_ACCMODE 3 +#endif + +#include + +#define AEFILNF -33 + +static tsize_t +_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + long r; + + r = Fread((int) fd, size, buf); + if (r < 0) { + errno = (int)-r; + r = -1; + } + return r; +} + +static tsize_t +_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + long r; + + r = Fwrite((int) fd, size, buf); + if (r < 0) { + errno = (int)-r; + r = -1; + } + return r; +} + +static toff_t +_tiffSeekProc(thandle_t fd, off_t off, int whence) +{ + char buf[256]; + long current_off, expected_off, new_off; + + if (whence == SEEK_END || off <= 0) + return Fseek(off, (int) fd, whence); + current_off = Fseek(0, (int) fd, SEEK_CUR); /* find out where we are */ + if (whence == SEEK_SET) + expected_off = off; + else + expected_off = off + current_off; + new_off = Fseek(off, (int) fd, whence); + if (new_off == expected_off) + return new_off; + /* otherwise extend file -- zero filling the hole */ + if (new_off < 0) /* error? */ + new_off = Fseek(0, (int) fd, SEEK_END); /* go to eof */ + _TIFFmemset(buf, 0, sizeof(buf)); + while (expected_off > new_off) { + off = expected_off - new_off; + if (off > sizeof(buf)) + off = sizeof(buf); + if ((current_off = Fwrite((int) fd, off, buf)) != off) + return (current_off > 0) ? + new_off + current_off : new_off; + new_off += off; + } + return new_off; +} + +static int +_tiffCloseProc(thandle_t fd) +{ + long r; + + r = Fclose((int) fd); + if (r < 0) { + errno = (int)-r; + r = -1; + } + return (int)r; +} + +static toff_t +_tiffSizeProc(thandle_t fd) +{ + long pos, eof; + + pos = Fseek(0, (int) fd, SEEK_CUR); + eof = Fseek(0, (int) fd, SEEK_END); + Fseek(pos, (int) fd, SEEK_SET); + return eof; +} + +static int +_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + return (0); +} + +static void +_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ +} + +/* +* Open a TIFF file descriptor for read/writing. +*/ +TIFF* +TIFFFdOpen(int fd, const char* name, const char* mode) +{ + TIFF* tif; + + tif = TIFFClientOpen(name, mode, + (thandle_t) fd, + _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, + _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); + if (tif) + tif->tif_fd = fd; + return (tif); +} + +/* +* Open a TIFF file for read/writing. +*/ +TIFF* +TIFFOpen(const char* name, const char* mode) +{ + static const char module[] = "TIFFOpen"; + int m; + long fd; + + m = _TIFFgetMode(mode, module); + if (m == -1) + return ((TIFF*)0); + if (m & O_TRUNC) { + fd = Fcreate(name, 0); + } else { + fd = Fopen(name, m & O_ACCMODE); + if (fd == AEFILNF && m & O_CREAT) + fd = Fcreate(name, 0); + } + if (fd < 0) + errno = (int)fd; + if (fd < 0) { + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF*)0); + } + return (TIFFFdOpen(fd, name, mode)); +} + +#include + +tdata_t +_TIFFmalloc(tsize_t s) +{ + return (malloc((size_t) s)); +} + +void +_TIFFfree(tdata_t p) +{ + free(p); +} + +tdata_t +_TIFFrealloc(tdata_t p, tsize_t s) +{ + return (realloc(p, (size_t) s)); +} + +void +_TIFFmemset(tdata_t p, int v, size_t c) +{ + memset(p, v, (size_t) c); +} + +void +_TIFFmemcpy(tdata_t d, const tdata_t s, size_t c) +{ + memcpy(d, s, (size_t) c); +} + +int +_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) +{ + return (memcmp(p1, p2, (size_t) c)); +} + +static void +atariWarningHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + fprintf(stderr, "%s: ", module); + fprintf(stderr, "Warning, "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFwarningHandler = atariWarningHandler; + +static void +atariErrorHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + fprintf(stderr, "%s: ", module); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFerrorHandler = atariErrorHandler; diff --git a/src/3rdparty/libtiff/libtiff/tif_aux.c b/src/3rdparty/libtiff/libtiff/tif_aux.c new file mode 100644 index 0000000000..43d591b38a --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_aux.c @@ -0,0 +1,275 @@ +/* $Id: tif_aux.c,v 1.20 2006/06/08 14:24:13 dron Exp $ */ + +/* + * Copyright (c) 1991-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Auxiliary Support Routines. + */ +#include "tiffiop.h" +#include "tif_predict.h" +#include + +tdata_t +_TIFFCheckRealloc(TIFF* tif, tdata_t buffer, + size_t nmemb, size_t elem_size, const char* what) +{ + tdata_t cp = NULL; + tsize_t bytes = nmemb * elem_size; + + /* + * XXX: Check for integer overflow. + */ + if (nmemb && elem_size && bytes / elem_size == nmemb) + cp = _TIFFrealloc(buffer, bytes); + + if (cp == NULL) + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "No space %s", what); + + return cp; +} + +tdata_t +_TIFFCheckMalloc(TIFF* tif, size_t nmemb, size_t elem_size, const char* what) +{ + return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what); +} + +static int +TIFFDefaultTransferFunction(TIFFDirectory* td) +{ + uint16 **tf = td->td_transferfunction; + tsize_t i, n, nbytes; + + tf[0] = tf[1] = tf[2] = 0; + if (td->td_bitspersample >= sizeof(tsize_t) * 8 - 2) + return 0; + + n = 1<td_bitspersample; + nbytes = n * sizeof (uint16); + if (!(tf[0] = (uint16 *)_TIFFmalloc(nbytes))) + return 0; + tf[0][0] = 0; + for (i = 1; i < n; i++) { + double t = (double)i/((double) n-1.); + tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5); + } + + if (td->td_samplesperpixel - td->td_extrasamples > 1) { + if (!(tf[1] = (uint16 *)_TIFFmalloc(nbytes))) + goto bad; + _TIFFmemcpy(tf[1], tf[0], nbytes); + if (!(tf[2] = (uint16 *)_TIFFmalloc(nbytes))) + goto bad; + _TIFFmemcpy(tf[2], tf[0], nbytes); + } + return 1; + +bad: + if (tf[0]) + _TIFFfree(tf[0]); + if (tf[1]) + _TIFFfree(tf[1]); + if (tf[2]) + _TIFFfree(tf[2]); + tf[0] = tf[1] = tf[2] = 0; + return 0; +} + +/* + * Like TIFFGetField, but return any default + * value if the tag is not present in the directory. + * + * NB: We use the value in the directory, rather than + * explcit values so that defaults exist only one + * place in the library -- in TIFFDefaultDirectory. + */ +int +TIFFVGetFieldDefaulted(TIFF* tif, ttag_t tag, va_list ap) +{ + TIFFDirectory *td = &tif->tif_dir; + + if (TIFFVGetField(tif, tag, ap)) + return (1); + switch (tag) { + case TIFFTAG_SUBFILETYPE: + *va_arg(ap, uint32 *) = td->td_subfiletype; + return (1); + case TIFFTAG_BITSPERSAMPLE: + *va_arg(ap, uint16 *) = td->td_bitspersample; + return (1); + case TIFFTAG_THRESHHOLDING: + *va_arg(ap, uint16 *) = td->td_threshholding; + return (1); + case TIFFTAG_FILLORDER: + *va_arg(ap, uint16 *) = td->td_fillorder; + return (1); + case TIFFTAG_ORIENTATION: + *va_arg(ap, uint16 *) = td->td_orientation; + return (1); + case TIFFTAG_SAMPLESPERPIXEL: + *va_arg(ap, uint16 *) = td->td_samplesperpixel; + return (1); + case TIFFTAG_ROWSPERSTRIP: + *va_arg(ap, uint32 *) = td->td_rowsperstrip; + return (1); + case TIFFTAG_MINSAMPLEVALUE: + *va_arg(ap, uint16 *) = td->td_minsamplevalue; + return (1); + case TIFFTAG_MAXSAMPLEVALUE: + *va_arg(ap, uint16 *) = td->td_maxsamplevalue; + return (1); + case TIFFTAG_PLANARCONFIG: + *va_arg(ap, uint16 *) = td->td_planarconfig; + return (1); + case TIFFTAG_RESOLUTIONUNIT: + *va_arg(ap, uint16 *) = td->td_resolutionunit; + return (1); + case TIFFTAG_PREDICTOR: + { + TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data; + *va_arg(ap, uint16*) = (uint16) sp->predictor; + return 1; + } + case TIFFTAG_DOTRANGE: + *va_arg(ap, uint16 *) = 0; + *va_arg(ap, uint16 *) = (1<td_bitspersample)-1; + return (1); + case TIFFTAG_INKSET: + *va_arg(ap, uint16 *) = INKSET_CMYK; + return 1; + case TIFFTAG_NUMBEROFINKS: + *va_arg(ap, uint16 *) = 4; + return (1); + case TIFFTAG_EXTRASAMPLES: + *va_arg(ap, uint16 *) = td->td_extrasamples; + *va_arg(ap, uint16 **) = td->td_sampleinfo; + return (1); + case TIFFTAG_MATTEING: + *va_arg(ap, uint16 *) = + (td->td_extrasamples == 1 && + td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA); + return (1); + case TIFFTAG_TILEDEPTH: + *va_arg(ap, uint32 *) = td->td_tiledepth; + return (1); + case TIFFTAG_DATATYPE: + *va_arg(ap, uint16 *) = td->td_sampleformat-1; + return (1); + case TIFFTAG_SAMPLEFORMAT: + *va_arg(ap, uint16 *) = td->td_sampleformat; + return(1); + case TIFFTAG_IMAGEDEPTH: + *va_arg(ap, uint32 *) = td->td_imagedepth; + return (1); + case TIFFTAG_YCBCRCOEFFICIENTS: + { + /* defaults are from CCIR Recommendation 601-1 */ + static float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f }; + *va_arg(ap, float **) = ycbcrcoeffs; + return 1; + } + case TIFFTAG_YCBCRSUBSAMPLING: + *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0]; + *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1]; + return (1); + case TIFFTAG_YCBCRPOSITIONING: + *va_arg(ap, uint16 *) = td->td_ycbcrpositioning; + return (1); + case TIFFTAG_WHITEPOINT: + { + static float whitepoint[2]; + + /* TIFF 6.0 specification tells that it is no default + value for the WhitePoint, but AdobePhotoshop TIFF + Technical Note tells that it should be CIE D50. */ + whitepoint[0] = D50_X0 / (D50_X0 + D50_Y0 + D50_Z0); + whitepoint[1] = D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0); + *va_arg(ap, float **) = whitepoint; + return 1; + } + case TIFFTAG_TRANSFERFUNCTION: + if (!td->td_transferfunction[0] && + !TIFFDefaultTransferFunction(td)) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag"); + return (0); + } + *va_arg(ap, uint16 **) = td->td_transferfunction[0]; + if (td->td_samplesperpixel - td->td_extrasamples > 1) { + *va_arg(ap, uint16 **) = td->td_transferfunction[1]; + *va_arg(ap, uint16 **) = td->td_transferfunction[2]; + } + return (1); + case TIFFTAG_REFERENCEBLACKWHITE: + { + int i; + static float ycbcr_refblackwhite[] = + { 0.0F, 255.0F, 128.0F, 255.0F, 128.0F, 255.0F }; + static float rgb_refblackwhite[6]; + + for (i = 0; i < 3; i++) { + rgb_refblackwhite[2 * i + 0] = 0.0F; + rgb_refblackwhite[2 * i + 1] = + (float)((1L<td_bitspersample)-1L); + } + + if (td->td_photometric == PHOTOMETRIC_YCBCR) { + /* + * YCbCr (Class Y) images must have the + * ReferenceBlackWhite tag set. Fix the + * broken images, which lacks that tag. + */ + *va_arg(ap, float **) = ycbcr_refblackwhite; + } else { + /* + * Assume RGB (Class R) + */ + *va_arg(ap, float **) = rgb_refblackwhite; + } + return 1; + } + } + return 0; +} + +/* + * Like TIFFGetField, but return any default + * value if the tag is not present in the directory. + */ +int +TIFFGetFieldDefaulted(TIFF* tif, ttag_t tag, ...) +{ + int ok; + va_list ap; + + va_start(ap, tag); + ok = TIFFVGetFieldDefaulted(tif, tag, ap); + va_end(ap); + return (ok); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_close.c b/src/3rdparty/libtiff/libtiff/tif_close.c new file mode 100644 index 0000000000..3623277414 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_close.c @@ -0,0 +1,119 @@ +/* $Id: tif_close.c,v 1.10 2006/03/25 03:09:24 joris Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + */ +#include "tiffiop.h" + +/************************************************************************/ +/* TIFFCleanup() */ +/************************************************************************/ + +/** + * Auxiliary function to free the TIFF structure. Given structure will be + * completetly freed, so you should save opened file handle and pointer + * to the close procedure in external variables before calling + * _TIFFCleanup(), if you will need these ones to close the file. + * + * @param tif A TIFF pointer. + */ + +void +TIFFCleanup(TIFF* tif) +{ + if (tif->tif_mode != O_RDONLY) + /* + * Flush buffered data and directory (if dirty). + */ + TIFFFlush(tif); + (*tif->tif_cleanup)(tif); + TIFFFreeDirectory(tif); + + if (tif->tif_dirlist) + _TIFFfree(tif->tif_dirlist); + + /* Clean up client info links */ + while( tif->tif_clientinfo ) + { + TIFFClientInfoLink *link = tif->tif_clientinfo; + + tif->tif_clientinfo = link->next; + _TIFFfree( link->name ); + _TIFFfree( link ); + } + + if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER)) + _TIFFfree(tif->tif_rawdata); + if (isMapped(tif)) + TIFFUnmapFileContents(tif, tif->tif_base, tif->tif_size); + + /* Clean up custom fields */ + if (tif->tif_nfields > 0) + { + size_t i; + + for (i = 0; i < tif->tif_nfields; i++) + { + TIFFFieldInfo *fld = tif->tif_fieldinfo[i]; + if (fld->field_bit == FIELD_CUSTOM && + strncmp("Tag ", fld->field_name, 4) == 0) + { + _TIFFfree(fld->field_name); + _TIFFfree(fld); + } + } + + _TIFFfree(tif->tif_fieldinfo); + } + + _TIFFfree(tif); +} + +/************************************************************************/ +/* TIFFClose() */ +/************************************************************************/ + +/** + * Close a previously opened TIFF file. + * + * TIFFClose closes a file that was previously opened with TIFFOpen(). + * Any buffered data are flushed to the file, including the contents of + * the current directory (if modified); and all resources are reclaimed. + * + * @param tif A TIFF pointer. + */ + +void +TIFFClose(TIFF* tif) +{ + TIFFCloseProc closeproc = tif->tif_closeproc; + thandle_t fd = tif->tif_clientdata; + + TIFFCleanup(tif); + (void) (*closeproc)(fd); +} + diff --git a/src/3rdparty/libtiff/libtiff/tif_codec.c b/src/3rdparty/libtiff/libtiff/tif_codec.c new file mode 100644 index 0000000000..02fb839b2f --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_codec.c @@ -0,0 +1,153 @@ +/* $Id: tif_codec.c,v 1.10.2.1 2008-12-18 19:50:41 fwarmerdam Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library + * + * Builtin Compression Scheme Configuration Support. + */ +#include "tiffiop.h" + +static int NotConfigured(TIFF*, int); + +#ifndef LZW_SUPPORT +#define TIFFInitLZW NotConfigured +#endif +#ifndef PACKBITS_SUPPORT +#define TIFFInitPackBits NotConfigured +#endif +#ifndef THUNDER_SUPPORT +#define TIFFInitThunderScan NotConfigured +#endif +#ifndef NEXT_SUPPORT +#define TIFFInitNeXT NotConfigured +#endif +#ifndef JPEG_SUPPORT +#define TIFFInitJPEG NotConfigured +#endif +#ifndef OJPEG_SUPPORT +#define TIFFInitOJPEG NotConfigured +#endif +#ifndef CCITT_SUPPORT +#define TIFFInitCCITTRLE NotConfigured +#define TIFFInitCCITTRLEW NotConfigured +#define TIFFInitCCITTFax3 NotConfigured +#define TIFFInitCCITTFax4 NotConfigured +#endif +#ifndef JBIG_SUPPORT +#define TIFFInitJBIG NotConfigured +#endif +#ifndef ZIP_SUPPORT +#define TIFFInitZIP NotConfigured +#endif +#ifndef PIXARLOG_SUPPORT +#define TIFFInitPixarLog NotConfigured +#endif +#ifndef LOGLUV_SUPPORT +#define TIFFInitSGILog NotConfigured +#endif + +/* + * Compression schemes statically built into the library. + */ +#ifdef VMS +const TIFFCodec _TIFFBuiltinCODECS[] = { +#else +TIFFCodec _TIFFBuiltinCODECS[] = { +#endif + { "None", COMPRESSION_NONE, TIFFInitDumpMode }, + { "LZW", COMPRESSION_LZW, TIFFInitLZW }, + { "PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits }, + { "ThunderScan", COMPRESSION_THUNDERSCAN,TIFFInitThunderScan }, + { "NeXT", COMPRESSION_NEXT, TIFFInitNeXT }, + { "JPEG", COMPRESSION_JPEG, TIFFInitJPEG }, + { "Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG }, + { "CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE }, + { "CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW }, + { "CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3 }, + { "CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4 }, + { "ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG }, + { "Deflate", COMPRESSION_DEFLATE, TIFFInitZIP }, + { "AdobeDeflate", COMPRESSION_ADOBE_DEFLATE , TIFFInitZIP }, + { "PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog }, + { "SGILog", COMPRESSION_SGILOG, TIFFInitSGILog }, + { "SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog }, + { NULL, 0, NULL } +}; + +static int +_notConfigured(TIFF* tif) +{ + const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); + char compression_code[20]; + + sprintf( compression_code, "%d", tif->tif_dir.td_compression ); + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%s compression support is not configured", + c ? c->name : compression_code ); + return (0); +} + +static int +NotConfigured(TIFF* tif, int scheme) +{ + (void) scheme; + + tif->tif_decodestatus = FALSE; + tif->tif_setupdecode = _notConfigured; + tif->tif_encodestatus = FALSE; + tif->tif_setupencode = _notConfigured; + return (1); +} + +/************************************************************************/ +/* TIFFIsCODECConfigured() */ +/************************************************************************/ + +/** + * Check whether we have working codec for the specific coding scheme. + * + * @return returns 1 if the codec is configured and working. Otherwise + * 0 will be returned. + */ + +int +TIFFIsCODECConfigured(uint16 scheme) +{ + const TIFFCodec* codec = TIFFFindCODEC(scheme); + + if(codec == NULL) { + return 0; + } + if(codec->init == NULL) { + return 0; + } + if(codec->init != NotConfigured){ + return 1; + } + return 0; +} + diff --git a/src/3rdparty/libtiff/libtiff/tif_color.c b/src/3rdparty/libtiff/libtiff/tif_color.c new file mode 100644 index 0000000000..0f484aa7cc --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_color.c @@ -0,0 +1,275 @@ +/* $Id: tif_color.c,v 1.12 2006/02/09 15:42:20 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * CIE L*a*b* to CIE XYZ and CIE XYZ to RGB conversion routines are taken + * from the VIPS library (http://www.vips.ecs.soton.ac.uk) with + * the permission of John Cupitt, the VIPS author. + */ + +/* + * TIFF Library. + * + * Color space conversion routines. + */ + +#include "tiffiop.h" +#include + +/* + * Convert color value from the CIE L*a*b* 1976 space to CIE XYZ. + */ +void +TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32 l, int32 a, int32 b, + float *X, float *Y, float *Z) +{ + float L = (float)l * 100.0F / 255.0F; + float cby, tmp; + + if( L < 8.856F ) { + *Y = (L * cielab->Y0) / 903.292F; + cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F; + } else { + cby = (L + 16.0F) / 116.0F; + *Y = cielab->Y0 * cby * cby * cby; + } + + tmp = (float)a / 500.0F + cby; + if( tmp < 0.2069F ) + *X = cielab->X0 * (tmp - 0.13793F) / 7.787F; + else + *X = cielab->X0 * tmp * tmp * tmp; + + tmp = cby - (float)b / 200.0F; + if( tmp < 0.2069F ) + *Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F; + else + *Z = cielab->Z0 * tmp * tmp * tmp; +} + +#define RINT(R) ((uint32)((R)>0?((R)+0.5):((R)-0.5))) +/* + * Convert color value from the XYZ space to RGB. + */ +void +TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z, + uint32 *r, uint32 *g, uint32 *b) +{ + int i; + float Yr, Yg, Yb; + float *matrix = &cielab->display.d_mat[0][0]; + + /* Multiply through the matrix to get luminosity values. */ + Yr = matrix[0] * X + matrix[1] * Y + matrix[2] * Z; + Yg = matrix[3] * X + matrix[4] * Y + matrix[5] * Z; + Yb = matrix[6] * X + matrix[7] * Y + matrix[8] * Z; + + /* Clip input */ + Yr = TIFFmax(Yr, cielab->display.d_Y0R); + Yg = TIFFmax(Yg, cielab->display.d_Y0G); + Yb = TIFFmax(Yb, cielab->display.d_Y0B); + + /* Avoid overflow in case of wrong input values */ + Yr = TIFFmin(Yr, cielab->display.d_YCR); + Yg = TIFFmin(Yg, cielab->display.d_YCG); + Yb = TIFFmin(Yb, cielab->display.d_YCB); + + /* Turn luminosity to colour value. */ + i = (int)((Yr - cielab->display.d_Y0R) / cielab->rstep); + i = TIFFmin(cielab->range, i); + *r = RINT(cielab->Yr2r[i]); + + i = (int)((Yg - cielab->display.d_Y0G) / cielab->gstep); + i = TIFFmin(cielab->range, i); + *g = RINT(cielab->Yg2g[i]); + + i = (int)((Yb - cielab->display.d_Y0B) / cielab->bstep); + i = TIFFmin(cielab->range, i); + *b = RINT(cielab->Yb2b[i]); + + /* Clip output. */ + *r = TIFFmin(*r, cielab->display.d_Vrwr); + *g = TIFFmin(*g, cielab->display.d_Vrwg); + *b = TIFFmin(*b, cielab->display.d_Vrwb); +} +#undef RINT + +/* + * Allocate conversion state structures and make look_up tables for + * the Yr,Yb,Yg <=> r,g,b conversions. + */ +int +TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab, + TIFFDisplay *display, float *refWhite) +{ + int i; + double gamma; + + cielab->range = CIELABTORGB_TABLE_RANGE; + + _TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay)); + + /* Red */ + gamma = 1.0 / cielab->display.d_gammaR ; + cielab->rstep = + (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range; + for(i = 0; i <= cielab->range; i++) { + cielab->Yr2r[i] = cielab->display.d_Vrwr + * ((float)pow((double)i / cielab->range, gamma)); + } + + /* Green */ + gamma = 1.0 / cielab->display.d_gammaG ; + cielab->gstep = + (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range; + for(i = 0; i <= cielab->range; i++) { + cielab->Yg2g[i] = cielab->display.d_Vrwg + * ((float)pow((double)i / cielab->range, gamma)); + } + + /* Blue */ + gamma = 1.0 / cielab->display.d_gammaB ; + cielab->bstep = + (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range; + for(i = 0; i <= cielab->range; i++) { + cielab->Yb2b[i] = cielab->display.d_Vrwb + * ((float)pow((double)i / cielab->range, gamma)); + } + + /* Init reference white point */ + cielab->X0 = refWhite[0]; + cielab->Y0 = refWhite[1]; + cielab->Z0 = refWhite[2]; + + return 0; +} + +/* + * Convert color value from the YCbCr space to CIE XYZ. + * The colorspace conversion algorithm comes from the IJG v5a code; + * see below for more information on how it works. + */ +#define SHIFT 16 +#define FIX(x) ((int32)((x) * (1L<(max)?(max):(f)) +#define HICLAMP(f,max) ((f)>(max)?(max):(f)) + +void +TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr, + uint32 *r, uint32 *g, uint32 *b) +{ + /* XXX: Only 8-bit YCbCr input supported for now */ + Y = HICLAMP(Y, 255), Cb = CLAMP(Cb, 0, 255), Cr = CLAMP(Cr, 0, 255); + + *r = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr]]; + *g = ycbcr->clamptab[ycbcr->Y_tab[Y] + + (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT)]; + *b = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb]]; +} + +/* + * Initialize the YCbCr->RGB conversion tables. The conversion + * is done according to the 6.0 spec: + * + * R = Y + Cr*(2 - 2*LumaRed) + * B = Y + Cb*(2 - 2*LumaBlue) + * G = Y + * - LumaBlue*Cb*(2-2*LumaBlue)/LumaGreen + * - LumaRed*Cr*(2-2*LumaRed)/LumaGreen + * + * To avoid floating point arithmetic the fractional constants that + * come out of the equations are represented as fixed point values + * in the range 0...2^16. We also eliminate multiplications by + * pre-calculating possible values indexed by Cb and Cr (this code + * assumes conversion is being done for 8-bit samples). + */ +int +TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite) +{ + TIFFRGBValue* clamptab; + int i; + +#define LumaRed luma[0] +#define LumaGreen luma[1] +#define LumaBlue luma[2] + + clamptab = (TIFFRGBValue*)( + (tidata_t) ycbcr+TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long))); + _TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */ + ycbcr->clamptab = (clamptab += 256); + for (i = 0; i < 256; i++) + clamptab[i] = (TIFFRGBValue) i; + _TIFFmemset(clamptab+256, 255, 2*256); /* v > 255 => 255 */ + ycbcr->Cr_r_tab = (int*) (clamptab + 3*256); + ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256; + ycbcr->Cr_g_tab = (int32*) (ycbcr->Cb_b_tab + 256); + ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256; + ycbcr->Y_tab = ycbcr->Cb_g_tab + 256; + + { float f1 = 2-2*LumaRed; int32 D1 = FIX(f1); + float f2 = LumaRed*f1/LumaGreen; int32 D2 = -FIX(f2); + float f3 = 2-2*LumaBlue; int32 D3 = FIX(f3); + float f4 = LumaBlue*f3/LumaGreen; int32 D4 = -FIX(f4); + int x; + +#undef LumaBlue +#undef LumaGreen +#undef LumaRed + + /* + * i is the actual input pixel value in the range 0..255 + * Cb and Cr values are in the range -128..127 (actually + * they are in a range defined by the ReferenceBlackWhite + * tag) so there is some range shifting to do here when + * constructing tables indexed by the raw pixel data. + */ + for (i = 0, x = -128; i < 256; i++, x++) { + int32 Cr = (int32)Code2V(x, refBlackWhite[4] - 128.0F, + refBlackWhite[5] - 128.0F, 127); + int32 Cb = (int32)Code2V(x, refBlackWhite[2] - 128.0F, + refBlackWhite[3] - 128.0F, 127); + + ycbcr->Cr_r_tab[i] = (int32)((D1*Cr + ONE_HALF)>>SHIFT); + ycbcr->Cb_b_tab[i] = (int32)((D3*Cb + ONE_HALF)>>SHIFT); + ycbcr->Cr_g_tab[i] = D2*Cr; + ycbcr->Cb_g_tab[i] = D4*Cb + ONE_HALF; + ycbcr->Y_tab[i] = + (int32)Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255); + } + } + + return 0; +} +#undef HICLAMP +#undef CLAMP +#undef Code2V +#undef SHIFT +#undef ONE_HALF +#undef FIX + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_compress.c b/src/3rdparty/libtiff/libtiff/tif_compress.c new file mode 100644 index 0000000000..6c3f322cf7 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_compress.c @@ -0,0 +1,288 @@ +/* $Id: tif_compress.c,v 1.13 2007/02/24 15:03:50 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library + * + * Compression Scheme Configuration Support. + */ +#include "tiffiop.h" + +static int +TIFFNoEncode(TIFF* tif, const char* method) +{ + const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); + + if (c) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%s %s encoding is not implemented", + c->name, method); + } else { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Compression scheme %u %s encoding is not implemented", + tif->tif_dir.td_compression, method); + } + return (-1); +} + +int +_TIFFNoRowEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) +{ + (void) pp; (void) cc; (void) s; + return (TIFFNoEncode(tif, "scanline")); +} + +int +_TIFFNoStripEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) +{ + (void) pp; (void) cc; (void) s; + return (TIFFNoEncode(tif, "strip")); +} + +int +_TIFFNoTileEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) +{ + (void) pp; (void) cc; (void) s; + return (TIFFNoEncode(tif, "tile")); +} + +static int +TIFFNoDecode(TIFF* tif, const char* method) +{ + const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); + + if (c) + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%s %s decoding is not implemented", + c->name, method); + else + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Compression scheme %u %s decoding is not implemented", + tif->tif_dir.td_compression, method); + return (-1); +} + +int +_TIFFNoRowDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) +{ + (void) pp; (void) cc; (void) s; + return (TIFFNoDecode(tif, "scanline")); +} + +int +_TIFFNoStripDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) +{ + (void) pp; (void) cc; (void) s; + return (TIFFNoDecode(tif, "strip")); +} + +int +_TIFFNoTileDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) +{ + (void) pp; (void) cc; (void) s; + return (TIFFNoDecode(tif, "tile")); +} + +int +_TIFFNoSeek(TIFF* tif, uint32 off) +{ + (void) off; + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Compression algorithm does not support random access"); + return (0); +} + +int +_TIFFNoPreCode(TIFF* tif, tsample_t s) +{ + (void) tif; (void) s; + return (1); +} + +static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); } +static void _TIFFvoid(TIFF* tif) { (void) tif; } + +void +_TIFFSetDefaultCompressionState(TIFF* tif) +{ + tif->tif_decodestatus = TRUE; + tif->tif_setupdecode = _TIFFtrue; + tif->tif_predecode = _TIFFNoPreCode; + tif->tif_decoderow = _TIFFNoRowDecode; + tif->tif_decodestrip = _TIFFNoStripDecode; + tif->tif_decodetile = _TIFFNoTileDecode; + tif->tif_encodestatus = TRUE; + tif->tif_setupencode = _TIFFtrue; + tif->tif_preencode = _TIFFNoPreCode; + tif->tif_postencode = _TIFFtrue; + tif->tif_encoderow = _TIFFNoRowEncode; + tif->tif_encodestrip = _TIFFNoStripEncode; + tif->tif_encodetile = _TIFFNoTileEncode; + tif->tif_close = _TIFFvoid; + tif->tif_seek = _TIFFNoSeek; + tif->tif_cleanup = _TIFFvoid; + tif->tif_defstripsize = _TIFFDefaultStripSize; + tif->tif_deftilesize = _TIFFDefaultTileSize; + tif->tif_flags &= ~(TIFF_NOBITREV|TIFF_NOREADRAW); +} + +int +TIFFSetCompressionScheme(TIFF* tif, int scheme) +{ + const TIFFCodec *c = TIFFFindCODEC((uint16) scheme); + + _TIFFSetDefaultCompressionState(tif); + /* + * Don't treat an unknown compression scheme as an error. + * This permits applications to open files with data that + * the library does not have builtin support for, but which + * may still be meaningful. + */ + return (c ? (*c->init)(tif, scheme) : 1); +} + +/* + * Other compression schemes may be registered. Registered + * schemes can also override the builtin versions provided + * by this library. + */ +typedef struct _codec { + struct _codec* next; + TIFFCodec* info; +} codec_t; +static codec_t* registeredCODECS = NULL; + +const TIFFCodec* +TIFFFindCODEC(uint16 scheme) +{ + const TIFFCodec* c; + codec_t* cd; + + for (cd = registeredCODECS; cd; cd = cd->next) + if (cd->info->scheme == scheme) + return ((const TIFFCodec*) cd->info); + for (c = _TIFFBuiltinCODECS; c->name; c++) + if (c->scheme == scheme) + return (c); + return ((const TIFFCodec*) 0); +} + +TIFFCodec* +TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init) +{ + codec_t* cd = (codec_t*) + _TIFFmalloc(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1); + + if (cd != NULL) { + cd->info = (TIFFCodec*) ((tidata_t) cd + sizeof (codec_t)); + cd->info->name = (char*) + ((tidata_t) cd->info + sizeof (TIFFCodec)); + strcpy(cd->info->name, name); + cd->info->scheme = scheme; + cd->info->init = init; + cd->next = registeredCODECS; + registeredCODECS = cd; + } else { + TIFFErrorExt(0, "TIFFRegisterCODEC", + "No space to register compression scheme %s", name); + return NULL; + } + return (cd->info); +} + +void +TIFFUnRegisterCODEC(TIFFCodec* c) +{ + codec_t* cd; + codec_t** pcd; + + for (pcd = ®isteredCODECS; (cd = *pcd); pcd = &cd->next) + if (cd->info == c) { + *pcd = cd->next; + _TIFFfree(cd); + return; + } + TIFFErrorExt(0, "TIFFUnRegisterCODEC", + "Cannot remove compression scheme %s; not registered", c->name); +} + +/************************************************************************/ +/* TIFFGetConfisuredCODECs() */ +/************************************************************************/ + +/** + * Get list of configured codecs, both built-in and registered by user. + * Caller is responsible to free this structure. + * + * @return returns array of TIFFCodec records (the last record should be NULL) + * or NULL if function failed. + */ + +TIFFCodec* +TIFFGetConfiguredCODECs() +{ + int i = 1; + codec_t *cd; + const TIFFCodec *c; + TIFFCodec *codecs = NULL, *new_codecs; + + for (cd = registeredCODECS; cd; cd = cd->next) { + new_codecs = (TIFFCodec *) + _TIFFrealloc(codecs, i * sizeof(TIFFCodec)); + if (!new_codecs) { + _TIFFfree (codecs); + return NULL; + } + codecs = new_codecs; + _TIFFmemcpy(codecs + i - 1, cd, sizeof(TIFFCodec)); + i++; + } + for (c = _TIFFBuiltinCODECS; c->name; c++) { + if (TIFFIsCODECConfigured(c->scheme)) { + new_codecs = (TIFFCodec *) + _TIFFrealloc(codecs, i * sizeof(TIFFCodec)); + if (!new_codecs) { + _TIFFfree (codecs); + return NULL; + } + codecs = new_codecs; + _TIFFmemcpy(codecs + i - 1, (const tdata_t)c, sizeof(TIFFCodec)); + i++; + } + } + + new_codecs = (TIFFCodec *) _TIFFrealloc(codecs, i * sizeof(TIFFCodec)); + if (!new_codecs) { + _TIFFfree (codecs); + return NULL; + } + codecs = new_codecs; + _TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec)); + + return codecs; +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_config.h b/src/3rdparty/libtiff/libtiff/tif_config.h new file mode 100644 index 0000000000..f851384379 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_config.h @@ -0,0 +1,337 @@ +/* + Configuration defines for Qt. +*/ + +#include +#if defined(Q_OS_WINCE) +# include +#endif + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Support CCITT Group 3 & 4 algorithms */ +#define CCITT_SUPPORT 1 + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* Support C++ stream API (requires C++ compiler) */ +/* #undef CXX_SUPPORT */ + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 + +/* Use the Apple OpenGL framework. */ +/* #undef HAVE_APPLE_OPENGL_FRAMEWORK */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the header file. */ +#if !defined(Q_OS_WINCE) +#define HAVE_FCNTL_H 1 +#endif + +/* Define to 1 if you have the `floor' function. */ +/* #undef HAVE_FLOOR */ + +/* Define to 1 if you have the `getopt' function. */ +/* #undef HAVE_GETOPT */ + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Define to 1 if the system has the type `int16'. */ +#ifdef Q_OS_AIX +#define HAVE_INT16 1 +#endif + +/* Define to 1 if the system has the type `int32'. */ +#ifdef Q_OS_AIX +#define HAVE_INT32 1 +#endif + +/* Define to 1 if the system has the type `int8'. */ +#ifdef Q_OS_AIX +#define HAVE_INT8 1 +#endif + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_INTTYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_IO_H */ + +/* Define to 1 if you have the `isascii' function. */ +/* #undef HAVE_ISASCII */ + +/* Define to 1 if you have the `jbg_newlen' function. */ +/* #undef HAVE_JBG_NEWLEN */ + +/* Define to 1 if you have the `lfind' function. */ +/* #undef HAVE_LFIND */ + +/* Define to 1 if you have the `c' library (-lc). */ +/* #undef HAVE_LIBC */ + +/* Define to 1 if you have the `m' library (-lm). */ +/* #undef HAVE_LIBM */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIMITS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_H */ + +/* Define to 1 if you have the `memmove' function. */ +/* #undef HAVE_MEMMOVE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MEMORY_H */ + +/* Define to 1 if you have the `memset' function. */ +/* #undef HAVE_MEMSET */ + +/* Define to 1 if you have the `mmap' function. */ +/* #undef HAVE_MMAP */ + +/* Define to 1 if you have the `pow' function. */ +/* #undef HAVE_POW */ + +/* Define if you have POSIX threads libraries and header files. */ +/* #undef HAVE_PTHREAD */ + +/* Define to 1 if you have the header file. */ +#if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN) && !defined(Q_OS_VXWORKS) +#define HAVE_SEARCH_H 1 +#endif + +/* Define to 1 if you have the `setmode' function. */ +/* #undef HAVE_SETMODE */ + +/* Define to 1 if you have the `sqrt' function. */ +/* #undef HAVE_SQRT */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDINT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDLIB_H */ + +/* Define to 1 if you have the `strcasecmp' function. */ +/* #undef HAVE_STRCASECMP */ + +/* Define to 1 if you have the `strchr' function. */ +/* #undef HAVE_STRCHR */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STRINGS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strrchr' function. */ +/* #undef HAVE_STRRCHR */ + +/* Define to 1 if you have the `strstr' function. */ +/* #undef HAVE_STRSTR */ + +/* Define to 1 if you have the `strtol' function. */ +/* #undef HAVE_STRTOL */ + +/* Define to 1 if you have the `strtoul' function. */ +/* #undef HAVE_STRTOUL */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_STAT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_TIME_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#if !defined(Q_OS_WIN) +#define HAVE_UNISTD_H 1 +#endif + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINDOWS_H */ + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#if (Q_BYTE_ORDER == Q_BIG_ENDIAN) +#define HOST_BIGENDIAN 1 +#else +#define HOST_BIGENDIAN 0 +#endif + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Support ISO JBIG compression (requires JBIG-KIT library) */ +/* #undef JBIG_SUPPORT */ + +/* Support JPEG compression (requires IJG JPEG library) */ +/* #undef JPEG_SUPPORT */ + +/* Support LogLuv high dynamic range encoding */ +#define LOGLUV_SUPPORT 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +/* #undef LT_OBJDIR */ + +/* Support LZW algorithm */ +#define LZW_SUPPORT 1 + +/* Support Microsoft Document Imaging format */ +#define MDI_SUPPORT 1 + +/* Support NeXT 2-bit RLE algorithm */ +#define NEXT_SUPPORT 1 + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Support Old JPEG compresson (read-only) */ +/* #undef OJPEG_SUPPORT */ + +/* Name of package */ +/* #undef PACKAGE */ + +/* Define to the address where bug reports for this package should be sent. */ +/* #undef PACKAGE_BUGREPORT */ + +/* Define to the full name of this package. */ +/* #undef PACKAGE_NAME */ + +/* Define to the full name and version of this package. */ +/* #undef PACKAGE_STRING */ + +/* Define to the one symbol short name of this package. */ +/* #undef PACKAGE_TARNAME */ + +/* Define to the home page for this package. */ +/* #undef PACKAGE_URL */ + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.9.2" + +/* Support Macintosh PackBits algorithm */ +#define PACKBITS_SUPPORT 1 + +/* Support Pixar log-format algorithm (requires Zlib) */ +#define PIXARLOG_SUPPORT 1 + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#if (QT_POINTER_SIZE == 8) && !defined(Q_OS_WIN64) +#define SIZEOF_LONG 8 +#else +#define SIZEOF_LONG 4 +#endif + +/* The size of `signed long', as computed by sizeof. */ +/* #undef SIZEOF_SIGNED_LONG */ + +/* The size of `signed long long', as computed by sizeof. */ +/* #undef SIZEOF_SIGNED_LONG_LONG */ + +/* The size of `unsigned long', as computed by sizeof. */ +/* #undef SIZEOF_UNSIGNED_LONG */ + +/* The size of `unsigned long long', as computed by sizeof. */ +/* #undef SIZEOF_UNSIGNED_LONG_LONG */ + +/* Define to 1 if you have the ANSI C header files. */ +/* #undef STDC_HEADERS */ + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of specified size to reduce memory usage) */ +#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP + +/* Default size of the strip in bytes (when strip chopping enabled) */ +/* #undef STRIP_SIZE_DEFAULT */ + +/* Enable SubIFD tag (330) support */ +#define SUBIFD_SUPPORT 1 + +/* Support ThunderScan 4-bit RLE algorithm */ +#define THUNDER_SUPPORT 1 + +/* Signed 64-bit type formatter */ +/* #undef TIFF_INT64_FORMAT */ + +/* Signed 64-bit type */ +#define TIFF_INT64_T qint64 + +/* Unsigned 64-bit type formatter */ +/* #undef TIFF_UINT64_FORMAT */ + +/* Unsigned 64-bit type */ +#define TIFF_UINT64_T quint64 + +/* Define to 1 if you can safely include both and . */ +/* #undef TIME_WITH_SYS_TIME */ + +/* Define to 1 if your declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* Version number of package */ +/* #undef VERSION */ + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if (Q_BYTE_ORDER == Q_BIG_ENDIAN) +#define WORDS_BIGENDIAN 1 +#endif + +/* Define to 1 if the X Window System is missing or not being used. */ +/* #undef X_DISPLAY_MISSING */ + +/* Support Deflate compression */ +#define ZIP_SUPPORT 1 + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef Q_OS_SYMBIAN +#ifndef __cplusplus +#undef inline +#define inline +#endif +#endif + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +#ifdef Q_OS_WIN +#define TIF_PLATFORM_CONSOLE +#endif diff --git a/src/3rdparty/libtiff/libtiff/tif_config.h-vms b/src/3rdparty/libtiff/libtiff/tif_config.h-vms new file mode 100644 index 0000000000..d653bd8270 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_config.h-vms @@ -0,0 +1,46 @@ +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +#define HAVE_UNISTD_H 1 + +#define HAVE_STRING_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +//#define HAVE_IO_H 1 + +/* Define to 1 if you have the header file. */ +//#define HAVE_SEARCH_H 1 + +/* The size of a `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* Set the native cpu bit order */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef WORDS_BIGENDIAN */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +/* +#ifndef __cplusplus +# ifndef inline +# define inline __inline +# endif +#endif +*/ + +// #define lfind _lfind diff --git a/src/3rdparty/libtiff/libtiff/tif_config.h.in b/src/3rdparty/libtiff/libtiff/tif_config.h.in new file mode 100644 index 0000000000..01e54de878 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_config.h.in @@ -0,0 +1,309 @@ +/* libtiff/tif_config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Support CCITT Group 3 & 4 algorithms */ +#undef CCITT_SUPPORT + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#undef CHECK_JPEG_YCBCR_SUBSAMPLING + +/* Support C++ stream API (requires C++ compiler) */ +#undef CXX_SUPPORT + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#undef DEFAULT_EXTRASAMPLE_AS_ALPHA + +/* Use the Apple OpenGL framework. */ +#undef HAVE_APPLE_OPENGL_FRAMEWORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_ASSERT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `floor' function. */ +#undef HAVE_FLOOR + +/* Define to 1 if you have the `getopt' function. */ +#undef HAVE_GETOPT + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#undef HAVE_IEEEFP + +/* Define to 1 if the system has the type `int16'. */ +#undef HAVE_INT16 + +/* Define to 1 if the system has the type `int32'. */ +#undef HAVE_INT32 + +/* Define to 1 if the system has the type `int8'. */ +#undef HAVE_INT8 + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_IO_H + +/* Define to 1 if you have the `isascii' function. */ +#undef HAVE_ISASCII + +/* Define to 1 if you have the `jbg_newlen' function. */ +#undef HAVE_JBG_NEWLEN + +/* Define to 1 if you have the `lfind' function. */ +#undef HAVE_LFIND + +/* Define to 1 if you have the `c' library (-lc). */ +#undef HAVE_LIBC + +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `pow' function. */ +#undef HAVE_POW + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_SEARCH_H + +/* Define to 1 if you have the `setmode' function. */ +#undef HAVE_SETMODE + +/* Define to 1 if you have the `sqrt' function. */ +#undef HAVE_SQRT + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strrchr' function. */ +#undef HAVE_STRRCHR + +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_WINDOWS_H + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#undef HOST_BIGENDIAN + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#undef HOST_FILLORDER + +/* Support ISO JBIG compression (requires JBIG-KIT library) */ +#undef JBIG_SUPPORT + +/* Support JPEG compression (requires IJG JPEG library) */ +#undef JPEG_SUPPORT + +/* Support LogLuv high dynamic range encoding */ +#undef LOGLUV_SUPPORT + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Support LZW algorithm */ +#undef LZW_SUPPORT + +/* Support Microsoft Document Imaging format */ +#undef MDI_SUPPORT + +/* Support NeXT 2-bit RLE algorithm */ +#undef NEXT_SUPPORT + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Support Old JPEG compresson (read-only) */ +#undef OJPEG_SUPPORT + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Support Macintosh PackBits algorithm */ +#undef PACKBITS_SUPPORT + +/* Support Pixar log-format algorithm (requires Zlib) */ +#undef PIXARLOG_SUPPORT + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `signed long', as computed by sizeof. */ +#undef SIZEOF_SIGNED_LONG + +/* The size of `signed long long', as computed by sizeof. */ +#undef SIZEOF_SIGNED_LONG_LONG + +/* The size of `unsigned long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG + +/* The size of `unsigned long long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG_LONG + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of specified size to reduce memory usage) */ +#undef STRIPCHOP_DEFAULT + +/* Default size of the strip in bytes (when strip chopping enabled) */ +#undef STRIP_SIZE_DEFAULT + +/* Enable SubIFD tag (330) support */ +#undef SUBIFD_SUPPORT + +/* Support ThunderScan 4-bit RLE algorithm */ +#undef THUNDER_SUPPORT + +/* Signed 64-bit type formatter */ +#undef TIFF_INT64_FORMAT + +/* Signed 64-bit type */ +#undef TIFF_INT64_T + +/* Unsigned 64-bit type formatter */ +#undef TIFF_UINT64_FORMAT + +/* Unsigned 64-bit type */ +#undef TIFF_UINT64_T + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 if your declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to 1 if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING + +/* Support Deflate compression */ +#undef ZIP_SUPPORT + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/src/3rdparty/libtiff/libtiff/tif_config.vc.h b/src/3rdparty/libtiff/libtiff/tif_config.vc.h new file mode 100644 index 0000000000..d9caecf5fa --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_config.vc.h @@ -0,0 +1,56 @@ +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Define to 1 if you have the `jbg_newlen' function. */ +#define HAVE_JBG_NEWLEN 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_IO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SEARCH_H 1 + +/* Define to 1 if you have the `setmode' function. */ +#define HAVE_SETMODE 1 + +/* The size of a `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* Signed 64-bit type */ +#define TIFF_INT64_T signed __int64 + +/* Unsigned 64-bit type */ +#define TIFF_UINT64_T unsigned __int64 + +/* Set the native cpu bit order */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef WORDS_BIGENDIAN */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +# ifndef inline +# define inline __inline +# endif +#endif + +#define lfind _lfind diff --git a/src/3rdparty/libtiff/libtiff/tif_config.wince.h b/src/3rdparty/libtiff/libtiff/tif_config.wince.h new file mode 100644 index 0000000000..a50b01681f --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_config.wince.h @@ -0,0 +1,67 @@ +/* $Id: tif_config.wince.h,v 1.1 2007/01/15 18:40:39 mloskot Exp $ */ + +/* + * TIFF library configuration header for Windows CE platform. + */ +#ifndef _WIN32_WCE +# error This version of tif_config.h header is dedicated for Windows CE platform! +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Define to 1 if you have the `jbg_newlen' function. */ +#define HAVE_JBG_NEWLEN 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#define HAVE_IO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SEARCH_H 1 + +/* Define to 1 if you have the `setmode' function. */ +#define HAVE_SETMODE 1 + +/* Define to 1 if you have the `bsearch' function. */ +#define HAVE_BSEARCH 1 +#define bsearch wceex_bsearch + +/* Define to 1 if you have the `lfind' function. */ +#define HAVE_LFIND 1 +#define lfind wceex_lfind + +/* The size of a `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* Set the native cpu bit order */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef WORDS_BIGENDIAN */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +# ifndef inline +# define inline __inline +# endif +#endif + + diff --git a/src/3rdparty/libtiff/libtiff/tif_dir.c b/src/3rdparty/libtiff/libtiff/tif_dir.c new file mode 100644 index 0000000000..102c9a85cd --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_dir.c @@ -0,0 +1,1369 @@ +/* $Id: tif_dir.c,v 1.75.2.2 2009-01-01 00:10:43 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Directory Tag Get & Set Routines. + * (and also some miscellaneous stuff) + */ +#include "tiffiop.h" + +/* + * These are used in the backwards compatibility code... + */ +#define DATATYPE_VOID 0 /* !untyped data */ +#define DATATYPE_INT 1 /* !signed integer data */ +#define DATATYPE_UINT 2 /* !unsigned integer data */ +#define DATATYPE_IEEEFP 3 /* !IEEE floating point data */ + +static void +setByteArray(void** vpp, void* vp, size_t nmemb, size_t elem_size) +{ + if (*vpp) + _TIFFfree(*vpp), *vpp = 0; + if (vp) { + tsize_t bytes = nmemb * elem_size; + if (elem_size && bytes / elem_size == nmemb) + *vpp = (void*) _TIFFmalloc(bytes); + if (*vpp) + _TIFFmemcpy(*vpp, vp, bytes); + } +} +void _TIFFsetByteArray(void** vpp, void* vp, uint32 n) + { setByteArray(vpp, vp, n, 1); } +void _TIFFsetString(char** cpp, char* cp) + { setByteArray((void**) cpp, (void*) cp, strlen(cp)+1, 1); } +void _TIFFsetNString(char** cpp, char* cp, uint32 n) + { setByteArray((void**) cpp, (void*) cp, n, 1); } +void _TIFFsetShortArray(uint16** wpp, uint16* wp, uint32 n) + { setByteArray((void**) wpp, (void*) wp, n, sizeof (uint16)); } +void _TIFFsetLongArray(uint32** lpp, uint32* lp, uint32 n) + { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint32)); } +void _TIFFsetFloatArray(float** fpp, float* fp, uint32 n) + { setByteArray((void**) fpp, (void*) fp, n, sizeof (float)); } +void _TIFFsetDoubleArray(double** dpp, double* dp, uint32 n) + { setByteArray((void**) dpp, (void*) dp, n, sizeof (double)); } + +/* + * Install extra samples information. + */ +static int +setExtraSamples(TIFFDirectory* td, va_list ap, uint32* v) +{ +/* XXX: Unassociated alpha data == 999 is a known Corel Draw bug, see below */ +#define EXTRASAMPLE_COREL_UNASSALPHA 999 + + uint16* va; + uint32 i; + + *v = va_arg(ap, uint32); + if ((uint16) *v > td->td_samplesperpixel) + return 0; + va = va_arg(ap, uint16*); + if (*v > 0 && va == NULL) /* typically missing param */ + return 0; + for (i = 0; i < *v; i++) { + if (va[i] > EXTRASAMPLE_UNASSALPHA) { + /* + * XXX: Corel Draw is known to produce incorrect + * ExtraSamples tags which must be patched here if we + * want to be able to open some of the damaged TIFF + * files: + */ + if (va[i] == EXTRASAMPLE_COREL_UNASSALPHA) + va[i] = EXTRASAMPLE_UNASSALPHA; + else + return 0; + } + } + td->td_extrasamples = (uint16) *v; + _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples); + return 1; + +#undef EXTRASAMPLE_COREL_UNASSALPHA +} + +static uint32 +checkInkNamesString(TIFF* tif, uint32 slen, const char* s) +{ + TIFFDirectory* td = &tif->tif_dir; + uint16 i = td->td_samplesperpixel; + + if (slen > 0) { + const char* ep = s+slen; + const char* cp = s; + for (; i > 0; i--) { + for (; *cp != '\0'; cp++) + if (cp >= ep) + goto bad; + cp++; /* skip \0 */ + } + return (cp-s); + } +bad: + TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", + "%s: Invalid InkNames value; expecting %d names, found %d", + tif->tif_name, + td->td_samplesperpixel, + td->td_samplesperpixel-i); + return (0); +} + +static int +_TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + static const char module[] = "_TIFFVSetField"; + + TIFFDirectory* td = &tif->tif_dir; + int status = 1; + uint32 v32, i, v; + char* s; + + switch (tag) { + case TIFFTAG_SUBFILETYPE: + td->td_subfiletype = va_arg(ap, uint32); + break; + case TIFFTAG_IMAGEWIDTH: + td->td_imagewidth = va_arg(ap, uint32); + break; + case TIFFTAG_IMAGELENGTH: + td->td_imagelength = va_arg(ap, uint32); + break; + case TIFFTAG_BITSPERSAMPLE: + td->td_bitspersample = (uint16) va_arg(ap, int); + /* + * If the data require post-decoding processing to byte-swap + * samples, set it up here. Note that since tags are required + * to be ordered, compression code can override this behaviour + * in the setup method if it wants to roll the post decoding + * work in with its normal work. + */ + if (tif->tif_flags & TIFF_SWAB) { + if (td->td_bitspersample == 16) + tif->tif_postdecode = _TIFFSwab16BitData; + else if (td->td_bitspersample == 24) + tif->tif_postdecode = _TIFFSwab24BitData; + else if (td->td_bitspersample == 32) + tif->tif_postdecode = _TIFFSwab32BitData; + else if (td->td_bitspersample == 64) + tif->tif_postdecode = _TIFFSwab64BitData; + else if (td->td_bitspersample == 128) /* two 64's */ + tif->tif_postdecode = _TIFFSwab64BitData; + } + break; + case TIFFTAG_COMPRESSION: + v = va_arg(ap, uint32) & 0xffff; + /* + * If we're changing the compression scheme, the notify the + * previous module so that it can cleanup any state it's + * setup. + */ + if (TIFFFieldSet(tif, FIELD_COMPRESSION)) { + if (td->td_compression == v) + break; + (*tif->tif_cleanup)(tif); + tif->tif_flags &= ~TIFF_CODERSETUP; + } + /* + * Setup new compression routine state. + */ + if( (status = TIFFSetCompressionScheme(tif, v)) != 0 ) + td->td_compression = (uint16) v; + else + status = 0; + break; + case TIFFTAG_PHOTOMETRIC: + td->td_photometric = (uint16) va_arg(ap, int); + break; + case TIFFTAG_THRESHHOLDING: + td->td_threshholding = (uint16) va_arg(ap, int); + break; + case TIFFTAG_FILLORDER: + v = va_arg(ap, uint32); + if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB) + goto badvalue; + td->td_fillorder = (uint16) v; + break; + case TIFFTAG_ORIENTATION: + v = va_arg(ap, uint32); + if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v) + goto badvalue; + else + td->td_orientation = (uint16) v; + break; + case TIFFTAG_SAMPLESPERPIXEL: + /* XXX should cross check -- e.g. if pallette, then 1 */ + v = va_arg(ap, uint32); + if (v == 0) + goto badvalue; + td->td_samplesperpixel = (uint16) v; + break; + case TIFFTAG_ROWSPERSTRIP: + v32 = va_arg(ap, uint32); + if (v32 == 0) + goto badvalue32; + td->td_rowsperstrip = v32; + if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) { + td->td_tilelength = v32; + td->td_tilewidth = td->td_imagewidth; + } + break; + case TIFFTAG_MINSAMPLEVALUE: + td->td_minsamplevalue = (uint16) va_arg(ap, int); + break; + case TIFFTAG_MAXSAMPLEVALUE: + td->td_maxsamplevalue = (uint16) va_arg(ap, int); + break; + case TIFFTAG_SMINSAMPLEVALUE: + td->td_sminsamplevalue = va_arg(ap, double); + break; + case TIFFTAG_SMAXSAMPLEVALUE: + td->td_smaxsamplevalue = va_arg(ap, double); + break; + case TIFFTAG_XRESOLUTION: + td->td_xresolution = (float) va_arg(ap, double); + break; + case TIFFTAG_YRESOLUTION: + td->td_yresolution = (float) va_arg(ap, double); + break; + case TIFFTAG_PLANARCONFIG: + v = va_arg(ap, uint32); + if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE) + goto badvalue; + td->td_planarconfig = (uint16) v; + break; + case TIFFTAG_XPOSITION: + td->td_xposition = (float) va_arg(ap, double); + break; + case TIFFTAG_YPOSITION: + td->td_yposition = (float) va_arg(ap, double); + break; + case TIFFTAG_RESOLUTIONUNIT: + v = va_arg(ap, uint32); + if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v) + goto badvalue; + td->td_resolutionunit = (uint16) v; + break; + case TIFFTAG_PAGENUMBER: + td->td_pagenumber[0] = (uint16) va_arg(ap, int); + td->td_pagenumber[1] = (uint16) va_arg(ap, int); + break; + case TIFFTAG_HALFTONEHINTS: + td->td_halftonehints[0] = (uint16) va_arg(ap, int); + td->td_halftonehints[1] = (uint16) va_arg(ap, int); + break; + case TIFFTAG_COLORMAP: + v32 = (uint32)(1L<td_bitspersample); + _TIFFsetShortArray(&td->td_colormap[0], va_arg(ap, uint16*), v32); + _TIFFsetShortArray(&td->td_colormap[1], va_arg(ap, uint16*), v32); + _TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32); + break; + case TIFFTAG_EXTRASAMPLES: + if (!setExtraSamples(td, ap, &v)) + goto badvalue; + break; + case TIFFTAG_MATTEING: + td->td_extrasamples = (uint16) (va_arg(ap, int) != 0); + if (td->td_extrasamples) { + uint16 sv = EXTRASAMPLE_ASSOCALPHA; + _TIFFsetShortArray(&td->td_sampleinfo, &sv, 1); + } + break; + case TIFFTAG_TILEWIDTH: + v32 = va_arg(ap, uint32); + if (v32 % 16) { + if (tif->tif_mode != O_RDONLY) + goto badvalue32; + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "Nonstandard tile width %d, convert file", v32); + } + td->td_tilewidth = v32; + tif->tif_flags |= TIFF_ISTILED; + break; + case TIFFTAG_TILELENGTH: + v32 = va_arg(ap, uint32); + if (v32 % 16) { + if (tif->tif_mode != O_RDONLY) + goto badvalue32; + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "Nonstandard tile length %d, convert file", v32); + } + td->td_tilelength = v32; + tif->tif_flags |= TIFF_ISTILED; + break; + case TIFFTAG_TILEDEPTH: + v32 = va_arg(ap, uint32); + if (v32 == 0) + goto badvalue32; + td->td_tiledepth = v32; + break; + case TIFFTAG_DATATYPE: + v = va_arg(ap, uint32); + switch (v) { + case DATATYPE_VOID: v = SAMPLEFORMAT_VOID; break; + case DATATYPE_INT: v = SAMPLEFORMAT_INT; break; + case DATATYPE_UINT: v = SAMPLEFORMAT_UINT; break; + case DATATYPE_IEEEFP: v = SAMPLEFORMAT_IEEEFP;break; + default: goto badvalue; + } + td->td_sampleformat = (uint16) v; + break; + case TIFFTAG_SAMPLEFORMAT: + v = va_arg(ap, uint32); + if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v) + goto badvalue; + td->td_sampleformat = (uint16) v; + + /* Try to fix up the SWAB function for complex data. */ + if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT + && td->td_bitspersample == 32 + && tif->tif_postdecode == _TIFFSwab32BitData ) + tif->tif_postdecode = _TIFFSwab16BitData; + else if( (td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT + || td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP) + && td->td_bitspersample == 64 + && tif->tif_postdecode == _TIFFSwab64BitData ) + tif->tif_postdecode = _TIFFSwab32BitData; + break; + case TIFFTAG_IMAGEDEPTH: + td->td_imagedepth = va_arg(ap, uint32); + break; + case TIFFTAG_SUBIFD: + if ((tif->tif_flags & TIFF_INSUBIFD) == 0) { + td->td_nsubifd = (uint16) va_arg(ap, int); + _TIFFsetLongArray(&td->td_subifd, va_arg(ap, uint32*), + (long) td->td_nsubifd); + } else { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Sorry, cannot nest SubIFDs", + tif->tif_name); + status = 0; + } + break; + case TIFFTAG_YCBCRPOSITIONING: + td->td_ycbcrpositioning = (uint16) va_arg(ap, int); + break; + case TIFFTAG_YCBCRSUBSAMPLING: + td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, int); + td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, int); + break; + case TIFFTAG_TRANSFERFUNCTION: + v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1; + for (i = 0; i < v; i++) + _TIFFsetShortArray(&td->td_transferfunction[i], + va_arg(ap, uint16*), 1L<td_bitspersample); + break; + case TIFFTAG_INKNAMES: + v = va_arg(ap, uint32); + s = va_arg(ap, char*); + v = checkInkNamesString(tif, v, s); + status = v > 0; + if( v > 0 ) { + _TIFFsetNString(&td->td_inknames, s, v); + td->td_inknameslen = v; + } + break; + default: { + TIFFTagValue *tv; + int tv_size, iCustom; + const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY); + + /* + * This can happen if multiple images are open with different + * codecs which have private tags. The global tag information + * table may then have tags that are valid for one file but not + * the other. If the client tries to set a tag that is not valid + * for the image's codec then we'll arrive here. This + * happens, for example, when tiffcp is used to convert between + * compression schemes and codec-specific tags are blindly copied. + */ + if(fip == NULL || fip->field_bit != FIELD_CUSTOM) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Invalid %stag \"%s\" (not supported by codec)", + tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", + fip ? fip->field_name : "Unknown"); + status = 0; + break; + } + + /* + * Find the existing entry for this custom value. + */ + tv = NULL; + for (iCustom = 0; iCustom < td->td_customValueCount; iCustom++) { + if (td->td_customValues[iCustom].info->field_tag == tag) { + tv = td->td_customValues + iCustom; + if (tv->value != NULL) { + _TIFFfree(tv->value); + tv->value = NULL; + } + break; + } + } + + /* + * Grow the custom list if the entry was not found. + */ + if(tv == NULL) { + TIFFTagValue *new_customValues; + + td->td_customValueCount++; + new_customValues = (TIFFTagValue *) + _TIFFrealloc(td->td_customValues, + sizeof(TIFFTagValue) * td->td_customValueCount); + if (!new_customValues) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Failed to allocate space for list of custom values", + tif->tif_name); + status = 0; + goto end; + } + + td->td_customValues = new_customValues; + + tv = td->td_customValues + (td->td_customValueCount - 1); + tv->info = fip; + tv->value = NULL; + tv->count = 0; + } + + /* + * Set custom value ... save a copy of the custom tag value. + */ + tv_size = _TIFFDataSize(fip->field_type); + if (tv_size == 0) { + status = 0; + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Bad field type %d for \"%s\"", + tif->tif_name, fip->field_type, + fip->field_name); + goto end; + } + + if(fip->field_passcount) { + if (fip->field_writecount == TIFF_VARIABLE2) + tv->count = (uint32) va_arg(ap, uint32); + else + tv->count = (int) va_arg(ap, int); + } else if (fip->field_writecount == TIFF_VARIABLE + || fip->field_writecount == TIFF_VARIABLE2) + tv->count = 1; + else if (fip->field_writecount == TIFF_SPP) + tv->count = td->td_samplesperpixel; + else + tv->count = fip->field_writecount; + + + if (fip->field_type == TIFF_ASCII) + _TIFFsetString((char **)&tv->value, va_arg(ap, char *)); + else { + tv->value = _TIFFCheckMalloc(tif, tv_size, tv->count, + "Tag Value"); + if (!tv->value) { + status = 0; + goto end; + } + + if ((fip->field_passcount + || fip->field_writecount == TIFF_VARIABLE + || fip->field_writecount == TIFF_VARIABLE2 + || fip->field_writecount == TIFF_SPP + || tv->count > 1) + && fip->field_tag != TIFFTAG_PAGENUMBER + && fip->field_tag != TIFFTAG_HALFTONEHINTS + && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING + && fip->field_tag != TIFFTAG_DOTRANGE) { + _TIFFmemcpy(tv->value, va_arg(ap, void *), + tv->count * tv_size); + } else { + /* + * XXX: The following loop required to handle + * TIFFTAG_PAGENUMBER, TIFFTAG_HALFTONEHINTS, + * TIFFTAG_YCBCRSUBSAMPLING and TIFFTAG_DOTRANGE tags. + * These tags are actually arrays and should be passed as + * array pointers to TIFFSetField() function, but actually + * passed as a list of separate values. This behaviour + * must be changed in the future! + */ + int i; + char *val = (char *)tv->value; + + for (i = 0; i < tv->count; i++, val += tv_size) { + switch (fip->field_type) { + case TIFF_BYTE: + case TIFF_UNDEFINED: + { + uint8 v = (uint8)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SBYTE: + { + int8 v = (int8)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SHORT: + { + uint16 v = (uint16)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SSHORT: + { + int16 v = (int16)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_LONG: + case TIFF_IFD: + { + uint32 v = va_arg(ap, uint32); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SLONG: + { + int32 v = va_arg(ap, int32); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + case TIFF_FLOAT: + { + float v = (float)va_arg(ap, double); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_DOUBLE: + { + double v = va_arg(ap, double); + _TIFFmemcpy(val, &v, tv_size); + } + break; + default: + _TIFFmemset(val, 0, tv_size); + status = 0; + break; + } + } + } + } + } + } + if (status) { + TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit); + tif->tif_flags |= TIFF_DIRTYDIRECT; + } + +end: + va_end(ap); + return (status); +badvalue: + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Bad value %d for \"%s\" tag", + tif->tif_name, v, + _TIFFFieldWithTag(tif, tag)->field_name); + va_end(ap); + return (0); +badvalue32: + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Bad value %u for \"%s\" tag", + tif->tif_name, v32, + _TIFFFieldWithTag(tif, tag)->field_name); + va_end(ap); + return (0); +} + +/* + * Return 1/0 according to whether or not + * it is permissible to set the tag's value. + * Note that we allow ImageLength to be changed + * so that we can append and extend to images. + * Any other tag may not be altered once writing + * has commenced, unless its value has no effect + * on the format of the data that is written. + */ +static int +OkToChangeTag(TIFF* tif, ttag_t tag) +{ + const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY); + if (!fip) { /* unknown tag */ + TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", "%s: Unknown %stag %u", + tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag); + return (0); + } + if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) && + !fip->field_oktochange) { + /* + * Consult info table to see if tag can be changed + * after we've started writing. We only allow changes + * to those tags that don't/shouldn't affect the + * compression and/or format of the data. + */ + TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", + "%s: Cannot modify tag \"%s\" while writing", + tif->tif_name, fip->field_name); + return (0); + } + return (1); +} + +/* + * Record the value of a field in the + * internal directory structure. The + * field will be written to the file + * when/if the directory structure is + * updated. + */ +int +TIFFSetField(TIFF* tif, ttag_t tag, ...) +{ + va_list ap; + int status; + + va_start(ap, tag); + status = TIFFVSetField(tif, tag, ap); + va_end(ap); + return (status); +} + +/* + * Like TIFFSetField, but taking a varargs + * parameter list. This routine is useful + * for building higher-level interfaces on + * top of the library. + */ +int +TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + return OkToChangeTag(tif, tag) ? + (*tif->tif_tagmethods.vsetfield)(tif, tag, ap) : 0; +} + +static int +_TIFFVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + TIFFDirectory* td = &tif->tif_dir; + int ret_val = 1; + + switch (tag) { + case TIFFTAG_SUBFILETYPE: + *va_arg(ap, uint32*) = td->td_subfiletype; + break; + case TIFFTAG_IMAGEWIDTH: + *va_arg(ap, uint32*) = td->td_imagewidth; + break; + case TIFFTAG_IMAGELENGTH: + *va_arg(ap, uint32*) = td->td_imagelength; + break; + case TIFFTAG_BITSPERSAMPLE: + *va_arg(ap, uint16*) = td->td_bitspersample; + break; + case TIFFTAG_COMPRESSION: + *va_arg(ap, uint16*) = td->td_compression; + break; + case TIFFTAG_PHOTOMETRIC: + *va_arg(ap, uint16*) = td->td_photometric; + break; + case TIFFTAG_THRESHHOLDING: + *va_arg(ap, uint16*) = td->td_threshholding; + break; + case TIFFTAG_FILLORDER: + *va_arg(ap, uint16*) = td->td_fillorder; + break; + case TIFFTAG_ORIENTATION: + *va_arg(ap, uint16*) = td->td_orientation; + break; + case TIFFTAG_SAMPLESPERPIXEL: + *va_arg(ap, uint16*) = td->td_samplesperpixel; + break; + case TIFFTAG_ROWSPERSTRIP: + *va_arg(ap, uint32*) = td->td_rowsperstrip; + break; + case TIFFTAG_MINSAMPLEVALUE: + *va_arg(ap, uint16*) = td->td_minsamplevalue; + break; + case TIFFTAG_MAXSAMPLEVALUE: + *va_arg(ap, uint16*) = td->td_maxsamplevalue; + break; + case TIFFTAG_SMINSAMPLEVALUE: + *va_arg(ap, double*) = td->td_sminsamplevalue; + break; + case TIFFTAG_SMAXSAMPLEVALUE: + *va_arg(ap, double*) = td->td_smaxsamplevalue; + break; + case TIFFTAG_XRESOLUTION: + *va_arg(ap, float*) = td->td_xresolution; + break; + case TIFFTAG_YRESOLUTION: + *va_arg(ap, float*) = td->td_yresolution; + break; + case TIFFTAG_PLANARCONFIG: + *va_arg(ap, uint16*) = td->td_planarconfig; + break; + case TIFFTAG_XPOSITION: + *va_arg(ap, float*) = td->td_xposition; + break; + case TIFFTAG_YPOSITION: + *va_arg(ap, float*) = td->td_yposition; + break; + case TIFFTAG_RESOLUTIONUNIT: + *va_arg(ap, uint16*) = td->td_resolutionunit; + break; + case TIFFTAG_PAGENUMBER: + *va_arg(ap, uint16*) = td->td_pagenumber[0]; + *va_arg(ap, uint16*) = td->td_pagenumber[1]; + break; + case TIFFTAG_HALFTONEHINTS: + *va_arg(ap, uint16*) = td->td_halftonehints[0]; + *va_arg(ap, uint16*) = td->td_halftonehints[1]; + break; + case TIFFTAG_COLORMAP: + *va_arg(ap, uint16**) = td->td_colormap[0]; + *va_arg(ap, uint16**) = td->td_colormap[1]; + *va_arg(ap, uint16**) = td->td_colormap[2]; + break; + case TIFFTAG_STRIPOFFSETS: + case TIFFTAG_TILEOFFSETS: + *va_arg(ap, uint32**) = td->td_stripoffset; + break; + case TIFFTAG_STRIPBYTECOUNTS: + case TIFFTAG_TILEBYTECOUNTS: + *va_arg(ap, uint32**) = td->td_stripbytecount; + break; + case TIFFTAG_MATTEING: + *va_arg(ap, uint16*) = + (td->td_extrasamples == 1 && + td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA); + break; + case TIFFTAG_EXTRASAMPLES: + *va_arg(ap, uint16*) = td->td_extrasamples; + *va_arg(ap, uint16**) = td->td_sampleinfo; + break; + case TIFFTAG_TILEWIDTH: + *va_arg(ap, uint32*) = td->td_tilewidth; + break; + case TIFFTAG_TILELENGTH: + *va_arg(ap, uint32*) = td->td_tilelength; + break; + case TIFFTAG_TILEDEPTH: + *va_arg(ap, uint32*) = td->td_tiledepth; + break; + case TIFFTAG_DATATYPE: + switch (td->td_sampleformat) { + case SAMPLEFORMAT_UINT: + *va_arg(ap, uint16*) = DATATYPE_UINT; + break; + case SAMPLEFORMAT_INT: + *va_arg(ap, uint16*) = DATATYPE_INT; + break; + case SAMPLEFORMAT_IEEEFP: + *va_arg(ap, uint16*) = DATATYPE_IEEEFP; + break; + case SAMPLEFORMAT_VOID: + *va_arg(ap, uint16*) = DATATYPE_VOID; + break; + } + break; + case TIFFTAG_SAMPLEFORMAT: + *va_arg(ap, uint16*) = td->td_sampleformat; + break; + case TIFFTAG_IMAGEDEPTH: + *va_arg(ap, uint32*) = td->td_imagedepth; + break; + case TIFFTAG_SUBIFD: + *va_arg(ap, uint16*) = td->td_nsubifd; + *va_arg(ap, uint32**) = td->td_subifd; + break; + case TIFFTAG_YCBCRPOSITIONING: + *va_arg(ap, uint16*) = td->td_ycbcrpositioning; + break; + case TIFFTAG_YCBCRSUBSAMPLING: + *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[0]; + *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1]; + break; + case TIFFTAG_TRANSFERFUNCTION: + *va_arg(ap, uint16**) = td->td_transferfunction[0]; + if (td->td_samplesperpixel - td->td_extrasamples > 1) { + *va_arg(ap, uint16**) = td->td_transferfunction[1]; + *va_arg(ap, uint16**) = td->td_transferfunction[2]; + } + break; + case TIFFTAG_INKNAMES: + *va_arg(ap, char**) = td->td_inknames; + break; + default: + { + const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY); + int i; + + /* + * This can happen if multiple images are open with different + * codecs which have private tags. The global tag information + * table may then have tags that are valid for one file but not + * the other. If the client tries to get a tag that is not valid + * for the image's codec then we'll arrive here. + */ + if( fip == NULL || fip->field_bit != FIELD_CUSTOM ) + { + TIFFErrorExt(tif->tif_clientdata, "_TIFFVGetField", + "%s: Invalid %stag \"%s\" " + "(not supported by codec)", + tif->tif_name, + isPseudoTag(tag) ? "pseudo-" : "", + fip ? fip->field_name : "Unknown"); + ret_val = 0; + break; + } + + /* + * Do we have a custom value? + */ + ret_val = 0; + for (i = 0; i < td->td_customValueCount; i++) { + TIFFTagValue *tv = td->td_customValues + i; + + if (tv->info->field_tag != tag) + continue; + + if (fip->field_passcount) { + if (fip->field_readcount == TIFF_VARIABLE2) + *va_arg(ap, uint32*) = (uint32)tv->count; + else /* Assume TIFF_VARIABLE */ + *va_arg(ap, uint16*) = (uint16)tv->count; + *va_arg(ap, void **) = tv->value; + ret_val = 1; + } else { + if ((fip->field_type == TIFF_ASCII + || fip->field_readcount == TIFF_VARIABLE + || fip->field_readcount == TIFF_VARIABLE2 + || fip->field_readcount == TIFF_SPP + || tv->count > 1) + && fip->field_tag != TIFFTAG_PAGENUMBER + && fip->field_tag != TIFFTAG_HALFTONEHINTS + && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING + && fip->field_tag != TIFFTAG_DOTRANGE) { + *va_arg(ap, void **) = tv->value; + ret_val = 1; + } else { + int j; + char *val = (char *)tv->value; + + for (j = 0; j < tv->count; + j++, val += _TIFFDataSize(tv->info->field_type)) { + switch (fip->field_type) { + case TIFF_BYTE: + case TIFF_UNDEFINED: + *va_arg(ap, uint8*) = + *(uint8 *)val; + ret_val = 1; + break; + case TIFF_SBYTE: + *va_arg(ap, int8*) = + *(int8 *)val; + ret_val = 1; + break; + case TIFF_SHORT: + *va_arg(ap, uint16*) = + *(uint16 *)val; + ret_val = 1; + break; + case TIFF_SSHORT: + *va_arg(ap, int16*) = + *(int16 *)val; + ret_val = 1; + break; + case TIFF_LONG: + case TIFF_IFD: + *va_arg(ap, uint32*) = + *(uint32 *)val; + ret_val = 1; + break; + case TIFF_SLONG: + *va_arg(ap, int32*) = + *(int32 *)val; + ret_val = 1; + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + case TIFF_FLOAT: + *va_arg(ap, float*) = + *(float *)val; + ret_val = 1; + break; + case TIFF_DOUBLE: + *va_arg(ap, double*) = + *(double *)val; + ret_val = 1; + break; + default: + ret_val = 0; + break; + } + } + } + } + break; + } + } + } + return(ret_val); +} + +/* + * Return the value of a field in the + * internal directory structure. + */ +int +TIFFGetField(TIFF* tif, ttag_t tag, ...) +{ + int status; + va_list ap; + + va_start(ap, tag); + status = TIFFVGetField(tif, tag, ap); + va_end(ap); + return (status); +} + +/* + * Like TIFFGetField, but taking a varargs + * parameter list. This routine is useful + * for building higher-level interfaces on + * top of the library. + */ +int +TIFFVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY); + return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit)) ? + (*tif->tif_tagmethods.vgetfield)(tif, tag, ap) : 0); +} + +#define CleanupField(member) { \ + if (td->member) { \ + _TIFFfree(td->member); \ + td->member = 0; \ + } \ +} + +/* + * Release storage associated with a directory. + */ +void +TIFFFreeDirectory(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + int i; + + _TIFFmemset(td->td_fieldsset, 0, FIELD_SETLONGS); + CleanupField(td_colormap[0]); + CleanupField(td_colormap[1]); + CleanupField(td_colormap[2]); + CleanupField(td_sampleinfo); + CleanupField(td_subifd); + CleanupField(td_inknames); + CleanupField(td_transferfunction[0]); + CleanupField(td_transferfunction[1]); + CleanupField(td_transferfunction[2]); + CleanupField(td_stripoffset); + CleanupField(td_stripbytecount); + TIFFClrFieldBit(tif, FIELD_YCBCRSUBSAMPLING); + TIFFClrFieldBit(tif, FIELD_YCBCRPOSITIONING); + + /* Cleanup custom tag values */ + for( i = 0; i < td->td_customValueCount; i++ ) { + if (td->td_customValues[i].value) + _TIFFfree(td->td_customValues[i].value); + } + + td->td_customValueCount = 0; + CleanupField(td_customValues); +} +#undef CleanupField + +/* + * Client Tag extension support (from Niles Ritter). + */ +static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL; + +TIFFExtendProc +TIFFSetTagExtender(TIFFExtendProc extender) +{ + TIFFExtendProc prev = _TIFFextender; + _TIFFextender = extender; + return (prev); +} + +/* + * Setup for a new directory. Should we automatically call + * TIFFWriteDirectory() if the current one is dirty? + * + * The newly created directory will not exist on the file till + * TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called. + */ +int +TIFFCreateDirectory(TIFF* tif) +{ + TIFFDefaultDirectory(tif); + tif->tif_diroff = 0; + tif->tif_nextdiroff = 0; + tif->tif_curoff = 0; + tif->tif_row = (uint32) -1; + tif->tif_curstrip = (tstrip_t) -1; + + return 0; +} + +/* + * Setup a default directory structure. + */ +int +TIFFDefaultDirectory(TIFF* tif) +{ + register TIFFDirectory* td = &tif->tif_dir; + + size_t tiffFieldInfoCount; + const TIFFFieldInfo *tiffFieldInfo = + _TIFFGetFieldInfo(&tiffFieldInfoCount); + _TIFFSetupFieldInfo(tif, tiffFieldInfo, tiffFieldInfoCount); + + _TIFFmemset(td, 0, sizeof (*td)); + td->td_fillorder = FILLORDER_MSB2LSB; + td->td_bitspersample = 1; + td->td_threshholding = THRESHHOLD_BILEVEL; + td->td_orientation = ORIENTATION_TOPLEFT; + td->td_samplesperpixel = 1; + td->td_rowsperstrip = (uint32) -1; + td->td_tilewidth = 0; + td->td_tilelength = 0; + td->td_tiledepth = 1; + td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */ + td->td_resolutionunit = RESUNIT_INCH; + td->td_sampleformat = SAMPLEFORMAT_UINT; + td->td_imagedepth = 1; + td->td_ycbcrsubsampling[0] = 2; + td->td_ycbcrsubsampling[1] = 2; + td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED; + tif->tif_postdecode = _TIFFNoPostDecode; + tif->tif_foundfield = NULL; + tif->tif_tagmethods.vsetfield = _TIFFVSetField; + tif->tif_tagmethods.vgetfield = _TIFFVGetField; + tif->tif_tagmethods.printdir = NULL; + /* + * Give client code a chance to install their own + * tag extensions & methods, prior to compression overloads. + */ + if (_TIFFextender) + (*_TIFFextender)(tif); + (void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); + /* + * NB: The directory is marked dirty as a result of setting + * up the default compression scheme. However, this really + * isn't correct -- we want TIFF_DIRTYDIRECT to be set only + * if the user does something. We could just do the setup + * by hand, but it seems better to use the normal mechanism + * (i.e. TIFFSetField). + */ + tif->tif_flags &= ~TIFF_DIRTYDIRECT; + + /* + * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19 + * we clear the ISTILED flag when setting up a new directory. + * Should we also be clearing stuff like INSUBIFD? + */ + tif->tif_flags &= ~TIFF_ISTILED; + + return (1); +} + +static int +TIFFAdvanceDirectory(TIFF* tif, uint32* nextdir, toff_t* off) +{ + static const char module[] = "TIFFAdvanceDirectory"; + uint16 dircount; + if (isMapped(tif)) + { + toff_t poff=*nextdir; + if (poff+sizeof(uint16) > tif->tif_size) + { + TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count", + tif->tif_name); + return (0); + } + _TIFFmemcpy(&dircount, tif->tif_base+poff, sizeof (uint16)); + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabShort(&dircount); + poff+=sizeof (uint16)+dircount*sizeof (TIFFDirEntry); + if (off != NULL) + *off = poff; + if (((toff_t) (poff+sizeof (uint32))) > tif->tif_size) + { + TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link", + tif->tif_name); + return (0); + } + _TIFFmemcpy(nextdir, tif->tif_base+poff, sizeof (uint32)); + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabLong(nextdir); + return (1); + } + else + { + if (!SeekOK(tif, *nextdir) || + !ReadOK(tif, &dircount, sizeof (uint16))) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count", + tif->tif_name); + return (0); + } + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabShort(&dircount); + if (off != NULL) + *off = TIFFSeekFile(tif, + dircount*sizeof (TIFFDirEntry), SEEK_CUR); + else + (void) TIFFSeekFile(tif, + dircount*sizeof (TIFFDirEntry), SEEK_CUR); + if (!ReadOK(tif, nextdir, sizeof (uint32))) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link", + tif->tif_name); + return (0); + } + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabLong(nextdir); + return (1); + } +} + +/* + * Count the number of directories in a file. + */ +tdir_t +TIFFNumberOfDirectories(TIFF* tif) +{ + toff_t nextdir = tif->tif_header.tiff_diroff; + tdir_t n = 0; + + while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL)) + n++; + return (n); +} + +/* + * Set the n-th directory as the current directory. + * NB: Directories are numbered starting at 0. + */ +int +TIFFSetDirectory(TIFF* tif, tdir_t dirn) +{ + toff_t nextdir; + tdir_t n; + + nextdir = tif->tif_header.tiff_diroff; + for (n = dirn; n > 0 && nextdir != 0; n--) + if (!TIFFAdvanceDirectory(tif, &nextdir, NULL)) + return (0); + tif->tif_nextdiroff = nextdir; + /* + * Set curdir to the actual directory index. The + * -1 is because TIFFReadDirectory will increment + * tif_curdir after successfully reading the directory. + */ + tif->tif_curdir = (dirn - n) - 1; + /* + * Reset tif_dirnumber counter and start new list of seen directories. + * We need this to prevent IFD loops. + */ + tif->tif_dirnumber = 0; + return (TIFFReadDirectory(tif)); +} + +/* + * Set the current directory to be the directory + * located at the specified file offset. This interface + * is used mainly to access directories linked with + * the SubIFD tag (e.g. thumbnail images). + */ +int +TIFFSetSubDirectory(TIFF* tif, uint32 diroff) +{ + tif->tif_nextdiroff = diroff; + /* + * Reset tif_dirnumber counter and start new list of seen directories. + * We need this to prevent IFD loops. + */ + tif->tif_dirnumber = 0; + return (TIFFReadDirectory(tif)); +} + +/* + * Return file offset of the current directory. + */ +uint32 +TIFFCurrentDirOffset(TIFF* tif) +{ + return (tif->tif_diroff); +} + +/* + * Return an indication of whether or not we are + * at the last directory in the file. + */ +int +TIFFLastDirectory(TIFF* tif) +{ + return (tif->tif_nextdiroff == 0); +} + +/* + * Unlink the specified directory from the directory chain. + */ +int +TIFFUnlinkDirectory(TIFF* tif, tdir_t dirn) +{ + static const char module[] = "TIFFUnlinkDirectory"; + toff_t nextdir; + toff_t off; + tdir_t n; + + if (tif->tif_mode == O_RDONLY) { + TIFFErrorExt(tif->tif_clientdata, module, + "Can not unlink directory in read-only file"); + return (0); + } + /* + * Go to the directory before the one we want + * to unlink and nab the offset of the link + * field we'll need to patch. + */ + nextdir = tif->tif_header.tiff_diroff; + off = sizeof (uint16) + sizeof (uint16); + for (n = dirn-1; n > 0; n--) { + if (nextdir == 0) { + TIFFErrorExt(tif->tif_clientdata, module, "Directory %d does not exist", dirn); + return (0); + } + if (!TIFFAdvanceDirectory(tif, &nextdir, &off)) + return (0); + } + /* + * Advance to the directory to be unlinked and fetch + * the offset of the directory that follows. + */ + if (!TIFFAdvanceDirectory(tif, &nextdir, NULL)) + return (0); + /* + * Go back and patch the link field of the preceding + * directory to point to the offset of the directory + * that follows. + */ + (void) TIFFSeekFile(tif, off, SEEK_SET); + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabLong(&nextdir); + if (!WriteOK(tif, &nextdir, sizeof (uint32))) { + TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); + return (0); + } + /* + * Leave directory state setup safely. We don't have + * facilities for doing inserting and removing directories, + * so it's safest to just invalidate everything. This + * means that the caller can only append to the directory + * chain. + */ + (*tif->tif_cleanup)(tif); + if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { + _TIFFfree(tif->tif_rawdata); + tif->tif_rawdata = NULL; + tif->tif_rawcc = 0; + } + tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE); + TIFFFreeDirectory(tif); + TIFFDefaultDirectory(tif); + tif->tif_diroff = 0; /* force link on next write */ + tif->tif_nextdiroff = 0; /* next write must be at end */ + tif->tif_curoff = 0; + tif->tif_row = (uint32) -1; + tif->tif_curstrip = (tstrip_t) -1; + return (1); +} + +/* [BFC] + * + * Author: Bruce Cameron + * + * Set a table of tags that are to be replaced during directory process by the + * 'IGNORE' state - or return TRUE/FALSE for the requested tag such that + * 'ReadDirectory' can use the stored information. + * + * FIXME: this is never used properly. Should be removed in the future. + */ +int +TIFFReassignTagToIgnore (enum TIFFIgnoreSense task, int TIFFtagID) +{ + static int TIFFignoretags [FIELD_LAST]; + static int tagcount = 0 ; + int i; /* Loop index */ + int j; /* Loop index */ + + switch (task) + { + case TIS_STORE: + if ( tagcount < (FIELD_LAST - 1) ) + { + for ( j = 0 ; j < tagcount ; ++j ) + { /* Do not add duplicate tag */ + if ( TIFFignoretags [j] == TIFFtagID ) + return (TRUE) ; + } + TIFFignoretags [tagcount++] = TIFFtagID ; + return (TRUE) ; + } + break ; + + case TIS_EXTRACT: + for ( i = 0 ; i < tagcount ; ++i ) + { + if ( TIFFignoretags [i] == TIFFtagID ) + return (TRUE) ; + } + break; + + case TIS_EMPTY: + tagcount = 0 ; /* Clear the list */ + return (TRUE) ; + + default: + break; + } + + return (FALSE); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_dir.h b/src/3rdparty/libtiff/libtiff/tif_dir.h new file mode 100644 index 0000000000..e2aeea2917 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_dir.h @@ -0,0 +1,202 @@ +/* $Id: tif_dir.h,v 1.30.2.1 2007/04/07 14:58:30 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFFDIR_ +#define _TIFFDIR_ +/* + * ``Library-private'' Directory-related Definitions. + */ + +/* + * Internal format of a TIFF directory entry. + */ +typedef struct { +#define FIELD_SETLONGS 4 + /* bit vector of fields that are set */ + unsigned long td_fieldsset[FIELD_SETLONGS]; + + uint32 td_imagewidth, td_imagelength, td_imagedepth; + uint32 td_tilewidth, td_tilelength, td_tiledepth; + uint32 td_subfiletype; + uint16 td_bitspersample; + uint16 td_sampleformat; + uint16 td_compression; + uint16 td_photometric; + uint16 td_threshholding; + uint16 td_fillorder; + uint16 td_orientation; + uint16 td_samplesperpixel; + uint32 td_rowsperstrip; + uint16 td_minsamplevalue, td_maxsamplevalue; + double td_sminsamplevalue, td_smaxsamplevalue; + float td_xresolution, td_yresolution; + uint16 td_resolutionunit; + uint16 td_planarconfig; + float td_xposition, td_yposition; + uint16 td_pagenumber[2]; + uint16* td_colormap[3]; + uint16 td_halftonehints[2]; + uint16 td_extrasamples; + uint16* td_sampleinfo; + /* even though the name is misleading, td_stripsperimage is the number + * of striles (=strips or tiles) per plane, and td_nstrips the total + * number of striles */ + tstrile_t td_stripsperimage; + tstrile_t td_nstrips; /* size of offset & bytecount arrays */ + toff_t* td_stripoffset; + toff_t* td_stripbytecount; /* FIXME: it should be tsize_t array */ + int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */ + uint16 td_nsubifd; + uint32* td_subifd; + /* YCbCr parameters */ + uint16 td_ycbcrsubsampling[2]; + uint16 td_ycbcrpositioning; + /* Colorimetry parameters */ + uint16* td_transferfunction[3]; + /* CMYK parameters */ + int td_inknameslen; + char* td_inknames; + + int td_customValueCount; + TIFFTagValue *td_customValues; +} TIFFDirectory; + +/* + * Field flags used to indicate fields that have + * been set in a directory, and to reference fields + * when manipulating a directory. + */ + +/* + * FIELD_IGNORE is used to signify tags that are to + * be processed but otherwise ignored. This permits + * antiquated tags to be quietly read and discarded. + * Note that a bit *is* allocated for ignored tags; + * this is understood by the directory reading logic + * which uses this fact to avoid special-case handling + */ +#define FIELD_IGNORE 0 + +/* multi-item fields */ +#define FIELD_IMAGEDIMENSIONS 1 +#define FIELD_TILEDIMENSIONS 2 +#define FIELD_RESOLUTION 3 +#define FIELD_POSITION 4 + +/* single-item fields */ +#define FIELD_SUBFILETYPE 5 +#define FIELD_BITSPERSAMPLE 6 +#define FIELD_COMPRESSION 7 +#define FIELD_PHOTOMETRIC 8 +#define FIELD_THRESHHOLDING 9 +#define FIELD_FILLORDER 10 +#define FIELD_ORIENTATION 15 +#define FIELD_SAMPLESPERPIXEL 16 +#define FIELD_ROWSPERSTRIP 17 +#define FIELD_MINSAMPLEVALUE 18 +#define FIELD_MAXSAMPLEVALUE 19 +#define FIELD_PLANARCONFIG 20 +#define FIELD_RESOLUTIONUNIT 22 +#define FIELD_PAGENUMBER 23 +#define FIELD_STRIPBYTECOUNTS 24 +#define FIELD_STRIPOFFSETS 25 +#define FIELD_COLORMAP 26 +#define FIELD_EXTRASAMPLES 31 +#define FIELD_SAMPLEFORMAT 32 +#define FIELD_SMINSAMPLEVALUE 33 +#define FIELD_SMAXSAMPLEVALUE 34 +#define FIELD_IMAGEDEPTH 35 +#define FIELD_TILEDEPTH 36 +#define FIELD_HALFTONEHINTS 37 +#define FIELD_YCBCRSUBSAMPLING 39 +#define FIELD_YCBCRPOSITIONING 40 +#define FIELD_TRANSFERFUNCTION 44 +#define FIELD_INKNAMES 46 +#define FIELD_SUBIFD 49 +/* FIELD_CUSTOM (see tiffio.h) 65 */ +/* end of support for well-known tags; codec-private tags follow */ +#define FIELD_CODEC 66 /* base of codec-private tags */ + + +/* + * Pseudo-tags don't normally need field bits since they + * are not written to an output file (by definition). + * The library also has express logic to always query a + * codec for a pseudo-tag so allocating a field bit for + * one is a waste. If codec wants to promote the notion + * of a pseudo-tag being ``set'' or ``unset'' then it can + * do using internal state flags without polluting the + * field bit space defined for real tags. + */ +#define FIELD_PSEUDO 0 + +#define FIELD_LAST (32*FIELD_SETLONGS-1) + +#define TIFFExtractData(tif, type, v) \ + ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \ + ((v) >> (tif)->tif_typeshift[type]) & (tif)->tif_typemask[type] : \ + (v) & (tif)->tif_typemask[type])) +#define TIFFInsertData(tif, type, v) \ + ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \ + ((v) & (tif)->tif_typemask[type]) << (tif)->tif_typeshift[type] : \ + (v) & (tif)->tif_typemask[type])) + + +#define BITn(n) (((unsigned long)1L)<<((n)&0x1f)) +#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n)/32]) +#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field)) +#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field)) +#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field)) + +#define FieldSet(fields, f) (fields[(f)/32] & BITn(f)) +#define ResetFieldBit(fields, f) (fields[(f)/32] &= ~BITn(f)) + +#if defined(__cplusplus) +extern "C" { +#endif +extern const TIFFFieldInfo *_TIFFGetFieldInfo(size_t *); +extern const TIFFFieldInfo *_TIFFGetExifFieldInfo(size_t *); +extern void _TIFFSetupFieldInfo(TIFF*, const TIFFFieldInfo[], size_t); +extern int _TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int); +extern void _TIFFPrintFieldInfo(TIFF*, FILE*); +extern TIFFDataType _TIFFSampleToTagType(TIFF*); +extern const TIFFFieldInfo* _TIFFFindOrRegisterFieldInfo( TIFF *tif, + ttag_t tag, + TIFFDataType dt ); +extern TIFFFieldInfo* _TIFFCreateAnonFieldInfo( TIFF *tif, ttag_t tag, + TIFFDataType dt ); + +#define _TIFFFindFieldInfo TIFFFindFieldInfo +#define _TIFFFindFieldInfoByName TIFFFindFieldInfoByName +#define _TIFFFieldWithTag TIFFFieldWithTag +#define _TIFFFieldWithName TIFFFieldWithName + +#if defined(__cplusplus) +} +#endif +#endif /* _TIFFDIR_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_dirinfo.c b/src/3rdparty/libtiff/libtiff/tif_dirinfo.c new file mode 100644 index 0000000000..99a871cc37 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_dirinfo.c @@ -0,0 +1,881 @@ +/* $Id: tif_dirinfo.c,v 1.65.2.7 2009-09-17 18:00:28 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Core Directory Tag Support. + */ +#include "tiffiop.h" +#include +#include + +/* + * NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG. + * If a tag can have both LONG and SHORT types then the LONG must be + * placed before the SHORT for writing to work properly. + * + * NOTE: The second field (field_readcount) and third field (field_writecount) + * sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3) + * and TIFFTAG_SPP (-2). The macros should be used but would throw off + * the formatting of the code, so please interprete the -1, -2 and -3 + * values accordingly. + */ +static const TIFFFieldInfo +tiffFieldInfo[] = { + { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, FIELD_SUBFILETYPE, + 1, 0, "SubfileType" }, +/* XXX SHORT for compatibility w/ old versions of the library */ + { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE, + 1, 0, "SubfileType" }, + { TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE, + 1, 0, "OldSubfileType" }, + { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS, + 0, 0, "ImageWidth" }, + { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS, + 0, 0, "ImageWidth" }, + { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS, + 1, 0, "ImageLength" }, + { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS, + 1, 0, "ImageLength" }, + { TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_SHORT, FIELD_BITSPERSAMPLE, + 0, 0, "BitsPerSample" }, +/* XXX LONG for compatibility with some broken TIFF writers */ + { TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_LONG, FIELD_BITSPERSAMPLE, + 0, 0, "BitsPerSample" }, + { TIFFTAG_COMPRESSION, -1, 1, TIFF_SHORT, FIELD_COMPRESSION, + 0, 0, "Compression" }, +/* XXX LONG for compatibility with some broken TIFF writers */ + { TIFFTAG_COMPRESSION, -1, 1, TIFF_LONG, FIELD_COMPRESSION, + 0, 0, "Compression" }, + { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, FIELD_PHOTOMETRIC, + 0, 0, "PhotometricInterpretation" }, +/* XXX LONG for compatibility with some broken TIFF writers */ + { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_LONG, FIELD_PHOTOMETRIC, + 0, 0, "PhotometricInterpretation" }, + { TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, FIELD_THRESHHOLDING, + 1, 0, "Threshholding" }, + { TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, FIELD_IGNORE, + 1, 0, "CellWidth" }, + { TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, FIELD_IGNORE, + 1, 0, "CellLength" }, + { TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, FIELD_FILLORDER, + 0, 0, "FillOrder" }, + { TIFFTAG_DOCUMENTNAME, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "DocumentName" }, + { TIFFTAG_IMAGEDESCRIPTION, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "ImageDescription" }, + { TIFFTAG_MAKE, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "Make" }, + { TIFFTAG_MODEL, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "Model" }, + { TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_LONG, FIELD_STRIPOFFSETS, + 0, 0, "StripOffsets" }, + { TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_SHORT, FIELD_STRIPOFFSETS, + 0, 0, "StripOffsets" }, + { TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, FIELD_ORIENTATION, + 0, 0, "Orientation" }, + { TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, FIELD_SAMPLESPERPIXEL, + 0, 0, "SamplesPerPixel" }, + { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, FIELD_ROWSPERSTRIP, + 0, 0, "RowsPerStrip" }, + { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_SHORT, FIELD_ROWSPERSTRIP, + 0, 0, "RowsPerStrip" }, + { TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_STRIPBYTECOUNTS, + 0, 0, "StripByteCounts" }, + { TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS, + 0, 0, "StripByteCounts" }, + { TIFFTAG_MINSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MINSAMPLEVALUE, + 1, 0, "MinSampleValue" }, + { TIFFTAG_MAXSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MAXSAMPLEVALUE, + 1, 0, "MaxSampleValue" }, + { TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION, + 1, 0, "XResolution" }, + { TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION, + 1, 0, "YResolution" }, + { TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, FIELD_PLANARCONFIG, + 0, 0, "PlanarConfiguration" }, + { TIFFTAG_PAGENAME, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "PageName" }, + { TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION, + 1, 0, "XPosition" }, + { TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION, + 1, 0, "YPosition" }, + { TIFFTAG_FREEOFFSETS, -1,-1, TIFF_LONG, FIELD_IGNORE, + 0, 0, "FreeOffsets" }, + { TIFFTAG_FREEBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_IGNORE, + 0, 0, "FreeByteCounts" }, + { TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE, + 1, 0, "GrayResponseUnit" }, + { TIFFTAG_GRAYRESPONSECURVE,-1,-1, TIFF_SHORT, FIELD_IGNORE, + 1, 0, "GrayResponseCurve" }, + { TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, FIELD_RESOLUTIONUNIT, + 1, 0, "ResolutionUnit" }, + { TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, FIELD_PAGENUMBER, + 1, 0, "PageNumber" }, + { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE, + 1, 0, "ColorResponseUnit" }, + { TIFFTAG_TRANSFERFUNCTION, -1,-1, TIFF_SHORT, FIELD_TRANSFERFUNCTION, + 1, 0, "TransferFunction" }, + { TIFFTAG_SOFTWARE, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "Software" }, + { TIFFTAG_DATETIME, 20,20, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "DateTime" }, + { TIFFTAG_ARTIST, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "Artist" }, + { TIFFTAG_HOSTCOMPUTER, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "HostComputer" }, + { TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "WhitePoint" }, + { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "PrimaryChromaticities" }, + { TIFFTAG_COLORMAP, -1,-1, TIFF_SHORT, FIELD_COLORMAP, + 1, 0, "ColorMap" }, + { TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, FIELD_HALFTONEHINTS, + 1, 0, "HalftoneHints" }, + { TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS, + 0, 0, "TileWidth" }, + { TIFFTAG_TILEWIDTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS, + 0, 0, "TileWidth" }, + { TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS, + 0, 0, "TileLength" }, + { TIFFTAG_TILELENGTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS, + 0, 0, "TileLength" }, + { TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG, FIELD_STRIPOFFSETS, + 0, 0, "TileOffsets" }, + { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG, FIELD_STRIPBYTECOUNTS, + 0, 0, "TileByteCounts" }, + { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS, + 0, 0, "TileByteCounts" }, + { TIFFTAG_SUBIFD, -1,-1, TIFF_IFD, FIELD_SUBIFD, + 1, 1, "SubIFD" }, + { TIFFTAG_SUBIFD, -1,-1, TIFF_LONG, FIELD_SUBIFD, + 1, 1, "SubIFD" }, + { TIFFTAG_INKSET, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "InkSet" }, + { TIFFTAG_INKNAMES, -1,-1, TIFF_ASCII, FIELD_INKNAMES, + 1, 1, "InkNames" }, + { TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "NumberOfInks" }, + { TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "DotRange" }, + { TIFFTAG_DOTRANGE, 2, 2, TIFF_BYTE, FIELD_CUSTOM, + 0, 0, "DotRange" }, + { TIFFTAG_TARGETPRINTER, -1,-1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "TargetPrinter" }, + { TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_SHORT, FIELD_EXTRASAMPLES, + 0, 1, "ExtraSamples" }, +/* XXX for bogus Adobe Photoshop v2.5 files */ + { TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_BYTE, FIELD_EXTRASAMPLES, + 0, 1, "ExtraSamples" }, + { TIFFTAG_SAMPLEFORMAT, -1,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT, + 0, 0, "SampleFormat" }, + { TIFFTAG_SMINSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMINSAMPLEVALUE, + 1, 0, "SMinSampleValue" }, + { TIFFTAG_SMAXSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMAXSAMPLEVALUE, + 1, 0, "SMaxSampleValue" }, + { TIFFTAG_CLIPPATH, -1, -3, TIFF_BYTE, FIELD_CUSTOM, + 0, 1, "ClipPath" }, + { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SLONG, FIELD_CUSTOM, + 0, 0, "XClipPathUnits" }, + { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SSHORT, FIELD_CUSTOM, + 0, 0, "XClipPathUnits" }, + { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SBYTE, FIELD_CUSTOM, + 0, 0, "XClipPathUnits" }, + { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SLONG, FIELD_CUSTOM, + 0, 0, "YClipPathUnits" }, + { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SSHORT, FIELD_CUSTOM, + 0, 0, "YClipPathUnits" }, + { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SBYTE, FIELD_CUSTOM, + 0, 0, "YClipPathUnits" }, + { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "YCbCrCoefficients" }, + { TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, FIELD_YCBCRSUBSAMPLING, + 0, 0, "YCbCrSubsampling" }, + { TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, FIELD_YCBCRPOSITIONING, + 0, 0, "YCbCrPositioning" }, + { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "ReferenceBlackWhite" }, +/* XXX temporarily accept LONG for backwards compatibility */ + { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_LONG, FIELD_CUSTOM, + 1, 0, "ReferenceBlackWhite" }, + { TIFFTAG_XMLPACKET, -3,-3, TIFF_BYTE, FIELD_CUSTOM, + 0, 1, "XMLPacket" }, +/* begin SGI tags */ + { TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, FIELD_EXTRASAMPLES, + 0, 0, "Matteing" }, + { TIFFTAG_DATATYPE, -2,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT, + 0, 0, "DataType" }, + { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, FIELD_IMAGEDEPTH, + 0, 0, "ImageDepth" }, + { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDEPTH, + 0, 0, "ImageDepth" }, + { TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, FIELD_TILEDEPTH, + 0, 0, "TileDepth" }, + { TIFFTAG_TILEDEPTH, 1, 1, TIFF_SHORT, FIELD_TILEDEPTH, + 0, 0, "TileDepth" }, +/* end SGI tags */ +/* begin Pixar tags */ + { TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, FIELD_CUSTOM, + 1, 0, "ImageFullWidth" }, + { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, FIELD_CUSTOM, + 1, 0, "ImageFullLength" }, + { TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "TextureFormat" }, + { TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "TextureWrapModes" }, + { TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, FIELD_CUSTOM, + 1, 0, "FieldOfViewCotangent" }, + { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16,16, TIFF_FLOAT, + FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen" }, + { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16,16, TIFF_FLOAT, + FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera" }, + { TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "Copyright" }, +/* end Pixar tags */ + { TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG, FIELD_CUSTOM, + 0, 1, "RichTIFFIPTC" }, + { TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, FIELD_CUSTOM, + 0, 1, "Photoshop" }, + { TIFFTAG_EXIFIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM, + 0, 0, "EXIFIFDOffset" }, + { TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, FIELD_CUSTOM, + 0, 1, "ICC Profile" }, + { TIFFTAG_GPSIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM, + 0, 0, "GPSIFDOffset" }, + { TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, FIELD_CUSTOM, + 0, 0, "StoNits" }, + { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM, + 0, 0, "InteroperabilityIFDOffset" }, +/* begin DNG tags */ + { TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, FIELD_CUSTOM, + 0, 0, "DNGVersion" }, + { TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, FIELD_CUSTOM, + 0, 0, "DNGBackwardVersion" }, + { TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "UniqueCameraModel" }, + { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "LocalizedCameraModel" }, + { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, FIELD_CUSTOM, + 1, 1, "LocalizedCameraModel" }, + { TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, FIELD_CUSTOM, + 0, 1, "CFAPlaneColor" }, + { TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "CFALayout" }, + { TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, FIELD_CUSTOM, + 0, 1, "LinearizationTable" }, + { TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "BlackLevelRepeatDim" }, + { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_LONG, FIELD_CUSTOM, + 0, 1, "BlackLevel" }, + { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_SHORT, FIELD_CUSTOM, + 0, 1, "BlackLevel" }, + { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 1, "BlackLevel" }, + { TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "BlackLevelDeltaH" }, + { TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "BlackLevelDeltaV" }, + { TIFFTAG_WHITELEVEL, -2, -2, TIFF_LONG, FIELD_CUSTOM, + 0, 0, "WhiteLevel" }, + { TIFFTAG_WHITELEVEL, -2, -2, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "WhiteLevel" }, + { TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "DefaultScale" }, + { TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "BestQualityScale" }, + { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_LONG, FIELD_CUSTOM, + 0, 0, "DefaultCropOrigin" }, + { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "DefaultCropOrigin" }, + { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "DefaultCropOrigin" }, + { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_LONG, FIELD_CUSTOM, + 0, 0, "DefaultCropSize" }, + { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "DefaultCropSize" }, + { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "DefaultCropSize" }, + { TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "ColorMatrix1" }, + { TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "ColorMatrix2" }, + { TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "CameraCalibration1" }, + { TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "CameraCalibration2" }, + { TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "ReductionMatrix1" }, + { TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "ReductionMatrix2" }, + { TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 1, "AnalogBalance" }, + { TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_SHORT, FIELD_CUSTOM, + 0, 1, "AsShotNeutral" }, + { TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 1, "AsShotNeutral" }, + { TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "AsShotWhiteXY" }, + { TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 0, "BaselineExposure" }, + { TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "BaselineNoise" }, + { TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "BaselineSharpness" }, + { TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, FIELD_CUSTOM, + 0, 0, "BayerGreenSplit" }, + { TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "LinearResponseLimit" }, + { TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "CameraSerialNumber" }, + { TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "LensInfo" }, + { TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "ChromaBlurRadius" }, + { TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "AntiAliasStrength" }, + { TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 0, 0, "ShadowScale" }, + { TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, FIELD_CUSTOM, + 0, 1, "DNGPrivateData" }, + { TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "MakerNoteSafety" }, + { TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "CalibrationIlluminant1" }, + { TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "CalibrationIlluminant2" }, + { TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, FIELD_CUSTOM, + 0, 0, "RawDataUniqueID" }, + { TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "OriginalRawFileName" }, + { TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, FIELD_CUSTOM, + 1, 1, "OriginalRawFileName" }, + { TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 0, 1, "OriginalRawFileData" }, + { TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, FIELD_CUSTOM, + 0, 0, "ActiveArea" }, + { TIFFTAG_ACTIVEAREA, 4, 4, TIFF_SHORT, FIELD_CUSTOM, + 0, 0, "ActiveArea" }, + { TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, FIELD_CUSTOM, + 0, 1, "MaskedAreas" }, + { TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 0, 1, "AsShotICCProfile" }, + { TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "AsShotPreProfileMatrix" }, + { TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 0, 1, "CurrentICCProfile" }, + { TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, + 0, 1, "CurrentPreProfileMatrix" }, +/* end DNG tags */ +}; + +static const TIFFFieldInfo +exifFieldInfo[] = { + { EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "ExposureTime" }, + { EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "FNumber" }, + { EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "ExposureProgram" }, + { EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "SpectralSensitivity" }, + { EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, FIELD_CUSTOM, + 1, 1, "ISOSpeedRatings" }, + { EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 1, "OptoelectricConversionFactor" }, + { EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 0, "ExifVersion" }, + { EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "DateTimeOriginal" }, + { EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "DateTimeDigitized" }, + { EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 0, "ComponentsConfiguration" }, + { EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "CompressedBitsPerPixel" }, + { EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM, + 1, 0, "ShutterSpeedValue" }, + { EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "ApertureValue" }, + { EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM, + 1, 0, "BrightnessValue" }, + { EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM, + 1, 0, "ExposureBiasValue" }, + { EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "MaxApertureValue" }, + { EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "SubjectDistance" }, + { EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "MeteringMode" }, + { EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "LightSource" }, + { EXIFTAG_FLASH, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "Flash" }, + { EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "FocalLength" }, + { EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, FIELD_CUSTOM, + 1, 1, "SubjectArea" }, + { EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 1, "MakerNote" }, + { EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 1, "UserComment" }, + { EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "SubSecTime" }, + { EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "SubSecTimeOriginal" }, + { EXIFTAG_SUBSECTIMEDIGITIZED,-1, -1, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "SubSecTimeDigitized" }, + { EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 0, "FlashpixVersion" }, + { EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "ColorSpace" }, + { EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, FIELD_CUSTOM, + 1, 0, "PixelXDimension" }, + { EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "PixelXDimension" }, + { EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, FIELD_CUSTOM, + 1, 0, "PixelYDimension" }, + { EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "PixelYDimension" }, + { EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "RelatedSoundFile" }, + { EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "FlashEnergy" }, + { EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 1, "SpatialFrequencyResponse" }, + { EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "FocalPlaneXResolution" }, + { EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "FocalPlaneYResolution" }, + { EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "FocalPlaneResolutionUnit" }, + { EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "SubjectLocation" }, + { EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "ExposureIndex" }, + { EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "SensingMethod" }, + { EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 0, "FileSource" }, + { EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 0, "SceneType" }, + { EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 1, "CFAPattern" }, + { EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "CustomRendered" }, + { EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "ExposureMode" }, + { EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "WhiteBalance" }, + { EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "DigitalZoomRatio" }, + { EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "FocalLengthIn35mmFilm" }, + { EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "SceneCaptureType" }, + { EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM, + 1, 0, "GainControl" }, + { EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "Contrast" }, + { EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "Saturation" }, + { EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "Sharpness" }, + { EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM, + 1, 1, "DeviceSettingDescription" }, + { EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, FIELD_CUSTOM, + 1, 0, "SubjectDistanceRange" }, + { EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, FIELD_CUSTOM, + 1, 0, "ImageUniqueID" } +}; + +const TIFFFieldInfo * +_TIFFGetFieldInfo(size_t *size) +{ + *size = TIFFArrayCount(tiffFieldInfo); + return tiffFieldInfo; +} + +const TIFFFieldInfo * +_TIFFGetExifFieldInfo(size_t *size) +{ + *size = TIFFArrayCount(exifFieldInfo); + return exifFieldInfo; +} + +void +_TIFFSetupFieldInfo(TIFF* tif, const TIFFFieldInfo info[], size_t n) +{ + if (tif->tif_fieldinfo) { + size_t i; + + for (i = 0; i < tif->tif_nfields; i++) + { + TIFFFieldInfo *fld = tif->tif_fieldinfo[i]; + if (fld->field_bit == FIELD_CUSTOM && + strncmp("Tag ", fld->field_name, 4) == 0) { + _TIFFfree(fld->field_name); + _TIFFfree(fld); + } + } + + _TIFFfree(tif->tif_fieldinfo); + tif->tif_nfields = 0; + } + if (!_TIFFMergeFieldInfo(tif, info, n)) + { + TIFFErrorExt(tif->tif_clientdata, "_TIFFSetupFieldInfo", + "Setting up field info failed"); + } +} + +static int +tagCompare(const void* a, const void* b) +{ + const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a; + const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b; + /* NB: be careful of return values for 16-bit platforms */ + if (ta->field_tag != tb->field_tag) + return (int)ta->field_tag - (int)tb->field_tag; + else + return (ta->field_type == TIFF_ANY) ? + 0 : ((int)tb->field_type - (int)ta->field_type); +} + +static int +tagNameCompare(const void* a, const void* b) +{ + const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a; + const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b; + int ret = strcmp(ta->field_name, tb->field_name); + + if (ret) + return ret; + else + return (ta->field_type == TIFF_ANY) ? + 0 : ((int)tb->field_type - (int)ta->field_type); +} + +void +TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n) +{ + if (_TIFFMergeFieldInfo(tif, info, n) < 0) + { + TIFFErrorExt(tif->tif_clientdata, "TIFFMergeFieldInfo", + "Merging block of %d fields failed", n); + } +} + +int +_TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n) +{ + static const char module[] = "_TIFFMergeFieldInfo"; + static const char reason[] = "for field info array"; + TIFFFieldInfo** tp; + int i; + + tif->tif_foundfield = NULL; + + if (tif->tif_nfields > 0) { + tif->tif_fieldinfo = (TIFFFieldInfo**) + _TIFFCheckRealloc(tif, tif->tif_fieldinfo, + (tif->tif_nfields + n), + sizeof (TIFFFieldInfo*), reason); + } else { + tif->tif_fieldinfo = (TIFFFieldInfo**) + _TIFFCheckMalloc(tif, n, sizeof (TIFFFieldInfo*), + reason); + } + if (!tif->tif_fieldinfo) { + TIFFErrorExt(tif->tif_clientdata, module, + "Failed to allocate field info array"); + return 0; + } + tp = tif->tif_fieldinfo + tif->tif_nfields; + for (i = 0; i < n; i++) + { + const TIFFFieldInfo *fip = + _TIFFFindFieldInfo(tif, info[i].field_tag, info[i].field_type); + + /* only add definitions that aren't already present */ + if (!fip) { + *tp++ = (TIFFFieldInfo*) (info + i); + tif->tif_nfields++; + } + } + + /* Sort the field info by tag number */ + qsort(tif->tif_fieldinfo, tif->tif_nfields, + sizeof (TIFFFieldInfo*), tagCompare); + + return n; +} + +void +_TIFFPrintFieldInfo(TIFF* tif, FILE* fd) +{ + size_t i; + + fprintf(fd, "%s: \n", tif->tif_name); + for (i = 0; i < tif->tif_nfields; i++) { + const TIFFFieldInfo* fip = tif->tif_fieldinfo[i]; + fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n" + , (int)i + , (unsigned long) fip->field_tag + , fip->field_readcount, fip->field_writecount + , fip->field_type + , fip->field_bit + , fip->field_oktochange ? "TRUE" : "FALSE" + , fip->field_passcount ? "TRUE" : "FALSE" + , fip->field_name + ); + } +} + +/* + * Return size of TIFFDataType in bytes + */ +int +TIFFDataWidth(TIFFDataType type) +{ + switch(type) + { + case 0: /* nothing */ + case 1: /* TIFF_BYTE */ + case 2: /* TIFF_ASCII */ + case 6: /* TIFF_SBYTE */ + case 7: /* TIFF_UNDEFINED */ + return 1; + case 3: /* TIFF_SHORT */ + case 8: /* TIFF_SSHORT */ + return 2; + case 4: /* TIFF_LONG */ + case 9: /* TIFF_SLONG */ + case 11: /* TIFF_FLOAT */ + case 13: /* TIFF_IFD */ + return 4; + case 5: /* TIFF_RATIONAL */ + case 10: /* TIFF_SRATIONAL */ + case 12: /* TIFF_DOUBLE */ + return 8; + default: + return 0; /* will return 0 for unknown types */ + } +} + +/* + * Return size of TIFFDataType in bytes. + * + * XXX: We need a separate function to determine the space needed + * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8, + * but we use 4-byte float to represent rationals. + */ +int +_TIFFDataSize(TIFFDataType type) +{ + switch (type) { + case TIFF_BYTE: + case TIFF_SBYTE: + case TIFF_ASCII: + case TIFF_UNDEFINED: + return 1; + case TIFF_SHORT: + case TIFF_SSHORT: + return 2; + case TIFF_LONG: + case TIFF_SLONG: + case TIFF_FLOAT: + case TIFF_IFD: + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + return 4; + case TIFF_DOUBLE: + return 8; + default: + return 0; + } +} + +/* + * Return nearest TIFFDataType to the sample type of an image. + */ +TIFFDataType +_TIFFSampleToTagType(TIFF* tif) +{ + uint32 bps = TIFFhowmany8(tif->tif_dir.td_bitspersample); + + switch (tif->tif_dir.td_sampleformat) { + case SAMPLEFORMAT_IEEEFP: + return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE); + case SAMPLEFORMAT_INT: + return (bps <= 1 ? TIFF_SBYTE : + bps <= 2 ? TIFF_SSHORT : TIFF_SLONG); + case SAMPLEFORMAT_UINT: + return (bps <= 1 ? TIFF_BYTE : + bps <= 2 ? TIFF_SHORT : TIFF_LONG); + case SAMPLEFORMAT_VOID: + return (TIFF_UNDEFINED); + } + /*NOTREACHED*/ + return (TIFF_UNDEFINED); +} + +const TIFFFieldInfo* +_TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt) +{ + TIFFFieldInfo key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0}; + TIFFFieldInfo* pkey = &key; + const TIFFFieldInfo **ret; + + if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag && + (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type)) + return tif->tif_foundfield; + + /* If we are invoked with no field information, then just return. */ + if ( !tif->tif_fieldinfo ) { + return NULL; + } + + /* NB: use sorted search (e.g. binary search) */ + key.field_tag = tag; + key.field_type = dt; + + ret = (const TIFFFieldInfo **) bsearch(&pkey, + tif->tif_fieldinfo, + tif->tif_nfields, + sizeof(TIFFFieldInfo *), + tagCompare); + return tif->tif_foundfield = (ret ? *ret : NULL); +} + +const TIFFFieldInfo* +_TIFFFindFieldInfoByName(TIFF* tif, const char *field_name, TIFFDataType dt) +{ + TIFFFieldInfo key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0}; + TIFFFieldInfo* pkey = &key; + const TIFFFieldInfo **ret; + + if (tif->tif_foundfield + && streq(tif->tif_foundfield->field_name, field_name) + && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type)) + return (tif->tif_foundfield); + + /* If we are invoked with no field information, then just return. */ + if ( !tif->tif_fieldinfo ) { + return NULL; + } + + /* NB: use sorted search (e.g. binary search) */ + key.field_name = (char *)field_name; + key.field_type = dt; + + ret = (const TIFFFieldInfo **) lfind(&pkey, + tif->tif_fieldinfo, + &tif->tif_nfields, + sizeof(TIFFFieldInfo *), + tagNameCompare); + return tif->tif_foundfield = (ret ? *ret : NULL); +} + +const TIFFFieldInfo* +_TIFFFieldWithTag(TIFF* tif, ttag_t tag) +{ + const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY); + if (!fip) { + TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithTag", + "Internal error, unknown tag 0x%x", + (unsigned int) tag); + assert(fip != NULL); + /*NOTREACHED*/ + } + return (fip); +} + +const TIFFFieldInfo* +_TIFFFieldWithName(TIFF* tif, const char *field_name) +{ + const TIFFFieldInfo* fip = + _TIFFFindFieldInfoByName(tif, field_name, TIFF_ANY); + if (!fip) { + TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithName", + "Internal error, unknown tag %s", field_name); + assert(fip != NULL); + /*NOTREACHED*/ + } + return (fip); +} + +const TIFFFieldInfo* +_TIFFFindOrRegisterFieldInfo( TIFF *tif, ttag_t tag, TIFFDataType dt ) + +{ + const TIFFFieldInfo *fld; + + fld = _TIFFFindFieldInfo( tif, tag, dt ); + if( fld == NULL ) + { + fld = _TIFFCreateAnonFieldInfo( tif, tag, dt ); + if (!_TIFFMergeFieldInfo(tif, fld, 1)) + return NULL; + } + + return fld; +} + +TIFFFieldInfo* +_TIFFCreateAnonFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType field_type) +{ + TIFFFieldInfo *fld; + (void) tif; + + fld = (TIFFFieldInfo *) _TIFFmalloc(sizeof (TIFFFieldInfo)); + if (fld == NULL) + return NULL; + _TIFFmemset( fld, 0, sizeof(TIFFFieldInfo) ); + + fld->field_tag = tag; + fld->field_readcount = TIFF_VARIABLE2; + fld->field_writecount = TIFF_VARIABLE2; + fld->field_type = field_type; + fld->field_bit = FIELD_CUSTOM; + fld->field_oktochange = TRUE; + fld->field_passcount = TRUE; + fld->field_name = (char *) _TIFFmalloc(32); + if (fld->field_name == NULL) { + _TIFFfree(fld); + return NULL; + } + + /* + * note that this name is a special sign to TIFFClose() and + * _TIFFSetupFieldInfo() to free the field + */ + sprintf(fld->field_name, "Tag %d", (int) tag); + + return fld; +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_dirread.c b/src/3rdparty/libtiff/libtiff/tif_dirread.c new file mode 100644 index 0000000000..52d53fc3ce --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_dirread.c @@ -0,0 +1,2016 @@ +/* $Id: tif_dirread.c,v 1.92.2.6 2009-10-29 20:04:32 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Directory Read Support Routines. + */ +#include "tiffiop.h" + +#define IGNORE 0 /* tag placeholder used below */ + +#ifdef HAVE_IEEEFP +# define TIFFCvtIEEEFloatToNative(tif, n, fp) +# define TIFFCvtIEEEDoubleToNative(tif, n, dp) +#else +extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*); +extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*); +#endif + +static TIFFDirEntry* TIFFReadDirectoryFind(TIFFDirEntry* dir, + uint16 dircount, uint16 tagid); +static int EstimateStripByteCounts(TIFF*, TIFFDirEntry*, uint16); +static void MissingRequired(TIFF*, const char*); +static int TIFFCheckDirOffset(TIFF*, toff_t); +static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32); +static uint16 TIFFFetchDirectory(TIFF*, toff_t, TIFFDirEntry**, toff_t *); +static tsize_t TIFFFetchData(TIFF*, TIFFDirEntry*, char*); +static tsize_t TIFFFetchString(TIFF*, TIFFDirEntry*, char*); +static float TIFFFetchRational(TIFF*, TIFFDirEntry*); +static int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*); +static int TIFFFetchPerSampleShorts(TIFF*, TIFFDirEntry*, uint16*); +static int TIFFFetchPerSampleLongs(TIFF*, TIFFDirEntry*, uint32*); +static int TIFFFetchPerSampleAnys(TIFF*, TIFFDirEntry*, double*); +static int TIFFFetchShortArray(TIFF*, TIFFDirEntry*, uint16*); +static int TIFFFetchStripThing(TIFF*, TIFFDirEntry*, long, uint32**); +static int TIFFFetchRefBlackWhite(TIFF*, TIFFDirEntry*); +static int TIFFFetchSubjectDistance(TIFF*, TIFFDirEntry*); +static float TIFFFetchFloat(TIFF*, TIFFDirEntry*); +static int TIFFFetchFloatArray(TIFF*, TIFFDirEntry*, float*); +static int TIFFFetchDoubleArray(TIFF*, TIFFDirEntry*, double*); +static int TIFFFetchAnyArray(TIFF*, TIFFDirEntry*, double*); +static int TIFFFetchShortPair(TIFF*, TIFFDirEntry*); +static void ChopUpSingleUncompressedStrip(TIFF*); + +/* + * Read the next TIFF directory from a file and convert it to the internal + * format. We read directories sequentially. + */ +int +TIFFReadDirectory(TIFF* tif) +{ + static const char module[] = "TIFFReadDirectory"; + + int n; + TIFFDirectory* td; + TIFFDirEntry *dp, *dir = NULL; + uint16 iv; + uint32 v; + const TIFFFieldInfo* fip; + size_t fix; + uint16 dircount; + int diroutoforderwarning = 0, compressionknown = 0; + + tif->tif_diroff = tif->tif_nextdiroff; + /* + * Check whether we have the last offset or bad offset (IFD looping). + */ + if (!TIFFCheckDirOffset(tif, tif->tif_nextdiroff)) + return 0; + /* + * Cleanup any previous compression state. + */ + (*tif->tif_cleanup)(tif); + tif->tif_curdir++; + dircount = TIFFFetchDirectory(tif, tif->tif_nextdiroff, + &dir, &tif->tif_nextdiroff); + if (!dircount) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Failed to read directory at offset %u", + tif->tif_name, tif->tif_nextdiroff); + return 0; + } + + tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */ + /* + * Setup default value and then make a pass over + * the fields to check type and tag information, + * and to extract info required to size data + * structures. A second pass is made afterwards + * to read in everthing not taken in the first pass. + */ + td = &tif->tif_dir; + /* free any old stuff and reinit */ + TIFFFreeDirectory(tif); + TIFFDefaultDirectory(tif); + /* + * Electronic Arts writes gray-scale TIFF files + * without a PlanarConfiguration directory entry. + * Thus we setup a default value here, even though + * the TIFF spec says there is no default value. + */ + TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + + /* + * Sigh, we must make a separate pass through the + * directory for the following reason: + * + * We must process the Compression tag in the first pass + * in order to merge in codec-private tag definitions (otherwise + * we may get complaints about unknown tags). However, the + * Compression tag may be dependent on the SamplesPerPixel + * tag value because older TIFF specs permited Compression + * to be written as a SamplesPerPixel-count tag entry. + * Thus if we don't first figure out the correct SamplesPerPixel + * tag value then we may end up ignoring the Compression tag + * value because it has an incorrect count value (if the + * true value of SamplesPerPixel is not 1). + * + * It sure would have been nice if Aldus had really thought + * this stuff through carefully. + */ + for (dp = dir, n = dircount; n > 0; n--, dp++) { + if (tif->tif_flags & TIFF_SWAB) { + TIFFSwabArrayOfShort(&dp->tdir_tag, 2); + TIFFSwabArrayOfLong(&dp->tdir_count, 2); + } + if (dp->tdir_tag == TIFFTAG_SAMPLESPERPIXEL) { + if (!TIFFFetchNormalTag(tif, dp)) + goto bad; + dp->tdir_tag = IGNORE; + } + } + /* + * First real pass over the directory. + */ + fix = 0; + for (dp = dir, n = dircount; n > 0; n--, dp++) { + + if (fix >= tif->tif_nfields || dp->tdir_tag == IGNORE) + continue; + + /* + * Silicon Beach (at least) writes unordered + * directory tags (violating the spec). Handle + * it here, but be obnoxious (maybe they'll fix it?). + */ + if (dp->tdir_tag < tif->tif_fieldinfo[fix]->field_tag) { + if (!diroutoforderwarning) { + TIFFWarningExt(tif->tif_clientdata, module, + "%s: invalid TIFF directory; tags are not sorted in ascending order", + tif->tif_name); + diroutoforderwarning = 1; + } + fix = 0; /* O(n^2) */ + } + while (fix < tif->tif_nfields && + tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag) + fix++; + if (fix >= tif->tif_nfields || + tif->tif_fieldinfo[fix]->field_tag != dp->tdir_tag) { + + TIFFWarningExt(tif->tif_clientdata, + module, + "%s: unknown field with tag %d (0x%x) encountered", + tif->tif_name, + dp->tdir_tag, + dp->tdir_tag); + + if (!_TIFFMergeFieldInfo(tif, + _TIFFCreateAnonFieldInfo(tif, + dp->tdir_tag, + (TIFFDataType) dp->tdir_type), + 1)) + { + TIFFWarningExt(tif->tif_clientdata, + module, + "Registering anonymous field with tag %d (0x%x) failed", + dp->tdir_tag, + dp->tdir_tag); + goto ignore; + } + fix = 0; + while (fix < tif->tif_nfields && + tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag) + fix++; + } + /* + * Null out old tags that we ignore. + */ + if (tif->tif_fieldinfo[fix]->field_bit == FIELD_IGNORE) { + ignore: + dp->tdir_tag = IGNORE; + continue; + } + /* + * Check data type. + */ + fip = tif->tif_fieldinfo[fix]; + while (dp->tdir_type != (unsigned short) fip->field_type + && fix < tif->tif_nfields) { + if (fip->field_type == TIFF_ANY) /* wildcard */ + break; + fip = tif->tif_fieldinfo[++fix]; + if (fix >= tif->tif_nfields || + fip->field_tag != dp->tdir_tag) { + TIFFWarningExt(tif->tif_clientdata, module, + "%s: wrong data type %d for \"%s\"; tag ignored", + tif->tif_name, dp->tdir_type, + tif->tif_fieldinfo[fix-1]->field_name); + goto ignore; + } + } + /* + * Check count if known in advance. + */ + if (fip->field_readcount != TIFF_VARIABLE + && fip->field_readcount != TIFF_VARIABLE2) { + uint32 expected = (fip->field_readcount == TIFF_SPP) ? + (uint32) td->td_samplesperpixel : + (uint32) fip->field_readcount; + if (!CheckDirCount(tif, dp, expected)) + goto ignore; + } + + switch (dp->tdir_tag) { + case TIFFTAG_COMPRESSION: + /* + * The 5.0 spec says the Compression tag has + * one value, while earlier specs say it has + * one value per sample. Because of this, we + * accept the tag if one value is supplied. + */ + if (dp->tdir_count == 1) { + v = TIFFExtractData(tif, + dp->tdir_type, dp->tdir_offset); + if (!TIFFSetField(tif, dp->tdir_tag, (uint16)v)) + goto bad; + else + compressionknown = 1; + break; + /* XXX: workaround for broken TIFFs */ + } else if (dp->tdir_type == TIFF_LONG) { + if (!TIFFFetchPerSampleLongs(tif, dp, &v) || + !TIFFSetField(tif, dp->tdir_tag, (uint16)v)) + goto bad; + } else { + if (!TIFFFetchPerSampleShorts(tif, dp, &iv) + || !TIFFSetField(tif, dp->tdir_tag, iv)) + goto bad; + } + dp->tdir_tag = IGNORE; + break; + case TIFFTAG_STRIPOFFSETS: + case TIFFTAG_STRIPBYTECOUNTS: + case TIFFTAG_TILEOFFSETS: + case TIFFTAG_TILEBYTECOUNTS: + TIFFSetFieldBit(tif, fip->field_bit); + break; + case TIFFTAG_IMAGEWIDTH: + case TIFFTAG_IMAGELENGTH: + case TIFFTAG_IMAGEDEPTH: + case TIFFTAG_TILELENGTH: + case TIFFTAG_TILEWIDTH: + case TIFFTAG_TILEDEPTH: + case TIFFTAG_PLANARCONFIG: + case TIFFTAG_ROWSPERSTRIP: + case TIFFTAG_EXTRASAMPLES: + if (!TIFFFetchNormalTag(tif, dp)) + goto bad; + dp->tdir_tag = IGNORE; + break; + } + } + + /* + * XXX: OJPEG hack. + * If a) compression is OJPEG, b) planarconfig tag says it's separate, + * c) strip offsets/bytecounts tag are both present and + * d) both contain exactly one value, then we consistently find + * that the buggy implementation of the buggy compression scheme + * matches contig planarconfig best. So we 'fix-up' the tag here + */ + if ((td->td_compression==COMPRESSION_OJPEG) && + (td->td_planarconfig==PLANARCONFIG_SEPARATE)) { + dp = TIFFReadDirectoryFind(dir,dircount,TIFFTAG_STRIPOFFSETS); + if ((dp!=0) && (dp->tdir_count==1)) { + dp = TIFFReadDirectoryFind(dir, dircount, + TIFFTAG_STRIPBYTECOUNTS); + if ((dp!=0) && (dp->tdir_count==1)) { + td->td_planarconfig=PLANARCONFIG_CONTIG; + TIFFWarningExt(tif->tif_clientdata, + "TIFFReadDirectory", + "Planarconfig tag value assumed incorrect, " + "assuming data is contig instead of chunky"); + } + } + } + + /* + * Allocate directory structure and setup defaults. + */ + if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) { + MissingRequired(tif, "ImageLength"); + goto bad; + } + /* + * Setup appropriate structures (by strip or by tile) + */ + if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) { + td->td_nstrips = TIFFNumberOfStrips(tif); + td->td_tilewidth = td->td_imagewidth; + td->td_tilelength = td->td_rowsperstrip; + td->td_tiledepth = td->td_imagedepth; + tif->tif_flags &= ~TIFF_ISTILED; + } else { + td->td_nstrips = TIFFNumberOfTiles(tif); + tif->tif_flags |= TIFF_ISTILED; + } + if (!td->td_nstrips) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: cannot handle zero number of %s", + tif->tif_name, isTiled(tif) ? "tiles" : "strips"); + goto bad; + } + td->td_stripsperimage = td->td_nstrips; + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) + td->td_stripsperimage /= td->td_samplesperpixel; + if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) { + if ((td->td_compression==COMPRESSION_OJPEG) && + (isTiled(tif)==0) && + (td->td_nstrips==1)) { + /* + * XXX: OJPEG hack. + * If a) compression is OJPEG, b) it's not a tiled TIFF, + * and c) the number of strips is 1, + * then we tolerate the absence of stripoffsets tag, + * because, presumably, all required data is in the + * JpegInterchangeFormat stream. + */ + TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS); + } else { + MissingRequired(tif, + isTiled(tif) ? "TileOffsets" : "StripOffsets"); + goto bad; + } + } + + /* + * Second pass: extract other information. + */ + for (dp = dir, n = dircount; n > 0; n--, dp++) { + if (dp->tdir_tag == IGNORE) + continue; + switch (dp->tdir_tag) { + case TIFFTAG_MINSAMPLEVALUE: + case TIFFTAG_MAXSAMPLEVALUE: + case TIFFTAG_BITSPERSAMPLE: + case TIFFTAG_DATATYPE: + case TIFFTAG_SAMPLEFORMAT: + /* + * The 5.0 spec says the Compression tag has + * one value, while earlier specs say it has + * one value per sample. Because of this, we + * accept the tag if one value is supplied. + * + * The MinSampleValue, MaxSampleValue, BitsPerSample + * DataType and SampleFormat tags are supposed to be + * written as one value/sample, but some vendors + * incorrectly write one value only -- so we accept + * that as well (yech). Other vendors write correct + * value for NumberOfSamples, but incorrect one for + * BitsPerSample and friends, and we will read this + * too. + */ + if (dp->tdir_count == 1) { + v = TIFFExtractData(tif, + dp->tdir_type, dp->tdir_offset); + if (!TIFFSetField(tif, dp->tdir_tag, (uint16)v)) + goto bad; + /* XXX: workaround for broken TIFFs */ + } else if (dp->tdir_tag == TIFFTAG_BITSPERSAMPLE + && dp->tdir_type == TIFF_LONG) { + if (!TIFFFetchPerSampleLongs(tif, dp, &v) || + !TIFFSetField(tif, dp->tdir_tag, (uint16)v)) + goto bad; + } else { + if (!TIFFFetchPerSampleShorts(tif, dp, &iv) || + !TIFFSetField(tif, dp->tdir_tag, iv)) + goto bad; + } + break; + case TIFFTAG_SMINSAMPLEVALUE: + case TIFFTAG_SMAXSAMPLEVALUE: + { + double dv = 0.0; + if (!TIFFFetchPerSampleAnys(tif, dp, &dv) || + !TIFFSetField(tif, dp->tdir_tag, dv)) + goto bad; + } + break; + case TIFFTAG_STRIPOFFSETS: + case TIFFTAG_TILEOFFSETS: + if (!TIFFFetchStripThing(tif, dp, + td->td_nstrips, &td->td_stripoffset)) + goto bad; + break; + case TIFFTAG_STRIPBYTECOUNTS: + case TIFFTAG_TILEBYTECOUNTS: + if (!TIFFFetchStripThing(tif, dp, + td->td_nstrips, &td->td_stripbytecount)) + goto bad; + break; + case TIFFTAG_COLORMAP: + case TIFFTAG_TRANSFERFUNCTION: + { + char* cp; + /* + * TransferFunction can have either 1x or 3x + * data values; Colormap can have only 3x + * items. + */ + v = 1L<td_bitspersample; + if (dp->tdir_tag == TIFFTAG_COLORMAP || + dp->tdir_count != v) { + if (!CheckDirCount(tif, dp, 3 * v)) + break; + } + v *= sizeof(uint16); + cp = (char *)_TIFFCheckMalloc(tif, + dp->tdir_count, + sizeof (uint16), + "to read \"TransferFunction\" tag"); + if (cp != NULL) { + if (TIFFFetchData(tif, dp, cp)) { + /* + * This deals with there being + * only one array to apply to + * all samples. + */ + uint32 c = 1L << td->td_bitspersample; + if (dp->tdir_count == c) + v = 0L; + TIFFSetField(tif, dp->tdir_tag, + cp, cp+v, cp+2*v); + } + _TIFFfree(cp); + } + break; + } + case TIFFTAG_PAGENUMBER: + case TIFFTAG_HALFTONEHINTS: + case TIFFTAG_YCBCRSUBSAMPLING: + case TIFFTAG_DOTRANGE: + (void) TIFFFetchShortPair(tif, dp); + break; + case TIFFTAG_REFERENCEBLACKWHITE: + (void) TIFFFetchRefBlackWhite(tif, dp); + break; +/* BEGIN REV 4.0 COMPATIBILITY */ + case TIFFTAG_OSUBFILETYPE: + v = 0L; + switch (TIFFExtractData(tif, dp->tdir_type, + dp->tdir_offset)) { + case OFILETYPE_REDUCEDIMAGE: + v = FILETYPE_REDUCEDIMAGE; + break; + case OFILETYPE_PAGE: + v = FILETYPE_PAGE; + break; + } + if (v) + TIFFSetField(tif, TIFFTAG_SUBFILETYPE, v); + break; +/* END REV 4.0 COMPATIBILITY */ + default: + (void) TIFFFetchNormalTag(tif, dp); + break; + } + } + /* + * OJPEG hack: + * - If a) compression is OJPEG, and b) photometric tag is missing, + * then we consistently find that photometric should be YCbCr + * - If a) compression is OJPEG, and b) photometric tag says it's RGB, + * then we consistently find that the buggy implementation of the + * buggy compression scheme matches photometric YCbCr instead. + * - If a) compression is OJPEG, and b) bitspersample tag is missing, + * then we consistently find bitspersample should be 8. + * - If a) compression is OJPEG, b) samplesperpixel tag is missing, + * and c) photometric is RGB or YCbCr, then we consistently find + * samplesperpixel should be 3 + * - If a) compression is OJPEG, b) samplesperpixel tag is missing, + * and c) photometric is MINISWHITE or MINISBLACK, then we consistently + * find samplesperpixel should be 3 + */ + if (td->td_compression==COMPRESSION_OJPEG) + { + if (!TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) + { + TIFFWarningExt(tif->tif_clientdata, "TIFFReadDirectory", + "Photometric tag is missing, assuming data is YCbCr"); + if (!TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_YCBCR)) + goto bad; + } + else if (td->td_photometric==PHOTOMETRIC_RGB) + { + td->td_photometric=PHOTOMETRIC_YCBCR; + TIFFWarningExt(tif->tif_clientdata, "TIFFReadDirectory", + "Photometric tag value assumed incorrect, " + "assuming data is YCbCr instead of RGB"); + } + if (!TIFFFieldSet(tif,FIELD_BITSPERSAMPLE)) + { + TIFFWarningExt(tif->tif_clientdata,"TIFFReadDirectory", + "BitsPerSample tag is missing, assuming 8 bits per sample"); + if (!TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,8)) + goto bad; + } + if (!TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL)) + { + if ((td->td_photometric==PHOTOMETRIC_RGB) + || (td->td_photometric==PHOTOMETRIC_YCBCR)) + { + TIFFWarningExt(tif->tif_clientdata, + "TIFFReadDirectory", + "SamplesPerPixel tag is missing, " + "assuming correct SamplesPerPixel value is 3"); + if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3)) + goto bad; + } + else if ((td->td_photometric==PHOTOMETRIC_MINISWHITE) + || (td->td_photometric==PHOTOMETRIC_MINISBLACK)) + { + TIFFWarningExt(tif->tif_clientdata, + "TIFFReadDirectory", + "SamplesPerPixel tag is missing, " + "assuming correct SamplesPerPixel value is 1"); + if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,1)) + goto bad; + } + } + } + /* + * Verify Palette image has a Colormap. + */ + if (td->td_photometric == PHOTOMETRIC_PALETTE && + !TIFFFieldSet(tif, FIELD_COLORMAP)) { + MissingRequired(tif, "Colormap"); + goto bad; + } + /* + * OJPEG hack: + * We do no further messing with strip/tile offsets/bytecounts in OJPEG + * TIFFs + */ + if (td->td_compression!=COMPRESSION_OJPEG) + { + /* + * Attempt to deal with a missing StripByteCounts tag. + */ + if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) { + /* + * Some manufacturers violate the spec by not giving + * the size of the strips. In this case, assume there + * is one uncompressed strip of data. + */ + if ((td->td_planarconfig == PLANARCONFIG_CONTIG && + td->td_nstrips > 1) || + (td->td_planarconfig == PLANARCONFIG_SEPARATE && + td->td_nstrips != td->td_samplesperpixel)) { + MissingRequired(tif, "StripByteCounts"); + goto bad; + } + TIFFWarningExt(tif->tif_clientdata, module, + "%s: TIFF directory is missing required " + "\"%s\" field, calculating from imagelength", + tif->tif_name, + _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name); + if (EstimateStripByteCounts(tif, dir, dircount) < 0) + goto bad; + /* + * Assume we have wrong StripByteCount value (in case + * of single strip) in following cases: + * - it is equal to zero along with StripOffset; + * - it is larger than file itself (in case of uncompressed + * image); + * - it is smaller than the size of the bytes per row + * multiplied on the number of rows. The last case should + * not be checked in the case of writing new image, + * because we may do not know the exact strip size + * until the whole image will be written and directory + * dumped out. + */ + #define BYTECOUNTLOOKSBAD \ + ( (td->td_stripbytecount[0] == 0 && td->td_stripoffset[0] != 0) || \ + (td->td_compression == COMPRESSION_NONE && \ + td->td_stripbytecount[0] > TIFFGetFileSize(tif) - td->td_stripoffset[0]) || \ + (tif->tif_mode == O_RDONLY && \ + td->td_compression == COMPRESSION_NONE && \ + td->td_stripbytecount[0] < TIFFScanlineSize(tif) * td->td_imagelength) ) + + } else if (td->td_nstrips == 1 + && td->td_stripoffset[0] != 0 + && BYTECOUNTLOOKSBAD) { + /* + * XXX: Plexus (and others) sometimes give a value of + * zero for a tag when they don't know what the + * correct value is! Try and handle the simple case + * of estimating the size of a one strip image. + */ + TIFFWarningExt(tif->tif_clientdata, module, + "%s: Bogus \"%s\" field, ignoring and calculating from imagelength", + tif->tif_name, + _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name); + if(EstimateStripByteCounts(tif, dir, dircount) < 0) + goto bad; + } else if (td->td_planarconfig == PLANARCONFIG_CONTIG + && td->td_nstrips > 2 + && td->td_compression == COMPRESSION_NONE + && td->td_stripbytecount[0] != td->td_stripbytecount[1] + && td->td_stripbytecount[0] != 0 + && td->td_stripbytecount[1] != 0 ) { + /* + * XXX: Some vendors fill StripByteCount array with + * absolutely wrong values (it can be equal to + * StripOffset array, for example). Catch this case + * here. + */ + TIFFWarningExt(tif->tif_clientdata, module, + "%s: Wrong \"%s\" field, ignoring and calculating from imagelength", + tif->tif_name, + _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name); + if (EstimateStripByteCounts(tif, dir, dircount) < 0) + goto bad; + } + } + if (dir) { + _TIFFfree((char *)dir); + dir = NULL; + } + if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE)) + td->td_maxsamplevalue = (uint16)((1L<td_bitspersample)-1); + /* + * Setup default compression scheme. + */ + + /* + * XXX: We can optimize checking for the strip bounds using the sorted + * bytecounts array. See also comments for TIFFAppendToStrip() + * function in tif_write.c. + */ + if (td->td_nstrips > 1) { + tstrip_t strip; + + td->td_stripbytecountsorted = 1; + for (strip = 1; strip < td->td_nstrips; strip++) { + if (td->td_stripoffset[strip - 1] > + td->td_stripoffset[strip]) { + td->td_stripbytecountsorted = 0; + break; + } + } + } + + if (!TIFFFieldSet(tif, FIELD_COMPRESSION)) + TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); + /* + * Some manufacturers make life difficult by writing + * large amounts of uncompressed data as a single strip. + * This is contrary to the recommendations of the spec. + * The following makes an attempt at breaking such images + * into strips closer to the recommended 8k bytes. A + * side effect, however, is that the RowsPerStrip tag + * value may be changed. + */ + if (td->td_nstrips == 1 && td->td_compression == COMPRESSION_NONE && + (tif->tif_flags & (TIFF_STRIPCHOP|TIFF_ISTILED)) == TIFF_STRIPCHOP) + ChopUpSingleUncompressedStrip(tif); + + /* + * Reinitialize i/o since we are starting on a new directory. + */ + tif->tif_row = (uint32) -1; + tif->tif_curstrip = (tstrip_t) -1; + tif->tif_col = (uint32) -1; + tif->tif_curtile = (ttile_t) -1; + tif->tif_tilesize = (tsize_t) -1; + + tif->tif_scanlinesize = TIFFScanlineSize(tif); + if (!tif->tif_scanlinesize) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: cannot handle zero scanline size", + tif->tif_name); + return (0); + } + + if (isTiled(tif)) { + tif->tif_tilesize = TIFFTileSize(tif); + if (!tif->tif_tilesize) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: cannot handle zero tile size", + tif->tif_name); + return (0); + } + } else { + if (!TIFFStripSize(tif)) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: cannot handle zero strip size", + tif->tif_name); + return (0); + } + } + return (1); +bad: + if (dir) + _TIFFfree(dir); + return (0); +} + +static TIFFDirEntry* +TIFFReadDirectoryFind(TIFFDirEntry* dir, uint16 dircount, uint16 tagid) +{ + TIFFDirEntry* m; + uint16 n; + for (m=dir, n=0; ntdir_tag==tagid) + return(m); + } + return(0); +} + +/* + * Read custom directory from the arbitarry offset. + * The code is very similar to TIFFReadDirectory(). + */ +int +TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, + const TIFFFieldInfo info[], size_t n) +{ + static const char module[] = "TIFFReadCustomDirectory"; + + TIFFDirectory* td = &tif->tif_dir; + TIFFDirEntry *dp, *dir = NULL; + const TIFFFieldInfo* fip; + size_t fix; + uint16 i, dircount; + + _TIFFSetupFieldInfo(tif, info, n); + + dircount = TIFFFetchDirectory(tif, diroff, &dir, NULL); + if (!dircount) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Failed to read custom directory at offset %u", + tif->tif_name, diroff); + return 0; + } + + TIFFFreeDirectory(tif); + _TIFFmemset(&tif->tif_dir, 0, sizeof(TIFFDirectory)); + + fix = 0; + for (dp = dir, i = dircount; i > 0; i--, dp++) { + if (tif->tif_flags & TIFF_SWAB) { + TIFFSwabArrayOfShort(&dp->tdir_tag, 2); + TIFFSwabArrayOfLong(&dp->tdir_count, 2); + } + + if (fix >= tif->tif_nfields || dp->tdir_tag == IGNORE) + continue; + + while (fix < tif->tif_nfields && + tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag) + fix++; + + if (fix >= tif->tif_nfields || + tif->tif_fieldinfo[fix]->field_tag != dp->tdir_tag) { + + TIFFWarningExt(tif->tif_clientdata, module, + "%s: unknown field with tag %d (0x%x) encountered", + tif->tif_name, dp->tdir_tag, dp->tdir_tag); + if (!_TIFFMergeFieldInfo(tif, + _TIFFCreateAnonFieldInfo(tif, + dp->tdir_tag, + (TIFFDataType) dp->tdir_type), + 1)) + { + TIFFWarningExt(tif->tif_clientdata, module, + "Registering anonymous field with tag %d (0x%x) failed", + dp->tdir_tag, dp->tdir_tag); + goto ignore; + } + + fix = 0; + while (fix < tif->tif_nfields && + tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag) + fix++; + } + /* + * Null out old tags that we ignore. + */ + if (tif->tif_fieldinfo[fix]->field_bit == FIELD_IGNORE) { + ignore: + dp->tdir_tag = IGNORE; + continue; + } + /* + * Check data type. + */ + fip = tif->tif_fieldinfo[fix]; + while (dp->tdir_type != (unsigned short) fip->field_type + && fix < tif->tif_nfields) { + if (fip->field_type == TIFF_ANY) /* wildcard */ + break; + fip = tif->tif_fieldinfo[++fix]; + if (fix >= tif->tif_nfields || + fip->field_tag != dp->tdir_tag) { + TIFFWarningExt(tif->tif_clientdata, module, + "%s: wrong data type %d for \"%s\"; tag ignored", + tif->tif_name, dp->tdir_type, + tif->tif_fieldinfo[fix-1]->field_name); + goto ignore; + } + } + /* + * Check count if known in advance. + */ + if (fip->field_readcount != TIFF_VARIABLE + && fip->field_readcount != TIFF_VARIABLE2) { + uint32 expected = (fip->field_readcount == TIFF_SPP) ? + (uint32) td->td_samplesperpixel : + (uint32) fip->field_readcount; + if (!CheckDirCount(tif, dp, expected)) + goto ignore; + } + + /* + * EXIF tags which need to be specifically processed. + */ + switch (dp->tdir_tag) { + case EXIFTAG_SUBJECTDISTANCE: + (void) TIFFFetchSubjectDistance(tif, dp); + break; + default: + (void) TIFFFetchNormalTag(tif, dp); + break; + } + } + + if (dir) + _TIFFfree(dir); + return 1; +} + +/* + * EXIF is important special case of custom IFD, so we have a special + * function to read it. + */ +int +TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff) +{ + size_t exifFieldInfoCount; + const TIFFFieldInfo *exifFieldInfo = + _TIFFGetExifFieldInfo(&exifFieldInfoCount); + return TIFFReadCustomDirectory(tif, diroff, exifFieldInfo, + exifFieldInfoCount); +} + +static int +EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount) +{ + static const char module[] = "EstimateStripByteCounts"; + + TIFFDirEntry *dp; + TIFFDirectory *td = &tif->tif_dir; + uint32 strip; + + if (td->td_stripbytecount) + _TIFFfree(td->td_stripbytecount); + td->td_stripbytecount = (uint32*) + _TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint32), + "for \"StripByteCounts\" array"); + if( td->td_stripbytecount == NULL ) + return -1; + + if (td->td_compression != COMPRESSION_NONE) { + uint32 space = (uint32)(sizeof (TIFFHeader) + + sizeof (uint16) + + (dircount * sizeof (TIFFDirEntry)) + + sizeof (uint32)); + toff_t filesize = TIFFGetFileSize(tif); + uint16 n; + + /* calculate amount of space used by indirect values */ + for (dp = dir, n = dircount; n > 0; n--, dp++) + { + uint32 cc = TIFFDataWidth((TIFFDataType) dp->tdir_type); + if (cc == 0) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Cannot determine size of unknown tag type %d", + tif->tif_name, dp->tdir_type); + return -1; + } + cc = cc * dp->tdir_count; + if (cc > sizeof (uint32)) + space += cc; + } + space = filesize - space; + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) + space /= td->td_samplesperpixel; + for (strip = 0; strip < td->td_nstrips; strip++) + td->td_stripbytecount[strip] = space; + /* + * This gross hack handles the case were the offset to + * the last strip is past the place where we think the strip + * should begin. Since a strip of data must be contiguous, + * it's safe to assume that we've overestimated the amount + * of data in the strip and trim this number back accordingly. + */ + strip--; + if (((toff_t)(td->td_stripoffset[strip]+ + td->td_stripbytecount[strip])) > filesize) + td->td_stripbytecount[strip] = + filesize - td->td_stripoffset[strip]; + } else if (isTiled(tif)) { + uint32 bytespertile = TIFFTileSize(tif); + + for (strip = 0; strip < td->td_nstrips; strip++) + td->td_stripbytecount[strip] = bytespertile; + } else { + uint32 rowbytes = TIFFScanlineSize(tif); + uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage; + for (strip = 0; strip < td->td_nstrips; strip++) + td->td_stripbytecount[strip] = rowbytes * rowsperstrip; + } + TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS); + if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP)) + td->td_rowsperstrip = td->td_imagelength; + return 1; +} + +static void +MissingRequired(TIFF* tif, const char* tagname) +{ + static const char module[] = "MissingRequired"; + + TIFFErrorExt(tif->tif_clientdata, module, + "%s: TIFF directory is missing required \"%s\" field", + tif->tif_name, tagname); +} + +/* + * Check the directory offset against the list of already seen directory + * offsets. This is a trick to prevent IFD looping. The one can create TIFF + * file with looped directory pointers. We will maintain a list of already + * seen directories and check every IFD offset against that list. + */ +static int +TIFFCheckDirOffset(TIFF* tif, toff_t diroff) +{ + uint16 n; + + if (diroff == 0) /* no more directories */ + return 0; + + for (n = 0; n < tif->tif_dirnumber && tif->tif_dirlist; n++) { + if (tif->tif_dirlist[n] == diroff) + return 0; + } + + tif->tif_dirnumber++; + + if (tif->tif_dirnumber > tif->tif_dirlistsize) { + toff_t* new_dirlist; + + /* + * XXX: Reduce memory allocation granularity of the dirlist + * array. + */ + new_dirlist = (toff_t *)_TIFFCheckRealloc(tif, + tif->tif_dirlist, + tif->tif_dirnumber, + 2 * sizeof(toff_t), + "for IFD list"); + if (!new_dirlist) + return 0; + tif->tif_dirlistsize = 2 * tif->tif_dirnumber; + tif->tif_dirlist = new_dirlist; + } + + tif->tif_dirlist[tif->tif_dirnumber - 1] = diroff; + + return 1; +} + +/* + * Check the count field of a directory entry against a known value. The + * caller is expected to skip/ignore the tag if there is a mismatch. + */ +static int +CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count) +{ + if (count > dir->tdir_count) { + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "incorrect count for field \"%s\" (%u, expecting %u); tag ignored", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, + dir->tdir_count, count); + return (0); + } else if (count < dir->tdir_count) { + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "incorrect count for field \"%s\" (%u, expecting %u); tag trimmed", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, + dir->tdir_count, count); + return (1); + } + return (1); +} + +/* + * Read IFD structure from the specified offset. If the pointer to + * nextdiroff variable has been specified, read it too. Function returns a + * number of fields in the directory or 0 if failed. + */ +static uint16 +TIFFFetchDirectory(TIFF* tif, toff_t diroff, TIFFDirEntry **pdir, + toff_t *nextdiroff) +{ + static const char module[] = "TIFFFetchDirectory"; + + TIFFDirEntry *dir; + uint16 dircount; + + assert(pdir); + + tif->tif_diroff = diroff; + if (nextdiroff) + *nextdiroff = 0; + if (!isMapped(tif)) { + if (!SeekOK(tif, tif->tif_diroff)) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Seek error accessing TIFF directory", + tif->tif_name); + return 0; + } + if (!ReadOK(tif, &dircount, sizeof (uint16))) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Can not read TIFF directory count", + tif->tif_name); + return 0; + } + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabShort(&dircount); + dir = (TIFFDirEntry *)_TIFFCheckMalloc(tif, dircount, + sizeof (TIFFDirEntry), + "to read TIFF directory"); + if (dir == NULL) + return 0; + if (!ReadOK(tif, dir, dircount*sizeof (TIFFDirEntry))) { + TIFFErrorExt(tif->tif_clientdata, module, + "%.100s: Can not read TIFF directory", + tif->tif_name); + _TIFFfree(dir); + return 0; + } + /* + * Read offset to next directory for sequential scans if + * needed. + */ + if (nextdiroff) + (void) ReadOK(tif, nextdiroff, sizeof(uint32)); + } else { + toff_t off = tif->tif_diroff; + + /* + * Check for integer overflow when validating the dir_off, + * otherwise a very high offset may cause an OOB read and + * crash the client. Make two comparisons instead of + * + * off + sizeof(uint16) > tif->tif_size + * + * to avoid overflow. + */ + if (tif->tif_size < sizeof (uint16) || + off > tif->tif_size - sizeof(uint16)) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Can not read TIFF directory count", + tif->tif_name); + return 0; + } else { + _TIFFmemcpy(&dircount, tif->tif_base + off, + sizeof(uint16)); + } + off += sizeof (uint16); + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabShort(&dircount); + dir = (TIFFDirEntry *)_TIFFCheckMalloc(tif, dircount, + sizeof(TIFFDirEntry), + "to read TIFF directory"); + if (dir == NULL) + return 0; + if (off + dircount * sizeof (TIFFDirEntry) > tif->tif_size) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Can not read TIFF directory", + tif->tif_name); + _TIFFfree(dir); + return 0; + } else { + _TIFFmemcpy(dir, tif->tif_base + off, + dircount * sizeof(TIFFDirEntry)); + } + if (nextdiroff) { + off += dircount * sizeof (TIFFDirEntry); + if (off + sizeof (uint32) <= tif->tif_size) { + _TIFFmemcpy(nextdiroff, tif->tif_base + off, + sizeof (uint32)); + } + } + } + if (nextdiroff && tif->tif_flags & TIFF_SWAB) + TIFFSwabLong(nextdiroff); + *pdir = dir; + return dircount; +} + +/* + * Fetch a contiguous directory item. + */ +static tsize_t +TIFFFetchData(TIFF* tif, TIFFDirEntry* dir, char* cp) +{ + uint32 w = TIFFDataWidth((TIFFDataType) dir->tdir_type); + /* + * FIXME: butecount should have tsize_t type, but for now libtiff + * defines tsize_t as a signed 32-bit integer and we are losing + * ability to read arrays larger than 2^31 bytes. So we are using + * uint32 instead of tsize_t here. + */ + uint32 cc = dir->tdir_count * w; + + /* Check for overflow. */ + if (!dir->tdir_count || !w || cc / w != dir->tdir_count) + goto bad; + + if (!isMapped(tif)) { + if (!SeekOK(tif, dir->tdir_offset)) + goto bad; + if (!ReadOK(tif, cp, cc)) + goto bad; + } else { + /* Check for overflow. */ + if (dir->tdir_offset + cc < dir->tdir_offset + || dir->tdir_offset + cc < cc + || dir->tdir_offset + cc > tif->tif_size) + goto bad; + _TIFFmemcpy(cp, tif->tif_base + dir->tdir_offset, cc); + } + if (tif->tif_flags & TIFF_SWAB) { + switch (dir->tdir_type) { + case TIFF_SHORT: + case TIFF_SSHORT: + TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count); + break; + case TIFF_LONG: + case TIFF_SLONG: + case TIFF_FLOAT: + TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count); + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count); + break; + case TIFF_DOUBLE: + TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count); + break; + } + } + return (cc); +bad: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error fetching data for field \"%s\"", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); + return (tsize_t) 0; +} + +/* + * Fetch an ASCII item from the file. + */ +static tsize_t +TIFFFetchString(TIFF* tif, TIFFDirEntry* dir, char* cp) +{ + if (dir->tdir_count <= 4) { + uint32 l = dir->tdir_offset; + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabLong(&l); + _TIFFmemcpy(cp, &l, dir->tdir_count); + return (1); + } + return (TIFFFetchData(tif, dir, cp)); +} + +/* + * Convert numerator+denominator to float. + */ +static int +cvtRational(TIFF* tif, TIFFDirEntry* dir, uint32 num, uint32 denom, float* rv) +{ + if (denom == 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%s: Rational with zero denominator (num = %u)", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, num); + return (0); + } else { + if (dir->tdir_type == TIFF_RATIONAL) + *rv = ((float)num / (float)denom); + else + *rv = ((float)(int32)num / (float)(int32)denom); + return (1); + } +} + +/* + * Fetch a rational item from the file at offset off and return the value as a + * floating point number. + */ +static float +TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir) +{ + uint32 l[2]; + float v; + + return (!TIFFFetchData(tif, dir, (char *)l) || + !cvtRational(tif, dir, l[0], l[1], &v) ? 1.0f : v); +} + +/* + * Fetch a single floating point value from the offset field and return it as + * a native float. + */ +static float +TIFFFetchFloat(TIFF* tif, TIFFDirEntry* dir) +{ + float v; + int32 l = TIFFExtractData(tif, dir->tdir_type, dir->tdir_offset); + _TIFFmemcpy(&v, &l, sizeof(float)); + TIFFCvtIEEEFloatToNative(tif, 1, &v); + return (v); +} + +/* + * Fetch an array of BYTE or SBYTE values. + */ +static int +TIFFFetchByteArray(TIFF* tif, TIFFDirEntry* dir, uint8* v) +{ + if (dir->tdir_count <= 4) { + /* + * Extract data from offset field. + */ + if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { + if (dir->tdir_type == TIFF_SBYTE) + switch (dir->tdir_count) { + case 4: v[3] = dir->tdir_offset & 0xff; + case 3: v[2] = (dir->tdir_offset >> 8) & 0xff; + case 2: v[1] = (dir->tdir_offset >> 16) & 0xff; + case 1: v[0] = dir->tdir_offset >> 24; + } + else + switch (dir->tdir_count) { + case 4: v[3] = dir->tdir_offset & 0xff; + case 3: v[2] = (dir->tdir_offset >> 8) & 0xff; + case 2: v[1] = (dir->tdir_offset >> 16) & 0xff; + case 1: v[0] = dir->tdir_offset >> 24; + } + } else { + if (dir->tdir_type == TIFF_SBYTE) + switch (dir->tdir_count) { + case 4: v[3] = dir->tdir_offset >> 24; + case 3: v[2] = (dir->tdir_offset >> 16) & 0xff; + case 2: v[1] = (dir->tdir_offset >> 8) & 0xff; + case 1: v[0] = dir->tdir_offset & 0xff; + } + else + switch (dir->tdir_count) { + case 4: v[3] = dir->tdir_offset >> 24; + case 3: v[2] = (dir->tdir_offset >> 16) & 0xff; + case 2: v[1] = (dir->tdir_offset >> 8) & 0xff; + case 1: v[0] = dir->tdir_offset & 0xff; + } + } + return (1); + } else + return (TIFFFetchData(tif, dir, (char*) v) != 0); /* XXX */ +} + +/* + * Fetch an array of SHORT or SSHORT values. + */ +static int +TIFFFetchShortArray(TIFF* tif, TIFFDirEntry* dir, uint16* v) +{ + if (dir->tdir_count <= 2) { + if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { + switch (dir->tdir_count) { + case 2: v[1] = (uint16) (dir->tdir_offset & 0xffff); + case 1: v[0] = (uint16) (dir->tdir_offset >> 16); + } + } else { + switch (dir->tdir_count) { + case 2: v[1] = (uint16) (dir->tdir_offset >> 16); + case 1: v[0] = (uint16) (dir->tdir_offset & 0xffff); + } + } + return (1); + } else + return (TIFFFetchData(tif, dir, (char *)v) != 0); +} + +/* + * Fetch a pair of SHORT or BYTE values. Some tags may have either BYTE + * or SHORT type and this function works with both ones. + */ +static int +TIFFFetchShortPair(TIFF* tif, TIFFDirEntry* dir) +{ + /* + * Prevent overflowing the v stack arrays below by performing a sanity + * check on tdir_count, this should never be greater than two. + */ + if (dir->tdir_count > 2) { + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "unexpected count for field \"%s\", %u, expected 2; ignored", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, + dir->tdir_count); + return 0; + } + + switch (dir->tdir_type) { + case TIFF_BYTE: + case TIFF_SBYTE: + { + uint8 v[4]; + return TIFFFetchByteArray(tif, dir, v) + && TIFFSetField(tif, dir->tdir_tag, v[0], v[1]); + } + case TIFF_SHORT: + case TIFF_SSHORT: + { + uint16 v[2]; + return TIFFFetchShortArray(tif, dir, v) + && TIFFSetField(tif, dir->tdir_tag, v[0], v[1]); + } + default: + return 0; + } +} + +/* + * Fetch an array of LONG or SLONG values. + */ +static int +TIFFFetchLongArray(TIFF* tif, TIFFDirEntry* dir, uint32* v) +{ + if (dir->tdir_count == 1) { + v[0] = dir->tdir_offset; + return (1); + } else + return (TIFFFetchData(tif, dir, (char*) v) != 0); +} + +/* + * Fetch an array of RATIONAL or SRATIONAL values. + */ +static int +TIFFFetchRationalArray(TIFF* tif, TIFFDirEntry* dir, float* v) +{ + int ok = 0; + uint32* l; + + l = (uint32*)_TIFFCheckMalloc(tif, + dir->tdir_count, TIFFDataWidth((TIFFDataType) dir->tdir_type), + "to fetch array of rationals"); + if (l) { + if (TIFFFetchData(tif, dir, (char *)l)) { + uint32 i; + for (i = 0; i < dir->tdir_count; i++) { + ok = cvtRational(tif, dir, + l[2*i+0], l[2*i+1], &v[i]); + if (!ok) + break; + } + } + _TIFFfree((char *)l); + } + return (ok); +} + +/* + * Fetch an array of FLOAT values. + */ +static int +TIFFFetchFloatArray(TIFF* tif, TIFFDirEntry* dir, float* v) +{ + + if (dir->tdir_count == 1) { + union + { + float f; + uint32 i; + } float_union; + + float_union.i=dir->tdir_offset; + v[0]=float_union.f; + TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v); + return (1); + } else if (TIFFFetchData(tif, dir, (char*) v)) { + TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v); + return (1); + } else + return (0); +} + +/* + * Fetch an array of DOUBLE values. + */ +static int +TIFFFetchDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v) +{ + if (TIFFFetchData(tif, dir, (char*) v)) { + TIFFCvtIEEEDoubleToNative(tif, dir->tdir_count, v); + return (1); + } else + return (0); +} + +/* + * Fetch an array of ANY values. The actual values are returned as doubles + * which should be able hold all the types. Yes, there really should be an + * tany_t to avoid this potential non-portability ... Note in particular that + * we assume that the double return value vector is large enough to read in + * any fundamental type. We use that vector as a buffer to read in the base + * type vector and then convert it in place to double (from end to front of + * course). + */ +static int +TIFFFetchAnyArray(TIFF* tif, TIFFDirEntry* dir, double* v) +{ + int i; + + switch (dir->tdir_type) { + case TIFF_BYTE: + case TIFF_SBYTE: + if (!TIFFFetchByteArray(tif, dir, (uint8*) v)) + return (0); + if (dir->tdir_type == TIFF_BYTE) { + uint8* vp = (uint8*) v; + for (i = dir->tdir_count-1; i >= 0; i--) + v[i] = vp[i]; + } else { + int8* vp = (int8*) v; + for (i = dir->tdir_count-1; i >= 0; i--) + v[i] = vp[i]; + } + break; + case TIFF_SHORT: + case TIFF_SSHORT: + if (!TIFFFetchShortArray(tif, dir, (uint16*) v)) + return (0); + if (dir->tdir_type == TIFF_SHORT) { + uint16* vp = (uint16*) v; + for (i = dir->tdir_count-1; i >= 0; i--) + v[i] = vp[i]; + } else { + int16* vp = (int16*) v; + for (i = dir->tdir_count-1; i >= 0; i--) + v[i] = vp[i]; + } + break; + case TIFF_LONG: + case TIFF_SLONG: + if (!TIFFFetchLongArray(tif, dir, (uint32*) v)) + return (0); + if (dir->tdir_type == TIFF_LONG) { + uint32* vp = (uint32*) v; + for (i = dir->tdir_count-1; i >= 0; i--) + v[i] = vp[i]; + } else { + int32* vp = (int32*) v; + for (i = dir->tdir_count-1; i >= 0; i--) + v[i] = vp[i]; + } + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + if (!TIFFFetchRationalArray(tif, dir, (float*) v)) + return (0); + { float* vp = (float*) v; + for (i = dir->tdir_count-1; i >= 0; i--) + v[i] = vp[i]; + } + break; + case TIFF_FLOAT: + if (!TIFFFetchFloatArray(tif, dir, (float*) v)) + return (0); + { float* vp = (float*) v; + for (i = dir->tdir_count-1; i >= 0; i--) + v[i] = vp[i]; + } + break; + case TIFF_DOUBLE: + return (TIFFFetchDoubleArray(tif, dir, (double*) v)); + default: + /* TIFF_NOTYPE */ + /* TIFF_ASCII */ + /* TIFF_UNDEFINED */ + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "cannot read TIFF_ANY type %d for field \"%s\"", + dir->tdir_type, + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); + return (0); + } + return (1); +} + +/* + * Fetch a tag that is not handled by special case code. + */ +static int +TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp) +{ + static const char mesg[] = "to fetch tag value"; + int ok = 0; + const TIFFFieldInfo* fip = _TIFFFieldWithTag(tif, dp->tdir_tag); + + if (dp->tdir_count > 1) { /* array of values */ + char* cp = NULL; + + switch (dp->tdir_type) { + case TIFF_BYTE: + case TIFF_SBYTE: + cp = (char *)_TIFFCheckMalloc(tif, + dp->tdir_count, sizeof (uint8), mesg); + ok = cp && TIFFFetchByteArray(tif, dp, (uint8*) cp); + break; + case TIFF_SHORT: + case TIFF_SSHORT: + cp = (char *)_TIFFCheckMalloc(tif, + dp->tdir_count, sizeof (uint16), mesg); + ok = cp && TIFFFetchShortArray(tif, dp, (uint16*) cp); + break; + case TIFF_LONG: + case TIFF_SLONG: + cp = (char *)_TIFFCheckMalloc(tif, + dp->tdir_count, sizeof (uint32), mesg); + ok = cp && TIFFFetchLongArray(tif, dp, (uint32*) cp); + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + cp = (char *)_TIFFCheckMalloc(tif, + dp->tdir_count, sizeof (float), mesg); + ok = cp && TIFFFetchRationalArray(tif, dp, (float*) cp); + break; + case TIFF_FLOAT: + cp = (char *)_TIFFCheckMalloc(tif, + dp->tdir_count, sizeof (float), mesg); + ok = cp && TIFFFetchFloatArray(tif, dp, (float*) cp); + break; + case TIFF_DOUBLE: + cp = (char *)_TIFFCheckMalloc(tif, + dp->tdir_count, sizeof (double), mesg); + ok = cp && TIFFFetchDoubleArray(tif, dp, (double*) cp); + break; + case TIFF_ASCII: + case TIFF_UNDEFINED: /* bit of a cheat... */ + /* + * Some vendors write strings w/o the trailing + * NULL byte, so always append one just in case. + */ + cp = (char *)_TIFFCheckMalloc(tif, dp->tdir_count + 1, + 1, mesg); + if( (ok = (cp && TIFFFetchString(tif, dp, cp))) != 0 ) + cp[dp->tdir_count] = '\0'; /* XXX */ + break; + } + if (ok) { + ok = (fip->field_passcount ? + TIFFSetField(tif, dp->tdir_tag, dp->tdir_count, cp) + : TIFFSetField(tif, dp->tdir_tag, cp)); + } + if (cp != NULL) + _TIFFfree(cp); + } else if (CheckDirCount(tif, dp, 1)) { /* singleton value */ + switch (dp->tdir_type) { + case TIFF_BYTE: + case TIFF_SBYTE: + case TIFF_SHORT: + case TIFF_SSHORT: + /* + * If the tag is also acceptable as a LONG or SLONG + * then TIFFSetField will expect an uint32 parameter + * passed to it (through varargs). Thus, for machines + * where sizeof (int) != sizeof (uint32) we must do + * a careful check here. It's hard to say if this + * is worth optimizing. + * + * NB: We use TIFFFieldWithTag here knowing that + * it returns us the first entry in the table + * for the tag and that that entry is for the + * widest potential data type the tag may have. + */ + { TIFFDataType type = fip->field_type; + if (type != TIFF_LONG && type != TIFF_SLONG) { + uint16 v = (uint16) + TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset); + ok = (fip->field_passcount ? + TIFFSetField(tif, dp->tdir_tag, 1, &v) + : TIFFSetField(tif, dp->tdir_tag, v)); + break; + } + } + /* fall thru... */ + case TIFF_LONG: + case TIFF_SLONG: + { uint32 v32 = + TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset); + ok = (fip->field_passcount ? + TIFFSetField(tif, dp->tdir_tag, 1, &v32) + : TIFFSetField(tif, dp->tdir_tag, v32)); + } + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + case TIFF_FLOAT: + { float v = (dp->tdir_type == TIFF_FLOAT ? + TIFFFetchFloat(tif, dp) + : TIFFFetchRational(tif, dp)); + ok = (fip->field_passcount ? + TIFFSetField(tif, dp->tdir_tag, 1, &v) + : TIFFSetField(tif, dp->tdir_tag, v)); + } + break; + case TIFF_DOUBLE: + { double v; + ok = (TIFFFetchDoubleArray(tif, dp, &v) && + (fip->field_passcount ? + TIFFSetField(tif, dp->tdir_tag, 1, &v) + : TIFFSetField(tif, dp->tdir_tag, v)) + ); + } + break; + case TIFF_ASCII: + case TIFF_UNDEFINED: /* bit of a cheat... */ + { char c[2]; + if( (ok = (TIFFFetchString(tif, dp, c) != 0)) != 0 ) { + c[1] = '\0'; /* XXX paranoid */ + ok = (fip->field_passcount ? + TIFFSetField(tif, dp->tdir_tag, 1, c) + : TIFFSetField(tif, dp->tdir_tag, c)); + } + } + break; + } + } + return (ok); +} + +#define NITEMS(x) (sizeof (x) / sizeof (x[0])) +/* + * Fetch samples/pixel short values for + * the specified tag and verify that + * all values are the same. + */ +static int +TIFFFetchPerSampleShorts(TIFF* tif, TIFFDirEntry* dir, uint16* pl) +{ + uint16 samples = tif->tif_dir.td_samplesperpixel; + int status = 0; + + if (CheckDirCount(tif, dir, (uint32) samples)) { + uint16 buf[10]; + uint16* v = buf; + + if (dir->tdir_count > NITEMS(buf)) + v = (uint16*) _TIFFCheckMalloc(tif, dir->tdir_count, sizeof(uint16), + "to fetch per-sample values"); + if (v && TIFFFetchShortArray(tif, dir, v)) { + uint16 i; + int check_count = dir->tdir_count; + if( samples < check_count ) + check_count = samples; + + for (i = 1; i < check_count; i++) + if (v[i] != v[0]) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Cannot handle different per-sample values for field \"%s\"", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); + goto bad; + } + *pl = v[0]; + status = 1; + } + bad: + if (v && v != buf) + _TIFFfree(v); + } + return (status); +} + +/* + * Fetch samples/pixel long values for + * the specified tag and verify that + * all values are the same. + */ +static int +TIFFFetchPerSampleLongs(TIFF* tif, TIFFDirEntry* dir, uint32* pl) +{ + uint16 samples = tif->tif_dir.td_samplesperpixel; + int status = 0; + + if (CheckDirCount(tif, dir, (uint32) samples)) { + uint32 buf[10]; + uint32* v = buf; + + if (dir->tdir_count > NITEMS(buf)) + v = (uint32*) _TIFFCheckMalloc(tif, dir->tdir_count, sizeof(uint32), + "to fetch per-sample values"); + if (v && TIFFFetchLongArray(tif, dir, v)) { + uint16 i; + int check_count = dir->tdir_count; + + if( samples < check_count ) + check_count = samples; + for (i = 1; i < check_count; i++) + if (v[i] != v[0]) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Cannot handle different per-sample values for field \"%s\"", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); + goto bad; + } + *pl = v[0]; + status = 1; + } + bad: + if (v && v != buf) + _TIFFfree(v); + } + return (status); +} + +/* + * Fetch samples/pixel ANY values for the specified tag and verify that all + * values are the same. + */ +static int +TIFFFetchPerSampleAnys(TIFF* tif, TIFFDirEntry* dir, double* pl) +{ + uint16 samples = tif->tif_dir.td_samplesperpixel; + int status = 0; + + if (CheckDirCount(tif, dir, (uint32) samples)) { + double buf[10]; + double* v = buf; + + if (dir->tdir_count > NITEMS(buf)) + v = (double*) _TIFFCheckMalloc(tif, dir->tdir_count, sizeof (double), + "to fetch per-sample values"); + if (v && TIFFFetchAnyArray(tif, dir, v)) { + uint16 i; + int check_count = dir->tdir_count; + if( samples < check_count ) + check_count = samples; + + for (i = 1; i < check_count; i++) + if (v[i] != v[0]) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Cannot handle different per-sample values for field \"%s\"", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); + goto bad; + } + *pl = v[0]; + status = 1; + } + bad: + if (v && v != buf) + _TIFFfree(v); + } + return (status); +} +#undef NITEMS + +/* + * Fetch a set of offsets or lengths. + * While this routine says "strips", in fact it's also used for tiles. + */ +static int +TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, long nstrips, uint32** lpp) +{ + register uint32* lp; + int status; + + CheckDirCount(tif, dir, (uint32) nstrips); + + /* + * Allocate space for strip information. + */ + if (*lpp == NULL && + (*lpp = (uint32 *)_TIFFCheckMalloc(tif, + nstrips, sizeof (uint32), "for strip array")) == NULL) + return (0); + lp = *lpp; + _TIFFmemset( lp, 0, sizeof(uint32) * nstrips ); + + if (dir->tdir_type == (int)TIFF_SHORT) { + /* + * Handle uint16->uint32 expansion. + */ + uint16* dp = (uint16*) _TIFFCheckMalloc(tif, + dir->tdir_count, sizeof (uint16), "to fetch strip tag"); + if (dp == NULL) + return (0); + if( (status = TIFFFetchShortArray(tif, dir, dp)) != 0 ) { + int i; + + for( i = 0; i < nstrips && i < (int) dir->tdir_count; i++ ) + { + lp[i] = dp[i]; + } + } + _TIFFfree((char*) dp); + + } else if( nstrips != (int) dir->tdir_count ) { + /* Special case to correct length */ + + uint32* dp = (uint32*) _TIFFCheckMalloc(tif, + dir->tdir_count, sizeof (uint32), "to fetch strip tag"); + if (dp == NULL) + return (0); + + status = TIFFFetchLongArray(tif, dir, dp); + if( status != 0 ) { + int i; + + for( i = 0; i < nstrips && i < (int) dir->tdir_count; i++ ) + { + lp[i] = dp[i]; + } + } + + _TIFFfree( (char *) dp ); + } else + status = TIFFFetchLongArray(tif, dir, lp); + + return (status); +} + +/* + * Fetch and set the RefBlackWhite tag. + */ +static int +TIFFFetchRefBlackWhite(TIFF* tif, TIFFDirEntry* dir) +{ + static const char mesg[] = "for \"ReferenceBlackWhite\" array"; + char* cp; + int ok; + + if (dir->tdir_type == TIFF_RATIONAL) + return (TIFFFetchNormalTag(tif, dir)); + /* + * Handle LONG's for backward compatibility. + */ + cp = (char *)_TIFFCheckMalloc(tif, dir->tdir_count, + sizeof (uint32), mesg); + if( (ok = (cp && TIFFFetchLongArray(tif, dir, (uint32*) cp))) != 0) { + float* fp = (float*) + _TIFFCheckMalloc(tif, dir->tdir_count, sizeof (float), mesg); + if( (ok = (fp != NULL)) != 0 ) { + uint32 i; + for (i = 0; i < dir->tdir_count; i++) + fp[i] = (float)((uint32*) cp)[i]; + ok = TIFFSetField(tif, dir->tdir_tag, fp); + _TIFFfree((char*) fp); + } + } + if (cp) + _TIFFfree(cp); + return (ok); +} + +/* + * Fetch and set the SubjectDistance EXIF tag. + */ +static int +TIFFFetchSubjectDistance(TIFF* tif, TIFFDirEntry* dir) +{ + uint32 l[2]; + float v; + int ok = 0; + + if (TIFFFetchData(tif, dir, (char *)l) + && cvtRational(tif, dir, l[0], l[1], &v)) { + /* + * XXX: Numerator 0xFFFFFFFF means that we have infinite + * distance. Indicate that with a negative floating point + * SubjectDistance value. + */ + ok = TIFFSetField(tif, dir->tdir_tag, + (l[0] != 0xFFFFFFFF) ? v : -v); + } + + return ok; +} + +/* + * Replace a single strip (tile) of uncompressed data by multiple strips + * (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for + * dealing with large images or for dealing with machines with a limited + * amount memory. + */ +static void +ChopUpSingleUncompressedStrip(TIFF* tif) +{ + register TIFFDirectory *td = &tif->tif_dir; + uint32 bytecount = td->td_stripbytecount[0]; + uint32 offset = td->td_stripoffset[0]; + tsize_t rowbytes = TIFFVTileSize(tif, 1), stripbytes; + tstrip_t strip, nstrips, rowsperstrip; + uint32* newcounts; + uint32* newoffsets; + + /* + * Make the rows hold at least one scanline, but fill specified amount + * of data if possible. + */ + if (rowbytes > STRIP_SIZE_DEFAULT) { + stripbytes = rowbytes; + rowsperstrip = 1; + } else if (rowbytes > 0 ) { + rowsperstrip = STRIP_SIZE_DEFAULT / rowbytes; + stripbytes = rowbytes * rowsperstrip; + } + else + return; + + /* + * never increase the number of strips in an image + */ + if (rowsperstrip >= td->td_rowsperstrip) + return; + nstrips = (tstrip_t) TIFFhowmany(bytecount, stripbytes); + if( nstrips == 0 ) /* something is wonky, do nothing. */ + return; + + newcounts = (uint32*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint32), + "for chopped \"StripByteCounts\" array"); + newoffsets = (uint32*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint32), + "for chopped \"StripOffsets\" array"); + if (newcounts == NULL || newoffsets == NULL) { + /* + * Unable to allocate new strip information, give up and use + * the original one strip information. + */ + if (newcounts != NULL) + _TIFFfree(newcounts); + if (newoffsets != NULL) + _TIFFfree(newoffsets); + return; + } + /* + * Fill the strip information arrays with new bytecounts and offsets + * that reflect the broken-up format. + */ + for (strip = 0; strip < nstrips; strip++) { + if ((uint32)stripbytes > bytecount) + stripbytes = bytecount; + newcounts[strip] = stripbytes; + newoffsets[strip] = offset; + offset += stripbytes; + bytecount -= stripbytes; + } + /* + * Replace old single strip info with multi-strip info. + */ + td->td_stripsperimage = td->td_nstrips = nstrips; + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip); + + _TIFFfree(td->td_stripbytecount); + _TIFFfree(td->td_stripoffset); + td->td_stripbytecount = newcounts; + td->td_stripoffset = newoffsets; + td->td_stripbytecountsorted = 1; +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_dirwrite.c b/src/3rdparty/libtiff/libtiff/tif_dirwrite.c new file mode 100644 index 0000000000..5148097dc3 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_dirwrite.c @@ -0,0 +1,1407 @@ +/* $Id: tif_dirwrite.c,v 1.37.2.6 2009-10-31 21:51:08 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Directory Write Support Routines. + */ +#include "tiffiop.h" + +#ifdef HAVE_IEEEFP +# define TIFFCvtNativeToIEEEFloat(tif, n, fp) +# define TIFFCvtNativeToIEEEDouble(tif, n, dp) +#else +extern void TIFFCvtNativeToIEEEFloat(TIFF*, uint32, float*); +extern void TIFFCvtNativeToIEEEDouble(TIFF*, uint32, double*); +#endif + +static int TIFFWriteNormalTag(TIFF*, TIFFDirEntry*, const TIFFFieldInfo*); +static void TIFFSetupShortLong(TIFF*, ttag_t, TIFFDirEntry*, uint32); +static void TIFFSetupShort(TIFF*, ttag_t, TIFFDirEntry*, uint16); +static int TIFFSetupShortPair(TIFF*, ttag_t, TIFFDirEntry*); +static int TIFFWritePerSampleShorts(TIFF*, ttag_t, TIFFDirEntry*); +static int TIFFWritePerSampleAnys(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*); +static int TIFFWriteShortTable(TIFF*, ttag_t, TIFFDirEntry*, uint32, uint16**); +static int TIFFWriteShortArray(TIFF*, TIFFDirEntry*, uint16*); +static int TIFFWriteLongArray(TIFF *, TIFFDirEntry*, uint32*); +static int TIFFWriteRationalArray(TIFF *, TIFFDirEntry*, float*); +static int TIFFWriteFloatArray(TIFF *, TIFFDirEntry*, float*); +static int TIFFWriteDoubleArray(TIFF *, TIFFDirEntry*, double*); +static int TIFFWriteByteArray(TIFF*, TIFFDirEntry*, char*); +static int TIFFWriteAnyArray(TIFF*, + TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*); +static int TIFFWriteTransferFunction(TIFF*, TIFFDirEntry*); +static int TIFFWriteInkNames(TIFF*, TIFFDirEntry*); +static int TIFFWriteData(TIFF*, TIFFDirEntry*, char*); +static int TIFFLinkDirectory(TIFF*); + +#define WriteRationalPair(type, tag1, v1, tag2, v2) { \ + TIFFWriteRational((tif), (type), (tag1), (dir), (v1)) \ + TIFFWriteRational((tif), (type), (tag2), (dir)+1, (v2)) \ + (dir)++; \ +} +#define TIFFWriteRational(tif, type, tag, dir, v) \ + (dir)->tdir_tag = (tag); \ + (dir)->tdir_type = (type); \ + (dir)->tdir_count = 1; \ + if (!TIFFWriteRationalArray((tif), (dir), &(v))) \ + goto bad; + +/* + * Write the contents of the current directory + * to the specified file. This routine doesn't + * handle overwriting a directory with auxiliary + * storage that's been changed. + */ +static int +_TIFFWriteDirectory(TIFF* tif, int done) +{ + uint16 dircount; + toff_t diroff; + ttag_t tag; + uint32 nfields; + tsize_t dirsize; + char* data; + TIFFDirEntry* dir; + TIFFDirectory* td; + unsigned long b, fields[FIELD_SETLONGS]; + int fi, nfi; + + if (tif->tif_mode == O_RDONLY) + return (1); + /* + * Clear write state so that subsequent images with + * different characteristics get the right buffers + * setup for them. + */ + if (done) + { + if (tif->tif_flags & TIFF_POSTENCODE) { + tif->tif_flags &= ~TIFF_POSTENCODE; + if (!(*tif->tif_postencode)(tif)) { + TIFFErrorExt(tif->tif_clientdata, + tif->tif_name, + "Error post-encoding before directory write"); + return (0); + } + } + (*tif->tif_close)(tif); /* shutdown encoder */ + /* + * Flush any data that might have been written + * by the compression close+cleanup routines. + */ + if (tif->tif_rawcc > 0 + && (tif->tif_flags & TIFF_BEENWRITING) != 0 + && !TIFFFlushData1(tif)) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error flushing data before directory write"); + return (0); + } + if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { + _TIFFfree(tif->tif_rawdata); + tif->tif_rawdata = NULL; + tif->tif_rawcc = 0; + tif->tif_rawdatasize = 0; + } + tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP); + } + + td = &tif->tif_dir; + /* + * Size the directory so that we can calculate + * offsets for the data items that aren't kept + * in-place in each field. + */ + nfields = 0; + for (b = 0; b <= FIELD_LAST; b++) + if (TIFFFieldSet(tif, b) && b != FIELD_CUSTOM) + nfields += (b < FIELD_SUBFILETYPE ? 2 : 1); + nfields += td->td_customValueCount; + dirsize = nfields * sizeof (TIFFDirEntry); + data = (char*) _TIFFmalloc(dirsize); + if (data == NULL) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Cannot write directory, out of space"); + return (0); + } + /* + * Directory hasn't been placed yet, put + * it at the end of the file and link it + * into the existing directory structure. + */ + if (tif->tif_diroff == 0 && !TIFFLinkDirectory(tif)) + goto bad; + tif->tif_dataoff = (toff_t)( + tif->tif_diroff + sizeof (uint16) + dirsize + sizeof (toff_t)); + if (tif->tif_dataoff & 1) + tif->tif_dataoff++; + (void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET); + tif->tif_curdir++; + dir = (TIFFDirEntry*) data; + /* + * Setup external form of directory + * entries and write data items. + */ + _TIFFmemcpy(fields, td->td_fieldsset, sizeof (fields)); + /* + * Write out ExtraSamples tag only if + * extra samples are present in the data. + */ + if (FieldSet(fields, FIELD_EXTRASAMPLES) && !td->td_extrasamples) { + ResetFieldBit(fields, FIELD_EXTRASAMPLES); + nfields--; + dirsize -= sizeof (TIFFDirEntry); + } /*XXX*/ + for (fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) { + const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi]; + + /* + * For custom fields, we test to see if the custom field + * is set or not. For normal fields, we just use the + * FieldSet test. + */ + if( fip->field_bit == FIELD_CUSTOM ) + { + int ci, is_set = FALSE; + + for( ci = 0; ci < td->td_customValueCount; ci++ ) + is_set |= (td->td_customValues[ci].info == fip); + + if( !is_set ) + continue; + } + else if (!FieldSet(fields, fip->field_bit)) + continue; + + /* + * Handle other fields. + */ + switch (fip->field_bit) + { + case FIELD_STRIPOFFSETS: + /* + * We use one field bit for both strip and tile + + * offsets, and so must be careful in selecting + * the appropriate field descriptor (so that tags + * are written in sorted order). + */ + tag = isTiled(tif) ? + TIFFTAG_TILEOFFSETS : TIFFTAG_STRIPOFFSETS; + if (tag != fip->field_tag) + continue; + + dir->tdir_tag = (uint16) tag; + dir->tdir_type = (uint16) TIFF_LONG; + dir->tdir_count = (uint32) td->td_nstrips; + if (!TIFFWriteLongArray(tif, dir, td->td_stripoffset)) + goto bad; + break; + case FIELD_STRIPBYTECOUNTS: + /* + * We use one field bit for both strip and tile + * byte counts, and so must be careful in selecting + * the appropriate field descriptor (so that tags + * are written in sorted order). + */ + tag = isTiled(tif) ? + TIFFTAG_TILEBYTECOUNTS : TIFFTAG_STRIPBYTECOUNTS; + if (tag != fip->field_tag) + continue; + + dir->tdir_tag = (uint16) tag; + dir->tdir_type = (uint16) TIFF_LONG; + dir->tdir_count = (uint32) td->td_nstrips; + if (!TIFFWriteLongArray(tif, dir, td->td_stripbytecount)) + goto bad; + break; + case FIELD_ROWSPERSTRIP: + TIFFSetupShortLong(tif, TIFFTAG_ROWSPERSTRIP, + dir, td->td_rowsperstrip); + break; + case FIELD_COLORMAP: + if (!TIFFWriteShortTable(tif, TIFFTAG_COLORMAP, dir, + 3, td->td_colormap)) + goto bad; + break; + case FIELD_IMAGEDIMENSIONS: + TIFFSetupShortLong(tif, TIFFTAG_IMAGEWIDTH, + dir++, td->td_imagewidth); + TIFFSetupShortLong(tif, TIFFTAG_IMAGELENGTH, + dir, td->td_imagelength); + break; + case FIELD_TILEDIMENSIONS: + TIFFSetupShortLong(tif, TIFFTAG_TILEWIDTH, + dir++, td->td_tilewidth); + TIFFSetupShortLong(tif, TIFFTAG_TILELENGTH, + dir, td->td_tilelength); + break; + case FIELD_COMPRESSION: + TIFFSetupShort(tif, TIFFTAG_COMPRESSION, + dir, td->td_compression); + break; + case FIELD_PHOTOMETRIC: + TIFFSetupShort(tif, TIFFTAG_PHOTOMETRIC, + dir, td->td_photometric); + break; + case FIELD_POSITION: + WriteRationalPair(TIFF_RATIONAL, + TIFFTAG_XPOSITION, td->td_xposition, + TIFFTAG_YPOSITION, td->td_yposition); + break; + case FIELD_RESOLUTION: + WriteRationalPair(TIFF_RATIONAL, + TIFFTAG_XRESOLUTION, td->td_xresolution, + TIFFTAG_YRESOLUTION, td->td_yresolution); + break; + case FIELD_BITSPERSAMPLE: + case FIELD_MINSAMPLEVALUE: + case FIELD_MAXSAMPLEVALUE: + case FIELD_SAMPLEFORMAT: + if (!TIFFWritePerSampleShorts(tif, fip->field_tag, dir)) + goto bad; + break; + case FIELD_SMINSAMPLEVALUE: + case FIELD_SMAXSAMPLEVALUE: + if (!TIFFWritePerSampleAnys(tif, + _TIFFSampleToTagType(tif), fip->field_tag, dir)) + goto bad; + break; + case FIELD_PAGENUMBER: + case FIELD_HALFTONEHINTS: + case FIELD_YCBCRSUBSAMPLING: + if (!TIFFSetupShortPair(tif, fip->field_tag, dir)) + goto bad; + break; + case FIELD_INKNAMES: + if (!TIFFWriteInkNames(tif, dir)) + goto bad; + break; + case FIELD_TRANSFERFUNCTION: + if (!TIFFWriteTransferFunction(tif, dir)) + goto bad; + break; + case FIELD_SUBIFD: + /* + * XXX: Always write this field using LONG type + * for backward compatibility. + */ + dir->tdir_tag = (uint16) fip->field_tag; + dir->tdir_type = (uint16) TIFF_LONG; + dir->tdir_count = (uint32) td->td_nsubifd; + if (!TIFFWriteLongArray(tif, dir, td->td_subifd)) + goto bad; + /* + * Total hack: if this directory includes a SubIFD + * tag then force the next directories to be + * written as ``sub directories'' of this one. This + * is used to write things like thumbnails and + * image masks that one wants to keep out of the + * normal directory linkage access mechanism. + */ + if (dir->tdir_count > 0) { + tif->tif_flags |= TIFF_INSUBIFD; + tif->tif_nsubifd = (uint16) dir->tdir_count; + if (dir->tdir_count > 1) + tif->tif_subifdoff = dir->tdir_offset; + else + tif->tif_subifdoff = (uint32)( + tif->tif_diroff + + sizeof (uint16) + + ((char*)&dir->tdir_offset-data)); + } + break; + default: + /* XXX: Should be fixed and removed. */ + if (fip->field_tag == TIFFTAG_DOTRANGE) { + if (!TIFFSetupShortPair(tif, fip->field_tag, dir)) + goto bad; + } + else if (!TIFFWriteNormalTag(tif, dir, fip)) + goto bad; + break; + } + dir++; + + if( fip->field_bit != FIELD_CUSTOM ) + ResetFieldBit(fields, fip->field_bit); + } + + /* + * Write directory. + */ + dircount = (uint16) nfields; + diroff = (uint32) tif->tif_nextdiroff; + if (tif->tif_flags & TIFF_SWAB) { + /* + * The file's byte order is opposite to the + * native machine architecture. We overwrite + * the directory information with impunity + * because it'll be released below after we + * write it to the file. Note that all the + * other tag construction routines assume that + * we do this byte-swapping; i.e. they only + * byte-swap indirect data. + */ + for (dir = (TIFFDirEntry*) data; dircount; dir++, dircount--) { + TIFFSwabArrayOfShort(&dir->tdir_tag, 2); + TIFFSwabArrayOfLong(&dir->tdir_count, 2); + } + dircount = (uint16) nfields; + TIFFSwabShort(&dircount); + TIFFSwabLong(&diroff); + } + (void) TIFFSeekFile(tif, tif->tif_diroff, SEEK_SET); + if (!WriteOK(tif, &dircount, sizeof (dircount))) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error writing directory count"); + goto bad; + } + if (!WriteOK(tif, data, dirsize)) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error writing directory contents"); + goto bad; + } + if (!WriteOK(tif, &diroff, sizeof (uint32))) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error writing directory link"); + goto bad; + } + if (done) { + TIFFFreeDirectory(tif); + tif->tif_flags &= ~TIFF_DIRTYDIRECT; + (*tif->tif_cleanup)(tif); + + /* + * Reset directory-related state for subsequent + * directories. + */ + TIFFCreateDirectory(tif); + } + _TIFFfree(data); + return (1); +bad: + _TIFFfree(data); + return (0); +} +#undef WriteRationalPair + +int +TIFFWriteDirectory(TIFF* tif) +{ + return _TIFFWriteDirectory(tif, TRUE); +} + +/* + * Similar to TIFFWriteDirectory(), writes the directory out + * but leaves all data structures in memory so that it can be + * written again. This will make a partially written TIFF file + * readable before it is successfully completed/closed. + */ +int +TIFFCheckpointDirectory(TIFF* tif) +{ + int rc; + /* Setup the strips arrays, if they haven't already been. */ + if (tif->tif_dir.td_stripoffset == NULL) + (void) TIFFSetupStrips(tif); + rc = _TIFFWriteDirectory(tif, FALSE); + (void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END)); + return rc; +} + +static int +_TIFFWriteCustomDirectory(TIFF* tif, toff_t *pdiroff) +{ + uint16 dircount; + uint32 nfields; + tsize_t dirsize; + char* data; + TIFFDirEntry* dir; + TIFFDirectory* td; + unsigned long b, fields[FIELD_SETLONGS]; + int fi, nfi; + + if (tif->tif_mode == O_RDONLY) + return (1); + + td = &tif->tif_dir; + /* + * Size the directory so that we can calculate + * offsets for the data items that aren't kept + * in-place in each field. + */ + nfields = 0; + for (b = 0; b <= FIELD_LAST; b++) + if (TIFFFieldSet(tif, b) && b != FIELD_CUSTOM) + nfields += (b < FIELD_SUBFILETYPE ? 2 : 1); + nfields += td->td_customValueCount; + dirsize = nfields * sizeof (TIFFDirEntry); + data = (char*) _TIFFmalloc(dirsize); + if (data == NULL) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Cannot write directory, out of space"); + return (0); + } + /* + * Put the directory at the end of the file. + */ + tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1; + tif->tif_dataoff = (toff_t)( + tif->tif_diroff + sizeof (uint16) + dirsize + sizeof (toff_t)); + if (tif->tif_dataoff & 1) + tif->tif_dataoff++; + (void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET); + dir = (TIFFDirEntry*) data; + /* + * Setup external form of directory + * entries and write data items. + */ + _TIFFmemcpy(fields, td->td_fieldsset, sizeof (fields)); + + for (fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) { + const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi]; + + /* + * For custom fields, we test to see if the custom field + * is set or not. For normal fields, we just use the + * FieldSet test. + */ + if( fip->field_bit == FIELD_CUSTOM ) + { + int ci, is_set = FALSE; + + for( ci = 0; ci < td->td_customValueCount; ci++ ) + is_set |= (td->td_customValues[ci].info == fip); + + if( !is_set ) + continue; + } + else if (!FieldSet(fields, fip->field_bit)) + continue; + + if( fip->field_bit != FIELD_CUSTOM ) + ResetFieldBit(fields, fip->field_bit); + } + + /* + * Write directory. + */ + dircount = (uint16) nfields; + *pdiroff = (uint32) tif->tif_nextdiroff; + if (tif->tif_flags & TIFF_SWAB) { + /* + * The file's byte order is opposite to the + * native machine architecture. We overwrite + * the directory information with impunity + * because it'll be released below after we + * write it to the file. Note that all the + * other tag construction routines assume that + * we do this byte-swapping; i.e. they only + * byte-swap indirect data. + */ + for (dir = (TIFFDirEntry*) data; dircount; dir++, dircount--) { + TIFFSwabArrayOfShort(&dir->tdir_tag, 2); + TIFFSwabArrayOfLong(&dir->tdir_count, 2); + } + dircount = (uint16) nfields; + TIFFSwabShort(&dircount); + TIFFSwabLong(pdiroff); + } + (void) TIFFSeekFile(tif, tif->tif_diroff, SEEK_SET); + if (!WriteOK(tif, &dircount, sizeof (dircount))) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error writing directory count"); + goto bad; + } + if (!WriteOK(tif, data, dirsize)) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error writing directory contents"); + goto bad; + } + if (!WriteOK(tif, pdiroff, sizeof (uint32))) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error writing directory link"); + goto bad; + } + _TIFFfree(data); + return (1); +bad: + _TIFFfree(data); + return (0); +} + +int +TIFFWriteCustomDirectory(TIFF* tif, toff_t *pdiroff) +{ + return _TIFFWriteCustomDirectory(tif, pdiroff); +} + +/* + * Process tags that are not special cased. + */ +static int +TIFFWriteNormalTag(TIFF* tif, TIFFDirEntry* dir, const TIFFFieldInfo* fip) +{ + uint16 wc = (uint16) fip->field_writecount; + uint32 wc2; + + dir->tdir_tag = (uint16) fip->field_tag; + dir->tdir_type = (uint16) fip->field_type; + dir->tdir_count = wc; + + switch (fip->field_type) { + case TIFF_SHORT: + case TIFF_SSHORT: + if (fip->field_passcount) { + uint16* wp; + if (wc == (uint16) TIFF_VARIABLE2) { + TIFFGetField(tif, fip->field_tag, &wc2, &wp); + dir->tdir_count = wc2; + } else { /* Assume TIFF_VARIABLE */ + TIFFGetField(tif, fip->field_tag, &wc, &wp); + dir->tdir_count = wc; + } + if (!TIFFWriteShortArray(tif, dir, wp)) + return 0; + } else { + if (wc == 1) { + uint16 sv; + TIFFGetField(tif, fip->field_tag, &sv); + dir->tdir_offset = + TIFFInsertData(tif, dir->tdir_type, sv); + } else { + uint16* wp; + TIFFGetField(tif, fip->field_tag, &wp); + if (!TIFFWriteShortArray(tif, dir, wp)) + return 0; + } + } + break; + case TIFF_LONG: + case TIFF_SLONG: + case TIFF_IFD: + if (fip->field_passcount) { + uint32* lp; + if (wc == (uint16) TIFF_VARIABLE2) { + TIFFGetField(tif, fip->field_tag, &wc2, &lp); + dir->tdir_count = wc2; + } else { /* Assume TIFF_VARIABLE */ + TIFFGetField(tif, fip->field_tag, &wc, &lp); + dir->tdir_count = wc; + } + if (!TIFFWriteLongArray(tif, dir, lp)) + return 0; + } else { + if (wc == 1) { + /* XXX handle LONG->SHORT conversion */ + TIFFGetField(tif, fip->field_tag, + &dir->tdir_offset); + } else { + uint32* lp; + TIFFGetField(tif, fip->field_tag, &lp); + if (!TIFFWriteLongArray(tif, dir, lp)) + return 0; + } + } + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + if (fip->field_passcount) { + float* fp; + if (wc == (uint16) TIFF_VARIABLE2) { + TIFFGetField(tif, fip->field_tag, &wc2, &fp); + dir->tdir_count = wc2; + } else { /* Assume TIFF_VARIABLE */ + TIFFGetField(tif, fip->field_tag, &wc, &fp); + dir->tdir_count = wc; + } + if (!TIFFWriteRationalArray(tif, dir, fp)) + return 0; + } else { + if (wc == 1) { + float fv; + TIFFGetField(tif, fip->field_tag, &fv); + if (!TIFFWriteRationalArray(tif, dir, &fv)) + return 0; + } else { + float* fp; + TIFFGetField(tif, fip->field_tag, &fp); + if (!TIFFWriteRationalArray(tif, dir, fp)) + return 0; + } + } + break; + case TIFF_FLOAT: + if (fip->field_passcount) { + float* fp; + if (wc == (uint16) TIFF_VARIABLE2) { + TIFFGetField(tif, fip->field_tag, &wc2, &fp); + dir->tdir_count = wc2; + } else { /* Assume TIFF_VARIABLE */ + TIFFGetField(tif, fip->field_tag, &wc, &fp); + dir->tdir_count = wc; + } + if (!TIFFWriteFloatArray(tif, dir, fp)) + return 0; + } else { + if (wc == 1) { + float fv; + TIFFGetField(tif, fip->field_tag, &fv); + if (!TIFFWriteFloatArray(tif, dir, &fv)) + return 0; + } else { + float* fp; + TIFFGetField(tif, fip->field_tag, &fp); + if (!TIFFWriteFloatArray(tif, dir, fp)) + return 0; + } + } + break; + case TIFF_DOUBLE: + if (fip->field_passcount) { + double* dp; + if (wc == (uint16) TIFF_VARIABLE2) { + TIFFGetField(tif, fip->field_tag, &wc2, &dp); + dir->tdir_count = wc2; + } else { /* Assume TIFF_VARIABLE */ + TIFFGetField(tif, fip->field_tag, &wc, &dp); + dir->tdir_count = wc; + } + if (!TIFFWriteDoubleArray(tif, dir, dp)) + return 0; + } else { + if (wc == 1) { + double dv; + TIFFGetField(tif, fip->field_tag, &dv); + if (!TIFFWriteDoubleArray(tif, dir, &dv)) + return 0; + } else { + double* dp; + TIFFGetField(tif, fip->field_tag, &dp); + if (!TIFFWriteDoubleArray(tif, dir, dp)) + return 0; + } + } + break; + case TIFF_ASCII: + { + char* cp; + if (fip->field_passcount) + { + if( wc == (uint16) TIFF_VARIABLE2 ) + TIFFGetField(tif, fip->field_tag, &wc2, &cp); + else + TIFFGetField(tif, fip->field_tag, &wc, &cp); + } + else + TIFFGetField(tif, fip->field_tag, &cp); + + dir->tdir_count = (uint32) (strlen(cp) + 1); + if (!TIFFWriteByteArray(tif, dir, cp)) + return (0); + } + break; + + case TIFF_BYTE: + case TIFF_SBYTE: + if (fip->field_passcount) { + char* cp; + if (wc == (uint16) TIFF_VARIABLE2) { + TIFFGetField(tif, fip->field_tag, &wc2, &cp); + dir->tdir_count = wc2; + } else { /* Assume TIFF_VARIABLE */ + TIFFGetField(tif, fip->field_tag, &wc, &cp); + dir->tdir_count = wc; + } + if (!TIFFWriteByteArray(tif, dir, cp)) + return 0; + } else { + if (wc == 1) { + char cv; + TIFFGetField(tif, fip->field_tag, &cv); + if (!TIFFWriteByteArray(tif, dir, &cv)) + return 0; + } else { + char* cp; + TIFFGetField(tif, fip->field_tag, &cp); + if (!TIFFWriteByteArray(tif, dir, cp)) + return 0; + } + } + break; + + case TIFF_UNDEFINED: + { char* cp; + if (wc == (unsigned short) TIFF_VARIABLE) { + TIFFGetField(tif, fip->field_tag, &wc, &cp); + dir->tdir_count = wc; + } else if (wc == (unsigned short) TIFF_VARIABLE2) { + TIFFGetField(tif, fip->field_tag, &wc2, &cp); + dir->tdir_count = wc2; + } else + TIFFGetField(tif, fip->field_tag, &cp); + if (!TIFFWriteByteArray(tif, dir, cp)) + return (0); + } + break; + + case TIFF_NOTYPE: + break; + } + return (1); +} + +/* + * Setup a directory entry with either a SHORT + * or LONG type according to the value. + */ +static void +TIFFSetupShortLong(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint32 v) +{ + dir->tdir_tag = (uint16) tag; + dir->tdir_count = 1; + if (v > 0xffffL) { + dir->tdir_type = (short) TIFF_LONG; + dir->tdir_offset = v; + } else { + dir->tdir_type = (short) TIFF_SHORT; + dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v); + } +} + +/* + * Setup a SHORT directory entry + */ +static void +TIFFSetupShort(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint16 v) +{ + dir->tdir_tag = (uint16) tag; + dir->tdir_count = 1; + dir->tdir_type = (short) TIFF_SHORT; + dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v); +} +#undef MakeShortDirent + +#define NITEMS(x) (sizeof (x) / sizeof (x[0])) +/* + * Setup a directory entry that references a + * samples/pixel array of SHORT values and + * (potentially) write the associated indirect + * values. + */ +static int +TIFFWritePerSampleShorts(TIFF* tif, ttag_t tag, TIFFDirEntry* dir) +{ + uint16 buf[10], v; + uint16* w = buf; + uint16 i, samples = tif->tif_dir.td_samplesperpixel; + int status; + + if (samples > NITEMS(buf)) { + w = (uint16*) _TIFFmalloc(samples * sizeof (uint16)); + if (w == NULL) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "No space to write per-sample shorts"); + return (0); + } + } + TIFFGetField(tif, tag, &v); + for (i = 0; i < samples; i++) + w[i] = v; + + dir->tdir_tag = (uint16) tag; + dir->tdir_type = (uint16) TIFF_SHORT; + dir->tdir_count = samples; + status = TIFFWriteShortArray(tif, dir, w); + if (w != buf) + _TIFFfree((char*) w); + return (status); +} + +/* + * Setup a directory entry that references a samples/pixel array of ``type'' + * values and (potentially) write the associated indirect values. The source + * data from TIFFGetField() for the specified tag must be returned as double. + */ +static int +TIFFWritePerSampleAnys(TIFF* tif, + TIFFDataType type, ttag_t tag, TIFFDirEntry* dir) +{ + double buf[10], v; + double* w = buf; + uint16 i, samples = tif->tif_dir.td_samplesperpixel; + int status; + + if (samples > NITEMS(buf)) { + w = (double*) _TIFFmalloc(samples * sizeof (double)); + if (w == NULL) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "No space to write per-sample values"); + return (0); + } + } + TIFFGetField(tif, tag, &v); + for (i = 0; i < samples; i++) + w[i] = v; + status = TIFFWriteAnyArray(tif, type, tag, dir, samples, w); + if (w != buf) + _TIFFfree(w); + return (status); +} +#undef NITEMS + +/* + * Setup a pair of shorts that are returned by + * value, rather than as a reference to an array. + */ +static int +TIFFSetupShortPair(TIFF* tif, ttag_t tag, TIFFDirEntry* dir) +{ + uint16 v[2]; + + TIFFGetField(tif, tag, &v[0], &v[1]); + + dir->tdir_tag = (uint16) tag; + dir->tdir_type = (uint16) TIFF_SHORT; + dir->tdir_count = 2; + return (TIFFWriteShortArray(tif, dir, v)); +} + +/* + * Setup a directory entry for an NxM table of shorts, + * where M is known to be 2**bitspersample, and write + * the associated indirect data. + */ +static int +TIFFWriteShortTable(TIFF* tif, + ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16** table) +{ + uint32 i, off; + + dir->tdir_tag = (uint16) tag; + dir->tdir_type = (short) TIFF_SHORT; + /* XXX -- yech, fool TIFFWriteData */ + dir->tdir_count = (uint32) (1L<tif_dir.td_bitspersample); + off = tif->tif_dataoff; + for (i = 0; i < n; i++) + if (!TIFFWriteData(tif, dir, (char *)table[i])) + return (0); + dir->tdir_count *= n; + dir->tdir_offset = off; + return (1); +} + +/* + * Write/copy data associated with an ASCII or opaque tag value. + */ +static int +TIFFWriteByteArray(TIFF* tif, TIFFDirEntry* dir, char* cp) +{ + if (dir->tdir_count <= 4) { + if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { + dir->tdir_offset = (uint32)cp[0] << 24; + if (dir->tdir_count >= 2) + dir->tdir_offset |= (uint32)cp[1] << 16; + if (dir->tdir_count >= 3) + dir->tdir_offset |= (uint32)cp[2] << 8; + if (dir->tdir_count == 4) + dir->tdir_offset |= cp[3]; + } else { + dir->tdir_offset = cp[0]; + if (dir->tdir_count >= 2) + dir->tdir_offset |= (uint32) cp[1] << 8; + if (dir->tdir_count >= 3) + dir->tdir_offset |= (uint32) cp[2] << 16; + if (dir->tdir_count == 4) + dir->tdir_offset |= (uint32) cp[3] << 24; + } + return 1; + } else + return TIFFWriteData(tif, dir, cp); +} + +/* + * Setup a directory entry of an array of SHORT + * or SSHORT and write the associated indirect values. + */ +static int +TIFFWriteShortArray(TIFF* tif, TIFFDirEntry* dir, uint16* v) +{ + if (dir->tdir_count <= 2) { + if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { + dir->tdir_offset = (uint32) v[0] << 16; + if (dir->tdir_count == 2) + dir->tdir_offset |= v[1] & 0xffff; + } else { + dir->tdir_offset = v[0] & 0xffff; + if (dir->tdir_count == 2) + dir->tdir_offset |= (uint32) v[1] << 16; + } + return (1); + } else + return (TIFFWriteData(tif, dir, (char*) v)); +} + +/* + * Setup a directory entry of an array of LONG + * or SLONG and write the associated indirect values. + */ +static int +TIFFWriteLongArray(TIFF* tif, TIFFDirEntry* dir, uint32* v) +{ + if (dir->tdir_count == 1) { + dir->tdir_offset = v[0]; + return (1); + } else + return (TIFFWriteData(tif, dir, (char*) v)); +} + +/* + * Setup a directory entry of an array of RATIONAL + * or SRATIONAL and write the associated indirect values. + */ +static int +TIFFWriteRationalArray(TIFF* tif, TIFFDirEntry* dir, float* v) +{ + uint32 i; + uint32* t; + int status; + + t = (uint32*) _TIFFmalloc(2 * dir->tdir_count * sizeof (uint32)); + if (t == NULL) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "No space to write RATIONAL array"); + return (0); + } + for (i = 0; i < dir->tdir_count; i++) { + float fv = v[i]; + int sign = 1; + uint32 den; + + if (fv < 0) { + if (dir->tdir_type == TIFF_RATIONAL) { + TIFFWarningExt(tif->tif_clientdata, + tif->tif_name, + "\"%s\": Information lost writing value (%g) as (unsigned) RATIONAL", + _TIFFFieldWithTag(tif,dir->tdir_tag)->field_name, + fv); + fv = 0; + } else + fv = -fv, sign = -1; + } + den = 1L; + if (fv > 0) { + while (fv < 1L<<(31-3) && den < 1L<<(31-3)) + fv *= 1<<3, den *= 1L<<3; + } + t[2*i+0] = (uint32) (sign * (fv + 0.5)); + t[2*i+1] = den; + } + status = TIFFWriteData(tif, dir, (char *)t); + _TIFFfree((char*) t); + return (status); +} + +static int +TIFFWriteFloatArray(TIFF* tif, TIFFDirEntry* dir, float* v) +{ + TIFFCvtNativeToIEEEFloat(tif, dir->tdir_count, v); + if (dir->tdir_count == 1) { + dir->tdir_offset = *(uint32*) &v[0]; + return (1); + } else + return (TIFFWriteData(tif, dir, (char*) v)); +} + +static int +TIFFWriteDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v) +{ + TIFFCvtNativeToIEEEDouble(tif, dir->tdir_count, v); + return (TIFFWriteData(tif, dir, (char*) v)); +} + +/* + * Write an array of ``type'' values for a specified tag (i.e. this is a tag + * which is allowed to have different types, e.g. SMaxSampleType). + * Internally the data values are represented as double since a double can + * hold any of the TIFF tag types (yes, this should really be an abstract + * type tany_t for portability). The data is converted into the specified + * type in a temporary buffer and then handed off to the appropriate array + * writer. + */ +static int +TIFFWriteAnyArray(TIFF* tif, + TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v) +{ + char buf[10 * sizeof(double)]; + char* w = buf; + int i, status = 0; + + if (n * TIFFDataWidth(type) > sizeof buf) { + w = (char*) _TIFFmalloc(n * TIFFDataWidth(type)); + if (w == NULL) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "No space to write array"); + return (0); + } + } + + dir->tdir_tag = (uint16) tag; + dir->tdir_type = (uint16) type; + dir->tdir_count = n; + + switch (type) { + case TIFF_BYTE: + { + uint8* bp = (uint8*) w; + for (i = 0; i < (int) n; i++) + bp[i] = (uint8) v[i]; + if (!TIFFWriteByteArray(tif, dir, (char*) bp)) + goto out; + } + break; + case TIFF_SBYTE: + { + int8* bp = (int8*) w; + for (i = 0; i < (int) n; i++) + bp[i] = (int8) v[i]; + if (!TIFFWriteByteArray(tif, dir, (char*) bp)) + goto out; + } + break; + case TIFF_SHORT: + { + uint16* bp = (uint16*) w; + for (i = 0; i < (int) n; i++) + bp[i] = (uint16) v[i]; + if (!TIFFWriteShortArray(tif, dir, (uint16*)bp)) + goto out; + } + break; + case TIFF_SSHORT: + { + int16* bp = (int16*) w; + for (i = 0; i < (int) n; i++) + bp[i] = (int16) v[i]; + if (!TIFFWriteShortArray(tif, dir, (uint16*)bp)) + goto out; + } + break; + case TIFF_LONG: + { + uint32* bp = (uint32*) w; + for (i = 0; i < (int) n; i++) + bp[i] = (uint32) v[i]; + if (!TIFFWriteLongArray(tif, dir, bp)) + goto out; + } + break; + case TIFF_SLONG: + { + int32* bp = (int32*) w; + for (i = 0; i < (int) n; i++) + bp[i] = (int32) v[i]; + if (!TIFFWriteLongArray(tif, dir, (uint32*) bp)) + goto out; + } + break; + case TIFF_FLOAT: + { + float* bp = (float*) w; + for (i = 0; i < (int) n; i++) + bp[i] = (float) v[i]; + if (!TIFFWriteFloatArray(tif, dir, bp)) + goto out; + } + break; + case TIFF_DOUBLE: + { + if( !TIFFWriteDoubleArray(tif, dir, v)) + goto out; + } + break; + default: + /* TIFF_NOTYPE */ + /* TIFF_ASCII */ + /* TIFF_UNDEFINED */ + /* TIFF_RATIONAL */ + /* TIFF_SRATIONAL */ + goto out; + } + status = 1; + out: + if (w != buf) + _TIFFfree(w); + return (status); +} + +static int +TIFFWriteTransferFunction(TIFF* tif, TIFFDirEntry* dir) +{ + TIFFDirectory* td = &tif->tif_dir; + tsize_t n = (1L<td_bitspersample) * sizeof (uint16); + uint16** tf = td->td_transferfunction; + int ncols; + + /* + * Check if the table can be written as a single column, + * or if it must be written as 3 columns. Note that we + * write a 3-column tag if there are 2 samples/pixel and + * a single column of data won't suffice--hmm. + */ + switch (td->td_samplesperpixel - td->td_extrasamples) { + default: if (_TIFFmemcmp(tf[0], tf[2], n)) { ncols = 3; break; } + case 2: if (_TIFFmemcmp(tf[0], tf[1], n)) { ncols = 3; break; } + case 1: case 0: ncols = 1; + } + return (TIFFWriteShortTable(tif, + TIFFTAG_TRANSFERFUNCTION, dir, ncols, tf)); +} + +static int +TIFFWriteInkNames(TIFF* tif, TIFFDirEntry* dir) +{ + TIFFDirectory* td = &tif->tif_dir; + + dir->tdir_tag = TIFFTAG_INKNAMES; + dir->tdir_type = (short) TIFF_ASCII; + dir->tdir_count = td->td_inknameslen; + return (TIFFWriteByteArray(tif, dir, td->td_inknames)); +} + +/* + * Write a contiguous directory item. + */ +static int +TIFFWriteData(TIFF* tif, TIFFDirEntry* dir, char* cp) +{ + tsize_t cc; + + if (tif->tif_flags & TIFF_SWAB) { + switch (dir->tdir_type) { + case TIFF_SHORT: + case TIFF_SSHORT: + TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count); + break; + case TIFF_LONG: + case TIFF_SLONG: + case TIFF_FLOAT: + TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count); + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count); + break; + case TIFF_DOUBLE: + TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count); + break; + } + } + dir->tdir_offset = tif->tif_dataoff; + cc = dir->tdir_count * TIFFDataWidth((TIFFDataType) dir->tdir_type); + if (SeekOK(tif, dir->tdir_offset) && + WriteOK(tif, cp, cc)) { + tif->tif_dataoff += (cc + 1) & ~1; + return (1); + } + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error writing data for field \"%s\"", + _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); + return (0); +} + +/* + * Similar to TIFFWriteDirectory(), but if the directory has already + * been written once, it is relocated to the end of the file, in case it + * has changed in size. Note that this will result in the loss of the + * previously used directory space. + */ + +int +TIFFRewriteDirectory( TIFF *tif ) +{ + static const char module[] = "TIFFRewriteDirectory"; + + /* We don't need to do anything special if it hasn't been written. */ + if( tif->tif_diroff == 0 ) + return TIFFWriteDirectory( tif ); + + /* + ** Find and zero the pointer to this directory, so that TIFFLinkDirectory + ** will cause it to be added after this directories current pre-link. + */ + + /* Is it the first directory in the file? */ + if (tif->tif_header.tiff_diroff == tif->tif_diroff) + { + tif->tif_header.tiff_diroff = 0; + tif->tif_diroff = 0; + + TIFFSeekFile(tif, (toff_t)(TIFF_MAGIC_SIZE+TIFF_VERSION_SIZE), + SEEK_SET); + if (!WriteOK(tif, &(tif->tif_header.tiff_diroff), + sizeof (tif->tif_diroff))) + { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error updating TIFF header"); + return (0); + } + } + else + { + toff_t nextdir, off; + + nextdir = tif->tif_header.tiff_diroff; + do { + uint16 dircount; + + if (!SeekOK(tif, nextdir) || + !ReadOK(tif, &dircount, sizeof (dircount))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Error fetching directory count"); + return (0); + } + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabShort(&dircount); + (void) TIFFSeekFile(tif, + dircount * sizeof (TIFFDirEntry), SEEK_CUR); + if (!ReadOK(tif, &nextdir, sizeof (nextdir))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Error fetching directory link"); + return (0); + } + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabLong(&nextdir); + } while (nextdir != tif->tif_diroff && nextdir != 0); + off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */ + (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET); + tif->tif_diroff = 0; + if (!WriteOK(tif, &(tif->tif_diroff), sizeof (nextdir))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Error writing directory link"); + return (0); + } + } + + /* + ** Now use TIFFWriteDirectory() normally. + */ + + return TIFFWriteDirectory( tif ); +} + + +/* + * Link the current directory into the directory chain for the file. + */ +static int +TIFFLinkDirectory(TIFF* tif) +{ + static const char module[] = "TIFFLinkDirectory"; + toff_t nextdir; + toff_t diroff, off; + + tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1; + diroff = tif->tif_diroff; + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabLong(&diroff); + + /* + * Handle SubIFDs + */ + if (tif->tif_flags & TIFF_INSUBIFD) { + (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET); + if (!WriteOK(tif, &diroff, sizeof (diroff))) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Error writing SubIFD directory link", + tif->tif_name); + return (0); + } + /* + * Advance to the next SubIFD or, if this is + * the last one configured, revert back to the + * normal directory linkage. + */ + if (--tif->tif_nsubifd) + tif->tif_subifdoff += sizeof (diroff); + else + tif->tif_flags &= ~TIFF_INSUBIFD; + return (1); + } + + if (tif->tif_header.tiff_diroff == 0) { + /* + * First directory, overwrite offset in header. + */ + tif->tif_header.tiff_diroff = tif->tif_diroff; + (void) TIFFSeekFile(tif, + (toff_t)(TIFF_MAGIC_SIZE+TIFF_VERSION_SIZE), + SEEK_SET); + if (!WriteOK(tif, &diroff, sizeof (diroff))) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Error writing TIFF header"); + return (0); + } + return (1); + } + /* + * Not the first directory, search to the last and append. + */ + nextdir = tif->tif_header.tiff_diroff; + do { + uint16 dircount; + + if (!SeekOK(tif, nextdir) || + !ReadOK(tif, &dircount, sizeof (dircount))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Error fetching directory count"); + return (0); + } + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabShort(&dircount); + (void) TIFFSeekFile(tif, + dircount * sizeof (TIFFDirEntry), SEEK_CUR); + if (!ReadOK(tif, &nextdir, sizeof (nextdir))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Error fetching directory link"); + return (0); + } + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabLong(&nextdir); + } while (nextdir != 0); + off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */ + (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET); + if (!WriteOK(tif, &diroff, sizeof (diroff))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Error writing directory link"); + return (0); + } + return (1); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_dumpmode.c b/src/3rdparty/libtiff/libtiff/tif_dumpmode.c new file mode 100644 index 0000000000..767d6d9263 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_dumpmode.c @@ -0,0 +1,119 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dumpmode.c,v 1.5.2.1 2009-01-01 00:10:43 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * "Null" Compression Algorithm Support. + */ +#include "tiffiop.h" + +/* + * Encode a hunk of pixels. + */ +static int +DumpModeEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) +{ + (void) s; + while (cc > 0) { + tsize_t n; + + n = cc; + if (tif->tif_rawcc + n > tif->tif_rawdatasize) + n = tif->tif_rawdatasize - tif->tif_rawcc; + + assert( n > 0 ); + + /* + * Avoid copy if client has setup raw + * data buffer to avoid extra copy. + */ + if (tif->tif_rawcp != pp) + _TIFFmemcpy(tif->tif_rawcp, pp, n); + tif->tif_rawcp += n; + tif->tif_rawcc += n; + pp += n; + cc -= n; + if (tif->tif_rawcc >= tif->tif_rawdatasize && + !TIFFFlushData1(tif)) + return (-1); + } + return (1); +} + +/* + * Decode a hunk of pixels. + */ +static int +DumpModeDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) +{ + (void) s; +/* fprintf(stderr,"DumpModeDecode: scanline %ld, expected %ld bytes, got %ld bytes\n", */ +/* (long) tif->tif_row, (long) tif->tif_rawcc, (long) cc); */ + if (tif->tif_rawcc < cc) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "DumpModeDecode: Not enough data for scanline %d", + tif->tif_row); + return (0); + } + /* + * Avoid copy if client has setup raw + * data buffer to avoid extra copy. + */ + if (tif->tif_rawcp != buf) + _TIFFmemcpy(buf, tif->tif_rawcp, cc); + tif->tif_rawcp += cc; + tif->tif_rawcc -= cc; + return (1); +} + +/* + * Seek forwards nrows in the current strip. + */ +static int +DumpModeSeek(TIFF* tif, uint32 nrows) +{ + tif->tif_rawcp += nrows * tif->tif_scanlinesize; + tif->tif_rawcc -= nrows * tif->tif_scanlinesize; + return (1); +} + +/* + * Initialize dump mode. + */ +int +TIFFInitDumpMode(TIFF* tif, int scheme) +{ + (void) scheme; + tif->tif_decoderow = DumpModeDecode; + tif->tif_decodestrip = DumpModeDecode; + tif->tif_decodetile = DumpModeDecode; + tif->tif_encoderow = DumpModeEncode; + tif->tif_encodestrip = DumpModeEncode; + tif->tif_encodetile = DumpModeEncode; + tif->tif_seek = DumpModeSeek; + return (1); +} diff --git a/src/3rdparty/libtiff/libtiff/tif_error.c b/src/3rdparty/libtiff/libtiff/tif_error.c new file mode 100644 index 0000000000..7025080ed3 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_error.c @@ -0,0 +1,73 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_error.c,v 1.4 2005/12/23 01:18:59 joris Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + */ +#include "tiffiop.h" + +TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL; + +TIFFErrorHandler +TIFFSetErrorHandler(TIFFErrorHandler handler) +{ + TIFFErrorHandler prev = _TIFFerrorHandler; + _TIFFerrorHandler = handler; + return (prev); +} + +TIFFErrorHandlerExt +TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler) +{ + TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt; + _TIFFerrorHandlerExt = handler; + return (prev); +} + +void +TIFFError(const char* module, const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + if (_TIFFerrorHandler) + (*_TIFFerrorHandler)(module, fmt, ap); + if (_TIFFerrorHandlerExt) + (*_TIFFerrorHandlerExt)(0, module, fmt, ap); + va_end(ap); +} + +void +TIFFErrorExt(thandle_t fd, const char* module, const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + if (_TIFFerrorHandler) + (*_TIFFerrorHandler)(module, fmt, ap); + if (_TIFFerrorHandlerExt) + (*_TIFFerrorHandlerExt)(fd, module, fmt, ap); + va_end(ap); +} + diff --git a/src/3rdparty/libtiff/libtiff/tif_extension.c b/src/3rdparty/libtiff/libtiff/tif_extension.c new file mode 100644 index 0000000000..6861522285 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_extension.c @@ -0,0 +1,111 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_extension.c,v 1.4 2004/10/02 13:29:41 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Various routines support external extension of the tag set, and other + * application extension capabilities. + */ + +#include "tiffiop.h" + +int TIFFGetTagListCount( TIFF *tif ) + +{ + TIFFDirectory* td = &tif->tif_dir; + + return td->td_customValueCount; +} + +ttag_t TIFFGetTagListEntry( TIFF *tif, int tag_index ) + +{ + TIFFDirectory* td = &tif->tif_dir; + + if( tag_index < 0 || tag_index >= td->td_customValueCount ) + return (ttag_t) -1; + else + return td->td_customValues[tag_index].info->field_tag; +} + +/* +** This provides read/write access to the TIFFTagMethods within the TIFF +** structure to application code without giving access to the private +** TIFF structure. +*/ +TIFFTagMethods *TIFFAccessTagMethods( TIFF *tif ) + +{ + return &(tif->tif_tagmethods); +} + +void *TIFFGetClientInfo( TIFF *tif, const char *name ) + +{ + TIFFClientInfoLink *link = tif->tif_clientinfo; + + while( link != NULL && strcmp(link->name,name) != 0 ) + link = link->next; + + if( link != NULL ) + return link->data; + else + return NULL; +} + +void TIFFSetClientInfo( TIFF *tif, void *data, const char *name ) + +{ + TIFFClientInfoLink *link = tif->tif_clientinfo; + + /* + ** Do we have an existing link with this name? If so, just + ** set it. + */ + while( link != NULL && strcmp(link->name,name) != 0 ) + link = link->next; + + if( link != NULL ) + { + link->data = data; + return; + } + + /* + ** Create a new link. + */ + + link = (TIFFClientInfoLink *) _TIFFmalloc(sizeof(TIFFClientInfoLink)); + assert (link != NULL); + link->next = tif->tif_clientinfo; + link->name = (char *) _TIFFmalloc(strlen(name)+1); + assert (link->name != NULL); + strcpy(link->name, name); + link->data = data; + + tif->tif_clientinfo = link; +} diff --git a/src/3rdparty/libtiff/libtiff/tif_fax3.c b/src/3rdparty/libtiff/libtiff/tif_fax3.c new file mode 100644 index 0000000000..b560d56415 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_fax3.c @@ -0,0 +1,1603 @@ +/* $Id: tif_fax3.c,v 1.43.2.5 2009-01-01 00:10:43 bfriesen Exp $ */ + +/* + * Copyright (c) 1990-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "tiffiop.h" +#ifdef CCITT_SUPPORT +/* + * TIFF Library. + * + * CCITT Group 3 (T.4) and Group 4 (T.6) Compression Support. + * + * This file contains support for decoding and encoding TIFF + * compression algorithms 2, 3, 4, and 32771. + * + * Decoder support is derived, with permission, from the code + * in Frank Cringle's viewfax program; + * Copyright (C) 1990, 1995 Frank D. Cringle. + */ +#include "tif_fax3.h" +#define G3CODES +#include "t4.h" +#include + +/* + * Compression+decompression state blocks are + * derived from this ``base state'' block. + */ +typedef struct { + int rw_mode; /* O_RDONLY for decode, else encode */ + int mode; /* operating mode */ + uint32 rowbytes; /* bytes in a decoded scanline */ + uint32 rowpixels; /* pixels in a scanline */ + + uint16 cleanfaxdata; /* CleanFaxData tag */ + uint32 badfaxrun; /* BadFaxRun tag */ + uint32 badfaxlines; /* BadFaxLines tag */ + uint32 groupoptions; /* Group 3/4 options tag */ + uint32 recvparams; /* encoded Class 2 session params */ + char* subaddress; /* subaddress string */ + uint32 recvtime; /* time spent receiving (secs) */ + char* faxdcs; /* Table 2/T.30 encoded session params */ + TIFFVGetMethod vgetparent; /* super-class method */ + TIFFVSetMethod vsetparent; /* super-class method */ + TIFFPrintMethod printdir; /* super-class method */ +} Fax3BaseState; +#define Fax3State(tif) ((Fax3BaseState*) (tif)->tif_data) + +typedef enum { G3_1D, G3_2D } Ttag; +typedef struct { + Fax3BaseState b; + + /* Decoder state info */ + const unsigned char* bitmap; /* bit reversal table */ + uint32 data; /* current i/o byte/word */ + int bit; /* current i/o bit in byte */ + int EOLcnt; /* count of EOL codes recognized */ + TIFFFaxFillFunc fill; /* fill routine */ + uint32* runs; /* b&w runs for current/previous row */ + uint32* refruns; /* runs for reference line */ + uint32* curruns; /* runs for current line */ + + /* Encoder state info */ + Ttag tag; /* encoding state */ + unsigned char* refline; /* reference line for 2d decoding */ + int k; /* #rows left that can be 2d encoded */ + int maxk; /* max #rows that can be 2d encoded */ + + int line; +} Fax3CodecState; +#define DecoderState(tif) ((Fax3CodecState*) Fax3State(tif)) +#define EncoderState(tif) ((Fax3CodecState*) Fax3State(tif)) + +#define is2DEncoding(sp) \ + (sp->b.groupoptions & GROUP3OPT_2DENCODING) +#define isAligned(p,t) ((((unsigned long)(p)) & (sizeof (t)-1)) == 0) + +/* + * Group 3 and Group 4 Decoding. + */ + +/* + * These macros glue the TIFF library state to + * the state expected by Frank's decoder. + */ +#define DECLARE_STATE(tif, sp, mod) \ + static const char module[] = mod; \ + Fax3CodecState* sp = DecoderState(tif); \ + int a0; /* reference element */ \ + int lastx = sp->b.rowpixels; /* last element in row */ \ + uint32 BitAcc; /* bit accumulator */ \ + int BitsAvail; /* # valid bits in BitAcc */ \ + int RunLength; /* length of current run */ \ + unsigned char* cp; /* next byte of input data */ \ + unsigned char* ep; /* end of input data */ \ + uint32* pa; /* place to stuff next run */ \ + uint32* thisrun; /* current row's run array */ \ + int EOLcnt; /* # EOL codes recognized */ \ + const unsigned char* bitmap = sp->bitmap; /* input data bit reverser */ \ + const TIFFFaxTabEnt* TabEnt +#define DECLARE_STATE_2D(tif, sp, mod) \ + DECLARE_STATE(tif, sp, mod); \ + int b1; /* next change on prev line */ \ + uint32* pb /* next run in reference line */\ +/* + * Load any state that may be changed during decoding. + */ +#define CACHE_STATE(tif, sp) do { \ + BitAcc = sp->data; \ + BitsAvail = sp->bit; \ + EOLcnt = sp->EOLcnt; \ + cp = (unsigned char*) tif->tif_rawcp; \ + ep = cp + tif->tif_rawcc; \ +} while (0) +/* + * Save state possibly changed during decoding. + */ +#define UNCACHE_STATE(tif, sp) do { \ + sp->bit = BitsAvail; \ + sp->data = BitAcc; \ + sp->EOLcnt = EOLcnt; \ + tif->tif_rawcc -= (tidata_t) cp - tif->tif_rawcp; \ + tif->tif_rawcp = (tidata_t) cp; \ +} while (0) + +/* + * Setup state for decoding a strip. + */ +static int +Fax3PreDecode(TIFF* tif, tsample_t s) +{ + Fax3CodecState* sp = DecoderState(tif); + + (void) s; + assert(sp != NULL); + sp->bit = 0; /* force initial read */ + sp->data = 0; + sp->EOLcnt = 0; /* force initial scan for EOL */ + /* + * Decoder assumes lsb-to-msb bit order. Note that we select + * this here rather than in Fax3SetupState so that viewers can + * hold the image open, fiddle with the FillOrder tag value, + * and then re-decode the image. Otherwise they'd need to close + * and open the image to get the state reset. + */ + sp->bitmap = + TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB); + if (sp->refruns) { /* init reference line to white */ + sp->refruns[0] = (uint32) sp->b.rowpixels; + sp->refruns[1] = 0; + } + sp->line = 0; + return (1); +} + +/* + * Routine for handling various errors/conditions. + * Note how they are "glued into the decoder" by + * overriding the definitions used by the decoder. + */ + +static void +Fax3Unexpected(const char* module, TIFF* tif, uint32 line, uint32 a0) +{ + TIFFErrorExt(tif->tif_clientdata, module, "%s: Bad code word at line %u of %s %u (x %u)", + tif->tif_name, line, isTiled(tif) ? "tile" : "strip", + (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), + a0); +} +#define unexpected(table, a0) Fax3Unexpected(module, tif, sp->line, a0) + +static void +Fax3Extension(const char* module, TIFF* tif, uint32 line, uint32 a0) +{ + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Uncompressed data (not supported) at line %u of %s %u (x %u)", + tif->tif_name, line, isTiled(tif) ? "tile" : "strip", + (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), + a0); +} +#define extension(a0) Fax3Extension(module, tif, sp->line, a0) + +static void +Fax3BadLength(const char* module, TIFF* tif, uint32 line, uint32 a0, uint32 lastx) +{ + TIFFWarningExt(tif->tif_clientdata, module, "%s: %s at line %u of %s %u (got %u, expected %u)", + tif->tif_name, + a0 < lastx ? "Premature EOL" : "Line length mismatch", + line, isTiled(tif) ? "tile" : "strip", + (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), + a0, lastx); +} +#define badlength(a0,lastx) Fax3BadLength(module, tif, sp->line, a0, lastx) + +static void +Fax3PrematureEOF(const char* module, TIFF* tif, uint32 line, uint32 a0) +{ + TIFFWarningExt(tif->tif_clientdata, module, "%s: Premature EOF at line %u of %s %u (x %u)", + tif->tif_name, + line, isTiled(tif) ? "tile" : "strip", + (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), + a0); +} +#define prematureEOF(a0) Fax3PrematureEOF(module, tif, sp->line, a0) + +#define Nop + +/* + * Decode the requested amount of G3 1D-encoded data. + */ +static int +Fax3Decode1D(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) +{ + DECLARE_STATE(tif, sp, "Fax3Decode1D"); + + (void) s; + CACHE_STATE(tif, sp); + thisrun = sp->curruns; + while ((long)occ > 0) { + a0 = 0; + RunLength = 0; + pa = thisrun; +#ifdef FAX3_DEBUG + printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); + printf("-------------------- %d\n", tif->tif_row); + fflush(stdout); +#endif + SYNC_EOL(EOF1D); + EXPAND1D(EOF1Da); + (*sp->fill)(buf, thisrun, pa, lastx); + buf += sp->b.rowbytes; + occ -= sp->b.rowbytes; + sp->line++; + continue; + EOF1D: /* premature EOF */ + CLEANUP_RUNS(); + EOF1Da: /* premature EOF */ + (*sp->fill)(buf, thisrun, pa, lastx); + UNCACHE_STATE(tif, sp); + return (-1); + } + UNCACHE_STATE(tif, sp); + return (1); +} + +#define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; } +/* + * Decode the requested amount of G3 2D-encoded data. + */ +static int +Fax3Decode2D(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) +{ + DECLARE_STATE_2D(tif, sp, "Fax3Decode2D"); + int is1D; /* current line is 1d/2d-encoded */ + + (void) s; + CACHE_STATE(tif, sp); + while ((long)occ > 0) { + a0 = 0; + RunLength = 0; + pa = thisrun = sp->curruns; +#ifdef FAX3_DEBUG + printf("\nBitAcc=%08X, BitsAvail = %d EOLcnt = %d", + BitAcc, BitsAvail, EOLcnt); +#endif + SYNC_EOL(EOF2D); + NeedBits8(1, EOF2D); + is1D = GetBits(1); /* 1D/2D-encoding tag bit */ + ClrBits(1); +#ifdef FAX3_DEBUG + printf(" %s\n-------------------- %d\n", + is1D ? "1D" : "2D", tif->tif_row); + fflush(stdout); +#endif + pb = sp->refruns; + b1 = *pb++; + if (is1D) + EXPAND1D(EOF2Da); + else + EXPAND2D(EOF2Da); + (*sp->fill)(buf, thisrun, pa, lastx); + SETVALUE(0); /* imaginary change for reference */ + SWAP(uint32*, sp->curruns, sp->refruns); + buf += sp->b.rowbytes; + occ -= sp->b.rowbytes; + sp->line++; + continue; + EOF2D: /* premature EOF */ + CLEANUP_RUNS(); + EOF2Da: /* premature EOF */ + (*sp->fill)(buf, thisrun, pa, lastx); + UNCACHE_STATE(tif, sp); + return (-1); + } + UNCACHE_STATE(tif, sp); + return (1); +} +#undef SWAP + +/* + * The ZERO & FILL macros must handle spans < 2*sizeof(long) bytes. + * For machines with 64-bit longs this is <16 bytes; otherwise + * this is <8 bytes. We optimize the code here to reflect the + * machine characteristics. + */ +#if SIZEOF_LONG == 8 +# define FILL(n, cp) \ + switch (n) { \ + case 15:(cp)[14] = 0xff; case 14:(cp)[13] = 0xff; case 13: (cp)[12] = 0xff;\ + case 12:(cp)[11] = 0xff; case 11:(cp)[10] = 0xff; case 10: (cp)[9] = 0xff;\ + case 9: (cp)[8] = 0xff; case 8: (cp)[7] = 0xff; case 7: (cp)[6] = 0xff;\ + case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; case 4: (cp)[3] = 0xff;\ + case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \ + case 1: (cp)[0] = 0xff; (cp) += (n); case 0: ; \ + } +# define ZERO(n, cp) \ + switch (n) { \ + case 15:(cp)[14] = 0; case 14:(cp)[13] = 0; case 13: (cp)[12] = 0; \ + case 12:(cp)[11] = 0; case 11:(cp)[10] = 0; case 10: (cp)[9] = 0; \ + case 9: (cp)[8] = 0; case 8: (cp)[7] = 0; case 7: (cp)[6] = 0; \ + case 6: (cp)[5] = 0; case 5: (cp)[4] = 0; case 4: (cp)[3] = 0; \ + case 3: (cp)[2] = 0; case 2: (cp)[1] = 0; \ + case 1: (cp)[0] = 0; (cp) += (n); case 0: ; \ + } +#else +# define FILL(n, cp) \ + switch (n) { \ + case 7: (cp)[6] = 0xff; case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; \ + case 4: (cp)[3] = 0xff; case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \ + case 1: (cp)[0] = 0xff; (cp) += (n); case 0: ; \ + } +# define ZERO(n, cp) \ + switch (n) { \ + case 7: (cp)[6] = 0; case 6: (cp)[5] = 0; case 5: (cp)[4] = 0; \ + case 4: (cp)[3] = 0; case 3: (cp)[2] = 0; case 2: (cp)[1] = 0; \ + case 1: (cp)[0] = 0; (cp) += (n); case 0: ; \ + } +#endif + +/* + * Bit-fill a row according to the white/black + * runs generated during G3/G4 decoding. + */ +void +_TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) +{ + static const unsigned char _fillmasks[] = + { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; + unsigned char* cp; + uint32 x, bx, run; + int32 n, nw; + long* lp; + + if ((erun-runs)&1) + *erun++ = 0; + x = 0; + for (; runs < erun; runs += 2) { + run = runs[0]; + if (x+run > lastx || run > lastx ) + run = runs[0] = (uint32) (lastx - x); + if (run) { + cp = buf + (x>>3); + bx = x&7; + if (run > 8-bx) { + if (bx) { /* align to byte boundary */ + *cp++ &= 0xff << (8-bx); + run -= 8-bx; + } + if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */ + if ((n/sizeof (long)) > 1) { + /* + * Align to longword boundary and fill. + */ + for (; n && !isAligned(cp, long); n--) + *cp++ = 0x00; + lp = (long*) cp; + nw = (int32)(n / sizeof (long)); + n -= nw * sizeof (long); + do { + *lp++ = 0L; + } while (--nw); + cp = (unsigned char*) lp; + } + ZERO(n, cp); + run &= 7; + } + if (run) + cp[0] &= 0xff >> run; + } else + cp[0] &= ~(_fillmasks[run]>>bx); + x += runs[0]; + } + run = runs[1]; + if (x+run > lastx || run > lastx ) + run = runs[1] = lastx - x; + if (run) { + cp = buf + (x>>3); + bx = x&7; + if (run > 8-bx) { + if (bx) { /* align to byte boundary */ + *cp++ |= 0xff >> bx; + run -= 8-bx; + } + if( (n = run>>3) != 0 ) { /* multiple bytes to fill */ + if ((n/sizeof (long)) > 1) { + /* + * Align to longword boundary and fill. + */ + for (; n && !isAligned(cp, long); n--) + *cp++ = 0xff; + lp = (long*) cp; + nw = (int32)(n / sizeof (long)); + n -= nw * sizeof (long); + do { + *lp++ = -1L; + } while (--nw); + cp = (unsigned char*) lp; + } + FILL(n, cp); + run &= 7; + } + if (run) + cp[0] |= 0xff00 >> run; + } else + cp[0] |= _fillmasks[run]>>bx; + x += runs[1]; + } + } + assert(x == lastx); +} +#undef ZERO +#undef FILL + +/* + * Setup G3/G4-related compression/decompression state + * before data is processed. This routine is called once + * per image -- it sets up different state based on whether + * or not decoding or encoding is being done and whether + * 1D- or 2D-encoded data is involved. + */ +static int +Fax3SetupState(TIFF* tif) +{ + TIFFDirectory* td = &tif->tif_dir; + Fax3BaseState* sp = Fax3State(tif); + int needsRefLine; + Fax3CodecState* dsp = (Fax3CodecState*) Fax3State(tif); + uint32 rowbytes, rowpixels, nruns; + + if (td->td_bitspersample != 1) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Bits/sample must be 1 for Group 3/4 encoding/decoding"); + return (0); + } + /* + * Calculate the scanline/tile widths. + */ + if (isTiled(tif)) { + rowbytes = TIFFTileRowSize(tif); + rowpixels = td->td_tilewidth; + } else { + rowbytes = TIFFScanlineSize(tif); + rowpixels = td->td_imagewidth; + } + sp->rowbytes = (uint32) rowbytes; + sp->rowpixels = (uint32) rowpixels; + /* + * Allocate any additional space required for decoding/encoding. + */ + needsRefLine = ( + (sp->groupoptions & GROUP3OPT_2DENCODING) || + td->td_compression == COMPRESSION_CCITTFAX4 + ); + + nruns = needsRefLine ? 2*TIFFroundup(rowpixels,32) : rowpixels; + nruns += 3; + dsp->runs = (uint32*) _TIFFCheckMalloc(tif, 2*nruns, sizeof (uint32), + "for Group 3/4 run arrays"); + if (dsp->runs == NULL) + return (0); + dsp->curruns = dsp->runs; + if (needsRefLine) + dsp->refruns = dsp->runs + nruns; + else + dsp->refruns = NULL; + if (td->td_compression == COMPRESSION_CCITTFAX3 + && is2DEncoding(dsp)) { /* NB: default is 1D routine */ + tif->tif_decoderow = Fax3Decode2D; + tif->tif_decodestrip = Fax3Decode2D; + tif->tif_decodetile = Fax3Decode2D; + } + + if (needsRefLine) { /* 2d encoding */ + Fax3CodecState* esp = EncoderState(tif); + /* + * 2d encoding requires a scanline + * buffer for the ``reference line''; the + * scanline against which delta encoding + * is referenced. The reference line must + * be initialized to be ``white'' (done elsewhere). + */ + esp->refline = (unsigned char*) _TIFFmalloc(rowbytes); + if (esp->refline == NULL) { + TIFFErrorExt(tif->tif_clientdata, "Fax3SetupState", + "%s: No space for Group 3/4 reference line", + tif->tif_name); + return (0); + } + } else /* 1d encoding */ + EncoderState(tif)->refline = NULL; + + return (1); +} + +/* + * CCITT Group 3 FAX Encoding. + */ + +#define Fax3FlushBits(tif, sp) { \ + if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \ + (void) TIFFFlushData1(tif); \ + *(tif)->tif_rawcp++ = (tidataval_t) (sp)->data; \ + (tif)->tif_rawcc++; \ + (sp)->data = 0, (sp)->bit = 8; \ +} +#define _FlushBits(tif) { \ + if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \ + (void) TIFFFlushData1(tif); \ + *(tif)->tif_rawcp++ = (tidataval_t) data; \ + (tif)->tif_rawcc++; \ + data = 0, bit = 8; \ +} +static const int _msbmask[9] = + { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; +#define _PutBits(tif, bits, length) { \ + while (length > bit) { \ + data |= bits >> (length - bit); \ + length -= bit; \ + _FlushBits(tif); \ + } \ + data |= (bits & _msbmask[length]) << (bit - length); \ + bit -= length; \ + if (bit == 0) \ + _FlushBits(tif); \ +} + +/* + * Write a variable-length bit-value to + * the output stream. Values are + * assumed to be at most 16 bits. + */ +static void +Fax3PutBits(TIFF* tif, unsigned int bits, unsigned int length) +{ + Fax3CodecState* sp = EncoderState(tif); + unsigned int bit = sp->bit; + int data = sp->data; + + _PutBits(tif, bits, length); + + sp->data = data; + sp->bit = bit; +} + +/* + * Write a code to the output stream. + */ +#define putcode(tif, te) Fax3PutBits(tif, (te)->code, (te)->length) + +#ifdef FAX3_DEBUG +#define DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B") +#define DEBUG_PRINT(what,len) { \ + int t; \ + printf("%08X/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), len); \ + for (t = length-1; t >= 0; t--) \ + putchar(code & (1<bit; + int data = sp->data; + unsigned int code, length; + + while (span >= 2624) { + const tableentry* te = &tab[63 + (2560>>6)]; + code = te->code, length = te->length; +#ifdef FAX3_DEBUG + DEBUG_PRINT("MakeUp", te->runlen); +#endif + _PutBits(tif, code, length); + span -= te->runlen; + } + if (span >= 64) { + const tableentry* te = &tab[63 + (span>>6)]; + assert(te->runlen == 64*(span>>6)); + code = te->code, length = te->length; +#ifdef FAX3_DEBUG + DEBUG_PRINT("MakeUp", te->runlen); +#endif + _PutBits(tif, code, length); + span -= te->runlen; + } + code = tab[span].code, length = tab[span].length; +#ifdef FAX3_DEBUG + DEBUG_PRINT(" Term", tab[span].runlen); +#endif + _PutBits(tif, code, length); + + sp->data = data; + sp->bit = bit; +} + +/* + * Write an EOL code to the output stream. The zero-fill + * logic for byte-aligning encoded scanlines is handled + * here. We also handle writing the tag bit for the next + * scanline when doing 2d encoding. + */ +static void +Fax3PutEOL(TIFF* tif) +{ + Fax3CodecState* sp = EncoderState(tif); + unsigned int bit = sp->bit; + int data = sp->data; + unsigned int code, length, tparm; + + if (sp->b.groupoptions & GROUP3OPT_FILLBITS) { + /* + * Force bit alignment so EOL will terminate on + * a byte boundary. That is, force the bit alignment + * to 16-12 = 4 before putting out the EOL code. + */ + int align = 8 - 4; + if (align != sp->bit) { + if (align > sp->bit) + align = sp->bit + (8 - align); + else + align = sp->bit - align; + code = 0; + tparm=align; + _PutBits(tif, 0, tparm); + } + } + code = EOL, length = 12; + if (is2DEncoding(sp)) + code = (code<<1) | (sp->tag == G3_1D), length++; + _PutBits(tif, code, length); + + sp->data = data; + sp->bit = bit; +} + +/* + * Reset encoding state at the start of a strip. + */ +static int +Fax3PreEncode(TIFF* tif, tsample_t s) +{ + Fax3CodecState* sp = EncoderState(tif); + + (void) s; + assert(sp != NULL); + sp->bit = 8; + sp->data = 0; + sp->tag = G3_1D; + /* + * This is necessary for Group 4; otherwise it isn't + * needed because the first scanline of each strip ends + * up being copied into the refline. + */ + if (sp->refline) + _TIFFmemset(sp->refline, 0x00, sp->b.rowbytes); + if (is2DEncoding(sp)) { + float res = tif->tif_dir.td_yresolution; + /* + * The CCITT spec says that when doing 2d encoding, you + * should only do it on K consecutive scanlines, where K + * depends on the resolution of the image being encoded + * (2 for <= 200 lpi, 4 for > 200 lpi). Since the directory + * code initializes td_yresolution to 0, this code will + * select a K of 2 unless the YResolution tag is set + * appropriately. (Note also that we fudge a little here + * and use 150 lpi to avoid problems with units conversion.) + */ + if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER) + res *= 2.54f; /* convert to inches */ + sp->maxk = (res > 150 ? 4 : 2); + sp->k = sp->maxk-1; + } else + sp->k = sp->maxk = 0; + sp->line = 0; + return (1); +} + +static const unsigned char zeroruns[256] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */ +}; +static const unsigned char oneruns[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */ + 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */ +}; + +/* + * On certain systems it pays to inline + * the routines that find pixel spans. + */ +#ifdef VAXC +static int32 find0span(unsigned char*, int32, int32); +static int32 find1span(unsigned char*, int32, int32); +#pragma inline(find0span,find1span) +#endif + +/* + * Find a span of ones or zeros using the supplied + * table. The ``base'' of the bit string is supplied + * along with the start+end bit indices. + */ +static int32 +find0span(unsigned char* bp, int32 bs, int32 be) +{ + int32 bits = be - bs; + int32 n, span; + + bp += bs>>3; + /* + * Check partial byte on lhs. + */ + if (bits > 0 && (n = (bs & 7))) { + span = zeroruns[(*bp << n) & 0xff]; + if (span > 8-n) /* table value too generous */ + span = 8-n; + if (span > bits) /* constrain span to bit range */ + span = bits; + if (n+span < 8) /* doesn't extend to edge of byte */ + return (span); + bits -= span; + bp++; + } else + span = 0; + if (bits >= (int32)(2 * 8 * sizeof(long))) { + long* lp; + /* + * Align to longword boundary and check longwords. + */ + while (!isAligned(bp, long)) { + if (*bp != 0x00) + return (span + zeroruns[*bp]); + span += 8, bits -= 8; + bp++; + } + lp = (long*) bp; + while ((bits >= (int32)(8 * sizeof(long))) && (0 == *lp)) { + span += 8*sizeof (long), bits -= 8*sizeof (long); + lp++; + } + bp = (unsigned char*) lp; + } + /* + * Scan full bytes for all 0's. + */ + while (bits >= 8) { + if (*bp != 0x00) /* end of run */ + return (span + zeroruns[*bp]); + span += 8, bits -= 8; + bp++; + } + /* + * Check partial byte on rhs. + */ + if (bits > 0) { + n = zeroruns[*bp]; + span += (n > bits ? bits : n); + } + return (span); +} + +static int32 +find1span(unsigned char* bp, int32 bs, int32 be) +{ + int32 bits = be - bs; + int32 n, span; + + bp += bs>>3; + /* + * Check partial byte on lhs. + */ + if (bits > 0 && (n = (bs & 7))) { + span = oneruns[(*bp << n) & 0xff]; + if (span > 8-n) /* table value too generous */ + span = 8-n; + if (span > bits) /* constrain span to bit range */ + span = bits; + if (n+span < 8) /* doesn't extend to edge of byte */ + return (span); + bits -= span; + bp++; + } else + span = 0; + if (bits >= (int32)(2 * 8 * sizeof(long))) { + long* lp; + /* + * Align to longword boundary and check longwords. + */ + while (!isAligned(bp, long)) { + if (*bp != 0xff) + return (span + oneruns[*bp]); + span += 8, bits -= 8; + bp++; + } + lp = (long*) bp; + while ((bits >= (int32)(8 * sizeof(long))) && (~0 == *lp)) { + span += 8*sizeof (long), bits -= 8*sizeof (long); + lp++; + } + bp = (unsigned char*) lp; + } + /* + * Scan full bytes for all 1's. + */ + while (bits >= 8) { + if (*bp != 0xff) /* end of run */ + return (span + oneruns[*bp]); + span += 8, bits -= 8; + bp++; + } + /* + * Check partial byte on rhs. + */ + if (bits > 0) { + n = oneruns[*bp]; + span += (n > bits ? bits : n); + } + return (span); +} + +/* + * Return the offset of the next bit in the range + * [bs..be] that is different from the specified + * color. The end, be, is returned if no such bit + * exists. + */ +#define finddiff(_cp, _bs, _be, _color) \ + (_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be))) +/* + * Like finddiff, but also check the starting bit + * against the end in case start > end. + */ +#define finddiff2(_cp, _bs, _be, _color) \ + (_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be) + +/* + * 1d-encode a row of pixels. The encoding is + * a sequence of all-white or all-black spans + * of pixels encoded with Huffman codes. + */ +static int +Fax3Encode1DRow(TIFF* tif, unsigned char* bp, uint32 bits) +{ + Fax3CodecState* sp = EncoderState(tif); + int32 span; + uint32 bs = 0; + + for (;;) { + span = find0span(bp, bs, bits); /* white span */ + putspan(tif, span, TIFFFaxWhiteCodes); + bs += span; + if (bs >= bits) + break; + span = find1span(bp, bs, bits); /* black span */ + putspan(tif, span, TIFFFaxBlackCodes); + bs += span; + if (bs >= bits) + break; + } + if (sp->b.mode & (FAXMODE_BYTEALIGN|FAXMODE_WORDALIGN)) { + if (sp->bit != 8) /* byte-align */ + Fax3FlushBits(tif, sp); + if ((sp->b.mode&FAXMODE_WORDALIGN) && + !isAligned(tif->tif_rawcp, uint16)) + Fax3FlushBits(tif, sp); + } + return (1); +} + +static const tableentry horizcode = + { 3, 0x1, 0 }; /* 001 */ +static const tableentry passcode = + { 4, 0x1, 0 }; /* 0001 */ +static const tableentry vcodes[7] = { + { 7, 0x03, 0 }, /* 0000 011 */ + { 6, 0x03, 0 }, /* 0000 11 */ + { 3, 0x03, 0 }, /* 011 */ + { 1, 0x1, 0 }, /* 1 */ + { 3, 0x2, 0 }, /* 010 */ + { 6, 0x02, 0 }, /* 0000 10 */ + { 7, 0x02, 0 } /* 0000 010 */ +}; + +/* + * 2d-encode a row of pixels. Consult the CCITT + * documentation for the algorithm. + */ +static int +Fax3Encode2DRow(TIFF* tif, unsigned char* bp, unsigned char* rp, uint32 bits) +{ +#define PIXEL(buf,ix) ((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1) + uint32 a0 = 0; + uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0)); + uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0)); + uint32 a2, b2; + + for (;;) { + b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1)); + if (b2 >= a1) { + int32 d = b1 - a1; + if (!(-3 <= d && d <= 3)) { /* horizontal mode */ + a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1)); + putcode(tif, &horizcode); + if (a0+a1 == 0 || PIXEL(bp, a0) == 0) { + putspan(tif, a1-a0, TIFFFaxWhiteCodes); + putspan(tif, a2-a1, TIFFFaxBlackCodes); + } else { + putspan(tif, a1-a0, TIFFFaxBlackCodes); + putspan(tif, a2-a1, TIFFFaxWhiteCodes); + } + a0 = a2; + } else { /* vertical mode */ + putcode(tif, &vcodes[d+3]); + a0 = a1; + } + } else { /* pass mode */ + putcode(tif, &passcode); + a0 = b2; + } + if (a0 >= bits) + break; + a1 = finddiff(bp, a0, bits, PIXEL(bp,a0)); + b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0)); + b1 = finddiff(rp, b1, bits, PIXEL(bp,a0)); + } + return (1); +#undef PIXEL +} + +/* + * Encode a buffer of pixels. + */ +static int +Fax3Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + Fax3CodecState* sp = EncoderState(tif); + + (void) s; + while ((long)cc > 0) { + if ((sp->b.mode & FAXMODE_NOEOL) == 0) + Fax3PutEOL(tif); + if (is2DEncoding(sp)) { + if (sp->tag == G3_1D) { + if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels)) + return (0); + sp->tag = G3_2D; + } else { + if (!Fax3Encode2DRow(tif, bp, sp->refline, + sp->b.rowpixels)) + return (0); + sp->k--; + } + if (sp->k == 0) { + sp->tag = G3_1D; + sp->k = sp->maxk-1; + } else + _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes); + } else { + if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels)) + return (0); + } + bp += sp->b.rowbytes; + cc -= sp->b.rowbytes; + } + return (1); +} + +static int +Fax3PostEncode(TIFF* tif) +{ + Fax3CodecState* sp = EncoderState(tif); + + if (sp->bit != 8) + Fax3FlushBits(tif, sp); + return (1); +} + +static void +Fax3Close(TIFF* tif) +{ + if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0) { + Fax3CodecState* sp = EncoderState(tif); + unsigned int code = EOL; + unsigned int length = 12; + int i; + + if (is2DEncoding(sp)) + code = (code<<1) | (sp->tag == G3_1D), length++; + for (i = 0; i < 6; i++) + Fax3PutBits(tif, code, length); + Fax3FlushBits(tif, sp); + } +} + +static void +Fax3Cleanup(TIFF* tif) +{ + Fax3CodecState* sp = DecoderState(tif); + + assert(sp != 0); + + tif->tif_tagmethods.vgetfield = sp->b.vgetparent; + tif->tif_tagmethods.vsetfield = sp->b.vsetparent; + tif->tif_tagmethods.printdir = sp->b.printdir; + + if (sp->runs) + _TIFFfree(sp->runs); + if (sp->refline) + _TIFFfree(sp->refline); + + if (Fax3State(tif)->subaddress) + _TIFFfree(Fax3State(tif)->subaddress); + if (Fax3State(tif)->faxdcs) + _TIFFfree(Fax3State(tif)->faxdcs); + + _TIFFfree(tif->tif_data); + tif->tif_data = NULL; + + _TIFFSetDefaultCompressionState(tif); +} + +#define FIELD_BADFAXLINES (FIELD_CODEC+0) +#define FIELD_CLEANFAXDATA (FIELD_CODEC+1) +#define FIELD_BADFAXRUN (FIELD_CODEC+2) +#define FIELD_RECVPARAMS (FIELD_CODEC+3) +#define FIELD_SUBADDRESS (FIELD_CODEC+4) +#define FIELD_RECVTIME (FIELD_CODEC+5) +#define FIELD_FAXDCS (FIELD_CODEC+6) + +#define FIELD_OPTIONS (FIELD_CODEC+7) + +static const TIFFFieldInfo faxFieldInfo[] = { + { TIFFTAG_FAXMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO, + FALSE, FALSE, "FaxMode" }, + { TIFFTAG_FAXFILLFUNC, 0, 0, TIFF_ANY, FIELD_PSEUDO, + FALSE, FALSE, "FaxFillFunc" }, + { TIFFTAG_BADFAXLINES, 1, 1, TIFF_LONG, FIELD_BADFAXLINES, + TRUE, FALSE, "BadFaxLines" }, + { TIFFTAG_BADFAXLINES, 1, 1, TIFF_SHORT, FIELD_BADFAXLINES, + TRUE, FALSE, "BadFaxLines" }, + { TIFFTAG_CLEANFAXDATA, 1, 1, TIFF_SHORT, FIELD_CLEANFAXDATA, + TRUE, FALSE, "CleanFaxData" }, + { TIFFTAG_CONSECUTIVEBADFAXLINES,1,1, TIFF_LONG, FIELD_BADFAXRUN, + TRUE, FALSE, "ConsecutiveBadFaxLines" }, + { TIFFTAG_CONSECUTIVEBADFAXLINES,1,1, TIFF_SHORT, FIELD_BADFAXRUN, + TRUE, FALSE, "ConsecutiveBadFaxLines" }, + { TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, FIELD_RECVPARAMS, + TRUE, FALSE, "FaxRecvParams" }, + { TIFFTAG_FAXSUBADDRESS, -1,-1, TIFF_ASCII, FIELD_SUBADDRESS, + TRUE, FALSE, "FaxSubAddress" }, + { TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, FIELD_RECVTIME, + TRUE, FALSE, "FaxRecvTime" }, + { TIFFTAG_FAXDCS, -1,-1, TIFF_ASCII, FIELD_FAXDCS, + TRUE, FALSE, "FaxDcs" }, +}; +static const TIFFFieldInfo fax3FieldInfo[] = { + { TIFFTAG_GROUP3OPTIONS, 1, 1, TIFF_LONG, FIELD_OPTIONS, + FALSE, FALSE, "Group3Options" }, +}; +static const TIFFFieldInfo fax4FieldInfo[] = { + { TIFFTAG_GROUP4OPTIONS, 1, 1, TIFF_LONG, FIELD_OPTIONS, + FALSE, FALSE, "Group4Options" }, +}; +#define N(a) (sizeof (a) / sizeof (a[0])) + +static int +Fax3VSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + Fax3BaseState* sp = Fax3State(tif); + const TIFFFieldInfo* fip; + + assert(sp != 0); + assert(sp->vsetparent != 0); + + switch (tag) { + case TIFFTAG_FAXMODE: + sp->mode = va_arg(ap, int); + return 1; /* NB: pseudo tag */ + case TIFFTAG_FAXFILLFUNC: + DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc); + return 1; /* NB: pseudo tag */ + case TIFFTAG_GROUP3OPTIONS: + /* XXX: avoid reading options if compression mismatches. */ + if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3) + sp->groupoptions = va_arg(ap, uint32); + break; + case TIFFTAG_GROUP4OPTIONS: + /* XXX: avoid reading options if compression mismatches. */ + if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) + sp->groupoptions = va_arg(ap, uint32); + break; + case TIFFTAG_BADFAXLINES: + sp->badfaxlines = va_arg(ap, uint32); + break; + case TIFFTAG_CLEANFAXDATA: + sp->cleanfaxdata = (uint16) va_arg(ap, int); + break; + case TIFFTAG_CONSECUTIVEBADFAXLINES: + sp->badfaxrun = va_arg(ap, uint32); + break; + case TIFFTAG_FAXRECVPARAMS: + sp->recvparams = va_arg(ap, uint32); + break; + case TIFFTAG_FAXSUBADDRESS: + _TIFFsetString(&sp->subaddress, va_arg(ap, char*)); + break; + case TIFFTAG_FAXRECVTIME: + sp->recvtime = va_arg(ap, uint32); + break; + case TIFFTAG_FAXDCS: + _TIFFsetString(&sp->faxdcs, va_arg(ap, char*)); + break; + default: + return (*sp->vsetparent)(tif, tag, ap); + } + + if ((fip = _TIFFFieldWithTag(tif, tag))) + TIFFSetFieldBit(tif, fip->field_bit); + else + return 0; + + tif->tif_flags |= TIFF_DIRTYDIRECT; + return 1; +} + +static int +Fax3VGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + Fax3BaseState* sp = Fax3State(tif); + + assert(sp != 0); + + switch (tag) { + case TIFFTAG_FAXMODE: + *va_arg(ap, int*) = sp->mode; + break; + case TIFFTAG_FAXFILLFUNC: + *va_arg(ap, TIFFFaxFillFunc*) = DecoderState(tif)->fill; + break; + case TIFFTAG_GROUP3OPTIONS: + case TIFFTAG_GROUP4OPTIONS: + *va_arg(ap, uint32*) = sp->groupoptions; + break; + case TIFFTAG_BADFAXLINES: + *va_arg(ap, uint32*) = sp->badfaxlines; + break; + case TIFFTAG_CLEANFAXDATA: + *va_arg(ap, uint16*) = sp->cleanfaxdata; + break; + case TIFFTAG_CONSECUTIVEBADFAXLINES: + *va_arg(ap, uint32*) = sp->badfaxrun; + break; + case TIFFTAG_FAXRECVPARAMS: + *va_arg(ap, uint32*) = sp->recvparams; + break; + case TIFFTAG_FAXSUBADDRESS: + *va_arg(ap, char**) = sp->subaddress; + break; + case TIFFTAG_FAXRECVTIME: + *va_arg(ap, uint32*) = sp->recvtime; + break; + case TIFFTAG_FAXDCS: + *va_arg(ap, char**) = sp->faxdcs; + break; + default: + return (*sp->vgetparent)(tif, tag, ap); + } + return (1); +} + +static void +Fax3PrintDir(TIFF* tif, FILE* fd, long flags) +{ + Fax3BaseState* sp = Fax3State(tif); + + assert(sp != 0); + + (void) flags; + if (TIFFFieldSet(tif,FIELD_OPTIONS)) { + const char* sep = " "; + if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) { + fprintf(fd, " Group 4 Options:"); + if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED) + fprintf(fd, "%suncompressed data", sep); + } else { + + fprintf(fd, " Group 3 Options:"); + if (sp->groupoptions & GROUP3OPT_2DENCODING) + fprintf(fd, "%s2-d encoding", sep), sep = "+"; + if (sp->groupoptions & GROUP3OPT_FILLBITS) + fprintf(fd, "%sEOL padding", sep), sep = "+"; + if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED) + fprintf(fd, "%suncompressed data", sep); + } + fprintf(fd, " (%lu = 0x%lx)\n", + (unsigned long) sp->groupoptions, + (unsigned long) sp->groupoptions); + } + if (TIFFFieldSet(tif,FIELD_CLEANFAXDATA)) { + fprintf(fd, " Fax Data:"); + switch (sp->cleanfaxdata) { + case CLEANFAXDATA_CLEAN: + fprintf(fd, " clean"); + break; + case CLEANFAXDATA_REGENERATED: + fprintf(fd, " receiver regenerated"); + break; + case CLEANFAXDATA_UNCLEAN: + fprintf(fd, " uncorrected errors"); + break; + } + fprintf(fd, " (%u = 0x%x)\n", + sp->cleanfaxdata, sp->cleanfaxdata); + } + if (TIFFFieldSet(tif,FIELD_BADFAXLINES)) + fprintf(fd, " Bad Fax Lines: %lu\n", + (unsigned long) sp->badfaxlines); + if (TIFFFieldSet(tif,FIELD_BADFAXRUN)) + fprintf(fd, " Consecutive Bad Fax Lines: %lu\n", + (unsigned long) sp->badfaxrun); + if (TIFFFieldSet(tif,FIELD_RECVPARAMS)) + fprintf(fd, " Fax Receive Parameters: %08lx\n", + (unsigned long) sp->recvparams); + if (TIFFFieldSet(tif,FIELD_SUBADDRESS)) + fprintf(fd, " Fax SubAddress: %s\n", sp->subaddress); + if (TIFFFieldSet(tif,FIELD_RECVTIME)) + fprintf(fd, " Fax Receive Time: %lu secs\n", + (unsigned long) sp->recvtime); + if (TIFFFieldSet(tif,FIELD_FAXDCS)) + fprintf(fd, " Fax DCS: %s\n", sp->faxdcs); +} + +static int +InitCCITTFax3(TIFF* tif) +{ + Fax3BaseState* sp; + + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, faxFieldInfo, N(faxFieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, "InitCCITTFax3", + "Merging common CCITT Fax codec-specific tags failed"); + return 0; + } + + /* + * Allocate state block so tag methods have storage to record values. + */ + tif->tif_data = (tidata_t) + _TIFFmalloc(sizeof (Fax3CodecState)); + + if (tif->tif_data == NULL) { + TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax3", + "%s: No space for state block", tif->tif_name); + return (0); + } + + sp = Fax3State(tif); + sp->rw_mode = tif->tif_mode; + + /* + * Override parent get/set field methods. + */ + sp->vgetparent = tif->tif_tagmethods.vgetfield; + tif->tif_tagmethods.vgetfield = Fax3VGetField; /* hook for codec tags */ + sp->vsetparent = tif->tif_tagmethods.vsetfield; + tif->tif_tagmethods.vsetfield = Fax3VSetField; /* hook for codec tags */ + sp->printdir = tif->tif_tagmethods.printdir; + tif->tif_tagmethods.printdir = Fax3PrintDir; /* hook for codec tags */ + sp->groupoptions = 0; + sp->recvparams = 0; + sp->subaddress = NULL; + sp->faxdcs = NULL; + + if (sp->rw_mode == O_RDONLY) /* FIXME: improve for in place update */ + tif->tif_flags |= TIFF_NOBITREV; /* decoder does bit reversal */ + DecoderState(tif)->runs = NULL; + TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns); + EncoderState(tif)->refline = NULL; + + /* + * Install codec methods. + */ + tif->tif_setupdecode = Fax3SetupState; + tif->tif_predecode = Fax3PreDecode; + tif->tif_decoderow = Fax3Decode1D; + tif->tif_decodestrip = Fax3Decode1D; + tif->tif_decodetile = Fax3Decode1D; + tif->tif_setupencode = Fax3SetupState; + tif->tif_preencode = Fax3PreEncode; + tif->tif_postencode = Fax3PostEncode; + tif->tif_encoderow = Fax3Encode; + tif->tif_encodestrip = Fax3Encode; + tif->tif_encodetile = Fax3Encode; + tif->tif_close = Fax3Close; + tif->tif_cleanup = Fax3Cleanup; + + return (1); +} + +int +TIFFInitCCITTFax3(TIFF* tif, int scheme) +{ + (void) scheme; + if (InitCCITTFax3(tif)) { + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, fax3FieldInfo, N(fax3FieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax3", + "Merging CCITT Fax 3 codec-specific tags failed"); + return 0; + } + + /* + * The default format is Class/F-style w/o RTC. + */ + return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF); + } else + return 01; +} + +/* + * CCITT Group 4 (T.6) Facsimile-compatible + * Compression Scheme Support. + */ + +#define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; } +/* + * Decode the requested amount of G4-encoded data. + */ +static int +Fax4Decode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) +{ + DECLARE_STATE_2D(tif, sp, "Fax4Decode"); + + (void) s; + CACHE_STATE(tif, sp); + while ((long)occ > 0) { + a0 = 0; + RunLength = 0; + pa = thisrun = sp->curruns; + pb = sp->refruns; + b1 = *pb++; +#ifdef FAX3_DEBUG + printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); + printf("-------------------- %d\n", tif->tif_row); + fflush(stdout); +#endif + EXPAND2D(EOFG4); + if (EOLcnt) + goto EOFG4; + (*sp->fill)(buf, thisrun, pa, lastx); + SETVALUE(0); /* imaginary change for reference */ + SWAP(uint32*, sp->curruns, sp->refruns); + buf += sp->b.rowbytes; + occ -= sp->b.rowbytes; + sp->line++; + continue; + EOFG4: + NeedBits16( 13, BADG4 ); + BADG4: +#ifdef FAX3_DEBUG + if( GetBits(13) != 0x1001 ) + fputs( "Bad RTC\n", stderr ); +#endif + ClrBits( 13 ); + (*sp->fill)(buf, thisrun, pa, lastx); + UNCACHE_STATE(tif, sp); + return (-1); + } + UNCACHE_STATE(tif, sp); + return (1); +} +#undef SWAP + +/* + * Encode the requested amount of data. + */ +static int +Fax4Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + Fax3CodecState *sp = EncoderState(tif); + + (void) s; + while ((long)cc > 0) { + if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels)) + return (0); + _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes); + bp += sp->b.rowbytes; + cc -= sp->b.rowbytes; + } + return (1); +} + +static int +Fax4PostEncode(TIFF* tif) +{ + Fax3CodecState *sp = EncoderState(tif); + + /* terminate strip w/ EOFB */ + Fax3PutBits(tif, EOL, 12); + Fax3PutBits(tif, EOL, 12); + if (sp->bit != 8) + Fax3FlushBits(tif, sp); + return (1); +} + +int +TIFFInitCCITTFax4(TIFF* tif, int scheme) +{ + (void) scheme; + if (InitCCITTFax3(tif)) { /* reuse G3 support */ + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, fax4FieldInfo, N(fax4FieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax4", + "Merging CCITT Fax 4 codec-specific tags failed"); + return 0; + } + + tif->tif_decoderow = Fax4Decode; + tif->tif_decodestrip = Fax4Decode; + tif->tif_decodetile = Fax4Decode; + tif->tif_encoderow = Fax4Encode; + tif->tif_encodestrip = Fax4Encode; + tif->tif_encodetile = Fax4Encode; + tif->tif_postencode = Fax4PostEncode; + /* + * Suppress RTC at the end of each strip. + */ + return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC); + } else + return (0); +} + +/* + * CCITT Group 3 1-D Modified Huffman RLE Compression Support. + * (Compression algorithms 2 and 32771) + */ + +/* + * Decode the requested amount of RLE-encoded data. + */ +static int +Fax3DecodeRLE(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) +{ + DECLARE_STATE(tif, sp, "Fax3DecodeRLE"); + int mode = sp->b.mode; + + (void) s; + CACHE_STATE(tif, sp); + thisrun = sp->curruns; + while ((long)occ > 0) { + a0 = 0; + RunLength = 0; + pa = thisrun; +#ifdef FAX3_DEBUG + printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); + printf("-------------------- %d\n", tif->tif_row); + fflush(stdout); +#endif + EXPAND1D(EOFRLE); + (*sp->fill)(buf, thisrun, pa, lastx); + /* + * Cleanup at the end of the row. + */ + if (mode & FAXMODE_BYTEALIGN) { + int n = BitsAvail - (BitsAvail &~ 7); + ClrBits(n); + } else if (mode & FAXMODE_WORDALIGN) { + int n = BitsAvail - (BitsAvail &~ 15); + ClrBits(n); + if (BitsAvail == 0 && !isAligned(cp, uint16)) + cp++; + } + buf += sp->b.rowbytes; + occ -= sp->b.rowbytes; + sp->line++; + continue; + EOFRLE: /* premature EOF */ + (*sp->fill)(buf, thisrun, pa, lastx); + UNCACHE_STATE(tif, sp); + return (-1); + } + UNCACHE_STATE(tif, sp); + return (1); +} + +int +TIFFInitCCITTRLE(TIFF* tif, int scheme) +{ + (void) scheme; + if (InitCCITTFax3(tif)) { /* reuse G3 support */ + tif->tif_decoderow = Fax3DecodeRLE; + tif->tif_decodestrip = Fax3DecodeRLE; + tif->tif_decodetile = Fax3DecodeRLE; + /* + * Suppress RTC+EOLs when encoding and byte-align data. + */ + return TIFFSetField(tif, TIFFTAG_FAXMODE, + FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_BYTEALIGN); + } else + return (0); +} + +int +TIFFInitCCITTRLEW(TIFF* tif, int scheme) +{ + (void) scheme; + if (InitCCITTFax3(tif)) { /* reuse G3 support */ + tif->tif_decoderow = Fax3DecodeRLE; + tif->tif_decodestrip = Fax3DecodeRLE; + tif->tif_decodetile = Fax3DecodeRLE; + /* + * Suppress RTC+EOLs when encoding and word-align data. + */ + return TIFFSetField(tif, TIFFTAG_FAXMODE, + FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_WORDALIGN); + } else + return (0); +} +#endif /* CCITT_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_fax3.h b/src/3rdparty/libtiff/libtiff/tif_fax3.h new file mode 100644 index 0000000000..030632f80a --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_fax3.h @@ -0,0 +1,525 @@ +/* $Id: tif_fax3.h,v 1.5 2005/12/12 09:23:11 dron Exp $ */ + +/* + * Copyright (c) 1990-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _FAX3_ +#define _FAX3_ +/* + * TIFF Library. + * + * CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support. + * + * Decoder support is derived, with permission, from the code + * in Frank Cringle's viewfax program; + * Copyright (C) 1990, 1995 Frank D. Cringle. + */ +#include "tiff.h" + +/* + * To override the default routine used to image decoded + * spans one can use the pseduo tag TIFFTAG_FAXFILLFUNC. + * The routine must have the type signature given below; + * for example: + * + * fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) + * + * where buf is place to set the bits, runs is the array of b&w run + * lengths (white then black), erun is the last run in the array, and + * lastx is the width of the row in pixels. Fill routines can assume + * the run array has room for at least lastx runs and can overwrite + * data in the run array as needed (e.g. to append zero runs to bring + * the count up to a nice multiple). + */ +typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32); + +/* + * The default run filler; made external for other decoders. + */ +#if defined(__cplusplus) +extern "C" { +#endif +extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32); +#if defined(__cplusplus) +} +#endif + + +/* finite state machine codes */ +#define S_Null 0 +#define S_Pass 1 +#define S_Horiz 2 +#define S_V0 3 +#define S_VR 4 +#define S_VL 5 +#define S_Ext 6 +#define S_TermW 7 +#define S_TermB 8 +#define S_MakeUpW 9 +#define S_MakeUpB 10 +#define S_MakeUp 11 +#define S_EOL 12 + +typedef struct { /* state table entry */ + unsigned char State; /* see above */ + unsigned char Width; /* width of code in bits */ + uint32 Param; /* unsigned 32-bit run length in bits */ +} TIFFFaxTabEnt; + +extern const TIFFFaxTabEnt TIFFFaxMainTable[]; +extern const TIFFFaxTabEnt TIFFFaxWhiteTable[]; +extern const TIFFFaxTabEnt TIFFFaxBlackTable[]; + +/* + * The following macros define the majority of the G3/G4 decoder + * algorithm using the state tables defined elsewhere. To build + * a decoder you need some setup code and some glue code. Note + * that you may also need/want to change the way the NeedBits* + * macros get input data if, for example, you know the data to be + * decoded is properly aligned and oriented (doing so before running + * the decoder can be a big performance win). + * + * Consult the decoder in the TIFF library for an idea of what you + * need to define and setup to make use of these definitions. + * + * NB: to enable a debugging version of these macros define FAX3_DEBUG + * before including this file. Trace output goes to stdout. + */ + +#ifndef EndOfData +#define EndOfData() (cp >= ep) +#endif +/* + * Need <=8 or <=16 bits of input data. Unlike viewfax we + * cannot use/assume a word-aligned, properly bit swizzled + * input data set because data may come from an arbitrarily + * aligned, read-only source such as a memory-mapped file. + * Note also that the viewfax decoder does not check for + * running off the end of the input data buffer. This is + * possible for G3-encoded data because it prescans the input + * data to count EOL markers, but can cause problems for G4 + * data. In any event, we don't prescan and must watch for + * running out of data since we can't permit the library to + * scan past the end of the input data buffer. + * + * Finally, note that we must handle remaindered data at the end + * of a strip specially. The coder asks for a fixed number of + * bits when scanning for the next code. This may be more bits + * than are actually present in the data stream. If we appear + * to run out of data but still have some number of valid bits + * remaining then we makeup the requested amount with zeros and + * return successfully. If the returned data is incorrect then + * we should be called again and get a premature EOF error; + * otherwise we should get the right answer. + */ +#ifndef NeedBits8 +#define NeedBits8(n,eoflab) do { \ + if (BitsAvail < (n)) { \ + if (EndOfData()) { \ + if (BitsAvail == 0) /* no valid bits */ \ + goto eoflab; \ + BitsAvail = (n); /* pad with zeros */ \ + } else { \ + BitAcc |= ((uint32) bitmap[*cp++])<>= (n); \ +} while (0) + +#ifdef FAX3_DEBUG +static const char* StateNames[] = { + "Null ", + "Pass ", + "Horiz ", + "V0 ", + "VR ", + "VL ", + "Ext ", + "TermW ", + "TermB ", + "MakeUpW", + "MakeUpB", + "MakeUp ", + "EOL ", +}; +#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0') +#define LOOKUP8(wid,tab,eoflab) do { \ + int t; \ + NeedBits8(wid,eoflab); \ + TabEnt = tab + GetBits(wid); \ + printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \ + StateNames[TabEnt->State], TabEnt->Param); \ + for (t = 0; t < TabEnt->Width; t++) \ + DEBUG_SHOW; \ + putchar('\n'); \ + fflush(stdout); \ + ClrBits(TabEnt->Width); \ +} while (0) +#define LOOKUP16(wid,tab,eoflab) do { \ + int t; \ + NeedBits16(wid,eoflab); \ + TabEnt = tab + GetBits(wid); \ + printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \ + StateNames[TabEnt->State], TabEnt->Param); \ + for (t = 0; t < TabEnt->Width; t++) \ + DEBUG_SHOW; \ + putchar('\n'); \ + fflush(stdout); \ + ClrBits(TabEnt->Width); \ +} while (0) + +#define SETVALUE(x) do { \ + *pa++ = RunLength + (x); \ + printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \ + a0 += x; \ + RunLength = 0; \ +} while (0) +#else +#define LOOKUP8(wid,tab,eoflab) do { \ + NeedBits8(wid,eoflab); \ + TabEnt = tab + GetBits(wid); \ + ClrBits(TabEnt->Width); \ +} while (0) +#define LOOKUP16(wid,tab,eoflab) do { \ + NeedBits16(wid,eoflab); \ + TabEnt = tab + GetBits(wid); \ + ClrBits(TabEnt->Width); \ +} while (0) + +/* + * Append a run to the run length array for the + * current row and reset decoding state. + */ +#define SETVALUE(x) do { \ + *pa++ = RunLength + (x); \ + a0 += (x); \ + RunLength = 0; \ +} while (0) +#endif + +/* + * Synchronize input decoding at the start of each + * row by scanning for an EOL (if appropriate) and + * skipping any trash data that might be present + * after a decoding error. Note that the decoding + * done elsewhere that recognizes an EOL only consumes + * 11 consecutive zero bits. This means that if EOLcnt + * is non-zero then we still need to scan for the final flag + * bit that is part of the EOL code. + */ +#define SYNC_EOL(eoflab) do { \ + if (EOLcnt == 0) { \ + for (;;) { \ + NeedBits16(11,eoflab); \ + if (GetBits(11) == 0) \ + break; \ + ClrBits(1); \ + } \ + } \ + for (;;) { \ + NeedBits8(8,eoflab); \ + if (GetBits(8)) \ + break; \ + ClrBits(8); \ + } \ + while (GetBits(1) == 0) \ + ClrBits(1); \ + ClrBits(1); /* EOL bit */ \ + EOLcnt = 0; /* reset EOL counter/flag */ \ +} while (0) + +/* + * Cleanup the array of runs after decoding a row. + * We adjust final runs to insure the user buffer is not + * overwritten and/or undecoded area is white filled. + */ +#define CLEANUP_RUNS() do { \ + if (RunLength) \ + SETVALUE(0); \ + if (a0 != lastx) { \ + badlength(a0, lastx); \ + while (a0 > lastx && pa > thisrun) \ + a0 -= *--pa; \ + if (a0 < lastx) { \ + if (a0 < 0) \ + a0 = 0; \ + if ((pa-thisrun)&1) \ + SETVALUE(0); \ + SETVALUE(lastx - a0); \ + } else if (a0 > lastx) { \ + SETVALUE(lastx); \ + SETVALUE(0); \ + } \ + } \ +} while (0) + +/* + * Decode a line of 1D-encoded data. + * + * The line expanders are written as macros so that they can be reused + * but still have direct access to the local variables of the "calling" + * function. + * + * Note that unlike the original version we have to explicitly test for + * a0 >= lastx after each black/white run is decoded. This is because + * the original code depended on the input data being zero-padded to + * insure the decoder recognized an EOL before running out of data. + */ +#define EXPAND1D(eoflab) do { \ + for (;;) { \ + for (;;) { \ + LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \ + switch (TabEnt->State) { \ + case S_EOL: \ + EOLcnt = 1; \ + goto done1d; \ + case S_TermW: \ + SETVALUE(TabEnt->Param); \ + goto doneWhite1d; \ + case S_MakeUpW: \ + case S_MakeUp: \ + a0 += TabEnt->Param; \ + RunLength += TabEnt->Param; \ + break; \ + default: \ + unexpected("WhiteTable", a0); \ + goto done1d; \ + } \ + } \ + doneWhite1d: \ + if (a0 >= lastx) \ + goto done1d; \ + for (;;) { \ + LOOKUP16(13, TIFFFaxBlackTable, eof1d); \ + switch (TabEnt->State) { \ + case S_EOL: \ + EOLcnt = 1; \ + goto done1d; \ + case S_TermB: \ + SETVALUE(TabEnt->Param); \ + goto doneBlack1d; \ + case S_MakeUpB: \ + case S_MakeUp: \ + a0 += TabEnt->Param; \ + RunLength += TabEnt->Param; \ + break; \ + default: \ + unexpected("BlackTable", a0); \ + goto done1d; \ + } \ + } \ + doneBlack1d: \ + if (a0 >= lastx) \ + goto done1d; \ + if( *(pa-1) == 0 && *(pa-2) == 0 ) \ + pa -= 2; \ + } \ +eof1d: \ + prematureEOF(a0); \ + CLEANUP_RUNS(); \ + goto eoflab; \ +done1d: \ + CLEANUP_RUNS(); \ +} while (0) + +/* + * Update the value of b1 using the array + * of runs for the reference line. + */ +#define CHECK_b1 do { \ + if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \ + b1 += pb[0] + pb[1]; \ + pb += 2; \ + } \ +} while (0) + +/* + * Expand a row of 2D-encoded data. + */ +#define EXPAND2D(eoflab) do { \ + while (a0 < lastx) { \ + LOOKUP8(7, TIFFFaxMainTable, eof2d); \ + switch (TabEnt->State) { \ + case S_Pass: \ + CHECK_b1; \ + b1 += *pb++; \ + RunLength += b1 - a0; \ + a0 = b1; \ + b1 += *pb++; \ + break; \ + case S_Horiz: \ + if ((pa-thisrun)&1) { \ + for (;;) { /* black first */ \ + LOOKUP16(13, TIFFFaxBlackTable, eof2d); \ + switch (TabEnt->State) { \ + case S_TermB: \ + SETVALUE(TabEnt->Param); \ + goto doneWhite2da; \ + case S_MakeUpB: \ + case S_MakeUp: \ + a0 += TabEnt->Param; \ + RunLength += TabEnt->Param; \ + break; \ + default: \ + goto badBlack2d; \ + } \ + } \ + doneWhite2da:; \ + for (;;) { /* then white */ \ + LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \ + switch (TabEnt->State) { \ + case S_TermW: \ + SETVALUE(TabEnt->Param); \ + goto doneBlack2da; \ + case S_MakeUpW: \ + case S_MakeUp: \ + a0 += TabEnt->Param; \ + RunLength += TabEnt->Param; \ + break; \ + default: \ + goto badWhite2d; \ + } \ + } \ + doneBlack2da:; \ + } else { \ + for (;;) { /* white first */ \ + LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \ + switch (TabEnt->State) { \ + case S_TermW: \ + SETVALUE(TabEnt->Param); \ + goto doneWhite2db; \ + case S_MakeUpW: \ + case S_MakeUp: \ + a0 += TabEnt->Param; \ + RunLength += TabEnt->Param; \ + break; \ + default: \ + goto badWhite2d; \ + } \ + } \ + doneWhite2db:; \ + for (;;) { /* then black */ \ + LOOKUP16(13, TIFFFaxBlackTable, eof2d); \ + switch (TabEnt->State) { \ + case S_TermB: \ + SETVALUE(TabEnt->Param); \ + goto doneBlack2db; \ + case S_MakeUpB: \ + case S_MakeUp: \ + a0 += TabEnt->Param; \ + RunLength += TabEnt->Param; \ + break; \ + default: \ + goto badBlack2d; \ + } \ + } \ + doneBlack2db:; \ + } \ + CHECK_b1; \ + break; \ + case S_V0: \ + CHECK_b1; \ + SETVALUE(b1 - a0); \ + b1 += *pb++; \ + break; \ + case S_VR: \ + CHECK_b1; \ + SETVALUE(b1 - a0 + TabEnt->Param); \ + b1 += *pb++; \ + break; \ + case S_VL: \ + CHECK_b1; \ + SETVALUE(b1 - a0 - TabEnt->Param); \ + b1 -= *--pb; \ + break; \ + case S_Ext: \ + *pa++ = lastx - a0; \ + extension(a0); \ + goto eol2d; \ + case S_EOL: \ + *pa++ = lastx - a0; \ + NeedBits8(4,eof2d); \ + if (GetBits(4)) \ + unexpected("EOL", a0); \ + ClrBits(4); \ + EOLcnt = 1; \ + goto eol2d; \ + default: \ + badMain2d: \ + unexpected("MainTable", a0); \ + goto eol2d; \ + badBlack2d: \ + unexpected("BlackTable", a0); \ + goto eol2d; \ + badWhite2d: \ + unexpected("WhiteTable", a0); \ + goto eol2d; \ + eof2d: \ + prematureEOF(a0); \ + CLEANUP_RUNS(); \ + goto eoflab; \ + } \ + } \ + if (RunLength) { \ + if (RunLength + a0 < lastx) { \ + /* expect a final V0 */ \ + NeedBits8(1,eof2d); \ + if (!GetBits(1)) \ + goto badMain2d; \ + ClrBits(1); \ + } \ + SETVALUE(0); \ + } \ +eol2d: \ + CLEANUP_RUNS(); \ +} while (0) +#endif /* _FAX3_ */ diff --git a/src/3rdparty/libtiff/libtiff/tif_fax3sm.c b/src/3rdparty/libtiff/libtiff/tif_fax3sm.c new file mode 100644 index 0000000000..08ce1ad608 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_fax3sm.c @@ -0,0 +1,1253 @@ +/* WARNING, this file was automatically generated by the + mkg3states program */ +#include "tiff.h" +#include "tif_fax3.h" + const TIFFFaxTabEnt TIFFFaxMainTable[128] = { +{12,7,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0}, +{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{5,6,2},{3,1,0},{5,3,1},{3,1,0}, +{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0}, +{4,3,1},{3,1,0},{5,7,3},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0}, +{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{4,6,2},{3,1,0}, +{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0}, +{2,3,0},{3,1,0},{4,3,1},{3,1,0},{6,7,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0}, +{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0}, +{5,6,2},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0}, +{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{4,7,3},{3,1,0},{5,3,1},{3,1,0}, +{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0}, +{4,3,1},{3,1,0},{4,6,2},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0}, +{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0} +}; + const TIFFFaxTabEnt TIFFFaxWhiteTable[4096] = { +{12,11,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, +{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, +{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6}, +{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7}, +{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8}, +{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, +{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1792},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, +{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16}, +{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128}, +{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5}, +{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3}, +{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, +{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, +{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6}, +{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3}, +{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15}, +{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17}, +{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128}, +{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5}, +{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6}, +{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1856},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, +{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8}, +{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5}, +{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14}, +{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16}, +{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128}, +{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, +{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, +{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9}, +{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4}, +{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6}, +{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, +{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15}, +{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, +{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{11,12,2112},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, +{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, +{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6}, +{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7}, +{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8}, +{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, +{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, +{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16}, +{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128}, +{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5}, +{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3}, +{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, +{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2368},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, +{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6}, +{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3}, +{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15}, +{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17}, +{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128}, +{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5}, +{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6}, +{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, +{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8}, +{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5}, +{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14}, +{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16}, +{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128}, +{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, +{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{11,12,1984},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, +{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9}, +{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4}, +{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6}, +{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, +{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15}, +{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, +{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, +{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, +{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6}, +{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7}, +{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8}, +{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, +{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1920},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, +{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16}, +{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128}, +{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5}, +{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3}, +{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, +{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, +{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6}, +{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3}, +{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15}, +{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17}, +{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128}, +{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5}, +{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6}, +{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2240},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, +{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8}, +{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5}, +{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14}, +{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16}, +{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128}, +{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, +{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, +{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9}, +{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4}, +{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6}, +{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, +{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15}, +{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, +{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{11,12,2496},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, +{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, +{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6}, +{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7}, +{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8}, +{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, +{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{12,11,0},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, +{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16}, +{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128}, +{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5}, +{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3}, +{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, +{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1792},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, +{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6}, +{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3}, +{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15}, +{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17}, +{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128}, +{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5}, +{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6}, +{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, +{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8}, +{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5}, +{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14}, +{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16}, +{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128}, +{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, +{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{11,11,1856},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, +{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9}, +{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4}, +{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6}, +{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, +{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15}, +{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, +{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, +{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, +{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6}, +{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7}, +{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8}, +{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, +{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2176},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, +{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16}, +{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128}, +{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5}, +{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3}, +{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, +{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, +{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6}, +{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3}, +{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15}, +{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17}, +{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128}, +{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5}, +{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6}, +{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2432},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, +{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8}, +{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5}, +{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14}, +{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16}, +{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128}, +{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, +{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, +{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9}, +{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4}, +{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6}, +{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, +{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15}, +{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, +{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{11,12,2048},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, +{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, +{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6}, +{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7}, +{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8}, +{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, +{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, +{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16}, +{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128}, +{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5}, +{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3}, +{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, +{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1920},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, +{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6}, +{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3}, +{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15}, +{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17}, +{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128}, +{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5}, +{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6}, +{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, +{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8}, +{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5}, +{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14}, +{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16}, +{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128}, +{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, +{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{11,12,2304},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, +{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9}, +{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5}, +{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4}, +{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6}, +{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, +{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15}, +{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, +{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, +{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, +{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6}, +{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, +{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, +{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7}, +{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8}, +{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, +{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4}, +{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, +{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2560},{7,4,3}, +{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, +{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16}, +{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, +{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128}, +{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5}, +{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, +{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, +{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3}, +{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64}, +{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, +{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7}, +{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, +{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7} +}; + const TIFFFaxTabEnt TIFFFaxBlackTable[8192] = { +{12,11,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1792},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,11,23},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,20},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,11,25},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,128},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,56},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,30},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1856},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,57},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,11,21},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,54},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,52},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,48},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{11,12,2112},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,44},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,36},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,384},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,28},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,60},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,40},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2368},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{11,12,1984},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,50},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,34},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1664},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,26},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1408},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,32},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1920},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,61},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,42},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{10,13,1024},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,13,768},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,62},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2240},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,46},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,38},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,512},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,11,19},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,24},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,22},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{11,12,2496},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{12,11,0},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1792},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,23},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,20},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,11,25},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{10,12,192},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1280},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,31},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{11,11,1856},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,58},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,11,21},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,896},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,640},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,49},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2176},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,45},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,37},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{10,12,448},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,29},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,13,1536},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,41},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2432},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{11,12,2048},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,51},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,35},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,320},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,27},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,59},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,33},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1920},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,256},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,43},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,13,1152},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,55},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,63},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{11,12,2304},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,47},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,39},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,53},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,19},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,24},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,22},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2560},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,10,16},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{12,11,0},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1792},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,23},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,11,20},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,25},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,12,128},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,56},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,30},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{11,11,1856},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,57},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,21},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,54},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,52},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,48},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2112},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,44},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,36},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,12,384},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,28},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,60},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,40},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{11,12,2368},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,1984},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,50},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,34},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{10,13,1728},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,26},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,13,1472},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,32},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1920},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,61},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,42},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1088},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,832},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,62},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{11,12,2240},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,46},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,38},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,576},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,19},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,11,24},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,22},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2496},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{12,11,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{11,11,1792},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,23},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,11,20},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,25},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,192},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1344},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,31},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1856},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,58},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,21},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{10,13,960},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,13,704},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,49},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2176},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,45},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,37},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,448},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,29},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1600},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,41},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{11,12,2432},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2048},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,51},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,35},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{10,12,320},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,27},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,59},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,33},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{11,11,1920},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,256},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,43},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1216},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,55},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,63},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2304},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,12,47},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,39},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,12,53},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,19},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,11,24},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,11,22},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2560},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, +{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3}, +{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, +{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, +{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, +{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, +{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, +{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, +{8,3,4},{8,2,2} +}; diff --git a/src/3rdparty/libtiff/libtiff/tif_flush.c b/src/3rdparty/libtiff/libtiff/tif_flush.c new file mode 100644 index 0000000000..5ff56e9a81 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_flush.c @@ -0,0 +1,67 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_flush.c,v 1.3 2000/09/15 20:52:42 warmerda Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + */ +#include "tiffiop.h" + +int +TIFFFlush(TIFF* tif) +{ + + if (tif->tif_mode != O_RDONLY) { + if (!TIFFFlushData(tif)) + return (0); + if ((tif->tif_flags & TIFF_DIRTYDIRECT) && + !TIFFWriteDirectory(tif)) + return (0); + } + return (1); +} + +/* + * Flush buffered data to the file. + * + * Frank Warmerdam'2000: I modified this to return 1 if TIFF_BEENWRITING + * is not set, so that TIFFFlush() will proceed to write out the directory. + * The documentation says returning 1 is an error indicator, but not having + * been writing isn't exactly a an error. Hopefully this doesn't cause + * problems for other people. + */ +int +TIFFFlushData(TIFF* tif) +{ + if ((tif->tif_flags & TIFF_BEENWRITING) == 0) + return (0); + if (tif->tif_flags & TIFF_POSTENCODE) { + tif->tif_flags &= ~TIFF_POSTENCODE; + if (!(*tif->tif_postencode)(tif)) + return (0); + } + return (TIFFFlushData1(tif)); +} + diff --git a/src/3rdparty/libtiff/libtiff/tif_getimage.c b/src/3rdparty/libtiff/libtiff/tif_getimage.c new file mode 100644 index 0000000000..667f32380a --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_getimage.c @@ -0,0 +1,2669 @@ +/* $Id: tif_getimage.c,v 1.63.2.3 2009-08-30 16:21:46 bfriesen Exp $ */ + +/* + * Copyright (c) 1991-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library + * + * Read and return a packed RGBA image. + */ +#include "tiffiop.h" +#include + +static int gtTileContig(TIFFRGBAImage*, uint32*, uint32, uint32); +static int gtTileSeparate(TIFFRGBAImage*, uint32*, uint32, uint32); +static int gtStripContig(TIFFRGBAImage*, uint32*, uint32, uint32); +static int gtStripSeparate(TIFFRGBAImage*, uint32*, uint32, uint32); +static int PickContigCase(TIFFRGBAImage*); +static int PickSeparateCase(TIFFRGBAImage*); +static const char photoTag[] = "PhotometricInterpretation"; + +/* + * Helper constants used in Orientation tag handling + */ +#define FLIP_VERTICALLY 0x01 +#define FLIP_HORIZONTALLY 0x02 + +/* + * Color conversion constants. We will define display types here. + */ + +TIFFDisplay display_sRGB = { + { /* XYZ -> luminance matrix */ + { 3.2410F, -1.5374F, -0.4986F }, + { -0.9692F, 1.8760F, 0.0416F }, + { 0.0556F, -0.2040F, 1.0570F } + }, + 100.0F, 100.0F, 100.0F, /* Light o/p for reference white */ + 255, 255, 255, /* Pixel values for ref. white */ + 1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel */ + 2.4F, 2.4F, 2.4F, /* Gamma values for the three guns */ +}; + +/* + * Check the image to see if TIFFReadRGBAImage can deal with it. + * 1/0 is returned according to whether or not the image can + * be handled. If 0 is returned, emsg contains the reason + * why it is being rejected. + */ +int +TIFFRGBAImageOK(TIFF* tif, char emsg[1024]) +{ + TIFFDirectory* td = &tif->tif_dir; + uint16 photometric; + int colorchannels; + + if (!tif->tif_decodestatus) { + sprintf(emsg, "Sorry, requested compression method is not configured"); + return (0); + } + switch (td->td_bitspersample) { + case 1: + case 2: + case 4: + case 8: + case 16: + break; + default: + sprintf(emsg, "Sorry, can not handle images with %d-bit samples", + td->td_bitspersample); + return (0); + } + colorchannels = td->td_samplesperpixel - td->td_extrasamples; + if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) { + switch (colorchannels) { + case 1: + photometric = PHOTOMETRIC_MINISBLACK; + break; + case 3: + photometric = PHOTOMETRIC_RGB; + break; + default: + sprintf(emsg, "Missing needed %s tag", photoTag); + return (0); + } + } + switch (photometric) { + case PHOTOMETRIC_MINISWHITE: + case PHOTOMETRIC_MINISBLACK: + case PHOTOMETRIC_PALETTE: + if (td->td_planarconfig == PLANARCONFIG_CONTIG + && td->td_samplesperpixel != 1 + && td->td_bitspersample < 8 ) { + sprintf(emsg, + "Sorry, can not handle contiguous data with %s=%d, " + "and %s=%d and Bits/Sample=%d", + photoTag, photometric, + "Samples/pixel", td->td_samplesperpixel, + td->td_bitspersample); + return (0); + } + /* + * We should likely validate that any extra samples are either + * to be ignored, or are alpha, and if alpha we should try to use + * them. But for now we won't bother with this. + */ + break; + case PHOTOMETRIC_YCBCR: + /* + * TODO: if at all meaningful and useful, make more complete + * support check here, or better still, refactor to let supporting + * code decide whether there is support and what meaningfull + * error to return + */ + break; + case PHOTOMETRIC_RGB: + if (colorchannels < 3) { + sprintf(emsg, "Sorry, can not handle RGB image with %s=%d", + "Color channels", colorchannels); + return (0); + } + break; + case PHOTOMETRIC_SEPARATED: + { + uint16 inkset; + TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset); + if (inkset != INKSET_CMYK) { + sprintf(emsg, + "Sorry, can not handle separated image with %s=%d", + "InkSet", inkset); + return 0; + } + if (td->td_samplesperpixel < 4) { + sprintf(emsg, + "Sorry, can not handle separated image with %s=%d", + "Samples/pixel", td->td_samplesperpixel); + return 0; + } + break; + } + case PHOTOMETRIC_LOGL: + if (td->td_compression != COMPRESSION_SGILOG) { + sprintf(emsg, "Sorry, LogL data must have %s=%d", + "Compression", COMPRESSION_SGILOG); + return (0); + } + break; + case PHOTOMETRIC_LOGLUV: + if (td->td_compression != COMPRESSION_SGILOG && + td->td_compression != COMPRESSION_SGILOG24) { + sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d", + "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24); + return (0); + } + if (td->td_planarconfig != PLANARCONFIG_CONTIG) { + sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d", + "Planarconfiguration", td->td_planarconfig); + return (0); + } + break; + case PHOTOMETRIC_CIELAB: + break; + default: + sprintf(emsg, "Sorry, can not handle image with %s=%d", + photoTag, photometric); + return (0); + } + return (1); +} + +void +TIFFRGBAImageEnd(TIFFRGBAImage* img) +{ + if (img->Map) + _TIFFfree(img->Map), img->Map = NULL; + if (img->BWmap) + _TIFFfree(img->BWmap), img->BWmap = NULL; + if (img->PALmap) + _TIFFfree(img->PALmap), img->PALmap = NULL; + if (img->ycbcr) + _TIFFfree(img->ycbcr), img->ycbcr = NULL; + if (img->cielab) + _TIFFfree(img->cielab), img->cielab = NULL; + if( img->redcmap ) { + _TIFFfree( img->redcmap ); + _TIFFfree( img->greencmap ); + _TIFFfree( img->bluecmap ); + } +} + +static int +isCCITTCompression(TIFF* tif) +{ + uint16 compress; + TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress); + return (compress == COMPRESSION_CCITTFAX3 || + compress == COMPRESSION_CCITTFAX4 || + compress == COMPRESSION_CCITTRLE || + compress == COMPRESSION_CCITTRLEW); +} + +int +TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stop, char emsg[1024]) +{ + uint16* sampleinfo; + uint16 extrasamples; + uint16 planarconfig; + uint16 compress; + int colorchannels; + uint16 *red_orig, *green_orig, *blue_orig; + int n_color; + + /* Initialize to normal values */ + img->row_offset = 0; + img->col_offset = 0; + img->redcmap = NULL; + img->greencmap = NULL; + img->bluecmap = NULL; + img->req_orientation = ORIENTATION_BOTLEFT; /* It is the default */ + + img->tif = tif; + img->stoponerr = stop; + TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &img->bitspersample); + switch (img->bitspersample) { + case 1: + case 2: + case 4: + case 8: + case 16: + break; + default: + sprintf(emsg, "Sorry, can not handle images with %d-bit samples", + img->bitspersample); + return (0); + } + img->alpha = 0; + TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &img->samplesperpixel); + TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, + &extrasamples, &sampleinfo); + if (extrasamples >= 1) + { + switch (sampleinfo[0]) { + case EXTRASAMPLE_UNSPECIFIED: /* Workaround for some images without */ + if (img->samplesperpixel > 3) /* correct info about alpha channel */ + img->alpha = EXTRASAMPLE_ASSOCALPHA; + break; + case EXTRASAMPLE_ASSOCALPHA: /* data is pre-multiplied */ + case EXTRASAMPLE_UNASSALPHA: /* data is not pre-multiplied */ + img->alpha = sampleinfo[0]; + break; + } + } + +#ifdef DEFAULT_EXTRASAMPLE_AS_ALPHA + if( !TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) + img->photometric = PHOTOMETRIC_MINISWHITE; + + if( extrasamples == 0 + && img->samplesperpixel == 4 + && img->photometric == PHOTOMETRIC_RGB ) + { + img->alpha = EXTRASAMPLE_ASSOCALPHA; + extrasamples = 1; + } +#endif + + colorchannels = img->samplesperpixel - extrasamples; + TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress); + TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfig); + if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) { + switch (colorchannels) { + case 1: + if (isCCITTCompression(tif)) + img->photometric = PHOTOMETRIC_MINISWHITE; + else + img->photometric = PHOTOMETRIC_MINISBLACK; + break; + case 3: + img->photometric = PHOTOMETRIC_RGB; + break; + default: + sprintf(emsg, "Missing needed %s tag", photoTag); + return (0); + } + } + switch (img->photometric) { + case PHOTOMETRIC_PALETTE: + if (!TIFFGetField(tif, TIFFTAG_COLORMAP, + &red_orig, &green_orig, &blue_orig)) { + sprintf(emsg, "Missing required \"Colormap\" tag"); + return (0); + } + + /* copy the colormaps so we can modify them */ + n_color = (1L << img->bitspersample); + img->redcmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); + img->greencmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); + img->bluecmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); + if( !img->redcmap || !img->greencmap || !img->bluecmap ) { + sprintf(emsg, "Out of memory for colormap copy"); + return (0); + } + + _TIFFmemcpy( img->redcmap, red_orig, n_color * 2 ); + _TIFFmemcpy( img->greencmap, green_orig, n_color * 2 ); + _TIFFmemcpy( img->bluecmap, blue_orig, n_color * 2 ); + + /* fall thru... */ + case PHOTOMETRIC_MINISWHITE: + case PHOTOMETRIC_MINISBLACK: + if (planarconfig == PLANARCONFIG_CONTIG + && img->samplesperpixel != 1 + && img->bitspersample < 8 ) { + sprintf(emsg, + "Sorry, can not handle contiguous data with %s=%d, " + "and %s=%d and Bits/Sample=%d", + photoTag, img->photometric, + "Samples/pixel", img->samplesperpixel, + img->bitspersample); + return (0); + } + break; + case PHOTOMETRIC_YCBCR: + /* It would probably be nice to have a reality check here. */ + if (planarconfig == PLANARCONFIG_CONTIG) + /* can rely on libjpeg to convert to RGB */ + /* XXX should restore current state on exit */ + switch (compress) { + case COMPRESSION_JPEG: + /* + * TODO: when complete tests verify complete desubsampling + * and YCbCr handling, remove use of TIFFTAG_JPEGCOLORMODE in + * favor of tif_getimage.c native handling + */ + TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); + img->photometric = PHOTOMETRIC_RGB; + break; + default: + /* do nothing */; + break; + } + /* + * TODO: if at all meaningful and useful, make more complete + * support check here, or better still, refactor to let supporting + * code decide whether there is support and what meaningfull + * error to return + */ + break; + case PHOTOMETRIC_RGB: + if (colorchannels < 3) { + sprintf(emsg, "Sorry, can not handle RGB image with %s=%d", + "Color channels", colorchannels); + return (0); + } + break; + case PHOTOMETRIC_SEPARATED: + { + uint16 inkset; + TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset); + if (inkset != INKSET_CMYK) { + sprintf(emsg, "Sorry, can not handle separated image with %s=%d", + "InkSet", inkset); + return (0); + } + if (img->samplesperpixel < 4) { + sprintf(emsg, "Sorry, can not handle separated image with %s=%d", + "Samples/pixel", img->samplesperpixel); + return (0); + } + } + break; + case PHOTOMETRIC_LOGL: + if (compress != COMPRESSION_SGILOG) { + sprintf(emsg, "Sorry, LogL data must have %s=%d", + "Compression", COMPRESSION_SGILOG); + return (0); + } + TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT); + img->photometric = PHOTOMETRIC_MINISBLACK; /* little white lie */ + img->bitspersample = 8; + break; + case PHOTOMETRIC_LOGLUV: + if (compress != COMPRESSION_SGILOG && compress != COMPRESSION_SGILOG24) { + sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d", + "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24); + return (0); + } + if (planarconfig != PLANARCONFIG_CONTIG) { + sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d", + "Planarconfiguration", planarconfig); + return (0); + } + TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT); + img->photometric = PHOTOMETRIC_RGB; /* little white lie */ + img->bitspersample = 8; + break; + case PHOTOMETRIC_CIELAB: + break; + default: + sprintf(emsg, "Sorry, can not handle image with %s=%d", + photoTag, img->photometric); + return (0); + } + img->Map = NULL; + img->BWmap = NULL; + img->PALmap = NULL; + img->ycbcr = NULL; + img->cielab = NULL; + TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &img->width); + TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &img->height); + TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &img->orientation); + img->isContig = + !(planarconfig == PLANARCONFIG_SEPARATE && colorchannels > 1); + if (img->isContig) { + if (!PickContigCase(img)) { + sprintf(emsg, "Sorry, can not handle image"); + return 0; + } + } else { + if (!PickSeparateCase(img)) { + sprintf(emsg, "Sorry, can not handle image"); + return 0; + } + } + return 1; +} + +int +TIFFRGBAImageGet(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) +{ + if (img->get == NULL) { + TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No \"get\" routine setup"); + return (0); + } + if (img->put.any == NULL) { + TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), + "No \"put\" routine setupl; probably can not handle image format"); + return (0); + } + return (*img->get)(img, raster, w, h); +} + +/* + * Read the specified image into an ABGR-format rastertaking in account + * specified orientation. + */ +int +TIFFReadRGBAImageOriented(TIFF* tif, + uint32 rwidth, uint32 rheight, uint32* raster, + int orientation, int stop) +{ + char emsg[1024] = ""; + TIFFRGBAImage img; + int ok; + + if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, stop, emsg)) { + img.req_orientation = orientation; + /* XXX verify rwidth and rheight against width and height */ + ok = TIFFRGBAImageGet(&img, raster+(rheight-img.height)*rwidth, + rwidth, img.height); + TIFFRGBAImageEnd(&img); + } else { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg); + ok = 0; + } + return (ok); +} + +/* + * Read the specified image into an ABGR-format raster. Use bottom left + * origin for raster by default. + */ +int +TIFFReadRGBAImage(TIFF* tif, + uint32 rwidth, uint32 rheight, uint32* raster, int stop) +{ + return TIFFReadRGBAImageOriented(tif, rwidth, rheight, raster, + ORIENTATION_BOTLEFT, stop); +} + +static int +setorientation(TIFFRGBAImage* img) +{ + switch (img->orientation) { + case ORIENTATION_TOPLEFT: + case ORIENTATION_LEFTTOP: + if (img->req_orientation == ORIENTATION_TOPRIGHT || + img->req_orientation == ORIENTATION_RIGHTTOP) + return FLIP_HORIZONTALLY; + else if (img->req_orientation == ORIENTATION_BOTRIGHT || + img->req_orientation == ORIENTATION_RIGHTBOT) + return FLIP_HORIZONTALLY | FLIP_VERTICALLY; + else if (img->req_orientation == ORIENTATION_BOTLEFT || + img->req_orientation == ORIENTATION_LEFTBOT) + return FLIP_VERTICALLY; + else + return 0; + case ORIENTATION_TOPRIGHT: + case ORIENTATION_RIGHTTOP: + if (img->req_orientation == ORIENTATION_TOPLEFT || + img->req_orientation == ORIENTATION_LEFTTOP) + return FLIP_HORIZONTALLY; + else if (img->req_orientation == ORIENTATION_BOTRIGHT || + img->req_orientation == ORIENTATION_RIGHTBOT) + return FLIP_VERTICALLY; + else if (img->req_orientation == ORIENTATION_BOTLEFT || + img->req_orientation == ORIENTATION_LEFTBOT) + return FLIP_HORIZONTALLY | FLIP_VERTICALLY; + else + return 0; + case ORIENTATION_BOTRIGHT: + case ORIENTATION_RIGHTBOT: + if (img->req_orientation == ORIENTATION_TOPLEFT || + img->req_orientation == ORIENTATION_LEFTTOP) + return FLIP_HORIZONTALLY | FLIP_VERTICALLY; + else if (img->req_orientation == ORIENTATION_TOPRIGHT || + img->req_orientation == ORIENTATION_RIGHTTOP) + return FLIP_VERTICALLY; + else if (img->req_orientation == ORIENTATION_BOTLEFT || + img->req_orientation == ORIENTATION_LEFTBOT) + return FLIP_HORIZONTALLY; + else + return 0; + case ORIENTATION_BOTLEFT: + case ORIENTATION_LEFTBOT: + if (img->req_orientation == ORIENTATION_TOPLEFT || + img->req_orientation == ORIENTATION_LEFTTOP) + return FLIP_VERTICALLY; + else if (img->req_orientation == ORIENTATION_TOPRIGHT || + img->req_orientation == ORIENTATION_RIGHTTOP) + return FLIP_HORIZONTALLY | FLIP_VERTICALLY; + else if (img->req_orientation == ORIENTATION_BOTRIGHT || + img->req_orientation == ORIENTATION_RIGHTBOT) + return FLIP_HORIZONTALLY; + else + return 0; + default: /* NOTREACHED */ + return 0; + } +} + +/* + * Get an tile-organized image that has + * PlanarConfiguration contiguous if SamplesPerPixel > 1 + * or + * SamplesPerPixel == 1 + */ +static int +gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) +{ + TIFF* tif = img->tif; + tileContigRoutine put = img->put.contig; + uint32 col, row, y, rowstoread; + uint32 pos; + uint32 tw, th; + unsigned char* buf; + int32 fromskew, toskew; + uint32 nrow; + int ret = 1, flip; + + buf = (unsigned char*) _TIFFmalloc(TIFFTileSize(tif)); + if (buf == 0) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for tile buffer"); + return (0); + } + _TIFFmemset(buf, 0, TIFFTileSize(tif)); + TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); + TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); + + flip = setorientation(img); + if (flip & FLIP_VERTICALLY) { + y = h - 1; + toskew = -(int32)(tw + w); + } + else { + y = 0; + toskew = -(int32)(tw - w); + } + + for (row = 0; row < h; row += nrow) + { + rowstoread = th - (row + img->row_offset) % th; + nrow = (row + rowstoread > h ? h - row : rowstoread); + for (col = 0; col < w; col += tw) + { + if (TIFFReadTile(tif, buf, col+img->col_offset, + row+img->row_offset, 0, 0) < 0 && img->stoponerr) + { + ret = 0; + break; + } + + pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); + + if (col + tw > w) + { + /* + * Tile is clipped horizontally. Calculate + * visible portion and skewing factors. + */ + uint32 npix = w - col; + fromskew = tw - npix; + (*put)(img, raster+y*w+col, col, y, + npix, nrow, fromskew, toskew + fromskew, buf + pos); + } + else + { + (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, buf + pos); + } + } + + y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); + } + _TIFFfree(buf); + + if (flip & FLIP_HORIZONTALLY) { + uint32 line; + + for (line = 0; line < h; line++) { + uint32 *left = raster + (line * w); + uint32 *right = left + w - 1; + + while ( left < right ) { + uint32 temp = *left; + *left = *right; + *right = temp; + left++, right--; + } + } + } + + return (ret); +} + +/* + * Get an tile-organized image that has + * SamplesPerPixel > 1 + * PlanarConfiguration separated + * We assume that all such images are RGB. + */ +static int +gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) +{ + TIFF* tif = img->tif; + tileSeparateRoutine put = img->put.separate; + uint32 col, row, y, rowstoread; + uint32 pos; + uint32 tw, th; + unsigned char* buf; + unsigned char* p0; + unsigned char* p1; + unsigned char* p2; + unsigned char* pa; + tsize_t tilesize; + int32 fromskew, toskew; + int alpha = img->alpha; + uint32 nrow; + int ret = 1, flip; + + tilesize = TIFFTileSize(tif); + buf = (unsigned char*) _TIFFmalloc((alpha?4:3)*tilesize); + if (buf == 0) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for tile buffer"); + return (0); + } + _TIFFmemset(buf, 0, (alpha?4:3)*tilesize); + p0 = buf; + p1 = p0 + tilesize; + p2 = p1 + tilesize; + pa = (alpha?(p2+tilesize):NULL); + TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); + TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); + + flip = setorientation(img); + if (flip & FLIP_VERTICALLY) { + y = h - 1; + toskew = -(int32)(tw + w); + } + else { + y = 0; + toskew = -(int32)(tw - w); + } + + for (row = 0; row < h; row += nrow) + { + rowstoread = th - (row + img->row_offset) % th; + nrow = (row + rowstoread > h ? h - row : rowstoread); + for (col = 0; col < w; col += tw) + { + if (TIFFReadTile(tif, p0, col+img->col_offset, + row+img->row_offset,0,0) < 0 && img->stoponerr) + { + ret = 0; + break; + } + if (TIFFReadTile(tif, p1, col+img->col_offset, + row+img->row_offset,0,1) < 0 && img->stoponerr) + { + ret = 0; + break; + } + if (TIFFReadTile(tif, p2, col+img->col_offset, + row+img->row_offset,0,2) < 0 && img->stoponerr) + { + ret = 0; + break; + } + if (alpha) + { + if (TIFFReadTile(tif,pa,col+img->col_offset, + row+img->row_offset,0,3) < 0 && img->stoponerr) + { + ret = 0; + break; + } + } + + pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); + + if (col + tw > w) + { + /* + * Tile is clipped horizontally. Calculate + * visible portion and skewing factors. + */ + uint32 npix = w - col; + fromskew = tw - npix; + (*put)(img, raster+y*w+col, col, y, + npix, nrow, fromskew, toskew + fromskew, + p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); + } else { + (*put)(img, raster+y*w+col, col, y, + tw, nrow, 0, toskew, p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); + } + } + + y += (flip & FLIP_VERTICALLY ?-(int32) nrow : (int32) nrow); + } + + if (flip & FLIP_HORIZONTALLY) { + uint32 line; + + for (line = 0; line < h; line++) { + uint32 *left = raster + (line * w); + uint32 *right = left + w - 1; + + while ( left < right ) { + uint32 temp = *left; + *left = *right; + *right = temp; + left++, right--; + } + } + } + + _TIFFfree(buf); + return (ret); +} + +/* + * Get a strip-organized image that has + * PlanarConfiguration contiguous if SamplesPerPixel > 1 + * or + * SamplesPerPixel == 1 + */ +static int +gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) +{ + TIFF* tif = img->tif; + tileContigRoutine put = img->put.contig; + uint32 row, y, nrow, nrowsub, rowstoread; + uint32 pos; + unsigned char* buf; + uint32 rowsperstrip; + uint16 subsamplinghor,subsamplingver; + uint32 imagewidth = img->width; + tsize_t scanline; + int32 fromskew, toskew; + int ret = 1, flip; + + buf = (unsigned char*) _TIFFmalloc(TIFFStripSize(tif)); + if (buf == 0) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer"); + return (0); + } + _TIFFmemset(buf, 0, TIFFStripSize(tif)); + + flip = setorientation(img); + if (flip & FLIP_VERTICALLY) { + y = h - 1; + toskew = -(int32)(w + w); + } else { + y = 0; + toskew = -(int32)(w - w); + } + + TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); + TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &subsamplingver); + scanline = TIFFNewScanlineSize(tif); + fromskew = (w < imagewidth ? imagewidth - w : 0); + for (row = 0; row < h; row += nrow) + { + rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip; + nrow = (row + rowstoread > h ? h - row : rowstoread); + nrowsub = nrow; + if ((nrowsub%subsamplingver)!=0) + nrowsub+=subsamplingver-nrowsub%subsamplingver; + if (TIFFReadEncodedStrip(tif, + TIFFComputeStrip(tif,row+img->row_offset, 0), + buf, + ((row + img->row_offset)%rowsperstrip + nrowsub) * scanline) < 0 + && img->stoponerr) + { + ret = 0; + break; + } + + pos = ((row + img->row_offset) % rowsperstrip) * scanline; + (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + pos); + y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); + } + + if (flip & FLIP_HORIZONTALLY) { + uint32 line; + + for (line = 0; line < h; line++) { + uint32 *left = raster + (line * w); + uint32 *right = left + w - 1; + + while ( left < right ) { + uint32 temp = *left; + *left = *right; + *right = temp; + left++, right--; + } + } + } + + _TIFFfree(buf); + return (ret); +} + +/* + * Get a strip-organized image with + * SamplesPerPixel > 1 + * PlanarConfiguration separated + * We assume that all such images are RGB. + */ +static int +gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) +{ + TIFF* tif = img->tif; + tileSeparateRoutine put = img->put.separate; + unsigned char *buf; + unsigned char *p0, *p1, *p2, *pa; + uint32 row, y, nrow, rowstoread; + uint32 pos; + tsize_t scanline; + uint32 rowsperstrip, offset_row; + uint32 imagewidth = img->width; + tsize_t stripsize; + int32 fromskew, toskew; + int alpha = img->alpha; + int ret = 1, flip; + + stripsize = TIFFStripSize(tif); + p0 = buf = (unsigned char *)_TIFFmalloc((alpha?4:3)*stripsize); + if (buf == 0) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for tile buffer"); + return (0); + } + _TIFFmemset(buf, 0, (alpha?4:3)*stripsize); + p1 = p0 + stripsize; + p2 = p1 + stripsize; + pa = (alpha?(p2+stripsize):NULL); + + flip = setorientation(img); + if (flip & FLIP_VERTICALLY) { + y = h - 1; + toskew = -(int32)(w + w); + } + else { + y = 0; + toskew = -(int32)(w - w); + } + + TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); + scanline = TIFFScanlineSize(tif); + fromskew = (w < imagewidth ? imagewidth - w : 0); + for (row = 0; row < h; row += nrow) + { + rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip; + nrow = (row + rowstoread > h ? h - row : rowstoread); + offset_row = row + img->row_offset; + if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 0), + p0, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 + && img->stoponerr) + { + ret = 0; + break; + } + if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 1), + p1, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 + && img->stoponerr) + { + ret = 0; + break; + } + if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 2), + p2, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 + && img->stoponerr) + { + ret = 0; + break; + } + if (alpha) + { + if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 3), + pa, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 + && img->stoponerr) + { + ret = 0; + break; + } + } + + pos = ((row + img->row_offset) % rowsperstrip) * scanline; + (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, p0 + pos, p1 + pos, + p2 + pos, (alpha?(pa+pos):NULL)); + y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); + } + + if (flip & FLIP_HORIZONTALLY) { + uint32 line; + + for (line = 0; line < h; line++) { + uint32 *left = raster + (line * w); + uint32 *right = left + w - 1; + + while ( left < right ) { + uint32 temp = *left; + *left = *right; + *right = temp; + left++, right--; + } + } + } + + _TIFFfree(buf); + return (ret); +} + +/* + * The following routines move decoded data returned + * from the TIFF library into rasters filled with packed + * ABGR pixels (i.e. suitable for passing to lrecwrite.) + * + * The routines have been created according to the most + * important cases and optimized. PickContigCase and + * PickSeparateCase analyze the parameters and select + * the appropriate "get" and "put" routine to use. + */ +#define REPEAT8(op) REPEAT4(op); REPEAT4(op) +#define REPEAT4(op) REPEAT2(op); REPEAT2(op) +#define REPEAT2(op) op; op +#define CASE8(x,op) \ + switch (x) { \ + case 7: op; case 6: op; case 5: op; \ + case 4: op; case 3: op; case 2: op; \ + case 1: op; \ + } +#define CASE4(x,op) switch (x) { case 3: op; case 2: op; case 1: op; } +#define NOP + +#define UNROLL8(w, op1, op2) { \ + uint32 _x; \ + for (_x = w; _x >= 8; _x -= 8) { \ + op1; \ + REPEAT8(op2); \ + } \ + if (_x > 0) { \ + op1; \ + CASE8(_x,op2); \ + } \ +} +#define UNROLL4(w, op1, op2) { \ + uint32 _x; \ + for (_x = w; _x >= 4; _x -= 4) { \ + op1; \ + REPEAT4(op2); \ + } \ + if (_x > 0) { \ + op1; \ + CASE4(_x,op2); \ + } \ +} +#define UNROLL2(w, op1, op2) { \ + uint32 _x; \ + for (_x = w; _x >= 2; _x -= 2) { \ + op1; \ + REPEAT2(op2); \ + } \ + if (_x) { \ + op1; \ + op2; \ + } \ +} + +#define SKEW(r,g,b,skew) { r += skew; g += skew; b += skew; } +#define SKEW4(r,g,b,a,skew) { r += skew; g += skew; b += skew; a+= skew; } + +#define A1 (((uint32)0xffL)<<24) +#define PACK(r,g,b) \ + ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|A1) +#define PACK4(r,g,b,a) \ + ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|((uint32)(a)<<24)) +#define W2B(v) (((v)>>8)&0xff) +#define PACKW(r,g,b) \ + ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|A1) +#define PACKW4(r,g,b,a) \ + ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|((uint32)W2B(a)<<24)) + +#define DECLAREContigPutFunc(name) \ +static void name(\ + TIFFRGBAImage* img, \ + uint32* cp, \ + uint32 x, uint32 y, \ + uint32 w, uint32 h, \ + int32 fromskew, int32 toskew, \ + unsigned char* pp \ +) + +/* + * 8-bit palette => colormap/RGB + */ +DECLAREContigPutFunc(put8bitcmaptile) +{ + uint32** PALmap = img->PALmap; + int samplesperpixel = img->samplesperpixel; + + (void) y; + while (h-- > 0) { + for (x = w; x-- > 0;) + { + *cp++ = PALmap[*pp][0]; + pp += samplesperpixel; + } + cp += toskew; + pp += fromskew; + } +} + +/* + * 4-bit palette => colormap/RGB + */ +DECLAREContigPutFunc(put4bitcmaptile) +{ + uint32** PALmap = img->PALmap; + + (void) x; (void) y; + fromskew /= 2; + while (h-- > 0) { + uint32* bw; + UNROLL2(w, bw = PALmap[*pp++], *cp++ = *bw++); + cp += toskew; + pp += fromskew; + } +} + +/* + * 2-bit palette => colormap/RGB + */ +DECLAREContigPutFunc(put2bitcmaptile) +{ + uint32** PALmap = img->PALmap; + + (void) x; (void) y; + fromskew /= 4; + while (h-- > 0) { + uint32* bw; + UNROLL4(w, bw = PALmap[*pp++], *cp++ = *bw++); + cp += toskew; + pp += fromskew; + } +} + +/* + * 1-bit palette => colormap/RGB + */ +DECLAREContigPutFunc(put1bitcmaptile) +{ + uint32** PALmap = img->PALmap; + + (void) x; (void) y; + fromskew /= 8; + while (h-- > 0) { + uint32* bw; + UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++); + cp += toskew; + pp += fromskew; + } +} + +/* + * 8-bit greyscale => colormap/RGB + */ +DECLAREContigPutFunc(putgreytile) +{ + int samplesperpixel = img->samplesperpixel; + uint32** BWmap = img->BWmap; + + (void) y; + while (h-- > 0) { + for (x = w; x-- > 0;) + { + *cp++ = BWmap[*pp][0]; + pp += samplesperpixel; + } + cp += toskew; + pp += fromskew; + } +} + +/* + * 16-bit greyscale => colormap/RGB + */ +DECLAREContigPutFunc(put16bitbwtile) +{ + int samplesperpixel = img->samplesperpixel; + uint32** BWmap = img->BWmap; + + (void) y; + while (h-- > 0) { + uint16 *wp = (uint16 *) pp; + + for (x = w; x-- > 0;) + { + /* use high order byte of 16bit value */ + + *cp++ = BWmap[*wp >> 8][0]; + pp += 2 * samplesperpixel; + wp += samplesperpixel; + } + cp += toskew; + pp += fromskew; + } +} + +/* + * 1-bit bilevel => colormap/RGB + */ +DECLAREContigPutFunc(put1bitbwtile) +{ + uint32** BWmap = img->BWmap; + + (void) x; (void) y; + fromskew /= 8; + while (h-- > 0) { + uint32* bw; + UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++); + cp += toskew; + pp += fromskew; + } +} + +/* + * 2-bit greyscale => colormap/RGB + */ +DECLAREContigPutFunc(put2bitbwtile) +{ + uint32** BWmap = img->BWmap; + + (void) x; (void) y; + fromskew /= 4; + while (h-- > 0) { + uint32* bw; + UNROLL4(w, bw = BWmap[*pp++], *cp++ = *bw++); + cp += toskew; + pp += fromskew; + } +} + +/* + * 4-bit greyscale => colormap/RGB + */ +DECLAREContigPutFunc(put4bitbwtile) +{ + uint32** BWmap = img->BWmap; + + (void) x; (void) y; + fromskew /= 2; + while (h-- > 0) { + uint32* bw; + UNROLL2(w, bw = BWmap[*pp++], *cp++ = *bw++); + cp += toskew; + pp += fromskew; + } +} + +/* + * 8-bit packed samples, no Map => RGB + */ +DECLAREContigPutFunc(putRGBcontig8bittile) +{ + int samplesperpixel = img->samplesperpixel; + + (void) x; (void) y; + fromskew *= samplesperpixel; + while (h-- > 0) { + UNROLL8(w, NOP, + *cp++ = PACK(pp[0], pp[1], pp[2]); + pp += samplesperpixel); + cp += toskew; + pp += fromskew; + } +} + +/* + * 8-bit packed samples => RGBA w/ associated alpha + * (known to have Map == NULL) + */ +DECLAREContigPutFunc(putRGBAAcontig8bittile) +{ + int samplesperpixel = img->samplesperpixel; + + (void) x; (void) y; + fromskew *= samplesperpixel; + while (h-- > 0) { + UNROLL8(w, NOP, + *cp++ = PACK4(pp[0], pp[1], pp[2], pp[3]); + pp += samplesperpixel); + cp += toskew; + pp += fromskew; + } +} + +/* + * 8-bit packed samples => RGBA w/ unassociated alpha + * (known to have Map == NULL) + */ +DECLAREContigPutFunc(putRGBUAcontig8bittile) +{ + int samplesperpixel = img->samplesperpixel; + (void) y; + fromskew *= samplesperpixel; + while (h-- > 0) { + uint32 r, g, b, a; + for (x = w; x-- > 0;) { + a = pp[3]; + r = (a*pp[0] + 127) / 255; + g = (a*pp[1] + 127) / 255; + b = (a*pp[2] + 127) / 255; + *cp++ = PACK4(r,g,b,a); + pp += samplesperpixel; + } + cp += toskew; + pp += fromskew; + } +} + +/* + * 16-bit packed samples => RGB + */ +DECLAREContigPutFunc(putRGBcontig16bittile) +{ + int samplesperpixel = img->samplesperpixel; + uint16 *wp = (uint16 *)pp; + (void) y; + fromskew *= samplesperpixel; + while (h-- > 0) { + for (x = w; x-- > 0;) { + *cp++ = PACKW(wp[0],wp[1],wp[2]); + wp += samplesperpixel; + } + cp += toskew; + wp += fromskew; + } +} + +/* + * 16-bit packed samples => RGBA w/ associated alpha + * (known to have Map == NULL) + */ +DECLAREContigPutFunc(putRGBAAcontig16bittile) +{ + int samplesperpixel = img->samplesperpixel; + uint16 *wp = (uint16 *)pp; + (void) y; + fromskew *= samplesperpixel; + while (h-- > 0) { + for (x = w; x-- > 0;) { + *cp++ = PACKW4(wp[0],wp[1],wp[2],wp[3]); + wp += samplesperpixel; + } + cp += toskew; + wp += fromskew; + } +} + +/* + * 16-bit packed samples => RGBA w/ unassociated alpha + * (known to have Map == NULL) + */ +DECLAREContigPutFunc(putRGBUAcontig16bittile) +{ + int samplesperpixel = img->samplesperpixel; + uint16 *wp = (uint16 *)pp; + (void) y; + fromskew *= samplesperpixel; + while (h-- > 0) { + uint32 r,g,b,a; + for (x = w; x-- > 0;) { + a = W2B(wp[3]); + r = (a*W2B(wp[0]) + 127) / 255; + g = (a*W2B(wp[1]) + 127) / 255; + b = (a*W2B(wp[2]) + 127) / 255; + *cp++ = PACK4(r,g,b,a); + wp += samplesperpixel; + } + cp += toskew; + wp += fromskew; + } +} + +/* + * 8-bit packed CMYK samples w/o Map => RGB + * + * NB: The conversion of CMYK->RGB is *very* crude. + */ +DECLAREContigPutFunc(putRGBcontig8bitCMYKtile) +{ + int samplesperpixel = img->samplesperpixel; + uint16 r, g, b, k; + + (void) x; (void) y; + fromskew *= samplesperpixel; + while (h-- > 0) { + UNROLL8(w, NOP, + k = 255 - pp[3]; + r = (k*(255-pp[0]))/255; + g = (k*(255-pp[1]))/255; + b = (k*(255-pp[2]))/255; + *cp++ = PACK(r, g, b); + pp += samplesperpixel); + cp += toskew; + pp += fromskew; + } +} + +/* + * 8-bit packed CMYK samples w/Map => RGB + * + * NB: The conversion of CMYK->RGB is *very* crude. + */ +DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile) +{ + int samplesperpixel = img->samplesperpixel; + TIFFRGBValue* Map = img->Map; + uint16 r, g, b, k; + + (void) y; + fromskew *= samplesperpixel; + while (h-- > 0) { + for (x = w; x-- > 0;) { + k = 255 - pp[3]; + r = (k*(255-pp[0]))/255; + g = (k*(255-pp[1]))/255; + b = (k*(255-pp[2]))/255; + *cp++ = PACK(Map[r], Map[g], Map[b]); + pp += samplesperpixel; + } + pp += fromskew; + cp += toskew; + } +} + +#define DECLARESepPutFunc(name) \ +static void name(\ + TIFFRGBAImage* img,\ + uint32* cp,\ + uint32 x, uint32 y, \ + uint32 w, uint32 h,\ + int32 fromskew, int32 toskew,\ + unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a\ +) + +/* + * 8-bit unpacked samples => RGB + */ +DECLARESepPutFunc(putRGBseparate8bittile) +{ + (void) img; (void) x; (void) y; (void) a; + while (h-- > 0) { + UNROLL8(w, NOP, *cp++ = PACK(*r++, *g++, *b++)); + SKEW(r, g, b, fromskew); + cp += toskew; + } +} + +/* + * 8-bit unpacked samples => RGBA w/ associated alpha + */ +DECLARESepPutFunc(putRGBAAseparate8bittile) +{ + (void) img; (void) x; (void) y; + while (h-- > 0) { + UNROLL8(w, NOP, *cp++ = PACK4(*r++, *g++, *b++, *a++)); + SKEW4(r, g, b, a, fromskew); + cp += toskew; + } +} + +/* + * 8-bit unpacked samples => RGBA w/ unassociated alpha + */ +DECLARESepPutFunc(putRGBUAseparate8bittile) +{ + (void) img; (void) y; + while (h-- > 0) { + uint32 rv, gv, bv, av; + for (x = w; x-- > 0;) { + av = *a++; + rv = (av* *r++ + 127) / 255; + gv = (av* *g++ + 127) / 255; + bv = (av* *b++ + 127) / 255; + *cp++ = PACK4(rv,gv,bv,av); + } + SKEW4(r, g, b, a, fromskew); + cp += toskew; + } +} + +/* + * 16-bit unpacked samples => RGB + */ +DECLARESepPutFunc(putRGBseparate16bittile) +{ + uint16 *wr = (uint16*) r; + uint16 *wg = (uint16*) g; + uint16 *wb = (uint16*) b; + (void) img; (void) y; (void) a; + while (h-- > 0) { + for (x = 0; x < w; x++) + *cp++ = PACKW(*wr++,*wg++,*wb++); + SKEW(wr, wg, wb, fromskew); + cp += toskew; + } +} + +/* + * 16-bit unpacked samples => RGBA w/ associated alpha + */ +DECLARESepPutFunc(putRGBAAseparate16bittile) +{ + uint16 *wr = (uint16*) r; + uint16 *wg = (uint16*) g; + uint16 *wb = (uint16*) b; + uint16 *wa = (uint16*) a; + (void) img; (void) y; + while (h-- > 0) { + for (x = 0; x < w; x++) + *cp++ = PACKW4(*wr++,*wg++,*wb++,*wa++); + SKEW4(wr, wg, wb, wa, fromskew); + cp += toskew; + } +} + +/* + * 16-bit unpacked samples => RGBA w/ unassociated alpha + */ +DECLARESepPutFunc(putRGBUAseparate16bittile) +{ + uint16 *wr = (uint16*) r; + uint16 *wg = (uint16*) g; + uint16 *wb = (uint16*) b; + uint16 *wa = (uint16*) a; + (void) img; (void) y; + while (h-- > 0) { + uint32 r,g,b,a; + for (x = w; x-- > 0;) { + a = W2B(*wa++); + r = (a*W2B(*wr++) + 127) / 255; + g = (a*W2B(*wg++) + 127) / 255; + b = (a*W2B(*wb++) + 127) / 255; + *cp++ = PACK4(r,g,b,a); + } + SKEW4(wr, wg, wb, wa, fromskew); + cp += toskew; + } +} + +/* + * 8-bit packed CIE L*a*b 1976 samples => RGB + */ +DECLAREContigPutFunc(putcontig8bitCIELab) +{ + float X, Y, Z; + uint32 r, g, b; + (void) y; + fromskew *= 3; + while (h-- > 0) { + for (x = w; x-- > 0;) { + TIFFCIELabToXYZ(img->cielab, + (unsigned char)pp[0], + (signed char)pp[1], + (signed char)pp[2], + &X, &Y, &Z); + TIFFXYZToRGB(img->cielab, X, Y, Z, &r, &g, &b); + *cp++ = PACK(r, g, b); + pp += 3; + } + cp += toskew; + pp += fromskew; + } +} + +/* + * YCbCr -> RGB conversion and packing routines. + */ + +#define YCbCrtoRGB(dst, Y) { \ + uint32 r, g, b; \ + TIFFYCbCrtoRGB(img->ycbcr, (Y), Cb, Cr, &r, &g, &b); \ + dst = PACK(r, g, b); \ +} + +/* + * 8-bit packed YCbCr samples => RGB + * This function is generic for different sampling sizes, + * and can handle blocks sizes that aren't multiples of the + * sampling size. However, it is substantially less optimized + * than the specific sampling cases. It is used as a fallback + * for difficult blocks. + */ +#ifdef notdef +static void putcontig8bitYCbCrGenericTile( + TIFFRGBAImage* img, + uint32* cp, + uint32 x, uint32 y, + uint32 w, uint32 h, + int32 fromskew, int32 toskew, + unsigned char* pp, + int h_group, + int v_group ) + +{ + uint32* cp1 = cp+w+toskew; + uint32* cp2 = cp1+w+toskew; + uint32* cp3 = cp2+w+toskew; + int32 incr = 3*w+4*toskew; + int32 Cb, Cr; + int group_size = v_group * h_group + 2; + + (void) y; + fromskew = (fromskew * group_size) / h_group; + + for( yy = 0; yy < h; yy++ ) + { + unsigned char *pp_line; + int y_line_group = yy / v_group; + int y_remainder = yy - y_line_group * v_group; + + pp_line = pp + v_line_group * + + + for( xx = 0; xx < w; xx++ ) + { + Cb = pp + } + } + for (; h >= 4; h -= 4) { + x = w>>2; + do { + Cb = pp[16]; + Cr = pp[17]; + + YCbCrtoRGB(cp [0], pp[ 0]); + YCbCrtoRGB(cp [1], pp[ 1]); + YCbCrtoRGB(cp [2], pp[ 2]); + YCbCrtoRGB(cp [3], pp[ 3]); + YCbCrtoRGB(cp1[0], pp[ 4]); + YCbCrtoRGB(cp1[1], pp[ 5]); + YCbCrtoRGB(cp1[2], pp[ 6]); + YCbCrtoRGB(cp1[3], pp[ 7]); + YCbCrtoRGB(cp2[0], pp[ 8]); + YCbCrtoRGB(cp2[1], pp[ 9]); + YCbCrtoRGB(cp2[2], pp[10]); + YCbCrtoRGB(cp2[3], pp[11]); + YCbCrtoRGB(cp3[0], pp[12]); + YCbCrtoRGB(cp3[1], pp[13]); + YCbCrtoRGB(cp3[2], pp[14]); + YCbCrtoRGB(cp3[3], pp[15]); + + cp += 4, cp1 += 4, cp2 += 4, cp3 += 4; + pp += 18; + } while (--x); + cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; + pp += fromskew; + } +} +#endif + +/* + * 8-bit packed YCbCr samples w/ 4,4 subsampling => RGB + */ +DECLAREContigPutFunc(putcontig8bitYCbCr44tile) +{ + uint32* cp1 = cp+w+toskew; + uint32* cp2 = cp1+w+toskew; + uint32* cp3 = cp2+w+toskew; + int32 incr = 3*w+4*toskew; + + (void) y; + /* adjust fromskew */ + fromskew = (fromskew * 18) / 4; + if ((h & 3) == 0 && (w & 3) == 0) { + for (; h >= 4; h -= 4) { + x = w>>2; + do { + int32 Cb = pp[16]; + int32 Cr = pp[17]; + + YCbCrtoRGB(cp [0], pp[ 0]); + YCbCrtoRGB(cp [1], pp[ 1]); + YCbCrtoRGB(cp [2], pp[ 2]); + YCbCrtoRGB(cp [3], pp[ 3]); + YCbCrtoRGB(cp1[0], pp[ 4]); + YCbCrtoRGB(cp1[1], pp[ 5]); + YCbCrtoRGB(cp1[2], pp[ 6]); + YCbCrtoRGB(cp1[3], pp[ 7]); + YCbCrtoRGB(cp2[0], pp[ 8]); + YCbCrtoRGB(cp2[1], pp[ 9]); + YCbCrtoRGB(cp2[2], pp[10]); + YCbCrtoRGB(cp2[3], pp[11]); + YCbCrtoRGB(cp3[0], pp[12]); + YCbCrtoRGB(cp3[1], pp[13]); + YCbCrtoRGB(cp3[2], pp[14]); + YCbCrtoRGB(cp3[3], pp[15]); + + cp += 4, cp1 += 4, cp2 += 4, cp3 += 4; + pp += 18; + } while (--x); + cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; + pp += fromskew; + } + } else { + while (h > 0) { + for (x = w; x > 0;) { + int32 Cb = pp[16]; + int32 Cr = pp[17]; + switch (x) { + default: + switch (h) { + default: YCbCrtoRGB(cp3[3], pp[15]); /* FALLTHROUGH */ + case 3: YCbCrtoRGB(cp2[3], pp[11]); /* FALLTHROUGH */ + case 2: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */ + case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */ + } /* FALLTHROUGH */ + case 3: + switch (h) { + default: YCbCrtoRGB(cp3[2], pp[14]); /* FALLTHROUGH */ + case 3: YCbCrtoRGB(cp2[2], pp[10]); /* FALLTHROUGH */ + case 2: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */ + case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */ + } /* FALLTHROUGH */ + case 2: + switch (h) { + default: YCbCrtoRGB(cp3[1], pp[13]); /* FALLTHROUGH */ + case 3: YCbCrtoRGB(cp2[1], pp[ 9]); /* FALLTHROUGH */ + case 2: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */ + case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */ + } /* FALLTHROUGH */ + case 1: + switch (h) { + default: YCbCrtoRGB(cp3[0], pp[12]); /* FALLTHROUGH */ + case 3: YCbCrtoRGB(cp2[0], pp[ 8]); /* FALLTHROUGH */ + case 2: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */ + case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */ + } /* FALLTHROUGH */ + } + if (x < 4) { + cp += x; cp1 += x; cp2 += x; cp3 += x; + x = 0; + } + else { + cp += 4; cp1 += 4; cp2 += 4; cp3 += 4; + x -= 4; + } + pp += 18; + } + if (h <= 4) + break; + h -= 4; + cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; + pp += fromskew; + } + } +} + +/* + * 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB + */ +DECLAREContigPutFunc(putcontig8bitYCbCr42tile) +{ + uint32* cp1 = cp+w+toskew; + int32 incr = 2*toskew+w; + + (void) y; + fromskew = (fromskew * 10) / 4; + if ((h & 3) == 0 && (w & 1) == 0) { + for (; h >= 2; h -= 2) { + x = w>>2; + do { + int32 Cb = pp[8]; + int32 Cr = pp[9]; + + YCbCrtoRGB(cp [0], pp[0]); + YCbCrtoRGB(cp [1], pp[1]); + YCbCrtoRGB(cp [2], pp[2]); + YCbCrtoRGB(cp [3], pp[3]); + YCbCrtoRGB(cp1[0], pp[4]); + YCbCrtoRGB(cp1[1], pp[5]); + YCbCrtoRGB(cp1[2], pp[6]); + YCbCrtoRGB(cp1[3], pp[7]); + + cp += 4, cp1 += 4; + pp += 10; + } while (--x); + cp += incr, cp1 += incr; + pp += fromskew; + } + } else { + while (h > 0) { + for (x = w; x > 0;) { + int32 Cb = pp[8]; + int32 Cr = pp[9]; + switch (x) { + default: + switch (h) { + default: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */ + case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */ + } /* FALLTHROUGH */ + case 3: + switch (h) { + default: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */ + case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */ + } /* FALLTHROUGH */ + case 2: + switch (h) { + default: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */ + case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */ + } /* FALLTHROUGH */ + case 1: + switch (h) { + default: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */ + case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */ + } /* FALLTHROUGH */ + } + if (x < 4) { + cp += x; cp1 += x; + x = 0; + } + else { + cp += 4; cp1 += 4; + x -= 4; + } + pp += 10; + } + if (h <= 2) + break; + h -= 2; + cp += incr, cp1 += incr; + pp += fromskew; + } + } +} + +/* + * 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB + */ +DECLAREContigPutFunc(putcontig8bitYCbCr41tile) +{ + (void) y; + /* XXX adjust fromskew */ + do { + x = w>>2; + do { + int32 Cb = pp[4]; + int32 Cr = pp[5]; + + YCbCrtoRGB(cp [0], pp[0]); + YCbCrtoRGB(cp [1], pp[1]); + YCbCrtoRGB(cp [2], pp[2]); + YCbCrtoRGB(cp [3], pp[3]); + + cp += 4; + pp += 6; + } while (--x); + + if( (w&3) != 0 ) + { + int32 Cb = pp[4]; + int32 Cr = pp[5]; + + switch( (w&3) ) { + case 3: YCbCrtoRGB(cp [2], pp[2]); + case 2: YCbCrtoRGB(cp [1], pp[1]); + case 1: YCbCrtoRGB(cp [0], pp[0]); + case 0: break; + } + + cp += (w&3); + pp += 6; + } + + cp += toskew; + pp += fromskew; + } while (--h); + +} + +/* + * 8-bit packed YCbCr samples w/ 2,2 subsampling => RGB + */ +DECLAREContigPutFunc(putcontig8bitYCbCr22tile) +{ + uint32* cp2; + (void) y; + fromskew = (fromskew / 2) * 6; + cp2 = cp+w+toskew; + while (h>=2) { + x = w; + while (x>=2) { + uint32 Cb = pp[4]; + uint32 Cr = pp[5]; + YCbCrtoRGB(cp[0], pp[0]); + YCbCrtoRGB(cp[1], pp[1]); + YCbCrtoRGB(cp2[0], pp[2]); + YCbCrtoRGB(cp2[1], pp[3]); + cp += 2; + cp2 += 2; + pp += 6; + x -= 2; + } + if (x==1) { + uint32 Cb = pp[4]; + uint32 Cr = pp[5]; + YCbCrtoRGB(cp[0], pp[0]); + YCbCrtoRGB(cp2[0], pp[2]); + cp ++ ; + cp2 ++ ; + pp += 6; + } + cp += toskew*2+w; + cp2 += toskew*2+w; + pp += fromskew; + h-=2; + } + if (h==1) { + x = w; + while (x>=2) { + uint32 Cb = pp[4]; + uint32 Cr = pp[5]; + YCbCrtoRGB(cp[0], pp[0]); + YCbCrtoRGB(cp[1], pp[1]); + cp += 2; + cp2 += 2; + pp += 6; + x -= 2; + } + if (x==1) { + uint32 Cb = pp[4]; + uint32 Cr = pp[5]; + YCbCrtoRGB(cp[0], pp[0]); + } + } +} + +/* + * 8-bit packed YCbCr samples w/ 2,1 subsampling => RGB + */ +DECLAREContigPutFunc(putcontig8bitYCbCr21tile) +{ + (void) y; + fromskew = (fromskew * 4) / 2; + do { + x = w>>1; + do { + int32 Cb = pp[2]; + int32 Cr = pp[3]; + + YCbCrtoRGB(cp[0], pp[0]); + YCbCrtoRGB(cp[1], pp[1]); + + cp += 2; + pp += 4; + } while (--x); + + if( (w&1) != 0 ) + { + int32 Cb = pp[2]; + int32 Cr = pp[3]; + + YCbCrtoRGB(cp[0], pp[0]); + + cp += 1; + pp += 4; + } + + cp += toskew; + pp += fromskew; + } while (--h); +} + +/* + * 8-bit packed YCbCr samples w/ 1,2 subsampling => RGB + */ +DECLAREContigPutFunc(putcontig8bitYCbCr12tile) +{ + uint32* cp2; + (void) y; + fromskew = (fromskew / 2) * 4; + cp2 = cp+w+toskew; + while (h>=2) { + x = w; + do { + uint32 Cb = pp[2]; + uint32 Cr = pp[3]; + YCbCrtoRGB(cp[0], pp[0]); + YCbCrtoRGB(cp2[0], pp[1]); + cp ++; + cp2 ++; + pp += 4; + } while (--x); + cp += toskew*2+w; + cp2 += toskew*2+w; + pp += fromskew; + h-=2; + } + if (h==1) { + x = w; + do { + uint32 Cb = pp[2]; + uint32 Cr = pp[3]; + YCbCrtoRGB(cp[0], pp[0]); + cp ++; + pp += 4; + } while (--x); + } +} + +/* + * 8-bit packed YCbCr samples w/ no subsampling => RGB + */ +DECLAREContigPutFunc(putcontig8bitYCbCr11tile) +{ + (void) y; + fromskew *= 3; + do { + x = w; /* was x = w>>1; patched 2000/09/25 warmerda@home.com */ + do { + int32 Cb = pp[1]; + int32 Cr = pp[2]; + + YCbCrtoRGB(*cp++, pp[0]); + + pp += 3; + } while (--x); + cp += toskew; + pp += fromskew; + } while (--h); +} + +/* + * 8-bit packed YCbCr samples w/ no subsampling => RGB + */ +DECLARESepPutFunc(putseparate8bitYCbCr11tile) +{ + (void) y; + (void) a; + /* TODO: naming of input vars is still off, change obfuscating declaration inside define, or resolve obfuscation */ + while (h-- > 0) { + x = w; + do { + uint32 dr, dg, db; + TIFFYCbCrtoRGB(img->ycbcr,*r++,*g++,*b++,&dr,&dg,&db); + *cp++ = PACK(dr,dg,db); + } while (--x); + SKEW(r, g, b, fromskew); + cp += toskew; + } +} +#undef YCbCrtoRGB + +static int +initYCbCrConversion(TIFFRGBAImage* img) +{ + static char module[] = "initYCbCrConversion"; + + float *luma, *refBlackWhite; + + if (img->ycbcr == NULL) { + img->ycbcr = (TIFFYCbCrToRGB*) _TIFFmalloc( + TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long)) + + 4*256*sizeof (TIFFRGBValue) + + 2*256*sizeof (int) + + 3*256*sizeof (int32) + ); + if (img->ycbcr == NULL) { + TIFFErrorExt(img->tif->tif_clientdata, module, + "No space for YCbCr->RGB conversion state"); + return (0); + } + } + + TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRCOEFFICIENTS, &luma); + TIFFGetFieldDefaulted(img->tif, TIFFTAG_REFERENCEBLACKWHITE, + &refBlackWhite); + if (TIFFYCbCrToRGBInit(img->ycbcr, luma, refBlackWhite) < 0) + return(0); + return (1); +} + +static tileContigRoutine +initCIELabConversion(TIFFRGBAImage* img) +{ + static char module[] = "initCIELabConversion"; + + float *whitePoint; + float refWhite[3]; + + if (!img->cielab) { + img->cielab = (TIFFCIELabToRGB *) + _TIFFmalloc(sizeof(TIFFCIELabToRGB)); + if (!img->cielab) { + TIFFErrorExt(img->tif->tif_clientdata, module, + "No space for CIE L*a*b*->RGB conversion state."); + return NULL; + } + } + + TIFFGetFieldDefaulted(img->tif, TIFFTAG_WHITEPOINT, &whitePoint); + refWhite[1] = 100.0F; + refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1]; + refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1]) + / whitePoint[1] * refWhite[1]; + if (TIFFCIELabToRGBInit(img->cielab, &display_sRGB, refWhite) < 0) { + TIFFErrorExt(img->tif->tif_clientdata, module, + "Failed to initialize CIE L*a*b*->RGB conversion state."); + _TIFFfree(img->cielab); + return NULL; + } + + return putcontig8bitCIELab; +} + +/* + * Greyscale images with less than 8 bits/sample are handled + * with a table to avoid lots of shifts and masks. The table + * is setup so that put*bwtile (below) can retrieve 8/bitspersample + * pixel values simply by indexing into the table with one + * number. + */ +static int +makebwmap(TIFFRGBAImage* img) +{ + TIFFRGBValue* Map = img->Map; + int bitspersample = img->bitspersample; + int nsamples = 8 / bitspersample; + int i; + uint32* p; + + if( nsamples == 0 ) + nsamples = 1; + + img->BWmap = (uint32**) _TIFFmalloc( + 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32))); + if (img->BWmap == NULL) { + TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No space for B&W mapping table"); + return (0); + } + p = (uint32*)(img->BWmap + 256); + for (i = 0; i < 256; i++) { + TIFFRGBValue c; + img->BWmap[i] = p; + switch (bitspersample) { +#define GREY(x) c = Map[x]; *p++ = PACK(c,c,c); + case 1: + GREY(i>>7); + GREY((i>>6)&1); + GREY((i>>5)&1); + GREY((i>>4)&1); + GREY((i>>3)&1); + GREY((i>>2)&1); + GREY((i>>1)&1); + GREY(i&1); + break; + case 2: + GREY(i>>6); + GREY((i>>4)&3); + GREY((i>>2)&3); + GREY(i&3); + break; + case 4: + GREY(i>>4); + GREY(i&0xf); + break; + case 8: + case 16: + GREY(i); + break; + } +#undef GREY + } + return (1); +} + +/* + * Construct a mapping table to convert from the range + * of the data samples to [0,255] --for display. This + * process also handles inverting B&W images when needed. + */ +static int +setupMap(TIFFRGBAImage* img) +{ + int32 x, range; + + range = (int32)((1L<bitspersample)-1); + + /* treat 16 bit the same as eight bit */ + if( img->bitspersample == 16 ) + range = (int32) 255; + + img->Map = (TIFFRGBValue*) _TIFFmalloc((range+1) * sizeof (TIFFRGBValue)); + if (img->Map == NULL) { + TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), + "No space for photometric conversion table"); + return (0); + } + if (img->photometric == PHOTOMETRIC_MINISWHITE) { + for (x = 0; x <= range; x++) + img->Map[x] = (TIFFRGBValue) (((range - x) * 255) / range); + } else { + for (x = 0; x <= range; x++) + img->Map[x] = (TIFFRGBValue) ((x * 255) / range); + } + if (img->bitspersample <= 16 && + (img->photometric == PHOTOMETRIC_MINISBLACK || + img->photometric == PHOTOMETRIC_MINISWHITE)) { + /* + * Use photometric mapping table to construct + * unpacking tables for samples <= 8 bits. + */ + if (!makebwmap(img)) + return (0); + /* no longer need Map, free it */ + _TIFFfree(img->Map), img->Map = NULL; + } + return (1); +} + +static int +checkcmap(TIFFRGBAImage* img) +{ + uint16* r = img->redcmap; + uint16* g = img->greencmap; + uint16* b = img->bluecmap; + long n = 1L<bitspersample; + + while (n-- > 0) + if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256) + return (16); + return (8); +} + +static void +cvtcmap(TIFFRGBAImage* img) +{ + uint16* r = img->redcmap; + uint16* g = img->greencmap; + uint16* b = img->bluecmap; + long i; + + for (i = (1L<bitspersample)-1; i >= 0; i--) { +#define CVT(x) ((uint16)((x)>>8)) + r[i] = CVT(r[i]); + g[i] = CVT(g[i]); + b[i] = CVT(b[i]); +#undef CVT + } +} + +/* + * Palette images with <= 8 bits/sample are handled + * with a table to avoid lots of shifts and masks. The table + * is setup so that put*cmaptile (below) can retrieve 8/bitspersample + * pixel values simply by indexing into the table with one + * number. + */ +static int +makecmap(TIFFRGBAImage* img) +{ + int bitspersample = img->bitspersample; + int nsamples = 8 / bitspersample; + uint16* r = img->redcmap; + uint16* g = img->greencmap; + uint16* b = img->bluecmap; + uint32 *p; + int i; + + img->PALmap = (uint32**) _TIFFmalloc( + 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32))); + if (img->PALmap == NULL) { + TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No space for Palette mapping table"); + return (0); + } + p = (uint32*)(img->PALmap + 256); + for (i = 0; i < 256; i++) { + TIFFRGBValue c; + img->PALmap[i] = p; +#define CMAP(x) c = (TIFFRGBValue) x; *p++ = PACK(r[c]&0xff, g[c]&0xff, b[c]&0xff); + switch (bitspersample) { + case 1: + CMAP(i>>7); + CMAP((i>>6)&1); + CMAP((i>>5)&1); + CMAP((i>>4)&1); + CMAP((i>>3)&1); + CMAP((i>>2)&1); + CMAP((i>>1)&1); + CMAP(i&1); + break; + case 2: + CMAP(i>>6); + CMAP((i>>4)&3); + CMAP((i>>2)&3); + CMAP(i&3); + break; + case 4: + CMAP(i>>4); + CMAP(i&0xf); + break; + case 8: + CMAP(i); + break; + } +#undef CMAP + } + return (1); +} + +/* + * Construct any mapping table used + * by the associated put routine. + */ +static int +buildMap(TIFFRGBAImage* img) +{ + switch (img->photometric) { + case PHOTOMETRIC_RGB: + case PHOTOMETRIC_YCBCR: + case PHOTOMETRIC_SEPARATED: + if (img->bitspersample == 8) + break; + /* fall thru... */ + case PHOTOMETRIC_MINISBLACK: + case PHOTOMETRIC_MINISWHITE: + if (!setupMap(img)) + return (0); + break; + case PHOTOMETRIC_PALETTE: + /* + * Convert 16-bit colormap to 8-bit (unless it looks + * like an old-style 8-bit colormap). + */ + if (checkcmap(img) == 16) + cvtcmap(img); + else + TIFFWarningExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "Assuming 8-bit colormap"); + /* + * Use mapping table and colormap to construct + * unpacking tables for samples < 8 bits. + */ + if (img->bitspersample <= 8 && !makecmap(img)) + return (0); + break; + } + return (1); +} + +/* + * Select the appropriate conversion routine for packed data. + */ +static int +PickContigCase(TIFFRGBAImage* img) +{ + img->get = TIFFIsTiled(img->tif) ? gtTileContig : gtStripContig; + img->put.contig = NULL; + switch (img->photometric) { + case PHOTOMETRIC_RGB: + switch (img->bitspersample) { + case 8: + if (img->alpha == EXTRASAMPLE_ASSOCALPHA) + img->put.contig = putRGBAAcontig8bittile; + else if (img->alpha == EXTRASAMPLE_UNASSALPHA) + { + img->put.contig = putRGBUAcontig8bittile; + } + else + img->put.contig = putRGBcontig8bittile; + break; + case 16: + if (img->alpha == EXTRASAMPLE_ASSOCALPHA) + { + img->put.contig = putRGBAAcontig16bittile; + } + else if (img->alpha == EXTRASAMPLE_UNASSALPHA) + { + img->put.contig = putRGBUAcontig16bittile; + } + else + { + img->put.contig = putRGBcontig16bittile; + } + break; + } + break; + case PHOTOMETRIC_SEPARATED: + if (buildMap(img)) { + if (img->bitspersample == 8) { + if (!img->Map) + img->put.contig = putRGBcontig8bitCMYKtile; + else + img->put.contig = putRGBcontig8bitCMYKMaptile; + } + } + break; + case PHOTOMETRIC_PALETTE: + if (buildMap(img)) { + switch (img->bitspersample) { + case 8: + img->put.contig = put8bitcmaptile; + break; + case 4: + img->put.contig = put4bitcmaptile; + break; + case 2: + img->put.contig = put2bitcmaptile; + break; + case 1: + img->put.contig = put1bitcmaptile; + break; + } + } + break; + case PHOTOMETRIC_MINISWHITE: + case PHOTOMETRIC_MINISBLACK: + if (buildMap(img)) { + switch (img->bitspersample) { + case 16: + img->put.contig = put16bitbwtile; + break; + case 8: + img->put.contig = putgreytile; + break; + case 4: + img->put.contig = put4bitbwtile; + break; + case 2: + img->put.contig = put2bitbwtile; + break; + case 1: + img->put.contig = put1bitbwtile; + break; + } + } + break; + case PHOTOMETRIC_YCBCR: + if (img->bitspersample == 8) + { + if (initYCbCrConversion(img)!=0) + { + /* + * The 6.0 spec says that subsampling must be + * one of 1, 2, or 4, and that vertical subsampling + * must always be <= horizontal subsampling; so + * there are only a few possibilities and we just + * enumerate the cases. + * Joris: added support for the [1,2] case, nonetheless, to accomodate + * some OJPEG files + */ + uint16 SubsamplingHor; + uint16 SubsamplingVer; + TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &SubsamplingHor, &SubsamplingVer); + switch ((SubsamplingHor<<4)|SubsamplingVer) { + case 0x44: + img->put.contig = putcontig8bitYCbCr44tile; + break; + case 0x42: + img->put.contig = putcontig8bitYCbCr42tile; + break; + case 0x41: + img->put.contig = putcontig8bitYCbCr41tile; + break; + case 0x22: + img->put.contig = putcontig8bitYCbCr22tile; + break; + case 0x21: + img->put.contig = putcontig8bitYCbCr21tile; + break; + case 0x12: + img->put.contig = putcontig8bitYCbCr12tile; + break; + case 0x11: + img->put.contig = putcontig8bitYCbCr11tile; + break; + } + } + } + break; + case PHOTOMETRIC_CIELAB: + if (buildMap(img)) { + if (img->bitspersample == 8) + img->put.contig = initCIELabConversion(img); + break; + } + } + return ((img->get!=NULL) && (img->put.contig!=NULL)); +} + +/* + * Select the appropriate conversion routine for unpacked data. + * + * NB: we assume that unpacked single channel data is directed + * to the "packed routines. + */ +static int +PickSeparateCase(TIFFRGBAImage* img) +{ + img->get = TIFFIsTiled(img->tif) ? gtTileSeparate : gtStripSeparate; + img->put.separate = NULL; + switch (img->photometric) { + case PHOTOMETRIC_RGB: + switch (img->bitspersample) { + case 8: + if (img->alpha == EXTRASAMPLE_ASSOCALPHA) + img->put.separate = putRGBAAseparate8bittile; + else if (img->alpha == EXTRASAMPLE_UNASSALPHA) + { + img->put.separate = putRGBUAseparate8bittile; + } + else + img->put.separate = putRGBseparate8bittile; + break; + case 16: + if (img->alpha == EXTRASAMPLE_ASSOCALPHA) + { + img->put.separate = putRGBAAseparate16bittile; + } + else if (img->alpha == EXTRASAMPLE_UNASSALPHA) + { + img->put.separate = putRGBUAseparate16bittile; + } + else + { + img->put.separate = putRGBseparate16bittile; + } + break; + } + break; + case PHOTOMETRIC_YCBCR: + if ((img->bitspersample==8) && (img->samplesperpixel==3)) + { + if (initYCbCrConversion(img)!=0) + { + uint16 hs, vs; + TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &hs, &vs); + switch ((hs<<4)|vs) { + case 0x11: + img->put.separate = putseparate8bitYCbCr11tile; + break; + /* TODO: add other cases here */ + } + } + } + break; + } + return ((img->get!=NULL) && (img->put.separate!=NULL)); +} + +/* + * Read a whole strip off data from the file, and convert to RGBA form. + * If this is the last strip, then it will only contain the portion of + * the strip that is actually within the image space. The result is + * organized in bottom to top form. + */ + + +int +TIFFReadRGBAStrip(TIFF* tif, uint32 row, uint32 * raster ) + +{ + char emsg[1024] = ""; + TIFFRGBAImage img; + int ok; + uint32 rowsperstrip, rows_to_read; + + if( TIFFIsTiled( tif ) ) + { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), + "Can't use TIFFReadRGBAStrip() with tiled file."); + return (0); + } + + TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); + if( (row % rowsperstrip) != 0 ) + { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), + "Row passed to TIFFReadRGBAStrip() must be first in a strip."); + return (0); + } + + if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, 0, emsg)) { + + img.row_offset = row; + img.col_offset = 0; + + if( row + rowsperstrip > img.height ) + rows_to_read = img.height - row; + else + rows_to_read = rowsperstrip; + + ok = TIFFRGBAImageGet(&img, raster, img.width, rows_to_read ); + + TIFFRGBAImageEnd(&img); + } else { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg); + ok = 0; + } + + return (ok); +} + +/* + * Read a whole tile off data from the file, and convert to RGBA form. + * The returned RGBA data is organized from bottom to top of tile, + * and may include zeroed areas if the tile extends off the image. + */ + +int +TIFFReadRGBATile(TIFF* tif, uint32 col, uint32 row, uint32 * raster) + +{ + char emsg[1024] = ""; + TIFFRGBAImage img; + int ok; + uint32 tile_xsize, tile_ysize; + uint32 read_xsize, read_ysize; + uint32 i_row; + + /* + * Verify that our request is legal - on a tile file, and on a + * tile boundary. + */ + + if( !TIFFIsTiled( tif ) ) + { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), + "Can't use TIFFReadRGBATile() with stripped file."); + return (0); + } + + TIFFGetFieldDefaulted(tif, TIFFTAG_TILEWIDTH, &tile_xsize); + TIFFGetFieldDefaulted(tif, TIFFTAG_TILELENGTH, &tile_ysize); + if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 ) + { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), + "Row/col passed to TIFFReadRGBATile() must be top" + "left corner of a tile."); + return (0); + } + + /* + * Setup the RGBA reader. + */ + + if (!TIFFRGBAImageOK(tif, emsg) + || !TIFFRGBAImageBegin(&img, tif, 0, emsg)) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg); + return( 0 ); + } + + /* + * The TIFFRGBAImageGet() function doesn't allow us to get off the + * edge of the image, even to fill an otherwise valid tile. So we + * figure out how much we can read, and fix up the tile buffer to + * a full tile configuration afterwards. + */ + + if( row + tile_ysize > img.height ) + read_ysize = img.height - row; + else + read_ysize = tile_ysize; + + if( col + tile_xsize > img.width ) + read_xsize = img.width - col; + else + read_xsize = tile_xsize; + + /* + * Read the chunk of imagery. + */ + + img.row_offset = row; + img.col_offset = col; + + ok = TIFFRGBAImageGet(&img, raster, read_xsize, read_ysize ); + + TIFFRGBAImageEnd(&img); + + /* + * If our read was incomplete we will need to fix up the tile by + * shifting the data around as if a full tile of data is being returned. + * + * This is all the more complicated because the image is organized in + * bottom to top format. + */ + + if( read_xsize == tile_xsize && read_ysize == tile_ysize ) + return( ok ); + + for( i_row = 0; i_row < read_ysize; i_row++ ) { + memmove( raster + (tile_ysize - i_row - 1) * tile_xsize, + raster + (read_ysize - i_row - 1) * read_xsize, + read_xsize * sizeof(uint32) ); + _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize, + 0, sizeof(uint32) * (tile_xsize - read_xsize) ); + } + + for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) { + _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize, + 0, sizeof(uint32) * tile_xsize ); + } + + return (ok); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_jbig.c b/src/3rdparty/libtiff/libtiff/tif_jbig.c new file mode 100644 index 0000000000..99183ba74e --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_jbig.c @@ -0,0 +1,378 @@ +/* $Id: tif_jbig.c,v 1.2.2.2 2008-10-21 13:13:07 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * JBIG Compression Algorithm Support. + * Contributed by Lee Howard + * + */ + +#include "tiffiop.h" + +#ifdef JBIG_SUPPORT +#include "jbig.h" + +typedef struct +{ + uint32 recvparams; /* encoded Class 2 session params */ + char* subaddress; /* subaddress string */ + uint32 recvtime; /* time spend receiving in seconds */ + char* faxdcs; /* encoded fax parameters (DCS, Table 2/T.30) */ + + TIFFVGetMethod vgetparent; + TIFFVSetMethod vsetparent; +} JBIGState; + +#define GetJBIGState(tif) ((JBIGState*)(tif)->tif_data) + +#define FIELD_RECVPARAMS (FIELD_CODEC+0) +#define FIELD_SUBADDRESS (FIELD_CODEC+1) +#define FIELD_RECVTIME (FIELD_CODEC+2) +#define FIELD_FAXDCS (FIELD_CODEC+3) + +static const TIFFFieldInfo jbigFieldInfo[] = +{ + {TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, FIELD_RECVPARAMS, TRUE, FALSE, "FaxRecvParams"}, + {TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, FIELD_SUBADDRESS, TRUE, FALSE, "FaxSubAddress"}, + {TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, FIELD_RECVTIME, TRUE, FALSE, "FaxRecvTime"}, + {TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, FIELD_FAXDCS, TRUE, FALSE, "FaxDcs"}, +}; + +static int JBIGSetupDecode(TIFF* tif) +{ + if (TIFFNumberOfStrips(tif) != 1) + { + TIFFError("JBIG", "Multistrip images not supported in decoder"); + return 0; + } + + return 1; +} + +static int JBIGDecode(TIFF* tif, tidata_t buffer, tsize_t size, tsample_t s) +{ + struct jbg_dec_state decoder; + int decodeStatus = 0; + unsigned char* pImage = NULL; + (void) size, (void) s; + + if (isFillOrder(tif, tif->tif_dir.td_fillorder)) + { + TIFFReverseBits(tif->tif_rawdata, tif->tif_rawdatasize); + } + + jbg_dec_init(&decoder); + +#if defined(HAVE_JBG_NEWLEN) + jbg_newlen(tif->tif_rawdata, tif->tif_rawdatasize); + /* + * I do not check the return status of jbg_newlen because even if this + * function fails it does not necessarily mean that decoding the image + * will fail. It is generally only needed for received fax images + * that do not contain the actual length of the image in the BIE + * header. I do not log when an error occurs because that will cause + * problems when converting JBIG encoded TIFF's to + * PostScript. As long as the actual image length is contained in the + * BIE header jbg_dec_in should succeed. + */ +#endif /* HAVE_JBG_NEWLEN */ + + decodeStatus = jbg_dec_in(&decoder, tif->tif_rawdata, + tif->tif_rawdatasize, NULL); + if (JBG_EOK != decodeStatus) + { + /* + * XXX: JBG_EN constant was defined in pre-2.0 releases of the + * JBIG-KIT. Since the 2.0 the error reporting functions were + * changed. We will handle both cases here. + */ + TIFFError("JBIG", "Error (%d) decoding: %s", decodeStatus, +#if defined(JBG_EN) + jbg_strerror(decodeStatus, JBG_EN) +#else + jbg_strerror(decodeStatus) +#endif + ); + return 0; + } + + pImage = jbg_dec_getimage(&decoder, 0); + _TIFFmemcpy(buffer, pImage, jbg_dec_getsize(&decoder)); + jbg_dec_free(&decoder); + return 1; +} + +static int JBIGSetupEncode(TIFF* tif) +{ + if (TIFFNumberOfStrips(tif) != 1) + { + TIFFError("JBIG", "Multistrip images not supported in encoder"); + return 0; + } + + return 1; +} + +static int JBIGCopyEncodedData(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) +{ + (void) s; + while (cc > 0) + { + tsize_t n = cc; + + if (tif->tif_rawcc + n > tif->tif_rawdatasize) + { + n = tif->tif_rawdatasize - tif->tif_rawcc; + } + + assert(n > 0); + _TIFFmemcpy(tif->tif_rawcp, pp, n); + tif->tif_rawcp += n; + tif->tif_rawcc += n; + pp += n; + cc -= n; + if (tif->tif_rawcc >= tif->tif_rawdatasize && + !TIFFFlushData1(tif)) + { + return (-1); + } + } + + return (1); +} + +static void JBIGOutputBie(unsigned char* buffer, size_t len, void *userData) +{ + TIFF* tif = (TIFF*)userData; + + if (isFillOrder(tif, tif->tif_dir.td_fillorder)) + { + TIFFReverseBits(buffer, len); + } + + JBIGCopyEncodedData(tif, buffer, len, 0); +} + +static int JBIGEncode(TIFF* tif, tidata_t buffer, tsize_t size, tsample_t s) +{ + TIFFDirectory* dir = &tif->tif_dir; + struct jbg_enc_state encoder; + + (void) size, (void) s; + + jbg_enc_init(&encoder, + dir->td_imagewidth, + dir->td_imagelength, + 1, + &buffer, + JBIGOutputBie, + tif); + /* + * jbg_enc_out does the "real" encoding. As data is encoded, + * JBIGOutputBie is called, which writes the data to the directory. + */ + jbg_enc_out(&encoder); + jbg_enc_free(&encoder); + + return 1; +} + +static void JBIGCleanup(TIFF* tif) +{ + JBIGState *sp = GetJBIGState(tif); + + assert(sp != 0); + + tif->tif_tagmethods.vgetfield = sp->vgetparent; + tif->tif_tagmethods.vsetfield = sp->vsetparent; + + _TIFFfree(tif->tif_data); + tif->tif_data = NULL; + + _TIFFSetDefaultCompressionState(tif); +} + +static void JBIGPrintDir(TIFF* tif, FILE* fd, long flags) +{ + JBIGState* codec = GetJBIGState(tif); + (void)flags; + + if (TIFFFieldSet(tif, FIELD_RECVPARAMS)) + { + fprintf(fd, + " Fax Receive Parameters: %08lx\n", + (unsigned long)codec->recvparams); + } + + if (TIFFFieldSet(tif, FIELD_SUBADDRESS)) + { + fprintf(fd, + " Fax SubAddress: %s\n", + codec->subaddress); + } + + if (TIFFFieldSet(tif, FIELD_RECVTIME)) + { + fprintf(fd, + " Fax Receive Time: %lu secs\n", + (unsigned long)codec->recvtime); + } + + if (TIFFFieldSet(tif, FIELD_FAXDCS)) + { + fprintf(fd, + " Fax DCS: %s\n", + codec->faxdcs); + } +} + +static int JBIGVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + JBIGState* codec = GetJBIGState(tif); + + switch (tag) + { + case TIFFTAG_FAXRECVPARAMS: + *va_arg(ap, uint32*) = codec->recvparams; + break; + + case TIFFTAG_FAXSUBADDRESS: + *va_arg(ap, char**) = codec->subaddress; + break; + + case TIFFTAG_FAXRECVTIME: + *va_arg(ap, uint32*) = codec->recvtime; + break; + + case TIFFTAG_FAXDCS: + *va_arg(ap, char**) = codec->faxdcs; + break; + + default: + return (*codec->vgetparent)(tif, tag, ap); + } + + return 1; +} + +static int JBIGVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + JBIGState* codec = GetJBIGState(tif); + + switch (tag) + { + case TIFFTAG_FAXRECVPARAMS: + codec->recvparams = va_arg(ap, uint32); + break; + + case TIFFTAG_FAXSUBADDRESS: + _TIFFsetString(&codec->subaddress, va_arg(ap, char*)); + break; + + case TIFFTAG_FAXRECVTIME: + codec->recvtime = va_arg(ap, uint32); + break; + + case TIFFTAG_FAXDCS: + _TIFFsetString(&codec->faxdcs, va_arg(ap, char*)); + break; + + default: + return (*codec->vsetparent)(tif, tag, ap); + } + + TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit); + tif->tif_flags |= TIFF_DIRTYDIRECT; + return 1; +} + +int TIFFInitJBIG(TIFF* tif, int scheme) +{ + JBIGState* codec = NULL; + + assert(scheme == COMPRESSION_JBIG); + + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, jbigFieldInfo, + TIFFArrayCount(jbigFieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, "TIFFInitJBIG", + "Merging JBIG codec-specific tags failed"); + return 0; + } + + /* Allocate memory for the JBIGState structure.*/ + tif->tif_data = (tdata_t)_TIFFmalloc(sizeof(JBIGState)); + if (tif->tif_data == NULL) + { + TIFFError("TIFFInitJBIG", "Not enough memory for JBIGState"); + return 0; + } + _TIFFmemset(tif->tif_data, 0, sizeof(JBIGState)); + codec = GetJBIGState(tif); + + /* Initialize codec private fields */ + codec->recvparams = 0; + codec->subaddress = NULL; + codec->faxdcs = NULL; + codec->recvtime = 0; + + /* + * Override parent get/set field methods. + */ + codec->vgetparent = tif->tif_tagmethods.vgetfield; + codec->vsetparent = tif->tif_tagmethods.vsetfield; + tif->tif_tagmethods.vgetfield = JBIGVGetField; + tif->tif_tagmethods.vsetfield = JBIGVSetField; + tif->tif_tagmethods.printdir = JBIGPrintDir; + + /* + * These flags are set so the JBIG Codec can control when to reverse + * bits and when not to and to allow the jbig decoder and bit reverser + * to write to memory when necessary. + */ + tif->tif_flags |= TIFF_NOBITREV; + tif->tif_flags &= ~TIFF_MAPPED; + + /* Setup the function pointers for encode, decode, and cleanup. */ + tif->tif_setupdecode = JBIGSetupDecode; + tif->tif_decodestrip = JBIGDecode; + + tif->tif_setupencode = JBIGSetupEncode; + tif->tif_encodestrip = JBIGEncode; + + tif->tif_cleanup = JBIGCleanup; + + return 1; +} + +#endif /* JBIG_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ + diff --git a/src/3rdparty/libtiff/libtiff/tif_jpeg.c b/src/3rdparty/libtiff/libtiff/tif_jpeg.c new file mode 100644 index 0000000000..74b0d3f860 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_jpeg.c @@ -0,0 +1,2035 @@ +/* $Id: tif_jpeg.c,v 1.50.2.4 2009-08-30 16:21:46 bfriesen Exp $ */ + +/* + * Copyright (c) 1994-1997 Sam Leffler + * Copyright (c) 1994-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN + +#include "tiffiop.h" +#ifdef JPEG_SUPPORT + +/* + * TIFF Library + * + * JPEG Compression support per TIFF Technical Note #2 + * (*not* per the original TIFF 6.0 spec). + * + * This file is simply an interface to the libjpeg library written by + * the Independent JPEG Group. You need release 5 or later of the IJG + * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/. + * + * Contributed by Tom Lane . + */ +#include + +int TIFFFillStrip(TIFF*, tstrip_t); +int TIFFFillTile(TIFF*, ttile_t); + +/* We undefine FAR to avoid conflict with JPEG definition */ + +#ifdef FAR +#undef FAR +#endif + +/* + Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is + not defined. Unfortunately, the MinGW and Borland compilers include + a typedef for INT32, which causes a conflict. MSVC does not include + a conficting typedef given the headers which are included. +*/ +#if defined(__BORLANDC__) || defined(__MINGW32__) +# define XMD_H 1 +#endif + +/* + The windows RPCNDR.H file defines boolean, but defines it with the + unsigned char size. You should compile JPEG library using appropriate + definitions in jconfig.h header, but many users compile library in wrong + way. That causes errors of the following type: + + "JPEGLib: JPEG parameter struct mismatch: library thinks size is 432, + caller expects 464" + + For such users we wil fix the problem here. See install.doc file from + the JPEG library distribution for details. +*/ + +/* Define "boolean" as unsigned char, not int, per Windows custom. */ +#if defined(WIN32) && !defined(__MINGW32__) +# ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ + typedef unsigned char boolean; +# endif +# define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + +#include "jpeglib.h" +#include "jerror.h" + +/* + * We are using width_in_blocks which is supposed to be private to + * libjpeg. Unfortunately, the libjpeg delivered with Cygwin has + * renamed this member to width_in_data_units. Since the header has + * also renamed a define, use that unique define name in order to + * detect the problem header and adjust to suit. + */ +#if defined(D_MAX_DATA_UNITS_IN_MCU) +#define width_in_blocks width_in_data_units +#endif + +/* + * On some machines it may be worthwhile to use _setjmp or sigsetjmp + * in place of plain setjmp. These macros will make it easier. + */ +#define SETJMP(jbuf) setjmp(jbuf) +#define LONGJMP(jbuf,code) longjmp(jbuf,code) +#define JMP_BUF jmp_buf + +typedef struct jpeg_destination_mgr jpeg_destination_mgr; +typedef struct jpeg_source_mgr jpeg_source_mgr; +typedef struct jpeg_error_mgr jpeg_error_mgr; + +/* + * State block for each open TIFF file using + * libjpeg to do JPEG compression/decompression. + * + * libjpeg's visible state is either a jpeg_compress_struct + * or jpeg_decompress_struct depending on which way we + * are going. comm can be used to refer to the fields + * which are common to both. + * + * NB: cinfo is required to be the first member of JPEGState, + * so we can safely cast JPEGState* -> jpeg_xxx_struct* + * and vice versa! + */ +typedef struct { + union { + struct jpeg_compress_struct c; + struct jpeg_decompress_struct d; + struct jpeg_common_struct comm; + } cinfo; /* NB: must be first */ + int cinfo_initialized; + + jpeg_error_mgr err; /* libjpeg error manager */ + JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */ + /* + * The following two members could be a union, but + * they're small enough that it's not worth the effort. + */ + jpeg_destination_mgr dest; /* data dest for compression */ + jpeg_source_mgr src; /* data source for decompression */ + /* private state */ + TIFF* tif; /* back link needed by some code */ + uint16 photometric; /* copy of PhotometricInterpretation */ + uint16 h_sampling; /* luminance sampling factors */ + uint16 v_sampling; + tsize_t bytesperline; /* decompressed bytes per scanline */ + /* pointers to intermediate buffers when processing downsampled data */ + JSAMPARRAY ds_buffer[MAX_COMPONENTS]; + int scancount; /* number of "scanlines" accumulated */ + int samplesperclump; + + TIFFVGetMethod vgetparent; /* super-class method */ + TIFFVSetMethod vsetparent; /* super-class method */ + TIFFPrintMethod printdir; /* super-class method */ + TIFFStripMethod defsparent; /* super-class method */ + TIFFTileMethod deftparent; /* super-class method */ + /* pseudo-tag fields */ + void* jpegtables; /* JPEGTables tag value, or NULL */ + uint32 jpegtables_length; /* number of bytes in same */ + int jpegquality; /* Compression quality level */ + int jpegcolormode; /* Auto RGB<=>YCbCr convert? */ + int jpegtablesmode; /* What to put in JPEGTables */ + + int ycbcrsampling_fetched; + uint32 recvparams; /* encoded Class 2 session params */ + char* subaddress; /* subaddress string */ + uint32 recvtime; /* time spent receiving (secs) */ + char* faxdcs; /* encoded fax parameters (DCS, Table 2/T.30) */ +} JPEGState; + +#define JState(tif) ((JPEGState*)(tif)->tif_data) + +static int JPEGDecode(TIFF*, tidata_t, tsize_t, tsample_t); +static int JPEGDecodeRaw(TIFF*, tidata_t, tsize_t, tsample_t); +static int JPEGEncode(TIFF*, tidata_t, tsize_t, tsample_t); +static int JPEGEncodeRaw(TIFF*, tidata_t, tsize_t, tsample_t); +static int JPEGInitializeLibJPEG( TIFF * tif, + int force_encode, int force_decode ); + +#define FIELD_JPEGTABLES (FIELD_CODEC+0) +#define FIELD_RECVPARAMS (FIELD_CODEC+1) +#define FIELD_SUBADDRESS (FIELD_CODEC+2) +#define FIELD_RECVTIME (FIELD_CODEC+3) +#define FIELD_FAXDCS (FIELD_CODEC+4) + +static const TIFFFieldInfo jpegFieldInfo[] = { + { TIFFTAG_JPEGTABLES, -3,-3, TIFF_UNDEFINED, FIELD_JPEGTABLES, + FALSE, TRUE, "JPEGTables" }, + { TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, FIELD_PSEUDO, + TRUE, FALSE, "" }, + { TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO, + FALSE, FALSE, "" }, + { TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO, + FALSE, FALSE, "" }, + /* Specific for JPEG in faxes */ + { TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, FIELD_RECVPARAMS, + TRUE, FALSE, "FaxRecvParams" }, + { TIFFTAG_FAXSUBADDRESS, -1,-1, TIFF_ASCII, FIELD_SUBADDRESS, + TRUE, FALSE, "FaxSubAddress" }, + { TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, FIELD_RECVTIME, + TRUE, FALSE, "FaxRecvTime" }, + { TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, FIELD_FAXDCS, + TRUE, FALSE, "FaxDcs" }, +}; +#define N(a) (sizeof (a) / sizeof (a[0])) + +/* + * libjpeg interface layer. + * + * We use setjmp/longjmp to return control to libtiff + * when a fatal error is encountered within the JPEG + * library. We also direct libjpeg error and warning + * messages through the appropriate libtiff handlers. + */ + +/* + * Error handling routines (these replace corresponding + * IJG routines from jerror.c). These are used for both + * compression and decompression. + */ +static void +TIFFjpeg_error_exit(j_common_ptr cinfo) +{ + JPEGState *sp = (JPEGState *) cinfo; /* NB: cinfo assumed first */ + char buffer[JMSG_LENGTH_MAX]; + + (*cinfo->err->format_message) (cinfo, buffer); + TIFFErrorExt(sp->tif->tif_clientdata, "JPEGLib", "%s", buffer); /* display the error message */ + jpeg_abort(cinfo); /* clean up libjpeg state */ + LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */ +} + +/* + * This routine is invoked only for warning messages, + * since error_exit does its own thing and trace_level + * is never set > 0. + */ +static void +TIFFjpeg_output_message(j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + + (*cinfo->err->format_message) (cinfo, buffer); + TIFFWarningExt(((JPEGState *) cinfo)->tif->tif_clientdata, "JPEGLib", "%s", buffer); +} + +/* + * Interface routines. This layer of routines exists + * primarily to limit side-effects from using setjmp. + * Also, normal/error returns are converted into return + * values per libtiff practice. + */ +#define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op)) +#define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1)) + +static int +TIFFjpeg_create_compress(JPEGState* sp) +{ + /* initialize JPEG error handling */ + sp->cinfo.c.err = jpeg_std_error(&sp->err); + sp->err.error_exit = TIFFjpeg_error_exit; + sp->err.output_message = TIFFjpeg_output_message; + + return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c)); +} + +static int +TIFFjpeg_create_decompress(JPEGState* sp) +{ + /* initialize JPEG error handling */ + sp->cinfo.d.err = jpeg_std_error(&sp->err); + sp->err.error_exit = TIFFjpeg_error_exit; + sp->err.output_message = TIFFjpeg_output_message; + + return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d)); +} + +static int +TIFFjpeg_set_defaults(JPEGState* sp) +{ + return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c)); +} + +static int +TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace) +{ + return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace)); +} + +static int +TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline) +{ + return CALLVJPEG(sp, + jpeg_set_quality(&sp->cinfo.c, quality, force_baseline)); +} + +static int +TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress) +{ + return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress)); +} + +static int +TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables) +{ + return CALLVJPEG(sp, + jpeg_start_compress(&sp->cinfo.c, write_all_tables)); +} + +static int +TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines) +{ + return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c, + scanlines, (JDIMENSION) num_lines)); +} + +static int +TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines) +{ + return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c, + data, (JDIMENSION) num_lines)); +} + +static int +TIFFjpeg_finish_compress(JPEGState* sp) +{ + return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c)); +} + +static int +TIFFjpeg_write_tables(JPEGState* sp) +{ + return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c)); +} + +static int +TIFFjpeg_read_header(JPEGState* sp, boolean require_image) +{ + return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image)); +} + +static int +TIFFjpeg_start_decompress(JPEGState* sp) +{ + return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d)); +} + +static int +TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines) +{ + return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d, + scanlines, (JDIMENSION) max_lines)); +} + +static int +TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines) +{ + return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d, + data, (JDIMENSION) max_lines)); +} + +static int +TIFFjpeg_finish_decompress(JPEGState* sp) +{ + return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d)); +} + +static int +TIFFjpeg_abort(JPEGState* sp) +{ + return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm)); +} + +static int +TIFFjpeg_destroy(JPEGState* sp) +{ + return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm)); +} + +static JSAMPARRAY +TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id, + JDIMENSION samplesperrow, JDIMENSION numrows) +{ + return CALLJPEG(sp, (JSAMPARRAY) NULL, + (*sp->cinfo.comm.mem->alloc_sarray) + (&sp->cinfo.comm, pool_id, samplesperrow, numrows)); +} + +/* + * JPEG library destination data manager. + * These routines direct compressed data from libjpeg into the + * libtiff output buffer. + */ + +static void +std_init_destination(j_compress_ptr cinfo) +{ + JPEGState* sp = (JPEGState*) cinfo; + TIFF* tif = sp->tif; + + sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata; + sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize; +} + +static boolean +std_empty_output_buffer(j_compress_ptr cinfo) +{ + JPEGState* sp = (JPEGState*) cinfo; + TIFF* tif = sp->tif; + + /* the entire buffer has been filled */ + tif->tif_rawcc = tif->tif_rawdatasize; + TIFFFlushData1(tif); + sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata; + sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize; + + return (TRUE); +} + +static void +std_term_destination(j_compress_ptr cinfo) +{ + JPEGState* sp = (JPEGState*) cinfo; + TIFF* tif = sp->tif; + + tif->tif_rawcp = (tidata_t) sp->dest.next_output_byte; + tif->tif_rawcc = + tif->tif_rawdatasize - (tsize_t) sp->dest.free_in_buffer; + /* NB: libtiff does the final buffer flush */ +} + +static void +TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif) +{ + (void) tif; + sp->cinfo.c.dest = &sp->dest; + sp->dest.init_destination = std_init_destination; + sp->dest.empty_output_buffer = std_empty_output_buffer; + sp->dest.term_destination = std_term_destination; +} + +/* + * Alternate destination manager for outputting to JPEGTables field. + */ + +static void +tables_init_destination(j_compress_ptr cinfo) +{ + JPEGState* sp = (JPEGState*) cinfo; + + /* while building, jpegtables_length is allocated buffer size */ + sp->dest.next_output_byte = (JOCTET*) sp->jpegtables; + sp->dest.free_in_buffer = (size_t) sp->jpegtables_length; +} + +static boolean +tables_empty_output_buffer(j_compress_ptr cinfo) +{ + JPEGState* sp = (JPEGState*) cinfo; + void* newbuf; + + /* the entire buffer has been filled; enlarge it by 1000 bytes */ + newbuf = _TIFFrealloc((tdata_t) sp->jpegtables, + (tsize_t) (sp->jpegtables_length + 1000)); + if (newbuf == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100); + sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length; + sp->dest.free_in_buffer = (size_t) 1000; + sp->jpegtables = newbuf; + sp->jpegtables_length += 1000; + return (TRUE); +} + +static void +tables_term_destination(j_compress_ptr cinfo) +{ + JPEGState* sp = (JPEGState*) cinfo; + + /* set tables length to number of bytes actually emitted */ + sp->jpegtables_length -= sp->dest.free_in_buffer; +} + +static int +TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif) +{ + (void) tif; + /* + * Allocate a working buffer for building tables. + * Initial size is 1000 bytes, which is usually adequate. + */ + if (sp->jpegtables) + _TIFFfree(sp->jpegtables); + sp->jpegtables_length = 1000; + sp->jpegtables = (void*) _TIFFmalloc((tsize_t) sp->jpegtables_length); + if (sp->jpegtables == NULL) { + sp->jpegtables_length = 0; + TIFFErrorExt(sp->tif->tif_clientdata, "TIFFjpeg_tables_dest", "No space for JPEGTables"); + return (0); + } + sp->cinfo.c.dest = &sp->dest; + sp->dest.init_destination = tables_init_destination; + sp->dest.empty_output_buffer = tables_empty_output_buffer; + sp->dest.term_destination = tables_term_destination; + return (1); +} + +/* + * JPEG library source data manager. + * These routines supply compressed data to libjpeg. + */ + +static void +std_init_source(j_decompress_ptr cinfo) +{ + JPEGState* sp = (JPEGState*) cinfo; + TIFF* tif = sp->tif; + + sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata; + sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc; +} + +static boolean +std_fill_input_buffer(j_decompress_ptr cinfo) +{ + JPEGState* sp = (JPEGState* ) cinfo; + static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI }; + + /* + * Should never get here since entire strip/tile is + * read into memory before the decompressor is called, + * and thus was supplied by init_source. + */ + WARNMS(cinfo, JWRN_JPEG_EOF); + /* insert a fake EOI marker */ + sp->src.next_input_byte = dummy_EOI; + sp->src.bytes_in_buffer = 2; + return (TRUE); +} + +static void +std_skip_input_data(j_decompress_ptr cinfo, long num_bytes) +{ + JPEGState* sp = (JPEGState*) cinfo; + + if (num_bytes > 0) { + if (num_bytes > (long) sp->src.bytes_in_buffer) { + /* oops, buffer overrun */ + (void) std_fill_input_buffer(cinfo); + } else { + sp->src.next_input_byte += (size_t) num_bytes; + sp->src.bytes_in_buffer -= (size_t) num_bytes; + } + } +} + +static void +std_term_source(j_decompress_ptr cinfo) +{ + /* No work necessary here */ + /* Or must we update tif->tif_rawcp, tif->tif_rawcc ??? */ + /* (if so, need empty tables_term_source!) */ + (void) cinfo; +} + +static void +TIFFjpeg_data_src(JPEGState* sp, TIFF* tif) +{ + (void) tif; + sp->cinfo.d.src = &sp->src; + sp->src.init_source = std_init_source; + sp->src.fill_input_buffer = std_fill_input_buffer; + sp->src.skip_input_data = std_skip_input_data; + sp->src.resync_to_restart = jpeg_resync_to_restart; + sp->src.term_source = std_term_source; + sp->src.bytes_in_buffer = 0; /* for safety */ + sp->src.next_input_byte = NULL; +} + +/* + * Alternate source manager for reading from JPEGTables. + * We can share all the code except for the init routine. + */ + +static void +tables_init_source(j_decompress_ptr cinfo) +{ + JPEGState* sp = (JPEGState*) cinfo; + + sp->src.next_input_byte = (const JOCTET*) sp->jpegtables; + sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length; +} + +static void +TIFFjpeg_tables_src(JPEGState* sp, TIFF* tif) +{ + TIFFjpeg_data_src(sp, tif); + sp->src.init_source = tables_init_source; +} + +/* + * Allocate downsampled-data buffers needed for downsampled I/O. + * We use values computed in jpeg_start_compress or jpeg_start_decompress. + * We use libjpeg's allocator so that buffers will be released automatically + * when done with strip/tile. + * This is also a handy place to compute samplesperclump, bytesperline. + */ +static int +alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info, + int num_components) +{ + JPEGState* sp = JState(tif); + int ci; + jpeg_component_info* compptr; + JSAMPARRAY buf; + int samples_per_clump = 0; + + for (ci = 0, compptr = comp_info; ci < num_components; + ci++, compptr++) { + samples_per_clump += compptr->h_samp_factor * + compptr->v_samp_factor; + buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE, + compptr->width_in_blocks * DCTSIZE, + (JDIMENSION) (compptr->v_samp_factor*DCTSIZE)); + if (buf == NULL) + return (0); + sp->ds_buffer[ci] = buf; + } + sp->samplesperclump = samples_per_clump; + return (1); +} + + +/* + * JPEG Decoding. + */ + +static int +JPEGSetupDecode(TIFF* tif) +{ + JPEGState* sp = JState(tif); + TIFFDirectory *td = &tif->tif_dir; + + JPEGInitializeLibJPEG( tif, 0, 1 ); + + assert(sp != NULL); + assert(sp->cinfo.comm.is_decompressor); + + /* Read JPEGTables if it is present */ + if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) { + TIFFjpeg_tables_src(sp, tif); + if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) { + TIFFErrorExt(tif->tif_clientdata, "JPEGSetupDecode", "Bogus JPEGTables field"); + return (0); + } + } + + /* Grab parameters that are same for all strips/tiles */ + sp->photometric = td->td_photometric; + switch (sp->photometric) { + case PHOTOMETRIC_YCBCR: + sp->h_sampling = td->td_ycbcrsubsampling[0]; + sp->v_sampling = td->td_ycbcrsubsampling[1]; + break; + default: + /* TIFF 6.0 forbids subsampling of all other color spaces */ + sp->h_sampling = 1; + sp->v_sampling = 1; + break; + } + + /* Set up for reading normal data */ + TIFFjpeg_data_src(sp, tif); + tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */ + return (1); +} + +/* + * Set up for decoding a strip or tile. + */ +static int +JPEGPreDecode(TIFF* tif, tsample_t s) +{ + JPEGState *sp = JState(tif); + TIFFDirectory *td = &tif->tif_dir; + static const char module[] = "JPEGPreDecode"; + uint32 segment_width, segment_height; + int downsampled_output; + int ci; + + assert(sp != NULL); + assert(sp->cinfo.comm.is_decompressor); + /* + * Reset decoder state from any previous strip/tile, + * in case application didn't read the whole strip. + */ + if (!TIFFjpeg_abort(sp)) + return (0); + /* + * Read the header for this strip/tile. + */ + if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK) + return (0); + /* + * Check image parameters and set decompression parameters. + */ + segment_width = td->td_imagewidth; + segment_height = td->td_imagelength - tif->tif_row; + if (isTiled(tif)) { + segment_width = td->td_tilewidth; + segment_height = td->td_tilelength; + sp->bytesperline = TIFFTileRowSize(tif); + } else { + if (segment_height > td->td_rowsperstrip) + segment_height = td->td_rowsperstrip; + sp->bytesperline = TIFFOldScanlineSize(tif); + } + if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) { + /* + * For PC 2, scale down the expected strip/tile size + * to match a downsampled component + */ + segment_width = TIFFhowmany(segment_width, sp->h_sampling); + segment_height = TIFFhowmany(segment_height, sp->v_sampling); + } + if (sp->cinfo.d.image_width < segment_width || + sp->cinfo.d.image_height < segment_height) { + TIFFWarningExt(tif->tif_clientdata, module, + "Improper JPEG strip/tile size, " + "expected %dx%d, got %dx%d", + segment_width, segment_height, + sp->cinfo.d.image_width, + sp->cinfo.d.image_height); + } + if (sp->cinfo.d.image_width > segment_width || + sp->cinfo.d.image_height > segment_height) { + /* + * This case could be dangerous, if the strip or tile size has + * been reported as less than the amount of data jpeg will + * return, some potential security issues arise. Catch this + * case and error out. + */ + TIFFErrorExt(tif->tif_clientdata, module, + "JPEG strip/tile size exceeds expected dimensions," + " expected %dx%d, got %dx%d", + segment_width, segment_height, + sp->cinfo.d.image_width, sp->cinfo.d.image_height); + return (0); + } + if (sp->cinfo.d.num_components != + (td->td_planarconfig == PLANARCONFIG_CONTIG ? + td->td_samplesperpixel : 1)) { + TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG component count"); + return (0); + } +#ifdef JPEG_LIB_MK1 + if (12 != td->td_bitspersample && 8 != td->td_bitspersample) { + TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision"); + return (0); + } + sp->cinfo.d.data_precision = td->td_bitspersample; + sp->cinfo.d.bits_in_jsample = td->td_bitspersample; +#else + if (sp->cinfo.d.data_precision != td->td_bitspersample) { + TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision"); + return (0); + } +#endif + if (td->td_planarconfig == PLANARCONFIG_CONTIG) { + /* Component 0 should have expected sampling factors */ + if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling || + sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) { + TIFFWarningExt(tif->tif_clientdata, module, + "Improper JPEG sampling factors %d,%d\n" + "Apparently should be %d,%d.", + sp->cinfo.d.comp_info[0].h_samp_factor, + sp->cinfo.d.comp_info[0].v_samp_factor, + sp->h_sampling, sp->v_sampling); + + /* + * There are potential security issues here + * for decoders that have already allocated + * buffers based on the expected sampling + * factors. Lets check the sampling factors + * dont exceed what we were expecting. + */ + if (sp->cinfo.d.comp_info[0].h_samp_factor + > sp->h_sampling + || sp->cinfo.d.comp_info[0].v_samp_factor + > sp->v_sampling) { + TIFFErrorExt(tif->tif_clientdata, + module, + "Cannot honour JPEG sampling factors" + " that exceed those specified."); + return (0); + } + + /* + * XXX: Files written by the Intergraph software + * has different sampling factors stored in the + * TIFF tags and in the JPEG structures. We will + * try to deduce Intergraph files by the presense + * of the tag 33918. + */ + if (!_TIFFFindFieldInfo(tif, 33918, TIFF_ANY)) { + TIFFWarningExt(tif->tif_clientdata, module, + "Decompressor will try reading with " + "sampling %d,%d.", + sp->cinfo.d.comp_info[0].h_samp_factor, + sp->cinfo.d.comp_info[0].v_samp_factor); + + sp->h_sampling = (uint16) + sp->cinfo.d.comp_info[0].h_samp_factor; + sp->v_sampling = (uint16) + sp->cinfo.d.comp_info[0].v_samp_factor; + } + } + /* Rest should have sampling factors 1,1 */ + for (ci = 1; ci < sp->cinfo.d.num_components; ci++) { + if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 || + sp->cinfo.d.comp_info[ci].v_samp_factor != 1) { + TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors"); + return (0); + } + } + } else { + /* PC 2's single component should have sampling factors 1,1 */ + if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 || + sp->cinfo.d.comp_info[0].v_samp_factor != 1) { + TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors"); + return (0); + } + } + downsampled_output = FALSE; + if (td->td_planarconfig == PLANARCONFIG_CONTIG && + sp->photometric == PHOTOMETRIC_YCBCR && + sp->jpegcolormode == JPEGCOLORMODE_RGB) { + /* Convert YCbCr to RGB */ + sp->cinfo.d.jpeg_color_space = JCS_YCbCr; + sp->cinfo.d.out_color_space = JCS_RGB; + } else { + /* Suppress colorspace handling */ + sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN; + sp->cinfo.d.out_color_space = JCS_UNKNOWN; + if (td->td_planarconfig == PLANARCONFIG_CONTIG && + (sp->h_sampling != 1 || sp->v_sampling != 1)) + downsampled_output = TRUE; + /* XXX what about up-sampling? */ + } + if (downsampled_output) { + /* Need to use raw-data interface to libjpeg */ + sp->cinfo.d.raw_data_out = TRUE; + tif->tif_decoderow = JPEGDecodeRaw; + tif->tif_decodestrip = JPEGDecodeRaw; + tif->tif_decodetile = JPEGDecodeRaw; + } else { + /* Use normal interface to libjpeg */ + sp->cinfo.d.raw_data_out = FALSE; + tif->tif_decoderow = JPEGDecode; + tif->tif_decodestrip = JPEGDecode; + tif->tif_decodetile = JPEGDecode; + } + /* Start JPEG decompressor */ + if (!TIFFjpeg_start_decompress(sp)) + return (0); + /* Allocate downsampled-data buffers if needed */ + if (downsampled_output) { + if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info, + sp->cinfo.d.num_components)) + return (0); + sp->scancount = DCTSIZE; /* mark buffer empty */ + } + return (1); +} + +/* + * Decode a chunk of pixels. + * "Standard" case: returned data is not downsampled. + */ +/*ARGSUSED*/ static int +JPEGDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) +{ + JPEGState *sp = JState(tif); + tsize_t nrows; + (void) s; + + nrows = cc / sp->bytesperline; + if (cc % sp->bytesperline) + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline not read"); + + if( nrows > (int) sp->cinfo.d.image_height ) + nrows = sp->cinfo.d.image_height; + + /* data is expected to be read in multiples of a scanline */ + if (nrows) + { + JSAMPROW line_work_buf = NULL; + + /* + ** For 6B, only use temporary buffer for 12 bit imagery. + ** For Mk1 always use it. + */ +#if !defined(JPEG_LIB_MK1) + if( sp->cinfo.d.data_precision == 12 ) +#endif + { + line_work_buf = (JSAMPROW) + _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width + * sp->cinfo.d.num_components ); + } + + do { + if( line_work_buf != NULL ) + { + /* + ** In the MK1 case, we aways read into a 16bit buffer, and then + ** pack down to 12bit or 8bit. In 6B case we only read into 16 + ** bit buffer for 12bit data, which we need to repack. + */ + if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1) + return (0); + + if( sp->cinfo.d.data_precision == 12 ) + { + int value_pairs = (sp->cinfo.d.output_width + * sp->cinfo.d.num_components) / 2; + int iPair; + + for( iPair = 0; iPair < value_pairs; iPair++ ) + { + unsigned char *out_ptr = + ((unsigned char *) buf) + iPair * 3; + JSAMPLE *in_ptr = line_work_buf + iPair * 2; + + out_ptr[0] = (in_ptr[0] & 0xff0) >> 4; + out_ptr[1] = ((in_ptr[0] & 0xf) << 4) + | ((in_ptr[1] & 0xf00) >> 8); + out_ptr[2] = ((in_ptr[1] & 0xff) >> 0); + } + } + else if( sp->cinfo.d.data_precision == 8 ) + { + int value_count = (sp->cinfo.d.output_width + * sp->cinfo.d.num_components); + int iValue; + + for( iValue = 0; iValue < value_count; iValue++ ) + { + ((unsigned char *) buf)[iValue] = + line_work_buf[iValue] & 0xff; + } + } + } + else + { + /* + ** In the libjpeg6b 8bit case. We read directly into the + ** TIFF buffer. + */ + JSAMPROW bufptr = (JSAMPROW)buf; + + if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1) + return (0); + } + + ++tif->tif_row; + buf += sp->bytesperline; + cc -= sp->bytesperline; + } while (--nrows > 0); + + if( line_work_buf != NULL ) + _TIFFfree( line_work_buf ); + } + + /* Close down the decompressor if we've finished the strip or tile. */ + return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height + || TIFFjpeg_finish_decompress(sp); +} + +/* + * Decode a chunk of pixels. + * Returned data is downsampled per sampling factors. + */ +/*ARGSUSED*/ static int +JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) +{ + JPEGState *sp = JState(tif); + tsize_t nrows; + (void) s; + + /* data is expected to be read in multiples of a scanline */ + if ( (nrows = sp->cinfo.d.image_height) ) { + /* Cb,Cr both have sampling factors 1, so this is correct */ + JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width; + int samples_per_clump = sp->samplesperclump; + +#ifdef JPEG_LIB_MK1 + unsigned short* tmpbuf = _TIFFmalloc(sizeof(unsigned short) * + sp->cinfo.d.output_width * + sp->cinfo.d.num_components); +#endif + + do { + jpeg_component_info *compptr; + int ci, clumpoffset; + + /* Reload downsampled-data buffer if needed */ + if (sp->scancount >= DCTSIZE) { + int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE; + if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n) + return (0); + sp->scancount = 0; + } + /* + * Fastest way to unseparate data is to make one pass + * over the scanline for each row of each component. + */ + clumpoffset = 0; /* first sample in clump */ + for (ci = 0, compptr = sp->cinfo.d.comp_info; + ci < sp->cinfo.d.num_components; + ci++, compptr++) { + int hsamp = compptr->h_samp_factor; + int vsamp = compptr->v_samp_factor; + int ypos; + + for (ypos = 0; ypos < vsamp; ypos++) { + JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos]; +#ifdef JPEG_LIB_MK1 + JSAMPLE *outptr = (JSAMPLE*)tmpbuf + clumpoffset; +#else + JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset; +#endif + JDIMENSION nclump; + + if (hsamp == 1) { + /* fast path for at least Cb and Cr */ + for (nclump = clumps_per_line; nclump-- > 0; ) { + outptr[0] = *inptr++; + outptr += samples_per_clump; + } + } else { + int xpos; + + /* general case */ + for (nclump = clumps_per_line; nclump-- > 0; ) { + for (xpos = 0; xpos < hsamp; xpos++) + outptr[xpos] = *inptr++; + outptr += samples_per_clump; + } + } + clumpoffset += hsamp; + } + } + +#ifdef JPEG_LIB_MK1 + { + if (sp->cinfo.d.data_precision == 8) + { + int i=0; + int len = sp->cinfo.d.output_width * sp->cinfo.d.num_components; + for (i=0; icinfo.d.output_width + * sp->cinfo.d.num_components) / 2; + int iPair; + for( iPair = 0; iPair < value_pairs; iPair++ ) + { + unsigned char *out_ptr = ((unsigned char *) buf) + iPair * 3; + JSAMPLE *in_ptr = tmpbuf + iPair * 2; + out_ptr[0] = (in_ptr[0] & 0xff0) >> 4; + out_ptr[1] = ((in_ptr[0] & 0xf) << 4) + | ((in_ptr[1] & 0xf00) >> 8); + out_ptr[2] = ((in_ptr[1] & 0xff) >> 0); + } + } + } +#endif + + sp->scancount ++; + tif->tif_row += sp->v_sampling; + /* increment/decrement of buf and cc is still incorrect, but should not matter + * TODO: resolve this */ + buf += sp->bytesperline; + cc -= sp->bytesperline; + nrows -= sp->v_sampling; + } while (nrows > 0); + +#ifdef JPEG_LIB_MK1 + _TIFFfree(tmpbuf); +#endif + + } + + /* Close down the decompressor if done. */ + return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height + || TIFFjpeg_finish_decompress(sp); +} + + +/* + * JPEG Encoding. + */ + +static void +unsuppress_quant_table (JPEGState* sp, int tblno) +{ + JQUANT_TBL* qtbl; + + if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL) + qtbl->sent_table = FALSE; +} + +static void +unsuppress_huff_table (JPEGState* sp, int tblno) +{ + JHUFF_TBL* htbl; + + if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL) + htbl->sent_table = FALSE; + if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL) + htbl->sent_table = FALSE; +} + +static int +prepare_JPEGTables(TIFF* tif) +{ + JPEGState* sp = JState(tif); + + JPEGInitializeLibJPEG( tif, 0, 0 ); + + /* Initialize quant tables for current quality setting */ + if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) + return (0); + /* Mark only the tables we want for output */ + /* NB: chrominance tables are currently used only with YCbCr */ + if (!TIFFjpeg_suppress_tables(sp, TRUE)) + return (0); + if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) { + unsuppress_quant_table(sp, 0); + if (sp->photometric == PHOTOMETRIC_YCBCR) + unsuppress_quant_table(sp, 1); + } + if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) { + unsuppress_huff_table(sp, 0); + if (sp->photometric == PHOTOMETRIC_YCBCR) + unsuppress_huff_table(sp, 1); + } + /* Direct libjpeg output into jpegtables */ + if (!TIFFjpeg_tables_dest(sp, tif)) + return (0); + /* Emit tables-only datastream */ + if (!TIFFjpeg_write_tables(sp)) + return (0); + + return (1); +} + +static int +JPEGSetupEncode(TIFF* tif) +{ + JPEGState* sp = JState(tif); + TIFFDirectory *td = &tif->tif_dir; + static const char module[] = "JPEGSetupEncode"; + + JPEGInitializeLibJPEG( tif, 1, 0 ); + + assert(sp != NULL); + assert(!sp->cinfo.comm.is_decompressor); + + /* + * Initialize all JPEG parameters to default values. + * Note that jpeg_set_defaults needs legal values for + * in_color_space and input_components. + */ + sp->cinfo.c.in_color_space = JCS_UNKNOWN; + sp->cinfo.c.input_components = 1; + if (!TIFFjpeg_set_defaults(sp)) + return (0); + /* Set per-file parameters */ + sp->photometric = td->td_photometric; + switch (sp->photometric) { + case PHOTOMETRIC_YCBCR: + sp->h_sampling = td->td_ycbcrsubsampling[0]; + sp->v_sampling = td->td_ycbcrsubsampling[1]; + /* + * A ReferenceBlackWhite field *must* be present since the + * default value is inappropriate for YCbCr. Fill in the + * proper value if application didn't set it. + */ + { + float *ref; + if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE, + &ref)) { + float refbw[6]; + long top = 1L << td->td_bitspersample; + refbw[0] = 0; + refbw[1] = (float)(top-1L); + refbw[2] = (float)(top>>1); + refbw[3] = refbw[1]; + refbw[4] = refbw[2]; + refbw[5] = refbw[1]; + TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, + refbw); + } + } + break; + case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */ + case PHOTOMETRIC_MASK: + TIFFErrorExt(tif->tif_clientdata, module, + "PhotometricInterpretation %d not allowed for JPEG", + (int) sp->photometric); + return (0); + default: + /* TIFF 6.0 forbids subsampling of all other color spaces */ + sp->h_sampling = 1; + sp->v_sampling = 1; + break; + } + + /* Verify miscellaneous parameters */ + + /* + * This would need work if libtiff ever supports different + * depths for different components, or if libjpeg ever supports + * run-time selection of depth. Neither is imminent. + */ +#ifdef JPEG_LIB_MK1 + /* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */ + if (td->td_bitspersample != 8 && td->td_bitspersample != 12) +#else + if (td->td_bitspersample != BITS_IN_JSAMPLE ) +#endif + { + TIFFErrorExt(tif->tif_clientdata, module, "BitsPerSample %d not allowed for JPEG", + (int) td->td_bitspersample); + return (0); + } + sp->cinfo.c.data_precision = td->td_bitspersample; +#ifdef JPEG_LIB_MK1 + sp->cinfo.c.bits_in_jsample = td->td_bitspersample; +#endif + if (isTiled(tif)) { + if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) { + TIFFErrorExt(tif->tif_clientdata, module, + "JPEG tile height must be multiple of %d", + sp->v_sampling * DCTSIZE); + return (0); + } + if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) { + TIFFErrorExt(tif->tif_clientdata, module, + "JPEG tile width must be multiple of %d", + sp->h_sampling * DCTSIZE); + return (0); + } + } else { + if (td->td_rowsperstrip < td->td_imagelength && + (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) { + TIFFErrorExt(tif->tif_clientdata, module, + "RowsPerStrip must be multiple of %d for JPEG", + sp->v_sampling * DCTSIZE); + return (0); + } + } + + /* Create a JPEGTables field if appropriate */ + if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) { + if (!prepare_JPEGTables(tif)) + return (0); + /* Mark the field present */ + /* Can't use TIFFSetField since BEENWRITING is already set! */ + TIFFSetFieldBit(tif, FIELD_JPEGTABLES); + tif->tif_flags |= TIFF_DIRTYDIRECT; + } else { + /* We do not support application-supplied JPEGTables, */ + /* so mark the field not present */ + TIFFClrFieldBit(tif, FIELD_JPEGTABLES); + } + + /* Direct libjpeg output to libtiff's output buffer */ + TIFFjpeg_data_dest(sp, tif); + + return (1); +} + +/* + * Set encoding state at the start of a strip or tile. + */ +static int +JPEGPreEncode(TIFF* tif, tsample_t s) +{ + JPEGState *sp = JState(tif); + TIFFDirectory *td = &tif->tif_dir; + static const char module[] = "JPEGPreEncode"; + uint32 segment_width, segment_height; + int downsampled_input; + + assert(sp != NULL); + assert(!sp->cinfo.comm.is_decompressor); + /* + * Set encoding parameters for this strip/tile. + */ + if (isTiled(tif)) { + segment_width = td->td_tilewidth; + segment_height = td->td_tilelength; + sp->bytesperline = TIFFTileRowSize(tif); + } else { + segment_width = td->td_imagewidth; + segment_height = td->td_imagelength - tif->tif_row; + if (segment_height > td->td_rowsperstrip) + segment_height = td->td_rowsperstrip; + sp->bytesperline = TIFFOldScanlineSize(tif); + } + if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) { + /* for PC 2, scale down the strip/tile size + * to match a downsampled component + */ + segment_width = TIFFhowmany(segment_width, sp->h_sampling); + segment_height = TIFFhowmany(segment_height, sp->v_sampling); + } + if (segment_width > 65535 || segment_height > 65535) { + TIFFErrorExt(tif->tif_clientdata, module, "Strip/tile too large for JPEG"); + return (0); + } + sp->cinfo.c.image_width = segment_width; + sp->cinfo.c.image_height = segment_height; + downsampled_input = FALSE; + if (td->td_planarconfig == PLANARCONFIG_CONTIG) { + sp->cinfo.c.input_components = td->td_samplesperpixel; + if (sp->photometric == PHOTOMETRIC_YCBCR) { + if (sp->jpegcolormode == JPEGCOLORMODE_RGB) { + sp->cinfo.c.in_color_space = JCS_RGB; + } else { + sp->cinfo.c.in_color_space = JCS_YCbCr; + if (sp->h_sampling != 1 || sp->v_sampling != 1) + downsampled_input = TRUE; + } + if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr)) + return (0); + /* + * Set Y sampling factors; + * we assume jpeg_set_colorspace() set the rest to 1 + */ + sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling; + sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling; + } else { + sp->cinfo.c.in_color_space = JCS_UNKNOWN; + if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) + return (0); + /* jpeg_set_colorspace set all sampling factors to 1 */ + } + } else { + sp->cinfo.c.input_components = 1; + sp->cinfo.c.in_color_space = JCS_UNKNOWN; + if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) + return (0); + sp->cinfo.c.comp_info[0].component_id = s; + /* jpeg_set_colorspace() set sampling factors to 1 */ + if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) { + sp->cinfo.c.comp_info[0].quant_tbl_no = 1; + sp->cinfo.c.comp_info[0].dc_tbl_no = 1; + sp->cinfo.c.comp_info[0].ac_tbl_no = 1; + } + } + /* ensure libjpeg won't write any extraneous markers */ + sp->cinfo.c.write_JFIF_header = FALSE; + sp->cinfo.c.write_Adobe_marker = FALSE; + /* set up table handling correctly */ + if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) { + if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) + return (0); + unsuppress_quant_table(sp, 0); + unsuppress_quant_table(sp, 1); + } + if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) + sp->cinfo.c.optimize_coding = FALSE; + else + sp->cinfo.c.optimize_coding = TRUE; + if (downsampled_input) { + /* Need to use raw-data interface to libjpeg */ + sp->cinfo.c.raw_data_in = TRUE; + tif->tif_encoderow = JPEGEncodeRaw; + tif->tif_encodestrip = JPEGEncodeRaw; + tif->tif_encodetile = JPEGEncodeRaw; + } else { + /* Use normal interface to libjpeg */ + sp->cinfo.c.raw_data_in = FALSE; + tif->tif_encoderow = JPEGEncode; + tif->tif_encodestrip = JPEGEncode; + tif->tif_encodetile = JPEGEncode; + } + /* Start JPEG compressor */ + if (!TIFFjpeg_start_compress(sp, FALSE)) + return (0); + /* Allocate downsampled-data buffers if needed */ + if (downsampled_input) { + if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info, + sp->cinfo.c.num_components)) + return (0); + } + sp->scancount = 0; + + return (1); +} + +/* + * Encode a chunk of pixels. + * "Standard" case: incoming data is not downsampled. + */ +static int +JPEGEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) +{ + JPEGState *sp = JState(tif); + tsize_t nrows; + JSAMPROW bufptr[1]; + + (void) s; + assert(sp != NULL); + /* data is expected to be supplied in multiples of a scanline */ + nrows = cc / sp->bytesperline; + if (cc % sp->bytesperline) + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded"); + + /* The last strip will be limited to image size */ + if( !isTiled(tif) && tif->tif_row+nrows > tif->tif_dir.td_imagelength ) + nrows = tif->tif_dir.td_imagelength - tif->tif_row; + + while (nrows-- > 0) { + bufptr[0] = (JSAMPROW) buf; + if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1) + return (0); + if (nrows > 0) + tif->tif_row++; + buf += sp->bytesperline; + } + return (1); +} + +/* + * Encode a chunk of pixels. + * Incoming data is expected to be downsampled per sampling factors. + */ +static int +JPEGEncodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) +{ + JPEGState *sp = JState(tif); + JSAMPLE* inptr; + JSAMPLE* outptr; + tsize_t nrows; + JDIMENSION clumps_per_line, nclump; + int clumpoffset, ci, xpos, ypos; + jpeg_component_info* compptr; + int samples_per_clump = sp->samplesperclump; + tsize_t bytesperclumpline; + + (void) s; + assert(sp != NULL); + /* data is expected to be supplied in multiples of a clumpline */ + /* a clumpline is equivalent to v_sampling desubsampled scanlines */ + /* TODO: the following calculation of bytesperclumpline, should substitute calculation of sp->bytesperline, except that it is per v_sampling lines */ + bytesperclumpline = (((sp->cinfo.c.image_width+sp->h_sampling-1)/sp->h_sampling) + *(sp->h_sampling*sp->v_sampling+2)*sp->cinfo.c.data_precision+7) + /8; + + nrows = ( cc / bytesperclumpline ) * sp->v_sampling; + if (cc % bytesperclumpline) + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded"); + + /* Cb,Cr both have sampling factors 1, so this is correct */ + clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width; + + while (nrows > 0) { + /* + * Fastest way to separate the data is to make one pass + * over the scanline for each row of each component. + */ + clumpoffset = 0; /* first sample in clump */ + for (ci = 0, compptr = sp->cinfo.c.comp_info; + ci < sp->cinfo.c.num_components; + ci++, compptr++) { + int hsamp = compptr->h_samp_factor; + int vsamp = compptr->v_samp_factor; + int padding = (int) (compptr->width_in_blocks * DCTSIZE - + clumps_per_line * hsamp); + for (ypos = 0; ypos < vsamp; ypos++) { + inptr = ((JSAMPLE*) buf) + clumpoffset; + outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos]; + if (hsamp == 1) { + /* fast path for at least Cb and Cr */ + for (nclump = clumps_per_line; nclump-- > 0; ) { + *outptr++ = inptr[0]; + inptr += samples_per_clump; + } + } else { + /* general case */ + for (nclump = clumps_per_line; nclump-- > 0; ) { + for (xpos = 0; xpos < hsamp; xpos++) + *outptr++ = inptr[xpos]; + inptr += samples_per_clump; + } + } + /* pad each scanline as needed */ + for (xpos = 0; xpos < padding; xpos++) { + *outptr = outptr[-1]; + outptr++; + } + clumpoffset += hsamp; + } + } + sp->scancount++; + if (sp->scancount >= DCTSIZE) { + int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE; + if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n) + return (0); + sp->scancount = 0; + } + tif->tif_row += sp->v_sampling; + buf += sp->bytesperline; + nrows -= sp->v_sampling; + } + return (1); +} + +/* + * Finish up at the end of a strip or tile. + */ +static int +JPEGPostEncode(TIFF* tif) +{ + JPEGState *sp = JState(tif); + + if (sp->scancount > 0) { + /* + * Need to emit a partial bufferload of downsampled data. + * Pad the data vertically. + */ + int ci, ypos, n; + jpeg_component_info* compptr; + + for (ci = 0, compptr = sp->cinfo.c.comp_info; + ci < sp->cinfo.c.num_components; + ci++, compptr++) { + int vsamp = compptr->v_samp_factor; + tsize_t row_width = compptr->width_in_blocks * DCTSIZE + * sizeof(JSAMPLE); + for (ypos = sp->scancount * vsamp; + ypos < DCTSIZE * vsamp; ypos++) { + _TIFFmemcpy((tdata_t)sp->ds_buffer[ci][ypos], + (tdata_t)sp->ds_buffer[ci][ypos-1], + row_width); + + } + } + n = sp->cinfo.c.max_v_samp_factor * DCTSIZE; + if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n) + return (0); + } + + return (TIFFjpeg_finish_compress(JState(tif))); +} + +static void +JPEGCleanup(TIFF* tif) +{ + JPEGState *sp = JState(tif); + + assert(sp != 0); + + tif->tif_tagmethods.vgetfield = sp->vgetparent; + tif->tif_tagmethods.vsetfield = sp->vsetparent; + tif->tif_tagmethods.printdir = sp->printdir; + + if( sp->cinfo_initialized ) + TIFFjpeg_destroy(sp); /* release libjpeg resources */ + if (sp->jpegtables) /* tag value */ + _TIFFfree(sp->jpegtables); + _TIFFfree(tif->tif_data); /* release local state */ + tif->tif_data = NULL; + + _TIFFSetDefaultCompressionState(tif); +} + +static void +JPEGResetUpsampled( TIFF* tif ) +{ + JPEGState* sp = JState(tif); + TIFFDirectory* td = &tif->tif_dir; + + /* + * Mark whether returned data is up-sampled or not so TIFFStripSize + * and TIFFTileSize return values that reflect the true amount of + * data. + */ + tif->tif_flags &= ~TIFF_UPSAMPLED; + if (td->td_planarconfig == PLANARCONFIG_CONTIG) { + if (td->td_photometric == PHOTOMETRIC_YCBCR && + sp->jpegcolormode == JPEGCOLORMODE_RGB) { + tif->tif_flags |= TIFF_UPSAMPLED; + } else { +#ifdef notdef + if (td->td_ycbcrsubsampling[0] != 1 || + td->td_ycbcrsubsampling[1] != 1) + ; /* XXX what about up-sampling? */ +#endif + } + } + + /* + * Must recalculate cached tile size in case sampling state changed. + * Should we really be doing this now if image size isn't set? + */ + tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1; +} + +static int +JPEGVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + JPEGState* sp = JState(tif); + const TIFFFieldInfo* fip; + uint32 v32; + + assert(sp != NULL); + + switch (tag) { + case TIFFTAG_JPEGTABLES: + v32 = va_arg(ap, uint32); + if (v32 == 0) { + /* XXX */ + return (0); + } + _TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*), + (long) v32); + sp->jpegtables_length = v32; + TIFFSetFieldBit(tif, FIELD_JPEGTABLES); + break; + case TIFFTAG_JPEGQUALITY: + sp->jpegquality = va_arg(ap, int); + return (1); /* pseudo tag */ + case TIFFTAG_JPEGCOLORMODE: + sp->jpegcolormode = va_arg(ap, int); + JPEGResetUpsampled( tif ); + return (1); /* pseudo tag */ + case TIFFTAG_PHOTOMETRIC: + { + int ret_value = (*sp->vsetparent)(tif, tag, ap); + JPEGResetUpsampled( tif ); + return ret_value; + } + case TIFFTAG_JPEGTABLESMODE: + sp->jpegtablesmode = va_arg(ap, int); + return (1); /* pseudo tag */ + case TIFFTAG_YCBCRSUBSAMPLING: + /* mark the fact that we have a real ycbcrsubsampling! */ + sp->ycbcrsampling_fetched = 1; + /* should we be recomputing upsampling info here? */ + return (*sp->vsetparent)(tif, tag, ap); + case TIFFTAG_FAXRECVPARAMS: + sp->recvparams = va_arg(ap, uint32); + break; + case TIFFTAG_FAXSUBADDRESS: + _TIFFsetString(&sp->subaddress, va_arg(ap, char*)); + break; + case TIFFTAG_FAXRECVTIME: + sp->recvtime = va_arg(ap, uint32); + break; + case TIFFTAG_FAXDCS: + _TIFFsetString(&sp->faxdcs, va_arg(ap, char*)); + break; + default: + return (*sp->vsetparent)(tif, tag, ap); + } + + if ((fip = _TIFFFieldWithTag(tif, tag))) { + TIFFSetFieldBit(tif, fip->field_bit); + } else { + return (0); + } + + tif->tif_flags |= TIFF_DIRTYDIRECT; + return (1); +} + +/* + * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in + * the TIFF tags, but still use non-default (2,2) values within the jpeg + * data stream itself. In order for TIFF applications to work properly + * - for instance to get the strip buffer size right - it is imperative + * that the subsampling be available before we start reading the image + * data normally. This function will attempt to load the first strip in + * order to get the sampling values from the jpeg data stream. Various + * hacks are various places are done to ensure this function gets called + * before the td_ycbcrsubsampling values are used from the directory structure, + * including calling TIFFGetField() for the YCBCRSUBSAMPLING field from + * TIFFStripSize(), and the printing code in tif_print.c. + * + * Note that JPEGPreDeocode() will produce a fairly loud warning when the + * discovered sampling does not match the default sampling (2,2) or whatever + * was actually in the tiff tags. + * + * Problems: + * o This code will cause one whole strip/tile of compressed data to be + * loaded just to get the tags right, even if the imagery is never read. + * It would be more efficient to just load a bit of the header, and + * initialize things from that. + * + * See the bug in bugzilla for details: + * + * http://bugzilla.remotesensing.org/show_bug.cgi?id=168 + * + * Frank Warmerdam, July 2002 + */ + +static void +JPEGFixupTestSubsampling( TIFF * tif ) +{ +#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING + JPEGState *sp = JState(tif); + TIFFDirectory *td = &tif->tif_dir; + + JPEGInitializeLibJPEG( tif, 0, 0 ); + + /* + * Some JPEG-in-TIFF files don't provide the ycbcrsampling tags, + * and use a sampling schema other than the default 2,2. To handle + * this we actually have to scan the header of a strip or tile of + * jpeg data to get the sampling. + */ + if( !sp->cinfo.comm.is_decompressor + || sp->ycbcrsampling_fetched + || td->td_photometric != PHOTOMETRIC_YCBCR ) + return; + + sp->ycbcrsampling_fetched = 1; + if( TIFFIsTiled( tif ) ) + { + if( !TIFFFillTile( tif, 0 ) ) + return; + } + else + { + if( !TIFFFillStrip( tif, 0 ) ) + return; + } + + TIFFSetField( tif, TIFFTAG_YCBCRSUBSAMPLING, + (uint16) sp->h_sampling, (uint16) sp->v_sampling ); +#endif /* CHECK_JPEG_YCBCR_SUBSAMPLING */ +} + +static int +JPEGVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + JPEGState* sp = JState(tif); + + assert(sp != NULL); + + switch (tag) { + case TIFFTAG_JPEGTABLES: + *va_arg(ap, uint32*) = sp->jpegtables_length; + *va_arg(ap, void**) = sp->jpegtables; + break; + case TIFFTAG_JPEGQUALITY: + *va_arg(ap, int*) = sp->jpegquality; + break; + case TIFFTAG_JPEGCOLORMODE: + *va_arg(ap, int*) = sp->jpegcolormode; + break; + case TIFFTAG_JPEGTABLESMODE: + *va_arg(ap, int*) = sp->jpegtablesmode; + break; + case TIFFTAG_YCBCRSUBSAMPLING: + JPEGFixupTestSubsampling( tif ); + return (*sp->vgetparent)(tif, tag, ap); + case TIFFTAG_FAXRECVPARAMS: + *va_arg(ap, uint32*) = sp->recvparams; + break; + case TIFFTAG_FAXSUBADDRESS: + *va_arg(ap, char**) = sp->subaddress; + break; + case TIFFTAG_FAXRECVTIME: + *va_arg(ap, uint32*) = sp->recvtime; + break; + case TIFFTAG_FAXDCS: + *va_arg(ap, char**) = sp->faxdcs; + break; + default: + return (*sp->vgetparent)(tif, tag, ap); + } + return (1); +} + +static void +JPEGPrintDir(TIFF* tif, FILE* fd, long flags) +{ + JPEGState* sp = JState(tif); + + assert(sp != NULL); + + (void) flags; + if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) + fprintf(fd, " JPEG Tables: (%lu bytes)\n", + (unsigned long) sp->jpegtables_length); + if (TIFFFieldSet(tif,FIELD_RECVPARAMS)) + fprintf(fd, " Fax Receive Parameters: %08lx\n", + (unsigned long) sp->recvparams); + if (TIFFFieldSet(tif,FIELD_SUBADDRESS)) + fprintf(fd, " Fax SubAddress: %s\n", sp->subaddress); + if (TIFFFieldSet(tif,FIELD_RECVTIME)) + fprintf(fd, " Fax Receive Time: %lu secs\n", + (unsigned long) sp->recvtime); + if (TIFFFieldSet(tif,FIELD_FAXDCS)) + fprintf(fd, " Fax DCS: %s\n", sp->faxdcs); +} + +static uint32 +JPEGDefaultStripSize(TIFF* tif, uint32 s) +{ + JPEGState* sp = JState(tif); + TIFFDirectory *td = &tif->tif_dir; + + s = (*sp->defsparent)(tif, s); + if (s < td->td_imagelength) + s = TIFFroundup(s, td->td_ycbcrsubsampling[1] * DCTSIZE); + return (s); +} + +static void +JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) +{ + JPEGState* sp = JState(tif); + TIFFDirectory *td = &tif->tif_dir; + + (*sp->deftparent)(tif, tw, th); + *tw = TIFFroundup(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE); + *th = TIFFroundup(*th, td->td_ycbcrsubsampling[1] * DCTSIZE); +} + +/* + * The JPEG library initialized used to be done in TIFFInitJPEG(), but + * now that we allow a TIFF file to be opened in update mode it is necessary + * to have some way of deciding whether compression or decompression is + * desired other than looking at tif->tif_mode. We accomplish this by + * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry. + * If so, we assume decompression is desired. + * + * This is tricky, because TIFFInitJPEG() is called while the directory is + * being read, and generally speaking the BYTECOUNTS tag won't have been read + * at that point. So we try to defer jpeg library initialization till we + * do have that tag ... basically any access that might require the compressor + * or decompressor that occurs after the reading of the directory. + * + * In an ideal world compressors or decompressors would be setup + * at the point where a single tile or strip was accessed (for read or write) + * so that stuff like update of missing tiles, or replacement of tiles could + * be done. However, we aren't trying to crack that nut just yet ... + * + * NFW, Feb 3rd, 2003. + */ + +static int JPEGInitializeLibJPEG( TIFF * tif, int force_encode, int force_decode ) +{ + JPEGState* sp = JState(tif); + uint32 *byte_counts = NULL; + int data_is_empty = TRUE; + int decompress; + + + if(sp->cinfo_initialized) + { + if( force_encode && sp->cinfo.comm.is_decompressor ) + TIFFjpeg_destroy( sp ); + else if( force_decode && !sp->cinfo.comm.is_decompressor ) + TIFFjpeg_destroy( sp ); + else + return 1; + + sp->cinfo_initialized = 0; + } + + /* + * Do we have tile data already? Make sure we initialize the + * the state in decompressor mode if we have tile data, even if we + * are not in read-only file access mode. + */ + if( TIFFIsTiled( tif ) + && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &byte_counts ) + && byte_counts != NULL ) + { + data_is_empty = byte_counts[0] == 0; + } + if( !TIFFIsTiled( tif ) + && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &byte_counts) + && byte_counts != NULL ) + { + data_is_empty = byte_counts[0] == 0; + } + + if( force_decode ) + decompress = 1; + else if( force_encode ) + decompress = 0; + else if( tif->tif_mode == O_RDONLY ) + decompress = 1; + else if( data_is_empty ) + decompress = 0; + else + decompress = 1; + + /* + * Initialize libjpeg. + */ + if ( decompress ) { + if (!TIFFjpeg_create_decompress(sp)) + return (0); + + } else { + if (!TIFFjpeg_create_compress(sp)) + return (0); + } + + sp->cinfo_initialized = TRUE; + + return 1; +} + +int +TIFFInitJPEG(TIFF* tif, int scheme) +{ + JPEGState* sp; + + assert(scheme == COMPRESSION_JPEG); + + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, jpegFieldInfo, N(jpegFieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, + "TIFFInitJPEG", + "Merging JPEG codec-specific tags failed"); + return 0; + } + + /* + * Allocate state block so tag methods have storage to record values. + */ + tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (JPEGState)); + + if (tif->tif_data == NULL) { + TIFFErrorExt(tif->tif_clientdata, + "TIFFInitJPEG", "No space for JPEG state block"); + return 0; + } + _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState)); + + sp = JState(tif); + sp->tif = tif; /* back link */ + + /* + * Override parent get/set field methods. + */ + sp->vgetparent = tif->tif_tagmethods.vgetfield; + tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */ + sp->vsetparent = tif->tif_tagmethods.vsetfield; + tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */ + sp->printdir = tif->tif_tagmethods.printdir; + tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */ + + /* Default values for codec-specific fields */ + sp->jpegtables = NULL; + sp->jpegtables_length = 0; + sp->jpegquality = 75; /* Default IJG quality */ + sp->jpegcolormode = JPEGCOLORMODE_RAW; + sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF; + + sp->recvparams = 0; + sp->subaddress = NULL; + sp->faxdcs = NULL; + + sp->ycbcrsampling_fetched = 0; + + /* + * Install codec methods. + */ + tif->tif_setupdecode = JPEGSetupDecode; + tif->tif_predecode = JPEGPreDecode; + tif->tif_decoderow = JPEGDecode; + tif->tif_decodestrip = JPEGDecode; + tif->tif_decodetile = JPEGDecode; + tif->tif_setupencode = JPEGSetupEncode; + tif->tif_preencode = JPEGPreEncode; + tif->tif_postencode = JPEGPostEncode; + tif->tif_encoderow = JPEGEncode; + tif->tif_encodestrip = JPEGEncode; + tif->tif_encodetile = JPEGEncode; + tif->tif_cleanup = JPEGCleanup; + sp->defsparent = tif->tif_defstripsize; + tif->tif_defstripsize = JPEGDefaultStripSize; + sp->deftparent = tif->tif_deftilesize; + tif->tif_deftilesize = JPEGDefaultTileSize; + tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */ + + sp->cinfo_initialized = FALSE; + + /* + ** Create a JPEGTables field if no directory has yet been created. + ** We do this just to ensure that sufficient space is reserved for + ** the JPEGTables field. It will be properly created the right + ** size later. + */ + if( tif->tif_diroff == 0 ) + { +#define SIZE_OF_JPEGTABLES 2000 + TIFFSetFieldBit(tif, FIELD_JPEGTABLES); + sp->jpegtables_length = SIZE_OF_JPEGTABLES; + sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length); + _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES); +#undef SIZE_OF_JPEGTABLES + } + + /* + * Mark the TIFFTAG_YCBCRSAMPLES as present even if it is not + * see: JPEGFixupTestSubsampling(). + */ + TIFFSetFieldBit( tif, FIELD_YCBCRSUBSAMPLING ); + + return 1; +} +#endif /* JPEG_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ + diff --git a/src/3rdparty/libtiff/libtiff/tif_luv.c b/src/3rdparty/libtiff/libtiff/tif_luv.c new file mode 100644 index 0000000000..be8fceaf86 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_luv.c @@ -0,0 +1,1622 @@ +/* $Id: tif_luv.c,v 1.17.2.3 2009-06-30 17:06:25 fwarmerdam Exp $ */ + +/* + * Copyright (c) 1997 Greg Ward Larson + * Copyright (c) 1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler, Greg Larson and Silicon Graphics may not be used in any + * advertising or publicity relating to the software without the specific, + * prior written permission of Sam Leffler, Greg Larson and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER, GREG LARSON OR SILICON GRAPHICS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "tiffiop.h" +#ifdef LOGLUV_SUPPORT + +/* + * TIFF Library. + * LogLuv compression support for high dynamic range images. + * + * Contributed by Greg Larson. + * + * LogLuv image support uses the TIFF library to store 16 or 10-bit + * log luminance values with 8 bits each of u and v or a 14-bit index. + * + * The codec can take as input and produce as output 32-bit IEEE float values + * as well as 16-bit integer values. A 16-bit luminance is interpreted + * as a sign bit followed by a 15-bit integer that is converted + * to and from a linear magnitude using the transformation: + * + * L = 2^( (Le+.5)/256 - 64 ) # real from 15-bit + * + * Le = floor( 256*(log2(L) + 64) ) # 15-bit from real + * + * The actual conversion to world luminance units in candelas per sq. meter + * requires an additional multiplier, which is stored in the TIFFTAG_STONITS. + * This value is usually set such that a reasonable exposure comes from + * clamping decoded luminances above 1 to 1 in the displayed image. + * + * The 16-bit values for u and v may be converted to real values by dividing + * each by 32768. (This allows for negative values, which aren't useful as + * far as we know, but are left in case of future improvements in human + * color vision.) + * + * Conversion from (u,v), which is actually the CIE (u',v') system for + * you color scientists, is accomplished by the following transformation: + * + * u = 4*x / (-2*x + 12*y + 3) + * v = 9*y / (-2*x + 12*y + 3) + * + * x = 9*u / (6*u - 16*v + 12) + * y = 4*v / (6*u - 16*v + 12) + * + * This process is greatly simplified by passing 32-bit IEEE floats + * for each of three CIE XYZ coordinates. The codec then takes care + * of conversion to and from LogLuv, though the application is still + * responsible for interpreting the TIFFTAG_STONITS calibration factor. + * + * By definition, a CIE XYZ vector of [1 1 1] corresponds to a neutral white + * point of (x,y)=(1/3,1/3). However, most color systems assume some other + * white point, such as D65, and an absolute color conversion to XYZ then + * to another color space with a different white point may introduce an + * unwanted color cast to the image. It is often desirable, therefore, to + * perform a white point conversion that maps the input white to [1 1 1] + * in XYZ, then record the original white point using the TIFFTAG_WHITEPOINT + * tag value. A decoder that demands absolute color calibration may use + * this white point tag to get back the original colors, but usually it + * will be ignored and the new white point will be used instead that + * matches the output color space. + * + * Pixel information is compressed into one of two basic encodings, depending + * on the setting of the compression tag, which is one of COMPRESSION_SGILOG + * or COMPRESSION_SGILOG24. For COMPRESSION_SGILOG, greyscale data is + * stored as: + * + * 1 15 + * |-+---------------| + * + * COMPRESSION_SGILOG color data is stored as: + * + * 1 15 8 8 + * |-+---------------|--------+--------| + * S Le ue ve + * + * For the 24-bit COMPRESSION_SGILOG24 color format, the data is stored as: + * + * 10 14 + * |----------|--------------| + * Le' Ce + * + * There is no sign bit in the 24-bit case, and the (u,v) chromaticity is + * encoded as an index for optimal color resolution. The 10 log bits are + * defined by the following conversions: + * + * L = 2^((Le'+.5)/64 - 12) # real from 10-bit + * + * Le' = floor( 64*(log2(L) + 12) ) # 10-bit from real + * + * The 10 bits of the smaller format may be converted into the 15 bits of + * the larger format by multiplying by 4 and adding 13314. Obviously, + * a smaller range of magnitudes is covered (about 5 orders of magnitude + * instead of 38), and the lack of a sign bit means that negative luminances + * are not allowed. (Well, they aren't allowed in the real world, either, + * but they are useful for certain types of image processing.) + * + * The desired user format is controlled by the setting the internal + * pseudo tag TIFFTAG_SGILOGDATAFMT to one of: + * SGILOGDATAFMT_FLOAT = IEEE 32-bit float XYZ values + * SGILOGDATAFMT_16BIT = 16-bit integer encodings of logL, u and v + * Raw data i/o is also possible using: + * SGILOGDATAFMT_RAW = 32-bit unsigned integer with encoded pixel + * In addition, the following decoding is provided for ease of display: + * SGILOGDATAFMT_8BIT = 8-bit default RGB gamma-corrected values + * + * For grayscale images, we provide the following data formats: + * SGILOGDATAFMT_FLOAT = IEEE 32-bit float Y values + * SGILOGDATAFMT_16BIT = 16-bit integer w/ encoded luminance + * SGILOGDATAFMT_8BIT = 8-bit gray monitor values + * + * Note that the COMPRESSION_SGILOG applies a simple run-length encoding + * scheme by separating the logL, u and v bytes for each row and applying + * a PackBits type of compression. Since the 24-bit encoding is not + * adaptive, the 32-bit color format takes less space in many cases. + * + * Further control is provided over the conversion from higher-resolution + * formats to final encoded values through the pseudo tag + * TIFFTAG_SGILOGENCODE: + * SGILOGENCODE_NODITHER = do not dither encoded values + * SGILOGENCODE_RANDITHER = apply random dithering during encoding + * + * The default value of this tag is SGILOGENCODE_NODITHER for + * COMPRESSION_SGILOG to maximize run-length encoding and + * SGILOGENCODE_RANDITHER for COMPRESSION_SGILOG24 to turn + * quantization errors into noise. + */ + +#include +#include +#include + +/* + * State block for each open TIFF + * file using LogLuv compression/decompression. + */ +typedef struct logLuvState LogLuvState; + +struct logLuvState { + int user_datafmt; /* user data format */ + int encode_meth; /* encoding method */ + int pixel_size; /* bytes per pixel */ + + tidata_t* tbuf; /* translation buffer */ + int tbuflen; /* buffer length */ + void (*tfunc)(LogLuvState*, tidata_t, int); + + TIFFVSetMethod vgetparent; /* super-class method */ + TIFFVSetMethod vsetparent; /* super-class method */ +}; + +#define DecoderState(tif) ((LogLuvState*) (tif)->tif_data) +#define EncoderState(tif) ((LogLuvState*) (tif)->tif_data) + +#define SGILOGDATAFMT_UNKNOWN -1 + +#define MINRUN 4 /* minimum run length */ + +/* + * Decode a string of 16-bit gray pixels. + */ +static int +LogL16Decode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) +{ + LogLuvState* sp = DecoderState(tif); + int shft, i, npixels; + unsigned char* bp; + int16* tp; + int16 b; + int cc, rc; + + assert(s == 0); + assert(sp != NULL); + + npixels = occ / sp->pixel_size; + + if (sp->user_datafmt == SGILOGDATAFMT_16BIT) + tp = (int16*) op; + else { + assert(sp->tbuflen >= npixels); + tp = (int16*) sp->tbuf; + } + _TIFFmemset((tdata_t) tp, 0, npixels*sizeof (tp[0])); + + bp = (unsigned char*) tif->tif_rawcp; + cc = tif->tif_rawcc; + /* get each byte string */ + for (shft = 2*8; (shft -= 8) >= 0; ) { + for (i = 0; i < npixels && cc > 0; ) + if (*bp >= 128) { /* run */ + rc = *bp++ + (2-128); + b = (int16)(*bp++ << shft); + cc -= 2; + while (rc-- && i < npixels) + tp[i++] |= b; + } else { /* non-run */ + rc = *bp++; /* nul is noop */ + while (--cc && rc-- && i < npixels) + tp[i++] |= (int16)*bp++ << shft; + } + if (i != npixels) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LogL16Decode: Not enough data at row %d (short %d pixels)", + tif->tif_row, npixels - i); + tif->tif_rawcp = (tidata_t) bp; + tif->tif_rawcc = cc; + return (0); + } + } + (*sp->tfunc)(sp, op, npixels); + tif->tif_rawcp = (tidata_t) bp; + tif->tif_rawcc = cc; + return (1); +} + +/* + * Decode a string of 24-bit pixels. + */ +static int +LogLuvDecode24(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) +{ + LogLuvState* sp = DecoderState(tif); + int cc, i, npixels; + unsigned char* bp; + uint32* tp; + + assert(s == 0); + assert(sp != NULL); + + npixels = occ / sp->pixel_size; + + if (sp->user_datafmt == SGILOGDATAFMT_RAW) + tp = (uint32 *)op; + else { + assert(sp->tbuflen >= npixels); + tp = (uint32 *) sp->tbuf; + } + /* copy to array of uint32 */ + bp = (unsigned char*) tif->tif_rawcp; + cc = tif->tif_rawcc; + for (i = 0; i < npixels && cc > 0; i++) { + tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2]; + bp += 3; + cc -= 3; + } + tif->tif_rawcp = (tidata_t) bp; + tif->tif_rawcc = cc; + if (i != npixels) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LogLuvDecode24: Not enough data at row %d (short %d pixels)", + tif->tif_row, npixels - i); + return (0); + } + (*sp->tfunc)(sp, op, npixels); + return (1); +} + +/* + * Decode a string of 32-bit pixels. + */ +static int +LogLuvDecode32(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) +{ + LogLuvState* sp; + int shft, i, npixels; + unsigned char* bp; + uint32* tp; + uint32 b; + int cc, rc; + + assert(s == 0); + sp = DecoderState(tif); + assert(sp != NULL); + + npixels = occ / sp->pixel_size; + + if (sp->user_datafmt == SGILOGDATAFMT_RAW) + tp = (uint32*) op; + else { + assert(sp->tbuflen >= npixels); + tp = (uint32*) sp->tbuf; + } + _TIFFmemset((tdata_t) tp, 0, npixels*sizeof (tp[0])); + + bp = (unsigned char*) tif->tif_rawcp; + cc = tif->tif_rawcc; + /* get each byte string */ + for (shft = 4*8; (shft -= 8) >= 0; ) { + for (i = 0; i < npixels && cc > 0; ) + if (*bp >= 128) { /* run */ + rc = *bp++ + (2-128); + b = (uint32)*bp++ << shft; + cc -= 2; + while (rc-- && i < npixels) + tp[i++] |= b; + } else { /* non-run */ + rc = *bp++; /* nul is noop */ + while (--cc && rc-- && i < npixels) + tp[i++] |= (uint32)*bp++ << shft; + } + if (i != npixels) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LogLuvDecode32: Not enough data at row %d (short %d pixels)", + tif->tif_row, npixels - i); + tif->tif_rawcp = (tidata_t) bp; + tif->tif_rawcc = cc; + return (0); + } + } + (*sp->tfunc)(sp, op, npixels); + tif->tif_rawcp = (tidata_t) bp; + tif->tif_rawcc = cc; + return (1); +} + +/* + * Decode a strip of pixels. We break it into rows to + * maintain synchrony with the encode algorithm, which + * is row by row. + */ +static int +LogLuvDecodeStrip(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + tsize_t rowlen = TIFFScanlineSize(tif); + + assert(cc%rowlen == 0); + while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) + bp += rowlen, cc -= rowlen; + return (cc == 0); +} + +/* + * Decode a tile of pixels. We break it into rows to + * maintain synchrony with the encode algorithm, which + * is row by row. + */ +static int +LogLuvDecodeTile(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + tsize_t rowlen = TIFFTileRowSize(tif); + + assert(cc%rowlen == 0); + while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) + bp += rowlen, cc -= rowlen; + return (cc == 0); +} + +/* + * Encode a row of 16-bit pixels. + */ +static int +LogL16Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + LogLuvState* sp = EncoderState(tif); + int shft, i, j, npixels; + tidata_t op; + int16* tp; + int16 b; + int occ, rc=0, mask, beg; + + assert(s == 0); + assert(sp != NULL); + npixels = cc / sp->pixel_size; + + if (sp->user_datafmt == SGILOGDATAFMT_16BIT) + tp = (int16*) bp; + else { + tp = (int16*) sp->tbuf; + assert(sp->tbuflen >= npixels); + (*sp->tfunc)(sp, bp, npixels); + } + /* compress each byte string */ + op = tif->tif_rawcp; + occ = tif->tif_rawdatasize - tif->tif_rawcc; + for (shft = 2*8; (shft -= 8) >= 0; ) + for (i = 0; i < npixels; i += rc) { + if (occ < 4) { + tif->tif_rawcp = op; + tif->tif_rawcc = tif->tif_rawdatasize - occ; + if (!TIFFFlushData1(tif)) + return (-1); + op = tif->tif_rawcp; + occ = tif->tif_rawdatasize - tif->tif_rawcc; + } + mask = 0xff << shft; /* find next run */ + for (beg = i; beg < npixels; beg += rc) { + b = (int16) (tp[beg] & mask); + rc = 1; + while (rc < 127+2 && beg+rc < npixels && + (tp[beg+rc] & mask) == b) + rc++; + if (rc >= MINRUN) + break; /* long enough */ + } + if (beg-i > 1 && beg-i < MINRUN) { + b = (int16) (tp[i] & mask);/*check short run */ + j = i+1; + while ((tp[j++] & mask) == b) + if (j == beg) { + *op++ = (tidataval_t)(128-2+j-i); + *op++ = (tidataval_t) (b >> shft); + occ -= 2; + i = beg; + break; + } + } + while (i < beg) { /* write out non-run */ + if ((j = beg-i) > 127) j = 127; + if (occ < j+3) { + tif->tif_rawcp = op; + tif->tif_rawcc = tif->tif_rawdatasize - occ; + if (!TIFFFlushData1(tif)) + return (-1); + op = tif->tif_rawcp; + occ = tif->tif_rawdatasize - tif->tif_rawcc; + } + *op++ = (tidataval_t) j; occ--; + while (j--) { + *op++ = (tidataval_t) (tp[i++] >> shft & 0xff); + occ--; + } + } + if (rc >= MINRUN) { /* write out run */ + *op++ = (tidataval_t) (128-2+rc); + *op++ = (tidataval_t) (tp[beg] >> shft & 0xff); + occ -= 2; + } else + rc = 0; + } + tif->tif_rawcp = op; + tif->tif_rawcc = tif->tif_rawdatasize - occ; + + return (1); +} + +/* + * Encode a row of 24-bit pixels. + */ +static int +LogLuvEncode24(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + LogLuvState* sp = EncoderState(tif); + int i, npixels, occ; + tidata_t op; + uint32* tp; + + assert(s == 0); + assert(sp != NULL); + npixels = cc / sp->pixel_size; + + if (sp->user_datafmt == SGILOGDATAFMT_RAW) + tp = (uint32*) bp; + else { + tp = (uint32*) sp->tbuf; + assert(sp->tbuflen >= npixels); + (*sp->tfunc)(sp, bp, npixels); + } + /* write out encoded pixels */ + op = tif->tif_rawcp; + occ = tif->tif_rawdatasize - tif->tif_rawcc; + for (i = npixels; i--; ) { + if (occ < 3) { + tif->tif_rawcp = op; + tif->tif_rawcc = tif->tif_rawdatasize - occ; + if (!TIFFFlushData1(tif)) + return (-1); + op = tif->tif_rawcp; + occ = tif->tif_rawdatasize - tif->tif_rawcc; + } + *op++ = (tidataval_t)(*tp >> 16); + *op++ = (tidataval_t)(*tp >> 8 & 0xff); + *op++ = (tidataval_t)(*tp++ & 0xff); + occ -= 3; + } + tif->tif_rawcp = op; + tif->tif_rawcc = tif->tif_rawdatasize - occ; + + return (1); +} + +/* + * Encode a row of 32-bit pixels. + */ +static int +LogLuvEncode32(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + LogLuvState* sp = EncoderState(tif); + int shft, i, j, npixels; + tidata_t op; + uint32* tp; + uint32 b; + int occ, rc=0, mask, beg; + + assert(s == 0); + assert(sp != NULL); + + npixels = cc / sp->pixel_size; + + if (sp->user_datafmt == SGILOGDATAFMT_RAW) + tp = (uint32*) bp; + else { + tp = (uint32*) sp->tbuf; + assert(sp->tbuflen >= npixels); + (*sp->tfunc)(sp, bp, npixels); + } + /* compress each byte string */ + op = tif->tif_rawcp; + occ = tif->tif_rawdatasize - tif->tif_rawcc; + for (shft = 4*8; (shft -= 8) >= 0; ) + for (i = 0; i < npixels; i += rc) { + if (occ < 4) { + tif->tif_rawcp = op; + tif->tif_rawcc = tif->tif_rawdatasize - occ; + if (!TIFFFlushData1(tif)) + return (-1); + op = tif->tif_rawcp; + occ = tif->tif_rawdatasize - tif->tif_rawcc; + } + mask = 0xff << shft; /* find next run */ + for (beg = i; beg < npixels; beg += rc) { + b = tp[beg] & mask; + rc = 1; + while (rc < 127+2 && beg+rc < npixels && + (tp[beg+rc] & mask) == b) + rc++; + if (rc >= MINRUN) + break; /* long enough */ + } + if (beg-i > 1 && beg-i < MINRUN) { + b = tp[i] & mask; /* check short run */ + j = i+1; + while ((tp[j++] & mask) == b) + if (j == beg) { + *op++ = (tidataval_t)(128-2+j-i); + *op++ = (tidataval_t)(b >> shft); + occ -= 2; + i = beg; + break; + } + } + while (i < beg) { /* write out non-run */ + if ((j = beg-i) > 127) j = 127; + if (occ < j+3) { + tif->tif_rawcp = op; + tif->tif_rawcc = tif->tif_rawdatasize - occ; + if (!TIFFFlushData1(tif)) + return (-1); + op = tif->tif_rawcp; + occ = tif->tif_rawdatasize - tif->tif_rawcc; + } + *op++ = (tidataval_t) j; occ--; + while (j--) { + *op++ = (tidataval_t)(tp[i++] >> shft & 0xff); + occ--; + } + } + if (rc >= MINRUN) { /* write out run */ + *op++ = (tidataval_t) (128-2+rc); + *op++ = (tidataval_t)(tp[beg] >> shft & 0xff); + occ -= 2; + } else + rc = 0; + } + tif->tif_rawcp = op; + tif->tif_rawcc = tif->tif_rawdatasize - occ; + + return (1); +} + +/* + * Encode a strip of pixels. We break it into rows to + * avoid encoding runs across row boundaries. + */ +static int +LogLuvEncodeStrip(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + tsize_t rowlen = TIFFScanlineSize(tif); + + assert(cc%rowlen == 0); + while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1) + bp += rowlen, cc -= rowlen; + return (cc == 0); +} + +/* + * Encode a tile of pixels. We break it into rows to + * avoid encoding runs across row boundaries. + */ +static int +LogLuvEncodeTile(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + tsize_t rowlen = TIFFTileRowSize(tif); + + assert(cc%rowlen == 0); + while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1) + bp += rowlen, cc -= rowlen; + return (cc == 0); +} + +/* + * Encode/Decode functions for converting to and from user formats. + */ + +#include "uvcode.h" + +#ifndef UVSCALE +#define U_NEU 0.210526316 +#define V_NEU 0.473684211 +#define UVSCALE 410. +#endif + +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#define log2(x) ((1./M_LN2)*log(x)) +#define exp2(x) exp(M_LN2*(x)) + +#define itrunc(x,m) ((m)==SGILOGENCODE_NODITHER ? \ + (int)(x) : \ + (int)((x) + rand()*(1./RAND_MAX) - .5)) + +#if !LOGLUV_PUBLIC +static +#endif +double +LogL16toY(int p16) /* compute luminance from 16-bit LogL */ +{ + int Le = p16 & 0x7fff; + double Y; + + if (!Le) + return (0.); + Y = exp(M_LN2/256.*(Le+.5) - M_LN2*64.); + return (!(p16 & 0x8000) ? Y : -Y); +} + +#if !LOGLUV_PUBLIC +static +#endif +int +LogL16fromY(double Y, int em) /* get 16-bit LogL from Y */ +{ + if (Y >= 1.8371976e19) + return (0x7fff); + if (Y <= -1.8371976e19) + return (0xffff); + if (Y > 5.4136769e-20) + return itrunc(256.*(log2(Y) + 64.), em); + if (Y < -5.4136769e-20) + return (~0x7fff | itrunc(256.*(log2(-Y) + 64.), em)); + return (0); +} + +static void +L16toY(LogLuvState* sp, tidata_t op, int n) +{ + int16* l16 = (int16*) sp->tbuf; + float* yp = (float*) op; + + while (n-- > 0) + *yp++ = (float)LogL16toY(*l16++); +} + +static void +L16toGry(LogLuvState* sp, tidata_t op, int n) +{ + int16* l16 = (int16*) sp->tbuf; + uint8* gp = (uint8*) op; + + while (n-- > 0) { + double Y = LogL16toY(*l16++); + *gp++ = (uint8) ((Y <= 0.) ? 0 : (Y >= 1.) ? 255 : (int)(256.*sqrt(Y))); + } +} + +static void +L16fromY(LogLuvState* sp, tidata_t op, int n) +{ + int16* l16 = (int16*) sp->tbuf; + float* yp = (float*) op; + + while (n-- > 0) + *l16++ = (int16) (LogL16fromY(*yp++, sp->encode_meth)); +} + +#if !LOGLUV_PUBLIC +static +#endif +void +XYZtoRGB24(float xyz[3], uint8 rgb[3]) +{ + double r, g, b; + /* assume CCIR-709 primaries */ + r = 2.690*xyz[0] + -1.276*xyz[1] + -0.414*xyz[2]; + g = -1.022*xyz[0] + 1.978*xyz[1] + 0.044*xyz[2]; + b = 0.061*xyz[0] + -0.224*xyz[1] + 1.163*xyz[2]; + /* assume 2.0 gamma for speed */ + /* could use integer sqrt approx., but this is probably faster */ + rgb[0] = (uint8)((r<=0.) ? 0 : (r >= 1.) ? 255 : (int)(256.*sqrt(r))); + rgb[1] = (uint8)((g<=0.) ? 0 : (g >= 1.) ? 255 : (int)(256.*sqrt(g))); + rgb[2] = (uint8)((b<=0.) ? 0 : (b >= 1.) ? 255 : (int)(256.*sqrt(b))); +} + +#if !LOGLUV_PUBLIC +static +#endif +double +LogL10toY(int p10) /* compute luminance from 10-bit LogL */ +{ + if (p10 == 0) + return (0.); + return (exp(M_LN2/64.*(p10+.5) - M_LN2*12.)); +} + +#if !LOGLUV_PUBLIC +static +#endif +int +LogL10fromY(double Y, int em) /* get 10-bit LogL from Y */ +{ + if (Y >= 15.742) + return (0x3ff); + else if (Y <= .00024283) + return (0); + else + return itrunc(64.*(log2(Y) + 12.), em); +} + +#define NANGLES 100 +#define uv2ang(u, v) ( (NANGLES*.499999999/M_PI) \ + * atan2((v)-V_NEU,(u)-U_NEU) + .5*NANGLES ) + +static int +oog_encode(double u, double v) /* encode out-of-gamut chroma */ +{ + static int oog_table[NANGLES]; + static int initialized = 0; + register int i; + + if (!initialized) { /* set up perimeter table */ + double eps[NANGLES], ua, va, ang, epsa; + int ui, vi, ustep; + for (i = NANGLES; i--; ) + eps[i] = 2.; + for (vi = UV_NVS; vi--; ) { + va = UV_VSTART + (vi+.5)*UV_SQSIZ; + ustep = uv_row[vi].nus-1; + if (vi == UV_NVS-1 || vi == 0 || ustep <= 0) + ustep = 1; + for (ui = uv_row[vi].nus-1; ui >= 0; ui -= ustep) { + ua = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ; + ang = uv2ang(ua, va); + i = (int) ang; + epsa = fabs(ang - (i+.5)); + if (epsa < eps[i]) { + oog_table[i] = uv_row[vi].ncum + ui; + eps[i] = epsa; + } + } + } + for (i = NANGLES; i--; ) /* fill any holes */ + if (eps[i] > 1.5) { + int i1, i2; + for (i1 = 1; i1 < NANGLES/2; i1++) + if (eps[(i+i1)%NANGLES] < 1.5) + break; + for (i2 = 1; i2 < NANGLES/2; i2++) + if (eps[(i+NANGLES-i2)%NANGLES] < 1.5) + break; + if (i1 < i2) + oog_table[i] = + oog_table[(i+i1)%NANGLES]; + else + oog_table[i] = + oog_table[(i+NANGLES-i2)%NANGLES]; + } + initialized = 1; + } + i = (int) uv2ang(u, v); /* look up hue angle */ + return (oog_table[i]); +} + +#undef uv2ang +#undef NANGLES + +#if !LOGLUV_PUBLIC +static +#endif +int +uv_encode(double u, double v, int em) /* encode (u',v') coordinates */ +{ + register int vi, ui; + + if (v < UV_VSTART) + return oog_encode(u, v); + vi = itrunc((v - UV_VSTART)*(1./UV_SQSIZ), em); + if (vi >= UV_NVS) + return oog_encode(u, v); + if (u < uv_row[vi].ustart) + return oog_encode(u, v); + ui = itrunc((u - uv_row[vi].ustart)*(1./UV_SQSIZ), em); + if (ui >= uv_row[vi].nus) + return oog_encode(u, v); + + return (uv_row[vi].ncum + ui); +} + +#if !LOGLUV_PUBLIC +static +#endif +int +uv_decode(double *up, double *vp, int c) /* decode (u',v') index */ +{ + int upper, lower; + register int ui, vi; + + if (c < 0 || c >= UV_NDIVS) + return (-1); + lower = 0; /* binary search */ + upper = UV_NVS; + while (upper - lower > 1) { + vi = (lower + upper) >> 1; + ui = c - uv_row[vi].ncum; + if (ui > 0) + lower = vi; + else if (ui < 0) + upper = vi; + else { + lower = vi; + break; + } + } + vi = lower; + ui = c - uv_row[vi].ncum; + *up = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ; + *vp = UV_VSTART + (vi+.5)*UV_SQSIZ; + return (0); +} + +#if !LOGLUV_PUBLIC +static +#endif +void +LogLuv24toXYZ(uint32 p, float XYZ[3]) +{ + int Ce; + double L, u, v, s, x, y; + /* decode luminance */ + L = LogL10toY(p>>14 & 0x3ff); + if (L <= 0.) { + XYZ[0] = XYZ[1] = XYZ[2] = 0.; + return; + } + /* decode color */ + Ce = p & 0x3fff; + if (uv_decode(&u, &v, Ce) < 0) { + u = U_NEU; v = V_NEU; + } + s = 1./(6.*u - 16.*v + 12.); + x = 9.*u * s; + y = 4.*v * s; + /* convert to XYZ */ + XYZ[0] = (float)(x/y * L); + XYZ[1] = (float)L; + XYZ[2] = (float)((1.-x-y)/y * L); +} + +#if !LOGLUV_PUBLIC +static +#endif +uint32 +LogLuv24fromXYZ(float XYZ[3], int em) +{ + int Le, Ce; + double u, v, s; + /* encode luminance */ + Le = LogL10fromY(XYZ[1], em); + /* encode color */ + s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2]; + if (!Le || s <= 0.) { + u = U_NEU; + v = V_NEU; + } else { + u = 4.*XYZ[0] / s; + v = 9.*XYZ[1] / s; + } + Ce = uv_encode(u, v, em); + if (Ce < 0) /* never happens */ + Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER); + /* combine encodings */ + return (Le << 14 | Ce); +} + +static void +Luv24toXYZ(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + float* xyz = (float*) op; + + while (n-- > 0) { + LogLuv24toXYZ(*luv, xyz); + xyz += 3; + luv++; + } +} + +static void +Luv24toLuv48(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + int16* luv3 = (int16*) op; + + while (n-- > 0) { + double u, v; + + *luv3++ = (int16)((*luv >> 12 & 0xffd) + 13314); + if (uv_decode(&u, &v, *luv&0x3fff) < 0) { + u = U_NEU; + v = V_NEU; + } + *luv3++ = (int16)(u * (1L<<15)); + *luv3++ = (int16)(v * (1L<<15)); + luv++; + } +} + +static void +Luv24toRGB(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + uint8* rgb = (uint8*) op; + + while (n-- > 0) { + float xyz[3]; + + LogLuv24toXYZ(*luv++, xyz); + XYZtoRGB24(xyz, rgb); + rgb += 3; + } +} + +static void +Luv24fromXYZ(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + float* xyz = (float*) op; + + while (n-- > 0) { + *luv++ = LogLuv24fromXYZ(xyz, sp->encode_meth); + xyz += 3; + } +} + +static void +Luv24fromLuv48(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + int16* luv3 = (int16*) op; + + while (n-- > 0) { + int Le, Ce; + + if (luv3[0] <= 0) + Le = 0; + else if (luv3[0] >= (1<<12)+3314) + Le = (1<<10) - 1; + else if (sp->encode_meth == SGILOGENCODE_NODITHER) + Le = (luv3[0]-3314) >> 2; + else + Le = itrunc(.25*(luv3[0]-3314.), sp->encode_meth); + + Ce = uv_encode((luv3[1]+.5)/(1<<15), (luv3[2]+.5)/(1<<15), + sp->encode_meth); + if (Ce < 0) /* never happens */ + Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER); + *luv++ = (uint32)Le << 14 | Ce; + luv3 += 3; + } +} + +#if !LOGLUV_PUBLIC +static +#endif +void +LogLuv32toXYZ(uint32 p, float XYZ[3]) +{ + double L, u, v, s, x, y; + /* decode luminance */ + L = LogL16toY((int)p >> 16); + if (L <= 0.) { + XYZ[0] = XYZ[1] = XYZ[2] = 0.; + return; + } + /* decode color */ + u = 1./UVSCALE * ((p>>8 & 0xff) + .5); + v = 1./UVSCALE * ((p & 0xff) + .5); + s = 1./(6.*u - 16.*v + 12.); + x = 9.*u * s; + y = 4.*v * s; + /* convert to XYZ */ + XYZ[0] = (float)(x/y * L); + XYZ[1] = (float)L; + XYZ[2] = (float)((1.-x-y)/y * L); +} + +#if !LOGLUV_PUBLIC +static +#endif +uint32 +LogLuv32fromXYZ(float XYZ[3], int em) +{ + unsigned int Le, ue, ve; + double u, v, s; + /* encode luminance */ + Le = (unsigned int)LogL16fromY(XYZ[1], em); + /* encode color */ + s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2]; + if (!Le || s <= 0.) { + u = U_NEU; + v = V_NEU; + } else { + u = 4.*XYZ[0] / s; + v = 9.*XYZ[1] / s; + } + if (u <= 0.) ue = 0; + else ue = itrunc(UVSCALE*u, em); + if (ue > 255) ue = 255; + if (v <= 0.) ve = 0; + else ve = itrunc(UVSCALE*v, em); + if (ve > 255) ve = 255; + /* combine encodings */ + return (Le << 16 | ue << 8 | ve); +} + +static void +Luv32toXYZ(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + float* xyz = (float*) op; + + while (n-- > 0) { + LogLuv32toXYZ(*luv++, xyz); + xyz += 3; + } +} + +static void +Luv32toLuv48(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + int16* luv3 = (int16*) op; + + while (n-- > 0) { + double u, v; + + *luv3++ = (int16)(*luv >> 16); + u = 1./UVSCALE * ((*luv>>8 & 0xff) + .5); + v = 1./UVSCALE * ((*luv & 0xff) + .5); + *luv3++ = (int16)(u * (1L<<15)); + *luv3++ = (int16)(v * (1L<<15)); + luv++; + } +} + +static void +Luv32toRGB(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + uint8* rgb = (uint8*) op; + + while (n-- > 0) { + float xyz[3]; + + LogLuv32toXYZ(*luv++, xyz); + XYZtoRGB24(xyz, rgb); + rgb += 3; + } +} + +static void +Luv32fromXYZ(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + float* xyz = (float*) op; + + while (n-- > 0) { + *luv++ = LogLuv32fromXYZ(xyz, sp->encode_meth); + xyz += 3; + } +} + +static void +Luv32fromLuv48(LogLuvState* sp, tidata_t op, int n) +{ + uint32* luv = (uint32*) sp->tbuf; + int16* luv3 = (int16*) op; + + if (sp->encode_meth == SGILOGENCODE_NODITHER) { + while (n-- > 0) { + *luv++ = (uint32)luv3[0] << 16 | + (luv3[1]*(uint32)(UVSCALE+.5) >> 7 & 0xff00) | + (luv3[2]*(uint32)(UVSCALE+.5) >> 15 & 0xff); + luv3 += 3; + } + return; + } + while (n-- > 0) { + *luv++ = (uint32)luv3[0] << 16 | + (itrunc(luv3[1]*(UVSCALE/(1<<15)), sp->encode_meth) << 8 & 0xff00) | + (itrunc(luv3[2]*(UVSCALE/(1<<15)), sp->encode_meth) & 0xff); + luv3 += 3; + } +} + +static void +_logLuvNop(LogLuvState* sp, tidata_t op, int n) +{ + (void) sp; (void) op; (void) n; +} + +static int +LogL16GuessDataFmt(TIFFDirectory *td) +{ +#define PACK(s,b,f) (((b)<<6)|((s)<<3)|(f)) + switch (PACK(td->td_samplesperpixel, td->td_bitspersample, td->td_sampleformat)) { + case PACK(1, 32, SAMPLEFORMAT_IEEEFP): + return (SGILOGDATAFMT_FLOAT); + case PACK(1, 16, SAMPLEFORMAT_VOID): + case PACK(1, 16, SAMPLEFORMAT_INT): + case PACK(1, 16, SAMPLEFORMAT_UINT): + return (SGILOGDATAFMT_16BIT); + case PACK(1, 8, SAMPLEFORMAT_VOID): + case PACK(1, 8, SAMPLEFORMAT_UINT): + return (SGILOGDATAFMT_8BIT); + } +#undef PACK + return (SGILOGDATAFMT_UNKNOWN); +} + +static uint32 +multiply(size_t m1, size_t m2) +{ + uint32 bytes = m1 * m2; + + if (m1 && bytes / m1 != m2) + bytes = 0; + + return bytes; +} + +static int +LogL16InitState(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + LogLuvState* sp = DecoderState(tif); + static const char module[] = "LogL16InitState"; + + assert(sp != NULL); + assert(td->td_photometric == PHOTOMETRIC_LOGL); + + /* for some reason, we can't do this in TIFFInitLogL16 */ + if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN) + sp->user_datafmt = LogL16GuessDataFmt(td); + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + sp->pixel_size = sizeof (float); + break; + case SGILOGDATAFMT_16BIT: + sp->pixel_size = sizeof (int16); + break; + case SGILOGDATAFMT_8BIT: + sp->pixel_size = sizeof (uint8); + break; + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "No support for converting user data format to LogL"); + return (0); + } + if( isTiled(tif) ) + sp->tbuflen = multiply(td->td_tilewidth, td->td_tilelength); + else + sp->tbuflen = multiply(td->td_imagewidth, td->td_rowsperstrip); + if (multiply(sp->tbuflen, sizeof (int16)) == 0 || + (sp->tbuf = (tidata_t*) _TIFFmalloc(sp->tbuflen * sizeof (int16))) == NULL) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: No space for SGILog translation buffer", + tif->tif_name); + return (0); + } + return (1); +} + +static int +LogLuvGuessDataFmt(TIFFDirectory *td) +{ + int guess; + + /* + * If the user didn't tell us their datafmt, + * take our best guess from the bitspersample. + */ +#define PACK(a,b) (((a)<<3)|(b)) + switch (PACK(td->td_bitspersample, td->td_sampleformat)) { + case PACK(32, SAMPLEFORMAT_IEEEFP): + guess = SGILOGDATAFMT_FLOAT; + break; + case PACK(32, SAMPLEFORMAT_VOID): + case PACK(32, SAMPLEFORMAT_UINT): + case PACK(32, SAMPLEFORMAT_INT): + guess = SGILOGDATAFMT_RAW; + break; + case PACK(16, SAMPLEFORMAT_VOID): + case PACK(16, SAMPLEFORMAT_INT): + case PACK(16, SAMPLEFORMAT_UINT): + guess = SGILOGDATAFMT_16BIT; + break; + case PACK( 8, SAMPLEFORMAT_VOID): + case PACK( 8, SAMPLEFORMAT_UINT): + guess = SGILOGDATAFMT_8BIT; + break; + default: + guess = SGILOGDATAFMT_UNKNOWN; + break; +#undef PACK + } + /* + * Double-check samples per pixel. + */ + switch (td->td_samplesperpixel) { + case 1: + if (guess != SGILOGDATAFMT_RAW) + guess = SGILOGDATAFMT_UNKNOWN; + break; + case 3: + if (guess == SGILOGDATAFMT_RAW) + guess = SGILOGDATAFMT_UNKNOWN; + break; + default: + guess = SGILOGDATAFMT_UNKNOWN; + break; + } + return (guess); +} + +static int +LogLuvInitState(TIFF* tif) +{ + TIFFDirectory* td = &tif->tif_dir; + LogLuvState* sp = DecoderState(tif); + static const char module[] = "LogLuvInitState"; + + assert(sp != NULL); + assert(td->td_photometric == PHOTOMETRIC_LOGLUV); + + /* for some reason, we can't do this in TIFFInitLogLuv */ + if (td->td_planarconfig != PLANARCONFIG_CONTIG) { + TIFFErrorExt(tif->tif_clientdata, module, + "SGILog compression cannot handle non-contiguous data"); + return (0); + } + if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN) + sp->user_datafmt = LogLuvGuessDataFmt(td); + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + sp->pixel_size = 3*sizeof (float); + break; + case SGILOGDATAFMT_16BIT: + sp->pixel_size = 3*sizeof (int16); + break; + case SGILOGDATAFMT_RAW: + sp->pixel_size = sizeof (uint32); + break; + case SGILOGDATAFMT_8BIT: + sp->pixel_size = 3*sizeof (uint8); + break; + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "No support for converting user data format to LogLuv"); + return (0); + } + if( isTiled(tif) ) + sp->tbuflen = multiply(td->td_tilewidth, td->td_tilelength); + else + sp->tbuflen = multiply(td->td_imagewidth, td->td_rowsperstrip); + if (multiply(sp->tbuflen, sizeof (uint32)) == 0 || + (sp->tbuf = (tidata_t*) _TIFFmalloc(sp->tbuflen * sizeof (uint32))) == NULL) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: No space for SGILog translation buffer", + tif->tif_name); + return (0); + } + return (1); +} + +static int +LogLuvSetupDecode(TIFF* tif) +{ + LogLuvState* sp = DecoderState(tif); + TIFFDirectory* td = &tif->tif_dir; + + tif->tif_postdecode = _TIFFNoPostDecode; + switch (td->td_photometric) { + case PHOTOMETRIC_LOGLUV: + if (!LogLuvInitState(tif)) + break; + if (td->td_compression == COMPRESSION_SGILOG24) { + tif->tif_decoderow = LogLuvDecode24; + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + sp->tfunc = Luv24toXYZ; + break; + case SGILOGDATAFMT_16BIT: + sp->tfunc = Luv24toLuv48; + break; + case SGILOGDATAFMT_8BIT: + sp->tfunc = Luv24toRGB; + break; + } + } else { + tif->tif_decoderow = LogLuvDecode32; + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + sp->tfunc = Luv32toXYZ; + break; + case SGILOGDATAFMT_16BIT: + sp->tfunc = Luv32toLuv48; + break; + case SGILOGDATAFMT_8BIT: + sp->tfunc = Luv32toRGB; + break; + } + } + return (1); + case PHOTOMETRIC_LOGL: + if (!LogL16InitState(tif)) + break; + tif->tif_decoderow = LogL16Decode; + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + sp->tfunc = L16toY; + break; + case SGILOGDATAFMT_8BIT: + sp->tfunc = L16toGry; + break; + } + return (1); + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Inappropriate photometric interpretation %d for SGILog compression; %s", + td->td_photometric, "must be either LogLUV or LogL"); + break; + } + return (0); +} + +static int +LogLuvSetupEncode(TIFF* tif) +{ + LogLuvState* sp = EncoderState(tif); + TIFFDirectory* td = &tif->tif_dir; + + switch (td->td_photometric) { + case PHOTOMETRIC_LOGLUV: + if (!LogLuvInitState(tif)) + break; + if (td->td_compression == COMPRESSION_SGILOG24) { + tif->tif_encoderow = LogLuvEncode24; + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + sp->tfunc = Luv24fromXYZ; + break; + case SGILOGDATAFMT_16BIT: + sp->tfunc = Luv24fromLuv48; + break; + case SGILOGDATAFMT_RAW: + break; + default: + goto notsupported; + } + } else { + tif->tif_encoderow = LogLuvEncode32; + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + sp->tfunc = Luv32fromXYZ; + break; + case SGILOGDATAFMT_16BIT: + sp->tfunc = Luv32fromLuv48; + break; + case SGILOGDATAFMT_RAW: + break; + default: + goto notsupported; + } + } + break; + case PHOTOMETRIC_LOGL: + if (!LogL16InitState(tif)) + break; + tif->tif_encoderow = LogL16Encode; + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + sp->tfunc = L16fromY; + break; + case SGILOGDATAFMT_16BIT: + break; + default: + goto notsupported; + } + break; + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Inappropriate photometric interpretation %d for SGILog compression; %s", + td->td_photometric, "must be either LogLUV or LogL"); + break; + } + return (1); +notsupported: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "SGILog compression supported only for %s, or raw data", + td->td_photometric == PHOTOMETRIC_LOGL ? "Y, L" : "XYZ, Luv"); + return (0); +} + +static void +LogLuvClose(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + + /* + * For consistency, we always want to write out the same + * bitspersample and sampleformat for our TIFF file, + * regardless of the data format being used by the application. + * Since this routine is called after tags have been set but + * before they have been recorded in the file, we reset them here. + */ + td->td_samplesperpixel = + (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3; + td->td_bitspersample = 16; + td->td_sampleformat = SAMPLEFORMAT_INT; +} + +static void +LogLuvCleanup(TIFF* tif) +{ + LogLuvState* sp = (LogLuvState *)tif->tif_data; + + assert(sp != 0); + + tif->tif_tagmethods.vgetfield = sp->vgetparent; + tif->tif_tagmethods.vsetfield = sp->vsetparent; + + if (sp->tbuf) + _TIFFfree(sp->tbuf); + _TIFFfree(sp); + tif->tif_data = NULL; + + _TIFFSetDefaultCompressionState(tif); +} + +static int +LogLuvVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + LogLuvState* sp = DecoderState(tif); + int bps, fmt; + + switch (tag) { + case TIFFTAG_SGILOGDATAFMT: + sp->user_datafmt = va_arg(ap, int); + /* + * Tweak the TIFF header so that the rest of libtiff knows what + * size of data will be passed between app and library, and + * assume that the app knows what it is doing and is not + * confused by these header manipulations... + */ + switch (sp->user_datafmt) { + case SGILOGDATAFMT_FLOAT: + bps = 32, fmt = SAMPLEFORMAT_IEEEFP; + break; + case SGILOGDATAFMT_16BIT: + bps = 16, fmt = SAMPLEFORMAT_INT; + break; + case SGILOGDATAFMT_RAW: + bps = 32, fmt = SAMPLEFORMAT_UINT; + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); + break; + case SGILOGDATAFMT_8BIT: + bps = 8, fmt = SAMPLEFORMAT_UINT; + break; + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Unknown data format %d for LogLuv compression", + sp->user_datafmt); + return (0); + } + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); + TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, fmt); + /* + * Must recalculate sizes should bits/sample change. + */ + tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1; + tif->tif_scanlinesize = TIFFScanlineSize(tif); + return (1); + case TIFFTAG_SGILOGENCODE: + sp->encode_meth = va_arg(ap, int); + if (sp->encode_meth != SGILOGENCODE_NODITHER && + sp->encode_meth != SGILOGENCODE_RANDITHER) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Unknown encoding %d for LogLuv compression", + sp->encode_meth); + return (0); + } + return (1); + default: + return (*sp->vsetparent)(tif, tag, ap); + } +} + +static int +LogLuvVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + LogLuvState *sp = (LogLuvState *)tif->tif_data; + + switch (tag) { + case TIFFTAG_SGILOGDATAFMT: + *va_arg(ap, int*) = sp->user_datafmt; + return (1); + default: + return (*sp->vgetparent)(tif, tag, ap); + } +} + +static const TIFFFieldInfo LogLuvFieldInfo[] = { + { TIFFTAG_SGILOGDATAFMT, 0, 0, TIFF_SHORT, FIELD_PSEUDO, + TRUE, FALSE, "SGILogDataFmt"}, + { TIFFTAG_SGILOGENCODE, 0, 0, TIFF_SHORT, FIELD_PSEUDO, + TRUE, FALSE, "SGILogEncode"} +}; + +int +TIFFInitSGILog(TIFF* tif, int scheme) +{ + static const char module[] = "TIFFInitSGILog"; + LogLuvState* sp; + + assert(scheme == COMPRESSION_SGILOG24 || scheme == COMPRESSION_SGILOG); + + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, LogLuvFieldInfo, + TIFFArrayCount(LogLuvFieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Merging SGILog codec-specific tags failed"); + return 0; + } + + /* + * Allocate state block so tag methods have storage to record values. + */ + tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (LogLuvState)); + if (tif->tif_data == NULL) + goto bad; + sp = (LogLuvState*) tif->tif_data; + _TIFFmemset((tdata_t)sp, 0, sizeof (*sp)); + sp->user_datafmt = SGILOGDATAFMT_UNKNOWN; + sp->encode_meth = (scheme == COMPRESSION_SGILOG24) ? + SGILOGENCODE_RANDITHER : SGILOGENCODE_NODITHER; + sp->tfunc = _logLuvNop; + + /* + * Install codec methods. + * NB: tif_decoderow & tif_encoderow are filled + * in at setup time. + */ + tif->tif_setupdecode = LogLuvSetupDecode; + tif->tif_decodestrip = LogLuvDecodeStrip; + tif->tif_decodetile = LogLuvDecodeTile; + tif->tif_setupencode = LogLuvSetupEncode; + tif->tif_encodestrip = LogLuvEncodeStrip; + tif->tif_encodetile = LogLuvEncodeTile; + tif->tif_close = LogLuvClose; + tif->tif_cleanup = LogLuvCleanup; + + /* + * Override parent get/set field methods. + */ + sp->vgetparent = tif->tif_tagmethods.vgetfield; + tif->tif_tagmethods.vgetfield = LogLuvVGetField; /* hook for codec tags */ + sp->vsetparent = tif->tif_tagmethods.vsetfield; + tif->tif_tagmethods.vsetfield = LogLuvVSetField; /* hook for codec tags */ + + return (1); +bad: + TIFFErrorExt(tif->tif_clientdata, module, + "%s: No space for LogLuv state block", tif->tif_name); + return (0); +} +#endif /* LOGLUV_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_lzw.c b/src/3rdparty/libtiff/libtiff/tif_lzw.c new file mode 100644 index 0000000000..bc4dac6537 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_lzw.c @@ -0,0 +1,1122 @@ +/* $Id: tif_lzw.c,v 1.29.2.5 2009-06-22 04:57:31 fwarmerdam Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "tiffiop.h" +#ifdef LZW_SUPPORT +/* + * TIFF Library. + * Rev 5.0 Lempel-Ziv & Welch Compression Support + * + * This code is derived from the compress program whose code is + * derived from software contributed to Berkeley by James A. Woods, + * derived from original work by Spencer Thomas and Joseph Orost. + * + * The original Berkeley copyright notice appears below in its entirety. + */ +#include "tif_predict.h" + +#include + +/* + * NB: The 5.0 spec describes a different algorithm than Aldus + * implements. Specifically, Aldus does code length transitions + * one code earlier than should be done (for real LZW). + * Earlier versions of this library implemented the correct + * LZW algorithm, but emitted codes in a bit order opposite + * to the TIFF spec. Thus, to maintain compatibility w/ Aldus + * we interpret MSB-LSB ordered codes to be images written w/ + * old versions of this library, but otherwise adhere to the + * Aldus "off by one" algorithm. + * + * Future revisions to the TIFF spec are expected to "clarify this issue". + */ +#define LZW_COMPAT /* include backwards compatibility code */ +/* + * Each strip of data is supposed to be terminated by a CODE_EOI. + * If the following #define is included, the decoder will also + * check for end-of-strip w/o seeing this code. This makes the + * library more robust, but also slower. + */ +#define LZW_CHECKEOS /* include checks for strips w/o EOI code */ + +#define MAXCODE(n) ((1L<<(n))-1) +/* + * The TIFF spec specifies that encoded bit + * strings range from 9 to 12 bits. + */ +#define BITS_MIN 9 /* start with 9 bits */ +#define BITS_MAX 12 /* max of 12 bit strings */ +/* predefined codes */ +#define CODE_CLEAR 256 /* code to clear string table */ +#define CODE_EOI 257 /* end-of-information code */ +#define CODE_FIRST 258 /* first free code entry */ +#define CODE_MAX MAXCODE(BITS_MAX) +#define HSIZE 9001L /* 91% occupancy */ +#define HSHIFT (13-8) +#ifdef LZW_COMPAT +/* NB: +1024 is for compatibility with old files */ +#define CSIZE (MAXCODE(BITS_MAX)+1024L) +#else +#define CSIZE (MAXCODE(BITS_MAX)+1L) +#endif + +/* + * State block for each open TIFF file using LZW + * compression/decompression. Note that the predictor + * state block must be first in this data structure. + */ +typedef struct { + TIFFPredictorState predict; /* predictor super class */ + + unsigned short nbits; /* # of bits/code */ + unsigned short maxcode; /* maximum code for lzw_nbits */ + unsigned short free_ent; /* next free entry in hash table */ + long nextdata; /* next bits of i/o */ + long nextbits; /* # of valid bits in lzw_nextdata */ + + int rw_mode; /* preserve rw_mode from init */ +} LZWBaseState; + +#define lzw_nbits base.nbits +#define lzw_maxcode base.maxcode +#define lzw_free_ent base.free_ent +#define lzw_nextdata base.nextdata +#define lzw_nextbits base.nextbits + +/* + * Encoding-specific state. + */ +typedef uint16 hcode_t; /* codes fit in 16 bits */ +typedef struct { + long hash; + hcode_t code; +} hash_t; + +/* + * Decoding-specific state. + */ +typedef struct code_ent { + struct code_ent *next; + unsigned short length; /* string len, including this token */ + unsigned char value; /* data value */ + unsigned char firstchar; /* first token of string */ +} code_t; + +typedef int (*decodeFunc)(TIFF*, tidata_t, tsize_t, tsample_t); + +typedef struct { + LZWBaseState base; + + /* Decoding specific data */ + long dec_nbitsmask; /* lzw_nbits 1 bits, right adjusted */ + long dec_restart; /* restart count */ +#ifdef LZW_CHECKEOS + long dec_bitsleft; /* available bits in raw data */ +#endif + decodeFunc dec_decode; /* regular or backwards compatible */ + code_t* dec_codep; /* current recognized code */ + code_t* dec_oldcodep; /* previously recognized code */ + code_t* dec_free_entp; /* next free entry */ + code_t* dec_maxcodep; /* max available entry */ + code_t* dec_codetab; /* kept separate for small machines */ + + /* Encoding specific data */ + int enc_oldcode; /* last code encountered */ + long enc_checkpoint; /* point at which to clear table */ +#define CHECK_GAP 10000 /* enc_ratio check interval */ + long enc_ratio; /* current compression ratio */ + long enc_incount; /* (input) data bytes encoded */ + long enc_outcount; /* encoded (output) bytes */ + tidata_t enc_rawlimit; /* bound on tif_rawdata buffer */ + hash_t* enc_hashtab; /* kept separate for small machines */ +} LZWCodecState; + +#define LZWState(tif) ((LZWBaseState*) (tif)->tif_data) +#define DecoderState(tif) ((LZWCodecState*) LZWState(tif)) +#define EncoderState(tif) ((LZWCodecState*) LZWState(tif)) + +static int LZWDecode(TIFF*, tidata_t, tsize_t, tsample_t); +#ifdef LZW_COMPAT +static int LZWDecodeCompat(TIFF*, tidata_t, tsize_t, tsample_t); +#endif +static void cl_hash(LZWCodecState*); + +/* + * LZW Decoder. + */ + +#ifdef LZW_CHECKEOS +/* + * This check shouldn't be necessary because each + * strip is suppose to be terminated with CODE_EOI. + */ +#define NextCode(_tif, _sp, _bp, _code, _get) { \ + if ((_sp)->dec_bitsleft < nbits) { \ + TIFFWarningExt(_tif->tif_clientdata, _tif->tif_name, \ + "LZWDecode: Strip %d not terminated with EOI code", \ + _tif->tif_curstrip); \ + _code = CODE_EOI; \ + } else { \ + _get(_sp,_bp,_code); \ + (_sp)->dec_bitsleft -= nbits; \ + } \ +} +#else +#define NextCode(tif, sp, bp, code, get) get(sp, bp, code) +#endif + +static int +LZWSetupDecode(TIFF* tif) +{ + LZWCodecState* sp = DecoderState(tif); + static const char module[] = " LZWSetupDecode"; + int code; + + if( sp == NULL ) + { + /* + * Allocate state block so tag methods have storage to record + * values. + */ + tif->tif_data = (tidata_t) _TIFFmalloc(sizeof(LZWCodecState)); + if (tif->tif_data == NULL) + { + TIFFErrorExt(tif->tif_clientdata, "LZWPreDecode", "No space for LZW state block"); + return (0); + } + + DecoderState(tif)->dec_codetab = NULL; + DecoderState(tif)->dec_decode = NULL; + + /* + * Setup predictor setup. + */ + (void) TIFFPredictorInit(tif); + + sp = DecoderState(tif); + } + + assert(sp != NULL); + + if (sp->dec_codetab == NULL) { + sp->dec_codetab = (code_t*)_TIFFmalloc(CSIZE*sizeof (code_t)); + if (sp->dec_codetab == NULL) { + TIFFErrorExt(tif->tif_clientdata, module, + "No space for LZW code table"); + return (0); + } + /* + * Pre-load the table. + */ + code = 255; + do { + sp->dec_codetab[code].value = code; + sp->dec_codetab[code].firstchar = code; + sp->dec_codetab[code].length = 1; + sp->dec_codetab[code].next = NULL; + } while (code--); + /* + * Zero-out the unused entries + */ + _TIFFmemset(&sp->dec_codetab[CODE_CLEAR], 0, + (CODE_FIRST - CODE_CLEAR) * sizeof (code_t)); + } + return (1); +} + +/* + * Setup state for decoding a strip. + */ +static int +LZWPreDecode(TIFF* tif, tsample_t s) +{ + LZWCodecState *sp = DecoderState(tif); + + (void) s; + assert(sp != NULL); + if( sp->dec_codetab == NULL ) + { + tif->tif_setupdecode( tif ); + } + + /* + * Check for old bit-reversed codes. + */ + if (tif->tif_rawdata[0] == 0 && (tif->tif_rawdata[1] & 0x1)) { +#ifdef LZW_COMPAT + if (!sp->dec_decode) { + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "Old-style LZW codes, convert file"); + /* + * Override default decoding methods with + * ones that deal with the old coding. + * Otherwise the predictor versions set + * above will call the compatibility routines + * through the dec_decode method. + */ + tif->tif_decoderow = LZWDecodeCompat; + tif->tif_decodestrip = LZWDecodeCompat; + tif->tif_decodetile = LZWDecodeCompat; + /* + * If doing horizontal differencing, must + * re-setup the predictor logic since we + * switched the basic decoder methods... + */ + (*tif->tif_setupdecode)(tif); + sp->dec_decode = LZWDecodeCompat; + } + sp->lzw_maxcode = MAXCODE(BITS_MIN); +#else /* !LZW_COMPAT */ + if (!sp->dec_decode) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Old-style LZW codes not supported"); + sp->dec_decode = LZWDecode; + } + return (0); +#endif/* !LZW_COMPAT */ + } else { + sp->lzw_maxcode = MAXCODE(BITS_MIN)-1; + sp->dec_decode = LZWDecode; + } + sp->lzw_nbits = BITS_MIN; + sp->lzw_nextbits = 0; + sp->lzw_nextdata = 0; + + sp->dec_restart = 0; + sp->dec_nbitsmask = MAXCODE(BITS_MIN); +#ifdef LZW_CHECKEOS + sp->dec_bitsleft = tif->tif_rawcc << 3; +#endif + sp->dec_free_entp = sp->dec_codetab + CODE_FIRST; + /* + * Zero entries that are not yet filled in. We do + * this to guard against bogus input data that causes + * us to index into undefined entries. If you can + * come up with a way to safely bounds-check input codes + * while decoding then you can remove this operation. + */ + _TIFFmemset(sp->dec_free_entp, 0, (CSIZE-CODE_FIRST)*sizeof (code_t)); + sp->dec_oldcodep = &sp->dec_codetab[-1]; + sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask-1]; + return (1); +} + +/* + * Decode a "hunk of data". + */ +#define GetNextCode(sp, bp, code) { \ + nextdata = (nextdata<<8) | *(bp)++; \ + nextbits += 8; \ + if (nextbits < nbits) { \ + nextdata = (nextdata<<8) | *(bp)++; \ + nextbits += 8; \ + } \ + code = (hcode_t)((nextdata >> (nextbits-nbits)) & nbitsmask); \ + nextbits -= nbits; \ +} + +static void +codeLoop(TIFF* tif) +{ + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecode: Bogus encoding, loop in the code table; scanline %d", + tif->tif_row); +} + +static int +LZWDecode(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) +{ + LZWCodecState *sp = DecoderState(tif); + char *op = (char*) op0; + long occ = (long) occ0; + char *tp; + unsigned char *bp; + hcode_t code; + int len; + long nbits, nextbits, nextdata, nbitsmask; + code_t *codep, *free_entp, *maxcodep, *oldcodep; + + (void) s; + assert(sp != NULL); + assert(sp->dec_codetab != NULL); + /* + * Restart interrupted output operation. + */ + if (sp->dec_restart) { + long residue; + + codep = sp->dec_codep; + residue = codep->length - sp->dec_restart; + if (residue > occ) { + /* + * Residue from previous decode is sufficient + * to satisfy decode request. Skip to the + * start of the decoded string, place decoded + * values in the output buffer, and return. + */ + sp->dec_restart += occ; + do { + codep = codep->next; + } while (--residue > occ && codep); + if (codep) { + tp = op + occ; + do { + *--tp = codep->value; + codep = codep->next; + } while (--occ && codep); + } + return (1); + } + /* + * Residue satisfies only part of the decode request. + */ + op += residue, occ -= residue; + tp = op; + do { + int t; + --tp; + t = codep->value; + codep = codep->next; + *tp = t; + } while (--residue && codep); + sp->dec_restart = 0; + } + + bp = (unsigned char *)tif->tif_rawcp; + nbits = sp->lzw_nbits; + nextdata = sp->lzw_nextdata; + nextbits = sp->lzw_nextbits; + nbitsmask = sp->dec_nbitsmask; + oldcodep = sp->dec_oldcodep; + free_entp = sp->dec_free_entp; + maxcodep = sp->dec_maxcodep; + + while (occ > 0) { + NextCode(tif, sp, bp, code, GetNextCode); + if (code == CODE_EOI) + break; + if (code == CODE_CLEAR) { + free_entp = sp->dec_codetab + CODE_FIRST; + _TIFFmemset(free_entp, 0, + (CSIZE - CODE_FIRST) * sizeof (code_t)); + nbits = BITS_MIN; + nbitsmask = MAXCODE(BITS_MIN); + maxcodep = sp->dec_codetab + nbitsmask-1; + NextCode(tif, sp, bp, code, GetNextCode); + if (code == CODE_EOI) + break; + if (code == CODE_CLEAR) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecode: Corrupted LZW table at scanline %d", + tif->tif_row); + return (0); + } + *op++ = (char)code, occ--; + oldcodep = sp->dec_codetab + code; + continue; + } + codep = sp->dec_codetab + code; + + /* + * Add the new entry to the code table. + */ + if (free_entp < &sp->dec_codetab[0] || + free_entp >= &sp->dec_codetab[CSIZE]) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecode: Corrupted LZW table at scanline %d", + tif->tif_row); + return (0); + } + + free_entp->next = oldcodep; + if (free_entp->next < &sp->dec_codetab[0] || + free_entp->next >= &sp->dec_codetab[CSIZE]) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecode: Corrupted LZW table at scanline %d", + tif->tif_row); + return (0); + } + free_entp->firstchar = free_entp->next->firstchar; + free_entp->length = free_entp->next->length+1; + free_entp->value = (codep < free_entp) ? + codep->firstchar : free_entp->firstchar; + if (++free_entp > maxcodep) { + if (++nbits > BITS_MAX) /* should not happen */ + nbits = BITS_MAX; + nbitsmask = MAXCODE(nbits); + maxcodep = sp->dec_codetab + nbitsmask-1; + } + oldcodep = codep; + if (code >= 256) { + /* + * Code maps to a string, copy string + * value to output (written in reverse). + */ + if(codep->length == 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecode: Wrong length of decoded string: " + "data probably corrupted at scanline %d", + tif->tif_row); + return (0); + } + if (codep->length > occ) { + /* + * String is too long for decode buffer, + * locate portion that will fit, copy to + * the decode buffer, and setup restart + * logic for the next decoding call. + */ + sp->dec_codep = codep; + do { + codep = codep->next; + } while (codep && codep->length > occ); + if (codep) { + sp->dec_restart = occ; + tp = op + occ; + do { + *--tp = codep->value; + codep = codep->next; + } while (--occ && codep); + if (codep) + codeLoop(tif); + } + break; + } + len = codep->length; + tp = op + len; + do { + int t; + --tp; + t = codep->value; + codep = codep->next; + *tp = t; + } while (codep && tp > op); + if (codep) { + codeLoop(tif); + break; + } + op += len, occ -= len; + } else + *op++ = (char)code, occ--; + } + + tif->tif_rawcp = (tidata_t) bp; + sp->lzw_nbits = (unsigned short) nbits; + sp->lzw_nextdata = nextdata; + sp->lzw_nextbits = nextbits; + sp->dec_nbitsmask = nbitsmask; + sp->dec_oldcodep = oldcodep; + sp->dec_free_entp = free_entp; + sp->dec_maxcodep = maxcodep; + + if (occ > 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecode: Not enough data at scanline %d (short %ld bytes)", + tif->tif_row, occ); + return (0); + } + return (1); +} + +#ifdef LZW_COMPAT +/* + * Decode a "hunk of data" for old images. + */ +#define GetNextCodeCompat(sp, bp, code) { \ + nextdata |= (unsigned long) *(bp)++ << nextbits; \ + nextbits += 8; \ + if (nextbits < nbits) { \ + nextdata |= (unsigned long) *(bp)++ << nextbits;\ + nextbits += 8; \ + } \ + code = (hcode_t)(nextdata & nbitsmask); \ + nextdata >>= nbits; \ + nextbits -= nbits; \ +} + +static int +LZWDecodeCompat(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) +{ + LZWCodecState *sp = DecoderState(tif); + char *op = (char*) op0; + long occ = (long) occ0; + char *tp; + unsigned char *bp; + int code, nbits; + long nextbits, nextdata, nbitsmask; + code_t *codep, *free_entp, *maxcodep, *oldcodep; + + (void) s; + assert(sp != NULL); + /* + * Restart interrupted output operation. + */ + if (sp->dec_restart) { + long residue; + + codep = sp->dec_codep; + residue = codep->length - sp->dec_restart; + if (residue > occ) { + /* + * Residue from previous decode is sufficient + * to satisfy decode request. Skip to the + * start of the decoded string, place decoded + * values in the output buffer, and return. + */ + sp->dec_restart += occ; + do { + codep = codep->next; + } while (--residue > occ); + tp = op + occ; + do { + *--tp = codep->value; + codep = codep->next; + } while (--occ); + return (1); + } + /* + * Residue satisfies only part of the decode request. + */ + op += residue, occ -= residue; + tp = op; + do { + *--tp = codep->value; + codep = codep->next; + } while (--residue); + sp->dec_restart = 0; + } + + bp = (unsigned char *)tif->tif_rawcp; + nbits = sp->lzw_nbits; + nextdata = sp->lzw_nextdata; + nextbits = sp->lzw_nextbits; + nbitsmask = sp->dec_nbitsmask; + oldcodep = sp->dec_oldcodep; + free_entp = sp->dec_free_entp; + maxcodep = sp->dec_maxcodep; + + while (occ > 0) { + NextCode(tif, sp, bp, code, GetNextCodeCompat); + if (code == CODE_EOI) + break; + if (code == CODE_CLEAR) { + free_entp = sp->dec_codetab + CODE_FIRST; + _TIFFmemset(free_entp, 0, + (CSIZE - CODE_FIRST) * sizeof (code_t)); + nbits = BITS_MIN; + nbitsmask = MAXCODE(BITS_MIN); + maxcodep = sp->dec_codetab + nbitsmask; + NextCode(tif, sp, bp, code, GetNextCodeCompat); + if (code == CODE_EOI) + break; + if (code == CODE_CLEAR) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecode: Corrupted LZW table at scanline %d", + tif->tif_row); + return (0); + } + *op++ = code, occ--; + oldcodep = sp->dec_codetab + code; + continue; + } + codep = sp->dec_codetab + code; + + /* + * Add the new entry to the code table. + */ + if (free_entp < &sp->dec_codetab[0] || + free_entp >= &sp->dec_codetab[CSIZE]) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecodeCompat: Corrupted LZW table at scanline %d", + tif->tif_row); + return (0); + } + + free_entp->next = oldcodep; + if (free_entp->next < &sp->dec_codetab[0] || + free_entp->next >= &sp->dec_codetab[CSIZE]) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecodeCompat: Corrupted LZW table at scanline %d", + tif->tif_row); + return (0); + } + free_entp->firstchar = free_entp->next->firstchar; + free_entp->length = free_entp->next->length+1; + free_entp->value = (codep < free_entp) ? + codep->firstchar : free_entp->firstchar; + if (++free_entp > maxcodep) { + if (++nbits > BITS_MAX) /* should not happen */ + nbits = BITS_MAX; + nbitsmask = MAXCODE(nbits); + maxcodep = sp->dec_codetab + nbitsmask; + } + oldcodep = codep; + if (code >= 256) { + char *op_orig = op; + /* + * Code maps to a string, copy string + * value to output (written in reverse). + */ + if(codep->length == 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecodeCompat: Wrong length of decoded " + "string: data probably corrupted at scanline %d", + tif->tif_row); + return (0); + } + if (codep->length > occ) { + /* + * String is too long for decode buffer, + * locate portion that will fit, copy to + * the decode buffer, and setup restart + * logic for the next decoding call. + */ + sp->dec_codep = codep; + do { + codep = codep->next; + } while (codep->length > occ); + sp->dec_restart = occ; + tp = op + occ; + do { + *--tp = codep->value; + codep = codep->next; + } while (--occ); + break; + } + op += codep->length, occ -= codep->length; + tp = op; + do { + *--tp = codep->value; + } while( (codep = codep->next) != NULL && tp > op_orig); + } else + *op++ = code, occ--; + } + + tif->tif_rawcp = (tidata_t) bp; + sp->lzw_nbits = nbits; + sp->lzw_nextdata = nextdata; + sp->lzw_nextbits = nextbits; + sp->dec_nbitsmask = nbitsmask; + sp->dec_oldcodep = oldcodep; + sp->dec_free_entp = free_entp; + sp->dec_maxcodep = maxcodep; + + if (occ > 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "LZWDecodeCompat: Not enough data at scanline %d (short %ld bytes)", + tif->tif_row, occ); + return (0); + } + return (1); +} +#endif /* LZW_COMPAT */ + +/* + * LZW Encoding. + */ + +static int +LZWSetupEncode(TIFF* tif) +{ + LZWCodecState* sp = EncoderState(tif); + static const char module[] = "LZWSetupEncode"; + + assert(sp != NULL); + sp->enc_hashtab = (hash_t*) _TIFFmalloc(HSIZE*sizeof (hash_t)); + if (sp->enc_hashtab == NULL) { + TIFFErrorExt(tif->tif_clientdata, module, "No space for LZW hash table"); + return (0); + } + return (1); +} + +/* + * Reset encoding state at the start of a strip. + */ +static int +LZWPreEncode(TIFF* tif, tsample_t s) +{ + LZWCodecState *sp = EncoderState(tif); + + (void) s; + assert(sp != NULL); + + if( sp->enc_hashtab == NULL ) + { + tif->tif_setupencode( tif ); + } + + sp->lzw_nbits = BITS_MIN; + sp->lzw_maxcode = MAXCODE(BITS_MIN); + sp->lzw_free_ent = CODE_FIRST; + sp->lzw_nextbits = 0; + sp->lzw_nextdata = 0; + sp->enc_checkpoint = CHECK_GAP; + sp->enc_ratio = 0; + sp->enc_incount = 0; + sp->enc_outcount = 0; + /* + * The 4 here insures there is space for 2 max-sized + * codes in LZWEncode and LZWPostDecode. + */ + sp->enc_rawlimit = tif->tif_rawdata + tif->tif_rawdatasize-1 - 4; + cl_hash(sp); /* clear hash table */ + sp->enc_oldcode = (hcode_t) -1; /* generates CODE_CLEAR in LZWEncode */ + return (1); +} + +#define CALCRATIO(sp, rat) { \ + if (incount > 0x007fffff) { /* NB: shift will overflow */\ + rat = outcount >> 8; \ + rat = (rat == 0 ? 0x7fffffff : incount/rat); \ + } else \ + rat = (incount<<8) / outcount; \ +} +#define PutNextCode(op, c) { \ + nextdata = (nextdata << nbits) | c; \ + nextbits += nbits; \ + *op++ = (unsigned char)(nextdata >> (nextbits-8)); \ + nextbits -= 8; \ + if (nextbits >= 8) { \ + *op++ = (unsigned char)(nextdata >> (nextbits-8)); \ + nextbits -= 8; \ + } \ + outcount += nbits; \ +} + +/* + * Encode a chunk of pixels. + * + * Uses an open addressing double hashing (no chaining) on the + * prefix code/next character combination. We do a variant of + * Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's + * relatively-prime secondary probe. Here, the modular division + * first probe is gives way to a faster exclusive-or manipulation. + * Also do block compression with an adaptive reset, whereby the + * code table is cleared when the compression ratio decreases, + * but after the table fills. The variable-length output codes + * are re-sized at this point, and a CODE_CLEAR is generated + * for the decoder. + */ +static int +LZWEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + register LZWCodecState *sp = EncoderState(tif); + register long fcode; + register hash_t *hp; + register int h, c; + hcode_t ent; + long disp; + long incount, outcount, checkpoint; + long nextdata, nextbits; + int free_ent, maxcode, nbits; + tidata_t op, limit; + + (void) s; + if (sp == NULL) + return (0); + + assert(sp->enc_hashtab != NULL); + + /* + * Load local state. + */ + incount = sp->enc_incount; + outcount = sp->enc_outcount; + checkpoint = sp->enc_checkpoint; + nextdata = sp->lzw_nextdata; + nextbits = sp->lzw_nextbits; + free_ent = sp->lzw_free_ent; + maxcode = sp->lzw_maxcode; + nbits = sp->lzw_nbits; + op = tif->tif_rawcp; + limit = sp->enc_rawlimit; + ent = sp->enc_oldcode; + + if (ent == (hcode_t) -1 && cc > 0) { + /* + * NB: This is safe because it can only happen + * at the start of a strip where we know there + * is space in the data buffer. + */ + PutNextCode(op, CODE_CLEAR); + ent = *bp++; cc--; incount++; + } + while (cc > 0) { + c = *bp++; cc--; incount++; + fcode = ((long)c << BITS_MAX) + ent; + h = (c << HSHIFT) ^ ent; /* xor hashing */ +#ifdef _WINDOWS + /* + * Check hash index for an overflow. + */ + if (h >= HSIZE) + h -= HSIZE; +#endif + hp = &sp->enc_hashtab[h]; + if (hp->hash == fcode) { + ent = hp->code; + continue; + } + if (hp->hash >= 0) { + /* + * Primary hash failed, check secondary hash. + */ + disp = HSIZE - h; + if (h == 0) + disp = 1; + do { + /* + * Avoid pointer arithmetic 'cuz of + * wraparound problems with segments. + */ + if ((h -= disp) < 0) + h += HSIZE; + hp = &sp->enc_hashtab[h]; + if (hp->hash == fcode) { + ent = hp->code; + goto hit; + } + } while (hp->hash >= 0); + } + /* + * New entry, emit code and add to table. + */ + /* + * Verify there is space in the buffer for the code + * and any potential Clear code that might be emitted + * below. The value of limit is setup so that there + * are at least 4 bytes free--room for 2 codes. + */ + if (op > limit) { + tif->tif_rawcc = (tsize_t)(op - tif->tif_rawdata); + TIFFFlushData1(tif); + op = tif->tif_rawdata; + } + PutNextCode(op, ent); + ent = c; + hp->code = free_ent++; + hp->hash = fcode; + if (free_ent == CODE_MAX-1) { + /* table is full, emit clear code and reset */ + cl_hash(sp); + sp->enc_ratio = 0; + incount = 0; + outcount = 0; + free_ent = CODE_FIRST; + PutNextCode(op, CODE_CLEAR); + nbits = BITS_MIN; + maxcode = MAXCODE(BITS_MIN); + } else { + /* + * If the next entry is going to be too big for + * the code size, then increase it, if possible. + */ + if (free_ent > maxcode) { + nbits++; + assert(nbits <= BITS_MAX); + maxcode = (int) MAXCODE(nbits); + } else if (incount >= checkpoint) { + long rat; + /* + * Check compression ratio and, if things seem + * to be slipping, clear the hash table and + * reset state. The compression ratio is a + * 24+8-bit fractional number. + */ + checkpoint = incount+CHECK_GAP; + CALCRATIO(sp, rat); + if (rat <= sp->enc_ratio) { + cl_hash(sp); + sp->enc_ratio = 0; + incount = 0; + outcount = 0; + free_ent = CODE_FIRST; + PutNextCode(op, CODE_CLEAR); + nbits = BITS_MIN; + maxcode = MAXCODE(BITS_MIN); + } else + sp->enc_ratio = rat; + } + } + hit: + ; + } + + /* + * Restore global state. + */ + sp->enc_incount = incount; + sp->enc_outcount = outcount; + sp->enc_checkpoint = checkpoint; + sp->enc_oldcode = ent; + sp->lzw_nextdata = nextdata; + sp->lzw_nextbits = nextbits; + sp->lzw_free_ent = free_ent; + sp->lzw_maxcode = maxcode; + sp->lzw_nbits = nbits; + tif->tif_rawcp = op; + return (1); +} + +/* + * Finish off an encoded strip by flushing the last + * string and tacking on an End Of Information code. + */ +static int +LZWPostEncode(TIFF* tif) +{ + register LZWCodecState *sp = EncoderState(tif); + tidata_t op = tif->tif_rawcp; + long nextbits = sp->lzw_nextbits; + long nextdata = sp->lzw_nextdata; + long outcount = sp->enc_outcount; + int nbits = sp->lzw_nbits; + + if (op > sp->enc_rawlimit) { + tif->tif_rawcc = (tsize_t)(op - tif->tif_rawdata); + TIFFFlushData1(tif); + op = tif->tif_rawdata; + } + if (sp->enc_oldcode != (hcode_t) -1) { + PutNextCode(op, sp->enc_oldcode); + sp->enc_oldcode = (hcode_t) -1; + } + PutNextCode(op, CODE_EOI); + if (nextbits > 0) + *op++ = (unsigned char)(nextdata << (8-nextbits)); + tif->tif_rawcc = (tsize_t)(op - tif->tif_rawdata); + return (1); +} + +/* + * Reset encoding hash table. + */ +static void +cl_hash(LZWCodecState* sp) +{ + register hash_t *hp = &sp->enc_hashtab[HSIZE-1]; + register long i = HSIZE-8; + + do { + i -= 8; + hp[-7].hash = -1; + hp[-6].hash = -1; + hp[-5].hash = -1; + hp[-4].hash = -1; + hp[-3].hash = -1; + hp[-2].hash = -1; + hp[-1].hash = -1; + hp[ 0].hash = -1; + hp -= 8; + } while (i >= 0); + for (i += 8; i > 0; i--, hp--) + hp->hash = -1; +} + +static void +LZWCleanup(TIFF* tif) +{ + (void)TIFFPredictorCleanup(tif); + + assert(tif->tif_data != 0); + + if (DecoderState(tif)->dec_codetab) + _TIFFfree(DecoderState(tif)->dec_codetab); + + if (EncoderState(tif)->enc_hashtab) + _TIFFfree(EncoderState(tif)->enc_hashtab); + + _TIFFfree(tif->tif_data); + tif->tif_data = NULL; + + _TIFFSetDefaultCompressionState(tif); +} + +int +TIFFInitLZW(TIFF* tif, int scheme) +{ + assert(scheme == COMPRESSION_LZW); + /* + * Allocate state block so tag methods have storage to record values. + */ + tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (LZWCodecState)); + if (tif->tif_data == NULL) + goto bad; + DecoderState(tif)->dec_codetab = NULL; + DecoderState(tif)->dec_decode = NULL; + EncoderState(tif)->enc_hashtab = NULL; + LZWState(tif)->rw_mode = tif->tif_mode; + + /* + * Install codec methods. + */ + tif->tif_setupdecode = LZWSetupDecode; + tif->tif_predecode = LZWPreDecode; + tif->tif_decoderow = LZWDecode; + tif->tif_decodestrip = LZWDecode; + tif->tif_decodetile = LZWDecode; + tif->tif_setupencode = LZWSetupEncode; + tif->tif_preencode = LZWPreEncode; + tif->tif_postencode = LZWPostEncode; + tif->tif_encoderow = LZWEncode; + tif->tif_encodestrip = LZWEncode; + tif->tif_encodetile = LZWEncode; + tif->tif_cleanup = LZWCleanup; + /* + * Setup predictor setup. + */ + (void) TIFFPredictorInit(tif); + return (1); +bad: + TIFFErrorExt(tif->tif_clientdata, "TIFFInitLZW", + "No space for LZW state block"); + return (0); +} + +/* + * Copyright (c) 1985, 1986 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * James A. Woods, derived from original work by Spencer Thomas + * and Joseph Orost. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +#endif /* LZW_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_msdos.c b/src/3rdparty/libtiff/libtiff/tif_msdos.c new file mode 100644 index 0000000000..72cd39e04b --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_msdos.c @@ -0,0 +1,186 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_msdos.c,v 1.3 2006/07/25 18:26:33 fwarmerdam Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library MSDOS-specific Routines. + */ +#if defined(__WATCOMC__) || defined(__BORLANDC__) || defined(_MSC_VER) +#include /* for open, close, etc. function prototypes */ +#include +#endif +#include "tiffiop.h" + +static tsize_t +_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return (read((int) fd, buf, size)); +} + +static tsize_t +_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return (write((int) fd, buf, size)); +} + +static toff_t +_tiffSeekProc(thandle_t fd, toff_t off, int whence) +{ + return (lseek((int) fd, (off_t) off, whence)); +} + +static int +_tiffCloseProc(thandle_t fd) +{ + return (close((int) fd)); +} + +#include + +static toff_t +_tiffSizeProc(thandle_t fd) +{ + struct stat sb; + return (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size); +} + +static int +_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + return (0); +} + +static void +_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ +} + +/* + * Open a TIFF file descriptor for read/writing. + */ +TIFF* +TIFFFdOpen(int fd, const char* name, const char* mode) +{ + TIFF* tif; + + tif = TIFFClientOpen(name, mode, + (void*) fd, + _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, + _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); + if (tif) + tif->tif_fd = fd; + return (tif); +} + +/* + * Open a TIFF file for read/writing. + */ +TIFF* +TIFFOpen(const char* name, const char* mode) +{ + static const char module[] = "TIFFOpen"; + int m, fd; + TIFF *ret; + + m = _TIFFgetMode(mode, module); + if (m == -1) + return ((TIFF*)0); + fd = open(name, m|O_BINARY, 0666); + if (fd < 0) { + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF*)0); + } + return (TIFFFdOpen(fd, name, mode)); + + ret = TIFFFdOpen(fd, name, mode); + + if (ret == NULL) close(fd); + + return ret; +} + +#ifdef __GNUC__ +extern char* malloc(); +extern char* realloc(); +#else +#include +#endif + +tdata_t +_TIFFmalloc(tsize_t s) +{ + return (malloc((size_t) s)); +} + +void +_TIFFfree(tdata_t p) +{ + free(p); +} + +tdata_t +_TIFFrealloc(tdata_t p, tsize_t s) +{ + return (realloc(p, (size_t) s)); +} + +void +_TIFFmemset(tdata_t p, int v, tsize_t c) +{ + memset(p, v, (size_t) c); +} + +void +_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c) +{ + memcpy(d, s, (size_t) c); +} + +int +_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) +{ + return (memcmp(p1, p2, (size_t) c)); +} + +static void +msdosWarningHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + fprintf(stderr, "%s: ", module); + fprintf(stderr, "Warning, "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFwarningHandler = msdosWarningHandler; + +static void +msdosErrorHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + fprintf(stderr, "%s: ", module); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFerrorHandler = msdosErrorHandler; diff --git a/src/3rdparty/libtiff/libtiff/tif_next.c b/src/3rdparty/libtiff/libtiff/tif_next.c new file mode 100644 index 0000000000..0e1842d872 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_next.c @@ -0,0 +1,147 @@ +/* $Id: tif_next.c,v 1.8 2006/10/12 15:00:49 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "tiffiop.h" +#ifdef NEXT_SUPPORT +/* + * TIFF Library. + * + * NeXT 2-bit Grey Scale Compression Algorithm Support + */ + +#define SETPIXEL(op, v) { \ + switch (npixels++ & 3) { \ + case 0: op[0] = (unsigned char) ((v) << 6); break; \ + case 1: op[0] |= (v) << 4; break; \ + case 2: op[0] |= (v) << 2; break; \ + case 3: *op++ |= (v); break; \ + } \ +} + +#define LITERALROW 0x00 +#define LITERALSPAN 0x40 +#define WHITE ((1<<2)-1) + +static int +NeXTDecode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) +{ + unsigned char *bp, *op; + tsize_t cc; + tidata_t row; + tsize_t scanline, n; + + (void) s; + /* + * Each scanline is assumed to start off as all + * white (we assume a PhotometricInterpretation + * of ``min-is-black''). + */ + for (op = buf, cc = occ; cc-- > 0;) + *op++ = 0xff; + + bp = (unsigned char *)tif->tif_rawcp; + cc = tif->tif_rawcc; + scanline = tif->tif_scanlinesize; + for (row = buf; occ > 0; occ -= scanline, row += scanline) { + n = *bp++, cc--; + switch (n) { + case LITERALROW: + /* + * The entire scanline is given as literal values. + */ + if (cc < scanline) + goto bad; + _TIFFmemcpy(row, bp, scanline); + bp += scanline; + cc -= scanline; + break; + case LITERALSPAN: { + tsize_t off; + /* + * The scanline has a literal span that begins at some + * offset. + */ + off = (bp[0] * 256) + bp[1]; + n = (bp[2] * 256) + bp[3]; + if (cc < 4+n || off+n > scanline) + goto bad; + _TIFFmemcpy(row+off, bp+4, n); + bp += 4+n; + cc -= 4+n; + break; + } + default: { + uint32 npixels = 0, grey; + uint32 imagewidth = tif->tif_dir.td_imagewidth; + + /* + * The scanline is composed of a sequence of constant + * color ``runs''. We shift into ``run mode'' and + * interpret bytes as codes of the form + * until we've filled the scanline. + */ + op = row; + for (;;) { + grey = (n>>6) & 0x3; + n &= 0x3f; + /* + * Ensure the run does not exceed the scanline + * bounds, potentially resulting in a security + * issue. + */ + while (n-- > 0 && npixels < imagewidth) + SETPIXEL(op, grey); + if (npixels >= imagewidth) + break; + if (cc == 0) + goto bad; + n = *bp++, cc--; + } + break; + } + } + } + tif->tif_rawcp = (tidata_t) bp; + tif->tif_rawcc = cc; + return (1); +bad: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "NeXTDecode: Not enough data for scanline %ld", + (long) tif->tif_row); + return (0); +} + +int +TIFFInitNeXT(TIFF* tif, int scheme) +{ + (void) scheme; + tif->tif_decoderow = NeXTDecode; + tif->tif_decodestrip = NeXTDecode; + tif->tif_decodetile = NeXTDecode; + return (1); +} +#endif /* NEXT_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_ojpeg.c b/src/3rdparty/libtiff/libtiff/tif_ojpeg.c new file mode 100644 index 0000000000..9d1e8043e8 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_ojpeg.c @@ -0,0 +1,2427 @@ +/* $Id: tif_ojpeg.c,v 1.24.2.4 2009-09-03 20:45:10 bfriesen Exp $ */ + +/* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0 + specification is now totally obsolete and deprecated for new applications and + images. This file was was created solely in order to read unconverted images + still present on some users' computer systems. It will never be extended + to write such files. Writing new-style JPEG compressed TIFFs is implemented + in tif_jpeg.c. + + The code is carefully crafted to robustly read all gathered JPEG-in-TIFF + testfiles, and anticipate as much as possible all other... But still, it may + fail on some. If you encounter problems, please report them on the TIFF + mailing list and/or to Joris Van Damme . + + Please read the file called "TIFF Technical Note #2" if you need to be + convinced this compression scheme is bad and breaks TIFF. That document + is linked to from the LibTiff site + and from AWare Systems' TIFF section + . It is also absorbed + in Adobe's specification supplements, marked "draft" up to this day, but + supported by the TIFF community. + + This file interfaces with Release 6B of the JPEG Library written by the + Independent JPEG Group. Previous versions of this file required a hack inside + the LibJpeg library. This version no longer requires that. Remember to + remove the hack if you update from the old version. + + Copyright (c) Joris Van Damme + Copyright (c) AWare Systems + + The licence agreement for this file is the same as the rest of the LibTiff + library. + + IN NO EVENT SHALL JORIS VAN DAMME OR AWARE SYSTEMS BE LIABLE FOR + ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + OF THIS SOFTWARE. + + Joris Van Damme and/or AWare Systems may be available for custom + developement. If you like what you see, and need anything similar or related, + contact . +*/ + +/* What is what, and what is not? + + This decoder starts with an input stream, that is essentially the JpegInterchangeFormat + stream, if any, followed by the strile data, if any. This stream is read in + OJPEGReadByte and related functions. + + It analyzes the start of this stream, until it encounters non-marker data, i.e. + compressed image data. Some of the header markers it sees have no actual content, + like the SOI marker, and APP/COM markers that really shouldn't even be there. Some + other markers do have content, and the valuable bits and pieces of information + in these markers are saved, checking all to verify that the stream is more or + less within expected bounds. This happens inside the OJPEGReadHeaderInfoSecStreamXxx + functions. + + Some OJPEG imagery contains no valid JPEG header markers. This situation is picked + up on if we've seen no SOF marker when we're at the start of the compressed image + data. In this case, the tables are read from JpegXxxTables tags, and the other + bits and pieces of information is initialized to its most basic value. This is + implemented in the OJPEGReadHeaderInfoSecTablesXxx functions. + + When this is complete, a good and valid JPEG header can be assembled, and this is + passed through to LibJpeg. When that's done, the remainder of the input stream, i.e. + the compressed image data, can be passed through unchanged. This is done in + OJPEGWriteStream functions. + + LibTiff rightly expects to know the subsampling values before decompression. Just like + in new-style JPEG-in-TIFF, though, or even more so, actually, the YCbCrsubsampling + tag is notoriously unreliable. To correct these tag values with the ones inside + the JPEG stream, the first part of the input stream is pre-scanned in + OJPEGSubsamplingCorrect, making no note of any other data, reporting no warnings + or errors, up to the point where either these values are read, or it's clear they + aren't there. This means that some of the data is read twice, but we feel speed + in correcting these values is important enough to warrant this sacrifice. Allthough + there is currently no define or other configuration mechanism to disable this behaviour, + the actual header scanning is build to robustly respond with error report if it + should encounter an uncorrected mismatch of subsampling values. See + OJPEGReadHeaderInfoSecStreamSof. + + The restart interval and restart markers are the most tricky part... The restart + interval can be specified in a tag. It can also be set inside the input JPEG stream. + It can be used inside the input JPEG stream. If reading from strile data, we've + consistenly discovered the need to insert restart markers in between the different + striles, as is also probably the most likely interpretation of the original TIFF 6.0 + specification. With all this setting of interval, and actual use of markers that is not + predictable at the time of valid JPEG header assembly, the restart thing may turn + out the Achilles heel of this implementation. Fortunately, most OJPEG writer vendors + succeed in reading back what they write, which may be the reason why we've been able + to discover ways that seem to work. + + Some special provision is made for planarconfig separate OJPEG files. These seem + to consistently contain header info, a SOS marker, a plane, SOS marker, plane, SOS, + and plane. This may or may not be a valid JPEG configuration, we don't know and don't + care. We want LibTiff to be able to access the planes individually, without huge + buffering inside LibJpeg, anyway. So we compose headers to feed to LibJpeg, in this + case, that allow us to pass a single plane such that LibJpeg sees a valid + single-channel JPEG stream. Locating subsequent SOS markers, and thus subsequent + planes, is done inside OJPEGReadSecondarySos. + + The benefit of the scheme is... that it works, basically. We know of no other that + does. It works without checking software tag, or otherwise going about things in an + OJPEG flavor specific manner. Instead, it is a single scheme, that covers the cases + with and without JpegInterchangeFormat, with and without striles, with part of + the header in JpegInterchangeFormat and remainder in first strile, etc. It is forgiving + and robust, may likely work with OJPEG flavors we've not seen yet, and makes most out + of the data. + + Another nice side-effect is that a complete JPEG single valid stream is build if + planarconfig is not separate (vast majority). We may one day use that to build + converters to JPEG, and/or to new-style JPEG compression inside TIFF. + + A dissadvantage is the lack of random access to the individual striles. This is the + reason for much of the complicated restart-and-position stuff inside OJPEGPreDecode. + Applications would do well accessing all striles in order, as this will result in + a single sequential scan of the input stream, and no restarting of LibJpeg decoding + session. +*/ + + +#include "tiffiop.h" +#ifdef OJPEG_SUPPORT + +/* Configuration defines here are: + * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some environments, + * like eg LibTiffDelphi, this is not possible. For this reason, the actual calls to + * libjpeg, with longjump stuff, are encapsulated in dedicated functions. When + * JPEG_ENCAP_EXTERNAL is defined, these encapsulating functions are declared external + * to this unit, and can be defined elsewhere to use stuff other then longjump. + * The default mode, without JPEG_ENCAP_EXTERNAL, implements the call encapsulators + * here, internally, with normal longjump. + * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent is + * conviniently available, but still it may be worthwhile to use _setjmp or sigsetjmp + * in place of plain setjmp. These macros will make it easier. It is useless + * to fiddle with these if you define JPEG_ENCAP_EXTERNAL. + * OJPEG_BUFFER: Define the size of the desired buffer here. Should be small enough so as to guarantee + * instant processing, optimal streaming and optimal use of processor cache, but also big + * enough so as to not result in significant call overhead. It should be at least a few + * bytes to accomodate some structures (this is verified in asserts), but it would not be + * sensible to make it this small anyway, and it should be at most 64K since it is indexed + * with uint16. We recommend 2K. + * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used anywhere and has + * absolutely no effect. That is why most people insist the EGYPTIANWALK is a bit silly. + */ + +/* #define LIBJPEG_ENCAP_EXTERNAL */ +#define SETJMP(jbuf) setjmp(jbuf) +#define LONGJMP(jbuf,code) longjmp(jbuf,code) +#define JMP_BUF jmp_buf +#define OJPEG_BUFFER 2048 +/* define EGYPTIANWALK */ + +#define JPEG_MARKER_SOF0 0xC0 +#define JPEG_MARKER_SOF1 0xC1 +#define JPEG_MARKER_SOF3 0xC3 +#define JPEG_MARKER_DHT 0xC4 +#define JPEG_MARKER_RST0 0XD0 +#define JPEG_MARKER_SOI 0xD8 +#define JPEG_MARKER_EOI 0xD9 +#define JPEG_MARKER_SOS 0xDA +#define JPEG_MARKER_DQT 0xDB +#define JPEG_MARKER_DRI 0xDD +#define JPEG_MARKER_APP0 0xE0 +#define JPEG_MARKER_COM 0xFE + +#define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC+0) +#define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC+1) +#define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC+2) +#define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC+3) +#define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC+4) +#define FIELD_OJPEG_JPEGPROC (FIELD_CODEC+5) +#define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC+6) +#define FIELD_OJPEG_COUNT 7 + +static const TIFFFieldInfo ojpeg_field_info[] = { + {TIFFTAG_JPEGIFOFFSET,1,1,TIFF_LONG,FIELD_OJPEG_JPEGINTERCHANGEFORMAT,TRUE,FALSE,"JpegInterchangeFormat"}, + {TIFFTAG_JPEGIFBYTECOUNT,1,1,TIFF_LONG,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH,TRUE,FALSE,"JpegInterchangeFormatLength"}, + {TIFFTAG_JPEGQTABLES,TIFF_VARIABLE,TIFF_VARIABLE,TIFF_LONG,FIELD_OJPEG_JPEGQTABLES,FALSE,TRUE,"JpegQTables"}, + {TIFFTAG_JPEGDCTABLES,TIFF_VARIABLE,TIFF_VARIABLE,TIFF_LONG,FIELD_OJPEG_JPEGDCTABLES,FALSE,TRUE,"JpegDcTables"}, + {TIFFTAG_JPEGACTABLES,TIFF_VARIABLE,TIFF_VARIABLE,TIFF_LONG,FIELD_OJPEG_JPEGACTABLES,FALSE,TRUE,"JpegAcTables"}, + {TIFFTAG_JPEGPROC,1,1,TIFF_SHORT,FIELD_OJPEG_JPEGPROC,FALSE,FALSE,"JpegProc"}, + {TIFFTAG_JPEGRESTARTINTERVAL,1,1,TIFF_SHORT,FIELD_OJPEG_JPEGRESTARTINTERVAL,FALSE,FALSE,"JpegRestartInterval"}, +}; + +#ifndef LIBJPEG_ENCAP_EXTERNAL +#include +#endif + +#include "jpeglib.h" +#include "jerror.h" + +typedef struct jpeg_error_mgr jpeg_error_mgr; +typedef struct jpeg_common_struct jpeg_common_struct; +typedef struct jpeg_decompress_struct jpeg_decompress_struct; +typedef struct jpeg_source_mgr jpeg_source_mgr; + +typedef enum { + osibsNotSetYet, + osibsJpegInterchangeFormat, + osibsStrile, + osibsEof +} OJPEGStateInBufferSource; + +typedef enum { + ososSoi, + ososQTable0,ososQTable1,ososQTable2,ososQTable3, + ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3, + ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3, + ososDri, + ososSof, + ososSos, + ososCompressed, + ososRst, + ososEoi +} OJPEGStateOutState; + +typedef struct { + TIFF* tif; + #ifndef LIBJPEG_ENCAP_EXTERNAL + JMP_BUF exit_jmpbuf; + #endif + TIFFVGetMethod vgetparent; + TIFFVSetMethod vsetparent; + toff_t file_size; + uint32 image_width; + uint32 image_length; + uint32 strile_width; + uint32 strile_length; + uint32 strile_length_total; + uint8 samples_per_pixel; + uint8 plane_sample_offset; + uint8 samples_per_pixel_per_plane; + toff_t jpeg_interchange_format; + toff_t jpeg_interchange_format_length; + uint8 jpeg_proc; + uint8 subsamplingcorrect; + uint8 subsamplingcorrect_done; + uint8 subsampling_tag; + uint8 subsampling_hor; + uint8 subsampling_ver; + uint8 subsampling_force_desubsampling_inside_decompression; + uint8 qtable_offset_count; + uint8 dctable_offset_count; + uint8 actable_offset_count; + toff_t qtable_offset[3]; + toff_t dctable_offset[3]; + toff_t actable_offset[3]; + uint8* qtable[4]; + uint8* dctable[4]; + uint8* actable[4]; + uint16 restart_interval; + uint8 restart_index; + uint8 sof_log; + uint8 sof_marker_id; + uint32 sof_x; + uint32 sof_y; + uint8 sof_c[3]; + uint8 sof_hv[3]; + uint8 sof_tq[3]; + uint8 sos_cs[3]; + uint8 sos_tda[3]; + struct { + uint8 log; + OJPEGStateInBufferSource in_buffer_source; + tstrile_t in_buffer_next_strile; + toff_t in_buffer_file_pos; + toff_t in_buffer_file_togo; + } sos_end[3]; + uint8 readheader_done; + uint8 writeheader_done; + tsample_t write_cursample; + tstrile_t write_curstrile; + uint8 libjpeg_session_active; + uint8 libjpeg_jpeg_query_style; + jpeg_error_mgr libjpeg_jpeg_error_mgr; + jpeg_decompress_struct libjpeg_jpeg_decompress_struct; + jpeg_source_mgr libjpeg_jpeg_source_mgr; + uint8 subsampling_convert_log; + uint32 subsampling_convert_ylinelen; + uint32 subsampling_convert_ylines; + uint32 subsampling_convert_clinelen; + uint32 subsampling_convert_clines; + uint32 subsampling_convert_ybuflen; + uint32 subsampling_convert_cbuflen; + uint32 subsampling_convert_ycbcrbuflen; + uint8* subsampling_convert_ycbcrbuf; + uint8* subsampling_convert_ybuf; + uint8* subsampling_convert_cbbuf; + uint8* subsampling_convert_crbuf; + uint32 subsampling_convert_ycbcrimagelen; + uint8** subsampling_convert_ycbcrimage; + uint32 subsampling_convert_clinelenout; + uint32 subsampling_convert_state; + uint32 bytes_per_line; /* if the codec outputs subsampled data, a 'line' in bytes_per_line */ + uint32 lines_per_strile; /* and lines_per_strile means subsampling_ver desubsampled rows */ + OJPEGStateInBufferSource in_buffer_source; + tstrile_t in_buffer_next_strile; + tstrile_t in_buffer_strile_count; + toff_t in_buffer_file_pos; + uint8 in_buffer_file_pos_log; + toff_t in_buffer_file_togo; + uint16 in_buffer_togo; + uint8* in_buffer_cur; + uint8 in_buffer[OJPEG_BUFFER]; + OJPEGStateOutState out_state; + uint8 out_buffer[OJPEG_BUFFER]; + uint8* skip_buffer; +} OJPEGState; + +static int OJPEGVGetField(TIFF* tif, ttag_t tag, va_list ap); +static int OJPEGVSetField(TIFF* tif, ttag_t tag, va_list ap); +static void OJPEGPrintDir(TIFF* tif, FILE* fd, long flags); + +static int OJPEGSetupDecode(TIFF* tif); +static int OJPEGPreDecode(TIFF* tif, tsample_t s); +static int OJPEGPreDecodeSkipRaw(TIFF* tif); +static int OJPEGPreDecodeSkipScanlines(TIFF* tif); +static int OJPEGDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s); +static int OJPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc); +static int OJPEGDecodeScanlines(TIFF* tif, tidata_t buf, tsize_t cc); +static void OJPEGPostDecode(TIFF* tif, tidata_t buf, tsize_t cc); +static int OJPEGSetupEncode(TIFF* tif); +static int OJPEGPreEncode(TIFF* tif, tsample_t s); +static int OJPEGEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s); +static int OJPEGPostEncode(TIFF* tif); +static void OJPEGCleanup(TIFF* tif); + +static void OJPEGSubsamplingCorrect(TIFF* tif); +static int OJPEGReadHeaderInfo(TIFF* tif); +static int OJPEGReadSecondarySos(TIFF* tif, tsample_t s); +static int OJPEGWriteHeaderInfo(TIFF* tif); +static void OJPEGLibjpegSessionAbort(TIFF* tif); + +static int OJPEGReadHeaderInfoSec(TIFF* tif); +static int OJPEGReadHeaderInfoSecStreamDri(TIFF* tif); +static int OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif); +static int OJPEGReadHeaderInfoSecStreamDht(TIFF* tif); +static int OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id); +static int OJPEGReadHeaderInfoSecStreamSos(TIFF* tif); +static int OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif); +static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif); +static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif); + +static int OJPEGReadBufferFill(OJPEGState* sp); +static int OJPEGReadByte(OJPEGState* sp, uint8* byte); +static int OJPEGReadBytePeek(OJPEGState* sp, uint8* byte); +static void OJPEGReadByteAdvance(OJPEGState* sp); +static int OJPEGReadWord(OJPEGState* sp, uint16* word); +static int OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem); +static void OJPEGReadSkip(OJPEGState* sp, uint16 len); + +static int OJPEGWriteStream(TIFF* tif, void** mem, uint32* len); +static void OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len); +static void OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len); +static void OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len); +static void OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len); +static void OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len); +static void OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len); +static void OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len); +static int OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len); +static void OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len); +static void OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len); + +#ifdef LIBJPEG_ENCAP_EXTERNAL +extern int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo); +extern int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image); +extern int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo); +extern int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines); +extern int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines); +extern void jpeg_encap_unwind(TIFF* tif); +#else +static int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* j); +static int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image); +static int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo); +static int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines); +static int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines); +static void jpeg_encap_unwind(TIFF* tif); +#endif + +static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo); +static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo); +static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo); +static boolean OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo); +static void OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes); +static boolean OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired); +static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo); + +int +TIFFInitOJPEG(TIFF* tif, int scheme) +{ + static const char module[]="TIFFInitOJPEG"; + OJPEGState* sp; + + assert(scheme==COMPRESSION_OJPEG); + + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif,ojpeg_field_info,FIELD_OJPEG_COUNT)) { + TIFFErrorExt(tif->tif_clientdata, module, + "Merging Old JPEG codec-specific tags failed"); + return 0; + } + + /* state block */ + sp=_TIFFmalloc(sizeof(OJPEGState)); + if (sp==NULL) + { + TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG state block"); + return(0); + } + _TIFFmemset(sp,0,sizeof(OJPEGState)); + sp->tif=tif; + sp->jpeg_proc=1; + sp->subsampling_hor=2; + sp->subsampling_ver=2; + TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2); + /* tif codec methods */ + tif->tif_setupdecode=OJPEGSetupDecode; + tif->tif_predecode=OJPEGPreDecode; + tif->tif_postdecode=OJPEGPostDecode; + tif->tif_decoderow=OJPEGDecode; + tif->tif_decodestrip=OJPEGDecode; + tif->tif_decodetile=OJPEGDecode; + tif->tif_setupencode=OJPEGSetupEncode; + tif->tif_preencode=OJPEGPreEncode; + tif->tif_postencode=OJPEGPostEncode; + tif->tif_encoderow=OJPEGEncode; + tif->tif_encodestrip=OJPEGEncode; + tif->tif_encodetile=OJPEGEncode; + tif->tif_cleanup=OJPEGCleanup; + tif->tif_data=(tidata_t)sp; + /* tif tag methods */ + sp->vgetparent=tif->tif_tagmethods.vgetfield; + tif->tif_tagmethods.vgetfield=OJPEGVGetField; + sp->vsetparent=tif->tif_tagmethods.vsetfield; + tif->tif_tagmethods.vsetfield=OJPEGVSetField; + tif->tif_tagmethods.printdir=OJPEGPrintDir; + /* Some OJPEG files don't have strip or tile offsets or bytecounts tags. + Some others do, but have totally meaningless or corrupt values + in these tags. In these cases, the JpegInterchangeFormat stream is + reliable. In any case, this decoder reads the compressed data itself, + from the most reliable locations, and we need to notify encapsulating + LibTiff not to read raw strips or tiles for us. */ + tif->tif_flags|=TIFF_NOREADRAW; + return(1); +} + +static int +OJPEGVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + switch(tag) + { + case TIFFTAG_JPEGIFOFFSET: + *va_arg(ap,uint32*)=(uint32)sp->jpeg_interchange_format; + break; + case TIFFTAG_JPEGIFBYTECOUNT: + *va_arg(ap,uint32*)=(uint32)sp->jpeg_interchange_format_length; + break; + case TIFFTAG_YCBCRSUBSAMPLING: + if (sp->subsamplingcorrect_done==0) + OJPEGSubsamplingCorrect(tif); + *va_arg(ap,uint16*)=(uint16)sp->subsampling_hor; + *va_arg(ap,uint16*)=(uint16)sp->subsampling_ver; + break; + case TIFFTAG_JPEGQTABLES: + *va_arg(ap,uint32*)=(uint32)sp->qtable_offset_count; + *va_arg(ap,void**)=(void*)sp->qtable_offset; + break; + case TIFFTAG_JPEGDCTABLES: + *va_arg(ap,uint32*)=(uint32)sp->dctable_offset_count; + *va_arg(ap,void**)=(void*)sp->dctable_offset; + break; + case TIFFTAG_JPEGACTABLES: + *va_arg(ap,uint32*)=(uint32)sp->actable_offset_count; + *va_arg(ap,void**)=(void*)sp->actable_offset; + break; + case TIFFTAG_JPEGPROC: + *va_arg(ap,uint16*)=(uint16)sp->jpeg_proc; + break; + case TIFFTAG_JPEGRESTARTINTERVAL: + *va_arg(ap,uint16*)=sp->restart_interval; + break; + default: + return (*sp->vgetparent)(tif,tag,ap); + } + return (1); +} + +static int +OJPEGVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + static const char module[]="OJPEGVSetField"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint32 ma; + uint32* mb; + uint32 n; + switch(tag) + { + case TIFFTAG_JPEGIFOFFSET: + sp->jpeg_interchange_format=(toff_t)va_arg(ap,uint32); + break; + case TIFFTAG_JPEGIFBYTECOUNT: + sp->jpeg_interchange_format_length=(toff_t)va_arg(ap,uint32); + break; + case TIFFTAG_YCBCRSUBSAMPLING: + sp->subsampling_tag=1; + sp->subsampling_hor=(uint8)va_arg(ap,int); + sp->subsampling_ver=(uint8)va_arg(ap,int); + tif->tif_dir.td_ycbcrsubsampling[0]=sp->subsampling_hor; + tif->tif_dir.td_ycbcrsubsampling[1]=sp->subsampling_ver; + break; + case TIFFTAG_JPEGQTABLES: + ma=va_arg(ap,uint32); + if (ma!=0) + { + if (ma>3) + { + TIFFErrorExt(tif->tif_clientdata,module,"JpegQTables tag has incorrect count"); + return(0); + } + sp->qtable_offset_count=(uint8)ma; + mb=va_arg(ap,uint32*); + for (n=0; nqtable_offset[n]=(toff_t)mb[n]; + } + break; + case TIFFTAG_JPEGDCTABLES: + ma=va_arg(ap,uint32); + if (ma!=0) + { + if (ma>3) + { + TIFFErrorExt(tif->tif_clientdata,module,"JpegDcTables tag has incorrect count"); + return(0); + } + sp->dctable_offset_count=(uint8)ma; + mb=va_arg(ap,uint32*); + for (n=0; ndctable_offset[n]=(toff_t)mb[n]; + } + break; + case TIFFTAG_JPEGACTABLES: + ma=va_arg(ap,uint32); + if (ma!=0) + { + if (ma>3) + { + TIFFErrorExt(tif->tif_clientdata,module,"JpegAcTables tag has incorrect count"); + return(0); + } + sp->actable_offset_count=(uint8)ma; + mb=va_arg(ap,uint32*); + for (n=0; nactable_offset[n]=(toff_t)mb[n]; + } + break; + case TIFFTAG_JPEGPROC: + sp->jpeg_proc=(uint8)va_arg(ap,uint32); + break; + case TIFFTAG_JPEGRESTARTINTERVAL: + sp->restart_interval=(uint16)va_arg(ap,uint32); + break; + default: + return (*sp->vsetparent)(tif,tag,ap); + } + TIFFSetFieldBit(tif,_TIFFFieldWithTag(tif,tag)->field_bit); + tif->tif_flags|=TIFF_DIRTYDIRECT; + return(1); +} + +static void +OJPEGPrintDir(TIFF* tif, FILE* fd, long flags) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 m; + (void)flags; + assert(sp!=NULL); + if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMAT)) + fprintf(fd," JpegInterchangeFormat: %lu\n",(unsigned long)sp->jpeg_interchange_format); + if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH)) + fprintf(fd," JpegInterchangeFormatLength: %lu\n",(unsigned long)sp->jpeg_interchange_format_length); + if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGQTABLES)) + { + fprintf(fd," JpegQTables:"); + for (m=0; mqtable_offset_count; m++) + fprintf(fd," %lu",(unsigned long)sp->qtable_offset[m]); + fprintf(fd,"\n"); + } + if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGDCTABLES)) + { + fprintf(fd," JpegDcTables:"); + for (m=0; mdctable_offset_count; m++) + fprintf(fd," %lu",(unsigned long)sp->dctable_offset[m]); + fprintf(fd,"\n"); + } + if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGACTABLES)) + { + fprintf(fd," JpegAcTables:"); + for (m=0; mactable_offset_count; m++) + fprintf(fd," %lu",(unsigned long)sp->actable_offset[m]); + fprintf(fd,"\n"); + } + if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGPROC)) + fprintf(fd," JpegProc: %u\n",(unsigned int)sp->jpeg_proc); + if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGRESTARTINTERVAL)) + fprintf(fd," JpegRestartInterval: %u\n",(unsigned int)sp->restart_interval); +} + +static int +OJPEGSetupDecode(TIFF* tif) +{ + static const char module[]="OJPEGSetupDecode"; + TIFFWarningExt(tif->tif_clientdata,module,"Depreciated and troublesome old-style JPEG compression mode, please convert to new-style JPEG compression and notify vendor of writing software"); + return(1); +} + +static int +OJPEGPreDecode(TIFF* tif, tsample_t s) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + tstrile_t m; + if (sp->subsamplingcorrect_done==0) + OJPEGSubsamplingCorrect(tif); + if (sp->readheader_done==0) + { + if (OJPEGReadHeaderInfo(tif)==0) + return(0); + } + if (sp->sos_end[s].log==0) + { + if (OJPEGReadSecondarySos(tif,s)==0) + return(0); + } + if isTiled(tif) + m=(tstrile_t)tif->tif_curtile; + else + m=(tstrile_t)tif->tif_curstrip; + if ((sp->writeheader_done!=0) && ((sp->write_cursample!=s) || (sp->write_curstrile>m))) + { + if (sp->libjpeg_session_active!=0) + OJPEGLibjpegSessionAbort(tif); + sp->writeheader_done=0; + } + if (sp->writeheader_done==0) + { + sp->plane_sample_offset=s; + sp->write_cursample=s; + sp->write_curstrile=s*tif->tif_dir.td_stripsperimage; + if ((sp->in_buffer_file_pos_log==0) || + (sp->in_buffer_file_pos-sp->in_buffer_togo!=sp->sos_end[s].in_buffer_file_pos)) + { + sp->in_buffer_source=sp->sos_end[s].in_buffer_source; + sp->in_buffer_next_strile=sp->sos_end[s].in_buffer_next_strile; + sp->in_buffer_file_pos=sp->sos_end[s].in_buffer_file_pos; + sp->in_buffer_file_pos_log=0; + sp->in_buffer_file_togo=sp->sos_end[s].in_buffer_file_togo; + sp->in_buffer_togo=0; + sp->in_buffer_cur=0; + } + if (OJPEGWriteHeaderInfo(tif)==0) + return(0); + } + while (sp->write_curstrilelibjpeg_jpeg_query_style==0) + { + if (OJPEGPreDecodeSkipRaw(tif)==0) + return(0); + } + else + { + if (OJPEGPreDecodeSkipScanlines(tif)==0) + return(0); + } + sp->write_curstrile++; + } + return(1); +} + +static int +OJPEGPreDecodeSkipRaw(TIFF* tif) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint32 m; + m=sp->lines_per_strile; + if (sp->subsampling_convert_state!=0) + { + if (sp->subsampling_convert_clines-sp->subsampling_convert_state>=m) + { + sp->subsampling_convert_state+=m; + if (sp->subsampling_convert_state==sp->subsampling_convert_clines) + sp->subsampling_convert_state=0; + return(1); + } + m-=sp->subsampling_convert_clines-sp->subsampling_convert_state; + sp->subsampling_convert_state=0; + } + while (m>=sp->subsampling_convert_clines) + { + if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) + return(0); + m-=sp->subsampling_convert_clines; + } + if (m>0) + { + if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) + return(0); + sp->subsampling_convert_state=m; + } + return(1); +} + +static int +OJPEGPreDecodeSkipScanlines(TIFF* tif) +{ + static const char module[]="OJPEGPreDecodeSkipScanlines"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint32 m; + if (sp->skip_buffer==NULL) + { + sp->skip_buffer=_TIFFmalloc(sp->bytes_per_line); + if (sp->skip_buffer==NULL) + { + TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); + return(0); + } + } + for (m=0; mlines_per_strile; m++) + { + if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&sp->skip_buffer,1)==0) + return(0); + } + return(1); +} + +static int +OJPEGDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + (void)s; + if (sp->libjpeg_jpeg_query_style==0) + { + if (OJPEGDecodeRaw(tif,buf,cc)==0) + return(0); + } + else + { + if (OJPEGDecodeScanlines(tif,buf,cc)==0) + return(0); + } + return(1); +} + +static int +OJPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc) +{ + static const char module[]="OJPEGDecodeRaw"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8* m; + uint32 n; + uint8* oy; + uint8* ocb; + uint8* ocr; + uint8* p; + uint32 q; + uint8* r; + uint8 sx,sy; + if (cc%sp->bytes_per_line!=0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read"); + return(0); + } + assert(cc>0); + m=buf; + n=cc; + do + { + if (sp->subsampling_convert_state==0) + { + if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) + return(0); + } + oy=sp->subsampling_convert_ybuf+sp->subsampling_convert_state*sp->subsampling_ver*sp->subsampling_convert_ylinelen; + ocb=sp->subsampling_convert_cbbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen; + ocr=sp->subsampling_convert_crbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen; + p=m; + for (q=0; qsubsampling_convert_clinelenout; q++) + { + r=oy; + for (sy=0; sysubsampling_ver; sy++) + { + for (sx=0; sxsubsampling_hor; sx++) + *p++=*r++; + r+=sp->subsampling_convert_ylinelen-sp->subsampling_hor; + } + oy+=sp->subsampling_hor; + *p++=*ocb++; + *p++=*ocr++; + } + sp->subsampling_convert_state++; + if (sp->subsampling_convert_state==sp->subsampling_convert_clines) + sp->subsampling_convert_state=0; + m+=sp->bytes_per_line; + n-=sp->bytes_per_line; + } while(n>0); + return(1); +} + +static int +OJPEGDecodeScanlines(TIFF* tif, tidata_t buf, tsize_t cc) +{ + static const char module[]="OJPEGDecodeScanlines"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8* m; + uint32 n; + if (cc%sp->bytes_per_line!=0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read"); + return(0); + } + assert(cc>0); + m=buf; + n=cc; + do + { + if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&m,1)==0) + return(0); + m+=sp->bytes_per_line; + n-=sp->bytes_per_line; + } while(n>0); + return(1); +} + +static void +OJPEGPostDecode(TIFF* tif, tidata_t buf, tsize_t cc) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + (void)buf; + (void)cc; + sp->write_curstrile++; + if (sp->write_curstrile%tif->tif_dir.td_stripsperimage==0) + { + assert(sp->libjpeg_session_active!=0); + OJPEGLibjpegSessionAbort(tif); + sp->writeheader_done=0; + } +} + +static int +OJPEGSetupEncode(TIFF* tif) +{ + static const char module[]="OJPEGSetupEncode"; + TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead"); + return(0); +} + +static int +OJPEGPreEncode(TIFF* tif, tsample_t s) +{ + static const char module[]="OJPEGPreEncode"; + (void)s; + TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead"); + return(0); +} + +static int +OJPEGEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) +{ + static const char module[]="OJPEGEncode"; + (void)buf; + (void)cc; + (void)s; + TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead"); + return(0); +} + +static int +OJPEGPostEncode(TIFF* tif) +{ + static const char module[]="OJPEGPostEncode"; + TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead"); + return(0); +} + +static void +OJPEGCleanup(TIFF* tif) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + if (sp!=0) + { + tif->tif_tagmethods.vgetfield=sp->vgetparent; + tif->tif_tagmethods.vsetfield=sp->vsetparent; + if (sp->qtable[0]!=0) + _TIFFfree(sp->qtable[0]); + if (sp->qtable[1]!=0) + _TIFFfree(sp->qtable[1]); + if (sp->qtable[2]!=0) + _TIFFfree(sp->qtable[2]); + if (sp->qtable[3]!=0) + _TIFFfree(sp->qtable[3]); + if (sp->dctable[0]!=0) + _TIFFfree(sp->dctable[0]); + if (sp->dctable[1]!=0) + _TIFFfree(sp->dctable[1]); + if (sp->dctable[2]!=0) + _TIFFfree(sp->dctable[2]); + if (sp->dctable[3]!=0) + _TIFFfree(sp->dctable[3]); + if (sp->actable[0]!=0) + _TIFFfree(sp->actable[0]); + if (sp->actable[1]!=0) + _TIFFfree(sp->actable[1]); + if (sp->actable[2]!=0) + _TIFFfree(sp->actable[2]); + if (sp->actable[3]!=0) + _TIFFfree(sp->actable[3]); + if (sp->libjpeg_session_active!=0) + OJPEGLibjpegSessionAbort(tif); + if (sp->subsampling_convert_ycbcrbuf!=0) + _TIFFfree(sp->subsampling_convert_ycbcrbuf); + if (sp->subsampling_convert_ycbcrimage!=0) + _TIFFfree(sp->subsampling_convert_ycbcrimage); + if (sp->skip_buffer!=0) + _TIFFfree(sp->skip_buffer); + _TIFFfree(sp); + tif->tif_data=NULL; + _TIFFSetDefaultCompressionState(tif); + } +} + +static void +OJPEGSubsamplingCorrect(TIFF* tif) +{ + static const char module[]="OJPEGSubsamplingCorrect"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 mh; + uint8 mv; + assert(sp->subsamplingcorrect_done==0); + if ((tif->tif_dir.td_samplesperpixel!=3) || ((tif->tif_dir.td_photometric!=PHOTOMETRIC_YCBCR) && + (tif->tif_dir.td_photometric!=PHOTOMETRIC_ITULAB))) + { + if (sp->subsampling_tag!=0) + TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag not appropriate for this Photometric and/or SamplesPerPixel"); + sp->subsampling_hor=1; + sp->subsampling_ver=1; + sp->subsampling_force_desubsampling_inside_decompression=0; + } + else + { + sp->subsamplingcorrect_done=1; + mh=sp->subsampling_hor; + mv=sp->subsampling_ver; + sp->subsamplingcorrect=1; + OJPEGReadHeaderInfoSec(tif); + if (sp->subsampling_force_desubsampling_inside_decompression!=0) + { + sp->subsampling_hor=1; + sp->subsampling_ver=1; + } + sp->subsamplingcorrect=0; + if (((sp->subsampling_hor!=mh) || (sp->subsampling_ver!=mv)) && (sp->subsampling_force_desubsampling_inside_decompression==0)) + { + if (sp->subsampling_tag==0) + TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data [%d,%d] does not match default values [2,2]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver); + else + TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data [%d,%d] does not match subsampling tag values [%d,%d]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver,mh,mv); + } + if (sp->subsampling_force_desubsampling_inside_decompression!=0) + { + if (sp->subsampling_tag==0) + TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data does not match default values [2,2] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression"); + else + TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data does not match subsampling tag values [%d,%d] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression",mh,mv); + } + if (sp->subsampling_force_desubsampling_inside_decompression==0) + { + if (sp->subsampling_horsubsampling_ver) + TIFFWarningExt(tif->tif_clientdata,module,"Subsampling values [%d,%d] are not allowed in TIFF",sp->subsampling_hor,sp->subsampling_ver); + } + } + sp->subsamplingcorrect_done=1; +} + +static int +OJPEGReadHeaderInfo(TIFF* tif) +{ + static const char module[]="OJPEGReadHeaderInfo"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + assert(sp->readheader_done==0); + sp->image_width=tif->tif_dir.td_imagewidth; + sp->image_length=tif->tif_dir.td_imagelength; + if isTiled(tif) + { + sp->strile_width=tif->tif_dir.td_tilewidth; + sp->strile_length=tif->tif_dir.td_tilelength; + sp->strile_length_total=((sp->image_length+sp->strile_length-1)/sp->strile_length)*sp->strile_length; + } + else + { + sp->strile_width=sp->image_width; + sp->strile_length=tif->tif_dir.td_rowsperstrip; + sp->strile_length_total=sp->image_length; + } + sp->samples_per_pixel=tif->tif_dir.td_samplesperpixel; + if (sp->samples_per_pixel==1) + { + sp->plane_sample_offset=0; + sp->samples_per_pixel_per_plane=sp->samples_per_pixel; + sp->subsampling_hor=1; + sp->subsampling_ver=1; + } + else + { + if (sp->samples_per_pixel!=3) + { + TIFFErrorExt(tif->tif_clientdata,module,"SamplesPerPixel %d not supported for this compression scheme",sp->samples_per_pixel); + return(0); + } + sp->plane_sample_offset=0; + if (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG) + sp->samples_per_pixel_per_plane=3; + else + sp->samples_per_pixel_per_plane=1; + } + if (sp->strile_lengthimage_length) + { + if (sp->strile_length%(sp->subsampling_ver*8)!=0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Incompatible vertical subsampling and image strip/tile length"); + return(0); + } + sp->restart_interval=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8))*(sp->strile_length/(sp->subsampling_ver*8)); + } + if (OJPEGReadHeaderInfoSec(tif)==0) + return(0); + sp->sos_end[0].log=1; + sp->sos_end[0].in_buffer_source=sp->in_buffer_source; + sp->sos_end[0].in_buffer_next_strile=sp->in_buffer_next_strile; + sp->sos_end[0].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo; + sp->sos_end[0].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo; + sp->readheader_done=1; + return(1); +} + +static int +OJPEGReadSecondarySos(TIFF* tif, tsample_t s) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 m; + assert(s>0); + assert(s<3); + assert(sp->sos_end[0].log!=0); + assert(sp->sos_end[s].log==0); + sp->plane_sample_offset=s-1; + while(sp->sos_end[sp->plane_sample_offset].log==0) + sp->plane_sample_offset--; + sp->in_buffer_source=sp->sos_end[sp->plane_sample_offset].in_buffer_source; + sp->in_buffer_next_strile=sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile; + sp->in_buffer_file_pos=sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos; + sp->in_buffer_file_pos_log=0; + sp->in_buffer_file_togo=sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo; + sp->in_buffer_togo=0; + sp->in_buffer_cur=0; + while(sp->plane_sample_offsetplane_sample_offset++; + if (OJPEGReadHeaderInfoSecStreamSos(tif)==0) + return(0); + sp->sos_end[sp->plane_sample_offset].log=1; + sp->sos_end[sp->plane_sample_offset].in_buffer_source=sp->in_buffer_source; + sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile=sp->in_buffer_next_strile; + sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo; + sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo; + } + return(1); +} + +static int +OJPEGWriteHeaderInfo(TIFF* tif) +{ + static const char module[]="OJPEGWriteHeaderInfo"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8** m; + uint32 n; + assert(sp->libjpeg_session_active==0); + sp->out_state=ososSoi; + sp->restart_index=0; + jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr)); + sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutputMessage; + sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit; + sp->libjpeg_jpeg_decompress_struct.err=&(sp->libjpeg_jpeg_error_mgr); + sp->libjpeg_jpeg_decompress_struct.client_data=(void*)tif; + if (jpeg_create_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0) + return(0); + sp->libjpeg_session_active=1; + sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=0; + sp->libjpeg_jpeg_source_mgr.init_source=OJPEGLibjpegJpegSourceMgrInitSource; + sp->libjpeg_jpeg_source_mgr.fill_input_buffer=OJPEGLibjpegJpegSourceMgrFillInputBuffer; + sp->libjpeg_jpeg_source_mgr.skip_input_data=OJPEGLibjpegJpegSourceMgrSkipInputData; + sp->libjpeg_jpeg_source_mgr.resync_to_restart=OJPEGLibjpegJpegSourceMgrResyncToRestart; + sp->libjpeg_jpeg_source_mgr.term_source=OJPEGLibjpegJpegSourceMgrTermSource; + sp->libjpeg_jpeg_decompress_struct.src=&(sp->libjpeg_jpeg_source_mgr); + if (jpeg_read_header_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),1)==0) + return(0); + if ((sp->subsampling_force_desubsampling_inside_decompression==0) && (sp->samples_per_pixel_per_plane>1)) + { + sp->libjpeg_jpeg_decompress_struct.raw_data_out=1; +#if JPEG_LIB_VERSION >= 70 + sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling=FALSE; +#endif + sp->libjpeg_jpeg_query_style=0; + if (sp->subsampling_convert_log==0) + { + assert(sp->subsampling_convert_ycbcrbuf==0); + assert(sp->subsampling_convert_ycbcrimage==0); + sp->subsampling_convert_ylinelen=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8)*sp->subsampling_hor*8); + sp->subsampling_convert_ylines=sp->subsampling_ver*8; + sp->subsampling_convert_clinelen=sp->subsampling_convert_ylinelen/sp->subsampling_hor; + sp->subsampling_convert_clines=8; + sp->subsampling_convert_ybuflen=sp->subsampling_convert_ylinelen*sp->subsampling_convert_ylines; + sp->subsampling_convert_cbuflen=sp->subsampling_convert_clinelen*sp->subsampling_convert_clines; + sp->subsampling_convert_ycbcrbuflen=sp->subsampling_convert_ybuflen+2*sp->subsampling_convert_cbuflen; + sp->subsampling_convert_ycbcrbuf=_TIFFmalloc(sp->subsampling_convert_ycbcrbuflen); + if (sp->subsampling_convert_ycbcrbuf==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); + return(0); + } + sp->subsampling_convert_ybuf=sp->subsampling_convert_ycbcrbuf; + sp->subsampling_convert_cbbuf=sp->subsampling_convert_ybuf+sp->subsampling_convert_ybuflen; + sp->subsampling_convert_crbuf=sp->subsampling_convert_cbbuf+sp->subsampling_convert_cbuflen; + sp->subsampling_convert_ycbcrimagelen=3+sp->subsampling_convert_ylines+2*sp->subsampling_convert_clines; + sp->subsampling_convert_ycbcrimage=_TIFFmalloc(sp->subsampling_convert_ycbcrimagelen*sizeof(uint8*)); + if (sp->subsampling_convert_ycbcrimage==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); + return(0); + } + m=sp->subsampling_convert_ycbcrimage; + *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3); + *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines); + *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines+sp->subsampling_convert_clines); + for (n=0; nsubsampling_convert_ylines; n++) + *m++=sp->subsampling_convert_ybuf+n*sp->subsampling_convert_ylinelen; + for (n=0; nsubsampling_convert_clines; n++) + *m++=sp->subsampling_convert_cbbuf+n*sp->subsampling_convert_clinelen; + for (n=0; nsubsampling_convert_clines; n++) + *m++=sp->subsampling_convert_crbuf+n*sp->subsampling_convert_clinelen; + sp->subsampling_convert_clinelenout=((sp->strile_width+sp->subsampling_hor-1)/sp->subsampling_hor); + sp->subsampling_convert_state=0; + sp->bytes_per_line=sp->subsampling_convert_clinelenout*(sp->subsampling_ver*sp->subsampling_hor+2); + sp->lines_per_strile=((sp->strile_length+sp->subsampling_ver-1)/sp->subsampling_ver); + sp->subsampling_convert_log=1; + } + } + else + { + sp->libjpeg_jpeg_decompress_struct.jpeg_color_space=JCS_UNKNOWN; + sp->libjpeg_jpeg_decompress_struct.out_color_space=JCS_UNKNOWN; + sp->libjpeg_jpeg_query_style=1; + sp->bytes_per_line=sp->samples_per_pixel_per_plane*sp->strile_width; + sp->lines_per_strile=sp->strile_length; + } + if (jpeg_start_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0) + return(0); + sp->writeheader_done=1; + return(1); +} + +static void +OJPEGLibjpegSessionAbort(TIFF* tif) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + assert(sp->libjpeg_session_active!=0); + jpeg_destroy((jpeg_common_struct*)(&(sp->libjpeg_jpeg_decompress_struct))); + sp->libjpeg_session_active=0; +} + +static int +OJPEGReadHeaderInfoSec(TIFF* tif) +{ + static const char module[]="OJPEGReadHeaderInfoSec"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 m; + uint16 n; + uint8 o; + if (sp->file_size==0) + sp->file_size=TIFFGetFileSize(tif); + if (sp->jpeg_interchange_format!=0) + { + if (sp->jpeg_interchange_format>=sp->file_size) + { + sp->jpeg_interchange_format=0; + sp->jpeg_interchange_format_length=0; + } + else + { + if ((sp->jpeg_interchange_format_length==0) || (sp->jpeg_interchange_format+sp->jpeg_interchange_format_length>sp->file_size)) + sp->jpeg_interchange_format_length=sp->file_size-sp->jpeg_interchange_format; + } + } + sp->in_buffer_source=osibsNotSetYet; + sp->in_buffer_next_strile=0; + sp->in_buffer_strile_count=tif->tif_dir.td_nstrips; + sp->in_buffer_file_togo=0; + sp->in_buffer_togo=0; + do + { + if (OJPEGReadBytePeek(sp,&m)==0) + return(0); + if (m!=255) + break; + OJPEGReadByteAdvance(sp); + do + { + if (OJPEGReadByte(sp,&m)==0) + return(0); + } while(m==255); + switch(m) + { + case JPEG_MARKER_SOI: + /* this type of marker has no data, and should be skipped */ + break; + case JPEG_MARKER_COM: + case JPEG_MARKER_APP0: + case JPEG_MARKER_APP0+1: + case JPEG_MARKER_APP0+2: + case JPEG_MARKER_APP0+3: + case JPEG_MARKER_APP0+4: + case JPEG_MARKER_APP0+5: + case JPEG_MARKER_APP0+6: + case JPEG_MARKER_APP0+7: + case JPEG_MARKER_APP0+8: + case JPEG_MARKER_APP0+9: + case JPEG_MARKER_APP0+10: + case JPEG_MARKER_APP0+11: + case JPEG_MARKER_APP0+12: + case JPEG_MARKER_APP0+13: + case JPEG_MARKER_APP0+14: + case JPEG_MARKER_APP0+15: + /* this type of marker has data, but it has no use to us (and no place here) and should be skipped */ + if (OJPEGReadWord(sp,&n)==0) + return(0); + if (n<2) + { + if (sp->subsamplingcorrect==0) + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data"); + return(0); + } + if (n>2) + OJPEGReadSkip(sp,n-2); + break; + case JPEG_MARKER_DRI: + if (OJPEGReadHeaderInfoSecStreamDri(tif)==0) + return(0); + break; + case JPEG_MARKER_DQT: + if (OJPEGReadHeaderInfoSecStreamDqt(tif)==0) + return(0); + break; + case JPEG_MARKER_DHT: + if (OJPEGReadHeaderInfoSecStreamDht(tif)==0) + return(0); + break; + case JPEG_MARKER_SOF0: + case JPEG_MARKER_SOF1: + case JPEG_MARKER_SOF3: + if (OJPEGReadHeaderInfoSecStreamSof(tif,m)==0) + return(0); + if (sp->subsamplingcorrect!=0) + return(1); + break; + case JPEG_MARKER_SOS: + if (sp->subsamplingcorrect!=0) + return(1); + assert(sp->plane_sample_offset==0); + if (OJPEGReadHeaderInfoSecStreamSos(tif)==0) + return(0); + break; + default: + TIFFErrorExt(tif->tif_clientdata,module,"Unknown marker type %d in JPEG data",m); + return(0); + } + } while(m!=JPEG_MARKER_SOS); + if (sp->subsamplingcorrect) + return(1); + if (sp->sof_log==0) + { + if (OJPEGReadHeaderInfoSecTablesQTable(tif)==0) + return(0); + sp->sof_marker_id=JPEG_MARKER_SOF0; + for (o=0; osamples_per_pixel; o++) + sp->sof_c[o]=o; + sp->sof_hv[0]=((sp->subsampling_hor<<4)|sp->subsampling_ver); + for (o=1; osamples_per_pixel; o++) + sp->sof_hv[o]=17; + sp->sof_x=sp->strile_width; + sp->sof_y=sp->strile_length_total; + sp->sof_log=1; + if (OJPEGReadHeaderInfoSecTablesDcTable(tif)==0) + return(0); + if (OJPEGReadHeaderInfoSecTablesAcTable(tif)==0) + return(0); + for (o=1; osamples_per_pixel; o++) + sp->sos_cs[o]=o; + } + return(1); +} + +static int +OJPEGReadHeaderInfoSecStreamDri(TIFF* tif) +{ + /* this could easilly cause trouble in some cases... but no such cases have occured sofar */ + static const char module[]="OJPEGReadHeaderInfoSecStreamDri"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint16 m; + if (OJPEGReadWord(sp,&m)==0) + return(0); + if (m!=4) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DRI marker in JPEG data"); + return(0); + } + if (OJPEGReadWord(sp,&m)==0) + return(0); + sp->restart_interval=m; + return(1); +} + +static int +OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif) +{ + /* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */ + static const char module[]="OJPEGReadHeaderInfoSecStreamDqt"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint16 m; + uint32 na; + uint8* nb; + uint8 o; + if (OJPEGReadWord(sp,&m)==0) + return(0); + if (m<=2) + { + if (sp->subsamplingcorrect==0) + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data"); + return(0); + } + if (sp->subsamplingcorrect!=0) + OJPEGReadSkip(sp,m-2); + else + { + m-=2; + do + { + if (m<65) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data"); + return(0); + } + na=sizeof(uint32)+69; + nb=_TIFFmalloc(na); + if (nb==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); + return(0); + } + *(uint32*)nb=na; + nb[sizeof(uint32)]=255; + nb[sizeof(uint32)+1]=JPEG_MARKER_DQT; + nb[sizeof(uint32)+2]=0; + nb[sizeof(uint32)+3]=67; + if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) + return(0); + o=nb[sizeof(uint32)+4]&15; + if (3tif_clientdata,module,"Corrupt DQT marker in JPEG data"); + return(0); + } + if (sp->qtable[o]!=0) + _TIFFfree(sp->qtable[o]); + sp->qtable[o]=nb; + m-=65; + } while(m>0); + } + return(1); +} + +static int +OJPEGReadHeaderInfoSecStreamDht(TIFF* tif) +{ + /* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */ + /* TODO: the following assumes there is only one table in this marker... but i'm not quite sure that assumption is guaranteed correct */ + static const char module[]="OJPEGReadHeaderInfoSecStreamDht"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint16 m; + uint32 na; + uint8* nb; + uint8 o; + if (OJPEGReadWord(sp,&m)==0) + return(0); + if (m<=2) + { + if (sp->subsamplingcorrect==0) + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data"); + return(0); + } + if (sp->subsamplingcorrect!=0) + { + OJPEGReadSkip(sp,m-2); + } + else + { + na=sizeof(uint32)+2+m; + nb=_TIFFmalloc(na); + if (nb==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); + return(0); + } + *(uint32*)nb=na; + nb[sizeof(uint32)]=255; + nb[sizeof(uint32)+1]=JPEG_MARKER_DHT; + nb[sizeof(uint32)+2]=(m>>8); + nb[sizeof(uint32)+3]=(m&255); + if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) + return(0); + o=nb[sizeof(uint32)+4]; + if ((o&240)==0) + { + if (3tif_clientdata,module,"Corrupt DHT marker in JPEG data"); + return(0); + } + if (sp->dctable[o]!=0) + _TIFFfree(sp->dctable[o]); + sp->dctable[o]=nb; + } + else + { + if ((o&240)!=16) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data"); + return(0); + } + o&=15; + if (3tif_clientdata,module,"Corrupt DHT marker in JPEG data"); + return(0); + } + if (sp->actable[o]!=0) + _TIFFfree(sp->actable[o]); + sp->actable[o]=nb; + } + } + return(1); +} + +static int +OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id) +{ + /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */ + static const char module[]="OJPEGReadHeaderInfoSecStreamSof"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint16 m; + uint16 n; + uint8 o; + uint16 p; + uint16 q; + if (sp->sof_log!=0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data"); + return(0); + } + if (sp->subsamplingcorrect==0) + sp->sof_marker_id=marker_id; + /* Lf: data length */ + if (OJPEGReadWord(sp,&m)==0) + return(0); + if (m<11) + { + if (sp->subsamplingcorrect==0) + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data"); + return(0); + } + m-=8; + if (m%3!=0) + { + if (sp->subsamplingcorrect==0) + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data"); + return(0); + } + n=m/3; + if (sp->subsamplingcorrect==0) + { + if (n!=sp->samples_per_pixel) + { + TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of samples"); + return(0); + } + } + /* P: Sample precision */ + if (OJPEGReadByte(sp,&o)==0) + return(0); + if (o!=8) + { + if (sp->subsamplingcorrect==0) + TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of bits per sample"); + return(0); + } + /* Y: Number of lines, X: Number of samples per line */ + if (sp->subsamplingcorrect) + OJPEGReadSkip(sp,4); + else + { + /* TODO: probably best to also add check on allowed upper bound, especially x, may cause buffer overflow otherwise i think */ + /* Y: Number of lines */ + if (OJPEGReadWord(sp,&p)==0) + return(0); + if ((pimage_length) && (pstrile_length_total)) + { + TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected height"); + return(0); + } + sp->sof_y=p; + /* X: Number of samples per line */ + if (OJPEGReadWord(sp,&p)==0) + return(0); + if ((pimage_width) && (pstrile_width)) + { + TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected width"); + return(0); + } + sp->sof_x=p; + } + /* Nf: Number of image components in frame */ + if (OJPEGReadByte(sp,&o)==0) + return(0); + if (o!=n) + { + if (sp->subsamplingcorrect==0) + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data"); + return(0); + } + /* per component stuff */ + /* TODO: double-check that flow implies that n cannot be as big as to make us overflow sof_c, sof_hv and sof_tq arrays */ + for (q=0; qsubsamplingcorrect==0) + sp->sof_c[q]=o; + /* H: Horizontal sampling factor, and V: Vertical sampling factor */ + if (OJPEGReadByte(sp,&o)==0) + return(0); + if (sp->subsamplingcorrect!=0) + { + if (q==0) + { + sp->subsampling_hor=(o>>4); + sp->subsampling_ver=(o&15); + if (((sp->subsampling_hor!=1) && (sp->subsampling_hor!=2) && (sp->subsampling_hor!=4)) || + ((sp->subsampling_ver!=1) && (sp->subsampling_ver!=2) && (sp->subsampling_ver!=4))) + sp->subsampling_force_desubsampling_inside_decompression=1; + } + else + { + if (o!=17) + sp->subsampling_force_desubsampling_inside_decompression=1; + } + } + else + { + sp->sof_hv[q]=o; + if (sp->subsampling_force_desubsampling_inside_decompression==0) + { + if (q==0) + { + if (o!=((sp->subsampling_hor<<4)|sp->subsampling_ver)) + { + TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values"); + return(0); + } + } + else + { + if (o!=17) + { + TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values"); + return(0); + } + } + } + } + /* Tq: Quantization table destination selector */ + if (OJPEGReadByte(sp,&o)==0) + return(0); + if (sp->subsamplingcorrect==0) + sp->sof_tq[q]=o; + } + if (sp->subsamplingcorrect==0) + sp->sof_log=1; + return(1); +} + +static int +OJPEGReadHeaderInfoSecStreamSos(TIFF* tif) +{ + /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */ + static const char module[]="OJPEGReadHeaderInfoSecStreamSos"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint16 m; + uint8 n; + uint8 o; + assert(sp->subsamplingcorrect==0); + if (sp->sof_log==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data"); + return(0); + } + /* Ls */ + if (OJPEGReadWord(sp,&m)==0) + return(0); + if (m!=6+sp->samples_per_pixel_per_plane*2) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data"); + return(0); + } + /* Ns */ + if (OJPEGReadByte(sp,&n)==0) + return(0); + if (n!=sp->samples_per_pixel_per_plane) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data"); + return(0); + } + /* Cs, Td, and Ta */ + for (o=0; osamples_per_pixel_per_plane; o++) + { + /* Cs */ + if (OJPEGReadByte(sp,&n)==0) + return(0); + sp->sos_cs[sp->plane_sample_offset+o]=n; + /* Td and Ta */ + if (OJPEGReadByte(sp,&n)==0) + return(0); + sp->sos_tda[sp->plane_sample_offset+o]=n; + } + /* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, as per LibJpeg source */ + OJPEGReadSkip(sp,3); + return(1); +} + +static int +OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif) +{ + static const char module[]="OJPEGReadHeaderInfoSecTablesQTable"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 m; + uint8 n; + uint32 oa; + uint8* ob; + uint32 p; + if (sp->qtable_offset[0]==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); + return(0); + } + sp->in_buffer_file_pos_log=0; + for (m=0; msamples_per_pixel; m++) + { + if ((sp->qtable_offset[m]!=0) && ((m==0) || (sp->qtable_offset[m]!=sp->qtable_offset[m-1]))) + { + for (n=0; nqtable_offset[m]==sp->qtable_offset[n]) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegQTables tag value"); + return(0); + } + } + oa=sizeof(uint32)+69; + ob=_TIFFmalloc(oa); + if (ob==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); + return(0); + } + *(uint32*)ob=oa; + ob[sizeof(uint32)]=255; + ob[sizeof(uint32)+1]=JPEG_MARKER_DQT; + ob[sizeof(uint32)+2]=0; + ob[sizeof(uint32)+3]=67; + ob[sizeof(uint32)+4]=m; + TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET); + p=TIFFReadFile(tif,&ob[sizeof(uint32)+5],64); + if (p!=64) + return(0); + sp->qtable[m]=ob; + sp->sof_tq[m]=m; + } + else + sp->sof_tq[m]=sp->sof_tq[m-1]; + } + return(1); +} + +static int +OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif) +{ + static const char module[]="OJPEGReadHeaderInfoSecTablesDcTable"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 m; + uint8 n; + uint8 o[16]; + uint32 p; + uint32 q; + uint32 ra; + uint8* rb; + if (sp->dctable_offset[0]==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); + return(0); + } + sp->in_buffer_file_pos_log=0; + for (m=0; msamples_per_pixel; m++) + { + if ((sp->dctable_offset[m]!=0) && ((m==0) || (sp->dctable_offset[m]!=sp->dctable_offset[m-1]))) + { + for (n=0; ndctable_offset[m]==sp->dctable_offset[n]) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegDcTables tag value"); + return(0); + } + } + TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET); + p=TIFFReadFile(tif,o,16); + if (p!=16) + return(0); + q=0; + for (n=0; n<16; n++) + q+=o[n]; + ra=sizeof(uint32)+21+q; + rb=_TIFFmalloc(ra); + if (rb==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); + return(0); + } + *(uint32*)rb=ra; + rb[sizeof(uint32)]=255; + rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; + rb[sizeof(uint32)+2]=((19+q)>>8); + rb[sizeof(uint32)+3]=((19+q)&255); + rb[sizeof(uint32)+4]=m; + for (n=0; n<16; n++) + rb[sizeof(uint32)+5+n]=o[n]; + p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); + if (p!=q) + return(0); + sp->dctable[m]=rb; + sp->sos_tda[m]=(m<<4); + } + else + sp->sos_tda[m]=sp->sos_tda[m-1]; + } + return(1); +} + +static int +OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif) +{ + static const char module[]="OJPEGReadHeaderInfoSecTablesAcTable"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 m; + uint8 n; + uint8 o[16]; + uint32 p; + uint32 q; + uint32 ra; + uint8* rb; + if (sp->actable_offset[0]==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); + return(0); + } + sp->in_buffer_file_pos_log=0; + for (m=0; msamples_per_pixel; m++) + { + if ((sp->actable_offset[m]!=0) && ((m==0) || (sp->actable_offset[m]!=sp->actable_offset[m-1]))) + { + for (n=0; nactable_offset[m]==sp->actable_offset[n]) + { + TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegAcTables tag value"); + return(0); + } + } + TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET); + p=TIFFReadFile(tif,o,16); + if (p!=16) + return(0); + q=0; + for (n=0; n<16; n++) + q+=o[n]; + ra=sizeof(uint32)+21+q; + rb=_TIFFmalloc(ra); + if (rb==0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); + return(0); + } + *(uint32*)rb=ra; + rb[sizeof(uint32)]=255; + rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; + rb[sizeof(uint32)+2]=((19+q)>>8); + rb[sizeof(uint32)+3]=((19+q)&255); + rb[sizeof(uint32)+4]=(16|m); + for (n=0; n<16; n++) + rb[sizeof(uint32)+5+n]=o[n]; + p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); + if (p!=q) + return(0); + sp->actable[m]=rb; + sp->sos_tda[m]=(sp->sos_tda[m]|m); + } + else + sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15)); + } + return(1); +} + +static int +OJPEGReadBufferFill(OJPEGState* sp) +{ + uint16 m; + tsize_t n; + /* TODO: double-check: when subsamplingcorrect is set, no call to TIFFErrorExt or TIFFWarningExt should be made + * in any other case, seek or read errors should be passed through */ + do + { + if (sp->in_buffer_file_togo!=0) + { + if (sp->in_buffer_file_pos_log==0) + { + TIFFSeekFile(sp->tif,sp->in_buffer_file_pos,SEEK_SET); + sp->in_buffer_file_pos_log=1; + } + m=OJPEG_BUFFER; + if (m>sp->in_buffer_file_togo) + m=(uint16)sp->in_buffer_file_togo; + n=TIFFReadFile(sp->tif,sp->in_buffer,(tsize_t)m); + if (n==0) + return(0); + assert(n>0); + assert(n<=OJPEG_BUFFER); + assert(n<65536); + assert((uint16)n<=sp->in_buffer_file_togo); + m=(uint16)n; + sp->in_buffer_togo=m; + sp->in_buffer_cur=sp->in_buffer; + sp->in_buffer_file_togo-=m; + sp->in_buffer_file_pos+=m; + break; + } + sp->in_buffer_file_pos_log=0; + switch(sp->in_buffer_source) + { + case osibsNotSetYet: + if (sp->jpeg_interchange_format!=0) + { + sp->in_buffer_file_pos=sp->jpeg_interchange_format; + sp->in_buffer_file_togo=sp->jpeg_interchange_format_length; + } + sp->in_buffer_source=osibsJpegInterchangeFormat; + break; + case osibsJpegInterchangeFormat: + sp->in_buffer_source=osibsStrile; + case osibsStrile: + if (sp->in_buffer_next_strile==sp->in_buffer_strile_count) + sp->in_buffer_source=osibsEof; + else + { + sp->in_buffer_file_pos=sp->tif->tif_dir.td_stripoffset[sp->in_buffer_next_strile]; + if (sp->in_buffer_file_pos!=0) + { + if (sp->in_buffer_file_pos>=sp->file_size) + sp->in_buffer_file_pos=0; + else + { + sp->in_buffer_file_togo=sp->tif->tif_dir.td_stripbytecount[sp->in_buffer_next_strile]; + if (sp->in_buffer_file_togo==0) + sp->in_buffer_file_pos=0; + else if (sp->in_buffer_file_pos+sp->in_buffer_file_togo>sp->file_size) + sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos; + } + } + sp->in_buffer_next_strile++; + } + break; + default: + return(0); + } + } while (1); + return(1); +} + +static int +OJPEGReadByte(OJPEGState* sp, uint8* byte) +{ + if (sp->in_buffer_togo==0) + { + if (OJPEGReadBufferFill(sp)==0) + return(0); + assert(sp->in_buffer_togo>0); + } + *byte=*(sp->in_buffer_cur); + sp->in_buffer_cur++; + sp->in_buffer_togo--; + return(1); +} + +static int +OJPEGReadBytePeek(OJPEGState* sp, uint8* byte) +{ + if (sp->in_buffer_togo==0) + { + if (OJPEGReadBufferFill(sp)==0) + return(0); + assert(sp->in_buffer_togo>0); + } + *byte=*(sp->in_buffer_cur); + return(1); +} + +static void +OJPEGReadByteAdvance(OJPEGState* sp) +{ + assert(sp->in_buffer_togo>0); + sp->in_buffer_cur++; + sp->in_buffer_togo--; +} + +static int +OJPEGReadWord(OJPEGState* sp, uint16* word) +{ + uint8 m; + if (OJPEGReadByte(sp,&m)==0) + return(0); + *word=(m<<8); + if (OJPEGReadByte(sp,&m)==0) + return(0); + *word|=m; + return(1); +} + +static int +OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem) +{ + uint16 mlen; + uint8* mmem; + uint16 n; + assert(len>0); + mlen=len; + mmem=mem; + do + { + if (sp->in_buffer_togo==0) + { + if (OJPEGReadBufferFill(sp)==0) + return(0); + assert(sp->in_buffer_togo>0); + } + n=mlen; + if (n>sp->in_buffer_togo) + n=sp->in_buffer_togo; + _TIFFmemcpy(mmem,sp->in_buffer_cur,n); + sp->in_buffer_cur+=n; + sp->in_buffer_togo-=n; + mlen-=n; + mmem+=n; + } while(mlen>0); + return(1); +} + +static void +OJPEGReadSkip(OJPEGState* sp, uint16 len) +{ + uint16 m; + uint16 n; + m=len; + n=m; + if (n>sp->in_buffer_togo) + n=sp->in_buffer_togo; + sp->in_buffer_cur+=n; + sp->in_buffer_togo-=n; + m-=n; + if (m>0) + { + assert(sp->in_buffer_togo==0); + n=m; + if (n>sp->in_buffer_file_togo) + n=sp->in_buffer_file_togo; + sp->in_buffer_file_pos+=n; + sp->in_buffer_file_togo-=n; + sp->in_buffer_file_pos_log=0; + /* we don't skip past jpeginterchangeformat/strile block... + * if that is asked from us, we're dealing with totally bazurk + * data anyway, and we've not seen this happening on any + * testfile, so we might as well likely cause some other + * meaningless error to be passed at some later time + */ + } +} + +static int +OJPEGWriteStream(TIFF* tif, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + *len=0; + do + { + assert(sp->out_state<=ososEoi); + switch(sp->out_state) + { + case ososSoi: + OJPEGWriteStreamSoi(tif,mem,len); + break; + case ososQTable0: + OJPEGWriteStreamQTable(tif,0,mem,len); + break; + case ososQTable1: + OJPEGWriteStreamQTable(tif,1,mem,len); + break; + case ososQTable2: + OJPEGWriteStreamQTable(tif,2,mem,len); + break; + case ososQTable3: + OJPEGWriteStreamQTable(tif,3,mem,len); + break; + case ososDcTable0: + OJPEGWriteStreamDcTable(tif,0,mem,len); + break; + case ososDcTable1: + OJPEGWriteStreamDcTable(tif,1,mem,len); + break; + case ososDcTable2: + OJPEGWriteStreamDcTable(tif,2,mem,len); + break; + case ososDcTable3: + OJPEGWriteStreamDcTable(tif,3,mem,len); + break; + case ososAcTable0: + OJPEGWriteStreamAcTable(tif,0,mem,len); + break; + case ososAcTable1: + OJPEGWriteStreamAcTable(tif,1,mem,len); + break; + case ososAcTable2: + OJPEGWriteStreamAcTable(tif,2,mem,len); + break; + case ososAcTable3: + OJPEGWriteStreamAcTable(tif,3,mem,len); + break; + case ososDri: + OJPEGWriteStreamDri(tif,mem,len); + break; + case ososSof: + OJPEGWriteStreamSof(tif,mem,len); + break; + case ososSos: + OJPEGWriteStreamSos(tif,mem,len); + break; + case ososCompressed: + if (OJPEGWriteStreamCompressed(tif,mem,len)==0) + return(0); + break; + case ososRst: + OJPEGWriteStreamRst(tif,mem,len); + break; + case ososEoi: + OJPEGWriteStreamEoi(tif,mem,len); + break; + } + } while (*len==0); + return(1); +} + +static void +OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + assert(OJPEG_BUFFER>=2); + sp->out_buffer[0]=255; + sp->out_buffer[1]=JPEG_MARKER_SOI; + *len=2; + *mem=(void*)sp->out_buffer; + sp->out_state++; +} + +static void +OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + if (sp->qtable[table_index]!=0) + { + *mem=(void*)(sp->qtable[table_index]+sizeof(uint32)); + *len=*((uint32*)sp->qtable[table_index])-sizeof(uint32); + } + sp->out_state++; +} + +static void +OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + if (sp->dctable[table_index]!=0) + { + *mem=(void*)(sp->dctable[table_index]+sizeof(uint32)); + *len=*((uint32*)sp->dctable[table_index])-sizeof(uint32); + } + sp->out_state++; +} + +static void +OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + if (sp->actable[table_index]!=0) + { + *mem=(void*)(sp->actable[table_index]+sizeof(uint32)); + *len=*((uint32*)sp->actable[table_index])-sizeof(uint32); + } + sp->out_state++; +} + +static void +OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + assert(OJPEG_BUFFER>=6); + if (sp->restart_interval!=0) + { + sp->out_buffer[0]=255; + sp->out_buffer[1]=JPEG_MARKER_DRI; + sp->out_buffer[2]=0; + sp->out_buffer[3]=4; + sp->out_buffer[4]=(sp->restart_interval>>8); + sp->out_buffer[5]=(sp->restart_interval&255); + *len=6; + *mem=(void*)sp->out_buffer; + } + sp->out_state++; +} + +static void +OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 m; + assert(OJPEG_BUFFER>=2+8+sp->samples_per_pixel_per_plane*3); + assert(255>=8+sp->samples_per_pixel_per_plane*3); + sp->out_buffer[0]=255; + sp->out_buffer[1]=sp->sof_marker_id; + /* Lf */ + sp->out_buffer[2]=0; + sp->out_buffer[3]=8+sp->samples_per_pixel_per_plane*3; + /* P */ + sp->out_buffer[4]=8; + /* Y */ + sp->out_buffer[5]=(sp->sof_y>>8); + sp->out_buffer[6]=(sp->sof_y&255); + /* X */ + sp->out_buffer[7]=(sp->sof_x>>8); + sp->out_buffer[8]=(sp->sof_x&255); + /* Nf */ + sp->out_buffer[9]=sp->samples_per_pixel_per_plane; + for (m=0; msamples_per_pixel_per_plane; m++) + { + /* C */ + sp->out_buffer[10+m*3]=sp->sof_c[sp->plane_sample_offset+m]; + /* H and V */ + sp->out_buffer[10+m*3+1]=sp->sof_hv[sp->plane_sample_offset+m]; + /* Tq */ + sp->out_buffer[10+m*3+2]=sp->sof_tq[sp->plane_sample_offset+m]; + } + *len=10+sp->samples_per_pixel_per_plane*3; + *mem=(void*)sp->out_buffer; + sp->out_state++; +} + +static void +OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + uint8 m; + assert(OJPEG_BUFFER>=2+6+sp->samples_per_pixel_per_plane*2); + assert(255>=6+sp->samples_per_pixel_per_plane*2); + sp->out_buffer[0]=255; + sp->out_buffer[1]=JPEG_MARKER_SOS; + /* Ls */ + sp->out_buffer[2]=0; + sp->out_buffer[3]=6+sp->samples_per_pixel_per_plane*2; + /* Ns */ + sp->out_buffer[4]=sp->samples_per_pixel_per_plane; + for (m=0; msamples_per_pixel_per_plane; m++) + { + /* Cs */ + sp->out_buffer[5+m*2]=sp->sos_cs[sp->plane_sample_offset+m]; + /* Td and Ta */ + sp->out_buffer[5+m*2+1]=sp->sos_tda[sp->plane_sample_offset+m]; + } + /* Ss */ + sp->out_buffer[5+sp->samples_per_pixel_per_plane*2]=0; + /* Se */ + sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+1]=63; + /* Ah and Al */ + sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+2]=0; + *len=8+sp->samples_per_pixel_per_plane*2; + *mem=(void*)sp->out_buffer; + sp->out_state++; +} + +static int +OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + if (sp->in_buffer_togo==0) + { + if (OJPEGReadBufferFill(sp)==0) + return(0); + assert(sp->in_buffer_togo>0); + } + *len=sp->in_buffer_togo; + *mem=(void*)sp->in_buffer_cur; + sp->in_buffer_togo=0; + if (sp->in_buffer_file_togo==0) + { + switch(sp->in_buffer_source) + { + case osibsStrile: + if (sp->in_buffer_next_strilein_buffer_strile_count) + sp->out_state=ososRst; + else + sp->out_state=ososEoi; + break; + case osibsEof: + sp->out_state=ososEoi; + break; + default: + break; + } + } + return(1); +} + +static void +OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + assert(OJPEG_BUFFER>=2); + sp->out_buffer[0]=255; + sp->out_buffer[1]=JPEG_MARKER_RST0+sp->restart_index; + sp->restart_index++; + if (sp->restart_index==8) + sp->restart_index=0; + *len=2; + *mem=(void*)sp->out_buffer; + sp->out_state=ososCompressed; +} + +static void +OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + assert(OJPEG_BUFFER>=2); + sp->out_buffer[0]=255; + sp->out_buffer[1]=JPEG_MARKER_EOI; + *len=2; + *mem=(void*)sp->out_buffer; +} + +#ifndef LIBJPEG_ENCAP_EXTERNAL +static int +jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo) +{ + return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_create_decompress(cinfo),1)); +} +#endif + +#ifndef LIBJPEG_ENCAP_EXTERNAL +static int +jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image) +{ + return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_header(cinfo,require_image),1)); +} +#endif + +#ifndef LIBJPEG_ENCAP_EXTERNAL +static int +jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo) +{ + return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_start_decompress(cinfo),1)); +} +#endif + +#ifndef LIBJPEG_ENCAP_EXTERNAL +static int +jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines) +{ + return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_scanlines(cinfo,scanlines,max_lines),1)); +} +#endif + +#ifndef LIBJPEG_ENCAP_EXTERNAL +static int +jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines) +{ + return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_raw_data(cinfo,data,max_lines),1)); +} +#endif + +#ifndef LIBJPEG_ENCAP_EXTERNAL +static void +jpeg_encap_unwind(TIFF* tif) +{ + OJPEGState* sp=(OJPEGState*)tif->tif_data; + LONGJMP(sp->exit_jmpbuf,1); +} +#endif + +static void +OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + (*cinfo->err->format_message)(cinfo,buffer); + TIFFWarningExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg", "%s", buffer); +} + +static void +OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + (*cinfo->err->format_message)(cinfo,buffer); + TIFFErrorExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg", "%s", buffer); + jpeg_encap_unwind((TIFF*)(cinfo->client_data)); +} + +static void +OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo) +{ + (void)cinfo; +} + +static boolean +OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo) +{ + TIFF* tif=(TIFF*)cinfo->client_data; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + void* mem=0; + uint32 len=0; + if (OJPEGWriteStream(tif,&mem,&len)==0) + { + TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPEG data"); + jpeg_encap_unwind(tif); + } + sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=len; + sp->libjpeg_jpeg_source_mgr.next_input_byte=mem; + return(1); +} + +static void +OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes) +{ + TIFF* tif=(TIFF*)cinfo->client_data; + (void)num_bytes; + TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error"); + jpeg_encap_unwind(tif); +} + +static boolean +OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired) +{ + TIFF* tif=(TIFF*)cinfo->client_data; + (void)desired; + TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error"); + jpeg_encap_unwind(tif); + return(0); +} + +static void +OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo) +{ + (void)cinfo; +} + +#endif + + diff --git a/src/3rdparty/libtiff/libtiff/tif_open.c b/src/3rdparty/libtiff/libtiff/tif_open.c new file mode 100644 index 0000000000..a567056ce7 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_open.c @@ -0,0 +1,688 @@ +/* $Id: tif_open.c,v 1.33 2006/06/08 14:27:17 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + */ +#include "tiffiop.h" + +static const long typemask[13] = { + (long)0L, /* TIFF_NOTYPE */ + (long)0x000000ffL, /* TIFF_BYTE */ + (long)0xffffffffL, /* TIFF_ASCII */ + (long)0x0000ffffL, /* TIFF_SHORT */ + (long)0xffffffffL, /* TIFF_LONG */ + (long)0xffffffffL, /* TIFF_RATIONAL */ + (long)0x000000ffL, /* TIFF_SBYTE */ + (long)0x000000ffL, /* TIFF_UNDEFINED */ + (long)0x0000ffffL, /* TIFF_SSHORT */ + (long)0xffffffffL, /* TIFF_SLONG */ + (long)0xffffffffL, /* TIFF_SRATIONAL */ + (long)0xffffffffL, /* TIFF_FLOAT */ + (long)0xffffffffL, /* TIFF_DOUBLE */ +}; +static const int bigTypeshift[13] = { + 0, /* TIFF_NOTYPE */ + 24, /* TIFF_BYTE */ + 0, /* TIFF_ASCII */ + 16, /* TIFF_SHORT */ + 0, /* TIFF_LONG */ + 0, /* TIFF_RATIONAL */ + 24, /* TIFF_SBYTE */ + 24, /* TIFF_UNDEFINED */ + 16, /* TIFF_SSHORT */ + 0, /* TIFF_SLONG */ + 0, /* TIFF_SRATIONAL */ + 0, /* TIFF_FLOAT */ + 0, /* TIFF_DOUBLE */ +}; +static const int litTypeshift[13] = { + 0, /* TIFF_NOTYPE */ + 0, /* TIFF_BYTE */ + 0, /* TIFF_ASCII */ + 0, /* TIFF_SHORT */ + 0, /* TIFF_LONG */ + 0, /* TIFF_RATIONAL */ + 0, /* TIFF_SBYTE */ + 0, /* TIFF_UNDEFINED */ + 0, /* TIFF_SSHORT */ + 0, /* TIFF_SLONG */ + 0, /* TIFF_SRATIONAL */ + 0, /* TIFF_FLOAT */ + 0, /* TIFF_DOUBLE */ +}; + +/* + * Dummy functions to fill the omitted client procedures. + */ +static int +_tiffDummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + (void) fd; (void) pbase; (void) psize; + return (0); +} + +static void +_tiffDummyUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ + (void) fd; (void) base; (void) size; +} + +/* + * Initialize the shift & mask tables, and the + * byte swapping state according to the file + * contents and the machine architecture. + */ +static void +TIFFInitOrder(TIFF* tif, int magic) +{ + tif->tif_typemask = typemask; + if (magic == TIFF_BIGENDIAN) { + tif->tif_typeshift = bigTypeshift; +#ifndef WORDS_BIGENDIAN + tif->tif_flags |= TIFF_SWAB; +#endif + } else { + tif->tif_typeshift = litTypeshift; +#ifdef WORDS_BIGENDIAN + tif->tif_flags |= TIFF_SWAB; +#endif + } +} + +int +_TIFFgetMode(const char* mode, const char* module) +{ + int m = -1; + + switch (mode[0]) { + case 'r': + m = O_RDONLY; + if (mode[1] == '+') + m = O_RDWR; + break; + case 'w': + case 'a': + m = O_RDWR|O_CREAT; + if (mode[0] == 'w') + m |= O_TRUNC; + break; + default: + TIFFErrorExt(0, module, "\"%s\": Bad mode", mode); + break; + } + return (m); +} + +TIFF* +TIFFClientOpen( + const char* name, const char* mode, + thandle_t clientdata, + TIFFReadWriteProc readproc, + TIFFReadWriteProc writeproc, + TIFFSeekProc seekproc, + TIFFCloseProc closeproc, + TIFFSizeProc sizeproc, + TIFFMapFileProc mapproc, + TIFFUnmapFileProc unmapproc +) +{ + static const char module[] = "TIFFClientOpen"; + TIFF *tif; + int m; + const char* cp; + + m = _TIFFgetMode(mode, module); + if (m == -1) + goto bad2; + tif = (TIFF *)_TIFFmalloc(sizeof (TIFF) + strlen(name) + 1); + if (tif == NULL) { + TIFFErrorExt(clientdata, module, "%s: Out of memory (TIFF structure)", name); + goto bad2; + } + _TIFFmemset(tif, 0, sizeof (*tif)); + tif->tif_name = (char *)tif + sizeof (TIFF); + strcpy(tif->tif_name, name); + tif->tif_mode = m &~ (O_CREAT|O_TRUNC); + tif->tif_curdir = (tdir_t) -1; /* non-existent directory */ + tif->tif_curoff = 0; + tif->tif_curstrip = (tstrip_t) -1; /* invalid strip */ + tif->tif_row = (uint32) -1; /* read/write pre-increment */ + tif->tif_clientdata = clientdata; + if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc) { + TIFFErrorExt(clientdata, module, + "One of the client procedures is NULL pointer."); + goto bad2; + } + tif->tif_readproc = readproc; + tif->tif_writeproc = writeproc; + tif->tif_seekproc = seekproc; + tif->tif_closeproc = closeproc; + tif->tif_sizeproc = sizeproc; + if (mapproc) + tif->tif_mapproc = mapproc; + else + tif->tif_mapproc = _tiffDummyMapProc; + if (unmapproc) + tif->tif_unmapproc = unmapproc; + else + tif->tif_unmapproc = _tiffDummyUnmapProc; + _TIFFSetDefaultCompressionState(tif); /* setup default state */ + /* + * Default is to return data MSB2LSB and enable the + * use of memory-mapped files and strip chopping when + * a file is opened read-only. + */ + tif->tif_flags = FILLORDER_MSB2LSB; + if (m == O_RDONLY ) + tif->tif_flags |= TIFF_MAPPED; + +#ifdef STRIPCHOP_DEFAULT + if (m == O_RDONLY || m == O_RDWR) + tif->tif_flags |= STRIPCHOP_DEFAULT; +#endif + + /* + * Process library-specific flags in the open mode string. + * The following flags may be used to control intrinsic library + * behaviour that may or may not be desirable (usually for + * compatibility with some application that claims to support + * TIFF but only supports some braindead idea of what the + * vendor thinks TIFF is): + * + * 'l' use little-endian byte order for creating a file + * 'b' use big-endian byte order for creating a file + * 'L' read/write information using LSB2MSB bit order + * 'B' read/write information using MSB2LSB bit order + * 'H' read/write information using host bit order + * 'M' enable use of memory-mapped files when supported + * 'm' disable use of memory-mapped files + * 'C' enable strip chopping support when reading + * 'c' disable strip chopping support + * 'h' read TIFF header only, do not load the first IFD + * + * The use of the 'l' and 'b' flags is strongly discouraged. + * These flags are provided solely because numerous vendors, + * typically on the PC, do not correctly support TIFF; they + * only support the Intel little-endian byte order. This + * support is not configured by default because it supports + * the violation of the TIFF spec that says that readers *MUST* + * support both byte orders. It is strongly recommended that + * you not use this feature except to deal with busted apps + * that write invalid TIFF. And even in those cases you should + * bang on the vendors to fix their software. + * + * The 'L', 'B', and 'H' flags are intended for applications + * that can optimize operations on data by using a particular + * bit order. By default the library returns data in MSB2LSB + * bit order for compatibiltiy with older versions of this + * library. Returning data in the bit order of the native cpu + * makes the most sense but also requires applications to check + * the value of the FillOrder tag; something they probably do + * not do right now. + * + * The 'M' and 'm' flags are provided because some virtual memory + * systems exhibit poor behaviour when large images are mapped. + * These options permit clients to control the use of memory-mapped + * files on a per-file basis. + * + * The 'C' and 'c' flags are provided because the library support + * for chopping up large strips into multiple smaller strips is not + * application-transparent and as such can cause problems. The 'c' + * option permits applications that only want to look at the tags, + * for example, to get the unadulterated TIFF tag information. + */ + for (cp = mode; *cp; cp++) + switch (*cp) { + case 'b': +#ifndef WORDS_BIGENDIAN + if (m&O_CREAT) + tif->tif_flags |= TIFF_SWAB; +#endif + break; + case 'l': +#ifdef WORDS_BIGENDIAN + if ((m&O_CREAT)) + tif->tif_flags |= TIFF_SWAB; +#endif + break; + case 'B': + tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | + FILLORDER_MSB2LSB; + break; + case 'L': + tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | + FILLORDER_LSB2MSB; + break; + case 'H': + tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | + HOST_FILLORDER; + break; + case 'M': + if (m == O_RDONLY) + tif->tif_flags |= TIFF_MAPPED; + break; + case 'm': + if (m == O_RDONLY) + tif->tif_flags &= ~TIFF_MAPPED; + break; + case 'C': + if (m == O_RDONLY) + tif->tif_flags |= TIFF_STRIPCHOP; + break; + case 'c': + if (m == O_RDONLY) + tif->tif_flags &= ~TIFF_STRIPCHOP; + break; + case 'h': + tif->tif_flags |= TIFF_HEADERONLY; + break; + } + /* + * Read in TIFF header. + */ + if (tif->tif_mode & O_TRUNC || + !ReadOK(tif, &tif->tif_header, sizeof (TIFFHeader))) { + if (tif->tif_mode == O_RDONLY) { + TIFFErrorExt(tif->tif_clientdata, name, + "Cannot read TIFF header"); + goto bad; + } + /* + * Setup header and write. + */ +#ifdef WORDS_BIGENDIAN + tif->tif_header.tiff_magic = tif->tif_flags & TIFF_SWAB + ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN; +#else + tif->tif_header.tiff_magic = tif->tif_flags & TIFF_SWAB + ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN; +#endif + tif->tif_header.tiff_version = TIFF_VERSION; + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabShort(&tif->tif_header.tiff_version); + tif->tif_header.tiff_diroff = 0; /* filled in later */ + + + /* + * The doc for "fopen" for some STD_C_LIBs says that if you + * open a file for modify ("+"), then you must fseek (or + * fflush?) between any freads and fwrites. This is not + * necessary on most systems, but has been shown to be needed + * on Solaris. + */ + TIFFSeekFile( tif, 0, SEEK_SET ); + + if (!WriteOK(tif, &tif->tif_header, sizeof (TIFFHeader))) { + TIFFErrorExt(tif->tif_clientdata, name, + "Error writing TIFF header"); + goto bad; + } + /* + * Setup the byte order handling. + */ + TIFFInitOrder(tif, tif->tif_header.tiff_magic); + /* + * Setup default directory. + */ + if (!TIFFDefaultDirectory(tif)) + goto bad; + tif->tif_diroff = 0; + tif->tif_dirlist = NULL; + tif->tif_dirlistsize = 0; + tif->tif_dirnumber = 0; + return (tif); + } + /* + * Setup the byte order handling. + */ + if (tif->tif_header.tiff_magic != TIFF_BIGENDIAN && + tif->tif_header.tiff_magic != TIFF_LITTLEENDIAN +#if MDI_SUPPORT + && +#if HOST_BIGENDIAN + tif->tif_header.tiff_magic != MDI_BIGENDIAN +#else + tif->tif_header.tiff_magic != MDI_LITTLEENDIAN +#endif + ) { + TIFFErrorExt(tif->tif_clientdata, name, + "Not a TIFF or MDI file, bad magic number %d (0x%x)", +#else + ) { + TIFFErrorExt(tif->tif_clientdata, name, + "Not a TIFF file, bad magic number %d (0x%x)", +#endif + tif->tif_header.tiff_magic, + tif->tif_header.tiff_magic); + goto bad; + } + TIFFInitOrder(tif, tif->tif_header.tiff_magic); + /* + * Swap header if required. + */ + if (tif->tif_flags & TIFF_SWAB) { + TIFFSwabShort(&tif->tif_header.tiff_version); + TIFFSwabLong(&tif->tif_header.tiff_diroff); + } + /* + * Now check version (if needed, it's been byte-swapped). + * Note that this isn't actually a version number, it's a + * magic number that doesn't change (stupid). + */ + if (tif->tif_header.tiff_version == TIFF_BIGTIFF_VERSION) { + TIFFErrorExt(tif->tif_clientdata, name, + "This is a BigTIFF file. This format not supported\n" + "by this version of libtiff." ); + goto bad; + } + if (tif->tif_header.tiff_version != TIFF_VERSION) { + TIFFErrorExt(tif->tif_clientdata, name, + "Not a TIFF file, bad version number %d (0x%x)", + tif->tif_header.tiff_version, + tif->tif_header.tiff_version); + goto bad; + } + tif->tif_flags |= TIFF_MYBUFFER; + tif->tif_rawcp = tif->tif_rawdata = 0; + tif->tif_rawdatasize = 0; + + /* + * Sometimes we do not want to read the first directory (for example, + * it may be broken) and want to proceed to other directories. I this + * case we use the TIFF_HEADERONLY flag to open file and return + * immediately after reading TIFF header. + */ + if (tif->tif_flags & TIFF_HEADERONLY) + return (tif); + + /* + * Setup initial directory. + */ + switch (mode[0]) { + case 'r': + tif->tif_nextdiroff = tif->tif_header.tiff_diroff; + /* + * Try to use a memory-mapped file if the client + * has not explicitly suppressed usage with the + * 'm' flag in the open mode (see above). + */ + if ((tif->tif_flags & TIFF_MAPPED) && + !TIFFMapFileContents(tif, (tdata_t*) &tif->tif_base, &tif->tif_size)) + tif->tif_flags &= ~TIFF_MAPPED; + if (TIFFReadDirectory(tif)) { + tif->tif_rawcc = -1; + tif->tif_flags |= TIFF_BUFFERSETUP; + return (tif); + } + break; + case 'a': + /* + * New directories are automatically append + * to the end of the directory chain when they + * are written out (see TIFFWriteDirectory). + */ + if (!TIFFDefaultDirectory(tif)) + goto bad; + return (tif); + } +bad: + tif->tif_mode = O_RDONLY; /* XXX avoid flush */ + TIFFCleanup(tif); +bad2: + return ((TIFF*)0); +} + +/* + * Query functions to access private data. + */ + +/* + * Return open file's name. + */ +const char * +TIFFFileName(TIFF* tif) +{ + return (tif->tif_name); +} + +/* + * Set the file name. + */ +const char * +TIFFSetFileName(TIFF* tif, const char *name) +{ + const char* old_name = tif->tif_name; + tif->tif_name = (char *)name; + return (old_name); +} + +/* + * Return open file's I/O descriptor. + */ +int +TIFFFileno(TIFF* tif) +{ + return (tif->tif_fd); +} + +/* + * Set open file's I/O descriptor, and return previous value. + */ +int +TIFFSetFileno(TIFF* tif, int fd) +{ + int old_fd = tif->tif_fd; + tif->tif_fd = fd; + return old_fd; +} + +/* + * Return open file's clientdata. + */ +thandle_t +TIFFClientdata(TIFF* tif) +{ + return (tif->tif_clientdata); +} + +/* + * Set open file's clientdata, and return previous value. + */ +thandle_t +TIFFSetClientdata(TIFF* tif, thandle_t newvalue) +{ + thandle_t m = tif->tif_clientdata; + tif->tif_clientdata = newvalue; + return m; +} + +/* + * Return read/write mode. + */ +int +TIFFGetMode(TIFF* tif) +{ + return (tif->tif_mode); +} + +/* + * Return read/write mode. + */ +int +TIFFSetMode(TIFF* tif, int mode) +{ + int old_mode = tif->tif_mode; + tif->tif_mode = mode; + return (old_mode); +} + +/* + * Return nonzero if file is organized in + * tiles; zero if organized as strips. + */ +int +TIFFIsTiled(TIFF* tif) +{ + return (isTiled(tif)); +} + +/* + * Return current row being read/written. + */ +uint32 +TIFFCurrentRow(TIFF* tif) +{ + return (tif->tif_row); +} + +/* + * Return index of the current directory. + */ +tdir_t +TIFFCurrentDirectory(TIFF* tif) +{ + return (tif->tif_curdir); +} + +/* + * Return current strip. + */ +tstrip_t +TIFFCurrentStrip(TIFF* tif) +{ + return (tif->tif_curstrip); +} + +/* + * Return current tile. + */ +ttile_t +TIFFCurrentTile(TIFF* tif) +{ + return (tif->tif_curtile); +} + +/* + * Return nonzero if the file has byte-swapped data. + */ +int +TIFFIsByteSwapped(TIFF* tif) +{ + return ((tif->tif_flags & TIFF_SWAB) != 0); +} + +/* + * Return nonzero if the data is returned up-sampled. + */ +int +TIFFIsUpSampled(TIFF* tif) +{ + return (isUpSampled(tif)); +} + +/* + * Return nonzero if the data is returned in MSB-to-LSB bit order. + */ +int +TIFFIsMSB2LSB(TIFF* tif) +{ + return (isFillOrder(tif, FILLORDER_MSB2LSB)); +} + +/* + * Return nonzero if given file was written in big-endian order. + */ +int +TIFFIsBigEndian(TIFF* tif) +{ + return (tif->tif_header.tiff_magic == TIFF_BIGENDIAN); +} + +/* + * Return pointer to file read method. + */ +TIFFReadWriteProc +TIFFGetReadProc(TIFF* tif) +{ + return (tif->tif_readproc); +} + +/* + * Return pointer to file write method. + */ +TIFFReadWriteProc +TIFFGetWriteProc(TIFF* tif) +{ + return (tif->tif_writeproc); +} + +/* + * Return pointer to file seek method. + */ +TIFFSeekProc +TIFFGetSeekProc(TIFF* tif) +{ + return (tif->tif_seekproc); +} + +/* + * Return pointer to file close method. + */ +TIFFCloseProc +TIFFGetCloseProc(TIFF* tif) +{ + return (tif->tif_closeproc); +} + +/* + * Return pointer to file size requesting method. + */ +TIFFSizeProc +TIFFGetSizeProc(TIFF* tif) +{ + return (tif->tif_sizeproc); +} + +/* + * Return pointer to memory mapping method. + */ +TIFFMapFileProc +TIFFGetMapFileProc(TIFF* tif) +{ + return (tif->tif_mapproc); +} + +/* + * Return pointer to memory unmapping method. + */ +TIFFUnmapFileProc +TIFFGetUnmapFileProc(TIFF* tif) +{ + return (tif->tif_unmapproc); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_packbits.c b/src/3rdparty/libtiff/libtiff/tif_packbits.c new file mode 100644 index 0000000000..171a2692a8 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_packbits.c @@ -0,0 +1,293 @@ +/* $Id: tif_packbits.c,v 1.13.2.1 2009-01-01 00:10:43 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "tiffiop.h" +#ifdef PACKBITS_SUPPORT +/* + * TIFF Library. + * + * PackBits Compression Algorithm Support + */ +#include + +static int +PackBitsPreEncode(TIFF* tif, tsample_t s) +{ + (void) s; + + if (!(tif->tif_data = (tidata_t)_TIFFmalloc(sizeof(tsize_t)))) + return (0); + /* + * Calculate the scanline/tile-width size in bytes. + */ + if (isTiled(tif)) + *(tsize_t*)tif->tif_data = TIFFTileRowSize(tif); + else + *(tsize_t*)tif->tif_data = TIFFScanlineSize(tif); + return (1); +} + +static int +PackBitsPostEncode(TIFF* tif) +{ + if (tif->tif_data) + _TIFFfree(tif->tif_data); + return (1); +} + +/* + * NB: tidata is the type representing *(tidata_t); + * if tidata_t is made signed then this type must + * be adjusted accordingly. + */ +typedef unsigned char tidata; + +/* + * Encode a run of pixels. + */ +static int +PackBitsEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) +{ + unsigned char* bp = (unsigned char*) buf; + tidata_t op, ep, lastliteral; + long n, slop; + int b; + enum { BASE, LITERAL, RUN, LITERAL_RUN } state; + + (void) s; + op = tif->tif_rawcp; + ep = tif->tif_rawdata + tif->tif_rawdatasize; + state = BASE; + lastliteral = 0; + while (cc > 0) { + /* + * Find the longest string of identical bytes. + */ + b = *bp++, cc--, n = 1; + for (; cc > 0 && b == *bp; cc--, bp++) + n++; + again: + if (op + 2 >= ep) { /* insure space for new data */ + /* + * Be careful about writing the last + * literal. Must write up to that point + * and then copy the remainder to the + * front of the buffer. + */ + if (state == LITERAL || state == LITERAL_RUN) { + slop = op - lastliteral; + tif->tif_rawcc += lastliteral - tif->tif_rawcp; + if (!TIFFFlushData1(tif)) + return (-1); + op = tif->tif_rawcp; + while (slop-- > 0) + *op++ = *lastliteral++; + lastliteral = tif->tif_rawcp; + } else { + tif->tif_rawcc += op - tif->tif_rawcp; + if (!TIFFFlushData1(tif)) + return (-1); + op = tif->tif_rawcp; + } + } + switch (state) { + case BASE: /* initial state, set run/literal */ + if (n > 1) { + state = RUN; + if (n > 128) { + *op++ = (tidata) -127; + *op++ = (tidataval_t) b; + n -= 128; + goto again; + } + *op++ = (tidataval_t)(-(n-1)); + *op++ = (tidataval_t) b; + } else { + lastliteral = op; + *op++ = 0; + *op++ = (tidataval_t) b; + state = LITERAL; + } + break; + case LITERAL: /* last object was literal string */ + if (n > 1) { + state = LITERAL_RUN; + if (n > 128) { + *op++ = (tidata) -127; + *op++ = (tidataval_t) b; + n -= 128; + goto again; + } + *op++ = (tidataval_t)(-(n-1)); /* encode run */ + *op++ = (tidataval_t) b; + } else { /* extend literal */ + if (++(*lastliteral) == 127) + state = BASE; + *op++ = (tidataval_t) b; + } + break; + case RUN: /* last object was run */ + if (n > 1) { + if (n > 128) { + *op++ = (tidata) -127; + *op++ = (tidataval_t) b; + n -= 128; + goto again; + } + *op++ = (tidataval_t)(-(n-1)); + *op++ = (tidataval_t) b; + } else { + lastliteral = op; + *op++ = 0; + *op++ = (tidataval_t) b; + state = LITERAL; + } + break; + case LITERAL_RUN: /* literal followed by a run */ + /* + * Check to see if previous run should + * be converted to a literal, in which + * case we convert literal-run-literal + * to a single literal. + */ + if (n == 1 && op[-2] == (tidata) -1 && + *lastliteral < 126) { + state = (((*lastliteral) += 2) == 127 ? + BASE : LITERAL); + op[-2] = op[-1]; /* replicate */ + } else + state = RUN; + goto again; + } + } + tif->tif_rawcc += op - tif->tif_rawcp; + tif->tif_rawcp = op; + return (1); +} + +/* + * Encode a rectangular chunk of pixels. We break it up + * into row-sized pieces to insure that encoded runs do + * not span rows. Otherwise, there can be problems with + * the decoder if data is read, for example, by scanlines + * when it was encoded by strips. + */ +static int +PackBitsEncodeChunk(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + tsize_t rowsize = *(tsize_t*)tif->tif_data; + + while ((long)cc > 0) { + int chunk = rowsize; + + if( cc < chunk ) + chunk = cc; + + if (PackBitsEncode(tif, bp, chunk, s) < 0) + return (-1); + bp += chunk; + cc -= chunk; + } + return (1); +} + +static int +PackBitsDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) +{ + char *bp; + tsize_t cc; + long n; + int b; + + (void) s; + bp = (char*) tif->tif_rawcp; + cc = tif->tif_rawcc; + while (cc > 0 && (long)occ > 0) { + n = (long) *bp++, cc--; + /* + * Watch out for compilers that + * don't sign extend chars... + */ + if (n >= 128) + n -= 256; + if (n < 0) { /* replicate next byte -n+1 times */ + if (n == -128) /* nop */ + continue; + n = -n + 1; + if( occ < n ) + { + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "PackBitsDecode: discarding %ld bytes " + "to avoid buffer overrun", + n - occ); + n = occ; + } + occ -= n; + b = *bp++, cc--; + while (n-- > 0) + *op++ = (tidataval_t) b; + } else { /* copy next n+1 bytes literally */ + if (occ < n + 1) + { + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "PackBitsDecode: discarding %ld bytes " + "to avoid buffer overrun", + n - occ + 1); + n = occ - 1; + } + _TIFFmemcpy(op, bp, ++n); + op += n; occ -= n; + bp += n; cc -= n; + } + } + tif->tif_rawcp = (tidata_t) bp; + tif->tif_rawcc = cc; + if (occ > 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "PackBitsDecode: Not enough data for scanline %ld", + (long) tif->tif_row); + return (0); + } + return (1); +} + +int +TIFFInitPackBits(TIFF* tif, int scheme) +{ + (void) scheme; + tif->tif_decoderow = PackBitsDecode; + tif->tif_decodestrip = PackBitsDecode; + tif->tif_decodetile = PackBitsDecode; + tif->tif_preencode = PackBitsPreEncode; + tif->tif_postencode = PackBitsPostEncode; + tif->tif_encoderow = PackBitsEncode; + tif->tif_encodestrip = PackBitsEncodeChunk; + tif->tif_encodetile = PackBitsEncodeChunk; + return (1); +} +#endif /* PACKBITS_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_pixarlog.c b/src/3rdparty/libtiff/libtiff/tif_pixarlog.c new file mode 100644 index 0000000000..5ad84f8b80 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_pixarlog.c @@ -0,0 +1,1364 @@ +/* $Id: tif_pixarlog.c,v 1.15.2.3 2009-01-01 00:10:43 bfriesen Exp $ */ + +/* + * Copyright (c) 1996-1997 Sam Leffler + * Copyright (c) 1996 Pixar + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Pixar, Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Pixar, Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL PIXAR, SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "tiffiop.h" +#ifdef PIXARLOG_SUPPORT + +/* + * TIFF Library. + * PixarLog Compression Support + * + * Contributed by Dan McCoy. + * + * PixarLog film support uses the TIFF library to store companded + * 11 bit values into a tiff file, which are compressed using the + * zip compressor. + * + * The codec can take as input and produce as output 32-bit IEEE float values + * as well as 16-bit or 8-bit unsigned integer values. + * + * On writing any of the above are converted into the internal + * 11-bit log format. In the case of 8 and 16 bit values, the + * input is assumed to be unsigned linear color values that represent + * the range 0-1. In the case of IEEE values, the 0-1 range is assumed to + * be the normal linear color range, in addition over 1 values are + * accepted up to a value of about 25.0 to encode "hot" hightlights and such. + * The encoding is lossless for 8-bit values, slightly lossy for the + * other bit depths. The actual color precision should be better + * than the human eye can perceive with extra room to allow for + * error introduced by further image computation. As with any quantized + * color format, it is possible to perform image calculations which + * expose the quantization error. This format should certainly be less + * susceptable to such errors than standard 8-bit encodings, but more + * susceptable than straight 16-bit or 32-bit encodings. + * + * On reading the internal format is converted to the desired output format. + * The program can request which format it desires by setting the internal + * pseudo tag TIFFTAG_PIXARLOGDATAFMT to one of these possible values: + * PIXARLOGDATAFMT_FLOAT = provide IEEE float values. + * PIXARLOGDATAFMT_16BIT = provide unsigned 16-bit integer values + * PIXARLOGDATAFMT_8BIT = provide unsigned 8-bit integer values + * + * alternately PIXARLOGDATAFMT_8BITABGR provides unsigned 8-bit integer + * values with the difference that if there are exactly three or four channels + * (rgb or rgba) it swaps the channel order (bgr or abgr). + * + * PIXARLOGDATAFMT_11BITLOG provides the internal encoding directly + * packed in 16-bit values. However no tools are supplied for interpreting + * these values. + * + * "hot" (over 1.0) areas written in floating point get clamped to + * 1.0 in the integer data types. + * + * When the file is closed after writing, the bit depth and sample format + * are set always to appear as if 8-bit data has been written into it. + * That way a naive program unaware of the particulars of the encoding + * gets the format it is most likely able to handle. + * + * The codec does it's own horizontal differencing step on the coded + * values so the libraries predictor stuff should be turned off. + * The codec also handle byte swapping the encoded values as necessary + * since the library does not have the information necessary + * to know the bit depth of the raw unencoded buffer. + * + */ + +#include "tif_predict.h" +#include "zlib.h" + +#include +#include +#include + +/* Tables for converting to/from 11 bit coded values */ + +#define TSIZE 2048 /* decode table size (11-bit tokens) */ +#define TSIZEP1 2049 /* Plus one for slop */ +#define ONE 1250 /* token value of 1.0 exactly */ +#define RATIO 1.004 /* nominal ratio for log part */ + +#define CODE_MASK 0x7ff /* 11 bits. */ + +static float Fltsize; +static float LogK1, LogK2; + +#define REPEAT(n, op) { int i; i=n; do { i--; op; } while (i>0); } + +static void +horizontalAccumulateF(uint16 *wp, int n, int stride, float *op, + float *ToLinearF) +{ + register unsigned int cr, cg, cb, ca, mask; + register float t0, t1, t2, t3; + + if (n >= stride) { + mask = CODE_MASK; + if (stride == 3) { + t0 = ToLinearF[cr = wp[0]]; + t1 = ToLinearF[cg = wp[1]]; + t2 = ToLinearF[cb = wp[2]]; + op[0] = t0; + op[1] = t1; + op[2] = t2; + n -= 3; + while (n > 0) { + wp += 3; + op += 3; + n -= 3; + t0 = ToLinearF[(cr += wp[0]) & mask]; + t1 = ToLinearF[(cg += wp[1]) & mask]; + t2 = ToLinearF[(cb += wp[2]) & mask]; + op[0] = t0; + op[1] = t1; + op[2] = t2; + } + } else if (stride == 4) { + t0 = ToLinearF[cr = wp[0]]; + t1 = ToLinearF[cg = wp[1]]; + t2 = ToLinearF[cb = wp[2]]; + t3 = ToLinearF[ca = wp[3]]; + op[0] = t0; + op[1] = t1; + op[2] = t2; + op[3] = t3; + n -= 4; + while (n > 0) { + wp += 4; + op += 4; + n -= 4; + t0 = ToLinearF[(cr += wp[0]) & mask]; + t1 = ToLinearF[(cg += wp[1]) & mask]; + t2 = ToLinearF[(cb += wp[2]) & mask]; + t3 = ToLinearF[(ca += wp[3]) & mask]; + op[0] = t0; + op[1] = t1; + op[2] = t2; + op[3] = t3; + } + } else { + REPEAT(stride, *op = ToLinearF[*wp&mask]; wp++; op++) + n -= stride; + while (n > 0) { + REPEAT(stride, + wp[stride] += *wp; *op = ToLinearF[*wp&mask]; wp++; op++) + n -= stride; + } + } + } +} + +static void +horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op, + float *ToLinearF) +{ + register unsigned int cr, cg, cb, ca, mask; + register float t0, t1, t2, t3; + +#define SCALE12 2048.0F +#define CLAMP12(t) (((t) < 3071) ? (uint16) (t) : 3071) + + if (n >= stride) { + mask = CODE_MASK; + if (stride == 3) { + t0 = ToLinearF[cr = wp[0]] * SCALE12; + t1 = ToLinearF[cg = wp[1]] * SCALE12; + t2 = ToLinearF[cb = wp[2]] * SCALE12; + op[0] = CLAMP12(t0); + op[1] = CLAMP12(t1); + op[2] = CLAMP12(t2); + n -= 3; + while (n > 0) { + wp += 3; + op += 3; + n -= 3; + t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12; + t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12; + t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12; + op[0] = CLAMP12(t0); + op[1] = CLAMP12(t1); + op[2] = CLAMP12(t2); + } + } else if (stride == 4) { + t0 = ToLinearF[cr = wp[0]] * SCALE12; + t1 = ToLinearF[cg = wp[1]] * SCALE12; + t2 = ToLinearF[cb = wp[2]] * SCALE12; + t3 = ToLinearF[ca = wp[3]] * SCALE12; + op[0] = CLAMP12(t0); + op[1] = CLAMP12(t1); + op[2] = CLAMP12(t2); + op[3] = CLAMP12(t3); + n -= 4; + while (n > 0) { + wp += 4; + op += 4; + n -= 4; + t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12; + t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12; + t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12; + t3 = ToLinearF[(ca += wp[3]) & mask] * SCALE12; + op[0] = CLAMP12(t0); + op[1] = CLAMP12(t1); + op[2] = CLAMP12(t2); + op[3] = CLAMP12(t3); + } + } else { + REPEAT(stride, t0 = ToLinearF[*wp&mask] * SCALE12; + *op = CLAMP12(t0); wp++; op++) + n -= stride; + while (n > 0) { + REPEAT(stride, + wp[stride] += *wp; t0 = ToLinearF[wp[stride]&mask]*SCALE12; + *op = CLAMP12(t0); wp++; op++) + n -= stride; + } + } + } +} + +static void +horizontalAccumulate16(uint16 *wp, int n, int stride, uint16 *op, + uint16 *ToLinear16) +{ + register unsigned int cr, cg, cb, ca, mask; + + if (n >= stride) { + mask = CODE_MASK; + if (stride == 3) { + op[0] = ToLinear16[cr = wp[0]]; + op[1] = ToLinear16[cg = wp[1]]; + op[2] = ToLinear16[cb = wp[2]]; + n -= 3; + while (n > 0) { + wp += 3; + op += 3; + n -= 3; + op[0] = ToLinear16[(cr += wp[0]) & mask]; + op[1] = ToLinear16[(cg += wp[1]) & mask]; + op[2] = ToLinear16[(cb += wp[2]) & mask]; + } + } else if (stride == 4) { + op[0] = ToLinear16[cr = wp[0]]; + op[1] = ToLinear16[cg = wp[1]]; + op[2] = ToLinear16[cb = wp[2]]; + op[3] = ToLinear16[ca = wp[3]]; + n -= 4; + while (n > 0) { + wp += 4; + op += 4; + n -= 4; + op[0] = ToLinear16[(cr += wp[0]) & mask]; + op[1] = ToLinear16[(cg += wp[1]) & mask]; + op[2] = ToLinear16[(cb += wp[2]) & mask]; + op[3] = ToLinear16[(ca += wp[3]) & mask]; + } + } else { + REPEAT(stride, *op = ToLinear16[*wp&mask]; wp++; op++) + n -= stride; + while (n > 0) { + REPEAT(stride, + wp[stride] += *wp; *op = ToLinear16[*wp&mask]; wp++; op++) + n -= stride; + } + } + } +} + +/* + * Returns the log encoded 11-bit values with the horizontal + * differencing undone. + */ +static void +horizontalAccumulate11(uint16 *wp, int n, int stride, uint16 *op) +{ + register unsigned int cr, cg, cb, ca, mask; + + if (n >= stride) { + mask = CODE_MASK; + if (stride == 3) { + op[0] = cr = wp[0]; op[1] = cg = wp[1]; op[2] = cb = wp[2]; + n -= 3; + while (n > 0) { + wp += 3; + op += 3; + n -= 3; + op[0] = (cr += wp[0]) & mask; + op[1] = (cg += wp[1]) & mask; + op[2] = (cb += wp[2]) & mask; + } + } else if (stride == 4) { + op[0] = cr = wp[0]; op[1] = cg = wp[1]; + op[2] = cb = wp[2]; op[3] = ca = wp[3]; + n -= 4; + while (n > 0) { + wp += 4; + op += 4; + n -= 4; + op[0] = (cr += wp[0]) & mask; + op[1] = (cg += wp[1]) & mask; + op[2] = (cb += wp[2]) & mask; + op[3] = (ca += wp[3]) & mask; + } + } else { + REPEAT(stride, *op = *wp&mask; wp++; op++) + n -= stride; + while (n > 0) { + REPEAT(stride, + wp[stride] += *wp; *op = *wp&mask; wp++; op++) + n -= stride; + } + } + } +} + +static void +horizontalAccumulate8(uint16 *wp, int n, int stride, unsigned char *op, + unsigned char *ToLinear8) +{ + register unsigned int cr, cg, cb, ca, mask; + + if (n >= stride) { + mask = CODE_MASK; + if (stride == 3) { + op[0] = ToLinear8[cr = wp[0]]; + op[1] = ToLinear8[cg = wp[1]]; + op[2] = ToLinear8[cb = wp[2]]; + n -= 3; + while (n > 0) { + n -= 3; + wp += 3; + op += 3; + op[0] = ToLinear8[(cr += wp[0]) & mask]; + op[1] = ToLinear8[(cg += wp[1]) & mask]; + op[2] = ToLinear8[(cb += wp[2]) & mask]; + } + } else if (stride == 4) { + op[0] = ToLinear8[cr = wp[0]]; + op[1] = ToLinear8[cg = wp[1]]; + op[2] = ToLinear8[cb = wp[2]]; + op[3] = ToLinear8[ca = wp[3]]; + n -= 4; + while (n > 0) { + n -= 4; + wp += 4; + op += 4; + op[0] = ToLinear8[(cr += wp[0]) & mask]; + op[1] = ToLinear8[(cg += wp[1]) & mask]; + op[2] = ToLinear8[(cb += wp[2]) & mask]; + op[3] = ToLinear8[(ca += wp[3]) & mask]; + } + } else { + REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++) + n -= stride; + while (n > 0) { + REPEAT(stride, + wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++) + n -= stride; + } + } + } +} + + +static void +horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op, + unsigned char *ToLinear8) +{ + register unsigned int cr, cg, cb, ca, mask; + register unsigned char t0, t1, t2, t3; + + if (n >= stride) { + mask = CODE_MASK; + if (stride == 3) { + op[0] = 0; + t1 = ToLinear8[cb = wp[2]]; + t2 = ToLinear8[cg = wp[1]]; + t3 = ToLinear8[cr = wp[0]]; + op[1] = t1; + op[2] = t2; + op[3] = t3; + n -= 3; + while (n > 0) { + n -= 3; + wp += 3; + op += 4; + op[0] = 0; + t1 = ToLinear8[(cb += wp[2]) & mask]; + t2 = ToLinear8[(cg += wp[1]) & mask]; + t3 = ToLinear8[(cr += wp[0]) & mask]; + op[1] = t1; + op[2] = t2; + op[3] = t3; + } + } else if (stride == 4) { + t0 = ToLinear8[ca = wp[3]]; + t1 = ToLinear8[cb = wp[2]]; + t2 = ToLinear8[cg = wp[1]]; + t3 = ToLinear8[cr = wp[0]]; + op[0] = t0; + op[1] = t1; + op[2] = t2; + op[3] = t3; + n -= 4; + while (n > 0) { + n -= 4; + wp += 4; + op += 4; + t0 = ToLinear8[(ca += wp[3]) & mask]; + t1 = ToLinear8[(cb += wp[2]) & mask]; + t2 = ToLinear8[(cg += wp[1]) & mask]; + t3 = ToLinear8[(cr += wp[0]) & mask]; + op[0] = t0; + op[1] = t1; + op[2] = t2; + op[3] = t3; + } + } else { + REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++) + n -= stride; + while (n > 0) { + REPEAT(stride, + wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++) + n -= stride; + } + } + } +} + +/* + * State block for each open TIFF + * file using PixarLog compression/decompression. + */ +typedef struct { + TIFFPredictorState predict; + z_stream stream; + uint16 *tbuf; + uint16 stride; + int state; + int user_datafmt; + int quality; +#define PLSTATE_INIT 1 + + TIFFVSetMethod vgetparent; /* super-class method */ + TIFFVSetMethod vsetparent; /* super-class method */ + + float *ToLinearF; + uint16 *ToLinear16; + unsigned char *ToLinear8; + uint16 *FromLT2; + uint16 *From14; /* Really for 16-bit data, but we shift down 2 */ + uint16 *From8; + +} PixarLogState; + +static int +PixarLogMakeTables(PixarLogState *sp) +{ + +/* + * We make several tables here to convert between various external + * representations (float, 16-bit, and 8-bit) and the internal + * 11-bit companded representation. The 11-bit representation has two + * distinct regions. A linear bottom end up through .018316 in steps + * of about .000073, and a region of constant ratio up to about 25. + * These floating point numbers are stored in the main table ToLinearF. + * All other tables are derived from this one. The tables (and the + * ratios) are continuous at the internal seam. + */ + + int nlin, lt2size; + int i, j; + double b, c, linstep, v; + float *ToLinearF; + uint16 *ToLinear16; + unsigned char *ToLinear8; + uint16 *FromLT2; + uint16 *From14; /* Really for 16-bit data, but we shift down 2 */ + uint16 *From8; + + c = log(RATIO); + nlin = (int)(1./c); /* nlin must be an integer */ + c = 1./nlin; + b = exp(-c*ONE); /* multiplicative scale factor [b*exp(c*ONE) = 1] */ + linstep = b*c*exp(1.); + + LogK1 = (float)(1./c); /* if (v >= 2) token = k1*log(v*k2) */ + LogK2 = (float)(1./b); + lt2size = (int)(2./linstep) + 1; + FromLT2 = (uint16 *)_TIFFmalloc(lt2size*sizeof(uint16)); + From14 = (uint16 *)_TIFFmalloc(16384*sizeof(uint16)); + From8 = (uint16 *)_TIFFmalloc(256*sizeof(uint16)); + ToLinearF = (float *)_TIFFmalloc(TSIZEP1 * sizeof(float)); + ToLinear16 = (uint16 *)_TIFFmalloc(TSIZEP1 * sizeof(uint16)); + ToLinear8 = (unsigned char *)_TIFFmalloc(TSIZEP1 * sizeof(unsigned char)); + if (FromLT2 == NULL || From14 == NULL || From8 == NULL || + ToLinearF == NULL || ToLinear16 == NULL || ToLinear8 == NULL) { + if (FromLT2) _TIFFfree(FromLT2); + if (From14) _TIFFfree(From14); + if (From8) _TIFFfree(From8); + if (ToLinearF) _TIFFfree(ToLinearF); + if (ToLinear16) _TIFFfree(ToLinear16); + if (ToLinear8) _TIFFfree(ToLinear8); + sp->FromLT2 = NULL; + sp->From14 = NULL; + sp->From8 = NULL; + sp->ToLinearF = NULL; + sp->ToLinear16 = NULL; + sp->ToLinear8 = NULL; + return 0; + } + + j = 0; + + for (i = 0; i < nlin; i++) { + v = i * linstep; + ToLinearF[j++] = (float)v; + } + + for (i = nlin; i < TSIZE; i++) + ToLinearF[j++] = (float)(b*exp(c*i)); + + ToLinearF[2048] = ToLinearF[2047]; + + for (i = 0; i < TSIZEP1; i++) { + v = ToLinearF[i]*65535.0 + 0.5; + ToLinear16[i] = (v > 65535.0) ? 65535 : (uint16)v; + v = ToLinearF[i]*255.0 + 0.5; + ToLinear8[i] = (v > 255.0) ? 255 : (unsigned char)v; + } + + j = 0; + for (i = 0; i < lt2size; i++) { + if ((i*linstep)*(i*linstep) > ToLinearF[j]*ToLinearF[j+1]) + j++; + FromLT2[i] = j; + } + + /* + * Since we lose info anyway on 16-bit data, we set up a 14-bit + * table and shift 16-bit values down two bits on input. + * saves a little table space. + */ + j = 0; + for (i = 0; i < 16384; i++) { + while ((i/16383.)*(i/16383.) > ToLinearF[j]*ToLinearF[j+1]) + j++; + From14[i] = j; + } + + j = 0; + for (i = 0; i < 256; i++) { + while ((i/255.)*(i/255.) > ToLinearF[j]*ToLinearF[j+1]) + j++; + From8[i] = j; + } + + Fltsize = (float)(lt2size/2); + + sp->ToLinearF = ToLinearF; + sp->ToLinear16 = ToLinear16; + sp->ToLinear8 = ToLinear8; + sp->FromLT2 = FromLT2; + sp->From14 = From14; + sp->From8 = From8; + + return 1; +} + +#define DecoderState(tif) ((PixarLogState*) (tif)->tif_data) +#define EncoderState(tif) ((PixarLogState*) (tif)->tif_data) + +static int PixarLogEncode(TIFF*, tidata_t, tsize_t, tsample_t); +static int PixarLogDecode(TIFF*, tidata_t, tsize_t, tsample_t); + +#define PIXARLOGDATAFMT_UNKNOWN -1 + +static int +PixarLogGuessDataFmt(TIFFDirectory *td) +{ + int guess = PIXARLOGDATAFMT_UNKNOWN; + int format = td->td_sampleformat; + + /* If the user didn't tell us his datafmt, + * take our best guess from the bitspersample. + */ + switch (td->td_bitspersample) { + case 32: + if (format == SAMPLEFORMAT_IEEEFP) + guess = PIXARLOGDATAFMT_FLOAT; + break; + case 16: + if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) + guess = PIXARLOGDATAFMT_16BIT; + break; + case 12: + if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_INT) + guess = PIXARLOGDATAFMT_12BITPICIO; + break; + case 11: + if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) + guess = PIXARLOGDATAFMT_11BITLOG; + break; + case 8: + if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) + guess = PIXARLOGDATAFMT_8BIT; + break; + } + + return guess; +} + +static uint32 +multiply(size_t m1, size_t m2) +{ + uint32 bytes = m1 * m2; + + if (m1 && bytes / m1 != m2) + bytes = 0; + + return bytes; +} + +static int +PixarLogSetupDecode(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + PixarLogState* sp = DecoderState(tif); + tsize_t tbuf_size; + static const char module[] = "PixarLogSetupDecode"; + + assert(sp != NULL); + + /* Make sure no byte swapping happens on the data + * after decompression. */ + tif->tif_postdecode = _TIFFNoPostDecode; + + /* for some reason, we can't do this in TIFFInitPixarLog */ + + sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? + td->td_samplesperpixel : 1); + tbuf_size = multiply(multiply(multiply(sp->stride, td->td_imagewidth), + td->td_rowsperstrip), sizeof(uint16)); + if (tbuf_size == 0) + return (0); + sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size); + if (sp->tbuf == NULL) + return (0); + if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) + sp->user_datafmt = PixarLogGuessDataFmt(td); + if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) { + TIFFErrorExt(tif->tif_clientdata, module, + "PixarLog compression can't handle bits depth/data format combination (depth: %d)", + td->td_bitspersample); + return (0); + } + + if (inflateInit(&sp->stream) != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: %s", tif->tif_name, sp->stream.msg); + return (0); + } else { + sp->state |= PLSTATE_INIT; + return (1); + } +} + +/* + * Setup state for decoding a strip. + */ +static int +PixarLogPreDecode(TIFF* tif, tsample_t s) +{ + PixarLogState* sp = DecoderState(tif); + + (void) s; + assert(sp != NULL); + sp->stream.next_in = tif->tif_rawdata; + sp->stream.avail_in = tif->tif_rawcc; + return (inflateReset(&sp->stream) == Z_OK); +} + +static int +PixarLogDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) +{ + TIFFDirectory *td = &tif->tif_dir; + PixarLogState* sp = DecoderState(tif); + static const char module[] = "PixarLogDecode"; + int i, nsamples, llen; + uint16 *up; + + switch (sp->user_datafmt) { + case PIXARLOGDATAFMT_FLOAT: + nsamples = occ / sizeof(float); /* XXX float == 32 bits */ + break; + case PIXARLOGDATAFMT_16BIT: + case PIXARLOGDATAFMT_12BITPICIO: + case PIXARLOGDATAFMT_11BITLOG: + nsamples = occ / sizeof(uint16); /* XXX uint16 == 16 bits */ + break; + case PIXARLOGDATAFMT_8BIT: + case PIXARLOGDATAFMT_8BITABGR: + nsamples = occ; + break; + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%d bit input not supported in PixarLog", + td->td_bitspersample); + return 0; + } + + llen = sp->stride * td->td_imagewidth; + + (void) s; + assert(sp != NULL); + sp->stream.next_out = (unsigned char *) sp->tbuf; + sp->stream.avail_out = nsamples * sizeof(uint16); + do { + int state = inflate(&sp->stream, Z_PARTIAL_FLUSH); + if (state == Z_STREAM_END) { + break; /* XXX */ + } + if (state == Z_DATA_ERROR) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Decoding error at scanline %d, %s", + tif->tif_name, tif->tif_row, sp->stream.msg); + if (inflateSync(&sp->stream) != Z_OK) + return (0); + continue; + } + if (state != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s", + tif->tif_name, sp->stream.msg); + return (0); + } + } while (sp->stream.avail_out > 0); + + /* hopefully, we got all the bytes we needed */ + if (sp->stream.avail_out != 0) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Not enough data at scanline %d (short %d bytes)", + tif->tif_name, tif->tif_row, sp->stream.avail_out); + return (0); + } + + up = sp->tbuf; + /* Swap bytes in the data if from a different endian machine. */ + if (tif->tif_flags & TIFF_SWAB) + TIFFSwabArrayOfShort(up, nsamples); + + /* + * if llen is not an exact multiple of nsamples, the decode operation + * may overflow the output buffer, so truncate it enough to prevent + * that but still salvage as much data as possible. + */ + if (nsamples % llen) { + TIFFWarningExt(tif->tif_clientdata, module, + "%s: stride %d is not a multiple of sample count, " + "%d, data truncated.", tif->tif_name, llen, nsamples); + nsamples -= nsamples % llen; + } + + for (i = 0; i < nsamples; i += llen, up += llen) { + switch (sp->user_datafmt) { + case PIXARLOGDATAFMT_FLOAT: + horizontalAccumulateF(up, llen, sp->stride, + (float *)op, sp->ToLinearF); + op += llen * sizeof(float); + break; + case PIXARLOGDATAFMT_16BIT: + horizontalAccumulate16(up, llen, sp->stride, + (uint16 *)op, sp->ToLinear16); + op += llen * sizeof(uint16); + break; + case PIXARLOGDATAFMT_12BITPICIO: + horizontalAccumulate12(up, llen, sp->stride, + (int16 *)op, sp->ToLinearF); + op += llen * sizeof(int16); + break; + case PIXARLOGDATAFMT_11BITLOG: + horizontalAccumulate11(up, llen, sp->stride, + (uint16 *)op); + op += llen * sizeof(uint16); + break; + case PIXARLOGDATAFMT_8BIT: + horizontalAccumulate8(up, llen, sp->stride, + (unsigned char *)op, sp->ToLinear8); + op += llen * sizeof(unsigned char); + break; + case PIXARLOGDATAFMT_8BITABGR: + horizontalAccumulate8abgr(up, llen, sp->stride, + (unsigned char *)op, sp->ToLinear8); + op += llen * sizeof(unsigned char); + break; + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "PixarLogDecode: unsupported bits/sample: %d", + td->td_bitspersample); + return (0); + } + } + + return (1); +} + +static int +PixarLogSetupEncode(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + PixarLogState* sp = EncoderState(tif); + tsize_t tbuf_size; + static const char module[] = "PixarLogSetupEncode"; + + assert(sp != NULL); + + /* for some reason, we can't do this in TIFFInitPixarLog */ + + sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? + td->td_samplesperpixel : 1); + tbuf_size = multiply(multiply(multiply(sp->stride, td->td_imagewidth), + td->td_rowsperstrip), sizeof(uint16)); + if (tbuf_size == 0) + return (0); + sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size); + if (sp->tbuf == NULL) + return (0); + if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) + sp->user_datafmt = PixarLogGuessDataFmt(td); + if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) { + TIFFErrorExt(tif->tif_clientdata, module, "PixarLog compression can't handle %d bit linear encodings", td->td_bitspersample); + return (0); + } + + if (deflateInit(&sp->stream, sp->quality) != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: %s", tif->tif_name, sp->stream.msg); + return (0); + } else { + sp->state |= PLSTATE_INIT; + return (1); + } +} + +/* + * Reset encoding state at the start of a strip. + */ +static int +PixarLogPreEncode(TIFF* tif, tsample_t s) +{ + PixarLogState *sp = EncoderState(tif); + + (void) s; + assert(sp != NULL); + sp->stream.next_out = tif->tif_rawdata; + sp->stream.avail_out = tif->tif_rawdatasize; + return (deflateReset(&sp->stream) == Z_OK); +} + +static void +horizontalDifferenceF(float *ip, int n, int stride, uint16 *wp, uint16 *FromLT2) +{ + + int32 r1, g1, b1, a1, r2, g2, b2, a2, mask; + float fltsize = Fltsize; + +#define CLAMP(v) ( (v<(float)0.) ? 0 \ + : (v<(float)2.) ? FromLT2[(int)(v*fltsize)] \ + : (v>(float)24.2) ? 2047 \ + : LogK1*log(v*LogK2) + 0.5 ) + + mask = CODE_MASK; + if (n >= stride) { + if (stride == 3) { + r2 = wp[0] = (uint16) CLAMP(ip[0]); + g2 = wp[1] = (uint16) CLAMP(ip[1]); + b2 = wp[2] = (uint16) CLAMP(ip[2]); + n -= 3; + while (n > 0) { + n -= 3; + wp += 3; + ip += 3; + r1 = (int32) CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; + g1 = (int32) CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; + b1 = (int32) CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; + } + } else if (stride == 4) { + r2 = wp[0] = (uint16) CLAMP(ip[0]); + g2 = wp[1] = (uint16) CLAMP(ip[1]); + b2 = wp[2] = (uint16) CLAMP(ip[2]); + a2 = wp[3] = (uint16) CLAMP(ip[3]); + n -= 4; + while (n > 0) { + n -= 4; + wp += 4; + ip += 4; + r1 = (int32) CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; + g1 = (int32) CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; + b1 = (int32) CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; + a1 = (int32) CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1; + } + } else { + ip += n - 1; /* point to last one */ + wp += n - 1; /* point to last one */ + n -= stride; + while (n > 0) { + REPEAT(stride, wp[0] = (uint16) CLAMP(ip[0]); + wp[stride] -= wp[0]; + wp[stride] &= mask; + wp--; ip--) + n -= stride; + } + REPEAT(stride, wp[0] = (uint16) CLAMP(ip[0]); wp--; ip--) + } + } +} + +static void +horizontalDifference16(unsigned short *ip, int n, int stride, + unsigned short *wp, uint16 *From14) +{ + register int r1, g1, b1, a1, r2, g2, b2, a2, mask; + +/* assumption is unsigned pixel values */ +#undef CLAMP +#define CLAMP(v) From14[(v) >> 2] + + mask = CODE_MASK; + if (n >= stride) { + if (stride == 3) { + r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); + b2 = wp[2] = CLAMP(ip[2]); + n -= 3; + while (n > 0) { + n -= 3; + wp += 3; + ip += 3; + r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; + g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; + b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; + } + } else if (stride == 4) { + r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); + b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]); + n -= 4; + while (n > 0) { + n -= 4; + wp += 4; + ip += 4; + r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; + g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; + b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; + a1 = CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1; + } + } else { + ip += n - 1; /* point to last one */ + wp += n - 1; /* point to last one */ + n -= stride; + while (n > 0) { + REPEAT(stride, wp[0] = CLAMP(ip[0]); + wp[stride] -= wp[0]; + wp[stride] &= mask; + wp--; ip--) + n -= stride; + } + REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--) + } + } +} + + +static void +horizontalDifference8(unsigned char *ip, int n, int stride, + unsigned short *wp, uint16 *From8) +{ + register int r1, g1, b1, a1, r2, g2, b2, a2, mask; + +#undef CLAMP +#define CLAMP(v) (From8[(v)]) + + mask = CODE_MASK; + if (n >= stride) { + if (stride == 3) { + r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); + b2 = wp[2] = CLAMP(ip[2]); + n -= 3; + while (n > 0) { + n -= 3; + r1 = CLAMP(ip[3]); wp[3] = (r1-r2) & mask; r2 = r1; + g1 = CLAMP(ip[4]); wp[4] = (g1-g2) & mask; g2 = g1; + b1 = CLAMP(ip[5]); wp[5] = (b1-b2) & mask; b2 = b1; + wp += 3; + ip += 3; + } + } else if (stride == 4) { + r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); + b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]); + n -= 4; + while (n > 0) { + n -= 4; + r1 = CLAMP(ip[4]); wp[4] = (r1-r2) & mask; r2 = r1; + g1 = CLAMP(ip[5]); wp[5] = (g1-g2) & mask; g2 = g1; + b1 = CLAMP(ip[6]); wp[6] = (b1-b2) & mask; b2 = b1; + a1 = CLAMP(ip[7]); wp[7] = (a1-a2) & mask; a2 = a1; + wp += 4; + ip += 4; + } + } else { + wp += n + stride - 1; /* point to last one */ + ip += n + stride - 1; /* point to last one */ + n -= stride; + while (n > 0) { + REPEAT(stride, wp[0] = CLAMP(ip[0]); + wp[stride] -= wp[0]; + wp[stride] &= mask; + wp--; ip--) + n -= stride; + } + REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--) + } + } +} + +/* + * Encode a chunk of pixels. + */ +static int +PixarLogEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + TIFFDirectory *td = &tif->tif_dir; + PixarLogState *sp = EncoderState(tif); + static const char module[] = "PixarLogEncode"; + int i, n, llen; + unsigned short * up; + + (void) s; + + switch (sp->user_datafmt) { + case PIXARLOGDATAFMT_FLOAT: + n = cc / sizeof(float); /* XXX float == 32 bits */ + break; + case PIXARLOGDATAFMT_16BIT: + case PIXARLOGDATAFMT_12BITPICIO: + case PIXARLOGDATAFMT_11BITLOG: + n = cc / sizeof(uint16); /* XXX uint16 == 16 bits */ + break; + case PIXARLOGDATAFMT_8BIT: + case PIXARLOGDATAFMT_8BITABGR: + n = cc; + break; + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%d bit input not supported in PixarLog", + td->td_bitspersample); + return 0; + } + + llen = sp->stride * td->td_imagewidth; + + for (i = 0, up = sp->tbuf; i < n; i += llen, up += llen) { + switch (sp->user_datafmt) { + case PIXARLOGDATAFMT_FLOAT: + horizontalDifferenceF((float *)bp, llen, + sp->stride, up, sp->FromLT2); + bp += llen * sizeof(float); + break; + case PIXARLOGDATAFMT_16BIT: + horizontalDifference16((uint16 *)bp, llen, + sp->stride, up, sp->From14); + bp += llen * sizeof(uint16); + break; + case PIXARLOGDATAFMT_8BIT: + horizontalDifference8((unsigned char *)bp, llen, + sp->stride, up, sp->From8); + bp += llen * sizeof(unsigned char); + break; + default: + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%d bit input not supported in PixarLog", + td->td_bitspersample); + return 0; + } + } + + sp->stream.next_in = (unsigned char *) sp->tbuf; + sp->stream.avail_in = n * sizeof(uint16); + + do { + if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: Encoder error: %s", + tif->tif_name, sp->stream.msg); + return (0); + } + if (sp->stream.avail_out == 0) { + tif->tif_rawcc = tif->tif_rawdatasize; + TIFFFlushData1(tif); + sp->stream.next_out = tif->tif_rawdata; + sp->stream.avail_out = tif->tif_rawdatasize; + } + } while (sp->stream.avail_in > 0); + return (1); +} + +/* + * Finish off an encoded strip by flushing the last + * string and tacking on an End Of Information code. + */ + +static int +PixarLogPostEncode(TIFF* tif) +{ + PixarLogState *sp = EncoderState(tif); + static const char module[] = "PixarLogPostEncode"; + int state; + + sp->stream.avail_in = 0; + + do { + state = deflate(&sp->stream, Z_FINISH); + switch (state) { + case Z_STREAM_END: + case Z_OK: + if (sp->stream.avail_out != (uint32)tif->tif_rawdatasize) { + tif->tif_rawcc = + tif->tif_rawdatasize - sp->stream.avail_out; + TIFFFlushData1(tif); + sp->stream.next_out = tif->tif_rawdata; + sp->stream.avail_out = tif->tif_rawdatasize; + } + break; + default: + TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s", + tif->tif_name, sp->stream.msg); + return (0); + } + } while (state != Z_STREAM_END); + return (1); +} + +static void +PixarLogClose(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + + /* In a really sneaky maneuver, on close, we covertly modify both + * bitspersample and sampleformat in the directory to indicate + * 8-bit linear. This way, the decode "just works" even for + * readers that don't know about PixarLog, or how to set + * the PIXARLOGDATFMT pseudo-tag. + */ + td->td_bitspersample = 8; + td->td_sampleformat = SAMPLEFORMAT_UINT; +} + +static void +PixarLogCleanup(TIFF* tif) +{ + PixarLogState* sp = (PixarLogState*) tif->tif_data; + + assert(sp != 0); + + (void)TIFFPredictorCleanup(tif); + + tif->tif_tagmethods.vgetfield = sp->vgetparent; + tif->tif_tagmethods.vsetfield = sp->vsetparent; + + if (sp->FromLT2) _TIFFfree(sp->FromLT2); + if (sp->From14) _TIFFfree(sp->From14); + if (sp->From8) _TIFFfree(sp->From8); + if (sp->ToLinearF) _TIFFfree(sp->ToLinearF); + if (sp->ToLinear16) _TIFFfree(sp->ToLinear16); + if (sp->ToLinear8) _TIFFfree(sp->ToLinear8); + if (sp->state&PLSTATE_INIT) { + if (tif->tif_mode == O_RDONLY) + inflateEnd(&sp->stream); + else + deflateEnd(&sp->stream); + } + if (sp->tbuf) + _TIFFfree(sp->tbuf); + _TIFFfree(sp); + tif->tif_data = NULL; + + _TIFFSetDefaultCompressionState(tif); +} + +static int +PixarLogVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + PixarLogState *sp = (PixarLogState *)tif->tif_data; + int result; + static const char module[] = "PixarLogVSetField"; + + switch (tag) { + case TIFFTAG_PIXARLOGQUALITY: + sp->quality = va_arg(ap, int); + if (tif->tif_mode != O_RDONLY && (sp->state&PLSTATE_INIT)) { + if (deflateParams(&sp->stream, + sp->quality, Z_DEFAULT_STRATEGY) != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s", + tif->tif_name, sp->stream.msg); + return (0); + } + } + return (1); + case TIFFTAG_PIXARLOGDATAFMT: + sp->user_datafmt = va_arg(ap, int); + /* Tweak the TIFF header so that the rest of libtiff knows what + * size of data will be passed between app and library, and + * assume that the app knows what it is doing and is not + * confused by these header manipulations... + */ + switch (sp->user_datafmt) { + case PIXARLOGDATAFMT_8BIT: + case PIXARLOGDATAFMT_8BITABGR: + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); + TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); + break; + case PIXARLOGDATAFMT_11BITLOG: + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); + TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); + break; + case PIXARLOGDATAFMT_12BITPICIO: + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); + TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); + break; + case PIXARLOGDATAFMT_16BIT: + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); + TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); + break; + case PIXARLOGDATAFMT_FLOAT: + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32); + TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); + break; + } + /* + * Must recalculate sizes should bits/sample change. + */ + tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1; + tif->tif_scanlinesize = TIFFScanlineSize(tif); + result = 1; /* NB: pseudo tag */ + break; + default: + result = (*sp->vsetparent)(tif, tag, ap); + } + return (result); +} + +static int +PixarLogVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + PixarLogState *sp = (PixarLogState *)tif->tif_data; + + switch (tag) { + case TIFFTAG_PIXARLOGQUALITY: + *va_arg(ap, int*) = sp->quality; + break; + case TIFFTAG_PIXARLOGDATAFMT: + *va_arg(ap, int*) = sp->user_datafmt; + break; + default: + return (*sp->vgetparent)(tif, tag, ap); + } + return (1); +} + +static const TIFFFieldInfo pixarlogFieldInfo[] = { + {TIFFTAG_PIXARLOGDATAFMT,0,0,TIFF_ANY, FIELD_PSEUDO,FALSE,FALSE,""}, + {TIFFTAG_PIXARLOGQUALITY,0,0,TIFF_ANY, FIELD_PSEUDO,FALSE,FALSE,""} +}; + +int +TIFFInitPixarLog(TIFF* tif, int scheme) +{ + static const char module[] = "TIFFInitPixarLog"; + + PixarLogState* sp; + + assert(scheme == COMPRESSION_PIXARLOG); + + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, pixarlogFieldInfo, + TIFFArrayCount(pixarlogFieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Merging PixarLog codec-specific tags failed"); + return 0; + } + + /* + * Allocate state block so tag methods have storage to record values. + */ + tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (PixarLogState)); + if (tif->tif_data == NULL) + goto bad; + sp = (PixarLogState*) tif->tif_data; + _TIFFmemset(sp, 0, sizeof (*sp)); + sp->stream.data_type = Z_BINARY; + sp->user_datafmt = PIXARLOGDATAFMT_UNKNOWN; + + /* + * Install codec methods. + */ + tif->tif_setupdecode = PixarLogSetupDecode; + tif->tif_predecode = PixarLogPreDecode; + tif->tif_decoderow = PixarLogDecode; + tif->tif_decodestrip = PixarLogDecode; + tif->tif_decodetile = PixarLogDecode; + tif->tif_setupencode = PixarLogSetupEncode; + tif->tif_preencode = PixarLogPreEncode; + tif->tif_postencode = PixarLogPostEncode; + tif->tif_encoderow = PixarLogEncode; + tif->tif_encodestrip = PixarLogEncode; + tif->tif_encodetile = PixarLogEncode; + tif->tif_close = PixarLogClose; + tif->tif_cleanup = PixarLogCleanup; + + /* Override SetField so we can handle our private pseudo-tag */ + sp->vgetparent = tif->tif_tagmethods.vgetfield; + tif->tif_tagmethods.vgetfield = PixarLogVGetField; /* hook for codec tags */ + sp->vsetparent = tif->tif_tagmethods.vsetfield; + tif->tif_tagmethods.vsetfield = PixarLogVSetField; /* hook for codec tags */ + + /* Default values for codec-specific fields */ + sp->quality = Z_DEFAULT_COMPRESSION; /* default comp. level */ + sp->state = 0; + + /* we don't wish to use the predictor, + * the default is none, which predictor value 1 + */ + (void) TIFFPredictorInit(tif); + + /* + * build the companding tables + */ + PixarLogMakeTables(sp); + + return (1); +bad: + TIFFErrorExt(tif->tif_clientdata, module, + "No space for PixarLog state block"); + return (0); +} +#endif /* PIXARLOG_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_predict.c b/src/3rdparty/libtiff/libtiff/tif_predict.c new file mode 100644 index 0000000000..052a8e2f0a --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_predict.c @@ -0,0 +1,729 @@ +/* $Id: tif_predict.c,v 1.11.2.3 2009-01-23 15:57:18 fwarmerdam Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Predictor Tag Support (used by multiple codecs). + */ +#include "tiffiop.h" +#include "tif_predict.h" + +#define PredictorState(tif) ((TIFFPredictorState*) (tif)->tif_data) + +static void horAcc8(TIFF*, tidata_t, tsize_t); +static void horAcc16(TIFF*, tidata_t, tsize_t); +static void horAcc32(TIFF*, tidata_t, tsize_t); +static void swabHorAcc16(TIFF*, tidata_t, tsize_t); +static void swabHorAcc32(TIFF*, tidata_t, tsize_t); +static void horDiff8(TIFF*, tidata_t, tsize_t); +static void horDiff16(TIFF*, tidata_t, tsize_t); +static void horDiff32(TIFF*, tidata_t, tsize_t); +static void fpAcc(TIFF*, tidata_t, tsize_t); +static void fpDiff(TIFF*, tidata_t, tsize_t); +static int PredictorDecodeRow(TIFF*, tidata_t, tsize_t, tsample_t); +static int PredictorDecodeTile(TIFF*, tidata_t, tsize_t, tsample_t); +static int PredictorEncodeRow(TIFF*, tidata_t, tsize_t, tsample_t); +static int PredictorEncodeTile(TIFF*, tidata_t, tsize_t, tsample_t); + +static int +PredictorSetup(TIFF* tif) +{ + static const char module[] = "PredictorSetup"; + + TIFFPredictorState* sp = PredictorState(tif); + TIFFDirectory* td = &tif->tif_dir; + + switch (sp->predictor) /* no differencing */ + { + case PREDICTOR_NONE: + return 1; + case PREDICTOR_HORIZONTAL: + if (td->td_bitspersample != 8 + && td->td_bitspersample != 16 + && td->td_bitspersample != 32) { + TIFFErrorExt(tif->tif_clientdata, module, + "Horizontal differencing \"Predictor\" not supported with %d-bit samples", + td->td_bitspersample); + return 0; + } + break; + case PREDICTOR_FLOATINGPOINT: + if (td->td_sampleformat != SAMPLEFORMAT_IEEEFP) { + TIFFErrorExt(tif->tif_clientdata, module, + "Floating point \"Predictor\" not supported with %d data format", + td->td_sampleformat); + return 0; + } + break; + default: + TIFFErrorExt(tif->tif_clientdata, module, + "\"Predictor\" value %d not supported", + sp->predictor); + return 0; + } + sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? + td->td_samplesperpixel : 1); + /* + * Calculate the scanline/tile-width size in bytes. + */ + if (isTiled(tif)) + sp->rowsize = TIFFTileRowSize(tif); + else + sp->rowsize = TIFFScanlineSize(tif); + + return 1; +} + +static int +PredictorSetupDecode(TIFF* tif) +{ + TIFFPredictorState* sp = PredictorState(tif); + TIFFDirectory* td = &tif->tif_dir; + + if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif)) + return 0; + + if (sp->predictor == 2) { + switch (td->td_bitspersample) { + case 8: sp->decodepfunc = horAcc8; break; + case 16: sp->decodepfunc = horAcc16; break; + case 32: sp->decodepfunc = horAcc32; break; + } + /* + * Override default decoding method with one that does the + * predictor stuff. + */ + if( tif->tif_decoderow != PredictorDecodeRow ) + { + sp->decoderow = tif->tif_decoderow; + tif->tif_decoderow = PredictorDecodeRow; + sp->decodestrip = tif->tif_decodestrip; + tif->tif_decodestrip = PredictorDecodeTile; + sp->decodetile = tif->tif_decodetile; + tif->tif_decodetile = PredictorDecodeTile; + } + /* + * If the data is horizontally differenced 16-bit data that + * requires byte-swapping, then it must be byte swapped before + * the accumulation step. We do this with a special-purpose + * routine and override the normal post decoding logic that + * the library setup when the directory was read. + */ + if (tif->tif_flags & TIFF_SWAB) { + if (sp->decodepfunc == horAcc16) { + sp->decodepfunc = swabHorAcc16; + tif->tif_postdecode = _TIFFNoPostDecode; + } else if (sp->decodepfunc == horAcc32) { + sp->decodepfunc = swabHorAcc32; + tif->tif_postdecode = _TIFFNoPostDecode; + } + } + } + + else if (sp->predictor == 3) { + sp->decodepfunc = fpAcc; + /* + * Override default decoding method with one that does the + * predictor stuff. + */ + if( tif->tif_decoderow != PredictorDecodeRow ) + { + sp->decoderow = tif->tif_decoderow; + tif->tif_decoderow = PredictorDecodeRow; + sp->decodestrip = tif->tif_decodestrip; + tif->tif_decodestrip = PredictorDecodeTile; + sp->decodetile = tif->tif_decodetile; + tif->tif_decodetile = PredictorDecodeTile; + } + /* + * The data should not be swapped outside of the floating + * point predictor, the accumulation routine should return + * byres in the native order. + */ + if (tif->tif_flags & TIFF_SWAB) { + tif->tif_postdecode = _TIFFNoPostDecode; + } + /* + * Allocate buffer to keep the decoded bytes before + * rearranging in the ight order + */ + } + + return 1; +} + +static int +PredictorSetupEncode(TIFF* tif) +{ + TIFFPredictorState* sp = PredictorState(tif); + TIFFDirectory* td = &tif->tif_dir; + + if (!(*sp->setupencode)(tif) || !PredictorSetup(tif)) + return 0; + + if (sp->predictor == 2) { + switch (td->td_bitspersample) { + case 8: sp->encodepfunc = horDiff8; break; + case 16: sp->encodepfunc = horDiff16; break; + case 32: sp->encodepfunc = horDiff32; break; + } + /* + * Override default encoding method with one that does the + * predictor stuff. + */ + if( tif->tif_encoderow != PredictorEncodeRow ) + { + sp->encoderow = tif->tif_encoderow; + tif->tif_encoderow = PredictorEncodeRow; + sp->encodestrip = tif->tif_encodestrip; + tif->tif_encodestrip = PredictorEncodeTile; + sp->encodetile = tif->tif_encodetile; + tif->tif_encodetile = PredictorEncodeTile; + } + } + + else if (sp->predictor == 3) { + sp->encodepfunc = fpDiff; + /* + * Override default encoding method with one that does the + * predictor stuff. + */ + if( tif->tif_encoderow != PredictorEncodeRow ) + { + sp->encoderow = tif->tif_encoderow; + tif->tif_encoderow = PredictorEncodeRow; + sp->encodestrip = tif->tif_encodestrip; + tif->tif_encodestrip = PredictorEncodeTile; + sp->encodetile = tif->tif_encodetile; + tif->tif_encodetile = PredictorEncodeTile; + } + } + + return 1; +} + +#define REPEAT4(n, op) \ + switch (n) { \ + default: { int i; for (i = n-4; i > 0; i--) { op; } } \ + case 4: op; \ + case 3: op; \ + case 2: op; \ + case 1: op; \ + case 0: ; \ + } + +static void +horAcc8(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + tsize_t stride = PredictorState(tif)->stride; + + char* cp = (char*) cp0; + if (cc > stride) { + cc -= stride; + /* + * Pipeline the most common cases. + */ + if (stride == 3) { + unsigned int cr = cp[0]; + unsigned int cg = cp[1]; + unsigned int cb = cp[2]; + do { + cc -= 3, cp += 3; + cp[0] = (char) (cr += cp[0]); + cp[1] = (char) (cg += cp[1]); + cp[2] = (char) (cb += cp[2]); + } while ((int32) cc > 0); + } else if (stride == 4) { + unsigned int cr = cp[0]; + unsigned int cg = cp[1]; + unsigned int cb = cp[2]; + unsigned int ca = cp[3]; + do { + cc -= 4, cp += 4; + cp[0] = (char) (cr += cp[0]); + cp[1] = (char) (cg += cp[1]); + cp[2] = (char) (cb += cp[2]); + cp[3] = (char) (ca += cp[3]); + } while ((int32) cc > 0); + } else { + do { + REPEAT4(stride, cp[stride] = + (char) (cp[stride] + *cp); cp++) + cc -= stride; + } while ((int32) cc > 0); + } + } +} + +static void +swabHorAcc16(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + tsize_t stride = PredictorState(tif)->stride; + uint16* wp = (uint16*) cp0; + tsize_t wc = cc / 2; + + if (wc > stride) { + TIFFSwabArrayOfShort(wp, wc); + wc -= stride; + do { + REPEAT4(stride, wp[stride] += wp[0]; wp++) + wc -= stride; + } while ((int32) wc > 0); + } +} + +static void +horAcc16(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + tsize_t stride = PredictorState(tif)->stride; + uint16* wp = (uint16*) cp0; + tsize_t wc = cc / 2; + + if (wc > stride) { + wc -= stride; + do { + REPEAT4(stride, wp[stride] += wp[0]; wp++) + wc -= stride; + } while ((int32) wc > 0); + } +} + +static void +swabHorAcc32(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + tsize_t stride = PredictorState(tif)->stride; + uint32* wp = (uint32*) cp0; + tsize_t wc = cc / 4; + + if (wc > stride) { + TIFFSwabArrayOfLong(wp, wc); + wc -= stride; + do { + REPEAT4(stride, wp[stride] += wp[0]; wp++) + wc -= stride; + } while ((int32) wc > 0); + } +} + +static void +horAcc32(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + tsize_t stride = PredictorState(tif)->stride; + uint32* wp = (uint32*) cp0; + tsize_t wc = cc / 4; + + if (wc > stride) { + wc -= stride; + do { + REPEAT4(stride, wp[stride] += wp[0]; wp++) + wc -= stride; + } while ((int32) wc > 0); + } +} + +/* + * Floating point predictor accumulation routine. + */ +static void +fpAcc(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + tsize_t stride = PredictorState(tif)->stride; + uint32 bps = tif->tif_dir.td_bitspersample / 8; + tsize_t wc = cc / bps; + tsize_t count = cc; + uint8 *cp = (uint8 *) cp0; + uint8 *tmp = (uint8 *)_TIFFmalloc(cc); + + if (!tmp) + return; + + while (count > stride) { + REPEAT4(stride, cp[stride] += cp[0]; cp++) + count -= stride; + } + + _TIFFmemcpy(tmp, cp0, cc); + cp = (uint8 *) cp0; + for (count = 0; count < wc; count++) { + uint32 byte; + for (byte = 0; byte < bps; byte++) { +#if WORDS_BIGENDIAN + cp[bps * count + byte] = tmp[byte * wc + count]; +#else + cp[bps * count + byte] = + tmp[(bps - byte - 1) * wc + count]; +#endif + } + } + _TIFFfree(tmp); +} + +/* + * Decode a scanline and apply the predictor routine. + */ +static int +PredictorDecodeRow(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) +{ + TIFFPredictorState *sp = PredictorState(tif); + + assert(sp != NULL); + assert(sp->decoderow != NULL); + assert(sp->decodepfunc != NULL); + + if ((*sp->decoderow)(tif, op0, occ0, s)) { + (*sp->decodepfunc)(tif, op0, occ0); + return 1; + } else + return 0; +} + +/* + * Decode a tile/strip and apply the predictor routine. + * Note that horizontal differencing must be done on a + * row-by-row basis. The width of a "row" has already + * been calculated at pre-decode time according to the + * strip/tile dimensions. + */ +static int +PredictorDecodeTile(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) +{ + TIFFPredictorState *sp = PredictorState(tif); + + assert(sp != NULL); + assert(sp->decodetile != NULL); + + if ((*sp->decodetile)(tif, op0, occ0, s)) { + tsize_t rowsize = sp->rowsize; + assert(rowsize > 0); + assert(sp->decodepfunc != NULL); + while ((long)occ0 > 0) { + (*sp->decodepfunc)(tif, op0, (tsize_t) rowsize); + occ0 -= rowsize; + op0 += rowsize; + } + return 1; + } else + return 0; +} + +static void +horDiff8(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + TIFFPredictorState* sp = PredictorState(tif); + tsize_t stride = sp->stride; + char* cp = (char*) cp0; + + if (cc > stride) { + cc -= stride; + /* + * Pipeline the most common cases. + */ + if (stride == 3) { + int r1, g1, b1; + int r2 = cp[0]; + int g2 = cp[1]; + int b2 = cp[2]; + do { + r1 = cp[3]; cp[3] = r1-r2; r2 = r1; + g1 = cp[4]; cp[4] = g1-g2; g2 = g1; + b1 = cp[5]; cp[5] = b1-b2; b2 = b1; + cp += 3; + } while ((int32)(cc -= 3) > 0); + } else if (stride == 4) { + int r1, g1, b1, a1; + int r2 = cp[0]; + int g2 = cp[1]; + int b2 = cp[2]; + int a2 = cp[3]; + do { + r1 = cp[4]; cp[4] = r1-r2; r2 = r1; + g1 = cp[5]; cp[5] = g1-g2; g2 = g1; + b1 = cp[6]; cp[6] = b1-b2; b2 = b1; + a1 = cp[7]; cp[7] = a1-a2; a2 = a1; + cp += 4; + } while ((int32)(cc -= 4) > 0); + } else { + cp += cc - 1; + do { + REPEAT4(stride, cp[stride] -= cp[0]; cp--) + } while ((int32)(cc -= stride) > 0); + } + } +} + +static void +horDiff16(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + TIFFPredictorState* sp = PredictorState(tif); + tsize_t stride = sp->stride; + int16 *wp = (int16*) cp0; + tsize_t wc = cc/2; + + if (wc > stride) { + wc -= stride; + wp += wc - 1; + do { + REPEAT4(stride, wp[stride] -= wp[0]; wp--) + wc -= stride; + } while ((int32) wc > 0); + } +} + +static void +horDiff32(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + TIFFPredictorState* sp = PredictorState(tif); + tsize_t stride = sp->stride; + int32 *wp = (int32*) cp0; + tsize_t wc = cc/4; + + if (wc > stride) { + wc -= stride; + wp += wc - 1; + do { + REPEAT4(stride, wp[stride] -= wp[0]; wp--) + wc -= stride; + } while ((int32) wc > 0); + } +} + +/* + * Floating point predictor differencing routine. + */ +static void +fpDiff(TIFF* tif, tidata_t cp0, tsize_t cc) +{ + tsize_t stride = PredictorState(tif)->stride; + uint32 bps = tif->tif_dir.td_bitspersample / 8; + tsize_t wc = cc / bps; + tsize_t count; + uint8 *cp = (uint8 *) cp0; + uint8 *tmp = (uint8 *)_TIFFmalloc(cc); + + if (!tmp) + return; + + _TIFFmemcpy(tmp, cp0, cc); + for (count = 0; count < wc; count++) { + uint32 byte; + for (byte = 0; byte < bps; byte++) { +#if WORDS_BIGENDIAN + cp[byte * wc + count] = tmp[bps * count + byte]; +#else + cp[(bps - byte - 1) * wc + count] = + tmp[bps * count + byte]; +#endif + } + } + _TIFFfree(tmp); + + cp = (uint8 *) cp0; + cp += cc - stride - 1; + for (count = cc; count > stride; count -= stride) + REPEAT4(stride, cp[stride] -= cp[0]; cp--) +} + +static int +PredictorEncodeRow(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + TIFFPredictorState *sp = PredictorState(tif); + + assert(sp != NULL); + assert(sp->encodepfunc != NULL); + assert(sp->encoderow != NULL); + + /* XXX horizontal differencing alters user's data XXX */ + (*sp->encodepfunc)(tif, bp, cc); + return (*sp->encoderow)(tif, bp, cc, s); +} + +static int +PredictorEncodeTile(TIFF* tif, tidata_t bp0, tsize_t cc0, tsample_t s) +{ + static const char module[] = "PredictorEncodeTile"; + TIFFPredictorState *sp = PredictorState(tif); + uint8 *working_copy; + tsize_t cc = cc0, rowsize; + unsigned char* bp; + int result_code; + + assert(sp != NULL); + assert(sp->encodepfunc != NULL); + assert(sp->encodetile != NULL); + + /* + * Do predictor manipulation in a working buffer to avoid altering + * the callers buffer. http://trac.osgeo.org/gdal/ticket/1965 + */ + working_copy = (uint8*) _TIFFmalloc(cc0); + if( working_copy == NULL ) + { + TIFFErrorExt(tif->tif_clientdata, module, + "Out of memory allocating %d byte temp buffer.", + cc0 ); + return 0; + } + memcpy( working_copy, bp0, cc0 ); + bp = working_copy; + + rowsize = sp->rowsize; + assert(rowsize > 0); + assert((cc0%rowsize)==0); + while (cc > 0) { + (*sp->encodepfunc)(tif, bp, rowsize); + cc -= rowsize; + bp += rowsize; + } + result_code = (*sp->encodetile)(tif, working_copy, cc0, s); + + _TIFFfree( working_copy ); + + return result_code; +} + +#define FIELD_PREDICTOR (FIELD_CODEC+0) /* XXX */ + +static const TIFFFieldInfo predictFieldInfo[] = { + { TIFFTAG_PREDICTOR, 1, 1, TIFF_SHORT, FIELD_PREDICTOR, + FALSE, FALSE, "Predictor" }, +}; + +static int +PredictorVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + TIFFPredictorState *sp = PredictorState(tif); + + assert(sp != NULL); + assert(sp->vsetparent != NULL); + + switch (tag) { + case TIFFTAG_PREDICTOR: + sp->predictor = (uint16) va_arg(ap, int); + TIFFSetFieldBit(tif, FIELD_PREDICTOR); + break; + default: + return (*sp->vsetparent)(tif, tag, ap); + } + tif->tif_flags |= TIFF_DIRTYDIRECT; + return 1; +} + +static int +PredictorVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + TIFFPredictorState *sp = PredictorState(tif); + + assert(sp != NULL); + assert(sp->vgetparent != NULL); + + switch (tag) { + case TIFFTAG_PREDICTOR: + *va_arg(ap, uint16*) = sp->predictor; + break; + default: + return (*sp->vgetparent)(tif, tag, ap); + } + return 1; +} + +static void +PredictorPrintDir(TIFF* tif, FILE* fd, long flags) +{ + TIFFPredictorState* sp = PredictorState(tif); + + (void) flags; + if (TIFFFieldSet(tif,FIELD_PREDICTOR)) { + fprintf(fd, " Predictor: "); + switch (sp->predictor) { + case 1: fprintf(fd, "none "); break; + case 2: fprintf(fd, "horizontal differencing "); break; + case 3: fprintf(fd, "floating point predictor "); break; + } + fprintf(fd, "%u (0x%x)\n", sp->predictor, sp->predictor); + } + if (sp->printdir) + (*sp->printdir)(tif, fd, flags); +} + +int +TIFFPredictorInit(TIFF* tif) +{ + TIFFPredictorState* sp = PredictorState(tif); + + assert(sp != 0); + + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, predictFieldInfo, + TIFFArrayCount(predictFieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, "TIFFPredictorInit", + "Merging Predictor codec-specific tags failed"); + return 0; + } + + /* + * Override parent get/set field methods. + */ + sp->vgetparent = tif->tif_tagmethods.vgetfield; + tif->tif_tagmethods.vgetfield = + PredictorVGetField;/* hook for predictor tag */ + sp->vsetparent = tif->tif_tagmethods.vsetfield; + tif->tif_tagmethods.vsetfield = + PredictorVSetField;/* hook for predictor tag */ + sp->printdir = tif->tif_tagmethods.printdir; + tif->tif_tagmethods.printdir = + PredictorPrintDir; /* hook for predictor tag */ + + sp->setupdecode = tif->tif_setupdecode; + tif->tif_setupdecode = PredictorSetupDecode; + sp->setupencode = tif->tif_setupencode; + tif->tif_setupencode = PredictorSetupEncode; + + sp->predictor = 1; /* default value */ + sp->encodepfunc = NULL; /* no predictor routine */ + sp->decodepfunc = NULL; /* no predictor routine */ + return 1; +} + +int +TIFFPredictorCleanup(TIFF* tif) +{ + TIFFPredictorState* sp = PredictorState(tif); + + assert(sp != 0); + + tif->tif_tagmethods.vgetfield = sp->vgetparent; + tif->tif_tagmethods.vsetfield = sp->vsetparent; + tif->tif_tagmethods.printdir = sp->printdir; + tif->tif_setupdecode = sp->setupdecode; + tif->tif_setupencode = sp->setupencode; + + return 1; +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_predict.h b/src/3rdparty/libtiff/libtiff/tif_predict.h new file mode 100644 index 0000000000..0c1aefccdc --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_predict.h @@ -0,0 +1,70 @@ +/* $Id: tif_predict.h,v 1.3.2.1 2007/11/22 21:24:51 fwarmerdam Exp $ */ + +/* + * Copyright (c) 1995-1997 Sam Leffler + * Copyright (c) 1995-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFFPREDICT_ +#define _TIFFPREDICT_ +/* + * ``Library-private'' Support for the Predictor Tag + */ + +/* + * Codecs that want to support the Predictor tag must place + * this structure first in their private state block so that + * the predictor code can cast tif_data to find its state. + */ +typedef struct { + int predictor; /* predictor tag value */ + int stride; /* sample stride over data */ + tsize_t rowsize; /* tile/strip row size */ + + TIFFCodeMethod encoderow; /* parent codec encode/decode row */ + TIFFCodeMethod encodestrip; /* parent codec encode/decode strip */ + TIFFCodeMethod encodetile; /* parent codec encode/decode tile */ + TIFFPostMethod encodepfunc; /* horizontal differencer */ + + TIFFCodeMethod decoderow; /* parent codec encode/decode row */ + TIFFCodeMethod decodestrip; /* parent codec encode/decode strip */ + TIFFCodeMethod decodetile; /* parent codec encode/decode tile */ + TIFFPostMethod decodepfunc; /* horizontal accumulator */ + + TIFFVGetMethod vgetparent; /* super-class method */ + TIFFVSetMethod vsetparent; /* super-class method */ + TIFFPrintMethod printdir; /* super-class method */ + TIFFBoolMethod setupdecode; /* super-class method */ + TIFFBoolMethod setupencode; /* super-class method */ +} TIFFPredictorState; + +#if defined(__cplusplus) +extern "C" { +#endif +extern int TIFFPredictorInit(TIFF*); +extern int TIFFPredictorCleanup(TIFF*); +#if defined(__cplusplus) +} +#endif +#endif /* _TIFFPREDICT_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_print.c b/src/3rdparty/libtiff/libtiff/tif_print.c new file mode 100644 index 0000000000..871fffd614 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_print.c @@ -0,0 +1,639 @@ +/* $Id: tif_print.c,v 1.36.2.2 2009-09-17 18:00:28 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Directory Printing Support + */ +#include "tiffiop.h" +#include +#include +#include + +static const char *photoNames[] = { + "min-is-white", /* PHOTOMETRIC_MINISWHITE */ + "min-is-black", /* PHOTOMETRIC_MINISBLACK */ + "RGB color", /* PHOTOMETRIC_RGB */ + "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */ + "transparency mask", /* PHOTOMETRIC_MASK */ + "separated", /* PHOTOMETRIC_SEPARATED */ + "YCbCr", /* PHOTOMETRIC_YCBCR */ + "7 (0x7)", + "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */ +}; +#define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0])) + +static const char *orientNames[] = { + "0 (0x0)", + "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */ + "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */ + "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */ + "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */ + "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */ + "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */ + "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */ + "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */ +}; +#define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0])) + +static void +_TIFFPrintField(FILE* fd, const TIFFFieldInfo *fip, + uint32 value_count, void *raw_data) +{ + uint32 j; + + fprintf(fd, " %s: ", fip->field_name); + + for(j = 0; j < value_count; j++) { + if(fip->field_type == TIFF_BYTE) + fprintf(fd, "%u", ((uint8 *) raw_data)[j]); + else if(fip->field_type == TIFF_UNDEFINED) + fprintf(fd, "0x%x", + (unsigned int) ((unsigned char *) raw_data)[j]); + else if(fip->field_type == TIFF_SBYTE) + fprintf(fd, "%d", ((int8 *) raw_data)[j]); + else if(fip->field_type == TIFF_SHORT) + fprintf(fd, "%u", ((uint16 *) raw_data)[j]); + else if(fip->field_type == TIFF_SSHORT) + fprintf(fd, "%d", ((int16 *) raw_data)[j]); + else if(fip->field_type == TIFF_LONG) + fprintf(fd, "%lu", + (unsigned long)((uint32 *) raw_data)[j]); + else if(fip->field_type == TIFF_SLONG) + fprintf(fd, "%ld", (long)((int32 *) raw_data)[j]); + else if(fip->field_type == TIFF_RATIONAL + || fip->field_type == TIFF_SRATIONAL + || fip->field_type == TIFF_FLOAT) + fprintf(fd, "%f", ((float *) raw_data)[j]); + else if(fip->field_type == TIFF_IFD) + fprintf(fd, "0x%ulx", ((uint32 *) raw_data)[j]); + else if(fip->field_type == TIFF_ASCII) { + fprintf(fd, "%s", (char *) raw_data); + break; + } + else if(fip->field_type == TIFF_DOUBLE) + fprintf(fd, "%f", ((double *) raw_data)[j]); + else if(fip->field_type == TIFF_FLOAT) + fprintf(fd, "%f", ((float *)raw_data)[j]); + else { + fprintf(fd, ""); + break; + } + + if(j < value_count - 1) + fprintf(fd, ","); + } + + fprintf(fd, "\n"); +} + +static int +_TIFFPrettyPrintField(TIFF* tif, FILE* fd, ttag_t tag, + uint32 value_count, void *raw_data) +{ + TIFFDirectory *td = &tif->tif_dir; + + switch (tag) + { + case TIFFTAG_INKSET: + fprintf(fd, " Ink Set: "); + switch (*((uint16*)raw_data)) { + case INKSET_CMYK: + fprintf(fd, "CMYK\n"); + break; + default: + fprintf(fd, "%u (0x%x)\n", + *((uint16*)raw_data), + *((uint16*)raw_data)); + break; + } + return 1; + case TIFFTAG_DOTRANGE: + fprintf(fd, " Dot Range: %u-%u\n", + ((uint16*)raw_data)[0], ((uint16*)raw_data)[1]); + return 1; + case TIFFTAG_WHITEPOINT: + fprintf(fd, " White Point: %g-%g\n", + ((float *)raw_data)[0], ((float *)raw_data)[1]); return 1; + case TIFFTAG_REFERENCEBLACKWHITE: + { + uint16 i; + + fprintf(fd, " Reference Black/White:\n"); + for (i = 0; i < td->td_samplesperpixel; i++) + fprintf(fd, " %2d: %5g %5g\n", i, + ((float *)raw_data)[2*i+0], + ((float *)raw_data)[2*i+1]); + return 1; + } + case TIFFTAG_XMLPACKET: + { + uint32 i; + + fprintf(fd, " XMLPacket (XMP Metadata):\n" ); + for(i = 0; i < value_count; i++) + fputc(((char *)raw_data)[i], fd); + fprintf( fd, "\n" ); + return 1; + } + case TIFFTAG_RICHTIFFIPTC: + /* + * XXX: for some weird reason RichTIFFIPTC tag + * defined as array of LONG values. + */ + fprintf(fd, + " RichTIFFIPTC Data: , %lu bytes\n", + (unsigned long) value_count * 4); + return 1; + case TIFFTAG_PHOTOSHOP: + fprintf(fd, " Photoshop Data: , %lu bytes\n", + (unsigned long) value_count); + return 1; + case TIFFTAG_ICCPROFILE: + fprintf(fd, " ICC Profile: , %lu bytes\n", + (unsigned long) value_count); + return 1; + case TIFFTAG_STONITS: + fprintf(fd, + " Sample to Nits conversion factor: %.4e\n", + *((double*)raw_data)); + return 1; + } + + return 0; +} + +/* + * Print the contents of the current directory + * to the specified stdio file stream. + */ +void +TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) +{ + TIFFDirectory *td = &tif->tif_dir; + char *sep; + uint16 i; + long l, n; + + fprintf(fd, "TIFF Directory at offset 0x%lx (%lu)\n", + (unsigned long)tif->tif_diroff, (unsigned long)tif->tif_diroff); + if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) { + fprintf(fd, " Subfile Type:"); + sep = " "; + if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) { + fprintf(fd, "%sreduced-resolution image", sep); + sep = "/"; + } + if (td->td_subfiletype & FILETYPE_PAGE) { + fprintf(fd, "%smulti-page document", sep); + sep = "/"; + } + if (td->td_subfiletype & FILETYPE_MASK) + fprintf(fd, "%stransparency mask", sep); + fprintf(fd, " (%lu = 0x%lx)\n", + (long) td->td_subfiletype, (long) td->td_subfiletype); + } + if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) { + fprintf(fd, " Image Width: %lu Image Length: %lu", + (unsigned long) td->td_imagewidth, (unsigned long) td->td_imagelength); + if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH)) + fprintf(fd, " Image Depth: %lu", + (unsigned long) td->td_imagedepth); + fprintf(fd, "\n"); + } + if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) { + fprintf(fd, " Tile Width: %lu Tile Length: %lu", + (unsigned long) td->td_tilewidth, (unsigned long) td->td_tilelength); + if (TIFFFieldSet(tif,FIELD_TILEDEPTH)) + fprintf(fd, " Tile Depth: %lu", + (unsigned long) td->td_tiledepth); + fprintf(fd, "\n"); + } + if (TIFFFieldSet(tif,FIELD_RESOLUTION)) { + fprintf(fd, " Resolution: %g, %g", + td->td_xresolution, td->td_yresolution); + if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) { + switch (td->td_resolutionunit) { + case RESUNIT_NONE: + fprintf(fd, " (unitless)"); + break; + case RESUNIT_INCH: + fprintf(fd, " pixels/inch"); + break; + case RESUNIT_CENTIMETER: + fprintf(fd, " pixels/cm"); + break; + default: + fprintf(fd, " (unit %u = 0x%x)", + td->td_resolutionunit, + td->td_resolutionunit); + break; + } + } + fprintf(fd, "\n"); + } + if (TIFFFieldSet(tif,FIELD_POSITION)) + fprintf(fd, " Position: %g, %g\n", + td->td_xposition, td->td_yposition); + if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE)) + fprintf(fd, " Bits/Sample: %u\n", td->td_bitspersample); + if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) { + fprintf(fd, " Sample Format: "); + switch (td->td_sampleformat) { + case SAMPLEFORMAT_VOID: + fprintf(fd, "void\n"); + break; + case SAMPLEFORMAT_INT: + fprintf(fd, "signed integer\n"); + break; + case SAMPLEFORMAT_UINT: + fprintf(fd, "unsigned integer\n"); + break; + case SAMPLEFORMAT_IEEEFP: + fprintf(fd, "IEEE floating point\n"); + break; + case SAMPLEFORMAT_COMPLEXINT: + fprintf(fd, "complex signed integer\n"); + break; + case SAMPLEFORMAT_COMPLEXIEEEFP: + fprintf(fd, "complex IEEE floating point\n"); + break; + default: + fprintf(fd, "%u (0x%x)\n", + td->td_sampleformat, td->td_sampleformat); + break; + } + } + if (TIFFFieldSet(tif,FIELD_COMPRESSION)) { + const TIFFCodec* c = TIFFFindCODEC(td->td_compression); + fprintf(fd, " Compression Scheme: "); + if (c) + fprintf(fd, "%s\n", c->name); + else + fprintf(fd, "%u (0x%x)\n", + td->td_compression, td->td_compression); + } + if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) { + fprintf(fd, " Photometric Interpretation: "); + if (td->td_photometric < NPHOTONAMES) + fprintf(fd, "%s\n", photoNames[td->td_photometric]); + else { + switch (td->td_photometric) { + case PHOTOMETRIC_LOGL: + fprintf(fd, "CIE Log2(L)\n"); + break; + case PHOTOMETRIC_LOGLUV: + fprintf(fd, "CIE Log2(L) (u',v')\n"); + break; + default: + fprintf(fd, "%u (0x%x)\n", + td->td_photometric, td->td_photometric); + break; + } + } + } + if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) { + fprintf(fd, " Extra Samples: %u<", td->td_extrasamples); + sep = ""; + for (i = 0; i < td->td_extrasamples; i++) { + switch (td->td_sampleinfo[i]) { + case EXTRASAMPLE_UNSPECIFIED: + fprintf(fd, "%sunspecified", sep); + break; + case EXTRASAMPLE_ASSOCALPHA: + fprintf(fd, "%sassoc-alpha", sep); + break; + case EXTRASAMPLE_UNASSALPHA: + fprintf(fd, "%sunassoc-alpha", sep); + break; + default: + fprintf(fd, "%s%u (0x%x)", sep, + td->td_sampleinfo[i], td->td_sampleinfo[i]); + break; + } + sep = ", "; + } + fprintf(fd, ">\n"); + } + if (TIFFFieldSet(tif,FIELD_INKNAMES)) { + char* cp; + fprintf(fd, " Ink Names: "); + i = td->td_samplesperpixel; + sep = ""; + for (cp = td->td_inknames; i > 0; cp = strchr(cp,'\0')+1, i--) { + fputs(sep, fd); + _TIFFprintAscii(fd, cp); + sep = ", "; + } + fputs("\n", fd); + } + if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) { + fprintf(fd, " Thresholding: "); + switch (td->td_threshholding) { + case THRESHHOLD_BILEVEL: + fprintf(fd, "bilevel art scan\n"); + break; + case THRESHHOLD_HALFTONE: + fprintf(fd, "halftone or dithered scan\n"); + break; + case THRESHHOLD_ERRORDIFFUSE: + fprintf(fd, "error diffused\n"); + break; + default: + fprintf(fd, "%u (0x%x)\n", + td->td_threshholding, td->td_threshholding); + break; + } + } + if (TIFFFieldSet(tif,FIELD_FILLORDER)) { + fprintf(fd, " FillOrder: "); + switch (td->td_fillorder) { + case FILLORDER_MSB2LSB: + fprintf(fd, "msb-to-lsb\n"); + break; + case FILLORDER_LSB2MSB: + fprintf(fd, "lsb-to-msb\n"); + break; + default: + fprintf(fd, "%u (0x%x)\n", + td->td_fillorder, td->td_fillorder); + break; + } + } + if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING)) + { + /* + * For hacky reasons (see tif_jpeg.c - JPEGFixupTestSubsampling), + * we need to fetch this rather than trust what is in our + * structures. + */ + uint16 subsampling[2]; + + TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING, + subsampling + 0, subsampling + 1 ); + fprintf(fd, " YCbCr Subsampling: %u, %u\n", + subsampling[0], subsampling[1] ); + } + if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) { + fprintf(fd, " YCbCr Positioning: "); + switch (td->td_ycbcrpositioning) { + case YCBCRPOSITION_CENTERED: + fprintf(fd, "centered\n"); + break; + case YCBCRPOSITION_COSITED: + fprintf(fd, "cosited\n"); + break; + default: + fprintf(fd, "%u (0x%x)\n", + td->td_ycbcrpositioning, td->td_ycbcrpositioning); + break; + } + } + if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS)) + fprintf(fd, " Halftone Hints: light %u dark %u\n", + td->td_halftonehints[0], td->td_halftonehints[1]); + if (TIFFFieldSet(tif,FIELD_ORIENTATION)) { + fprintf(fd, " Orientation: "); + if (td->td_orientation < NORIENTNAMES) + fprintf(fd, "%s\n", orientNames[td->td_orientation]); + else + fprintf(fd, "%u (0x%x)\n", + td->td_orientation, td->td_orientation); + } + if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL)) + fprintf(fd, " Samples/Pixel: %u\n", td->td_samplesperpixel); + if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) { + fprintf(fd, " Rows/Strip: "); + if (td->td_rowsperstrip == (uint32) -1) + fprintf(fd, "(infinite)\n"); + else + fprintf(fd, "%lu\n", (unsigned long) td->td_rowsperstrip); + } + if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE)) + fprintf(fd, " Min Sample Value: %u\n", td->td_minsamplevalue); + if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE)) + fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue); + if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) + fprintf(fd, " SMin Sample Value: %g\n", + td->td_sminsamplevalue); + if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) + fprintf(fd, " SMax Sample Value: %g\n", + td->td_smaxsamplevalue); + if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) { + fprintf(fd, " Planar Configuration: "); + switch (td->td_planarconfig) { + case PLANARCONFIG_CONTIG: + fprintf(fd, "single image plane\n"); + break; + case PLANARCONFIG_SEPARATE: + fprintf(fd, "separate image planes\n"); + break; + default: + fprintf(fd, "%u (0x%x)\n", + td->td_planarconfig, td->td_planarconfig); + break; + } + } + if (TIFFFieldSet(tif,FIELD_PAGENUMBER)) + fprintf(fd, " Page Number: %u-%u\n", + td->td_pagenumber[0], td->td_pagenumber[1]); + if (TIFFFieldSet(tif,FIELD_COLORMAP)) { + fprintf(fd, " Color Map: "); + if (flags & TIFFPRINT_COLORMAP) { + fprintf(fd, "\n"); + n = 1L<td_bitspersample; + for (l = 0; l < n; l++) + fprintf(fd, " %5lu: %5u %5u %5u\n", + l, + td->td_colormap[0][l], + td->td_colormap[1][l], + td->td_colormap[2][l]); + } else + fprintf(fd, "(present)\n"); + } + if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) { + fprintf(fd, " Transfer Function: "); + if (flags & TIFFPRINT_CURVES) { + fprintf(fd, "\n"); + n = 1L<td_bitspersample; + for (l = 0; l < n; l++) { + fprintf(fd, " %2lu: %5u", + l, td->td_transferfunction[0][l]); + for (i = 1; i < td->td_samplesperpixel; i++) + fprintf(fd, " %5u", + td->td_transferfunction[i][l]); + fputc('\n', fd); + } + } else + fprintf(fd, "(present)\n"); + } + if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd)) { + fprintf(fd, " SubIFD Offsets:"); + for (i = 0; i < td->td_nsubifd; i++) + fprintf(fd, " %5lu", (long) td->td_subifd[i]); + fputc('\n', fd); + } + + /* + ** Custom tag support. + */ + { + int i; + short count; + + count = (short) TIFFGetTagListCount(tif); + for(i = 0; i < count; i++) { + ttag_t tag = TIFFGetTagListEntry(tif, i); + const TIFFFieldInfo *fip; + uint32 value_count; + int mem_alloc = 0; + void *raw_data; + + fip = TIFFFieldWithTag(tif, tag); + if(fip == NULL) + continue; + + if(fip->field_passcount) { + if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1) + continue; + } else { + if (fip->field_readcount == TIFF_VARIABLE + || fip->field_readcount == TIFF_VARIABLE2) + value_count = 1; + else if (fip->field_readcount == TIFF_SPP) + value_count = td->td_samplesperpixel; + else + value_count = fip->field_readcount; + if ((fip->field_type == TIFF_ASCII + || fip->field_readcount == TIFF_VARIABLE + || fip->field_readcount == TIFF_VARIABLE2 + || fip->field_readcount == TIFF_SPP + || value_count > 1) + && fip->field_tag != TIFFTAG_PAGENUMBER + && fip->field_tag != TIFFTAG_HALFTONEHINTS + && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING + && fip->field_tag != TIFFTAG_DOTRANGE) { + if(TIFFGetField(tif, tag, &raw_data) != 1) + continue; + } else if (fip->field_tag != TIFFTAG_PAGENUMBER + && fip->field_tag != TIFFTAG_HALFTONEHINTS + && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING + && fip->field_tag != TIFFTAG_DOTRANGE) { + raw_data = _TIFFmalloc( + _TIFFDataSize(fip->field_type) + * value_count); + mem_alloc = 1; + if(TIFFGetField(tif, tag, raw_data) != 1) { + _TIFFfree(raw_data); + continue; + } + } else { + /* + * XXX: Should be fixed and removed, see the + * notes related to TIFFTAG_PAGENUMBER, + * TIFFTAG_HALFTONEHINTS, + * TIFFTAG_YCBCRSUBSAMPLING and + * TIFFTAG_DOTRANGE tags in tif_dir.c. */ + char *tmp; + raw_data = _TIFFmalloc( + _TIFFDataSize(fip->field_type) + * value_count); + tmp = raw_data; + mem_alloc = 1; + if(TIFFGetField(tif, tag, tmp, + tmp + _TIFFDataSize(fip->field_type)) != 1) { + _TIFFfree(raw_data); + continue; + } + } + } + + /* + * Catch the tags which needs to be specially handled and + * pretty print them. If tag not handled in + * _TIFFPrettyPrintField() fall down and print it as any other + * tag. + */ + if (_TIFFPrettyPrintField(tif, fd, tag, value_count, raw_data)) { + if(mem_alloc) + _TIFFfree(raw_data); + continue; + } + else + _TIFFPrintField(fd, fip, value_count, raw_data); + + if(mem_alloc) + _TIFFfree(raw_data); + } + } + + if (tif->tif_tagmethods.printdir) + (*tif->tif_tagmethods.printdir)(tif, fd, flags); + if ((flags & TIFFPRINT_STRIPS) && + TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) { + tstrip_t s; + + fprintf(fd, " %lu %s:\n", + (long) td->td_nstrips, + isTiled(tif) ? "Tiles" : "Strips"); + for (s = 0; s < td->td_nstrips; s++) + fprintf(fd, " %3lu: [%8lu, %8lu]\n", + (unsigned long) s, + (unsigned long) td->td_stripoffset[s], + (unsigned long) td->td_stripbytecount[s]); + } +} + +void +_TIFFprintAscii(FILE* fd, const char* cp) +{ + for (; *cp != '\0'; cp++) { + const char* tp; + + if (isprint((int)*cp)) { + fputc(*cp, fd); + continue; + } + for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++) + if (*tp++ == *cp) + break; + if (*tp) + fprintf(fd, "\\%c", *tp); + else + fprintf(fd, "\\%03o", *cp & 0xff); + } +} + +void +_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value) +{ + fprintf(fd, " %s: \"", name); + _TIFFprintAscii(fd, value); + fprintf(fd, "\"\n"); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_read.c b/src/3rdparty/libtiff/libtiff/tif_read.c new file mode 100644 index 0000000000..92e47469e2 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_read.c @@ -0,0 +1,741 @@ +/* $Id: tif_read.c,v 1.16 2007/02/22 11:33:44 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * Scanline-oriented Read Support + */ +#include "tiffiop.h" +#include + + int TIFFFillStrip(TIFF*, tstrip_t); + int TIFFFillTile(TIFF*, ttile_t); +static int TIFFStartStrip(TIFF*, tstrip_t); +static int TIFFStartTile(TIFF*, ttile_t); +static int TIFFCheckRead(TIFF*, int); + +#define NOSTRIP ((tstrip_t) -1) /* undefined state */ +#define NOTILE ((ttile_t) -1) /* undefined state */ + +/* + * Seek to a random row+sample in a file. + */ +static int +TIFFSeek(TIFF* tif, uint32 row, tsample_t sample) +{ + register TIFFDirectory *td = &tif->tif_dir; + tstrip_t strip; + + if (row >= td->td_imagelength) { /* out of range */ + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Row out of range, max %lu", + (unsigned long) row, + (unsigned long) td->td_imagelength); + return (0); + } + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { + if (sample >= td->td_samplesperpixel) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Sample out of range, max %lu", + (unsigned long) sample, (unsigned long) td->td_samplesperpixel); + return (0); + } + strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip; + } else + strip = row / td->td_rowsperstrip; + if (strip != tif->tif_curstrip) { /* different strip, refill */ + if (!TIFFFillStrip(tif, strip)) + return (0); + } else if (row < tif->tif_row) { + /* + * Moving backwards within the same strip: backup + * to the start and then decode forward (below). + * + * NB: If you're planning on lots of random access within a + * strip, it's better to just read and decode the entire + * strip, and then access the decoded data in a random fashion. + */ + if (!TIFFStartStrip(tif, strip)) + return (0); + } + if (row != tif->tif_row) { + /* + * Seek forward to the desired row. + */ + if (!(*tif->tif_seek)(tif, row - tif->tif_row)) + return (0); + tif->tif_row = row; + } + return (1); +} + +int +TIFFReadScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample) +{ + int e; + + if (!TIFFCheckRead(tif, 0)) + return (-1); + if( (e = TIFFSeek(tif, row, sample)) != 0) { + /* + * Decompress desired row into user buffer. + */ + e = (*tif->tif_decoderow) + (tif, (tidata_t) buf, tif->tif_scanlinesize, sample); + + /* we are now poised at the beginning of the next row */ + tif->tif_row = row + 1; + + if (e) + (*tif->tif_postdecode)(tif, (tidata_t) buf, + tif->tif_scanlinesize); + } + return (e > 0 ? 1 : -1); +} + +/* + * Read a strip of data and decompress the specified + * amount into the user-supplied buffer. + */ +tsize_t +TIFFReadEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size) +{ + TIFFDirectory *td = &tif->tif_dir; + uint32 nrows; + tsize_t stripsize; + tstrip_t sep_strip, strips_per_sep; + + if (!TIFFCheckRead(tif, 0)) + return (-1); + if (strip >= td->td_nstrips) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%ld: Strip out of range, max %ld", + (long) strip, (long) td->td_nstrips); + return (-1); + } + /* + * Calculate the strip size according to the number of + * rows in the strip (check for truncated last strip on any + * of the separations). + */ + if( td->td_rowsperstrip >= td->td_imagelength ) + strips_per_sep = 1; + else + strips_per_sep = (td->td_imagelength+td->td_rowsperstrip-1) + / td->td_rowsperstrip; + + sep_strip = strip % strips_per_sep; + + if (sep_strip != strips_per_sep-1 || + (nrows = td->td_imagelength % td->td_rowsperstrip) == 0) + nrows = td->td_rowsperstrip; + + stripsize = TIFFVStripSize(tif, nrows); + if (size == (tsize_t) -1) + size = stripsize; + else if (size > stripsize) + size = stripsize; + if (TIFFFillStrip(tif, strip) + && (*tif->tif_decodestrip)(tif, (tidata_t) buf, size, + (tsample_t)(strip / td->td_stripsperimage)) > 0 ) { + (*tif->tif_postdecode)(tif, (tidata_t) buf, size); + return (size); + } else + return ((tsize_t) -1); +} + +static tsize_t +TIFFReadRawStrip1(TIFF* tif, + tstrip_t strip, tdata_t buf, tsize_t size, const char* module) +{ + TIFFDirectory *td = &tif->tif_dir; + + assert((tif->tif_flags&TIFF_NOREADRAW)==0); + if (!isMapped(tif)) { + tsize_t cc; + + if (!SeekOK(tif, td->td_stripoffset[strip])) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Seek error at scanline %lu, strip %lu", + tif->tif_name, + (unsigned long) tif->tif_row, (unsigned long) strip); + return (-1); + } + cc = TIFFReadFile(tif, buf, size); + if (cc != size) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Read error at scanline %lu; got %lu bytes, expected %lu", + tif->tif_name, + (unsigned long) tif->tif_row, + (unsigned long) cc, + (unsigned long) size); + return (-1); + } + } else { + if (td->td_stripoffset[strip] + size > tif->tif_size) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Read error at scanline %lu, strip %lu; got %lu bytes, expected %lu", + tif->tif_name, + (unsigned long) tif->tif_row, + (unsigned long) strip, + (unsigned long) tif->tif_size - td->td_stripoffset[strip], + (unsigned long) size); + return (-1); + } + _TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[strip], + size); + } + return (size); +} + +/* + * Read a strip of data from the file. + */ +tsize_t +TIFFReadRawStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size) +{ + static const char module[] = "TIFFReadRawStrip"; + TIFFDirectory *td = &tif->tif_dir; + /* + * FIXME: butecount should have tsize_t type, but for now libtiff + * defines tsize_t as a signed 32-bit integer and we are losing + * ability to read arrays larger than 2^31 bytes. So we are using + * uint32 instead of tsize_t here. + */ + uint32 bytecount; + + if (!TIFFCheckRead(tif, 0)) + return ((tsize_t) -1); + if (strip >= td->td_nstrips) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Strip out of range, max %lu", + (unsigned long) strip, + (unsigned long) td->td_nstrips); + return ((tsize_t) -1); + } + if (tif->tif_flags&TIFF_NOREADRAW) + { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Compression scheme does not support access to raw uncompressed data"); + return ((tsize_t) -1); + } + bytecount = td->td_stripbytecount[strip]; + if (bytecount <= 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Invalid strip byte count, strip %lu", + (unsigned long) bytecount, (unsigned long) strip); + return ((tsize_t) -1); + } + if (size != (tsize_t)-1 && (uint32)size < bytecount) + bytecount = size; + return (TIFFReadRawStrip1(tif, strip, buf, bytecount, module)); +} + +/* + * Read the specified strip and setup for decoding. The data buffer is + * expanded, as necessary, to hold the strip's data. + */ +int +TIFFFillStrip(TIFF* tif, tstrip_t strip) +{ + static const char module[] = "TIFFFillStrip"; + TIFFDirectory *td = &tif->tif_dir; + + if ((tif->tif_flags&TIFF_NOREADRAW)==0) + { + /* + * FIXME: butecount should have tsize_t type, but for now + * libtiff defines tsize_t as a signed 32-bit integer and we + * are losing ability to read arrays larger than 2^31 bytes. + * So we are using uint32 instead of tsize_t here. + */ + uint32 bytecount = td->td_stripbytecount[strip]; + if (bytecount <= 0) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Invalid strip byte count %lu, strip %lu", + tif->tif_name, (unsigned long) bytecount, + (unsigned long) strip); + return (0); + } + if (isMapped(tif) && + (isFillOrder(tif, td->td_fillorder) + || (tif->tif_flags & TIFF_NOBITREV))) { + /* + * The image is mapped into memory and we either don't + * need to flip bits or the compression routine is + * going to handle this operation itself. In this + * case, avoid copying the raw data and instead just + * reference the data from the memory mapped file + * image. This assumes that the decompression + * routines do not modify the contents of the raw data + * buffer (if they try to, the application will get a + * fault since the file is mapped read-only). + */ + if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) + _TIFFfree(tif->tif_rawdata); + tif->tif_flags &= ~TIFF_MYBUFFER; + /* + * We must check for overflow, potentially causing + * an OOB read. Instead of simple + * + * td->td_stripoffset[strip]+bytecount > tif->tif_size + * + * comparison (which can overflow) we do the following + * two comparisons: + */ + if (bytecount > tif->tif_size || + td->td_stripoffset[strip] > tif->tif_size - bytecount) { + /* + * This error message might seem strange, but + * it's what would happen if a read were done + * instead. + */ + TIFFErrorExt(tif->tif_clientdata, module, + + "%s: Read error on strip %lu; " + "got %lu bytes, expected %lu", + tif->tif_name, (unsigned long) strip, + (unsigned long) tif->tif_size - td->td_stripoffset[strip], + (unsigned long) bytecount); + tif->tif_curstrip = NOSTRIP; + return (0); + } + tif->tif_rawdatasize = bytecount; + tif->tif_rawdata = tif->tif_base + td->td_stripoffset[strip]; + } else { + /* + * Expand raw data buffer, if needed, to hold data + * strip coming from file (perhaps should set upper + * bound on the size of a buffer we'll use?). + */ + if (bytecount > (uint32)tif->tif_rawdatasize) { + tif->tif_curstrip = NOSTRIP; + if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { + TIFFErrorExt(tif->tif_clientdata, + module, + "%s: Data buffer too small to hold strip %lu", + tif->tif_name, + (unsigned long) strip); + return (0); + } + if (!TIFFReadBufferSetup(tif, 0, + TIFFroundup(bytecount, 1024))) + return (0); + } + if ((uint32)TIFFReadRawStrip1(tif, strip, + (unsigned char *)tif->tif_rawdata, + bytecount, module) != bytecount) + return (0); + if (!isFillOrder(tif, td->td_fillorder) && + (tif->tif_flags & TIFF_NOBITREV) == 0) + TIFFReverseBits(tif->tif_rawdata, bytecount); + } + } + return (TIFFStartStrip(tif, strip)); +} + +/* + * Tile-oriented Read Support + * Contributed by Nancy Cam (Silicon Graphics). + */ + +/* + * Read and decompress a tile of data. The + * tile is selected by the (x,y,z,s) coordinates. + */ +tsize_t +TIFFReadTile(TIFF* tif, + tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s) +{ + if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s)) + return (-1); + return (TIFFReadEncodedTile(tif, + TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1)); +} + +/* + * Read a tile of data and decompress the specified + * amount into the user-supplied buffer. + */ +tsize_t +TIFFReadEncodedTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size) +{ + TIFFDirectory *td = &tif->tif_dir; + tsize_t tilesize = tif->tif_tilesize; + + if (!TIFFCheckRead(tif, 1)) + return (-1); + if (tile >= td->td_nstrips) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%ld: Tile out of range, max %ld", + (long) tile, (unsigned long) td->td_nstrips); + return (-1); + } + if (size == (tsize_t) -1) + size = tilesize; + else if (size > tilesize) + size = tilesize; + if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif, + (tidata_t) buf, size, (tsample_t)(tile/td->td_stripsperimage))) { + (*tif->tif_postdecode)(tif, (tidata_t) buf, size); + return (size); + } else + return (-1); +} + +static tsize_t +TIFFReadRawTile1(TIFF* tif, + ttile_t tile, tdata_t buf, tsize_t size, const char* module) +{ + TIFFDirectory *td = &tif->tif_dir; + + assert((tif->tif_flags&TIFF_NOREADRAW)==0); + if (!isMapped(tif)) { + tsize_t cc; + + if (!SeekOK(tif, td->td_stripoffset[tile])) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Seek error at row %ld, col %ld, tile %ld", + tif->tif_name, + (long) tif->tif_row, + (long) tif->tif_col, + (long) tile); + return ((tsize_t) -1); + } + cc = TIFFReadFile(tif, buf, size); + if (cc != size) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Read error at row %ld, col %ld; got %lu bytes, expected %lu", + tif->tif_name, + (long) tif->tif_row, + (long) tif->tif_col, + (unsigned long) cc, + (unsigned long) size); + return ((tsize_t) -1); + } + } else { + if (td->td_stripoffset[tile] + size > tif->tif_size) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Read error at row %ld, col %ld, tile %ld; got %lu bytes, expected %lu", + tif->tif_name, + (long) tif->tif_row, + (long) tif->tif_col, + (long) tile, + (unsigned long) tif->tif_size - td->td_stripoffset[tile], + (unsigned long) size); + return ((tsize_t) -1); + } + _TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[tile], size); + } + return (size); +} + +/* + * Read a tile of data from the file. + */ +tsize_t +TIFFReadRawTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size) +{ + static const char module[] = "TIFFReadRawTile"; + TIFFDirectory *td = &tif->tif_dir; + /* + * FIXME: butecount should have tsize_t type, but for now libtiff + * defines tsize_t as a signed 32-bit integer and we are losing + * ability to read arrays larger than 2^31 bytes. So we are using + * uint32 instead of tsize_t here. + */ + uint32 bytecount; + + if (!TIFFCheckRead(tif, 1)) + return ((tsize_t) -1); + if (tile >= td->td_nstrips) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Tile out of range, max %lu", + (unsigned long) tile, (unsigned long) td->td_nstrips); + return ((tsize_t) -1); + } + if (tif->tif_flags&TIFF_NOREADRAW) + { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Compression scheme does not support access to raw uncompressed data"); + return ((tsize_t) -1); + } + bytecount = td->td_stripbytecount[tile]; + if (size != (tsize_t) -1 && (uint32)size < bytecount) + bytecount = size; + return (TIFFReadRawTile1(tif, tile, buf, bytecount, module)); +} + +/* + * Read the specified tile and setup for decoding. The data buffer is + * expanded, as necessary, to hold the tile's data. + */ +int +TIFFFillTile(TIFF* tif, ttile_t tile) +{ + static const char module[] = "TIFFFillTile"; + TIFFDirectory *td = &tif->tif_dir; + + if ((tif->tif_flags&TIFF_NOREADRAW)==0) + { + /* + * FIXME: butecount should have tsize_t type, but for now + * libtiff defines tsize_t as a signed 32-bit integer and we + * are losing ability to read arrays larger than 2^31 bytes. + * So we are using uint32 instead of tsize_t here. + */ + uint32 bytecount = td->td_stripbytecount[tile]; + if (bytecount <= 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Invalid tile byte count, tile %lu", + (unsigned long) bytecount, (unsigned long) tile); + return (0); + } + if (isMapped(tif) && + (isFillOrder(tif, td->td_fillorder) + || (tif->tif_flags & TIFF_NOBITREV))) { + /* + * The image is mapped into memory and we either don't + * need to flip bits or the compression routine is + * going to handle this operation itself. In this + * case, avoid copying the raw data and instead just + * reference the data from the memory mapped file + * image. This assumes that the decompression + * routines do not modify the contents of the raw data + * buffer (if they try to, the application will get a + * fault since the file is mapped read-only). + */ + if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) + _TIFFfree(tif->tif_rawdata); + tif->tif_flags &= ~TIFF_MYBUFFER; + /* + * We must check for overflow, potentially causing + * an OOB read. Instead of simple + * + * td->td_stripoffset[tile]+bytecount > tif->tif_size + * + * comparison (which can overflow) we do the following + * two comparisons: + */ + if (bytecount > tif->tif_size || + td->td_stripoffset[tile] > tif->tif_size - bytecount) { + tif->tif_curtile = NOTILE; + return (0); + } + tif->tif_rawdatasize = bytecount; + tif->tif_rawdata = + tif->tif_base + td->td_stripoffset[tile]; + } else { + /* + * Expand raw data buffer, if needed, to hold data + * tile coming from file (perhaps should set upper + * bound on the size of a buffer we'll use?). + */ + if (bytecount > (uint32)tif->tif_rawdatasize) { + tif->tif_curtile = NOTILE; + if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { + TIFFErrorExt(tif->tif_clientdata, + module, + "%s: Data buffer too small to hold tile %ld", + tif->tif_name, + (long) tile); + return (0); + } + if (!TIFFReadBufferSetup(tif, 0, + TIFFroundup(bytecount, 1024))) + return (0); + } + if ((uint32)TIFFReadRawTile1(tif, tile, + (unsigned char *)tif->tif_rawdata, + bytecount, module) != bytecount) + return (0); + if (!isFillOrder(tif, td->td_fillorder) && + (tif->tif_flags & TIFF_NOBITREV) == 0) + TIFFReverseBits(tif->tif_rawdata, bytecount); + } + } + return (TIFFStartTile(tif, tile)); +} + +/* + * Setup the raw data buffer in preparation for + * reading a strip of raw data. If the buffer + * is specified as zero, then a buffer of appropriate + * size is allocated by the library. Otherwise, + * the client must guarantee that the buffer is + * large enough to hold any individual strip of + * raw data. + */ +int +TIFFReadBufferSetup(TIFF* tif, tdata_t bp, tsize_t size) +{ + static const char module[] = "TIFFReadBufferSetup"; + + assert((tif->tif_flags&TIFF_NOREADRAW)==0); + if (tif->tif_rawdata) { + if (tif->tif_flags & TIFF_MYBUFFER) + _TIFFfree(tif->tif_rawdata); + tif->tif_rawdata = NULL; + } + if (bp) { + tif->tif_rawdatasize = size; + tif->tif_rawdata = (tidata_t) bp; + tif->tif_flags &= ~TIFF_MYBUFFER; + } else { + tif->tif_rawdatasize = TIFFroundup(size, 1024); + tif->tif_rawdata = (tidata_t) _TIFFmalloc(tif->tif_rawdatasize); + tif->tif_flags |= TIFF_MYBUFFER; + } + if (tif->tif_rawdata == NULL) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: No space for data buffer at scanline %ld", + tif->tif_name, (long) tif->tif_row); + tif->tif_rawdatasize = 0; + return (0); + } + return (1); +} + +/* + * Set state to appear as if a + * strip has just been read in. + */ +static int +TIFFStartStrip(TIFF* tif, tstrip_t strip) +{ + TIFFDirectory *td = &tif->tif_dir; + + if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { + if (!(*tif->tif_setupdecode)(tif)) + return (0); + tif->tif_flags |= TIFF_CODERSETUP; + } + tif->tif_curstrip = strip; + tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; + if (tif->tif_flags&TIFF_NOREADRAW) + { + tif->tif_rawcp = NULL; + tif->tif_rawcc = 0; + } + else + { + tif->tif_rawcp = tif->tif_rawdata; + tif->tif_rawcc = td->td_stripbytecount[strip]; + } + return ((*tif->tif_predecode)(tif, + (tsample_t)(strip / td->td_stripsperimage))); +} + +/* + * Set state to appear as if a + * tile has just been read in. + */ +static int +TIFFStartTile(TIFF* tif, ttile_t tile) +{ + TIFFDirectory *td = &tif->tif_dir; + + if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { + if (!(*tif->tif_setupdecode)(tif)) + return (0); + tif->tif_flags |= TIFF_CODERSETUP; + } + tif->tif_curtile = tile; + tif->tif_row = + (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth)) * + td->td_tilelength; + tif->tif_col = + (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength)) * + td->td_tilewidth; + if (tif->tif_flags&TIFF_NOREADRAW) + { + tif->tif_rawcp = NULL; + tif->tif_rawcc = 0; + } + else + { + tif->tif_rawcp = tif->tif_rawdata; + tif->tif_rawcc = td->td_stripbytecount[tile]; + } + return ((*tif->tif_predecode)(tif, + (tsample_t)(tile/td->td_stripsperimage))); +} + +static int +TIFFCheckRead(TIFF* tif, int tiles) +{ + if (tif->tif_mode == O_WRONLY) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "File not open for reading"); + return (0); + } + if (tiles ^ isTiled(tif)) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, tiles ? + "Can not read tiles from a stripped image" : + "Can not read scanlines from a tiled image"); + return (0); + } + return (1); +} + +void +_TIFFNoPostDecode(TIFF* tif, tidata_t buf, tsize_t cc) +{ + (void) tif; (void) buf; (void) cc; +} + +void +_TIFFSwab16BitData(TIFF* tif, tidata_t buf, tsize_t cc) +{ + (void) tif; + assert((cc & 1) == 0); + TIFFSwabArrayOfShort((uint16*) buf, cc/2); +} + +void +_TIFFSwab24BitData(TIFF* tif, tidata_t buf, tsize_t cc) +{ + (void) tif; + assert((cc % 3) == 0); + TIFFSwabArrayOfTriples((uint8*) buf, cc/3); +} + +void +_TIFFSwab32BitData(TIFF* tif, tidata_t buf, tsize_t cc) +{ + (void) tif; + assert((cc & 3) == 0); + TIFFSwabArrayOfLong((uint32*) buf, cc/4); +} + +void +_TIFFSwab64BitData(TIFF* tif, tidata_t buf, tsize_t cc) +{ + (void) tif; + assert((cc & 7) == 0); + TIFFSwabArrayOfDouble((double*) buf, cc/8); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_stream.cxx b/src/3rdparty/libtiff/libtiff/tif_stream.cxx new file mode 100644 index 0000000000..2a2351b2ba --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_stream.cxx @@ -0,0 +1,295 @@ +/* $Id: tif_stream.cxx,v 1.6.2.1 2009-01-01 00:10:43 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1996 Sam Leffler + * Copyright (c) 1991-1996 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library UNIX-specific Routines. + */ +#include "tiffiop.h" +#include + +#ifndef __VMS +using namespace std; +#endif + +class tiffis_data +{ + public: + + istream *myIS; + long myStreamStartPos; +}; + +class tiffos_data +{ + public: + + ostream *myOS; + long myStreamStartPos; +}; + +static tsize_t +_tiffosReadProc(thandle_t, tdata_t, tsize_t) +{ + return 0; +} + +static tsize_t +_tiffisReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + tiffis_data *data = (tiffis_data *)fd; + + data->myIS->read((char *)buf, (int)size); + + return data->myIS->gcount(); +} + +static tsize_t +_tiffosWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + tiffos_data *data = (tiffos_data *)fd; + ostream *os = data->myOS; + int pos = os->tellp(); + + os->write((const char *)buf, size); + + return ((int)os->tellp()) - pos; +} + +static tsize_t +_tiffisWriteProc(thandle_t, tdata_t, tsize_t) +{ + return 0; +} + +static toff_t +_tiffosSeekProc(thandle_t fd, toff_t off, int whence) +{ + tiffos_data *data = (tiffos_data *)fd; + ostream *os = data->myOS; + + // if the stream has already failed, don't do anything + if( os->fail() ) + return os->tellp(); + + switch(whence) { + case SEEK_SET: + os->seekp(data->myStreamStartPos + off, ios::beg); + break; + case SEEK_CUR: + os->seekp(off, ios::cur); + break; + case SEEK_END: + os->seekp(off, ios::end); + break; + } + + // Attempt to workaround problems with seeking past the end of the + // stream. ofstream doesn't have a problem with this but + // ostrstream/ostringstream does. In that situation, add intermediate + // '\0' characters. + if( os->fail() ) { +#ifdef __VMS + int old_state; +#else + ios::iostate old_state; +#endif + toff_t origin=0; + + old_state = os->rdstate(); + // reset the fail bit or else tellp() won't work below + os->clear(os->rdstate() & ~ios::failbit); + switch( whence ) { + case SEEK_SET: + origin = data->myStreamStartPos; + break; + case SEEK_CUR: + origin = os->tellp(); + break; + case SEEK_END: + os->seekp(0, ios::end); + origin = os->tellp(); + break; + } + // restore original stream state + os->clear(old_state); + + // only do something if desired seek position is valid + if( origin + off > data->myStreamStartPos ) { + toff_t num_fill; + + // clear the fail bit + os->clear(os->rdstate() & ~ios::failbit); + + // extend the stream to the expected size + os->seekp(0, ios::end); + num_fill = origin + off - (toff_t)os->tellp(); + for( toff_t i = 0; i < num_fill; i++ ) + os->put('\0'); + + // retry the seek + os->seekp(origin + off, ios::beg); + } + } + + return os->tellp(); +} + +static toff_t +_tiffisSeekProc(thandle_t fd, toff_t off, int whence) +{ + tiffis_data *data = (tiffis_data *)fd; + + switch(whence) { + case SEEK_SET: + data->myIS->seekg(data->myStreamStartPos + off, ios::beg); + break; + case SEEK_CUR: + data->myIS->seekg(off, ios::cur); + break; + case SEEK_END: + data->myIS->seekg(off, ios::end); + break; + } + + return ((long)data->myIS->tellg()) - data->myStreamStartPos; +} + +static toff_t +_tiffosSizeProc(thandle_t fd) +{ + tiffos_data *data = (tiffos_data *)fd; + ostream *os = data->myOS; + toff_t pos = os->tellp(); + toff_t len; + + os->seekp(0, ios::end); + len = os->tellp(); + os->seekp(pos); + + return len; +} + +static toff_t +_tiffisSizeProc(thandle_t fd) +{ + tiffis_data *data = (tiffis_data *)fd; + int pos = data->myIS->tellg(); + int len; + + data->myIS->seekg(0, ios::end); + len = data->myIS->tellg(); + data->myIS->seekg(pos); + + return len; +} + +static int +_tiffosCloseProc(thandle_t fd) +{ + // Our stream was not allocated by us, so it shouldn't be closed by us. + delete (tiffos_data *)fd; + return 0; +} + +static int +_tiffisCloseProc(thandle_t fd) +{ + // Our stream was not allocated by us, so it shouldn't be closed by us. + delete (tiffis_data *)fd; + return 0; +} + +static int +_tiffDummyMapProc(thandle_t , tdata_t* , toff_t* ) +{ + return (0); +} + +static void +_tiffDummyUnmapProc(thandle_t , tdata_t , toff_t ) +{ +} + +/* + * Open a TIFF file descriptor for read/writing. + */ +static TIFF* +_tiffStreamOpen(const char* name, const char* mode, void *fd) +{ + TIFF* tif; + + if( strchr(mode, 'w') ) { + tiffos_data *data = new tiffos_data; + data->myOS = (ostream *)fd; + data->myStreamStartPos = data->myOS->tellp(); + + // Open for writing. + tif = TIFFClientOpen(name, mode, + (thandle_t) data, + _tiffosReadProc, _tiffosWriteProc, + _tiffosSeekProc, _tiffosCloseProc, + _tiffosSizeProc, + _tiffDummyMapProc, _tiffDummyUnmapProc); + } else { + tiffis_data *data = new tiffis_data; + data->myIS = (istream *)fd; + data->myStreamStartPos = data->myIS->tellg(); + // Open for reading. + tif = TIFFClientOpen(name, mode, + (thandle_t) data, + _tiffisReadProc, _tiffisWriteProc, + _tiffisSeekProc, _tiffisCloseProc, + _tiffisSizeProc, + _tiffDummyMapProc, _tiffDummyUnmapProc); + } + + return (tif); +} + +TIFF* +TIFFStreamOpen(const char* name, ostream *os) +{ + // If os is either a ostrstream or ostringstream, and has no data + // written to it yet, then tellp() will return -1 which will break us. + // We workaround this by writing out a dummy character and + // then seek back to the beginning. + if( !os->fail() && (int)os->tellp() < 0 ) { + *os << '\0'; + os->seekp(0); + } + + // NB: We don't support mapped files with streams so add 'm' + return _tiffStreamOpen(name, "wm", os); +} + +TIFF* +TIFFStreamOpen(const char* name, istream *is) +{ + // NB: We don't support mapped files with streams so add 'm' + return _tiffStreamOpen(name, "rm", is); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_strip.c b/src/3rdparty/libtiff/libtiff/tif_strip.c new file mode 100644 index 0000000000..962d3fa7bc --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_strip.c @@ -0,0 +1,363 @@ +/* $Id: tif_strip.c,v 1.19 2006/03/25 18:04:35 joris Exp $ */ + +/* + * Copyright (c) 1991-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Strip-organized Image Support Routines. + */ +#include "tiffiop.h" + +static uint32 +summarize(TIFF* tif, size_t summand1, size_t summand2, const char* where) +{ + /* + * XXX: We are using casting to uint32 here, bacause sizeof(size_t) + * may be larger than sizeof(uint32) on 64-bit architectures. + */ + uint32 bytes = summand1 + summand2; + + if (bytes - summand1 != summand2) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Integer overflow in %s", where); + bytes = 0; + } + + return (bytes); +} + +static uint32 +multiply(TIFF* tif, size_t nmemb, size_t elem_size, const char* where) +{ + uint32 bytes = nmemb * elem_size; + + if (elem_size && bytes / elem_size != nmemb) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Integer overflow in %s", where); + bytes = 0; + } + + return (bytes); +} + +/* + * Compute which strip a (row,sample) value is in. + */ +tstrip_t +TIFFComputeStrip(TIFF* tif, uint32 row, tsample_t sample) +{ + TIFFDirectory *td = &tif->tif_dir; + tstrip_t strip; + + strip = row / td->td_rowsperstrip; + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { + if (sample >= td->td_samplesperpixel) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Sample out of range, max %lu", + (unsigned long) sample, (unsigned long) td->td_samplesperpixel); + return ((tstrip_t) 0); + } + strip += sample*td->td_stripsperimage; + } + return (strip); +} + +/* + * Compute how many strips are in an image. + */ +tstrip_t +TIFFNumberOfStrips(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + tstrip_t nstrips; + + nstrips = (td->td_rowsperstrip == (uint32) -1 ? 1 : + TIFFhowmany(td->td_imagelength, td->td_rowsperstrip)); + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) + nstrips = multiply(tif, nstrips, td->td_samplesperpixel, + "TIFFNumberOfStrips"); + return (nstrips); +} + +/* + * Compute the # bytes in a variable height, row-aligned strip. + */ +tsize_t +TIFFVStripSize(TIFF* tif, uint32 nrows) +{ + TIFFDirectory *td = &tif->tif_dir; + + if (nrows == (uint32) -1) + nrows = td->td_imagelength; + if (td->td_planarconfig == PLANARCONFIG_CONTIG && + td->td_photometric == PHOTOMETRIC_YCBCR && + !isUpSampled(tif)) { + /* + * Packed YCbCr data contain one Cb+Cr for every + * HorizontalSampling*VerticalSampling Y values. + * Must also roundup width and height when calculating + * since images that are not a multiple of the + * horizontal/vertical subsampling area include + * YCbCr data for the extended image. + */ + uint16 ycbcrsubsampling[2]; + tsize_t w, scanline, samplingarea; + + TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING, + ycbcrsubsampling + 0, + ycbcrsubsampling + 1 ); + + samplingarea = ycbcrsubsampling[0]*ycbcrsubsampling[1]; + if (samplingarea == 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Invalid YCbCr subsampling"); + return 0; + } + + w = TIFFroundup(td->td_imagewidth, ycbcrsubsampling[0]); + scanline = TIFFhowmany8(multiply(tif, w, td->td_bitspersample, + "TIFFVStripSize")); + nrows = TIFFroundup(nrows, ycbcrsubsampling[1]); + /* NB: don't need TIFFhowmany here 'cuz everything is rounded */ + scanline = multiply(tif, nrows, scanline, "TIFFVStripSize"); + return ((tsize_t) + summarize(tif, scanline, + multiply(tif, 2, scanline / samplingarea, + "TIFFVStripSize"), "TIFFVStripSize")); + } else + return ((tsize_t) multiply(tif, nrows, TIFFScanlineSize(tif), + "TIFFVStripSize")); +} + + +/* + * Compute the # bytes in a raw strip. + */ +tsize_t +TIFFRawStripSize(TIFF* tif, tstrip_t strip) +{ + TIFFDirectory* td = &tif->tif_dir; + tsize_t bytecount = td->td_stripbytecount[strip]; + + if (bytecount <= 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Invalid strip byte count, strip %lu", + (unsigned long) bytecount, (unsigned long) strip); + bytecount = (tsize_t) -1; + } + + return bytecount; +} + +/* + * Compute the # bytes in a (row-aligned) strip. + * + * Note that if RowsPerStrip is larger than the + * recorded ImageLength, then the strip size is + * truncated to reflect the actual space required + * to hold the strip. + */ +tsize_t +TIFFStripSize(TIFF* tif) +{ + TIFFDirectory* td = &tif->tif_dir; + uint32 rps = td->td_rowsperstrip; + if (rps > td->td_imagelength) + rps = td->td_imagelength; + return (TIFFVStripSize(tif, rps)); +} + +/* + * Compute a default strip size based on the image + * characteristics and a requested value. If the + * request is <1 then we choose a strip size according + * to certain heuristics. + */ +uint32 +TIFFDefaultStripSize(TIFF* tif, uint32 request) +{ + return (*tif->tif_defstripsize)(tif, request); +} + +uint32 +_TIFFDefaultStripSize(TIFF* tif, uint32 s) +{ + if ((int32) s < 1) { + /* + * If RowsPerStrip is unspecified, try to break the + * image up into strips that are approximately + * STRIP_SIZE_DEFAULT bytes long. + */ + tsize_t scanline = TIFFScanlineSize(tif); + s = (uint32)STRIP_SIZE_DEFAULT / (scanline == 0 ? 1 : scanline); + if (s == 0) /* very wide images */ + s = 1; + } + return (s); +} + +/* + * Return the number of bytes to read/write in a call to + * one of the scanline-oriented i/o routines. Note that + * this number may be 1/samples-per-pixel if data is + * stored as separate planes. + */ +tsize_t +TIFFScanlineSize(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + tsize_t scanline; + + if (td->td_planarconfig == PLANARCONFIG_CONTIG) { + if (td->td_photometric == PHOTOMETRIC_YCBCR + && !isUpSampled(tif)) { + uint16 ycbcrsubsampling[2]; + + TIFFGetField(tif, TIFFTAG_YCBCRSUBSAMPLING, + ycbcrsubsampling + 0, + ycbcrsubsampling + 1); + + if (ycbcrsubsampling[0] == 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Invalid YCbCr subsampling"); + return 0; + } + + scanline = TIFFroundup(td->td_imagewidth, + ycbcrsubsampling[0]); + scanline = TIFFhowmany8(multiply(tif, scanline, + td->td_bitspersample, + "TIFFScanlineSize")); + return ((tsize_t) + summarize(tif, scanline, + multiply(tif, 2, + scanline / ycbcrsubsampling[0], + "TIFFVStripSize"), + "TIFFVStripSize")); + } else { + scanline = multiply(tif, td->td_imagewidth, + td->td_samplesperpixel, + "TIFFScanlineSize"); + } + } else + scanline = td->td_imagewidth; + return ((tsize_t) TIFFhowmany8(multiply(tif, scanline, + td->td_bitspersample, + "TIFFScanlineSize"))); +} + +/* + * Some stuff depends on this older version of TIFFScanlineSize + * TODO: resolve this + */ +tsize_t +TIFFOldScanlineSize(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + tsize_t scanline; + + scanline = multiply (tif, td->td_bitspersample, td->td_imagewidth, + "TIFFScanlineSize"); + if (td->td_planarconfig == PLANARCONFIG_CONTIG) + scanline = multiply (tif, scanline, td->td_samplesperpixel, + "TIFFScanlineSize"); + return ((tsize_t) TIFFhowmany8(scanline)); +} + +/* + * Return the number of bytes to read/write in a call to + * one of the scanline-oriented i/o routines. Note that + * this number may be 1/samples-per-pixel if data is + * stored as separate planes. + * The ScanlineSize in case of YCbCrSubsampling is defined as the + * strip size divided by the strip height, i.e. the size of a pack of vertical + * subsampling lines divided by vertical subsampling. It should thus make + * sense when multiplied by a multiple of vertical subsampling. + * Some stuff depends on this newer version of TIFFScanlineSize + * TODO: resolve this + */ +tsize_t +TIFFNewScanlineSize(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + tsize_t scanline; + + if (td->td_planarconfig == PLANARCONFIG_CONTIG) { + if (td->td_photometric == PHOTOMETRIC_YCBCR + && !isUpSampled(tif)) { + uint16 ycbcrsubsampling[2]; + + TIFFGetField(tif, TIFFTAG_YCBCRSUBSAMPLING, + ycbcrsubsampling + 0, + ycbcrsubsampling + 1); + + if (ycbcrsubsampling[0]*ycbcrsubsampling[1] == 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Invalid YCbCr subsampling"); + return 0; + } + + return((tsize_t) ((((td->td_imagewidth+ycbcrsubsampling[0]-1) + /ycbcrsubsampling[0]) + *(ycbcrsubsampling[0]*ycbcrsubsampling[1]+2) + *td->td_bitspersample+7) + /8)/ycbcrsubsampling[1]); + + } else { + scanline = multiply(tif, td->td_imagewidth, + td->td_samplesperpixel, + "TIFFScanlineSize"); + } + } else + scanline = td->td_imagewidth; + return ((tsize_t) TIFFhowmany8(multiply(tif, scanline, + td->td_bitspersample, + "TIFFScanlineSize"))); +} + +/* + * Return the number of bytes required to store a complete + * decoded and packed raster scanline (as opposed to the + * I/O size returned by TIFFScanlineSize which may be less + * if data is store as separate planes). + */ +tsize_t +TIFFRasterScanlineSize(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + tsize_t scanline; + + scanline = multiply (tif, td->td_bitspersample, td->td_imagewidth, + "TIFFRasterScanlineSize"); + if (td->td_planarconfig == PLANARCONFIG_CONTIG) { + scanline = multiply (tif, scanline, td->td_samplesperpixel, + "TIFFRasterScanlineSize"); + return ((tsize_t) TIFFhowmany8(scanline)); + } else + return ((tsize_t) multiply (tif, TIFFhowmany8(scanline), + td->td_samplesperpixel, + "TIFFRasterScanlineSize")); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_swab.c b/src/3rdparty/libtiff/libtiff/tif_swab.c new file mode 100644 index 0000000000..97cc88825c --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_swab.c @@ -0,0 +1,235 @@ +/* $Id: tif_swab.c,v 1.4 2005/04/13 14:06:21 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library Bit & Byte Swapping Support. + * + * XXX We assume short = 16-bits and long = 32-bits XXX + */ +#include "tiffiop.h" + +#ifndef TIFFSwabShort +void +TIFFSwabShort(uint16* wp) +{ + register unsigned char* cp = (unsigned char*) wp; + unsigned char t; + + t = cp[1]; cp[1] = cp[0]; cp[0] = t; +} +#endif + +#ifndef TIFFSwabLong +void +TIFFSwabLong(uint32* lp) +{ + register unsigned char* cp = (unsigned char*) lp; + unsigned char t; + + t = cp[3]; cp[3] = cp[0]; cp[0] = t; + t = cp[2]; cp[2] = cp[1]; cp[1] = t; +} +#endif + +#ifndef TIFFSwabArrayOfShort +void +TIFFSwabArrayOfShort(uint16* wp, register unsigned long n) +{ + register unsigned char* cp; + register unsigned char t; + + /* XXX unroll loop some */ + while (n-- > 0) { + cp = (unsigned char*) wp; + t = cp[1]; cp[1] = cp[0]; cp[0] = t; + wp++; + } +} +#endif + +#ifndef TIFFSwabArrayOfTriples +void +TIFFSwabArrayOfTriples(uint8* tp, unsigned long n) +{ + unsigned char* cp; + unsigned char t; + + /* XXX unroll loop some */ + while (n-- > 0) { + cp = (unsigned char*) tp; + t = cp[2]; cp[2] = cp[0]; cp[0] = t; + tp += 3; + } +} +#endif + +#ifndef TIFFSwabArrayOfLong +void +TIFFSwabArrayOfLong(register uint32* lp, register unsigned long n) +{ + register unsigned char *cp; + register unsigned char t; + + /* XXX unroll loop some */ + while (n-- > 0) { + cp = (unsigned char *)lp; + t = cp[3]; cp[3] = cp[0]; cp[0] = t; + t = cp[2]; cp[2] = cp[1]; cp[1] = t; + lp++; + } +} +#endif + +#ifndef TIFFSwabDouble +void +TIFFSwabDouble(double *dp) +{ + register uint32* lp = (uint32*) dp; + uint32 t; + + TIFFSwabArrayOfLong(lp, 2); + t = lp[0]; lp[0] = lp[1]; lp[1] = t; +} +#endif + +#ifndef TIFFSwabArrayOfDouble +void +TIFFSwabArrayOfDouble(double* dp, register unsigned long n) +{ + register uint32* lp = (uint32*) dp; + register uint32 t; + + TIFFSwabArrayOfLong(lp, n + n); + while (n-- > 0) { + t = lp[0]; lp[0] = lp[1]; lp[1] = t; + lp += 2; + } +} +#endif + +/* + * Bit reversal tables. TIFFBitRevTable[] gives + * the bit reversed value of . Used in various + * places in the library when the FillOrder requires + * bit reversal of byte values (e.g. CCITT Fax 3 + * encoding/decoding). TIFFNoBitRevTable is provided + * for algorithms that want an equivalent table that + * do not reverse bit values. + */ +static const unsigned char TIFFBitRevTable[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 const unsigned char TIFFNoBitRevTable[256] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 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, + 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, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, +}; + +const unsigned char* +TIFFGetBitRevTable(int reversed) +{ + return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable); +} + +void +TIFFReverseBits(register unsigned char* cp, register unsigned long n) +{ + for (; n > 8; n -= 8) { + cp[0] = TIFFBitRevTable[cp[0]]; + cp[1] = TIFFBitRevTable[cp[1]]; + cp[2] = TIFFBitRevTable[cp[2]]; + cp[3] = TIFFBitRevTable[cp[3]]; + cp[4] = TIFFBitRevTable[cp[4]]; + cp[5] = TIFFBitRevTable[cp[5]]; + cp[6] = TIFFBitRevTable[cp[6]]; + cp[7] = TIFFBitRevTable[cp[7]]; + cp += 8; + } + while (n-- > 0) + *cp = TIFFBitRevTable[*cp], cp++; +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_thunder.c b/src/3rdparty/libtiff/libtiff/tif_thunder.c new file mode 100644 index 0000000000..94496eccb1 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_thunder.c @@ -0,0 +1,158 @@ +/* $Id: tif_thunder.c,v 1.5 2005/12/21 12:23:13 joris Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "tiffiop.h" +#ifdef THUNDER_SUPPORT +/* + * TIFF Library. + * + * ThunderScan 4-bit Compression Algorithm Support + */ + +/* + * ThunderScan uses an encoding scheme designed for + * 4-bit pixel values. Data is encoded in bytes, with + * each byte split into a 2-bit code word and a 6-bit + * data value. The encoding gives raw data, runs of + * pixels, or pixel values encoded as a delta from the + * previous pixel value. For the latter, either 2-bit + * or 3-bit delta values are used, with the deltas packed + * into a single byte. + */ +#define THUNDER_DATA 0x3f /* mask for 6-bit data */ +#define THUNDER_CODE 0xc0 /* mask for 2-bit code word */ +/* code values */ +#define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */ +#define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */ +#define DELTA2_SKIP 2 /* skip code for 2-bit deltas */ +#define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */ +#define DELTA3_SKIP 4 /* skip code for 3-bit deltas */ +#define THUNDER_RAW 0xc0 /* raw data encoded */ + +static const int twobitdeltas[4] = { 0, 1, 0, -1 }; +static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 }; + +#define SETPIXEL(op, v) { \ + lastpixel = (v) & 0xf; \ + if (npixels++ & 1) \ + *op++ |= lastpixel; \ + else \ + op[0] = (tidataval_t) (lastpixel << 4); \ +} + +static int +ThunderDecode(TIFF* tif, tidata_t op, tsize_t maxpixels) +{ + register unsigned char *bp; + register tsize_t cc; + unsigned int lastpixel; + tsize_t npixels; + + bp = (unsigned char *)tif->tif_rawcp; + cc = tif->tif_rawcc; + lastpixel = 0; + npixels = 0; + while (cc > 0 && npixels < maxpixels) { + int n, delta; + + n = *bp++, cc--; + switch (n & THUNDER_CODE) { + case THUNDER_RUN: /* pixel run */ + /* + * Replicate the last pixel n times, + * where n is the lower-order 6 bits. + */ + if (npixels & 1) { + op[0] |= lastpixel; + lastpixel = *op++; npixels++; n--; + } else + lastpixel |= lastpixel << 4; + npixels += n; + if (npixels < maxpixels) { + for (; n > 0; n -= 2) + *op++ = (tidataval_t) lastpixel; + } + if (n == -1) + *--op &= 0xf0; + lastpixel &= 0xf; + break; + case THUNDER_2BITDELTAS: /* 2-bit deltas */ + if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP) + SETPIXEL(op, lastpixel + twobitdeltas[delta]); + if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP) + SETPIXEL(op, lastpixel + twobitdeltas[delta]); + if ((delta = (n & 3)) != DELTA2_SKIP) + SETPIXEL(op, lastpixel + twobitdeltas[delta]); + break; + case THUNDER_3BITDELTAS: /* 3-bit deltas */ + if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP) + SETPIXEL(op, lastpixel + threebitdeltas[delta]); + if ((delta = (n & 7)) != DELTA3_SKIP) + SETPIXEL(op, lastpixel + threebitdeltas[delta]); + break; + case THUNDER_RAW: /* raw data */ + SETPIXEL(op, n); + break; + } + } + tif->tif_rawcp = (tidata_t) bp; + tif->tif_rawcc = cc; + if (npixels != maxpixels) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "ThunderDecode: %s data at scanline %ld (%lu != %lu)", + npixels < maxpixels ? "Not enough" : "Too much", + (long) tif->tif_row, (long) npixels, (long) maxpixels); + return (0); + } + return (1); +} + +static int +ThunderDecodeRow(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) +{ + tidata_t row = buf; + + (void) s; + while ((long)occ > 0) { + if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth)) + return (0); + occ -= tif->tif_scanlinesize; + row += tif->tif_scanlinesize; + } + return (1); +} + +int +TIFFInitThunderScan(TIFF* tif, int scheme) +{ + (void) scheme; + tif->tif_decoderow = ThunderDecodeRow; + tif->tif_decodestrip = ThunderDecodeRow; + return (1); +} +#endif /* THUNDER_SUPPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_tile.c b/src/3rdparty/libtiff/libtiff/tif_tile.c new file mode 100644 index 0000000000..454fe5cd24 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_tile.c @@ -0,0 +1,273 @@ +/* $Id: tif_tile.c,v 1.12 2006/02/09 16:15:43 dron Exp $ */ + +/* + * Copyright (c) 1991-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Tiled Image Support Routines. + */ +#include "tiffiop.h" + +static uint32 +summarize(TIFF* tif, size_t summand1, size_t summand2, const char* where) +{ + /* + * XXX: We are using casting to uint32 here, because sizeof(size_t) + * may be larger than sizeof(uint32) on 64-bit architectures. + */ + uint32 bytes = summand1 + summand2; + + if (bytes - summand1 != summand2) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Integer overflow in %s", where); + bytes = 0; + } + + return (bytes); +} + +static uint32 +multiply(TIFF* tif, size_t nmemb, size_t elem_size, const char* where) +{ + uint32 bytes = nmemb * elem_size; + + if (elem_size && bytes / elem_size != nmemb) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Integer overflow in %s", where); + bytes = 0; + } + + return (bytes); +} + +/* + * Compute which tile an (x,y,z,s) value is in. + */ +ttile_t +TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s) +{ + TIFFDirectory *td = &tif->tif_dir; + uint32 dx = td->td_tilewidth; + uint32 dy = td->td_tilelength; + uint32 dz = td->td_tiledepth; + ttile_t tile = 1; + + if (td->td_imagedepth == 1) + z = 0; + if (dx == (uint32) -1) + dx = td->td_imagewidth; + if (dy == (uint32) -1) + dy = td->td_imagelength; + if (dz == (uint32) -1) + dz = td->td_imagedepth; + if (dx != 0 && dy != 0 && dz != 0) { + uint32 xpt = TIFFhowmany(td->td_imagewidth, dx); + uint32 ypt = TIFFhowmany(td->td_imagelength, dy); + uint32 zpt = TIFFhowmany(td->td_imagedepth, dz); + + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) + tile = (xpt*ypt*zpt)*s + + (xpt*ypt)*(z/dz) + + xpt*(y/dy) + + x/dx; + else + tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx; + } + return (tile); +} + +/* + * Check an (x,y,z,s) coordinate + * against the image bounds. + */ +int +TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s) +{ + TIFFDirectory *td = &tif->tif_dir; + + if (x >= td->td_imagewidth) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Col out of range, max %lu", + (unsigned long) x, + (unsigned long) (td->td_imagewidth - 1)); + return (0); + } + if (y >= td->td_imagelength) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Row out of range, max %lu", + (unsigned long) y, + (unsigned long) (td->td_imagelength - 1)); + return (0); + } + if (z >= td->td_imagedepth) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Depth out of range, max %lu", + (unsigned long) z, + (unsigned long) (td->td_imagedepth - 1)); + return (0); + } + if (td->td_planarconfig == PLANARCONFIG_SEPARATE && + s >= td->td_samplesperpixel) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%lu: Sample out of range, max %lu", + (unsigned long) s, + (unsigned long) (td->td_samplesperpixel - 1)); + return (0); + } + return (1); +} + +/* + * Compute how many tiles are in an image. + */ +ttile_t +TIFFNumberOfTiles(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + uint32 dx = td->td_tilewidth; + uint32 dy = td->td_tilelength; + uint32 dz = td->td_tiledepth; + ttile_t ntiles; + + if (dx == (uint32) -1) + dx = td->td_imagewidth; + if (dy == (uint32) -1) + dy = td->td_imagelength; + if (dz == (uint32) -1) + dz = td->td_imagedepth; + ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 : + multiply(tif, multiply(tif, TIFFhowmany(td->td_imagewidth, dx), + TIFFhowmany(td->td_imagelength, dy), + "TIFFNumberOfTiles"), + TIFFhowmany(td->td_imagedepth, dz), "TIFFNumberOfTiles"); + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) + ntiles = multiply(tif, ntiles, td->td_samplesperpixel, + "TIFFNumberOfTiles"); + return (ntiles); +} + +/* + * Compute the # bytes in each row of a tile. + */ +tsize_t +TIFFTileRowSize(TIFF* tif) +{ + TIFFDirectory *td = &tif->tif_dir; + tsize_t rowsize; + + if (td->td_tilelength == 0 || td->td_tilewidth == 0) + return ((tsize_t) 0); + rowsize = multiply(tif, td->td_bitspersample, td->td_tilewidth, + "TIFFTileRowSize"); + if (td->td_planarconfig == PLANARCONFIG_CONTIG) + rowsize = multiply(tif, rowsize, td->td_samplesperpixel, + "TIFFTileRowSize"); + return ((tsize_t) TIFFhowmany8(rowsize)); +} + +/* + * Compute the # bytes in a variable length, row-aligned tile. + */ +tsize_t +TIFFVTileSize(TIFF* tif, uint32 nrows) +{ + TIFFDirectory *td = &tif->tif_dir; + tsize_t tilesize; + + if (td->td_tilelength == 0 || td->td_tilewidth == 0 || + td->td_tiledepth == 0) + return ((tsize_t) 0); + if (td->td_planarconfig == PLANARCONFIG_CONTIG && + td->td_photometric == PHOTOMETRIC_YCBCR && + !isUpSampled(tif)) { + /* + * Packed YCbCr data contain one Cb+Cr for every + * HorizontalSampling*VerticalSampling Y values. + * Must also roundup width and height when calculating + * since images that are not a multiple of the + * horizontal/vertical subsampling area include + * YCbCr data for the extended image. + */ + tsize_t w = + TIFFroundup(td->td_tilewidth, td->td_ycbcrsubsampling[0]); + tsize_t rowsize = + TIFFhowmany8(multiply(tif, w, td->td_bitspersample, + "TIFFVTileSize")); + tsize_t samplingarea = + td->td_ycbcrsubsampling[0]*td->td_ycbcrsubsampling[1]; + if (samplingarea == 0) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Invalid YCbCr subsampling"); + return 0; + } + nrows = TIFFroundup(nrows, td->td_ycbcrsubsampling[1]); + /* NB: don't need TIFFhowmany here 'cuz everything is rounded */ + tilesize = multiply(tif, nrows, rowsize, "TIFFVTileSize"); + tilesize = summarize(tif, tilesize, + multiply(tif, 2, tilesize / samplingarea, + "TIFFVTileSize"), + "TIFFVTileSize"); + } else + tilesize = multiply(tif, nrows, TIFFTileRowSize(tif), + "TIFFVTileSize"); + return ((tsize_t) + multiply(tif, tilesize, td->td_tiledepth, "TIFFVTileSize")); +} + +/* + * Compute the # bytes in a row-aligned tile. + */ +tsize_t +TIFFTileSize(TIFF* tif) +{ + return (TIFFVTileSize(tif, tif->tif_dir.td_tilelength)); +} + +/* + * Compute a default tile size based on the image + * characteristics and a requested value. If a + * request is <1 then we choose a size according + * to certain heuristics. + */ +void +TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) +{ + (*tif->tif_deftilesize)(tif, tw, th); +} + +void +_TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) +{ + (void) tif; + if (*(int32*) tw < 1) + *tw = 256; + if (*(int32*) th < 1) + *th = 256; + /* roundup to a multiple of 16 per the spec */ + if (*tw & 0xf) + *tw = TIFFroundup(*tw, 16); + if (*th & 0xf) + *th = TIFFroundup(*th, 16); +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_unix.c b/src/3rdparty/libtiff/libtiff/tif_unix.c new file mode 100644 index 0000000000..2c3bf7d33c --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_unix.c @@ -0,0 +1,293 @@ +/* $Id: tif_unix.c,v 1.12 2006/03/21 16:37:51 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library UNIX-specific Routines. These are should also work with the + * Windows Common RunTime Library. + */ +#include "tif_config.h" + +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifdef HAVE_FCNTL_H +# include +#endif + +#ifdef HAVE_IO_H +# include +#endif + +#include "tiffiop.h" + +static tsize_t +_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return ((tsize_t) read((int) fd, buf, (size_t) size)); +} + +static tsize_t +_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return ((tsize_t) write((int) fd, buf, (size_t) size)); +} + +static toff_t +_tiffSeekProc(thandle_t fd, toff_t off, int whence) +{ + return ((toff_t) lseek((int) fd, (off_t) off, whence)); +} + +static int +_tiffCloseProc(thandle_t fd) +{ + return (close((int) fd)); +} + + +static toff_t +_tiffSizeProc(thandle_t fd) +{ +#ifdef _AM29K + long fsize; + return ((fsize = lseek((int) fd, 0, SEEK_END)) < 0 ? 0 : fsize); +#else + struct stat sb; + return (toff_t) (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size); +#endif +} + +#ifdef HAVE_MMAP +#include + +static int +_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + toff_t size = _tiffSizeProc(fd); + if (size != (toff_t) -1) { + *pbase = (tdata_t) + mmap(0, size, PROT_READ, MAP_SHARED, (int) fd, 0); + if (*pbase != (tdata_t) -1) { + *psize = size; + return (1); + } + } + return (0); +} + +static void +_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ + (void) fd; + (void) munmap(base, (off_t) size); +} +#else /* !HAVE_MMAP */ +static int +_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + (void) fd; (void) pbase; (void) psize; + return (0); +} + +static void +_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ + (void) fd; (void) base; (void) size; +} +#endif /* !HAVE_MMAP */ + +/* + * Open a TIFF file descriptor for read/writing. + */ +TIFF* +TIFFFdOpen(int fd, const char* name, const char* mode) +{ + TIFF* tif; + + tif = TIFFClientOpen(name, mode, + (thandle_t) fd, + _tiffReadProc, _tiffWriteProc, + _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, + _tiffMapProc, _tiffUnmapProc); + if (tif) + tif->tif_fd = fd; + return (tif); +} + +/* + * Open a TIFF file for read/writing. + */ +TIFF* +TIFFOpen(const char* name, const char* mode) +{ + static const char module[] = "TIFFOpen"; + int m, fd; + TIFF* tif; + + m = _TIFFgetMode(mode, module); + if (m == -1) + return ((TIFF*)0); + +/* for cygwin and mingw */ +#ifdef O_BINARY + m |= O_BINARY; +#endif + +#ifdef _AM29K + fd = open(name, m); +#else + fd = open(name, m, 0666); +#endif + if (fd < 0) { + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF *)0); + } + + tif = TIFFFdOpen((int)fd, name, mode); + if(!tif) + close(fd); + return tif; +} + +#if defined (__WIN32__) && !defined(__SYMBIAN32__) +#include +/* + * Open a TIFF file with a Unicode filename, for read/writing. + */ +TIFF* +TIFFOpenW(const wchar_t* name, const char* mode) +{ + static const char module[] = "TIFFOpenW"; + int m, fd; + int mbsize; + char *mbname; + TIFF* tif; + + m = _TIFFgetMode(mode, module); + if (m == -1) + return ((TIFF*)0); + +/* for cygwin and mingw */ +#ifdef O_BINARY + m |= O_BINARY; +#endif + + fd = _wopen(name, m, 0666); + if (fd < 0) { + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF *)0); + } + + mbname = NULL; + mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL); + if (mbsize > 0) { + mbname = _TIFFmalloc(mbsize); + if (!mbname) { + TIFFErrorExt(0, module, + "Can't allocate space for filename conversion buffer"); + return ((TIFF*)0); + } + + WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, + NULL, NULL); + } + + tif = TIFFFdOpen((int)fd, (mbname != NULL) ? mbname : "", + mode); + + _TIFFfree(mbname); + + if(!tif) + close(fd); + return tif; +} +#endif + +void* +_TIFFmalloc(tsize_t s) +{ + return (malloc((size_t) s)); +} + +void +_TIFFfree(tdata_t p) +{ + free(p); +} + +void* +_TIFFrealloc(tdata_t p, tsize_t s) +{ + return (realloc(p, (size_t) s)); +} + +void +_TIFFmemset(tdata_t p, int v, tsize_t c) +{ + memset(p, v, (size_t) c); +} + +void +_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c) +{ + memcpy(d, s, (size_t) c); +} + +int +_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) +{ + return (memcmp(p1, p2, (size_t) c)); +} + +static void +unixWarningHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + fprintf(stderr, "%s: ", module); + fprintf(stderr, "Warning, "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler; + +static void +unixErrorHandler(const char* module, const char* fmt, va_list ap) +{ + if (module != NULL) + fprintf(stderr, "%s: ", module); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +} +TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler; diff --git a/src/3rdparty/libtiff/libtiff/tif_version.c b/src/3rdparty/libtiff/libtiff/tif_version.c new file mode 100644 index 0000000000..1264b71591 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_version.c @@ -0,0 +1,33 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_version.c,v 1.2 2000/11/13 14:42:38 warmerda Exp $ */ +/* + * Copyright (c) 1992-1997 Sam Leffler + * Copyright (c) 1992-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ +#include "tiffiop.h" + +static const char TIFFVersion[] = TIFFLIB_VERSION_STR; + +const char* +TIFFGetVersion(void) +{ + return (TIFFVersion); +} diff --git a/src/3rdparty/libtiff/libtiff/tif_warning.c b/src/3rdparty/libtiff/libtiff/tif_warning.c new file mode 100644 index 0000000000..d593469d2d --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_warning.c @@ -0,0 +1,74 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_warning.c,v 1.2 2005/12/23 01:18:59 joris Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + */ +#include "tiffiop.h" + +TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL; + +TIFFErrorHandler +TIFFSetWarningHandler(TIFFErrorHandler handler) +{ + TIFFErrorHandler prev = _TIFFwarningHandler; + _TIFFwarningHandler = handler; + return (prev); +} + +TIFFErrorHandlerExt +TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler) +{ + TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt; + _TIFFwarningHandlerExt = handler; + return (prev); +} + +void +TIFFWarning(const char* module, const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + if (_TIFFwarningHandler) + (*_TIFFwarningHandler)(module, fmt, ap); + if (_TIFFwarningHandlerExt) + (*_TIFFwarningHandlerExt)(0, module, fmt, ap); + va_end(ap); +} + +void +TIFFWarningExt(thandle_t fd, const char* module, const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + if (_TIFFwarningHandler) + (*_TIFFwarningHandler)(module, fmt, ap); + if (_TIFFwarningHandlerExt) + (*_TIFFwarningHandlerExt)(fd, module, fmt, ap); + va_end(ap); +} + + diff --git a/src/3rdparty/libtiff/libtiff/tif_win3.c b/src/3rdparty/libtiff/libtiff/tif_win3.c new file mode 100644 index 0000000000..b16b214da3 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_win3.c @@ -0,0 +1,225 @@ +/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_win3.c,v 1.2 2005/12/21 12:23:13 joris Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library Windows 3.x-specific Routines. + */ +#include "tiffiop.h" +#if defined(__WATCOMC__) || defined(__BORLANDC__) || defined(_MSC_VER) +#include /* for open, close, etc. function prototypes */ +#endif + +#include +#include +#include + +static tsize_t +_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return (_hread(fd, buf, size)); +} + +static tsize_t +_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + return (_hwrite(fd, buf, size)); +} + +static toff_t +_tiffSeekProc(thandle_t fd, toff_t off, int whence) +{ + return (_llseek(fd, (off_t) off, whence)); +} + +static int +_tiffCloseProc(thandle_t fd) +{ + return (_lclose(fd)); +} + +#include + +static toff_t +_tiffSizeProc(thandle_t fd) +{ + struct stat sb; + return (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size); +} + +static int +_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + return (0); +} + +static void +_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ +} + +/* + * Open a TIFF file descriptor for read/writing. + */ +TIFF* +TIFFFdOpen(int fd, const char* name, const char* mode) +{ + TIFF* tif; + + tif = TIFFClientOpen(name, mode, + (thandle_t) fd, + _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, + _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); + if (tif) + tif->tif_fd = fd; + return (tif); +} + +/* + * Open a TIFF file for read/writing. + */ +TIFF* +TIFFOpen(const char* name, const char* mode) +{ + static const char module[] = "TIFFOpen"; + int m, fd; + OFSTRUCT of; + int mm = 0; + + m = _TIFFgetMode(mode, module); + if (m == -1) + return ((TIFF*)0); + if (m & O_CREAT) { + if ((m & O_TRUNC) || OpenFile(name, &of, OF_EXIST) != HFILE_ERROR) + mm |= OF_CREATE; + } + if (m & O_WRONLY) + mm |= OF_WRITE; + if (m & O_RDWR) + mm |= OF_READWRITE; + fd = OpenFile(name, &of, mm); + if (fd < 0) { + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF*)0); + } + return (TIFFFdOpen(fd, name, mode)); +} + +tdata_t +_TIFFmalloc(tsize_t s) +{ + return (tdata_t) GlobalAllocPtr(GHND, (DWORD) s); +} + +void +_TIFFfree(tdata_t p) +{ + GlobalFreePtr(p); +} + +tdata_t +_TIFFrealloc(tdata_t p, tsize_t s) +{ + return (tdata_t) GlobalReAllocPtr(p, (DWORD) s, GHND); +} + +void +_TIFFmemset(tdata_t p, int v, tsize_t c) +{ + char* pp = (char*) p; + + while (c > 0) { + tsize_t chunk = 0x10000 - ((uint32) pp & 0xffff);/* What's left in segment */ + if (chunk > 0xff00) /* No more than 0xff00 */ + chunk = 0xff00; + if (chunk > c) /* No more than needed */ + chunk = c; + memset(pp, v, chunk); + pp = (char*) (chunk + (char huge*) pp); + c -= chunk; + } +} + +void +_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c) +{ + if (c > 0xFFFF) + hmemcpy((void _huge*) d, (void _huge*) s, c); + else + (void) memcpy(d, s, (size_t) c); +} + +int +_TIFFmemcmp(const tdata_t d, const tdata_t s, tsize_t c) +{ + char* dd = (char*) d; + char* ss = (char*) s; + tsize_t chunks, chunkd, chunk; + int result; + + while (c > 0) { + chunks = 0x10000 - ((uint32) ss & 0xffff); /* What's left in segment */ + chunkd = 0x10000 - ((uint32) dd & 0xffff); /* What's left in segment */ + chunk = c; /* Get the largest of */ + if (chunk > chunks) /* c, chunks, chunkd, */ + chunk = chunks; /* 0xff00 */ + if (chunk > chunkd) + chunk = chunkd; + if (chunk > 0xff00) + chunk = 0xff00; + result = memcmp(dd, ss, chunk); + if (result != 0) + return (result); + dd = (char*) (chunk + (char huge*) dd); + ss = (char*) (chunk + (char huge*) ss); + c -= chunk; + } + return (0); +} + +static void +win3WarningHandler(const char* module, const char* fmt, va_list ap) +{ + char e[512] = { '\0' }; + if (module != NULL) + strcat(strcpy(e, module), ":"); + vsprintf(e+strlen(e), fmt, ap); + strcat(e, "."); + MessageBox(GetActiveWindow(), e, "LibTIFF Warning", + MB_OK|MB_ICONEXCLAMATION); +} +TIFFErrorHandler _TIFFwarningHandler = win3WarningHandler; + +static void +win3ErrorHandler(const char* module, const char* fmt, va_list ap) +{ + char e[512] = { '\0' }; + if (module != NULL) + strcat(strcpy(e, module), ":"); + vsprintf(e+strlen(e), fmt, ap); + strcat(e, "."); + MessageBox(GetActiveWindow(), e, "LibTIFF Error", MB_OK|MB_ICONSTOP); +} +TIFFErrorHandler _TIFFerrorHandler = win3ErrorHandler; diff --git a/src/3rdparty/libtiff/libtiff/tif_win32.c b/src/3rdparty/libtiff/libtiff/tif_win32.c new file mode 100644 index 0000000000..d7f33de374 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_win32.c @@ -0,0 +1,402 @@ +/* $Id: tif_win32.c,v 1.21 2007/03/07 17:10:31 joris Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library Win32-specific Routines. Adapted from tif_unix.c 4/5/95 by + * Scott Wagner (wagner@itek.com), Itek Graphix, Rochester, NY USA + */ +#include "tiffiop.h" +#include + +#include + +static tsize_t +_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + DWORD dwSizeRead; + if (!ReadFile(fd, buf, size, &dwSizeRead, NULL)) + return(0); + return ((tsize_t) dwSizeRead); +} + +static tsize_t +_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + DWORD dwSizeWritten; + if (!WriteFile(fd, buf, size, &dwSizeWritten, NULL)) + return(0); + return ((tsize_t) dwSizeWritten); +} + +static toff_t +_tiffSeekProc(thandle_t fd, toff_t off, int whence) +{ + ULARGE_INTEGER li; + DWORD dwMoveMethod; + + li.QuadPart = off; + + switch(whence) + { + case SEEK_SET: + dwMoveMethod = FILE_BEGIN; + break; + case SEEK_CUR: + dwMoveMethod = FILE_CURRENT; + break; + case SEEK_END: + dwMoveMethod = FILE_END; + break; + default: + dwMoveMethod = FILE_BEGIN; + break; + } + return ((toff_t)SetFilePointer(fd, (LONG) li.LowPart, + (PLONG)&li.HighPart, dwMoveMethod)); +} + +static int +_tiffCloseProc(thandle_t fd) +{ + return (CloseHandle(fd) ? 0 : -1); +} + +static toff_t +_tiffSizeProc(thandle_t fd) +{ + return ((toff_t)GetFileSize(fd, NULL)); +} + +static int +_tiffDummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + (void) fd; + (void) pbase; + (void) psize; + return (0); +} + +/* + * From "Hermann Josef Hill" : + * + * Windows uses both a handle and a pointer for file mapping, + * but according to the SDK documentation and Richter's book + * "Advanced Windows Programming" it is safe to free the handle + * after obtaining the file mapping pointer + * + * This removes a nasty OS dependency and cures a problem + * with Visual C++ 5.0 + */ +static int +_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + toff_t size; + HANDLE hMapFile; + + if ((size = _tiffSizeProc(fd)) == 0xFFFFFFFF) + return (0); + hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, size, NULL); + if (hMapFile == NULL) + return (0); + *pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); + CloseHandle(hMapFile); + if (*pbase == NULL) + return (0); + *psize = size; + return(1); +} + +static void +_tiffDummyUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ + (void) fd; + (void) base; + (void) size; +} + +static void +_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ + UnmapViewOfFile(base); +} + +/* + * Open a TIFF file descriptor for read/writing. + * Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode + * string, which forces the file to be opened unmapped. + */ +TIFF* +TIFFFdOpen(int ifd, const char* name, const char* mode) +{ + TIFF* tif; + BOOL fSuppressMap = (mode[1] == 'u' || (mode[1]!=0 && mode[2] == 'u')); + + tif = TIFFClientOpen(name, mode, (thandle_t)ifd, + _tiffReadProc, _tiffWriteProc, + _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, + fSuppressMap ? _tiffDummyMapProc : _tiffMapProc, + fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc); + if (tif) + tif->tif_fd = ifd; + return (tif); +} + +#ifndef _WIN32_WCE + +/* + * Open a TIFF file for read/writing. + */ +TIFF* +TIFFOpen(const char* name, const char* mode) +{ + static const char module[] = "TIFFOpen"; + thandle_t fd; + int m; + DWORD dwMode; + TIFF* tif; + + m = _TIFFgetMode(mode, module); + + switch(m) + { + case O_RDONLY: + dwMode = OPEN_EXISTING; + break; + case O_RDWR: + dwMode = OPEN_ALWAYS; + break; + case O_RDWR|O_CREAT: + dwMode = OPEN_ALWAYS; + break; + case O_RDWR|O_TRUNC: + dwMode = CREATE_ALWAYS; + break; + case O_RDWR|O_CREAT|O_TRUNC: + dwMode = CREATE_ALWAYS; + break; + default: + return ((TIFF*)0); + } + fd = (thandle_t)CreateFileA(name, + (m == O_RDONLY)?GENERIC_READ:(GENERIC_READ | GENERIC_WRITE), + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode, + (m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL, + NULL); + if (fd == INVALID_HANDLE_VALUE) { + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF *)0); + } + + tif = TIFFFdOpen((int)fd, name, mode); + if(!tif) + CloseHandle(fd); + return tif; +} + +/* + * Open a TIFF file with a Unicode filename, for read/writing. + */ +TIFF* +TIFFOpenW(const wchar_t* name, const char* mode) +{ + static const char module[] = "TIFFOpenW"; + thandle_t fd; + int m; + DWORD dwMode; + int mbsize; + char *mbname; + TIFF *tif; + + m = _TIFFgetMode(mode, module); + + switch(m) { + case O_RDONLY: dwMode = OPEN_EXISTING; break; + case O_RDWR: dwMode = OPEN_ALWAYS; break; + case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break; + case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break; + case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break; + default: return ((TIFF*)0); + } + + fd = (thandle_t)CreateFileW(name, + (m == O_RDONLY)?GENERIC_READ:(GENERIC_READ|GENERIC_WRITE), + FILE_SHARE_READ, NULL, dwMode, + (m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL, + NULL); + if (fd == INVALID_HANDLE_VALUE) { + TIFFErrorExt(0, module, "%S: Cannot open", name); + return ((TIFF *)0); + } + + mbname = NULL; + mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL); + if (mbsize > 0) { + mbname = (char *)_TIFFmalloc(mbsize); + if (!mbname) { + TIFFErrorExt(0, module, + "Can't allocate space for filename conversion buffer"); + return ((TIFF*)0); + } + + WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, + NULL, NULL); + } + + tif = TIFFFdOpen((int)fd, + (mbname != NULL) ? mbname : "", mode); + if(!tif) + CloseHandle(fd); + + _TIFFfree(mbname); + + return tif; +} + +#endif /* ndef _WIN32_WCE */ + + +tdata_t +_TIFFmalloc(tsize_t s) +{ + return ((tdata_t)GlobalAlloc(GMEM_FIXED, s)); +} + +void +_TIFFfree(tdata_t p) +{ + GlobalFree(p); + return; +} + +tdata_t +_TIFFrealloc(tdata_t p, tsize_t s) +{ + void* pvTmp; + tsize_t old; + + if(p == NULL) + return ((tdata_t)GlobalAlloc(GMEM_FIXED, s)); + + old = GlobalSize(p); + + if (old>=s) { + if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) { + CopyMemory(pvTmp, p, s); + GlobalFree(p); + } + } else { + if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) { + CopyMemory(pvTmp, p, old); + GlobalFree(p); + } + } + return ((tdata_t)pvTmp); +} + +void +_TIFFmemset(void* p, int v, tsize_t c) +{ + FillMemory(p, c, (BYTE)v); +} + +void +_TIFFmemcpy(void* d, const tdata_t s, tsize_t c) +{ + CopyMemory(d, s, c); +} + +int +_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) +{ + register const BYTE *pb1 = (const BYTE *) p1; + register const BYTE *pb2 = (const BYTE *) p2; + register DWORD dwTmp = c; + register int iTmp; + for (iTmp = 0; dwTmp-- && !iTmp; iTmp = (int)*pb1++ - (int)*pb2++) + ; + return (iTmp); +} + +#ifndef _WIN32_WCE + +static void +Win32WarningHandler(const char* module, const char* fmt, va_list ap) +{ +#ifndef TIF_PLATFORM_CONSOLE + LPTSTR szTitle; + LPTSTR szTmp; + LPCTSTR szTitleText = "%s Warning"; + LPCTSTR szDefaultModule = "LIBTIFF"; + LPCTSTR szTmpModule = (module == NULL) ? szDefaultModule : module; + if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (strlen(szTmpModule) + + strlen(szTitleText) + strlen(fmt) + 128)*sizeof(char))) == NULL) + return; + sprintf(szTitle, szTitleText, szTmpModule); + szTmp = szTitle + (strlen(szTitle)+2)*sizeof(char); + vsprintf(szTmp, fmt, ap); + MessageBoxA(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION); + LocalFree(szTitle); + return; +#else + if (module != NULL) + fprintf(stderr, "%s: ", module); + fprintf(stderr, "Warning, "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +#endif +} +TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler; + +static void +Win32ErrorHandler(const char* module, const char* fmt, va_list ap) +{ +#ifndef TIF_PLATFORM_CONSOLE + LPTSTR szTitle; + LPTSTR szTmp; + LPCTSTR szTitleText = "%s Error"; + LPCTSTR szDefaultModule = "LIBTIFF"; + LPCTSTR szTmpModule = (module == NULL) ? szDefaultModule : module; + if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (strlen(szTmpModule) + + strlen(szTitleText) + strlen(fmt) + 128)*sizeof(char))) == NULL) + return; + sprintf(szTitle, szTitleText, szTmpModule); + szTmp = szTitle + (strlen(szTitle)+2)*sizeof(char); + vsprintf(szTmp, fmt, ap); + MessageBoxA(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION); + LocalFree(szTitle); + return; +#else + if (module != NULL) + fprintf(stderr, "%s: ", module); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ".\n"); +#endif +} +TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler; + +#endif /* ndef _WIN32_WCE */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_wince.c b/src/3rdparty/libtiff/libtiff/tif_wince.c new file mode 100644 index 0000000000..4e283daf69 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_wince.c @@ -0,0 +1,281 @@ +/* $Id: tif_wince.c,v 1.1 2007-01-15 18:40:39 mloskot Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * Windows CE-specific routines for TIFF Library. + * Adapted from tif_win32.c 01/10/2006 by Mateusz Loskot (mateusz@loskot.net) + */ + +#ifndef _WIN32_WCE +# error "Only Windows CE target is supported!" +#endif + +#include "tiffiop.h" +#include + +/* Turn off console support on Windows CE. */ +#undef TIF_PLATFORM_CONSOLE + + +/* + * Open a TIFF file for read/writing. + */ +TIFF* +TIFFOpen(const char* name, const char* mode) +{ + static const char module[] = "TIFFOpen"; + thandle_t fd; + int m; + DWORD dwMode; + TIFF* tif; + size_t nLen; + size_t nWideLen; + wchar_t* wchName; + + m = _TIFFgetMode(mode, module); + + switch(m) + { + case O_RDONLY: + dwMode = OPEN_EXISTING; + break; + case O_RDWR: + dwMode = OPEN_ALWAYS; + break; + case O_RDWR|O_CREAT: + dwMode = OPEN_ALWAYS; + break; + case O_RDWR|O_TRUNC: + dwMode = CREATE_ALWAYS; + break; + case O_RDWR|O_CREAT|O_TRUNC: + dwMode = CREATE_ALWAYS; + break; + default: + return ((TIFF*)0); + } + + /* On Windows CE, CreateFile is mapped to CreateFileW, + * but file path is passed as char-based string, + * so the path has to be converted to wchar_t. + */ + + nWideLen = 0; + wchName = NULL; + nLen = strlen(name) + 1; + + nWideLen = MultiByteToWideChar(CP_ACP, 0, name, nLen, NULL, 0); + wchName = (wchar_t*)malloc(sizeof(wchar_t) * nWideLen); + if (NULL == wchName) + { + TIFFErrorExt(0, module, "Memory allocation error!"); + return ((TIFF *)0); + } + memset(wchName, 0, sizeof(wchar_t) * nWideLen); + MultiByteToWideChar(CP_ACP, 0, name, nLen, wchName, nWideLen); + + fd = (thandle_t)CreateFile(wchName, + (m == O_RDONLY)?GENERIC_READ:(GENERIC_READ | GENERIC_WRITE), + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode, + (m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL, + NULL); + + free(wchName); + + if (fd == INVALID_HANDLE_VALUE) { + TIFFErrorExt(0, module, "%s: Cannot open", name); + return ((TIFF *)0); + } + + /* TODO - mloskot: change to TIFFdOpenW and pass wchar path */ + + tif = TIFFFdOpen((int)fd, name, mode); + if(!tif) + CloseHandle(fd); + return tif; +} + +/* + * Open a TIFF file with a Unicode filename, for read/writing. + */ +TIFF* +TIFFOpenW(const wchar_t* name, const char* mode) +{ + static const char module[] = "TIFFOpenW"; + thandle_t fd; + int m; + DWORD dwMode; + int mbsize; + char *mbname; + TIFF *tif; + + m = _TIFFgetMode(mode, module); + + switch(m) { + case O_RDONLY: dwMode = OPEN_EXISTING; break; + case O_RDWR: dwMode = OPEN_ALWAYS; break; + case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break; + case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break; + case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break; + default: return ((TIFF*)0); + } + + /* On Windows CE, CreateFile is mapped to CreateFileW, + * so no conversion of wchar_t to char is required. + */ + + fd = (thandle_t)CreateFile(name, + (m == O_RDONLY)?GENERIC_READ:(GENERIC_READ|GENERIC_WRITE), + FILE_SHARE_READ, NULL, dwMode, + (m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL, + NULL); + if (fd == INVALID_HANDLE_VALUE) { + TIFFErrorExt(0, module, "%S: Cannot open", name); + return ((TIFF *)0); + } + + mbname = NULL; + mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL); + if (mbsize > 0) { + mbname = (char *)_TIFFmalloc(mbsize); + if (!mbname) { + TIFFErrorExt(0, module, + "Can't allocate space for filename conversion buffer"); + return ((TIFF*)0); + } + + WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, + NULL, NULL); + } + + tif = TIFFFdOpen((int)fd, + (mbname != NULL) ? mbname : "", mode); + if(!tif) + CloseHandle(fd); + + _TIFFfree(mbname); + + return tif; +} + +static void +Win32WarningHandler(const char* module, const char* fmt, va_list ap) +{ + /* On Windows CE, MessageBox is mapped to wide-char based MessageBoxW. */ + + size_t nWideLen = 0; + LPTSTR szWideTitle = NULL; + LPTSTR szWideMsg = NULL; + + LPSTR szTitle; + LPSTR szTmp; + LPCSTR szTitleText = "%s Warning"; + LPCSTR szDefaultModule = "LIBTIFF"; + LPCSTR szTmpModule; + + szTmpModule = (module == NULL) ? szDefaultModule : module; + if ((szTitle = (LPSTR)LocalAlloc(LMEM_FIXED, + (strlen(szTmpModule) + strlen(szTitleText) + + strlen(fmt) + 128) * sizeof(char))) == NULL) + return; + + sprintf(szTitle, szTitleText, szTmpModule); + szTmp = szTitle + (strlen(szTitle) + 2) * sizeof(char); + vsprintf(szTmp, fmt, ap); + + /* Convert error message to Unicode. */ + + nWideLen = MultiByteToWideChar(CP_ACP, 0, szTitle, -1, NULL, 0); + szWideTitle = (wchar_t*)malloc(sizeof(wchar_t) * nWideLen); + MultiByteToWideChar(CP_ACP, 0, szTitle, -1, szWideTitle, nWideLen); + + nWideLen = MultiByteToWideChar(CP_ACP, 0, szTmp, -1, NULL, 0); + szWideMsg = (wchar_t*)malloc(sizeof(wchar_t) * nWideLen); + MultiByteToWideChar(CP_ACP, 0, szTmp, -1, szWideMsg, nWideLen); + + /* Display message */ + + MessageBox(GetFocus(), szWideMsg, szWideTitle, MB_OK | MB_ICONEXCLAMATION); + + /* Free resources */ + + LocalFree(szTitle); + free(szWideMsg); + free(szWideTitle); +} + +TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler; + +static void +Win32ErrorHandler(const char* module, const char* fmt, va_list ap) +{ + /* On Windows CE, MessageBox is mapped to wide-char based MessageBoxW. */ + + size_t nWideLen = 0; + LPTSTR szWideTitle = NULL; + LPTSTR szWideMsg = NULL; + + LPSTR szTitle; + LPSTR szTmp; + LPCSTR szTitleText = "%s Error"; + LPCSTR szDefaultModule = "LIBTIFF"; + LPCSTR szTmpModule; + + szTmpModule = (module == NULL) ? szDefaultModule : module; + if ((szTitle = (LPSTR)LocalAlloc(LMEM_FIXED, + (strlen(szTmpModule) + strlen(szTitleText) + + strlen(fmt) + 128) * sizeof(char))) == NULL) + return; + + sprintf(szTitle, szTitleText, szTmpModule); + szTmp = szTitle + (strlen(szTitle) + 2) * sizeof(char); + vsprintf(szTmp, fmt, ap); + + /* Convert error message to Unicode. */ + + nWideLen = MultiByteToWideChar(CP_ACP, 0, szTitle, -1, NULL, 0); + szWideTitle = (wchar_t*)malloc(sizeof(wchar_t) * nWideLen); + MultiByteToWideChar(CP_ACP, 0, szTitle, -1, szWideTitle, nWideLen); + + nWideLen = MultiByteToWideChar(CP_ACP, 0, szTmp, -1, NULL, 0); + szWideMsg = (wchar_t*)malloc(sizeof(wchar_t) * nWideLen); + MultiByteToWideChar(CP_ACP, 0, szTmp, -1, szWideMsg, nWideLen); + + /* Display message */ + + MessageBox(GetFocus(), szWideMsg, szWideTitle, MB_OK | MB_ICONEXCLAMATION); + + /* Free resources */ + + LocalFree(szTitle); + free(szWideMsg); + free(szWideTitle); +} + +TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler; + + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_write.c b/src/3rdparty/libtiff/libtiff/tif_write.c new file mode 100644 index 0000000000..ec371361e0 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_write.c @@ -0,0 +1,711 @@ +/* $Id: tif_write.c,v 1.22.2.4 2009-08-28 02:23:19 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * TIFF Library. + * + * Scanline-oriented Write Support + */ +#include "tiffiop.h" +#include + +#define STRIPINCR 20 /* expansion factor on strip array */ + +#define WRITECHECKSTRIPS(tif, module) \ + (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),0,module)) +#define WRITECHECKTILES(tif, module) \ + (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),1,module)) +#define BUFFERCHECK(tif) \ + ((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \ + TIFFWriteBufferSetup((tif), NULL, (tsize_t) -1)) + +static int TIFFGrowStrips(TIFF*, int, const char*); +static int TIFFAppendToStrip(TIFF*, tstrip_t, tidata_t, tsize_t); + +int +TIFFWriteScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample) +{ + static const char module[] = "TIFFWriteScanline"; + register TIFFDirectory *td; + int status, imagegrew = 0; + tstrip_t strip; + + if (!WRITECHECKSTRIPS(tif, module)) + return (-1); + /* + * Handle delayed allocation of data buffer. This + * permits it to be sized more intelligently (using + * directory information). + */ + if (!BUFFERCHECK(tif)) + return (-1); + td = &tif->tif_dir; + /* + * Extend image length if needed + * (but only for PlanarConfig=1). + */ + if (row >= td->td_imagelength) { /* extend image */ + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Can not change \"ImageLength\" when using separate planes"); + return (-1); + } + td->td_imagelength = row+1; + imagegrew = 1; + } + /* + * Calculate strip and check for crossings. + */ + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { + if (sample >= td->td_samplesperpixel) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "%d: Sample out of range, max %d", + sample, td->td_samplesperpixel); + return (-1); + } + strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip; + } else + strip = row / td->td_rowsperstrip; + /* + * Check strip array to make sure there's space. We don't support + * dynamically growing files that have data organized in separate + * bitplanes because it's too painful. In that case we require that + * the imagelength be set properly before the first write (so that the + * strips array will be fully allocated above). + */ + if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module)) + return (-1); + if (strip != tif->tif_curstrip) { + /* + * Changing strips -- flush any data present. + */ + if (!TIFFFlushData(tif)) + return (-1); + tif->tif_curstrip = strip; + /* + * Watch out for a growing image. The value of strips/image + * will initially be 1 (since it can't be deduced until the + * imagelength is known). + */ + if (strip >= td->td_stripsperimage && imagegrew) + td->td_stripsperimage = + TIFFhowmany(td->td_imagelength,td->td_rowsperstrip); + tif->tif_row = + (strip % td->td_stripsperimage) * td->td_rowsperstrip; + if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { + if (!(*tif->tif_setupencode)(tif)) + return (-1); + tif->tif_flags |= TIFF_CODERSETUP; + } + + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; + + if( td->td_stripbytecount[strip] > 0 ) + { + /* if we are writing over existing tiles, zero length */ + td->td_stripbytecount[strip] = 0; + + /* this forces TIFFAppendToStrip() to do a seek */ + tif->tif_curoff = 0; + } + + if (!(*tif->tif_preencode)(tif, sample)) + return (-1); + tif->tif_flags |= TIFF_POSTENCODE; + } + /* + * Ensure the write is either sequential or at the + * beginning of a strip (or that we can randomly + * access the data -- i.e. no encoding). + */ + if (row != tif->tif_row) { + if (row < tif->tif_row) { + /* + * Moving backwards within the same strip: + * backup to the start and then decode + * forward (below). + */ + tif->tif_row = (strip % td->td_stripsperimage) * + td->td_rowsperstrip; + tif->tif_rawcp = tif->tif_rawdata; + } + /* + * Seek forward to the desired row. + */ + if (!(*tif->tif_seek)(tif, row - tif->tif_row)) + return (-1); + tif->tif_row = row; + } + + /* swab if needed - note that source buffer will be altered */ + tif->tif_postdecode( tif, (tidata_t) buf, tif->tif_scanlinesize ); + + status = (*tif->tif_encoderow)(tif, (tidata_t) buf, + tif->tif_scanlinesize, sample); + + /* we are now poised at the beginning of the next row */ + tif->tif_row = row + 1; + return (status); +} + +/* + * Encode the supplied data and write it to the + * specified strip. + * + * NB: Image length must be setup before writing. + */ +tsize_t +TIFFWriteEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc) +{ + static const char module[] = "TIFFWriteEncodedStrip"; + TIFFDirectory *td = &tif->tif_dir; + tsample_t sample; + + if (!WRITECHECKSTRIPS(tif, module)) + return ((tsize_t) -1); + /* + * Check strip array to make sure there's space. + * We don't support dynamically growing files that + * have data organized in separate bitplanes because + * it's too painful. In that case we require that + * the imagelength be set properly before the first + * write (so that the strips array will be fully + * allocated above). + */ + if (strip >= td->td_nstrips) { + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Can not grow image by strips when using separate planes"); + return ((tsize_t) -1); + } + if (!TIFFGrowStrips(tif, 1, module)) + return ((tsize_t) -1); + td->td_stripsperimage = + TIFFhowmany(td->td_imagelength, td->td_rowsperstrip); + } + /* + * Handle delayed allocation of data buffer. This + * permits it to be sized according to the directory + * info. + */ + if (!BUFFERCHECK(tif)) + return ((tsize_t) -1); + tif->tif_curstrip = strip; + tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; + if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { + if (!(*tif->tif_setupencode)(tif)) + return ((tsize_t) -1); + tif->tif_flags |= TIFF_CODERSETUP; + } + + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; + + if( td->td_stripbytecount[strip] > 0 ) + { + /* Force TIFFAppendToStrip() to consider placing data at end + of file. */ + tif->tif_curoff = 0; + } + + tif->tif_flags &= ~TIFF_POSTENCODE; + sample = (tsample_t)(strip / td->td_stripsperimage); + if (!(*tif->tif_preencode)(tif, sample)) + return ((tsize_t) -1); + + /* swab if needed - note that source buffer will be altered */ + tif->tif_postdecode( tif, (tidata_t) data, cc ); + + if (!(*tif->tif_encodestrip)(tif, (tidata_t) data, cc, sample)) + return ((tsize_t) 0); + if (!(*tif->tif_postencode)(tif)) + return ((tsize_t) -1); + if (!isFillOrder(tif, td->td_fillorder) && + (tif->tif_flags & TIFF_NOBITREV) == 0) + TIFFReverseBits(tif->tif_rawdata, tif->tif_rawcc); + if (tif->tif_rawcc > 0 && + !TIFFAppendToStrip(tif, strip, tif->tif_rawdata, tif->tif_rawcc)) + return ((tsize_t) -1); + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; + return (cc); +} + +/* + * Write the supplied data to the specified strip. + * + * NB: Image length must be setup before writing. + */ +tsize_t +TIFFWriteRawStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc) +{ + static const char module[] = "TIFFWriteRawStrip"; + TIFFDirectory *td = &tif->tif_dir; + + if (!WRITECHECKSTRIPS(tif, module)) + return ((tsize_t) -1); + /* + * Check strip array to make sure there's space. + * We don't support dynamically growing files that + * have data organized in separate bitplanes because + * it's too painful. In that case we require that + * the imagelength be set properly before the first + * write (so that the strips array will be fully + * allocated above). + */ + if (strip >= td->td_nstrips) { + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, + "Can not grow image by strips when using separate planes"); + return ((tsize_t) -1); + } + /* + * Watch out for a growing image. The value of + * strips/image will initially be 1 (since it + * can't be deduced until the imagelength is known). + */ + if (strip >= td->td_stripsperimage) + td->td_stripsperimage = + TIFFhowmany(td->td_imagelength,td->td_rowsperstrip); + if (!TIFFGrowStrips(tif, 1, module)) + return ((tsize_t) -1); + } + tif->tif_curstrip = strip; + tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; + return (TIFFAppendToStrip(tif, strip, (tidata_t) data, cc) ? + cc : (tsize_t) -1); +} + +/* + * Write and compress a tile of data. The + * tile is selected by the (x,y,z,s) coordinates. + */ +tsize_t +TIFFWriteTile(TIFF* tif, + tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s) +{ + if (!TIFFCheckTile(tif, x, y, z, s)) + return (-1); + /* + * NB: A tile size of -1 is used instead of tif_tilesize knowing + * that TIFFWriteEncodedTile will clamp this to the tile size. + * This is done because the tile size may not be defined until + * after the output buffer is setup in TIFFWriteBufferSetup. + */ + return (TIFFWriteEncodedTile(tif, + TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1)); +} + +/* + * Encode the supplied data and write it to the + * specified tile. There must be space for the + * data. The function clamps individual writes + * to a tile to the tile size, but does not (and + * can not) check that multiple writes to the same + * tile do not write more than tile size data. + * + * NB: Image length must be setup before writing; this + * interface does not support automatically growing + * the image on each write (as TIFFWriteScanline does). + */ +tsize_t +TIFFWriteEncodedTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc) +{ + static const char module[] = "TIFFWriteEncodedTile"; + TIFFDirectory *td; + tsample_t sample; + + if (!WRITECHECKTILES(tif, module)) + return ((tsize_t) -1); + td = &tif->tif_dir; + if (tile >= td->td_nstrips) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: Tile %lu out of range, max %lu", + tif->tif_name, (unsigned long) tile, (unsigned long) td->td_nstrips); + return ((tsize_t) -1); + } + /* + * Handle delayed allocation of data buffer. This + * permits it to be sized more intelligently (using + * directory information). + */ + if (!BUFFERCHECK(tif)) + return ((tsize_t) -1); + tif->tif_curtile = tile; + + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; + + if( td->td_stripbytecount[tile] > 0 ) + { + /* Force TIFFAppendToStrip() to consider placing data at end + of file. */ + tif->tif_curoff = 0; + } + + /* + * Compute tiles per row & per column to compute + * current row and column + */ + tif->tif_row = (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength)) + * td->td_tilelength; + tif->tif_col = (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth)) + * td->td_tilewidth; + + if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { + if (!(*tif->tif_setupencode)(tif)) + return ((tsize_t) -1); + tif->tif_flags |= TIFF_CODERSETUP; + } + tif->tif_flags &= ~TIFF_POSTENCODE; + sample = (tsample_t)(tile/td->td_stripsperimage); + if (!(*tif->tif_preencode)(tif, sample)) + return ((tsize_t) -1); + /* + * Clamp write amount to the tile size. This is mostly + * done so that callers can pass in some large number + * (e.g. -1) and have the tile size used instead. + */ + if ( cc < 1 || cc > tif->tif_tilesize) + cc = tif->tif_tilesize; + + /* swab if needed - note that source buffer will be altered */ + tif->tif_postdecode( tif, (tidata_t) data, cc ); + + if (!(*tif->tif_encodetile)(tif, (tidata_t) data, cc, sample)) + return ((tsize_t) 0); + if (!(*tif->tif_postencode)(tif)) + return ((tsize_t) -1); + if (!isFillOrder(tif, td->td_fillorder) && + (tif->tif_flags & TIFF_NOBITREV) == 0) + TIFFReverseBits((unsigned char *)tif->tif_rawdata, tif->tif_rawcc); + if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, tile, + tif->tif_rawdata, tif->tif_rawcc)) + return ((tsize_t) -1); + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; + return (cc); +} + +/* + * Write the supplied data to the specified strip. + * There must be space for the data; we don't check + * if strips overlap! + * + * NB: Image length must be setup before writing; this + * interface does not support automatically growing + * the image on each write (as TIFFWriteScanline does). + */ +tsize_t +TIFFWriteRawTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc) +{ + static const char module[] = "TIFFWriteRawTile"; + + if (!WRITECHECKTILES(tif, module)) + return ((tsize_t) -1); + if (tile >= tif->tif_dir.td_nstrips) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: Tile %lu out of range, max %lu", + tif->tif_name, (unsigned long) tile, + (unsigned long) tif->tif_dir.td_nstrips); + return ((tsize_t) -1); + } + return (TIFFAppendToStrip(tif, tile, (tidata_t) data, cc) ? + cc : (tsize_t) -1); +} + +#define isUnspecified(tif, f) \ + (TIFFFieldSet(tif,f) && (tif)->tif_dir.td_imagelength == 0) + +int +TIFFSetupStrips(TIFF* tif) +{ + TIFFDirectory* td = &tif->tif_dir; + + if (isTiled(tif)) + td->td_stripsperimage = + isUnspecified(tif, FIELD_TILEDIMENSIONS) ? + td->td_samplesperpixel : TIFFNumberOfTiles(tif); + else + td->td_stripsperimage = + isUnspecified(tif, FIELD_ROWSPERSTRIP) ? + td->td_samplesperpixel : TIFFNumberOfStrips(tif); + td->td_nstrips = td->td_stripsperimage; + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) + td->td_stripsperimage /= td->td_samplesperpixel; + td->td_stripoffset = (uint32 *) + _TIFFmalloc(td->td_nstrips * sizeof (uint32)); + td->td_stripbytecount = (uint32 *) + _TIFFmalloc(td->td_nstrips * sizeof (uint32)); + if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL) + return (0); + /* + * Place data at the end-of-file + * (by setting offsets to zero). + */ + _TIFFmemset(td->td_stripoffset, 0, td->td_nstrips*sizeof (uint32)); + _TIFFmemset(td->td_stripbytecount, 0, td->td_nstrips*sizeof (uint32)); + TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS); + TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS); + return (1); +} +#undef isUnspecified + +/* + * Verify file is writable and that the directory + * information is setup properly. In doing the latter + * we also "freeze" the state of the directory so + * that important information is not changed. + */ +int +TIFFWriteCheck(TIFF* tif, int tiles, const char* module) +{ + if (tif->tif_mode == O_RDONLY) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: File not open for writing", + tif->tif_name); + return (0); + } + if (tiles ^ isTiled(tif)) { + TIFFErrorExt(tif->tif_clientdata, tif->tif_name, tiles ? + "Can not write tiles to a stripped image" : + "Can not write scanlines to a tiled image"); + return (0); + } + + /* + * On the first write verify all the required information + * has been setup and initialize any data structures that + * had to wait until directory information was set. + * Note that a lot of our work is assumed to remain valid + * because we disallow any of the important parameters + * from changing after we start writing (i.e. once + * TIFF_BEENWRITING is set, TIFFSetField will only allow + * the image's length to be changed). + */ + if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Must set \"ImageWidth\" before writing data", + tif->tif_name); + return (0); + } + if (tif->tif_dir.td_samplesperpixel == 1) { + /* + * Planarconfiguration is irrelevant in case of single band + * images and need not be included. We will set it anyway, + * because this field is used in other parts of library even + * in the single band case. + */ + if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) + tif->tif_dir.td_planarconfig = PLANARCONFIG_CONTIG; + } else { + if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Must set \"PlanarConfiguration\" before writing data", + tif->tif_name); + return (0); + } + } + if (tif->tif_dir.td_stripoffset == NULL && !TIFFSetupStrips(tif)) { + tif->tif_dir.td_nstrips = 0; + TIFFErrorExt(tif->tif_clientdata, module, "%s: No space for %s arrays", + tif->tif_name, isTiled(tif) ? "tile" : "strip"); + return (0); + } + tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1; + tif->tif_scanlinesize = TIFFScanlineSize(tif); + tif->tif_flags |= TIFF_BEENWRITING; + return (1); +} + +/* + * Setup the raw data buffer used for encoding. + */ +int +TIFFWriteBufferSetup(TIFF* tif, tdata_t bp, tsize_t size) +{ + static const char module[] = "TIFFWriteBufferSetup"; + + if (tif->tif_rawdata) { + if (tif->tif_flags & TIFF_MYBUFFER) { + _TIFFfree(tif->tif_rawdata); + tif->tif_flags &= ~TIFF_MYBUFFER; + } + tif->tif_rawdata = NULL; + } + if (size == (tsize_t) -1) { + size = (isTiled(tif) ? + tif->tif_tilesize : TIFFStripSize(tif)); + /* + * Make raw data buffer at least 8K + */ + if (size < 8*1024) + size = 8*1024; + bp = NULL; /* NB: force malloc */ + } + if (bp == NULL) { + bp = _TIFFmalloc(size); + if (bp == NULL) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: No space for output buffer", + tif->tif_name); + return (0); + } + tif->tif_flags |= TIFF_MYBUFFER; + } else + tif->tif_flags &= ~TIFF_MYBUFFER; + tif->tif_rawdata = (tidata_t) bp; + tif->tif_rawdatasize = size; + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; + tif->tif_flags |= TIFF_BUFFERSETUP; + return (1); +} + +/* + * Grow the strip data structures by delta strips. + */ +static int +TIFFGrowStrips(TIFF* tif, int delta, const char* module) +{ + TIFFDirectory *td = &tif->tif_dir; + uint32 *new_stripoffset, *new_stripbytecount; + + assert(td->td_planarconfig == PLANARCONFIG_CONTIG); + new_stripoffset = (uint32*)_TIFFrealloc(td->td_stripoffset, + (td->td_nstrips + delta) * sizeof (uint32)); + new_stripbytecount = (uint32*)_TIFFrealloc(td->td_stripbytecount, + (td->td_nstrips + delta) * sizeof (uint32)); + if (new_stripoffset == NULL || new_stripbytecount == NULL) { + if (new_stripoffset) + _TIFFfree(new_stripoffset); + if (new_stripbytecount) + _TIFFfree(new_stripbytecount); + td->td_nstrips = 0; + TIFFErrorExt(tif->tif_clientdata, module, "%s: No space to expand strip arrays", + tif->tif_name); + return (0); + } + td->td_stripoffset = new_stripoffset; + td->td_stripbytecount = new_stripbytecount; + _TIFFmemset(td->td_stripoffset + td->td_nstrips, + 0, delta*sizeof (uint32)); + _TIFFmemset(td->td_stripbytecount + td->td_nstrips, + 0, delta*sizeof (uint32)); + td->td_nstrips += delta; + return (1); +} + +/* + * Append the data to the specified strip. + */ +static int +TIFFAppendToStrip(TIFF* tif, tstrip_t strip, tidata_t data, tsize_t cc) +{ + static const char module[] = "TIFFAppendToStrip"; + TIFFDirectory *td = &tif->tif_dir; + + if (td->td_stripoffset[strip] == 0 || tif->tif_curoff == 0) { + assert(td->td_nstrips > 0); + + if( td->td_stripbytecount[strip] != 0 + && td->td_stripoffset[strip] != 0 + && td->td_stripbytecount[strip] >= cc ) + { + /* + * There is already tile data on disk, and the new tile + * data we have to will fit in the same space. The only + * aspect of this that is risky is that there could be + * more data to append to this strip before we are done + * depending on how we are getting called. + */ + if (!SeekOK(tif, td->td_stripoffset[strip])) { + TIFFErrorExt(tif->tif_clientdata, module, + "Seek error at scanline %lu", + (unsigned long)tif->tif_row); + return (0); + } + } + else + { + /* + * Seek to end of file, and set that as our location to + * write this strip. + */ + td->td_stripoffset[strip] = TIFFSeekFile(tif, 0, SEEK_END); + } + + tif->tif_curoff = td->td_stripoffset[strip]; + + /* + * We are starting a fresh strip/tile, so set the size to zero. + */ + td->td_stripbytecount[strip] = 0; + } + + if (!WriteOK(tif, data, cc)) { + TIFFErrorExt(tif->tif_clientdata, module, "Write error at scanline %lu", + (unsigned long) tif->tif_row); + return (0); + } + tif->tif_curoff = tif->tif_curoff+cc; + td->td_stripbytecount[strip] += cc; + return (1); +} + +/* + * Internal version of TIFFFlushData that can be + * called by ``encodestrip routines'' w/o concern + * for infinite recursion. + */ +int +TIFFFlushData1(TIFF* tif) +{ + if (tif->tif_rawcc > 0) { + if (!isFillOrder(tif, tif->tif_dir.td_fillorder) && + (tif->tif_flags & TIFF_NOBITREV) == 0) + TIFFReverseBits((unsigned char *)tif->tif_rawdata, + tif->tif_rawcc); + if (!TIFFAppendToStrip(tif, + isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip, + tif->tif_rawdata, tif->tif_rawcc)) + return (0); + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; + } + return (1); +} + +/* + * Set the current write offset. This should only be + * used to set the offset to a known previous location + * (very carefully), or to 0 so that the next write gets + * appended to the end of the file. + */ +void +TIFFSetWriteOffset(TIFF* tif, toff_t off) +{ + tif->tif_curoff = off; +} + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tif_zip.c b/src/3rdparty/libtiff/libtiff/tif_zip.c new file mode 100644 index 0000000000..38a5773891 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tif_zip.c @@ -0,0 +1,412 @@ +/* $Id: tif_zip.c,v 1.11.2.3 2007/11/22 21:24:51 fwarmerdam Exp $ */ + +/* + * Copyright (c) 1995-1997 Sam Leffler + * Copyright (c) 1995-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "tiffiop.h" +#ifdef ZIP_SUPPORT +/* + * TIFF Library. + * + * ZIP (aka Deflate) Compression Support + * + * This file is simply an interface to the zlib library written by + * Jean-loup Gailly and Mark Adler. You must use version 1.0 or later + * of the library: this code assumes the 1.0 API and also depends on + * the ability to write the zlib header multiple times (one per strip) + * which was not possible with versions prior to 0.95. Note also that + * older versions of this codec avoided this bug by supressing the header + * entirely. This means that files written with the old library cannot + * be read; they should be converted to a different compression scheme + * and then reconverted. + * + * The data format used by the zlib library is described in the files + * zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the + * directory ftp://ftp.uu.net/pub/archiving/zip/doc. The library was + * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz. + */ +#include "tif_predict.h" +#include "zlib.h" + +#include + +/* + * Sigh, ZLIB_VERSION is defined as a string so there's no + * way to do a proper check here. Instead we guess based + * on the presence of #defines that were added between the + * 0.95 and 1.0 distributions. + */ +#if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED) +#error "Antiquated ZLIB software; you must use version 1.0 or later" +#endif + +/* + * State block for each open TIFF + * file using ZIP compression/decompression. + */ +typedef struct { + TIFFPredictorState predict; + z_stream stream; + int zipquality; /* compression level */ + int state; /* state flags */ +#define ZSTATE_INIT_DECODE 0x01 +#define ZSTATE_INIT_ENCODE 0x02 + + TIFFVGetMethod vgetparent; /* super-class method */ + TIFFVSetMethod vsetparent; /* super-class method */ +} ZIPState; + +#define ZState(tif) ((ZIPState*) (tif)->tif_data) +#define DecoderState(tif) ZState(tif) +#define EncoderState(tif) ZState(tif) + +static int ZIPEncode(TIFF*, tidata_t, tsize_t, tsample_t); +static int ZIPDecode(TIFF*, tidata_t, tsize_t, tsample_t); + +static int +ZIPSetupDecode(TIFF* tif) +{ + ZIPState* sp = DecoderState(tif); + static const char module[] = "ZIPSetupDecode"; + + assert(sp != NULL); + + /* if we were last encoding, terminate this mode */ + if (sp->state & ZSTATE_INIT_ENCODE) { + deflateEnd(&sp->stream); + sp->state = 0; + } + + if (inflateInit(&sp->stream) != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: %s", tif->tif_name, sp->stream.msg); + return (0); + } else { + sp->state |= ZSTATE_INIT_DECODE; + return (1); + } +} + +/* + * Setup state for decoding a strip. + */ +static int +ZIPPreDecode(TIFF* tif, tsample_t s) +{ + ZIPState* sp = DecoderState(tif); + + (void) s; + assert(sp != NULL); + + if( (sp->state & ZSTATE_INIT_DECODE) == 0 ) + tif->tif_setupdecode( tif ); + + sp->stream.next_in = tif->tif_rawdata; + sp->stream.avail_in = tif->tif_rawcc; + return (inflateReset(&sp->stream) == Z_OK); +} + +static int +ZIPDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) +{ + ZIPState* sp = DecoderState(tif); + static const char module[] = "ZIPDecode"; + + (void) s; + assert(sp != NULL); + assert(sp->state == ZSTATE_INIT_DECODE); + + sp->stream.next_out = op; + sp->stream.avail_out = occ; + do { + int state = inflate(&sp->stream, Z_PARTIAL_FLUSH); + if (state == Z_STREAM_END) + break; + if (state == Z_DATA_ERROR) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Decoding error at scanline %d, %s", + tif->tif_name, tif->tif_row, sp->stream.msg); + if (inflateSync(&sp->stream) != Z_OK) + return (0); + continue; + } + if (state != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s", + tif->tif_name, sp->stream.msg); + return (0); + } + } while (sp->stream.avail_out > 0); + if (sp->stream.avail_out != 0) { + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Not enough data at scanline %d (short %d bytes)", + tif->tif_name, tif->tif_row, sp->stream.avail_out); + return (0); + } + return (1); +} + +static int +ZIPSetupEncode(TIFF* tif) +{ + ZIPState* sp = EncoderState(tif); + static const char module[] = "ZIPSetupEncode"; + + assert(sp != NULL); + if (sp->state & ZSTATE_INIT_DECODE) { + inflateEnd(&sp->stream); + sp->state = 0; + } + + if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: %s", tif->tif_name, sp->stream.msg); + return (0); + } else { + sp->state |= ZSTATE_INIT_ENCODE; + return (1); + } +} + +/* + * Reset encoding state at the start of a strip. + */ +static int +ZIPPreEncode(TIFF* tif, tsample_t s) +{ + ZIPState *sp = EncoderState(tif); + + (void) s; + assert(sp != NULL); + if( sp->state != ZSTATE_INIT_ENCODE ) + tif->tif_setupencode( tif ); + + sp->stream.next_out = tif->tif_rawdata; + sp->stream.avail_out = tif->tif_rawdatasize; + return (deflateReset(&sp->stream) == Z_OK); +} + +/* + * Encode a chunk of pixels. + */ +static int +ZIPEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) +{ + ZIPState *sp = EncoderState(tif); + static const char module[] = "ZIPEncode"; + + assert(sp != NULL); + assert(sp->state == ZSTATE_INIT_ENCODE); + + (void) s; + sp->stream.next_in = bp; + sp->stream.avail_in = cc; + do { + if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: Encoder error: %s", + tif->tif_name, sp->stream.msg); + return (0); + } + if (sp->stream.avail_out == 0) { + tif->tif_rawcc = tif->tif_rawdatasize; + TIFFFlushData1(tif); + sp->stream.next_out = tif->tif_rawdata; + sp->stream.avail_out = tif->tif_rawdatasize; + } + } while (sp->stream.avail_in > 0); + return (1); +} + +/* + * Finish off an encoded strip by flushing the last + * string and tacking on an End Of Information code. + */ +static int +ZIPPostEncode(TIFF* tif) +{ + ZIPState *sp = EncoderState(tif); + static const char module[] = "ZIPPostEncode"; + int state; + + sp->stream.avail_in = 0; + do { + state = deflate(&sp->stream, Z_FINISH); + switch (state) { + case Z_STREAM_END: + case Z_OK: + if ((int)sp->stream.avail_out != (int)tif->tif_rawdatasize) + { + tif->tif_rawcc = + tif->tif_rawdatasize - sp->stream.avail_out; + TIFFFlushData1(tif); + sp->stream.next_out = tif->tif_rawdata; + sp->stream.avail_out = tif->tif_rawdatasize; + } + break; + default: + TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s", + tif->tif_name, sp->stream.msg); + return (0); + } + } while (state != Z_STREAM_END); + return (1); +} + +static void +ZIPCleanup(TIFF* tif) +{ + ZIPState* sp = ZState(tif); + + assert(sp != 0); + + (void)TIFFPredictorCleanup(tif); + + tif->tif_tagmethods.vgetfield = sp->vgetparent; + tif->tif_tagmethods.vsetfield = sp->vsetparent; + + if (sp->state & ZSTATE_INIT_ENCODE) { + deflateEnd(&sp->stream); + sp->state = 0; + } else if( sp->state & ZSTATE_INIT_DECODE) { + inflateEnd(&sp->stream); + sp->state = 0; + } + _TIFFfree(sp); + tif->tif_data = NULL; + + _TIFFSetDefaultCompressionState(tif); +} + +static int +ZIPVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + ZIPState* sp = ZState(tif); + static const char module[] = "ZIPVSetField"; + + switch (tag) { + case TIFFTAG_ZIPQUALITY: + sp->zipquality = va_arg(ap, int); + if ( sp->state&ZSTATE_INIT_ENCODE ) { + if (deflateParams(&sp->stream, + sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) { + TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s", + tif->tif_name, sp->stream.msg); + return (0); + } + } + return (1); + default: + return (*sp->vsetparent)(tif, tag, ap); + } + /*NOTREACHED*/ +} + +static int +ZIPVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + ZIPState* sp = ZState(tif); + + switch (tag) { + case TIFFTAG_ZIPQUALITY: + *va_arg(ap, int*) = sp->zipquality; + break; + default: + return (*sp->vgetparent)(tif, tag, ap); + } + return (1); +} + +static const TIFFFieldInfo zipFieldInfo[] = { + { TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, FIELD_PSEUDO, + TRUE, FALSE, "" }, +}; + +int +TIFFInitZIP(TIFF* tif, int scheme) +{ + static const char module[] = "TIFFInitZIP"; + ZIPState* sp; + + assert( (scheme == COMPRESSION_DEFLATE) + || (scheme == COMPRESSION_ADOBE_DEFLATE)); + + /* + * Merge codec-specific tag information. + */ + if (!_TIFFMergeFieldInfo(tif, zipFieldInfo, + TIFFArrayCount(zipFieldInfo))) { + TIFFErrorExt(tif->tif_clientdata, module, + "Merging Deflate codec-specific tags failed"); + return 0; + } + + /* + * Allocate state block so tag methods have storage to record values. + */ + tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (ZIPState)); + if (tif->tif_data == NULL) + goto bad; + sp = ZState(tif); + sp->stream.zalloc = NULL; + sp->stream.zfree = NULL; + sp->stream.opaque = NULL; + sp->stream.data_type = Z_BINARY; + + /* + * Override parent get/set field methods. + */ + sp->vgetparent = tif->tif_tagmethods.vgetfield; + tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */ + sp->vsetparent = tif->tif_tagmethods.vsetfield; + tif->tif_tagmethods.vsetfield = ZIPVSetField; /* hook for codec tags */ + + /* Default values for codec-specific fields */ + sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */ + sp->state = 0; + + /* + * Install codec methods. + */ + tif->tif_setupdecode = ZIPSetupDecode; + tif->tif_predecode = ZIPPreDecode; + tif->tif_decoderow = ZIPDecode; + tif->tif_decodestrip = ZIPDecode; + tif->tif_decodetile = ZIPDecode; + tif->tif_setupencode = ZIPSetupEncode; + tif->tif_preencode = ZIPPreEncode; + tif->tif_postencode = ZIPPostEncode; + tif->tif_encoderow = ZIPEncode; + tif->tif_encodestrip = ZIPEncode; + tif->tif_encodetile = ZIPEncode; + tif->tif_cleanup = ZIPCleanup; + /* + * Setup predictor setup. + */ + (void) TIFFPredictorInit(tif); + return (1); +bad: + TIFFErrorExt(tif->tif_clientdata, module, + "No space for ZIP state block"); + return (0); +} +#endif /* ZIP_SUPORT */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tiff.h b/src/3rdparty/libtiff/libtiff/tiff.h new file mode 100644 index 0000000000..82116712a0 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiff.h @@ -0,0 +1,647 @@ +/* $Id: tiff.h,v 1.43 2006-10-05 15:20:40 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFF_ +#define _TIFF_ + +#include "tiffconf.h" + +/* + * Tag Image File Format (TIFF) + * + * Based on Rev 6.0 from: + * Developer's Desk + * Aldus Corporation + * 411 First Ave. South + * Suite 200 + * Seattle, WA 98104 + * 206-622-5500 + * + * (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf) + * + * For Big TIFF design notes see the following link + * http://www.remotesensing.org/libtiff/bigtiffdesign.html + */ +#define TIFF_VERSION 42 +#define TIFF_BIGTIFF_VERSION 43 + +#define TIFF_BIGENDIAN 0x4d4d +#define TIFF_LITTLEENDIAN 0x4949 +#define MDI_LITTLEENDIAN 0x5045 +#define MDI_BIGENDIAN 0x4550 +/* + * Intrinsic data types required by the file format: + * + * 8-bit quantities int8/uint8 + * 16-bit quantities int16/uint16 + * 32-bit quantities int32/uint32 + * strings unsigned char* + */ + +#ifndef HAVE_INT8 +typedef signed char int8; /* NB: non-ANSI compilers may not grok */ +#endif +typedef unsigned char uint8; +#ifndef HAVE_INT16 +typedef short int16; +#endif +typedef unsigned short uint16; /* sizeof (uint16) must == 2 */ +#if SIZEOF_INT == 4 +#ifndef HAVE_INT32 +typedef int int32; +#endif +typedef unsigned int uint32; /* sizeof (uint32) must == 4 */ +#elif SIZEOF_LONG == 4 +#ifndef HAVE_INT32 +typedef long int32; +#endif +typedef unsigned long uint32; /* sizeof (uint32) must == 4 */ +#endif + +/* For TIFFReassignTagToIgnore */ +enum TIFFIgnoreSense /* IGNORE tag table */ +{ + TIS_STORE, + TIS_EXTRACT, + TIS_EMPTY +}; + +/* + * TIFF header. + */ +typedef struct { + uint16 tiff_magic; /* magic number (defines byte order) */ +#define TIFF_MAGIC_SIZE 2 + uint16 tiff_version; /* TIFF version number */ +#define TIFF_VERSION_SIZE 2 + uint32 tiff_diroff; /* byte offset to first directory */ +#define TIFF_DIROFFSET_SIZE 4 +} TIFFHeader; + + +/* + * TIFF Image File Directories are comprised of a table of field + * descriptors of the form shown below. The table is sorted in + * ascending order by tag. The values associated with each entry are + * disjoint and may appear anywhere in the file (so long as they are + * placed on a word boundary). + * + * If the value is 4 bytes or less, then it is placed in the offset + * field to save space. If the value is less than 4 bytes, it is + * left-justified in the offset field. + */ +typedef struct { + uint16 tdir_tag; /* see below */ + uint16 tdir_type; /* data type; see below */ + uint32 tdir_count; /* number of items; length in spec */ + uint32 tdir_offset; /* byte offset to field data */ +} TIFFDirEntry; + +/* + * NB: In the comments below, + * - items marked with a + are obsoleted by revision 5.0, + * - items marked with a ! are introduced in revision 6.0. + * - items marked with a % are introduced post revision 6.0. + * - items marked with a $ are obsoleted by revision 6.0. + * - items marked with a & are introduced by Adobe DNG specification. + */ + +/* + * Tag data type information. + * + * Note: RATIONALs are the ratio of two 32-bit integer values. + */ +typedef enum { + TIFF_NOTYPE = 0, /* placeholder */ + TIFF_BYTE = 1, /* 8-bit unsigned integer */ + TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ + TIFF_SHORT = 3, /* 16-bit unsigned integer */ + TIFF_LONG = 4, /* 32-bit unsigned integer */ + TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ + TIFF_SBYTE = 6, /* !8-bit signed integer */ + TIFF_UNDEFINED = 7, /* !8-bit untyped data */ + TIFF_SSHORT = 8, /* !16-bit signed integer */ + TIFF_SLONG = 9, /* !32-bit signed integer */ + TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ + TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ + TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */ + TIFF_IFD = 13 /* %32-bit unsigned integer (offset) */ +} TIFFDataType; + +/* + * TIFF Tag Definitions. + */ +#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */ +#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */ +#define FILETYPE_PAGE 0x2 /* one page of many */ +#define FILETYPE_MASK 0x4 /* transparency mask */ +#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */ +#define OFILETYPE_IMAGE 1 /* full resolution image data */ +#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */ +#define OFILETYPE_PAGE 3 /* one page of many */ +#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */ +#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */ +#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */ +#define TIFFTAG_COMPRESSION 259 /* data compression technique */ +#define COMPRESSION_NONE 1 /* dump mode */ +#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */ +#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */ +#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */ +#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */ +#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */ +#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */ +#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */ +#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */ +#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */ +#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */ +#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */ +#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */ +/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT */ +#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */ +#define COMPRESSION_JBIG 34661 /* ISO JBIG */ +#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */ +#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */ +#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */ +#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */ +#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */ +#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */ +#define PHOTOMETRIC_RGB 2 /* RGB color model */ +#define PHOTOMETRIC_PALETTE 3 /* color map indexed */ +#define PHOTOMETRIC_MASK 4 /* $holdout mask */ +#define PHOTOMETRIC_SEPARATED 5 /* !color separations */ +#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */ +#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ +#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */ +#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */ +#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ +#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ +#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ +#define THRESHHOLD_BILEVEL 1 /* b&w art scan */ +#define THRESHHOLD_HALFTONE 2 /* or dithered scan */ +#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */ +#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */ +#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */ +#define TIFFTAG_FILLORDER 266 /* data order within a byte */ +#define FILLORDER_MSB2LSB 1 /* most significant -> least */ +#define FILLORDER_LSB2MSB 2 /* least significant -> most */ +#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */ +#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */ +#define TIFFTAG_MAKE 271 /* scanner manufacturer name */ +#define TIFFTAG_MODEL 272 /* scanner model name/number */ +#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */ +#define TIFFTAG_ORIENTATION 274 /* +image orientation */ +#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */ +#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */ +#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */ +#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */ +#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */ +#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */ +#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */ +#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */ +#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */ +#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */ +#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */ +#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */ +#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */ +#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */ +#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */ +#define TIFFTAG_PLANARCONFIG 284 /* storage organization */ +#define PLANARCONFIG_CONTIG 1 /* single image plane */ +#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */ +#define TIFFTAG_PAGENAME 285 /* page name image is from */ +#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */ +#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */ +#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */ +#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */ +#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */ +#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */ +#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */ +#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */ +#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ +#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */ +#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */ +#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */ +#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */ +#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */ +#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */ +#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */ +#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */ +#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */ +#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */ +#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */ +#define RESUNIT_NONE 1 /* no meaningful units */ +#define RESUNIT_INCH 2 /* english */ +#define RESUNIT_CENTIMETER 3 /* metric */ +#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */ +#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */ +#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */ +#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */ +#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */ +#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ +#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */ +#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */ +#define TIFFTAG_SOFTWARE 305 /* name & release */ +#define TIFFTAG_DATETIME 306 /* creation date and time */ +#define TIFFTAG_ARTIST 315 /* creator of image */ +#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */ +#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */ +#define PREDICTOR_NONE 1 /* no prediction scheme used */ +#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */ +#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */ +#define TIFFTAG_WHITEPOINT 318 /* image white point */ +#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */ +#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */ +#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */ +#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */ +#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */ +#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */ +#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */ +#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */ +#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */ +#define CLEANFAXDATA_CLEAN 0 /* no errors detected */ +#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */ +#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */ +#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */ +#define TIFFTAG_SUBIFD 330 /* subimage descriptors */ +#define TIFFTAG_INKSET 332 /* !inks in separated image */ +#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */ +#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */ +#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */ +#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */ +#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */ +#define TIFFTAG_TARGETPRINTER 337 /* !separation target */ +#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */ +#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */ +#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */ +#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */ +#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */ +#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */ +#define SAMPLEFORMAT_INT 2 /* !signed integer data */ +#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */ +#define SAMPLEFORMAT_VOID 4 /* !untyped data */ +#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */ +#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */ +#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */ +#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */ +#define TIFFTAG_CLIPPATH 343 /* %ClipPath + [Adobe TIFF technote 2] */ +#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits + [Adobe TIFF technote 2] */ +#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits + [Adobe TIFF technote 2] */ +#define TIFFTAG_INDEXED 346 /* %Indexed + [Adobe TIFF Technote 3] */ +#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */ +#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */ +/* + * Tags 512-521 are obsoleted by Technical Note #2 which specifies a + * revised JPEG-in-TIFF scheme. + */ +#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */ +#define JPEGPROC_BASELINE 1 /* !baseline sequential */ +#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */ +#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */ +#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */ +#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */ +#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */ +#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */ +#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */ +#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */ +#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */ +#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */ +#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */ +#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */ +#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */ +#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */ +#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */ +#define TIFFTAG_XMLPACKET 700 /* %XML packet + [Adobe XMP Specification, + January 2004 */ +#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID + [Adobe TIFF technote] */ +/* tags 32952-32956 are private tags registered to Island Graphics */ +#define TIFFTAG_REFPTS 32953 /* image reference points */ +#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */ +#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */ +#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */ +/* tags 32995-32999 are private tags registered to SGI */ +#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */ +#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */ +#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */ +#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */ +/* tags 33300-33309 are private tags registered to Pixar */ +/* + * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH + * are set when an image has been cropped out of a larger image. + * They reflect the size of the original uncropped image. + * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used + * to determine the position of the smaller image in the larger one. + */ +#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */ +#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */ + /* Tags 33302-33306 are used to identify special image modes and data + * used by Pixar's texture formats. + */ +#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */ +#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */ +#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */ +#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305 +#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 +/* tag 33405 is a private tag registered to Eastman Kodak */ +#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ +/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ +#define TIFFTAG_COPYRIGHT 33432 /* copyright string */ +/* IPTC TAG from RichTIFF specifications */ +#define TIFFTAG_RICHTIFFIPTC 33723 +/* 34016-34029 are reserved for ANSI IT8 TIFF/IT */ +#define TIFFTAG_STONITS 37439 /* Sample value to Nits */ +/* tag 34929 is a private tag registered to FedEx */ +#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */ +#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */ +/* Adobe Digital Negative (DNG) format tags */ +#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */ +#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */ +#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */ +#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model + name */ +#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space + mapping */ +#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */ +#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */ +#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for + the BlackLevel tag */ +#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */ +#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level + differences (columns) */ +#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level + differences (rows) */ +#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding + level */ +#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */ +#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image + area */ +#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image + area */ +#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space + transformation matrix 1 */ +#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space + transformation matrix 2 */ +#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */ +#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */ +#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction + matrix 1 */ +#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction + matrix 2 */ +#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw + values*/ +#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in + linear reference space */ +#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in + x-y chromaticity + coordinates */ +#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero + point */ +#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */ +#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of + sharpening */ +#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of + the green pixels in the + blue/green rows track the + values of the green pixels + in the red/green rows */ +#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */ +#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */ +#define TIFFTAG_LENSINFO 50736 /* info about the lens */ +#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */ +#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the + camera's anti-alias filter */ +#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */ +#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */ +#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote + tag is safe to preserve + along with the rest of the + EXIF data */ +#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */ +#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */ +#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */ +#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for + the raw image data */ +#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original + raw file */ +#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original + raw file */ +#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels + of the sensor */ +#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates + of fully masked pixels */ +#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */ +#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space + into ICC profile space */ +#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */ +#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */ +/* tag 65535 is an undefined tag used by Eastman Kodak */ +#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */ + +/* + * The following are ``pseudo tags'' that can be used to control + * codec-specific functionality. These tags are not written to file. + * Note that these values start at 0xffff+1 so that they'll never + * collide with Aldus-assigned tags. + * + * If you want your private pseudo tags ``registered'' (i.e. added to + * this file), please post a bug report via the tracking system at + * http://www.remotesensing.org/libtiff/bugs.html with the appropriate + * C definitions to add. + */ +#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */ +#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */ +#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */ +#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */ +#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */ +#define FAXMODE_WORDALIGN 0x0008 /* word align row */ +#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */ +#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */ +/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */ +#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */ +#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */ +#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */ +#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */ +#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */ +#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */ +/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */ +#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */ +#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */ +#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */ +#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */ +#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */ +#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */ +#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */ +#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */ +/* 65550-65556 are allocated to Oceana Matrix */ +#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */ +#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */ +#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */ +#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */ +#define DCSIMAGERFILTER_IR 0 /* infrared filter */ +#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */ +#define DCSIMAGERFILTER_CFA 2 /* color filter array */ +#define DCSIMAGERFILTER_OTHER 3 /* other filter */ +#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */ +#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */ +#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */ +#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */ +#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */ +#define TIFFTAG_DCSGAMMA 65554 /* gamma value */ +#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */ +#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */ +/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */ +#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */ +#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */ +/* 65559 is allocated to Oceana Matrix */ +#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */ +#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */ +#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */ +#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */ +#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */ +#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */ +#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/ +#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/ +#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */ + +/* + * EXIF tags + */ +#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */ +#define EXIFTAG_FNUMBER 33437 /* F number */ +#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */ +#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */ +#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */ +#define EXIFTAG_OECF 34856 /* Optoelectric conversion + factor */ +#define EXIFTAG_EXIFVERSION 36864 /* Exif version */ +#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original + data generation */ +#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital + data generation */ +#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */ +#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */ +#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */ +#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */ +#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */ +#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */ +#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */ +#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */ +#define EXIFTAG_METERINGMODE 37383 /* Metering mode */ +#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */ +#define EXIFTAG_FLASH 37385 /* Flash */ +#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */ +#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */ +#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */ +#define EXIFTAG_USERCOMMENT 37510 /* User comments */ +#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */ +#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */ +#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */ +#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */ +#define EXIFTAG_COLORSPACE 40961 /* Color space information */ +#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */ +#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */ +#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */ +#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */ +#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */ +#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */ +#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */ +#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */ +#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */ +#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */ +#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */ +#define EXIFTAG_FILESOURCE 41728 /* File source */ +#define EXIFTAG_SCENETYPE 41729 /* Scene type */ +#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */ +#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */ +#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */ +#define EXIFTAG_WHITEBALANCE 41987 /* White balance */ +#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */ +#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */ +#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_CONTRAST 41992 /* Contrast */ +#define EXIFTAG_SATURATION 41993 /* Saturation */ +#define EXIFTAG_SHARPNESS 41994 /* Sharpness */ +#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */ +#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_GAINCONTROL 41991 /* Gain control */ +#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */ + +#endif /* _TIFF_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.h b/src/3rdparty/libtiff/libtiff/tiffconf.h new file mode 100644 index 0000000000..1a012226c6 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiffconf.h @@ -0,0 +1,110 @@ +/* + Configuration defines for Qt. + This file maintained for backward compatibility. Do not use definitions + from this file in your programs. +*/ + +#ifndef _TIFFCONF_ +#define _TIFFCONF_ + +#include + +/* Define to 1 if the system has the type `int16'. */ +/* #undef HAVE_INT16 */ + +/* Define to 1 if the system has the type `int32'. */ +/* #undef HAVE_INT32 */ + +/* Define to 1 if the system has the type `int8'. */ +/* #undef HAVE_INT8 */ + +/* The size of a `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#if (QT_POINTER_SIZE == 8) && !defined(Q_OS_WIN64) +#define SIZEOF_LONG 8 +#else +#define SIZEOF_LONG 4 +#endif + +/* Compatibility stuff. */ + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#if (Q_BYTE_ORDER == Q_BIG_ENDIAN) +#define HOST_BIGENDIAN 1 +#else +#define HOST_BIGENDIAN 0 +#endif + +/* Support CCITT Group 3 & 4 algorithms */ +#define CCITT_SUPPORT 1 + +/* Support JPEG compression (requires IJG JPEG library) */ +/* #undef JPEG_SUPPORT */ + +/* Support LogLuv high dynamic range encoding */ +#define LOGLUV_SUPPORT 1 + +/* Support LZW algorithm */ +#define LZW_SUPPORT 1 + +/* Support NeXT 2-bit RLE algorithm */ +#define NEXT_SUPPORT 1 + +/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation + fails with unpatched IJG JPEG library) */ +/* #undef OJPEG_SUPPORT */ + +/* Support Macintosh PackBits algorithm */ +#define PACKBITS_SUPPORT 1 + +/* Support Pixar log-format algorithm (requires Zlib) */ +#define PIXARLOG_SUPPORT 1 + +/* Support ThunderScan 4-bit RLE algorithm */ +#define THUNDER_SUPPORT 1 + +/* Support Deflate compression */ +#define ZIP_SUPPORT 1 + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of ~8Kb to reduce memory usage) */ +#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP + +/* Enable SubIFD tag (330) support */ +#define SUBIFD_SUPPORT 1 + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* Support MS MDI magic number files as TIFF */ +#define MDI_SUPPORT 1 + +/* + * Feature support definitions. + * XXX: These macros are obsoleted. Don't use them in your apps! + * Macros stays here for backward compatibility and should be always defined. + */ +#define COLORIMETRY_SUPPORT +#define YCBCR_SUPPORT +#define CMYK_SUPPORT +#define ICC_SUPPORT +#define PHOTOSHOP_SUPPORT +#define IPTC_SUPPORT + +#endif /* _TIFFCONF_ */ diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.h.in b/src/3rdparty/libtiff/libtiff/tiffconf.h.in new file mode 100644 index 0000000000..1a52b37ada --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiffconf.h.in @@ -0,0 +1,103 @@ +/* + Configuration defines for installed libtiff. + This file maintained for backward compatibility. Do not use definitions + from this file in your programs. +*/ + +#ifndef _TIFFCONF_ +#define _TIFFCONF_ + +/* Define to 1 if the system has the type `int16'. */ +#undef HAVE_INT16 + +/* Define to 1 if the system has the type `int32'. */ +#undef HAVE_INT32 + +/* Define to 1 if the system has the type `int8'. */ +#undef HAVE_INT8 + +/* The size of a `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of a `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* Compatibility stuff. */ + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#undef HAVE_IEEEFP + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#undef HOST_FILLORDER + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#undef HOST_BIGENDIAN + +/* Support CCITT Group 3 & 4 algorithms */ +#undef CCITT_SUPPORT + +/* Support JPEG compression (requires IJG JPEG library) */ +#undef JPEG_SUPPORT + +/* Support JBIG compression (requires JBIG-KIT library) */ +#undef JBIG_SUPPORT + +/* Support LogLuv high dynamic range encoding */ +#undef LOGLUV_SUPPORT + +/* Support LZW algorithm */ +#undef LZW_SUPPORT + +/* Support NeXT 2-bit RLE algorithm */ +#undef NEXT_SUPPORT + +/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation + fails with unpatched IJG JPEG library) */ +#undef OJPEG_SUPPORT + +/* Support Macintosh PackBits algorithm */ +#undef PACKBITS_SUPPORT + +/* Support Pixar log-format algorithm (requires Zlib) */ +#undef PIXARLOG_SUPPORT + +/* Support ThunderScan 4-bit RLE algorithm */ +#undef THUNDER_SUPPORT + +/* Support Deflate compression */ +#undef ZIP_SUPPORT + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of ~8Kb to reduce memory usage) */ +#undef STRIPCHOP_DEFAULT + +/* Enable SubIFD tag (330) support */ +#undef SUBIFD_SUPPORT + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#undef DEFAULT_EXTRASAMPLE_AS_ALPHA + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#undef CHECK_JPEG_YCBCR_SUBSAMPLING + +/* Support MS MDI magic number files as TIFF */ +#undef MDI_SUPPORT + +/* + * Feature support definitions. + * XXX: These macros are obsoleted. Don't use them in your apps! + * Macros stays here for backward compatibility and should be always defined. + */ +#define COLORIMETRY_SUPPORT +#define YCBCR_SUPPORT +#define CMYK_SUPPORT +#define ICC_SUPPORT +#define PHOTOSHOP_SUPPORT +#define IPTC_SUPPORT + +#endif /* _TIFFCONF_ */ diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.vc.h b/src/3rdparty/libtiff/libtiff/tiffconf.vc.h new file mode 100644 index 0000000000..9a0b15205d --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiffconf.vc.h @@ -0,0 +1,109 @@ +/* + Configuration defines for installed libtiff. + This file maintained for backward compatibility. Do not use definitions + from this file in your programs. +*/ + +#ifndef _TIFFCONF_ +#define _TIFFCONF_ + +/* Define to 1 if the system has the type `int16'. */ +/* #undef HAVE_INT16 */ + +/* Define to 1 if the system has the type `int32'. */ +/* #undef HAVE_INT32 */ + +/* Define to 1 if the system has the type `int8'. */ +/* #undef HAVE_INT8 */ + +/* The size of a `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* Signed 64-bit type formatter */ +#define TIFF_INT64_FORMAT "%I64d" + +/* Signed 64-bit type */ +#define TIFF_INT64_T signed __int64 + +/* Unsigned 64-bit type formatter */ +#define TIFF_UINT64_FORMAT "%I64u" + +/* Unsigned 64-bit type */ +#define TIFF_UINT64_T unsigned __int64 + +/* Compatibility stuff. */ + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#define HOST_BIGENDIAN 0 + +/* Support CCITT Group 3 & 4 algorithms */ +#define CCITT_SUPPORT 1 + +/* Support JPEG compression (requires IJG JPEG library) */ +/* #undef JPEG_SUPPORT */ + +/* Support LogLuv high dynamic range encoding */ +#define LOGLUV_SUPPORT 1 + +/* Support LZW algorithm */ +#define LZW_SUPPORT 1 + +/* Support NeXT 2-bit RLE algorithm */ +#define NEXT_SUPPORT 1 + +/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation + fails with unpatched IJG JPEG library) */ +/* #undef OJPEG_SUPPORT */ + +/* Support Macintosh PackBits algorithm */ +#define PACKBITS_SUPPORT 1 + +/* Support Pixar log-format algorithm (requires Zlib) */ +/* #undef PIXARLOG_SUPPORT */ + +/* Support ThunderScan 4-bit RLE algorithm */ +#define THUNDER_SUPPORT 1 + +/* Support Deflate compression */ +/* #undef ZIP_SUPPORT */ + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of ~8Kb to reduce memory usage) */ +#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP + +/* Enable SubIFD tag (330) support */ +#define SUBIFD_SUPPORT 1 + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* + * Feature support definitions. + * XXX: These macros are obsoleted. Don't use them in your apps! + * Macros stays here for backward compatibility and should be always defined. + */ +#define COLORIMETRY_SUPPORT +#define YCBCR_SUPPORT +#define CMYK_SUPPORT +#define ICC_SUPPORT +#define PHOTOSHOP_SUPPORT +#define IPTC_SUPPORT + +#endif /* _TIFFCONF_ */ diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.wince.h b/src/3rdparty/libtiff/libtiff/tiffconf.wince.h new file mode 100644 index 0000000000..27fa239a92 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiffconf.wince.h @@ -0,0 +1,129 @@ +/* $Id: tiffconf.wince.h,v 1.1.2.1 2009-01-01 17:52:51 bfriesen Exp $ */ + +/* + * Windows CE platform tiffconf.wince.h + * Created by Mateusz Loskot (mateusz@loskot.net) + * + * NOTE: Requires WCELIBCEX library with wceex_* functions, + * It's an extension to C library on Windows CE platform. + * For example, HAVE_STDIO_H definition indicates there are + * following files available: + * stdio.h - from Windows CE / Windows Mobile SDK + * wce_stdio.h - from WCELIBCEX library + */ + + +/* + Configuration defines for installed libtiff. + This file maintained for backward compatibility. Do not use definitions + from this file in your programs. +*/ + +#ifndef _WIN32_WCE +# error This version of tif_config.h header is dedicated for Windows CE platform! +#endif + + +#ifndef _TIFFCONF_ +#define _TIFFCONF_ + +/* Define to 1 if the system has the type `int16'. */ +/* #undef HAVE_INT16 */ + +/* Define to 1 if the system has the type `int32'. */ +/* #undef HAVE_INT32 */ + +/* Define to 1 if the system has the type `int8'. */ +/* #undef HAVE_INT8 */ + +/* The size of a `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of a `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* Signed 64-bit type formatter */ +#define TIFF_INT64_FORMAT "%I64d" + +/* Signed 64-bit type */ +#define TIFF_INT64_T signed __int64 + +/* Unsigned 64-bit type formatter */ +#define TIFF_UINT64_FORMAT "%I64u" + +/* Unsigned 64-bit type */ +#define TIFF_UINT64_T unsigned __int64 + +/* Compatibility stuff. */ + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#define HOST_BIGENDIAN 0 + +/* Support CCITT Group 3 & 4 algorithms */ +#define CCITT_SUPPORT 1 + +/* Support JPEG compression (requires IJG JPEG library) */ +/* #undef JPEG_SUPPORT */ + +/* Support LogLuv high dynamic range encoding */ +#define LOGLUV_SUPPORT 1 + +/* Support LZW algorithm */ +#define LZW_SUPPORT 1 + +/* Support NeXT 2-bit RLE algorithm */ +#define NEXT_SUPPORT 1 + +/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation + fails with unpatched IJG JPEG library) */ +/* #undef OJPEG_SUPPORT */ + +/* Support Macintosh PackBits algorithm */ +#define PACKBITS_SUPPORT 1 + +/* Support Pixar log-format algorithm (requires Zlib) */ +/* #undef PIXARLOG_SUPPORT */ + +/* Support ThunderScan 4-bit RLE algorithm */ +#define THUNDER_SUPPORT 1 + +/* Support Deflate compression */ +/* #undef ZIP_SUPPORT */ + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of ~8Kb to reduce memory usage) */ +#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP + +/* Enable SubIFD tag (330) support */ +#define SUBIFD_SUPPORT 1 + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* + * Feature support definitions. + * XXX: These macros are obsoleted. Don't use them in your apps! + * Macros stays here for backward compatibility and should be always defined. + */ +#define COLORIMETRY_SUPPORT +#define YCBCR_SUPPORT +#define CMYK_SUPPORT +#define ICC_SUPPORT +#define PHOTOSHOP_SUPPORT +#define IPTC_SUPPORT + +#endif /* _TIFFCONF_ */ diff --git a/src/3rdparty/libtiff/libtiff/tiffio.h b/src/3rdparty/libtiff/libtiff/tiffio.h new file mode 100644 index 0000000000..0f2735f95d --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiffio.h @@ -0,0 +1,521 @@ +/* $Id: tiffio.h,v 1.56.2.3 2009-01-01 00:10:43 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFFIO_ +#define _TIFFIO_ + +/* + * TIFF I/O Library Definitions. + */ +#include "tiff.h" +#include "tiffvers.h" + +/* + * TIFF is defined as an incomplete type to hide the + * library's internal data structures from clients. + */ +typedef struct tiff TIFF; + +/* + * The following typedefs define the intrinsic size of + * data types used in the *exported* interfaces. These + * definitions depend on the proper definition of types + * in tiff.h. Note also that the varargs interface used + * to pass tag types and values uses the types defined in + * tiff.h directly. + * + * NB: ttag_t is unsigned int and not unsigned short because + * ANSI C requires that the type before the ellipsis be a + * promoted type (i.e. one of int, unsigned int, pointer, + * or double) and because we defined pseudo-tags that are + * outside the range of legal Aldus-assigned tags. + * NB: tsize_t is int32 and not uint32 because some functions + * return -1. + * NB: toff_t is not off_t for many reasons; TIFFs max out at + * 32-bit file offsets being the most important, and to ensure + * that it is unsigned, rather than signed. + */ +typedef uint32 ttag_t; /* directory tag */ +typedef uint16 tdir_t; /* directory index */ +typedef uint16 tsample_t; /* sample number */ +typedef uint32 tstrile_t; /* strip or tile number */ +typedef tstrile_t tstrip_t; /* strip number */ +typedef tstrile_t ttile_t; /* tile number */ +typedef int32 tsize_t; /* i/o size in bytes */ +typedef void* tdata_t; /* image data ref */ +typedef uint32 toff_t; /* file offset */ + +#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) +#define __WIN32__ +#endif + +#include + +/* + * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c + * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c). + * + * By default tif_unix.c is assumed. + */ + +#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) +# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO) +# define AVOID_WIN32_FILEIO +# endif +#endif + +#if defined(USE_WIN32_FILEIO) +# define VC_EXTRALEAN +# include +# ifdef __WIN32__ +DECLARE_HANDLE(thandle_t); /* Win32 file handle */ +# else +typedef HFILE thandle_t; /* client data handle */ +# endif /* __WIN32__ */ +#else +typedef void* thandle_t; /* client data handle */ +#endif /* USE_WIN32_FILEIO */ + +/* + * Flags to pass to TIFFPrintDirectory to control + * printing of data structures that are potentially + * very large. Bit-or these flags to enable printing + * multiple items. + */ +#define TIFFPRINT_NONE 0x0 /* no extra info */ +#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ +#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ +#define TIFFPRINT_COLORMAP 0x4 /* colormap */ +#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ +#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ +#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ + +/* + * Colour conversion stuff + */ + +/* reference white */ +#define D65_X0 (95.0470F) +#define D65_Y0 (100.0F) +#define D65_Z0 (108.8827F) + +#define D50_X0 (96.4250F) +#define D50_Y0 (100.0F) +#define D50_Z0 (82.4680F) + +/* Structure for holding information about a display device. */ + +typedef unsigned char TIFFRGBValue; /* 8-bit samples */ + +typedef struct { + float d_mat[3][3]; /* XYZ -> luminance matrix */ + float d_YCR; /* Light o/p for reference white */ + float d_YCG; + float d_YCB; + uint32 d_Vrwr; /* Pixel values for ref. white */ + uint32 d_Vrwg; + uint32 d_Vrwb; + float d_Y0R; /* Residual light for black pixel */ + float d_Y0G; + float d_Y0B; + float d_gammaR; /* Gamma values for the three guns */ + float d_gammaG; + float d_gammaB; +} TIFFDisplay; + +typedef struct { /* YCbCr->RGB support */ + TIFFRGBValue* clamptab; /* range clamping table */ + int* Cr_r_tab; + int* Cb_b_tab; + int32* Cr_g_tab; + int32* Cb_g_tab; + int32* Y_tab; +} TIFFYCbCrToRGB; + +typedef struct { /* CIE Lab 1976->RGB support */ + int range; /* Size of conversion table */ +#define CIELABTORGB_TABLE_RANGE 1500 + float rstep, gstep, bstep; + float X0, Y0, Z0; /* Reference white point */ + TIFFDisplay display; + float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */ + float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */ + float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */ +} TIFFCIELabToRGB; + +/* + * RGBA-style image support. + */ +typedef struct _TIFFRGBAImage TIFFRGBAImage; +/* + * The image reading and conversion routines invoke + * ``put routines'' to copy/image/whatever tiles of + * raw image data. A default set of routines are + * provided to convert/copy raw image data to 8-bit + * packed ABGR format rasters. Applications can supply + * alternate routines that unpack the data into a + * different format or, for example, unpack the data + * and draw the unpacked raster on the display. + */ +typedef void (*tileContigRoutine) + (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, + unsigned char*); +typedef void (*tileSeparateRoutine) + (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, + unsigned char*, unsigned char*, unsigned char*, unsigned char*); +/* + * RGBA-reader state. + */ +struct _TIFFRGBAImage { + TIFF* tif; /* image handle */ + int stoponerr; /* stop on read error */ + int isContig; /* data is packed/separate */ + int alpha; /* type of alpha data present */ + uint32 width; /* image width */ + uint32 height; /* image height */ + uint16 bitspersample; /* image bits/sample */ + uint16 samplesperpixel; /* image samples/pixel */ + uint16 orientation; /* image orientation */ + uint16 req_orientation; /* requested orientation */ + uint16 photometric; /* image photometric interp */ + uint16* redcmap; /* colormap pallete */ + uint16* greencmap; + uint16* bluecmap; + /* get image data routine */ + int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32); + /* put decoded strip/tile */ + union { + void (*any)(TIFFRGBAImage*); + tileContigRoutine contig; + tileSeparateRoutine separate; + } put; + TIFFRGBValue* Map; /* sample mapping array */ + uint32** BWmap; /* black&white map */ + uint32** PALmap; /* palette image map */ + TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */ + TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */ + + int row_offset; + int col_offset; +}; + +/* + * Macros for extracting components from the + * packed ABGR form returned by TIFFReadRGBAImage. + */ +#define TIFFGetR(abgr) ((abgr) & 0xff) +#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff) +#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff) +#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff) + +/* + * A CODEC is a software package that implements decoding, + * encoding, or decoding+encoding of a compression algorithm. + * The library provides a collection of builtin codecs. + * More codecs may be registered through calls to the library + * and/or the builtin implementations may be overridden. + */ +typedef int (*TIFFInitMethod)(TIFF*, int); +typedef struct { + char* name; + uint16 scheme; + TIFFInitMethod init; +} TIFFCodec; + +#include +#include + +/* share internal LogLuv conversion routines? */ +#ifndef LOGLUV_PUBLIC +#define LOGLUV_PUBLIC 1 +#endif + +#if !defined(__GNUC__) && !defined(__attribute__) +# define __attribute__(x) /*nothing*/ +#endif + +#if defined(c_plusplus) || defined(__cplusplus) +extern "C" { +#endif +typedef void (*TIFFErrorHandler)(const char*, const char*, va_list); +typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list); +typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t); +typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int); +typedef int (*TIFFCloseProc)(thandle_t); +typedef toff_t (*TIFFSizeProc)(thandle_t); +typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*); +typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t); +typedef void (*TIFFExtendProc)(TIFF*); + +extern const char* TIFFGetVersion(void); + +extern const TIFFCodec* TIFFFindCODEC(uint16); +extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod); +extern void TIFFUnRegisterCODEC(TIFFCodec*); +extern int TIFFIsCODECConfigured(uint16); +extern TIFFCodec* TIFFGetConfiguredCODECs(void); + +/* + * Auxiliary functions. + */ + +extern tdata_t _TIFFmalloc(tsize_t); +extern tdata_t _TIFFrealloc(tdata_t, tsize_t); +extern void _TIFFmemset(tdata_t, int, tsize_t); +extern void _TIFFmemcpy(tdata_t, const tdata_t, tsize_t); +extern int _TIFFmemcmp(const tdata_t, const tdata_t, tsize_t); +extern void _TIFFfree(tdata_t); + +/* +** Stuff, related to tag handling and creating custom tags. +*/ +extern int TIFFGetTagListCount( TIFF * ); +extern ttag_t TIFFGetTagListEntry( TIFF *, int tag_index ); + +#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */ +#define TIFF_VARIABLE -1 /* marker for variable length tags */ +#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */ +#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */ + +#define FIELD_CUSTOM 65 + +typedef struct { + ttag_t field_tag; /* field's tag */ + short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */ + short field_writecount; /* write count/TIFF_VARIABLE */ + TIFFDataType field_type; /* type of associated data */ + unsigned short field_bit; /* bit in fieldsset bit vector */ + unsigned char field_oktochange; /* if true, can change while writing */ + unsigned char field_passcount; /* if true, pass dir count on set */ + char *field_name; /* ASCII name */ +} TIFFFieldInfo; + +typedef struct _TIFFTagValue { + const TIFFFieldInfo *info; + int count; + void *value; +} TIFFTagValue; + +extern void TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int); +extern const TIFFFieldInfo* TIFFFindFieldInfo(TIFF*, ttag_t, TIFFDataType); +extern const TIFFFieldInfo* TIFFFindFieldInfoByName(TIFF* , const char *, + TIFFDataType); +extern const TIFFFieldInfo* TIFFFieldWithTag(TIFF*, ttag_t); +extern const TIFFFieldInfo* TIFFFieldWithName(TIFF*, const char *); + +typedef int (*TIFFVSetMethod)(TIFF*, ttag_t, va_list); +typedef int (*TIFFVGetMethod)(TIFF*, ttag_t, va_list); +typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long); + +typedef struct { + TIFFVSetMethod vsetfield; /* tag set routine */ + TIFFVGetMethod vgetfield; /* tag get routine */ + TIFFPrintMethod printdir; /* directory print routine */ +} TIFFTagMethods; + +extern TIFFTagMethods *TIFFAccessTagMethods( TIFF * ); +extern void *TIFFGetClientInfo( TIFF *, const char * ); +extern void TIFFSetClientInfo( TIFF *, void *, const char * ); + +extern void TIFFCleanup(TIFF*); +extern void TIFFClose(TIFF*); +extern int TIFFFlush(TIFF*); +extern int TIFFFlushData(TIFF*); +extern int TIFFGetField(TIFF*, ttag_t, ...); +extern int TIFFVGetField(TIFF*, ttag_t, va_list); +extern int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...); +extern int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list); +extern int TIFFReadDirectory(TIFF*); +extern int TIFFReadCustomDirectory(TIFF*, toff_t, const TIFFFieldInfo[], + size_t); +extern int TIFFReadEXIFDirectory(TIFF*, toff_t); +extern tsize_t TIFFScanlineSize(TIFF*); +extern tsize_t TIFFOldScanlineSize(TIFF*); +extern tsize_t TIFFNewScanlineSize(TIFF*); +extern tsize_t TIFFRasterScanlineSize(TIFF*); +extern tsize_t TIFFStripSize(TIFF*); +extern tsize_t TIFFRawStripSize(TIFF*, tstrip_t); +extern tsize_t TIFFVStripSize(TIFF*, uint32); +extern tsize_t TIFFTileRowSize(TIFF*); +extern tsize_t TIFFTileSize(TIFF*); +extern tsize_t TIFFVTileSize(TIFF*, uint32); +extern uint32 TIFFDefaultStripSize(TIFF*, uint32); +extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*); +extern int TIFFFileno(TIFF*); +extern int TIFFSetFileno(TIFF*, int); +extern thandle_t TIFFClientdata(TIFF*); +extern thandle_t TIFFSetClientdata(TIFF*, thandle_t); +extern int TIFFGetMode(TIFF*); +extern int TIFFSetMode(TIFF*, int); +extern int TIFFIsTiled(TIFF*); +extern int TIFFIsByteSwapped(TIFF*); +extern int TIFFIsUpSampled(TIFF*); +extern int TIFFIsMSB2LSB(TIFF*); +extern int TIFFIsBigEndian(TIFF*); +extern TIFFReadWriteProc TIFFGetReadProc(TIFF*); +extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*); +extern TIFFSeekProc TIFFGetSeekProc(TIFF*); +extern TIFFCloseProc TIFFGetCloseProc(TIFF*); +extern TIFFSizeProc TIFFGetSizeProc(TIFF*); +extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*); +extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*); +extern uint32 TIFFCurrentRow(TIFF*); +extern tdir_t TIFFCurrentDirectory(TIFF*); +extern tdir_t TIFFNumberOfDirectories(TIFF*); +extern uint32 TIFFCurrentDirOffset(TIFF*); +extern tstrip_t TIFFCurrentStrip(TIFF*); +extern ttile_t TIFFCurrentTile(TIFF*); +extern int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t); +extern int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t); +extern int TIFFSetupStrips(TIFF *); +extern int TIFFWriteCheck(TIFF*, int, const char *); +extern void TIFFFreeDirectory(TIFF*); +extern int TIFFCreateDirectory(TIFF*); +extern int TIFFLastDirectory(TIFF*); +extern int TIFFSetDirectory(TIFF*, tdir_t); +extern int TIFFSetSubDirectory(TIFF*, uint32); +extern int TIFFUnlinkDirectory(TIFF*, tdir_t); +extern int TIFFSetField(TIFF*, ttag_t, ...); +extern int TIFFVSetField(TIFF*, ttag_t, va_list); +extern int TIFFWriteDirectory(TIFF *); +extern int TIFFCheckpointDirectory(TIFF *); +extern int TIFFRewriteDirectory(TIFF *); +extern int TIFFReassignTagToIgnore(enum TIFFIgnoreSense, int); + +#if defined(c_plusplus) || defined(__cplusplus) +extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0); +extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t = 0); +extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t = 0); +extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0); +extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, + int = ORIENTATION_BOTLEFT, int = 0); +#else +extern void TIFFPrintDirectory(TIFF*, FILE*, long); +extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t); +extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t); +extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int); +extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int); +#endif + +extern int TIFFReadRGBAStrip(TIFF*, tstrip_t, uint32 * ); +extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * ); +extern int TIFFRGBAImageOK(TIFF*, char [1024]); +extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]); +extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32); +extern void TIFFRGBAImageEnd(TIFFRGBAImage*); +extern TIFF* TIFFOpen(const char*, const char*); +# ifdef __WIN32__ +extern TIFF* TIFFOpenW(const wchar_t*, const char*); +# endif /* __WIN32__ */ +extern TIFF* TIFFFdOpen(int, const char*, const char*); +extern TIFF* TIFFClientOpen(const char*, const char*, + thandle_t, + TIFFReadWriteProc, TIFFReadWriteProc, + TIFFSeekProc, TIFFCloseProc, + TIFFSizeProc, + TIFFMapFileProc, TIFFUnmapFileProc); +extern const char* TIFFFileName(TIFF*); +extern const char* TIFFSetFileName(TIFF*, const char *); +extern void TIFFError(const char*, const char*, ...) __attribute__((format (printf,2,3))); +extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((format (printf,3,4))); +extern void TIFFWarning(const char*, const char*, ...) __attribute__((format (printf,2,3))); +extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((format (printf,3,4))); +extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler); +extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt); +extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler); +extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt); +extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc); +extern ttile_t TIFFComputeTile(TIFF*, uint32, uint32, uint32, tsample_t); +extern int TIFFCheckTile(TIFF*, uint32, uint32, uint32, tsample_t); +extern ttile_t TIFFNumberOfTiles(TIFF*); +extern tsize_t TIFFReadTile(TIFF*, + tdata_t, uint32, uint32, uint32, tsample_t); +extern tsize_t TIFFWriteTile(TIFF*, + tdata_t, uint32, uint32, uint32, tsample_t); +extern tstrip_t TIFFComputeStrip(TIFF*, uint32, tsample_t); +extern tstrip_t TIFFNumberOfStrips(TIFF*); +extern tsize_t TIFFReadEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); +extern tsize_t TIFFReadRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); +extern tsize_t TIFFReadEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); +extern tsize_t TIFFReadRawTile(TIFF*, ttile_t, tdata_t, tsize_t); +extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); +extern tsize_t TIFFWriteRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); +extern tsize_t TIFFWriteEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); +extern tsize_t TIFFWriteRawTile(TIFF*, ttile_t, tdata_t, tsize_t); +extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */ +extern void TIFFSetWriteOffset(TIFF*, toff_t); +extern void TIFFSwabShort(uint16*); +extern void TIFFSwabLong(uint32*); +extern void TIFFSwabDouble(double*); +extern void TIFFSwabArrayOfShort(uint16*, unsigned long); +extern void TIFFSwabArrayOfTriples(uint8*, unsigned long); +extern void TIFFSwabArrayOfLong(uint32*, unsigned long); +extern void TIFFSwabArrayOfDouble(double*, unsigned long); +extern void TIFFReverseBits(unsigned char *, unsigned long); +extern const unsigned char* TIFFGetBitRevTable(int); + +#ifdef LOGLUV_PUBLIC +#define U_NEU 0.210526316 +#define V_NEU 0.473684211 +#define UVSCALE 410. +extern double LogL16toY(int); +extern double LogL10toY(int); +extern void XYZtoRGB24(float*, uint8*); +extern int uv_decode(double*, double*, int); +extern void LogLuv24toXYZ(uint32, float*); +extern void LogLuv32toXYZ(uint32, float*); +#if defined(c_plusplus) || defined(__cplusplus) +extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER); +extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER); +extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER); +extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER); +extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER); +#else +extern int LogL16fromY(double, int); +extern int LogL10fromY(double, int); +extern int uv_encode(double, double, int); +extern uint32 LogLuv24fromXYZ(float*, int); +extern uint32 LogLuv32fromXYZ(float*, int); +#endif +#endif /* LOGLUV_PUBLIC */ + +extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, TIFFDisplay *, float*); +extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32, + float *, float *, float *); +extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float, + uint32 *, uint32 *, uint32 *); + +extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*); +extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32, + uint32 *, uint32 *, uint32 *); + +#if defined(c_plusplus) || defined(__cplusplus) +} +#endif + +#endif /* _TIFFIO_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tiffio.hxx b/src/3rdparty/libtiff/libtiff/tiffio.hxx new file mode 100644 index 0000000000..ac7b9f2cd1 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiffio.hxx @@ -0,0 +1,42 @@ +/* $Id: tiffio.hxx,v 1.1 2004/11/21 16:12:08 dron Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFFIO_HXX_ +#define _TIFFIO_HXX_ + +/* + * TIFF I/O library definitions which provide C++ streams API. + */ + +#include +#include "tiff.h" + +extern TIFF* TIFFStreamOpen(const char*, std::ostream *); +extern TIFF* TIFFStreamOpen(const char*, std::istream *); + +#endif /* _TIFFIO_HXX_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tiffiop.h b/src/3rdparty/libtiff/libtiff/tiffiop.h new file mode 100644 index 0000000000..30bb19cfca --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiffiop.h @@ -0,0 +1,343 @@ +/* $Id: tiffiop.h,v 1.51.2.1 2009-01-06 19:08:09 bfriesen Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _TIFFIOP_ +#define _TIFFIOP_ +/* + * ``Library-private'' definitions. + */ + +#include "tif_config.h" + +#ifdef HAVE_FCNTL_H +# include +#endif + +#ifdef HAVE_SYS_TYPES_H +#if !defined(Q_OS_WINCE) +# include +#else +# include +# include +#endif +#endif + +#ifdef HAVE_STRING_H +# include +#endif + +#ifdef HAVE_ASSERT_H +# include +#else +# define assert(x) +#endif + +#ifdef HAVE_SEARCH_H +# include +#else +extern void *lfind(const void *, const void *, size_t *, size_t, + int (*)(const void *, const void *)); +#endif + +/* + Libtiff itself does not require a 64-bit type, but bundled TIFF + utilities may use it. +*/ +typedef TIFF_INT64_T int64; +typedef TIFF_UINT64_T uint64; + +#include "tiffio.h" +#include "tif_dir.h" + +#ifndef STRIP_SIZE_DEFAULT +# define STRIP_SIZE_DEFAULT 8192 +#endif + +#define streq(a,b) (strcmp(a,b) == 0) + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +typedef struct client_info { + struct client_info *next; + void *data; + char *name; +} TIFFClientInfoLink; + +/* + * Typedefs for ``method pointers'' used internally. + */ +typedef unsigned char tidataval_t; /* internal image data value type */ +typedef tidataval_t* tidata_t; /* reference to internal image data */ + +typedef void (*TIFFVoidMethod)(TIFF*); +typedef int (*TIFFBoolMethod)(TIFF*); +typedef int (*TIFFPreMethod)(TIFF*, tsample_t); +typedef int (*TIFFCodeMethod)(TIFF*, tidata_t, tsize_t, tsample_t); +typedef int (*TIFFSeekMethod)(TIFF*, uint32); +typedef void (*TIFFPostMethod)(TIFF*, tidata_t, tsize_t); +typedef uint32 (*TIFFStripMethod)(TIFF*, uint32); +typedef void (*TIFFTileMethod)(TIFF*, uint32*, uint32*); + +struct tiff { + char* tif_name; /* name of open file */ + int tif_fd; /* open file descriptor */ + int tif_mode; /* open mode (O_*) */ + uint32 tif_flags; +#define TIFF_FILLORDER 0x00003 /* natural bit fill order for machine */ +#define TIFF_DIRTYHEADER 0x00004 /* header must be written on close */ +#define TIFF_DIRTYDIRECT 0x00008 /* current directory must be written */ +#define TIFF_BUFFERSETUP 0x00010 /* data buffers setup */ +#define TIFF_CODERSETUP 0x00020 /* encoder/decoder setup done */ +#define TIFF_BEENWRITING 0x00040 /* written 1+ scanlines to file */ +#define TIFF_SWAB 0x00080 /* byte swap file information */ +#define TIFF_NOBITREV 0x00100 /* inhibit bit reversal logic */ +#define TIFF_MYBUFFER 0x00200 /* my raw data buffer; free on close */ +#define TIFF_ISTILED 0x00400 /* file is tile, not strip- based */ +#define TIFF_MAPPED 0x00800 /* file is mapped into memory */ +#define TIFF_POSTENCODE 0x01000 /* need call to postencode routine */ +#define TIFF_INSUBIFD 0x02000 /* currently writing a subifd */ +#define TIFF_UPSAMPLED 0x04000 /* library is doing data up-sampling */ +#define TIFF_STRIPCHOP 0x08000 /* enable strip chopping support */ +#define TIFF_HEADERONLY 0x10000 /* read header only, do not process */ + /* the first directory */ +#define TIFF_NOREADRAW 0x20000 /* skip reading of raw uncompressed */ + /* image data */ +#define TIFF_INCUSTOMIFD 0x40000 /* currently writing a custom IFD */ + toff_t tif_diroff; /* file offset of current directory */ + toff_t tif_nextdiroff; /* file offset of following directory */ + toff_t* tif_dirlist; /* list of offsets to already seen */ + /* directories to prevent IFD looping */ + tsize_t tif_dirlistsize;/* number of entires in offset list */ + uint16 tif_dirnumber; /* number of already seen directories */ + TIFFDirectory tif_dir; /* internal rep of current directory */ + TIFFDirectory tif_customdir; /* custom IFDs are separated from + the main ones */ + TIFFHeader tif_header; /* file's header block */ + const int* tif_typeshift; /* data type shift counts */ + const long* tif_typemask; /* data type masks */ + uint32 tif_row; /* current scanline */ + tdir_t tif_curdir; /* current directory (index) */ + tstrip_t tif_curstrip; /* current strip for read/write */ + toff_t tif_curoff; /* current offset for read/write */ + toff_t tif_dataoff; /* current offset for writing dir */ +/* SubIFD support */ + uint16 tif_nsubifd; /* remaining subifds to write */ + toff_t tif_subifdoff; /* offset for patching SubIFD link */ +/* tiling support */ + uint32 tif_col; /* current column (offset by row too) */ + ttile_t tif_curtile; /* current tile for read/write */ + tsize_t tif_tilesize; /* # of bytes in a tile */ +/* compression scheme hooks */ + int tif_decodestatus; + TIFFBoolMethod tif_setupdecode;/* called once before predecode */ + TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */ + TIFFBoolMethod tif_setupencode;/* called once before preencode */ + int tif_encodestatus; + TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */ + TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */ + TIFFCodeMethod tif_decoderow; /* scanline decoding routine */ + TIFFCodeMethod tif_encoderow; /* scanline encoding routine */ + TIFFCodeMethod tif_decodestrip;/* strip decoding routine */ + TIFFCodeMethod tif_encodestrip;/* strip encoding routine */ + TIFFCodeMethod tif_decodetile; /* tile decoding routine */ + TIFFCodeMethod tif_encodetile; /* tile encoding routine */ + TIFFVoidMethod tif_close; /* cleanup-on-close routine */ + TIFFSeekMethod tif_seek; /* position within a strip routine */ + TIFFVoidMethod tif_cleanup; /* cleanup state routine */ + TIFFStripMethod tif_defstripsize;/* calculate/constrain strip size */ + TIFFTileMethod tif_deftilesize;/* calculate/constrain tile size */ + tidata_t tif_data; /* compression scheme private data */ +/* input/output buffering */ + tsize_t tif_scanlinesize;/* # of bytes in a scanline */ + tsize_t tif_scanlineskew;/* scanline skew for reading strips */ + tidata_t tif_rawdata; /* raw data buffer */ + tsize_t tif_rawdatasize;/* # of bytes in raw data buffer */ + tidata_t tif_rawcp; /* current spot in raw buffer */ + tsize_t tif_rawcc; /* bytes unread from raw buffer */ +/* memory-mapped file support */ + tidata_t tif_base; /* base of mapped file */ + toff_t tif_size; /* size of mapped file region (bytes) + FIXME: it should be tsize_t */ + TIFFMapFileProc tif_mapproc; /* map file method */ + TIFFUnmapFileProc tif_unmapproc;/* unmap file method */ +/* input/output callback methods */ + thandle_t tif_clientdata; /* callback parameter */ + TIFFReadWriteProc tif_readproc; /* read method */ + TIFFReadWriteProc tif_writeproc;/* write method */ + TIFFSeekProc tif_seekproc; /* lseek method */ + TIFFCloseProc tif_closeproc; /* close method */ + TIFFSizeProc tif_sizeproc; /* filesize method */ +/* post-decoding support */ + TIFFPostMethod tif_postdecode; /* post decoding routine */ +/* tag support */ + TIFFFieldInfo** tif_fieldinfo; /* sorted table of registered tags */ + size_t tif_nfields; /* # entries in registered tag table */ + const TIFFFieldInfo *tif_foundfield;/* cached pointer to already found tag */ + TIFFTagMethods tif_tagmethods; /* tag get/set/print routines */ + TIFFClientInfoLink *tif_clientinfo; /* extra client information. */ +}; + +#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */ + +#define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0) +#define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0) +#define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0) +#define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0) +#define TIFFReadFile(tif, buf, size) \ + ((*(tif)->tif_readproc)((tif)->tif_clientdata,buf,size)) +#define TIFFWriteFile(tif, buf, size) \ + ((*(tif)->tif_writeproc)((tif)->tif_clientdata,buf,size)) +#define TIFFSeekFile(tif, off, whence) \ + ((*(tif)->tif_seekproc)((tif)->tif_clientdata,(toff_t)(off),whence)) +#define TIFFCloseFile(tif) \ + ((*(tif)->tif_closeproc)((tif)->tif_clientdata)) +#define TIFFGetFileSize(tif) \ + ((*(tif)->tif_sizeproc)((tif)->tif_clientdata)) +#define TIFFMapFileContents(tif, paddr, psize) \ + ((*(tif)->tif_mapproc)((tif)->tif_clientdata,paddr,psize)) +#define TIFFUnmapFileContents(tif, addr, size) \ + ((*(tif)->tif_unmapproc)((tif)->tif_clientdata,addr,size)) + +/* + * Default Read/Seek/Write definitions. + */ +#ifndef ReadOK +#define ReadOK(tif, buf, size) \ + (TIFFReadFile(tif, (tdata_t) buf, (tsize_t)(size)) == (tsize_t)(size)) +#endif +#ifndef SeekOK +#define SeekOK(tif, off) \ + (TIFFSeekFile(tif, (toff_t) off, SEEK_SET) == (toff_t) off) +#endif +#ifndef WriteOK +#define WriteOK(tif, buf, size) \ + (TIFFWriteFile(tif, (tdata_t) buf, (tsize_t) size) == (tsize_t) size) +#endif + +/* NB: the uint32 casts are to silence certain ANSI-C compilers */ +#define TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) +#define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) +#define TIFFroundup(x, y) (TIFFhowmany(x,y)*(y)) + +#define TIFFmax(A,B) ((A)>(B)?(A):(B)) +#define TIFFmin(A,B) ((A)<(B)?(A):(B)) + +#define TIFFArrayCount(a) (sizeof (a) / sizeof ((a)[0])) + +#if defined(__cplusplus) +extern "C" { +#endif +extern int _TIFFgetMode(const char*, const char*); +extern int _TIFFNoRowEncode(TIFF*, tidata_t, tsize_t, tsample_t); +extern int _TIFFNoStripEncode(TIFF*, tidata_t, tsize_t, tsample_t); +extern int _TIFFNoTileEncode(TIFF*, tidata_t, tsize_t, tsample_t); +extern int _TIFFNoRowDecode(TIFF*, tidata_t, tsize_t, tsample_t); +extern int _TIFFNoStripDecode(TIFF*, tidata_t, tsize_t, tsample_t); +extern int _TIFFNoTileDecode(TIFF*, tidata_t, tsize_t, tsample_t); +extern void _TIFFNoPostDecode(TIFF*, tidata_t, tsize_t); +extern int _TIFFNoPreCode (TIFF*, tsample_t); +extern int _TIFFNoSeek(TIFF*, uint32); +extern void _TIFFSwab16BitData(TIFF*, tidata_t, tsize_t); +extern void _TIFFSwab24BitData(TIFF*, tidata_t, tsize_t); +extern void _TIFFSwab32BitData(TIFF*, tidata_t, tsize_t); +extern void _TIFFSwab64BitData(TIFF*, tidata_t, tsize_t); +extern int TIFFFlushData1(TIFF*); +extern int TIFFDefaultDirectory(TIFF*); +extern void _TIFFSetDefaultCompressionState(TIFF*); +extern int TIFFSetCompressionScheme(TIFF*, int); +extern int TIFFSetDefaultCompressionState(TIFF*); +extern uint32 _TIFFDefaultStripSize(TIFF*, uint32); +extern void _TIFFDefaultTileSize(TIFF*, uint32*, uint32*); +extern int _TIFFDataSize(TIFFDataType); + +extern void _TIFFsetByteArray(void**, void*, uint32); +extern void _TIFFsetString(char**, char*); +extern void _TIFFsetShortArray(uint16**, uint16*, uint32); +extern void _TIFFsetLongArray(uint32**, uint32*, uint32); +extern void _TIFFsetFloatArray(float**, float*, uint32); +extern void _TIFFsetDoubleArray(double**, double*, uint32); + +extern void _TIFFprintAscii(FILE*, const char*); +extern void _TIFFprintAsciiTag(FILE*, const char*, const char*); + +extern TIFFErrorHandler _TIFFwarningHandler; +extern TIFFErrorHandler _TIFFerrorHandler; +extern TIFFErrorHandlerExt _TIFFwarningHandlerExt; +extern TIFFErrorHandlerExt _TIFFerrorHandlerExt; + +extern tdata_t _TIFFCheckMalloc(TIFF*, size_t, size_t, const char*); +extern tdata_t _TIFFCheckRealloc(TIFF*, tdata_t, size_t, size_t, const char*); + +extern int TIFFInitDumpMode(TIFF*, int); +#ifdef PACKBITS_SUPPORT +extern int TIFFInitPackBits(TIFF*, int); +#endif +#ifdef CCITT_SUPPORT +extern int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int); +extern int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int); +#endif +#ifdef THUNDER_SUPPORT +extern int TIFFInitThunderScan(TIFF*, int); +#endif +#ifdef NEXT_SUPPORT +extern int TIFFInitNeXT(TIFF*, int); +#endif +#ifdef LZW_SUPPORT +extern int TIFFInitLZW(TIFF*, int); +#endif +#ifdef OJPEG_SUPPORT +extern int TIFFInitOJPEG(TIFF*, int); +#endif +#ifdef JPEG_SUPPORT +extern int TIFFInitJPEG(TIFF*, int); +#endif +#ifdef JBIG_SUPPORT +extern int TIFFInitJBIG(TIFF*, int); +#endif +#ifdef ZIP_SUPPORT +extern int TIFFInitZIP(TIFF*, int); +#endif +#ifdef PIXARLOG_SUPPORT +extern int TIFFInitPixarLog(TIFF*, int); +#endif +#ifdef LOGLUV_SUPPORT +extern int TIFFInitSGILog(TIFF*, int); +#endif +#ifdef VMS +extern const TIFFCodec _TIFFBuiltinCODECS[]; +#else +extern TIFFCodec _TIFFBuiltinCODECS[]; +#endif + +#if defined(__cplusplus) +} +#endif +#endif /* _TIFFIOP_ */ + +/* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/src/3rdparty/libtiff/libtiff/tiffvers.h b/src/3rdparty/libtiff/libtiff/tiffvers.h new file mode 100644 index 0000000000..7108541bc2 --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/tiffvers.h @@ -0,0 +1,9 @@ +#define TIFFLIB_VERSION_STR "LIBTIFF, Version 3.9.2\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." +/* + * This define can be used in code that requires + * compilation-related definitions specific to a + * version or versions of the library. Runtime + * version checking should be done based on the + * string returned by TIFFGetVersion. + */ +#define TIFFLIB_VERSION 20091104 diff --git a/src/3rdparty/libtiff/libtiff/uvcode.h b/src/3rdparty/libtiff/libtiff/uvcode.h new file mode 100644 index 0000000000..5b2d7d71fa --- /dev/null +++ b/src/3rdparty/libtiff/libtiff/uvcode.h @@ -0,0 +1,173 @@ +/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */ +#define UV_SQSIZ (float)0.003500 +#define UV_NDIVS 16289 +#define UV_VSTART (float)0.016940 +#define UV_NVS 163 +static struct { + float ustart; + short nus, ncum; +} uv_row[UV_NVS] = { + { (float)0.247663, 4, 0 }, + { (float)0.243779, 6, 4 }, + { (float)0.241684, 7, 10 }, + { (float)0.237874, 9, 17 }, + { (float)0.235906, 10, 26 }, + { (float)0.232153, 12, 36 }, + { (float)0.228352, 14, 48 }, + { (float)0.226259, 15, 62 }, + { (float)0.222371, 17, 77 }, + { (float)0.220410, 18, 94 }, + { (float)0.214710, 21, 112 }, + { (float)0.212714, 22, 133 }, + { (float)0.210721, 23, 155 }, + { (float)0.204976, 26, 178 }, + { (float)0.202986, 27, 204 }, + { (float)0.199245, 29, 231 }, + { (float)0.195525, 31, 260 }, + { (float)0.193560, 32, 291 }, + { (float)0.189878, 34, 323 }, + { (float)0.186216, 36, 357 }, + { (float)0.186216, 36, 393 }, + { (float)0.182592, 38, 429 }, + { (float)0.179003, 40, 467 }, + { (float)0.175466, 42, 507 }, + { (float)0.172001, 44, 549 }, + { (float)0.172001, 44, 593 }, + { (float)0.168612, 46, 637 }, + { (float)0.168612, 46, 683 }, + { (float)0.163575, 49, 729 }, + { (float)0.158642, 52, 778 }, + { (float)0.158642, 52, 830 }, + { (float)0.158642, 52, 882 }, + { (float)0.153815, 55, 934 }, + { (float)0.153815, 55, 989 }, + { (float)0.149097, 58, 1044 }, + { (float)0.149097, 58, 1102 }, + { (float)0.142746, 62, 1160 }, + { (float)0.142746, 62, 1222 }, + { (float)0.142746, 62, 1284 }, + { (float)0.138270, 65, 1346 }, + { (float)0.138270, 65, 1411 }, + { (float)0.138270, 65, 1476 }, + { (float)0.132166, 69, 1541 }, + { (float)0.132166, 69, 1610 }, + { (float)0.126204, 73, 1679 }, + { (float)0.126204, 73, 1752 }, + { (float)0.126204, 73, 1825 }, + { (float)0.120381, 77, 1898 }, + { (float)0.120381, 77, 1975 }, + { (float)0.120381, 77, 2052 }, + { (float)0.120381, 77, 2129 }, + { (float)0.112962, 82, 2206 }, + { (float)0.112962, 82, 2288 }, + { (float)0.112962, 82, 2370 }, + { (float)0.107450, 86, 2452 }, + { (float)0.107450, 86, 2538 }, + { (float)0.107450, 86, 2624 }, + { (float)0.107450, 86, 2710 }, + { (float)0.100343, 91, 2796 }, + { (float)0.100343, 91, 2887 }, + { (float)0.100343, 91, 2978 }, + { (float)0.095126, 95, 3069 }, + { (float)0.095126, 95, 3164 }, + { (float)0.095126, 95, 3259 }, + { (float)0.095126, 95, 3354 }, + { (float)0.088276, 100, 3449 }, + { (float)0.088276, 100, 3549 }, + { (float)0.088276, 100, 3649 }, + { (float)0.088276, 100, 3749 }, + { (float)0.081523, 105, 3849 }, + { (float)0.081523, 105, 3954 }, + { (float)0.081523, 105, 4059 }, + { (float)0.081523, 105, 4164 }, + { (float)0.074861, 110, 4269 }, + { (float)0.074861, 110, 4379 }, + { (float)0.074861, 110, 4489 }, + { (float)0.074861, 110, 4599 }, + { (float)0.068290, 115, 4709 }, + { (float)0.068290, 115, 4824 }, + { (float)0.068290, 115, 4939 }, + { (float)0.068290, 115, 5054 }, + { (float)0.063573, 119, 5169 }, + { (float)0.063573, 119, 5288 }, + { (float)0.063573, 119, 5407 }, + { (float)0.063573, 119, 5526 }, + { (float)0.057219, 124, 5645 }, + { (float)0.057219, 124, 5769 }, + { (float)0.057219, 124, 5893 }, + { (float)0.057219, 124, 6017 }, + { (float)0.050985, 129, 6141 }, + { (float)0.050985, 129, 6270 }, + { (float)0.050985, 129, 6399 }, + { (float)0.050985, 129, 6528 }, + { (float)0.050985, 129, 6657 }, + { (float)0.044859, 134, 6786 }, + { (float)0.044859, 134, 6920 }, + { (float)0.044859, 134, 7054 }, + { (float)0.044859, 134, 7188 }, + { (float)0.040571, 138, 7322 }, + { (float)0.040571, 138, 7460 }, + { (float)0.040571, 138, 7598 }, + { (float)0.040571, 138, 7736 }, + { (float)0.036339, 142, 7874 }, + { (float)0.036339, 142, 8016 }, + { (float)0.036339, 142, 8158 }, + { (float)0.036339, 142, 8300 }, + { (float)0.032139, 146, 8442 }, + { (float)0.032139, 146, 8588 }, + { (float)0.032139, 146, 8734 }, + { (float)0.032139, 146, 8880 }, + { (float)0.027947, 150, 9026 }, + { (float)0.027947, 150, 9176 }, + { (float)0.027947, 150, 9326 }, + { (float)0.023739, 154, 9476 }, + { (float)0.023739, 154, 9630 }, + { (float)0.023739, 154, 9784 }, + { (float)0.023739, 154, 9938 }, + { (float)0.019504, 158, 10092 }, + { (float)0.019504, 158, 10250 }, + { (float)0.019504, 158, 10408 }, + { (float)0.016976, 161, 10566 }, + { (float)0.016976, 161, 10727 }, + { (float)0.016976, 161, 10888 }, + { (float)0.016976, 161, 11049 }, + { (float)0.012639, 165, 11210 }, + { (float)0.012639, 165, 11375 }, + { (float)0.012639, 165, 11540 }, + { (float)0.009991, 168, 11705 }, + { (float)0.009991, 168, 11873 }, + { (float)0.009991, 168, 12041 }, + { (float)0.009016, 170, 12209 }, + { (float)0.009016, 170, 12379 }, + { (float)0.009016, 170, 12549 }, + { (float)0.006217, 173, 12719 }, + { (float)0.006217, 173, 12892 }, + { (float)0.005097, 175, 13065 }, + { (float)0.005097, 175, 13240 }, + { (float)0.005097, 175, 13415 }, + { (float)0.003909, 177, 13590 }, + { (float)0.003909, 177, 13767 }, + { (float)0.002340, 177, 13944 }, + { (float)0.002389, 170, 14121 }, + { (float)0.001068, 164, 14291 }, + { (float)0.001653, 157, 14455 }, + { (float)0.000717, 150, 14612 }, + { (float)0.001614, 143, 14762 }, + { (float)0.000270, 136, 14905 }, + { (float)0.000484, 129, 15041 }, + { (float)0.001103, 123, 15170 }, + { (float)0.001242, 115, 15293 }, + { (float)0.001188, 109, 15408 }, + { (float)0.001011, 103, 15517 }, + { (float)0.000709, 97, 15620 }, + { (float)0.000301, 89, 15717 }, + { (float)0.002416, 82, 15806 }, + { (float)0.003251, 76, 15888 }, + { (float)0.003246, 69, 15964 }, + { (float)0.004141, 62, 16033 }, + { (float)0.005963, 55, 16095 }, + { (float)0.008839, 47, 16150 }, + { (float)0.010490, 40, 16197 }, + { (float)0.016994, 31, 16237 }, + { (float)0.023659, 21, 16268 }, +}; diff --git a/src/3rdparty/libtiff/nmake.opt b/src/3rdparty/libtiff/nmake.opt new file mode 100644 index 0000000000..7e882d2d4a --- /dev/null +++ b/src/3rdparty/libtiff/nmake.opt @@ -0,0 +1,218 @@ +# $Id: nmake.opt,v 1.18 2006/06/07 16:33:45 dron Exp $ +# +# Copyright (C) 2004, Andrey Kiselev +# +# Permission to use, copy, modify, distribute, and sell this software and +# its documentation for any purpose is hereby granted without fee, provided +# that (i) the above copyright notices and this permission notice appear in +# all copies of the software and related documentation, and (ii) the names of +# Sam Leffler and Silicon Graphics may not be used in any advertising or +# publicity relating to the software without the specific, prior written +# permission of Sam Leffler and Silicon Graphics. +# +# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +# +# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +# OF THIS SOFTWARE. + +# Compile time parameters for MS Visual C++ compiler. +# You may edit this file to specify building options. + +# +###### Edit the following lines to choose a feature set you need. ####### +# + +# +# Select WINMODE_CONSOLE to build a library which reports errors to stderr, or +# WINMODE_WINDOWED to build such that errors are reported via MessageBox(). +# +WINMODE_CONSOLE = 1 +#WINMODE_WINDOWED = 1 + +# +# Comment out the following lines to disable internal codecs. +# +# Support for CCITT Group 3 & 4 algorithms +CCITT_SUPPORT = 1 +# Support for Macintosh PackBits algorithm +PACKBITS_SUPPORT = 1 +# Support for LZW algorithm +LZW_SUPPORT = 1 +# Support for ThunderScan 4-bit RLE algorithm +THUNDER_SUPPORT = 1 +# Support for NeXT 2-bit RLE algorithm +NEXT_SUPPORT = 1 +# Support for LogLuv high dynamic range encoding +LOGLUV_SUPPORT = 1 + +# +# Uncomment and edit following lines to enable JPEG support. +# +#JPEG_SUPPORT = 1 +#JPEGDIR = d:/projects/jpeg-6b +#JPEG_INCLUDE = -I$(JPEGDIR) +#JPEG_LIB = $(JPEGDIR)/Release/jpeg.lib + +# +# Uncomment and edit following lines to enable ZIP support +# (required for Deflate compression and Pixar log-format) +# +#ZIP_SUPPORT = 1 +#ZLIBDIR = d:/projects/zlib-1.2.1 +#ZLIB_INCLUDE = -I$(ZLIBDIR) +#ZLIB_LIB = $(ZLIBDIR)/zlib.lib + +# +# Uncomment and edit following lines to enable ISO JBIG support +# +#JBIG_SUPPORT = 1 +#JBIGDIR = d:/projects/jbigkit +#JBIG_INCLUDE = -I$(JBIGDIR)/libjbig +#JBIG_LIB = $(JBIGDIR)/libjbig/jbig.lib + +# +# Uncomment following line to enable Pixar log-format algorithm +# (Zlib required). +# +#PIXARLOG_SUPPORT = 1 + +# +# Comment out the following lines to disable strip chopping +# (whether or not to convert single-strip uncompressed images to mutiple +# strips of specified size to reduce memory usage). Default strip size +# is 8192 bytes, it can be configured via the STRIP_SIZE_DEFAULT parameter +# +STRIPCHOP_SUPPORT = 1 +STRIP_SIZE_DEFAULT = 8192 + +# +# Comment out the following lines to disable treating the fourth sample with +# no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA +# files but don't mark the alpha properly. +# +EXTRASAMPLE_AS_ALPHA_SUPPORT = 1 + +# +# Comment out the following lines to disable picking up YCbCr subsampling +# info from the JPEG data stream to support files lacking the tag. +# See Bug 168 in Bugzilla, and JPEGFixupTestSubsampling() for details. +# +CHECK_JPEG_YCBCR_SUBSAMPLING = 1 + +# +####################### Compiler related options. ####################### +# + +# +# Pick debug or optimized build flags. We default to an optimized build +# with no debugging information. +# NOTE: /EHsc option required if you want to build the C++ stream API +# +OPTFLAGS = /Ox /MD /EHsc /W3 /D_CRT_SECURE_NO_DEPRECATE +#OPTFLAGS = /Zi + +# +# Uncomment following line to enable using Windows Common RunTime Library +# instead of Windows specific system calls. See notes on top of tif_unix.c +# module for details. +# +USE_WIN_CRT_LIB = 1 + +# Compiler specific options. You may probably want to adjust compilation +# parameters in CFLAGS variable. Refer to your compiler documentation +# for the option reference. +# +MAKE = nmake /nologo +CC = cl /nologo +CXX = cl /nologo +AR = lib /nologo +LD = link /nologo + +CFLAGS = $(OPTFLAGS) $(INCL) $(EXTRAFLAGS) +CXXFLAGS = $(OPTFLAGS) $(INCL) $(EXTRAFLAGS) +EXTRAFLAGS = +LIBS = + +# Name of the output shared library +DLLNAME = libtiff.dll + +# +########### There is nothing to edit below this line normally. ########### +# + +# Set the native cpu bit order +EXTRAFLAGS = -DFILLODER_LSB2MSB $(EXTRAFLAGS) + +!IFDEF WINMODE_WINDOWED +EXTRAFLAGS = -DTIF_PLATFORM_WINDOWED $(EXTRAFLAGS) +LIBS = user32.lib $(LIBS) +!ELSE +EXTRAFLAGS = -DTIF_PLATFORM_CONSOLE $(EXTRAFLAGS) +!ENDIF + +# Codec stuff +!IFDEF CCITT_SUPPORT +EXTRAFLAGS = -DCCITT_SUPPORT $(EXTRAFLAGS) +!ENDIF + +!IFDEF PACKBITS_SUPPORT +EXTRAFLAGS = -DPACKBITS_SUPPORT $(EXTRAFLAGS) +!ENDIF + +!IFDEF LZW_SUPPORT +EXTRAFLAGS = -DLZW_SUPPORT $(EXTRAFLAGS) +!ENDIF + +!IFDEF THUNDER_SUPPORT +EXTRAFLAGS = -DTHUNDER_SUPPORT $(EXTRAFLAGS) +!ENDIF + +!IFDEF NEXT_SUPPORT +EXTRAFLAGS = -DNEXT_SUPPORT $(EXTRAFLAGS) +!ENDIF + +!IFDEF LOGLUV_SUPPORT +EXTRAFLAGS = -DLOGLUV_SUPPORT $(EXTRAFLAGS) +!ENDIF + +!IFDEF JPEG_SUPPORT +LIBS = $(LIBS) $(JPEG_LIB) +EXTRAFLAGS = -DJPEG_SUPPORT -DOJPEG_SUPPORT $(EXTRAFLAGS) +!ENDIF + +!IFDEF ZIP_SUPPORT +LIBS = $(LIBS) $(ZLIB_LIB) +EXTRAFLAGS = -DZIP_SUPPORT $(EXTRAFLAGS) +!IFDEF PIXARLOG_SUPPORT +EXTRAFLAGS = -DPIXARLOG_SUPPORT $(EXTRAFLAGS) +!ENDIF +!ENDIF + +!IFDEF JBIG_SUPPORT +LIBS = $(LIBS) $(JBIG_LIB) +EXTRAFLAGS = -DJBIG_SUPPORT $(EXTRAFLAGS) +!ENDIF + +!IFDEF STRIPCHOP_SUPPORT +EXTRAFLAGS = -DSTRIPCHOP_DEFAULT=TIFF_STRIPCHOP -DSTRIP_SIZE_DEFAULT=$(STRIP_SIZE_DEFAULT) $(EXTRAFLAGS) +!ENDIF + +!IFDEF EXTRASAMPLE_AS_ALPHA_SUPPORT +EXTRAFLAGS = -DDEFAULT_EXTRASAMPLE_AS_ALPHA $(EXTRAFLAGS) +!ENDIF + +!IFDEF CHECK_JPEG_YCBCR_SUBSAMPLING +EXTRAFLAGS = -DCHECK_JPEG_YCBCR_SUBSAMPLING $(EXTRAFLAGS) +!ENDIF + +!IFDEF USE_WIN_CRT_LIB +EXTRAFLAGS = -DAVOID_WIN32_FILEIO $(EXTRAFLAGS) +!ELSE +EXTRAFLAGS = -DUSE_WIN32_FILEIO $(EXTRAFLAGS) +!ENDIF diff --git a/src/3rdparty/libtiff/port/dummy.c b/src/3rdparty/libtiff/port/dummy.c new file mode 100644 index 0000000000..1cbda6afa1 --- /dev/null +++ b/src/3rdparty/libtiff/port/dummy.c @@ -0,0 +1,12 @@ +/* $Id: dummy.c,v 1.2.2.1 2007/03/21 14:53:46 dron Exp $ */ + +/* + * Dummy function, just to be ensure that the library always will be created. + */ + +void +libport_dummy_function() +{ + return; +} + diff --git a/src/3rdparty/libtiff/port/getopt.c b/src/3rdparty/libtiff/port/getopt.c new file mode 100644 index 0000000000..0138c89e30 --- /dev/null +++ b/src/3rdparty/libtiff/port/getopt.c @@ -0,0 +1,124 @@ +/* $Id: getopt.c,v 1.2 2005/07/07 16:34:06 dron Exp $ */ + +/* + * Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if 0 +static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; +__RCSID("$NetBSD: getopt.c,v 1.26 2003/08/07 16:43:40 agc Exp $"); +#endif + +#include +#include + +int opterr = 1, /* if error message should be printed */ + optind = 1, /* index into parent argv vector */ + optopt, /* character checked for validity */ + optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" + +/* + * getopt -- + * Parse argc/argv argument vector. + */ +int +getopt(int argc, char * const argv[], const char *optstring) +{ + static char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + if (optreset || *place == 0) { /* update scanning pointer */ + optreset = 0; + place = argv[optind]; + if (optind >= argc || *place++ != '-') { + /* Argument is absent or is not an option */ + place = EMSG; + return (-1); + } + optopt = *place++; + if (optopt == '-' && *place == 0) { + /* "--" => end of options */ + ++optind; + place = EMSG; + return (-1); + } + if (optopt == 0) { + /* Solitary '-', treat as a '-' option + if the program (eg su) is looking for it. */ + place = EMSG; + if (strchr(optstring, '-') == NULL) + return -1; + optopt = '-'; + } + } else + optopt = *place++; + + /* See if option letter is one the caller wanted... */ + if (optopt == ':' || (oli = strchr(optstring, optopt)) == NULL) { + if (*place == 0) + ++optind; + if (opterr && *optstring != ':') + (void)fprintf(stderr, + "unknown option -- %c\n", optopt); + return (BADCH); + } + + /* Does this option need an argument? */ + if (oli[1] != ':') { + /* don't need argument */ + optarg = NULL; + if (*place == 0) + ++optind; + } else { + /* Option-argument is either the rest of this argument or the + entire next argument. */ + if (*place) + optarg = place; + else if (argc > ++optind) + optarg = argv[optind]; + else { + /* option-argument absent */ + place = EMSG; + if (*optstring == ':') + return (BADARG); + if (opterr) + (void)fprintf(stderr, + "option requires an argument -- %c\n", + optopt); + return (BADCH); + } + place = EMSG; + ++optind; + } + return (optopt); /* return option letter */ +} diff --git a/src/3rdparty/libtiff/port/lfind.c b/src/3rdparty/libtiff/port/lfind.c new file mode 100644 index 0000000000..64b261ca36 --- /dev/null +++ b/src/3rdparty/libtiff/port/lfind.c @@ -0,0 +1,62 @@ +/* $Id: lfind.c,v 1.4 2007/01/15 18:40:39 mloskot Exp $ */ + +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Roger L. Snyder. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if 0 +static char sccsid[] = "@(#)lsearch.c 8.1 (Berkeley) 6/4/93"; +__RCSID("$NetBSD: lsearch.c,v 1.2 2005/07/06 15:47:15 drochner Exp $"); +#endif + +#ifdef _WIN32_WCE +# include +#else +# include +#endif + +#ifndef NULL +# define NULL 0 +#endif + +void * +lfind(const void *key, const void *base, size_t *nmemb, size_t size, + int(*compar)(const void *, const void *)) +{ + char *element, *end; + + end = (char *)base + *nmemb * size; + for (element = (char *)base; element < end; element += size) + if (!compar(element, key)) /* key found */ + return element; + + return NULL; +} diff --git a/src/3rdparty/libtiff/port/libport.h b/src/3rdparty/libtiff/port/libport.h new file mode 100644 index 0000000000..e3413f7af2 --- /dev/null +++ b/src/3rdparty/libtiff/port/libport.h @@ -0,0 +1,51 @@ +/* $Id: libport.h,v 1.2.2.2 2009-11-02 14:47:41 bfriesen Exp $ */ + +/* + * Copyright (c) 2009 Frank Warmerdam + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _LIBPORT_ +#define _LIBPORT_ + +int getopt(int argc, char * const argv[], const char *optstring); +extern char *optarg; +extern int opterr; +extern int optind; +extern int optopt; + +int strcasecmp(const char *s1, const char *s2); + +#ifndef HAVE_GETOPT +# define HAVE_GETOPT 1 +#endif + +#if 0 +unsigned long strtoul(const char *nptr, char **endptr, int base); +#endif + +#if 0 +void * +lfind(const void *key, const void *base, size_t *nmemb, size_t size, + int(*compar)(const void *, const void *)); +#endif + +#endif /* ndef _LIBPORT_ */ diff --git a/src/3rdparty/libtiff/port/strcasecmp.c b/src/3rdparty/libtiff/port/strcasecmp.c new file mode 100644 index 0000000000..2422304b12 --- /dev/null +++ b/src/3rdparty/libtiff/port/strcasecmp.c @@ -0,0 +1,50 @@ +/* $Id: strcasecmp.c,v 1.2 2005/07/07 16:34:06 dron Exp $ */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if 0 +static char sccsid[] = "@(#)strcasecmp.c 8.1 (Berkeley) 6/4/93"; +__RCSID("$NetBSD: strcasecmp.c,v 1.16 2003/08/07 16:43:49 agc Exp $"); +#endif + +#include +#include + +int +strcasecmp(const char *s1, const char *s2) +{ + const unsigned char *us1 = (const unsigned char *)s1, + *us2 = (const unsigned char *)s2; + + while (tolower(*us1) == tolower(*us2++)) + if (*us1++ == '\0') + return (0); + return (tolower(*us1) - tolower(*--us2)); +} diff --git a/src/3rdparty/libtiff/port/strtoul.c b/src/3rdparty/libtiff/port/strtoul.c new file mode 100644 index 0000000000..f7a9a1a565 --- /dev/null +++ b/src/3rdparty/libtiff/port/strtoul.c @@ -0,0 +1,109 @@ +/* $Id: strtoul.c,v 1.2 2005/07/07 16:34:06 dron Exp $ */ + +/* + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if 0 +static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; +__RCSID("$NetBSD: strtoul.c,v 1.16 2003/08/07 16:43:45 agc Exp $"); +#endif + +#include +#include +#include +#include + +/* + * Convert a string to an unsigned long integer. + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +unsigned long +strtoul(const char *nptr, char **endptr, int base) +{ + const char *s; + unsigned long acc, cutoff; + int c; + int neg, any, cutlim; + + /* + * See strtol for comments as to the logic used. + */ + s = nptr; + do { + c = (unsigned char) *s++; + } while (isspace(c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + cutoff = ULONG_MAX / (unsigned long)base; + cutlim = (int)(ULONG_MAX % (unsigned long)base); + for (acc = 0, any = 0;; c = (unsigned char) *s++) { + if (isdigit(c)) + c -= '0'; + else if (isalpha(c)) + c -= isupper(c) ? 'A' - 10 : 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0) + continue; + if (acc > cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + acc = ULONG_MAX; + errno = ERANGE; + } else { + any = 1; + acc *= (unsigned long)base; + acc += c; + } + } + if (neg && any > 0) + acc = -acc; + if (endptr != 0) + /* LINTED interface specification */ + *endptr = (char *)(any ? s - 1 : nptr); + return (acc); +} diff --git a/src/3rdparty/md4/md4.cpp b/src/3rdparty/md4/md4.cpp new file mode 100644 index 0000000000..94ac6adf58 --- /dev/null +++ b/src/3rdparty/md4/md4.cpp @@ -0,0 +1,265 @@ +/* + * MD4 (RFC-1320) message digest. + * Modified from MD5 code by Andrey Panin + * + * Written by Solar Designer in 2001, and placed in + * the public domain. There's absolutely no warranty. + * + * This differs from Colin Plumb's older public domain implementation in + * that no 32-bit integer data type is required, there's no compile-time + * endianness configuration, and the function prototypes match OpenSSL's. + * The primary goals are portability and ease of use. + * + * This implementation is meant to be fast, but not as fast as possible. + * Some known optimizations are not included to reduce source code size + * and avoid compile-time configuration. + */ + +#include "md4.h" + +#include + +QT_BEGIN_NAMESPACE + +/* + * The basic MD4 functions. + */ +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) + +/* + * The MD4 transformation for all four rounds. + */ +#define STEP(f, a, b, c, d, x, s) \ + (a) += f((b), (c), (d)) + (x); \ + (a) = ((a) << (s)) | ((a) >> (32 - (s))) + + +/* + * SET reads 4 input bytes in little-endian byte order and stores them + * in a properly aligned word in host byte order. + * + * The check for little-endian architectures which tolerate unaligned + * memory accesses is just an optimization. Nothing will break if it + * doesn't work. + */ +#if defined(__i386__) || defined(__x86_64__) +#define SET(n) \ + (*(const quint32 *)&ptr[(n) * 4]) +#define GET(n) \ + SET(n) +#else +#define SET(n) \ + (ctx->block[(n)] = \ + (quint32)ptr[(n) * 4] | \ + ((quint32)ptr[(n) * 4 + 1] << 8) | \ + ((quint32)ptr[(n) * 4 + 2] << 16) | \ + ((quint32)ptr[(n) * 4 + 3] << 24)) +#define GET(n) \ + (ctx->block[(n)]) +#endif + +/* + * This processes one or more 64-byte data blocks, but does NOT update + * the bit counters. There're no alignment requirements. + */ +static const unsigned char *body(struct md4_context *ctx, const unsigned char *data, size_t size) +{ + const unsigned char *ptr; + quint32 a, b, c, d; + quint32 saved_a, saved_b, saved_c, saved_d; + + ptr = data; + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + + do { + saved_a = a; + saved_b = b; + saved_c = c; + saved_d = d; + +/* Round 1 */ + STEP(F, a, b, c, d, SET( 0), 3); + STEP(F, d, a, b, c, SET( 1), 7); + STEP(F, c, d, a, b, SET( 2), 11); + STEP(F, b, c, d, a, SET( 3), 19); + + STEP(F, a, b, c, d, SET( 4), 3); + STEP(F, d, a, b, c, SET( 5), 7); + STEP(F, c, d, a, b, SET( 6), 11); + STEP(F, b, c, d, a, SET( 7), 19); + + STEP(F, a, b, c, d, SET( 8), 3); + STEP(F, d, a, b, c, SET( 9), 7); + STEP(F, c, d, a, b, SET(10), 11); + STEP(F, b, c, d, a, SET(11), 19); + + STEP(F, a, b, c, d, SET(12), 3); + STEP(F, d, a, b, c, SET(13), 7); + STEP(F, c, d, a, b, SET(14), 11); + STEP(F, b, c, d, a, SET(15), 19); +/* Round 2 */ + STEP(G, a, b, c, d, GET( 0) + 0x5A827999, 3); + STEP(G, d, a, b, c, GET( 4) + 0x5A827999, 5); + STEP(G, c, d, a, b, GET( 8) + 0x5A827999, 9); + STEP(G, b, c, d, a, GET(12) + 0x5A827999, 13); + + STEP(G, a, b, c, d, GET( 1) + 0x5A827999, 3); + STEP(G, d, a, b, c, GET( 5) + 0x5A827999, 5); + STEP(G, c, d, a, b, GET( 9) + 0x5A827999, 9); + STEP(G, b, c, d, a, GET(13) + 0x5A827999, 13); + + STEP(G, a, b, c, d, GET( 2) + 0x5A827999, 3); + STEP(G, d, a, b, c, GET( 6) + 0x5A827999, 5); + STEP(G, c, d, a, b, GET(10) + 0x5A827999, 9); + STEP(G, b, c, d, a, GET(14) + 0x5A827999, 13); + + STEP(G, a, b, c, d, GET( 3) + 0x5A827999, 3); + STEP(G, d, a, b, c, GET( 7) + 0x5A827999, 5); + STEP(G, c, d, a, b, GET(11) + 0x5A827999, 9); + STEP(G, b, c, d, a, GET(15) + 0x5A827999, 13); +/* Round 3 */ + STEP(H, a, b, c, d, GET( 0) + 0x6ED9EBA1, 3); + STEP(H, d, a, b, c, GET( 8) + 0x6ED9EBA1, 9); + STEP(H, c, d, a, b, GET( 4) + 0x6ED9EBA1, 11); + STEP(H, b, c, d, a, GET(12) + 0x6ED9EBA1, 15); + + STEP(H, a, b, c, d, GET( 2) + 0x6ED9EBA1, 3); + STEP(H, d, a, b, c, GET(10) + 0x6ED9EBA1, 9); + STEP(H, c, d, a, b, GET( 6) + 0x6ED9EBA1, 11); + STEP(H, b, c, d, a, GET(14) + 0x6ED9EBA1, 15); + + STEP(H, a, b, c, d, GET( 1) + 0x6ED9EBA1, 3); + STEP(H, d, a, b, c, GET( 9) + 0x6ED9EBA1, 9); + STEP(H, c, d, a, b, GET( 5) + 0x6ED9EBA1, 11); + STEP(H, b, c, d, a, GET(13) + 0x6ED9EBA1, 15); + + STEP(H, a, b, c, d, GET( 3) + 0x6ED9EBA1, 3); + STEP(H, d, a, b, c, GET(11) + 0x6ED9EBA1, 9); + STEP(H, c, d, a, b, GET( 7) + 0x6ED9EBA1, 11); + STEP(H, b, c, d, a, GET(15) + 0x6ED9EBA1, 15); + + a += saved_a; + b += saved_b; + c += saved_c; + d += saved_d; + + ptr += 64; + } while (size -= 64); + + ctx->a = a; + ctx->b = b; + ctx->c = c; + ctx->d = d; + + return ptr; +} + +static void md4_init(struct md4_context *ctx) +{ + ctx->a = 0x67452301; + ctx->b = 0xefcdab89; + ctx->c = 0x98badcfe; + ctx->d = 0x10325476; + + ctx->lo = 0; + ctx->hi = 0; +} + +static void md4_update(struct md4_context *ctx, const unsigned char *data, size_t size) +{ + /* @UNSAFE */ + quint32 saved_lo; + unsigned long used, free; + + saved_lo = ctx->lo; + if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) + ctx->hi++; + ctx->hi += size >> 29; + + used = saved_lo & 0x3f; + + if (used) { + free = 64 - used; + + if (size < free) { + memcpy(&ctx->buffer[used], data, size); + return; + } + + memcpy(&ctx->buffer[used], data, free); + data = (const unsigned char *) data + free; + size -= free; + body(ctx, ctx->buffer, 64); + } + + if (size >= 64) { + data = body(ctx, data, size & ~(unsigned long)0x3f); + size &= 0x3f; + } + + memcpy(ctx->buffer, data, size); +} + +static void md4_final(struct md4_context *ctx, unsigned char result[MD4_RESULTLEN]) +{ + /* @UNSAFE */ + unsigned long used, free; + + used = ctx->lo & 0x3f; + + ctx->buffer[used++] = 0x80; + + free = 64 - used; + + if (free < 8) { + memset(&ctx->buffer[used], 0, free); + body(ctx, ctx->buffer, 64); + used = 0; + free = 64; + } + + memset(&ctx->buffer[used], 0, free - 8); + + ctx->lo <<= 3; + ctx->buffer[56] = ctx->lo; + ctx->buffer[57] = ctx->lo >> 8; + ctx->buffer[58] = ctx->lo >> 16; + ctx->buffer[59] = ctx->lo >> 24; + ctx->buffer[60] = ctx->hi; + ctx->buffer[61] = ctx->hi >> 8; + ctx->buffer[62] = ctx->hi >> 16; + ctx->buffer[63] = ctx->hi >> 24; + + body(ctx, ctx->buffer, 64); + + result[0] = ctx->a; + result[1] = ctx->a >> 8; + result[2] = ctx->a >> 16; + result[3] = ctx->a >> 24; + result[4] = ctx->b; + result[5] = ctx->b >> 8; + result[6] = ctx->b >> 16; + result[7] = ctx->b >> 24; + result[8] = ctx->c; + result[9] = ctx->c >> 8; + result[10] = ctx->c >> 16; + result[11] = ctx->c >> 24; + result[12] = ctx->d; + result[13] = ctx->d >> 8; + result[14] = ctx->d >> 16; + result[15] = ctx->d >> 24; + + memset(ctx, 0, sizeof(*ctx)); +} + +#undef F +#undef G +#undef H + +QT_END_NAMESPACE diff --git a/src/3rdparty/md4/md4.h b/src/3rdparty/md4/md4.h new file mode 100644 index 0000000000..69c3419faf --- /dev/null +++ b/src/3rdparty/md4/md4.h @@ -0,0 +1,31 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, + * Inc. MD4 Message-Digest Algorithm. + * + * Written by Solar Designer in 2001, and placed in + * the public domain. See md4.c for more information. + */ + +#ifndef __MD4_H +#define __MD4_H + +#include + +QT_BEGIN_NAMESPACE + +#define MD4_RESULTLEN (128/8) + +struct md4_context { + quint32 lo, hi; + quint32 a, b, c, d; + unsigned char buffer[64]; + quint32 block[MD4_RESULTLEN]; +}; + +static void md4_init(struct md4_context *ctx); +static void md4_update(struct md4_context *ctx, const unsigned char *data, size_t size); +static void md4_final(struct md4_context *ctx, unsigned char result[MD4_RESULTLEN]); + +QT_END_NAMESPACE + +#endif diff --git a/src/3rdparty/md5/md5.cpp b/src/3rdparty/md5/md5.cpp new file mode 100644 index 0000000000..ac296b532b --- /dev/null +++ b/src/3rdparty/md5/md5.cpp @@ -0,0 +1,247 @@ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + * + * Changed so as no longer to depend on Colin Plumb's `usual.h' header + * definitions; now uses stuff from dpkg's config.h. + * - Ian Jackson . + * Still in the public domain. + */ + +#include /* for memcpy() */ +#ifndef _WIN32_WCE +#include /* for stupid systems */ +#else +#include +#include +#endif + +#include "md5.h" + +QT_BEGIN_NAMESPACE + +static void +byteSwap(UWORD32 *buf, unsigned words) +{ + const quint32 byteOrderTest = 0x1; + if (((char *)&byteOrderTest)[0] == 0) { + md5byte *p = (md5byte *)buf; + + do { + *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 | + ((unsigned)p[1] << 8 | p[0]); + p += 4; + } while (--words); + } +} + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +static void +MD5Init(struct MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bytes[0] = 0; + ctx->bytes[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +static void +MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len) +{ + UWORD32 t; + + /* Update byte count */ + + t = ctx->bytes[0]; + if ((ctx->bytes[0] = t + len) < t) + ctx->bytes[1]++; /* Carry from low to high */ + + t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ + if (t > len) { + memcpy((md5byte *)ctx->in + 64 - t, buf, len); + return; + } + /* First chunk is an odd size */ + memcpy((md5byte *)ctx->in + 64 - t, buf, t); + byteSwap(ctx->in, 16); + MD5Transform(ctx->buf, ctx->in); + buf += t; + len -= t; + + /* Process data in 64-byte chunks */ + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteSwap(ctx->in, 16); + MD5Transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + memcpy(ctx->in, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +static void +MD5Final(struct MD5Context *ctx, md5byte digest[16]) +{ + int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ + md5byte *p = (md5byte *)ctx->in + count; + + /* Set the first char of padding to 0x80. There is always room. */ + *p++ = 0x80; + + /* Bytes of padding needed to make 56 bytes (-8..55) */ + count = 56 - 1 - count; + + if (count < 0) { /* Padding forces an extra block */ + memset(p, 0, count + 8); + byteSwap(ctx->in, 16); + MD5Transform(ctx->buf, ctx->in); + p = (md5byte *)ctx->in; + count = 56; + } + memset(p, 0, count); + byteSwap(ctx->in, 14); + + /* Append length in bits and transform */ + ctx->in[14] = ctx->bytes[0] << 3; + ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; + MD5Transform(ctx->buf, ctx->in); + + byteSwap(ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ +} + +#ifndef ASM_MD5 + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f,w,x,y,z,in,s) \ + (w += f(x,y,z) + in, w = (w<>(32-s)) + x) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void +MD5Transform(UWORD32 buf[4], UWORD32 const in[16]) +{ + register UWORD32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +#endif + +QT_END_NAMESPACE diff --git a/src/3rdparty/md5/md5.h b/src/3rdparty/md5/md5.h new file mode 100644 index 0000000000..181ad46733 --- /dev/null +++ b/src/3rdparty/md5/md5.h @@ -0,0 +1,48 @@ +/* + * This is the header file for the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + * + * Changed so as no longer to depend on Colin Plumb's `usual.h' + * header definitions; now uses stuff from dpkg's config.h + * - Ian Jackson . + * Still in the public domain. + */ + +#ifndef MD5_H +#define MD5_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +typedef unsigned char md5byte; +typedef quint32 UWORD32; + +struct MD5Context { + UWORD32 buf[4]; + UWORD32 bytes[2]; + UWORD32 in[16]; +}; + +static void MD5Init(struct MD5Context *context); +static void MD5Update(struct MD5Context *context, md5byte const *buf, unsigned len); +static void MD5Final(struct MD5Context *context, unsigned char digest[16]); +static void MD5Transform(UWORD32 buf[4], UWORD32 const in[16]); + +QT_END_NAMESPACE + +#endif /* !MD5_H */ diff --git a/src/3rdparty/patches/libmng-1.0.10-endless-loop.patch b/src/3rdparty/patches/libmng-1.0.10-endless-loop.patch new file mode 100644 index 0000000000..31f0474e6b --- /dev/null +++ b/src/3rdparty/patches/libmng-1.0.10-endless-loop.patch @@ -0,0 +1,65 @@ +--- libmng_data.h.orig 2007-04-20 10:41:58.000000000 +0200 ++++ libmng_data.h 2007-07-14 00:00:00.000000000 +0200 +@@ -658,6 +658,9 @@ + mng_int32 iFrameclipb; + + mng_uint32 iNextdelay; /* delay *after* next image */ ++ ++ mng_bool bForcedelay; ++ mng_uint32 iAccumdelay; + #endif + + #ifndef MNG_SKIPCHUNK_SHOW +--- libmng_display.c.orig 2007-04-20 10:41:58.000000000 +0200 ++++ libmng_display.c 2007-07-14 00:00:00.000000000 +0200 +@@ -384,8 +384,9 @@ + + { + #ifndef MNG_SKIPCHUNK_FRAM +- if (pData->iFramedelay > 0) /* real delay ? */ ++ if (pData->iFramedelay > 0 || pData->bForcedelay) /* real delay ? */ + { /* let the app refresh first ? */ ++ pData->bForcedelay = MNG_FALSE; + if ((pData->bRunning) && (!pData->bSkipping) && + (pData->iUpdatetop < pData->iUpdatebottom) && (pData->iUpdateleft < pData->iUpdateright)) + if (!pData->fRefresh (((mng_handle)pData), +@@ -455,6 +456,7 @@ + pData->iFrametime = pData->iFrametime + iWaitfor; + /* setup for next delay */ + pData->iFramedelay = pData->iNextdelay; ++ pData->iAccumdelay += pData->iFramedelay; + #endif + } + +@@ -3340,6 +3342,9 @@ + MNG_TRACE (pData, MNG_FN_PROCESS_DISPLAY_MEND, MNG_LC_START); + #endif + ++ pData->bForcedelay = pData->iAccumdelay ? MNG_FALSE : MNG_TRUE; ++ pData->iAccumdelay = 0; ++ + #ifdef MNG_SUPPORT_DYNAMICMNG + if (pData->bStopafterseek) /* need to stop after this ? */ + { +--- libmng_hlapi.c.orig 2007-07-06 18:23:04.000000000 +0200 ++++ libmng_hlapi.c 2007-07-14 00:00:00.000000000 +0200 +@@ -446,6 +446,9 @@ + pData->iFrameclipb = 0; + + pData->iNextdelay = 1; ++ ++ pData->bForcedelay = MNG_FALSE; ++ pData->iAccumdelay = 0; + #endif + + #ifndef MNG_SKIPCHUNK_SHOW +@@ -1737,6 +1740,9 @@ + pData->iFrameclipb = 0; + + pData->iNextdelay = 1; ++ ++ pData->bForcedelay = MNG_FALSE; ++ pData->iAccumdelay = 0; + #endif + + #ifndef MNG_SKIPCHUNK_SHOW diff --git a/src/3rdparty/pixman/README b/src/3rdparty/pixman/README new file mode 100644 index 0000000000..843b069800 --- /dev/null +++ b/src/3rdparty/pixman/README @@ -0,0 +1,26 @@ +pixman is a library that provides low-level pixel manipulation +features such as image compositing and trapezoid rasterization. + +Please submit bugs & patches to the libpixman bugzilla: + + https://bugs.freedesktop.org/enter_bug.cgi?product=pixman + +All questions regarding this software should be directed to either the +Xorg mailing list: + + http://lists.freedesktop.org/mailman/listinfo/xorg + +or the cairo mailing list: + + http://lists.freedesktop.org/mailman/listinfo/cairo + +The master development code repository can be found at: + + git://anongit.freedesktop.org/git/pixman + + http://gitweb.freedesktop.org/?p=pixman;a=summary + +For more information on the git code manager, see: + + http://wiki.x.org/wiki/GitPage + diff --git a/src/3rdparty/pixman/pixman-arm-neon-asm.S b/src/3rdparty/pixman/pixman-arm-neon-asm.S new file mode 100644 index 0000000000..eb8cc4c966 --- /dev/null +++ b/src/3rdparty/pixman/pixman-arm-neon-asm.S @@ -0,0 +1,1709 @@ +/* + * Copyright © 2009 Nokia Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Siarhei Siamashka (siarhei.siamashka@nokia.com) + */ + +/* + * This file contains implementations of NEON optimized pixel processing + * functions. There is no full and detailed tutorial, but some functions + * (those which are exposing some new or interesting features) are + * extensively commented and can be used as examples. + * + * You may want to have a look at the comments for following functions: + * - pixman_composite_over_8888_0565_asm_neon + * - pixman_composite_over_n_8_0565_asm_neon + */ + +/* Prevent the stack from becoming executable for no reason... */ +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif + + .text + .fpu neon + .arch armv7a + .altmacro + +#include "pixman-arm-neon-asm.h" + +/* Global configuration options and preferences */ + +/* + * The code can optionally make use of unaligned memory accesses to improve + * performance of handling leading/trailing pixels for each scanline. + * Configuration variable RESPECT_STRICT_ALIGNMENT can be set to 0 for + * example in linux if unaligned memory accesses are not configured to + * generate.exceptions. + */ +.set RESPECT_STRICT_ALIGNMENT, 1 + +/* + * Set default prefetch type. There is a choice between the following options: + * + * PREFETCH_TYPE_NONE (may be useful for the ARM cores where PLD is set to work + * as NOP to workaround some HW bugs or for whatever other reason) + * + * PREFETCH_TYPE_SIMPLE (may be useful for simple single-issue ARM cores where + * advanced prefetch intruduces heavy overhead) + * + * PREFETCH_TYPE_ADVANCED (useful for superscalar cores such as ARM Cortex-A8 + * which can run ARM and NEON instructions simultaneously so that extra ARM + * instructions do not add (many) extra cycles, but improve prefetch efficiency) + * + * Note: some types of function can't support advanced prefetch and fallback + * to simple one (those which handle 24bpp pixels) + */ +.set PREFETCH_TYPE_DEFAULT, PREFETCH_TYPE_ADVANCED + +/* Prefetch distance in pixels for simple prefetch */ +.set PREFETCH_DISTANCE_SIMPLE, 64 + +/* + * Implementation of pixman_composite_over_8888_0565_asm_neon + * + * This function takes a8r8g8b8 source buffer, r5g6b5 destination buffer and + * performs OVER compositing operation. Function fast_composite_over_8888_0565 + * from pixman-fast-path.c does the same in C and can be used as a reference. + * + * First we need to have some NEON assembly code which can do the actual + * operation on the pixels and provide it to the template macro. + * + * Template macro quite conveniently takes care of emitting all the necessary + * code for memory reading and writing (including quite tricky cases of + * handling unaligned leading/trailing pixels), so we only need to deal with + * the data in NEON registers. + * + * NEON registers allocation in general is recommented to be the following: + * d0, d1, d2, d3 - contain loaded source pixel data + * d4, d5, d6, d7 - contain loaded destination pixels (if they are needed) + * d24, d25, d26, d27 - contain loading mask pixel data (if mask is used) + * d28, d29, d30, d31 - place for storing the result (destination pixels) + * + * As can be seen above, four 64-bit NEON registers are used for keeping + * intermediate pixel data and up to 8 pixels can be processed in one step + * for 32bpp formats (16 pixels for 16bpp, 32 pixels for 8bpp). + * + * This particular function uses the following registers allocation: + * d0, d1, d2, d3 - contain loaded source pixel data + * d4, d5 - contain loaded destination pixels (they are needed) + * d28, d29 - place for storing the result (destination pixels) + */ + +/* + * Step one. We need to have some code to do some arithmetics on pixel data. + * This is implemented as a pair of macros: '*_head' and '*_tail'. When used + * back-to-back, they take pixel data from {d0, d1, d2, d3} and {d4, d5}, + * perform all the needed calculations and write the result to {d28, d29}. + * The rationale for having two macros and not just one will be explained + * later. In practice, any single monolitic function which does the work can + * be split into two parts in any arbitrary way without affecting correctness. + * + * There is one special trick here too. Common template macro can optionally + * make our life a bit easier by doing R, G, B, A color components + * deinterleaving for 32bpp pixel formats (and this feature is used in + * 'pixman_composite_over_8888_0565_asm_neon' function). So it means that + * instead of having 8 packed pixels in {d0, d1, d2, d3} registers, we + * actually use d0 register for blue channel (a vector of eight 8-bit + * values), d1 register for green, d2 for red and d3 for alpha. This + * simple conversion can be also done with a few NEON instructions: + * + * Packed to planar conversion: + * vuzp.8 d0, d1 + * vuzp.8 d2, d3 + * vuzp.8 d1, d3 + * vuzp.8 d0, d2 + * + * Planar to packed conversion: + * vzip.8 d0, d2 + * vzip.8 d1, d3 + * vzip.8 d2, d3 + * vzip.8 d0, d1 + * + * But pixel can be loaded directly in planar format using VLD4.8 NEON + * instruction. It is 1 cycle slower than VLD1.32, so this is not always + * desirable, that's why deinterleaving is optional. + * + * But anyway, here is the code: + */ +.macro pixman_composite_over_8888_0565_process_pixblock_head + /* convert 8 r5g6b5 pixel data from {d4, d5} to planar 8-bit format + and put data into d6 - red, d7 - green, d30 - blue */ + vshrn.u16 d6, q2, #8 + vshrn.u16 d7, q2, #3 + vsli.u16 q2, q2, #5 + vsri.u8 d6, d6, #5 + vmvn.8 d3, d3 /* invert source alpha */ + vsri.u8 d7, d7, #6 + vshrn.u16 d30, q2, #2 + /* now do alpha blending, storing results in 8-bit planar format + into d16 - red, d19 - green, d18 - blue */ + vmull.u8 q10, d3, d6 + vmull.u8 q11, d3, d7 + vmull.u8 q12, d3, d30 + vrshr.u16 q13, q10, #8 + vrshr.u16 q3, q11, #8 + vrshr.u16 q15, q12, #8 + vraddhn.u16 d20, q10, q13 + vraddhn.u16 d23, q11, q3 + vraddhn.u16 d22, q12, q15 +.endm + +.macro pixman_composite_over_8888_0565_process_pixblock_tail + /* ... continue alpha blending */ + vqadd.u8 d16, d2, d20 + vqadd.u8 q9, q0, q11 + /* convert the result to r5g6b5 and store it into {d28, d29} */ + vshll.u8 q14, d16, #8 + vshll.u8 q8, d19, #8 + vshll.u8 q9, d18, #8 + vsri.u16 q14, q8, #5 + vsri.u16 q14, q9, #11 +.endm + +/* + * OK, now we got almost everything that we need. Using the above two + * macros, the work can be done right. But now we want to optimize + * it a bit. ARM Cortex-A8 is an in-order core, and benefits really + * a lot from good code scheduling and software pipelining. + * + * Let's construct some code, which will run in the core main loop. + * Some pseudo-code of the main loop will look like this: + * head + * while (...) { + * tail + * head + * } + * tail + * + * It may look a bit weird, but this setup allows to hide instruction + * latencies better and also utilize dual-issue capability more + * efficiently (make pairs of load-store and ALU instructions). + * + * So what we need now is a '*_tail_head' macro, which will be used + * in the core main loop. A trivial straightforward implementation + * of this macro would look like this: + * + * pixman_composite_over_8888_0565_process_pixblock_tail + * vst1.16 {d28, d29}, [DST_W, :128]! + * vld1.16 {d4, d5}, [DST_R, :128]! + * vld4.32 {d0, d1, d2, d3}, [SRC]! + * pixman_composite_over_8888_0565_process_pixblock_head + * cache_preload 8, 8 + * + * Now it also got some VLD/VST instructions. We simply can't move from + * processing one block of pixels to the other one with just arithmetics. + * The previously processed data needs to be written to memory and new + * data needs to be fetched. Fortunately, this main loop does not deal + * with partial leading/trailing pixels and can load/store a full block + * of pixels in a bulk. Additionally, destination buffer is already + * 16 bytes aligned here (which is good for performance). + * + * New things here are DST_R, DST_W, SRC and MASK identifiers. These + * are the aliases for ARM registers which are used as pointers for + * accessing data. We maintain separate pointers for reading and writing + * destination buffer (DST_R and DST_W). + * + * Another new thing is 'cache_preload' macro. It is used for prefetching + * data into CPU L2 cache and improve performance when dealing with large + * images which are far larger than cache size. It uses one argument + * (actually two, but they need to be the same here) - number of pixels + * in a block. Looking into 'pixman-arm-neon-asm.h' can provide some + * details about this macro. Moreover, if good performance is needed + * the code from this macro needs to be copied into '*_tail_head' macro + * and mixed with the rest of code for optimal instructions scheduling. + * We are actually doing it below. + * + * Now after all the explanations, here is the optimized code. + * Different instruction streams (originaling from '*_head', '*_tail' + * and 'cache_preload' macro) use different indentation levels for + * better readability. Actually taking the code from one of these + * indentation levels and ignoring a few VLD/VST instructions would + * result in exactly the code from '*_head', '*_tail' or 'cache_preload' + * macro! + */ + +#if 1 + +.macro pixman_composite_over_8888_0565_process_pixblock_tail_head + vqadd.u8 d16, d2, d20 + vld1.16 {d4, d5}, [DST_R, :128]! + vqadd.u8 q9, q0, q11 + vshrn.u16 d6, q2, #8 + vld4.8 {d0, d1, d2, d3}, [SRC]! + vshrn.u16 d7, q2, #3 + vsli.u16 q2, q2, #5 + vshll.u8 q14, d16, #8 + PF add PF_X, PF_X, #8 + vshll.u8 q8, d19, #8 + PF tst PF_CTL, #0xF + vsri.u8 d6, d6, #5 + PF addne PF_X, PF_X, #8 + vmvn.8 d3, d3 + PF subne PF_CTL, PF_CTL, #1 + vsri.u8 d7, d7, #6 + vshrn.u16 d30, q2, #2 + vmull.u8 q10, d3, d6 + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] + vmull.u8 q11, d3, d7 + vmull.u8 q12, d3, d30 + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] + vsri.u16 q14, q8, #5 + PF cmp PF_X, ORIG_W + vshll.u8 q9, d18, #8 + vrshr.u16 q13, q10, #8 + PF subge PF_X, PF_X, ORIG_W + vrshr.u16 q3, q11, #8 + vrshr.u16 q15, q12, #8 + PF subges PF_CTL, PF_CTL, #0x10 + vsri.u16 q14, q9, #11 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! + vraddhn.u16 d20, q10, q13 + vraddhn.u16 d23, q11, q3 + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! + vraddhn.u16 d22, q12, q15 + vst1.16 {d28, d29}, [DST_W, :128]! +.endm + +#else + +/* If we did not care much about the performance, we would just use this... */ +.macro pixman_composite_over_8888_0565_process_pixblock_tail_head + pixman_composite_over_8888_0565_process_pixblock_tail + vst1.16 {d28, d29}, [DST_W, :128]! + vld1.16 {d4, d5}, [DST_R, :128]! + vld4.32 {d0, d1, d2, d3}, [SRC]! + pixman_composite_over_8888_0565_process_pixblock_head + cache_preload 8, 8 +.endm + +#endif + +/* + * And now the final part. We are using 'generate_composite_function' macro + * to put all the stuff together. We are specifying the name of the function + * which we want to get, number of bits per pixel for the source, mask and + * destination (0 if unused, like mask in this case). Next come some bit + * flags: + * FLAG_DST_READWRITE - tells that the destination buffer is both read + * and written, for write-only buffer we would use + * FLAG_DST_WRITEONLY flag instead + * FLAG_DEINTERLEAVE_32BPP - tells that we prefer to work with planar data + * and separate color channels for 32bpp format. + * The next things are: + * - the number of pixels processed per iteration (8 in this case, because + * that's the maximum what can fit into four 64-bit NEON registers). + * - prefetch distance, measured in pixel blocks. In this case it is 5 times + * by 8 pixels. That would be 40 pixels, or up to 160 bytes. Optimal + * prefetch distance can be selected by running some benchmarks. + * + * After that we specify some macros, these are 'default_init', + * 'default_cleanup' here which are empty (but it is possible to have custom + * init/cleanup macros to be able to save/restore some extra NEON registers + * like d8-d15 or do anything else) followed by + * 'pixman_composite_over_8888_0565_process_pixblock_head', + * 'pixman_composite_over_8888_0565_process_pixblock_tail' and + * 'pixman_composite_over_8888_0565_process_pixblock_tail_head' + * which we got implemented above. + * + * The last part is the NEON registers allocation scheme. + */ +generate_composite_function \ + pixman_composite_over_8888_0565_asm_neon, 32, 0, 16, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_over_8888_0565_process_pixblock_head, \ + pixman_composite_over_8888_0565_process_pixblock_tail, \ + pixman_composite_over_8888_0565_process_pixblock_tail_head, \ + 28, /* dst_w_basereg */ \ + 4, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 24 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_over_n_0565_process_pixblock_head + /* convert 8 r5g6b5 pixel data from {d4, d5} to planar 8-bit format + and put data into d6 - red, d7 - green, d30 - blue */ + vshrn.u16 d6, q2, #8 + vshrn.u16 d7, q2, #3 + vsli.u16 q2, q2, #5 + vsri.u8 d6, d6, #5 + vsri.u8 d7, d7, #6 + vshrn.u16 d30, q2, #2 + /* now do alpha blending, storing results in 8-bit planar format + into d16 - red, d19 - green, d18 - blue */ + vmull.u8 q10, d3, d6 + vmull.u8 q11, d3, d7 + vmull.u8 q12, d3, d30 + vrshr.u16 q13, q10, #8 + vrshr.u16 q3, q11, #8 + vrshr.u16 q15, q12, #8 + vraddhn.u16 d20, q10, q13 + vraddhn.u16 d23, q11, q3 + vraddhn.u16 d22, q12, q15 +.endm + +.macro pixman_composite_over_n_0565_process_pixblock_tail + /* ... continue alpha blending */ + vqadd.u8 d16, d2, d20 + vqadd.u8 q9, q0, q11 + /* convert the result to r5g6b5 and store it into {d28, d29} */ + vshll.u8 q14, d16, #8 + vshll.u8 q8, d19, #8 + vshll.u8 q9, d18, #8 + vsri.u16 q14, q8, #5 + vsri.u16 q14, q9, #11 +.endm + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_over_n_0565_process_pixblock_tail_head + pixman_composite_over_n_0565_process_pixblock_tail + vld1.16 {d4, d5}, [DST_R, :128]! + vst1.16 {d28, d29}, [DST_W, :128]! + pixman_composite_over_n_0565_process_pixblock_head +.endm + +.macro pixman_composite_over_n_0565_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vld1.32 {d3[0]}, [DUMMY] + vdup.8 d0, d3[0] + vdup.8 d1, d3[1] + vdup.8 d2, d3[2] + vdup.8 d3, d3[3] + vmvn.8 d3, d3 /* invert source alpha */ +.endm + +generate_composite_function \ + pixman_composite_over_n_0565_asm_neon, 0, 0, 16, \ + FLAG_DST_READWRITE, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_n_0565_init, \ + default_cleanup, \ + pixman_composite_over_n_0565_process_pixblock_head, \ + pixman_composite_over_n_0565_process_pixblock_tail, \ + pixman_composite_over_n_0565_process_pixblock_tail_head, \ + 28, /* dst_w_basereg */ \ + 4, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 24 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_8888_0565_process_pixblock_head + vshll.u8 q8, d1, #8 + vshll.u8 q14, d2, #8 + vshll.u8 q9, d0, #8 +.endm + +.macro pixman_composite_src_8888_0565_process_pixblock_tail + vsri.u16 q14, q8, #5 + vsri.u16 q14, q9, #11 +.endm + +.macro pixman_composite_src_8888_0565_process_pixblock_tail_head + vsri.u16 q14, q8, #5 + PF add PF_X, PF_X, #8 + PF tst PF_CTL, #0xF + vld4.8 {d0, d1, d2, d3}, [SRC]! + PF addne PF_X, PF_X, #8 + PF subne PF_CTL, PF_CTL, #1 + vsri.u16 q14, q9, #11 + PF cmp PF_X, ORIG_W + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] + vshll.u8 q8, d1, #8 + vst1.16 {d28, d29}, [DST_W, :128]! + PF subge PF_X, PF_X, ORIG_W + PF subges PF_CTL, PF_CTL, #0x10 + vshll.u8 q14, d2, #8 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! + vshll.u8 q9, d0, #8 +.endm + +generate_composite_function \ + pixman_composite_src_8888_0565_asm_neon, 32, 0, 16, \ + FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_src_8888_0565_process_pixblock_head, \ + pixman_composite_src_8888_0565_process_pixblock_tail, \ + pixman_composite_src_8888_0565_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_src_0565_8888_process_pixblock_head + vshrn.u16 d30, q0, #8 + vshrn.u16 d29, q0, #3 + vsli.u16 q0, q0, #5 + vmov.u8 d31, #255 + vsri.u8 d30, d30, #5 + vsri.u8 d29, d29, #6 + vshrn.u16 d28, q0, #2 +.endm + +.macro pixman_composite_src_0565_8888_process_pixblock_tail +.endm + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_src_0565_8888_process_pixblock_tail_head + pixman_composite_src_0565_8888_process_pixblock_tail + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! + vld1.16 {d0, d1}, [SRC]! + pixman_composite_src_0565_8888_process_pixblock_head + cache_preload 8, 8 +.endm + +generate_composite_function \ + pixman_composite_src_0565_8888_asm_neon, 16, 0, 32, \ + FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_src_0565_8888_process_pixblock_head, \ + pixman_composite_src_0565_8888_process_pixblock_tail, \ + pixman_composite_src_0565_8888_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_add_8000_8000_process_pixblock_head + vqadd.u8 q14, q0, q2 + vqadd.u8 q15, q1, q3 +.endm + +.macro pixman_composite_add_8000_8000_process_pixblock_tail +.endm + +.macro pixman_composite_add_8000_8000_process_pixblock_tail_head + vld1.8 {d0, d1, d2, d3}, [SRC]! + PF add PF_X, PF_X, #32 + PF tst PF_CTL, #0xF + vld1.8 {d4, d5, d6, d7}, [DST_R, :128]! + PF addne PF_X, PF_X, #32 + PF subne PF_CTL, PF_CTL, #1 + vst1.8 {d28, d29, d30, d31}, [DST_W, :128]! + PF cmp PF_X, ORIG_W + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] + PF subge PF_X, PF_X, ORIG_W + PF subges PF_CTL, PF_CTL, #0x10 + vqadd.u8 q14, q0, q2 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! + vqadd.u8 q15, q1, q3 +.endm + +generate_composite_function \ + pixman_composite_add_8000_8000_asm_neon, 8, 0, 8, \ + FLAG_DST_READWRITE, \ + 32, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_add_8000_8000_process_pixblock_head, \ + pixman_composite_add_8000_8000_process_pixblock_tail, \ + pixman_composite_add_8000_8000_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_add_8888_8888_process_pixblock_tail_head + vld1.8 {d0, d1, d2, d3}, [SRC]! + PF add PF_X, PF_X, #8 + PF tst PF_CTL, #0xF + vld1.8 {d4, d5, d6, d7}, [DST_R, :128]! + PF addne PF_X, PF_X, #8 + PF subne PF_CTL, PF_CTL, #1 + vst1.8 {d28, d29, d30, d31}, [DST_W, :128]! + PF cmp PF_X, ORIG_W + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] + PF subge PF_X, PF_X, ORIG_W + PF subges PF_CTL, PF_CTL, #0x10 + vqadd.u8 q14, q0, q2 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! + vqadd.u8 q15, q1, q3 +.endm + +generate_composite_function \ + pixman_composite_add_8888_8888_asm_neon, 32, 0, 32, \ + FLAG_DST_READWRITE, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_add_8000_8000_process_pixblock_head, \ + pixman_composite_add_8000_8000_process_pixblock_tail, \ + pixman_composite_add_8888_8888_process_pixblock_tail_head + +generate_composite_function_single_scanline \ + pixman_composite_scanline_add_asm_neon, 32, 0, 32, \ + FLAG_DST_READWRITE, \ + 8, /* number of pixels, processed in a single block */ \ + default_init, \ + default_cleanup, \ + pixman_composite_add_8000_8000_process_pixblock_head, \ + pixman_composite_add_8000_8000_process_pixblock_tail, \ + pixman_composite_add_8888_8888_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_over_8888_8888_process_pixblock_head + vmvn.8 d24, d3 /* get inverted alpha */ + /* do alpha blending */ + vmull.u8 q8, d24, d4 + vmull.u8 q9, d24, d5 + vmull.u8 q10, d24, d6 + vmull.u8 q11, d24, d7 +.endm + +.macro pixman_composite_over_8888_8888_process_pixblock_tail + vrshr.u16 q14, q8, #8 + vrshr.u16 q15, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + vraddhn.u16 d30, q12, q10 + vraddhn.u16 d31, q13, q11 + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 +.endm + +.macro pixman_composite_over_8888_8888_process_pixblock_tail_head + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + vrshr.u16 q14, q8, #8 + PF add PF_X, PF_X, #8 + PF tst PF_CTL, #0xF + vrshr.u16 q15, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + PF addne PF_X, PF_X, #8 + PF subne PF_CTL, PF_CTL, #1 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + PF cmp PF_X, ORIG_W + vraddhn.u16 d30, q12, q10 + vraddhn.u16 d31, q13, q11 + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 + vld4.8 {d0, d1, d2, d3}, [SRC]! + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] + vmvn.8 d22, d3 + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! + PF subge PF_X, PF_X, ORIG_W + vmull.u8 q8, d22, d4 + PF subges PF_CTL, PF_CTL, #0x10 + vmull.u8 q9, d22, d5 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! + vmull.u8 q10, d22, d6 + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! + vmull.u8 q11, d22, d7 +.endm + +generate_composite_function \ + pixman_composite_over_8888_8888_asm_neon, 32, 0, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_over_8888_8888_process_pixblock_head, \ + pixman_composite_over_8888_8888_process_pixblock_tail, \ + pixman_composite_over_8888_8888_process_pixblock_tail_head + +generate_composite_function_single_scanline \ + pixman_composite_scanline_over_asm_neon, 32, 0, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + default_init, \ + default_cleanup, \ + pixman_composite_over_8888_8888_process_pixblock_head, \ + pixman_composite_over_8888_8888_process_pixblock_tail, \ + pixman_composite_over_8888_8888_process_pixblock_tail_head + +/******************************************************************************/ + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_over_n_8888_process_pixblock_tail_head + pixman_composite_over_8888_8888_process_pixblock_tail + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! + pixman_composite_over_8888_8888_process_pixblock_head +.endm + +.macro pixman_composite_over_n_8888_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vld1.32 {d3[0]}, [DUMMY] + vdup.8 d0, d3[0] + vdup.8 d1, d3[1] + vdup.8 d2, d3[2] + vdup.8 d3, d3[3] +.endm + +generate_composite_function \ + pixman_composite_over_n_8888_asm_neon, 0, 0, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_n_8888_init, \ + default_cleanup, \ + pixman_composite_over_8888_8888_process_pixblock_head, \ + pixman_composite_over_8888_8888_process_pixblock_tail, \ + pixman_composite_over_n_8888_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_over_reverse_n_8888_process_pixblock_tail_head + vrshr.u16 q14, q8, #8 + PF add PF_X, PF_X, #8 + PF tst PF_CTL, #0xF + vrshr.u16 q15, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + PF addne PF_X, PF_X, #8 + PF subne PF_CTL, PF_CTL, #1 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + PF cmp PF_X, ORIG_W + vraddhn.u16 d30, q12, q10 + vraddhn.u16 d31, q13, q11 + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 + vld4.8 {d0, d1, d2, d3}, [DST_R, :128]! + vmvn.8 d22, d3 + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! + PF subge PF_X, PF_X, ORIG_W + vmull.u8 q8, d22, d4 + PF subges PF_CTL, PF_CTL, #0x10 + vmull.u8 q9, d22, d5 + vmull.u8 q10, d22, d6 + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! + vmull.u8 q11, d22, d7 +.endm + +.macro pixman_composite_over_reverse_n_8888_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vld1.32 {d7[0]}, [DUMMY] + vdup.8 d4, d7[0] + vdup.8 d5, d7[1] + vdup.8 d6, d7[2] + vdup.8 d7, d7[3] +.endm + +generate_composite_function \ + pixman_composite_over_reverse_n_8888_asm_neon, 0, 0, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_reverse_n_8888_init, \ + default_cleanup, \ + pixman_composite_over_8888_8888_process_pixblock_head, \ + pixman_composite_over_8888_8888_process_pixblock_tail, \ + pixman_composite_over_reverse_n_8888_process_pixblock_tail_head, \ + 28, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 4, /* src_basereg */ \ + 24 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_over_n_8_0565_process_pixblock_head + /* in */ + vmull.u8 q0, d24, d8 + vmull.u8 q1, d24, d9 + vmull.u8 q6, d24, d10 + vmull.u8 q7, d24, d11 + vrshr.u16 q10, q0, #8 + vrshr.u16 q11, q1, #8 + vrshr.u16 q12, q6, #8 + vrshr.u16 q13, q7, #8 + vraddhn.u16 d0, q0, q10 + vraddhn.u16 d1, q1, q11 + vraddhn.u16 d2, q6, q12 + vraddhn.u16 d3, q7, q13 + + vshrn.u16 d6, q2, #8 + vshrn.u16 d7, q2, #3 + vsli.u16 q2, q2, #5 + vsri.u8 d6, d6, #5 + vmvn.8 d3, d3 + vsri.u8 d7, d7, #6 + vshrn.u16 d30, q2, #2 + /* now do alpha blending */ + vmull.u8 q10, d3, d6 + vmull.u8 q11, d3, d7 + vmull.u8 q12, d3, d30 + vrshr.u16 q13, q10, #8 + vrshr.u16 q3, q11, #8 + vrshr.u16 q15, q12, #8 + vraddhn.u16 d20, q10, q13 + vraddhn.u16 d23, q11, q3 + vraddhn.u16 d22, q12, q15 +.endm + +.macro pixman_composite_over_n_8_0565_process_pixblock_tail + vqadd.u8 d16, d2, d20 + vqadd.u8 q9, q0, q11 + /* convert to r5g6b5 */ + vshll.u8 q14, d16, #8 + vshll.u8 q8, d19, #8 + vshll.u8 q9, d18, #8 + vsri.u16 q14, q8, #5 + vsri.u16 q14, q9, #11 +.endm + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_over_n_8_0565_process_pixblock_tail_head + pixman_composite_over_n_8_0565_process_pixblock_tail + vst1.16 {d28, d29}, [DST_W, :128]! + vld1.16 {d4, d5}, [DST_R, :128]! + vld1.8 {d24}, [MASK]! + cache_preload 8, 8 + pixman_composite_over_n_8_0565_process_pixblock_head +.endm + +/* + * This function needs a special initialization of solid mask. + * Solid source pixel data is fetched from stack at ARGS_STACK_OFFSET + * offset, split into color components and replicated in d8-d11 + * registers. Additionally, this function needs all the NEON registers, + * so it has to save d8-d15 registers which are callee saved according + * to ABI. These registers are restored from 'cleanup' macro. All the + * other NEON registers are caller saved, so can be clobbered freely + * without introducing any problems. + */ +.macro pixman_composite_over_n_8_0565_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vpush {d8-d15} + vld1.32 {d11[0]}, [DUMMY] + vdup.8 d8, d11[0] + vdup.8 d9, d11[1] + vdup.8 d10, d11[2] + vdup.8 d11, d11[3] +.endm + +.macro pixman_composite_over_n_8_0565_cleanup + vpop {d8-d15} +.endm + +generate_composite_function \ + pixman_composite_over_n_8_0565_asm_neon, 0, 8, 16, \ + FLAG_DST_READWRITE, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_n_8_0565_init, \ + pixman_composite_over_n_8_0565_cleanup, \ + pixman_composite_over_n_8_0565_process_pixblock_head, \ + pixman_composite_over_n_8_0565_process_pixblock_tail, \ + pixman_composite_over_n_8_0565_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_src_0565_0565_process_pixblock_head +.endm + +.macro pixman_composite_src_0565_0565_process_pixblock_tail +.endm + +.macro pixman_composite_src_0565_0565_process_pixblock_tail_head + vst1.16 {d0, d1, d2, d3}, [DST_W, :128]! + vld1.16 {d0, d1, d2, d3}, [SRC]! + cache_preload 16, 16 +.endm + +generate_composite_function \ + pixman_composite_src_0565_0565_asm_neon, 16, 0, 16, \ + FLAG_DST_WRITEONLY, \ + 16, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_src_0565_0565_process_pixblock_head, \ + pixman_composite_src_0565_0565_process_pixblock_tail, \ + pixman_composite_src_0565_0565_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_n_8_process_pixblock_head +.endm + +.macro pixman_composite_src_n_8_process_pixblock_tail +.endm + +.macro pixman_composite_src_n_8_process_pixblock_tail_head + vst1.8 {d0, d1, d2, d3}, [DST_W, :128]! +.endm + +.macro pixman_composite_src_n_8_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vld1.32 {d0[0]}, [DUMMY] + vsli.u64 d0, d0, #8 + vsli.u64 d0, d0, #16 + vsli.u64 d0, d0, #32 + vmov d1, d0 + vmov q1, q0 +.endm + +.macro pixman_composite_src_n_8_cleanup +.endm + +generate_composite_function \ + pixman_composite_src_n_8_asm_neon, 0, 0, 8, \ + FLAG_DST_WRITEONLY, \ + 32, /* number of pixels, processed in a single block */ \ + 0, /* prefetch distance */ \ + pixman_composite_src_n_8_init, \ + pixman_composite_src_n_8_cleanup, \ + pixman_composite_src_n_8_process_pixblock_head, \ + pixman_composite_src_n_8_process_pixblock_tail, \ + pixman_composite_src_n_8_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_n_0565_process_pixblock_head +.endm + +.macro pixman_composite_src_n_0565_process_pixblock_tail +.endm + +.macro pixman_composite_src_n_0565_process_pixblock_tail_head + vst1.16 {d0, d1, d2, d3}, [DST_W, :128]! +.endm + +.macro pixman_composite_src_n_0565_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vld1.32 {d0[0]}, [DUMMY] + vsli.u64 d0, d0, #16 + vsli.u64 d0, d0, #32 + vmov d1, d0 + vmov q1, q0 +.endm + +.macro pixman_composite_src_n_0565_cleanup +.endm + +generate_composite_function \ + pixman_composite_src_n_0565_asm_neon, 0, 0, 16, \ + FLAG_DST_WRITEONLY, \ + 16, /* number of pixels, processed in a single block */ \ + 0, /* prefetch distance */ \ + pixman_composite_src_n_0565_init, \ + pixman_composite_src_n_0565_cleanup, \ + pixman_composite_src_n_0565_process_pixblock_head, \ + pixman_composite_src_n_0565_process_pixblock_tail, \ + pixman_composite_src_n_0565_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_n_8888_process_pixblock_head +.endm + +.macro pixman_composite_src_n_8888_process_pixblock_tail +.endm + +.macro pixman_composite_src_n_8888_process_pixblock_tail_head + vst1.32 {d0, d1, d2, d3}, [DST_W, :128]! +.endm + +.macro pixman_composite_src_n_8888_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vld1.32 {d0[0]}, [DUMMY] + vsli.u64 d0, d0, #32 + vmov d1, d0 + vmov q1, q0 +.endm + +.macro pixman_composite_src_n_8888_cleanup +.endm + +generate_composite_function \ + pixman_composite_src_n_8888_asm_neon, 0, 0, 32, \ + FLAG_DST_WRITEONLY, \ + 8, /* number of pixels, processed in a single block */ \ + 0, /* prefetch distance */ \ + pixman_composite_src_n_8888_init, \ + pixman_composite_src_n_8888_cleanup, \ + pixman_composite_src_n_8888_process_pixblock_head, \ + pixman_composite_src_n_8888_process_pixblock_tail, \ + pixman_composite_src_n_8888_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_8888_8888_process_pixblock_head +.endm + +.macro pixman_composite_src_8888_8888_process_pixblock_tail +.endm + +.macro pixman_composite_src_8888_8888_process_pixblock_tail_head + vst1.32 {d0, d1, d2, d3}, [DST_W, :128]! + vld1.32 {d0, d1, d2, d3}, [SRC]! + cache_preload 8, 8 +.endm + +generate_composite_function \ + pixman_composite_src_8888_8888_asm_neon, 32, 0, 32, \ + FLAG_DST_WRITEONLY, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_src_8888_8888_process_pixblock_head, \ + pixman_composite_src_8888_8888_process_pixblock_tail, \ + pixman_composite_src_8888_8888_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_x888_8888_process_pixblock_head + vorr q0, q0, q2 + vorr q1, q1, q2 +.endm + +.macro pixman_composite_src_x888_8888_process_pixblock_tail +.endm + +.macro pixman_composite_src_x888_8888_process_pixblock_tail_head + vst1.32 {d0, d1, d2, d3}, [DST_W, :128]! + vld1.32 {d0, d1, d2, d3}, [SRC]! + vorr q0, q0, q2 + vorr q1, q1, q2 + cache_preload 8, 8 +.endm + +.macro pixman_composite_src_x888_8888_init + vmov.u8 q2, #0xFF + vshl.u32 q2, q2, #24 +.endm + +generate_composite_function \ + pixman_composite_src_x888_8888_asm_neon, 32, 0, 32, \ + FLAG_DST_WRITEONLY, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + pixman_composite_src_x888_8888_init, \ + default_cleanup, \ + pixman_composite_src_x888_8888_process_pixblock_head, \ + pixman_composite_src_x888_8888_process_pixblock_tail, \ + pixman_composite_src_x888_8888_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_over_n_8_8888_process_pixblock_head + /* expecting deinterleaved source data in {d8, d9, d10, d11} */ + /* d8 - blue, d9 - green, d10 - red, d11 - alpha */ + /* and destination data in {d4, d5, d6, d7} */ + /* mask is in d24 (d25, d26, d27 are unused) */ + + /* in */ + vmull.u8 q0, d24, d8 + vmull.u8 q1, d24, d9 + vmull.u8 q6, d24, d10 + vmull.u8 q7, d24, d11 + vrshr.u16 q10, q0, #8 + vrshr.u16 q11, q1, #8 + vrshr.u16 q12, q6, #8 + vrshr.u16 q13, q7, #8 + vraddhn.u16 d0, q0, q10 + vraddhn.u16 d1, q1, q11 + vraddhn.u16 d2, q6, q12 + vraddhn.u16 d3, q7, q13 + vmvn.8 d24, d3 /* get inverted alpha */ + /* source: d0 - blue, d1 - green, d2 - red, d3 - alpha */ + /* destination: d4 - blue, d5 - green, d6 - red, d7 - alpha */ + /* now do alpha blending */ + vmull.u8 q8, d24, d4 + vmull.u8 q9, d24, d5 + vmull.u8 q10, d24, d6 + vmull.u8 q11, d24, d7 +.endm + +.macro pixman_composite_over_n_8_8888_process_pixblock_tail + vrshr.u16 q14, q8, #8 + vrshr.u16 q15, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + vraddhn.u16 d30, q12, q10 + vraddhn.u16 d31, q13, q11 + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 +.endm + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_over_n_8_8888_process_pixblock_tail_head + pixman_composite_over_n_8_8888_process_pixblock_tail + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + vld1.8 {d24}, [MASK]! + cache_preload 8, 8 + pixman_composite_over_n_8_8888_process_pixblock_head +.endm + +.macro pixman_composite_over_n_8_8888_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vpush {d8-d15} + vld1.32 {d11[0]}, [DUMMY] + vdup.8 d8, d11[0] + vdup.8 d9, d11[1] + vdup.8 d10, d11[2] + vdup.8 d11, d11[3] +.endm + +.macro pixman_composite_over_n_8_8888_cleanup + vpop {d8-d15} +.endm + +generate_composite_function \ + pixman_composite_over_n_8_8888_asm_neon, 0, 8, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_n_8_8888_init, \ + pixman_composite_over_n_8_8888_cleanup, \ + pixman_composite_over_n_8_8888_process_pixblock_head, \ + pixman_composite_over_n_8_8888_process_pixblock_tail, \ + pixman_composite_over_n_8_8888_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_over_n_8888_8888_ca_process_pixblock_head + /* + * 'combine_mask_ca' replacement + * + * input: solid src (n) in {d8, d9, d10, d11} + * dest in {d4, d5, d6, d7 } + * mask in {d24, d25, d26, d27} + * output: updated src in {d0, d1, d2, d3 } + * updated mask in {d24, d25, d26, d3 } + */ + vmull.u8 q0, d24, d8 + vmull.u8 q1, d25, d9 + vmull.u8 q6, d26, d10 + vmull.u8 q7, d27, d11 + vmull.u8 q9, d11, d25 + vmull.u8 q12, d11, d24 + vmull.u8 q13, d11, d26 + vrshr.u16 q8, q0, #8 + vrshr.u16 q10, q1, #8 + vrshr.u16 q11, q6, #8 + vraddhn.u16 d0, q0, q8 + vraddhn.u16 d1, q1, q10 + vraddhn.u16 d2, q6, q11 + vrshr.u16 q11, q12, #8 + vrshr.u16 q8, q9, #8 + vrshr.u16 q6, q13, #8 + vrshr.u16 q10, q7, #8 + vraddhn.u16 d24, q12, q11 + vraddhn.u16 d25, q9, q8 + vraddhn.u16 d26, q13, q6 + vraddhn.u16 d3, q7, q10 + /* + * 'combine_over_ca' replacement + * + * output: updated dest in {d28, d29, d30, d31} + */ + vmvn.8 d24, d24 + vmvn.8 d25, d25 + vmull.u8 q8, d24, d4 + vmull.u8 q9, d25, d5 + vmvn.8 d26, d26 + vmvn.8 d27, d3 + vmull.u8 q10, d26, d6 + vmull.u8 q11, d27, d7 +.endm + +.macro pixman_composite_over_n_8888_8888_ca_process_pixblock_tail + /* ... continue 'combine_over_ca' replacement */ + vrshr.u16 q14, q8, #8 + vrshr.u16 q15, q9, #8 + vrshr.u16 q6, q10, #8 + vrshr.u16 q7, q11, #8 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + vraddhn.u16 d30, q6, q10 + vraddhn.u16 d31, q7, q11 + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 +.endm + +.macro pixman_composite_over_n_8888_8888_ca_process_pixblock_tail_head + vrshr.u16 q14, q8, #8 + vrshr.u16 q15, q9, #8 + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + vrshr.u16 q6, q10, #8 + vrshr.u16 q7, q11, #8 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + vraddhn.u16 d30, q6, q10 + vraddhn.u16 d31, q7, q11 + vld4.8 {d24, d25, d26, d27}, [MASK]! + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 + cache_preload 8, 8 + pixman_composite_over_n_8888_8888_ca_process_pixblock_head + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! +.endm + +.macro pixman_composite_over_n_8888_8888_ca_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vpush {d8-d15} + vld1.32 {d11[0]}, [DUMMY] + vdup.8 d8, d11[0] + vdup.8 d9, d11[1] + vdup.8 d10, d11[2] + vdup.8 d11, d11[3] +.endm + +.macro pixman_composite_over_n_8888_8888_ca_cleanup + vpop {d8-d15} +.endm + +generate_composite_function \ + pixman_composite_over_n_8888_8888_ca_asm_neon, 0, 32, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_n_8888_8888_ca_init, \ + pixman_composite_over_n_8888_8888_ca_cleanup, \ + pixman_composite_over_n_8888_8888_ca_process_pixblock_head, \ + pixman_composite_over_n_8888_8888_ca_process_pixblock_tail, \ + pixman_composite_over_n_8888_8888_ca_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_add_n_8_8_process_pixblock_head + /* expecting source data in {d8, d9, d10, d11} */ + /* d8 - blue, d9 - green, d10 - red, d11 - alpha */ + /* and destination data in {d4, d5, d6, d7} */ + /* mask is in d24, d25, d26, d27 */ + vmull.u8 q0, d24, d11 + vmull.u8 q1, d25, d11 + vmull.u8 q6, d26, d11 + vmull.u8 q7, d27, d11 + vrshr.u16 q10, q0, #8 + vrshr.u16 q11, q1, #8 + vrshr.u16 q12, q6, #8 + vrshr.u16 q13, q7, #8 + vraddhn.u16 d0, q0, q10 + vraddhn.u16 d1, q1, q11 + vraddhn.u16 d2, q6, q12 + vraddhn.u16 d3, q7, q13 + vqadd.u8 q14, q0, q2 + vqadd.u8 q15, q1, q3 +.endm + +.macro pixman_composite_add_n_8_8_process_pixblock_tail +.endm + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_add_n_8_8_process_pixblock_tail_head + pixman_composite_add_n_8_8_process_pixblock_tail + vst1.8 {d28, d29, d30, d31}, [DST_W, :128]! + vld1.8 {d4, d5, d6, d7}, [DST_R, :128]! + vld1.8 {d24, d25, d26, d27}, [MASK]! + cache_preload 32, 32 + pixman_composite_add_n_8_8_process_pixblock_head +.endm + +.macro pixman_composite_add_n_8_8_init + add DUMMY, sp, #ARGS_STACK_OFFSET + vpush {d8-d15} + vld1.32 {d11[0]}, [DUMMY] + vdup.8 d11, d11[3] +.endm + +.macro pixman_composite_add_n_8_8_cleanup + vpop {d8-d15} +.endm + +generate_composite_function \ + pixman_composite_add_n_8_8_asm_neon, 0, 8, 8, \ + FLAG_DST_READWRITE, \ + 32, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_add_n_8_8_init, \ + pixman_composite_add_n_8_8_cleanup, \ + pixman_composite_add_n_8_8_process_pixblock_head, \ + pixman_composite_add_n_8_8_process_pixblock_tail, \ + pixman_composite_add_n_8_8_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_add_8_8_8_process_pixblock_head + /* expecting source data in {d0, d1, d2, d3} */ + /* destination data in {d4, d5, d6, d7} */ + /* mask in {d24, d25, d26, d27} */ + vmull.u8 q8, d24, d0 + vmull.u8 q9, d25, d1 + vmull.u8 q10, d26, d2 + vmull.u8 q11, d27, d3 + vrshr.u16 q0, q8, #8 + vrshr.u16 q1, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + vraddhn.u16 d0, q0, q8 + vraddhn.u16 d1, q1, q9 + vraddhn.u16 d2, q12, q10 + vraddhn.u16 d3, q13, q11 + vqadd.u8 q14, q0, q2 + vqadd.u8 q15, q1, q3 +.endm + +.macro pixman_composite_add_8_8_8_process_pixblock_tail +.endm + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_add_8_8_8_process_pixblock_tail_head + pixman_composite_add_8_8_8_process_pixblock_tail + vst1.8 {d28, d29, d30, d31}, [DST_W, :128]! + vld1.8 {d4, d5, d6, d7}, [DST_R, :128]! + vld1.8 {d24, d25, d26, d27}, [MASK]! + vld1.8 {d0, d1, d2, d3}, [SRC]! + cache_preload 32, 32 + pixman_composite_add_8_8_8_process_pixblock_head +.endm + +.macro pixman_composite_add_8_8_8_init +.endm + +.macro pixman_composite_add_8_8_8_cleanup +.endm + +generate_composite_function \ + pixman_composite_add_8_8_8_asm_neon, 8, 8, 8, \ + FLAG_DST_READWRITE, \ + 32, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_add_8_8_8_init, \ + pixman_composite_add_8_8_8_cleanup, \ + pixman_composite_add_8_8_8_process_pixblock_head, \ + pixman_composite_add_8_8_8_process_pixblock_tail, \ + pixman_composite_add_8_8_8_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_add_8888_8888_8888_process_pixblock_head + /* expecting source data in {d0, d1, d2, d3} */ + /* destination data in {d4, d5, d6, d7} */ + /* mask in {d24, d25, d26, d27} */ + vmull.u8 q8, d27, d0 + vmull.u8 q9, d27, d1 + vmull.u8 q10, d27, d2 + vmull.u8 q11, d27, d3 + vrshr.u16 q0, q8, #8 + vrshr.u16 q1, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + vraddhn.u16 d0, q0, q8 + vraddhn.u16 d1, q1, q9 + vraddhn.u16 d2, q12, q10 + vraddhn.u16 d3, q13, q11 + vqadd.u8 q14, q0, q2 + vqadd.u8 q15, q1, q3 +.endm + +.macro pixman_composite_add_8888_8888_8888_process_pixblock_tail +.endm + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_add_8888_8888_8888_process_pixblock_tail_head + pixman_composite_add_8888_8888_8888_process_pixblock_tail + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + vld4.8 {d24, d25, d26, d27}, [MASK]! + vld4.8 {d0, d1, d2, d3}, [SRC]! + cache_preload 8, 8 + pixman_composite_add_8888_8888_8888_process_pixblock_head +.endm + +generate_composite_function \ + pixman_composite_add_8888_8888_8888_asm_neon, 32, 32, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_add_8888_8888_8888_process_pixblock_head, \ + pixman_composite_add_8888_8888_8888_process_pixblock_tail, \ + pixman_composite_add_8888_8888_8888_process_pixblock_tail_head + +generate_composite_function_single_scanline \ + pixman_composite_scanline_add_mask_asm_neon, 32, 32, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + default_init, \ + default_cleanup, \ + pixman_composite_add_8888_8888_8888_process_pixblock_head, \ + pixman_composite_add_8888_8888_8888_process_pixblock_tail, \ + pixman_composite_add_8888_8888_8888_process_pixblock_tail_head + +/******************************************************************************/ + +.macro pixman_composite_over_8888_n_8888_process_pixblock_head + /* expecting source data in {d0, d1, d2, d3} */ + /* destination data in {d4, d5, d6, d7} */ + /* solid mask is in d15 */ + + /* 'in' */ + vmull.u8 q8, d15, d3 + vmull.u8 q6, d15, d2 + vmull.u8 q5, d15, d1 + vmull.u8 q4, d15, d0 + vrshr.u16 q13, q8, #8 + vrshr.u16 q12, q6, #8 + vrshr.u16 q11, q5, #8 + vrshr.u16 q10, q4, #8 + vraddhn.u16 d3, q8, q13 + vraddhn.u16 d2, q6, q12 + vraddhn.u16 d1, q5, q11 + vraddhn.u16 d0, q4, q10 + vmvn.8 d24, d3 /* get inverted alpha */ + /* now do alpha blending */ + vmull.u8 q8, d24, d4 + vmull.u8 q9, d24, d5 + vmull.u8 q10, d24, d6 + vmull.u8 q11, d24, d7 +.endm + +.macro pixman_composite_over_8888_n_8888_process_pixblock_tail + vrshr.u16 q14, q8, #8 + vrshr.u16 q15, q9, #8 + vrshr.u16 q12, q10, #8 + vrshr.u16 q13, q11, #8 + vraddhn.u16 d28, q14, q8 + vraddhn.u16 d29, q15, q9 + vraddhn.u16 d30, q12, q10 + vraddhn.u16 d31, q13, q11 + vqadd.u8 q14, q0, q14 + vqadd.u8 q15, q1, q15 +.endm + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_over_8888_n_8888_process_pixblock_tail_head + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + pixman_composite_over_8888_n_8888_process_pixblock_tail + vld4.8 {d0, d1, d2, d3}, [SRC]! + cache_preload 8, 8 + pixman_composite_over_8888_n_8888_process_pixblock_head + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! +.endm + +.macro pixman_composite_over_8888_n_8888_init + add DUMMY, sp, #48 + vpush {d8-d15} + vld1.32 {d15[0]}, [DUMMY] + vdup.8 d15, d15[3] +.endm + +.macro pixman_composite_over_8888_n_8888_cleanup + vpop {d8-d15} +.endm + +generate_composite_function \ + pixman_composite_over_8888_n_8888_asm_neon, 32, 0, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_8888_n_8888_init, \ + pixman_composite_over_8888_n_8888_cleanup, \ + pixman_composite_over_8888_n_8888_process_pixblock_head, \ + pixman_composite_over_8888_n_8888_process_pixblock_tail, \ + pixman_composite_over_8888_n_8888_process_pixblock_tail_head + +/******************************************************************************/ + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_over_8888_8888_8888_process_pixblock_tail_head + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + pixman_composite_over_8888_n_8888_process_pixblock_tail + vld4.8 {d0, d1, d2, d3}, [SRC]! + cache_preload 8, 8 + vld4.8 {d12, d13, d14, d15}, [MASK]! + pixman_composite_over_8888_n_8888_process_pixblock_head + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! +.endm + +.macro pixman_composite_over_8888_8888_8888_init + vpush {d8-d15} +.endm + +.macro pixman_composite_over_8888_8888_8888_cleanup + vpop {d8-d15} +.endm + +generate_composite_function \ + pixman_composite_over_8888_8888_8888_asm_neon, 32, 32, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_8888_8888_8888_init, \ + pixman_composite_over_8888_8888_8888_cleanup, \ + pixman_composite_over_8888_n_8888_process_pixblock_head, \ + pixman_composite_over_8888_n_8888_process_pixblock_tail, \ + pixman_composite_over_8888_8888_8888_process_pixblock_tail_head \ + 28, /* dst_w_basereg */ \ + 4, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 12 /* mask_basereg */ + +generate_composite_function_single_scanline \ + pixman_composite_scanline_over_mask_asm_neon, 32, 32, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + pixman_composite_over_8888_8888_8888_init, \ + pixman_composite_over_8888_8888_8888_cleanup, \ + pixman_composite_over_8888_n_8888_process_pixblock_head, \ + pixman_composite_over_8888_n_8888_process_pixblock_tail, \ + pixman_composite_over_8888_8888_8888_process_pixblock_tail_head \ + 28, /* dst_w_basereg */ \ + 4, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 12 /* mask_basereg */ + +/******************************************************************************/ + +/* TODO: expand macros and do better instructions scheduling */ +.macro pixman_composite_over_8888_8_8888_process_pixblock_tail_head + vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! + pixman_composite_over_8888_n_8888_process_pixblock_tail + vld4.8 {d0, d1, d2, d3}, [SRC]! + cache_preload 8, 8 + vld1.8 {d15}, [MASK]! + pixman_composite_over_8888_n_8888_process_pixblock_head + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! +.endm + +.macro pixman_composite_over_8888_8_8888_init + vpush {d8-d15} +.endm + +.macro pixman_composite_over_8888_8_8888_cleanup + vpop {d8-d15} +.endm + +generate_composite_function \ + pixman_composite_over_8888_8_8888_asm_neon, 32, 8, 32, \ + FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 5, /* prefetch distance */ \ + pixman_composite_over_8888_8_8888_init, \ + pixman_composite_over_8888_8_8888_cleanup, \ + pixman_composite_over_8888_n_8888_process_pixblock_head, \ + pixman_composite_over_8888_n_8888_process_pixblock_tail, \ + pixman_composite_over_8888_8_8888_process_pixblock_tail_head \ + 28, /* dst_w_basereg */ \ + 4, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 15 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_0888_0888_process_pixblock_head +.endm + +.macro pixman_composite_src_0888_0888_process_pixblock_tail +.endm + +.macro pixman_composite_src_0888_0888_process_pixblock_tail_head + vst3.8 {d0, d1, d2}, [DST_W]! + vld3.8 {d0, d1, d2}, [SRC]! + cache_preload 8, 8 +.endm + +generate_composite_function \ + pixman_composite_src_0888_0888_asm_neon, 24, 0, 24, \ + FLAG_DST_WRITEONLY, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_src_0888_0888_process_pixblock_head, \ + pixman_composite_src_0888_0888_process_pixblock_tail, \ + pixman_composite_src_0888_0888_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_0888_8888_rev_process_pixblock_head + vswp d0, d2 +.endm + +.macro pixman_composite_src_0888_8888_rev_process_pixblock_tail +.endm + +.macro pixman_composite_src_0888_8888_rev_process_pixblock_tail_head + vst4.8 {d0, d1, d2, d3}, [DST_W]! + vld3.8 {d0, d1, d2}, [SRC]! + vswp d0, d2 + cache_preload 8, 8 +.endm + +.macro pixman_composite_src_0888_8888_rev_init + veor d3, d3, d3 +.endm + +generate_composite_function \ + pixman_composite_src_0888_8888_rev_asm_neon, 24, 0, 32, \ + FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + pixman_composite_src_0888_8888_rev_init, \ + default_cleanup, \ + pixman_composite_src_0888_8888_rev_process_pixblock_head, \ + pixman_composite_src_0888_8888_rev_process_pixblock_tail, \ + pixman_composite_src_0888_8888_rev_process_pixblock_tail_head, \ + 0, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_0888_0565_rev_process_pixblock_head + vshll.u8 q8, d1, #8 + vshll.u8 q9, d2, #8 +.endm + +.macro pixman_composite_src_0888_0565_rev_process_pixblock_tail + vshll.u8 q14, d0, #8 + vsri.u16 q14, q8, #5 + vsri.u16 q14, q9, #11 +.endm + +.macro pixman_composite_src_0888_0565_rev_process_pixblock_tail_head + vshll.u8 q14, d0, #8 + vld3.8 {d0, d1, d2}, [SRC]! + vsri.u16 q14, q8, #5 + vsri.u16 q14, q9, #11 + vshll.u8 q8, d1, #8 + vst1.16 {d28, d29}, [DST_W, :128]! + vshll.u8 q9, d2, #8 +.endm + +generate_composite_function \ + pixman_composite_src_0888_0565_rev_asm_neon, 24, 0, 16, \ + FLAG_DST_WRITEONLY, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_src_0888_0565_rev_process_pixblock_head, \ + pixman_composite_src_0888_0565_rev_process_pixblock_tail, \ + pixman_composite_src_0888_0565_rev_process_pixblock_tail_head, \ + 28, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ + +/******************************************************************************/ + +.macro pixman_composite_src_pixbuf_8888_process_pixblock_head + vmull.u8 q8, d3, d0 + vmull.u8 q9, d3, d1 + vmull.u8 q10, d3, d2 +.endm + +.macro pixman_composite_src_pixbuf_8888_process_pixblock_tail + vrshr.u16 q11, q8, #8 + vswp d3, d31 + vrshr.u16 q12, q9, #8 + vrshr.u16 q13, q10, #8 + vraddhn.u16 d30, q11, q8 + vraddhn.u16 d29, q12, q9 + vraddhn.u16 d28, q13, q10 +.endm + +.macro pixman_composite_src_pixbuf_8888_process_pixblock_tail_head + vrshr.u16 q11, q8, #8 + vswp d3, d31 + vrshr.u16 q12, q9, #8 + vrshr.u16 q13, q10, #8 + vld4.8 {d0, d1, d2, d3}, [SRC]! + vraddhn.u16 d30, q11, q8 + PF add PF_X, PF_X, #8 + PF tst PF_CTL, #0xF + PF addne PF_X, PF_X, #8 + PF subne PF_CTL, PF_CTL, #1 + vraddhn.u16 d29, q12, q9 + vraddhn.u16 d28, q13, q10 + vmull.u8 q8, d3, d0 + vmull.u8 q9, d3, d1 + vmull.u8 q10, d3, d2 + vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! + PF cmp PF_X, ORIG_W + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] + PF subge PF_X, PF_X, ORIG_W + PF subges PF_CTL, PF_CTL, #0x10 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! +.endm + +generate_composite_function \ + pixman_composite_src_pixbuf_8888_asm_neon, 32, 0, 32, \ + FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ + 8, /* number of pixels, processed in a single block */ \ + 10, /* prefetch distance */ \ + default_init, \ + default_cleanup, \ + pixman_composite_src_pixbuf_8888_process_pixblock_head, \ + pixman_composite_src_pixbuf_8888_process_pixblock_tail, \ + pixman_composite_src_pixbuf_8888_process_pixblock_tail_head, \ + 28, /* dst_w_basereg */ \ + 0, /* dst_r_basereg */ \ + 0, /* src_basereg */ \ + 0 /* mask_basereg */ diff --git a/src/3rdparty/pixman/pixman-arm-neon-asm.h b/src/3rdparty/pixman/pixman-arm-neon-asm.h new file mode 100644 index 0000000000..56c3faebf9 --- /dev/null +++ b/src/3rdparty/pixman/pixman-arm-neon-asm.h @@ -0,0 +1,906 @@ +/* + * Copyright © 2009 Nokia Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Siarhei Siamashka (siarhei.siamashka@nokia.com) + */ + +/* + * This file contains a macro ('generate_composite_function') which can + * construct 2D image processing functions, based on a common template. + * Any combinations of source, destination and mask images with 8bpp, + * 16bpp, 24bpp, 32bpp color formats are supported. + * + * This macro takes care of: + * - handling of leading and trailing unaligned pixels + * - doing most of the work related to L2 cache preload + * - encourages the use of software pipelining for better instructions + * scheduling + * + * The user of this macro has to provide some configuration parameters + * (bit depths for the images, prefetch distance, etc.) and a set of + * macros, which should implement basic code chunks responsible for + * pixels processing. See 'pixman-arm-neon-asm.S' file for the usage + * examples. + * + * TODO: + * - try overlapped pixel method (from Ian Rickards) when processing + * exactly two blocks of pixels + * - maybe add an option to do reverse scanline processing + */ + +/* + * Bit flags for 'generate_composite_function' macro which are used + * to tune generated functions behavior. + */ +.set FLAG_DST_WRITEONLY, 0 +.set FLAG_DST_READWRITE, 1 +.set FLAG_DEINTERLEAVE_32BPP, 2 + +/* + * Offset in stack where mask and source pointer/stride can be accessed + * from 'init' macro. This is useful for doing special handling for solid mask. + */ +.set ARGS_STACK_OFFSET, 40 + +/* + * Constants for selecting preferable prefetch type. + */ +.set PREFETCH_TYPE_NONE, 0 /* No prefetch at all */ +.set PREFETCH_TYPE_SIMPLE, 1 /* A simple, fixed-distance-ahead prefetch */ +.set PREFETCH_TYPE_ADVANCED, 2 /* Advanced fine-grained prefetch */ + +/* + * Definitions of supplementary pixld/pixst macros (for partial load/store of + * pixel data). + */ + +.macro pixldst1 op, elem_size, reg1, mem_operand, abits +.if abits > 0 + op&.&elem_size {d®1}, [&mem_operand&, :&abits&]! +.else + op&.&elem_size {d®1}, [&mem_operand&]! +.endif +.endm + +.macro pixldst2 op, elem_size, reg1, reg2, mem_operand, abits +.if abits > 0 + op&.&elem_size {d®1, d®2}, [&mem_operand&, :&abits&]! +.else + op&.&elem_size {d®1, d®2}, [&mem_operand&]! +.endif +.endm + +.macro pixldst4 op, elem_size, reg1, reg2, reg3, reg4, mem_operand, abits +.if abits > 0 + op&.&elem_size {d®1, d®2, d®3, d®4}, [&mem_operand&, :&abits&]! +.else + op&.&elem_size {d®1, d®2, d®3, d®4}, [&mem_operand&]! +.endif +.endm + +.macro pixldst0 op, elem_size, reg1, idx, mem_operand, abits + op&.&elem_size {d®1[idx]}, [&mem_operand&]! +.endm + +.macro pixldst3 op, elem_size, reg1, reg2, reg3, mem_operand + op&.&elem_size {d®1, d®2, d®3}, [&mem_operand&]! +.endm + +.macro pixldst30 op, elem_size, reg1, reg2, reg3, idx, mem_operand + op&.&elem_size {d®1[idx], d®2[idx], d®3[idx]}, [&mem_operand&]! +.endm + +.macro pixldst numbytes, op, elem_size, basereg, mem_operand, abits +.if numbytes == 32 + pixldst4 op, elem_size, %(basereg+4), %(basereg+5), \ + %(basereg+6), %(basereg+7), mem_operand, abits +.elseif numbytes == 16 + pixldst2 op, elem_size, %(basereg+2), %(basereg+3), mem_operand, abits +.elseif numbytes == 8 + pixldst1 op, elem_size, %(basereg+1), mem_operand, abits +.elseif numbytes == 4 + .if !RESPECT_STRICT_ALIGNMENT || (elem_size == 32) + pixldst0 op, 32, %(basereg+0), 1, mem_operand, abits + .elseif elem_size == 16 + pixldst0 op, 16, %(basereg+0), 2, mem_operand, abits + pixldst0 op, 16, %(basereg+0), 3, mem_operand, abits + .else + pixldst0 op, 8, %(basereg+0), 4, mem_operand, abits + pixldst0 op, 8, %(basereg+0), 5, mem_operand, abits + pixldst0 op, 8, %(basereg+0), 6, mem_operand, abits + pixldst0 op, 8, %(basereg+0), 7, mem_operand, abits + .endif +.elseif numbytes == 2 + .if !RESPECT_STRICT_ALIGNMENT || (elem_size == 16) + pixldst0 op, 16, %(basereg+0), 1, mem_operand, abits + .else + pixldst0 op, 8, %(basereg+0), 2, mem_operand, abits + pixldst0 op, 8, %(basereg+0), 3, mem_operand, abits + .endif +.elseif numbytes == 1 + pixldst0 op, 8, %(basereg+0), 1, mem_operand, abits +.else + .error "unsupported size: numbytes" +.endif +.endm + +.macro pixld numpix, bpp, basereg, mem_operand, abits=0 +.if bpp > 0 +.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0) + pixldst4 vld4, 8, %(basereg+4), %(basereg+5), \ + %(basereg+6), %(basereg+7), mem_operand, abits +.elseif (bpp == 24) && (numpix == 8) + pixldst3 vld3, 8, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand +.elseif (bpp == 24) && (numpix == 4) + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand +.elseif (bpp == 24) && (numpix == 2) + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand +.elseif (bpp == 24) && (numpix == 1) + pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand +.else + pixldst %(numpix * bpp / 8), vld1, %(bpp), basereg, mem_operand, abits +.endif +.endif +.endm + +.macro pixst numpix, bpp, basereg, mem_operand, abits=0 +.if bpp > 0 +.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0) + pixldst4 vst4, 8, %(basereg+4), %(basereg+5), \ + %(basereg+6), %(basereg+7), mem_operand, abits +.elseif (bpp == 24) && (numpix == 8) + pixldst3 vst3, 8, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand +.elseif (bpp == 24) && (numpix == 4) + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand +.elseif (bpp == 24) && (numpix == 2) + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand +.elseif (bpp == 24) && (numpix == 1) + pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand +.else + pixldst %(numpix * bpp / 8), vst1, %(bpp), basereg, mem_operand, abits +.endif +.endif +.endm + +.macro pixld_a numpix, bpp, basereg, mem_operand +.if (bpp * numpix) <= 128 + pixld numpix, bpp, basereg, mem_operand, %(bpp * numpix) +.else + pixld numpix, bpp, basereg, mem_operand, 128 +.endif +.endm + +.macro pixst_a numpix, bpp, basereg, mem_operand +.if (bpp * numpix) <= 128 + pixst numpix, bpp, basereg, mem_operand, %(bpp * numpix) +.else + pixst numpix, bpp, basereg, mem_operand, 128 +.endif +.endm + +.macro vuzp8 reg1, reg2 + vuzp.8 d®1, d®2 +.endm + +.macro vzip8 reg1, reg2 + vzip.8 d®1, d®2 +.endm + +/* deinterleave B, G, R, A channels for eight 32bpp pixels in 4 registers */ +.macro pixdeinterleave bpp, basereg +.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0) + vuzp8 %(basereg+0), %(basereg+1) + vuzp8 %(basereg+2), %(basereg+3) + vuzp8 %(basereg+1), %(basereg+3) + vuzp8 %(basereg+0), %(basereg+2) +.endif +.endm + +/* interleave B, G, R, A channels for eight 32bpp pixels in 4 registers */ +.macro pixinterleave bpp, basereg +.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0) + vzip8 %(basereg+0), %(basereg+2) + vzip8 %(basereg+1), %(basereg+3) + vzip8 %(basereg+2), %(basereg+3) + vzip8 %(basereg+0), %(basereg+1) +.endif +.endm + +/* + * This is a macro for implementing cache preload. The main idea is that + * cache preload logic is mostly independent from the rest of pixels + * processing code. It starts at the top left pixel and moves forward + * across pixels and can jump across scanlines. Prefetch distance is + * handled in an 'incremental' way: it starts from 0 and advances to the + * optimal distance over time. After reaching optimal prefetch distance, + * it is kept constant. There are some checks which prevent prefetching + * unneeded pixel lines below the image (but it still can prefetch a bit + * more data on the right side of the image - not a big issue and may + * be actually helpful when rendering text glyphs). Additional trick is + * the use of LDR instruction for prefetch instead of PLD when moving to + * the next line, the point is that we have a high chance of getting TLB + * miss in this case, and PLD would be useless. + * + * This sounds like it may introduce a noticeable overhead (when working with + * fully cached data). But in reality, due to having a separate pipeline and + * instruction queue for NEON unit in ARM Cortex-A8, normal ARM code can + * execute simultaneously with NEON and be completely shadowed by it. Thus + * we get no performance overhead at all (*). This looks like a very nice + * feature of Cortex-A8, if used wisely. We don't have a hardware prefetcher, + * but still can implement some rather advanced prefetch logic in sofware + * for almost zero cost! + * + * (*) The overhead of the prefetcher is visible when running some trivial + * pixels processing like simple copy. Anyway, having prefetch is a must + * when working with the graphics data. + */ +.macro PF a, x:vararg +.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_ADVANCED) + a x +.endif +.endm + +.macro cache_preload std_increment, boost_increment +.if (src_bpp_shift >= 0) || (dst_r_bpp != 0) || (mask_bpp_shift >= 0) +.if regs_shortage + PF ldr ORIG_W, [sp] /* If we are short on regs, ORIG_W is kept on stack */ +.endif +.if std_increment != 0 + PF add PF_X, PF_X, #std_increment +.endif + PF tst PF_CTL, #0xF + PF addne PF_X, PF_X, #boost_increment + PF subne PF_CTL, PF_CTL, #1 + PF cmp PF_X, ORIG_W +.if src_bpp_shift >= 0 + PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] +.endif +.if dst_r_bpp != 0 + PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] +.endif +.if mask_bpp_shift >= 0 + PF pld, [PF_MASK, PF_X, lsl #mask_bpp_shift] +.endif + PF subge PF_X, PF_X, ORIG_W + PF subges PF_CTL, PF_CTL, #0x10 +.if src_bpp_shift >= 0 + PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]! +.endif +.if dst_r_bpp != 0 + PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! +.endif +.if mask_bpp_shift >= 0 + PF ldrgeb DUMMY, [PF_MASK, MASK_STRIDE, lsl #mask_bpp_shift]! +.endif +.endif +.endm + +.macro cache_preload_simple +.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_SIMPLE) +.if src_bpp > 0 + pld [SRC, #(PREFETCH_DISTANCE_SIMPLE * src_bpp / 8)] +.endif +.if dst_r_bpp > 0 + pld [DST_R, #(PREFETCH_DISTANCE_SIMPLE * dst_r_bpp / 8)] +.endif +.if mask_bpp > 0 + pld [MASK, #(PREFETCH_DISTANCE_SIMPLE * mask_bpp / 8)] +.endif +.endif +.endm + +/* + * Macro which is used to process leading pixels until destination + * pointer is properly aligned (at 16 bytes boundary). When destination + * buffer uses 16bpp format, this is unnecessary, or even pointless. + */ +.macro ensure_destination_ptr_alignment process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head +.if dst_w_bpp != 24 + tst DST_R, #0xF + beq 2f + +.irp lowbit, 1, 2, 4, 8, 16 +local skip1 +.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp)) +.if lowbit < 16 /* we don't need more than 16-byte alignment */ + tst DST_R, #lowbit + beq 1f +.endif + pixld (lowbit * 8 / dst_w_bpp), src_bpp, src_basereg, SRC + pixld (lowbit * 8 / dst_w_bpp), mask_bpp, mask_basereg, MASK +.if dst_r_bpp > 0 + pixld_a (lowbit * 8 / dst_r_bpp), dst_r_bpp, dst_r_basereg, DST_R +.else + add DST_R, DST_R, #lowbit +.endif + PF add PF_X, PF_X, #(lowbit * 8 / dst_w_bpp) + sub W, W, #(lowbit * 8 / dst_w_bpp) +1: +.endif +.endr + pixdeinterleave src_bpp, src_basereg + pixdeinterleave mask_bpp, mask_basereg + pixdeinterleave dst_r_bpp, dst_r_basereg + + process_pixblock_head + cache_preload 0, pixblock_size + cache_preload_simple + process_pixblock_tail + + pixinterleave dst_w_bpp, dst_w_basereg +.irp lowbit, 1, 2, 4, 8, 16 +.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp)) +.if lowbit < 16 /* we don't need more than 16-byte alignment */ + tst DST_W, #lowbit + beq 1f +.endif + pixst_a (lowbit * 8 / dst_w_bpp), dst_w_bpp, dst_w_basereg, DST_W +1: +.endif +.endr +.endif +2: +.endm + +/* + * Special code for processing up to (pixblock_size - 1) remaining + * trailing pixels. As SIMD processing performs operation on + * pixblock_size pixels, anything smaller than this has to be loaded + * and stored in a special way. Loading and storing of pixel data is + * performed in such a way that we fill some 'slots' in the NEON + * registers (some slots naturally are unused), then perform compositing + * operation as usual. In the end, the data is taken from these 'slots' + * and saved to memory. + * + * cache_preload_flag - allows to suppress prefetch if + * set to 0 + * dst_aligned_flag - selects whether destination buffer + * is aligned + */ +.macro process_trailing_pixels cache_preload_flag, \ + dst_aligned_flag, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + tst W, #(pixblock_size - 1) + beq 2f +.irp chunk_size, 16, 8, 4, 2, 1 +.if pixblock_size > chunk_size + tst W, #chunk_size + beq 1f + pixld chunk_size, src_bpp, src_basereg, SRC + pixld chunk_size, mask_bpp, mask_basereg, MASK +.if dst_aligned_flag != 0 + pixld_a chunk_size, dst_r_bpp, dst_r_basereg, DST_R +.else + pixld chunk_size, dst_r_bpp, dst_r_basereg, DST_R +.endif +.if cache_preload_flag != 0 + PF add PF_X, PF_X, #chunk_size +.endif +1: +.endif +.endr + pixdeinterleave src_bpp, src_basereg + pixdeinterleave mask_bpp, mask_basereg + pixdeinterleave dst_r_bpp, dst_r_basereg + + process_pixblock_head +.if cache_preload_flag != 0 + cache_preload 0, pixblock_size + cache_preload_simple +.endif + process_pixblock_tail + pixinterleave dst_w_bpp, dst_w_basereg +.irp chunk_size, 16, 8, 4, 2, 1 +.if pixblock_size > chunk_size + tst W, #chunk_size + beq 1f +.if dst_aligned_flag != 0 + pixst_a chunk_size, dst_w_bpp, dst_w_basereg, DST_W +.else + pixst chunk_size, dst_w_bpp, dst_w_basereg, DST_W +.endif +1: +.endif +.endr +2: +.endm + +/* + * Macro, which performs all the needed operations to switch to the next + * scanline and start the next loop iteration unless all the scanlines + * are already processed. + */ +.macro advance_to_next_scanline start_of_loop_label +.if regs_shortage + ldrd W, [sp] /* load W and H (width and height) from stack */ +.else + mov W, ORIG_W +.endif + add DST_W, DST_W, DST_STRIDE, lsl #dst_bpp_shift +.if src_bpp != 0 + add SRC, SRC, SRC_STRIDE, lsl #src_bpp_shift +.endif +.if mask_bpp != 0 + add MASK, MASK, MASK_STRIDE, lsl #mask_bpp_shift +.endif +.if (dst_w_bpp != 24) + sub DST_W, DST_W, W, lsl #dst_bpp_shift +.endif +.if (src_bpp != 24) && (src_bpp != 0) + sub SRC, SRC, W, lsl #src_bpp_shift +.endif +.if (mask_bpp != 24) && (mask_bpp != 0) + sub MASK, MASK, W, lsl #mask_bpp_shift +.endif + subs H, H, #1 + mov DST_R, DST_W +.if regs_shortage + str H, [sp, #4] /* save updated height to stack */ +.endif + bge start_of_loop_label +.endm + +/* + * Registers are allocated in the following way by default: + * d0, d1, d2, d3 - reserved for loading source pixel data + * d4, d5, d6, d7 - reserved for loading destination pixel data + * d24, d25, d26, d27 - reserved for loading mask pixel data + * d28, d29, d30, d31 - final destination pixel data for writeback to memory + */ +.macro generate_composite_function fname, \ + src_bpp_, \ + mask_bpp_, \ + dst_w_bpp_, \ + flags, \ + pixblock_size_, \ + prefetch_distance, \ + init, \ + cleanup, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head, \ + dst_w_basereg_ = 28, \ + dst_r_basereg_ = 4, \ + src_basereg_ = 0, \ + mask_basereg_ = 24 + + .func fname + .global fname + /* For ELF format also set function visibility to hidden */ +#ifdef __ELF__ + .hidden fname + .type fname, %function +#endif +fname: + push {r4-r12, lr} /* save all registers */ + +/* + * Select prefetch type for this function. If prefetch distance is + * set to 0 or one of the color formats is 24bpp, SIMPLE prefetch + * has to be used instead of ADVANCED. + */ + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_DEFAULT +.if prefetch_distance == 0 + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE +.elseif (PREFETCH_TYPE_CURRENT > PREFETCH_TYPE_SIMPLE) && \ + ((src_bpp_ == 24) || (mask_bpp_ == 24) || (dst_w_bpp_ == 24)) + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_SIMPLE +.endif + +/* + * Make some macro arguments globally visible and accessible + * from other macros + */ + .set src_bpp, src_bpp_ + .set mask_bpp, mask_bpp_ + .set dst_w_bpp, dst_w_bpp_ + .set pixblock_size, pixblock_size_ + .set dst_w_basereg, dst_w_basereg_ + .set dst_r_basereg, dst_r_basereg_ + .set src_basereg, src_basereg_ + .set mask_basereg, mask_basereg_ + +/* + * Assign symbolic names to registers + */ + W .req r0 /* width (is updated during processing) */ + H .req r1 /* height (is updated during processing) */ + DST_W .req r2 /* destination buffer pointer for writes */ + DST_STRIDE .req r3 /* destination image stride */ + SRC .req r4 /* source buffer pointer */ + SRC_STRIDE .req r5 /* source image stride */ + DST_R .req r6 /* destination buffer pointer for reads */ + + MASK .req r7 /* mask pointer */ + MASK_STRIDE .req r8 /* mask stride */ + + PF_CTL .req r9 /* combined lines counter and prefetch */ + /* distance increment counter */ + PF_X .req r10 /* pixel index in a scanline for current */ + /* pretetch position */ + PF_SRC .req r11 /* pointer to source scanline start */ + /* for prefetch purposes */ + PF_DST .req r12 /* pointer to destination scanline start */ + /* for prefetch purposes */ + PF_MASK .req r14 /* pointer to mask scanline start */ + /* for prefetch purposes */ +/* + * Check whether we have enough registers for all the local variables. + * If we don't have enough registers, original width and height are + * kept on top of stack (and 'regs_shortage' variable is set to indicate + * this for the rest of code). Even if there are enough registers, the + * allocation scheme may be a bit different depending on whether source + * or mask is not used. + */ +.if (PREFETCH_TYPE_CURRENT < PREFETCH_TYPE_ADVANCED) + ORIG_W .req r10 /* saved original width */ + DUMMY .req r12 /* temporary register */ + .set regs_shortage, 0 +.elseif mask_bpp == 0 + ORIG_W .req r7 /* saved original width */ + DUMMY .req r8 /* temporary register */ + .set regs_shortage, 0 +.elseif src_bpp == 0 + ORIG_W .req r4 /* saved original width */ + DUMMY .req r5 /* temporary register */ + .set regs_shortage, 0 +.else + ORIG_W .req r1 /* saved original width */ + DUMMY .req r1 /* temporary register */ + .set regs_shortage, 1 +.endif + + .set mask_bpp_shift, -1 +.if src_bpp == 32 + .set src_bpp_shift, 2 +.elseif src_bpp == 24 + .set src_bpp_shift, 0 +.elseif src_bpp == 16 + .set src_bpp_shift, 1 +.elseif src_bpp == 8 + .set src_bpp_shift, 0 +.elseif src_bpp == 0 + .set src_bpp_shift, -1 +.else + .error "requested src bpp (src_bpp) is not supported" +.endif +.if mask_bpp == 32 + .set mask_bpp_shift, 2 +.elseif mask_bpp == 24 + .set mask_bpp_shift, 0 +.elseif mask_bpp == 8 + .set mask_bpp_shift, 0 +.elseif mask_bpp == 0 + .set mask_bpp_shift, -1 +.else + .error "requested mask bpp (mask_bpp) is not supported" +.endif +.if dst_w_bpp == 32 + .set dst_bpp_shift, 2 +.elseif dst_w_bpp == 24 + .set dst_bpp_shift, 0 +.elseif dst_w_bpp == 16 + .set dst_bpp_shift, 1 +.elseif dst_w_bpp == 8 + .set dst_bpp_shift, 0 +.else + .error "requested dst bpp (dst_w_bpp) is not supported" +.endif + +.if (((flags) & FLAG_DST_READWRITE) != 0) + .set dst_r_bpp, dst_w_bpp +.else + .set dst_r_bpp, 0 +.endif +.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0) + .set DEINTERLEAVE_32BPP_ENABLED, 1 +.else + .set DEINTERLEAVE_32BPP_ENABLED, 0 +.endif + +.if prefetch_distance < 0 || prefetch_distance > 15 + .error "invalid prefetch distance (prefetch_distance)" +.endif + +.if src_bpp > 0 + ldr SRC, [sp, #40] +.endif +.if mask_bpp > 0 + ldr MASK, [sp, #48] +.endif + PF mov PF_X, #0 +.if src_bpp > 0 + ldr SRC_STRIDE, [sp, #44] +.endif +.if mask_bpp > 0 + ldr MASK_STRIDE, [sp, #52] +.endif + mov DST_R, DST_W + +.if src_bpp == 24 + sub SRC_STRIDE, SRC_STRIDE, W + sub SRC_STRIDE, SRC_STRIDE, W, lsl #1 +.endif +.if mask_bpp == 24 + sub MASK_STRIDE, MASK_STRIDE, W + sub MASK_STRIDE, MASK_STRIDE, W, lsl #1 +.endif +.if dst_w_bpp == 24 + sub DST_STRIDE, DST_STRIDE, W + sub DST_STRIDE, DST_STRIDE, W, lsl #1 +.endif + +/* + * Setup advanced prefetcher initial state + */ + PF mov PF_SRC, SRC + PF mov PF_DST, DST_R + PF mov PF_MASK, MASK + /* PF_CTL = prefetch_distance | ((h - 1) << 4) */ + PF mov PF_CTL, H, lsl #4 + PF add PF_CTL, #(prefetch_distance - 0x10) + + init +.if regs_shortage + push {r0, r1} +.endif + subs H, H, #1 +.if regs_shortage + str H, [sp, #4] /* save updated height to stack */ +.else + mov ORIG_W, W +.endif + blt 9f + cmp W, #(pixblock_size * 2) + blt 8f +/* + * This is the start of the pipelined loop, which if optimized for + * long scanlines + */ +0: + ensure_destination_ptr_alignment process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + + /* Implement "head (tail_head) ... (tail_head) tail" loop pattern */ + pixld_a pixblock_size, dst_r_bpp, \ + (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R + pixld pixblock_size, src_bpp, \ + (src_basereg - pixblock_size * src_bpp / 64), SRC + pixld pixblock_size, mask_bpp, \ + (mask_basereg - pixblock_size * mask_bpp / 64), MASK + PF add PF_X, PF_X, #pixblock_size + process_pixblock_head + cache_preload 0, pixblock_size + cache_preload_simple + subs W, W, #(pixblock_size * 2) + blt 2f +1: + process_pixblock_tail_head + cache_preload_simple + subs W, W, #pixblock_size + bge 1b +2: + process_pixblock_tail + pixst_a pixblock_size, dst_w_bpp, \ + (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W + + /* Process the remaining trailing pixels in the scanline */ + process_trailing_pixels 1, 1, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + advance_to_next_scanline 0b + +.if regs_shortage + pop {r0, r1} +.endif + cleanup + pop {r4-r12, pc} /* exit */ +/* + * This is the start of the loop, designed to process images with small width + * (less than pixblock_size * 2 pixels). In this case neither pipelining + * nor prefetch are used. + */ +8: + /* Process exactly pixblock_size pixels if needed */ + tst W, #pixblock_size + beq 1f + pixld pixblock_size, dst_r_bpp, \ + (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R + pixld pixblock_size, src_bpp, \ + (src_basereg - pixblock_size * src_bpp / 64), SRC + pixld pixblock_size, mask_bpp, \ + (mask_basereg - pixblock_size * mask_bpp / 64), MASK + process_pixblock_head + process_pixblock_tail + pixst pixblock_size, dst_w_bpp, \ + (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W +1: + /* Process the remaining trailing pixels in the scanline */ + process_trailing_pixels 0, 0, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + advance_to_next_scanline 8b +9: +.if regs_shortage + pop {r0, r1} +.endif + cleanup + pop {r4-r12, pc} /* exit */ + + .unreq SRC + .unreq MASK + .unreq DST_R + .unreq DST_W + .unreq ORIG_W + .unreq W + .unreq H + .unreq SRC_STRIDE + .unreq DST_STRIDE + .unreq MASK_STRIDE + .unreq PF_CTL + .unreq PF_X + .unreq PF_SRC + .unreq PF_DST + .unreq PF_MASK + .unreq DUMMY + .endfunc +.endm + +/* + * A simplified variant of function generation template for a single + * scanline processing (for implementing pixman combine functions) + */ +.macro generate_composite_function_single_scanline fname, \ + src_bpp_, \ + mask_bpp_, \ + dst_w_bpp_, \ + flags, \ + pixblock_size_, \ + init, \ + cleanup, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head, \ + dst_w_basereg_ = 28, \ + dst_r_basereg_ = 4, \ + src_basereg_ = 0, \ + mask_basereg_ = 24 + + .func fname + .global fname + /* For ELF format also set function visibility to hidden */ +#ifdef __ELF__ + .hidden fname + .type fname, %function +#endif +fname: + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE +/* + * Make some macro arguments globally visible and accessible + * from other macros + */ + .set src_bpp, src_bpp_ + .set mask_bpp, mask_bpp_ + .set dst_w_bpp, dst_w_bpp_ + .set pixblock_size, pixblock_size_ + .set dst_w_basereg, dst_w_basereg_ + .set dst_r_basereg, dst_r_basereg_ + .set src_basereg, src_basereg_ + .set mask_basereg, mask_basereg_ +/* + * Assign symbolic names to registers + */ + W .req r0 /* width (is updated during processing) */ + DST_W .req r1 /* destination buffer pointer for writes */ + SRC .req r2 /* source buffer pointer */ + DST_R .req ip /* destination buffer pointer for reads */ + MASK .req r3 /* mask pointer */ + +.if (((flags) & FLAG_DST_READWRITE) != 0) + .set dst_r_bpp, dst_w_bpp +.else + .set dst_r_bpp, 0 +.endif +.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0) + .set DEINTERLEAVE_32BPP_ENABLED, 1 +.else + .set DEINTERLEAVE_32BPP_ENABLED, 0 +.endif + + init + mov DST_R, DST_W + + cmp W, #pixblock_size + blt 8f + + ensure_destination_ptr_alignment process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + + subs W, W, #pixblock_size + blt 7f + + /* Implement "head (tail_head) ... (tail_head) tail" loop pattern */ + pixld_a pixblock_size, dst_r_bpp, \ + (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R + pixld pixblock_size, src_bpp, \ + (src_basereg - pixblock_size * src_bpp / 64), SRC + pixld pixblock_size, mask_bpp, \ + (mask_basereg - pixblock_size * mask_bpp / 64), MASK + process_pixblock_head + subs W, W, #pixblock_size + blt 2f +1: + process_pixblock_tail_head + subs W, W, #pixblock_size + bge 1b +2: + process_pixblock_tail + pixst_a pixblock_size, dst_w_bpp, \ + (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W +7: + /* Process the remaining trailing pixels in the scanline (dst aligned) */ + process_trailing_pixels 0, 1, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + + cleanup + bx lr /* exit */ +8: + /* Process the remaining trailing pixels in the scanline (dst unaligned) */ + process_trailing_pixels 0, 0, \ + process_pixblock_head, \ + process_pixblock_tail, \ + process_pixblock_tail_head + + cleanup + bx lr /* exit */ + + .unreq SRC + .unreq MASK + .unreq DST_R + .unreq DST_W + .unreq W + .endfunc +.endm + +.macro default_init +.endm + +.macro default_cleanup +.endm diff --git a/src/3rdparty/powervr/pvr2d.h b/src/3rdparty/powervr/pvr2d.h new file mode 100644 index 0000000000..07f28c7316 --- /dev/null +++ b/src/3rdparty/powervr/pvr2d.h @@ -0,0 +1,502 @@ +/*!**************************************************************************** +@File pvr2d.h +@Title PVR2D external header file +@Author Imagination Technologies +@Copyright Copyright (c) by Imagination Technologies Limited. + This specification is protected by copyright laws and contains + material proprietary to Imagination Technologies Limited. + You may use and distribute this specification free of charge for implementing + the functionality therein, without altering or removing any trademark, copyright, + or other notice from the specification. +@Platform Generic +@Description PVR2D definitions for PVR2D clients +******************************************************************************/ + + +/****************************************************************************** +Modifications :- +$Log: pvr2d.h $ +******************************************************************************/ + +#ifndef _PVR2D_H_ +#define _PVR2D_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* PVR2D Platform-specific definitions */ +#define PVR2D_EXPORT +#define PVR2D_IMPORT + + +#define PVR2D_REV_MAJOR 2 +#define PVR2D_REV_MINOR 1 + +typedef enum +{ + PVR2D_FALSE = 0, + PVR2D_TRUE +} PVR2D_BOOL; + + +/* error codes */ +typedef enum +{ + PVR2D_OK = 0, + PVR2DERROR_INVALID_PARAMETER = -1, + PVR2DERROR_DEVICE_UNAVAILABLE = -2, + PVR2DERROR_INVALID_CONTEXT = -3, + PVR2DERROR_MEMORY_UNAVAILABLE = -4, + PVR2DERROR_DEVICE_NOT_PRESENT = -5, + PVR2DERROR_IOCTL_ERROR = -6, + PVR2DERROR_GENERIC_ERROR = -7, + PVR2DERROR_BLT_NOTCOMPLETE = -8, + PVR2DERROR_HW_FEATURE_NOT_SUPPORTED = -9, + PVR2DERROR_NOT_YET_IMPLEMENTED = -10, + PVR2DERROR_MAPPING_FAILED = -11 +}PVR2DERROR; + + +/* pixel formats */ +typedef enum +{ + PVR2D_1BPP = 0, + PVR2D_RGB565, + PVR2D_ARGB4444, + PVR2D_RGB888, + PVR2D_ARGB8888, + PVR2D_ARGB1555, + PVR2D_ALPHA8, + PVR2D_ALPHA4, + PVR2D_PAL2, + PVR2D_PAL4, + PVR2D_PAL8, + PVR2D_VGAEMU + +}PVR2DFORMAT; + + +/* wrap surface type */ +typedef enum +{ + PVR2D_WRAPFLAG_NONCONTIGUOUS = 0, + PVR2D_WRAPFLAG_CONTIGUOUS = 1, + +}PVR2DWRAPFLAGS; + +/* flags for control information of additional blits */ +typedef enum +{ + PVR2D_BLIT_DISABLE_ALL = 0x0000, /* disable all additional controls */ + PVR2D_BLIT_CK_ENABLE = 0x0001, /* enable colour key */ + PVR2D_BLIT_GLOBAL_ALPHA_ENABLE = 0x0002, /* enable standard global alpha */ + PVR2D_BLIT_PERPIXEL_ALPHABLEND_ENABLE = 0x0004, /* enable per-pixel alpha bleding */ + PVR2D_BLIT_PAT_SURFACE_ENABLE = 0x0008, /* enable pattern surf (disable fill) */ + PVR2D_BLIT_FULLY_SPECIFIED_ALPHA_ENABLE = 0x0010, /* enable fully specified alpha */ + PVR2D_BLIT_ROT_90 = 0x0020, /* apply 90 degree rotation to the blt */ + PVR2D_BLIT_ROT_180 = 0x0040, /* apply 180 degree rotation to the blt */ + PVR2D_BLIT_ROT_270 = 0x0080, /* apply 270 degree rotation to the blt */ + PVR2D_BLIT_COPYORDER_TL2BR = 0x0100, /* copy order overrides */ + PVR2D_BLIT_COPYORDER_BR2TL = 0x0200, + PVR2D_BLIT_COPYORDER_TR2BL = 0x0400, + PVR2D_BLIT_COPYORDER_BL2TR = 0x0800, + PVR2D_BLIT_COLKEY_SOURCE = 0x1000, /* Key colour is on the source surface */ + PVR2D_BLIT_COLKEY_DEST = 0x2000 /* Key colour is on the destination surface */ + +} PVR2DBLITFLAGS; + +/* standard alpha-blending functions, AlphaBlendingFunc field of PVR2DBLTINFO */ +typedef enum +{ + PVR2D_ALPHA_OP_SRC_DSTINV = 1, /* source alpha : Cdst = Csrc*Asrc + Cdst*(1-Asrc) */ + PVR2D_ALPHA_OP_SRCP_DSTINV = 2 /* premultiplied source alpha : Cdst = Csrc + Cdst*(1-Asrc) */ +} PVR2D_ALPHABLENDFUNC; + +/* blend ops for fully specified alpha */ +typedef enum +{ + PVR2D_BLEND_OP_ZERO = 0, + PVR2D_BLEND_OP_ONE = 1, + PVR2D_BLEND_OP_SRC = 2, + PVR2D_BLEND_OP_DST = 3, + PVR2D_BLEND_OP_GLOBAL = 4, + PVR2D_BLEND_OP_SRC_PLUS_GLOBAL = 5, + PVR2D_BLEND_OP_DST_PLUS_GLOBAL = 6 +}PVR2D_BLEND_OP; + + +typedef void* PVR2D_HANDLE; + + +/* Fully specified alpha blend : pAlpha field of PVR2DBLTINFO structure */ +/* a fully specified Alpha Blend operation is defined as */ +/* DST (ALPHA) = (ALPHA_1 * SRC (ALPHA)) + (ALPHA_3 * DST (ALPHA)) */ +/* DST (RGB) = (ALPHA_2 * SRC (RGB)) + (ALPHA_4 * DST (RGB)) */ +/* if the pre-multiplication stage is enabled then the equations become the following: */ +/* PRE_MUL = ((SRC(A)) * (Global Alpha Value)) */ +/* DST (ALPHA) = (ALPHA_1 * SRC (ALPHA)) + (PRE_MUL * DST (ALPHA)) */ +/* DST (RGB) = (ALPHA_2 * SRC (RGB)) + (PRE_MUL * DST (RGB)) */ +/* if the transparent source alpha stage is enabled then a source alpha of zero forces the */ +/* source to be transparent for that pixel regardless of the blend equation being used. */ +typedef struct _PVR2D_ALPHABLT +{ + PVR2D_BLEND_OP eAlpha1; + PVR2D_BOOL bAlpha1Invert; + PVR2D_BLEND_OP eAlpha2; + PVR2D_BOOL bAlpha2Invert; + PVR2D_BLEND_OP eAlpha3; + PVR2D_BOOL bAlpha3Invert; + PVR2D_BLEND_OP eAlpha4; + PVR2D_BOOL bAlpha4Invert; + PVR2D_BOOL bPremulAlpha; /* enable pre-multiplication stage */ + PVR2D_BOOL bTransAlpha; /* enable transparent source alpha stage */ + PVR2D_BOOL bUpdateAlphaLookup; /* enable and update the 1555-Lookup alpha table */ + unsigned char uAlphaLookup0; /* 8 bit alpha when A=0 in a 1555-Lookup surface */ + unsigned char uAlphaLookup1; /* 8 bit alpha when A=1 in a 1555-Lookup surface */ + unsigned char uGlobalRGB; /* Global Alpha Value for RGB, 0=transparent 255=opaque */ + unsigned char uGlobalA; /* Global Alpha Value for Alpha */ + +} PVR2D_ALPHABLT, *PPVR2D_ALPHABLT; + + +/* surface memory info structure */ +typedef struct _PVR2DMEMINFO +{ + void *pBase; + unsigned long ui32MemSize; + unsigned long ui32DevAddr; + unsigned long ulFlags; + void *hPrivateData; + void *hPrivateMapData; + +}PVR2DMEMINFO, *PPVR2DMEMINFO; + + +#define PVR2D_MAX_DEVICE_NAME 20 + +typedef struct _PVR2DDEVICEINFO +{ + unsigned long ulDevID; + char szDeviceName[PVR2D_MAX_DEVICE_NAME]; +}PVR2DDEVICEINFO; + + +typedef struct _PVR2DISPLAYINFO +{ + unsigned long ulMaxFlipChains; + unsigned long ulMaxBuffersInChain; + PVR2DFORMAT eFormat; + unsigned long ulWidth; + unsigned long ulHeight; + long lStride; + unsigned long ulMinFlipInterval; + unsigned long ulMaxFlipInterval; + +}PVR2DDISPLAYINFO; + + +typedef struct _PVR2DBLTINFO +{ + unsigned long CopyCode; /* rop code */ + unsigned long Colour; /* fill colour */ + unsigned long ColourKey; /* colour key */ + unsigned char GlobalAlphaValue; /* global alpha blending */ + unsigned char AlphaBlendingFunc; /* per-pixel alpha-blending function */ + + PVR2DBLITFLAGS BlitFlags; /* additional blit control information */ + + PVR2DMEMINFO *pDstMemInfo; /* destination memory */ + unsigned long DstOffset; /* byte offset from start of allocation to destination surface pixel 0,0 */ + long DstStride; /* signed stride, the number of bytes from pixel 0,0 to 0,1 */ + long DstX, DstY; /* pixel offset from start of dest surface to start of blt rectangle */ + long DSizeX,DSizeY; /* blt size */ + PVR2DFORMAT DstFormat; /* dest format */ + unsigned long DstSurfWidth; /* size of dest surface in pixels */ + unsigned long DstSurfHeight; /* size of dest surface in pixels */ + + PVR2DMEMINFO *pSrcMemInfo; /* source mem, (source fields are also used for patterns) */ + unsigned long SrcOffset; /* byte offset from start of allocation to src/pat surface pixel 0,0 */ + long SrcStride; /* signed stride, the number of bytes from pixel 0,0 to 0,1 */ + long SrcX, SrcY; /* pixel offset from start of surface to start of source rectangle */ + /* for patterns this is the start offset within the pattern */ + long SizeX,SizeY; /* source rectangle size or pattern size in pixels */ + PVR2DFORMAT SrcFormat; /* source/pattern format */ + PVR2DMEMINFO *pPalMemInfo; /* source/pattern palette memory containing argb8888 colour table */ + unsigned long PalOffset; /* byte offset from start of allocation to start of palette */ + unsigned long SrcSurfWidth; /* size of source surface in pixels */ + unsigned long SrcSurfHeight; /* size of source surface in pixels */ + + PVR2DMEMINFO *pMaskMemInfo; /* mask memory, 1bpp format implied */ + unsigned long MaskOffset; /* byte offset from start of allocation to mask surface pixel 0,0 */ + long MaskStride; /* signed stride, the number of bytes from pixel 0,0 to 0,1 */ + long MaskX, MaskY; /* mask rect top left (mask size = blt size) */ + unsigned long MaskSurfWidth; /* size of mask surface in pixels */ + unsigned long MaskSurfHeight; /* size of mask surface in pixels */ + + PPVR2D_ALPHABLT pAlpha; /* fully specified alpha blend */ + +}PVR2DBLTINFO, *PPVR2DBLTINFO; + +typedef struct _PVR2DRECT +{ + long left, top; + long right, bottom; +} PVR2DRECT; + +typedef struct +{ + PVR2DMEMINFO *pSurfMemInfo; /* surface memory */ + unsigned long SurfOffset; /* byte offset from start of allocation to destination surface pixel 0,0 */ + long Stride; /* signed stride */ + PVR2DFORMAT Format; + unsigned long SurfWidth; /* surface size in pixels */ + unsigned long SurfHeight; + +} PVR2D_SURFACE, *PPVR2D_SURFACE; + +typedef struct +{ + unsigned long *pUseCode; /* USSE code */ + unsigned long UseCodeSize; /* usse code size in bytes */ + +} PVR2D_USECODE, *PPVR2D_USECODE; + +typedef struct +{ + PVR2D_SURFACE sDst; /* destination surface */ + PVR2D_SURFACE sSrc; /* source surface */ + PVR2DRECT rcDest; /* destination rectangle */ + PVR2DRECT rcSource; /* source rectangle */ + PVR2D_HANDLE hUseCode; /* custom USE code (NULL implies source copy) */ + unsigned long UseParams[2]; /* per-blt params for use code */ + +} PVR2D_3DBLT, *PPVR2D_3DBLT; + + +#define MAKE_COPY_BLIT(src,soff,dest,doff,sx,sy,dx,dy,sz) + +typedef void* PVR2DCONTEXTHANDLE; +typedef void* PVR2DFLIPCHAINHANDLE; + + +// CopyCode field of PVR2DBLTINFO structure: +// the CopyCode field of the PVR2DBLTINFO structure should contain a rop3 or rop4 code. +// a rop3 is an 8 bit code that describes a blt with three inputs : source dest and pattern +// rop4 is a 16 bit code that describes a blt with four inputs : source dest pattern and mask +// common rop3 codes are defined below +// a colour fill blt is processed in the pattern channel as a constant colour with a rop code of 0xF0 +// PVR2D_BLIT_PAT_SURFACE_ENABLE defines whether the pattern channel is a surface or a fill colour. +// a rop4 is defined by two rop3 codes, and the 1 bit-per-pixel mask surface defines which is used. +// a common rop4 is 0xAAF0 which is the mask copy blt used for text glyphs. +// CopyCode is taken to be a rop4 when pMaskMemInfo is non zero, otherwise it is assumed to be a rop3 +// use the PVR2DMASKROP4 macro below to construct a rop4 from two rop3's +// rop3a is the rop used when mask pixel = 1, and rop3b when mask = 0 +#define PVR2DROP4(rop3b, rop3a) ((rop3b<<8)|rop3a) + +/* common rop codes */ +#define PVR2DROPclear 0x00 /* 0 (whiteness) */ +#define PVR2DROPset 0xFF /* 1 (blackness) */ +#define PVR2DROPnoop 0xAA /* dst (used for masked blts) */ + +/* source and dest rop codes */ +#define PVR2DROPand 0x88 /* src AND dst */ +#define PVR2DROPandReverse 0x44 /* src AND NOT dst */ +#define PVR2DROPcopy 0xCC /* src (used for source copy and alpha blts) */ +#define PVR2DROPandInverted 0x22 /* NOT src AND dst */ +#define PVR2DROPxor 0x66 /* src XOR dst */ +#define PVR2DROPor 0xEE /* src OR dst */ +#define PVR2DROPnor 0x11 /* NOT src AND NOT dst */ +#define PVR2DROPequiv 0x99 /* NOT src XOR dst */ +#define PVR2DROPinvert 0x55 /* NOT dst */ +#define PVR2DROPorReverse 0xDD /* src OR NOT dst */ +#define PVR2DROPcopyInverted 0x33 /* NOT src */ +#define PVR2DROPorInverted 0xBB /* NOT src OR dst */ +#define PVR2DROPnand 0x77 /* NOT src OR NOT dst */ + +/* pattern rop codes */ +#define PVR2DPATROPand 0xA0 /* pat AND dst */ +#define PVR2DPATROPandReverse 0x50 /* pat AND NOT dst */ +#define PVR2DPATROPcopy 0xF0 /* pat (used for solid color fills and pattern blts) */ +#define PVR2DPATROPandInverted 0x0A /* NOT pat AND dst */ +#define PVR2DPATROPxor 0x5A /* pat XOR dst */ +#define PVR2DPATROPor 0xFA /* pat OR dst */ +#define PVR2DPATROPnor 0x05 /* NOT pat AND NOT dst */ +#define PVR2DPATROPequiv 0xA5 /* NOT pat XOR dst */ +#define PVR2DPATROPinvert 0x55 /* NOT dst */ +#define PVR2DPATROPorReverse 0xF5 /* pat OR NOT dst */ +#define PVR2DPATROPcopyInverted 0x0F /* NOT pat */ +#define PVR2DPATROPorInverted 0xAF /* NOT pat OR dst */ +#define PVR2DPATROPnand 0x5F /* NOT pat OR NOT dst */ + +/* common rop4 codes */ +#define PVR2DROP4MaskedCopy PVR2DROP4(PVR2DROPnoop,PVR2DROPcopy) /* masked source copy blt (used for rounded window corners etc) */ +#define PVR2DROP4MaskedFill PVR2DROP4(PVR2DROPnoop,PVR2DPATROPcopy) /* masked colour fill blt (used for text) */ + +/* Legacy support */ +#define PVR2DROP3_PATMASK PVR2DPATROPcopy +#define PVR2DROP3_SRCMASK PVR2DROPcopy + +/* pixmap memory alignment */ +#define PVR2D_ALIGNMENT_4 4 /* DWORD alignment */ +#define PVR2D_ALIGNMENT_ANY 0 /* no alignment */ +#define PVR2D_ALIGNMENT_PALETTE 16 /* 16 byte alignment is required for palettes */ + +/* Heap number for PVR2DGetFrameBuffer */ +#define PVR2D_FB_PRIMARY_SURFACE 0 + +#define PVR2D_PRESENT_PROPERTY_SRCSTRIDE (1 << 0) +#define PVR2D_PRESENT_PROPERTY_DSTSIZE (1 << 1) +#define PVR2D_PRESENT_PROPERTY_DSTPOS (1 << 2) +#define PVR2D_PRESENT_PROPERTY_CLIPRECTS (1 << 3) +#define PVR2D_PRESENT_PROPERTY_INTERVAL (1 << 4) + + +#define PVR2D_CREATE_FLIPCHAIN_SHARED (1 << 0) +#define PVR2D_CREATE_FLIPCHAIN_QUERY (1 << 1) + +/* Functions that the library exports */ + +PVR2D_IMPORT +int PVR2DEnumerateDevices(PVR2DDEVICEINFO *pDevInfo); + +PVR2D_IMPORT +PVR2DERROR PVR2DCreateDeviceContext(unsigned long ulDevID, + PVR2DCONTEXTHANDLE* phContext, + unsigned long ulFlags); + +PVR2D_IMPORT +PVR2DERROR PVR2DDestroyDeviceContext(PVR2DCONTEXTHANDLE hContext); + +PVR2D_IMPORT +PVR2DERROR PVR2DGetDeviceInfo(PVR2DCONTEXTHANDLE hContext, + PVR2DDISPLAYINFO *pDisplayInfo); + +PVR2D_IMPORT +PVR2DERROR PVR2DGetScreenMode(PVR2DCONTEXTHANDLE hContext, + PVR2DFORMAT *pFormat, + long *plWidth, + long *plHeight, + long *plStride, + int *piRefreshRate); + +PVR2D_IMPORT +PVR2DERROR PVR2DGetFrameBuffer(PVR2DCONTEXTHANDLE hContext, + int nHeap, + PVR2DMEMINFO **ppsMemInfo); + +PVR2D_IMPORT +PVR2DERROR PVR2DMemAlloc(PVR2DCONTEXTHANDLE hContext, + unsigned long ulBytes, + unsigned long ulAlign, + unsigned long ulFlags, + PVR2DMEMINFO **ppsMemInfo); + +PVR2D_IMPORT +PVR2DERROR PVR2DMemWrap(PVR2DCONTEXTHANDLE hContext, + void *pMem, + unsigned long ulFlags, + unsigned long ulBytes, + unsigned long alPageAddress[], + PVR2DMEMINFO **ppsMemInfo); + +PVR2D_IMPORT +PVR2DERROR PVR2DMemMap(PVR2DCONTEXTHANDLE hContext, + unsigned long ulFlags, + void *hPrivateMapData, + PVR2DMEMINFO **ppsDstMem); + +PVR2D_IMPORT +PVR2DERROR PVR2DMemFree(PVR2DCONTEXTHANDLE hContext, + PVR2DMEMINFO *psMemInfo); + +PVR2D_IMPORT +PVR2DERROR PVR2DBlt(PVR2DCONTEXTHANDLE hContext, + PVR2DBLTINFO *pBltInfo); + +PVR2D_IMPORT +PVR2DERROR PVR2DBltClipped(PVR2DCONTEXTHANDLE hContext, + PVR2DBLTINFO *pBltInfo, + unsigned long ulNumClipRects, + PVR2DRECT *pClipRects); + +PVR2D_IMPORT +PVR2DERROR PVR2DQueryBlitsComplete(PVR2DCONTEXTHANDLE hContext, + PVR2DMEMINFO *pMemInfo, + unsigned int uiWaitForComplete); + +PVR2D_IMPORT +PVR2DERROR PVR2DSetPresentBltProperties(PVR2DCONTEXTHANDLE hContext, + unsigned long ulPropertyMask, + long lSrcStride, + unsigned long ulDstWidth, + unsigned long ulDstHeight, + long lDstXPos, + long lDstYPos, + unsigned long ulNumClipRects, + PVR2DRECT *pClipRects, + unsigned long ulSwapInterval); + +PVR2D_IMPORT +PVR2DERROR PVR2DPresentBlt(PVR2DCONTEXTHANDLE hContext, + PVR2DMEMINFO *pMemInfo, + long lRenderID); + +PVR2D_IMPORT +PVR2DERROR PVR2DCreateFlipChain(PVR2DCONTEXTHANDLE hContext, + unsigned long ulFlags, + unsigned long ulNumBuffers, + unsigned long ulWidth, + unsigned long ulHeight, + PVR2DFORMAT eFormat, + long *plStride, + unsigned long *pulFlipChainID, + PVR2DFLIPCHAINHANDLE *phFlipChain); + +PVR2D_IMPORT +PVR2DERROR PVR2DDestroyFlipChain(PVR2DCONTEXTHANDLE hContext, + PVR2DFLIPCHAINHANDLE hFlipChain); + +PVR2D_IMPORT +PVR2DERROR PVR2DGetFlipChainBuffers(PVR2DCONTEXTHANDLE hContext, + PVR2DFLIPCHAINHANDLE hFlipChain, + unsigned long *pulNumBuffers, + PVR2DMEMINFO *psMemInfo[]); + +PVR2D_IMPORT +PVR2DERROR PVR2DSetPresentFlipProperties(PVR2DCONTEXTHANDLE hContext, + PVR2DFLIPCHAINHANDLE hFlipChain, + unsigned long ulPropertyMask, + long lDstXPos, + long lDstYPos, + unsigned long ulNumClipRects, + PVR2DRECT *pClipRects, + unsigned long ulSwapInterval); + +PVR2D_IMPORT +PVR2DERROR PVR2DPresentFlip(PVR2DCONTEXTHANDLE hContext, + PVR2DFLIPCHAINHANDLE hFlipChain, + PVR2DMEMINFO *psMemInfo, + long lRenderID); + +PVR2D_IMPORT +PVR2DERROR PVR2DGetAPIRev(long *lRevMajor, long *lRevMinor); + +PVR2D_IMPORT +PVR2DERROR PVR2DLoadUseCode (const PVR2DCONTEXTHANDLE hContext, const unsigned char *pUseCode, + const unsigned long UseCodeSize, PVR2D_HANDLE *pUseCodeHandle); +PVR2D_IMPORT +PVR2DERROR PVR2DFreeUseCode (const PVR2DCONTEXTHANDLE hContext, const PVR2D_HANDLE hUseCodeHandle); + +PVR2D_IMPORT +PVR2DERROR PVR2DBlt3D (const PVR2DCONTEXTHANDLE hContext, const PPVR2D_3DBLT pBlt3D); + +#ifdef __cplusplus +} +#endif + +#endif /* _PVR2D_H_ */ + +/****************************************************************************** + End of file (pvr2d.h) +******************************************************************************/ diff --git a/src/3rdparty/powervr/wsegl.h b/src/3rdparty/powervr/wsegl.h new file mode 100644 index 0000000000..04906076a8 --- /dev/null +++ b/src/3rdparty/powervr/wsegl.h @@ -0,0 +1,240 @@ +/****************************************************************************** + Name : wsegl.h + Copyright : Copyright (c) Imagination Technologies Limited. + This specification is protected by copyright laws and contains + material proprietary to Imagination Technologies Limited. + You may use and distribute this specification free of charge for implementing + the functionality therein, without altering or removing any trademark, copyright, + or other notice from the specification. + Platform : ANSI +*****************************************************************************/ + + +#if !defined(__WSEGL_H__) +#define __WSEGL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +// WSEGL Platform-specific definitions +*/ +#define WSEGL_EXPORT +#define WSEGL_IMPORT + +/* +// WSEGL API Version Number +*/ + +#define WSEGL_VERSION 1 +#define WSEGL_DEFAULT_DISPLAY 0 +#define WSEGL_DEFAULT_NATIVE_ENGINE 0 + +#define WSEGL_FALSE 0 +#define WSEGL_TRUE 1 +#define WSEGL_NULL 0 + +#define WSEGL_UNREFERENCED_PARAMETER(param) (param) = (param) + +/* +// WSEGL handles +*/ +typedef void *WSEGLDisplayHandle; +typedef void *WSEGLDrawableHandle; + +/* +// Display capability type +*/ +typedef enum WSEGLCapsType_TAG +{ + WSEGL_NO_CAPS = 0, + WSEGL_CAP_MIN_SWAP_INTERVAL = 1, /* System default value = 1 */ + WSEGL_CAP_MAX_SWAP_INTERVAL = 2, /* System default value = 1 */ + WSEGL_CAP_WINDOWS_USE_HW_SYNC = 3, /* System default value = 0 (FALSE) */ + WSEGL_CAP_PIXMAPS_USE_HW_SYNC = 4, /* System default value = 0 (FALSE) */ + +} WSEGLCapsType; + +/* +// Display capability +*/ +typedef struct WSEGLCaps_TAG +{ + WSEGLCapsType eCapsType; + unsigned long ui32CapsValue; + +} WSEGLCaps; + +/* +// Drawable type +*/ +#define WSEGL_NO_DRAWABLE 0x0 +#define WSEGL_DRAWABLE_WINDOW 0x1 +#define WSEGL_DRAWABLE_PIXMAP 0x2 + + +/* +// Pixel format of display/drawable +*/ +typedef enum WSEGLPixelFormat_TAG +{ + WSEGL_PIXELFORMAT_565 = 0, + WSEGL_PIXELFORMAT_4444 = 1, + WSEGL_PIXELFORMAT_8888 = 2, + WSEGL_PIXELFORMAT_1555 = 3 + +} WSEGLPixelFormat; + +/* +// Transparent of display/drawable +*/ +typedef enum WSEGLTransparentType_TAG +{ + WSEGL_OPAQUE = 0, + WSEGL_COLOR_KEY = 1, + +} WSEGLTransparentType; + +/* +// Display/drawable configuration +*/ +typedef struct WSEGLConfig_TAG +{ + /* + // Type of drawables this configuration applies to - + // OR'd values of drawable types. + */ + unsigned long ui32DrawableType; + + /* Pixel format */ + WSEGLPixelFormat ePixelFormat; + + /* Native Renderable - set to WSEGL_TRUE if native renderable */ + unsigned long ulNativeRenderable; + + /* FrameBuffer Level Parameter */ + unsigned long ulFrameBufferLevel; + + /* Native Visual ID */ + unsigned long ulNativeVisualID; + + /* Native Visual */ + void *hNativeVisual; + + /* Transparent Type */ + WSEGLTransparentType eTransparentType; + + /* Transparent Color - only used if transparent type is COLOR_KEY */ + unsigned long ulTransparentColor; /* packed as 0x00RRGGBB */ + + +} WSEGLConfig; + +/* +// WSEGL errors +*/ +typedef enum WSEGLError_TAG +{ + WSEGL_SUCCESS = 0, + WSEGL_CANNOT_INITIALISE = 1, + WSEGL_BAD_NATIVE_DISPLAY = 2, + WSEGL_BAD_NATIVE_WINDOW = 3, + WSEGL_BAD_NATIVE_PIXMAP = 4, + WSEGL_BAD_NATIVE_ENGINE = 5, + WSEGL_BAD_DRAWABLE = 6, + WSEGL_BAD_CONFIG = 7, + WSEGL_OUT_OF_MEMORY = 8 + +} WSEGLError; + +/* +// Drawable orientation (in degrees anti-clockwise) +*/ +typedef enum WSEGLRotationAngle_TAG +{ + WSEGL_ROTATE_0 = 0, + WSEGL_ROTATE_90 = 1, + WSEGL_ROTATE_180 = 2, + WSEGL_ROTATE_270 = 3 + +} WSEGLRotationAngle; + +/* +// Drawable information required by OpenGL-ES driver +*/ +typedef struct WSEGLDrawableParams_TAG +{ + /* Width in pixels of the drawable */ + unsigned long ui32Width; + + /* Height in pixels of the drawable */ + unsigned long ui32Height; + + /* Stride in pixels of the drawable */ + unsigned long ui32Stride; + + /* Pixel format of the drawable */ + WSEGLPixelFormat ePixelFormat; + + /* User space cpu virtual address of the drawable */ + void *pvLinearAddress; + + /* HW address of the drawable */ + unsigned long ui32HWAddress; + + /* Private data for the drawable */ + void *hPrivateData; + +} WSEGLDrawableParams; + + +/* +// Table of function pointers that is returned by WSEGL_GetFunctionTablePointer() +// +// The first entry in the table is the version number of the wsegl.h header file that +// the module has been written against, and should therefore be set to WSEGL_VERSION +*/ +typedef struct WSEGL_FunctionTable_TAG +{ + unsigned long ui32WSEGLVersion; + + WSEGLError (*pfnWSEGL_IsDisplayValid)(NativeDisplayType); + + WSEGLError (*pfnWSEGL_InitialiseDisplay)(NativeDisplayType, WSEGLDisplayHandle *, const WSEGLCaps **, WSEGLConfig **); + + WSEGLError (*pfnWSEGL_CloseDisplay)(WSEGLDisplayHandle); + + WSEGLError (*pfnWSEGL_CreateWindowDrawable)(WSEGLDisplayHandle, WSEGLConfig *, WSEGLDrawableHandle *, NativeWindowType, WSEGLRotationAngle *); + + WSEGLError (*pfnWSEGL_CreatePixmapDrawable)(WSEGLDisplayHandle, WSEGLConfig *, WSEGLDrawableHandle *, NativePixmapType, WSEGLRotationAngle *); + + WSEGLError (*pfnWSEGL_DeleteDrawable)(WSEGLDrawableHandle); + + WSEGLError (*pfnWSEGL_SwapDrawable)(WSEGLDrawableHandle, unsigned long); + + WSEGLError (*pfnWSEGL_SwapControlInterval)(WSEGLDrawableHandle, unsigned long); + + WSEGLError (*pfnWSEGL_WaitNative)(WSEGLDrawableHandle, unsigned long); + + WSEGLError (*pfnWSEGL_CopyFromDrawable)(WSEGLDrawableHandle, NativePixmapType); + + WSEGLError (*pfnWSEGL_CopyFromPBuffer)(void *, unsigned long, unsigned long, unsigned long, WSEGLPixelFormat, NativePixmapType); + + WSEGLError (*pfnWSEGL_GetDrawableParameters)(WSEGLDrawableHandle, WSEGLDrawableParams *, WSEGLDrawableParams *); + + +} WSEGL_FunctionTable; + + +WSEGL_IMPORT const WSEGL_FunctionTable *WSEGL_GetFunctionTablePointer(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __WSEGL_H__ */ + +/****************************************************************************** + End of file (wsegl.h) +******************************************************************************/ diff --git a/src/3rdparty/ptmalloc/COPYRIGHT b/src/3rdparty/ptmalloc/COPYRIGHT new file mode 100644 index 0000000000..155e4ddd80 --- /dev/null +++ b/src/3rdparty/ptmalloc/COPYRIGHT @@ -0,0 +1,19 @@ +Copyright (c) 2001-2006 Wolfram Gloger + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that (i) the above copyright notices and this permission +notice appear in all copies of the software and related documentation, +and (ii) the name of Wolfram Gloger may not be used in any advertising +or publicity relating to the software. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL WOLFRAM GLOGER BE LIABLE FOR ANY SPECIAL, +INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY +OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/src/3rdparty/ptmalloc/ChangeLog b/src/3rdparty/ptmalloc/ChangeLog new file mode 100644 index 0000000000..45f7f463fa --- /dev/null +++ b/src/3rdparty/ptmalloc/ChangeLog @@ -0,0 +1,33 @@ +2006-05-31 Wolfram Gloger + + * sysdeps/pthread/malloc-machine.h (mutex_unlock): Unlock needs + full memory barrier (thanks Bart Robinson). + +2006-03-31 Wolfram Gloger + + * ptmalloc3.c (public_iCALLOc, public_iCOMALLOc): New functions. + +2006-03-30 Wolfram Gloger + + * malloc/malloc.c: Upgrade to version pre-2.8.4-29mar06. + * malloc/malloc-private.h: New fields in malloc_state. + +2004-03-29 Wolfram Gloger + + * malloc/malloc.c (mmap_alloc): Use page_align instead of + granularity_align. + (mmap_resize): Likewise. + + * malloc/ptmalloc3.c (ptmalloc_init): + Add MALLOC_GRANULARITY_ and synonymous MALLOC_TOP_PAD_ environment + parameters. + +2006-03-25 Wolfram Gloger + + * malloc/malloc-private.h: New file. + +2005-12-31 Wolfram Gloger + + * malloc/malloc.c: Imported from Doug Lea's malloc-2.8.3. + * malloc/malloc.h-2.8.3.h: Likewise. + * malloc/ptmalloc3.c: New file. diff --git a/src/3rdparty/ptmalloc/Makefile b/src/3rdparty/ptmalloc/Makefile new file mode 100644 index 0000000000..ae7793cc78 --- /dev/null +++ b/src/3rdparty/ptmalloc/Makefile @@ -0,0 +1,211 @@ +# Makefile for ptmalloc, version 3 +# by Wolfram Gloger 1996-1999, 2001-2005, 2006 + +DIST_FILES0 = ChangeLog malloc-2.8.3.h malloc.c \ + malloc-private.h ptmalloc3.c \ + sysdeps \ + #tst-mallocstate.c tst-mstats.c +DIST_FILES1 = COPYRIGHT README Makefile \ + $(DIST_FILES0) \ + lran2.h t-test.h t-test1.c t-test2.c \ + tst-independent-alloc.c \ + #debian +DIST_FILES2 = $(DIST_FILES1) \ + m-test1.c \ + RCS/*,v + +TAR_FLAGS = --numeric-owner --exclude "*~" --exclude "debian/tmp*" + +#CC = /pkg/gcc-2.95.2-wg/bin/gcc +CC = gcc + +SYS_FLAGS = +OPT_FLAGS = -g -O2 #-O # -O2 +WARN_FLAGS = -Wall -Wstrict-prototypes +SH_FLAGS = -shared -fpic + +INC_FLAGS = -Isysdeps/generic + +# Flags for the test programs +T_FLAGS = -DUSE_MALLOC=1 -DTEST=1 + +# Flags for the compilation of malloc.c +M_FLAGS = -DTHREAD_STATS=1 #-DMALLOC_DEBUG=1 -DDEBUG=1 + +# Thread flags. +# See the platform-specific targets below. +THR_FLAGS = -DUSE_TSD_DATA_HACK -D_REENTRANT +THR_LIBS = -lpthread + +RM = rm -f +AR = ar +RANLIB = ranlib + +MALLOC_OBJ = ptmalloc3.o malloc.o +LIB_MALLOC = libptmalloc3.a + +T_SUF = +TESTS = t-test1$(T_SUF) t-test2$(T_SUF) \ + tst-independent-alloc$(T_SUF) + #m-test1$(T_SUF) tst-mallocstate$(T_SUF) tst-mstats$(T_SUF) + +CFLAGS = $(SYS_FLAGS) $(OPT_FLAGS) $(WARN_FLAGS) $(THR_FLAGS) $(INC_FLAGS) + +.c.o: + $(CC) -c $(CFLAGS) $< + +all: $(LIB_MALLOC) + +ptmalloc3.o: ptmalloc3.c malloc-2.8.3.h + $(CC) -c $(CFLAGS) $(M_FLAGS) -DMSPACES=1 $< + +malloc.o: malloc.c + $(CC) -c $(CFLAGS) $(M_FLAGS) -DONLY_MSPACES -DUSE_LOCKS=0 $< + +#malloc-stats.o: malloc-stats.c malloc.h +# $(CC) -c $(CFLAGS) $(M_FLAGS) $< + +libptmalloc3.a: $(MALLOC_OBJ) + $(AR) cr $@ $(MALLOC_OBJ) + $(RANLIB) $@ + +libptmalloc3.so: $(MALLOC_OBJ) + $(CC) $(SH_FLAGS) $(CFLAGS) $(M_FLAGS) $(MALLOC_OBJ) -o $@ + +again: + $(RM) $(TESTS) + $(MAKE) $(TESTS) + +clean: + $(RM) $(MALLOC_OBJ) libptmalloc3.a libptmalloc3.so $(TESTS) \ + core core.[0-9]* + +m-test1$(T_SUF): m-test1.c $(LIB_MALLOC) + $(CC) $(CFLAGS) $(T_FLAGS) m-test1.c $(LIB_MALLOC) $(THR_LIBS) -o $@ + +t-test1$(T_SUF): t-test1.c t-test.h $(LIB_MALLOC) + $(CC) $(CFLAGS) $(T_FLAGS) t-test1.c $(LIB_MALLOC) $(THR_LIBS) -o $@ + +t-test2$(T_SUF): t-test2.c t-test.h $(LIB_MALLOC) + $(CC) $(CFLAGS) $(T_FLAGS) t-test2.c $(LIB_MALLOC) $(THR_LIBS) -o $@ + +tst-mallocstate$(T_SUF): tst-mallocstate.c $(LIB_MALLOC) + $(CC) $(CFLAGS) $(T_FLAGS) tst-mallocstate.c $(LIB_MALLOC) \ + $(THR_LIBS) -o $@ + +tst-mstats$(T_SUF): tst-mstats.c $(LIB_MALLOC) + $(CC) $(CFLAGS) $(T_FLAGS) tst-mstats.c $(LIB_MALLOC) \ + $(THR_LIBS) -o $@ + +tst-independent-alloc$(T_SUF): tst-independent-alloc.c $(LIB_MALLOC) + $(CC) $(CFLAGS) $(T_FLAGS) tst-independent-alloc.c $(LIB_MALLOC) \ + $(THR_LIBS) -o $@ + +############################################################################ +# Platform-specific targets. The ones ending in `-libc' are provided +# to enable comparison with the standard malloc implementation from +# the system's native C library. The option USE_TSD_DATA_HACK is now +# the default for pthreads systems, as most (Irix 6, Solaris 2) seem +# to need it. Try with USE_TSD_DATA_HACK undefined only if you're +# confident that your systems's thread specific data functions do _not_ +# use malloc themselves. + +# posix threads with TSD data hack +posix: + $(MAKE) THR_FLAGS='-DUSE_TSD_DATA_HACK -D_REENTRANT' \ + OPT_FLAGS='$(OPT_FLAGS)' SYS_FLAGS='$(SYS_FLAGS)' CC='$(CC)' \ + INC_FLAGS='-Isysdeps/pthread -Isysdeps/generic -I.' + THR_LIBS=-lpthread + +# posix threads with explicit initialization. Known to be needed on HPUX. +posix-explicit: + $(MAKE) THR_FLAGS='-D_REENTRANT -DUSE_TSD_DATA_HACK -DUSE_STARTER=2' \ + THR_LIBS=-lpthread \ + OPT_FLAGS='$(OPT_FLAGS)' SYS_FLAGS='$(SYS_FLAGS)' CC='$(CC)' \ + INC_FLAGS='-Isysdeps/pthread -Isysdeps/generic -I.' \ + M_FLAGS='$(M_FLAGS)' + +# posix threads without TSD data hack -- not known to work +posix-with-tsd: + $(MAKE) THR_FLAGS='-D_REENTRANT' THR_LIBS=-lpthread \ + INC_FLAGS='-Isysdeps/pthread -Isysdeps/generic -I.' \ + M_FLAGS='$(M_FLAGS)' + +posix-libc: + $(MAKE) THR_FLAGS='-D_REENTRANT' THR_LIBS=-lpthread \ + INC_FLAGS='-Isysdeps/pthread -Isysdeps/generic -I.' \ + M_FLAGS='$(M_FLAGS)' LIB_MALLOC= T_FLAGS= T_SUF=-libc + +linux-pthread: + $(MAKE) SYS_FLAGS='-D_GNU_SOURCE=1' \ + WARN_FLAGS='-Wall -Wstrict-prototypes' \ + OPT_FLAGS='$(OPT_FLAGS)' THR_FLAGS='-DUSE_TSD_DATA_HACK' \ + INC_FLAGS='-Isysdeps/pthread -Isysdeps/generic -I.' M_FLAGS='$(M_FLAGS)' \ + TESTS='$(TESTS)' + +linux-shared: + $(MAKE) SYS_FLAGS='-D_GNU_SOURCE=1 -fpic' \ + WARN_FLAGS='-Wall -Wstrict-prototypes' \ + OPT_FLAGS='$(OPT_FLAGS)' THR_FLAGS='-DUSE_TSD_DATA_HACK' \ + INC_FLAGS='-Isysdeps/pthread -Isysdeps/generic -I.' M_FLAGS='$(M_FLAGS)' \ + LIB_MALLOC=libptmalloc3.so + +sproc: + $(MAKE) THR_FLAGS='' THR_LIBS='' OPT_FLAGS='$(OPT_FLAGS)' CC='$(CC)' \ + INC_FLAGS='-Isysdeps/sproc -Isysdeps/generic -I.' \ + M_FLAGS='$(M_FLAGS) -Dmalloc_getpagesize=4096' + +sproc-shared: + $(MAKE) THR_FLAGS='' THR_LIBS= \ + SH_FLAGS='-shared -check_registry /usr/lib/so_locations' \ + INC_FLAGS='-Isysdeps/sproc -Isysdeps/generic -I.' \ + LIB_MALLOC=libptmalloc3.so M_FLAGS='$(M_FLAGS)' + +sproc-libc: + $(MAKE) THR_FLAGS='' THR_LIBS= LIB_MALLOC= T_FLAGS= \ + INC_FLAGS='-Isysdeps/sproc -Isysdeps/generic -I.' \ + T_SUF=-libc M_FLAGS='$(M_FLAGS)' + +solaris: + $(MAKE) THR_FLAGS='-D_REENTRANT' OPT_FLAGS='$(OPT_FLAGS)' \ + INC_FLAGS='-Isysdeps/solaris -Isysdeps/generic -I.' \ + THR_LIBS=-lthread M_FLAGS='$(M_FLAGS)' + +solaris-libc: + $(MAKE) THR_FLAGS='-D_REENTRANT' OPT_FLAGS='$(OPT_FLAGS)' \ + INC_FLAGS='-Isysdeps/solaris -Isysdeps/generic -I.' \ + THR_LIBS=-lthread LIB_MALLOC= T_FLAGS= T_SUF=-libc M_FLAGS='$(M_FLAGS)' + +nothreads: + $(MAKE) OPT_FLAGS='$(OPT_FLAGS)' SYS_FLAGS='$(SYS_FLAGS)' \ + INC_FLAGS='-Isysdeps/generic -I.' \ + THR_FLAGS='' THR_LIBS='' M_FLAGS='$(M_FLAGS)' + +gcc-nothreads: + $(MAKE) CC='gcc' WARN_FLAGS='-Wall' OPT_FLAGS='$(OPT_FLAGS)' \ + INC_FLAGS='-Isysdeps/generic -I.' \ + SYS_FLAGS='$(SYS_FLAGS)' THR_FLAGS='' THR_LIBS='' M_FLAGS='$(M_FLAGS)' + +linux-nothreads: + $(MAKE) CC='gcc' WARN_FLAGS='-Wall' OPT_FLAGS='$(OPT_FLAGS)' \ + INC_FLAGS='-Isysdeps/generic -I.' \ + SYS_FLAGS='-D_GNU_SOURCE' THR_FLAGS='' THR_LIBS='' M_FLAGS='$(M_FLAGS)' + +############################################################################ + +check: $(TESTS) + ./t-test1 + ./t-test2 + #./tst-mallocstate || echo "Test mallocstate failed!" + #./tst-mstats || echo "Test mstats failed!" + +snap: + cd ..; tar $(TAR_FLAGS) -c -f - $(DIST_FILES1:%=ptmalloc3/%) | \ + gzip -9 >ptmalloc3-current.tar.gz + +dist: + cd ..; tar $(TAR_FLAGS) -c -f - $(DIST_FILES2:%=ptmalloc3/%) | \ + gzip -9 >ptmalloc3.tar.gz + +# dependencies +ptmalloc3.o: malloc-private.h diff --git a/src/3rdparty/ptmalloc/README b/src/3rdparty/ptmalloc/README new file mode 100644 index 0000000000..914c745612 --- /dev/null +++ b/src/3rdparty/ptmalloc/README @@ -0,0 +1,186 @@ +ptmalloc3 - a multi-thread malloc implementation +================================================ + +Wolfram Gloger (wg@malloc.de) + +Jan 2006 + + +Thanks +====== + +This release was partly funded by Pixar Animation Studios. I would +like to thank David Baraff of Pixar for his support and Doug Lea +(dl@cs.oswego.edu) for the great original malloc implementation. + + +Introduction +============ + +This package is a modified version of Doug Lea's malloc-2.8.3 +implementation (available seperately from ftp://g.oswego.edu/pub/misc) +that I adapted for multiple threads, while trying to avoid lock +contention as much as possible. + +As part of the GNU C library, the source files may be available under +the GNU Library General Public License (see the comments in the +files). But as part of this stand-alone package, the code is also +available under the (probably less restrictive) conditions described +in the file 'COPYRIGHT'. In any case, there is no warranty whatsoever +for this package. + +The current distribution should be available from: + +http://www.malloc.de/malloc/ptmalloc3.tar.gz + + +Compilation +=========== + +It should be possible to build ptmalloc3 on any UN*X-like system that +implements the sbrk(), mmap(), munmap() and mprotect() calls. Since +there are now several source files, a library (libptmalloc3.a) is +generated. See the Makefile for examples of the compile-time options. + +Note that support for non-ANSI compilers is no longer there. + +Several example targets are provided in the Makefile: + + o Posix threads (pthreads), compile with "make posix" + + o Posix threads with explicit initialization, compile with + "make posix-explicit" (known to be required on HPUX) + + o Posix threads without "tsd data hack" (see below), compile with + "make posix-with-tsd" + + o Solaris threads, compile with "make solaris" + + o SGI sproc() threads, compile with "make sproc" + + o no threads, compile with "make nothreads" (currently out of order?) + +For Linux: + + o make "linux-pthread" (almost the same as "make posix") or + make "linux-shared" + +Note that some compilers need special flags for multi-threaded code, +e.g. with Solaris cc with Posix threads, one should use: + +% make posix SYS_FLAGS='-mt' + +Some additional targets, ending in `-libc', are also provided in the +Makefile, to compare performance of the test programs to the case when +linking with the standard malloc implementation in libc. + +A potential problem remains: If any of the system-specific functions +for getting/setting thread-specific data or for locking a mutex call +one of the malloc-related functions internally, the implementation +cannot work at all due to infinite recursion. One example seems to be +Solaris 2.4. I would like to hear if this problem occurs on other +systems, and whether similar workarounds could be applied. + +For Posix threads, too, an optional hack like that has been integrated +(activated when defining USE_TSD_DATA_HACK) which depends on +`pthread_t' being convertible to an integral type (which is of course +not generally guaranteed). USE_TSD_DATA_HACK is now the default +because I haven't yet found a non-glibc pthreads system where this +hack is _not_ needed. + +*NEW* and _important_: In (currently) one place in the ptmalloc3 +source, a write memory barrier is needed, named +atomic_write_barrier(). This macro needs to be defined at the end of +malloc-machine.h. For gcc, a fallback in the form of a full memory +barrier is already defined, but you may need to add another definition +if you don't use gcc. + +Usage +===== + +Just link libptmalloc3 into your application. + +Some wicked systems (e.g. HPUX apparently) won't let malloc call _any_ +thread-related functions before main(). On these systems, +USE_STARTER=2 must be defined during compilation (see "make +posix-explicit" above) and the global initialization function +ptmalloc_init() must be called explicitly, preferably at the start of +main(). + +Otherwise, when using ptmalloc3, no special precautions are necessary. + +Link order is important +======================= + +On some systems, when overriding malloc and linking against shared +libraries, the link order becomes very important. E.g., when linking +C++ programs on Solaris with Solaris threads [this is probably now +obsolete], don't rely on libC being included by default, but instead +put `-lthread' behind `-lC' on the command line: + + CC ... libptmalloc3.a -lC -lthread + +This is because there are global constructors in libC that need +malloc/ptmalloc, which in turn needs to have the thread library to be +already initialized. + +Debugging hooks +=============== + +All calls to malloc(), realloc(), free() and memalign() are routed +through the global function pointers __malloc_hook, __realloc_hook, +__free_hook and __memalign_hook if they are not NULL (see the malloc.h +header file for declarations of these pointers). Therefore the malloc +implementation can be changed at runtime, if care is taken not to call +free() or realloc() on pointers obtained with a different +implementation than the one currently in effect. (The easiest way to +guarantee this is to set up the hooks before any malloc call, e.g. +with a function pointed to by the global variable +__malloc_initialize_hook). + +You can now also tune other malloc parameters (normally adjused via +mallopt() calls from the application) with environment variables: + + MALLOC_TRIM_THRESHOLD_ for deciding to shrink the heap (in bytes) + + MALLOC_GRANULARITY_ The unit for allocating and deallocating + MALLOC_TOP_PAD_ memory from the system. The default + is 64k and this parameter _must_ be a + power of 2. + + MALLOC_MMAP_THRESHOLD_ min. size for chunks allocated via + mmap() (in bytes) + +Tests +===== + +Two testing applications, t-test1 and t-test2, are included in this +source distribution. Both perform pseudo-random sequences of +allocations/frees, and can be given numeric arguments (all arguments +are optional): + +% t-test[12] + + n-total = total number of threads executed (default 10) + n-parallel = number of threads running in parallel (2) + n-allocs = number of malloc()'s / free()'s per thread (10000) + size-max = max. size requested with malloc() in bytes (10000) + bins = number of bins to maintain + +The first test `t-test1' maintains a completely seperate pool of +allocated bins for each thread, and should therefore show full +parallelism. On the other hand, `t-test2' creates only a single pool +of bins, and each thread randomly allocates/frees any bin. Some lock +contention is to be expected in this case, as the threads frequently +cross each others arena. + +Performance results from t-test1 should be quite repeatable, while the +behaviour of t-test2 depends on scheduling variations. + +Conclusion +========== + +I'm always interested in performance data and feedback, just send mail +to ptmalloc@malloc.de. + +Good luck! diff --git a/src/3rdparty/ptmalloc/lran2.h b/src/3rdparty/ptmalloc/lran2.h new file mode 100644 index 0000000000..cea9920282 --- /dev/null +++ b/src/3rdparty/ptmalloc/lran2.h @@ -0,0 +1,51 @@ +/* lran2.h + * by Wolfram Gloger 1996. + * + * A small, portable pseudo-random number generator. + */ + +#ifndef _LRAN2_H +#define _LRAN2_H + +#define LRAN2_MAX 714025l /* constants for portable */ +#define IA 1366l /* random number generator */ +#define IC 150889l /* (see e.g. `Numerical Recipes') */ + +struct lran2_st { + long x, y, v[97]; +}; + +static void +lran2_init(struct lran2_st* d, long seed) +{ + long x; + int j; + + x = (IC - seed) % LRAN2_MAX; + if(x < 0) x = -x; + for(j=0; j<97; j++) { + x = (IA*x + IC) % LRAN2_MAX; + d->v[j] = x; + } + d->x = (IA*x + IC) % LRAN2_MAX; + d->y = d->x; +} + +#ifdef __GNUC__ +__inline__ +#endif +static long +lran2(struct lran2_st* d) +{ + int j = (d->y % 97); + + d->y = d->v[j]; + d->x = (IA*d->x + IC) % LRAN2_MAX; + d->v[j] = d->x; + return d->y; +} + +#undef IA +#undef IC + +#endif diff --git a/src/3rdparty/ptmalloc/malloc-2.8.3.h b/src/3rdparty/ptmalloc/malloc-2.8.3.h new file mode 100644 index 0000000000..62f597e5f5 --- /dev/null +++ b/src/3rdparty/ptmalloc/malloc-2.8.3.h @@ -0,0 +1,534 @@ +/* + Default header file for malloc-2.8.x, written by Doug Lea + and released to the public domain, as explained at + http://creativecommons.org/licenses/publicdomain. + + last update: Mon Aug 15 08:55:52 2005 Doug Lea (dl at gee) + + This header is for ANSI C/C++ only. You can set any of + the following #defines before including: + + * If USE_DL_PREFIX is defined, it is assumed that malloc.c + was also compiled with this option, so all routines + have names starting with "dl". + + * If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this + file will be #included AFTER . This is needed only if + your system defines a struct mallinfo that is incompatible with the + standard one declared here. Otherwise, you can include this file + INSTEAD of your system system . At least on ANSI, all + declarations should be compatible with system versions + + * If MSPACES is defined, declarations for mspace versions are included. +*/ + +#ifndef MALLOC_280_H +#define MALLOC_280_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include /* for size_t */ + +#if !ONLY_MSPACES + +#ifndef USE_DL_PREFIX +#define dlcalloc calloc +#define dlfree free +#define dlmalloc malloc +#define dlmemalign memalign +#define dlrealloc realloc +#define dlvalloc valloc +#define dlpvalloc pvalloc +#define dlmallinfo mallinfo +#define dlmallopt mallopt +#define dlmalloc_trim malloc_trim +#define dlmalloc_stats malloc_stats +#define dlmalloc_usable_size malloc_usable_size +#define dlmalloc_footprint malloc_footprint +#define dlindependent_calloc independent_calloc +#define dlindependent_comalloc independent_comalloc +#endif /* USE_DL_PREFIX */ + + +/* + malloc(size_t n) + Returns a pointer to a newly allocated chunk of at least n bytes, or + null if no space is available, in which case errno is set to ENOMEM + on ANSI C systems. + + If n is zero, malloc returns a minimum-sized chunk. (The minimum + size is 16 bytes on most 32bit systems, and 32 bytes on 64bit + systems.) Note that size_t is an unsigned type, so calls with + arguments that would be negative if signed are interpreted as + requests for huge amounts of space, which will often fail. The + maximum supported value of n differs across systems, but is in all + cases less than the maximum representable value of a size_t. +*/ +void* dlmalloc(size_t); + +/* + free(void* p) + Releases the chunk of memory pointed to by p, that had been previously + allocated using malloc or a related routine such as realloc. + It has no effect if p is null. If p was not malloced or already + freed, free(p) will by default cuase the current program to abort. +*/ +void dlfree(void*); + +/* + calloc(size_t n_elements, size_t element_size); + Returns a pointer to n_elements * element_size bytes, with all locations + set to zero. +*/ +void* dlcalloc(size_t, size_t); + +/* + realloc(void* p, size_t n) + Returns a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. + + The returned pointer may or may not be the same as p. The algorithm + prefers extending p in most cases when possible, otherwise it + employs the equivalent of a malloc-copy-free sequence. + + If p is null, realloc is equivalent to malloc. + + If space is not available, realloc returns null, errno is set (if on + ANSI) and p is NOT freed. + + if n is for fewer bytes than already held by p, the newly unused + space is lopped off and freed if possible. realloc with a size + argument of zero (re)allocates a minimum-sized chunk. + + The old unix realloc convention of allowing the last-free'd chunk + to be used as an argument to realloc is not supported. +*/ + +void* dlrealloc(void*, size_t); + +/* + memalign(size_t alignment, size_t n); + Returns a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument. + + The alignment argument should be a power of two. If the argument is + not a power of two, the nearest greater power is used. + 8-byte alignment is guaranteed by normal malloc calls, so don't + bother calling memalign with an argument of 8 or less. + + Overreliance on memalign is a sure way to fragment space. +*/ +void* dlmemalign(size_t, size_t); + +/* + valloc(size_t n); + Equivalent to memalign(pagesize, n), where pagesize is the page + size of the system. If the pagesize is unknown, 4096 is used. +*/ +void* dlvalloc(size_t); + +/* + mallopt(int parameter_number, int parameter_value) + Sets tunable parameters The format is to provide a + (parameter-number, parameter-value) pair. mallopt then sets the + corresponding parameter to the argument value if it can (i.e., so + long as the value is meaningful), and returns 1 if successful else + 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, + normally defined in malloc.h. None of these are use in this malloc, + so setting them has no effect. But this malloc also supports other + options in mallopt: + + Symbol param # default allowed param values + M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming) + M_GRANULARITY -2 page size any power of 2 >= page size + M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) +*/ +int dlmallopt(int, int); + +#define M_TRIM_THRESHOLD (-1) +#define M_GRANULARITY (-2) +#define M_MMAP_THRESHOLD (-3) + + +/* + malloc_footprint(); + Returns the number of bytes obtained from the system. The total + number of bytes allocated by malloc, realloc etc., is less than this + value. Unlike mallinfo, this function returns only a precomputed + result, so can be called frequently to monitor memory consumption. + Even if locks are otherwise defined, this function does not use them, + so results might not be up to date. +*/ +size_t dlmalloc_footprint(void); + +#if !NO_MALLINFO +/* + mallinfo() + Returns (by copy) a struct containing various summary statistics: + + arena: current total non-mmapped bytes allocated from system + ordblks: the number of free chunks + smblks: always zero. + hblks: current number of mmapped regions + hblkhd: total bytes held in mmapped regions + usmblks: the maximum total allocated space. This will be greater + than current total if trimming has occurred. + fsmblks: always zero + uordblks: current total allocated space (normal or mmapped) + fordblks: total free space + keepcost: the maximum number of bytes that could ideally be released + back to system via malloc_trim. ("ideally" means that + it ignores page restrictions etc.) + + Because these fields are ints, but internal bookkeeping may + be kept as longs, the reported values may wrap around zero and + thus be inaccurate. +*/ +#ifndef HAVE_USR_INCLUDE_MALLOC_H +#ifndef _MALLOC_H +#ifndef MALLINFO_FIELD_TYPE +#define MALLINFO_FIELD_TYPE size_t +#endif /* MALLINFO_FIELD_TYPE */ +struct mallinfo { + MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ + MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ + MALLINFO_FIELD_TYPE smblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ + MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ + MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ + MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ + MALLINFO_FIELD_TYPE fordblks; /* total free space */ + MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ +}; +#endif /* _MALLOC_H */ +#endif /* HAVE_USR_INCLUDE_MALLOC_H */ + +struct mallinfo dlmallinfo(void); +#endif /* NO_MALLINFO */ + +/* + independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); + + independent_calloc is similar to calloc, but instead of returning a + single cleared space, it returns an array of pointers to n_elements + independent elements that can hold contents of size elem_size, each + of which starts out cleared, and can be independently freed, + realloc'ed etc. The elements are guaranteed to be adjacently + allocated (this is not guaranteed to occur with multiple callocs or + mallocs), which may also improve cache locality in some + applications. + + The "chunks" argument is optional (i.e., may be null, which is + probably the most typical usage). If it is null, the returned array + is itself dynamically allocated and should also be freed when it is + no longer needed. Otherwise, the chunks array must be of at least + n_elements in length. It is filled in with the pointers to the + chunks. + + In either case, independent_calloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and "chunks" + is null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use regular calloc and assign pointers into this + space to represent elements. (In this case though, you cannot + independently free elements.) + + independent_calloc simplifies and speeds up implementations of many + kinds of pools. It may also be useful when constructing large data + structures that initially have a fixed number of fixed-sized nodes, + but the number is not known at compile time, and some of the nodes + may later need to be freed. For example: + + struct Node { int item; struct Node* next; }; + + struct Node* build_list() { + struct Node** pool; + int n = read_number_of_nodes_needed(); + if (n <= 0) return 0; + pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); + if (pool == 0) die(); + // organize into a linked list... + struct Node* first = pool[0]; + for (i = 0; i < n-1; ++i) + pool[i]->next = pool[i+1]; + free(pool); // Can now free the array (or not, if it is needed later) + return first; + } +*/ +void** dlindependent_calloc(size_t, size_t, void**); + +/* + independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); + + independent_comalloc allocates, all at once, a set of n_elements + chunks with sizes indicated in the "sizes" array. It returns + an array of pointers to these elements, each of which can be + independently freed, realloc'ed etc. The elements are guaranteed to + be adjacently allocated (this is not guaranteed to occur with + multiple callocs or mallocs), which may also improve cache locality + in some applications. + + The "chunks" argument is optional (i.e., may be null). If it is null + the returned array is itself dynamically allocated and should also + be freed when it is no longer needed. Otherwise, the chunks array + must be of at least n_elements in length. It is filled in with the + pointers to the chunks. + + In either case, independent_comalloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and chunks is + null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use a single regular malloc, and assign pointers at + particular offsets in the aggregate space. (In this case though, you + cannot independently free elements.) + + independent_comallac differs from independent_calloc in that each + element may have a different size, and also that it does not + automatically clear elements. + + independent_comalloc can be used to speed up allocation in cases + where several structs or objects must always be allocated at the + same time. For example: + + struct Head { ... } + struct Foot { ... } + + void send_message(char* msg) { + int msglen = strlen(msg); + size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; + void* chunks[3]; + if (independent_comalloc(3, sizes, chunks) == 0) + die(); + struct Head* head = (struct Head*)(chunks[0]); + char* body = (char*)(chunks[1]); + struct Foot* foot = (struct Foot*)(chunks[2]); + // ... + } + + In general though, independent_comalloc is worth using only for + larger values of n_elements. For small values, you probably won't + detect enough difference from series of malloc calls to bother. + + Overuse of independent_comalloc can increase overall memory usage, + since it cannot reuse existing noncontiguous small chunks that + might be available for some of the elements. +*/ +void** dlindependent_comalloc(size_t, size_t*, void**); + + +/* + pvalloc(size_t n); + Equivalent to valloc(minimum-page-that-holds(n)), that is, + round up n to nearest pagesize. + */ +void* dlpvalloc(size_t); + +/* + malloc_trim(size_t pad); + + If possible, gives memory back to the system (via negative arguments + to sbrk) if there is unused memory at the `high' end of the malloc + pool or in unused MMAP segments. You can call this after freeing + large blocks of memory to potentially reduce the system-level memory + requirements of a program. However, it cannot guarantee to reduce + memory. Under some allocation patterns, some large free blocks of + memory will be locked between two used chunks, so they cannot be + given back to the system. + + The `pad' argument to malloc_trim represents the amount of free + trailing space to leave untrimmed. If this argument is zero, only + the minimum amount of memory to maintain internal data structures + will be left. Non-zero arguments can be supplied to maintain enough + trailing space to service future expected allocations without having + to re-obtain memory from the system. + + Malloc_trim returns 1 if it actually released any memory, else 0. +*/ +int dlmalloc_trim(size_t); + +/* + malloc_usable_size(void* p); + + Returns the number of bytes you can actually use in + an allocated chunk, which may be more than you requested (although + often not) due to alignment and minimum size constraints. + You can use this many bytes without worrying about + overwriting other allocated objects. This is not a particularly great + programming practice. malloc_usable_size can be more useful in + debugging and assertions, for example: + + p = malloc(n); + assert(malloc_usable_size(p) >= 256); +*/ +size_t dlmalloc_usable_size(void*); + +/* + malloc_stats(); + Prints on stderr the amount of space obtained from the system (both + via sbrk and mmap), the maximum amount (which may be more than + current if malloc_trim and/or munmap got called), and the current + number of bytes allocated via malloc (or realloc, etc) but not yet + freed. Note that this is the number of bytes allocated, not the + number requested. It will be larger than the number requested + because of alignment and bookkeeping overhead. Because it includes + alignment wastage as being in use, this figure may be greater than + zero even when no user-level chunks are allocated. + + The reported current and maximum system memory can be inaccurate if + a program makes other calls to system memory allocation functions + (normally sbrk) outside of malloc. + + malloc_stats prints only the most commonly interesting statistics. + More information can be obtained by calling mallinfo. +*/ +void dlmalloc_stats(void); + +#endif /* !ONLY_MSPACES */ + +#if MSPACES + +/* + mspace is an opaque type representing an independent + region of space that supports mspace_malloc, etc. +*/ +typedef void* mspace; + +/* + create_mspace creates and returns a new independent space with the + given initial capacity, or, if 0, the default granularity size. It + returns null if there is no system memory available to create the + space. If argument locked is non-zero, the space uses a separate + lock to control access. The capacity of the space will grow + dynamically as needed to service mspace_malloc requests. You can + control the sizes of incremental increases of this space by + compiling with a different DEFAULT_GRANULARITY or dynamically + setting with mallopt(M_GRANULARITY, value). +*/ +mspace create_mspace(size_t capacity, int locked); + +/* + destroy_mspace destroys the given space, and attempts to return all + of its memory back to the system, returning the total number of + bytes freed. After destruction, the results of access to all memory + used by the space become undefined. +*/ +size_t destroy_mspace(mspace msp); + +/* + create_mspace_with_base uses the memory supplied as the initial base + of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this + space is used for bookkeeping, so the capacity must be at least this + large. (Otherwise 0 is returned.) When this initial space is + exhausted, additional memory will be obtained from the system. + Destroying this space will deallocate all additionally allocated + space (if possible) but not the initial base. +*/ +mspace create_mspace_with_base(void* base, size_t capacity, int locked); + +/* + mspace_malloc behaves as malloc, but operates within + the given space. +*/ +void* mspace_malloc(mspace msp, size_t bytes); + +/* + mspace_free behaves as free, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_free is not actually needed. + free may be called instead of mspace_free because freed chunks from + any space are handled by their originating spaces. +*/ +void mspace_free(mspace msp, void* mem); + +/* + mspace_realloc behaves as realloc, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_realloc is not actually + needed. realloc may be called instead of mspace_realloc because + realloced chunks from any space are handled by their originating + spaces. +*/ +void* mspace_realloc(mspace msp, void* mem, size_t newsize); + +/* + mspace_calloc behaves as calloc, but operates within + the given space. +*/ +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); + +/* + mspace_memalign behaves as memalign, but operates within + the given space. +*/ +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); + +/* + mspace_independent_calloc behaves as independent_calloc, but + operates within the given space. +*/ +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]); + +/* + mspace_independent_comalloc behaves as independent_comalloc, but + operates within the given space. +*/ +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]); + +/* + mspace_footprint() returns the number of bytes obtained from the + system for this space. +*/ +size_t mspace_footprint(mspace msp); + + +#if !NO_MALLINFO +/* + mspace_mallinfo behaves as mallinfo, but reports properties of + the given space. +*/ +struct mallinfo mspace_mallinfo(mspace msp); +#endif /* NO_MALLINFO */ + +/* + mspace_malloc_stats behaves as malloc_stats, but reports + properties of the given space. +*/ +void mspace_malloc_stats(mspace msp); + +/* + mspace_trim behaves as malloc_trim, but + operates within the given space. +*/ +int mspace_trim(mspace msp, size_t pad); + +/* + An alias for malloc_usable_size. +*/ +size_t mspace_usable_size(void *mem); + +/* + An alias for mallopt. +*/ +int mspace_mallopt(int, int); + +#endif /* MSPACES */ + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif + +#endif /* MALLOC_280_H */ diff --git a/src/3rdparty/ptmalloc/malloc-private.h b/src/3rdparty/ptmalloc/malloc-private.h new file mode 100644 index 0000000000..680c36bac0 --- /dev/null +++ b/src/3rdparty/ptmalloc/malloc-private.h @@ -0,0 +1,170 @@ +/* + $Id: malloc-private.h,v 1.4 2006/03/31 12:56:52 wg Exp $ + Private header file for ptmalloc3, created by Wolfram Gloger + and released to the public domain, as explained at + http://creativecommons.org/licenses/publicdomain. +*/ + +/* The following file is replicated from malloc.c */ + +#ifndef MALLOC_PRIVATE_H +#define MALLOC_PRIVATE_H + +#ifndef MALLOC_ALIGNMENT +# define MALLOC_ALIGNMENT ((size_t)8U) +#endif +#ifndef USE_LOCKS +# define USE_LOCKS 0 +#endif + +/* The bit mask value corresponding to MALLOC_ALIGNMENT */ +#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) + +/* the number of bytes to offset an address to align it */ +#define align_offset(A)\ + ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ + ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) + +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif /* MAP_ANON */ +#ifdef MAP_ANONYMOUS +#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) +#define CALL_MMAP(s) mmap(0, (s), PROT_READ|PROT_WRITE, MMAP_FLAGS, -1, 0) +#else /* MAP_ANONYMOUS */ +/* + Nearly all versions of mmap support MAP_ANONYMOUS, so the following + is unlikely to be needed, but is supplied just in case. +*/ +#include /* for O_RDWR */ +#define MMAP_FLAGS (MAP_PRIVATE) +static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ +#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ + (dev_zero_fd = open("/dev/zero", O_RDWR), \ + mmap(0, (s), PROT_READ|PROT_WRITE, MMAP_FLAGS, dev_zero_fd, 0)) : \ + mmap(0, (s), PROT_READ|PROT_WRITE, MMAP_FLAGS, dev_zero_fd, 0)) +#endif /* MAP_ANONYMOUS */ +#define CALL_MUNMAP(a, s) munmap((a), (s)) + +struct malloc_chunk { + size_t prev_foot; /* Size of previous chunk (if free). */ + size_t head; /* Size and inuse bits. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; +}; + +typedef struct malloc_chunk mchunk; +typedef struct malloc_chunk* mchunkptr; + +typedef unsigned int binmap_t; +typedef unsigned int flag_t; + +struct malloc_tree_chunk; +typedef struct malloc_tree_chunk* tbinptr; + +struct malloc_segment { + char* base; /* base address */ + size_t size; /* allocated size */ + struct malloc_segment* next; /* ptr to next segment */ + flag_t sflags; /* mmap and extern flag */ +}; + +typedef struct malloc_segment msegment; + +#define NSMALLBINS (32U) +#define NTREEBINS (32U) + +struct malloc_state { + binmap_t smallmap; + binmap_t treemap; + size_t dvsize; + size_t topsize; + char* least_addr; + mchunkptr dv; + mchunkptr top; + size_t trim_check; + size_t release_checks; + size_t magic; + mchunkptr smallbins[(NSMALLBINS+1)*2]; + tbinptr treebins[NTREEBINS]; + size_t footprint; + size_t max_footprint; + flag_t mflags; +#if USE_LOCKS + MLOCK_T mutex; +#endif /* USE_LOCKS */ + msegment seg; + void* extp; + size_t exts; +}; + +/* + TOP_FOOT_SIZE is padding at the end of a segment, including space + that may be needed to place segment records and fenceposts when new + noncontiguous segments are added. +*/ +#define TOP_FOOT_SIZE\ + (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) + +/* ------------------- Chunks sizes and alignments ----------------------- */ + +#define MCHUNK_SIZE (sizeof(mchunk)) + +#define CHUNK_OVERHEAD (SIZE_T_SIZE) + +/* MMapped chunks need a second word of overhead ... */ +#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +/* ... and additional padding for fake next-chunk at foot */ +#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) + +/* The smallest size we can malloc is an aligned minimal chunk */ +#define MIN_CHUNK_SIZE\ + ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* conversion from malloc headers to user pointers, and back */ +#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) +#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) +/* chunk associated with aligned address A */ +#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) + +/* pad request bytes into a usable size */ +#define pad_request(req) \ + (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* The byte and bit size of a size_t */ +#define SIZE_T_SIZE (sizeof(size_t)) +#define SIZE_T_BITSIZE (sizeof(size_t) << 3) + +/* Some constants coerced to size_t */ +/* Annoying but necessary to avoid errors on some platforms */ +#define SIZE_T_ZERO ((size_t)0) +#define SIZE_T_ONE ((size_t)1) +#define SIZE_T_TWO ((size_t)2) +#define SIZE_T_FOUR ((size_t)4) +#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) +#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) +#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) +#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) + +#define IS_MMAPPED_BIT (SIZE_T_ONE) +#define PINUSE_BIT (SIZE_T_ONE) +#define CINUSE_BIT (SIZE_T_TWO) +#define FLAG_BITS (PINUSE_BIT|CINUSE_BIT|SIZE_T_FOUR) + +/* head field is or'ed with NON_MAIN_ARENA if the chunk was obtained + from a non-main arena. This is only set immediately before handing + the chunk to the user, if necessary. */ +#define NON_MAIN_ARENA (SIZE_T_FOUR) + +#define cinuse(p) ((p)->head & CINUSE_BIT) +#define pinuse(p) ((p)->head & PINUSE_BIT) +#define chunksize(p) ((p)->head & ~(FLAG_BITS)) + +#define is_mmapped(p)\ + (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) + +/* Get the internal overhead associated with chunk p */ +#define overhead_for(p)\ + (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) + +#endif /* MALLOC_PRIVATE_H */ diff --git a/src/3rdparty/ptmalloc/malloc.c b/src/3rdparty/ptmalloc/malloc.c new file mode 100644 index 0000000000..2778b304ad --- /dev/null +++ b/src/3rdparty/ptmalloc/malloc.c @@ -0,0 +1,5515 @@ +/* + $Id: malloc.c,v 1.4 2006/03/30 16:47:29 wg Exp $ + + This version of malloc.c was adapted for ptmalloc3 by Wolfram Gloger + . Therefore, some of the comments below do not apply + for this modified version. However, it is the intention to keep + differences to Doug Lea's original version minimal, hence the + comments were mostly left unchanged. + + ----------------------------------------------------------------------- + + This is a version (aka dlmalloc) of malloc/free/realloc written by + Doug Lea and released to the public domain, as explained at + http://creativecommons.org/licenses/publicdomain. Send questions, + comments, complaints, performance data, etc to dl@cs.oswego.edu + +* Version pre-2.8.4 Wed Mar 29 19:46:29 2006 (dl at gee) + + Note: There may be an updated version of this malloc obtainable at + ftp://gee.cs.oswego.edu/pub/misc/malloc.c + Check before installing! + +* Quickstart + + This library is all in one file to simplify the most common usage: + ftp it, compile it (-O3), and link it into another program. All of + the compile-time options default to reasonable values for use on + most platforms. You might later want to step through various + compile-time and dynamic tuning options. + + For convenience, an include file for code using this malloc is at: + ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h + You don't really need this .h file unless you call functions not + defined in your system include files. The .h file contains only the + excerpts from this file needed for using this malloc on ANSI C/C++ + systems, so long as you haven't changed compile-time options about + naming and tuning parameters. If you do, then you can create your + own malloc.h that does include all settings by cutting at the point + indicated below. Note that you may already by default be using a C + library containing a malloc that is based on some version of this + malloc (for example in linux). You might still want to use the one + in this file to customize settings or to avoid overheads associated + with library versions. + +* Vital statistics: + + Supported pointer/size_t representation: 4 or 8 bytes + size_t MUST be an unsigned type of the same width as + pointers. (If you are using an ancient system that declares + size_t as a signed type, or need it to be a different width + than pointers, you can use a previous release of this malloc + (e.g. 2.7.2) supporting these.) + + Alignment: 8 bytes (default) + This suffices for nearly all current machines and C compilers. + However, you can define MALLOC_ALIGNMENT to be wider than this + if necessary (up to 128bytes), at the expense of using more space. + + Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) + 8 or 16 bytes (if 8byte sizes) + Each malloced chunk has a hidden word of overhead holding size + and status information, and additional cross-check word + if FOOTERS is defined. + + Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) + 8-byte ptrs: 32 bytes (including overhead) + + Even a request for zero bytes (i.e., malloc(0)) returns a + pointer to something of the minimum allocatable size. + The maximum overhead wastage (i.e., number of extra bytes + allocated than were requested in malloc) is less than or equal + to the minimum size, except for requests >= mmap_threshold that + are serviced via mmap(), where the worst case wastage is about + 32 bytes plus the remainder from a system page (the minimal + mmap unit); typically 4096 or 8192 bytes. + + Security: static-safe; optionally more or less + The "security" of malloc refers to the ability of malicious + code to accentuate the effects of errors (for example, freeing + space that is not currently malloc'ed or overwriting past the + ends of chunks) in code that calls malloc. This malloc + guarantees not to modify any memory locations below the base of + heap, i.e., static variables, even in the presence of usage + errors. The routines additionally detect most improper frees + and reallocs. All this holds as long as the static bookkeeping + for malloc itself is not corrupted by some other means. This + is only one aspect of security -- these checks do not, and + cannot, detect all possible programming errors. + + If FOOTERS is defined nonzero, then each allocated chunk + carries an additional check word to verify that it was malloced + from its space. These check words are the same within each + execution of a program using malloc, but differ across + executions, so externally crafted fake chunks cannot be + freed. This improves security by rejecting frees/reallocs that + could corrupt heap memory, in addition to the checks preventing + writes to statics that are always on. This may further improve + security at the expense of time and space overhead. (Note that + FOOTERS may also be worth using with MSPACES.) + + By default detected errors cause the program to abort (calling + "abort()"). You can override this to instead proceed past + errors by defining PROCEED_ON_ERROR. In this case, a bad free + has no effect, and a malloc that encounters a bad address + caused by user overwrites will ignore the bad address by + dropping pointers and indices to all known memory. This may + be appropriate for programs that should continue if at all + possible in the face of programming errors, although they may + run out of memory because dropped memory is never reclaimed. + + If you don't like either of these options, you can define + CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything + else. And if if you are sure that your program using malloc has + no errors or vulnerabilities, you can define INSECURE to 1, + which might (or might not) provide a small performance improvement. + + Thread-safety: NOT thread-safe unless USE_LOCKS defined + When USE_LOCKS is defined, each public call to malloc, free, + etc is surrounded with either a pthread mutex or a win32 + spinlock (depending on WIN32). This is not especially fast, and + can be a major bottleneck. It is designed only to provide + minimal protection in concurrent environments, and to provide a + basis for extensions. If you are using malloc in a concurrent + program, consider instead using nedmalloc + (http://www.nedprod.com/programs/portable/nedmalloc/) or + ptmalloc (See http://www.malloc.de), which are derived + from versions of this malloc. + + System requirements: Any combination of MORECORE and/or MMAP/MUNMAP + This malloc can use unix sbrk or any emulation (invoked using + the CALL_MORECORE macro) and/or mmap/munmap or any emulation + (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system + memory. On most unix systems, it tends to work best if both + MORECORE and MMAP are enabled. On Win32, it uses emulations + based on VirtualAlloc. It also uses common C library functions + like memset. + + Compliance: I believe it is compliant with the Single Unix Specification + (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably + others as well. + +* Overview of algorithms + + This is not the fastest, most space-conserving, most portable, or + most tunable malloc ever written. However it is among the fastest + while also being among the most space-conserving, portable and + tunable. Consistent balance across these factors results in a good + general-purpose allocator for malloc-intensive programs. + + In most ways, this malloc is a best-fit allocator. Generally, it + chooses the best-fitting existing chunk for a request, with ties + broken in approximately least-recently-used order. (This strategy + normally maintains low fragmentation.) However, for requests less + than 256bytes, it deviates from best-fit when there is not an + exactly fitting available chunk by preferring to use space adjacent + to that used for the previous small request, as well as by breaking + ties in approximately most-recently-used order. (These enhance + locality of series of small allocations.) And for very large requests + (>= 256Kb by default), it relies on system memory mapping + facilities, if supported. (This helps avoid carrying around and + possibly fragmenting memory used only for large chunks.) + + All operations (except malloc_stats and mallinfo) have execution + times that are bounded by a constant factor of the number of bits in + a size_t, not counting any clearing in calloc or copying in realloc, + or actions surrounding MORECORE and MMAP that have times + proportional to the number of non-contiguous regions returned by + system allocation routines, which is often just 1. In real-time + applications, you can optionally suppress segment traversals using + NO_SEGMENT_TRAVERSAL, which assures bounded execution even when + system allocators return non-contiguous spaces, at the typical + expense of carrying around more memory and increased fragmentation. + + The implementation is not very modular and seriously overuses + macros. Perhaps someday all C compilers will do as good a job + inlining modular code as can now be done by brute-force expansion, + but now, enough of them seem not to. + + Some compilers issue a lot of warnings about code that is + dead/unreachable only on some platforms, and also about intentional + uses of negation on unsigned types. All known cases of each can be + ignored. + + For a longer but out of date high-level description, see + http://gee.cs.oswego.edu/dl/html/malloc.html + +* MSPACES + If MSPACES is defined, then in addition to malloc, free, etc., + this file also defines mspace_malloc, mspace_free, etc. These + are versions of malloc routines that take an "mspace" argument + obtained using create_mspace, to control all internal bookkeeping. + If ONLY_MSPACES is defined, only these versions are compiled. + So if you would like to use this allocator for only some allocations, + and your system malloc for others, you can compile with + ONLY_MSPACES and then do something like... + static mspace mymspace = create_mspace(0,0); // for example + #define mymalloc(bytes) mspace_malloc(mymspace, bytes) + + (Note: If you only need one instance of an mspace, you can instead + use "USE_DL_PREFIX" to relabel the global malloc.) + + You can similarly create thread-local allocators by storing + mspaces as thread-locals. For example: + static __thread mspace tlms = 0; + void* tlmalloc(size_t bytes) { + if (tlms == 0) tlms = create_mspace(0, 0); + return mspace_malloc(tlms, bytes); + } + void tlfree(void* mem) { mspace_free(tlms, mem); } + + Unless FOOTERS is defined, each mspace is completely independent. + You cannot allocate from one and free to another (although + conformance is only weakly checked, so usage errors are not always + caught). If FOOTERS is defined, then each chunk carries around a tag + indicating its originating mspace, and frees are directed to their + originating spaces. + + ------------------------- Compile-time options --------------------------- + +Be careful in setting #define values for numerical constants of type +size_t. On some systems, literal values are not automatically extended +to size_t precision unless they are explicitly casted. You can also +use the symbolic values MAX_SIZE_T, SIZE_T_ONE, etc below. + +WIN32 default: defined if _WIN32 defined + Defining WIN32 sets up defaults for MS environment and compilers. + Otherwise defaults are for unix. + +MALLOC_ALIGNMENT default: (size_t)8 + Controls the minimum alignment for malloc'ed chunks. It must be a + power of two and at least 8, even on machines for which smaller + alignments would suffice. It may be defined as larger than this + though. Note however that code and data structures are optimized for + the case of 8-byte alignment. + +MSPACES default: 0 (false) + If true, compile in support for independent allocation spaces. + This is only supported if HAVE_MMAP is true. + +ONLY_MSPACES default: 0 (false) + If true, only compile in mspace versions, not regular versions. + +USE_LOCKS default: 0 (false) + Causes each call to each public routine to be surrounded with + pthread or WIN32 mutex lock/unlock. (If set true, this can be + overridden on a per-mspace basis for mspace versions.) If set to a + non-zero value other than 1, locks are used, but their + implementation is left out, so lock functions must be supplied manually. + +USE_SPIN_LOCKS default: 1 iff USE_LOCKS and on x86 using gcc or MSC + If true, uses custom spin locks for locking. This is currently + supported only for x86 platforms using gcc or recent MS compilers. + Otherwise, posix locks or win32 critical sections are used. + +FOOTERS default: 0 + If true, provide extra checking and dispatching by placing + information in the footers of allocated chunks. This adds + space and time overhead. + +INSECURE default: 0 + If true, omit checks for usage errors and heap space overwrites. + +USE_DL_PREFIX default: NOT defined + Causes compiler to prefix all public routines with the string 'dl'. + This can be useful when you only want to use this malloc in one part + of a program, using your regular system malloc elsewhere. + +ABORT default: defined as abort() + Defines how to abort on failed checks. On most systems, a failed + check cannot die with an "assert" or even print an informative + message, because the underlying print routines in turn call malloc, + which will fail again. Generally, the best policy is to simply call + abort(). It's not very useful to do more than this because many + errors due to overwriting will show up as address faults (null, odd + addresses etc) rather than malloc-triggered checks, so will also + abort. Also, most compilers know that abort() does not return, so + can better optimize code conditionally calling it. + +PROCEED_ON_ERROR default: defined as 0 (false) + Controls whether detected bad addresses cause them to bypassed + rather than aborting. If set, detected bad arguments to free and + realloc are ignored. And all bookkeeping information is zeroed out + upon a detected overwrite of freed heap space, thus losing the + ability to ever return it from malloc again, but enabling the + application to proceed. If PROCEED_ON_ERROR is defined, the + static variable malloc_corruption_error_count is compiled in + and can be examined to see if errors have occurred. This option + generates slower code than the default abort policy. + +DEBUG default: NOT defined + The DEBUG setting is mainly intended for people trying to modify + this code or diagnose problems when porting to new platforms. + However, it may also be able to better isolate user errors than just + using runtime checks. The assertions in the check routines spell + out in more detail the assumptions and invariants underlying the + algorithms. The checking is fairly extensive, and will slow down + execution noticeably. Calling malloc_stats or mallinfo with DEBUG + set will attempt to check every non-mmapped allocated and free chunk + in the course of computing the summaries. + +ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) + Debugging assertion failures can be nearly impossible if your + version of the assert macro causes malloc to be called, which will + lead to a cascade of further failures, blowing the runtime stack. + ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), + which will usually make debugging easier. + +MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 + The action to take before "return 0" when malloc fails to be able to + return memory because there is none available. + +HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES + True if this system supports sbrk or an emulation of it. + +MORECORE default: sbrk + The name of the sbrk-style system routine to call to obtain more + memory. See below for guidance on writing custom MORECORE + functions. The type of the argument to sbrk/MORECORE varies across + systems. It cannot be size_t, because it supports negative + arguments, so it is normally the signed type of the same width as + size_t (sometimes declared as "intptr_t"). It doesn't much matter + though. Internally, we only call it with arguments less than half + the max value of a size_t, which should work across all reasonable + possibilities, although sometimes generating compiler warnings. See + near the end of this file for guidelines for creating a custom + version of MORECORE. + +MORECORE_CONTIGUOUS default: 1 (true) if HAVE_MORECORE + If true, take advantage of fact that consecutive calls to MORECORE + with positive arguments always return contiguous increasing + addresses. This is true of unix sbrk. It does not hurt too much to + set it true anyway, since malloc copes with non-contiguities. + Setting it false when definitely non-contiguous saves time + and possibly wasted space it would take to discover this though. + +MORECORE_CANNOT_TRIM default: NOT defined + True if MORECORE cannot release space back to the system when given + negative arguments. This is generally necessary only if you are + using a hand-crafted MORECORE function that cannot handle negative + arguments. + +NO_SEGMENT_TRAVERSAL default: 0 + If non-zero, suppresses traversals of memory segments + returned by either MORECORE or CALL_MMAP. This disables + merging of segments that are contiguous, and selectively + releasing them to the OS if unused, but bounds execution times. + +HAVE_MMAP default: 1 (true) + True if this system supports mmap or an emulation of it. If so, and + HAVE_MORECORE is not true, MMAP is used for all system + allocation. If set and HAVE_MORECORE is true as well, MMAP is + primarily used to directly allocate very large blocks. It is also + used as a backup strategy in cases where MORECORE fails to provide + space from system. Note: A single call to MUNMAP is assumed to be + able to unmap memory that may have be allocated using multiple calls + to MMAP, so long as they are adjacent. + +HAVE_MREMAP default: 1 on linux, else 0 + If true realloc() uses mremap() to re-allocate large blocks and + extend or shrink allocation spaces. + +MMAP_CLEARS default: 1 except on WINCE. + True if mmap clears memory so calloc doesn't need to. This is true + for standard unix mmap using /dev/zero and on WIN32 except for WINCE. + +USE_BUILTIN_FFS default: 0 (i.e., not used) + Causes malloc to use the builtin ffs() function to compute indices. + Some compilers may recognize and intrinsify ffs to be faster than the + supplied C version. Also, the case of x86 using gcc is special-cased + to an asm instruction, so is already as fast as it can be, and so + this setting has no effect. Similarly for Win32 under recent MS compilers. + (On most x86s, the asm version is only slightly faster than the C version.) + +malloc_getpagesize default: derive from system includes, or 4096. + The system page size. To the extent possible, this malloc manages + memory from the system in page-size units. This may be (and + usually is) a function rather than a constant. This is ignored + if WIN32, where page size is determined using getSystemInfo during + initialization. + +USE_DEV_RANDOM default: 0 (i.e., not used) + Causes malloc to use /dev/random to initialize secure magic seed for + stamping footers. Otherwise, the current time is used. + +NO_MALLINFO default: 0 + If defined, don't compile "mallinfo". This can be a simple way + of dealing with mismatches between system declarations and + those in this file. + +MALLINFO_FIELD_TYPE default: size_t + The type of the fields in the mallinfo struct. This was originally + defined as "int" in SVID etc, but is more usefully defined as + size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set + +REALLOC_ZERO_BYTES_FREES default: not defined + This should be set if a call to realloc with zero bytes should + be the same as a call to free. Some people think it should. Otherwise, + since this malloc returns a unique pointer for malloc(0), so does + realloc(p, 0). + +LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H +LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H +LACKS_STDLIB_H default: NOT defined unless on WIN32 + Define these if your system does not have these header files. + You might need to manually insert some of the declarations they provide. + +DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, + system_info.dwAllocationGranularity in WIN32, + otherwise 64K. + Also settable using mallopt(M_GRANULARITY, x) + The unit for allocating and deallocating memory from the system. On + most systems with contiguous MORECORE, there is no reason to + make this more than a page. However, systems with MMAP tend to + either require or encourage larger granularities. You can increase + this value to prevent system allocation functions to be called so + often, especially if they are slow. The value must be at least one + page and must be a power of two. Setting to 0 causes initialization + to either page size or win32 region size. (Note: In previous + versions of malloc, the equivalent of this option was called + "TOP_PAD") + +DEFAULT_TRIM_THRESHOLD default: 2MB + Also settable using mallopt(M_TRIM_THRESHOLD, x) + The maximum amount of unused top-most memory to keep before + releasing via malloc_trim in free(). Automatic trimming is mainly + useful in long-lived programs using contiguous MORECORE. Because + trimming via sbrk can be slow on some systems, and can sometimes be + wasteful (in cases where programs immediately afterward allocate + more large chunks) the value should be high enough so that your + overall system performance would improve by releasing this much + memory. As a rough guide, you might set to a value close to the + average size of a process (program) running on your system. + Releasing this much memory would allow such a process to run in + memory. Generally, it is worth tuning trim thresholds when a + program undergoes phases where several large chunks are allocated + and released in ways that can reuse each other's storage, perhaps + mixed with phases where there are no such chunks at all. The trim + value must be greater than page size to have any useful effect. To + disable trimming completely, you can set to MAX_SIZE_T. Note that the trick + some people use of mallocing a huge space and then freeing it at + program startup, in an attempt to reserve system memory, doesn't + have the intended effect under automatic trimming, since that memory + will immediately be returned to the system. + +DEFAULT_MMAP_THRESHOLD default: 256K + Also settable using mallopt(M_MMAP_THRESHOLD, x) + The request size threshold for using MMAP to directly service a + request. Requests of at least this size that cannot be allocated + using already-existing space will be serviced via mmap. (If enough + normal freed space already exists it is used instead.) Using mmap + segregates relatively large chunks of memory so that they can be + individually obtained and released from the host system. A request + serviced through mmap is never reused by any other request (at least + not directly; the system may just so happen to remap successive + requests to the same locations). Segregating space in this way has + the benefits that: Mmapped space can always be individually released + back to the system, which helps keep the system level memory demands + of a long-lived program low. Also, mapped memory doesn't become + `locked' between other chunks, as can happen with normally allocated + chunks, which means that even trimming via malloc_trim would not + release them. However, it has the disadvantage that the space + cannot be reclaimed, consolidated, and then used to service later + requests, as happens with normal chunks. The advantages of mmap + nearly always outweigh disadvantages for "large" chunks, but the + value of "large" may vary across systems. The default is an + empirically derived value that works well in most systems. You can + disable mmap by setting to MAX_SIZE_T. + +MAX_RELEASE_CHECK_RATE default: 255 unless not HAVE_MMAP + The number of consolidated frees between checks to release + unused segments when freeing. When using non-contiguous segments, + especially with multiple mspaces, checking only for topmost space + doesn't always suffice to trigger trimming. To compensate for this, + free() will, with a period of MAX_RELEASE_CHECK_RATE (or the + current number of segments, if greater) try to release unused + segments to the OS when freeing chunks that result in + consolidation. The best value for this parameter is a compromise + between slowing down frees with relatively costly checks that + rarely trigger versus holding on to unused memory. To effectively + disable, set to MAX_SIZE_T. This may lead to a very slight speed + improvement at the expense of carrying around more memory. +*/ + +#ifndef WIN32 +#ifdef _WIN32 +#define WIN32 1 +#endif /* _WIN32 */ +#endif /* WIN32 */ +#ifdef WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_UNISTD_H +#define LACKS_SYS_PARAM_H +#define LACKS_SYS_MMAN_H +#define LACKS_STRING_H +#define LACKS_STRINGS_H +#define LACKS_SYS_TYPES_H +#define LACKS_ERRNO_H +#define MALLOC_FAILURE_ACTION +#ifdef _WIN32_WCE /* WINCE reportedly does not clear */ +#define MMAP_CLEARS 0 +#else +#define MMAP_CLEARS 1 +#endif /* _WIN32_WCE */ +#endif /* WIN32 */ + +#if defined(DARWIN) || defined(_DARWIN) +/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ +#ifndef HAVE_MORECORE +#define HAVE_MORECORE 0 +#define HAVE_MMAP 1 +#endif /* HAVE_MORECORE */ +#endif /* DARWIN */ + +#ifndef LACKS_SYS_TYPES_H +#include /* For size_t */ +#endif /* LACKS_SYS_TYPES_H */ + +/* The maximum possible size_t value has all bits set */ +#define MAX_SIZE_T (~(size_t)0) + +#ifndef ONLY_MSPACES +#define ONLY_MSPACES 0 +#endif /* ONLY_MSPACES */ +#ifndef MSPACES +#if ONLY_MSPACES +#define MSPACES 1 +#else /* ONLY_MSPACES */ +#define MSPACES 0 +#endif /* ONLY_MSPACES */ +#endif /* MSPACES */ +#ifndef MALLOC_ALIGNMENT +#define MALLOC_ALIGNMENT ((size_t)8U) +#endif /* MALLOC_ALIGNMENT */ +#ifndef FOOTERS +#define FOOTERS 0 +#endif /* FOOTERS */ +#ifndef ABORT +#define ABORT abort() +#endif /* ABORT */ +#ifndef ABORT_ON_ASSERT_FAILURE +#define ABORT_ON_ASSERT_FAILURE 1 +#endif /* ABORT_ON_ASSERT_FAILURE */ +#ifndef PROCEED_ON_ERROR +#define PROCEED_ON_ERROR 0 +#endif /* PROCEED_ON_ERROR */ +#ifndef USE_LOCKS +#define USE_LOCKS 0 +#endif /* USE_LOCKS */ +#ifndef USE_SPIN_LOCKS +#if USE_LOCKS && (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) || (defined(_MSC_VER) && _MSC_VER>=1310) +#define USE_SPIN_LOCKS 1 +#else +#define USE_SPIN_LOCKS 0 +#endif /* USE_LOCKS && ... */ +#endif /* USE_SPIN_LOCKS */ +#ifndef INSECURE +#define INSECURE 0 +#endif /* INSECURE */ +#ifndef HAVE_MMAP +#define HAVE_MMAP 1 +#endif /* HAVE_MMAP */ +#ifndef MMAP_CLEARS +#define MMAP_CLEARS 1 +#endif /* MMAP_CLEARS */ +#ifndef HAVE_MREMAP +#ifdef linux +#define HAVE_MREMAP 1 +#else /* linux */ +#define HAVE_MREMAP 0 +#endif /* linux */ +#endif /* HAVE_MREMAP */ +#ifndef MALLOC_FAILURE_ACTION +#define MALLOC_FAILURE_ACTION errno = ENOMEM; +#endif /* MALLOC_FAILURE_ACTION */ +#ifndef HAVE_MORECORE +#if ONLY_MSPACES +#define HAVE_MORECORE 0 +#else /* ONLY_MSPACES */ +#define HAVE_MORECORE 1 +#endif /* ONLY_MSPACES */ +#endif /* HAVE_MORECORE */ +#if !HAVE_MORECORE +#define MORECORE_CONTIGUOUS 0 +#else /* !HAVE_MORECORE */ +#ifndef MORECORE +#define MORECORE sbrk +#endif /* MORECORE */ +#ifndef MORECORE_CONTIGUOUS +#define MORECORE_CONTIGUOUS 1 +#endif /* MORECORE_CONTIGUOUS */ +#endif /* HAVE_MORECORE */ +#ifndef DEFAULT_GRANULARITY +#if MORECORE_CONTIGUOUS +#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ +#else /* MORECORE_CONTIGUOUS */ +#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) +#endif /* MORECORE_CONTIGUOUS */ +#endif /* DEFAULT_GRANULARITY */ +#ifndef DEFAULT_TRIM_THRESHOLD +#ifndef MORECORE_CANNOT_TRIM +#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) +#else /* MORECORE_CANNOT_TRIM */ +#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T +#endif /* MORECORE_CANNOT_TRIM */ +#endif /* DEFAULT_TRIM_THRESHOLD */ +#ifndef DEFAULT_MMAP_THRESHOLD +#if HAVE_MMAP +#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) +#else /* HAVE_MMAP */ +#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T +#endif /* HAVE_MMAP */ +#endif /* DEFAULT_MMAP_THRESHOLD */ +#ifndef MAX_RELEASE_CHECK_RATE +#if HAVE_MMAP +#define MAX_RELEASE_CHECK_RATE 255 +#else +#define MAX_RELEASE_CHECK_RATE MAX_SIZE_T +#endif /* HAVE_MMAP */ +#endif /* MAX_RELEASE_CHECK_RATE */ +#ifndef USE_BUILTIN_FFS +#define USE_BUILTIN_FFS 0 +#endif /* USE_BUILTIN_FFS */ +#ifndef USE_DEV_RANDOM +#define USE_DEV_RANDOM 0 +#endif /* USE_DEV_RANDOM */ +#ifndef NO_MALLINFO +#define NO_MALLINFO 0 +#endif /* NO_MALLINFO */ +#ifndef MALLINFO_FIELD_TYPE +#define MALLINFO_FIELD_TYPE size_t +#endif /* MALLINFO_FIELD_TYPE */ +#ifndef NO_SEGMENT_TRAVERSAL +#define NO_SEGMENT_TRAVERSAL 0 +#endif /* NO_SEGMENT_TRAVERSAL */ + +/* + mallopt tuning options. SVID/XPG defines four standard parameter + numbers for mallopt, normally defined in malloc.h. None of these + are used in this malloc, so setting them has no effect. But this + malloc does support the following options. +*/ + +#define M_TRIM_THRESHOLD (-1) +#define M_GRANULARITY (-2) +#define M_MMAP_THRESHOLD (-3) + +/* ------------------------ Mallinfo declarations ------------------------ */ + +#if !NO_MALLINFO +/* + This version of malloc supports the standard SVID/XPG mallinfo + routine that returns a struct containing usage properties and + statistics. It should work on any system that has a + /usr/include/malloc.h defining struct mallinfo. The main + declaration needed is the mallinfo struct that is returned (by-copy) + by mallinfo(). The malloinfo struct contains a bunch of fields that + are not even meaningful in this version of malloc. These fields are + are instead filled by mallinfo() with other numbers that might be of + interest. + + HAVE_USR_INCLUDE_MALLOC_H should be set if you have a + /usr/include/malloc.h file that includes a declaration of struct + mallinfo. If so, it is included; else a compliant version is + declared below. These must be precisely the same for mallinfo() to + work. The original SVID version of this struct, defined on most + systems with mallinfo, declares all fields as ints. But some others + define as unsigned long. If your system defines the fields using a + type of different width than listed here, you MUST #include your + system version and #define HAVE_USR_INCLUDE_MALLOC_H. +*/ + +/* #define HAVE_USR_INCLUDE_MALLOC_H */ + +#ifdef HAVE_USR_INCLUDE_MALLOC_H +#include "/usr/include/malloc.h" +#else /* HAVE_USR_INCLUDE_MALLOC_H */ + +struct mallinfo { + MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ + MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ + MALLINFO_FIELD_TYPE smblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ + MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ + MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ + MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ + MALLINFO_FIELD_TYPE fordblks; /* total free space */ + MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ +}; + +#endif /* HAVE_USR_INCLUDE_MALLOC_H */ +#endif /* NO_MALLINFO */ + +/* + Try to persuade compilers to inline. The most critical functions for + inlining are defined as macros, so these aren't used for them. +*/ + +#ifndef FORCEINLINE + #if defined(__GNUC__) +#define FORCEINLINE __inline __attribute__ ((always_inline)) + #elif defined(_MSC_VER) + #define FORCEINLINE __forceinline + #endif +#endif +#ifndef NOINLINE + #if defined(__GNUC__) + #define NOINLINE __attribute__ ((noinline)) + #elif defined(_MSC_VER) + #define NOINLINE __declspec(noinline) + #else + #define NOINLINE + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#ifndef FORCEINLINE + #define FORCEINLINE inline +#endif +#endif /* __cplusplus */ +#ifndef FORCEINLINE + #define FORCEINLINE +#endif + +#if !ONLY_MSPACES + +/* ------------------- Declarations of public routines ------------------- */ + +#ifndef USE_DL_PREFIX +#define dlcalloc calloc +#define dlfree free +#define dlmalloc malloc +#define dlmemalign memalign +#define dlrealloc realloc +#define dlvalloc valloc +#define dlpvalloc pvalloc +#define dlmallinfo mallinfo +#define dlmallopt mallopt +#define dlmalloc_trim malloc_trim +#define dlmalloc_stats malloc_stats +#define dlmalloc_usable_size malloc_usable_size +#define dlmalloc_footprint malloc_footprint +#define dlmalloc_max_footprint malloc_max_footprint +#define dlindependent_calloc independent_calloc +#define dlindependent_comalloc independent_comalloc +#endif /* USE_DL_PREFIX */ + + +/* + malloc(size_t n) + Returns a pointer to a newly allocated chunk of at least n bytes, or + null if no space is available, in which case errno is set to ENOMEM + on ANSI C systems. + + If n is zero, malloc returns a minimum-sized chunk. (The minimum + size is 16 bytes on most 32bit systems, and 32 bytes on 64bit + systems.) Note that size_t is an unsigned type, so calls with + arguments that would be negative if signed are interpreted as + requests for huge amounts of space, which will often fail. The + maximum supported value of n differs across systems, but is in all + cases less than the maximum representable value of a size_t. +*/ +void* dlmalloc(size_t); + +/* + free(void* p) + Releases the chunk of memory pointed to by p, that had been previously + allocated using malloc or a related routine such as realloc. + It has no effect if p is null. If p was not malloced or already + freed, free(p) will by default cause the current program to abort. +*/ +void dlfree(void*); + +/* + calloc(size_t n_elements, size_t element_size); + Returns a pointer to n_elements * element_size bytes, with all locations + set to zero. +*/ +void* dlcalloc(size_t, size_t); + +/* + realloc(void* p, size_t n) + Returns a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. + + The returned pointer may or may not be the same as p. The algorithm + prefers extending p in most cases when possible, otherwise it + employs the equivalent of a malloc-copy-free sequence. + + If p is null, realloc is equivalent to malloc. + + If space is not available, realloc returns null, errno is set (if on + ANSI) and p is NOT freed. + + if n is for fewer bytes than already held by p, the newly unused + space is lopped off and freed if possible. realloc with a size + argument of zero (re)allocates a minimum-sized chunk. + + The old unix realloc convention of allowing the last-free'd chunk + to be used as an argument to realloc is not supported. +*/ + +void* dlrealloc(void*, size_t); + +/* + memalign(size_t alignment, size_t n); + Returns a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument. + + The alignment argument should be a power of two. If the argument is + not a power of two, the nearest greater power is used. + 8-byte alignment is guaranteed by normal malloc calls, so don't + bother calling memalign with an argument of 8 or less. + + Overreliance on memalign is a sure way to fragment space. +*/ +void* dlmemalign(size_t, size_t); + +/* + valloc(size_t n); + Equivalent to memalign(pagesize, n), where pagesize is the page + size of the system. If the pagesize is unknown, 4096 is used. +*/ +void* dlvalloc(size_t); + +/* + mallopt(int parameter_number, int parameter_value) + Sets tunable parameters The format is to provide a + (parameter-number, parameter-value) pair. mallopt then sets the + corresponding parameter to the argument value if it can (i.e., so + long as the value is meaningful), and returns 1 if successful else + 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, + normally defined in malloc.h. None of these are use in this malloc, + so setting them has no effect. But this malloc also supports other + options in mallopt. See below for details. Briefly, supported + parameters are as follows (listed defaults are for "typical" + configurations). + + Symbol param # default allowed param values + M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) + M_GRANULARITY -2 page size any power of 2 >= page size + M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) +*/ +int dlmallopt(int, int); + +/* + malloc_footprint(); + Returns the number of bytes obtained from the system. The total + number of bytes allocated by malloc, realloc etc., is less than this + value. Unlike mallinfo, this function returns only a precomputed + result, so can be called frequently to monitor memory consumption. + Even if locks are otherwise defined, this function does not use them, + so results might not be up to date. +*/ +size_t dlmalloc_footprint(void); + +/* + malloc_max_footprint(); + Returns the maximum number of bytes obtained from the system. This + value will be greater than current footprint if deallocated space + has been reclaimed by the system. The peak number of bytes allocated + by malloc, realloc etc., is less than this value. Unlike mallinfo, + this function returns only a precomputed result, so can be called + frequently to monitor memory consumption. Even if locks are + otherwise defined, this function does not use them, so results might + not be up to date. +*/ +size_t dlmalloc_max_footprint(void); + +#if !NO_MALLINFO +/* + mallinfo() + Returns (by copy) a struct containing various summary statistics: + + arena: current total non-mmapped bytes allocated from system + ordblks: the number of free chunks + smblks: always zero. + hblks: current number of mmapped regions + hblkhd: total bytes held in mmapped regions + usmblks: the maximum total allocated space. This will be greater + than current total if trimming has occurred. + fsmblks: always zero + uordblks: current total allocated space (normal or mmapped) + fordblks: total free space + keepcost: the maximum number of bytes that could ideally be released + back to system via malloc_trim. ("ideally" means that + it ignores page restrictions etc.) + + Because these fields are ints, but internal bookkeeping may + be kept as longs, the reported values may wrap around zero and + thus be inaccurate. +*/ +struct mallinfo dlmallinfo(void); +#endif /* NO_MALLINFO */ + +/* + independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); + + independent_calloc is similar to calloc, but instead of returning a + single cleared space, it returns an array of pointers to n_elements + independent elements that can hold contents of size elem_size, each + of which starts out cleared, and can be independently freed, + realloc'ed etc. The elements are guaranteed to be adjacently + allocated (this is not guaranteed to occur with multiple callocs or + mallocs), which may also improve cache locality in some + applications. + + The "chunks" argument is optional (i.e., may be null, which is + probably the most typical usage). If it is null, the returned array + is itself dynamically allocated and should also be freed when it is + no longer needed. Otherwise, the chunks array must be of at least + n_elements in length. It is filled in with the pointers to the + chunks. + + In either case, independent_calloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and "chunks" + is null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use regular calloc and assign pointers into this + space to represent elements. (In this case though, you cannot + independently free elements.) + + independent_calloc simplifies and speeds up implementations of many + kinds of pools. It may also be useful when constructing large data + structures that initially have a fixed number of fixed-sized nodes, + but the number is not known at compile time, and some of the nodes + may later need to be freed. For example: + + struct Node { int item; struct Node* next; }; + + struct Node* build_list() { + struct Node** pool; + int n = read_number_of_nodes_needed(); + if (n <= 0) return 0; + pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); + if (pool == 0) die(); + // organize into a linked list... + struct Node* first = pool[0]; + for (i = 0; i < n-1; ++i) + pool[i]->next = pool[i+1]; + free(pool); // Can now free the array (or not, if it is needed later) + return first; + } +*/ +void** dlindependent_calloc(size_t, size_t, void**); + +/* + independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); + + independent_comalloc allocates, all at once, a set of n_elements + chunks with sizes indicated in the "sizes" array. It returns + an array of pointers to these elements, each of which can be + independently freed, realloc'ed etc. The elements are guaranteed to + be adjacently allocated (this is not guaranteed to occur with + multiple callocs or mallocs), which may also improve cache locality + in some applications. + + The "chunks" argument is optional (i.e., may be null). If it is null + the returned array is itself dynamically allocated and should also + be freed when it is no longer needed. Otherwise, the chunks array + must be of at least n_elements in length. It is filled in with the + pointers to the chunks. + + In either case, independent_comalloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and chunks is + null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use a single regular malloc, and assign pointers at + particular offsets in the aggregate space. (In this case though, you + cannot independently free elements.) + + independent_comallac differs from independent_calloc in that each + element may have a different size, and also that it does not + automatically clear elements. + + independent_comalloc can be used to speed up allocation in cases + where several structs or objects must always be allocated at the + same time. For example: + + struct Head { ... } + struct Foot { ... } + + void send_message(char* msg) { + int msglen = strlen(msg); + size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; + void* chunks[3]; + if (independent_comalloc(3, sizes, chunks) == 0) + die(); + struct Head* head = (struct Head*)(chunks[0]); + char* body = (char*)(chunks[1]); + struct Foot* foot = (struct Foot*)(chunks[2]); + // ... + } + + In general though, independent_comalloc is worth using only for + larger values of n_elements. For small values, you probably won't + detect enough difference from series of malloc calls to bother. + + Overuse of independent_comalloc can increase overall memory usage, + since it cannot reuse existing noncontiguous small chunks that + might be available for some of the elements. +*/ +void** dlindependent_comalloc(size_t, size_t*, void**); + + +/* + pvalloc(size_t n); + Equivalent to valloc(minimum-page-that-holds(n)), that is, + round up n to nearest pagesize. + */ +void* dlpvalloc(size_t); + +/* + malloc_trim(size_t pad); + + If possible, gives memory back to the system (via negative arguments + to sbrk) if there is unused memory at the `high' end of the malloc + pool or in unused MMAP segments. You can call this after freeing + large blocks of memory to potentially reduce the system-level memory + requirements of a program. However, it cannot guarantee to reduce + memory. Under some allocation patterns, some large free blocks of + memory will be locked between two used chunks, so they cannot be + given back to the system. + + The `pad' argument to malloc_trim represents the amount of free + trailing space to leave untrimmed. If this argument is zero, only + the minimum amount of memory to maintain internal data structures + will be left. Non-zero arguments can be supplied to maintain enough + trailing space to service future expected allocations without having + to re-obtain memory from the system. + + Malloc_trim returns 1 if it actually released any memory, else 0. +*/ +int dlmalloc_trim(size_t); + +/* + malloc_usable_size(void* p); + + Returns the number of bytes you can actually use in + an allocated chunk, which may be more than you requested (although + often not) due to alignment and minimum size constraints. + You can use this many bytes without worrying about + overwriting other allocated objects. This is not a particularly great + programming practice. malloc_usable_size can be more useful in + debugging and assertions, for example: + + p = malloc(n); + assert(malloc_usable_size(p) >= 256); +*/ +size_t dlmalloc_usable_size(void*); + +/* + malloc_stats(); + Prints on stderr the amount of space obtained from the system (both + via sbrk and mmap), the maximum amount (which may be more than + current if malloc_trim and/or munmap got called), and the current + number of bytes allocated via malloc (or realloc, etc) but not yet + freed. Note that this is the number of bytes allocated, not the + number requested. It will be larger than the number requested + because of alignment and bookkeeping overhead. Because it includes + alignment wastage as being in use, this figure may be greater than + zero even when no user-level chunks are allocated. + + The reported current and maximum system memory can be inaccurate if + a program makes other calls to system memory allocation functions + (normally sbrk) outside of malloc. + + malloc_stats prints only the most commonly interesting statistics. + More information can be obtained by calling mallinfo. +*/ +void dlmalloc_stats(void); + +#endif /* ONLY_MSPACES */ + +#if MSPACES + +/* + mspace is an opaque type representing an independent + region of space that supports mspace_malloc, etc. +*/ +typedef void* mspace; + +/* + create_mspace creates and returns a new independent space with the + given initial capacity, or, if 0, the default granularity size. It + returns null if there is no system memory available to create the + space. If argument locked is non-zero, the space uses a separate + lock to control access. The capacity of the space will grow + dynamically as needed to service mspace_malloc requests. You can + control the sizes of incremental increases of this space by + compiling with a different DEFAULT_GRANULARITY or dynamically + setting with mallopt(M_GRANULARITY, value). +*/ +mspace create_mspace(size_t capacity, int locked); + +/* + destroy_mspace destroys the given space, and attempts to return all + of its memory back to the system, returning the total number of + bytes freed. After destruction, the results of access to all memory + used by the space become undefined. +*/ +size_t destroy_mspace(mspace msp); + +/* + create_mspace_with_base uses the memory supplied as the initial base + of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this + space is used for bookkeeping, so the capacity must be at least this + large. (Otherwise 0 is returned.) When this initial space is + exhausted, additional memory will be obtained from the system. + Destroying this space will deallocate all additionally allocated + space (if possible) but not the initial base. +*/ +mspace create_mspace_with_base(void* base, size_t capacity, int locked); + +/* + mspace_malloc behaves as malloc, but operates within + the given space. +*/ +void* mspace_malloc(mspace msp, size_t bytes); + +/* + mspace_free behaves as free, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_free is not actually needed. + free may be called instead of mspace_free because freed chunks from + any space are handled by their originating spaces. +*/ +void mspace_free(mspace msp, void* mem); + +/* + mspace_realloc behaves as realloc, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_realloc is not actually + needed. realloc may be called instead of mspace_realloc because + realloced chunks from any space are handled by their originating + spaces. +*/ +void* mspace_realloc(mspace msp, void* mem, size_t newsize); + +/* + mspace_calloc behaves as calloc, but operates within + the given space. +*/ +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); + +/* + mspace_memalign behaves as memalign, but operates within + the given space. +*/ +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); + +/* + mspace_independent_calloc behaves as independent_calloc, but + operates within the given space. +*/ +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]); + +/* + mspace_independent_comalloc behaves as independent_comalloc, but + operates within the given space. +*/ +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]); + +/* + mspace_footprint() returns the number of bytes obtained from the + system for this space. +*/ +size_t mspace_footprint(mspace msp); + +/* + mspace_max_footprint() returns the peak number of bytes obtained from the + system for this space. +*/ +size_t mspace_max_footprint(mspace msp); + + +#if !NO_MALLINFO +/* + mspace_mallinfo behaves as mallinfo, but reports properties of + the given space. +*/ +struct mallinfo mspace_mallinfo(mspace msp); +#endif /* NO_MALLINFO */ + +/* + mspace_malloc_stats behaves as malloc_stats, but reports + properties of the given space. +*/ +void mspace_malloc_stats(mspace msp); + +/* + mspace_trim behaves as malloc_trim, but + operates within the given space. +*/ +int mspace_trim(mspace msp, size_t pad); + +/* + An alias for mallopt. +*/ +int mspace_mallopt(int, int); + +#endif /* MSPACES */ + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif /* __cplusplus */ + +/* + ======================================================================== + To make a fully customizable malloc.h header file, cut everything + above this line, put into file malloc.h, edit to suit, and #include it + on the next line, as well as in programs that use this malloc. + ======================================================================== +*/ + +/* #include "malloc.h" */ + +/*------------------------------ internal #includes ---------------------- */ + +#ifdef WIN32 +#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ +#endif /* WIN32 */ + +#include /* for printing in malloc_stats */ + +#ifndef LACKS_ERRNO_H +#include /* for MALLOC_FAILURE_ACTION */ +#endif /* LACKS_ERRNO_H */ +#if FOOTERS +#include /* for magic initialization */ +#endif /* FOOTERS */ +#ifndef LACKS_STDLIB_H +#include /* for abort() */ +#endif /* LACKS_STDLIB_H */ +#ifdef DEBUG +#if ABORT_ON_ASSERT_FAILURE +#define assert(x) if(!(x)) ABORT +#else /* ABORT_ON_ASSERT_FAILURE */ +#include +#endif /* ABORT_ON_ASSERT_FAILURE */ +#else /* DEBUG */ +#define assert(x) +#endif /* DEBUG */ +#ifndef LACKS_STRING_H +#include /* for memset etc */ +#endif /* LACKS_STRING_H */ +#if USE_BUILTIN_FFS +#ifndef LACKS_STRINGS_H +#include /* for ffs */ +#endif /* LACKS_STRINGS_H */ +#endif /* USE_BUILTIN_FFS */ +#if HAVE_MMAP +#ifndef LACKS_SYS_MMAN_H +#include /* for mmap */ +#endif /* LACKS_SYS_MMAN_H */ +#ifndef LACKS_FCNTL_H +#include +#endif /* LACKS_FCNTL_H */ +#endif /* HAVE_MMAP */ +#if HAVE_MORECORE +#ifndef LACKS_UNISTD_H +#include /* for sbrk */ +#else /* LACKS_UNISTD_H */ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) +extern void* sbrk(ptrdiff_t); +#endif /* FreeBSD etc */ +#endif /* LACKS_UNISTD_H */ +#endif /* HAVE_MMAP */ + +/* Declarations for locking */ +#if USE_LOCKS +#ifndef WIN32 +#include +#if defined (__SVR4) && defined (__sun) /* solaris */ +#include +#endif /* solaris */ +#else +#ifndef _M_AMD64 +/* These are already defined on AMD64 builds */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +LONG __cdecl _InterlockedCompareExchange(LPLONG volatile Dest, LONG Exchange, LONG Comp); +LONG __cdecl _InterlockedExchange(LPLONG volatile Target, LONG Value); +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* _M_AMD64 */ +#pragma intrinsic (_InterlockedCompareExchange) +#pragma intrinsic (_InterlockedExchange) +#define interlockedcompareexchange _InterlockedCompareExchange +#define interlockedexchange _InterlockedExchange +#endif /* Win32 */ +#endif /* USE_LOCKS */ + +/* Declarations for bit scanning on win32 */ +#if defined(_MSC_VER) && _MSC_VER>=1300 +#ifndef BitScanForward /* Try to avoid pulling in WinNT.h */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +unsigned char _BitScanForward(unsigned long *index, unsigned long mask); +unsigned char _BitScanReverse(unsigned long *index, unsigned long mask); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define BitScanForward _BitScanForward +#define BitScanReverse _BitScanReverse +#pragma intrinsic(_BitScanForward) +#pragma intrinsic(_BitScanReverse) +#endif /* BitScanForward */ +#endif /* defined(_MSC_VER) && _MSC_VER>=1300 */ + +#ifndef WIN32 +#ifndef malloc_getpagesize +# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ +# ifndef _SC_PAGE_SIZE +# define _SC_PAGE_SIZE _SC_PAGESIZE +# endif +# endif +# ifdef _SC_PAGE_SIZE +# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) +# else +# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) + extern size_t getpagesize(); +# define malloc_getpagesize getpagesize() +# else +# ifdef WIN32 /* use supplied emulation of getpagesize */ +# define malloc_getpagesize getpagesize() +# else +# ifndef LACKS_SYS_PARAM_H +# include +# endif +# ifdef EXEC_PAGESIZE +# define malloc_getpagesize EXEC_PAGESIZE +# else +# ifdef NBPG +# ifndef CLSIZE +# define malloc_getpagesize NBPG +# else +# define malloc_getpagesize (NBPG * CLSIZE) +# endif +# else +# ifdef NBPC +# define malloc_getpagesize NBPC +# else +# ifdef PAGESIZE +# define malloc_getpagesize PAGESIZE +# else /* just guess */ +# define malloc_getpagesize ((size_t)4096U) +# endif +# endif +# endif +# endif +# endif +# endif +# endif +#endif +#endif + + + +/* ------------------- size_t and alignment properties -------------------- */ + +/* The byte and bit size of a size_t */ +#define SIZE_T_SIZE (sizeof(size_t)) +#define SIZE_T_BITSIZE (sizeof(size_t) << 3) + +/* Some constants coerced to size_t */ +/* Annoying but necessary to avoid errors on some platforms */ +#define SIZE_T_ZERO ((size_t)0) +#define SIZE_T_ONE ((size_t)1) +#define SIZE_T_TWO ((size_t)2) +#define SIZE_T_FOUR ((size_t)4) +#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) +#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) +#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) +#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) + +/* The bit mask value corresponding to MALLOC_ALIGNMENT */ +#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) + +/* True if address a has acceptable alignment */ +#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) + +/* the number of bytes to offset an address to align it */ +#define align_offset(A)\ + ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ + ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) + +/* -------------------------- MMAP preliminaries ------------------------- */ + +/* + If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and + checks to fail so compiler optimizer can delete code rather than + using so many "#if"s. +*/ + + +/* MORECORE and MMAP must return MFAIL on failure */ +#define MFAIL ((void*)(MAX_SIZE_T)) +#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ + +#if !HAVE_MMAP +#define IS_MMAPPED_BIT (SIZE_T_ZERO) +#define USE_MMAP_BIT (SIZE_T_ZERO) +#define CALL_MMAP(s) MFAIL +#define CALL_MUNMAP(a, s) (-1) +#define DIRECT_MMAP(s) MFAIL + +#else /* HAVE_MMAP */ +#define IS_MMAPPED_BIT (SIZE_T_ONE) +#define USE_MMAP_BIT (SIZE_T_ONE) + +#ifndef WIN32 +#define CALL_MUNMAP(a, s) munmap((a), (s)) +#define MMAP_PROT (PROT_READ|PROT_WRITE) +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif /* MAP_ANON */ +#ifdef MAP_ANONYMOUS +#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) +#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) +#else /* MAP_ANONYMOUS */ +/* + Nearly all versions of mmap support MAP_ANONYMOUS, so the following + is unlikely to be needed, but is supplied just in case. +*/ +#define MMAP_FLAGS (MAP_PRIVATE) +static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ +#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ + (dev_zero_fd = open("/dev/zero", O_RDWR), \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) +#endif /* MAP_ANONYMOUS */ + +#define DIRECT_MMAP(s) CALL_MMAP(s) +#else /* WIN32 */ + +/* Win32 MMAP via VirtualAlloc */ +static FORCEINLINE void* win32mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); + return (ptr != 0)? ptr: MFAIL; +} + +/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ +static FORCEINLINE void* win32direct_mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, + PAGE_READWRITE); + return (ptr != 0)? ptr: MFAIL; +} + +/* This function supports releasing coalesed segments */ +static FORCEINLINE int win32munmap(void* ptr, size_t size) { + MEMORY_BASIC_INFORMATION minfo; + char* cptr = (char*)ptr; + while (size) { + if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) + return -1; + if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || + minfo.State != MEM_COMMIT || minfo.RegionSize > size) + return -1; + if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) + return -1; + cptr += minfo.RegionSize; + size -= minfo.RegionSize; + } + return 0; +} + +#define CALL_MMAP(s) win32mmap(s) +#define CALL_MUNMAP(a, s) win32munmap((a), (s)) +#define DIRECT_MMAP(s) win32direct_mmap(s) +#endif /* WIN32 */ +#endif /* HAVE_MMAP */ + +#if HAVE_MMAP && HAVE_MREMAP +#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) +#else /* HAVE_MMAP && HAVE_MREMAP */ +#define CALL_MREMAP(addr, osz, nsz, mv) ((void)(addr),(void)(osz), \ + (void)(nsz), (void)(mv),MFAIL) +#endif /* HAVE_MMAP && HAVE_MREMAP */ + +#if HAVE_MORECORE +#define CALL_MORECORE(S) MORECORE(S) +#else /* HAVE_MORECORE */ +#define CALL_MORECORE(S) MFAIL +#endif /* HAVE_MORECORE */ + +/* mstate bit set if continguous morecore disabled or failed */ +#define USE_NONCONTIGUOUS_BIT (4U) + +/* segment bit set in create_mspace_with_base */ +#define EXTERN_BIT (8U) + + +/* --------------------------- Lock preliminaries ------------------------ */ + +/* + When locks are defined, there are up to two global locks: + + * If HAVE_MORECORE, morecore_mutex protects sequences of calls to + MORECORE. In many cases sys_alloc requires two calls, that should + not be interleaved with calls by other threads. This does not + protect against direct calls to MORECORE by other threads not + using this lock, so there is still code to cope the best we can on + interference. + + * magic_init_mutex ensures that mparams.magic and other + unique mparams values are initialized only once. + + To enable use in layered extensions, locks are reentrant. + + Because lock-protected regions generally have bounded times, we use + the supplied simple spinlocks in the custom versions for x86. + + If USE_LOCKS is > 1, the definitions of lock routines here are + bypassed, in which case you will need to define at least + INITIAL_LOCK, ACQUIRE_LOCK, RELEASE_LOCK, and + NULL_LOCK_INITIALIZER, and possibly TRY_LOCK and IS_LOCKED + (The latter two are not used in this malloc, but are + commonly needed in extensions.) +*/ + +#if USE_LOCKS == 1 + +#if USE_SPIN_LOCKS +#ifndef WIN32 +/* Custom pthread-style spin locks on x86 and x64 for gcc */ +struct pthread_mlock_t +{ + volatile pthread_t threadid; + volatile unsigned int c; + volatile unsigned int l; +}; +#define MLOCK_T struct pthread_mlock_t +#define CURRENT_THREAD pthread_self() +#define SPINS_PER_YIELD 63 +static FORCEINLINE int pthread_acquire_lock (MLOCK_T *sl) { + if(CURRENT_THREAD==sl->threadid) + ++sl->c; + else { + int spins = 0; + for (;;) { + int ret; + __asm__ __volatile__ ("lock cmpxchgl %2,(%1)" : "=a" (ret) : "r" (&sl->l), "r" (1), "a" (0)); + if(!ret) { + assert(!sl->threadid); + sl->threadid=CURRENT_THREAD; + sl->c=1; + break; + } + if ((++spins & SPINS_PER_YIELD) == 0) { +#if defined (__SVR4) && defined (__sun) /* solaris */ + thr_yield(); +#else +#ifdef linux + sched_yield(); +#else /* no-op yield on unknown systems */ + ; +#endif /* linux */ +#endif /* solaris */ + } + } + } + + return 0; +} + +static FORCEINLINE void pthread_release_lock (MLOCK_T *sl) { + int ret; + assert(CURRENT_THREAD==sl->threadid); + if (!--sl->c) { + sl->threadid=0; + __asm__ __volatile__ ("xchgl %2,(%1)" : "=r" (ret) : "r" (&sl->l), "0" (0)); + } +} + +static FORCEINLINE int pthread_try_lock (MLOCK_T *sl) { + int ret; + __asm__ __volatile__ ("lock cmpxchgl %2,(%1)" : "=a" (ret) : "r" (&sl->l), "r" (1), "a" (0)); + if(!ret){ + assert(!sl->threadid); + sl->threadid=CURRENT_THREAD; + sl->c=1; + return 1; + } + return 0; +} + +#define INITIAL_LOCK(sl) (memset((sl), 0, sizeof(MLOCK_T)), 0) +#define ACQUIRE_LOCK(sl) pthread_acquire_lock(sl) +#define RELEASE_LOCK(sl) pthread_release_lock(sl) +#define TRY_LOCK(sl) pthread_try_lock(sl) +#define IS_LOCKED(sl) ((sl)->l) + +static MLOCK_T magic_init_mutex = {0, 0, 0 }; +#if HAVE_MORECORE +static MLOCK_T morecore_mutex = {0, 0, 0 }; +#endif /* HAVE_MORECORE */ + +#else /* WIN32 */ +/* Custom win32-style spin locks on x86 and x64 for MSC */ +struct win32_mlock_t +{ + volatile long threadid; + volatile unsigned int c; + long l; +}; +#define MLOCK_T struct win32_mlock_t +#define CURRENT_THREAD GetCurrentThreadId() +#define SPINS_PER_YIELD 63 +static FORCEINLINE int win32_acquire_lock (MLOCK_T *sl) { + long mythreadid=CURRENT_THREAD; + if(mythreadid==sl->threadid) + ++sl->c; + else { + int spins = 0; + for (;;) { + if (!interlockedexchange(&sl->l, 1)) { + assert(!sl->threadid); + sl->threadid=mythreadid; + sl->c=1; + break; + } + if ((++spins & SPINS_PER_YIELD) == 0) + SleepEx(0, FALSE); + } + } + return 0; +} + +static FORCEINLINE void win32_release_lock (MLOCK_T *sl) { + assert(CURRENT_THREAD==sl->threadid); + if (!--sl->c) { + sl->threadid=0; + interlockedexchange (&sl->l, 0); + } +} + +static FORCEINLINE int win32_try_lock (MLOCK_T *sl) { + if (!interlockedexchange(&sl->l, 1)){ + assert(!sl->threadid); + sl->threadid=CURRENT_THREAD; + sl->c=1; + return 1; + } + return 0; +} + +#define INITIAL_LOCK(sl) (memset(sl, 0, sizeof(MLOCK_T)), 0) +#define ACQUIRE_LOCK(sl) win32_acquire_lock(sl) +#define RELEASE_LOCK(sl) win32_release_lock(sl) +#define TRY_LOCK(sl) win32_try_lock(sl) +#define IS_LOCKED(sl) ((sl)->l) + +static MLOCK_T magic_init_mutex = {0, 0 }; +#if HAVE_MORECORE +static MLOCK_T morecore_mutex = {0, 0 }; +#endif /* HAVE_MORECORE */ + +#endif /* WIN32 */ +#else /* USE_SPIN_LOCKS */ + +#ifndef WIN32 +/* pthreads-based locks */ +struct pthread_mlock_t +{ + volatile unsigned int c; + pthread_mutex_t l; +}; +#define MLOCK_T struct pthread_mlock_t +#define CURRENT_THREAD pthread_self() +static FORCEINLINE int pthread_acquire_lock (MLOCK_T *sl) { + if(!pthread_mutex_lock(&(sl)->l)){ + sl->c++; + return 0; + } + return 1; +} + +static FORCEINLINE void pthread_release_lock (MLOCK_T *sl) { + --sl->c; + pthread_mutex_unlock(&(sl)->l); +} + +static FORCEINLINE int pthread_try_lock (MLOCK_T *sl) { + if(!pthread_mutex_trylock(&(sl)->l)){ + sl->c++; + return 1; + } + return 0; +} + +static FORCEINLINE int pthread_init_lock (MLOCK_T *sl) { + pthread_mutexattr_t attr; + sl->c=0; + if(pthread_mutexattr_init(&attr)) return 1; + if(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) return 1; + if(pthread_mutex_init(&sl->l, &attr)) return 1; + pthread_mutexattr_destroy(&attr); + return 0; +} + +static FORCEINLINE int pthread_islocked (MLOCK_T *sl) { + if(!pthread_try_lock(sl)){ + int ret = (sl->c != 0); + pthread_mutex_unlock(sl); + return ret; + } + return 0; +} + +#define INITIAL_LOCK(sl) pthread_init_lock(sl) +#define ACQUIRE_LOCK(sl) pthread_acquire_lock(sl) +#define RELEASE_LOCK(sl) pthread_release_lock(sl) +#define TRY_LOCK(sl) pthread_try_lock(sl) +#define IS_LOCKED(sl) pthread_islocked(sl) + +static MLOCK_T magic_init_mutex = {0, PTHREAD_MUTEX_INITIALIZER }; +#if HAVE_MORECORE +static MLOCK_T morecore_mutex = {0, PTHREAD_MUTEX_INITIALIZER }; +#endif /* HAVE_MORECORE */ + +#else /* WIN32 */ +/* Win32 critical sections */ +#define MLOCK_T CRITICAL_SECTION +#define CURRENT_THREAD GetCurrentThreadId() +#define INITIAL_LOCK(s) (!InitializeCriticalSectionAndSpinCount((s), 4000) +#define ACQUIRE_LOCK(s) ( (!((s))->DebugInfo ? INITIAL_LOCK((s)) : 0), !EnterCriticalSection((s)), 0) +#define RELEASE_LOCK(s) ( LeaveCriticalSection((s)), 0 ) +#define TRY_LOCK(s) ( TryEnterCriticalSection((s)) ) +#define IS_LOCKED(s) ( (s)->LockCount >= 0 ) +#define NULL_LOCK_INITIALIZER +static MLOCK_T magic_init_mutex; +#if HAVE_MORECORE +static MLOCK_T morecore_mutex; +#endif /* HAVE_MORECORE */ +#endif /* WIN32 */ +#endif /* USE_SPIN_LOCKS */ +#endif /* USE_LOCKS == 1 */ + +/* ----------------------- User-defined locks ------------------------ */ + +#if USE_LOCKS > 1 +/* Define your own lock implementation here */ +/* #define INITIAL_LOCK(sl) ... */ +/* #define ACQUIRE_LOCK(sl) ... */ +/* #define RELEASE_LOCK(sl) ... */ +/* #define TRY_LOCK(sl) ... */ +/* #define IS_LOCKED(sl) ... */ +/* #define NULL_LOCK_INITIALIZER ... */ + +static MLOCK_T magic_init_mutex = NULL_LOCK_INITIALIZER; +#if HAVE_MORECORE +static MLOCK_T morecore_mutex = NULL_LOCK_INITIALIZER; +#endif /* HAVE_MORECORE */ +#endif /* USE_LOCKS > 1 */ + +/* ----------------------- Lock-based state ------------------------ */ + + +#if USE_LOCKS +#define USE_LOCK_BIT (2U) +#else /* USE_LOCKS */ +#define USE_LOCK_BIT (0U) +#define INITIAL_LOCK(l) +#endif /* USE_LOCKS */ + +#if USE_LOCKS && HAVE_MORECORE +#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); +#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); +#else /* USE_LOCKS && HAVE_MORECORE */ +#define ACQUIRE_MORECORE_LOCK() +#define RELEASE_MORECORE_LOCK() +#endif /* USE_LOCKS && HAVE_MORECORE */ + +#if USE_LOCKS +#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); +#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); +#else /* USE_LOCKS */ +#define ACQUIRE_MAGIC_INIT_LOCK() +#define RELEASE_MAGIC_INIT_LOCK() +#endif /* USE_LOCKS */ + + +/* ----------------------- Chunk representations ------------------------ */ + +/* + (The following includes lightly edited explanations by Colin Plumb.) + + The malloc_chunk declaration below is misleading (but accurate and + necessary). It declares a "view" into memory allowing access to + necessary fields at known offsets from a given base. + + Chunks of memory are maintained using a `boundary tag' method as + originally described by Knuth. (See the paper by Paul Wilson + ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such + techniques.) Sizes of free chunks are stored both in the front of + each chunk and at the end. This makes consolidating fragmented + chunks into bigger chunks fast. The head fields also hold bits + representing whether chunks are free or in use. + + Here are some pictures to make it clearer. They are "exploded" to + show that the state of a chunk can be thought of as extending from + the high 31 bits of the head field of its header through the + prev_foot and PINUSE_BIT bit of the following chunk header. + + A chunk that's in use looks like: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk (if P = 1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| + | Size of this chunk 1| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + +- -+ + | | + +- -+ + | : + +- size - sizeof(size_t) available payload bytes -+ + : | + chunk-> +- -+ + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| + | Size of next chunk (may or may not be in use) | +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + And if it's free, it looks like this: + + chunk-> +- -+ + | User payload (must be in use, or we would have merged!) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| + | Size of this chunk 0| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next pointer | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Prev pointer | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | : + +- size - sizeof(struct chunk) unused bytes -+ + : | + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of this chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| + | Size of next chunk (must be in use, or we would have merged)| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | : + +- User payload -+ + : | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0| + +-+ + Note that since we always merge adjacent free chunks, the chunks + adjacent to a free chunk must be in use. + + Given a pointer to a chunk (which can be derived trivially from the + payload pointer) we can, in O(1) time, find out whether the adjacent + chunks are free, and if so, unlink them from the lists that they + are on and merge them with the current chunk. + + Chunks always begin on even word boundaries, so the mem portion + (which is returned to the user) is also on an even word boundary, and + thus at least double-word aligned. + + The P (PINUSE_BIT) bit, stored in the unused low-order bit of the + chunk size (which is always a multiple of two words), is an in-use + bit for the *previous* chunk. If that bit is *clear*, then the + word before the current chunk size contains the previous chunk + size, and can be used to find the front of the previous chunk. + The very first chunk allocated always has this bit set, preventing + access to non-existent (or non-owned) memory. If pinuse is set for + any given chunk, then you CANNOT determine the size of the + previous chunk, and might even get a memory addressing fault when + trying to do so. + + The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of + the chunk size redundantly records whether the current chunk is + inuse. This redundancy enables usage checks within free and realloc, + and reduces indirection when freeing and consolidating chunks. + + Each freshly allocated chunk must have both cinuse and pinuse set. + That is, each allocated chunk borders either a previously allocated + and still in-use chunk, or the base of its memory arena. This is + ensured by making all allocations from the the `lowest' part of any + found chunk. Further, no free chunk physically borders another one, + so each free chunk is known to be preceded and followed by either + inuse chunks or the ends of memory. + + Note that the `foot' of the current chunk is actually represented + as the prev_foot of the NEXT chunk. This makes it easier to + deal with alignments etc but can be very confusing when trying + to extend or adapt this code. + + The exceptions to all this are + + 1. The special chunk `top' is the top-most available chunk (i.e., + the one bordering the end of available memory). It is treated + specially. Top is never included in any bin, is used only if + no other chunk is available, and is released back to the + system if it is very large (see M_TRIM_THRESHOLD). In effect, + the top chunk is treated as larger (and thus less well + fitting) than any other available chunk. The top chunk + doesn't update its trailing size field since there is no next + contiguous chunk that would have to index off it. However, + space is still allocated for it (TOP_FOOT_SIZE) to enable + separation or merging when space is extended. + + 3. Chunks allocated via mmap, which have the lowest-order bit + (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set + PINUSE_BIT in their head fields. Because they are allocated + one-by-one, each must carry its own prev_foot field, which is + also used to hold the offset this chunk has within its mmapped + region, which is needed to preserve alignment. Each mmapped + chunk is trailed by the first two fields of a fake next-chunk + for sake of usage checks. + +*/ + +struct malloc_chunk { + size_t prev_foot; /* Size of previous chunk (if free). */ + size_t head; /* Size and inuse bits. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; +}; + +typedef struct malloc_chunk mchunk; +typedef struct malloc_chunk* mchunkptr; +typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ +typedef unsigned int bindex_t; /* Described below */ +typedef unsigned int binmap_t; /* Described below */ +typedef unsigned int flag_t; /* The type of various bit flag sets */ + +/* ------------------- Chunks sizes and alignments ----------------------- */ + +#define MCHUNK_SIZE (sizeof(mchunk)) + +#if FOOTERS +#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +#else /* FOOTERS */ +#define CHUNK_OVERHEAD (SIZE_T_SIZE) +#endif /* FOOTERS */ + +/* MMapped chunks need a second word of overhead ... */ +#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +/* ... and additional padding for fake next-chunk at foot */ +#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) + +/* The smallest size we can malloc is an aligned minimal chunk */ +#define MIN_CHUNK_SIZE\ + ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* conversion from malloc headers to user pointers, and back */ +#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) +#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) +/* chunk associated with aligned address A */ +#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) + +/* Bounds on request (not chunk) sizes. */ +#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) +#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) + +/* pad request bytes into a usable size */ +#define pad_request(req) \ + (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* pad request, checking for minimum (but not maximum) */ +#define request2size(req) \ + (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) + + +/* ------------------ Operations on head and foot fields ----------------- */ + +/* + The head field of a chunk is or'ed with PINUSE_BIT when previous + adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in + use. If the chunk was obtained with mmap, the prev_foot field has + IS_MMAPPED_BIT set, otherwise holding the offset of the base of the + mmapped region to the base of the chunk. + + FLAG4_BIT is not used by this malloc, but might be useful in extensions. +*/ + +#define PINUSE_BIT (SIZE_T_ONE) +#define CINUSE_BIT (SIZE_T_TWO) +#define FLAG4_BIT (SIZE_T_FOUR) +#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) +#define FLAG_BITS (PINUSE_BIT|CINUSE_BIT|FLAG4_BIT) + +/* Head value for fenceposts */ +#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) + +/* extraction of fields from head words */ +#define cinuse(p) ((p)->head & CINUSE_BIT) +#define pinuse(p) ((p)->head & PINUSE_BIT) +#define chunksize(p) ((p)->head & ~(FLAG_BITS)) + +#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) +#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) + +/* Treat space at ptr +/- offset as a chunk */ +#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) +#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) + +/* Ptr to next or previous physical malloc_chunk. */ +#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~FLAG_BITS))) +#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) + +/* extract next chunk's pinuse bit */ +#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) + +/* Get/set size at footer */ +#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) +#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) + +/* Set size, pinuse bit, and foot */ +#define set_size_and_pinuse_of_free_chunk(p, s)\ + ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) + +/* Set size, pinuse bit, foot, and clear next pinuse */ +#define set_free_with_pinuse(p, s, n)\ + (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) + +#define is_mmapped(p)\ + (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) + +/* Get the internal overhead associated with chunk p */ +#define overhead_for(p)\ + (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) + +/* Return true if malloced space is not necessarily cleared */ +#if MMAP_CLEARS +#define calloc_must_clear(p) (!is_mmapped(p)) +#else /* MMAP_CLEARS */ +#define calloc_must_clear(p) (1) +#endif /* MMAP_CLEARS */ + +/* ---------------------- Overlaid data structures ----------------------- */ + +/* + When chunks are not in use, they are treated as nodes of either + lists or trees. + + "Small" chunks are stored in circular doubly-linked lists, and look + like this: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space (may be 0 bytes long) . + . . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Larger chunks are kept in a form of bitwise digital trees (aka + tries) keyed on chunksizes. Because malloc_tree_chunks are only for + free chunks greater than 256 bytes, their size doesn't impose any + constraints on user chunk sizes. Each node looks like: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk of same size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk of same size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to left child (child[0]) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to right child (child[1]) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to parent | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | bin index of this chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Each tree holding treenodes is a tree of unique chunk sizes. Chunks + of the same size are arranged in a circularly-linked list, with only + the oldest chunk (the next to be used, in our FIFO ordering) + actually in the tree. (Tree members are distinguished by a non-null + parent pointer.) If a chunk with the same size an an existing node + is inserted, it is linked off the existing node using pointers that + work in the same way as fd/bk pointers of small chunks. + + Each tree contains a power of 2 sized range of chunk sizes (the + smallest is 0x100 <= x < 0x180), which is is divided in half at each + tree level, with the chunks in the smaller half of the range (0x100 + <= x < 0x140 for the top nose) in the left subtree and the larger + half (0x140 <= x < 0x180) in the right subtree. This is, of course, + done by inspecting individual bits. + + Using these rules, each node's left subtree contains all smaller + sizes than its right subtree. However, the node at the root of each + subtree has no particular ordering relationship to either. (The + dividing line between the subtree sizes is based on trie relation.) + If we remove the last chunk of a given size from the interior of the + tree, we need to replace it with a leaf node. The tree ordering + rules permit a node to be replaced by any leaf below it. + + The smallest chunk in a tree (a common operation in a best-fit + allocator) can be found by walking a path to the leftmost leaf in + the tree. Unlike a usual binary tree, where we follow left child + pointers until we reach a null, here we follow the right child + pointer any time the left one is null, until we reach a leaf with + both child pointers null. The smallest chunk in the tree will be + somewhere along that path. + + The worst case number of steps to add, find, or remove a node is + bounded by the number of bits differentiating chunks within + bins. Under current bin calculations, this ranges from 6 up to 21 + (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case + is of course much better. +*/ + +struct malloc_tree_chunk { + /* The first four fields must be compatible with malloc_chunk */ + size_t prev_foot; + size_t head; + struct malloc_tree_chunk* fd; + struct malloc_tree_chunk* bk; + + struct malloc_tree_chunk* child[2]; + struct malloc_tree_chunk* parent; + bindex_t index; +}; + +typedef struct malloc_tree_chunk tchunk; +typedef struct malloc_tree_chunk* tchunkptr; +typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ + +/* A little helper macro for trees */ +#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) + +/* ----------------------------- Segments -------------------------------- */ + +/* + Each malloc space may include non-contiguous segments, held in a + list headed by an embedded malloc_segment record representing the + top-most space. Segments also include flags holding properties of + the space. Large chunks that are directly allocated by mmap are not + included in this list. They are instead independently created and + destroyed without otherwise keeping track of them. + + Segment management mainly comes into play for spaces allocated by + MMAP. Any call to MMAP might or might not return memory that is + adjacent to an existing segment. MORECORE normally contiguously + extends the current space, so this space is almost always adjacent, + which is simpler and faster to deal with. (This is why MORECORE is + used preferentially to MMAP when both are available -- see + sys_alloc.) When allocating using MMAP, we don't use any of the + hinting mechanisms (inconsistently) supported in various + implementations of unix mmap, or distinguish reserving from + committing memory. Instead, we just ask for space, and exploit + contiguity when we get it. It is probably possible to do + better than this on some systems, but no general scheme seems + to be significantly better. + + Management entails a simpler variant of the consolidation scheme + used for chunks to reduce fragmentation -- new adjacent memory is + normally prepended or appended to an existing segment. However, + there are limitations compared to chunk consolidation that mostly + reflect the fact that segment processing is relatively infrequent + (occurring only when getting memory from system) and that we + don't expect to have huge numbers of segments: + + * Segments are not indexed, so traversal requires linear scans. (It + would be possible to index these, but is not worth the extra + overhead and complexity for most programs on most platforms.) + * New segments are only appended to old ones when holding top-most + memory; if they cannot be prepended to others, they are held in + different segments. + + Except for the top-most segment of an mstate, each segment record + is kept at the tail of its segment. Segments are added by pushing + segment records onto the list headed by &mstate.seg for the + containing mstate. + + Segment flags control allocation/merge/deallocation policies: + * If EXTERN_BIT set, then we did not allocate this segment, + and so should not try to deallocate or merge with others. + (This currently holds only for the initial segment passed + into create_mspace_with_base.) + * If IS_MMAPPED_BIT set, the segment may be merged with + other surrounding mmapped segments and trimmed/de-allocated + using munmap. + * If neither bit is set, then the segment was obtained using + MORECORE so can be merged with surrounding MORECORE'd segments + and deallocated/trimmed using MORECORE with negative arguments. +*/ + +struct malloc_segment { + char* base; /* base address */ + size_t size; /* allocated size */ + struct malloc_segment* next; /* ptr to next segment */ + flag_t sflags; /* mmap and extern flag */ +}; + +#define is_mmapped_segment(S) ((S)->sflags & IS_MMAPPED_BIT) +#define is_extern_segment(S) ((S)->sflags & EXTERN_BIT) + +typedef struct malloc_segment msegment; +typedef struct malloc_segment* msegmentptr; + +/* ---------------------------- malloc_state ----------------------------- */ + +/* + A malloc_state holds all of the bookkeeping for a space. + The main fields are: + + Top + The topmost chunk of the currently active segment. Its size is + cached in topsize. The actual size of topmost space is + topsize+TOP_FOOT_SIZE, which includes space reserved for adding + fenceposts and segment records if necessary when getting more + space from the system. The size at which to autotrim top is + cached from mparams in trim_check, except that it is disabled if + an autotrim fails. + + Designated victim (dv) + This is the preferred chunk for servicing small requests that + don't have exact fits. It is normally the chunk split off most + recently to service another small request. Its size is cached in + dvsize. The link fields of this chunk are not maintained since it + is not kept in a bin. + + SmallBins + An array of bin headers for free chunks. These bins hold chunks + with sizes less than MIN_LARGE_SIZE bytes. Each bin contains + chunks of all the same size, spaced 8 bytes apart. To simplify + use in double-linked lists, each bin header acts as a malloc_chunk + pointing to the real first node, if it exists (else pointing to + itself). This avoids special-casing for headers. But to avoid + waste, we allocate only the fd/bk pointers of bins, and then use + repositioning tricks to treat these as the fields of a chunk. + + TreeBins + Treebins are pointers to the roots of trees holding a range of + sizes. There are 2 equally spaced treebins for each power of two + from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything + larger. + + Bin maps + There is one bit map for small bins ("smallmap") and one for + treebins ("treemap). Each bin sets its bit when non-empty, and + clears the bit when empty. Bit operations are then used to avoid + bin-by-bin searching -- nearly all "search" is done without ever + looking at bins that won't be selected. The bit maps + conservatively use 32 bits per map word, even if on 64bit system. + For a good description of some of the bit-based techniques used + here, see Henry S. Warren Jr's book "Hacker's Delight" (and + supplement at http://hackersdelight.org/). Many of these are + intended to reduce the branchiness of paths through malloc etc, as + well as to reduce the number of memory locations read or written. + + Segments + A list of segments headed by an embedded malloc_segment record + representing the initial space. + + Address check support + The least_addr field is the least address ever obtained from + MORECORE or MMAP. Attempted frees and reallocs of any address less + than this are trapped (unless INSECURE is defined). + + Magic tag + A cross-check field that should always hold same value as mparams.magic. + + Flags + Bits recording whether to use MMAP, locks, or contiguous MORECORE + + Statistics + Each space keeps track of current and maximum system memory + obtained via MORECORE or MMAP. + + Trim support + Fields holding the amount of unused topmost memory that should trigger + timming, and a counter to force periodic scanning to release unused + non-topmost segments. + + Locking + If USE_LOCKS is defined, the "mutex" lock is acquired and released + around every public call using this mspace. + + Extension support + A void* pointer and a size_t field that can be used to help implement + extensions to this malloc. +*/ + +/* Bin types, widths and sizes */ +#define NSMALLBINS (32U) +#define NTREEBINS (32U) +#define SMALLBIN_SHIFT (3U) +#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) +#define TREEBIN_SHIFT (8U) +#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) +#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) +#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) + +struct malloc_state { + binmap_t smallmap; + binmap_t treemap; + size_t dvsize; + size_t topsize; + char* least_addr; + mchunkptr dv; + mchunkptr top; + size_t trim_check; + size_t release_checks; + size_t magic; + mchunkptr smallbins[(NSMALLBINS+1)*2]; + tbinptr treebins[NTREEBINS]; + size_t footprint; + size_t max_footprint; + flag_t mflags; +#if USE_LOCKS + MLOCK_T mutex; /* locate lock among fields that rarely change */ +#endif /* USE_LOCKS */ + msegment seg; + void* extp; /* Unused but available for extensions */ + size_t exts; +}; + +typedef struct malloc_state* mstate; + +/* ------------- Global malloc_state and malloc_params ------------------- */ + +/* + malloc_params holds global properties, including those that can be + dynamically set using mallopt. There is a single instance, mparams, + initialized in init_mparams. +*/ + +struct malloc_params { + size_t magic; + size_t page_size; + size_t granularity; + size_t mmap_threshold; + size_t trim_threshold; + flag_t default_mflags; +}; + +static struct malloc_params mparams; + +#if !ONLY_MSPACES + +/* The global malloc_state used for all non-"mspace" calls */ +static struct malloc_state _gm_; +#define gm (&_gm_) +#define is_global(M) ((M) == &_gm_) + +#endif /* !ONLY_MSPACES */ + +#define is_initialized(M) ((M)->top != 0) + +/* -------------------------- system alloc setup ------------------------- */ + +/* Operations on mflags */ + +#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) +#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) +#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) + +#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) +#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) +#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) + +#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) +#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) + +#define set_lock(M,L)\ + ((M)->mflags = (L)?\ + ((M)->mflags | USE_LOCK_BIT) :\ + ((M)->mflags & ~USE_LOCK_BIT)) + +/* page-align a size */ +#define page_align(S)\ + (((S) + (mparams.page_size - SIZE_T_ONE)) & ~(mparams.page_size - SIZE_T_ONE)) + +/* granularity-align a size */ +#define granularity_align(S)\ + (((S) + (mparams.granularity - SIZE_T_ONE))\ + & ~(mparams.granularity - SIZE_T_ONE)) + + +/* For mmap, use granularity alignment on windows, else page-align */ +#ifdef WIN32 +#define mmap_align(S) granularity_align(S) +#else +#define mmap_align(S) page_align(S) +#endif + +#define is_page_aligned(S)\ + (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) +#define is_granularity_aligned(S)\ + (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) + +/* True if segment S holds address A */ +#define segment_holds(S, A)\ + ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) + +/* Return segment holding given address */ +static msegmentptr segment_holding(mstate m, char* addr) { + msegmentptr sp = &m->seg; + for (;;) { + if (addr >= sp->base && addr < sp->base + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } +} + +/* Return true if segment contains a segment link */ +static int has_segment_link(mstate m, msegmentptr ss) { + msegmentptr sp = &m->seg; + for (;;) { + if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) + return 1; + if ((sp = sp->next) == 0) + return 0; + } +} + +#ifndef MORECORE_CANNOT_TRIM +#define should_trim(M,s) ((s) > (M)->trim_check) +#else /* MORECORE_CANNOT_TRIM */ +#define should_trim(M,s) (0) +#endif /* MORECORE_CANNOT_TRIM */ + +/* + TOP_FOOT_SIZE is padding at the end of a segment, including space + that may be needed to place segment records and fenceposts when new + noncontiguous segments are added. +*/ +#define TOP_FOOT_SIZE\ + (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) + + +/* ------------------------------- Hooks -------------------------------- */ + +/* + PREACTION should be defined to return 0 on success, and nonzero on + failure. If you are not using locking, you can redefine these to do + anything you like. +*/ + +#if USE_LOCKS + +/* Ensure locks are initialized */ +#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) + +#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) +#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } +#else /* USE_LOCKS */ + +#ifndef PREACTION +#define PREACTION(M) (0) +#endif /* PREACTION */ + +#ifndef POSTACTION +#define POSTACTION(M) +#endif /* POSTACTION */ + +#endif /* USE_LOCKS */ + +/* + CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. + USAGE_ERROR_ACTION is triggered on detected bad frees and + reallocs. The argument p is an address that might have triggered the + fault. It is ignored by the two predefined actions, but might be + useful in custom actions that try to help diagnose errors. +*/ + +#if PROCEED_ON_ERROR + +/* A count of the number of corruption errors causing resets */ +int malloc_corruption_error_count; + +/* default corruption action */ +static void reset_on_error(mstate m); + +#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) +#define USAGE_ERROR_ACTION(m, p) + +#else /* PROCEED_ON_ERROR */ + +#ifndef CORRUPTION_ERROR_ACTION +#define CORRUPTION_ERROR_ACTION(m) ABORT +#endif /* CORRUPTION_ERROR_ACTION */ + +#ifndef USAGE_ERROR_ACTION +#define USAGE_ERROR_ACTION(m,p) ABORT +#endif /* USAGE_ERROR_ACTION */ + +#endif /* PROCEED_ON_ERROR */ + +/* -------------------------- Debugging setup ---------------------------- */ + +#if ! DEBUG + +#define check_free_chunk(M,P) +#define check_inuse_chunk(M,P) +#define check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) +#define check_malloc_state(M) +#define check_top_chunk(M,P) + +#else /* DEBUG */ +#define check_free_chunk(M,P) do_check_free_chunk(M,P) +#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) +#define check_top_chunk(M,P) do_check_top_chunk(M,P) +#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) +#define check_malloc_state(M) do_check_malloc_state(M) + +static void do_check_any_chunk(mstate m, mchunkptr p); +static void do_check_top_chunk(mstate m, mchunkptr p); +static void do_check_mmapped_chunk(mstate m, mchunkptr p); +static void do_check_inuse_chunk(mstate m, mchunkptr p); +static void do_check_free_chunk(mstate m, mchunkptr p); +static void do_check_malloced_chunk(mstate m, void* mem, size_t s); +static void do_check_tree(mstate m, tchunkptr t); +static void do_check_treebin(mstate m, bindex_t i); +static void do_check_smallbin(mstate m, bindex_t i); +static void do_check_malloc_state(mstate m); +static int bin_find(mstate m, mchunkptr x); +static size_t traverse_and_check(mstate m); +#endif /* DEBUG */ + +/* ---------------------------- Indexing Bins ---------------------------- */ + +#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) +#define small_index(s) ((s) >> SMALLBIN_SHIFT) +#define small_index2size(i) ((i) << SMALLBIN_SHIFT) +#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) + +/* addressing by index. See above about smallbin repositioning */ +#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) +#define treebin_at(M,i) (&((M)->treebins[i])) + +/* assign tree index for size S to variable I */ +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#define compute_tree_index(S, I)\ +{\ + unsigned int X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int K;\ + __asm__("bsrl\t%1, %0\n\t" : "=r" (K) : "g" (X));\ + I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ + }\ +} + +#elif defined(_MSC_VER) && _MSC_VER>=1300 +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int K;\ + _BitScanReverse((DWORD *) &K, X);\ + I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ + }\ +} +#else /* GNUC */ +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int Y = (unsigned int)X;\ + unsigned int N = ((Y - 0x100) >> 16) & 8;\ + unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ + N += K;\ + N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ + K = 14 - N + ((Y <<= K) >> 15);\ + I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ + }\ +} +#endif /* GNUC */ + +/* Bit representing maximum resolved size in a treebin at i */ +#define bit_for_tree_index(i) \ + (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) + +/* Shift placing maximum resolved bit in a treebin at i as sign bit */ +#define leftshift_for_tree_index(i) \ + ((i == NTREEBINS-1)? 0 : \ + ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) + +/* The size of the smallest chunk held in bin with index i */ +#define minsize_for_tree_index(i) \ + ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ + (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) + + +/* ------------------------ Operations on bin maps ----------------------- */ + +/* bit corresponding to given index */ +#define idx2bit(i) ((binmap_t)(1) << (i)) + +/* Mark/Clear bits with given index */ +#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) +#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) +#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) + +#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) +#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) +#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) + +/* index corresponding to given bit */ + +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#define compute_bit2idx(X, I)\ +{\ + unsigned int J;\ + __asm__("bsfl\t%1, %0\n\t" : "=r" (J) : "g" (X));\ + I = (bindex_t)J;\ +} +#elif defined(_MSC_VER) && _MSC_VER>=1300 +#define compute_bit2idx(X, I)\ +{\ + unsigned int J;\ + _BitScanForward((DWORD *) &J, X);\ + I = (bindex_t)J;\ +} + +#else /* GNUC */ +#if USE_BUILTIN_FFS +#define compute_bit2idx(X, I) I = ffs(X)-1 + +#else /* USE_BUILTIN_FFS */ +#define compute_bit2idx(X, I)\ +{\ + unsigned int Y = X - 1;\ + unsigned int K = Y >> (16-4) & 16;\ + unsigned int N = K; Y >>= K;\ + N += K = Y >> (8-3) & 8; Y >>= K;\ + N += K = Y >> (4-2) & 4; Y >>= K;\ + N += K = Y >> (2-1) & 2; Y >>= K;\ + N += K = Y >> (1-0) & 1; Y >>= K;\ + I = (bindex_t)(N + Y);\ +} +#endif /* USE_BUILTIN_FFS */ +#endif /* GNUC */ + +/* isolate the least set bit of a bitmap */ +#define least_bit(x) ((x) & -(x)) + +/* mask with all bits to left of least bit of x on */ +#define left_bits(x) ((x<<1) | -(x<<1)) + +/* mask with all bits to left of or equal to least bit of x on */ +#define same_or_left_bits(x) ((x) | -(x)) + + +/* ----------------------- Runtime Check Support ------------------------- */ + +/* + For security, the main invariant is that malloc/free/etc never + writes to a static address other than malloc_state, unless static + malloc_state itself has been corrupted, which cannot occur via + malloc (because of these checks). In essence this means that we + believe all pointers, sizes, maps etc held in malloc_state, but + check all of those linked or offsetted from other embedded data + structures. These checks are interspersed with main code in a way + that tends to minimize their run-time cost. + + When FOOTERS is defined, in addition to range checking, we also + verify footer fields of inuse chunks, which can be used guarantee + that the mstate controlling malloc/free is intact. This is a + streamlined version of the approach described by William Robertson + et al in "Run-time Detection of Heap-based Overflows" LISA'03 + http://www.usenix.org/events/lisa03/tech/robertson.html The footer + of an inuse chunk holds the xor of its mstate and a random seed, + that is checked upon calls to free() and realloc(). This is + (probablistically) unguessable from outside the program, but can be + computed by any code successfully malloc'ing any chunk, so does not + itself provide protection against code that has already broken + security through some other means. Unlike Robertson et al, we + always dynamically check addresses of all offset chunks (previous, + next, etc). This turns out to be cheaper than relying on hashes. +*/ + +#if !INSECURE +/* Check if address a is at least as high as any from MORECORE or MMAP */ +#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) +/* Check if address of next chunk n is higher than base chunk p */ +#define ok_next(p, n) ((char*)(p) < (char*)(n)) +/* Check if p has its cinuse bit on */ +#define ok_cinuse(p) cinuse(p) +/* Check if p has its pinuse bit on */ +#define ok_pinuse(p) pinuse(p) + +#else /* !INSECURE */ +#define ok_address(M, a) (1) +#define ok_next(b, n) (1) +#define ok_cinuse(p) (1) +#define ok_pinuse(p) (1) +#endif /* !INSECURE */ + +#if (FOOTERS && !INSECURE) +/* Check if (alleged) mstate m has expected magic field */ +#define ok_magic(M) ((M)->magic == mparams.magic) +#else /* (FOOTERS && !INSECURE) */ +#define ok_magic(M) (1) +#endif /* (FOOTERS && !INSECURE) */ + + +/* In gcc, use __builtin_expect to minimize impact of checks */ +#if !INSECURE +#if defined(__GNUC__) && __GNUC__ >= 3 +#define RTCHECK(e) __builtin_expect(e, 1) +#else /* GNUC */ +#define RTCHECK(e) (e) +#endif /* GNUC */ +#else /* !INSECURE */ +#define RTCHECK(e) (1) +#endif /* !INSECURE */ + +/* macros to set up inuse chunks with or without footers */ + +#if !FOOTERS + +#define mark_inuse_foot(M,p,s) + +/* Set cinuse bit and pinuse bit of next chunk */ +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set size, cinuse and pinuse bit of this chunk */ +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) + +#else /* FOOTERS */ + +/* Set foot of inuse chunk to be xor of mstate and seed */ +#define mark_inuse_foot(M,p,s)\ + (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) + +#define get_mstate_for(p)\ + ((mstate)(((mchunkptr)((char*)(p) +\ + (chunksize(p))))->prev_foot ^ mparams.magic)) + +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ + mark_inuse_foot(M,p,s)) + +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ + mark_inuse_foot(M,p,s)) + +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + mark_inuse_foot(M, p, s)) + +#endif /* !FOOTERS */ + +/* ---------------------------- setting mparams -------------------------- */ + +/* Initialize mparams */ +static int init_mparams(void) { + if (mparams.page_size == 0) { + size_t s; + + mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; + mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; +#if MORECORE_CONTIGUOUS + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; +#else /* MORECORE_CONTIGUOUS */ + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; +#endif /* MORECORE_CONTIGUOUS */ + +#if (FOOTERS && !INSECURE) + { +#if USE_DEV_RANDOM + int fd; + unsigned char buf[sizeof(size_t)]; + /* Try to use /dev/urandom, else fall back on using time */ + if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && + read(fd, buf, sizeof(buf)) == sizeof(buf)) { + s = *((size_t *) buf); + close(fd); + } + else +#endif /* USE_DEV_RANDOM */ + s = (size_t)(time(0) ^ (size_t)0x55555555U); + + s |= (size_t)8U; /* ensure nonzero */ + s &= ~(size_t)7U; /* improve chances of fault for bad values */ + + } +#else /* (FOOTERS && !INSECURE) */ + s = (size_t)0x58585858U; +#endif /* (FOOTERS && !INSECURE) */ + ACQUIRE_MAGIC_INIT_LOCK(); + if (mparams.magic == 0) { + mparams.magic = s; +#if !ONLY_MSPACES + /* Set up lock for main malloc area */ + INITIAL_LOCK(&gm->mutex); + gm->mflags = mparams.default_mflags; +#endif + } + RELEASE_MAGIC_INIT_LOCK(); + +#ifndef WIN32 + mparams.page_size = malloc_getpagesize; + mparams.granularity = ((DEFAULT_GRANULARITY != 0)? + DEFAULT_GRANULARITY : mparams.page_size); +#else /* WIN32 */ + { + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + mparams.page_size = system_info.dwPageSize; + mparams.granularity = system_info.dwAllocationGranularity; + } +#endif /* WIN32 */ + + /* Sanity-check configuration: + size_t must be unsigned and as wide as pointer type. + ints must be at least 4 bytes. + alignment must be at least 8. + Alignment, min chunk size, and page size must all be powers of 2. + */ + if ((sizeof(size_t) != sizeof(char*)) || + (MAX_SIZE_T < MIN_CHUNK_SIZE) || + (sizeof(int) < 4) || + (MALLOC_ALIGNMENT < (size_t)8U) || + ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || + ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || + ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || + ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) + ABORT; + } + return 0; +} + +/* support for mallopt */ +static int change_mparam(int param_number, int value) { + size_t val = (size_t)value; + init_mparams(); + switch(param_number) { + case M_TRIM_THRESHOLD: + mparams.trim_threshold = val; + return 1; + case M_GRANULARITY: + if (val >= mparams.page_size && ((val & (val-1)) == 0)) { + mparams.granularity = val; + return 1; + } + else + return 0; + case M_MMAP_THRESHOLD: + mparams.mmap_threshold = val; + return 1; + default: + return 0; + } +} + +#if DEBUG +/* ------------------------- Debugging Support --------------------------- */ + +/* Check properties of any chunk, whether free, inuse, mmapped etc */ +static void do_check_any_chunk(mstate m, mchunkptr p) { + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); +} + +/* Check properties of top chunk */ +static void do_check_top_chunk(mstate m, mchunkptr p) { + msegmentptr sp = segment_holding(m, (char*)p); + size_t sz = p->head & ~INUSE_BITS; /* third-lowest bit can be set! */ + assert(sp != 0); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(sz == m->topsize); + assert(sz > 0); + assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); + assert(pinuse(p)); + assert(!pinuse(chunk_plus_offset(p, sz))); +} + +/* Check properties of (inuse) mmapped chunks */ +static void do_check_mmapped_chunk(mstate m, mchunkptr p) { + size_t sz = chunksize(p); + size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); + assert(is_mmapped(p)); + assert(use_mmap(m)); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(!is_small(sz)); + assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); + assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); + assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); +} + +/* Check properties of inuse chunks */ +static void do_check_inuse_chunk(mstate m, mchunkptr p) { + do_check_any_chunk(m, p); + assert(cinuse(p)); + assert(next_pinuse(p)); + /* If not pinuse and not mmapped, previous chunk has OK offset */ + assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); + if (is_mmapped(p)) + do_check_mmapped_chunk(m, p); +} + +/* Check properties of free chunks */ +static void do_check_free_chunk(mstate m, mchunkptr p) { + size_t sz = chunksize(p); + mchunkptr next = chunk_plus_offset(p, sz); + do_check_any_chunk(m, p); + assert(!cinuse(p)); + assert(!next_pinuse(p)); + assert (!is_mmapped(p)); + if (p != m->dv && p != m->top) { + if (sz >= MIN_CHUNK_SIZE) { + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(is_aligned(chunk2mem(p))); + assert(next->prev_foot == sz); + assert(pinuse(p)); + assert (next == m->top || cinuse(next)); + assert(p->fd->bk == p); + assert(p->bk->fd == p); + } + else /* markers are always of size SIZE_T_SIZE */ + assert(sz == SIZE_T_SIZE); + } +} + +/* Check properties of malloced chunks at the point they are malloced */ +static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); + do_check_inuse_chunk(m, p); + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(sz >= MIN_CHUNK_SIZE); + assert(sz >= s); + /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ + assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); + } +} + +/* Check a tree and its subtrees. */ +static void do_check_tree(mstate m, tchunkptr t) { + tchunkptr head = 0; + tchunkptr u = t; + bindex_t tindex = t->index; + size_t tsize = chunksize(t); + bindex_t idx; + compute_tree_index(tsize, idx); + assert(tindex == idx); + assert(tsize >= MIN_LARGE_SIZE); + assert(tsize >= minsize_for_tree_index(idx)); + assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); + + do { /* traverse through chain of same-sized nodes */ + do_check_any_chunk(m, ((mchunkptr)u)); + assert(u->index == tindex); + assert(chunksize(u) == tsize); + assert(!cinuse(u)); + assert(!next_pinuse(u)); + assert(u->fd->bk == u); + assert(u->bk->fd == u); + if (u->parent == 0) { + assert(u->child[0] == 0); + assert(u->child[1] == 0); + } + else { + assert(head == 0); /* only one node on chain has parent */ + head = u; + assert(u->parent != u); + assert (u->parent->child[0] == u || + u->parent->child[1] == u || + *((tbinptr*)(u->parent)) == u); + if (u->child[0] != 0) { + assert(u->child[0]->parent == u); + assert(u->child[0] != u); + do_check_tree(m, u->child[0]); + } + if (u->child[1] != 0) { + assert(u->child[1]->parent == u); + assert(u->child[1] != u); + do_check_tree(m, u->child[1]); + } + if (u->child[0] != 0 && u->child[1] != 0) { + assert(chunksize(u->child[0]) < chunksize(u->child[1])); + } + } + u = u->fd; + } while (u != t); + assert(head != 0); +} + +/* Check all the chunks in a treebin. */ +static void do_check_treebin(mstate m, bindex_t i) { + tbinptr* tb = treebin_at(m, i); + tchunkptr t = *tb; + int empty = (m->treemap & (1U << i)) == 0; + if (t == 0) + assert(empty); + if (!empty) + do_check_tree(m, t); +} + +/* Check all the chunks in a smallbin. */ +static void do_check_smallbin(mstate m, bindex_t i) { + sbinptr b = smallbin_at(m, i); + mchunkptr p = b->bk; + unsigned int empty = (m->smallmap & (1U << i)) == 0; + if (p == b) + assert(empty); + if (!empty) { + for (; p != b; p = p->bk) { + size_t size = chunksize(p); + mchunkptr q; + /* each chunk claims to be free */ + do_check_free_chunk(m, p); + /* chunk belongs in bin */ + assert(small_index(size) == i); + assert(p->bk == b || chunksize(p->bk) == chunksize(p)); + /* chunk is followed by an inuse chunk */ + q = next_chunk(p); + if (q->head != FENCEPOST_HEAD) + do_check_inuse_chunk(m, q); + } + } +} + +/* Find x in a bin. Used in other check functions. */ +static int bin_find(mstate m, mchunkptr x) { + size_t size = chunksize(x); + if (is_small(size)) { + bindex_t sidx = small_index(size); + sbinptr b = smallbin_at(m, sidx); + if (smallmap_is_marked(m, sidx)) { + mchunkptr p = b; + do { + if (p == x) + return 1; + } while ((p = p->fd) != b); + } + } + else { + bindex_t tidx; + compute_tree_index(size, tidx); + if (treemap_is_marked(m, tidx)) { + tchunkptr t = *treebin_at(m, tidx); + size_t sizebits = size << leftshift_for_tree_index(tidx); + while (t != 0 && chunksize(t) != size) { + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + sizebits <<= 1; + } + if (t != 0) { + tchunkptr u = t; + do { + if (u == (tchunkptr)x) + return 1; + } while ((u = u->fd) != t); + } + } + } + return 0; +} + +/* Traverse each chunk and check it; return total */ +static size_t traverse_and_check(mstate m) { + size_t sum = 0; + if (is_initialized(m)) { + msegmentptr s = &m->seg; + sum += m->topsize + TOP_FOOT_SIZE; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + mchunkptr lastq = 0; + assert(pinuse(q)); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + sum += chunksize(q); + if (cinuse(q)) { + assert(!bin_find(m, q)); + do_check_inuse_chunk(m, q); + } + else { + assert(q == m->dv || bin_find(m, q)); + assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ + do_check_free_chunk(m, q); + } + lastq = q; + q = next_chunk(q); + } + s = s->next; + } + } + return sum; +} + +/* Check all properties of malloc_state. */ +static void do_check_malloc_state(mstate m) { + bindex_t i; + size_t total; + /* check bins */ + for (i = 0; i < NSMALLBINS; ++i) + do_check_smallbin(m, i); + for (i = 0; i < NTREEBINS; ++i) + do_check_treebin(m, i); + + if (m->dvsize != 0) { /* check dv chunk */ + do_check_any_chunk(m, m->dv); + assert(m->dvsize == chunksize(m->dv)); + assert(m->dvsize >= MIN_CHUNK_SIZE); + assert(bin_find(m, m->dv) == 0); + } + + if (m->top != 0) { /* check top chunk */ + do_check_top_chunk(m, m->top); + /*assert(m->topsize == chunksize(m->top)); redundant */ + assert(m->topsize > 0); + assert(bin_find(m, m->top) == 0); + } + + total = traverse_and_check(m); + assert(total <= m->footprint); + assert(m->footprint <= m->max_footprint); +} +#endif /* DEBUG */ + +/* ----------------------------- statistics ------------------------------ */ + +#if !NO_MALLINFO +static struct mallinfo internal_mallinfo(mstate m) { + struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + if (!PREACTION(m)) { + check_malloc_state(m); + if (is_initialized(m)) { + size_t nfree = SIZE_T_ONE; /* top always free */ + size_t mfree = m->topsize + TOP_FOOT_SIZE; + size_t sum = mfree; + msegmentptr s = &m->seg; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + size_t sz = chunksize(q); + sum += sz; + if (!cinuse(q)) { + mfree += sz; + ++nfree; + } + q = next_chunk(q); + } + s = s->next; + } + + nm.arena = sum; + nm.ordblks = nfree; + nm.hblkhd = m->footprint - sum; + nm.usmblks = m->max_footprint; + nm.uordblks = m->footprint - mfree; + nm.fordblks = mfree; + nm.keepcost = m->topsize; + } + + POSTACTION(m); + } + return nm; +} +#endif /* !NO_MALLINFO */ + +static void internal_malloc_stats(mstate m) { + if (!PREACTION(m)) { + size_t maxfp = 0; + size_t fp = 0; + size_t used = 0; + check_malloc_state(m); + if (is_initialized(m)) { + msegmentptr s = &m->seg; + maxfp = m->max_footprint; + fp = m->footprint; + used = fp - (m->topsize + TOP_FOOT_SIZE); + + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + if (!cinuse(q)) + used -= chunksize(q); + q = next_chunk(q); + } + s = s->next; + } + } + + fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); + fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); + fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); + + POSTACTION(m); + } +} + +/* ----------------------- Operations on smallbins ----------------------- */ + +/* + Various forms of linking and unlinking are defined as macros. Even + the ones for trees, which are very long but have very short typical + paths. This is ugly but reduces reliance on inlining support of + compilers. +*/ + +/* Link a free chunk into a smallbin */ +#define insert_small_chunk(M, P, S) {\ + bindex_t I = small_index(S);\ + mchunkptr B = smallbin_at(M, I);\ + mchunkptr F = B;\ + assert(S >= MIN_CHUNK_SIZE);\ + if (!smallmap_is_marked(M, I))\ + mark_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, B->fd)))\ + F = B->fd;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + B->fd = P;\ + F->bk = P;\ + P->fd = F;\ + P->bk = B;\ +} + +/* Unlink a chunk from a smallbin */ +#define unlink_small_chunk(M, P, S) {\ + mchunkptr F = P->fd;\ + mchunkptr B = P->bk;\ + bindex_t I = small_index(S);\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (F == B)\ + clear_smallmap(M, I);\ + else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ + (B == smallbin_at(M,I) || ok_address(M, B)))) {\ + F->bk = B;\ + B->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ +} + +/* Unlink the first chunk from a smallbin */ +#define unlink_first_small_chunk(M, B, P, I) {\ + mchunkptr F = P->fd;\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (B == F)\ + clear_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, F))) {\ + B->fd = F;\ + F->bk = B;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ +} + +/* Replace dv node, binning the old one */ +/* Used only when dvsize known to be small */ +#define replace_dv(M, P, S) {\ + size_t DVS = M->dvsize;\ + if (DVS != 0) {\ + mchunkptr DV = M->dv;\ + assert(is_small(DVS));\ + insert_small_chunk(M, DV, DVS);\ + }\ + M->dvsize = S;\ + M->dv = P;\ +} + +/* ------------------------- Operations on trees ------------------------- */ + +/* Insert chunk into tree */ +#define insert_large_chunk(M, X, S) {\ + tbinptr* H;\ + bindex_t I;\ + compute_tree_index(S, I);\ + H = treebin_at(M, I);\ + X->index = I;\ + X->child[0] = X->child[1] = 0;\ + if (!treemap_is_marked(M, I)) {\ + mark_treemap(M, I);\ + *H = X;\ + X->parent = (tchunkptr)H;\ + X->fd = X->bk = X;\ + }\ + else {\ + tchunkptr T = *H;\ + size_t K = S << leftshift_for_tree_index(I);\ + for (;;) {\ + if (chunksize(T) != S) {\ + tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ + K <<= 1;\ + if (*C != 0)\ + T = *C;\ + else if (RTCHECK(ok_address(M, C))) {\ + *C = X;\ + X->parent = T;\ + X->fd = X->bk = X;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ + }\ + }\ + else {\ + tchunkptr F = T->fd;\ + if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ + T->fd = F->bk = X;\ + X->fd = F;\ + X->bk = T;\ + X->parent = 0;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ + }\ + }\ + }\ + }\ +} + +/* + Unlink steps: + + 1. If x is a chained node, unlink it from its same-sized fd/bk links + and choose its bk node as its replacement. + 2. If x was the last node of its size, but not a leaf node, it must + be replaced with a leaf node (not merely one with an open left or + right), to make sure that lefts and rights of descendents + correspond properly to bit masks. We use the rightmost descendent + of x. We could use any other leaf, but this is easy to locate and + tends to counteract removal of leftmosts elsewhere, and so keeps + paths shorter than minimally guaranteed. This doesn't loop much + because on average a node in a tree is near the bottom. + 3. If x is the base of a chain (i.e., has parent links) relink + x's parent and children to x's replacement (or null if none). +*/ + +#define unlink_large_chunk(M, X) {\ + tchunkptr XP = X->parent;\ + tchunkptr R;\ + if (X->bk != X) {\ + tchunkptr F = X->fd;\ + R = X->bk;\ + if (RTCHECK(ok_address(M, F))) {\ + F->bk = R;\ + R->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else {\ + tchunkptr* RP;\ + if (((R = *(RP = &(X->child[1]))) != 0) ||\ + ((R = *(RP = &(X->child[0]))) != 0)) {\ + tchunkptr* CP;\ + while ((*(CP = &(R->child[1])) != 0) ||\ + (*(CP = &(R->child[0])) != 0)) {\ + R = *(RP = CP);\ + }\ + if (RTCHECK(ok_address(M, RP)))\ + *RP = 0;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + }\ + if (XP != 0) {\ + tbinptr* H = treebin_at(M, X->index);\ + if (X == *H) {\ + if ((*H = R) == 0) \ + clear_treemap(M, X->index);\ + }\ + else if (RTCHECK(ok_address(M, XP))) {\ + if (XP->child[0] == X) \ + XP->child[0] = R;\ + else \ + XP->child[1] = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + if (R != 0) {\ + if (RTCHECK(ok_address(M, R))) {\ + tchunkptr C0, C1;\ + R->parent = XP;\ + if ((C0 = X->child[0]) != 0) {\ + if (RTCHECK(ok_address(M, C0))) {\ + R->child[0] = C0;\ + C0->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + if ((C1 = X->child[1]) != 0) {\ + if (RTCHECK(ok_address(M, C1))) {\ + R->child[1] = C1;\ + C1->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ +} + +/* Relays to large vs small bin operations */ + +#define insert_chunk(M, P, S)\ + if (is_small(S)) insert_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } + +#define unlink_chunk(M, P, S)\ + if (is_small(S)) unlink_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } + + +/* Relays to internal calls to malloc/free from realloc, memalign etc */ + +#if ONLY_MSPACES +#define internal_malloc(m, b) mspace_malloc(m, b) +#define internal_free(m, mem) mspace_free(m,mem); +#else /* ONLY_MSPACES */ +#if MSPACES +#define internal_malloc(m, b)\ + (m == gm)? dlmalloc(b) : mspace_malloc(m, b) +#define internal_free(m, mem)\ + if (m == gm) dlfree(mem); else mspace_free(m,mem); +#else /* MSPACES */ +#define internal_malloc(m, b) dlmalloc(b) +#define internal_free(m, mem) dlfree(mem) +#endif /* MSPACES */ +#endif /* ONLY_MSPACES */ + +/* ----------------------- Direct-mmapping chunks ----------------------- */ + +/* + Directly mmapped chunks are set up with an offset to the start of + the mmapped region stored in the prev_foot field of the chunk. This + allows reconstruction of the required argument to MUNMAP when freed, + and also allows adjustment of the returned chunk to meet alignment + requirements (especially in memalign). There is also enough space + allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain + the PINUSE bit so frees can be checked. +*/ + +/* Malloc using mmap */ +static void* mmap_alloc(mstate m, size_t nb) { + size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + if (mmsize > nb) { /* Check for wrap around 0 */ + char* mm = (char*)(DIRECT_MMAP(mmsize)); + if (mm != CMFAIL) { + size_t offset = align_offset(chunk2mem(mm)); + size_t psize = mmsize - offset - MMAP_FOOT_PAD; + mchunkptr p = (mchunkptr)(mm + offset); + p->prev_foot = offset | IS_MMAPPED_BIT; + (p)->head = (psize|CINUSE_BIT); + mark_inuse_foot(m, p, psize); + chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; + + if (mm < m->least_addr) + m->least_addr = mm; + if ((m->footprint += mmsize) > m->max_footprint) + m->max_footprint = m->footprint; + assert(is_aligned(chunk2mem(p))); + check_mmapped_chunk(m, p); + return chunk2mem(p); + } + } + return 0; +} + +/* Realloc using mmap */ +static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { + size_t oldsize = chunksize(oldp); + if (is_small(nb)) /* Can't shrink mmap regions below small size */ + return 0; + /* Keep old chunk if big enough but not too big */ + if (oldsize >= nb + SIZE_T_SIZE && + (oldsize - nb) <= (mparams.granularity << 1)) + return oldp; + else { + size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; + size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; + size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + char* cp = (char*)CALL_MREMAP((char*)oldp - offset, + oldmmsize, newmmsize, 1); + if (cp != CMFAIL) { + mchunkptr newp = (mchunkptr)(cp + offset); + size_t psize = newmmsize - offset - MMAP_FOOT_PAD; + newp->head = (psize|CINUSE_BIT); + mark_inuse_foot(m, newp, psize); + chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; + + if (cp < m->least_addr) + m->least_addr = cp; + if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) + m->max_footprint = m->footprint; + check_mmapped_chunk(m, newp); + return newp; + } + } + return 0; +} + +/* -------------------------- mspace management -------------------------- */ + +/* Initialize top chunk and its size */ +static void init_top(mstate m, mchunkptr p, size_t psize) { + /* Ensure alignment */ + size_t offset = align_offset(chunk2mem(p)); + p = (mchunkptr)((char*)p + offset); + psize -= offset; + + m->top = p; + m->topsize = psize; + p->head = psize | PINUSE_BIT; + /* set size of fake trailing chunk holding overhead space only once */ + chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; + m->trim_check = mparams.trim_threshold; /* reset on each update */ +} + +/* Initialize bins for a new mstate that is otherwise zeroed out */ +static void init_bins(mstate m) { + /* Establish circular links for smallbins */ + bindex_t i; + for (i = 0; i < NSMALLBINS; ++i) { + sbinptr bin = smallbin_at(m,i); + bin->fd = bin->bk = bin; + } +} + +#if PROCEED_ON_ERROR + +/* default corruption action */ +static void reset_on_error(mstate m) { + int i; + ++malloc_corruption_error_count; + /* Reinitialize fields to forget about all memory */ + m->smallbins = m->treebins = 0; + m->dvsize = m->topsize = 0; + m->seg.base = 0; + m->seg.size = 0; + m->seg.next = 0; + m->top = m->dv = 0; + for (i = 0; i < NTREEBINS; ++i) + *treebin_at(m, i) = 0; + init_bins(m); +} +#endif /* PROCEED_ON_ERROR */ + +/* Allocate chunk and prepend remainder with chunk in successor base. */ +static void* prepend_alloc(mstate m, char* newbase, char* oldbase, + size_t nb) { + mchunkptr p = align_as_chunk(newbase); + mchunkptr oldfirst = align_as_chunk(oldbase); + size_t psize = (char*)oldfirst - (char*)p; + mchunkptr q = chunk_plus_offset(p, nb); + size_t qsize = psize - nb; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + + assert((char*)oldfirst > (char*)q); + assert(pinuse(oldfirst)); + assert(qsize >= MIN_CHUNK_SIZE); + + /* consolidate remainder with first chunk of old base */ + if (oldfirst == m->top) { + size_t tsize = m->topsize += qsize; + m->top = q; + q->head = tsize | PINUSE_BIT; + check_top_chunk(m, q); + } + else if (oldfirst == m->dv) { + size_t dsize = m->dvsize += qsize; + m->dv = q; + set_size_and_pinuse_of_free_chunk(q, dsize); + } + else { + if (!cinuse(oldfirst)) { + size_t nsize = chunksize(oldfirst); + unlink_chunk(m, oldfirst, nsize); + oldfirst = chunk_plus_offset(oldfirst, nsize); + qsize += nsize; + } + set_free_with_pinuse(q, qsize, oldfirst); + insert_chunk(m, q, qsize); + check_free_chunk(m, q); + } + + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); +} + +/* Add a segment to hold a new noncontiguous region */ +static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { + /* Determine locations and sizes of segment, fenceposts, old top */ + char* old_top = (char*)m->top; + msegmentptr oldsp = segment_holding(m, old_top); + char* old_end = oldsp->base + oldsp->size; + size_t ssize = pad_request(sizeof(struct malloc_segment)); + char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + size_t offset = align_offset(chunk2mem(rawsp)); + char* asp = rawsp + offset; + char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; + mchunkptr sp = (mchunkptr)csp; + msegmentptr ss = (msegmentptr)(chunk2mem(sp)); + mchunkptr tnext = chunk_plus_offset(sp, ssize); + mchunkptr p = tnext; + int nfences = 0; + + /* reset top to new space */ + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + + /* Set up segment record */ + assert(is_aligned(ss)); + set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); + *ss = m->seg; /* Push current record */ + m->seg.base = tbase; + m->seg.size = tsize; + m->seg.sflags = mmapped; + m->seg.next = ss; + + /* Insert trailing fenceposts */ + for (;;) { + mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); + p->head = FENCEPOST_HEAD; + ++nfences; + if ((char*)(&(nextp->head)) < old_end) + p = nextp; + else + break; + } + assert(nfences >= 2); + + /* Insert the rest of old top into a bin as an ordinary free chunk */ + if (csp != old_top) { + mchunkptr q = (mchunkptr)old_top; + size_t psize = csp - old_top; + mchunkptr tn = chunk_plus_offset(q, psize); + set_free_with_pinuse(q, psize, tn); + insert_chunk(m, q, psize); + } + + check_top_chunk(m, m->top); +} + +/* -------------------------- System allocation -------------------------- */ + +/* Get memory from system using MORECORE or MMAP */ +static void* sys_alloc(mstate m, size_t nb) { + char* tbase = CMFAIL; + size_t tsize = 0; + flag_t mmap_flag = 0; + + init_mparams(); + + /* Directly map large chunks */ + if (use_mmap(m) && nb >= mparams.mmap_threshold) { + void* mem = mmap_alloc(m, nb); + if (mem != 0) + return mem; + } + + /* + Try getting memory in any of three ways (in most-preferred to + least-preferred order): + 1. A call to MORECORE that can normally contiguously extend memory. + (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or + or main space is mmapped or a previous contiguous call failed) + 2. A call to MMAP new space (disabled if not HAVE_MMAP). + Note that under the default settings, if MORECORE is unable to + fulfill a request, and HAVE_MMAP is true, then mmap is + used as a noncontiguous system allocator. This is a useful backup + strategy for systems with holes in address spaces -- in this case + sbrk cannot contiguously expand the heap, but mmap may be able to + find space. + 3. A call to MORECORE that cannot usually contiguously extend memory. + (disabled if not HAVE_MORECORE) + */ + + if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { + char* br = CMFAIL; + msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); + size_t asize = 0; + ACQUIRE_MORECORE_LOCK(); + + if (ss == 0) { /* First time through or recovery */ + char* base = (char*)CALL_MORECORE(0); + if (base != CMFAIL) { + asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); + /* Adjust to end on a page boundary */ + if (!is_page_aligned(base)) + asize += (page_align((size_t)base) - (size_t)base); + /* Can't call MORECORE if size is negative when treated as signed */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == base) { + tbase = base; + tsize = asize; + } + } + } + else { + /* Subtract out existing available top space from MORECORE request. */ + asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); + /* Use mem here only if it did continuously extend old space */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { + tbase = br; + tsize = asize; + } + } + + if (tbase == CMFAIL) { /* Cope with partial failure */ + if (br != CMFAIL) { /* Try to use/extend the space we did get */ + if (asize < HALF_MAX_SIZE_T && + asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { + size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); + if (esize < HALF_MAX_SIZE_T) { + char* end = (char*)CALL_MORECORE(esize); + if (end != CMFAIL) + asize += esize; + else { /* Can't use; try to release */ + (void) CALL_MORECORE(-asize); + br = CMFAIL; + } + } + } + } + if (br != CMFAIL) { /* Use the space we did get */ + tbase = br; + tsize = asize; + } + else + disable_contiguous(m); /* Don't try contiguous path in the future */ + } + + RELEASE_MORECORE_LOCK(); + } + + if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ + size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; + size_t rsize = granularity_align(req); + if (rsize > nb) { /* Fail if wraps around zero */ + char* mp = (char*)(CALL_MMAP(rsize)); + if (mp != CMFAIL) { + tbase = mp; + tsize = rsize; + mmap_flag = IS_MMAPPED_BIT; + } + } + } + + if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ + size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); + if (asize < HALF_MAX_SIZE_T) { + char* br = CMFAIL; + char* end = CMFAIL; + ACQUIRE_MORECORE_LOCK(); + br = (char*)(CALL_MORECORE(asize)); + end = (char*)(CALL_MORECORE(0)); + RELEASE_MORECORE_LOCK(); + if (br != CMFAIL && end != CMFAIL && br < end) { + size_t ssize = end - br; + if (ssize > nb + TOP_FOOT_SIZE) { + tbase = br; + tsize = ssize; + } + } + } + } + + if (tbase != CMFAIL) { + + if ((m->footprint += tsize) > m->max_footprint) + m->max_footprint = m->footprint; + + if (!is_initialized(m)) { /* first-time initialization */ + m->seg.base = m->least_addr = tbase; + m->seg.size = tsize; + m->seg.sflags = mmap_flag; + m->magic = mparams.magic; + m->release_checks = MAX_RELEASE_CHECK_RATE; + init_bins(m); +#if !ONLY_MSPACES + if (is_global(m)) + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + else +#endif + { + /* Offset top by embedded malloc_state */ + mchunkptr mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); + } + } + + else { + /* Try to merge with an existing segment */ + msegmentptr sp = &m->seg; + /* Only consider most recent segment if traversal suppressed */ + while (sp != 0 && tbase != sp->base + sp->size) + sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + (sp->sflags & IS_MMAPPED_BIT) == mmap_flag && + segment_holds(sp, m->top)) { /* append */ + sp->size += tsize; + init_top(m, m->top, m->topsize + tsize); + } + else { + if (tbase < m->least_addr) + m->least_addr = tbase; + sp = &m->seg; + while (sp != 0 && sp->base != tbase + tsize) + sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + (sp->sflags & IS_MMAPPED_BIT) == mmap_flag) { + char* oldbase = sp->base; + sp->base = tbase; + sp->size += tsize; + return prepend_alloc(m, tbase, oldbase, nb); + } + else + add_segment(m, tbase, tsize, mmap_flag); + } + } + + if (nb < m->topsize) { /* Allocate from new or extended top space */ + size_t rsize = m->topsize -= nb; + mchunkptr p = m->top; + mchunkptr r = m->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + check_top_chunk(m, m->top); + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); + } + } + + MALLOC_FAILURE_ACTION; + return 0; +} + +/* ----------------------- system deallocation -------------------------- */ + +/* Unmap and unlink any mmapped segments that don't contain used chunks */ +static size_t release_unused_segments(mstate m) { + size_t released = 0; + int nsegs = 0; + msegmentptr pred = &m->seg; + msegmentptr sp = pred->next; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + msegmentptr next = sp->next; + ++nsegs; + if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { + mchunkptr p = align_as_chunk(base); + size_t psize = chunksize(p); + /* Can unmap if first chunk holds entire segment and not pinned */ + if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { + tchunkptr tp = (tchunkptr)p; + assert(segment_holds(sp, (char*)sp)); + if (p == m->dv) { + m->dv = 0; + m->dvsize = 0; + } + else { + unlink_large_chunk(m, tp); + } + if (CALL_MUNMAP(base, size) == 0) { + released += size; + m->footprint -= size; + /* unlink obsoleted record */ + sp = pred; + sp->next = next; + } + else { /* back out if cannot unmap */ + insert_large_chunk(m, tp, psize); + } + } + } + if (NO_SEGMENT_TRAVERSAL) /* scan only first segment */ + break; + pred = sp; + sp = next; + } + /* Reset check counter */ + m->release_checks = ((nsegs > MAX_RELEASE_CHECK_RATE)? + nsegs : MAX_RELEASE_CHECK_RATE); + return released; +} + +static int sys_trim(mstate m, size_t pad) { + size_t released = 0; + if (pad < MAX_REQUEST && is_initialized(m)) { + pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ + + if (m->topsize > pad) { + /* Shrink top space in granularity-size units, keeping at least one */ + size_t unit = mparams.granularity; + size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - + SIZE_T_ONE) * unit; + msegmentptr sp = segment_holding(m, (char*)m->top); + + if (!is_extern_segment(sp)) { + if (is_mmapped_segment(sp)) { + if (HAVE_MMAP && + sp->size >= extra && + !has_segment_link(m, sp)) { /* can't shrink if pinned */ + size_t newsize = sp->size - extra; + /* Prefer mremap, fall back to munmap */ + if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || + (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { + released = extra; + } + } + } + else if (HAVE_MORECORE) { + if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ + extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; + ACQUIRE_MORECORE_LOCK(); + { + /* Make sure end of memory is where we last set it. */ + char* old_br = (char*)(CALL_MORECORE(0)); + if (old_br == sp->base + sp->size) { + char* rel_br = (char*)(CALL_MORECORE(-extra)); + char* new_br = (char*)(CALL_MORECORE(0)); + if (rel_br != CMFAIL && new_br < old_br) + released = old_br - new_br; + } + } + RELEASE_MORECORE_LOCK(); + } + } + + if (released != 0) { + sp->size -= released; + m->footprint -= released; + init_top(m, m->top, m->topsize - released); + check_top_chunk(m, m->top); + } + } + + /* Unmap any unused mmapped segments */ + if (HAVE_MMAP) + released += release_unused_segments(m); + + /* On failure, disable autotrim to avoid repeated failed future calls */ + if (released == 0 && m->topsize > m->trim_check) + m->trim_check = MAX_SIZE_T; + } + + return (released != 0)? 1 : 0; +} + +/* ---------------------------- malloc support --------------------------- */ + +/* allocate a large request from the best fitting chunk in a treebin */ +static void* tmalloc_large(mstate m, size_t nb) { + tchunkptr v = 0; + size_t rsize = -nb; /* Unsigned negation */ + tchunkptr t; + bindex_t idx; + compute_tree_index(nb, idx); + + if ((t = *treebin_at(m, idx)) != 0) { + /* Traverse tree for this bin looking for node with size == nb */ + size_t sizebits = nb << leftshift_for_tree_index(idx); + tchunkptr rst = 0; /* The deepest untaken right subtree */ + for (;;) { + tchunkptr rt; + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + v = t; + if ((rsize = trem) == 0) + break; + } + rt = t->child[1]; + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + if (rt != 0 && rt != t) + rst = rt; + if (t == 0) { + t = rst; /* set t to least subtree holding sizes > nb */ + break; + } + sizebits <<= 1; + } + } + + if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ + binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; + if (leftbits != 0) { + bindex_t i; + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + t = *treebin_at(m, i); + } + } + + while (t != 0) { /* find smallest of tree or subtree */ + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + t = leftmost_child(t); + } + + /* If dv is a better fit, return 0 so malloc will use it */ + if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { + if (RTCHECK(ok_address(m, v))) { /* split */ + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + insert_chunk(m, r, rsize); + } + return chunk2mem(v); + } + } + CORRUPTION_ERROR_ACTION(m); + } + return 0; +} + +/* allocate a small request from the best fitting chunk in a treebin */ +static void* tmalloc_small(mstate m, size_t nb) { + tchunkptr t, v; + size_t rsize; + bindex_t i; + binmap_t leastbit = least_bit(m->treemap); + compute_bit2idx(leastbit, i); + + v = t = *treebin_at(m, i); + rsize = chunksize(t) - nb; + + while ((t = leftmost_child(t)) != 0) { + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + } + + if (RTCHECK(ok_address(m, v))) { + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(m, r, rsize); + } + return chunk2mem(v); + } + } + + CORRUPTION_ERROR_ACTION(m); + return 0; +} + +/* --------------------------- realloc support --------------------------- */ + +static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { + if (bytes >= MAX_REQUEST) { + MALLOC_FAILURE_ACTION; + return 0; + } + if (!PREACTION(m)) { + mchunkptr oldp = mem2chunk(oldmem); + size_t oldsize = chunksize(oldp); + mchunkptr next = chunk_plus_offset(oldp, oldsize); + mchunkptr newp = 0; + void* extra = 0; + + /* Try to either shrink or extend into top. Else malloc-copy-free */ + + if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && + ok_next(oldp, next) && ok_pinuse(next))) { + size_t nb = request2size(bytes); + if (is_mmapped(oldp)) + newp = mmap_resize(m, oldp, nb); + else if (oldsize >= nb) { /* already big enough */ + size_t rsize = oldsize - nb; + newp = oldp; + if (rsize >= MIN_CHUNK_SIZE) { + mchunkptr remainder = chunk_plus_offset(newp, nb); + set_inuse(m, newp, nb); + set_inuse(m, remainder, rsize); + extra = chunk2mem(remainder); + } + } + else if (next == m->top && oldsize + m->topsize > nb) { + /* Expand into top */ + size_t newsize = oldsize + m->topsize; + size_t newtopsize = newsize - nb; + mchunkptr newtop = chunk_plus_offset(oldp, nb); + set_inuse(m, oldp, nb); + newtop->head = newtopsize |PINUSE_BIT; + m->top = newtop; + m->topsize = newtopsize; + newp = oldp; + } + } + else { + USAGE_ERROR_ACTION(m, oldmem); + POSTACTION(m); + return 0; + } + + POSTACTION(m); + + if (newp != 0) { + if (extra != 0) { + internal_free(m, extra); + } + check_inuse_chunk(m, newp); + return chunk2mem(newp); + } + else { + void* newmem = internal_malloc(m, bytes); + if (newmem != 0) { + size_t oc = oldsize - overhead_for(oldp); + memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); + internal_free(m, oldmem); + } + return newmem; + } + } + return 0; +} + +/* --------------------------- memalign support -------------------------- */ + +static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { + if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ + return internal_malloc(m, bytes); + if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ + alignment = MIN_CHUNK_SIZE; + if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ + size_t a = MALLOC_ALIGNMENT << 1; + while (a < alignment) a <<= 1; + alignment = a; + } + + if (bytes >= MAX_REQUEST - alignment) { + if (m != 0) { /* Test isn't needed but avoids compiler warning */ + MALLOC_FAILURE_ACTION; + } + } + else { + size_t nb = request2size(bytes); + size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; + char* mem = (char*)internal_malloc(m, req); + if (mem != 0) { + void* leader = 0; + void* trailer = 0; + mchunkptr p = mem2chunk(mem); + + if (PREACTION(m)) return 0; + if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ + /* + Find an aligned spot inside chunk. Since we need to give + back leading space in a chunk of at least MIN_CHUNK_SIZE, if + the first calculation places us at a spot with less than + MIN_CHUNK_SIZE leader, we can move to the next aligned spot. + We've allocated enough total room so that this is always + possible. + */ + char* br = (char*)mem2chunk((size_t)(((size_t)(mem + + alignment - + SIZE_T_ONE)) & + -alignment)); + char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? + br : br+alignment; + mchunkptr newp = (mchunkptr)pos; + size_t leadsize = pos - (char*)(p); + size_t newsize = chunksize(p) - leadsize; + + if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ + newp->prev_foot = p->prev_foot + leadsize; + newp->head = (newsize|CINUSE_BIT); + } + else { /* Otherwise, give back leader, use the rest */ + set_inuse(m, newp, newsize); + set_inuse(m, p, leadsize); + leader = chunk2mem(p); + } + p = newp; + } + + /* Give back spare room at the end */ + if (!is_mmapped(p)) { + size_t size = chunksize(p); + if (size > nb + MIN_CHUNK_SIZE) { + size_t remainder_size = size - nb; + mchunkptr remainder = chunk_plus_offset(p, nb); + set_inuse(m, p, nb); + set_inuse(m, remainder, remainder_size); + trailer = chunk2mem(remainder); + } + } + + assert (chunksize(p) >= nb); + assert((((size_t)(chunk2mem(p))) % alignment) == 0); + check_inuse_chunk(m, p); + POSTACTION(m); + if (leader != 0) { + internal_free(m, leader); + } + if (trailer != 0) { + internal_free(m, trailer); + } + return chunk2mem(p); + } + } + return 0; +} + +/* ------------------------ comalloc/coalloc support --------------------- */ + +static void** ialloc(mstate m, + size_t n_elements, + size_t* sizes, + int opts, + void* chunks[]) { + /* + This provides common support for independent_X routines, handling + all of the combinations that can result. + + The opts arg has: + bit 0 set if all elements are same size (using sizes[0]) + bit 1 set if elements should be zeroed + */ + + size_t element_size; /* chunksize of each element, if all same */ + size_t contents_size; /* total size of elements */ + size_t array_size; /* request size of pointer array */ + void* mem; /* malloced aggregate space */ + mchunkptr p; /* corresponding chunk */ + size_t remainder_size; /* remaining bytes while splitting */ + void** marray; /* either "chunks" or malloced ptr array */ + mchunkptr array_chunk; /* chunk for malloced ptr array */ + flag_t was_enabled; /* to disable mmap */ + size_t size; + size_t i; + + /* compute array length, if needed */ + if (chunks != 0) { + if (n_elements == 0) + return chunks; /* nothing to do */ + marray = chunks; + array_size = 0; + } + else { + /* if empty req, must still return chunk representing empty array */ + if (n_elements == 0) + return (void**)internal_malloc(m, 0); + marray = 0; + array_size = request2size(n_elements * (sizeof(void*))); + } + + /* compute total element size */ + if (opts & 0x1) { /* all-same-size */ + element_size = request2size(*sizes); + contents_size = n_elements * element_size; + } + else { /* add up all the sizes */ + element_size = 0; + contents_size = 0; + for (i = 0; i != n_elements; ++i) + contents_size += request2size(sizes[i]); + } + + size = contents_size + array_size; + + /* + Allocate the aggregate chunk. First disable direct-mmapping so + malloc won't use it, since we would not be able to later + free/realloc space internal to a segregated mmap region. + */ + was_enabled = use_mmap(m); + disable_mmap(m); + mem = internal_malloc(m, size - CHUNK_OVERHEAD); + if (was_enabled) + enable_mmap(m); + if (mem == 0) + return 0; + + if (PREACTION(m)) return 0; + p = mem2chunk(mem); + remainder_size = chunksize(p); + + assert(!is_mmapped(p)); + + if (opts & 0x2) { /* optionally clear the elements */ + memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); + } + + /* If not provided, allocate the pointer array as final part of chunk */ + if (marray == 0) { + size_t array_chunk_size; + array_chunk = chunk_plus_offset(p, contents_size); + array_chunk_size = remainder_size - contents_size; + marray = (void**) (chunk2mem(array_chunk)); + set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); + remainder_size = contents_size; + } + + /* split out elements */ + for (i = 0; ; ++i) { + marray[i] = chunk2mem(p); + if (i != n_elements-1) { + if (element_size != 0) + size = element_size; + else + size = request2size(sizes[i]); + remainder_size -= size; + set_size_and_pinuse_of_inuse_chunk(m, p, size); + p = chunk_plus_offset(p, size); + } + else { /* the final element absorbs any overallocation slop */ + set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); + break; + } + } + +#if DEBUG + if (marray != chunks) { + /* final element must have exactly exhausted chunk */ + if (element_size != 0) { + assert(remainder_size == element_size); + } + else { + assert(remainder_size == request2size(sizes[i])); + } + check_inuse_chunk(m, mem2chunk(marray)); + } + for (i = 0; i != n_elements; ++i) + check_inuse_chunk(m, mem2chunk(marray[i])); + +#endif /* DEBUG */ + + POSTACTION(m); + return marray; +} + + +/* -------------------------- public routines ---------------------------- */ + +#if !ONLY_MSPACES + +void* dlmalloc(size_t bytes) { + /* + Basic algorithm: + If a small request (< 256 bytes minus per-chunk overhead): + 1. If one exists, use a remainderless chunk in associated smallbin. + (Remainderless means that there are too few excess bytes to + represent as a chunk.) + 2. If it is big enough, use the dv chunk, which is normally the + chunk adjacent to the one used for the most recent small request. + 3. If one exists, split the smallest available chunk in a bin, + saving remainder in dv. + 4. If it is big enough, use the top chunk. + 5. If available, get memory from system and use it + Otherwise, for a large request: + 1. Find the smallest available binned chunk that fits, and use it + if it is better fitting than dv chunk, splitting if necessary. + 2. If better fitting than any binned chunk, use the dv chunk. + 3. If it is big enough, use the top chunk. + 4. If request size >= mmap threshold, try to directly mmap this chunk. + 5. If available, get memory from system and use it + + The ugly goto's here ensure that postaction occurs along all paths. + */ + + if (!PREACTION(gm)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = gm->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(gm, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(gm, b, p, idx); + set_inuse_and_pinuse(gm, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb > gm->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(gm, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(gm, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(gm, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(gm, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + + if (nb <= gm->dvsize) { + size_t rsize = gm->dvsize - nb; + mchunkptr p = gm->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = gm->dv = chunk_plus_offset(p, nb); + gm->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + } + else { /* exhaust dv */ + size_t dvs = gm->dvsize; + gm->dvsize = 0; + gm->dv = 0; + set_inuse_and_pinuse(gm, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb < gm->topsize) { /* Split top */ + size_t rsize = gm->topsize -= nb; + mchunkptr p = gm->top; + mchunkptr r = gm->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + mem = chunk2mem(p); + check_top_chunk(gm, gm->top); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + mem = sys_alloc(gm, nb); + + postaction: + POSTACTION(gm); + return mem; + } + + return 0; +} + +void dlfree(void* mem) { + /* + Consolidate freed chunks with preceeding or succeeding bordering + free chunks, if they exist, and then place in a bin. Intermixed + with special cases for top, dv, mmapped chunks, and usage errors. + */ + + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } +#else /* FOOTERS */ +#define fm gm +#endif /* FOOTERS */ + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if ((prevsize & IS_MMAPPED_BIT) != 0) { + prevsize &= ~IS_MMAPPED_BIT; + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + + if (is_small(psize)) { + insert_small_chunk(fm, p, psize); + check_free_chunk(fm, p); + } + else { + tchunkptr tp = (tchunkptr)p; + insert_large_chunk(fm, tp, psize); + check_free_chunk(fm, p); + if (--fm->release_checks == 0) + release_unused_segments(fm); + } + goto postaction; + } + } + erroraction: + USAGE_ERROR_ACTION(fm, p); + postaction: + POSTACTION(fm); + } + } +#if !FOOTERS +#undef fm +#endif /* FOOTERS */ +} + +void* dlcalloc(size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = dlmalloc(req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* dlrealloc(void* oldmem, size_t bytes) { + if (oldmem == 0) + return dlmalloc(bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + dlfree(oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if ! FOOTERS + mstate m = gm; +#else /* FOOTERS */ + mstate m = get_mstate_for(mem2chunk(oldmem)); + if (!ok_magic(m)) { + USAGE_ERROR_ACTION(m, oldmem); + return 0; + } +#endif /* FOOTERS */ + return internal_realloc(m, oldmem, bytes); + } +} + +void* dlmemalign(size_t alignment, size_t bytes) { + return internal_memalign(gm, alignment, bytes); +} + +void** dlindependent_calloc(size_t n_elements, size_t elem_size, + void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + return ialloc(gm, n_elements, &sz, 3, chunks); +} + +void** dlindependent_comalloc(size_t n_elements, size_t sizes[], + void* chunks[]) { + return ialloc(gm, n_elements, sizes, 0, chunks); +} + +void* dlvalloc(size_t bytes) { + size_t pagesz; + init_mparams(); + pagesz = mparams.page_size; + return dlmemalign(pagesz, bytes); +} + +void* dlpvalloc(size_t bytes) { + size_t pagesz; + init_mparams(); + pagesz = mparams.page_size; + return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); +} + +int dlmalloc_trim(size_t pad) { + int result = 0; + if (!PREACTION(gm)) { + result = sys_trim(gm, pad); + POSTACTION(gm); + } + return result; +} + +size_t dlmalloc_footprint(void) { + return gm->footprint; +} + +size_t dlmalloc_max_footprint(void) { + return gm->max_footprint; +} + +#if !NO_MALLINFO +struct mallinfo dlmallinfo(void) { + return internal_mallinfo(gm); +} +#endif /* NO_MALLINFO */ + +void dlmalloc_stats() { + internal_malloc_stats(gm); +} + +size_t dlmalloc_usable_size(void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + if (cinuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; +} + +int dlmallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* !ONLY_MSPACES */ + +/* ----------------------------- user mspaces ---------------------------- */ + +#if MSPACES + +static mstate init_user_mstate(char* tbase, size_t tsize) { + size_t msize = pad_request(sizeof(struct malloc_state)); + mchunkptr mn; + mchunkptr msp = align_as_chunk(tbase); + mstate m = (mstate)(chunk2mem(msp)); + memset(m, 0, msize); + INITIAL_LOCK(&m->mutex); + msp->head = (msize|PINUSE_BIT|CINUSE_BIT); + m->seg.base = m->least_addr = tbase; + m->seg.size = m->footprint = m->max_footprint = tsize; + m->magic = mparams.magic; + m->release_checks = MAX_RELEASE_CHECK_RATE; + m->mflags = mparams.default_mflags; + m->extp = 0; + m->exts = 0; + disable_contiguous(m); + init_bins(m); + mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); + check_top_chunk(m, m->top); + return m; +} + +mspace create_mspace(size_t capacity, int locked) { + mstate m = 0; + size_t msize = pad_request(sizeof(struct malloc_state)); + init_mparams(); /* Ensure pagesize etc initialized */ + + if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + size_t rs = ((capacity == 0)? mparams.granularity : + (capacity + TOP_FOOT_SIZE + msize)); + size_t tsize = granularity_align(rs); + char* tbase = (char*)(CALL_MMAP(tsize)); + if (tbase != CMFAIL) { + m = init_user_mstate(tbase, tsize); + m->seg.sflags = IS_MMAPPED_BIT; + set_lock(m, locked); + } + } + return (mspace)m; +} + +mspace create_mspace_with_base(void* base, size_t capacity, int locked) { + mstate m = 0; + size_t msize = pad_request(sizeof(struct malloc_state)); + init_mparams(); /* Ensure pagesize etc initialized */ + + if (capacity > msize + TOP_FOOT_SIZE && + capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + m = init_user_mstate((char*)base, capacity); + m->seg.sflags = EXTERN_BIT; + set_lock(m, locked); + } + return (mspace)m; +} + +size_t destroy_mspace(mspace msp) { + size_t freed = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + msegmentptr sp = &ms->seg; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + flag_t flag = sp->sflags; + sp = sp->next; + if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && + CALL_MUNMAP(base, size) == 0) + freed += size; + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return freed; +} + +/* + mspace versions of routines are near-clones of the global + versions. This is not so nice but better than the alternatives. +*/ + + +void* mspace_malloc(mspace msp, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (!PREACTION(ms)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = ms->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(ms, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(ms, b, p, idx); + set_inuse_and_pinuse(ms, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb > ms->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(ms, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(ms, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(ms, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(ms, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + + if (nb <= ms->dvsize) { + size_t rsize = ms->dvsize - nb; + mchunkptr p = ms->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = ms->dv = chunk_plus_offset(p, nb); + ms->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + } + else { /* exhaust dv */ + size_t dvs = ms->dvsize; + ms->dvsize = 0; + ms->dv = 0; + set_inuse_and_pinuse(ms, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb < ms->topsize) { /* Split top */ + size_t rsize = ms->topsize -= nb; + mchunkptr p = ms->top; + mchunkptr r = ms->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + mem = chunk2mem(p); + check_top_chunk(ms, ms->top); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + mem = sys_alloc(ms, nb); + + postaction: + POSTACTION(ms); + return mem; + } + + return 0; +} + +void mspace_free(mspace msp, void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); +#else /* FOOTERS */ + mstate fm = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if ((prevsize & IS_MMAPPED_BIT) != 0) { + prevsize &= ~IS_MMAPPED_BIT; + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + + if (is_small(psize)) { + insert_small_chunk(fm, p, psize); + check_free_chunk(fm, p); + } + else { + tchunkptr tp = (tchunkptr)p; + insert_large_chunk(fm, tp, psize); + check_free_chunk(fm, p); + if (--fm->release_checks == 0) + release_unused_segments(fm); + } + goto postaction; + } + } + erroraction: + USAGE_ERROR_ACTION(fm, p); + postaction: + POSTACTION(fm); + } + } +} + +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = internal_malloc(ms, req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { + if (oldmem == 0) + return mspace_malloc(msp, bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + mspace_free(msp, oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if FOOTERS + mchunkptr p = mem2chunk(oldmem); + mstate ms = get_mstate_for(p); +#else /* FOOTERS */ + mstate ms = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_realloc(ms, oldmem, bytes); + } +} + +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_memalign(ms, alignment, bytes); +} + +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, &sz, 3, chunks); +} + +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, sizes, 0, chunks); +} + +int mspace_trim(mspace msp, size_t pad) { + int result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + if (!PREACTION(ms)) { + result = sys_trim(ms, pad); + POSTACTION(ms); + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + +void mspace_malloc_stats(mspace msp) { + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + internal_malloc_stats(ms); + } + else { + USAGE_ERROR_ACTION(ms,ms); + } +} + +size_t mspace_footprint(mspace msp) { + size_t result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->footprint; + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + + +size_t mspace_max_footprint(mspace msp) { + size_t result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->max_footprint; + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + + +#if !NO_MALLINFO +struct mallinfo mspace_mallinfo(mspace msp) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + } + return internal_mallinfo(ms); +} +#endif /* NO_MALLINFO */ + +size_t mspace_usable_size(void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + if (cinuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; +} + +int mspace_mallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* MSPACES */ + +/* -------------------- Alternative MORECORE functions ------------------- */ + +/* + Guidelines for creating a custom version of MORECORE: + + * For best performance, MORECORE should allocate in multiples of pagesize. + * MORECORE may allocate more memory than requested. (Or even less, + but this will usually result in a malloc failure.) + * MORECORE must not allocate memory when given argument zero, but + instead return one past the end address of memory from previous + nonzero call. + * For best performance, consecutive calls to MORECORE with positive + arguments should return increasing addresses, indicating that + space has been contiguously extended. + * Even though consecutive calls to MORECORE need not return contiguous + addresses, it must be OK for malloc'ed chunks to span multiple + regions in those cases where they do happen to be contiguous. + * MORECORE need not handle negative arguments -- it may instead + just return MFAIL when given negative arguments. + Negative arguments are always multiples of pagesize. MORECORE + must not misinterpret negative args as large positive unsigned + args. You can suppress all such calls from even occurring by defining + MORECORE_CANNOT_TRIM, + + As an example alternative MORECORE, here is a custom allocator + kindly contributed for pre-OSX macOS. It uses virtually but not + necessarily physically contiguous non-paged memory (locked in, + present and won't get swapped out). You can use it by uncommenting + this section, adding some #includes, and setting up the appropriate + defines above: + + #define MORECORE osMoreCore + + There is also a shutdown routine that should somehow be called for + cleanup upon program exit. + + #define MAX_POOL_ENTRIES 100 + #define MINIMUM_MORECORE_SIZE (64 * 1024U) + static int next_os_pool; + void *our_os_pools[MAX_POOL_ENTRIES]; + + void *osMoreCore(int size) + { + void *ptr = 0; + static void *sbrk_top = 0; + + if (size > 0) + { + if (size < MINIMUM_MORECORE_SIZE) + size = MINIMUM_MORECORE_SIZE; + if (CurrentExecutionLevel() == kTaskLevel) + ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); + if (ptr == 0) + { + return (void *) MFAIL; + } + // save ptrs so they can be freed during cleanup + our_os_pools[next_os_pool] = ptr; + next_os_pool++; + ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); + sbrk_top = (char *) ptr + size; + return ptr; + } + else if (size < 0) + { + // we don't currently support shrink behavior + return (void *) MFAIL; + } + else + { + return sbrk_top; + } + } + + // cleanup any allocated memory pools + // called as last thing before shutting down driver + + void osCleanupMem(void) + { + void **ptr; + + for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) + if (*ptr) + { + PoolDeallocate(*ptr); + *ptr = 0; + } + } + +*/ + + +/* ----------------------------------------------------------------------- +History: + V2.8.4 (not yet released) + * Fix bad error check in mspace_footprint + * Adaptations for ptmalloc, courtesy of Wolfram Gloger. + * Reentrant spin locks, courtesy of Earl Chew and others + * Win32 improvements, courtesy of Niall Douglas and Earl Chew + * Add NO_SEGMENT_TRAVERSAL and MAX_RELEASE_CHECK_RATE options + * Various small adjustments to reduce warnings on some compilers + * Extension hook in malloc_state + + V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) + * Add max_footprint functions + * Ensure all appropriate literals are size_t + * Fix conditional compilation problem for some #define settings + * Avoid concatenating segments with the one provided + in create_mspace_with_base + * Rename some variables to avoid compiler shadowing warnings + * Use explicit lock initialization. + * Better handling of sbrk interference. + * Simplify and fix segment insertion, trimming and mspace_destroy + * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x + * Thanks especially to Dennis Flanagan for help on these. + + V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) + * Fix memalign brace error. + + V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) + * Fix improper #endif nesting in C++ + * Add explicit casts needed for C++ + + V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) + * Use trees for large bins + * Support mspaces + * Use segments to unify sbrk-based and mmap-based system allocation, + removing need for emulation on most platforms without sbrk. + * Default safety checks + * Optional footer checks. Thanks to William Robertson for the idea. + * Internal code refactoring + * Incorporate suggestions and platform-specific changes. + Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, + Aaron Bachmann, Emery Berger, and others. + * Speed up non-fastbin processing enough to remove fastbins. + * Remove useless cfree() to avoid conflicts with other apps. + * Remove internal memcpy, memset. Compilers handle builtins better. + * Remove some options that no one ever used and rename others. + + V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) + * Fix malloc_state bitmap array misdeclaration + + V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) + * Allow tuning of FIRST_SORTED_BIN_SIZE + * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. + * Better detection and support for non-contiguousness of MORECORE. + Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger + * Bypass most of malloc if no frees. Thanks To Emery Berger. + * Fix freeing of old top non-contiguous chunk im sysmalloc. + * Raised default trim and map thresholds to 256K. + * Fix mmap-related #defines. Thanks to Lubos Lunak. + * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. + * Branch-free bin calculation + * Default trim and mmap thresholds now 256K. + + V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) + * Introduce independent_comalloc and independent_calloc. + Thanks to Michael Pachos for motivation and help. + * Make optional .h file available + * Allow > 2GB requests on 32bit systems. + * new WIN32 sbrk, mmap, munmap, lock code from . + Thanks also to Andreas Mueller , + and Anonymous. + * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for + helping test this.) + * memalign: check alignment arg + * realloc: don't try to shift chunks backwards, since this + leads to more fragmentation in some programs and doesn't + seem to help in any others. + * Collect all cases in malloc requiring system memory into sysmalloc + * Use mmap as backup to sbrk + * Place all internal state in malloc_state + * Introduce fastbins (although similar to 2.5.1) + * Many minor tunings and cosmetic improvements + * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK + * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS + Thanks to Tony E. Bennett and others. + * Include errno.h to support default failure action. + + V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) + * return null for negative arguments + * Added Several WIN32 cleanups from Martin C. Fong + * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' + (e.g. WIN32 platforms) + * Cleanup header file inclusion for WIN32 platforms + * Cleanup code to avoid Microsoft Visual C++ compiler complaints + * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing + memory allocation routines + * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) + * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to + usage of 'assert' in non-WIN32 code + * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to + avoid infinite loop + * Always call 'fREe()' rather than 'free()' + + V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) + * Fixed ordering problem with boundary-stamping + + V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) + * Added pvalloc, as recommended by H.J. Liu + * Added 64bit pointer support mainly from Wolfram Gloger + * Added anonymously donated WIN32 sbrk emulation + * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen + * malloc_extend_top: fix mask error that caused wastage after + foreign sbrks + * Add linux mremap support code from HJ Liu + + V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) + * Integrated most documentation with the code. + * Add support for mmap, with help from + Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Use last_remainder in more cases. + * Pack bins using idea from colin@nyx10.cs.du.edu + * Use ordered bins instead of best-fit threshhold + * Eliminate block-local decls to simplify tracing and debugging. + * Support another case of realloc via move into top + * Fix error occuring when initial sbrk_base not word-aligned. + * Rely on page size for units instead of SBRK_UNIT to + avoid surprises about sbrk alignment conventions. + * Add mallinfo, mallopt. Thanks to Raymond Nijssen + (raymond@es.ele.tue.nl) for the suggestion. + * Add `pad' argument to malloc_trim and top_pad mallopt parameter. + * More precautions for cases where other routines call sbrk, + courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Added macros etc., allowing use in linux libc from + H.J. Lu (hjl@gnu.ai.mit.edu) + * Inverted this history list + + V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) + * Re-tuned and fixed to behave more nicely with V2.6.0 changes. + * Removed all preallocation code since under current scheme + the work required to undo bad preallocations exceeds + the work saved in good cases for most test programs. + * No longer use return list or unconsolidated bins since + no scheme using them consistently outperforms those that don't + given above changes. + * Use best fit for very large chunks to prevent some worst-cases. + * Added some support for debugging + + V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) + * Removed footers when chunks are in use. Thanks to + Paul Wilson (wilson@cs.texas.edu) for the suggestion. + + V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) + * Added malloc_trim, with help from Wolfram Gloger + (wmglo@Dent.MED.Uni-Muenchen.DE). + + V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) + + V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) + * realloc: try to expand in both directions + * malloc: swap order of clean-bin strategy; + * realloc: only conditionally expand backwards + * Try not to scavenge used bins + * Use bin counts as a guide to preallocation + * Occasionally bin return list chunks in first scan + * Add a few optimizations from colin@nyx10.cs.du.edu + + V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) + * faster bin computation & slightly different binning + * merged all consolidations to one part of malloc proper + (eliminating old malloc_find_space & malloc_clean_bin) + * Scan 2 returns chunks (not just 1) + * Propagate failure in realloc if malloc returns 0 + * Add stuff to allow compilation on non-ANSI compilers + from kpv@research.att.com + + V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) + * removed potential for odd address access in prev_chunk + * removed dependency on getpagesize.h + * misc cosmetics and a bit more internal documentation + * anticosmetics: mangled names in macros to evade debugger strangeness + * tested on sparc, hp-700, dec-mips, rs6000 + with gcc & native cc (hp, dec only) allowing + Detlefs & Zorn comparison study (in SIGPLAN Notices.) + + Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) + * Based loosely on libg++-1.2X malloc. (It retains some of the overall + structure of old version, but most details differ.) + +*/ + + diff --git a/src/3rdparty/ptmalloc/ptmalloc3.c b/src/3rdparty/ptmalloc/ptmalloc3.c new file mode 100644 index 0000000000..12914049fb --- /dev/null +++ b/src/3rdparty/ptmalloc/ptmalloc3.c @@ -0,0 +1,1135 @@ +/* + * $Id: ptmalloc3.c,v 1.8 2006/03/31 15:57:28 wg Exp $ + * + +ptmalloc3 -- wrapper for Doug Lea's malloc-2.8.3 with concurrent + allocations + +Copyright (c) 2005, 2006 Wolfram Gloger + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that (i) the above copyright notices and this permission +notice appear in all copies of the software and related documentation, +and (ii) the name of Wolfram Gloger may not be used in any advertising +or publicity relating to the software. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL WOLFRAM GLOGER BE LIABLE FOR ANY SPECIAL, +INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY +OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + + */ + +/* + * TODO: optimization / better integration with malloc.c (partly done) + * malloc_{get,set}_state (probably hard to keep compatibility) + * debugging hooks + * better mstats + */ + +#include /* For size_t */ +#include /* for mmap */ +#include +#include +#include +#include /* for memset */ + +#include + +#include "malloc-2.8.3.h" + +/* ----------------------------------------------------------------------- */ + +/* The following section is replicated from malloc.c */ + +#include "malloc-private.h" + +/* end of definitions replicated from malloc.c */ + +#define munmap_chunk(mst, p) do { \ + size_t prevsize = (p)->prev_foot & ~IS_MMAPPED_BIT; \ + size_t psize = chunksize(p) + prevsize + MMAP_FOOT_PAD; \ + if (CALL_MUNMAP((char*)(p) - prevsize, psize) == 0) \ + ((struct malloc_state*)(mst))->footprint -= psize; \ +} while (0) + +/* ---------------------------------------------------------------------- */ + +/* Minimum size for a newly created arena. */ +#ifndef ARENA_SIZE_MIN +# define ARENA_SIZE_MIN (128*1024) +#endif +#define HAVE_MEMCPY 1 + +/* If THREAD_STATS is non-zero, some statistics on mutex locking are + computed. */ +#ifndef THREAD_STATS +# define THREAD_STATS 0 +#endif + +#ifndef MALLOC_DEBUG +# define MALLOC_DEBUG 0 +#endif + +#define my_powerof2(x) ((((x)-1)&(x))==0) + +/* Already initialized? */ +int __malloc_initialized = -1; + +#ifndef RETURN_ADDRESS +# define RETURN_ADDRESS(X_) (NULL) +#endif + +#if THREAD_STATS +# define THREAD_STAT(x) x +#else +# define THREAD_STAT(x) do ; while(0) +#endif + +#ifdef _LIBC + +/* Special defines for the GNU C library. */ +#define public_cALLOc __libc_calloc +#define public_fREe __libc_free +#define public_cFREe __libc_cfree +#define public_mALLOc __libc_malloc +#define public_mEMALIGn __libc_memalign +#define public_rEALLOc __libc_realloc +#define public_vALLOc __libc_valloc +#define public_pVALLOc __libc_pvalloc +#define public_pMEMALIGn __posix_memalign +#define public_mALLINFo __libc_mallinfo +#define public_mALLOPt __libc_mallopt +#define public_mTRIm __malloc_trim +#define public_mSTATs __malloc_stats +#define public_mUSABLe __malloc_usable_size +#define public_iCALLOc __libc_independent_calloc +#define public_iCOMALLOc __libc_independent_comalloc +#define public_gET_STATe __malloc_get_state +#define public_sET_STATe __malloc_set_state +#define malloc_getpagesize __getpagesize() +#define open __open +#define mmap __mmap +#define munmap __munmap +#define mremap __mremap +#define mprotect __mprotect +#define MORECORE (*__morecore) +#define MORECORE_FAILURE 0 + +void * __default_morecore (ptrdiff_t); +void *(*__morecore)(ptrdiff_t) = __default_morecore; + +#else /* !_LIBC */ + +#define public_cALLOc calloc +#define public_fREe free +#define public_cFREe cfree +#define public_mALLOc malloc +#define public_mEMALIGn memalign +#define public_rEALLOc realloc +#define public_vALLOc valloc +#define public_pVALLOc pvalloc +#define public_pMEMALIGn posix_memalign +#define public_mALLINFo mallinfo +#define public_mALLOPt mallopt +#define public_mTRIm malloc_trim +#define public_mSTATs malloc_stats +#define public_mUSABLe malloc_usable_size +#define public_iCALLOc independent_calloc +#define public_iCOMALLOc independent_comalloc +#define public_gET_STATe malloc_get_state +#define public_sET_STATe malloc_set_state + +#endif /* _LIBC */ + +#if !defined _LIBC && (!defined __GNUC__ || __GNUC__<3) +#define __builtin_expect(expr, val) (expr) +#endif + +#if MALLOC_DEBUG +#include +#else +#undef assert +#define assert(x) ((void)0) +#endif + +/* USE_STARTER determines if and when the special "starter" hook + functions are used: not at all (0), during ptmalloc_init (first bit + set), or from the beginning until an explicit call to ptmalloc_init + (second bit set). This is necessary if thread-related + initialization functions (e.g. pthread_key_create) require + malloc() calls (set USE_STARTER=1), or if those functions initially + cannot be used at all (set USE_STARTER=2 and perform an explicit + ptmalloc_init() when the thread library is ready, typically at the + start of main()). */ + +#ifndef USE_STARTER +# ifndef _LIBC +# define USE_STARTER 1 +# else +# if USE___THREAD || (defined USE_TLS && !defined SHARED) + /* These routines are never needed in this configuration. */ +# define USE_STARTER 0 +# else +# define USE_STARTER (USE_TLS ? 4 : 1) +# endif +# endif +#endif + +/*----------------------------------------------------------------------*/ + +/* Arenas */ +static tsd_key_t arena_key; +static mutex_t list_lock; + +/* Arena structure */ +struct malloc_arena { + /* Serialize access. */ + mutex_t mutex; + + /* Statistics for locking. Only used if THREAD_STATS is defined. */ + long stat_lock_direct, stat_lock_loop, stat_lock_wait; + long stat_starter; + + /* Linked list */ + struct malloc_arena *next; + + /* Space for mstate. The size is just the minimum such that + create_mspace_with_base can be successfully called. */ + char buf_[pad_request(sizeof(struct malloc_state)) + TOP_FOOT_SIZE + + CHUNK_ALIGN_MASK + 1]; +}; +#define MSPACE_OFFSET (((offsetof(struct malloc_arena, buf_) \ + + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)) +#define arena_to_mspace(a) ((void *)chunk2mem((char*)(a) + MSPACE_OFFSET)) + +/* check for chunk from non-main arena */ +#define chunk_non_main_arena(p) ((p)->head & NON_MAIN_ARENA) + +static struct malloc_arena* _int_new_arena(size_t size); + +/* Buffer for the main arena. */ +static struct malloc_arena main_arena; + +/* For now, store arena in footer. This means typically 4bytes more + overhead for each non-main-arena chunk, but is fast and easy to + compute. Note that the pointer stored in the extra footer must be + properly aligned, though. */ +#define FOOTER_OVERHEAD \ + (2*sizeof(struct malloc_arena*) - SIZE_T_SIZE) + +#define arena_for_chunk(ptr) \ + (chunk_non_main_arena(ptr) ? *(struct malloc_arena**) \ + ((char*)(ptr) + chunksize(ptr) - (FOOTER_OVERHEAD - SIZE_T_SIZE)) \ + : &main_arena) + +/* special because of extra overhead */ +#define arena_for_mmap_chunk(ptr) \ + (chunk_non_main_arena(ptr) ? *(struct malloc_arena**) \ + ((char*)(ptr) + chunksize(ptr) - sizeof(struct malloc_arena*)) \ + : &main_arena) + +#define set_non_main_arena(mem, ar_ptr) do { \ + mchunkptr P = mem2chunk(mem); \ + size_t SZ = chunksize(P) - (is_mmapped(P) ? sizeof(struct malloc_arena*) \ + : (FOOTER_OVERHEAD - SIZE_T_SIZE)); \ + assert((unsigned long)((char*)(P) + SZ)%sizeof(struct malloc_arena*) == 0); \ + *(struct malloc_arena**)((char*)(P) + SZ) = (ar_ptr); \ + P->head |= NON_MAIN_ARENA; \ +} while (0) + +/* arena_get() acquires an arena and locks the corresponding mutex. + First, try the one last locked successfully by this thread. (This + is the common case and handled with a macro for speed.) Then, loop + once over the circularly linked list of arenas. If no arena is + readily available, create a new one. In this latter case, `size' + is just a hint as to how much memory will be required immediately + in the new arena. */ + +#define arena_get(ptr, size) do { \ + void *vptr = NULL; \ + ptr = (struct malloc_arena*)tsd_getspecific(arena_key, vptr); \ + if(ptr && !mutex_trylock(&ptr->mutex)) { \ + THREAD_STAT(++(ptr->stat_lock_direct)); \ + } else \ + ptr = arena_get2(ptr, (size)); \ +} while(0) + +static struct malloc_arena* +arena_get2(struct malloc_arena* a_tsd, size_t size) +{ + struct malloc_arena* a; + int err; + + if(!a_tsd) + a = a_tsd = &main_arena; + else { + a = a_tsd->next; + if(!a) { + /* This can only happen while initializing the new arena. */ + (void)mutex_lock(&main_arena.mutex); + THREAD_STAT(++(main_arena.stat_lock_wait)); + return &main_arena; + } + } + + /* Check the global, circularly linked list for available arenas. */ + repeat: + do { + if(!mutex_trylock(&a->mutex)) { + THREAD_STAT(++(a->stat_lock_loop)); + tsd_setspecific(arena_key, (void *)a); + return a; + } + a = a->next; + } while(a != a_tsd); + + /* If not even the list_lock can be obtained, try again. This can + happen during `atfork', or for example on systems where thread + creation makes it temporarily impossible to obtain _any_ + locks. */ + if(mutex_trylock(&list_lock)) { + a = a_tsd; + goto repeat; + } + (void)mutex_unlock(&list_lock); + + /* Nothing immediately available, so generate a new arena. */ + a = _int_new_arena(size); + if(!a) + return 0; + + tsd_setspecific(arena_key, (void *)a); + mutex_init(&a->mutex); + err = mutex_lock(&a->mutex); /* remember result */ + + /* Add the new arena to the global list. */ + (void)mutex_lock(&list_lock); + a->next = main_arena.next; + atomic_write_barrier (); + main_arena.next = a; + (void)mutex_unlock(&list_lock); + + if(err) /* locking failed; keep arena for further attempts later */ + return 0; + + THREAD_STAT(++(a->stat_lock_loop)); + return a; +} + +/* Create a new arena with room for a chunk of size "size". */ + +static struct malloc_arena* +_int_new_arena(size_t size) +{ + struct malloc_arena* a; + size_t mmap_sz = sizeof(*a) + pad_request(size); + void *m; + + if (mmap_sz < ARENA_SIZE_MIN) + mmap_sz = ARENA_SIZE_MIN; + /* conservative estimate for page size */ + mmap_sz = (mmap_sz + 8191) & ~(size_t)8191; + a = CALL_MMAP(mmap_sz); + if ((char*)a == (char*)-1) + return 0; + + m = create_mspace_with_base((char*)a + MSPACE_OFFSET, + mmap_sz - MSPACE_OFFSET, + 0); + + if (!m) { + CALL_MUNMAP(a, mmap_sz); + a = 0; + } else { + /*a->next = NULL;*/ + /*a->system_mem = a->max_system_mem = h->size;*/ + } + + return a; +} + +/*------------------------------------------------------------------------*/ + +/* Hook mechanism for proper initialization and atfork support. */ + +/* Define and initialize the hook variables. These weak definitions must + appear before any use of the variables in a function. */ +#ifndef weak_variable +#ifndef _LIBC +#define weak_variable /**/ +#else +/* In GNU libc we want the hook variables to be weak definitions to + avoid a problem with Emacs. */ +#define weak_variable weak_function +#endif +#endif + +#if !(USE_STARTER & 2) +# define free_hook_ini NULL +/* Forward declarations. */ +static void* malloc_hook_ini (size_t sz, const void *caller); +static void* realloc_hook_ini (void* ptr, size_t sz, const void* caller); +static void* memalign_hook_ini (size_t alignment, size_t sz, + const void* caller); +#else +# define free_hook_ini free_starter +# define malloc_hook_ini malloc_starter +# define realloc_hook_ini NULL +# define memalign_hook_ini memalign_starter +#endif + +void weak_variable (*__malloc_initialize_hook) (void) = NULL; +void weak_variable (*__free_hook) (void * __ptr, const void *) + = free_hook_ini; +void * weak_variable (*__malloc_hook) (size_t __size, const void *) + = malloc_hook_ini; +void * weak_variable (*__realloc_hook) + (void * __ptr, size_t __size, const void *) = realloc_hook_ini; +void * weak_variable (*__memalign_hook) + (size_t __alignment, size_t __size, const void *) = memalign_hook_ini; +/*void weak_variable (*__after_morecore_hook) (void) = NULL;*/ + +/* The initial hooks just call the initialization routine, then do the + normal work. */ + +#if !(USE_STARTER & 2) +static +#endif +void ptmalloc_init(void); + +#if !(USE_STARTER & 2) + +static void* +malloc_hook_ini(size_t sz, const void * caller) +{ + __malloc_hook = NULL; + ptmalloc_init(); + return public_mALLOc(sz); +} + +static void * +realloc_hook_ini(void *ptr, size_t sz, const void * caller) +{ + __malloc_hook = NULL; + __realloc_hook = NULL; + ptmalloc_init(); + return public_rEALLOc(ptr, sz); +} + +static void* +memalign_hook_ini(size_t alignment, size_t sz, const void * caller) +{ + __memalign_hook = NULL; + ptmalloc_init(); + return public_mEMALIGn(alignment, sz); +} + +#endif /* !(USE_STARTER & 2) */ + +/*----------------------------------------------------------------------*/ + +#if !defined NO_THREADS && USE_STARTER + +/* The following hooks are used when the global initialization in + ptmalloc_init() hasn't completed yet. */ + +static void* +malloc_starter(size_t sz, const void *caller) +{ + void* victim; + + /*ptmalloc_init_minimal();*/ + victim = mspace_malloc(arena_to_mspace(&main_arena), sz); + THREAD_STAT(++main_arena.stat_starter); + + return victim; +} + +static void* +memalign_starter(size_t align, size_t sz, const void *caller) +{ + void* victim; + + /*ptmalloc_init_minimal();*/ + victim = mspace_memalign(arena_to_mspace(&main_arena), align, sz); + THREAD_STAT(++main_arena.stat_starter); + + return victim; +} + +static void +free_starter(void* mem, const void *caller) +{ + if (mem) { + mchunkptr p = mem2chunk(mem); + void *msp = arena_to_mspace(&main_arena); + if (is_mmapped(p)) + munmap_chunk(msp, p); + else + mspace_free(msp, mem); + } + THREAD_STAT(++main_arena.stat_starter); +} + +#endif /* !defined NO_THREADS && USE_STARTER */ + +/*----------------------------------------------------------------------*/ + +#ifndef NO_THREADS + +/* atfork support. */ + +static void * (*save_malloc_hook) (size_t __size, const void *); +# if !defined _LIBC || !defined USE_TLS || (defined SHARED && !USE___THREAD) +static void * (*save_memalign_hook) (size_t __align, size_t __size, + const void *); +# endif +static void (*save_free_hook) (void * __ptr, const void *); +static void* save_arena; + +/* Magic value for the thread-specific arena pointer when + malloc_atfork() is in use. */ + +#define ATFORK_ARENA_PTR ((void*)-1) + +/* The following hooks are used while the `atfork' handling mechanism + is active. */ + +static void* +malloc_atfork(size_t sz, const void *caller) +{ + void *vptr = NULL; + + tsd_getspecific(arena_key, vptr); + if(vptr == ATFORK_ARENA_PTR) { + /* We are the only thread that may allocate at all. */ + return mspace_malloc(arena_to_mspace(&main_arena), sz); + } else { + /* Suspend the thread until the `atfork' handlers have completed. + By that time, the hooks will have been reset as well, so that + mALLOc() can be used again. */ + (void)mutex_lock(&list_lock); + (void)mutex_unlock(&list_lock); + return public_mALLOc(sz); + } +} + +static void +free_atfork(void* mem, const void *caller) +{ + void *vptr = NULL; + struct malloc_arena *ar_ptr; + mchunkptr p; /* chunk corresponding to mem */ + + if (mem == 0) /* free(0) has no effect */ + return; + + p = mem2chunk(mem); + + if (is_mmapped(p)) { /* release mmapped memory. */ + ar_ptr = arena_for_mmap_chunk(p); + munmap_chunk(arena_to_mspace(ar_ptr), p); + return; + } + + ar_ptr = arena_for_chunk(p); + tsd_getspecific(arena_key, vptr); + if(vptr != ATFORK_ARENA_PTR) + (void)mutex_lock(&ar_ptr->mutex); + mspace_free(arena_to_mspace(ar_ptr), mem); + if(vptr != ATFORK_ARENA_PTR) + (void)mutex_unlock(&ar_ptr->mutex); +} + +/* The following two functions are registered via thread_atfork() to + make sure that the mutexes remain in a consistent state in the + fork()ed version of a thread. Also adapt the malloc and free hooks + temporarily, because the `atfork' handler mechanism may use + malloc/free internally (e.g. in LinuxThreads). */ + +static void +ptmalloc_lock_all (void) +{ + struct malloc_arena* ar_ptr; + + if(__malloc_initialized < 1) + return; + (void)mutex_lock(&list_lock); + for(ar_ptr = &main_arena;;) { + (void)mutex_lock(&ar_ptr->mutex); + ar_ptr = ar_ptr->next; + if(ar_ptr == &main_arena) + break; + } + save_malloc_hook = __malloc_hook; + save_free_hook = __free_hook; + __malloc_hook = malloc_atfork; + __free_hook = free_atfork; + /* Only the current thread may perform malloc/free calls now. */ + tsd_getspecific(arena_key, save_arena); + tsd_setspecific(arena_key, ATFORK_ARENA_PTR); +} + +static void +ptmalloc_unlock_all (void) +{ + struct malloc_arena *ar_ptr; + + if(__malloc_initialized < 1) + return; + tsd_setspecific(arena_key, save_arena); + __malloc_hook = save_malloc_hook; + __free_hook = save_free_hook; + for(ar_ptr = &main_arena;;) { + (void)mutex_unlock(&ar_ptr->mutex); + ar_ptr = ar_ptr->next; + if(ar_ptr == &main_arena) break; + } + (void)mutex_unlock(&list_lock); +} + +#ifdef __linux__ + +/* In LinuxThreads, unlocking a mutex in the child process after a + fork() is currently unsafe, whereas re-initializing it is safe and + does not leak resources. Therefore, a special atfork handler is + installed for the child. */ + +static void +ptmalloc_unlock_all2(void) +{ + struct malloc_arena *ar_ptr; + + if(__malloc_initialized < 1) + return; +#if defined _LIBC || 1 /*defined MALLOC_HOOKS*/ + tsd_setspecific(arena_key, save_arena); + __malloc_hook = save_malloc_hook; + __free_hook = save_free_hook; +#endif + for(ar_ptr = &main_arena;;) { + (void)mutex_init(&ar_ptr->mutex); + ar_ptr = ar_ptr->next; + if(ar_ptr == &main_arena) break; + } + (void)mutex_init(&list_lock); +} + +#else + +#define ptmalloc_unlock_all2 ptmalloc_unlock_all + +#endif + +#endif /* !defined NO_THREADS */ + +/*---------------------------------------------------------------------*/ + +#if !(USE_STARTER & 2) +static +#endif +void +ptmalloc_init(void) +{ + const char* s; + int secure = 0; + void *mspace; + + if(__malloc_initialized >= 0) return; + __malloc_initialized = 0; + + /*if (mp_.pagesize == 0) + ptmalloc_init_minimal();*/ + +#ifndef NO_THREADS +# if USE_STARTER & 1 + /* With some threads implementations, creating thread-specific data + or initializing a mutex may call malloc() itself. Provide a + simple starter version (realloc() won't work). */ + save_malloc_hook = __malloc_hook; + save_memalign_hook = __memalign_hook; + save_free_hook = __free_hook; + __malloc_hook = malloc_starter; + __memalign_hook = memalign_starter; + __free_hook = free_starter; +# ifdef _LIBC + /* Initialize the pthreads interface. */ + if (__pthread_initialize != NULL) + __pthread_initialize(); +# endif /* !defined _LIBC */ +# endif /* USE_STARTER & 1 */ +#endif /* !defined NO_THREADS */ + mutex_init(&main_arena.mutex); + main_arena.next = &main_arena; + mspace = create_mspace_with_base((char*)&main_arena + MSPACE_OFFSET, + sizeof(main_arena) - MSPACE_OFFSET, + 0); + assert(mspace == arena_to_mspace(&main_arena)); + + mutex_init(&list_lock); + tsd_key_create(&arena_key, NULL); + tsd_setspecific(arena_key, (void *)&main_arena); + thread_atfork(ptmalloc_lock_all, ptmalloc_unlock_all, ptmalloc_unlock_all2); +#ifndef NO_THREADS +# if USE_STARTER & 1 + __malloc_hook = save_malloc_hook; + __memalign_hook = save_memalign_hook; + __free_hook = save_free_hook; +# endif +# if USE_STARTER & 2 + __malloc_hook = 0; + __memalign_hook = 0; + __free_hook = 0; +# endif +#endif +#ifdef _LIBC + secure = __libc_enable_secure; +#else + if (! secure) { + if ((s = getenv("MALLOC_TRIM_THRESHOLD_"))) + public_mALLOPt(M_TRIM_THRESHOLD, atoi(s)); + if ((s = getenv("MALLOC_TOP_PAD_")) || + (s = getenv("MALLOC_GRANULARITY_"))) + public_mALLOPt(M_GRANULARITY, atoi(s)); + if ((s = getenv("MALLOC_MMAP_THRESHOLD_"))) + public_mALLOPt(M_MMAP_THRESHOLD, atoi(s)); + /*if ((s = getenv("MALLOC_MMAP_MAX_"))) this is no longer available + public_mALLOPt(M_MMAP_MAX, atoi(s));*/ + } + s = getenv("MALLOC_CHECK_"); +#endif + if (s) { + /*if(s[0]) mALLOPt(M_CHECK_ACTION, (int)(s[0] - '0')); + __malloc_check_init();*/ + } + if (__malloc_initialize_hook != NULL) + (*__malloc_initialize_hook)(); + __malloc_initialized = 1; +} + +/*------------------------ Public wrappers. --------------------------------*/ + +void* +public_mALLOc(size_t bytes) +{ + struct malloc_arena* ar_ptr; + void *victim; + + void * (*hook) (size_t, const void *) = __malloc_hook; + if (hook != NULL) + return (*hook)(bytes, RETURN_ADDRESS (0)); + + arena_get(ar_ptr, bytes + FOOTER_OVERHEAD); + if (!ar_ptr) + return 0; + if (ar_ptr != &main_arena) + bytes += FOOTER_OVERHEAD; + victim = mspace_malloc(arena_to_mspace(ar_ptr), bytes); + if (victim && ar_ptr != &main_arena) + set_non_main_arena(victim, ar_ptr); + (void)mutex_unlock(&ar_ptr->mutex); + assert(!victim || is_mmapped(mem2chunk(victim)) || + ar_ptr == arena_for_chunk(mem2chunk(victim))); + return victim; +} +#ifdef libc_hidden_def +libc_hidden_def(public_mALLOc) +#endif + +void +public_fREe(void* mem) +{ + struct malloc_arena* ar_ptr; + mchunkptr p; /* chunk corresponding to mem */ + + void (*hook) (void *, const void *) = __free_hook; + if (hook != NULL) { + (*hook)(mem, RETURN_ADDRESS (0)); + return; + } + + if (mem == 0) /* free(0) has no effect */ + return; + + p = mem2chunk(mem); + + if (is_mmapped(p)) { /* release mmapped memory. */ + ar_ptr = arena_for_mmap_chunk(p); + munmap_chunk(arena_to_mspace(ar_ptr), p); + return; + } + + ar_ptr = arena_for_chunk(p); +#if THREAD_STATS + if(!mutex_trylock(&ar_ptr->mutex)) + ++(ar_ptr->stat_lock_direct); + else { + (void)mutex_lock(&ar_ptr->mutex); + ++(ar_ptr->stat_lock_wait); + } +#else + (void)mutex_lock(&ar_ptr->mutex); +#endif + mspace_free(arena_to_mspace(ar_ptr), mem); + (void)mutex_unlock(&ar_ptr->mutex); +} +#ifdef libc_hidden_def +libc_hidden_def (public_fREe) +#endif + +void* +public_rEALLOc(void* oldmem, size_t bytes) +{ + struct malloc_arena* ar_ptr; + + mchunkptr oldp; /* chunk corresponding to oldmem */ + + void* newp; /* chunk to return */ + + void * (*hook) (void *, size_t, const void *) = __realloc_hook; + if (hook != NULL) + return (*hook)(oldmem, bytes, RETURN_ADDRESS (0)); + +#if REALLOC_ZERO_BYTES_FREES + if (bytes == 0 && oldmem != NULL) { public_fREe(oldmem); return 0; } +#endif + + /* realloc of null is supposed to be same as malloc */ + if (oldmem == 0) + return public_mALLOc(bytes); + + oldp = mem2chunk(oldmem); + if (is_mmapped(oldp)) + ar_ptr = arena_for_mmap_chunk(oldp); /* FIXME: use mmap_resize */ + else + ar_ptr = arena_for_chunk(oldp); +#if THREAD_STATS + if(!mutex_trylock(&ar_ptr->mutex)) + ++(ar_ptr->stat_lock_direct); + else { + (void)mutex_lock(&ar_ptr->mutex); + ++(ar_ptr->stat_lock_wait); + } +#else + (void)mutex_lock(&ar_ptr->mutex); +#endif + +#ifndef NO_THREADS + /* As in malloc(), remember this arena for the next allocation. */ + tsd_setspecific(arena_key, (void *)ar_ptr); +#endif + + if (ar_ptr != &main_arena) + bytes += FOOTER_OVERHEAD; + newp = mspace_realloc(arena_to_mspace(ar_ptr), oldmem, bytes); + + if (newp && ar_ptr != &main_arena) + set_non_main_arena(newp, ar_ptr); + (void)mutex_unlock(&ar_ptr->mutex); + + assert(!newp || is_mmapped(mem2chunk(newp)) || + ar_ptr == arena_for_chunk(mem2chunk(newp))); + return newp; +} +#ifdef libc_hidden_def +libc_hidden_def (public_rEALLOc) +#endif + +void* +public_mEMALIGn(size_t alignment, size_t bytes) +{ + struct malloc_arena* ar_ptr; + void *p; + + void * (*hook) (size_t, size_t, const void *) = __memalign_hook; + if (hook != NULL) + return (*hook)(alignment, bytes, RETURN_ADDRESS (0)); + + /* If need less alignment than we give anyway, just relay to malloc */ + if (alignment <= MALLOC_ALIGNMENT) return public_mALLOc(bytes); + + /* Otherwise, ensure that it is at least a minimum chunk size */ + if (alignment < MIN_CHUNK_SIZE) + alignment = MIN_CHUNK_SIZE; + + arena_get(ar_ptr, + bytes + FOOTER_OVERHEAD + alignment + MIN_CHUNK_SIZE); + if(!ar_ptr) + return 0; + + if (ar_ptr != &main_arena) + bytes += FOOTER_OVERHEAD; + p = mspace_memalign(arena_to_mspace(ar_ptr), alignment, bytes); + + if (p && ar_ptr != &main_arena) + set_non_main_arena(p, ar_ptr); + (void)mutex_unlock(&ar_ptr->mutex); + + assert(!p || is_mmapped(mem2chunk(p)) || + ar_ptr == arena_for_chunk(mem2chunk(p))); + return p; +} +#ifdef libc_hidden_def +libc_hidden_def (public_mEMALIGn) +#endif + +void* +public_vALLOc(size_t bytes) +{ + struct malloc_arena* ar_ptr; + void *p; + + if(__malloc_initialized < 0) + ptmalloc_init (); + arena_get(ar_ptr, bytes + FOOTER_OVERHEAD + MIN_CHUNK_SIZE); + if(!ar_ptr) + return 0; + if (ar_ptr != &main_arena) + bytes += FOOTER_OVERHEAD; + p = mspace_memalign(arena_to_mspace(ar_ptr), 4096, bytes); + + if (p && ar_ptr != &main_arena) + set_non_main_arena(p, ar_ptr); + (void)mutex_unlock(&ar_ptr->mutex); + return p; +} + +int +public_pMEMALIGn (void **memptr, size_t alignment, size_t size) +{ + void *mem; + + /* Test whether the SIZE argument is valid. It must be a power of + two multiple of sizeof (void *). */ + if (alignment % sizeof (void *) != 0 + || !my_powerof2 (alignment / sizeof (void *)) != 0 + || alignment == 0) + return EINVAL; + + mem = public_mEMALIGn (alignment, size); + + if (mem != NULL) { + *memptr = mem; + return 0; + } + + return ENOMEM; +} + +void* +public_cALLOc(size_t n_elements, size_t elem_size) +{ + struct malloc_arena* ar_ptr; + size_t bytes, sz; + void* mem; + void * (*hook) (size_t, const void *) = __malloc_hook; + + /* size_t is unsigned so the behavior on overflow is defined. */ + bytes = n_elements * elem_size; +#define HALF_INTERNAL_SIZE_T \ + (((size_t) 1) << (8 * sizeof (size_t) / 2)) + if (__builtin_expect ((n_elements | elem_size) >= HALF_INTERNAL_SIZE_T, 0)) { + if (elem_size != 0 && bytes / elem_size != n_elements) { + /*MALLOC_FAILURE_ACTION;*/ + return 0; + } + } + + if (hook != NULL) { + sz = bytes; + mem = (*hook)(sz, RETURN_ADDRESS (0)); + if(mem == 0) + return 0; +#ifdef HAVE_MEMCPY + return memset(mem, 0, sz); +#else + while(sz > 0) ((char*)mem)[--sz] = 0; /* rather inefficient */ + return mem; +#endif + } + + arena_get(ar_ptr, bytes + FOOTER_OVERHEAD); + if(!ar_ptr) + return 0; + + if (ar_ptr != &main_arena) + bytes += FOOTER_OVERHEAD; + mem = mspace_calloc(arena_to_mspace(ar_ptr), bytes, 1); + + if (mem && ar_ptr != &main_arena) + set_non_main_arena(mem, ar_ptr); + (void)mutex_unlock(&ar_ptr->mutex); + + assert(!mem || is_mmapped(mem2chunk(mem)) || + ar_ptr == arena_for_chunk(mem2chunk(mem))); + + return mem; +} + +void** +public_iCALLOc(size_t n, size_t elem_size, void* chunks[]) +{ + struct malloc_arena* ar_ptr; + void** m; + + arena_get(ar_ptr, n*(elem_size + FOOTER_OVERHEAD)); + if (!ar_ptr) + return 0; + + if (ar_ptr != &main_arena) + elem_size += FOOTER_OVERHEAD; + m = mspace_independent_calloc(arena_to_mspace(ar_ptr), n, elem_size, chunks); + + if (m && ar_ptr != &main_arena) { + while (n > 0) + set_non_main_arena(m[--n], ar_ptr); + } + (void)mutex_unlock(&ar_ptr->mutex); + return m; +} + +void** +public_iCOMALLOc(size_t n, size_t sizes[], void* chunks[]) +{ + struct malloc_arena* ar_ptr; + size_t* m_sizes; + size_t i; + void** m; + + arena_get(ar_ptr, n*sizeof(size_t)); + if (!ar_ptr) + return 0; + + if (ar_ptr != &main_arena) { + /* Temporary m_sizes[] array is ugly but it would be surprising to + change the original sizes[]... */ + m_sizes = mspace_malloc(arena_to_mspace(ar_ptr), n*sizeof(size_t)); + if (!m_sizes) { + (void)mutex_unlock(&ar_ptr->mutex); + return 0; + } + for (i=0; imutex); + return 0; + } + set_non_main_arena(chunks, ar_ptr); + } + } else + m_sizes = sizes; + + m = mspace_independent_comalloc(arena_to_mspace(ar_ptr), n, m_sizes, chunks); + + if (ar_ptr != &main_arena) { + mspace_free(arena_to_mspace(ar_ptr), m_sizes); + if (m) + for (i=0; imutex); + return m; +} + +#if 0 && !defined _LIBC + +void +public_cFREe(void* m) +{ + public_fREe(m); +} + +#endif /* _LIBC */ + +int +public_mTRIm(size_t s) +{ + int result; + + (void)mutex_lock(&main_arena.mutex); + result = mspace_trim(arena_to_mspace(&main_arena), s); + (void)mutex_unlock(&main_arena.mutex); + return result; +} + +size_t +public_mUSABLe(void* mem) +{ + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + if (cinuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; +} + +int +public_mALLOPt(int p, int v) +{ + int result; + result = mspace_mallopt(p, v); + return result; +} + +void +public_mSTATs(void) +{ + int i; + struct malloc_arena* ar_ptr; + /*unsigned long in_use_b, system_b, avail_b;*/ +#if THREAD_STATS + long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0; +#endif + + if(__malloc_initialized < 0) + ptmalloc_init (); + for (i=0, ar_ptr = &main_arena;; ++i) { + struct malloc_state* msp = arena_to_mspace(ar_ptr); + + fprintf(stderr, "Arena %d:\n", i); + mspace_malloc_stats(msp); +#if THREAD_STATS + stat_lock_direct += ar_ptr->stat_lock_direct; + stat_lock_loop += ar_ptr->stat_lock_loop; + stat_lock_wait += ar_ptr->stat_lock_wait; +#endif + if (MALLOC_DEBUG > 1) { + struct malloc_segment* mseg = &msp->seg; + while (mseg) { + fprintf(stderr, " seg %08lx-%08lx\n", (unsigned long)mseg->base, + (unsigned long)(mseg->base + mseg->size)); + mseg = mseg->next; + } + } + ar_ptr = ar_ptr->next; + if (ar_ptr == &main_arena) + break; + } +#if THREAD_STATS + fprintf(stderr, "locked directly = %10ld\n", stat_lock_direct); + fprintf(stderr, "locked in loop = %10ld\n", stat_lock_loop); + fprintf(stderr, "locked waiting = %10ld\n", stat_lock_wait); + fprintf(stderr, "locked total = %10ld\n", + stat_lock_direct + stat_lock_loop + stat_lock_wait); + if (main_arena.stat_starter > 0) + fprintf(stderr, "starter hooks = %10ld\n", main_arena.stat_starter); +#endif +} + +/* + * Local variables: + * c-basic-offset: 2 + * End: + */ diff --git a/src/3rdparty/ptmalloc/sysdeps/generic/atomic.h b/src/3rdparty/ptmalloc/sysdeps/generic/atomic.h new file mode 100644 index 0000000000..a3aeed13e8 --- /dev/null +++ b/src/3rdparty/ptmalloc/sysdeps/generic/atomic.h @@ -0,0 +1 @@ +/* Empty placeholder */ diff --git a/src/3rdparty/ptmalloc/sysdeps/generic/malloc-machine.h b/src/3rdparty/ptmalloc/sysdeps/generic/malloc-machine.h new file mode 100644 index 0000000000..345137060d --- /dev/null +++ b/src/3rdparty/ptmalloc/sysdeps/generic/malloc-machine.h @@ -0,0 +1,68 @@ +/* Basic platform-independent macro definitions for mutexes, + thread-specific data and parameters for malloc. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _GENERIC_MALLOC_MACHINE_H +#define _GENERIC_MALLOC_MACHINE_H + +#include + +#ifndef mutex_init /* No threads, provide dummy macros */ + +# define NO_THREADS + +/* The mutex functions used to do absolutely nothing, i.e. lock, + trylock and unlock would always just return 0. However, even + without any concurrently active threads, a mutex can be used + legitimately as an `in use' flag. To make the code that is + protected by a mutex async-signal safe, these macros would have to + be based on atomic test-and-set operations, for example. */ +typedef int mutex_t; + +# define mutex_init(m) (*(m) = 0) +# define mutex_lock(m) ((*(m) = 1), 0) +# define mutex_trylock(m) (*(m) ? 1 : ((*(m) = 1), 0)) +# define mutex_unlock(m) (*(m) = 0) + +typedef void *tsd_key_t; +# define tsd_key_create(key, destr) do {} while(0) +# define tsd_setspecific(key, data) ((key) = (data)) +# define tsd_getspecific(key, vptr) (vptr = (key)) + +# define thread_atfork(prepare, parent, child) do {} while(0) + +#endif /* !defined mutex_init */ + +#ifndef atomic_full_barrier +# define atomic_full_barrier() __asm ("" ::: "memory") +#endif + +#ifndef atomic_read_barrier +# define atomic_read_barrier() atomic_full_barrier () +#endif + +#ifndef atomic_write_barrier +# define atomic_write_barrier() atomic_full_barrier () +#endif + +#ifndef DEFAULT_TOP_PAD +# define DEFAULT_TOP_PAD 131072 +#endif + +#endif /* !defined(_GENERIC_MALLOC_MACHINE_H) */ diff --git a/src/3rdparty/ptmalloc/sysdeps/generic/thread-st.h b/src/3rdparty/ptmalloc/sysdeps/generic/thread-st.h new file mode 100644 index 0000000000..0243774b7c --- /dev/null +++ b/src/3rdparty/ptmalloc/sysdeps/generic/thread-st.h @@ -0,0 +1,48 @@ +/* + * $Id:$ + * Generic version: no threads. + * by Wolfram Gloger 2004 + */ + +#include + +struct thread_st { + char *sp; /* stack pointer, can be 0 */ + void (*func)(struct thread_st* st); /* must be set by user */ + int id; + int flags; + struct user_data u; +}; + +static void +thread_init(void) +{ + printf("No threads.\n"); +} + +/* Create a thread. */ +static int +thread_create(struct thread_st *st) +{ + st->flags = 0; + st->id = 1; + st->func(st); + return 0; +} + +/* Wait for one of several subthreads to finish. */ +static void +wait_for_thread(struct thread_st st[], int n_thr, + int (*end_thr)(struct thread_st*)) +{ + int i; + for(i=0; i. + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that (i) the above copyright notices and this permission +notice appear in all copies of the software and related documentation, +and (ii) the name of Wolfram Gloger may not be used in any advertising +or publicity relating to the software. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL WOLFRAM GLOGER BE LIABLE FOR ANY SPECIAL, +INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY +OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef _PTHREAD_MALLOC_MACHINE_H +#define _PTHREAD_MALLOC_MACHINE_H + +#include + +#undef thread_atfork_static + +/* Use fast inline spinlocks with gcc. */ +#if (defined __i386__ || defined __x86_64__) && defined __GNUC__ && \ + !defined USE_NO_SPINLOCKS + +#include +#include + +typedef struct { + volatile unsigned int lock; + int pad0_; +} mutex_t; + +#define MUTEX_INITIALIZER { 0 } +#define mutex_init(m) ((m)->lock = 0) +static inline int mutex_lock(mutex_t *m) { + int cnt = 0, r; + struct timespec tm; + + for(;;) { + __asm__ __volatile__ + ("xchgl %0, %1" + : "=r"(r), "=m"(m->lock) + : "0"(1), "m"(m->lock) + : "memory"); + if(!r) + return 0; + if(cnt < 50) { + sched_yield(); + cnt++; + } else { + tm.tv_sec = 0; + tm.tv_nsec = 2000001; + nanosleep(&tm, NULL); + cnt = 0; + } + } +} +static inline int mutex_trylock(mutex_t *m) { + int r; + + __asm__ __volatile__ + ("xchgl %0, %1" + : "=r"(r), "=m"(m->lock) + : "0"(1), "m"(m->lock) + : "memory"); + return r; +} +static inline int mutex_unlock(mutex_t *m) { + __asm__ __volatile__ ("movl %1, %0" : "=m" (m->lock) : "g"(0) : "memory"); + return 0; +} + +#else + +/* Normal pthread mutex. */ +typedef pthread_mutex_t mutex_t; + +#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +#define mutex_init(m) pthread_mutex_init(m, NULL) +#define mutex_lock(m) pthread_mutex_lock(m) +#define mutex_trylock(m) pthread_mutex_trylock(m) +#define mutex_unlock(m) pthread_mutex_unlock(m) + +#endif /* (__i386__ || __x86_64__) && __GNUC__ && !USE_NO_SPINLOCKS */ + +/* thread specific data */ +#if defined(__sgi) || defined(USE_TSD_DATA_HACK) + +/* Hack for thread-specific data, e.g. on Irix 6.x. We can't use + pthread_setspecific because that function calls malloc() itself. + The hack only works when pthread_t can be converted to an integral + type. */ + +typedef void *tsd_key_t[256]; +#define tsd_key_create(key, destr) do { \ + int i; \ + for(i=0; i<256; i++) (*key)[i] = 0; \ +} while(0) +#define tsd_setspecific(key, data) \ + (key[(unsigned)pthread_self() % 256] = (data)) +#define tsd_getspecific(key, vptr) \ + (vptr = key[(unsigned)pthread_self() % 256]) + +#else + +typedef pthread_key_t tsd_key_t; + +#define tsd_key_create(key, destr) pthread_key_create(key, destr) +#define tsd_setspecific(key, data) pthread_setspecific(key, data) +#define tsd_getspecific(key, vptr) (vptr = pthread_getspecific(key)) + +#endif + +/* at fork */ +#define thread_atfork(prepare, parent, child) \ + pthread_atfork(prepare, parent, child) + +#include + +#endif /* !defined(_MALLOC_MACHINE_H) */ diff --git a/src/3rdparty/ptmalloc/sysdeps/pthread/thread-st.h b/src/3rdparty/ptmalloc/sysdeps/pthread/thread-st.h new file mode 100644 index 0000000000..f97a0a3552 --- /dev/null +++ b/src/3rdparty/ptmalloc/sysdeps/pthread/thread-st.h @@ -0,0 +1,111 @@ +/* + * $Id: thread-st.h$ + * pthread version + * by Wolfram Gloger 2004 + */ + +#include +#include + +pthread_cond_t finish_cond = PTHREAD_COND_INITIALIZER; +pthread_mutex_t finish_mutex = PTHREAD_MUTEX_INITIALIZER; + +#ifndef USE_PTHREADS_STACKS +#define USE_PTHREADS_STACKS 0 +#endif + +#ifndef STACKSIZE +#define STACKSIZE 32768 +#endif + +struct thread_st { + char *sp; /* stack pointer, can be 0 */ + void (*func)(struct thread_st* st); /* must be set by user */ + pthread_t id; + int flags; + struct user_data u; +}; + +static void +thread_init(void) +{ + printf("Using posix threads.\n"); + pthread_cond_init(&finish_cond, NULL); + pthread_mutex_init(&finish_mutex, NULL); +} + +static void * +thread_wrapper(void *ptr) +{ + struct thread_st *st = (struct thread_st*)ptr; + + /*printf("begin %p\n", st->sp);*/ + st->func(st); + pthread_mutex_lock(&finish_mutex); + st->flags = 1; + pthread_mutex_unlock(&finish_mutex); + pthread_cond_signal(&finish_cond); + /*printf("end %p\n", st->sp);*/ + return NULL; +} + +/* Create a thread. */ +static int +thread_create(struct thread_st *st) +{ + st->flags = 0; + { + pthread_attr_t* attr_p = 0; +#if USE_PTHREADS_STACKS + pthread_attr_t attr; + + pthread_attr_init (&attr); + if(!st->sp) + st->sp = malloc(STACKSIZE+16); + if(!st->sp) + return -1; + if(pthread_attr_setstacksize(&attr, STACKSIZE)) + fprintf(stderr, "error setting stacksize"); + else + pthread_attr_setstackaddr(&attr, st->sp + STACKSIZE); + /*printf("create %p\n", st->sp);*/ + attr_p = &attr; +#endif + return pthread_create(&st->id, attr_p, thread_wrapper, st); + } + return 0; +} + +/* Wait for one of several subthreads to finish. */ +static void +wait_for_thread(struct thread_st st[], int n_thr, + int (*end_thr)(struct thread_st*)) +{ + int i; + + pthread_mutex_lock(&finish_mutex); + for(;;) { + int term = 0; + for(i=0; i 0) + break; + pthread_cond_wait(&finish_cond, &finish_mutex); + } + pthread_mutex_unlock(&finish_mutex); +} + +/* + * Local variables: + * tab-width: 4 + * End: + */ diff --git a/src/3rdparty/ptmalloc/sysdeps/solaris/malloc-machine.h b/src/3rdparty/ptmalloc/sysdeps/solaris/malloc-machine.h new file mode 100644 index 0000000000..00e33b0801 --- /dev/null +++ b/src/3rdparty/ptmalloc/sysdeps/solaris/malloc-machine.h @@ -0,0 +1,51 @@ +/* Basic platform-independent macro definitions for mutexes, + thread-specific data and parameters for malloc. + Solaris threads version. + Copyright (C) 2004 Wolfram Gloger . + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that (i) the above copyright notices and this permission +notice appear in all copies of the software and related documentation, +and (ii) the name of Wolfram Gloger may not be used in any advertising +or publicity relating to the software. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL WOLFRAM GLOGER BE LIABLE FOR ANY SPECIAL, +INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY +OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef _SOLARIS_MALLOC_MACHINE_H +#define _SOLARIS_MALLOC_MACHINE_H + +#include + +typedef thread_t thread_id; + +#define MUTEX_INITIALIZER { 0 } +#define mutex_init(m) mutex_init(m, USYNC_THREAD, NULL) + +/* + * Hack for thread-specific data on Solaris. We can't use thr_setspecific + * because that function calls malloc() itself. + */ +typedef void *tsd_key_t[256]; +#define tsd_key_create(key, destr) do { \ + int i; \ + for(i=0; i<256; i++) (*key)[i] = 0; \ +} while(0) +#define tsd_setspecific(key, data) (key[(unsigned)thr_self() % 256] = (data)) +#define tsd_getspecific(key, vptr) (vptr = key[(unsigned)thr_self() % 256]) + +#define thread_atfork(prepare, parent, child) do {} while(0) + +#include + +#endif /* !defined(_SOLARIS_MALLOC_MACHINE_H) */ diff --git a/src/3rdparty/ptmalloc/sysdeps/solaris/thread-st.h b/src/3rdparty/ptmalloc/sysdeps/solaris/thread-st.h new file mode 100644 index 0000000000..dbb4b097e8 --- /dev/null +++ b/src/3rdparty/ptmalloc/sysdeps/solaris/thread-st.h @@ -0,0 +1,72 @@ +/* + * $Id:$ + * Solaris version + * by Wolfram Gloger 2004 + */ + +#include +#include + +#ifndef STACKSIZE +#define STACKSIZE 32768 +#endif + +struct thread_st { + char *sp; /* stack pointer, can be 0 */ + void (*func)(struct thread_st* st); /* must be set by user */ + thread_id id; + int flags; + struct user_data u; +}; + +static void +thread_init(void) +{ + printf("Using Solaris threads.\n"); +} + +static void * +thread_wrapper(void *ptr) +{ + struct thread_st *st = (struct thread_st*)ptr; + + /*printf("begin %p\n", st->sp);*/ + st->func(st); + /*printf("end %p\n", st->sp);*/ + return NULL; +} + +/* Create a thread. */ +static int +thread_create(struct thread_st *st) +{ + st->flags = 0; + if(!st->sp) + st->sp = malloc(STACKSIZE); + if(!st->sp) return -1; + thr_create(st->sp, STACKSIZE, thread_wrapper, st, THR_NEW_LWP, &st->id); + return 0; +} + +/* Wait for one of several subthreads to finish. */ +static void +wait_for_thread(struct thread_st st[], int n_thr, + int (*end_thr)(struct thread_st*)) +{ + int i; + thread_t id; + + thr_join(0, &id, NULL); + for(i=0; i. + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that (i) the above copyright notices and this permission +notice appear in all copies of the software and related documentation, +and (ii) the name of Wolfram Gloger may not be used in any advertising +or publicity relating to the software. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL WOLFRAM GLOGER BE LIABLE FOR ANY SPECIAL, +INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY +OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef _SPROC_MALLOC_MACHINE_H +#define _SPROC_MALLOC_MACHINE_H + +#include +#include +#include +#include + +typedef abilock_t mutex_t; + +#define MUTEX_INITIALIZER { 0 } +#define mutex_init(m) init_lock(m) +#define mutex_lock(m) (spin_lock(m), 0) +#define mutex_trylock(m) acquire_lock(m) +#define mutex_unlock(m) release_lock(m) + +typedef int tsd_key_t; +int tsd_key_next; +#define tsd_key_create(key, destr) ((*key) = tsd_key_next++) +#define tsd_setspecific(key, data) (((void **)(&PRDA->usr_prda))[key] = data) +#define tsd_getspecific(key, vptr) (vptr = ((void **)(&PRDA->usr_prda))[key]) + +#define thread_atfork(prepare, parent, child) do {} while(0) + +#include + +#endif /* !defined(_SPROC_MALLOC_MACHINE_H) */ diff --git a/src/3rdparty/ptmalloc/sysdeps/sproc/thread-st.h b/src/3rdparty/ptmalloc/sysdeps/sproc/thread-st.h new file mode 100644 index 0000000000..3559a48454 --- /dev/null +++ b/src/3rdparty/ptmalloc/sysdeps/sproc/thread-st.h @@ -0,0 +1,85 @@ +/* + * $Id:$ + * sproc version + * by Wolfram Gloger 2001, 2004, 2006 + */ + +#include +#include +#include +#include + +#ifndef STACKSIZE +#define STACKSIZE 32768 +#endif + +struct thread_st { + char *sp; /* stack pointer, can be 0 */ + void (*func)(struct thread_st* st); /* must be set by user */ + int id; + int flags; + struct user_data u; +}; + +static void +thread_init(void) +{ + printf("Using sproc() threads.\n"); +} + +static void +thread_wrapper(void *ptr, size_t stack_len) +{ + struct thread_st *st = (struct thread_st*)ptr; + + /*printf("begin %p\n", st->sp);*/ + st->func(st); + /*printf("end %p\n", st->sp);*/ +} + +/* Create a thread. */ +static int +thread_create(struct thread_st *st) +{ + st->flags = 0; + if(!st->sp) + st->sp = malloc(STACKSIZE); + if(!st->sp) return -1; + st->id = sprocsp(thread_wrapper, PR_SALL, st, st->sp+STACKSIZE, STACKSIZE); + if(st->id < 0) { + return -1; + } + return 0; +} + +/* Wait for one of several subthreads to finish. */ +static void +wait_for_thread(struct thread_st st[], int n_thr, + int (*end_thr)(struct thread_st*)) +{ + int i; + int id; + + int status = 0; + id = wait(&status); + if(status != 0) { + if(WIFSIGNALED(status)) + printf("thread %id terminated by signal %d\n", + id, WTERMSIG(status)); + else + printf("thread %id exited with status %d\n", + id, WEXITSTATUS(status)); + } + for(i=0; i +*/ +#include + +#ifdef Q_CC_MSVC +# include +#endif + +QT_BEGIN_NAMESPACE + +// Test Vectors (from FIPS PUB 180-1) +// +// SHA1("abc") = +// A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +// +// SHA1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = +// 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +// +// SHA1(A million repetitions of "a") = +// 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +// + + +// #define or #undef this, if you want the to wipe all +// temporary variables after processing +#define SHA1_WIPE_VARIABLES + + +struct Sha1State +{ + quint32 h0; + quint32 h1; + quint32 h2; + quint32 h3; + quint32 h4; + + quint64 messageSize; + unsigned char buffer[64]; +}; + + +typedef union +{ + quint8 bytes[64]; + quint32 words[16]; +} Sha1Chunk; + +static inline quint32 rol32(quint32 value, unsigned int shift) +{ +#ifdef Q_CC_MSVC + return _rotl(value, shift); +#else + return ((value << shift) | (value >> (32 - shift))); +#endif +} + +static inline quint32 sha1Word(Sha1Chunk *chunk, const uint position) +{ + return (chunk->words[position & 0xf] = rol32( chunk->words[(position+13) & 0xf] + ^ chunk->words[(position+ 8) & 0xf] + ^ chunk->words[(position+ 2) & 0xf] + ^ chunk->words[(position) & 0xf], 1)); +} + +static inline void sha1Round0(Sha1Chunk *chunk, const uint position, + quint32 &v, quint32 &w, quint32 &x, quint32 &y, quint32 &z) +{ + z += ((( w & (x ^ y)) ^ y) + chunk->words[position] + 0x5A827999 + rol32(v, 5)); + w = rol32(w, 30); +} + +static inline void sha1Round1(Sha1Chunk *chunk, const uint position, + quint32 &v, quint32 &w, quint32 &x, quint32 &y, quint32 &z) +{ + z += ((( w & (x ^ y)) ^ y) + sha1Word(chunk,position) + 0x5A827999 + rol32(v, 5)); + w = rol32(w, 30); +} + +static inline void sha1Round2(Sha1Chunk *chunk, const uint position, + quint32 &v, quint32 &w, quint32 &x, quint32 &y, quint32 &z) +{ + z += (( w ^ x ^ y) + sha1Word(chunk, position) + 0x6ED9EBA1 + rol32(v, 5)); + w = rol32(w, 30); +} + +static inline void sha1Round3(Sha1Chunk *chunk, const uint position, + quint32 &v, quint32 &w, quint32 &x, quint32 &y, quint32 &z) +{ + z += (((( w | x) & y) | (w & x)) + sha1Word(chunk, position) + 0x8F1BBCDC + rol32(v, 5)); + w = rol32(w, 30); +} + +static inline void sha1Round4(Sha1Chunk *chunk, const uint position, + quint32 &v, quint32 &w, quint32 &x, quint32 &y, quint32 &z) +{ + z += ((w ^ x ^ y) + sha1Word(chunk, position) + 0xCA62C1D6 + rol32(v, 5)); + w = rol32(w, 30); +} + +static inline void sha1ProcessChunk(Sha1State *state, const unsigned char *buffer) +{ + // Copy state[] to working vars + quint32 a = state->h0; + quint32 b = state->h1; + quint32 c = state->h2; + quint32 d = state->h3; + quint32 e = state->h4; + + quint8 chunkBuffer[64]; + memcpy(chunkBuffer, buffer, 64); + + Sha1Chunk *chunk = reinterpret_cast(&chunkBuffer); + + for (int i = 0; i < 16; ++i) + chunk->words[i] = qFromBigEndian(chunk->words[i]); + + sha1Round0(chunk, 0, a,b,c,d,e); sha1Round0(chunk, 1, e,a,b,c,d); sha1Round0(chunk, 2, d,e,a,b,c); sha1Round0(chunk, 3, c,d,e,a,b); + sha1Round0(chunk, 4, b,c,d,e,a); sha1Round0(chunk, 5, a,b,c,d,e); sha1Round0(chunk, 6, e,a,b,c,d); sha1Round0(chunk, 7, d,e,a,b,c); + sha1Round0(chunk, 8, c,d,e,a,b); sha1Round0(chunk, 9, b,c,d,e,a); sha1Round0(chunk, 10, a,b,c,d,e); sha1Round0(chunk, 11, e,a,b,c,d); + sha1Round0(chunk, 12, d,e,a,b,c); sha1Round0(chunk, 13, c,d,e,a,b); sha1Round0(chunk, 14, b,c,d,e,a); sha1Round0(chunk, 15, a,b,c,d,e); + sha1Round1(chunk, 16, e,a,b,c,d); sha1Round1(chunk, 17, d,e,a,b,c); sha1Round1(chunk, 18, c,d,e,a,b); sha1Round1(chunk, 19, b,c,d,e,a); + sha1Round2(chunk, 20, a,b,c,d,e); sha1Round2(chunk, 21, e,a,b,c,d); sha1Round2(chunk, 22, d,e,a,b,c); sha1Round2(chunk, 23, c,d,e,a,b); + sha1Round2(chunk, 24, b,c,d,e,a); sha1Round2(chunk, 25, a,b,c,d,e); sha1Round2(chunk, 26, e,a,b,c,d); sha1Round2(chunk, 27, d,e,a,b,c); + sha1Round2(chunk, 28, c,d,e,a,b); sha1Round2(chunk, 29, b,c,d,e,a); sha1Round2(chunk, 30, a,b,c,d,e); sha1Round2(chunk, 31, e,a,b,c,d); + sha1Round2(chunk, 32, d,e,a,b,c); sha1Round2(chunk, 33, c,d,e,a,b); sha1Round2(chunk, 34, b,c,d,e,a); sha1Round2(chunk, 35, a,b,c,d,e); + sha1Round2(chunk, 36, e,a,b,c,d); sha1Round2(chunk, 37, d,e,a,b,c); sha1Round2(chunk, 38, c,d,e,a,b); sha1Round2(chunk, 39, b,c,d,e,a); + sha1Round3(chunk, 40, a,b,c,d,e); sha1Round3(chunk, 41, e,a,b,c,d); sha1Round3(chunk, 42, d,e,a,b,c); sha1Round3(chunk, 43, c,d,e,a,b); + sha1Round3(chunk, 44, b,c,d,e,a); sha1Round3(chunk, 45, a,b,c,d,e); sha1Round3(chunk, 46, e,a,b,c,d); sha1Round3(chunk, 47, d,e,a,b,c); + sha1Round3(chunk, 48, c,d,e,a,b); sha1Round3(chunk, 49, b,c,d,e,a); sha1Round3(chunk, 50, a,b,c,d,e); sha1Round3(chunk, 51, e,a,b,c,d); + sha1Round3(chunk, 52, d,e,a,b,c); sha1Round3(chunk, 53, c,d,e,a,b); sha1Round3(chunk, 54, b,c,d,e,a); sha1Round3(chunk, 55, a,b,c,d,e); + sha1Round3(chunk, 56, e,a,b,c,d); sha1Round3(chunk, 57, d,e,a,b,c); sha1Round3(chunk, 58, c,d,e,a,b); sha1Round3(chunk, 59, b,c,d,e,a); + sha1Round4(chunk, 60, a,b,c,d,e); sha1Round4(chunk, 61, e,a,b,c,d); sha1Round4(chunk, 62, d,e,a,b,c); sha1Round4(chunk, 63, c,d,e,a,b); + sha1Round4(chunk, 64, b,c,d,e,a); sha1Round4(chunk, 65, a,b,c,d,e); sha1Round4(chunk, 66, e,a,b,c,d); sha1Round4(chunk, 67, d,e,a,b,c); + sha1Round4(chunk, 68, c,d,e,a,b); sha1Round4(chunk, 69, b,c,d,e,a); sha1Round4(chunk, 70, a,b,c,d,e); sha1Round4(chunk, 71, e,a,b,c,d); + sha1Round4(chunk, 72, d,e,a,b,c); sha1Round4(chunk, 73, c,d,e,a,b); sha1Round4(chunk, 74, b,c,d,e,a); sha1Round4(chunk, 75, a,b,c,d,e); + sha1Round4(chunk, 76, e,a,b,c,d); sha1Round4(chunk, 77, d,e,a,b,c); sha1Round4(chunk, 78, c,d,e,a,b); sha1Round4(chunk, 79, b,c,d,e,a); + + // Add the working vars back into state + state->h0 += a; + state->h1 += b; + state->h2 += c; + state->h3 += d; + state->h4 += e; + + // Wipe variables +#ifdef SHA1_WIPE_VARIABLES + a = b = c = d = e = 0; + memset(chunkBuffer, 0, 64); +#endif +} + +static inline void sha1InitState(Sha1State *state) +{ + state->h0 = 0x67452301; + state->h1 = 0xEFCDAB89; + state->h2 = 0x98BADCFE; + state->h3 = 0x10325476; + state->h4 = 0xC3D2E1F0; + + state->messageSize = 0; +} + +static inline void sha1Update(Sha1State *state, const unsigned char *data, qint64 len) +{ + quint32 rest = static_cast(state->messageSize & Q_UINT64_C(63)); + + quint64 availableData = static_cast(len) + static_cast(rest); + state->messageSize += len; + + if (availableData < Q_UINT64_C(64)) { + memcpy(&state->buffer[rest], &data[0], len); + + } else { + qint64 i = static_cast(64 - rest); + memcpy(&state->buffer[rest], &data[0], static_cast(i)); + sha1ProcessChunk(state, state->buffer); + + qint64 lastI = len - ((len + rest) & Q_INT64_C(63)); + for( ; i < lastI; i += 64) + sha1ProcessChunk(state, &data[i]); + + memcpy(&state->buffer[0], &data[i], len - i); + } +} + +static inline void sha1FinalizeState(Sha1State *state) +{ + quint64 messageSize = state->messageSize; + unsigned char sizeInBits[8]; + qToBigEndian(messageSize << 3, sizeInBits); + + sha1Update(state, (const unsigned char *)"\200", 1); + + unsigned char zero[64]; + memset(zero, 0, 64); + if (static_cast(messageSize & 63) > 56 - 1) { + sha1Update(state, zero, 64 - 1 - static_cast(messageSize & 63)); + sha1Update(state, zero, 64 - 8); + } else { + sha1Update(state, zero, 64 - 1 - 8 - static_cast(messageSize & 63)); + } + + sha1Update(state, sizeInBits, 8); +#ifdef SHA1_WIPE_VARIABLES + memset(state->buffer, 0, 64); + memset(zero, 0, 64); + state->messageSize = 0; +#endif +} + +static inline void sha1ToHash(Sha1State *state, unsigned char* buffer) +{ + qToBigEndian(state->h0, buffer); + qToBigEndian(state->h1, buffer + 4); + qToBigEndian(state->h2, buffer + 8); + qToBigEndian(state->h3, buffer + 12); + qToBigEndian(state->h4, buffer + 16); +} + +QT_END_NAMESPACE diff --git a/src/3rdparty/sqlite.pri b/src/3rdparty/sqlite.pri new file mode 100644 index 0000000000..575412da09 --- /dev/null +++ b/src/3rdparty/sqlite.pri @@ -0,0 +1,4 @@ +CONFIG(release, debug|release):DEFINES *= NDEBUG +DEFINES += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE +INCLUDEPATH += $$PWD/sqlite +SOURCES += $$PWD/sqlite/sqlite3.c diff --git a/src/3rdparty/sqlite/shell.c b/src/3rdparty/sqlite/shell.c new file mode 100644 index 0000000000..99f8f95adc --- /dev/null +++ b/src/3rdparty/sqlite/shell.c @@ -0,0 +1,2093 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code to implement the "sqlite" command line +** utility for accessing SQLite databases. +** +** $Id: shell.c,v 1.178 2008/05/05 16:27:24 drh Exp $ +*/ +#include +#include +#include +#include +#include "sqlite3.h" +#include +#include + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) +# include +# include +# include +# include +#endif + +#ifdef __OS2__ +# include +#endif + +#if defined(HAVE_READLINE) && HAVE_READLINE==1 +# include +# include +#else +# define readline(p) local_getline(p,stdin) +# define add_history(X) +# define read_history(X) +# define write_history(X) +# define stifle_history(X) +#endif + +#if defined(_WIN32) || defined(WIN32) +# include +#else +/* Make sure isatty() has a prototype. +*/ +extern int isatty(); +#endif + +#if defined(_WIN32_WCE) +/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() + * thus we always assume that we have a console. That can be + * overridden with the -batch command line option. + */ +#define isatty(x) 1 +#endif + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) +#include +#include + +/* Saved resource information for the beginning of an operation */ +static struct rusage sBegin; + +/* True if the timer is enabled */ +static int enableTimer = 0; + +/* +** Begin timing an operation +*/ +static void beginTimer(void){ + if( enableTimer ){ + getrusage(RUSAGE_SELF, &sBegin); + } +} + +/* Return the difference of two time_structs in microseconds */ +static int timeDiff(struct timeval *pStart, struct timeval *pEnd){ + return (pEnd->tv_usec - pStart->tv_usec) + + 1000000*(pEnd->tv_sec - pStart->tv_sec); +} + +/* +** Print the timing results. +*/ +static void endTimer(void){ + if( enableTimer ){ + struct rusage sEnd; + getrusage(RUSAGE_SELF, &sEnd); + printf("CPU Time: user %f sys %f\n", + 0.000001*timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), + 0.000001*timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); + } +} +#define BEGIN_TIMER beginTimer() +#define END_TIMER endTimer() +#define HAS_TIMER 1 +#else +#define BEGIN_TIMER +#define END_TIMER +#define HAS_TIMER 0 +#endif + + +/* +** If the following flag is set, then command execution stops +** at an error if we are not interactive. +*/ +static int bail_on_error = 0; + +/* +** Threat stdin as an interactive input if the following variable +** is true. Otherwise, assume stdin is connected to a file or pipe. +*/ +static int stdin_is_interactive = 1; + +/* +** The following is the open SQLite database. We make a pointer +** to this database a static variable so that it can be accessed +** by the SIGINT handler to interrupt database processing. +*/ +static sqlite3 *db = 0; + +/* +** True if an interrupt (Control-C) has been received. +*/ +static volatile int seenInterrupt = 0; + +/* +** This is the name of our program. It is set in main(), used +** in a number of other places, mostly for error messages. +*/ +static char *Argv0; + +/* +** Prompt strings. Initialized in main. Settable with +** .prompt main continue +*/ +static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ +static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ + +/* +** Write I/O traces to the following stream. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +static FILE *iotrace = 0; +#endif + +/* +** This routine works like printf in that its first argument is a +** format string and subsequent arguments are values to be substituted +** in place of % fields. The result of formatting this string +** is written to iotrace. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +static void iotracePrintf(const char *zFormat, ...){ + va_list ap; + char *z; + if( iotrace==0 ) return; + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + fprintf(iotrace, "%s", z); + sqlite3_free(z); +} +#endif + + +/* +** Determines if a string is a number of not. +*/ +static int isNumber(const char *z, int *realnum){ + if( *z=='-' || *z=='+' ) z++; + if( !isdigit(*z) ){ + return 0; + } + z++; + if( realnum ) *realnum = 0; + while( isdigit(*z) ){ z++; } + if( *z=='.' ){ + z++; + if( !isdigit(*z) ) return 0; + while( isdigit(*z) ){ z++; } + if( realnum ) *realnum = 1; + } + if( *z=='e' || *z=='E' ){ + z++; + if( *z=='+' || *z=='-' ) z++; + if( !isdigit(*z) ) return 0; + while( isdigit(*z) ){ z++; } + if( realnum ) *realnum = 1; + } + return *z==0; +} + +/* +** A global char* and an SQL function to access its current value +** from within an SQL statement. This program used to use the +** sqlite_exec_printf() API to substitue a string into an SQL statement. +** The correct way to do this with sqlite3 is to use the bind API, but +** since the shell is built around the callback paradigm it would be a lot +** of work. Instead just use this hack, which is quite harmless. +*/ +static const char *zShellStatic = 0; +static void shellstaticFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( 0==argc ); + assert( zShellStatic ); + sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC); +} + + +/* +** This routine reads a line of text from FILE in, stores +** the text in memory obtained from malloc() and returns a pointer +** to the text. NULL is returned at end of file, or if malloc() +** fails. +** +** The interface is like "readline" but no command-line editing +** is done. +*/ +static char *local_getline(char *zPrompt, FILE *in){ + char *zLine; + int nLine; + int n; + int eol; + + if( zPrompt && *zPrompt ){ + printf("%s",zPrompt); + fflush(stdout); + } + nLine = 100; + zLine = malloc( nLine ); + if( zLine==0 ) return 0; + n = 0; + eol = 0; + while( !eol ){ + if( n+100>nLine ){ + nLine = nLine*2 + 100; + zLine = realloc(zLine, nLine); + if( zLine==0 ) return 0; + } + if( fgets(&zLine[n], nLine - n, in)==0 ){ + if( n==0 ){ + free(zLine); + return 0; + } + zLine[n] = 0; + eol = 1; + break; + } + while( zLine[n] ){ n++; } + if( n>0 && zLine[n-1]=='\n' ){ + n--; + zLine[n] = 0; + eol = 1; + } + } + zLine = realloc( zLine, n+1 ); + return zLine; +} + +/* +** Retrieve a single line of input text. +** +** zPrior is a string of prior text retrieved. If not the empty +** string, then issue a continuation prompt. +*/ +static char *one_input_line(const char *zPrior, FILE *in){ + char *zPrompt; + char *zResult; + if( in!=0 ){ + return local_getline(0, in); + } + if( zPrior && zPrior[0] ){ + zPrompt = continuePrompt; + }else{ + zPrompt = mainPrompt; + } + zResult = readline(zPrompt); +#if defined(HAVE_READLINE) && HAVE_READLINE==1 + if( zResult && *zResult ) add_history(zResult); +#endif + return zResult; +} + +struct previous_mode_data { + int valid; /* Is there legit data in here? */ + int mode; + int showHeader; + int colWidth[100]; +}; + +/* +** An pointer to an instance of this structure is passed from +** the main program to the callback. This is used to communicate +** state and mode information. +*/ +struct callback_data { + sqlite3 *db; /* The database */ + int echoOn; /* True to echo input commands */ + int cnt; /* Number of records displayed so far */ + FILE *out; /* Write results here */ + int mode; /* An output mode setting */ + int writableSchema; /* True if PRAGMA writable_schema=ON */ + int showHeader; /* True to show column names in List or Column mode */ + char *zDestTable; /* Name of destination table when MODE_Insert */ + char separator[20]; /* Separator character for MODE_List */ + int colWidth[100]; /* Requested width of each column when in column mode*/ + int actualWidth[100]; /* Actual width of each column */ + char nullvalue[20]; /* The text to print when a NULL comes back from + ** the database */ + struct previous_mode_data explainPrev; + /* Holds the mode information just before + ** .explain ON */ + char outfile[FILENAME_MAX]; /* Filename for *out */ + const char *zDbFilename; /* name of the database file */ +}; + +/* +** These are the allowed modes. +*/ +#define MODE_Line 0 /* One column per line. Blank line between records */ +#define MODE_Column 1 /* One record per line in neat columns */ +#define MODE_List 2 /* One record per line with a separator */ +#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ +#define MODE_Html 4 /* Generate an XHTML table */ +#define MODE_Insert 5 /* Generate SQL "insert" statements */ +#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */ +#define MODE_Csv 7 /* Quote strings, numbers are plain */ +#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */ + +static const char *modeDescr[] = { + "line", + "column", + "list", + "semi", + "html", + "insert", + "tcl", + "csv", + "explain", +}; + +/* +** Number of elements in an array +*/ +#define ArraySize(X) (sizeof(X)/sizeof(X[0])) + +/* +** Output the given string as a quoted string using SQL quoting conventions. +*/ +static void output_quoted_string(FILE *out, const char *z){ + int i; + int nSingle = 0; + for(i=0; z[i]; i++){ + if( z[i]=='\'' ) nSingle++; + } + if( nSingle==0 ){ + fprintf(out,"'%s'",z); + }else{ + fprintf(out,"'"); + while( *z ){ + for(i=0; z[i] && z[i]!='\''; i++){} + if( i==0 ){ + fprintf(out,"''"); + z++; + }else if( z[i]=='\'' ){ + fprintf(out,"%.*s''",i,z); + z += i+1; + }else{ + fprintf(out,"%s",z); + break; + } + } + fprintf(out,"'"); + } +} + +/* +** Output the given string as a quoted according to C or TCL quoting rules. +*/ +static void output_c_string(FILE *out, const char *z){ + unsigned int c; + fputc('"', out); + while( (c = *(z++))!=0 ){ + if( c=='\\' ){ + fputc(c, out); + fputc(c, out); + }else if( c=='\t' ){ + fputc('\\', out); + fputc('t', out); + }else if( c=='\n' ){ + fputc('\\', out); + fputc('n', out); + }else if( c=='\r' ){ + fputc('\\', out); + fputc('r', out); + }else if( !isprint(c) ){ + fprintf(out, "\\%03o", c&0xff); + }else{ + fputc(c, out); + } + } + fputc('"', out); +} + +/* +** Output the given string with characters that are special to +** HTML escaped. +*/ +static void output_html_string(FILE *out, const char *z){ + int i; + while( *z ){ + for(i=0; z[i] && z[i]!='<' && z[i]!='&'; i++){} + if( i>0 ){ + fprintf(out,"%.*s",i,z); + } + if( z[i]=='<' ){ + fprintf(out,"<"); + }else if( z[i]=='&' ){ + fprintf(out,"&"); + }else{ + break; + } + z += i + 1; + } +} + +/* +** If a field contains any character identified by a 1 in the following +** array, then the string must be quoted for CSV. +*/ +static const char needCsvQuote[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; + +/* +** Output a single term of CSV. Actually, p->separator is used for +** the separator, which may or may not be a comma. p->nullvalue is +** the null value. Strings are quoted using ANSI-C rules. Numbers +** appear outside of quotes. +*/ +static void output_csv(struct callback_data *p, const char *z, int bSep){ + FILE *out = p->out; + if( z==0 ){ + fprintf(out,"%s",p->nullvalue); + }else{ + int i; + int nSep = strlen(p->separator); + for(i=0; z[i]; i++){ + if( needCsvQuote[((unsigned char*)z)[i]] + || (z[i]==p->separator[0] && + (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){ + i = 0; + break; + } + } + if( i==0 ){ + putc('"', out); + for(i=0; z[i]; i++){ + if( z[i]=='"' ) putc('"', out); + putc(z[i], out); + } + putc('"', out); + }else{ + fprintf(out, "%s", z); + } + } + if( bSep ){ + fprintf(p->out, "%s", p->separator); + } +} + +#ifdef SIGINT +/* +** This routine runs when the user presses Ctrl-C +*/ +static void interrupt_handler(int NotUsed){ + seenInterrupt = 1; + if( db ) sqlite3_interrupt(db); +} +#endif + +/* +** This is the callback routine that the SQLite library +** invokes for each row of a query result. +*/ +static int callback(void *pArg, int nArg, char **azArg, char **azCol){ + int i; + struct callback_data *p = (struct callback_data*)pArg; + switch( p->mode ){ + case MODE_Line: { + int w = 5; + if( azArg==0 ) break; + for(i=0; iw ) w = len; + } + if( p->cnt++>0 ) fprintf(p->out,"\n"); + for(i=0; iout,"%*s = %s\n", w, azCol[i], + azArg[i] ? azArg[i] : p->nullvalue); + } + break; + } + case MODE_Explain: + case MODE_Column: { + if( p->cnt++==0 ){ + for(i=0; icolWidth) ){ + w = p->colWidth[i]; + }else{ + w = 0; + } + if( w<=0 ){ + w = strlen(azCol[i] ? azCol[i] : ""); + if( w<10 ) w = 10; + n = strlen(azArg && azArg[i] ? azArg[i] : p->nullvalue); + if( wactualWidth) ){ + p->actualWidth[i] = w; + } + if( p->showHeader ){ + fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " "); + } + } + if( p->showHeader ){ + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + }else{ + w = 10; + } + fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------" + "----------------------------------------------------------", + i==nArg-1 ? "\n": " "); + } + } + } + if( azArg==0 ) break; + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + }else{ + w = 10; + } + if( p->mode==MODE_Explain && azArg[i] && strlen(azArg[i])>w ){ + w = strlen(azArg[i]); + } + fprintf(p->out,"%-*.*s%s",w,w, + azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " "); + } + break; + } + case MODE_Semi: + case MODE_List: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator); + } + } + if( azArg==0 ) break; + for(i=0; inullvalue; + fprintf(p->out, "%s", z); + if( iout, "%s", p->separator); + }else if( p->mode==MODE_Semi ){ + fprintf(p->out, ";\n"); + }else{ + fprintf(p->out, "\n"); + } + } + break; + } + case MODE_Html: { + if( p->cnt++==0 && p->showHeader ){ + fprintf(p->out,""); + for(i=0; iout,"%s",azCol[i]); + } + fprintf(p->out,"\n"); + } + if( azArg==0 ) break; + fprintf(p->out,""); + for(i=0; iout,""); + output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue); + fprintf(p->out,"\n"); + } + fprintf(p->out,"\n"); + break; + } + case MODE_Tcl: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,azCol[i] ? azCol[i] : ""); + fprintf(p->out, "%s", p->separator); + } + fprintf(p->out,"\n"); + } + if( azArg==0 ) break; + for(i=0; iout, azArg[i] ? azArg[i] : p->nullvalue); + fprintf(p->out, "%s", p->separator); + } + fprintf(p->out,"\n"); + break; + } + case MODE_Csv: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,"\n"); + } + if( azArg==0 ) break; + for(i=0; iout,"\n"); + break; + } + case MODE_Insert: { + if( azArg==0 ) break; + fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable); + for(i=0; i0 ? ",": ""; + if( azArg[i]==0 ){ + fprintf(p->out,"%sNULL",zSep); + }else if( isNumber(azArg[i], 0) ){ + fprintf(p->out,"%s%s",zSep, azArg[i]); + }else{ + if( zSep[0] ) fprintf(p->out,"%s",zSep); + output_quoted_string(p->out, azArg[i]); + } + } + fprintf(p->out,");\n"); + break; + } + } + return 0; +} + +/* +** Set the destination table field of the callback_data structure to +** the name of the table given. Escape any quote characters in the +** table name. +*/ +static void set_table_name(struct callback_data *p, const char *zName){ + int i, n; + int needQuote; + char *z; + + if( p->zDestTable ){ + free(p->zDestTable); + p->zDestTable = 0; + } + if( zName==0 ) return; + needQuote = !isalpha((unsigned char)*zName) && *zName!='_'; + for(i=n=0; zName[i]; i++, n++){ + if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){ + needQuote = 1; + if( zName[i]=='\'' ) n++; + } + } + if( needQuote ) n += 2; + z = p->zDestTable = malloc( n+1 ); + if( z==0 ){ + fprintf(stderr,"Out of memory!\n"); + exit(1); + } + n = 0; + if( needQuote ) z[n++] = '\''; + for(i=0; zName[i]; i++){ + z[n++] = zName[i]; + if( zName[i]=='\'' ) z[n++] = '\''; + } + if( needQuote ) z[n++] = '\''; + z[n] = 0; +} + +/* zIn is either a pointer to a NULL-terminated string in memory obtained +** from malloc(), or a NULL pointer. The string pointed to by zAppend is +** added to zIn, and the result returned in memory obtained from malloc(). +** zIn, if it was not NULL, is freed. +** +** If the third argument, quote, is not '\0', then it is used as a +** quote character for zAppend. +*/ +static char *appendText(char *zIn, char const *zAppend, char quote){ + int len; + int i; + int nAppend = strlen(zAppend); + int nIn = (zIn?strlen(zIn):0); + + len = nAppend+nIn+1; + if( quote ){ + len += 2; + for(i=0; iout, "DELETE FROM sqlite_sequence;\n"); + }else if( strcmp(zTable, "sqlite_stat1")==0 ){ + fprintf(p->out, "ANALYZE sqlite_master;\n"); + }else if( strncmp(zTable, "sqlite_", 7)==0 ){ + return 0; + }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ + char *zIns; + if( !p->writableSchema ){ + fprintf(p->out, "PRAGMA writable_schema=ON;\n"); + p->writableSchema = 1; + } + zIns = sqlite3_mprintf( + "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)" + "VALUES('table','%q','%q',0,'%q');", + zTable, zTable, zSql); + fprintf(p->out, "%s\n", zIns); + sqlite3_free(zIns); + return 0; + }else{ + fprintf(p->out, "%s;\n", zSql); + } + + if( strcmp(zType, "table")==0 ){ + sqlite3_stmt *pTableInfo = 0; + char *zSelect = 0; + char *zTableInfo = 0; + char *zTmp = 0; + + zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0); + zTableInfo = appendText(zTableInfo, zTable, '"'); + zTableInfo = appendText(zTableInfo, ");", 0); + + rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0); + if( zTableInfo ) free(zTableInfo); + if( rc!=SQLITE_OK || !pTableInfo ){ + return 1; + } + + zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0); + zTmp = appendText(zTmp, zTable, '"'); + if( zTmp ){ + zSelect = appendText(zSelect, zTmp, '\''); + } + zSelect = appendText(zSelect, " || ' VALUES(' || ", 0); + rc = sqlite3_step(pTableInfo); + while( rc==SQLITE_ROW ){ + const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1); + zSelect = appendText(zSelect, "quote(", 0); + zSelect = appendText(zSelect, zText, '"'); + rc = sqlite3_step(pTableInfo); + if( rc==SQLITE_ROW ){ + zSelect = appendText(zSelect, ") || ',' || ", 0); + }else{ + zSelect = appendText(zSelect, ") ", 0); + } + } + rc = sqlite3_finalize(pTableInfo); + if( rc!=SQLITE_OK ){ + if( zSelect ) free(zSelect); + return 1; + } + zSelect = appendText(zSelect, "|| ')' FROM ", 0); + zSelect = appendText(zSelect, zTable, '"'); + + rc = run_table_dump_query(p->out, p->db, zSelect); + if( rc==SQLITE_CORRUPT ){ + zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0); + rc = run_table_dump_query(p->out, p->db, zSelect); + } + if( zSelect ) free(zSelect); + } + return 0; +} + +/* +** Run zQuery. Use dump_callback() as the callback routine so that +** the contents of the query are output as SQL statements. +** +** If we get a SQLITE_CORRUPT error, rerun the query after appending +** "ORDER BY rowid DESC" to the end. +*/ +static int run_schema_dump_query( + struct callback_data *p, + const char *zQuery, + char **pzErrMsg +){ + int rc; + rc = sqlite3_exec(p->db, zQuery, dump_callback, p, pzErrMsg); + if( rc==SQLITE_CORRUPT ){ + char *zQ2; + int len = strlen(zQuery); + if( pzErrMsg ) sqlite3_free(*pzErrMsg); + zQ2 = malloc( len+100 ); + if( zQ2==0 ) return rc; + sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery); + rc = sqlite3_exec(p->db, zQ2, dump_callback, p, pzErrMsg); + free(zQ2); + } + return rc; +} + +/* +** Text of a help message +*/ +static char zHelp[] = + ".bail ON|OFF Stop after hitting an error. Default OFF\n" + ".databases List names and files of attached databases\n" + ".dump ?TABLE? ... Dump the database in an SQL text format\n" + ".echo ON|OFF Turn command echo on or off\n" + ".exit Exit this program\n" + ".explain ON|OFF Turn output mode suitable for EXPLAIN on or off.\n" + ".header(s) ON|OFF Turn display of headers on or off\n" + ".help Show this message\n" + ".import FILE TABLE Import data from FILE into TABLE\n" + ".indices TABLE Show names of all indices on TABLE\n" +#ifdef SQLITE_ENABLE_IOTRACE + ".iotrace FILE Enable I/O diagnostic logging to FILE\n" +#endif +#ifndef SQLITE_OMIT_LOAD_EXTENSION + ".load FILE ?ENTRY? Load an extension library\n" +#endif + ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" + " csv Comma-separated values\n" + " column Left-aligned columns. (See .width)\n" + " html HTML code\n" + " insert SQL insert statements for TABLE\n" + " line One value per line\n" + " list Values delimited by .separator string\n" + " tabs Tab-separated values\n" + " tcl TCL list elements\n" + ".nullvalue STRING Print STRING in place of NULL values\n" + ".output FILENAME Send output to FILENAME\n" + ".output stdout Send output to the screen\n" + ".prompt MAIN CONTINUE Replace the standard prompts\n" + ".quit Exit this program\n" + ".read FILENAME Execute SQL in FILENAME\n" + ".schema ?TABLE? Show the CREATE statements\n" + ".separator STRING Change separator used by output mode and .import\n" + ".show Show the current values for various settings\n" + ".tables ?PATTERN? List names of tables matching a LIKE pattern\n" + ".timeout MS Try opening locked tables for MS milliseconds\n" +#if HAS_TIMER + ".timer ON|OFF Turn the CPU timer measurement on or off\n" +#endif + ".width NUM NUM ... Set column widths for \"column\" mode\n" +; + +/* Forward reference */ +static int process_input(struct callback_data *p, FILE *in); + +/* +** Make sure the database is open. If it is not, then open it. If +** the database fails to open, print an error message and exit. +*/ +static void open_db(struct callback_data *p){ + if( p->db==0 ){ + sqlite3_open(p->zDbFilename, &p->db); + db = p->db; + if( db && sqlite3_errcode(db)==SQLITE_OK ){ + sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, + shellstaticFunc, 0, 0); + } + if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){ + fprintf(stderr,"Unable to open database \"%s\": %s\n", + p->zDbFilename, sqlite3_errmsg(db)); + exit(1); + } +#ifndef SQLITE_OMIT_LOAD_EXTENSION + sqlite3_enable_load_extension(p->db, 1); +#endif + } +} + +/* +** Do C-language style dequoting. +** +** \t -> tab +** \n -> newline +** \r -> carriage return +** \NNN -> ascii character NNN in octal +** \\ -> backslash +*/ +static void resolve_backslashes(char *z){ + int i, j, c; + for(i=j=0; (c = z[i])!=0; i++, j++){ + if( c=='\\' ){ + c = z[++i]; + if( c=='n' ){ + c = '\n'; + }else if( c=='t' ){ + c = '\t'; + }else if( c=='r' ){ + c = '\r'; + }else if( c>='0' && c<='7' ){ + c -= '0'; + if( z[i+1]>='0' && z[i+1]<='7' ){ + i++; + c = (c<<3) + z[i] - '0'; + if( z[i+1]>='0' && z[i+1]<='7' ){ + i++; + c = (c<<3) + z[i] - '0'; + } + } + } + } + z[j] = c; + } + z[j] = 0; +} + +/* +** Interpret zArg as a boolean value. Return either 0 or 1. +*/ +static int booleanValue(char *zArg){ + int val = atoi(zArg); + int j; + for(j=0; zArg[j]; j++){ + zArg[j] = tolower(zArg[j]); + } + if( strcmp(zArg,"on")==0 ){ + val = 1; + }else if( strcmp(zArg,"yes")==0 ){ + val = 1; + } + return val; +} + +/* +** If an input line begins with "." then invoke this routine to +** process that line. +** +** Return 1 on error, 2 to exit, and 0 otherwise. +*/ +static int do_meta_command(char *zLine, struct callback_data *p){ + int i = 1; + int nArg = 0; + int n, c; + int rc = 0; + char *azArg[50]; + + /* Parse the input line into tokens. + */ + while( zLine[i] && nArg1 && strncmp(azArg[0], "bail", n)==0 && nArg>1 ){ + bail_on_error = booleanValue(azArg[1]); + }else + + if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 1; + data.mode = MODE_Column; + data.colWidth[0] = 3; + data.colWidth[1] = 15; + data.colWidth[2] = 58; + data.cnt = 0; + sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg); + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + }else + + if( c=='d' && strncmp(azArg[0], "dump", n)==0 ){ + char *zErrMsg = 0; + open_db(p); + fprintf(p->out, "BEGIN TRANSACTION;\n"); + p->writableSchema = 0; + if( nArg==1 ){ + run_schema_dump_query(p, + "SELECT name, type, sql FROM sqlite_master " + "WHERE sql NOT NULL AND type=='table'", 0 + ); + run_table_dump_query(p->out, p->db, + "SELECT sql FROM sqlite_master " + "WHERE sql NOT NULL AND type IN ('index','trigger','view')" + ); + }else{ + int i; + for(i=1; iout, p->db, + "SELECT sql FROM sqlite_master " + "WHERE sql NOT NULL" + " AND type IN ('index','trigger','view')" + " AND tbl_name LIKE shellstatic()" + ); + zShellStatic = 0; + } + } + if( p->writableSchema ){ + fprintf(p->out, "PRAGMA writable_schema=OFF;\n"); + p->writableSchema = 0; + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + }else{ + fprintf(p->out, "COMMIT;\n"); + } + }else + + if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 ){ + p->echoOn = booleanValue(azArg[1]); + }else + + if( c=='e' && strncmp(azArg[0], "exit", n)==0 ){ + rc = 2; + }else + + if( c=='e' && strncmp(azArg[0], "explain", n)==0 ){ + int val = nArg>=2 ? booleanValue(azArg[1]) : 1; + if(val == 1) { + if(!p->explainPrev.valid) { + p->explainPrev.valid = 1; + p->explainPrev.mode = p->mode; + p->explainPrev.showHeader = p->showHeader; + memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth)); + } + /* We could put this code under the !p->explainValid + ** condition so that it does not execute if we are already in + ** explain mode. However, always executing it allows us an easy + ** was to reset to explain mode in case the user previously + ** did an .explain followed by a .width, .mode or .header + ** command. + */ + p->mode = MODE_Explain; + p->showHeader = 1; + memset(p->colWidth,0,ArraySize(p->colWidth)); + p->colWidth[0] = 4; /* addr */ + p->colWidth[1] = 13; /* opcode */ + p->colWidth[2] = 4; /* P1 */ + p->colWidth[3] = 4; /* P2 */ + p->colWidth[4] = 4; /* P3 */ + p->colWidth[5] = 13; /* P4 */ + p->colWidth[6] = 2; /* P5 */ + p->colWidth[7] = 13; /* Comment */ + }else if (p->explainPrev.valid) { + p->explainPrev.valid = 0; + p->mode = p->explainPrev.mode; + p->showHeader = p->explainPrev.showHeader; + memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth)); + } + }else + + if( c=='h' && (strncmp(azArg[0], "header", n)==0 || + strncmp(azArg[0], "headers", n)==0 )&& nArg>1 ){ + p->showHeader = booleanValue(azArg[1]); + }else + + if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ + fprintf(stderr,zHelp); + }else + + if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg>=3 ){ + char *zTable = azArg[2]; /* Insert data into this table */ + char *zFile = azArg[1]; /* The file from which to extract data */ + sqlite3_stmt *pStmt; /* A statement */ + int rc; /* Result code */ + int nCol; /* Number of columns in the table */ + int nByte; /* Number of bytes in an SQL string */ + int i, j; /* Loop counters */ + int nSep; /* Number of bytes in p->separator[] */ + char *zSql; /* An SQL statement */ + char *zLine; /* A single line of input from the file */ + char **azCol; /* zLine[] broken up into columns */ + char *zCommit; /* How to commit changes */ + FILE *in; /* The input file */ + int lineno = 0; /* Line number of input file */ + + open_db(p); + nSep = strlen(p->separator); + if( nSep==0 ){ + fprintf(stderr, "non-null separator required for import\n"); + return 0; + } + zSql = sqlite3_mprintf("SELECT * FROM '%q'", zTable); + if( zSql==0 ) return 0; + nByte = strlen(zSql); + rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc ){ + fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); + nCol = 0; + rc = 1; + }else{ + nCol = sqlite3_column_count(pStmt); + } + sqlite3_finalize(pStmt); + if( nCol==0 ) return 0; + zSql = malloc( nByte + 20 + nCol*2 ); + if( zSql==0 ) return 0; + sqlite3_snprintf(nByte+20, zSql, "INSERT INTO '%q' VALUES(?", zTable); + j = strlen(zSql); + for(i=1; idb, zSql, -1, &pStmt, 0); + free(zSql); + if( rc ){ + fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(pStmt); + return 1; + } + in = fopen(zFile, "rb"); + if( in==0 ){ + fprintf(stderr, "cannot open file: %s\n", zFile); + sqlite3_finalize(pStmt); + return 0; + } + azCol = malloc( sizeof(azCol[0])*(nCol+1) ); + if( azCol==0 ){ + fclose(in); + return 0; + } + sqlite3_exec(p->db, "BEGIN", 0, 0, 0); + zCommit = "COMMIT"; + while( (zLine = local_getline(0, in))!=0 ){ + char *z; + i = 0; + lineno++; + azCol[0] = zLine; + for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){ + if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){ + *z = 0; + i++; + if( idb, zCommit, 0, 0, 0); + }else + + if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg>1 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.mode = MODE_List; + zShellStatic = azArg[1]; + sqlite3_exec(p->db, + "SELECT name FROM sqlite_master " + "WHERE type='index' AND tbl_name LIKE shellstatic() " + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type='index' AND tbl_name LIKE shellstatic() " + "ORDER BY 1", + callback, &data, &zErrMsg + ); + zShellStatic = 0; + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + }else + +#ifdef SQLITE_ENABLE_IOTRACE + if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ + extern void (*sqlite3IoTrace)(const char*, ...); + if( iotrace && iotrace!=stdout ) fclose(iotrace); + iotrace = 0; + if( nArg<2 ){ + sqlite3IoTrace = 0; + }else if( strcmp(azArg[1], "-")==0 ){ + sqlite3IoTrace = iotracePrintf; + iotrace = stdout; + }else{ + iotrace = fopen(azArg[1], "w"); + if( iotrace==0 ){ + fprintf(stderr, "cannot open \"%s\"\n", azArg[1]); + sqlite3IoTrace = 0; + }else{ + sqlite3IoTrace = iotracePrintf; + } + } + }else +#endif + +#ifndef SQLITE_OMIT_LOAD_EXTENSION + if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){ + const char *zFile, *zProc; + char *zErrMsg = 0; + int rc; + zFile = azArg[1]; + zProc = nArg>=3 ? azArg[2] : 0; + open_db(p); + rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); + if( rc!=SQLITE_OK ){ + fprintf(stderr, "%s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + } + }else +#endif + + if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg>=2 ){ + int n2 = strlen(azArg[1]); + if( strncmp(azArg[1],"line",n2)==0 + || + strncmp(azArg[1],"lines",n2)==0 ){ + p->mode = MODE_Line; + }else if( strncmp(azArg[1],"column",n2)==0 + || + strncmp(azArg[1],"columns",n2)==0 ){ + p->mode = MODE_Column; + }else if( strncmp(azArg[1],"list",n2)==0 ){ + p->mode = MODE_List; + }else if( strncmp(azArg[1],"html",n2)==0 ){ + p->mode = MODE_Html; + }else if( strncmp(azArg[1],"tcl",n2)==0 ){ + p->mode = MODE_Tcl; + }else if( strncmp(azArg[1],"csv",n2)==0 ){ + p->mode = MODE_Csv; + sqlite3_snprintf(sizeof(p->separator), p->separator, ","); + }else if( strncmp(azArg[1],"tabs",n2)==0 ){ + p->mode = MODE_List; + sqlite3_snprintf(sizeof(p->separator), p->separator, "\t"); + }else if( strncmp(azArg[1],"insert",n2)==0 ){ + p->mode = MODE_Insert; + if( nArg>=3 ){ + set_table_name(p, azArg[2]); + }else{ + set_table_name(p, "table"); + } + }else { + fprintf(stderr,"mode should be one of: " + "column csv html insert line list tabs tcl\n"); + } + }else + + if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) { + sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue, + "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); + }else + + if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ + if( p->out!=stdout ){ + fclose(p->out); + } + if( strcmp(azArg[1],"stdout")==0 ){ + p->out = stdout; + sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout"); + }else{ + p->out = fopen(azArg[1], "wb"); + if( p->out==0 ){ + fprintf(stderr,"can't write to \"%s\"\n", azArg[1]); + p->out = stdout; + } else { + sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]); + } + } + }else + + if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){ + if( nArg >= 2) { + strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); + } + if( nArg >= 3) { + strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); + } + }else + + if( c=='q' && strncmp(azArg[0], "quit", n)==0 ){ + rc = 2; + }else + + if( c=='r' && strncmp(azArg[0], "read", n)==0 && nArg==2 ){ + FILE *alt = fopen(azArg[1], "rb"); + if( alt==0 ){ + fprintf(stderr,"can't open \"%s\"\n", azArg[1]); + }else{ + process_input(p, alt); + fclose(alt); + } + }else + + if( c=='s' && strncmp(azArg[0], "schema", n)==0 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.mode = MODE_Semi; + if( nArg>1 ){ + int i; + for(i=0; azArg[1][i]; i++) azArg[1][i] = tolower(azArg[1][i]); + if( strcmp(azArg[1],"sqlite_master")==0 ){ + char *new_argv[2], *new_colv[2]; + new_argv[0] = "CREATE TABLE sqlite_master (\n" + " type text,\n" + " name text,\n" + " tbl_name text,\n" + " rootpage integer,\n" + " sql text\n" + ")"; + new_argv[1] = 0; + new_colv[0] = "sql"; + new_colv[1] = 0; + callback(&data, 1, new_argv, new_colv); + }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){ + char *new_argv[2], *new_colv[2]; + new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n" + " type text,\n" + " name text,\n" + " tbl_name text,\n" + " rootpage integer,\n" + " sql text\n" + ")"; + new_argv[1] = 0; + new_colv[0] = "sql"; + new_colv[1] = 0; + callback(&data, 1, new_argv, new_colv); + }else{ + zShellStatic = azArg[1]; + sqlite3_exec(p->db, + "SELECT sql FROM " + " (SELECT * FROM sqlite_master UNION ALL" + " SELECT * FROM sqlite_temp_master) " + "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL " + "ORDER BY substr(type,2,1), name", + callback, &data, &zErrMsg); + zShellStatic = 0; + } + }else{ + sqlite3_exec(p->db, + "SELECT sql FROM " + " (SELECT * FROM sqlite_master UNION ALL" + " SELECT * FROM sqlite_temp_master) " + "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" + "ORDER BY substr(type,2,1), name", + callback, &data, &zErrMsg + ); + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + }else + + if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){ + sqlite3_snprintf(sizeof(p->separator), p->separator, + "%.*s", (int)sizeof(p->separator)-1, azArg[1]); + }else + + if( c=='s' && strncmp(azArg[0], "show", n)==0){ + int i; + fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off"); + fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off"); + fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off"); + fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]); + fprintf(p->out,"%9.9s: ", "nullvalue"); + output_c_string(p->out, p->nullvalue); + fprintf(p->out, "\n"); + fprintf(p->out,"%9.9s: %s\n","output", + strlen(p->outfile) ? p->outfile : "stdout"); + fprintf(p->out,"%9.9s: ", "separator"); + output_c_string(p->out, p->separator); + fprintf(p->out, "\n"); + fprintf(p->out,"%9.9s: ","width"); + for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { + fprintf(p->out,"%d ",p->colWidth[i]); + } + fprintf(p->out,"\n"); + }else + + if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){ + char **azResult; + int nRow, rc; + char *zErrMsg; + open_db(p); + if( nArg==1 ){ + rc = sqlite3_get_table(p->db, + "SELECT name FROM sqlite_master " + "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'" + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type IN ('table','view') " + "ORDER BY 1", + &azResult, &nRow, 0, &zErrMsg + ); + }else{ + zShellStatic = azArg[1]; + rc = sqlite3_get_table(p->db, + "SELECT name FROM sqlite_master " + "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' " + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type IN ('table','view') AND name LIKE '%'||shellstatic()||'%' " + "ORDER BY 1", + &azResult, &nRow, 0, &zErrMsg + ); + zShellStatic = 0; + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + } + if( rc==SQLITE_OK ){ + int len, maxlen = 0; + int i, j; + int nPrintCol, nPrintRow; + for(i=1; i<=nRow; i++){ + if( azResult[i]==0 ) continue; + len = strlen(azResult[i]); + if( len>maxlen ) maxlen = len; + } + nPrintCol = 80/(maxlen+2); + if( nPrintCol<1 ) nPrintCol = 1; + nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; + for(i=0; i4 && strncmp(azArg[0], "timeout", n)==0 && nArg>=2 ){ + open_db(p); + sqlite3_busy_timeout(p->db, atoi(azArg[1])); + }else + +#if HAS_TIMER + if( c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 && nArg>1 ){ + enableTimer = booleanValue(azArg[1]); + }else +#endif + + if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ + int j; + assert( nArg<=ArraySize(azArg) ); + for(j=1; jcolWidth); j++){ + p->colWidth[j-1] = atoi(azArg[j]); + } + }else + + + { + fprintf(stderr, "unknown command or invalid arguments: " + " \"%s\". Enter \".help\" for help\n", azArg[0]); + } + + return rc; +} + +/* +** Return TRUE if a semicolon occurs anywhere in the first N characters +** of string z[]. +*/ +static int _contains_semicolon(const char *z, int N){ + int i; + for(i=0; iout); + free(zLine); + zLine = one_input_line(zSql, in); + if( zLine==0 ){ + break; /* We have reached EOF */ + } + if( seenInterrupt ){ + if( in!=0 ) break; + seenInterrupt = 0; + } + lineno++; + if( p->echoOn ) printf("%s\n", zLine); + if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue; + if( zLine && zLine[0]=='.' && nSql==0 ){ + rc = do_meta_command(zLine, p); + if( rc==2 ){ + break; + }else if( rc ){ + errCnt++; + } + continue; + } + if( _is_command_terminator(zLine) ){ + memcpy(zLine,";",2); + } + nSqlPrior = nSql; + if( zSql==0 ){ + int i; + for(i=0; zLine[i] && isspace((unsigned char)zLine[i]); i++){} + if( zLine[i]!=0 ){ + nSql = strlen(zLine); + zSql = malloc( nSql+1 ); + if( zSql==0 ){ + fprintf(stderr, "out of memory\n"); + exit(1); + } + memcpy(zSql, zLine, nSql+1); + startline = lineno; + } + }else{ + int len = strlen(zLine); + zSql = realloc( zSql, nSql + len + 2 ); + if( zSql==0 ){ + fprintf(stderr,"%s: out of memory!\n", Argv0); + exit(1); + } + zSql[nSql++] = '\n'; + memcpy(&zSql[nSql], zLine, len+1); + nSql += len; + } + if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) + && sqlite3_complete(zSql) ){ + p->cnt = 0; + open_db(p); + BEGIN_TIMER; + rc = sqlite3_exec(p->db, zSql, callback, p, &zErrMsg); + END_TIMER; + if( rc || zErrMsg ){ + char zPrefix[100]; + if( in!=0 || !stdin_is_interactive ){ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, + "SQL error near line %d:", startline); + }else{ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, "SQL error:"); + } + if( zErrMsg!=0 ){ + printf("%s %s\n", zPrefix, zErrMsg); + sqlite3_free(zErrMsg); + zErrMsg = 0; + }else{ + printf("%s %s\n", zPrefix, sqlite3_errmsg(p->db)); + } + errCnt++; + } + free(zSql); + zSql = 0; + nSql = 0; + } + } + if( zSql ){ + if( !_all_whitespace(zSql) ) printf("Incomplete SQL: %s\n", zSql); + free(zSql); + } + free(zLine); + return errCnt; +} + +/* +** Return a pathname which is the user's home directory. A +** 0 return indicates an error of some kind. Space to hold the +** resulting string is obtained from malloc(). The calling +** function should free the result. +*/ +static char *find_home_dir(void){ + char *home_dir = NULL; + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_WCE) + struct passwd *pwent; + uid_t uid = getuid(); + if( (pwent=getpwuid(uid)) != NULL) { + home_dir = pwent->pw_dir; + } +#endif + +#if defined(_WIN32_WCE) + /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() + */ + home_dir = strdup("/"); +#else + +#if defined(_WIN32) || defined(WIN32) || defined(__OS2__) + if (!home_dir) { + home_dir = getenv("USERPROFILE"); + } +#endif + + if (!home_dir) { + home_dir = getenv("HOME"); + } + +#if defined(_WIN32) || defined(WIN32) || defined(__OS2__) + if (!home_dir) { + char *zDrive, *zPath; + int n; + zDrive = getenv("HOMEDRIVE"); + zPath = getenv("HOMEPATH"); + if( zDrive && zPath ){ + n = strlen(zDrive) + strlen(zPath) + 1; + home_dir = malloc( n ); + if( home_dir==0 ) return 0; + sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); + return home_dir; + } + home_dir = "c:\\"; + } +#endif + +#endif /* !_WIN32_WCE */ + + if( home_dir ){ + int n = strlen(home_dir) + 1; + char *z = malloc( n ); + if( z ) memcpy(z, home_dir, n); + home_dir = z; + } + + return home_dir; +} + +/* +** Read input from the file given by sqliterc_override. Or if that +** parameter is NULL, take input from ~/.sqliterc +*/ +static void process_sqliterc( + struct callback_data *p, /* Configuration data */ + const char *sqliterc_override /* Name of config file. NULL to use default */ +){ + char *home_dir = NULL; + const char *sqliterc = sqliterc_override; + char *zBuf = 0; + FILE *in = NULL; + int nBuf; + + if (sqliterc == NULL) { + home_dir = find_home_dir(); + if( home_dir==0 ){ + fprintf(stderr,"%s: cannot locate your home directory!\n", Argv0); + return; + } + nBuf = strlen(home_dir) + 16; + zBuf = malloc( nBuf ); + if( zBuf==0 ){ + fprintf(stderr,"%s: out of memory!\n", Argv0); + exit(1); + } + sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir); + free(home_dir); + sqliterc = (const char*)zBuf; + } + in = fopen(sqliterc,"rb"); + if( in ){ + if( stdin_is_interactive ){ + printf("-- Loading resources from %s\n",sqliterc); + } + process_input(p,in); + fclose(in); + } + free(zBuf); + return; +} + +/* +** Show available command line options +*/ +static const char zOptions[] = + " -init filename read/process named file\n" + " -echo print commands before execution\n" + " -[no]header turn headers on or off\n" + " -bail stop after hitting an error\n" + " -interactive force interactive I/O\n" + " -batch force batch I/O\n" + " -column set output mode to 'column'\n" + " -csv set output mode to 'csv'\n" + " -html set output mode to HTML\n" + " -line set output mode to 'line'\n" + " -list set output mode to 'list'\n" + " -separator 'x' set output field separator (|)\n" + " -nullvalue 'text' set text string for NULL values\n" + " -version show SQLite version\n" +; +static void usage(int showDetail){ + fprintf(stderr, + "Usage: %s [OPTIONS] FILENAME [SQL]\n" + "FILENAME is the name of an SQLite database. A new database is created\n" + "if the file does not previously exist.\n", Argv0); + if( showDetail ){ + fprintf(stderr, "OPTIONS include:\n%s", zOptions); + }else{ + fprintf(stderr, "Use the -help option for additional information\n"); + } + exit(1); +} + +/* +** Initialize the state information in data +*/ +static void main_init(struct callback_data *data) { + memset(data, 0, sizeof(*data)); + data->mode = MODE_List; + memcpy(data->separator,"|", 2); + data->showHeader = 0; + sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); + sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); +} + +int main(int argc, char **argv){ + char *zErrMsg = 0; + struct callback_data data; + const char *zInitFile = 0; + char *zFirstCmd = 0; + int i; + int rc = 0; + + Argv0 = argv[0]; + main_init(&data); + stdin_is_interactive = isatty(0); + + /* Make sure we have a valid signal handler early, before anything + ** else is done. + */ +#ifdef SIGINT + signal(SIGINT, interrupt_handler); +#endif + + /* Do an initial pass through the command-line argument to locate + ** the name of the database file, the name of the initialization file, + ** and the first command to execute. + */ + for(i=1; i2GB file support on POSIX if the +** underlying operating system supports it. If the OS lacks +** large file support, or if the OS is windows, these should be no-ops. +** +** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any +** system #includes. Hence, this block of code must be the very first +** code in all source files. +** +** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch +** on the compiler command line. This is necessary if you are compiling +** on a recent machine (ex: Red Hat 7.2) but you want your code to work +** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 +** without this option, LFS is enable. But LFS does not exist in the kernel +** in Red Hat 6.0, so the code won't work. Hence, for maximum binary +** portability you should omit LFS. +** +** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +/* +** Include the configuration header output by 'configure' if we're using the +** autoconf-based build +*/ +#ifdef _HAVE_SQLITE_CONFIG_H +#include "config.h" +#endif + +/************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ +/************** Begin file sqliteLimit.h *************************************/ +/* +** 2007 May 7 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file defines various limits of what SQLite can process. +** +** @(#) $Id: sqliteLimit.h,v 1.10 2009/01/10 16:15:09 danielk1977 Exp $ +*/ + +/* +** The maximum length of a TEXT or BLOB in bytes. This also +** limits the size of a row in a table or index. +** +** The hard limit is the ability of a 32-bit signed integer +** to count the size: 2^31-1 or 2147483647. +*/ +#ifndef SQLITE_MAX_LENGTH +# define SQLITE_MAX_LENGTH 1000000000 +#endif + +/* +** This is the maximum number of +** +** * Columns in a table +** * Columns in an index +** * Columns in a view +** * Terms in the SET clause of an UPDATE statement +** * Terms in the result set of a SELECT statement +** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement. +** * Terms in the VALUES clause of an INSERT statement +** +** The hard upper limit here is 32676. Most database people will +** tell you that in a well-normalized database, you usually should +** not have more than a dozen or so columns in any table. And if +** that is the case, there is no point in having more than a few +** dozen values in any of the other situations described above. +*/ +#ifndef SQLITE_MAX_COLUMN +# define SQLITE_MAX_COLUMN 2000 +#endif + +/* +** The maximum length of a single SQL statement in bytes. +** +** It used to be the case that setting this value to zero would +** turn the limit off. That is no longer true. It is not possible +** to turn this limit off. +*/ +#ifndef SQLITE_MAX_SQL_LENGTH +# define SQLITE_MAX_SQL_LENGTH 1000000000 +#endif + +/* +** The maximum depth of an expression tree. This is limited to +** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might +** want to place more severe limits on the complexity of an +** expression. +** +** A value of 0 used to mean that the limit was not enforced. +** But that is no longer true. The limit is now strictly enforced +** at all times. +*/ +#ifndef SQLITE_MAX_EXPR_DEPTH +# define SQLITE_MAX_EXPR_DEPTH 1000 +#endif + +/* +** The maximum number of terms in a compound SELECT statement. +** The code generator for compound SELECT statements does one +** level of recursion for each term. A stack overflow can result +** if the number of terms is too large. In practice, most SQL +** never has more than 3 or 4 terms. Use a value of 0 to disable +** any limit on the number of terms in a compount SELECT. +*/ +#ifndef SQLITE_MAX_COMPOUND_SELECT +# define SQLITE_MAX_COMPOUND_SELECT 500 +#endif + +/* +** The maximum number of opcodes in a VDBE program. +** Not currently enforced. +*/ +#ifndef SQLITE_MAX_VDBE_OP +# define SQLITE_MAX_VDBE_OP 25000 +#endif + +/* +** The maximum number of arguments to an SQL function. +*/ +#ifndef SQLITE_MAX_FUNCTION_ARG +# define SQLITE_MAX_FUNCTION_ARG 127 +#endif + +/* +** The maximum number of in-memory pages to use for the main database +** table and for temporary tables. The SQLITE_DEFAULT_CACHE_SIZE +*/ +#ifndef SQLITE_DEFAULT_CACHE_SIZE +# define SQLITE_DEFAULT_CACHE_SIZE 2000 +#endif +#ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE +# define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500 +#endif + +/* +** The maximum number of attached databases. This must be between 0 +** and 30. The upper bound on 30 is because a 32-bit integer bitmap +** is used internally to track attached databases. +*/ +#ifndef SQLITE_MAX_ATTACHED +# define SQLITE_MAX_ATTACHED 10 +#endif + + +/* +** The maximum value of a ?nnn wildcard that the parser will accept. +*/ +#ifndef SQLITE_MAX_VARIABLE_NUMBER +# define SQLITE_MAX_VARIABLE_NUMBER 999 +#endif + +/* Maximum page size. The upper bound on this value is 32768. This a limit +** imposed by the necessity of storing the value in a 2-byte unsigned integer +** and the fact that the page size must be a power of 2. +** +** If this limit is changed, then the compiled library is technically +** incompatible with an SQLite library compiled with a different limit. If +** a process operating on a database with a page-size of 65536 bytes +** crashes, then an instance of SQLite compiled with the default page-size +** limit will not be able to rollback the aborted transaction. This could +** lead to database corruption. +*/ +#ifndef SQLITE_MAX_PAGE_SIZE +# define SQLITE_MAX_PAGE_SIZE 32768 +#endif + + +/* +** The default size of a database page. +*/ +#ifndef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE 1024 +#endif +#if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + +/* +** Ordinarily, if no value is explicitly provided, SQLite creates databases +** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain +** device characteristics (sector-size and atomic write() support), +** SQLite may choose a larger value. This constant is the maximum value +** SQLite will choose on its own. +*/ +#ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 +#endif +#if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + + +/* +** Maximum number of pages in one database file. +** +** This is really just the default value for the max_page_count pragma. +** This value can be lowered (or raised) at run-time using that the +** max_page_count macro. +*/ +#ifndef SQLITE_MAX_PAGE_COUNT +# define SQLITE_MAX_PAGE_COUNT 1073741823 +#endif + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Maximum depth of recursion for triggers. +** +** A value of 1 means that a trigger program will not be able to itself +** fire any triggers. A value of 0 means that no trigger programs at all +** may be executed. +*/ +#ifndef SQLITE_MAX_TRIGGER_DEPTH +#if defined(SQLITE_SMALL_STACK) +# define SQLITE_MAX_TRIGGER_DEPTH 10 +#else +# define SQLITE_MAX_TRIGGER_DEPTH 1000 +#endif +#endif + +/************** End of sqliteLimit.h *****************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* Disable nuisance warnings on Borland compilers */ +#if defined(__BORLANDC__) +#pragma warn -rch /* unreachable code */ +#pragma warn -ccc /* Condition is always true or false */ +#pragma warn -aus /* Assigned value is never used */ +#pragma warn -csu /* Comparing signed and unsigned */ +#pragma warn -spa /* Suspicious pointer arithmetic */ +#endif + +/* Needed for various definitions... */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +/* +** Include standard header files as necessary +*/ +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif + +#define SQLITE_INDEX_SAMPLES 10 + +/* +** This macro is used to "hide" some ugliness in casting an int +** value to a ptr value under the MSVC 64-bit compiler. Casting +** non 64-bit values to ptr types results in a "hard" error with +** the MSVC 64-bit compiler which this attempts to avoid. +** +** A simple compiler pragma or casting sequence could not be found +** to correct this in all situations, so this macro was introduced. +** +** It could be argued that the intptr_t type could be used in this +** case, but that type is not available on all compilers, or +** requires the #include of specific headers which differs between +** platforms. +** +** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on +** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). +** So we have to define the macros in different ways depending on the +** compiler. +*/ +#if defined(__GNUC__) +# if defined(HAVE_STDINT_H) +# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) +# else +# define SQLITE_INT_TO_PTR(X) ((void*)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(X)) +# endif +#else +# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) +# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) +#endif + + +/* +** The SQLITE_THREADSAFE macro must be defined as either 0 or 1. +** Older versions of SQLite used an optional THREADSAFE macro. +** We support that for legacy +*/ +#if !defined(SQLITE_THREADSAFE) +#if defined(THREADSAFE) +# define SQLITE_THREADSAFE THREADSAFE +#else +# define SQLITE_THREADSAFE 1 +#endif +#endif + +/* +** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1. +** It determines whether or not the features related to +** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can +** be overridden at runtime using the sqlite3_config() API. +*/ +#if !defined(SQLITE_DEFAULT_MEMSTATUS) +# define SQLITE_DEFAULT_MEMSTATUS 1 +#endif + +/* +** Exactly one of the following macros must be defined in order to +** specify which memory allocation subsystem to use. +** +** SQLITE_SYSTEM_MALLOC // Use normal system malloc() +** SQLITE_MEMDEBUG // Debugging version of system malloc() +** SQLITE_MEMORY_SIZE // internal allocator #1 +** SQLITE_MMAP_HEAP_SIZE // internal mmap() allocator +** SQLITE_POW2_MEMORY_SIZE // internal power-of-two allocator +** +** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as +** the default. +*/ +#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_MEMDEBUG)+\ + defined(SQLITE_MEMORY_SIZE)+defined(SQLITE_MMAP_HEAP_SIZE)+\ + defined(SQLITE_POW2_MEMORY_SIZE)>1 +# error "At most one of the following compile-time configuration options\ + is allows: SQLITE_SYSTEM_MALLOC, SQLITE_MEMDEBUG, SQLITE_MEMORY_SIZE,\ + SQLITE_MMAP_HEAP_SIZE, SQLITE_POW2_MEMORY_SIZE" +#endif +#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_MEMDEBUG)+\ + defined(SQLITE_MEMORY_SIZE)+defined(SQLITE_MMAP_HEAP_SIZE)+\ + defined(SQLITE_POW2_MEMORY_SIZE)==0 +# define SQLITE_SYSTEM_MALLOC 1 +#endif + +/* +** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the +** sizes of memory allocations below this value where possible. +*/ +#if !defined(SQLITE_MALLOC_SOFT_LIMIT) +# define SQLITE_MALLOC_SOFT_LIMIT 1024 +#endif + +/* +** We need to define _XOPEN_SOURCE as follows in order to enable +** recursive mutexes on most Unix systems. But Mac OS X is different. +** The _XOPEN_SOURCE define causes problems for Mac OS X we are told, +** so it is omitted there. See ticket #2673. +** +** Later we learn that _XOPEN_SOURCE is poorly or incorrectly +** implemented on some systems. So we avoid defining it at all +** if it is already defined or if it is unneeded because we are +** not doing a threadsafe build. Ticket #2681. +** +** See also ticket #2741. +*/ +#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) && SQLITE_THREADSAFE && !defined(VXWORKS) +# define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */ +#endif + +/* +** The TCL headers are only needed when compiling the TCL bindings. +*/ +#if defined(SQLITE_TCL) || defined(TCLSH) +# include +#endif + +/* +** Many people are failing to set -DNDEBUG=1 when compiling SQLite. +** Setting NDEBUG makes the code smaller and run faster. So the following +** lines are added to automatically set NDEBUG unless the -DSQLITE_DEBUG=1 +** option is set. Thus NDEBUG becomes an opt-in rather than an opt-out +** feature. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* +** The testcase() macro is used to aid in coverage testing. When +** doing coverage testing, the condition inside the argument to +** testcase() must be evaluated both true and false in order to +** get full branch coverage. The testcase() macro is inserted +** to help ensure adequate test coverage in places where simple +** condition/decision coverage is inadequate. For example, testcase() +** can be used to make sure boundary values are tested. For +** bitmask tests, testcase() can be used to make sure each bit +** is significant and used at least once. On switch statements +** where multiple cases go to the same block of code, testcase() +** can insure that all cases are evaluated. +** +*/ +#ifdef SQLITE_COVERAGE_TEST +SQLITE_PRIVATE void sqlite3Coverage(int); +# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); } +#else +# define testcase(X) +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +/* +** Sometimes we need a small amount of code such as a variable initialization +** to setup for a later assert() statement. We do not want this code to +** appear when assert() is disabled. The following macro is therefore +** used to contain that setup code. The "VVA" acronym stands for +** "Verification, Validation, and Accreditation". In other words, the +** code within VVA_ONLY() will only run during verification processes. +*/ +#ifndef NDEBUG +# define VVA_ONLY(X) X +#else +# define VVA_ONLY(X) +#endif + +/* +** The ALWAYS and NEVER macros surround boolean expressions which +** are intended to always be true or false, respectively. Such +** expressions could be omitted from the code completely. But they +** are included in a few cases in order to enhance the resilience +** of SQLite to unexpected behavior - to make the code "self-healing" +** or "ductile" rather than being "brittle" and crashing at the first +** hint of unplanned behavior. +** +** In other words, ALWAYS and NEVER are added for defensive code. +** +** When doing coverage testing ALWAYS and NEVER are hard-coded to +** be true and false so that the unreachable code then specify will +** not be counted as untested code. +*/ +#if defined(SQLITE_COVERAGE_TEST) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +#endif + +/* +** The macro unlikely() is a hint that surrounds a boolean +** expression that is usually false. Macro likely() surrounds +** a boolean expression that is usually true. GCC is able to +** use these hints to generate better code, sometimes. +*/ +#if defined(__GNUC__) && 0 +# define likely(X) __builtin_expect((X),1) +# define unlikely(X) __builtin_expect((X),0) +#else +# define likely(X) !!(X) +# define unlikely(X) !!(X) +#endif + +/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ +/************** Begin file sqlite3.h *****************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve the right to make minor changes +** if experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are suppose to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +*/ +#ifndef _SQLITE3_H_ +#define _SQLITE3_H_ + +#ifdef VXWORKS +# define SQLITE_HOMEGROWN_RECURSIVE_MUTEX +# define NO_GETTOD +# include +#endif + +#include /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** Add the ability to override 'extern' +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif + +#ifndef SQLITE_API +# define SQLITE_API +#endif + + +/* +** These no-op macros are used in front of interfaces to mark those +** interfaces as either deprecated or experimental. New applications +** should not use deprecated interfaces - they are support for backwards +** compatibility only. Application writers should be aware that +** experimental interfaces are subject to change in point releases. +** +** These macros used to resolve to various kinds of compiler magic that +** would generate warning messages when they were used. But that +** compiler magic ended up generating such a flurry of bug reports +** that we have taken it all out and gone back to using simple +** noop macros. +*/ +#define SQLITE_DEPRECATED +#define SQLITE_EXPERIMENTAL + +/* +** Ensure these symbols were not defined by some previous header file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** CAPI3REF: Compile-Time Library Version Numbers {H10010} +** +** The SQLITE_VERSION and SQLITE_VERSION_NUMBER #defines in +** the sqlite3.h file specify the version of SQLite with which +** that header file is associated. +** +** The "version" of SQLite is a string of the form "W.X.Y" or "W.X.Y.Z". +** The W value is major version number and is always 3 in SQLite3. +** The W value only changes when backwards compatibility is +** broken and we intend to never break backwards compatibility. +** The X value is the minor version number and only changes when +** there are major feature enhancements that are forwards compatible +** but not backwards compatible. +** The Y value is the release number and is incremented with +** each release but resets back to 0 whenever X is incremented. +** The Z value only appears on branch releases. +** +** The SQLITE_VERSION_NUMBER is an integer that is computed as +** follows: +** +**
      +** SQLITE_VERSION_NUMBER = W*1000000 + X*1000 + Y
      +** 
      +** +** Since version 3.6.18, SQLite source code has been stored in the +** fossil configuration management +** system. The SQLITE_SOURCE_ID +** macro is a string which identifies a particular check-in of SQLite +** within its configuration management system. The string contains the +** date and time of the check-in (UTC) and an SHA1 hash of the entire +** source tree. +** +** See also: [sqlite3_libversion()], +** [sqlite3_libversion_number()], [sqlite3_sourceid()], +** [sqlite_version()] and [sqlite_source_id()]. +** +** Requirements: [H10011] [H10014] +*/ +#define SQLITE_VERSION "3.6.19" +#define SQLITE_VERSION_NUMBER 3006019 +#define SQLITE_SOURCE_ID "2009-10-14 11:33:55 c1d499afc50d54b376945b4efb65c56c787a073d" + +/* +** CAPI3REF: Run-Time Library Version Numbers {H10020} +** KEYWORDS: sqlite3_version +** +** These interfaces provide the same information as the [SQLITE_VERSION], +** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] #defines in the header, +** but are associated with the library instead of the header file. Cautious +** programmers might include assert() statements in their application to +** verify that values returned by these interfaces match the macros in +** the header, and thus insure that the application is +** compiled with matching library and header files. +** +**
      +** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
      +** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
      +** assert( strcmp(sqlite3_libversion,SQLITE_VERSION)==0 );
      +** 
      +** +** The sqlite3_libversion() function returns the same information as is +** in the sqlite3_version[] string constant. The function is provided +** for use in DLLs since DLL users usually do not have direct access to string +** constants within the DLL. Similarly, the sqlite3_sourceid() function +** returns the same information as is in the [SQLITE_SOURCE_ID] #define of +** the header file. +** +** See also: [sqlite_version()] and [sqlite_source_id()]. +** +** Requirements: [H10021] [H10022] [H10023] +*/ +SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; +SQLITE_API const char *sqlite3_libversion(void); +SQLITE_API const char *sqlite3_sourceid(void); +SQLITE_API int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe {H10100} +** +** SQLite can be compiled with or without mutexes. When +** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes +** are enabled and SQLite is threadsafe. When the +** [SQLITE_THREADSAFE] macro is 0, +** the mutexes are omitted. Without the mutexes, it is not safe +** to use SQLite concurrently from more than one thread. +** +** Enabling mutexes incurs a measurable performance penalty. +** So if speed is of utmost importance, it makes sense to disable +** the mutexes. But for maximum safety, mutexes should be enabled. +** The default behavior is for mutexes to be enabled. +** +** This interface can be used by an application to make sure that the +** version of SQLite that it is linking against was compiled with +** the desired setting of the [SQLITE_THREADSAFE] macro. +** +** This interface only reports on the compile-time mutex setting +** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with +** SQLITE_THREADSAFE=1 then mutexes are enabled by default but +** can be fully or partially disabled using a call to [sqlite3_config()] +** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], +** or [SQLITE_CONFIG_MUTEX]. The return value of this function shows +** only the default compile-time setting, not any run-time changes +** to that setting. +** +** See the [threading mode] documentation for additional information. +** +** Requirements: [H10101] [H10102] +*/ +SQLITE_API int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle {H12000} +** KEYWORDS: {database connection} {database connections} +** +** Each open SQLite database is represented by a pointer to an instance of +** the opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] +** is its destructor. There are many other interfaces (such as +** [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on an +** sqlite3 object. +*/ +typedef struct sqlite3 sqlite3; + +/* +** CAPI3REF: 64-Bit Integer Types {H10200} +** KEYWORDS: sqlite_int64 sqlite_uint64 +** +** Because there is no cross-platform way to specify 64-bit integer types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. +** The sqlite_int64 and sqlite_uint64 types are supported for backwards +** compatibility only. +** +** Requirements: [H10201] [H10202] +*/ +#ifdef SQLITE_INT64_TYPE + typedef SQLITE_INT64_TYPE sqlite_int64; + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection {H12010} +** +** This routine is the destructor for the [sqlite3] object. +** +** Applications should [sqlite3_finalize | finalize] all [prepared statements] +** and [sqlite3_blob_close | close] all [BLOB handles] associated with +** the [sqlite3] object prior to attempting to close the object. +** The [sqlite3_next_stmt()] interface can be used to locate all +** [prepared statements] associated with a [database connection] if desired. +** Typical code might look like this: +** +**
      +** sqlite3_stmt *pStmt;
      +** while( (pStmt = sqlite3_next_stmt(db, 0))!=0 ){
      +**     sqlite3_finalize(pStmt);
      +** }
      +** 
      +** +** If [sqlite3_close()] is invoked while a transaction is open, +** the transaction is automatically rolled back. +** +** The C parameter to [sqlite3_close(C)] must be either a NULL +** pointer or an [sqlite3] object pointer obtained +** from [sqlite3_open()], [sqlite3_open16()], or +** [sqlite3_open_v2()], and not previously closed. +** +** Requirements: +** [H12011] [H12012] [H12013] [H12014] [H12015] [H12019] +*/ +SQLITE_API int sqlite3_close(sqlite3 *); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface {H12100} +** +** The sqlite3_exec() interface is a convenient way of running one or more +** SQL statements without having to write a lot of C code. The UTF-8 encoded +** SQL statements are passed in as the second parameter to sqlite3_exec(). +** The statements are evaluated one by one until either an error or +** an interrupt is encountered, or until they are all done. The 3rd parameter +** is an optional callback that is invoked once for each row of any query +** results produced by the SQL statements. The 5th parameter tells where +** to write any error messages. +** +** The error message passed back through the 5th parameter is held +** in memory obtained from [sqlite3_malloc()]. To avoid a memory leak, +** the calling application should call [sqlite3_free()] on any error +** message returned through the 5th parameter when it has finished using +** the error message. +** +** If the SQL statement in the 2nd parameter is NULL or an empty string +** or a string containing only whitespace and comments, then no SQL +** statements are evaluated and the database is not changed. +** +** The sqlite3_exec() interface is implemented in terms of +** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()]. +** The sqlite3_exec() routine does nothing to the database that cannot be done +** by [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()]. +** +** The first parameter to [sqlite3_exec()] must be an valid and open +** [database connection]. +** +** The database connection must not be closed while +** [sqlite3_exec()] is running. +** +** The calling function should use [sqlite3_free()] to free +** the memory that *errmsg is left pointing at once the error +** message is no longer needed. +** +** The SQL statement text in the 2nd parameter to [sqlite3_exec()] +** must remain unchanged while [sqlite3_exec()] is running. +** +** Requirements: +** [H12101] [H12102] [H12104] [H12105] [H12107] [H12110] [H12113] [H12116] +** [H12119] [H12122] [H12125] [H12131] [H12134] [H12137] [H12138] +*/ +SQLITE_API int sqlite3_exec( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be evaluated */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes {H10210} +** KEYWORDS: SQLITE_OK {error code} {error codes} +** KEYWORDS: {result code} {result codes} +** +** Many SQLite functions return an integer result code from the set shown +** here in order to indicates success or failure. +** +** New error codes may be added in future versions of SQLite. +** +** See also: [SQLITE_IOERR_READ | extended result codes] +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* SQL error or missing database */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* NOT USED. Table or record not found */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* NOT USED. Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Database is empty */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Auxiliary database format error */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes {H10220} +** KEYWORDS: {extended error code} {extended error codes} +** KEYWORDS: {extended result code} {extended result codes} +** +** In its default configuration, SQLite API routines return one of 26 integer +** [SQLITE_OK | result codes]. However, experience has shown that many of +** these result codes are too coarse-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 and later) include +** support for additional result codes that provide more detailed information +** about errors. The extended result codes are enabled or disabled +** on a per database connection basis using the +** [sqlite3_extended_result_codes()] API. +** +** Some of the available extended result codes are listed here. +** One may expect the number of extended result codes will be expand +** over time. Software that uses extended result codes should expect +** to see new result codes in future releases of SQLite. +** +** The SQLITE_OK result code will never be extended. It will always +** be exactly zero. +*/ +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) +#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) +#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) +#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) +#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) +#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) +#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8) ) + +/* +** CAPI3REF: Flags For File Open Operations {H10230} +** +** These bit values are intended for use in the +** 3rd parameter to the [sqlite3_open_v2()] interface and +** in the 4th parameter to the xOpen method of the +** [sqlite3_vfs] object. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ +#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ +#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ +#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ + +/* +** CAPI3REF: Device Characteristics {H10240} +** +** The xDeviceCapabilities method of the [sqlite3_io_methods] +** object returns an integer which is a vector of the these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 + +/* +** CAPI3REF: File Locking Levels {H10250} +** +** SQLite uses one of these integer values as the second +** argument to calls it makes to the xLock() and xUnlock() methods +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags {H10260} +** +** When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of +** these integer values as the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means +** to use Mac OS X style fullsync instead of fsync(). +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + +/* +** CAPI3REF: OS Interface Open File Handle {H11110} +** +** An [sqlite3_file] object represents an open file in the +** [sqlite3_vfs | OS interface layer]. Individual OS interface +** implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** CAPI3REF: OS Interface File Virtual Methods Object {H11120} +** +** Every file opened by the [sqlite3_vfs] xOpen method populates an +** [sqlite3_file] object (or, more commonly, a subclass of the +** [sqlite3_file] object) with a pointer to an instance of this object. +** This object defines the methods used to perform various operations +** against the open file represented by the [sqlite3_file] object. +** +** If the xOpen method sets the sqlite3_file.pMethods element +** to a non-NULL pointer, then the sqlite3_io_methods.xClose method +** may be invoked even if the xOpen reported that it failed. The +** only way to prevent a call to xClose following a failed xOpen +** is for the xOpen to set the sqlite3_file.pMethods element to NULL. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] +** flag may be ORed in to indicate that only the data of the file +** and not its inode needs to be synced. +** +** The integer values to xLock() and xUnlock() are one of +**
        +**
      • [SQLITE_LOCK_NONE], +**
      • [SQLITE_LOCK_SHARED], +**
      • [SQLITE_LOCK_RESERVED], +**
      • [SQLITE_LOCK_PENDING], or +**
      • [SQLITE_LOCK_EXCLUSIVE]. +**
      +** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method checks whether any database connection, +** either in this process or in some other process, is holding a RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false otherwise. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument is an +** integer opcode. The third argument is a generic pointer intended to +** point to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves all opcodes less than 100 for its own use. +** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
        +**
      • [SQLITE_IOCAP_ATOMIC] +**
      • [SQLITE_IOCAP_ATOMIC512] +**
      • [SQLITE_IOCAP_ATOMIC1K] +**
      • [SQLITE_IOCAP_ATOMIC2K] +**
      • [SQLITE_IOCAP_ATOMIC4K] +**
      • [SQLITE_IOCAP_ATOMIC8K] +**
      • [SQLITE_IOCAP_ATOMIC16K] +**
      • [SQLITE_IOCAP_ATOMIC32K] +**
      • [SQLITE_IOCAP_ATOMIC64K] +**
      • [SQLITE_IOCAP_SAFE_APPEND] +**
      • [SQLITE_IOCAP_SEQUENTIAL] +**
      +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +** +** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill +** in the unread portions of the buffer with zeros. A VFS that +** fails to zero-fill short reads might seem to work. However, +** failure to zero-fill short reads will eventually lead to +** database corruption. +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes {H11310} +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] +** interface. +** +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode causes the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and only needs to be supported when SQLITE_TEST +** is defined. +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 +#define SQLITE_GET_LOCKPROXYFILE 2 +#define SQLITE_SET_LOCKPROXYFILE 3 +#define SQLITE_LAST_ERRNO 4 + +/* +** CAPI3REF: Mutex Handle {H17110} +** +** The mutex module within SQLite defines [sqlite3_mutex] to be an +** abstract type for a mutex object. The SQLite core never looks +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: OS Interface Object {H11140} +** +** An instance of the sqlite3_vfs object defines the interface between +** the SQLite core and the underlying operating system. The "vfs" +** in the name of the object stands for "virtual file system". +** +** The value of the iVersion field is initially 1 but may be larger in +** future versions of SQLite. Additional fields may be appended to this +** object when the iVersion value is increased. Note that the structure +** of the sqlite3_vfs object changes in the transaction between +** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not +** modified. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered sqlite3_vfs objects are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. Neither the application code nor the VFS +** implementation should use the pNext pointer. +** +** The pNext field is the only field in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** SQLite will guarantee that the zFilename parameter to xOpen +** is either a NULL pointer or string obtained +** from xFullPathname(). SQLite further guarantees that +** the string will be valid and unchanged until xClose() is +** called. Because of the previous sentence, +** the [sqlite3_file] can safely store a pointer to the +** filename if it needs to remember the filename for some reason. +** If the zFilename parameter is xOpen is a NULL pointer then xOpen +** must invent its own temporary name for the file. Whenever the +** xFilename parameter is NULL it will also be the case that the +** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. +** +** The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. +** +** SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
        +**
      • [SQLITE_OPEN_MAIN_DB] +**
      • [SQLITE_OPEN_MAIN_JOURNAL] +**
      • [SQLITE_OPEN_TEMP_DB] +**
      • [SQLITE_OPEN_TEMP_JOURNAL] +**
      • [SQLITE_OPEN_TRANSIENT_DB] +**
      • [SQLITE_OPEN_SUBJOURNAL] +**
      • [SQLITE_OPEN_MASTER_JOURNAL] +**
      +** +** The file I/O implementation can use the object type flags to +** change the way it deals with files. For example, an application +** that does not care about crash recovery or rollback might make +** the open of a journal file a no-op. Writes to this journal would +** also be no-ops, and any attempt to read the journal would return +** SQLITE_IOERR. Or the implementation might recognize that a database +** file will be doing page-aligned sector reads and writes in a random +** order and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen method: +** +**
        +**
      • [SQLITE_OPEN_DELETEONCLOSE] +**
      • [SQLITE_OPEN_EXCLUSIVE] +**
      +** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases, journals and for subjournals. +** +** The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction +** with the [SQLITE_OPEN_CREATE] flag, which are both directly +** analogous to the O_EXCL and O_CREAT flags of the POSIX open() +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** SQLITE_OPEN_CREATE, is used to indicate that file should always +** be created, and that it is an error if it already exists. +** It is not used to indicate the file should be opened +** for exclusive access. +** +** At least szOsFile bytes of memory are allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. The xOpen method does not have to +** allocate the structure; it should just fill it in. Note that +** the xOpen method must set the sqlite3_file.pMethods to either +** a valid [sqlite3_io_methods] object or to NULL. xOpen must do +** this even if the open fails. SQLite expects that the sqlite3_file.pMethods +** element will be valid after xOpen returns regardless of the success +** or failure of the xOpen call. +** +** The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to +** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test whether a file is at least readable. The file can be a +** directory. +** +** SQLite will always allocate at least mxPathname+1 bytes for the +** output buffer xFullPathname. The exact size of the output buffer +** is also passed as a parameter to both methods. If the output buffer +** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is +** handled as a fatal error by SQLite, vfs implementations should endeavor +** to prevent this by setting mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), and xCurrentTime() interfaces +** are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. +** The xSleep() method causes the calling thread to sleep for at +** least the number of microseconds given. The xCurrentTime() +** method returns a Julian Day Number for the current date and time. +** +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +struct sqlite3_vfs { + int iVersion; /* Structure version number */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + int (*xGetLastError)(sqlite3_vfs*, int, char *); + /* New fields may be appended in figure versions. The iVersion + ** value will increment whenever this happens. */ +}; + +/* +** CAPI3REF: Flags for the xAccess VFS method {H11190} +** +** These integer constants can be used as the third parameter to +** the xAccess method of an [sqlite3_vfs] object. {END} They determine +** what kind of permissions the xAccess method is looking for. +** With SQLITE_ACCESS_EXISTS, the xAccess method +** simply checks whether the file exists. +** With SQLITE_ACCESS_READWRITE, the xAccess method +** checks whether the file is both readable and writable. +** With SQLITE_ACCESS_READ, the xAccess method +** checks whether the file is readable. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 +#define SQLITE_ACCESS_READ 2 + +/* +** CAPI3REF: Initialize The SQLite Library {H10130} +** +** The sqlite3_initialize() routine initializes the +** SQLite library. The sqlite3_shutdown() routine +** deallocates any resources that were allocated by sqlite3_initialize(). +** +** A call to sqlite3_initialize() is an "effective" call if it is +** the first time sqlite3_initialize() is invoked during the lifetime of +** the process, or if it is the first time sqlite3_initialize() is invoked +** following a call to sqlite3_shutdown(). Only an effective call +** of sqlite3_initialize() does any initialization. All other calls +** are harmless no-ops. +** +** A call to sqlite3_shutdown() is an "effective" call if it is the first +** call to sqlite3_shutdown() since the last sqlite3_initialize(). Only +** an effective call to sqlite3_shutdown() does any deinitialization. +** All other calls to sqlite3_shutdown() are harmless no-ops. +** +** Among other things, sqlite3_initialize() shall invoke +** sqlite3_os_init(). Similarly, sqlite3_shutdown() +** shall invoke sqlite3_os_end(). +** +** The sqlite3_initialize() routine returns [SQLITE_OK] on success. +** If for some reason, sqlite3_initialize() is unable to initialize +** the library (perhaps it is unable to allocate a needed resource such +** as a mutex) it returns an [error code] other than [SQLITE_OK]. +** +** The sqlite3_initialize() routine is called internally by many other +** SQLite interfaces so that an application usually does not need to +** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] +** calls sqlite3_initialize() so the SQLite library will be automatically +** initialized when [sqlite3_open()] is called if it has not be initialized +** already. However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] +** compile-time option, then the automatic calls to sqlite3_initialize() +** are omitted and the application must call sqlite3_initialize() directly +** prior to using any other SQLite interface. For maximum portability, +** it is recommended that applications always invoke sqlite3_initialize() +** directly prior to using any other SQLite interface. Future releases +** of SQLite may require this. In other words, the behavior exhibited +** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the +** default behavior in some future release of SQLite. +** +** The sqlite3_os_init() routine does operating-system specific +** initialization of the SQLite library. The sqlite3_os_end() +** routine undoes the effect of sqlite3_os_init(). Typical tasks +** performed by these routines include allocation or deallocation +** of static resources, initialization of global variables, +** setting up a default [sqlite3_vfs] module, or setting up +** a default configuration using [sqlite3_config()]. +** +** The application should never invoke either sqlite3_os_init() +** or sqlite3_os_end() directly. The application should only invoke +** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() +** interface is called automatically by sqlite3_initialize() and +** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate +** implementations for sqlite3_os_init() and sqlite3_os_end() +** are built into SQLite when it is compiled for Unix, Windows, or OS/2. +** When [custom builds | built for other platforms] +** (using the [SQLITE_OS_OTHER=1] compile-time +** option) the application must supply a suitable implementation for +** sqlite3_os_init() and sqlite3_os_end(). An application-supplied +** implementation of sqlite3_os_init() or sqlite3_os_end() +** must return [SQLITE_OK] on success and some other [error code] upon +** failure. +*/ +SQLITE_API int sqlite3_initialize(void); +SQLITE_API int sqlite3_shutdown(void); +SQLITE_API int sqlite3_os_init(void); +SQLITE_API int sqlite3_os_end(void); + +/* +** CAPI3REF: Configuring The SQLite Library {H14100} +** EXPERIMENTAL +** +** The sqlite3_config() interface is used to make global configuration +** changes to SQLite in order to tune SQLite to the specific needs of +** the application. The default configuration is recommended for most +** applications and so this routine is usually not necessary. It is +** provided to support rare applications with unusual needs. +** +** The sqlite3_config() interface is not threadsafe. The application +** must insure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running. Furthermore, sqlite3_config() +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** Note, however, that sqlite3_config() can be called as part of the +** implementation of an application-defined [sqlite3_os_init()]. +** +** The first argument to sqlite3_config() is an integer +** [SQLITE_CONFIG_SINGLETHREAD | configuration option] that determines +** what property of SQLite is to be configured. Subsequent arguments +** vary depending on the [SQLITE_CONFIG_SINGLETHREAD | configuration option] +** in the first argument. +** +** When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. +** If the option is unknown or SQLite is unable to set the option +** then this routine returns a non-zero [error code]. +** +** Requirements: +** [H14103] [H14106] [H14120] [H14123] [H14126] [H14129] [H14132] [H14135] +** [H14138] [H14141] [H14144] [H14147] [H14150] [H14153] [H14156] [H14159] +** [H14162] [H14165] [H14168] +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_config(int, ...); + +/* +** CAPI3REF: Configure database connections {H14200} +** EXPERIMENTAL +** +** The sqlite3_db_config() interface is used to make configuration +** changes to a [database connection]. The interface is similar to +** [sqlite3_config()] except that the changes apply to a single +** [database connection] (specified in the first argument). The +** sqlite3_db_config() interface can only be used immediately after +** the database connection is created using [sqlite3_open()], +** [sqlite3_open16()], or [sqlite3_open_v2()]. +** +** The second argument to sqlite3_db_config(D,V,...) is the +** configuration verb - an integer code that indicates what +** aspect of the [database connection] is being configured. +** The only choice for this value is [SQLITE_DBCONFIG_LOOKASIDE]. +** New verbs are likely to be added in future releases of SQLite. +** Additional arguments depend on the verb. +** +** Requirements: +** [H14203] [H14206] [H14209] [H14212] [H14215] +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Memory Allocation Routines {H10155} +** EXPERIMENTAL +** +** An instance of this object defines the interface between SQLite +** and low-level memory allocation routines. +** +** This object is used in only one place in the SQLite interface. +** A pointer to an instance of this object is the argument to +** [sqlite3_config()] when the configuration option is +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** By creating an instance of this object +** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) +** during configuration, an application can specify an alternative +** memory allocation subsystem for SQLite to use for all of its +** dynamic memory needs. +** +** Note that SQLite comes with several [built-in memory allocators] +** that are perfectly adequate for the overwhelming majority of applications +** and that this object is only useful to a tiny minority of applications +** with specialized memory allocation requirements. This object is +** also used during testing of SQLite in order to specify an alternative +** memory allocator that simulates memory out-of-memory conditions in +** order to verify that SQLite recovers gracefully from such +** conditions. +** +** The xMalloc and xFree methods must work like the +** malloc() and free() functions from the standard C library. +** The xRealloc method must work like realloc() from the standard C library +** with the exception that if the second argument to xRealloc is zero, +** xRealloc must be a no-op - it must not perform any allocation or +** deallocation. SQLite guaranteeds that the second argument to +** xRealloc is always a value returned by a prior call to xRoundup. +** And so in cases where xRoundup always returns a positive number, +** xRealloc can perform exactly as the standard library realloc() and +** still be in compliance with this specification. +** +** xSize should return the allocated size of a memory allocation +** previously obtained from xMalloc or xRealloc. The allocated size +** is always at least as big as the requested size but may be larger. +** +** The xRoundup method returns what would be the allocated size of +** a memory allocation given a particular requested size. Most memory +** allocators round up memory allocations at least to the next multiple +** of 8. Some allocators round up to a larger multiple or to a power of 2. +** Every memory allocation request coming in through [sqlite3_malloc()] +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** that causes the corresponding memory allocation to fail. +** +** The xInit method initializes the memory allocator. (For example, +** it might allocate any require mutexes or initialize internal data +** structures. The xShutdown method is invoked (indirectly) by +** [sqlite3_shutdown()] and should deallocate any resources acquired +** by xInit. The pAppData pointer is used as the only parameter to +** xInit and xShutdown. +** +** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes +** the xInit method, so the xInit method need not be threadsafe. The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. For all other methods, SQLite +** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the +** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which +** it is by default) and so the methods are automatically serialized. +** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other +** methods must be threadsafe or else make their own arrangements for +** serialization. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +*/ +typedef struct sqlite3_mem_methods sqlite3_mem_methods; +struct sqlite3_mem_methods { + void *(*xMalloc)(int); /* Memory allocation function */ + void (*xFree)(void*); /* Free a prior allocation */ + void *(*xRealloc)(void*,int); /* Resize an allocation */ + int (*xSize)(void*); /* Return the size of an allocation */ + int (*xRoundup)(int); /* Round up request size to allocation size */ + int (*xInit)(void*); /* Initialize the memory allocator */ + void (*xShutdown)(void*); /* Deinitialize the memory allocator */ + void *pAppData; /* Argument to xInit() and xShutdown() */ +}; + +/* +** CAPI3REF: Configuration Options {H10160} +** EXPERIMENTAL +** +** These constants are the available integer configuration options that +** can be passed as the first argument to the [sqlite3_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_config()] to make sure that +** the call worked. The [sqlite3_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
      +**
      SQLITE_CONFIG_SINGLETHREAD
      +**
      There are no arguments to this option. This option disables +** all mutexing and puts SQLite into a mode where it can only be used +** by a single thread.
      +** +**
      SQLITE_CONFIG_MULTITHREAD
      +**
      There are no arguments to this option. This option disables +** mutexing on [database connection] and [prepared statement] objects. +** The application is responsible for serializing access to +** [database connections] and [prepared statements]. But other mutexes +** are enabled so that SQLite will be safe to use in a multi-threaded +** environment as long as no two threads attempt to use the same +** [database connection] at the same time. See the [threading mode] +** documentation for additional information.
      +** +**
      SQLITE_CONFIG_SERIALIZED
      +**
      There are no arguments to this option. This option enables +** all mutexes including the recursive +** mutexes on [database connection] and [prepared statement] objects. +** In this mode (which is the default when SQLite is compiled with +** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access +** to [database connections] and [prepared statements] so that the +** application is free to use the same [database connection] or the +** same [prepared statement] in different threads at the same time. +** See the [threading mode] documentation for additional information.
      +** +**
      SQLITE_CONFIG_MALLOC
      +**
      This option takes a single argument which is a pointer to an +** instance of the [sqlite3_mem_methods] structure. The argument specifies +** alternative low-level memory allocation routines to be used in place of +** the memory allocation routines built into SQLite.
      +** +**
      SQLITE_CONFIG_GETMALLOC
      +**
      This option takes a single argument which is a pointer to an +** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] +** structure is filled with the currently defined memory allocation routines. +** This option can be used to overload the default memory allocation +** routines with a wrapper that simulations memory allocation failure or +** tracks memory usage, for example.
      +** +**
      SQLITE_CONFIG_MEMSTATUS
      +**
      This option takes single argument of type int, interpreted as a +** boolean, which enables or disables the collection of memory allocation +** statistics. When disabled, the following SQLite interfaces become +** non-operational: +**
        +**
      • [sqlite3_memory_used()] +**
      • [sqlite3_memory_highwater()] +**
      • [sqlite3_soft_heap_limit()] +**
      • [sqlite3_status()] +**
      +**
      +** +**
      SQLITE_CONFIG_SCRATCH
      +**
      This option specifies a static memory buffer that SQLite can use for +** scratch memory. There are three arguments: A pointer an 8-byte +** aligned memory buffer from which the scrach allocations will be +** drawn, the size of each scratch allocation (sz), +** and the maximum number of scratch allocations (N). The sz +** argument must be a multiple of 16. The sz parameter should be a few bytes +** larger than the actual scratch space required due to internal overhead. +** The first argument should pointer to an 8-byte aligned buffer +** of at least sz*N bytes of memory. +** SQLite will use no more than one scratch buffer at once per thread, so +** N should be set to the expected maximum number of threads. The sz +** parameter should be 6 times the size of the largest database page size. +** Scratch buffers are used as part of the btree balance operation. If +** The btree balancer needs additional memory beyond what is provided by +** scratch buffers or if no scratch buffer space is specified, then SQLite +** goes to [sqlite3_malloc()] to obtain the memory it needs.
      +** +**
      SQLITE_CONFIG_PAGECACHE
      +**
      This option specifies a static memory buffer that SQLite can use for +** the database page cache with the default page cache implemenation. +** This configuration should not be used if an application-define page +** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option. +** There are three arguments to this option: A pointer to 8-byte aligned +** memory, the size of each page buffer (sz), and the number of pages (N). +** The sz argument should be the size of the largest database page +** (a power of two between 512 and 32768) plus a little extra for each +** page header. The page header size is 20 to 40 bytes depending on +** the host architecture. It is harmless, apart from the wasted memory, +** to make sz a little too large. The first +** argument should point to an allocation of at least sz*N bytes of memory. +** SQLite will use the memory provided by the first argument to satisfy its +** memory needs for the first N pages that it adds to cache. If additional +** page cache memory is needed beyond what is provided by this option, then +** SQLite goes to [sqlite3_malloc()] for the additional storage space. +** The implementation might use one or more of the N buffers to hold +** memory accounting information. The pointer in the first argument must +** be aligned to an 8-byte boundary or subsequent behavior of SQLite +** will be undefined.
      +** +**
      SQLITE_CONFIG_HEAP
      +**
      This option specifies a static memory buffer that SQLite will use +** for all of its dynamic memory allocation needs beyond those provided +** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. +** There are three arguments: An 8-byte aligned pointer to the memory, +** the number of bytes in the memory buffer, and the minimum allocation size. +** If the first pointer (the memory pointer) is NULL, then SQLite reverts +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. If the +** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or +** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. +** The first pointer (the memory pointer) must be aligned to an 8-byte +** boundary or subsequent behavior of SQLite will be undefined.
      +** +**
      SQLITE_CONFIG_MUTEX
      +**
      This option takes a single argument which is a pointer to an +** instance of the [sqlite3_mutex_methods] structure. The argument specifies +** alternative low-level mutex routines to be used in place +** the mutex routines built into SQLite.
      +** +**
      SQLITE_CONFIG_GETMUTEX
      +**
      This option takes a single argument which is a pointer to an +** instance of the [sqlite3_mutex_methods] structure. The +** [sqlite3_mutex_methods] +** structure is filled with the currently defined mutex routines. +** This option can be used to overload the default mutex allocation +** routines with a wrapper used to track mutex usage for performance +** profiling or testing, for example.
      +** +**
      SQLITE_CONFIG_LOOKASIDE
      +**
      This option takes two arguments that determine the default +** memory allocation lookaside optimization. The first argument is the +** size of each lookaside buffer slot and the second is the number of +** slots allocated to each database connection. This option sets the +** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** verb to [sqlite3_db_config()] can be used to change the lookaside +** configuration on individual connections.
      +** +**
      SQLITE_CONFIG_PCACHE
      +**
      This option takes a single argument which is a pointer to +** an [sqlite3_pcache_methods] object. This object specifies the interface +** to a custom page cache implementation. SQLite makes a copy of the +** object and uses it for page cache memory allocations.
      +** +**
      SQLITE_CONFIG_GETPCACHE
      +**
      This option takes a single argument which is a pointer to an +** [sqlite3_pcache_methods] object. SQLite copies of the current +** page cache implementation into that object.
      +** +**
      +*/ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* sqlite3_pcache_methods* */ +#define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */ + +/* +** CAPI3REF: Configuration Options {H10170} +** EXPERIMENTAL +** +** These constants are the available integer configuration options that +** can be passed as the second argument to the [sqlite3_db_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_db_config()] to make sure that +** the call worked. The [sqlite3_db_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
      +**
      SQLITE_DBCONFIG_LOOKASIDE
      +**
      This option takes three additional arguments that determine the +** [lookaside memory allocator] configuration for the [database connection]. +** The first argument (the third parameter to [sqlite3_db_config()] is a +** pointer to an memory buffer to use for lookaside memory. +** The first argument may be NULL in which case SQLite will allocate the +** lookaside buffer itself using [sqlite3_malloc()]. The second argument is the +** size of each lookaside buffer slot and the third argument is the number of +** slots. The size of the buffer in the first argument must be greater than +** or equal to the product of the second and third arguments. The buffer +** must be aligned to an 8-byte boundary. If the second argument is not +** a multiple of 8, it is internally rounded down to the next smaller +** multiple of 8. See also: [SQLITE_CONFIG_LOOKASIDE]
      +** +**
      +*/ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ + + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes {H12200} +** +** The sqlite3_extended_result_codes() routine enables or disables the +** [extended result codes] feature of SQLite. The extended result +** codes are disabled by default for historical compatibility considerations. +** +** Requirements: +** [H12201] [H12202] +*/ +SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); + +/* +** CAPI3REF: Last Insert Rowid {H12220} +** +** Each entry in an SQLite table has a unique 64-bit signed +** integer key called the [ROWID | "rowid"]. The rowid is always available +** as an undeclared column named ROWID, OID, or _ROWID_ as long as those +** names are not also used by explicitly declared columns. If +** the table has a column of type [INTEGER PRIMARY KEY] then that column +** is another alias for the rowid. +** +** This routine returns the [rowid] of the most recent +** successful [INSERT] into the database from the [database connection] +** in the first argument. If no successful [INSERT]s +** have ever occurred on that database connection, zero is returned. +** +** If an [INSERT] occurs within a trigger, then the [rowid] of the inserted +** row is returned by this routine as long as the trigger is running. +** But once the trigger terminates, the value returned by this routine +** reverts to the last value inserted before the trigger fired. +** +** An [INSERT] that fails due to a constraint violation is not a +** successful [INSERT] and does not change the value returned by this +** routine. Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, +** and INSERT OR ABORT make no changes to the return value of this +** routine when their insertion fails. When INSERT OR REPLACE +** encounters a constraint violation, it does not fail. The +** INSERT continues to completion after deleting rows that caused +** the constraint problem so INSERT OR REPLACE will always change +** the return value of this interface. +** +** For the purposes of this routine, an [INSERT] is considered to +** be successful even if it is subsequently rolled back. +** +** Requirements: +** [H12221] [H12223] +** +** If a separate thread performs a new [INSERT] on the same +** database connection while the [sqlite3_last_insert_rowid()] +** function is running and thus changes the last insert [rowid], +** then the value returned by [sqlite3_last_insert_rowid()] is +** unpredictable and might not equal either the old or the new +** last insert [rowid]. +*/ +SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Count The Number Of Rows Modified {H12240} +** +** This function returns the number of database rows that were changed +** or inserted or deleted by the most recently completed SQL statement +** on the [database connection] specified by the first parameter. +** Only changes that are directly specified by the [INSERT], [UPDATE], +** or [DELETE] statement are counted. Auxiliary changes caused by +** triggers or [foreign key actions] are not counted. Use the +** [sqlite3_total_changes()] function to find the total number of changes +** including changes caused by triggers and foreign key actions. +** +** Changes to a view that are simulated by an [INSTEAD OF trigger] +** are not counted. Only real table changes are counted. +** +** A "row change" is a change to a single row of a single table +** caused by an INSERT, DELETE, or UPDATE statement. Rows that +** are changed as side effects of [REPLACE] constraint resolution, +** rollback, ABORT processing, [DROP TABLE], or by any other +** mechanisms do not count as direct row changes. +** +** A "trigger context" is a scope of execution that begins and +** ends with the script of a [CREATE TRIGGER | trigger]. +** Most SQL statements are +** evaluated outside of any trigger. This is the "top level" +** trigger context. If a trigger fires from the top level, a +** new trigger context is entered for the duration of that one +** trigger. Subtriggers create subcontexts for their duration. +** +** Calling [sqlite3_exec()] or [sqlite3_step()] recursively does +** not create a new trigger context. +** +** This function returns the number of direct row changes in the +** most recent INSERT, UPDATE, or DELETE statement within the same +** trigger context. +** +** Thus, when called from the top level, this function returns the +** number of changes in the most recent INSERT, UPDATE, or DELETE +** that also occurred at the top level. Within the body of a trigger, +** the sqlite3_changes() interface can be called to find the number of +** changes in the most recently completed INSERT, UPDATE, or DELETE +** statement within the body of the same trigger. +** However, the number returned does not include changes +** caused by subtriggers since those have their own context. +** +** See also the [sqlite3_total_changes()] interface and the +** [count_changes pragma]. +** +** Requirements: +** [H12241] [H12243] +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_changes()] is running then the value returned +** is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified {H12260} +** +** This function returns the number of row changes caused by [INSERT], +** [UPDATE] or [DELETE] statements since the [database connection] was opened. +** The count includes all changes from all [CREATE TRIGGER | trigger] +** contexts and changes made by [foreign key actions]. However, +** the count does not include changes used to implement [REPLACE] constraints, +** do rollbacks or ABORT processing, or [DROP TABLE] processing. The +** count does not include rows of views that fire an [INSTEAD OF trigger], +** though if the INSTEAD OF trigger makes changes of its own, those changes +** are counted. +** The changes are counted as soon as the statement that makes them is +** completed (when the statement handle is passed to [sqlite3_reset()] or +** [sqlite3_finalize()]). +** +** See also the [sqlite3_changes()] interface and the +** [count_changes pragma]. +** +** Requirements: +** [H12261] [H12263] +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_total_changes()] is running then the value +** returned is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query {H12270} +** +** This function causes any pending database operation to abort and +** return at its earliest opportunity. This routine is typically +** called in response to a user action such as pressing "Cancel" +** or Ctrl-C where the user wants a long query operation to halt +** immediately. +** +** It is safe to call this routine from a thread different from the +** thread that is currently running the database operation. But it +** is not safe to call this routine with a [database connection] that +** is closed or might close before sqlite3_interrupt() returns. +** +** If an SQL operation is very nearly finished at the time when +** sqlite3_interrupt() is called, then it might not have an opportunity +** to be interrupted and might continue to completion. +** +** An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. +** If the interrupted SQL operation is an INSERT, UPDATE, or DELETE +** that is inside an explicit transaction, then the entire transaction +** will be rolled back automatically. +** +** The sqlite3_interrupt(D) call is in effect until all currently running +** SQL statements on [database connection] D complete. Any new SQL statements +** that are started after the sqlite3_interrupt() call and before the +** running statements reaches zero are interrupted as if they had been +** running prior to the sqlite3_interrupt() call. New SQL statements +** that are started after the running statement count reaches zero are +** not effected by the sqlite3_interrupt(). +** A call to sqlite3_interrupt(D) that occurs when there are no running +** SQL statements is a no-op and has no effect on SQL statements +** that are started after the sqlite3_interrupt() call returns. +** +** Requirements: +** [H12271] [H12272] +** +** If the database connection closes while [sqlite3_interrupt()] +** is running then bad things will likely happen. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3*); + +/* +** CAPI3REF: Determine If An SQL Statement Is Complete {H10510} +** +** These routines are useful during command-line input to determine if the +** currently entered text seems to form a complete SQL statement or +** if additional input is needed before sending the text into +** SQLite for parsing. These routines return 1 if the input string +** appears to be a complete SQL statement. A statement is judged to be +** complete if it ends with a semicolon token and is not a prefix of a +** well-formed CREATE TRIGGER statement. Semicolons that are embedded within +** string literals or quoted identifier names or comments are not +** independent tokens (they are part of the token in which they are +** embedded) and thus do not count as a statement terminator. Whitespace +** and comments that follow the final semicolon are ignored. +** +** These routines return 0 if the statement is incomplete. If a +** memory allocation fails, then SQLITE_NOMEM is returned. +** +** These routines do not parse the SQL statements thus +** will not detect syntactically incorrect SQL. +** +** If SQLite has not been initialized using [sqlite3_initialize()] prior +** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked +** automatically by sqlite3_complete16(). If that initialization fails, +** then the return value from sqlite3_complete16() will be non-zero +** regardless of whether or not the input SQL is complete. +** +** Requirements: [H10511] [H10512] +** +** The input to [sqlite3_complete()] must be a zero-terminated +** UTF-8 string. +** +** The input to [sqlite3_complete16()] must be a zero-terminated +** UTF-16 string in native byte order. +*/ +SQLITE_API int sqlite3_complete(const char *sql); +SQLITE_API int sqlite3_complete16(const void *sql); + +/* +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors {H12310} +** +** This routine sets a callback function that might be invoked whenever +** an attempt is made to open a database table that another thread +** or process has locked. +** +** If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] +** is returned immediately upon encountering the lock. If the busy callback +** is not NULL, then the callback will be invoked with two arguments. +** +** The first argument to the handler is a copy of the void* pointer which +** is the third argument to sqlite3_busy_handler(). The second argument to +** the handler callback is the number of times that the busy handler has +** been invoked for this locking event. If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. +** If the callback returns non-zero, then another attempt +** is made to open the database for reading and the cycle repeats. +** +** The presence of a busy handler does not guarantee that it will be invoked +** when there is lock contention. If SQLite determines that invoking the busy +** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] +** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** The default busy callback is NULL. +** +** The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] +** when SQLite is in the middle of a large transaction where all the +** changes will not fit into the in-memory cache. SQLite will +** already hold a RESERVED lock on the database file, but it needs +** to promote this lock to EXCLUSIVE so that it can spill cache +** pages into the database file without harm to concurrent +** readers. If it is unable to promote the lock, then the in-memory +** cache will be left in an inconsistent state and so the error +** code is promoted from the relatively benign [SQLITE_BUSY] to +** the more severe [SQLITE_IOERR_BLOCKED]. This error code promotion +** forces an automatic rollback of the changes. See the +** +** CorruptionFollowingBusyError wiki page for a discussion of why +** this is important. +** +** There can only be a single busy handler defined for each +** [database connection]. Setting a new busy handler clears any +** previously set handler. Note that calling [sqlite3_busy_timeout()] +** will also set or clear the busy handler. +** +** The busy callback should not take any actions which modify the +** database connection that invoked the busy handler. Any such actions +** result in undefined behavior. +** +** Requirements: +** [H12311] [H12312] [H12314] [H12316] [H12318] +** +** A busy handler must not close the database connection +** or [prepared statement] that invoked the busy handler. +*/ +SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); + +/* +** CAPI3REF: Set A Busy Timeout {H12340} +** +** This routine sets a [sqlite3_busy_handler | busy handler] that sleeps +** for a specified amount of time when a table is locked. The handler +** will sleep multiple times until at least "ms" milliseconds of sleeping +** have accumulated. {H12343} After "ms" milliseconds of sleeping, +** the handler returns 0 which causes [sqlite3_step()] to return +** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. +** +** Calling this routine with an argument less than or equal to zero +** turns off all busy handlers. +** +** There can only be a single busy handler for a particular +** [database connection] any any given moment. If another busy handler +** was defined (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared. +** +** Requirements: +** [H12341] [H12343] [H12344] +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries {H12370} +** +** Definition: A result table is memory data structure created by the +** [sqlite3_get_table()] interface. A result table records the +** complete query results from one or more queries. +** +** The table conceptually has a number of rows and columns. But +** these numbers are not part of the result table itself. These +** numbers are obtained separately. Let N be the number of rows +** and M be the number of columns. +** +** A result table is an array of pointers to zero-terminated UTF-8 strings. +** There are (N+1)*M elements in the array. The first M pointers point +** to zero-terminated strings that contain the names of the columns. +** The remaining entries all point to query results. NULL values result +** in NULL pointers. All other values are in their UTF-8 zero-terminated +** string representation as returned by [sqlite3_column_text()]. +** +** A result table might consist of one or more memory allocations. +** It is not safe to pass a result table directly to [sqlite3_free()]. +** A result table should be deallocated using [sqlite3_free_table()]. +** +** As an example of the result table format, suppose a query result +** is as follows: +** +**
      +**        Name        | Age
      +**        -----------------------
      +**        Alice       | 43
      +**        Bob         | 28
      +**        Cindy       | 21
      +** 
      +** +** There are two column (M==2) and three rows (N==3). Thus the +** result table has 8 entries. Suppose the result table is stored +** in an array names azResult. Then azResult holds this content: +** +**
      +**        azResult[0] = "Name";
      +**        azResult[1] = "Age";
      +**        azResult[2] = "Alice";
      +**        azResult[3] = "43";
      +**        azResult[4] = "Bob";
      +**        azResult[5] = "28";
      +**        azResult[6] = "Cindy";
      +**        azResult[7] = "21";
      +** 
      +** +** The sqlite3_get_table() function evaluates one or more +** semicolon-separated SQL statements in the zero-terminated UTF-8 +** string of its 2nd parameter. It returns a result table to the +** pointer given in its 3rd parameter. +** +** After the calling function has finished using the result, it should +** pass the pointer to the result table to sqlite3_free_table() in order to +** release the memory that was malloced. Because of the way the +** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling +** function must not try to call [sqlite3_free()] directly. Only +** [sqlite3_free_table()] is able to release the memory properly and safely. +** +** The sqlite3_get_table() interface is implemented as a wrapper around +** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access +** to any internal data structures of SQLite. It uses only the public +** interface defined here. As a consequence, errors that occur in the +** wrapper layer outside of the internal [sqlite3_exec()] call are not +** reflected in subsequent calls to [sqlite3_errcode()] or [sqlite3_errmsg()]. +** +** Requirements: +** [H12371] [H12373] [H12374] [H12376] [H12379] [H12382] +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + char ***pazResult, /* Results of the query */ + int *pnRow, /* Number of result rows written here */ + int *pnColumn, /* Number of result columns written here */ + char **pzErrmsg /* Error msg written here */ +); +SQLITE_API void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions {H17400} +** +** These routines are work-alikes of the "printf()" family of functions +** from the standard C library. +** +** The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** results into memory obtained from [sqlite3_malloc()]. +** The strings returned by these two routines should be +** released by [sqlite3_free()]. Both routines return a +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** memory to hold the resulting string. +** +** In sqlite3_snprintf() routine is similar to "snprintf()" from +** the standard C library. The result is written into the +** buffer supplied as the second parameter whose size is given by +** the first parameter. Note that the order of the +** first two parameters is reversed from snprintf(). This is an +** historical accident that cannot be fixed without breaking +** backwards compatibility. Note also that sqlite3_snprintf() +** returns a pointer to its buffer instead of the number of +** characters actually written into the buffer. We admit that +** the number of characters written would be a more useful return +** value but we cannot change the implementation of sqlite3_snprintf() +** now without breaking compatibility. +** +** As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. The first +** parameter "n" is the total size of the buffer, including space for +** the zero terminator. So the longest string that can be completely +** written will be n-1 characters. +** +** These routines all implement some additional formatting +** options that are useful for constructing SQL statements. +** All of the usual printf() formatting options apply. In addition, there +** is are "%q", "%Q", and "%z" options. +** +** The %q option works like %s in that it substitutes a null-terminated +** string from the argument list. But %q also doubles every '\'' character. +** %q is designed for use inside a string literal. By doubling each '\'' +** character it escapes that character and allows it to be inserted into +** the string. +** +** For example, assume the string variable zText contains text as follows: +** +**
      +**  char *zText = "It's a happy day!";
      +** 
      +** +** One can use this text in an SQL statement as follows: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** Because the %q format string is used, the '\'' character in zText +** is escaped and the SQL generated is as follows: +** +**
      +**  INSERT INTO table1 VALUES('It''s a happy day!')
      +** 
      +** +** This is correct. Had we used %s instead of %q, the generated SQL +** would have looked like this: +** +**
      +**  INSERT INTO table1 VALUES('It's a happy day!');
      +** 
      +** +** This second example is an SQL syntax error. As a general rule you should +** always use %q instead of %s when inserting text into a string literal. +** +** The %Q option works like %q except it also adds single quotes around +** the outside of the total string. Additionally, if the parameter in the +** argument list is a NULL pointer, %Q substitutes the text "NULL" (without +** single quotes) in place of the %Q option. So, for example, one could say: +** +**
      +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
      +**  sqlite3_exec(db, zSQL, 0, 0, 0);
      +**  sqlite3_free(zSQL);
      +** 
      +** +** The code above will render a correct SQL statement in the zSQL +** variable even if the zText variable is a NULL pointer. +** +** The "%z" formatting option works exactly like "%s" with the +** addition that after the string has been read and copied into +** the result, [sqlite3_free()] is called on the input string. {END} +** +** Requirements: +** [H17403] [H17406] [H17407] +*/ +SQLITE_API char *sqlite3_mprintf(const char*,...); +SQLITE_API char *sqlite3_vmprintf(const char*, va_list); +SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); + +/* +** CAPI3REF: Memory Allocation Subsystem {H17300} +** +** The SQLite core uses these three routines for all of its own +** internal memory allocation needs. "Core" in the previous sentence +** does not include operating-system specific VFS implementation. The +** Windows VFS uses native malloc() and free() for some operations. +** +** The sqlite3_malloc() routine returns a pointer to a block +** of memory at least N bytes in length, where N is the parameter. +** If sqlite3_malloc() is unable to obtain sufficient free +** memory, it returns a NULL pointer. If the parameter N to +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** Calling sqlite3_free() with a pointer previously returned +** by sqlite3_malloc() or sqlite3_realloc() releases that memory so +** that it might be reused. The sqlite3_free() routine is +** a no-op if is called with a NULL pointer. Passing a NULL pointer +** to sqlite3_free() is harmless. After being freed, memory +** should neither be read nor written. Even reading previously freed +** memory might result in a segmentation fault or other severe error. +** Memory corruption, a segmentation fault, or other severe error +** might result if sqlite3_free() is called with a non-NULL pointer that +** was not obtained from sqlite3_malloc() or sqlite3_realloc(). +** +** The sqlite3_realloc() interface attempts to resize a +** prior memory allocation to be at least N bytes, where N is the +** second parameter. The memory allocation to be resized is the first +** parameter. If the first parameter to sqlite3_realloc() +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc(). +** If the second parameter to sqlite3_realloc() is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(P) where P is the first parameter to sqlite3_realloc(). +** sqlite3_realloc() returns a pointer to a memory allocation +** of at least N bytes in size or NULL if sufficient memory is unavailable. +** If M is the size of the prior allocation, then min(N,M) bytes +** of the prior allocation are copied into the beginning of buffer returned +** by sqlite3_realloc() and the prior allocation is freed. +** If sqlite3_realloc() returns NULL, then the prior allocation +** is not freed. +** +** The memory returned by sqlite3_malloc() and sqlite3_realloc() +** is always aligned to at least an 8 byte boundary. {END} +** +** The default implementation of the memory allocation subsystem uses +** the malloc(), realloc() and free() provided by the standard C library. +** {H17382} However, if SQLite is compiled with the +** SQLITE_MEMORY_SIZE=NNN C preprocessor macro (where NNN +** is an integer), then SQLite create a static array of at least +** NNN bytes in size and uses that array for all of its dynamic +** memory allocation needs. {END} Additional memory allocator options +** may be added in future releases. +** +** In SQLite version 3.5.0 and 3.5.1, it was possible to define +** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in +** implementation of these routines to be omitted. That capability +** is no longer provided. Only built-in memory allocators can be used. +** +** The Windows OS interface layer calls +** the system malloc() and free() directly when converting +** filenames between the UTF-8 encoding used by SQLite +** and whatever filename encoding is used by the particular Windows +** installation. Memory allocation errors are detected, but +** they are reported back as [SQLITE_CANTOPEN] or +** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. +** +** Requirements: +** [H17303] [H17304] [H17305] [H17306] [H17310] [H17312] [H17315] [H17318] +** [H17321] [H17322] [H17323] +** +** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] +** must be either NULL or else pointers obtained from a prior +** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have +** not yet been released. +** +** The application must not read or write any part of +** a block of memory after it has been released using +** [sqlite3_free()] or [sqlite3_realloc()]. +*/ +SQLITE_API void *sqlite3_malloc(int); +SQLITE_API void *sqlite3_realloc(void*, int); +SQLITE_API void sqlite3_free(void*); + +/* +** CAPI3REF: Memory Allocator Statistics {H17370} +** +** SQLite provides these two interfaces for reporting on the status +** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] +** routines, which form the built-in memory allocation subsystem. +** +** Requirements: +** [H17371] [H17373] [H17374] [H17375] +*/ +SQLITE_API sqlite3_int64 sqlite3_memory_used(void); +SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); + +/* +** CAPI3REF: Pseudo-Random Number Generator {H17390} +** +** SQLite contains a high-quality pseudo-random number generator (PRNG) used to +** select random [ROWID | ROWIDs] when inserting new records into a table that +** already uses the largest possible [ROWID]. The PRNG is also used for +** the build-in random() and randomblob() SQL functions. This interface allows +** applications to access the same PRNG for other purposes. +** +** A call to this routine stores N bytes of randomness into buffer P. +** +** The first time this routine is invoked (either internally or by +** the application) the PRNG is seeded using randomness obtained +** from the xRandomness method of the default [sqlite3_vfs] object. +** On all subsequent invocations, the pseudo-randomness is generated +** internally and without recourse to the [sqlite3_vfs] xRandomness +** method. +** +** Requirements: +** [H17392] +*/ +SQLITE_API void sqlite3_randomness(int N, void *P); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks {H12500} +** +** This routine registers a authorizer callback with a particular +** [database connection], supplied in the first argument. +** The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. At various +** points during the compilation process, as logic is being created +** to perform various actions, the authorizer callback is invoked to +** see if those actions are allowed. The authorizer callback should +** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the +** specific action but allow the SQL statement to continue to be +** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be +** rejected with an error. If the authorizer callback returns +** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] +** then the [sqlite3_prepare_v2()] or equivalent call that triggered +** the authorizer will fail with an error message. +** +** When the callback returns [SQLITE_OK], that means the operation +** requested is ok. When the callback returns [SQLITE_DENY], the +** [sqlite3_prepare_v2()] or equivalent call that triggered the +** authorizer will fail with an error message explaining that +** access is denied. +** +** The first parameter to the authorizer callback is a copy of the third +** parameter to the sqlite3_set_authorizer() interface. The second parameter +** to the callback is an integer [SQLITE_COPY | action code] that specifies +** the particular action to be authorized. The third through sixth parameters +** to the callback are zero-terminated strings that contain additional +** details about the action to be authorized. +** +** If the action code is [SQLITE_READ] +** and the callback returns [SQLITE_IGNORE] then the +** [prepared statement] statement is constructed to substitute +** a NULL value in place of the table column that would have +** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] +** return can be used to deny an untrusted user access to individual +** columns of a table. +** If the action code is [SQLITE_DELETE] and the callback returns +** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the +** [truncate optimization] is disabled and all rows are deleted individually. +** +** An authorizer is used when [sqlite3_prepare | preparing] +** SQL statements from an untrusted source, to ensure that the SQL statements +** do not try to access data they are not allowed to see, or that they do not +** try to execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being [sqlite3_prepare | prepared] that +** disallows everything except [SELECT] statements. +** +** Applications that need to process SQL from untrusted sources +** might also consider lowering resource limits using [sqlite3_limit()] +** and limiting database size using the [max_page_count] [PRAGMA] +** in addition to using an authorizer. +** +** Only a single authorizer can be in place on a database connection +** at a time. Each call to sqlite3_set_authorizer overrides the +** previous call. Disable the authorizer by installing a NULL callback. +** The authorizer is disabled by default. +** +** The authorizer callback must not do anything that will modify +** the database connection that invoked the authorizer callback. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** When [sqlite3_prepare_v2()] is used to prepare a statement, the +** statement might be re-prepared during [sqlite3_step()] due to a +** schema change. Hence, the application should ensure that the +** correct authorizer callback remains in place during the [sqlite3_step()]. +** +** Note that the authorizer callback is invoked only during +** [sqlite3_prepare()] or its variants. Authorization is not +** performed during statement evaluation in [sqlite3_step()], unless +** as stated in the previous paragraph, sqlite3_step() invokes +** sqlite3_prepare_v2() to reprepare a statement after a schema change. +** +** Requirements: +** [H12501] [H12502] [H12503] [H12504] [H12505] [H12506] [H12507] [H12510] +** [H12511] [H12512] [H12520] [H12521] [H12522] +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes {H12590} +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes {H12550} +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorize certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** These action code values signify what kind of operation is to be +** authorized. The 3rd and 4th parameters to the authorization +** callback function will be parameters or NULL depending on which of these +** codes is used as the second parameter. The 5th parameter to the +** authorizer callback is the name of the database ("main", "temp", +** etc.) if applicable. The 6th parameter to the authorizer callback +** is the name of the inner-most trigger or view that is responsible for +** the access attempt or NULL if this access attempt is directly from +** top-level SQL code. +** +** Requirements: +** [H12551] [H12552] [H12553] [H12554] +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* Operation NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* NULL Function Name */ +#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ +#define SQLITE_COPY 0 /* No longer used */ + +/* +** CAPI3REF: Tracing And Profiling Functions {H12280} +** EXPERIMENTAL +** +** These routines register callback functions that can be used for +** tracing and profiling the execution of SQL statements. +** +** The callback function registered by sqlite3_trace() is invoked at +** various times when an SQL statement is being run by [sqlite3_step()]. +** The callback returns a UTF-8 rendering of the SQL statement text +** as the statement first begins executing. Additional callbacks occur +** as each triggered subprogram is entered. The callbacks for triggers +** contain a UTF-8 SQL comment that identifies the trigger. +** +** The callback function registered by sqlite3_profile() is invoked +** as each SQL statement finishes. The profile callback contains +** the original statement text and an estimate of wall-clock time +** of how long that statement took to run. +** +** Requirements: +** [H12281] [H12282] [H12283] [H12284] [H12285] [H12287] [H12288] [H12289] +** [H12290] +*/ +SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: Query Progress Callbacks {H12910} +** +** This routine configures a callback function - the +** progress callback - that is invoked periodically during long +** running calls to [sqlite3_exec()], [sqlite3_step()] and +** [sqlite3_get_table()]. An example use for this +** interface is to keep a GUI updated during a large query. +** +** If the progress callback returns non-zero, the operation is +** interrupted. This feature can be used to implement a +** "Cancel" button on a GUI progress dialog box. +** +** The progress handler must not do anything that will modify +** the database connection that invoked the progress handler. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** Requirements: +** [H12911] [H12912] [H12913] [H12914] [H12915] [H12916] [H12917] [H12918] +** +*/ +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection {H12700} +** +** These routines open an SQLite database file whose name is given by the +** filename argument. The filename argument is interpreted as UTF-8 for +** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte +** order for sqlite3_open16(). A [database connection] handle is usually +** returned in *ppDb, even if an error occurs. The only exception is that +** if SQLite is unable to allocate memory to hold the [sqlite3] object, +** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] +** object. If the database is opened (and/or created) successfully, then +** [SQLITE_OK] is returned. Otherwise an [error code] is returned. The +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error. +** +** The default encoding for the database will be UTF-8 if +** sqlite3_open() or sqlite3_open_v2() is called and +** UTF-16 in the native byte order if sqlite3_open16() is used. +** +** Whether or not an error occurs when it is opened, resources +** associated with the [database connection] handle should be released by +** passing it to [sqlite3_close()] when it is no longer required. +** +** The sqlite3_open_v2() interface works like sqlite3_open() +** except that it accepts two additional parameters for additional control +** over the new database connection. The flags parameter can take one of +** the following three values, optionally combined with the +** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], +** and/or [SQLITE_OPEN_PRIVATECACHE] flags: +** +**
      +**
      [SQLITE_OPEN_READONLY]
      +**
      The database is opened in read-only mode. If the database does not +** already exist, an error is returned.
      +** +**
      [SQLITE_OPEN_READWRITE]
      +**
      The database is opened for reading and writing if possible, or reading +** only if the file is write protected by the operating system. In either +** case the database must already exist, otherwise an error is returned.
      +** +**
      [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
      +**
      The database is opened for reading and writing, and is creates it if +** it does not already exist. This is the behavior that is always used for +** sqlite3_open() and sqlite3_open16().
      +**
      +** +** If the 3rd parameter to sqlite3_open_v2() is not one of the +** combinations shown above or one of the combinations shown above combined +** with the [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], +** [SQLITE_OPEN_SHAREDCACHE] and/or [SQLITE_OPEN_SHAREDCACHE] flags, +** then the behavior is undefined. +** +** If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection +** opens in the multi-thread [threading mode] as long as the single-thread +** mode has not been set at compile-time or start-time. If the +** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens +** in the serialized [threading mode] unless single-thread was +** previously selected at compile-time or start-time. +** The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be +** eligible to use [shared cache mode], regardless of whether or not shared +** cache is enabled using [sqlite3_enable_shared_cache()]. The +** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not +** participate in [shared cache mode] even if it is enabled. +** +** If the filename is ":memory:", then a private, temporary in-memory database +** is created for the connection. This in-memory database will vanish when +** the database connection is closed. Future versions of SQLite might +** make use of additional special filenames that begin with the ":" character. +** It is recommended that when a database filename actually does begin with +** a ":" character you should prefix the filename with a pathname such as +** "./" to avoid ambiguity. +** +** If the filename is an empty string, then a private, temporary +** on-disk database will be created. This private database will be +** automatically deleted as soon as the database connection is closed. +** +** The fourth parameter to sqlite3_open_v2() is the name of the +** [sqlite3_vfs] object that defines the operating system interface that +** the new database connection should use. If the fourth parameter is +** a NULL pointer then the default [sqlite3_vfs] object is used. +** +** Note to Windows users: The encoding used for the filename argument +** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever +** codepage is currently defined. Filenames containing international +** characters must be converted to UTF-8 prior to passing them into +** sqlite3_open() or sqlite3_open_v2(). +** +** Requirements: +** [H12701] [H12702] [H12703] [H12704] [H12706] [H12707] [H12709] [H12711] +** [H12712] [H12713] [H12714] [H12717] [H12719] [H12721] [H12723] +*/ +SQLITE_API int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Error Codes And Messages {H12800} +** +** The sqlite3_errcode() interface returns the numeric [result code] or +** [extended result code] for the most recent failed sqlite3_* API call +** associated with a [database connection]. If a prior API call failed +** but the most recent API call succeeded, the return value from +** sqlite3_errcode() is undefined. The sqlite3_extended_errcode() +** interface is the same except that it always returns the +** [extended result code] even when extended result codes are +** disabled. +** +** The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** text that describes the error, as either UTF-8 or UTF-16 respectively. +** Memory to hold the error message string is managed internally. +** The application does not need to worry about freeing the result. +** However, the error string might be overwritten or deallocated by +** subsequent calls to other SQLite interface functions. +** +** When the serialized [threading mode] is in use, it might be the +** case that a second error occurs on a separate thread in between +** the time of the first error and the call to these interfaces. +** When that happens, the second error will be reported since these +** interfaces always report the most recent result. To avoid +** this, each thread can obtain exclusive use of the [database connection] D +** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning +** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after +** all calls to the interfaces listed here are completed. +** +** If an interface fails with SQLITE_MISUSE, that means the interface +** was invoked incorrectly by the application. In that case, the +** error code and message may or may not be set. +** +** Requirements: +** [H12801] [H12802] [H12803] [H12807] [H12808] [H12809] +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db); +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); +SQLITE_API const char *sqlite3_errmsg(sqlite3*); +SQLITE_API const void *sqlite3_errmsg16(sqlite3*); + +/* +** CAPI3REF: SQL Statement Object {H13000} +** KEYWORDS: {prepared statement} {prepared statements} +** +** An instance of this object represents a single SQL statement. +** This object is variously known as a "prepared statement" or a +** "compiled SQL statement" or simply as a "statement". +** +** The life of a statement object goes something like this: +** +**
        +**
      1. Create the object using [sqlite3_prepare_v2()] or a related +** function. +**
      2. Bind values to [host parameters] using the sqlite3_bind_*() +** interfaces. +**
      3. Run the SQL by calling [sqlite3_step()] one or more times. +**
      4. Reset the statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
      5. Destroy the object using [sqlite3_finalize()]. +**
      +** +** Refer to documentation on individual methods above for additional +** information. +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Run-time Limits {H12760} +** +** This interface allows the size of various constructs to be limited +** on a connection by connection basis. The first parameter is the +** [database connection] whose limit is to be set or queried. The +** second parameter is one of the [limit categories] that define a +** class of constructs to be size limited. The third parameter is the +** new limit for that construct. The function returns the old limit. +** +** If the new limit is a negative number, the limit is unchanged. +** For the limit category of SQLITE_LIMIT_XYZ there is a +** [limits | hard upper bound] +** set by a compile-time C preprocessor macro named +** [limits | SQLITE_MAX_XYZ]. +** (The "_LIMIT_" in the name is changed to "_MAX_".) +** Attempts to increase a limit above its hard upper bound are +** silently truncated to the hard upper limit. +** +** Run time limits are intended for use in applications that manage +** both their own internal database and also databases that are controlled +** by untrusted external sources. An example application might be a +** web browser that has its own databases for storing history and +** separate databases controlled by JavaScript applications downloaded +** off the Internet. The internal databases can be given the +** large, default limits. Databases managed by external sources can +** be given much smaller limits designed to prevent a denial of service +** attack. Developers might also want to use the [sqlite3_set_authorizer()] +** interface to further control untrusted SQL. The size of the database +** created by an untrusted script can be contained using the +** [max_page_count] [PRAGMA]. +** +** New run-time limit categories may be added in future releases. +** +** Requirements: +** [H12762] [H12766] [H12769] +*/ +SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); + +/* +** CAPI3REF: Run-Time Limit Categories {H12790} +** KEYWORDS: {limit category} {limit categories} +** +** These constants define various performance limits +** that can be lowered at run-time using [sqlite3_limit()]. +** The synopsis of the meanings of the various limits is shown below. +** Additional information is available at [limits | Limits in SQLite]. +** +**
      +**
      SQLITE_LIMIT_LENGTH
      +**
      The maximum size of any string or BLOB or table row.
      +** +**
      SQLITE_LIMIT_SQL_LENGTH
      +**
      The maximum length of an SQL statement.
      +** +**
      SQLITE_LIMIT_COLUMN
      +**
      The maximum number of columns in a table definition or in the +** result set of a [SELECT] or the maximum number of columns in an index +** or in an ORDER BY or GROUP BY clause.
      +** +**
      SQLITE_LIMIT_EXPR_DEPTH
      +**
      The maximum depth of the parse tree on any expression.
      +** +**
      SQLITE_LIMIT_COMPOUND_SELECT
      +**
      The maximum number of terms in a compound SELECT statement.
      +** +**
      SQLITE_LIMIT_VDBE_OP
      +**
      The maximum number of instructions in a virtual machine program +** used to implement an SQL statement.
      +** +**
      SQLITE_LIMIT_FUNCTION_ARG
      +**
      The maximum number of arguments on a function.
      +** +**
      SQLITE_LIMIT_ATTACHED
      +**
      The maximum number of [ATTACH | attached databases].
      +** +**
      SQLITE_LIMIT_LIKE_PATTERN_LENGTH
      +**
      The maximum length of the pattern argument to the [LIKE] or +** [GLOB] operators.
      +** +**
      SQLITE_LIMIT_VARIABLE_NUMBER
      +**
      The maximum number of variables in an SQL statement that can +** be bound.
      +** +**
      SQLITE_LIMIT_TRIGGER_DEPTH
      +**
      The maximum depth of recursion for triggers.
      +**
      +*/ +#define SQLITE_LIMIT_LENGTH 0 +#define SQLITE_LIMIT_SQL_LENGTH 1 +#define SQLITE_LIMIT_COLUMN 2 +#define SQLITE_LIMIT_EXPR_DEPTH 3 +#define SQLITE_LIMIT_COMPOUND_SELECT 4 +#define SQLITE_LIMIT_VDBE_OP 5 +#define SQLITE_LIMIT_FUNCTION_ARG 6 +#define SQLITE_LIMIT_ATTACHED 7 +#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +#define SQLITE_LIMIT_VARIABLE_NUMBER 9 +#define SQLITE_LIMIT_TRIGGER_DEPTH 10 + +/* +** CAPI3REF: Compiling An SQL Statement {H13010} +** KEYWORDS: {SQL statement compiler} +** +** To execute an SQL query, it must first be compiled into a byte-code +** program using one of these routines. +** +** The first argument, "db", is a [database connection] obtained from a +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. +** +** The second argument, "zSql", is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() +** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() +** use UTF-16. +** +** If the nByte argument is less than zero, then zSql is read up to the +** first zero terminator. If nByte is non-negative, then it is the maximum +** number of bytes read from zSql. When nByte is non-negative, the +** zSql string ends at either the first '\000' or '\u0000' character or +** the nByte-th byte, whichever comes first. If the caller knows +** that the supplied string is nul-terminated, then there is a small +** performance advantage to be gained by passing an nByte parameter that +** is equal to the number of bytes in the input string including +** the nul-terminator bytes. +** +** If pzTail is not NULL then *pzTail is made to point to the first byte +** past the end of the first SQL statement in zSql. These routines only +** compile the first statement in zSql, so *pzTail is left pointing to +** what remains uncompiled. +** +** *ppStmt is left pointing to a compiled [prepared statement] that can be +** executed using [sqlite3_step()]. If there is an error, *ppStmt is set +** to NULL. If the input text contains no SQL (if the input is an empty +** string or a comment) then *ppStmt is set to NULL. +** The calling procedure is responsible for deleting the compiled +** SQL statement using [sqlite3_finalize()] after it has finished with it. +** ppStmt may not be NULL. +** +** On success, [SQLITE_OK] is returned, otherwise an [error code] is returned. +** +** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are +** recommended for all new programs. The two older interfaces are retained +** for backwards compatibility, but their use is discouraged. +** In the "v2" interfaces, the prepared statement +** that is returned (the [sqlite3_stmt] object) contains a copy of the +** original SQL text. This causes the [sqlite3_step()] interface to +** behave a differently in two ways: +** +**
        +**
      1. +** If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** always used to do, [sqlite3_step()] will automatically recompile the SQL +** statement and try to run it again. If the schema has changed in +** a way that makes the statement no longer valid, [sqlite3_step()] will still +** return [SQLITE_SCHEMA]. But unlike the legacy behavior, [SQLITE_SCHEMA] is +** now a fatal error. Calling [sqlite3_prepare_v2()] again will not make the +** error go away. Note: use [sqlite3_errmsg()] to find the text +** of the parsing error that results in an [SQLITE_SCHEMA] return. +**
      2. +** +**
      3. +** When an error occurs, [sqlite3_step()] will return one of the detailed +** [error codes] or [extended error codes]. The legacy behavior was that +** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code +** and you would have to make a second call to [sqlite3_reset()] in order +** to find the underlying cause of the problem. With the "v2" prepare +** interfaces, the underlying reason for the error is returned immediately. +**
      4. +**
      +** +** Requirements: +** [H13011] [H13012] [H13013] [H13014] [H13015] [H13016] [H13019] [H13021] +** +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Retrieving Statement SQL {H13100} +** +** This interface can be used to retrieve a saved copy of the original +** SQL text used to create a [prepared statement] if that statement was +** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. +** +** Requirements: +** [H13101] [H13102] [H13103] +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Dynamically Typed Value Object {H15000} +** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} +** +** SQLite uses the sqlite3_value object to represent all values +** that can be stored in a database table. SQLite uses dynamic typing +** for the values it stores. Values stored in sqlite3_value objects +** can be integers, floating point values, strings, BLOBs, or NULL. +** +** An sqlite3_value object may be either "protected" or "unprotected". +** Some interfaces require a protected sqlite3_value. Other interfaces +** will accept either a protected or an unprotected sqlite3_value. +** Every interface that accepts sqlite3_value arguments specifies +** whether or not it requires a protected sqlite3_value. +** +** The terms "protected" and "unprotected" refer to whether or not +** a mutex is held. A internal mutex is held for a protected +** sqlite3_value object but no mutex is held for an unprotected +** sqlite3_value object. If SQLite is compiled to be single-threaded +** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) +** or if SQLite is run in one of reduced mutex modes +** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] +** then there is no distinction between protected and unprotected +** sqlite3_value objects and they can be used interchangeably. However, +** for maximum code portability it is recommended that applications +** still make the distinction between between protected and unprotected +** sqlite3_value objects even when not strictly required. +** +** The sqlite3_value objects that are passed as parameters into the +** implementation of [application-defined SQL functions] are protected. +** The sqlite3_value object returned by +** [sqlite3_column_value()] is unprotected. +** Unprotected sqlite3_value objects may only be used with +** [sqlite3_result_value()] and [sqlite3_bind_value()]. +** The [sqlite3_value_blob | sqlite3_value_type()] family of +** interfaces require protected sqlite3_value objects. +*/ +typedef struct Mem sqlite3_value; + +/* +** CAPI3REF: SQL Function Context Object {H16001} +** +** The context in which an SQL function executes is stored in an +** sqlite3_context object. A pointer to an sqlite3_context object +** is always first parameter to [application-defined SQL functions]. +** The application-defined SQL function implementation will pass this +** pointer through into calls to [sqlite3_result_int | sqlite3_result()], +** [sqlite3_aggregate_context()], [sqlite3_user_data()], +** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], +** and/or [sqlite3_set_auxdata()]. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements {H13500} +** KEYWORDS: {host parameter} {host parameters} {host parameter name} +** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** +** In the SQL strings input to [sqlite3_prepare_v2()] and its variants, +** literals may be replaced by a [parameter] that matches one of following +** templates: +** +**
        +**
      • ? +**
      • ?NNN +**
      • :VVV +**
      • @VVV +**
      • $VVV +**
      +** +** In the templates above, NNN represents an integer literal, +** and VVV represents an alphanumeric identifer. The values of these +** parameters (also called "host parameter names" or "SQL parameters") +** can be set using the sqlite3_bind_*() routines defined here. +** +** The first argument to the sqlite3_bind_*() routines is always +** a pointer to the [sqlite3_stmt] object returned from +** [sqlite3_prepare_v2()] or its variants. +** +** The second argument is the index of the SQL parameter to be set. +** The leftmost SQL parameter has an index of 1. When the same named +** SQL parameter is used more than once, second and subsequent +** occurrences have the same index as the first occurrence. +** The index for named parameters can be looked up using the +** [sqlite3_bind_parameter_index()] API if desired. The index +** for "?NNN" parameters is the value of NNN. +** The NNN value must be between 1 and the [sqlite3_limit()] +** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). +** +** The third argument is the value to bind to the parameter. +** +** In those routines that have a fourth argument, its value is the +** number of bytes in the parameter. To be clear: the value is the +** number of bytes in the value, not the number of characters. +** If the fourth parameter is negative, the length of the string is +** the number of bytes up to the first zero terminator. +** +** The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and +** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or +** string after SQLite has finished with it. If the fifth argument is +** the special value [SQLITE_STATIC], then SQLite assumes that the +** information is in static, unmanaged space and does not need to be freed. +** If the fifth argument has the value [SQLITE_TRANSIENT], then +** SQLite makes its own private copy of the data immediately, before +** the sqlite3_bind_*() routine returns. +** +** The sqlite3_bind_zeroblob() routine binds a BLOB of length N that +** is filled with zeroes. A zeroblob uses a fixed amount of memory +** (just an integer to hold its size) while it is being processed. +** Zeroblobs are intended to serve as placeholders for BLOBs whose +** content is later written using +** [sqlite3_blob_open | incremental BLOB I/O] routines. +** A negative value for the zeroblob results in a zero-length BLOB. +** +** The sqlite3_bind_*() routines must be called after +** [sqlite3_prepare_v2()] (and its variants) or [sqlite3_reset()] and +** before [sqlite3_step()]. +** Bindings are not cleared by the [sqlite3_reset()] routine. +** Unbound parameters are interpreted as NULL. +** +** These routines return [SQLITE_OK] on success or an error code if +** anything goes wrong. [SQLITE_RANGE] is returned if the parameter +** index is out of range. [SQLITE_NOMEM] is returned if malloc() fails. +** [SQLITE_MISUSE] might be returned if these routines are called on a +** virtual machine that is the wrong state or which has already been finalized. +** Detection of misuse is unreliable. Applications should not depend +** on SQLITE_MISUSE returns. SQLITE_MISUSE is intended to indicate a +** a logic error in the application. Future versions of SQLite might +** panic rather than return SQLITE_MISUSE. +** +** See also: [sqlite3_bind_parameter_count()], +** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. +** +** Requirements: +** [H13506] [H13509] [H13512] [H13515] [H13518] [H13521] [H13524] [H13527] +** [H13530] [H13533] [H13536] [H13539] [H13542] [H13545] [H13548] [H13551] +** +*/ +SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); +SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); +SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); +SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); +SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); + +/* +** CAPI3REF: Number Of SQL Parameters {H13600} +** +** This routine can be used to find the number of [SQL parameters] +** in a [prepared statement]. SQL parameters are tokens of the +** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as +** placeholders for values that are [sqlite3_bind_blob | bound] +** to the parameters at a later time. +** +** This routine actually returns the index of the largest (rightmost) +** parameter. For all forms except ?NNN, this will correspond to the +** number of unique parameters. If parameters of the ?NNN are used, +** there may be gaps in the list. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_name()], and +** [sqlite3_bind_parameter_index()]. +** +** Requirements: +** [H13601] +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter {H13620} +** +** This routine returns a pointer to the name of the n-th +** [SQL parameter] in a [prepared statement]. +** SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" +** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" +** respectively. +** In other words, the initial ":" or "$" or "@" or "?" +** is included as part of the name. +** Parameters of the form "?" without a following integer have no name +** and are also referred to as "anonymous parameters". +** +** The first host parameter has an index of 1, not 0. +** +** If the value n is out of range or if the n-th parameter is +** nameless, then NULL is returned. The returned string is +** always in UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()] or +** [sqlite3_prepare16_v2()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +** +** Requirements: +** [H13621] +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name {H13640} +** +** Return the index of an SQL parameter given its name. The +** index value returned is suitable for use as the second +** parameter to [sqlite3_bind_blob|sqlite3_bind()]. A zero +** is returned if no matching parameter is found. The parameter +** name must be given in UTF-8 even if the original statement +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +** +** Requirements: +** [H13641] +*/ +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement {H13660} +** +** Contrary to the intuition of many, [sqlite3_reset()] does not reset +** the [sqlite3_bind_blob | bindings] on a [prepared statement]. +** Use this routine to reset all host parameters to NULL. +** +** Requirements: +** [H13661] +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set {H13710} +** +** Return the number of columns in the result set returned by the +** [prepared statement]. This routine returns 0 if pStmt is an SQL +** statement that does not return data (for example an [UPDATE]). +** +** Requirements: +** [H13711] +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set {H13720} +** +** These routines return the name assigned to a particular column +** in the result set of a [SELECT] statement. The sqlite3_column_name() +** interface returns a pointer to a zero-terminated UTF-8 string +** and sqlite3_column_name16() returns a pointer to a zero-terminated +** UTF-16 string. The first parameter is the [prepared statement] +** that implements the [SELECT] statement. The second parameter is the +** column number. The leftmost column is number 0. +** +** The returned string pointer is valid until either the [prepared statement] +** is destroyed by [sqlite3_finalize()] or until the next call to +** sqlite3_column_name() or sqlite3_column_name16() on the same column. +** +** If sqlite3_malloc() fails during the processing of either routine +** (for example during a conversion from UTF-8 to UTF-16) then a +** NULL pointer is returned. +** +** The name of a result column is the value of the "AS" clause for +** that column, if there is an AS clause. If there is no AS clause +** then the name of the column is unspecified and may change from +** one release of SQLite to the next. +** +** Requirements: +** [H13721] [H13723] [H13724] [H13725] [H13726] [H13727] +*/ +SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); +SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); + +/* +** CAPI3REF: Source Of Data In A Query Result {H13740} +** +** These routines provide a means to determine what column of what +** table in which database a result of a [SELECT] statement comes from. +** The name of the database or table or column can be returned as +** either a UTF-8 or UTF-16 string. The _database_ routines return +** the database name, the _table_ routines return the table name, and +** the origin_ routines return the column name. +** The returned string is valid until the [prepared statement] is destroyed +** using [sqlite3_finalize()] or until the same information is requested +** again in a different encoding. +** +** The names returned are the original un-aliased names of the +** database, table, and column. +** +** The first argument to the following calls is a [prepared statement]. +** These functions return information about the Nth column returned by +** the statement, where N is the second function argument. +** +** If the Nth column returned by the statement is an expression or +** subquery and is not a column value, then all of these functions return +** NULL. These routine might also return NULL if a memory allocation error +** occurs. Otherwise, they return the name of the attached database, table +** and column that query result column was extracted from. +** +** As with all other SQLite APIs, those postfixed with "16" return +** UTF-16 encoded strings, the other functions return UTF-8. {END} +** +** These APIs are only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. +** +** {A13751} +** If two or more threads call one or more of these routines against the same +** prepared statement and column at the same time then the results are +** undefined. +** +** Requirements: +** [H13741] [H13742] [H13743] [H13744] [H13745] [H13746] [H13748] +** +** If two or more threads call one or more +** [sqlite3_column_database_name | column metadata interfaces] +** for the same [prepared statement] and result column +** at the same time then the results are undefined. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Declared Datatype Of A Query Result {H13760} +** +** The first parameter is a [prepared statement]. +** If this statement is a [SELECT] statement and the Nth column of the +** returned result set of that [SELECT] is a table column (not an +** expression or subquery) then the declared type of the table +** column is returned. If the Nth column of the result set is an +** expression or subquery, then a NULL pointer is returned. +** The returned string is always UTF-8 encoded. {END} +** +** For example, given the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** and the following statement to be compiled: +** +** SELECT c1 + 1, c1 FROM t1; +** +** this routine would return the string "VARIANT" for the second result +** column (i==1), and a NULL pointer for the first result column (i==0). +** +** SQLite uses dynamic run-time typing. So just because a column +** is declared to contain a particular type does not mean that the +** data stored in that column is of the declared type. SQLite is +** strongly typed, but the typing is dynamic not static. Type +** is associated with individual values, not with the containers +** used to hold those values. +** +** Requirements: +** [H13761] [H13762] [H13763] +*/ +SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Evaluate An SQL Statement {H13200} +** +** After a [prepared statement] has been prepared using either +** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function +** must be called one or more times to evaluate the statement. +** +** The details of the behavior of the sqlite3_step() interface depend +** on whether the statement was prepared using the newer "v2" interface +** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy +** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "v2" interface is recommended for new applications but the legacy +** interface will continue to be supported. +** +** In the legacy interface, the return value will be either [SQLITE_BUSY], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** With the "v2" interface, any of the other [result codes] or +** [extended result codes] might be returned as well. +** +** [SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. If the statement is a [COMMIT] +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a [COMMIT] and occurs within a +** explicit transaction then you should rollback the transaction before +** continuing. +** +** [SQLITE_DONE] means that the statement has finished executing +** successfully. sqlite3_step() should not be called again on this virtual +** machine without first calling [sqlite3_reset()] to reset the virtual +** machine back to its initial state. +** +** If the SQL statement being executed returns any data, then [SQLITE_ROW] +** is returned each time a new row of data is ready for processing by the +** caller. The values may be accessed using the [column access functions]. +** sqlite3_step() is called again to retrieve the next row of data. +** +** [SQLITE_ERROR] means that a run-time error (such as a constraint +** violation) has occurred. sqlite3_step() should not be called again on +** the VM. More information may be found by calling [sqlite3_errmsg()]. +** With the legacy interface, a more specific error code (for example, +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [prepared statement]. In the "v2" interface, +** the more specific error code is returned directly by sqlite3_step(). +** +** [SQLITE_MISUSE] means that the this routine was called inappropriately. +** Perhaps it was called on a [prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** Goofy Interface Alert: In the legacy interface, the sqlite3_step() +** API always returns a generic error code, [SQLITE_ERROR], following any +** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call +** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the +** specific [error codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead +** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, +** then the more specific [error codes] are returned directly +** by sqlite3_step(). The use of the "v2" interface is recommended. +** +** Requirements: +** [H13202] [H15304] [H15306] [H15308] [H15310] +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set {H13770} +** +** Returns the number of values in the current row of the result set. +** +** Requirements: +** [H13771] [H13772] +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes {H10265} +** KEYWORDS: SQLITE_TEXT +** +** {H10266} Every value in SQLite has one of five fundamental datatypes: +** +**
        +**
      • 64-bit signed integer +**
      • 64-bit IEEE floating point number +**
      • string +**
      • BLOB +**
      • NULL +**
      {END} +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Result Values From A Query {H13800} +** KEYWORDS: {column access functions} +** +** These routines form the "result set query" interface. +** +** These routines return information about a single column of the current +** result row of a query. In every case the first argument is a pointer +** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] +** that was returned from [sqlite3_prepare_v2()] or one of its variants) +** and the second argument is the index of the column for which information +** should be returned. The leftmost column of the result set has the index 0. +** +** If the SQL statement does not currently point to a valid row, or if the +** column index is out of range, the result is undefined. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** The sqlite3_column_type() routine returns the +** [SQLITE_INTEGER | datatype code] for the initial data type +** of the result column. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value +** returned by sqlite3_column_type() is only meaningful if no type +** conversions have occurred as described below. After a type conversion, +** the value returned by sqlite3_column_type() is undefined. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** routine returns the number of bytes in that BLOB or string. +** If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** the string to UTF-8 and then returns the number of bytes. +** If the result is a numeric value then sqlite3_column_bytes() uses +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns +** the number of bytes in that string. +** The value returned does not include the zero terminator at the end +** of the string. For clarity: the value returned is the number of +** bytes in the string, not the number of characters. +** +** Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even empty strings, are always zero terminated. The return +** value from sqlite3_column_blob() for a zero-length BLOB is an arbitrary +** pointer, possibly even a NULL pointer. +** +** The sqlite3_column_bytes16() routine is similar to sqlite3_column_bytes() +** but leaves the result in UTF-16 in native byte order instead of UTF-8. +** The zero terminator is not included in this count. +** +** The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. An unprotected sqlite3_value object +** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. +** If the [unprotected sqlite3_value] object returned by +** [sqlite3_column_value()] is used in any other way, including calls +** to routines like [sqlite3_value_int()], [sqlite3_value_text()], +** or [sqlite3_value_bytes()], then the behavior is undefined. +** +** These routines attempt to convert the value where appropriate. For +** example, if the internal representation is FLOAT and a text result +** is requested, [sqlite3_snprintf()] is used internally to perform the +** conversion automatically. The following table details the conversions +** that are applied: +** +**
      +**
      +**
      Internal
      Type
      Requested
      Type
      Conversion +** +**
      NULL INTEGER Result is 0 +**
      NULL FLOAT Result is 0.0 +**
      NULL TEXT Result is NULL pointer +**
      NULL BLOB Result is NULL pointer +**
      INTEGER FLOAT Convert from integer to float +**
      INTEGER TEXT ASCII rendering of the integer +**
      INTEGER BLOB Same as INTEGER->TEXT +**
      FLOAT INTEGER Convert from float to integer +**
      FLOAT TEXT ASCII rendering of the float +**
      FLOAT BLOB Same as FLOAT->TEXT +**
      TEXT INTEGER Use atoi() +**
      TEXT FLOAT Use atof() +**
      TEXT BLOB No change +**
      BLOB INTEGER Convert to TEXT then use atoi() +**
      BLOB FLOAT Convert to TEXT then use atof() +**
      BLOB TEXT Add a zero terminator if needed +**
      +** +** +** The table above makes reference to standard C library functions atoi() +** and atof(). SQLite does not really use these functions. It has its +** own equivalent internal routines. The atoi() and atof() names are +** used in the table for brevity and because they are familiar to most +** C programmers. +** +** Note that when type conversions occur, pointers returned by prior +** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or +** sqlite3_column_text16() may be invalidated. +** Type conversions and pointer invalidations might occur +** in the following cases: +** +**
        +**
      • The initial content is a BLOB and sqlite3_column_text() or +** sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.
      • +**
      • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.
      • +**
      • The initial content is UTF-16 text and sqlite3_column_bytes() or +** sqlite3_column_text() is called. The content must be converted +** to UTF-8.
      • +**
      +** +** Conversions between UTF-16be and UTF-16le are always done in place and do +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer points to will have been modified. Other kinds +** of conversion are done in place when it is possible, but sometimes they +** are not possible and in those cases prior pointers are invalidated. +** +** The safest and easiest to remember policy is to invoke these routines +** in one of the following ways: +** +**
        +**
      • sqlite3_column_text() followed by sqlite3_column_bytes()
      • +**
      • sqlite3_column_blob() followed by sqlite3_column_bytes()
      • +**
      • sqlite3_column_text16() followed by sqlite3_column_bytes16()
      • +**
      +** +** In other words, you should call sqlite3_column_text(), +** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result +** into the desired format, then invoke sqlite3_column_bytes() or +** sqlite3_column_bytes16() to find the size of the result. Do not mix calls +** to sqlite3_column_text() or sqlite3_column_blob() with calls to +** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() +** with calls to sqlite3_column_bytes(). +** +** The pointers returned are valid until a type conversion occurs as +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. The memory space used to hold strings +** and BLOBs is freed automatically. Do not pass the pointers returned +** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** If a memory allocation error occurs during the evaluation of any +** of these routines, a default value is returned. The default value +** is either the integer 0, the floating point number 0.0, or a NULL +** pointer. Subsequent calls to [sqlite3_errcode()] will return +** [SQLITE_NOMEM]. +** +** Requirements: +** [H13803] [H13806] [H13809] [H13812] [H13815] [H13818] [H13821] [H13824] +** [H13827] [H13830] +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object {H13300} +** +** The sqlite3_finalize() function is called to delete a [prepared statement]. +** If the statement was executed successfully or not executed at all, then +** SQLITE_OK is returned. If execution of the statement failed then an +** [error code] or [extended error code] is returned. +** +** This routine can be called at any point during the execution of the +** [prepared statement]. If the virtual machine has not +** completed execution when this routine is called, that is like +** encountering an error or an [sqlite3_interrupt | interrupt]. +** Incomplete updates may be rolled back and transactions canceled, +** depending on the circumstances, and the +** [error code] returned will be [SQLITE_ABORT]. +** +** Requirements: +** [H11302] [H11304] +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object {H13330} +** +** The sqlite3_reset() function is called to reset a [prepared statement] +** object back to its initial state, ready to be re-executed. +** Any SQL statement variables that had values bound to them using +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +** +** {H11332} The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. +** +** {H11334} If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], +** or if [sqlite3_step(S)] has never before been called on S, +** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** +** {H11336} If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. +** +** {H11338} The [sqlite3_reset(S)] interface does not change the values +** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. +*/ +SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Create Or Redefine SQL Functions {H16100} +** KEYWORDS: {function creation routines} +** KEYWORDS: {application-defined SQL function} +** KEYWORDS: {application-defined SQL functions} +** +** These two functions (collectively known as "function creation routines") +** are used to add SQL functions or aggregates or to redefine the behavior +** of existing SQL functions or aggregates. The only difference between the +** two is that the second parameter, the name of the (scalar) function or +** aggregate, is encoded in UTF-8 for sqlite3_create_function() and UTF-16 +** for sqlite3_create_function16(). +** +** The first parameter is the [database connection] to which the SQL +** function is to be added. If a single program uses more than one database +** connection internally, then SQL functions must be added individually to +** each database connection. +** +** The second parameter is the name of the SQL function to be created or +** redefined. The length of the name is limited to 255 bytes, exclusive of +** the zero-terminator. Note that the name length limit is in bytes, not +** characters. Any attempt to create a function with a longer name +** will result in [SQLITE_ERROR] being returned. +** +** The third parameter (nArg) +** is the number of arguments that the SQL function or +** aggregate takes. If this parameter is -1, then the SQL function or +** aggregate may take any number of arguments between 0 and the limit +** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third +** parameter is less than -1 or greater than 127 then the behavior is +** undefined. +** +** The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. Any SQL function implementation should be able to work +** work with UTF-8, UTF-16le, or UTF-16be. But some implementations may be +** more efficient with one encoding than another. An application may +** invoke sqlite3_create_function() or sqlite3_create_function16() multiple +** times with the same function but with different values of eTextRep. +** When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** If there is only a single implementation which does not care what text +** encoding is used, then the fourth argument should be [SQLITE_ANY]. +** +** The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()]. +** +** The seventh, eighth and ninth parameters, xFunc, xStep and xFinal, are +** pointers to C-language functions that implement the SQL function or +** aggregate. A scalar SQL function requires an implementation of the xFunc +** callback only, NULL pointers should be passed as the xStep and xFinal +** parameters. An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL should be passed for xFunc. To delete an existing +** SQL function or aggregate, pass NULL for all three function callbacks. +** +** It is permitted to register multiple implementations of the same +** functions with the same name but with either differing numbers of +** arguments or differing preferred text encodings. SQLite will use +** the implementation that most closely matches the way in which the +** SQL function is used. A function implementation with a non-negative +** nArg parameter is a better match than a function implementation with +** a negative nArg. A function where the preferred text encoding +** matches the database encoding is a better +** match than a function where the encoding is different. +** A function where the encoding difference is between UTF16le and UTF16be +** is a closer match than a function where the encoding difference is +** between UTF8 and UTF16. +** +** Built-in functions may be overloaded by new application-defined functions. +** The first application-defined function with a given name overrides all +** built-in functions in the same [database connection] with the same name. +** Subsequent application-defined functions of the same name only override +** prior application-defined functions that are an exact match for the +** number of parameters and preferred encoding. +** +** An application-defined function is permitted to call other +** SQLite interfaces. However, such calls must not +** close the database connection nor finalize or reset the prepared +** statement in which the function is running. +** +** Requirements: +** [H16103] [H16106] [H16109] [H16112] [H16118] [H16121] [H16127] +** [H16130] [H16133] [H16136] [H16139] [H16142] +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); + +/* +** CAPI3REF: Text Encodings {H10267} +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 +#define SQLITE_UTF16LE 2 +#define SQLITE_UTF16BE 3 +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* sqlite3_create_function only */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Deprecated Functions +** DEPRECATED +** +** These functions are [deprecated]. In order to maintain +** backwards compatibility with older code, these functions continue +** to be supported. However, new applications should avoid +** the use of these functions. To help encourage people to avoid +** using these functions, we are not going to tell you what they do. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); +SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64); +#endif + +/* +** CAPI3REF: Obtaining SQL Function Parameter Values {H15100} +** +** The C-language implementation of SQL functions and aggregates uses +** this set of interface routines to access the parameter values on +** the function or aggregate. +** +** The xFunc (for scalar functions) or xStep (for aggregates) parameters +** to [sqlite3_create_function()] and [sqlite3_create_function16()] +** define callbacks that implement the SQL functions and aggregates. +** The 4th parameter to these callbacks is an array of pointers to +** [protected sqlite3_value] objects. There is one [sqlite3_value] object for +** each parameter to the SQL function. These routines are used to +** extract values from the [sqlite3_value] objects. +** +** These routines work only with [protected sqlite3_value] objects. +** Any attempt to use these routines on an [unprotected sqlite3_value] +** object results in undefined behavior. +** +** These routines work just like the corresponding [column access functions] +** except that these routines take a single [protected sqlite3_value] object +** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. +** +** The sqlite3_value_text16() interface extracts a UTF-16 string +** in the native byte-order of the host machine. The +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF-16 strings as big-endian and little-endian respectively. +** +** The sqlite3_value_numeric_type() interface attempts to apply +** numeric affinity to the value. This means that an attempt is +** made to convert the value to an integer or floating point. If +** such a conversion is possible without loss of information (in other +** words, if the value is a string that looks like a number) +** then the conversion is performed. Otherwise no conversion occurs. +** The [SQLITE_INTEGER | datatype] after conversion is returned. +** +** Please pay particular attention to the fact that the pointer returned +** from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the [sqlite3_value*] parameters. +** +** Requirements: +** [H15103] [H15106] [H15109] [H15112] [H15115] [H15118] [H15121] [H15124] +** [H15127] [H15130] [H15133] [H15136] +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); +SQLITE_API double sqlite3_value_double(sqlite3_value*); +SQLITE_API int sqlite3_value_int(sqlite3_value*); +SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_type(sqlite3_value*); +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context {H16210} +** +** The implementation of aggregate SQL functions use this routine to allocate +** a structure for storing their state. +** +** The first time the sqlite3_aggregate_context() routine is called for a +** particular aggregate, SQLite allocates nBytes of memory, zeroes out that +** memory, and returns a pointer to it. On second and subsequent calls to +** sqlite3_aggregate_context() for the same aggregate function index, +** the same buffer is returned. The implementation of the aggregate can use +** the returned buffer to accumulate data. +** +** SQLite automatically frees the allocated buffer when the aggregate +** query concludes. +** +** The first parameter should be a copy of the +** [sqlite3_context | SQL function context] that is the first parameter +** to the callback routine that implements the aggregate function. +** +** This routine must be called from the same thread in which +** the aggregate SQL function is running. +** +** Requirements: +** [H16211] [H16213] [H16215] [H16217] +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions {H16240} +** +** The sqlite3_user_data() interface returns a copy of +** the pointer that was the pUserData parameter (the 5th parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. {END} +** +** This routine must be called from the same thread in which +** the application-defined function is running. +** +** Requirements: +** [H16243] +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Database Connection For Functions {H16250} +** +** The sqlite3_context_db_handle() interface returns a copy of +** the pointer to the [database connection] (the 1st parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +** +** Requirements: +** [H16253] +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data {H16270} +** +** The following two functions may be used by scalar SQL functions to +** associate metadata with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated metadata may be preserved. This may +** be used, for example, to add a regular-expression matching scalar +** function. The compiled version of the regular expression is stored as +** metadata associated with the SQL value passed as the regular expression +** pattern. The compiled regular expression can be reused on multiple +** invocations of the same function so that the original pattern string +** does not need to be recompiled on each invocation. +** +** The sqlite3_get_auxdata() interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata() function with the Nth argument +** value to the application-defined function. If no metadata has been ever +** been set for the Nth argument of the function, or if the corresponding +** function parameter has changed since the meta-data was set, +** then sqlite3_get_auxdata() returns a NULL pointer. +** +** The sqlite3_set_auxdata() interface saves the metadata +** pointed to by its 3rd parameter as the metadata for the N-th +** argument of the application-defined function. Subsequent +** calls to sqlite3_get_auxdata() might return this data, if it has +** not been destroyed. +** If it is not NULL, SQLite will invoke the destructor +** function given by the 4th parameter to sqlite3_set_auxdata() on +** the metadata when the corresponding function parameter changes +** or when the SQL statement completes, whichever comes first. +** +** SQLite is free to call the destructor and drop metadata on any +** parameter of any function at any time. The only guarantee is that +** the destructor will be called before the metadata is dropped. +** +** In practice, metadata is preserved between function calls for +** expressions that are constant at compile time. This includes literal +** values and SQL variables. +** +** These routines must be called from the same thread in which +** the SQL function is running. +** +** Requirements: +** [H16272] [H16274] [H16276] [H16277] [H16278] [H16279] +*/ +SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); +SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); + + +/* +** CAPI3REF: Constants Defining Special Destructor Behavior {H10280} +** +** These are special values for the destructor that is passed in as the +** final argument to routines like [sqlite3_result_blob()]. If the destructor +** argument is SQLITE_STATIC, it means that the content pointer is constant +** and will never change. It does not need to be destroyed. The +** SQLITE_TRANSIENT value means that the content will likely change in +** the near future and that SQLite should make its own private copy of +** the content before returning. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. See ticket #2191. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function {H16400} +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the [parameter binding] family of +** functions used to bind values to host parameters in prepared statements. +** Refer to the [SQL parameter] documentation for additional information. +** +** The sqlite3_result_blob() interface sets the result from +** an application-defined function to be the BLOB whose content is pointed +** to by the second parameter and which is N bytes long where N is the +** third parameter. +** +** The sqlite3_result_zeroblob() interfaces set the result of +** the application-defined function to be a BLOB containing all zero +** bytes and N bytes in size, where N is the value of the 2nd parameter. +** +** The sqlite3_result_double() interface sets the result from +** an application-defined function to be a floating point value specified +** by its 2nd argument. +** +** The sqlite3_result_error() and sqlite3_result_error16() functions +** cause the implemented SQL function to throw an exception. +** SQLite uses the string pointed to by the +** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() +** as the text of an error message. SQLite interprets the error +** message string from sqlite3_result_error() as UTF-8. SQLite +** interprets the string from sqlite3_result_error16() as UTF-16 in native +** byte order. If the third parameter to sqlite3_result_error() +** or sqlite3_result_error16() is negative then SQLite takes as the error +** message all text up through the first zero character. +** If the third parameter to sqlite3_result_error() or +** sqlite3_result_error16() is non-negative then SQLite takes that many +** bytes (not characters) from the 2nd parameter as the error message. +** The sqlite3_result_error() and sqlite3_result_error16() +** routines make a private copy of the error message text before +** they return. Hence, the calling function can deallocate or +** modify the text after they return without harm. +** The sqlite3_result_error_code() function changes the error code +** returned by SQLite as a result of an error in a function. By default, +** the error code is SQLITE_ERROR. A subsequent call to sqlite3_result_error() +** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. +** +** The sqlite3_result_toobig() interface causes SQLite to throw an error +** indicating that a string or BLOB is to long to represent. +** +** The sqlite3_result_nomem() interface causes SQLite to throw an error +** indicating that a memory allocation failed. +** +** The sqlite3_result_int() interface sets the return value +** of the application-defined function to be the 32-bit signed integer +** value given in the 2nd argument. +** The sqlite3_result_int64() interface sets the return value +** of the application-defined function to be the 64-bit signed integer +** value given in the 2nd argument. +** +** The sqlite3_result_null() interface sets the return value +** of the application-defined function to be NULL. +** +** The sqlite3_result_text(), sqlite3_result_text16(), +** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces +** set the return value of the application-defined function to be +** a text string which is represented as UTF-8, UTF-16 native byte order, +** UTF-16 little endian, or UTF-16 big endian, respectively. +** SQLite takes the text result from the application from +** the 2nd parameter of the sqlite3_result_text* interfaces. +** If the 3rd parameter to the sqlite3_result_text* interfaces +** is negative, then SQLite takes result text from the 2nd parameter +** through the first zero character. +** If the 3rd parameter to the sqlite3_result_text* interfaces +** is non-negative, then as many bytes (not characters) of the text +** pointed to by the 2nd parameter are taken as the application-defined +** function result. +** If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that +** function as the destructor on the text or BLOB result when it has +** finished using that result. +** If the 4th parameter to the sqlite3_result_text* interfaces or to +** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite +** assumes that the text or BLOB result is in constant space and does not +** copy the content of the parameter nor call a destructor on the content +** when it has finished using that result. +** If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT +** then SQLite makes a copy of the result into space obtained from +** from [sqlite3_malloc()] before it returns. +** +** The sqlite3_result_value() interface sets the result of +** the application-defined function to be a copy the +** [unprotected sqlite3_value] object specified by the 2nd parameter. The +** sqlite3_result_value() interface makes a copy of the [sqlite3_value] +** so that the [sqlite3_value] specified in the parameter may change or +** be deallocated after sqlite3_result_value() returns without harm. +** A [protected sqlite3_value] object may always be used where an +** [unprotected sqlite3_value] object is required, so either +** kind of [sqlite3_value] object can be used with this interface. +** +** If these routines are called from within the different thread +** than the one containing the application-defined function that received +** the [sqlite3_context] pointer, the results are undefined. +** +** Requirements: +** [H16403] [H16406] [H16409] [H16412] [H16415] [H16418] [H16421] [H16424] +** [H16427] [H16430] [H16433] [H16436] [H16439] [H16442] [H16445] [H16448] +** [H16451] [H16454] [H16457] [H16460] [H16463] +*/ +SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_double(sqlite3_context*, double); +SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); +SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); +SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +SQLITE_API void sqlite3_result_null(sqlite3_context*); +SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); + +/* +** CAPI3REF: Define New Collating Sequences {H16600} +** +** These functions are used to add new collation sequences to the +** [database connection] specified as the first argument. +** +** The name of the new collation sequence is specified as a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string for sqlite3_create_collation16(). In all cases +** the name is passed as the second function argument. +** +** The third argument may be one of the constants [SQLITE_UTF8], +** [SQLITE_UTF16LE], or [SQLITE_UTF16BE], indicating that the user-supplied +** routine expects to be passed pointers to strings encoded using UTF-8, +** UTF-16 little-endian, or UTF-16 big-endian, respectively. The +** third argument might also be [SQLITE_UTF16] to indicate that the routine +** expects pointers to be UTF-16 strings in the native byte order, or the +** argument can be [SQLITE_UTF16_ALIGNED] if the +** the routine expects pointers to 16-bit word aligned strings +** of UTF-16 in the native byte order. +** +** A pointer to the user supplied routine must be passed as the fifth +** argument. If it is NULL, this is the same as deleting the collation +** sequence (so that SQLite cannot call it anymore). +** Each time the application supplied function is invoked, it is passed +** as its first parameter a copy of the void* passed as the fourth argument +** to sqlite3_create_collation() or sqlite3_create_collation16(). +** +** The remaining arguments to the application-supplied routine are two strings, +** each represented by a (length, data) pair and encoded in the encoding +** that was passed as the third argument when the collation sequence was +** registered. {END} The application defined collation routine should +** return negative, zero or positive if the first string is less than, +** equal to, or greater than the second string. i.e. (STRING1 - STRING2). +** +** The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** except that it takes an extra argument which is a destructor for +** the collation. The destructor is called when the collation is +** destroyed and is passed a copy of the fourth parameter void* pointer +** of the sqlite3_create_collation_v2(). +** Collations are destroyed when they are overridden by later calls to the +** collation creation functions or when the [database connection] is closed +** using [sqlite3_close()]. +** +** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. +** +** Requirements: +** [H16603] [H16604] [H16606] [H16609] [H16612] [H16615] [H16618] [H16621] +** [H16624] [H16627] [H16630] +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*) +); +SQLITE_API int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_collation16( + sqlite3*, + const void *zName, + int eTextRep, + void*, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks {H16700} +** +** To avoid having to register all collation sequences before a database +** can be used, a single callback function may be registered with the +** [database connection] to be called whenever an undefined collation +** sequence is required. +** +** If the function is registered using the sqlite3_collation_needed() API, +** then it is passed the names of undefined collation sequences as strings +** encoded in UTF-8. {H16703} If sqlite3_collation_needed16() is used, +** the names are passed as UTF-16 in machine native byte order. +** A call to either function replaces any existing callback. +** +** When the callback is invoked, the first argument passed is a copy +** of the second argument to sqlite3_collation_needed() or +** sqlite3_collation_needed16(). The second argument is the database +** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], +** or [SQLITE_UTF16LE], indicating the most desirable form of the collation +** sequence function required. The fourth parameter is the name of the +** required collation sequence. +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +** +** Requirements: +** [H16702] [H16704] [H16706] +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +SQLITE_API int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); + +/* +** CAPI3REF: Suspend Execution For A Short Time {H10530} +** +** The sqlite3_sleep() function causes the current thread to suspend execution +** for at least a number of milliseconds specified in its parameter. +** +** If the operating system does not support sleep requests with +** millisecond time resolution, then the time will be rounded up to +** the nearest second. The number of milliseconds of sleep actually +** requested from the operating system is returned. +** +** SQLite implements this interface by calling the xSleep() +** method of the default [sqlite3_vfs] object. +** +** Requirements: [H10533] [H10536] +*/ +SQLITE_API int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files {H10310} +** +** If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all temporary files +** created by SQLite will be placed in that directory. If this variable +** is a NULL pointer, then SQLite performs a search for an appropriate +** temporary file directory. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. Furthermore, +** the [temp_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. +*/ +SQLITE_API char *sqlite3_temp_directory; + +/* +** CAPI3REF: Test For Auto-Commit Mode {H12930} +** KEYWORDS: {autocommit mode} +** +** The sqlite3_get_autocommit() interface returns non-zero or +** zero if the given database connection is or is not in autocommit mode, +** respectively. Autocommit mode is on by default. +** Autocommit mode is disabled by a [BEGIN] statement. +** Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out whether SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +** +** Requirements: [H12931] [H12932] [H12933] [H12934] +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement {H13120} +** +** The sqlite3_db_handle interface returns the [database connection] handle +** to which a [prepared statement] belongs. The [database connection] +** returned by sqlite3_db_handle is the same [database connection] that was the first argument +** to the [sqlite3_prepare_v2()] call (or its variants) that was used to +** create the statement in the first place. +** +** Requirements: [H13123] +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + +/* +** CAPI3REF: Find the next prepared statement {H13140} +** +** This interface returns a pointer to the next [prepared statement] after +** pStmt associated with the [database connection] pDb. If pStmt is NULL +** then this interface returns a pointer to the first prepared statement +** associated with the database connection pDb. If no prepared statement +** satisfies the conditions of this routine, it returns NULL. +** +** The [database connection] pointer D in a call to +** [sqlite3_next_stmt(D,S)] must refer to an open database +** connection and in particular must not be a NULL pointer. +** +** Requirements: [H13143] [H13146] [H13149] [H13152] +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks {H12950} +** +** The sqlite3_commit_hook() interface registers a callback +** function to be invoked whenever a transaction is [COMMIT | committed]. +** Any callback set by a previous call to sqlite3_commit_hook() +** for the same database connection is overridden. +** The sqlite3_rollback_hook() interface registers a callback +** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. +** Any callback set by a previous call to sqlite3_commit_hook() +** for the same database connection is overridden. +** The pArg argument is passed through to the callback. +** If the callback on a commit hook function returns non-zero, +** then the commit is converted into a rollback. +** +** If another function was previously registered, its +** pArg value is returned. Otherwise NULL is returned. +** +** The callback implementation must not do anything that will modify +** the database connection that invoked the callback. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the commit +** or rollback hook in the first place. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** Registering a NULL function disables the callback. +** +** When the commit hook callback routine returns zero, the [COMMIT] +** operation is allowed to continue normally. If the commit hook +** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. +** The rollback hook is invoked on a rollback that results from a commit +** hook returning non-zero, just as it would be with any other rollback. +** +** For the purposes of this API, a transaction is said to have been +** rolled back if an explicit "ROLLBACK" statement is executed, or +** an error or constraint causes an implicit rollback to occur. +** The rollback callback is not invoked if a transaction is +** automatically rolled back because the database connection is closed. +** The rollback callback is not invoked if a transaction is +** rolled back because a commit callback returned non-zero. +** Check on this +** +** See also the [sqlite3_update_hook()] interface. +** +** Requirements: +** [H12951] [H12952] [H12953] [H12954] [H12955] +** [H12961] [H12962] [H12963] [H12964] +*/ +SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); +SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); + +/* +** CAPI3REF: Data Change Notification Callbacks {H12970} +** +** The sqlite3_update_hook() interface registers a callback function +** with the [database connection] identified by the first argument +** to be invoked whenever a row is updated, inserted or deleted. +** Any callback set by a previous call to this function +** for the same database connection is overridden. +** +** The second argument is a pointer to the function to invoke when a +** row is updated, inserted or deleted. +** The first argument to the callback is a copy of the third argument +** to sqlite3_update_hook(). +** The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], +** or [SQLITE_UPDATE], depending on the operation that caused the callback +** to be invoked. +** The third and fourth arguments to the callback contain pointers to the +** database and table name containing the affected row. +** The final callback parameter is the [rowid] of the row. +** In the case of an update, this is the [rowid] after the update takes place. +** +** The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_master and sqlite_sequence). +** +** In the current implementation, the update hook +** is not invoked when duplication rows are deleted because of an +** [ON CONFLICT | ON CONFLICT REPLACE] clause. Nor is the update hook +** invoked when rows are deleted using the [truncate optimization]. +** The exceptions defined in this paragraph might change in a future +** release of SQLite. +** +** The update hook implementation must not do anything that will modify +** the database connection that invoked the update hook. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the update hook. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** If another function was previously registered, its pArg value +** is returned. Otherwise NULL is returned. +** +** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] +** interfaces. +** +** Requirements: +** [H12971] [H12973] [H12975] [H12977] [H12979] [H12981] [H12983] [H12986] +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager Cache {H10330} +** KEYWORDS: {shared cache} +** +** This routine enables or disables the sharing of the database cache +** and schema data structures between [database connection | connections] +** to the same database. Sharing is enabled if the argument is true +** and disabled if the argument is false. +** +** Cache sharing is enabled and disabled for an entire process. +** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, +** sharing was enabled or disabled for each thread separately. +** +** The cache sharing mode set by this interface effects all subsequent +** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. +** Existing database connections continue use the sharing mode +** that was in effect at the time they were opened. +** +** Virtual tables cannot be used with a shared cache. When shared +** cache is enabled, the [sqlite3_create_module()] API used to register +** virtual tables will always return an error. +** +** This routine returns [SQLITE_OK] if shared cache was enabled or disabled +** successfully. An [error code] is returned otherwise. +** +** Shared cache is disabled by default. But this might change in +** future releases of SQLite. Applications that care about shared +** cache setting should set it explicitly. +** +** See Also: [SQLite Shared-Cache Mode] +** +** Requirements: [H10331] [H10336] [H10337] [H10339] +*/ +SQLITE_API int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory {H17340} +** +** The sqlite3_release_memory() interface attempts to free N bytes +** of heap memory by deallocating non-essential memory allocations +** held by the database library. {END} Memory used to cache database +** pages to improve performance is an example of non-essential memory. +** sqlite3_release_memory() returns the number of bytes actually freed, +** which might be more or less than the amount requested. +** +** Requirements: [H17341] [H17342] +*/ +SQLITE_API int sqlite3_release_memory(int); + +/* +** CAPI3REF: Impose A Limit On Heap Size {H17350} +** +** The sqlite3_soft_heap_limit() interface places a "soft" limit +** on the amount of heap memory that may be allocated by SQLite. +** If an internal allocation is requested that would exceed the +** soft heap limit, [sqlite3_release_memory()] is invoked one or +** more times to free up some space before the allocation is performed. +** +** The limit is called "soft", because if [sqlite3_release_memory()] +** cannot free sufficient memory to prevent the limit from being exceeded, +** the memory is allocated anyway and the current operation proceeds. +** +** A negative or zero value for N means that there is no soft heap limit and +** [sqlite3_release_memory()] will only be called when memory is exhausted. +** The default value for the soft heap limit is zero. +** +** SQLite makes a best effort to honor the soft heap limit. +** But if the soft heap limit cannot be honored, execution will +** continue without error or notification. This is why the limit is +** called a "soft" limit. It is advisory only. +** +** Prior to SQLite version 3.5.0, this routine only constrained the memory +** allocated by a single thread - the same thread in which this routine +** runs. Beginning with SQLite version 3.5.0, the soft heap limit is +** applied to all threads. The value specified for the soft heap limit +** is an upper bound on the total memory allocation for all threads. In +** version 3.5.0 there is no mechanism for limiting the heap usage for +** individual threads. +** +** Requirements: +** [H16351] [H16352] [H16353] [H16354] [H16355] [H16358] +*/ +SQLITE_API void sqlite3_soft_heap_limit(int); + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table {H12850} +** +** This routine returns metadata about a specific column of a specific +** database table accessible using the [database connection] handle +** passed as the first function argument. +** +** The column is identified by the second, third and fourth parameters to +** this function. The second parameter is either the name of the database +** (i.e. "main", "temp" or an attached database) containing the specified +** table or NULL. If it is NULL, then all attached databases are searched +** for the table using the same algorithm used by the database engine to +** resolve unqualified table references. +** +** The third and fourth parameters to this function are the table and column +** name of the desired column, respectively. Neither of these parameters +** may be NULL. +** +** Metadata is returned by writing to the memory locations passed as the 5th +** and subsequent parameters to this function. Any of these arguments may be +** NULL, in which case the corresponding element of metadata is omitted. +** +**
      +** +**
      Parameter Output
      Type
      Description +** +**
      5th const char* Data type +**
      6th const char* Name of default collation sequence +**
      7th int True if column has a NOT NULL constraint +**
      8th int True if column is part of the PRIMARY KEY +**
      9th int True if column is [AUTOINCREMENT] +**
      +**
      +** +** The memory pointed to by the character pointers returned for the +** declaration type and collation sequence is valid only until the next +** call to any SQLite API function. +** +** If the specified table is actually a view, an [error code] is returned. +** +** If the specified column is "rowid", "oid" or "_rowid_" and an +** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output +** parameters are set for the explicitly declared column. If there is no +** explicitly declared [INTEGER PRIMARY KEY] column, then the output +** parameters are set as follows: +** +**
      +**     data type: "INTEGER"
      +**     collation sequence: "BINARY"
      +**     not null: 0
      +**     primary key: 1
      +**     auto increment: 0
      +** 
      +** +** This function may load one or more schemas from database files. If an +** error occurs during this process, or if the requested table or column +** cannot be found, an [error code] is returned and an error message left +** in the [database connection] (to be retrieved using sqlite3_errmsg()). +** +** This API is only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension {H12600} +** +** This interface loads an SQLite extension library from the named file. +** +** {H12601} The sqlite3_load_extension() interface attempts to load an +** SQLite extension library contained in the file zFile. +** +** {H12602} The entry point is zProc. +** +** {H12603} zProc may be 0, in which case the name of the entry point +** defaults to "sqlite3_extension_init". +** +** {H12604} The sqlite3_load_extension() interface shall return +** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** +** {H12605} If an error occurs and pzErrMsg is not 0, then the +** [sqlite3_load_extension()] interface shall attempt to +** fill *pzErrMsg with error message text stored in memory +** obtained from [sqlite3_malloc()]. {END} The calling function +** should free this memory by calling [sqlite3_free()]. +** +** {H12606} Extension loading must be enabled using +** [sqlite3_enable_load_extension()] prior to calling this API, +** otherwise an error will be returned. +*/ +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading {H12620} +** +** So as not to open security holes in older applications that are +** unprepared to deal with extension loading, and as a means of disabling +** extension loading while evaluating user-entered SQL, the following API +** is provided to turn the [sqlite3_load_extension()] mechanism on and off. +** +** Extension loading is off by default. See ticket #1863. +** +** {H12621} Call the sqlite3_enable_load_extension() routine with onoff==1 +** to turn extension loading on and call it with onoff==0 to turn +** it back off again. +** +** {H12622} Extension loading is off by default. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Automatically Load An Extensions {H12640} +** +** This API can be invoked at program startup in order to register +** one or more statically linked extensions that will be available +** to all new [database connections]. {END} +** +** This routine stores a pointer to the extension in an array that is +** obtained from [sqlite3_malloc()]. If you run a memory leak checker +** on your program and it reports a leak because of this array, invoke +** [sqlite3_reset_auto_extension()] prior to shutdown to free the memory. +** +** {H12641} This function registers an extension entry point that is +** automatically invoked whenever a new [database connection] +** is opened using [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()]. +** +** {H12642} Duplicate extensions are detected so calling this routine +** multiple times with the same extension is harmless. +** +** {H12643} This routine stores a pointer to the extension in an array +** that is obtained from [sqlite3_malloc()]. +** +** {H12644} Automatic extensions apply across all threads. +*/ +SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); + +/* +** CAPI3REF: Reset Automatic Extension Loading {H12660} +** +** This function disables all previously registered automatic +** extensions. {END} It undoes the effect of all prior +** [sqlite3_auto_extension()] calls. +** +** {H12661} This function disables all previously registered +** automatic extensions. +** +** {H12662} This function disables automatic extensions in all threads. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void); + +/* +****** EXPERIMENTAL - subject to change without notice ************** +** +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** CAPI3REF: Virtual Table Object {H18000} +** KEYWORDS: sqlite3_module {virtual table module} +** EXPERIMENTAL +** +** This structure, sometimes called a a "virtual table module", +** defines the implementation of a [virtual tables]. +** This structure consists mostly of methods for the module. +** +** A virtual table module is created by filling in a persistent +** instance of this structure and passing a pointer to that instance +** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. +** The registration remains valid until it is replaced by a different +** module or until the [database connection] closes. The content +** of this structure must not change while it is registered with +** any database connection. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); +}; + +/* +** CAPI3REF: Virtual Table Indexing Information {H18100} +** KEYWORDS: sqlite3_index_info +** EXPERIMENTAL +** +** The sqlite3_index_info structure and its substructures is used to +** pass information into and receive the reply from the [xBestIndex] +** method of a [virtual table module]. The fields under **Inputs** are the +** inputs to xBestIndex and are read-only. xBestIndex inserts its +** results into the **Outputs** fields. +** +** The aConstraint[] array records WHERE clause constraints of the form: +** +**
      column OP expr
      +** +** where OP is =, <, <=, >, or >=. The particular operator is +** stored in aConstraint[].op. The index of the column is stored in +** aConstraint[].iColumn. aConstraint[].usable is TRUE if the +** expr on the right-hand side can be evaluated (and thus the constraint +** is usable) and false if it cannot. +** +** The optimizer automatically inverts terms of the form "expr OP column" +** and makes other simplifications to the WHERE clause in an attempt to +** get as many WHERE clause terms into the form shown above as possible. +** The aConstraint[] array only reports WHERE clause terms in the correct +** form that refer to the particular virtual table being queried. +** +** Information about the ORDER BY clause is stored in aOrderBy[]. +** Each term of aOrderBy records a column of the ORDER BY clause. +** +** The [xBestIndex] method must fill aConstraintUsage[] with information +** about what parameters to pass to xFilter. If argvIndex>0 then +** the right-hand side of the corresponding aConstraint[] is evaluated +** and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit +** is true, then the constraint is assumed to be fully handled by the +** virtual table and is not checked again by SQLite. +** +** The idxNum and idxPtr values are recorded and passed into the +** [xFilter] method. +** [sqlite3_free()] is used to free idxPtr if and only iff +** needToFreeIdxPtr is true. +** +** The orderByConsumed means that output from [xFilter]/[xNext] will occur in +** the correct order to satisfy the ORDER BY clause so that no separate +** sorting step is required. +** +** The estimatedCost value is an estimate of the cost of doing the +** particular lookup. A full scan of a table with N entries should have +** a cost of N. A binary search of a table of N entries should have a +** cost of approximately log(N). +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column on left-hand side of constraint */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ +}; +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 + +/* +** CAPI3REF: Register A Virtual Table Implementation {H18200} +** EXPERIMENTAL +** +** This routine is used to register a new [virtual table module] name. +** Module names must be registered before +** creating a new [virtual table] using the module, or before using a +** preexisting [virtual table] for the module. +** +** The module name is registered on the [database connection] specified +** by the first parameter. The name of the module is given by the +** second parameter. The third parameter is a pointer to +** the implementation of the [virtual table module]. The fourth +** parameter is an arbitrary client data pointer that is passed through +** into the [xCreate] and [xConnect] methods of the virtual table module +** when a new virtual table is be being created or reinitialized. +** +** This interface has exactly the same effect as calling +** [sqlite3_create_module_v2()] with a NULL client data destructor. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData /* Client data for xCreate/xConnect */ +); + +/* +** CAPI3REF: Register A Virtual Table Implementation {H18210} +** EXPERIMENTAL +** +** This routine is identical to the [sqlite3_create_module()] method, +** except that it has an extra parameter to specify +** a destructor function for the client data pointer. SQLite will +** invoke the destructor function (if it is not NULL) when SQLite +** no longer needs the pClientData pointer. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** CAPI3REF: Virtual Table Instance Object {H18010} +** KEYWORDS: sqlite3_vtab +** EXPERIMENTAL +** +** Every [virtual table module] implementation uses a subclass +** of the following structure to describe a particular instance +** of the [virtual table]. Each subclass will +** be tailored to the specific needs of the module implementation. +** The purpose of this superclass is to define certain fields that are +** common to all module implementations. +** +** Virtual tables methods can set an error message by assigning a +** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should +** take care that any prior string is freed by a call to [sqlite3_free()] +** prior to assigning a new string to zErrMsg. After the error message +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* NO LONGER USED */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Virtual Table Cursor Object {H18020} +** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} +** EXPERIMENTAL +** +** Every [virtual table module] implementation uses a subclass of the +** following structure to describe cursors that point into the +** [virtual table] and are used +** to loop through the virtual table. Cursors are created using the +** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed +** by the [sqlite3_module.xClose | xClose] method. Cussors are used +** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods +** of the module. Each module implementation will define +** the content of a cursor structure to suit its own needs. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Declare The Schema Of A Virtual Table {H18280} +** EXPERIMENTAL +** +** The [xCreate] and [xConnect] methods of a +** [virtual table module] call this interface +** to declare the format (the names and datatypes of the columns) of +** the virtual tables they implement. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_declare_vtab(sqlite3*, const char *zSQL); + +/* +** CAPI3REF: Overload A Function For A Virtual Table {H18300} +** EXPERIMENTAL +** +** Virtual tables can provide alternative implementations of functions +** using the [xFindFunction] method of the [virtual table module]. +** But global versions of those functions +** must exist in order to be overloaded. +** +** This API makes sure a global version of a function with a particular +** name and number of parameters exists. If no such function exists +** before this API is called, a new function is created. The implementation +** of the new function always causes an exception to be thrown. So +** the new function is not good for anything by itself. Its only +** purpose is to be a placeholder function that can be overloaded +** by a [virtual table]. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +** +****** EXPERIMENTAL - subject to change without notice ************** +*/ + +/* +** CAPI3REF: A Handle To An Open BLOB {H17800} +** KEYWORDS: {BLOB handle} {BLOB handles} +** +** An instance of this object represents an open BLOB on which +** [sqlite3_blob_open | incremental BLOB I/O] can be performed. +** Objects of this type are created by [sqlite3_blob_open()] +** and destroyed by [sqlite3_blob_close()]. +** The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** can be used to read or write small subsections of the BLOB. +** The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O {H17810} +** +** This interfaces opens a [BLOB handle | handle] to the BLOB located +** in row iRow, column zColumn, table zTable in database zDb; +** in other words, the same BLOB that would be selected by: +** +**
      +**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
      +** 
      {END} +** +** If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. If it is zero, the BLOB is opened for read access. +** It is not possible to open a column that is part of an index or primary +** key for writing. ^If [foreign key constraints] are enabled, it is +** not possible to open a column that is part of a [child key] for writing. +** +** Note that the database name is not the filename that contains +** the database but rather the symbolic name of the database that +** is assigned when the database is connected using [ATTACH]. +** For the main database file, the database name is "main". +** For TEMP tables, the database name is "temp". +** +** On success, [SQLITE_OK] is returned and the new [BLOB handle] is written +** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set +** to be a null pointer. +** This function sets the [database connection] error code and message +** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related +** functions. Note that the *ppBlob variable is always initialized in a +** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob +** regardless of the success or failure of this routine. +** +** If the row that a BLOB handle points to is modified by an +** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects +** then the BLOB handle is marked as "expired". +** This is true if any column of the row is changed, even a column +** other than the one the BLOB handle is open on. +** Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for +** a expired BLOB handle fail with an return code of [SQLITE_ABORT]. +** Changes written into a BLOB prior to the BLOB expiring are not +** rollback by the expiration of the BLOB. Such changes will eventually +** commit if the transaction continues to completion. +** +** Use the [sqlite3_blob_bytes()] interface to determine the size of +** the opened blob. The size of a blob may not be changed by this +** interface. Use the [UPDATE] SQL command to change the size of a +** blob. +** +** The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** and the built-in [zeroblob] SQL function can be used, if desired, +** to create an empty, zero-filled blob in which to read or write using +** this interface. +** +** To avoid a resource leak, every open [BLOB handle] should eventually +** be released by a call to [sqlite3_blob_close()]. +** +** Requirements: +** [H17813] [H17814] [H17816] [H17819] [H17821] [H17824] +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Close A BLOB Handle {H17830} +** +** Closes an open [BLOB handle]. +** +** Closing a BLOB shall cause the current transaction to commit +** if there are no other BLOBs, no pending prepared statements, and the +** database connection is in [autocommit mode]. +** If any writes were made to the BLOB, they might be held in cache +** until the close operation if they will fit. +** +** Closing the BLOB often forces the changes +** out to disk and so if any I/O errors occur, they will likely occur +** at the time when the BLOB is closed. Any errors that occur during +** closing are reported as a non-zero return value. +** +** The BLOB is closed unconditionally. Even if this routine returns +** an error code, the BLOB is still closed. +** +** Calling this routine with a null pointer (which as would be returned +** by failed call to [sqlite3_blob_open()]) is a harmless no-op. +** +** Requirements: +** [H17833] [H17836] [H17839] +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB {H17840} +** +** Returns the size in bytes of the BLOB accessible via the +** successfully opened [BLOB handle] in its only argument. The +** incremental blob I/O routines can only read or overwriting existing +** blob content; they cannot change the size of a blob. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** Requirements: +** [H17843] +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally {H17850} +** +** This function is used to read data from an open [BLOB handle] into a +** caller-supplied buffer. N bytes of data are copied into buffer Z +** from the open BLOB, starting at offset iOffset. +** +** If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is read. If N or iOffset is +** less than zero, [SQLITE_ERROR] is returned and no data is read. +** The size of the blob (and hence the maximum value of N+iOffset) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** An attempt to read from an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. +** +** On success, SQLITE_OK is returned. +** Otherwise, an [error code] or an [extended error code] is returned. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_write()]. +** +** Requirements: +** [H17853] [H17856] [H17859] [H17862] [H17863] [H17865] [H17868] +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally {H17870} +** +** This function is used to write data into an open [BLOB handle] from a +** caller-supplied buffer. N bytes of data are copied from the buffer Z +** into the open BLOB, starting at offset iOffset. +** +** If the [BLOB handle] passed as the first argument was not opened for +** writing (the flags parameter to [sqlite3_blob_open()] was zero), +** this function returns [SQLITE_READONLY]. +** +** This function may only modify the contents of the BLOB; it is +** not possible to increase the size of a BLOB using this API. +** If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is written. If N is +** less than zero [SQLITE_ERROR] is returned and no data is written. +** The size of the BLOB (and hence the maximum value of N+iOffset) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** An attempt to write to an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. Writes to the BLOB that occurred +** before the [BLOB handle] expired are not rolled back by the +** expiration of the handle, though of course those changes might +** have been overwritten by the statement that expired the BLOB handle +** or by other independent statements. +** +** On success, SQLITE_OK is returned. +** Otherwise, an [error code] or an [extended error code] is returned. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_read()]. +** +** Requirements: +** [H17873] [H17874] [H17875] [H17876] [H17877] [H17879] [H17882] [H17885] +** [H17888] +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects {H11200} +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most SQLite builds come with a +** single default VFS that is appropriate for the host computer. +** New VFSes can be registered and existing VFSes can be unregistered. +** The following interfaces are provided. +** +** The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. +** Names are case sensitive. +** Names are zero-terminated UTF-8 strings. +** If there is no match, a NULL pointer is returned. +** If zVfsName is NULL then the default VFS is returned. +** +** New VFSes are registered with sqlite3_vfs_register(). +** Each new VFS becomes the default VFS if the makeDflt flag is set. +** The same VFS can be registered multiple times without injury. +** To make an existing VFS into the default VFS, register it again +** with the makeDflt flag set. If two different VFSes with the +** same name are registered, the behavior is undefined. If a +** VFS is registered with a name that is NULL or an empty string, +** then the behavior is undefined. +** +** Unregister a VFS with the sqlite3_vfs_unregister() interface. +** If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary. +** +** Requirements: +** [H11203] [H11206] [H11209] [H11212] [H11215] [H11218] +*/ +SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); +SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); +SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); + +/* +** CAPI3REF: Mutexes {H17000} +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
        +**
      • SQLITE_MUTEX_OS2 +**
      • SQLITE_MUTEX_PTHREAD +**
      • SQLITE_MUTEX_W32 +**
      • SQLITE_MUTEX_NOOP +**
      +** +** The SQLITE_MUTEX_NOOP implementation is a set of routines +** that does no real locking and is appropriate for use in +** a single-threaded application. The SQLITE_MUTEX_OS2, +** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations +** are appropriate for use on OS/2, Unix, and Windows. +** +** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex +** implementation is included with the library. In this case the +** application must supply a custom mutex implementation using the +** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function +** before calling sqlite3_initialize() or any other public sqlite3_ +** function that calls sqlite3_initialize(). +** +** {H17011} The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. {H17012} If it returns NULL +** that means that a mutex could not be allocated. {H17013} SQLite +** will unwind its stack and return an error. {H17014} The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
        +**
      • SQLITE_MUTEX_FAST +**
      • SQLITE_MUTEX_RECURSIVE +**
      • SQLITE_MUTEX_STATIC_MASTER +**
      • SQLITE_MUTEX_STATIC_MEM +**
      • SQLITE_MUTEX_STATIC_MEM2 +**
      • SQLITE_MUTEX_STATIC_PRNG +**
      • SQLITE_MUTEX_STATIC_LRU +**
      • SQLITE_MUTEX_STATIC_LRU2 +**
      +** +** {H17015} The first two constants cause sqlite3_mutex_alloc() to create +** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. {END} +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. {H17016} But SQLite will only request a recursive mutex in +** cases where it really needs one. {END} If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** {H17017} The other allowed parameters to sqlite3_mutex_alloc() each return +** a pointer to a static preexisting mutex. {END} Six static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** {H17018} Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. {H17034} But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** {H17019} The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. {H17020} SQLite is careful to deallocate every +** dynamic mutex that it allocates. {A17021} The dynamic mutexes must not be in +** use when they are deallocated. {A17022} Attempting to deallocate a static +** mutex results in undefined behavior. {H17023} SQLite never deallocates +** a static mutex. {END} +** +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. {H17024} If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. {H17025} The sqlite3_mutex_try() interface returns [SQLITE_OK] +** upon successful entry. {H17026} Mutexes created using +** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. +** {H17027} In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. {A17028} If the same thread tries to enter any other +** kind of mutex more than once, the behavior is undefined. +** {H17029} SQLite will never exhibit +** such behavior in its own use of mutexes. +** +** Some systems (for example, Windows 95) do not support the operation +** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() +** will always return SQLITE_BUSY. {H17030} The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable behavior. +** +** {H17031} The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. {A17032} The behavior +** is undefined if the mutex is not currently entered by the +** calling thread or is not currently allocated. {H17033} SQLite will +** never do either. {END} +** +** If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or +** sqlite3_mutex_leave() is a NULL pointer, then all three routines +** behave as no-ops. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Methods Object {H17120} +** EXPERIMENTAL +** +** An instance of this structure defines the low-level routines +** used to allocate and use mutexes. +** +** Usually, the default mutex implementations provided by SQLite are +** sufficient, however the user has the option of substituting a custom +** implementation for specialized deployments or systems for which SQLite +** does not provide a suitable implementation. In this case, the user +** creates and populates an instance of this structure to pass +** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. +** Additionally, an instance of this structure can be used as an +** output variable when querying the system for the current mutex +** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. +** +** The xMutexInit method defined by this structure is invoked as +** part of system initialization by the sqlite3_initialize() function. +** {H17001} The xMutexInit routine shall be called by SQLite once for each +** effective call to [sqlite3_initialize()]. +** +** The xMutexEnd method defined by this structure is invoked as +** part of system shutdown by the sqlite3_shutdown() function. The +** implementation of this method is expected to release all outstanding +** resources obtained by the mutex methods implementation, especially +** those obtained by the xMutexInit method. {H17003} The xMutexEnd() +** interface shall be invoked once for each call to [sqlite3_shutdown()]. +** +** The remaining seven methods defined by this structure (xMutexAlloc, +** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and +** xMutexNotheld) implement the following interfaces (respectively): +** +**
        +**
      • [sqlite3_mutex_alloc()]
      • +**
      • [sqlite3_mutex_free()]
      • +**
      • [sqlite3_mutex_enter()]
      • +**
      • [sqlite3_mutex_try()]
      • +**
      • [sqlite3_mutex_leave()]
      • +**
      • [sqlite3_mutex_held()]
      • +**
      • [sqlite3_mutex_notheld()]
      • +**
      +** +** The only difference is that the public sqlite3_XXX functions enumerated +** above silently ignore any invocations that pass a NULL pointer instead +** of a valid mutex handle. The implementations of the methods defined +** by this structure are not required to handle this case, the results +** of passing a NULL pointer instead of a valid mutex handle are undefined +** (i.e. it is acceptable to provide an implementation that segfaults if +** it is passed a NULL pointer). +** +** The xMutexInit() method must be threadsafe. It must be harmless to +** invoke xMutexInit() mutiple times within the same process and without +** intervening calls to xMutexEnd(). Second and subsequent calls to +** xMutexInit() must be no-ops. +** +** xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] +** and its associates). Similarly, xMutexAlloc() must not use SQLite memory +** allocation for a static mutex. However xMutexAlloc() may use SQLite +** memory allocation for a fast or recursive mutex. +** +** SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is +** called, but only if the prior call to xMutexInit returned SQLITE_OK. +** If xMutexInit fails in any way, it is expected to clean up after itself +** prior to returning. +*/ +typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; +struct sqlite3_mutex_methods { + int (*xMutexInit)(void); + int (*xMutexEnd)(void); + sqlite3_mutex *(*xMutexAlloc)(int); + void (*xMutexFree)(sqlite3_mutex *); + void (*xMutexEnter)(sqlite3_mutex *); + int (*xMutexTry)(sqlite3_mutex *); + void (*xMutexLeave)(sqlite3_mutex *); + int (*xMutexHeld)(sqlite3_mutex *); + int (*xMutexNotheld)(sqlite3_mutex *); +}; + +/* +** CAPI3REF: Mutex Verification Routines {H17080} +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** are intended for use inside assert() statements. {H17081} The SQLite core +** never uses these routines except inside an assert() and applications +** are advised to follow the lead of the core. {H17082} The core only +** provides implementations for these routines when it is compiled +** with the SQLITE_DEBUG flag. {A17087} External mutex implementations +** are only required to provide these routines if SQLITE_DEBUG is +** defined and if NDEBUG is not defined. +** +** {H17083} These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** {X17084} The implementation is not required to provided versions of these +** routines that actually work. If the implementation does not provide working +** versions of these routines, it should at least provide stubs that always +** return true so that one does not get spurious assertion failures. +** +** {H17085} If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. {END} This seems counter-intuitive since +** clearly the mutex cannot be held if it does not exist. But the +** the reason the mutex does not exist is because the build is not +** using mutexes. And we do not want the assert() containing the +** call to sqlite3_mutex_held() to fail, so a non-zero return is +** the appropriate thing to do. {H17086} The sqlite3_mutex_notheld() +** interface should also return 1 when given a NULL pointer. +*/ +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Types {H17001} +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +** +** The set of static mutexes may change from one SQLite release to the +** next. Applications that override the built-in mutex logic must be +** prepared to accommodate additional static mutexes. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ +#define SQLITE_MUTEX_STATIC_LRU2 7 /* lru page list */ + +/* +** CAPI3REF: Retrieve the mutex for a database connection {H17002} +** +** This interface returns a pointer the [sqlite3_mutex] object that +** serializes access to the [database connection] given in the argument +** when the [threading mode] is Serialized. +** If the [threading mode] is Single-thread or Multi-thread then this +** routine returns a NULL pointer. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); + +/* +** CAPI3REF: Low-Level Control Of Database Files {H11300} +** +** {H11301} The [sqlite3_file_control()] interface makes a direct call to the +** xFileControl method for the [sqlite3_io_methods] object associated +** with a particular database identified by the second argument. {H11302} The +** name of the database is the name assigned to the database by the +** ATTACH SQL command that opened the +** database. {H11303} To control the main database file, use the name "main" +** or a NULL pointer. {H11304} The third and fourth parameters to this routine +** are passed directly through to the second and third parameters of +** the xFileControl method. {H11305} The return value of the xFileControl +** method becomes the return value of this routine. +** +** {H11306} If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. {H11307} This error +** code is not remembered and will not be recalled by [sqlite3_errcode()] +** or [sqlite3_errmsg()]. {A11308} The underlying xFileControl method might +** also return SQLITE_ERROR. {A11309} There is no way to distinguish between +** an incorrect zDbName and an SQLITE_ERROR return from the underlying +** xFileControl method. {END} +** +** See also: [SQLITE_FCNTL_LOCKSTATE] +*/ +SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** CAPI3REF: Testing Interface {H11400} +** +** The sqlite3_test_control() interface is used to read out internal +** state of SQLite and to inject faults into SQLite for testing +** purposes. The first parameter is an operation code that determines +** the number, meaning, and operation of all subsequent parameters. +** +** This interface is not for use by applications. It exists solely +** for verifying the correct operation of the SQLite library. Depending +** on how the SQLite library is compiled, this interface might not exist. +** +** The details of the operation codes, their meanings, the parameters +** they take, and what they do are all subject to change without notice. +** Unlike most of the SQLite API, this function is not guaranteed to +** operate consistently from one release to the next. +*/ +SQLITE_API int sqlite3_test_control(int op, ...); + +/* +** CAPI3REF: Testing Interface Operation Codes {H11410} +** +** These constants are the valid operation code parameters used +** as the first argument to [sqlite3_test_control()]. +** +** These parameters and their meanings are subject to change +** without notice. These values are for testing purposes only. +** Applications should not use any of these parameters or the +** [sqlite3_test_control()] interface. +*/ +#define SQLITE_TESTCTRL_PRNG_SAVE 5 +#define SQLITE_TESTCTRL_PRNG_RESTORE 6 +#define SQLITE_TESTCTRL_PRNG_RESET 7 +#define SQLITE_TESTCTRL_BITVEC_TEST 8 +#define SQLITE_TESTCTRL_FAULT_INSTALL 9 +#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 +#define SQLITE_TESTCTRL_PENDING_BYTE 11 +#define SQLITE_TESTCTRL_ASSERT 12 +#define SQLITE_TESTCTRL_ALWAYS 13 +#define SQLITE_TESTCTRL_RESERVE 14 + +/* +** CAPI3REF: SQLite Runtime Status {H17200} +** EXPERIMENTAL +** +** This interface is used to retrieve runtime status information +** about the preformance of SQLite, and optionally to reset various +** highwater marks. The first argument is an integer code for +** the specific parameter to measure. Recognized integer codes +** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...]. +** The current value of the parameter is returned into *pCurrent. +** The highest recorded value is returned in *pHighwater. If the +** resetFlag is true, then the highest record value is reset after +** *pHighwater is written. Some parameters do not record the highest +** value. For those parameters +** nothing is written into *pHighwater and the resetFlag is ignored. +** Other parameters record only the highwater mark and not the current +** value. For these latter parameters nothing is written into *pCurrent. +** +** This routine returns SQLITE_OK on success and a non-zero +** [error code] on failure. +** +** This routine is threadsafe but is not atomic. This routine can be +** called while other threads are running the same or different SQLite +** interfaces. However the values returned in *pCurrent and +** *pHighwater reflect the status of SQLite at different points in time +** and it is possible that another thread might change the parameter +** in between the times when *pCurrent and *pHighwater are written. +** +** See also: [sqlite3_db_status()] +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); + + +/* +** CAPI3REF: Status Parameters {H17250} +** EXPERIMENTAL +** +** These integer constants designate various run-time status parameters +** that can be returned by [sqlite3_status()]. +** +**
      +**
      SQLITE_STATUS_MEMORY_USED
      +**
      This parameter is the current amount of memory checked out +** using [sqlite3_malloc()], either directly or indirectly. The +** figure includes calls made to [sqlite3_malloc()] by the application +** and internal memory usage by the SQLite library. Scratch memory +** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache +** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in +** this parameter. The amount returned is the sum of the allocation +** sizes as reported by the xSize method in [sqlite3_mem_methods].
      +** +**
      SQLITE_STATUS_MALLOC_SIZE
      +**
      This parameter records the largest memory allocation request +** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their +** internal equivalents). Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
      +** +**
      SQLITE_STATUS_PAGECACHE_USED
      +**
      This parameter returns the number of pages used out of the +** [pagecache memory allocator] that was configured using +** [SQLITE_CONFIG_PAGECACHE]. The +** value returned is in pages, not in bytes.
      +** +**
      SQLITE_STATUS_PAGECACHE_OVERFLOW
      +**
      This parameter returns the number of bytes of page cache +** allocation which could not be statisfied by the [SQLITE_CONFIG_PAGECACHE] +** buffer and where forced to overflow to [sqlite3_malloc()]. The +** returned value includes allocations that overflowed because they +** where too large (they were larger than the "sz" parameter to +** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because +** no space was left in the page cache.
      +** +**
      SQLITE_STATUS_PAGECACHE_SIZE
      +**
      This parameter records the largest memory allocation request +** handed to [pagecache memory allocator]. Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
      +** +**
      SQLITE_STATUS_SCRATCH_USED
      +**
      This parameter returns the number of allocations used out of the +** [scratch memory allocator] configured using +** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not +** in bytes. Since a single thread may only have one scratch allocation +** outstanding at time, this parameter also reports the number of threads +** using scratch memory at the same time.
      +** +**
      SQLITE_STATUS_SCRATCH_OVERFLOW
      +**
      This parameter returns the number of bytes of scratch memory +** allocation which could not be statisfied by the [SQLITE_CONFIG_SCRATCH] +** buffer and where forced to overflow to [sqlite3_malloc()]. The values +** returned include overflows because the requested allocation was too +** larger (that is, because the requested allocation was larger than the +** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer +** slots were available. +**
      +** +**
      SQLITE_STATUS_SCRATCH_SIZE
      +**
      This parameter records the largest memory allocation request +** handed to [scratch memory allocator]. Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
      +** +**
      SQLITE_STATUS_PARSER_STACK
      +**
      This parameter records the deepest parser stack. It is only +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
      +**
      +** +** New status parameters may be added from time to time. +*/ +#define SQLITE_STATUS_MEMORY_USED 0 +#define SQLITE_STATUS_PAGECACHE_USED 1 +#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 +#define SQLITE_STATUS_SCRATCH_USED 3 +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 +#define SQLITE_STATUS_MALLOC_SIZE 5 +#define SQLITE_STATUS_PARSER_STACK 6 +#define SQLITE_STATUS_PAGECACHE_SIZE 7 +#define SQLITE_STATUS_SCRATCH_SIZE 8 + +/* +** CAPI3REF: Database Connection Status {H17500} +** EXPERIMENTAL +** +** This interface is used to retrieve runtime status information +** about a single [database connection]. The first argument is the +** database connection object to be interrogated. The second argument +** is the parameter to interrogate. Currently, the only allowed value +** for the second parameter is [SQLITE_DBSTATUS_LOOKASIDE_USED]. +** Additional options will likely appear in future releases of SQLite. +** +** The current value of the requested parameter is written into *pCur +** and the highest instantaneous value is written into *pHiwtr. If +** the resetFlg is true, then the highest instantaneous value is +** reset back down to the current value. +** +** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); + +/* +** CAPI3REF: Status Parameters for database connections {H17520} +** EXPERIMENTAL +** +** These constants are the available integer "verbs" that can be passed as +** the second argument to the [sqlite3_db_status()] interface. +** +** New verbs may be added in future releases of SQLite. Existing verbs +** might be discontinued. Applications should check the return code from +** [sqlite3_db_status()] to make sure that the call worked. +** The [sqlite3_db_status()] interface will return a non-zero error code +** if a discontinued or unsupported verb is invoked. +** +**
      +**
      SQLITE_DBSTATUS_LOOKASIDE_USED
      +**
      This parameter returns the number of lookaside memory slots currently +** checked out.
      +**
      +*/ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 + + +/* +** CAPI3REF: Prepared Statement Status {H17550} +** EXPERIMENTAL +** +** Each prepared statement maintains various +** [SQLITE_STMTSTATUS_SORT | counters] that measure the number +** of times it has performed specific operations. These counters can +** be used to monitor the performance characteristics of the prepared +** statements. For example, if the number of table steps greatly exceeds +** the number of table searches or result rows, that would tend to indicate +** that the prepared statement is using a full table scan rather than +** an index. +** +** This interface is used to retrieve and reset counter values from +** a [prepared statement]. The first argument is the prepared statement +** object to be interrogated. The second argument +** is an integer code for a specific [SQLITE_STMTSTATUS_SORT | counter] +** to be interrogated. +** The current value of the requested counter is returned. +** If the resetFlg is true, then the counter is reset to zero after this +** interface call returns. +** +** See also: [sqlite3_status()] and [sqlite3_db_status()]. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); + +/* +** CAPI3REF: Status Parameters for prepared statements {H17570} +** EXPERIMENTAL +** +** These preprocessor macros define integer codes that name counter +** values associated with the [sqlite3_stmt_status()] interface. +** The meanings of the various counters are as follows: +** +**
      +**
      SQLITE_STMTSTATUS_FULLSCAN_STEP
      +**
      This is the number of times that SQLite has stepped forward in +** a table as part of a full table scan. Large numbers for this counter +** may indicate opportunities for performance improvement through +** careful use of indices.
      +** +**
      SQLITE_STMTSTATUS_SORT
      +**
      This is the number of sort operations that have occurred. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance through careful use of indices.
      +** +**
      +*/ +#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 +#define SQLITE_STMTSTATUS_SORT 2 + +/* +** CAPI3REF: Custom Page Cache Object +** EXPERIMENTAL +** +** The sqlite3_pcache type is opaque. It is implemented by +** the pluggable module. The SQLite core has no knowledge of +** its size or internal structure and never deals with the +** sqlite3_pcache object except by holding and passing pointers +** to the object. +** +** See [sqlite3_pcache_methods] for additional information. +*/ +typedef struct sqlite3_pcache sqlite3_pcache; + +/* +** CAPI3REF: Application Defined Page Cache. +** KEYWORDS: {page cache} +** EXPERIMENTAL +** +** The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can +** register an alternative page cache implementation by passing in an +** instance of the sqlite3_pcache_methods structure. The majority of the +** heap memory used by SQLite is used by the page cache to cache data read +** from, or ready to be written to, the database file. By implementing a +** custom page cache using this API, an application can control more +** precisely the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for +** how long. +** +** The contents of the sqlite3_pcache_methods structure are copied to an +** internal buffer by SQLite within the call to [sqlite3_config]. Hence +** the application may discard the parameter after the call to +** [sqlite3_config()] returns. +** +** The xInit() method is called once for each call to [sqlite3_initialize()] +** (usually only once during the lifetime of the process). It is passed +** a copy of the sqlite3_pcache_methods.pArg value. It can be used to set +** up global structures and mutexes required by the custom page cache +** implementation. +** +** The xShutdown() method is called from within [sqlite3_shutdown()], +** if the application invokes this API. It can be used to clean up +** any outstanding resources before process shutdown, if required. +** +** SQLite holds a [SQLITE_MUTEX_RECURSIVE] mutex when it invokes +** the xInit method, so the xInit method need not be threadsafe. The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. All other methods must be threadsafe +** in multithreaded applications. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +** +** The xCreate() method is used to construct a new cache instance. SQLite +** will typically create one cache instance for each open database file, +** though this is not guaranteed. The +** first parameter, szPage, is the size in bytes of the pages that must +** be allocated by the cache. szPage will not be a power of two. szPage +** will the page size of the database file that is to be cached plus an +** increment (here called "R") of about 100 or 200. SQLite will use the +** extra R bytes on each page to store metadata about the underlying +** database page on disk. The value of R depends +** on the SQLite version, the target platform, and how SQLite was compiled. +** R is constant for a particular build of SQLite. The second argument to +** xCreate(), bPurgeable, is true if the cache being created will +** be used to cache database pages of a file stored on disk, or +** false if it is used for an in-memory database. The cache implementation +** does not have to do anything special based with the value of bPurgeable; +** it is purely advisory. On a cache where bPurgeable is false, SQLite will +** never invoke xUnpin() except to deliberately delete a page. +** In other words, a cache created with bPurgeable set to false will +** never contain any unpinned pages. +** +** The xCachesize() method may be called at any time by SQLite to set the +** suggested maximum cache-size (number of pages stored by) the cache +** instance passed as the first argument. This is the value configured using +** the SQLite "[PRAGMA cache_size]" command. As with the bPurgeable parameter, +** the implementation is not required to do anything with this +** value; it is advisory only. +** +** The xPagecount() method should return the number of pages currently +** stored in the cache. +** +** The xFetch() method is used to fetch a page and return a pointer to it. +** A 'page', in this context, is a buffer of szPage bytes aligned at an +** 8-byte boundary. The page to be fetched is determined by the key. The +** mimimum key value is 1. After it has been retrieved using xFetch, the page +** is considered to be "pinned". +** +** If the requested page is already in the page cache, then the page cache +** implementation must return a pointer to the page buffer with its content +** intact. If the requested page is not already in the cache, then the +** behavior of the cache implementation is determined by the value of the +** createFlag parameter passed to xFetch, according to the following table: +** +** +**
      createFlag Behaviour when page is not already in cache +**
      0 Do not allocate a new page. Return NULL. +**
      1 Allocate a new page if it easy and convenient to do so. +** Otherwise return NULL. +**
      2 Make every effort to allocate a new page. Only return +** NULL if allocating a new page is effectively impossible. +**
      +** +** SQLite will normally invoke xFetch() with a createFlag of 0 or 1. If +** a call to xFetch() with createFlag==1 returns NULL, then SQLite will +** attempt to unpin one or more cache pages by spilling the content of +** pinned pages to disk and synching the operating system disk cache. After +** attempting to unpin pages, the xFetch() method will be invoked again with +** a createFlag of 2. +** +** xUnpin() is called by SQLite with a pointer to a currently pinned page +** as its second argument. If the third parameter, discard, is non-zero, +** then the page should be evicted from the cache. In this case SQLite +** assumes that the next time the page is retrieved from the cache using +** the xFetch() method, it will be zeroed. If the discard parameter is +** zero, then the page is considered to be unpinned. The cache implementation +** may choose to evict unpinned pages at any time. +** +** The cache is not required to perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls +** to xFetch(). +** +** The xRekey() method is used to change the key value associated with the +** page passed as the second argument from oldKey to newKey. If the cache +** previously contains an entry associated with newKey, it should be +** discarded. Any prior cache entry associated with newKey is guaranteed not +** to be pinned. +** +** When SQLite calls the xTruncate() method, the cache must discard all +** existing cache entries with page numbers (keys) greater than or equal +** to the value of the iLimit parameter passed to xTruncate(). If any +** of these pages are pinned, they are implicitly unpinned, meaning that +** they can be safely discarded. +** +** The xDestroy() method is used to delete a cache allocated by xCreate(). +** All resources associated with the specified cache should be freed. After +** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] +** handle invalid, and will not use it with any other sqlite3_pcache_methods +** functions. +*/ +typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; +struct sqlite3_pcache_methods { + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, void*, int discard); + void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); +}; + +/* +** CAPI3REF: Online Backup Object +** EXPERIMENTAL +** +** The sqlite3_backup object records state information about an ongoing +** online backup operation. The sqlite3_backup object is created by +** a call to [sqlite3_backup_init()] and is destroyed by a call to +** [sqlite3_backup_finish()]. +** +** See Also: [Using the SQLite Online Backup API] +*/ +typedef struct sqlite3_backup sqlite3_backup; + +/* +** CAPI3REF: Online Backup API. +** EXPERIMENTAL +** +** This API is used to overwrite the contents of one database with that +** of another. It is useful either for creating backups of databases or +** for copying in-memory databases to or from persistent files. +** +** See Also: [Using the SQLite Online Backup API] +** +** Exclusive access is required to the destination database for the +** duration of the operation. However the source database is only +** read-locked while it is actually being read, it is not locked +** continuously for the entire operation. Thus, the backup may be +** performed on a live database without preventing other users from +** writing to the database for an extended period of time. +** +** To perform a backup operation: +**
        +**
      1. sqlite3_backup_init() is called once to initialize the +** backup, +**
      2. sqlite3_backup_step() is called one or more times to transfer +** the data between the two databases, and finally +**
      3. sqlite3_backup_finish() is called to release all resources +** associated with the backup operation. +**
      +** There should be exactly one call to sqlite3_backup_finish() for each +** successful call to sqlite3_backup_init(). +** +** sqlite3_backup_init() +** +** The first two arguments passed to [sqlite3_backup_init()] are the database +** handle associated with the destination database and the database name +** used to attach the destination database to the handle. The database name +** is "main" for the main database, "temp" for the temporary database, or +** the name specified as part of the [ATTACH] statement if the destination is +** an attached database. The third and fourth arguments passed to +** sqlite3_backup_init() identify the [database connection] +** and database name used +** to access the source database. The values passed for the source and +** destination [database connection] parameters must not be the same. +** +** If an error occurs within sqlite3_backup_init(), then NULL is returned +** and an error code and error message written into the [database connection] +** passed as the first argument. They may be retrieved using the +** [sqlite3_errcode()], [sqlite3_errmsg()], and [sqlite3_errmsg16()] functions. +** Otherwise, if successful, a pointer to an [sqlite3_backup] object is +** returned. This pointer may be used with the sqlite3_backup_step() and +** sqlite3_backup_finish() functions to perform the specified backup +** operation. +** +** sqlite3_backup_step() +** +** Function [sqlite3_backup_step()] is used to copy up to nPage pages between +** the source and destination databases, where nPage is the value of the +** second parameter passed to sqlite3_backup_step(). If nPage is a negative +** value, all remaining source pages are copied. If the required pages are +** succesfully copied, but there are still more pages to copy before the +** backup is complete, it returns [SQLITE_OK]. If no error occured and there +** are no more pages to copy, then [SQLITE_DONE] is returned. If an error +** occurs, then an SQLite error code is returned. As well as [SQLITE_OK] and +** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], +** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. +** +** As well as the case where the destination database file was opened for +** read-only access, sqlite3_backup_step() may return [SQLITE_READONLY] if +** the destination is an in-memory database with a different page size +** from the source database. +** +** If sqlite3_backup_step() cannot obtain a required file-system lock, then +** the [sqlite3_busy_handler | busy-handler function] +** is invoked (if one is specified). If the +** busy-handler returns non-zero before the lock is available, then +** [SQLITE_BUSY] is returned to the caller. In this case the call to +** sqlite3_backup_step() can be retried later. If the source +** [database connection] +** is being used to write to the source database when sqlite3_backup_step() +** is called, then [SQLITE_LOCKED] is returned immediately. Again, in this +** case the call to sqlite3_backup_step() can be retried later on. If +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or +** [SQLITE_READONLY] is returned, then +** there is no point in retrying the call to sqlite3_backup_step(). These +** errors are considered fatal. At this point the application must accept +** that the backup operation has failed and pass the backup operation handle +** to the sqlite3_backup_finish() to release associated resources. +** +** Following the first call to sqlite3_backup_step(), an exclusive lock is +** obtained on the destination file. It is not released until either +** sqlite3_backup_finish() is called or the backup operation is complete +** and sqlite3_backup_step() returns [SQLITE_DONE]. Additionally, each time +** a call to sqlite3_backup_step() is made a [shared lock] is obtained on +** the source database file. This lock is released before the +** sqlite3_backup_step() call returns. Because the source database is not +** locked between calls to sqlite3_backup_step(), it may be modified mid-way +** through the backup procedure. If the source database is modified by an +** external process or via a database connection other than the one being +** used by the backup operation, then the backup will be transparently +** restarted by the next call to sqlite3_backup_step(). If the source +** database is modified by the using the same database connection as is used +** by the backup operation, then the backup database is transparently +** updated at the same time. +** +** sqlite3_backup_finish() +** +** Once sqlite3_backup_step() has returned [SQLITE_DONE], or when the +** application wishes to abandon the backup operation, the [sqlite3_backup] +** object should be passed to sqlite3_backup_finish(). This releases all +** resources associated with the backup operation. If sqlite3_backup_step() +** has not yet returned [SQLITE_DONE], then any active write-transaction on the +** destination database is rolled back. The [sqlite3_backup] object is invalid +** and may not be used following a call to sqlite3_backup_finish(). +** +** The value returned by sqlite3_backup_finish is [SQLITE_OK] if no error +** occurred, regardless or whether or not sqlite3_backup_step() was called +** a sufficient number of times to complete the backup operation. Or, if +** an out-of-memory condition or IO error occured during a call to +** sqlite3_backup_step() then [SQLITE_NOMEM] or an +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] error code +** is returned. In this case the error code and an error message are +** written to the destination [database connection]. +** +** A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() is +** not a permanent error and does not affect the return value of +** sqlite3_backup_finish(). +** +** sqlite3_backup_remaining(), sqlite3_backup_pagecount() +** +** Each call to sqlite3_backup_step() sets two values stored internally +** by an [sqlite3_backup] object. The number of pages still to be backed +** up, which may be queried by sqlite3_backup_remaining(), and the total +** number of pages in the source database file, which may be queried by +** sqlite3_backup_pagecount(). +** +** The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified during a backup +** operation, then the values are not updated to account for any extra +** pages that need to be updated or the size of the source database file +** changing. +** +** Concurrent Usage of Database Handles +** +** The source [database connection] may be used by the application for other +** purposes while a backup operation is underway or being initialized. +** If SQLite is compiled and configured to support threadsafe database +** connections, then the source database connection may be used concurrently +** from within other threads. +** +** However, the application must guarantee that the destination database +** connection handle is not passed to any other API (by any thread) after +** sqlite3_backup_init() is called and before the corresponding call to +** sqlite3_backup_finish(). Unfortunately SQLite does not currently check +** for this, if the application does use the destination [database connection] +** for some other purpose during a backup operation, things may appear to +** work correctly but in fact be subtly malfunctioning. Use of the +** destination database connection while a backup is in progress might +** also cause a mutex deadlock. +** +** Furthermore, if running in [shared cache mode], the application must +** guarantee that the shared cache used by the destination database +** is not accessed while the backup is running. In practice this means +** that the application must guarantee that the file-system file being +** backed up to is not accessed by any connection within the process, +** not just the specific connection that was passed to sqlite3_backup_init(). +** +** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** threads may safely make multiple concurrent calls to sqlite3_backup_step(). +** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** APIs are not strictly speaking threadsafe. If they are invoked at the +** same time as another thread is invoking sqlite3_backup_step() it is +** possible that they return invalid values. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3 *pDest, /* Destination database handle */ + const char *zDestName, /* Destination database name */ + sqlite3 *pSource, /* Source database handle */ + const char *zSourceName /* Source database name */ +); +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); + +/* +** CAPI3REF: Unlock Notification +** EXPERIMENTAL +** +** When running in shared-cache mode, a database operation may fail with +** an [SQLITE_LOCKED] error if the required locks on the shared-cache or +** individual tables within the shared-cache cannot be obtained. See +** [SQLite Shared-Cache Mode] for a description of shared-cache locking. +** This API may be used to register a callback that SQLite will invoke +** when the connection currently holding the required lock relinquishes it. +** This API is only available if the library was compiled with the +** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. +** +** See Also: [Using the SQLite Unlock Notification Feature]. +** +** Shared-cache locks are released when a database connection concludes +** its current transaction, either by committing it or rolling it back. +** +** When a connection (known as the blocked connection) fails to obtain a +** shared-cache lock and SQLITE_LOCKED is returned to the caller, the +** identity of the database connection (the blocking connection) that +** has locked the required resource is stored internally. After an +** application receives an SQLITE_LOCKED error, it may call the +** sqlite3_unlock_notify() method with the blocked connection handle as +** the first argument to register for a callback that will be invoked +** when the blocking connections current transaction is concluded. The +** callback is invoked from within the [sqlite3_step] or [sqlite3_close] +** call that concludes the blocking connections transaction. +** +** If sqlite3_unlock_notify() is called in a multi-threaded application, +** there is a chance that the blocking connection will have already +** concluded its transaction by the time sqlite3_unlock_notify() is invoked. +** If this happens, then the specified callback is invoked immediately, +** from within the call to sqlite3_unlock_notify(). +** +** If the blocked connection is attempting to obtain a write-lock on a +** shared-cache table, and more than one other connection currently holds +** a read-lock on the same table, then SQLite arbitrarily selects one of +** the other connections to use as the blocking connection. +** +** There may be at most one unlock-notify callback registered by a +** blocked connection. If sqlite3_unlock_notify() is called when the +** blocked connection already has a registered unlock-notify callback, +** then the new callback replaces the old. If sqlite3_unlock_notify() is +** called with a NULL pointer as its second argument, then any existing +** unlock-notify callback is cancelled. The blocked connections +** unlock-notify callback may also be canceled by closing the blocked +** connection using [sqlite3_close()]. +** +** The unlock-notify callback is not reentrant. If an application invokes +** any sqlite3_xxx API functions from within an unlock-notify callback, a +** crash or deadlock may be the result. +** +** Unless deadlock is detected (see below), sqlite3_unlock_notify() always +** returns SQLITE_OK. +** +** Callback Invocation Details +** +** When an unlock-notify callback is registered, the application provides a +** single void* pointer that is passed to the callback when it is invoked. +** However, the signature of the callback function allows SQLite to pass +** it an array of void* context pointers. The first argument passed to +** an unlock-notify callback is a pointer to an array of void* pointers, +** and the second is the number of entries in the array. +** +** When a blocking connections transaction is concluded, there may be +** more than one blocked connection that has registered for an unlock-notify +** callback. If two or more such blocked connections have specified the +** same callback function, then instead of invoking the callback function +** multiple times, it is invoked once with the set of void* context pointers +** specified by the blocked connections bundled together into an array. +** This gives the application an opportunity to prioritize any actions +** related to the set of unblocked database connections. +** +** Deadlock Detection +** +** Assuming that after registering for an unlock-notify callback a +** database waits for the callback to be issued before taking any further +** action (a reasonable assumption), then using this API may cause the +** application to deadlock. For example, if connection X is waiting for +** connection Y's transaction to be concluded, and similarly connection +** Y is waiting on connection X's transaction, then neither connection +** will proceed and the system may remain deadlocked indefinitely. +** +** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock +** detection. If a given call to sqlite3_unlock_notify() would put the +** system in a deadlocked state, then SQLITE_LOCKED is returned and no +** unlock-notify callback is registered. The system is said to be in +** a deadlocked state if connection A has registered for an unlock-notify +** callback on the conclusion of connection B's transaction, and connection +** B has itself registered for an unlock-notify callback when connection +** A's transaction is concluded. Indirect deadlock is also detected, so +** the system is also considered to be deadlocked if connection B has +** registered for an unlock-notify callback on the conclusion of connection +** C's transaction, where connection C is waiting on connection A. Any +** number of levels of indirection are allowed. +** +** The "DROP TABLE" Exception +** +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** always appropriate to call sqlite3_unlock_notify(). There is however, +** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, +** SQLite checks if there are any currently executing SELECT statements +** that belong to the same connection. If there are, SQLITE_LOCKED is +** returned. In this case there is no "blocking connection", so invoking +** sqlite3_unlock_notify() results in the unlock-notify callback being +** invoked immediately. If the application then re-attempts the "DROP TABLE" +** or "DROP INDEX" query, an infinite loop might be the result. +** +** One way around this problem is to check the extended error code returned +** by an sqlite3_step() call. If there is a blocking connection, then the +** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in +** the special "DROP TABLE/INDEX" case, the extended error code is just +** SQLITE_LOCKED. +*/ +SQLITE_API int sqlite3_unlock_notify( + sqlite3 *pBlocked, /* Waiting connection */ + void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ + void *pNotifyArg /* Argument to pass to xNotify */ +); + + +/* +** CAPI3REF: String Comparison +** EXPERIMENTAL +** +** The [sqlite3_strnicmp()] API allows applications and extensions to +** compare the contents of two buffers containing UTF-8 strings in a +** case-indendent fashion, using the same definition of case independence +** that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#if 0 +} /* End of the 'extern "C"' block */ +#endif +#endif + + +/************** End of sqlite3.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include hash.h in the middle of sqliteInt.h ******************/ +/************** Begin file hash.h ********************************************/ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the header file for the generic hash-table implemenation +** used in SQLite. +** +** $Id: hash.h,v 1.15 2009/05/02 13:29:38 drh Exp $ +*/ +#ifndef _SQLITE_HASH_H_ +#define _SQLITE_HASH_H_ + +/* Forward declarations of structures. */ +typedef struct Hash Hash; +typedef struct HashElem HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, some of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +** +** All elements of the hash table are on a single doubly-linked list. +** Hash.first points to the head of this list. +** +** There are Hash.htsize buckets. Each bucket points to a spot in +** the global doubly-linked list. The contents of the bucket are the +** element pointed to plus the next _ht.count-1 elements in the list. +** +** Hash.htsize and Hash.ht may be zero. In that case lookup is done +** by a linear search of the global list. For small tables, the +** Hash.ht table is never allocated because if there are few elements +** in the table, it is faster to do a linear search than to manage +** the hash table. +*/ +struct Hash { + unsigned int htsize; /* Number of buckets in the hash table */ + unsigned int count; /* Number of entries in this table */ + HashElem *first; /* The first element of the array */ + struct _ht { /* the hash table */ + int count; /* Number of entries with this hash */ + HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct HashElem { + HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + const char *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +SQLITE_PRIVATE void sqlite3HashInit(Hash*); +SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, int nKey, void *pData); +SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey, int nKey); +SQLITE_PRIVATE void sqlite3HashClear(Hash*); + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Hash h; +** HashElem *p; +** ... +** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ +** SomeStructure *pData = sqliteHashData(p); +** // do something with pData +** } +*/ +#define sqliteHashFirst(H) ((H)->first) +#define sqliteHashNext(E) ((E)->next) +#define sqliteHashData(E) ((E)->data) +/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */ +/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */ + +/* +** Number of entries in a hash table +*/ +/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ + +#endif /* _SQLITE_HASH_H_ */ + +/************** End of hash.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include parse.h in the middle of sqliteInt.h *****************/ +/************** Begin file parse.h *******************************************/ +#define TK_SEMI 1 +#define TK_EXPLAIN 2 +#define TK_QUERY 3 +#define TK_PLAN 4 +#define TK_BEGIN 5 +#define TK_TRANSACTION 6 +#define TK_DEFERRED 7 +#define TK_IMMEDIATE 8 +#define TK_EXCLUSIVE 9 +#define TK_COMMIT 10 +#define TK_END 11 +#define TK_ROLLBACK 12 +#define TK_SAVEPOINT 13 +#define TK_RELEASE 14 +#define TK_TO 15 +#define TK_TABLE 16 +#define TK_CREATE 17 +#define TK_IF 18 +#define TK_NOT 19 +#define TK_EXISTS 20 +#define TK_TEMP 21 +#define TK_LP 22 +#define TK_RP 23 +#define TK_AS 24 +#define TK_COMMA 25 +#define TK_ID 26 +#define TK_INDEXED 27 +#define TK_ABORT 28 +#define TK_ACTION 29 +#define TK_AFTER 30 +#define TK_ANALYZE 31 +#define TK_ASC 32 +#define TK_ATTACH 33 +#define TK_BEFORE 34 +#define TK_BY 35 +#define TK_CASCADE 36 +#define TK_CAST 37 +#define TK_COLUMNKW 38 +#define TK_CONFLICT 39 +#define TK_DATABASE 40 +#define TK_DESC 41 +#define TK_DETACH 42 +#define TK_EACH 43 +#define TK_FAIL 44 +#define TK_FOR 45 +#define TK_IGNORE 46 +#define TK_INITIALLY 47 +#define TK_INSTEAD 48 +#define TK_LIKE_KW 49 +#define TK_MATCH 50 +#define TK_NO 51 +#define TK_KEY 52 +#define TK_OF 53 +#define TK_OFFSET 54 +#define TK_PRAGMA 55 +#define TK_RAISE 56 +#define TK_REPLACE 57 +#define TK_RESTRICT 58 +#define TK_ROW 59 +#define TK_TRIGGER 60 +#define TK_VACUUM 61 +#define TK_VIEW 62 +#define TK_VIRTUAL 63 +#define TK_REINDEX 64 +#define TK_RENAME 65 +#define TK_CTIME_KW 66 +#define TK_ANY 67 +#define TK_OR 68 +#define TK_AND 69 +#define TK_IS 70 +#define TK_BETWEEN 71 +#define TK_IN 72 +#define TK_ISNULL 73 +#define TK_NOTNULL 74 +#define TK_NE 75 +#define TK_EQ 76 +#define TK_GT 77 +#define TK_LE 78 +#define TK_LT 79 +#define TK_GE 80 +#define TK_ESCAPE 81 +#define TK_BITAND 82 +#define TK_BITOR 83 +#define TK_LSHIFT 84 +#define TK_RSHIFT 85 +#define TK_PLUS 86 +#define TK_MINUS 87 +#define TK_STAR 88 +#define TK_SLASH 89 +#define TK_REM 90 +#define TK_CONCAT 91 +#define TK_COLLATE 92 +#define TK_BITNOT 93 +#define TK_STRING 94 +#define TK_JOIN_KW 95 +#define TK_CONSTRAINT 96 +#define TK_DEFAULT 97 +#define TK_NULL 98 +#define TK_PRIMARY 99 +#define TK_UNIQUE 100 +#define TK_CHECK 101 +#define TK_REFERENCES 102 +#define TK_AUTOINCR 103 +#define TK_ON 104 +#define TK_DELETE 105 +#define TK_UPDATE 106 +#define TK_SET 107 +#define TK_DEFERRABLE 108 +#define TK_FOREIGN 109 +#define TK_DROP 110 +#define TK_UNION 111 +#define TK_ALL 112 +#define TK_EXCEPT 113 +#define TK_INTERSECT 114 +#define TK_SELECT 115 +#define TK_DISTINCT 116 +#define TK_DOT 117 +#define TK_FROM 118 +#define TK_JOIN 119 +#define TK_USING 120 +#define TK_ORDER 121 +#define TK_GROUP 122 +#define TK_HAVING 123 +#define TK_LIMIT 124 +#define TK_WHERE 125 +#define TK_INTO 126 +#define TK_VALUES 127 +#define TK_INSERT 128 +#define TK_INTEGER 129 +#define TK_FLOAT 130 +#define TK_BLOB 131 +#define TK_REGISTER 132 +#define TK_VARIABLE 133 +#define TK_CASE 134 +#define TK_WHEN 135 +#define TK_THEN 136 +#define TK_ELSE 137 +#define TK_INDEX 138 +#define TK_ALTER 139 +#define TK_ADD 140 +#define TK_TO_TEXT 141 +#define TK_TO_BLOB 142 +#define TK_TO_NUMERIC 143 +#define TK_TO_INT 144 +#define TK_TO_REAL 145 +#define TK_ISNOT 146 +#define TK_END_OF_FILE 147 +#define TK_ILLEGAL 148 +#define TK_SPACE 149 +#define TK_UNCLOSED_STRING 150 +#define TK_FUNCTION 151 +#define TK_COLUMN 152 +#define TK_AGG_FUNCTION 153 +#define TK_AGG_COLUMN 154 +#define TK_CONST_FUNC 155 +#define TK_UMINUS 156 +#define TK_UPLUS 157 + +/************** End of parse.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +#include +#include +#include +#include +#include + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite_int64 +# define LONGDOUBLE_TYPE sqlite_int64 +# ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) +# endif +# define SQLITE_OMIT_DATETIME_FUNCS 1 +# define SQLITE_OMIT_TRACE 1 +# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +# undef SQLITE_HAVE_ISNAN +#endif +#ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (1e99) +#endif + +/* +** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 +** afterward. Having this macro allows us to cause the C compiler +** to omit code used by TEMP tables without messy #ifndef statements. +*/ +#ifdef SQLITE_OMIT_TEMPDB +#define OMIT_TEMPDB 1 +#else +#define OMIT_TEMPDB 0 +#endif + +/* +** If the following macro is set to 1, then NULL values are considered +** distinct when determining whether or not two entries are the same +** in a UNIQUE index. This is the way PostgreSQL, Oracle, DB2, MySQL, +** OCELOT, and Firebird all work. The SQL92 spec explicitly says this +** is the way things are suppose to work. +** +** If the following macro is set to 0, the NULLs are indistinct for +** a UNIQUE index. In this mode, you can only have a single NULL entry +** for a column declared UNIQUE. This is the way Informix and SQL Server +** work. +*/ +#define NULL_DISTINCT_FOR_UNIQUE 1 + +/* +** The "file format" number is an integer that is incremented whenever +** the VDBE-level file format changes. The following macros define the +** the default file format for new databases and the maximum file format +** that the library can read. +*/ +#define SQLITE_MAX_FILE_FORMAT 4 +#ifndef SQLITE_DEFAULT_FILE_FORMAT +# define SQLITE_DEFAULT_FILE_FORMAT 1 +#endif + +#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS +# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 +#endif + +/* +** Provide a default value for SQLITE_TEMP_STORE in case it is not specified +** on the command-line +*/ +#ifndef SQLITE_TEMP_STORE +# define SQLITE_TEMP_STORE 1 +#endif + +/* +** GCC does not define the offsetof() macro so we'll have to do it +** ourselves. +*/ +#ifndef offsetof +#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) +#endif + +/* +** Check to see if this machine uses EBCDIC. (Yes, believe it or +** not, there are still machines out there that use EBCDIC.) +*/ +#if 'A' == '\301' +# define SQLITE_EBCDIC 1 +#else +# define SQLITE_ASCII 1 +#endif + +/* +** Integers of known sizes. These typedefs might change for architectures +** where the sizes very. Preprocessor macros are available so that the +** types can be conveniently redefined at compile-type. Like this: +** +** cc '-DUINTPTR_TYPE=long long int' ... +*/ +#ifndef UINT32_TYPE +# ifdef HAVE_UINT32_T +# define UINT32_TYPE uint32_t +# else +# define UINT32_TYPE unsigned int +# endif +#endif +#ifndef UINT16_TYPE +# ifdef HAVE_UINT16_T +# define UINT16_TYPE uint16_t +# else +# define UINT16_TYPE unsigned short int +# endif +#endif +#ifndef INT16_TYPE +# ifdef HAVE_INT16_T +# define INT16_TYPE int16_t +# else +# define INT16_TYPE short int +# endif +#endif +#ifndef UINT8_TYPE +# ifdef HAVE_UINT8_T +# define UINT8_TYPE uint8_t +# else +# define UINT8_TYPE unsigned char +# endif +#endif +#ifndef INT8_TYPE +# ifdef HAVE_INT8_T +# define INT8_TYPE int8_t +# else +# define INT8_TYPE signed char +# endif +#endif +#ifndef LONGDOUBLE_TYPE +# define LONGDOUBLE_TYPE long double +#endif +typedef sqlite_int64 i64; /* 8-byte signed integer */ +typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ +typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ +typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ +typedef INT16_TYPE i16; /* 2-byte signed integer */ +typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ +typedef INT8_TYPE i8; /* 1-byte signed integer */ + +/* +** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value +** that can be stored in a u32 without loss of data. The value +** is 0x00000000ffffffff. But because of quirks of some compilers, we +** have to specify the value in the less intuitive manner shown: +*/ +#define SQLITE_MAX_U32 ((((u64)1)<<32)-1) + +/* +** Macros to determine whether the machine is big or little endian, +** evaluated at runtime. +*/ +#ifdef SQLITE_AMALGAMATION +SQLITE_PRIVATE const int sqlite3one = 1; +#else +SQLITE_PRIVATE const int sqlite3one; +#endif +#if defined(i386) || defined(__i386__) || defined(_M_IX86)\ + || defined(__x86_64) || defined(__x86_64__) +# define SQLITE_BIGENDIAN 0 +# define SQLITE_LITTLEENDIAN 1 +# define SQLITE_UTF16NATIVE SQLITE_UTF16LE +#else +# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) +# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) +# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) +#endif + +/* +** Constants for the largest and smallest possible 64-bit signed integers. +** These macros are designed to work correctly on both 32-bit and 64-bit +** compilers. +*/ +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + +/* +** Round up a number to the next larger multiple of 8. This is used +** to force 8-byte alignment on 64-bit architectures. +*/ +#define ROUND8(x) (((x)+7)&~7) + +/* +** Round down to the nearest multiple of 8 +*/ +#define ROUNDDOWN8(x) ((x)&~7) + +/* +** Assert that the pointer X is aligned to an 8-byte boundary. +*/ +#define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) + + +/* +** An instance of the following structure is used to store the busy-handler +** callback for a given sqlite handle. +** +** The sqlite.busyHandler member of the sqlite struct contains the busy +** callback for the database handle. Each pager opened via the sqlite +** handle is passed a pointer to sqlite.busyHandler. The busy-handler +** callback is currently invoked only from within pager.c. +*/ +typedef struct BusyHandler BusyHandler; +struct BusyHandler { + int (*xFunc)(void *,int); /* The busy callback */ + void *pArg; /* First arg to busy callback */ + int nBusy; /* Incremented with each busy call */ +}; + +/* +** Name of the master database table. The master database table +** is a special table that holds the names and attributes of all +** user tables and indices. +*/ +#define MASTER_NAME "sqlite_master" +#define TEMP_MASTER_NAME "sqlite_temp_master" + +/* +** The root-page of the master database table. +*/ +#define MASTER_ROOT 1 + +/* +** The name of the schema table. +*/ +#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) + +/* +** A convenience macro that returns the number of elements in +** an array. +*/ +#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0]))) + +/* +** The following value as a destructor means to use sqlite3DbFree(). +** This is an internal extension to SQLITE_STATIC and SQLITE_TRANSIENT. +*/ +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3DbFree) + +/* +** When SQLITE_OMIT_WSD is defined, it means that the target platform does +** not support Writable Static Data (WSD) such as global and static variables. +** All variables must either be on the stack or dynamically allocated from +** the heap. When WSD is unsupported, the variable declarations scattered +** throughout the SQLite code must become constants instead. The SQLITE_WSD +** macro is used for this purpose. And instead of referencing the variable +** directly, we use its constant as a key to lookup the run-time allocated +** buffer that holds real variable. The constant is also the initializer +** for the run-time allocated buffer. +** +** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL +** macros become no-ops and have zero performance impact. +*/ +#ifdef SQLITE_OMIT_WSD + #define SQLITE_WSD const + #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) + #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) +SQLITE_API int sqlite3_wsd_init(int N, int J); +SQLITE_API void *sqlite3_wsd_find(void *K, int L); +#else + #define SQLITE_WSD + #define GLOBAL(t,v) v + #define sqlite3GlobalConfig sqlite3Config +#endif + +/* +** The following macros are used to suppress compiler warnings and to +** make it clear to human readers when a function parameter is deliberately +** left unused within the body of a function. This usually happens when +** a function is called via a function pointer. For example the +** implementation of an SQL aggregate step callback may not use the +** parameter indicating the number of arguments passed to the aggregate, +** if it knows that this is enforced elsewhere. +** +** When a function parameter is not used at all within the body of a function, +** it is generally named "NotUsed" or "NotUsed2" to make things even clearer. +** However, these macros may also be used to suppress warnings related to +** parameters that may or may not be used depending on compilation options. +** For example those parameters only used in assert() statements. In these +** cases the parameters are named as per the usual conventions. +*/ +#define UNUSED_PARAMETER(x) (void)(x) +#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y) + +/* +** Forward references to structures +*/ +typedef struct AggInfo AggInfo; +typedef struct AuthContext AuthContext; +typedef struct AutoincInfo AutoincInfo; +typedef struct Bitvec Bitvec; +typedef struct RowSet RowSet; +typedef struct CollSeq CollSeq; +typedef struct Column Column; +typedef struct Db Db; +typedef struct Schema Schema; +typedef struct Expr Expr; +typedef struct ExprList ExprList; +typedef struct ExprSpan ExprSpan; +typedef struct FKey FKey; +typedef struct FuncDef FuncDef; +typedef struct FuncDefHash FuncDefHash; +typedef struct IdList IdList; +typedef struct Index Index; +typedef struct IndexSample IndexSample; +typedef struct KeyClass KeyClass; +typedef struct KeyInfo KeyInfo; +typedef struct Lookaside Lookaside; +typedef struct LookasideSlot LookasideSlot; +typedef struct Module Module; +typedef struct NameContext NameContext; +typedef struct Parse Parse; +typedef struct Savepoint Savepoint; +typedef struct Select Select; +typedef struct SrcList SrcList; +typedef struct StrAccum StrAccum; +typedef struct Table Table; +typedef struct TableLock TableLock; +typedef struct Token Token; +typedef struct TriggerPrg TriggerPrg; +typedef struct TriggerStep TriggerStep; +typedef struct Trigger Trigger; +typedef struct UnpackedRecord UnpackedRecord; +typedef struct VTable VTable; +typedef struct Walker Walker; +typedef struct WherePlan WherePlan; +typedef struct WhereInfo WhereInfo; +typedef struct WhereLevel WhereLevel; + +/* +** Defer sourcing vdbe.h and btree.h until after the "u8" and +** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque +** pointer types (i.e. FuncDef) defined above. +*/ +/************** Include btree.h in the middle of sqliteInt.h *****************/ +/************** Begin file btree.h *******************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the sqlite B-Tree file +** subsystem. See comments in the source code for a detailed description +** of what each interface routine does. +** +** @(#) $Id: btree.h,v 1.120 2009/07/22 00:35:24 drh Exp $ +*/ +#ifndef _BTREE_H_ +#define _BTREE_H_ + +/* TODO: This definition is just included so other modules compile. It +** needs to be revisited. +*/ +#define SQLITE_N_BTREE_META 10 + +/* +** If defined as non-zero, auto-vacuum is enabled by default. Otherwise +** it must be turned on for each database using "PRAGMA auto_vacuum = 1". +*/ +#ifndef SQLITE_DEFAULT_AUTOVACUUM + #define SQLITE_DEFAULT_AUTOVACUUM 0 +#endif + +#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ +#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ +#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ + +/* +** Forward declarations of structure +*/ +typedef struct Btree Btree; +typedef struct BtCursor BtCursor; +typedef struct BtShared BtShared; +typedef struct BtreeMutexArray BtreeMutexArray; + +/* +** This structure records all of the Btrees that need to hold +** a mutex before we enter sqlite3VdbeExec(). The Btrees are +** are placed in aBtree[] in order of aBtree[]->pBt. That way, +** we can always lock and unlock them all quickly. +*/ +struct BtreeMutexArray { + int nMutex; + Btree *aBtree[SQLITE_MAX_ATTACHED+1]; +}; + + +SQLITE_PRIVATE int sqlite3BtreeOpen( + const char *zFilename, /* Name of database file to open */ + sqlite3 *db, /* Associated database connection */ + Btree **ppBtree, /* Return open Btree* here */ + int flags, /* Flags */ + int vfsFlags /* Flags passed through to VFS open */ +); + +/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the +** following values. +** +** NOTE: These values must match the corresponding PAGER_ values in +** pager.h. +*/ +#define BTREE_OMIT_JOURNAL 1 /* Do not use journal. No argument */ +#define BTREE_NO_READLOCK 2 /* Omit readlocks on readonly files */ +#define BTREE_MEMORY 4 /* In-memory DB. No argument */ +#define BTREE_READONLY 8 /* Open the database in read-only mode */ +#define BTREE_READWRITE 16 /* Open for both reading and writing */ +#define BTREE_CREATE 32 /* Create the database if it does not exist */ + +SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(Btree*,int,int); +SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); +SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); +SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*); +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*); +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags); +SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); +SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock); +SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); + +SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); +SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *); +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *); + +SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); + +/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR +** of the following flags: +*/ +#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ +#define BTREE_ZERODATA 2 /* Table has keys only - no data */ +#define BTREE_LEAFDATA 4 /* Data stored in leaves only. Implies INTKEY */ + +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*); +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*); +SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree*, int); + +SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue); +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); + +/* +** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta +** should be one of the following values. The integer values are assigned +** to constants so that the offset of the corresponding field in an +** SQLite database header may be found using the following formula: +** +** offset = 36 + (idx * 4) +** +** For example, the free-page-count field is located at byte offset 36 of +** the database file header. The incr-vacuum-flag field is located at +** byte offset 64 (== 36+4*7). +*/ +#define BTREE_FREE_PAGE_COUNT 0 +#define BTREE_SCHEMA_VERSION 1 +#define BTREE_FILE_FORMAT 2 +#define BTREE_DEFAULT_CACHE_SIZE 3 +#define BTREE_LARGEST_ROOT_PAGE 4 +#define BTREE_TEXT_ENCODING 5 +#define BTREE_USER_VERSION 6 +#define BTREE_INCR_VACUUM 7 + +SQLITE_PRIVATE int sqlite3BtreeCursor( + Btree*, /* BTree containing table to open */ + int iTable, /* Index of root page */ + int wrFlag, /* 1 for writing. 0 for read-only */ + struct KeyInfo*, /* First argument to compare function */ + BtCursor *pCursor /* Space to write cursor structure */ +); +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); + +SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( + BtCursor*, + UnpackedRecord *pUnKey, + i64 intKey, + int bias, + int *pRes +); +SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*, int*); +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey, + const void *pData, int nData, + int nZero, int bias, int seekResult); +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor*, i64 *pSize); +SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt); +SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt); +SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, u32 *pSize); +SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64); +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*); + +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); +SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); + +SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *); +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); + +#ifndef NDEBUG +SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); +#endif + +#ifndef SQLITE_OMIT_BTREECOUNT +SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *); +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); +SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); +#endif + +/* +** If we are not using shared cache, then there is no need to +** use mutexes to access the BtShared structures. So make the +** Enter and Leave procedures no-ops. +*/ +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); +#else +# define sqlite3BtreeEnter(X) +# define sqlite3BtreeEnterAll(X) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); +SQLITE_PRIVATE void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*); +SQLITE_PRIVATE void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*); +SQLITE_PRIVATE void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*); +#ifndef NDEBUG + /* These routines are used inside assert() statements only. */ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); +#endif +#else + +# define sqlite3BtreeLeave(X) +# define sqlite3BtreeEnterCursor(X) +# define sqlite3BtreeLeaveCursor(X) +# define sqlite3BtreeLeaveAll(X) +# define sqlite3BtreeMutexArrayEnter(X) +# define sqlite3BtreeMutexArrayLeave(X) +# define sqlite3BtreeMutexArrayInsert(X,Y) + +# define sqlite3BtreeHoldsMutex(X) 1 +# define sqlite3BtreeHoldsAllMutexes(X) 1 +#endif + + +#endif /* _BTREE_H_ */ + +/************** End of btree.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include vdbe.h in the middle of sqliteInt.h ******************/ +/************** Begin file vdbe.h ********************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Header file for the Virtual DataBase Engine (VDBE) +** +** This header defines the interface to the virtual database engine +** or VDBE. The VDBE implements an abstract machine that runs a +** simple program to access and modify the underlying database. +** +** $Id: vdbe.h,v 1.142 2009/07/24 17:58:53 danielk1977 Exp $ +*/ +#ifndef _SQLITE_VDBE_H_ +#define _SQLITE_VDBE_H_ + +/* +** A single VDBE is an opaque structure named "Vdbe". Only routines +** in the source file sqliteVdbe.c are allowed to see the insides +** of this structure. +*/ +typedef struct Vdbe Vdbe; + +/* +** The names of the following types declared in vdbeInt.h are required +** for the VdbeOp definition. +*/ +typedef struct VdbeFunc VdbeFunc; +typedef struct Mem Mem; +typedef struct SubProgram SubProgram; + +/* +** A single instruction of the virtual machine has an opcode +** and as many as three operands. The instruction is recorded +** as an instance of the following structure: +*/ +struct VdbeOp { + u8 opcode; /* What operation to perform */ + signed char p4type; /* One of the P4_xxx constants for p4 */ + u8 opflags; /* Not currently used */ + u8 p5; /* Fifth parameter is an unsigned character */ + int p1; /* First operand */ + int p2; /* Second parameter (often the jump destination) */ + int p3; /* The third parameter */ + union { /* fourth parameter */ + int i; /* Integer value if p4type==P4_INT32 */ + void *p; /* Generic pointer */ + char *z; /* Pointer to data for string (char array) types */ + i64 *pI64; /* Used when p4type is P4_INT64 */ + double *pReal; /* Used when p4type is P4_REAL */ + FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ + VdbeFunc *pVdbeFunc; /* Used when p4type is P4_VDBEFUNC */ + CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ + Mem *pMem; /* Used when p4type is P4_MEM */ + VTable *pVtab; /* Used when p4type is P4_VTAB */ + KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ + int *ai; /* Used when p4type is P4_INTARRAY */ + SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ + } p4; +#ifdef SQLITE_DEBUG + char *zComment; /* Comment to improve readability */ +#endif +#ifdef VDBE_PROFILE + int cnt; /* Number of times this instruction was executed */ + u64 cycles; /* Total time spent executing this instruction */ +#endif +}; +typedef struct VdbeOp VdbeOp; + + +/* +** A sub-routine used to implement a trigger program. +*/ +struct SubProgram { + VdbeOp *aOp; /* Array of opcodes for sub-program */ + int nOp; /* Elements in aOp[] */ + int nMem; /* Number of memory cells required */ + int nCsr; /* Number of cursors required */ + int nRef; /* Number of pointers to this structure */ + void *token; /* id that may be used to recursive triggers */ +}; + +/* +** A smaller version of VdbeOp used for the VdbeAddOpList() function because +** it takes up less space. +*/ +struct VdbeOpList { + u8 opcode; /* What operation to perform */ + signed char p1; /* First operand */ + signed char p2; /* Second parameter (often the jump destination) */ + signed char p3; /* Third parameter */ +}; +typedef struct VdbeOpList VdbeOpList; + +/* +** Allowed values of VdbeOp.p4type +*/ +#define P4_NOTUSED 0 /* The P4 parameter is not used */ +#define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ +#define P4_STATIC (-2) /* Pointer to a static string */ +#define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */ +#define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ +#define P4_VDBEFUNC (-7) /* P4 is a pointer to a VdbeFunc structure */ +#define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ +#define P4_TRANSIENT (-9) /* P4 is a pointer to a transient string */ +#define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ +#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ +#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */ +#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ +#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */ + +/* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure +** is made. That copy is freed when the Vdbe is finalized. But if the +** argument is P4_KEYINFO_HANDOFF, the passed in pointer is used. It still +** gets freed when the Vdbe is finalized so it still should be obtained +** from a single sqliteMalloc(). But no copy is made and the calling +** function should *not* try to free the KeyInfo. +*/ +#define P4_KEYINFO_HANDOFF (-16) +#define P4_KEYINFO_STATIC (-17) + +/* +** The Vdbe.aColName array contains 5n Mem structures, where n is the +** number of columns of data returned by the statement. +*/ +#define COLNAME_NAME 0 +#define COLNAME_DECLTYPE 1 +#define COLNAME_DATABASE 2 +#define COLNAME_TABLE 3 +#define COLNAME_COLUMN 4 +#ifdef SQLITE_ENABLE_COLUMN_METADATA +# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ +#else +# ifdef SQLITE_OMIT_DECLTYPE +# define COLNAME_N 1 /* Store only the name */ +# else +# define COLNAME_N 2 /* Store the name and decltype */ +# endif +#endif + +/* +** The following macro converts a relative address in the p2 field +** of a VdbeOp structure into a negative number so that +** sqlite3VdbeAddOpList() knows that the address is relative. Calling +** the macro again restores the address. +*/ +#define ADDR(X) (-1-(X)) + +/* +** The makefile scans the vdbe.c source file and creates the "opcodes.h" +** header file that defines a number for each opcode used by the VDBE. +*/ +/************** Include opcodes.h in the middle of vdbe.h ********************/ +/************** Begin file opcodes.h *****************************************/ +/* Automatically generated. Do not edit */ +/* See the mkopcodeh.awk script for details */ +#define OP_VNext 1 +#define OP_Affinity 2 +#define OP_Column 3 +#define OP_SetCookie 4 +#define OP_Seek 5 +#define OP_Real 130 /* same as TK_FLOAT */ +#define OP_Sequence 6 +#define OP_Savepoint 7 +#define OP_Ge 80 /* same as TK_GE */ +#define OP_RowKey 8 +#define OP_SCopy 9 +#define OP_Eq 76 /* same as TK_EQ */ +#define OP_OpenWrite 10 +#define OP_NotNull 74 /* same as TK_NOTNULL */ +#define OP_If 11 +#define OP_ToInt 144 /* same as TK_TO_INT */ +#define OP_String8 94 /* same as TK_STRING */ +#define OP_CollSeq 12 +#define OP_OpenRead 13 +#define OP_Expire 14 +#define OP_AutoCommit 15 +#define OP_Gt 77 /* same as TK_GT */ +#define OP_Pagecount 16 +#define OP_IntegrityCk 17 +#define OP_Sort 18 +#define OP_Copy 20 +#define OP_Trace 21 +#define OP_Function 22 +#define OP_IfNeg 23 +#define OP_And 69 /* same as TK_AND */ +#define OP_Subtract 87 /* same as TK_MINUS */ +#define OP_Noop 24 +#define OP_Program 25 +#define OP_Return 26 +#define OP_Remainder 90 /* same as TK_REM */ +#define OP_NewRowid 27 +#define OP_Multiply 88 /* same as TK_STAR */ +#define OP_FkCounter 28 +#define OP_Variable 29 +#define OP_String 30 +#define OP_RealAffinity 31 +#define OP_VRename 32 +#define OP_ParseSchema 33 +#define OP_VOpen 34 +#define OP_Close 35 +#define OP_CreateIndex 36 +#define OP_IsUnique 37 +#define OP_NotFound 38 +#define OP_Int64 39 +#define OP_MustBeInt 40 +#define OP_Halt 41 +#define OP_Rowid 42 +#define OP_IdxLT 43 +#define OP_AddImm 44 +#define OP_RowData 45 +#define OP_MemMax 46 +#define OP_Or 68 /* same as TK_OR */ +#define OP_NotExists 47 +#define OP_Gosub 48 +#define OP_Divide 89 /* same as TK_SLASH */ +#define OP_Integer 49 +#define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/ +#define OP_Prev 50 +#define OP_RowSetRead 51 +#define OP_Concat 91 /* same as TK_CONCAT */ +#define OP_RowSetAdd 52 +#define OP_BitAnd 82 /* same as TK_BITAND */ +#define OP_VColumn 53 +#define OP_CreateTable 54 +#define OP_Last 55 +#define OP_SeekLe 56 +#define OP_IsNull 73 /* same as TK_ISNULL */ +#define OP_IncrVacuum 57 +#define OP_IdxRowid 58 +#define OP_ShiftRight 85 /* same as TK_RSHIFT */ +#define OP_ResetCount 59 +#define OP_Yield 60 +#define OP_DropTrigger 61 +#define OP_DropIndex 62 +#define OP_Param 63 +#define OP_IdxGE 64 +#define OP_IdxDelete 65 +#define OP_Vacuum 66 +#define OP_IfNot 67 +#define OP_DropTable 70 +#define OP_SeekLt 71 +#define OP_MakeRecord 72 +#define OP_ToBlob 142 /* same as TK_TO_BLOB */ +#define OP_ResultRow 81 +#define OP_Delete 92 +#define OP_AggFinal 95 +#define OP_Compare 96 +#define OP_ShiftLeft 84 /* same as TK_LSHIFT */ +#define OP_Goto 97 +#define OP_TableLock 98 +#define OP_Clear 99 +#define OP_Le 78 /* same as TK_LE */ +#define OP_VerifyCookie 100 +#define OP_AggStep 101 +#define OP_ToText 141 /* same as TK_TO_TEXT */ +#define OP_Not 19 /* same as TK_NOT */ +#define OP_ToReal 145 /* same as TK_TO_REAL */ +#define OP_Transaction 102 +#define OP_VFilter 103 +#define OP_Ne 75 /* same as TK_NE */ +#define OP_VDestroy 104 +#define OP_BitOr 83 /* same as TK_BITOR */ +#define OP_Next 105 +#define OP_Count 106 +#define OP_IdxInsert 107 +#define OP_Lt 79 /* same as TK_LT */ +#define OP_FkIfZero 108 +#define OP_SeekGe 109 +#define OP_Insert 110 +#define OP_Destroy 111 +#define OP_ReadCookie 112 +#define OP_RowSetTest 113 +#define OP_LoadAnalysis 114 +#define OP_Explain 115 +#define OP_HaltIfNull 116 +#define OP_OpenPseudo 117 +#define OP_OpenEphemeral 118 +#define OP_Null 119 +#define OP_Move 120 +#define OP_Blob 121 +#define OP_Add 86 /* same as TK_PLUS */ +#define OP_Rewind 122 +#define OP_SeekGt 123 +#define OP_VBegin 124 +#define OP_VUpdate 125 +#define OP_IfZero 126 +#define OP_BitNot 93 /* same as TK_BITNOT */ +#define OP_VCreate 127 +#define OP_Found 128 +#define OP_IfPos 129 +#define OP_NullRow 131 +#define OP_Jump 132 +#define OP_Permutation 133 + +/* The following opcode values are never used */ +#define OP_NotUsed_134 134 +#define OP_NotUsed_135 135 +#define OP_NotUsed_136 136 +#define OP_NotUsed_137 137 +#define OP_NotUsed_138 138 +#define OP_NotUsed_139 139 +#define OP_NotUsed_140 140 + + +/* Properties such as "out2" or "jump" that are specified in +** comments following the "case" for each opcode in the vdbe.c +** are encoded into bitvectors as follows: +*/ +#define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */ +#define OPFLG_OUT2_PRERELEASE 0x0002 /* out2-prerelease: */ +#define OPFLG_IN1 0x0004 /* in1: P1 is an input */ +#define OPFLG_IN2 0x0008 /* in2: P2 is an input */ +#define OPFLG_IN3 0x0010 /* in3: P3 is an input */ +#define OPFLG_OUT3 0x0020 /* out3: P3 is an output */ +#define OPFLG_INITIALIZER {\ +/* 0 */ 0x00, 0x01, 0x00, 0x00, 0x10, 0x08, 0x02, 0x00,\ +/* 8 */ 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,\ +/* 16 */ 0x02, 0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x05,\ +/* 24 */ 0x00, 0x01, 0x04, 0x02, 0x00, 0x00, 0x02, 0x04,\ +/* 32 */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x11, 0x11, 0x02,\ +/* 40 */ 0x05, 0x00, 0x02, 0x11, 0x04, 0x00, 0x08, 0x11,\ +/* 48 */ 0x01, 0x02, 0x01, 0x21, 0x08, 0x00, 0x02, 0x01,\ +/* 56 */ 0x11, 0x01, 0x02, 0x00, 0x04, 0x00, 0x00, 0x02,\ +/* 64 */ 0x11, 0x00, 0x00, 0x05, 0x2c, 0x2c, 0x00, 0x11,\ +/* 72 */ 0x00, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\ +/* 80 */ 0x15, 0x00, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,\ +/* 88 */ 0x2c, 0x2c, 0x2c, 0x2c, 0x00, 0x04, 0x02, 0x00,\ +/* 96 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\ +/* 104 */ 0x00, 0x01, 0x02, 0x08, 0x01, 0x11, 0x00, 0x02,\ +/* 112 */ 0x02, 0x15, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02,\ +/* 120 */ 0x00, 0x02, 0x01, 0x11, 0x00, 0x00, 0x05, 0x00,\ +/* 128 */ 0x11, 0x05, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,\ +/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,\ +/* 144 */ 0x04, 0x04,} + +/************** End of opcodes.h *********************************************/ +/************** Continuing where we left off in vdbe.h ***********************/ + +/* +** Prototypes for the VDBE interface. See comments on the implementation +** for a description of what each of these routines does. +*/ +SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3*); +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); +SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u8 P5); +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); +SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe*, int addr, int N); +SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,int,int,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); +SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe*,FILE*); +#endif +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); +SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int); +SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); +SQLITE_PRIVATE void sqlite3VdbeProgramDelete(sqlite3 *, SubProgram *, int); + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +SQLITE_PRIVATE int sqlite3VdbeReleaseMemory(int); +#endif +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,char*,int); +SQLITE_PRIVATE void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); + + +#ifndef NDEBUG +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...); +# define VdbeComment(X) sqlite3VdbeComment X +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); +# define VdbeNoopComment(X) sqlite3VdbeNoopComment X +#else +# define VdbeComment(X) +# define VdbeNoopComment(X) +#endif + +#endif + +/************** End of vdbe.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pager.h in the middle of sqliteInt.h *****************/ +/************** Begin file pager.h *******************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the sqlite page cache +** subsystem. The page cache subsystem reads and writes a file a page +** at a time and provides a journal for rollback. +** +** @(#) $Id: pager.h,v 1.104 2009/07/24 19:01:19 drh Exp $ +*/ + +#ifndef _PAGER_H_ +#define _PAGER_H_ + +/* +** Default maximum size for persistent journal files. A negative +** value means no limit. This value may be overridden using the +** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". +*/ +#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT + #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 +#endif + +/* +** The type used to represent a page number. The first page in a file +** is called page 1. 0 is used to represent "not a page". +*/ +typedef u32 Pgno; + +/* +** Each open file is managed by a separate instance of the "Pager" structure. +*/ +typedef struct Pager Pager; + +/* +** Handle type for pages. +*/ +typedef struct PgHdr DbPage; + +/* +** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is +** reserved for working around a windows/posix incompatibility). It is +** used in the journal to signify that the remainder of the journal file +** is devoted to storing a master journal name - there are no more pages to +** roll back. See comments for function writeMasterJournal() in pager.c +** for details. +*/ +#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) + +/* +** Allowed values for the flags parameter to sqlite3PagerOpen(). +** +** NOTE: These values must match the corresponding BTREE_ values in btree.h. +*/ +#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ +#define PAGER_NO_READLOCK 0x0002 /* Omit readlocks on readonly files */ + +/* +** Valid values for the second argument to sqlite3PagerLockingMode(). +*/ +#define PAGER_LOCKINGMODE_QUERY -1 +#define PAGER_LOCKINGMODE_NORMAL 0 +#define PAGER_LOCKINGMODE_EXCLUSIVE 1 + +/* +** Valid values for the second argument to sqlite3PagerJournalMode(). +*/ +#define PAGER_JOURNALMODE_QUERY -1 +#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ +#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ +#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ +#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ +#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ + +/* +** The remainder of this file contains the declarations of the functions +** that make up the Pager sub-system API. See source code comments for +** a detailed description of each routine. +*/ + +/* Open and close a Pager connection. */ +SQLITE_PRIVATE int sqlite3PagerOpen( + sqlite3_vfs*, + Pager **ppPager, + const char*, + int, + int, + int, + void(*)(DbPage*) +); +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); + +/* Functions used to configure a Pager object. */ +SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *); +SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u16*, int); +SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int); +SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerJournalMode(Pager *, int); +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); +SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); + +/* Functions used to obtain and release page references. */ +SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); +#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0) +SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); +SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); + +/* Operations on page references. */ +SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); +SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); +SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); + +/* Functions used to manage pager transactions and savepoints. */ +SQLITE_PRIVATE int sqlite3PagerPagecount(Pager*, int*); +SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); +SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); +SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); +SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); +SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); + +/* Functions used to query pager state and configuration. */ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*); +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*); +SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); +SQLITE_PRIVATE int sqlite3PagerNosync(Pager*); +SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); + +/* Functions used to truncate the database file. */ +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); + +/* Functions to support testing and debugging. */ +#if !defined(NDEBUG) || defined(SQLITE_TEST) +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); +#endif +#ifdef SQLITE_TEST +SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); +SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); + void disable_simulated_io_errors(void); + void enable_simulated_io_errors(void); +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +#endif /* _PAGER_H_ */ + +/************** End of pager.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pcache.h in the middle of sqliteInt.h ****************/ +/************** Begin file pcache.h ******************************************/ +/* +** 2008 August 05 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the sqlite page cache +** subsystem. +** +** @(#) $Id: pcache.h,v 1.20 2009/07/25 11:46:49 danielk1977 Exp $ +*/ + +#ifndef _PCACHE_H_ + +typedef struct PgHdr PgHdr; +typedef struct PCache PCache; + +/* +** Every page in the cache is controlled by an instance of the following +** structure. +*/ +struct PgHdr { + void *pData; /* Content of this page */ + void *pExtra; /* Extra content */ + PgHdr *pDirty; /* Transient list of dirty pages */ + Pgno pgno; /* Page number for this page */ + Pager *pPager; /* The pager this page is part of */ +#ifdef SQLITE_CHECK_PAGES + u32 pageHash; /* Hash of page content */ +#endif + u16 flags; /* PGHDR flags defined below */ + + /********************************************************************** + ** Elements above are public. All that follows is private to pcache.c + ** and should not be accessed by other modules. + */ + i16 nRef; /* Number of users of this page */ + PCache *pCache; /* Cache that owns this page */ + + PgHdr *pDirtyNext; /* Next element in list of dirty pages */ + PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ +}; + +/* Bit values for PgHdr.flags */ +#define PGHDR_DIRTY 0x002 /* Page has changed */ +#define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before + ** writing this page to the database */ +#define PGHDR_NEED_READ 0x008 /* Content is unread */ +#define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */ +#define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */ + +/* Initialize and shutdown the page cache subsystem */ +SQLITE_PRIVATE int sqlite3PcacheInitialize(void); +SQLITE_PRIVATE void sqlite3PcacheShutdown(void); + +/* Page cache buffer management: +** These routines implement SQLITE_CONFIG_PAGECACHE. +*/ +SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); + +/* Create a new pager cache. +** Under memory stress, invoke xStress to try to make pages clean. +** Only clean and unpinned pages can be reclaimed. +*/ +SQLITE_PRIVATE void sqlite3PcacheOpen( + int szPage, /* Size of every page */ + int szExtra, /* Extra space associated with each page */ + int bPurgeable, /* True if pages are on backing store */ + int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */ + void *pStress, /* Argument to xStress */ + PCache *pToInit /* Preallocated space for the PCache */ +); + +/* Modify the page-size after the cache has been created. */ +SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *, int); + +/* Return the size in bytes of a PCache object. Used to preallocate +** storage space. +*/ +SQLITE_PRIVATE int sqlite3PcacheSize(void); + +/* One release per successful fetch. Page is pinned until released. +** Reference counted. +*/ +SQLITE_PRIVATE int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**); +SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*); + +SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */ +SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ +SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ + +/* Change a page number. Used by incr-vacuum. */ +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); + +/* Remove all pages with pgno>x. Reset the cache if x==0 */ +SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x); + +/* Get a list of all dirty pages in the cache, sorted by page number */ +SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*); + +/* Reset and close the cache object */ +SQLITE_PRIVATE void sqlite3PcacheClose(PCache*); + +/* Clear flags from pages of the page cache */ +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *); + +/* Discard the contents of the cache */ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); + +/* Return the total number of outstanding page references */ +SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*); + +/* Increment the reference count of an existing page */ +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*); + +SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*); + +/* Return the total number of pages stored in the cache */ +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); + +#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) +/* Iterate through all dirty pages currently stored in the cache. This +** interface is only available if SQLITE_CHECK_PAGES is defined when the +** library is built. +*/ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); +#endif + +/* Set and get the suggested cache-size for the specified pager-cache. +** +** If no global maximum is configured, then the system attempts to limit +** the total number of pages cached by purgeable pager-caches to the sum +** of the suggested cache-sizes. +*/ +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); +#endif + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* Try to return memory used by the pcache module to the main memory heap */ +SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); +#endif + +SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); + +#endif /* _PCACHE_H_ */ + +/************** End of pcache.h **********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/************** Include os.h in the middle of sqliteInt.h ********************/ +/************** Begin file os.h **********************************************/ +/* +** 2001 September 16 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This header file (together with is companion C source-code file +** "os.c") attempt to abstract the underlying operating system so that +** the SQLite library will work on both POSIX and windows systems. +** +** This header file is #include-ed by sqliteInt.h and thus ends up +** being included by every source file. +** +** $Id: os.h,v 1.108 2009/02/05 16:31:46 drh Exp $ +*/ +#ifndef _SQLITE_OS_H_ +#define _SQLITE_OS_H_ + +/* +** Figure out if we are dealing with Unix, Windows, or some other +** operating system. After the following block of preprocess macros, +** all of SQLITE_OS_UNIX, SQLITE_OS_WIN, SQLITE_OS_OS2, and SQLITE_OS_OTHER +** will defined to either 1 or 0. One of the four will be 1. The other +** three will be 0. +*/ +#if defined(SQLITE_OS_OTHER) +# if SQLITE_OS_OTHER==1 +# undef SQLITE_OS_UNIX +# define SQLITE_OS_UNIX 0 +# undef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# undef SQLITE_OS_OS2 +# define SQLITE_OS_OS2 0 +# else +# undef SQLITE_OS_OTHER +# endif +#endif +#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) +# define SQLITE_OS_OTHER 0 +# ifndef SQLITE_OS_WIN +# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) +# define SQLITE_OS_WIN 1 +# define SQLITE_OS_UNIX 0 +# define SQLITE_OS_OS2 0 +# elif defined(__EMX__) || defined(_OS2) || defined(OS2) || defined(_OS2_) || defined(__OS2__) +# define SQLITE_OS_WIN 0 +# define SQLITE_OS_UNIX 0 +# define SQLITE_OS_OS2 1 +# else +# define SQLITE_OS_WIN 0 +# define SQLITE_OS_UNIX 1 +# define SQLITE_OS_OS2 0 +# endif +# else +# define SQLITE_OS_UNIX 0 +# define SQLITE_OS_OS2 0 +# endif +#else +# ifndef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# endif +#endif + +/* +** Determine if we are dealing with WindowsCE - which has a much +** reduced API. +*/ +#if defined(_WIN32_WCE) +# define SQLITE_OS_WINCE 1 +#else +# define SQLITE_OS_WINCE 0 +#endif + + +/* +** Define the maximum size of a temporary filename +*/ +#if SQLITE_OS_WIN +# include +# define SQLITE_TEMPNAME_SIZE (MAX_PATH+50) +#elif SQLITE_OS_OS2 +# if (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 3) && defined(OS2_HIGH_MEMORY) +# include /* has to be included before os2.h for linking to work */ +# endif +# define INCL_DOSDATETIME +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# define INCL_DOSMISC +# define INCL_DOSPROCESS +# define INCL_DOSMODULEMGR +# define INCL_DOSSEMAPHORES +# include +# include +# define SQLITE_TEMPNAME_SIZE (CCHMAXPATHCOMP) +#else +# define SQLITE_TEMPNAME_SIZE 200 +#endif + +/* If the SET_FULLSYNC macro is not defined above, then make it +** a no-op +*/ +#ifndef SET_FULLSYNC +# define SET_FULLSYNC(x,y) +#endif + +/* +** The default size of a disk sector +*/ +#ifndef SQLITE_DEFAULT_SECTOR_SIZE +# define SQLITE_DEFAULT_SECTOR_SIZE 512 +#endif + +/* +** Temporary files are named starting with this prefix followed by 16 random +** alphanumeric characters, and no file extension. They are stored in the +** OS's standard temporary file directory, and are deleted prior to exit. +** If sqlite is being embedded in another program, you may wish to change the +** prefix to reflect your program's name, so that if your program exits +** prematurely, old temporary files can be easily identified. This can be done +** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. +** +** 2006-10-31: The default prefix used to be "sqlite_". But then +** Mcafee started using SQLite in their anti-virus product and it +** started putting files with the "sqlite" name in the c:/temp folder. +** This annoyed many windows users. Those users would then do a +** Google search for "sqlite", find the telephone numbers of the +** developers and call to wake them up at night and complain. +** For this reason, the default name prefix is changed to be "sqlite" +** spelled backwards. So the temp files are still identified, but +** anybody smart enough to figure out the code is also likely smart +** enough to know that calling the developer will not help get rid +** of the file. +*/ +#ifndef SQLITE_TEMP_FILE_PREFIX +# define SQLITE_TEMP_FILE_PREFIX "etilqs_" +#endif + +/* +** The following values may be passed as the second argument to +** sqlite3OsLock(). The various locks exhibit the following semantics: +** +** SHARED: Any number of processes may hold a SHARED lock simultaneously. +** RESERVED: A single process may hold a RESERVED lock on a file at +** any time. Other processes may hold and obtain new SHARED locks. +** PENDING: A single process may hold a PENDING lock on a file at +** any one time. Existing SHARED locks may persist, but no new +** SHARED locks may be obtained by other processes. +** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. +** +** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a +** process that requests an EXCLUSIVE lock may actually obtain a PENDING +** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to +** sqlite3OsLock(). +*/ +#define NO_LOCK 0 +#define SHARED_LOCK 1 +#define RESERVED_LOCK 2 +#define PENDING_LOCK 3 +#define EXCLUSIVE_LOCK 4 + +/* +** File Locking Notes: (Mostly about windows but also some info for Unix) +** +** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because +** those functions are not available. So we use only LockFile() and +** UnlockFile(). +** +** LockFile() prevents not just writing but also reading by other processes. +** A SHARED_LOCK is obtained by locking a single randomly-chosen +** byte out of a specific range of bytes. The lock byte is obtained at +** random so two separate readers can probably access the file at the +** same time, unless they are unlucky and choose the same lock byte. +** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. +** There can only be one writer. A RESERVED_LOCK is obtained by locking +** a single byte of the file that is designated as the reserved lock byte. +** A PENDING_LOCK is obtained by locking a designated byte different from +** the RESERVED_LOCK byte. +** +** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, +** which means we can use reader/writer locks. When reader/writer locks +** are used, the lock is placed on the same range of bytes that is used +** for probabilistic locking in Win95/98/ME. Hence, the locking scheme +** will support two or more Win95 readers or two or more WinNT readers. +** But a single Win95 reader will lock out all WinNT readers and a single +** WinNT reader will lock out all other Win95 readers. +** +** The following #defines specify the range of bytes used for locking. +** SHARED_SIZE is the number of bytes available in the pool from which +** a random byte is selected for a shared lock. The pool of bytes for +** shared locks begins at SHARED_FIRST. +** +** The same locking strategy and +** byte ranges are used for Unix. This leaves open the possiblity of having +** clients on win95, winNT, and unix all talking to the same shared file +** and all locking correctly. To do so would require that samba (or whatever +** tool is being used for file sharing) implements locks correctly between +** windows and unix. I'm guessing that isn't likely to happen, but by +** using the same locking range we are at least open to the possibility. +** +** Locking in windows is manditory. For this reason, we cannot store +** actual data in the bytes used for locking. The pager never allocates +** the pages involved in locking therefore. SHARED_SIZE is selected so +** that all locks will fit on a single page even at the minimum page size. +** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE +** is set high so that we don't have to allocate an unused page except +** for very large databases. But one should test the page skipping logic +** by setting PENDING_BYTE low and running the entire regression suite. +** +** Changing the value of PENDING_BYTE results in a subtly incompatible +** file format. Depending on how it is changed, you might not notice +** the incompatibility right away, even running a full regression test. +** The default location of PENDING_BYTE is the first byte past the +** 1GB boundary. +** +*/ +#define PENDING_BYTE sqlite3PendingByte +#define RESERVED_BYTE (PENDING_BYTE+1) +#define SHARED_FIRST (PENDING_BYTE+2) +#define SHARED_SIZE 510 + +/* +** Wrapper around OS specific sqlite3_os_init() function. +*/ +SQLITE_PRIVATE int sqlite3OsInit(void); + +/* +** Functions for accessing sqlite3_file methods +*/ +SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file*); +SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); +SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); +SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); +#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 +SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); + +/* +** Functions for accessing sqlite3_vfs methods +*/ +SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); +SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); +SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); +SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void); +SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ +SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); +SQLITE_PRIVATE int sqlite3OsCurrentTime(sqlite3_vfs *, double*); + +/* +** Convenience functions for opening and closing files using +** sqlite3_malloc() to obtain space for the file-handle structure. +*/ +SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); +SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); + +#endif /* _SQLITE_OS_H_ */ + +/************** End of os.h **************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include mutex.h in the middle of sqliteInt.h *****************/ +/************** Begin file mutex.h *******************************************/ +/* +** 2007 August 28 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file contains the common header for all mutex implementations. +** The sqliteInt.h header #includes this file so that it is available +** to all source files. We break it out in an effort to keep the code +** better organized. +** +** NOTE: source files should *not* #include this header file directly. +** Source files should #include the sqliteInt.h file and let that file +** include this one indirectly. +** +** $Id: mutex.h,v 1.9 2008/10/07 15:25:48 drh Exp $ +*/ + + +/* +** Figure out what version of the code to use. The choices are +** +** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The +** mutexes implemention cannot be overridden +** at start-time. +** +** SQLITE_MUTEX_NOOP For single-threaded applications. No +** mutual exclusion is provided. But this +** implementation can be overridden at +** start-time. +** +** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. +** +** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. +** +** SQLITE_MUTEX_OS2 For multi-threaded applications on OS/2. +*/ +#if !SQLITE_THREADSAFE +# define SQLITE_MUTEX_OMIT +#endif +#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) +# if SQLITE_OS_UNIX +# define SQLITE_MUTEX_PTHREADS +# elif SQLITE_OS_WIN +# define SQLITE_MUTEX_W32 +# elif SQLITE_OS_OS2 +# define SQLITE_MUTEX_OS2 +# else +# define SQLITE_MUTEX_NOOP +# endif +#endif + +#ifdef SQLITE_MUTEX_OMIT +/* +** If this is a no-op implementation, implement everything as macros. +*/ +#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) +#define sqlite3_mutex_free(X) +#define sqlite3_mutex_enter(X) +#define sqlite3_mutex_try(X) SQLITE_OK +#define sqlite3_mutex_leave(X) +#define sqlite3_mutex_held(X) 1 +#define sqlite3_mutex_notheld(X) 1 +#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) +#define sqlite3MutexInit() SQLITE_OK +#define sqlite3MutexEnd() +#endif /* defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + + +/* +** Each database file to be accessed by the system is an instance +** of the following structure. There are normally two of these structures +** in the sqlite.aDb[] array. aDb[0] is the main database file and +** aDb[1] is the database file used to hold temporary tables. Additional +** databases may be attached. +*/ +struct Db { + char *zName; /* Name of this database */ + Btree *pBt; /* The B*Tree structure for this database file */ + u8 inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */ + u8 safety_level; /* How aggressive at syncing data to disk */ + Schema *pSchema; /* Pointer to database schema (possibly shared) */ +}; + +/* +** An instance of the following structure stores a database schema. +** +** If there are no virtual tables configured in this schema, the +** Schema.db variable is set to NULL. After the first virtual table +** has been added, it is set to point to the database connection +** used to create the connection. Once a virtual table has been +** added to the Schema structure and the Schema.db variable populated, +** only that database connection may use the Schema to prepare +** statements. +*/ +struct Schema { + int schema_cookie; /* Database schema version number for this file */ + Hash tblHash; /* All tables indexed by name */ + Hash idxHash; /* All (named) indices indexed by name */ + Hash trigHash; /* All triggers indexed by name */ + Hash fkeyHash; /* All foreign keys by referenced table name */ + Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ + u8 file_format; /* Schema format version for this file */ + u8 enc; /* Text encoding used by this database */ + u16 flags; /* Flags associated with this schema */ + int cache_size; /* Number of pages to use in the cache */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3 *db; /* "Owner" connection. See comment above */ +#endif +}; + +/* +** These macros can be used to test, set, or clear bits in the +** Db.flags field. +*/ +#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))==(P)) +#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))!=0) +#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->flags|=(P) +#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->flags&=~(P) + +/* +** Allowed values for the DB.flags field. +** +** The DB_SchemaLoaded flag is set after the database schema has been +** read into internal hash tables. +** +** DB_UnresetViews means that one or more views have column names that +** have been filled out. If the schema changes, these column names might +** changes and so the view will need to be reset. +*/ +#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ +#define DB_UnresetViews 0x0002 /* Some views have defined column names */ +#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ + +/* +** The number of different kinds of things that can be limited +** using the sqlite3_limit() interface. +*/ +#define SQLITE_N_LIMIT (SQLITE_LIMIT_TRIGGER_DEPTH+1) + +/* +** Lookaside malloc is a set of fixed-size buffers that can be used +** to satisfy small transient memory allocation requests for objects +** associated with a particular database connection. The use of +** lookaside malloc provides a significant performance enhancement +** (approx 10%) by avoiding numerous malloc/free requests while parsing +** SQL statements. +** +** The Lookaside structure holds configuration information about the +** lookaside malloc subsystem. Each available memory allocation in +** the lookaside subsystem is stored on a linked list of LookasideSlot +** objects. +** +** Lookaside allocations are only allowed for objects that are associated +** with a particular database connection. Hence, schema information cannot +** be stored in lookaside because in shared cache mode the schema information +** is shared by multiple database connections. Therefore, while parsing +** schema information, the Lookaside.bEnabled flag is cleared so that +** lookaside allocations are not used to construct the schema objects. +*/ +struct Lookaside { + u16 sz; /* Size of each buffer in bytes */ + u8 bEnabled; /* False to disable new lookaside allocations */ + u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ + int nOut; /* Number of buffers currently checked out */ + int mxOut; /* Highwater mark for nOut */ + LookasideSlot *pFree; /* List of available buffers */ + void *pStart; /* First byte of available memory space */ + void *pEnd; /* First byte past end of available space */ +}; +struct LookasideSlot { + LookasideSlot *pNext; /* Next buffer in the list of free buffers */ +}; + +/* +** A hash table for function definitions. +** +** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. +** Collisions are on the FuncDef.pHash chain. +*/ +struct FuncDefHash { + FuncDef *a[23]; /* Hash table for functions */ +}; + +/* +** Each database is an instance of the following structure. +** +** The sqlite.lastRowid records the last insert rowid generated by an +** insert statement. Inserts on views do not affect its value. Each +** trigger has its own context, so that lastRowid can be updated inside +** triggers as usual. The previous value will be restored once the trigger +** exits. Upon entering a before or instead of trigger, lastRowid is no +** longer (since after version 2.8.12) reset to -1. +** +** The sqlite.nChange does not count changes within triggers and keeps no +** context. It is reset at start of sqlite3_exec. +** The sqlite.lsChange represents the number of changes made by the last +** insert, update, or delete statement. It remains constant throughout the +** length of a statement and is then updated by OP_SetCounts. It keeps a +** context stack just like lastRowid so that the count of changes +** within a trigger is not seen outside the trigger. Changes to views do not +** affect the value of lsChange. +** The sqlite.csChange keeps track of the number of current changes (since +** the last statement) and is used to update sqlite_lsChange. +** +** The member variables sqlite.errCode, sqlite.zErrMsg and sqlite.zErrMsg16 +** store the most recent error code and, if applicable, string. The +** internal function sqlite3Error() is used to set these variables +** consistently. +*/ +struct sqlite3 { + sqlite3_vfs *pVfs; /* OS Interface */ + int nDb; /* Number of backends currently in use */ + Db *aDb; /* All backends */ + int flags; /* Miscellaneous flags. See below */ + int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ + int errCode; /* Most recent error code (SQLITE_*) */ + int errMask; /* & result codes with this before returning */ + u8 autoCommit; /* The auto-commit flag. */ + u8 temp_store; /* 1: file 2: memory 0: default */ + u8 mallocFailed; /* True if we have seen a malloc failure */ + u8 dfltLockMode; /* Default locking-mode for attached dbs */ + u8 dfltJournalMode; /* Default journal mode for attached dbs */ + signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ + int nextPagesize; /* Pagesize after VACUUM if >0 */ + int nTable; /* Number of tables in the database */ + CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ + i64 lastRowid; /* ROWID of most recent insert (see above) */ + u32 magic; /* Magic number for detect library misuse */ + int nChange; /* Value returned by sqlite3_changes() */ + int nTotalChange; /* Value returned by sqlite3_total_changes() */ + sqlite3_mutex *mutex; /* Connection mutex */ + int aLimit[SQLITE_N_LIMIT]; /* Limits */ + struct sqlite3InitInfo { /* Information used during initialization */ + int iDb; /* When back is being initialized */ + int newTnum; /* Rootpage of table being initialized */ + u8 busy; /* TRUE if currently initializing */ + u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */ + } init; + int nExtension; /* Number of loaded extensions */ + void **aExtension; /* Array of shared library handles */ + struct Vdbe *pVdbe; /* List of active virtual machines */ + int activeVdbeCnt; /* Number of VDBEs currently executing */ + int writeVdbeCnt; /* Number of active VDBEs that are writing */ + void (*xTrace)(void*,const char*); /* Trace function */ + void *pTraceArg; /* Argument to the trace function */ + void (*xProfile)(void*,const char*,u64); /* Profiling function */ + void *pProfileArg; /* Argument to profile function */ + void *pCommitArg; /* Argument to xCommitCallback() */ + int (*xCommitCallback)(void*); /* Invoked at every commit. */ + void *pRollbackArg; /* Argument to xRollbackCallback() */ + void (*xRollbackCallback)(void*); /* Invoked at every commit. */ + void *pUpdateArg; + void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); + void *pCollNeededArg; + sqlite3_value *pErr; /* Most recent error message */ + char *zErrMsg; /* Most recent error message (UTF-8 encoded) */ + char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */ + union { + volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ + double notUsed1; /* Spacer */ + } u1; + Lookaside lookaside; /* Lookaside malloc configuration */ +#ifndef SQLITE_OMIT_AUTHORIZATION + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); + /* Access authorization function */ + void *pAuthArg; /* 1st argument to the access auth function */ +#endif +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + int (*xProgress)(void *); /* The progress callback */ + void *pProgressArg; /* Argument to the progress callback */ + int nProgressOps; /* Number of opcodes for progress callback */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + Hash aModule; /* populated by sqlite3_create_module() */ + Table *pVTab; /* vtab with active Connect/Create method */ + VTable **aVTrans; /* Virtual tables with open transactions */ + int nVTrans; /* Allocated size of aVTrans */ + VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ +#endif + FuncDefHash aFunc; /* Hash table of connection functions */ + Hash aCollSeq; /* All collating sequences */ + BusyHandler busyHandler; /* Busy callback */ + int busyTimeout; /* Busy handler timeout, in msec */ + Db aDbStatic[2]; /* Static space for the 2 default backends */ + Savepoint *pSavepoint; /* List of active savepoints */ + int nSavepoint; /* Number of non-transaction savepoints */ + int nStatement; /* Number of nested statement-transactions */ + u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ + i64 nDeferredCons; /* Net deferred constraints this transaction. */ + +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + /* The following variables are all protected by the STATIC_MASTER + ** mutex, not by sqlite3.mutex. They are used by code in notify.c. + ** + ** When X.pUnlockConnection==Y, that means that X is waiting for Y to + ** unlock so that it can proceed. + ** + ** When X.pBlockingConnection==Y, that means that something that X tried + ** tried to do recently failed with an SQLITE_LOCKED error due to locks + ** held by Y. + */ + sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ + sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ + void *pUnlockArg; /* Argument to xUnlockNotify */ + void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ + sqlite3 *pNextBlocked; /* Next in list of all blocked connections */ +#endif +}; + +/* +** A macro to discover the encoding of a database. +*/ +#define ENC(db) ((db)->aDb[0].pSchema->enc) + +/* +** Possible values for the sqlite.flags and or Db.flags fields. +** +** On sqlite.flags, the SQLITE_InTrans value means that we have +** executed a BEGIN. On Db.flags, SQLITE_InTrans means a statement +** transaction is active on that particular database file. +*/ +#define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ +#define SQLITE_InTrans 0x00000008 /* True if in a transaction */ +#define SQLITE_InternChanges 0x00000010 /* Uncommitted Hash table changes */ +#define SQLITE_FullColNames 0x00000020 /* Show full column names on SELECT */ +#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ +#define SQLITE_CountRows 0x00000080 /* Count rows changed by INSERT, */ + /* DELETE, or UPDATE and return */ + /* the count using a callback. */ +#define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ + /* result set is empty */ +#define SQLITE_SqlTrace 0x00000200 /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing 0x00000400 /* Debug listings of VDBE programs */ +#define SQLITE_WriteSchema 0x00000800 /* OK to update SQLITE_MASTER */ +#define SQLITE_NoReadlock 0x00001000 /* Readlocks are omitted when + ** accessing read-only databases */ +#define SQLITE_IgnoreChecks 0x00002000 /* Do not enforce check constraints */ +#define SQLITE_ReadUncommitted 0x00004000 /* For shared-cache mode */ +#define SQLITE_LegacyFileFmt 0x00008000 /* Create new databases in format 1 */ +#define SQLITE_FullFSync 0x00010000 /* Use full fsync on the backend */ +#define SQLITE_LoadExtension 0x00020000 /* Enable load_extension */ + +#define SQLITE_RecoveryMode 0x00040000 /* Ignore schema errors */ +#define SQLITE_ReverseOrder 0x00100000 /* Reverse unordered SELECTs */ +#define SQLITE_RecTriggers 0x00200000 /* Enable recursive triggers */ +#define SQLITE_ForeignKeys 0x00400000 /* Enforce foreign key constraints */ + +/* +** Possible values for the sqlite.magic field. +** The numbers are obtained at random and have no special meaning, other +** than being distinct from one another. +*/ +#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ +#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ +#define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */ +#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ +#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ + +/* +** Each SQL function is defined by an instance of the following +** structure. A pointer to this structure is stored in the sqlite.aFunc +** hash table. When multiple functions have the same name, the hash table +** points to a linked list of these structures. +*/ +struct FuncDef { + i16 nArg; /* Number of arguments. -1 means unlimited */ + u8 iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */ + u8 flags; /* Some combination of SQLITE_FUNC_* */ + void *pUserData; /* User data parameter */ + FuncDef *pNext; /* Next function with same name */ + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ + void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ + void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */ + char *zName; /* SQL name of the function. */ + FuncDef *pHash; /* Next with a different name but the same hash */ +}; + +/* +** Possible values for FuncDef.flags +*/ +#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */ +#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */ +#define SQLITE_FUNC_EPHEM 0x04 /* Ephemeral. Delete with VDBE */ +#define SQLITE_FUNC_NEEDCOLL 0x08 /* sqlite3GetFuncCollSeq() might be called */ +#define SQLITE_FUNC_PRIVATE 0x10 /* Allowed for internal use only */ +#define SQLITE_FUNC_COUNT 0x20 /* Built-in count(*) aggregate */ + +/* +** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are +** used to create the initializers for the FuncDef structures. +** +** FUNCTION(zName, nArg, iArg, bNC, xFunc) +** Used to create a scalar function definition of a function zName +** implemented by C function xFunc that accepts nArg arguments. The +** value passed as iArg is cast to a (void*) and made available +** as the user-data (sqlite3_user_data()) for the function. If +** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. +** +** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) +** Used to create an aggregate function definition implemented by +** the C functions xStep and xFinal. The first four parameters +** are interpreted in the same way as the first 4 parameters to +** FUNCTION(). +** +** LIKEFUNC(zName, nArg, pArg, flags) +** Used to create a scalar function definition of a function zName +** that accepts nArg arguments and is implemented by a call to C +** function likeFunc. Argument pArg is cast to a (void *) and made +** available as the function user-data (sqlite3_user_data()). The +** FuncDef.flags variable is set to the value passed as the flags +** parameter. +*/ +#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0} +#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ + pArg, 0, xFunc, 0, 0, #zName, 0} +#define LIKEFUNC(zName, nArg, arg, flags) \ + {nArg, SQLITE_UTF8, flags, (void *)arg, 0, likeFunc, 0, 0, #zName, 0} +#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ + {nArg, SQLITE_UTF8, nc*SQLITE_FUNC_NEEDCOLL, \ + SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0} + +/* +** All current savepoints are stored in a linked list starting at +** sqlite3.pSavepoint. The first element in the list is the most recently +** opened savepoint. Savepoints are added to the list by the vdbe +** OP_Savepoint instruction. +*/ +struct Savepoint { + char *zName; /* Savepoint name (nul-terminated) */ + i64 nDeferredCons; /* Number of deferred fk violations */ + Savepoint *pNext; /* Parent savepoint (if any) */ +}; + +/* +** The following are used as the second parameter to sqlite3Savepoint(), +** and as the P1 argument to the OP_Savepoint instruction. +*/ +#define SAVEPOINT_BEGIN 0 +#define SAVEPOINT_RELEASE 1 +#define SAVEPOINT_ROLLBACK 2 + + +/* +** Each SQLite module (virtual table definition) is defined by an +** instance of the following structure, stored in the sqlite3.aModule +** hash table. +*/ +struct Module { + const sqlite3_module *pModule; /* Callback pointers */ + const char *zName; /* Name passed to create_module() */ + void *pAux; /* pAux passed to create_module() */ + void (*xDestroy)(void *); /* Module destructor function */ +}; + +/* +** information about each column of an SQL table is held in an instance +** of this structure. +*/ +struct Column { + char *zName; /* Name of this column */ + Expr *pDflt; /* Default value of this column */ + char *zDflt; /* Original text of the default value */ + char *zType; /* Data type for this column */ + char *zColl; /* Collating sequence. If NULL, use the default */ + u8 notNull; /* True if there is a NOT NULL constraint */ + u8 isPrimKey; /* True if this column is part of the PRIMARY KEY */ + char affinity; /* One of the SQLITE_AFF_... values */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + u8 isHidden; /* True if this column is 'hidden' */ +#endif +}; + +/* +** A "Collating Sequence" is defined by an instance of the following +** structure. Conceptually, a collating sequence consists of a name and +** a comparison routine that defines the order of that sequence. +** +** There may two separate implementations of the collation function, one +** that processes text in UTF-8 encoding (CollSeq.xCmp) and another that +** processes text encoded in UTF-16 (CollSeq.xCmp16), using the machine +** native byte order. When a collation sequence is invoked, SQLite selects +** the version that will require the least expensive encoding +** translations, if any. +** +** The CollSeq.pUser member variable is an extra parameter that passed in +** as the first argument to the UTF-8 comparison function, xCmp. +** CollSeq.pUser16 is the equivalent for the UTF-16 comparison function, +** xCmp16. +** +** If both CollSeq.xCmp and CollSeq.xCmp16 are NULL, it means that the +** collating sequence is undefined. Indices built on an undefined +** collating sequence may not be read or written. +*/ +struct CollSeq { + char *zName; /* Name of the collating sequence, UTF-8 encoded */ + u8 enc; /* Text encoding handled by xCmp() */ + u8 type; /* One of the SQLITE_COLL_... values below */ + void *pUser; /* First argument to xCmp() */ + int (*xCmp)(void*,int, const void*, int, const void*); + void (*xDel)(void*); /* Destructor for pUser */ +}; + +/* +** Allowed values of CollSeq.type: +*/ +#define SQLITE_COLL_BINARY 1 /* The default memcmp() collating sequence */ +#define SQLITE_COLL_NOCASE 2 /* The built-in NOCASE collating sequence */ +#define SQLITE_COLL_REVERSE 3 /* The built-in REVERSE collating sequence */ +#define SQLITE_COLL_USER 0 /* Any other user-defined collating sequence */ + +/* +** A sort order can be either ASC or DESC. +*/ +#define SQLITE_SO_ASC 0 /* Sort in ascending order */ +#define SQLITE_SO_DESC 1 /* Sort in ascending order */ + +/* +** Column affinity types. +** +** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and +** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve +** the speed a little by numbering the values consecutively. +** +** But rather than start with 0 or 1, we begin with 'a'. That way, +** when multiple affinity types are concatenated into a string and +** used as the P4 operand, they will be more readable. +** +** Note also that the numeric types are grouped together so that testing +** for a numeric type is a single comparison. +*/ +#define SQLITE_AFF_TEXT 'a' +#define SQLITE_AFF_NONE 'b' +#define SQLITE_AFF_NUMERIC 'c' +#define SQLITE_AFF_INTEGER 'd' +#define SQLITE_AFF_REAL 'e' + +#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) + +/* +** The SQLITE_AFF_MASK values masks off the significant bits of an +** affinity value. +*/ +#define SQLITE_AFF_MASK 0x67 + +/* +** Additional bit values that can be ORed with an affinity without +** changing the affinity. +*/ +#define SQLITE_JUMPIFNULL 0x08 /* jumps if either operand is NULL */ +#define SQLITE_STOREP2 0x10 /* Store result in reg[P2] rather than jump */ +#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ + +/* +** An object of this type is created for each virtual table present in +** the database schema. +** +** If the database schema is shared, then there is one instance of this +** structure for each database connection (sqlite3*) that uses the shared +** schema. This is because each database connection requires its own unique +** instance of the sqlite3_vtab* handle used to access the virtual table +** implementation. sqlite3_vtab* handles can not be shared between +** database connections, even when the rest of the in-memory database +** schema is shared, as the implementation often stores the database +** connection handle passed to it via the xConnect() or xCreate() method +** during initialization internally. This database connection handle may +** then used by the virtual table implementation to access real tables +** within the database. So that they appear as part of the callers +** transaction, these accesses need to be made via the same database +** connection as that used to execute SQL operations on the virtual table. +** +** All VTable objects that correspond to a single table in a shared +** database schema are initially stored in a linked-list pointed to by +** the Table.pVTable member variable of the corresponding Table object. +** When an sqlite3_prepare() operation is required to access the virtual +** table, it searches the list for the VTable that corresponds to the +** database connection doing the preparing so as to use the correct +** sqlite3_vtab* handle in the compiled query. +** +** When an in-memory Table object is deleted (for example when the +** schema is being reloaded for some reason), the VTable objects are not +** deleted and the sqlite3_vtab* handles are not xDisconnect()ed +** immediately. Instead, they are moved from the Table.pVTable list to +** another linked list headed by the sqlite3.pDisconnect member of the +** corresponding sqlite3 structure. They are then deleted/xDisconnected +** next time a statement is prepared using said sqlite3*. This is done +** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. +** Refer to comments above function sqlite3VtabUnlockList() for an +** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect +** list without holding the corresponding sqlite3.mutex mutex. +** +** The memory for objects of this type is always allocated by +** sqlite3DbMalloc(), using the connection handle stored in VTable.db as +** the first argument. +*/ +struct VTable { + sqlite3 *db; /* Database connection associated with this table */ + Module *pMod; /* Pointer to module implementation */ + sqlite3_vtab *pVtab; /* Pointer to vtab instance */ + int nRef; /* Number of pointers to this structure */ + VTable *pNext; /* Next in linked list (see above) */ +}; + +/* +** Each SQL table is represented in memory by an instance of the +** following structure. +** +** Table.zName is the name of the table. The case of the original +** CREATE TABLE statement is stored, but case is not significant for +** comparisons. +** +** Table.nCol is the number of columns in this table. Table.aCol is a +** pointer to an array of Column structures, one for each column. +** +** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of +** the column that is that key. Otherwise Table.iPKey is negative. Note +** that the datatype of the PRIMARY KEY must be INTEGER for this field to +** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of +** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid +** is generated for each row of the table. TF_HasPrimaryKey is set if +** the table has any PRIMARY KEY, INTEGER or otherwise. +** +** Table.tnum is the page number for the root BTree page of the table in the +** database file. If Table.iDb is the index of the database table backend +** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that +** holds temporary tables and indices. If TF_Ephemeral is set +** then the table is stored in a file that is automatically deleted +** when the VDBE cursor to the table is closed. In this case Table.tnum +** refers VDBE cursor number that holds the table open, not to the root +** page number. Transient tables are used to hold the results of a +** sub-query that appears instead of a real table name in the FROM clause +** of a SELECT statement. +*/ +struct Table { + sqlite3 *dbMem; /* DB connection used for lookaside allocations. */ + char *zName; /* Name of the table or view */ + int iPKey; /* If not negative, use aCol[iPKey] as the primary key */ + int nCol; /* Number of columns in this table */ + Column *aCol; /* Information about each column */ + Index *pIndex; /* List of SQL indexes on this table. */ + int tnum; /* Root BTree node for this table (see note above) */ + Select *pSelect; /* NULL for tables. Points to definition if a view. */ + u16 nRef; /* Number of pointers to this Table */ + u8 tabFlags; /* Mask of TF_* values */ + u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ + FKey *pFKey; /* Linked list of all foreign keys in this table */ + char *zColAff; /* String defining the affinity of each column */ +#ifndef SQLITE_OMIT_CHECK + Expr *pCheck; /* The AND of all CHECK constraints */ +#endif +#ifndef SQLITE_OMIT_ALTERTABLE + int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + VTable *pVTable; /* List of VTable objects. */ + int nModuleArg; /* Number of arguments to the module */ + char **azModuleArg; /* Text of all module args. [0] is module name */ +#endif + Trigger *pTrigger; /* List of triggers stored in pSchema */ + Schema *pSchema; /* Schema that contains this table */ + Table *pNextZombie; /* Next on the Parse.pZombieTab list */ +}; + +/* +** Allowed values for Tabe.tabFlags. +*/ +#define TF_Readonly 0x01 /* Read-only system table */ +#define TF_Ephemeral 0x02 /* An ephemeral table */ +#define TF_HasPrimaryKey 0x04 /* Table has a primary key */ +#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */ +#define TF_Virtual 0x10 /* Is a virtual table */ +#define TF_NeedMetadata 0x20 /* aCol[].zType and aCol[].pColl missing */ + + + +/* +** Test to see whether or not a table is a virtual table. This is +** done as a macro so that it will be optimized out when virtual +** table support is omitted from the build. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0) +# define IsHiddenColumn(X) ((X)->isHidden) +#else +# define IsVirtual(X) 0 +# define IsHiddenColumn(X) 0 +#endif + +/* +** Each foreign key constraint is an instance of the following structure. +** +** A foreign key is associated with two tables. The "from" table is +** the table that contains the REFERENCES clause that creates the foreign +** key. The "to" table is the table that is named in the REFERENCES clause. +** Consider this example: +** +** CREATE TABLE ex1( +** a INTEGER PRIMARY KEY, +** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) +** ); +** +** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". +** +** Each REFERENCES clause generates an instance of the following structure +** which is attached to the from-table. The to-table need not exist when +** the from-table is created. The existence of the to-table is not checked. +*/ +struct FKey { + Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */ + FKey *pNextFrom; /* Next foreign key in pFrom */ + char *zTo; /* Name of table that the key points to (aka: Parent) */ + FKey *pNextTo; /* Next foreign key on table named zTo */ + FKey *pPrevTo; /* Previous foreign key on table named zTo */ + int nCol; /* Number of columns in this key */ + /* EV: R-30323-21917 */ + u8 isDeferred; /* True if constraint checking is deferred till COMMIT */ + u8 aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */ + Trigger *apTrigger[2]; /* Triggers for aAction[] actions */ + struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ + int iFrom; /* Index of column in pFrom */ + char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */ + } aCol[1]; /* One entry for each of nCol column s */ +}; + +/* +** SQLite supports many different ways to resolve a constraint +** error. ROLLBACK processing means that a constraint violation +** causes the operation in process to fail and for the current transaction +** to be rolled back. ABORT processing means the operation in process +** fails and any prior changes from that one operation are backed out, +** but the transaction is not rolled back. FAIL processing means that +** the operation in progress stops and returns an error code. But prior +** changes due to the same operation are not backed out and no rollback +** occurs. IGNORE means that the particular row that caused the constraint +** error is not inserted or updated. Processing continues and no error +** is returned. REPLACE means that preexisting database rows that caused +** a UNIQUE constraint violation are removed so that the new insert or +** update can proceed. Processing continues and no error is reported. +** +** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. +** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the +** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign +** key is set to NULL. CASCADE means that a DELETE or UPDATE of the +** referenced table row is propagated into the row that holds the +** foreign key. +** +** The following symbolic values are used to record which type +** of action to take. +*/ +#define OE_None 0 /* There is no constraint to check */ +#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ +#define OE_Abort 2 /* Back out changes but do no rollback transaction */ +#define OE_Fail 3 /* Stop the operation but leave all prior changes */ +#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ +#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ + +#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ +#define OE_SetNull 7 /* Set the foreign key value to NULL */ +#define OE_SetDflt 8 /* Set the foreign key value to its default */ +#define OE_Cascade 9 /* Cascade the changes */ + +#define OE_Default 99 /* Do whatever the default action is */ + + +/* +** An instance of the following structure is passed as the first +** argument to sqlite3VdbeKeyCompare and is used to control the +** comparison of the two index keys. +*/ +struct KeyInfo { + sqlite3 *db; /* The database connection */ + u8 enc; /* Text encoding - one of the TEXT_Utf* values */ + u16 nField; /* Number of entries in aColl[] */ + u8 *aSortOrder; /* If defined an aSortOrder[i] is true, sort DESC */ + CollSeq *aColl[1]; /* Collating sequence for each term of the key */ +}; + +/* +** An instance of the following structure holds information about a +** single index record that has already been parsed out into individual +** values. +** +** A record is an object that contains one or more fields of data. +** Records are used to store the content of a table row and to store +** the key of an index. A blob encoding of a record is created by +** the OP_MakeRecord opcode of the VDBE and is disassembled by the +** OP_Column opcode. +** +** This structure holds a record that has already been disassembled +** into its constituent fields. +*/ +struct UnpackedRecord { + KeyInfo *pKeyInfo; /* Collation and sort-order information */ + u16 nField; /* Number of entries in apMem[] */ + u16 flags; /* Boolean settings. UNPACKED_... below */ + i64 rowid; /* Used by UNPACKED_PREFIX_SEARCH */ + Mem *aMem; /* Values */ +}; + +/* +** Allowed values of UnpackedRecord.flags +*/ +#define UNPACKED_NEED_FREE 0x0001 /* Memory is from sqlite3Malloc() */ +#define UNPACKED_NEED_DESTROY 0x0002 /* apMem[]s should all be destroyed */ +#define UNPACKED_IGNORE_ROWID 0x0004 /* Ignore trailing rowid on key1 */ +#define UNPACKED_INCRKEY 0x0008 /* Make this key an epsilon larger */ +#define UNPACKED_PREFIX_MATCH 0x0010 /* A prefix match is considered OK */ +#define UNPACKED_PREFIX_SEARCH 0x0020 /* A prefix match is considered OK */ + +/* +** Each SQL index is represented in memory by an +** instance of the following structure. +** +** The columns of the table that are to be indexed are described +** by the aiColumn[] field of this structure. For example, suppose +** we have the following table and index: +** +** CREATE TABLE Ex1(c1 int, c2 int, c3 text); +** CREATE INDEX Ex2 ON Ex1(c3,c1); +** +** In the Table structure describing Ex1, nCol==3 because there are +** three columns in the table. In the Index structure describing +** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. +** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the +** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. +** The second column to be indexed (c1) has an index of 0 in +** Ex1.aCol[], hence Ex2.aiColumn[1]==0. +** +** The Index.onError field determines whether or not the indexed columns +** must be unique and what to do if they are not. When Index.onError=OE_None, +** it means this is not a unique index. Otherwise it is a unique index +** and the value of Index.onError indicate the which conflict resolution +** algorithm to employ whenever an attempt is made to insert a non-unique +** element. +*/ +struct Index { + char *zName; /* Name of this index */ + int nColumn; /* Number of columns in the table used by this index */ + int *aiColumn; /* Which columns are used by this index. 1st is 0 */ + unsigned *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */ + Table *pTable; /* The SQL table being indexed */ + int tnum; /* Page containing root of this index in database file */ + u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + u8 autoIndex; /* True if is automatically created (ex: by UNIQUE) */ + char *zColAff; /* String defining the affinity of each column */ + Index *pNext; /* The next index associated with the same table */ + Schema *pSchema; /* Schema containing this index */ + u8 *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */ + char **azColl; /* Array of collation sequence names for index */ + IndexSample *aSample; /* Array of SQLITE_INDEX_SAMPLES samples */ +}; + +/* +** Each sample stored in the sqlite_stat2 table is represented in memory +** using a structure of this type. +*/ +struct IndexSample { + union { + char *z; /* Value if eType is SQLITE_TEXT or SQLITE_BLOB */ + double r; /* Value if eType is SQLITE_FLOAT or SQLITE_INTEGER */ + } u; + u8 eType; /* SQLITE_NULL, SQLITE_INTEGER ... etc. */ + u8 nByte; /* Size in byte of text or blob. */ +}; + +/* +** Each token coming out of the lexer is an instance of +** this structure. Tokens are also used as part of an expression. +** +** Note if Token.z==0 then Token.dyn and Token.n are undefined and +** may contain random values. Do not make any assumptions about Token.dyn +** and Token.n when Token.z==0. +*/ +struct Token { + const char *z; /* Text of the token. Not NULL-terminated! */ + unsigned int n; /* Number of characters in this token */ +}; + +/* +** An instance of this structure contains information needed to generate +** code for a SELECT that contains aggregate functions. +** +** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a +** pointer to this structure. The Expr.iColumn field is the index in +** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate +** code for that node. +** +** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the +** original Select structure that describes the SELECT statement. These +** fields do not need to be freed when deallocating the AggInfo structure. +*/ +struct AggInfo { + u8 directMode; /* Direct rendering mode means take data directly + ** from source tables rather than from accumulators */ + u8 useSortingIdx; /* In direct mode, reference the sorting index rather + ** than the source table */ + int sortingIdx; /* Cursor number of the sorting index */ + ExprList *pGroupBy; /* The group by clause */ + int nSortingColumn; /* Number of columns in the sorting index */ + struct AggInfo_col { /* For each column used in source tables */ + Table *pTab; /* Source table */ + int iTable; /* Cursor number of the source table */ + int iColumn; /* Column number within the source table */ + int iSorterColumn; /* Column number in the sorting index */ + int iMem; /* Memory location that acts as accumulator */ + Expr *pExpr; /* The original expression */ + } *aCol; + int nColumn; /* Number of used entries in aCol[] */ + int nColumnAlloc; /* Number of slots allocated for aCol[] */ + int nAccumulator; /* Number of columns that show through to the output. + ** Additional columns are used only as parameters to + ** aggregate functions */ + struct AggInfo_func { /* For each aggregate function */ + Expr *pExpr; /* Expression encoding the function */ + FuncDef *pFunc; /* The aggregate function implementation */ + int iMem; /* Memory location that acts as accumulator */ + int iDistinct; /* Ephemeral table used to enforce DISTINCT */ + } *aFunc; + int nFunc; /* Number of entries in aFunc[] */ + int nFuncAlloc; /* Number of slots allocated for aFunc[] */ +}; + +/* +** Each node of an expression in the parse tree is an instance +** of this structure. +** +** Expr.op is the opcode. The integer parser token codes are reused +** as opcodes here. For example, the parser defines TK_GE to be an integer +** code representing the ">=" operator. This same integer code is reused +** to represent the greater-than-or-equal-to operator in the expression +** tree. +** +** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, +** or TK_STRING), then Expr.token contains the text of the SQL literal. If +** the expression is a variable (TK_VARIABLE), then Expr.token contains the +** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), +** then Expr.token contains the name of the function. +** +** Expr.pRight and Expr.pLeft are the left and right subexpressions of a +** binary operator. Either or both may be NULL. +** +** Expr.x.pList is a list of arguments if the expression is an SQL function, +** a CASE expression or an IN expression of the form " IN (, ...)". +** Expr.x.pSelect is used if the expression is a sub-select or an expression of +** the form " IN (SELECT ...)". If the EP_xIsSelect bit is set in the +** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is +** valid. +** +** An expression of the form ID or ID.ID refers to a column in a table. +** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is +** the integer cursor number of a VDBE cursor pointing to that table and +** Expr.iColumn is the column number for the specific column. If the +** expression is used as a result in an aggregate SELECT, then the +** value is also stored in the Expr.iAgg column in the aggregate so that +** it can be accessed after all aggregates are computed. +** +** If the expression is an unbound variable marker (a question mark +** character '?' in the original SQL) then the Expr.iTable holds the index +** number for that variable. +** +** If the expression is a subquery then Expr.iColumn holds an integer +** register number containing the result of the subquery. If the +** subquery gives a constant result, then iTable is -1. If the subquery +** gives a different answer at different times during statement processing +** then iTable is the address of a subroutine that computes the subquery. +** +** If the Expr is of type OP_Column, and the table it is selecting from +** is a disk table or the "old.*" pseudo-table, then pTab points to the +** corresponding table definition. +** +** ALLOCATION NOTES: +** +** Expr objects can use a lot of memory space in database schema. To +** help reduce memory requirements, sometimes an Expr object will be +** truncated. And to reduce the number of memory allocations, sometimes +** two or more Expr objects will be stored in a single memory allocation, +** together with Expr.zToken strings. +** +** If the EP_Reduced and EP_TokenOnly flags are set when +** an Expr object is truncated. When EP_Reduced is set, then all +** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees +** are contained within the same memory allocation. Note, however, that +** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately +** allocated, regardless of whether or not EP_Reduced is set. +*/ +struct Expr { + u8 op; /* Operation performed by this node */ + char affinity; /* The affinity of the column or 0 if not a column */ + u16 flags; /* Various flags. EP_* See below */ + union { + char *zToken; /* Token value. Zero terminated and dequoted */ + int iValue; /* Integer value if EP_IntValue */ + } u; + + /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no + ** space is allocated for the fields below this point. An attempt to + ** access them will result in a segfault or malfunction. + *********************************************************************/ + + Expr *pLeft; /* Left subnode */ + Expr *pRight; /* Right subnode */ + union { + ExprList *pList; /* Function arguments or in " IN ( IN (